diff --git a/.gitignore b/.gitignore index 159d95f4..4c6b8c45 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ *.so # Distribution / packaging +vendor/github.com/therecipe/qt/ # Configuration *.vscode @@ -37,6 +38,7 @@ nosetests.xml coverage.xml coverage.html coverage.out +coverage.tmp.out *.cover .hypothesis/ @@ -86,3 +88,8 @@ rcc_cgo_*.go darwin +# Auto-generates go files. + +*.pb.go +!vendor/github.com/golang/protobuf/**/*.pb.go +*.log diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 3d590374..00000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "vendor/github.com/SkycoinProject/skycoin"] - path = vendor/github.com/SkycoinProject/skycoin - url = https://github.com/SkycoinProject/skycoin diff --git a/.travis.yml b/.travis.yml index b89a1b35..e8bf42f5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,11 +4,16 @@ go: - 1.12.6 services: - docker + - xvfb go_import_path: github.com/fibercrypto/fibercryptowallet cache: - directories: - - $GOPATH/src/github.com/therecipe - - $GOPATH/bin + directories: + - $GOPATH/src/github.com/therecipe + - $GOPATH/bin +env: + global: + - XARGS="-screen 0 1024x768x24" + matrix: include: - stage: RPI @@ -36,16 +41,31 @@ matrix: - DEFAULT_TARGET=android-emulator make build-docker - make lint - make run-docker CMD='make test' + - make test-cover-travis - make run-docker CMD='make install coveralls ; make test-cover-travis' - stage: Linux + before_install: + - source ./ci-scripts/install-$TRAVIS_OS_NAME.sh install: - make install-docker-deps - make install-deps-no-envs - make install-linters + before_script: + - echo "PATH=$PATH"; + - echo "PIP=$PIP"; + - PYTHON=python3 PIP=pip3 make -C tmp/hardware-wallet clean + - PYTHON=python3 PIP=pip3 make -C tmp/hardware-wallet/tiny-firmware/protob install-deps-nanopb + - PYTHON=python3 PIP=pip3 make -C tmp/hardware-wallet/tiny-firmware/protob/nanopb/vendor/nanopb/generator/proto + - PYTHON=python3 PIP=pip3 make -C tmp/hardware-wallet emulator + - make -C ./tmp/hardware-wallet run-emulator & true; + # Run self-tests + - ps aux | grep emulator + script: - make clean - DEFAULT_TARGET=linux make build-docker - make clean + - make run-docker CMD='make test-skyhw' - make run-docker CMD='make test' - make lint - make run-docker CMD='make install-coveralls ; make test-cover-travis' @@ -78,13 +98,28 @@ matrix: - stage: MacOS os: osx osx_image: xcode10.2 + before_install: + - source ./ci-scripts/install-$TRAVIS_OS_NAME.sh install: - make install-deps - make install-coveralls + before_script: + - echo "PATH=$PATH"; + - echo "PIP=$PIP"; + # Start Xvfb on osx + - ( sudo Xvfb :99 -ac ${XARGS}; echo "Xvfb ok" )& export DISPLAY=:99 + - PYTHON=python3 PIP=pip3 make -C tmp/hardware-wallet clean + - PYTHON=python3 PIP=pip3 make -C tmp/hardware-wallet/tiny-firmware/protob install-deps-nanopb + - PYTHON=python3 PIP=pip3 make -C tmp/hardware-wallet/tiny-firmware/protob/nanopb/vendor/nanopb/generator/proto + - PYTHON=python3 PIP=pip3 make -C tmp/hardware-wallet emulator + - make -C ./tmp/hardware-wallet run-emulator & true; + # Run self-tests + - ps aux | grep emulator script: - make clean - make build - make test + - make test-skyhw - make build-icon - make lint - make test-cover-travis @@ -92,8 +127,8 @@ notifications: email: false webhooks: urls: - - https://fathomless-fjord-24024.herokuapp.com/notify - - https://coveralls.io/webhook + - https://fathomless-fjord-24024.herokuapp.com/notify + - https://coveralls.io/webhook before_deploy: - export VERSION="$(git describe --tags --exact-match HEAD 2> /dev/null)" @@ -112,6 +147,5 @@ deploy: draft: true overwrite: true on: - repo: fibercrypto/FiberCryptoWallet + repo: fibercrypto/fibercryptowallet tags: true - diff --git a/CHANGELOG.md b/CHANGELOG.md index 180d7b91..1b3cb026 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ### Added +- Use sky-wallet as signer. - Spend in single transaction coins owned by multiple wallets (same altcoin plugin) - Added logger for the app and proper error handling - Built-in support for SkyWallet hardware wallet as signer for Skycoin transactions @@ -63,4 +64,4 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - QR code images are buttons - GUI to add wallets - GUI to generate new addresses for a wallet - +- Added Address Book diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b1e36254..d8546717 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,20 +1,23 @@ # Contributing to FiberCrypto projects + We love your input! We want to make contributing to this project as easy and transparent as possible, whether it's: -- Submitting a [bug report](https://github.com/fibercrypto/FiberCryptoWallet/issues/new?labels=bug&template=bug_report.md) +- Submitting a [bug report](https://github.com/fibercrypto/fibercryptowallet/issues/new?labels=bug&template=bug_report.md) - Discussing the current state of the code on [Blockchain Cuba channel](https://t.me/BlockchainCuba) -- Submitting a [new Github pull request](https://github.com/fibercrypto/FiberCryptoWallet/pull/new) with a fix -- Proposing new [features requests](https://github.com/fibercrypto/FiberCryptoWallet/issues/new?labels=feature&template=feature_request.md) +- Submitting a [new Github pull request](https://github.com/fibercrypto/fibercryptowallet/pull/new) with a fix +- Proposing new [features requests](https://github.com/fibercrypto/fibercryptowallet/issues/new?labels=feature&template=feature_request.md) - Becoming a maintainer ## We Develop with Github + We use github to host code, to track issues and feature requests, as well as accept pull requests. ## We Use [Github Flow](https://guides.github.com/introduction/flow/index.html), So All Code Changes Happen Through Pull Requests + Pull requests are the best way to propose changes to the codebase (we use [Github Flow](https://guides.github.com/introduction/flow/index.html)). We actively welcome your pull requests: 1. Fork the repo and create your branch from `master`. - * Branch name should follow the pattern `_t_` e.g. `olemis_t256_readme_badges` for @olemis to submit a patch to fix issue #256 by adding project badges in `README.md` file. + - Branch name should follow the pattern `_t_` e.g. `olemis_t256_readme_badges` for @olemis to submit a patch to fix issue #256 by adding project badges in `README.md` file. 2. If you've added code that should be tested, add tests. 3. If you've changed APIs, update the documentation. 4. If contributions add a relevant feature, describe changes in CHANGELOG.md @@ -24,12 +27,14 @@ Pull requests are the best way to propose changes to the codebase (we use [Githu 8. Issue that pull request! ## Any contributions you make will be under the GPLv3 Software License + In short, when you submit code changes, your submissions are understood to be under the same [GPLv3 License](https://choosealicense.com/licenses/gpl-3.0/) that covers the project. Feel free to contact the maintainers if that's a concern. -## Report bugs using Github's [issues](https://github.com/fibercrypto/FiberCryptoWallet/issues) -We use GitHub issues to track public bugs. Report a bug by [opening a new issue](https://github.com/fibercrypto/FiberCryptoWallet/issues/new/choose); it's that easy! +## Report bugs using Github's [issues](https://github.com/fibercrypto/fibercryptowallet/issues) +We use GitHub issues to track public bugs. Report a bug by [opening a new issue](https://github.com/fibercrypto/fibercryptowallet/issues/new/choose); it's that easy! ## Write bug reports with detail, background, and sample code + [This is an example](http://stackoverflow.com/q/12488905/180626) of a bug report that we think it's not a bad model. Here's [another example from Craig Hockenberry](http://www.openradar.me/11905408), an app developer whom we greatly respect. **Great Bug Reports** tend to have: @@ -37,20 +42,21 @@ We use GitHub issues to track public bugs. Report a bug by [opening a new issue] - A quick summary and/or background - Steps to reproduce - Be specific! - - Give sample code if you can. [This stackoverflow question](http://stackoverflow.com/q/12488905/180626) includes sample code that *anyone* with a base R setup can run to reproduce what reporter was seeing + - Give sample code if you can. [This stackoverflow question](http://stackoverflow.com/q/12488905/180626) includes sample code that _anyone_ with a base R setup can run to reproduce what reporter was seeing - What you expected would happen - What actually happens - Notes (possibly including why you think this might be happening, or stuff you tried that didn't work) -People *love* thorough bug reports. I'm not even kidding. +People _love_ thorough bug reports. I'm not even kidding. ## Use a Consistent Coding Style + Code style shall respect golang standards and is checked by a number of linters after running `make lint` from the command line. ## License + By contributing, you agree that your contributions will be licensed under its GPLv3 License. ## References -This document was adapted from the open-source contribution guidelines for [Facebook's Draft](https://github.com/facebook/draft-js/blob/a9316a723f9e918afde44dea68b5f9f39b7d9b00/CONTRIBUTING.md). - +This document was adapted from the open-source contribution guidelines for [Facebook's Draft](https://github.com/facebook/draft-js/blob/a9316a723f9e918afde44dea68b5f9f39b7d9b00/CONTRIBUTING.md). diff --git a/Gopkg.lock b/Gopkg.lock index be60626d..64b3992b 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -2,320 +2,387 @@ [[projects]] - digest = "1:af6e785bedb62fc2abb81977c58a7a44e5cf9f7e41b8d3c8dd4d872edea0ce08" + digest = "1:ee35b514b6826a6e65bc24795873020d86570e5252c30c7e136581d0fa4ebdb0" name = "github.com/NYTimes/gziphandler" packages = ["."] - pruneopts = "UT" + pruneopts = "" revision = "dd0439581c7657cb652dfe5c71d7d48baf39541d" version = "v1.1.1" [[projects]] - digest = "1:d6afaeed1502aa28e80a4ed0981d570ad91b2579193404256ce672ed0a609e0d" + digest = "1:016b62efaf0947541de680c1d4ce92085a9954581c8a423847c6455c4aca18c3" + name = "github.com/SkycoinProject/skycoin" + packages = [ + "src/api", + "src/cipher", + "src/cipher/base58", + "src/cipher/bip32", + "src/cipher/bip39", + "src/cipher/bip39/wordlists", + "src/cipher/bip44", + "src/cipher/chacha20poly1305", + "src/cipher/chacha20poly1305/internal/chacha20", + "src/cipher/encoder", + "src/cipher/encrypt", + "src/cipher/pbkdf2", + "src/cipher/poly1305", + "src/cipher/ripemd160", + "src/cipher/scrypt", + "src/cipher/secp256k1-go", + "src/cipher/secp256k1-go/secp256k1-go2", + "src/cipher/testsuite", + "src/cli", + "src/coin", + "src/daemon", + "src/daemon/gnet", + "src/daemon/pex", + "src/daemon/strand", + "src/kvstorage", + "src/params", + "src/readable", + "src/testutil", + "src/transaction", + "src/util/apputil", + "src/util/droplet", + "src/util/elapse", + "src/util/fee", + "src/util/file", + "src/util/http", + "src/util/iputil", + "src/util/logging", + "src/util/mathutil", + "src/util/timeutil", + "src/util/useragent", + "src/visor", + "src/visor/blockdb", + "src/visor/dbutil", + "src/visor/historydb", + "src/wallet", + ] + pruneopts = "UT" + revision = "66f5df5849d339d403a475d523ebe7d1a4c92c31" + version = "v0.27.0" + +[[projects]] + digest = "1:707ebe952a8b3d00b343c01536c79c73771d100f63ec6babeaed5c79e2b8a8dd" name = "github.com/beorn7/perks" packages = ["quantile"] - pruneopts = "UT" + pruneopts = "NUT" revision = "37c8de3658fcb183f997c4e13e8337516ab753e6" version = "v1.0.1" [[projects]] - digest = "1:b6d886569181ec96ca83d529f4d6ba0cbf92ace7bb6f633f90c5f34d9bba7aab" + digest = "1:00b2c2ee0f120e9d267674ca28446e6aa43258d2c5491861664325e24ef32e62" name = "github.com/blang/semver" packages = ["."] - pruneopts = "UT" + pruneopts = "" revision = "ba2c2ddd89069b46a7011d4106f6868f17ee1705" version = "v3.6.1" [[projects]] - digest = "1:0f98f59e9a2f4070d66f0c9c39561f68fcd1dc837b22a852d28d0003aebd1b1e" + digest = "1:ed112122ed4a920d944cc99b9d00b0441c11685939c28462c719488d36fe29aa" name = "github.com/boltdb/bolt" packages = ["."] - pruneopts = "UT" + pruneopts = "" revision = "2f1ce7a837dcb8da3ec595b1dac9d0632f0f99e8" version = "v1.3.1" [[projects]] - digest = "1:4ba637038f22c9065994c0cd734118fc75e0c744f855fd3edbd3b923d1f41d44" + digest = "1:1cf61f0228e64d1bfddaa42bfd1f5047ed3626925b9bea69bbcb9168472dae23" name = "github.com/cenkalti/backoff" packages = ["."] - pruneopts = "UT" + pruneopts = "" revision = "61153c768f31ee5f130071d08fc82b85208528de" version = "v1.1.0" [[projects]] - digest = "1:ffe9824d294da03b391f44e1ae8281281b4afc1bdaa9588c9097785e3af10cec" + digest = "1:0deddd908b6b4b768cfc272c16ee61e7088a60f7fe2f06c547bd3d8e1f8b8e77" + name = "github.com/chebyrash/promise" + packages = ["."] + pruneopts = "NUT" + revision = "9132bc6bc4fb155a673b52f530470522421b6826" + +[[projects]] name = "github.com/davecgh/go-spew" packages = ["spew"] - pruneopts = "UT" + pruneopts = "" revision = "8991bc29aa16c548c550c7ff78260e27b9ab7c73" version = "v1.1.1" [[projects]] - digest = "1:573ca21d3669500ff845bdebee890eb7fc7f0f50c59f2132f2a0c6b03d85086a" - name = "github.com/golang/protobuf" + branch = "develop" + digest = "1:93c50d5f0b1e381b8116b0b644bf8890b0d8bfedb7fe18d8304c0e5ad4488f79" + name = "github.com/fibercrypto/skywallet-go" + packages = [ + "src/integration/proxy", + "src/skywallet", + "src/skywallet/usb", + "src/skywallet/wire", + "src/usb/lowlevel/hidapi", + "src/usb/lowlevel/libusb", + ] + pruneopts = "T" + revision = "8e10440cf9e721a0944f046dcf78c07e97489cf3" + +[[projects]] + branch = "develop" + digest = "1:ec1a1f7bbfba1362708324d1b7aff4153086c837cdfe13eabd241a4cc9bac44d" + name = "github.com/fibercrypto/skywallet-protob" + packages = [ + "go", + "go/google/protobuf", + ] + pruneopts = "NUT" + revision = "81be0e9029a26fadc841a14e84bd8a822b2dd8b5" + +[[projects]] + digest = "1:d439e7c59417e2221733a69fadeabc351a64c96ed02dde6b9d41b009d4139f83" + name = "github.com/gogo/protobuf" packages = ["proto"] - pruneopts = "UT" - revision = "6c65a5562fc06764971b7c5d05c76c75e84bdbf7" - version = "v1.3.2" + pruneopts = "NUT" + revision = "5628607bb4c51c3157aacc3a50f0ab707582b805" + version = "v1.3.1" [[projects]] - digest = "1:870d441fe217b8e689d7949fef6e43efbc787e50f200cb1e70dbca9204a1d6be" + digest = "1:908cb57711c23bbf6b770d8669d51cadf3b53bb1e307176e17d8c9cd4dbe5e06" + name = "github.com/golang/protobuf" + packages = [ + "proto", + "ptypes", + "ptypes/any", + "ptypes/duration", + "ptypes/timestamp", + ] + pruneopts = "NUT" + revision = "5d5b4c10bd43f85e63bd9e4a3fa9b1ea2ef88af2" + version = "v1.3.4" + +[[projects]] + digest = "1:406338ad39ab2e37b7f4452906442a3dbf0eb3379dd1f06aafb5c07e769a5fbb" name = "github.com/inconshreveable/mousetrap" packages = ["."] - pruneopts = "UT" + pruneopts = "NUT" revision = "76626ae9c91c4f2a10f34cad8ce83ea42c93bb75" version = "v1.0" [[projects]] - digest = "1:31e761d97c76151dde79e9d28964a812c46efc5baee4085b86f68f0c654450de" + digest = "1:0f51cee70b0d254dbc93c22666ea2abf211af81c1701a96d04e2284b408621db" name = "github.com/konsorten/go-windows-terminal-sequences" packages = ["."] - pruneopts = "UT" + pruneopts = "" revision = "f55edac94c9bbba5d6182a4be46d86a2c9b5b50e" version = "v1.0.2" [[projects]] - digest = "1:4a29eeb25603debe8f2098a9902c4d3851034cf70d33be428826e86e8c30a1b0" + digest = "1:9b58ad18b38cf0d44b1d006fce319e45f200eafa406fe7f65fe0d0194b9f7a9f" name = "github.com/mattn/go-colorable" packages = ["."] - pruneopts = "UT" + pruneopts = "" revision = "98ec13f34aabf44cc914c65a1cfb7b9bc815aef1" version = "v0.1.4" [[projects]] - digest = "1:d62282425ffb75047679d7e2c3b980eea7f82c05ef5fb9142ee617ebac6e7432" + digest = "1:5794dadc5456af270fc564d98efbfa1f3627cd6c733ca772d14409793772064f" name = "github.com/mattn/go-isatty" packages = ["."] - pruneopts = "UT" - revision = "88ba11cfdc67c7588b30042edf244b2875f892b6" - version = "v0.0.10" + pruneopts = "" + revision = "7b513a986450394f7bbf1476909911b3aa3a55ce" + version = "v0.0.12" [[projects]] - digest = "1:ff5ebae34cfbf047d505ee150de27e60570e8c394b3b8fdbb720ff6ac71985fc" + digest = "1:63722a4b1e1717be7b98fc686e0b30d5e7f734b9e93d7dee86293b6deab7ea28" name = "github.com/matttproud/golang_protobuf_extensions" packages = ["pbutil"] - pruneopts = "UT" + pruneopts = "" revision = "c12348ce28de40eed0136aa2b644d0ee0650e56c" version = "v1.0.1" [[projects]] branch = "master" - digest = "1:2b32af4d2a529083275afc192d1067d8126b578c7a9613b26600e4df9c735155" + digest = "1:50416da10e189bc201e122e20078fb8e680a439cbdd24aaece06c434b4415b60" name = "github.com/mgutz/ansi" packages = ["."] - pruneopts = "UT" + pruneopts = "" revision = "9520e82c474b0a04dd04f8a40959027271bab992" [[projects]] - digest = "1:0028cb19b2e4c3112225cd871870f2d9cf49b9b4276531f03438a88e94be86fe" + digest = "1:256484dbbcd271f9ecebc6795b2df8cad4c458dd0f5fd82a8c2fa0c29f233411" name = "github.com/pmezard/go-difflib" packages = ["difflib"] - pruneopts = "UT" + pruneopts = "" revision = "792786c7400a136282c1664665ae0a8db921c6c2" version = "v1.0.0" [[projects]] - digest = "1:d14a5f4bfecf017cb780bdde1b6483e5deb87e12c332544d2c430eda58734bcb" + digest = "1:4142d94383572e74b42352273652c62afec5b23f325222ed09198f46009022d1" name = "github.com/prometheus/client_golang" packages = [ "prometheus", "prometheus/promhttp", ] - pruneopts = "UT" + pruneopts = "NUT" revision = "c5b7fccd204277076155f10851dad72b76a49317" version = "v0.8.0" [[projects]] - branch = "master" - digest = "1:2d5cd61daa5565187e1d96bae64dbbc6080dacf741448e9629c64fd93203b0d4" + digest = "1:0db23933b8052702d980a3f029149b3f175f7c0eea0cff85b175017d0f2722c0" name = "github.com/prometheus/client_model" packages = ["go"] - pruneopts = "UT" - revision = "14fe0d1b01d4d5fc031dd4bec1823bd3ebbe8016" + pruneopts = "NUT" + revision = "7bc5445566f0fe75b15de23e6b93886e982d7bf9" + version = "v0.2.0" [[projects]] - digest = "1:f119e3205d3a1f0f19dbd7038eb37528e2c6f0933269dc344e305951fb87d632" + digest = "1:0c9d56afe4f5b3ab5658a3270a680db8f6936d7794377fa0b9880663958b18b0" name = "github.com/prometheus/common" packages = [ "expfmt", "internal/bitbucket.org/ww/goautoneg", "model", ] - pruneopts = "UT" - revision = "287d3e634a1e550c9e463dd7e5a75a422c614505" - version = "v0.7.0" + pruneopts = "NUT" + revision = "d978bcb1309602d68bb4ba69cf3f8ed900e07308" + version = "v0.9.1" [[projects]] - digest = "1:a210815b437763623ecca8eb91e6a0bf4f2d6773c5a6c9aec0e28f19e5fd6deb" + digest = "1:dacb29568d7b8e145b953ca0a9334e516ce02e56c61e902372c6c074c4846107" name = "github.com/prometheus/procfs" packages = [ ".", "internal/fs", "internal/util", ] - pruneopts = "UT" - revision = "499c85531f756d1129edd26485a5f73871eeb308" - version = "v0.0.5" + pruneopts = "NUT" + revision = "4850c197847aa06aecc37570077fc16e9215d565" + version = "v0.0.10" [[projects]] - digest = "1:c5dfe46811af7e2eff7c11fc84b6c841520338613c056f659f262d5a4fb42fa8" + digest = "1:c109c5d92f0de1ceeea77ae0d13a20bf0f8e4ef5d3b0e69a40a6d7ac470836bc" name = "github.com/rs/cors" packages = ["."] - pruneopts = "UT" + pruneopts = "NUT" revision = "db0fe48135e83b5812a5a31be0eea66984b1b521" version = "v1.7.0" [[projects]] - digest = "1:81e02c4edb639c80559c0650f9401d3e2dcc3256d1fa215382bb7c83c1db9126" + digest = "1:615c827f6a892973a587c754ae5fad7acfc4352657aff23d0238fe0ba2a154df" name = "github.com/shopspring/decimal" packages = ["."] - pruneopts = "UT" + pruneopts = "" revision = "cd690d0c9e2447b1ef2a129a6b7b49077da89b8e" version = "1.1.0" [[projects]] - digest = "1:04457f9f6f3ffc5fea48e71d62f2ca256637dee0a04d710288e27e05c8b41976" + digest = "1:1a405cddcf3368445051fb70ab465ae99da56ad7be8d8ca7fc52159d1c2d873c" name = "github.com/sirupsen/logrus" packages = ["."] - pruneopts = "UT" + pruneopts = "" revision = "839c75faf7f98a33d445d181f3018b5c3409a45e" version = "v1.4.2" [[projects]] branch = "develop" - digest = "1:5ede931cf0314ea9ac6628f65e0926cbf92754c105a0883475a6aaa3fc68c757" - name = "github.com/SkycoinProject/skycoin" + digest = "1:296eddda33403e4c506e3398ace25de0dfabf46156c86db86e6e0aa69ca43d9d" + name = "github.com/skycoin/skycoin" packages = [ - "src/api", "src/cipher", "src/cipher/base58", - "src/cipher/bip32", - "src/cipher/bip39", - "src/cipher/bip39/wordlists", - "src/cipher/bip44", - "src/cipher/chacha20poly1305", - "src/cipher/chacha20poly1305/internal/chacha20", - "src/cipher/encoder", - "src/cipher/encrypt", - "src/cipher/pbkdf2", - "src/cipher/poly1305", "src/cipher/ripemd160", - "src/cipher/scrypt", "src/cipher/secp256k1-go", "src/cipher/secp256k1-go/secp256k1-go2", - "src/cipher/testsuite", - "src/cli", - "src/coin", - "src/daemon", - "src/daemon/gnet", - "src/daemon/pex", - "src/daemon/strand", - "src/kvstorage", - "src/params", - "src/readable", - "src/testutil", - "src/transaction", - "src/util/apputil", - "src/util/droplet", - "src/util/elapse", - "src/util/fee", - "src/util/file", - "src/util/http", - "src/util/iputil", "src/util/logging", - "src/util/mathutil", - "src/util/timeutil", - "src/util/useragent", - "src/visor", - "src/visor/blockdb", - "src/visor/dbutil", - "src/visor/historydb", - "src/wallet", ] - pruneopts = "UT" + pruneopts = "NUT" revision = "d7e4b2f3e31ea96bdcaba595507fde42baa156b9" [[projects]] - digest = "1:e096613fb7cf34743d49af87d197663cfccd61876e2219853005a57baedfa562" + digest = "1:30e2ca04703e6939567efd97f381f0ff5b11880cbb53dad256773bd8e2064e0a" name = "github.com/spf13/cobra" packages = ["."] - pruneopts = "UT" - revision = "f2b07da1e2c38d5f12845a4f607e2e1018cbb1f5" - version = "v0.0.5" + pruneopts = "NUT" + revision = "0da06874266c88228b8f14615396a1f6bfc90ed7" + version = "v0.0.6" [[projects]] - digest = "1:524b71991fc7d9246cc7dc2d9e0886ccb97648091c63e30eef619e6862c955dd" + digest = "1:688428eeb1ca80d92599eb3254bdf91b51d7e232fead3a73844c1f201a281e51" name = "github.com/spf13/pflag" packages = ["."] - pruneopts = "UT" + pruneopts = "" revision = "2e9d26c8c37aae03e3f9d4e90b7116f5accb7cab" version = "v1.0.5" [[projects]] - digest = "1:23472f69a3ee7225de2f104aa48c6456959d1c155e45035c9845806d83109190" + digest = "1:88e031206b52c11a8442f3f07e9bcddc1b248274d0506c768a948e7e254b84bb" name = "github.com/stretchr/objx" packages = ["."] - pruneopts = "UT" + pruneopts = "" revision = "ea4fe68685ee0d3cee7032121851b57e7494e8ea" version = "v0.2.0" [[projects]] - digest = "1:afa503f22c5464c93393d25b1c3b8743fe1a96ff0db2b99cbb2091214995bf4b" + digest = "1:3b4870930878fb464616897c4e4bc100d323a8f95c3d8bbff0952d372571f7f7" name = "github.com/stretchr/testify" packages = [ "assert", "mock", "require", ] - pruneopts = "UT" + pruneopts = "NUT" revision = "2aa2c176b9dab406a6970f6a55f513e8a8c8b18f" [[projects]] branch = "master" - digest = "1:1f2ac409d4e44c88b9fdd8b9ce57b02cf42825293e76ad2dd98dab6288e1fd4a" + digest = "1:7d48359beaf9338737095261d796704f4df17776183141813200aab4d4b0131c" name = "github.com/therecipe/qt" packages = [ "core", "gui", + "internal/binding/runtime", "network", "qml", ] - pruneopts = "UT" - revision = "590f404884c99350e2ae27bc5f4a1aa44fcf4249" + pruneopts = "NUT" + revision = "5074eb6d8c41fdae5d1956af7c286160a40dd8fd" [[projects]] branch = "master" - digest = "1:bbe51412d9915d64ffaa96b51d409e070665efc5194fcf145c4a27d4133107a4" + digest = "1:059bf4e6350ea6202b837cb24216b735d997e29e407f299be040a826c0bc026c" name = "golang.org/x/crypto" - packages = ["ssh/terminal"] - pruneopts = "UT" - revision = "87dc89f01550277dc22b74ffcf4cd89fa2f40f4c" + packages = [ + "bcrypt", + "blowfish", + "pbkdf2", + "ssh/terminal", + ] + pruneopts = "NUT" + revision = "2aa609cf4a9d7d1126360de73b55b6002f9e052a" [[projects]] branch = "master" digest = "1:76ee51c3f468493aff39dbacc401e8831fbb765104cbf613b89bef01cf4bad70" name = "golang.org/x/net" packages = ["context"] - pruneopts = "UT" - revision = "ec77196f6094c3492a8b61f2c11cf937f78992ae" + pruneopts = "NUT" + revision = "0de0cce0169b09b364e001f108dc0399ea8630b3" [[projects]] branch = "master" - digest = "1:0451cf21ce34bcd708e508b7a80c92f3718b4df72fadef0dd3a60bee403e9f37" + digest = "1:5f86e3e3284436db57ab1c70ff6c0e048095fd77661fc31bde8fba1e5e3a7346" name = "golang.org/x/sys" packages = [ "unix", "windows", ] - pruneopts = "UT" - revision = "b4ff53e7a1cb8ab8ce2e12d50d5d63530183e1a9" + pruneopts = "NUT" + revision = "d5e6a3e2c0ae16fc7480523ebcb7fd4dd3215489" [solve-meta] analyzer-name = "dep" analyzer-version = 1 input-imports = [ - "github.com/sirupsen/logrus", "github.com/SkycoinProject/skycoin/src/api", "github.com/SkycoinProject/skycoin/src/cipher", + "github.com/SkycoinProject/skycoin/src/cipher/base58", "github.com/SkycoinProject/skycoin/src/cipher/bip39", "github.com/SkycoinProject/skycoin/src/cipher/testsuite", "github.com/SkycoinProject/skycoin/src/cli", @@ -325,14 +392,29 @@ "github.com/SkycoinProject/skycoin/src/testutil", "github.com/SkycoinProject/skycoin/src/util/droplet", "github.com/SkycoinProject/skycoin/src/util/file", + "github.com/SkycoinProject/skycoin/src/util/logging", "github.com/SkycoinProject/skycoin/src/visor", + "github.com/SkycoinProject/skycoin/src/visor/dbutil", "github.com/SkycoinProject/skycoin/src/wallet", + "github.com/boltdb/bolt", + "github.com/chebyrash/promise", + "github.com/fibercrypto/skywallet-go/src/integration/proxy", + "github.com/fibercrypto/skywallet-go/src/skywallet", + "github.com/fibercrypto/skywallet-go/src/skywallet/usb", + "github.com/fibercrypto/skywallet-go/src/skywallet/wire", + "github.com/fibercrypto/skywallet-protob/go", + "github.com/gogo/protobuf/proto", + "github.com/mgutz/ansi", + "github.com/sirupsen/logrus", "github.com/stretchr/testify/assert", "github.com/stretchr/testify/mock", "github.com/stretchr/testify/require", "github.com/therecipe/qt/core", "github.com/therecipe/qt/gui", "github.com/therecipe/qt/qml", + "golang.org/x/crypto/bcrypt", + "golang.org/x/crypto/pbkdf2", + "golang.org/x/crypto/ssh/terminal", ] solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index 26f88c76..7af3aced 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -28,14 +28,50 @@ ignored = [ "github.com/therecipe/qt" ] +[[constraint]] + name = "github.com/SkycoinProject/skycoin" + version = "0.27.0" + +[[constraint]] + name = "github.com/boltdb/bolt" + version = "1.3.1" + +[[constraint]] + branch = "develop" + name = "github.com/fibercrypto/skywallet-protob" + +[[constraint]] + branch = "develop" + name = "github.com/fibercrypto/skywallet-go" + +[[constraint]] + name = "github.com/gogo/protobuf" + version = "1.3.1" + +[[constraint]] + branch = "master" + name = "github.com/mgutz/ansi" + [[constraint]] name = "github.com/sirupsen/logrus" version = "1.4.2" [[constraint]] - name = "github.com/SkycoinProject/skycoin" - version = "0.27.0" + branch = "master" + name = "golang.org/x/crypto" [prune] go-tests = true unused-packages = true + non-go = true + + [[prune.project]] + name = "github.com/fibercrypto/skywallet-go" + non-go = false + unused-packages = false + + [[prune.project]] + name = "github.com/SkycoinProject/skycoin" + non-go = false + unused-packages = false + go-tests = false diff --git a/Makefile b/Makefile index 6c63dd5b..cfa37bc4 100644 --- a/Makefile +++ b/Makefile @@ -23,8 +23,10 @@ DEFAULT_ARCH ?= linux ## In future use as a parameter tu make command. COIN ?= skycoin COVERAGEPATH = src/coin/$(COIN) -COVERAGEFILE = $(COVERAGEPATH)/coverage.out -COVERAGEHTML = $(COVERAGEPATH)/coverage.html +COVERAGEPREFIX = $(COVERAGEPATH)/coverage +COVERAGEFILE = $(COVERAGEPREFIX).out +COVERAGETEMP = $(COVERAGEPREFIX).tmp.out +COVERAGEHTML = $(COVERAGEPREFIX).html # Icons APP_ICON_PATH := resources/images/icons/appIcon @@ -33,6 +35,9 @@ ICONSET := resources/images/icons/appIcon/appIcon.iconset CONVERT := convert SIPS := sips ICONUTIL := iconutil +UNAME_S = $(shell uname -s) +DEFAULT_TARGET ?= desktop +DEFAULT_ARCH ?= linux # Platform-specific switches ifeq ($(OS),Windows_NT) @@ -81,8 +86,8 @@ QTFILES := $(shell echo "$(QRCFILES) $(TSFILES) $(PLISTFILES) $(QTCONFFILE RESOURCEFILES := $(shell echo "$(SVGFILES) $(PNGFILES) $(OTFFILES) $(ICNSFILES) $(ICOFILES) $(RCFILES)") SRCFILES := $(shell echo "$(QTFILES) $(RESOURCEFILES) $(GOFILES)") -BINPATH_Linux := deploy/linux/FiberCryptoWallet -BINPATH_Windows_NT := deploy/windows/FiberCryptoWallet.exe +BINPATH_Linux := deploy/linux/fibercryptowallet +BINPATH_Windows_NT := deploy/windows/fibercryptowallet.exe BINPATH_Darwin := deploy/darwin/fibercryptowallet.app/Contents/MacOS/fibercryptowallet BINPATH := $(BINPATH_$(UNAME_S)) @@ -96,7 +101,7 @@ DOCKER_QT_TEST ?= simelotech/qt-test deps: ## Add dependencies dep ensure - rm -rf rm -rf vendor/github.com/therecipe + rm -rf vendor/github.com/therecipe # Targets run: $(BINPATH) ## Run FiberCrypto Wallet. @@ -221,10 +226,12 @@ prepare-release: ## Change the resources in the app and prepare to release the a clean-test: ## Remove temporary test files rm -f $(COVERAGEFILE) + rm -f $(COVERAGETEMP) rm -f $(COVERAGEHTML) clean-build: ## Remove temporary files @echo "Cleaning project $(APP_NAME)..." + rm -rf vendor/github.com/therecipe rm -rf deploy/ rm -rf linux/ rm -rf windows/ @@ -238,43 +245,68 @@ clean-build: ## Remove temporary files rm -rf "$(ICONS_BUILDPATH)" rm -rf "$(RC_OBJ)" rm -rf "$(ICONSET)" - @echo "Done." clean: clean-test clean-build ## Remove temporary files -gen-mocks: ## Generate mocks for interface types +gen-mocks-vendor-hw: ## Generate mocks for hardware wallet deps interface types + mockery -name Devicer -dir ./vendor/github.com/fibercrypto/skywallet-go/src/skywallet -output ./src/contrib/hardware-wallet/skywallet/mocks -case underscore + mockery -name DeviceDriver -dir ./vendor/github.com/fibercrypto/skywallet-go/src/skywallet -output ./src/contrib/hardware-wallet/skywallet/mocks -case underscore + +gen-mocks-hw: gen-mocks-vendor-hw ## Generate mocks for hardware wallet interface types + mockery -all -output src/coin/mocks -outpkg mocks -dir src/contrib/hardware-wallet + +gen-mocks-core: ## Generate mocks for core interface types mockery -all -output src/coin/mocks -outpkg mocks -dir src/core +gen-mocks-sky: ## Generate mocks for sky-wallet interface types + mockery -name Devicer -dir ./vendor/github.com/fibercrypto/skywallet-go/src/skywallet -output ./src/contrib/skywallet/mocks -case underscore + mockery -name DeviceDriver -dir ./vendor/github.com/fibercrypto/skywallet-go/src/skywallet -output ./src/contrib/skywallet/mocks -case underscore + +gen-mocks: gen-mocks-core gen-mocks-sky gen-mocks-hw ## Generate mocks for interface types + +$(COVERAGEFILE): + echo 'mode: set' > $(COVERAGEFILE) + +test-skyhw: ## Run Hardware wallet tests + go test -coverprofile=$(COVERAGETEMP) -timeout 30s github.com/fibercrypto/fibercryptowallet/src/contrib/hardware-wallet/skywallet + cat $(COVERAGETEMP) | grep -v '^mode: set$$' >> $(COVERAGEFILE) + test-sky: ## Run Skycoin plugin test suite - go test -cover -timeout 30s github.com/fibercrypto/fibercryptowallet/src/coin/skycoin - go test -coverprofile=$(COVERAGEFILE) -timeout 30s github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/models + go test -coverprofile=$(COVERAGETEMP) -timeout 30s github.com/fibercrypto/fibercryptowallet/src/coin/skycoin + cat $(COVERAGETEMP) | grep -v '^mode: set$$' >> $(COVERAGEFILE) + go test -coverprofile=$(COVERAGETEMP) -timeout 60s github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/models + cat $(COVERAGETEMP) | grep -v '^mode: set$$' >> $(COVERAGEFILE) test-core: ## Run tests for API core and helpers - go test -cover -timeout 30s github.com/fibercrypto/fibercryptowallet/src/util + go test -coverprofile=$(COVERAGETEMP) -timeout 30s github.com/fibercrypto/fibercryptowallet/src/util + cat $(COVERAGETEMP) | grep -v '^mode: set$$' >> $(COVERAGEFILE) -test-sky-launch-html-cover: - go test -cover -timeout 30s github.com/fibercrypto/fibercryptowallet/src/coin/skycoin - go test -coverprofile=$(COVERAGEFILE) -timeout 30s github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/models - go tool cover -html=$(COVERAGEFILE) -o $(COVERAGEHTML) +test-data: ## Run tests for data package + go test -coverprofile=$(COVERAGETEMP) -timeout 30s github.com/fibercrypto/fibercryptowallet/src/data + cat $(COVERAGETEMP) | grep -v '^mode: set$$' >> $(COVERAGEFILE) -test-cover-travis: +test-html-cover: + go tool cover -html=$(COVERAGEFILE) -o $(COVERAGEPREFIX).html + +test-cover-travis: clean-test go test -covermode=count -coverprofile=$(COVERAGEFILE) -timeout 30s github.com/fibercrypto/fibercryptowallet/src/util $(GOPATH)/bin/goveralls -coverprofile=$(COVERAGEFILE) -service=travis-ci -repotoken 1zkcSxi8TkcxpL2zTQOK9G5FFoVgWjceP go test -coverprofile=$(COVERAGEFILE) -timeout 30s github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/models $(GOPATH)/bin/goveralls -coverprofile=$(COVERAGEFILE) -service=travis-ci -repotoken 1zkcSxi8TkcxpL2zTQOK9G5FFoVgWjceP go test -cover -covermode=count -coverprofile=$(COVERAGEFILE) -timeout 30s github.com/fibercrypto/fibercryptowallet/src/coin/skycoin $(GOPATH)/bin/goveralls -coverprofile=$(COVERAGEFILE) -service=travis-ci -repotoken 1zkcSxi8TkcxpL2zTQOK9G5FFoVgWjceP + go test -cover -covermode=count -coverprofile=$(COVERAGEFILE) -timeout 30s github.com/fibercrypto/fibercryptowallet/src/contrib/hardware-wallet/skywallet + $(GOPATH)/bin/goveralls -coverprofile=$(COVERAGEFILE) -service=travis-ci -repotoken 1zkcSxi8TkcxpL2zTQOK9G5FFoVgWjceP +test-cover: test test-html-cover ## Show more details of test coverage -test-cover: clean-test test-sky-launch-html-cover ## Show more details of test coverage - -test: clean-test test-core test-sky ## Run project test suite +test: clean-test $(COVERAGEFILE) test-core test-sky test-data ## Run project test suite run-docker: DOCKER_GOPATH=$(shell docker inspect $(DOCKER_QT):$(DEFAULT_ARCH) | grep '"GOPATH=' | head -n1 | cut -d = -f2 | cut -d '"' -f1) run-docker: install-docker-deps ## Run CMD inside Docker container @echo "Docker container GOPATH found at $(DOCKER_GOPATH)" - docker run --rm -v $(PWD):$(DOCKER_GOPATH)/$(GOPATH_SRC) $(DOCKER_QT_TEST):$(DEFAULT_ARCH) bash -c 'cd $(DOCKER_GOPATH)/$(GOPATH_SRC) ; $(CMD)' + docker run --network="host" --rm -v $(PWD):$(DOCKER_GOPATH)/$(GOPATH_SRC) $(DOCKER_QT_TEST):$(DEFAULT_ARCH) bash -c 'cd $(DOCKER_GOPATH)/$(GOPATH_SRC) ; $(CMD)' install-linters: ## Install linters go get -u github.com/FiloSottile/vendorcheck diff --git a/README.md b/README.md index f8fd564d..6a76b28e 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # FiberCrypto wallet -[![Build Status](https://travis-ci.org/fibercrypto/FiberCryptoWallet.svg?branch=develop)](https://travis-ci.org/fibercrypto/FiberCryptoWallet) +[![Build Status](https://travis-ci.org/fibercrypto/fibercryptowallet.svg?branch=develop)](https://travis-ci.org/fibercrypto/fibercryptowallet) [![Contributions welcome](https://img.shields.io/badge/contributions-welcome-brightgreen.svg)](CONTRIBUTING.md) [![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](LICENSE.GPLv3) [![Coverage Status](https://coveralls.io/repos/github/fibercrypto/FiberCryptoWallet/badge.svg?branch=develop)](https://coveralls.io/github/fibercrypto/FiberCryptoWallet?branch=develop) @@ -101,11 +101,15 @@ prepare-release Change the resources in the app and prepare to re clean-test Remove temporary test files clean-build Remove temporary files clean Remove temporary files +gen-mocks-core Generate mocks for core interface types +gen-mocks-sky Generate mocks for internal Skycoin types gen-mocks Generate mocks for interface types test-sky Run Skycoin plugin test suite test-core Run tests for API core and helpers +test-data Run tests for data package test-cover Show more details of test coverage test Run project test suite +run-docker Run CMD inside Docker container install-linters Install linters install-coveralls Install coveralls lint Run linters. Use make install-linters first. diff --git a/ci-scripts/install-linux.sh b/ci-scripts/install-linux.sh new file mode 100644 index 00000000..a8d8e11e --- /dev/null +++ b/ci-scripts/install-linux.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash + +set -x + +sudo apt-get update +# PIP +sudo apt-get install python3-pip +# OpenGL swrast driver for xvfb +sudo apt install mesa-utils and libgl1-mesa-glx +# Hardware wallet for running tests against emulator +mkdir -p tmp/hardware-wallet +git clone --depth=1 --single-branch --branch develop https://github.com/skycoin/hardware-wallet.git tmp/hardware-wallet +git -C tmp/hardware-wallet submodule update --init --recursive +( cd ./tmp/hardware-wallet && sh "ci-scripts/install-linux.sh" ) +export PATH="/usr/local/bin:$(pwd)/tmp/hardware-wallet/protoc/bin:$PATH" diff --git a/ci-scripts/install-osx.sh b/ci-scripts/install-osx.sh new file mode 100644 index 00000000..c51a4f5e --- /dev/null +++ b/ci-scripts/install-osx.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash + +set -x + +brew update +# USB HID enumeration libraries +# SDL for building hardware wallet emulator +brew install sdl2_image sdl2 mesa mesalib-glw + +brew update +# USB HID enumeration libraries +brew install libusb +# Install OS-specific test and build dependencies for hardware-wallet +mkdir -p tmp/hardware-wallet +git clone --depth=1 --single-branch --branch develop https://github.com/skycoin/hardware-wallet.git tmp/hardware-wallet +git -C tmp/hardware-wallet submodule update --init --recursive +( cd ./tmp/hardware-wallet && sh "ci-scripts/install-osx.sh" ) +# Include paths for brew packages e.g. SDL2 +export SDL_INCLUDE="$(brew --prefix sdl2)/include/SDL2"; \ No newline at end of file diff --git a/ci-scripts/version.sh b/ci-scripts/version.sh new file mode 100755 index 00000000..abf9c82e --- /dev/null +++ b/ci-scripts/version.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +version=$(git describe --tags --exact-match HEAD 2> /dev/null) +if [ $? -ne 0 ] +then + version=$(cat ./VERSION 2> /dev/null) + if [ $? -ne 0 ] + then + version='v0.0.0' + fi +fi +echo $version diff --git a/fonts.qrc b/fonts.qrc index 1fb311ad..f724ed82 100644 --- a/fonts.qrc +++ b/fonts.qrc @@ -1,5 +1,6 @@ resources/fonts/code-new-roman/code-new-roman.otf + resources/fonts/hemi-head/hemi-head.ttf diff --git a/images.qrc b/images.qrc index dbecab8c..d9664c2a 100644 --- a/images.qrc +++ b/images.qrc @@ -17,6 +17,7 @@ resources/images/icons/visibleOff.svg resources/images/icons/visibleOn.svg resources/images/icons/edit.svg + resources/images/icons/delete.svg resources/images/icons/copy.svg resources/images/icons/check-simple.svg resources/images/icons/add-circle.svg @@ -35,6 +36,14 @@ resources/images/icons/selectAll-content.svg resources/images/icons/undo.svg resources/images/icons/redo.svg + resources/images/icons/log_level_debug.svg + resources/images/icons/log_level_info.svg + resources/images/icons/log_level_warn.svg + resources/images/icons/log_level_error.svg + resources/images/icons/log_level_fatal.svg + resources/images/icons/log_level_panic.svg + resources/images/icons/user.svg + resources/images/icons/contacts.svg resources/images/icons/outputs.svg resources/images/icons/pending-transactions.svg resources/images/icons/blockchain.svg diff --git a/main.go b/main.go index e2958531..77a09f81 100644 --- a/main.go +++ b/main.go @@ -1,16 +1,17 @@ package main import ( + "github.com/fibercrypto/fibercryptowallet/src/params" "os" _ "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin" _ "github.com/fibercrypto/fibercryptowallet/src/models" + _ "github.com/fibercrypto/fibercryptowallet/src/models/addressBook" _ "github.com/fibercrypto/fibercryptowallet/src/models/history" _ "github.com/fibercrypto/fibercryptowallet/src/models/pending" "github.com/therecipe/qt/core" "github.com/therecipe/qt/gui" "github.com/therecipe/qt/qml" - "github.com/therecipe/qt/widgets" ) func main() { @@ -19,46 +20,31 @@ func main() { core.QCoreApplication_SetAttribute(core.Qt__AA_EnableHighDpiScaling, true) // Create a Qt Application - // On embedded devices, a `QGuiApplication` must be used instead - app := widgets.NewQApplication(len(os.Args), os.Args) - - // Setup the splash screen - splashPixmap := gui.NewQPixmap3(":/images/resources/images/icons/appIcon/splash.png", "", core.Qt__AutoColor) - splash := widgets.NewQSplashScreen(splashPixmap, core.Qt__SplashScreen) - splash.Show() - // Process the pending `show` event - app.QCoreApplication.ProcessEvents(core.QEventLoop__AllEvents) + // Avoid using a `QApplication` as it requires `widgets` module + app := gui.NewQGuiApplication(len(os.Args), os.Args) // Set the application information - app.SetOrganizationName("Simelo.Tech") - app.SetOrganizationDomain("simelo.tech") - app.SetApplicationName("FiberCryptoWallet") - app.SetApplicationVersion("0.27.0") + app.SetOrganizationName(params.OrganizationName) + app.SetOrganizationDomain(params.OrganizationDomain) + app.SetApplicationName(params.ApplicationName) + app.SetApplicationVersion(params.ApplicationVersion) app.SetWindowIcon(gui.NewQIcon5(":/images/resources/images/icons/appIcon/appIcon.png")) // Add this monospaced font gui.QFontDatabase_AddApplicationFont(":/fonts/resources/fonts/code-new-roman/code-new-roman.otf") + gui.QFontDatabase_AddApplicationFont(":/fonts/resources/fonts/hemi-head/hemi-head.ttf") engine := qml.NewQQmlApplicationEngine(nil) // To speed up UI development, loading QML files from resources is disabled, but it must be re-enabled in order to make a release - // url := core.NewQUrl3("qrc:/ui/src/ui/main.qml", 0) - url := core.NewQUrl3("src/ui/main.qml", 0) // disable this to make a release + // url := core.NewQUrl3("qrc:/ui/src/ui/splash.qml", 0) + url := core.NewQUrl3("src/ui/splash.qml", 0) // disable this to make a release - // TODO: Find a way to use a `core.Qt__QueuedConnection`, so we can remove the flag `allOk` - allOk := true - engine.ConnectObjectCreated(func(object *core.QObject, objUrl *core.QUrl) { - if object.Pointer() == nil && url.ToString(0) == objUrl.ToString(0) { - allOk = false - app.Exit(-1) // Ignored because we need a `core.Qt__QueuedConnection` + engine.ConnectSignal(engine.ConnectObjectCreated, func(object *core.QObject, objUrl *core.QUrl) { + if object.Pointer() == nil && url.ToString(0) == objUrl.ToString(0)[len(objUrl.ToString(0)) - len(url.ToString(0)):] { + app.Exit(-1) } - }) + }, core.Qt__QueuedConnection) engine.Load(url) - splash.QWidget.Close() - // A `core.Qt__QueuedConnection` will allows us to remove the condition bellow, leaving only `app.Exec()` - if allOk == true { - app.Exec() - } else { - app.Exit(-1) - } + app.Exec() } diff --git a/qml.qrc b/qml.qrc index 675d2a7d..82dc02ba 100644 --- a/qml.qrc +++ b/qml.qrc @@ -1,5 +1,6 @@ + src/ui/splash.qml src/ui/main.qml src/ui/PageWallets.qml src/ui/PageSend.qml @@ -27,6 +28,7 @@ src/ui/NetworkSettings.qml src/ui/WalletSettings.qml src/ui/Settings.qml + src/ui/SettingsAddressBook.qml src/ui/MenuThemeAccent.qml src/ui/ToolButtonQR.qml src/ui/Delegates/WalletListDelegate.qml @@ -44,10 +46,10 @@ src/ui/Delegates/TransactionAddressDelegate.qml src/ui/Dialogs/MsgDialog.qml src/ui/Dialogs/DialogTransactionDetails.qml - src/ui/Dialogs/RestoreBackupWordsDialog.qml src/ui/Dialogs/SecureWalletDialog.qml src/ui/Dialogs/WalletCreatedDialog.qml src/ui/Dialogs/NumPadDialog.qml + src/ui/Dialogs/DialogGetBip39Word.qml src/ui/Dialogs/DialogAddAddresses.qml src/ui/Dialogs/DialogAddLoadWallet.qml src/ui/Dialogs/DialogEditWallet.qml @@ -60,11 +62,13 @@ src/ui/Dialogs/DialogSetPassword.qml src/ui/Dialogs/DialogQR.qml src/ui/Dialogs/DialogSelectAddressByWallet.qml + src/ui/Dialogs/GetWordDialog.qml src/ui/Controls/TextArea.qml src/ui/Controls/TextField.qml src/ui/Controls/+material/TextArea.qml src/ui/Controls/+material/TextField.qml src/ui/Utils/qqr.js src/ui/Utils/QRCode.qml + src/ui/Dialogs/SkyWalletInteractionDialog.qml diff --git a/resources/fonts/hemi-head/hemi-head.ttf b/resources/fonts/hemi-head/hemi-head.ttf new file mode 100644 index 00000000..c208551f Binary files /dev/null and b/resources/fonts/hemi-head/hemi-head.ttf differ diff --git a/resources/fonts/hemi-head/typodermic-eula-02-2014.pdf b/resources/fonts/hemi-head/typodermic-eula-02-2014.pdf new file mode 100644 index 00000000..e5de28ef Binary files /dev/null and b/resources/fonts/hemi-head/typodermic-eula-02-2014.pdf differ diff --git a/resources/images/icons/contacts.svg b/resources/images/icons/contacts.svg new file mode 100755 index 00000000..7cc36cae --- /dev/null +++ b/resources/images/icons/contacts.svg @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/images/icons/delete.svg b/resources/images/icons/delete.svg new file mode 100755 index 00000000..be2c2569 --- /dev/null +++ b/resources/images/icons/delete.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/resources/images/icons/license.svg b/resources/images/icons/license.svg index 0e086e63..5c720d36 100755 --- a/resources/images/icons/license.svg +++ b/resources/images/icons/license.svg @@ -1 +1 @@ - + diff --git a/resources/images/icons/log_level_debug.svg b/resources/images/icons/log_level_debug.svg new file mode 100755 index 00000000..d70edb27 --- /dev/null +++ b/resources/images/icons/log_level_debug.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/images/icons/log_level_error.svg b/resources/images/icons/log_level_error.svg new file mode 100755 index 00000000..bca682ea --- /dev/null +++ b/resources/images/icons/log_level_error.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/images/icons/log_level_fatal.svg b/resources/images/icons/log_level_fatal.svg new file mode 100755 index 00000000..ec0ce667 --- /dev/null +++ b/resources/images/icons/log_level_fatal.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/images/icons/log_level_info.svg b/resources/images/icons/log_level_info.svg new file mode 100755 index 00000000..9790ca1c --- /dev/null +++ b/resources/images/icons/log_level_info.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/images/icons/log_level_panic.svg b/resources/images/icons/log_level_panic.svg new file mode 100755 index 00000000..fe1f7f45 --- /dev/null +++ b/resources/images/icons/log_level_panic.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/images/icons/log_level_warn.svg b/resources/images/icons/log_level_warn.svg new file mode 100755 index 00000000..de64c340 --- /dev/null +++ b/resources/images/icons/log_level_warn.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/images/icons/user.svg b/resources/images/icons/user.svg new file mode 100755 index 00000000..d5f2a9d8 --- /dev/null +++ b/resources/images/icons/user.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/coin/mocks/Address.go b/src/coin/mocks/Address.go index 124e4378..c37fb2a4 100644 --- a/src/coin/mocks/Address.go +++ b/src/coin/mocks/Address.go @@ -10,6 +10,38 @@ type Address struct { mock.Mock } +// Bytes provides a mock function with given fields: +func (_m *Address) Bytes() []byte { + ret := _m.Called() + + var r0 []byte + if rf, ok := ret.Get(0).(func() []byte); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]byte) + } + } + + return r0 +} + +// Checksum provides a mock function with given fields: +func (_m *Address) Checksum() core.Checksum { + ret := _m.Called() + + var r0 core.Checksum + if rf, ok := ret.Get(0).(func() core.Checksum); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(core.Checksum) + } + } + + return r0 +} + // GetCryptoAccount provides a mock function with given fields: func (_m *Address) GetCryptoAccount() core.CryptoAccount { ret := _m.Called() @@ -40,6 +72,20 @@ func (_m *Address) IsBip32() bool { return r0 } +// Null provides a mock function with given fields: +func (_m *Address) Null() bool { + ret := _m.Called() + + var r0 bool + if rf, ok := ret.Get(0).(func() bool); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(bool) + } + + return r0 +} + // String provides a mock function with given fields: func (_m *Address) String() string { ret := _m.Called() @@ -53,3 +99,17 @@ func (_m *Address) String() string { return r0 } + +// Verify provides a mock function with given fields: _a0 +func (_m *Address) Verify(_a0 core.PubKey) error { + ret := _m.Called(_a0) + + var r0 error + if rf, ok := ret.Get(0).(func(core.PubKey) error); ok { + r0 = rf(_a0) + } else { + r0 = ret.Error(0) + } + + return r0 +} diff --git a/src/coin/mocks/AddressBook.go b/src/coin/mocks/AddressBook.go new file mode 100644 index 00000000..28205cca --- /dev/null +++ b/src/coin/mocks/AddressBook.go @@ -0,0 +1,227 @@ +// Code generated by mockery v1.0.0. DO NOT EDIT. + +package mocks + +import core "github.com/fibercrypto/fibercryptowallet/src/core" +import mock "github.com/stretchr/testify/mock" + +// AddressBook is an autogenerated mock type for the AddressBook type +type AddressBook struct { + mock.Mock +} + +// Authenticate provides a mock function with given fields: password +func (_m *AddressBook) Authenticate(password string) error { + ret := _m.Called(password) + + var r0 error + if rf, ok := ret.Get(0).(func(string) error); ok { + r0 = rf(password) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// ChangeSecurity provides a mock function with given fields: NewSecType, oldPassword, newPassword +func (_m *AddressBook) ChangeSecurity(NewSecType int, oldPassword string, newPassword string) error { + ret := _m.Called(NewSecType, oldPassword, newPassword) + + var r0 error + if rf, ok := ret.Get(0).(func(int, string, string) error); ok { + r0 = rf(NewSecType, oldPassword, newPassword) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// Close provides a mock function with given fields: +func (_m *AddressBook) Close() error { + ret := _m.Called() + + var r0 error + if rf, ok := ret.Get(0).(func() error); ok { + r0 = rf() + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// DeleteContact provides a mock function with given fields: id +func (_m *AddressBook) DeleteContact(id uint64) error { + ret := _m.Called(id) + + var r0 error + if rf, ok := ret.Get(0).(func(uint64) error); ok { + r0 = rf(id) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// GetContact provides a mock function with given fields: id +func (_m *AddressBook) GetContact(id uint64) (core.Contact, error) { + ret := _m.Called(id) + + var r0 core.Contact + if rf, ok := ret.Get(0).(func(uint64) core.Contact); ok { + r0 = rf(id) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(core.Contact) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(uint64) error); ok { + r1 = rf(id) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetSecType provides a mock function with given fields: +func (_m *AddressBook) GetSecType() (int, error) { + ret := _m.Called() + + var r0 int + if rf, ok := ret.Get(0).(func() int); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(int) + } + + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetStorage provides a mock function with given fields: +func (_m *AddressBook) GetStorage() core.Storage { + ret := _m.Called() + + var r0 core.Storage + if rf, ok := ret.Get(0).(func() core.Storage); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(core.Storage) + } + } + + return r0 +} + +// HasInit provides a mock function with given fields: +func (_m *AddressBook) HasInit() bool { + ret := _m.Called() + + var r0 bool + if rf, ok := ret.Get(0).(func() bool); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(bool) + } + + return r0 +} + +// Init provides a mock function with given fields: secType, password +func (_m *AddressBook) Init(secType int, password string) error { + ret := _m.Called(secType, password) + + var r0 error + if rf, ok := ret.Get(0).(func(int, string) error); ok { + r0 = rf(secType, password) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// InsertContact provides a mock function with given fields: contact +func (_m *AddressBook) InsertContact(contact core.Contact) (uint64, error) { + ret := _m.Called(contact) + + var r0 uint64 + if rf, ok := ret.Get(0).(func(core.Contact) uint64); ok { + r0 = rf(contact) + } else { + r0 = ret.Get(0).(uint64) + } + + var r1 error + if rf, ok := ret.Get(1).(func(core.Contact) error); ok { + r1 = rf(contact) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// IsOpen provides a mock function with given fields: +func (_m *AddressBook) IsOpen() bool { + ret := _m.Called() + + var r0 bool + if rf, ok := ret.Get(0).(func() bool); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(bool) + } + + return r0 +} + +// ListContact provides a mock function with given fields: +func (_m *AddressBook) ListContact() ([]core.Contact, error) { + ret := _m.Called() + + var r0 []core.Contact + if rf, ok := ret.Get(0).(func() []core.Contact); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]core.Contact) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// UpdateContact provides a mock function with given fields: id, contact +func (_m *AddressBook) UpdateContact(id uint64, contact core.Contact) error { + ret := _m.Called(id, contact) + + var r0 error + if rf, ok := ret.Get(0).(func(uint64, core.Contact) error); ok { + r0 = rf(id, contact) + } else { + r0 = ret.Error(0) + } + + return r0 +} diff --git a/src/coin/mocks/AltcoinPlugin.go b/src/coin/mocks/AltcoinPlugin.go index 3c99d3d3..4cb44bef 100644 --- a/src/coin/mocks/AltcoinPlugin.go +++ b/src/coin/mocks/AltcoinPlugin.go @@ -10,6 +10,29 @@ type AltcoinPlugin struct { mock.Mock } +// AddressFromString provides a mock function with given fields: _a0 +func (_m *AltcoinPlugin) AddressFromString(_a0 string) (core.Address, error) { + ret := _m.Called(_a0) + + var r0 core.Address + if rf, ok := ret.Get(0).(func(string) core.Address); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(core.Address) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // GetDescription provides a mock function with given fields: func (_m *AltcoinPlugin) GetDescription() string { ret := _m.Called() @@ -155,7 +178,53 @@ func (_m *AltcoinPlugin) LoadWalletEnvs() []core.WalletEnv { return r0 } +// PubKeyFromBytes provides a mock function with given fields: _a0 +func (_m *AltcoinPlugin) PubKeyFromBytes(_a0 []byte) (core.PubKey, error) { + ret := _m.Called(_a0) + + var r0 core.PubKey + if rf, ok := ret.Get(0).(func([]byte) core.PubKey); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(core.PubKey) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func([]byte) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // RegisterTo provides a mock function with given fields: manager func (_m *AltcoinPlugin) RegisterTo(manager core.AltcoinManager) { _m.Called(manager) } + +// SecKeyFromBytes provides a mock function with given fields: _a0 +func (_m *AltcoinPlugin) SecKeyFromBytes(_a0 []byte) (core.SecKey, error) { + ret := _m.Called(_a0) + + var r0 core.SecKey + if rf, ok := ret.Get(0).(func([]byte) core.SecKey); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(core.SecKey) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func([]byte) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} diff --git a/src/coin/mocks/Contact.go b/src/coin/mocks/Contact.go new file mode 100644 index 00000000..b0e92958 --- /dev/null +++ b/src/coin/mocks/Contact.go @@ -0,0 +1,84 @@ +// Code generated by mockery v1.0.0. DO NOT EDIT. + +package mocks + +import core "github.com/fibercrypto/fibercryptowallet/src/core" +import mock "github.com/stretchr/testify/mock" + +// Contact is an autogenerated mock type for the Contact type +type Contact struct { + mock.Mock +} + +// GetAddresses provides a mock function with given fields: +func (_m *Contact) GetAddresses() []core.StringAddress { + ret := _m.Called() + + var r0 []core.StringAddress + if rf, ok := ret.Get(0).(func() []core.StringAddress); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]core.StringAddress) + } + } + + return r0 +} + +// GetID provides a mock function with given fields: +func (_m *Contact) GetID() uint64 { + ret := _m.Called() + + var r0 uint64 + if rf, ok := ret.Get(0).(func() uint64); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(uint64) + } + + return r0 +} + +// GetName provides a mock function with given fields: +func (_m *Contact) GetName() string { + ret := _m.Called() + + var r0 string + if rf, ok := ret.Get(0).(func() string); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(string) + } + + return r0 +} + +// IsValid provides a mock function with given fields: +func (_m *Contact) IsValid() bool { + ret := _m.Called() + + var r0 bool + if rf, ok := ret.Get(0).(func() bool); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(bool) + } + + return r0 +} + +// SetAddresses provides a mock function with given fields: _a0 +func (_m *Contact) SetAddresses(_a0 []core.StringAddress) { + _m.Called(_a0) +} + +// SetID provides a mock function with given fields: id +func (_m *Contact) SetID(id uint64) { + _m.Called(id) +} + +// SetName provides a mock function with given fields: _a0 +func (_m *Contact) SetName(_a0 string) { + _m.Called(_a0) +} diff --git a/src/coin/mocks/CryptoAccount.go b/src/coin/mocks/CryptoAccount.go index eebf8290..d57fe129 100644 --- a/src/coin/mocks/CryptoAccount.go +++ b/src/coin/mocks/CryptoAccount.go @@ -87,7 +87,7 @@ func (_m *CryptoAccount) ListTransactions() core.TransactionIterator { } // ScanUnspentOutputs provides a mock function with given fields: -func (_m *CryptoAccount) ScanUnspentOutputs() core.TransactionOutputIterator { +func (_m *CryptoAccount) ScanUnspentOutputs() (core.TransactionOutputIterator, error) { ret := _m.Called() var r0 core.TransactionOutputIterator @@ -99,5 +99,12 @@ func (_m *CryptoAccount) ScanUnspentOutputs() core.TransactionOutputIterator { } } - return r0 + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 } diff --git a/src/coin/mocks/DeviceHelper.go b/src/coin/mocks/DeviceHelper.go new file mode 100644 index 00000000..c790686d --- /dev/null +++ b/src/coin/mocks/DeviceHelper.go @@ -0,0 +1,109 @@ +// Code generated by mockery v1.0.0. DO NOT EDIT. + +package mocks + +import core "github.com/fibercrypto/fibercryptowallet/src/core" + +import mock "github.com/stretchr/testify/mock" +import promise "github.com/chebyrash/promise" + +// DeviceHelper is an autogenerated mock type for the DeviceHelper type +type DeviceHelper struct { + mock.Mock +} + +// DeviceMatch provides a mock function with given fields: wlt +func (_m *DeviceHelper) DeviceMatch(wlt core.Wallet) *promise.Promise { + ret := _m.Called(wlt) + + var r0 *promise.Promise + if rf, ok := ret.Get(0).(func(core.Wallet) *promise.Promise); ok { + r0 = rf(wlt) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*promise.Promise) + } + } + + return r0 +} + +// FirstAddress provides a mock function with given fields: walletType +func (_m *DeviceHelper) FirstAddress(walletType string) *promise.Promise { + ret := _m.Called(walletType) + + var r0 *promise.Promise + if rf, ok := ret.Get(0).(func(string) *promise.Promise); ok { + r0 = rf(walletType) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*promise.Promise) + } + } + + return r0 +} + +// IsBootloaderMode provides a mock function with given fields: +func (_m *DeviceHelper) IsBootloaderMode() *promise.Promise { + ret := _m.Called() + + var r0 *promise.Promise + if rf, ok := ret.Get(0).(func() *promise.Promise); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*promise.Promise) + } + } + + return r0 +} + +// ShouldBeInitialized provides a mock function with given fields: +func (_m *DeviceHelper) ShouldBeInitialized() *promise.Promise { + ret := _m.Called() + + var r0 *promise.Promise + if rf, ok := ret.Get(0).(func() *promise.Promise); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*promise.Promise) + } + } + + return r0 +} + +// ShouldBeSecured provides a mock function with given fields: +func (_m *DeviceHelper) ShouldBeSecured() *promise.Promise { + ret := _m.Called() + + var r0 *promise.Promise + if rf, ok := ret.Get(0).(func() *promise.Promise); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*promise.Promise) + } + } + + return r0 +} + +// ShouldUploadFirmware provides a mock function with given fields: +func (_m *DeviceHelper) ShouldUploadFirmware() *promise.Promise { + ret := _m.Called() + + var r0 *promise.Promise + if rf, ok := ret.Get(0).(func() *promise.Promise); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*promise.Promise) + } + } + + return r0 +} diff --git a/src/coin/mocks/DeviceInteraction.go b/src/coin/mocks/DeviceInteraction.go new file mode 100644 index 00000000..ed516332 --- /dev/null +++ b/src/coin/mocks/DeviceInteraction.go @@ -0,0 +1,314 @@ +// Code generated by mockery v1.0.0. DO NOT EDIT. + +package mocks + +import messages "github.com/fibercrypto/skywallet-protob/go" +import mock "github.com/stretchr/testify/mock" +import promise "github.com/chebyrash/promise" + +// DeviceInteraction is an autogenerated mock type for the DeviceInteraction type +type DeviceInteraction struct { + mock.Mock +} + +// AddressGen provides a mock function with given fields: addressN, startIndex, confirmAddress, walletType +func (_m *DeviceInteraction) AddressGen(addressN uint32, startIndex uint32, confirmAddress bool, walletType string) *promise.Promise { + ret := _m.Called(addressN, startIndex, confirmAddress, walletType) + + var r0 *promise.Promise + if rf, ok := ret.Get(0).(func(uint32, uint32, bool, string) *promise.Promise); ok { + r0 = rf(addressN, startIndex, confirmAddress, walletType) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*promise.Promise) + } + } + + return r0 +} + +// ApplySettings provides a mock function with given fields: usePassphrase, label, language +func (_m *DeviceInteraction) ApplySettings(usePassphrase *bool, label string, language string) *promise.Promise { + ret := _m.Called(usePassphrase, label, language) + + var r0 *promise.Promise + if rf, ok := ret.Get(0).(func(*bool, string, string) *promise.Promise); ok { + r0 = rf(usePassphrase, label, language) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*promise.Promise) + } + } + + return r0 +} + +// Backup provides a mock function with given fields: +func (_m *DeviceInteraction) Backup() *promise.Promise { + ret := _m.Called() + + var r0 *promise.Promise + if rf, ok := ret.Get(0).(func() *promise.Promise); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*promise.Promise) + } + } + + return r0 +} + +// Cancel provides a mock function with given fields: +func (_m *DeviceInteraction) Cancel() *promise.Promise { + ret := _m.Called() + + var r0 *promise.Promise + if rf, ok := ret.Get(0).(func() *promise.Promise); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*promise.Promise) + } + } + + return r0 +} + +// ChangePin provides a mock function with given fields: removePin +func (_m *DeviceInteraction) ChangePin(removePin *bool) *promise.Promise { + ret := _m.Called(removePin) + + var r0 *promise.Promise + if rf, ok := ret.Get(0).(func(*bool) *promise.Promise); ok { + r0 = rf(removePin) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*promise.Promise) + } + } + + return r0 +} + +// CheckMessageSignature provides a mock function with given fields: message, signature, address +func (_m *DeviceInteraction) CheckMessageSignature(message string, signature string, address string) *promise.Promise { + ret := _m.Called(message, signature, address) + + var r0 *promise.Promise + if rf, ok := ret.Get(0).(func(string, string, string) *promise.Promise); ok { + r0 = rf(message, signature, address) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*promise.Promise) + } + } + + return r0 +} + +// ClearSingleTimeOperationsCache provides a mock function with given fields: +func (_m *DeviceInteraction) ClearSingleTimeOperationsCache() { + _m.Called() +} + +// Features provides a mock function with given fields: +func (_m *DeviceInteraction) Features() *promise.Promise { + ret := _m.Called() + + var r0 *promise.Promise + if rf, ok := ret.Get(0).(func() *promise.Promise); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*promise.Promise) + } + } + + return r0 +} + +// GenerateMnemonic provides a mock function with given fields: wordCount, usePassphrase +func (_m *DeviceInteraction) GenerateMnemonic(wordCount uint32, usePassphrase bool) *promise.Promise { + ret := _m.Called(wordCount, usePassphrase) + + var r0 *promise.Promise + if rf, ok := ret.Get(0).(func(uint32, bool) *promise.Promise); ok { + r0 = rf(wordCount, usePassphrase) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*promise.Promise) + } + } + + return r0 +} + +// InitializeWasWarn provides a mock function with given fields: +func (_m *DeviceInteraction) InitializeWasWarn() bool { + ret := _m.Called() + + var r0 bool + if rf, ok := ret.Get(0).(func() bool); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(bool) + } + + return r0 +} + +// IsAvailable provides a mock function with given fields: +func (_m *DeviceInteraction) IsAvailable() *promise.Promise { + ret := _m.Called() + + var r0 *promise.Promise + if rf, ok := ret.Get(0).(func() *promise.Promise); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*promise.Promise) + } + } + + return r0 +} + +// Recovery provides a mock function with given fields: wordCount, usePassphrase, dryRun +func (_m *DeviceInteraction) Recovery(wordCount uint32, usePassphrase *bool, dryRun bool) *promise.Promise { + ret := _m.Called(wordCount, usePassphrase, dryRun) + + var r0 *promise.Promise + if rf, ok := ret.Get(0).(func(uint32, *bool, bool) *promise.Promise); ok { + r0 = rf(wordCount, usePassphrase, dryRun) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*promise.Promise) + } + } + + return r0 +} + +// SecureWasWarn provides a mock function with given fields: +func (_m *DeviceInteraction) SecureWasWarn() bool { + ret := _m.Called() + + var r0 bool + if rf, ok := ret.Get(0).(func() bool); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(bool) + } + + return r0 +} + +// SetInitializeWasWarn provides a mock function with given fields: +func (_m *DeviceInteraction) SetInitializeWasWarn() { + _m.Called() +} + +// SetMnemonic provides a mock function with given fields: mnemonic +func (_m *DeviceInteraction) SetMnemonic(mnemonic string) *promise.Promise { + ret := _m.Called(mnemonic) + + var r0 *promise.Promise + if rf, ok := ret.Get(0).(func(string) *promise.Promise); ok { + r0 = rf(mnemonic) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*promise.Promise) + } + } + + return r0 +} + +// SetSecureWasWarn provides a mock function with given fields: +func (_m *DeviceInteraction) SetSecureWasWarn() { + _m.Called() +} + +// SetUploadFirmwareWasWarn provides a mock function with given fields: +func (_m *DeviceInteraction) SetUploadFirmwareWasWarn() { + _m.Called() +} + +// SignMessage provides a mock function with given fields: addressN, addressIndex, message, walletType +func (_m *DeviceInteraction) SignMessage(addressN int, addressIndex int, message string, walletType string) *promise.Promise { + ret := _m.Called(addressN, addressIndex, message, walletType) + + var r0 *promise.Promise + if rf, ok := ret.Get(0).(func(int, int, string, string) *promise.Promise); ok { + r0 = rf(addressN, addressIndex, message, walletType) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*promise.Promise) + } + } + + return r0 +} + +// TransactionSign provides a mock function with given fields: inputs, outputs, walletType +func (_m *DeviceInteraction) TransactionSign(inputs []*messages.SkycoinTransactionInput, outputs []*messages.SkycoinTransactionOutput, walletType string) *promise.Promise { + ret := _m.Called(inputs, outputs, walletType) + + var r0 *promise.Promise + if rf, ok := ret.Get(0).(func([]*messages.SkycoinTransactionInput, []*messages.SkycoinTransactionOutput, string) *promise.Promise); ok { + r0 = rf(inputs, outputs, walletType) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*promise.Promise) + } + } + + return r0 +} + +// UploadFirmware provides a mock function with given fields: payload, hash +func (_m *DeviceInteraction) UploadFirmware(payload []byte, hash [32]byte) *promise.Promise { + ret := _m.Called(payload, hash) + + var r0 *promise.Promise + if rf, ok := ret.Get(0).(func([]byte, [32]byte) *promise.Promise); ok { + r0 = rf(payload, hash) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*promise.Promise) + } + } + + return r0 +} + +// UploadFirmwareWasWarn provides a mock function with given fields: +func (_m *DeviceInteraction) UploadFirmwareWasWarn() bool { + ret := _m.Called() + + var r0 bool + if rf, ok := ret.Get(0).(func() bool); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(bool) + } + + return r0 +} + +// Wipe provides a mock function with given fields: +func (_m *DeviceInteraction) Wipe() *promise.Promise { + ret := _m.Called() + + var r0 *promise.Promise + if rf, ok := ret.Get(0).(func() *promise.Promise); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*promise.Promise) + } + } + + return r0 +} diff --git a/src/coin/mocks/MultiPoolSection.go b/src/coin/mocks/MultiPoolSection.go index 3aeac0e9..715e29f3 100644 --- a/src/coin/mocks/MultiPoolSection.go +++ b/src/coin/mocks/MultiPoolSection.go @@ -10,7 +10,7 @@ type MultiPoolSection struct { } // Get provides a mock function with given fields: -func (_m *MultiPoolSection) Get() interface{} { +func (_m *MultiPoolSection) Get() (interface{}, error) { ret := _m.Called() var r0 interface{} @@ -22,7 +22,14 @@ func (_m *MultiPoolSection) Get() interface{} { } } - return r0 + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 } // Put provides a mock function with given fields: _a0 diff --git a/src/coin/mocks/PubKey.go b/src/coin/mocks/PubKey.go new file mode 100644 index 00000000..44cca278 --- /dev/null +++ b/src/coin/mocks/PubKey.go @@ -0,0 +1,54 @@ +// Code generated by mockery v1.0.0. DO NOT EDIT. + +package mocks + +import mock "github.com/stretchr/testify/mock" + +// PubKey is an autogenerated mock type for the PubKey type +type PubKey struct { + mock.Mock +} + +// Bytes provides a mock function with given fields: +func (_m *PubKey) Bytes() []byte { + ret := _m.Called() + + var r0 []byte + if rf, ok := ret.Get(0).(func() []byte); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]byte) + } + } + + return r0 +} + +// Null provides a mock function with given fields: +func (_m *PubKey) Null() bool { + ret := _m.Called() + + var r0 bool + if rf, ok := ret.Get(0).(func() bool); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(bool) + } + + return r0 +} + +// Verify provides a mock function with given fields: +func (_m *PubKey) Verify() error { + ret := _m.Called() + + var r0 error + if rf, ok := ret.Get(0).(func() error); ok { + r0 = rf() + } else { + r0 = ret.Error(0) + } + + return r0 +} diff --git a/src/coin/mocks/SecKey.go b/src/coin/mocks/SecKey.go new file mode 100644 index 00000000..6160f9db --- /dev/null +++ b/src/coin/mocks/SecKey.go @@ -0,0 +1,54 @@ +// Code generated by mockery v1.0.0. DO NOT EDIT. + +package mocks + +import mock "github.com/stretchr/testify/mock" + +// SecKey is an autogenerated mock type for the SecKey type +type SecKey struct { + mock.Mock +} + +// Bytes provides a mock function with given fields: +func (_m *SecKey) Bytes() []byte { + ret := _m.Called() + + var r0 []byte + if rf, ok := ret.Get(0).(func() []byte); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]byte) + } + } + + return r0 +} + +// Null provides a mock function with given fields: +func (_m *SecKey) Null() bool { + ret := _m.Called() + + var r0 bool + if rf, ok := ret.Get(0).(func() bool); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(bool) + } + + return r0 +} + +// Verify provides a mock function with given fields: +func (_m *SecKey) Verify() error { + ret := _m.Called() + + var r0 error + if rf, ok := ret.Get(0).(func() error); ok { + r0 = rf() + } else { + r0 = ret.Error(0) + } + + return r0 +} diff --git a/src/coin/mocks/Storage.go b/src/coin/mocks/Storage.go new file mode 100644 index 00000000..70d55608 --- /dev/null +++ b/src/coin/mocks/Storage.go @@ -0,0 +1,163 @@ +// Code generated by mockery v1.0.0. DO NOT EDIT. + +package mocks + +import mock "github.com/stretchr/testify/mock" + +// Storage is an autogenerated mock type for the Storage type +type Storage struct { + mock.Mock +} + +// Close provides a mock function with given fields: +func (_m *Storage) Close() error { + ret := _m.Called() + + var r0 error + if rf, ok := ret.Get(0).(func() error); ok { + r0 = rf() + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// DeleteValue provides a mock function with given fields: key +func (_m *Storage) DeleteValue(key uint64) error { + ret := _m.Called(key) + + var r0 error + if rf, ok := ret.Get(0).(func(uint64) error); ok { + r0 = rf(key) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// GetConfig provides a mock function with given fields: +func (_m *Storage) GetConfig() map[string]string { + ret := _m.Called() + + var r0 map[string]string + if rf, ok := ret.Get(0).(func() map[string]string); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(map[string]string) + } + } + + return r0 +} + +// GetValue provides a mock function with given fields: key +func (_m *Storage) GetValue(key uint64) (interface{}, error) { + ret := _m.Called(key) + + var r0 interface{} + if rf, ok := ret.Get(0).(func(uint64) interface{}); ok { + r0 = rf(key) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(interface{}) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(uint64) error); ok { + r1 = rf(key) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// InsertConfig provides a mock function with given fields: _a0 +func (_m *Storage) InsertConfig(_a0 map[string]string) error { + ret := _m.Called(_a0) + + var r0 error + if rf, ok := ret.Get(0).(func(map[string]string) error); ok { + r0 = rf(_a0) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// InsertValue provides a mock function with given fields: value +func (_m *Storage) InsertValue(value interface{}) (uint64, error) { + ret := _m.Called(value) + + var r0 uint64 + if rf, ok := ret.Get(0).(func(interface{}) uint64); ok { + r0 = rf(value) + } else { + r0 = ret.Get(0).(uint64) + } + + var r1 error + if rf, ok := ret.Get(1).(func(interface{}) error); ok { + r1 = rf(value) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ListValues provides a mock function with given fields: +func (_m *Storage) ListValues() (map[uint64]interface{}, error) { + ret := _m.Called() + + var r0 map[uint64]interface{} + if rf, ok := ret.Get(0).(func() map[uint64]interface{}); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(map[uint64]interface{}) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Path provides a mock function with given fields: +func (_m *Storage) Path() string { + ret := _m.Called() + + var r0 string + if rf, ok := ret.Get(0).(func() string); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(string) + } + + return r0 +} + +// UpdateValue provides a mock function with given fields: key, newValue +func (_m *Storage) UpdateValue(key uint64, newValue interface{}) error { + ret := _m.Called(key, newValue) + + var r0 error + if rf, ok := ret.Get(0).(func(uint64, interface{}) error); ok { + r0 = rf(key, newValue) + } else { + r0 = ret.Error(0) + } + + return r0 +} diff --git a/src/coin/mocks/StringAddress.go b/src/coin/mocks/StringAddress.go new file mode 100644 index 00000000..5f8d9a7b --- /dev/null +++ b/src/coin/mocks/StringAddress.go @@ -0,0 +1,66 @@ +// Code generated by mockery v1.0.0. DO NOT EDIT. + +package mocks + +import mock "github.com/stretchr/testify/mock" + +// StringAddress is an autogenerated mock type for the StringAddress type +type StringAddress struct { + mock.Mock +} + +// GetCoinType provides a mock function with given fields: +func (_m *StringAddress) GetCoinType() []byte { + ret := _m.Called() + + var r0 []byte + if rf, ok := ret.Get(0).(func() []byte); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]byte) + } + } + + return r0 +} + +// GetValue provides a mock function with given fields: +func (_m *StringAddress) GetValue() []byte { + ret := _m.Called() + + var r0 []byte + if rf, ok := ret.Get(0).(func() []byte); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]byte) + } + } + + return r0 +} + +// IsValid provides a mock function with given fields: +func (_m *StringAddress) IsValid() bool { + ret := _m.Called() + + var r0 bool + if rf, ok := ret.Get(0).(func() bool); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(bool) + } + + return r0 +} + +// SetCoinType provides a mock function with given fields: val +func (_m *StringAddress) SetCoinType(val []byte) { + _m.Called(val) +} + +// SetValue provides a mock function with given fields: val +func (_m *StringAddress) SetValue(val []byte) { + _m.Called(val) +} diff --git a/src/coin/mocks/TransactionInput.go b/src/coin/mocks/TransactionInput.go index 1c92673d..1837fa7e 100644 --- a/src/coin/mocks/TransactionInput.go +++ b/src/coin/mocks/TransactionInput.go @@ -46,7 +46,7 @@ func (_m *TransactionInput) GetId() string { } // GetSpentOutput provides a mock function with given fields: -func (_m *TransactionInput) GetSpentOutput() core.TransactionOutput { +func (_m *TransactionInput) GetSpentOutput() (core.TransactionOutput, error) { ret := _m.Called() var r0 core.TransactionOutput @@ -58,7 +58,14 @@ func (_m *TransactionInput) GetSpentOutput() core.TransactionOutput { } } - return r0 + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 } // SupportedAssets provides a mock function with given fields: diff --git a/src/coin/mocks/TransactionOutput.go b/src/coin/mocks/TransactionOutput.go index cc048507..335c16d3 100644 --- a/src/coin/mocks/TransactionOutput.go +++ b/src/coin/mocks/TransactionOutput.go @@ -11,7 +11,7 @@ type TransactionOutput struct { } // GetAddress provides a mock function with given fields: -func (_m *TransactionOutput) GetAddress() core.Address { +func (_m *TransactionOutput) GetAddress() (core.Address, error) { ret := _m.Called() var r0 core.Address @@ -23,7 +23,14 @@ func (_m *TransactionOutput) GetAddress() core.Address { } } - return r0 + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 } // GetCoins provides a mock function with given fields: ticker diff --git a/src/coin/mocks/TxnSigner.go b/src/coin/mocks/TxnSigner.go index 1a6b3f40..12194381 100644 --- a/src/coin/mocks/TxnSigner.go +++ b/src/coin/mocks/TxnSigner.go @@ -11,7 +11,7 @@ type TxnSigner struct { } // GetSignerDescription provides a mock function with given fields: -func (_m *TxnSigner) GetSignerDescription() string { +func (_m *TxnSigner) GetSignerDescription() (string, error) { ret := _m.Called() var r0 string @@ -21,11 +21,18 @@ func (_m *TxnSigner) GetSignerDescription() string { r0 = ret.Get(0).(string) } - return r0 + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 } // GetSignerUID provides a mock function with given fields: -func (_m *TxnSigner) GetSignerUID() core.UID { +func (_m *TxnSigner) GetSignerUID() (core.UID, error) { ret := _m.Called() var r0 core.UID @@ -35,7 +42,14 @@ func (_m *TxnSigner) GetSignerUID() core.UID { r0 = ret.Get(0).(core.UID) } - return r0 + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 } // ReadyForTxn provides a mock function with given fields: _a0, _a1 diff --git a/src/coin/mocks/WalletEnv.go b/src/coin/mocks/WalletEnv.go index b3cc6724..ae58970c 100644 --- a/src/coin/mocks/WalletEnv.go +++ b/src/coin/mocks/WalletEnv.go @@ -41,3 +41,26 @@ func (_m *WalletEnv) GetWalletSet() core.WalletSet { return r0 } + +// LookupWallet provides a mock function with given fields: firstAddr +func (_m *WalletEnv) LookupWallet(firstAddr string) (core.Wallet, error) { + ret := _m.Called(firstAddr) + + var r0 core.Wallet + if rf, ok := ret.Get(0).(func(string) core.Wallet); ok { + r0 = rf(firstAddr) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(core.Wallet) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string) error); ok { + r1 = rf(firstAddr) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} diff --git a/src/coin/mocks/WalletSet.go b/src/coin/mocks/WalletSet.go index 9fb40e99..ddce6a61 100644 --- a/src/coin/mocks/WalletSet.go +++ b/src/coin/mocks/WalletSet.go @@ -10,13 +10,13 @@ type WalletSet struct { mock.Mock } -// CreateWallet provides a mock function with given fields: name, seed, isEncryptrd, pwd, scanAddressesN -func (_m *WalletSet) CreateWallet(name string, seed string, isEncryptrd bool, pwd core.PasswordReader, scanAddressesN int) (core.Wallet, error) { - ret := _m.Called(name, seed, isEncryptrd, pwd, scanAddressesN) +// CreateWallet provides a mock function with given fields: name, seed, walletType, isEncryptrd, pwd, scanAddressesN +func (_m *WalletSet) CreateWallet(name string, seed string, walletType string, isEncryptrd bool, pwd core.PasswordReader, scanAddressesN int) (core.Wallet, error) { + ret := _m.Called(name, seed, walletType, isEncryptrd, pwd, scanAddressesN) var r0 core.Wallet - if rf, ok := ret.Get(0).(func(string, string, bool, core.PasswordReader, int) core.Wallet); ok { - r0 = rf(name, seed, isEncryptrd, pwd, scanAddressesN) + if rf, ok := ret.Get(0).(func(string, string, string, bool, core.PasswordReader, int) core.Wallet); ok { + r0 = rf(name, seed, walletType, isEncryptrd, pwd, scanAddressesN) } else { if ret.Get(0) != nil { r0 = ret.Get(0).(core.Wallet) @@ -24,8 +24,8 @@ func (_m *WalletSet) CreateWallet(name string, seed string, isEncryptrd bool, pw } var r1 error - if rf, ok := ret.Get(1).(func(string, string, bool, core.PasswordReader, int) error); ok { - r1 = rf(name, seed, isEncryptrd, pwd, scanAddressesN) + if rf, ok := ret.Get(1).(func(string, string, string, bool, core.PasswordReader, int) error); ok { + r1 = rf(name, seed, walletType, isEncryptrd, pwd, scanAddressesN) } else { r1 = ret.Error(1) } @@ -33,6 +33,20 @@ func (_m *WalletSet) CreateWallet(name string, seed string, isEncryptrd bool, pw return r0, r1 } +// DefaultWalletType provides a mock function with given fields: +func (_m *WalletSet) DefaultWalletType() string { + ret := _m.Called() + + var r0 string + if rf, ok := ret.Get(0).(func() string); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(string) + } + + return r0 +} + // GetWallet provides a mock function with given fields: id func (_m *WalletSet) GetWallet(id string) core.Wallet { ret := _m.Called(id) @@ -64,3 +78,19 @@ func (_m *WalletSet) ListWallets() core.WalletIterator { return r0 } + +// SupportedWalletTypes provides a mock function with given fields: +func (_m *WalletSet) SupportedWalletTypes() []string { + ret := _m.Called() + + var r0 []string + if rf, ok := ret.Get(0).(func() []string); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]string) + } + } + + return r0 +} diff --git a/src/coin/skycoin/config/config.go b/src/coin/skycoin/config/config.go index 1fbac8c8..a66050be 100644 --- a/src/coin/skycoin/config/config.go +++ b/src/coin/skycoin/config/config.go @@ -5,27 +5,32 @@ import ( "os" "os/user" "path/filepath" + "strconv" "strings" local "github.com/fibercrypto/fibercryptowallet/src/main" + "github.com/fibercrypto/fibercryptowallet/src/util/logging" ) const ( LocalWallet = "local" RemoteWallet = "remote" SectionName = "skycoin" + SettingPathToLog = "log" SettingPathToNode = "node" + SettingNodeAddress = "address" SettingPathToWalletSource = "walletSource" ) var ( sectionManager *local.SectionManager + log = logging.MustGetLogger("Skycoin Config") ) func getMultiPlatformUserDirectory() string { usr, err := user.Current() if err != nil { - //TODO: Log error + log.WithError(err).Error() return "" } return filepath.Join(usr.HomeDir, string(os.PathSeparator), ".skycoin", string(os.PathSeparator), "wallets") @@ -33,7 +38,7 @@ func getMultiPlatformUserDirectory() string { func RegisterConfig() error { cm := local.GetConfigManager() - node := map[string]string{"address": "https://staging.node.skycoin.net"} + node := map[string]string{"address": "https://node.skycoin.com"} nodeBytes, err := json.Marshal(node) if err != nil { return err @@ -52,7 +57,30 @@ func RegisterConfig() error { wltOpt := local.NewOption(string(wltSrc.id), []string{SettingPathToWalletSource}, false, string(wltSrcBytes)) - sectionManager = cm.RegisterSection(SectionName, []*local.Option{nodeOpt, wltOpt}) + level := map[string]string{"level": strconv.Itoa(logging.Warning)} + levelBytes, err := json.Marshal(level) + if err != nil { + return err + } + logLevelOpt := local.NewOption(SettingPathToLog, []string{}, false, string(levelBytes)) + + output := map[string]string{"output": "none"} + outputBytes, err := json.Marshal(output) + if err != nil { + return err + } + + logOutputOpt := local.NewOption(SettingPathToLog, []string{}, false, string(outputBytes)) + + outputFile := map[string]string{"outputFile": ""} + outputFileBytes, err := json.Marshal(outputFile) + if err != nil { + return err + } + + logOutputFileOpt := local.NewOption(SettingPathToLog, []string{}, false, string(outputFileBytes)) + + sectionManager = cm.RegisterSection(SectionName, []*local.Option{nodeOpt, wltOpt, logLevelOpt, logOutputOpt, logOutputFileOpt}) return nil } @@ -65,6 +93,41 @@ func getValues(prefix string) ([]string, error) { return sectionManager.GetValues(strings.Split(prefix, "/")) } +func GetDataRefreshTimeout() uint64 { + return getFromCache(local.DataRefreshTimeoutKey) +} + +func GetDataUpdateTime() uint64 { + return getFromCache(local.DataUpdateTimeKey) +} + +func getFromCache(cacheKeyValue string) uint64 { + cm := local.GetConfigManager() + sm := cm.GetSectionManager("global") + value, err := sm.GetValue("cache", nil) + if err != nil { + log.WithError(err).Warn("Couldn't get cache value option for saved settings") + return 0 + } + + keyValue := make(map[string]string) + err = json.Unmarshal([]byte(value), &keyValue) + if err != nil { + log.WithError(err).Warn("Couldn't unmarshal from options") + return 0 + } + strVal, ok := keyValue[cacheKeyValue] + if !ok { + return 0 + } + val, err := strconv.ParseUint(strVal, 10, 64) + if err != nil { + log.WithError(err).Warn("Couldn't parse %s to int", strVal) + return 0 + } + return val +} + func GetWalletSources() ([]*walletSource, error) { wltsString, err := getValues(SettingPathToWalletSource) if err != nil { @@ -77,10 +140,31 @@ func GetWalletSources() ([]*walletSource, error) { if err != nil { return nil, err } + if wltSrcs[i].Tp == RemoteWallet { + node, err := GetNodeSource() + if err != nil { + return nil, err + } + wltSrcs[i].Source = node[SettingNodeAddress] + } } return wltSrcs, nil } +func GetNodeSource() (map[string]string, error) { + + nodeSettingStr, err := GetOption(SettingPathToNode) + if err != nil { + return nil, err + } + node := make(map[string]string) + err = json.Unmarshal([]byte(nodeSettingStr), &node) + if err != nil { + return nil, err + } + return node, nil +} + type walletSource struct { id string Tp string `json:"SourceType"` diff --git a/src/coin/skycoin/main.go b/src/coin/skycoin/main.go index 630374dd..f75da396 100644 --- a/src/coin/skycoin/main.go +++ b/src/coin/skycoin/main.go @@ -3,6 +3,7 @@ package skycoin //nolint goimports import ( "encoding/json" + skylog "github.com/SkycoinProject/skycoin/src/util/logging" "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/config" sky "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/models" "github.com/fibercrypto/fibercryptowallet/src/core" @@ -16,23 +17,61 @@ import ( var logSkycoin = logging.MustGetLogger("Skycoin Altcoin") func init() { + UpdateAltcoin() +} + +// Refresh Skycoin Altcoin node settings +func UpdateAltcoin() { err := config.RegisterConfig() if err != nil { logSkycoin.Warn("Couldn't register Skycoin configuration") } - nodeStr, err := config.GetOption(config.SettingPathToNode) + + logSettingStr, err := config.GetOption(config.SettingPathToLog) + if err != nil { + logSkycoin.Warn("Couldn't get log options") + } + logSetting := make(map[string]string) + err = json.Unmarshal([]byte(logSettingStr), &logSetting) + if err != nil { + logSkycoin.WithError(err).Warn("Couldn't unmarshal from options") + } + level, err := logging.LevelFromEnum(logSetting["level"]) if err != nil { - logSkycoin.Warn("Couldn't get node options") + logSkycoin.Warn("Couldn't get level from logging ") + logSkycoin.WithError(err).WithField("string", logSetting["level"]).Error() + } else { + logging.SetLevel(level) + } + writer, err := logging.GetOutputWriter(logSetting["output"]) + if err != nil { + logSkycoin.WithError(err).Error(logSetting["output"]) + } else if writer != nil { + logging.SetOutputTo(writer) + skylog.SetOutputTo(writer) + } else { + writer, err := logging.GetFileToLog(logSetting["outputFile"]) + if err != nil { + logSkycoin.WithError(err).Error("Error opening file: ", logSetting["outputFile"]) + } else { + logging.SetOutputTo(writer) + skylog.SetOutputTo(writer) + } + } + + nodeSettingStr, err := config.GetOption(config.SettingPathToNode) + if err != nil { + logSkycoin.Warn("Couldn't get node settings") } node := make(map[string]string) - err = json.Unmarshal([]byte(nodeStr), &node) + err = json.Unmarshal([]byte(nodeSettingStr), &node) if err != nil { - logSkycoin.Warn("Couldn't unmarshal from options") + logSkycoin.WithError(err).Warn("Couldn't unmarshal from options") } + err = core.GetMultiPool().CreateSection(sky.PoolSection, sky.NewSkycoinConnectionFactory(node["address"])) if err != nil { logSkycoin.Warn("Couldn't create section for Skycoin") } util.RegisterAltcoin(sky.NewSkyFiberPlugin(sky.SkycoinMainNetParams)) - } diff --git a/src/coin/skycoin/models/account.go b/src/coin/skycoin/models/account.go index ec278569..347f8fca 100644 --- a/src/coin/skycoin/models/account.go +++ b/src/coin/skycoin/models/account.go @@ -1,4 +1,4 @@ -package skycoin //nolint goimports +package skycoin // nolint goimports import ( "path/filepath" @@ -42,18 +42,18 @@ func (addr *SkycoinAddress) GetBalance(ticker string) (uint64, error) { func (addr *SkycoinAddress) ListAssets() []string { return []string{Sky, CoinHour} } -func (addr *SkycoinAddress) ScanUnspentOutputs() core.TransactionOutputIterator { +func (addr *SkycoinAddress) ScanUnspentOutputs() (core.TransactionOutputIterator, error) { c, err := NewSkycoinApiClient(PoolSection) if err != nil { log.WithError(err).Error("Couldn't get API client") - return nil + return nil, err } defer ReturnSkycoinClient(c) log.Info("POST /api/v1/outputs?addrs=xxx") outputSummary, err := c.OutputsForAddresses([]string{addr.String()}) if err != nil { log.WithError(err).WithField("addrs", addr.String()).Error("Couldn't POST /api/v1/outputs?addrs=xxx") - return nil + return nil, err } outs := outputSummary.SpendableOutputs() @@ -72,7 +72,7 @@ func (addr *SkycoinAddress) ScanUnspentOutputs() core.TransactionOutputIterator }) } - return NewSkycoinTransactionOutputIterator(skyOutputs) + return NewSkycoinTransactionOutputIterator(skyOutputs), nil } func (addr *SkycoinAddress) ListTransactions() core.TransactionIterator { @@ -105,7 +105,7 @@ func (addr *SkycoinAddress) ListTransactions() core.TransactionIterator { return NewSkycoinTransactionIterator(transactions) } -func (addr *SkycoinAddress) ListPendingTransactions() (core.TransactionIterator, error) { //------TODO +func (addr *SkycoinAddress) ListPendingTransactions() (core.TransactionIterator, error) { // ------TODO return nil, nil } @@ -137,21 +137,25 @@ func (wlt *RemoteWallet) ListAssets() []string { return []string{Sky, CoinHour} } -func (wlt *RemoteWallet) ScanUnspentOutputs() core.TransactionOutputIterator { +func (wlt *RemoteWallet) ScanUnspentOutputs() (core.TransactionOutputIterator, error) { log.Info("Calling RemoteWallet.GetLoadedAddresses()") addressesIter, err := wlt.GetLoadedAddresses() if err != nil { log.WithError(err).Error("RemoteWallet.GetLoadedAddresses() failed") - return nil + return nil, err } unOuts := make([]core.TransactionOutput, 0) for addressesIter.Next() { - outsIter := addressesIter.Value().GetCryptoAccount().ScanUnspentOutputs() + outsIter, err := addressesIter.Value().GetCryptoAccount().ScanUnspentOutputs() + if err != nil { + log.WithError(err).Error("Couldn't get the TransactionOutputIterator") + return nil, err + } for outsIter.Next() { unOuts = append(unOuts, outsIter.Value()) } } - return NewSkycoinTransactionOutputIterator(unOuts) + return NewSkycoinTransactionOutputIterator(unOuts), err } func (wlt *RemoteWallet) ListTransactions() core.TransactionIterator { @@ -187,18 +191,18 @@ func (wlt *RemoteWallet) ListPendingTransactions() (core.TransactionIterator, er } txns := make([]core.Transaction, 0) for _, ut := range response.Transactions { - txns = append(txns, &SkycoinPendingTransaction{Transaction: ut}) + txns = append(txns, &SkycoinPendingTransaction{Transaction: &ut}) } return NewSkycoinTransactionIterator(txns), nil } -func (wlt *LocalWallet) GetBalance(ticker string) (uint64, error) { +func (wlt *LocalWallet) updateBalances() error { walletName := filepath.Join(wlt.WalletDir, wlt.Id) log.WithField("walletName", walletName).Info("Calling wallet.Load(walletName)") walletLoaded, err := wallet.Load(walletName) if err != nil { log.WithError(err).Error("wallet.Load(walletName) failed") - return 0, err + return err } var addrs []string addresses := walletLoaded.GetAddresses() @@ -209,71 +213,85 @@ func (wlt *LocalWallet) GetBalance(ticker string) (uint64, error) { c, err := NewSkycoinApiClient(PoolSection) if err != nil { log.WithError(err).Error("Couldn't get API client") - return 0, err + return err } defer ReturnSkycoinClient(c) log.Info("POST /api/v1/outputs?addrs=xxx") outs, err := c.OutputsForAddresses(addrs) if err != nil { log.WithError(err).WithField("Length of addrs", len(addrs)).Error("Couldn't POST /api/v1/outputs?addrs=xxx") - return 0, err + return err } bl, err := getBalanceOfAddresses(outs, addrs) if err != nil { log.WithError(err).Warn("getBalanceOfAddresses(outs, addrs) failed") - return 0, err + return err } - if ticker == Sky { - flSky, err := strconv.ParseFloat(bl.Confirmed.Coins, 64) - if err != nil { - log.WithError(err).WithField("bl.Confirmed.Coins", bl.Confirmed.Coins).Error("strconv.ParseFloat(bl.Confirmed.Coins, 64) failed") - return 0, err - } - accuracy, err2 := util.AltcoinQuotient(Sky) - if err2 != nil { - log.WithError(err2).WithField("Sky", Sky).Error("util.AltcoinQuotient(Sky) failed") - return 0, err2 - } - return uint64(flSky * float64(accuracy)), nil - } else if ticker == CoinHour { - coinHours, err := strconv.ParseFloat(bl.Confirmed.Hours, 64) - if err != nil { - log.WithError(err).WithField("bl.Confirmed.Hours", bl.Confirmed.Hours).Error("strconv.ParseFloat(bl.Confirmed.Hours, 64) failed") + flSky, err := strconv.ParseFloat(bl.Confirmed.Coins, 64) + if err != nil { + log.WithError(err).WithField("bl.Confirmed.Coins", bl.Confirmed.Coins).Error("strconv.ParseFloat(bl.Confirmed.Coins, 64) failed") + return err + } + accuracy, err2 := util.AltcoinQuotient(Sky) + if err2 != nil { + log.WithError(err2).WithField("Sky", Sky).Error("util.AltcoinQuotient(Sky) failed") + return err2 + } + wlt.balance.SetCoins(Sky, uint64(flSky*float64(accuracy))) + coinHours, err := strconv.ParseFloat(bl.Confirmed.Hours, 64) + if err != nil { + log.WithError(err).WithField("bl.Confirmed.Hours", bl.Confirmed.Hours).Error("strconv.ParseFloat(bl.Confirmed.Hours, 64) failed") + return err + } + accuracy, err2 = util.AltcoinQuotient(CoinHour) + if err2 != nil { + log.WithError(err2).WithField("CoinHour", CoinHour).Error("util.AltcoinQuotient(CoinHour) failed") + return err2 + } + wlt.balance.SetCoins(CoinHour, uint64(coinHours*float64(accuracy))) + return nil +} + +func (wlt *LocalWallet) GetBalance(ticker string) (uint64, error) { + if wlt.balance == nil { + wlt.balance = util.NewBalanceSnapshot(0) + } + if !wlt.balance.IsUpdated() { + if err := wlt.updateBalances(); err != nil { return 0, err } - accuracy, err2 := util.AltcoinQuotient(CoinHour) - if err2 != nil { - log.WithError(err2).WithField("CoinHour", CoinHour).Error("util.AltcoinQuotient(CoinHour) failed") - return 0, err2 - } - return uint64(coinHours * float64(accuracy)), nil - } else { - return 0, errorTickerInvalid{ticker} } - + if coins, err := wlt.balance.GetCoins(ticker); err == nil { + return coins, nil + } + return 0, errorTickerInvalid{ticker} } func (wlt *LocalWallet) ListAssets() []string { return []string{Sky, CoinHour} } -func (wlt *LocalWallet) ScanUnspentOutputs() core.TransactionOutputIterator { +func (wlt *LocalWallet) ScanUnspentOutputs() (core.TransactionOutputIterator, error) { log.Info("Calling LocalWallet.GetLoadedAddresses()") addressesIter, err := wlt.GetLoadedAddresses() if err != nil { log.WithError(err).Error("LocalWallet.GetLoadedAddresses() failed") - return nil + return nil, err } unOuts := make([]core.TransactionOutput, 0) for addressesIter.Next() { - outsIter := addressesIter.Value().GetCryptoAccount().ScanUnspentOutputs() + outsIter, err := addressesIter.Value().GetCryptoAccount().ScanUnspentOutputs() + if err != nil { + log.WithError(err).Error("Couldn't get the TransactionOutputIterator") + return nil, err + } for outsIter.Next() { unOuts = append(unOuts, outsIter.Value()) } } - return NewSkycoinTransactionOutputIterator(unOuts) + return NewSkycoinTransactionOutputIterator(unOuts), nil } func (wlt *LocalWallet) ListTransactions() core.TransactionIterator { @@ -293,7 +311,7 @@ func (wlt *LocalWallet) ListTransactions() core.TransactionIterator { return NewSkycoinTransactionIterator(txns) } -func (wlt *LocalWallet) ListPendingTransactions() (core.TransactionIterator, error) { //------TODO +func (wlt *LocalWallet) ListPendingTransactions() (core.TransactionIterator, error) { // ------TODO c, err := NewSkycoinApiClient(PoolSection) if err != nil { log.WithError(err).Error("Couldn't get API client") @@ -308,7 +326,7 @@ func (wlt *LocalWallet) ListPendingTransactions() (core.TransactionIterator, err } txns := make([]core.Transaction, 0) for _, ut := range response.Transactions { - txns = append(txns, &SkycoinPendingTransaction{Transaction: ut}) + txns = append(txns, &SkycoinPendingTransaction{Transaction: &ut}) } return NewSkycoinTransactionIterator(txns), nil } diff --git a/src/coin/skycoin/models/account_test.go b/src/coin/skycoin/models/account_test.go index 4bf12f28..237c7c00 100644 --- a/src/coin/skycoin/models/account_test.go +++ b/src/coin/skycoin/models/account_test.go @@ -1,9 +1,12 @@ package skycoin import ( - "github.com/stretchr/testify/assert" + "errors" + "sort" "testing" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "github.com/SkycoinProject/skycoin/src/api" @@ -44,18 +47,21 @@ func TestWalletListPendingTransactions(t *testing.T) { }, }, } - global_mock.On("WalletUnconfirmedTransactionsVerbose", "42").Return(response, nil) - global_mock.On("WalletUnconfirmedTransactionsVerbose", "G1").Return(response, nil) - remote := &RemoteWallet{} remote.Id = "42" local := &LocalWallet{} local.Id = "G1" + method := "WalletUnconfirmedTransactionsVerbose" wallets := NewSkycoinWalletIterator([]core.Wallet{remote, local}) - for wallets.Next() { - txns, err := wallets.Value().GetCryptoAccount().ListPendingTransactions() + wlt := wallets.Value() + account := wlt.GetCryptoAccount() + global_mock.On(method, wlt.GetId()).Return(response, errors.New("failure")).Once() + _, err := account.ListPendingTransactions() + require.Error(t, err) + global_mock.On(method, wlt.GetId()).Return(response, nil).Once() + txns, err := account.ListPendingTransactions() require.NoError(t, err) for txns.Next() { iter := NewSkycoinTransactionOutputIterator(txns.Value().GetOutputs()) @@ -72,13 +78,26 @@ func TestWalletListPendingTransactions(t *testing.T) { } } +func TestSkycoinAddressListAssets(t *testing.T) { + addr, err := NewSkycoinAddress("2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt") + assert.NoError(t, err) + assets := addr.ListAssets() + require.Equal(t, 2, len(assets)) + require.True(t, assets[0] == Sky || assets[1] == Sky) + require.True(t, assets[0] == CoinHour || assets[1] == CoinHour) +} + func TestSkycoinAddressGetBalance(t *testing.T) { + CleanGlobalMock() response := new(api.BalanceResponse) addr, err := NewSkycoinAddress("2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt") - assert.NoError(t, err) + require.NoError(t, err) response.Confirmed = readable.Balance{Coins: uint64(42000000), Hours: uint64(200)} - global_mock.On("Balance", []string{addr.String()}).Return(response, nil) skyAddrs := addr.GetCryptoAccount() + global_mock.On("Balance", []string{addr.String()}).Return(response, errors.New("failure")).Once() + _, err = skyAddrs.GetBalance(Sky) + require.Error(t, err) + global_mock.On("Balance", []string{addr.String()}).Return(response, nil) val, err := skyAddrs.GetBalance(Sky) require.NoError(t, err) require.Equal(t, val, uint64(42000000)) @@ -91,28 +110,37 @@ func TestSkycoinAddressGetBalance(t *testing.T) { } func TestSkycoinAddressScanUnspentOutputs(t *testing.T) { + CleanGlobalMock() + addr := "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8" usOut := readable.UnspentOutput{ Hash: "hash1", Coins: "42", Hours: uint64(42), CalculatedHours: uint64(42), - Address: "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + Address: addr, } response := &readable.UnspentOutputsSummary{ HeadOutputs: readable.UnspentOutputs{usOut, usOut}, } - - global_mock.On("OutputsForAddresses", []string{"2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8"}).Return(response, nil) - - addrs, err := NewSkycoinAddress("2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8") + addrs, err := NewSkycoinAddress(addr) assert.NoError(t, err) skyAddrs := addrs.GetCryptoAccount() - it := skyAddrs.ScanUnspentOutputs() + + global_mock.On("OutputsForAddresses", []string{addr}).Return(response, errors.New("failure")).Once() + it, err := skyAddrs.ScanUnspentOutputs() + require.Error(t, err) + require.Nil(t, it) + + global_mock.On("OutputsForAddresses", []string{addr}).Return(response, nil) + it, err = skyAddrs.ScanUnspentOutputs() + require.NoError(t, err) for it.Next() { output := it.Value() require.Equal(t, output.GetId(), "hash1") - require.Equal(t, output.GetAddress().String(), "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8") + outputAddress, err := output.GetAddress() + require.Equal(t, nil, err) + require.Equal(t, outputAddress.String(), addr) val, err := output.GetCoins(Sky) require.NoError(t, err) require.Equal(t, val, uint64(42000000)) @@ -124,13 +152,24 @@ func TestSkycoinAddressScanUnspentOutputs(t *testing.T) { func TestSkycoinAddressListTransactions(t *testing.T) { CleanGlobalMock() + dir := "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8" response := readable.TransactionWithStatusVerbose{ Status: readable.TransactionStatus{ Confirmed: false, }, } response.Transaction.Hash = "hash1" - global_mock.On("TransactionsVerbose", []string{"2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8"}).Return( + global_mock.On("TransactionsVerbose", []string{dir}).Return( + []readable.TransactionWithStatusVerbose{}, + errors.New("failure"), + ).Once() + + addr, err := NewSkycoinAddress(dir) + assert.NoError(t, err) + skyAddr := addr.GetCryptoAccount() + it := skyAddr.ListTransactions() + require.Nil(t, it) + global_mock.On("TransactionsVerbose", []string{dir}).Return( []readable.TransactionWithStatusVerbose{ { Status: readable.TransactionStatus{ @@ -145,10 +184,7 @@ func TestSkycoinAddressListTransactions(t *testing.T) { &readable.TransactionWithStatus{Status: response.Status}, nil, ) - addr, err := NewSkycoinAddress("2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8") - assert.NoError(t, err) - skyAddr := addr.GetCryptoAccount() - it := skyAddr.ListTransactions() + it = skyAddr.ListTransactions() it.Next() thx := it.Value() require.Equal(t, thx.GetStatus(), core.TXN_STATUS_CONFIRMED) @@ -159,6 +195,8 @@ func TestSkycoinAddressListTransactions(t *testing.T) { func TestLocalWalletGetBalance(t *testing.T) { CleanGlobalMock() + + emptyOutput := readable.UnspentOutput{} usOut := readable.UnspentOutput{ Hash: "hash1", Coins: "42", @@ -167,41 +205,74 @@ func TestLocalWalletGetBalance(t *testing.T) { Address: "2HPiZkMTD2pB9FZ6HbCxFSXa1FGeNkLeEbP", } response := &readable.UnspentOutputsSummary{ - HeadOutputs: readable.UnspentOutputs{usOut, usOut}, + HeadOutputs: readable.UnspentOutputs{usOut, usOut, emptyOutput}, OutgoingOutputs: readable.UnspentOutputs{usOut, usOut}, IncomingOutputs: readable.UnspentOutputs{usOut, usOut}, } - global_mock.On( - "OutputsForAddresses", - []string{ - "2HPiZkMTD2pB9FZ6HbCxFSXa1FGeNkLeEbP", - "7wqRjpVwg5uSsz72oAZcDrBevHQRHQudyj", - "2G9wDPX14WsbZuZU1f7MveYc9vpLxj2qNsz", - "6gnBM5gMSSb7XRUEap7q3WxFnuvbN9usTq", - }, - ).Return(response, nil) - wlt := &LocalWallet{WalletDir: "./testdata", Id: "test.wlt"} + addrs := []string{ + "2HPiZkMTD2pB9FZ6HbCxFSXa1FGeNkLeEbP", + "7wqRjpVwg5uSsz72oAZcDrBevHQRHQudyj", + "2G9wDPX14WsbZuZU1f7MveYc9vpLxj2qNsz", + "6gnBM5gMSSb7XRUEap7q3WxFnuvbN9usTq", + } + method := "OutputsForAddresses" + global_mock.On(method, addrs).Return(response, errors.New("failure")).Once() + global_mock.On(method, addrs).Return(response, nil) + + // wallet not found + wlt := &LocalWallet{WalletDir: "./testdata", Id: "no_wallet.wlt"} + _, err := wlt.GetBalance(Sky) + require.Error(t, err) + + // api interaction error + wlt = &LocalWallet{WalletDir: "./testdata", Id: "test.wlt"} + _, err = wlt.GetBalance(Sky) + require.Error(t, err) + + // invalid HeadOutputs + wlt = &LocalWallet{WalletDir: "./testdata", Id: "test.wlt"} + _, err = wlt.GetBalance(Sky) + require.Error(t, err) + response.HeadOutputs = response.HeadOutputs[:len(response.HeadOutputs)-1] + + // all well val, err := wlt.GetBalance(Sky) require.NoError(t, err) require.Equal(t, uint64(84000000), val) val, err = wlt.GetBalance(CoinHour) require.NoError(t, err) require.Equal(t, uint64(84), val) - val, err = wlt.GetBalance("INVALID_TICKER") + + // invalid ticker + _, err = wlt.GetBalance("INVALID_TICKER") require.Error(t, err) - require.Equal(t, uint64(0), val) +} + +func TestWalletsListAssets(t *testing.T) { + wlts := []core.CryptoAccount{&RemoteWallet{}, &LocalWallet{}} + assets := []string{Sky, CoinHour} + sort.Strings(assets) + + for _, wlt := range wlts { + wllt_assets := wlt.ListAssets() + sort.Strings(wllt_assets) + require.Equal(t, assets, wllt_assets) + } } func TestRemoteWalletGetBalance(t *testing.T) { CleanGlobalMock() response := new(api.BalanceResponse) response.Confirmed = readable.Balance{Coins: uint64(42000000), Hours: uint64(200)} - global_mock.On("WalletBalance", "wallet").Return(response, nil) wlt := &RemoteWallet{ Id: "wallet", poolSection: PoolSection, } + global_mock.On("WalletBalance", "wallet").Return(response, errors.New("failure")).Once() + _, err := wlt.GetBalance(Sky) + require.Error(t, err) + global_mock.On("WalletBalance", "wallet").Return(response, nil) val, err := wlt.GetBalance(Sky) require.NoError(t, err) require.Equal(t, val, uint64(42000000)) @@ -215,6 +286,19 @@ func TestRemoteWalletGetBalance(t *testing.T) { func TestRemoteWalletScanUnspentOutputs(t *testing.T) { CleanGlobalMock() + + wlt := &RemoteWallet{ + Id: "wallet", + poolSection: PoolSection, + } + global_mock.On("Wallet", "wallet").Return( + new(api.WalletResponse), + errors.New("failure"), + ).Once() + iter, err := wlt.ScanUnspentOutputs() + require.Error(t, err) + require.Nil(t, iter) + global_mock.On("Wallet", "wallet").Return( &api.WalletResponse{ Meta: readable.WalletMeta{ @@ -237,6 +321,9 @@ func TestRemoteWalletScanUnspentOutputs(t *testing.T) { Label: "wallet_no_outputs", Encrypted: true, }, + Entries: []readable.WalletEntry{ + {Address: "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8"}, + }, }, nil) @@ -254,18 +341,17 @@ func TestRemoteWalletScanUnspentOutputs(t *testing.T) { // addrs global_mock.On("OutputsForAddresses", []string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt"}).Return(response, nil) // no_output - global_mock.On("OutputsForAddresses", []string{"2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8"}).Return(&readable.UnspentOutputsSummary{}, nil) + global_mock.On("OutputsForAddresses", []string{"2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8"}).Return(nil, errors.New("error")) - wlt := &RemoteWallet{ - Id: "wallet", - poolSection: PoolSection, - } - iter := wlt.ScanUnspentOutputs() + iter, err = wlt.ScanUnspentOutputs() + require.NoError(t, err) items := 0 for iter.Next() { to := iter.Value() items++ - require.Equal(t, "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", to.GetAddress().String()) + outputsAddress, err := to.GetAddress() + require.Equal(t, nil, err) + require.Equal(t, "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", outputsAddress.String()) } require.Equal(t, 1, items) @@ -274,14 +360,9 @@ func TestRemoteWalletScanUnspentOutputs(t *testing.T) { Id: "wallet_no_outputs", poolSection: PoolSection, } - iter = wlt.ScanUnspentOutputs() - items = 0 - for iter.Next() { - to := iter.Value() - items++ - require.Nil(t, to) - } - require.Equal(t, 0, items) + iter, err = wlt.ScanUnspentOutputs() + require.Error(t, err) + require.Nil(t, iter) } func TestRemoteWalletListTransactions(t *testing.T) { @@ -293,14 +374,22 @@ func TestRemoteWalletListTransactions(t *testing.T) { }, } response.Transaction.Hash = "hash1" + dir := "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8" - global_mock.On("TransactionsVerbose", []string{"2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8"}).Return( + wlt := &RemoteWallet{ + Id: "wallet", + poolSection: PoolSection, + } + global_mock.On("Wallet", "wallet").Return(new(api.WalletResponse), errors.New("failure")).Once() + iter := wlt.ListTransactions() + require.Nil(t, iter) + + global_mock.On("TransactionsVerbose", []string{dir}).Return( []readable.TransactionWithStatusVerbose{ response, }, nil, ) - global_mock.On("Wallet", "wallet").Return( &api.WalletResponse{ Meta: readable.WalletMeta{ @@ -310,16 +399,12 @@ func TestRemoteWalletListTransactions(t *testing.T) { Encrypted: true, }, Entries: []readable.WalletEntry{ - {Address: "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8"}, + {Address: dir}, }, }, nil) - wlt := &RemoteWallet{ - Id: "wallet", - poolSection: PoolSection, - } - iter := wlt.ListTransactions() + iter = wlt.ListTransactions() items := 0 for iter.Next() { tx := iter.Value() @@ -332,12 +417,12 @@ func TestRemoteWalletListTransactions(t *testing.T) { func TestLocalWalletScanUnspentOutputs(t *testing.T) { CleanGlobalMock() - global_mock.On("Wallet", "test.wlt").Return( + global_mock.On("Wallet", "test1.wlt").Return( &api.WalletResponse{ Meta: readable.WalletMeta{ Coin: "Sky", Filename: "FiberCrypto", - Label: "test.wlt", + Label: "test1.wlt", Encrypted: true, }, Entries: []readable.WalletEntry{ @@ -353,16 +438,46 @@ func TestLocalWalletScanUnspentOutputs(t *testing.T) { "6gnBM5gMSSb7XRUEap7q3WxFnuvbN9usTq", } - mockSkyApiOutputsForAddresses(global_mock, addresses) - wlt := &LocalWallet{WalletDir: "./testdata", Id: "test.wlt"} + mockSkyApiOutputsForAddresses(global_mock, addresses, true) + iter, err := wlt.ScanUnspentOutputs() + require.Error(t, err) + require.Nil(t, iter) + + CleanGlobalMock() + + global_mock.On("Wallet", "test1.wlt").Return( + &api.WalletResponse{ + Meta: readable.WalletMeta{ + Coin: "Sky", + Filename: "FiberCrypto", + Label: "test1.wlt", + Encrypted: true, + }, + Entries: []readable.WalletEntry{ + {Address: "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8"}, + }, + }, + nil) + + mockSkyApiOutputsForAddresses(global_mock, addresses, false) + + wlt = &LocalWallet{WalletDir: "./testdata", Id: "no_wallet.wlt"} + iter, err = wlt.ScanUnspentOutputs() + require.Error(t, err) + require.Nil(t, iter) + + wlt = &LocalWallet{WalletDir: "./testdata", Id: "test.wlt"} + iter, err = wlt.ScanUnspentOutputs() + require.NoError(t, err) - iter := wlt.ScanUnspentOutputs() items := 0 for iter.Next() { to := iter.Value() items++ - require.Equal(t, "2HPiZkMTD2pB9FZ6HbCxFSXa1FGeNkLeEbP", to.GetAddress().String()) + outputsAddress, err := to.GetAddress() + require.Equal(t, nil, err) + require.Equal(t, "2HPiZkMTD2pB9FZ6HbCxFSXa1FGeNkLeEbP", outputsAddress.String()) } require.Equal(t, 8, items) } @@ -393,9 +508,12 @@ func TestLocalWalletListTransactions(t *testing.T) { mockSkyApiTransactionsVerbose(global_mock, addresses) - wlt := &LocalWallet{WalletDir: "./testdata", Id: "test.wlt"} - + wlt := &LocalWallet{WalletDir: "./testdata", Id: "no_wallet.wlt"} iter := wlt.ListTransactions() + require.Nil(t, iter) + + wlt = &LocalWallet{WalletDir: "./testdata", Id: "test.wlt"} + iter = wlt.ListTransactions() items := 0 for iter.Next() { tx := iter.Value() @@ -404,3 +522,67 @@ func TestLocalWalletListTransactions(t *testing.T) { } require.Equal(t, 4, items) } + +func Test_getBalanceOfAddresses(t *testing.T) { + addrs := []string{"addr1"} + emptyOutput := readable.UnspentOutput{} + outBadCoin := readable.UnspentOutput{ + Coins: "42a", + Address: "addr1", + } + outValid := readable.UnspentOutput{Address: "addr1", Coins: "0"} + tests := []struct { + name string + summary *readable.UnspentOutputsSummary + wantError bool + }{ + { + name: "invalid_HeadOutput", + summary: &readable.UnspentOutputsSummary{ + HeadOutputs: readable.UnspentOutputs{emptyOutput}, + }, + wantError: true, + }, + { + name: "invalid_coin_in_HeadOutput", + summary: &readable.UnspentOutputsSummary{ + HeadOutputs: readable.UnspentOutputs{outBadCoin}, + }, + wantError: true, + }, + { + name: "invalid_IncomingOutput", + summary: &readable.UnspentOutputsSummary{ + IncomingOutputs: readable.UnspentOutputs{emptyOutput}, + }, + wantError: true, + }, + { + name: "invalid_coin_in_IncomingOutput", + summary: &readable.UnspentOutputsSummary{ + IncomingOutputs: readable.UnspentOutputs{outBadCoin}, + }, + wantError: true, + }, + { + name: "valid", + summary: &readable.UnspentOutputsSummary{ + HeadOutputs: readable.UnspentOutputs{outValid}, + IncomingOutputs: readable.UnspentOutputs{outValid}, + }, + wantError: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + bl, err := getBalanceOfAddresses(tt.summary, addrs) + if tt.wantError { + require.Error(t, err) + } else { + require.NoError(t, err) + require.NotNil(t, bl) + } + }) + } +} diff --git a/src/coin/skycoin/models/api.go b/src/coin/skycoin/models/api.go index 830e7e77..53c177d2 100644 --- a/src/coin/skycoin/models/api.go +++ b/src/coin/skycoin/models/api.go @@ -1,125 +1,13 @@ package skycoin -import ( - // "testing" +import "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/skymocks" - "github.com/SkycoinProject/skycoin/src/api" - "github.com/SkycoinProject/skycoin/src/coin" - "github.com/SkycoinProject/skycoin/src/readable" - "github.com/stretchr/testify/mock" -) +// "testing" type SkycoinApiMock struct { - mock.Mock + skymocks.SkycoinAPI } func (m *SkycoinApiMock) Create() (interface{}, error) { return m, nil } - -func (m *SkycoinApiMock) Transaction(txid string) (*readable.TransactionWithStatus, error) { - args := m.Called(txid) - return args.Get(0).(*readable.TransactionWithStatus), args.Error(1) -} -func (m *SkycoinApiMock) Transactions(addrs []string) ([]readable.TransactionWithStatus, error) { - args := m.Called(addrs) - return args.Get(0).([]readable.TransactionWithStatus), args.Error(1) -} -func (m *SkycoinApiMock) TransactionVerbose(txid string) (*readable.TransactionWithStatusVerbose, error) { - args := m.Called(txid) - return args.Get(0).(*readable.TransactionWithStatusVerbose), args.Error(1) -} -func (m *SkycoinApiMock) TransactionsVerbose(addrs []string) ([]readable.TransactionWithStatusVerbose, error) { - args := m.Called(addrs) - return args.Get(0).([]readable.TransactionWithStatusVerbose), args.Error(1) -} -func (m *SkycoinApiMock) UxOut(uxID string) (*readable.SpentOutput, error) { - args := m.Called(uxID) - return args.Get(0).(*readable.SpentOutput), args.Error(1) -} -func (m *SkycoinApiMock) PendingTransactionsVerbose() ([]readable.UnconfirmedTransactionVerbose, error) { - args := m.Called() - return args.Get(0).([]readable.UnconfirmedTransactionVerbose), args.Error(1) -} -func (m *SkycoinApiMock) CoinSupply() (*api.CoinSupply, error) { - args := m.Called() - return args.Get(0).(*api.CoinSupply), args.Error(1) -} -func (m *SkycoinApiMock) LastBlocks(n uint64) (*readable.Blocks, error) { - args := m.Called(n) - return args.Get(0).(*readable.Blocks), args.Error(1) -} -func (m *SkycoinApiMock) BlockchainProgress() (*readable.BlockchainProgress, error) { - args := m.Called() - return args.Get(0).(*readable.BlockchainProgress), args.Error(1) -} -func (m *SkycoinApiMock) Balance(addrs []string) (*api.BalanceResponse, error) { - args := m.Called(addrs) - return args.Get(0).(*api.BalanceResponse), args.Error(1) -} -func (m *SkycoinApiMock) OutputsForAddresses(addrs []string) (*readable.UnspentOutputsSummary, error) { - args := m.Called(addrs) - return args.Get(0).(*readable.UnspentOutputsSummary), args.Error(1) -} -func (m *SkycoinApiMock) Wallet(id string) (*api.WalletResponse, error) { - args := m.Called(id) - return args.Get(0).(*api.WalletResponse), args.Error(1) -} -func (m *SkycoinApiMock) UpdateWallet(id, label string) error { - args := m.Called(id, label) - return args.Error(0) -} -func (m *SkycoinApiMock) NewWalletAddress(id string, n int, password string) ([]string, error) { - args := m.Called(id, n, password) - return args.Get(0).([]string), args.Error(1) -} -func (m *SkycoinApiMock) Wallets() ([]api.WalletResponse, error) { - args := m.Called() - return args.Get(0).([]api.WalletResponse), args.Error(1) - -} -func (m *SkycoinApiMock) CreateWallet(o api.CreateWalletOptions) (*api.WalletResponse, error) { - args := m.Called(o) - return args.Get(0).(*api.WalletResponse), args.Error(1) -} -func (m *SkycoinApiMock) EncryptWallet(id, password string) (*api.WalletResponse, error) { - args := m.Called(id, password) - return args.Get(0).(*api.WalletResponse), args.Error(1) -} -func (m *SkycoinApiMock) DecryptWallet(id, password string) (*api.WalletResponse, error) { - args := m.Called(id, password) - return args.Get(0).(*api.WalletResponse), args.Error(1) -} -func (m *SkycoinApiMock) WalletBalance(id string) (*api.BalanceResponse, error) { - args := m.Called(id) - return args.Get(0).(*api.BalanceResponse), args.Error(1) -} -func (m *SkycoinApiMock) WalletUnconfirmedTransactionsVerbose(id string) (*api.UnconfirmedTxnsVerboseResponse, error) { - args := m.Called(id) - return args.Get(0).(*api.UnconfirmedTxnsVerboseResponse), args.Error(1) -} -func (m *SkycoinApiMock) NetworkConnections(filters *api.NetworkConnectionsFilter) (*api.Connections, error) { - args := m.Called(filters) - return args.Get(0).(*api.Connections), args.Error(1) -} -func (m *SkycoinApiMock) InjectTransaction(txn *coin.Transaction) (string, error) { - args := m.Called(txn) - return args.Get(0).(string), args.Error(1) -} -func (m *SkycoinApiMock) WalletSignTransaction(req api.WalletSignTransactionRequest) (*api.CreateTransactionResponse, error) { - args := m.Called(req) - return args.Get(0).(*api.CreateTransactionResponse), args.Error(1) -} -func (m *SkycoinApiMock) WalletCreateTransaction(req api.WalletCreateTransactionRequest) (*api.CreateTransactionResponse, error) { - args := m.Called(req) - return args.Get(0).(*api.CreateTransactionResponse), args.Error(1) -} -func (m *SkycoinApiMock) CreateTransaction(req api.CreateTransactionRequest) (*api.CreateTransactionResponse, error) { - args := m.Called(req) - return args.Get(0).(*api.CreateTransactionResponse), args.Error(1) -} - -func (m *SkycoinApiMock) InjectEncodedTransaction(rawTxn string) (string, error) { - args := m.Called(rawTxn) - return args.Get(0).(string), args.Error(1) -} diff --git a/src/coin/skycoin/models/blockchain.go b/src/coin/skycoin/models/blockchain.go index ead24274..5f9d77d2 100644 --- a/src/coin/skycoin/models/blockchain.go +++ b/src/coin/skycoin/models/blockchain.go @@ -140,9 +140,7 @@ func (ss *SkycoinBlockchain) GetLastBlock() (core.Block, error) { func (ss *SkycoinBlockchain) GetNumberOfBlocks() (uint64, error) { logBlockchain.Info("Getting number of blocks") if ss.cachedStatus == nil { - if ss.cachedStatus == nil { - ss.cachedStatus = new(SkycoinBlockchainInfo) - } + ss.cachedStatus = new(SkycoinBlockchainInfo) if err := ss.requestStatusInfo(); err != nil { logBlockchain.Errorf("Skycoin node API error for status info %s", err) return 0, err diff --git a/src/coin/skycoin/models/blockchain_test.go b/src/coin/skycoin/models/blockchain_test.go index edc31bf9..60c9fb3d 100644 --- a/src/coin/skycoin/models/blockchain_test.go +++ b/src/coin/skycoin/models/blockchain_test.go @@ -1,6 +1,7 @@ package skycoin import ( + "errors" "testing" "github.com/stretchr/testify/require" @@ -10,6 +11,63 @@ import ( "github.com/fibercrypto/fibercryptowallet/src/core" ) +func TestSkycoinBlockStructure(t *testing.T) { + rBlock := &readable.Block{} + skyBlock := &SkycoinBlock{} + + _, err := skyBlock.GetHash() + require.Error(t, err) + _, err = skyBlock.GetPrevHash() + require.Error(t, err) + _, err = skyBlock.GetVersion() + require.Error(t, err) + _, err = skyBlock.GetTime() + require.Error(t, err) + _, err = skyBlock.GetHeight() + require.Error(t, err) + _, err = skyBlock.GetFee("coin") + require.Error(t, err) + _, err = skyBlock.IsGenesisBlock() + require.Error(t, err) + + skyfee := uint64(0) + version := uint32(42) + time, chfee := uint64(100), uint64(10000) + hash, prev := "block_hash", "block_prev_hash" + rBlock.Head.Time = time + rBlock.Head.Fee = chfee + rBlock.Head.Hash = hash + rBlock.Head.Version = version + rBlock.Head.PreviousHash = prev + + skyBlock.Block = rBlock + bhash, err1 := skyBlock.GetHash() + require.NoError(t, err1) + require.Equal(t, []byte(hash), bhash) + bprev, err2 := skyBlock.GetPrevHash() + require.NoError(t, err2) + require.Equal(t, []byte(prev), bprev) + bversion, err3 := skyBlock.GetVersion() + require.NoError(t, err3) + require.Equal(t, version, bversion) + btime, err4 := skyBlock.GetTime() + require.NoError(t, err4) + require.Equal(t, core.Timestamp(time), btime) + bheigth, err5 := skyBlock.GetHeight() + require.NoError(t, err5) + //TODO: When the behavior of the GetHeight function is decided, the test must be modified accordingly + require.Equal(t, uint64(0), bheigth) + bfee, err6 := skyBlock.GetFee(CoinHour) + require.NoError(t, err6) + require.Equal(t, chfee, bfee) + bfee, err6 = skyBlock.GetFee(Sky) + require.NoError(t, err6) + require.Equal(t, skyfee, bfee) + genesis, err7 := skyBlock.IsGenesisBlock() + require.NoError(t, err7) + require.True(t, genesis) +} + func TestSkycoinBlockchainStatusGetCoinValue(t *testing.T) { global_mock.On("CoinSupply").Return( &api.CoinSupply{ @@ -20,9 +78,19 @@ func TestSkycoinBlockchainStatusGetCoinValue(t *testing.T) { }, nil, ) + global_mock.On("BlockchainProgress").Return(&readable.BlockchainProgress{}, errors.New("failure")).Once() global_mock.On("BlockchainProgress").Return(&readable.BlockchainProgress{}, nil) block := &SkycoinBlockchain{CacheTime: 20} + + // api interaction error + _, err := block.GetCoinValue(core.CoinCurrentSupply, Sky) + require.Error(t, err) + + // invalid coin + _, err = block.GetCoinValue(core.CoinCurrentSupply, "INVALIDCOIN") + require.Error(t, err) + val, err := block.GetCoinValue(core.CoinCurrentSupply, Sky) require.NoError(t, err) require.Equal(t, val, uint64(200111111)) @@ -47,6 +115,7 @@ func TestSkycoinBlockchainStatusGetNumberOfBlocks(t *testing.T) { }, nil, ) + global_mock.On("BlockchainProgress").Return(&readable.BlockchainProgress{}, errors.New("failure")).Once() global_mock.On("BlockchainProgress").Return( &readable.BlockchainProgress{ Current: uint64(20), @@ -56,7 +125,12 @@ func TestSkycoinBlockchainStatusGetNumberOfBlocks(t *testing.T) { nil, ) - block := &SkycoinBlockchain{CacheTime: 20} + // api interaction error + block := new(SkycoinBlockchain) + _, err := block.GetNumberOfBlocks() + require.Error(t, err) + + block = &SkycoinBlockchain{CacheTime: 20} val, err := block.GetNumberOfBlocks() require.NoError(t, err) require.Equal(t, val, uint64(20)) @@ -74,12 +148,25 @@ func TestSkycoinBlockchainStatusGetLastBlock(t *testing.T) { }, nil, ) + global_mock.On("BlockchainProgress").Return(&readable.BlockchainProgress{}, errors.New("failure")).Once() global_mock.On("BlockchainProgress").Return(&readable.BlockchainProgress{}, nil) status := &SkycoinBlockchain{CacheTime: 20} + + // api interaction error + _, err := status.GetLastBlock() + require.Error(t, err) + block, err := status.GetLastBlock() require.NoError(t, err) val, err2 := block.GetVersion() require.NoError(t, err2) require.Equal(t, val, uint32(3)) } + +func TestSkycoinBlockchainSetCacheTime(t *testing.T) { + bchn := &SkycoinBlockchain{} + time := uint64(345) + bchn.SetCacheTime(time) + require.Equal(t, time, bchn.CacheTime) +} diff --git a/src/coin/skycoin/models/cipher_test.go b/src/coin/skycoin/models/cipher_test.go index 83e3d21c..6a22c4c2 100644 --- a/src/coin/skycoin/models/cipher_test.go +++ b/src/coin/skycoin/models/cipher_test.go @@ -5,6 +5,7 @@ import ( "errors" "github.com/SkycoinProject/skycoin/src/cipher" "github.com/SkycoinProject/skycoin/src/cipher/base58" + "github.com/fibercrypto/fibercryptowallet/src/coin/mocks" "github.com/fibercrypto/fibercryptowallet/src/core" "github.com/fibercrypto/fibercryptowallet/src/util" "github.com/stretchr/testify/assert" @@ -197,6 +198,11 @@ func TestSkycoinAddress_Verify(t *testing.T) { require.NoError(t, addrs.Verify(pk)) }) } + + mockPub := new(mocks.PubKey) + mockPub.On("Bytes").Return([]byte("")) + skyAddr := new(SkycoinAddress) + require.Error(t, skyAddr.Verify(mockPub)) } func Test_skyPubKeyFromBytes(t *testing.T) { @@ -315,3 +321,73 @@ func TestAddressFromString(t *testing.T) { }) } } + +func TestToSkycoinCipherAddress(t *testing.T) { + dir := "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ" + key := cipher.Ripemd160{0x3b, 0xe2, 0x53, 0x7f, 0x8c, 0x8, 0x93, 0xfd, 0xdc, 0xdd, 0xc8, 0x78, 0x51, 0x8f, 0x38, 0xea, 0x49, 0x3d, 0x94, 0x9e} + addr, err := NewSkycoinAddress(dir) + require.NoError(t, err) + skyAddr, err1 := addr.ToSkycoinCipherAddress() + require.NoError(t, err1) + require.Equal(t, key, skyAddr.Key) +} + +func Test_toSkycoinPubKey(t *testing.T) { + pub := new(SkycoinPubKey) + pub.pubkey[4], pub.pubkey[2] = 1, 1 + + mockPub := new(mocks.PubKey) + mockPub.On("Bytes").Return([]byte("")) + tests := []struct { + name string + pub core.PubKey + wantError bool + }{ + {name: "FromSkycoinPubKey", pub: pub, wantError: false}, + {name: "FromMock", pub: mockPub, wantError: true}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + key, err := toSkycoinPubKey(tt.pub) + if tt.wantError { + require.Error(t, err) + } else { + require.NoError(t, err) + for i, b := range tt.pub.Bytes() { + require.Equal(t, b, key[i]) + } + } + }) + } +} + +func Test_toSkycoinSecKey(t *testing.T) { + sec := new(SkycoinSecKey) + sec.seckey[4], sec.seckey[2] = 1, 1 + + mockSec := new(mocks.SecKey) + mockSec.On("Bytes").Return([]byte("")) + tests := []struct { + name string + sec core.SecKey + wantError bool + }{ + {name: "FromSkycoinSecKey", sec: sec, wantError: false}, + {name: "FromMock", sec: mockSec, wantError: true}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + key, err := toSkycoinSecKey(tt.sec) + if tt.wantError { + require.Error(t, err) + } else { + require.NoError(t, err) + for i, b := range tt.sec.Bytes() { + require.Equal(t, b, key[i]) + } + } + }) + } +} diff --git a/src/coin/skycoin/models/coin.go b/src/coin/skycoin/models/coin.go index 5394b125..4fa2905a 100644 --- a/src/coin/skycoin/models/coin.go +++ b/src/coin/skycoin/models/coin.go @@ -25,12 +25,12 @@ var logCoin = logging.MustGetLogger("Skycoin coin") Implements Transaction interface */ type SkycoinPendingTransaction struct { - Transaction readable.UnconfirmedTransactionVerbose + Transaction *readable.UnconfirmedTransactionVerbose } func (txn *SkycoinPendingTransaction) SupportedAssets() []string { logCoin.Info("Getting supported assets") - return []string{Sky, CoinHour, CalculatedHour} + return []string{Sky, CoinHour} } func (txn *SkycoinPendingTransaction) GetTimestamp() core.Timestamp { @@ -70,10 +70,12 @@ func (txn *SkycoinPendingTransaction) ComputeFee(ticker string) (uint64, error) logCoin.Info("Computing fee for " + ticker + " ticket") if ticker == CoinHour { return txn.Transaction.Transaction.Fee, nil - } else if util.StringInList(ticker, txn.SupportedAssets()) { + } else if ticker == Sky { return uint64(0), nil + } else if ticker == CalculatedHour { + return uint64(0), errors.ErrNotImplemented } - logCoin.Errorf("Invalid ticker %v\n", ticker) + logCoin.Warningf("Invalid ticker %v\n", ticker) return uint64(0), errors.ErrInvalidAltcoinTicker } @@ -172,7 +174,7 @@ func (txn *SkycoinPendingTransaction) EncodeSkycoinTransaction() ([]byte, error) func verifyReadableTransaction(rTxn skytypes.ReadableTxn, checkSigned bool) error { var createdTxn *api.CreatedTransaction - if cTxn, err := rTxn.ToCreatedTransaction(); err != nil { + if cTxn, err := rTxn.ToCreatedTransaction(); err == nil { createdTxn = cTxn } else { return err @@ -311,7 +313,7 @@ func (skyTxn *SkycoinUninjectedTransaction) GetStatus() core.TransactionStatus { func (skyTxn *SkycoinUninjectedTransaction) GetInputs() []core.TransactionInput { logCoin.Info("Getting inputs from un injected transactions") - if skyTxn.inputs == nil { + if len(skyTxn.inputs) == 0 { inputs, err := getSkycoinTransactionInputsFromInputsHashes(skyTxn.txn.In) if err != nil { // TODO: This method should also returns error @@ -345,8 +347,13 @@ func (skyTxn *SkycoinUninjectedTransaction) ComputeFee(ticker string) (uint64, e logCoin.Info("Computing fee for un injected transaction with" + ticker + " ticker") if ticker == CoinHour { return skyTxn.fee, nil + } else if ticker == Sky { + return uint64(0), nil + } else if ticker == CalculatedHour { + return uint64(0), errors.ErrNotImplemented } - return 0, nil + logCoin.Warningf("Invalid ticker %v\n", ticker) + return uint64(0), errors.ErrInvalidAltcoinTicker } func (skyTxn *SkycoinUninjectedTransaction) GetId() string { @@ -386,7 +393,7 @@ type SkycoinTransaction struct { func (txn *SkycoinTransaction) SupportedAssets() []string { logCoin.Info("Getting supported assets from transactions") - return []string{Sky, CoinHour, CalculatedHour} + return []string{Sky, CoinHour} } func (txn *SkycoinTransaction) GetTimestamp() core.Timestamp { @@ -421,7 +428,7 @@ func (txn *SkycoinTransaction) GetStatus() core.TransactionStatus { func (txn *SkycoinTransaction) GetInputs() []core.TransactionInput { logCoin.Info("Getting inputs from transaction") - if txn.inputs == nil { + if len(txn.inputs) == 0 { ins, err := getSkycoinTransactionInputsFromTxnHash(txn.skyTxn.Hash) if err != nil { return nil @@ -447,7 +454,7 @@ func (txn *SkycoinTransaction) GetOutputs() []core.TransactionOutput { } func (txn *SkycoinTransaction) GetId() string { - logCoin.Info("Getting if from transaction") + logCoin.Info("Getting id from transaction") return txn.skyTxn.Hash } @@ -455,10 +462,12 @@ func (txn *SkycoinTransaction) ComputeFee(ticker string) (uint64, error) { logCoin.Info("Compute fee for transaction with " + ticker + "ticker") if ticker == CoinHour { return txn.skyTxn.Fee, nil - } else if util.StringInList(ticker, txn.SupportedAssets()) { + } else if ticker == Sky { return uint64(0), nil + } else if ticker == CalculatedHour { + return uint64(0), errors.ErrNotImplemented } - logCoin.Errorf("Invalid ticker %v\n", ticker) + logCoin.Warningf("Invalid ticker %v\n", ticker) return uint64(0), errors.ErrInvalidAltcoinTicker } @@ -572,29 +581,28 @@ func (in *SkycoinTransactionInput) GetId() string { return in.skyIn.Hash } -func (in *SkycoinTransactionInput) GetSpentOutput() core.TransactionOutput { +func (in *SkycoinTransactionInput) GetSpentOutput() (core.TransactionOutput, error) { logCoin.Info("Getting spent outputs for transaction inputs") - if in.spentOutput == nil { c, err := NewSkycoinApiClient(PoolSection) if err != nil { - return nil + return nil, err } defer ReturnSkycoinClient(c) out, err := c.UxOut(in.skyIn.Hash) if err != nil { - return nil + return nil, err } skyAccuracy, err := util.AltcoinQuotient(Sky) if err != nil { - return nil + return nil, err } - + coins := util.FormatCoins(out.Coins, skyAccuracy) skyOut := &SkycoinTransactionOutput{ skyOut: readable.TransactionOutput{ Address: out.OwnerAddress, - Coins: strconv.FormatFloat(float64(out.Coins)/float64(skyAccuracy), 'f', -1, 64), + Coins: coins, Hours: out.Hours, Hash: out.Uxid, }, @@ -602,8 +610,7 @@ func (in *SkycoinTransactionInput) GetSpentOutput() core.TransactionOutput { in.spentOutput = skyOut } - return in.spentOutput - + return in.spentOutput, nil } // SupportedAssets enumerates tickers of crypto assets supported by this output @@ -630,7 +637,6 @@ func (in *SkycoinTransactionInput) GetCoins(ticker string) (uint64, error) { } else if ticker == CalculatedHour { return in.skyIn.CalculatedHours * accuracy, nil } - // TODO: The program never reach here because util.AltcoinQuotient(ticker) throws an error when a invalid ticker is supplied logCoin.Errorf("Invalid ticker %v\n", ticker) return uint64(0), errors.ErrInvalidAltcoinTicker } @@ -678,14 +684,14 @@ func (out *SkycoinTransactionOutput) GetId() string { } -func (out *SkycoinTransactionOutput) GetAddress() core.Address { +func (out *SkycoinTransactionOutput) GetAddress() (core.Address, error) { logCoin.Info("Getting address for transaction output") skyAddrs, err := NewSkycoinAddress(out.skyOut.Address) if err != nil { logCoin.Error(err) - return nil + return nil, err } - return &skyAddrs + return &skyAddrs, nil } // SupportedAssets enumerates tickers of crypto assets supported by this output @@ -695,7 +701,7 @@ func (in *SkycoinTransactionOutput) SupportedAssets() []string { // GetCoins return input balance in one of supported coins , or error func (out *SkycoinTransactionOutput) GetCoins(ticker string) (uint64, error) { - logCoin.Info("Getting coins for transaction outputs using " + ticker + "ticker") + logCoin.Info("Getting coins for transaction outputs using " + ticker + " ticker") accuracy, err2 := util.AltcoinQuotient(ticker) if err2 != nil { return uint64(0), err2 @@ -711,7 +717,6 @@ func (out *SkycoinTransactionOutput) GetCoins(ticker string) (uint64, error) { } else if ticker == CalculatedHour { return out.calculatedHours * accuracy, nil } - // TODO: The program never reach here because util.AltcoinQuotient(ticker) throws an error when a invalid ticker is supplied logCoin.Errorf("Invalid ticker %v\n", ticker) return uint64(0), errors.ErrInvalidAltcoinTicker } @@ -761,12 +766,12 @@ func (in *SkycoinCreatedTransactionInput) GetId() string { return in.skyIn.UxID } -func (in *SkycoinCreatedTransactionInput) GetSpentOutput() core.TransactionOutput { +func (in *SkycoinCreatedTransactionInput) GetSpentOutput() (core.TransactionOutput, error) { if in.spentOutput == nil { - calculatedHours, err := in.GetCoins(in.skyIn.CalculatedHours) + calculatedHours, err := in.GetCoins(CalculatedHour) if err != nil { - calculatedHours = 0 + return nil, err } skyOut := &SkycoinCreatedTransactionOutput{ skyOut: api.CreatedTransactionOutput{ @@ -780,7 +785,7 @@ func (in *SkycoinCreatedTransactionInput) GetSpentOutput() core.TransactionOutpu in.spentOutput = skyOut } - return in.spentOutput + return in.spentOutput, nil } @@ -841,13 +846,13 @@ func (out *SkycoinCreatedTransactionOutput) GetId() string { return out.skyOut.UxID } -func (out *SkycoinCreatedTransactionOutput) GetAddress() core.Address { +func (out *SkycoinCreatedTransactionOutput) GetAddress() (core.Address, error) { skyAddrs, err := NewSkycoinAddress(out.skyOut.Address) if err != nil { logCoin.Error(err) - return nil + return nil, err } - return &skyAddrs + return &skyAddrs, nil } // SupportedAssets enumerates tickers of crypto assets supported by this output @@ -924,7 +929,7 @@ type SkycoinCreatedTransaction struct { // SupportedAssets are SKY, SKYCH, and accumulated SKYCH func (txn *SkycoinCreatedTransaction) SupportedAssets() []string { - return []string{Sky, CoinHour, CalculatedHour} + return []string{Sky, CoinHour} } // GetTimestamp will return zero @@ -938,7 +943,7 @@ func (txn *SkycoinCreatedTransaction) GetStatus() core.TransactionStatus { // GetInputs return inputs spent by this transaction func (txn *SkycoinCreatedTransaction) GetInputs() []core.TransactionInput { - if txn.inputs == nil { + if len(txn.inputs) == 0 { txn.inputs = newCreatedTransactionInputs(txn.skyTxn.In) } return txn.inputs @@ -963,10 +968,12 @@ func (txn *SkycoinCreatedTransaction) ComputeFee(ticker string) (uint64, error) return uint64(0), err } return uint64(fee), nil - } else if util.StringInList(ticker, txn.SupportedAssets()) { + } else if ticker == Sky { return uint64(0), nil + } else if ticker == CalculatedHour { + return uint64(0), errors.ErrNotImplemented } - logCoin.Errorf("Invalid ticker %v\n", ticker) + logCoin.Warningf("Invalid ticker %v\n", ticker) return uint64(0), errors.ErrInvalidAltcoinTicker } diff --git a/src/coin/skycoin/models/coin_test.go b/src/coin/skycoin/models/coin_test.go index 463463b1..e08c2c9c 100644 --- a/src/coin/skycoin/models/coin_test.go +++ b/src/coin/skycoin/models/coin_test.go @@ -2,17 +2,29 @@ package skycoin import ( "encoding/hex" + goerrors "errors" + "fmt" + "strconv" "testing" + "time" + "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" "github.com/SkycoinProject/skycoin/src/api" "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" "github.com/SkycoinProject/skycoin/src/readable" + "github.com/fibercrypto/fibercryptowallet/src/coin/mocks" + "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/skymocks" + "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/skytypes" "github.com/fibercrypto/fibercryptowallet/src/core" + "github.com/fibercrypto/fibercryptowallet/src/errors" + "github.com/fibercrypto/fibercryptowallet/src/util" + "github.com/fibercrypto/fibercryptowallet/src/util/requirethat" ) -func TestSkycoinTransactionGetStatus(t *testing.T) { +func TestTransactionGetStatus(t *testing.T) { global_mock.On("Transaction", "hash1").Return( &readable.TransactionWithStatus{ Status: readable.TransactionStatus{ @@ -20,7 +32,7 @@ func TestSkycoinTransactionGetStatus(t *testing.T) { }, }, nil, - ) + ).Once() global_mock.On("Transaction", "hash2").Return( &readable.TransactionWithStatus{ Status: readable.TransactionStatus{ @@ -28,56 +40,183 @@ func TestSkycoinTransactionGetStatus(t *testing.T) { }, }, nil, - ) + ).Once() + global_mock.On("Transaction", "hash3").Return(nil, goerrors.New("failure")).Once() - thx1 := &SkycoinTransaction{skyTxn: readable.TransactionVerbose{}} - thx1.skyTxn.Hash = "hash1" - thx2 := &SkycoinTransaction{skyTxn: readable.TransactionVerbose{}} - thx2.skyTxn.Hash = "hash2" + tests := []struct { + name string + txn core.Transaction + want core.TransactionStatus + }{ + { + name: "SkycoinCreatedTransaction-Created", + txn: new(SkycoinCreatedTransaction), + want: core.TXN_STATUS_CREATED, + }, + { + name: "SkycoinCreatedTransaction-Created", + txn: &SkycoinCreatedTransaction{ + skyTxn: api.CreatedTransaction{Length: 10}, + }, + want: core.TXN_STATUS_CREATED, + }, + { + name: "SkycoinTransaction-Confirmed", + txn: &SkycoinTransaction{ + skyTxn: readable.TransactionVerbose{ + BlockTransactionVerbose: readable.BlockTransactionVerbose{ + Hash: "hash1", + }, + }, + }, + want: core.TXN_STATUS_CONFIRMED, + }, + { + name: "SkycoinTransaction-Unconfirmed", + txn: &SkycoinTransaction{ + skyTxn: readable.TransactionVerbose{ + BlockTransactionVerbose: readable.BlockTransactionVerbose{ + Hash: "hash2", + }, + }, + }, + want: core.TXN_STATUS_PENDING, + }, + { + name: "SkycoinTransaction-ApiError", + txn: &SkycoinTransaction{ + skyTxn: readable.TransactionVerbose{ + BlockTransactionVerbose: readable.BlockTransactionVerbose{ + Hash: "hash3", + }, + }, + }, + want: core.TXN_STATUS_CREATED, + }, + { + name: "SkycoinPendingTransaction", + txn: new(SkycoinPendingTransaction), + want: core.TXN_STATUS_PENDING, + }, + { + name: "SkycoinUnjectedTransaction", + txn: new(SkycoinUninjectedTransaction), + want: core.TXN_STATUS_CREATED, + }, + } - require.Equal(t, thx1.GetStatus(), core.TXN_STATUS_CONFIRMED) - require.Equal(t, thx2.GetStatus(), core.TXN_STATUS_PENDING) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + require.Equal(t, tt.want, tt.txn.GetStatus()) + }) + } } func TestSkycoinTransactionGetInputs(t *testing.T) { - //set correct return value + skyAmount := uint64(20000000) + chAmount := uint64(20) + response := &readable.TransactionWithStatusVerbose{ - Transaction: readable.TransactionVerbose{}, + Transaction: readable.TransactionVerbose{ + BlockTransactionVerbose: readable.BlockTransactionVerbose{ + In: []readable.TransactionInput{ + readable.TransactionInput{ + Hash: "I1", + Coins: "20", + Hours: chAmount, + }, + readable.TransactionInput{ + Hash: "I2", + Coins: "20", + Hours: uint64(20), + }, + }, + }, + }, } - response.Transaction.In = []readable.TransactionInput{ - readable.TransactionInput{ - Hash: "I1", - Coins: "20", - Hours: uint64(20), - CalculatedHours: uint64(20), + global_mock.On("TransactionVerbose", "hash1").Return(nil, goerrors.New("failure")).Once() + global_mock.On("TransactionVerbose", "hash1").Return(response, nil).Once() + + st := new(SkycoinTransaction) + st.skyTxn.Hash = "hash1" + + tests := []struct { + name string + txn core.Transaction + ids []string + wantNil bool + }{ + { + name: "SkycoinCreatedTransaction", + txn: &SkycoinCreatedTransaction{ + skyTxn: api.CreatedTransaction{ + In: []api.CreatedTransactionInput{ + api.CreatedTransactionInput{ + UxID: "out1", Coins: "20", Hours: "20", + }, + api.CreatedTransactionInput{ + UxID: "out2", Coins: "20", Hours: "20", + }, + api.CreatedTransactionInput{ + UxID: "out3", Coins: "20", Hours: "20", + }, + }, + }, + }, + ids: []string{"out1", "out2", "out3"}, }, - readable.TransactionInput{ - Hash: "I2", - Coins: "20", - Hours: uint64(20), - CalculatedHours: uint64(20), + { + name: "SkycoinTransaction-ApiError", + txn: st, + wantNil: true, + }, + { + name: "SkycoinTransaction", + txn: st, + ids: []string{"I1", "I2"}, + }, + { + name: "SkycoinTransaction-InputsSaved", + txn: st, + ids: []string{"I1", "I2"}, }, } - global_mock.On("TransactionVerbose", "hash1").Return(response, nil) - thx1 := &SkycoinTransaction{skyTxn: readable.TransactionVerbose{}} - thx1.skyTxn.Hash = "hash1" - - inputs := thx1.GetInputs() - require.Equal(t, inputs[0].GetId(), "I1") - require.Equal(t, inputs[1].GetId(), "I2") - it := NewSkycoinTransactioninputIterator(inputs) - for it.Next() { - sky, err := it.Value().GetCoins(Sky) - require.NoError(t, err) - require.Equal(t, sky, uint64(20000000)) - hours, err1 := it.Value().GetCoins(CoinHour) - require.NoError(t, err1) - require.Equal(t, hours, uint64(20)) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + inputs := tt.txn.GetInputs() + if tt.wantNil { + require.Nil(t, inputs) + } else { + ids := make([]string, 0) + it := NewSkycoinTransactioninputIterator(inputs) + for it.Next() { + input := it.Value() + ids = append(ids, input.GetId()) + sky, err := input.GetCoins(Sky) + require.NoError(t, err) + require.Equal(t, skyAmount, sky) + hours, err1 := input.GetCoins(CoinHour) + require.NoError(t, err1) + require.Equal(t, chAmount, hours) + } + requirethat.ElementsMatch(t, tt.ids, ids) + } + }) } } func TestSkycoinTransactionInputGetSpentOutput(t *testing.T) { + CleanGlobalMock() + + input := &SkycoinTransactionInput{skyIn: readable.TransactionInput{Hash: "in1"}} + global_mock.On("UxOut", "in1").Return(nil, goerrors.New("failure")).Once() + output, err := input.GetSpentOutput() + if err != nil { + require.Equal(t,"failure", err.Error()) + } + require.Nil(t, output) + global_mock.On("UxOut", "in1").Return( &readable.SpentOutput{ OwnerAddress: "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", @@ -86,14 +225,16 @@ func TestSkycoinTransactionInputGetSpentOutput(t *testing.T) { Uxid: "out1", }, nil, - ) + ).Once() - input := &SkycoinTransactionInput{skyIn: readable.TransactionInput{Hash: "in1"}} - output := input.GetSpentOutput() + output, err = input.GetSpentOutput() + require.Equal(t, nil, err) - t.Logf("%#v",output) + t.Logf("%#v", output) require.Equal(t, output.GetId(), "out1") - require.Equal(t, output.GetAddress().String(), "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8") + outputAddress, err := output.GetAddress() + require.Equal(t, nil, err) + require.Equal(t, outputAddress.String(), "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8") sky, err := output.GetCoins(Sky) require.NoError(t, err) require.Equal(t, sky, uint64(1000000)) @@ -102,25 +243,33 @@ func TestSkycoinTransactionInputGetSpentOutput(t *testing.T) { require.Equal(t, hours, uint64(20)) } -func TestSkycoinTransactionOutputIsSpent(t *testing.T) { - global_mock.On("UxOut", "out1").Return( - &readable.SpentOutput{ - SpentTxnID: "0000000000000000000000000000000000000000000000000000000000000000", +func TestIsSpent(t *testing.T) { + badID := "0000000000000000000000000000000000000000000000000000000000000000" + tests := []struct { + name string + output core.TransactionOutput + }{ + { + name: "SkycoinTransactionOutput", + output: &SkycoinTransactionOutput{skyOut: readable.TransactionOutput{Hash: "out"}}, }, - nil, - ) - global_mock.On("UxOut", "out2").Return( - &readable.SpentOutput{ - SpentTxnID: "0", + { + name: "SkycoinCreatedTransactionOutput", + output: &SkycoinCreatedTransactionOutput{skyOut: api.CreatedTransactionOutput{UxID: "out"}}, }, - nil, - ) - - output1 := &SkycoinTransactionOutput{skyOut: readable.TransactionOutput{Hash: "out1"}} - output2 := &SkycoinTransactionOutput{skyOut: readable.TransactionOutput{Hash: "out2"}} + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + global_mock.On("UxOut", "out").Return(nil, goerrors.New("failure")).Once() + global_mock.On("UxOut", "out").Return(&readable.SpentOutput{SpentTxnID: badID}, nil).Once() + global_mock.On("UxOut", "out").Return(&readable.SpentOutput{SpentTxnID: "42"}, nil).Once() - require.Equal(t, output1.IsSpent(), false) - require.Equal(t, output2.IsSpent(), true) + require.Equal(t, tt.output.IsSpent(), false) + require.Equal(t, tt.output.IsSpent(), false) + require.Equal(t, tt.output.IsSpent(), true) + require.Equal(t, tt.output.IsSpent(), true) + }) + } } func TestUninjectedTransactionSignedUnsigned(t *testing.T) { @@ -165,6 +314,7 @@ func TestSkycoinUninjectedTransactionGetInputs(t *testing.T) { addr := makeAddress() + global_mock.On("UxOut", h.String()).Return(nil, goerrors.New("failure")).Once() global_mock.On("UxOut", h.String()).Return( &readable.SpentOutput{ OwnerAddress: addr.String(), @@ -177,6 +327,9 @@ func TestSkycoinUninjectedTransactionGetInputs(t *testing.T) { ) tiList := ut.GetInputs() + require.Nil(t, tiList) + + tiList = ut.GetInputs() ti := tiList[0] require.Equal(t, 1, len(tiList)) sky, err := ti.GetCoins(Sky) @@ -191,25 +344,1636 @@ func TestSkycoinUninjectedTransactionGetInputs(t *testing.T) { require.Equal(t, uint64(0), val) } -func TestSkycoinCreatedTransactionOutputIsSpent(t *testing.T) { - global_mock.On("UxOut", "out1").Return( - &readable.SpentOutput{ - SpentTxnID: "0000000000000000000000000000000000000000000000000000000000000000", +func TestSupportedAssets(t *testing.T) { + pendTxn := new(SkycoinPendingTransaction) + assets := pendTxn.SupportedAssets() + requirethat.ElementsMatch(t, []string{Sky, CoinHour}, assets) + + coreTxn := new(SkycoinUninjectedTransaction) + assets = coreTxn.SupportedAssets() + requirethat.ElementsMatch(t, []string{Sky, CoinHour}, assets) + + skyTxn := new(SkycoinTransaction) + assets = skyTxn.SupportedAssets() + requirethat.ElementsMatch(t, []string{Sky, CoinHour}, assets) + + cTxn := new(SkycoinCreatedTransaction) + assets = cTxn.SupportedAssets() + requirethat.ElementsMatch(t, []string{Sky, CoinHour}, assets) + + skyTxnOut := new(SkycoinTransactionOutput) + assets = skyTxnOut.SupportedAssets() + requirethat.ElementsMatch(t, []string{Sky, CoinHour, CalculatedHour}, assets) + + skyTxnIn := new(SkycoinTransactionInput) + assets = skyTxnIn.SupportedAssets() + requirethat.ElementsMatch(t, []string{Sky, CoinHour, CalculatedHour}, assets) + + cTxnOut := new(SkycoinCreatedTransactionOutput) + assets = cTxnOut.SupportedAssets() + requirethat.ElementsMatch(t, []string{Sky, CoinHour, CalculatedHour}, assets) + + cTxnIn := new(SkycoinCreatedTransactionInput) + assets = cTxnIn.SupportedAssets() + requirethat.ElementsMatch(t, []string{Sky, CoinHour, CalculatedHour}, assets) +} + +func TestTransactionsGetTimestamp(t *testing.T) { + cur := time.Now() + tests := []struct { + name string + txn core.Transaction + want uint64 + }{ + { + name: "SkycoinUninjectTransaction", + txn: new(SkycoinUninjectedTransaction), + want: 0, }, - nil, - ) - global_mock.On("UxOut", "out2").Return( - &readable.SpentOutput{ - SpentTxnID: "0", + { + name: "SkycoinCreatedTransaction-Created", + txn: &SkycoinCreatedTransaction{ + skyTxn: api.CreatedTransaction{Length: 10}, + }, + want: 0, }, - nil, - ) + { + name: "SkycoinTransaction", + txn: &SkycoinTransaction{ + skyTxn: readable.TransactionVerbose{ + Timestamp: 42, + }, + }, + want: 42, + }, + { + name: "SkycoinPendingTransaction", + txn: &SkycoinPendingTransaction{ + Transaction: &readable.UnconfirmedTransactionVerbose{ + Received: cur, + }, + }, + want: uint64(cur.Unix()), + }, + { + name: "SkycoinCreatedTransaction", + txn: new(SkycoinCreatedTransaction), + want: 0, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + require.Equal(t, core.Timestamp(tt.want), tt.txn.GetTimestamp()) + }) + } +} + +func TestPendingTxnGetInputs(t *testing.T) { + hashes := make([]string, 0) + for i := 0; i < 10; i++ { + hashes = append(hashes, fmt.Sprintf("hash%d", i)) + } + sTxn := new(SkycoinPendingTransaction) + inputs := make([]readable.TransactionInput, 0) + for _, hash := range hashes { + inputs = append(inputs, readable.TransactionInput{Hash: hash}) + } + sTxn.Transaction = &readable.UnconfirmedTransactionVerbose{ + Transaction: readable.BlockTransactionVerbose{ + In: inputs, + }, + } + inHashes := make([]string, 0) + for _, input := range sTxn.GetInputs() { + inHashes = append(inHashes, input.GetId()) + } + requirethat.ElementsMatch(t, hashes, inHashes) +} + +func TestPendingTxnGetOutputs(t *testing.T) { + hashes := make([]string, 0) + for i := 0; i < 10; i++ { + hashes = append(hashes, fmt.Sprintf("hash%d", i)) + } + sTxn := new(SkycoinPendingTransaction) + outputs := make([]readable.TransactionOutput, 0) + for _, hash := range hashes { + outputs = append(outputs, readable.TransactionOutput{Hash: hash}) + } + sTxn.Transaction = &readable.UnconfirmedTransactionVerbose{ + Transaction: readable.BlockTransactionVerbose{ + Out: outputs, + }, + } + outHashes := make([]string, 0) + for _, output := range sTxn.GetOutputs() { + outHashes = append(outHashes, output.GetId()) + } + requirethat.ElementsMatch(t, hashes, outHashes) +} + +func Test_newCreatedTransactionOutput(t *testing.T) { + tests := []struct { + uxID string + address string + coins string + hours string + }{ + {uxID: "uxId1", address: "addr1", coins: "coins1", hours: "hours1"}, + {uxID: "uxId2", address: "addr2", coins: "coins2", hours: "hours2"}, + {uxID: "uxId3", address: "addr3", coins: "coins3", hours: "hours3"}, + {uxID: "uxId4", address: "addr4", coins: "coins4", hours: "hours4"}, + } + + for i, tt := range tests { + t.Run(fmt.Sprintf("case%d", i), func(t *testing.T) { + txn := newCreatedTransactionOutput(tt.uxID, tt.address, tt.coins, tt.hours) + require.Equal(t, tt.uxID, txn.UxID) + require.Equal(t, tt.address, txn.Address) + require.Equal(t, tt.coins, txn.Coins) + require.Equal(t, tt.hours, txn.Hours) + }) + } +} + +func Test_newCreatedTransactionInput(t *testing.T) { + tests := []struct { + uxID string + address string + coins string + hours string + calculatedHours string + time uint64 + block uint64 + txID string + }{ + { + uxID: "uxId1", + address: "addr1", + coins: "coins1", + hours: "hours1", + calculatedHours: "cH1", + txID: "id1", + time: 1, + block: 1, + }, + { + uxID: "uxId2", + address: "addr2", + coins: "coins2", + hours: "hours2", + calculatedHours: "cH2", + txID: "id2", + time: 2, + block: 2, + }, + { + uxID: "uxId3", + address: "addr3", + coins: "coins3", + hours: "hours3", + calculatedHours: "cH3", + txID: "id3", + time: 3, + block: 3, + }, + { + uxID: "uxId4", + address: "addr4", + coins: "coins4", + hours: "hours4", + calculatedHours: "cH4", + txID: "id4", + time: 4, + block: 4, + }, + } + + for i, tt := range tests { + t.Run(fmt.Sprintf("case%d", i), func(t *testing.T) { + txn := newCreatedTransactionInput( + tt.uxID, tt.address, tt.coins, tt.hours, tt.calculatedHours, tt.time, tt.block, tt.txID, + ) + require.Equal(t, tt.uxID, txn.UxID) + require.Equal(t, tt.address, txn.Address) + require.Equal(t, tt.coins, txn.Coins) + require.Equal(t, tt.hours, txn.Hours) + require.Equal(t, tt.calculatedHours, txn.CalculatedHours) + require.Equal(t, tt.time, txn.Time) + require.Equal(t, tt.block, txn.Block) + require.Equal(t, tt.txID, txn.TxID) + }) + } +} + +func Test_newCreatedTransaction(t *testing.T) { + tests := []struct { + length uint32 + txnType uint8 + txID string + innerHash string + fee string + ins []api.CreatedTransactionInput + outs []api.CreatedTransactionOutput + sigs []string + }{ + { + length: 1, + txnType: 1, + txID: "txID1", + innerHash: "hash1", + fee: "fee1", + ins: []api.CreatedTransactionInput{ + api.CreatedTransactionInput{UxID: "UxID1"}, + }, + outs: []api.CreatedTransactionOutput{ + api.CreatedTransactionOutput{UxID: "UxID1"}, + }, + sigs: []string{"first1", "second1"}, + }, + { + length: 2, + txnType: 2, + txID: "txID2", + innerHash: "hash2", + fee: "fee2", + ins: []api.CreatedTransactionInput{ + api.CreatedTransactionInput{UxID: "UxID2"}, + }, + outs: []api.CreatedTransactionOutput{ + api.CreatedTransactionOutput{UxID: "UxID2"}, + }, + sigs: []string{"first2", "second2"}, + }, + { + length: 3, + txnType: 3, + txID: "txID3", + innerHash: "hash3", + fee: "fee3", + ins: []api.CreatedTransactionInput{ + api.CreatedTransactionInput{UxID: "UxID3"}, + }, + outs: []api.CreatedTransactionOutput{ + api.CreatedTransactionOutput{UxID: "UxID3"}, + }, + sigs: []string{"first3", "second3"}, + }, + { + length: 4, + txnType: 4, + txID: "txID4", + innerHash: "hash4", + fee: "fee4", + ins: []api.CreatedTransactionInput{ + api.CreatedTransactionInput{UxID: "UxID4"}, + }, + outs: []api.CreatedTransactionOutput{ + api.CreatedTransactionOutput{UxID: "UxID4"}, + }, + sigs: []string{"first4", "second4"}, + }, + } + + for i, tt := range tests { + t.Run(fmt.Sprintf("case%d", i), func(t *testing.T) { + txn := newCreatedTransaction( + tt.length, + tt.txnType, + tt.txID, + tt.innerHash, + tt.fee, + tt.ins, + tt.outs, + tt.sigs, + ) + require.Equal(t, tt.length, txn.Length) + require.Equal(t, tt.txnType, txn.Type) + require.Equal(t, tt.txID, txn.TxID) + require.Equal(t, tt.innerHash, txn.InnerHash) + require.Equal(t, tt.fee, txn.Fee) + requirethat.ElementsMatch(t, tt.ins, txn.In) + requirethat.ElementsMatch(t, tt.outs, txn.Out) + requirethat.ElementsMatch(t, tt.sigs, txn.Sigs) + }) + } +} + +func Test_blockTxnToCreatedTxn(t *testing.T) { + tests := []struct { + Address string + Coins string + Hours uint64 + CalculatedHours uint64 + Time uint64 + Block uint64 + Hash string + Length uint32 + Type uint8 + InnerHash string + Fee uint64 + sigs []string + }{ + { + Address: "addr1", + Coins: "coins1", + Hours: 1, + CalculatedHours: 1, + Time: 1, + Hash: "hash1", + Length: 1, + Type: 1, + InnerHash: "inner1", + Fee: 1, + sigs: []string{"first1", "second1"}, + }, + { + Address: "addr2", + Coins: "coins2", + Hours: 2, + CalculatedHours: 2, + Time: 2, + Hash: "hash2", + Length: 2, + Type: 2, + InnerHash: "inner2", + Fee: 2, + sigs: []string{"first2", "second2"}, + }, + { + Address: "addr3", + Coins: "coins3", + Hours: 3, + CalculatedHours: 3, + Time: 3, + Hash: "hash3", + Length: 3, + Type: 3, + InnerHash: "inner3", + Fee: 3, + sigs: []string{"first3", "second3"}, + }, + { + Address: "addr4", + Coins: "coins4", + Hours: 4, + CalculatedHours: 4, + Time: 4, + Hash: "hash4", + Length: 4, + Type: 4, + InnerHash: "inner4", + Fee: 4, + sigs: []string{"first4", "second4"}, + }, + } + + for i, tt := range tests { + t.Run(fmt.Sprintf("case%d", i), func(*testing.T) { + block := readable.BlockTransactionVerbose{ + Length: tt.Length, + Type: tt.Type, + Hash: tt.Hash, + InnerHash: tt.InnerHash, + Fee: tt.Fee, + In: []readable.TransactionInput{ + readable.TransactionInput{ + Hash: tt.Hash, + Address: tt.Address, + Coins: tt.Coins, + Hours: tt.Hours, + CalculatedHours: tt.CalculatedHours, + }, + }, + Out: []readable.TransactionOutput{ + readable.TransactionOutput{ + Hash: tt.Hash, + Address: tt.Address, + Coins: tt.Coins, + Hours: tt.Hours, + }, + }, + Sigs: tt.sigs, + } + txn, err := blockTxnToCreatedTxn(block, tt.Time) + require.NoError(t, err) + require.Equal(t, tt.Length, txn.Length) + require.Equal(t, tt.Type, txn.Type) + require.Equal(t, tt.Hash, txn.TxID) + require.Equal(t, tt.InnerHash, txn.InnerHash) + require.Equal(t, fmt.Sprint(tt.Fee), txn.Fee) + require.Equal(t, 1, len(txn.In)) + require.Equal(t, 1, len(txn.Out)) + requirethat.ElementsMatch(t, + []api.CreatedTransactionInput{ + newCreatedTransactionInput( + tt.Hash, + tt.Address, + tt.Coins, + fmt.Sprint(tt.Hours), + fmt.Sprint(tt.CalculatedHours), + tt.Time, + tt.Block, + tt.Hash, + ), + }, + txn.In, + ) + requirethat.ElementsMatch(t, + []api.CreatedTransactionOutput{ + newCreatedTransactionOutput( + tt.Hash, tt.Address, tt.Coins, fmt.Sprint(tt.Hours), + ), + }, + txn.Out, + ) + requirethat.ElementsMatch(t, tt.sigs, txn.Sigs) + }) + } +} + +func TestPendingTxnToCreatedTransaction(t *testing.T) { + for i := 0; i < 5; i++ { + t.Run(fmt.Sprintf("case%d", i), func(t *testing.T) { + txn := &SkycoinPendingTransaction{ + Transaction: &readable.UnconfirmedTransactionVerbose{ + Transaction: readable.BlockTransactionVerbose{ + Hash: fmt.Sprintf("hash%d", i), + }, + Announced: time.Now(), + }, + } + expected, err := blockTxnToCreatedTxn( + txn.Transaction.Transaction, + uint64(txn.Transaction.Announced.UnixNano()), + ) + require.NoError(t, err) + created, err1 := txn.ToCreatedTransaction() + require.NoError(t, err1) + require.Equal(t, expected, created) + }) + } +} + +func Test_serializeCreatedTransaction(t *testing.T) { + mockTxn := new(skymocks.ReadableTxn) + id := "0000000000000000000000000000000000000000000000000000000000000000" + created := &api.CreatedTransaction{ + TxID: "78877fa898f0b4c45c9c33ae941e40617ad7c8657a307db62bc5691f92f4f60e", + InnerHash: "No-match", + } + mockTxn.On("ToCreatedTransaction").Return(nil, goerrors.New("failure")).Once() + mockTxn.On("ToCreatedTransaction").Return(created, nil) + + _, err := serializeCreatedTransaction(mockTxn) + require.Error(t, err) + + _, err = serializeCreatedTransaction(mockTxn) + require.Error(t, err) + + created.InnerHash = id + ser, err := serializeCreatedTransaction(mockTxn) + require.NoError(t, err) + txn, err := created.ToTransaction() + require.NoError(t, err) + expected, err := txn.Serialize() + require.NoError(t, err) + require.Equal(t, expected, ser) +} + +func TestSkycoinPendingTransactionEncodeSkycoinTransaction(t *testing.T) { + date, err := time.Parse(time.RFC3339, "2012-11-01T22:08:41+00:00") + require.NoError(t, err) + sTxn := &SkycoinPendingTransaction{ + Transaction: &readable.UnconfirmedTransactionVerbose{ + Transaction: readable.BlockTransactionVerbose{ + InnerHash: "0000000000000000000000000000000000000000000000000000000000000000", + Hash: "78877fa898f0b4c45c9c33ae941e40617ad7c8657a307db62bc5691f92f4f60e", + }, + Announced: date, + }, + } + ser, err := sTxn.EncodeSkycoinTransaction() + require.NoError(t, err) + exp, err := serializeCreatedTransaction(sTxn) + require.NoError(t, err) + require.Equal(t, exp, ser) +} + +func Test_verifyReadableTransaction(t *testing.T) { + mockTxn := new(skymocks.ReadableTxn) + id := "0000000000000000000000000000000000000000000000000000000000000000" + created := &api.CreatedTransaction{ + TxID: "78877fa898f0b4c45c9c33ae941e40617ad7c8657a307db62bc5691f92f4f60e", + InnerHash: "No-match", + } + mockTxn.On("ToCreatedTransaction").Return(nil, goerrors.New("failure")).Once() + mockTxn.On("ToCreatedTransaction").Return(created, nil) + + // ReadableTxn error + err := verifyReadableTransaction(mockTxn, false) + require.Error(t, err) + + // transaction hash error + err = verifyReadableTransaction(mockTxn, false) + require.Error(t, err) + + // Verify fail + created.InnerHash = id + err = verifyReadableTransaction(mockTxn, false) + require.Error(t, err) + + // VerifyUnsigned fail + err = verifyReadableTransaction(mockTxn, true) + require.Error(t, err) - output1 := &SkycoinCreatedTransactionOutput{skyOut: api.CreatedTransactionOutput{UxID: "out1"}} - output2 := &SkycoinCreatedTransactionOutput{skyOut: api.CreatedTransactionOutput{UxID: "out2"}} + //TODO: add a case that not raise an error +} + +func TestPendingTxnVerifySignature(t *testing.T) { + tests := []struct { + name string + sTxn *SkycoinPendingTransaction + }{ + { + name: "empty transaction", + sTxn: &SkycoinPendingTransaction{Transaction: new(readable.UnconfirmedTransactionVerbose)}, + }, + { + name: "cero outputs", + sTxn: &SkycoinPendingTransaction{ + Transaction: &readable.UnconfirmedTransactionVerbose{ + Transaction: readable.BlockTransactionVerbose{ + In: []readable.TransactionInput{readable.TransactionInput{}}, + }, + }, + }, + }, + //TODO: add valid tests + } - require.Equal(t, output1.IsSpent(), false) - require.Equal(t, output2.IsSpent(), true) - require.Equal(t, output2.IsSpent(), true) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if !tt.sTxn.Transaction.IsValid { + require.Error(t, tt.sTxn.VerifySigned()) + require.Error(t, tt.sTxn.VerifyUnsigned()) + tt.sTxn.Transaction.IsValid = true + } + require.Equal(t, verifyReadableTransaction(tt.sTxn, false), tt.sTxn.VerifyUnsigned()) + require.Equal(t, verifyReadableTransaction(tt.sTxn, true), tt.sTxn.VerifySigned()) + }) + } +} + +func Test_checkFullySigned(t *testing.T) { + mockTxn := new(skymocks.ReadableTxn) + id := "0000000000000000000000000000000000000000000000000000000000000000" + created := &api.CreatedTransaction{ + TxID: "78877fa898f0b4c45c9c33ae941e40617ad7c8657a307db62bc5691f92f4f60e", + InnerHash: "No-match", + } + mockTxn.On("ToCreatedTransaction").Return(nil, goerrors.New("failure")).Once() + mockTxn.On("ToCreatedTransaction").Return(created, nil) + + _, err := checkFullySigned(mockTxn) + require.Error(t, err) + + _, err = checkFullySigned(mockTxn) + require.Error(t, err) + + // false + created.InnerHash = id + val, err := checkFullySigned(mockTxn) + require.NoError(t, err) + require.False(t, val) + + //TODO: add valid test +} + +func TestTransactionIsFullySigned(t *testing.T) { + type skyTxn interface { + skytypes.ReadableTxn + core.Transaction + } + tests := []struct { + name string + txn skyTxn + }{ + { + name: "empty PendingTxn", + txn: &SkycoinPendingTransaction{Transaction: new(readable.UnconfirmedTransactionVerbose)}, + }, + { + name: "cero outputs in PendingTxn", + txn: &SkycoinPendingTransaction{ + Transaction: &readable.UnconfirmedTransactionVerbose{ + Transaction: readable.BlockTransactionVerbose{ + In: []readable.TransactionInput{readable.TransactionInput{}}, + }, + }, + }, + }, + { + name: "empty Txn", + txn: new(SkycoinTransaction), + }, + //TODO: add valid tests + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + fully, err := checkFullySigned(tt.txn) + fully1, err1 := tt.txn.IsFullySigned() + require.Equal(t, err, err1) + require.Equal(t, fully, fully1) + }) + } +} + +func TestSkycoinUninjectedTransactionGetOutputs(t *testing.T) { + addr := makeAddress() + addr1 := makeAddress() + tests := []struct { + name string + ujTxn *SkycoinUninjectedTransaction + addrs []string + wantNil bool + }{ + { + name: "empty transaction", + ujTxn: &SkycoinUninjectedTransaction{ + outputs: []core.TransactionOutput{}, + }, + addrs: make([]string, 0), + }, + { + name: "nil outputs", + ujTxn: &SkycoinUninjectedTransaction{ + txn: &coin.Transaction{}, + }, + addrs: make([]string, 0), + }, + { + name: "incorrect output", + ujTxn: &SkycoinUninjectedTransaction{ + txn: &coin.Transaction{ + Out: []coin.TransactionOutput{ + coin.TransactionOutput{ + Coins: 9223372036854775808, + }, + }, + }, + }, + wantNil: true, + }, + { + name: "some outputs", + ujTxn: &SkycoinUninjectedTransaction{ + txn: &coin.Transaction{ + Out: []coin.TransactionOutput{ + coin.TransactionOutput{ + Address: addr, + }, + coin.TransactionOutput{ + Address: addr1, + }, + }, + }, + }, + addrs: []string{addr.String(), addr1.String()}, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + outputs := tt.ujTxn.GetOutputs() + if tt.wantNil { + require.Nil(t, outputs) + } else { + require.Equal(t, len(tt.addrs), len(outputs)) + hashes := make([]string, len(tt.addrs)) + for i, out := range outputs { + outputAddress, err := out.GetAddress() + require.Equal(t, nil, err) + hashes[i] = outputAddress.String() + } + requirethat.ElementsMatch(t, tt.addrs, hashes) + } + }) + } +} +func TestGetId(t *testing.T) { + type ObjectWithID interface { + GetId() string + } + tests := []struct { + obj ObjectWithID + want string + }{ + { + obj: &SkycoinCreatedTransactionOutput{ + skyOut: api.CreatedTransactionOutput{ + UxID: "uxid", + }, + }, + want: "uxid", + }, + { + obj: &SkycoinCreatedTransactionInput{ + skyIn: api.CreatedTransactionInput{ + UxID: "uxid", + }, + }, + want: "uxid", + }, + { + obj: &SkycoinUninjectedTransaction{ + txn: new(coin.Transaction), + }, + want: "78877fa898f0b4c45c9c33ae941e40617ad7c8657a307db62bc5691f92f4f60e", + }, + { + obj: &SkycoinUninjectedTransaction{ + txn: &coin.Transaction{ + Length: 5, + }, + }, + want: "03e228f59704bc30de09f76fe9db0981ca77b6421aaa997e227d39bcc317174e", + }, + { + obj: &SkycoinUninjectedTransaction{ + txn: &coin.Transaction{ + Type: 2, + }, + }, + want: "bb5e828965130b51e627725f6fea3247124da6799d28ccac81c247fd78b34621", + }, + { + obj: &SkycoinPendingTransaction{ + Transaction: &readable.UnconfirmedTransactionVerbose{ + Transaction: readable.BlockTransactionVerbose{ + Hash: "hash1", + }, + }, + }, + want: "hash1", + }, + { + obj: &SkycoinPendingTransaction{ + Transaction: &readable.UnconfirmedTransactionVerbose{ + Transaction: readable.BlockTransactionVerbose{ + Hash: "hash2", + }, + }, + }, + want: "hash2", + }, + { + obj: &SkycoinCreatedTransactionInput{ + skyIn: api.CreatedTransactionInput{ + UxID: "uxid1", + }, + }, + want: "uxid1", + }, + { + obj: &SkycoinCreatedTransactionInput{ + skyIn: api.CreatedTransactionInput{ + UxID: "uxid2", + }, + }, + want: "uxid2", + }, + } + + for i, tt := range tests { + t.Run(fmt.Sprintf("ID%d", i), func(t *testing.T) { + require.Equal(t, tt.want, tt.obj.GetId()) + }) + } +} + +func TestSkycoinTransactionGetOutputs(t *testing.T) { + skyAmount := uint64(20000000) + chAmount := uint64(20) + + st := new(SkycoinTransaction) + outs := []readable.TransactionOutput{ + readable.TransactionOutput{ + Hash: "O1", + Coins: "20", + Hours: chAmount, + }, + readable.TransactionOutput{ + Hash: "O2", + Coins: "20", + Hours: chAmount, + }, + } + st.skyTxn.Out = outs + + tests := []struct { + name string + txn core.Transaction + ids []string + wantNil bool + }{ + { + name: "SkycoinCreatedTransaction", + txn: &SkycoinCreatedTransaction{ + skyTxn: api.CreatedTransaction{ + Out: []api.CreatedTransactionOutput{ + api.CreatedTransactionOutput{ + UxID: "out1", Coins: "20", Hours: "20", + }, + api.CreatedTransactionOutput{ + UxID: "out2", Coins: "20", Hours: "20", + }, + api.CreatedTransactionOutput{ + UxID: "out3", Coins: "20", Hours: "20", + }, + }, + }, + }, + ids: []string{"out1", "out2", "out3"}, + }, + { + name: "SkycoinTransaction1", + txn: st, + ids: []string{"O1", "O2"}, + }, + { + name: "SkycoinTransaction1-OutputsSaved", + txn: st, + ids: []string{"O1", "O2"}, + }, + { + name: "SkycoinTransaction1-OutputsSaved", + txn: &SkycoinTransaction{ + skyTxn: readable.TransactionVerbose{ + BlockTransactionVerbose: readable.BlockTransactionVerbose{ + Out: outs[:1], + }, + }, + }, + ids: []string{"O1"}, + }, + { + name: "SkycoinTransaction1-NoOutputs", + txn: new(SkycoinTransaction), + ids: []string{}, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + outputs := tt.txn.GetOutputs() + if tt.wantNil { + require.Nil(t, outputs) + } else { + ids := make([]string, 0) + it := NewSkycoinTransactionOutputIterator(outputs) + for it.Next() { + output := it.Value() + ids = append(ids, output.GetId()) + sky, err := output.GetCoins(Sky) + require.NoError(t, err) + require.Equal(t, skyAmount, sky) + hours, err1 := output.GetCoins(CoinHour) + require.NoError(t, err1) + require.Equal(t, chAmount, hours) + } + requirethat.ElementsMatch(t, tt.ids, ids) + } + }) + } +} + +func TestTransactionComputeFee(t *testing.T) { + expectedError := func(ticker string) error { + if ticker == CalculatedHour { + return errors.ErrNotImplemented + } + if ticker == Sky || ticker == CoinHour { + return nil + } + return errors.ErrInvalidAltcoinTicker + } + expectedAmount := func(ticker string, amount uint64) uint64 { + if ticker == CoinHour { + return amount + } + return 0 + } + pendingTxnWithFee := func(ticker string, fee string) (core.Transaction, uint64, bool, error) { + val, err := strconv.ParseUint(fee, 10, 64) + if err != nil { + return nil, 0, false, nil + } + return &SkycoinPendingTransaction{ + Transaction: &readable.UnconfirmedTransactionVerbose{ + Transaction: readable.BlockTransactionVerbose{ + Fee: val, + }, + }, + }, expectedAmount(ticker, val), true, expectedError(ticker) + } + uninjectedTxnWithFee := func(ticker string, fee string) (core.Transaction, uint64, bool, error) { + val, err := strconv.ParseUint(fee, 10, 64) + if err != nil { + return nil, 0, false, nil + } + return &SkycoinUninjectedTransaction{fee: val}, expectedAmount(ticker, val), true, expectedError(ticker) + } + skycoinTxnWithFee := func(ticker string, fee string) (core.Transaction, uint64, bool, error) { + val, err := strconv.ParseUint(fee, 10, 64) + if err != nil { + return nil, 0, false, nil + } + return &SkycoinTransaction{ + skyTxn: readable.TransactionVerbose{ + BlockTransactionVerbose: readable.BlockTransactionVerbose{ + Fee: val, + }, + }, + }, expectedAmount(ticker, val), true, expectedError(ticker) + } + createdTxnWithFee := func(ticker string, fee string) (core.Transaction, uint64, bool, error) { + val, err := strconv.ParseInt(fee, 10, 64) + var expError error + if err != nil && ticker == CoinHour { + expError = err + } else { + expError = expectedError(ticker) + } + return &SkycoinCreatedTransaction{ + skyTxn: api.CreatedTransaction{ + Fee: fee, + }, + }, expectedAmount(ticker, uint64(val)), true, expError + } + + tests := []struct { + name string + generator func(string, string) (core.Transaction, uint64, bool, error) + }{ + { + name: "SkycoinPendingTransaction", + generator: pendingTxnWithFee, + }, + { + name: "SkycoinUninjectedTransaction", + generator: uninjectedTxnWithFee, + }, + { + name: "SkycoinTransaction", + generator: skycoinTxnWithFee, + }, + { + name: "SkycoinCreatedTransaction", + generator: createdTxnWithFee, + }, + } + tickers := []string{Sky, CoinHour, CalculatedHour, "INVALIDTICKER"} + amounts := []string{"1", "2", "42", "100", "42,42", "1,1"} + + for _, tt := range tests { + for _, ticker := range tickers { + for _, amount := range amounts { + t.Run(tt.name+"-"+ticker, func(t *testing.T) { + thx, expected, valid, err := tt.generator(ticker, amount) + if valid { + val, err1 := thx.ComputeFee(ticker) + if err != nil { + require.Equal(t, err, err1) + } else { + require.NoError(t, err1) + require.Equal(t, expected, val) + } + } + }) + } + } + } +} + +func TestTransactionVerifyUnsigned(t *testing.T) { + type skyTxn interface { + skytypes.ReadableTxn + core.Transaction + } + tests := []struct { + name string + txn skyTxn + }{ + { + name: "empty Txn", + txn: new(SkycoinTransaction), + }, + { + name: "empty Txn", + txn: new(SkycoinCreatedTransaction), + }, + //TODO: add better tests + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := verifyReadableTransaction(tt.txn, false) + err1 := tt.txn.VerifyUnsigned() + require.Equal(t, err, err1) + }) + } +} + +func TestTransactionVerifySigned(t *testing.T) { + type skyTxn interface { + skytypes.ReadableTxn + core.Transaction + } + tests := []struct { + name string + txn skyTxn + }{ + { + name: "empty Txn", + txn: new(SkycoinTransaction), + }, + { + name: "empty Txn", + txn: new(SkycoinCreatedTransaction), + }, + //TODO: add better tests + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := verifyReadableTransaction(tt.txn, true) + err1 := tt.txn.VerifySigned() + require.Equal(t, err, err1) + }) + } +} + +func Test_getSkycoinTransactionInputsFromTxnHash(t *testing.T) { + CleanGlobalMock() + + inputs := []readable.TransactionInput{ + readable.TransactionInput{ + Hash: "hash1", + }, + readable.TransactionInput{ + Hash: "hash2", + }, + readable.TransactionInput{ + Hash: "hash3", + }, + readable.TransactionInput{ + Hash: "hash4", + }, + } + + for len(inputs) > 0 { + global_mock.On("TransactionVerbose", "hash").Return( + &readable.TransactionWithStatusVerbose{ + Transaction: readable.TransactionVerbose{ + BlockTransactionVerbose: readable.BlockTransactionVerbose{ + In: inputs, + }, + }, + }, nil, + ).Once() + t.Run("InputsFromTxnHash", func(t *testing.T) { + txnInputs, err := getSkycoinTransactionInputsFromTxnHash("hash") + require.NoError(t, err) + rawInputs := make([]readable.TransactionInput, len(txnInputs)) + for i, in := range txnInputs { + skyIn, valid := in.(*SkycoinTransactionInput) + require.True(t, valid) + require.Nil(t, skyIn.spentOutput) + rawInputs[i] = skyIn.skyIn + } + requirethat.ElementsMatch(t, inputs, rawInputs) + }) + inputs = inputs[:len(inputs)-1] + } + global_mock.On("TransactionVerbose", "hash").Return(nil, goerrors.New("failure")) + _, err := getSkycoinTransactionInputsFromTxnHash("hash") + require.Error(t, err) +} + +func TestGetCoins(t *testing.T) { + type ObjectWithCoins interface { + GetCoins(string) (uint64, error) + } + + fakeTicker := "MOCKSCOIN" + fakeDesc := "Fake coin" + fakeExp := 3 + fakeMeta := core.AltcoinMetadata{ + Name: fakeDesc, + Ticker: fakeTicker, + Family: fakeTicker, + HasBip44: false, + Bip44CoinType: 0, + Accuracy: int32(fakeExp), + } + mockPlugin := new(mocks.AltcoinPlugin) + mockPlugin.On("RegisterTo", mock.Anything).Return().Run(func(args mock.Arguments) { + manager := args.Get(0).(core.AltcoinManager) + manager.RegisterAltcoin(fakeMeta, mockPlugin) + }) + mockPlugin.On("GetName").Return(fakeDesc) + util.RegisterAltcoin(mockPlugin) + + invalidTicker := "INVALIDTICKER" + tests := []struct { + name string + obj ObjectWithCoins + ticker string + want uint64 + err bool + }{ + // SkycoinCreatedTransactionOutput + { + name: "SkycoinCreatedTransactionOutput", + ticker: invalidTicker, + obj: new(SkycoinCreatedTransactionOutput), + err: true, + }, + { + name: "SkycoinCreatedTransactionOutput", + ticker: fakeTicker, + obj: new(SkycoinCreatedTransactionOutput), + err: true, + }, + { + name: "SkycoinCreatedTransactionOutput", + ticker: Sky, + obj: &SkycoinCreatedTransactionOutput{ + skyOut: api.CreatedTransactionOutput{ + Coins: "20", + }, + }, + want: 20000000, + }, + { + name: "SkycoinCreatedTransactionOutput", + ticker: Sky, + obj: &SkycoinCreatedTransactionOutput{ + skyOut: api.CreatedTransactionOutput{ + Coins: "20.1", + }, + }, + want: 20100000, + }, + { + name: "SkycoinCreatedTransactionOutput", + ticker: Sky, + obj: &SkycoinCreatedTransactionOutput{ + skyOut: api.CreatedTransactionOutput{ + Coins: "20,1a", + }, + }, + err: true, + }, + { + name: "SkycoinCreatedTransactionOutput", + ticker: CoinHour, + obj: &SkycoinCreatedTransactionOutput{ + skyOut: api.CreatedTransactionOutput{ + Hours: "42", + }, + }, + want: 42, + }, + { + name: "SkycoinCreatedTransactionOutput", + ticker: CoinHour, + obj: &SkycoinCreatedTransactionOutput{ + skyOut: api.CreatedTransactionOutput{ + Hours: "42.1", + }, + }, + err: true, + }, + { + name: "SkycoinCreatedTransactionOutput", + ticker: CalculatedHour, + obj: &SkycoinCreatedTransactionOutput{ + calculatedHours: 42, + }, + want: 42, + }, + { + name: "SkycoinCreatedTransactionOutput", + ticker: CalculatedHour, + obj: &SkycoinCreatedTransactionOutput{ + calculatedHours: 50, + }, + want: 50, + }, + // SkycoinCreatedTransactionInput + { + name: "SkycoinCreatedTransactionInput", + ticker: invalidTicker, + obj: new(SkycoinCreatedTransactionInput), + err: true, + }, + { + name: "SkycoinCreatedTransactionInput", + ticker: fakeTicker, + obj: new(SkycoinCreatedTransactionInput), + err: true, + }, + { + name: "SkycoinCreatedTransactionInput", + ticker: Sky, + obj: &SkycoinCreatedTransactionInput{ + skyIn: api.CreatedTransactionInput{ + Coins: "20", + }, + }, + want: 20000000, + }, + { + name: "SkycoinCreatedTransactionInput", + ticker: Sky, + obj: &SkycoinCreatedTransactionInput{ + skyIn: api.CreatedTransactionInput{ + Coins: "20.1", + }, + }, + want: 20100000, + }, + { + name: "SkycoinCreatedTransactionInput", + ticker: Sky, + obj: &SkycoinCreatedTransactionInput{ + skyIn: api.CreatedTransactionInput{ + Coins: "20,1a", + }, + }, + err: true, + }, + { + name: "SkycoinCreatedTransactionInput", + ticker: CoinHour, + obj: &SkycoinCreatedTransactionInput{ + skyIn: api.CreatedTransactionInput{ + Hours: "42", + }, + }, + want: 42, + }, + { + name: "SkycoinCreatedTransactionInput", + ticker: CoinHour, + obj: &SkycoinCreatedTransactionInput{ + skyIn: api.CreatedTransactionInput{ + Hours: "42.1", + }, + }, + err: true, + }, + { + name: "SkycoinCreatedTransactionInput", + ticker: CalculatedHour, + obj: &SkycoinCreatedTransactionInput{ + skyIn: api.CreatedTransactionInput{ + CalculatedHours: "42", + }, + }, + want: 42, + }, + { + name: "SkycoinCreatedTransactionInput", + ticker: CalculatedHour, + obj: &SkycoinCreatedTransactionInput{ + skyIn: api.CreatedTransactionInput{ + CalculatedHours: "42.1", + }, + }, + err: true, + }, + // SkycoinTransactionInput + { + name: "SkycoinTransactionInput", + ticker: invalidTicker, + obj: new(SkycoinTransactionInput), + err: true, + }, + { + name: "SkycoinTransactionInput", + ticker: fakeTicker, + obj: new(SkycoinTransactionInput), + err: true, + }, + { + name: "SkycoinTransactionInput", + ticker: Sky, + obj: &SkycoinTransactionInput{ + skyIn: readable.TransactionInput{ + Coins: "20", + }, + }, + want: 20000000, + }, + { + name: "SkycoinTransactionInput", + ticker: Sky, + obj: &SkycoinTransactionInput{ + skyIn: readable.TransactionInput{ + Coins: "20.1", + }, + }, + want: 20100000, + }, + { + name: "SkycoinTransactionInput", + ticker: Sky, + obj: &SkycoinTransactionInput{ + skyIn: readable.TransactionInput{ + Coins: "20,1a", + }, + }, + err: true, + }, + { + name: "SkycoinTransactionInput", + ticker: CoinHour, + obj: &SkycoinTransactionInput{ + skyIn: readable.TransactionInput{ + Hours: 42, + }, + }, + want: 42, + }, + { + name: "SkycoinTransactionInput", + ticker: CalculatedHour, + obj: &SkycoinTransactionInput{ + skyIn: readable.TransactionInput{ + CalculatedHours: 42, + }, + }, + want: 42, + }, + // TransactionOutput + { + name: "SkycoinTransactionOutput", + ticker: invalidTicker, + obj: new(SkycoinTransactionOutput), + err: true, + }, + { + name: "SkycoinTransactionOutput", + ticker: fakeTicker, + obj: new(SkycoinTransactionOutput), + err: true, + }, + { + name: "SkycoinTransactionOutput", + ticker: Sky, + obj: &SkycoinTransactionOutput{ + skyOut: readable.TransactionOutput{ + Coins: "20", + }, + }, + want: 20000000, + }, + { + name: "SkycoinTransactionOutput", + ticker: Sky, + obj: &SkycoinTransactionOutput{ + skyOut: readable.TransactionOutput{ + Coins: "20.1", + }, + }, + want: 20100000, + }, + { + name: "SkycoinTransactionOutput", + ticker: Sky, + obj: &SkycoinTransactionOutput{ + skyOut: readable.TransactionOutput{ + Coins: "20,1a", + }, + }, + err: true, + }, + { + name: "SkycoinTransactionOutput", + ticker: CoinHour, + obj: &SkycoinTransactionOutput{ + skyOut: readable.TransactionOutput{ + Hours: 42, + }, + }, + want: 42, + }, + { + name: "SkycoinTransactionOutput", + ticker: CalculatedHour, + obj: &SkycoinTransactionOutput{ + calculatedHours: 42, + }, + want: 42, + }, + } + + for _, tt := range tests { + t.Run(tt.name+"-"+tt.ticker, func(t *testing.T) { + amount, err := tt.obj.GetCoins(tt.ticker) + if tt.err { + require.Error(t, err) + } else { + require.NoError(t, err) + require.Equal(t, tt.want, amount) + } + }) + } +} + +func TestGetAddress(t *testing.T) { + strAddr := makeAddress().String() + + tests := []struct { + name string + output core.TransactionOutput + err bool + want string + isNil bool + }{ + { + name: "SkycoinCreatedTransactionOutput-empty", + output: new(SkycoinCreatedTransactionOutput), + isNil: true, + }, + { + name: "SkycoinCreatedTransactionOutput-valid", + output: &SkycoinCreatedTransactionOutput{ + skyOut: api.CreatedTransactionOutput{ + Address: strAddr, + }, + }, + want: strAddr, + }, + { + name: "SkycoinTransactionOutput-empty", + output: new(SkycoinTransactionOutput), + isNil: true, + }, + { + name: "SkycoinTransactionOutput-valid", + output: &SkycoinTransactionOutput{ + skyOut: readable.TransactionOutput{ + Address: strAddr, + }, + }, + want: strAddr, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + addr, err := tt.output.GetAddress() + if err != nil { + require.Equal(t, "Invalid base58 string", err.Error()) + } + if tt.isNil { + require.Nil(t, addr) + } else { + require.NotNil(t, addr) + require.Equal(t, tt.want, addr.String()) + } + }) + } +} + +func TestSkycoinCreatedTransactionInputGetSpentOutput(t *testing.T) { + tests := []struct { + addr string + coins string + hours string + uxid string + ccHours string + }{ + {addr: makeAddress().String(), coins: "1", hours: "1", uxid: "uxid1", ccHours: "1"}, + {addr: makeAddress().String(), coins: "2", hours: "2", uxid: "uxid2", ccHours: "2"}, + {addr: makeAddress().String(), coins: "3", hours: "3", uxid: "uxid3", ccHours: "3"}, + {addr: makeAddress().String(), coins: "4", hours: "4", uxid: "uxid4", ccHours: "4"}, + {addr: makeAddress().String(), coins: "5", hours: "5", uxid: "uxid5", ccHours: "5"}, + {addr: makeAddress().String(), coins: "6", hours: "6", uxid: "uxid6", ccHours: "6"}, + } + + for i, tt := range tests { + t.Run(fmt.Sprintf("GetSepent%d", i), func(t *testing.T) { + createdIn := &SkycoinCreatedTransactionInput{ + skyIn: api.CreatedTransactionInput{ + Address: tt.addr, + Coins: tt.coins, + Hours: tt.hours, + UxID: tt.uxid, + CalculatedHours: tt.ccHours, + }, + } + output, err := createdIn.GetSpentOutput() + require.Equal(t, nil, err) + createdOut, valid := output.(*SkycoinCreatedTransactionOutput) + require.True(t, valid) + for _, asset := range createdIn.SupportedAssets() { + cur, err := createdIn.GetCoins(asset) + require.NoError(t, err) + val, err := createdOut.GetCoins(asset) + require.NoError(t, err) + require.Equal(t, cur, val) + } + require.Equal(t, createdIn.GetId(), createdOut.GetId()) + outputAddress, err := createdOut.GetAddress() + require.Equal(t, nil, err) + require.Equal(t, tt.addr, outputAddress.String()) + }) + } +} + +func Test_newCreatedTransactionOutputs(t *testing.T) { + outputs := []api.CreatedTransactionOutput{ + api.CreatedTransactionOutput{ + Address: "addr1", + }, + api.CreatedTransactionOutput{ + Address: "addr2", + }, + api.CreatedTransactionOutput{ + Address: "addr3", + }, + api.CreatedTransactionOutput{ + Address: "addr4", + }, + api.CreatedTransactionOutput{ + Address: "addr5", + }, + } + + for len(outputs) > 0 { + outs := newCreatedTransactionOutputs(outputs) + rawOutputs := make([]api.CreatedTransactionOutput, len(outputs)) + for i, out := range outs { + createdOut, valid := out.(*SkycoinCreatedTransactionOutput) + require.True(t, valid) + rawOutputs[i] = createdOut.skyOut + } + requirethat.ElementsMatch(t, outputs, rawOutputs) + outputs = outputs[:len(outputs)-1] + } +} + +func TestEncodeSkycoinTransaction(t *testing.T) { + type SkycoinReadableTxn interface { + skytypes.SkycoinTxn + skytypes.ReadableTxn + } + + date, err := time.Parse(time.RFC3339, "2012-11-01T22:08:41+00:00") + require.NoError(t, err) + + tests := []struct { + name string + txn SkycoinReadableTxn + }{ + { + name: "SkycoinPendingTransaction", + txn: &SkycoinPendingTransaction{ + Transaction: &readable.UnconfirmedTransactionVerbose{ + Transaction: readable.BlockTransactionVerbose{ + InnerHash: "0000000000000000000000000000000000000000000000000000000000000000", + Hash: "78877fa898f0b4c45c9c33ae941e40617ad7c8657a307db62bc5691f92f4f60e", + }, + Announced: date, + }, + }, + }, + { + name: "SkycoinCreatedTransaction", + txn: &SkycoinCreatedTransaction{ + skyTxn: api.CreatedTransaction{ + InnerHash: "0000000000000000000000000000000000000000000000000000000000000000", + TxID: "78877fa898f0b4c45c9c33ae941e40617ad7c8657a307db62bc5691f92f4f60e", + }, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + ser, err := tt.txn.EncodeSkycoinTransaction() + require.NoError(t, err) + exp, err := serializeCreatedTransaction(tt.txn) + require.NoError(t, err) + require.Equal(t, exp, ser) + }) + } } diff --git a/src/coin/skycoin/models/main.go b/src/coin/skycoin/models/main.go index 04d263c1..9dc65383 100644 --- a/src/coin/skycoin/models/main.go +++ b/src/coin/skycoin/models/main.go @@ -6,7 +6,6 @@ import ( "github.com/fibercrypto/fibercryptowallet/src/core" "github.com/fibercrypto/fibercryptowallet/src/errors" //local "github.com/fibercrypto/fibercryptowallet/src/main" - appParams "github.com/fibercrypto/fibercryptowallet/src/params" ) // SkyFiberPlugin provide support for SkyFiber coins @@ -100,7 +99,8 @@ func (p *SkyFiberPlugin) LoadTransactionAPI(netType string) (core.BlockchainTran if netType != "MainNet" { return nil, errors.ErrInvalidNetworkType } - return NewSkycoinBlockchain(appParams.DataRefreshTimeout), nil + refreshTimeOut := config.GetDataRefreshTimeout() + return NewSkycoinBlockchain(refreshTimeOut*(1000000000)), nil } // LoadSignService sign service entry point diff --git a/src/coin/skycoin/models/main_test.go b/src/coin/skycoin/models/main_test.go index fa5fbf50..54ed5510 100644 --- a/src/coin/skycoin/models/main_test.go +++ b/src/coin/skycoin/models/main_test.go @@ -1,26 +1,21 @@ package skycoin import ( - "github.com/fibercrypto/fibercryptowallet/src/util/logging" + "encoding/hex" + "fmt" + "github.com/stretchr/testify/mock" "os" + "sort" "testing" + "github.com/fibercrypto/fibercryptowallet/src/coin/mocks" "github.com/fibercrypto/fibercryptowallet/src/core" + "github.com/fibercrypto/fibercryptowallet/src/params" util "github.com/fibercrypto/fibercryptowallet/src/util" - "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) -var global_mock *SkycoinApiMock - -var logModelTest = logging.MustGetLogger("Skycoin Model Test") - -// CleanGlobalMock util when is needed to change the values of an - -// API method used in other test with different values. -func CleanGlobalMock() { - global_mock.ExpectedCalls = []*mock.Call{} -} - //Prepare the mock API for all test func TestMain(m *testing.M) { if global_mock == nil { @@ -34,3 +29,242 @@ func TestMain(m *testing.M) { util.RegisterAltcoin(NewSkyFiberPlugin(SkycoinMainNetParams)) os.Exit(m.Run()) } + +func TestSkyFiberPluginFunctions(t *testing.T) { + name := "SkyFiber" + family := []string{SkycoinFamily} + description := "FiberCrypto wallet connector for Skycoin and SkyFiber altcoins" + altcoins := []core.AltcoinMetadata{ + core.AltcoinMetadata{ + Name: SkycoinName, + Ticker: SkycoinTicker, + Family: SkycoinFamily, + HasBip44: false, + Accuracy: 6, + }, + core.AltcoinMetadata{ + Name: CoinHoursName, + Ticker: CoinHoursTicker, + Family: SkycoinFamily, + HasBip44: false, + Accuracy: 0, + }, + core.AltcoinMetadata{ + Name: CalculatedHoursName, + Ticker: CalculatedHoursTicker, + Family: SkycoinFamily, + HasBip44: false, + Accuracy: 0, + }, + } + cmp := func(altcoinList []core.AltcoinMetadata) { + sort.SliceStable(altcoinList, func(i, j int) bool { + return altcoinList[i].Name < altcoinList[j].Name + }) + } + + plugin := NewSkyFiberPlugin(SkycoinMainNetParams) + require.NotNil(t, plugin) + sPlugin := plugin.(*SkyFiberPlugin) + require.NotNil(t, sPlugin) + require.Equal(t, SkycoinMainNetParams, sPlugin.Params) + require.Equal(t, name, plugin.GetName()) + require.Equal(t, description, plugin.GetDescription()) + + pluginFamily := plugin.ListSupportedFamilies() + sort.Strings(pluginFamily) + sort.Strings(family) + require.Equal(t, family, pluginFamily) + + pluginAltcoins := plugin.ListSupportedAltcoins() + cmp(pluginAltcoins) + cmp(altcoins) + require.Equal(t, altcoins, pluginAltcoins) + + signer, err := plugin.LoadSignService() + require.Nil(t, err) + require.NotNil(t, signer) + require.IsType(t, new(SkycoinSignService), signer) +} + +func TestSkyFiberPluginRegisterTo(t *testing.T) { + plugin := NewSkyFiberPlugin(SkycoinMainNetParams) + altcoins := plugin.ListSupportedAltcoins() + + manager := new(mocks.AltcoinManager) + manager.On("RegisterAltcoin", mock.AnythingOfType("core.AltcoinMetadata"), plugin).Return().Run( + func(args mock.Arguments) { + meta := args.Get(0).(core.AltcoinMetadata) + idx := -1 + for i, altcoin := range altcoins { + if altcoin == meta { + idx = i + break + } + } + require.NotEqual(t, -1, idx) + altcoins[idx] = altcoins[len(altcoins)-1] + altcoins = altcoins[:len(altcoins)-1] + }, + ) + plugin.RegisterTo(manager) + require.Equal(t, 0, len(altcoins)) +} + +func TestSkyFiberPluginNetOperations(t *testing.T) { + plugin := NewSkyFiberPlugin(SkycoinMainNetParams) + net, invalidNet := "MainNet", "custom-net%d" + + for i := 10; i < 20; i++ { + name := fmt.Sprintf(invalidNet, i) + t.Run(name, func(t *testing.T) { + pex, err := plugin.LoadPEX(name) + require.Nil(t, pex) + require.NotNil(t, err) + + api, err1 := plugin.LoadTransactionAPI(name) + require.Nil(t, api) + require.NotNil(t, err1) + }) + } + t.Run(net, func(t *testing.T) { + pex, err := plugin.LoadPEX(net) + require.Nil(t, err) + require.IsType(t, new(SkycoinPEX), pex) + spex := pex.(*SkycoinPEX) + require.Equal(t, PoolSection, spex.poolSection) + + api, err1 := plugin.LoadTransactionAPI(net) + require.Nil(t, err1) + require.IsType(t, new(SkycoinBlockchain), api) + sAPI := api.(*SkycoinBlockchain) + require.Equal(t, uint64(params.DataRefreshTimeout*1000000000), sAPI.CacheTime) + }) +} + +func TestSkyFiberPluginAddressFromString(t *testing.T) { + tests := []struct { + name string + args string + wantErr bool + }{ + { + name: "address1", + args: "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + wantErr: false, + }, + { + name: "address2", + args: "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + wantErr: false, + }, + { + name: "empty", + args: "", + wantErr: true, + }, + { + name: "invalid character", + args: "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947", + wantErr: true, + }, + { + name: "invalid checksum", + args: "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKk", + wantErr: true, + }, + } + + plugin := NewSkyFiberPlugin(SkycoinMainNetParams) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + addr, err := plugin.AddressFromString(tt.args) + if tt.wantErr { + require.NotNil(t, err) + } else { + require.Nil(t, err) + require.IsType(t, new(SkycoinAddress), addr) + } + }) + } +} + +func TestSkyFiberPluginPubKeyFromBytes(t *testing.T) { + pubkeyFromHex := func(s string) []byte { + b, err := hex.DecodeString(s) + require.NoError(t, err) + return b + } + tests := []struct { + name string + pubkHex string + wantErr bool + }{ + {name: "OK", pubkHex: "034f1e3f2391bd3670151fd4fa3accc6a0273885984404089e5b846871db4c5304", wantErr: false}, + {name: "wrong", pubkHex: "0213c9273d9f944c3d907bfe844090ecef3d9504c88c5165cb690de98125a4e4", wantErr: true}, + {name: "OK2", pubkHex: "0304eb48d7c0b3a915d0f53c6d966f4d9fa75df645e63dfb91d589592790943613", wantErr: false}, + } + + plugin := NewSkyFiberPlugin(SkycoinMainNetParams) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + sPk, err := plugin.PubKeyFromBytes(pubkeyFromHex(tt.pubkHex)) + if tt.wantErr { + require.Error(t, err) + return + } + require.IsType(t, new(SkycoinPubKey), sPk) + got := sPk.(*SkycoinPubKey) + require.NoError(t, err) + assert.Equal(t, pubkeyFromHex(tt.pubkHex), got.Bytes()) + assert.Equal(t, tt.pubkHex, got.pubkey.Hex()) + require.NoError(t, got.Verify()) + assert.False(t, got.Null()) + spk, err := toSkycoinPubKey(got) + require.NoError(t, err) + assert.Equal(t, spk.Hex(), tt.pubkHex) + require.NoError(t, spk.Verify()) + assert.False(t, spk.Null()) + }) + } +} + +func TestSkyFiberPluginSecKeyFromBytes(t *testing.T) { + pubkeyFromHex := func(s string) []byte { + b, err := hex.DecodeString(s) + require.NoError(t, err) + return b + } + tests := []struct { + name string + pubkHex string + wantErr bool + }{ + {name: "OK", pubkHex: "c9135a2b667eb0847fb7ad3d1ae58a1ea2d0c38526c8948b520417dcab618563", wantErr: false}, + {name: "wrong", pubkHex: "0213c9273d9f944c3d907bfe844090ecef3d9504c88c5165cb690de985a4e4", wantErr: true}, + {name: "OK2", pubkHex: "408ea9aef71391071d275f8255bd9b6d22d5d5a22e6ab2bfc54307fb273d468c", wantErr: false}, + } + + plugin := NewSkyFiberPlugin(SkycoinMainNetParams) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + sSk, err := plugin.SecKeyFromBytes(pubkeyFromHex(tt.pubkHex)) + if tt.wantErr { + require.Error(t, err) + return + } + require.IsType(t, new(SkycoinSecKey), sSk) + got := sSk.(*SkycoinSecKey) + require.NoError(t, err) + assert.Equal(t, pubkeyFromHex(tt.pubkHex), got.Bytes()) + assert.Equal(t, tt.pubkHex, got.seckey.Hex()) + require.NoError(t, got.Verify()) + assert.False(t, got.Null()) + spk, err := toSkycoinSecKey(got) + require.NoError(t, err) + assert.Equal(t, spk.Hex(), tt.pubkHex) + require.NoError(t, spk.Verify()) + assert.False(t, spk.Null()) + }) + } +} diff --git a/src/coin/skycoin/models/network.go b/src/coin/skycoin/models/network.go index 2c67907c..dc1a583a 100644 --- a/src/coin/skycoin/models/network.go +++ b/src/coin/skycoin/models/network.go @@ -2,8 +2,10 @@ package skycoin import ( "encoding/hex" + "strings" "github.com/SkycoinProject/skycoin/src/api" + "github.com/SkycoinProject/skycoin/src/readable" "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/skytypes" "github.com/fibercrypto/fibercryptowallet/src/core" "github.com/fibercrypto/fibercryptowallet/src/errors" @@ -50,17 +52,16 @@ func NewSkycoinApiClient(section string) (skytypes.SkycoinAPI, error) { return nil, err } - obj := pool.Get() + obj, err := pool.Get() if err != nil { - for _, ok := err.(core.NotAvailableObjectsError); ok; _, ok = err.(core.NotAvailableObjectsError) { - if err == nil { - break - } + for err == errors.ErrObjectPoolUndeflow { + obj, err = pool.Get() + } + if err != nil { + return nil, err } - return nil, err } - skyApi, ok := obj.(skytypes.SkycoinAPI) if !ok { logNetwork.Errorf("There is no proper client in %s pool", section) @@ -131,7 +132,108 @@ func (spex *SkycoinPEX) GetTxnPool() (core.TransactionIterator, error) { } skycoinTxns := make([]core.Transaction, 0) for _, txn := range txns { - skycoinTxns = append(skycoinTxns, &SkycoinPendingTransaction{Transaction: txn}) + t := txn + skycoinTxns = append(skycoinTxns, &SkycoinPendingTransaction{Transaction: &t}) } return NewSkycoinTransactionIterator(skycoinTxns), nil } + +type SkycoinPexNodeIterator struct { + //Implements PexNodeIterator interface + current int + networks []core.PexNode +} + +func (it *SkycoinPexNodeIterator) Value() core.PexNode { + return it.networks[it.current] +} + +func (it *SkycoinPexNodeIterator) Next() bool { + if it.HasNext() { + it.current++ + return true + } + return false +} + +func (it *SkycoinPexNodeIterator) HasNext() bool { + return !((it.current + 1) >= len(it.networks)) +} + +func NewSkycoinPexNodeIterator(network []core.PexNode) *SkycoinPexNodeIterator { + return &SkycoinPexNodeIterator{networks: network, current: -1} +} + +type SkycoinNetworkConnections struct { + //Implements NetworkSet interface + nodeAddress string +} + +func NewSkycoinRemoteNetwork(nodeAddress string) *SkycoinNetworkConnections { + return &SkycoinNetworkConnections{nodeAddress} +} + +func (remoteNetwork *SkycoinNetworkConnections) newClient() *api.Client { + return api.NewClient(remoteNetwork.nodeAddress) +} + +func (remoteNetwork *SkycoinNetworkConnections) ListPeers() core.PexNodeIterator { + logNetwork.Info("Getting list of peers in Skycoin network connections") + c := remoteNetwork.newClient() + nets, err := c.NetworkConnections(nil) + + if err != nil { + logNetwork.WithError(err).Warn("Couldn't get connections") + return nil + } + var netIterator []core.PexNode + for _, con := range nets.Connections { + netIterator = append(netIterator, connectionsToNetwork(con)) + } + + return NewSkycoinPexNodeIterator(netIterator) +} + +type SkycoinPexNode struct { + Ip string + Port uint16 + Source bool + Block uint64 + LastSeenIn int64 + LastSeenOut int64 +} + +func (network *SkycoinPexNode) GetIp() string { + return network.Ip +} + +func (network *SkycoinPexNode) GetPort() uint16 { + return network.Port +} + +func (network *SkycoinPexNode) GetBlockHeight() uint64 { + return network.Block +} + +func (network *SkycoinPexNode) IsTrusted() bool { + return network.Source +} + +func (network *SkycoinPexNode) GetLastSeenIn() int64 { + return network.LastSeenIn +} + +func (network *SkycoinPexNode) GetLastSeenOut() int64 { + return network.LastSeenOut +} + +func connectionsToNetwork(connection readable.Connection) *SkycoinPexNode { + return &SkycoinPexNode{ + Ip: strings.Split(connection.Addr, ":")[0], + Port: connection.ListenPort, + LastSeenIn: connection.LastSent, + LastSeenOut: connection.LastReceived, + Block: connection.Height, + Source: connection.IsTrustedPeer, + } +} diff --git a/src/coin/skycoin/models/network_test.go b/src/coin/skycoin/models/network_test.go index 9ba5f489..af1bc94d 100644 --- a/src/coin/skycoin/models/network_test.go +++ b/src/coin/skycoin/models/network_test.go @@ -9,6 +9,8 @@ import ( "github.com/stretchr/testify/require" "github.com/SkycoinProject/skycoin/src/readable" + "github.com/fibercrypto/fibercryptowallet/src/coin/mocks" + "github.com/fibercrypto/fibercryptowallet/src/core" ) func TestSkycoinPEXGetTxnPool(t *testing.T) { @@ -91,3 +93,46 @@ func TestSkycoinPEXBroadcastTxn(t *testing.T) { err = pex.BroadcastTxn(skyTxn) require.NoError(t, err) } + +func TestSkycoinPexNode(t *testing.T) { + addr := "addr" + port := uint16(8000) + sent := int64(20) + received := int64(42) + height := uint64(200) + trusted := true + + conn := readable.Connection{ + Addr: addr, + ListenPort: port, + LastSent: sent, + LastReceived: received, + Height: height, + IsTrustedPeer: trusted, + } + pex := connectionsToNetwork(conn) + + require.Equal(t, addr, pex.GetIp()) + require.Equal(t, port, pex.GetPort()) + require.Equal(t, sent, pex.GetLastSeenIn()) + require.Equal(t, received, pex.GetLastSeenOut()) + require.Equal(t, height, pex.GetBlockHeight()) + require.Equal(t, trusted, pex.IsTrusted()) +} + +func TestSkycoinPexNodeIterator(t *testing.T) { + pexs := make([]core.PexNode, 0) + addrs := []string{"addr1", "addr2", "addr3"} + for _, addr := range addrs { + pex := &mocks.PexNode{} + pex.On("GetIp").Return(addr) + pexs = append(pexs, pex) + } + + it := NewSkycoinPexNodeIterator(pexs) + for _, addr := range addrs { + require.Equal(t, true, it.Next()) + require.Equal(t, addr, it.Value().GetIp()) + } + require.Equal(t, false, it.Next()) +} diff --git a/src/coin/skycoin/models/networking.go b/src/coin/skycoin/models/networking.go deleted file mode 100644 index 43b486a1..00000000 --- a/src/coin/skycoin/models/networking.go +++ /dev/null @@ -1,109 +0,0 @@ -package skycoin - -import ( - "strings" - - "github.com/SkycoinProject/skycoin/src/api" - "github.com/SkycoinProject/skycoin/src/readable" - "github.com/fibercrypto/fibercryptowallet/src/core" -) - -type SkycoinPexNodeIterator struct { - //Implements PexNodeIterator interface - current int - networks []core.PexNode -} - -func (it *SkycoinPexNodeIterator) Value() core.PexNode { - return it.networks[it.current] -} - -func (it *SkycoinPexNodeIterator) Next() bool { - if it.HasNext() { - it.current++ - return true - } - return false -} - -func (it *SkycoinPexNodeIterator) HasNext() bool { - return !((it.current + 1) >= len(it.networks)) -} - -func NewSkycoinPexNodeIterator(network []core.PexNode) *SkycoinPexNodeIterator { - return &SkycoinPexNodeIterator{networks: network, current: -1} -} - -type SkycoinNetworkConnections struct { - //Implements NetworkSet interface - nodeAddress string -} - -func NewSkycoinRemoteNetwork(nodeAddress string) *SkycoinNetworkConnections { - return &SkycoinNetworkConnections{nodeAddress} -} - -func (remoteNetwork *SkycoinNetworkConnections) newClient() *api.Client { - return api.NewClient(remoteNetwork.nodeAddress) -} - -func (remoteNetwork *SkycoinNetworkConnections) ListPeers() core.PexNodeIterator { - logNetwork.Info("Getting list of peers in Skycoin network connections") - c := remoteNetwork.newClient() - nets, err := c.NetworkConnections(nil) - - if err != nil { - logNetwork.WithError(err).Warn("Couldn't get connections") - return nil - } - var netIterator []core.PexNode - for _, con := range nets.Connections { - netIterator = append(netIterator, connectionsToNetwork(con)) - } - - return NewSkycoinPexNodeIterator(netIterator) -} - -type SkycoinPexNode struct { - Ip string - Port uint16 - Source bool - Block uint64 - LastSeenIn int64 - LastSeenOut int64 -} - -func (network *SkycoinPexNode) GetIp() string { - return network.Ip -} - -func (network *SkycoinPexNode) GetPort() uint16 { - return network.Port -} - -func (network *SkycoinPexNode) GetBlockHeight() uint64 { - return network.Block -} - -func (network *SkycoinPexNode) IsTrusted() bool { - return network.Source -} - -func (network *SkycoinPexNode) GetLastSeenIn() int64 { - return network.LastSeenIn -} - -func (network *SkycoinPexNode) GetLastSeenOut() int64 { - return network.LastSeenOut -} - -func connectionsToNetwork(connection readable.Connection) *SkycoinPexNode { - return &SkycoinPexNode{ - Ip: strings.Split(connection.Addr, ":")[0], - Port: connection.ListenPort, - LastSeenIn: connection.LastSent, - LastSeenOut: connection.LastReceived, - Block: connection.Height, - Source: connection.IsTrustedPeer, - } -} diff --git a/src/coin/skycoin/models/sky_test.go b/src/coin/skycoin/models/sky_test_utils.go similarity index 99% rename from src/coin/skycoin/models/sky_test.go rename to src/coin/skycoin/models/sky_test_utils.go index 6367f3e3..714bbadf 100644 --- a/src/coin/skycoin/models/sky_test.go +++ b/src/coin/skycoin/models/sky_test_utils.go @@ -1,3 +1,5 @@ +// This file comes from Skycoin projects as is + package skycoin /** diff --git a/src/coin/skycoin/models/skyapi_mock_test.go b/src/coin/skycoin/models/skyapi_test_mocks.go similarity index 94% rename from src/coin/skycoin/models/skyapi_mock_test.go rename to src/coin/skycoin/models/skyapi_test_mocks.go index 6459f5ba..df28c4bd 100644 --- a/src/coin/skycoin/models/skyapi_mock_test.go +++ b/src/coin/skycoin/models/skyapi_test_mocks.go @@ -1,6 +1,7 @@ package skycoin import ( + "errors" "github.com/SkycoinProject/skycoin/src/api" "github.com/SkycoinProject/skycoin/src/cipher" "github.com/SkycoinProject/skycoin/src/coin" @@ -67,7 +68,7 @@ func mockSkyApiCreateTransaction(mock *SkycoinApiMock, req *api.CreateTransactio nil) } -func mockSkyApiOutputsForAddresses(mock *SkycoinApiMock, addresses []string) { +func mockSkyApiOutputsForAddresses(mock *SkycoinApiMock, addresses []string, isValid bool) { usOut := readable.UnspentOutput{ Hash: "hash1", Coins: "42", @@ -80,12 +81,21 @@ func mockSkyApiOutputsForAddresses(mock *SkycoinApiMock, addresses []string) { } for _, addr := range addresses { + if isValid { + mock.On( + "OutputsForAddresses", + []string{ + addr, + }, + ).Return(nil, errors.New("error")) + } mock.On( "OutputsForAddresses", []string{ addr, }, ).Return(response, nil) + } } diff --git a/vendor/github.com/spf13/pflag/go.sum b/src/coin/skycoin/models/testdata/empty_file.txt similarity index 100% rename from vendor/github.com/spf13/pflag/go.sum rename to src/coin/skycoin/models/testdata/empty_file.txt diff --git a/src/coin/skycoin/models/testdata/encrypted.wlt b/src/coin/skycoin/models/testdata/encrypted.wlt new file mode 100644 index 00000000..6d71b844 --- /dev/null +++ b/src/coin/skycoin/models/testdata/encrypted.wlt @@ -0,0 +1,39 @@ +{ + "meta": { + "coin": "skycoin", + "cryptoType": "scrypt-chacha20poly1305", + "encrypted": "true", + "filename": "encrypted.wlt", + "label": "encryptedWallet", + "lastSeed": "", + "secrets": "dgB7Im4iOjEwNDg1NzYsInIiOjgsInAiOjEsImtleUxlbiI6MzIsInNhbHQiOiJPMHJQVnVaN3pVNkVjR3VKZEdGa1JoOEpsSUlCSGFRaGpKdU5PZ1luNlRrPSIsIm5vbmNlIjoiQ3lkTkkvWW9uZVdWVUQ2UyJ9sDLgFFSj4bBk+2YFGBZ7MINb/dYv0x0ktFmRJgxzRVYnkqlhYXL5PO/S7Mg3iNKSkT6y41VAQ6LOAsUphMUiKE4wnvaD6ZKBFKiBPY/1ZPj+RRZ7wqSnLeOw1pNOXDvCGVI4n8YL9KHQNZNVDqHkrNZQs5dx9HuFr/m9NMtcs6MAHcMekNgmy7V+UOOwLyCZlXwLNk+vy6TVX2/e4w3ej/8yrJM6dEOJ6GU/jz0h8slBHYm3jWZQm+G1M9M5Mcy9gqwKjkLpkyijQ0rk8c57UzgzYHrFOkFihH9ebXaywR107ZxqcYl61lVaVZVZDpx+CFyt2LzhvdWg/IqqlIud6MOWgaedGn3+w2KHGYn9MmoK0kCEOVadnJ/iyiwuMeYFvq/iKprrii/6JAptcPGW4NZnD5e88YZmsYKHv1Okl72amcCvEuIbwoQCh8AuDmQrmEn1O6dUcwDrlXB8p7krnrN1HTx+8FrsCzQdqw8D0h8QNLVKdJG4bX0LsdhIyMAdyEt/sVZUwxtnjtWWET75Xq9lRYNONWlDlWx5XweVtT31EioqYnYBJm1Ytdb8X/Jocrx0ZJb8HYZr1x12Ucv12pHUJCBl3OhoTI+d32Kp65PAPDPPfQNuyKgDvufRKoNY1qZdcGJbkbM5TxqZCHVuIwNftw8XEEl13xYqILTMa1OX/8uLEgbTABpj8CxAkCMsngWK73sC+3gJObrfx09DMLLGhCM6meLvwPEziF3/txnz2uEjSydJIohdRW5sKZLxEgWRz3IOc9KaQ4DuSpPsDagi2JtR", + "seed": "", + "seedPassphrase": "", + "tm": "1570488803", + "type": "deterministic", + "version": "0.4", + "xpub": "" + }, + "entries": [ + { + "address": "2HPiZkMTD2pB9FZ6HbCxFSXa1FGeNkLeEbP", + "public_key": "02f44d54e8441cb75f55391c0a9984492fef21ddd07ee05b08603d7af91e523fa5", + "secret_key": "" + }, + { + "address": "7wqRjpVwg5uSsz72oAZcDrBevHQRHQudyj", + "public_key": "020d5eb1e7e3182f3b5209092acd9fce68cc8e7cfeb868e13c8be7ab6dda3f5665", + "secret_key": "" + }, + { + "address": "2G9wDPX14WsbZuZU1f7MveYc9vpLxj2qNsz", + "public_key": "039370e0427b2d574f3ee8a3e61648d5dc39c1f94495da21fbb0ba09bddfde0b42", + "secret_key": "" + }, + { + "address": "6gnBM5gMSSb7XRUEap7q3WxFnuvbN9usTq", + "public_key": "03bc0991c9b798499062ebb2a615076dc47757ac67c19368607643d58cc3c3a5c7", + "secret_key": "" + } + ] +} \ No newline at end of file diff --git a/src/coin/skycoin/models/testdata/invalid/wallets/empty_wallet.wlt b/src/coin/skycoin/models/testdata/invalid/wallets/empty_wallet.wlt new file mode 100644 index 00000000..e69de29b diff --git a/src/coin/skycoin/models/testdata/original_files/encrypted.wlt b/src/coin/skycoin/models/testdata/original_files/encrypted.wlt new file mode 100644 index 00000000..6d71b844 --- /dev/null +++ b/src/coin/skycoin/models/testdata/original_files/encrypted.wlt @@ -0,0 +1,39 @@ +{ + "meta": { + "coin": "skycoin", + "cryptoType": "scrypt-chacha20poly1305", + "encrypted": "true", + "filename": "encrypted.wlt", + "label": "encryptedWallet", + "lastSeed": "", + "secrets": "dgB7Im4iOjEwNDg1NzYsInIiOjgsInAiOjEsImtleUxlbiI6MzIsInNhbHQiOiJPMHJQVnVaN3pVNkVjR3VKZEdGa1JoOEpsSUlCSGFRaGpKdU5PZ1luNlRrPSIsIm5vbmNlIjoiQ3lkTkkvWW9uZVdWVUQ2UyJ9sDLgFFSj4bBk+2YFGBZ7MINb/dYv0x0ktFmRJgxzRVYnkqlhYXL5PO/S7Mg3iNKSkT6y41VAQ6LOAsUphMUiKE4wnvaD6ZKBFKiBPY/1ZPj+RRZ7wqSnLeOw1pNOXDvCGVI4n8YL9KHQNZNVDqHkrNZQs5dx9HuFr/m9NMtcs6MAHcMekNgmy7V+UOOwLyCZlXwLNk+vy6TVX2/e4w3ej/8yrJM6dEOJ6GU/jz0h8slBHYm3jWZQm+G1M9M5Mcy9gqwKjkLpkyijQ0rk8c57UzgzYHrFOkFihH9ebXaywR107ZxqcYl61lVaVZVZDpx+CFyt2LzhvdWg/IqqlIud6MOWgaedGn3+w2KHGYn9MmoK0kCEOVadnJ/iyiwuMeYFvq/iKprrii/6JAptcPGW4NZnD5e88YZmsYKHv1Okl72amcCvEuIbwoQCh8AuDmQrmEn1O6dUcwDrlXB8p7krnrN1HTx+8FrsCzQdqw8D0h8QNLVKdJG4bX0LsdhIyMAdyEt/sVZUwxtnjtWWET75Xq9lRYNONWlDlWx5XweVtT31EioqYnYBJm1Ytdb8X/Jocrx0ZJb8HYZr1x12Ucv12pHUJCBl3OhoTI+d32Kp65PAPDPPfQNuyKgDvufRKoNY1qZdcGJbkbM5TxqZCHVuIwNftw8XEEl13xYqILTMa1OX/8uLEgbTABpj8CxAkCMsngWK73sC+3gJObrfx09DMLLGhCM6meLvwPEziF3/txnz2uEjSydJIohdRW5sKZLxEgWRz3IOc9KaQ4DuSpPsDagi2JtR", + "seed": "", + "seedPassphrase": "", + "tm": "1570488803", + "type": "deterministic", + "version": "0.4", + "xpub": "" + }, + "entries": [ + { + "address": "2HPiZkMTD2pB9FZ6HbCxFSXa1FGeNkLeEbP", + "public_key": "02f44d54e8441cb75f55391c0a9984492fef21ddd07ee05b08603d7af91e523fa5", + "secret_key": "" + }, + { + "address": "7wqRjpVwg5uSsz72oAZcDrBevHQRHQudyj", + "public_key": "020d5eb1e7e3182f3b5209092acd9fce68cc8e7cfeb868e13c8be7ab6dda3f5665", + "secret_key": "" + }, + { + "address": "2G9wDPX14WsbZuZU1f7MveYc9vpLxj2qNsz", + "public_key": "039370e0427b2d574f3ee8a3e61648d5dc39c1f94495da21fbb0ba09bddfde0b42", + "secret_key": "" + }, + { + "address": "6gnBM5gMSSb7XRUEap7q3WxFnuvbN9usTq", + "public_key": "03bc0991c9b798499062ebb2a615076dc47757ac67c19368607643d58cc3c3a5c7", + "secret_key": "" + } + ] +} \ No newline at end of file diff --git a/src/coin/skycoin/models/testdata/original_files/test.wlt b/src/coin/skycoin/models/testdata/original_files/test.wlt new file mode 100644 index 00000000..d782322c --- /dev/null +++ b/src/coin/skycoin/models/testdata/original_files/test.wlt @@ -0,0 +1,39 @@ +{ + "meta": { + "coin": "skycoin", + "cryptoType": "", + "encrypted": "false", + "filename": "2019_10_07_12e8.wlt", + "label": "testWallet", + "lastSeed": "51d1bad7d472e05929d4a28958721a90b9cf62eed28eddee0e9c3f55d2066ce0", + "secrets": "", + "seed": "wire junk original sword bread bottom armor dog snow accident inform rigid", + "seedPassphrase": "", + "tm": "1570488803", + "type": "deterministic", + "version": "0.4", + "xpub": "" + }, + "entries": [ + { + "address": "2HPiZkMTD2pB9FZ6HbCxFSXa1FGeNkLeEbP", + "public_key": "02f44d54e8441cb75f55391c0a9984492fef21ddd07ee05b08603d7af91e523fa5", + "secret_key": "0df00cbd9535e0780aeeba181316aa45f8e18c651627a46b84eb80546ef302c9" + }, + { + "address": "7wqRjpVwg5uSsz72oAZcDrBevHQRHQudyj", + "public_key": "020d5eb1e7e3182f3b5209092acd9fce68cc8e7cfeb868e13c8be7ab6dda3f5665", + "secret_key": "8cf141d5e1e78fb6285b8a9867685096cd6a1a6290e4d310c2a4df26a9d0758a" + }, + { + "address": "2G9wDPX14WsbZuZU1f7MveYc9vpLxj2qNsz", + "public_key": "039370e0427b2d574f3ee8a3e61648d5dc39c1f94495da21fbb0ba09bddfde0b42", + "secret_key": "03ac930c65b6ac9fcd35b2978a4ca45c7604660dc8c397658da56748d7651b7d" + }, + { + "address": "6gnBM5gMSSb7XRUEap7q3WxFnuvbN9usTq", + "public_key": "03bc0991c9b798499062ebb2a615076dc47757ac67c19368607643d58cc3c3a5c7", + "secret_key": "7418dd56fc6fef3943673c534bc4d21bfb00f18bf4ffacf8c6e06489299ca26a" + } + ] +} diff --git a/src/coin/skycoin/models/testdata/test.wlt b/src/coin/skycoin/models/testdata/test.wlt index d782322c..d7c9d036 100644 --- a/src/coin/skycoin/models/testdata/test.wlt +++ b/src/coin/skycoin/models/testdata/test.wlt @@ -3,7 +3,7 @@ "coin": "skycoin", "cryptoType": "", "encrypted": "false", - "filename": "2019_10_07_12e8.wlt", + "filename": "test.wlt", "label": "testWallet", "lastSeed": "51d1bad7d472e05929d4a28958721a90b9cf62eed28eddee0e9c3f55d2066ce0", "secrets": "", @@ -36,4 +36,4 @@ "secret_key": "7418dd56fc6fef3943673c534bc4d21bfb00f18bf4ffacf8c6e06489299ca26a" } ] -} +} \ No newline at end of file diff --git a/src/coin/skycoin/models/testsutils.go b/src/coin/skycoin/models/testsutils.go new file mode 100644 index 00000000..6efb0454 --- /dev/null +++ b/src/coin/skycoin/models/testsutils.go @@ -0,0 +1,299 @@ +package skycoin + +import ( + "github.com/SkycoinProject/skycoin/src/wallet" + "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/testsuite" + "github.com/fibercrypto/fibercryptowallet/src/core" + "github.com/fibercrypto/fibercryptowallet/src/util" + "github.com/fibercrypto/fibercryptowallet/src/util/logging" + "github.com/SkycoinProject/skycoin/src/cipher" + skytestsuite "github.com/SkycoinProject/skycoin/src/cipher/testsuite" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/util/file" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + "io/ioutil" + "path/filepath" + "strings" + "testing" +) + +func makeUninjectedTransaction(t *testing.T, txn *coin.Transaction, fee uint64) *SkycoinUninjectedTransaction { + if txn == nil { + skyTxn, err := makeTransaction(t) + require.NoError(t, err) + txn = &skyTxn + } + uitxn, err := NewUninjectedTransaction(txn, fee) + require.NoError(t, err) + return uitxn +} + +func makeLocalWallet(t *testing.T) core.Wallet { + _, kd, err := makeUxOutWithSecret(t) + require.NoError(t, err) + require.NoError(t, err) + wallets := makeLocalWalletsFromKeyData(t, []KeyData{*kd}) + wallet := wallets[0] + seed, seckeys, err2 := cipher.GenerateDeterministicKeyPairsSeed([]byte(kd.Mnemonic), kd.AddressIndex+1) + require.NoError(t, err2) + require.Equal(t, kd.SecKey, seckeys[kd.AddressIndex]) + _, _, err3 := cipher.GenerateDeterministicKeyPair(seed) + require.NoError(t, err3) + wallet.GenAddresses(core.AccountAddress, uint32(kd.AddressIndex), 2, nil) + return wallet +} + +var ( + tmpWalletDir string + testWalletEnv core.WalletEnv +) + +func loadTestWalletEnv(t *testing.T) core.WalletEnv { + if tmpWalletDir == "" { + tmpDir, err := ioutil.TempDir("", testsuite.TestIDToken) + require.NoError(t, err) + tmpWalletDir = tmpDir + } + if testWalletEnv == nil { + testWalletEnv = NewWalletDirectory(tmpWalletDir) + } + return testWalletEnv +} + +var whitespaceReplacer = strings.NewReplacer(" ", "-") + +func makeLocalWalletsFromKeyData(t *testing.T, keysData []KeyData) []core.Wallet { + walletsCache := make(map[string]core.Wallet) + wallets := make([]core.Wallet, len(keysData)) + walletSet := loadTestWalletEnv(t).GetWalletSet() + for i, kd := range keysData { + walletID := whitespaceReplacer.Replace(kd.Mnemonic) + var w core.Wallet + var isFound bool + var err error + if w, isFound = walletsCache[kd.Mnemonic]; !isFound { + if w = walletSet.GetWallet(walletID); w == nil { + w, err = walletSet.CreateWallet(walletID, kd.Mnemonic, wallet.WalletTypeDeterministic, false, util.EmptyPassword, 0) + require.NoError(t, err) + } + walletsCache[kd.Mnemonic] = w + } + wallets[i] = w + w.GenAddresses(core.AccountAddress, 0, uint32(kd.AddressIndex + 100), nil) + w.GenAddresses(core.ChangeAddress, 0, uint32(kd.AddressIndex + 100), nil) + } + return wallets +} + +type TransferOptions struct { + values map[string]interface{} +} + +func (tOpt *TransferOptions) GetValue(key string) interface{} { + return tOpt.values[key] +} + +func (tOpt *TransferOptions) SetValue(key string, value interface{}) { + tOpt.values[key] = value +} + +// GenerateTestKeyPair provides deterministic sequence of test keys +// that can be recovered later inside a wallet +func GenerateTestKeyPair(t *testing.T) (*KeyData, error) { + var err error + if seedEntropy == nil { + // Load suite test data + fn := filepath.Join(testsuite.GetSkycoinCipherTestDataDir(), testsuite.ManyAddressesFilename) + + var dataJSON skytestsuite.SeedTestDataJSON + err := file.LoadJSON(fn, &dataJSON) + require.NoError(t, err) + + data, err := skytestsuite.SeedTestDataFromJSON(&dataJSON) + require.NoError(t, err) + + // Initialize internal test state + seedEntropy = []byte(data.Seed) + seedContinuation = seedEntropy + seedMnemonic = string(data.Seed) + seedData = data + seedPairIndex = 0 + } + + var keytestData KeyData + seedContinuation, keytestData.PubKey, keytestData.SecKey, err = cipher.DeterministicKeyPairIterator(seedContinuation) + if err != nil { + return nil, err + } + keytestData.Mnemonic = seedMnemonic + keytestData.Entropy = seedEntropy + keytestData.AddressIndex = seedPairIndex + seedPairIndex++ + if keytestData.AddressIndex < len(seedData.Keys) { + // Confirm that deterministic address sequence is correct + require.Equal(t, seedData.Keys[keytestData.AddressIndex].Public, keytestData.PubKey) + require.Equal(t, seedData.Keys[keytestData.AddressIndex].Secret, keytestData.SecKey) + } + return &keytestData, nil +} + +var global_mock *SkycoinApiMock + +var logModelTest = logging.MustGetLogger("Skycoin Model Test") +// API method used in other test with different values. + +// CleanGlobalMock util when is needed to change the values of an +func CleanGlobalMock() { + if global_mock == nil { + global_mock = new(SkycoinApiMock) + } else { + global_mock.ExpectedCalls = []*mock.Call{} + } +} + +func SetGlobalMock(mock *SkycoinApiMock) { + global_mock = mock +} + +func GetGlobalMock() *SkycoinApiMock { + return global_mock +} + +func TransactionSignInputTestSkyHwImpl(t *testing.T, signers []core.TxnSigner, setWallet func(*testing.T, core.TxnSigner, core.Wallet)) { + _, keysData, _, err := makeTransactionMultipleInputs(t, 3) + require.NoError(t, err) + // Load local wallets + wallets := makeLocalWalletsFromKeyData(t, keysData) + for idx := range signers { + setWallet(t, signers[idx], wallets[idx]) + } + TransactionSignInputTestImpl(t, signers) +} + +func TransactionSignInputTestImpl(t *testing.T, signers []core.TxnSigner) { + txn, keysData, uxspent, err := makeTransactionMultipleInputs(t, 3) + require.NoError(t, err) + // Mock UxOut API calls + for _, ux := range uxspent { + mockSkyApiUxOut(global_mock, ux) + } + + uiTxn := makeUninjectedTransaction(t, &txn, 1) + var signedCoreTxn core.Transaction + var isFullySigned bool + isFullySigned, err = uiTxn.IsFullySigned() + require.NoError(t, err) + require.True(t, isFullySigned) + + // Load local wallets + wallets := makeLocalWalletsFromKeyData(t, keysData) + for _, signer := range signers { + err = util.AttachSignService(signer) + require.NoError(t, err) + } + + // Input is already signed + var signer core.TxnSigner + if len(signers) > 0 { + signer = signers[0] + } + _, err = wallets[0].Sign(uiTxn, signer, util.EmptyPassword, []string{"#0"}) + testutil.RequireError(t, err, "Transaction is fully signed") + isFullySigned, err = uiTxn.IsFullySigned() + require.NoError(t, err) + require.True(t, isFullySigned) + + // Input is not signed + txn.Sigs[1] = cipher.Sig{} + isFullySigned, err = uiTxn.IsFullySigned() + require.NoError(t, err) + require.False(t, isFullySigned) + if len(signers) > 1 { + signer = signers[1] + } + signedCoreTxn, err = wallets[1].Sign(uiTxn, signer, nil, []string{"#1"}) + require.NoError(t, err) + signedTxn, isUninjected := signedCoreTxn.(*SkycoinUninjectedTransaction) + require.True(t, isUninjected) + require.NotEqual(t, uiTxn.txn, signedTxn.txn) + isFullySigned, err = uiTxn.IsFullySigned() + require.NoError(t, err) + require.False(t, isFullySigned) + isFullySigned, err = signedTxn.IsFullySigned() + require.NoError(t, err) + require.True(t, isFullySigned) + if len(signers) > 2 { + signer = signers[2] + } + _, err = wallets[1].Sign(signedTxn, signer, nil, []string{"#1"}) + testutil.RequireError(t, err, "Transaction is fully signed") + // Repeat using UXID + isFullySigned, err = uiTxn.IsFullySigned() + require.NoError(t, err) + require.False(t, isFullySigned) + uxId := txn.In[1].Hex() + if len(signers) > 1 { + signer = signers[1] + } + signedCoreTxn, err = wallets[1].Sign(uiTxn, signer, nil, []string{uxId}) + require.NoError(t, err) + signedTxn, isUninjected = signedCoreTxn.(*SkycoinUninjectedTransaction) + require.True(t, isUninjected) + require.NotEqual(t, uiTxn.txn, signedTxn.txn) + isFullySigned, err = uiTxn.IsFullySigned() + require.NoError(t, err) + require.False(t, isFullySigned) + isFullySigned, err = signedTxn.IsFullySigned() + require.NoError(t, err) + require.True(t, isFullySigned) + if len(signers) > 1 { + signer = signers[1] + } + _, err = wallets[1].Sign(signedTxn, signer, nil, []string{"#1"}) + testutil.RequireError(t, err, "Transaction is fully signed") + + // Transaction has no sigs; sigs array is initialized + txn.Sigs = nil + isFullySigned, err = uiTxn.IsFullySigned() + require.NoError(t, err) + require.False(t, isFullySigned) + if len(signers) > 2 { + signer = signers[2] + } + signedCoreTxn, err = wallets[2].Sign(uiTxn, signer, nil, []string{"#2"}) + require.NoError(t, err) + signedTxn, isUninjected = signedCoreTxn.(*SkycoinUninjectedTransaction) + require.True(t, isUninjected) + require.NotEqual(t, uiTxn.txn, signedTxn.txn) + isFullySigned, err = uiTxn.IsFullySigned() + require.NoError(t, err) + require.False(t, isFullySigned) + require.Len(t, signedTxn.txn.Sigs, 3) + require.True(t, signedTxn.txn.Sigs[0].Null()) + require.True(t, signedTxn.txn.Sigs[1].Null()) + require.False(t, signedTxn.txn.Sigs[2].Null()) + + // Signing the rest of the inputs individually works + if len(signers) > 1 { + signer = signers[1] + } + signedCoreTxn, err = wallets[1].Sign(signedTxn, signer, nil, []string{"#1"}) + require.NoError(t, err) + signedTxn, isUninjected = signedCoreTxn.(*SkycoinUninjectedTransaction) + require.True(t, isUninjected) + isFullySigned, err = signedTxn.IsFullySigned() + require.NoError(t, err) + require.False(t, isFullySigned) + if len(signers) > 0 { + signer = signers[0] + } + signedCoreTxn, err = wallets[0].Sign(signedTxn, signer, nil, []string{"#0"}) + require.NoError(t, err) + signedTxn, isUninjected = signedCoreTxn.(*SkycoinUninjectedTransaction) + require.True(t, isUninjected) + isFullySigned, err = signedTxn.IsFullySigned() + require.NoError(t, err) + require.True(t, isFullySigned) +} diff --git a/src/coin/skycoin/models/wallet.go b/src/coin/skycoin/models/wallet.go index 453c859c..386c534d 100644 --- a/src/coin/skycoin/models/wallet.go +++ b/src/coin/skycoin/models/wallet.go @@ -292,6 +292,10 @@ type WalletNode struct { poolSection string } +func (wltEnv *WalletNode) LookupWallet(firstAddr string) (core.Wallet, error) { + return lookupWallet(wltEnv, firstAddr) +} + func (wltEnv *WalletNode) GetStorage() core.WalletStorage { logWallet.Info("Getting wallet node storage") if wltEnv.wltService == nil { @@ -453,7 +457,11 @@ func (wlt *RemoteWallet) Transfer(destination core.TransactionOutput, options co logWallet.WithError(err).Warnf("Couldn't retrieve %s to transfer", params.SkycoinTicker) return nil, err } - to := destination.GetAddress() + to, err := destination.GetAddress() + if err != nil { + logWallet.WithError(err).Error("Couldn't get address") + return nil, err + } var txnOutput SkycoinTransactionOutput txnOutput.skyOut.Address = to.String() @@ -548,7 +556,12 @@ func createTransaction(from []core.Address, to, uxOut []core.TransactionOutput, } strAmount := util.FormatCoins(skyV, quotient) recv := api.Receiver{} - recv.Address = out.GetAddress().String() + outAddr, err := out.GetAddress() + if err != nil { + logWallet.WithError(err).Error("Couldn't get address") + return nil, err + } + recv.Address = outAddr.String() recv.Coins = strAmount if coinHoursSelection.Type == "manual" { chV, err := out.GetCoins(CoinHour) @@ -727,7 +740,7 @@ func (wlt *RemoteWallet) SignTransaction(txn core.Transaction, pwdReader core.Pa if strIdxs == nil { indices = nil } else { - indices, err = getHashIndices(txn.GetInputs(), strIdxs) + indices, err = GetHashIndices(txn.GetInputs(), strIdxs) if err != nil { logWallet.Error("Error parsing Skycoin transaction input indices array for signing") return nil, err @@ -737,7 +750,7 @@ func (wlt *RemoteWallet) SignTransaction(txn core.Transaction, pwdReader core.Pa return } -func getHashIndices(ins []core.TransactionInput, strIdxs []string) (indices []int, err error) { +func GetHashIndices(ins []core.TransactionInput, strIdxs []string) (indices []int, err error) { cache := make(map[string]int, len(ins)) indices = make([]int, len(strIdxs)) scanIdx := 0 @@ -773,12 +786,12 @@ func getHashIndices(ins []core.TransactionInput, strIdxs []string) (indices []in return indices, nil } -func (wlt *RemoteWallet) GetSignerUID() core.UID { - return SignerIDRemoteWallet +func (wlt *RemoteWallet) GetSignerUID() (core.UID, error) { + return SignerIDRemoteWallet, nil } -func (wlt *RemoteWallet) GetSignerDescription() string { - return "Remote Skycoin wallet " + wlt.Id +func (wlt *RemoteWallet) GetSignerDescription() (string, error) { + return "Remote Skycoin wallet " + wlt.Id, nil } func walletResponseToWallet(wltR api.WalletResponse) *RemoteWallet { @@ -815,6 +828,26 @@ type WalletDirectory struct { wltService *SkycoinLocalWallet } +func lookupWallet(env core.WalletEnv, firstAddr string) (core.Wallet, error) { + ws := env.GetWalletSet() + wls := ws.ListWallets() + for wls.Next() { + w := wls.Value() + addrs := w.GenAddresses(core.AccountAddress, 0, 1, nil) + if addrs.Next() { + addr := addrs.Value() + if addr.String() == firstAddr { + return w, nil + } + } + } + return nil, errors.ErrWltFromAddrNotFound +} + +func (wltDir *WalletDirectory) LookupWallet(firstAddr string) (core.Wallet, error) { + return lookupWallet(wltDir, firstAddr) +} + func (wltDir *WalletDirectory) GetStorage() core.WalletStorage { logWallet.Info("Getting storage from wallet directory") if wltDir.wltService == nil { @@ -839,13 +872,17 @@ type SkycoinLocalWallet struct { func (wltSrv *SkycoinLocalWallet) ListWallets() core.WalletIterator { logWallet.Info("Listing Skycoin local wallets") wallets := make([]core.Wallet, 0) + + logWallet.Debug("Reading wallet") entries, err := ioutil.ReadDir(wltSrv.walletDir) if err != nil { logWallet.WithError(err).WithField("dirname", wltSrv.walletDir).Error("Call to ioutil.ReadDir(dirname) inside ListWallets failed.") return nil } + logWallet.Debug("Readed wallet") - for _, e := range entries { + for i, e := range entries { + logWallet.Debug("Entry " + strconv.Itoa(i) + " started") if e.Mode().IsRegular() { name := e.Name() if !strings.HasSuffix(name, walletExt) { @@ -867,8 +904,11 @@ func (wltSrv *SkycoinLocalWallet) ListWallets() core.WalletIterator { WalletDir: wltSrv.walletDir, }) } + logWallet.Debug("Entry " + strconv.Itoa(i) + " finished") } + logWallet.Debug("number of wallets :=> " + strconv.Itoa(len(entries))) + return NewSkycoinWalletIterator(wallets) } @@ -1093,6 +1133,7 @@ type LocalWallet struct { Encrypted bool Type string WalletDir string + balance *util.BalanceSnapshot } func (wlt *LocalWallet) Sign(txn core.Transaction, signer core.TxnSigner, pwd core.PasswordReader, index []string) (signedTxn core.Transaction, err error) { @@ -1393,7 +1434,12 @@ func (wlt *LocalWallet) Transfer(to core.TransactionOutput, options core.KeyValu strAmount := util.FormatCoins(amount, quotient) var txnOutput SkycoinTransactionOutput - txnOutput.skyOut.Address = to.GetAddress().String() + outAddr, err := to.GetAddress() + if err != nil { + logWallet.WithError(err).Error("Couldn't get address") + return nil, err + } + txnOutput.skyOut.Address = outAddr.String() txnOutput.skyOut.Coins = strAmount addresses := make([]core.Address, 0) iterAddr, err := wlt.GetLoadedAddresses() @@ -1647,7 +1693,7 @@ func checkEquivalentSkycoinWallets(wlt1, wlt2 core.Wallet) (bool, error) { if err != nil { return false, err } - return addrs1.HasNext() && addrs2.HasNext() && addrs1.Value().String() == addrs2.Value().String(), nil + return addrs1.Next() && addrs2.Next() && addrs1.Value().String() == addrs2.Value().String(), nil } func checkTxnSupported(wlt1, wlt2 core.Wallet, txn core.Transaction) (bool, error) { @@ -1675,7 +1721,7 @@ func (wlt *LocalWallet) SignTransaction(txn core.Transaction, pwdReader core.Pas if strIdxs == nil { indices = nil } else { - indices, err = getHashIndices(txn.GetInputs(), strIdxs) + indices, err = GetHashIndices(txn.GetInputs(), strIdxs) if err != nil { logWallet.Error("Error parsing Skycoin transaction input indices array for signing") return nil, err @@ -1685,12 +1731,12 @@ func (wlt *LocalWallet) SignTransaction(txn core.Transaction, pwdReader core.Pas return } -func (wlt *LocalWallet) GetSignerUID() core.UID { - return SignerIDLocalWallet +func (wlt *LocalWallet) GetSignerUID() (core.UID, error) { + return SignerIDLocalWallet, nil } -func (wlt *LocalWallet) GetSignerDescription() string { - return "Remote Skycoin wallet " + wlt.Id +func (wlt *LocalWallet) GetSignerDescription() (string, error) { + return "Remote Skycoin wallet " + wlt.Id, nil } // Typoe assertions diff --git a/src/coin/skycoin/models/wallet_test.go b/src/coin/skycoin/models/wallet_test.go index 65102f34..8d9b2360 100644 --- a/src/coin/skycoin/models/wallet_test.go +++ b/src/coin/skycoin/models/wallet_test.go @@ -2,17 +2,17 @@ package skycoin import ( "fmt" - "io/ioutil" "math" + "path/filepath" + "sort" "strconv" - "strings" "testing" "time" "github.com/SkycoinProject/skycoin/src/visor" + "github.com/fibercrypto/fibercryptowallet/src/coin/mocks" "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/params" - "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/testsuite" "github.com/fibercrypto/fibercryptowallet/src/core" "github.com/fibercrypto/fibercryptowallet/src/util" @@ -22,6 +22,7 @@ import ( "github.com/SkycoinProject/skycoin/src/readable" "github.com/SkycoinProject/skycoin/src/testutil" "github.com/SkycoinProject/skycoin/src/wallet" + "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" ) @@ -262,18 +263,6 @@ func TestRemoteWalletSetLabel(t *testing.T) { wlt.SetLabel("wallet") } -type TransferOptions struct { - values map[string]interface{} -} - -func (tOpt *TransferOptions) GetValue(key string) interface{} { - return tOpt.values[key] -} - -func (tOpt *TransferOptions) SetValue(key string, value interface{}) { - tOpt.values[key] = value -} - func NewTransferOptions() *TransferOptions { tOptions := TransferOptions{ values: make(map[string]interface{}), @@ -582,17 +571,6 @@ func TestRemoteWalletGetLoadedAddresses(t *testing.T) { require.Equal(t, 1, items) } -func makeUninjectedTransaction(t *testing.T, txn *coin.Transaction, fee uint64) *SkycoinUninjectedTransaction { - if txn == nil { - skyTxn, err := makeTransaction(t) - require.NoError(t, err) - txn = &skyTxn - } - uitxn, err := NewUninjectedTransaction(txn, fee) - require.NoError(t, err) - return uitxn -} - func TestUninjectedTransactionVerifySigned(t *testing.T) { // Mismatch header hash txn, err := makeTransaction(t) @@ -770,143 +748,8 @@ func TestUninjectedTransactionVerifyUnsigned(t *testing.T) { require.NoError(t, err) } -var ( - tmpWalletDir string - testWalletEnv core.WalletEnv -) - -func loadTestWalletEnv(t *testing.T) core.WalletEnv { - if tmpWalletDir == "" { - tmpDir, err := ioutil.TempDir("", testsuite.TestIDToken) - require.NoError(t, err) - tmpWalletDir = tmpDir - } - if testWalletEnv == nil { - testWalletEnv = NewWalletDirectory(tmpWalletDir) - } - return testWalletEnv -} - -var whitespaceReplacer = strings.NewReplacer(" ", "-") - -func makeLocalWalletsFromKeyData(t *testing.T, keysData []KeyData) []core.Wallet { - walletsCache := make(map[string]core.Wallet) - wallets := make([]core.Wallet, len(keysData)) - walletSet := loadTestWalletEnv(t).GetWalletSet() - for i, kd := range keysData { - walletID := whitespaceReplacer.Replace(kd.Mnemonic) - var w core.Wallet - var isFound bool - var err error - if w, isFound = walletsCache[kd.Mnemonic]; !isFound { - if w = walletSet.GetWallet(walletID); w == nil { - w, err = walletSet.CreateWallet(walletID, kd.Mnemonic, wallet.WalletTypeDeterministic, false, util.EmptyPassword, 0) - require.NoError(t, err) - } - walletsCache[kd.Mnemonic] = w - } - wallets[i] = w - w.GenAddresses(core.AccountAddress, 0, uint32(kd.AddressIndex+1), nil) - w.GenAddresses(core.ChangeAddress, 0, uint32(kd.AddressIndex+1), nil) - } - return wallets -} - func TestTransactionSignInput(t *testing.T) { - txn, keysData, uxspent, err := makeTransactionMultipleInputs(t, 3) - require.NoError(t, err) - // Mock UxOut API calls - for _, ux := range uxspent { - mockSkyApiUxOut(global_mock, ux) - } - - uiTxn := makeUninjectedTransaction(t, &txn, 1) - var signedCoreTxn core.Transaction - var isFullySigned bool - isFullySigned, err = uiTxn.IsFullySigned() - require.NoError(t, err) - require.True(t, isFullySigned) - - // Load local wallets - wallets := makeLocalWalletsFromKeyData(t, keysData) - - // Input is already signed - _, err = wallets[0].Sign(uiTxn, nil, util.EmptyPassword, []string{"#0"}) - testutil.RequireError(t, err, "Transaction is fully signed") - isFullySigned, err = uiTxn.IsFullySigned() - require.NoError(t, err) - require.True(t, isFullySigned) - - // Input is not signed - txn.Sigs[1] = cipher.Sig{} - isFullySigned, err = uiTxn.IsFullySigned() - require.NoError(t, err) - require.False(t, isFullySigned) - signedCoreTxn, err = wallets[1].Sign(uiTxn, nil, nil, []string{"#1"}) - require.NoError(t, err) - signedTxn, isUninjected := signedCoreTxn.(*SkycoinUninjectedTransaction) - require.True(t, isUninjected) - require.NotEqual(t, uiTxn.txn, signedTxn.txn) - isFullySigned, err = uiTxn.IsFullySigned() - require.NoError(t, err) - require.False(t, isFullySigned) - isFullySigned, err = signedTxn.IsFullySigned() - require.NoError(t, err) - require.True(t, isFullySigned) - _, err = wallets[1].Sign(signedTxn, nil, nil, []string{"#1"}) - testutil.RequireError(t, err, "Transaction is fully signed") - // Repeat using UXID - isFullySigned, err = uiTxn.IsFullySigned() - require.NoError(t, err) - require.False(t, isFullySigned) - uxId := txn.In[1].Hex() - signedCoreTxn, err = wallets[1].Sign(uiTxn, nil, nil, []string{uxId}) - require.NoError(t, err) - signedTxn, isUninjected = signedCoreTxn.(*SkycoinUninjectedTransaction) - require.True(t, isUninjected) - require.NotEqual(t, uiTxn.txn, signedTxn.txn) - isFullySigned, err = uiTxn.IsFullySigned() - require.NoError(t, err) - require.False(t, isFullySigned) - isFullySigned, err = signedTxn.IsFullySigned() - require.NoError(t, err) - require.True(t, isFullySigned) - _, err = wallets[1].Sign(signedTxn, nil, nil, []string{"#1"}) - testutil.RequireError(t, err, "Transaction is fully signed") - - // Transaction has no sigs; sigs array is initialized - txn.Sigs = nil - isFullySigned, err = uiTxn.IsFullySigned() - require.NoError(t, err) - require.False(t, isFullySigned) - signedCoreTxn, err = wallets[2].Sign(uiTxn, nil, nil, []string{"#2"}) - require.NoError(t, err) - signedTxn, isUninjected = signedCoreTxn.(*SkycoinUninjectedTransaction) - require.True(t, isUninjected) - require.NotEqual(t, uiTxn.txn, signedTxn.txn) - isFullySigned, err = uiTxn.IsFullySigned() - require.NoError(t, err) - require.False(t, isFullySigned) - require.Len(t, signedTxn.txn.Sigs, 3) - require.True(t, signedTxn.txn.Sigs[0].Null()) - require.True(t, signedTxn.txn.Sigs[1].Null()) - require.False(t, signedTxn.txn.Sigs[2].Null()) - - // Signing the rest of the inputs individually works - signedCoreTxn, err = wallets[1].Sign(signedTxn, nil, nil, []string{"#1"}) - require.NoError(t, err) - signedTxn, isUninjected = signedCoreTxn.(*SkycoinUninjectedTransaction) - require.True(t, isUninjected) - isFullySigned, err = signedTxn.IsFullySigned() - require.NoError(t, err) - require.False(t, isFullySigned) - signedCoreTxn, err = wallets[0].Sign(signedTxn, nil, nil, []string{"#0"}) - require.NoError(t, err) - signedTxn, isUninjected = signedCoreTxn.(*SkycoinUninjectedTransaction) - require.True(t, isUninjected) - isFullySigned, err = signedTxn.IsFullySigned() - require.NoError(t, err) - require.True(t, isFullySigned) + TransactionSignInputTestImpl(t, nil) } func TestTransactionSignInputs(t *testing.T) { @@ -973,21 +816,6 @@ func TestTransactionSignInputs(t *testing.T) { require.Error(t, cipher.VerifyAddressSignedHash(a2, signedTxn.txn.Sigs[0], cipher.AddSHA256(h, signedTxn.txn.In[1]))) } -func makeLocalWallet(t *testing.T) core.Wallet { - _, kd, err := makeUxOutWithSecret(t) - require.NoError(t, err) - require.NoError(t, err) - wallets := makeLocalWalletsFromKeyData(t, []KeyData{*kd}) - wallet := wallets[0] - seed, seckeys, err2 := cipher.GenerateDeterministicKeyPairsSeed([]byte(kd.Mnemonic), kd.AddressIndex+1) - require.NoError(t, err2) - require.Equal(t, kd.SecKey, seckeys[kd.AddressIndex]) - _, _, err3 := cipher.GenerateDeterministicKeyPair(seed) - require.NoError(t, err3) - wallet.GenAddresses(core.AccountAddress, uint32(kd.AddressIndex), 2, nil) - return wallet -} - func makeSkycoinBlockchain() core.BlockchainTransactionAPI { return NewSkycoinBlockchain(0) } @@ -1587,3 +1415,422 @@ func TestSkycoinSignServiceSign(t *testing.T) { require.Equal(t, true, signed) } + +func TestWalletDirectoryGetStorage(t *testing.T) { + dir := "wallet-dir" + tests := []struct { + wlt *WalletDirectory + want *SkycoinLocalWallet + }{ + {wlt: &WalletDirectory{WalletDir: dir}, want: &SkycoinLocalWallet{walletDir: dir}}, + {wlt: &WalletDirectory{wltService: new(SkycoinLocalWallet)}, want: new(SkycoinLocalWallet)}, + } + for i, tt := range tests { + t.Run(fmt.Sprintf("GetStorage_%d", i), func(t *testing.T) { + storage := tt.wlt.GetStorage() + require.Equal(t, tt.want, storage) + }) + } +} + +func TestSkycoinLocalWalletListWallets(t *testing.T) { + tests := []struct { + dir string + valid bool + want []string + }{ + { + dir: "testdata", + valid: true, + want: []string{"testWallet", "encryptedWallet"}, + }, + { + dir: "no-dir", + valid: false, + want: make([]string, 0), + }, + { + dir: "testdata/invalid/wallets", + valid: false, + want: make([]string, 0), + }, + } + + for _, tt := range tests { + t.Run(fmt.Sprintf("ListWalletsOn -> %s", tt.dir), func(t *testing.T) { + slw := &SkycoinLocalWallet{walletDir: tt.dir} + it := slw.ListWallets() + labels := make([]string, 0) + if tt.valid { + require.NotNil(t, it) + for it.Next() { + wlt := it.Value() + labels = append(labels, wlt.GetLabel()) + } + } else { + require.Nil(t, it) + } + sort.Strings(labels) + sort.Strings(tt.want) + require.Equal(t, tt.want, labels) + }) + } +} + +func TestSkycoinLocalIsEncrypted(t *testing.T) { + slw := &SkycoinLocalWallet{walletDir: "testdata"} + tests := []struct { + srv *SkycoinLocalWallet + name string + valid bool + want bool + }{ + {srv: slw, valid: true, want: false, name: "test.wlt"}, + {srv: slw, valid: true, want: true, name: "encrypted.wlt"}, + {srv: slw, valid: false, want: false, name: "unknown.wlt"}, + } + for i, tt := range tests { + t.Run(fmt.Sprintf("Wallet%d -> %s", i, tt.name), func(t *testing.T) { + encrypted, err := tt.srv.IsEncrypted(tt.name) + require.Equal(t, tt.want, encrypted) + if tt.valid { + require.Nil(t, err) + } else { + require.NotNil(t, err) + } + }) + } +} + +func TestSkycoinLocalWalletEncrypt(t *testing.T) { + slw := &SkycoinLocalWallet{walletDir: "testdata"} + pwd := func(s string, store core.KeyValueStore) (string, error) { + return "test-password", nil + } + emptyPwd := func(s string, store core.KeyValueStore) (string, error) { + return "", nil + } + tests := []struct { + srv *SkycoinLocalWallet + pwd core.PasswordReader + name string + valid bool + }{ + {srv: slw, pwd: pwd, valid: true, name: "test.wlt"}, + {srv: slw, pwd: pwd, valid: true, name: "encrypted.wlt"}, + {srv: slw, pwd: pwd, valid: false, name: "unknown.wlt"}, + {srv: slw, pwd: emptyPwd, valid: false, name: "test.wlt"}, + {srv: slw, pwd: emptyPwd, valid: true, name: "encrypted.wlt"}, + } + for i, tt := range tests { + t.Run(fmt.Sprintf("Wallet%d -> %s", i, tt.name), func(t *testing.T) { + wlt, err := wallet.Load(filepath.Join(tt.srv.walletDir, tt.name)) + clean := err == nil + + tt.srv.Encrypt(tt.name, tt.pwd) + encrypted, err := tt.srv.IsEncrypted(tt.name) + if clean { + require.NoError(t, err) + err = wallet.Save(wlt, tt.srv.walletDir) + require.NoError(t, err) + } else { + require.Error(t, err) + } + require.Equal(t, tt.valid, encrypted) + }) + } +} + +func TestSkycoinLocalWalletDecrypt(t *testing.T) { + slw := &SkycoinLocalWallet{walletDir: "testdata"} + pwd := func(s string, store core.KeyValueStore) (string, error) { + return "test-password", nil + } + emptyPwd := func(s string, store core.KeyValueStore) (string, error) { + return "", nil + } + tests := []struct { + srv *SkycoinLocalWallet + pwd core.PasswordReader + name string + valid bool + }{ + {srv: slw, pwd: pwd, valid: false, name: "test.wlt"}, + {srv: slw, pwd: pwd, valid: false, name: "encrypted.wlt"}, + {srv: slw, pwd: pwd, valid: false, name: "unknown.wlt"}, + {srv: slw, pwd: emptyPwd, valid: false, name: "test.wlt"}, + {srv: slw, pwd: emptyPwd, valid: true, name: "encrypted.wlt"}, + } + for i, tt := range tests { + t.Run(fmt.Sprintf("Wallet%d -> %s", i, tt.name), func(t *testing.T) { + wlt, err := wallet.Load(filepath.Join(tt.srv.walletDir, tt.name)) + clean := err == nil + + tt.srv.Decrypt(tt.name, tt.pwd) + encrypted, err := tt.srv.IsEncrypted(tt.name) + if clean { + require.NoError(t, err) + err = wallet.Save(wlt, tt.srv.walletDir) + require.NoError(t, err) + } else { + require.Error(t, err) + } + require.Equal(t, tt.valid, encrypted) + }) + } +} + +func TestLocalWalletSetLabel(t *testing.T) { + newLabel := "custom-label" + tests := []struct { + name string + label string + valid bool + }{ + {label: "testWallet", name: "test.wlt", valid: true}, + {label: "encryptedWallet", name: "encrypted.wlt", valid: true}, + {name: "unknown.wlt", valid: false}, + } + + for _, tt := range tests { + t.Run(fmt.Sprintf("CangeLabelOf -> %s", tt.name), func(t *testing.T) { + lw := &LocalWallet{WalletDir: "testdata", Id: tt.name} + lw.SetLabel(newLabel) + if tt.valid { + label := lw.GetLabel() + lw.SetLabel(tt.label) + require.Equal(t, newLabel, label) + } + }) + } +} + +func TestWalletsReadyForTxn(t *testing.T) { + type WalleSigner struct { + mocks.Wallet + mocks.TxnSigner + } + emptyWlt := new(LocalWallet) + mockWlt := new(WalleSigner) + mockWlt.TxnSigner.On( + "ReadyForTxn", + mock.AnythingOfType("*skycoin.LocalWallet"), + mock.AnythingOfType("*mocks.Transaction"), + ).Return( + func(w core.Wallet, txn core.Transaction) bool { + ok, err := checkTxnSupported(mockWlt, w, txn) + require.NoError(t, err) + return ok + }, + nil, + ) + + tests := []struct { + signer core.TxnSigner + wlt2 core.Wallet + txn core.Transaction + valid bool + want bool + }{ + { + valid: true, + want: false, + signer: mockWlt, + wlt2: new(LocalWallet), + txn: new(mocks.Transaction), + }, + { + valid: true, + want: false, + signer: new(LocalWallet), + wlt2: mockWlt, + txn: new(mocks.Transaction), + }, + { + valid: true, + want: false, + signer: &LocalWallet{Type: "custom-type"}, + wlt2: new(LocalWallet), + txn: new(mocks.Transaction), + }, + { + valid: false, + want: false, + signer: new(LocalWallet), + wlt2: new(LocalWallet), + txn: new(mocks.Transaction), + }, + { + valid: true, + want: false, + signer: emptyWlt, + wlt2: emptyWlt, + txn: new(mocks.Transaction), + }, + { + valid: false, + want: false, + signer: &LocalWallet{WalletDir: "testdata", Id: "test.wlt"}, + wlt2: new(LocalWallet), + txn: new(mocks.Transaction), + }, + { + valid: true, + want: true, + signer: &LocalWallet{WalletDir: "testdata", Id: "test.wlt"}, + wlt2: &LocalWallet{WalletDir: "testdata", Id: "test.wlt"}, + txn: new(SkycoinTransaction), + }, + { + valid: true, + want: false, + signer: &LocalWallet{WalletDir: "testdata", Id: "test.wlt"}, + wlt2: &LocalWallet{WalletDir: "testdata", Id: "test.wlt"}, + txn: new(mocks.Transaction), + }, + //RemoteWallet + { + valid: false, + want: false, + signer: new(RemoteWallet), + wlt2: new(RemoteWallet), + txn: new(mocks.Transaction), + }, + } + + for _, tt := range tests { + t.Run("ReadyForTxn", func(t *testing.T) { + ready, err := tt.signer.ReadyForTxn(tt.wlt2, tt.txn) + if tt.valid { + require.Equal(t, tt.want, ready) + } else { + require.NotNil(t, err) + } + }) + } +} + +func TestWalletFunctions(t *testing.T) { + id := "local-id" + wlt := &LocalWallet{Id: id} + signerUuid, err := wlt.GetSignerUID() + require.NoError(t, err) + require.Equal(t, core.UID(SignerIDLocalWallet), signerUuid) + signerDescription, err := wlt.GetSignerDescription() + require.NoError(t, err) + require.Equal(t, "Remote Skycoin wallet "+id, signerDescription) + + rmt := &RemoteWallet{Id: id} + signerUuid, err = rmt.GetSignerUID() + require.NoError(t, err) + require.Equal(t, core.UID(SignerIDRemoteWallet), signerUuid) + signerDescription, err = rmt.GetSignerDescription() + require.NoError(t, err) + require.Equal(t, "Remote Skycoin wallet "+id, signerDescription) +} + +func TestWalletNodeGetWalletSet(t *testing.T) { + sectionName := "custom-section" + tests := []struct { + wlt *WalletNode + want core.WalletSet + }{ + {wlt: new(WalletNode), want: new(SkycoinRemoteWallet)}, + {wlt: &WalletNode{poolSection: sectionName}, want: &SkycoinRemoteWallet{poolSection: sectionName}}, + } + + for i, tt := range tests { + t.Run(fmt.Sprintf("GetWalletSet%d", i), func(t *testing.T) { + require.Equal(t, tt.want, tt.wlt.GetWalletSet()) + }) + } +} + +func TestWalletNodeGetStorage(t *testing.T) { + sectionName := "custom-section" + tests := []struct { + wlt *WalletNode + want core.WalletSet + }{ + {wlt: new(WalletNode), want: new(SkycoinRemoteWallet)}, + {wlt: &WalletNode{poolSection: sectionName}, want: &SkycoinRemoteWallet{poolSection: sectionName}}, + } + + for i, tt := range tests { + t.Run(fmt.Sprintf("GetWalletSet%d", i), func(t *testing.T) { + require.Equal(t, tt.want, tt.wlt.GetStorage()) + }) + } +} + +func TestSeedServiceGenerateMnemonic(t *testing.T) { + srv := new(SeedService) + tests := []struct { + name string + bits int + valid bool + }{ + {name: "bad-entropyBits", bits: 15, valid: false}, + {name: "128-bits", bits: 128, valid: true}, + {name: "256-bits", bits: 256, valid: true}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + _, err := srv.GenerateMnemonic(tt.bits) + if tt.valid { + require.Nil(t, err) + } else { + require.NotNil(t, err) + } + }) + } +} + +func TestSeedServiceVerifyMnemonic(t *testing.T) { + srv := new(SeedService) + mnc128, err := srv.GenerateMnemonic(128) + require.NoError(t, err) + mnc256, err := srv.GenerateMnemonic(256) + require.NoError(t, err) + tests := []struct { + name string + mnemonic string + valid bool + }{ + {name: "bad-mnemonic", mnemonic: "invalid-mnemonic", valid: false}, + {name: "128-bits", mnemonic: mnc128, valid: true}, + {name: "256-bits", mnemonic: mnc256, valid: true}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + valid, err := srv.VerifyMnemonic(tt.mnemonic) + if tt.valid { + require.True(t, valid) + require.Nil(t, err) + } else { + require.False(t, valid) + require.NotNil(t, err) + } + }) + } +} + +func TestErrorTickerInvalidError(t *testing.T) { + format := " is an invalid ticker. Use " + Sky + " or " + CoinHour + tickers := []string{"a", "b", "c"} + for _, ticker := range tickers { + err := errorTickerInvalid{ticker} + require.Equal(t, ticker+format, err.Error()) + } +} + +func TestNewWalletNode(t *testing.T) { + addr := "addr" + for i := 1; i < 4; i++ { + wn := NewWalletNode(addr) + require.Equal(t, fmt.Sprintf("skycoin-%d", i), wn.poolSection) + require.Equal(t, addr, wn.NodeAddress) + } +} diff --git a/src/coin/skycoin/skymocks/ReadableTxn.go b/src/coin/skycoin/skymocks/ReadableTxn.go new file mode 100644 index 00000000..75e25c2b --- /dev/null +++ b/src/coin/skycoin/skymocks/ReadableTxn.go @@ -0,0 +1,34 @@ +// Code generated by mockery v1.0.0. DO NOT EDIT. + +package skymocks + +import api "github.com/SkycoinProject/skycoin/src/api" +import mock "github.com/stretchr/testify/mock" + +// ReadableTxn is an autogenerated mock type for the ReadableTxn type +type ReadableTxn struct { + mock.Mock +} + +// ToCreatedTransaction provides a mock function with given fields: +func (_m *ReadableTxn) ToCreatedTransaction() (*api.CreatedTransaction, error) { + ret := _m.Called() + + var r0 *api.CreatedTransaction + if rf, ok := ret.Get(0).(func() *api.CreatedTransaction); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*api.CreatedTransaction) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} diff --git a/src/coin/skycoin/skymocks/SkycoinAPI.go b/src/coin/skycoin/skymocks/SkycoinAPI.go new file mode 100644 index 00000000..d009a6f8 --- /dev/null +++ b/src/coin/skycoin/skymocks/SkycoinAPI.go @@ -0,0 +1,598 @@ +// Code generated by mockery v1.0.0. DO NOT EDIT. + +package skymocks + +import api "github.com/SkycoinProject/skycoin/src/api" +import coin "github.com/SkycoinProject/skycoin/src/coin" +import mock "github.com/stretchr/testify/mock" +import readable "github.com/SkycoinProject/skycoin/src/readable" + +// SkycoinAPI is an autogenerated mock type for the SkycoinAPI type +type SkycoinAPI struct { + mock.Mock +} + +// Balance provides a mock function with given fields: addrs +func (_m *SkycoinAPI) Balance(addrs []string) (*api.BalanceResponse, error) { + ret := _m.Called(addrs) + + var r0 *api.BalanceResponse + if rf, ok := ret.Get(0).(func([]string) *api.BalanceResponse); ok { + r0 = rf(addrs) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*api.BalanceResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func([]string) error); ok { + r1 = rf(addrs) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// BlockchainProgress provides a mock function with given fields: +func (_m *SkycoinAPI) BlockchainProgress() (*readable.BlockchainProgress, error) { + ret := _m.Called() + + var r0 *readable.BlockchainProgress + if rf, ok := ret.Get(0).(func() *readable.BlockchainProgress); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*readable.BlockchainProgress) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// CoinSupply provides a mock function with given fields: +func (_m *SkycoinAPI) CoinSupply() (*api.CoinSupply, error) { + ret := _m.Called() + + var r0 *api.CoinSupply + if rf, ok := ret.Get(0).(func() *api.CoinSupply); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*api.CoinSupply) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// CreateTransaction provides a mock function with given fields: req +func (_m *SkycoinAPI) CreateTransaction(req api.CreateTransactionRequest) (*api.CreateTransactionResponse, error) { + ret := _m.Called(req) + + var r0 *api.CreateTransactionResponse + if rf, ok := ret.Get(0).(func(api.CreateTransactionRequest) *api.CreateTransactionResponse); ok { + r0 = rf(req) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*api.CreateTransactionResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(api.CreateTransactionRequest) error); ok { + r1 = rf(req) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// CreateWallet provides a mock function with given fields: o +func (_m *SkycoinAPI) CreateWallet(o api.CreateWalletOptions) (*api.WalletResponse, error) { + ret := _m.Called(o) + + var r0 *api.WalletResponse + if rf, ok := ret.Get(0).(func(api.CreateWalletOptions) *api.WalletResponse); ok { + r0 = rf(o) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*api.WalletResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(api.CreateWalletOptions) error); ok { + r1 = rf(o) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// DecryptWallet provides a mock function with given fields: id, password +func (_m *SkycoinAPI) DecryptWallet(id string, password string) (*api.WalletResponse, error) { + ret := _m.Called(id, password) + + var r0 *api.WalletResponse + if rf, ok := ret.Get(0).(func(string, string) *api.WalletResponse); ok { + r0 = rf(id, password) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*api.WalletResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, string) error); ok { + r1 = rf(id, password) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EncryptWallet provides a mock function with given fields: id, password +func (_m *SkycoinAPI) EncryptWallet(id string, password string) (*api.WalletResponse, error) { + ret := _m.Called(id, password) + + var r0 *api.WalletResponse + if rf, ok := ret.Get(0).(func(string, string) *api.WalletResponse); ok { + r0 = rf(id, password) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*api.WalletResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, string) error); ok { + r1 = rf(id, password) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// InjectEncodedTransaction provides a mock function with given fields: rawTxn +func (_m *SkycoinAPI) InjectEncodedTransaction(rawTxn string) (string, error) { + ret := _m.Called(rawTxn) + + var r0 string + if rf, ok := ret.Get(0).(func(string) string); ok { + r0 = rf(rawTxn) + } else { + r0 = ret.Get(0).(string) + } + + var r1 error + if rf, ok := ret.Get(1).(func(string) error); ok { + r1 = rf(rawTxn) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// InjectTransaction provides a mock function with given fields: txn +func (_m *SkycoinAPI) InjectTransaction(txn *coin.Transaction) (string, error) { + ret := _m.Called(txn) + + var r0 string + if rf, ok := ret.Get(0).(func(*coin.Transaction) string); ok { + r0 = rf(txn) + } else { + r0 = ret.Get(0).(string) + } + + var r1 error + if rf, ok := ret.Get(1).(func(*coin.Transaction) error); ok { + r1 = rf(txn) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LastBlocks provides a mock function with given fields: n +func (_m *SkycoinAPI) LastBlocks(n uint64) (*readable.Blocks, error) { + ret := _m.Called(n) + + var r0 *readable.Blocks + if rf, ok := ret.Get(0).(func(uint64) *readable.Blocks); ok { + r0 = rf(n) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*readable.Blocks) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(uint64) error); ok { + r1 = rf(n) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// NetworkConnections provides a mock function with given fields: filters +func (_m *SkycoinAPI) NetworkConnections(filters *api.NetworkConnectionsFilter) (*api.Connections, error) { + ret := _m.Called(filters) + + var r0 *api.Connections + if rf, ok := ret.Get(0).(func(*api.NetworkConnectionsFilter) *api.Connections); ok { + r0 = rf(filters) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*api.Connections) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*api.NetworkConnectionsFilter) error); ok { + r1 = rf(filters) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// NewWalletAddress provides a mock function with given fields: id, n, password +func (_m *SkycoinAPI) NewWalletAddress(id string, n int, password string) ([]string, error) { + ret := _m.Called(id, n, password) + + var r0 []string + if rf, ok := ret.Get(0).(func(string, int, string) []string); ok { + r0 = rf(id, n, password) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]string) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, int, string) error); ok { + r1 = rf(id, n, password) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// OutputsForAddresses provides a mock function with given fields: addrs +func (_m *SkycoinAPI) OutputsForAddresses(addrs []string) (*readable.UnspentOutputsSummary, error) { + ret := _m.Called(addrs) + + var r0 *readable.UnspentOutputsSummary + if rf, ok := ret.Get(0).(func([]string) *readable.UnspentOutputsSummary); ok { + r0 = rf(addrs) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*readable.UnspentOutputsSummary) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func([]string) error); ok { + r1 = rf(addrs) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// PendingTransactionsVerbose provides a mock function with given fields: +func (_m *SkycoinAPI) PendingTransactionsVerbose() ([]readable.UnconfirmedTransactionVerbose, error) { + ret := _m.Called() + + var r0 []readable.UnconfirmedTransactionVerbose + if rf, ok := ret.Get(0).(func() []readable.UnconfirmedTransactionVerbose); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]readable.UnconfirmedTransactionVerbose) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Transaction provides a mock function with given fields: txid +func (_m *SkycoinAPI) Transaction(txid string) (*readable.TransactionWithStatus, error) { + ret := _m.Called(txid) + + var r0 *readable.TransactionWithStatus + if rf, ok := ret.Get(0).(func(string) *readable.TransactionWithStatus); ok { + r0 = rf(txid) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*readable.TransactionWithStatus) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string) error); ok { + r1 = rf(txid) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// TransactionVerbose provides a mock function with given fields: txid +func (_m *SkycoinAPI) TransactionVerbose(txid string) (*readable.TransactionWithStatusVerbose, error) { + ret := _m.Called(txid) + + var r0 *readable.TransactionWithStatusVerbose + if rf, ok := ret.Get(0).(func(string) *readable.TransactionWithStatusVerbose); ok { + r0 = rf(txid) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*readable.TransactionWithStatusVerbose) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string) error); ok { + r1 = rf(txid) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Transactions provides a mock function with given fields: addrs +func (_m *SkycoinAPI) Transactions(addrs []string) ([]readable.TransactionWithStatus, error) { + ret := _m.Called(addrs) + + var r0 []readable.TransactionWithStatus + if rf, ok := ret.Get(0).(func([]string) []readable.TransactionWithStatus); ok { + r0 = rf(addrs) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]readable.TransactionWithStatus) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func([]string) error); ok { + r1 = rf(addrs) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// TransactionsVerbose provides a mock function with given fields: addrs +func (_m *SkycoinAPI) TransactionsVerbose(addrs []string) ([]readable.TransactionWithStatusVerbose, error) { + ret := _m.Called(addrs) + + var r0 []readable.TransactionWithStatusVerbose + if rf, ok := ret.Get(0).(func([]string) []readable.TransactionWithStatusVerbose); ok { + r0 = rf(addrs) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]readable.TransactionWithStatusVerbose) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func([]string) error); ok { + r1 = rf(addrs) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// UpdateWallet provides a mock function with given fields: id, label +func (_m *SkycoinAPI) UpdateWallet(id string, label string) error { + ret := _m.Called(id, label) + + var r0 error + if rf, ok := ret.Get(0).(func(string, string) error); ok { + r0 = rf(id, label) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// UxOut provides a mock function with given fields: uxID +func (_m *SkycoinAPI) UxOut(uxID string) (*readable.SpentOutput, error) { + ret := _m.Called(uxID) + + var r0 *readable.SpentOutput + if rf, ok := ret.Get(0).(func(string) *readable.SpentOutput); ok { + r0 = rf(uxID) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*readable.SpentOutput) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string) error); ok { + r1 = rf(uxID) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Wallet provides a mock function with given fields: id +func (_m *SkycoinAPI) Wallet(id string) (*api.WalletResponse, error) { + ret := _m.Called(id) + + var r0 *api.WalletResponse + if rf, ok := ret.Get(0).(func(string) *api.WalletResponse); ok { + r0 = rf(id) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*api.WalletResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string) error); ok { + r1 = rf(id) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WalletBalance provides a mock function with given fields: id +func (_m *SkycoinAPI) WalletBalance(id string) (*api.BalanceResponse, error) { + ret := _m.Called(id) + + var r0 *api.BalanceResponse + if rf, ok := ret.Get(0).(func(string) *api.BalanceResponse); ok { + r0 = rf(id) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*api.BalanceResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string) error); ok { + r1 = rf(id) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WalletCreateTransaction provides a mock function with given fields: req +func (_m *SkycoinAPI) WalletCreateTransaction(req api.WalletCreateTransactionRequest) (*api.CreateTransactionResponse, error) { + ret := _m.Called(req) + + var r0 *api.CreateTransactionResponse + if rf, ok := ret.Get(0).(func(api.WalletCreateTransactionRequest) *api.CreateTransactionResponse); ok { + r0 = rf(req) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*api.CreateTransactionResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(api.WalletCreateTransactionRequest) error); ok { + r1 = rf(req) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WalletSignTransaction provides a mock function with given fields: req +func (_m *SkycoinAPI) WalletSignTransaction(req api.WalletSignTransactionRequest) (*api.CreateTransactionResponse, error) { + ret := _m.Called(req) + + var r0 *api.CreateTransactionResponse + if rf, ok := ret.Get(0).(func(api.WalletSignTransactionRequest) *api.CreateTransactionResponse); ok { + r0 = rf(req) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*api.CreateTransactionResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(api.WalletSignTransactionRequest) error); ok { + r1 = rf(req) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WalletUnconfirmedTransactionsVerbose provides a mock function with given fields: id +func (_m *SkycoinAPI) WalletUnconfirmedTransactionsVerbose(id string) (*api.UnconfirmedTxnsVerboseResponse, error) { + ret := _m.Called(id) + + var r0 *api.UnconfirmedTxnsVerboseResponse + if rf, ok := ret.Get(0).(func(string) *api.UnconfirmedTxnsVerboseResponse); ok { + r0 = rf(id) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*api.UnconfirmedTxnsVerboseResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string) error); ok { + r1 = rf(id) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Wallets provides a mock function with given fields: +func (_m *SkycoinAPI) Wallets() ([]api.WalletResponse, error) { + ret := _m.Called() + + var r0 []api.WalletResponse + if rf, ok := ret.Get(0).(func() []api.WalletResponse); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]api.WalletResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} diff --git a/src/coin/skycoin/skymocks/SkycoinTxn.go b/src/coin/skycoin/skymocks/SkycoinTxn.go new file mode 100644 index 00000000..47dc9c7c --- /dev/null +++ b/src/coin/skycoin/skymocks/SkycoinTxn.go @@ -0,0 +1,33 @@ +// Code generated by mockery v1.0.0. DO NOT EDIT. + +package skymocks + +import mock "github.com/stretchr/testify/mock" + +// SkycoinTxn is an autogenerated mock type for the SkycoinTxn type +type SkycoinTxn struct { + mock.Mock +} + +// EncodeSkycoinTransaction provides a mock function with given fields: +func (_m *SkycoinTxn) EncodeSkycoinTransaction() ([]byte, error) { + ret := _m.Called() + + var r0 []byte + if rf, ok := ret.Get(0).(func() []byte); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]byte) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} diff --git a/src/coin/skycoin/skymocks/SkycoinWallet.go b/src/coin/skycoin/skymocks/SkycoinWallet.go new file mode 100644 index 00000000..44f5127c --- /dev/null +++ b/src/coin/skycoin/skymocks/SkycoinWallet.go @@ -0,0 +1,24 @@ +// Code generated by mockery v1.0.0. DO NOT EDIT. + +package skymocks + +import mock "github.com/stretchr/testify/mock" + +// SkycoinWallet is an autogenerated mock type for the SkycoinWallet type +type SkycoinWallet struct { + mock.Mock +} + +// GetSkycoinWalletType provides a mock function with given fields: +func (_m *SkycoinWallet) GetSkycoinWalletType() string { + ret := _m.Called() + + var r0 string + if rf, ok := ret.Get(0).(func() string); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(string) + } + + return r0 +} diff --git a/src/contrib/hardware-wallet/device_helper.go b/src/contrib/hardware-wallet/device_helper.go new file mode 100644 index 00000000..64dade5a --- /dev/null +++ b/src/contrib/hardware-wallet/device_helper.go @@ -0,0 +1,27 @@ +package hardware_wallet + +import ( + "github.com/chebyrash/promise" + "github.com/fibercrypto/fibercryptowallet/src/core" +) + +type DeviceHelper interface { + // FirstAddress return the first address in the sequence if there is a configured + // device connected, error if not device found or some thing fail. + FirstAddress(walletType string) *promise.Promise + + // DeviceMatch check if there is an attached device that matches with the giving wallet + DeviceMatch(wlt core.Wallet) *promise.Promise + + // ShouldBeSecured check if the device needs to be secured + ShouldBeSecured() *promise.Promise + + // ShouldBeInitialized check if the device needs to be initialized + ShouldBeInitialized() *promise.Promise + + // ShouldUploadFirmware check if the device require a new firmware upload + ShouldUploadFirmware() *promise.Promise + + // IsBootloaderMode check if the device is running in bootloader mode + IsBootloaderMode() *promise.Promise +} diff --git a/src/contrib/hardware-wallet/device_interaction.go b/src/contrib/hardware-wallet/device_interaction.go new file mode 100644 index 00000000..275c8fd3 --- /dev/null +++ b/src/contrib/hardware-wallet/device_interaction.go @@ -0,0 +1,33 @@ +package hardware_wallet + +import ( + "github.com/chebyrash/promise" + messages "github.com/fibercrypto/skywallet-protob/go" +) + +type DeviceInteraction interface { + AddressGen(addressN, startIndex uint32, confirmAddress bool, walletType string) *promise.Promise + ApplySettings(usePassphrase *bool, label string, language string) *promise.Promise + Backup() *promise.Promise + CheckMessageSignature(message, signature, address string) *promise.Promise + ChangePin(removePin *bool) *promise.Promise + IsAvailable() *promise.Promise + UploadFirmware(payload []byte, hash [32]byte) *promise.Promise + Features() *promise.Promise + GenerateMnemonic(wordCount uint32, usePassphrase bool) *promise.Promise + SetMnemonic(mnemonic string) *promise.Promise + Recovery(wordCount uint32, usePassphrase *bool, dryRun bool) *promise.Promise + // FIXME: change inputs and outputs to the generic types: + // core.TransactionInputIterator and core.TransactionOutputIterator respectively + Cancel() *promise.Promise + TransactionSign(inputs []*messages.SkycoinTransactionInput, outputs []*messages.SkycoinTransactionOutput, walletType string) *promise.Promise + SignMessage(addressN, addressIndex int, message string, walletType string) *promise.Promise + Wipe() *promise.Promise + SetUploadFirmwareWasWarn() + UploadFirmwareWasWarn() bool + SetInitializeWasWarn() + InitializeWasWarn() bool + SetSecureWasWarn() + SecureWasWarn() bool + ClearSingleTimeOperationsCache() +} \ No newline at end of file diff --git a/src/contrib/hardware-wallet/skywallet/mocks/device_driver.go b/src/contrib/hardware-wallet/skywallet/mocks/device_driver.go new file mode 100644 index 00000000..dd299e1e --- /dev/null +++ b/src/contrib/hardware-wallet/skywallet/mocks/device_driver.go @@ -0,0 +1,113 @@ +// Code generated by mockery v1.0.0. DO NOT EDIT. + +package mocks + +import mock "github.com/stretchr/testify/mock" +import skywallet "github.com/fibercrypto/skywallet-go/src/skywallet" +import usb "github.com/fibercrypto/skywallet-go/src/skywallet/usb" +import wire "github.com/fibercrypto/skywallet-go/src/skywallet/wire" + +// DeviceDriver is an autogenerated mock type for the DeviceDriver type +type DeviceDriver struct { + mock.Mock +} + +// Close provides a mock function with given fields: +func (_m *DeviceDriver) Close() { + _m.Called() +} + +// DeviceType provides a mock function with given fields: +func (_m *DeviceDriver) DeviceType() skywallet.DeviceType { + ret := _m.Called() + + var r0 skywallet.DeviceType + if rf, ok := ret.Get(0).(func() skywallet.DeviceType); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(skywallet.DeviceType) + } + + return r0 +} + +// GetDevice provides a mock function with given fields: +func (_m *DeviceDriver) GetDevice() (usb.Device, error) { + ret := _m.Called() + + var r0 usb.Device + if rf, ok := ret.Get(0).(func() usb.Device); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(usb.Device) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetDeviceInfos provides a mock function with given fields: +func (_m *DeviceDriver) GetDeviceInfos() ([]usb.Info, error) { + ret := _m.Called() + + var r0 []usb.Info + if rf, ok := ret.Get(0).(func() []usb.Info); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]usb.Info) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// SendToDevice provides a mock function with given fields: dev, chunks +func (_m *DeviceDriver) SendToDevice(dev usb.Device, chunks [][64]byte) (wire.Message, error) { + ret := _m.Called(dev, chunks) + + var r0 wire.Message + if rf, ok := ret.Get(0).(func(usb.Device, [][64]byte) wire.Message); ok { + r0 = rf(dev, chunks) + } else { + r0 = ret.Get(0).(wire.Message) + } + + var r1 error + if rf, ok := ret.Get(1).(func(usb.Device, [][64]byte) error); ok { + r1 = rf(dev, chunks) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// SendToDeviceNoAnswer provides a mock function with given fields: dev, chunks +func (_m *DeviceDriver) SendToDeviceNoAnswer(dev usb.Device, chunks [][64]byte) error { + ret := _m.Called(dev, chunks) + + var r0 error + if rf, ok := ret.Get(0).(func(usb.Device, [][64]byte) error); ok { + r0 = rf(dev, chunks) + } else { + r0 = ret.Error(0) + } + + return r0 +} diff --git a/src/contrib/hardware-wallet/skywallet/mocks/devicer.go b/src/contrib/hardware-wallet/skywallet/mocks/devicer.go new file mode 100644 index 00000000..1bd46a44 --- /dev/null +++ b/src/contrib/hardware-wallet/skywallet/mocks/devicer.go @@ -0,0 +1,487 @@ +// Code generated by mockery v1.0.0. DO NOT EDIT. + +package mocks + +import messages "github.com/fibercrypto/skywallet-protob/go" +import mock "github.com/stretchr/testify/mock" +import skywallet "github.com/fibercrypto/skywallet-go/src/skywallet" +import wire "github.com/fibercrypto/skywallet-go/src/skywallet/wire" + +// Devicer is an autogenerated mock type for the Devicer type +type Devicer struct { + mock.Mock +} + +// AddressGen provides a mock function with given fields: addressN, startIndex, confirmAddress, walletType +func (_m *Devicer) AddressGen(addressN uint32, startIndex uint32, confirmAddress bool, walletType string) (wire.Message, error) { + ret := _m.Called(addressN, startIndex, confirmAddress, walletType) + + var r0 wire.Message + if rf, ok := ret.Get(0).(func(uint32, uint32, bool, string) wire.Message); ok { + r0 = rf(addressN, startIndex, confirmAddress, walletType) + } else { + r0 = ret.Get(0).(wire.Message) + } + + var r1 error + if rf, ok := ret.Get(1).(func(uint32, uint32, bool, string) error); ok { + r1 = rf(addressN, startIndex, confirmAddress, walletType) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ApplySettings provides a mock function with given fields: usePassphrase, label, language +func (_m *Devicer) ApplySettings(usePassphrase *bool, label string, language string) (wire.Message, error) { + ret := _m.Called(usePassphrase, label, language) + + var r0 wire.Message + if rf, ok := ret.Get(0).(func(*bool, string, string) wire.Message); ok { + r0 = rf(usePassphrase, label, language) + } else { + r0 = ret.Get(0).(wire.Message) + } + + var r1 error + if rf, ok := ret.Get(1).(func(*bool, string, string) error); ok { + r1 = rf(usePassphrase, label, language) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Available provides a mock function with given fields: +func (_m *Devicer) Available() bool { + ret := _m.Called() + + var r0 bool + if rf, ok := ret.Get(0).(func() bool); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(bool) + } + + return r0 +} + +// Backup provides a mock function with given fields: +func (_m *Devicer) Backup() (wire.Message, error) { + ret := _m.Called() + + var r0 wire.Message + if rf, ok := ret.Get(0).(func() wire.Message); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(wire.Message) + } + + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ButtonAck provides a mock function with given fields: +func (_m *Devicer) ButtonAck() (wire.Message, error) { + ret := _m.Called() + + var r0 wire.Message + if rf, ok := ret.Get(0).(func() wire.Message); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(wire.Message) + } + + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Cancel provides a mock function with given fields: +func (_m *Devicer) Cancel() (wire.Message, error) { + ret := _m.Called() + + var r0 wire.Message + if rf, ok := ret.Get(0).(func() wire.Message); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(wire.Message) + } + + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ChangePin provides a mock function with given fields: removePin +func (_m *Devicer) ChangePin(removePin *bool) (wire.Message, error) { + ret := _m.Called(removePin) + + var r0 wire.Message + if rf, ok := ret.Get(0).(func(*bool) wire.Message); ok { + r0 = rf(removePin) + } else { + r0 = ret.Get(0).(wire.Message) + } + + var r1 error + if rf, ok := ret.Get(1).(func(*bool) error); ok { + r1 = rf(removePin) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// CheckMessageSignature provides a mock function with given fields: message, signature, address +func (_m *Devicer) CheckMessageSignature(message string, signature string, address string) (wire.Message, error) { + ret := _m.Called(message, signature, address) + + var r0 wire.Message + if rf, ok := ret.Get(0).(func(string, string, string) wire.Message); ok { + r0 = rf(message, signature, address) + } else { + r0 = ret.Get(0).(wire.Message) + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, string, string) error); ok { + r1 = rf(message, signature, address) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Close provides a mock function with given fields: +func (_m *Devicer) Close() { + _m.Called() +} + +// Connect provides a mock function with given fields: +func (_m *Devicer) Connect() error { + ret := _m.Called() + + var r0 error + if rf, ok := ret.Get(0).(func() error); ok { + r0 = rf() + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// Connected provides a mock function with given fields: +func (_m *Devicer) Connected() bool { + ret := _m.Called() + + var r0 bool + if rf, ok := ret.Get(0).(func() bool); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(bool) + } + + return r0 +} + +// Disconnect provides a mock function with given fields: +func (_m *Devicer) Disconnect() error { + ret := _m.Called() + + var r0 error + if rf, ok := ret.Get(0).(func() error); ok { + r0 = rf() + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// EraseFirmware provides a mock function with given fields: length +func (_m *Devicer) EraseFirmware(length uint32) (wire.Message, error) { + ret := _m.Called(length) + + var r0 wire.Message + if rf, ok := ret.Get(0).(func(uint32) wire.Message); ok { + r0 = rf(length) + } else { + r0 = ret.Get(0).(wire.Message) + } + + var r1 error + if rf, ok := ret.Get(1).(func(uint32) error); ok { + r1 = rf(length) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GenerateMnemonic provides a mock function with given fields: wordCount, usePassphrase +func (_m *Devicer) GenerateMnemonic(wordCount uint32, usePassphrase bool) (wire.Message, error) { + ret := _m.Called(wordCount, usePassphrase) + + var r0 wire.Message + if rf, ok := ret.Get(0).(func(uint32, bool) wire.Message); ok { + r0 = rf(wordCount, usePassphrase) + } else { + r0 = ret.Get(0).(wire.Message) + } + + var r1 error + if rf, ok := ret.Get(1).(func(uint32, bool) error); ok { + r1 = rf(wordCount, usePassphrase) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetFeatures provides a mock function with given fields: +func (_m *Devicer) GetFeatures() (wire.Message, error) { + ret := _m.Called() + + var r0 wire.Message + if rf, ok := ret.Get(0).(func() wire.Message); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(wire.Message) + } + + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// PassphraseAck provides a mock function with given fields: passphrase +func (_m *Devicer) PassphraseAck(passphrase string) (wire.Message, error) { + ret := _m.Called(passphrase) + + var r0 wire.Message + if rf, ok := ret.Get(0).(func(string) wire.Message); ok { + r0 = rf(passphrase) + } else { + r0 = ret.Get(0).(wire.Message) + } + + var r1 error + if rf, ok := ret.Get(1).(func(string) error); ok { + r1 = rf(passphrase) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// PinMatrixAck provides a mock function with given fields: p +func (_m *Devicer) PinMatrixAck(p string) (wire.Message, error) { + ret := _m.Called(p) + + var r0 wire.Message + if rf, ok := ret.Get(0).(func(string) wire.Message); ok { + r0 = rf(p) + } else { + r0 = ret.Get(0).(wire.Message) + } + + var r1 error + if rf, ok := ret.Get(1).(func(string) error); ok { + r1 = rf(p) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Recovery provides a mock function with given fields: wordCount, usePassphrase, dryRun +func (_m *Devicer) Recovery(wordCount uint32, usePassphrase *bool, dryRun bool) (wire.Message, error) { + ret := _m.Called(wordCount, usePassphrase, dryRun) + + var r0 wire.Message + if rf, ok := ret.Get(0).(func(uint32, *bool, bool) wire.Message); ok { + r0 = rf(wordCount, usePassphrase, dryRun) + } else { + r0 = ret.Get(0).(wire.Message) + } + + var r1 error + if rf, ok := ret.Get(1).(func(uint32, *bool, bool) error); ok { + r1 = rf(wordCount, usePassphrase, dryRun) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// SetAutoPressButton provides a mock function with given fields: simulateButtonPress, simulateButtonType +func (_m *Devicer) SetAutoPressButton(simulateButtonPress bool, simulateButtonType skywallet.ButtonType) error { + ret := _m.Called(simulateButtonPress, simulateButtonType) + + var r0 error + if rf, ok := ret.Get(0).(func(bool, skywallet.ButtonType) error); ok { + r0 = rf(simulateButtonPress, simulateButtonType) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// SetMnemonic provides a mock function with given fields: mnemonic +func (_m *Devicer) SetMnemonic(mnemonic string) (wire.Message, error) { + ret := _m.Called(mnemonic) + + var r0 wire.Message + if rf, ok := ret.Get(0).(func(string) wire.Message); ok { + r0 = rf(mnemonic) + } else { + r0 = ret.Get(0).(wire.Message) + } + + var r1 error + if rf, ok := ret.Get(1).(func(string) error); ok { + r1 = rf(mnemonic) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// SignMessage provides a mock function with given fields: addressN, addressIndex, message, walletType +func (_m *Devicer) SignMessage(addressN int, addressIndex int, message string, walletType string) (wire.Message, error) { + ret := _m.Called(addressN, addressIndex, message, walletType) + + var r0 wire.Message + if rf, ok := ret.Get(0).(func(int, int, string, string) wire.Message); ok { + r0 = rf(addressN, addressIndex, message, walletType) + } else { + r0 = ret.Get(0).(wire.Message) + } + + var r1 error + if rf, ok := ret.Get(1).(func(int, int, string, string) error); ok { + r1 = rf(addressN, addressIndex, message, walletType) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// TransactionSign provides a mock function with given fields: inputs, outputs, walletType +func (_m *Devicer) TransactionSign(inputs []*messages.SkycoinTransactionInput, outputs []*messages.SkycoinTransactionOutput, walletType string) (wire.Message, error) { + ret := _m.Called(inputs, outputs, walletType) + + var r0 wire.Message + if rf, ok := ret.Get(0).(func([]*messages.SkycoinTransactionInput, []*messages.SkycoinTransactionOutput, string) wire.Message); ok { + r0 = rf(inputs, outputs, walletType) + } else { + r0 = ret.Get(0).(wire.Message) + } + + var r1 error + if rf, ok := ret.Get(1).(func([]*messages.SkycoinTransactionInput, []*messages.SkycoinTransactionOutput, string) error); ok { + r1 = rf(inputs, outputs, walletType) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// UploadFirmware provides a mock function with given fields: payload, hash +func (_m *Devicer) UploadFirmware(payload []byte, hash [32]byte) (wire.Message, error) { + ret := _m.Called(payload, hash) + + var r0 wire.Message + if rf, ok := ret.Get(0).(func([]byte, [32]byte) wire.Message); ok { + r0 = rf(payload, hash) + } else { + r0 = ret.Get(0).(wire.Message) + } + + var r1 error + if rf, ok := ret.Get(1).(func([]byte, [32]byte) error); ok { + r1 = rf(payload, hash) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Wipe provides a mock function with given fields: +func (_m *Devicer) Wipe() (wire.Message, error) { + ret := _m.Called() + + var r0 wire.Message + if rf, ok := ret.Get(0).(func() wire.Message); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(wire.Message) + } + + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WordAck provides a mock function with given fields: word +func (_m *Devicer) WordAck(word string) (wire.Message, error) { + ret := _m.Called(word) + + var r0 wire.Message + if rf, ok := ret.Get(0).(func(string) wire.Message); ok { + r0 = rf(word) + } else { + r0 = ret.Get(0).(wire.Message) + } + + var r1 error + if rf, ok := ret.Get(1).(func(string) error); ok { + r1 = rf(word) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} diff --git a/src/contrib/hardware-wallet/skywallet/sky-wallet.go b/src/contrib/hardware-wallet/skywallet/sky-wallet.go new file mode 100644 index 00000000..bcfc1949 --- /dev/null +++ b/src/contrib/hardware-wallet/skywallet/sky-wallet.go @@ -0,0 +1,416 @@ +package hardware + +import ( + "errors" + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/readable" + skycoin "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/models" + "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/params" + "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/skytypes" + "github.com/fibercrypto/fibercryptowallet/src/core" + fce "github.com/fibercrypto/fibercryptowallet/src/errors" + "github.com/fibercrypto/fibercryptowallet/src/util/logging" + skyWallet "github.com/fibercrypto/skywallet-go/src/skywallet" + "github.com/fibercrypto/skywallet-protob/go" + "github.com/gogo/protobuf/proto" + "github.com/sirupsen/logrus" +) + +var logSkyWallet = logging.MustGetLogger("Skycoin hardware wallet") + +type SkyWallet struct { + wlt core.Wallet +} + +const ( + urnPrefix = "signer:skywallet:" +) + +// NewSkyWallet create a new sky wallet instance +func NewSkyWallet(wlt core.Wallet) *SkyWallet { + return &SkyWallet{wlt: wlt} +} + +func (sw SkyWallet) ReadyForTxn(wlt core.Wallet, txn core.Transaction) (bool, error) { + if txn != nil { + _, isSkycoinTxn := txn.(skytypes.SkycoinTxn) + if !isSkycoinTxn { + return false, nil + } + } + _, isSkycoinWlt := wlt.(skytypes.SkycoinWallet) + if !isSkycoinWlt { + return false, errors.New("a non Skycoin wallet received in ReadyForTxn") + } + dev := NewSkyWalletHelper() + match, err := dev.DeviceMatch(wlt).Then(func(data interface{}) interface{} { + return data + }).Catch(func(err error) error { + return err + }).Await() + return match.(bool), err +} + +func getAllIndexesFromTxn(txn core.Transaction) []int { + inputs := txn.GetInputs() + indexes := make([]int, len(inputs), cap(inputs)) + for i := 0; i < len(inputs); i++ { + indexes[i] = i + } + return indexes +} + +func findValInSlice(val int, arr []int) bool { + for i := 0; i < len(arr); i++ { + if arr[i] == val { + return true + } + } + return false +} + +func getInputs(wlt core.Wallet, txn coin.Transaction, indexes []int) (inputs []*messages.SkycoinTransactionInput, err error) { + for idx, input := range txn.In { + var transactionInput messages.SkycoinTransactionInput + transactionInput.HashIn = proto.String(input.String()) + if findValInSlice(idx, indexes) { + inputIndex, err := findAddrIndexFromInput(wlt, txn, idx) + if err != nil { + logSkyWallet.WithFields( + logrus.Fields{"err": err, "input": txn.In[idx]}, + ).Errorln("unable to find address index for input") + return nil, err + } + transactionInput.Index = proto.Uint32(inputIndex) + } + inputs = append(inputs, &transactionInput) + } + return inputs, nil +} + +func spendingOutputFromRemote(inputHash cipher.SHA256) (*readable.SpentOutput, error) { + logSkyWallet.Info("Getting spent outputs for transaction inputs") + c, err := skycoin.NewSkycoinApiClient(skycoin.PoolSection) + if err != nil { + return nil, err + } + defer skycoin.ReturnSkycoinClient(c) + out, err := c.UxOut(inputHash.String()) + if err != nil { + logSkyWallet.WithFields( + logrus.Fields{"err": err, "in": inputHash}, + ).Errorln("unable to get output from backend") + return nil, err + } + return out, nil +} + +// findAddrIndexFromInput return the address index for the matching output of the given input index +// FIXME: replace this implementation with precalculated data +func findAddrIndexFromInput(wlt core.Wallet, txn coin.Transaction, inputIndex int) (uint32, error) { + input := txn.In[inputIndex] + retrievedOutput, err := spendingOutputFromRemote(input) + if err != nil { + return 0, err + } + addrIndex, err := getAddrIndex(wlt, retrievedOutput.OwnerAddress) + if err != nil { + logSkyWallet.WithError(err).Errorln("unable to find address index from input") + return 0, err + } + return addrIndex, nil +} + +func getAddrIndex(wlt core.Wallet, addr string) (uint32, error) { + addrs, err := wlt.GetLoadedAddresses() + if err != nil { + return 0, err + } + for i := uint32(0); addrs.Next(); i++ { + if addrs.Value().String() == addr { + return i, nil + } + } + return 0, errors.New("unable to find a matching address from wallet") +} + +func getOutputs(wlt core.Wallet, tr coin.Transaction) (inputs []*messages.SkycoinTransactionOutput, err error) { + for _, output := range tr.Out { + var transactionOutput messages.SkycoinTransactionOutput + transactionOutput.Address = proto.String(output.Address.String()) + transactionOutput.Coin = proto.Uint64(output.Coins) + transactionOutput.Hour = proto.Uint64(output.Hours) + index, err := getAddrIndex(wlt, output.Address.String()) + if err == nil { + transactionOutput.AddressIndex = proto.Uint32(index) + } + inputs = append(inputs, &transactionOutput) + } + return +} + +func readableTxn2Transaction(txn skytypes.ReadableTxn) (*coin.Transaction, error) { + cTxn, err := txn.ToCreatedTransaction() + if err != nil { + return nil, err + } + skyTxn, err := cTxn.ToTransaction() + if err != nil { + return nil, err + } + return skyTxn, nil +} + +func rawTxn2Transaction(txn skytypes.SkycoinTxn) (*coin.Transaction, error) { + buf, err := txn.EncodeSkycoinTransaction() + if err != nil { + logSkyWallet.WithError(err).Errorln("can not encode txn as a Skycoin transaction") + return nil, err + } + skyTxn, err := coin.DeserializeTransaction(buf) + if err != nil { + logSkyWallet.WithError(err).Errorln("can not decode transaction") + return nil, err + } + return &skyTxn, nil +} + +func toTransaction(txn core.Transaction) (*coin.Transaction, error) { + if rTxn, isReadableTxn := txn.(skytypes.ReadableTxn); isReadableTxn { + t, err := readableTxn2Transaction(rTxn) + if err != nil { + logSkyWallet.WithError(err).Errorln("error transforming core.Transaction to coin.Transaction") + return nil, fce.ErrInvalidTypeAssertion + } + return t, nil + } else { + // Raw transaction + unTxn, ok := txn.(*skycoin.SkycoinUninjectedTransaction) + if !ok { + logSkyWallet.Errorln("error transforming core.Transaction to coin.Transaction") + return nil, fce.ErrInvalidTypeAssertion + } + t, err := rawTxn2Transaction(unTxn) + if err != nil { + logSkyWallet.WithError(err).Errorln("error transforming core.Transaction to coin.Transaction") + return nil, fce.ErrInvalidTypeAssertion + } + return t, nil + } +} + +func coin2Core(txn *coin.Transaction, fee uint64) (core.Transaction, error) { + unTxn, err := skycoin.NewUninjectedTransaction(txn, fee) + if err != nil { + logSkyWallet.WithError(err).Errorln("unable to create uninjected transaction") + return nil, fce.ErrTxnSignFailure + } + return unTxn, nil +} + +func (sw *SkyWallet) signTxn(txn *coin.Transaction, idxs []int, dt string) (*coin.Transaction, error) { + transactionInputs, err := getInputs(sw.wlt, *txn, idxs) + if err != nil { + logSkyWallet.WithError(err).Errorln("unable to get inputs") + return nil, fce.ErrTxnSignFailure + } + transactionOutputs, err := getOutputs(sw.wlt, *txn) + if err != nil { + logSkyWallet.WithError(err).Errorln("unable to get outputs") + return nil, fce.ErrTxnSignFailure + } + // FIXME redo this block + rMsg, err := SkyWltInteractionInstance().TransactionSign(transactionInputs, transactionOutputs, dt).Then(func(data interface{}) interface{} { + return data + }).Catch(func(err error) error { + logSkyWallet.WithError(err).Error("error signing transaction") + return err + }).Await() + if err != nil { + return nil, fce.ErrTxnSignFailure + } + signatures, ok := rMsg.([]string) + if !ok { + return nil, errors.New(" FIXME redo this block") + } + if txn.Sigs == nil { + logSkyWallet.Warnln("nil slice in transaction signatures detected, creating a new one") + txn.Sigs = make([]cipher.Sig, len(transactionInputs)) + } + if len(signatures) != len(transactionInputs) { + logSkyWallet.WithFields( + logrus.Fields{ + "signatures_len": len(signatures), + "transactionInputs_len": len(transactionInputs)}).Errorln("signatures response len should match inputs one") + return nil, fce.ErrTxnSignFailure + } + for idx, sign := range signatures { + if !findValInSlice(idx, idxs) { + // NOTE only sign required inputs + continue + } + sgn, err := cipher.SigFromHex(sign) + if err != nil { + logSkyWallet.WithError(err).Errorln("unable to get Skycoin address from buffer") + return nil, errors.New("unable to get Skycoin address from buffer") + } + txn.Sigs[idx] = sgn + } + return txn, nil +} + +func (sw SkyWallet) signTransaction(txn core.Transaction, idxs []int) (core.Transaction, error) { + fee, err := txn.ComputeFee(params.CoinHoursTicker) + if err != nil { + logSkyWallet.WithError(err).Errorln("unable to get fee") + return nil, fce.ErrTxnSignFailure + } + t, err := toTransaction(txn) + if err != nil { + logSkyWallet.WithError(err).Errorln("unable to get txn as coin.Transaction") + return nil, fce.ErrTxnSignFailure + } + dt, err := derivationType(txn) + if err != nil { + return nil, err + } + signed, err := sw.signTxn(t, idxs, dt) + if err != nil { + logSkyWallet.WithError(err).Errorln("unable to sign transaction") + return nil, fce.ErrTxnSignFailure + } + return coin2Core(signed, fee) +} + +func derivationType(txn core.Transaction) (string, error) { + strErrIfAny := "can not determine derivation type" + wt := skyWallet.WalletTypeDeterministic + inputs := txn.GetInputs() + if len(inputs) > 0 { + out, err := inputs[0].GetSpentOutput() + if err != nil { + logSkyWallet.WithFields( + logrus.Fields{ + "err": err, + "input": inputs[0]}).Errorln("unable to get spent output from input") + return "", errors.New(strErrIfAny) + } + addr, err := out.GetAddress() + if err != nil { + logSkyWallet.WithFields( + logrus.Fields{ + "err": err, + "output": out}).Errorln("unable to get addresses from output") + return "", errors.New(strErrIfAny) + } + if addr.IsBip32() { + wt = skyWallet.WalletTypeBip44 + } + } + return wt, nil +} + +func verifyInputsGrouping(txn core.Transaction) error { + dt, err := derivationType(txn) + if err != nil { + return err + } + areBip32 := dt == skyWallet.WalletTypeBip44 + for _, in := range txn.GetInputs() { + out, err := in.GetSpentOutput() + if err != nil { + return err + } + addr, err := out.GetAddress() + if err != nil { + return err + } + if addr.IsBip32() != areBip32 { + return errors.New("all inputs should be grouped by derivation type") + } + } + return nil +} + +// SignTransaction using hardware wallet +func (sw SkyWallet) SignTransaction(txn core.Transaction, pr core.PasswordReader, indexes []string) (core.Transaction, error) { + if err := verifyInputsGrouping(txn); err != nil { + logSkyWallet.WithError(err).Errorln("unable to sign transaction using skycoin hardware wallet") + return nil, fce.ErrTxnSignFailure + } + isFullySigned, err := txn.IsFullySigned() + if err != nil { + return txn, err + } + if isFullySigned { + // TODO named var, this should be used in tests assertions too + return nil, errors.New("Transaction is fully signed") + } + idxs, err := skycoin.GetHashIndices(txn.GetInputs(), indexes) + if err != nil { + logSkyWallet.WithError(err).Errorln("unable to get indexes slice as int slice") + return nil, fce.ErrTxnSignFailure + } + if len(idxs) == 0 { + logSkyWallet.Debugln("not inputs to sign specified, assuming all") + idxs = getAllIndexesFromTxn(txn) + } + signedTxn, err := sw.signTransaction(txn, idxs) + if err != nil { + logSkyWallet.WithError(err).Errorln("error signing transaction with device") + return nil, fce.ErrTxnSignFailure + } + return signedTxn, nil +} + +func (sw SkyWallet) getDeviceFeatures() (messages.Features, error) { + rMsg, err := SkyWltInteractionInstance().Features().Then(func(data interface{}) interface{} { + return data + }).Catch(func(err error) error { + logSkyWallet.WithError(err).Error("error getting device features") + return err + }).Await() + if err != nil { + return messages.Features{}, fce.ErrHwUnexpected + } + features, ok := rMsg.(messages.Features) + if !ok { + return messages.Features{}, errors.New(" FIXME redo this block") + } + return features, nil +} + +// GetSignerUID this signer uid using the hardware wallet label +func (sw SkyWallet) GetSignerUID() (core.UID, error) { + features, err := sw.getDeviceFeatures() + if err != nil { + logSkyWallet.WithError(err).Error("unable to get device features") + return "", fce.ErrHwUnexpected + } + if features.DeviceId == nil { + logSkyWallet.WithField("devId", features.DeviceId).Errorln("unable to get device id") + return core.UID(""), fce.ErrNilValue + } + return core.UID(*features.DeviceId), nil +} + +// GetSignerDescription facilitates a human readable caption identifying this signing strategy +// in urn(https://en.wikipedia.org/wiki/Uniform_Resource_Name) format. +func (sw SkyWallet) GetSignerDescription() (string, error) { + features, err := sw.getDeviceFeatures() + if err != nil { + logSkyWallet.WithError(err).Error("unable to get device features") + return "", fce.ErrHwUnexpected + } + if features.Label == nil { + logSkyWallet.WithField("devLabel", features.Label).Errorln("unable to get device label") + return "", fce.ErrNilValue + } + return urnPrefix + *features.Label, nil +} + +// Type assertions +var ( + _ core.TxnSigner = &SkyWallet{} +) diff --git a/src/contrib/hardware-wallet/skywallet/sky-wallet_test.go b/src/contrib/hardware-wallet/skywallet/sky-wallet_test.go new file mode 100644 index 00000000..1ab6b2ae --- /dev/null +++ b/src/contrib/hardware-wallet/skywallet/sky-wallet_test.go @@ -0,0 +1,412 @@ +package hardware + +import ( + "errors" + "github.com/chebyrash/promise" + "github.com/fibercrypto/fibercryptowallet/src/coin/mocks" + "github.com/fibercrypto/fibercryptowallet/src/core" + fce "github.com/fibercrypto/fibercryptowallet/src/errors" + skyWallet "github.com/fibercrypto/skywallet-go/src/skywallet" + messages "github.com/fibercrypto/skywallet-protob/go" + "github.com/gogo/protobuf/proto" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + "testing" +) + +func createMockedDeviceInteraction(t *testing.T) *mocks.DeviceInteraction { + skyWltInteraction = &mocks.DeviceInteraction{} + require.NotNil(t, SkyWltInteractionInstance()) + require.Equal(t, skyWltInteraction, SkyWltInteractionInstance()) + gi, ok := skyWltInteraction.(*mocks.DeviceInteraction) + require.True(t, ok) + return gi +} + +func TestGetSignerUIDShouldBeOk(t *testing.T) { + // Giving + dev := createMockedDeviceInteraction(t) + expectedDevId := "c24a046d-7d7b-484d-baf6-abedd883023f" + dev.On("Features").Return(promise.New(func(resolve func(interface{}), reject func(error)) { + f := messages.Features{ + DeviceId: proto.String(expectedDevId), + } + resolve(f) + }), nil) + sw := NewSkyWallet(nil) + + // When + devId, err := sw.GetSignerUID() + + // Then + require.NoError(t, err) + require.Equal(t, core.UID(expectedDevId), devId) +} + +func TestGetSignerUIDShouldFailOnNullId(t *testing.T) { + // Giving + dev := createMockedDeviceInteraction(t) + dev.On("Features").Return(promise.New(func(resolve func(interface{}), reject func(error)) { + f := messages.Features{ + DeviceId: nil, + } + resolve(f) + }), nil) + sw := NewSkyWallet(nil) + + // When + devId, err := sw.GetSignerUID() + + // Then + require.Equal(t, err, fce.ErrNilValue) + require.Equal(t, core.UID(""), devId) +} + +func TestGetSignerUIDShouldFailOnDeviceError(t *testing.T) { + // Giving + dev := createMockedDeviceInteraction(t) + dev.On("Features").Return(promise.New(func(resolve func(interface{}), reject func(error)) { + reject(errors.New("any error")) + })) + sw := NewSkyWallet(nil) + + // When + devId, err := sw.GetSignerUID() + + // Then + require.Error(t, err) + require.Equal(t, core.UID(""), devId) +} + +func TestGetSignerDescriptionShouldBeOk(t *testing.T) { + // Giving + dev := createMockedDeviceInteraction(t) + expectedDevDescription := urnPrefix +"c24a046d-7d7b-484d-baf6-abedd883023f" + dev.On("Features").Return(promise.New(func(resolve func(interface{}), reject func(error)) { + f := messages.Features{ + Label: proto.String("c24a046d-7d7b-484d-baf6-abedd883023f"), + } + resolve(f) + })) + sw := NewSkyWallet(nil) + + // When + devDescription, err := sw.GetSignerDescription() + + // Then + require.NoError(t, err) + require.Equal(t, expectedDevDescription, devDescription) +} + +func TestGetSignerDescriptionShouldFailOnDeviceError(t *testing.T) { + // Giving + dev := createMockedDeviceInteraction(t) + dev.On("Features").Return(promise.New(func(resolve func(interface{}), reject func(error)) { + reject(errors.New("")) + })) + sw := NewSkyWallet(nil) + + // When + devId, err := sw.GetSignerDescription() + + // Then + require.Error(t, err) + require.Equal(t, "", devId) +} + +func TestGetSignerDescriptionShouldFailOnNullLabel(t *testing.T) { + // Giving + dev := createMockedDeviceInteraction(t) + dev.On("Features").Return(promise.New(func(resolve func(interface{}), reject func(error)) { + f := messages.Features{ + Label: nil, + } + resolve(f) + })) + sw := NewSkyWallet(nil) + + // When + devId, err := sw.GetSignerDescription() + + // Then + require.Equal(t, err, fce.ErrNilValue) + require.Equal(t, "", devId) +} + +func TestGetFeaturesShouldHandleInvalidMsgResponse(t *testing.T) { + // Giving + dev := createMockedDeviceInteraction(t) + dev.On("Features").Return(promise.New(func(resolve func(interface{}), reject func(error)) { + f := messages.ResponseTransactionSign{} + resolve(f) + })) + sw := NewSkyWallet(nil) + + // When + _, err := sw.getDeviceFeatures() + + // Then + require.Error(t, err) +} + +func TestVerifyDerivationTypeBip44(t *testing.T) { + // Giving + addr := &mocks.Address{} + addr.On("IsBip32").Return(true) + output := &mocks.TransactionOutput{} + output.On("GetAddress").Return(addr, nil) + input := &mocks.TransactionInput{} + input.On("GetSpentOutput").Return(output, nil) + inputs := []core.TransactionInput{input} + txn := &mocks.Transaction{} + txn.On("GetInputs").Return(inputs) + + // When + dt, err := derivationType(txn) + + // Then + require.NoError(t, err) + require.Equal(t, dt, skyWallet.WalletTypeBip44) +} + +func TestVerifyDerivationTypeDeterministic(t *testing.T) { + // Giving + addr := &mocks.Address{} + addr.On("IsBip32").Return(false) + output := &mocks.TransactionOutput{} + output.On("GetAddress").Return(addr, nil) + input := &mocks.TransactionInput{} + input.On("GetSpentOutput").Return(output, nil) + inputs := []core.TransactionInput{input} + txn := &mocks.Transaction{} + txn.On("GetInputs").Return(inputs) + + // When + dt, err := derivationType(txn) + + // Then + require.NoError(t, err) + require.Equal(t, dt, skyWallet.WalletTypeDeterministic) +} + +func TestVerifyInputsGroupingShouldWorkOk1(t *testing.T) { + // Giving + addr1 := &mocks.Address{} + addr2 := &mocks.Address{} + addr1.On("IsBip32").Return(true) + addr2.On("IsBip32").Return(true) + output1 := &mocks.TransactionOutput{} + output2 := &mocks.TransactionOutput{} + output1.On("GetAddress").Return(addr1, nil) + output2.On("GetAddress").Return(addr2, nil) + input1 := &mocks.TransactionInput{} + input2 := &mocks.TransactionInput{} + input1.On("GetSpentOutput").Return(output1, nil) + input2.On("GetSpentOutput").Return(output2, nil) + inputs := []core.TransactionInput{input1, input2} + txn := &mocks.Transaction{} + txn.On("GetInputs").Return(inputs) + + // When + err := verifyInputsGrouping(txn) + + // Then + require.NoError(t, err) +} + +func TestVerifyInputsGroupingShouldWorkOk2(t *testing.T) { + // Giving + addr1 := &mocks.Address{} + addr2 := &mocks.Address{} + addr1.On("IsBip32").Return(false) + addr2.On("IsBip32").Return(false) + output1 := &mocks.TransactionOutput{} + output2 := &mocks.TransactionOutput{} + output1.On("GetAddress").Return(addr1, nil) + output2.On("GetAddress").Return(addr2, nil) + input1 := &mocks.TransactionInput{} + input2 := &mocks.TransactionInput{} + input1.On("GetSpentOutput").Return(output1, nil) + input2.On("GetSpentOutput").Return(output2, nil) + inputs := []core.TransactionInput{input1, input2} + txn := &mocks.Transaction{} + txn.On("GetInputs").Return(inputs) + + // When + err := verifyInputsGrouping(txn) + + // Then + require.NoError(t, err) +} + +func TestVerifyInputsGroupingShouldDetectErr1(t *testing.T) { + // Giving + addr1 := &mocks.Address{} + addr2 := &mocks.Address{} + addr1.On("IsBip32").Return(false) + addr2.On("IsBip32").Return(true) + output1 := &mocks.TransactionOutput{} + output2 := &mocks.TransactionOutput{} + output1.On("GetAddress").Return(addr1, nil) + output2.On("GetAddress").Return(addr2, nil) + input1 := &mocks.TransactionInput{} + input2 := &mocks.TransactionInput{} + input1.On("GetSpentOutput").Return(output1, nil) + input2.On("GetSpentOutput").Return(output2, nil) + inputs := []core.TransactionInput{input1, input2} + txn := &mocks.Transaction{} + txn.On("GetInputs").Return(inputs) + + // When + err := verifyInputsGrouping(txn) + + // Then + require.Error(t, err) +} + +func TestVerifyInputsGroupingShouldDetectErr2(t *testing.T) { + // Giving + addr1 := &mocks.Address{} + addr2 := &mocks.Address{} + addr1.On("IsBip32").Return(true) + addr2.On("IsBip32").Return(false) + output1 := &mocks.TransactionOutput{} + output2 := &mocks.TransactionOutput{} + output1.On("GetAddress").Return(addr1, nil) + output2.On("GetAddress").Return(addr2, nil) + input1 := &mocks.TransactionInput{} + input2 := &mocks.TransactionInput{} + input1.On("GetSpentOutput").Return(output1, nil) + input2.On("GetSpentOutput").Return(output2, nil) + inputs := []core.TransactionInput{input1, input2} + txn := &mocks.Transaction{} + txn.On("GetInputs").Return(inputs) + + // When + err := verifyInputsGrouping(txn) + + // Then + require.Error(t, err) +} + +func TestSignTransactionShouldDetectInvalidInputsGrouping(t *testing.T) { + // Giving + addr1 := &mocks.Address{} + addr2 := &mocks.Address{} + addr1.On("IsBip32").Return(true) + addr2.On("IsBip32").Return(false) + output1 := &mocks.TransactionOutput{} + output2 := &mocks.TransactionOutput{} + output1.On("GetAddress").Return(addr1, nil) + output2.On("GetAddress").Return(addr2, nil) + input1 := &mocks.TransactionInput{} + input2 := &mocks.TransactionInput{} + input1.On("GetSpentOutput").Return(output1, nil) + input2.On("GetSpentOutput").Return(output2, nil) + inputs := []core.TransactionInput{input1, input2} + txn := &mocks.Transaction{} + txn.On("GetInputs").Return(inputs) + wlt := NewSkyWallet(&mocks.Wallet{}) + + // When + _, err := wlt.SignTransaction( + txn, func(string, core.KeyValueStore) (string, error){return "", nil}, []string{}) + + // Then + require.Error(t, err) + require.Equal(t, fce.ErrTxnSignFailure, err) +} + +func TestSignTransactionShouldHandleErrorFromIsFullySigned(t *testing.T) { + // Giving + addr1 := &mocks.Address{} + addr1.On("IsBip32").Return(true) + output1 := &mocks.TransactionOutput{} + output1.On("GetAddress").Return(addr1, nil) + input1 := &mocks.TransactionInput{} + input1.On("GetSpentOutput").Return(output1, nil) + inputs := []core.TransactionInput{input1} + txn := &mocks.Transaction{} + txn.On("GetInputs").Return(inputs) + txn.On("IsFullySigned").Return(false, errors.New("asd")) + wlt := NewSkyWallet(&mocks.Wallet{}) + + // When + _, err := wlt.SignTransaction( + txn, func(string, core.KeyValueStore) (string, error){return "", nil}, []string{}) + + // Then + require.Error(t, err) + require.Equal(t, errors.New("asd"), err) +} + +func TestSignTransactionShouldHandleFailIfIsFullySigned(t *testing.T) { + // Giving + addr1 := &mocks.Address{} + addr1.On("IsBip32").Return(true) + output1 := &mocks.TransactionOutput{} + output1.On("GetAddress").Return(addr1, nil) + input1 := &mocks.TransactionInput{} + input1.On("GetSpentOutput").Return(output1, nil) + inputs := []core.TransactionInput{input1} + txn := &mocks.Transaction{} + txn.On("GetInputs").Return(inputs) + txn.On("IsFullySigned").Return(true, nil) + wlt := NewSkyWallet(&mocks.Wallet{}) + + // When + _, err := wlt.SignTransaction( + txn, func(string, core.KeyValueStore) (string, error){return "", nil}, []string{}) + + // Then + require.Error(t, err) + require.Equal(t, errors.New("Transaction is fully signed"), err) +} + +func TestSignTransactionShouldHandleErrorFromGetHashIndices(t *testing.T) { + //t.Skip("ddd") + // Giving + addr1 := &mocks.Address{} + addr1.On("IsBip32").Return(true) + output1 := &mocks.TransactionOutput{} + output1.On("GetAddress").Return(addr1, nil) + input1 := &mocks.TransactionInput{} + input1.On("GetSpentOutput").Return(output1, nil) + inputs := []core.TransactionInput{input1} + txn := &mocks.Transaction{} + txn.On("GetInputs").Return(inputs) + txn.On("IsFullySigned").Return(false, nil) + wlt := NewSkyWallet(&mocks.Wallet{}) + + // When + _, err := wlt.SignTransaction( + txn, func(string, core.KeyValueStore) (string, error){return "", nil}, []string{"#asd"}) + + // Then + require.Error(t, err) + require.Equal(t, fce.ErrTxnSignFailure, err) +} + +func TestSignTransactionShouldHandleErrorFromsignTransaction(t *testing.T) { + // Giving + addr1 := &mocks.Address{} + addr1.On("IsBip32").Return(true) + output1 := &mocks.TransactionOutput{} + output1.On("GetAddress").Return(addr1, nil) + input1 := &mocks.TransactionInput{} + input1.On("GetSpentOutput").Return(output1, nil) + inputs := []core.TransactionInput{input1} + txn := &mocks.Transaction{} + txn.On("GetInputs").Return(inputs) + txn.On("IsFullySigned").Return(false, nil) + txn.On("ComputeFee", mock.Anything).Return(uint64(0), errors.New("error computing fee")) + wlt := NewSkyWallet(&mocks.Wallet{}) + + // When + _, err := wlt.SignTransaction( + txn, func(string, core.KeyValueStore) (string, error){return "", nil}, nil) + + // Then + require.Error(t, err) + require.Equal(t, fce.ErrTxnSignFailure, err) +} diff --git a/src/contrib/hardware-wallet/skywallet/sky_wallet_helper.go b/src/contrib/hardware-wallet/skywallet/sky_wallet_helper.go new file mode 100644 index 00000000..b6d45ecc --- /dev/null +++ b/src/contrib/hardware-wallet/skywallet/sky_wallet_helper.go @@ -0,0 +1,101 @@ +package hardware + +import ( + "github.com/chebyrash/promise" + hardware_wallet "github.com/fibercrypto/fibercryptowallet/src/contrib/hardware-wallet" + "github.com/fibercrypto/fibercryptowallet/src/core" + skyWallet "github.com/fibercrypto/skywallet-go/src/skywallet" + messages "github.com/fibercrypto/skywallet-protob/go" +) + +type SkyWalletHelper struct { + di hardware_wallet.DeviceInteraction +} + +func NewSkyWalletHelper() hardware_wallet.DeviceHelper{ + return &SkyWalletHelper{di: SkyWltInteractionInstance()} +} + +func (dev *SkyWalletHelper) FirstAddress(walletType string) *promise.Promise { + prm := dev.di.AddressGen(1, 0, false, walletType) + return prm.Then(func(data interface{}) interface{} { + addresses := data.([]string) + return addresses[0] + }) +} + +func matcher(wlt core.Wallet, firstAddr string) bool { + addrs := wlt.GenAddresses(core.AccountAddress, 0, 1, nil) + if addrs.Next() { + addr := addrs.Value() + return addr.String() == firstAddr + } + return false +} + +func (dev *SkyWalletHelper) DeviceMatch(wlt core.Wallet) *promise.Promise { + prm := dev.FirstAddress(skyWallet.WalletTypeDeterministic) + return prm.Then(func(data interface{}) interface{} { + return matcher(wlt, data.(string)) + }).Then(func(data interface{}) interface{} { + if !data.(bool) { + return dev.FirstAddress(skyWallet.WalletTypeBip44) + } + return true + }).Then(func(data interface{}) interface{} { + if val, ok := data.(bool); ok { + return val + } + return matcher(wlt, data.(string)) + }) +} + +func (dev *SkyWalletHelper) ShouldBeSecured() *promise.Promise { + if dev.di.SecureWasWarn() { + return promise.New(func(resolve func(interface{}), reject func(error)) { + resolve(false) + }).Then(func(data interface{}) interface{} { + return data + }) + } + return dev.di.Features().Then(func(data interface{}) interface{} { + features := data.(messages.Features) + if !*features.PinProtection { + return true + } + if *features.NeedsBackup { + return true + } + return false + }) +} + +func (dev *SkyWalletHelper) ShouldBeInitialized() *promise.Promise { + if dev.di.InitializeWasWarn() { + return promise.New(func(resolve func(interface{}), reject func(error)) { + resolve(false) + }).Then(func(data interface{}) interface{} { + return data + }) + } + return dev.di.Features().Then(func(data interface{}) interface{} { + features := data.(messages.Features) + if !*features.Initialized { + return true + } + return false + }) +} + +func (dev *SkyWalletHelper) IsBootloaderMode() *promise.Promise { + return dev.di.Features().Then(func(data interface{}) interface{} { + return data.(messages.Features).BootloaderMode != nil && *data.(messages.Features).BootloaderMode + }) +} + +func (dev *SkyWalletHelper) ShouldUploadFirmware() *promise.Promise { + if dev.di.UploadFirmwareWasWarn() { + return promise.Resolve(false) + } + return dev.IsBootloaderMode() +} diff --git a/src/contrib/hardware-wallet/skywallet/sky_wallet_helper_test.go b/src/contrib/hardware-wallet/skywallet/sky_wallet_helper_test.go new file mode 100644 index 00000000..ac4a0ed6 --- /dev/null +++ b/src/contrib/hardware-wallet/skywallet/sky_wallet_helper_test.go @@ -0,0 +1,357 @@ +package hardware + +import ( + "github.com/chebyrash/promise" + mocks2 "github.com/fibercrypto/fibercryptowallet/src/coin/mocks" + hardware_wallet "github.com/fibercrypto/fibercryptowallet/src/contrib/hardware-wallet" + "github.com/fibercrypto/fibercryptowallet/src/core" + skyWallet "github.com/fibercrypto/skywallet-go/src/skywallet" + messages "github.com/fibercrypto/skywallet-protob/go" + "github.com/gogo/protobuf/proto" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + "testing" +) + +func createDeviceHelper(di hardware_wallet.DeviceInteraction) hardware_wallet.DeviceHelper { + return &SkyWalletHelper{di: di} +} + +func TestDevHelperInitialization(t *testing.T) { + // Giving + // When + dh := NewSkyWalletHelper() + + // Then + swh, ok := dh.(*SkyWalletHelper) + require.True(t, ok) + require.Equal(t, swh.di, SkyWltInteractionInstance()) +} + +func TestFirstAddressShouldWorkOk(t *testing.T) { + // Giving + di := &mocks2.DeviceInteraction{} + orgAddrs := []string{"jhfjdhfjd", "dfd787fd8"} + prm := promise.New(func(resolve func(interface{}), reject func(error)) { + resolve(orgAddrs) + }) + di.On("AddressGen", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(prm, nil) + dh := createDeviceHelper(di) + + // When + addr, err := dh.FirstAddress("deterministic").Then(func(data interface{}) interface{} { + return data + }).Await() + + // Then + require.NoError(t, err) + addrStr, ok := addr.(string) + require.True(t, ok) + require.Equal(t, orgAddrs[0], addrStr) +} + +func TestMatcherShouldFindItIfFound(t *testing.T) { + // Giving + orgAddrs := []string{"jhfjdhfjd", "dfd787fd8"} + addr := &mocks2.Address{} + addr.On("String").Return(orgAddrs[0]) + addrIt := &mocks2.AddressIterator{} + addrIt.On("Next").Return(true) + addrIt.On("Value").Return(addr) + wlt := &mocks2.Wallet{} + wlt.On("GenAddresses", core.AccountAddress, uint32(0), uint32(1), mock.AnythingOfType("core.PasswordReader")).Return(addrIt) + + // When + found := matcher(wlt, orgAddrs[0]) + + // Then + require.True(t, found) +} + +func TestMatcherShouldNotFindItIfNotFound(t *testing.T) { + // Giving + orgAddrs := []string{"jhfjdhfjd", "dfd787fd8"} + addr := &mocks2.Address{} + addr.On("String").Return(orgAddrs[0]) + addrIt := &mocks2.AddressIterator{} + addrIt.On("Next").Return(true) + addrIt.On("Value").Return(addr) + wlt := &mocks2.Wallet{} + wlt.On("GenAddresses", core.AccountAddress, uint32(0), uint32(1), mock.AnythingOfType("core.PasswordReader")).Return(addrIt) + + // When + found := matcher(wlt, "orgAddrs[0]") + + // Then + require.False(t, found) +} + +func TestMatcherShouldNotFindItIfWltCanNotGenerateAdrrs(t *testing.T) { + // Giving + addrIt := &mocks2.AddressIterator{} + addrIt.On("Next").Return(false) + wlt := &mocks2.Wallet{} + wlt.On("GenAddresses", core.AccountAddress, uint32(0), uint32(1), mock.AnythingOfType("core.PasswordReader")).Return(addrIt) + + // When + found := matcher(wlt, "") + + // Then + require.False(t, found) +} + +func TestDeviceMatchShouldWorkOk4DeterministicWlt(t *testing.T) { + // Giving + orgAddrs := []string{"jhfjdhfjd", "dfd787fd8"} + addr := &mocks2.Address{} + addr.On("String").Return(orgAddrs[0]) + addrIt := &mocks2.AddressIterator{} + addrIt.On("Next").Return(true) + addrIt.On("Value").Return(addr) + wlt := &mocks2.Wallet{} + wlt.On("GenAddresses", core.AccountAddress, uint32(0), uint32(1), mock.AnythingOfType("core.PasswordReader")).Return(addrIt) + di := &mocks2.DeviceInteraction{} + prm := promise.New(func(resolve func(interface{}), reject func(error)) { + resolve(orgAddrs) + }) + di.On("AddressGen", uint32(1), uint32(0), false, skyWallet.WalletTypeDeterministic).Return(prm) + dh := createDeviceHelper(di) + + // When + match, err := dh.DeviceMatch(wlt).Then(func(data interface{}) interface{} { + return data + }).Await() + + // Then + require.NoError(t, err) + matchBool, ok := match.(bool) + require.True(t, ok) + require.True(t, matchBool) +} + +func TestDeviceMatchShouldWorkOk4Bip44Wlt(t *testing.T) { + // Giving + orgAddrs := []string{"jhfjdhfjd", "dfd787fd8"} + addr := &mocks2.Address{} + addr.On("String").Return(orgAddrs[0]) + addrIt := &mocks2.AddressIterator{} + addrIt.On("Next").Return(true) + addrIt.On("Value").Return(addr) + wlt := &mocks2.Wallet{} + wlt.On("GenAddresses", core.AccountAddress, uint32(0), uint32(1), mock.AnythingOfType("core.PasswordReader")).Return(addrIt) + di := &mocks2.DeviceInteraction{} + prm := promise.New(func(resolve func(interface{}), reject func(error)) { + resolve(orgAddrs) + }) + invalidpPrm := promise.New(func(resolve func(interface{}), reject func(error)) { + resolve([]string{""}) + }) + di.On("AddressGen", uint32(1), uint32(0), false, skyWallet.WalletTypeDeterministic).Return(invalidpPrm) + di.On("AddressGen", uint32(1), uint32(0), false, skyWallet.WalletTypeBip44).Return(prm) + dh := createDeviceHelper(di) + + // When + match, err := dh.DeviceMatch(wlt).Then(func(data interface{}) interface{} { + return data + }).Await() + + // Then + require.NoError(t, err) + matchBool, ok := match.(bool) + require.True(t, ok) + require.True(t, matchBool) +} + +func TestShouldBeSecuredShouldReturnFalseAfterFirstTime(t *testing.T) { + // Giving + di := &mocks2.DeviceInteraction{} + di.On("SecureWasWarn").Return(true) + dh := createDeviceHelper(di) + + // When + val, err := dh.ShouldBeSecured().Await() + + // Then + require.NoError(t, err) + matchBool, ok := val.(bool) + require.True(t, ok) + require.False(t, matchBool) +} + +func TestShouldBeSecuredShouldReturnTrueForPinProtection(t *testing.T) { + // Giving + di := &mocks2.DeviceInteraction{} + di.On("SecureWasWarn").Return(false) + prm := promise.New(func(resolve func(interface{}), reject func(error)) { + resolve(messages.Features{PinProtection: proto.Bool(false)}) + }) + di.On("Features").Return(prm) + dh := createDeviceHelper(di) + + // When + val, err := dh.ShouldBeSecured().Await() + + // Then + require.NoError(t, err) + matchBool, ok := val.(bool) + require.True(t, ok) + require.True(t, matchBool) +} + +func TestShouldBeSecuredShouldReturnTrueForNeedBackup(t *testing.T) { + // Giving + di := &mocks2.DeviceInteraction{} + di.On("SecureWasWarn").Return(false) + prm := promise.New(func(resolve func(interface{}), reject func(error)) { + resolve( + messages.Features{ + PinProtection: proto.Bool(true), + NeedsBackup: proto.Bool(true)}) + }) + di.On("Features").Return(prm) + dh := createDeviceHelper(di) + + // When + val, err := dh.ShouldBeSecured().Await() + + // Then + require.NoError(t, err) + matchBool, ok := val.(bool) + require.True(t, ok) + require.True(t, matchBool) +} + +func TestShouldBeSecuredShouldReturnFalseForNoNeedBackupAndHavePin(t *testing.T) { + // Giving + di := &mocks2.DeviceInteraction{} + di.On("SecureWasWarn").Return(false) + prm := promise.New(func(resolve func(interface{}), reject func(error)) { + resolve( + messages.Features{ + PinProtection: proto.Bool(true), + NeedsBackup: proto.Bool(false)}) + }) + di.On("Features").Return(prm) + dh := createDeviceHelper(di) + + // When + val, err := dh.ShouldBeSecured().Await() + + // Then + require.NoError(t, err) + matchBool, ok := val.(bool) + require.True(t, ok) + require.False(t, matchBool) +} + +func TestShouldBeInitializedShouldReturnFalseAfterFirstTime(t *testing.T) { + // Giving + di := &mocks2.DeviceInteraction{} + di.On("InitializeWasWarn").Return(true) + dh := createDeviceHelper(di) + + // When + val, err := dh.ShouldBeInitialized().Await() + + // Then + require.NoError(t, err) + matchBool, ok := val.(bool) + require.True(t, ok) + require.False(t, matchBool) +} + +func TestShouldBeInitializedShouldReturnTrueForPinProtection(t *testing.T) { + // Giving + di := &mocks2.DeviceInteraction{} + di.On("InitializeWasWarn").Return(false) + prm := promise.New(func(resolve func(interface{}), reject func(error)) { + resolve(messages.Features{Initialized: proto.Bool(false)}) + }) + di.On("Features").Return(prm) + dh := createDeviceHelper(di) + + // When + val, err := dh.ShouldBeInitialized().Await() + + // Then + require.NoError(t, err) + matchBool, ok := val.(bool) + require.True(t, ok) + require.True(t, matchBool) +} + +func TestShouldBeInitializedShouldReturnFalseForInitialized(t *testing.T) { + // Giving + di := &mocks2.DeviceInteraction{} + di.On("InitializeWasWarn").Return(false) + prm := promise.New(func(resolve func(interface{}), reject func(error)) { + resolve(messages.Features{Initialized: proto.Bool(true)}) + }) + di.On("Features").Return(prm) + dh := createDeviceHelper(di) + + // When + val, err := dh.ShouldBeInitialized().Await() + + // Then + require.NoError(t, err) + matchBool, ok := val.(bool) + require.True(t, ok) + require.False(t, matchBool) +} + +func TestShouldUploadFirmwareReturnFalseAfterFirstTime(t *testing.T) { + // Giving + di := &mocks2.DeviceInteraction{} + di.On("UploadFirmwareWasWarn").Return(true) + dh := createDeviceHelper(di) + + // When + val, err := dh.ShouldUploadFirmware().Await() + + // Then + require.NoError(t, err) + matchBool, ok := val.(bool) + require.True(t, ok) + require.False(t, matchBool) +} + +func TestIsBootLoaderShouldReturnTrue4BootLoaderMode(t *testing.T) { + // Giving + di := &mocks2.DeviceInteraction{} + di.On("UploadFirmwareWasWarn").Return(false) + prm := promise.New(func(resolve func(interface{}), reject func(error)) { + resolve(messages.Features{BootloaderMode: proto.Bool(true)}) + }) + di.On("Features").Return(prm) + dh := createDeviceHelper(di) + + // When + val, err := dh.ShouldUploadFirmware().Await() + + // Then + require.NoError(t, err) + matchBool, ok := val.(bool) + require.True(t, ok) + require.True(t, matchBool) +} + +func TestIsBootLoaderShouldReturnFalse4NonBootLoaderMode(t *testing.T) { + // Giving + di := &mocks2.DeviceInteraction{} + di.On("UploadFirmwareWasWarn").Return(false) + prm := promise.New(func(resolve func(interface{}), reject func(error)) { + resolve(messages.Features{BootloaderMode: proto.Bool(false)}) + }) + di.On("Features").Return(prm) + dh := createDeviceHelper(di) + + // When + val, err := dh.ShouldUploadFirmware().Await() + + // Then + require.NoError(t, err) + matchBool, ok := val.(bool) + require.True(t, ok) + require.False(t, matchBool) +} \ No newline at end of file diff --git a/src/contrib/hardware-wallet/skywallet/skywallet_device_interaction.go b/src/contrib/hardware-wallet/skywallet/skywallet_device_interaction.go new file mode 100644 index 00000000..919a3fb7 --- /dev/null +++ b/src/contrib/hardware-wallet/skywallet/skywallet_device_interaction.go @@ -0,0 +1,313 @@ +package hardware + +import ( + "fmt" + "github.com/chebyrash/promise" + "github.com/fibercrypto/fibercryptowallet/src/contrib/hardware-wallet" + "github.com/fibercrypto/skywallet-go/src/integration/proxy" + "github.com/fibercrypto/skywallet-go/src/skywallet" + messages "github.com/fibercrypto/skywallet-protob/go" + "github.com/gogo/protobuf/proto" + "sync" +) + +type SkyWalletInteraction struct { + dev skywallet.Devicer + initializeWasWarn bool + uploadFirmwareWasWarn bool + secureWasWarn bool +} + +var once sync.Once +var skyWltInteraction hardware_wallet.DeviceInteraction + +// CreateSkyWltInteractionInstanceOnce initialize the device instance. +// Trying to change the device interaction behavior by using +// different arguments does not works because this is a singleton +// like function method. +func CreateSkyWltInteractionInstanceOnce(autoPressButton bool, deviceType skywallet.DeviceType, inputReader func(skywallet.InputRequestKind, string, string)(string, error)) hardware_wallet.DeviceInteraction { + once.Do(func() { + var dev skywallet.Devicer + dev = proxy.NewSequencer(skywallet.NewDevice(deviceType), true, inputReader) + if autoPressButton && deviceType == skywallet.DeviceTypeEmulator { + dev.SetAutoPressButton(true, skywallet.ButtonRight) + } + skyWltInteraction = &SkyWalletInteraction{dev: dev} + skyWltInteraction.ClearSingleTimeOperationsCache() + }) + return skyWltInteraction +} + +// SkyWltInteractionInstance return the shared device interaction instance +func SkyWltInteractionInstance() hardware_wallet.DeviceInteraction { + if skyWltInteraction == nil { + logSkyWallet.Errorln("device instance is null, a previous call to CreateSkyWltInteractionInstanceOnce it's required") + } + return skyWltInteraction +} + +func(wlt *SkyWalletInteraction) AddressGen(addressN, startIndex uint32, confirmAddress bool, walletType string) *promise.Promise { + return promise.New(func(resolve func(interface{}), reject func(error)) { + msg, err := wlt.dev.AddressGen(addressN, startIndex, confirmAddress, walletType) + if err != nil { + reject(err) + return + } + addresses, err := skywallet.DecodeResponseSkycoinAddress(msg) + if err != nil { + reject(err) + return + } + resolve(addresses) + }) +} + +func(wlt *SkyWalletInteraction) ApplySettings(usePassphrase *bool, label string, language string) *promise.Promise { + return promise.New(func(resolve func(interface{}), reject func(error)) { + msg, err := wlt.dev.ApplySettings(usePassphrase, label, language) + if err != nil { + reject(err) + return + } + msgStr, err := skywallet.DecodeSuccessMsg(msg) + if err != nil { + reject(err) + return + } + resolve(msgStr) + }) +} + +func(wlt *SkyWalletInteraction) Backup() *promise.Promise { + return promise.New(func(resolve func(interface{}), reject func(error)) { + msg, err := wlt.dev.Backup() + if err != nil { + reject(err) + return + } + msgStr, err := skywallet.DecodeSuccessMsg(msg) + if err != nil { + reject(err) + return + } + resolve(msgStr) + }) +} + +func(wlt *SkyWalletInteraction) CheckMessageSignature(message, signature, address string) *promise.Promise { + return promise.New(func(resolve func(interface{}), reject func(error)) { + msg, err := wlt.dev.CheckMessageSignature(message, signature, address) + if err != nil { + reject(err) + return + } + msgStr, err := skywallet.DecodeSuccessMsg(msg) + if err != nil { + reject(err) + return + } + resolve(msgStr) + }) +} + +func(wlt *SkyWalletInteraction) ChangePin(removePin *bool) *promise.Promise { + return promise.New(func(resolve func(interface{}), reject func(error)) { + msg, err := wlt.dev.ChangePin(removePin) + if err != nil { + reject(err) + return + } + msgStr, err := skywallet.DecodeSuccessMsg(msg) + if err != nil { + reject(err) + return + } + resolve(msgStr) + }) +} + +func(wlt *SkyWalletInteraction) IsAvailable() *promise.Promise { + return promise.New(func(resolve func(interface{}), reject func(error)) { + resolve(wlt.dev.Available()) + }) +} + +func(wlt *SkyWalletInteraction) UploadFirmware(payload []byte, hash [32]byte) *promise.Promise { + return promise.New(func(resolve func(interface{}), reject func(error)) { + msg, err := wlt.dev.UploadFirmware(payload, hash) + if err != nil { + reject(err) + return + } + msgStr, err := skywallet.DecodeSuccessMsg(msg) + if err != nil { + reject(err) + return + } + resolve(msgStr) + }) +} + +func(wlt *SkyWalletInteraction) Features() *promise.Promise { + return promise.New(func(resolve func(interface{}), reject func(error)) { + msg, err := wlt.dev.GetFeatures() + if err != nil { + reject(err) + return + } + // TODO move it to lib + if msg.Kind != uint16(messages.MessageType_MessageType_Features) { + reject(fmt.Errorf("calling DecodeFeaturesMsg with wrong message type: %s", messages.MessageType(msg.Kind))) + return + } + features := messages.Features{} + if err = proto.Unmarshal(msg.Data, &features); err != nil { + reject(err) + return + } + resolve(features) + }) +} + +func(wlt *SkyWalletInteraction) GenerateMnemonic(wordCount uint32, usePassphrase bool) *promise.Promise { + return promise.New(func(resolve func(interface{}), reject func(error)) { + msg, err := wlt.dev.GenerateMnemonic(wordCount, usePassphrase) + if err != nil { + reject(err) + return + } + msgStr, err := skywallet.DecodeSuccessMsg(msg) + if err != nil { + reject(err) + return + } + resolve(msgStr) + }) +} + +func(wlt *SkyWalletInteraction) SetMnemonic(mnemonic string) *promise.Promise { + return promise.New(func(resolve func(interface{}), reject func(error)) { + msg, err := wlt.dev.SetMnemonic(mnemonic) + if err != nil { + reject(err) + return + } + msgStr, err := skywallet.DecodeSuccessMsg(msg) + if err != nil { + reject(err) + return + } + resolve(msgStr) + }) +} + +func(wlt *SkyWalletInteraction) Recovery(wordCount uint32, usePassphrase *bool, dryRun bool) *promise.Promise { + return promise.New(func(resolve func(interface{}), reject func(error)) { + msg, err := wlt.dev.Recovery(wordCount, usePassphrase, dryRun) + if err != nil { + reject(err) + return + } + msgStr, err := skywallet.DecodeSuccessMsg(msg) + if err != nil { + reject(err) + return + } + resolve(msgStr) + }) +} + +func(wlt *SkyWalletInteraction) TransactionSign(inputs []*messages.SkycoinTransactionInput, outputs []*messages.SkycoinTransactionOutput, walletType string) *promise.Promise { + return promise.New(func(resolve func(interface{}), reject func(error)) { + msg, err := wlt.dev.TransactionSign(inputs, outputs, walletType) + if err != nil { + reject(err) + return + } + signatures, err := skywallet.DecodeResponseTransactionSign(msg) + if err != nil { + reject(err) + return + } + resolve(signatures) + }) +} + +func(wlt *SkyWalletInteraction) SignMessage(addressN, addressIndex int, message string, walletType string) *promise.Promise { + return promise.New(func(resolve func(interface{}), reject func(error)) { + msg, err := wlt.dev.SignMessage(addressN, addressIndex, message, walletType) + if err != nil { + reject(err) + return + } + msgStr, err := skywallet.DecodeResponseSkycoinSignMessage(msg) + if err != nil { + reject(err) + return + } + resolve(msgStr) + }) +} + +func(wlt *SkyWalletInteraction) Wipe() *promise.Promise { + return promise.New(func(resolve func(interface{}), reject func(error)) { + msg, err := wlt.dev.Wipe() + if err != nil { + reject(err) + return + } + msgStr, err := skywallet.DecodeSuccessMsg(msg) + if err != nil { + reject(err) + return + } + resolve(msgStr) + }) +} + +// TODO refactor all success into a reusable function +func (wlt *SkyWalletInteraction) Cancel() *promise.Promise { + return promise.New(func(resolve func(interface{}), reject func(error)) { + msg, err := wlt.dev.Cancel() + if err != nil { + reject(err) + return + } + msgStr, err := skywallet.DecodeFailMsg(msg) + if err != nil { + reject(err) + return + } + resolve(msgStr) + }) +} + +func (wlt *SkyWalletInteraction) SetUploadFirmwareWasWarn() { + wlt.uploadFirmwareWasWarn = true +} + +func (wlt *SkyWalletInteraction) UploadFirmwareWasWarn() bool { + return wlt.uploadFirmwareWasWarn +} + +func (wlt *SkyWalletInteraction) SetInitializeWasWarn() { + wlt.initializeWasWarn = true +} + +func (wlt *SkyWalletInteraction) InitializeWasWarn() bool { + return wlt.initializeWasWarn +} + +func (wlt *SkyWalletInteraction) SetSecureWasWarn() { + wlt.secureWasWarn = true +} + +func (wlt *SkyWalletInteraction) SecureWasWarn() bool { + return wlt.secureWasWarn +} + +func (wlt *SkyWalletInteraction) ClearSingleTimeOperationsCache() { + wlt.uploadFirmwareWasWarn = false + wlt.initializeWasWarn = false + wlt.secureWasWarn = false +} \ No newline at end of file diff --git a/src/contrib/hardware-wallet/skywallet/skywallet_device_interaction_test.go b/src/contrib/hardware-wallet/skywallet/skywallet_device_interaction_test.go new file mode 100644 index 00000000..f3342e4b --- /dev/null +++ b/src/contrib/hardware-wallet/skywallet/skywallet_device_interaction_test.go @@ -0,0 +1,1026 @@ +package hardware + +import ( + "errors" + hardware_wallet "github.com/fibercrypto/fibercryptowallet/src/contrib/hardware-wallet" + "github.com/fibercrypto/fibercryptowallet/src/contrib/hardware-wallet/skywallet/mocks" + "github.com/fibercrypto/skywallet-go/src/skywallet" + "github.com/fibercrypto/skywallet-go/src/skywallet/wire" + messages "github.com/fibercrypto/skywallet-protob/go" + "github.com/gogo/protobuf/proto" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + "strings" + "testing" +) + +func createDeviceInteraction(dev skywallet.Devicer) hardware_wallet.DeviceInteraction { + return &SkyWalletInteraction{ + dev: dev, + initializeWasWarn: false, + uploadFirmwareWasWarn: false, + secureWasWarn: false, + } +} + +func TestAddressGenShouldWorkOk(t *testing.T) { + // Giving + dev := &mocks.Devicer{} + orgAddrs := []string{"jhfjdhfjd", "dfd787fd8"} + addrResp := messages.ResponseSkycoinAddress{Addresses: orgAddrs} + data, err := proto.Marshal(&addrResp) + require.NoError(t, err) + msg := wire.Message{ + Kind: uint16(messages.MessageType_MessageType_ResponseSkycoinAddress), + Data: data, + } + dev.On("AddressGen", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(msg, nil) + di := createDeviceInteraction(dev) + + // When + addrs, err := di.AddressGen(uint32(1), uint32(1), false, "deterministic").Then(func(data interface{}) interface{} { + return data + }).Await() + + // Then + require.NoError(t, err) + addrStrs, ok := addrs.([]string) + require.True(t, ok) + require.Len(t, addrStrs, 2) + require.Equal(t, orgAddrs[0], addrStrs[0]) + require.Equal(t, orgAddrs[1], addrStrs[1]) +} + +func TestAddressGenShouldHandleDeviceError(t *testing.T) { + // Giving + dev := &mocks.Devicer{} + dev.On("AddressGen", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(wire.Message{}, errors.New("")) + di := createDeviceInteraction(dev) + + // When + _, err := di.AddressGen(uint32(1), uint32(1), false, "deterministic").Then(func(data interface{}) interface{} { + return data + }).Await() + + // Then + require.Error(t, err) +} + +func TestAddressGenShouldHandleErrorDecodingResponse(t *testing.T) { + // Giving + dev := &mocks.Devicer{} + orgAddrs := []string{"jhfjdhfjd", "dfd787fd8"} + addrResp := messages.ResponseSkycoinAddress{Addresses: orgAddrs} + data, err := proto.Marshal(&addrResp) + require.NoError(t, err) + msg := wire.Message{ + Kind: uint16(messages.MessageType_MessageType_Success), + Data: data, + } + dev.On("AddressGen", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(msg, nil) + di := createDeviceInteraction(dev) + + // When + _, err = di.AddressGen(uint32(1), uint32(1), false, "deterministic").Then(func(data interface{}) interface{} { + return data + }).Await() + + // Then + require.Error(t, err) + require.Equal(t, err, errors.New("calling DecodeResponseSkycoinAddress with wrong message type: MessageType_Success")) +} + +func TestApplySettingsShouldWorkOk(t *testing.T) { + // Giving + dev := &mocks.Devicer{} + orgMsg := "great" + applySettingResp := messages.Success{Message: proto.String(orgMsg)} + data, err := proto.Marshal(&applySettingResp) + require.NoError(t, err) + msg := wire.Message{ + Kind: uint16(messages.MessageType_MessageType_Success), + Data: data, + } + dev.On("ApplySettings", mock.Anything, mock.Anything, mock.Anything).Return(msg, nil) + di := createDeviceInteraction(dev) + + // When + response, err := di.ApplySettings(nil, "l", "l").Then(func(data interface{}) interface{} { + return data + }).Await() + + // Then + require.NoError(t, err) + responseStr, ok := response.(string) + require.True(t, ok) + require.Equal(t, orgMsg, responseStr) +} + +func TestApplySettingsShouldHandleDeviceError(t *testing.T) { + // Giving + dev := &mocks.Devicer{} + dev.On("ApplySettings", mock.Anything, mock.Anything, mock.Anything).Return(wire.Message{}, errors.New("")) + di := createDeviceInteraction(dev) + + // When + _, err := di.ApplySettings(nil, "l", "l").Then(func(data interface{}) interface{} { + return data + }).Await() + + // Then + require.Error(t, err) +} + +func TestApplySettingShouldHandleErrorDecodingResponse(t *testing.T) { + // Giving + dev := &mocks.Devicer{} + orgResp := "jhfjdhfjd" + applySettingsResp := messages.Failure{Message: proto.String(orgResp)} + data, err := proto.Marshal(&applySettingsResp) + require.NoError(t, err) + msg := wire.Message{ + Kind: uint16(messages.MessageType_MessageType_Failure), + Data: data, + } + dev.On("ApplySettings", mock.Anything, mock.Anything, mock.Anything).Return(msg, nil) + di := createDeviceInteraction(dev) + + // When + _, err = di.ApplySettings(nil, "l","l").Then(func(data interface{}) interface{} { + return data + }).Await() + + // Then + require.Error(t, err) + require.Equal(t, err, errors.New("calling DecodeSuccessMsg with wrong message type: MessageType_Failure")) +} + +func TestBackupShouldWorkOk(t *testing.T) { + // Giving + dev := &mocks.Devicer{} + orgMsg := "great" + backupResp := messages.Success{Message: proto.String(orgMsg)} + data, err := proto.Marshal(&backupResp) + require.NoError(t, err) + msg := wire.Message{ + Kind: uint16(messages.MessageType_MessageType_Success), + Data: data, + } + dev.On("Backup").Return(msg, nil) + di := createDeviceInteraction(dev) + + // When + response, err := di.Backup().Then(func(data interface{}) interface{} { + return data + }).Await() + + // Then + require.NoError(t, err) + responseStr, ok := response.(string) + require.True(t, ok) + require.Equal(t, orgMsg, responseStr) +} + +func TestBackupShouldHandleDeviceError(t *testing.T) { + // Giving + dev := &mocks.Devicer{} + dev.On("Backup").Return(wire.Message{}, errors.New("")) + di := createDeviceInteraction(dev) + + // When + _, err := di.Backup().Then(func(data interface{}) interface{} { + return data + }).Await() + + // Then + require.Error(t, err) +} + +func TestBackupShouldHandleErrorDecodingResponse(t *testing.T) { + // Giving + dev := &mocks.Devicer{} + orgResp := "jhfjdhfjd" + backupResp := messages.Failure{Message: proto.String(orgResp)} + data, err := proto.Marshal(&backupResp) + require.NoError(t, err) + msg := wire.Message{ + Kind: uint16(messages.MessageType_MessageType_Failure), + Data: data, + } + dev.On("Backup").Return(msg, nil) + di := createDeviceInteraction(dev) + + // When + _, err = di.Backup().Then(func(data interface{}) interface{} { + return data + }).Await() + + // Then + require.Error(t, err) + require.Equal(t, err, errors.New("calling DecodeSuccessMsg with wrong message type: MessageType_Failure")) +} + +func TestCheckMessageSignatureShouldWorkOk(t *testing.T) { + // Giving + dev := &mocks.Devicer{} + orgMsg := "great" + checkMsgSignatureRespResp := messages.Success{Message: proto.String(orgMsg)} + data, err := proto.Marshal(&checkMsgSignatureRespResp) + require.NoError(t, err) + msg := wire.Message{ + Kind: uint16(messages.MessageType_MessageType_Success), + Data: data, + } + dev.On("CheckMessageSignature", mock.Anything, mock.Anything, mock.Anything).Return(msg, nil) + di := createDeviceInteraction(dev) + + // When + response, err := di.CheckMessageSignature("m", "s", "a").Then(func(data interface{}) interface{} { + return data + }).Await() + + // Then + require.NoError(t, err) + responseStr, ok := response.(string) + require.True(t, ok) + require.Equal(t, orgMsg, responseStr) +} + +func TestCheckMessageSignatureShouldHandleDeviceError(t *testing.T) { + // Giving + dev := &mocks.Devicer{} + dev.On("CheckMessageSignature", mock.Anything, mock.Anything, mock.Anything).Return(wire.Message{}, errors.New("")) + di := createDeviceInteraction(dev) + + // When + _, err := di.CheckMessageSignature("m", "s", "a").Then(func(data interface{}) interface{} { + return data + }).Await() + + // Then + require.Error(t, err) +} + +func TestCheckMessageSignatureShouldHandleErrorDecodingResponse(t *testing.T) { + // Giving + dev := &mocks.Devicer{} + orgResp := "jhfjdhfjd" + checkMsgSignResp := messages.Failure{Message: proto.String(orgResp)} + data, err := proto.Marshal(&checkMsgSignResp) + require.NoError(t, err) + msg := wire.Message{ + Kind: uint16(messages.MessageType_MessageType_Failure), + Data: data, + } + dev.On("CheckMessageSignature", mock.Anything, mock.Anything, mock.Anything).Return(msg, nil) + di := createDeviceInteraction(dev) + + // When + _, err = di.CheckMessageSignature("m", "s", "a").Then(func(data interface{}) interface{} { + return data + }).Await() + + // Then + require.Error(t, err) + require.Equal(t, err, errors.New("calling DecodeSuccessMsg with wrong message type: MessageType_Failure")) +} + +func TestChangePinShouldWorkOk(t *testing.T) { + // Giving + dev := &mocks.Devicer{} + orgMsg := "great" + changePinRespResp := messages.Success{Message: proto.String(orgMsg)} + data, err := proto.Marshal(&changePinRespResp) + require.NoError(t, err) + msg := wire.Message{ + Kind: uint16(messages.MessageType_MessageType_Success), + Data: data, + } + dev.On("ChangePin", mock.Anything).Return(msg, nil) + di := createDeviceInteraction(dev) + + // When + response, err := di.ChangePin(nil).Then(func(data interface{}) interface{} { + return data + }).Await() + + // Then + require.NoError(t, err) + responseStr, ok := response.(string) + require.True(t, ok) + require.Equal(t, orgMsg, responseStr) +} + +func TestChangePinShouldHandleDeviceError(t *testing.T) { + // Giving + dev := &mocks.Devicer{} + dev.On("ChangePin", mock.Anything).Return(wire.Message{}, errors.New("")) + di := createDeviceInteraction(dev) + + // When + _, err := di.ChangePin(nil).Then(func(data interface{}) interface{} { + return data + }).Await() + + // Then + require.Error(t, err) +} + +func TestChangePinShouldHandleErrorDecodingResponse(t *testing.T) { + // Giving + dev := &mocks.Devicer{} + orgResp := "jhfjdhfjd" + changePinResp := messages.Failure{Message: proto.String(orgResp)} + data, err := proto.Marshal(&changePinResp) + require.NoError(t, err) + msg := wire.Message{ + Kind: uint16(messages.MessageType_MessageType_Failure), + Data: data, + } + dev.On("ChangePin", mock.Anything).Return(msg, nil) + di := createDeviceInteraction(dev) + + // When + _, err = di.ChangePin(nil).Then(func(data interface{}) interface{} { + return data + }).Await() + + // Then + require.Error(t, err) + require.Equal(t, err, errors.New("calling DecodeSuccessMsg with wrong message type: MessageType_Failure")) +} + +func TestUploadFirmwareShouldWorkOk(t *testing.T) { + // Giving + dev := &mocks.Devicer{} + orgMsg := "great" + uploadFirmwareRespResp := messages.Success{Message: proto.String(orgMsg)} + data, err := proto.Marshal(&uploadFirmwareRespResp) + require.NoError(t, err) + msg := wire.Message{ + Kind: uint16(messages.MessageType_MessageType_Success), + Data: data, + } + dev.On("UploadFirmware", mock.Anything, mock.Anything).Return(msg, nil) + di := createDeviceInteraction(dev) + + // When + response, err := di.UploadFirmware(nil, [32]byte{}).Then(func(data interface{}) interface{} { + return data + }).Await() + + // Then + require.NoError(t, err) + responseStr, ok := response.(string) + require.True(t, ok) + require.Equal(t, orgMsg, responseStr) +} + +func TestUploadFirmwareShouldHandleDeviceError(t *testing.T) { + // Giving + dev := &mocks.Devicer{} + dev.On("UploadFirmware", mock.Anything, mock.Anything).Return(wire.Message{}, errors.New("")) + di := createDeviceInteraction(dev) + + // When + _, err := di.UploadFirmware(nil, [32]byte{}).Then(func(data interface{}) interface{} { + return data + }).Await() + + // Then + require.Error(t, err) +} + +func TestUploadFirmwareShouldHandleErrorDecodingResponse(t *testing.T) { + // Giving + dev := &mocks.Devicer{} + orgResp := "jhfjdhfjd" + uploadFirmwareResp := messages.Failure{Message: proto.String(orgResp)} + data, err := proto.Marshal(&uploadFirmwareResp) + require.NoError(t, err) + msg := wire.Message{ + Kind: uint16(messages.MessageType_MessageType_Failure), + Data: data, + } + dev.On("UploadFirmware", mock.Anything, mock.Anything).Return(msg, nil) + di := createDeviceInteraction(dev) + + // When + _, err = di.UploadFirmware(nil, [32]byte{}).Then(func(data interface{}) interface{} { + return data + }).Await() + + // Then + require.Error(t, err) + require.Equal(t, err, errors.New("calling DecodeSuccessMsg with wrong message type: MessageType_Failure")) +} + +func TestFeaturesShouldWorkOk(t *testing.T) { + // Giving + dev := &mocks.Devicer{} + orgMsg := "great" + featuresRespResp := messages.Features{Label: proto.String(orgMsg)} + data, err := proto.Marshal(&featuresRespResp) + require.NoError(t, err) + msg := wire.Message{ + Kind: uint16(messages.MessageType_MessageType_Features), + Data: data, + } + dev.On("GetFeatures").Return(msg, nil) + di := createDeviceInteraction(dev) + + // When + response, err := di.Features().Then(func(data interface{}) interface{} { + return data + }).Await() + + // Then + require.NoError(t, err) + responseFeatures, ok := response.(messages.Features) + require.True(t, ok) + require.NotNil(t, responseFeatures.Label) + require.Equal(t, orgMsg, *responseFeatures.Label) +} + +func TestFeaturesShouldHandleDeviceError(t *testing.T) { + // Giving + dev := &mocks.Devicer{} + dev.On("GetFeatures").Return(wire.Message{}, errors.New("")) + di := createDeviceInteraction(dev) + + // When + _, err := di.Features().Then(func(data interface{}) interface{} { + return data + }).Await() + + // Then + require.Error(t, err) +} + +func TestFeaturesShouldHandleErrorDecodingBecauseWrongKindResponse(t *testing.T) { + // Giving + dev := &mocks.Devicer{} + orgResp := "jhfjdhfjd" + featuresResp := messages.Failure{Message: proto.String(orgResp)} + data, err := proto.Marshal(&featuresResp) + require.NoError(t, err) + msg := wire.Message{ + Kind: uint16(messages.MessageType_MessageType_Failure), + Data: data, + } + dev.On("GetFeatures").Return(msg, nil) + di := createDeviceInteraction(dev) + + // When + _, err = di.Features().Then(func(data interface{}) interface{} { + return data + }).Await() + + // Then + require.Error(t, err) + require.Equal(t, err, errors.New("calling DecodeFeaturesMsg with wrong message type: MessageType_Failure")) +} + +func TestFeaturesShouldHandleErrorDecodingResponse(t *testing.T) { + // Giving + dev := &mocks.Devicer{} + orgResp := "jhfjdhfjd" + featuresResp := messages.Failure{Message: proto.String(orgResp)} + data, err := proto.Marshal(&featuresResp) + require.NoError(t, err) + msg := wire.Message{ + Kind: uint16(messages.MessageType_MessageType_Features), + Data: data, + } + dev.On("GetFeatures").Return(msg, nil) + di := createDeviceInteraction(dev) + + // When + _, err = di.Features().Then(func(data interface{}) interface{} { + return data + }).Await() + + // Then + require.Error(t, err) + require.True(t, strings.Contains(err.Error(), "wrong wireType")) +} + +func TestGenerateMnemonicShouldWorkOk(t *testing.T) { + // Giving + dev := &mocks.Devicer{} + orgMsg := "great" + generateMnemonicResp := messages.Success{Message: proto.String(orgMsg)} + data, err := proto.Marshal(&generateMnemonicResp) + require.NoError(t, err) + msg := wire.Message{ + Kind: uint16(messages.MessageType_MessageType_Success), + Data: data, + } + dev.On("GenerateMnemonic", mock.Anything, mock.Anything).Return(msg, nil) + di := createDeviceInteraction(dev) + + // When + response, err := di.GenerateMnemonic(12, false).Then(func(data interface{}) interface{} { + return data + }).Await() + + // Then + require.NoError(t, err) + responseStr, ok := response.(string) + require.True(t, ok) + require.Equal(t, orgMsg, responseStr) +} + +func TestGenerateMnemonicShouldHandleDeviceError(t *testing.T) { + // Giving + dev := &mocks.Devicer{} + dev.On("GenerateMnemonic", mock.Anything, mock.Anything).Return(wire.Message{}, errors.New("")) + di := createDeviceInteraction(dev) + + // When + _, err := di.GenerateMnemonic(12, false).Then(func(data interface{}) interface{} { + return data + }).Await() + + // Then + require.Error(t, err) +} + +func TestGenerateMnemonicShouldHandleErrorDecodingResponse(t *testing.T) { + // Giving + dev := &mocks.Devicer{} + orgResp := "jhfjdhfjd" + generateMnemonicResp := messages.Failure{Message: proto.String(orgResp)} + data, err := proto.Marshal(&generateMnemonicResp) + require.NoError(t, err) + msg := wire.Message{ + Kind: uint16(messages.MessageType_MessageType_Failure), + Data: data, + } + dev.On("GenerateMnemonic", mock.Anything, mock.Anything).Return(msg, nil) + di := createDeviceInteraction(dev) + + // When + _, err = di.GenerateMnemonic(12, false).Then(func(data interface{}) interface{} { + return data + }).Await() + + // Then + require.Error(t, err) + require.Equal(t, err, errors.New("calling DecodeSuccessMsg with wrong message type: MessageType_Failure")) +} + +func TestSetMnemonicShouldWorkOk(t *testing.T) { + // Giving + dev := &mocks.Devicer{} + orgMsg := "great" + setMnemonicResp := messages.Success{Message: proto.String(orgMsg)} + data, err := proto.Marshal(&setMnemonicResp) + require.NoError(t, err) + msg := wire.Message{ + Kind: uint16(messages.MessageType_MessageType_Success), + Data: data, + } + dev.On("SetMnemonic", mock.Anything).Return(msg, nil) + di := createDeviceInteraction(dev) + + // When + response, err := di.SetMnemonic("").Then(func(data interface{}) interface{} { + return data + }).Await() + + // Then + require.NoError(t, err) + responseStr, ok := response.(string) + require.True(t, ok) + require.Equal(t, orgMsg, responseStr) +} + +func TestSetMnemonicShouldHandleDeviceError(t *testing.T) { + // Giving + dev := &mocks.Devicer{} + dev.On("SetMnemonic", mock.Anything).Return(wire.Message{}, errors.New("")) + di := createDeviceInteraction(dev) + + // When + _, err := di.SetMnemonic("").Then(func(data interface{}) interface{} { + return data + }).Await() + + // Then + require.Error(t, err) +} + +func TestSetMnemonicShouldHandleErrorDecodingResponse(t *testing.T) { + // Giving + dev := &mocks.Devicer{} + orgResp := "jhfjdhfjd" + generateMnemonicResp := messages.Failure{Message: proto.String(orgResp)} + data, err := proto.Marshal(&generateMnemonicResp) + require.NoError(t, err) + msg := wire.Message{ + Kind: uint16(messages.MessageType_MessageType_Failure), + Data: data, + } + dev.On("SetMnemonic", mock.Anything).Return(msg, nil) + di := createDeviceInteraction(dev) + + // When + _, err = di.SetMnemonic("").Then(func(data interface{}) interface{} { + return data + }).Await() + + // Then + require.Error(t, err) + require.Equal(t, err, errors.New("calling DecodeSuccessMsg with wrong message type: MessageType_Failure")) +} + +func TestRecoveryShouldWorkOk(t *testing.T) { + // Giving + dev := &mocks.Devicer{} + orgMsg := "great" + recoveryResp := messages.Success{Message: proto.String(orgMsg)} + data, err := proto.Marshal(&recoveryResp) + require.NoError(t, err) + msg := wire.Message{ + Kind: uint16(messages.MessageType_MessageType_Success), + Data: data, + } + dev.On("Recovery", mock.Anything, mock.Anything, mock.Anything).Return(msg, nil) + di := createDeviceInteraction(dev) + + // When + response, err := di.Recovery(12, nil, false).Then(func(data interface{}) interface{} { + return data + }).Await() + + // Then + require.NoError(t, err) + responseStr, ok := response.(string) + require.True(t, ok) + require.Equal(t, orgMsg, responseStr) +} + +func TestRecoveryShouldHandleDeviceError(t *testing.T) { + // Giving + dev := &mocks.Devicer{} + dev.On("Recovery", mock.Anything, mock.Anything, mock.Anything).Return(wire.Message{}, errors.New("")) + di := createDeviceInteraction(dev) + + // When + _, err := di.Recovery(12, nil, false).Then(func(data interface{}) interface{} { + return data + }).Await() + + // Then + require.Error(t, err) +} + +func TestRecoveryShouldHandleErrorDecodingResponse(t *testing.T) { + // Giving + dev := &mocks.Devicer{} + orgResp := "jhfjdhfjd" + recoveryResp := messages.Failure{Message: proto.String(orgResp)} + data, err := proto.Marshal(&recoveryResp) + require.NoError(t, err) + msg := wire.Message{ + Kind: uint16(messages.MessageType_MessageType_Failure), + Data: data, + } + dev.On("Recovery", mock.Anything, mock.Anything, mock.Anything).Return(msg, nil) + di := createDeviceInteraction(dev) + + // When + _, err = di.Recovery(12, nil, false).Then(func(data interface{}) interface{} { + return data + }).Await() + + // Then + require.Error(t, err) + require.Equal(t, err, errors.New("calling DecodeSuccessMsg with wrong message type: MessageType_Failure")) +} + +func TestTransactionSignShouldWorkOk(t *testing.T) { + // Giving + dev := &mocks.Devicer{} + orgMsg := []string{"great", "very good"} + transactionSignResp := messages.ResponseTransactionSign{Signatures: orgMsg, Padding: new(bool)} + data, err := proto.Marshal(&transactionSignResp) + require.NoError(t, err) + msg := wire.Message{ + Kind: uint16(messages.MessageType_MessageType_ResponseTransactionSign), + Data: data, + } + dev.On("TransactionSign", mock.Anything, mock.Anything, mock.Anything).Return(msg, nil) + di := createDeviceInteraction(dev) + + // When + response, err := di.TransactionSign(nil, nil, "").Then(func(data interface{}) interface{} { + return data + }).Await() + + // Then + require.NoError(t, err) + responseStr, ok := response.([]string) + require.True(t, ok) + require.Len(t, responseStr, 2) + require.Equal(t, orgMsg[0], responseStr[0]) + require.Equal(t, orgMsg[1], responseStr[1]) +} + +func TestTransactionSignShouldHandleDeviceError(t *testing.T) { + // Giving + dev := &mocks.Devicer{} + dev.On("TransactionSign", mock.Anything, mock.Anything, mock.Anything).Return(wire.Message{}, errors.New("")) + di := createDeviceInteraction(dev) + + // When + _, err := di.TransactionSign(nil, nil, "").Then(func(data interface{}) interface{} { + return data + }).Await() + + // Then + require.Error(t, err) +} + +func TestTransactionSignShouldHandleErrorDecodingResponse(t *testing.T) { + // Giving + dev := &mocks.Devicer{} + orgResp := "jhfjdhfjd" + transactionSignResp := messages.Failure{Message: proto.String(orgResp)} + data, err := proto.Marshal(&transactionSignResp) + require.NoError(t, err) + msg := wire.Message{ + Kind: uint16(messages.MessageType_MessageType_Failure), + Data: data, + } + dev.On("TransactionSign", mock.Anything, mock.Anything, mock.Anything).Return(msg, nil) + di := createDeviceInteraction(dev) + + // When + _, err = di.TransactionSign(nil, nil,"").Then(func(data interface{}) interface{} { + return data + }).Await() + + // Then + require.Error(t, err) + require.Equal(t, err, errors.New("calling DecodeResponseeSkycoinSignMessage with wrong message type: MessageType_Failure")) +} + +func TestSignMessageShouldWorkOk(t *testing.T) { + // Giving + dev := &mocks.Devicer{} + orgMsg := "great" + signMessageResp := messages.ResponseSkycoinSignMessage{SignedMessage: proto.String(orgMsg)} + data, err := proto.Marshal(&signMessageResp) + require.NoError(t, err) + msg := wire.Message{ + Kind: uint16(messages.MessageType_MessageType_ResponseSkycoinSignMessage), + Data: data, + } + dev.On("SignMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(msg, nil) + di := createDeviceInteraction(dev) + + // When + response, err := di.SignMessage(1, 1, "", "").Then(func(data interface{}) interface{} { + return data + }).Await() + + // Then + require.NoError(t, err) + responseStr, ok := response.(string) + require.True(t, ok) + require.Equal(t, orgMsg, responseStr) +} + +func TestSignMessageShouldHandleDeviceError(t *testing.T) { + // Giving + dev := &mocks.Devicer{} + dev.On("SignMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(wire.Message{}, errors.New("")) + di := createDeviceInteraction(dev) + + // When + _, err := di.SignMessage(1, 1, "", "").Then(func(data interface{}) interface{} { + return data + }).Await() + + // Then + require.Error(t, err) +} + +func TestSignMessageShouldHandleErrorDecodingResponse(t *testing.T) { + // Giving + dev := &mocks.Devicer{} + orgResp := "jhfjdhfjd" + signMessageResp := messages.Failure{Message: proto.String(orgResp)} + data, err := proto.Marshal(&signMessageResp) + require.NoError(t, err) + msg := wire.Message{ + Kind: uint16(messages.MessageType_MessageType_Failure), + Data: data, + } + dev.On("SignMessage", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(msg, nil) + di := createDeviceInteraction(dev) + + // When + _, err = di.SignMessage(1, 1, "", "").Then(func(data interface{}) interface{} { + return data + }).Await() + + // Then + require.Error(t, err) + require.Equal(t, err, errors.New("calling DecodeResponseeSkycoinSignMessage with wrong message type: MessageType_Failure")) +} + +func TestWipeShouldWorkOk(t *testing.T) { + // Giving + dev := &mocks.Devicer{} + orgMsg := "great" + wipeResp := messages.Success{Message: proto.String(orgMsg)} + data, err := proto.Marshal(&wipeResp) + require.NoError(t, err) + msg := wire.Message{ + Kind: uint16(messages.MessageType_MessageType_Success), + Data: data, + } + dev.On("Wipe").Return(msg, nil) + di := createDeviceInteraction(dev) + + // When + response, err := di.Wipe().Then(func(data interface{}) interface{} { + return data + }).Await() + + // Then + require.NoError(t, err) + responseStr, ok := response.(string) + require.True(t, ok) + require.Equal(t, orgMsg, responseStr) +} + +func TestWipeShouldHandleDeviceError(t *testing.T) { + // Giving + dev := &mocks.Devicer{} + dev.On("Wipe").Return(wire.Message{}, errors.New("")) + di := createDeviceInteraction(dev) + + // When + _, err := di.Wipe().Then(func(data interface{}) interface{} { + return data + }).Await() + + // Then + require.Error(t, err) +} + +func TestWipeShouldHandleErrorDecodingResponse(t *testing.T) { + // Giving + dev := &mocks.Devicer{} + orgResp := "jhfjdhfjd" + wipeResp := messages.Failure{Message: proto.String(orgResp)} + data, err := proto.Marshal(&wipeResp) + require.NoError(t, err) + msg := wire.Message{ + Kind: uint16(messages.MessageType_MessageType_Failure), + Data: data, + } + dev.On("Wipe").Return(msg, nil) + di := createDeviceInteraction(dev) + + // When + _, err = di.Wipe().Then(func(data interface{}) interface{} { + return data + }).Await() + + // Then + require.Error(t, err) + require.Equal(t, err, errors.New("calling DecodeSuccessMsg with wrong message type: MessageType_Failure")) +} + +func TestCancelShouldWorkOk(t *testing.T) { + // Giving + dev := &mocks.Devicer{} + orgMsg := "great" + cancelResp := messages.Failure{Message: proto.String(orgMsg)} + data, err := proto.Marshal(&cancelResp) + require.NoError(t, err) + msg := wire.Message{ + Kind: uint16(messages.MessageType_MessageType_Failure), + Data: data, + } + dev.On("Cancel").Return(msg, nil) + di := createDeviceInteraction(dev) + + // When + response, err := di.Cancel().Then(func(data interface{}) interface{} { + return data + }).Await() + + // Then + require.NoError(t, err) + responseStr, ok := response.(string) + require.True(t, ok) + require.Equal(t, orgMsg, responseStr) +} + +func TestCancelShouldHandleDeviceError(t *testing.T) { + // Giving + dev := &mocks.Devicer{} + dev.On("Cancel").Return(wire.Message{}, errors.New("")) + di := createDeviceInteraction(dev) + + // When + _, err := di.Cancel().Then(func(data interface{}) interface{} { + return data + }).Await() + + // Then + require.Error(t, err) +} + +func TestCancelShouldHandleErrorDecodingResponse(t *testing.T) { + // Giving + dev := &mocks.Devicer{} + orgResp := "jhfjdhfjd" + cancelResp := messages.Success{Message: proto.String(orgResp)} + data, err := proto.Marshal(&cancelResp) + require.NoError(t, err) + msg := wire.Message{ + Kind: uint16(messages.MessageType_MessageType_Success), + Data: data, + } + dev.On("Cancel").Return(msg, nil) + di := createDeviceInteraction(dev) + + // When + _, err = di.Cancel().Then(func(data interface{}) interface{} { + return data + }).Await() + + // Then + require.Error(t, err) + require.Equal(t, err, errors.New("calling DecodeFailMsg with wrong message type: MessageType_Success")) +} + +func TestIsAvailableShouldWorkOk(t *testing.T) { + // Giving + dev := &mocks.Devicer{} + orgResponse := true + dev.On("Available").Return(orgResponse, nil) + di := createDeviceInteraction(dev) + + // When + response, err := di.IsAvailable().Then(func(data interface{}) interface{} { + return data + }).Await() + + // Then + require.NoError(t, err) + responseAvailable, ok := response.(bool) + require.True(t, ok) + require.Equal(t, orgResponse, responseAvailable) +} + +func TestUninitializedInstantiation(t *testing.T) { + // Giving + skyWltInteraction = nil + + // When + di := SkyWltInteractionInstance() + + // Then + require.Nil(t, di) +} + +func TestInitializeInstantiation(t *testing.T) { + // Giving + skyWltInteraction = nil + + // When + di1 := createDeviceInteraction(&mocks.Devicer{}) + skyWltInteraction = di1 + di2 := SkyWltInteractionInstance() + + // Then + require.NotNil(t, di1) + require.Equal(t, di1, di2) + require.False(t, di1.InitializeWasWarn()) + require.False(t, di1.UploadFirmwareWasWarn()) + require.False(t, di1.SecureWasWarn()) +} + +func TestTrackingActivityShouldBeRecorded(t *testing.T) { + // Giving + skyWltInteraction = createDeviceInteraction(&mocks.Devicer{}) + require.NotNil(t, skyWltInteraction) + + // When + skyWltInteraction.SetInitializeWasWarn() + skyWltInteraction.SetUploadFirmwareWasWarn() + skyWltInteraction.SetSecureWasWarn() + + // Then + require.True(t, skyWltInteraction.InitializeWasWarn()) + require.True(t, skyWltInteraction.UploadFirmwareWasWarn()) + require.True(t, skyWltInteraction.SecureWasWarn()) +} \ No newline at end of file diff --git a/src/contrib/hardware-wallet/skywallet/skywallet_integration_test.go b/src/contrib/hardware-wallet/skywallet/skywallet_integration_test.go new file mode 100644 index 00000000..3dfaee73 --- /dev/null +++ b/src/contrib/hardware-wallet/skywallet/skywallet_integration_test.go @@ -0,0 +1,97 @@ +package hardware + +import ( + skycoin "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/models" + hardware_wallet "github.com/fibercrypto/fibercryptowallet/src/contrib/hardware-wallet" + "github.com/fibercrypto/fibercryptowallet/src/core" + "github.com/fibercrypto/fibercryptowallet/src/util" + "github.com/fibercrypto/fibercryptowallet/src/util/logging" + "github.com/fibercrypto/skywallet-go/src/skywallet" + "github.com/stretchr/testify/require" + "os" + "testing" +) + +func assertText(t *testing.T, msg interface{}, text string) { + msgStr, ok := msg.(string) + require.True(t, ok) + require.Equal(t, msgStr, text) +} + +func forceWipe(t *testing.T) { + dev := SkyWltInteractionInstance() + msg, err := dev.Wipe().Then(func(data interface{}) interface{} { + return data + }).Await() + require.NoError(t, err) + assertText(t, msg, "Device wiped") +} + +func forceSetMnemonic(t *testing.T, mnemonic string) { + forceWipe(t) + dev := SkyWltInteractionInstance() + msg, err := dev.SetMnemonic(mnemonic).Then(func(data interface{}) interface{} { + return data + }).Await() + require.NoError(t, err) + assertText(t, msg, "wire junk original sword bread bottom armor dog snow accident inform rigid") +} + +var createdDevice hardware_wallet.DeviceInteraction = nil + +func createEmulatorDevice() { + if createdDevice == nil { + createdDevice = CreateSkyWltInteractionInstanceOnce( + true, + skywallet.DeviceTypeEmulator, + func(requestKind skywallet.InputRequestKind, title, message string) (string, error) { return "", nil }) + } + skyWltInteraction = createdDevice +} + +func setUpHardwareWallet(t *testing.T) { + util.RegisterAltcoin(skycoin.NewSkyFiberPlugin(skycoin.SkycoinMainNetParams)) + createEmulatorDevice() + keyTestData, err := skycoin.GenerateTestKeyPair(t) + require.NoError(t, err) + forceSetMnemonic(t, keyTestData.Mnemonic) +} + +var logModelTest = logging.MustGetLogger("Skycoin Hardware Wallet Test") + +//Prepare the mock API for all test +func TestMain(m *testing.M) { + mock := new(skycoin.SkycoinApiMock) + skycoin.SetGlobalMock(mock) + err := core.GetMultiPool().CreateSection(skycoin.PoolSection, mock) + if err != nil { + logModelTest.WithError(err).Warn("Error creating pool section") + return + } + util.RegisterAltcoin(skycoin.NewSkyFiberPlugin(skycoin.SkycoinMainNetParams)) + os.Exit(m.Run()) +} + +func TestTransactionSignInputFromDevice(t *testing.T) { + skycoin.CleanGlobalMock() + skyApiMock := skycoin.GetGlobalMock() + err := core.GetMultiPool().CreateSection(skycoin.PoolSection, skyApiMock) + if err != nil { + logModelTest.WithError(err).Warn("Error creating pool section") + return + } + setUpHardwareWallet(t) + hs1 := NewSkyWallet(nil) + hs2 := NewSkyWallet(nil) + hs3 := NewSkyWallet(nil) + setWallet := func(t *testing.T, signer core.TxnSigner, wlt core.Wallet) { + hs, ok := signer.(*SkyWallet) + require.True(t, ok) + hs.wlt = wlt + } + signers := make([]core.TxnSigner, 3) + signers[0] = hs1 + signers[1] = hs2 + signers[2] = hs3 + skycoin.TransactionSignInputTestSkyHwImpl(t, signers, setWallet) +} diff --git a/src/core/account.go b/src/core/account.go index b8c03023..5cc98c8e 100644 --- a/src/core/account.go +++ b/src/core/account.go @@ -9,7 +9,7 @@ type CryptoAccount interface { ListAssets() []string // ScanUnspentOutputs to determine the outputs that can participate in a transaction // without incurring in double spending - ScanUnspentOutputs() TransactionOutputIterator + ScanUnspentOutputs() (TransactionOutputIterator, error) // ListTransactions to show account history ListTransactions() TransactionIterator // ListPendingTransactions to obtain details of transactions pending for confirmation in the memory diff --git a/src/core/cipher.go b/src/core/cipher.go index 6ffe3d7a..e1d64b68 100644 --- a/src/core/cipher.go +++ b/src/core/cipher.go @@ -58,12 +58,14 @@ type TxnSigner interface { // SignTransaction partially or in full SignTransaction(Transaction, PasswordReader, []string) (Transaction, error) // GetSignerUID provides the key identifying this signer among peer strategies supported by an object - GetSignerUID() UID + GetSignerUID() (UID, error) // GetSignerDescription facilitates a human readable caption identifying this signing strategy - GetSignerDescription() string + GetSignerDescription() (string, error) } // TxnSignerIterator enumerates a set if TxSigner strategies +// at the begin the iterator is in an invalid state, so to get the first +// value (using the Value function) a first call to Next is required type TxnSignerIterator interface { // Value of signer at iterator pointer position Value() TxnSigner diff --git a/src/core/coin.go b/src/core/coin.go index ba03a961..d223dfbb 100644 --- a/src/core/coin.go +++ b/src/core/coin.go @@ -54,7 +54,7 @@ type TransactionInput interface { // GetId provides transaction input ID GetId() string // GetSpentOutput looks up the output spent by this input - GetSpentOutput() TransactionOutput + GetSpentOutput() (TransactionOutput, error) // GetCoins looks up coins for asset represented by ticker // that have been spent by this input GetCoins(ticker string) (uint64, error) @@ -79,7 +79,7 @@ type TransactionOutput interface { // IsSpent determines whether there exists a confirmed transaction with an input spending this output IsSpent() bool // GetAddress returns the address of the party receiving funds - GetAddress() Address + GetAddress() (Address, error) // GetCoins looks up coins for asset represented by ticker that have been transferred in this output GetCoins(ticker string) (uint64, error) // SupportedAssets enumerates tickers of crypto assets supported by this output diff --git a/src/core/network.go b/src/core/network.go index edf5b7c1..1e275e91 100644 --- a/src/core/network.go +++ b/src/core/network.go @@ -1,8 +1,8 @@ package core import ( - "fmt" "sync" + "time" "github.com/fibercrypto/fibercryptowallet/src/errors" "github.com/fibercrypto/fibercryptowallet/src/util/logging" @@ -71,20 +71,10 @@ type MultiPool interface { } type MultiPoolSection interface { - Get() interface{} + Get() (interface{}, error) Put(interface{}) } -// NotAvailableObjectsError is returned when name is not bound to any pool factory -type NotAvailableObjectsError struct { - poolSection string -} - -// Error describes error condition -func (err NotAvailableObjectsError) Error() string { - return fmt.Sprintf("There is not exist %s poolSection", err.poolSection) -} - // MultiConnectionsPool implements a generic pool supporting multiple object factories type MultiConnectionsPool struct { capacity int @@ -103,12 +93,26 @@ func (mp *MultiConnectionsPool) GetSection(poolSection string) (MultiPoolSection func (mp *MultiConnectionsPool) CreateSection(name string, factory PooledObjectFactory) error { logConnectionPool.Info("Creating pool section") mp.sections[name] = &PoolSection{ - mutex: new(sync.Mutex), - capacity: mp.capacity, - factory: factory, - inUse: make([]interface{}, 0), - available: make([]interface{}, 0), + mutex: new(sync.Mutex), + capacity: mp.capacity, + factory: factory, + inUse: make([]interface{}, 0), + available: make([]interface{}, 0), + starveClient: 0, } + go func() { + t := time.NewTicker(time.Second * 2) + section := mp.sections[name] + + for { + <-t.C + if section.starveClient > 10000 { + mp.sections[name].grow() + } else { + section.starveClient = 0 + } + } + }() return nil } @@ -122,32 +126,39 @@ func (mp *MultiConnectionsPool) ListSections() ([]string, error) { } type PoolSection struct { - capacity int - available []interface{} - inUse []interface{} - mutex *sync.Mutex - factory PooledObjectFactory + capacity int + available []interface{} + inUse []interface{} + mutex *sync.Mutex + factory PooledObjectFactory + starveClient int +} + +func (ps *PoolSection) grow() { + ps.capacity = ps.capacity * 2 + ps.starveClient = 0 } -func (ps *PoolSection) Get() interface{} { +func (ps *PoolSection) Get() (interface{}, error) { ps.mutex.Lock() defer ps.mutex.Unlock() if len(ps.available) == 0 { if len(ps.inUse) == ps.capacity { - return errors.ErrObjectPoolUndeflow + ps.starveClient++ + return nil, errors.ErrObjectPoolUndeflow } obj, err := ps.factory.Create() if err != nil { - return err + return nil, err } ps.inUse = append(ps.inUse, obj) - return obj + return obj, nil } else { var obj interface{} obj, ps.available = ps.available[0], ps.available[1:] ps.inUse = append(ps.inUse, obj) - return obj + return obj, nil } } @@ -174,7 +185,7 @@ func newMultiConnectionPool(capacity int) *MultiConnectionsPool { func GetMultiPool() MultiPool { once.Do(func() { - multiConnectionsPool = newMultiConnectionPool(10) + multiConnectionsPool = newMultiConnectionPool(60) }) return multiConnectionsPool diff --git a/src/core/storage.go b/src/core/storage.go index b1d7317b..07970bad 100644 --- a/src/core/storage.go +++ b/src/core/storage.go @@ -91,3 +91,50 @@ const ( // TypeNameWalletStorage WalletStorage type name TypeNameWalletStorage = "WalletStorage" ) + +// AddressBook provides method to manage a contact database. +type AddressBook interface { + Init(secType int, password string) error + Authenticate(password string) error + ChangeSecurity(NewSecType int, oldPassword, newPassword string) error + GetContact(id uint64) (Contact, error) + ListContact() ([]Contact, error) + InsertContact(contact Contact) (uint64, error) + DeleteContact(id uint64) error + UpdateContact(id uint64, contact Contact) error + GetStorage() Storage + HasInit() bool + IsOpen() bool + GetSecType() (int, error) + Close() error +} + +type Storage interface { + InsertValue(value interface{}) (uint64, error) + GetValue(key uint64) (interface{}, error) + ListValues() (map[uint64]interface{}, error) + DeleteValue(key uint64) error + UpdateValue(key uint64, newValue interface{}) error + Path() string + GetConfig() map[string]string + InsertConfig(map[string]string) error + Close() error +} + +// Contact provides encrypt / decrypt data. +type Contact interface { + GetID() uint64 + SetID(id uint64) + GetAddresses() []StringAddress + SetAddresses([]StringAddress) + GetName() string + SetName(string) + IsValid() bool +} +type StringAddress interface { + GetValue() []byte + SetValue(val []byte) + GetCoinType() []byte + SetCoinType(val []byte) + IsValid() bool +} diff --git a/src/core/wallet.go b/src/core/wallet.go index 0b01f1a7..518dc0b5 100644 --- a/src/core/wallet.go +++ b/src/core/wallet.go @@ -101,4 +101,7 @@ type WalletEnv interface { GetStorage() WalletStorage // GetWalletSet loads wallets in this environment GetWalletSet() WalletSet + // LookupWallet allow you to get a wallet from the first address in the + // deterministic sequence, error if not found or some thing was happen + LookupWallet(firstAddr string) (Wallet, error) } diff --git a/src/data/addressbook.go b/src/data/addressbook.go new file mode 100644 index 00000000..8980538b --- /dev/null +++ b/src/data/addressbook.go @@ -0,0 +1,538 @@ +package data + +import ( + "bytes" + "crypto/aes" + "crypto/cipher" + "crypto/rand" + "crypto/sha512" + "encoding/base64" + "errors" + "fmt" + "github.com/SkycoinProject/skycoin/src/cipher/bip39" + "github.com/fibercrypto/fibercryptowallet/src/core" + "github.com/fibercrypto/fibercryptowallet/src/util/logging" + "golang.org/x/crypto/bcrypt" + "golang.org/x/crypto/pbkdf2" + "io" + "strconv" +) + +const ( + // NoSecurity No security + NoSecurity = iota + // ObfuscationSecurity data obfuscation security + ObfuscationSecurity + // PasswordSecurity password security + PasswordSecurity +) + +const ( + Hash = "hash" + Entropy = "entropy" + SecurityType = "secType" +) + +var ( + // Errors + errParseContact = errors.New("inserted contact cannot be parse") + errInvalidContact = errors.New("you try to inserted a invalid contact") + errInvalidSecType = errors.New("invalid security type") + errAddrsBookHasNotInit = errors.New("address book not has init") +) + +// addrsBook implement AddressBook interface for boltdb database. +type addrsBook struct { + storage core.Storage + key []byte +} + +var logDb = logging.MustGetLogger("AddressBook Data") + +// NewAddressBook create a new instance of AddessBook. +func NewAddressBook(storage core.Storage) core.AddressBook { + return &addrsBook{ + storage: storage, + key: nil, + } +} + +// ChangeSecurity change the security type of the Address Book, this method work to change the password too. +func (addrsBook *addrsBook) ChangeSecurity(NewSecType int, oldPassword, newPassword string) error { + logDb.Info("changing Address Book security") + + if err := addrsBook.Authenticate(oldPassword); err != nil { + return err + } + + contactsList, err := addrsBook.ListContact() + if err != nil { + return err + } + for e := range contactsList { + if err := addrsBook.DeleteContact(contactsList[e].GetID()); err != nil { + return err + } + } + + var hash, entropy []byte + + switch NewSecType { + case NoSecurity, ObfuscationSecurity: + if err := addrsBook.insertConfig(NewSecType, hash, entropy); err != nil { + logDb.Error(err) + return err + } + break + case PasswordSecurity: + addrsBook.key = []byte(newPassword) + if entropy, err = addrsBook.genEntropy(); err != nil { + logDb.Error(err) + return err + } + + hash, err = bcrypt.GenerateFromPassword([]byte(newPassword), 12) + if err != nil { + logDb.Error(err) + return err + } + + if err := addrsBook.insertConfig(NewSecType, hash, entropy); err != nil { + logDb.Error(err) + return err + } + break + default: + logDb.Error(errInvalidSecType) + return errInvalidSecType + } + for e := range contactsList { + if _, err := addrsBook.InsertContact(contactsList[e]); err != nil { + return err + } + } + + return nil +} + +// Init initialize an address book. Pass secType(security type) and password if is PasswordSecurity. +func (addrsBook *addrsBook) Init(secType int, password string) error { + logDb.Info("initialize AddressBook") + if !addrsBook.IsOpen() { + return errDatabaseNotOpen + } + + if addrsBook.HasInit() { + return fmt.Errorf("address book has init") + } + + var hash, entropy []byte + var err error + + switch secType { + case NoSecurity, ObfuscationSecurity: + if err := addrsBook.insertConfig(secType, hash, entropy); err != nil { + logDb.Error(err) + return err + } + break + case PasswordSecurity: + addrsBook.key = []byte(password) + if entropy, err = addrsBook.genEntropy(); err != nil { + logDb.Error(err) + return err + } + + hash, err = bcrypt.GenerateFromPassword([]byte(password), 12) + if err != nil { + logDb.Error(err) + return err + } + + if err := addrsBook.insertConfig(secType, hash, entropy); err != nil { + logDb.Error(err) + return err + } + break + default: + logDb.Error(errInvalidSecType) + return errInvalidSecType + } + + return nil +} + +// Authenticate authentic a user in the Address Book. ( Only SecType : PasswordSecurity ) +func (addrsBook *addrsBook) Authenticate(password string) error { + logDb.Info("authenticate AddressBook") + if !addrsBook.IsOpen() { + logDb.Error(errDatabaseNotOpen) + return errDatabaseNotOpen + } + + if !addrsBook.HasInit() { + logDb.Error(errAddrsBookHasNotInit) + return errAddrsBookHasNotInit + } + + secType, err := addrsBook.GetSecType() + if err != nil { + logDb.Error(err) + return err + } + + if secType != PasswordSecurity { + return nil + } + + addrsBook.key = []byte(password) + if err := addrsBook.verifyHash(); err != nil { + logDb.Error(err) + return err + } + + return nil +} + +// InsertContact insert a contact into the address book. +// If any of its address exist return error. +func (addrsBook *addrsBook) InsertContact(contact core.Contact) (uint64, error) { + logDb.Info("Inserting a contact into the Address Book.") + if !contact.IsValid() { + return 0, errInvalidContact + } + + contactsList, err := addrsBook.ListContact() + if err != nil && err != errBucketEmpty { + return 0, err + } + for _, v := range contact.GetAddresses() { + if err := addrsBook.addressExists(v, contactsList); err != nil { + return 0, err + } + } + if err := addrsBook.nameExists(contact, contactsList); err != nil { + return 0, err + } + + encryptedData, err := addrsBook.encryptContact(contact.(*Contact)) + if err != nil { + return 0, err + } + + // Commit transaction before exit. + return addrsBook.GetStorage().InsertValue(encryptedData) +} + +// GetContact get a contact by ID. +func (addrsBook *addrsBook) GetContact(id uint64) (core.Contact, error) { + logDb.Info("Getting a contact from the Address Book") + encryptData, err := addrsBook.GetStorage().GetValue(id) + if err != nil { + logDb.Error(err) + return nil, err + } + if _, ok := encryptData.([]byte); !ok { + logDb.Error(errValueNoMatch(encryptData.([]byte), []byte{})) + return nil, errValueNoMatch(encryptData.([]byte), []byte{}) + } + contact, err := addrsBook.decryptContact(encryptData.([]byte)) + if err != nil { + return nil, err + } + contact.SetID(id) + return contact, nil +} + +// ListContact list all contact in the address book. +func (addrsBook *addrsBook) ListContact() ([]core.Contact, error) { + logDb.Info("Getting all contact in the Address Book.") + var contactsList []core.Contact + encryptContactList, err := addrsBook.GetStorage().ListValues() + if err != nil { + logDb.Error(err) + return nil, err + } + for id, encryptContact := range encryptContactList { + if _, ok := encryptContact.([]byte); !ok { + return nil, errValueNoMatch(encryptContact, []byte{}) + } + contact, err := addrsBook.decryptContact(encryptContact.([]byte)) + if err != nil { + logDb.Error(err) + return nil, err + } + contact.SetID(id) + contactsList = append(contactsList, contact) + } + return contactsList, nil +} + +// DeleteContact delete a contact from the address book by its ID. +func (addrsBook *addrsBook) DeleteContact(id uint64) error { + logDb.Info("Removing a contact from AddressBook") + return addrsBook.GetStorage().DeleteValue(id) +} + +// UpdateContact update a contact in the address book by its ID. +func (addrsBook *addrsBook) UpdateContact(id uint64, newContact core.Contact) error { + logDb.Infof("Updating contact with id:%d", id) + if !newContact.IsValid() { + return errInvalidContact + } + + var contactsList []core.Contact + var err error + if contactsList, err = addrsBook.ListContact(); err != nil { + return err + } + var pos int + for e := range contactsList { + if contactsList[e].GetID() == id { + contactsList[e] = nil + pos = e + break + } + } + + for _, ncAddrs := range newContact.GetAddresses() { + if err := addrsBook.addressExists(ncAddrs, append(contactsList[:pos], contactsList[pos+1:]...)); err != nil { + return err + } + } + + if err := addrsBook.nameExists(newContact, contactsList); err != nil { + return err + } + + if _, ok := newContact.(*Contact); !ok { + return errParseContact + } + + encryptedData, err := addrsBook.encryptContact(newContact.(*Contact)) + if err != nil { + return err + } + return addrsBook.GetStorage().UpdateValue(id, encryptedData) +} + +// GetPath return database path +func (addrsBook *addrsBook) GetPath() string { + return addrsBook.GetStorage().Path() +} + +// Close shuts down the database. +func (addrsBook *addrsBook) Close() error { + logDb.Info("Closing the AddressBook") + if err := addrsBook.GetStorage().Close(); err != nil { + return err + } + return nil +} + +// HasInit verify if database has been initialize. +func (addrsBook *addrsBook) HasInit() bool { + if addrsBook.storage.GetConfig() != nil { + return true + } + return false +} + +// IsOpen verify if database is open. +func (addrsBook *addrsBook) IsOpen() bool { + if addrsBook.storage.Path() != "" { + return true + } + return false +} + +// GetStorage return the Storage parameter. This is in charge of manager the database interaction. +func (addrsBook *addrsBook) GetStorage() core.Storage { + logDb.Info("Getting Storage.") + return addrsBook.storage +} + +// GetSecType return the Security Type of the Address Book. +func (addrsBook *addrsBook) GetSecType() (int, error) { + logDb.Info("Getting security type.") + return strconv.Atoi(addrsBook.GetStorage().GetConfig()[SecurityType]) +} + +// genEntropy generate annil Entropy by a mnemonic. If mnemonic is nil, +// it generate a random. +func (addrsBook *addrsBook) genEntropy() ([]byte, error) { + mn, err := bip39.NewDefaultMnemonic() + if err != nil { + return nil, err + } + e, err := bip39.EntropyFromMnemonic(mn) + if err != nil { + return nil, err + } + return e, nil +} + +// getEntropyFromConfig retrieve the Entropy parameter from the database. +func (addrsBook *addrsBook) getEntropyFromConfig() []byte { + logDb.Info("Getting entropy.") + return []byte(addrsBook.GetStorage().GetConfig()[Entropy]) + +} + +// getHashFromConfig get hash from config bucket in the database.. +func (addrsBook *addrsBook) getHashFromConfig() []byte { + logDb.Info("Getting hash.") + return []byte(addrsBook.GetStorage().GetConfig()[Hash]) +} + +// encryptContact encrypt a contact by the security Type. +func (addrsBook *addrsBook) encryptContact(c *Contact) ([]byte, error) { + secType, err := addrsBook.GetSecType() + if err != nil { + return nil, err + } + switch secType { + case NoSecurity: + return c.MarshalBinary() + case ObfuscationSecurity: + data, err := c.MarshalBinary() + if err != nil { + return nil, err + } + return []byte(base64.StdEncoding.EncodeToString(data)), nil + case PasswordSecurity: + return addrsBook.encryptAESGCM(c) + } + + return nil, fmt.Errorf("invalid security type") +} + +// Decrypt a cipher message by the Security Type and return a Contact. +func (addrsBook *addrsBook) decryptContact(cipherMsg []byte) (core.Contact, error) { + secType, err := addrsBook.GetSecType() + if err != nil { + return nil, err + } + switch secType { + case NoSecurity: + contact := Contact{} + if err := contact.UnmarshalBinary(cipherMsg); err != nil { + return nil, err + } + + return &contact, nil + + case ObfuscationSecurity: + contact := Contact{} + data, err := base64.StdEncoding.DecodeString(string(cipherMsg)) + if err != nil { + return nil, err + } + if err := contact.UnmarshalBinary(data); err != nil { + return nil, err + } + return &contact, nil + case PasswordSecurity: + return addrsBook.decryptAESGCM(cipherMsg) + } + + return nil, errInvalidSecType +} + +// verifyHash verify if a password match with the current AddressBook hash. +func (addrsBook *addrsBook) verifyHash() error { + hash := addrsBook.getHashFromConfig() + return bcrypt.CompareHashAndPassword(hash, addrsBook.key) +} + +// addressExists search an address in the list of contacts into the AddressBook. +// If find the address return error, else return nil. +func (addrsBook *addrsBook) addressExists(address core.StringAddress, contacts []core.Contact) error { + for _, contact := range contacts { + for _, addrs := range contact.GetAddresses() { + if bytes.Compare(addrs.GetValue(), address.GetValue()) == 0 && + bytes.Compare(addrs.GetCoinType(), address.GetCoinType()) == 0 { + return fmt.Errorf("Address with value: %s and Cointype: %s alredy exist", + address.GetValue(), address.GetCoinType()) + } + } + } + return nil +} + +// nameExists search an name in the list of contacts into the AddressBook. +// If find the address return error, else return nil. +func (addrsBook *addrsBook) nameExists(newContact core.Contact, contactsList []core.Contact) error { + for _, contact := range contactsList { + if dataContact, ok := contact.(*Contact); ok { + if bytes.Compare(newContact.(*Contact).Name, dataContact.Name) == 0 { + return fmt.Errorf(" Contact with name: %s alredy exist", newContact.(*Contact).Name) + } + } + } + + return nil +} + +// insertConfig insert the configuration parameter into Config block in the database. +func (addrsBook *addrsBook) insertConfig(secType int, hash, entropy []byte) error { + if err := addrsBook.GetStorage().InsertConfig( + map[string]string{ + SecurityType: strconv.Itoa(secType), + Hash: string(hash), + Entropy: string(entropy)}); err != nil { + logDb.Error(err) + return err + } + return nil +} + +// decryptAESGCM encrypt a data with AESGCM algorithm. http://golang.org/crypto/ +func (addrsBook *addrsBook) encryptAESGCM(contact *Contact) ([]byte, error) { + block, err := aes.NewCipher( + pbkdf2.Key(addrsBook.getEntropyFromConfig(), addrsBook.key, 4096, 32, sha512.New)) + if err != nil { + return nil, err + } + aesGCM, err := cipher.NewGCM(block) + if err != nil { + return nil, err + } + + nonce := make([]byte, aesGCM.NonceSize()) + if _, err = io.ReadFull(rand.Reader, nonce); err != nil { + return nil, err + } + bc, err := contact.MarshalBinary() + if err != nil { + return nil, err + } + + cipherText := aesGCM.Seal(nonce, nonce, bc, nil) + return cipherText, nil +} + +// decryptAESGCM decrypt a data with AESGCM algorithm. http://golang.org/crypto/ +func (addrsBook *addrsBook) decryptAESGCM(cipherMsg []byte) (core.Contact, error) { + block, err := aes.NewCipher(pbkdf2.Key( + addrsBook.getEntropyFromConfig(), addrsBook.key, 4096, 32, sha512.New)) + if err != nil { + return nil, err + } + aesGCM, err := cipher.NewGCM(block) + if err != nil { + return nil, err + } + var contact Contact + nonceSize := aesGCM.NonceSize() + nonce, cipherText := cipherMsg[:nonceSize], cipherMsg[nonceSize:] + + data, err := aesGCM.Open(nil, nonce, cipherText, nil) + if err != nil { + return nil, err + } + if err := contact.UnmarshalBinary(data); err != nil { + return nil, err + } + return &contact, nil +} diff --git a/src/data/contact.go b/src/data/contact.go new file mode 100644 index 00000000..07c2fa8a --- /dev/null +++ b/src/data/contact.go @@ -0,0 +1,115 @@ +package data + +import ( + "encoding/json" + "github.com/fibercrypto/fibercryptowallet/src/core" + "github.com/fibercrypto/fibercryptowallet/src/util" + "strings" +) + +// Contact is a contact of the addrsBook +type Contact struct { + ID uint64 + Address []Address + Name []byte +} + +// Address is the relation of an address and his coin type. +type Address struct { + Value []byte + Coin []byte +} + +// MarshalBinary encodes a user to binary format. +func (c *Contact) MarshalBinary() ([]byte, error) { + return json.Marshal(c) +} + +// UnmarshalBinary decodes a user from binary data. +func (c *Contact) UnmarshalBinary(data []byte) error { + return json.Unmarshal(data, &c) +} + +// GetID get ID of current contact. +func (c *Contact) GetID() uint64 { + return c.ID +} + +// SetID set an ID to current contact. +func (c *Contact) SetID(id uint64) { + c.ID = id +} + +// GetAddresses get address list of current contact. +func (c *Contact) GetAddresses() []core.StringAddress { + var addresses []core.StringAddress + for e := range c.Address { + addresses = append(addresses, &c.Address[e]) + } + return addresses +} + +// SetAddresses set an address list to the current contact. +func (c *Contact) SetAddresses(addrs []core.StringAddress) { + for e := range addrs { + if v, ok := addrs[e].(*Address); ok { + c.Address = append(c.Address, *v) + } else { + panic("Error in SetAddress: addrs cannot parse to type data.Address") + + } + } +} + +// GetName return contact name +func (c *Contact) GetName() string { + return string(c.Name) +} + +// SetName set a name to the contact +func (c *Contact) SetName(newName string) { + c.Name = []byte(newName) +} + +func (c *Contact) IsValid() bool { + if strings.ReplaceAll(c.GetName(), " ", "") == "" { + return false + } + + for e := range c.GetAddresses() { + if !c.GetAddresses()[e].IsValid() { + return false + } + } + return true +} + +// .....Address + +// GetValue get address string. +func (ad *Address) GetValue() []byte { + return ad.Value +} + +// SetValue set an address string. +func (ad *Address) SetValue(val []byte) { + ad.Value = val +} + +// GetCoinType get coin type of an address. +func (ad *Address) GetCoinType() []byte { + return ad.Coin +} + +// SetCoinType set the coin type to current address. +func (ad *Address) SetCoinType(coinType []byte) { + ad.Coin = coinType +} + +func (ad *Address) IsValid() bool { + if _, err := util.AddressFromString(string(ad.GetValue()), + string(ad.GetCoinType())); err != nil { + return false + } + return true +} diff --git a/src/data/data_test.go b/src/data/data_test.go new file mode 100644 index 00000000..a3ce456a --- /dev/null +++ b/src/data/data_test.go @@ -0,0 +1,937 @@ +package data + +import ( + "github.com/SkycoinProject/skycoin/src/util/file" + skycoin "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/models" + "github.com/fibercrypto/fibercryptowallet/src/core" + local "github.com/fibercrypto/fibercryptowallet/src/main" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "io/ioutil" + "os" + "reflect" + "testing" +) + +const defaultPass = "Qwerty12345678" + +func TestContact_MarshalBinary(t *testing.T) { + type fields struct { + ID uint64 + Address []Address + Name []byte + } + tests := []struct { + name string + fields fields + want []byte + wantErr bool + }{ + {name: "empty-Contact", fields: fields{}, want: []byte(`{"ID":0,"Address":null,"Name":null}`), wantErr: false}, + {name: "not-empty-Contact", fields: fields{ + ID: 1, + Address: []Address{{Value: []byte("JUdRuTiqD1mGcw3s58twMg3VPpXpzbkdRvJ"), Coin: []byte("skycoin")}}, + Name: []byte("Foo"), + }, want: []byte(`{"ID":1,"Address":[{"Value":"SlVkUnVUaXFEMW1HY3czczU4dHdNZzNWUHBYcHpia2RSdko=",` + + `"Coin":"c2t5Y29pbg=="}],"Name":"Rm9v"}`), wantErr: false}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + c := &Contact{ + ID: tt.fields.ID, + Address: tt.fields.Address, + Name: tt.fields.Name, + } + got, err := c.MarshalBinary() + if (err != nil) != tt.wantErr { + t.Errorf("MarshalBinary() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("MarshalBinary() got = %v, want %v", string(got), string(tt.want)) + } + }) + } +} + +func TestContact_UnmarshalBinary(t *testing.T) { + type fields struct { + ID uint64 + Address []Address + Name []byte + } + type args struct { + data []byte + } + tests := []struct { + name string + fields fields + args args + wantErr bool + }{ + {name: "empty", fields: fields{}, args: args{data: []byte{}}, wantErr: true}, + {name: "not-empty", fields: fields{ + ID: 1, + Address: []Address{{Value: []byte("JUdRuTiqD1mGcw3s58twMg3VPpXpzbkdRvJ"), Coin: []byte("skycoin")}}, + Name: []byte("Foo"), + }, args: args{data: []byte(`{"Address":[{"Value":null}]}`)}, wantErr: false}, + {name: "EOF", fields: fields{ID: 2}, args: args{data: []byte(`{"ID":2,"Address":null,"Name":null}`)}, wantErr: false}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + c := &Contact{ + ID: tt.fields.ID, + Address: tt.fields.Address, + Name: tt.fields.Name, + } + if err := c.UnmarshalBinary(tt.args.data); (err != nil) != tt.wantErr { + t.Errorf("UnmarshalBinary() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} + +func Test_addressBook_DeleteContact(t *testing.T) { + local.LoadAltcoinManager().RegisterPlugin(skycoin.NewSkyFiberPlugin(skycoin.SkycoinMainNetParams)) + type args struct { + id uint64 + } + type fields struct { + Address []Address + Name []byte + } + tests := []struct { + name string + field fields + args args + wantErr bool + }{ + {name: "empty", + field: fields{}, + args: args{ + id: 1, + }, + wantErr: true, + }, + {name: "one-contact", + field: fields{ + Address: []Address{{ + Value: []byte("9BSEAEE3XGtQ2X43BCT2XCYgheGLQQigEG"), + Coin: []byte("SKY"), + }}, + Name: []byte("Contact1"), + }, args: args{ + id: 1}, + wantErr: false, + }, + {name: "two-address", + field: fields{ + Address: []Address{{ + Value: []byte("25MP2EHPZyfEqUnXfapgUj1TQfZVXdn5RrZ"), + Coin: []byte("SKY"), + }, { + Value: []byte("2TFC2Ktc6Y3UAUqo7WGA55X6mqoKZRaFp9s"), + Coin: []byte("SKY"), + }}, + Name: []byte("Contact2"), + }, args: args{ + id: 2}, + wantErr: false, + }, + {name: "bad-ID", + field: fields{ + Name: []byte("Contact3"), + Address: []Address{ + { + Value: []byte("2TFC2Ktc6Y3UAUqo7WGA55X6mqoKZRaFp9s"), + Coin: []byte("SKY"), + }}, + }, args: args{ + id: 6}, + wantErr: true, + }, + } + + ab := InitAddrsBook(t) + defer CloseTest(t, ab) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + _, _ = ab.InsertContact(&Contact{ + Address: tt.field.Address, + Name: tt.field.Name, + }) + if err := ab.DeleteContact(tt.args.id); (err != nil) != tt.wantErr { + t.Errorf("DeleteContact() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} + +func Test_addressBook_GetContact(t *testing.T) { + local.LoadAltcoinManager().RegisterPlugin(skycoin.NewSkyFiberPlugin(skycoin.SkycoinMainNetParams)) + type fields struct { + Address []Address + Name []byte + } + type args struct { + id uint64 + } + tests := []struct { + name string + fields fields + args args + want core.Contact + wantErr bool + }{ + {name: "empty", + fields: fields{}, + args: args{ + id: 1, + }, + want: nil, + wantErr: true}, + {name: "one-address", + fields: fields{ + Address: []Address{{ + Value: []byte("9BSEAEE3XGtQ2X43BCT2XCYgheGLQQigEG"), + Coin: []byte("SKY"), + }}, + Name: []byte("Contact1"), + }, args: args{ + id: 1, + }, + want: &Contact{ + ID: 1, + Address: []Address{{ + Value: []byte("9BSEAEE3XGtQ2X43BCT2XCYgheGLQQigEG"), + Coin: []byte("SKY"), + }}, + Name: []byte("Contact1"), + }, + wantErr: false, + }, + {name: "two-address", fields: fields{ + Address: []Address{{ + Value: []byte("25MP2EHPZyfEqUnXfapgUj1TQfZVXdn5RrZ"), + Coin: []byte("SKY"), + }, { + Value: []byte("2TFC2Ktc6Y3UAUqo7WGA55X6mqoKZRaFp9s"), + Coin: []byte("SKY"), + }}, + Name: []byte("Contact2"), + }, args: args{ + id: 2, + }, + want: &Contact{ + ID: 2, + Address: []Address{{ + Value: []byte("25MP2EHPZyfEqUnXfapgUj1TQfZVXdn5RrZ"), + Coin: []byte("SKY"), + }, { + Value: []byte("2TFC2Ktc6Y3UAUqo7WGA55X6mqoKZRaFp9s"), + Coin: []byte("SKY"), + }}, + Name: []byte("Contact2"), + }, + wantErr: false, + }, + {name: "bad-ID", + fields: fields{ + Name: []byte("Contact3"), + }, + args: args{ + id: 6, + }, + want: nil, + wantErr: true, + }, + } + + ab := InitAddrsBook(t) + defer CloseTest(t, ab) + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + + if _, err := ab.InsertContact(&Contact{ + Address: tt.fields.Address, + Name: tt.fields.Name, + }); (err != nil) == tt.wantErr { + return + } + + got, err := ab.GetContact(tt.args.id) + if (err != nil) != tt.wantErr { + t.Errorf("GetContact() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("GetContact() got = %v, want %v", got, tt.want) + } + }) + } +} + +func Test_addressBook_InsertContact(t *testing.T) { + local.LoadAltcoinManager().RegisterPlugin(skycoin.NewSkyFiberPlugin(skycoin.SkycoinMainNetParams)) + type args struct { + c core.Contact + } + tests := []struct { + name string + args args + wantErr bool + }{ + {name: "empty", + args: args{ + c: &Contact{}, + }, + wantErr: true, + }, {name: "one-address", + args: args{ + c: &Contact{ + Address: []Address{{ + Value: []byte("2DpeofcsamDfanrRz34qjYvskRzKqzNKMcj"), + Coin: []byte("SKY"), + }}, + Name: []byte("Contact1"), + }, + }, + wantErr: false, + }, {name: "two-address", + args: args{ + c: &Contact{ + Address: []Address{{ + Value: []byte("25MP2EHPZyfEqUnXfapgUj1TQfZVXdn5RrZ"), + Coin: []byte("SKY"), + }, { + Value: []byte("2TFC2Ktc6Y3UAUqo7WGA55X6mqoKZRaFp9s"), + Coin: []byte("SKY"), + }}, + Name: []byte("Contact2"), + }, + }, + wantErr: false}, + // }, {name: "repeat-address-diff-type", + // args: args{ + // c: &Contact{ + // Address: []Address{{ + // Value: []byte("2TFC2Ktc6Y3UAUqo7WGA55X6mqoKZRaFp9s"), + // Coin: []byte("SKY"), + // }}, + // Name: []byte("Contact3"), + // }, + // }, + // wantErr: false}, + {name: "repeat-address-same-type", + args: args{ + c: &Contact{ + Address: []Address{{ + Value: []byte("2TFC2Ktc6Y3UAUqo7WGA55X6mqoKZRaFp9s"), + Coin: []byte("SKY"), + }}, + Name: []byte("Contact4"), + }, + }, + wantErr: true, + }, + {name: "repeat-name", + args: args{ + c: &Contact{ + Address: []Address{{ + Value: []byte("2LRUs2MFEhCpDfSHaNjCtzjz8TJjuTK98s5"), + Coin: []byte("SKY"), + }}, + Name: []byte("Contact2"), + }, + }, + wantErr: true, + }, + } + ab := InitAddrsBook(t) + defer CloseTest(t, ab) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if _, err := ab.InsertContact(tt.args.c); (err != nil) != tt.wantErr { + t.Errorf("InsertContact() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} + +func Test_addressBook_ListContact(t *testing.T) { + local.LoadAltcoinManager().RegisterPlugin(skycoin.NewSkyFiberPlugin(skycoin.SkycoinMainNetParams)) + type fields struct { + Contacts []Contact + } + type args struct { + } + tests := []struct { + name string + fields fields + args args + want []core.Contact + wantErr bool + }{ + {name: "empty", + fields: fields{Contacts: []Contact(nil)}, + want: []core.Contact(nil), + wantErr: true}, + {name: "one-contact", + fields: fields{Contacts: []Contact{ + {Address: []Address{{ + Value: []byte("n5SteDkkYdR3VJtMnVYcQ45L16rDDrseG8"), + Coin: []byte("SKY"), + }}, + Name: []byte("contact1"), + }, + }}, + want: []core.Contact{&Contact{ + ID: 1, + Address: []Address{{ + Value: []byte("n5SteDkkYdR3VJtMnVYcQ45L16rDDrseG8"), + Coin: []byte("SKY"), + }}, + Name: []byte("contact1"), + }}, + wantErr: false}, + {name: "multiple-contacts", + fields: fields{Contacts: []Contact{ + {Address: []Address{{ + Value: []byte("mGeG2PDoU4nc9qE1FSSreAjFeKG12zDvur"), + Coin: []byte("SKY"), + }}, + Name: []byte("contact1"), + }, + {Address: []Address{{ + Value: []byte("9BSEAEE3XGtQ2X43BCT2XCYgheGLQQigEG"), + Coin: []byte("SKY"), + }, { + Value: []byte("29cnQPHuWHCRF26LEAb2gR83ywnF3F9HduW"), + Coin: []byte("SKY")}}, + Name: []byte("contact2"), + }, + {Address: []Address{{ + Value: []byte("2ymjULRdbiFoUNJKNhWbQ3JqdE8TXnZkyU"), + Coin: []byte("SKY"), + }}, + Name: []byte("contact3"), + }, { + Address: []Address{{ + Value: []byte("oHvj7oy8maES9HJiQHJTp4GvcUcpz3voDq"), + Coin: []byte("SKY"), + }, { + Value: []byte("2SGMfTFV2zbQzGw7aJm1D5EeEPgych5ixuC"), + Coin: []byte("SKY")}}, + Name: []byte("contact4"), + }, { + Address: []Address{{ + Value: []byte("2EVNa4CK9SKosT4j1GEn8SuuUUEAXaHAMbM"), + Coin: []byte("SKY"), + }, { + Value: []byte("n5SteDkkYdR3VJtMnVYcQ45L16rDDrseG8"), + Coin: []byte("SKY"), + }}, + Name: []byte("contact5"), + }, {Address: []Address{{ + Value: []byte("rhbE3thvA747E81KfaYCujur7GKXjdhvS4"), + Coin: []byte("SKY"), + }}, + Name: []byte("contact6"), + }, + {Address: []Address{{ + Value: []byte("2DpeofcsamDfanrRz34qjYvskRzKqzNKMcj"), + Coin: []byte("SKY"), + }, { + Value: []byte("LxcitUpWQZbPjgEPs6R1i3G4Xa31nPMoSG"), + Coin: []byte("SKY")}}, + Name: []byte("contact7"), + }, + {Address: []Address{{ + Value: []byte("2EJMjg7nV4DMrkshnvwg7tLdibeuu7DKvZh"), + Coin: []byte("SKY"), + }}, + Name: []byte("contact8"), + }, + }}, + want: []core.Contact{ + &Contact{ + ID: 1, + Address: []Address{{ + Value: []byte("mGeG2PDoU4nc9qE1FSSreAjFeKG12zDvur"), + Coin: []byte("SKY"), + }}, + Name: []byte("contact1"), + }, + &Contact{ + ID: 2, + Address: []Address{{ + Value: []byte("9BSEAEE3XGtQ2X43BCT2XCYgheGLQQigEG"), + Coin: []byte("SKY"), + }, { + Value: []byte("29cnQPHuWHCRF26LEAb2gR83ywnF3F9HduW"), + Coin: []byte("SKY")}}, + Name: []byte("contact2"), + }, + &Contact{ + ID: 3, + Address: []Address{{ + Value: []byte("2ymjULRdbiFoUNJKNhWbQ3JqdE8TXnZkyU"), + Coin: []byte("SKY"), + }}, + Name: []byte("contact3"), + }, + &Contact{ + ID: 4, + Address: []Address{{ + Value: []byte("oHvj7oy8maES9HJiQHJTp4GvcUcpz3voDq"), + Coin: []byte("SKY"), + }, { + Value: []byte("2SGMfTFV2zbQzGw7aJm1D5EeEPgych5ixuC"), + Coin: []byte("SKY")}}, + Name: []byte("contact4"), + }, + &Contact{ + ID: 5, + Address: []Address{{ + Value: []byte("2EVNa4CK9SKosT4j1GEn8SuuUUEAXaHAMbM"), + Coin: []byte("SKY"), + }, { + Value: []byte("n5SteDkkYdR3VJtMnVYcQ45L16rDDrseG8"), + Coin: []byte("SKY"), + }}, + Name: []byte("contact5"), + }, &Contact{ + ID: 6, + Address: []Address{{ + Value: []byte("rhbE3thvA747E81KfaYCujur7GKXjdhvS4"), + Coin: []byte("SKY"), + }}, + Name: []byte("contact6"), + }, + &Contact{ + ID: 7, + Address: []Address{{ + Value: []byte("2DpeofcsamDfanrRz34qjYvskRzKqzNKMcj"), + Coin: []byte("SKY"), + }, { + Value: []byte("LxcitUpWQZbPjgEPs6R1i3G4Xa31nPMoSG"), + Coin: []byte("SKY")}}, + Name: []byte("contact7"), + }, + &Contact{ + ID: 8, + Address: []Address{{ + Value: []byte("2EJMjg7nV4DMrkshnvwg7tLdibeuu7DKvZh"), + Coin: []byte("SKY"), + }}, + Name: []byte("contact8"), + }, + }, + wantErr: false}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + ab := InitAddrsBook(t) + defer CloseTest(t, ab) + for _, contact := range tt.fields.Contacts { + + if _, err := ab.InsertContact(&contact); err != nil { + t.Error(err) + return + } + } + got, err := ab.ListContact() + if (err != nil) != tt.wantErr { + t.Errorf("ListContact() error = %v, wantErr %v", err, tt.wantErr) + return + } + for e := range got { + assert.Contains(t, tt.want, got[e]) + } + + }) + } +} + +func TestDB_UpdateContact(t *testing.T) { + local.LoadAltcoinManager().RegisterPlugin(skycoin.NewSkyFiberPlugin(skycoin.SkycoinMainNetParams)) + type args struct { + id uint64 + newContact core.Contact + } + type insertArgs struct { + contacts []core.Contact + } + tests := []struct { + name string + args args + insertArgs insertArgs + wantErr bool + }{ + {name: "empty-update", + args: args{ + id: 1, + newContact: &Contact{}, + }, + insertArgs: insertArgs{ + contacts: []core.Contact{&Contact{ + Address: []Address{{ + Value: []byte("25MP2EHPZyfEqUnXfapgUj1TQfZVXdn5RrZ"), + Coin: []byte("SKY"), + }}, + Name: []byte("Contact1"), + }}}, + wantErr: true, + }, + {name: "update-coinType", + args: args{ + id: 1, + newContact: &Contact{ + Address: []Address{{ + Value: []byte("25MP2EHPZyfEqUnXfapgUj1TQfZVXdn5RrZ"), + Coin: []byte("SKY"), + }}, + Name: []byte("Contact1"), + }, + }, + insertArgs: insertArgs{ + contacts: []core.Contact{&Contact{ + Address: []Address{{ + Value: []byte("25MP2EHPZyfEqUnXfapgUj1TQfZVXdn5RrZ"), + Coin: []byte("SKY"), + }}, + Name: []byte("Contact1"), + }}}, + wantErr: false, + }, + {name: "update-address", + args: args{ + id: 1, + newContact: &Contact{ + Address: []Address{{ + Value: []byte("n5SteDkkYdR3VJtMnVYcQ45L16rDDrseG8"), + Coin: []byte("SKY"), + }}, + Name: []byte("Contact1"), + }, + }, + insertArgs: insertArgs{ + contacts: []core.Contact{&Contact{ + Address: []Address{{ + Value: []byte("25MP2EHPZyfEqUnXfapgUj1TQfZVXdn5RrZ"), + Coin: []byte("SKY"), + }}, + Name: []byte("Contact1"), + }}}, + wantErr: false, + }, + {name: "same-contact", + args: args{ + id: 1, + newContact: &Contact{ + Address: []Address{{ + Value: []byte("25MP2EHPZyfEqUnXfapgUj1TQfZVXdn5RrZ"), + Coin: []byte("SKY"), + }}, + Name: []byte("Contact1"), + }, + }, + insertArgs: insertArgs{ + contacts: []core.Contact{&Contact{ + Address: []Address{{ + Value: []byte("25MP2EHPZyfEqUnXfapgUj1TQfZVXdn5RrZ"), + Coin: []byte("SKY"), + }}, + Name: []byte("Contact1"), + }}}, + wantErr: false, + }, {name: "repeat-address", + args: args{ + id: 1, + newContact: &Contact{ + Address: []Address{{ + Value: []byte("n5SteDkkYdR3VJtMnVYcQ45L16rDDrseG8"), + Coin: []byte("SKY"), + }}, + Name: []byte("Contact1"), + }, + }, + insertArgs: insertArgs{ + contacts: []core.Contact{&Contact{ + Address: []Address{{ + Value: []byte("25MP2EHPZyfEqUnXfapgUj1TQfZVXdn5RrZ"), + Coin: []byte("SKY"), + }}, + Name: []byte("Contact1"), + }, + &Contact{ + Address: []Address{{ + Value: []byte("n5SteDkkYdR3VJtMnVYcQ45L16rDDrseG8"), + Coin: []byte("SKY"), + }}, + Name: []byte("Contact2"), + }}}, + wantErr: true, + }, + {name: "repeat-name", + args: args{ + id: 1, + newContact: &Contact{ + Address: []Address{{ + Value: []byte("9BSEAEE3XGtQ2X43BCT2XCYgheGLQQigEG"), + Coin: []byte("SKY"), + }}, + Name: []byte("Contact2"), + }, + }, + insertArgs: insertArgs{ + contacts: []core.Contact{&Contact{ + Address: []Address{{ + Value: []byte("25MP2EHPZyfEqUnXfapgUj1TQfZVXdn5RrZ"), + Coin: []byte("SKY"), + }}, + Name: []byte("Contact1"), + }, + &Contact{ + Address: []Address{{ + Value: []byte("n5SteDkkYdR3VJtMnVYcQ45L16rDDrseG8"), + Coin: []byte("SKY"), + }}, + Name: []byte("Contact2"), + }}}, + wantErr: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + ab := InitAddrsBook(t) + defer CloseTest(t, ab) + for e := range tt.insertArgs.contacts { + _, err := ab.InsertContact(tt.insertArgs.contacts[e]) + if err != nil && tt.wantErr { + require.Error(t, err) + } + require.NoError(t, err) + } + + if err := ab.UpdateContact(tt.args.id, tt.args.newContact); (err != nil) != tt.wantErr { + t.Errorf("UpdateContact() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} + +func TestDB_Init(t *testing.T) { + type args struct { + secType int + password string + } + tests := []struct { + name string + // fields fields + args args + wantErr bool + }{ + {name: "Type 1", args: args{ + secType: NoSecurity, + password: "", + }, wantErr: false}, + {name: "Type 2", args: args{ + secType: ObfuscationSecurity, + password: "", + }, wantErr: false}, + {name: "Type 3", args: args{ + secType: PasswordSecurity, + password: defaultPass, + }, wantErr: false}, + {name: "Type wrong", args: args{ + secType: -1, + password: "", + }, wantErr: true}, + {name: "Two Init", args: args{ + secType: PasswordSecurity, + password: defaultPass, + }, wantErr: true}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + + db, err := GetBoltStorage(GetFilePath(t)) + if err != nil { + t.Error(err) + return + } + addressBook := NewAddressBook(db) + + if tt.name == "Two Init" { + _ = addressBook.Init(tt.args.secType, tt.args.password) + } + + defer CloseTest(t, addressBook) + + if err := addressBook.Init(tt.args.secType, tt.args.password); (err != nil) != tt.wantErr { + t.Errorf("Init() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} + +func TestDB_Authenticate(t *testing.T) { + ab := InitAddrsBook(t) + assert.NoError(t, ab.Authenticate(defaultPass)) + // address book error: crypto/bcrypt: hashedPassword is not the hash of the given password + assert.Error(t, ab.Authenticate("")) + + CloseTest(t, ab) + // error database not open + assert.Error(t, ab.Authenticate(defaultPass)) + +} + +func Test_addrsBook_ChangeSecurity(t *testing.T) { + local.LoadAltcoinManager().RegisterPlugin(skycoin.NewSkyFiberPlugin(skycoin.SkycoinMainNetParams)) + type firstSecTypeParam struct { + secType int + password string + } + type secondSecTypeParam struct { + NewSecType int + NewPassword string + } + tests := []struct { + name string + firstSecTypeParam firstSecTypeParam + secondSecTypeParam secondSecTypeParam + ContactsList []core.Contact + wantErr bool + }{ + {name: "from NoSecurity to ObfuscationSecurity", + firstSecTypeParam: firstSecTypeParam{ + secType: 0, + password: "", + }, secondSecTypeParam: secondSecTypeParam{ + NewSecType: 1, + NewPassword: "", + }, ContactsList: []core.Contact{ + &Contact{ + Address: []Address{{ + Value: []byte("9BSEAEE3XGtQ2X43BCT2XCYgheGLQQigEG"), + Coin: []byte("SKY"), + }}, + Name: []byte("contact_test1"), + }}, wantErr: false}, + {name: "from NoSecurity to PasswordSecurity", + firstSecTypeParam: firstSecTypeParam{ + secType: 0, + password: "", + }, secondSecTypeParam: secondSecTypeParam{ + NewSecType: 2, + NewPassword: "Maria", + }, ContactsList: []core.Contact{ + &Contact{ + Address: []Address{{ + Value: []byte("9BSEAEE3XGtQ2X43BCT2XCYgheGLQQigEG"), + Coin: []byte("SKY"), + }}, + Name: []byte("contact_test1"), + }}, wantErr: false}, + {name: "invalid Security Type", + firstSecTypeParam: firstSecTypeParam{ + secType: 0, + password: "", + }, secondSecTypeParam: secondSecTypeParam{ + NewSecType: 3, + NewPassword: "Maria", + }, ContactsList: []core.Contact{ + &Contact{ + Address: []Address{{ + Value: []byte("9BSEAEE3XGtQ2X43BCT2XCYgheGLQQigEG"), + Coin: []byte("SKY"), + }}, + Name: []byte("contact_test1"), + }}, wantErr: true}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + db, err := GetBoltStorage(GetFilePath(t)) + require.NoError(t, err) + addrsBook := NewAddressBook(db) + + defer CloseTest(t, addrsBook) + + err = addrsBook.Init(tt.firstSecTypeParam.secType, tt.firstSecTypeParam.password) + require.NoError(t, err) + for e := range tt.ContactsList { + _, err := addrsBook.InsertContact(tt.ContactsList[e]) + require.NoError(t, err) + } + if err := addrsBook.ChangeSecurity(tt.secondSecTypeParam.NewSecType, + tt.firstSecTypeParam.password, tt.secondSecTypeParam.NewPassword); err != nil { + if tt.wantErr { + require.Error(t, err) + return + } + require.NoError(t, err) + } + listContacts, err := addrsBook.ListContact() + require.NoError(t, err) + for e := range listContacts { + listContacts[e].SetID(0) + assert.Contains(t, tt.ContactsList, listContacts[e]) + } + }) + } +} + +// Generate a temporal file and return its path. +func GetFilePath(t *testing.T) string { + home := os.Getenv("HOME") + ok, err := file.Exists(home + "/temp") + if err != nil { + t.Error(err) + } + if !ok { + if err := os.Mkdir(home+"/temp", 0777); err != nil { + t.Error(err) + } + } + f, err := ioutil.TempFile(home+"/temp", "testaddressbook-") + if err != nil { + t.Error(err) + } + + if err := f.Close(); err != nil { + t.Error(err) + } + return f.Name() +} + +// Open a address book using a test file. +func InitAddrsBook(t *testing.T) core.AddressBook { + path := GetFilePath(t) + db, err := GetBoltStorage(path) + if err != nil { + t.Error(err) + } + AddrsBook := NewAddressBook(db) + err = AddrsBook.Init(PasswordSecurity, defaultPass) + if err != nil { + t.Error(err) + } + + return AddrsBook +} + +func CloseTest(t *testing.T, ab core.AddressBook) { + path := ab.GetStorage().Path() + if err := ab.Close(); err != nil { + t.Errorf("Error closing db: %s", err) + } + if err := os.Remove(path); err != nil { + t.Error(err) + } +} diff --git a/src/data/database.go b/src/data/database.go new file mode 100644 index 00000000..c12d26c7 --- /dev/null +++ b/src/data/database.go @@ -0,0 +1,227 @@ +package data + +import ( + "errors" + "fmt" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" + "github.com/boltdb/bolt" + "time" +) + +type boltStorage struct { + *bolt.DB +} + +const ( + // Db buckets. + dbAddrsBookBkt = "AddressBook" + dbConfigBkt = "Config" +) + +var ( + // Errors + errDatabaseNotOpen = errors.New("database not open") + errBucketEmpty = errors.New("database: bucket are empty") + errValEmpty = errors.New(" database: result are empty") +) + +// GetBoltStorage generate a new instance of boltStorage by path. +func GetBoltStorage(path string) (*boltStorage, error) { + db, err := bolt.Open(path, 0600, + &bolt.Options{ + Timeout: 1 * time.Second, + }) + + if err != nil { + logDb.Error(err) + return nil, err + } + + return &boltStorage{db}, nil +} + +// GetConfig Returns the config bucket content. +func (b *boltStorage) GetConfig() map[string]string { + tx, err := b.Begin(false) + if err != nil { + logDb.Error(err) + return nil + } + defer func() { + if err := tx.Rollback(); err != nil { + logDb.Fatal(err) + } + }() + + if conf := tx.Bucket([]byte(dbConfigBkt)); conf != nil { + confMap := make(map[string]string, 0) + if err := conf.ForEach(func(k, v []byte) error { + confMap[string(k)] = string(v) + return nil + }); err != nil { + logDb.Error(err) + return nil + } + return confMap + } + return nil +} + +// InsertConfig set into config bucket the config parameters (securityType, hash, entropy) +func (b *boltStorage) InsertConfig(options map[string]string) error { + // Start a writeable transaction. + tx, err := b.Begin(true) + if err != nil { + logDb.Error(err) + return err + } + + defer func() { + if err := tx.Rollback(); err != nil && err != bolt.ErrTxClosed { + // Start a writeable transaction. + logDb.Fatal(err) + } + }() + + bkt, err := tx.CreateBucketIfNotExists([]byte(dbConfigBkt)) + if err != nil { + logDb.Error(err) + return err + } + for k, v := range options { + if err := bkt.Put([]byte(k), []byte(v)); err != nil { + logDb.Error(err) + return err + } + } + return tx.Commit() +} + +// InsertValue insert a value in AddressBook bucket. +func (b *boltStorage) InsertValue(value interface{}) (uint64, error) { + // Start a writeable transaction. + tx, err := b.Begin(true) + if err != nil { + logDb.Error(err) + return 0, err + } + element, ok := value.([]byte) + if !ok { + err := errValueNoMatch(element, []byte{}) + logDb.Error(err) + return 0, err + } + defer func() { + if err := tx.Rollback(); err != nil && err != bolt.ErrTxClosed { + logDb.Fatal(err) + } + }() + + bkt, err := tx.CreateBucketIfNotExists([]byte(dbAddrsBookBkt)) + if err != nil { + logDb.Fatal(err) + return 0, err + } + // The sequence is an auto-incrementing integer that is transactionally safe. + id, err := bkt.NextSequence() + + if err != nil { + logDb.Fatal(err) + return 0, err + } + + if err := bkt.Put(dbutil.Itob(id), element); err != nil { + logDb.Fatal(err) + return 0, err + } + return id, tx.Commit() +} + +// GetValue get a value from the AddressBook bucket. +func (b *boltStorage) GetValue(key uint64) (interface{}, error) { + tx, err := b.Begin(false) + if err != nil { + logDb.Error(err) + return nil, err + } + defer func() { + if err := tx.Rollback(); err != nil { + logDb.Fatal(err) + } + }() + if addrsBookBkt := tx.Bucket([]byte(dbAddrsBookBkt)); addrsBookBkt != nil { + result := addrsBookBkt.Get(dbutil.Itob(key)) + if result == nil { + return nil, errValEmpty + } + return result, nil + } + + return nil, errBucketEmpty +} + +// ListValues returns all values from AddressBook bucket. +func (b *boltStorage) ListValues() (map[uint64]interface{}, error) { + tx, err := b.Begin(false) + if err != nil { + logDb.Error(err) + return nil, err + } + defer func() { + if err := tx.Rollback(); err != nil { + logDb.Fatal(err) + } + }() + + if addrsBookBkt := tx.Bucket([]byte(dbAddrsBookBkt)); addrsBookBkt != nil { + resultsMap := make(map[uint64]interface{}, 0) + if err := addrsBookBkt.ForEach(func(k, v []byte) error { + resultsMap[dbutil.Btoi(k)] = v + return nil + }); err != nil { + logDb.Error(err) + return nil, err + } + return resultsMap, nil + } + return nil, errBucketEmpty +} + +// DeleteValue remove a value from the AddressBook bucket by its id. +func (b *boltStorage) DeleteValue(key uint64) error { + return b.Update(func(tx *bolt.Tx) error { + bkt := tx.Bucket([]byte(dbAddrsBookBkt)) + if bkt == nil { + return errBucketEmpty + } + + if val := bkt.Get(dbutil.Itob(key)); val == nil { + return errValEmpty + } + + return bkt.Delete(dbutil.Itob(key)) + }) + +} + +// UpdateValue update a element into the AddressBook bucket by its id. +func (b *boltStorage) UpdateValue(key uint64, newVal interface{}) error { + return b.Update(func(tx *bolt.Tx) error { + bkt := tx.Bucket([]byte(dbAddrsBookBkt)) + if bkt == nil { + logDb.Error(errBucketEmpty) + return errBucketEmpty + } + element, ok := newVal.([]byte) + if !ok { + err := errValueNoMatch(element, []byte{}) + logDb.Error(err) + return err + } + return bkt.Put(dbutil.Itob(key), newVal.([]byte)) + }) +} + +func errValueNoMatch(value, valType interface{}) error { + return fmt.Errorf("value %value type %T no match with type %T", value, value, valType) +} diff --git a/src/errors/error.go b/src/errors/error.go index 63e260f8..a1792e31 100644 --- a/src/errors/error.go +++ b/src/errors/error.go @@ -45,6 +45,8 @@ var ( ErrInvalidAddressString = errors.New("Error decoding base58 address") // ErrTxnSignFailure signing strategy reported an error whie signing transaction ErrTxnSignFailure = errors.New("Transaction signing failed for txn") + // ErrNoMoreElements no more elements in a sequence or succession + ErrNoMoreElements = errors.New("No more elements in the sequence") // ErrUnexpectedUxOutAddress unexpected address ErrUnexpectedUxOutAddress = errors.New("Unexpected address") // ErrInvalidPoolObjectType clients in the pool do not match expected type @@ -53,6 +55,23 @@ var ( ErrInvalidWalletEntropy = errors.New("Entropy must be 128 or 256") // ErrInvalidValue invalid value was supplied in to function ErrInvalidValue = errors.New("Value errors") + // ErrInvalidTypeAssertion the current value have not the expected type + ErrInvalidTypeAssertion = errors.New("Invalid type assertion") // ErrWalletCantSign wallet can not sign transactions ErrWalletCantSign = errors.New("Wallet does not support transaction signing") + // ErrNotImplemented feature not implemented + ErrNotImplemented = errors.New("Feature not implemented") + // ErrWltFromAddrNotFound trying to find a wallet from the first address in the deterministic sequence failed + // wallet not found + ErrWltFromAddrNotFound = errors.New("Error getting wallet from addr, no wallet found") + // ErrInvalidIndex invalid index detected + ErrInvalidIndex = errors.New("Invalid index") + // ErrKeyNotFound unknown key + ErrKeyNotFound = errors.New("Key not found") + // ErrHwUnexpected unexpected error with sky-hw + ErrHwUnexpected = errors.New("Unexpected error with device") + // ErrHwSignTransactionCanceled cancelled by user in the physical device + ErrHwSignTransactionCanceled = errors.New("Sign transaction with hardware wallet has been canceled") + // ErrNilValue object should not be null + ErrNilValue = errors.New("Object should not be null") ) diff --git a/src/main/config.go b/src/main/config.go index 68f235ff..fd9d6242 100644 --- a/src/main/config.go +++ b/src/main/config.go @@ -2,14 +2,19 @@ package local import ( "encoding/json" + "strconv" "github.com/fibercrypto/fibercryptowallet/src/errors" + "github.com/fibercrypto/fibercryptowallet/src/params" + "github.com/fibercrypto/fibercryptowallet/src/util/logging" qtcore "github.com/therecipe/qt/core" ) const ( LocalWallet = iota RemoteWallet + DataRefreshTimeoutKey = "lifeTime" + DataUpdateTimeKey = "updateTime" ) var ( @@ -17,13 +22,31 @@ var ( OptionNotFoundError = errors.ErrInvalidOptions ) +var logSettings = logging.MustGetLogger("Skycoin Altcoin") + func init() { - qs := qtcore.NewQSettings(qtcore.QCoreApplication_OrganizationName(), qtcore.QCoreApplication_ApplicationName(), nil) + qs := qtcore.NewQSettings(params.OrganizationName, params.ApplicationName, nil) confManager = &ConfigManager{ setting: qs, sections: make(map[string]*SectionManager), } + logSettings.Debug("Configuration path :=> " +qs.FileName()) + + valueLifeTime := strconv.FormatUint(params.DataRefreshTimeout, 10) + valueUpdateTime := strconv.FormatUint(params.DataUpdateTime, 10) + + cache := map[string]string{ + DataRefreshTimeoutKey: valueLifeTime, + DataUpdateTimeKey: valueUpdateTime, + } + cacheBytes, err := json.Marshal(cache) + if err != nil { + return + } + cacheOpt := NewOption("cache", []string{}, false, string(cacheBytes)) + + _ = confManager.RegisterSection("global", []*Option{cacheOpt}) } type ConfigManager struct { @@ -56,14 +79,18 @@ func (cm *ConfigManager) RegisterSection(name string, options []*Option) *Sectio defer cm.setting.Sync() for _, opt := range options { + depthLevel := 0 for _, sect := range opt.sectionPath { cm.setting.BeginGroup(sect) - defer cm.setting.EndGroup() + depthLevel++ } if !opt.optional && !cm.setting.Contains(opt.name) { cm.setting.SetValue(opt.name, qtcore.NewQVariant1(opt._default)) } + for i := 0; i < depthLevel; i++ { + cm.setting.EndGroup() + } } return cm.sections[name] @@ -88,6 +115,7 @@ func (sm *SectionManager) GetValue(name string, sectionPath []string) (string, e } } if !finded { + logSettings.Debug("Couldn't found this setting => " + name) return "", OptionNotFoundError } sm.settings.BeginGroup(sect) @@ -95,8 +123,10 @@ func (sm *SectionManager) GetValue(name string, sectionPath []string) (string, e } val := sm.settings.Value(name, qtcore.NewQVariant()) if val.IsNull() { + logSettings.Debug("Couldn't found this setting => " + name) return "", OptionNotFoundError } + logSettings.Debug("The value for setting " + name + " is " + val.ToString()) return val.ToString(), nil } diff --git a/src/main/plugin.go b/src/main/plugin.go index fc0c7ad0..2954c1b1 100644 --- a/src/main/plugin.go +++ b/src/main/plugin.go @@ -2,11 +2,8 @@ package local import ( "github.com/fibercrypto/fibercryptowallet/src/core" - "github.com/fibercrypto/fibercryptowallet/src/util/logging" ) -var logMainPlugin = logging.MustGetLogger("Altcoin plugin entry point") - type altcoinRecord struct { Manager core.AltcoinPlugin Metadata core.AltcoinMetadata @@ -24,13 +21,11 @@ var ( ) func (m *fibercryptoAltcoinManager) RegisterPlugin(p core.AltcoinPlugin) { - logMainPlugin.Info("Register plugin to Altcoin manager") p.RegisterTo(m) m.registeredPlugins = append(m.registeredPlugins, p) } func (m *fibercryptoAltcoinManager) RegisterAltcoin(info core.AltcoinMetadata, plugin core.AltcoinPlugin) { - logMainPlugin.Info("Register altcoin to Altcoin manager") m.altcoinMap[info.Ticker] = altcoinRecord{ Manager: plugin, Metadata: info, @@ -38,12 +33,10 @@ func (m *fibercryptoAltcoinManager) RegisterAltcoin(info core.AltcoinMetadata, p } func (m *fibercryptoAltcoinManager) ListRegisteredPlugins() []core.AltcoinPlugin { - logMainPlugin.Info("Listing registered plugins in Altcoin manager") return m.registeredPlugins } func (m *fibercryptoAltcoinManager) LookupAltcoinPlugin(ticker string) (core.AltcoinPlugin, bool) { - logMainPlugin.Info("Looking up for registered altcoin's") if r, isRegistered := m.altcoinMap[ticker]; isRegistered { return r.Manager, true } @@ -51,7 +44,6 @@ func (m *fibercryptoAltcoinManager) LookupAltcoinPlugin(ticker string) (core.Alt } func (m *fibercryptoAltcoinManager) DescribeAltcoin(ticker string) (core.AltcoinMetadata, bool) { - logMainPlugin.Info("Describing Altcoin manager") if r, isRegistered := m.altcoinMap[ticker]; isRegistered { return r.Metadata, true } @@ -60,7 +52,6 @@ func (m *fibercryptoAltcoinManager) DescribeAltcoin(ticker string) (core.Altcoin // LoadAltcoinManager load altcoin manager singleton instance func LoadAltcoinManager() core.AltcoinManager { - logMainPlugin.Info("Loading Altcoin manager") if manager.altcoinMap == nil { manager.altcoinMap = make(map[string]altcoinRecord, 5) manager.signers = make(map[core.UID]core.TxnSigner, 5) diff --git a/src/main/sign.go b/src/main/sign.go index bbb5b68c..f3214b06 100644 --- a/src/main/sign.go +++ b/src/main/sign.go @@ -8,7 +8,11 @@ import ( func (m *fibercryptoAltcoinManager) AttachSignService(signSrv core.TxnSigner) error { if signSrv != nil { - m.signers[signSrv.GetSignerUID()] = signSrv + uid, err := signSrv.GetSignerUID() + if err != nil { + return err + } + m.signers[uid] = signSrv } return nil } @@ -25,7 +29,10 @@ func (m *fibercryptoAltcoinManager) LookupSignService(id core.UID) core.TxnSigne } func (m *fibercryptoAltcoinManager) RemoveSignService(signSrv core.TxnSigner) error { - uid := signSrv.GetSignerUID() + uid, err := signSrv.GetSignerUID() + if err != nil { + return err + } if _, isBound := m.signers[uid]; isBound { delete(m.signers, uid) return nil diff --git a/src/models/address/address.go b/src/models/address/address.go index 45b7320e..b97c6e69 100644 --- a/src/models/address/address.go +++ b/src/models/address/address.go @@ -33,7 +33,7 @@ type AddressList struct { _ func() `constructor:"init"` - _ func(transaction *AddressDetails) `signal:"addAddress,auto"` + _ func(transaction *AddressDetails) `signal:"addAddress"` _ func(index int) `signal:"removeAddress,auto"` _ []*AddressDetails `property:"addresses"` @@ -49,6 +49,7 @@ func (al *AddressList) init() { al.ConnectRowCount(al.rowCount) al.ConnectData(al.data) al.ConnectRoleNames(al.roleNames) + al.ConnectAddAddress(al.addAddress) } diff --git a/src/models/addressBook/address.go b/src/models/addressBook/address.go new file mode 100644 index 00000000..85dfd210 --- /dev/null +++ b/src/models/addressBook/address.go @@ -0,0 +1,92 @@ +package addressBook + +import ( + "bytes" + "github.com/fibercrypto/fibercryptowallet/src/core" + qtcore "github.com/therecipe/qt/core" + "github.com/therecipe/qt/qml" + "sort" +) + +const ( + Value = int(qtcore.Qt__UserRole + (iota + 1)) + CoinType +) + +func init() { AddrsBkAddressModel_QmlRegisterType2("AddrsBookManager", 1, 0, "AddrsBkAddressModel") } + +type QAddress struct { + qtcore.QObject + _ string `property:"value"` + _ string `property:"coinType"` +} + +type AddrsBkAddressModel struct { + qtcore.QAbstractListModel + _ func() `constructor:"init"` + _ []*QAddress `property:"address"` + _ map[int]*qtcore.QByteArray `property:"roles"` +} + +func (m *AddrsBkAddressModel) init() { + m.SetRoles(map[int]*qtcore.QByteArray{ + Value: qtcore.NewQByteArray2("value", -1), + CoinType: qtcore.NewQByteArray2("coinType", -1), + }) + qml.QQmlEngine_SetObjectOwnership(m, qml.QQmlEngine__CppOwnership) + m.ConnectRowCount(m.rowCount) + m.ConnectData(m.data) + // m.ConnectColumnCount(m.columnCount) + m.ConnectRoleNames(m.roleNames) + +} + +func (m *AddrsBkAddressModel) rowCount(*qtcore.QModelIndex) int { + return len(m.Address()) +} + +func (m *AddrsBkAddressModel) roleNames() map[int]*qtcore.QByteArray { + return m.Roles() +} + +func (m *AddrsBkAddressModel) data(index *qtcore.QModelIndex, role int) *qtcore.QVariant { + logAddressBook.Info("Loading address data") + if !index.IsValid() { + return qtcore.NewQVariant() + } + + if index.Row() >= len(m.Address()) { + return qtcore.NewQVariant() + } + + address := m.Address()[index.Row()] + + switch role { + case Value: + { + return qtcore.NewQVariant1(address.Value()) + } + case CoinType: + { + return qtcore.NewQVariant1(address.CoinType()) + } + default: + { + return qtcore.NewQVariant() + } + } +} + +func fromAddressToQAddress(addresses []core.StringAddress) []*QAddress { + var qAddresses = make([]*QAddress, 0) + sort.Slice(addresses, func(i, j int) bool { + return bytes.Compare(addresses[i].GetCoinType(), addresses[j].GetCoinType()) == -1 + }) + for _, addrs := range addresses { + qa := NewQAddress(nil) + qa.SetCoinType(string(addrs.GetCoinType())) + qa.SetValue(string(addrs.GetValue())) + qAddresses = append(qAddresses, qa) + } + return qAddresses +} diff --git a/src/models/addressBook/contacts.go b/src/models/addressBook/contacts.go new file mode 100644 index 00000000..e751eb28 --- /dev/null +++ b/src/models/addressBook/contacts.go @@ -0,0 +1,339 @@ +package addressBook + +import ( + "github.com/SkycoinProject/skycoin/src/util/file" + skycoin "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/models" + "github.com/fibercrypto/fibercryptowallet/src/core" + "github.com/fibercrypto/fibercryptowallet/src/data" + "github.com/fibercrypto/fibercryptowallet/src/util/logging" + qtcore "github.com/therecipe/qt/core" + "github.com/therecipe/qt/qml" + "os" + "path/filepath" +) + +const ( + Name = int(qtcore.Qt__UserRole + (iota + 1)) + Address + ID +) + +var addrsBook core.AddressBook +var logAddressBook = logging.MustGetLogger("Address Book Model") + +func init() { AddrsBookModel_QmlRegisterType2("AddrsBookManager", 1, 0, "AddrsBookModel") } + +var addresses = make([]core.StringAddress, 0) + +type AddrsBookModel struct { + qtcore.QAbstractListModel + + _ map[int]*qtcore.QByteArray `property:"roles"` + _ []*QContact `property:"contacts"` + _ int `property:"count"` + _ func() `constructor:"init"` + _ func(row int, id uint64) `slot:"removeContact,auto"` + _ func(row int, id uint64, name string) `slot:"editContact,auto"` + _ func(name string) `slot:"newContact"` + _ func() `slot:"loadContacts"` + _ func(int, string) `slot:"initAddrsBook"` + _ func() int `slot:"getSecType"` + _ func(password string) bool `slot:"authenticate"` + _ func() bool `slot:"hasInit"` + _ func(value, coinType string) `slot:"addAddress"` + _ func(newSecType int, oldPassword, newPassword string) bool `slot:"changeSecType"` + _ func(value string) bool `slot:"addressIsValid"` + _ func(row int, name string) bool `slot:"nameExist"` + _ func(row int, address string, coinType string) bool `slot:"addressExist"` +} + +type QContact struct { + qtcore.QObject + _ uint64 `property:"id"` + _ string `property:"name"` + _ AddrsBkAddressModel `property:"address"` +} + +func (abm *AddrsBookModel) init() { + logAddressBook.Info("Init addressBook model") + abm.SetRoles(map[int]*qtcore.QByteArray{ + Name: qtcore.NewQByteArray2("name", -1), + Address: qtcore.NewQByteArray2("address", -1), + ID: qtcore.NewQByteArray2("id", -1), + }) + qml.QQmlEngine_SetObjectOwnership(abm, qml.QQmlEngine__CppOwnership) + abm.ConnectRowCount(abm.rowCount) + abm.ConnectData(abm.data) + abm.ConnectColumnCount(abm.columnCount) + abm.ConnectRoleNames(abm.roleNames) + abm.ConnectNewContact(abm.newContact) + abm.ConnectGetSecType(abm.getSecType) + abm.ConnectAuthenticate(abm.authenticate) + abm.ConnectAddressIsValid(abm.addressIsValid) + abm.ConnectAddressExist(abm.addressExist) + abm.ConnectNameExist(abm.nameExist) + abm.ConnectLoadContacts(abm.loadContacts) + abm.ConnectInitAddrsBook(abm.initAddrsBook) + // abm.ConnectEditContact(abm.editContact) + // abm.ConnectRemoveContact(abm.removeContact) + abm.ConnectHasInit(abm.hasInit) + abm.ConnectChangeSecType(abm.changeSecType) + abm.ConnectAddAddress(abm.addAddress) + if addrsBook == nil { + db, err := data.GetBoltStorage(getConfigFileDir()) + if err != nil { + logAddressBook.Error(err) + } + addrsBook = data.NewAddressBook(db) + } + +} + +func (abm *AddrsBookModel) rowCount(*qtcore.QModelIndex) int { + return len(abm.Contacts()) +} + +func (abm *AddrsBookModel) data(index *qtcore.QModelIndex, role int) *qtcore.QVariant { + logAddressBook.Info("Loading data for index") + if !index.IsValid() { + return qtcore.NewQVariant() + } + if index.Row() >= len(abm.Contacts()) { + return qtcore.NewQVariant() + } + contact := abm.Contacts()[index.Row()] + + switch role { + case Name: + { + return qtcore.NewQVariant1(contact.Name()) + } + case Address: + { + return qtcore.NewQVariant1(contact.Address()) + } + case ID: + { + return qtcore.NewQVariant1(contact.Id()) + } + default: + return qtcore.NewQVariant() + } +} + +func (abm *AddrsBookModel) roleNames() map[int]*qtcore.QByteArray { + return abm.Roles() +} + +func (abm *AddrsBookModel) columnCount(parent *qtcore.QModelIndex) int { + return 1 +} + +func (abm *AddrsBookModel) removeContact(row int, id uint64) { + logAddressBook.Infof("Remove contact with id %d", id) + if row < 0 || row >= abm.Count() { + return + } + if err := addrsBook.DeleteContact(id); err != nil { + logAddressBook.Error(err) + return + } + abm.BeginRemoveRows(qtcore.NewQModelIndex(), row, row) + abm.SetContacts(append(abm.Contacts()[:row], abm.Contacts()[row+1:]...)) + abm.EndRemoveRows() + abm.SetCount(abm.Count() - 1) + +} + +func (abm *AddrsBookModel) addContact(c *QContact) { + logAddressBook.Info("Add Contact") + var row = 0 + for row < len(abm.Contacts()) && c.Name() > abm.Contacts()[row].Name() { + row++ + } + abm.BeginInsertColumns(qtcore.NewQModelIndex(), row, row) + qml.QQmlEngine_SetObjectOwnership(c, qml.QQmlEngine__CppOwnership) + abm.SetContacts(append(append(abm.Contacts()[:row], c), abm.Contacts()[row:]...)) + abm.EndInsertRows() + abm.SetCount(abm.Count() + 1) +} + +func (abm *AddrsBookModel) editContact(row int, id uint64, name string) { + logAddressBook.Info("Edit contact") + if row < 0 || row >= abm.Count() { + return + } + qc := NewQContact(nil) + qc.SetName(name) + qa := fromAddressToQAddress(addresses) + am := NewAddrsBkAddressModel(nil) + am.SetAddress(qa) + qc.SetAddress(am) + qc.SetId(id) + var c = data.Contact{} + c.SetAddresses(addresses) + c.SetName(name) + if err := addrsBook.UpdateContact(id, &c); err != nil { + logAddressBook.Error(err) + return + } + abm.BeginRemoveRows(qtcore.NewQModelIndex(), row, row) + abm.SetContacts(append(abm.Contacts()[:row], abm.Contacts()[row+1:]...)) + abm.EndRemoveRows() + abm.SetCount(abm.Count() - 1) + abm.addContact(qc) + addresses = []core.StringAddress{} +} + +func getConfigFileDir() string { + qSettingDir := qtcore.NewQSettings(qtcore.QCoreApplication_OrganizationName(), qtcore.QCoreApplication_ApplicationName(), nil).FileName() + path, _ := filepath.Split(qSettingDir) + ok, err := file.Exists(path) + if err != nil { + logAddressBook.WithError(err).Warn("getting file dir") + } + if !ok { + if err := os.Mkdir(path, 0777); err != nil { + logAddressBook.WithError(err).Warn("getting file dir") + } + } + + fileDir := filepath.Join(path, "data.dt") + return fileDir +} + +func (abm *AddrsBookModel) loadContacts() { + logAddressBook.Info("loading contacts") + abm.SetContacts([]*QContact{}) + contacts, err := addrsBook.ListContact() + if err != nil { + logAddressBook.Error(err) + } + qContacts := fromContactToQContact(contacts) + + for _, c := range qContacts { + abm.addContact(c) + } +} + +func (abm *AddrsBookModel) getSecType() int { + secType, err := addrsBook.GetSecType() + if err != nil { + logAddressBook.Error(err) + } + return secType +} + +func (abm *AddrsBookModel) authenticate(password string) bool { + + if err := addrsBook.Authenticate(password); err != nil { + logAddressBook.Error(err) + return false + } + return true +} + +func (abm *AddrsBookModel) newContact(name string) { + qc := NewQContact(nil) + qc.SetName(name) + qa := fromAddressToQAddress(addresses) + am := NewAddrsBkAddressModel(nil) + am.SetAddress(qa) + qc.SetAddress(am) + var contact data.Contact + contact.SetName(name) + contact.SetAddresses(addresses) + if id, err := addrsBook.InsertContact(&contact); err != nil { + logAddressBook.Error(err) + } else { + qc.SetId(id) + } + addresses = []core.StringAddress{} + abm.addContact(qc) +} + +func (*AddrsBookModel) close() { + logAddressBook.Info("Closing address book") + if addrsBook.IsOpen() { + if err := addrsBook.Close(); err != nil { + logAddressBook.Error(err) + } + } +} + +func (abm *AddrsBookModel) initAddrsBook(secType int, password string) { + var err error + if addrsBook.HasInit() { + return + } + logAddressBook.Info("Creating address book") + if err = addrsBook.Init(secType, password); err != nil { + logAddressBook.Error(err) + } +} + +func (*AddrsBookModel) hasInit() bool { + return addrsBook.HasInit() +} + +func fromContactToQContact(contacts []core.Contact) []*QContact { + var qContacts = make([]*QContact, 0) + for _, c := range contacts { + qc := NewQContact(nil) + qc.SetName(c.GetName()) + logAddressBook.Info(c.GetID()) + qc.SetId(c.GetID()) + qAddressModel := NewAddrsBkAddressModel(nil) + qAddressModel.SetAddress(fromAddressToQAddress(c.GetAddresses())) + qc.SetAddress(qAddressModel) + qContacts = append(qContacts, qc) + } + return qContacts +} + +func (*AddrsBookModel) addAddress(value, coinType string) { + logAddressBook.Infof("%#v", addresses) + logAddressBook.Infof("value: %#v, type: %#v", value, coinType) + for e := range addresses { + if string(addresses[e].GetValue()) == value && string(addresses[e].GetCoinType()) == coinType { + return + } + } + addresses = append(addresses, &data.Address{Value: []byte(value), Coin: []byte(coinType)}) +} + +func (*AddrsBookModel) addressIsValid(value string) bool { + if _, err := skycoin.NewSkycoinAddress(value); err != nil { + return false + } + return true +} + +func (abm *AddrsBookModel) nameExist(row int, name string) bool { + for e := range abm.Contacts() { + if row != e && abm.Contacts()[e].Name() == name { + return true + } + } + return false +} + +func (abm *AddrsBookModel) addressExist(row int, address string, coinType string) bool { + for e := range abm.Contacts() { + for f := range abm.Contacts()[e].Address().Address() { + if row != e && abm.Contacts()[e].Address().Address()[f].Value() == address && + abm.Contacts()[e].Address().Address()[f].CoinType() == coinType { + return true + } + } + } + return false +} + +func (abm *AddrsBookModel) changeSecType(secType int, oldPassword string, newPassword string) bool { + if err := addrsBook.ChangeSecurity(secType, oldPassword, newPassword); err != nil { + logAddressBook.Error(err) + return false + } + return true +} diff --git a/src/models/addressesModel.go b/src/models/addressesModel.go index 44ba32ca..f56b5443 100644 --- a/src/models/addressesModel.go +++ b/src/models/addressesModel.go @@ -21,11 +21,11 @@ const ( type AddressesModel struct { core.QAbstractListModel - - _ func() `constructor:"init"` - - _ map[int]*core.QByteArray `property:"roles"` - _ []*QAddress `property:"addresses"` + receivChannel chan *updateAddressInfo + addressById map[string]*QAddress + _ func() `constructor:"init"` + _ map[int]*core.QByteArray `property:"roles"` + _ []*QAddress `property:"addresses"` _ func(*QAddress) `slot:"addAddress"` _ func([]*QAddress) `slot:"addAddresses"` @@ -35,6 +35,7 @@ type AddressesModel struct { _ func([]*QAddress) `slot:"loadModel"` _ int `property:"count"` _ func(string) `slot:"removeAddressesFromWallet"` + _ func(string) `slot:"suscribe"` } type QAddress struct { @@ -57,12 +58,12 @@ func (m *AddressesModel) init() { AWallet: core.NewQByteArray2("wallet", -1), AWalletId: core.NewQByteArray2("walletId", -1), }) + m.addressById = make(map[string]*QAddress, 0) qml.QQmlEngine_SetObjectOwnership(m, qml.QQmlEngine__CppOwnership) m.ConnectData(m.data) m.ConnectRowCount(m.rowCount) m.ConnectColumnCount(m.columnCount) m.ConnectRoleNames(m.roleNames) - m.ConnectAddAddress(m.addAddress) m.ConnectUpdateModel(m.updateModel) m.ConnectEditAddress(m.editAddress) @@ -70,10 +71,31 @@ func (m *AddressesModel) init() { m.ConnectLoadModel(m.loadModel) m.ConnectRemoveAddressesFromWallet(m.removeAddressesFromWallet) m.ConnectAddAddresses(m.addAddresses) + m.ConnectSuscribe(m.suscribe) m.SetCount(0) } +func (m *AddressesModel) suscribe(wltId string) { + m.receivChannel = walletManager.suscribeForAddresses(wltId) + go func() { + for { + addr := <-m.receivChannel + if addr.isNew { + m.AddAddress(addr.address) + } else { + oldAddr := m.addressById[addr.address.Address()] + updateBalanceValues(oldAddr, addr.address) + Helper.RunInMain(func() { + pIndex := m.Index(0, 0, core.NewQModelIndex()) + lIndex := m.Index(m.Count()-1, 0, core.NewQModelIndex()) + m.DataChanged(pIndex, lIndex, []int{ASky, ACoinHours}) + }) + } + } + }() +} + func (m *AddressesModel) removeAddressesFromWallet(wltId string) { old := m.Addresses() new := make([]*QAddress, 0) @@ -131,7 +153,7 @@ func (m *AddressesModel) data(index *core.QModelIndex, role int) *core.QVariant } func (m *AddressesModel) rowCount(parent *core.QModelIndex) int { - return len(m.Addresses()) + return m.Count() } func (m *AddressesModel) columnCount(parent *core.QModelIndex) int { @@ -143,11 +165,15 @@ func (m *AddressesModel) roleNames() map[int]*core.QByteArray { } func (m *AddressesModel) addAddress(address *QAddress) { - m.BeginInsertRows(core.NewQModelIndex(), len(m.Addresses()), len(m.Addresses())) - qml.QQmlEngine_SetObjectOwnership(address, qml.QQmlEngine__CppOwnership) - m.SetAddresses(append(m.Addresses(), address)) - m.EndInsertRows() - m.SetCount(m.Count() + 1) + m.addressById[address.Address()] = address + Helper.RunInMain(func() { + m.BeginInsertRows(core.NewQModelIndex(), len(m.Addresses()), len(m.Addresses())) + qml.QQmlEngine_SetObjectOwnership(address, qml.QQmlEngine__CppOwnership) + m.SetAddresses(append(m.Addresses(), address)) + m.EndInsertRows() + m.SetCount(m.Count() + 1) + }) + } func (m *AddressesModel) addAddresses(addresses []*QAddress) { @@ -157,10 +183,13 @@ func (m *AddressesModel) addAddresses(addresses []*QAddress) { } func (m *AddressesModel) removeAddress(row int) { - m.BeginRemoveRows(core.NewQModelIndex(), row, row) - m.SetAddresses(append(m.Addresses()[:row], m.Addresses()[row+1:]...)) - m.EndRemoveRows() - m.SetCount(m.Count() - 1) + Helper.RunInMain(func() { + m.BeginRemoveRows(core.NewQModelIndex(), row, row) + m.SetAddresses(append(m.Addresses()[:row], m.Addresses()[row+1:]...)) + m.EndRemoveRows() + m.SetCount(m.Count() - 1) + }) + } func (m *AddressesModel) editAddress(row int, address string, sky, coinHours uint64, marked int) { @@ -184,26 +213,26 @@ func (m *AddressesModel) editAddress(row int, address string, sky, coinHours uin } a.SetMarked(marked) pIndex := m.Index(row, 0, core.NewQModelIndex()) - if changeMarked { - m.DataChanged(pIndex, pIndex, []int{Address, ASky, ACoinHours, AMarked}) - } else { - m.DataChanged(pIndex, pIndex, []int{Address, ASky, ACoinHours}) - } + Helper.RunInMain(func() { + if changeMarked { + m.DataChanged(pIndex, pIndex, []int{Address, ASky, ACoinHours, AMarked}) + } else { + m.DataChanged(pIndex, pIndex, []int{Address, ASky, ACoinHours}) + } + }) } func (m *AddressesModel) updateModel(fileName string) { - wait := make(chan bool) go func() { - walletManager.updateAddresses(fileName) - wait <- true + m.LoadModel(walletManager.getAddresses(fileName)) }() - <- wait - go m.LoadModel(walletManager.getAddresses(fileName)) } func (m *AddressesModel) loadModel(Qaddresses []*QAddress) { for _, addr := range Qaddresses { + m.addressById[addr.Address()] = addr + addr.SetMarked(walletManager.markFieldOfAddress(addr.Address())) qml.QQmlEngine_SetObjectOwnership(addr, qml.QQmlEngine__CppOwnership) } addresses := make([]*QAddress, 0) @@ -216,10 +245,17 @@ func (m *AddressesModel) loadModel(Qaddresses []*QAddress) { addresses = append(addresses, address) addresses = append(addresses, Qaddresses...) - m.BeginResetModel() - m.SetAddresses(addresses) - m.SetCount(len(addresses)) + Helper.RunInMain(func() { + m.BeginResetModel() + m.SetAddresses(addresses) + m.SetCount(len(addresses)) + + m.EndResetModel() + }) - m.EndResetModel() +} +func updateBalanceValues(a, b *QAddress) { + a.SetAddressCoinHours(b.AddressCoinHours()) + a.SetAddressSky(b.AddressSky()) } diff --git a/src/models/blockchainModels.go b/src/models/blockchainModels.go index c6f8754b..f900223d 100644 --- a/src/models/blockchainModels.go +++ b/src/models/blockchainModels.go @@ -2,7 +2,6 @@ package models import ( "github.com/fibercrypto/fibercryptowallet/src/util/logging" - "strconv" "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/models" //callable as skycoin "github.com/fibercrypto/fibercryptowallet/src/core" @@ -106,15 +105,24 @@ func (blockchainStatus *BlockchainStatusModel) updateInfo() error { } // block details - blockchainStatus.SetNumberOfBlocks(strconv.FormatUint(numberOfBlocks, 10)) + blockchainStatus.SetNumberOfBlocks(util.FormatCoins(numberOfBlocks, 1)) blockchainStatus.SetTimestampLastBlock(qtcore.NewQDateTime3(qtcore.NewQDate3(year, month, day), qtcore.NewQTime3(h, m, s, 0), qtcore.Qt__LocalTime)) blockchainStatus.SetHashLastBlock(string(lastBlockHash)) - + // sky details - blockchainStatus.SetCurrentSkySupply(strconv.FormatUint(currentSkySupply, 10)) - blockchainStatus.SetTotalSkySupply(strconv.FormatUint(totalSkySupply, 10)) - blockchainStatus.SetCurrentCoinHoursSupply(strconv.FormatUint(currentCoinHoursSupply, 10)) - blockchainStatus.SetTotalCoinHoursSupply(strconv.FormatUint(totalCoinHoursSupply, 10)) + accuracy, err := util.AltcoinQuotient(skycoin.SkycoinTicker) + if err != nil { + logWalletsModel.WithError(err).Warn("Couldn't get " + skycoin.SkycoinTicker + " coins quotient") + } + blockchainStatus.SetCurrentSkySupply(util.FormatCoins(currentSkySupply, accuracy)) + blockchainStatus.SetTotalSkySupply(util.FormatCoins(totalSkySupply, accuracy)) + + accuracy, err = util.AltcoinQuotient(skycoin.CoinHoursTicker) + if err != nil { + logWalletsModel.WithError(err).Warn("Couldn't get " + skycoin.CoinHoursTicker + " coins quotient") + } + blockchainStatus.SetCurrentCoinHoursSupply(util.FormatCoins(currentCoinHoursSupply, accuracy)) + blockchainStatus.SetTotalCoinHoursSupply(util.FormatCoins(totalCoinHoursSupply, accuracy)) blockchainStatus.SetLoading(false) return nil diff --git a/src/models/bridgeModel.go b/src/models/bridgeModel.go index 3a2823df..234cb1b5 100644 --- a/src/models/bridgeModel.go +++ b/src/models/bridgeModel.go @@ -1,6 +1,7 @@ package models import ( + "github.com/fibercrypto/skywallet-go/src/skywallet" "sync" "github.com/therecipe/qt/core" @@ -8,27 +9,39 @@ import ( type QBridge struct { core.QObject - _ func() `constructor:"init"` - _ func() `slot:"lock"` - _ func() `slot:"unlock"` - _ func(message string) `signal:"getPassword"` - _ func(string) `slot:"setResult"` - _ func() string `slot:"getResult"` + _ func() `constructor:"init"` + _ func() `slot:"onCompleted"` + _ func() `slot:"lock"` + _ func() `slot:"unlock"` + _ func(message string) `signal:"getPassword"` + _ func(title, message string) `signal:"getBip39Word"` + _ func(title, message string) `signal:"getSkyHardwareWalletPin"` + _ func(title, message string) `signal:"deviceRequireAction"` + _ func(title, message string) `signal:"deviceRequireCancelableAction"` + _ func(title, message string) `signal:"deviceRequireConfirmableAction"` + _ func(string) `slot:"setResult"` + _ func() string `slot:"getResult"` + _ string `property:"errMessage"` result string sem sync.Mutex use sync.Mutex } func (b *QBridge) init() { - b.ConnectLock(b.lock) b.ConnectUnlock(b.unlock) b.ConnectSetResult(b.setResult) b.ConnectGetResult(b.getResult) + b.ConnectOnCompleted(b.onCompleted) +} + +func (b *QBridge) onCompleted() { + createSkyHardwareWallet(b) } func (b *QBridge) BeginUse() { b.use.Lock() + b.SetErrMessage("") } func (b *QBridge) EndUse() { @@ -37,7 +50,6 @@ func (b *QBridge) EndUse() { func (b *QBridge) lock() { b.sem.Lock() - } func (b *QBridge) setResult(result string) { @@ -48,6 +60,14 @@ func (b *QBridge) getResult() string { return b.result } +func (b *QBridge) getOptionalResult() (string, error) { + if len(b.ErrMessage()) > 0 { + logWalletsModel.Warningln(b.ErrMessage()) + return "", skywallet.ErrUserCancelledFromInputReader + } + return b.result, nil +} + func (b *QBridge) unlock() { b.sem.Unlock() } diff --git a/src/models/config.go b/src/models/config.go index 54c14937..b89ee1d6 100644 --- a/src/models/config.go +++ b/src/models/config.go @@ -6,11 +6,13 @@ import ( local "github.com/fibercrypto/fibercryptowallet/src/main" - "github.com/therecipe/qt/qml" - + "github.com/fibercrypto/fibercryptowallet/src/util/logging" qtcore "github.com/therecipe/qt/core" + "github.com/therecipe/qt/qml" ) +var log = logging.MustGetLogger("Config Model") + type ConfigManager struct { qtcore.QObject configManager *local.ConfigManager @@ -75,6 +77,8 @@ func (cm *ConfigManager) getDefaultValue(path string) string { return cm.GetSection(section).getDefaultValue(optName, optPath, name) } +//TODO: Exported type ConfigSection should have comment or be unexported (linter suggestion) +// ConfigSection type ConfigSection struct { qtcore.QObject sm *local.SectionManager @@ -96,7 +100,7 @@ func (cs *ConfigSection) getPaths() [][]string { func (cs *ConfigSection) getOptions(path []string) []*KeyValueStorage { opts, err := cs.sm.GetValues(path) if err != nil { - //log error + log.WithError(err).Warn("Couldn't get values from options") return nil } @@ -115,7 +119,7 @@ func (cs *ConfigSection) getOptions(path []string) []*KeyValueStorage { func (cs *ConfigSection) getOption(name string, path []string) *KeyValueStorage { opt, err := cs.sm.GetValue(name, path) if err != nil { - //log error + log.WithError(err).Warn("Couldn't get value %s from saved settings", name) return nil } @@ -129,24 +133,34 @@ func (cs *ConfigSection) getOption(name string, path []string) *KeyValueStorage func (cs *ConfigSection) saveOptionValue(opt string, path []string, name string, value string) { optV := cs.getOption(opt, path) if optV == nil { - //log error + log.Warn("Couldn't get option %s from saved settings when saving its new value", opt) return } optV.setValue(name, value) data, err := json.Marshal(optV.keyValues) if err != nil { - //log error + log.WithError(err).Error("Couldn't marshal values") return } cs.sm.Save(opt, path, string(data)) + if opt == "log" { + if name == "level" { + level, err := logging.LevelFromEnum(value) + if err != nil { + log.WithError(err).Warn("%s is not a correct log level", value) + } else { + logging.SetLevel(level) + } + } + } } func (cs *ConfigSection) getValue(opt string, path []string, name string) string { optV := cs.getOption(opt, path) if optV == nil { - //log error + log.Warn("Couldn't get value %s from saved settings", opt) return "" } return optV.getValue(name) @@ -161,6 +175,8 @@ func (cs *ConfigSection) getDefaultValue(opt string, path []string, name string) return val } +//TODO: Exported type KeyValueStorage should have comment or be unexported (linter suggestion) +// KeyValueStorage type KeyValueStorage struct { qtcore.QObject _ func() []string `slot:"getKeys"` @@ -192,7 +208,7 @@ func (kv *KeyValueStorage) getKeys() []string { func (kv *KeyValueStorage) getValue(key string) string { val, ok := kv.keyValues[key] if !ok { - //log error + log.Warn("Incorrect key %s", key) return "" } return val diff --git a/src/models/device_interaction.go b/src/models/device_interaction.go new file mode 100644 index 00000000..91175bbb --- /dev/null +++ b/src/models/device_interaction.go @@ -0,0 +1,201 @@ +package models + +import ( + "crypto/sha256" + hardware "github.com/fibercrypto/fibercryptowallet/src/contrib/hardware-wallet/skywallet" + "github.com/fibercrypto/skywallet-go/src/skywallet" + messages "github.com/fibercrypto/skywallet-protob/go" + "github.com/therecipe/qt/core" + "github.com/therecipe/qt/qml" + "io/ioutil" + "strings" +) + +type QDeviceInteraction struct { + core.QObject + _ func() `constructor:"init"` + _ func() `slot:"wipeDevice"` + _ func() `slot:"backupDevice"` + _ func() `slot:"changePin"` + _ func() `slot:"deviceFeatures"` + _ func(uint, bool) `slot:"generateMnemonic"` + _ func(uint, bool) `slot:"restoreBackup"` + _ func(string) `slot:"changeDeviceName"` + _ func() `slot:"cancelCommand"` + _ func(file string) `slot:"firmwareUpload"` + _ func() `slot:"deviceInteractionWasWarn"` + _ func() `slot:"initializeWasWarn"` + _ func() `slot:"secureWasWarn"` + _ func(hasPin bool) `signal:"hasPinDetermined"` + _ func(name string) `signal:"nameDetermined"` + _ func(isInitialized bool) `signal:"isInitializedDetermined"` + _ func(needsBackup bool) `signal:"needsBackupDetermined"` + _ func(bootloader bool) `signal:"bootModeDetermined"` + _ func() `signal:"operationDone"` + _ func() `signal:"secureDevice"` + _ func() `signal:"initializeDevice"` + _ func() `signal:"openInteractionDialog"` +} + +func (devI *QDeviceInteraction) init() { + logWalletsModel.Info("Initialize Qt device interaction") + qml.QQmlEngine_SetObjectOwnership(devI, qml.QQmlEngine__CppOwnership) + devI.ConnectWipeDevice(devI.wipeDevice) + devI.ConnectChangePin(devI.changePin) + devI.ConnectDeviceFeatures(devI.deviceFeatures) + devI.ConnectBackupDevice(devI.backupDevice) + devI.ConnectCancelCommand(devI.cancelCommand) + devI.ConnectFirmwareUpload(devI.firmwareUpload) + devI.ConnectGenerateMnemonic(devI.generateMnemonic) + devI.ConnectRestoreBackup(devI.restoreBackup) + devI.ConnectChangeDeviceName(devI.changeDeviceName) + devI.ConnectDeviceInteractionWasWarn(devI.deviceInteractionWasWarn) + devI.ConnectInitializeWasWarn(devI.initializeWasWarn) + devI.ConnectSecureWasWarn(devI.secureWasWarn) +} + +func (devI *QDeviceInteraction) wipeDevice() { + dev := hardware.SkyWltInteractionInstance() + dev.Wipe().Then(func(data interface{}) interface{} { + logWalletsModel.Infoln(data.(string)) + devI.OperationDone() + return data + }).Catch(func(err error) error { + logWalletsModel.WithError(err).Errorln("unable to wipe device") + devI.OperationDone() + return err + }) +} + +func (devI *QDeviceInteraction) backupDevice() { + dev := hardware.SkyWltInteractionInstance() + dev.Backup().Then(func(data interface{}) interface{} { + devI.OperationDone() + return data + }).Catch(func(err error) error { + devI.OperationDone() + return err + }) +} + +func (devI *QDeviceInteraction) changePin() { + dev := hardware.SkyWltInteractionInstance() + rm := false + dev.ChangePin(&rm).Then(func(data interface{}) interface{} { + logWalletsModel.Infoln(data.(string)) + devI.OperationDone() + return data + }).Catch(func(err error) error { + if err == skywallet.ErrUserCancelledFromInputReader { + logWalletsModel.WithError(err).Infoln("unable to change pin") + } else if err == skywallet.ErrUserCancelledWithDeviceButton { + logWalletsModel.WithError(err).Warningln("unable to change pin") + } else { + logWalletsModel.WithError(err).Errorln("unable to change pin") + } + devI.OperationDone() + return err + }) +} + +func (devI* QDeviceInteraction) cancelCommand() { + dev := hardware.SkyWltInteractionInstance() + dev.Cancel().Then(func(data interface{}) interface{} { + logWalletsModel.Infoln(data.(string)) + return data + }).Catch(func(err error) error { + logWalletsModel.WithError(err).Errorln("unable to cancel operation") + return err + }) +} + +func (devI *QDeviceInteraction) deviceFeatures() { + dev := hardware.SkyWltInteractionInstance() + dev.Features().Then(func(data interface{}) interface{} { + features := data.(messages.Features) + if features.Label != nil { + devI.NameDetermined(*features.Label) + } + devI.HasPinDetermined(features.PinProtection != nil && *features.PinProtection) + devI.NeedsBackupDetermined(features.NeedsBackup != nil && *features.NeedsBackup) + devI.IsInitializedDetermined(features.Initialized != nil && *features.Initialized) + devI.BootModeDetermined(features.BootloaderMode != nil && *features.BootloaderMode) + return data + }).Catch(func(err error) error { + return err + }) +} + +func (devI *QDeviceInteraction) generateMnemonic(wordCount uint, usePassphrase bool) { + dev := hardware.SkyWltInteractionInstance() + dev.GenerateMnemonic(uint32(wordCount), usePassphrase).Then(func(data interface{}) interface{} { + logWalletsModel.Infoln(data) + devI.OperationDone() + return data + }).Catch(func(err error) error { + devI.OperationDone() + logWalletsModel.WithError(err).Errorln("unable to generate mnemonic") + return err + }) +} + +func (devI *QDeviceInteraction) restoreBackup(wordCount uint, usePassphrase bool) { + dev := hardware.SkyWltInteractionInstance() + dev.Recovery(uint32(wordCount), &usePassphrase, false).Then(func(data interface{}) interface{} { + logWalletsModel.Infoln(data) + devI.OperationDone() + return data + }).Catch(func(err error) error { + logWalletsModel.WithError(err).Errorln("unable to recover device with you seed") + devI.OperationDone() + return err + }) +} + +func (devI *QDeviceInteraction) firmwareUpload(filePath string) { + // FIXME portability + prefix := "file://" + if strings.HasPrefix(filePath, prefix) { + filePath = strings.TrimPrefix(filePath, prefix) + } + firmware, err := ioutil.ReadFile(filePath) + if err != nil { + // FIXME inform the end user + logWalletsModel.WithError(err).Errorln("unable to upload firmware to device") + return + } + dev := hardware.SkyWltInteractionInstance() + dev.UploadFirmware(firmware, sha256.Sum256(firmware[0x100:])).Then(func(data interface{}) interface{} { + devI.OperationDone() + return data + }).Catch(func(err error) error { + devI.OperationDone() + return err + }) +} + +func (devI *QDeviceInteraction) changeDeviceName(label string) { + dev := hardware.SkyWltInteractionInstance() + dev.ApplySettings(nil, label, "").Then(func(data interface{}) interface{} { + devI.OperationDone() + return data + }).Catch(func(err error) error { + devI.OperationDone() + return err + }) +} + +func (devI *QDeviceInteraction) deviceInteractionWasWarn() { + dev := hardware.SkyWltInteractionInstance() + dev.SetUploadFirmwareWasWarn() +} + +func (devI *QDeviceInteraction) initializeWasWarn() { + dev := hardware.SkyWltInteractionInstance() + dev.SetInitializeWasWarn() +} + +func (devI *QDeviceInteraction) secureWasWarn() { + dev := hardware.SkyWltInteractionInstance() + dev.SetSecureWasWarn() +} diff --git a/src/models/history/history.go b/src/models/history/history.go index bf3fd470..e84c1683 100644 --- a/src/models/history/history.go +++ b/src/models/history/history.go @@ -11,8 +11,14 @@ func init() { } +type Filter struct { + Activated bool + SelectedWallets []string +} + type TransactionList struct { core.QAbstractListModel + filterSelected Filter _ map[int]*core.QByteArray `property:"roles"` @@ -130,8 +136,19 @@ func (hm *TransactionList) data(index *core.QModelIndex, role int) *core.QVarian func (hm *TransactionList) addMultipleTransactions(txns []*transactions.TransactionDetails) { for _, txn := range txns { - hm.addTransaction(txn) + if !hm.txnContained(txn) { + hm.addTransaction(txn) + } + } +} + +func (hm *TransactionList) txnContained(txn *transactions.TransactionDetails) bool { + for _, txnStored := range hm.Transactions() { + if txn.TransactionID() == txnStored.TransactionID() { + return true + } } + return false } func (hm *TransactionList) clear() { diff --git a/src/models/history/historyManager.go b/src/models/history/historyManager.go index f232846c..23b0d5f4 100644 --- a/src/models/history/historyManager.go +++ b/src/models/history/historyManager.go @@ -1,25 +1,30 @@ package history import ( - "sort" - "strconv" "time" "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/params" - "github.com/fibercrypto/fibercryptowallet/src/util/logging" + "github.com/therecipe/qt/qml" + + "sync" coin "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/models" "github.com/fibercrypto/fibercryptowallet/src/core" + "github.com/fibercrypto/fibercryptowallet/src/util/logging" - //local "github.com/fibercrypto/fibercryptowallet/src/main" "github.com/fibercrypto/fibercryptowallet/src/models" "github.com/fibercrypto/fibercryptowallet/src/models/address" "github.com/fibercrypto/fibercryptowallet/src/models/transactions" + "github.com/fibercrypto/fibercryptowallet/src/util" + qtCore "github.com/therecipe/qt/core" ) -var logHistoryManager = logging.MustGetLogger("modelsHistoryManager") +var ( + logHistoryManager = logging.MustGetLogger("modelsHistoryManager") + historyManager *HistoryManager +) const ( dateTimeFormatForGo = "2006-01-02T15:04:05" @@ -32,23 +37,65 @@ const ( */ type HistoryManager struct { qtCore.QObject - filters []string - _ func() `constructor:"init"` - - _ func() []*transactions.TransactionDetails `slot:"loadHistoryWithFilters"` - _ func() []*transactions.TransactionDetails `slot:"loadHistory"` - _ func(string) `slot:"addFilter"` - _ func(string) `slot:"removeFilter"` - walletEnv core.WalletEnv + walletEnv core.WalletEnv + newTxn map[string][]core.Transaction + txnFinded map[string]struct{} + filters []string + txnForAddresses map[string][]core.Transaction + mutexForNew sync.Mutex + mutexForAll sync.Mutex + mutexForUpdate sync.Mutex + addresses map[string]string + walletsIterator core.WalletIterator + end chan bool + _ func() `constructor:"init"` + _ func() `signal:"newTransactions"` + _ func() []*transactions.TransactionDetails `slot:"getTransactions"` + _ func() []*transactions.TransactionDetails `slot:"getTransactionsWithFilters"` + _ func() []*transactions.TransactionDetails `slot:"getNewTransactions"` + _ func() []*transactions.TransactionDetails `slot:"getNewTransactionsWithFilters"` + _ func(string) `slot:"addFilter"` + _ func(string) `slot:"removeFilter"` + _ func() `slot:"update"` } func (hm *HistoryManager) init() { - hm.ConnectLoadHistoryWithFilters(hm.loadHistoryWithFilters) - hm.ConnectLoadHistory(hm.loadHistory) + hm.ConnectGetTransactions(hm.getTransactions) + hm.ConnectGetTransactionsWithFilters(hm.getTransansactionsWithFilters) + hm.ConnectGetNewTransactions(hm.getNewTransactions) + hm.ConnectGetNewTransactionsWithFilters(hm.getNewTransactionsWithFilters) hm.ConnectAddFilter(hm.addFilter) hm.ConnectRemoveFilter(hm.removeFilter) + hm.ConnectUpdate(hm.updateTxns) hm.walletEnv = models.GetWalletEnv() + hm.txnForAddresses = make(map[string][]core.Transaction, 0) + hm.newTxn = make(map[string][]core.Transaction, 0) + uptimeTicker := time.NewTicker(10 * time.Second) + historyManager = hm + hm.txnFinded = make(map[string]struct{}, 0) + go func() { + for { + select { + case <-uptimeTicker.C: + logHistoryManager.Debug("Updating history") + hm.mutexForUpdate.Lock() + go hm.updateTxns() + } + historyManager = hm + } + }() +} + +func (hm *HistoryManager) reviewForNew() { + hm.mutexForNew.Lock() + defer hm.mutexForNew.Unlock() + for _, txns := range hm.newTxn { + for _, _ = range txns { + hm.NewTransactions() + return + } + } } type ByDate []*transactions.TransactionDetails @@ -65,291 +112,191 @@ func (a ByDate) Less(i, j int) bool { d2, _ := time.Parse(dateTimeFormatForGo, a[j].Date().ToString(dateTimeFormatForQML)) return d1.After(d2) } -func (hm *HistoryManager) getTransactionsOfAddresses(filterAddresses []string) []*transactions.TransactionDetails { - logHistoryManager.Info("Getting transactions of Addresses") - addresses := hm.getAddressesWithWallets() - var sent, internally bool - var traspassedHoursIn, traspassedHoursOut, skyAmountIn, skyAmountOut uint64 - - find := make(map[string]struct{}, len(filterAddresses)) - for _, addr := range filterAddresses { - find[addr] = struct{}{} - } - txnFind := make(map[string]struct{}) - txns := make([]core.Transaction, 0) +func (hm *HistoryManager) updateTxns() { + defer hm.mutexForUpdate.Unlock() + logHistoryManager.Info("Getting transactions of Addresses") + hm.addresses = hm.getAddressesWithWallets() wltIterator := hm.walletEnv.GetWalletSet().ListWallets() if wltIterator == nil { logHistoryManager.WithError(nil).Warn("Couldn't get transactions of Addresses") - return make([]*transactions.TransactionDetails, 0) + return } for wltIterator.Next() { + logHistoryManager.Debug("Getting addresses history for wallet ", wltIterator.Value().GetId()) addressIterator, err := wltIterator.Value().GetLoadedAddresses() if err != nil { logHistoryManager.Warn("Couldn't get address iterator") continue } - for addressIterator.Next() { - _, ok := find[addressIterator.Value().String()] - if ok { - txnsIterator := addressIterator.Value().GetCryptoAccount().ListTransactions() - if txnsIterator == nil { - logHistoryManager.Warn("Couldn't get transaction iterator") - continue - } - for txnsIterator.Next() { - _, ok2 := txnFind[txnsIterator.Value().GetId()] - if !ok2 { - txns = append(txns, txnsIterator.Value()) - txnFind[txnsIterator.Value().GetId()] = struct{}{} - } - } - } - - } - } - txnsDetails := make([]*transactions.TransactionDetails, 0) - for _, txn := range txns { - traspassedHoursIn = 0 - traspassedHoursOut = 0 - skyAmountIn = 0 - skyAmountOut = 0 - internally = true - sent = false - txnDetails := transactions.NewTransactionDetails(nil) - txnAddresses := address.NewAddressList(nil) - inAddresses := make(map[string]struct{}, 0) - inputs := address.NewAddressList(nil) - outputs := address.NewAddressList(nil) - txnIns := txn.GetInputs() - - for _, in := range txnIns { - qIn := address.NewAddressDetails(nil) - qIn.SetAddress(in.GetSpentOutput().GetAddress().String()) - skyUint64, err := in.GetCoins(params.SkycoinTicker) - if err != nil { - logHistoryManager.WithError(err).Warn("Couldn't get Skycoins balance") - continue - } - accuracy, err := util.AltcoinQuotient(params.SkycoinTicker) - if err != nil { - logHistoryManager.WithError(err).Warn("Couldn't get Skycoins quotient") - continue - } - skyFloat := float64(skyUint64) / float64(accuracy) - qIn.SetAddressSky(strconv.FormatFloat(skyFloat, 'f', -1, 64)) - chUint64, err := in.GetCoins(params.CoinHoursTicker) - if err != nil { - logHistoryManager.WithError(err).Warn("Couldn't get Coin Hours balance") - continue - } - accuracy, err = util.AltcoinQuotient(params.CoinHoursTicker) - if err != nil { - logHistoryManager.WithError(err).Warn("Couldn't get Coin Hours quotient") - continue - } - qIn.SetAddressCoinHours(strconv.FormatUint(chUint64/accuracy, 10)) - inputs.AddAddress(qIn) - _, ok := addresses[in.GetSpentOutput().GetAddress().String()] - if ok { - skyAmountOut += skyUint64 - sent = true - _, ok := inAddresses[qIn.Address()] - if !ok { - txnAddresses.AddAddress(qIn) - inAddresses[qIn.Address()] = struct{}{} - } - - } - } - txnDetails.SetInputs(inputs) - - for _, out := range txn.GetOutputs() { - sky, err := out.GetCoins(params.SkycoinTicker) - if err != nil { - logHistoryManager.WithError(err).Warn("Couldn't get Skycoins balance") - continue - } - qOu := address.NewAddressDetails(nil) - qOu.SetAddress(out.GetAddress().String()) - accuracy, err := util.AltcoinQuotient(params.SkycoinTicker) - if err != nil { - logHistoryManager.WithError(err).Warn("Couldn't get Skycoins quotient") - continue - } - qOu.SetAddressSky(util.FormatCoins(sky, accuracy)) - val, err := out.GetCoins(params.CoinHoursTicker) - if err != nil { - logHistoryManager.WithError(err).Warn("Couldn't get Coin Hours balance") - continue - } - accuracy, err = util.AltcoinQuotient(coin.CoinHour) - if err != nil { - logHistoryManager.WithError(err).Warn("Couldn't get Coin Hours quotient") + for addressIterator.Next() { + txnsIterator := addressIterator.Value().GetCryptoAccount().ListTransactions() + if txnsIterator == nil { + logHistoryManager.Warn("Couldn't get transaction iterator") continue } - qOu.SetAddressCoinHours(util.FormatCoins(val, accuracy)) - outputs.AddAddress(qOu) - if sent { - - if addresses[txn.GetInputs()[0].GetSpentOutput().GetAddress().String()] == addresses[out.GetAddress().String()] { - skyAmountOut -= sky - - } else { - internally = false - val, err = out.GetCoins(params.CoinHoursTicker) - if err != nil { - logHistoryManager.WithError(err).Warn("Couldn't get Coin Hours send it") - continue + for txnsIterator.Next() { + corrupted := false + if _, exist := hm.txnFinded[txnsIterator.Value().GetId()]; !exist { + for _, in := range txnsIterator.Value().GetInputs() { + out, err := in.GetSpentOutput() + if err != nil { + corrupted = true + break + } + outAddr, err := out.GetAddress() + if err != nil { + corrupted = true + break + } + if _, exist := hm.addresses[outAddr.String()]; exist { + hm.mutexForNew.Lock() + _, exist2 := hm.newTxn[outAddr.String()] + if exist2 { + hm.newTxn[outAddr.String()] = append(hm.newTxn[outAddr.String()], txnsIterator.Value()) + } else { + hm.newTxn[outAddr.String()] = []core.Transaction{txnsIterator.Value()} + } + hm.mutexForNew.Unlock() + } } - traspassedHoursOut += val - } - } else { - _, ok := find[out.GetAddress().String()] - if ok { - val, err = out.GetCoins(params.CoinHoursTicker) - if err != nil { - logHistoryManager.WithError(err).Warn("Couldn't get Coin Hours balance") + if corrupted { continue } - traspassedHoursIn += val - skyAmountIn += sky - - _, ok := inAddresses[qOu.Address()] - if !ok { - txnAddresses.AddAddress(qOu) - inAddresses[qOu.Address()] = struct{}{} + for _, out := range txnsIterator.Value().GetOutputs() { + outAddr, err := out.GetAddress() + if err != nil { + logHistoryManager.WithError(err).Warn("Couldn't get address") + corrupted = true + break + } + if _, exist := hm.addresses[outAddr.String()]; exist { + hm.mutexForNew.Lock() + _, exist2 := hm.newTxn[outAddr.String()] + if exist2 { + hm.newTxn[outAddr.String()] = append(hm.newTxn[outAddr.String()], txnsIterator.Value()) + } else { + hm.newTxn[outAddr.String()] = []core.Transaction{txnsIterator.Value()} + } + hm.mutexForNew.Unlock() + } } - + if corrupted { + continue + } + hm.NewTransactions() + hm.txnFinded[txnsIterator.Value().GetId()] = struct{}{} } - } } - txnDetails.SetOutputs(outputs) - t := time.Unix(int64(txn.GetTimestamp()), 0) - txnDetails.SetDate(qtCore.NewQDateTime3(qtCore.NewQDate3(t.Year(), int(t.Month()), t.Day()), qtCore.NewQTime3(t.Hour(), t.Minute(), 0, 0), qtCore.Qt__LocalTime)) - txnDetails.SetStatus(transactions.TransactionStatusPending) + } +} - if txn.GetStatus() == core.TXN_STATUS_CONFIRMED { - txnDetails.SetStatus(transactions.TransactionStatusConfirmed) - } - txnDetails.SetType(transactions.TransactionTypeReceive) - if sent { - txnDetails.SetType(transactions.TransactionTypeSend) - if internally { - txnDetails.SetType(transactions.TransactionTypeInternal) - } - } - fee, err := txn.ComputeFee(params.CoinHoursTicker) - if err != nil { - logHistoryManager.WithError(err).Warn("Couldn't compute fee of the operation") - continue - } - txnDetails.SetHoursBurned(strconv.FormatUint(fee, 10)) - - switch txnDetails.Type() { - case transactions.TransactionTypeReceive: - { - txnDetails.SetHoursTraspassed(strconv.FormatUint(traspassedHoursIn, 10)) - val := float64(skyAmountIn) - accuracy, err := util.AltcoinQuotient(params.SkycoinTicker) +func (hm *HistoryManager) getTransactions() []*transactions.TransactionDetails { + hm.mutexForAll.Lock() + + txnsForReturn := make([]*transactions.TransactionDetails, 0) + added := make(map[string]struct{}, 0) + for _, txns := range hm.txnForAddresses { + for _, txn := range txns { + if _, exist := added[txn.GetId()]; !exist { + txnDetail, err := TransactionDetailsFromCoreTxn(txn, hm.addresses) if err != nil { - logHistoryManager.WithError(err).Warn("Couldn't get Skycoins quotient") - continue + logHistoryManager.WithError(err).Warn("Couldn't convert transaction") } - val = val / float64(accuracy) - txnDetails.SetAmount(strconv.FormatFloat(val, 'f', -1, 64)) - + txnsForReturn = append(txnsForReturn, txnDetail) + added[txn.GetId()] = struct{}{} } - case transactions.TransactionTypeInternal: - { - var traspassedHoursMoved, skyAmountMoved uint64 - traspassedHoursMoved = 0 - skyAmountMoved = 0 - ins := inputs.Addresses() - inFind := make(map[string]struct{}, len(ins)) - for _, addr := range ins { - inFind[addr.Address()] = struct{}{} - } - outs := outputs.Addresses() - for _, addr := range outs { - _, ok := inFind[addr.Address()] - if !ok { - hours, err := strconv.ParseUint(addr.AddressCoinHours(), 10, 64) - if err != nil { - logHistoryManager.WithError(err).Warn("Couldn't parse Coin Hours from address") - continue - } - traspassedHoursMoved += hours - skyFloat, err := strconv.ParseFloat(addr.AddressSky(), 64) - if err != nil { - logHistoryManager.WithError(err).Warn("Couldn't parse Skycoins from addresses") - continue - } - accuracy, err := util.AltcoinQuotient(params.SkycoinTicker) - if err != nil { - logHistoryManager.WithError(err).Warn("Couldn't get Skycoins quotient") - continue - } - sky := uint64(skyFloat * float64(accuracy)) - skyAmountMoved += sky - } + } + } + hm.mutexForAll.Unlock() + newTxns := hm.getNewTransactions() + txnsForReturn = append(txnsForReturn, newTxns...) + return txnsForReturn +} - } - txnDetails.SetHoursTraspassed(strconv.FormatUint(traspassedHoursMoved, 10)) - val := float64(skyAmountMoved) - accuracy, _ := util.AltcoinQuotient(params.SkycoinTicker) - if err != nil { - logHistoryManager.WithError(err).Warn("Couldn't get Skycoins quotient") - continue - } - val = val / float64(accuracy) - txnDetails.SetAmount(strconv.FormatFloat(val, 'f', -1, 64)) +func (hm *HistoryManager) getTransansactionsWithFilters() []*transactions.TransactionDetails { + hm.mutexForAll.Lock() - } - case transactions.TransactionTypeSend: - { - txnDetails.SetHoursTraspassed(strconv.FormatUint(traspassedHoursOut, 10)) - val := float64(skyAmountOut) - accuracy, err := util.AltcoinQuotient(params.SkycoinTicker) + txnsForReturn := make([]*transactions.TransactionDetails, 0) + added := make(map[string]struct{}, 0) + for _, addr := range hm.filters { + for _, txn := range hm.txnForAddresses[addr] { + if _, exist := added[txn.GetId()]; !exist { + txnDetail, err := TransactionDetailsFromCoreTxn(txn, hm.addresses) if err != nil { - logHistoryManager.WithError(err).Warn("Couldn't get Skycoins quotient") - continue + logHistoryManager.WithError(err).Warn("Couldn't convert transaction") } - val = val / float64(accuracy) - txnDetails.SetAmount(strconv.FormatFloat(val, 'f', -1, 64)) - + txnsForReturn = append(txnsForReturn, txnDetail) + added[txn.GetId()] = struct{}{} } } - txnDetails.SetAddresses(txnAddresses) - txnDetails.SetTransactionID(txn.GetId()) - - txnsDetails = append(txnsDetails, txnDetails) - } - sort.Sort(ByDate(txnsDetails)) - return txnsDetails + defer hm.mutexForAll.Unlock() + newTxns := hm.getNewTransactionsWithFilters() + txnsForReturn = append(txnsForReturn, newTxns...) + return txnsForReturn } -func (hm *HistoryManager) loadHistoryWithFilters() []*transactions.TransactionDetails { - logHistoryManager.Info("Loading history with some filters") - filterAddresses := hm.filters - return hm.getTransactionsOfAddresses(filterAddresses) +func (hm *HistoryManager) getNewTransactions() []*transactions.TransactionDetails { + hm.mutexForNew.Lock() + defer hm.mutexForNew.Unlock() + txnsForReturn := make([]*transactions.TransactionDetails, 0) + added := make(map[string]struct{}, 0) + for addr, _ := range hm.newTxn { + for _, txn := range hm.newTxn[addr] { + if _, exist := added[txn.GetId()]; !exist { + txnDetail, err := TransactionDetailsFromCoreTxn(txn, hm.addresses) + if err != nil { + logHistoryManager.WithError(err).Warn("Couldn't convert transaction") + } + added[txn.GetId()] = struct{}{} + txnsForReturn = append(txnsForReturn, txnDetail) + } + hm.mutexForAll.Lock() + _, exist := hm.txnForAddresses[addr] + if exist { + hm.txnForAddresses[addr] = append(hm.txnForAddresses[addr], txn) + } else { + hm.txnForAddresses[addr] = []core.Transaction{txn} + } + hm.mutexForAll.Unlock() + } + hm.newTxn[addr] = make([]core.Transaction, 0) + } + return txnsForReturn } -func (hm *HistoryManager) loadHistory() []*transactions.TransactionDetails { - logHistoryManager.Info("Loading history") - addresses := hm.getAddressesWithWallets() +func (hm *HistoryManager) getNewTransactionsWithFilters() []*transactions.TransactionDetails { + hm.mutexForNew.Lock() + defer hm.mutexForNew.Unlock() + txnsForReturn := make([]*transactions.TransactionDetails, 0) + added := make(map[string]struct{}, 0) + for _, addr := range hm.filters { + for _, txn := range hm.newTxn[addr] { + if _, exist := added[txn.GetId()]; !exist { + txnDetail, err := TransactionDetailsFromCoreTxn(txn, hm.addresses) + if err != nil { + logHistoryManager.WithError(err).Warn("Couldn't convert transaction") + } + txnsForReturn = append(txnsForReturn, txnDetail) + added[txn.GetId()] = struct{}{} + } - filterAddresses := make([]string, 0) - for addr, _ := range addresses { - filterAddresses = append(filterAddresses, addr) + hm.mutexForAll.Lock() + _, exist := hm.txnForAddresses[addr] + if exist { + hm.txnForAddresses[addr] = append(hm.txnForAddresses[addr], txn) + } else { + hm.txnForAddresses[addr] = []core.Transaction{txn} + } + hm.mutexForAll.Unlock() + } + hm.newTxn[addr] = make([]core.Transaction, 0) } - - return hm.getTransactionsOfAddresses(filterAddresses) - + return txnsForReturn } func (hm *HistoryManager) addFilter(addr string) { @@ -364,7 +311,6 @@ func (hm *HistoryManager) addFilter(addr string) { if !alreadyIs { hm.filters = append(hm.filters, addr) } - } func (hm *HistoryManager) removeFilter(addr string) { @@ -376,7 +322,6 @@ func (hm *HistoryManager) removeFilter(addr string) { break } } - } func (hm *HistoryManager) getAddressesWithWallets() map[string]string { logHistoryManager.Info("Get Addresses with wallets") @@ -384,7 +329,7 @@ func (hm *HistoryManager) getAddressesWithWallets() map[string]string { it := hm.walletEnv.GetWalletSet().ListWallets() if it == nil { logHistoryManager.WithError(nil).Warn("Couldn't load addresses") - return response + return nil } for it.Next() { wlt := it.Value() @@ -398,6 +343,264 @@ func (hm *HistoryManager) getAddressesWithWallets() map[string]string { } } - return response } + +func TransactionDetailsFromCoreTxn(txn core.Transaction, addresses map[string]string) (*transactions.TransactionDetails, error) { + var traspassedHoursIn, traspassedHoursOut, skyAmountIn, skyAmountOut uint64 + traspassedHoursIn = 0 + traspassedHoursOut = 0 + skyAmountIn = 0 + skyAmountOut = 0 + internally := true + sent := false + txnDetails := transactions.NewTransactionDetails(nil) + qml.QQmlEngine_SetObjectOwnership(txnDetails, qml.QQmlEngine__CppOwnership) + txnAddresses := address.NewAddressList(nil) + qml.QQmlEngine_SetObjectOwnership(txnAddresses, qml.QQmlEngine__CppOwnership) + inAddresses := make(map[string]struct{}, 0) + inputs := address.NewAddressList(nil) + outputs := address.NewAddressList(nil) + qml.QQmlEngine_SetObjectOwnership(inputs, qml.QQmlEngine__CppOwnership) + qml.QQmlEngine_SetObjectOwnership(outputs, qml.QQmlEngine__CppOwnership) + txnIns := txn.GetInputs() + for _, in := range txnIns { + qIn := address.NewAddressDetails(nil) + qml.QQmlEngine_SetObjectOwnership(qIn, qml.QQmlEngine__CppOwnership) + out, err := in.GetSpentOutput() + if err != nil { + logHistoryManager.WithError(err).Error("Couldn't get spent output") + return nil, err + } + outAddr, err := out.GetAddress() + if err != nil { + logHistoryManager.WithError(err).Error("Couldn't get address") + return nil, err + } + qIn.SetAddress(outAddr.String()) + skyUint64, err := in.GetCoins(params.SkycoinTicker) + if err != nil { + logHistoryManager.WithError(err).Warn("Couldn't get Skycoins balance") + return nil, err + } + accuracy, err := util.AltcoinQuotient(params.SkycoinTicker) + if err != nil { + logHistoryManager.WithError(err).Warn("Couldn't get Skycoins quotient") + + return nil, err + } + qIn.SetAddressSky(util.FormatCoins(skyUint64, accuracy)) + chUint64, err := in.GetCoins(params.CalculatedHoursTicker) + if err != nil { + logHistoryManager.WithError(err).Warn("Couldn't get Coin Hours balance") + return nil, err + } + accuracy, err = util.AltcoinQuotient(params.CalculatedHoursTicker) + if err != nil { + logHistoryManager.WithError(err).Warn("Couldn't get Coin Hours quotient") + return nil, err + } + qIn.SetAddressCoinHours(util.FormatCoins(chUint64, accuracy)) + inputs.AddAddress(qIn) + _, ok := addresses[outAddr.String()] + if ok { + skyAmountOut += skyUint64 + sent = true + _, ok := inAddresses[qIn.Address()] + if !ok { + txnAddresses.AddAddress(qIn) + inAddresses[qIn.Address()] = struct{}{} + } + + } + } + txnDetails.SetInputs(inputs) + for _, out := range txn.GetOutputs() { + sky, err := out.GetCoins(params.SkycoinTicker) + if err != nil { + logHistoryManager.WithError(err).Warn("Couldn't get Skycoins balance") + return nil, err + } + qOu := address.NewAddressDetails(nil) + qml.QQmlEngine_SetObjectOwnership(qOu, qml.QQmlEngine__CppOwnership) + outAddr, err := out.GetAddress() + if err != nil { + logHistoryManager.WithError(err).Error("Couldn't get address") + return nil, err + } + qOu.SetAddress(outAddr.String()) + accuracy, err := util.AltcoinQuotient(params.SkycoinTicker) + if err != nil { + logHistoryManager.WithError(err).Warn("Couldn't get Skycoins quotient") + return nil, err + } + qOu.SetAddressSky(util.FormatCoins(sky, accuracy)) + val, err := out.GetCoins(params.CoinHoursTicker) + if err != nil { + logHistoryManager.WithError(err).Warn("Couldn't get Coin Hours balance") + return nil, err + } + accuracy, err = util.AltcoinQuotient(coin.CoinHour) + if err != nil { + logHistoryManager.WithError(err).Warn("Couldn't get Coin Hours quotient") + return nil, err + } + qOu.SetAddressCoinHours(util.FormatCoins(val, accuracy)) + outputs.AddAddress(qOu) + if sent { + nOut, err := txn.GetInputs()[0].GetSpentOutput() + if err != nil { + logHistoryManager.WithError(err).Error("Couldn't get spent output") + return nil, err + } + nOutAddr, err := nOut.GetAddress() + if err != nil { + logHistoryManager.WithError(err).Error("Couldn't get address") + return nil, err + } + + if addresses[nOutAddr.String()] == addresses[outAddr.String()] { + skyAmountOut -= sky + + } else { + internally = false + val, err = out.GetCoins(params.CoinHoursTicker) + if err != nil { + logHistoryManager.WithError(err).Warn("Couldn't get Coin Hours send it") + return nil, err + } + traspassedHoursOut += val + } + } else { + _, ok := addresses[outAddr.String()] + if ok { + val, err = out.GetCoins(params.CoinHoursTicker) + if err != nil { + logHistoryManager.WithError(err).Warn("Couldn't get Coin Hours balance") + return nil, err + } + traspassedHoursIn += val + skyAmountIn += sky + + _, ok := inAddresses[qOu.Address()] + if !ok { + txnAddresses.AddAddress(qOu) + inAddresses[qOu.Address()] = struct{}{} + } + + } + + } + + } + txnDetails.SetOutputs(outputs) + t := time.Unix(int64(txn.GetTimestamp()), 0) + txnDetails.SetDate(qtCore.NewQDateTime3(qtCore.NewQDate3(t.Year(), int(t.Month()), t.Day()), qtCore.NewQTime3(t.Hour(), t.Minute(), 0, 0), qtCore.Qt__LocalTime)) + txnDetails.SetStatus(transactions.TransactionStatusPending) + + if txn.GetStatus() == core.TXN_STATUS_CONFIRMED { + txnDetails.SetStatus(transactions.TransactionStatusConfirmed) + } + txnDetails.SetType(transactions.TransactionTypeReceive) + if sent { + txnDetails.SetType(transactions.TransactionTypeSend) + if internally { + txnDetails.SetType(transactions.TransactionTypeInternal) + } + } + fee, err := txn.ComputeFee(params.CoinHoursTicker) + if err != nil { + logHistoryManager.WithError(err).Warn("Couldn't compute fee of the operation") + return nil, err + } + accuracy, err := util.AltcoinQuotient(coin.CoinHoursTicker) + if err != nil { + logHistoryManager.WithError(err).Warn("Couldn't get " + coin.CoinHoursTicker + " coins quotient") + return nil, err + } + txnDetails.SetHoursBurned(util.FormatCoins(fee, accuracy)) + switch txnDetails.Type() { + case transactions.TransactionTypeReceive: + { + accuracy, err := util.AltcoinQuotient(coin.CoinHoursTicker) + if err != nil { + logHistoryManager.WithError(err).Warn("Couldn't get " + coin.CoinHoursTicker + " coins quotient") + return nil, err + } + txnDetails.SetHoursTraspassed(util.FormatCoins(traspassedHoursIn, accuracy)) + accuracy, err = util.AltcoinQuotient(params.SkycoinTicker) + if err != nil { + logHistoryManager.WithError(err).Warn("Couldn't get Skycoins quotient") + return nil, err + } + txnDetails.SetAmount(util.FormatCoins(skyAmountIn, accuracy)) + + } + case transactions.TransactionTypeInternal: + { + var traspassedHoursMoved, skyAmountMoved uint64 + traspassedHoursMoved = 0 + skyAmountMoved = 0 + ins := inputs.Addresses() + inFind := make(map[string]struct{}, len(ins)) + for _, addr := range ins { + inFind[addr.Address()] = struct{}{} + } + for _, addr := range txn.GetOutputs() { + outAddr, err := addr.GetAddress() + if err != nil { + logHistoryManager.WithError(err).Error("Couldn't get address") + return nil, err + } + _, ok := inFind[outAddr.String()] + if !ok { + hours, err := addr.GetCoins(params.CoinHoursTicker) + if err != nil { + logHistoryManager.WithError(err).Warn("Couldn't parse Coin Hours from address") + return nil, err + } + traspassedHoursMoved += hours + sky, err := addr.GetCoins(params.SkycoinTicker) + if err != nil { + logHistoryManager.WithError(err).Error("Couldn't get Sky from address") + return nil, err + } + skyAmountMoved += sky + } + + } + accuracy, err := util.AltcoinQuotient(coin.CoinHoursTicker) + if err != nil { + logHistoryManager.WithError(err).Warn("Couldn't get " + coin.CoinHoursTicker + " coins quotient") + return nil, err + } + txnDetails.SetHoursTraspassed(util.FormatCoins(traspassedHoursMoved, accuracy)) + accuracy, err = util.AltcoinQuotient(params.SkycoinTicker) + if err != nil { + logHistoryManager.WithError(err).Warn("Couldn't get Skycoins quotient") + return nil, err + } + txnDetails.SetAmount(util.FormatCoins(skyAmountMoved, accuracy)) + + } + case transactions.TransactionTypeSend: + { + accuracy, err := util.AltcoinQuotient(coin.CoinHoursTicker) + if err != nil { + logHistoryManager.WithError(err).Warn("Couldn't get " + coin.CoinHoursTicker + " coins quotient") + return nil, err + } + txnDetails.SetHoursTraspassed(util.FormatCoins(traspassedHoursOut, accuracy)) + accuracy, err = util.AltcoinQuotient(params.SkycoinTicker) + if err != nil { + logHistoryManager.WithError(err).Warn("Couldn't get Skycoins quotient") + return nil, err + } + txnDetails.SetAmount(util.FormatCoins(skyAmountOut, accuracy)) + } + } + txnDetails.SetAddresses(txnAddresses) + txnDetails.SetTransactionID(txn.GetId()) + return txnDetails, nil + +} diff --git a/src/models/modelAddresses.go b/src/models/modelAddresses.go index 8537d75b..3b39bc90 100644 --- a/src/models/modelAddresses.go +++ b/src/models/modelAddresses.go @@ -11,12 +11,13 @@ const ( type ModelAddresses struct { core.QAbstractListModel + outputs []*ModelOutputs _ func() `constructor:"init"` _ map[int]*core.QByteArray `property:"roles"` - _ []*ModelOutputs `property:"outputs"` _ string `property:"name"` + _ string `property:"id"` _ func([]*ModelOutputs) `slot:"addOutputs"` } @@ -31,10 +32,11 @@ func (m *ModelAddresses) init() { m.ConnectRoleNames(m.roleNames) m.ConnectData(m.data) m.ConnectAddOutputs(m.addOutputs) + m.outputs = make([]*ModelOutputs, 0) } func (m *ModelAddresses) rowCount(*core.QModelIndex) int { - return len(m.Outputs()) + return len(m.outputs) } func (m *ModelAddresses) roleNames() map[int]*core.QByteArray { @@ -46,11 +48,11 @@ func (m *ModelAddresses) data(index *core.QModelIndex, role int) *core.QVariant return core.NewQVariant() } - if index.Row() >= len(m.Outputs()) { + if index.Row() >= len(m.outputs) { return core.NewQVariant() } - wa := m.Outputs()[index.Row()] + wa := m.outputs[index.Row()] switch role { case OAddress: @@ -75,6 +77,21 @@ func (m *ModelAddresses) insertRows(row int, count int) bool { } func (m *ModelAddresses) addOutputs(mo []*ModelOutputs) { - m.SetOutputs(mo) - m.insertRows(len(m.Outputs()), len(mo)) + for row, mOut := range mo { + find := false + for _, mOutSet := range m.outputs { + if mOut.Address() == mOutSet.Address() { + mOutSet.addOutputs(mOut.outputs) + find = true + break + } + } + if !find { + m.BeginInsertRows(core.NewQModelIndex(), row, row) + m.outputs = append(m.outputs, mOut) + m.EndInsertRows() + } else { + m.DataChanged(m.Index(len(m.outputs)-1, row, core.NewQModelIndex()), m.Index(len(m.outputs)-1, row+1, core.NewQModelIndex()), []int{int(core.Qt__DisplayRole)}) + } + } } diff --git a/src/models/modelOutputs.go b/src/models/modelOutputs.go index 02ba7ca1..38972405 100644 --- a/src/models/modelOutputs.go +++ b/src/models/modelOutputs.go @@ -14,11 +14,11 @@ const ( type ModelOutputs struct { core.QAbstractListModel + outputs []*QOutput _ func() `constructor:"init"` _ map[int]*core.QByteArray `property:"roles"` - _ []*QOutput `property:"outputs"` _ string `property:"address"` _ func([]*QOutput) `slot:"addOutputs"` @@ -60,7 +60,7 @@ func (m *ModelOutputs) init() { } func (m *ModelOutputs) removeOutputsFromAddress(addr string) { - old := m.Outputs() + old := m.outputs new := make([]*QOutput, 0) for _, out := range old { if out.AddressOwner() != addr { @@ -71,7 +71,7 @@ func (m *ModelOutputs) removeOutputsFromAddress(addr string) { } func (m *ModelOutputs) removeOutputsFromWallet(wltId string) { - old := m.Outputs() + old := m.outputs new := make([]*QOutput, 0) for _, out := range old { if out.WalletOwner() != wltId { @@ -82,7 +82,7 @@ func (m *ModelOutputs) removeOutputsFromWallet(wltId string) { } func (m *ModelOutputs) rowCount(*core.QModelIndex) int { - return len(m.Outputs()) + return len(m.outputs) } func (m *ModelOutputs) roleNames() map[int]*core.QByteArray { @@ -94,11 +94,11 @@ func (m *ModelOutputs) data(index *core.QModelIndex, role int) *core.QVariant { return core.NewQVariant() } - if index.Row() >= len(m.Outputs()) { + if index.Row() >= len(m.outputs) { return core.NewQVariant() } - qo := m.Outputs()[index.Row()] + qo := m.outputs[index.Row()] switch role { case OutputID: @@ -135,8 +135,23 @@ func (m *ModelOutputs) insertRows(row int, count int) bool { } func (m *ModelOutputs) addOutputs(mo []*QOutput) { - m.SetOutputs(mo) - m.insertRows(len(m.Outputs()), len(mo)) + for row, out := range mo { + find := false + for _, outSet := range m.outputs { + if out.OutputID() == outSet.OutputID() { + outSet = out + find = true + break + } + } + if !find { + m.BeginInsertRows(core.NewQModelIndex(), row, row) + m.outputs = append(m.outputs, out) + m.EndInsertRows() + } else { + m.DataChanged(m.Index(len(m.outputs)-1, row, core.NewQModelIndex()), m.Index(len(m.outputs)-1, row+1, core.NewQModelIndex()), []int{int(core.Qt__DisplayRole)}) + } + } } func contains(outputs []*QOutput, output *QOutput) bool { @@ -151,7 +166,7 @@ func contains(outputs []*QOutput, output *QOutput) bool { } func (m *ModelOutputs) insertOutputs(mo []*QOutput) { - toInsert := m.Outputs() + toInsert := m.outputs for _, outputToInsert := range mo { if !contains(toInsert, outputToInsert) { toInsert = append(toInsert, outputToInsert) @@ -162,12 +177,12 @@ func (m *ModelOutputs) insertOutputs(mo []*QOutput) { func (m *ModelOutputs) loadModel(mo []*QOutput) { m.BeginResetModel() - m.SetOutputs(mo) + m.outputs = mo m.EndResetModel() } func (m *ModelOutputs) cleanModel() { m.BeginResetModel() - m.SetOutputs(make([]*QOutput, 0)) + m.outputs = make([]*QOutput, 0) m.EndResetModel() } diff --git a/src/models/modelWallets.go b/src/models/modelWallets.go index 7e5104bf..a93f725e 100644 --- a/src/models/modelWallets.go +++ b/src/models/modelWallets.go @@ -1,16 +1,32 @@ package models import ( + "sync" + "time" + + "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/config" + coin "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/models" "github.com/fibercrypto/fibercryptowallet/src/core" local "github.com/fibercrypto/fibercryptowallet/src/main" "github.com/fibercrypto/fibercryptowallet/src/util" "github.com/fibercrypto/fibercryptowallet/src/util/logging" qtcore "github.com/therecipe/qt/core" + "github.com/therecipe/qt/qml" ) var logWalletModel = logging.MustGetLogger("Wallet Model") +var Helper = NewHelper(nil) + +type helper struct { + qtcore.QObject + + _ func(f func()) `signal:"runInMain,auto"` +} + +func (h *helper) runInMain(f func()) { f() } + const ( QName = int(qtcore.Qt__UserRole) + iota + 1 QAddresses @@ -18,22 +34,23 @@ const ( type ModelWallets struct { qtcore.QAbstractListModel - - WalletEnv core.WalletEnv - _ func() `constructor:"init"` + addresses []*ModelAddresses `property:"addresses"` + addressesMutex sync.Mutex + WalletEnv core.WalletEnv + _ func() `constructor:"init"` _ map[int]*qtcore.QByteArray `property:"roles"` - _ []*ModelAddresses `property:"addresses"` _ bool `property:"loading"` _ func() `slot:"loadModel"` + _ func(int) `slot:"removeWallet"` _ func() `slot:"cleanModel"` _ func([]*ModelAddresses) `slot:"addAddresses"` } func (m *ModelWallets) init() { m.SetRoles(map[int]*qtcore.QByteArray{ - Name: qtcore.NewQByteArray2("name", -1), + QName: qtcore.NewQByteArray2("name", -1), QAddresses: qtcore.NewQByteArray2("qaddresses", -1), }) @@ -43,7 +60,9 @@ func (m *ModelWallets) init() { m.ConnectData(m.data) m.ConnectLoadModel(m.loadModel) m.ConnectAddAddresses(m.addAddresses) + m.ConnectRemoveWallet(m.removeWallet) m.SetLoading(true) + m.addresses = make([]*ModelAddresses, 0) altManager := local.LoadAltcoinManager() walletsEnvs := make([]core.WalletEnv, 0) for _, plug := range altManager.ListRegisteredPlugins() { @@ -51,12 +70,17 @@ func (m *ModelWallets) init() { } m.WalletEnv = walletsEnvs[0] + go func() { + uptimeTicker := time.NewTicker(time.Duration(config.GetDataUpdateTime()) * time.Second) - m.loadModel() + for range uptimeTicker.C { + go m.LoadModel() + } + }() } func (m *ModelWallets) rowCount(*qtcore.QModelIndex) int { - return len(m.Addresses()) + return len(m.addresses) } func (m *ModelWallets) roleNames() map[int]*qtcore.QByteArray { @@ -68,11 +92,11 @@ func (m *ModelWallets) data(index *qtcore.QModelIndex, role int) *qtcore.QVarian return qtcore.NewQVariant() } - if index.Row() >= len(m.Addresses()) { + if index.Row() >= len(m.addresses) { return qtcore.NewQVariant() } - w := m.Addresses()[index.Row()] + w := m.addresses[index.Row()] switch role { case QName: @@ -98,78 +122,132 @@ func (m *ModelWallets) insertRows(row int, count int) bool { func (m *ModelWallets) cleanModel() { m.SetLoading(false) - m.SetAddresses(make([]*ModelAddresses, 0)) + m.addresses = make([]*ModelAddresses, 0) } func (m *ModelWallets) loadModel() { - logWalletsModel.Info("Loading Model") - m.SetLoading(true) - aModels := make([]*ModelAddresses, 0) + + logWalletModel.Info("Loading Model") + if len(m.addresses) < 1 { + m.SetLoading(true) + } wallets := m.WalletEnv.GetWalletSet().ListWallets() if wallets == nil { - logWalletsModel.WithError(nil).Warn("Couldn't load wallet") + logWalletModel.WithError(nil).Warn("Couldn't load wallet") return } for wallets.Next() { - addresses, err := wallets.Value().GetLoadedAddresses() - if err != nil { - logWalletsModel.WithError(nil).Warn("Couldn't get loaded address") - return - } - ma := NewModelAddresses(nil) - ma.SetName(wallets.Value().GetLabel()) - oModels := make([]*ModelOutputs, 0) - - for addresses.Next() { - a := addresses.Value() - outputs := a.GetCryptoAccount().ScanUnspentOutputs() - mo := NewModelOutputs(nil) - mo.SetAddress(a.String()) - qOutputs := make([]*QOutput, 0) - - for outputs.Next() { - to := outputs.Value() - qo := NewQOutput(nil) - qo.SetOutputID(to.GetId()) - val, err := to.GetCoins(coin.Sky) - if err != nil { - logWalletsModel.WithError(nil).Warn("Couldn't get " + coin.Sky + " coins") - continue - } - accuracy, err := util.AltcoinQuotient(coin.Sky) + wlt := wallets.Value() + go func() { + + addresses, err := wlt.GetLoadedAddresses() + if err != nil { + logWalletModel.WithError(nil).Warn("Couldn't get loaded address") + return + } + ma := NewModelAddresses(nil) + qml.QQmlEngine_SetObjectOwnership(ma, qml.QQmlEngine__CppOwnership) + ma.SetName(wlt.GetLabel()) + ma.SetId(wlt.GetId()) + oModels := make([]*ModelOutputs, 0) + + for addresses.Next() { + a := addresses.Value() + outputs, err := a.GetCryptoAccount().ScanUnspentOutputs() if err != nil { - logWalletsModel.WithError(err).Warn("Couldn't get " + coin.Sky + " coins quotient") + logWalletModel.WithField("address", a.String()).Warn("Couldn't get unspent outputs") + m.SetLoading(true) continue } - coins := util.FormatCoins(val, accuracy) - qo.SetAddressSky(coins) - val, err = to.GetCoins(coin.CoinHoursTicker) - if err != nil { - logWalletsModel.WithError(err).Warn("Couldn't get " + coin.CoinHoursTicker + " coins") - continue + mo := NewModelOutputs(nil) + qml.QQmlEngine_SetObjectOwnership(mo, qml.QQmlEngine__CppOwnership) + mo.SetAddress(a.String()) + qOutputs := make([]*QOutput, 0) + + for outputs.Next() { + to := outputs.Value() + qo := NewQOutput(nil) + qml.QQmlEngine_SetObjectOwnership(qo, qml.QQmlEngine__CppOwnership) + qo.SetOutputID(to.GetId()) + val, err := to.GetCoins(coin.Sky) + if err != nil { + logWalletModel.WithError(nil).Warn("Couldn't get " + coin.Sky + " coins") + m.SetLoading(true) + continue + } + accuracy, err := util.AltcoinQuotient(coin.Sky) + if err != nil { + logWalletModel.WithError(err).Warn("Couldn't get " + coin.Sky + " coins quotient") + m.SetLoading(true) + continue + } + coins := util.FormatCoins(val, accuracy) + qo.SetAddressSky(coins) + val, err = to.GetCoins(coin.CoinHoursTicker) + if err != nil { + logWalletModel.WithError(err).Warn("Couldn't get " + coin.CoinHoursTicker + " coins") + m.SetLoading(true) + continue + } + accuracy, err = util.AltcoinQuotient(coin.CoinHoursTicker) + if err != nil { + logWalletModel.WithError(err).Warn("Couldn't get " + coin.CoinHoursTicker + " coins quotient") + m.SetLoading(true) + continue + } + coinsH := util.FormatCoins(val, accuracy) + qo.SetAddressCoinHours(coinsH) + qOutputs = append(qOutputs, qo) } - accuracy, err = util.AltcoinQuotient(coin.CoinHoursTicker) - if err != nil { - logWalletsModel.WithError(err).Warn("Couldn't get " + coin.CoinHoursTicker + " coins quotient") - continue + if len(qOutputs) != 0 { + mo.addOutputs(qOutputs) + oModels = append(oModels, mo) } - coinsH := util.FormatCoins(val, accuracy) - qo.SetAddressCoinHours(coinsH) - qOutputs = append(qOutputs, qo) - } - if len(qOutputs) != 0 { - mo.addOutputs(qOutputs) - oModels = append(oModels, mo) } - } - ma.addOutputs(oModels) - aModels = append(aModels, ma) + ma.addOutputs(oModels) + + Helper.RunInMain(func() { + m.addAddresses([]*ModelAddresses{ma}) + }) + }() } + logWalletModel.Info("Model loaded") m.SetLoading(false) - m.addAddresses(aModels) } func (m *ModelWallets) addAddresses(ma []*ModelAddresses) { - m.SetAddresses(ma) - m.insertRows(len(m.Addresses()), len(ma)) + for _, modelAddresses := range ma { + row := 0 + find := false + for _, modelASet := range m.addresses { + if modelAddresses.Id() == modelASet.Id() { + modelASet.addOutputs(modelAddresses.outputs) + find = true + break + } + row++ + } + if !find { + m.BeginInsertRows(qtcore.NewQModelIndex(), row, row) + m.addressesMutex.Lock() + m.addresses = append(m.addresses, modelAddresses) + m.addressesMutex.Unlock() + m.EndInsertRows() + } else { + m.DataChanged(m.Index(len(m.addresses)-1, row, qtcore.NewQModelIndex()), m.Index(len(m.addresses)-1, row+1, qtcore.NewQModelIndex()), []int{int(qtcore.Qt__DisplayRole)}) + } + } + for i := len(m.addresses) - 1; i >= 0; i-- { + if len(m.addresses[i].outputs) < 1 { + m.removeWallet(i) + } + } +} + +func (m *ModelWallets) removeWallet(row int) { + m.BeginRemoveRows(qtcore.NewQModelIndex(), row, row) + m.addressesMutex.Lock() + m.addresses = append(m.addresses[:row], m.addresses[row+1:]...) + m.addressesMutex.Unlock() + m.EndRemoveRows() } diff --git a/src/models/models.go b/src/models/models.go index 6535bc43..8f0cf463 100644 --- a/src/models/models.go +++ b/src/models/models.go @@ -5,6 +5,8 @@ func init() { BlockchainStatusModel_QmlRegisterType2("BlockchainModels", 1, 0, "BlockchainStatusModel") WalletModel_QmlRegisterType2("WalletsManager", 1, 0, "WalletModel") QWallet_QmlRegisterType2("WalletsManager", 1, 0, "QWallet") + QSigner_QmlRegisterType2("WalletsManager", 1, 0, "QSigner") + SignerModel_QmlRegisterType2("WalletsManager", 1, 0, "SignerModel") AddressesModel_QmlRegisterType2("WalletsManager", 1, 0, "AddressModel") QAddress_QmlRegisterType2("WalletsManager", 1, 0, "QAddress") WalletManager_QmlRegisterType2("WalletsManager", 1, 0, "WalletManager") @@ -16,5 +18,5 @@ func init() { ModelOutputs_QmlRegisterType2("OutputsModels", 1, 0, "QOutputs") QTransaction_QmlRegisterType2("Transactions", 1, 0, "QTransaction") QBridge_QmlRegisterType2("Utils", 1, 0, "QBridge") - + QDeviceInteraction_QmlRegisterType2("DeviceInteraction", 1, 0, "DeviceInteraction") } diff --git a/src/models/modelsManager.go b/src/models/modelsManager.go index cbcfef1b..a8b818d0 100644 --- a/src/models/modelsManager.go +++ b/src/models/modelsManager.go @@ -1,6 +1,8 @@ package models import ( + "time" + "github.com/therecipe/qt/qml" qtcore "github.com/therecipe/qt/core" @@ -20,6 +22,21 @@ func (mm *ModelManager) init() { mm.ConnectGetAddressModel(mm.getAddressModel) qml.QQmlEngine_SetObjectOwnership(mm, qml.QQmlEngine__CppOwnership) mm.addressesModel = make(map[string]*AddressesModel, 0) + go func() { + uptimeTicker := time.NewTicker(time.Second * 2) + + for { + <-uptimeTicker.C + for wlt, _ := range mm.addressesModel { + addrModel := NewAddressesModel(nil) + qml.QQmlEngine_SetObjectOwnership(addrModel, qml.QQmlEngine__CppOwnership) + addrModel.LoadModel(mm.wltManager.getAddresses(wlt)) + addrModel.RemoveAddress(0) + mm.addressesModel[wlt] = addrModel + } + + } + }() } func (mm *ModelManager) setWalletManager(wm *WalletManager) { @@ -32,8 +49,8 @@ func (mm *ModelManager) getAddressModel(wltName string) *AddressesModel { if !ok { addrModel = NewAddressesModel(nil) qml.QQmlEngine_SetObjectOwnership(addrModel, qml.QQmlEngine__CppOwnership) - addrModel.loadModel(mm.wltManager.getAddresses(wltName)) - addrModel.removeAddress(0) + addrModel.LoadModel(mm.wltManager.getAddresses(wltName)) + addrModel.RemoveAddress(0) mm.addressesModel[wltName] = addrModel } diff --git a/src/models/pending/PendingModel.go b/src/models/pending/PendingModel.go index e7eaac9c..b39101a5 100644 --- a/src/models/pending/PendingModel.go +++ b/src/models/pending/PendingModel.go @@ -77,7 +77,8 @@ func (model *PendingTransactionList) getAll() { } ptModels := make([]*PendingTransaction, 0) for txns.Next() { - ptModel := TransactionToPendingTransaction(txns.Value()) + t := txns.Value() + ptModel := TransactionToPendingTransaction(t) ptModel.SetMine(0) ptModels = append(ptModels, ptModel) } @@ -96,7 +97,8 @@ func (model *PendingTransactionList) getMine() { } ptModels := make([]*PendingTransaction, 0) for wallets.Next() { - account := wallets.Value().GetCryptoAccount() + wlt := wallets.Value() + account := wlt.GetCryptoAccount() txns, err := account.ListPendingTransactions() if err != nil { //display an error in qml app when Mine is selected diff --git a/src/models/qtransaction.go b/src/models/qtransaction.go index 9135a294..45ddb370 100644 --- a/src/models/qtransaction.go +++ b/src/models/qtransaction.go @@ -45,7 +45,15 @@ func NewQTransactionFromTransaction(txn core.Transaction) (*QTransaction, error) ins := txn.GetInputs() for _, in := range ins { qIn := address.NewAddressDetails(nil) - addr := in.GetSpentOutput().GetAddress().String() + out, err := in.GetSpentOutput() + if err != nil { + return nil, err + } + outAddr, err := out.GetAddress() + if err != nil { + return nil, err + } + addr := outAddr.String() inputsAddresses[addr] = struct{}{} qIn.SetAddress(addr) quotient, err := util.AltcoinQuotient(params.SkycoinTicker) @@ -74,7 +82,11 @@ func NewQTransactionFromTransaction(txn core.Transaction) (*QTransaction, error) outs := txn.GetOutputs() for _, out := range outs { qOu := address.NewAddressDetails(nil) - addr := out.GetAddress().String() + outAddr, err := out.GetAddress() + if err != nil { + return nil, err + } + addr := outAddr.String() qOu.SetAddress(addr) quotient, err := util.AltcoinQuotient(params.SkycoinTicker) sky, err := out.GetCoins(params.SkycoinTicker) diff --git a/src/models/signersModel.go b/src/models/signersModel.go new file mode 100644 index 00000000..6956e18c --- /dev/null +++ b/src/models/signersModel.go @@ -0,0 +1,129 @@ +package models + +import ( + "github.com/fibercrypto/fibercryptowallet/src/util/logging" + "github.com/therecipe/qt/core" + "github.com/therecipe/qt/qml" + wlcore "github.com/fibercrypto/fibercryptowallet/src/main" +) + +const ( + SignerId = iota + int(core.Qt__UserRole) + 1 + SignerDescription +) + +var logSignersModel = logging.MustGetLogger("Signers Model") + +type SignerModel struct { + core.QAbstractListModel + + _ func() `constructor:"init"` + _ map[int]*core.QByteArray `property:"roles"` + _ []*QSigner `property:"signers"` + _ func(string) `slot:"loadModel"` + _ int `property:"count"` +} + +type QSigner struct { + core.QObject + + _ string `property:"id"` + _ string `property:"description"` +} + +func (signerModel *SignerModel) init() { + logWalletsModel.Debugln("Initialize Signer model") + signerModel.SetRoles(map[int]*core.QByteArray{ + SignerId: core.NewQByteArray2("id", -1), + SignerDescription: core.NewQByteArray2("description", -1), + }) + qml.QQmlEngine_SetObjectOwnership(signerModel, qml.QQmlEngine__CppOwnership) + signerModel.ConnectData(signerModel.data) + signerModel.ConnectRowCount(signerModel.rowCount) + signerModel.ConnectColumnCount(signerModel.columnCount) + signerModel.ConnectRoleNames(signerModel.roleNames) + signerModel.ConnectLoadModel(signerModel.loadModel) +} + +func (signerModel *SignerModel) data(index *core.QModelIndex, role int) *core.QVariant { + if !index.IsValid() { + return core.NewQVariant() + } + if index.Row() >= len(signerModel.Signers()) { + return core.NewQVariant() + } + var s = signerModel.Signers()[index.Row()] + switch role { + case SignerId: + { + return core.NewQVariant1(s.Id()) + } + case SignerDescription: + { + return core.NewQVariant1(s.Description()) + } + + default: + { + return core.NewQVariant() + } + } +} + +func (signerModel *SignerModel) rowCount(parent *core.QModelIndex) int { + return len(signerModel.Signers()) +} + +func (signersModel *SignerModel) columnCount(parent *core.QModelIndex) int { + return 1 +} + +func (signersModel *SignerModel) roleNames() map[int]*core.QByteArray { + return signersModel.Roles() +} + +func (signerModel *SignerModel) loadModel(wltId string) { + logSignersModel.Debugln("Loading signers", wltId) + wlt := walletManager.WalletEnv.GetWalletSet().GetWallet(wltId) + if wlt == nil { + return + } + am := wlcore.LoadAltcoinManager() + signers := am.EnumerateSignServices() + var qSigners []*QSigner + qSigner := NewQSigner(nil) + qml.QQmlEngine_SetObjectOwnership(qSigner, qml.QQmlEngine__CppOwnership) + qSigner.SetId(wlt.GetId()) + qSigner.SetDescription(wlt.GetLabel()) + qSigners = append(qSigners, qSigner) + for signers.Next() { + qSigner = NewQSigner(nil) + qml.QQmlEngine_SetObjectOwnership(qSigner, qml.QQmlEngine__CppOwnership) + signer := signers.Value() + sameSeedAsWlt, err := signer.ReadyForTxn(wlt, nil) + if err != nil { + logSignersModel.WithError(err).Errorln("unable to check wallet and signer compatibility") + return + } + if !sameSeedAsWlt { + continue + } + uid, err := signer.GetSignerUID() + if err != nil { + logSignersModel.WithError(err).Error("unable to get signer uid") + return + } + qSigner.SetId(string(uid)) + desc, err := signer.GetSignerDescription() + if err != nil { + logSignersModel.WithError(err).Error("unable to get signer description") + return + } + qSigner.SetDescription(desc) + qSigners = append(qSigners, qSigner) + } + signerModel.BeginResetModel() + signerModel.SetSigners(qSigners) + signerModel.SetCount(len(signerModel.Signers())) + signerModel.EndResetModel() +} diff --git a/src/models/walletsManager.go b/src/models/walletsManager.go index ed7102af..90d4e27c 100644 --- a/src/models/walletsManager.go +++ b/src/models/walletsManager.go @@ -1,15 +1,19 @@ package models import ( - "fmt" "sync" + "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin" + "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/config" + "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/params" "github.com/fibercrypto/fibercryptowallet/src/util" "github.com/therecipe/qt/qml" + "time" + sky "github.com/fibercrypto/fibercryptowallet/src/coin/skycoin/models" "github.com/fibercrypto/fibercryptowallet/src/core" local "github.com/fibercrypto/fibercryptowallet/src/main" @@ -22,21 +26,44 @@ var logWalletManager = logging.MustGetLogger("modelsWalletManager") var once sync.Once var walletManager *WalletManager +type updateAddressInfo struct { + isNew bool + address *QAddress +} + +type utilByWallet struct { + m sync.Mutex + sendChannel chan *updateAddressInfo +} + +type updateWalletInfo struct { + isNew bool + row int + wallet *QWallet +} type WalletManager struct { qtCore.QObject - WalletEnv core.WalletEnv - SeedGenerator core.SeedGenerator - wallets []*QWallet - addresseseByWallets map[string][]*QAddress - outputsByAddress map[string][]*QOutput - altManager core.AltcoinManager - signer core.BlockchainSignService - transactionAPI core.BlockchainTransactionAPI + WalletEnv core.WalletEnv + SeedGenerator core.SeedGenerator + wallets []*QWallet + addresseseByWallets map[string](map[string]*QAddress) + orderedAddressesByWallets map[string][]*QAddress + utilByWallets map[string]*utilByWallet + markedAddress map[string]int + outputsByAddress map[string][]*QOutput + outputsByAddressMutex sync.Mutex + altManager core.AltcoinManager + signer core.BlockchainSignService + transactionAPI core.BlockchainTransactionAPI + walletsIterator core.WalletIterator + updaterChannel chan *updateWalletInfo + timerUpdate chan time.Duration _ func() `slot:"updateWalletEnvs"` _ func(wltId, address string) `slot:"updateOutputs"` _ func(string) `slot:"updateAddresses"` _ func() `slot:"updateWallets"` + _ func() `slot:"updateAll"` _ func() `constructor:"init"` _ func(seed string, label string, walletType string, password string, scanN int) *QWallet `slot:"createEncryptedWallet"` _ func(seed string, label string, walletType string, scanN int) *QWallet `slot:"createUnencryptedWallet"` @@ -59,10 +86,13 @@ type WalletManager struct { _ func() string `slot:"getDefaultWalletType"` _ func(wltIds, addresses []string, source string, bridgeForPassword *QBridge, index []int, qTxn *QTransaction) `slot:"signAndBroadcastTxnAsync"` _ func() []string `slot:"getAvailableWalletTypes"` + _ func(address string, value int) `slot:"editMarkAddress"` + _ func(address string) int `slot:"markFieldOfAddress"` } func (walletM *WalletManager) init() { logWalletManager.Info("Initializing WalletManager") + logWalletManager.Debug("Starting WalletManager") once.Do(func() { qml.QQmlEngine_SetObjectOwnership(walletM, qml.QQmlEngine__CppOwnership) walletM.ConnectEditWallet(walletM.editWallet) @@ -85,23 +115,117 @@ func (walletM *WalletManager) init() { walletM.ConnectGetOutputsFromWallet(walletM.getOutputsFromWallet) walletM.ConnectUpdateWalletEnvs(walletM.updateWalletEnvs) walletM.ConnectUpdateWallets(walletM.updateWallets) + walletM.ConnectUpdateAll(walletM.updateAll) walletM.ConnectUpdateAddresses(walletM.updateAddresses) walletM.ConnectUpdateOutputs(walletM.updateOutputs) walletM.ConnectSignAndBroadcastTxnAsync(walletM.signAndBroadcastTxnAsync) walletM.ConnectGetDefaultWalletType(walletM.getDefaultWalletType) walletM.ConnectGetAvailableWalletTypes(walletM.getAvailableWalletTypes) - walletM.addresseseByWallets = make(map[string][]*QAddress, 0) + walletM.ConnectEditMarkAddress(walletM.editMarkAddress) + walletM.ConnectMarkFieldOfAddress(walletM.markFieldOfAddress) + walletM.addresseseByWallets = make(map[string](map[string]*QAddress), 0) + walletM.orderedAddressesByWallets = make(map[string][]*QAddress, 0) + walletM.utilByWallets = make(map[string]*utilByWallet, 0) walletM.outputsByAddress = make(map[string][]*QOutput, 0) - walletM.altManager = local.LoadAltcoinManager() walletM.SeedGenerator = new(sky.SeedService) walletManager = walletM - walletM.updateWalletEnvs() - walletM.updateSigner() - walletM.updateTransactionAPI() - }) + walletM.markedAddress = make(map[string]int) + }) + walletM.altManager = local.LoadAltcoinManager() + walletM.updateTransactionAPI() + walletM.updateSigner() + walletM.updateWalletEnvs() + walletM.timerUpdate = make(chan time.Duration) + for walletM.WalletEnv == nil { + walletM.updateWalletEnvs() + } walletM = walletManager + walletM.updaterChannel = make(chan *updateWalletInfo) + + qWallets := make([]*QWallet, 0) + logWalletManager.Debug("Getting iterator") + it := walletM.WalletEnv.GetWalletSet().ListWallets() + logWalletManager.Debug("Obtained iterator") + if it == nil { + logWalletManager.WithError(nil).Warn("Couldn't get a wallet iterator") + return + } + for it.Next() { + qWallet := NewQWallet(nil) + qml.QQmlEngine_SetObjectOwnership(qWallet, qml.QQmlEngine__CppOwnership) + qWallet.SetName(it.Value().GetLabel()) + qWallet.SetExpand(false) + qWallet.SetFileName(it.Value().GetId()) + qWallet.SetEncryptionEnabled(0) + + qWallet.SetSky("N/A") + qWallet.SetCoinHours("N/A") + qWallets = append(qWallets, qWallet) + walletM.utilByWallets[it.Value().GetId()] = &utilByWallet{ + m: sync.Mutex{}, + sendChannel: make(chan *updateAddressInfo), + } + walletM.initWalletAddresses(it.Value().GetId()) + } + logWalletManager.Debug("Finish wallets") + walletM.wallets = qWallets + go func() { + updateTime := config.GetDataUpdateTime() + logWalletManager.Debug("Update time is :=> ", time.Duration(updateTime)*time.Second) + uptimeTicker := time.NewTicker(time.Duration(updateTime) * time.Second) + + for { + select { + case <-uptimeTicker.C: + go walletM.updateWallets() + walletManager = walletM + break + case t := <-walletM.timerUpdate: + uptimeTicker = time.NewTicker(t) + break + } + <-uptimeTicker.C + go walletM.updateWallets() + walletManager = walletM + } + }() +} + +func (walletM *WalletManager) suscribe() chan *updateWalletInfo { + return walletM.updaterChannel +} + +func (walletM *WalletManager) suscribeForAddresses(wltId string) chan *updateAddressInfo { + u, ok := walletM.utilByWallets[wltId] + if !ok { + return nil + } + return u.sendChannel +} +func (walletManager *WalletManager) editMarkAddress(address string, value int) { + walletManager.markedAddress[address] = value +} + +func (walletM *WalletManager) markFieldOfAddress(address string) int { + val, ok := walletM.markedAddress[address] + if !ok { + val = 0 + } + return val +} + +func (walletM *WalletManager) updateAll() { + logWalletManager.Debug("Updating Wallet manager") + walletM.altManager = local.LoadAltcoinManager() + walletM.updateTransactionAPI() + walletM.updateSigner() + walletM.updateWalletEnvs() + skycoin.UpdateAltcoin() + updateTime := config.GetDataUpdateTime() + logWalletManager.Debug("Update time is :=> ", time.Duration(updateTime)*time.Second) + walletM.timerUpdate <- time.Duration(updateTime) * time.Second } func GetWalletEnv() core.WalletEnv { @@ -127,6 +251,7 @@ func (walletM *WalletManager) getAvailableWalletTypes() []string { } func (walletM *WalletManager) updateSigner() { + logWalletManager.Info("Updating Signers") signers := make([]core.BlockchainSignService, 0) @@ -162,20 +287,65 @@ func (walletM *WalletManager) updateWalletEnvs() { for _, plug := range walletM.altManager.ListRegisteredPlugins() { walletsEnvs = append(walletsEnvs, plug.LoadWalletEnvs()...) } - if walletsEnvs == nil { + if len(walletsEnvs) == 0 { logWalletManager.Error("Error loading wallet envs") + return } walletM.WalletEnv = walletsEnvs[0] } +func (walletM *WalletManager) initWalletAddresses(wltId string) { + logWalletManager.Info("Updating Addresses") + wlt := walletM.WalletEnv.GetWalletSet().GetWallet(wltId) + qAddresses1 := make(map[string]*QAddress, 0) + qAddresses2 := make([]*QAddress, 0) + it, err := wlt.GetLoadedAddresses() + if err != nil { + logWalletManager.WithError(err).Warn("Couldn't loaded addresses") + return + } + for it.Next() { + addr := it.Value() + qAddress := NewQAddress(nil) + qml.QQmlEngine_SetObjectOwnership(qAddress, qml.QQmlEngine__CppOwnership) + qAddress.SetAddress(addr.String()) + qAddress.SetMarked(0) + qAddress.SetWallet(wlt.GetLabel()) + qAddress.SetWalletId(wlt.GetId()) + qAddress.SetAddressSky("N/A") + qAddress.SetAddressCoinHours("N/A") + qml.QQmlEngine_SetObjectOwnership(qAddress, qml.QQmlEngine__CppOwnership) + + qAddresses2 = append(qAddresses2, qAddress) + qAddresses1[addr.String()] = qAddress + go walletM.getOutputs(wltId, addr.String()) + } + + walletM.addresseseByWallets[wltId] = qAddresses1 + walletM.orderedAddressesByWallets[wltId] = qAddresses2 + +} + func (walletM *WalletManager) updateAddresses(wltId string) { + mutex := &walletM.utilByWallets[wltId].m + sendChan := walletM.utilByWallets[wltId].sendChannel + addresses, ok := walletM.addresseseByWallets[wltId] + if !ok { + walletM.addresseseByWallets[wltId] = make(map[string]*QAddress) + walletM.orderedAddressesByWallets[wltId] = make([]*QAddress, 0) + addresses = walletM.addresseseByWallets[wltId] + } + (*mutex).Lock() + defer (*mutex).Unlock() logWalletManager.Info("Updating Addresses") wlt := walletM.WalletEnv.GetWalletSet().GetWallet(wltId) - qAddresses := make([]*QAddress, 0) + if wlt == nil { + logWalletManager.Warn("Couldn't load wallet") + return + } it, err := wlt.GetLoadedAddresses() if err != nil { logWalletManager.WithError(err).Warn("Couldn't loaded addresses") - walletM.addresseseByWallets[wltId] = qAddresses return } for it.Next() { @@ -216,11 +386,33 @@ func (walletM *WalletManager) updateAddresses(wltId string) { qAddress.SetAddressCoinHours(util.FormatCoins(coinH, accuracy)) qml.QQmlEngine_SetObjectOwnership(qAddress, qml.QQmlEngine__CppOwnership) - qAddresses = append(qAddresses, qAddress) + info := new(updateAddressInfo) + oldAddr, exist := addresses[addr.String()] + if !exist { + addresses[addr.String()] = qAddress + info.isNew = true + info.address = qAddress + sendChan <- info - } + } else { + changed := false + if qAddress.AddressSky() != "N/A" && qAddress.AddressSky() != oldAddr.AddressSky() { + changed = true + oldAddr.SetAddressSky(qAddress.AddressSky()) + } + if qAddress.AddressCoinHours() != "N/A" && qAddress.AddressCoinHours() != oldAddr.AddressCoinHours() { + changed = true + oldAddr.SetAddressCoinHours(qAddress.AddressCoinHours()) + } + if changed { + info.isNew = false + info.address = oldAddr + sendChan <- info + } + + } - walletM.addresseseByWallets[wltId] = qAddresses + } } func (walletM *WalletManager) updateOutputs(wltId, address string) { @@ -228,7 +420,9 @@ func (walletM *WalletManager) updateOutputs(wltId, address string) { addressIterator, err := walletM.WalletEnv.GetWalletSet().GetWallet(wltId).GetLoadedAddresses() if err != nil { logWalletManager.WithError(err).Warn("Couldn't get an addresses iterator") + walletM.outputsByAddressMutex.Lock() walletM.outputsByAddress[address] = outs + walletM.outputsByAddressMutex.Unlock() return } var addr core.Address @@ -240,13 +434,17 @@ func (walletM *WalletManager) updateOutputs(wltId, address string) { } if addr == nil { logWalletManager.WithError(err).Warn("Couldn't get address") + walletM.outputsByAddressMutex.Lock() walletM.outputsByAddress[address] = outs + walletM.outputsByAddressMutex.Unlock() return } - outsIter := addr.GetCryptoAccount().ScanUnspentOutputs() - if outsIter == nil { + outsIter, err := addr.GetCryptoAccount().ScanUnspentOutputs() + if err != nil { logWalletManager.WithError(err).Warn("Couldn't scan unspent outputs") + walletM.outputsByAddressMutex.Lock() walletM.outputsByAddress[address] = outs + walletM.outputsByAddressMutex.Unlock() return } for outsIter.Next() { @@ -285,12 +483,13 @@ func (walletM *WalletManager) updateOutputs(wltId, address string) { qout.SetWalletOwner(wltId) outs = append(outs, qout) } - + walletM.outputsByAddressMutex.Lock() walletM.outputsByAddress[address] = outs + walletM.outputsByAddressMutex.Unlock() } func (walletM *WalletManager) updateWallets() { - qWallets := make([]*QWallet, 0) + it := walletM.WalletEnv.GetWalletSet().ListWallets() if it == nil { logWalletManager.WithError(nil).Warn("Couldn't get a wallet iterator") @@ -298,16 +497,46 @@ func (walletM *WalletManager) updateWallets() { } for it.Next() { + go walletM.updateAddresses(it.Value().GetId()) + encrypted, err := walletM.WalletEnv.GetStorage().IsEncrypted(it.Value().GetId()) if err != nil { logWalletManager.WithError(err).Warn("Couldn't get wallet by id") continue } - qw := fromWalletToQWallet(it.Value(), encrypted) - qWallets = append(qWallets, qw) + qw := fromWalletToQWallet(it.Value(), encrypted, false) + founded, changed := false, false + row := 0 + for i := range walletM.wallets { + if walletM.wallets[i].FileName() == qw.FileName() { + row = i + founded = true + if !isEqual(walletM.wallets[i], qw) && (qw.Sky() != "N/A" || qw.CoinHours() != "N/A") { + qw.SetExpand(walletM.wallets[i].IsExpand()) + walletM.wallets[i] = qw + changed = true + } + break + } + } + if !founded { + changed = true + walletM.wallets = append(walletM.wallets, qw) + } + if changed { + walletM.utilByWallets[it.Value().GetId()] = &utilByWallet{ + m: sync.Mutex{}, + sendChannel: make(chan *updateAddressInfo), + } + wi := &updateWalletInfo{ + isNew: !founded, + row: row, + wallet: qw, + } + walletManager.updaterChannel <- wi + } } - walletM.wallets = qWallets } func (walletM *WalletManager) getAllAddresses() []*QAddress { @@ -323,6 +552,10 @@ func (walletM *WalletManager) getAllAddresses() []*QAddress { } return qAddresses } + +func isEqual(a, b *QWallet) bool { + return a.Name() == b.Name() && a.Sky() == b.Sky() && a.CoinHours() == b.CoinHours() && a.EncryptionEnabled() == b.EncryptionEnabled() +} func (walletM *WalletManager) broadcastTxn(txn *QTransaction) bool { logWalletManager.Info("Broadcasting transaction") altManager := local.LoadAltcoinManager() @@ -566,7 +799,6 @@ func (walletM *WalletManager) sendTo(wltId, destinationAddress, amount string) * } logWalletManager.Info("Transaction created") return qTxn - } func (walletM *WalletManager) signTxn(wltIds, address []string, source string, tmpPwd interface{}, index []int, qTxn *QTransaction) *QTransaction { @@ -605,10 +837,20 @@ func (walletM *WalletManager) signTxn(wltIds, address []string, source string, t if len(wltCache) > 1 { signDescriptors := make([]core.InputSignDescriptor, 0) for _, in := range qTxn.txn.GetInputs() { + out, err := in.GetSpentOutput() + if err != nil { + logWalletManager.WithError(err).Error("Error signing transaction") + return nil + } + outAddr, err := out.GetAddress() + if err != nil { + logWalletManager.WithError(err).Error("Error signing transaction") + return nil + } sd := core.InputSignDescriptor{ InputIndex: in.GetId(), SignerID: core.UID(source), - Wallet: wltByAddr[in.GetSpentOutput().GetAddress().String()], + Wallet: wltByAddr[outAddr.String()], } signDescriptors = append(signDescriptors, sd) } @@ -619,6 +861,15 @@ func (walletM *WalletManager) signTxn(wltIds, address []string, source string, t logWalletManager.WithError(err).Warnf("No signer %s for wallet %v", source, wlts[0]) return nil } + signerUid, err := signer.GetSignerUID() + if err != nil { + logWalletManager.WithError(err).Errorln("unable to ger signer uuid") + return nil + } + if wlts[0].GetId() == string(signerUid) { + // NOTE the signer is the wallet it self + signer = nil + } txn, err = wlts[0].Sign(qTxn.txn, signer, pwd, nil) } @@ -636,6 +887,7 @@ func (walletM *WalletManager) signTxn(wltIds, address []string, source string, t return qTxn } + func (walletM *WalletManager) signAndBroadcastTxnAsync(wltIds, addresses []string, source string, bridgeForPassword *QBridge, index []int, qTxn *QTransaction) { channel := make(chan *QTransaction) go func() { @@ -683,8 +935,19 @@ func (walletM *WalletManager) createEncryptedWallet(seed, label, wltType, passwo } logWalletManager.Info("Created encrypted wallet") - return fromWalletToQWallet(wlt, true) - + qWallet := fromWalletToQWallet(wlt, true, false) + walletM.wallets = append(walletM.wallets, qWallet) + wi := &updateWalletInfo{ + isNew: true, + row: len(walletM.wallets) - 1, + wallet: walletM.wallets[len(walletM.wallets)-1], + } + walletM.utilByWallets[wlt.GetId()] = &utilByWallet{ + m: sync.Mutex{}, + sendChannel: make(chan *updateAddressInfo), + } + walletM.updaterChannel <- wi + return qWallet } func (walletM *WalletManager) createUnencryptedWallet(seed, label, wltType string, scanN int) *QWallet { @@ -697,7 +960,19 @@ func (walletM *WalletManager) createUnencryptedWallet(seed, label, wltType strin } logWalletManager.Info("Created unencrypted wallet") - return fromWalletToQWallet(wlt, false) + qWallet := fromWalletToQWallet(wlt, false, false) + walletM.wallets = append(walletM.wallets, qWallet) + wi := &updateWalletInfo{ + isNew: true, + row: len(walletM.wallets) - 1, + wallet: walletM.wallets[len(walletM.wallets)-1], + } + walletM.utilByWallets[wlt.GetId()] = &utilByWallet{ + m: sync.Mutex{}, + sendChannel: make(chan *updateAddressInfo), + } + walletM.updaterChannel <- wi + return qWallet } @@ -777,45 +1052,14 @@ func (walletM *WalletManager) newWalletAddress(id string, n int, password string wltEntriesLen++ } wlt.GenAddresses(core.AccountAddress, uint32(wltEntriesLen), uint32(n), pwd) + go walletM.updateAddresses(id) logWalletManager.Info("New addresses created") } func (walletM *WalletManager) getWallets() []*QWallet { if walletM.wallets == nil { - walletM.updateWallets() - } - logWalletManager.Info("Getting wallets") - walletM.wallets = make([]*QWallet, 0) - if walletM.WalletEnv == nil { - walletM.UpdateWalletEnvs() - } - it := walletM.WalletEnv.GetWalletSet().ListWallets() - - if it == nil { - logWalletManager.WithError(nil).Error("Couldn't load wallets") - return walletM.wallets - - } - - for it.Next() { - - encrypted, err := walletM.WalletEnv.GetStorage().IsEncrypted(it.Value().GetId()) - if err != nil { - logWalletManager.WithError(err).Error("Couldn't get wallets") - return walletM.wallets - } - if encrypted { - qw := fromWalletToQWallet(it.Value(), true) - walletM.wallets = append(walletM.wallets, qw) - } else { - qw := fromWalletToQWallet(it.Value(), false) - walletM.wallets = append(walletM.wallets, qw) - } - + return make([]*QWallet, 0) } - //walletM.wallets = make([]*QWallet, 0) - - logWalletManager.Info("Wallets obtained") return walletM.wallets } @@ -830,21 +1074,22 @@ func (walletM *WalletManager) editWallet(id, label string) *QWallet { logWalletManager.WithError(err).Error("Couldn't edit wallet") return nil } - qWallet := fromWalletToQWallet(wlt, encrypted) + qWallet := fromWalletToQWallet(wlt, encrypted, false) logWalletManager.Info("Wallet edited") return qWallet } func (walletM *WalletManager) getAddresses(Id string) []*QAddress { - addrs, ok := walletM.addresseseByWallets[Id] + addrs, ok := walletM.orderedAddressesByWallets[Id] if !ok { walletM.updateAddresses(Id) - addrs = walletM.addresseseByWallets[Id] + addrs = walletM.orderedAddressesByWallets[Id] } + return addrs } -func fromWalletToQWallet(wlt core.Wallet, isEncrypted bool) *QWallet { +func fromWalletToQWallet(wlt core.Wallet, isEncrypted, withoutBalance bool) *QWallet { qWallet := NewQWallet(nil) qml.QQmlEngine_SetObjectOwnership(qWallet, qml.QQmlEngine__CppOwnership) @@ -858,6 +1103,13 @@ func fromWalletToQWallet(wlt core.Wallet, isEncrypted bool) *QWallet { qWallet.SetEncryptionEnabled(1) } + if withoutBalance { + qWallet.SetSky("N/A") + qWallet.SetCoinHours("N/A") + logWalletManager.Info("Passing over default wallet, without balance") + return qWallet + } + bl, err := wlt.GetCryptoAccount().GetBalance(sky.Sky) if err != nil { qWallet.SetSky("N/A") @@ -874,8 +1126,7 @@ func fromWalletToQWallet(wlt core.Wallet, isEncrypted bool) *QWallet { return qWallet } - floatBl := float64(bl) / float64(accuracy) - qWallet.SetSky(fmt.Sprint(floatBl)) + qWallet.SetSky(util.FormatCoins(bl, accuracy)) bl, err = wlt.GetCryptoAccount().GetBalance(sky.CoinHoursTicker) if err != nil { @@ -883,7 +1134,13 @@ func fromWalletToQWallet(wlt core.Wallet, isEncrypted bool) *QWallet { logWalletManager.WithError(err).Error("Couldn't get Coin Hours balance") return qWallet } - qWallet.SetCoinHours(fmt.Sprint(bl)) - + accuracy, err = util.AltcoinQuotient(params.CoinHoursTicker) + if err != nil { + qWallet.SetCoinHours("N/A") + logWalletManager.WithError(err).Error("Couldn't get Coin Hours Altcoin quotient") + panic(nil) + return qWallet + } + qWallet.SetCoinHours(util.FormatCoins(bl, accuracy)) return qWallet } diff --git a/src/models/walletsModel.go b/src/models/walletsModel.go index d5cd60ac..bc6cd98f 100644 --- a/src/models/walletsModel.go +++ b/src/models/walletsModel.go @@ -1,9 +1,16 @@ package models import ( + "errors" + hardware "github.com/fibercrypto/fibercryptowallet/src/contrib/hardware-wallet/skywallet" + fce "github.com/fibercrypto/fibercryptowallet/src/errors" + fccore "github.com/fibercrypto/fibercryptowallet/src/core" + wlcore "github.com/fibercrypto/fibercryptowallet/src/main" "github.com/fibercrypto/fibercryptowallet/src/util/logging" + skyWallet "github.com/fibercrypto/skywallet-go/src/skywallet" "github.com/therecipe/qt/core" "github.com/therecipe/qt/qml" + "time" ) const ( @@ -13,9 +20,12 @@ const ( CoinHours FileName Expand + HasHardwareWallet ) var logWalletsModel = logging.MustGetLogger("Wallets Model") +var hadHwConnected = false +var hwConnectedOn []int type WalletModel struct { core.QAbstractListModel @@ -25,12 +35,16 @@ type WalletModel struct { _ map[int]*core.QByteArray `property:"roles"` _ []*QWallet `property:"wallets"` - _ func(*QWallet) `slot:"addWallet"` - _ func(row int, name string, encryptionEnabled bool, sky string, coinHours string) `slot:"editWallet"` - _ func(row int) `slot:"removeWallet"` - _ func([]*QWallet) `slot:"loadModel"` - _ func([]*QWallet) `slot:"updateModel"` - _ int `property:"count"` + _ func(*QWallet) `slot:"addWallet"` + _ func(row int, name string, encryptionEnabled bool, sky string, coinHours string) `slot:"editWallet"` + _ func(row int) `slot:"removeWallet"` + _ func([]*QWallet) `slot:"loadModel"` + _ func([]*QWallet) `slot:"updateModel"` + _ func(devI *QDeviceInteraction, locker *QBridge) `slot:"sniffHw"` + _ func(string) `slot:"changeExpanded"` + _ int `property:"count"` + receivChannel chan *updateWalletInfo + walletByName map[string]*QWallet } type QWallet struct { @@ -41,6 +55,60 @@ type QWallet struct { _ string `property:"coinHours"` _ string `property:"fileName"` _ bool `property:"expand"` + _ bool `property:"hasHardwareWallet"` +} + +func createSkyHardwareWallet(bridgeForPassword *QBridge) { + requestKind2Prompt := func(kind skyWallet.InputRequestKind, bridge *QBridge) (func(string, string), error) { + switch kind { + case skyWallet.RequestKindWord: + return bridge.GetBip39Word, nil + case skyWallet.RequestKindPinMatrix: + return bridge.GetSkyHardwareWalletPin, nil + case skyWallet.RequestInformUserOkAndCancel: + return bridge.DeviceRequireConfirmableAction, nil + case skyWallet.RequestInformUserOnlyCancel: + return bridge.DeviceRequireCancelableAction, nil + case skyWallet.RequestInformUserOnlyOk: + return bridge.DeviceRequireAction, nil + default: + errStr := "invalid request kind" + logWalletsModel.WithField("kind", kind).Errorln(errStr) + return nil, errors.New(errStr) + } + } + hardware.CreateSkyWltInteractionInstanceOnce( + false, + skyWallet.DeviceTypeUSB, + func(kind skyWallet.InputRequestKind, tittle, message string)(string, error) { + prompt, err := requestKind2Prompt(kind, bridgeForPassword) + if err != nil { + return "", err + } + bridgeForPassword.BeginUse() + defer bridgeForPassword.EndUse() + switch kind { + case skyWallet.RequestKindPinMatrix, skyWallet.RequestKindWord: + bridgeForPassword.lock() + prompt(tittle, message) + bridgeForPassword.lock() + pass, err := bridgeForPassword.getOptionalResult() + bridgeForPassword.unlock() + if err != nil { + logWalletsModel.WithError(err).Warningln("error handling user interaction") + return "", skyWallet.ErrUserCancelledFromInputReader + } + return pass, nil + case skyWallet.RequestInformUserOkAndCancel, skyWallet.RequestInformUserOnlyCancel, skyWallet.RequestInformUserOnlyOk: + prompt(tittle, message) + return "", nil + default: + errStr := "invalid request kind" + logWalletsModel.WithField("kind", kind).Errorln(errStr) + return "", errors.New(errStr) + } + }, + ) } func (walletModel *WalletModel) init() { @@ -52,6 +120,7 @@ func (walletModel *WalletModel) init() { CoinHours: core.NewQByteArray2("coinHours", -1), FileName: core.NewQByteArray2("fileName", -1), Expand: core.NewQByteArray2("expand", -1), + HasHardwareWallet: core.NewQByteArray2("hasHardwareWallet", -1), }) qml.QQmlEngine_SetObjectOwnership(walletModel, qml.QQmlEngine__CppOwnership) walletModel.ConnectData(walletModel.data) @@ -59,17 +128,158 @@ func (walletModel *WalletModel) init() { walletModel.ConnectRowCount(walletModel.rowCount) walletModel.ConnectColumnCount(walletModel.columnCount) walletModel.ConnectRoleNames(walletModel.roleNames) - + walletModel.ConnectSniffHw(walletModel.sniffHw) walletModel.ConnectAddWallet(walletModel.addWallet) walletModel.ConnectEditWallet(walletModel.editWallet) walletModel.ConnectRemoveWallet(walletModel.removeWallet) walletModel.ConnectLoadModel(walletModel.loadModel) walletModel.ConnectUpdateModel(walletModel.updateModel) + walletModel.ConnectChangeExpanded(walletModel.changeExpanded) + walletModel.receivChannel = walletManager.suscribe() + walletModel.walletByName = make(map[string]*QWallet, 0) + go func() { + for { + wi := <-walletModel.receivChannel + if wi.isNew { + //walletModel.addWallet(wi.wallet) + } else { + encrypted := false + if wi.wallet.EncryptionEnabled() == 1 { + encrypted = true + } + walletModel.editWallet(wi.row, wi.wallet.Name(), encrypted, wi.wallet.Sky(), wi.wallet.CoinHours()) + } + } + }() +} +// attachHwAsSigner add a hw as signer +func attachHwAsSigner(wlt fccore.Wallet) error { + hw := hardware.NewSkyWallet(wlt) + am := wlcore.LoadAltcoinManager() + if err := am.AttachSignService(hw); err != nil { + logSignersModel.Errorln("error registering hardware wallet as signer") + return err + } + return nil +} + +// sniffHw notify the model about available hardware wallet device if any +func (walletModel *WalletModel) sniffHw(qmlDevI *QDeviceInteraction, locker *QBridge) { + blockingCheck := func() { + registerWlt := func(wlt fccore.Wallet) { + if wlt == nil { + return + } + hadHwConnected = true + walletModel.updateWallet(wlt.GetId()) + attachHwAsSigner(wlt) + } + logError := func(err error) { + if err != nil { + if err == fce.ErrWltFromAddrNotFound { + logWalletsModel.WithError(err).Debugln("wallet not found") + return + } + logWalletsModel.WithError(err).Errorln("unexpected error") + } + } + dev := hardware.NewSkyWalletHelper() + openDialog := func(prompt func()) { + locker.BeginUse() + defer locker.EndUse() + locker.lock() + prompt() + locker.lock() + locker.unlock() + } + deviceFailed := func(err error) { + if err == skyWallet.ErrNoDeviceConnected { + if hadHwConnected { + hadHwConnected = false + dev.IsBootloaderMode() + hwConnectedOn = []int{} + beginIndex := walletModel.Index(0, 0, core.NewQModelIndex()) + endIndex := walletModel.Index(walletModel.rowCount(core.NewQModelIndex())-1, 0, core.NewQModelIndex()) + walletModel.DataChanged(beginIndex, endIndex, []int{HasHardwareWallet}) + logSignersModel.WithError(err).Warningln("connection to hardware wallet was lose") + hardware.SkyWltInteractionInstance().ClearSingleTimeOperationsCache() + } else { + logWalletsModel.WithError(err).Infoln("no device connected") + } + } else { + logWalletsModel.Errorln(err) + } + } + isBootloader, err := dev.ShouldUploadFirmware().Then(func(data interface{}) interface{} { + if data.(bool) { + openDialog(qmlDevI.OpenInteractionDialog) + } + return dev.IsBootloaderMode() + }).Catch(func(err error) error { + deviceFailed(err) + return err + }).Await() + if err == skyWallet.ErrNoDeviceConnected || isBootloader.(bool) { + return + } + dev.FirstAddress(skyWallet.WalletTypeDeterministic).Then(func(data interface{}) interface{} { + wlt, err := walletManager.WalletEnv.LookupWallet(data.(string)) + logError(err) + registerWlt(wlt) + return dev.FirstAddress(skyWallet.WalletTypeBip44) + }).Then(func(data interface{}) interface{} { + wlt, err := walletManager.WalletEnv.LookupWallet(data.(string)) + logError(err) + registerWlt(wlt) + return data + }).Catch(func(err error) error { + deviceFailed(err) + return err + }).Await() + dev.ShouldBeInitialized().Then(func(data interface{}) interface{} { + if data.(bool) { + openDialog(qmlDevI.InitializeDevice) + } + return dev.ShouldBeSecured() + }).Then(func(data interface{}) interface{} { + if data.(bool) { + openDialog(qmlDevI.SecureDevice) + } + return data + }).Catch(func(err error) error { + deviceFailed(err) + return err + }).Await() + } + go func() { + for { + hwConnectedOn = []int{} + blockingCheck() + time.Sleep(time.Millisecond * 500) + } + }() +} + +func (walletModel *WalletModel) updateWallet(fn string) { + index := &core.QModelIndex{} + for row := 0; row < walletModel.rowCount(core.NewQModelIndex()); row++ { + index = walletModel.Index(row, 0, core.NewQModelIndex()) + fileName := walletModel.data(index, FileName) + if fileName.ToString() == fn { + hwConnectedOn = append(hwConnectedOn, row) + walletModel.DataChanged(index, index, []int{HasHardwareWallet}) + break + } + } +} + +func (walletModel *WalletModel) changeExpanded(id string) { + w := walletModel.walletByName[id] + w.SetExpand(!w.IsExpand()) } func (walletModel *WalletModel) data(index *core.QModelIndex, role int) *core.QVariant { - logWalletsModel.Info("Loading data for index") if !index.IsValid() { return core.NewQVariant() } @@ -104,6 +314,18 @@ func (walletModel *WalletModel) data(index *core.QModelIndex, role int) *core.QV { return core.NewQVariant1(w.FileName()) } + case HasHardwareWallet: + { + valInSlice := func() bool { + for idx := range hwConnectedOn { + if hwConnectedOn[idx] == index.Row() && hadHwConnected { + return true + } + } + return false + } + return core.NewQVariant1(valInSlice()) + } case Expand: { return core.NewQVariant1(w.IsExpand()) @@ -179,6 +401,7 @@ func (walletModel *WalletModel) addWallet(w *QWallet) { if w.Pointer() == nil { return } + walletModel.walletByName[w.FileName()] = w walletModel.BeginInsertRows(core.NewQModelIndex(), len(walletModel.Wallets()), len(walletModel.Wallets())) qml.QQmlEngine_SetObjectOwnership(w, qml.QQmlEngine__CppOwnership) walletModel.SetWallets(append(walletModel.Wallets(), w)) @@ -188,16 +411,18 @@ func (walletModel *WalletModel) addWallet(w *QWallet) { func (walletModel *WalletModel) editWallet(row int, name string, encrypted bool, sky string, coinHours string) { logWalletsModel.Info("Edit Wallet") - pIndex := walletModel.Index(row, 0, core.NewQModelIndex()) - - walletModel.setData(pIndex, core.NewQVariant1(name), Name) + pIndex := walletModel.Index(0, 0, core.NewQModelIndex()) + lIndex := walletModel.Index(len(walletModel.Wallets())-1, 0, core.NewQModelIndex()) + w := walletModel.Wallets()[row] + w.SetName(name) if encrypted { - walletModel.setData(pIndex, core.NewQVariant1(1), EncryptionEnabled) + w.SetEncryptionEnabled(1) } else { - walletModel.setData(pIndex, core.NewQVariant1(0), EncryptionEnabled) + w.SetEncryptionEnabled(0) } - walletModel.setData(pIndex, core.NewQVariant1(sky), Sky) - walletModel.setData(pIndex, core.NewQVariant1(coinHours), CoinHours) + w.SetSky(sky) + w.SetCoinHours(coinHours) + walletModel.DataChanged(pIndex, lIndex, []int{Name, EncryptionEnabled, Sky, CoinHours}) } func (walletModel *WalletModel) removeWallet(row int) { @@ -209,19 +434,19 @@ func (walletModel *WalletModel) removeWallet(row int) { } func (walletModel *WalletModel) updateModel(wallets []*QWallet) { - go func() { - for i, wlt := range wallets { - walletModel.editWallet(i, wlt.Name(), wlt.EncryptionEnabled() == 1, wlt.Sky(), wlt.CoinHours()) - } - }() + for i, wlt := range wallets { + walletModel.editWallet(i, wlt.Name(), wlt.EncryptionEnabled() == 1, wlt.Sky(), wlt.CoinHours()) + } } func (walletModel *WalletModel) loadModel(wallets []*QWallet) { logWalletsModel.Info("Loading wallets") for _, wlt := range wallets { - //wallets[i].SetSky(58) qml.QQmlEngine_SetObjectOwnership(wlt, qml.QQmlEngine__CppOwnership) } + for _, w := range wallets { + walletModel.walletByName[w.FileName()] = w + } walletModel.BeginResetModel() walletModel.SetWallets(wallets) diff --git a/src/params/params.go b/src/params/params.go index 02d80422..9c1582b9 100644 --- a/src/params/params.go +++ b/src/params/params.go @@ -2,5 +2,10 @@ package params const ( // Default refresh timeout for API data - DataRefreshTimeout = 1000000 //FIXME: set correct value + DataRefreshTimeout = 10 + DataUpdateTime = 5 + OrganizationName = "Simelo.Tech" + OrganizationDomain = "simelo.tech" + ApplicationName = "FiberCryptoWallet" + ApplicationVersion = "0.27.0" ) diff --git a/src/ui/AddressBook.qml b/src/ui/AddressBook.qml new file mode 100644 index 00000000..5354450b --- /dev/null +++ b/src/ui/AddressBook.qml @@ -0,0 +1,300 @@ +import QtQuick 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Controls.Material 2.12 +import QtQuick.Layouts 1.12 +import AddrsBookManager 1.0 + +// Resource imports +// import "qrc:/ui/src/ui/Delegates" +// import "qrc:/ui/src/ui/Dialogs" +import "Delegates/" // For quick UI development, switch back to resources when making a release +import "Dialogs/" // For quick UI development, switch back to resources when making a release + +Page { + id: addressBook + + enum SecurityType { LowSecurity, MediumSecurity, StrongSecurity } + + signal canceled() + +// property int currentContact: -1 + property int secType + property string password + + Component.onCompleted: { + if (abm.hasInit()) { + if (abm.getSecType() !== AddressBook.SecurityType.StrongSecurity) { + abm.loadContacts() + } else { + getpass.open() + } + } else { + dialogCreateAddrsBk.open() + } + } + + ScrollView { + anchors.fill: parent + clip: true + + ListView { + id: addrsBook + + model: abm + delegate: ContactDelegate { + id: contactDelegate + width: parent.width + + onClicked: { + dialogShowContact.name = name + dialogShowContact.addressModel = address + dialogShowContact.open() + } + + onEditRequested: { + contactDialog.isEdit = true + contactDialog.name = name + contactDialog.index = index + contactDialog.cId = id + contactDialog.addressModel = address + contactDialog.open() + } + + onDeleteRequested: { + dialogConfirmation.index = index + dialogConfirmation.cId = id + dialogConfirmation.name = name + dialogConfirmation.open() + } + + MouseArea { + anchors.fill: parent + acceptedButtons: Qt.RightButton + + onClicked: { + menu.index = index + menu.cId = id + menu.name = name + menu.address = address + menu.popup() + } + } + } + + section.property: "name" + section.criteria: ViewSection.FirstCharacter + section.delegate: SectionDelegate { + width: addrsBook.width + } + } + } // ScrollView + + RoundButton { + anchors.margins: 10 + anchors.right: parent.right + anchors.bottom: parent.bottom + icon.source: "qrc:/images/resources/images/icons/add.svg" + highlighted: true + onClicked: { + contactDialog.isEdit = false + contactDialog.open() + } + } //RoundButton + + AddrsBookModel { + id: abm + } + + Menu { + id: menu + + property int index: -1 + property int cId: -1 + property string name + property AddrsBkAddressModel address + + MenuItem { + text: qsTr("&View") + icon.source: "qrc:/images/resources/images/icons/visibleOn.svg" + onTriggered: { + dialogShowContact.name = menu.name + dialogShowContact.addressModel = menu.address + dialogShowContact.open() + } + } + + MenuSeparator {} + + MenuItem { + text: qsTr("&Edit") + icon.source: "qrc:/images/resources/images/icons/edit.svg" + onTriggered: { + contactDialog.isEdit = true + contactDialog.open() + } + } + + MenuSeparator {} + + MenuItem { + text: qsTr("&Remove") + icon.source: "qrc:/images/resources/images/icons/delete.svg" + icon.color: Material.accent + Material.accent: Material.Red + + onTriggered: { + dialogConfirmation.index = menu.index + dialogConfirmation.cId = menu.cId + dialogConfirmation.name = menu.name + dialogConfirmation.open() + } + } + } // Menu + + DialogAddContact { + id: contactDialog + + anchors.centerIn: Overlay.overlay + width: applicationWindow.width > 540 ? 540 : applicationWindow.width + height: applicationWindow.height > 640 ? 640 : applicationWindow.height + + focus: visible + modal: true + + onAccepted: { + for (var i = 0; i < listModelAddresses.count; i++) { + abm.addAddress(listModelAddresses.get(i).value, listModelAddresses.get(i).coinType) + } + if (isEdit) { + abm.editContact(index, cId, name) + } else { + abm.newContact(name) + } + } + } + + DialogSelectSecType { + id: dialogCreateAddrsBk + + anchors.centerIn: Overlay.overlay + width: applicationWindow.width > 480 ? 480 - 40 : applicationWindow.width - 40 + height: applicationWindow.height > 400 ? 400 - 40 : applicationWindow.height - 40 + + title: qsTr("Initial setup") + focus: visible + modal: true + + onAccepted: { + secType = select + if (secType === AddressBook.SecurityType.StrongSecurity) { + setpass.open() + } else { + abm.initAddrsBook(secType, "") + } + } + + onRejected: { + canceled() + } + } + + DialogSetPassword { + id: setpass + + anchors.centerIn: Overlay.overlay + width: applicationWindow.width > 400 ? 400 - 40 : applicationWindow.width - 40 + height: applicationWindow.height > implicitHeight + 40 ? implicitHeight : applicationWindow.height - 40 + + focus: visible + modal: true + + onAccepted: { + abm.initAddrsBook(AddressBook.SecurityType.StrongSecurity, setpass.password) + } + + onRejected: { + canceled() + } + } + + DialogGetPassword { + id: getpass + + anchors.centerIn: Overlay.overlay + width: applicationWindow.width > 400 ? 400 - 40 : applicationWindow.width - 40 + height: applicationWindow.height > implicitHeight + 40 ? implicitHeight : applicationWindow.height - 40 + + modal: true + focus: visible + + onAccepted: { + if (!abm.authenticate(getpass.password)) { + getpass.open() + } else { + abm.loadContacts() + } + } + + onRejected:{ + canceled() + } + } + + DialogShowContact { + id: dialogShowContact + + anchors.centerIn: Overlay.overlay + width: applicationWindow.width > 400 ? 400 - 40 : applicationWindow.width - 40 + height: applicationWindow.height > 440 ? 440 - 40 : applicationWindow.height - 40 + + modal: true + focus: visible + } + + Dialog { + id: dialogConfirmation + + property int index: -1 + property int cId: -1 + property string name + + anchors.centerIn: Overlay.overlay + width: applicationWindow.width > 300 ? 300 - 40 : applicationWindow.width - 40 + + standardButtons: Dialog.Ok | Dialog.Cancel + title: qsTr("Confirm action") + modal: true + focus: visible + + RowLayout { + width: parent.width + spacing: 30 + + Image { + id: icon + source: "qrc:/images/resources/images/icons/trash.svg" + sourceSize: "64x64" + Layout.alignment: Qt.AlignLeft | Qt.AlignTop + } + + Label { + id: labelQuestion + + Layout.fillWidth: true + text: qsTr("Delete contact %1?").arg(dialogConfirmation.name) + wrapMode: Text.Wrap + font.italic: true + } + } + + Component.onCompleted: { + standardButton(Dialog.Ok).Material.accent = Material.Red + standardButton(Dialog.Ok).highlighted = true + standardButton(Dialog.Ok).text = qsTr("Delete") + } + + onAccepted: { + abm.removeContact(dialogConfirmation.index, dialogConfirmation.cId) + } + } // Dialog +} diff --git a/src/ui/Blockchain.qml b/src/ui/Blockchain.qml index 20e63f06..76cad7ae 100644 --- a/src/ui/Blockchain.qml +++ b/src/ui/Blockchain.qml @@ -8,7 +8,6 @@ Page { id: blockchain property BlockchainStatusModel model: null - onModelChanged: console.log("Model changed") property string numberOfBlocks: model.numberOfBlocks property date timestampLastBlock: model.timestampLastBlock diff --git a/src/ui/CustomMenuBar.qml b/src/ui/CustomMenuBar.qml index 127d3d4c..e012f56f 100755 --- a/src/ui/CustomMenuBar.qml +++ b/src/ui/CustomMenuBar.qml @@ -16,16 +16,21 @@ RowLayout { property alias enableBlockchain: menuItemBlockchain.enabled property alias enableNetworking: menuItemNetworking.enabled property alias enableSettings: menuItemSettings.enabled + property alias enableSettingsAddressBook: toolButtonSettingsAddressBook.enabled + property alias enableAddrsBook: menuItemAddressBook.enabled // Signals signal outputsRequested() signal pendingTransactionsRequested() signal networkingRequested() signal settingsRequested() + signal settingsAddressBookRequested() signal blockchainRequested() signal aboutRequested() signal aboutQtRequested() signal licenseRequested() + signal addressBookRequested() + // Functions function back() { @@ -71,6 +76,11 @@ RowLayout { enableBlockchain = true enableNetworking = true enableSettings = true + enableAddrsBook = generalStackView.depth <= 1 + enableSettingsAddressBook = generalStackView.depth > 1 + if (generalStackView.depth > 1) { + customHeader.text = qsTr("Address book") + } } } @@ -83,8 +93,9 @@ RowLayout { Layout.fillWidth: true topInset: -1 - leftInset: -(toolButtonBack.width + toolButtonBack.padding) - rightInset: -(toolButtonTheme.width + toolButtonTheme.padding) + leftInset: (backButtonHide ? 0 : -(toolButtonBack.width + toolButtonBack.padding)) + rightInset: (toolButtonTheme.visible ? -(toolButtonTheme.width + toolButtonTheme.padding) : 0) + + (toolButtonSettingsAddressBook.visible ? -(toolButtonBack.width + toolButtonBack.padding) : 0) Material.foreground: menuTextColor Behavior on menuTextColor { ColorAnimation { } } @@ -128,6 +139,13 @@ RowLayout { onClicked: networkingRequested() } + CustomMenuItem { + id: menuItemAddressBook + text: qsTr("&Address Book") + iconSource: "qrc:/images/resources/images/icons/contacts.svg" + + onClicked: addressBookRequested() + } CustomMenuItem { id: menuItemSettings text: qsTr("&Settings") @@ -152,7 +170,7 @@ RowLayout { CustomMenuItem { text: "English" - iconSource: "qrc:/images/resources/images/icons/country-flags/united states.svg" + iconSource: "qrc:/images/resources/images/icons/country-flags/united_states.svg" onClicked: { /* nothing to do (for now) */ } } @@ -188,6 +206,24 @@ RowLayout { } // menuHelp } // menuBarReal + ToolButton { + id: toolButtonSettingsAddressBook + + // positioning + Layout.alignment: Qt.AlignVCenter | Qt.AlignRight + + visible: opacity > 0 + opacity: enabled ? 1.0 : 0.0 + enabled: false + Behavior on opacity { NumberAnimation { duration: 500 } } + + // icon + icon.source: "qrc:/images/resources/images/icons/settings.svg" + icon.color: menuBarReal.Material.foreground + + onClicked: settingsAddressBookRequested() + } + ToolButton { id: toolButtonTheme diff --git a/src/ui/Delegates/AddressListDelegate.qml b/src/ui/Delegates/AddressListDelegate.qml new file mode 100644 index 00000000..66ce4f3a --- /dev/null +++ b/src/ui/Delegates/AddressListDelegate.qml @@ -0,0 +1,117 @@ +import QtQuick 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Controls.Material 2.12 +import QtQuick.Layouts 1.12 + +// Resource imports +// import "qrc:/ui/src/ui/" +// import "qrc:/ui/src/ui/Controls" +// import "qrc:/ui/src/ui" +import "../" // For quick UI development, switch back to resources when making a release +import "../Controls" // For quick UI development, switch back to resources when making a release + +Item { + id: addressListDelegate + + signal qrCodeRequested(var data) + signal addressTextChanged(string text) + signal numberOfAddressesChanged(int count) + + onQrCodeRequested: { + dialogQR.setVars(data) + dialogQR.open() + } + + implicitHeight: rootLayout.height + clip: true + + RowLayout { + id: rootLayout + width: addressListDelegate.width + clip: true + spacing: 20 + opacity: 0.0 + + Component.onCompleted: { opacity = 1.0 } // Not the best way to do this + Behavior on opacity { NumberAnimation { duration: 500; easing.type: Easing.OutQuint } } + + RowLayout { + Layout.fillWidth: true + spacing: 8 + + ToolButtonQR { + id: toolButtonQR + + iconSize: "24x24" + + onClicked: { + qrCodeRequested(value) + } + } + + TextField { + id: tfAddr + font.family: "Code New Roman" + placeholderText: qsTr("Address No.") + " " + (index + 1) + text: value ? value : "" + selectByMouse: true + Layout.fillWidth: true + Material.accent: abm.addressIsValid(text) ? parent.Material.accent : Material.color(Material.Red) + onTextChanged: { + value = text + addressTextChanged(text) + } + } + } // RowLayout + + RowLayout { + ComboBox { + id: cbCoinTypes + model: coins + currentIndex: getIndexForCoinType(coinType) + onCurrentTextChanged: { + coinType = cbCoinTypes.currentText + } + } + } + + ToolButton { + id: toolButtonAddRemoveDestination + // The 'accent' attribute is used for button highlighting + Material.accent: index === 0 ? Material.Teal : Material.Red + icon.source: "qrc:/images/resources/images/icons/" + (index === 0 ? "add" : "remove") + "-circle.svg" + highlighted: true // enable the usage of the `Material.accent` attribute + + Layout.alignment: Qt.AlignRight + + onClicked: { + if (index === 0) { + listModelAddresses.append( { "address": "", "coinType": "" } ) + } else { + listModelAddresses.remove(index) + } + numberOfAddressesChanged(listModelAddresses.count) + } + } // ToolButton + } // RowLayout (rootLayout) + + ListModel { + id:coins + ListElement{ + type:"SKY" + } + // ListElement{ + // type:"BTC" + // } + } + + function getIndexForCoinType(coinType) { + var index = 0; + for(var i = 0; i < coins.count; i++) { + if (coins.get(i).type === coinType) { + index = i + } + } + return index; + } +} diff --git a/src/ui/Delegates/ContactDelegate.qml b/src/ui/Delegates/ContactDelegate.qml new file mode 100644 index 00000000..5ec7955e --- /dev/null +++ b/src/ui/Delegates/ContactDelegate.qml @@ -0,0 +1,41 @@ +import QtQuick 2.12 +import QtQuick.Layouts 1.12 +import QtQuick.Controls 2.12 +import QtQuick.Controls.Material 2.12 +import "../Dialogs" + +ItemDelegate { + id: contactDelegate + + signal editRequested() + signal deleteRequested() + + contentItem: RowLayout { + spacing: 20 + Image { + Layout.alignment: Qt.AlignLeft | Qt.AlignVCenter + source: "qrc:/images/resources/images/icons/user.svg" + sourceSize: "24x24" + } + Label { + Layout.fillWidth: true + text: name + font.bold: true + elide: Text.ElideRight + } + ToolButton { + id: toolButtonEdit + icon.source: "qrc:/images/resources/images/icons/edit.svg" + + onClicked: editRequested() + } + ToolButton { + id: toolButtonDelete + icon.source: "qrc:/images/resources/images/icons/delete.svg" + icon.color: Material.accent + Material.accent: Material.Red + + onClicked: deleteRequested() + } + } +} diff --git a/src/ui/Delegates/DestinationListDelegate.qml b/src/ui/Delegates/DestinationListDelegate.qml index f276ea52..62b6e49d 100644 --- a/src/ui/Delegates/DestinationListDelegate.qml +++ b/src/ui/Delegates/DestinationListDelegate.qml @@ -2,17 +2,21 @@ import QtQuick 2.12 import QtQuick.Controls 2.12 import QtQuick.Controls.Material 2.12 import QtQuick.Layouts 1.12 +import AddrsBookManager 1.0 // Resource imports -// import "qrc:/ui/src/ui/" -// import "qrc:/ui/src/ui/Controls" // import "qrc:/ui/src/ui" +// import "qrc:/ui/src/ui/Controls" +// import "qrc:/ui/src/ui/Dialogs" import "../" // For quick UI development, switch back to resources when making a release import "../Controls" // For quick UI development, switch back to resources when making a release +import "../Dialogs" // For quick UI development, switch back to resources when making a release Item { id: root + enum SecurityType { LowSecurity, MediumSecurity, StrongSecurity } + signal qrCodeRequested(var data) onQrCodeRequested: { @@ -20,6 +24,18 @@ Item { dialogQR.open() } + function getAddressList() { + contactAddrsModel.clear() + for(var i = 0; i < abm.count; i++){ + for(var j = 0; j < abm.contacts[i].address.address.length; j++){ + contactAddrsModel.append( { + name: abm.contacts[i].name, + address: abm.contacts[i].address.address[j].value, + coinType: abm.contacts[i].address.address[j].coinType + }) + } + } + } implicitHeight: rootLayout.height clip: true @@ -34,6 +50,21 @@ Item { // TODO: Use `add`, `remove`, etc. transitions Component.onCompleted: { opacity = 1.0 } // Not the best way to do this Behavior on opacity { NumberAnimation { duration: 500; easing.type: Easing.OutQuint } } + Button { + id: buttonSelectCustomChangeAddress + text: qsTr("Select") + flat: true + highlighted: true + + onClicked: { + if (abm.getSecType() !== DestinationListDelegate.SecurityType.StrongSecurity) { + abm.loadContacts() + dialogSelectAddressByAddressBook.open() + } else { + getpass.open() + } + } + } RowLayout { Layout.fillWidth: true @@ -56,8 +87,10 @@ Item { text: address selectByMouse: true Layout.fillWidth: true + Material.accent: abm.addressIsValid(text) ? parent.Material.accent : Material.color(Material.Red) onTextChanged: address = text } + } // RowLayout RowLayout { @@ -113,4 +146,52 @@ Item { } // ToolButton (Add/Remove) } // RowLayout (rootLayout) + + DialogGetPassword { + id: getpass + + anchors.centerIn: Overlay.overlay + width: applicationWindow.width > 400 ? 400 - 40 : applicationWindow.width - 40 + height: applicationWindow.height > 280 ? 280 - 40 : applicationWindow.height - 40 + + modal: true + focus: visible + + onAccepted: { + if (!abm.authenticate(getpass.password)) { + getpass.open() + } else { + abm.loadContacts() + dialogSelectAddressByAddressBook.open() + } + } + } + + DialogSelectAddressByAddressBook { + id: dialogSelectAddressByAddressBook + + anchors.centerIn: Overlay.overlay + width: applicationWindow.width > 540 ? 540 - 40 : applicationWindow.width - 40 + height: applicationWindow.height - 40 + + focus: visible + modal: true + + listAddrsModel: contactAddrsModel + onAboutToShow: { + getAddressList() + } + + onAccepted: { + textFieldDestinationAddress.text = selectedAddress + } + } + + ListModel { + id: contactAddrsModel + } + + AddrsBookModel { + id: abm + } } diff --git a/src/ui/Delegates/HistoryFilterListDelegate.qml b/src/ui/Delegates/HistoryFilterListDelegate.qml index 516561d0..7f8cf792 100644 --- a/src/ui/Delegates/HistoryFilterListDelegate.qml +++ b/src/ui/Delegates/HistoryFilterListDelegate.qml @@ -11,11 +11,12 @@ import "../" // For quick UI development, switch back to resources when making a Item { id: root - readonly property real addressListHeight: listViewFilterAddress.height property alias tristate: checkDelegate.tristate property alias walletText: checkDelegate.text clip: true + implicitWidth: width + implicitHeight: height width: 300 height: checkDelegate.height + columnLayout.spacing + listViewFilterAddress.height @@ -65,7 +66,7 @@ Item { model: listAddresses Layout.fillWidth: true - height: contentHeight + implicitHeight: contentHeight interactive: false @@ -80,26 +81,33 @@ Item { } } - onAllCheckedChanged: { - if (listViewFilterAddress.allChecked) { - listViewFilterAddress.listAddresses.editAddress(index, address, sky, coinHours, 1) - } else { - listViewFilterAddress.listAddresses.editAddress(index, address, sky, coinHours, 0) - } - } + Component.onCompleted: { modelManager.setWalletManager(walletManager) listAddresses = modelManager.getAddressModel(fileName) } + + delegate: HistoryFilterListAddressDelegate { // BUG: Checking the wallet does not change the check state of addresses // Is `checked: marked` ok? Or it should be the opposite? - checked: true + checked: marked width: parent.width text: address - + Connections{ + target: listViewFilterAddress + onAllCheckedChanged: { + if (listViewFilterAddress.allChecked) { + historyManager.addFilter(address) + } else { + historyManager.removeFilter(address) + } + walletManager.editMarkAddress(address, listViewFilterAddress.allChecked) + listViewFilterAddress.listAddresses.editAddress(index, address, sky, coinHours, listViewFilterAddress.allChecked) + } + } onCheckedChanged: { ListView.view.checkedDelegates += checked ? 1: -1 @@ -108,7 +116,9 @@ Item { } else { historyManager.removeFilter(address) } + walletManager.editMarkAddress(address, checked) listViewFilterAddress.listAddresses.editAddress(index, address, sky, coinHours, checked) + } } // HistoryFilterListAddressDelegate (delegate) } // ListView diff --git a/src/ui/Delegates/HistoryListDelegate.qml b/src/ui/Delegates/HistoryListDelegate.qml index f8e2d838..7213a26c 100644 --- a/src/ui/Delegates/HistoryListDelegate.qml +++ b/src/ui/Delegates/HistoryListDelegate.qml @@ -82,10 +82,10 @@ ItemDelegate { ListView { Layout.alignment: Qt.AlignLeft - height: contentItem.height + height: contentHeight id: listViewAddresses model: modelAddresses - delegate: TransactionAddressDelegate {} + delegate: TransactionAddressDelegate {} } } // ColumnLayout (main content) diff --git a/src/ui/Delegates/SectionDelegate.qml b/src/ui/Delegates/SectionDelegate.qml new file mode 100644 index 00000000..4db1eaff --- /dev/null +++ b/src/ui/Delegates/SectionDelegate.qml @@ -0,0 +1,22 @@ +import QtQuick 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Controls.Material 2.12 +import QtQuick.Layouts 1.12 +ColumnLayout{ +RowLayout{ + Label { + Layout.leftMargin: 5 + id: label + text: section + Layout.fillWidth: true + } + } + RowLayout{ + Rectangle { + id: rect + Layout.fillWidth: true + height: 1 + color: "#DDDDDD" + } + } + } diff --git a/src/ui/Delegates/WalletListAddressDelegate.qml b/src/ui/Delegates/WalletListAddressDelegate.qml index e43cc783..3d2055a5 100644 --- a/src/ui/Delegates/WalletListAddressDelegate.qml +++ b/src/ui/Delegates/WalletListAddressDelegate.qml @@ -16,6 +16,7 @@ Item { signal addAddressesRequested() signal editWalletRequested() + signal toggleEncryptionRequested() signal qrCodeRequested(var data) Component.onCompleted: { @@ -71,7 +72,7 @@ Item { } ToolButton { id: buttonToggleEncryption - text: qsTr(checked ? "Decrypt wallet" : "Encrypt wallet") + text: checked ? qsTr("Decrypt wallet") : qsTr("Encrypt wallet") checkable: true checked: encryptionEnabled icon.source: "qrc:/images/resources/images/icons/lock" + (checked ? "On" : "Off") + ".svg" @@ -79,33 +80,19 @@ Item { Material.foreground: Material.Grey Layout.fillWidth: true - onCheckedChanged:{ + onCheckedChanged: { checked = encryptionEnabled text = checked ? "Decrypt wallet" : "Encrypt wallet" } - //Connections{ - // target: - // onDataChanged:{ - // checked = encryptionEnabled - // } - //} - //Component.onCompleted:{ - // console.log(root.ListView.view.parentRoot.ListView.view.model) - //} - Connections{ + + Connections { target: root.ListView.view.parentRoot.ListView.view.model - onDataChanged:{ + onDataChanged: { buttonToggleEncryption.checked = encryptionEnabled } } onClicked:{ - if (checked) { - dialogGetPassword.open() - // TODO Encrypt wallet -// var encrypt = walletManager.decryptWallet(, dialogGetPassword.password) - } else{ - dialogSetPassword.open() - } + toggleEncryptionRequested() } } ToolButton { @@ -200,10 +187,20 @@ Item { Label { id: labelAddressSky visible: !showOnlyAddresses - text: addressSky // a role of the model color: Material.accent horizontalAlignment: Text.AlignRight Layout.preferredWidth: internalLabelsWidth + + text: addressSky === qsTr("N/A") ? "" : addressSky // a role of the model + + BusyIndicator { + anchors.verticalCenter: parent.verticalCenter + anchors.right: parent.right + running: addressSky === qsTr("N/A") ? true : false + + implicitWidth: implicitHeight + implicitHeight: parent.height + 10 + } } Label { diff --git a/src/ui/Delegates/WalletListDelegate.qml b/src/ui/Delegates/WalletListDelegate.qml index 3ca56f04..133fa8b3 100644 --- a/src/ui/Delegates/WalletListDelegate.qml +++ b/src/ui/Delegates/WalletListDelegate.qml @@ -42,6 +42,18 @@ Item { anchors.rightMargin: listWalletRightMargin spacing: listWalletSpacing + Rectangle { + width: 10 + height: 6 + visible: hasHardwareWallet + color: "red" + MouseArea { + anchors.fill: parent + onClicked: { + skyWalletInteractionDialog.open() + } + } + } Image { id: status source: statusIcon @@ -75,10 +87,18 @@ Item { Label { id: labelSky - text: sky // a role of the model + text: sky === qsTr("N/A") ? "" : sky // a role of the model color: Material.accent horizontalAlignment: Text.AlignRight Layout.preferredWidth: internalLabelsWidth + BusyIndicator { + anchors.verticalCenter: parent.verticalCenter + anchors.right: parent.right + running: sky === qsTr("N/A") ? true : false + + implicitWidth: implicitHeight + implicitHeight: parent.height + 10 + } } Label { @@ -92,6 +112,7 @@ Item { onClicked: { expanded = !expanded + walletModel.changeExpanded(fileName) } } // ItemDelegate @@ -121,6 +142,14 @@ Item { dialogEditWallet.name = name dialogEditWallet.open() } + onToggleEncryptionRequested: { + if (encryptionEnabled) { + dialogGetPassword.addAddress = false + dialogGetPassword.open() + } else { + dialogSetPassword.open() + } + } } } // ListView @@ -134,54 +163,43 @@ Item { focus: true onAccepted: { - if (encryptionEnabled){ - dialogGetPasswordForAddAddresses.title = "Enter Password" - dialogGetPasswordForAddAddresses.height = dialogGetPassword.height - 20 - dialogGetPasswordForAddAddresses.nAddress = spinValue - dialogGetPasswordForAddAddresses.open() - - - } else{ + if (encryptionEnabled) { + dialogGetPassword.addAddress = true + dialogGetPassword.title = qsTr("Enter Password") + dialogGetPassword.nAddress = spinValue + dialogGetPassword.open() + } else { walletManager.newWalletAddress(fileName, spinValue, "") listAddresses.loadModel(walletManager.getAddresses(fileName)) } - - - } - onRejected: { - console.log("Adding rejected") } } // DialogAddAddresses - DialogGetPassword { - id: dialogGetPasswordForAddAddresses - anchors.centerIn: Overlay.overlay - property int nAddress - width: applicationWindow.width > 540 ? 540 - 120 : applicationWindow.width - 40 - height: applicationWindow.height > 570 ? 570 - 180 : applicationWindow.height - 40 - - focus: true - modal: true - - onAccepted: { - walletManager.newWalletAddress(fileName, nAddress, dialogGetPasswordForAddAddresses.password) - listAddresses.loadModel(walletManager.getAddresses(fileName)) - } - } DialogGetPassword { id: dialogGetPassword + property bool addAddress: false + property int nAddress + anchors.centerIn: Overlay.overlay - width: applicationWindow.width > 440 ? 440 - 40 : applicationWindow.width - 40 - height: applicationWindow.height > 320 ? 320 - 40 : applicationWindow.height - 40 + width: applicationWindow.width > 400 ? 400 - 40 : applicationWindow.width - 40 + height: applicationWindow.height > implicitHeight + 40 ? implicitHeight : applicationWindow.height - 40 - headerMessage: qsTr("Warning: for security reasons, it is not recommended to keep the wallets unencrypted. Caution is advised.") - headerMessageColor: Material.color(Material.Red) - focus: true + headerMessage: addAddress ? "" : qsTr("Warning: for security reasons, it is not recommended to keep the wallets unencrypted. Caution is advised.") + Material.primary: Material.Red + headerMessageColor: Material.primary + + focus: visible modal: true + onAccepted: { - var isEncrypted = walletManager.decryptWallet(fileName, password) - walletModel.editWallet(index, name, isEncrypted, sky, coinHours) + if (addAddress) { + walletManager.newWalletAddress(fileName, nAddress, password) + listAddresses.loadModel(walletManager.getAddresses(fileName)) + } else { + var isEncrypted = walletManager.decryptWallet(fileName, password) + walletModel.editWallet(index, name, isEncrypted, sky, coinHours) + } } } @@ -189,12 +207,13 @@ Item { id: dialogSetPassword anchors.centerIn: Overlay.overlay - width: applicationWindow.width > 540 ? 540 - 40 : applicationWindow.width - 40 + width: applicationWindow.width > 400 ? 400 - 40 : applicationWindow.width - 40 height: applicationWindow.height > implicitHeight + 40 ? implicitHeight : applicationWindow.height - 40 - headerMessage: qsTr("We suggest that you encrypt each one of your wallets with a password. If you forget your password, you can reset it with your seed. Make sure you have your seed saved somewhere safe before encrypting your wallet.") - headerMessageColor: Material.color(Material.Red) - focus: true + headerMessage: qsTr("Warning: We suggest that you encrypt each one of your wallets with a password. If you forget your password, you can reset it with your seed. Make sure you have your seed saved somewhere safe before encrypting your wallet.") + headerMessageColor: Material.primary + Material.primary: Material.Red + focus: visible modal: true onAccepted: { @@ -222,17 +241,19 @@ Item { AddressModel { id: listAddresses - property Timer timer: Timer { - id: addressModelTimer - interval: 7000 - repeat: true - running: true - onTriggered: { - listAddresses.updateModel(fileName); - } - } + // property Timer timer: Timer { + // id: addressModelTimer + // interval: 3000 + // repeat: true + // running: true + // onTriggered: { + // listAddresses.updateModel(fileName); + // } + // } } Component.onCompleted: { - listAddresses.updateModel(fileName); + //listAddresses.updateModel(fileName); + listAddresses.updateModel(fileName) + listAddresses.suscribe(fileName) } } diff --git a/src/ui/Dialogs/DialogAddContact.qml b/src/ui/Dialogs/DialogAddContact.qml new file mode 100644 index 00000000..9a70e7fa --- /dev/null +++ b/src/ui/Dialogs/DialogAddContact.qml @@ -0,0 +1,108 @@ +import QtQuick 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Controls.Material 2.12 +import QtQuick.Layouts 1.12 + + +import AddrsBookManager 1.0 + +// Resource imports +// import "qrc:/ui/src/ui/Controls" +// import "qrc:/ui/src/ui" +// import "qrc:/ui/src/ui/Delegates" +import "../Controls" // For quick UI development, switch back to resources when making a release +import "../" // For quick UI development, switch back to resources when making a release +import "../Delegates" // For quick UI development, switch back to resources when making a release + +Dialog { + id: dialogAddContact + + property alias name: textFieldName.text + property int index: -1 + property int cId: -1 + property AddrsBkAddressModel addressModel + property alias listModelAddresses: listModelAddresses + property bool isEdit: false + + title: isEdit ? qsTr("Edit contact") : qsTr("Add contact") + standardButtons: Dialog.Save | Dialog.Cancel + + Component.onCompleted: { + standardButton(Dialog.Save).enabled = false + standardButton(Dialog.Save).text = Qt.binding( function() { return isEdit ? qsTr("Save") : qsTr("Add") } ) + } + + onAboutToShow: { + listModelAddresses.clear() + if (isEdit) { + for (var i = 0; i < addressModel.rowCount(); i++) { + listModelAddresses.append( { + value: addressModel.address[i].value, + coinType: addressModel.address[i].coinType + }) + } + } else { + name = "" + listModelAddresses.append( { value: "", coinType: "" } ) + } + + updateAcceptButtonStatus() + } + + function updateAcceptButtonStatus() { + for (var i = 0; i < listModelAddresses.count; i++) { + if ( !(abm.addressIsValid(listModelAddresses.get(i).value)) || + name === "" || abm.nameExist(index, name) || + abm.addressExist(index, listModelAddresses.get(i).value, listModelAddresses.get(i).coinType)) { + standardButton(Dialog.Save).enabled = false + return + } + } + standardButton(Dialog.Save).enabled = true + } + + ColumnLayout { + anchors.fill: parent + + TextField { + id: textFieldName + Layout.fillWidth: true + + placeholderText: qsTr("Name") + selectByMouse: true + onTextChanged: { + updateAcceptButtonStatus() + } + } + + ScrollView { + id: scrollView + Layout.fillWidth: true + Layout.fillHeight: true + + ListView { + id: listViewDestinations + + interactive: false + clip: true + + model: listModelAddresses + + delegate: AddressListDelegate { + width: listViewDestinations.width + + onAddressTextChanged: { + updateAcceptButtonStatus() + } + onNumberOfAddressesChanged: { + updateAcceptButtonStatus() + } + } + } // ListView + } // ScrollView + } // ColumnLayout + + ListModel { + id: listModelAddresses + } +} \ No newline at end of file diff --git a/src/ui/Dialogs/DialogAddLoadWallet.qml b/src/ui/Dialogs/DialogAddLoadWallet.qml index cd0b807a..77b4cc67 100644 --- a/src/ui/Dialogs/DialogAddLoadWallet.qml +++ b/src/ui/Dialogs/DialogAddLoadWallet.qml @@ -32,7 +32,7 @@ Dialog { scanA = 10 } - walletModel.addWallet(walletManager.createEncryptedWallet(seed, name,textFieldPassword.text, comboBoxWalletType.model[comboBoxWalletType.currentIndex].name, scanA)) + walletModel.addWallet(walletManager.createEncryptedWallet(seed, name, comboBoxWalletType.model[comboBoxWalletType.currentIndex].name, textFieldPassword.text, scanA)) } else{ @@ -41,6 +41,7 @@ Dialog { } walletModel.addWallet(walletManager.createUnencryptedWallet(seed, name, comboBoxWalletType.model[comboBoxWalletType.currentIndex].name, scanA)) } + textFieldPassword.text = "" } function updateAcceptButtonStatus() { diff --git a/src/ui/Dialogs/DialogGetBip39Word.qml b/src/ui/Dialogs/DialogGetBip39Word.qml new file mode 100644 index 00000000..95b704f5 --- /dev/null +++ b/src/ui/Dialogs/DialogGetBip39Word.qml @@ -0,0 +1,2137 @@ +import QtQuick 2.12 +import QtQuick.Layouts 1.12 +import QtQuick.Controls 2.12 + +// Resource imports +// import "qrc:/ui/src/ui/" +import "../" // For quick UI development, switch back to resources when making a release + +Dialog { + id: dialogGetBip39Word + function clear(title, message) { + wordRequester.clear(); + dialogGetBip39Word.title = qsTr("Action required from device"); + msgTitle.text = "" + title + ""; + labelInstructions.text = message; + } + onRejected: { + bridgeForPassword.errMessage = qsTr("Action canceled"); + bridgeForPassword.unlock() + } + onAccepted: { + bridgeForPassword.setResult(wordRequester.text) + bridgeForPassword.unlock() + } + standardButtons: Dialog.Ok | Dialog.Cancel + + Flickable { + id: flickable + anchors.fill: parent + contentHeight: columnLayoutRoot.height + clip: true + + ColumnLayout { + id: columnLayoutRoot + width: parent.width + spacing: 50 + RowLayout { + id: rowLayoutIconMessage + spacing: 30 + + Image { + id: icon + source: "qrc:/images/resources/images/icons/backup.svg" + sourceSize: "64x64" + Layout.alignment: Qt.AlighLeft | Qt.AlignTop + } + + ColumnLayout { + id: columnLayoutMessage + Label { + id: msgTitle + text: "" + qsTr( "Enter the word indicated in the device") + "" + Layout.fillWidth: true + wrapMode: Text.WordWrap + Layout.alignment: Qt.AlignTop + } + + Label { + id: labelInstructions + text: qsTr("You will be asked to enter the words " + + "of your backup seed in random order, " + + "plus a few additinal words.") + Layout.fillWidth: true + wrapMode: Text.WordWrap + Layout.alignment: Qt.AlignTop + } + } // ColumnLayout (message) + } // RowLayout (icon + message) + + ColumnLayout { + Label { + id: labelHeaderMessage + text: qsTr("Word") + Layout.fillWidth: true + wrapMode: Text.WordWrap + } + + TextField { + id: wordRequester + placeholderText: qsTr("Enter word") + } + } + } // ColumnLayout (root) + } // Flickable + + ListModel { + id: bip39English + ListElement {value: "abandon"} + ListElement {value: "ability"} + ListElement {value: "able"} + ListElement {value: "about"} + ListElement {value: "above"} + ListElement {value: "absent"} + ListElement {value: "absorb"} + ListElement {value: "abstract"} + ListElement {value: "absurd"} + ListElement {value: "abuse"} + ListElement {value: "access"} + ListElement {value: "accident"} + ListElement {value: "account"} + ListElement {value: "accuse"} + ListElement {value: "achieve"} + ListElement {value: "acid"} + ListElement {value: "acoustic"} + ListElement {value: "acquire"} + ListElement {value: "across"} + ListElement {value: "act"} + ListElement {value: "action"} + ListElement {value: "actor"} + ListElement {value: "actress"} + ListElement {value: "actual"} + ListElement {value: "adapt"} + ListElement {value: "add"} + ListElement {value: "addict"} + ListElement {value: "address"} + ListElement {value: "adjust"} + ListElement {value: "admit"} + ListElement {value: "adult"} + ListElement {value: "advance"} + ListElement {value: "advice"} + ListElement {value: "aerobic"} + ListElement {value: "affair"} + ListElement {value: "afford"} + ListElement {value: "afraid"} + ListElement {value: "again"} + ListElement {value: "age"} + ListElement {value: "agent"} + ListElement {value: "agree"} + ListElement {value: "ahead"} + ListElement {value: "aim"} + ListElement {value: "air"} + ListElement {value: "airport"} + ListElement {value: "aisle"} + ListElement {value: "alarm"} + ListElement {value: "album"} + ListElement {value: "alcohol"} + ListElement {value: "alert"} + ListElement {value: "alien"} + ListElement {value: "all"} + ListElement {value: "alley"} + ListElement {value: "allow"} + ListElement {value: "almost"} + ListElement {value: "alone"} + ListElement {value: "alpha"} + ListElement {value: "already"} + ListElement {value: "also"} + ListElement {value: "alter"} + ListElement {value: "always"} + ListElement {value: "amateur"} + ListElement {value: "amazing"} + ListElement {value: "among"} + ListElement {value: "amount"} + ListElement {value: "amused"} + ListElement {value: "analyst"} + ListElement {value: "anchor"} + ListElement {value: "ancient"} + ListElement {value: "anger"} + ListElement {value: "angle"} + ListElement {value: "angry"} + ListElement {value: "animal"} + ListElement {value: "ankle"} + ListElement {value: "announce"} + ListElement {value: "annual"} + ListElement {value: "another"} + ListElement {value: "answer"} + ListElement {value: "antenna"} + ListElement {value: "antique"} + ListElement {value: "anxiety"} + ListElement {value: "any"} + ListElement {value: "apart"} + ListElement {value: "apology"} + ListElement {value: "appear"} + ListElement {value: "apple"} + ListElement {value: "approve"} + ListElement {value: "april"} + ListElement {value: "arch"} + ListElement {value: "arctic"} + ListElement {value: "area"} + ListElement {value: "arena"} + ListElement {value: "argue"} + ListElement {value: "arm"} + ListElement {value: "armed"} + ListElement {value: "armor"} + ListElement {value: "army"} + ListElement {value: "around"} + ListElement {value: "arrange"} + ListElement {value: "arrest"} + ListElement {value: "arrive"} + ListElement {value: "arrow"} + ListElement {value: "art"} + ListElement {value: "artefact"} + ListElement {value: "artist"} + ListElement {value: "artwork"} + ListElement {value: "ask"} + ListElement {value: "aspect"} + ListElement {value: "assault"} + ListElement {value: "asset"} + ListElement {value: "assist"} + ListElement {value: "assume"} + ListElement {value: "asthma"} + ListElement {value: "athlete"} + ListElement {value: "atom"} + ListElement {value: "attack"} + ListElement {value: "attend"} + ListElement {value: "attitude"} + ListElement {value: "attract"} + ListElement {value: "auction"} + ListElement {value: "audit"} + ListElement {value: "august"} + ListElement {value: "aunt"} + ListElement {value: "author"} + ListElement {value: "auto"} + ListElement {value: "autumn"} + ListElement {value: "average"} + ListElement {value: "avocado"} + ListElement {value: "avoid"} + ListElement {value: "awake"} + ListElement {value: "aware"} + ListElement {value: "away"} + ListElement {value: "awesome"} + ListElement {value: "awful"} + ListElement {value: "awkward"} + ListElement {value: "axis"} + ListElement {value: "baby"} + ListElement {value: "bachelor"} + ListElement {value: "bacon"} + ListElement {value: "badge"} + ListElement {value: "bag"} + ListElement {value: "balance"} + ListElement {value: "balcony"} + ListElement {value: "ball"} + ListElement {value: "bamboo"} + ListElement {value: "banana"} + ListElement {value: "banner"} + ListElement {value: "bar"} + ListElement {value: "barely"} + ListElement {value: "bargain"} + ListElement {value: "barrel"} + ListElement {value: "base"} + ListElement {value: "basic"} + ListElement {value: "basket"} + ListElement {value: "battle"} + ListElement {value: "beach"} + ListElement {value: "bean"} + ListElement {value: "beauty"} + ListElement {value: "because"} + ListElement {value: "become"} + ListElement {value: "beef"} + ListElement {value: "before"} + ListElement {value: "begin"} + ListElement {value: "behave"} + ListElement {value: "behind"} + ListElement {value: "believe"} + ListElement {value: "below"} + ListElement {value: "belt"} + ListElement {value: "bench"} + ListElement {value: "benefit"} + ListElement {value: "best"} + ListElement {value: "betray"} + ListElement {value: "better"} + ListElement {value: "between"} + ListElement {value: "beyond"} + ListElement {value: "bicycle"} + ListElement {value: "bid"} + ListElement {value: "bike"} + ListElement {value: "bind"} + ListElement {value: "biology"} + ListElement {value: "bird"} + ListElement {value: "birth"} + ListElement {value: "bitter"} + ListElement {value: "black"} + ListElement {value: "blade"} + ListElement {value: "blame"} + ListElement {value: "blanket"} + ListElement {value: "blast"} + ListElement {value: "bleak"} + ListElement {value: "bless"} + ListElement {value: "blind"} + ListElement {value: "blood"} + ListElement {value: "blossom"} + ListElement {value: "blouse"} + ListElement {value: "blue"} + ListElement {value: "blur"} + ListElement {value: "blush"} + ListElement {value: "board"} + ListElement {value: "boat"} + ListElement {value: "body"} + ListElement {value: "boil"} + ListElement {value: "bomb"} + ListElement {value: "bone"} + ListElement {value: "bonus"} + ListElement {value: "book"} + ListElement {value: "boost"} + ListElement {value: "border"} + ListElement {value: "boring"} + ListElement {value: "borrow"} + ListElement {value: "boss"} + ListElement {value: "bottom"} + ListElement {value: "bounce"} + ListElement {value: "box"} + ListElement {value: "boy"} + ListElement {value: "bracket"} + ListElement {value: "brain"} + ListElement {value: "brand"} + ListElement {value: "brass"} + ListElement {value: "brave"} + ListElement {value: "bread"} + ListElement {value: "breeze"} + ListElement {value: "brick"} + ListElement {value: "bridge"} + ListElement {value: "brief"} + ListElement {value: "bright"} + ListElement {value: "bring"} + ListElement {value: "brisk"} + ListElement {value: "broccoli"} + ListElement {value: "broken"} + ListElement {value: "bronze"} + ListElement {value: "broom"} + ListElement {value: "brother"} + ListElement {value: "brown"} + ListElement {value: "brush"} + ListElement {value: "bubble"} + ListElement {value: "buddy"} + ListElement {value: "budget"} + ListElement {value: "buffalo"} + ListElement {value: "build"} + ListElement {value: "bulb"} + ListElement {value: "bulk"} + ListElement {value: "bullet"} + ListElement {value: "bundle"} + ListElement {value: "bunker"} + ListElement {value: "burden"} + ListElement {value: "burger"} + ListElement {value: "burst"} + ListElement {value: "bus"} + ListElement {value: "business"} + ListElement {value: "busy"} + ListElement {value: "butter"} + ListElement {value: "buyer"} + ListElement {value: "buzz"} + ListElement {value: "cabbage"} + ListElement {value: "cabin"} + ListElement {value: "cable"} + ListElement {value: "cactus"} + ListElement {value: "cage"} + ListElement {value: "cake"} + ListElement {value: "call"} + ListElement {value: "calm"} + ListElement {value: "camera"} + ListElement {value: "camp"} + ListElement {value: "can"} + ListElement {value: "canal"} + ListElement {value: "cancel"} + ListElement {value: "candy"} + ListElement {value: "cannon"} + ListElement {value: "canoe"} + ListElement {value: "canvas"} + ListElement {value: "canyon"} + ListElement {value: "capable"} + ListElement {value: "capital"} + ListElement {value: "captain"} + ListElement {value: "car"} + ListElement {value: "carbon"} + ListElement {value: "card"} + ListElement {value: "cargo"} + ListElement {value: "carpet"} + ListElement {value: "carry"} + ListElement {value: "cart"} + ListElement {value: "case"} + ListElement {value: "cash"} + ListElement {value: "casino"} + ListElement {value: "castle"} + ListElement {value: "casual"} + ListElement {value: "cat"} + ListElement {value: "catalog"} + ListElement {value: "catch"} + ListElement {value: "category"} + ListElement {value: "cattle"} + ListElement {value: "caught"} + ListElement {value: "cause"} + ListElement {value: "caution"} + ListElement {value: "cave"} + ListElement {value: "ceiling"} + ListElement {value: "celery"} + ListElement {value: "cement"} + ListElement {value: "census"} + ListElement {value: "century"} + ListElement {value: "cereal"} + ListElement {value: "certain"} + ListElement {value: "chair"} + ListElement {value: "chalk"} + ListElement {value: "champion"} + ListElement {value: "change"} + ListElement {value: "chaos"} + ListElement {value: "chapter"} + ListElement {value: "charge"} + ListElement {value: "chase"} + ListElement {value: "chat"} + ListElement {value: "cheap"} + ListElement {value: "check"} + ListElement {value: "cheese"} + ListElement {value: "chef"} + ListElement {value: "cherry"} + ListElement {value: "chest"} + ListElement {value: "chicken"} + ListElement {value: "chief"} + ListElement {value: "child"} + ListElement {value: "chimney"} + ListElement {value: "choice"} + ListElement {value: "choose"} + ListElement {value: "chronic"} + ListElement {value: "chuckle"} + ListElement {value: "chunk"} + ListElement {value: "churn"} + ListElement {value: "cigar"} + ListElement {value: "cinnamon"} + ListElement {value: "circle"} + ListElement {value: "citizen"} + ListElement {value: "city"} + ListElement {value: "civil"} + ListElement {value: "claim"} + ListElement {value: "clap"} + ListElement {value: "clarify"} + ListElement {value: "claw"} + ListElement {value: "clay"} + ListElement {value: "clean"} + ListElement {value: "clerk"} + ListElement {value: "clever"} + ListElement {value: "click"} + ListElement {value: "client"} + ListElement {value: "cliff"} + ListElement {value: "climb"} + ListElement {value: "clinic"} + ListElement {value: "clip"} + ListElement {value: "clock"} + ListElement {value: "clog"} + ListElement {value: "close"} + ListElement {value: "cloth"} + ListElement {value: "cloud"} + ListElement {value: "clown"} + ListElement {value: "club"} + ListElement {value: "clump"} + ListElement {value: "cluster"} + ListElement {value: "clutch"} + ListElement {value: "coach"} + ListElement {value: "coast"} + ListElement {value: "coconut"} + ListElement {value: "code"} + ListElement {value: "coffee"} + ListElement {value: "coil"} + ListElement {value: "coin"} + ListElement {value: "collect"} + ListElement {value: "color"} + ListElement {value: "column"} + ListElement {value: "combine"} + ListElement {value: "come"} + ListElement {value: "comfort"} + ListElement {value: "comic"} + ListElement {value: "common"} + ListElement {value: "company"} + ListElement {value: "concert"} + ListElement {value: "conduct"} + ListElement {value: "confirm"} + ListElement {value: "congress"} + ListElement {value: "connect"} + ListElement {value: "consider"} + ListElement {value: "control"} + ListElement {value: "convince"} + ListElement {value: "cook"} + ListElement {value: "cool"} + ListElement {value: "copper"} + ListElement {value: "copy"} + ListElement {value: "coral"} + ListElement {value: "core"} + ListElement {value: "corn"} + ListElement {value: "correct"} + ListElement {value: "cost"} + ListElement {value: "cotton"} + ListElement {value: "couch"} + ListElement {value: "country"} + ListElement {value: "couple"} + ListElement {value: "course"} + ListElement {value: "cousin"} + ListElement {value: "cover"} + ListElement {value: "coyote"} + ListElement {value: "crack"} + ListElement {value: "cradle"} + ListElement {value: "craft"} + ListElement {value: "cram"} + ListElement {value: "crane"} + ListElement {value: "crash"} + ListElement {value: "crater"} + ListElement {value: "crawl"} + ListElement {value: "crazy"} + ListElement {value: "cream"} + ListElement {value: "credit"} + ListElement {value: "creek"} + ListElement {value: "crew"} + ListElement {value: "cricket"} + ListElement {value: "crime"} + ListElement {value: "crisp"} + ListElement {value: "critic"} + ListElement {value: "crop"} + ListElement {value: "cross"} + ListElement {value: "crouch"} + ListElement {value: "crowd"} + ListElement {value: "crucial"} + ListElement {value: "cruel"} + ListElement {value: "cruise"} + ListElement {value: "crumble"} + ListElement {value: "crunch"} + ListElement {value: "crush"} + ListElement {value: "cry"} + ListElement {value: "crystal"} + ListElement {value: "cube"} + ListElement {value: "culture"} + ListElement {value: "cup"} + ListElement {value: "cupboard"} + ListElement {value: "curious"} + ListElement {value: "current"} + ListElement {value: "curtain"} + ListElement {value: "curve"} + ListElement {value: "cushion"} + ListElement {value: "custom"} + ListElement {value: "cute"} + ListElement {value: "cycle"} + ListElement {value: "dad"} + ListElement {value: "damage"} + ListElement {value: "damp"} + ListElement {value: "dance"} + ListElement {value: "danger"} + ListElement {value: "daring"} + ListElement {value: "dash"} + ListElement {value: "daughter"} + ListElement {value: "dawn"} + ListElement {value: "day"} + ListElement {value: "deal"} + ListElement {value: "debate"} + ListElement {value: "debris"} + ListElement {value: "decade"} + ListElement {value: "december"} + ListElement {value: "decide"} + ListElement {value: "decline"} + ListElement {value: "decorate"} + ListElement {value: "decrease"} + ListElement {value: "deer"} + ListElement {value: "defense"} + ListElement {value: "define"} + ListElement {value: "defy"} + ListElement {value: "degree"} + ListElement {value: "delay"} + ListElement {value: "deliver"} + ListElement {value: "demand"} + ListElement {value: "demise"} + ListElement {value: "denial"} + ListElement {value: "dentist"} + ListElement {value: "deny"} + ListElement {value: "depart"} + ListElement {value: "depend"} + ListElement {value: "deposit"} + ListElement {value: "depth"} + ListElement {value: "deputy"} + ListElement {value: "derive"} + ListElement {value: "describe"} + ListElement {value: "desert"} + ListElement {value: "design"} + ListElement {value: "desk"} + ListElement {value: "despair"} + ListElement {value: "destroy"} + ListElement {value: "detail"} + ListElement {value: "detect"} + ListElement {value: "develop"} + ListElement {value: "device"} + ListElement {value: "devote"} + ListElement {value: "diagram"} + ListElement {value: "dial"} + ListElement {value: "diamond"} + ListElement {value: "diary"} + ListElement {value: "dice"} + ListElement {value: "diesel"} + ListElement {value: "diet"} + ListElement {value: "differ"} + ListElement {value: "digital"} + ListElement {value: "dignity"} + ListElement {value: "dilemma"} + ListElement {value: "dinner"} + ListElement {value: "dinosaur"} + ListElement {value: "direct"} + ListElement {value: "dirt"} + ListElement {value: "disagree"} + ListElement {value: "discover"} + ListElement {value: "disease"} + ListElement {value: "dish"} + ListElement {value: "dismiss"} + ListElement {value: "disorder"} + ListElement {value: "display"} + ListElement {value: "distance"} + ListElement {value: "divert"} + ListElement {value: "divide"} + ListElement {value: "divorce"} + ListElement {value: "dizzy"} + ListElement {value: "doctor"} + ListElement {value: "document"} + ListElement {value: "dog"} + ListElement {value: "doll"} + ListElement {value: "dolphin"} + ListElement {value: "domain"} + ListElement {value: "donate"} + ListElement {value: "donkey"} + ListElement {value: "donor"} + ListElement {value: "door"} + ListElement {value: "dose"} + ListElement {value: "double"} + ListElement {value: "dove"} + ListElement {value: "draft"} + ListElement {value: "dragon"} + ListElement {value: "drama"} + ListElement {value: "drastic"} + ListElement {value: "draw"} + ListElement {value: "dream"} + ListElement {value: "dress"} + ListElement {value: "drift"} + ListElement {value: "drill"} + ListElement {value: "drink"} + ListElement {value: "drip"} + ListElement {value: "drive"} + ListElement {value: "drop"} + ListElement {value: "drum"} + ListElement {value: "dry"} + ListElement {value: "duck"} + ListElement {value: "dumb"} + ListElement {value: "dune"} + ListElement {value: "during"} + ListElement {value: "dust"} + ListElement {value: "dutch"} + ListElement {value: "duty"} + ListElement {value: "dwarf"} + ListElement {value: "dynamic"} + ListElement {value: "eager"} + ListElement {value: "eagle"} + ListElement {value: "early"} + ListElement {value: "earn"} + ListElement {value: "earth"} + ListElement {value: "easily"} + ListElement {value: "east"} + ListElement {value: "easy"} + ListElement {value: "echo"} + ListElement {value: "ecology"} + ListElement {value: "economy"} + ListElement {value: "edge"} + ListElement {value: "edit"} + ListElement {value: "educate"} + ListElement {value: "effort"} + ListElement {value: "egg"} + ListElement {value: "eight"} + ListElement {value: "either"} + ListElement {value: "elbow"} + ListElement {value: "elder"} + ListElement {value: "electric"} + ListElement {value: "elegant"} + ListElement {value: "element"} + ListElement {value: "elephant"} + ListElement {value: "elevator"} + ListElement {value: "elite"} + ListElement {value: "else"} + ListElement {value: "embark"} + ListElement {value: "embody"} + ListElement {value: "embrace"} + ListElement {value: "emerge"} + ListElement {value: "emotion"} + ListElement {value: "employ"} + ListElement {value: "empower"} + ListElement {value: "empty"} + ListElement {value: "enable"} + ListElement {value: "enact"} + ListElement {value: "end"} + ListElement {value: "endless"} + ListElement {value: "endorse"} + ListElement {value: "enemy"} + ListElement {value: "energy"} + ListElement {value: "enforce"} + ListElement {value: "engage"} + ListElement {value: "engine"} + ListElement {value: "enhance"} + ListElement {value: "enjoy"} + ListElement {value: "enlist"} + ListElement {value: "enough"} + ListElement {value: "enrich"} + ListElement {value: "enroll"} + ListElement {value: "ensure"} + ListElement {value: "enter"} + ListElement {value: "entire"} + ListElement {value: "entry"} + ListElement {value: "envelope"} + ListElement {value: "episode"} + ListElement {value: "equal"} + ListElement {value: "equip"} + ListElement {value: "era"} + ListElement {value: "erase"} + ListElement {value: "erode"} + ListElement {value: "erosion"} + ListElement {value: "error"} + ListElement {value: "erupt"} + ListElement {value: "escape"} + ListElement {value: "essay"} + ListElement {value: "essence"} + ListElement {value: "estate"} + ListElement {value: "eternal"} + ListElement {value: "ethics"} + ListElement {value: "evidence"} + ListElement {value: "evil"} + ListElement {value: "evoke"} + ListElement {value: "evolve"} + ListElement {value: "exact"} + ListElement {value: "example"} + ListElement {value: "excess"} + ListElement {value: "exchange"} + ListElement {value: "excite"} + ListElement {value: "exclude"} + ListElement {value: "excuse"} + ListElement {value: "execute"} + ListElement {value: "exercise"} + ListElement {value: "exhaust"} + ListElement {value: "exhibit"} + ListElement {value: "exile"} + ListElement {value: "exist"} + ListElement {value: "exit"} + ListElement {value: "exotic"} + ListElement {value: "expand"} + ListElement {value: "expect"} + ListElement {value: "expire"} + ListElement {value: "explain"} + ListElement {value: "expose"} + ListElement {value: "express"} + ListElement {value: "extend"} + ListElement {value: "extra"} + ListElement {value: "eye"} + ListElement {value: "eyebrow"} + ListElement {value: "fabric"} + ListElement {value: "face"} + ListElement {value: "faculty"} + ListElement {value: "fade"} + ListElement {value: "faint"} + ListElement {value: "faith"} + ListElement {value: "fall"} + ListElement {value: "false"} + ListElement {value: "fame"} + ListElement {value: "family"} + ListElement {value: "famous"} + ListElement {value: "fan"} + ListElement {value: "fancy"} + ListElement {value: "fantasy"} + ListElement {value: "farm"} + ListElement {value: "fashion"} + ListElement {value: "fat"} + ListElement {value: "fatal"} + ListElement {value: "father"} + ListElement {value: "fatigue"} + ListElement {value: "fault"} + ListElement {value: "favorite"} + ListElement {value: "feature"} + ListElement {value: "february"} + ListElement {value: "federal"} + ListElement {value: "fee"} + ListElement {value: "feed"} + ListElement {value: "feel"} + ListElement {value: "female"} + ListElement {value: "fence"} + ListElement {value: "festival"} + ListElement {value: "fetch"} + ListElement {value: "fever"} + ListElement {value: "few"} + ListElement {value: "fiber"} + ListElement {value: "fiction"} + ListElement {value: "field"} + ListElement {value: "figure"} + ListElement {value: "file"} + ListElement {value: "film"} + ListElement {value: "filter"} + ListElement {value: "final"} + ListElement {value: "find"} + ListElement {value: "fine"} + ListElement {value: "finger"} + ListElement {value: "finish"} + ListElement {value: "fire"} + ListElement {value: "firm"} + ListElement {value: "first"} + ListElement {value: "fiscal"} + ListElement {value: "fish"} + ListElement {value: "fit"} + ListElement {value: "fitness"} + ListElement {value: "fix"} + ListElement {value: "flag"} + ListElement {value: "flame"} + ListElement {value: "flash"} + ListElement {value: "flat"} + ListElement {value: "flavor"} + ListElement {value: "flee"} + ListElement {value: "flight"} + ListElement {value: "flip"} + ListElement {value: "float"} + ListElement {value: "flock"} + ListElement {value: "floor"} + ListElement {value: "flower"} + ListElement {value: "fluid"} + ListElement {value: "flush"} + ListElement {value: "fly"} + ListElement {value: "foam"} + ListElement {value: "focus"} + ListElement {value: "fog"} + ListElement {value: "foil"} + ListElement {value: "fold"} + ListElement {value: "follow"} + ListElement {value: "food"} + ListElement {value: "foot"} + ListElement {value: "force"} + ListElement {value: "forest"} + ListElement {value: "forget"} + ListElement {value: "fork"} + ListElement {value: "fortune"} + ListElement {value: "forum"} + ListElement {value: "forward"} + ListElement {value: "fossil"} + ListElement {value: "foster"} + ListElement {value: "found"} + ListElement {value: "fox"} + ListElement {value: "fragile"} + ListElement {value: "frame"} + ListElement {value: "frequent"} + ListElement {value: "fresh"} + ListElement {value: "friend"} + ListElement {value: "fringe"} + ListElement {value: "frog"} + ListElement {value: "front"} + ListElement {value: "frost"} + ListElement {value: "frown"} + ListElement {value: "frozen"} + ListElement {value: "fruit"} + ListElement {value: "fuel"} + ListElement {value: "fun"} + ListElement {value: "funny"} + ListElement {value: "furnace"} + ListElement {value: "fury"} + ListElement {value: "future"} + ListElement {value: "gadget"} + ListElement {value: "gain"} + ListElement {value: "galaxy"} + ListElement {value: "gallery"} + ListElement {value: "game"} + ListElement {value: "gap"} + ListElement {value: "garage"} + ListElement {value: "garbage"} + ListElement {value: "garden"} + ListElement {value: "garlic"} + ListElement {value: "garment"} + ListElement {value: "gas"} + ListElement {value: "gasp"} + ListElement {value: "gate"} + ListElement {value: "gather"} + ListElement {value: "gauge"} + ListElement {value: "gaze"} + ListElement {value: "general"} + ListElement {value: "genius"} + ListElement {value: "genre"} + ListElement {value: "gentle"} + ListElement {value: "genuine"} + ListElement {value: "gesture"} + ListElement {value: "ghost"} + ListElement {value: "giant"} + ListElement {value: "gift"} + ListElement {value: "giggle"} + ListElement {value: "ginger"} + ListElement {value: "giraffe"} + ListElement {value: "girl"} + ListElement {value: "give"} + ListElement {value: "glad"} + ListElement {value: "glance"} + ListElement {value: "glare"} + ListElement {value: "glass"} + ListElement {value: "glide"} + ListElement {value: "glimpse"} + ListElement {value: "globe"} + ListElement {value: "gloom"} + ListElement {value: "glory"} + ListElement {value: "glove"} + ListElement {value: "glow"} + ListElement {value: "glue"} + ListElement {value: "goat"} + ListElement {value: "goddess"} + ListElement {value: "gold"} + ListElement {value: "good"} + ListElement {value: "goose"} + ListElement {value: "gorilla"} + ListElement {value: "gospel"} + ListElement {value: "gossip"} + ListElement {value: "govern"} + ListElement {value: "gown"} + ListElement {value: "grab"} + ListElement {value: "grace"} + ListElement {value: "grain"} + ListElement {value: "grant"} + ListElement {value: "grape"} + ListElement {value: "grass"} + ListElement {value: "gravity"} + ListElement {value: "great"} + ListElement {value: "green"} + ListElement {value: "grid"} + ListElement {value: "grief"} + ListElement {value: "grit"} + ListElement {value: "grocery"} + ListElement {value: "group"} + ListElement {value: "grow"} + ListElement {value: "grunt"} + ListElement {value: "guard"} + ListElement {value: "guess"} + ListElement {value: "guide"} + ListElement {value: "guilt"} + ListElement {value: "guitar"} + ListElement {value: "gun"} + ListElement {value: "gym"} + ListElement {value: "habit"} + ListElement {value: "hair"} + ListElement {value: "half"} + ListElement {value: "hammer"} + ListElement {value: "hamster"} + ListElement {value: "hand"} + ListElement {value: "happy"} + ListElement {value: "harbor"} + ListElement {value: "hard"} + ListElement {value: "harsh"} + ListElement {value: "harvest"} + ListElement {value: "hat"} + ListElement {value: "have"} + ListElement {value: "hawk"} + ListElement {value: "hazard"} + ListElement {value: "head"} + ListElement {value: "health"} + ListElement {value: "heart"} + ListElement {value: "heavy"} + ListElement {value: "hedgehog"} + ListElement {value: "height"} + ListElement {value: "hello"} + ListElement {value: "helmet"} + ListElement {value: "help"} + ListElement {value: "hen"} + ListElement {value: "hero"} + ListElement {value: "hidden"} + ListElement {value: "high"} + ListElement {value: "hill"} + ListElement {value: "hint"} + ListElement {value: "hip"} + ListElement {value: "hire"} + ListElement {value: "history"} + ListElement {value: "hobby"} + ListElement {value: "hockey"} + ListElement {value: "hold"} + ListElement {value: "hole"} + ListElement {value: "holiday"} + ListElement {value: "hollow"} + ListElement {value: "home"} + ListElement {value: "honey"} + ListElement {value: "hood"} + ListElement {value: "hope"} + ListElement {value: "horn"} + ListElement {value: "horror"} + ListElement {value: "horse"} + ListElement {value: "hospital"} + ListElement {value: "host"} + ListElement {value: "hotel"} + ListElement {value: "hour"} + ListElement {value: "hover"} + ListElement {value: "hub"} + ListElement {value: "huge"} + ListElement {value: "human"} + ListElement {value: "humble"} + ListElement {value: "humor"} + ListElement {value: "hundred"} + ListElement {value: "hungry"} + ListElement {value: "hunt"} + ListElement {value: "hurdle"} + ListElement {value: "hurry"} + ListElement {value: "hurt"} + ListElement {value: "husband"} + ListElement {value: "hybrid"} + ListElement {value: "ice"} + ListElement {value: "icon"} + ListElement {value: "idea"} + ListElement {value: "identify"} + ListElement {value: "idle"} + ListElement {value: "ignore"} + ListElement {value: "ill"} + ListElement {value: "illegal"} + ListElement {value: "illness"} + ListElement {value: "image"} + ListElement {value: "imitate"} + ListElement {value: "immense"} + ListElement {value: "immune"} + ListElement {value: "impact"} + ListElement {value: "impose"} + ListElement {value: "improve"} + ListElement {value: "impulse"} + ListElement {value: "inch"} + ListElement {value: "include"} + ListElement {value: "income"} + ListElement {value: "increase"} + ListElement {value: "index"} + ListElement {value: "indicate"} + ListElement {value: "indoor"} + ListElement {value: "industry"} + ListElement {value: "infant"} + ListElement {value: "inflict"} + ListElement {value: "inform"} + ListElement {value: "inhale"} + ListElement {value: "inherit"} + ListElement {value: "initial"} + ListElement {value: "inject"} + ListElement {value: "injury"} + ListElement {value: "inmate"} + ListElement {value: "inner"} + ListElement {value: "innocent"} + ListElement {value: "input"} + ListElement {value: "inquiry"} + ListElement {value: "insane"} + ListElement {value: "insect"} + ListElement {value: "inside"} + ListElement {value: "inspire"} + ListElement {value: "install"} + ListElement {value: "intact"} + ListElement {value: "interest"} + ListElement {value: "into"} + ListElement {value: "invest"} + ListElement {value: "invite"} + ListElement {value: "involve"} + ListElement {value: "iron"} + ListElement {value: "island"} + ListElement {value: "isolate"} + ListElement {value: "issue"} + ListElement {value: "item"} + ListElement {value: "ivory"} + ListElement {value: "jacket"} + ListElement {value: "jaguar"} + ListElement {value: "jar"} + ListElement {value: "jazz"} + ListElement {value: "jealous"} + ListElement {value: "jeans"} + ListElement {value: "jelly"} + ListElement {value: "jewel"} + ListElement {value: "job"} + ListElement {value: "join"} + ListElement {value: "joke"} + ListElement {value: "journey"} + ListElement {value: "joy"} + ListElement {value: "judge"} + ListElement {value: "juice"} + ListElement {value: "jump"} + ListElement {value: "jungle"} + ListElement {value: "junior"} + ListElement {value: "junk"} + ListElement {value: "just"} + ListElement {value: "kangaroo"} + ListElement {value: "keen"} + ListElement {value: "keep"} + ListElement {value: "ketchup"} + ListElement {value: "key"} + ListElement {value: "kick"} + ListElement {value: "kid"} + ListElement {value: "kidney"} + ListElement {value: "kind"} + ListElement {value: "kingdom"} + ListElement {value: "kiss"} + ListElement {value: "kit"} + ListElement {value: "kitchen"} + ListElement {value: "kite"} + ListElement {value: "kitten"} + ListElement {value: "kiwi"} + ListElement {value: "knee"} + ListElement {value: "knife"} + ListElement {value: "knock"} + ListElement {value: "know"} + ListElement {value: "lab"} + ListElement {value: "label"} + ListElement {value: "labor"} + ListElement {value: "ladder"} + ListElement {value: "lady"} + ListElement {value: "lake"} + ListElement {value: "lamp"} + ListElement {value: "language"} + ListElement {value: "laptop"} + ListElement {value: "large"} + ListElement {value: "later"} + ListElement {value: "latin"} + ListElement {value: "laugh"} + ListElement {value: "laundry"} + ListElement {value: "lava"} + ListElement {value: "law"} + ListElement {value: "lawn"} + ListElement {value: "lawsuit"} + ListElement {value: "layer"} + ListElement {value: "lazy"} + ListElement {value: "leader"} + ListElement {value: "leaf"} + ListElement {value: "learn"} + ListElement {value: "leave"} + ListElement {value: "lecture"} + ListElement {value: "left"} + ListElement {value: "leg"} + ListElement {value: "legal"} + ListElement {value: "legend"} + ListElement {value: "leisure"} + ListElement {value: "lemon"} + ListElement {value: "lend"} + ListElement {value: "length"} + ListElement {value: "lens"} + ListElement {value: "leopard"} + ListElement {value: "lesson"} + ListElement {value: "letter"} + ListElement {value: "level"} + ListElement {value: "liar"} + ListElement {value: "liberty"} + ListElement {value: "library"} + ListElement {value: "license"} + ListElement {value: "life"} + ListElement {value: "lift"} + ListElement {value: "light"} + ListElement {value: "like"} + ListElement {value: "limb"} + ListElement {value: "limit"} + ListElement {value: "link"} + ListElement {value: "lion"} + ListElement {value: "liquid"} + ListElement {value: "list"} + ListElement {value: "little"} + ListElement {value: "live"} + ListElement {value: "lizard"} + ListElement {value: "load"} + ListElement {value: "loan"} + ListElement {value: "lobster"} + ListElement {value: "local"} + ListElement {value: "lock"} + ListElement {value: "logic"} + ListElement {value: "lonely"} + ListElement {value: "long"} + ListElement {value: "loop"} + ListElement {value: "lottery"} + ListElement {value: "loud"} + ListElement {value: "lounge"} + ListElement {value: "love"} + ListElement {value: "loyal"} + ListElement {value: "lucky"} + ListElement {value: "luggage"} + ListElement {value: "lumber"} + ListElement {value: "lunar"} + ListElement {value: "lunch"} + ListElement {value: "luxury"} + ListElement {value: "lyrics"} + ListElement {value: "machine"} + ListElement {value: "mad"} + ListElement {value: "magic"} + ListElement {value: "magnet"} + ListElement {value: "maid"} + ListElement {value: "mail"} + ListElement {value: "main"} + ListElement {value: "major"} + ListElement {value: "make"} + ListElement {value: "mammal"} + ListElement {value: "man"} + ListElement {value: "manage"} + ListElement {value: "mandate"} + ListElement {value: "mango"} + ListElement {value: "mansion"} + ListElement {value: "manual"} + ListElement {value: "maple"} + ListElement {value: "marble"} + ListElement {value: "march"} + ListElement {value: "margin"} + ListElement {value: "marine"} + ListElement {value: "market"} + ListElement {value: "marriage"} + ListElement {value: "mask"} + ListElement {value: "mass"} + ListElement {value: "master"} + ListElement {value: "match"} + ListElement {value: "material"} + ListElement {value: "math"} + ListElement {value: "matrix"} + ListElement {value: "matter"} + ListElement {value: "maximum"} + ListElement {value: "maze"} + ListElement {value: "meadow"} + ListElement {value: "mean"} + ListElement {value: "measure"} + ListElement {value: "meat"} + ListElement {value: "mechanic"} + ListElement {value: "medal"} + ListElement {value: "media"} + ListElement {value: "melody"} + ListElement {value: "melt"} + ListElement {value: "member"} + ListElement {value: "memory"} + ListElement {value: "mention"} + ListElement {value: "menu"} + ListElement {value: "mercy"} + ListElement {value: "merge"} + ListElement {value: "merit"} + ListElement {value: "merry"} + ListElement {value: "mesh"} + ListElement {value: "message"} + ListElement {value: "metal"} + ListElement {value: "method"} + ListElement {value: "middle"} + ListElement {value: "midnight"} + ListElement {value: "milk"} + ListElement {value: "million"} + ListElement {value: "mimic"} + ListElement {value: "mind"} + ListElement {value: "minimum"} + ListElement {value: "minor"} + ListElement {value: "minute"} + ListElement {value: "miracle"} + ListElement {value: "mirror"} + ListElement {value: "misery"} + ListElement {value: "miss"} + ListElement {value: "mistake"} + ListElement {value: "mix"} + ListElement {value: "mixed"} + ListElement {value: "mixture"} + ListElement {value: "mobile"} + ListElement {value: "model"} + ListElement {value: "modify"} + ListElement {value: "mom"} + ListElement {value: "moment"} + ListElement {value: "monitor"} + ListElement {value: "monkey"} + ListElement {value: "monster"} + ListElement {value: "month"} + ListElement {value: "moon"} + ListElement {value: "moral"} + ListElement {value: "more"} + ListElement {value: "morning"} + ListElement {value: "mosquito"} + ListElement {value: "mother"} + ListElement {value: "motion"} + ListElement {value: "motor"} + ListElement {value: "mountain"} + ListElement {value: "mouse"} + ListElement {value: "move"} + ListElement {value: "movie"} + ListElement {value: "much"} + ListElement {value: "muffin"} + ListElement {value: "mule"} + ListElement {value: "multiply"} + ListElement {value: "muscle"} + ListElement {value: "museum"} + ListElement {value: "mushroom"} + ListElement {value: "music"} + ListElement {value: "must"} + ListElement {value: "mutual"} + ListElement {value: "myself"} + ListElement {value: "mystery"} + ListElement {value: "myth"} + ListElement {value: "naive"} + ListElement {value: "name"} + ListElement {value: "napkin"} + ListElement {value: "narrow"} + ListElement {value: "nasty"} + ListElement {value: "nation"} + ListElement {value: "nature"} + ListElement {value: "near"} + ListElement {value: "neck"} + ListElement {value: "need"} + ListElement {value: "negative"} + ListElement {value: "neglect"} + ListElement {value: "neither"} + ListElement {value: "nephew"} + ListElement {value: "nerve"} + ListElement {value: "nest"} + ListElement {value: "net"} + ListElement {value: "network"} + ListElement {value: "neutral"} + ListElement {value: "never"} + ListElement {value: "news"} + ListElement {value: "next"} + ListElement {value: "nice"} + ListElement {value: "night"} + ListElement {value: "noble"} + ListElement {value: "noise"} + ListElement {value: "nominee"} + ListElement {value: "noodle"} + ListElement {value: "normal"} + ListElement {value: "north"} + ListElement {value: "nose"} + ListElement {value: "notable"} + ListElement {value: "note"} + ListElement {value: "nothing"} + ListElement {value: "notice"} + ListElement {value: "novel"} + ListElement {value: "now"} + ListElement {value: "nuclear"} + ListElement {value: "number"} + ListElement {value: "nurse"} + ListElement {value: "nut"} + ListElement {value: "oak"} + ListElement {value: "obey"} + ListElement {value: "object"} + ListElement {value: "oblige"} + ListElement {value: "obscure"} + ListElement {value: "observe"} + ListElement {value: "obtain"} + ListElement {value: "obvious"} + ListElement {value: "occur"} + ListElement {value: "ocean"} + ListElement {value: "october"} + ListElement {value: "odor"} + ListElement {value: "off"} + ListElement {value: "offer"} + ListElement {value: "office"} + ListElement {value: "often"} + ListElement {value: "oil"} + ListElement {value: "okay"} + ListElement {value: "old"} + ListElement {value: "olive"} + ListElement {value: "olympic"} + ListElement {value: "omit"} + ListElement {value: "once"} + ListElement {value: "one"} + ListElement {value: "onion"} + ListElement {value: "online"} + ListElement {value: "only"} + ListElement {value: "open"} + ListElement {value: "opera"} + ListElement {value: "opinion"} + ListElement {value: "oppose"} + ListElement {value: "option"} + ListElement {value: "orange"} + ListElement {value: "orbit"} + ListElement {value: "orchard"} + ListElement {value: "order"} + ListElement {value: "ordinary"} + ListElement {value: "organ"} + ListElement {value: "orient"} + ListElement {value: "original"} + ListElement {value: "orphan"} + ListElement {value: "ostrich"} + ListElement {value: "other"} + ListElement {value: "outdoor"} + ListElement {value: "outer"} + ListElement {value: "output"} + ListElement {value: "outside"} + ListElement {value: "oval"} + ListElement {value: "oven"} + ListElement {value: "over"} + ListElement {value: "own"} + ListElement {value: "owner"} + ListElement {value: "oxygen"} + ListElement {value: "oyster"} + ListElement {value: "ozone"} + ListElement {value: "pact"} + ListElement {value: "paddle"} + ListElement {value: "page"} + ListElement {value: "pair"} + ListElement {value: "palace"} + ListElement {value: "palm"} + ListElement {value: "panda"} + ListElement {value: "panel"} + ListElement {value: "panic"} + ListElement {value: "panther"} + ListElement {value: "paper"} + ListElement {value: "parade"} + ListElement {value: "parent"} + ListElement {value: "park"} + ListElement {value: "parrot"} + ListElement {value: "party"} + ListElement {value: "pass"} + ListElement {value: "patch"} + ListElement {value: "path"} + ListElement {value: "patient"} + ListElement {value: "patrol"} + ListElement {value: "pattern"} + ListElement {value: "pause"} + ListElement {value: "pave"} + ListElement {value: "payment"} + ListElement {value: "peace"} + ListElement {value: "peanut"} + ListElement {value: "pear"} + ListElement {value: "peasant"} + ListElement {value: "pelican"} + ListElement {value: "pen"} + ListElement {value: "penalty"} + ListElement {value: "pencil"} + ListElement {value: "people"} + ListElement {value: "pepper"} + ListElement {value: "perfect"} + ListElement {value: "permit"} + ListElement {value: "person"} + ListElement {value: "pet"} + ListElement {value: "phone"} + ListElement {value: "photo"} + ListElement {value: "phrase"} + ListElement {value: "physical"} + ListElement {value: "piano"} + ListElement {value: "picnic"} + ListElement {value: "picture"} + ListElement {value: "piece"} + ListElement {value: "pig"} + ListElement {value: "pigeon"} + ListElement {value: "pill"} + ListElement {value: "pilot"} + ListElement {value: "pink"} + ListElement {value: "pioneer"} + ListElement {value: "pipe"} + ListElement {value: "pistol"} + ListElement {value: "pitch"} + ListElement {value: "pizza"} + ListElement {value: "place"} + ListElement {value: "planet"} + ListElement {value: "plastic"} + ListElement {value: "plate"} + ListElement {value: "play"} + ListElement {value: "please"} + ListElement {value: "pledge"} + ListElement {value: "pluck"} + ListElement {value: "plug"} + ListElement {value: "plunge"} + ListElement {value: "poem"} + ListElement {value: "poet"} + ListElement {value: "point"} + ListElement {value: "polar"} + ListElement {value: "pole"} + ListElement {value: "police"} + ListElement {value: "pond"} + ListElement {value: "pony"} + ListElement {value: "pool"} + ListElement {value: "popular"} + ListElement {value: "portion"} + ListElement {value: "position"} + ListElement {value: "possible"} + ListElement {value: "post"} + ListElement {value: "potato"} + ListElement {value: "pottery"} + ListElement {value: "poverty"} + ListElement {value: "powder"} + ListElement {value: "power"} + ListElement {value: "practice"} + ListElement {value: "praise"} + ListElement {value: "predict"} + ListElement {value: "prefer"} + ListElement {value: "prepare"} + ListElement {value: "present"} + ListElement {value: "pretty"} + ListElement {value: "prevent"} + ListElement {value: "price"} + ListElement {value: "pride"} + ListElement {value: "primary"} + ListElement {value: "print"} + ListElement {value: "priority"} + ListElement {value: "prison"} + ListElement {value: "private"} + ListElement {value: "prize"} + ListElement {value: "problem"} + ListElement {value: "process"} + ListElement {value: "produce"} + ListElement {value: "profit"} + ListElement {value: "program"} + ListElement {value: "project"} + ListElement {value: "promote"} + ListElement {value: "proof"} + ListElement {value: "property"} + ListElement {value: "prosper"} + ListElement {value: "protect"} + ListElement {value: "proud"} + ListElement {value: "provide"} + ListElement {value: "public"} + ListElement {value: "pudding"} + ListElement {value: "pull"} + ListElement {value: "pulp"} + ListElement {value: "pulse"} + ListElement {value: "pumpkin"} + ListElement {value: "punch"} + ListElement {value: "pupil"} + ListElement {value: "puppy"} + ListElement {value: "purchase"} + ListElement {value: "purity"} + ListElement {value: "purpose"} + ListElement {value: "purse"} + ListElement {value: "push"} + ListElement {value: "put"} + ListElement {value: "puzzle"} + ListElement {value: "pyramid"} + ListElement {value: "quality"} + ListElement {value: "quantum"} + ListElement {value: "quarter"} + ListElement {value: "question"} + ListElement {value: "quick"} + ListElement {value: "quit"} + ListElement {value: "quiz"} + ListElement {value: "quote"} + ListElement {value: "rabbit"} + ListElement {value: "raccoon"} + ListElement {value: "race"} + ListElement {value: "rack"} + ListElement {value: "radar"} + ListElement {value: "radio"} + ListElement {value: "rail"} + ListElement {value: "rain"} + ListElement {value: "raise"} + ListElement {value: "rally"} + ListElement {value: "ramp"} + ListElement {value: "ranch"} + ListElement {value: "random"} + ListElement {value: "range"} + ListElement {value: "rapid"} + ListElement {value: "rare"} + ListElement {value: "rate"} + ListElement {value: "rather"} + ListElement {value: "raven"} + ListElement {value: "raw"} + ListElement {value: "razor"} + ListElement {value: "ready"} + ListElement {value: "real"} + ListElement {value: "reason"} + ListElement {value: "rebel"} + ListElement {value: "rebuild"} + ListElement {value: "recall"} + ListElement {value: "receive"} + ListElement {value: "recipe"} + ListElement {value: "record"} + ListElement {value: "recycle"} + ListElement {value: "reduce"} + ListElement {value: "reflect"} + ListElement {value: "reform"} + ListElement {value: "refuse"} + ListElement {value: "region"} + ListElement {value: "regret"} + ListElement {value: "regular"} + ListElement {value: "reject"} + ListElement {value: "relax"} + ListElement {value: "release"} + ListElement {value: "relief"} + ListElement {value: "rely"} + ListElement {value: "remain"} + ListElement {value: "remember"} + ListElement {value: "remind"} + ListElement {value: "remove"} + ListElement {value: "render"} + ListElement {value: "renew"} + ListElement {value: "rent"} + ListElement {value: "reopen"} + ListElement {value: "repair"} + ListElement {value: "repeat"} + ListElement {value: "replace"} + ListElement {value: "report"} + ListElement {value: "require"} + ListElement {value: "rescue"} + ListElement {value: "resemble"} + ListElement {value: "resist"} + ListElement {value: "resource"} + ListElement {value: "response"} + ListElement {value: "result"} + ListElement {value: "retire"} + ListElement {value: "retreat"} + ListElement {value: "return"} + ListElement {value: "reunion"} + ListElement {value: "reveal"} + ListElement {value: "review"} + ListElement {value: "reward"} + ListElement {value: "rhythm"} + ListElement {value: "rib"} + ListElement {value: "ribbon"} + ListElement {value: "rice"} + ListElement {value: "rich"} + ListElement {value: "ride"} + ListElement {value: "ridge"} + ListElement {value: "rifle"} + ListElement {value: "right"} + ListElement {value: "rigid"} + ListElement {value: "ring"} + ListElement {value: "riot"} + ListElement {value: "ripple"} + ListElement {value: "risk"} + ListElement {value: "ritual"} + ListElement {value: "rival"} + ListElement {value: "river"} + ListElement {value: "road"} + ListElement {value: "roast"} + ListElement {value: "robot"} + ListElement {value: "robust"} + ListElement {value: "rocket"} + ListElement {value: "romance"} + ListElement {value: "roof"} + ListElement {value: "rookie"} + ListElement {value: "room"} + ListElement {value: "rose"} + ListElement {value: "rotate"} + ListElement {value: "rough"} + ListElement {value: "round"} + ListElement {value: "route"} + ListElement {value: "royal"} + ListElement {value: "rubber"} + ListElement {value: "rude"} + ListElement {value: "rug"} + ListElement {value: "rule"} + ListElement {value: "run"} + ListElement {value: "runway"} + ListElement {value: "rural"} + ListElement {value: "sad"} + ListElement {value: "saddle"} + ListElement {value: "sadness"} + ListElement {value: "safe"} + ListElement {value: "sail"} + ListElement {value: "salad"} + ListElement {value: "salmon"} + ListElement {value: "salon"} + ListElement {value: "salt"} + ListElement {value: "salute"} + ListElement {value: "same"} + ListElement {value: "sample"} + ListElement {value: "sand"} + ListElement {value: "satisfy"} + ListElement {value: "satoshi"} + ListElement {value: "sauce"} + ListElement {value: "sausage"} + ListElement {value: "save"} + ListElement {value: "say"} + ListElement {value: "scale"} + ListElement {value: "scan"} + ListElement {value: "scare"} + ListElement {value: "scatter"} + ListElement {value: "scene"} + ListElement {value: "scheme"} + ListElement {value: "school"} + ListElement {value: "science"} + ListElement {value: "scissors"} + ListElement {value: "scorpion"} + ListElement {value: "scout"} + ListElement {value: "scrap"} + ListElement {value: "screen"} + ListElement {value: "script"} + ListElement {value: "scrub"} + ListElement {value: "sea"} + ListElement {value: "search"} + ListElement {value: "season"} + ListElement {value: "seat"} + ListElement {value: "second"} + ListElement {value: "secret"} + ListElement {value: "section"} + ListElement {value: "security"} + ListElement {value: "seed"} + ListElement {value: "seek"} + ListElement {value: "segment"} + ListElement {value: "select"} + ListElement {value: "sell"} + ListElement {value: "seminar"} + ListElement {value: "senior"} + ListElement {value: "sense"} + ListElement {value: "sentence"} + ListElement {value: "series"} + ListElement {value: "service"} + ListElement {value: "session"} + ListElement {value: "settle"} + ListElement {value: "setup"} + ListElement {value: "seven"} + ListElement {value: "shadow"} + ListElement {value: "shaft"} + ListElement {value: "shallow"} + ListElement {value: "share"} + ListElement {value: "shed"} + ListElement {value: "shell"} + ListElement {value: "sheriff"} + ListElement {value: "shield"} + ListElement {value: "shift"} + ListElement {value: "shine"} + ListElement {value: "ship"} + ListElement {value: "shiver"} + ListElement {value: "shock"} + ListElement {value: "shoe"} + ListElement {value: "shoot"} + ListElement {value: "shop"} + ListElement {value: "short"} + ListElement {value: "shoulder"} + ListElement {value: "shove"} + ListElement {value: "shrimp"} + ListElement {value: "shrug"} + ListElement {value: "shuffle"} + ListElement {value: "shy"} + ListElement {value: "sibling"} + ListElement {value: "sick"} + ListElement {value: "side"} + ListElement {value: "siege"} + ListElement {value: "sight"} + ListElement {value: "sign"} + ListElement {value: "silent"} + ListElement {value: "silk"} + ListElement {value: "silly"} + ListElement {value: "silver"} + ListElement {value: "similar"} + ListElement {value: "simple"} + ListElement {value: "since"} + ListElement {value: "sing"} + ListElement {value: "siren"} + ListElement {value: "sister"} + ListElement {value: "situate"} + ListElement {value: "six"} + ListElement {value: "size"} + ListElement {value: "skate"} + ListElement {value: "sketch"} + ListElement {value: "ski"} + ListElement {value: "skill"} + ListElement {value: "skin"} + ListElement {value: "skirt"} + ListElement {value: "skull"} + ListElement {value: "slab"} + ListElement {value: "slam"} + ListElement {value: "sleep"} + ListElement {value: "slender"} + ListElement {value: "slice"} + ListElement {value: "slide"} + ListElement {value: "slight"} + ListElement {value: "slim"} + ListElement {value: "slogan"} + ListElement {value: "slot"} + ListElement {value: "slow"} + ListElement {value: "slush"} + ListElement {value: "small"} + ListElement {value: "smart"} + ListElement {value: "smile"} + ListElement {value: "smoke"} + ListElement {value: "smooth"} + ListElement {value: "snack"} + ListElement {value: "snake"} + ListElement {value: "snap"} + ListElement {value: "sniff"} + ListElement {value: "snow"} + ListElement {value: "soap"} + ListElement {value: "soccer"} + ListElement {value: "social"} + ListElement {value: "sock"} + ListElement {value: "soda"} + ListElement {value: "soft"} + ListElement {value: "solar"} + ListElement {value: "soldier"} + ListElement {value: "solid"} + ListElement {value: "solution"} + ListElement {value: "solve"} + ListElement {value: "someone"} + ListElement {value: "song"} + ListElement {value: "soon"} + ListElement {value: "sorry"} + ListElement {value: "sort"} + ListElement {value: "soul"} + ListElement {value: "sound"} + ListElement {value: "soup"} + ListElement {value: "source"} + ListElement {value: "south"} + ListElement {value: "space"} + ListElement {value: "spare"} + ListElement {value: "spatial"} + ListElement {value: "spawn"} + ListElement {value: "speak"} + ListElement {value: "special"} + ListElement {value: "speed"} + ListElement {value: "spell"} + ListElement {value: "spend"} + ListElement {value: "sphere"} + ListElement {value: "spice"} + ListElement {value: "spider"} + ListElement {value: "spike"} + ListElement {value: "spin"} + ListElement {value: "spirit"} + ListElement {value: "split"} + ListElement {value: "spoil"} + ListElement {value: "sponsor"} + ListElement {value: "spoon"} + ListElement {value: "sport"} + ListElement {value: "spot"} + ListElement {value: "spray"} + ListElement {value: "spread"} + ListElement {value: "spring"} + ListElement {value: "spy"} + ListElement {value: "square"} + ListElement {value: "squeeze"} + ListElement {value: "squirrel"} + ListElement {value: "stable"} + ListElement {value: "stadium"} + ListElement {value: "staff"} + ListElement {value: "stage"} + ListElement {value: "stairs"} + ListElement {value: "stamp"} + ListElement {value: "stand"} + ListElement {value: "start"} + ListElement {value: "state"} + ListElement {value: "stay"} + ListElement {value: "steak"} + ListElement {value: "steel"} + ListElement {value: "stem"} + ListElement {value: "step"} + ListElement {value: "stereo"} + ListElement {value: "stick"} + ListElement {value: "still"} + ListElement {value: "sting"} + ListElement {value: "stock"} + ListElement {value: "stomach"} + ListElement {value: "stone"} + ListElement {value: "stool"} + ListElement {value: "story"} + ListElement {value: "stove"} + ListElement {value: "strategy"} + ListElement {value: "street"} + ListElement {value: "strike"} + ListElement {value: "strong"} + ListElement {value: "struggle"} + ListElement {value: "student"} + ListElement {value: "stuff"} + ListElement {value: "stumble"} + ListElement {value: "style"} + ListElement {value: "subject"} + ListElement {value: "submit"} + ListElement {value: "subway"} + ListElement {value: "success"} + ListElement {value: "such"} + ListElement {value: "sudden"} + ListElement {value: "suffer"} + ListElement {value: "sugar"} + ListElement {value: "suggest"} + ListElement {value: "suit"} + ListElement {value: "summer"} + ListElement {value: "sun"} + ListElement {value: "sunny"} + ListElement {value: "sunset"} + ListElement {value: "super"} + ListElement {value: "supply"} + ListElement {value: "supreme"} + ListElement {value: "sure"} + ListElement {value: "surface"} + ListElement {value: "surge"} + ListElement {value: "surprise"} + ListElement {value: "surround"} + ListElement {value: "survey"} + ListElement {value: "suspect"} + ListElement {value: "sustain"} + ListElement {value: "swallow"} + ListElement {value: "swamp"} + ListElement {value: "swap"} + ListElement {value: "swarm"} + ListElement {value: "swear"} + ListElement {value: "sweet"} + ListElement {value: "swift"} + ListElement {value: "swim"} + ListElement {value: "swing"} + ListElement {value: "switch"} + ListElement {value: "sword"} + ListElement {value: "symbol"} + ListElement {value: "symptom"} + ListElement {value: "syrup"} + ListElement {value: "system"} + ListElement {value: "table"} + ListElement {value: "tackle"} + ListElement {value: "tag"} + ListElement {value: "tail"} + ListElement {value: "talent"} + ListElement {value: "talk"} + ListElement {value: "tank"} + ListElement {value: "tape"} + ListElement {value: "target"} + ListElement {value: "task"} + ListElement {value: "taste"} + ListElement {value: "tattoo"} + ListElement {value: "taxi"} + ListElement {value: "teach"} + ListElement {value: "team"} + ListElement {value: "tell"} + ListElement {value: "ten"} + ListElement {value: "tenant"} + ListElement {value: "tennis"} + ListElement {value: "tent"} + ListElement {value: "term"} + ListElement {value: "test"} + ListElement {value: "text"} + ListElement {value: "thank"} + ListElement {value: "that"} + ListElement {value: "theme"} + ListElement {value: "then"} + ListElement {value: "theory"} + ListElement {value: "there"} + ListElement {value: "they"} + ListElement {value: "thing"} + ListElement {value: "this"} + ListElement {value: "thought"} + ListElement {value: "three"} + ListElement {value: "thrive"} + ListElement {value: "throw"} + ListElement {value: "thumb"} + ListElement {value: "thunder"} + ListElement {value: "ticket"} + ListElement {value: "tide"} + ListElement {value: "tiger"} + ListElement {value: "tilt"} + ListElement {value: "timber"} + ListElement {value: "time"} + ListElement {value: "tiny"} + ListElement {value: "tip"} + ListElement {value: "tired"} + ListElement {value: "tissue"} + ListElement {value: "title"} + ListElement {value: "toast"} + ListElement {value: "tobacco"} + ListElement {value: "today"} + ListElement {value: "toddler"} + ListElement {value: "toe"} + ListElement {value: "together"} + ListElement {value: "toilet"} + ListElement {value: "token"} + ListElement {value: "tomato"} + ListElement {value: "tomorrow"} + ListElement {value: "tone"} + ListElement {value: "tongue"} + ListElement {value: "tonight"} + ListElement {value: "tool"} + ListElement {value: "tooth"} + ListElement {value: "top"} + ListElement {value: "topic"} + ListElement {value: "topple"} + ListElement {value: "torch"} + ListElement {value: "tornado"} + ListElement {value: "tortoise"} + ListElement {value: "toss"} + ListElement {value: "total"} + ListElement {value: "tourist"} + ListElement {value: "toward"} + ListElement {value: "tower"} + ListElement {value: "town"} + ListElement {value: "toy"} + ListElement {value: "track"} + ListElement {value: "trade"} + ListElement {value: "traffic"} + ListElement {value: "tragic"} + ListElement {value: "train"} + ListElement {value: "transfer"} + ListElement {value: "trap"} + ListElement {value: "trash"} + ListElement {value: "travel"} + ListElement {value: "tray"} + ListElement {value: "treat"} + ListElement {value: "tree"} + ListElement {value: "trend"} + ListElement {value: "trial"} + ListElement {value: "tribe"} + ListElement {value: "trick"} + ListElement {value: "trigger"} + ListElement {value: "trim"} + ListElement {value: "trip"} + ListElement {value: "trophy"} + ListElement {value: "trouble"} + ListElement {value: "truck"} + ListElement {value: "true"} + ListElement {value: "truly"} + ListElement {value: "trumpet"} + ListElement {value: "trust"} + ListElement {value: "truth"} + ListElement {value: "try"} + ListElement {value: "tube"} + ListElement {value: "tuition"} + ListElement {value: "tumble"} + ListElement {value: "tuna"} + ListElement {value: "tunnel"} + ListElement {value: "turkey"} + ListElement {value: "turn"} + ListElement {value: "turtle"} + ListElement {value: "twelve"} + ListElement {value: "twenty"} + ListElement {value: "twice"} + ListElement {value: "twin"} + ListElement {value: "twist"} + ListElement {value: "two"} + ListElement {value: "type"} + ListElement {value: "typical"} + ListElement {value: "ugly"} + ListElement {value: "umbrella"} + ListElement {value: "unable"} + ListElement {value: "unaware"} + ListElement {value: "uncle"} + ListElement {value: "uncover"} + ListElement {value: "under"} + ListElement {value: "undo"} + ListElement {value: "unfair"} + ListElement {value: "unfold"} + ListElement {value: "unhappy"} + ListElement {value: "uniform"} + ListElement {value: "unique"} + ListElement {value: "unit"} + ListElement {value: "universe"} + ListElement {value: "unknown"} + ListElement {value: "unlock"} + ListElement {value: "until"} + ListElement {value: "unusual"} + ListElement {value: "unveil"} + ListElement {value: "update"} + ListElement {value: "upgrade"} + ListElement {value: "uphold"} + ListElement {value: "upon"} + ListElement {value: "upper"} + ListElement {value: "upset"} + ListElement {value: "urban"} + ListElement {value: "urge"} + ListElement {value: "usage"} + ListElement {value: "use"} + ListElement {value: "used"} + ListElement {value: "useful"} + ListElement {value: "useless"} + ListElement {value: "usual"} + ListElement {value: "utility"} + ListElement {value: "vacant"} + ListElement {value: "vacuum"} + ListElement {value: "vague"} + ListElement {value: "valid"} + ListElement {value: "valley"} + ListElement {value: "valve"} + ListElement {value: "van"} + ListElement {value: "vanish"} + ListElement {value: "vapor"} + ListElement {value: "various"} + ListElement {value: "vast"} + ListElement {value: "vault"} + ListElement {value: "vehicle"} + ListElement {value: "velvet"} + ListElement {value: "vendor"} + ListElement {value: "venture"} + ListElement {value: "venue"} + ListElement {value: "verb"} + ListElement {value: "verify"} + ListElement {value: "version"} + ListElement {value: "very"} + ListElement {value: "vessel"} + ListElement {value: "veteran"} + ListElement {value: "viable"} + ListElement {value: "vibrant"} + ListElement {value: "vicious"} + ListElement {value: "victory"} + ListElement {value: "video"} + ListElement {value: "view"} + ListElement {value: "village"} + ListElement {value: "vintage"} + ListElement {value: "violin"} + ListElement {value: "virtual"} + ListElement {value: "virus"} + ListElement {value: "visa"} + ListElement {value: "visit"} + ListElement {value: "visual"} + ListElement {value: "vital"} + ListElement {value: "vivid"} + ListElement {value: "vocal"} + ListElement {value: "voice"} + ListElement {value: "void"} + ListElement {value: "volcano"} + ListElement {value: "volume"} + ListElement {value: "vote"} + ListElement {value: "voyage"} + ListElement {value: "wage"} + ListElement {value: "wagon"} + ListElement {value: "wait"} + ListElement {value: "walk"} + ListElement {value: "wall"} + ListElement {value: "walnut"} + ListElement {value: "want"} + ListElement {value: "warfare"} + ListElement {value: "warm"} + ListElement {value: "warrior"} + ListElement {value: "wash"} + ListElement {value: "wasp"} + ListElement {value: "waste"} + ListElement {value: "water"} + ListElement {value: "wave"} + ListElement {value: "way"} + ListElement {value: "wealth"} + ListElement {value: "weapon"} + ListElement {value: "wear"} + ListElement {value: "weasel"} + ListElement {value: "weather"} + ListElement {value: "web"} + ListElement {value: "wedding"} + ListElement {value: "weekend"} + ListElement {value: "weird"} + ListElement {value: "welcome"} + ListElement {value: "west"} + ListElement {value: "wet"} + ListElement {value: "whale"} + ListElement {value: "what"} + ListElement {value: "wheat"} + ListElement {value: "wheel"} + ListElement {value: "when"} + ListElement {value: "where"} + ListElement {value: "whip"} + ListElement {value: "whisper"} + ListElement {value: "wide"} + ListElement {value: "width"} + ListElement {value: "wife"} + ListElement {value: "wild"} + ListElement {value: "will"} + ListElement {value: "win"} + ListElement {value: "window"} + ListElement {value: "wine"} + ListElement {value: "wing"} + ListElement {value: "wink"} + ListElement {value: "winner"} + ListElement {value: "winter"} + ListElement {value: "wire"} + ListElement {value: "wisdom"} + ListElement {value: "wise"} + ListElement {value: "wish"} + ListElement {value: "witness"} + ListElement {value: "wolf"} + ListElement {value: "woman"} + ListElement {value: "wonder"} + ListElement {value: "wood"} + ListElement {value: "wool"} + ListElement {value: "word"} + ListElement {value: "work"} + ListElement {value: "world"} + ListElement {value: "worry"} + ListElement {value: "worth"} + ListElement {value: "wrap"} + ListElement {value: "wreck"} + ListElement {value: "wrestle"} + ListElement {value: "wrist"} + ListElement {value: "write"} + ListElement {value: "wrong"} + ListElement {value: "yard"} + ListElement {value: "year"} + ListElement {value: "yellow"} + ListElement {value: "you"} + ListElement {value: "young"} + ListElement {value: "youth"} + ListElement {value: "zebra"} + ListElement {value: "zero"} + ListElement {value: "zone"} + ListElement {value: "zoo"} + } +} diff --git a/src/ui/Dialogs/DialogGetPassword.qml b/src/ui/Dialogs/DialogGetPassword.qml index 2bc01348..f7e9f58e 100644 --- a/src/ui/Dialogs/DialogGetPassword.qml +++ b/src/ui/Dialogs/DialogGetPassword.qml @@ -13,6 +13,8 @@ Dialog { property alias headerMessageColor: labelHeaderMessage.color property alias password: passwordRequester.text + property url forgottenPasswordUrl: "http://skycoin.com/" + function clear() { passwordRequester.clear() standardButton(Dialog.Ok).enabled = password @@ -26,38 +28,32 @@ Dialog { title: qsTr("Password requested") standardButtons: Dialog.Ok | Dialog.Cancel - Flickable { - id: flickable - anchors.fill: parent - contentHeight: columnLayoutRoot.height + ColumnLayout { + id: columnLayoutRoot + width: parent.width + spacing: 10 clip: true - ColumnLayout { - id: columnLayoutRoot - width: parent.width - spacing: 10 - - Label { - id: labelHeaderMessage + Label { + id: labelHeaderMessage - Layout.fillWidth: true - wrapMode: Text.WordWrap - visible: text - } + Layout.fillWidth: true + wrapMode: Text.Wrap + visible: text + } - PasswordRequester { - id: passwordRequester + PasswordRequester { + id: passwordRequester - Layout.fillWidth: true + Layout.fillWidth: true - onPasswordForgotten: { - Qt.openUrlExternally("http://skycoin.com/") - } - onTextChanged: { - dialogGetPassword.standardButton(Dialog.Ok).enabled = text !== "" - password = text - } + onPasswordForgotten: { + Qt.openUrlExternally(forgottenPasswordUrl) + } + onTextChanged: { + dialogGetPassword.standardButton(Dialog.Ok).enabled = text !== "" + password = text } - } // ColumnLayout (root) - } // Flickable + } + } // ColumnLayout (root) } diff --git a/src/ui/Dialogs/DialogQR.qml b/src/ui/Dialogs/DialogQR.qml index d2fdabc0..6b32e8d9 100644 --- a/src/ui/Dialogs/DialogQR.qml +++ b/src/ui/Dialogs/DialogQR.qml @@ -38,7 +38,6 @@ Dialog { anchors.bottomMargin : 30 anchors.horizontalCenter : parent.horizontalCenter onAccepted: { - console.log(dialogQR.text) textDisplay.text = dialogQR.text } } diff --git a/src/ui/Dialogs/DialogSelectAddressByAddressBook.qml b/src/ui/Dialogs/DialogSelectAddressByAddressBook.qml new file mode 100644 index 00000000..323f027d --- /dev/null +++ b/src/ui/Dialogs/DialogSelectAddressByAddressBook.qml @@ -0,0 +1,101 @@ +import QtQuick 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Controls.Material 2.12 +import QtQuick.Layouts 1.12 + +// Resource imports +// import "qrc:/ui/src/ui/Controls" +// import "qrc:/ui/src/ui/Delegates" +import "../Controls" // For quick UI development, switch back to resources when making a release +import "../Delegates" // For quick UI development, switch back to resources when making a release + +Dialog { + id: dialogSelectAddressByAddressBook + + property ListModel listAddrsModel + property string selectedAddress + + padding: 0 + standardButtons: Dialog.Cancel + + closePolicy: Dialog.CloseOnPressOutside + onAboutToShow: { + textFieldFilterContact.forceActiveFocus() + } + + function filterByText(text) { + myDisplayAddrsModel.clear() + if (text === "") { + for(var i = 0; i < listAddrsModel.count; i++){ + myDisplayAddrsModel.append(listAddrsModel.get(i)) + } + return + } + for(var i = 0; i < listAddrsModel.count; i++) { + if (listAddrsModel.get(i).name.toLowerCase().includes(text.toLowerCase()) || listAddrsModel.get(i).address.toLowerCase().includes(text.toLowerCase())) { + myDisplayAddrsModel.append(listAddrsModel.get(i)) + } + } + } + + ColumnLayout { + anchors.fill: parent + + TextField { + id: textFieldFilterContact + + Layout.fillWidth: true + Layout.leftMargin: 10 + Layout.rightMargin: 10 + + placeholderText: qsTr("Filter address") + focus: true + selectByMouse: true + + onTextChanged: { + filterByText(textFieldFilterContact.text) + } + } + + ListView { + id: listView + model: myDisplayAddrsModel + Layout.fillWidth: true + Layout.fillHeight: true + clip: true + currentIndex: -1 + section.property: "name" + section.criteria: ViewSection.FullString + section.delegate: SectionDelegate { + width: parent.width + } + delegate: ItemDelegate { + width: parent.width + Behavior on height { NumberAnimation { easing.type: Easing.OutQuint } } + focusPolicy: Qt.NoFocus + text:coinType + "-" + address + font.family: "Code New Roman" + Material.foreground: hovered ? parent.Material.accent : parent.Material.foreground + highlighted: hovered + leftPadding: highlighted ? 2*padding : padding // added + Behavior on leftPadding { NumberAnimation { duration: 500; easing.type: Easing.OutQuint } } // added + + onHighlightedChanged: { + ListView.view.currentIndex = highlighted ? index : -1 + } + + onClicked: { + selectedAddress = address + accept() + } + } + + ScrollIndicator.vertical: ScrollIndicator { } + } // ListView + } // ColumnLayout + + ListModel{ + id: myDisplayAddrsModel + } + +} \ No newline at end of file diff --git a/src/ui/Dialogs/DialogSelectSecType.qml b/src/ui/Dialogs/DialogSelectSecType.qml new file mode 100644 index 00000000..16274954 --- /dev/null +++ b/src/ui/Dialogs/DialogSelectSecType.qml @@ -0,0 +1,77 @@ +import QtQuick 2.12 +import QtQuick.Layouts 1.12 +import QtQuick.Controls 2.12 +import QtQuick.Controls.Material 2.12 + +// Resource imports +// import "qrc:/ui/src/ui/Delegates" +import "../Delegates" // For quick UI development, switch back to resources when making a release + +Dialog { + id: dialogCreateAddressBook + + enum SecurityType { LowSecurity, MediumSecurity, StrongSecurity } + + property alias select: listViewSecurityType.currentIndex + + standardButtons: Dialog.Ok | Dialog.Cancel + + ScrollView { + id: scrollView + anchors.fill: parent + contentWidth: width + clip: true + + ColumnLayout { + anchors.fill: parent + + Label { + Layout.topMargin: 10 + Layout.leftMargin: 20 + Layout.rightMargin: 20 + Layout.fillWidth: true + + text: qsTr("Select the security type for your Address Book") + wrapMode: Text.Wrap + font.bold: true + } + + ListView { + id: listViewSecurityType + + Layout.fillWidth: true + Layout.leftMargin: 20 + Layout.rightMargin: 20 + height: contentHeight + + spacing: -6 + interactive: false + currentIndex: DialogSelectSecType.SecurityType.MediumSecurity + model: [ qsTr("Low (plain text)"), qsTr("Medium (recommended)"), qsTr("Hard (with password)") ] + delegate: RadioButton { + width: parent.width + text: modelData + checked: index === ListView.view.currentIndex + + onCheckedChanged: { + if (checked) { + ListView.view.currentIndex = index + } + } + } // RadioButton (delegate) + } // ListView (log output) + + Label { + Layout.leftMargin: 20 + Layout.rightMargin: 20 + Layout.fillWidth: true + + visible: select === DialogSelectSecType.SecurityType.StrongSecurity + text: "" + qsTr("Note:") + " " + qsTr("Accessing a password-protected address book can slowdown your device") + wrapMode: Text.Wrap + Material.foreground: Material.Red + font.italic: true + } + } // ColumnLayout + } // ScrollView +} \ No newline at end of file diff --git a/src/ui/Dialogs/DialogSetPassword.qml b/src/ui/Dialogs/DialogSetPassword.qml index 37eaeeec..80fcd114 100644 --- a/src/ui/Dialogs/DialogSetPassword.qml +++ b/src/ui/Dialogs/DialogSetPassword.qml @@ -32,49 +32,41 @@ Dialog { title: qsTr("Set a password") standardButtons: Dialog.Ok | Dialog.Cancel - Flickable { - id: flickable - - implicitHeight: contentHeight + ColumnLayout { + id: columnLayoutRoot width: parent.width - contentHeight: columnLayoutRoot.height + spacing: 10 clip: true - ColumnLayout { - id: columnLayoutRoot - width: parent.width - spacing: 10 - - Label { - id: labelHeaderMessage + Label { + id: labelHeaderMessage - Layout.fillWidth: true - wrapMode: Text.WordWrap - visible: text - } + Layout.fillWidth: true + wrapMode: Text.Wrap + visible: text + } - TextField { - id: textFieldPassword + TextField { + id: textFieldPassword - Layout.fillWidth: true - placeholderText: qsTr("Password") - selectByMouse: true - echoMode: TextField.Password - focus: true - } + Layout.fillWidth: true + placeholderText: qsTr("Password") + selectByMouse: true + echoMode: TextField.Password + focus: true + } - TextField { - id: textFieldPasswordConfirmation + TextField { + id: textFieldPasswordConfirmation - Layout.fillWidth: true - placeholderText: qsTr("Confirm password") - selectByMouse: true - echoMode: TextField.Password - enabled: textFieldPassword.text - opacity: textFieldPassword.text ? 1.0 : 0.0 - Behavior on opacity { NumberAnimation { duration: 200 } } - Material.accent: text === textFieldPassword.text ? parent.Material.accent : Material.color(Material.Red) - } - } // ColumnLayout (root) - } // Flickable + Layout.fillWidth: true + placeholderText: qsTr("Confirm password") + selectByMouse: true + echoMode: TextField.Password + enabled: textFieldPassword.text + opacity: textFieldPassword.text ? 1.0 : 0.0 + Behavior on opacity { NumberAnimation { duration: 200 } } + Material.accent: text === textFieldPassword.text ? parent.Material.accent : Material.color(Material.Red) + } + } // ColumnLayout (root) } diff --git a/src/ui/Dialogs/DialogShowContact.qml b/src/ui/Dialogs/DialogShowContact.qml new file mode 100644 index 00000000..646e85c3 --- /dev/null +++ b/src/ui/Dialogs/DialogShowContact.qml @@ -0,0 +1,56 @@ +import QtQuick 2.12 +import QtQuick.Layouts 1.12 +import QtQuick.Controls 2.12 + +import AddrsBookManager 1.0 + +// Resource imports +// import "qrc:/ui/src/ui/Delegates" +import "../Delegates" // For quick UI development, switch back to resources when making a release + +Dialog { + id: dialogShowContact + + property alias name: labelName.text + property AddrsBkAddressModel addressModel + + standardButtons: Dialog.Close + + header: ColumnLayout { + Image { + Layout.topMargin: 20 + Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter + source: "qrc:/images/resources/images/icons/user.svg" + sourceSize: "128x128" + } + + Label { + id: labelName + Layout.fillWidth: true + Layout.topMargin: 20 + horizontalAlignment: Qt.AlignHCenter + font.bold: true + } + } + + ScrollView { + anchors.fill: parent + clip: true + + ListView { + id: addresses + + model: addressModel + delegate: ItemDelegate { + id: addressdelegate + width: parent.width + text: value + } + section.property: "coinType" + section.criteria: ViewSection.FullString + section.delegate: SectionDelegate { + width: addresses.width + } + } + } // ScrollView +} \ No newline at end of file diff --git a/src/ui/Dialogs/DialogTransactionDetails.qml b/src/ui/Dialogs/DialogTransactionDetails.qml index 63c35bcc..15834c86 100644 --- a/src/ui/Dialogs/DialogTransactionDetails.qml +++ b/src/ui/Dialogs/DialogTransactionDetails.qml @@ -25,37 +25,9 @@ Dialog { title: qsTr("Transaction details") standardButtons: Dialog.Ok - Flickable { - id: flickable + TransactionDetails { + id: transactionDetails anchors.fill: parent clip: true - contentHeight: columnLayoutRoot.height - - ColumnLayout { - id: columnLayoutRoot - width: parent.width - spacing: 20 - - TransactionDetails { - id: transactionDetails - implicitWidth: 500 - Layout.fillWidth: true - } - - Rectangle { - visible: transactionDetails.expanded - height: 1 - color: Material.color(Material.Grey) - Layout.fillWidth: true - } - } // ColumnLayout - - ScrollIndicator.vertical: ScrollIndicator { - parent: dialogTransactionsDetails.contentItem - anchors.top: flickable.top - anchors.bottom: flickable.bottom - anchors.right: parent.right - anchors.rightMargin: -dialogTransactionsDetails.rightPadding + 1 - } } } diff --git a/src/ui/Dialogs/DialogUnconfiguredWallet.qml b/src/ui/Dialogs/DialogUnconfiguredWallet.qml index 3e652186..86b0f658 100644 --- a/src/ui/Dialogs/DialogUnconfiguredWallet.qml +++ b/src/ui/Dialogs/DialogUnconfiguredWallet.qml @@ -2,6 +2,7 @@ import QtQuick 2.12 import QtQuick.Controls 2.12 import QtQuick.Controls.Material 2.12 import QtQuick.Layouts 1.12 +import DeviceInteraction 1.0 Dialog { id: dialogUnconfiguredWallet @@ -9,6 +10,21 @@ Dialog { title: qsTr("Unconfigured wallet") standardButtons: Dialog.Abort closePolicy: Dialog.NoAutoClose + DeviceInteraction { + id: deviceInteraction2 + onOperationDone: { + deviceInteraction2.deviceFeatures(); + } + onIsInitializedDetermined: { + buttonAutoConfDevice.visible = !isInitialized; + buttonRecoveryDevice.visible = !isInitialized; + } + } + onAboutToShow: deviceInteraction2.deviceFeatures(); + onRejected: { + deviceInteraction2.initializeWasWarn(); + topLevelDialogLocker.unlock(); + } Flickable { id: flickable @@ -53,16 +69,48 @@ Dialog { font.bold: true Layout.fillWidth: true } - ItemDelegate { - id: buttonAutoConf - text: qsTr("Configure automatically") + RowLayout { + id: buttonAutoConfDevice Layout.fillWidth: true + ItemDelegate { + text: qsTr("Configure automatically") + Layout.fillWidth: true + MouseArea { + anchors.fill: parent + onClicked: { + deviceInteraction2.generateMnemonic(+generateWordCount.currentText, generateUsePassphrase.checked); + } + } + } + CheckBox { + id: generateUsePassphrase + text: qsTr("Use pass phrase") + enabled: false + } + ComboBox { + id: generateWordCount + model: [12, 24] + } } - ItemDelegate { - id: buttonBackupConf - text: qsTr("Restore backup") + RowLayout { + id: buttonRecoveryDevice Layout.fillWidth: true - + ItemDelegate { + text: qsTr("Restore backup") + Layout.fillWidth: true + onClicked: { + deviceInteraction2.restoreBackup(+recoveryWordCount.currentText, recoveryUsePassphrase.checked) + } + } + CheckBox { + id: recoveryUsePassphrase + text: qsTr("Use pass phrase") + enabled: false + } + ComboBox { + id: recoveryWordCount + model: [12, 24] + } } } } // ColumnLayout (root) diff --git a/src/ui/Dialogs/GetWordDialog.qml b/src/ui/Dialogs/GetWordDialog.qml new file mode 100644 index 00000000..a05bd9db --- /dev/null +++ b/src/ui/Dialogs/GetWordDialog.qml @@ -0,0 +1,41 @@ +import QtQuick 2.12 +import QtQuick.Layouts 1.12 +import QtQuick.Controls 2.12 + +Dialog { + property string hint: "" + property string label: '' + property alias selectedName : editTextItem.text + + standardButtons: Dialog.Ok | Dialog.Cancel + onVisibleChanged: { + editTextItem.focus = true + editTextItem.selectAll() + } +// onButtonClicked: { +// Qt.inputMethod.hide(); +// } + Flickable { + id: flickable + anchors.fill: parent + contentHeight: columnLayoutRoot.height + clip: true + + ColumnLayout { + width: parent.width +// implicitWidth: parent.width + // implicitHeight: 100 + Label { + id: labelHeaderMessage + text: label + Layout.fillWidth: true + wrapMode: Text.WordWrap + } + TextField { + id: editTextItem + text: hint + color: Style.text + } + } + } +} diff --git a/src/ui/Dialogs/MsgDialog.qml b/src/ui/Dialogs/MsgDialog.qml index 74ad2de9..db056c97 100644 --- a/src/ui/Dialogs/MsgDialog.qml +++ b/src/ui/Dialogs/MsgDialog.qml @@ -49,7 +49,7 @@ Dialog { id: icon source: "qrc:/images/resources/images/icons/appIcon/appIcon.png" sourceSize: "64x64" - Layout.alignment: Qt.AlighLeft | Qt.AlignTop + Layout.alignment: Qt.AlignLeft | Qt.AlignTop } Label { id: msg diff --git a/src/ui/Dialogs/NumPadDialog.qml b/src/ui/Dialogs/NumPadDialog.qml index f64c339f..a97a5b9e 100644 --- a/src/ui/Dialogs/NumPadDialog.qml +++ b/src/ui/Dialogs/NumPadDialog.qml @@ -15,9 +15,27 @@ Dialog { title: Qt.application.name readonly property string numPadButtonText: "#" - readonly property real numPadButtonImplicitSize: 50 + readonly property real numPadButtonImplicitSideSize: 50 readonly property real numPadButtonPointSize: 18 + function clear(newTitle) { + textInput.clear() + title = newTitle + if (newTitle === "enter new pin:") { + labelInstructions.text = + qsTr("Enter a hard-to-guess PIN of between 4 and 8 digits. " + + "The PIN layout is displayed in the hardware wallet screen.") + } else if (newTitle === "confirm new pin:") { + labelInstructions.text = + qsTr("If you forget the new PIN you will no able to work " + + "with this device configuretion.") + } else if (newTitle === "enter current pin:") { + labelInstructions.text = + qsTr("This device is currently protected with a PIN, to " + + "be able to work with it, you need to enter the PIN.") + } + } + Component.onCompleted: { standardButton(Dialog.Ok).enabled = textInput.length >= 4 } @@ -25,6 +43,14 @@ Dialog { onAboutToShow: { textInput.forceActiveFocus() } + onRejected: { + bridgeForPassword.errMessage = "Action canceled"; + bridgeForPassword.unlock() + } + onAccepted: { + bridgeForPassword.setResult(textInput.text) + bridgeForPassword.unlock() + } Flickable { id: flickable @@ -38,8 +64,7 @@ Dialog { Label { id: labelInstructions - text: qsTr("Enter a hard-to-guess PIN of between 4 and 8 digits. " + - "The PIN layout is displayed in the hardware wallet screen.") + text: qsTr("instructions") Layout.fillWidth: true Layout.alignment: Qt.AlignHCenter horizontalAlignment: Label.AlignHCenter @@ -52,9 +77,12 @@ Dialog { placeholderText: qsTr("12345678") selectByMouse: true validator: IntValidator { + id: intValidator bottom: 11111111 top: 99999999 } + echoMode: TextField.Password + passwordCharacter: '#' inputMethodHints: Qt.ImhDigitsOnly Layout.fillWidth: true @@ -64,6 +92,21 @@ Dialog { onTextChanged: { standardButton(Dialog.Ok).enabled = textInput.length >= 4 } + function admitMoreDigits() { + return intValidator.top.toString().length - textInput.text.length > 0; + } + function toggleEnabledButtonsIfAny() { + gridNumPad.enabled = admitMoreDigits(); + backspace.enabled = textInput.text.length > 0; + } + function addChar(ch) { + textInput.text += ch; + toggleEnabledButtonsIfAny(); + } + function removeLastChar() { + textInput.text = textInput.text.slice(0, -1); + toggleEnabledButtonsIfAny(); + } } Rectangle { @@ -84,303 +127,38 @@ Dialog { Layout.alignment: Qt.AlignCenter columns: 3 - ItemDelegate { - id: topLeft - text: numPadButtonText - font.pointSize: numPadButtonPointSize - implicitWidth: numPadButtonImplicitSize - implicitHeight: numPadButtonImplicitSize - - Shortcut { - sequence: "7" - onActivated: { - topLeft.clicked() - topLeftAnimation.start() - } - } - onClicked: { - console.log("Top Left clicked") - } - - SequentialAnimation { - id: topLeftAnimation - loops: 1 - PropertyAction { target: topLeft; property: "downSym"; value: true } - PauseAnimation { duration: 350 } - PropertyAction { target: topLeft; property: "downSym"; value: false } - } - - property bool downSym: down - property color color: (down || downSym) ? Material.color(Material.Amber) : hovered ? numPadDialog.Material.accent : numPadDialog.Material.foreground - Material.foreground: color - - Behavior on color { ColorAnimation {} } - } - - ItemDelegate { - id: topCenter - text: numPadButtonText - font.pointSize: numPadButtonPointSize - implicitWidth: numPadButtonImplicitSize - implicitHeight: numPadButtonImplicitSize - - Shortcut { - sequence: "8" - onActivated: { - topCenter.clicked() - topCenterAnimation.start() - } - } - onClicked: { - console.log("Top Center clicked") - } - - SequentialAnimation { - id: topCenterAnimation - loops: 1 - PropertyAction { target: topCenter; property: "downSym"; value: true } - PauseAnimation { duration: 350 } - PropertyAction { target: topCenter; property: "downSym"; value: false } - } - - property bool downSym: down - property color color: (down || downSym) ? Material.color(Material.Amber) : hovered ? numPadDialog.Material.accent : numPadDialog.Material.foreground - Material.foreground: color - - Behavior on color { ColorAnimation {} } - } - - ItemDelegate { - id: topRight - text: numPadButtonText - font.pointSize: numPadButtonPointSize - implicitWidth: numPadButtonImplicitSize - implicitHeight: numPadButtonImplicitSize - - Shortcut { - sequence: "9" - onActivated: { - topRight.clicked() - topRightAnimation.start() - } - } - onClicked: { - console.log("Top Right clicked") - } + readonly property var sequences: [ 7, 8, 9, 4, 5, 6, 1, 2, 3 ] + readonly property var positionsStrings: [ "Top left", "Top center", "Top right", "Center left", "Center", "Center right", "Bottom left", "Bottom center", "Bottom right" ] - SequentialAnimation { - id: topRightAnimation - loops: 1 - PropertyAction { target: topRight; property: "downSym"; value: true } - PauseAnimation { duration: 350 } - PropertyAction { target: topRight; property: "downSym"; value: false } - } - - property bool downSym: down - property color color: (down || downSym) ? Material.color(Material.Amber) : hovered ? numPadDialog.Material.accent : numPadDialog.Material.foreground - Material.foreground: color + Repeater { + model: 9 - Behavior on color { ColorAnimation {} } - } + delegate: ItemDelegate { + id: itemDelegateNumPadButton - ItemDelegate { - id: centerLeft - text: numPadButtonText - font.pointSize: numPadButtonPointSize - implicitWidth: numPadButtonImplicitSize - implicitHeight: numPadButtonImplicitSize + text: numPadButtonText + font.pointSize: numPadButtonPointSize + implicitWidth: numPadButtonImplicitSideSize + implicitHeight: numPadButtonImplicitSideSize - Shortcut { - sequence: "4" - onActivated: { - centerLeft.clicked() - centerLeftAnimation.start() + Shortcut { + sequence: gridNumPad.sequences[index].toString() + enabled: numPadDialog.visible + onActivated: { + itemDelegateNumPadButton.clicked() + } } - } - onClicked: { - console.log("Center Left clicked") - } - - SequentialAnimation { - id: centerLeftAnimation - loops: 1 - PropertyAction { target: centerLeft; property: "downSym"; value: true } - PauseAnimation { duration: 350 } - PropertyAction { target: centerLeft; property: "downSym"; value: false } - } - - property bool downSym: down - property color color: (down || downSym) ? Material.color(Material.Amber) : hovered ? numPadDialog.Material.accent : numPadDialog.Material.foreground - Material.foreground: color - - Behavior on color { ColorAnimation {} } - } - - ItemDelegate { - id: centerCenter - text: numPadButtonText - font.pointSize: numPadButtonPointSize - implicitWidth: numPadButtonImplicitSize - implicitHeight: numPadButtonImplicitSize - - Shortcut { - sequence: "5" - onActivated: { - centerCenter.clicked() - centerCenterAnimation.start() + onClicked: { + console.log(gridNumPad.positionsStrings[index], "clicked") + textInput.addChar(gridNumPad.sequences[index].toString()); } - } - onClicked: { - console.log("Center Center clicked") - } - SequentialAnimation { - id: centerCenterAnimation - loops: 1 - PropertyAction { target: centerCenter; property: "downSym"; value: true } - PauseAnimation { duration: 350 } - PropertyAction { target: centerCenter; property: "downSym"; value: false } - } - - property bool downSym: down - property color color: (down || downSym) ? Material.color(Material.Amber) : hovered ? numPadDialog.Material.accent : numPadDialog.Material.foreground - Material.foreground: color - - Behavior on color { ColorAnimation {} } - } - - ItemDelegate { - id: centerRight - text: numPadButtonText - font.pointSize: numPadButtonPointSize - implicitWidth: numPadButtonImplicitSize - implicitHeight: numPadButtonImplicitSize - - Shortcut { - sequence: "6" - onActivated: { - centerRight.clicked() - centerRightAnimation.start() - } - } - onClicked: { - console.log("Center Right clicked") - } - - SequentialAnimation { - id: centerRightAnimation - loops: 1 - PropertyAction { target: centerRight; property: "downSym"; value: true } - PauseAnimation { duration: 350 } - PropertyAction { target: centerRight; property: "downSym"; value: false } - } - - property bool downSym: down - property color color: (down || downSym) ? Material.color(Material.Amber) : hovered ? numPadDialog.Material.accent : numPadDialog.Material.foreground - Material.foreground: color - - Behavior on color { ColorAnimation {} } - } - - ItemDelegate { - id: bottomLeft - text: numPadButtonText - font.pointSize: numPadButtonPointSize - implicitWidth: numPadButtonImplicitSize - implicitHeight: numPadButtonImplicitSize - - Shortcut { - sequence: "1" - onActivated: { - bottomLeft.clicked() - bottomLeftAnimation.start() - } - } - onClicked: { - console.log("Bottom Left clicked") - } - - SequentialAnimation { - id: bottomLeftAnimation - loops: 1 - PropertyAction { target: bottomLeft; property: "downSym"; value: true } - PauseAnimation { duration: 350 } - PropertyAction { target: bottomLeft; property: "downSym"; value: false } - } - - property bool downSym: down - property color color: (down || downSym) ? Material.color(Material.Amber) : hovered ? numPadDialog.Material.accent : numPadDialog.Material.foreground - Material.foreground: color - - Behavior on color { ColorAnimation {} } - } - - ItemDelegate { - id: bottomCenter - text: numPadButtonText - font.pointSize: numPadButtonPointSize - implicitWidth: numPadButtonImplicitSize - implicitHeight: numPadButtonImplicitSize - - Shortcut { - sequence: "2" - onActivated: { - bottomCenter.clicked() - bottomCenterAnimation.start() - } - } - onClicked: { - console.log("Bottom Center clicked") - } - - SequentialAnimation { - id: bottomCenterAnimation - loops: 1 - PropertyAction { target: bottomCenter; property: "downSym"; value: true } - PauseAnimation { duration: 350 } - PropertyAction { target: bottomCenter; property: "downSym"; value: false } - } - - property bool downSym: down - property color color: (down || downSym) ? Material.color(Material.Amber) : hovered ? numPadDialog.Material.accent : numPadDialog.Material.foreground - Material.foreground: color - - Behavior on color { ColorAnimation {} } - } - - ItemDelegate { - id: bottomRight - text: numPadButtonText - font.pointSize: numPadButtonPointSize - implicitWidth: numPadButtonImplicitSize - implicitHeight: numPadButtonImplicitSize - - Shortcut { - sequence: "3" - onActivated: { - bottomRight.clicked() - bottomRightAnimation.start() - } - } - onClicked: { - console.log("Bottom Right clicked") - } - - SequentialAnimation { - id: bottomRightAnimation - loops: 1 - PropertyAction { target: bottomRight; property: "downSym"; value: true } - PauseAnimation { duration: 350 } - PropertyAction { target: bottomRight; property: "downSym"; value: false } - } - - property bool downSym: down - property color color: (down || downSym) ? Material.color(Material.Amber) : hovered ? numPadDialog.Material.accent : numPadDialog.Material.foreground - Material.foreground: color - - Behavior on color { ColorAnimation {} } - } - } + property bool downSym: down + property color color: (down || downSym) ? Material.color(Material.Amber) : hovered ? numPadDialog.Material.accent : numPadDialog.Material.foreground + Material.foreground: color + } // ItemDelegate (delegate) + } // Repeater + } // GridLayout ItemDelegate { id: backspace @@ -389,31 +167,21 @@ Dialog { font.pointSize: numPadButtonPointSize Layout.fillWidth: true Layout.alignment: Qt.AlignCenter + enabled: false Shortcut { sequence: "Backspace" onActivated: { backspace.clicked() - backspaceAnimation.start() } } onClicked: { - console.log("Backspace clicked") - } - - SequentialAnimation { - id: backspaceAnimation - loops: 1 - PropertyAction { target: backspace; property: "downSym"; value: true } - PauseAnimation { duration: 350 } - PropertyAction { target: backspace; property: "downSym"; value: false } + textInput.removeLastChar(); } property bool downSym: down property color color: (down || downSym) ? Material.color(Material.Amber) : hovered ? numPadDialog.Material.accent : numPadDialog.Material.foreground Material.foreground: color - - Behavior on color { ColorAnimation {} } } // GridLayout (numpad) } // ColumnLayout (numpad) } // Rectangle (numpad) @@ -433,12 +201,11 @@ Dialog { } // ColumnLayout (root) ScrollIndicator.vertical: ScrollIndicator { - parent: msgDialog.contentItem + parent: numPadDialog.contentItem anchors.top: flickable.top anchors.bottom: flickable.bottom anchors.right: parent.right - anchors.rightMargin: -msgDialog.rightPadding + 1 + anchors.rightMargin: -numPadDialog.rightPadding + 1 } } // Flickable - } diff --git a/src/ui/Dialogs/RestoreBackupWordsDialog.qml b/src/ui/Dialogs/RestoreBackupWordsDialog.qml deleted file mode 100644 index a64bb62d..00000000 --- a/src/ui/Dialogs/RestoreBackupWordsDialog.qml +++ /dev/null @@ -1,89 +0,0 @@ -import QtQuick 2.12 -import QtQuick.Controls 2.12 -import QtQuick.Controls.Material 2.12 -import QtQuick.Layouts 1.12 - -// Resource imports -// import "qrc:/ui/src/ui/Controls" -import "../Controls" // For quick UI development, switch back to resources when making a release - -Dialog { - id: restoreBackupWordsDialog - - property bool finalEntry: false - - title: Qt.application.name - standardButtons: Dialog.YesToAll | Dialog.Cancel - closePolicy: Dialog.NoAutoClose - - Component.onCompleted: { - standardButton(Dialog.YesToAll).text = finalEntry ? qsTr("Finish") : qsTr("Next") - standardButton(Dialog.YesToAll).enabled = wordInput.text !== "" - } - - Flickable { - id: flickable - anchors.fill: parent - contentHeight: columnLayoutRoot.height - clip: true - - ColumnLayout { - id: columnLayoutRoot - width: parent.width - spacing: 50 - - RowLayout { - id: rowLayoutIconMessage - spacing: 30 - - Image { - id: icon - source: "qrc:/images/resources/images/icons/backup.svg" - sourceSize: "64x64" - Layout.alignment: Qt.AlighLeft | Qt.AlignTop - } - - ColumnLayout { - id: columnLayoutMessage - Label { - id: msgTitle - text: "" + qsTr("Enter the word indicated in the device") + "" - Layout.fillWidth: true - wrapMode: Text.WordWrap - Layout.alignment: Qt.AlignTop - } - - Label { - id: msg - text: qsTr("You will be asked to enter the words " + - "of your backup seed in random order, " + - "plus a few additinal words.") - Layout.fillWidth: true - wrapMode: Text.WordWrap - Layout.alignment: Qt.AlignTop - } - } // ColumnLayout (message) - } // RowLayout (icon + message) - - TextField { - id: wordInput - placeholderText: qsTr("Requested word") - Layout.fillWidth: true - focus: restoreBackupWordsDialog.focus - selectByMouse: true - - onTextChanged: { - standardButton(Dialog.YesToAll).enabled = text !== "" - } - } - } // ColumnLayout (root) - - ScrollIndicator.vertical: ScrollIndicator { - parent: restoreBackupWordsDialog.contentItem - anchors.top: flickable.top - anchors.bottom: flickable.bottom - anchors.right: parent.right - anchors.rightMargin: -restoreBackupWordsDialog.rightPadding + 1 - } - } // Flickable -} diff --git a/src/ui/Dialogs/SecureWalletDialog.qml b/src/ui/Dialogs/SecureWalletDialog.qml index 2a7b9b79..f91ff7a6 100644 --- a/src/ui/Dialogs/SecureWalletDialog.qml +++ b/src/ui/Dialogs/SecureWalletDialog.qml @@ -2,6 +2,7 @@ import QtQuick 2.12 import QtQuick.Controls 2.12 import QtQuick.Controls.Material 2.12 import QtQuick.Layouts 1.12 +import DeviceInteraction 1.0 Dialog { id: secureWalletDialog @@ -15,6 +16,33 @@ Dialog { title: Qt.application.name standardButtons: Dialog.Abort closePolicy: Dialog.NoAutoClose + DeviceInteraction { + id: deviceInteraction + onHasPinDetermined: enablePINWarning = !hasPin; + onNameDetermined: deviceName = name + onNeedsBackupDetermined: enableBackupWarning = needsBackup; + onOperationDone: { + deviceInteraction.deviceFeatures(); + unblockButtons(); + } + } + onAboutToShow: deviceInteraction.deviceFeatures(); + onRejected: { + deviceInteraction.secureWasWarn(); + topLevelDialogLocker.unlock(); + } + function setEnableButtons(enabled) { + buttonCreateBackup.enabled = enabled; + buttonWipeDevice.enabled = enabled; + buttonCreatePIN.enabled = enabled; + secureWalletDialog.standardButton(Dialog.Abort).enabled = enabled; + } + function blockButtons() { + setEnableButtons(false); + } + function unblockButtons() { + setEnableButtons(true); + } Flickable { id: flickable @@ -117,18 +145,39 @@ Dialog { visible: enableBackupWarning text: qsTr("Create a backup") Layout.fillWidth: true + MouseArea { + anchors.fill: parent + onClicked: { + blockButtons(); + deviceInteraction.backupDevice(); + } + } } ItemDelegate { id: buttonCreatePIN visible: enablePINWarning text: qsTr("Create PIN code") Layout.fillWidth: true + MouseArea { + anchors.fill: parent + onClicked: { + blockButtons(); + deviceInteraction.changePin(); + } + } } ItemDelegate { id: buttonWipeDevice text: qsTr("Wipe device") Layout.fillWidth: true Material.foreground: Material.Pink + MouseArea { + anchors.fill: parent + onClicked: { + blockButtons(); + deviceInteraction.wipeDevice(); + } + } } } // ColumnLayout (options) } // ColumnLayouts (warnings + options) diff --git a/src/ui/Dialogs/SkyWalletInteractionDialog.qml b/src/ui/Dialogs/SkyWalletInteractionDialog.qml new file mode 100644 index 00000000..0df203f9 --- /dev/null +++ b/src/ui/Dialogs/SkyWalletInteractionDialog.qml @@ -0,0 +1,110 @@ +import QtQuick 2.12 +import QtQuick.Layouts 1.12 +import QtQuick.Controls.Material 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Dialogs 1.1 + +import DeviceInteraction 1.0 +// Resource imports +// import "qrc:/ui/src/ui/" +import "../" // For quick UI development, switch back to resources when making a release + +Dialog { + id: deviceInteractionDialog + title: qsTr("Device administration") + standardButtons: Dialog.Ok + DeviceInteraction { + id: deviceInteraction3 + onBootModeDetermined: { + uploadNewFirmware.visible = bootloader + wipeDevice.visible = !bootloader + changeDeviceName.visible = !bootloader + } + onNameDetermined: deviceNameDialog.hint = name; + } + onAboutToShow: deviceInteraction3.deviceFeatures() + onAccepted: deviceInteraction.deviceInteractionWasWarn() + FileDialog { + id: fileDialog + title: "Please choose a file" + folder: shortcuts.home + selectMultiple: false + nameFilters: [ "Firmware image files (*.bin)", "All files (*)" ] + onAccepted: { + deviceInteraction3.firmwareUpload(fileDialog.fileUrl) + } + } + GetWordDialog { + id: deviceNameDialog + anchors.centerIn: Overlay.overlay + width: applicationWindow.width > 440 ? 440 - 40 : applicationWindow.width - 40 + height: applicationWindow.height > 240 ? 240 - 40 : applicationWindow.height - 40 + focus: true + modal: true + + title: qsTr('Please choose the new device name') + label: qsTr("Device name") + hint: 'aaaaaa' + onAccepted: { + deviceInteraction3.changeDeviceName(deviceNameDialog.selectedName) + } + } + + Flickable { + id: flickable + anchors.fill: parent + contentHeight: columnLayoutRoot.height + clip: true + ColumnLayout { + id: columnLayoutRoot + spacing: 30 + Image { + id: icon + source: "qrc:/images/resources/images/icons/backup.svg" + sourceSize: "64x64" + Layout.alignment: Qt.AlignTop + } + ColumnLayout { + width: parent.width + spacing: 30 + ColumnLayout { + ItemDelegate { + id: changeDeviceName + text: qsTr("Change device name") + Layout.fillWidth: true + onClicked: deviceNameDialog.open() + } + } + ColumnLayout { + Label { + text: qsTr("--------------- Danger zone ---------------") + Material.foreground: Material.Pink + visible: wipeDevice.visible || uploadNewFirmware.visible + } + ItemDelegate { + id: uploadNewFirmware + text: qsTr( "Upload new firmware") + Material.foreground: Material.Pink + Layout.fillWidth: true + onClicked: fileDialog.open() + } + ItemDelegate { + id: wipeDevice + text: qsTr("Wipe device") + Layout.fillWidth: true + Material.foreground: Material.Pink + onClicked: deviceInteraction3.wipeDevice() + } + } + } + } // ColumnLayout (root) + + ScrollIndicator.vertical: ScrollIndicator { + parent: deviceInteractionDialog.contentItem + anchors.top: flickable.top + anchors.bottom: flickable.bottom + anchors.right: parent.right + anchors.rightMargin: -deviceInteractionDialog.rightPadding + 1 + } + } // Flickable +} diff --git a/src/ui/GeneralStackView.qml b/src/ui/GeneralStackView.qml index 66a605a3..a85ca248 100644 --- a/src/ui/GeneralStackView.qml +++ b/src/ui/GeneralStackView.qml @@ -9,6 +9,8 @@ Item { property alias depth: stackView.depth property alias busy: stackView.busy + signal backRequested() + function openOutputsPage() { if (stackView.depth > 1) { stackView.replace(componentOutputs) @@ -80,6 +82,18 @@ Item { } } + function openSettingsAddressBookPage() { + stackView.push(componentSettingsAddressBook) + } + + function openAddressBookPage() { + if (stackView.depth > 1) { + stackView.replace(componentAddressBook) + } else { + stackView.push(componentAddressBook) + } + } + function pop() { stackView.pop() } @@ -158,6 +172,18 @@ Item { } } + Component { + id: componentAddressBook + + AddressBook { + id: addressBook + + onCanceled: { + backRequested() + } + } + } + Component { id: componentSettings @@ -166,5 +192,11 @@ Item { } } - + Component { + id: componentSettingsAddressBook + + SettingsAddressBook { + id: settingsAddressBook + } + } } diff --git a/src/ui/HistoryFilterList.qml b/src/ui/HistoryFilterList.qml index 4385b4fb..91af18fd 100644 --- a/src/ui/HistoryFilterList.qml +++ b/src/ui/HistoryFilterList.qml @@ -1,45 +1,50 @@ import QtQuick 2.12 import QtQuick.Controls 2.12 import QtQuick.Controls.Material 2.12 -import QtQuick.Layouts 1.12 import WalletsManager 1.0 // Resource imports // import "qrc:/ui/src/ui/Delegates" import "Delegates/" // For quick UI development, switch back to resources when making a release -Item { - id: root - readonly property alias count: listViewFilters.count - property alias interactive: listViewFilters.interactive - property alias contentHeight: listViewFilters.contentHeight - - clip: true + +ScrollView { + id: historyFilterDelegate + signal loadWallets() ListView { id: listViewFilters - anchors.fill: parent + width: parent.width spacing: 10 model: modelFilters - delegate: HistoryFilterListDelegate {} - } - - ModelManager { - id: modelManager - - Component.onCompleted: { - setWalletManager(walletManager) + delegate: HistoryFilterListDelegate { + property var listAddresses + width: parent.width } - } - WalletModel { - id: modelFilters - - Component.onCompleted: { - loadModel(walletManager.getWallets()) + ModelManager { + id: modelManager + + Component.onCompleted: { + setWalletManager(walletManager) + } + } + Connections{ + target: historyFilterDelegate + onLoadWallets:{ + modelFilters.loadModel(walletManager.getWallets()) + } + } + + WalletModel { + id: modelFilters + + Component.onCompleted: { + loadModel(walletManager.getWallets()) + } } } -} +} \ No newline at end of file diff --git a/src/ui/MenuThemeAccent.qml b/src/ui/MenuThemeAccent.qml index 13594e93..d5c15560 100644 --- a/src/ui/MenuThemeAccent.qml +++ b/src/ui/MenuThemeAccent.qml @@ -10,7 +10,6 @@ Menu { readonly property color currentAccent: applicationWindow.accentColor property int currentSelectedIndex // initialized when the component is completed (see bellow) readonly property var materialPredefinedColors: [ - Material.Red, Material.Pink, Material.Purple, Material.DeepPurple, @@ -74,6 +73,8 @@ Menu { property int markedIndex: 5 + width: columns * (48 + columnSpacing) + columnSpacing + columns: 4 columnSpacing: 10 rowSpacing: 10 @@ -82,7 +83,7 @@ Menu { bottomPadding: 4 Repeater { - model: 19 + model: materialPredefinedColors.length delegate: Rectangle { id: rectangleDelegate diff --git a/src/ui/Outputs.qml b/src/ui/Outputs.qml index 57353c64..4ba130e0 100644 --- a/src/ui/Outputs.qml +++ b/src/ui/Outputs.qml @@ -87,16 +87,6 @@ Page { QWallets { id: modelWallets } - property Timer timer: Timer { - id: addressModelTimer - interval: 0 - repeat: false - running: true - onTriggered: { - modelWallets.cleanModel() - modelWallets.loadModel() - } - } BusyIndicator { id: busyIndicator diff --git a/src/ui/PageHistory.qml b/src/ui/PageHistory.qml index bbca06fb..32fbf8b0 100644 --- a/src/ui/PageHistory.qml +++ b/src/ui/PageHistory.qml @@ -26,11 +26,11 @@ Page { onClicked:{ if (!checked) { modelTransactions.clear() - modelTransactions.addMultipleTransactions(historyManager.loadHistory()) + modelTransactions.addMultipleTransactions(historyManager.getTransactions()) } else { modelTransactions.clear() - modelTransactions.addMultipleTransactions(historyManager.loadHistoryWithFilters()) + modelTransactions.addMultipleTransactions(historyManager.getTransactionsWithFilters()) } } } @@ -69,10 +69,8 @@ Page { id: toolTipFilters anchors.centerIn: Overlay.overlay - - readonly property real minimumHeight: Math.min(applicationWindow.height - 100, filter.contentHeight + 150) - width: 300 - height: minimumHeight + width: applicationWindow.width > 440 ? 440 - 40 : applicationWindow.width - 40 + height: Math.min(applicationWindow.height - 40, filter.contentHeight + header.height + footer.height + topPadding + bottomPadding) modal: true standardButtons: Dialog.Close @@ -81,9 +79,13 @@ Page { onClosed: { modelTransactions.clear() - modelTransactions.addMultipleTransactions(historyManager.loadHistoryWithFilters()) + modelTransactions.addMultipleTransactions(historyManager.getTransactionsWithFilters()) + } + + onOpened:{ + filter.loadWallets() } - + HistoryFilterList { id: filter anchors.fill: parent @@ -103,15 +105,15 @@ Page { modal: true focus: true - date: listTransactions.currentItem !== null ? listTransactions.currentItem.modelDate : "" - status: listTransactions.currentItem !== null ? listTransactions.currentItem.modelStatus : 0 - type: listTransactions.currentItem !== null ? listTransactions.currentItem.modelType : 0 - amount: listTransactions.currentItem !== null ? listTransactions.currentItem.modelAmount : "" - hoursReceived: listTransactions.currentItem !== null ? listTransactions.currentItem.modelHoursReceived : 1 - hoursBurned: listTransactions.currentItem !== null ? listTransactions.currentItem.modelHoursBurned : 1 - transactionID: listTransactions.currentItem !== null ? listTransactions.currentItem.modelTransactionID : "" - modelInputs: listTransactions.currentItem !== null ? listTransactions.currentItem.modelInputs : null - modelOutputs: listTransactions.currentItem !== null ? listTransactions.currentItem.modelOutputs : null + date: listTransactions.currentItem ? listTransactions.currentItem.modelDate : "" + status: listTransactions.currentItem ? listTransactions.currentItem.modelStatus : 0 + type: listTransactions.currentItem ? listTransactions.currentItem.modelType : 0 + amount: listTransactions.currentItem ? listTransactions.currentItem.modelAmount : "" + hoursReceived: listTransactions.currentItem ? listTransactions.currentItem.modelHoursReceived : 1 + hoursBurned: listTransactions.currentItem ? listTransactions.currentItem.modelHoursBurned : 1 + transactionID: listTransactions.currentItem ? listTransactions.currentItem.modelTransactionID : "" + modelInputs: listTransactions.currentItem ? listTransactions.currentItem.modelInputs : null + modelOutputs: listTransactions.currentItem ? listTransactions.currentItem.modelOutputs : null } QTransactionList { @@ -120,9 +122,14 @@ Page { HistoryManager { id: historyManager + onNewTransactions: { + if (!switchFilters.checked) { + modelTransactions.addMultipleTransactions(historyManager.getNewTransactions()) + } + else { + modelTransactions.addMultipleTransactions(historyManager.getNewTransactionsWithFilters()) + } + } } - Component.onCompleted: { - modelTransactions.addMultipleTransactions(historyManager.loadHistory()) - } } diff --git a/src/ui/PageSend.qml b/src/ui/PageSend.qml index f451a3ed..e527d7a4 100644 --- a/src/ui/PageSend.qml +++ b/src/ui/PageSend.qml @@ -14,6 +14,7 @@ Page { property alias advancedMode: switchAdvancedMode.checked property string walletSelected + property string signerSelected property string walletEncrypted property string destinationAddress property string amount @@ -174,39 +175,15 @@ Page { anchors.centerIn: Overlay.overlay property var walletsAddresses readonly property real maxHeight: (expanded ? 490 : 340) + (showPasswordField ? 140 : 0) - width: applicationWindow.width > 640 ? 640 - 40 : applicationWindow.width - 40 - height: applicationWindow.height > maxHeight ? maxHeight - 40 : applicationWindow.height - 40 + width: applicationWindow.width > 640 - 40 ? 640 - 40 : applicationWindow.width - 40 + height: applicationWindow.height > maxHeight - 40 ? maxHeight - 40 : applicationWindow.height - 40 Behavior on height { NumberAnimation { duration: 1000; easing.type: Easing.OutQuint } } modal: true focus: true onAccepted: { - walletManager.signAndBroadcastTxnAsync(walletsAddresses[1], walletsAddresses[0],"", bridgeForPassword, [], txn) - } - } - - DialogGetPassword{ - id: getPasswordDialog - anchors.centerIn: Overlay.overlay - property int nAddress - width: applicationWindow.width > 540 ? 540 - 120 : applicationWindow.width - 40 - height: applicationWindow.height > 570 ? 570 - 180 : applicationWindow.height - 40 - - focus: true - modal: true - onClosed:{ - bridgeForPassword.setResult(getPasswordDialog.password) - bridgeForPassword.unlock() - } - } - - QBridge{ - id: bridgeForPassword - - onGetPassword:{ - getPasswordDialog.title = message - getPasswordDialog.clear() - getPasswordDialog.open() + signerSelected = stackView.currentItem.simplePage.getSignerSelected() + walletManager.signAndBroadcastTxnAsync(walletsAddresses[1], walletsAddresses[0],signerSelected, bridgeForPassword, [], txn) } } } diff --git a/src/ui/PageWallets.qml b/src/ui/PageWallets.qml index 14b81bae..1a3176a5 100644 --- a/src/ui/PageWallets.qml +++ b/src/ui/PageWallets.qml @@ -96,11 +96,35 @@ Page { ScrollBar.horizontal.policy: ScrollBar.AlwaysOff ListView { + Timer { + interval: 4000 + repeat: false + running: true + onTriggered: { + walletModel.sniffHw(deviceInteraction, topLevelDialogLocker) + } + } + id: walletList anchors.fill: parent clip: true // limit the painting to it's bounding rectangle model: walletModel delegate: WalletListDelegate {} + + populate: Transition { + id: transitionPopulate + + SequentialAnimation { + PropertyAction { property: "opacity"; value: 0.0 } + PauseAnimation { + duration: transitionPopulate.ViewTransition.index === 0 ? 150 : 150 + (transitionPopulate.ViewTransition.index - transitionPopulate.ViewTransition.targetIndexes[0]) * 50 + } + ParallelAnimation { + NumberAnimation { property: "opacity"; from: 0.0; to: 1.0; duration: 250; easing.type: Easing.OutCubic } + NumberAnimation { property: "scale"; from: 0.8; to: 1.0; duration: 250; easing.type: Easing.OutCubic } + } + } + } } } @@ -110,15 +134,15 @@ Page { Component.onCompleted: { walletModel.loadModel(walletManager.getWallets()) } - property Timer timer: Timer { - id: walletListTimer - interval: 5000 - repeat: true - running: true - onTriggered: { - walletModel.updateModel(walletManager.getWallets()) - } - } + //property Timer timer: Timer { + // id: walletListTimer + // interval: 5000 + // repeat: true + // running: true + // onTriggered: { + // walletModel.updateModel(walletManager.getWallets()) + // } + //} } DialogAddLoadWallet { diff --git a/src/ui/Settings.qml b/src/ui/Settings.qml index e3f15056..6f07d514 100644 --- a/src/ui/Settings.qml +++ b/src/ui/Settings.qml @@ -12,6 +12,9 @@ import "Controls/" // For quick UI development, switch back to resources when ma Page { id: settings + enum LogLevel { Debug, Information, Warning, Error, FatalError, Panic } + enum LogOutput { Stdout, Stderr, None, File } + // BUG: About the wallet path: What happens on Windows? // TODO: Consider using `StandardPaths.standardLocations(StandardPaths.AppDataLocation)` @@ -20,6 +23,11 @@ Page { readonly property string defaultWalletPath: configManager.getDefaultValue("skycoin/walletSource/1/Source") readonly property bool defaultIsLocalWalletEnv: configManager.getDefaultValue("skycoin/walletSource/1/SourceType") === "local" readonly property string defaultNodeUrl: configManager.getDefaultValue("skycoin/node/address") + readonly property int defaultLogLevel: ~~configManager.getDefaultValue("skycoin/log/level") + readonly property int defaultLogOutput: ~~configManager.getDefaultValue("skycoin/log/output") + readonly property string defaultLogOutputFile: configManager.getDefaultValue("skycoin/log/outputFile") + readonly property var defaultCacheLifeTime: configManager.getDefaultValue("global/cache/lifeTime") + readonly property var defaultCacheUpdateTime: configManager.getDefaultValue("global/cache/updateTime") // These are the saved settings, must be applied when the settings are opened or when // the user clicks "RESET" and updated when the user clicks "APPLY" @@ -27,12 +35,28 @@ Page { property string savedWalletPath: configManager.getValue("skycoin/walletSource/1/Source") property bool savedIsLocalWalletEnv: configManager.getValue("skycoin/walletSource/1/SourceType") === "local" property url savedNodeUrl: configManager.getValue("skycoin/node/address") + property int savedLogLevel: ~~configManager.getValue("skycoin/log/level") + property int savedLogOutput: ~~configManager.getValue("skycoin/log/output") + property string savedLogOutputFile: configManager.getDefaultValue("skycoin/log/outputFile") + property var savedLifeTime: configManager.getValue("global/cache/lifeTime") + property var savedUpdateTime: configManager.getValue("global/cache/updateTime") + + // QtObject{ + // id: logLevel + // property string modifier + // property string old + // } // These are the properties that are actually set, so they are aliases of the respective // control's properties property alias walletPath: textFieldWalletPath.text property alias isLocalWalletEnv: switchLocalWalletEnv.checked property alias nodeUrl: textFieldNodeUrl.text + property alias logLevel: comboBoxLogLevel.currentIndex + property alias logOutput: listViewLogOutput.currentIndex + property alias logOutputFile: listViewLogOutput.outputFile + property alias cacheLifeTime: textFieldCacheLifeTime.text + property alias cacheUpdateTime: textFieldCacheUpdateTime.text Component.onCompleted: { loadSavedSettings() @@ -42,6 +66,11 @@ Page { configManager.setValue("skycoin/walletSource/1/Source", walletPath) configManager.setValue("skycoin/walletSource/1/SourceType", isLocalWalletEnv ? "local" : "remote") configManager.setValue("skycoin/node/address", nodeUrl) + configManager.setValue("skycoin/log/level", logLevel) + configManager.setValue("skycoin/log/output", logOutput) + configManager.setValue("global/cache/updateTime", cacheUpdateTime) + configManager.setValue("skycoin/log/outputFile", logOutputFile) + configManager.setValue("global/cache/lifeTime", cacheLifeTime) loadSavedSettings() } @@ -49,7 +78,13 @@ Page { walletPath = savedWalletPath = configManager.getValue("skycoin/walletSource/1/Source") isLocalWalletEnv = savedIsLocalWalletEnv = configManager.getValue("skycoin/walletSource/1/SourceType") === "local" nodeUrl = savedNodeUrl = configManager.getValue("skycoin/node/address") + logLevel = savedLogLevel = ~~configManager.getValue("skycoin/log/level") + logOutput = savedLogOutput = ~~configManager.getValue("skycoin/log/output") + logOutputFile = savedLogOutputFile = configManager.getValue("skycoin/log/outputFile") + cacheLifeTime = savedLifeTime = configManager.getValue("global/cache/lifeTime") + cacheUpdateTime = savedUpdateTime = configManager.getValue("global/cache/updateTime") + walletManager.updateAll() updateFooterButtonsStatus() } @@ -57,16 +92,21 @@ Page { walletPath = defaultWalletPath isLocalWalletEnv = defaultIsLocalWalletEnv nodeUrl = defaultNodeUrl + cacheLifeTime = defaultCacheLifeTime + logLevel = defaultLogLevel + logOutput = defaultLogOutput saveCurrentSettings() } function updateFooterButtonsStatus() { - var configChanged = (walletPath !== savedWalletPath || isLocalWalletEnv !== savedIsLocalWalletEnv || nodeUrl != savedNodeUrl) - var noDefaultConfig = (walletPath !== defaultWalletPath || isLocalWalletEnv !== defaultIsLocalWalletEnv || nodeUrl !== defaultNodeUrl) - footer.standardButton(Dialog.Apply).enabled = configChanged - footer.standardButton(Dialog.Discard).enabled = configChanged - footer.standardButton(Dialog.RestoreDefaults).enabled = noDefaultConfig + if (Component.status === Component.Ready) { + var configChanged = (walletPath !== savedWalletPath || isLocalWalletEnv !== savedIsLocalWalletEnv || nodeUrl != savedNodeUrl || logLevel != savedLogLevel || logOutput != savedLogOutput || logOutputFile != savedLogOutputFile || cacheLifeTime != savedLifeTime) + var noDefaultConfig = (walletPath !== defaultWalletPath || isLocalWalletEnv !== defaultIsLocalWalletEnv || nodeUrl !== defaultNodeUrl || logLevel !== defaultLogLevel || logOutput !== defaultLogOutput || logOutputFile !== defaultLogOutputFile || cacheLifeTime !== defaultCacheLifeTime) + footer.standardButton(Dialog.Apply).enabled = configChanged + footer.standardButton(Dialog.Discard).enabled = configChanged + footer.standardButton(Dialog.RestoreDefaults).enabled = noDefaultConfig + } } footer: DialogButtonBox { @@ -87,79 +127,226 @@ Page { } } - ColumnLayout { - anchors { top: parent.top; left: parent.left; right: parent.right; margins: 20 } - - spacing: 20 - - GroupBox { - Layout.fillWidth: true - title: qsTr("Wallet environment settings") - - RowLayout { - anchors.fill: parent - - Label { - text: qsTr("Remote") - font.bold: true - color: Material.hintTextColor - } - Switch { - id: switchLocalWalletEnv + ScrollView { + id: scrollView + anchors.fill: parent + contentWidth: width - checked: savedIsLocalWalletEnv - font.bold: true + ColumnLayout { + id: columnLayout + width: parent.width + spacing: 20 - onToggled: { - updateFooterButtonsStatus(); + GroupBox { + id: groupBoxWalletEnvironment + Layout.fillWidth: true + Layout.topMargin: 10 + Layout.leftMargin: 20 + Layout.rightMargin: 20 + title: qsTr("Wallet environment settings") + + RowLayout { + anchors.fill: parent + + Label { + text: qsTr("Remote") + font.bold: true + color: Material.hintTextColor } - } - Label { - text: qsTr("Local") - font.bold: true - color: Material.accent - } + Switch { + id: switchLocalWalletEnv - Rectangle { - Layout.fillHeight: true - Layout.leftMargin: 10 - Layout.rightMargin: 10 - width: 1 - color: Material.hintTextColor - } + checked: savedIsLocalWalletEnv + font.bold: true + + onToggled: { + updateFooterButtonsStatus() + } + } + Label { + text: qsTr("Local") + font.bold: true + color: Material.accent + } + + Rectangle { + Layout.fillHeight: true + Layout.leftMargin: 10 + Layout.rightMargin: 10 + width: 1 + color: Material.hintTextColor + } + + TextField { + id: textFieldWalletPath + + Layout.fillWidth: true + enabled: isLocalWalletEnv + selectByMouse: true + placeholderText: qsTr("Local wallet path") + + onTextChanged: { + updateFooterButtonsStatus() + } + } + } // RowLayout + } // GroupBox (wallet settings) + + GroupBox { + id: groupBoxNetworkSettings + + Layout.fillWidth: true + Layout.leftMargin: 20 + Layout.rightMargin: 20 + + title: qsTr("Network settings") TextField { - id: textFieldWalletPath + id: textFieldNodeUrl - Layout.fillWidth: true - enabled: isLocalWalletEnv + anchors.fill: parent selectByMouse: true - placeholderText: qsTr("Local wallet path") + placeholderText: qsTr("Node URL") onTextChanged: { - updateFooterButtonsStatus(); + updateFooterButtonsStatus() } } - } // RowLayout - } // GroupBox (wallet settings) + } // GroupBox (network settings) - GroupBox { - Layout.fillWidth: true - title: qsTr("Network settings") + GroupBox { + id: groupBoxGlobalSettings - TextField { - id: textFieldNodeUrl + Layout.fillWidth: true + Layout.leftMargin: 20 + Layout.rightMargin: 20 + Layout.bottomMargin: 10 // The Last `GroupBox` must have this set + + title: qsTr("Global settings") + + ColumnLayout { + id: columnLayoutGlobalSettings + anchors.fill: parent + + spacing: 20 + + TextField { + id: textFieldCacheLifeTime + Layout.fillWidth: true + selectByMouse: true + placeholderText: qsTr("Cache lifetime") + onTextChanged: { + updateFooterButtonsStatus(); + } + validator: IntValidator { + bottom: 0 + top: 99999999 + } + } - anchors.fill: parent - selectByMouse: true - placeholderText: qsTr("Node URL") + TextField { - onTextChanged: { - updateFooterButtonsStatus(); - } - } - } // GroupBox (network settings) - } // ColumnLayout + id: textFieldCacheUpdateTime + + Layout.alignment: Qt.AlignTop + Layout.fillWidth: true + + selectByMouse: true + placeholderText: qsTr("Time to update") + + onTextChanged: { + updateFooterButtonsStatus(); + } + validator: IntValidator { + bottom: 0 + top: 99999999 + } + } + + Label { text: qsTr("Log level") } + + ComboBox { + id: comboBoxLogLevel + Layout.fillWidth: true + Layout.topMargin: -20 + + readonly property var logLevelString: [ "debug", "info", "warn", "error", "fatal", "panic" ] + readonly property var logLevelColor: [ Material.Teal, Material.Blue, Material.Amber, Material.DeepOrange, Material.Red, Material.primaryTextColor ] + + currentIndex: savedLogLevel < 0 || savedLogLevel >= count ? defaultLogLevel : savedLogLevel + onCurrentIndexChanged: { + updateFooterButtonsStatus() + } + model: [ qsTr("Debug"), qsTr("Informations"), qsTr("Warnings"), qsTr("Errors"), qsTr("Fatal errors"), qsTr("Panics") ] + delegate: MenuItem { + width: parent.width + text: comboBoxLogLevel.textRole ? (Array.isArray(comboBoxLogLevel.model) ? modelData[comboBoxLogLevel.textRole] : model[comboBoxLogLevel.textRole]) : modelData + icon.source: "qrc:/images/resources/images/icons/log_level_" + comboBoxLogLevel.logLevelString[index] + ".svg" + icon.color: Material.accent + Material.accent: comboBoxLogLevel.logLevelColor[index] + Material.foreground: comboBoxLogLevel.currentIndex === index ? parent.Material.accent : parent.Material.foreground + highlighted: comboBoxLogLevel.highlightedIndex === index + hoverEnabled: comboBoxLogLevel.hoverEnabled + leftPadding: highlighted ? 2*padding : padding // added + Behavior on leftPadding { NumberAnimation { duration: 500; easing.type: Easing.OutQuint } } // added + } // MenuItem (delegate) + } // ComboBox + + Label { text: qsTr("Log output") } + + ListView { + id: listViewLogOutput + + property alias outputFile: textFieldLogOutputFile.text + readonly property var logOutputString: [ "stdout", "stderr", "none", "file" ] + + Layout.fillWidth: true + Layout.topMargin: -20 + height: contentHeight + + onCurrentIndexChanged: { + updateFooterButtonsStatus() + } + + spacing: -6 + interactive: false + model: [ qsTr("Standard output"), qsTr("Standard error output"), qsTr("None"), qsTr("File") ] + delegate: RadioButton { + width: index === Settings.LogOutput.File && textFieldLogOutputFile.enabled ? implicitWidth : parent.width + text: modelData + checked: savedLogOutput < 0 || savedLogOutput >= ListView.view.count ? index === defaultLogLevel : index === savedLogOutput + + onCheckedChanged: { + if (checked) { + ListView.view.currentIndex = index + if (index === Settings.LogOutput.File) { + textFieldLogOutputFile.forceActiveFocus() + } + } + } + } // RadioButton (delegate) + + Component.onCompleted: { + textFieldLogOutputFile.anchors.leftMargin = listViewLogOutput.itemAtIndex(3).implicitWidth + } + + TextField { + id: textFieldLogOutputFile + + anchors.bottom: parent.bottom + anchors.bottomMargin: 6 + anchors.left: parent.left + anchors.right: parent.right + + enabled: listViewLogOutput.currentIndex === Settings.LogOutput.File + placeholderText: qsTr("Output file") + selectByMouse: true + } + } // ListView (log output) + } // ColumnLayout (global settings) + } // GroupBox (global settings) + } // ColumnLayout + } // ScrollView // Confirm the discard or reset action: Dialog { @@ -170,7 +357,7 @@ Page { anchors.centerIn: Overlay.overlay width: applicationWindow.width > 300 ? 300 - 40 : applicationWindow.width - 40 - standardButtons: Dialog.Yes | Dialog.No + standardButtons: Dialog.Ok | Dialog.Cancel title: qsTr("Confirm action") modal: true focus: visible @@ -195,6 +382,12 @@ Page { } } + Component.onCompleted: { + standardButton(Dialog.Ok).Material.accent = Material.Red + standardButton(Dialog.Ok).highlighted = true + standardButton(Dialog.Ok).text = Qt.binding(function() { return dialogConfirmation.onlyDiscard ? qsTr("Discard") : qsTr("Restore defaults") }) + } + onAccepted: { if (onlyDiscard) { loadSavedSettings() diff --git a/src/ui/SettingsAddressBook.qml b/src/ui/SettingsAddressBook.qml new file mode 100644 index 00000000..1144ed42 --- /dev/null +++ b/src/ui/SettingsAddressBook.qml @@ -0,0 +1,160 @@ +import QtQuick 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Controls.Material 2.12 +import QtQuick.Layouts 1.12 +import AddrsBookManager 1.0 + +// Resource imports +// import "qrc:/ui/src/ui/Dialogs" +// import "qrc:/ui/src/ui/Controls" +import "Dialogs/" // For quick UI development, switch back to resources when making a release +import "Controls/" // For quick UI development, switch back to resources when making a release + +Page { + id: settingsAddressBook + + enum SecurityType { LowSecurity, MediumSecurity, StrongSecurity } + + property bool enableButtonChangePassword: addrsBookModel.getSecType() === SettingsAddressBook.SecurityType.StrongSecurity + + signal canceled() + + footer: DialogButtonBox { + id: footer + standardButtons: Dialog.Apply | Dialog.Cancel + + onApplied: { + if (addrsBookModel.getSecType() === SettingsAddressBook.SecurityType.StrongSecurity) { + dialogGetPassword.open() + } else { + if (listViewSecurityType.currentIndex === SettingsAddressBook.SecurityType.StrongSecurity) { + dialogSetPassword.open() + } else { + footer.standardButton(Dialog.Apply).enabled = !addrsBookModel.changeSecType(listViewSecurityType.currentIndex, "", "") + enableButtonChangePassword = false + } + } + } + + onRejected: { + canceled() + } + } + + ScrollView { + id: scrollView + anchors.fill: parent + contentWidth: width + clip: true + + ColumnLayout { + anchors.fill: parent + + Label { + Layout.topMargin: 10 + Layout.leftMargin: 20 + Layout.rightMargin: 20 + Layout.fillWidth: true + + text: qsTr("Security type") + wrapMode: Text.Wrap + font.bold: true + } + + ListView { + id: listViewSecurityType + + Layout.fillWidth: true + Layout.leftMargin: 20 + Layout.rightMargin: 20 + height: contentHeight + + spacing: -6 + interactive: false + currentIndex: addrsBookModel.getSecType() + model: [ qsTr("Low (plain text)"), qsTr("Medium (recommended)"), qsTr("Hard (with password)") ] + delegate: RadioButton { + width: parent.width + text: modelData + checked: index === ListView.view.currentIndex + + onCheckedChanged: { + if (checked) { + ListView.view.currentIndex = index + footer.standardButton(Dialog.Apply).enabled = index !== addrsBookModel.getSecType() + } + } + + Button { + id: buttonChangePassword + + anchors.verticalCenter: parent.verticalCenter + anchors.right: parent.right + + visible: index === SettingsAddressBook.SecurityType.StrongSecurity + enabled: visible && enableButtonChangePassword + text: qsTr("Change password") + highlighted: true + + onClicked: { + dialogGetPassword.open() + } + } + } // RadioButton (delegate) + } // ListView (log output) + + Label { + Layout.leftMargin: 20 + Layout.rightMargin: 20 + Layout.fillWidth: true + + visible: listViewSecurityType.currentIndex === DialogSelectSecType.SecurityType.StrongSecurity + text: "" + qsTr("Note:") + " " + qsTr("Accessing a password-protected address book can slowdown your device") + wrapMode: Text.Wrap + Material.foreground: Material.Red + font.italic: true + } + } // ColumnLayout + } // ScrollView + + AddrsBookModel { + id: addrsBookModel + } + + DialogGetPassword { + id: dialogGetPassword + anchors.centerIn: Overlay.overlay + width: applicationWindow.width > 400 ? 400 - 40 : applicationWindow.width - 40 + height: applicationWindow.height > 280 ? 280 - 40 : applicationWindow.height - 40 + + modal: true + focus: visible + + onAccepted: { + if(!addrsBookModel.authenticate(dialogGetPassword.password)) { + dialogGetPassword.open() + } else { + if (listViewSecurityType.currentIndex === SettingsAddressBook.SecurityType.StrongSecurity) { + dialogSetPassword.open() + } else { + footer.standardButton(Dialog.Apply).enabled = !addrsBookModel.changeSecType(listViewSecurityType.currentIndex, dialogGetPassword.password, "") + enableButtonChangePassword = false + } + } + } + } + + DialogSetPassword { + id: dialogSetPassword + anchors.centerIn: Overlay.overlay + width: applicationWindow.width > 400 ? 400 - 40 : applicationWindow.width - 40 + + modal: true + focus: visible + + onAccepted: { + footer.standardButton(Dialog.Apply).enabled = !addrsBookModel.changeSecType(SettingsAddressBook.SecurityType.StrongSecurity, dialogGetPassword.password, dialogSetPassword.password) + enableButtonChangePassword = true + } + } +} diff --git a/src/ui/SubPageSendAdvanced.qml b/src/ui/SubPageSendAdvanced.qml index 7303f805..09abf32b 100644 --- a/src/ui/SubPageSendAdvanced.qml +++ b/src/ui/SubPageSendAdvanced.qml @@ -27,67 +27,63 @@ Page { minFeeAmount = 0; var valCH = 0; if (comboBoxWalletsUnspentOutputsSendFrom.enabled) { - for (var i = 0; i < comboBoxWalletsUnspentOutputsSendFrom.checkedElements.length; i++){ - upperCoinBound += parseFloat(comboBoxWalletsUnspentOutputsSendFrom.model.outputs[comboBoxWalletsUnspentOutputsSendFrom.checkedElements[i]].addressSky, 10); - var s = comboBoxWalletsUnspentOutputsSendFrom.model.outputs[comboBoxWalletsUnspentOutputsSendFrom.checkedElements[i]].addressCoinHours; - console.log(parseInt(s.replace('\,',''), 10)) - valCH += parseInt(comboBoxWalletsUnspentOutputsSendFrom.model.outputs[comboBoxWalletsUnspentOutputsSendFrom.checkedElements[i]].addressCoinHours.replace('\,',''), 10); + for (var i = 0; i < comboBoxWalletsUnspentOutputsSendFrom.checkedElements.length; i++) { + upperCoinBound += parseFloat(comboBoxWalletsUnspentOutputsSendFrom.model.outputs[comboBoxWalletsUnspentOutputsSendFrom.checkedElements[i]].addressSky, 10) + var s = comboBoxWalletsUnspentOutputsSendFrom.model.outputs[comboBoxWalletsUnspentOutputsSendFrom.checkedElements[i]].addressCoinHours + valCH += parseInt(comboBoxWalletsUnspentOutputsSendFrom.model.outputs[comboBoxWalletsUnspentOutputsSendFrom.checkedElements[i]].addressCoinHours.replace('\,',''), 10) } - } else { - - if (comboBoxWalletsAddressesSendFrom.enabled) { - for (var i = 0; i < comboBoxWalletsAddressesSendFrom.checkedElements.length; i++){ - upperCoinBound += parseFloat(comboBoxWalletsAddressesSendFrom.model.addresses[comboBoxWalletsAddressesSendFrom.checkedElements[i]].addressSky, 10); - valCH += parseInt(comboBoxWalletsAddressesSendFrom.model.addresses[comboBoxWalletsAddressesSendFrom.checkedElements[i]].addressCoinHours.replace('\,',''), 10); + } else if (comboBoxWalletsAddressesSendFrom.enabled) { + for (var i = 0; i < comboBoxWalletsAddressesSendFrom.checkedElements.length; i++) { + upperCoinBound += parseFloat(comboBoxWalletsAddressesSendFrom.model.addresses[comboBoxWalletsAddressesSendFrom.checkedElements[i]].addressSky, 10) + valCH += parseInt(comboBoxWalletsAddressesSendFrom.model.addresses[comboBoxWalletsAddressesSendFrom.checkedElements[i]].addressCoinHours.replace('\,',''), 10) } - } else { - for(var i = 0; i < comboBoxWalletsAddressesSendFrom.model.addresses.length; i++) { - upperCoinBound += parseFloat(comboBoxWalletsAddressesSendFrom.model.addresses[i].addressSky, 10) - valCH += parseInt(comboBoxWalletsAddressesSendFrom.model.addresses[i].addressCoinHours.replace('\,',''), 10); - } - } - } - upperAltCointBound = valCH*9/10 + } else { + for(var i = 0; i < comboBoxWalletsAddressesSendFrom.model.addresses.length; i++) { + upperCoinBound += parseFloat(comboBoxWalletsAddressesSendFrom.model.addresses[i].addressSky, 10) + valCH += parseInt(comboBoxWalletsAddressesSendFrom.model.addresses[i].addressCoinHours.replace('\,',''), 10) + } + } + upperAltCointBound = valCH * 9/10 minFeeAmount = valCH/10 } - function getSelectedAddressesWithWallets(){ + function getSelectedAddressesWithWallets() { var indexs = comboBoxWalletsAddressesSendFrom.getCheckedDelegates() var addresses = [] addresses.push([]) addresses.push([]) - for (var i =0;i< indexs.length; i++){ + for (var i =0;i< indexs.length; i++) { addresses[0].push(comboBoxWalletsAddressesSendFrom.model.addresses[indexs[i]].address) addresses[1].push(comboBoxWalletsAddressesSendFrom.model.addresses[indexs[i]].walletId) - //addresses.push(comboBoxWalletsAddressesSendFrom.model.addresses[indexs[i]].address) + // addresses.push(comboBoxWalletsAddressesSendFrom.model.addresses[indexs[i]].address) } return addresses } - function getSelectedOutputsWithWallets(){ + function getSelectedOutputsWithWallets() { var indexs = comboBoxWalletsUnspentOutputsSendFrom.getCheckedDelegates() var outputs = [] outputs.push([]) outputs.push([]) - for (var i =0;i< indexs.length; i++){ + for (var i =0;i< indexs.length; i++) { outputs[0].push(comboBoxWalletsUnspentOutputsSendFrom.model.outputs[indexs[i]].outputID) outputs[1].push(comboBoxWalletsUnspentOutputsSendFrom.model.outputs[indexs[i]].walletOwner) - //outputs.push(comboBoxWalletsUnspentOutputsSendFrom.model.outputs[indexs[i]].outputID) + // outputs.push(comboBoxWalletsUnspentOutputsSendFrom.model.outputs[indexs[i]].outputID) } return outputs } - function getSelectedWallet(){ + function getSelectedWallet() { var indexs = comboBoxWalletsSendFrom.getCheckedDelegates() var files = [] - for (var i=0; i < indexs.length; i++){ + for (var i=0; i < indexs.length; i++) { files.push(comboBoxWalletsSendFrom.model.wallets[indexs[i]].fileName) } return files } - function walletIsEncrypted(){ + function walletIsEncrypted() { var indexs = comboBoxWalletsSendFrom.getCheckedDelegates() var enc = [] for (var i = 0; i < indexs.length; i++){ @@ -100,11 +96,11 @@ Page { return enc } - function getDestinationsSummary(){ + function getDestinationsSummary() { var addrs = [] var skyAmounts = [] var coinHoursAmount = [] - for (var i = 0; i < listModelDestinations.count; i++){ + for (var i = 0; i < listModelDestinations.count; i++) { addrs.push(listModelDestinations.get(i).address) skyAmounts.push(listModelDestinations.get(i).sky) coinHoursAmount.push(listModelDestinations.get(i).coinHours) @@ -112,32 +108,32 @@ Page { return [addrs, skyAmounts, coinHoursAmount] } - function getChangeAddress(){ + function getChangeAddress() { return textFieldCustomChangeAddress.text } - function getAutomaticCoinHours(){ + function getAutomaticCoinHours() { return checkBoxAutomaticCoinHoursAllocation.checked } - function getBurnFactor(){ + function getBurnFactor() { return sliderCoinHoursShareFactor.value } - function getAllAddressesWithWallets(){ + function getAllAddressesWithWallets() { var addrs = [] addrs.push([]) addrs.push([]) - for (var i = 0; i < listAddresses.count; i++){ + for (var i = 0; i < listAddresses.count; i++) { addrs[0].push(listAddresses.addresses[i].address) addrs[1].push(listAddresses.addresses[i].walletId) - //addrs.push(listAddresses.addresses[i].address) + // addrs.push(listAddresses.addresses[i].address) } return addrs } function updateOutputs() { listOutputs.cleanModel() if (checkBoxAllAddresses.checked) { - for (var i = 0; i < comboBoxWalletsSendFrom.checkedElements.length; i++){ + for (var i = 0; i < comboBoxWalletsSendFrom.checkedElements.length; i++) { walletManager.updateAddresses(comboBoxWalletsSendFrom.model.wallets[comboBoxWalletsSendFrom.checkedElements[i]].fileName) var addresses = walletManager.getAddresses(comboBoxWalletsSendFrom.model.wallets[comboBoxWalletsSendFrom.checkedElements[i]].fileName) for(var j = 0; j < addresses.length; j++) { @@ -146,10 +142,10 @@ Page { } } } else { - for (var j = 0; j < comboBoxWalletsSendFrom.checkedElements.length; j++){ + for (var j = 0; j < comboBoxWalletsSendFrom.checkedElements.length; j++) { walletManager.updateAddresses(comboBoxWalletsSendFrom.model.wallets[comboBoxWalletsSendFrom.checkedElements[j]].fileName) } - for (var i = 0; i < comboBoxWalletsAddressesSendFrom.checkedElements.length; i++){ + for (var i = 0; i < comboBoxWalletsAddressesSendFrom.checkedElements.length; i++) { walletManager.updateOutputs(comboBoxWalletsAddressesSendFrom.model.addresses[comboBoxWalletsAddressesSendFrom.checkedElements[i]].walletId, comboBoxWalletsAddressesSendFrom.model.addresses[comboBoxWalletsAddressesSendFrom.checkedElements[i]].address) listOutputs.insertOutputs(walletManager.getOutputs(comboBoxWalletsAddressesSendFrom.model.addresses[comboBoxWalletsAddressesSendFrom.checkedElements[i]].walletId, comboBoxWalletsAddressesSendFrom.model.addresses[comboBoxWalletsAddressesSendFrom.checkedElements[i]].address)) } diff --git a/src/ui/SubPageSendSimple.qml b/src/ui/SubPageSendSimple.qml index 4dd974ff..59f03cf8 100644 --- a/src/ui/SubPageSendSimple.qml +++ b/src/ui/SubPageSendSimple.qml @@ -3,21 +3,29 @@ import QtQuick.Controls 2.12 import QtQuick.Controls.Material 2.12 import QtQuick.Layouts 1.12 import WalletsManager 1.0 +import AddrsBookManager 1.0 // Resource imports +// import "qrc:/ui/src/ui/Dialogs" // import "qrc:/ui/src/ui/Controls" +import "Dialogs" // For quick UI development, switch back to resources when making a release import "Controls" // For quick UI development, switch back to resources when making a release Page { id: root property string walletSelected property string walletSelectedName - property bool walletEncrypted: false + property string signerSelected + property bool walletEncrypted: false property string amount property string destinationAddress function getSelectedWallet(){ return walletSelected } + function getSignerSelected() { + return signerSelected; + } + function getAmount(){ return amount } @@ -29,11 +37,62 @@ Page { } signal qrCodeRequested(var data) +function getAddressList(){ +addressList.clear() +for(var i=0;i 540 ? 540 - 40 : applicationWindow.width - 40 + height: applicationWindow.height - 40 + + listAddrsModel: addressList + + focus: true + modal: true + +onAboutToShow:{ +getAddressList() +} + + onAccepted: { + textFieldWalletsSendTo.text = selectedAddress + } + } + + DialogGetPassword{ + id:getpass + anchors.centerIn: Overlay.overlay + height:180 + onAccepted:{ + if(!abm.authenticate(getpass.password)){ + getpass.open() + }else{ + abm.loadContacts() + dialogSelectAddressByAddressBook.open() + } + } + } + ColumnLayout { id: columnLayoutRoot anchors.fill: parent @@ -41,44 +100,89 @@ Page { anchors.rightMargin: 10 spacing: 20 - ColumnLayout { - id: columnLayoutSendFrom - - Layout.alignment: Qt.AlignTop - - Label { text: qsTr("Send from") } + RowLayout { + spacing: 20 + ColumnLayout { + id: columnLayoutSendFrom - ComboBox { - id: comboBoxWalletsSendFrom - - Layout.fillWidth: true - textRole: "name" - displayText: comboBoxWalletsSendFrom.model.wallets[comboBoxWalletsSendFrom.currentIndex].sky ? comboBoxWalletsSendFrom.model.wallets[comboBoxWalletsSendFrom.currentIndex].name + " - " + comboBoxWalletsSendFrom.model.wallets[comboBoxWalletsSendFrom.currentIndex].sky + " SKY (" + comboBoxWalletsSendFrom.model.wallets[comboBoxWalletsSendFrom.currentIndex].coinHours + " CoinHours)": "Select a wallet" - - model: WalletModel { - Component.onCompleted: { - loadModel(walletManager.getWallets()) - } - } + Layout.alignment: Qt.AlignTop + + Label { text: qsTr("Send from") } - // Taken from Qt 5.13.0 source code: - delegate: MenuItem { - width: parent.width - text: comboBoxWalletsSendFrom.textRole ? (Array.isArray(comboBoxWalletsSendFrom.model) ? modelData[comboBoxWalletsSendFrom.textRole] : model[comboBoxWalletsSendFrom.textRole] + " - "+model["sky"] + " SKY (" + model["coinHours"] + " CoinHours)") : " --- " + modelData - Material.foreground: comboBoxWalletsSendFrom.currentIndex === index ? parent.Material.accent : parent.Material.foreground - highlighted: comboBoxWalletsSendFrom.highlightedIndex === index - hoverEnabled: comboBoxWalletsSendFrom.hoverEnabled - leftPadding: highlighted ? 2*padding : padding // added - Behavior on leftPadding { NumberAnimation { duration: 500; easing.type: Easing.OutQuint } } // added + ComboBox { + Layout.fillWidth: true + id: comboBoxWalletsSendFrom + textRole: "name" + displayText: comboBoxWalletsSendFrom.model.wallets[comboBoxWalletsSendFrom.currentIndex] && comboBoxWalletsSendFrom.model.wallets[comboBoxWalletsSendFrom.currentIndex].sky ? comboBoxWalletsSendFrom.model.wallets[comboBoxWalletsSendFrom.currentIndex].name + " - " + comboBoxWalletsSendFrom.model.wallets[comboBoxWalletsSendFrom.currentIndex].sky + " SKY (" + comboBoxWalletsSendFrom.model.wallets[comboBoxWalletsSendFrom.currentIndex].coinHours + " CoinHours)" : "Select a wallet" + model: WalletModel { + Component.onCompleted: { + loadModel(walletManager.getWallets()) + } + } + + // Taken from Qt 5.13.0 source code: + delegate: MenuItem { + width: parent.width + text: comboBoxWalletsSendFrom.textRole ? (Array.isArray(comboBoxWalletsSendFrom.model) ? modelData[comboBoxWalletsSendFrom.textRole] : model[comboBoxWalletsSendFrom.textRole] + " - "+model["sky"] + " SKY (" + model["coinHours"] + " CoinHours)") : " --- " + modelData + Material.foreground: comboBoxWalletsSendFrom.currentIndex === index ? parent.Material.accent : parent.Material.foreground + highlighted: comboBoxWalletsSendFrom.highlightedIndex === index + hoverEnabled: comboBoxWalletsSendFrom.hoverEnabled + leftPadding: highlighted ? 2*padding : padding // added + Behavior on leftPadding { NumberAnimation { duration: 500; easing.type: Easing.OutQuint } } // added + } + onPressedChanged: { + comboBoxWalletsSendFrom.model.updateModel(walletManager.getWallets()) } + onActivated: { + root.walletSelected = comboBoxWalletsSendFrom.model.wallets[comboBoxWalletsSendFrom.currentIndex].fileName + root.walletSelectedName = comboBoxWalletsSendFrom.model.wallets[comboBoxWalletsSendFrom.currentIndex].name + root.walletEncrypted = comboBoxWalletsSendFrom.model.wallets[comboBoxWalletsSendFrom.currentIndex].encryptionEnabled + signerSelector.reset(root.walletSelected); + } + } // ComboBox + } // ColumnLayout (send from) + ColumnLayout { + id: signerSelectorId + Layout.alignment: Qt.AlignTop + visible: false - onActivated: { - root.walletSelected = comboBoxWalletsSendFrom.model.wallets[comboBoxWalletsSendFrom.currentIndex].fileName - root.walletSelectedName = comboBoxWalletsSendFrom.model.wallets[comboBoxWalletsSendFrom.currentIndex].name - root.walletEncrypted = comboBoxWalletsSendFrom.model.wallets[comboBoxWalletsSendFrom.currentIndex].encryptionEnabled + Label { text: qsTr("Change signer") } + ComboBox { + Layout.fillWidth: true + id: signerSelector + textRole: "description" + model: SignerModel { + id: signerModelId + } + // Taken from Qt 5.13.0 source code: + delegate: MenuItem { + id: selectedSignerDelegateId + width: parent.width + text: signerSelector.textRole ? + (Array.isArray(signerSelector.model) + ? modelData[signerSelector.textRole] + : model[signerSelector.textRole]) + : modelData + Material.foreground: signerSelector.currentIndex === index ? parent.Material.accent : parent.Material.foreground + highlighted: signerSelector.highlightedIndex === index + hoverEnabled: signerSelector.hoverEnabled + leftPadding: highlighted ? 2*padding : padding // added + Behavior on leftPadding { NumberAnimation { duration: 500; easing.type: Easing.OutQuint } } // added + onClicked: { + root.signerSelected = + Array.isArray(signerSelector.model) + ? modelData["id"] : model["id"]; + } + } + function reset(wltId) { + currentIndex = 0; + signerModelId.loadModel(wltId) + signerSelectorId.visible = signerModelId.rowCount() > 1 + } } - } // ComboBox - } // ColumnLayout (send from) + } + } + ColumnLayout { id: columnLayoutSendTo @@ -86,7 +190,23 @@ Page { Layout.alignment: Qt.AlignTop Label { text: qsTr("Send to") } - + + Button { + id: buttonSelectCustomChangeAddress + text: qsTr("Select") + flat: true + highlighted: true + + onClicked: { + if(abm.getSecType()!=2){ + abm.loadContacts() + dialogSelectAddressByAddressBook.open() + }else{ + getpass.open() + } + } + } + RowLayout { Layout.fillWidth: true spacing: 8 @@ -109,8 +229,10 @@ Page { selectByMouse: true Layout.fillWidth: true Layout.topMargin: -5 + Material.accent: abm.addressIsValid(text) ? parent.Material.accent : Material.color(Material.Red) onTextChanged:{ root.destinationAddress = text + } } } // RowLayout @@ -130,4 +252,8 @@ Page { } } } // ColumnLayout (root) + + ListModel{ + id:addressList + } } diff --git a/src/ui/TransactionDetails.qml b/src/ui/TransactionDetails.qml index 5908ef7e..a93fd0bc 100644 --- a/src/ui/TransactionDetails.qml +++ b/src/ui/TransactionDetails.qml @@ -38,10 +38,10 @@ Item { Internal } - implicitHeight: 80 + rowLayoutBasicDetails.height + (expanded ? rowLayoutMoreDetails.height : 0) + readonly property real basicHeight: 80 + rowLayoutBasicDetails.height + implicitHeight: Math.min(basicHeight + (expanded ? Math.max(listViewInputs.height, listViewOutputs.height) : 0), maxHeight) Behavior on implicitHeight { NumberAnimation { duration: 1000; easing.type: Easing.OutQuint } } - implicitWidth: 600 clip: true ColumnLayout { @@ -129,7 +129,7 @@ Item { Layout.fillWidth: true } Label { - text: (type === TransactionDetails.Type.Receive ? "Receive" : "Send") + ' ' + amount + ' ' + qsTr("SKY") + text: (type === TransactionDetails.Type.Receive ? qsTr("Receive") : qsTr("Send")) + ' ' + amount + ' ' + qsTr("SKY") font.bold: true font.pointSize: Qt.application.font.pointSize * 1.15 horizontalAlignment: Label.AlignHCenter @@ -149,7 +149,7 @@ Item { implicitWidth: 200 flat: true checkable: true - text: (checked ? qsTr("Less") : qsTr("More")) + ' ' + qsTr("details") + text: checked ? qsTr("Less details") : qsTr("More details") } Rectangle { @@ -165,14 +165,15 @@ Item { Layout.alignment: Qt.AlignTop Layout.fillWidth: true + Layout.fillHeight: true opacity: expanded ? 1 : 0 Behavior on opacity { NumberAnimation { duration: 1000; easing.type: Easing.OutQuint } } ColumnLayout { id: columnLayoutInputs - Layout.alignment: Qt.AlignTop Layout.fillWidth: true + Layout.fillHeight: true Label { text: qsTr("Inputs") @@ -184,8 +185,7 @@ Item { ScrollView { Layout.alignment: Qt.AlignTop Layout.fillWidth: true - - contentHeight: 160 + Layout.fillHeight: true ListView { id: listViewInputs @@ -193,10 +193,8 @@ Item { Material.foreground: Material.Grey model: modelInputs clip: true - Layout.alignment: Qt.AlignTop - Layout.fillWidth: true delegate: InputOutputDelegate { - width: ListView.view.width + width: parent.width } } } // ScrollView @@ -204,8 +202,8 @@ Item { ColumnLayout { id: columnLayoutOutputs - Layout.alignment: Qt.AlignTop Layout.fillWidth: true + Layout.fillHeight: true Label { text: qsTr("Outputs") @@ -217,8 +215,7 @@ Item { ScrollView { Layout.alignment: Qt.AlignTop Layout.fillWidth: true - - contentHeight: 160 + Layout.fillHeight: true ListView { id: listViewOutputs @@ -226,10 +223,8 @@ Item { Material.foreground: Material.Grey model: modelOutputs clip: true - Layout.alignment: Qt.AlignTop - Layout.fillWidth: true delegate: InputOutputDelegate { - width: ListView.view.width + width: parent.width } } } // ScrollView diff --git a/src/ui/main.qml b/src/ui/main.qml index 8501f660..fe43a64c 100644 --- a/src/ui/main.qml +++ b/src/ui/main.qml @@ -1,9 +1,12 @@ import QtQuick 2.12 import QtQuick.Controls 2.12 import QtQuick.Controls.Material 2.12 +import QtQuick.Window 2.12 import Qt.labs.settings 1.0 import WalletsManager 1.0 import Config 1.0 +import Utils 1.0 +import DeviceInteraction 1.0 // Resource imports // import "qrc:/ui/src/ui/Dialogs" @@ -23,7 +26,6 @@ ApplicationWindow { } } - visible: true width: 680 height: 580 title: Qt.application.name + ' v' + Qt.application.version @@ -37,6 +39,10 @@ ApplicationWindow { menuBar: CustomMenuBar { id: customMenuBar + ConfigManager{ + id: configManager + } + onOutputsRequested: { generalStackView.openOutputsPage() customHeader.text = qsTr("Outputs") @@ -46,12 +52,10 @@ ApplicationWindow { enableBlockchain = true enableNetworking = true enableSettings = true - } - ConfigManager{ - id: configManager + enableSettingsAddressBook = false + enableAddrsBook = true } - onPendingTransactionsRequested: { generalStackView.openPendingTransactionsPage() customHeader.text = qsTr("Pending transactions") @@ -61,6 +65,8 @@ ApplicationWindow { enableBlockchain = true enableNetworking = true enableSettings = true + enableSettingsAddressBook = false + enableAddrsBook = true } @@ -73,6 +79,9 @@ ApplicationWindow { enableBlockchain = false enableNetworking = true enableSettings = true + enableSettingsAddressBook = false + enableAddrsBook = true + } onNetworkingRequested: { @@ -84,6 +93,21 @@ ApplicationWindow { enableBlockchain = true enableNetworking = false enableSettings = true + enableSettingsAddressBook = false + enableAddrsBook = true + } + + onAddressBookRequested: { + generalStackView.openAddressBookPage() + customHeader.text = qsTr("Address book") + + enableOutputs = true + enablePendingTransactions = true + enableBlockchain = true + enableNetworking = true + enableSettings = true + enableSettingsAddressBook = true + enableAddrsBook = false } onSettingsRequested: { @@ -95,6 +119,16 @@ ApplicationWindow { enableBlockchain = true enableNetworking = true enableSettings = false + enableSettingsAddressBook = false + enableAddrsBook = true + } + + onSettingsAddressBookRequested: { + generalStackView.openSettingsAddressBookPage() + customHeader.text = qsTr("Address Book Settings") + + // The back button must be used to go back to the Address Book + enableOutputs = enablePendingTransactions = enableBlockchain = enableNetworking = enableSettings = enableSettingsAddressBook = enableAddrsBook = false } onAboutRequested: { @@ -102,7 +136,6 @@ ApplicationWindow { } onAboutQtRequested: { - dialogAboutQt.open() } @@ -111,13 +144,38 @@ ApplicationWindow { } } // CustomMenuBar + Action { + id: actionFullScreen + + property int previous: applicationWindow.visibility + + shortcut: StandardKey.FullScreen + onTriggered: { + if (applicationWindow.visibility !== Window.FullScreen) { + previous = applicationWindow.visibility + } + if (applicationWindow.visibility === Window.FullScreen) { + applicationWindow.showNormal() // Cannot show maximized directly due to a bug in some X11 managers + if (previous === Window.Maximized) { + applicationWindow.showMaximized() + } + } else { + applicationWindow.showFullScreen() + } + } + } + CustomHeader { id: customHeader - } // CustomHeader + } GeneralStackView { id: generalStackView anchors.fill: parent + + onBackRequested: { + customMenuBar.back() + } WalletManager { id: walletManager @@ -127,7 +185,6 @@ ApplicationWindow { //! Settings Settings { id: settings - } //! Dialogs @@ -151,6 +208,30 @@ ApplicationWindow { + "eu fugiat nulla pariatur. Excepteur sint obcaecat cupiditat non proident, " + "sunt in culpa qui officia deserunt mollit anim id est laborum.") } + MsgDialog { + id: requestCancel + anchors.centerIn: Overlay.overlay + width: applicationWindow.width > 440 ? 440 - 40 : applicationWindow.width - 40 + height: applicationWindow.height > 280 ? 280 - 40 : applicationWindow.height - 40 + focus: true + modal: true + standardButtons: Dialog.Cancel + onRejected: { + deviceInteraction.cancelCommand() + } + } + MsgDialog { + id: requestConfirmation + anchors.centerIn: Overlay.overlay + width: applicationWindow.width > 440 ? 440 - 40 : applicationWindow.width - 40 + height: applicationWindow.height > 280 ? 280 - 40 : applicationWindow.height - 40 + focus: true + modal: true + standardButtons: Dialog.Ok | Dialog.Cancel + onRejected: { + deviceInteraction.cancelCommand() + } + } // QR DialogQR { @@ -175,49 +256,125 @@ ApplicationWindow { modal: true } + DeviceInteraction { + id: deviceInteraction + onInitializeDevice: { + dialogUnconfiguredWallet.open(); + } + onSecureDevice: { + dialogSkyWalletId.open(); + } + onOpenInteractionDialog: { + skyWalletInteractionDialog.open(); + } + } + QBridge { + id: topLevelDialogLocker + } + QBridge { + id: bridgeForPassword + + onGetPassword: { + getPasswordDialog.title = message; + getPasswordDialog.clear(); + getPasswordDialog.open(); + } + onDeviceRequireAction: { + msgDialog.title = title; + msgDialog.text = message; + msgDialog.open(); + } + onDeviceRequireConfirmableAction: { + requestConfirmation.title = title; + requestConfirmation.text = message; + requestConfirmation.open(); + } + onDeviceRequireCancelableAction: { + requestCancel.title = title; + requestCancel.text = message; + requestCancel.open(); + } + onGetSkyHardwareWalletPin: { + numPadDialog.clear(title); + numPadDialog.open(); + } + onGetBip39Word: { + bip39WordDialog.clear(title, message); + bip39WordDialog.open(); + } + Component.onCompleted: { + bridgeForPassword.onCompleted(); + } + } + + DialogGetPassword{ + id: getPasswordDialog + anchors.centerIn: Overlay.overlay + property int nAddress + width: applicationWindow.width > 540 ? 540 - 120 : applicationWindow.width - 40 + height: applicationWindow.height > 570 ? 570 - 180 : applicationWindow.height - 40 + + focus: true + modal: true + onClosed:{ + bridgeForPassword.setResult(getPasswordDialog.password) + bridgeForPassword.unlock() + } + } + NumPadDialog { id: numPadDialog anchors.centerIn: Overlay.overlay width: applicationWindow.width > 440 ? 440 - 40 : applicationWindow.width - 40 height: applicationWindow.height > 540 ? 540 - 40 : applicationWindow.height - 40 + focus: visible + modal: true + onClosed: { + msgDialog.close() + } + } + + DialogGetBip39Word { + id: bip39WordDialog + anchors.centerIn: Overlay.overlay + width: applicationWindow.width > 440 ? 440 - 40 : applicationWindow.width - 40 + height: applicationWindow.height > 360 ? 360 - 40 : applicationWindow.height - 40 + focus: true modal: true } - RestoreBackupWordsDialog { - id: restoreBackupWordsDialog + SkyWalletInteractionDialog { + id: skyWalletInteractionDialog anchors.centerIn: Overlay.overlay - width: applicationWindow.width > 460 ? 460 - 40 : applicationWindow.width - 40 - height: applicationWindow.height > 340 ? 340 - 40 : applicationWindow.height - 40 + width: applicationWindow.width > 440 ? 440 - 40 : applicationWindow.width - 40 + height: applicationWindow.height > 460 ? 460 - 40 : applicationWindow.height - 40 - focus: true + focus: visible modal: true } SecureWalletDialog { - id: secureWalletDialog + id: dialogSkyWalletId anchors.centerIn: Overlay.overlay width: applicationWindow.width > 640 ? 640 - 40 : applicationWindow.width - 40 height: (applicationWindow.height > 590 ? 590 - 40 : applicationWindow.height - 40) - (enableBackupWarning ^ enablePINWarning ? 100 : 0) - (!enableBackupWarning && !enablePINWarning ? 240 : 0) - focus: true + focus: visible modal: true } - - WalletCreatedDialog { id: walletCreatedDialog anchors.centerIn: Overlay.overlay width: applicationWindow.width > 540 ? 540 - 40 : applicationWindow.width - 40 height: applicationWindow.height > 360 ? 360 - 40 : applicationWindow.height - 40 - focus: true + focus: visible modal: true } - // Help dialogs DialogAbout { @@ -250,7 +407,7 @@ ApplicationWindow { width: applicationWindow.width - 40 height: applicationWindow.height - 40 - focus: true + focus: visible modal: true } diff --git a/src/ui/splash.qml b/src/ui/splash.qml new file mode 100755 index 00000000..367d820d --- /dev/null +++ b/src/ui/splash.qml @@ -0,0 +1,97 @@ +import QtQuick 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Controls.Material 2.12 +import QtQuick.Window 2.12 +import QtQuick.Layouts 1.12 + +Window { + id: windowSplash + + width: dialogSplash.width + 100 + height: dialogSplash.height + 140 + visible: true + flags: Qt.SplashScreen | Qt.BypassWindowManagerHint | Qt.CustomizeWindowHint | Qt.WindowStaysOnTopHint + color: "transparent" + x: (Screen.width - width)/2 + y: (Screen.height - height)/2 + + Dialog { + id: dialogSplash + anchors.centerIn: Overlay.overlay + visible: true + closePolicy: Dialog.NoAutoClose + standardButtons: Dialog.Abort + + Component.onCompleted: { + standardButton(Dialog.Abort).Material.accent = Material.Red + standardButton(Dialog.Abort).highlighted = true + } + + onRejected: Qt.exit(-1) + onClosed: windowSplash.visible = false + + width: 300 + height: 300 + // The width/height must be always greater than its implicit version: + // onAboutToShow: console.log("Size:", width + 'x' + height, "Implicit size:", implicitWidth + 'x' + implicitHeight) + + ColumnLayout { + Image { + id: imageLogo + Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter + fillMode: Image.PreserveAspectFit + source: "qrc:/images/resources/images/icons/appIcon/appIcon.png" + sourceSize: "128x128" + } + + Label { + id: labelApplicationName + Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter + text: "FiberCrypto Wallet" + font.family: "Hemi Head" + font.pointSize: Qt.application.font.pointSize * 2.2 + } + + Label { + id: labelApplicationDescription + Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter + text: qsTr("Multi-coin cryptocurrency wallet") + font.bold: true + } + + RowLayout { + clip: true + Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter + + BusyIndicator { + running: visible + implicitWidth: 32 + implicitHeight: implicitWidth + } + Label { + text: qsTr("Loading...") + font.italic: true + } + } + } // ColumnLayout + } // Dialog + + Loader { + id: loader + source: "main.qml" + asynchronous: true + + onLoaded: { + dialogSplash.standardButton(Dialog.Abort).enabled = false + item.visible = true + timer.start() + } + } + + Timer { + id: timer + interval: 200 + repeat: false + onTriggered: dialogSplash.close() + } +} diff --git a/src/util/account.go b/src/util/account.go new file mode 100644 index 00000000..2b46127f --- /dev/null +++ b/src/util/account.go @@ -0,0 +1,45 @@ +package util + +import ( + "github.com/fibercrypto/fibercryptowallet/src/errors" + "time" +) + +// BalanceSnapshot act as account balances cache +type BalanceSnapshot struct { + cache map[string]uint64 + lastUpdate int64 + updateInterval int64 +} + +const defaultUpdateInterval = 10000000 + +// NewBalanceSnapshot new balance snapshot with validity timeout +func NewBalanceSnapshot(updInterval int64) *BalanceSnapshot { + if updInterval <= 0 { + updInterval = defaultUpdateInterval + } + return &BalanceSnapshot{ + cache: make(map[string]uint64), + lastUpdate: 0, + updateInterval: updInterval, + } +} + +// SetCoins update balance for a given coin token +func (bs *BalanceSnapshot) SetCoins(ticker string, coins uint64) { + bs.cache[ticker] = coins + bs.lastUpdate = time.Now().UnixNano() +} + +// GetCoins retrieve balance for a given coin ticker +func (bs *BalanceSnapshot) GetCoins(ticker string) (uint64, error) { + if coins, hasCoins := bs.cache[ticker]; hasCoins { + return coins, nil + } + return 0, errors.ErrKeyNotFound +} + +func (bs *BalanceSnapshot) IsUpdated() bool { + return time.Now().UnixNano()-bs.lastUpdate < bs.updateInterval +} diff --git a/src/util/assertthat/assertions.go b/src/util/assertthat/assertions.go new file mode 100644 index 00000000..e83aab40 --- /dev/null +++ b/src/util/assertthat/assertions.go @@ -0,0 +1,140 @@ +package assertthat + +import ( + "bytes" + "fmt" + "reflect" + "strings" + + "github.com/fibercrypto/fibercryptowallet/src/util" + "github.com/fibercrypto/fibercryptowallet/src/util/testutil" + "github.com/stretchr/testify/assert" +) + +// ObjectsAreEqual determines if two objects are considered equal. +// +// This function does no assertion of any kind. +func ObjectsAreEqual(expected, actual interface{}) bool { + if expected == nil || actual == nil { + return expected == actual + } + + exp, ok := expected.([]byte) + if !ok { + return reflect.DeepEqual(expected, actual) + } + + act, ok := actual.([]byte) + if !ok { + return false + } + if exp == nil || act == nil { + return exp == nil && act == nil + } + return bytes.Equal(exp, act) +} + +// Fail reports a failure through +func Fail(t testutil.TestingT, failureMessage string, msgAndArgs ...interface{}) bool { + if h, ok := t.(testutil.THelper); ok { + h.Helper() + } + content := []util.LabeledContent{ + {"Error Trace", strings.Join(assert.CallerInfo(), "\n\t\t\t")}, + {"Error", failureMessage}, + } + + // Add test name if the Go version supports it + if n, ok := t.(interface { + Name() string + }); ok { + content = append(content, util.LabeledContent{"Test", n.Name()}) + } + + message := util.MessageFromMsgAndArgs(msgAndArgs...) + if len(message) > 0 { + content = append(content, util.LabeledContent{"Messages", message}) + } + + t.Errorf("\n%s", ""+util.LabeledOutput(content...)) + + return false +} + +// FailNow fails test +func FailNow(t testutil.TestingT, failureMessage string, msgAndArgs ...interface{}) bool { + if h, ok := t.(testutil.THelper); ok { + h.Helper() + } + Fail(t, failureMessage, msgAndArgs...) + + // We cannot extend TestingT with FailNow() and + // maintain backwards compatibility, so we fallback + // to panicking when FailNow is not available in + // TestingT. + // See issue #263 + + if t, ok := t.(testutil.FailNower); ok { + t.FailNow() + } else { + panic("test failed and t is missing `FailNow()`") + } + return false +} + +// ElementsMatch asserts that the specified listA(array, slice...) is equal to specified +// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements, +// the number of appearances of each of them in both lists should match. +// +// assert.ElementsMatch(t, [1, 3, 2, 3], [1, 3, 3, 2]) +func ElementsMatch(t testutil.TestingT, listA, listB interface{}, msgAndArgs ...interface{}) (ok bool) { + if h, ok := t.(testutil.THelper); ok { + h.Helper() + } + if testutil.IsEmpty(listA) && testutil.IsEmpty(listB) { + return true + } + + aKind := reflect.TypeOf(listA).Kind() + bKind := reflect.TypeOf(listB).Kind() + + if aKind != reflect.Array && aKind != reflect.Slice { + return Fail(t, fmt.Sprintf("%q has an unsupported type %s", listA, aKind), msgAndArgs...) + } + + if bKind != reflect.Array && bKind != reflect.Slice { + return Fail(t, fmt.Sprintf("%q has an unsupported type %s", listB, bKind), msgAndArgs...) + } + + aValue := reflect.ValueOf(listA) + bValue := reflect.ValueOf(listB) + + aLen := aValue.Len() + bLen := bValue.Len() + + if aLen != bLen { + return Fail(t, fmt.Sprintf("lengths don't match: %d != %d", aLen, bLen), msgAndArgs...) + } + + // Mark indexes in bValue that we already used + visited := make([]bool, bLen) + for i := 0; i < aLen; i++ { + element := aValue.Index(i).Interface() + found := false + for j := 0; j < bLen; j++ { + if visited[j] { + continue + } + if ObjectsAreEqual(bValue.Index(j).Interface(), element) { + visited[j] = true + found = true + break + } + } + if !found { + return Fail(t, fmt.Sprintf("element %s appears more times in %s than in %s", element, aValue, bValue), msgAndArgs...) + } + } + + return true +} diff --git a/src/util/coin.go b/src/util/coin.go index bf3016d1..70f4215c 100644 --- a/src/util/coin.go +++ b/src/util/coin.go @@ -31,8 +31,8 @@ func (gOut *GenericOutput) IsSpent() bool { } // GetAddress returns the address of the party receiving funds -func (gOut *GenericOutput) GetAddress() core.Address { - return gOut.Address +func (gOut *GenericOutput) GetAddress() (core.Address, error) { + return gOut.Address, nil } // SetCoins allocates coin for an asset given its ticker diff --git a/src/util/coin_test.go b/src/util/coin_test.go new file mode 100644 index 00000000..c599d471 --- /dev/null +++ b/src/util/coin_test.go @@ -0,0 +1,67 @@ +package util + +import ( + "sort" + "testing" + + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + + "github.com/fibercrypto/fibercryptowallet/src/coin/mocks" + "github.com/fibercrypto/fibercryptowallet/src/core" +) + +func TestNewGenericOutput(t *testing.T) { + fakeTicker := "MOCKSCOIN" + fakeDesc := "Fake coin" + fakeExp := 3 + fakeMeta := core.AltcoinMetadata{ + Name: fakeDesc, + Ticker: fakeTicker, + Family: fakeTicker, + HasBip44: false, + Bip44CoinType: 0, + Accuracy: int32(fakeExp), + } + mockPlugin := new(mocks.AltcoinPlugin) + mockPlugin.On("RegisterTo", mock.Anything).Return().Run(func(args mock.Arguments) { + manager := args.Get(0).(core.AltcoinManager) + manager.RegisterAltcoin(fakeMeta, mockPlugin) + }) + mockPlugin.On("GetName").Return(fakeDesc) + RegisterAltcoin(mockPlugin) + + addr := new(mocks.Address) + + notRegisteredCoin := "some_coin" + output := NewGenericOutput(addr, "id") + require.Equal(t, GenericOutput{Address: addr, id: "id", Balance: make(map[string]uint64)}, output) + + pushError := output.PushCoins(fakeTicker, "42") + require.Nil(t, pushError) + pushError = output.PushCoins(notRegisteredCoin, "42") + require.NotNil(t, pushError) + + output.SetCoins(notRegisteredCoin, uint64(20)) + amount, err := output.GetCoins(notRegisteredCoin) + require.Equal(t, uint64(20), amount) + require.Nil(t, err) + amount, err = output.GetCoins(fakeTicker) + require.Equal(t, uint64(42000), amount) + require.Nil(t, err) + + outAddress, err := output.GetAddress() + require.Equal(t, nil, err) + require.Equal(t, addr, outAddress) + require.Equal(t, "id", output.GetId()) + require.False(t, output.IsSpent()) + + testAssets := []string{fakeTicker, notRegisteredCoin} + sort.Strings(testAssets) + assets := output.SupportedAssets() + sort.Strings(assets) + require.Equal(t, testAssets, assets) + + _, err2 := output.GetCoins("other_coin") + require.Error(t, err2) +} diff --git a/src/util/datetime_test.go b/src/util/datetime_test.go new file mode 100644 index 00000000..f0133582 --- /dev/null +++ b/src/util/datetime_test.go @@ -0,0 +1,24 @@ +package util + +import ( + "testing" + "time" + + "github.com/stretchr/testify/require" +) + +func TestParseDate(t *testing.T) { + some_date := int64(1577665665) + datetime := time.Unix(some_date, 0) + + y, m, d := datetime.Date() + h, min, s := datetime.Hour(), datetime.Minute(), datetime.Second() + + ny, nm, nd, nh, nmin, ns := ParseDate(some_date) + require.Equal(t, y, ny) + require.Equal(t, int(m), nm) + require.Equal(t, d, nd) + require.Equal(t, h, nh) + require.Equal(t, min, nmin) + require.Equal(t, s, ns) +} diff --git a/src/util/logging/logger.go b/src/util/logging/logger.go index 7b7e3359..0fa8079d 100644 --- a/src/util/logging/logger.go +++ b/src/util/logging/logger.go @@ -10,6 +10,8 @@ import ( // Logger wraps logrus.FieldLogger type Logger struct { logrus.FieldLogger + + moduleName string } // Critical adds special critical-level fields for specially highlighted logging, @@ -26,6 +28,8 @@ func (logger *Logger) WithTime(t time.Time) *logrus.Entry { // MasterLogger wraps logrus.Logger and is able to create new package-aware loggers type MasterLogger struct { *logrus.Logger + + packageModules []*Logger } // NewMasterLogger creates a new package-aware logger with formatting string @@ -46,14 +50,18 @@ func NewMasterLogger() *MasterLogger { Hooks: hooks, Level: logrus.DebugLevel, }, + packageModules: []*Logger{}, } } // PackageLogger instantiates a package-aware logger func (logger *MasterLogger) PackageLogger(moduleName string) *Logger { - return &Logger{ + pkgLogger := &Logger{ FieldLogger: logger.WithField(logModuleKey, moduleName), + moduleName: moduleName, } + logger.packageModules = append(logger.packageModules, pkgLogger) + return pkgLogger } // AddHook adds a logrus.Hook to the logger and its module loggers @@ -64,6 +72,9 @@ func (logger *MasterLogger) AddHook(hook logrus.Hook) { // SetLevel sets the log level for the logger and its module loggers func (logger *MasterLogger) SetLevel(level logrus.Level) { logger.Level = level + for _, pl := range logger.packageModules { + pl.FieldLogger = logger.WithField(logModuleKey, pl.moduleName) + } } // EnableColors enables colored logging diff --git a/src/util/logging/logging.go b/src/util/logging/logging.go index f7b86ffc..ba67d1fb 100644 --- a/src/util/logging/logging.go +++ b/src/util/logging/logging.go @@ -5,14 +5,18 @@ package logging import ( "errors" + "fmt" "io" "io/ioutil" + "os" + "strconv" "strings" "github.com/sirupsen/logrus" ) var log = NewMasterLogger() +var output = 0 const ( // logModuleKey is the key used for the module name data entry @@ -23,6 +27,22 @@ const ( logPriorityCritical = "CRITICAL" ) +const ( + Debug = iota + Information + Warning + Error + FatalError + Panic +) + +const ( + Stdout = iota + Stderr + None + File +) + // LevelFromString returns a logrus.Level from a string identifier func LevelFromString(s string) (logrus.Level, error) { switch strings.ToLower(s) { @@ -39,7 +59,32 @@ func LevelFromString(s string) (logrus.Level, error) { case "panic": return logrus.PanicLevel, nil default: - return logrus.DebugLevel, errors.New("could not convert string to log level") + return logrus.DebugLevel, errors.New("Couldn't convert string to log level") + } +} + +// LevelFromEnum returns a logrus.Level from an enum identifier +func LevelFromEnum(s string) (logrus.Level, error) { + idf, err := strconv.Atoi(s) + if err != nil { + return logrus.DebugLevel, errors.New("Couldn't convert enum identifier to log level") + } + + switch idf { + case Debug: + return logrus.DebugLevel, nil + case Information: + return logrus.InfoLevel, nil + case Warning: + return logrus.WarnLevel, nil + case Error: + return logrus.ErrorLevel, nil + case FatalError: + return logrus.FatalLevel, nil + case Panic: + return logrus.PanicLevel, nil + default: + return logrus.DebugLevel, errors.New("Couldn't convert enum identifier to log level") } } @@ -77,3 +122,50 @@ func SetOutputTo(w io.Writer) { func Disable() { log.Out = ioutil.Discard } + +// GetFileToLog get a file with path for the logger's output +func GetFileToLog(dir string) (io.Writer, error) { + if output != File { + return nil, errors.New("Log output isn't a File") + } + + f, err := os.OpenFile(dir+".log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0344) + if err != nil { + return nil, err + } + fmt.Fprintln(f) + //defer f.Close() + + return f, nil +} + +// NoWriter is a writer that write nothing, useful when no writing or output is desired. +type NoWriter struct { + io.Writer +} + +func (NoWriter) Write(p []byte) (n int, err error) { + return 0, nil +} + +// GetOutputWriter given a option return a writer +func GetOutputWriter(opt string) (io.Writer, error) { + idf, err := strconv.Atoi(opt) + if err != nil { + return nil, errors.New("Couldn't convert enum identifier to log output") + } + + switch idf { + case Stdout: + return os.Stdout, nil + case Stderr: + return os.Stderr, nil + case None: + return NoWriter{}, nil + case File: + output = File + return nil, nil + default: + return nil, errors.New("Couldn't convert enum identifier to log output") + } +} diff --git a/src/util/logging/logging_test.go b/src/util/logging/logging_test.go new file mode 100644 index 00000000..70dd45d8 --- /dev/null +++ b/src/util/logging/logging_test.go @@ -0,0 +1,63 @@ +package logging + +import ( + "os" + "testing" + + "github.com/sirupsen/logrus" + + "github.com/stretchr/testify/require" +) + +func TestGetOutputWriter(t *testing.T) { + val, err := GetOutputWriter("stdout") + require.NoError(t, err) + require.Equal(t, os.Stdout, val) + + val, err = GetOutputWriter("stderr") + require.NoError(t, err) + require.Equal(t, os.Stderr, val) + + val, err = GetOutputWriter("none") + require.NoError(t, err) + require.Equal(t, NoWriter{}, val) + + _, err = GetOutputWriter("log") + require.NoError(t, err) + + _, err = GetOutputWriter(".....*/*/a**%$&#$@log") + require.Error(t, err) +} + +func TestLevelFromString(t *testing.T) { + val, err := LevelFromString("debug") + require.NoError(t, err) + require.Equal(t, logrus.DebugLevel, val) + + val, err = LevelFromString("Debug") + require.NoError(t, err) + require.Equal(t, logrus.DebugLevel, val) + + val, err = LevelFromString("info") + require.NoError(t, err) + require.Equal(t, logrus.InfoLevel, val) + + val, err = LevelFromString("warn") + require.NoError(t, err) + require.Equal(t, logrus.WarnLevel, val) + + val, err = LevelFromString("error") + require.NoError(t, err) + require.Equal(t, logrus.ErrorLevel, val) + + val, err = LevelFromString("fatal") + require.NoError(t, err) + require.Equal(t, logrus.FatalLevel, val) + + val, err = LevelFromString("panic") + require.NoError(t, err) + require.Equal(t, logrus.PanicLevel, val) + + _, err = LevelFromString("information") + require.Error(t, err) +} diff --git a/src/util/main.go b/src/util/main.go new file mode 100644 index 00000000..f796be67 --- /dev/null +++ b/src/util/main.go @@ -0,0 +1,22 @@ +package util + +import ( + "errors" + + "github.com/fibercrypto/fibercryptowallet/src/core" + local "github.com/fibercrypto/fibercryptowallet/src/main" +) + +func PubKeyFromBytes(ticker string, bytes []byte) (core.PubKey, error) { + if plugin, isRegistered := local.LoadAltcoinManager().LookupAltcoinPlugin(ticker); isRegistered { + return plugin.PubKeyFromBytes(bytes) + } + return nil, errors.New(ticker + " ") +} + +func SecKeyFromBytes(ticker string, bytes []byte) (core.PubKey, error) { + if plugin, isRegistered := local.LoadAltcoinManager().LookupAltcoinPlugin(ticker); isRegistered { + return plugin.SecKeyFromBytes(bytes) + } + return nil, errors.New(ticker + " ") +} diff --git a/src/util/main_test.go b/src/util/main_test.go new file mode 100644 index 00000000..7e03ab57 --- /dev/null +++ b/src/util/main_test.go @@ -0,0 +1,70 @@ +package util + +import ( + "testing" + + "github.com/fibercrypto/fibercryptowallet/src/coin/mocks" + "github.com/fibercrypto/fibercryptowallet/src/core" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" +) + +func TestPubKeyFromBytes(t *testing.T) { + fakeTicker := "MOCKSCOIN" + fakeDesc := "Fake coin" + fakeExp := 3 + fakeMeta := core.AltcoinMetadata{ + Name: fakeDesc, + Ticker: fakeTicker, + Family: fakeTicker, + HasBip44: false, + Bip44CoinType: 0, + Accuracy: int32(fakeExp), + } + mockPlugin := new(mocks.AltcoinPlugin) + mockPlugin.On("RegisterTo", mock.Anything).Return().Run(func(args mock.Arguments) { + manager := args.Get(0).(core.AltcoinManager) + manager.RegisterAltcoin(fakeMeta, mockPlugin) + }) + bytes := []byte{1, 0, 1} + mockPubKey := new(mocks.PubKey) + mockPlugin.On("PubKeyFromBytes", bytes).Return(mockPubKey, nil) + RegisterAltcoin(mockPlugin) + + pubKey, err := PubKeyFromBytes(fakeTicker, bytes) + require.Nil(t, err) + require.Equal(t, pubKey, mockPubKey) + + _, err = PubKeyFromBytes(`CUSTOMTICKER`, bytes) + require.NotNil(t, err) +} + +func TestSecKeyFromBytes(t *testing.T) { + fakeTicker := "MOCKSCOIN" + fakeDesc := "Fake coin" + fakeExp := 3 + fakeMeta := core.AltcoinMetadata{ + Name: fakeDesc, + Ticker: fakeTicker, + Family: fakeTicker, + HasBip44: false, + Bip44CoinType: 0, + Accuracy: int32(fakeExp), + } + mockPlugin := new(mocks.AltcoinPlugin) + mockPlugin.On("RegisterTo", mock.Anything).Return().Run(func(args mock.Arguments) { + manager := args.Get(0).(core.AltcoinManager) + manager.RegisterAltcoin(fakeMeta, mockPlugin) + }) + bytes := []byte{1, 0, 1} + mockSecKey := new(mocks.SecKey) + mockPlugin.On("SecKeyFromBytes", bytes).Return(mockSecKey, nil) + RegisterAltcoin(mockPlugin) + + secKey, err := SecKeyFromBytes(fakeTicker, bytes) + require.Nil(t, err) + require.Equal(t, secKey, mockSecKey) + + _, err = SecKeyFromBytes(`CUSTOMTICKER`, bytes) + require.NotNil(t, err) +} diff --git a/src/util/plugin_test.go b/src/util/plugin_test.go new file mode 100644 index 00000000..2706f9b1 --- /dev/null +++ b/src/util/plugin_test.go @@ -0,0 +1,82 @@ +package util + +import ( + "fmt" + "testing" + + "github.com/fibercrypto/fibercryptowallet/src/coin/mocks" + "github.com/fibercrypto/fibercryptowallet/src/core" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" +) + +func TestRegisteredPlugin(t *testing.T) { + fakeTicker := "MOCKSCOIN" + fakeDesc := "Fake coin" + fakeExp := 3 + fakeQuotient := 1000 // 10 ^ fakeExp + fakeMeta := core.AltcoinMetadata{ + Name: fakeDesc, + Ticker: fakeTicker, + Family: fakeTicker, + HasBip44: false, + Bip44CoinType: 0, + Accuracy: int32(fakeExp), + } + mockPlugin := new(mocks.AltcoinPlugin) + mockPlugin.On("RegisterTo", mock.Anything).Return().Run(func(args mock.Arguments) { + manager := args.Get(0).(core.AltcoinManager) + manager.RegisterAltcoin(fakeMeta, mockPlugin) + }) + mockPlugin.On("GetName").Return(fakeDesc) + RegisterAltcoin(mockPlugin) + + require.Equal(t, fakeDesc, AltcoinCaption(fakeTicker)) + q, err := AltcoinQuotient(fakeTicker) + require.NoError(t, err) + require.Equal(t, uint64(fakeQuotient), q) +} + +func TestUnknownPlugin(t *testing.T) { + fakeTicker := "MOCKSCOIN_UNK" + require.Equal(t, "MOCKSCOIN_UNK ", AltcoinCaption(fakeTicker)) + _, err := AltcoinQuotient(fakeTicker) + require.Error(t, err) +} + +func TestLookupSignerByUID(t *testing.T) { + type WalletSigner struct { + mocks.Wallet + mocks.TxnSigner + } + + emptyUID := core.UID("") + uid := core.UID("walletid") + other := core.UID("otherid") + + ws := new(WalletSigner) + ws.TxnSigner.On("GetSignerUID").Return(uid, nil) + var signer core.TxnSigner = ws + err := AttachSignService(signer) + defer RemoveSignService(uid) // nolint gosec + require.NoError(t, err) + + tests := []struct { + wallet core.Wallet + id core.UID + want core.TxnSigner + }{ + {wallet: new(mocks.Wallet), id: emptyUID, want: nil}, + {wallet: ws, id: emptyUID, want: signer}, + {wallet: ws, id: uid, want: signer}, + {wallet: new(mocks.Wallet), id: uid, want: signer}, + {wallet: new(mocks.Wallet), id: other, want: nil}, + {wallet: ws, id: other, want: nil}, + } + + for i, tt := range tests { + t.Run(fmt.Sprintf("lookup%d", i), func(t *testing.T) { + require.Equal(t, tt.want, LookupSignerByUID(tt.wallet, tt.id)) + }) + } +} diff --git a/src/util/pluginutil.go b/src/util/pluginutil.go index b08591e1..40b0db98 100644 --- a/src/util/pluginutil.go +++ b/src/util/pluginutil.go @@ -36,9 +36,16 @@ func LookupSignerByUID(wlt core.Wallet, id core.UID) core.TxnSigner { } return nil } - // Wallet matches ID - if isSigner && wltSigner.GetSignerUID() == id { - return wltSigner + if isSigner { + // Wallet matches ID + uid, err := wltSigner.GetSignerUID() + if err != nil { + logUtil.WithError(err).Errorln("unable to get signer uid") + return nil + } + if uid == id { + return wltSigner + } } // Lookup global signers return local.LoadAltcoinManager().LookupSignService(id) diff --git a/src/util/requirethat/require.go b/src/util/requirethat/require.go new file mode 100644 index 00000000..2e6b1576 --- /dev/null +++ b/src/util/requirethat/require.go @@ -0,0 +1,21 @@ +package requirethat + +import ( + "github.com/fibercrypto/fibercryptowallet/src/util/assertthat" + "github.com/fibercrypto/fibercryptowallet/src/util/testutil" +) + +// ElementsMatch asserts that the specified listA(array, slice...) is equal to specified +// listB(array, slice...) ignoring the order of the elements. If there are duplicate elements, +// the number of appearances of each of them in both lists should match. +// +// requirethat.ElementsMatch(t, [1, 3, 2, 3], [1, 3, 3, 2]) +func ElementsMatch(t testutil.TestingT, listA interface{}, listB interface{}, msgAndArgs ...interface{}) { + if h, ok := t.(testutil.THelper); ok { + h.Helper() + } + if assertthat.ElementsMatch(t, listA, listB, msgAndArgs...) { + return + } + t.FailNow() +} diff --git a/src/util/sign.go b/src/util/sign.go index 2fecebe2..f3eb2ddf 100644 --- a/src/util/sign.go +++ b/src/util/sign.go @@ -64,7 +64,7 @@ func GetSignerDescription(signerID core.UID) (string, error) { if signer == nil { return "", errors.ErrInvalidID } - return signer.GetSignerDescription(), nil + return signer.GetSignerDescription() } // LookupSignServiceForWallet instantiate signing straegy identified by UID. Fall back to wallet if empty diff --git a/src/util/sign_test.go b/src/util/sign_test.go index 9dd9675b..dcbf5294 100644 --- a/src/util/sign_test.go +++ b/src/util/sign_test.go @@ -1,30 +1,36 @@ package util import ( + "fmt" "testing" "github.com/SkycoinProject/skycoin/src/testutil" "github.com/fibercrypto/fibercryptowallet/src/coin/mocks" "github.com/fibercrypto/fibercryptowallet/src/core" "github.com/fibercrypto/fibercryptowallet/src/errors" + "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" ) func TestSignerMethods(t *testing.T) { signerID1 := core.UID("TestAddLookupSigner#1") signer1 := new(mocks.TxnSigner) - signer1.On("GetSignerUID").Return(signerID1) - signer1.On("GetSignerDescription").Return(string(signerID1)) - require.Equal(t, signer1.GetSignerUID(), signerID1) - require.Equal(t, signer1.GetSignerDescription(), string(signerID1)) - err := AttachSignService(signer1) + signer1.On("GetSignerUID").Return(signerID1, nil) + signer1.On("GetSignerDescription").Return(string(signerID1), nil) + uid, err := signer1.GetSignerUID() + require.NoError(t, err) + require.Equal(t, uid, signerID1) + desc, err := signer1.GetSignerDescription() + require.NoError(t, err) + require.Equal(t, desc, string(signerID1)) + err = AttachSignService(signer1) require.NoError(t, err) defer RemoveSignService(signerID1) // nolint gosec signer := LookupSignService(signerID1) require.NotNil(t, signer) require.Equal(t, signer, signer1) - desc, err := GetSignerDescription(signerID1) + desc, err = GetSignerDescription(signerID1) require.NoError(t, err) require.Equal(t, string(signerID1), desc) @@ -46,9 +52,11 @@ func TestSignersEnum(t *testing.T) { // Install global signers for i, uid := range signerIDs { signer := new(mocks.TxnSigner) - signer.On("GetSignerUID").Return(uid) - require.Equal(t, signer.GetSignerUID(), uid) - err := AttachSignService(signer) + signer.On("GetSignerUID").Return(uid, nil) + uid, err := signer.GetSignerUID() + require.NoError(t, err) + require.Equal(t, uid, uid) + err = AttachSignService(signer) require.NoError(t, err) signers[i] = signer } @@ -58,12 +66,13 @@ func TestSignersEnum(t *testing.T) { allSigners := EnumerateSignServices() signersFound := make(map[core.UID]struct{}) - for allSigners.HasNext() { - signerID := allSigners.Value().GetSignerUID() + for allSigners.Next() { + uid, err := allSigners.Value().GetSignerUID() + require.NoError(t, err) + signerID := uid _, wasFound := signersFound[signerID] require.False(t, wasFound) signersFound[signerID] = struct{}{} - allSigners.Next() } _, wasFound := signersFound[signerIDs[0]] require.True(t, wasFound) @@ -86,9 +95,11 @@ func TestSignersReadyForTxn(t *testing.T) { // Install global signers for i, uid := range signerIDs { signer := new(mocks.TxnSigner) - signer.On("GetSignerUID").Return(uid) - require.Equal(t, signer.GetSignerUID(), uid) - err := AttachSignService(signer) + signer.On("GetSignerUID").Return(uid, nil) + dUid, err := signer.GetSignerUID() + require.NoError(t, err) + require.Equal(t, dUid, uid) + err = AttachSignService(signer) require.NoError(t, err) signers[i] = signer } @@ -110,12 +121,12 @@ func TestSignersReadyForTxn(t *testing.T) { supportedSigners := SignServicesForTxn(wlt, txn) signersFound := make(map[core.UID]struct{}) - for supportedSigners.HasNext() { - signerID := supportedSigners.Value().GetSignerUID() + for supportedSigners.Next() { + signerID, err := supportedSigners.Value().GetSignerUID() + require.NoError(t, err) _, wasFound := signersFound[signerID] require.False(t, wasFound) signersFound[signerID] = struct{}{} - supportedSigners.Next() } _, wasFound := signersFound[signerIDs[0]] require.True(t, wasFound) @@ -129,4 +140,144 @@ func TestSignersReadyForTxn(t *testing.T) { require.False(t, wasFound) _, wasFound = signersFound[signerIDs[5]] require.True(t, wasFound) + + ready, err := ReadyForTxn(signerIDs[0], wlt, txn) + require.True(t, ready) + require.Nil(t, err) + ready, err = ReadyForTxn(signerIDs[1], wlt, txn) + require.False(t, ready) + require.Nil(t, err) + ready, err = ReadyForTxn(signerIDs[2], wlt, txn) + require.False(t, ready) + require.NotNil(t, err) + ready, err = ReadyForTxn(signerIDs[3], wlt, txn) + require.True(t, ready) + require.Nil(t, err) + ready, err = ReadyForTxn(signerIDs[4], wlt, txn) + require.True(t, ready) + require.NotNil(t, err) + ready, err = ReadyForTxn(signerIDs[5], wlt, txn) + require.True(t, ready) + require.Nil(t, err) + _, err = ReadyForTxn(core.UID("unknown_id"), wlt, txn) + require.NotNil(t, err) +} + +func TestLookupSignServiceForWallet(t *testing.T) { + type WalletSigner struct { + mocks.Wallet + mocks.TxnSigner + } + + emptyUID := core.UID("") + uid := core.UID("walletid") + other := core.UID("otherid") + + ws := new(WalletSigner) + ws.TxnSigner.On("GetSignerUID").Return(uid, nil) + var signer core.TxnSigner = ws + err := AttachSignService(signer) + defer RemoveSignService(uid) // nolint gosec + require.NoError(t, err) + + tests := []struct { + wallet core.Wallet + id core.UID + want core.TxnSigner + }{ + {wallet: new(mocks.Wallet), id: emptyUID, want: nil}, + {wallet: ws, id: emptyUID, want: signer}, + {wallet: ws, id: uid, want: signer}, + {wallet: new(mocks.Wallet), id: uid, want: signer}, + {wallet: new(mocks.Wallet), id: other, want: nil}, + {wallet: ws, id: other, want: nil}, + } + + for i, tt := range tests { + t.Run(fmt.Sprintf("lookup%d", i), func(t *testing.T) { + _signer, err := LookupSignServiceForWallet(tt.wallet, tt.id) + require.Equal(t, tt.want, _signer) + if tt.want == nil { + require.NotNil(t, err) + } + }) + } +} + +func TestSignTransaction(t *testing.T) { + pwd := func(s string, kvs core.KeyValueStore) (string, error) { + return s, nil + } + + uid := core.UID("signer_id") + signer := new(mocks.TxnSigner) + signer.On("GetSignerUID").Return(uid, nil) + attachErr := AttachSignService(signer) + require.Nil(t, attachErr) + defer RemoveSignService(uid) // nolint gosec + + ind := make([]string, 0) + txn := new(mocks.Transaction) + ctx := new(mocks.KeyValueStore) + + signer.On("SignTransaction", txn, mock.Anything, ind).Return(txn, nil).Run(func(args mock.Arguments) { + pwdReader := args.Get(1).(core.PasswordReader) + msg := "message" + _msg, err2 := pwdReader(msg, ctx) + require.Nil(t, err2) + require.Equal(t, msg, _msg) + }) + signedTxn, err := SignTransaction(uid, txn, pwd, ind) + require.Nil(t, err) + require.Equal(t, txn, signedTxn) + + _, err = SignTransaction(core.UID(""), txn, pwd, ind) + require.NotNil(t, err) +} + +func TestGenericMultiWalletSign(t *testing.T) { + var pwd core.PasswordReader = func(s string, kvs core.KeyValueStore) (string, error){ + return s, nil + } + + inputsIdx := []string{"index1", "index2"} + wlt, txn := new(mocks.Wallet), new(mocks.Transaction) + + uid := core.UID("signer_id") + signer := new(mocks.TxnSigner) + signer.On("GetSignerUID").Return(uid, nil) + attachErr := AttachSignService(signer) + require.Nil(t, attachErr) + defer RemoveSignService(uid) // nolint gosec + + spec := make([]core.InputSignDescriptor, 0) + for _, input := range inputsIdx { + inputSpec := core.InputSignDescriptor{ + InputIndex: input, + SignerID: uid, + Wallet: wlt, + } + spec = append(spec, inputSpec) + } + + badTxn := new(mocks.Transaction) + badTxn.On("GetId").Return("bad_txn_id") + wlt.On("Sign", txn, signer, mock.Anything, inputsIdx).Return(txn, nil) + wlt.On("Sign", badTxn, signer, mock.Anything, inputsIdx).Return(txn, errors.ErrInvalidTxn) + _txn, err := GenericMultiWalletSign(txn, spec, pwd) + require.Equal(t, txn, _txn) + require.Nil(t, err) + + _, err = GenericMultiWalletSign(badTxn, spec, pwd) + require.NotNil(t, err) + + spec = []core.InputSignDescriptor{ + core.InputSignDescriptor{ + InputIndex: "", + SignerID: core.UID(""), + Wallet: wlt, + }, + } + _, err = GenericMultiWalletSign(txn, spec, pwd) + require.NotNil(t, err) } diff --git a/src/util/signutil/sign.go b/src/util/signutil/sign.go index bc8d1490..81db636e 100644 --- a/src/util/signutil/sign.go +++ b/src/util/signutil/sign.go @@ -12,7 +12,7 @@ func NewTxnSignerIteratorFromMap(signers map[core.UID]core.TxnSigner) core.TxnSi } return &DefaultTxnSignerIterator{ signers: signersSlice, - nextIdx: 0, + nextIdx: -1, } } @@ -26,7 +26,7 @@ func FilterSignersFromMap(signers map[core.UID]core.TxnSigner, cond func(core.Tx } return &DefaultTxnSignerIterator{ signers: signersSlice, - nextIdx: 0, + nextIdx: -1, } } @@ -38,21 +38,21 @@ type DefaultTxnSignerIterator struct { // Value of signer at iterator pointer position func (sm *DefaultTxnSignerIterator) Value() core.TxnSigner { - if sm.HasNext() { - return sm.signers[sm.nextIdx] - } - return nil + return sm.signers[sm.nextIdx] } // Next discards current value and moves iteration pointer up to next item func (sm *DefaultTxnSignerIterator) Next() bool { - sm.nextIdx++ - return sm.HasNext() + if sm.HasNext() { + sm.nextIdx++ + return true + } + return false } // HasNext may be used to query whether more items are to be expected in the sequence func (sm *DefaultTxnSignerIterator) HasNext() bool { - return sm.nextIdx < len(sm.signers) + return sm.nextIdx + 1 < len(sm.signers) } // Count total number of items in sequence diff --git a/src/util/storage_test.go b/src/util/storage_test.go index ab6cf1b8..76063ca1 100644 --- a/src/util/storage_test.go +++ b/src/util/storage_test.go @@ -52,3 +52,10 @@ func TestKeyValueiWithDefaultsGetValue(t *testing.T) { require.Equal(t, "v1", s.GetValue("k1")) require.Nil(t, s.GetValue("z")) } + +func TestKeyValuesWithDefaultsSetValue(t *testing.T) { + kvmd := NewKeyValuesWithDefaults(nil, NewKeyValueMap()) + key, value := "key", "value" + kvmd.SetValue(key, value) + require.Equal(t, value, kvmd.GetValue(key)) +} diff --git a/src/util/testutil/collections.go b/src/util/testutil/collections.go new file mode 100644 index 00000000..d2c3e3dd --- /dev/null +++ b/src/util/testutil/collections.go @@ -0,0 +1,33 @@ +package testutil + +import ( + "reflect" +) + +// IsEmpty gets whether the specified object is considered empty or not. +func IsEmpty(object interface{}) bool { + + // get nil case out of the way + if object == nil { + return true + } + + objValue := reflect.ValueOf(object) + + switch objValue.Kind() { + // collection types are empty when they have no element + case reflect.Array, reflect.Chan, reflect.Map, reflect.Slice: + return objValue.Len() == 0 + // pointers are empty if nil or if the value they point to is empty + case reflect.Ptr: + if objValue.IsNil() { + return true + } + deref := objValue.Elem().Interface() + return IsEmpty(deref) + // for all other types, compare against the zero value + default: + zero := reflect.Zero(objValue.Type()) + return reflect.DeepEqual(object, zero.Interface()) + } +} diff --git a/src/util/testutil/requirements.go b/src/util/testutil/requirements.go new file mode 100644 index 00000000..59fb80bf --- /dev/null +++ b/src/util/testutil/requirements.go @@ -0,0 +1,17 @@ +package testutil + +// TestingT is an interface wrapper around *testing.T +type TestingT interface { + Errorf(format string, args ...interface{}) + FailNow() +} + +// THelper test type +type THelper interface { + Helper() +} + +// FailNower test type +type FailNower interface { + FailNow() +} diff --git a/src/util/textutil.go b/src/util/textutil.go index 50fac68f..d344ca9f 100644 --- a/src/util/textutil.go +++ b/src/util/textutil.go @@ -1,6 +1,11 @@ package util import ( + "bufio" + "bytes" + "fmt" + "strings" + "github.com/fibercrypto/fibercryptowallet/src/core" ) @@ -15,3 +20,68 @@ func ConstantPassword(pwdText string) core.PasswordReader { return pwdText, nil } } + +func MessageFromMsgAndArgs(msgAndArgs ...interface{}) string { + if len(msgAndArgs) == 0 || msgAndArgs == nil { + return "" + } + if len(msgAndArgs) == 1 { + msg := msgAndArgs[0] + if msgAsStr, ok := msg.(string); ok { + return msgAsStr + } + return fmt.Sprintf("%+v", msg) + } + if len(msgAndArgs) > 1 { + return fmt.Sprintf(msgAndArgs[0].(string), msgAndArgs[1:]...) + } + return "" +} + +// LabeledOutput key value tuple +type LabeledContent struct { + Label string + Content string +} + +// Aligns the provided message so that all lines after the first line start at the same location as the first line. +// Assumes that the first line starts at the correct location (after carriage return, tab, label, spacer and tab). +// The longestLabelLen parameter specifies the length of the longest label in the output (required becaues this is the +// basis on which the alignment occurs). +func IndentMessageLines(message string, longestLabelLen int) string { + outBuf := new(bytes.Buffer) + + for i, scanner := 0, bufio.NewScanner(strings.NewReader(message)); scanner.Scan(); i++ { + // no need to align first line because it starts at the correct location (after the label) + if i != 0 { + // append alignLen+1 spaces to align with "{{longestLabel}}:" before adding tab + _, _ = outBuf.WriteString("\n\t" + strings.Repeat(" ", longestLabelLen+1) + "\t") + } + _, _ = outBuf.WriteString(scanner.Text()) + } + + return outBuf.String() +} + +// LabeledOutput returns a string consisting of the provided labeledContent. Each labeled output is appended in the following manner: +// +// \t{{label}}:{{align_spaces}}\t{{content}}\n +// +// The initial carriage return is required to undo/erase any padding added by testing.T.Errorf. The "\t{{label}}:" is for the label. +// If a label is shorter than the longest label provided, padding spaces are added to make all the labels match in length. Once this +// alignment is achieved, "\t{{content}}\n" is added for the output. +// +// If the content of the labeledOutput contains line breaks, the subsequent lines are aligned so that they start at the same location as the first line. +func LabeledOutput(content ...LabeledContent) string { + longestLabel := 0 + for _, v := range content { + if len(v.Label) > longestLabel { + longestLabel = len(v.Label) + } + } + var output string + for _, v := range content { + output += "\t" + v.Label + ":" + strings.Repeat(" ", longestLabel-len(v.Label)) + "\t" + IndentMessageLines(v.Content, longestLabel) + "\n" + } + return output +} diff --git a/src/util/textutil_test.go b/src/util/textutil_test.go new file mode 100644 index 00000000..32c31516 --- /dev/null +++ b/src/util/textutil_test.go @@ -0,0 +1,105 @@ +package util + +import ( + "fmt" + "testing" + + "github.com/fibercrypto/fibercryptowallet/src/core" + + "github.com/fibercrypto/fibercryptowallet/src/coin/mocks" + "github.com/stretchr/testify/require" +) + +func TestPasswords(t *testing.T) { + tests := []struct { + name string + valid bool + pwd_generator core.PasswordReader + expected_pwd string + param string + }{ + { + name: "valid_empty1", + pwd_generator: EmptyPassword, + expected_pwd: "", + param: "pwd1", + }, + { + name: "valid_empty2", + pwd_generator: EmptyPassword, + expected_pwd: "", + param: "pwd2", + }, + { + name: "valid_constant1", + pwd_generator: ConstantPassword("pass_number"), + expected_pwd: "pass_number", + param: "pwd1", + }, + { + name: "valid_constant2", + pwd_generator: ConstantPassword("pass_number"), + expected_pwd: "pass_number", + param: "pwd2", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + pwd, err := tt.pwd_generator(tt.param, &mocks.KeyValueStore{}) + require.NoError(t, err) + require.Equal(t, tt.expected_pwd, pwd) + }) + } +} + +func TestMessageFromMsgAndArgs(t *testing.T) { + require.Equal(t, "", MessageFromMsgAndArgs()) + require.Equal(t, "5", MessageFromMsgAndArgs(5)) + require.Equal(t, "skycoin", MessageFromMsgAndArgs("skycoin")) + require.Equal(t, "hello world", MessageFromMsgAndArgs("%s %s", "hello", "world")) + + intFormat := "%d" + data := make([]interface{}, 0) + data = append(data, "") + expected, format := "", "" + for i := 0; i < 10; i++ { + expected += fmt.Sprintf(intFormat, i) + format += intFormat + data[0] = format + data = append(data, i) + require.Equal(t, expected, MessageFromMsgAndArgs(data...)) + } +} + +func TestIndentMessageLines(t *testing.T) { + s := "def factorial(n):\nif n <= 1:\n\t\treturn 1\nreturn n * factorial(n - 1)" + sFormated := "def factorial(n):\n\t\tif n <= 1:\n\t\t\t\treturn 1\n\t\treturn n * factorial(n - 1)" + require.Equal(t, sFormated, IndentMessageLines(s, -1)) + + s, sFormated = "firstLine\nsecondLine", "firstLine\n\t \tsecondLine" + require.Equal(t, sFormated, IndentMessageLines(s, 6)) +} + +func TestLabeledOutput(t *testing.T) { + method := LabeledContent{ + Label: "[method head]", + Content: "//this is the method's description and next line is it's declaration\nfunc foo(param1 type1, param2 type2) (returnType1) {", + } + body := LabeledContent{ + Label: "[body]", + Content: "\t...\n\t//some process\n\t...", + } + end := LabeledContent{ + Label: "[method end]", + Content: "}", + } + lines := []interface{}{ + "\t[method head]:\t//this is the method's description and next line is it's declaration\n", + "\t \tfunc foo(param1 type1, param2 type2) (returnType1) {\n", + "\t[body]: \t\t...\n", + "\t \t\t//some process\n", + "\t \t\t...\n", + "\t[method end]: \t}\n", + } + require.Equal(t, fmt.Sprintf("%s%s%s%s%s%s", lines...), LabeledOutput(method, body, end)) +} diff --git a/src/util/util.go b/src/util/util.go index a426c858..cceacda9 100644 --- a/src/util/util.go +++ b/src/util/util.go @@ -2,10 +2,11 @@ package util import ( "errors" + "strconv" + "github.com/fibercrypto/fibercryptowallet/src/core" local "github.com/fibercrypto/fibercryptowallet/src/main" "github.com/fibercrypto/fibercryptowallet/src/util/logging" - "strconv" ) var logUtil = logging.MustGetLogger("FiberCrypto util") @@ -24,7 +25,7 @@ func GetCoinValue(value string, ticker string) (uint64, error) { } coin, err2 := strconv.ParseFloat(value, 64) if err2 != nil { - return uint64(0), err + return uint64(0), err2 } return uint64(coin * float64(accuracy)), nil } @@ -32,9 +33,6 @@ func GetCoinValue(value string, ticker string) (uint64, error) { func FormatUint64(n uint64) string { in := strconv.FormatUint(n, 10) out := make([]byte, len(in)+(len(in)-2+int(in[0]/'0'))/3) - if in[0] == '-' { - in, out[0] = in[1:], '-' - } for i, j, k := len(in)-1, len(out)-1, 0; ; i, j = i-1, j-1 { out[j] = in[i] @@ -57,7 +55,7 @@ func FormatCoins(n uint64, quotient uint64) string { lenQ := len(strconv.FormatUint(quotient, 10)) - 1 nFormatted := FormatUint64(n / quotient) if lenQ > len(number) { - return nFormatted + return strconv.FormatFloat(float64(n)/float64(quotient), 'f', -1, 64) } reminder := number[len(number)-lenQ:] reminder = RemoveZeros(reminder) diff --git a/src/util/util_test.go b/src/util/util_test.go new file mode 100644 index 00000000..518dd27f --- /dev/null +++ b/src/util/util_test.go @@ -0,0 +1,191 @@ +package util + +import ( + "testing" + + "github.com/fibercrypto/fibercryptowallet/src/coin/mocks" + "github.com/fibercrypto/fibercryptowallet/src/core" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" +) + +func TestMin(t *testing.T) { + tests := []struct { + name string + a int + b int + min int + }{ + {name: "comparison1", a: 10, b: 5, min: 5}, + {name: "comparison2", a: 3, b: 8, min: 3}, + {name: "comparison3", a: 1000000, b: 5, min: 5}, + {name: "comparison4", a: 0, b: 1, min: 0}, + {name: "comparison5", a: 10, b: 10, min: 10}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + require.Equal(t, tt.min, Min(tt.a, tt.b)) + }) + } +} + +func TestFormatUint64(t *testing.T) { + tests := []struct { + name string + value uint64 + result string + }{ + {name: "format1", value: uint64(12345678), result: "12,345,678"}, + {name: "format2", value: uint64(15333), result: "15,333"}, + {name: "format3", value: uint64(1234), result: "1,234"}, + {name: "format4", value: uint64(10), result: "10"}, + {name: "format5", value: uint64(4242), result: "4,242"}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + require.Equal(t, tt.result, FormatUint64(tt.value)) + }) + } +} + +func TestFormatCoins(t *testing.T) { + tests := []struct { + name string + value uint64 + quotient uint64 + result string + }{ + {name: "format1", value: uint64(12345678), quotient: uint64(10), result: "1,234,567.8"}, + {name: "format2", value: uint64(1533300), result: "15,333", quotient: uint64(100)}, + {name: "format3", value: uint64(1234), result: "0.1234", quotient: uint64(10000)}, + {name: "format4", value: uint64(12340), result: "1.234", quotient: uint64(10000)}, + {name: "format5", value: uint64(421142), result: "4,211.42", quotient: uint64(100)}, + {name: "format6", value: uint64(0), result: "0", quotient: uint64(100)}, + {name: "format7", value: uint64(42), result: "0.0042", quotient: uint64(10000)}, + {name: "format8", value: uint64(1000), quotient: uint64(1000000), result: ("0.001")}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + require.Equal(t, tt.result, FormatCoins(tt.value, tt.quotient)) + }) + } +} + +func TestRemoveZeros(t *testing.T) { + tests := []struct { + name string + value string + result string + }{ + {name: "remove1", value: "10", result: "1"}, + {name: "remove2", value: "15.20", result: "15.2"}, + {name: "remove3", value: "42.0042", result: "42.0042"}, + {name: "remove4", value: "42.004200", result: "42.0042"}, + {name: "remove5", value: "42", result: "42"}, + {name: "remove6", value: "00000", result: ""}, + {name: "remove6", value: "00000.01", result: "00000.01"}, + {name: "remove7", value: "00000.00", result: "00000."}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + require.Equal(t, tt.result, RemoveZeros(tt.value)) + }) + } +} + +func TestStringInList(t *testing.T) { + tests := []struct { + name string + value string + list []string + result bool + }{ + {name: "search1", value: "10", list: []string{"a", "", "10"}, result: true}, + {name: "search2", value: "15.20", list: []string{"15.20", "15", "15.2", "15.202"}, result: true}, + {name: "search3", value: "ab", list: []string{"a15a", "bca", "ab", "mn"}, result: true}, + {name: "search4", value: "42.004200", list: []string{}, result: false}, + {name: "search5", value: "42", list: []string{"40"}, result: false}, + {name: "search6", value: "00000", list: []string{"00000", "00000"}, result: true}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + require.Equal(t, tt.result, StringInList(tt.value, tt.list)) + }) + } +} + +func TestGetCoinValue(t *testing.T) { + fakeTicker := "MOCKSCOIN" + fakeDesc := "Fake coin" + fakeExp := 3 + fakeMeta := core.AltcoinMetadata{ + Name: fakeDesc, + Ticker: fakeTicker, + Family: fakeTicker, + HasBip44: false, + Bip44CoinType: 0, + Accuracy: int32(fakeExp), + } + mockPlugin := new(mocks.AltcoinPlugin) + mockPlugin.On("RegisterTo", mock.Anything).Return().Run(func(args mock.Arguments) { + manager := args.Get(0).(core.AltcoinManager) + manager.RegisterAltcoin(fakeMeta, mockPlugin) + }) + mockPlugin.On("GetName").Return(fakeDesc) + RegisterAltcoin(mockPlugin) + + tests := []struct { + name string + value string + ticker string + valid bool + want uint64 + }{ + {name: "invalidGetCoinValue1", value: "10", ticker: "MYCOIN", valid: false, want: uint64(0)}, + {name: "invalidGetCoinValue2", value: "coin", ticker: fakeTicker, valid: false, want: uint64(0)}, + {name: "validGetCoinValue1", value: "10", ticker: fakeTicker, valid: true, want: uint64(10000)}, + {name: "validGetCoinValue2", value: "12.123456", ticker: fakeTicker, valid: true, want: uint64(12123)}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if tt.valid { + val, err := GetCoinValue(tt.value, tt.ticker) + require.Nil(t, err) + require.Equal(t, tt.want, val) + } else { + _, err := GetCoinValue(tt.value, tt.ticker) + require.NotNil(t, err) + } + }) + } +} + +func TestAddressFromString(t *testing.T) { + fakeTicker := "MOCKSCOIN" + fakeDesc := "Fake coin" + fakeExp := 3 + fakeMeta := core.AltcoinMetadata{ + Name: fakeDesc, + Ticker: fakeTicker, + Family: fakeTicker, + HasBip44: false, + Bip44CoinType: 0, + Accuracy: int32(fakeExp), + } + mockPlugin := new(mocks.AltcoinPlugin) + mockPlugin.On("RegisterTo", mock.Anything).Return().Run(func(args mock.Arguments) { + manager := args.Get(0).(core.AltcoinManager) + manager.RegisterAltcoin(fakeMeta, mockPlugin) + }) + mockPlugin.On("GetName").Return(fakeDesc) + strAddr, addr := "addr1", new(mocks.Address) + mockPlugin.On("AddressFromString", strAddr).Return(addr, nil) + RegisterAltcoin(mockPlugin) + + _, err := AddressFromString("someAddress", "someCoin") + require.NotNil(t, err) + + newAddr, err2 := AddressFromString(strAddr, fakeTicker) + require.Nil(t, err2) + require.Equal(t, addr, newAddr) +} diff --git a/src/util/wallet_test.go b/src/util/wallet_test.go new file mode 100644 index 00000000..808655ac --- /dev/null +++ b/src/util/wallet_test.go @@ -0,0 +1,25 @@ +package util + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/fibercrypto/fibercryptowallet/src/coin/mocks" +) + +func TestSimpleWalletAddress(t *testing.T) { + wllt, addr := &mocks.Wallet{}, &mocks.Address{} + wa := &SimpleWalletAddress{Wallet: wllt, UxOut: addr} + + require.Equal(t, wllt, wa.GetWallet()) + require.Equal(t, addr, wa.GetAddress()) +} + +func TestSimpleWalletOutput(t *testing.T) { + wllt, out := &mocks.Wallet{}, &mocks.TransactionOutput{} + wa := &SimpleWalletOutput{Wallet: wllt, UxOut: out} + + require.Equal(t, wllt, wa.GetWallet()) + require.Equal(t, out, wa.GetOutput()) +} diff --git a/vendor/github.com/NYTimes/gziphandler/.travis.yml b/vendor/github.com/NYTimes/gziphandler/.travis.yml deleted file mode 100644 index 94dfae36..00000000 --- a/vendor/github.com/NYTimes/gziphandler/.travis.yml +++ /dev/null @@ -1,10 +0,0 @@ -language: go -go: - - 1.x - - tip -env: - - GO111MODULE=on -install: - - go mod download -script: - - go test -race -v diff --git a/vendor/github.com/NYTimes/gziphandler/go.mod b/vendor/github.com/NYTimes/gziphandler/go.mod deleted file mode 100644 index 80190127..00000000 --- a/vendor/github.com/NYTimes/gziphandler/go.mod +++ /dev/null @@ -1,5 +0,0 @@ -module github.com/NYTimes/gziphandler - -go 1.11 - -require github.com/stretchr/testify v1.3.0 diff --git a/vendor/github.com/NYTimes/gziphandler/go.sum b/vendor/github.com/NYTimes/gziphandler/go.sum deleted file mode 100644 index 4347755a..00000000 --- a/vendor/github.com/NYTimes/gziphandler/go.sum +++ /dev/null @@ -1,7 +0,0 @@ -github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= diff --git a/vendor/github.com/SkycoinProject/skycoin b/vendor/github.com/SkycoinProject/skycoin deleted file mode 160000 index 66f5df58..00000000 --- a/vendor/github.com/SkycoinProject/skycoin +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 66f5df5849d339d403a475d523ebe7d1a4c92c31 diff --git a/vendor/github.com/SkycoinProject/skycoin/.dockerignore b/vendor/github.com/SkycoinProject/skycoin/.dockerignore new file mode 100644 index 00000000..fbb5916a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/.dockerignore @@ -0,0 +1,32 @@ +.DS_Store +.DS_Store? +._* +.Trashes +.vscode +.github +.dockerignore +.editorconfig +.gitignore +.golangci.yml +.travis.yml + +*.md +*.asc +*.class +*.dll +*.exe +*.o +*.so + + +Makefile +run-client.sh +run-daemon.sh +Gopkg.lock +Gopkg.toml + +**/node_modules/* +**/electron/* +**/ci-scripts/* +**/coverage/* + diff --git a/vendor/github.com/SkycoinProject/skycoin/.editorconfig b/vendor/github.com/SkycoinProject/skycoin/.editorconfig new file mode 100644 index 00000000..c48ee691 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/.editorconfig @@ -0,0 +1,32 @@ +# http://editorconfig.org +root = true + +[*] +indent_style = space +indent_size = 4 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +# Use 4 spaces for the Python files +[*.py] +indent_size = 4 +max_line_length = 80 + +# The JSON files contain newlines inconsistently +[*.json] +insert_final_newline = ignore + +# Minified JavaScript files shouldn't be changed +[**.min.js] +indent_style = ignore +insert_final_newline = ignore + +# Makefiles always use tabs for indentation +[Makefile] +indent_style = tab + +[*.md] +trim_trailing_whitespace = false + diff --git a/vendor/github.com/SkycoinProject/skycoin/.github/pull_request_template.md b/vendor/github.com/SkycoinProject/skycoin/.github/pull_request_template.md new file mode 100644 index 00000000..e9e1808e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/.github/pull_request_template.md @@ -0,0 +1,6 @@ +Fixes # + +Changes: +- + +Does this change need to mentioned in CHANGELOG.md? diff --git a/vendor/github.com/SkycoinProject/skycoin/.gitignore b/vendor/github.com/SkycoinProject/skycoin/.gitignore new file mode 100644 index 00000000..8bf4d113 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/.gitignore @@ -0,0 +1,160 @@ +# Compiled source # +################### +*.class +*.dll +*.exe +*.o +*.so + +sb + +build +data +pkg +bin +_obj + +main + +test_node + +*~ +client + +# Packages # +############ +# it's better to unpack these files and commit the raw source +# git has its own built in compression methods +*.7z +*.dmg +*.gz +*.iso +*.jar +*.rar +*.tar +*.zip + +# Logs and databases # +###################### +*.log +*.sql +*.sqlite + +# OS generated files # +###################### +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +Icon? +ehthumbs.db +Thumbs.db + +*.pyx +#build +*~ + +*.orig + +.cache +release +.bin + +.skycoin + +*.prof +*.out + +# Binaries +/skycoind +/skycoin +/skycoindev +/blockchain +/generate_cert +/address_gen +/skycoin-integration + +*.pem + +# Deprecated +_deprecated/ + +blockchain.bin +blockchain.sigs +master.keys +*.bak +benefactor-wallet.json +masterdata/ +.genv + +src/gui/static/dev +src/mesh/gui/static/dev + +npm-debug.log + +node_modules + +electron/release +electron/.cache +electron/.electron_cache +electron/node_modules +electron/.gox_output +electron/.electron_output +electron/.standalone_output +electron/.daemon_output +electron/.cli_output +# Do not ignore the icons folder +!electron/build +!electron/build/icons + +.vscode/ + +#File generation sublime text +.do.cfg +.do.state +skycoin.do + +*.swo +*.swp + +src/mesh/TODO + +.idea/ + +*.iml +*.test +coverage.html +coverage/ +*.coverage.out + +src/api/integration/wallets/ +src/api/integration/wallets/ + +# FIXME: see #1027 - Temporary solution to deal with generated file +include/libskycoin.h + +# Eclipse temp files +.cproject +.metadata/** +.project + +# Generated docs +docs/libc/latex +docs/libc/man +docs/libc/xml + + +# Do not ignore Docker Cloud build +!hooks/build + +*.prof +*.profile +*.cpuprofile +*.memprofile + +# cli fiberAddressGen default output +addresses.txt +seeds.csv + +histogram diff --git a/vendor/github.com/SkycoinProject/skycoin/.golangci.yml b/vendor/github.com/SkycoinProject/skycoin/.golangci.yml new file mode 100644 index 00000000..6ddd02f7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/.golangci.yml @@ -0,0 +1,204 @@ +# This file contains all available configuration options +# Modified for linting cmd/ and src/ + +# options for analysis running +run: + # default concurrency is a available CPU number + concurrency: 4 + + # timeout for analysis, e.g. 30s, 5m, default is 1m + deadline: 3m + + # exit code when at least one issue was found, default is 1 + issues-exit-code: 1 + + # include test files or not, default is true + tests: true + + # list of build tags, all linters use it. Default is empty list. + build-tags: + + # which dirs to skip: they won't be analyzed; + # can use regexp here: generated.*, regexp is applied on full path; + # default value is empty list, but next dirs are always skipped independently + # from this option's value: + # vendor$, third_party$, testdata$, examples$, Godeps$, builtin$ + skip-dirs: + + # which files to skip: they will be analyzed, but issues from them + # won't be reported. Default value is empty list, but there is + # no need to include all autogenerated files, we confidently recognize + # autogenerated files. If it's not please let us know. + skip-files: + + +# output configuration options +output: + # colored-line-number|line-number|json|tab|checkstyle, default is "colored-line-number" + format: colored-line-number + + # print lines of code with issue, default is true + print-issued-lines: true + + # print linter name in the end of issue text, default is true + print-linter-name: true + + +# all available settings of specific linters +linters-settings: + errcheck: + # report about not checking of errors in type assetions: `a := b.(MyStruct)`; + # default is false: such cases aren't reported by default. + check-type-assertions: false + + # report about assignment of errors to blank identifier: `num, _ := strconv.Atoi(numStr)`; + # default is false: such cases aren't reported by default. + check-blank: true + govet: + # report about shadowed variables + check-shadowing: true + + # Obtain type information from installed (to $GOPATH/pkg) package files: + # golangci-lint will execute `go install -i` and `go test -i` for analyzed packages + # before analyzing them. + # By default this option is disabled and govet gets type information by loader from source code. + # Loading from source code is slow, but it's done only once for all linters. + # Go-installing of packages first time is much slower than loading them from source code, + # therefore this option is disabled by default. + # But repeated installation is fast in go >= 1.10 because of build caching. + # Enable this option only if all conditions are met: + # 1. you use only "fast" linters (--fast e.g.): no program loading occurs + # 2. you use go >= 1.10 + # 3. you do repeated runs (false for CI) or cache $GOPATH/pkg or `go env GOCACHE` dir in CI. + use-installed-packages: false + golint: + # minimal confidence for issues, default is 0.8 + min-confidence: 0.8 + gofmt: + # simplify code: gofmt with `-s` option, true by default + simplify: true + gocyclo: + # minimal code complexity to report, 30 by default (but we recommend 10-20) + min-complexity: 10 + maligned: + # print struct with more effective memory layout or not, false by default + suggest-new: true + dupl: + # tokens count to trigger issue, 150 by default + threshold: 100 + goconst: + # minimal length of string constant, 3 by default + min-len: 3 + # minimal occurrences count to trigger, 3 by default + min-occurrences: 3 + depguard: + list-type: blacklist + include-go-root: false + packages: + - github.com/pkg/errors + misspell: + # Correct spellings using locale preferences for US or UK. + # Default is to use a neutral variety of English. + # Setting locale to US will correct the British spelling of 'colour' to 'color'. + locale: US + lll: + # max line length, lines longer will be reported. Default is 120. + # '\t' is counted as 1 character by default, and can be changed with the tab-width option + line-length: 120 + # tab width in spaces. Default to 1. + tab-width: 1 + unused: + # treat code as a program (not a library) and report unused exported identifiers; default is false. + # XXX: if you enable this setting, unused will report a lot of false-positives in text editors: + # if it's called for subdir of a project it can't find funcs usages. All text editor integrations + # with golangci-lint call it on a directory with the changed file. + check-exported: false + unparam: + # call graph construction algorithm (cha, rta). In general, use cha for libraries, + # and rta for programs with main packages. Default is cha. + algo: cha + + # Inspect exported functions, default is false. Set to true if no external program/library imports your code. + # XXX: if you enable this setting, unparam will report a lot of false-positives in text editors: + # if it's called for subdir of a project it can't find external interfaces. All text editor integrations + # with golangci-lint call it on a directory with the changed file. + check-exported: false + nakedret: + # make an issue if func has more lines of code than this setting and it has naked returns; default is 30 + max-func-lines: 30 + prealloc: + # XXX: we don't recommend using this linter before doing performance profiling. + # For most programs usage of prealloc will be a premature optimization. + + # Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them. + # True by default. + simple: true + range-loops: true # Report preallocation suggestions on range loops, true by default + for-loops: false # Report preallocation suggestions on for loops, false by default + goimports: + local-prefixes: github.com/SkycoinProject/skycoin + + +linters: + enable: + - golint + - goimports + - varcheck + - unparam + - deadcode + - structcheck + - errcheck + - gosimple + - staticcheck + - unused + - ineffassign + - typecheck + - gosec + - megacheck + - misspell + - nakedret + - depguard + enable-all: false + disable: + disable-all: true + presets: + fast: false + + +issues: + # List of regexps of issue texts to exclude, empty list by default. + # But independently from this option we use default exclude patterns, + # it can be disabled by `exclude-use-default: false`. To list all + # excluded by default patterns execute `golangci-lint run --help` + exclude: + - "G304: Potential file inclusion via variable" + - "G204: Subprocess launched with variable" + - "G104: Errors unhandled" + - Error return value of .((os\.)?std(out|err)\..*|.*Close|.*Flush|os\.Remove(All)?|.*printf?|os\.(Un)?Setenv). is not checked + # unparam warns that return value is always nil for functions that have an obligatory error return value but cannot produce an error + - .*result 0 \(error\) is always nil + + exclude-rules: + - path: src/cipher/bip39/wordlists/ + linters: + - misspell + + # Independently from option `exclude` we use default exclude patterns, + # it can be disabled by this option. To list all + # excluded by default patterns execute `golangci-lint run --help`. + # Default value for this option is true. + exclude-use-default: false + + # Maximum issues count per one linter. Set to 0 to disable. Default is 50. + max-per-linter: 0 + + # Maximum count of issues with the same text. Set to 0 to disable. Default is 3. + max-same: 0 + + # Show only new issues: if there are unstaged changes or untracked files, + # only those changes are analyzed, else only changes in HEAD~ are analyzed. + # It's a super-useful option for integration of golangci-lint into existing + # large codebase. It's not practical to fix all existing issues at the moment + # of integration: much better don't allow issues in new code. + # Default is false. + new: false diff --git a/vendor/github.com/SkycoinProject/skycoin/.travis.yml b/vendor/github.com/SkycoinProject/skycoin/.travis.yml new file mode 100644 index 00000000..b88f8f42 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/.travis.yml @@ -0,0 +1,87 @@ +sudo: required +dist: xenial +language: go +go: + - "1.11.x" + +matrix: + include: + - os: linux + env: VERSION_UPGRADE_TEST_WAIT_TIMEOUT=45s + services: + - xvfb + - os: osx + # Do not start osx build for PR + if: type != pull_request + osx_image: xcode8 + env: VERSION_UPGRADE_TEST_WAIT_TIMEOUT=60s + - os: windows + # Do not start windows build for PR + if: type != pull_request + env: + - GOX_OUTPUT='.gox_output' + +env: + global: + - ELECTRON_CACHE: $HOME/.cache/electron + - ELECTRON_BUILDER_CACHE: $HOME/.cache/electron-builder + - BUILD_DIR: build + - BUILDLIB_DIR: $BUILD_DIR/libskycoin + - LIB_DIR: lib + - BUILD_UI_TRAVIS_DIR: $HOME/.skycoin-ui-travis + +cache: + directories: + - electron/node_modules + - electron/src/node_modules + - $HOME/.cache/electron + - $HOME/.cache/electron-builder + - $HOME/.npm/_prebuilds +# - src/gui/static/node_modules + +addons: + chrome: stable + +before_install: + - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test && sudo apt-get update -qq; fi + +install: + # Install gox + - go get github.com/mitchellh/gox + # Install dependences for building wallet + - if [[ "$TRAVIS_OS_NAME" == "linux" && "$TRAVIS_PULL_REQUEST" == false ]]; then sudo apt-get install --no-install-recommends -y icnsutils graphicsmagick xz-utils libudev-dev libusb-1.0-0-dev; fi + - if [[ ! -d $GOPATH/src/github.com/SkycoinProject/skycoin ]]; then mkdir -p $GOPATH/src/github.com/SkycoinProject; ln -s $TRAVIS_BUILD_DIR $GOPATH/src/github.com/SkycoinProject/skycoin; fi + - cd $GOPATH/src/github.com/SkycoinProject/skycoin + - if [[ "$TRAVIS_OS_NAME" != "windows" ]]; then nvm install 8.11.0 && nvm use 8.11.0; fi + - if [[ "$TRAVIS_OS_NAME" != "windows" ]]; then make install-linters && make install-deps-ui; fi + - if [[ "$TRAVIS_OS_NAME" == "windows" ]]; then ./ci-scripts/install-nodejs-win.sh; fi + +before_script: + - if [[ "$TRAVIS_OS_NAME" == "osx" ]] && [[ "$TRAVIS_BRANCH" =~ ^(master|develop)$ || -n "$TRAVIS_TAG" ]]; then ./ci-scripts/add-key.sh; fi + # Source the ~/.bashrc to update the PATH for windows + - if [[ "$TRAVIS_OS_NAME" == "windows" ]]; then source $HOME/.bashrc; fi + +script: + - if [[ "$TRAVIS_OS_NAME" != "windows" ]]; then ./ci-scripts/lint-and-test.sh; fi + - if [[ "$TRAVIS_PULL_REQUEST" == false ]] && [[ "$TRAVIS_BRANCH" =~ ^(master|develop)$ || -n "$TRAVIS_TAG" ]]; then ./ci-scripts/build-wallet.sh; fi + +deploy: + provider: s3 + access_key_id: $AWS_ACCESS_KEY_ID + secret_access_key: $AWS_SECRET_ACCESS_KEY + bucket: $AWS_BUCKET + skip_cleanup: true + local_dir: electron/release + upload-dir: wallet + acl: public_read + region: $AWS_REGION + edge: true # opt in to dpl v2 + on: + repo: SkycoinProject/skycoin + tags: true + +notifications: + email: + - travis@skycoin.com + # https://github.com/kvld/travisci-telegram TravisCI Telegram Bot integration + webhooks: https://fathomless-fjord-24024.herokuapp.com/notify diff --git a/vendor/github.com/SkycoinProject/skycoin/CHANGELOG.md b/vendor/github.com/SkycoinProject/skycoin/CHANGELOG.md new file mode 100644 index 00000000..11c80c60 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/CHANGELOG.md @@ -0,0 +1,581 @@ +# Changelog +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) +and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). + +## [0.27.0] - 2019-11-26 + +### Added + +- Add `createRawTransactionV2` CLI command, which calls the API of `/wallet/transaction` to create the transaction and can create then unsigned transaction. Once the API's performance issue has been fixed, we will replace the `createRawTransaction` with it. +- Add `signTransaction` CLI command to sign transaction. +- Do windows electron builds by travis and abandon the appveyor +- Migrate `skycoin.net` to `skycoin.com` +- Migrate project path to `SkycoinProject/skycoin` +- Use transaction history when scanning wallet addresses, instead of the current address balance +- Document the daemon's CLI options +- Add the ability to save transaction notes +- Add CLI `encodeJsonTransaction` command to retrieve raw transaction given its JSON representation +- Add `package bip44`, implementing the bip44 spec https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki +- Codesign daemon and standalone binaries +- Add a guided method for entering the seeds in the GUI +- Add new wallet type `collection` for wallets that are an arbitrary collection of private keys, rather than generated from a seed +- Add new wallet type `bip44` for hierarchical deterministic (HD) wallets obeying the bip44 protocol. + The Skycoin bip44 `coin` number is `8000`. + `bip44` wallets avoid address reuse, generating a new change address for each transaction. + Affects APIs are `POST /api/v1/wallet`, `GET /api/v1/wallets`, `GET /api/v1/wallet`, `POST /api/v1/wallet/seed` and `POST /api/v1/wallet/recover`. + Refer to the [API documentation](./src/api/README.md) for API changes. + `bip44` wallets support bip39 "seed passphrases". + More details are explained in https://github.com/skycoin/skycoin/wiki/Wallet-File-Formats-and-Types +- `cli walletCreate` support for `bip44` wallets added +- Add `bip44_coin` field to `GET /api/v1/health` `fiber` params +- Add the "bulk send" option to the GUI advanced form +- Add `cli walletKeyExport` command to export `xpub`, `xprv`, `pub` and `prv` key from a `bip44` wallet +- Add `xpub` type wallet, which can generate addresses without exposing private keys +- Add `block_publisher` flag to `/api/v1/health` +- Add `no_broadcast` option to `POST /api/v1/injectTransaction` to disable broadcast of the transaction. The transaction will only be added to the local pool. +- Add `cli distributeGenesis` command to split the genesis block into distribution addresses when setting up a new fiber coin + +### Fixed + +- #7, #162, corrupted file in ~/.skycoin/data/ dir makes the desktop wallet show ERROR #1. +- #87, can not run web gui from skycoin docker image. +- #2287 A `Content-Type` with a `charset` specified, for example `application/json; charset=utf-8`, will not return an HTTP 415 error anymore +- Fix `fiber.toml` transaction verification parameters ignored by newcoin +- #2373 Fix and clean-up further panics with various `skycoin-cli` commands (lastBlocks, checkdb) which were not correctly handling arguments. +- #2442 Reset the "trusted" flag to false for all peers on load, before registering default hardcoded peers in the peerlist +- #26 Add additional database corruption checks in ResetCorruptDB to detect encoder ErrBufferUnderflow and ErrMaxLenExceeded + +### Changed + +- `type` is now a required parameter for `POST /api/v1/wallet`. `type` can be `deterministic`, `bip44` or `xpub`. +- Add `display_name`, `ticker`, `coin_hours_display_name`, `coin_hours_display_name_singular`, `coin_hours_ticker`, `explorer_url` to the `/health` endpoint response +- `cli addPrivateKey` will only work on a `collection` type wallet. Create one with `cli walletCreate -t collection` +- Don't print the wallet in the terminal after `cli encryptWallet` or `cli decryptWallet` +- Remove `WALLET_DIR` and `WALLET_NAME` envvars from the `cli` tool. Commands which need to operate on a wallet file accept the wallet file on the command line instead. +- Now the modal window for showing QR codes in the GUI allows to request specific amounts of coins, as in mobile wallets. This changes did no include the ability to read QR codes or URLs. + +### Removed + +- Remove `-arbitrating` option from the daemon CLI options +- Remove `-print-web-interface-address` option from the daemon CLI options +- Remove `cli walletDir` command + +## [0.26.0] - 2019-05-21 + +### Added + +- When sending coins in the UI, the user can choose to send in SKY, or the equivalent amount of SKY in USD +- Add the option for changing the language of the GUI. +- Add Spanish and Simplified Chinese language options +- Add genesis block hash in `INTR` message +- Add `bip32` package for preliminary HD wallet support +- Add CLI `checkDBDecoding` command to verify the `skyencoder`-generated binary decoders match the reflect-based decoder +- Add CLI `addresscount` command to return the count of addresses that currently have unspent outputs (coins) associated with them. +- Add `-max-inc-msg-len` and `-max-out-msg-len` options to control the size of incoming and outgoing wire messages +- Add `-disable-header-check` flag to disable Host/Origin/Referer header checks for the node APIs +- Add `header_check_enabled` parameter in the `/health` endpoint response +- Add `unsigned` option to `POST /api/v1/wallet/transaction` to create unsigned transactions from a wallet +- Add `unsigned` option to `POST /api/v2/transaction/verify` for verifying an unsigned transaction +- Add `POST /api/v2/wallet/transaction/sign` to sign an unsigned transaction with a wallet +- Add `POST /api/v2/transaction` to create an unsigned transaction from addresses or unspent outputs without a wallet +- Add `/api/v2/data` APIs for transaction notes and generic key-value storage. +- Update `/metrics` endpoint to add metrics from `/health`: `unspent_outputs`, `unconfirmed_txns`, `time_since_last_block_seconds`, `open_connections`, `outgoing_connections`, `incoming_connections`, `start_at`, `uptime_seconds`, `last_block_seq`. +- Add to the GUI the ability to choose specific unspent outputs to spend + +### Fixed + +- Return a v2-style error for disabled API endpoints +- #2172 Fix electron build failure for linux systems +- Don't send wire protocol messages that exceed the configured 256kB limit, which caused peers to disconnect from the sender +- #2348 Fix panic in `skycoin-cli` `transaction` command if no (zero) arguments are passed. Exactly one argument is expected. + +### Changed + +- Duplicate wallets in the wallets folder will prevent the application from starting +- An empty wallet in the wallets folder will prevent the application from starting +- Use [`skyencoder`](https://github.com/skycoin/skyencoder)-generated binary encoders/decoders for network and database data, instead of the reflect-based encoders/decoders in `cipher/encoder`. +- Add `/api/v1/resendUnconfirmedTxns` to the `WALLET` API set +- In `POST /api/v1/wallet/transaction`, moved `wallet` parameters to the top level of the object +- Incoming wire message size limit increased to 1024kB +- Clients restrict the maximum number of blocks they will send in a `GiveBlocksMessage` to 20 +- `POST /api/v2/wallet/seed/verify` returns an error if the seed's checksum is invalid +- Increase the detail of error messages for invalid seeds sent to `POST /api/v2/wallet/seed/verify` +- Move package `github.com/skycoin/skycoin/src/cipher/go-bip39` to `github.com/skycoin/skycoin/src/cipher/bip39` +- The `Content-Security-Policy` header was modified to make it stricter +- Update `INTR` message verify logic to reject connection if blockchain pubkey not matched or provided +- Change the coinhour burn rate to 10% + +### Removed + +- `/api/v1/explorer/address` endpoint (use `GET /api/v1/transactions?verbose=1` instead). See https://github.com/skycoin/skycoin/blob/develop/src/api/README.md#migrating-from--api-v1-explorer-address +- The unversioned REST API (the `-enable-unversioned-api` is removed, prefix your API requests with `/api/v1` if they don't have an `/api/vx` prefix already). See https://github.com/skycoin/skycoin/blob/develop/src/api/README.md#migrating-from-the-unversioned-api +- JSON-RPC 2.0 interface (this is no longer used by the CLI tool, and the REST API supports everything the JSON-RPC 2.0 API does). See https://github.com/skycoin/skycoin/blob/develop/src/api/README.md#migrating-from-the-jsonrpc-api +- `/api/v1/wallet/spend` endpoint (use `POST /api/v1/wallet/transaction` followed by `POST /api/v1/injectTransaction` instead). See https://github.com/skycoin/skycoin/blob/develop/src/api/README.md#migrating-from--api-v1-spend +- Remove shell autocomplete files + +## [0.25.1] - 2019-02-08 + +### Added + +- Add CLI `addressTransactions` command +- Add `/api/v2/wallet/seed/verify` to verify if seed is a valid bip39 mnemonic seed +- Filter transactions in the History view in the UI + +### Fixed + +- `/api/v1/health` will return correct build info when running Docker containers based on `skycoin/skycoin` mainnet image. +- #2083, Windows desktop wallet sometimes shows "Error#1" on start + +### Changed + +- Extend URI specification to allow plain addresses (i.e. without a `skycoin:` prefix) +- Switch `skycoin-cli` from `urfave/cli` to `spf13/cobra`. + Now all options of a cli command must only use `--` prefix instead of a mix of `--` and `-` prefixes. + `-` prefix is only allowed when using shorthand notation. +- Use an optimized `base58` library for faster address decoding and encoding. +- `/api/v1/injectTransaction` will return 400 error for invalid transactions. + +### Removed + +- Remove libskycoin source code. Migrated to https://github.com/skycoin/libskycoin + +## [0.25.0] - 2018-12-19 + +### Upcoming deprecated method removal notice + +In the v0.26.0 these features and functions will be removed. If you have a need for any of these features, let us know. + +- JSON-RPC 2.0 interface (this is no longer used by the CLI tool, and the REST API supports everything the JSON-RPC 2.0 API does). See https://github.com/skycoin/skycoin/blob/develop/src/api/README.md#migrating-from-the-jsonrpc-api +- `/api/v1/wallet/spend` endpoint (use `POST /api/v1/wallet/transaction` followed by `POST /api/v1/injectTransaction` instead). See https://github.com/skycoin/skycoin/blob/develop/src/api/README.md#migrating-from--api-v1-spend +- The unversioned REST API (the `-enable-unversioned-api` option will be removed, prefix your API requests with `/api/v1`). See https://github.com/skycoin/skycoin/blob/develop/src/api/README.md#migrating-from-the-unversioned-api +- `/api/v1/explorer/address` endpoint (use `GET /api/v1/transactions?verbose=1` instead). See https://github.com/skycoin/skycoin/blob/develop/src/api/README.md#migrating-from--api-v1-explorer-address + +### Notice + +Nodes v0.23.0 and earlier will not be able to connect to v0.25.0 due to a change in the introduction packet message. + +Nodes v0.24.1 and earlier will not be able to connect to v0.26.0 due to a similar change. + +Make sure to upgrade to v0.25.0 so that your node will continue to connect once v0.26.0 is released. + +### Added + +- Add `-csv` option to `cli send` and `cli createRawTransaction`, which will send coins to multiple addresses defined in a csv file +- Add `-disable-default-peers` option to disable the default hardcoded peers and mark all cached peers as untrusted +- Add `-custom-peers-file` to load peers from disk. This peers file is a newline separate list of `ip:port` strings +- Add `user_agent`, `coin`, `csrf_enabled`, `csp_enabled`, `wallet_api_enabled`, `unversioned_api_enabled`, `gui_enabled` and `json_rpc_enabled`, `coinhour_burn_factor` configuration settings and `started_at` timestamp to the `/api/v1/health` endpoint response +- Add `verbose` flag to `/api/v1/block`, `/api/v1/blocks`, `/api/v1/last_blocks`, `/api/v1/pendingTxs`, `/api/v1/transaction`, `/api/v1/transactions`, `/api/v1/wallet/transactions` to return verbose block data, which includes the address, coins, hours and calculcated_hours of the block's transaction's inputs +- Add `encoded` flag to `/api/v1/transaction` to return an encoded transaction +- Add `-http-prof-host` option to choose the HTTP profiler's bind hostname (defaults to `localhost:6060`) +- Add `-enable-api-sets`, `-disable-api-sets`, `-enable-all-api-sets` options to choose which sets of API endpoints to enable. Options are `READ`, `STATUS`, `TXN`, `WALLET`, `PROMETHEUS`, `INSECURE_WALLET_SEED`, `DEPRECATED_WALLET_SPEND`. Multiple values must be comma separated. +- `/api/v1/wallet/spend` is deprecated and requires `-enable-api-set=DEPRECATED_WALLET_SPEND` to enable it. Use `/api/v1/wallet/transaction` and `/api/v1/injectTransaction` instead. +- Add `-host-whitelist` option to specify alternate allowed hosts when communicating with the API bound to a localhost interface +- Add the head block header to the response of `GET /api/v1/outputs` +- Add `"ux_hash"` to block headers in API responses +- Database verification will only be performed once when upgrading to the next version. Verification will not be performed on subsequent upgrades unless necessary. To force verification, use `-verify-db=true`. Note that it is unsafe to downgrade the skycoin node without erasing the database first. +- Add `seqs` parameter to `/api/v1/blocks` to query multiple blocks by sequences +- Add `/api/v2/wallet/recover` to recover an encrypted wallet by providing the seed +- Add HTTP Basic Auth options `-web-interface-username` and `-web-interface-password`. Auth is only available when using `-web-interface-https` unless `-web-interface-plaintext-auth` is also used. +- Go application metrics exported at `/api/v2/metrics` (API set `PROMETHEUS`) in Prometheus format +- Add `/api/v2/wallet/recover` to recover an encrypted wallet by providing the seed +- Add `fiberAddressGen` CLI command to generate distribution addresses for fiber coins +- Coinhour burn factor when creating transactions can be configured at runtime with `USER_BURN_FACTOR` envvar +- Max transaction size when creating transactions can be configured at runtime with `USER_MAX_TXN_SIZE` envvar +- Max decimals allowed when creating transactions can be configured at runtime with `USER_MAX_DECIMALS` envvar +- Daemon configured builds will be available on the [releases](https://github.com/skycoin/skycoin/releases) page. The builds available for previous versions are configured for desktop client use. +- `skycoin-cli` builds will be available on the [releases](https://github.com/skycoin/skycoin/releases) page. +- A user agent string is sent in the wire protocol's introduction packet +- `-max-connections` option to control total max connections +- `/api/v1/network/disconnect` to disconnect a peer +- Complete support for `cipher` package in `libskycoin` C API. +- Add `coin`, `wallet`, `util/droplet` and `util/fee` methods as part of `libskycoin` C API +- Add `make update-golden-files` to `Makefile` +- Add CLI `richlist` command +- Add `util/droplet` and `util/fee` API's as part of `libskycoin` +- Implement SWIG interfaces in order to generate client libraries for multiple programming languages + +### Fixed + +- Fix hanging process caused when the p2p listener port is already in use +- Fix exit status of CLI tool when wallet file cannot be loaded +- Fix `calculated_hours` and `fee` in `/api/v1/explorer/address` responses +- Fix `calculated_hours` and `fee` in `/api/v2/transaction/verify` responses for confirmed transactions +- `/api/v1/blocks` and `/api/v1/last_blocks` return `500` instead of `400` on database errors +- `POST /api/v1/wallet` returns `500` instead of `400` for internal errors +- Fix unspent output hashes in the `cli decodeRawTransaction` result +- `POST /api/v1/wallet/newAddress` and `POST /api/v1/wallet/spend` will correctly fail if the wallet is not encrypted but a password is provided +- Return `503` error for `/api/v1/injectTransaction` for all message broadcast failures (note that it is still possible for broadcast to fail but no error to be returned, in certain conditions) +- Fixed autogenerated HTTPS certs. Certs are now self-signed ECDSA certs, valid for 10 years, valid for localhost and all public interfaces found on the machine. The default cert and key are renamed from cert.pem, key.pem to skycoind.cert, skycoind.key +- `/api/v1/resendUnconfirmedTxns` will return `503 Service Unavailable` is no connections are available for broadcast +- #1979, Fix header check to allow `localhost:6420` + +### Changed + +- Add blockchain pubkey in introduction message, it would close the connection if the pubkey is not matched, but would accept it if pubkey is not provided. +- CLI tool uses the REST API instead of the deprecated webrpc API to communicate with the node +- `cli status` return value is now the response from `GET /api/v1/health`, which changes some fields +- `/api/v1/network/` endpoints will return an empty array for array values instead of `null` +- `/api/v1/blocks` will return an empty array for `"blocks"` instead of `null` +- `/api/v1/blockchain/progress` will return an empty array for `"peers"` instead of `null` +- `go run cmd/skycoin/skycoin.go` will have exit status 1 on failure and exit status 2 on panic +- The deprecated JSON 2.0 RPC interface is disabled by default for all run modes, since it is no longer needed for the CLI tool +- Remove `"unknown"` from the `"status"` field in responses from `/api/v1/explorer/address`, `/api/v1/transaction`, `/api/v1/transactions` +- `cli decodeRawTransaction` output format changed, see the [CLI README](./src/cli/README.md) +- `/api/v1/wallet/spend` is deprecated, disabled by default and requires `-enable-api-sets=DEPRECATED_WALLET_SPEND` to enable it. Use `/api/v1/wallet/transaction` and `/api/v1/injectTransaction` instead. +- Invalid password in `/api/v1/wallet` requests now return `400` instead of `401` +- Replace `cmd/address_gen/` and `cmd/address_gen2` with `go run cmd/cli/cli.go addressGen` +- `cli addressGen` arguments have changed +- `cli generateWallet` renamed to `cli walletCreate` +- `cli generateAddresses` renamed to `cli walletAddAddresses` +- `/api/v1/explorer/address` is deprecated in favor of `/api/v1/transactions?verbose=1` +- `/api/v1/balance`, `/api/v1/transactions`, `/api/v1/outputs` and `/api/v1/blocks` accept the `POST` method so that large request bodies can be sent to the server, which would not fit in a `GET` query string +- Send new `DISC` disconnect packet to peer before disconnecting +- `/api/v1/health` `"open_connections"` value now includes incoming connections. Added `"outgoing_connections"` and `"incoming_connections"` fields to separate the two. +- `run.sh` is now `run-client.sh` and a new `run-daemon.sh` script is added for running in server daemon mode +- `/api/v1/network/connection*` connection object's field `"introduced"` replaced with field `"state"` which may have the values `"pending"`, `"connected"` or `"introduced"` +- `/api/v1/network/connection*` field `"is_trusted_peer"` added to connection object to indicate if the peer is in the hardcoded list of default peers +- `/api/v1/network/connection*` field `"connected_at"`, `"unconfirmed_burn_factor"` and `"unconfirmed_max_transaction_size"` added to connection object +- `/api/v1/network/connections` now includes incoming connections. Filters are added to query connections by state and direction +- `/api/v1/resendUnconfirmedTxns` is now a `POST` method, previously was a `GET` method +- Transactions that violation soft constraints will propagate through the network +- Node will send more peers before disconnecting due to a full peer list +- Refactor CSRF to use HMAC tokens. +- Add transaction verification parameters to the `GET /health` response + +### Removed + +- Remove `USE_CSRF` envvar from the CLI tool. It uses the REST API client now, which will automatically detect CSRF as needed, so no additional configuration is necessary. Operators may still wish to disable CSRF on their remote node to reduce request overhead. +- Remove `-enable-wallet-api` and `-enable-seed-api` in place of including `WALLET` and `INSECURE_WALLET_SEED` in `-enable-api-sets`. +- Copies of the source code removed from release builds due to build artifact size + +## [0.24.1] - 2018-07-30 + +### Added + +- Add Content-Security-Policy header to http responses + +### Fixed + +- Fix portable browser version opening to blank page + +### Changed + +- Increase visor db timeout to 5000 `ms` +- Change `InitTransaction` to accept parameters for distributing genesis coin to distribution wallets + +### Removed + +## [0.24.0] - 2018-07-06 + +### Added + +- Minimum go version is go1.10 +- Add environment variable `DATA_DIR` in CLI +- `USE_CSRF` environment variable for CLI, if the remote node has CSRF enabled (CSRF is enabled by default, use `-disable-csrf` to disable) +- `cli showConfig` command to echo the cli's configuration back to the user +- Option to generate 12/24 word seed when creating new wallet +- libskycoin 0.0.1 released with bindings for cipher/address, cipher/hash, cipher/crypto, cli/create_rawtx +- Add `-version` flag to show node version +- Add transaction verification step to "Send" page +- Add more details about transaction in transaction history +- Add advanced spend UI +- Add CLI `encryptWallet` command +- Add CLI `decryptWallet` command +- Add CLI `showSeed` command +- Add `password` argument to the CLI commands of `addPrivateKey`, `createRawTransaction`, `generateAddresses`, `generateWallet`, `send` +- Support for decoding map values in cipher binary encoder +- Expose known block height of peer in brand new `height` field added in responses of `GET /api/v1/network/connections` API endpoints +- `-verify-db` option (default true), will verify the database integrity during startup and exit if a problem is found +- `-reset-corrupt-db` option (default false) will verify the database integrity during startup and reset the db if a problem is found +- `GET /explorer/address`: add `fee` to transaction objects and `calculated_hours` to transaction inputs +- Test data generator and test suite for verification of alternative `cipher` implementations +- Begin `/api/v2` API endpoints. These endpoints are in beta and subject to change. +- Add `POST /api/v2/transaction/verify` API endpoint +- Add `POST /api/v2/address/verify` API endpoint +- Add `ignore_unconfirmed` option to `POST /api/v1/wallet/transaction` to allow transactions to be created or spent even if there are unspent outputs in the unconfirmed pool. +- Add `uxouts` to `POST /api/v1/wallet/transaction`, to allow specific unspent outputs to be used in a transaction. +- Add Dockerfile in docker/images/dev-cli to build a docker image suitable for development. +- Coin creator tool, `cmd/newcoin`, to quickly bootstrap a new fiber coin +- Add Dockerfile in `docker/images/dev-dind` to build a docker in docker image based on skycoindev-cli. + +### Fixed + +- Reduce connection disconnects, improves syncing +- Fix #1171, update CLI to support wallet encryption +- Use `bolt.Tx` correctly for read operations +- Docker images for `arm32v5` and `ar32v7` architectures by using busybox as base in docker/images/mainnet/Dockerfile and docker/images/mainnet/hooks/ + +### Changed + +- JSON 2.0 RPC interface (used by the CLI tool) is now served on the same host interface as the REST API, port `6420`. The additional listener has been removed. +- CLI's `RPC_ADDR` environment variable must now start with a scheme e.g. `http://127.0.0.1:6420`, previously it did not use a scheme. +- API response will be gzip compressed if client sends request with 'Accept-Encoding' contains 'gzip' in the header. +- `GET /api/v1/wallet/balance` and `GET /api/v1/balance` now return an address balance list as well. +- API endpoints are prefixed with `/api/v1/`. API endpoints without the `/api/v1/` prefix are deprecated but can be enabled with `-enable-unversioned-api`. Please migrate to use `/api/v1/` prefix in URLs. +- Enable message protocol upgrade +- `change_address` is no longer required in `POST /api/v1/wallet/transaction`. If not provided, `change_address` will default to one of the addresses being spent from. +- In `POST /api/v1/wallet/transaction`, for `auto` type `share` mode requests, if extra coinhours remain after applying the `share_factor` but change cannot be made due to insufficient coins, the `share_factor` will switch to `1.0`. +- Support automatic port allocation of the API interface by specifying port 0 +- The web interface / API port is randomly allocated for the precompiled standalone client and electron client released on the website. + If you are using the CLI tool or another API client to communicate with the standalone client, use `-web-interface-port=6420` to continue using port 6420. + If the program is run from source (e.g. `go run`, `run.sh`, `make run`) there is no change, the API will still be on port 6420. +- Change number of outgoing connections to 8 from 16 +- Transaction history shows transactions between own addresses +- Client will only maintain one connection to the default hardcoded peers, instead of all of them + +### Removed + +- Remove `-rpc-interface-addr`, `-rpc-interface-port` options. The RPC interface is now on default port `6420` with the REST API. +- Remove `-rpc-thread-num` option +- Remove `-connect-to` option +- Remove `-print-web-interface-address` option +- Remove support for go1.9 + +## [0.23.0] - 2018-04-22 + +### Added + +- Add wallet setup wizard +- Add wallet encryption, using chacha20+poly1305 for encryption and authentication and scrypt for key derivation. Encrypted data is stored in the wallet file in a `"secrets"` metadata field +- Add `GET /health` endpoint +- Add `POST /wallet/transaction` API endpoint, creates a transaction, allowing control of spending address and multiple destinations +- Add `POST /wallet/encrypt` API endpoint, encrypts wallet and returns encrypted wallet without sensitive data +- Add `POST /wallet/decrypt` API endpoint, decrypts wallet and returns decrypted wallet without sensitive data +- Add `POST /wallet/seed` API endpoint, returns the seed of an encrypted wallet. Unencrypted wallets will not expose their seeds over the API. Requires `-enable-seed-api` option +- `-enable-seed-api` option to enable `POST /wallet/seed` +- Add `"size"` to block API response data (affects `GET /block`, `GET /blocks` and `GET /last_blocks`) +- Write [specification for skycoin URIs](https://github.com/skycoin/skycoin#uri-specification) (based upon bip21) + +### Fixed + +- #1309, Float imprecision error in frontend malformed some spend amounts, preventing the spend +- Fix one aspect of sync stalling caused by a 5-second blocking channel write by switching it to a non-blocking write, decreasing timeouts and increasing buffer sizes + +### Changed + +- `GET /wallet` API endpoint, remove sensitive data from the response, and fix the data format to be the same as `POST /wallet/create` +- `GET /wallets` API endpoint, remove sensitive data from the response +- `POST /wallet/create` API endpoint, add `encrypt(bool)` and `password` argument +- `POST /wallet/newAddress` API endpoint, add `password` argument +- `POST /wallet/spend` API endpoint, add `password` argument +- Change `-disable-wallet-api` to `-enable-wallet-api`, and disable the wallet API by default +- `-launch-browser` is set to false by default +- A default wallet will not be created on startup if there is no wallet. Instead, the wallet setup wizard will run +- Replace [op/go-logging](https://github.com/op/go-logging) with [logrus](https://github.com/sirupsen/logrus) +- Disable JSON-RPC 2.0 interface when running the application with `run.sh` and electron +- Whitespace will be trimmed from the seed string by the frontend client before creating or loading a wallet +- Notify the user when their wallets have unconfirmed transactions +- Return an error when providing a transaction that spends to the null address in `POST /injectTransaction` +- Change accepted `-log-level` values to `debug`, `info`, `warn`, `error`, `fatal` and `panic` (previously were `debug`, `info`, `notice`, `warning`, `error` and `critical`) +- Default log level is `info` + +### Removed + +- Remove `"seed"`, `"lastSeed"` and `"secret_key"` in address entries from wallet API responses. A wallet's seed can be accessed through `POST /wallet/seed` only if the wallet is encrypted and the node is run with `-enable-seed-api` +- Remove unused `-logtogui` and `-logbufsize` options + +## [0.22.0] - 2018-03-20 + +### Added + +- go1.10 support +- Add Dockerfile +- Add libskycoin C API wrapper +- New wallet UI +- Notify the user when a new version is available +- CLI and GUI integration tests against a stable and live blockchain +- #877, Add `-disable-wallet-api` CLI option +- HTTP API client +- `/richlist` API method, returns top n address balances +- `/addresscount` API method, returns the number of addresses that have any amount of coins +- `/transactions` API method, returns transactions of addresses +- `/wallet/unload` API method, removes the wallet of given id from wallet services + +### Fixed + +- #1021, remove `SendOr404` and `SendOr500` as they do not work properly due to typed nils +- Add Read, Write and Idle timeouts to the HTTP listener, preventing file descriptor leaks +- Support absolute and relative paths for `-data-dir` option +- Prevent creating transactions whose size exceeds the maximum block size +- Check addition and multiplication uint64 overflow +- Keep trusted peers in the peerlist permanently, even if they are unreachable +- #885, Add `Host` header check to localhost HTTP interfaces to prevent DNS rebinding attacks +- #896, Add CSRF check to wallet API +- Fix base58 address parsing, which allowed leading invalid characters and treated unknown characters as a '1' +- Fix occasional error which causes blockchain progress not to be shown in front-end + +### Changed + +- #1080, `/wallet/transactions` now returns a proper json object with pending transactions under `transactions` key +- #951, cap cli createRawTransaction and send command coinhour distribution, coinhours are capped to a maximum of receiving coins for the address with a minimum of 1 coinhour +- Upgrade to Angular 5 +- Add `total_coinhour_supply` and `current_coinhour_supply` to `/coinSupply` endpoint +- #800, Add entropy parameter to `/wallet/newSeed` endpoint. Entropy can be 128 (default) or 256, corresponding to 12- and 24-word seeds respectively +- #866, Include coins and hours in `/explorer/address` inputs +- Rename cached `peers.txt` file to `peers.json` + +### Removed + +- Remove `/lastTxs` API endpoint +- Remove `/logs` and log buffering due to possible crash +- Remove `/wallets/reload` endpoint +- Remove deprecated `/api/getEffectiveOutputs`, use `/coinSupply`. + +## [0.21.1] - 2017-12-14 + +### Fixed + +- Fix blank page issue in windows gui wallet, which was caused by misusing the flag of -download-peers-list in electron. + +## [0.21.0] - 2017-12-10 + +### Added + +- Require transactions to have an input with non-zero coinhours +- Add `-peerlist-size` and `-max-outgoing-connections` CLI options +- Add `-download-peerlist` and `-peerlist-url` CLI options, to get peers from a URL +- For electron clients, download a list of peers from https://downloads.skycoin.com/blockchain/peers.txt by default + +### Fixed + +- Fix change hours calculation. Previous gave 1/8 to change and destination addresses; now gives 1/4 to each +- #653, the peerlist size was too small and could be easily filled up; default changed to 65535 from 1000 + +### Changed + +- CLI's `walletBalance` and `addressBalance` commands return aggregate balances for confirmed, spendable and expected balances. Coins are formatted as droplet strings. Hours added as strings. +- When splitting an odd number of hours in a spend, give the extra hour to the fee +- Add `block_seq` to `get_outputs` and `/outputs` API response +- Improve UxOut spend selection. Previously, they were spent oldest first. Now they are spent to ensure a non-zero coinhour input and otherwise minimize coinhours. +- `create_rawtx` will try to minimize the number of UxOuts used to create a transaction. +- `/wallet/spend` will try to maximize the number of UxOuts used to create a transaction. +- Update the default peerlist size to 65535 from 1000 +- When loading a wallet, 100 addresses will be scanned ahead to find one with a balance + +## [0.20.4] - 2017-11-22 + +### Added + +- Add `/logs` api to filter skycoin logs, so that we can add a debug panel to the GUI wallet to show logs + +## [0.20.3] - 2017-10-23 + +### Fixed + +- Fix block sync stall (mostly affected Windows users, but any OS was potentially affected) + +## [0.20.2] - 2017-10-12 + +### Fixed + +- Fixed Linux .AppImage missing "Category" field +- Clean up electron build script, switch to yarn and remove gulp + +## [0.20.1] - 2017-10-12 + +### Fixed + +- Fixed app icon padding + +## [0.20.0] - 2017-10-10 + +### Added + +- New wallet frontend in angular4. This is a complete rewrite and fixes many of the old wallet issues. +- New wallet has preliminary support for OTC functionality +- Create `webrpc.Client` for JSON-2.0 RPC calls. +- Add this CHANGELOG.md file. +- Add Installation.md file, with install instructions for go. +- Timelock distribution addresses. The first 25% of the distribution is spendable. After that 25% is spent, a timestamp will be added to the code to enable further distribution. +- Add `/coinSupply` endpoint. Correctly returns total, locked and unlocked coin amounts. +- `testutil` package for common test setup methods. +- `/version` endpoint, which will return the current node version number and the HEAD commit id when build the node +- `-no-ping-log` option to disable ping/pong log output +- Check for invalid block signatures during startup and recreate the database if they are corrupted. +- Add methods for converting fixed-point decimal strings to droplets and vice versa. +- Add `make run`, `make test`, `make lint`, `make check` to `Makefile` + +### Changed + +- Flag peers as incoming or outgoing. +- Refactor to decouple `wallet` and `visor` package. +- Refactor `cli` package for use as a library. +- `README` improvements. +- Set default wallet's label as "Your Wallet" +- Use BIP32 mnemomic seeds by default in `address_gen`. +- Add `-x` option to `address_gen`, to generate a random base64-encoded 128-bit seed instead of a BIP32 mnemomic seed. +- Add `-v` option to `address_gen` to print all address information (pubkey, seckey, address, seed) to stdout as JSON. +- All API and CLI methods with "coin"-related arguments must be a string and can use decimal notation to specify coin amounts. +- CLI's `walletHistory` command prints amounts as fixed-point decimal strings. Previously, it printed amounts as integers representing whole skycoin amounts, and did not support droplets / fractional skycoins. +- A user is prevented from broadcasting a new transaction with unspent outputs that they have already sent as an unconfirmed transaction. + +### Deprecated + +- `/api/getEffectiveOutputs` is deprecated in favor of `/coinSupply`. + +### Removed + +- Old wallet +- `/api/create-address` endpoint (use the `address_gen` tool) + +### Fixed + +- Wallet folder path loading. +- #371 Fix `/wallet/spend`, will return only when pending transaction is confirmed. +- #443 Fix predicted balance in `/wallet/spend` API call. +- #444 Fix bug in `/blockchain/progress` API call. +- Removed globals in `gui` package that caused race condition with wallet API calls. +- #494 Clean invalid unconfirmed transactions during startup. +- Various race conditions around the bolt.DB blockchain DB +- Missing `strand()` call in `daemon.Visor.AnnounceTxns`. + +### Security + +## [0.19.1] - 2017-08-26 + +### Fixed + +- #459 dist folder in repo out of date, wallet gui does not load + +## [0.19.0] - 2017-07-11 + +### Added + +- Add synchronize indicator when downloading blocks. +- #352 Store unspent pool in db for quick recovery when node restart +- Speed up the time the node start the browser +- Cache unspent pool in memory to speed up query action +- #411 Add button to hide seed +- #380 Move anything with heavy imports into util sub package + +### Fixed + +- #421 Sort wallet transaction history by time +- #398 Remove seeds from DOM +- #390 Make `go test ./src/...` work +- #383 Error during installation from skycoin source code +- #375 Node can't recovery from zero connections +- #376 Explorer api `/explorer/address` does not return spend transactions +- #373 Block publisher node will be closed if there're no transactions need to execute +- #360 Node will crash when do ctrl+c while downloading blocks +- #350 Wallet name always 'undefined' after loading wallet from seed + +[Unreleased]: https://github.com/skycoin/skycoin/compare/master...develop +[0.26.0]: https://github.com/skycoin/skycoin/compare/v0.25.1...v0.26.0 +[0.25.1]: https://github.com/skycoin/skycoin/compare/v0.25.0...v0.25.1 +[0.25.0]: https://github.com/skycoin/skycoin/compare/v0.24.1...v0.25.0 +[0.24.1]: https://github.com/skycoin/skycoin/compare/v0.24.0...v0.24.1 +[0.24.0]: https://github.com/skycoin/skycoin/compare/v0.23.0...v0.24.0 +[0.23.0]: https://github.com/skycoin/skycoin/compare/v0.22.0...v0.23.0 +[0.22.0]: https://github.com/skycoin/skycoin/compare/v0.21.1...v0.22.0 +[0.21.1]: https://github.com/skycoin/skycoin/compare/v0.21.0...v0.21.1 +[0.21.0]: https://github.com/skycoin/skycoin/compare/v0.20.4...v0.21.0 +[0.20.4]: https://github.com/skycoin/skycoin/compare/v0.20.3...v0.20.4 +[0.20.3]: https://github.com/skycoin/skycoin/compare/v0.20.2...v0.20.3 +[0.20.2]: https://github.com/skycoin/skycoin/compare/v0.20.1...v0.20.2 +[0.20.1]: https://github.com/skycoin/skycoin/compare/v0.20.0...v0.20.1 +[0.20.0]: https://github.com/skycoin/skycoin/compare/v0.19.1...v0.20.0 +[0.19.1]: https://github.com/skycoin/skycoin/compare/v0.19.0...v0.19.1 +[0.19.0]: https://github.com/skycoin/skycoin/commit/dd924e1f2de8fab945e05b3245dbeabf267f2910 diff --git a/vendor/github.com/SkycoinProject/skycoin/Gopkg.lock b/vendor/github.com/SkycoinProject/skycoin/Gopkg.lock new file mode 100644 index 00000000..ea05cca3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/Gopkg.lock @@ -0,0 +1,438 @@ +# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. + + +[[projects]] + digest = "1:0803645e1f57fb5271a6edc7570b9ea59bac2e5de67957075a43f3d74c8dbd97" + name = "github.com/NYTimes/gziphandler" + packages = ["."] + pruneopts = "UT" + revision = "2600fb119af974220d3916a5916d6e31176aac1b" + version = "v1.0.1" + +[[projects]] + branch = "master" + digest = "1:8a50c4460a24ce3cff0f50d094fa086db29119b4a0b58e70b87e922274526804" + name = "github.com/SkycoinProject/encodertest" + packages = ["."] + pruneopts = "UT" + revision = "14c2e31898b98265cc642f54d53f7280998e7208" + +[[projects]] + branch = "master" + digest = "1:86d119ee8a0fb122f2d0e0fbbbd5d2f65953029248743462ee3908a21ae04247" + name = "github.com/andreyvit/diff" + packages = ["."] + pruneopts = "UT" + revision = "c7f18ee00883bfd3b00e0a2bf7607827e0148ad4" + +[[projects]] + branch = "master" + digest = "1:d6afaeed1502aa28e80a4ed0981d570ad91b2579193404256ce672ed0a609e0d" + name = "github.com/beorn7/perks" + packages = ["quantile"] + pruneopts = "UT" + revision = "3a771d992973f24aa725d07868b467d1ddfceafb" + +[[projects]] + digest = "1:705c40022f5c03bf96ffeb6477858d88565064485a513abcd0f11a0911546cb6" + name = "github.com/blang/semver" + packages = ["."] + pruneopts = "UT" + revision = "2ee87856327ba09384cabd113bc6b5d174e9ec0f" + version = "v3.5.1" + +[[projects]] + digest = "1:0f98f59e9a2f4070d66f0c9c39561f68fcd1dc837b22a852d28d0003aebd1b1e" + name = "github.com/boltdb/bolt" + packages = ["."] + pruneopts = "UT" + revision = "2f1ce7a837dcb8da3ec595b1dac9d0632f0f99e8" + version = "v1.3.1" + +[[projects]] + digest = "1:4ba637038f22c9065994c0cd734118fc75e0c744f855fd3edbd3b923d1f41d44" + name = "github.com/cenkalti/backoff" + packages = ["."] + pruneopts = "UT" + revision = "61153c768f31ee5f130071d08fc82b85208528de" + version = "v1.1.0" + +[[projects]] + digest = "1:ffe9824d294da03b391f44e1ae8281281b4afc1bdaa9588c9097785e3af10cec" + name = "github.com/davecgh/go-spew" + packages = ["spew"] + pruneopts = "UT" + revision = "8991bc29aa16c548c550c7ff78260e27b9ab7c73" + version = "v1.1.1" + +[[projects]] + digest = "1:abeb38ade3f32a92943e5be54f55ed6d6e3b6602761d74b4aab4c9dd45c18abd" + name = "github.com/fsnotify/fsnotify" + packages = ["."] + pruneopts = "UT" + revision = "c2828203cd70a50dcccfb2761f8b1f8ceef9a8e9" + version = "v1.4.7" + +[[projects]] + digest = "1:97df918963298c287643883209a2c3f642e6593379f97ab400c2a2e219ab647d" + name = "github.com/golang/protobuf" + packages = ["proto"] + pruneopts = "UT" + revision = "aa810b61a9c79d51363740d207bb46cf8e620ed5" + version = "v1.2.0" + +[[projects]] + digest = "1:d2754cafcab0d22c13541618a8029a70a8959eb3525ff201fe971637e2274cd0" + name = "github.com/google/go-cmp" + packages = [ + "cmp", + "cmp/cmpopts", + "cmp/internal/diff", + "cmp/internal/function", + "cmp/internal/value", + ] + pruneopts = "UT" + revision = "3af367b6b30c263d47e8895973edcca9a49cf029" + version = "v0.2.0" + +[[projects]] + digest = "1:c0d19ab64b32ce9fe5cf4ddceba78d5bc9807f0016db6b1183599da3dcc24d10" + name = "github.com/hashicorp/hcl" + packages = [ + ".", + "hcl/ast", + "hcl/parser", + "hcl/printer", + "hcl/scanner", + "hcl/strconv", + "hcl/token", + "json/parser", + "json/scanner", + "json/token", + ] + pruneopts = "UT" + revision = "8cb6e5b959231cc1119e43259c4a608f9c51a241" + version = "v1.0.0" + +[[projects]] + digest = "1:870d441fe217b8e689d7949fef6e43efbc787e50f200cb1e70dbca9204a1d6be" + name = "github.com/inconshreveable/mousetrap" + packages = ["."] + pruneopts = "UT" + revision = "76626ae9c91c4f2a10f34cad8ce83ea42c93bb75" + version = "v1.0" + +[[projects]] + digest = "1:0a69a1c0db3591fcefb47f115b224592c8dfa4368b7ba9fae509d5e16cdc95c8" + name = "github.com/konsorten/go-windows-terminal-sequences" + packages = ["."] + pruneopts = "UT" + revision = "5c8c8bd35d3832f5d134ae1e1e375b69a4d25242" + version = "v1.0.1" + +[[projects]] + digest = "1:c568d7727aa262c32bdf8a3f7db83614f7af0ed661474b24588de635c20024c7" + name = "github.com/magiconair/properties" + packages = ["."] + pruneopts = "UT" + revision = "c2353362d570a7bfa228149c62842019201cfb71" + version = "v1.8.0" + +[[projects]] + digest = "1:c658e84ad3916da105a761660dcaeb01e63416c8ec7bc62256a9b411a05fcd67" + name = "github.com/mattn/go-colorable" + packages = ["."] + pruneopts = "UT" + revision = "167de6bfdfba052fa6b2d3664c8f5272e23c9072" + version = "v0.0.9" + +[[projects]] + digest = "1:0981502f9816113c9c8c4ac301583841855c8cf4da8c72f696b3ebedf6d0e4e5" + name = "github.com/mattn/go-isatty" + packages = ["."] + pruneopts = "UT" + revision = "6ca4dbf54d38eea1a992b3c722a76a5d1c4cb25c" + version = "v0.0.4" + +[[projects]] + digest = "1:ff5ebae34cfbf047d505ee150de27e60570e8c394b3b8fdbb720ff6ac71985fc" + name = "github.com/matttproud/golang_protobuf_extensions" + packages = ["pbutil"] + pruneopts = "UT" + revision = "c12348ce28de40eed0136aa2b644d0ee0650e56c" + version = "v1.0.1" + +[[projects]] + branch = "master" + digest = "1:2b32af4d2a529083275afc192d1067d8126b578c7a9613b26600e4df9c735155" + name = "github.com/mgutz/ansi" + packages = ["."] + pruneopts = "UT" + revision = "9520e82c474b0a04dd04f8a40959027271bab992" + +[[projects]] + digest = "1:53bc4cd4914cd7cd52139990d5170d6dc99067ae31c56530621b18b35fc30318" + name = "github.com/mitchellh/mapstructure" + packages = ["."] + pruneopts = "UT" + revision = "3536a929edddb9a5b34bd6861dc4a9647cb459fe" + version = "v1.1.2" + +[[projects]] + digest = "1:95741de3af260a92cc5c7f3f3061e85273f5a81b5db20d4bd68da74bd521675e" + name = "github.com/pelletier/go-toml" + packages = ["."] + pruneopts = "UT" + revision = "c01d1270ff3e442a8a57cddc1c92dc1138598194" + version = "v1.2.0" + +[[projects]] + digest = "1:0028cb19b2e4c3112225cd871870f2d9cf49b9b4276531f03438a88e94be86fe" + name = "github.com/pmezard/go-difflib" + packages = ["difflib"] + pruneopts = "UT" + revision = "792786c7400a136282c1664665ae0a8db921c6c2" + version = "v1.0.0" + +[[projects]] + digest = "1:d14a5f4bfecf017cb780bdde1b6483e5deb87e12c332544d2c430eda58734bcb" + name = "github.com/prometheus/client_golang" + packages = [ + "prometheus", + "prometheus/promhttp", + ] + pruneopts = "UT" + revision = "c5b7fccd204277076155f10851dad72b76a49317" + version = "v0.8.0" + +[[projects]] + branch = "master" + digest = "1:2d5cd61daa5565187e1d96bae64dbbc6080dacf741448e9629c64fd93203b0d4" + name = "github.com/prometheus/client_model" + packages = ["go"] + pruneopts = "UT" + revision = "5c3871d89910bfb32f5fcab2aa4b9ec68e65a99f" + +[[projects]] + branch = "master" + digest = "1:db712fde5d12d6cdbdf14b777f0c230f4ff5ab0be8e35b239fc319953ed577a4" + name = "github.com/prometheus/common" + packages = [ + "expfmt", + "internal/bitbucket.org/ww/goautoneg", + "model", + ] + pruneopts = "UT" + revision = "7e9e6cabbd393fc208072eedef99188d0ce788b6" + +[[projects]] + branch = "master" + digest = "1:ef74914912f99c79434d9c09658274678bc85080ebe3ab32bec3940ebce5e1fc" + name = "github.com/prometheus/procfs" + packages = [ + ".", + "internal/util", + "nfs", + "xfs", + ] + pruneopts = "UT" + revision = "185b4288413d2a0dd0806f78c90dde719829e5ae" + +[[projects]] + digest = "1:b0c25f00bad20d783d259af2af8666969e2fc343fa0dc9efe52936bbd67fb758" + name = "github.com/rs/cors" + packages = ["."] + pruneopts = "UT" + revision = "9a47f48565a795472d43519dd49aac781f3034fb" + version = "v1.6.0" + +[[projects]] + digest = "1:d917313f309bda80d27274d53985bc65651f81a5b66b820749ac7f8ef061fd04" + name = "github.com/sergi/go-diff" + packages = ["diffmatchpatch"] + pruneopts = "UT" + revision = "1744e2970ca51c86172c8190fadad617561ed6e7" + version = "v1.0.0" + +[[projects]] + digest = "1:81e02c4edb639c80559c0650f9401d3e2dcc3256d1fa215382bb7c83c1db9126" + name = "github.com/shopspring/decimal" + packages = ["."] + pruneopts = "UT" + revision = "cd690d0c9e2447b1ef2a129a6b7b49077da89b8e" + version = "1.1.0" + +[[projects]] + digest = "1:3f53e9e4dfbb664cd62940c9c4b65a2171c66acd0b7621a1a6b8e78513525a52" + name = "github.com/sirupsen/logrus" + packages = ["."] + pruneopts = "UT" + revision = "ad15b42461921f1fb3529b058c6786c6a45d5162" + version = "v1.1.1" + +[[projects]] + digest = "1:6a4a11ba764a56d2758899ec6f3848d24698d48442ebce85ee7a3f63284526cd" + name = "github.com/spf13/afero" + packages = [ + ".", + "mem", + ] + pruneopts = "UT" + revision = "d40851caa0d747393da1ffb28f7f9d8b4eeffebd" + version = "v1.1.2" + +[[projects]] + digest = "1:516e71bed754268937f57d4ecb190e01958452336fa73dbac880894164e91c1f" + name = "github.com/spf13/cast" + packages = ["."] + pruneopts = "UT" + revision = "8965335b8c7107321228e3e3702cab9832751bac" + version = "v1.2.0" + +[[projects]] + digest = "1:645cabccbb4fa8aab25a956cbcbdf6a6845ca736b2c64e197ca7cbb9d210b939" + name = "github.com/spf13/cobra" + packages = ["."] + pruneopts = "UT" + revision = "ef82de70bb3f60c65fb8eebacbb2d122ef517385" + version = "v0.0.3" + +[[projects]] + digest = "1:68ea4e23713989dc20b1bded5d9da2c5f9be14ff9885beef481848edd18c26cb" + name = "github.com/spf13/jwalterweatherman" + packages = ["."] + pruneopts = "UT" + revision = "4a4406e478ca629068e7768fc33f3f044173c0a6" + version = "v1.0.0" + +[[projects]] + digest = "1:c1b1102241e7f645bc8e0c22ae352e8f0dc6484b6cb4d132fa9f24174e0119e2" + name = "github.com/spf13/pflag" + packages = ["."] + pruneopts = "UT" + revision = "298182f68c66c05229eb03ac171abe6e309ee79a" + version = "v1.0.3" + +[[projects]] + digest = "1:214775c11fd26da94a100111a62daa25339198a4f9c57cb4aab352da889f5b93" + name = "github.com/spf13/viper" + packages = ["."] + pruneopts = "UT" + revision = "2c12c60302a5a0e62ee102ca9bc996277c2f64f5" + version = "v1.2.1" + +[[projects]] + digest = "1:ac83cf90d08b63ad5f7e020ef480d319ae890c208f8524622a2f3136e2686b02" + name = "github.com/stretchr/objx" + packages = ["."] + pruneopts = "UT" + revision = "477a77ecc69700c7cdeb1fa9e129548e1c1c393c" + version = "v0.1.1" + +[[projects]] + digest = "1:afa503f22c5464c93393d25b1c3b8743fe1a96ff0db2b99cbb2091214995bf4b" + name = "github.com/stretchr/testify" + packages = [ + "assert", + "mock", + "require", + ] + pruneopts = "UT" + revision = "2aa2c176b9dab406a6970f6a55f513e8a8c8b18f" + +[[projects]] + digest = "1:e1cd343b3883ced86b6873fe4d2f76799259fba3d1656df6ac0a7fa92644c049" + name = "github.com/toqueteos/webbrowser" + packages = ["."] + pruneopts = "UT" + revision = "3232c91b8ede8ca86e8962981d881af78875542f" + version = "v1.1.0" + +[[projects]] + digest = "1:b24d38b282bacf9791408a080f606370efa3d364e4b5fd9ba0f7b87786d3b679" + name = "github.com/urfave/cli" + packages = ["."] + pruneopts = "UT" + revision = "cfb38830724cc34fedffe9a2a29fb54fa9169cd1" + version = "v1.20.0" + +[[projects]] + branch = "master" + digest = "1:3f3a05ae0b95893d90b9b3b5afdb79a9b3d96e4e36e099d841ae602e4aca0da8" + name = "golang.org/x/crypto" + packages = ["ssh/terminal"] + pruneopts = "UT" + revision = "0c41d7ab0a0ee717d4590a44bcb987dfd9e183eb" + +[[projects]] + branch = "master" + digest = "1:76ee51c3f468493aff39dbacc401e8831fbb765104cbf613b89bef01cf4bad70" + name = "golang.org/x/net" + packages = ["context"] + pruneopts = "UT" + revision = "9b4f9f5ad5197c79fd623a3638e70d8b26cef344" + +[[projects]] + branch = "master" + digest = "1:899c684138eb2844811b7f97e264d3c65d533dbedc59549fa58fc2bf316f83a1" + name = "golang.org/x/sys" + packages = [ + "unix", + "windows", + ] + pruneopts = "UT" + revision = "44b849a8bc13eb42e95e6c6c5e360481b73ec710" + +[[projects]] + digest = "1:8029e9743749d4be5bc9f7d42ea1659471767860f0cdc34d37c3111bd308a295" + name = "golang.org/x/text" + packages = [ + "internal/gen", + "internal/triegen", + "internal/ucd", + "transform", + "unicode/cldr", + "unicode/norm", + ] + pruneopts = "UT" + revision = "f21a4dfb5e38f5895301dc265a8def02365cc3d0" + version = "v0.3.0" + +[[projects]] + digest = "1:342378ac4dcb378a5448dd723f0784ae519383532f5e70ade24132c4c8693202" + name = "gopkg.in/yaml.v2" + packages = ["."] + pruneopts = "UT" + revision = "5420a8b6744d3b0345ab293f6fcba19c978f1183" + version = "v2.2.1" + +[solve-meta] + analyzer-name = "dep" + analyzer-version = 1 + input-imports = [ + "github.com/NYTimes/gziphandler", + "github.com/SkycoinProject/encodertest", + "github.com/andreyvit/diff", + "github.com/blang/semver", + "github.com/boltdb/bolt", + "github.com/cenkalti/backoff", + "github.com/google/go-cmp/cmp", + "github.com/google/go-cmp/cmp/cmpopts", + "github.com/mgutz/ansi", + "github.com/prometheus/client_golang/prometheus", + "github.com/prometheus/client_golang/prometheus/promhttp", + "github.com/rs/cors", + "github.com/shopspring/decimal", + "github.com/sirupsen/logrus", + "github.com/spf13/cobra", + "github.com/spf13/pflag", + "github.com/spf13/viper", + "github.com/stretchr/testify/assert", + "github.com/stretchr/testify/mock", + "github.com/stretchr/testify/require", + "github.com/toqueteos/webbrowser", + "github.com/urfave/cli", + "golang.org/x/crypto/ssh/terminal", + ] + solver-name = "gps-cdcl" + solver-version = 1 diff --git a/vendor/github.com/SkycoinProject/skycoin/Gopkg.toml b/vendor/github.com/SkycoinProject/skycoin/Gopkg.toml new file mode 100644 index 00000000..cb1e605e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/Gopkg.toml @@ -0,0 +1,56 @@ + +# Gopkg.toml example +# +# Refer to https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md +# for detailed Gopkg.toml documentation. +# +# required = ["github.com/user/thing/cmd/thing"] +# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"] +# +# [[constraint]] +# name = "github.com/user/project" +# version = "1.0.0" +# +# [[constraint]] +# name = "github.com/user/project2" +# branch = "dev" +# source = "github.com/myfork/project2" +# +# [[override]] +# name = "github.com/x/y" +# version = "2.4.0" +[prune] + unused-packages = true + go-tests = true + +[[constraint]] + name = "github.com/boltdb/bolt" + version = "1.0.0" + +[[constraint]] + name = "github.com/toqueteos/webbrowser" + version = "1.0.0" + +[[constraint]] + name = "github.com/urfave/cli" + version = "1.19.1" + +[[constraint]] + name = "github.com/stretchr/testify" + revision = "2aa2c176b9dab406a6970f6a55f513e8a8c8b18f" + +[[constraint]] + name = "github.com/cenkalti/backoff" + version = "v1.1.0" + +[[constraint]] + name = "github.com/NYTimes/gziphandler" + version = "1.0.1" + +[[constraint]] + name = "github.com/prometheus/client_golang" + version = "0.8.0" + +[[constraint]] + name = "github.com/shopspring/decimal" + version = "1.1.0" diff --git a/vendor/github.com/SkycoinProject/skycoin/INSTALLATION.md b/vendor/github.com/SkycoinProject/skycoin/INSTALLATION.md new file mode 100644 index 00000000..2cc66a8f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/INSTALLATION.md @@ -0,0 +1,102 @@ +# Installing go + +Skycoin supports go1.10+. + +## For OSX +First you need to have `homebrew` installed, if you don't have it yet. + +```sh +/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" +``` + +Then, let's install go's latest version. + +```sh +brew install go +``` + +Lastly, let's install Mercurial and Bazaar + +```sh +brew install mercurial bzr +``` + +## For linux +We need to install linux dependencies on the correct distribution. + +#### Ubuntu and Debian +```sh +sudo apt-get update && sudo apt-get upgrade -y +sudo apt-get install -y curl git mercurial make binutils gcc bzr bison libgmp3-dev screen gcc build-essential +``` + +#### Centos and Fedora +```sh +sudo yum update -y && sudo yum upgrade -y +sudo yum install -y git curl make gcc mercurial binutils bzr bison screen +if [[ "$(cat /etc/redhat-release | grep -o CentOS)" == "CentOS" ]]; then sudo yum install -y build-essential libgmp3-dev; else sudo yum groupinstall -y "Development Tools" "Development Libraries" && sudo yum install -y gmp; fi; +``` +#### Archlinux +First update the system and ensure the dependancies are met +```sh +sudo pacman -Syy && sudo pacman -Syu +sudo pacman -S base-devel +``` + +Install the latest version of go on Archlinux with: +```sh +sudo pacman -S go +``` + +## Install Go manually +### Install Go + +Let's go to home directory and declare `go`'s version that you want to download. + +```sh +cd ~ +export GOV=1.11.1 # golang version +``` + +After that, let's download and uncompress golang source. + +```sh +curl -sS https://storage.googleapis.com/golang/go$GOV.linux-amd64.tar.gz > go$GOV.linux-amd64.tar.gz +tar xvf go$GOV.linux-amd64.tar.gz +rm go$GOV.linux-amd64.tar.gz +``` + +lastly, let's install `go`. + +```sh +sudo mv go /usr/local/go +sudo ln -s /usr/local/go/bin/go /usr/local/bin/go +sudo ln -s /usr/local/go/bin/godoc /usr/local/bin/godoc +sudo ln -s /usr/local/go/bin/gofmt /usr/local/bin/gofmt +``` + +Note: Find any golang source version at [Go Website](https://golang.org/dl/) + +### Setup your GOPATH +The $GOPATH environment variable specifies the location of your workspace. It defaults to a directory named `go` inside your home directory, so $HOME/go on Unix. + +Create your workspace directory with it's respective inner folders: + +```sh +mkdir -p $HOME/go +mkdir -p $HOME/go/bin +mkdir -p $HOME/go/src +mkdir -p $HOME/go/pkg +``` + +Setup $GOPATH variable, add it to ~/.bashrc. After editing, run `source ~/.bashrc` or open a new tab. + +```sh +export GOROOT=/usr/local/go +export GOPATH=$HOME/go +export GOBIN=$GOPATH/bin +export PATH=$PATH:$GOBIN +``` + +## Test your Go installation +Create and run the hello.go application described here: https://golang.org/doc/install#testing to check if your Go installation is working. diff --git a/vendor/github.com/SkycoinProject/skycoin/INTEGRATION.md b/vendor/github.com/SkycoinProject/skycoin/INTEGRATION.md new file mode 100644 index 00000000..38e0e325 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/INTEGRATION.md @@ -0,0 +1,349 @@ +# Skycoin Exchange Integration + +A Skycoin node offers a REST API on port 6420 (when running from source; if you are using the releases downloaded from the website, the port is randomized) + +A CLI tool is provided in `cmd/skycoin-cli/skycoin-cli.go`. This tool communicates over the REST API. + +The API interfaces do not support authentication or encryption so they should only be used over localhost. + +If your application is written in Go, you can use these client libraries to interface with the node: + +* [Skycoin REST API Client Godoc](https://godoc.org/github.com/SkycoinProject/skycoin/src/api#Client) +* [Skycoin CLI Godoc](https://godoc.org/github.com/SkycoinProject/skycoin/src/cli) + +*Note*: The CLI interface will be deprecated and replaced with a better one in the future. + +The wallet APIs in the REST API operate on wallets loaded from and saved to `~/.skycoin/wallets`. +Use the CLI tool to perform seed generation and transaction signing outside of the Skycoin node. + +The Skycoin node's wallet APIs can be enabled from the command line. +`-enable-all-api-sets` will enable all of the APIs which includes the wallet APIs, +or for more control it can specified in a list of API sets, e.g. `-enable-api-sets=READ,STATUS,WALLET`. +See the [REST API](src/api/README.md) for information on API sets. + +For a node used to support another application, +it is recommended to use the REST API for blockchain queries and disable the wallet APIs, +and to use the CLI tool for wallet operations (seed and address generation, transaction signing). + + + +- [Running the skycoin node](#running-the-skycoin-node) +- [API Documentation](#api-documentation) + - [Wallet REST API](#wallet-rest-api) + - [Skycoin command line interface](#skycoin-command-line-interface) + - [Skycoin REST API Client Documentation](#skycoin-rest-api-client-documentation) + - [Skycoin Go Library Documentation](#skycoin-go-library-documentation) + - [libskycoin Documentation](#libskycoin-documentation) +- [Implementation guidelines](#implementation-guidelines) + - [Scanning deposits](#scanning-deposits) + - [Using the CLI](#using-the-cli) + - [Using the REST API](#using-the-rest-api) + - [Using skycoin as a library in a Go application](#using-skycoin-as-a-library-in-a-go-application) + - [Sending coins](#sending-coins) + - [General principles](#general-principles) + - [Using the CLI](#using-the-cli-1) + - [Using the REST API](#using-the-rest-api-1) + - [Using skycoin as a library in a Go application](#using-skycoin-as-a-library-in-a-go-application-1) + - [Coinhours](#coinhours) + - [REST API](#rest-api) + - [CLI](#cli) + - [Verifying addresses](#verifying-addresses) + - [Using the CLI](#using-the-cli-2) + - [Using the REST API](#using-the-rest-api-2) + - [Using skycoin as a library in a Go application](#using-skycoin-as-a-library-in-a-go-application-2) + - [Using skycoin as a library in other applications](#using-skycoin-as-a-library-in-other-applications) + - [Checking Skycoin node connections](#checking-skycoin-node-connections) + - [Using the CLI](#using-the-cli-3) + - [Using the REST API](#using-the-rest-api-3) + - [Using skycoin as a library in a Go application](#using-skycoin-as-a-library-in-a-go-application-3) + - [Checking Skycoin node status](#checking-skycoin-node-status) + - [Using the CLI](#using-the-cli-4) + - [Using the REST API](#using-the-rest-api-4) + - [Using skycoin as a library in a Go application](#using-skycoin-as-a-library-in-a-go-application-4) +- [xpub wallets](#xpub-wallets) + - [Create a bip44 HD wallet](#create-a-bip44-hd-wallet) + - [Using the CLI](#using-the-cli-5) + - [Using the REST API](#using-the-rest-api-5) + - [Export an xpub key from a bip44 wallet](#export-an-xpub-key-from-a-bip44-wallet) + - [Using the CLI](#using-the-cli-6) + - [Using the REST API](#using-the-rest-api-6) + - [Create an xpub wallet](#create-an-xpub-wallet) + - [Using the CLI](#using-the-cli-7) + - [Using the REST API](#using-the-rest-api-7) + + + +## Running the skycoin node + +For integrations, the skycoin node should be run from source with `./run-daemon.sh`. This requires go1.10+ to be installed. + +## API Documentation + +### Wallet REST API + +[Wallet REST API](src/api/README.md). + +### Skycoin command line interface + +[CLI command API](cmd/skycoin-cli/README.md). + +### Skycoin REST API Client Documentation + +[Skycoin REST API Client](https://godoc.org/github.com/SkycoinProject/skycoin/src/api#Client) + +### Skycoin Go Library Documentation + +[Skycoin Godoc](https://godoc.org/github.com/SkycoinProject/skycoin) + +### libskycoin Documentation + +`libskycoin` provides a C library for Skycoin's cryptographic operations. +This allows python, ruby, C#, Java, etc applications to perform operations +such as transaction signing and address verification, without using the Skycoin daemon API +or calling the CLI tool from the shell. + +[libskycoin documentation](https://github.com/skycoin/libskycoin) + +## Implementation guidelines + +### Scanning deposits + +There are multiple approaches to scanning for deposits, depending on your implementation. + +One option is to watch for incoming blocks and check them for deposits made to a list of known deposit addresses. +Another option is to check the unspent outputs for a list of known deposit addresses. + +#### Using the CLI + +To scan the blockchain, use `skycoin-cli lastBlocks` or `skycoin-cli blocks`. These will return block data as JSON +and new unspent outputs sent to an address can be detected. + +To check address outputs, use `skycoin-cli addressOutputs`. If you only want the balance, you can use `skycoin-cli addressBalance`. + +#### Using the REST API + +To scan the blockchain, call `GET /api/v1/last_blocks?num=` or `GET /api/v1/blocks?start=&end=`. There will return block data as JSON +and new unspent outputs sent to an address can be detected. + +To check address outputs, call `GET /api/v1/outputs?addrs=`. If you only want the balance, you can call `GET /api/v1/balance?addrs=`. + +* [`GET /api/v1/last_blocks` docs](src/api/README.md#get-last-n-blocks) +* [`GET /api/v1/blocks` docs](src/api/README.md#get-blocks-in-specific-range) +* [`GET /api/v1/outputs` docs](src/api/README.md#get-unspent-output-set-of-address-or-hash) +* [`GET /api/v1/balance` docs](src/api/README.md#get-balance-of-addresses) + +#### Using skycoin as a library in a Go application + +We recommend using the [Skycoin REST API Client](https://godoc.org/github.com/SkycoinProject/skycoin/src/api#Client). + +### Sending coins + +#### General principles + +After each spend, wait for the transaction to confirm before trying to spend again. + +For higher throughput, combine multiple spends into one transaction. + +Skycoin uses "coin hours" to ratelimit transactions. +The total number of coinhours in a transaction's outputs must be 50% or less than the number of coinhours in a transaction's inputs, +or else the transaction is invalid and will not be accepted. A transaction must have at least 1 input with at least 1 coin hour. +Sending too many transactions in quick succession will use up all available coinhours. +Coinhours are earned at a rate of 1 coinhour per coin per hour, calculated per second. +This means that 3600 coins will earn 1 coinhour per second. +However, coinhours are only updated when a new block is published to the blockchain. +New blocks are published every 10 seconds, but only if there are pending transactions in the network. + +To avoid running out of coinhours in situations where the application may frequently send, +the sender should batch sends into a single transaction and send them on a +30 second to 1 minute interval. + +There are other strategies to minimize the likelihood of running out of coinhours, such +as splitting up balances into many unspent outputs and having a large balance which generates +coinhours quickly. + +#### Using the CLI + +When sending coins from the CLI tool, a wallet file local to the caller is used. +The CLI tool allows you to specify the wallet file on disk to use for operations. + +See [CLI command API](cmd/skycoin-cli/README.md) for documentation of the CLI interface. + +To perform a send, the preferred method follows these steps in a loop: + +* `skycoin-cli createRawTransaction $WALLET_FILE -m '[{"addr:"$addr1,"coins:"$coins1"}, ...]` - `-m` flag is send-to-many +* `skycoin-cli broadcastTransaction` - returns `txid` +* `skycoin-cli transaction $txid` - repeat this command until `"status"` is `"confirmed"` + +That is, create a raw transaction, broadcast it, and wait for it to confirm. + +#### Using the REST API + +The wallet APIs must be enabled with `-enable-api-sets=WALLET,READ`. + +Create a transaction with [POST /wallet/transaction](https://github.com/SkycoinProject/skycoin/blob/develop/src/api/README.md#create-transaction), +then inject it to the network with [POST /injectTransaction](https://github.com/SkycoinProject/skycoin/blob/develop/src/api/README.md#inject-raw-transaction). + +When using `POST /wallet/transaction`, a wallet file local to the skycoin node is used. +The wallet file is specified by wallet ID, and all wallet files are in the +configured data directory (which is `$HOME/.skycoin/wallets` by default). + +#### Using skycoin as a library in a Go application + +If your application is written in Go, you can interface with the CLI library +directly, see [Skycoin CLI Godoc](https://godoc.org/github.com/SkycoinProject/skycoin/src/cli). + +A REST API client is also available: [Skycoin REST API Client Godoc](https://godoc.org/github.com/SkycoinProject/skycoin/src/api#Client). + +#### Coinhours + +Transaction fees in skycoin is paid in coinhours and is currently set to `50%`, +every transaction created burns `50%` of the total coinhours in all the input +unspents. + +You need a minimum of `1` of coinhour to create a transaction. + +Coinhours are generated at a rate of `1 coinsecond` per `second` +which are then converted to `coinhours`, `1` coinhour = `3600` coinseconds. + +> Note: Coinhours don't have decimals and only show up in whole numbers. + +##### REST API + +When using the REST API, the coin hours sent to the destination and change can be controlled. +The 50% burn fee is still required. + +See the [POST /wallet/transaction](https://github.com/SkycoinProject/skycoin/blob/develop/src/api/README.md#create-transaction) +documentation for more information on how to control the coin hours. + +We recommend sending at least 1 coin hour to each destination, otherwise the receiver will have to +wait for another coin hour to accumulate before they can make another transaction. + +##### CLI + +When using the CLI the amount of coinhours sent to the receiver is capped to +the number of coins they receive with a minimum of `1` coinhour for transactions +with `<1` skycoin being sent. + +The coinhours left after burning `50%` and sending to receivers are sent to the change address. + +For eg. If an address has `10` skycoins and `50` coinhours and only `1` unspent. +If we send `5` skycoins to another address then that address will receive +`5` skycoins and `5` coinhours, `26` coinhours will be burned. +The sending address will be left with `5` skycoins and `19` coinhours which +will then be sent to the change address. + + +### Verifying addresses + +#### Using the CLI + +```sh +skycoin-cli verifyAddress $addr +``` + +#### Using the REST API + +Not directly supported, but API calls that have an address argument will return `400 Bad Request` if they receive an invalid address. + +#### Using skycoin as a library in a Go application + +https://godoc.org/github.com/SkycoinProject/skycoin/src/cipher#DecodeBase58Address + +```go +if _, err := cipher.DecodeBase58Address(address); err != nil { + fmt.Println("Invalid address:", err) + return +} +``` + +#### Using skycoin as a library in other applications + +Address validation is available through a C wrapper, `libskycoin`. + +See the [libskycoin documentation](/lib/cgo/README.md) for usage instructions. + +### Checking Skycoin node connections + +#### Using the CLI + +Not implemented + +#### Using the REST API + +* `GET /api/v1/network/connections` + +#### Using skycoin as a library in a Go application + +Use the [Skycoin REST API Client](https://godoc.org/github.com/SkycoinProject/skycoin/src/api#Client) + +### Checking Skycoin node status + +#### Using the CLI + +```sh +skycoin-cli status +``` + +#### Using the REST API + +A method similar to `skycoin-cli status` is not implemented, but these endpoints can be used: + +* `GET /api/v1/health` +* `GET /api/v1/version` +* `GET /api/v1/blockchain/metadata` +* `GET /api/v1/blockchain/progress` + +#### Using skycoin as a library in a Go application + +Use the [Skycoin CLI package](https://godoc.org/github.com/SkycoinProject/skycoin/src/cli) + +## xpub wallets + +You can create a wallet from an `xpub` key, which allows you to generate new +addresses without exposing secret keys. You can use any `xpub` key from an +existing Bitcoin or Ethereum HD wallet you may already have, or you can create +a new HD wallet in Skycoin. + +To create an xpub wallet from scratch: + +1. Create a bip44 wallet +2. Export an xpub key from the bip44 wallet +3. Create the xpub wallet + +If you already have an xpub key, you can skip to step 3. + +### Create a bip44 HD wallet + +#### Using the CLI + +```sh +skycoin-cli bip44-wallet.wlt -t bip44 +``` + +#### Using the REST API + +* `POST /api/v1/wallet/create` + +### Export an xpub key from a bip44 wallet + +#### Using the CLI + +```sh +skycoin-cli walletKeyExport bip44-wallet.wlt -k xpub --path "0/0" +``` + +#### Using the REST API + +Not possible + +### Create an xpub wallet + +#### Using the CLI + +```sh +skycoin-cli walletCreate xpub-wallet.wlt -t xpub --xpub $MY_XPUB_KEY +``` + +#### Using the REST API + +* `POST /api/v1/wallet/create` diff --git a/vendor/github.com/SkycoinProject/skycoin/Makefile b/vendor/github.com/SkycoinProject/skycoin/Makefile new file mode 100644 index 00000000..048ba278 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/Makefile @@ -0,0 +1,235 @@ +.DEFAULT_GOAL := help +.PHONY: run-client run-daemon run-help +.PHONY: test test-386 test-amd64 +.PHONY: check check-newcoin +.PHONY: run-integration-test-live +.PHONY: run-integration-test-live-disable-csrf +.PHONY: run-integration-test-live-disable-networking +.PHONY: run-integration-test-live-cover +.PHONY: run-integration-test-live-cover-disable-csrf +.PHONY: run-integration-test-live-cover-disable-networking +.PHONY: integration-tests-stable +.PHONY: integration-test-stable +.PHONY: integration-test-stable-disable-csrf +.PHONY: integration-test-stable-disable-wallet-api +.PHONY: integration-test-stable-enable-seed-api +.PHONY: integration-test-stable-disable-gui +.PHONY: integration-test-stable-db-no-unconfirmed +.PHONY: integration-test-stable-auth +.PHONY: integration-test-live integration-test-live-wallet +.PHONY: install-linters format release clean-release clean-coverage +.PHONY: install-deps-ui build-ui build-ui-travis help newcoin merge-coverage +.PHONY: generate update-golden-files +.PHONY: fuzz-base58 fuzz-encoder + +COIN ?= skycoin + +# Static files directory +GUI_STATIC_DIR = src/gui/static + +# Electron files directory +ELECTRON_DIR = electron + +# Platform specific checks +OSNAME = $(TRAVIS_OS_NAME) + +run-client: ## Run skycoin with desktop client configuration. To add arguments, do 'make ARGS="--foo" run'. + ./run-client.sh ${ARGS} + +run-daemon: ## Run skycoin with server daemon configuration. To add arguments, do 'make ARGS="--foo" run'. + ./run-daemon.sh ${ARGS} + +run-help: ## Show skycoin node help + @go run cmd/$(COIN)/$(COIN).go --help + +run-integration-test-live: ## Run the skycoin node configured for live integration tests + ./ci-scripts/run-live-integration-test-node.sh + +run-integration-test-live-disable-csrf: ## Run the skycoin node configured for live integration tests with CSRF disabled + ./ci-scripts/run-live-integration-test-node.sh -disable-csrf + +run-integration-test-live-disable-networking: ## Run the skycoin node configured for live integration tests with networking disabled + ./ci-scripts/run-live-integration-test-node.sh -disable-networking + +run-integration-test-live-cover: ## Run the skycoin node configured for live integration tests with coverage + ./ci-scripts/run-live-integration-test-node-cover.sh + +run-integration-test-live-cover-disable-csrf: ## Run the skycoin node configured for live integration tests with CSRF disabled and with coverage + ./ci-scripts/run-live-integration-test-node-cover.sh -disable-csrf + +run-integration-test-live-cover-disable-networking: ## Run the skycoin node configured for live integration tests with networking disabled and with coverage + ./ci-scripts/run-live-integration-test-node-cover.sh -disable-networking + +test: ## Run tests for Skycoin + @mkdir -p coverage/ + COIN=$(COIN) go test -coverpkg="github.com/$(COIN)/$(COIN)/..." -coverprofile=coverage/go-test-cmd.coverage.out -timeout=5m ./cmd/... + COIN=$(COIN) go test -coverpkg="github.com/$(COIN)/$(COIN)/..." -coverprofile=coverage/go-test-src.coverage.out -timeout=5m ./src/... + +test-386: ## Run tests for Skycoin with GOARCH=386 + GOARCH=386 COIN=$(COIN) go test ./cmd/... -timeout=5m + GOARCH=386 COIN=$(COIN) go test ./src/... -timeout=5m + +test-amd64: ## Run tests for Skycoin with GOARCH=amd64 + GOARCH=amd64 COIN=$(COIN) go test ./cmd/... -timeout=5m + GOARCH=amd64 COIN=$(COIN) go test ./src/... -timeout=5m + +lint: ## Run linters. Use make install-linters first. + vendorcheck ./... + golangci-lint run -c .golangci.yml ./... + @# The govet version in golangci-lint is out of date and has spurious warnings, run it separately + go vet -all ./... + +check-newcoin: newcoin ## Check that make newcoin succeeds and no templated files are changed. + @if [ "$(shell git diff ./cmd/skycoin/skycoin.go | wc -l | tr -d ' ')" != "0" ] ; then echo 'Changes detected after make newcoin' ; exit 2 ; fi + @if [ "$(shell git diff ./cmd/skycoin/skycoin_test.go | wc -l | tr -d ' ')" != "0" ] ; then echo 'Changes detected after make newcoin' ; exit 2 ; fi + @if [ "$(shell git diff ./src/params/params.go | wc -l | tr -d ' ')" != "0" ] ; then echo 'Changes detected after make newcoin' ; exit 2 ; fi + +check: lint clean-coverage test test-386 integration-tests-stable check-newcoin ## Run tests and linters + +integration-tests-stable: integration-test-stable \ + integration-test-stable-disable-csrf \ + integration-test-stable-disable-wallet-api \ + integration-test-stable-enable-seed-api \ + integration-test-stable-disable-gui \ + integration-test-stable-auth \ + integration-test-stable-db-no-unconfirmed ## Run all stable integration tests + +integration-test-stable: ## Run stable integration tests + COIN=$(COIN) ./ci-scripts/integration-test-stable.sh -c -x -n enable-csrf-header-check + +integration-test-stable-disable-header-check: ## Run stable integration tests with header check disabled + COIN=$(COIN) ./ci-scripts/integration-test-stable.sh -n disable-header-check + +integration-test-stable-disable-csrf: ## Run stable integration tests with CSRF disabled + COIN=$(COIN) ./ci-scripts/integration-test-stable.sh -n disable-csrf + +integration-test-stable-disable-wallet-api: ## Run disable wallet api integration tests + COIN=$(COIN) ./ci-scripts/integration-test-disable-wallet-api.sh + +integration-test-stable-enable-seed-api: ## Run enable seed api integration test + COIN=$(COIN) ./ci-scripts/integration-test-enable-seed-api.sh + +integration-test-stable-disable-gui: ## Run tests with the GUI disabled + COIN=$(COIN) ./ci-scripts/integration-test-disable-gui.sh + +integration-test-stable-db-no-unconfirmed: ## Run stable tests against the stable database that has no unconfirmed transactions + COIN=$(COIN) ./ci-scripts/integration-test-stable.sh -d -n no-unconfirmed + +integration-test-stable-auth: ## Run stable tests with HTTP Basic auth enabled + COIN=$(COIN) ./ci-scripts/integration-test-auth.sh + +integration-test-live: ## Run live integration tests + COIN=$(COIN) ./ci-scripts/integration-test-live.sh -c + +integration-test-live-wallet: ## Run live integration tests with wallet + COIN=$(COIN) ./ci-scripts/integration-test-live.sh -w + +integration-test-live-enable-header-check: ## Run live integration tests against a node with header check enabled + COIN=$(COIN) ./ci-scripts/integration-test-live.sh + +integration-test-live-disable-csrf: ## Run live integration tests against a node with CSRF disabled + COIN=$(COIN) ./ci-scripts/integration-test-live.sh + +integration-test-live-disable-networking: ## Run live integration tests against a node with networking disabled (requires wallet) + COIN=$(COIN) ./ci-scripts/integration-test-live.sh -c -k + +install-linters: ## Install linters + go get -u github.com/FiloSottile/vendorcheck + # For some reason this install method is not recommended, see https://github.com/golangci/golangci-lint#install + # However, they suggest `curl ... | bash` which we should not do + # go get -u github.com/golangci/golangci-lint/cmd/golangci-lint + # Change to use go get -u with version when go is v1.12+ + curl -sfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh| sh -s -- -b $(shell go env GOPATH)/bin v1.18.0 + +format: ## Formats the code. Must have goimports installed (use make install-linters). + goimports -w -local github.com/SkycoinProject/skycoin ./cmd + goimports -w -local github.com/SkycoinProject/skycoin ./src + +install-deps-ui: ## Install the UI dependencies + cd $(GUI_STATIC_DIR) && npm install + +lint-ui: ## Lint the UI code + cd $(GUI_STATIC_DIR) && npm run lint + +test-ui: ## Run UI tests + cd $(GUI_STATIC_DIR) && npm run test + +test-ui-e2e: ## Run UI e2e tests + ./ci-scripts/ui-e2e.sh + +build-ui: ## Builds the UI + cd $(GUI_STATIC_DIR) && npm run build + +build-ui-travis: ## Builds the UI for travis + cd $(GUI_STATIC_DIR) && npm run build-travis + +release: ## Build electron, standalone and daemon apps. Use osarch=${osarch} to specify the platform. Example: 'make release osarch=darwin/amd64', multiple platform can be supported in this way: 'make release osarch="darwin/amd64 windows/amd64"'. Supported architectures are: darwin/amd64 windows/amd64 windows/386 linux/amd64 linux/arm, the builds are located in electron/release folder. + cd $(ELECTRON_DIR) && ./build.sh ${osarch} + @echo release files are in the folder of electron/release + +release-standalone: ## Build standalone apps. Use osarch=${osarch} to specify the platform. Example: 'make release-standalone osarch=darwin/amd64' Supported architectures are the same as 'release' command. + cd $(ELECTRON_DIR) && ./build-standalone-release.sh ${osarch} + @echo release files are in the folder of electron/release + +release-electron: ## Build electron apps. Use osarch=${osarch} to specify the platform. Example: 'make release-electron osarch=darwin/amd64' Supported architectures are the same as 'release' command. + cd $(ELECTRON_DIR) && ./build-electron-release.sh ${osarch} + @echo release files are in the folder of electron/release + +release-daemon: ## Build daemon apps. Use osarch=${osarch} to specify the platform. Example: 'make release-daemon osarch=darwin/amd64' Supported architectures are the same as 'release' command. + cd $(ELECTRON_DIR) && ./build-daemon-release.sh ${osarch} + @echo release files are in the folder of electron/release + +release-cli: ## Build CLI apps. Use osarch=${osarch} to specify the platform. Example: 'make release-cli osarch=darwin/amd64' Supported architectures are the same as 'release' command. + cd $(ELECTRON_DIR) && ./build-cli-release.sh ${osarch} + @echo release files are in the folder of electron/release + +clean-release: ## Remove all electron build artifacts + rm -rf $(ELECTRON_DIR)/release + rm -rf $(ELECTRON_DIR)/.gox_output + rm -rf $(ELECTRON_DIR)/.daemon_output + rm -rf $(ELECTRON_DIR)/.cli_output + rm -rf $(ELECTRON_DIR)/.standalone_output + rm -rf $(ELECTRON_DIR)/.electron_output + +clean-coverage: ## Remove coverage output files + rm -rf ./coverage/ + +newcoin: ## Rebuild cmd/$COIN/$COIN.go file from the template. Call like "make newcoin COIN=foo". + go run cmd/newcoin/newcoin.go createcoin --coin $(COIN) + +generate: ## Generate test interface mocks and struct encoders + go generate ./src/... + # mockery can't generate the UnspentPooler mock in package visor, patch it + mv ./src/visor/blockdb/mock_unspent_pooler_test.go ./src/visor/mock_unspent_pooler_test.go + sed -i "" -e 's/package blockdb/package visor/g' ./src/visor/mock_unspent_pooler_test.go + sed -i "" -e 's/AddressHashes/blockdb.AddressHashes/g' ./src/visor/mock_unspent_pooler_test.go + goimports -w -local github.com/SkycoinProject/skycoin ./src/visor/mock_unspent_pooler_test.go + +install-generators: ## Install tools used by go generate + go get github.com/vektra/mockery/.../ + go get github.com/SkycoinProject/skyencoder/cmd/skyencoder + +update-golden-files: ## Run integration tests in update mode + ./ci-scripts/integration-test-stable.sh -u >/dev/null 2>&1 || true + ./ci-scripts/integration-test-stable.sh -c -x -u >/dev/null 2>&1 || true + ./ci-scripts/integration-test-stable.sh -d -u >/dev/null 2>&1 || true + ./ci-scripts/integration-test-stable.sh -c -x -d -u >/dev/null 2>&1 || true + +merge-coverage: ## Merge coverage files and create HTML coverage output. gocovmerge is required, install with `go get github.com/wadey/gocovmerge` + @echo "To install gocovmerge do:" + @echo "go get github.com/wadey/gocovmerge" + gocovmerge coverage/*.coverage.out > coverage/all-coverage.merged.out + go tool cover -html coverage/all-coverage.merged.out -o coverage/all-coverage.html + @echo "Total coverage HTML file generated at coverage/all-coverage.html" + @echo "Open coverage/all-coverage.html in your browser to view" + +fuzz-base58: ## Fuzz the base58 package. Requires https://github.com/dvyukov/go-fuzz + go-fuzz-build github.com/SkycoinProject/skycoin/src/cipher/base58/internal + go-fuzz -bin=base58fuzz-fuzz.zip -workdir=src/cipher/base58/internal + +fuzz-encoder: ## Fuzz the encoder package. Requires https://github.com/dvyukov/go-fuzz + go-fuzz-build github.com/SkycoinProject/skycoin/src/cipher/encoder/internal + go-fuzz -bin=encoderfuzz-fuzz.zip -workdir=src/cipher/encoder/internal + +help: + @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' diff --git a/vendor/github.com/SkycoinProject/skycoin/README.md b/vendor/github.com/SkycoinProject/skycoin/README.md new file mode 100644 index 00000000..2ae884dc --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/README.md @@ -0,0 +1,870 @@ +![skycoin logo](https://user-images.githubusercontent.com/26845312/32426705-d95cb988-c281-11e7-9463-a3fce8076a72.png) + +# Skycoin + +[![Build Status](https://travis-ci.com/SkycoinProject/skycoin.svg)](https://travis-ci.com/SkycoinProject/skycoin) +[![GoDoc](https://godoc.org/github.com/SkycoinProject/skycoin?status.svg)](https://godoc.org/github.com/SkycoinProject/skycoin) +[![Go Report Card](https://goreportcard.com/badge/github.com/SkycoinProject/skycoin)](https://goreportcard.com/report/github.com/SkycoinProject/skycoin) + +Skycoin is a next-generation cryptocurrency. + +Skycoin was written from scratch and designed over four years to realize the +ideal of Bitcoin and represents the apex of cryptocurrency design. +Skycoin is not designed to add features to Bitcoin, +but rather improves Bitcoin by increasing simplicity, +security and stripping out everything non-essential. + +Some people have hyped the Skycoin Project as leading into "Bitcoin 3.0". +The coin itself is not "Bitcoin 3.0", +but is rather "Bitcoin 1.0". Bitcoin is a prototype crypto-coin. +Skycoin was designed to be what Bitcoin would look like if it were built from +scratch, to remedy the rough edges in the Bitcoin design. + +- no duplicate coin-base outputs +- enforced checks for hash collisions +- simple deterministic wallets +- no transaction malleability +- no signature malleability +- removal of the scripting language +- CoinJoin and normal transactions are indistinguishable +- elimination of edge-cases that prevent independent node implementations +- <=10 second transaction times +- elimination of the need for mining to achieve blockchain consensus + +## Links + +* [skycoin.com](https://www.skycoin.com) +* [Skycoin Blog](https://www.skycoin.com/blog) +* [Skycoin Docs](https://www.skycoin.com/docs) +* [Skycoin Blockchain Explorer](https://explorer.skycoin.com) +* [Skycoin Development Telegram Channel](https://t.me/skycoindev) +* [Skycoin Github Wiki](https://github.com/SkycoinProject/skycoin/wiki) + +## Table of Contents + + + +- [Changelog](#changelog) +- [Installation](#installation) + - [Go 1.10+ Installation and Setup](#go-110-installation-and-setup) + - [Go get skycoin](#go-get-skycoin) + - [Run Skycoin from the command line](#run-skycoin-from-the-command-line) + - [Show Skycoin node options](#show-skycoin-node-options) + - [Run Skycoin with options](#run-skycoin-with-options) + - [Docker image](#docker-image) + - [Building your own images](#building-your-own-images) + - [Development image](#development-image) +- [API Documentation](#api-documentation) + - [REST API](#rest-api) + - [Skycoin command line interface](#skycoin-command-line-interface) +- [Integrating Skycoin with your application](#integrating-skycoin-with-your-application) +- [Contributing a node to the network](#contributing-a-node-to-the-network) +- [Creating a new coin](#creating-a-new-coin) +- [Daemon CLI Options](#daemon-cli-options) +- [URI Specification](#uri-specification) +- [Wire protocol user agent](#wire-protocol-user-agent) +- [Offline transaction signing](#offline-transaction-signing) +- [Deploy a public Skycoin API node with HTTPS](#deploy-a-public-skycoin-api-node-with-https) +- [Development](#development) + - [Modules](#modules) + - [Client libraries](#client-libraries) + - [Running Tests](#running-tests) + - [Running Integration Tests](#running-integration-tests) + - [Stable Integration Tests](#stable-integration-tests) + - [Live Integration Tests](#live-integration-tests) + - [Debugging Integration Tests](#debugging-integration-tests) + - [Update golden files in integration testdata](#update-golden-files-in-integration-testdata) + - [Test coverage](#test-coverage) + - [Test coverage for the live node](#test-coverage-for-the-live-node) + - [Formatting](#formatting) + - [Code Linting](#code-linting) + - [Profiling](#profiling) + - [Fuzzing](#fuzzing) + - [base58](#base58) + - [encoder](#encoder) + - [Dependencies](#dependencies) + - [Rules](#rules) + - [Management](#management) + - [Configuration Modes](#configuration-modes) + - [Development Desktop Client Mode](#development-desktop-client-mode) + - [Server Daemon Mode](#server-daemon-mode) + - [Electron Desktop Client Mode](#electron-desktop-client-mode) + - [Standalone Desktop Client Mode](#standalone-desktop-client-mode) + - [Wallet GUI Development](#wallet-gui-development) + - [Translations](#translations) + - [Releases](#releases) + - [Update the version](#update-the-version) + - [Pre-release testing](#pre-release-testing) + - [Creating release builds](#creating-release-builds) + - [Release signing](#release-signing) +- [Responsible Disclosure](#responsible-disclosure) + + + +## Changelog + +[CHANGELOG.md](CHANGELOG.md) + +## Installation + +Skycoin supports go1.10+. + +### Go 1.10+ Installation and Setup + +[Golang 1.10+ Installation/Setup](./INSTALLATION.md) + +### Go get skycoin + +```sh +$ go get github.com/SkycoinProject/skycoin/cmd/... +``` + +This will download `github.com/SkycoinProject/skycoin` to `$GOPATH/src/github.com/SkycoinProject/skycoin`. + +You can also clone the repo directly with `git clone https://github.com/SkycoinProject/skycoin`, +but it must be cloned to this path: `$GOPATH/src/github.com/SkycoinProject/skycoin`. + +### Run Skycoin from the command line + +```sh +$ cd $GOPATH/src/github.com/SkycoinProject/skycoin +$ make run-client +``` + +### Show Skycoin node options + +```sh +$ cd $GOPATH/src/github.com/SkycoinProject/skycoin +$ make run-help +``` + +### Run Skycoin with options + +Example: + +```sh +$ cd $GOPATH/src/github.com/SkycoinProject/skycoin +$ make ARGS="--launch-browser=false -data-dir=/custom/path" run +``` + +### Docker image + +This is the quickest way to start using Skycoin using Docker. + +```sh +$ docker volume create skycoin-data +$ docker volume create skycoin-wallet +$ docker run -ti --rm \ + -v skycoin-data:/data/.skycoin \ + -v skycoin-wallet:/wallet \ + -p 6000:6000 \ + -p 6420:6420 \ + SkycoinProject/skycoin +``` + +This image has a `skycoin` user for the skycoin daemon to run, with UID and GID 10000. +When you mount the volumes, the container will change their owner, so you +must be aware that if you are mounting an existing host folder any content you +have there will be own by 10000. + +The container will run with some default options, but you can change them +by just appending flags at the end of the `docker run` command. The following +example will show you the available options. + +```sh +$ docker run --rm SkycoinProject/skycoin -help +``` + +Access the dashboard: [http://localhost:6420](http://localhost:6420). + +Access the API: [http://localhost:6420/version](http://localhost:6420/version). + +### Building your own images + +[Building your own images](docker/images/mainnet/README.md). + +### Development image + +The [SkycoinProject/skycoindev-cli docker image](docker/images/dev-cli/README.md) is provided in order to make +easy to start developing Skycoin. It comes with the compiler, linters, debugger +and the vim editor among other tools. + +The [SkycoinProject/skycoindev-dind docker image](docker/images/dev-docker/README.md) comes with docker installed +and all tools available on `SkycoinProject/skycoindev-cli:develop` docker image. + +Also, the [SkycoinProject/skycoindev-vscode docker image](docker/images/dev-vscode/README.md) is provided +to facilitate the setup of the development process with [Visual Studio Code](https://code.visualstudio.com) +and useful tools included in `SkycoinProject/skycoindev-cli`. + +## API Documentation + +### REST API + +[REST API](src/api/README.md). + +### Skycoin command line interface + +[CLI command API](cmd/skycoin-cli/README.md). + +## Integrating Skycoin with your application + +[Skycoin Integration Documentation](INTEGRATION.md) + +## Contributing a node to the network + +Add your node's `ip:port` to the [peers.txt](peers.txt) file. +This file will be periodically uploaded to https://downloads.skycoin.com/blockchain/peers.txt +and used to seed client with peers. + +*Note*: Do not add Skywire nodes to `peers.txt`. +Only add Skycoin nodes with high uptime and a static IP address (such as a Skycoin node hosted on a VPS). + +## Creating a new coin + +See the [newcoin tool README](./cmd/newcoin/README.md) + +## Daemon CLI Options + +See the [Skycoin Daemon CLI options](./cmd/skycoin/README.md) + +## URI Specification + +Skycoin URIs obey the same rules as specified in Bitcoin's [BIP21](https://github.com/bitcoin/bips/blob/master/bip-0021.mediawiki). +They use the same fields, except with the addition of an optional `hours` parameter, specifying the coin hours. + +Example Skycoin URIs: + +* `skycoin:2hYbwYudg34AjkJJCRVRcMeqSWHUixjkfwY` +* `skycoin:2hYbwYudg34AjkJJCRVRcMeqSWHUixjkfwY?amount=123.456&hours=70` +* `skycoin:2hYbwYudg34AjkJJCRVRcMeqSWHUixjkfwY?amount=123.456&hours=70&label=friend&message=Birthday%20Gift` + +Additonally, if no `skycoin:` prefix is present when parsing, the string may be treated as an address: + +* `2hYbwYudg34AjkJJCRVRcMeqSWHUixjkfwY` + +However, do not use this URI in QR codes displayed to the user, because the address can't be disambiguated from other Skyfiber coins. + +## Wire protocol user agent + +[Wire protocol user agent description](https://github.com/SkycoinProject/skycoin/wiki/Wire-protocol-user-agent) + +## Offline transaction signing + +Before doing the offline transaction signing, we need to have the unsigned transaction created. Using the `skycoin-cli` tool to create an unsigned transaction in hot wallet, and copy the hex encoded transaction to the computer where the cold wallet is installed. Then use the `skycoin-cli` tool to sign it offline. + +### Create an unsigned transaction + +The `skycoin-cli` tool replys on the APIs of the `skycoin node`, hence we have to start the node before running the tool. + + Go to the project root and run: + +```bash +$ ./run-client.sh -launch-browser=false +``` + +Once the node is started, we could use the following command to create an unsigned transaction. + +```bash +$ skycoin-cli createRawTransactionV2 $WALLET_FILE $RECIPIENT_ADDRESS $AMOUNT --unsign +``` + +> Note: Don't forget the `--unsign` flag, otherwise it would try to sign the transaction. + +
+ View Output + +```json +b700000000e6b869f570e2bfebff1b4d7e7c9e86885dbc34d6de988da6ff998e7acd7e6e14010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000007531184ad0afeebbff2049b855e0921329cb1cb74d769ac57c057c9c8bd2b6810100000000ed5ea2ca4fe9b4560409b50c5bf7cb39b6c5ff6e50690f00000000000000000000000000 +``` + +
+ +Copy and save the generated transaction string. We will sign it with a cold wallet offline in the next section. + +### Sign the transaction + +The `skycoin node` needs to have the most recently `DB` so that the user would not lose much coin hours when signing the transaction. We could copy the full synchronized `data.db` from the hot wallet to the computer where the cold wallet is installed. And place it in `$HOME/.skycoin/data.db`. Then start the node with the network disabled. + +```bash +$ ./run-client.sh -launch-browser=false -disable-networking +``` + +Run the following command to sign the transaction: + +```bash +$ skycoin-cli signTransaction $RAW_TRANSACTION +``` + +The `$RAW_TRANSACTION` is the transaction string that we generated in the hot wallet. + +If the cold wallet is encrypted, you will be prompted to enter the password to sign the transaction. + +
+ View Output + +```json +b700000000e6b869f570e2bfebff1b4d7e7c9e86885dbc34d6de988da6ff998e7acd7e6e14010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000007531184ad0afeebbff2049b855e0921329cb1cb74d769ac57c057c9c8bd2b6810100000000ed5ea2ca4fe9b4560409b50c5bf7cb39b6c5ff6e50690f00000000000000000000000000 +``` + +
+ +Once the transaction is signed, we could copy and save the signed transaction string and broadcast it in the hot wallet. + +```bash +$ skycoin-cli broadcastTransaction $SIGNED_RAW_TRANSACTION +``` + +A transaction id would be returned and you can check it in the [explorer](https://explorer.skycoin.com). + +## Deploy a public Skycoin API node with HTTPS + +We recommend using [caddy server](https://caddyserver.com/) to deploy a public Skycoin API node on a +Linux server. The public API node should have the `HTTPS` support, which could be handled automatically +by the `caddy server`. But we need to have a domain and create a DNS record to bind the server ip address +to it. + +Suppose we're going to deploy a Skycoin API node on `apitest.skycoin.com`, and we have already bound +the server's IP to it. Follow the steps below to complete the deployment. + +### Install and run a skycoin api node + +```bash +# Create a skycoin folder so that the files could be isolated +$ mkdir $HOME/skycoin && cd $HOME/skycoin +# Download the skycoin binary file +$ wget https://downloads.skycoin.com/wallet/skycoin-0.26.0-gui-standalone-linux-x64.tar.gz +$ tar -zxvf skycoin-0.26.0-gui-standalone-linux-x64.tar.gz +$ cd skycoin-0.26.0-gui-standalone-linux-x64 +$ ./skycoin -web-interface-port=6420 -host-whitelist=$DOMAIN_NAME -enable-api-sets="READ,TXN" +``` + +> Note: we should running the `skycoin` node with `-host-whitelist` flag, otherwise it would +> throw `403 Forbidden` error. + +### Install the caddy server + +```bash +# Create a caddy folder +$ mkdir $HOME/caddy && cd $HOME/caddy +# Download the caddy server binary file +$ wget https://github.com/caddyserver/caddy/releases/download/v1.0.4/caddy_v1.0.4_linux_amd64.tar.gz +$ tar -zxvf caddy_v1.0.4_linux_amd64.tar.gz +$ cd caddy_v1.0.4_linux_amd64 +``` + +The `caddy` tool would be exist in the folder, let's create a `Caddyfile` to define the reverse proxy +rules now. + +```bash +cat <Caddyfile +apitest.skycoin.com { + proxy / localhost:6420 { + transparent + } +} +EOF +``` + +Then run the caddy server + +```bash +$ ./caddy +``` + +You will be prompted to enter an email address to receive the notifications from let's Encrypt. +That's all about the deployment, check the https://apitest.skycoin.com/api/v1/version to see if +the Skycoin API node is working correctly. + +## Development + +We have two branches: `master` and `develop`. + +`develop` is the default branch and will have the latest code. + +`master` will always be equal to the current stable release on the website, and should correspond with the latest release tag. + +### Modules + +* `api` - REST API interface +* `cipher` - cryptographic library (key generation, addresses, hashes) +* `cipher/base58` - Base58 encoding +* `cipher/encoder` - reflect-based deterministic runtime binary encoder +* `cipher/encrypt` - at-rest data encryption (chacha20poly1305+scrypt) +* `cipher/go-bip39` - BIP-39 seed generation +* `cli` - CLI library +* `coin` - blockchain data structures (blocks, transactions, unspent outputs) +* `daemon` - top-level application manager, combining all components (networking, database, wallets) +* `daemon/gnet` - networking library +* `daemon/pex` - peer management +* `params` - configurable transaction verification parameters +* `readable` - JSON-encodable representations of internal structures +* `skycoin` - core application initialization and configuration +* `testutil` - testing utility methods +* `transaction` - methods for creating transactions +* `util` - miscellaneous utilities +* `visor` - top-level blockchain database layer +* `visor/blockdb` - low-level blockchain database layer +* `visor/historydb` - low-level blockchain database layer for historical blockchain metadata +* `wallet` - wallet file management + +### Client libraries + +Skycoin implements client libraries which export core functionality for usage from +other programming languages. + +* [libskycoin C client library and SWIG interface](https://github.com/skycoin/libskycoin) +* [skycoin-lite: Javascript and mobile bindings](https://github.com/SkycoinProject/skycoin-lite) + +### Running Tests + +```sh +$ make test +``` + +### Running Integration Tests + +There are integration tests for the CLI and HTTP API interfaces. They have two +run modes, "stable" and "live". + +The stable integration tests will use a skycoin daemon +whose blockchain is synced to a specific point and has networking disabled so that the internal +state does not change. + +The live integration tests should be run against a synced or syncing node with networking enabled. + +#### Stable Integration Tests + +```sh +$ make integration-test-stable +``` + +or + +```sh +$ ./ci-scripts/integration-test-stable.sh -v -w +``` + +The `-w` option, run wallet integrations tests. + +The `-v` option, show verbose logs. + +#### Live Integration Tests + +The live integration tests run against a live runnning skycoin node, so before running the test, we +need to start a skycoin node: + +```sh +$ ./run-daemon.sh +``` + +After the skycoin node is up, run the following command to start the live tests: + +```sh +$ make integration-test-live +``` + +The above command will run all tests except the wallet-related tests. To run wallet tests, we +need to manually specify a wallet file, and it must have at least `2 coins` and `256 coinhours`, +it also must have been loaded by the node. + +We can specify the wallet by setting two environment variables: + +* `API_WALLET_ID`, which is the filename (without path), that is loaded by the daemon to test against. + This is the `"id"` field in API requests. It is used by the API integration tests. + The wallet directory that the daemon uses can be controlled with the `-wallet-dir` option. +* `CLI_WALLET_FILE`, which is the filename (with path), to be used by the CLI integration tests + +If the wallet is encrypted, also set `WALLET_PASSWORD`. + +Example of running the daemon with settings for integration tests: + +```sh +$ export API_WALLET_ID="$valid_wallet_filename" +$ export CLI_WALLET_FILE="$HOME/.skycoin/wallets/$valid_wallet_filename" +$ export WALLET_PASSWORD="$wallet_password" +$ make run-integration-test-live +``` + +Then run the tests with the following command: + +```sh +$ make integration-test-live-wallet +``` + +There are two other live integration test modes for CSRF disabled and networking disabled. + +To run the CSRF disabled tests: + +```sh +$ export API_WALLET_ID="$valid_wallet_filename" +$ export CLI_WALLET_FILE="$HOME/.skycoin/wallets/$valid_wallet_filename" +$ export WALLET_PASSWORD="$wallet_password" +$ make run-integration-test-live-disable-csrf +``` + +```sh +$ make integration-test-live-disable-csrf +``` + +To run the networking disabled tests, which require a live wallet: + +```sh +$ export API_WALLET_ID="$valid_wallet_filename" +$ export CLI_WALLET_FILE="$HOME/.skycoin/wallets/$valid_wallet_filename" +$ export WALLET_PASSWORD="$wallet_password" +$ make run-integration-test-live-disable-networking +``` + +Then run the tests with the following command: + +```sh +$ make integration-test-live-wallet +``` + +#### Debugging Integration Tests + +Run specific test case: + +It's annoying and a waste of time to run all tests to see if the test we real care +is working correctly. There's an option: `-r`, which can be used to run specific test case. +For example: if we only want to test `TestStableAddressBalance` and see the result, we can run: + +```sh +$ ./ci-scripts/integration-test-stable.sh -v -r TestStableAddressBalance +``` + +#### Update golden files in integration testdata + +Golden files are expected data responses from the CLI or HTTP API saved to disk. +When the tests are run, their output is compared to the golden files. + +To update golden files, use the provided `make` command: + +```sh +$ make update-golden-files +``` + +We can also update a specific test case's golden file with the `-r` option. +For example: +```sh +$ ./ci-scripts/integration-test-stable.sh -v -u -r TestStableAddressBalance +``` + +### Test coverage + +Coverage is automatically generated for `make test` and integration tests run against a stable node. +This includes integration test coverage. The coverage output files are placed in `coverage/`. + +To merge coverage from all tests into a single HTML file for viewing: + +```sh +$ make check +$ make merge-coverage +``` + +Then open `coverage/all-coverage.html` in the browser. + +#### Test coverage for the live node + +Some tests can only be run with a live node, for example wallet spending tests. +To generate coverage for this, build and run the skycoin node in test mode before running the live integration tests. + +In one shell: + +```sh +$ make run-integration-test-live-cover +``` + +In another shell: + +```sh +$ make integration-test-live +``` + +After the tests have run, CTRL-C to exit the process from the first shell. +A coverage file will be generated at `coverage/skycoin-live.coverage.out`. + +Merge the coverage with `make merge-coverage` then open the `coverage/all-coverage.html` file to view it, +or generate the HTML coverage in isolation with `go tool cover -html` + +### Formatting + +All `.go` source files should be formatted `goimports`. You can do this with: + +```sh +$ make format +``` + +### Code Linting + +Install prerequisites: + +```sh +$ make install-linters +``` + +Run linters: + +```sh +$ make lint +``` + +### Profiling + +A full CPU profile of the program from start to finish can be obtained by running the node with the `-profile-cpu` flag. +Once the node terminates, a profile file is written to `-profile-cpu-file` (defaults to `cpu.prof`). +This profile can be analyzed with + +```sh +$ go tool pprof cpu.prof +``` + +The HTTP interface for obtaining more profiling data or obtaining data while running can be enabled with `-http-prof`. +The HTTP profiling interface can be controlled with `-http-prof-host` and listens on `localhost:6060` by default. + +See https://golang.org/pkg/net/http/pprof/ for guidance on using the HTTP profiler. + +Some useful examples include: + +```sh +$ go tool pprof http://localhost:6060/debug/pprof/profile?seconds=10 +$ go tool pprof http://localhost:6060/debug/pprof/heap +``` + +A web page interface is provided by http/pprof at http://localhost:6060/debug/pprof/. + +### Fuzzing + +Fuzz tests are run with [go-fuzz](https://github.com/dvyukov/go-fuzz). +[Follow the instructions on the go-fuzz page](https://github.com/dvyukov/go-fuzz) to install it. + +Fuzz tests are written for the following packages: + +#### base58 + +To fuzz the `cipher/base58` package, + +```sh +$ make fuzz-base58 +``` + +#### encoder + +To fuzz the `cipher/encoder` package, + +```sh +$ make fuzz-encoder +``` + +### Dependencies + +#### Rules + +Dependencies must not require `cgo`. This means dependencies cannot be wrappers around C libraries. +Requiring `cgo` breaks cross compilation and interferes with repeatable (deterministic) builds. + +Critical cryptographic dependencies used by code in package `cipher` are archived inside the `cipher` folder, +rather than in the `vendor` folder. This prevents a user of the `cipher` package from accidentally using a +different version of the `cipher` dependencies than were developed, which could have catastrophic but hidden problems. + +#### Management + +Dependencies are managed with [dep](https://github.com/golang/dep). + +To [install `dep` for development](https://github.com/golang/dep/blob/master/docs/installation.md#development): + +```sh +$ go get -u github.com/golang/dep/cmd/dep +``` + +`dep` vendors all dependencies into the repo. + +If you change the dependencies, you should update them as needed with `dep ensure`. + +Use `dep help` for instructions on vendoring a specific version of a dependency, or updating them. + +When updating or initializing, `dep` will find the latest version of a dependency that will compile. + +Examples: + +Initialize all dependencies: + +```sh +$ dep init +``` + +Update all dependencies: + +```sh +$ dep ensure -update -v +``` + +Add a single dependency (latest version): + +```sh +$ dep ensure github.com/foo/bar +``` + +Add a single dependency (more specific version), or downgrade an existing dependency: + +```sh +$ dep ensure github.com/foo/bar@tag +``` + +### Configuration Modes +There are 4 configuration modes in which you can run a skycoin node: +- Development Desktop Daemon +- Server Daemon +- Electron Desktop Client +- Standalone Desktop Client + +#### Development Desktop Client Mode +This mode is configured via `run-client.sh` +```bash +$ ./run-client.sh +``` + +#### Server Daemon Mode +The default settings for a skycoin node are chosen for `Server Daemon`, which is typically run from source. +This mode is usually preferred to be run with security options, though `-disable-csrf` is normal for server daemon mode, it is left enabled by default. + +```bash +$ ./run-daemon.sh +``` + +To disable CSRF: + +```bash +$ ./run-daemon.sh -disable-csrf +``` + +#### Electron Desktop Client Mode +This mode configures itself via electron-main.js + +#### Standalone Desktop Client Mode +This mode is configured by compiling with `STANDALONE_CLIENT` build tag. +The configuration is handled in `cmd/skycoin/skycoin.go` + +### Wallet GUI Development + +The compiled wallet source should be checked in to the repo, so that others do not need to install node to run the software. + +Instructions for doing this: + +[Wallet GUI Development README](src/gui/static/README.md) + +#### Translations + +You can find information about how to work with translation files in the [Translations README](./src/gui/static/src/assets/i18n/README.md). + +### Releases + +#### Update the version + +0. If the `master` branch has commits that are not in `develop` (e.g. due to a hotfix applied to `master`), merge `master` into `develop` +0. Make sure the translations are up to date. See the [i18n README](./src/gui/static/src/assets/i18n/README.md) for instructions on how to update translations and how to check if they are up to date. +0. Compile the `src/gui/static/dist/` to make sure that it is up to date (see [Wallet GUI Development README](src/gui/static/README.md)) +0. Update version strings to the new version in the following files: `electron/package-lock.json`, `electron/package.json`, `electron/skycoin/current-skycoin.json`, `src/cli/cli.go`, `src/gui/static/src/current-skycoin.json`, `src/cli/integration/testdata/status*.golden`, `template/coin.template`, `README.md` files . +0. If changes require a new database verification on the next upgrade, update `src/SkycoinProject/skycoin.go`'s `DBVerifyCheckpointVersion` value +0. Update `CHANGELOG.md`: move the "unreleased" changes to the version and add the date +0. Update the files in https://github.com/skycoin/repo-info by following the [metadata update procedure](https://github.com/skycoin/repo-info/#updating-skycoin-repository-metadate), +0. Merge these changes to `develop` +0. Follow the steps in [pre-release testing](#pre-release-testing) +0. Make a PR merging `develop` into `master` +0. Review the PR and merge it +0. Tag the `master` branch with the version number. Version tags start with `v`, e.g. `v0.20.0`. + Sign the tag. If you have your GPG key in github, creating a release on the Github website will automatically tag the release. + It can be tagged from the command line with `git tag -as v0.20.0 $COMMIT_ID`, but Github will not recognize it as a "release". +0. Make sure that the client runs properly from the `master` branch +0. Release builds are created and uploaded by travis. To do it manually, checkout the `master` branch and follow the [create release builds](electron/README.md) instructions. + +If there are problems discovered after merging to `master`, start over, and increment the 3rd version number. +For example, `v0.20.0` becomes `v0.20.1`, for minor fixes. + +#### Pre-release testing + +Performs these actions before releasing: + +* `make check` +* `make integration-test-live` +* `make integration-test-live-disable-networking` (requires node run with `-disable-networking`) +* `make integration-test-live-disable-csrf` (requires node run with `-disable-csrf`) +* `make intergration-test-live-wallet` (see [live integration tests](#live-integration-tests)) 6 times: with an unencrypted and encrypted wallet for each wallet type: `deterministic`, `bip44` and `collection` +* `go run cmd/skycoin-cli/skycoin-cli.go checkdb` against a fully synced database +* `go run cmd/skycoin-cli/skycoin-cli.go checkDBDecoding` against a fully synced database +* On all OSes, make sure that the client runs properly from the command line (`./run-client.sh` and `./run-daemon.sh`) +* Build the releases and make sure that the Electron client runs properly on Windows, Linux and macOS. + * Use a clean data directory with no wallets or database to sync from scratch and verify the wallet setup wizard. + * Load a test wallet with nonzero balance from seed to confirm wallet loading works + * Send coins to another wallet to confirm spending works + * Restart the client, confirm that it reloads properly +* For both the Android and iOS mobile wallets, configure the node url to be https://staging.node.skycoin.com + and test all operations to ensure it will work with the new node version. + +#### Creating release builds + +[Create Release builds](electron/README.md). + +#### Release signing + +Releases are signed with this PGP key: + +`0x913BBD5206B19620` + +The fingerprint for this key is: + +``` +pub ed25519 2019-09-17 [SC] [expires: 2023-09-16] + 98F934F04F9334B81DFA3398913BBD5206B19620 +uid [ultimate] iketheadore skycoin +sub cv25519 2019-09-17 [E] [expires: 2023-09-16] +``` + +Keybase.io account: https://keybase.io/iketheadore + +Follow the [Tor Project's instructions for verifying signatures](https://www.torproject.org/docs/verifying-signatures.html.en). + +If you can't or don't want to import the keys from a keyserver, the signing key is available in the repo: [iketheadore.asc](iketheadore.asc). + +Releases and their signatures can be found on the [releases page](https://github.com/SkycoinProject/skycoin/releases). + +Instructions for generating a PGP key, publishing it, signing the tags and binaries: +https://gist.github.com/iketheadore/6485585ce2d22231c2cb3cbc77e1d7b7 + +## Responsible Disclosure + +Security flaws in skycoin source or infrastructure can be sent to security@skycoin.com. +Bounties are available for accepted critical bug reports. + +PGP Key for signing: + +``` +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mDMEXYCYPxYJKwYBBAHaRw8BAQdAeDPi3n9xLv5xGsxbcbwZjfV4h772W+GPZ3Mz +RS17STm0L2lrZXRoZWFkb3JlIHNreWNvaW4gPGx1eGFpcmxha2VAcHJvdG9ubWFp +bC5jb20+iJYEExYIAD4WIQSY+TTwT5M0uB36M5iRO71SBrGWIAUCXYCYPwIbAwUJ +B4TOAAULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRCRO71SBrGWID0NAP0VRiNA +2Kq2uakPMqV29HY39DVhc9QgxJfMIwXWtFxKAwEAn0NqGRV/iKXNf+qxqAtMWa5X +F2S36hkEfDHO5W44DwC4OARdgJg/EgorBgEEAZdVAQUBAQdAeiEz/tUmCgOA67Rq +ANmHmX2vrdZp/SfJ9KOI2ANCCm8DAQgHiH4EGBYIACYWIQSY+TTwT5M0uB36M5iR +O71SBrGWIAUCXYCYPwIbDAUJB4TOAAAKCRCRO71SBrGWIJOJAQDTaqxpcLtAw5kH +Hp2jWvUnLudIONeqeUTCmkLJhcNv1wD+PFJZWMKD1btIG4pkXRW9YoA7M7t5by5O +x5I+LywZNww= +=p6Gq +-----END PGP PUBLIC KEY BLOCK----- +``` + + +Key ID: [0x913BBD5206B19620](https://pgp.mit.edu/pks/lookup?search=0x913BBD5206B19620&op=index) + +The fingerprint for this key is: + +``` +pub ed25519 2019-09-17 [SC] [expires: 2023-09-16] + 98F934F04F9334B81DFA3398913BBD5206B19620 +uid [ultimate] iketheadore skycoin +sub cv25519 2019-09-17 [E] [expires: 2023-09-16] +``` + +Keybase.io account: https://keybase.io/iketheadore diff --git a/vendor/github.com/SkycoinProject/skycoin/ci-scripts/add-key.sh b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/add-key.sh new file mode 100755 index 00000000..9a00d55d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/add-key.sh @@ -0,0 +1,32 @@ +#!/usr/bin/env bash + +set -e -o pipefail + +KEY_CHAIN=login.keychain +echo "security create keychain" +if ! security show-keychain-info $KEY_CHAIN ; then + security create-keychain -p $OSX_KEYCHAIN_PWD $KEY_CHAIN ; +fi +# Make the keychain the default so identities are found +echo "security default-keychain" +security default-keychain -s $KEY_CHAIN +# Unlock the keychain +echo "unlock the keychain" +security unlock-keychain -p $OSX_KEYCHAIN_PWD $KEY_CHAIN +# Set keychain locking timeout to 3600 seconds +echo "set keychain locking timeout to 3600" +security set-keychain-settings -t 3600 -u $KEY_CHAIN + +# Add certificates to keychain and allow codesign to access them +# security import ./electron/ci-scripts/certs/dist.cer -k $KEY_CHAIN -T /usr/bin/codesign +# security import ./electron/ci-scripts/certs/dev.cer -k $KEY_CHAIN -T /usr/bin/codesign +echo "import distp12" +security import $GOPATH/src/github.com/SkycoinProject/skycoin/ci-scripts/certs/dist.p12 -k $KEY_CHAIN -P $CERT_PWD -A /usr/bin/codesign + +echo "list keychains: " +security list-keychains +echo " ****** " + +echo "find indentities keychains: " +security find-identity -p codesigning ~/Library/Keychains/$KEY_CHAIN +echo " ****** " diff --git a/vendor/github.com/SkycoinProject/skycoin/ci-scripts/build-wallet.sh b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/build-wallet.sh new file mode 100755 index 00000000..cc43f2be --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/build-wallet.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash + +set -e -o pipefail + +echo "start to build wallets..." +pushd "electron" >/dev/null +if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then ./build.sh 'linux/amd64 linux/arm' ;fi +if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then ./build.sh 'darwin/amd64' ;fi +if [[ "$TRAVIS_OS_NAME" == "windows" ]]; then ./build.sh 'windows/amd64 windows/386'; fi +ls release/ +popd >/dev/null diff --git a/vendor/github.com/SkycoinProject/skycoin/ci-scripts/certs/dist.p12 b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/certs/dist.p12 new file mode 100644 index 00000000..03e1889e Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/certs/dist.p12 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/ci-scripts/install-golangci-lint.sh b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/install-golangci-lint.sh new file mode 100755 index 00000000..5e40dd1d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/install-golangci-lint.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash + +set -e -o pipefail + +if [ -z "$VERSION" ]; then + echo "VERSION must be set" + exit 1 +fi + +# In alpine linux (as it does not come with curl by default) +wget -O - -q https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | sh -s -- -b $GOPATH/bin v$VERSION + +golangci-lint --version diff --git a/vendor/github.com/SkycoinProject/skycoin/ci-scripts/install-nodejs-win.sh b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/install-nodejs-win.sh new file mode 100755 index 00000000..15a1780d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/install-nodejs-win.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +set -e -o pipefail + +# Install nodejs with choco +choco install nodejs --version=8.11.0 -y +echo 'export PATH="/c/Program Files/nodejs:${PATH}";' >> ~/.bashrc diff --git a/vendor/github.com/SkycoinProject/skycoin/ci-scripts/integration-test-auth.sh b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/integration-test-auth.sh new file mode 100755 index 00000000..ae18083a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/integration-test-auth.sh @@ -0,0 +1,166 @@ +#!/bin/bash +# Runs "stable"-mode tests against a skycoin node configured with a pinned database +# "stable" mode tests assume the blockchain data is static, in order to check API responses more precisely +# $TEST defines which test to run i.e, cli or api; If empty both are run + +# Set Script Name variable +SCRIPT=`basename ${BASH_SOURCE[0]}` + +# Find unused port +PORT="1024" +while $(lsof -Pi :$PORT -sTCP:LISTEN -t >/dev/null) ; do + PORT=$((PORT+1)) +done + +COIN="${COIN:-skycoin}" +RPC_PORT="$PORT" +HOST="http://127.0.0.1:$PORT" +RPC_ADDR="http://127.0.0.1:$RPC_PORT" +MODE="stable" +BINARY="${COIN}-integration-auth.test" +TEST="" +UPDATE="" +# run go test with -v flag +VERBOSE="" +# run go test with -run flag +RUN_TESTS="" +DISABLE_CSRF="-disable-csrf" +USE_CSRF="" +DISABLE_HEADER_CHECK="" +HEADER_CHECK="1" +DB_NO_UNCONFIRMED="" +DB_FILE="blockchain-180.db" +WEB_USERNAME="foobar" +WEB_PASSWORD="abcdef123" + +usage () { + echo "Usage: $SCRIPT" + echo "Optional command line arguments" + echo "-t -- Test to run, api or cli; empty runs both tests" + echo "-r -- Run test with -run flag" + echo "-u -- Update stable testdata" + echo "-v -- Run test with -v flag" + echo "-c -- Run tests with CSRF enabled" + echo "-d -- Run tests without unconfirmed transactions" + echo "-x -- Run test with header check disabled" + exit 1 +} + +while getopts "h?t:r:n:uvcd" args; do + case $args in + h|\?) + usage; + exit;; + t ) TEST=${OPTARG};; + r ) RUN_TESTS="-run ${OPTARG}";; + u ) UPDATE="--update";; + v ) VERBOSE="-v";; + d ) DB_NO_UNCONFIRMED="1"; DB_FILE="blockchain-180-no-unconfirmed.db";; + c ) DISABLE_CSRF=""; USE_CSRF="1";; + x ) DISABLE_HEADER_CHECK="-disable-header-check"; HEADER_CHECK=""; + esac +done + +COVERAGEFILE="coverage/${BINARY}.coverage.out" +if [ -f "${COVERAGEFILE}" ]; then + rm "${COVERAGEFILE}" +fi + +set -euxo pipefail + +COMMIT=$(git rev-parse HEAD) +BRANCH=$(git rev-parse --abbrev-ref HEAD) +CMDPKG=$(go list ./cmd/${COIN}) +COVERPKG=$(dirname $(dirname ${CMDPKG})) +GOLDFLAGS="-X ${CMDPKG}.Commit=${COMMIT} -X ${CMDPKG}.Branch=${BRANCH}" + +echo "checking if integration tests compile" +go test ./src/api/integration/... +go test ./src/cli/integration/... + +DATA_DIR=$(mktemp -d -t ${COIN}-data-dir.XXXXXX) +WALLET_DIR="${DATA_DIR}/wallets" + +if [[ ! "$DATA_DIR" ]]; then + echo "Could not create temp dir" + exit 1 +fi + +# Compile the skycoin node +# We can't use "go run" because that creates two processes which doesn't allow us to kill it at the end +echo "compiling $COIN with coverage" +go test -c -ldflags "${GOLDFLAGS}" -tags testrunmain -o "$BINARY" -coverpkg="${COVERPKG}/..." ./cmd/${COIN}/ + +mkdir -p coverage/ + +# Run skycoin node with pinned blockchain database +echo "starting $COIN node in background with http listener on $HOST" + +./"$BINARY" -disable-networking=true \ + -web-interface-port=$PORT \ + -download-peerlist=false \ + -db-path=./src/api/integration/testdata/$DB_FILE \ + -db-read-only=true \ + -launch-browser=false \ + -data-dir="$DATA_DIR" \ + -web-interface-username=$WEB_USERNAME \ + -web-interface-password=$WEB_PASSWORD \ + -web-interface-plaintext-auth=true \ + -enable-all-api-sets=true \ + -wallet-dir="$WALLET_DIR" \ + $DISABLE_CSRF \ + $DISABLE_HEADER_CHECK \ + -test.run "^TestRunMain$" \ + -test.coverprofile="${COVERAGEFILE}" \ + & + +SKYCOIN_PID=$! + +echo "$COIN node pid=$SKYCOIN_PID" + +echo "sleeping for startup" +sleep 3 +echo "done sleeping" + +set +e + +if [[ -z $TEST || $TEST = "api" ]]; then + +SKYCOIN_INTEGRATION_TESTS=1 SKYCOIN_INTEGRATION_TEST_MODE=$MODE \ +SKYCOIN_NODE_HOST=$HOST SKYCOIN_NODE_USERNAME=$WEB_USERNAME SKYCOIN_NODE_PASSWORD=$WEB_PASSWORD \ +USE_CSRF=$USE_CSRF HEADER_CHECK=$HEADER_CHECK DB_NO_UNCONFIRMED=$DB_NO_UNCONFIRMED \ + go test -count=1 ./src/api/integration/... $UPDATE -timeout=10m $VERBOSE $RUN_TESTS + +API_FAIL=$? + +fi + +if [[ -z $TEST || $TEST = "cli" ]]; then + +SKYCOIN_INTEGRATION_TESTS=1 SKYCOIN_INTEGRATION_TEST_MODE=$MODE \ +RPC_ADDR=$RPC_ADDR RPC_USER=$WEB_USERNAME RPC_PASS=$WEB_PASSWORD \ +USE_CSRF=$USE_CSRF HEADER_CHECK=$HEADER_CHECK DB_NO_UNCONFIRMED=$DB_NO_UNCONFIRMED \ + go test -count=1 ./src/cli/integration/... $UPDATE -timeout=10m $VERBOSE $RUN_TESTS + +CLI_FAIL=$? + +fi + + +echo "shutting down $COIN node" + +# Shutdown skycoin node +kill -s SIGINT $SKYCOIN_PID +wait $SKYCOIN_PID + +rm "$BINARY" + + +if [[ (-z $TEST || $TEST = "api") && $API_FAIL -ne 0 ]]; then + exit $API_FAIL +elif [[ (-z $TEST || $TEST = "cli") && $CLI_FAIL -ne 0 ]]; then + exit $CLI_FAIL +else + exit 0 +fi +# exit $FAIL diff --git a/vendor/github.com/SkycoinProject/skycoin/ci-scripts/integration-test-disable-gui.sh b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/integration-test-disable-gui.sh new file mode 100755 index 00000000..b53c4eee --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/integration-test-disable-gui.sh @@ -0,0 +1,123 @@ +#!/bin/bash +# Runs "disable-gui"-mode tests against a skycoin node configured with -enable-gui=false +# and /api/v1/api endpoint should return 404 Not Found error + +# Set Script Name variable +SCRIPT=`basename ${BASH_SOURCE[0]}` + +# Find unused port +PORT="1024" +while $(lsof -Pi :$PORT -sTCP:LISTEN -t >/dev/null) ; do + PORT=$((PORT+1)) +done + +COIN="${COIN:-skycoin}" +RPC_PORT="$PORT" +HOST="http://127.0.0.1:$PORT" +RPC_ADDR="http://127.0.0.1:$RPC_PORT" +MODE="disable-gui" +BINARY="${COIN}-integration-disable-gui.test" +TEST="" +RUN_TESTS="" +# run go test with -v flag +VERBOSE="" + +usage () { + echo "Usage: $SCRIPT" + echo "Optional command line arguments" + echo "-t -- Test to run, api or cli; empty runs both tests" + echo "-v -- Run test with -v flag" + exit 1 +} + +while getopts "h?t:r:v" args; do + case $args in + h|\?) + usage; + exit;; + t ) TEST=${OPTARG};; + v ) VERBOSE="-v";; + r ) RUN_TESTS="-run ${OPTARG}";; + esac +done + +COVERAGEFILE="coverage/${BINARY}.coverage.out" +if [ -f "${COVERAGEFILE}" ]; then + rm "${COVERAGEFILE}" +fi + +set -euxo pipefail + +CMDPKG=$(go list ./cmd/${COIN}) +COVERPKG=$(dirname $(dirname ${CMDPKG})) + +echo "checking if integration tests compile" +go test ./src/api/integration/... +go test ./src/cli/integration/... + +DATA_DIR=$(mktemp -d -t ${COIN}-data-dir.XXXXXX) +WALLET_DIR="${DATA_DIR}/wallets" + +if [[ ! "$DATA_DIR" ]]; then + echo "Could not create temp dir" + exit 1 +fi + +# Compile the skycoin node +# We can't use "go run" because that creates two processes which doesn't allow us to kill it at the end +echo "compiling $COIN with coverage" +go test -c -tags testrunmain -o "$BINARY" -coverpkg="${COVERPKG}/..." ./cmd/${COIN}/ + +mkdir -p coverage/ + +# Run skycoin node with pinned blockchain database +echo "starting $COIN node in background with http listener on $HOST" + +./"$BINARY" -disable-networking=true \ + -web-interface-port=$PORT \ + -download-peerlist=false \ + -db-path=./src/api/integration/testdata/blockchain-180.db \ + -db-read-only=true \ + -launch-browser=false \ + -data-dir="$DATA_DIR" \ + -wallet-dir="$WALLET_DIR" \ + -enable-all-api-sets=true \ + -enable-api-sets=INSECURE_WALLET_SEED \ + -enable-gui=false \ + -test.run "^TestRunMain$" \ + -test.coverprofile="${COVERAGEFILE}" \ + & + +SKYCOIN_PID=$! + +echo "$COIN node pid=$SKYCOIN_PID" + +echo "sleeping for startup" +sleep 3 +echo "done sleeping" + +set +e + +if [[ -z $TEST || $TEST = "api" ]]; then + +SKYCOIN_INTEGRATION_TESTS=1 SKYCOIN_INTEGRATION_TEST_MODE=$MODE SKYCOIN_NODE_HOST=$HOST WALLET_DIR=$WALLET_DIR \ + go test -count=1 ./src/api/integration/... -timeout=30s $VERBOSE $RUN_TESTS + +API_FAIL=$? + +fi + +echo "shutting down $COIN node" + +# Shutdown skycoin node +kill -s SIGINT $SKYCOIN_PID +wait $SKYCOIN_PID + +rm "$BINARY" + + +if [[ (-z $TEST || $TEST = "api") && $API_FAIL -ne 0 ]]; then + exit $API_FAIL +else + exit 0 +fi diff --git a/vendor/github.com/SkycoinProject/skycoin/ci-scripts/integration-test-disable-wallet-api.sh b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/integration-test-disable-wallet-api.sh new file mode 100755 index 00000000..1731d1d3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/integration-test-disable-wallet-api.sh @@ -0,0 +1,122 @@ +#!/bin/bash +# Runs "disable-wallet-api"-mode tests against a skycoin node configured with the wallet API disabled. +# "disable-wallet-api"-mode confirms that no wallet-related apis work, that the main index.html page +# does not load, and that a new wallet file is not created. + +# Set Script Name variable +SCRIPT=`basename ${BASH_SOURCE[0]}` + +# Find unused port +PORT="1024" +while $(lsof -Pi :$PORT -sTCP:LISTEN -t >/dev/null) ; do + PORT=$((PORT+1)) +done + +COIN="${COIN:-skycoin}" +RPC_PORT="$PORT" +HOST="http://127.0.0.1:$PORT" +RPC_ADDR="http://127.0.0.1:$RPC_PORT" +MODE="disable-wallet-api" +BINARY="${COIN}-integration-disable-wallet-api.test" +UPDATE="" +# run go test with -v flag +VERBOSE="" +# run go test with -run flag +RUN_TESTS="" +FAILFAST="" + +usage () { + echo "Usage: $SCRIPT" + echo "Optional command line arguments" + echo "-r -- Run test with -run flag" + echo "-u -- Update stable testdata" + echo "-v -- Run test with -v flag" + echo "-f -- Run test with -failfast flag" + exit 1 +} + +while getopts "h?t:r:uvf" args; do + case $args in + h|\?) + usage; + exit;; + r ) RUN_TESTS="-run ${OPTARG}";; + u ) UPDATE="--update";; + v ) VERBOSE="-v";; + f ) FAILFAST="-failfast" + esac +done + +COVERAGEFILE="coverage/${BINARY}.coverage.out" +if [ -f "${COVERAGEFILE}" ]; then + rm "${COVERAGEFILE}" +fi + +set -euxo pipefail + +CMDPKG=$(go list ./cmd/${COIN}) +COVERPKG=$(dirname $(dirname ${CMDPKG})) +COMMIT=$(git rev-parse HEAD) +BRANCH=$(git rev-parse --abbrev-ref HEAD) +GOLDFLAGS="-X ${CMDPKG}.Commit=${COMMIT} -X ${CMDPKG}.Branch=${BRANCH}" + +echo "checking if integration tests compile" +go test ./src/api/integration/... +go test ./src/cli/integration/... + +DATA_DIR=$(mktemp -d -t ${COIN}-data-dir.XXXXXX) +WALLET_DIR="${DATA_DIR}/wallets" + +if [[ ! "$DATA_DIR" ]]; then + echo "Could not create temp dir" + exit 1 +fi + +# Compile the skycoin node +# We can't use "go run" because that creates two processes which doesn't allow us to kill it at the end +echo "compiling $COIN with coverage" +go test -c -ldflags "${GOLDFLAGS}" -tags testrunmain -o "$BINARY" -coverpkg="${COVERPKG}/..." ./cmd/${COIN}/ + +mkdir -p coverage/ + +# Run skycoin node with pinned blockchain database +echo "starting $COIN node in background with http listener on $HOST" + +./"$BINARY" -disable-networking=true \ + -web-interface-port=$PORT \ + -download-peerlist=false \ + -db-path=./src/api/integration/testdata/blockchain-180.db \ + -db-read-only=true \ + -launch-browser=false \ + -data-dir="$DATA_DIR" \ + -wallet-dir="$WALLET_DIR" \ + -enable-all-api-sets=true \ + -disable-api-sets=WALLET \ + -test.run "^TestRunMain$" \ + -test.coverprofile="${COVERAGEFILE}" \ + & + +SKYCOIN_PID=$! + +echo "$COIN node pid=$SKYCOIN_PID" + +echo "sleeping for startup" +sleep 3 +echo "done sleeping" + +set +e + +SKYCOIN_INTEGRATION_TESTS=1 SKYCOIN_INTEGRATION_TEST_MODE=$MODE SKYCOIN_NODE_HOST=$HOST API_WALLET_DIR=$WALLET_DIR \ + go test -count=1 ./src/api/integration/... $FAILFAST $UPDATE -timeout=30s $VERBOSE $RUN_TESTS + +FAIL=$? + +echo "shutting down $COIN node" + +# Shutdown skycoin node +kill -s SIGINT $SKYCOIN_PID +wait $SKYCOIN_PID + +rm "$BINARY" + +exit $FAIL diff --git a/vendor/github.com/SkycoinProject/skycoin/ci-scripts/integration-test-enable-seed-api.sh b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/integration-test-enable-seed-api.sh new file mode 100755 index 00000000..68563dd5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/integration-test-enable-seed-api.sh @@ -0,0 +1,135 @@ +#!/bin/bash +# Runs "enable-seed-api"-mode tests against a skycoin node configured with -enable-seed-api=true +# and /api/v1/wallet/seed api endpoint should return coresponding seed + +# Set Script Name variable +SCRIPT=`basename ${BASH_SOURCE[0]}` + +# Find unused port +PORT="1024" +while $(lsof -Pi :$PORT -sTCP:LISTEN -t >/dev/null) ; do + PORT=$((PORT+1)) +done + +COIN=${COIN:-skycoin} +RPC_PORT="$PORT" +HOST="http://127.0.0.1:$PORT" +RPC_ADDR="http://127.0.0.1:$RPC_PORT" +MODE="enable-seed-api" +BINARY="${COIN}-integration-enable-seed-api.test" +TEST="" +RUN_TESTS="" +# run go test with -v flag +VERBOSE="" + +usage () { + echo "Usage: $SCRIPT" + echo "Optional command line arguments" + echo "-t -- Test to run, api or cli; empty runs both tests" + echo "-v -- Run test with -v flag" + exit 1 +} + +while getopts "h?t:r:v" args; do + case $args in + h|\?) + usage; + exit;; + t ) TEST=${OPTARG};; + v ) VERBOSE="-v";; + r ) RUN_TESTS="-run ${OPTARG}";; + esac +done + +COVERAGEFILE="coverage/${BINARY}.coverage.out" +if [ -f "${COVERAGEFILE}" ]; then + rm "${COVERAGEFILE}" +fi + +set -euxo pipefail + +CMDPKG=$(go list ./cmd/${COIN}) +COVERPKG=$(dirname $(dirname ${CMDPKG})) + +echo "checking if integration tests compile" +go test ./src/api/integration/... +go test ./src/cli/integration/... + +DATA_DIR=$(mktemp -d -t ${COIN}-data-dir.XXXXXX) +WALLET_DIR="${DATA_DIR}/wallets" + +if [[ ! "$DATA_DIR" ]]; then + echo "Could not create temp dir" + exit 1 +fi + +# Compile the skycoin node +# We can't use "go run" because that creates two processes which doesn't allow us to kill it at the end +echo "compiling $COIN with coverage" +go test -c -tags testrunmain -o "$BINARY" -coverpkg="${COVERPKG}/..." ./cmd/${COIN}/ + +mkdir -p coverage/ + +# Run skycoin node with pinned blockchain database +echo "starting $COIN node in background with http listener on $HOST" + +./"$BINARY" -disable-networking=true \ + -web-interface-port=$PORT \ + -download-peerlist=false \ + -db-path=./src/api/integration/testdata/blockchain-180.db \ + -db-read-only=true \ + -launch-browser=false \ + -data-dir="$DATA_DIR" \ + -wallet-dir="$WALLET_DIR" \ + -enable-all-api-sets=true \ + -enable-api-sets=INSECURE_WALLET_SEED \ + -test.run "^TestRunMain$" \ + -test.coverprofile="${COVERAGEFILE}" \ + & + +SKYCOIN_PID=$! + +echo "$COIN node pid=$SKYCOIN_PID" + +echo "sleeping for startup" +sleep 3 +echo "done sleeping" + +set +e + +if [[ -z $TEST || $TEST = "api" ]]; then + +SKYCOIN_INTEGRATION_TESTS=1 SKYCOIN_INTEGRATION_TEST_MODE=$MODE SKYCOIN_NODE_HOST=$HOST WALLET_DIR=$WALLET_DIR \ + go test -count=1 ./src/api/integration/... -timeout=300s $VERBOSE $RUN_TESTS + +API_FAIL=$? + +fi + +if [[ -z $TEST || $TEST = "cli" ]]; then + +# SKYCOIN_INTEGRATION_TESTS=1 SKYCOIN_INTEGRATION_TEST_MODE=$MODE RPC_ADDR=$RPC_ADDR \ +# go test -count=1 ./src/cli/integration/... -timeout=300s $VERBOSE $RUN_TESTS + +CLI_FAIL=$? + +fi + + +echo "shutting down $COIN node" + +# Shutdown skycoin node +kill -s SIGINT $SKYCOIN_PID +wait $SKYCOIN_PID + +rm "$BINARY" + + +if [[ (-z $TEST || $TEST = "api") && $API_FAIL -ne 0 ]]; then + exit $API_FAIL +elif [[ (-z $TEST || $TEST = "cli") && $CLI_FAIL -ne 0 ]]; then + exit $CLI_FAIL +else + exit 0 +fi +# exit $FAIL diff --git a/vendor/github.com/SkycoinProject/skycoin/ci-scripts/integration-test-live.sh b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/integration-test-live.sh new file mode 100755 index 00000000..3fa175f6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/integration-test-live.sh @@ -0,0 +1,94 @@ +#!/bin/bash + +# Runs "live"-mode tests against a skycoin node that is already running +# "live" mode tests assume the blockchain data is active and may change at any time +# Data is checked for the appearance of correctness but the values themselves are not verified +# The skycoin node must be run with the wallet API enabled. + +#Set Script Name variable +SCRIPT=`basename ${BASH_SOURCE[0]}` + +COIN=${COIN:-skycoin} +PORT="6420" +RPC_PORT="$PORT" +HOST="http://127.0.0.1:$PORT" +RPC_ADDR="http://127.0.0.1:$RPC_PORT" +MODE="live" +TEST="" +UPDATE="" +TIMEOUT="60m" +# run go test with -v flag +VERBOSE="" +# run go test with -run flag +RUN_TESTS="" +# run wallet tests +TEST_LIVE_WALLET="" +FAILFAST="" +USE_CSRF="" +HEADER_CHECK="1" +DISABLE_NETWORKING="" + +usage () { + echo "Usage: $SCRIPT" + echo "Optional command line arguments" + echo "-t -- Test to run, api or cli; empty runs both tests" + echo "-r -- Run test with -run flag" + echo "-u -- Update stable testdata" + echo "-v -- Run test with -v flag" + echo "-w -- Run wallet tests" + echo "-f -- Run test with -failfast flag" + echo "-c -- Pass this argument if the node has CSRF enabled" + echo "-x -- Pass this argument if the node has header check disabled" + echo "-k -- Run the tests that require networking disabled (live node must be run with -disable-networking)" + exit 1 +} + +while getopts "h?t:r:uvwfck" args; do +case $args in + h|\?) + usage; + exit;; + t ) TEST=${OPTARG};; + r ) RUN_TESTS="-run ${OPTARG}";; + u ) UPDATE="--update";; + v ) VERBOSE="-v";; + w ) TEST_LIVE_WALLET="--test-live-wallet";; + f ) FAILFAST="-failfast";; + c ) USE_CSRF="1";; + x ) HEADER_CHECK="";; + k ) DISABLE_NETWORKING="true" + esac +done + +set -euxo pipefail + +echo "checking if $COIN node is running" + +HEALTH="$HOST/api/v1/health" + +http_proxy="" https_proxy="" wget -O- $HEALTH 2>&1 >/dev/null + +if [ ! $? -eq 0 ]; then + echo "$COIN node is not running on $HOST" + exit 1 +fi + +echo "checking if integration tests compile" +go test ./src/api/integration/... +go test ./src/cli/integration/... + +if [[ -z $TEST || $TEST = "api" ]]; then + +SKYCOIN_INTEGRATION_TESTS=1 SKYCOIN_INTEGRATION_TEST_MODE=$MODE SKYCOIN_NODE_HOST=$HOST \ + LIVE_DISABLE_NETWORKING=$DISABLE_NETWORKING \ + go test -count=1 ./src/api/integration/... $FAILFAST $UPDATE -timeout=$TIMEOUT $VERBOSE $RUN_TESTS $TEST_LIVE_WALLET + +fi + +if [[ -z $TEST || $TEST = "cli" ]]; then + +SKYCOIN_INTEGRATION_TESTS=1 SKYCOIN_INTEGRATION_TEST_MODE=$MODE RPC_ADDR=$RPC_ADDR \ + SKYCOIN_NODE_HOST=$HOST USE_CSRF=$USE_CSRF HEADER_CHECK=$HEADER_CHECK LIVE_DISABLE_NETWORKING=$DISABLE_NETWORKING \ + go test -count=1 ./src/cli/integration/... $FAILFAST $UPDATE -timeout=$TIMEOUT $VERBOSE $RUN_TESTS $TEST_LIVE_WALLET + +fi diff --git a/vendor/github.com/SkycoinProject/skycoin/ci-scripts/integration-test-stable.sh b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/integration-test-stable.sh new file mode 100755 index 00000000..5ab32f26 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/integration-test-stable.sh @@ -0,0 +1,163 @@ +#!/bin/bash +# Runs "stable"-mode tests against a skycoin node configured with a pinned database +# "stable" mode tests assume the blockchain data is static, in order to check API responses more precisely +# $TEST defines which test to run i.e, cli or api; If empty both are run + +# Set Script Name variable +SCRIPT=`basename ${BASH_SOURCE[0]}` + +# Find unused port +PORT="1024" +while $(lsof -Pi :$PORT -sTCP:LISTEN -t >/dev/null) ; do + PORT=$((PORT+1)) +done + +COIN="${COIN:-skycoin}" +RPC_PORT="$PORT" +HOST="http://127.0.0.1:$PORT" +RPC_ADDR="http://127.0.0.1:$RPC_PORT" +MODE="stable" +NAME="" +TEST="" +UPDATE="" +# run go test with -v flag +VERBOSE="" +# run go test with -run flag +RUN_TESTS="" +DISABLE_CSRF="-disable-csrf" +USE_CSRF="" +DISABLE_HEADER_CHECK="" +HEADER_CHECK="1" +DB_NO_UNCONFIRMED="" +DB_FILE="blockchain-180.db" + +usage () { + echo "Usage: $SCRIPT" + echo "Optional command line arguments" + echo "-t -- Test to run, api or cli; empty runs both tests" + echo "-r -- Run test with -run flag" + echo "-n -- Specific name for this test, affects coverage output files" + echo "-u -- Update stable testdata" + echo "-v -- Run test with -v flag" + echo "-c -- Run tests with CSRF enabled" + echo "-x -- Run test with header check disabled" + echo "-d -- Run tests without unconfirmed transactions" + exit 1 +} + +while getopts "h?t:r:n:uvcxd" args; do + case $args in + h|\?) + usage; + exit;; + t ) TEST=${OPTARG};; + r ) RUN_TESTS="-run ${OPTARG}";; + n ) NAME="-${OPTARG}";; + u ) UPDATE="--update";; + v ) VERBOSE="-v";; + d ) DB_NO_UNCONFIRMED="1"; DB_FILE="blockchain-180-no-unconfirmed.db";; + c ) DISABLE_CSRF=""; USE_CSRF="1";; + x ) DISABLE_HEADER_CHECK="-disable-header-check"; HEADER_CHECK=""; + esac +done + +BINARY="${COIN}-integration${NAME}.test" + +COVERAGEFILE="coverage/${BINARY}.coverage.out" +if [ -f "${COVERAGEFILE}" ]; then + rm "${COVERAGEFILE}" +fi + +set -euxo pipefail + +COMMIT=$(git rev-parse HEAD) +BRANCH=$(git rev-parse --abbrev-ref HEAD) +CMDPKG=$(go list ./cmd/${COIN}) +COVERPKG=$(dirname $(dirname ${CMDPKG})) +GOLDFLAGS="-X ${CMDPKG}.Commit=${COMMIT} -X ${CMDPKG}.Branch=${BRANCH}" + +echo "checking if integration tests compile" +go test ./src/api/integration/... +go test ./src/cli/integration/... + +DATA_DIR=$(mktemp -d -t ${COIN}-data-dir.XXXXXX) +WALLET_DIR="${DATA_DIR}/wallets" + +if [[ ! "$DATA_DIR" ]]; then + echo "Could not create temp dir" + exit 1 +fi + +# Compile the skycoin node +# We can't use "go run" because that creates two processes which doesn't allow us to kill it at the end +echo "compiling $COIN with coverage" +go test -c -ldflags "${GOLDFLAGS}" -tags testrunmain -o "$BINARY" -coverpkg="${COVERPKG}/..." ./cmd/${COIN}/ + +mkdir -p coverage/ + +# Run skycoin node with pinned blockchain database +echo "starting $COIN node in background with http listener on $HOST" + +./"$BINARY" -disable-networking=true \ + -web-interface-port=$PORT \ + -download-peerlist=false \ + -db-path=./src/api/integration/testdata/$DB_FILE \ + -db-read-only=true \ + -launch-browser=false \ + -data-dir="$DATA_DIR" \ + -enable-all-api-sets=true \ + -wallet-dir="$WALLET_DIR" \ + $DISABLE_CSRF \ + $DISABLE_HEADER_CHECK \ + -test.run "^TestRunMain$" \ + -test.coverprofile="${COVERAGEFILE}" \ + & + +SKYCOIN_PID=$! + +echo "$COIN node pid=$SKYCOIN_PID" + +echo "sleeping for startup" +sleep 3 +echo "done sleeping" + +set +e + +if [[ -z $TEST || $TEST = "api" ]]; then + +SKYCOIN_INTEGRATION_TESTS=1 SKYCOIN_INTEGRATION_TEST_MODE=$MODE SKYCOIN_NODE_HOST=$HOST \ + USE_CSRF=$USE_CSRF HEADER_CHECK=$HEADER_CHECK DB_NO_UNCONFIRMED=$DB_NO_UNCONFIRMED COIN=$COIN \ + go test -count=1 ./src/api/integration/... $UPDATE -timeout=10m $VERBOSE $RUN_TESTS + +API_FAIL=$? + +fi + +if [[ -z $TEST || $TEST = "cli" ]]; then + +SKYCOIN_INTEGRATION_TESTS=1 SKYCOIN_INTEGRATION_TEST_MODE=$MODE RPC_ADDR=$RPC_ADDR \ + USE_CSRF=$USE_CSRF HEADER_CHECK=$HEADER_CHECK DB_NO_UNCONFIRMED=$DB_NO_UNCONFIRMED COIN=$COIN \ + go test -count=1 ./src/cli/integration/... $UPDATE -timeout=10m $VERBOSE $RUN_TESTS + +CLI_FAIL=$? + +fi + + +echo "shutting down $COIN node" + +# Shutdown skycoin node +kill -s SIGINT $SKYCOIN_PID +wait $SKYCOIN_PID + +rm "$BINARY" + + +if [[ (-z $TEST || $TEST = "api") && $API_FAIL -ne 0 ]]; then + exit $API_FAIL +elif [[ (-z $TEST || $TEST = "cli") && $CLI_FAIL -ne 0 ]]; then + exit $CLI_FAIL +else + exit 0 +fi +# exit $FAIL diff --git a/vendor/github.com/SkycoinProject/skycoin/ci-scripts/lint-and-test.sh b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/lint-and-test.sh new file mode 100755 index 00000000..de9f9fc0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/lint-and-test.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash + +make check-newcoin +make lint +make test-386 +make test-amd64 +make integration-tests-stable +make lint-ui +make build-ui-travis +make test-ui +make test-ui-e2e diff --git a/vendor/github.com/SkycoinProject/skycoin/ci-scripts/run-live-integration-test-node-cover.sh b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/run-live-integration-test-node-cover.sh new file mode 100755 index 00000000..a163bbfd --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/run-live-integration-test-node-cover.sh @@ -0,0 +1,35 @@ +#!/usr/bin/env bash + +# Runs the node with configuration necessary for running the live integration tests, +# with coverage enabled + +set -exu + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +pushd "$DIR/.." >/dev/null + +COIN=${COIN:-skycoin} +COMMIT=$(git rev-parse HEAD) +BRANCH=$(git rev-parse --abbrev-ref HEAD) +GOLDFLAGS="-X main.Commit=${COMMIT} -X main.Branch=${BRANCH}" +BINARY="${COIN}-live.test" +CMDPKG=$(go list ./cmd/${COIN}) +COVERPKG=$(dirname $(dirname ${CMDPKG})) + +COVERAGEFILE="coverage/${BINARY}.coverage.out" +if [ -f "${COVERAGEFILE}" ]; then + rm "${COVERAGEFILE}" +fi + +go test -c -ldflags "-X ${CMDPKG}.Commit=$COMMIT -X ${CMDPKG}.Branch=${BRANCH}" -tags testrunmain -o "${BINARY}" -coverpkg="${COVERPKG}/..." ./cmd/${COIN}/ + +./${BINARY} \ + -gui-dir="${DIR}/src/gui/static/" \ + -launch-browser=false \ + -enable-all-api-sets=true \ + -enable-api-sets=INSECURE_WALLET_SEED \ + -test.run "^TestRunMain$" \ + -test.coverprofile="${COVERAGEFILE}" \ + $@ + +popd >/dev/null diff --git a/vendor/github.com/SkycoinProject/skycoin/ci-scripts/run-live-integration-test-node.sh b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/run-live-integration-test-node.sh new file mode 100755 index 00000000..a8b010bb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/run-live-integration-test-node.sh @@ -0,0 +1,22 @@ +#!/usr/bin/env bash + +# Runs the node with configuration necessary for running the live integration tests + +set -exu + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +pushd "$DIR/.." >/dev/null + +COIN=${COIN:-skycoin} +COMMIT=$(git rev-parse HEAD) +BRANCH=$(git rev-parse --abbrev-ref HEAD) +GOLDFLAGS="-X main.Commit=${COMMIT} -X main.Branch=${BRANCH}" + +go run -ldflags "${GOLDFLAGS}" cmd/${COIN}/${COIN}.go \ + -gui-dir="${DIR}/src/gui/static/" \ + -launch-browser=false \ + -enable-all-api-sets=true \ + -enable-api-sets=INSECURE_WALLET_SEED \ + $@ + +popd >/dev/null diff --git a/vendor/github.com/SkycoinProject/skycoin/ci-scripts/ui-e2e.sh b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/ui-e2e.sh new file mode 100755 index 00000000..94323f45 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/ci-scripts/ui-e2e.sh @@ -0,0 +1,123 @@ +#!/bin/bash +# Runs UI e2e tests against a skycoin node configured with a pinned database + +# Set Script Name variable +SCRIPT=`basename ${BASH_SOURCE[0]}` + +# Find unused port +PORT="1024" +while $(lsof -Pi :$PORT -sTCP:LISTEN -t >/dev/null) ; do + PORT=$((PORT+1)) +done + +RPC_ADDR="127.0.0.1:$PORT" +HOST="http://127.0.0.1:$PORT" +BINARY="skycoin-integration" +E2E_PROXY_CONFIG=$(mktemp -t e2e-proxy.config.XXXXXX.js) + +COMMIT=$(git rev-parse HEAD) +BRANCH=$(git rev-parse --abbrev-ref HEAD) +GOLDFLAGS="-X main.Commit=${COMMIT} -X main.Branch=${BRANCH}" + +set -euxo pipefail + +DATA_DIR=$(mktemp -d -t skycoin-data-dir.XXXXXX) +WALLET_DIR="${DATA_DIR}/wallets" + +if [[ ! "$DATA_DIR" ]]; then + echo "Could not create temp dir" + exit 1 +fi + +# Create a dummy wallet with an address existing in the blockchain-180.db dataset +mkdir "$WALLET_DIR" +cat >"${WALLET_DIR}/test_wallet.wlt" <$E2E_PROXY_CONFIG < 64 { + wg.Done() + continue + } + + j.jobID = i + go func(jb job) { + defer wg.Done() + data := generateBip32SeedTestData(jb) + signBip32SeedTestData(data, inputs.Hashes) + seedTestData <- data + }(j) + } + wg.Wait() + + close(seedTestData) + + <-writeDone +} + +func generateInputTestData(inputsCount int) *testsuite.InputTestData { + var hashes []cipher.SHA256 + + // Add a hash which is all zeroes + hashes = append(hashes, cipher.SumSHA256(bytes.Repeat([]byte{0}, 32))) + // Add a hash which is all ones + hashes = append(hashes, cipher.SumSHA256(bytes.Repeat([]byte{1}, 32))) + + for i := 0; i < inputsCount; i++ { + hashes = append(hashes, cipher.SumSHA256(cipher.RandByte(32))) + } + + return &testsuite.InputTestData{ + Hashes: hashes, + } +} + +func generateSeedTestData(j job) *testsuite.SeedTestData { + data := &testsuite.SeedTestData{ + Seed: j.seed, + Keys: make([]testsuite.KeysTestData, j.addressCount), + } + + keys := cipher.MustGenerateDeterministicKeyPairs(j.seed, j.addressCount) + + for i, s := range keys { + data.Keys[i].Secret = s + + p := cipher.MustPubKeyFromSecKey(s) + data.Keys[i].Public = p + + addr := cipher.AddressFromPubKey(p) + data.Keys[i].Address = addr + + bitcoinAddr := cipher.BitcoinAddressFromPubKey(p) + data.Keys[i].BitcoinAddress = bitcoinAddr + } + + return data +} + +func signSeedTestData(data *testsuite.SeedTestData, hashes []cipher.SHA256) { + for i := range data.Keys { + for _, h := range hashes { + sig := cipher.MustSignHash(h, data.Keys[i].Secret) + data.Keys[i].Signatures = append(data.Keys[i].Signatures, sig) + } + } +} + +func generateBip32SeedTestData(j job) *testsuite.Bip32SeedTestData { + basePath := "m/44'/0'/0'/0" + + // Generate paths 0-4, 100, FirstHardenedChild-1 + childNumbers := []uint32{ + 0, + 1, + 2, + 3, + 4, + 100, + 1024, + bip32.FirstHardenedChild - 100, + bip32.FirstHardenedChild - 1, + } + + data := &testsuite.Bip32SeedTestData{ + Seed: j.seed, + BasePath: basePath, + ChildNumbers: childNumbers, + Keys: make([]testsuite.Bip32KeysTestData, len(childNumbers)), + } + + mk, err := bip32.NewPrivateKeyFromPath(j.seed, basePath) + if err != nil { + panic(err) + } + + // Generate child addresses for various indices + for i, n := range childNumbers { + pk, err := mk.NewPrivateChildKey(n) + if err != nil { + panic(err) + } + + secKey := cipher.MustNewSecKey(pk.Key) + pubKey := cipher.MustPubKeyFromSecKey(secKey) + + data.Keys[i] = testsuite.Bip32KeysTestData{ + Path: fmt.Sprintf("%s/%d", basePath, n), + XPriv: pk, + KeysTestData: testsuite.KeysTestData{ + Secret: secKey, + Public: pubKey, + Address: cipher.AddressFromPubKey(pubKey), + BitcoinAddress: cipher.BitcoinAddressFromPubKey(pubKey), + }, + } + } + + return data +} + +func signBip32SeedTestData(data *testsuite.Bip32SeedTestData, hashes []cipher.SHA256) { + for i := range data.Keys { + for _, h := range hashes { + sig := cipher.MustSignHash(h, data.Keys[i].Secret) + data.Keys[i].Signatures = append(data.Keys[i].Signatures, sig) + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/cmd/monitor-peers/connection/connection.go b/vendor/github.com/SkycoinProject/skycoin/cmd/monitor-peers/connection/connection.go new file mode 100644 index 00000000..0e27822e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/cmd/monitor-peers/connection/connection.go @@ -0,0 +1,220 @@ +package connection + +import ( + "bufio" + "bytes" + "errors" + "fmt" + "io" + "net" + "reflect" + "time" + + "github.com/SkycoinProject/skycoin/src/cipher/encoder" + "github.com/SkycoinProject/skycoin/src/daemon" + "github.com/SkycoinProject/skycoin/src/daemon/gnet" + "github.com/SkycoinProject/skycoin/src/util/iputil" +) + +const ( + // Byte size of the length prefix in message, sizeof(int32) + messagePrefixLength = 4 +) + +var ( + maxMessageLength = gnet.NewConfig().MaxIncomingMessageLength +) + +// Connection is a connection to the peer +type Connection struct { + IP string + Port uint16 + ConnectTimeout time.Duration + ReadTimeout time.Duration + conn net.Conn +} + +func init() { + gnet.RegisterMessage(gnet.MessagePrefixFromString("INTR"), daemon.IntroductionMessage{}) +} + +// NewConnection constructs new connection +func NewConnection(addr string, connectTimeout, readTimeout time.Duration) (*Connection, error) { + ip, port, err := iputil.SplitAddr(addr) + if err != nil { + return nil, err + } + + return &Connection{ + IP: ip, + Port: port, + ConnectTimeout: connectTimeout, + ReadTimeout: readTimeout, + }, nil +} + +// Connect tries to connect to the node +func (c *Connection) Connect() error { + conn, err := net.DialTimeout("tcp", + fmt.Sprintf("%s:%v", c.IP, c.Port), c.ConnectTimeout) + if err != nil { + return err + } + + c.conn = conn + + return nil +} + +// TryReadIntroductionMessage tries to read the introduction message from the peer. If +// it succeeds - returns the received message for further processing +func (c *Connection) TryReadIntroductionMessage() (*daemon.IntroductionMessage, error) { + reader := bufio.NewReader(c.conn) + buf := make([]byte, 1024) + buffer := &bytes.Buffer{} + + for { + if err := c.conn.SetReadDeadline(time.Now().Add(c.ReadTimeout)); err != nil { + return nil, err + } + + bytesWritten, err := writeToBuffer(buffer, reader, buf) + if err != nil { + return nil, err + } + if bytesWritten == 0 { + continue + } + + // decode data + msgBytes, err := fetchNextMessage(buffer, maxMessageLength) + if err != nil { + return nil, err + } + + if len(msgBytes) > 0 { + m, err := convertToMessage(msgBytes) + if err != nil { + return nil, err + } + + introductionMessage, ok := m.(*daemon.IntroductionMessage) + if !ok { + // TODO: fix error message + return nil, fmt.Errorf("wrong message") + } + + return introductionMessage, nil + } + } +} + +// Disconnect disconnects from the peer +func (c *Connection) Disconnect() error { + return c.conn.Close() +} + +// writeToBuffer reads from `src` and writes the received data to `dst`. Reuses `buf` +// to avoid reallocations +func writeToBuffer(dst *bytes.Buffer, src io.Reader, buf []byte) (int, error) { + c, err := src.Read(buf) + if err != nil { + return 0, err + } + if c == 0 { + return 0, nil + } + + return dst.Write(buf[:c]) +} + +// convertToMessage converts the byte array to the gnet.Message +func convertToMessage(msg []byte) (gnet.Message, error) { + msgID := [4]byte{} + if len(msg) < len(msgID) { + return nil, gnet.ErrDisconnectTruncatedMessageID + } + + copy(msgID[:], msg[:len(msgID)]) + + msg = msg[len(msgID):] + t, ok := gnet.MessageIDReverseMap[msgID] + if !ok { + return nil, gnet.ErrDisconnectUnknownMessage + } + + v := reflect.New(t) + m, ok := (v.Interface()).(gnet.Message) + if !ok { + return nil, errors.New("MessageIdMaps contain non-Message") + } + + used, err := deserializeMessage(msg, v) + if err != nil { + return nil, gnet.ErrDisconnectMalformedMessage + } + + if used != uint64(len(msg)) { + return nil, gnet.ErrDisconnectMessageDecodeUnderflow + } + + return m, nil +} + +// deserializeMessage wraps Serializer.Decode and traps panics as an error +func deserializeMessage(msg []byte, v reflect.Value) (n uint64, err error) { + defer func() { + if r := recover(); r != nil { + switch x := r.(type) { + case string: + err = errors.New(x) + case error: + err = x + default: + err = errors.New("message deserialization failed") + } + } + }() + + iface := v.Interface() + x, ok := iface.(gnet.Serializer) + if !ok { + return 0, errors.New("deserializeMessage object does not have Serializer interface") + } + + return x.Decode(msg) +} + +// fetchNextMessage retrieves single message from `buf` if any +func fetchNextMessage(buf *bytes.Buffer, maxMsgLength int) ([]byte, error) { + var data []byte + + if buf.Len() > messagePrefixLength { + prefix := buf.Bytes()[:messagePrefixLength] + // decode message length + tmpLength, _, err := encoder.DeserializeUint32(prefix) + if err != nil { + return nil, err + } + + length := int(tmpLength) + + // Disconnect if we received an invalid length + if length < messagePrefixLength || length > maxMsgLength { + return []byte{}, gnet.ErrDisconnectInvalidMessageLength + } + + if buf.Len()-messagePrefixLength < length { + return []byte{}, nil + } + + buf.Next(messagePrefixLength) // strip the length prefix + data = make([]byte, length) + _, err = buf.Read(data) + if err != nil { + return []byte{}, err + } + } + + return data, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/cmd/monitor-peers/monitor-peers.go b/vendor/github.com/SkycoinProject/skycoin/cmd/monitor-peers/monitor-peers.go new file mode 100644 index 00000000..35ec73ac --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/cmd/monitor-peers/monitor-peers.go @@ -0,0 +1,306 @@ +/* +monitor-peers checks the status of peers. + +It takes in a list of peers (ip:ports, newline separated, skipping comments and empty lines). +The tool connects to each of the peers, waits for the introduction packet (or times out) +and produces a report with the status of the peer (unreachable, reachable, sent_introduction, introduction_parameters). +Introduction_parameters were added in v0.25.0 so will be absent for earlier peer versions. +*/ +package main + +import ( + "flag" + "fmt" + "io/ioutil" + "net" + "os" + "regexp" + "strconv" + "strings" + "time" + + "github.com/sirupsen/logrus" + + "github.com/SkycoinProject/skycoin/cmd/monitor-peers/connection" + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/daemon" + "github.com/SkycoinProject/skycoin/src/daemon/pex" + "github.com/SkycoinProject/skycoin/src/util/logging" +) + +// PeerState is a current state of the peer +type PeerState string + +const ( + // StateUnreachable is set when a peer couldn't be reached + StateUnreachable = "unreachable" + // StateReachable is set when a connection to the peer was successful + StateReachable = "reachable" + // StateSentIntroduction is set when an introduction message was received from the peer + // and successfully parsed + StateSentIntroduction = "introduced" +) + +// Report contains remote `peers.txt` report data. +type Report []ReportEntry + +// ReportEntry contains report data of a peer. +type ReportEntry struct { + Address string + State PeerState + Introduction *daemon.IntroductionMessage + IntroValidationErr error +} + +func (re ReportEntry) String() string { + uaCoin := "-" + uaVersion := "-" + uaRemark := "-" + verifyTxBurnFactor := "-" + verifyTxMaxTxSize := "-" + verifyTxMaxDropletPrecision := "-" + introValidationErr := "-" + + if re.Introduction != nil { + if re.Introduction.UserAgent.Coin != "" { + uaCoin = re.Introduction.UserAgent.Coin + } + if re.Introduction.UserAgent.Version != "" { + uaVersion = re.Introduction.UserAgent.Version + } + if re.Introduction.UserAgent.Remark != "" { + uaRemark = re.Introduction.UserAgent.Remark + } + + verifyTxBurnFactor = strconv.FormatUint(uint64(re.Introduction.UnconfirmedVerifyTxn.BurnFactor), 10) + verifyTxMaxTxSize = strconv.FormatUint(uint64(re.Introduction.UnconfirmedVerifyTxn.MaxTransactionSize), 10) + verifyTxMaxDropletPrecision = strconv. + FormatUint(uint64(re.Introduction.UnconfirmedVerifyTxn.MaxDropletPrecision), 10) + } + + if re.IntroValidationErr != nil { + introValidationErr = re.IntroValidationErr.Error() + } + + return fmt.Sprintf(reportFormat, re.Address, re.State, uaCoin, uaVersion, uaRemark, + verifyTxBurnFactor, verifyTxMaxTxSize, verifyTxMaxDropletPrecision, introValidationErr) +} + +// Append constructs the new report entry and appends it to the report +func (r Report) Append(addr string, state PeerState, introduction *daemon.IntroductionMessage, + introValidationErr error) Report { + entry := ReportEntry{ + Address: addr, + State: state, + IntroValidationErr: introValidationErr, + Introduction: introduction, + } + + return append(r, entry) +} + +const ( + blockchainPubKey = "0328c576d3f420e7682058a981173a4b374c7cc5ff55bf394d3cf57059bbe6456a" + defaultConnectTimeout = "1s" + defaultReadTimeout = "1s" + defaultPeersFile = "peers.txt" + addrWidth = "25" + stateWidth = "15" + uaCoinWidth = "10" + uaVersionWidth = "10" + uaRemarkWidth = "10" + verifyTxBurnFactorWidth = "10" + verifyTxMaxTxSizeWidth = "10" + verifyTxMaxDropletPrecisionWidth = "20" + reportFormat = "%-" + addrWidth + "s\t%-" + stateWidth + "s\t%-" + uaCoinWidth + "s\t%-" + + uaVersionWidth + "s\t%-" + uaRemarkWidth + "s\t%-" + verifyTxBurnFactorWidth + "s\t%-" + + verifyTxMaxTxSizeWidth + "s\t%-" + verifyTxMaxDropletPrecisionWidth + "s\t%v\n" +) + +var ( + logger = logging.MustGetLogger("main") + // For removing inadvertent whitespace from addresses + whitespaceFilter = regexp.MustCompile(`\s`) + help = fmt.Sprintf(`monitor-peers checks the status of peers. + +By default it gets peers list from %s. May be overridden with -f flag. + +The default connect timeout is %s. May be overridden with -ctimeout flag. The timeout is parsed by time.ParseDuration. + +The default read timeout is %s. May be overridden with -rtimeout flag. The timeout is parsed by time.ParseDuration. + +It generates a report for each peer which contains the peer address and status. Status may be one of the following: + +- unreachable +No connection made. + +- reachable +Connection made, no introduction message received. + +- introduced +Connection made, introduction message received. +`, defaultPeersFile, defaultConnectTimeout, defaultReadTimeout) +) + +func init() { + flag.Usage = func() { + fmt.Fprintf(flag.CommandLine.Output(), "%s\n\nUsage of %s:\n", help, os.Args[0]) + flag.PrintDefaults() + } +} + +func main() { + peersFile := flag.String("f", defaultPeersFile, "file containing peers") + connectTimeoutStr := flag.String("ctimeout", defaultConnectTimeout, "connect timeout for each peer") + readTimeoutStr := flag.String("rtimeout", defaultReadTimeout, "read timeout for each peer") + + flag.Parse() + + connectTimeout, err := time.ParseDuration(*connectTimeoutStr) + if err != nil { + fmt.Fprintln(os.Stderr, "Bad connect timeout: ", *connectTimeoutStr) + os.Exit(1) + } + + logger.Infof("Peer connection threshold is %v", connectTimeout) + + readTimeout, err := time.ParseDuration(*readTimeoutStr) + if err != nil { + fmt.Fprintln(os.Stderr, "Bad read timeout: ", *readTimeoutStr) + os.Exit(1) + } + + logger.Infof("Peer read threshold is %v", readTimeout) + + peers, err := getPeersListFromFile(*peersFile) + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + + report := getPeersReport(peers, connectTimeout, readTimeout) + logger.Infof("Report:\n%v", buildReport(report)) +} + +// getPeersListFromFile parses a local `filePath` file +// The peers list format is newline separated list of ip:port strings +// Empty lines and lines that begin with # are treated as comment lines +// Otherwise, the line is parsed as an ip:port +// If the line fails to parse, an error is returned +// Localhost addresses are allowed if allowLocalhost is true +func getPeersListFromFile(filePath string) ([]string, error) { + body, err := ioutil.ReadFile(filePath) + if err != nil { + return nil, err + } + + var peers []string + for _, addr := range strings.Split(string(body), "\n") { + addr = whitespaceFilter.ReplaceAllString(addr, "") + if addr == "" { + continue + } + + if strings.HasPrefix(addr, "#") { + continue + } + + a, err := validateAddress(addr, true) + if err != nil { + err = fmt.Errorf("peers list has invalid address %s: %v", addr, err) + logger.WithError(err).Error() + return nil, err + } + + peers = append(peers, a) + } + + return peers, nil +} + +// getPeersReport loops through `peers`, connects to each and tries to read the introduction +// message. Builds and returns the report +func getPeersReport(peers []string, connectTimeout, readTimeout time.Duration) Report { + dc := daemon.NewDaemonConfig() + dc.BlockchainPubkey = cipher.MustPubKeyFromHex(blockchainPubKey) + + report := make(Report, 0, len(peers)) + + for _, addr := range peers { + conn, err := connection.NewConnection(addr, connectTimeout, readTimeout) + if err != nil { + logger.WithError(err).Error() + continue + } + + if err := conn.Connect(); err != nil { + report = report.Append(addr, StateUnreachable, nil, nil) + continue + } + + introduction, err := conn.TryReadIntroductionMessage() + if err != nil { + report = report.Append(addr, StateReachable, nil, nil) + continue + } + + if err := introduction.Verify(dc, logrus.Fields{ + "addr": addr, + }); err != nil { + report = report.Append(addr, StateSentIntroduction, introduction, err) + continue + } + + report = report.Append(addr, StateSentIntroduction, introduction, nil) + + if err := conn.Disconnect(); err != nil { + logger.WithError(err).Error() + } + } + + return report +} + +// buildReport builds a report to a string output +func buildReport(report Report) string { + var sb strings.Builder + + sb.WriteString(fmt.Sprintf(reportFormat, "Address", "Status", "Coin", "Version", "Remark", + "Burn factor", "Max tx size", "Max droplet precision", "Intro validation error")) + for _, entry := range report { + sb.WriteString(entry.String()) + } + + return sb.String() +} + +// validateAddress returns a sanitized address if valid, otherwise an error +func validateAddress(ipPort string, allowLocalhost bool) (string, error) { + ipPort = whitespaceFilter.ReplaceAllString(ipPort, "") + pts := strings.Split(ipPort, ":") + if len(pts) != 2 { + return "", pex.ErrInvalidAddress + } + + ip := net.ParseIP(pts[0]) + if ip == nil { + return "", pex.ErrInvalidAddress + } else if ip.IsLoopback() { + if !allowLocalhost { + return "", pex.ErrNoLocalhost + } + } else if !ip.IsGlobalUnicast() { + return "", pex.ErrNotExternalIP + } + + port, err := strconv.ParseUint(pts[1], 10, 16) + if err != nil { + return "", pex.ErrInvalidAddress + } + + if port < 1024 { + return "", pex.ErrPortTooLow + } + + return ipPort, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/cmd/newcoin/README.md b/vendor/github.com/SkycoinProject/skycoin/cmd/newcoin/README.md new file mode 100644 index 00000000..8b14e071 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/cmd/newcoin/README.md @@ -0,0 +1,69 @@ +# Fiber Coin Creator CLI Documention +This tool can be used to create a new fiber coin easily from a config file. +- [Install](#install) + - [Usage](#usage) + - [Create New Coin](#create-new-coin) + - [Example](#example) + +## Install + +```bash +$ cd $GOPATH/src/github.com/SkycoinProject/skycoin/cmd/newcoin +$ go install ./... +``` + +## Usage + +After the installation, you can run `newcoin` to see the usage: + +``` +$ newcoin + +NAME: + newcoin - newcoin is a helper tool for creating new fiber coins + +USAGE: + newcoin [global options] command [command options] [arguments...] + +VERSION: + 0.1 + +COMMANDS: + createcoin Create a new coin from a template file + help, h Shows a list of commands or help for one command + +GLOBAL OPTIONS: + --help, -h show help + --version, -v print the version +``` + +### Create New Coin +When using the `newcoin` command, you should run it from the `$GOPATH/src/github.com/SkycoinProject/skycoin` folder to utilise the built in default templates. + +```bash +$ cd $GOPATH/src/github.com/SkycoinProject/skycoin +$ newcoin createcoin [command options] +``` + +``` +OPTIONS: + --coin value name of the coin to create (default: "skycoin") + --template-dir value, --td value template directory path (default: "./template") + --coin-template-file value, --ct value coin template file (default: "coin.template") + --visor-template-file value, --vt value visor template file (default: "visor_parameters.template") + --config-dir value, --cd value config directory path (default: "./") + --config-file value, --cf value config file path (default: "fiber.toml") +``` + +#### Example +Create a test coin using application defaults. + +```bash +$ cd $GOPATH/src/github.com/SkycoinProject/skycoin +$ newcoin createcoin --coin testcoin +``` + +This will create a new directory, `testcoin`, in `cmd` folder and a `testcoin.go` file inside that folder. +It will also use the built-in defaul options (specified above) and draw template configuration from `$GOPATH/src/github.com/SkycoinProject/skycoin/template` + +This file can be used to run a "testcoin" node. diff --git a/vendor/github.com/SkycoinProject/skycoin/cmd/newcoin/newcoin.go b/vendor/github.com/SkycoinProject/skycoin/cmd/newcoin/newcoin.go new file mode 100644 index 00000000..db434610 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/cmd/newcoin/newcoin.go @@ -0,0 +1,231 @@ +/* +newcoin generates a new coin cmd from a toml configuration file +*/ +package main + +import ( + "fmt" + "regexp" + + "os" + "path/filepath" + "text/template" + + "github.com/urfave/cli" + + "github.com/SkycoinProject/skycoin/src/fiber" + "github.com/SkycoinProject/skycoin/src/util/logging" + "github.com/SkycoinProject/skycoin/src/util/useragent" +) + +const ( + // Version is the cli version + Version = "0.1" +) + +var ( + app = cli.NewApp() + log = logging.MustGetLogger("newcoin") +) + +func init() { + app.Name = "newcoin" + app.Usage = "newcoin is a helper tool for creating new fiber coins" + app.Version = Version + commands := cli.Commands{ + createCoinCommand(), + } + + app.Commands = commands + app.EnableBashCompletion = true + app.OnUsageError = func(context *cli.Context, err error, _ bool) error { + fmt.Fprintf(context.App.Writer, "error: %v\n\n", err) + return cli.ShowAppHelp(context) + } + app.CommandNotFound = func(_ *cli.Context, command string) { + tmp := fmt.Sprintf("{{.HelpName}}: '%s' is not a {{.HelpName}} "+ + "command. See '{{.HelpName}} --help'. \n", command) + cli.HelpPrinter(app.Writer, tmp, app) + } +} + +func createCoinCommand() cli.Command { + name := "createcoin" + return cli.Command{ + Name: name, + Usage: "Create a new coin from a template file", + Flags: []cli.Flag{ + cli.StringFlag{ + Name: "coin", + Usage: "name of the coin to create", + Value: "skycoin", + }, + cli.StringFlag{ + Name: "template-dir, td", + Usage: "template directory path", + Value: "./template", + }, + cli.StringFlag{ + Name: "coin-template-file, ct", + Usage: "coin template file", + Value: "coin.template", + }, + cli.StringFlag{ + Name: "coin-test-template-file, ctt", + Usage: "coin test template file", + Value: "coin_test.template", + }, + cli.StringFlag{ + Name: "params-template-file, pt", + Usage: "params template file", + Value: "params.template", + }, + cli.StringFlag{ + Name: "config-dir, cd", + Usage: "config directory path", + Value: "./", + }, + cli.StringFlag{ + Name: "config-file, cf", + Usage: "config file path", + Value: "fiber.toml", + }, + }, + Action: func(c *cli.Context) error { + // -- parse flags -- // + + coinName := c.String("coin") + + if err := validateCoinName(coinName); err != nil { + return err + } + + templateDir := c.String("template-dir") + + coinTemplateFile := c.String("coin-template-file") + coinTestTemplateFile := c.String("coin-test-template-file") + paramsTemplateFile := c.String("params-template-file") + + // check that the coin template file exists + if _, err := os.Stat(filepath.Join(templateDir, coinTemplateFile)); os.IsNotExist(err) { + return err + } + // check that the coin test template file exists + if _, err := os.Stat(filepath.Join(templateDir, coinTestTemplateFile)); os.IsNotExist(err) { + return err + } + // check that the params template file exists + if _, err := os.Stat(filepath.Join(templateDir, paramsTemplateFile)); os.IsNotExist(err) { + return err + } + + configFile := c.String("config-file") + configDir := c.String("config-dir") + + configFilepath := filepath.Join(configDir, configFile) + // check that the config file exists + if _, err := os.Stat(configFilepath); os.IsNotExist(err) { + return err + } + + // -- parse template and create new coin.go and config blockchain.go -- // + + config, err := fiber.NewConfig(configFile, configDir) + if err != nil { + log.Errorf("failed to create new fiber coin config") + return err + } + + coinDir := fmt.Sprintf("./cmd/%s", coinName) + // create new coin directory + // MkdirAll does not error out if the directory already exists + err = os.MkdirAll(coinDir, 0750) + if err != nil { + log.Errorf("failed to create new coin directory %s", coinDir) + return err + } + + // we have to always create a new file otherwise the templating gives an error + coinFilePath := fmt.Sprintf("./cmd/%[1]s/%[1]s.go", coinName) + coinFile, err := os.Create(coinFilePath) + if err != nil { + log.Errorf("failed to create new coin file %s", coinFilePath) + return err + } + defer coinFile.Close() + + coinTestFilePath := fmt.Sprintf("./cmd/%[1]s/%[1]s_test.go", coinName) + coinTestFile, err := os.Create(coinTestFilePath) + if err != nil { + log.Errorf("failed to create new coin test file %s", coinTestFilePath) + return err + } + defer coinTestFile.Close() + + paramsFilePath := "./src/params/params.go" + paramsFile, err := os.Create(paramsFilePath) + if err != nil { + log.Errorf("failed to create new file %s", paramsFilePath) + return err + } + defer paramsFile.Close() + + // change dir so that text/template can parse the file + err = os.Chdir(templateDir) + if err != nil { + log.Errorf("failed to change directory to %s", templateDir) + return err + } + + templateFiles := []string{ + coinTemplateFile, + coinTestTemplateFile, + paramsTemplateFile, + } + + t := template.New(coinTemplateFile) + t, err = t.ParseFiles(templateFiles...) + if err != nil { + log.Errorf("failed to parse template files: %v", templateFiles) + return err + } + + config.Node.CoinName = coinName + config.Node.DataDirectory = "$HOME/." + coinName + + err = t.ExecuteTemplate(coinFile, coinTemplateFile, config.Node) + if err != nil { + log.Error("failed to parse coin template variables") + return err + } + + err = t.ExecuteTemplate(coinTestFile, coinTestTemplateFile, nil) + if err != nil { + log.Error("failed to parse coin test template variables") + return err + } + + err = t.ExecuteTemplate(paramsFile, paramsTemplateFile, config.Params) + if err != nil { + log.Error("failed to parse params template variables") + return err + } + + return nil + }, + } +} + +func validateCoinName(s string) error { + x := regexp.MustCompile(fmt.Sprintf(`^%s$`, useragent.NamePattern)) + if !x.MatchString(s) { + return fmt.Errorf("invalid coin name. must only contain the characters %s", useragent.NamePattern) + } + return nil +} + +func main() { + if e := app.Run(os.Args); e != nil { + log.Fatal(e) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/cmd/skycoin-cli/README.md b/vendor/github.com/SkycoinProject/skycoin/cmd/skycoin-cli/README.md new file mode 100644 index 00000000..c7ad94b7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/cmd/skycoin-cli/README.md @@ -0,0 +1,3132 @@ +# CLI Documentation + +Skycoin command line interface + +The CLI command APIs can be used directly from a Go application, see [Skycoin CLI Godoc](https://godoc.org/github.com/SkycoinProject/skycoin/src/cli). + + + +- [Install](#install) +- [Environment Settings](#environment-settings) + - [RPC_ADDR](#rpc_addr) + - [RPC_USER](#rpc_user) + - [RPC_PASS](#rpc_pass) +- [Usage](#usage) + - [Add Private Key](#add-private-key) + - [Check address balance](#check-address-balance) + - [Generate addresses](#generate-addresses) + - [Generate distribution addresses for a new fiber coin](#generate-distribution-addresses-for-a-new-fiber-coin) + - [Check address outputs](#check-address-outputs) + - [Check block data](#check-block-data) + - [Check database integrity](#check-database-integrity) + - [Create a raw transaction](#create-a-raw-transaction) + - [Create an unsigned raw transaction](#create-an-unsigned-raw-transaction) + - [Sign an unsigned raw transaction](#sign-an-unsigned-raw-transaction) + - [Decode a raw transaction](#decode-a-raw-transaction) + - [Encode a JSON transaction](#encode-a-json-transaction) + - [Broadcast a raw transaction](#broadcast-a-raw-transaction) + - [Create a wallet](#create-a-wallet) + - [Add addresses to a wallet](#add-addresses-to-a-wallet) + - [Export a specific key from an HD wallet](#export-a-specific-key-from-an-hd-wallet) + - [Encrypt Wallet](#encrypt-wallet) + - [Examples](#examples) + - [Decrypt Wallet](#decrypt-wallet) + - [Example](#example) + - [Last blocks](#last-blocks) + - [List wallet addresses](#list-wallet-addresses) + - [List wallets](#list-wallets) + - [Rich list](#rich-list) + - [Send](#send) + - [Show Seed](#show-seed) + - [Show Config](#show-config) + - [Status](#status) + - [Get transaction](#get-transaction) + - [Get address transactions](#get-address-transactions) + - [Verify address](#verify-address) + - [Check wallet balance](#check-wallet-balance) + - [List wallet transaction history](#list-wallet-transaction-history) + - [List wallet outputs](#list-wallet-outputs) + - [Richlist](#richlist) + - [Address Count](#address-count) + - [CLI version](#cli-version) + - [Distribute coins from genesis block](#distribute-coins-from-genesis-block) + + + + +## Install + +```bash +$ cd $GOPATH/src/github.com/SkycoinProject/skycoin/cmd/skycoin-cli +$ go install ./... +``` + +## Environment Settings + +The CLI uses environment variable to manage the configurations. + +### RPC_ADDR + +CLI will connect to skycoin node REST API address `http://127.0.0.1:6420` by default. +You can change the address by setting the `RPC_ADDR` environment variable +with the following command: + +```bash +$ export RPC_ADDR=http://127.0.0.1:6420 +``` + +Note: `RPC_ADDR` must be in `scheme://host` format. + +### RPC_USER + +A username for authenticating requests to the skycoin node. + +```bash +$ export RPC_USER=... +``` + +### RPC_PASS + +A password for authenticating requests to the skycoin node. + +```bash +$ export RPC_PASS=... +``` + +## Usage + +After the installation, you can run `skycoin-cli` to see the usage: + +``` +$ skycoin-cli + +USAGE: + skycoin-cli [command] [flags] [arguments...] + +DESCRIPTION: + The skycoin command line interface + +COMMANDS: + addPrivateKey Add a private key to wallet + addressBalance Check the balance of specific addresses + addressGen Generate skycoin or bitcoin addresses + addressOutputs Display outputs of specific addresses + addressTransactions Show detail for transaction associated with one or more specified addresses + addresscount Get the count of addresses with unspent outputs (coins) + blocks Lists the content of a single block or a range of blocks + broadcastTransaction Broadcast a raw transaction to the network + checkDBDecoding Verify the database data encoding + checkdb Verify the database + createRawTransaction Create a raw transaction that can be broadcast to the network later + decodeRawTransaction Decode raw transaction + decryptWallet Decrypt a wallet + distributeGenesis Distributes the genesis block coins into the configured distribution addresses + encodeJsonTransaction Encode JSON transaction + encryptWallet Encrypt wallet + fiberAddressGen Generate addresses and seeds for a new fiber coin + help Help about any command + lastBlocks Displays the content of the most recently N generated blocks + listAddresses Lists all addresses in a given wallet + listWallets Lists all wallets stored in the wallet directory + pendingTransactions Get all unconfirmed transactions + richlist Get skycoin richlist + send Send skycoin from a wallet or an address to a recipient address + showConfig Show cli configuration + showSeed Show wallet seed and seed passphrase + status Check the status of current Skycoin node + transaction Show detail info of specific transaction + verifyAddress Verify a skycoin address + verifyTransaction Verify if the specific transaction is spendable + version List the current version of Skycoin components + walletAddAddresses Generate additional addresses for a deterministic, bip44 or xpub wallet + walletBalance Check the balance of a wallet + walletCreate Create a new wallet + walletHistory Display the transaction history of specific wallet. Requires skycoin node rpc. + walletKeyExport Export a specific key from an HD wallet + walletOutputs Display outputs of specific wallet + +FLAGS: + -h, --help help for skycoin-cli + --version version for skycoin-cli + +Use "skycoin-cli [command] --help" for more information about a command. + +ENVIRONMENT VARIABLES: + RPC_ADDR: Address of RPC node. Must be in scheme://host format. Default "http://127.0.0.1:6420" + RPC_USER: Username for RPC API, if enabled in the RPC. + RPC_PASS: Password for RPC API, if enabled in the RPC. + COIN: Name of the coin. Default "skycoin" + DATA_DIR: Directory where everything is stored. Default "$HOME/.$COIN/" +``` + +### Add Private Key +Add a private key to a skycoin wallet. Wallet type must be "collection". + +```bash +$ skycoin-cli addPrivateKey [wallet] [private key] +``` + +``` +FLAGS: + -p, --password string Wallet password +``` + +#### Example +```bash +$ skycoin-cli addPrivateKey $WALLET_FILE $PRIVATE_KEY +``` + +``` +$ success +``` + +### Check address balance +Check balance of specific addresses, join multiple addresses with space. + +```bash +$ skycoin-cli addressBalance [addresses] +``` + +#### Example +```bash +$ skycoin-cli addressBalance 2iVtHS5ye99Km5PonsB42No3pQRGEURmxyc 2GgFvqoyk9RjwVzj8tqfcXVXB4orBwoc9qv +``` +
+ View Output + +```json +{ + "confirmed": { + "coins": "324951.932000", + "hours": "166600293" + }, + "spendable": { + "coins": "324951.932000", + "hours": "166600293" + }, + "expected": { + "coins": "324951.932000", + "hours": "166600293" + }, + "addresses": [ + { + "confirmed": { + "coins": "2.000000", + "hours": "1158" + }, + "spendable": { + "coins": "2.000000", + "hours": "1158" + }, + "expected": { + "coins": "2.000000", + "hours": "1158" + }, + "address": "2iVtHS5ye99Km5PonsB42No3pQRGEURmxyc" + }, + { + "confirmed": { + "coins": "324949.932000", + "hours": "166599135" + }, + "spendable": { + "coins": "324949.932000", + "hours": "166599135" + }, + "expected": { + "coins": "324949.932000", + "hours": "166599135" + }, + "address": "2GgFvqoyk9RjwVzj8tqfcXVXB4orBwoc9qv" + } + ] +} +``` +
+ +### Generate addresses +Generate skycoin or bitcoin addresses. + +```bash +$ skycoin-cli addressGen [flags] +``` + +``` +FLAGS: + -c, --coin string Coin type. Must be skycoin or bitcoin. If bitcoin, secret keys are in Wallet Import Format instead of hex. (default "skycoin") + -x, --encrypt Encrypt the wallet when printing a JSON wallet + -e, --entropy int Entropy of the autogenerated bip39 seed, when the seed is not provided. Can be 128 or 256 (default 128) + --hex Use hex(sha256sum(rand(1024))) (CSPRNG-generated) as the seed if not seed is not provided + -i, --hide-secrets Hide the secret key and seed from the output when printing a JSON wallet file + -l, --label string Wallet label to use when printing or writing a wallet file + -m, --mode string Output mode. Options are wallet (prints a full JSON wallet), addresses (prints addresses in plain text), secrets (prints secret keys in plain text) (default "wallet") + -n, --num int Number of addresses to generate (default 1) + -s, --seed string Seed for deterministic key generation. Will use bip39 as the seed if not provided. + -t, --strict-seed Seed should be a valid bip39 mnemonic seed. +``` + +#### Examples +##### Generate `n` number of skycoin addresses +```bash +$ skycoin-cli addressGen --num 2 +``` + +
+ View Output + +```json +{ + "meta": { + "coin": "skycoin", + "seed": "genius canyon asset swallow picture torch awkward radar nest bunker walnut garage" + }, + "entries": [ + { + "address": "2KC8vSgNXVZ6GMYY8edUqvRsbupZVwWKETe", + "public_key": "0215682c10f6293bf52c543787613e898f4e4af70aa87eac8848b0535d8b8c05f1", + "secret_key": "31d6f561dad49f2c60c02a97395a2f3df67bb9e092806356ddbb952556c96e82" + }, + { + "address": "yzkv7v2T4fbQmZKdiLcq8tAHEVrVbrvGvh", + "public_key": "02dc8409077376bc8a834185739133f47805764f061103c88a4b5b0d2809b310b7", + "secret_key": "3ba5855ad3b1ec7e02918d5329dc5425690a93331514370d739f58556236c1ce" + } + ] +} +``` +
+ + +##### Generate `n` number of bitcoin addresses +```bash +$ skycoin-cli addressGen --num 2 --coin bitcoin +``` + +
+ View Output + +```json +{ + "meta": { + "coin": "bitcoin", + "seed": "sun resemble crisp clerk square initial like urge abstract picnic impulse robot" + }, + "entries": [ + { + "address": "15FW6YEZuwr68h54DrXD3Tv1Cc1aKHoynF", + "public_key": "024529a5b1f1c110dd122598052115717a7a042b4831acbf234fe01968f82d1312", + "secret_key": "L3crKysGdHmKQ2j27wfgew4timWiUrPxwUi8FNE75S872C1K9pns" + }, + { + "address": "1EBKC7u29ea1jPtEoC5LLMcXwpZBTmFxhs", + "public_key": "03faaff073f752cafccb3f639b2174e6c48b04a24cbdefafbfdbda2f54ba5e81a9", + "secret_key": "KxomKUvagGTviuxAr9HNRfXEaim4evvFJVGmuk2LYA5ZLXznvX6k" + } + ] +} +``` +
+ +##### Hide secret in output +```bash +$ skycoin-cli addressGen --num 2 --hide-secrets +``` + +
+ View Output + +```json +{ + "meta": { + "coin": "skycoin", + "seed": "walnut wise pluck sniff weird enable document special soul era mercy you" + }, + "entries": [ + { + "address": "27ohsY7Hg5dEDySUg17gStEQRzLFxE8mVrU", + "public_key": "02ead2834f41f91dd3847924f6257b2b852390708cd2c91db80f017fd21f9768af", + "secret_key": "" + }, + { + "address": "2FHuME9U7CEN3vWwwRzJAgP4K2JKPfoRxzp", + "public_key": "03af027c379b380c009cbefc3b251e7b42af9753125a8d9ef0a50249e97060c673", + "secret_key": "" + } + ] +} +``` +
+ +##### Output only an address list +```bash +$ skycoin-cli addressGen --num 2 --mode addresses +``` + +``` +7HVmKni3ggMdtseynSkNkqoCnsH7vkS6cg +2j5QSbHgLWXA2qXZvLzJHRo6Cissxer4CSt +``` + +> NOTE: If no seed is provided with the `--seed flag` and `--hex` flag is not used then bip39 is used to generate a seed + +##### Use a predefined seed value +```bash +$ skycoin-cli addressGen --num 2 --seed "my super secret seed" +``` + +
+ View Output + +```json +{ + "meta": { + "coin": "skycoin", + "seed": "my super secret seed" + }, + "entries": [ + { + "address": "NMwevFV1NhPSp8H4QHPQyDuKCkLjsQ5zRb", + "public_key": "03a0571ef3ac621aa1fe950753110187bd096a32cc791f227406badbc21676743c", + "secret_key": "0977909e18ef6b3dbc522e79c26c3113ab6d4ae7a9f4a848dcd49e5b4634a77c" + }, + { + "address": "a1ec9zaxj5ndhteyJeocdhYFLHfvm86UPG", + "public_key": "021990611d33bdc3ca70da07b1e4f8a1928a6cb369fb343d4b2ce0c0b123273387", + "secret_key": "e08dd4de4920edc1ae5aa2260167657e64a5ff146b90d21fb1a39294c94c940c" + } + ] +} +``` +
+ +##### Generate addresses with a hex (CSPRNG-generated) seed +```bash +skycoin-cli addressGen --num 2 --hex +``` + +
+ View Output + +```json +{ + "meta": { + "coin": "skycoin", + "seed": "d5fa95cc3bd265c9ef99e7c2b300f0ede75375fbb76b2329bd5877631c315068" + }, + "entries": [ + { + "address": "2URMzEQ2A1xuf3GGN6Tr8tucCzJKYVpj9Fz", + "public_key": "03d5e38c96829dbc8b873822ba29ebb7cf5c8c32c386348f032d523f0640c31640", + "secret_key": "e0eccbd416b9fb8a109426681e890362a24491072edd8275a29b1878874fc9b4" + }, + { + "address": "2Qct8BmaCvMfPUnMCtTj5sMLNNoLbshAxoe", + "public_key": "0241404173e29d9ae4a16c6496baff72cfd94fca16c727b7b1192bdeb736ced278", + "secret_key": "972c0596a442d495fda1bba055df6334aa0121376248f19194ddc602368bda30" + } + ] +} +``` +
+ +### Generate distribution addresses for a new fiber coin +```bash +skycoin-cli fiberAddressGen [flags] +``` + +``` +DESCRIPTION: + Addresses are written in a format that can be copied into fiber.toml + for configuring distribution addresses. Addresses along with their seeds are written to a csv file, + these seeds can be imported into the wallet to access distribution coins. + +FLAGS: + -a, --addres-file string Output file for the generated addresses in fiber.toml format (default "addresses.txt") + -e, --entropy int Entropy of the autogenerated bip39 seeds. Can be 128 or 256 (default 128) + -n, --num int Number of addresses to generate (default 100) + -o, --overwrite Allow overwriting any existing addrs-file or seeds-file + -s, --seeds-file string Output file for the generated addresses and seeds in a csv (default "seeds.csv") +``` + + +#### Examples +```bash +skycoin-cli fiberAddressGen +``` + +### Check address outputs +Display outputs of specific addresses, join multiple addresses with space. + +```bash +$ skycoin-cli addressOutputs [address list] +``` + +#### Example +```bash +skycoin-cli addressOutputs tWPDM36ex9zLjJw1aPMfYTVPbYgkL2Xp9V 29fDBQuJs2MDLymJsjyWH6rDjsyv995SrGU +``` + +
+ View Output + +```json +{ + "outputs": { + "head_outputs": [ + { + "hash": "f5f838edf75b68882cacb7fa071538bcf800515d5a7f42e3a8c5e6d681879a82", + "time": 1522603686, + "block_seq": 20256, + "src_tx": "cd0725e9cfc23cfed279aeda70b765238d0cc282406c48f811c6ad2874593f03", + "address": "tWPDM36ex9zLjJw1aPMfYTVPbYgkL2Xp9V", + "coins": "0.500000", + "hours": 43, + "calculated_hours": 122 + }, + { + "hash": "b2182ec3481f7af9884e4839016a145c07b66fce68c3b9ff04d897d1f1db5717", + "time": 1522603586, + "block_seq": 20255, + "src_tx": "48b385567796725212ed8195a9437b15d5cd82186205b9d8fd027fa75f98060e", + "address": "tWPDM36ex9zLjJw1aPMfYTVPbYgkL2Xp9V", + "coins": "0.500000", + "hours": 173, + "calculated_hours": 252 + }, + { + "hash": "86ba8131756b4db5e163d38aa119ff07e4bd3fe05bbf3c28cef8471648d77080", + "time": 1517145975, + "block_seq": 12675, + "src_tx": "ad191f910e5508e0b0e0ab24ba815e784a1a2b63ca21043e7746bebf25106742", + "address": "tWPDM36ex9zLjJw1aPMfYTVPbYgkL2Xp9V", + "coins": "1.000000", + "hours": 1232, + "calculated_hours": 2906 + } + ], + "outgoing_outputs": [], + "incoming_outputs": [] + } +} +``` +
+ +### Check block data +Lists the content of a single block or a range of blocks + +```bash +$ skycoin-cli blocks [starting block or single block seq] [ending block seq] +``` + +#### Example +```bash +$ skycoin-cli blocks 41 42 +``` + +
+ View Output + +```json +{ + "blocks": [ + { + "header": { + "seq": 41, + "block_hash": "08f89cfe92be09e9848ba4d77c300908761354933f80401c107644feab1f4c9e", + "previous_block_hash": "fad5aca57144cbc86ad916492e814ec84c825d9870a86beac81980de30b0ae60", + "timestamp": 1429058524, + "fee": 4561, + "version": 0, + "tx_body_hash": "cf4fe76a08e3296b6f6abdb949604409be66574f211d9d14fde39103c4cfe1d6", + "ux_hash": "d3f60f0d20aeac951aacab8d849696cac54c7057da741cfd90b63018100818d0" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "cf4fe76a08e3296b6f6abdb949604409be66574f211d9d14fde39103c4cfe1d6", + "inner_hash": "2f5942207104d52dbd6191684b2a97392e616b7fa51dde314dbddd58d34b8027", + "sigs": [ + "b2b8c8ec1e1dfdeac4690e88d4ef9fcc4b52fcb771153f391cbcb58d651505a94c6263b6dc15a948c0396c0d8be20d9e0d1993b494bd9189c778d3673363bfc401" + ], + "inputs": [ + "c65a9e6aa33244958e9595e9eceed678f9f17761753bf77000c5474f7696da53" + ], + "outputs": [ + { + "uxid": "195f5e50b4eed1ec7ff968feca90356285437adc8ccfcf6623b55a4eebf7bbb5", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "969790.000000", + "hours": 760 + }, + { + "uxid": "6bbf13da052e1baade111ae8bb85548732532c8f5286eba8345d436d315d1c93", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "9000.000000", + "hours": 760 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 42, + "block_hash": "60a17e0cf411e5db7150272e597d343beaa5fbce5d61f6f647a14288262593b1", + "previous_block_hash": "08f89cfe92be09e9848ba4d77c300908761354933f80401c107644feab1f4c9e", + "timestamp": 1429058594, + "fee": 292512, + "version": 0, + "tx_body_hash": "0e91a08561e85a36ddf44e77b9228f7d561c18c0b46d19083d4af511085b697e", + "ux_hash": "9173768496bc49e2a34d5a7ea65d05ad6507dfdb489836e861b3c03d35efeb7a" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "0e91a08561e85a36ddf44e77b9228f7d561c18c0b46d19083d4af511085b697e", + "inner_hash": "d78230e22b358d7cc8d491adb3c0ec1e77a5170602a4ec92d700c4b4bb101f98", + "sigs": [ + "17ba9c495e4d396a37eaf062e1806a13b3bdc91a83151c2455cf948a7e6d91882dc02ec6443970517f0f7daf59ce9b89658a17f5d51c0cbc18056811d0f3006501", + "e4e8f28801fe461cc8097b29cfe1307739bdfbdd6b20c31e04eef89aede641a6407fa0c41b0ad5ef167e3255e1916c0bbd358ffd70f34dc7944ffe67514bc5f501" + ], + "inputs": [ + "f48432d381a10abecbd1357d81705ea922246e92170fe405d1a4a35c5ceef6a4", + "6bbf13da052e1baade111ae8bb85548732532c8f5286eba8345d436d315d1c93" + ], + "outputs": [ + { + "uxid": "19efa2bd8c59623a092612c511fb66333e2049a57d546269c19255852056fead", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "9000.000000", + "hours": 48752 + }, + { + "uxid": "9953e00abe05db134510693a44b8928ca9b29d0009b38d9c4f8dcdedee7edc35", + "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "1000.000000", + "hours": 48752 + } + ] + } + ] + }, + "size": 317 + } + ] +} +``` +
+ +### Check database integrity +Checks if the given database file contains valid skycoin blockchain data +If no argument is given, the default `data.db` in `$HOME/.$COIN/` will be checked. + +```bash +$ skycoin-cli checkdb [db path] +``` + +#### Example +```bash +$ skycoin-cli checkdb $DB_PATH +``` + +
+ View Output + +``` +check db success +``` +
+ +### Create a raw transaction +Create a raw transaction that can be broadcasted later. +A raw transaction is a binary encoded hex string. + +```bash +$ skycoin-cli createRawTransaction [wallet] [to address] [amount] [flags] +``` + +``` +FLAGS: + -c, --change-address string Specify the change address. + Defaults to one of the spending addresses (deterministic wallets) or to a new change address (bip44 wallets). + --csv string CSV file containing addresses and amounts to send + -a, --from-address string From address in wallet + -j, --json Returns the results in JSON format. + -m, --many string use JSON string to set multiple receive addresses and coins, + example: -m '[{"addr":"$addr1", "coins": "10.2"}, {"addr":"$addr2", "coins": "20"}]' + -p, --password string Wallet password +``` + +#### Examples +##### Sending to a single address from a specified wallet +```bash +$ skycoin-cli createRawTransaction $WALLET_FILE $RECIPIENT_ADDRESS $AMOUNT -a $FROM_ADDRESS +``` + +##### Sending to a specific change address + +```bash +$ skycoin-cli createRawTransaction $WALLET_FILE $RECIPIENT_ADDRESS $AMOUNT -a $FROM_ADDRESS -c $CHANGE_ADDRESS +``` + +
+ View Output + +``` +dc00000000c7425e5a49fce496d78ea9b04fc47e4126b91f675b00c16b3a7515c1555c252001000000115112dbb438b423dccd5f1afb7bce3d0cd4b87b57fd9fd3e5a26ee24e05fb696f0c7f3d6a84eafd80e051117162d790fa0e57c01a0e570b8ac0ae5faa5bf782000100000005e524872c838de517592c9a495d758b8ab2ec32d3e4d3fb131023a424386634020000000007445b5d6fbbb1a7d70bef941fb5da234a10fcae40420f000000000001000000000000000056500d41a1a6f1967ffe0074bb171148667ce20d0024f400000000009a05000000000000 +``` +
+ +##### Sending to multiple addresses +```bash +$ skycoin-cli createRawTransaction $WALLET_FILE -a $FROM_ADDRESS -m '[{"addr":"$ADDR1", "coins": "$AMT1"}, {"addr":"$ADDR2", "coins": "$AMT2"}]' +``` + +##### Sending to addresses in a CSV file +```bash +$ cat < $CSV_FILE +2Niqzo12tZ9ioZq5vwPHMVR4g7UVpp9TCmP,123.1 +2UDzBKnxZf4d9pdrBJAqbtoeH641RFLYKxd,456.045 +yExu4fryscnahAEMKa7XV4Wc1mY188KvGw,0.3 +EOF +$ skycoin-cli createRawTransaction $WALLET_FILE -a $FROM_ADDRESS --csv $CSV_FILE +``` + +
+ View Output + +``` +01010000000e2a5bf4964604006fea5cf8cbd705e82bebb055467f10681ef01ce5c8db654801000000d951d4e34a7b35b1b165e8302cd47e09b6433ea443a8864dc8428537dbe8b76e00ee58bb195d7de3d28935ed4fc3684f1cac5593c09c4bafb016705b7e2b3393000100000005e524872c838de517592c9a495d758b8ab2ec32d3e4d3fb131023a424386634030000000007445b5d6fbbb1a7d70bef941fb5da234a10fcae40420f000000000001000000000000000056500d41a1a6f1967ffe0074bb171148667ce20d40420f00000000000100000000000000008001532c3a705e7e62bb0bb80630ecc21a87ec09c0e1e400000000009a05000000000000 +``` +
+ +> NOTE: When sending to multiple addresses each combination of address and coins need to be unique + Otherwise you get, `ERROR: Duplicate output in transaction` + + +##### Generate a JSON output +```bash +$ skycoin-cli createRawTransaction $WALLET_FILE $RECIPIENT_ADDRESS $AMOUNT -a $FROM_ADDRESS --json +``` + +
+ View Output + +```json +{ + "rawtx": "dc00000000c7425e5a49fce496d78ea9b04fc47e4126b91f675b00c16b3a7515c1555c252001000000115112dbb438b423dccd5f1afb7bce3d0cd4b87b57fd9fd3e5a26ee24e05fb696f0c7f3d6a84eafd80e051117162d790fa0e57c01a0e570b8ac0ae5faa5bf782000100000005e524872c838de517592c9a495d758b8ab2ec32d3e4d3fb131023a424386634020000000007445b5d6fbbb1a7d70bef941fb5da234a10fcae40420f000000000001000000000000000056500d41a1a6f1967ffe0074bb171148667ce20d0024f400000000009a05000000000000" +} +``` +
+ +### Create an unsigned raw transaction + +```bash +$ skycoin-cli createRawTransactionV2 [wallet] [to address] [amount] [flags] +``` + +### Example + +```bash +$ skycoin-cli createRawTransactionV2 $WALLET_FILE $RECIPIENT_ADDRESS $AMOUNT --unsign +``` + +
+ View Output + +```json +b700000000e6b869f570e2bfebff1b4d7e7c9e86885dbc34d6de988da6ff998e7acd7e6e14010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000007531184ad0afeebbff2049b855e0921329cb1cb74d769ac57c057c9c8bd2b6810100000000ed5ea2ca4fe9b4560409b50c5bf7cb39b6c5ff6e50690f00000000000000000000000000 +``` + +
+ +### Sign an unsigned raw transaction + +```bash +$ skycoin-cli signTransaction [wallet] [raw transaction] +``` + +### Example + +```bash +$ skycoin-cli signTransaction $WALLET_FILE $RAW_TRANSACTION +``` + +
+ View Output + +```json +b700000000e6b869f570e2bfebff1b4d7e7c9e86885dbc34d6de988da6ff998e7acd7e6e14010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000007531184ad0afeebbff2049b855e0921329cb1cb74d769ac57c057c9c8bd2b6810100000000ed5ea2ca4fe9b4560409b50c5bf7cb39b6c5ff6e50690f00000000000000000000000000 +``` + +
+ + +### Decode a raw transaction +```bash +$ skycoin-cli decodeRawTransaction [raw transaction] +``` + +Decode a raw skycoin transaction. + +#### Example + +```bash +skycoin-cli decodeRawTransaction dc00000000247bd0f0a1cf39fa51ea3eca044e4d9cbb28fff5376e90e2eb008c9fe0af384301000000cf5869cb1b21da4da98bdb5dca57b1fd5a6fcbefd37d4f1eb332b21233f92cd62e00d8e2f1c8545142eaeed8fada1158dd0e552d3be55f18dd60d7e85407ef4f000100000005e524872c838de517592c9a495d758b8ab2ec32d3e4d3fb131023a424386634020000000007445b5d6fbbb1a7d70bef941fb5da234a10fcae40420f00000000000100000000000000008001532c3a705e7e62bb0bb80630ecc21a87ec090024f400000000009805000000000000 +``` + +
+ View Output + +```json +{ + "length": 220, + "type": 0, + "txid": "ee700309aba9b8b552f1c932a667c3701eff98e71c0e5b0e807485cea28170e5", + "inner_hash": "247bd0f0a1cf39fa51ea3eca044e4d9cbb28fff5376e90e2eb008c9fe0af3843", + "sigs": [ + "cf5869cb1b21da4da98bdb5dca57b1fd5a6fcbefd37d4f1eb332b21233f92cd62e00d8e2f1c8545142eaeed8fada1158dd0e552d3be55f18dd60d7e85407ef4f00" + ], + "inputs": [ + "05e524872c838de517592c9a495d758b8ab2ec32d3e4d3fb131023a424386634" + ], + "outputs": [ + { + "uxid": "2f146924431e8c9b84a53d4d823acefb92515a264956d873ac86066c608af418", + "dst": "3vbfHxPzMuyFJvgHdAoqmFnyg6k8HiLyxd", + "coins": "1.000000", + "hours": 1 + }, + { + "uxid": "5d69d22aff5957a18194c443557d97ec18707e4db8ee7e9a4bb8a7eef642fdff", + "dst": "tWPDM36ex9zLjJw1aPMfYTVPbYgkL2Xp9V", + "coins": "16.000000", + "hours": 1432 + } + ] +} +``` +
+ +### Encode a JSON transaction + +Encode JSON Skycoin transaction. + +```bash +$ skycoin-cli encodeJsonTransaction [file path or -] +``` + +``` +FLAGS: + -j, --json Returns the results in JSON format. + -f, --fix Recompute transaction inner and outer hashes +``` + +#### Example +##### Read JSON transaction from stdin +```bash +$ echo ' { + "length": 220, + "type": 0, + "txid": "ee700309aba9b8b552f1c932a667c3701eff98e71c0e5b0e807485cea28170e5", + "inner_hash": "247bd0f0a1cf39fa51ea3eca044e4d9cbb28fff5376e90e2eb008c9fe0af3843", + "sigs": [ + "cf5869cb1b21da4da98bdb5dca57b1fd5a6fcbefd37d4f1eb332b21233f92cd62e00d8e2f1c8545142eaeed8fada1158dd0e552d3be55f18dd60d7e85407ef4f00" + ], + "inputs": [ + "05e524872c838de517592c9a495d758b8ab2ec32d3e4d3fb131023a424386634" + ], + "outputs": [ + { + "uxid": "2f146924431e8c9b84a53d4d823acefb92515a264956d873ac86066c608af418", + "dst": "3vbfHxPzMuyFJvgHdAoqmFnyg6k8HiLyxd", + "coins": "1.000000", + "hours": 1 + }, + { + "uxid": "5d69d22aff5957a18194c443557d97ec18707e4db8ee7e9a4bb8a7eef642fdff", + "dst": "tWPDM36ex9zLjJw1aPMfYTVPbYgkL2Xp9V", + "coins": "16.000000", + "hours": 1432 + } + ] + }' | skycoin-cli encodeJsonTransaction - +``` + +
+ View Output + +``` +dc00000000247bd0f0a1cf39fa51ea3eca044e4d9cbb28fff5376e90e2eb008c9fe0af384301000000cf5869cb1b21da4da98bdb5dca57b1fd5a6fcbefd37d4f1eb332b21233f92cd62e00d8e2f1c8545142eaeed8fada1158dd0e552d3be55f18dd60d7e85407ef4f000100000005e524872c838de517592c9a495d758b8ab2ec32d3e4d3fb131023a424386634020000000007445b5d6fbbb1a7d70bef941fb5da234a10fcae40420f00000000000100000000000000008001532c3a705e7e62bb0bb80630ecc21a87ec090024f400000000009805000000000000 +``` + +
+ +##### Read JSON transaction from file +```bash +$ echo ' { + "length": 220, + "type": 0, + "txid": "ee700309aba9b8b552f1c932a667c3701eff98e71c0e5b0e807485cea28170e5", + "inner_hash": "247bd0f0a1cf39fa51ea3eca044e4d9cbb28fff5376e90e2eb008c9fe0af3843", + "sigs": [ + "cf5869cb1b21da4da98bdb5dca57b1fd5a6fcbefd37d4f1eb332b21233f92cd62e00d8e2f1c8545142eaeed8fada1158dd0e552d3be55f18dd60d7e85407ef4f00" + ], + "inputs": [ + "05e524872c838de517592c9a495d758b8ab2ec32d3e4d3fb131023a424386634" + ], + "outputs": [ + { + "uxid": "2f146924431e8c9b84a53d4d823acefb92515a264956d873ac86066c608af418", + "dst": "3vbfHxPzMuyFJvgHdAoqmFnyg6k8HiLyxd", + "coins": "1.000000", + "hours": 1 + }, + { + "uxid": "5d69d22aff5957a18194c443557d97ec18707e4db8ee7e9a4bb8a7eef642fdff", + "dst": "tWPDM36ex9zLjJw1aPMfYTVPbYgkL2Xp9V", + "coins": "16.000000", + "hours": 1432 + } + ] + }' > $FILEPATH + +$ skycoin-cli encodeJsonTransaction $FILEPATH +``` + +
+ View Output + +``` +dc00000000247bd0f0a1cf39fa51ea3eca044e4d9cbb28fff5376e90e2eb008c9fe0af384301000000cf5869cb1b21da4da98bdb5dca57b1fd5a6fcbefd37d4f1eb332b21233f92cd62e00d8e2f1c8545142eaeed8fada1158dd0e552d3be55f18dd60d7e85407ef4f000100000005e524872c838de517592c9a495d758b8ab2ec32d3e4d3fb131023a424386634020000000007445b5d6fbbb1a7d70bef941fb5da234a10fcae40420f00000000000100000000000000008001532c3a705e7e62bb0bb80630ecc21a87ec090024f400000000009805000000000000 +``` + +
+ +##### Recompute Hashes +```bash +$ echo ' { + "length": 183, + "type": 0, + "txid": "9b102b8a9882cd5dc2df8955fc1b8a1a75e11b9de61d272313c4da822920872b", + "inner_hash": "6b1a69b76b2412314b2b928ad5e97c31c034be5734f9fa77f31f11b6b933b976", + "sigs": [ + "ddf4bd79f66ea9c7849c5240a27d9a4745ad4661bdac2179184447088512bb3e62c89efa4fd2cee05980c59b38ef23ddbd09bb77e54e94a0f9123d968a090d4201" + ], + "inputs": [ + f7c183c1823266aff172928f8d06aa65531643456f97ccca6bd34d15e92fac7d" + ], + "outputs": [ + { + "uxid": "d1e30a79ebaac4948c69ce8f61714320f996193544a815b58b6837bade5d86c3", + "dst": "2fRQzhdNP2QMG75GkZnm44H649QBcj2mZY", + "coins": "0.001000", + "hours": 22 + } + ] + }' > $FILEPATH + +$ skycoin-cli encodeJsonTransaction -f $FILEPATH +``` + +##### Generate a JSON output +```bash +$ echo ' { + "length": 220, + "type": 0, + "txid": "ee700309aba9b8b552f1c932a667c3701eff98e71c0e5b0e807485cea28170e5", + "inner_hash": "247bd0f0a1cf39fa51ea3eca044e4d9cbb28fff5376e90e2eb008c9fe0af3843", + "sigs": [ + "cf5869cb1b21da4da98bdb5dca57b1fd5a6fcbefd37d4f1eb332b21233f92cd62e00d8e2f1c8545142eaeed8fada1158dd0e552d3be55f18dd60d7e85407ef4f00" + ], + "inputs": [ + "05e524872c838de517592c9a495d758b8ab2ec32d3e4d3fb131023a424386634" + ], + "outputs": [ + { + "uxid": "2f146924431e8c9b84a53d4d823acefb92515a264956d873ac86066c608af418", + "dst": "3vbfHxPzMuyFJvgHdAoqmFnyg6k8HiLyxd", + "coins": "1.000000", + "hours": 1 + }, + { + "uxid": "5d69d22aff5957a18194c443557d97ec18707e4db8ee7e9a4bb8a7eef642fdff", + "dst": "tWPDM36ex9zLjJw1aPMfYTVPbYgkL2Xp9V", + "coins": "16.000000", + "hours": 1432 + } + ] + }' > $FILEPATH + +$ skycoin-cli encodeJsonTransaction --json $FILEPATH +``` + +
+ View Output + +``` +{ + "rawtx": "dc00000000247bd0f0a1cf39fa51ea3eca044e4d9cbb28fff5376e90e2eb008c9fe0af384301000000cf5869cb1b21da4da98bdb5dca57b1fd5a6fcbefd37d4f1eb332b21233f92cd62e00d8e2f1c8545142eaeed8fada1158dd0e552d3be55f18dd60d7e85407ef4f000100000005e524872c838de517592c9a495d758b8ab2ec32d3e4d3fb131023a424386634020000000007445b5d6fbbb1a7d70bef941fb5da234a10fcae40420f00000000000100000000000000008001532c3a705e7e62bb0bb80630ecc21a87ec090024f400000000009805000000000000" +} +``` + +
+ +### Broadcast a raw transaction +Broadcast a raw skycoin transaction. +Output is the transaction id. + +```bash +$ skycoin-cli broadcastTransaction [raw transaction] +``` + +```bash +$ skycoin-cli broadcastTransaction dc00000000247bd0f0a1cf39fa51ea3eca044e4d9cbb28fff5376e90e2eb008c9fe0af384301000000cf5869cb1b21da4da98bdb5dca57b1fd5a6fcbefd37d4f1eb332b21233f92cd62e00d8e2f1c8545142eaeed8fada1158dd0e552d3be55f18dd60d7e85407ef4f000100000005e524872c838de517592c9a495d758b8ab2ec32d3e4d3fb131023a424386634020000000007445b5d6fbbb1a7d70bef941fb5da234a10fcae40420f00000000000100000000000000008001532c3a705e7e62bb0bb80630ecc21a87ec090024f400000000009805000000000000 +``` +
+ View Output + +``` +ee700309aba9b8b552f1c932a667c3701eff98e71c0e5b0e807485cea28170e5 +``` +
+ +### Create a wallet +Create a new Skycoin wallet. + +```bash +$ skycoin-cli walletCreate [wallet] [flags] +``` + +Note: the `wallet` argument must be a filename that ends with `.wlt`. + +``` +FLAGS: + --bip44-coin uint32 BIP44 coin type (default 8000) + -c, --coin string Wallet address coin type (options: skycoin, bitcoin) (default "skycoin") + -x, --crypto-type string The crypto type for wallet encryption, can be scrypt-chacha20poly1305 or sha256-xor (default "scrypt-chacha20poly1305") + -e, --encrypt Create encrypted wallet. + -l, --label string Label used to identify your wallet. + -m, --mnemonic A mnemonic seed consisting of 12 dictionary words will be generated + -n, --num uint Number of addresses to generate. (default 1) + -p, --password string Wallet password + -r, --random A random alpha numeric seed will be generated. + -s, --seed string Your seed + --seed-passphrase string Seed passphrase (bip44 wallets only) + -t, --type string Wallet type. Types are "collection", "deterministic", "bip44" or "xpub" (default "deterministic") + -w, --wordcount uint Number of seed words to use for mnemonic. Must be 12, 15, 18, 21 or 24 (default 12) + --xpub string xpub key for "xpub" type wallets +``` + +#### Examples +##### Create a deterministic wallet + +Creates a deterministic wallet using the [Skycoin deterministic address generator](https://github.com/SkycoinProject/skycoin/wiki/Deterministic-Keypair-Generation-Method). +Alternatively, you can create a `bip44` type wallet. + +```bash +$ skycoin-cli walletCreate $WALLET_FILE -t deterministic +``` + +
+ View Output + +```json +{ + "meta": { + "coin": "skycoin", + "cryptoType": "", + "encrypted": "false", + "filename": "skycoin_cli.wlt", + "label": "", + "lastSeed": "781576ec74bfa2cc9eb06f8613b96db9be21438b9cd6b6ded09df3bc5b9da279", + "secrets": "", + "seed": "foster blossom glare cube reopen october refuse about journey arrange music alone", + "tm": "1523176366", + "type": "deterministic", + "version": "0.2" + }, + "entries": [ + { + "address": "FSkC7V5rAkCnNrtCe1HBnD2iTm1J8jn63V", + "public_key": "03a16c8e9ea86ea2358364757431b84cc388b34be776bb6a23ed2b83731957d33a", + "secret_key": "3938826649631e2abc1c47c050d0fea5ceac7c45e3fa6cd3ddf1621bdd519150" + } + ] +} +``` +
+ +> NOTE: If a wallet with the same name already exists then the cli exits with an error. + +##### Create a wallet with a random alpha numeric seed +```bash +$ skycoin-cli walletCreate $WALLET_FILE -r +``` + +
+ View Output + +```json +{ + "meta": { + "coin": "skycoin", + "cryptoType": "", + "encrypted": "false", + "filename": "skycoin_cli.wlt", + "label": "", + "lastSeed": "fdaf0729903fbd5962301f16531a1da102bf0875b4a636cb43ce24b967b932ac", + "secrets": "", + "seed": "8af187f04c306538544a1c2c4d0a51e9220bd17fc2fcb3fd72ba2ca3ce7aa212", + "tm": "1523177044", + "type": "deterministic", + "version": "0.2" + }, + "entries": [ + { + "address": "9YogvtjYgeLn3gQX2wzsXDpZn7LuoArdzZ", + "public_key": "022b4bd33f0ad037756ae19f8dfab935fed1118980b4067b4a6b7f03333ba5ccae", + "secret_key": "b4cf1731be9f930ba3a67179eed5dca5af2adee1ce4df96383923f775bf575c0" + } + ] +} +``` +
+ +##### Create a wallet with a 12 word mnemomic seed +```bash +$ skycoin-cli walletCreate $WALLET_FILE -m +``` + +
+ View Output + +```json +{ + "meta": { + "coin": "skycoin", + "cryptoType": "", + "encrypted": "false", + "filename": "skycoin_cli.wlt", + "label": "", + "lastSeed": "f219c2e902940f27ea735d866a495372debcbd01da287a2ec1226d0eb43b9890", + "secrets": "", + "seed": "motor cross wrap intact soup critic club allow track come dizzy cool", + "tm": "1523177162", + "type": "deterministic", + "version": "0.2" + }, + "entries": [ + { + "address": "E9p6Eck7Q6bYBnEkCdB3vCDf3YYkQxCHwv", + "public_key": "02c41e7b03a6a848a417d7d270b9d83c4d9534c2cd5eace8046c67d012b920f1db", + "secret_key": "41b6aa1780f425dac942c8bd1570248ebfca24778e866705a6573b17ead57a4d" + } + ] +} +``` +
+ +##### Create a wallet with a specified seed +```bash +$ skycoin-cli walletCreate $WALLET_FILE -s "this is the super secret seed everyone needs but does not have" +``` + +
+ View Output + +```json +{ + "meta": { + "coin": "skycoin", + "cryptoType": "", + "encrypted": "false", + "filename": "skycoin_cli.wlt", + "label": "", + "lastSeed": "c34a83b473ea4d2f9dc394d0b9c1c0d4578012252b842ef1bfce9950cfe50b06", + "secrets": "", + "seed": "this is the super secret everyone needs but does not have", + "tm": "1523178336", + "type": "deterministic", + "version": "0.2" + }, + "entries": [ + { + "address": "NEQVmBJPidzo3SfDRJHNDMHL7VbqNa7Cku", + "public_key": "0348400c3c1a733a6e25c77f1ffea64c887bc9344a0366821ef07b9b3abadcaf10", + "secret_key": "42e3906d86ca25eb408d2af90b0810d7831b7d777e756021b607bca6538952eb" + } + ] +} +``` +
+ + +##### Create more than 1 default address +```bash +$ skycoin-cli walletCreate $WALLET_FILE -n 2 +``` + +
+ View Output + +```json +{ + "meta": { + "coin": "skycoin", + "cryptoType": "", + "encrypted": "false", + "filename": "skycoin_cli.wlt", + "label": "", + "lastSeed": "861a8989e6c85fb69cf5968586fe9d5a1e26936ab122c5d542bf78fb35e0d247", + "secrets": "", + "seed": "cause custom canal kitchen short cement round cat shine renew pair crowd", + "tm": "1523178418", + "type": "deterministic", + "version": "0.2" + }, + "entries": [ + { + "address": "2accTtyD7tqzLh7c62BE9zjGiyEpoMyQ3bb", + "public_key": "027c30928161755c913e1b3db208f95a66be0f550b9620cefd44902b5354365b73", + "secret_key": "89b2f71fb773a00480637fd83c93e27499fd5e55f69a6e2b58f0847c3ce5040c" + }, + { + "address": "goyx9VE3q73zAWntmwwyaUoTZhtTyG4vt", + "public_key": "025c0b06471b865cb5eab23f9a9dc0a992fe70d0576eb400aa4978ddd0a2124b95", + "secret_key": "75deabceedb9b09a109f5d982fba13a56622d93916a8ef81ddccca69fcc9d7e3" + } + ] +} +``` +
+ + +##### Create a wallet with a custom wallet label +By default the wallet label is an empty field +```bash +$ skycoin-cli walletCreate $WALLET_FILE -l "cli wallet" +``` + +
+ View Output + +```json +{ + "meta": { + "coin": "skycoin", + "cryptoType": "", + "encrypted": "false", + "filename": "skycoin_cli.wlt", + "label": "cli wallet", + "lastSeed": "b3b3c13419a8343f8845a8de30543fa33680e25251a3a1bda3e49346f1d640f9", + "secrets": "", + "seed": "offer spoil crane trial submit kite venture edit repair mushroom fetch bounce", + "tm": "1523178769", + "type": "deterministic", + "version": "0.2" + }, + "entries": [ + { + "address": "21YPgFwkLxQ1e9JTCZ43G7JUyCaGRGqAsda", + "public_key": "03784cf30195259e4bf89e15d343417d38ecd05b2f61fd2b2f71020ad7b1de3577", + "secret_key": "8f6f2e3b63310f94c1440ba230eb170dbc1ffd2ad355274c05b169c290216a3c" + } + ] +} +``` +
+ +##### Create a collection wallet + +Create an empty collection wallet. Use `addPrivateKey` to add keys to it after creation. + +```bash +$ skycoin-cli walletCreate $WALLET_FILE -t collection +``` + +
+ View Output + +```json +{ + "meta": { + "coin": "skycoin", + "cryptoType": "", + "encrypted": "false", + "filename": "collection-test2.wlt", + "label": "", + "lastSeed": "", + "secrets": "", + "seed": "", + "seedPassphrase": "", + "tm": "1563205581", + "type": "collection", + "version": "0.4", + "xpub": "" + }, + "entries": [] +} +``` +
+ +##### Create a BIP44 wallet + +Create a bip44 wallet. BIP44 wallets use the same mnemonic seeds as `deterministic` +wallets, but are supported on 3rd party wallets such as Trezor. + +```bash +$ skycoin-cli walletCreate $WALLET_FILE -t bip44 +``` + +
+ View Output + +```json +{ + "meta": { + "bip44Coin": "8000", + "coin": "skycoin", + "cryptoType": "", + "encrypted": "false", + "filename": "bip44-cli-test.wlt", + "label": "", + "lastSeed": "", + "secrets": "", + "seed": "bacon crush gate artist outer true aware topple pupil include neutral stamp", + "seedPassphrase": "", + "tm": "1563205737", + "type": "bip44", + "version": "0.4", + "xpub": "" + }, + "entries": [ + { + "address": "zbqJ8tGRKNEpR3X2RxHTyodCFtVDB7wFKf", + "public_key": "0255a1148a188d5b5f08c3296ad5de6577e08f8cd035b2e53d974aad56f748abb9", + "secret_key": "8f49323cc06089df5e74fbab8bc211ccc8fc21b44cf495e67fc5c4613bde11af", + "child_number": 0, + "change": 0 + } + ] +} +``` +
+ +##### Create an xpub wallet + +Create an xpub wallet. Obtain an xpub key from a BIP44 wallet with `walletKeyExport`. + +```bash +$ skycoin-cli walletCreate $WALLET_FILE -t xpub --xpub xpub6FHa3pjLCk84BayeJxFW2SP4XRrFd1JYnxeLeU8EqN3vDfZmbqBqaGJAyiLjTAwm6ZLRQUMv1ZACTj37sR62cfN7fe5JnJ7dh8zL4fiyLHV +``` + +
+ View Output + +```json + +{ + "meta": { + "coin": "skycoin", + "cryptoType": "", + "encrypted": "false", + "filename": "xpub-test-cli.wlt", + "label": "", + "lastSeed": "", + "secrets": "", + "seed": "", + "seedPassphrase": "", + "tm": "1563205611", + "type": "xpub", + "version": "0.4", + "xpub": "xpub6FHa3pjLCk84BayeJxFW2SP4XRrFd1JYnxeLeU8EqN3vDfZmbqBqaGJAyiLjTAwm6ZLRQUMv1ZACTj37sR62cfN7fe5JnJ7dh8zL4fiyLHV" + }, + "entries": [ + { + "address": "2as3T8JqSVm41k47phe4vbnrzbTqBEaAwG7", + "public_key": "02df12b7035bdac8e3bab862a3a83d06ea6b17b6753d52edecba9be46f5d09e076", + "secret_key": "", + "child_number": 0 + } + ] +} +``` +
+ + +### Add addresses to a wallet +Add new addresses to a skycoin wallet. + +```bash +$ skycoin-cli walletAddAddresses [wallet] [flags] +``` + +``` +FLAGS: + -j, --json Returns the results in JSON format + -n, --num uint Number of addresses to generate (default 1) + -p, --password string wallet password +``` + +#### Examples + +##### Add 1 address to a wallet + +```bash +$ skycoin-cli walletAddAddresses $WALLET_FILE +``` + +
+ View Output + +``` +2mEgmYt6NZHA1erYqbAeXmGPD5gqLZ9toFv +``` +
+ +##### Add `n` addresses +```bash +$ skycoin-cli walletAddAddresses $WALLET_FILE -n 2 +``` + +
+ View Output + +``` +2UrEV3Vyu5RJABZNukKRq25ggrrg96RUwdH,LJN5qGmLbJxLswzD3nFn3RFcmWJyZ2LGHY +``` +
+ +##### Add an address to a wallet with JSON output +```bash +$ skycoin-cli walletAddAddresses $WALLET_FILE --json +``` + +
+ View Output + +```json +{ + "addresses": [ + "QuLaPirJNUkBpMoe5tzzY7j6nJ5maUVJF1" + ] +} +``` +
+ +### Export a specific key from an HD wallet +Export a specific key from an HD wallet (bip44 wallet). + +```bash +$ skycoin-cli walletKeyExport [wallet] [flags] +``` + +``` +FLAGS: + -k, --key string key type ("xpub", "xprv", "pub", "prv") (default "xpub") + -p, --path string bip44 account'/change subpath (default "0/0") +``` + +The `path` arg is the `account'/change` portion of the bip44 path. +It can have 1 to 3 nodes (i.e. `0`, `0/0` and `0/0/0`). +The apostrophe for the `account` node is omitted. + +##### Export the xpub key for the external chain +```bash +$ skycoin-cli walletKeyExport mywallet.wlt -k xpub -p "0/0" +``` + +
+ View Output + +``` +xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8 +``` +
+ +##### Export the xprv key for the change chain +```bash +$ skycoin-cli walletKeyExport mywallet.wlt -k xprv -p "0/1" +``` + +
+ View Output + +``` +xprv9uHRZZhk6KAJC1avXpDAp4MDc3sQKNxDiPvvkX8Br5ngLNv1TxvUxt4cV1rGL5hj6KCesnDYUhd7oWgT11eZG7XnxHrnYeSvkzY7d2bhkJ7 +``` +
+ +##### Export the pub key for the 5th child in the external chain +```bash +$ skycoin-cli walletKeyExport mywallet.wlt -k pub -p "0/0/5" +``` + +
+ View Output + +``` +035a784662a4a20a65bf6aab9ae98a6c068a81c52e4b032c0fb5400c706cfccc56 +``` +
+ + +##### Export the prv key for the 5th child in the change chain +```bash +$ skycoin-cli walletKeyExport mywallet.wlt -k prv -p "0/1/5" +``` + +
+ View Output + +``` +d647077f0f6824a25af7cd934ff196e611f5122bff4310f8eb0f2e643c5213cd +``` +
+ + +##### Export the xpub key for account number 2 +```bash +$ skycoin-cli walletKeyExport mywallet.wlt -k xpub -p "2" +``` + +
+ View Output + +``` +xpub6FHa3pjLCk84BayeJxFW2SP4XRrFd1JYnxeLeU8EqN3vDfZmbqBqaGJAyiLjTAwm6ZLRQUMv1ZACTj37sR62cfN7fe5JnJ7dh8zL4fiyLHV +``` +
+ + +### Encrypt Wallet +Encrypt a wallet seed + +```bash +$ skycoin-cli encryptWallet [wallet] [flags] +``` + +``` +FLAGS: + -x, --crypto-type string The crypto type for wallet encryption, can be scrypt-chacha20poly1305 or sha256-xor + -p, --password string wallet password +``` + +### Examples +#### Encrypt wallet +```bash +$ skycoin-cli encryptWallet $WALLET_FILE -p test +``` + +
+ View Output + + ```json + { + "meta": { + "coin": "skycoin", + "cryptoType": "scrypt-chacha20poly1305", + "encrypted": "true", + "filename": "skycoin_cli.wlt", + "label": "", + "lastSeed": "", + "secrets": "dgB7Im4iOjEwNDg1NzYsInIiOjgsInAiOjEsImtleUxlbiI6MzIsInNhbHQiOiJRNVRSVHh0VFpieERpUWt0dnkzc01SYTl6U0t2aFJqVlpUUHQzeldSVGs4PSIsIm5vbmNlIjoiSUt5VG8zdWdGdFY3MWYxTiJ9LB7Cu3bvZFzsmKqToPi3bjARIRfmhL8HBUdnwLzS5Rxu4uw1tIlDDmEKUpgDWV3RvB+xDz3sHchQr5BpK72LDOwbZ6BubMHovTqC4+lx9hKc2qnDGwsymxLQJHQrQ23DkHMioSUVYNZv1/DwzJ2qI0WIOTkb+L34e9f60YV+2zF7v+C/nTS8AjMwjGYldKinPEjyDXkpxB2d4Sd3EnfUm8u76TvTKxqZpZ/tr+in/OfRsJsN7dC7rMFRZukoCJYNnWv/wgPn/NMu4DIxqF+WUQhCsCgqk6oMderdK/E/xtLJmKnbHRLH4PO/Dh4ypLXg2EzW+JBN6RpzVEXxYdvVCqmKfs7d+hnHWDmDtCLGqYyPsUa+d4PPhylruNE=", + "seed": "", + "tm": "1540305209", + "type": "deterministic", + "version": "0.2" + }, + "entries": [ + { + "address": "2gvvvS5jziMDQTUPB98LFipCTDjm1H723k2", + "public_key": "032fe2ceacabc1a6acad8c93bd3493a3570fb76a9f8dc625dd200d13f96abed3e0", + "secret_key": "" + } + ] + } + ``` +
+ + +#### Encrypt wallet with different crypto type +```bash +$ skycoin-cli encryptWallet $WALLET_FILE -x sha256-xor -p test +``` + +
+ View Output + + ```json + { + "meta": { + "coin": "skycoin", + "cryptoType": "sha256-xor", + "encrypted": "true", + "filename": "skycoin_cli.wlt", + "label": "", + "lastSeed": "", + "secrets": "mJ4g+/NgncOVp7gKIZqVPysmrRYKjprSuMvvpq3HLt7ajjMOheEdyU0PGtueDQADIhhTFZlQh/eaaYXF3fecS7OrGa79F+2lRRdD7Tva/MueiL9TL0ng12x0I7dXkUVsXLTl3MJK27JwS9hKedcVvnmFysJA6W3lX2aE7Qn+v6cyMbfgR8r89OHGaUZ9SPZn2HKOhhIcXt66Q/t0kVWU0XEH+G + xUyX23ksN3scQoAshVidLAgXwpkgExEl+qjCpDNQga3MncZV+WuQxpIKodJ3l5TKoJAA0/Taz9O9Se0tIoiK2ls2m6JUayev3Id0+hkmNNSUKQ53Ni3xwjNzZXoPQAemMWpkdUSv8qNuhh7C/4gBBrZROM6ZyxmsdlWgcG0Yfrh8o505D0i4mtubkdZSGi8Djm9j1mpWTZi3VuUjtGvBAmH3Qzdma+nvORZj11QuEuCcO+ + 8jmQB9bVxcTL9u4Nan2+cYijVNul93m7xWik/mSB7uIFVIJAm4kSMiJm", + "seed": "", + "tm": "1540305209", + "type": "deterministic", + "version": "0.2" + }, + "entries": [ + { + "address": "2gvvvS5jziMDQTUPB98LFipCTDjm1H723k2", + "public_key": "032fe2ceacabc1a6acad8c93bd3493a3570fb76a9f8dc625dd200d13f96abed3e0", + "secret_key": "" + } + ] + } + ``` +
+ +### Decrypt Wallet +Decrypt a wallet seed + +```bash +$ skycoin-cli decryptWallet [wallet] [flags] +``` + +``` +FLAGS: + -p, --password string wallet password +``` + +### Example +```bash +$ skycoin-cli decryptWallet $WALLET_FILE -p test +``` + +
+ View Output + + ```json + { + "meta": { + "coin": "skycoin", + "cryptoType": "", + "encrypted": "false", + "filename": "skycoin_cli.wlt", + "label": "", + "lastSeed": "522dba68fe58c179f3467f9e799c02b25552143b250626cc03281faa28c262c0", + "secrets": "", + "seed": "select salute trip target blur short link suspect river ready senior bleak", + "tm": "1540305209", + "type": "deterministic", + "version": "0.2" + }, + "entries": [ + { + "address": "2gvvvS5jziMDQTUPB98LFipCTDjm1H723k2", + "public_key": "032fe2ceacabc1a6acad8c93bd3493a3570fb76a9f8dc625dd200d13f96abed3e0", + "secret_key": "080bfb86463da87e06f816c4326a11b84806c9744235bb7ce7bc8d63acb4f6c2" + } + ] + } + ``` +
+ +### Last blocks +Show the last `n` skycoin blocks. +By default the last block is shown. + +```bash +$ skycoin-cli lastBlocks [numberOfBlocks] +``` + +#### Examples +##### Get the last block +```bash +$ skycoin-cli lastBlocks +``` + +
+ View Output + +```json +{ + "blocks": [ + { + "header": { + "seq": 58894, + "block_hash": "3961bea8c4ab45d658ae42effd4caf36b81709dc52a5708fdd4c8eb1b199a1f6", + "previous_block_hash": "8eca94e7597b87c8587286b66a6b409f6b4bf288a381a56d7fde3594e319c38a", + "timestamp": 1537581604, + "fee": 485194, + "version": 0, + "tx_body_hash": "c03c0dd28841d5aa87ce4e692ec8adde923799146ec5504e17ac0c95036362dd", + "ux_hash": "f7d30ecb49f132283862ad58f691e8747894c9fc241cb3a864fc15bd3e2c83d3" + }, + "body": { + "txns": [ + { + "length": 257, + "type": 0, + "txid": "c03c0dd28841d5aa87ce4e692ec8adde923799146ec5504e17ac0c95036362dd", + "inner_hash": "f7dbd09f7e9f65d87003984640f1977fb9eec95b07ef6275a1ec6261065e68d7", + "sigs": [ + "af5329e77213f34446a0ff41d249fd25bc1dae913390871df359b9bd587c95a10b625a74a3477a05cc7537cb532253b12c03349ead5be066b8e0009e79462b9501" + ], + "inputs": [ + "fb8db3f78928aee3f5cbda8db7fc290df9e64414e8107872a1c5cf83e08e4df7" + ], + "outputs": [ + { + "uxid": "235811602fc96cf8b5b031edb88ee1606830aa641c06e0986681552d8728ec07", + "dst": "2Huip6Eizrq1uWYqfQEh4ymibLysJmXnWXS", + "coins": "0.500000", + "hours": 1 + }, + { + "uxid": "873da4edc01c0b5184e1f26c4c3471dd407d08e9ab36b018ab93874e7392320b", + "dst": "2XBMMDMqTTYmqs2rfjEwYDz8ABd38y9B8r7", + "coins": "0.500000", + "hours": 1 + }, + { + "uxid": "42a6f0127f61e1d7bca8e9680027eddcecad772250c5634a03e56a8b1cf5a816", + "dst": "uvcDrKc8rHTjxLrU4mPN56Hyh2tR6RvCvw", + "coins": "25.913000", + "hours": 485192 + } + ] + } + ] + }, + "size": 257 + } + ] +} +``` +
+ +##### Get the last `n` blocks +```bash +$ skycoin-cli lastBlocks 3 +``` + +
+ View Output + +```json +{ + "blocks": [ + { + "header": { + "seq": 58892, + "block_hash": "1f042ed976c0cb150ea6b71c9608d65b519e4bc1c507eba9f1146e443a856c2d", + "previous_block_hash": "d9ca9442febd8788de0a3093158943beca228017bf8c9c9b8529a382fad8d991", + "timestamp": 1537580914, + "fee": 94694, + "version": 0, + "tx_body_hash": "9895f8af790e33a618004dc61f48ecc16bd642751a3fff6b05cecb8815c80942", + "ux_hash": "bb188dcaaf28613d49b926636675dacf67a739a4e316253b1207ad674709252b" + }, + "body": { + "txns": [ + { + "length": 1190, + "type": 0, + "txid": "9895f8af790e33a618004dc61f48ecc16bd642751a3fff6b05cecb8815c80942", + "inner_hash": "8bff0b7572bb49ccde4b2b313e921e5cf302a11fd9f786a2ef97a7c0ddfee261", + "sigs": [ + "f843861b301eb025e58bacfb934d615f263419704b0a59f2645845344f2702fa1a7a967651f01933af4d56752c656a7e759e942b9278e228362f2ef273d4ff5200", + "06f15e2522e7413f25dedb5aee67ae880bd98bb7df11a1a92241d88db9bb976d2c707e77a4a3ddfd8d123ad04701fe2538ea2d0f78cfbcdc44e70fd2320a72b500", + "dc32fe308274f9aaa21e09046384a83b4b2c6bf800c6b9ff492af8bd3f5cd7717b245c9d460c242139034c73cd15aca9f288cb69e8ae4c33df2a807ff3b373aa00", + "18d83a122f0ca3629f0c82e21ea3d6fbdfd1ea07ba062ffb6647b7e2c3aa9a1d7c112dc5543435ddd0bccd163f839d9802eb344f6203372deea7402d8476679501", + "26a8723c1ac22dca2b61d807ca2279e341a9f5a371c4d14333f49e52b90ec87f08ab7930e5804367c1dffb01b197d976619ab26f0c8afe8837c41b0df809a23301", + "fe190749475cd66afcdd295b22b007c63726db0fd834acef4ecde9c41ae7d15d54c2c180c8aba5c894d3843405f6243b7ff964f974f607b38298c195d7b523c401", + "d58e8283a28faed377161605e252cd929959e40fd8b996f928049f2b446bc920468d1086a2bc34a8fcaedefdc471427266cc67b9770d9b0482f5f4f22729a79a00", + "2be852a5b589ce49f9d3678fa44a758c2e4d7372620a8241d71c41451c5244387ac337bbee5010b98fc8c38fc44619ed8a7beb2af06385a11ecb53eb0112a8a700", + "b6376cc54078f775da6438960e828c799c780349c8590508b4500f0e6dd9ecbc760992599d698209b078220d8aaa9db9f80091290a18cd0753efd1805515d06600", + "958e17753d4cedc3203b95a39d585314ac10efc00332befa81c8049b4178222d2514ba1d68385b2518d976835dee48f2bb540db0d0e728acbf59d8562cbb7baa00", + "d921e2aa2b1b6778a84efdc7f1d016c7aad66dfc13c0be4fee6a5f303a2c3cf465fa0d549ca5fc57d3a26832bffcaec842837905a78e8ca3fa553522d931571d01" + ], + "inputs": [ + "c551da99c0b74b64511aaaf99536cb6d263958064890ef6c27be36e8f5a14fb8", + "64875d950120b16d0f0f84c708e3e48b26fb9c32f36c0fba71764dfc53e7ae05", + "ba50cb14fc26bcf658ace9a3b5d6e0d257fa022e80613902c693ab57a1c0924a", + "b388fdb6dc7c91cab7e72a4786967e18834350c1ccd149790a0a2270bdf91bf9", + "94f87596cb7471e2b96b7e1ddd8194d44ca4858d97ed29f83e926bcdf36601c1", + "dd2a4d942ba1ad4dc55f46adc31e3f62e7326b9a0d511f1faf83911af77018f1", + "35b82981a9648ba871c2c08604cb95f130baafa26761139c7134f5b9e4575b9d", + "aa0f74c067347b0178c6963d8409c6bdf7a39051641f9ba1a5d5c37d88dce7f0", + "5a34d07536c2964338aa89f19ab7ff857056f6ffd16e936ae13229077387afb5", + "dc93bb4a131cea3d3f2b523408f077779384c816a4516dfbe0817845938a26ef", + "53f92392b71ce79ead8452e5c31c8a404acf9770a71d4dc234f2fe54a8671495" + ], + "outputs": [ + { + "uxid": "061a639996b85d2c0f19cf929a83c5abe2667a411de31fbdbd16c1da6c8e4880", + "dst": "2gXHek83jtEdDndgrKkEwgwZZDsHXKfNaD", + "coins": "87.990000", + "hours": 1 + }, + { + "uxid": "f210a8ed58c92094832ccb4d5a4ae7271df1df0d7176b18d5c7b149ed36a7d80", + "dst": "27ckSMTwxMxHanUM1VmF8BV9JuWdQd4Gd9S", + "coins": "0.010000", + "hours": 94693 + } + ] + } + ] + }, + "size": 1190 + }, + { + "header": { + "seq": 58893, + "block_hash": "8eca94e7597b87c8587286b66a6b409f6b4bf288a381a56d7fde3594e319c38a", + "previous_block_hash": "1f042ed976c0cb150ea6b71c9608d65b519e4bc1c507eba9f1146e443a856c2d", + "timestamp": 1537581594, + "fee": 970389, + "version": 0, + "tx_body_hash": "1bea5cf1279693a0da24828c37b267c702007842b16ca5557ae497574d15aab7", + "ux_hash": "bf35652af199779bc40cbeb339e8a782ff70673b07779e5c5621d37dfe13b42b" + }, + "body": { + "txns": [ + { + "length": 377, + "type": 0, + "txid": "1bea5cf1279693a0da24828c37b267c702007842b16ca5557ae497574d15aab7", + "inner_hash": "a25232405bcef0c007bb2d7d3520f2a389e17e11125c252ab6c00168ec52c08d", + "sigs": [ + "2ff7390c3b66c6b0fbb2b4c59c8e218291d4cbb82a836bb577c7264677f4a8320f6f3ad72d804e3014728baa214c223ecced8725b64be96fe3b51332ad1eda4201", + "9e7c715f897b3c987c00ee8c6b14e4b90bb3e4e11d003b481f82042b1795b3c75eaa3d563cd0358cdabdab77cfdbead7323323cf73e781f9c1a8cf6d9b4f8ac100", + "5c9748314f2fe0cd442df5ebb8f211087111d22e9463355bf9eee583d44df1bd36addb510eb470cb5dafba0732615f8533072f80ae05fc728c91ce373ada1e7b00" + ], + "inputs": [ + "5f634c825b2a53103758024b3cb8578b17d56d422539e23c26b91ea397161703", + "16ac52084ffdac2e9169b9e057d44630dec23d18cfb90b9437d28220a3dc585d", + "8d3263890d32382e182b86f8772c7685a8f253ed475c05f7d530e9296f692bc9" + ], + "outputs": [ + { + "uxid": "fb8db3f78928aee3f5cbda8db7fc290df9e64414e8107872a1c5cf83e08e4df7", + "dst": "uvcDrKc8rHTjxLrU4mPN56Hyh2tR6RvCvw", + "coins": "26.913000", + "hours": 970388 + } + ] + } + ] + }, + "size": 377 + }, + { + "header": { + "seq": 58894, + "block_hash": "3961bea8c4ab45d658ae42effd4caf36b81709dc52a5708fdd4c8eb1b199a1f6", + "previous_block_hash": "8eca94e7597b87c8587286b66a6b409f6b4bf288a381a56d7fde3594e319c38a", + "timestamp": 1537581604, + "fee": 485194, + "version": 0, + "tx_body_hash": "c03c0dd28841d5aa87ce4e692ec8adde923799146ec5504e17ac0c95036362dd", + "ux_hash": "f7d30ecb49f132283862ad58f691e8747894c9fc241cb3a864fc15bd3e2c83d3" + }, + "body": { + "txns": [ + { + "length": 257, + "type": 0, + "txid": "c03c0dd28841d5aa87ce4e692ec8adde923799146ec5504e17ac0c95036362dd", + "inner_hash": "f7dbd09f7e9f65d87003984640f1977fb9eec95b07ef6275a1ec6261065e68d7", + "sigs": [ + "af5329e77213f34446a0ff41d249fd25bc1dae913390871df359b9bd587c95a10b625a74a3477a05cc7537cb532253b12c03349ead5be066b8e0009e79462b9501" + ], + "inputs": [ + "fb8db3f78928aee3f5cbda8db7fc290df9e64414e8107872a1c5cf83e08e4df7" + ], + "outputs": [ + { + "uxid": "235811602fc96cf8b5b031edb88ee1606830aa641c06e0986681552d8728ec07", + "dst": "2Huip6Eizrq1uWYqfQEh4ymibLysJmXnWXS", + "coins": "0.500000", + "hours": 1 + }, + { + "uxid": "873da4edc01c0b5184e1f26c4c3471dd407d08e9ab36b018ab93874e7392320b", + "dst": "2XBMMDMqTTYmqs2rfjEwYDz8ABd38y9B8r7", + "coins": "0.500000", + "hours": 1 + }, + { + "uxid": "42a6f0127f61e1d7bca8e9680027eddcecad772250c5634a03e56a8b1cf5a816", + "dst": "uvcDrKc8rHTjxLrU4mPN56Hyh2tR6RvCvw", + "coins": "25.913000", + "hours": 485192 + } + ] + } + ] + }, + "size": 257 + } + ] +} +``` +
+ + +### List wallet addresses +List addresses in a skycoin wallet. + +```bash +$ skycoin-cli listAddresses [wallet] +``` + +#### Example + +```bash +$ skycoin-cli listAddresses $WALLET_FILE +``` + +
+ View Output + +```json +{ + "addresses": [ + "21YPgFwkLxQ1e9JTCZ43G7JUyCaGRGqAsda", + "2mEgmYt6NZHA1erYqbAeXmGPD5gqLZ9toFv", + "2cET6L4c6Bee5jucuzsTQUXFxWX76GZoDqv", + "2UrEV3Vyu5RJABZNukKRq25ggrrg96RUwdH", + "LJN5qGmLbJxLswzD3nFn3RFcmWJyZ2LGHY", + "QuLaPirJNUkBpMoe5tzzY7j6nJ5maUVJF1" + ] +} +``` +
+ +### List wallets +List wallets in the Skycoin wallet directory (`$DATA_DIR/wallets`) or in a specific directory. + +```bash +$ skycoin-cli listWallets [directory] +``` + +#### Examples + +##### List wallets in default wallets directory + +```bash +$ skycoin-cli listWallets +``` + +
+ View Output + +```json +{ + "directory": "/home/foo/.skycoin/wallets", + "wallets": [ + { + "name": "2018_02_04_45bc.wlt", + "label": "Your Wallet", + "address_num": 60 + }, + { + "name": "2018_03_22_6e61.wlt", + "label": "craptopia", + "address_num": 3 + }, + { + "name": "2018_04_01_198c.wlt", + "label": "wings", + "address_num": 2 + }, + { + "name": "secret_wallet.wlt", + "label": "", + "address_num": 1 + }, + { + "name": "skycoin_cli.wlt", + "label": "cli wallet", + "address_num": 6 + } + ] +} +``` +
+ +##### List wallets in specific wallet directory + +```bash +$ skycoin-cli listWallets . +``` + +
+ View Output + +```json +{ + "directory": "/home/foo/github.com/skycoin", + "wallets": [ + { + "name": "2018_02_04_45bc.wlt", + "label": "Your Wallet", + "address_num": 60 + }, + { + "name": "skycoin_cli.wlt", + "label": "cli wallet", + "address_num": 6 + } + ] +} +``` +
+ + +### Rich list +Returns the top N address (default 20) balances (based on unspent outputs). Optionally include distribution addresses (exluded by default). + +```bash +$ skycoin-cli richlist [top N addresses] [include distribution addresses] +``` + +#### Example +```bash +$ skycoin-cli richlist 5 false +``` + +
+ View Output + +```json +{ + "richlist": [ + { + "address": "2iNNt6fm9LszSWe51693BeyNUKX34pPaLx8", + "coins": "1072264.838000", + "locked": false + }, + { + "address": "2fGi2jhvp6ppHg3DecguZgzqvpJj2Gd4KHW", + "coins": "500000.000000", + "locked": false + }, + { + "address": "2jNwfvZNUoRLiFzJtmnevSF6TKPfSehvrc1", + "coins": "252297.068000", + "locked": false + }, + { + "address": "2GgFvqoyk9RjwVzj8tqfcXVXB4orBwoc9qv", + "coins": "236884.364000", + "locked": false + }, + { + "address": "2fR8BkeTRQC4R3ATNnujHsQQXcaB6m4Aqwo", + "coins": "173571.990000", + "locked": false + } + ] +} +``` +
+ +### Send +Make a skycoin transaction. + +```bash +$ skycoin-cli send [wallet] [to address] [amount] [flags] +``` + +``` +FLAGS: + -c, --change-address string Specify the change address. + Defaults to one of the spending addresses (deterministic wallets) or to a new change address (bip44 wallets). + --csv string CSV file containing addresses and amounts to send + -a, --from-address string From address in wallet + -j, --json Returns the results in JSON format. + -m, --many string use JSON string to set multiple receive addresses and coins, + example: -m '[{"addr":"$addr1", "coins": "10.2"}, {"addr":"$addr2", "coins": "20"}]' + -p, --password string Wallet password +``` + +#### Examples + +##### Sending to one receiver +```bash +$ skycoin-cli send $WALLET_FILE $RECIPIENT_ADDRESS $AMOUNT +``` + +##### Sending from a specific address in a wallet +```bash +$ skycoin-cli send $WALLET_FILE $RECIPIENT_ADDRESS $AMOUNT -a $FROM_ADDRRESS +``` + +##### Sending change to a specific change address +```bash +$ skycoin-cli send $WALLET_FILE $RECIPIENT_ADDRESS $AMOUNT -a $FROM_ADDRESS -c $CHANGE_ADDRESS +``` + +##### Sending to multiple addresses +```bash +$ skycoin-cli send $WALLET_FILE -a $FROM_ADDRESS -m '[{"addr":"$ADDR1", "coins": "$AMT1"}, {"addr":"$ADDR2", "coins": "$AMT2"}]' +``` + +##### Sending to addresses in a CSV file +```bash +$ cat < $CSV_FILE +2Niqzo12tZ9ioZq5vwPHMVR4g7UVpp9TCmP,123.1 +2UDzBKnxZf4d9pdrBJAqbtoeH641RFLYKxd,456.045 +yExu4fryscnahAEMKa7XV4Wc1mY188KvGw,0.3 +EOF +$ skycoin-cli send $WALLET_FILE -a $FROM_ADDRESS --csv $CSV_FILE +``` + +
+ View Output + +``` +txid:$TRANSACTION_ID +``` +
+ +> NOTE: When sending to multiple addresses each combination of address and coins need to be unique + Otherwise you get, `ERROR: Duplicate output in transaction` + +##### Generate a JSON output +```bash +$ skycoin-cli send $WALLET_FILE -a $FROM_ADDRESS --json $RECIPIENT_ADDRESS $AMOUNT +``` + +
+ View Output + +```json +{ + "txid": "$TRANSACTION_ID" +} +``` +
+ +### Show Seed +Show seed and seed passphrase of a wallet. + + +```bash +$ skycoin-cli showSeed [wallet] [flags] +``` + +``` +FLAGS: + -j, --json Returns the results in JSON format. + -p, --password string Wallet password +``` + +#### Examples + +##### Wallet with a seed + +```bash +$ skycoin-cli showSeed $WALLET_FILE +``` + +
+ View Output + ``` + eternal turtle seek nominee narrow much melody kite worth giggle shrimp horse + ``` +
+ +##### Wallet with a seed and a seed passphrase + +```bash +$ skycoin-cli showSeed $WALLET_FILE +``` + +
+ View Output +``` +eternal turtle seek nominee narrow much melody kite worth giggle shrimp horse +mypassphrase +``` +
+ +##### Wallet with a seed and a seed passphrase in JSON format + +```bash +$ skycoin-cli showSeed $WALLET_FILE -j +``` + +
+ View Output +```json +{ + "seed": "eternal turtle seek nominee narrow much melody kite worth giggle shrimp horse", + "seed_passphrase": "mypassphrase" +} +``` +
+ + + +### Show Config +Show the CLI tool's local configuration. + +#### Example +```bash +$ skycoin-cli showConfig +``` + +
+ View Output + +```json +{ + "data_directory": "/home/user/.skycoin", + "coin": "skycoin", + "rpc_address": "http://127.0.0.1:6420" +} +``` +
+ +### Status +#### Example +```bash +$ skycoin-cli status +``` + +
+ View Output + +```json +{ + "status": { + "blockchain": { + "head": { + "seq": 58894, + "block_hash": "3961bea8c4ab45d658ae42effd4caf36b81709dc52a5708fdd4c8eb1b199a1f6", + "previous_block_hash": "8eca94e7597b87c8587286b66a6b409f6b4bf288a381a56d7fde3594e319c38a", + "timestamp": 1537581604, + "fee": 485194, + "version": 0, + "tx_body_hash": "c03c0dd28841d5aa87ce4e692ec8adde923799146ec5504e17ac0c95036362dd", + "ux_hash": "f7d30ecb49f132283862ad58f691e8747894c9fc241cb3a864fc15bd3e2c83d3" + }, + "unspents": 38171, + "unconfirmed": 1, + "time_since_last_block": "7m44s" + }, + "version": { + "version": "0.25.0", + "commit": "620405485d3276c16c0379bc3b88b588e34c45e1", + "branch": "develop" + }, + "coin": "skycoin", + "user_agent": "skycoin:0.25.0", + "open_connections": 8, + "outgoing_connections": 5, + "incoming_connections": 3, + "uptime": "4h1m23.697072461s", + "csrf_enabled": true, + "csp_enabled": true, + "wallet_api_enabled": true, + "gui_enabled": true, + "user_verify_transaction": { + "burn_factor": 10, + "max_transaction_size": 32768, + "max_decimals": 3 + }, + "unconfirmed_verify_transaction": { + "burn_factor": 10, + "max_transaction_size": 32768, + "max_decimals": 3 + }, + "started_at": 1558864387, + "fiber": { + "name": "skycoin", + "display_name": "Skycoin", + "ticker": "SKY", + "coin_hours_display_name": "Coin Hours", + "coin_hours_display_name_singular": "Coin Hour", + "coin_hours_ticker": "SCH", + "explorer_url": "https://explorer.skycoin.com" + } + }, + "cli_config": { + "webrpc_address": "http://127.0.0.1:6420" + } +} +``` +
+ +### Get transaction +Get transaction data from a `txid`. + +```bash +$ skycoin-cli transaction [transaction id] +``` + +#### Example +```bash +$ skycoin-cli transaction 824d421a25f81aa7565d042a54b3e1e8fdc58bed4eefe8f8a90748da6d77d135 +``` + +
+ View Output + +```json +{ + "transaction": { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 1, + "block_seq": 864 + }, + "txn": { + "length": 220, + "type": 0, + "txid": "824d421a25f81aa7565d042a54b3e1e8fdc58bed4eefe8f8a90748da6d77d135", + "inner_hash": "708a21c685041ba409b9634843003f263c7a00d99459925e319049f3e36f1163", + "timestamp": 1492141347, + "sigs": [ + "6772c4e1370faf7acd8fc37f6dba3bea06ad1beb1300074c33b2c6fa9b11ed7d2bcc01b7008f235aa918b9c146078dfb8e1c8ce55b0893ea5f111597b42331ba01" + ], + "inputs": [ + "c38c108ac3c76e5faffce0bb83153ec98bc1355a98e1a9b0f95ab1b98ef9f00e" + ], + "outputs": [ + { + "uxid": "b0586a8e731c475e87eb61ef0b845d7893cf39120a1e97cf05f78585f1a49e3c", + "dst": "2bfYafFtdkCRNcCyuDvsATV66GvBR9xfvjy", + "coins": "166365", + "hours": 0 + }, + { + "uxid": "49c64719d8df905a7fd4a1c46c2a9c358a8c5ae14befb0d57dcfe1b1d36a1758", + "dst": "ep3axwpJ3hWWQcACu48z9sMKUB7snXBm94", + "coins": "1300", + "hours": 0 + } + ] + } + } +} +``` +
+ +### Get address transactions +Get transaction for one or more addresses - including listing of both inputs and outputs. + +```bash +$ skycoin-cli addressTransactions [addr1 addr2 addr3] +``` + +#### Example +#### Single Address +```bash +$ skycoin-cli addressTransactions 21YPgFwkLxQ1e9JTCZ43G7JUyCaGRGqAsda +``` + +
+ View Output + +```json +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 66119, + "block_seq": 21213 + }, + "time": 1523180676, + "txn": { + "timestamp": 1523180676, + "length": 220, + "type": 0, + "txid": "8cdf82ec42e8316007ed99c0b1de1d0dfd9221c757f41fdec0b36009df74085f", + "inner_hash": "c543f08bfe7b99a19f7bc4068a02e437ed4a043130e976551188c4d38b89ce8d", + "fee": 726, + "sigs": [ + "f1021744902892eb47c60f7240ce6964de3c7bf77777ce267b58df8879e208e57bd044d15a36d78bebab2897c2c61ecbbceb348cfc45152efb105960799364c401" + ], + "inputs": [ + { + "uxid": "5d69d22aff5957a18194c443557d97ec18707e4db8ee7e9a4bb8a7eef642fdff", + "owner": "tWPDM36ex9zLjJw1aPMfYTVPbYgkL2Xp9V", + "coins": "16.000000", + "hours": 1432, + "calculated_hours": 1452 + } + ], + "outputs": [ + { + "uxid": "0020ae8da2bcc7657f3b234cbb59e0fd2486c53d7ef3f05cda6ff613587c8441", + "dst": "3vbfHxPzMuyFJvgHdAoqmFnyg6k8HiLyxd", + "coins": "1.000000", + "hours": 1 + }, + { + "uxid": "9d79ad07a90fee10b59bea1bd6f566f0b69f6bf9a9e735c1bec4b0e5eb4b33cb", + "dst": "21YPgFwkLxQ1e9JTCZ43G7JUyCaGRGqAsda", + "coins": "15.000000", + "hours": 725 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 66111, + "block_seq": 21221 + }, + "time": 1523184376, + "txn": { + "timestamp": 1523184376, + "length": 183, + "type": 0, + "txid": "f3c5cfd462d95e724b7d35b1688c53f25a5f358f2eb9a6f87b63cdf31deb2bf8", + "inner_hash": "8269589c228be4bc33d75f6ee5b334856e8680b7d6ec275f897406c01da8340b", + "fee": 370, + "sigs": [ + "33879494d644df45b5c6c7111c0e453cd42f6fe718614a9411d9fbabd57ab24749813cdf47424dcac5ed097a0de0ac7b557154d2ec93f81b12b1dfdee5138df701" + ], + "inputs": [ + { + "uxid": "9d79ad07a90fee10b59bea1bd6f566f0b69f6bf9a9e735c1bec4b0e5eb4b33cb", + "owner": "21YPgFwkLxQ1e9JTCZ43G7JUyCaGRGqAsda", + "coins": "15.000000", + "hours": 725, + "calculated_hours": 739 + } + ], + "outputs": [ + { + "uxid": "c51b2692aa9f296a3cd2f37b14f39c496c82f5c5ae01c54701ea60b7353f27e2", + "dst": "tWPDM36ex9zLjJw1aPMfYTVPbYgkL2Xp9V", + "coins": "15.000000", + "hours": 369 + } + ] + } + } +] +``` +
+ +#### Multiple Address +```bash +$ skycoin-cli addressTransactions 21YPgFwkLxQ1e9JTCZ43G7JUyCaGRGqAsda 3vbfHxPzMuyFJvgHdAoqmFnyg6k8HiLyxd +``` + +
+ View Output + +```json +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 66143, + "block_seq": 21189 + }, + "time": 1523176026, + "txn": { + "timestamp": 1523176026, + "length": 220, + "type": 0, + "txid": "ee700309aba9b8b552f1c932a667c3701eff98e71c0e5b0e807485cea28170e5", + "inner_hash": "247bd0f0a1cf39fa51ea3eca044e4d9cbb28fff5376e90e2eb008c9fe0af3843", + "fee": 1442, + "sigs": [ + "cf5869cb1b21da4da98bdb5dca57b1fd5a6fcbefd37d4f1eb332b21233f92cd62e00d8e2f1c8545142eaeed8fada1158dd0e552d3be55f18dd60d7e85407ef4f00" + ], + "inputs": [ + { + "uxid": "05e524872c838de517592c9a495d758b8ab2ec32d3e4d3fb131023a424386634", + "owner": "tWPDM36ex9zLjJw1aPMfYTVPbYgkL2Xp9V", + "coins": "17.000000", + "hours": 139, + "calculated_hours": 2875 + } + ], + "outputs": [ + { + "uxid": "2f146924431e8c9b84a53d4d823acefb92515a264956d873ac86066c608af418", + "dst": "3vbfHxPzMuyFJvgHdAoqmFnyg6k8HiLyxd", + "coins": "1.000000", + "hours": 1 + }, + { + "uxid": "5d69d22aff5957a18194c443557d97ec18707e4db8ee7e9a4bb8a7eef642fdff", + "dst": "tWPDM36ex9zLjJw1aPMfYTVPbYgkL2Xp9V", + "coins": "16.000000", + "hours": 1432 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 66142, + "block_seq": 21190 + }, + "time": 1523176126, + "txn": { + "timestamp": 1523176126, + "length": 183, + "type": 0, + "txid": "8c137774a2485beeaa3f8e861097ba6dffb144fb2c2f2c357c9261a324b02013", + "inner_hash": "92da4c2d6e93a6f0a62899225a9195b95eb274f8e926b0a2ce5d259f84015014", + "fee": 1, + "sigs": [ + "84f9c7b5d1f88245b53d50e4e8d4fd8719089768940a4ff9d8c3d88b15c300e57f91fa07a0789bbfac8e7c77aebda83d39c6b77aa80cd70a613bf175c316b6cc00" + ], + "inputs": [ + { + "uxid": "2f146924431e8c9b84a53d4d823acefb92515a264956d873ac86066c608af418", + "owner": "3vbfHxPzMuyFJvgHdAoqmFnyg6k8HiLyxd", + "coins": "1.000000", + "hours": 1, + "calculated_hours": 1 + } + ], + "outputs": [ + { + "uxid": "5250017c47070e011cc71c44472d5ab8e957c25c9c57fc7885e0a4301c7c014c", + "dst": "tWPDM36ex9zLjJw1aPMfYTVPbYgkL2Xp9V", + "coins": "1.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 66119, + "block_seq": 21213 + }, + "time": 1523180676, + "txn": { + "timestamp": 1523180676, + "length": 220, + "type": 0, + "txid": "8cdf82ec42e8316007ed99c0b1de1d0dfd9221c757f41fdec0b36009df74085f", + "inner_hash": "c543f08bfe7b99a19f7bc4068a02e437ed4a043130e976551188c4d38b89ce8d", + "fee": 726, + "sigs": [ + "f1021744902892eb47c60f7240ce6964de3c7bf77777ce267b58df8879e208e57bd044d15a36d78bebab2897c2c61ecbbceb348cfc45152efb105960799364c401" + ], + "inputs": [ + { + "uxid": "5d69d22aff5957a18194c443557d97ec18707e4db8ee7e9a4bb8a7eef642fdff", + "owner": "tWPDM36ex9zLjJw1aPMfYTVPbYgkL2Xp9V", + "coins": "16.000000", + "hours": 1432, + "calculated_hours": 1452 + } + ], + "outputs": [ + { + "uxid": "0020ae8da2bcc7657f3b234cbb59e0fd2486c53d7ef3f05cda6ff613587c8441", + "dst": "3vbfHxPzMuyFJvgHdAoqmFnyg6k8HiLyxd", + "coins": "1.000000", + "hours": 1 + }, + { + "uxid": "9d79ad07a90fee10b59bea1bd6f566f0b69f6bf9a9e735c1bec4b0e5eb4b33cb", + "dst": "21YPgFwkLxQ1e9JTCZ43G7JUyCaGRGqAsda", + "coins": "15.000000", + "hours": 725 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 66118, + "block_seq": 21214 + }, + "time": 1523180976, + "txn": { + "timestamp": 1523180976, + "length": 220, + "type": 0, + "txid": "be67302e8f6f579423ba38be29de0de19815ec3c91352c6540e5f75439eb9f22", + "inner_hash": "ef091437da13980547e33aa8647cdd1462384ec73cd57caf289e5410e3a96cf0", + "fee": 2243, + "sigs": [ + "d8636af89bf7f7c6aeaf32a994f8efc6e62bc25bd4e2d7b0a4deeb1e0e2888c234895f978e051985964f8b522e7d68794b90d6404809464d6c86af7153d5896e01" + ], + "inputs": [ + { + "uxid": "c981f19ff129c5746940cbf4e57383bcdf524a02055219c629e5fc4ff74067ab", + "owner": "tWPDM36ex9zLjJw1aPMfYTVPbYgkL2Xp9V", + "coins": "3.000000", + "hours": 111, + "calculated_hours": 4486 + } + ], + "outputs": [ + { + "uxid": "ba74051563bbe6aac1836780770a66bf782a4b3a90c5ea341b43cb85a7f9d51b", + "dst": "3vbfHxPzMuyFJvgHdAoqmFnyg6k8HiLyxd", + "coins": "1.000000", + "hours": 1 + }, + { + "uxid": "80ad81c7de66f2839b24896340890c77a79b8409abdf8e9956f5e3b65baa545b", + "dst": "tWPDM36ex9zLjJw1aPMfYTVPbYgkL2Xp9V", + "coins": "2.000000", + "hours": 2242 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 66117, + "block_seq": 21215 + }, + "time": 1523181146, + "txn": { + "timestamp": 1523181146, + "length": 183, + "type": 0, + "txid": "5b6318a95f32487a6340f35a03cd46cba8c87d261e80ad3106a0e67d4cd4601b", + "inner_hash": "33144c33224f1a59f75fba415a67834260e7253958d7130a0e9c0fe342ff608e", + "fee": 1, + "sigs": [ + "231ac8febcb4b34f6742e2c6b20690c09acffea135707fb5b6679b9cf943b9b529a06cb161e3b51d0c37e5126ce9dbf59e87eaeac511ae06d2beca5d2300611500" + ], + "inputs": [ + { + "uxid": "0020ae8da2bcc7657f3b234cbb59e0fd2486c53d7ef3f05cda6ff613587c8441", + "owner": "3vbfHxPzMuyFJvgHdAoqmFnyg6k8HiLyxd", + "coins": "1.000000", + "hours": 1, + "calculated_hours": 1 + } + ], + "outputs": [ + { + "uxid": "2a5d9458199c977779347d160f7db4978059c70217c44f8fc34716be43b7c6f1", + "dst": "tWPDM36ex9zLjJw1aPMfYTVPbYgkL2Xp9V", + "coins": "1.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 66112, + "block_seq": 21220 + }, + "time": 1523184176, + "txn": { + "timestamp": 1523184176, + "length": 183, + "type": 0, + "txid": "4acd61d7aa7dfe20795e517d7560643d049036af9451bcbd762793bcb6a4a6de", + "inner_hash": "c01a389f1018cf41d4ef36d550162999d82211f24f3d8b2cbf40a88edfaf690b", + "fee": 1, + "sigs": [ + "8ce6eff33887a8c2e31b669138163e2bcc2161782754d79c3a4c6839b4cf1fbc5a7d5e0576060d0378fbd9ee5c0f4863f949c77e7f724a4d66d75b2aed9123ae00" + ], + "inputs": [ + { + "uxid": "ba74051563bbe6aac1836780770a66bf782a4b3a90c5ea341b43cb85a7f9d51b", + "owner": "3vbfHxPzMuyFJvgHdAoqmFnyg6k8HiLyxd", + "coins": "1.000000", + "hours": 1, + "calculated_hours": 1 + } + ], + "outputs": [ + { + "uxid": "a0777af14223bbbd5aeb8bf3cfd6ba94c776c6eec731310caaaaee49b9feb9a5", + "dst": "tWPDM36ex9zLjJw1aPMfYTVPbYgkL2Xp9V", + "coins": "1.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 66111, + "block_seq": 21221 + }, + "time": 1523184376, + "txn": { + "timestamp": 1523184376, + "length": 183, + "type": 0, + "txid": "f3c5cfd462d95e724b7d35b1688c53f25a5f358f2eb9a6f87b63cdf31deb2bf8", + "inner_hash": "8269589c228be4bc33d75f6ee5b334856e8680b7d6ec275f897406c01da8340b", + "fee": 370, + "sigs": [ + "33879494d644df45b5c6c7111c0e453cd42f6fe718614a9411d9fbabd57ab24749813cdf47424dcac5ed097a0de0ac7b557154d2ec93f81b12b1dfdee5138df701" + ], + "inputs": [ + { + "uxid": "9d79ad07a90fee10b59bea1bd6f566f0b69f6bf9a9e735c1bec4b0e5eb4b33cb", + "owner": "21YPgFwkLxQ1e9JTCZ43G7JUyCaGRGqAsda", + "coins": "15.000000", + "hours": 725, + "calculated_hours": 739 + } + ], + "outputs": [ + { + "uxid": "c51b2692aa9f296a3cd2f37b14f39c496c82f5c5ae01c54701ea60b7353f27e2", + "dst": "tWPDM36ex9zLjJw1aPMfYTVPbYgkL2Xp9V", + "coins": "15.000000", + "hours": 369 + } + ] + } + } +] +``` +
+ +### Verify address +Verify whether a given address is a valid skycoin addres or not. + +```bash +$ skycoin-cli verifyAddress [skycoin address] +``` + +#### Example +##### Valid addresss + +```bash +$ skycoin-cli verifyAddress 21YPgFwkLxQ1e9JTCZ43G7JUyCaGRGqAsda +``` + +``` +No Output +``` + +##### Invalid Address +###### Invalid checksum +```bash +$ skycoin-cli verifyAddress 21YPgFwkLxQ1e9JTCZ43G7JUyCaGRGqAsdx +``` + +
+ View Output + +``` +Invalid checksum +``` +
+ +###### Invalid address length +```bash +$ skycoin-cli verifyAddress 21YPg +``` + +
+ View Output + +``` +Invalid address length +``` +
+ + +### Check wallet balance +Check the wallet a skycoin wallet. + +```bash +$ skycoin-cli walletBalance [wallet] +``` + +#### Example +##### Balance of default wallet +```bash +$ skycoin-cli walletBalance +``` + +
+ View Output + +```json +{ + "confirmed": { + "coins": "123.000000", + "hours": "456" + }, + "spendable": { + "coins": "123.000000", + "hours": "456" + }, + "expected": { + "coins": "123.000000", + "hours": "456" + }, + "addresses": [ + { + "confirmed": { + "coins": "123.000000", + "hours": "456" + }, + "spendable": { + "coins": "123.000000", + "hours": "456" + }, + "expected": { + "coins": "123.000000", + "hours": "456" + }, + "address": "2iVtHS5ye99Km5PonsB42No3pQRGEURmxyc" + }, { + "confirmed": { + "coins": "0.000000", + "hours": "0" + }, + "spendable": { + "coins": "0.000000", + "hours": "0" + }, + "expected": { + "coins": "0.000000", + "hours": "0" + }, + "address": "2GgFvqoyk9RjwVzj8tqfcXVXB4orBwoc9qv" + } + ] +} +``` +
+ + +##### Balance of a specific wallet +```bash +$ skycoin-cli walletBalance 2018_04_01_198c.wlt +``` +*OR* + +```bash +$ skycoin-cli walletBalance ~/.skycoin/wallets/2018_04_01_198c.wlt +``` + +
+ View Output + +```json +{ + "confirmed": { + "coins": "31.000000", + "hours": "25255" + }, + "spendable": { + "coins": "31.000000", + "hours": "25255" + }, + "expected": { + "coins": "31.000000", + "hours": "25255" + }, + "addresses": [ + { + "confirmed": { + "coins": "0.000000", + "hours": "0" + }, + "spendable": { + "coins": "0.000000", + "hours": "0" + }, + "expected": { + "coins": "0.000000", + "hours": "0" + }, + "address": "29fDBQuJs2MDLymJsjyWH6rDjsyv995SrGU" + }, + { + "confirmed": { + "coins": "31.000000", + "hours": "25255" + }, + "spendable": { + "coins": "31.000000", + "hours": "25255" + }, + "expected": { + "coins": "31.000000", + "hours": "25255" + }, + "address": "tWPDM36ex9zLjJw1aPMfYTVPbYgkL2Xp9V" + } + ] +} +``` +
+ +### List wallet transaction history +Show all previous transactions made by the addresses in a wallet. + +```bash +$ skycoin-cli walletHistory [wallet] +``` + +#### Example + +```bash +$ skycoin-cli walletHistory $WALLET_FILE +``` + +
+ View Output + +```json +[ + { + "txid": "d1ded06a49b7588b897a2186bbe76de7ee93f49084ad35e1a7f47cbf6cd3a7fa", + "address": "tWPDM36ex9zLjJw1aPMfYTVPbYgkL2Xp9V", + "amount": "1.000000", + "timestamp": "2018-01-28T13:11:15Z", + "status": 1 + }, + { + "txid": "ad191f910e5508e0b0e0ab24ba815e784a1a2b63ca21043e7746bebf25106742", + "address": "tWPDM36ex9zLjJw1aPMfYTVPbYgkL2Xp9V", + "amount": "1.000000", + "timestamp": "2018-01-28T13:26:15Z", + "status": 1 + } +] +``` +
+ +### List wallet outputs +List unspent outputs of all addresses in a wallet. + +```bash +$ skycoin-cli walletOutputs [wallet] +``` + +#### Example + +```bash +$ skycoin-cli walletHistory $WALLET_FILE +``` + +
+ View Output + +```json +{ + "outputs": { + "head_outputs": [ + { + "hash": "c51b2692aa9f296a3cd2f37b14f39c496c82f5c5ae01c54701ea60b7353f27e2", + "time": 1523184376, + "block_seq": 21221, + "src_tx": "f3c5cfd462d95e724b7d35b1688c53f25a5f358f2eb9a6f87b63cdf31deb2bf8", + "address": "tWPDM36ex9zLjJw1aPMfYTVPbYgkL2Xp9V", + "coins": "15.000000", + "hours": 369, + "calculated_hours": 370 + }, + { + "hash": "a0777af14223bbbd5aeb8bf3cfd6ba94c776c6eec731310caaaaee49b9feb9a5", + "time": 1523184176, + "block_seq": 21220, + "src_tx": "4acd61d7aa7dfe20795e517d7560643d049036af9451bcbd762793bcb6a4a6de", + "address": "tWPDM36ex9zLjJw1aPMfYTVPbYgkL2Xp9V", + "coins": "1.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outgoing_outputs": [], + "incoming_outputs": [] + } +} +``` +
+ +### Richlist +Returns top N address (default 20) balances (based on unspent outputs). Optionally include distribution addresses (exluded by default). + +```bash +$ skycoin-cli richlist [top N addresses (20 default)] [include distribution addresses (false default)] +``` + +#### Example +##### Without distribution addresses +```bash +$ skycoin-cli richlist 2 +``` +
+ View Output + +```json +{ + "richlist": [ + { + "address": "zVzkqNj3Ueuzo54sbACcYBqqGBPCGAac5W", + "coins": "2922927.299000", + "locked": false + }, + { + "address": "2iNNt6fm9LszSWe51693BeyNUKX34pPaLx8", + "coins": "675256.308000", + "locked": false + } + ] +} +``` +
+ +##### Including distribution addresses +```bash +$ skycoin-cli richlist 2 true +``` + +
+ View Output + +```json +{ + "richlist": [ + { + "address": "zVzkqNj3Ueuzo54sbACcYBqqGBPCGAac5W", + "coins": "2922927.299000", + "locked": false + }, + { + "address": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.010000", + "locked": true + } + ] +} +``` +
+ +### Address Count +Returns the count of all addresses that currently have unspent outputs (coins) associated with them. + +```bash +$ skycoin-cli addresscount +``` + +#### Example +```bash +$ skycoin-cli addresscount +``` +
+ View Output + +```json +12961 +``` +
+ + +### CLI version +Get version of current skycoin cli. + +```bash +$ skycoin-cli version [flags] +``` + +``` +FLAGS: + -j, --json Returns the results in JSON format +``` + +#### Examples +##### Text output +```bash +$ skycoin-cli version +``` + +
+ View Output + +``` +skycoin:0.23.0 +cli:0.23.0 +rpc:0.23.0 +wallet:0.23.0 +``` +
+ +##### JSON output +```bash +$ skycoin-cli version --json +``` + +
+ View Output + +```json +{ + "skycoin": "0.23.0", + "cli": "0.23.0", + "rpc": "0.23.0", + "wallet": "0.23.0" +} +``` +
+ +### Distribute coins from genesis block + +Distribute the genesis block coins into the configured distribution addresses. +This is part of the fiber coin initialization procedure. After creating genesis +key configuration and running the initial node, use this command to divide the +genesis block into distribution addresses. + +```bash +$ skycoin-cli distributeGenesis [genesis address secret key] +``` + +The secret key is the secret key of the genesis address, which you would have +created when setting up the genesis block parameters. + +#### Example + +```bash +$ skycoin-cli distributeGenesis 87b2ae65a7475481f73288b617242261e2a451815e1c6a5478862dbb95e23e3e +``` + +
+ View Output + +There is no output in the terminal if the command succeeds. + +``` +``` +
diff --git a/vendor/github.com/SkycoinProject/skycoin/cmd/skycoin-cli/skycoin-cli.go b/vendor/github.com/SkycoinProject/skycoin/cmd/skycoin-cli/skycoin-cli.go new file mode 100644 index 00000000..571e37d5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/cmd/skycoin-cli/skycoin-cli.go @@ -0,0 +1,34 @@ +/* +cli is a command line client for interacting with a skycoin node and offline wallet management +*/ +package main + +import ( + "fmt" + "os" + + "github.com/sirupsen/logrus" + + "github.com/SkycoinProject/skycoin/src/cli" + "github.com/SkycoinProject/skycoin/src/util/logging" +) + +func main() { + logging.SetLevel(logrus.WarnLevel) + + cfg, err := cli.LoadConfig() + if err != nil { + fmt.Println(err) + os.Exit(1) + } + + skyCLI, err := cli.NewCLI(cfg) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + + if err := skyCLI.Execute(); err != nil { + os.Exit(1) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/cmd/skycoin-cli/skycoin-cli_test.go b/vendor/github.com/SkycoinProject/skycoin/cmd/skycoin-cli/skycoin-cli_test.go new file mode 100644 index 00000000..86f01a22 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/cmd/skycoin-cli/skycoin-cli_test.go @@ -0,0 +1,10 @@ +// +build testrunmain + +// This file allows us to run the entire program with test coverage enabled, useful for integration tests +package main + +import "testing" + +func TestRunMain(t *testing.T) { + main() +} diff --git a/vendor/github.com/SkycoinProject/skycoin/cmd/skycoin/README.md b/vendor/github.com/SkycoinProject/skycoin/cmd/skycoin/README.md new file mode 100644 index 00000000..ac0df24e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/cmd/skycoin/README.md @@ -0,0 +1,719 @@ +# Skycoin Daemon CLI Options + + + +- [Preface](#preface) +- [Scenarios](#scenarios) + - [Control which API endpoints are exposed](#control-which-api-endpoints-are-exposed) + - [Run a public API node](#run-a-public-api-node) + - [Run a public API node with a self-signed cert](#run-a-public-api-node-with-a-self-signed-cert) + - [Control which peers the node connects to](#control-which-peers-the-node-connects-to) + - [Add Basic auth to the REST API interface](#add-basic-auth-to-the-rest-api-interface) +- [Options](#options) + - [address](#address) + - [block-publisher](#block-publisher) + - [blockchain-public-key](#blockchain-public-key) + - [blockchain-secret-key](#blockchain-secret-key) + - [burn-factor-create-block](#burn-factor-create-block) + - [burn-factor-unconfirmed](#burn-factor-unconfirmed) + - [color-log](#color-log) + - [connection-rate](#connection-rate) + - [custom-peers-file](#custom-peers-file) + - [data-dir](#data-dir) + - [db-path](#db-path) + - [db-read-only](#db-read-only) + - [disable-api-sets](#disable-api-sets) + - [disable-csp](#disable-csp) + - [disable-csrf](#disable-csrf) + - [disable-default-peers](#disable-default-peers) + - [disable-header-check](#disable-header-check) + - [disable-incoming](#disable-incoming) + - [disable-outgoing](#disable-outgoing) + - [disable-pex](#disable-pex) + - [download-peerlist](#download-peerlist) + - [enable-all-api-sets](#enable-all-api-sets) + - [enable-api-sets](#enable-api-sets) + - [enable-gui](#enable-gui) + - [genesis-address](#genesis-address) + - [genesis-signature](#genesis-signature) + - [genesis-timestamp](#genesis-timestamp) + - [gui-dir](#gui-dir) + - [host-whitelist](#host-whitelist) + - [http-prof](#http-prof) + - [http-prof-host](#http-prof-host) + - [launch-browser](#launch-browser) + - [localhost-only](#localhost-only) + - [log-level](#log-level) + - [logtofile](#logtofile) + - [max-block-size](#max-block-size) + - [max-connections](#max-connections) + - [max-decimals-create-block](#max-decimals-create-block) + - [max-decimals-unconfirmed](#max-decimals-unconfirmed) + - [max-default-peer-outgoing-connections](#max-default-peer-outgoing-connections) + - [max-incoming-connections](#max-incoming-connections) + - [max-in-msg-len](#max-in-msg-len) + - [max-out-msg-len](#max-out-msg-len) + - [max-outgoing-connections](#max-outgoing-connections) + - [max-txn-size-create-block](#max-txn-size-create-block) + - [max-txn-size-unconfirmed](#max-txn-size-unconfirmed) + - [no-ping-log](#no-ping-log) + - [peerlist-size](#peerlist-size) + - [peerlist-url](#peerlist-url) + - [port](#port) + - [profile-cpu](#profile-cpu) + - [profile-cpu-file](#profile-cpu-file) + - [reset-corrupt-db](#reset-corrupt-db) + - [storage-dir](#storage-dir) + - [user-agent-remark](#user-agent-remark) + - [verify-db](#verify-db) + - [version](#version) + - [wallet-crypto-type](#wallet-crypto-type) + - [wallet-dir](#wallet-dir) + - [web-interface](#web-interface) + - [web-interface-addr](#web-interface-addr) + - [web-interface-cert](#web-interface-cert) + - [web-interface-https](#web-interface-https) + - [web-interface-key](#web-interface-key) + - [web-interface-password](#web-interface-password) + - [web-interface-plaintext-auth](#web-interface-plaintext-auth) + - [web-interface-port](#web-interface-port) + - [web-interface-username](#web-interface-username) +- [Development Environment Variables](#development-environment-variables) + - [USER_BURN_FACTOR](#userburnfactor) + - [USER_MAX_TXN_SIZE](#usermax_txnsize) + - [USER_MAX_DECIMALS](#usermaxdecimals) + + + + +## Preface + +*Note: The defaults shown below can vary depending on the build configuration.* + +``` +» go run cmd/skycoin/skycoin.go --help + +Usage: + -address string + IP Address to run application on. Leave empty to default to a public interface + -block-publisher + run the daemon as a block publisher + -blockchain-public-key string + public key of the blockchain (default "0328c576d3f420e7682058a981173a4b374c7cc5ff55bf394d3cf57059bbe6456a") + -blockchain-secret-key string + secret key of the blockchain + -burn-factor-create-block uint + coinhour burn factor applied when creating blocks (default 10) + -burn-factor-unconfirmed uint + coinhour burn factor applied to unconfirmed transactions (default 10) + -color-log + Add terminal colors to log output (default true) + -connection-rate duration + How often to make an outgoing connection (default 5s) + -custom-peers-file string + load custom peers from a newline separate list of ip:port in a file. Note that this is different from the peers.json file in the data directory + -data-dir string + directory to store app data (defaults to ~/.skycoin) (default "$HOME/.skycoin") + -db-path string + path of database file (defaults to ~/.skycoin/data.db) + -db-read-only + open bolt db read-only + -disable-api-sets string + disable API set. Options are READ, STATUS, WALLET, TXN, PROMETHEUS, NET_CTRL, INSECURE_WALLET_SEED, STORAGE. Multiple values should be separated by comma + -disable-csp + disable content-security-policy in http response + -disable-csrf + disable CSRF check + -disable-default-peers + disable the hardcoded default peers + -disable-header-check + disables the host, origin and referer header checks. + -disable-incoming + Don't allow incoming connections + -disable-networking + Disable all network activity + -disable-outgoing + Don't make outgoing connections + -disable-pex + disable PEX peer discovery + -download-peerlist + download a peers.txt from -peerlist-url (default true) + -enable-all-api-sets + enable all API sets, except for deprecated or insecure sets. This option is applied before -disable-api-sets. + -enable-api-sets string + enable API set. Options are READ, STATUS, WALLET, TXN, PROMETHEUS, NET_CTRL, INSECURE_WALLET_SEED, STORAGE. Multiple values should be separated by comma (default "READ,TXN") + -enable-gui + Enable GUI + -genesis-address string + genesis address (default "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6") + -genesis-signature string + genesis block signature (default "eb10468d10054d15f2b6f8946cd46797779aa20a7617ceb4be884189f219bc9a164e56a5b9f7bec392a804ff3740210348d73db77a37adb542a8e08d429ac92700") + -genesis-timestamp uint + genesis block timestamp (default 1426562704) + -gui-dir string + static content directory for the HTML interface (default "./src/gui/static/") + -help + Show help + -host-whitelist string + Hostnames to whitelist in the Host header check. Only applies when the web interface is bound to localhost. + -http-prof + run the HTTP profiling interface + -http-prof-host string + hostname to bind the HTTP profiling interface to (default "localhost:6060") + -launch-browser + launch system default webbrowser at client startup + -localhost-only + Run on localhost and only connect to localhost peers + -log-level string + Choices are: debug, info, warn, error, fatal, panic (default "INFO") + -logtofile + log to file + -max-block-size uint + maximum total size of transactions in a block (default 32768) + -max-connections int + Maximum number of total connections allowed (default 128) + -max-decimals-create-block uint + max number of decimal places applied when creating blocks (default 3) + -max-decimals-unconfirmed uint + max number of decimal places applied to unconfirmed transactions (default 3) + -max-default-peer-outgoing-connections int + The maximum default peer outgoing connections allowed (default 1) + -max-in-msg-len int + Maximum length of incoming wire messages (default 1048576) + -max-out-msg-len int + Maximum length of outgoing wire messages (default 262144) + -max-outgoing-connections int + Maximum number of outgoing connections allowed (default 8) + -max-txn-size-create-block uint + maximum size of a transaction applied when creating blocks (default 32768) + -max-txn-size-unconfirmed uint + maximum size of an unconfirmed transaction (default 32768) + -no-ping-log + disable "reply to ping" and "received pong" debug log messages + -peerlist-size int + Max number of peers to track in peerlist (default 65535) + -peerlist-url string + with -download-peerlist=true, download a peers.txt file from this url (default "https://downloads.skycoin.com/blockchain/peers.txt") + -port int + Port to run application on (default 6000) + -profile-cpu + enable cpu profiling + -profile-cpu-file string + where to write the cpu profile file (default "cpu.prof") + -reset-corrupt-db + reset the database if corrupted, and continue running instead of exiting + -storage-dir string + location of the storage data files. Defaults to ~/.skycoin/data/ + -user-agent-remark string + additional remark to include in the user agent sent over the wire protocol + -verify-db + check the database for corruption + -version + show node version + -wallet-crypto-type string + wallet crypto type. Can be sha256-xor or scrypt-chacha20poly1305 (default "scrypt-chacha20poly1305") + -wallet-dir string + location of the wallet files. Defaults to ~/.skycoin/wallet/ + -web-interface + enable the web interface (default true) + -web-interface-addr string + addr to serve web interface on (default "127.0.0.1") + -web-interface-cert string + skycoind.cert file for web interface HTTPS. If not provided, will autogenerate or use skycoind.cert in --data-dir + -web-interface-https + enable HTTPS for web interface + -web-interface-key string + skycoind.key file for web interface HTTPS. If not provided, will autogenerate or use skycoind.key in --data-dir + -web-interface-password string + password for the web interface + -web-interface-plaintext-auth + allow web interface auth without https + -web-interface-port int + port to serve web interface on (default 6420) + -web-interface-username string + username for the web interface +``` + +## Scenarios + +### Control which API endpoints are exposed + +API endpoints are grouped into "API sets", and can be toggled on or off through CLI options. + +There are three options for controlling the API sets that are enabled: + +* `--enable-api-sets` +* `--enable-all-api-sets` +* `--disable-api-sets` + +To blacklist specific API sets, combine `--enable-all-api-sets` with `--disable-api-sets`. + +To whitelist specific API sets, use `--enable-api-sets`. + +Note that certain API sets must be explicitly enabled. These API sets are either deprecated or have security implications. + +Read more about API sets here: https://github.com/SkycoinProject/skycoin/blob/develop/src/api/README.md#api-sets + +### Run a public API node + +This example does not use HTTPS. We recommend you follow the nginx guide below +to add HTTPS to your API node. + +```sh +$ go run cmd/skycoin/skycoin.go \ + --web-interface-addr=0.0.0.0 \ + --enable-api-sets=READ,TXN +``` + +This will expose your node's API on your server's public IP and on the default port 6420. + +### Run a public API node with a self-signed cert + +When you run with the HTTPS option, the daemon will use a cert and key file from the `data-dir`. +This cert and key file will be autogenerated if they are missing from the `data-dir`. + +```sh +go run cmd/skycoin/skycoin.go \ + --web-interface-https \ + --web-interface-addr=0.0.0.0 \ + --enable-api-sets=READ,TXN +``` + +Alternatively, you can specify the cert and key files to be some other location. If specified, they will not be autogenerated. +The specified files must exist: + +```sh +go run cmd/skycoin/skycoin.go \ + --web-interface-https \ + --web-interface-key=/var/local/skycoind.key \ + --web-interface-cert=/var/local/skycoind.cert \ + --enable-api-sets=READ,TXN +``` + +If you want to use a signed cert, we recommend handling that with nginx, which will also help you bind to port 80/443. + +### Control which peers the node connects to + +First, make sure the `peers.json` file in the `data-dir` is empty or does not exist. + +Provide a `custom-peers-file`, which is a newline separated list of ip:port entries. + +Disable the default bootstrap peers, and disable the remote peerlist bootstrap. + +There is no explicit setting for max incoming connections; it is equal to the difference between `--max-connections` and `--max-outgoing-connections`, +so set these two options to the same value. + +```sh +go run cmd/skycoin/skycoin.go \ + --custom-peers-file=peers-whitelist.txt \ + --disable-default-peers \ + --download-peerlist=false \ + --max-connections=8 \ + --max-outgoing-connections=8 \ + --disable-pex \ + --disable-incoming +``` + +### Add Basic auth to the REST API interface + +This will enable `Basic` auth on the REST API interface. It will use HTTPS with an autogenerated self-signed cert. +Your client will need to be configured to accept this cert in requests. + +*TODO - describe how to configure the cli client to use the self-signed cert* + +```sh +$ go run cmd/skycoin/skycoin.go \ + --web-interface-https \ + --web-interface-username=abcdef \ + --web-interface-password='aCN@9xA)(CZasdmc' +``` + +## Options + +### address + +The bind interface address for the wire protocol. Binds to a public interface by default. + +### block-publisher + +Runs the node as a block publisher. Must set `blockchain-secret-key`. + +### blockchain-public-key + +The public key of the block signer + +### blockchain-secret-key + +The secret key of the block signer. Required for `block-publisher` mode. + +### burn-factor-create-block + +The coin hour burn factor applied to transactions when creating blocks. +Transactions that don't satisfy this burn factor will not be included in blocks. +Only applies when running in `block-publisher` mode. + +### burn-factor-unconfirmed + +The coin hour burn factor applied to unconfirmed transactions received over the network. +Transactions that don't satisfy this burn factor will not be propagated to peers. + +### color-log + +Use color highlighting in the log output. Disable this when logging to a file. + +### connection-rate + +How often an outgoing connection attempt is made. +A faster rate will establish a stable connection sooner, but if it is too fast +it can overconnect and churn connections. + +### custom-peers-file + +Load peers from this file into the peer database. The file format is a newline-separated list of ip:port entries. +These peers are *added* to any existing peer database; it does not restrict the peers to those in this file. + +### data-dir + +The storage location for application data. By default, the database, wallets, peers cache and other data files +will be saved into this folder. + +On Linux and MacOS, this folder defaults to `$HOME/.skycoin` (`~/.skycoin`). +On Windows release builds, this folder defaults to `%HOMEPATH%\.skycoin` (`C:\Users\{user}\.skycoin`). +On Windows development builds, this folder defaults to `C:\.skycoin`. *(Note: this is a bug and will change in the future)* + +### db-path + +The path of the blockchain database file. Defaults to a file named `data.db` in `data-dir`. + +### db-read-only + +Open the database file in read-only mode. + +### disable-api-sets + +Disable one or more API sets. Possible API sets are: +`READ`, `STATUS`, `WALLET`, `TXN`, `PROMETHEUS`, `NET_CTRL`, `INSECURE_WALLET_SEED`, `STORAGE`. +Multiple values should be separated by comma. Combine with `enable-all-api-sets` to blacklist specific API sets. + +Read more about API sets here: https://github.com/SkycoinProject/skycoin/blob/develop/src/api/README.md#api-sets + +### disable-csp + +Disable the Content Security Policy header sent in REST API responses. + +### disable-csrf + +Disable the CSRF check for the REST API. The REST API requires a CSRF token for all `POST` and `DELETE` requests. +This is to protect the wallet client from certain attacks. If you do not have a hot wallet or do not expose your node +to a browser, it is safe to disable CSRF. + +### disable-default-peers + +Disable the default hardcoded peer list. These peers are treated differently than others; the node will always try to maintain +at least `max-default-peer-outgoing-connections` connections to peers in this list. These peers should be disabled when configuring the +node for network isolation. + +### disable-header-check + +As a security policy, the REST API will require certain values for the +`Host`, `Origin` and `Referer` headers in requests unless disabled by this option. + +### disable-incoming + +Disable all incoming connections on the wire interface. The listener will not bind to the configured `address`. + +### disable-outgoing + +Don't make any outgoing connections. + +### disable-pex + +Don't request or accept peers over the wire. + +### download-peerlist + +If true, a peer list will be downloaded from `--peerlist-url`. The peer list file format is a newline-separated list of +ip:port entries. This list helps to bootstrap the initial peer database. These peers are considered "regular" peers, as opposed +to the peers from the hardcoded default peer list which are handled slightly differently. + +### enable-all-api-sets + +Enable all API sets except for those marked `INSECURE` or `DEPRECATED`. +Combine with `disable-api-sets` to blacklist specific API sets. +Use `enable-api-sets` in addition to `enable-all-api-sets` in order to enable specific `INSECURE` or `DEPRECATED` API sets. + +Read more about API sets here: https://github.com/SkycoinProject/skycoin/blob/develop/src/api/README.md#api-sets + +### enable-api-sets + +Enable one or more API sets. Possible API sets are: +`READ`, `STATUS`, `WALLET`, `TXN`, `PROMETHEUS`, `NET_CTRL`, `INSECURE_WALLET_SEED`, `STORAGE`. +Multiple values should be separated by comma. + +Read more about API sets here: https://github.com/SkycoinProject/skycoin/blob/develop/src/api/README.md#api-sets + +### enable-gui + +Serve the wallet GUI pages over the `web-interface-addr` and `web-interface-port` on the root path `/`. + +### genesis-address + +The genesis address in the genesis block. This is used to reconstruct the genesis block, which is hardcoded in every client. + +### genesis-signature + +After the genesis block was created, it should have been signed by the `blockchain-secret-key`. This signature is configured here. + +### genesis-timestamp + +The timestamp of the genesis block. This is used to reconstruct the genesis, which is hardcoded in every client. + +### gui-dir + +The static content directory for the wallet GUI interface. + +### host-whitelist + +A comma separated list of hostnames to allow in the `Host`, `Origin` and `Referer` headers. +Use this when hosting the web interface on a domain name or proxying it through another IP address. +Or, these header checks can be disabled entirely with `disable-header-check`. + +### http-prof + +Enables go's http profiler interface, `pprof`. + +Read more about `pprof`: https://github.com/SkycoinProject/skycoin/wiki/Profiling-with-pprof + +### http-prof-host + +The interface address to bind the http profiler to. + +### launch-browser + +Open the web interface in the user's default browser. + +### localhost-only + +Bind the wire protocol `address` to localhost and only make connections to other localhost peers. + +### log-level + +Choose the log level verbosity. Choices are: `debug`, `info`, `warn`, `error`, `fatal`, `panic`. + +### logtofile + +Write the log output to a file in `data-dir`. The logs will still be written to stdout. + +### max-block-size + +Maximum total size of transactions allowed when creating a new block. This value does not affect existing blocks. +The size of a transaction is the length of its byte representation in the [Skycoin binary encoding format](https://github.com/SkycoinProject/skycoin/wiki/Skycoin-Binary-Encoding-Format). +Note that `max-block-size` is only the size limit of the transactions portion of a block; this limit does not include block metadata. +Only applies when running in `block-publisher` mode. + +### max-connections + +The maximum total number of connections to make over the wire protocol. + +### max-decimals-create-block + +The maximum number of decimal places applied to transactions when creating blocks. +Transactions that create outputs that exceed the decimal place limit will not be included in blocks. +Only applies when running in `block-publisher` mode. + +### max-decimals-unconfirmed + +The maximum number of decimal places applied to unconfirmed transactions received over the network. +Transactions that create outputs that exceed the decimal place limit will not be propagated to peers. + +### max-default-peer-outgoing-connections + +The maximum number of connections to maintain to peers from the hardcoded default peer list. +The peers in the hardcoded default peer list are maintained by Skycoin and are kept up to date with current +configurations. This value is 1 by default, to ensure at least one known stable connection is held. +More than 1 connections are not typically made, to avoid saturating the default peer connections. + +### max-incoming-connections + +**This is not an option.** This value is equal to `max-connections` minus `max-outgoing-connections`. + +### max-in-msg-len + +Maximum length of incoming wire messages. Wire messages can include block and transaction data, so this limit should +be in accordance with `max-txn-size` and `max-block-size`. +If a peer sends a message that exceeds this limit, we disconnect from that peer. + +### max-out-msg-len + +Maximum length of outgoing wire messages. Wire messages can include block and transaction data, so this limit should +be in accordance with `max-txn-size` and `max-block-size`. +If we send a message that exceeds a peer's `max-in-msg-len`, they'll disconnect from us. + +### max-outgoing-connections + +The maximum total number of outgoing connections to make over the wire protocol. + +### max-txn-size-create-block + +The maximum transaction size applied to transactions when creating blocks. +The size of a transaction is the length of its byte representation in the [Skycoin binary encoding format](https://github.com/SkycoinProject/skycoin/wiki/Skycoin-Binary-Encoding-Format). +Transactions that exceed this size will not be included in blocks. +Only applies when running in `block-publisher` mode. + +### max-txn-size-unconfirmed + +The maximum transaction size applied to unconfirmed transactions received over the network. +The size of a transaction is the length of its byte representation in the [Skycoin binary encoding format](https://github.com/SkycoinProject/skycoin/wiki/Skycoin-Binary-Encoding-Format). +Transactions that exceed this size will not be propagated to peers. + +### no-ping-log + +Disable the "reply to ping" and "received pong" debug log messages. +These are particularly noisy, and unfortunately we only have one log level for debug, +so this option was added to disable them explicitly. + +### peerlist-size + +Maximum number of peers to track in the local peer database. + +### peerlist-url + +The URL of the remote peer list bootstrap file. Defaults to https://downloads.skycoin.com/blockchain/peers.txt. + +### port + +Port to bind for the wire protocol interface. + +### profile-cpu + +Enable the CPU profiler with `pprof`. + +Read more about `pprof`: https://github.com/SkycoinProject/skycoin/wiki/Profiling-with-pprof + +### profile-cpu-file + +Where to write the CPU profile data to, on exit. + +### reset-corrupt-db + +If the database is detected to be corrupted during startup, reset the database and continue running. +Otherwise, the application will abort if it detect a corrupted database. + +The database is not always checked for corruption; it is only checked when upgrading the software and +if the upgraded version determines a corruption check is necessary. However, if `verify-db` is enabled, +then the database is always checked for corruption. + +### storage-dir + +Location where the generic data storage files are saved. Defaults to a folder named `data` inside of the `data-dir`. + +### user-agent-remark + +An additional remark to include in the user agent that is sent in the introduction packet over the wire protocol + +### verify-db + +Unconditionally check the database for corruption on start. + +The database is not always checked for corruption; it is only checked when upgrading the software and +if the upgraded version determines a corruption check is necessary. + +### version + +Print the node version and exit. + +### wallet-crypto-type + +Choose the encryption method for encrypted wallet data. Options are `sha256-xor` or `scrypt-chacha20poly1305`. +Do not use this option unless you know exactly what you are choosing; not every option provides meaningful encryption. + +### wallet-dir + +Location where the wallet files are saved. Defaults to a folder named `wallet` inside of the `data-dir`. + +### web-interface + +Enable the REST API interface. By default, it serves on http://127.0.0.1:6420. + +### web-interface-addr + +Address to bind the REST API interface to. Default `127.0.0.1`. Use `0.0.0.0` to bind to the machine's public IP interface. + +### web-interface-cert + +The certificate file for the HTTPS REST API. If not provided and HTTPS is enabled, the cert defaults to a file named `skycoind.cert` +in the `data-dir`. If this file does not exist, it will be autogenerated. + +### web-interface-https + +Use HTTPS for the REST API interface. + +### web-interface-key + +The key file for the HTTPS REST API. If not provided and HTTPS is enabled, the cert defaults to a file named `skycoind.key` +in the `data-dir`. If this file does not exist, it will be autogenerated. + +### web-interface-password + +Optional password for the REST API. Used in `Basic` authentication. + +### web-interface-plaintext-auth + +If this setting is not true, the application will not run if the REST API does not have HTTPS enabled and +is configured to use a username and/or password +(that is, if at least one of `web-interface-username` or `web-interface-password` are set). +This is to avoid sending authorization credentials in plaintext accidentally. The user must enable this setting explicitly to +send credentials in plain text. + +### web-interface-port + +Port number for the REST API interface. Default `6420`. + +### web-interface-username + +Optional username for the REST API. Used in `Basic` authentication. + +## Development Environment Variables + +These environment variables are for *development purposes only*. They are not intended +as part of the normal configuration API. That is why they are not included in the normal +configuration API (i.e. through cli `--options` or a configuration file). + +### USER_BURN_FACTOR + +The coin hour burn factor is the denominator in the ratio of coinhours that must be burned by a transaction. +For example, a burn factor of 2 means 1/2 of hours must be burned. A burn factor of 10 means 1/10 of coin hours must be burned. + +The coin hour burn factor can be configured with a `USER_BURN_FACTOR` envvar. It cannot be configured through the command line. + +```sh +$ USER_BURN_FACTOR=999 ./run-client.sh +``` + +This burn factor applies to user-created transactions. + +To control the burn factor in other scenarios, use `burn-factor-unconfirmed` and `burn-factor-create-block`. + +### USER_MAX_TXN_SIZE + +```sh +$ USER_MAX_TXN_SIZE=1024 ./run-client.sh +``` + +This maximum transaction size applies to user-created transactions. + +To control the transaction size in other scenarios, use `max-txn-size-unconfirmed` and `max-txn-size-create-block`. + +To control the max block size, use `max-block-size`. + +Transaction and block size are measured in bytes. + +### USER_MAX_DECIMALS + +```sh +$ USER_MAX_DECIMALS=4 ./run-client.sh +``` + +This maximum transaction size applies to user-created transactions. + +To control the maximum decimals in other scenarios, use `max-decimals-unconfirmed` and `max-decimals-create-block`. diff --git a/vendor/github.com/SkycoinProject/skycoin/cmd/skycoin/skycoin.go b/vendor/github.com/SkycoinProject/skycoin/cmd/skycoin/skycoin.go new file mode 100644 index 00000000..073aa3e8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/cmd/skycoin/skycoin.go @@ -0,0 +1,130 @@ +/* +skycoin daemon +*/ +package main + +/* +CODE GENERATED AUTOMATICALLY WITH FIBER COIN CREATOR +AVOID EDITING THIS MANUALLY +*/ + +import ( + "flag" + _ "net/http/pprof" + "os" + + "github.com/SkycoinProject/skycoin/src/fiber" + "github.com/SkycoinProject/skycoin/src/readable" + "github.com/SkycoinProject/skycoin/src/skycoin" + "github.com/SkycoinProject/skycoin/src/util/logging" +) + +var ( + // Version of the node. Can be set by -ldflags + Version = "0.27.0" + // Commit ID. Can be set by -ldflags + Commit = "" + // Branch name. Can be set by -ldflags + Branch = "" + // ConfigMode (possible values are "", "STANDALONE_CLIENT"). + // This is used to change the default configuration. + // Can be set by -ldflags + ConfigMode = "" + + logger = logging.MustGetLogger("main") + + // CoinName name of coin + CoinName = "skycoin" + + // GenesisSignatureStr hex string of genesis signature + GenesisSignatureStr = "eb10468d10054d15f2b6f8946cd46797779aa20a7617ceb4be884189f219bc9a164e56a5b9f7bec392a804ff3740210348d73db77a37adb542a8e08d429ac92700" + // GenesisAddressStr genesis address string + GenesisAddressStr = "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6" + // BlockchainPubkeyStr pubic key string + BlockchainPubkeyStr = "0328c576d3f420e7682058a981173a4b374c7cc5ff55bf394d3cf57059bbe6456a" + // BlockchainSeckeyStr empty private key string + BlockchainSeckeyStr = "" + + // GenesisTimestamp genesis block create unix time + GenesisTimestamp uint64 = 1426562704 + // GenesisCoinVolume represents the coin capacity + GenesisCoinVolume uint64 = 100000000000000 + + // DefaultConnections the default trust node addresses + DefaultConnections = []string{ + "139.162.121.185:6000", + "172.104.164.147:6000", + "139.162.248.183:6000", + "45.56.109.228:6000", + "173.230.130.174:6000", + "139.162.39.186:6000", + "45.33.111.142:6000", + "109.237.27.172:6000", + "172.104.41.14:6000", + } + + nodeConfig = skycoin.NewNodeConfig(ConfigMode, fiber.NodeConfig{ + CoinName: CoinName, + GenesisSignatureStr: GenesisSignatureStr, + GenesisAddressStr: GenesisAddressStr, + GenesisCoinVolume: GenesisCoinVolume, + GenesisTimestamp: GenesisTimestamp, + BlockchainPubkeyStr: BlockchainPubkeyStr, + BlockchainSeckeyStr: BlockchainSeckeyStr, + DefaultConnections: DefaultConnections, + PeerListURL: "https://downloads.skycoin.com/blockchain/peers.txt", + Port: 6000, + WebInterfacePort: 6420, + DataDirectory: "$HOME/.skycoin", + + UnconfirmedBurnFactor: 10, + UnconfirmedMaxTransactionSize: 32768, + UnconfirmedMaxDropletPrecision: 3, + CreateBlockBurnFactor: 10, + CreateBlockMaxTransactionSize: 32768, + CreateBlockMaxDropletPrecision: 3, + MaxBlockTransactionsSize: 32768, + + DisplayName: "Skycoin", + Ticker: "SKY", + CoinHoursName: "Coin Hours", + CoinHoursNameSingular: "Coin Hour", + CoinHoursTicker: "SCH", + ExplorerURL: "https://explorer.skycoin.com", + VersionURL: "https://version.skycoin.com/skycoin/version.txt", + Bip44Coin: 8000, + }) + + parseFlags = true +) + +func init() { + nodeConfig.RegisterFlags() +} + +func main() { + if parseFlags { + flag.Parse() + } + + // create a new fiber coin instance + coin := skycoin.NewCoin(skycoin.Config{ + Node: nodeConfig, + Build: readable.BuildInfo{ + Version: Version, + Commit: Commit, + Branch: Branch, + }, + }, logger) + + // parse config values + if err := coin.ParseConfig(); err != nil { + logger.Error(err) + os.Exit(1) + } + + // run fiber coin node + if err := coin.Run(); err != nil { + os.Exit(1) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/cmd/skycoin/skycoin_test.go b/vendor/github.com/SkycoinProject/skycoin/cmd/skycoin/skycoin_test.go new file mode 100644 index 00000000..7f3a2d17 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/cmd/skycoin/skycoin_test.go @@ -0,0 +1,20 @@ +// +build testrunmain + +/* +CODE GENERATED AUTOMATICALLY WITH FIBER COIN CREATOR +AVOID EDITING THIS MANUALLY +*/ + +// This file allows us to run the entire program with test coverage enabled, useful for integration tests +package main + +import "testing" + +func init() { + // Disable flag.Parse because go's test runner calls it instead + parseFlags = false +} + +func TestRunMain(t *testing.T) { + main() +} diff --git a/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-cli/Dockerfile b/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-cli/Dockerfile new file mode 100644 index 00000000..4b1e5d4e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-cli/Dockerfile @@ -0,0 +1,228 @@ +# Creates an image for skycoin development +FROM golang:1.11-stretch + +ARG BDATE="test_build" +ARG SCOMMIT="develop" + +# Image labels (see ./hooks/build for ARGS) +LABEL "org.label-schema.name"="skycoindev-cli" \ + "org.label-schema.description"="Docker image with go, node and command line tools for Skycoin developers" \ + "org.label-schema.vendor"="Skycoin project" \ + "org.label-schema.url"="skycoin.com" \ + "org.label-schema.schema-version"="1.0" \ + "org.label-schema.build-date"=$BDATE \ + "org.label-schema.vcs-url"="https://github.com/SkycoinProject/skycoin.git" \ + "org.label-schema.vcs-ref"=$SCOMMIT \ + "org.label-schema.usage"="https://github.com/SkycoinProject/skycoin/blob/"$SCOMMIT"/docker/images/dev-cli/README.md" \ + "org.label-schema.version"="1.0.0-rc.1" \ + "org.label-schema.docker.cmd"="mkdir src; docker run --rm -v src:/go/src SkycoinProject/skycoindev-cli ; go get github.com/SkycoinProject/skycoin ; sudo chown -R `whoami` src" + +# Installs nodejs and npm. Needed for moxygen. + +# Packages installed in buildpack-deps:stretch +RUN set -ex; \ + apt-get update; \ + apt-get install -y --no-install-recommends \ + autoconf \ + automake \ + bzip2 \ + dpkg-dev \ + file \ + g++ \ + gcc \ + imagemagick \ + libbz2-dev \ + libc6-dev \ + libcurl4-openssl-dev \ + libdb-dev \ + libevent-dev \ + libffi-dev \ + libgdbm-dev \ + libgeoip-dev \ + libglib2.0-dev \ + libjpeg-dev \ + libkrb5-dev \ + liblzma-dev \ + libmagickcore-dev \ + libmagickwand-dev \ + libncurses5-dev \ + libncursesw5-dev \ + libpng-dev \ + libpq-dev \ + libreadline-dev \ + libsqlite3-dev \ + libssl-dev \ + libtool \ + libwebp-dev \ + libxml2-dev \ + libxslt-dev \ + libyaml-dev \ + make \ + patch \ + xz-utils \ + zlib1g-dev \ + build-essential \ + ruby \ + ruby-dev \ + \ +# No need for MySQL client +# +# # https://lists.debian.org/debian-devel-announce/2016/09/msg00000.html +# $( \ +# # if we use just "apt-cache show" here, it returns zero because "Can't select versions from package 'libmysqlclient-dev' as it is purely virtual", hence the pipe to grep +# if apt-cache show 'default-libmysqlclient-dev' 2>/dev/null | grep -q '^Version:'; then \ +# echo 'default-libmysqlclient-dev'; \ +# else \ +# echo 'libmysqlclient-dev'; \ +# fi \ +# ) \ + ; \ + apt-get clean; \ + rm -rf /var/lib/apt/lists/* + +# Build steps in node:10 (uid=2000) +RUN groupadd --gid 2000 node \ + && useradd --uid 2000 --gid node --shell /bin/bash --create-home node + +# gpg keys listed at https://github.com/nodejs/node#release-team +RUN set -ex \ + && for key in \ + 94AE36675C464D64BAFA68DD7434390BDBE9B9C5 \ + FD3A5288F042B6850C66B31F09FE44734EB7990E \ + 71DCFD284A79C3B38668286BC97EC7A07EDE3FC1 \ + DD8F2338BAE7501E3DD5AC78C273792F7D83545D \ + C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8 \ + B9AE9905FFD7803F25714661B63B535A4C206CA9 \ + 56730D5401028683275BD23C23EFEFE93C4CFFFE \ + 77984A986EBC2AA786BC0F66B01FBB92821C587A \ + ; do \ + gpg --no-tty --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys "$key" || \ + gpg --no-tty --keyserver hkp://ipv4.pool.sks-keyservers.net --recv-keys "$key" || \ + gpg --no-tty --keyserver hkp://pgp.mit.edu:80 --recv-keys "$key" ; \ + done + +ENV NODE_VERSION 10.13.0 + +RUN ARCH= && dpkgArch="$(dpkg --print-architecture)" \ + && case "${dpkgArch##*-}" in \ + amd64) ARCH='x64';; \ + ppc64el) ARCH='ppc64le';; \ + s390x) ARCH='s390x';; \ + arm64) ARCH='arm64';; \ + armhf) ARCH='armv7l';; \ + i386) ARCH='x86';; \ + *) echo "unsupported architecture"; exit 1 ;; \ + esac \ + && curl -fsSLO --compressed "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-$ARCH.tar.xz" \ + && curl -fsSLO --compressed "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc" \ + && gpg --batch --decrypt --output SHASUMS256.txt SHASUMS256.txt.asc \ + && grep " node-v$NODE_VERSION-linux-$ARCH.tar.xz\$" SHASUMS256.txt | sha256sum -c - \ + && tar -xJf "node-v$NODE_VERSION-linux-$ARCH.tar.xz" -C /usr/local --strip-components=1 --no-same-owner \ + && rm "node-v$NODE_VERSION-linux-$ARCH.tar.xz" SHASUMS256.txt.asc SHASUMS256.txt \ + && ln -s /usr/local/bin/node /usr/local/bin/nodejs + +ENV YARN_VERSION 1.12.3 + +RUN set -ex \ + && for key in \ + 6A010C5166006599AA17F08146C2130DFD2497F5 \ + ; do \ + gpg --no-tty --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys "$key" || \ + gpg --no-tty --keyserver hkp://ipv4.pool.sks-keyservers.net --recv-keys "$key" || \ + gpg --no-tty --keyserver hkp://pgp.mit.edu:80 --recv-keys "$key" ; \ + done \ + && curl -fsSLO --compressed "https://yarnpkg.com/downloads/$YARN_VERSION/yarn-v$YARN_VERSION.tar.gz" \ + && curl -fsSLO --compressed "https://yarnpkg.com/downloads/$YARN_VERSION/yarn-v$YARN_VERSION.tar.gz.asc" \ + && gpg --batch --verify yarn-v$YARN_VERSION.tar.gz.asc yarn-v$YARN_VERSION.tar.gz \ + && mkdir -p /opt \ + && tar -xzf yarn-v$YARN_VERSION.tar.gz -C /opt/ \ + && ln -s /opt/yarn-v$YARN_VERSION/bin/yarn /usr/local/bin/yarn \ + && ln -s /opt/yarn-v$YARN_VERSION/bin/yarnpkg /usr/local/bin/yarnpkg \ + && rm yarn-v$YARN_VERSION.tar.gz.asc yarn-v$YARN_VERSION.tar.gz + +# Installs software +RUN set -ex ; \ + apt-get update ; \ + apt-get install -y --no-install-recommends \ + cmake \ + libpcre3-dev \ + gdbserver \ + gdb \ + vim \ + less \ + ctags \ + vim-scripts \ + screen \ + sudo \ + doxygen \ + valgrind \ + bsdmainutils \ + texlive-latex-base \ + ; \ + apt-get clean ; \ + rm -rf /var/lib/apt/lists/* ; \ + npm install moxygen -g ; \ + \ + \ + echo 'Installing Criterion ...' ; \ + git clone --recurse-submodules -j8 https://github.com/skycoin/Criterion /go/Criterion ; \ + cd /go/Criterion ; \ + cmake . ; \ + make install ; \ + rm -r /go/Criterion ; \ + echo 'Success nstalling Criterion ...' + +# Installs go development tools +RUN go get -u github.com/derekparker/delve/cmd/dlv && \ + go get -u github.com/FiloSottile/vendorcheck && \ + go get -u github.com/alecthomas/gometalinter && \ + gometalinter --vendored-linters --install && \ + go get -u github.com/zmb3/gogetdoc && \ + go get -u golang.org/x/tools/cmd/guru && \ + go get -u github.com/davidrjenni/reftools/cmd/fillstruct && \ + go get -u github.com/rogpeppe/godef && \ + go get -u github.com/fatih/motion && \ + go get -u github.com/nsf/gocode && \ + go get -u github.com/jstemmer/gotags && \ + go get -u github.com/josharian/impl && \ + go get -u github.com/fatih/gomodifytags && \ + go get -u github.com/dominikh/go-tools/cmd/keyify && \ + go get -u golang.org/x/tools/cmd/gorename && \ + go get -u github.com/klauspost/asmfmt/cmd/asmfmt && \ + go get -u github.com/vektra/mockery/.../ && \ + go get -u github.com/wadey/gocovmerge && \ + curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh + + +# Install vim-go development tools +RUN git clone https://github.com/fatih/vim-go /usr/share/vim/vim80/pack/dev/start/vim-go && \ + git clone https://github.com/tpope/vim-fugitive /usr/share/vim/vim80/pack/dev/start/vim-fugitive && \ + git clone https://github.com/Shougo/vimshell.vim /usr/share/vim/vim80/pack/dev/start/0vimshell && \ + git clone https://github.com/Shougo/vimproc.vim /usr/share/vim/vim80/pack/dev/start/0vimproc && \ + git clone https://github.com/w0rp/ale.git /usr/share/vim/vim80/pack/dev/start/ale && \ + cd /usr/share/vim/vim80/pack/dev/start/0vimproc && make ;\ + git clone https://github.com/iberianpig/tig-explorer.vim.git /tmp/tig-explorer;\ + cp /tmp/tig-explorer/autoload/tig_explorer.vim /usr/share/vim/vim80/autoload;\ + cp /tmp/tig-explorer/plugin/tig_explorer.vim /usr/share/vim/vim80/plugin;\ + rm -rf /tmp/tig-explorer + + +# Install SWIG-3.0.12 +RUN cd /tmp/; \ + wget http://prdownloads.sourceforge.net/swig/swig-3.0.12.tar.gz && \ + tar -zxf swig-3.0.12.tar.gz ; \ + cd swig-3.0.12 ;\ + ./configure --prefix=/usr && make && make install && \ + rm -rf /tmp/swig-* +# Install Travis CLI +# Install golangci-lint +ENV GOLANGCI_LINT 1.12.3 +RUN curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | bash -s -- -b $GOPATH/bin v$GOLANGCI_LINT + +# Install Travis CLI +RUN gem install travis + +WORKDIR $GOPATH/src/github.com/skycoin +VOLUME $GOPATH/src/ + +ENV LD_LIBRARY_PATH=/usr/local/lib diff --git a/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-cli/README.md b/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-cli/README.md new file mode 100644 index 00000000..9eea4972 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-cli/README.md @@ -0,0 +1,83 @@ +# Supported tags and respective `Dockerfile` links + +## Simple Tags + +- [`latest` (*docker/images/dev-cli/Dockerfile*)](https://github.com/SkycoinProject/skycoin/tree/develop/docker/images/dev-cli/Dockerfile) + +# Skycoin development image + +This image has the necessary tools to build, test, edit, lint and version the Skycoin +source code. It comes with the Vim editor installed, along with some plugins +to ease go development and version control with git. + +_Plase note that there is also a sister image with ["docker in docker"](https://github.com/SkycoinProject/skycoin/tree/develop/docker/images/dev-docker/) feature on it._ + +# How to use this image + +## Initialize your development environment. + +```sh +$ mkdir src +$ docker run --rm \ + -v src:/go/src SkycoinProject/skycoindev-cli \ + go get github.com/SkycoinProject/skycoin +$ sudo chown -R `whoami` src +``` + +This downloads the skycoin source to src/SkycoinProject/skycoin and changes the owner +to your user. This is necessary, because all processes inside the container run +as root and the files created by it are therefore owned by root. + +If you already have a Go development environment installed, you just need to +mount the src directory from your $GOPATH in the /go/src volume of the +container. + +## Running commands inside the container + +You can run commands by just passing the them to the image. Everything is run +in a container and deleted when finished. + +### Running tests + +```sh +$ docker run --rm \ + -v src:/go/src SkycoinProject/skycoindev-cli \ + sh -c "cd skycoin; make test" +``` + +### Running lint + +```sh +$ docker run --rm \ + -v src:/go/src SkycoinProject/skycoindev-cli \ + sh -c "cd skycoin; make lint" +``` + +### Editing code + +```sh +$ docker run --rm \ + -v src:/go/src SkycoinProject/skycoindev-cli \ + vim +``` + +## Additional tools and packages installed + +### Packages + +- dep +- tig +- swig + +### Vim's plugins + +- Ale +- tig-explorer + +## Automated builds + +Docker Cloud is configured to build images from `develop` branch on every push. +The same process is triggered for all feature branches matching the pattern +`/^([^_]+)_t([0-9]+)_.*docker.*/`. The tag generated for those images will be of the form +`feature-{\1}-{\2}`. + diff --git a/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-docker/Dockerfile b/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-docker/Dockerfile new file mode 100644 index 00000000..57f1e7b7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-docker/Dockerfile @@ -0,0 +1,79 @@ +# Creates an image for skycoin development with docker in docker +FROM SkycoinProject/skycoindev-cli:develop +ARG BDATE +ARG SCOMMIT + +# Image labels +LABEL "org.label-schema.name"="skycoindev-cli:dind" \ + "org.label-schema.description"="Skycoin cli develop image with docker in docker support" \ + "org.label-schema.vcs-url"="https://github.com/SkycoinProject/skycoin/tree/develop/docker/images/dev-docker" \ + "org.label-schema.vendor"="Skycoin project" \ + "org.label-schema.url"="skycoin.com" \ + "org.label-schema.schema-version"="1.0" \ + "org.label-schema.build-date"=$BDATE \ + "org.label-schema.vcs-ref"=$SCOMMIT \ + "org.label-schema.version"="1.0.0-rc.1" \ + "org.label-schema.usage"="https://github.com/SkycoinProject/skycoin/blob/"$SCOMMIT"/docker/images/dev-docker/README.md" \ + "org.label-schema.docker.cmd"="mkdir src; docker run --privileged --rm -v src:/go/src SkycoinProject/skycoindev-cli:dind go get github.com/SkycoinProject/skycoin; sudo chown -R `whoami` src" + +# Install docker + +RUN curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add - +RUN apt-key fingerprint 0EBFCD88 +RUN set -ex; \ + apt-get update; \ + apt-get install -y --no-install-recommends \ + lsb-release \ + software-properties-common \ + apt-transport-https ;\ + apt clean + +RUN add-apt-repository \ + "deb [arch=amd64] https://download.docker.com/linux/debian \ + $(lsb_release -cs) \ + stable" + +RUN set -ex; \ + apt-get update; \ + apt-get install -y --no-install-recommends \ + btrfs-progs \ + e2fsprogs \ + iptables \ + xfsprogs \ + ca-certificates \ + gnupg2 \ + software-properties-common \ + pigz \ + docker-ce ;\ + apt-get clean; \ + rm -rf /var/lib/apt/lists/* + +COPY modprobe.sh /usr/local/bin/modprobe + +RUN set -x \ + && groupadd dockremap \ + && useradd -g dockremap dockremap \ + && echo 'dockremap:165536:65536' >> /etc/subuid \ + && echo 'dockremap:165536:65536' >> /etc/subgid + +ENV DIND_COMMIT 3b5fac462d21ca164b3778647420016315289034 + +RUN set -ex; \ + wget -O /usr/local/bin/dind "https://raw.githubusercontent.com/docker/docker/${DIND_COMMIT}/hack/dind"; \ + chmod +x /usr/local/bin/dind; + +COPY dockerd-entrypoint.sh /usr/local/bin/ + +RUN ["chmod", "+x", "/usr/local/bin/dockerd-entrypoint.sh","/usr/local/bin/modprobe"] + +VOLUME /var/lib/docker + +EXPOSE 2375 + +#WORKDIR $GOPATH/src/github.com/skycoin +#VOLUME $GOPATH/src/ + +#ENV LD_LIBRARY_PATH=/usr/local/lib + +ENTRYPOINT ["/usr/local/bin/dockerd-entrypoint.sh"] +CMD [] diff --git a/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-docker/README.md b/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-docker/README.md new file mode 100644 index 00000000..f95d69c9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-docker/README.md @@ -0,0 +1,84 @@ +# Supported tags and respective `Dockerfile` links + +## Simple Tags + +- [`dind` (*docker/images/dev-docker/Dockerfile*)](https://github.com/SkycoinProject/skycoin/tree/develop/docker/images/dev-docker/Dockerfile) + +# Skycoin development image including [docker in docker](https://hub.docker.com/_/docker/) + +This image has the necessary tools to build, test, edit, lint and version the Skycoin +source code. It comes with the Vim editor installed, along with some plugins +to ease go development and version control with git, besides it comes with docker installed. + +# How to use this image + +## Initialize your development environment. + +```sh +$ mkdir src +$ docker run --privileged --rm \ + -v src:/go/src SkycoinProject/skycoindev-cli:dind \ + go get github.com/SkycoinProject/skycoin +$ sudo chown -R `whoami` src +``` + +This downloads the skycoin source to src/SkycoinProject/skycoin and changes the owner +to your user. This is necessary, because all processes inside the container run +as root and the files created by it are therefore owned by root. + +If you already have a Go development environment installed, you just need to +mount the src directory from your $GOPATH in the /go/src volume of the +container. + +## Running commands inside the container + +You can run commands by just passing them to the image. Everything is run +in a container and deleted when finished. + +### Running tests + +```sh +$ docker run --rm \ + -v src:/go/src SkycoinProject/skycoindev-cli:dind \ + sh -c "cd skycoin; make test" +``` + +### Running lint + +```sh +$ docker run --rm \ + -v src:/go/src SkycoinProject/skycoindev-cli:dind \ + sh -c "cd skycoin; make lint" +``` + +### Editing code + +```sh +$ docker run --rm \ + -v src:/go/src SkycoinProject/skycoindev-cli:dind \ + vim +``` + +## How to use docker in docker image + +### Start a daemon instance + +```sh +$ docker run --privileged --name some-name -d SkycoinProject/skycoindev-cli:dind +``` + +### Where to store data + +Create a data directory on the host system (outside the container) and mount this to a directory visible from inside the container. + +The downside is that you need to make sure that the directory exists, and that e.g. directory permissions and other security mechanisms on the host system are set up correctly. + +1. Create a data directory on a suitable volume on your host system, e.g. /my/own/var-lib-docker. +2. Start your docker container like this: + +```sh +$ docker run --privileged --name some-name -v /my/own/var-lib-docker:/var/lib/docker \ +-d SkycoinProject/skycoindev-cli:dind +``` + + diff --git a/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-docker/dockerd-entrypoint.sh b/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-docker/dockerd-entrypoint.sh new file mode 100644 index 00000000..05cc91b7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-docker/dockerd-entrypoint.sh @@ -0,0 +1,20 @@ +#!/bin/sh +set -e + +# no arguments passed +# or first arg is `-f` or `--some-option` +if [ "$#" -eq 0 -o "${1#-}" != "$1" ]; then + # add our default arguments + set -- dockerd \ + --host=unix:///var/run/docker.sock \ + --host=tcp://0.0.0.0:2375 \ + "$@" +fi + +if [ "$1" = 'dockerd' ]; then + # if we're running Docker, let's pipe through dind + # (and we'll run dind explicitly with "sh" since its shebang is /bin/bash) + set -- sh "$(which dind)" "$@" +fi + +exec "$@" diff --git a/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-docker/modprobe.sh b/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-docker/modprobe.sh new file mode 100644 index 00000000..b357d893 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-docker/modprobe.sh @@ -0,0 +1,20 @@ +#!/bin/sh +set -eu + +# "modprobe" without modprobe +# https://twitter.com/lucabruno/status/902934379835662336 + +# this isn't 100% fool-proof, but it'll have a much higher success rate than simply using the "real" modprobe + +# Docker often uses "modprobe -va foo bar baz" +# so we ignore modules that start with "-" +for module; do + if [ "${module#-}" = "$module" ]; then + ip link show "$module" || true + lsmod | grep "$module" || true + fi +done + +# remove /usr/local/... from PATH so we can exec the real modprobe as a last resort +export PATH='/usr/sbin:/usr/bin:/sbin:/bin' +exec modprobe "$@" diff --git a/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-vscode/Dockerfile b/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-vscode/Dockerfile new file mode 100755 index 00000000..b0ecd45f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-vscode/Dockerfile @@ -0,0 +1,106 @@ +ARG IMAGE_FROM=SkycoinProject/skycoindev-cli:develop +FROM $IMAGE_FROM + +ARG BDATE +ARG SCOMMIT +ARG VS_EXTENSIONS + +# Image labels (see ./hooks/build for ARGS) +LABEL "org.label-schema.name"="skycoindev-cli" \ + "org.label-schema.description"="Docker image with go, node, dev tools and Visual Studio Code for Skycoin developers" \ + "org.label-schema.vendor"="Skycoin project" \ + "org.label-schema.url"="skycoin.com" \ + "org.label-schema.version"="1.0.0-rc.1" \ + "org.label-schema.schema-version"="1.0" \ + "org.label-schema.build-date"=$BDATE \ + "org.label-schema.vcs-url"="https://github.com/SkycoinProject/skycoin.git" \ + "org.label-schema.vcs-ref"=$SCOMMIT \ + "org.label-schema.usage"="https://github.com/SkycoinProject/skycoin/blob/"$SCOMMIT"/docker/images/dev-vscode/README.md" \ + "org.label-schema.docker.cmd"="xhost +; cd src; docker run --rm -it -v /tmp/.X11-unix:/tmp/.X11-unix -v $PWD:/go/src -w /go/src -e DISPLAY=$DISPLAY SkycoinProject/skycoindev-vscode:develop" + +# Tell debconf to run in non-interactive mode +ENV DEBIAN_FRONTEND noninteractive + +# Create a diferent user to run VS Code +ENV HOME /home/skydev +RUN useradd --create-home --home-dir $HOME skydev \ + && chown -R skydev:skydev $HOME + +# Install dependencies for vs code +# Create and assign permissions to `user` folders +# Install golang and npm necessaries dependencies to VS Code extensions +# Add the vscode debian repo +# Install VS Code extensions passed on build arg VS_EXTENSIONS +RUN apt-get update \ + && apt-get install -y \ + apt-transport-https \ + ca-certificates \ + curl \ + gnupg \ + apt-utils \ + libasound2 \ + libatk1.0-0 \ + libcairo2 \ + libcups2 \ + libexpat1 \ + libfontconfig1 \ + libfreetype6 \ + libgtk2.0-0 \ + libpango-1.0-0 \ + libx11-xcb1 \ + libxcomposite1 \ + libxcursor1 \ + libxdamage1 \ + libxext6 \ + libxfixes3 \ + libxi6 \ + libxrandr2 \ + libxrender1 \ + libxss1 \ + libxtst6 \ + openssh-client \ + xdg-utils \ + dconf-editor \ + dbus-x11 \ + libfile-mimeinfo-perl \ + xdg-user-dirs \ + xsel \ + --no-install-recommends \ + && mkdir -p $HOME/.cache/dconf \ + && mkdir -p $HOME/.config/dconf \ + && chown skydev:skydev -R $HOME/.config \ + && chown skydev:skydev -R $HOME/.cache \ + && go get -v github.com/ramya-rao-a/go-outline \ + && go get -v github.com/uudashr/gopkgs/cmd/gopkgs \ + && go get -v github.com/acroca/go-symbols \ + && go get -v github.com/stamblerre/gocode \ + && go get -v github.com/ianthehat/godef \ + && go get -v github.com/sqs/goreturns \ + && ln -s /go/bin/gocode /go/bin/gocode-gomod \ + && ln -s /go/bin/godef /go/bin/godef-gomod \ + && npm install -g tslint typescript \ + && curl -sSL https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor | apt-key add - \ + && echo "deb [arch=amd64] https://packages.microsoft.com/repos/vscode stable main" > /etc/apt/sources.list.d/vscode.list \ + && apt-get update \ + && apt-get -y install code \ + && for ext in $VS_EXTENSIONS; do code --user-data-dir $HOME --install-extension $ext; done \ + && apt clean \ + && rm -rf /var/lib/apt/lists/* + +# Change to `skydev` and generate default user folders to avoid config problems in future +USER skydev +RUN xdg-user-dirs-update --force + +# Back to root user +USER root + +# Copy start.sh script to use it as our Docker ENTRYPOINT +COPY ./start.sh /usr/local/bin/start.sh +# backwards compat +RUN ln -s usr/local/bin/start.sh / + +WORKDIR $GOPATH/src/github.com/skycoin/ + +ENTRYPOINT ["start.sh"] + +#CMD [ "su", "skydev", "-p", "-c", "/usr/share/code/code" ] diff --git a/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-vscode/README.md b/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-vscode/README.md new file mode 100755 index 00000000..34837b00 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-vscode/README.md @@ -0,0 +1,214 @@ +# Supported tags and respective `Dockerfile` links + +## Simple Tags + +- [`develop` (*docker/images/dev-vscode/Dockerfile*)](https://github.com/SkycoinProject/skycoin/tree/develop/docker/images/dev-vscode/Dockerfile) +- [`vscode` (*docker/images/dev-vscode/Dockerfile*)](https://github.com/SkycoinProject/skycoin/tree/develop/docker/images/dev-vscode/Dockerfile) + +# Skycoin Docker image for development with [VS Code](https://code.visualstudio.com/) IDE + +This image has the necessary tools to build, test, edit, lint and version the Skycoin +source code. It comes with [Visual Studio Code](https://code.visualstudio.com/) installed and some extensions +ot speed up workspace setup for Skycoin developers. + +# How use this image + +## Initialize your development environment. + +0. Make sure you're on a system running [X](https://en.wikipedia.org/wiki/X_Window_System). + - *GNU/Linux* users should be ready to go + - *Mac OS* users can follow the following steps + * `brew install xquartz` + * **Important** Log out and log back into OS/X +1. Disable X access control (don't do this on a public-facing machine): + - *GNU/Linux* : `$ xhost +` or `$ xhost +local:docker` + - *Mac OS* : XQuartz users should follow these steps + * `open -a Xquartz` + * With `xterm` active, open up `XQuartz` in menu bar => `Preferences` => `Security`. There make sure the `Allow connections from network clients` is checked `on`. +2. `$ cd` to a path where you want to write some code (e.g. a working copy of [`SkycoinProject/skycoin`](https://github.com/SkycoinProject/skycoin) ) +3. Since Visual Studio Code inside docker container runs as user `skydev`, it's necessary apply permissions to files. + ```sh + $ sudo chown -R 777 . + ``` +4. Run docker image, either `SkycoinProject/skycoindev-vscode:develop` or `SkycoinProject/skycoindev-vscode:dind` + - *GNU/Linux* + ```sh + $ docker run --rm -it -v /tmp/.X11-unix:/tmp/.X11-unix \ + -v $(pwd):$GOPATH/src/github.com/SkycoinProject/skycoin \ + -w $GOPATH/src/github.com/SkycoinProject/skycoin \ + -e DISPLAY=$DISPLAY \ + SkycoinProject/skycoindev-vscode:develop + ``` + - *Mac OS* users running XQuartz should launch `socat` for Docker to be able to connect to the X server. Assuming `en0` is your primary network interface + ```sh + $ brew install socat + $ socat TCP-LISTEN:6000,reuseaddr,fork UNIX-CLIENT:\"$DISPLAY\" + $ export IP=$(ifconfig en0 | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p') + $ docker run --rm -it -v /tmp/.X11-unix:/tmp/.X11-unix \ + -v $(pwd):$GOPATH/src/github.com/SkycoinProject/skycoin \ + -w $GOPATH/src/github.com/SkycoinProject/skycoin \ + -e DISPLAY=$IP:0 \ + SkycoinProject/skycoindev-vscode:develop + ``` +5. You should see vscode pop up. +6. Have fun. Write some code. Close VS Code IDE window when you're done, and press `Ctrl+C` to shut down the container. Your files will be in the host machine at the same path chosen in step `2` above. +7. __Reenable X access control:__ `$ xhost -` + +For the sake of brevity, the examples that follow only include the invocation of `docker` command for GNU/Linux. Beware of the fact that there will be differences in running the Docker images on other operating systems. The hints provided above will still be valid, though. + +## Add more VS Code extensions + +If you want add more extensions, you must define `VS_EXTENSIONS` environment variable to the command-line with extensions you prefer. + +```sh + $ docker run --rm -it -v /tmp/.X11-unix:/tmp/.X11-unix + -v $PWD:/go/src/github.com/SkycoinProject/skycoin \ + -w $GOPATH/src/github.com/SkycoinProject/skycoin \ + -e DISPLAY=$DISPLAY \ + -e VS_EXTENSIONS="ms-python.python rebornix.Ruby" \ + SkycoinProject/skycoindev-vscode:dind +``` + +This downloads the skycoin source to src/SkycoinProject/skycoin and changes the owner +to your user. This is necessary, because all processes inside the container run +as root and the files created by it are therefore owned by root. + +If you already have a Go development environment installed, you just need to +mount the src directory from your `$GOPATH` at path `/go/src` inside the +container. + +```sh + $ docker run --rm -it -v /tmp/.X11-unix:/tmp/.X11-unix + -v $GOPATH/src:$GOPATH/src \ + -w $GOPATH/src/github.com/SkycoinProject/skycoin \ + -e DISPLAY=$DISPLAY \ + -e VS_EXTENSIONS="ms-python.python rebornix.Ruby" \ + SkycoinProject/skycoindev-vscode:dind +``` + +# Build your own images + +The following arguments influence the Docker build process. + +- `SOURCE_COMMIT`: the SHA1 hash of the commit being tested. +- `IMAGE_NAME`: the name and tag of the Docker repository being built. +- `DOCKERFILE_PATH`: the dockerfile currently being built. + +For instance, the following commands can be executed in order to build this VS Code dev image using `skycoindev-cli:develop` as base image. + +```sh +$ git clone https://github.com/SkycoinProject/skycoin +$ cd skycoin +$ SOURCE_COMMIT=$(git rev-parse HEAD) +$ IMAGE_NAME=SkycoinProject/skycoindev-vscode:develop +$ DOCKERFILE_PATH=docker/images/dev-vscode/Dockerfile +$ docker build --build-arg BDATE=`date -u +"%Y-%m-%dT%H:%M:%SZ"` \ + --build-arg SCOMMIT=$SOURCE_COMMIT \ + --build-arg VS_EXTENSIONS="ms-vscode.Go windmilleng.vscode-go-autotest defaltd.go-coverage-viewer" \ + -f $DOCKERFILE_PATH \ + -t "$IMAGE_NAME" . +``` + +Or, if a decision has been made for including a Docker daemon then specify `skycoindev-cli:dind` instead and run: + +```sh +$ git clone https://github.com/SkycoinProject/skycoin +$ cd skycoin +$ SOURCE_COMMIT=$(git rev-parse HEAD) +$ IMAGE_NAME=SkycoinProject/skycoindev-vscode:dind +$ DOCKERFILE_PATH=docker/images/dev-vscode/Dockerfile +$ docker build --build-arg IMAGE_FROM="SkycoinProject/skycoindev-cli:dind" \ + --build-arg BDATE=`date -u +"%Y-%m-%dT%H:%M:%SZ"` \ + --build-arg SCOMMIT=$SOURCE_COMMIT \ + --build-arg VS_EXTENSIONS="ms-python.python rebornix.Ruby" + -f $DOCKERFILE_PATH \ + -t "$IMAGE_NAME" . +``` + +As a result of following theses steps two new images will be obtained: + +`SkycoinProject/skycoindev-vscode:develop` based on [SkycoinProject/skycoindev-cli:develop](skycoin/docker/images/dev-cli) +`SkycoinProject/skycoindev-vscode:dind` based on [SkycoinProject/skycoindev-cli:dind](skycoin/docker/images/dev-docker) + +## Running commands inside the container + +You can run commands by just passing the them to the image. Everything is run +in a container and deleted when finished. + +### Running tests + +```sh +$ docker run --rm \ + -v src:/go/src SkycoinProject/skycoindev-cli \ + sh -c "cd skycoin; make test" +``` + +### Running lint + +```sh +$ docker run --rm \ + -v src:/go/src SkycoinProject/skycoindev-cli \ + sh -c "cd skycoin; make lint" +``` + +### Editing code with terminal + +Comman line tools are still available . For instance it's possible to run `vim` + +```sh +$ docker run --rm \ + -v src:/go/src SkycoinProject/skycoindev-cli \ + vim +``` + +## How to use docker in docker image + +### Start a daemon instance + +```sh +$ docker run --privileged --name some-name -d SkycoinProject/skycoindev-vscode:dind +``` + +### Where to store data + +Create a data directory on the host system (outside the container) and mount this to a directory visible from inside the container. + +The downside is that you need to make sure that the directory exists, and that e.g. directory permissions and other security mechanisms on the host system are set up correctly. + +1. Create a data directory on a suitable volume on your host system, e.g. /my/own/var-lib-docker. +2. Start your docker container like this: + +```sh +$ docker run --privileged --name some-name -v /my/own/var-lib-docker:/var/lib/docker \ +-d SkycoinProject/skycoindev-vscode:dind +``` + +## Additional tools and packages installed + +### Packages + +- dep +- tig +- swig + +### Vim plugins + +- Ale +- tig-explorer + +### VS Code extensions + +- [Go](https://marketplace.visualstudio.com/items?itemName=ms-vscode.Go) +- [Go Autotest](https://marketplace.visualstudio.com/items?itemName=windmilleng.vscode-go-autotest) +- [Go Coverage Viewer](https://marketplace.visualstudio.com/items?itemName=defaltd.go-coverage-viewer) +- [TSLint](https://marketplace.visualstudio.com/items?itemName=eg2.tslint) +- [GitLens](https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens) +- [Vim](https://marketplace.visualstudio.com/items?itemName=vscodevim.vim) + +## Automated builds + +Docker Cloud is configured to build images from `develop` branch on every push. +The same process is triggered for all feature branches matching the pattern +`/^([^_]+)_t([0-9]+)_.*vscode/`. The tag generated for those images will be of the form +`feature-{\1}-{\2}-vscode`. + diff --git a/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-vscode/hooks/push b/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-vscode/hooks/push new file mode 100755 index 00000000..f9e243fc --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-vscode/hooks/push @@ -0,0 +1,7 @@ +#!/bin/bash + +docker push $IMAGE_NAME + +if [ "$CACHE_TAG" -eq "develop" ]; then + docker push $DOCKER_REPO:dind +fi diff --git a/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-vscode/start.sh b/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-vscode/start.sh new file mode 100755 index 00000000..45bba448 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/docker/images/dev-vscode/start.sh @@ -0,0 +1,38 @@ +#!/bin/bash +set -e +set -o pipefail + +# Install vscode extensions declared on VS_EXTENSIONS +if [[ -n "$VS_EXTENSIONS" ]]; then + for ext in $VS_EXTENSIONS; do code --user-data-dir $HOME --install-extension $ext; done +fi + +# Check if skycoindev-vscode:dind image has been started +if [[ -n "$DIND_COMMIT" ]]; then + # no arguments passed + # or first arg is `-f` or `--some-option` + if [ "$#" -eq 0 -o "${1#-}" != "$1" ]; then + # add our default arguments + set -- dockerd \ + --host=unix:///var/run/docker.sock \ + --host=tcp://0.0.0.0:2375 \ + "$@" + fi + + if [ "$1" = 'dockerd' ]; then + # if we're running Docker, let's pipe through dind + # (and we'll run dind explicitly with "sh" since its shebang is /bin/bash) + set -- sh "$(which dind)" "$@" + fi +fi + +# Apply correct permissions to avoid problems when VS Code is open +chmod -R 777 /home/skydev/ + +# If user pass a command when run docker image VS Code it will be executed, +# else, we run VS Code +if [[ -n "$@" ]]; then + exec "$@" +else + su skydev -p -c /usr/share/code/code +fi diff --git a/vendor/github.com/SkycoinProject/skycoin/docker/images/mainnet/Dockerfile b/vendor/github.com/SkycoinProject/skycoin/docker/images/mainnet/Dockerfile new file mode 100644 index 00000000..8dff4118 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/docker/images/mainnet/Dockerfile @@ -0,0 +1,86 @@ +# skycoin build +# reference https://github.com/SkycoinProject/skycoin +ARG IMAGE_FROM=busybox +FROM golang:1.11-stretch AS build +ARG ARCH=amd64 +ARG GOARM +ARG SKYCOIN_VERSION +ARG SCOMMIT +ARG SBRANCH +ARG STAG + +ADD cmd $GOPATH/src/github.com/SkycoinProject/skycoin/cmd +ADD src $GOPATH/src/github.com/SkycoinProject/skycoin/src +ADD vendor $GOPATH/src/github.com/SkycoinProject/skycoin/vendor +ADD template $GOPATH/src/github.com/SkycoinProject/skycoin/template +ADD fiber.toml $GOPATH/src/github.com/SkycoinProject/skycoin/fiber.toml + +# This code checks if SKYCOIN_VERSION is set and checkouts to that version if +# so. The git stash line prevents the build to fail if there are any uncommited +# changes in the working copy. It won't affect the host working copy. +RUN sh -c \ + 'if test ${SKYCOIN_VERSION};then \ + echo "Revision is set to: "${SKYCOIN_VERSION}; \ + cd $GOPATH/src/github.com/SkycoinProject/skycoin; \ + git stash; \ + git checkout ${SKYCOIN_VERSION}; \ + fi' + +ENV GOARCH="$ARCH" \ + GOARM="$GOARM" \ + CGO_ENABLED="0" \ + GOOS="linux" \ + GOLDFLAGS="-X main.Commit=${SCOMMIT} -X main.Branch=${SBRANCH}" + +RUN cd $GOPATH/src/github.com/SkycoinProject/skycoin && \ + echo "Building with GOLDFLAGS=$GOLDFLAGS GOARCH=$GOARCH GOARM=$GOARM CGO_ENABLED=$CGO_ENABLED GOOS=$GOOS " && \ + go install -ldflags "${GOLDFLAGS}" ./cmd/... && \ + sh -c "if test -d $GOPATH/bin/linux_arm ; then mv $GOPATH/bin/linux_arm/* $GOPATH/bin/; fi; \ + if test -d $GOPATH/bin/linux_arm64 ; then mv $GOPATH/bin/linux_arm64/* $GOPATH/bin/; fi" + +RUN apt-get update && \ + apt-get install -y ca-certificates + + +RUN /bin/bash -c 'mkdir -p /tmp/files/{usr/bin,/usr/local/skycoin/src/gui/static,/usr/local/bin/,/etc/ssl}' +RUN cp -r /go/bin/* /tmp/files/usr/bin/ +RUN cp -r /go/src/github.com/SkycoinProject/skycoin/src/gui/static /tmp/files/usr/local/skycoin/src/gui/ +RUN cp -r /etc/ssl/certs /tmp/files/etc/ssl/certs +COPY docker_launcher.sh /tmp/files/usr/local/bin/docker_launcher.sh + +# skycoin image +FROM $IMAGE_FROM +ARG BDATE +ARG SCOMMIT +ARG SBRANCH +ARG STAG + +# Image labels +LABEL "org.label-schema.name"="Skycoin" \ + "org.label-schema.description"="Skycoin core docker image" \ + "org.label-schema.vcs-url"="https://github.com/SkycoinProject/skycoin/tree/develop/docker/images/mainnet" \ + "org.label-schema.vendor"="Skycoin project" \ + "org.label-schema.url"="skycoin.com" \ + "org.label-schema.schema-version"="1.0" \ + "org.label-schema.build-date"=$BDATE \ + "org.label-schema.vcs-ref"=$SCOMMIT \ + "org.label-schema.version"=$STAG \ + "org.label-schema.usage"="https://github.com/SkycoinProject/skycoin/blob/"$SCOMMIT"/docker/images/mainnet/README.md" \ + "org.label-schema.docker.cmd"="docker volume create skycoin-data; docker volume create skycoin-wallet; docker run -d -v skycoin-data:/data/.skycoin -v skycoin-wallet:/wallet -p 6000:6000 -p 6420:6420 --name skycoin-node-stable SkycoinProject/skycoin" + +ENV COIN="skycoin" +ENV RPC_ADDR="http://0.0.0.0:6420" \ + DATA_DIR="/data/.$COIN" \ + WALLET_DIR="/wallet" \ + WALLET_NAME="$COIN_cli.wlt" + +# copy all the binaries +COPY --from=build /tmp/files / + +# volumes +VOLUME $WALLET_DIR +VOLUME $DATA_DIR + +EXPOSE 6000 6420 + +ENTRYPOINT ["docker_launcher.sh", "--web-interface-addr=0.0.0.0", "--gui-dir=/usr/local/skycoin/src/gui/static"] diff --git a/vendor/github.com/SkycoinProject/skycoin/docker/images/mainnet/README.md b/vendor/github.com/SkycoinProject/skycoin/docker/images/mainnet/README.md new file mode 100644 index 00000000..b7edcf6d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/docker/images/mainnet/README.md @@ -0,0 +1,128 @@ +# Supported tags + +## Simple Tags + +- latest +- latest-arm32v5 +- latest-arm32v6 +- latest-arm32v7 +- latest-arm64v8 +- develop +- develop-arm32v5 +- develop-arm32v6 +- develop-arm32v7 +- develop-arm64v8 +- release-v0.23.0 +- release-v0.23.0-arm32v5 +- release-v0.23.0-arm32v6 +- release-v0.23.0-arm32v7 +- release-v0.23.0-arm64v8 +- release-v0.22.0 + +## Building your own images + +This Dockerfile build your working copy by default, but if you pass the +SKYCOIN_VERSION build argument to the `docker build` command, it will checkout +to the branch, a tag or a commit you specify on that variable. + +Example + +```sh +$ git clone https://github.com/SkycoinProject/skycoin +$ cd skycoin +$ SKYCOIN_VERSION=v0.24.0 +$ docker build -f docker/images/mainnet/Dockerfile \ + --build-arg=SKYCOIN_VERSION=$SKYCOIN_VERSION \ + -t skycoin:$SKYCOIN_VERSION . +``` + +or just + +```sh +$ docker build -f docker/images/mainnet/Dockerfile \ + --build-arg=SKYCOIN_VERSION=v0.24.0 \ + -t skycoin:v0.24.0 +``` + +## ARM Architecture + +Build arguments are provided to make it easy if you want to build for the ARM +architecture. + +Example for ARMv5. + +```sh +$ git clone https://github.com/SkycoinProject/skycoin +$ cd skycoin +$ docker build -f docker/images/mainnet/Dockerfile \ + --build-arg=ARCH=arm \ + --build-arg=GOARM=5 \ + --build-arg=IMAGE_FROM="arm32v5/alpine" \ + -t skycoin:$SKYCOIN_VERSION-arm32v5 . +``` + +## How to use this images + +### Run a Skycoin node + +This command pulls latest stable image from Docker Hub, and launches a node inside a Docker container that runs as a service daemon in the background. It is possible to use the tags listed above to run another version of the node + +```sh +$ docker volume create skycoin-data +$ docker volume create skycoin-wallet +$ docker run -d -v skycoin-data:/data/.skycoin \ + -v skycoin-wallet:/wallet \ + -p 6000:6000 -p 6420:6420 \ + --name skycoin-node-stable SkycoinProject/skycoin +``` + +When invoking the container this way the options of the skycoin command are set to their respective default values , except the following + +| Parameter | Value | +| ------------- | ------------- | +| web-interface-addr | 0.0.0.0 | +| gui-dir | /usr/local/skycoin/src/gui/static | + +In order to stop the container , just run + +```sh +$ docker stop skycoin-node-stable +``` + +Restart it once again by executing + +```sh +$ docker start skycoin-node-stable +``` + +### Customizing node server with parameters + +The container accepts parameters in order to customize the execution of the skycoin node. For instance, in order to run the bleeding edge development image and listen for REST API requests at a non-standard port (e.g. `6421`) it is possible to execute the following command. + +```sh + $ docker run --rm -d -v skycoin-data:/data/.skycoin \ + -v skycoin-wallet:/wallet \ + -p 6000:6000 -p 6421:6421 \ + --name skycoin-node-develop SkycoinProject/skycoin:develop -web-interface-port 6421 +``` + +Notice that the value of node parameter (e.g. `-web-interface-port`) affects the execution context inside the container. Therefore, in this particular case, the port mapping should be updated accordingly. + +To get a full list of skycoin's parameters, just run + +```sh + $ docker run --rm SkycoinProject/skycoin:develop -help +``` + +To run multiple nodes concurrently in the same host, it is highly recommended to create separate volumes for each node. For example, in order to run a block publisher node along with the one launched above, it is necessary to execute + +```sh +$ docker volume create skycoin-block-publisher-data +$ docker volume create skycoin-block-publisher-wallet +$ docker run -d -v skycoin-block-publisher-data:/data/.skycoin \ + -v skycoin-block-publisher-wallet:/wallet \ + -p 6001:6000 -p 6421:6420 \ + --name skycoin-block-publisher-stable SkycoinProject/skycoin -block-publisher +``` + +Notice that the host's port must be changed since collisions of two services listening at the same port are not allowed by the low-level operating system socket libraries. diff --git a/vendor/github.com/SkycoinProject/skycoin/docker/images/mainnet/hooks/push b/vendor/github.com/SkycoinProject/skycoin/docker/images/mainnet/hooks/push new file mode 100644 index 00000000..5fab9459 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/docker/images/mainnet/hooks/push @@ -0,0 +1,6 @@ +#!/bin/bash +docker push $IMAGE_NAME +docker push $IMAGE_NAME-arm32v5 +docker push $IMAGE_NAME-arm32v6 +docker push $IMAGE_NAME-arm32v7 +docker push $IMAGE_NAME-arm64v8 diff --git a/vendor/github.com/SkycoinProject/skycoin/docker_launcher.sh b/vendor/github.com/SkycoinProject/skycoin/docker_launcher.sh new file mode 100755 index 00000000..c87c321d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/docker_launcher.sh @@ -0,0 +1,16 @@ +#!/bin/sh +COMMAND="skycoin --data-dir $DATA_DIR --wallet-dir $WALLET_DIR $@" + +adduser -D -u 10000 skycoin + +if [[ \! -d $DATA_DIR ]]; then + mkdir -p $DATA_DIR +fi +if [[ \! -d $WALLET_DIR ]]; then + mkdir -p $WALLET_DIR +fi + +chown -R skycoin:skycoin $( realpath $DATA_DIR ) +chown -R skycoin:skycoin $( realpath $WALLET_DIR ) + +su skycoin -c "$COMMAND" diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/README.md b/vendor/github.com/SkycoinProject/skycoin/electron/README.md new file mode 100644 index 00000000..8fb54b83 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/README.md @@ -0,0 +1,132 @@ +# Build system + +The GUI client is an Electron (http://electron.atom.io/) app. + +It cross compiles for osx, linux and windows 64 bit systems. + +## Requirements + +gox (go cross compiler), node and npm. + +### gox + +To install gox: + +```sh +go get github.com/gz-c/gox +``` + +### NPM + +Node and npm installation is system dependent. + +#### Linux + +```sh +sudo apt-get install npm +sudo apt-get install nodejs-legacy +sudo npm cache clean -f + +sudo npm install -g n +sudo n stable + +node -v +npm -v +``` + +## Make sure that the wallet dist is up to date + +Recompile the wallet frontend. See [Wallet GUI Development README](../src/gui/static/README.md) for instructions. + +## Use electron-builder to pack and create app installer + +### Install electron-builder + +```sh +sudo npm install --global electron-builder +``` + +### Install electron-download + +```sh +sudo npm install --global electron-download +``` + +### For macOS + +Use brew to install required packages. + +To build app for Windows on macOS: + +```sh +brew install wine --without-x11 +brew install mono +``` + +To build app for Linux on macOS: + +```sh +brew install gnu-tar graphicsmagick xz +``` + +### Code signing + +Set the `CSC_IDENTITY_AUTO_DISCOVERY` environment variable to false if you don't want to do code signing, +otherwise, you can create a certificate in login.keychain for testing purpose. + +Create new certificate: + +> Keychain Access -> Certificate Assistant -> Create a Certificate... + +Set certificate name and select `Code Signing` as `Certificate Type`. + +Once you generated the certificate, you can use it by setting your environment variable: + +```sh +export CSC_NAME="Certificate Name" +``` + +Now, when you run electron-builder, it will choose the name and sign the app with the certificate. + +## For Linux + +To build app in distributable format for Linux: + +```sh +sudo apt-get install --no-install-recommends -y icnsutils graphicsmagick xz-utils +``` + +To build app for Windows on Linux: + +* Install Wine (1.8+ is required): + +```sh +sudo apt-get install software-properties-common +sudo add-apt-repository ppa:ubuntu-wine/ppa -y +sudo apt-get update +sudo apt-get install --no-install-recommends -y wine1.8 +``` + +* Install Mono (4.2+ is required): + +```sh +sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF +echo "deb http://download.mono-project.com/repo/debian wheezy main" | sudo tee /etc/apt/sources.list.d/mono-xamarin.list +sudo apt-get update +sudo apt-get install --no-install-recommends -y mono-devel ca-certificates-mono +``` + +To build app in 32 bit from a machine with 64 bit: + +```sh +sudo apt-get install --no-install-recommends -y gcc-multilib g++-multilib +``` + + +## Building + +```sh +./build.sh +``` + +Final results are placed in the `release/` folder. diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/assets/osx/Info.plist b/vendor/github.com/SkycoinProject/skycoin/electron/assets/osx/Info.plist new file mode 100644 index 00000000..434eb1e8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/assets/osx/Info.plist @@ -0,0 +1,37 @@ + + + + + CFBundleExecutable + Skycoin + CFBundleIdentifier + org.skycoin.Skycoin + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + Skycoin + CFBundlePackageType + APPL + LSMinimumSystemVersion + 10.7.0 + NSPrincipalClass + NSApplication + CFBundleSignature + ???? + CFBundleIconFile + appIcon.icns + LSUIElement + + CFBundleURLTypes + + + CFBundleURLName + Skycoin + CFBundleURLSchemes + + skycoin + + + + + diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/assets/osx/appIcon.icns b/vendor/github.com/SkycoinProject/skycoin/electron/assets/osx/appIcon.icns new file mode 100644 index 00000000..69e608fe Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/electron/assets/osx/appIcon.icns differ diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/build-cli-release.sh b/vendor/github.com/SkycoinProject/skycoin/electron/build-cli-release.sh new file mode 100755 index 00000000..7747b163 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/build-cli-release.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash +set -e -o pipefail + +GOX_OSARCH="$@" + +. build-conf.sh "$GOX_OSARCH" + +SKIP_COMPILATION=${SKIP_COMPILATION:-0} + +SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +pushd "$SCRIPTDIR" >/dev/null + +if [ $SKIP_COMPILATION -ne 1 ]; then + CMD="skycoin-cli" CONFIG_MODE= ./gox.sh "$GOX_OSARCH" "$GOX_CLI_OUTPUT_DIR" "$GOX_CLI_OUTPUT_NAME" +fi + +echo +echo "===========================" +echo "Packaging cli release" +./package-cli-release.sh "$GOX_OSARCH" + +echo "------------------------------" +echo "Compressing cli release" +./compress-cli-release.sh "$GOX_OSARCH" + +popd >/dev/null diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/build-conf.sh b/vendor/github.com/SkycoinProject/skycoin/electron/build-conf.sh new file mode 100755 index 00000000..e92c2ff0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/build-conf.sh @@ -0,0 +1,114 @@ +#!/usr/bin/env bash +set -e -o pipefail + +# These values are also in package.json and must be equal + +# Get skycoin build version from package.json +APP_VERSION=`grep version package.json | sed 's/[,\", ]//g'| awk '{split($0,a,":");print a[2]}'` + + +# package name +PKG_NAME=`grep productName package.json | sed 's/[,\", ]//g' | awk '{split($0,s,":");print tolower(s[2])}'` + +# product name +PDT_NAME=`grep productName package.json | sed 's/[,\", ]//g' | awk '{split($0,s,":");print s[2]}'` + +ELN_VERSION="v1.4.13" +ELN_OUTPUT_BASE=".electron_output" +ELN_OUTPUT_DIR="${ELN_OUTPUT_BASE}/${ELN_VERSION}" + + +if [ -n "$1" ]; then + GOX_OSARCH="$@" +else + GOX_OSARCH="linux/amd64 linux/arm windows/amd64 windows/386 darwin/amd64" +fi + +GOX_OUTPUT_DIR=".gox_output" +GOX_GUI_OUTPUT_DIR="${GOX_OUTPUT_DIR}/gui" +GOX_DMN_OUTPUT_DIR="${GOX_OUTPUT_DIR}/daemon" +GOX_CLI_OUTPUT_DIR="${GOX_OUTPUT_DIR}/cli" +GOX_CLI_OUTPUT_NAME="${PKG_NAME}-cli" + +STL_OUTPUT_DIR=".standalone_output" +DMN_OUTPUT_DIR=".daemon_output" +CLI_OUTPUT_DIR=".cli_output" + +FINAL_OUTPUT_DIR="release" + +GUI_DIST_DIR="../src/gui/static/dist" # Do not append "/" to this path + +# Variable suffix guide: +# _APP -- name of the OS X app +# _ELN_PLT -- directory name created by electron for its build of this platform +# _ELN -- our name for electron gui releases +# _ELN_ZIP -- our compressed name for electron gui releases +# _STL -- our name for standalone gui releases +# _STL_ZIP -- our compressed name for standalone gui releases +# _DMN -- our name for daemon releases +# _DMN_ZIP -- our compressed name for daemon releases +# _CLI -- our name for cli releases +# _CLI_ZIP -- our compressed name for cli releases + +if [[ $GOX_OSARCH == *"darwin/amd64"* ]]; then + OSX64_APP="${PDT_NAME}.app" + OSX64_ELN_PLT="darwin-x64" + OSX64_ELN="${PKG_NAME}-${APP_VERSION}-gui-electron-osx-darwin-x64" + OSX64_ELN_ZIP="${OSX64_ELN}.zip" + OSX64_STL="${PKG_NAME}-${APP_VERSION}-gui-standalone-osx-darwin-x64" + OSX64_STL_ZIP="${OSX64_STL}.zip" + OSX64_DMN="${PKG_NAME}-${APP_VERSION}-daemon-osx-darwin-x64" + OSX64_DMN_ZIP="${OSX64_DMN}.zip" + OSX64_CLI="${PKG_NAME}-${APP_VERSION}-cli-osx-darwin-x64" + OSX64_CLI_ZIP="${OSX64_CLI}.zip" + OSX64_OUT="mac_x64" +fi + +if [[ $GOX_OSARCH == *"linux/amd64"* ]]; then + LNX64_ELN="${PKG_NAME}-${APP_VERSION}-gui-electron-linux-x64" + LNX64_ELN_PLT="linux-x64" + LNX64_ELN_ZIP="${LNX64_ELN}.tar.gz" + LNX64_STL="${PKG_NAME}-${APP_VERSION}-gui-standalone-linux-x64" + LNX64_STL_ZIP="${LNX64_STL}.tar.gz" + LNX64_DMN="${PKG_NAME}-${APP_VERSION}-daemon-linux-x64" + LNX64_DMN_ZIP="${LNX64_DMN}.tar.gz" + LNX64_CLI="${PKG_NAME}-${APP_VERSION}-cli-linux-x64" + LNX64_CLI_ZIP="${LNX64_CLI}.tar.gz" + LNX64_OUT="linux_x64" +fi + +if [[ $GOX_OSARCH == *"windows/amd64"* ]]; then + WIN64_ELN="${PKG_NAME}-${APP_VERSION}-gui-electron-win-x64" + WIN64_ELN_PLT="win32-x64" + WIN64_ELN_ZIP="${WIN64_ELN}.zip" + WIN64_STL="${PKG_NAME}-${APP_VERSION}-gui-standalone-win-x64" + WIN64_STL_ZIP="${WIN64_STL}.zip" + WIN64_DMN="${PKG_NAME}-${APP_VERSION}-daemon-win-x64" + WIN64_DMN_ZIP="${WIN64_DMN}.zip" + WIN64_CLI="${PKG_NAME}-${APP_VERSION}-cli-win-x64" + WIN64_CLI_ZIP="${WIN64_CLI}.zip" + WIN64_OUT="win_x64" +fi + +if [[ $GOX_OSARCH == *"windows/386"* ]]; then + WIN32_ELN="${PKG_NAME}-${APP_VERSION}-gui-electron-win-x86" + WIN32_ELN_PLT="win32-ia32" + WIN32_ELN_ZIP="${WIN32_ELN}.zip" + WIN32_STL="${PKG_NAME}-${APP_VERSION}-gui-standalone-win-x86" + WIN32_STL_ZIP="${WIN32_STL}.zip" + WIN32_DMN="${PKG_NAME}-${APP_VERSION}-daemon-win-x86" + WIN32_DMN_ZIP="${WIN32_DMN}.zip" + WIN32_CLI="${PKG_NAME}-${APP_VERSION}-cli-win-x86" + WIN32_CLI_ZIP="${WIN32_CLI}.zip" + WIN32_OUT="win_ia32" +fi + +if [[ $GOX_OSARCH == *"linux/arm"* ]]; then + LNX_ARM_STL="${PKG_NAME}-${APP_VERSION}-gui-standalone-linux-arm" + LNX_ARM_STL_ZIP="${LNX_ARM_STL}.tar.gz" + LNX_ARM_DMN="${PKG_NAME}-${APP_VERSION}-daemon-linux-arm" + LNX_ARM_DMN_ZIP="${LNX_ARM_DMN}.tar.gz" + LNX_ARM_CLI="${PKG_NAME}-${APP_VERSION}-cli-linux-arm" + LNX_ARM_CLI_ZIP="${LNX_ARM_CLI}.tar.gz" + LNX_ARM_OUT="linux_arm" +fi diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/build-daemon-release.sh b/vendor/github.com/SkycoinProject/skycoin/electron/build-daemon-release.sh new file mode 100755 index 00000000..218cbae9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/build-daemon-release.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash +set -e -o pipefail + +GOX_OSARCH="$@" + +. build-conf.sh "$GOX_OSARCH" + +SKIP_COMPILATION=${SKIP_COMPILATION:-0} + +SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +pushd "$SCRIPTDIR" >/dev/null + +if [ $SKIP_COMPILATION -ne 1 ]; then + CONFIG_MODE= ./gox.sh "$GOX_OSARCH" "$GOX_DMN_OUTPUT_DIR" +fi + +echo +echo "===========================" +echo "Packaging daemon release" +./package-daemon-release.sh "$GOX_OSARCH" + +echo "------------------------------" +echo "Compressing daemon release" +./compress-daemon-release.sh "$GOX_OSARCH" + +popd >/dev/null diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/build-electron-release.sh b/vendor/github.com/SkycoinProject/skycoin/electron/build-electron-release.sh new file mode 100755 index 00000000..c5d4e2b0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/build-electron-release.sh @@ -0,0 +1,109 @@ +#!/usr/bin/env bash +set -e -o pipefail + +# Builds an entire electron-based GUI for release + +# Implemented architectures: +# darwin/amd64 +# windows/amd64 +# windows/386 +# linux/amd64 +# +# By default builds all architectures. +# A single arch can be built by specifying it using gox's arch names + +GOX_OSARCH="$@" + +. build-conf.sh "$GOX_OSARCH" + +SKIP_COMPILATION=${SKIP_COMPILATION:-0} + +SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +pushd "$SCRIPTDIR" >/dev/null + +if [ $SKIP_COMPILATION -ne 1 ]; then + CONFIG_MODE=STANDALONE_CLIENT ./gox.sh "$GOX_OSARCH" "$GOX_GUI_OUTPUT_DIR" +fi + +if [ -e "$ELN_OUTPUT_DIR" ]; then + rm -r "$ELN_OUTPUT_DIR" +fi + +if [ ! -z "$WIN64_ELN" ] && [ ! -z "$WIN32_ELN" ]; then + npm run dist-win +elif [ ! -z "$WIN64_ELN" ]; then + npm run dist-win64 +elif [ ! -z "$WIN32_ELN" ]; then + npm run dist-win32 +fi + +if [ ! -z "$LNX64_ELN" ]; then + npm run dist-linux +fi + +if [ ! -z "$OSX64_ELN" ]; then + if [[ "$OSTYPE" == "darwin"* ]]; then + echo "run dist-mac" + npm run dist-mac + else + echo "Can not run build script in $OSTYPE" + fi +fi + +pushd "$FINAL_OUTPUT_DIR" >/dev/null +if [ -e "mac" ]; then + pushd "mac" >/dev/null + if [ -e "${PDT_NAME}-${APP_VERSION}.dmg" ]; then + mv "${PDT_NAME}-${APP_VERSION}.dmg" "../${PKG_NAME}-${APP_VERSION}-gui-electron-osx-x64.dmg" + elif [ -e "${PDT_NAME}.app" ]; then + rm -rf "${PDT_NAME}.app" + fi + popd >/dev/null + rm -rf "mac" +fi + +IMG="${PKG_NAME}-${APP_VERSION}-x86_64.AppImage" +DEST_IMG="${PKG_NAME}-${APP_VERSION}-gui-electron-linux-x64.AppImage" +if [ -e $IMG ]; then + mv "$IMG" "$DEST_IMG" + chmod +x "$DEST_IMG" +fi + +EXE="${PDT_NAME} Setup ${APP_VERSION}.exe" +if [ -e "$EXE" ]; then + if [ ! -z $WIN32_ELN ] && [ ! -z $WIN64_ELN ]; then + mv "$EXE" "${PKG_NAME}-${APP_VERSION}-gui-electron-win-setup.exe" + elif [ ! -z $WIN32_ELN ]; then + mv "$EXE" "${WIN32_ELN}.exe" + elif [ ! -z $WIN64_ELN ]; then + mv "$EXE" "${WIN64_ELN}.exe" + fi +fi + +# rename dmg file name +DMG="${PKG_NAME}-${APP_VERSION}.dmg" +if [ -e "$DMG" ]; then + mv "$DMG" "${PKG_NAME}-${APP_VERSION}-gui-electron-osx.dmg" +fi + +# delete app zip file +MZIP="${PKG_NAME}-${APP_VERSION}-mac.zip" +if [ -e "$MZIP" ]; then + rm "$MZIP" +fi + +# delete github and latest-mac.yml +if [ -d "github" ]; then rm -rf github ;fi +if [ -e "latest-mac.yml" ]; then rm latest-mac.yml ;fi + +# clean unpacked folders +rm -rf *-unpacked + +# delete blockmap and electron-builder.yaml +rm -f *.blockmap +rm -f *.yaml + +popd >/dev/null + +popd >/dev/null diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/build-standalone-release.sh b/vendor/github.com/SkycoinProject/skycoin/electron/build-standalone-release.sh new file mode 100755 index 00000000..01a671ef --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/build-standalone-release.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash +set -e -o pipefail + +GOX_OSARCH="$@" + +. build-conf.sh "$GOX_OSARCH" + +SKIP_COMPILATION=${SKIP_COMPILATION:-0} + +SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +pushd "$SCRIPTDIR" >/dev/null + +if [ $SKIP_COMPILATION -ne 1 ]; then + CONFIG_MODE=STANDALONE_CLIENT ./gox.sh "$GOX_OSARCH" "$GOX_GUI_OUTPUT_DIR" +fi + +echo +echo "===========================" +echo "Packaging standalone release" +./package-standalone-release.sh "$GOX_OSARCH" + +echo "------------------------------" +echo "Compressing standalone release" +./compress-standalone-release.sh "$GOX_OSARCH" + +popd >/dev/null diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/build.sh b/vendor/github.com/SkycoinProject/skycoin/electron/build.sh new file mode 100755 index 00000000..dd13502b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/build.sh @@ -0,0 +1,46 @@ +#!/usr/bin/env bash +set -e -o pipefail + +# Builds both the electron and standalone releases + +GOX_OSARCH="$@" + +. build-conf.sh "$GOX_OSARCH" + +SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +pushd "$SCRIPTDIR" >/dev/null + +echo "Compiling with gox" +pwd +# Build the client mode with gox here so that the standalone and electron releases don't need to compile twice +CONFIG_MODE=STANDALONE_CLIENT ./gox.sh "$GOX_OSARCH" "$GOX_GUI_OUTPUT_DIR" + +echo "Installing node modules" +./install-node-modules.sh + +echo +echo "===========================" +echo "Building standalone release" + +SKIP_COMPILATION=1 ./build-standalone-release.sh "$GOX_OSARCH" + +echo +echo "===========================" +echo "Building electron release" + +SKIP_COMPILATION=1 ./build-electron-release.sh "$GOX_OSARCH" + +echo +echo "===========================" +echo "Building daemon release" + +./build-daemon-release.sh "$GOX_OSARCH" + +echo +echo "===========================" +echo "Building cli release" + +./build-cli-release.sh "$GOX_OSARCH" + +popd >/dev/null diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/build/icon.icns b/vendor/github.com/SkycoinProject/skycoin/electron/build/icon.icns new file mode 100644 index 00000000..69e608fe Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/electron/build/icon.icns differ diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/build/icon.ico b/vendor/github.com/SkycoinProject/skycoin/electron/build/icon.ico new file mode 100644 index 00000000..4af3f729 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/electron/build/icon.ico differ diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/build/icons/icon512x512.png b/vendor/github.com/SkycoinProject/skycoin/electron/build/icons/icon512x512.png new file mode 100644 index 00000000..8eabd213 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/electron/build/icons/icon512x512.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/clean-static-libs.sh b/vendor/github.com/SkycoinProject/skycoin/electron/clean-static-libs.sh new file mode 100755 index 00000000..cc82079b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/clean-static-libs.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +# Removes lib.a files cached under $GOPATH. +# Sometimes these are not regenerated by go when doing `go run` + +rm ${GOPATH}/pkg/*/github.com/SkycoinProject/skycoin/src/*.a +rm ${GOPATH}/pkg/*/github.com/SkycoinProject/skycoin/src/lib/*.a +rm ${GOPATH}/pkg/*/github.com/SkycoinProject/*.a diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/clean.sh b/vendor/github.com/SkycoinProject/skycoin/electron/clean.sh new file mode 100755 index 00000000..783faf5d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/clean.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash +set -e -o pipefail + +. build-conf.sh + +SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +pushd "$SCRIPTDIR" >/dev/null + +function rmnofail { + for dir in "$@"; do + if [ -e "$dir" ]; then + rm -r "$dir" + echo "removed $dir" + fi + done +} + +rmnofail "$ELN_OUTPUT_BASE" "$STL_OUTPUT_DIR" "$GOX_OUTPUT_DIR" "$FINAL_OUTPUT_DIR" + +# don't remove the electron cache by default, most of the time when we want +# to clean up build artifacts we don't want to clean this up, and downloading +# it again is slow +# rm -r .electron_cache + +popd >/dev/null diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/compress-cli-release.sh b/vendor/github.com/SkycoinProject/skycoin/electron/compress-cli-release.sh new file mode 100755 index 00000000..5d0c3c63 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/compress-cli-release.sh @@ -0,0 +1,105 @@ +#!/usr/bin/env bash +set -e -o pipefail + +# Compresses packaged cli release after +# ./package-cli-release.sh is done + +GOX_OSARCH="$@" + +. build-conf.sh "$GOX_OSARCH" + +SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +pushd "$SCRIPTDIR" >/dev/null + +# Compress archives +pushd "$CLI_OUTPUT_DIR" >/dev/null + +FINALS=() + +# OS X +if [ -e "$OSX64_CLI" ]; then + if [ -e "$OSX64_CLI_ZIP" ]; then + echo "Removing old $OSX64_CLI_ZIP" + rm "$OSX64_CLI_ZIP" + fi + echo "Zipping $OSX64_CLI_ZIP" + # -y preserves symlinks, + # so that the massive .framework library isn't duplicated + zip -r -y --quiet "$OSX64_CLI_ZIP" "$OSX64_CLI" + FINALS+=("$OSX64_CLI_ZIP") +fi + +# Windows 64bit +if [ -e "$WIN64_CLI" ]; then + if [ -e "$WIN64_CLI_ZIP" ]; then + echo "Removing old $WIN64_CLI_ZIP" + rm "$WIN64_CLI_ZIP" + fi + echo "Zipping $WIN64_CLI_ZIP" + if [[ "$OSTYPE" == "linux"* ]]; then + zip -r --quiet -X "$WIN64_CLI_ZIP" "$WIN64_CLI" + elif [[ "$OSTYPE" == "darwin"* ]]; then + zip -r --quiet "$WIN64_CLI_ZIP" "$WIN64_CLI" + elif [[ "$OSTYPE" == "msys"* ]]; then + 7z a "$WIN64_CLI_ZIP" "$WIN64_CLI" + fi + FINALS+=("$WIN64_CLI_ZIP") +fi + +# Windows 32bit +if [ -e "$WIN32_CLI" ]; then + if [ -e "$WIN32_CLI_ZIP" ]; then + echo "Removing old $WIN32_CLI_ZIP" + rm "$WIN32_CLI_ZIP" + fi + echo "Zipping $WIN32_CLI_ZIP" + if [[ "$OSTYPE" == "linux"* ]]; then + zip -r --quiet -X "$WIN32_CLI_ZIP" "$WIN32_CLI" + elif [[ "$OSTYPE" == "darwin"* ]]; then + zip -r --quiet "$WIN32_CLI_ZIP" "$WIN32_CLI" + elif [[ "$OSTYPE" == "msys"* ]]; then + 7z a "$WIN32_CLI_ZIP" "$WIN32_CLI" + fi + FINALS+=("$WIN32_CLI_ZIP") +fi + +# Linux +if [ -e "$LNX64_CLI" ]; then + if [ -e "$LNX64_CLI_ZIP" ]; then + echo "Removing old $LNX64_CLI_ZIP" + rm "$LNX64_CLI_ZIP" + fi + echo "Zipping $LNX64_CLI_ZIP" + if [[ "$OSTYPE" == "linux"* ]]; then + tar czf "$LNX64_CLI_ZIP" --owner=0 --group=0 "$LNX64_CLI" + elif [[ "$OSTYPE" == "darwin"* ]]; then + tar czf "$LNX64_CLI_ZIP" "$LNX64_CLI" + fi + FINALS+=("$LNX64_CLI_ZIP") +fi + +# Linux arm +if [ -e "$LNX_ARM_CLI" ]; then + if [ -e "$LNX_ARM_CLI_ZIP" ]; then + echo "Removing old $LNX_ARM_CLI_ZIP" + rm "$LNX_ARM_CLI_ZIP" + fi + echo "Zipping $LNX_ARM_CLI_ZIP" + if [[ "$OSTYPE" == "linux"* ]]; then + tar czf "$LNX_ARM_CLI_ZIP" --owner=0 --group=0 "$LNX_ARM_CLI" + elif [[ "$OSTYPE" == "darwin"* ]]; then + tar czf "$LNX_ARM_CLI_ZIP" "$LNX_ARM_CLI" + fi + FINALS+=("$LNX_ARM_CLI_ZIP") +fi + +popd >/dev/null + +# Move to final release dir +mkdir -p "$FINAL_OUTPUT_DIR" +for var in "${FINALS[@]}"; do + mv "${CLI_OUTPUT_DIR}/${var}" "$FINAL_OUTPUT_DIR" +done + +popd >/dev/null diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/compress-daemon-release.sh b/vendor/github.com/SkycoinProject/skycoin/electron/compress-daemon-release.sh new file mode 100755 index 00000000..72adc31c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/compress-daemon-release.sh @@ -0,0 +1,105 @@ +#!/usr/bin/env bash +set -e -o pipefail + +# Compresses packaged daemon release after +# ./package-daemon-release.sh is done + +GOX_OSARCH="$@" + +. build-conf.sh "$GOX_OSARCH" + +SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +pushd "$SCRIPTDIR" >/dev/null + +# Compress archives +pushd "$DMN_OUTPUT_DIR" >/dev/null + +FINALS=() + +# OS X +if [ -e "$OSX64_DMN" ]; then + if [ -e "$OSX64_DMN_ZIP" ]; then + echo "Removing old $OSX64_DMN_ZIP" + rm "$OSX64_DMN_ZIP" + fi + echo "Zipping $OSX64_DMN_ZIP" + # -y preserves symlinks, + # so that the massive .framework library isn't duplicated + zip -r -y --quiet "$OSX64_DMN_ZIP" "$OSX64_DMN" + FINALS+=("$OSX64_DMN_ZIP") +fi + +# Windows 64bit +if [ -e "$WIN64_DMN" ]; then + if [ -e "$WIN64_DMN_ZIP" ]; then + echo "Removing old $WIN64_DMN_ZIP" + rm "$WIN64_DMN_ZIP" + fi + echo "Zipping $WIN64_DMN_ZIP" + if [[ "$OSTYPE" == "linux"* ]]; then + zip -r --quiet -X "$WIN64_DMN_ZIP" "$WIN64_DMN" + elif [[ "$OSTYPE" == "darwin"* ]]; then + zip -r --quiet "$WIN64_DMN_ZIP" "$WIN64_DMN" + elif [[ "$OSTYPE" == "msys"* ]]; then + 7z a "$WIN64_DMN_ZIP" "$WIN64_DMN" + fi + FINALS+=("$WIN64_DMN_ZIP") +fi + +# Windows 32bit +if [ -e "$WIN32_DMN" ]; then + if [ -e "$WIN32_DMN_ZIP" ]; then + echo "Removing old $WIN32_DMN_ZIP" + rm "$WIN32_DMN_ZIP" + fi + echo "Zipping $WIN32_DMN_ZIP" + if [[ "$OSTYPE" == "linux"* ]]; then + zip -r --quiet -X "$WIN32_DMN_ZIP" "$WIN32_DMN" + elif [[ "$OSTYPE" == "darwin"* ]]; then + zip -r --quiet "$WIN32_DMN_ZIP" "$WIN32_DMN" + elif [[ "$OSTYPE" == "msys"* ]]; then + 7z a "$WIN32_DMN_ZIP" "$WIN32_DMN" + fi + FINALS+=("$WIN32_DMN_ZIP") +fi + +# Linux +if [ -e "$LNX64_DMN" ]; then + if [ -e "$LNX64_DMN_ZIP" ]; then + echo "Removing old $LNX64_DMN_ZIP" + rm "$LNX64_DMN_ZIP" + fi + echo "Zipping $LNX64_DMN_ZIP" + if [[ "$OSTYPE" == "linux"* ]]; then + tar czf "$LNX64_DMN_ZIP" --owner=0 --group=0 "$LNX64_DMN" + elif [[ "$OSTYPE" == "darwin"* ]]; then + tar czf "$LNX64_DMN_ZIP" "$LNX64_DMN" + fi + FINALS+=("$LNX64_DMN_ZIP") +fi + +# Linux arm +if [ -e "$LNX_ARM_DMN" ]; then + if [ -e "$LNX_ARM_DMN_ZIP" ]; then + echo "Removing old $LNX_ARM_DMN_ZIP" + rm "$LNX_ARM_DMN_ZIP" + fi + echo "Zipping $LNX_ARM_DMN_ZIP" + if [[ "$OSTYPE" == "linux"* ]]; then + tar czf "$LNX_ARM_DMN_ZIP" --owner=0 --group=0 "$LNX_ARM_DMN" + elif [[ "$OSTYPE" == "darwin"* ]]; then + tar czf "$LNX_ARM_DMN_ZIP" "$LNX_ARM_DMN" + fi + FINALS+=("$LNX_ARM_DMN_ZIP") +fi + +popd >/dev/null + +# Move to final release dir +mkdir -p "$FINAL_OUTPUT_DIR" +for var in "${FINALS[@]}"; do + mv "${DMN_OUTPUT_DIR}/${var}" "$FINAL_OUTPUT_DIR" +done + +popd >/dev/null diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/compress-electron-release.sh b/vendor/github.com/SkycoinProject/skycoin/electron/compress-electron-release.sh new file mode 100755 index 00000000..b29565bc --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/compress-electron-release.sh @@ -0,0 +1,89 @@ +#!/usr/bin/env bash +set -e -o pipefail + +# Compresses packaged electron apps after +# ./package-electron-release.sh is done + +GOX_OSARCH="$@" + +. build-conf.sh "$GOX_OSARCH" + +SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +pushd "$SCRIPTDIR" >/dev/null + +# Compress archives +pushd "$ELN_OUTPUT_DIR" >/dev/null + +FINALS=() + +# OS X +if [ -e "$OSX64_ELN_PLT" ]; then + pushd "$OSX64_ELN_PLT" >/dev/null + + if [ -e "$OSX64_ELN_ZIP" ]; then + echo "Removing old $OSX64_ELN_ZIP" + rm "$OSX64_ELN_ZIP" + fi + echo "Zipping $OSX64_ELN_ZIP" + # -y preserves symlinks, + # so that the massive .framework library isn't duplicated + zip -r -y --quiet "$OSX64_ELN_ZIP" "$OSX64_APP" + mv "$OSX64_ELN_ZIP" "../$OSX64_ELN_ZIP" + FINALS+=("$OSX64_ELN_ZIP") + + popd >/dev/null +fi + +# Windows 64bit +if [ -e "$WIN64_ELN_PLT" ]; then + if [ -e "$WIN64_ELN_ZIP" ]; then + echo "Removing old $WIN64_ELN_ZIP" + rm "$WIN64_ELN_ZIP" + fi + echo "Zipping $WIN64_ELN_ZIP" + mv "$WIN64_ELN_PLT" "$WIN64_ELN" + zip -r --quiet "$WIN64_ELN_ZIP" "$WIN64_ELN" + mv "$WIN64_ELN" "$WIN64_ELN_PLT" + FINALS+=("$WIN64_ELN_ZIP") +fi + +# Windows 32bit +if [ -e "$WIN32_ELN_PLT" ]; then + if [ -e "$WIN32_ELN_ZIP" ]; then + echo "Removing old $WIN32_ELN_ZIP" + rm "$WIN32_ELN_ZIP" + fi + echo "Zipping $WIN32_ELN_ZIP" + mv "$WIN32_ELN_PLT" "$WIN32_ELN" + zip -r --quiet "$WIN32_ELN_ZIP" "$WIN32_ELN" + mv "$WIN32_ELN" "$WIN32_ELN_PLT" + FINALS+=("$WIN32_ELN_ZIP") +fi + +# Linux +if [ -e "$LNX64_ELN_PLT" ]; then + if [ -e "$LNX64_ELN_ZIP" ]; then + echo "Removing old $LNX64_ELN_ZIP" + rm "$LNX64_ELN_ZIP" + fi + echo "Zipping $LNX64_ELN_ZIP" + mv "$LNX64_ELN_PLT" "$LNX64_ELN" + if [[ "$OSTYPE" == "linux"* ]]; then + tar czf "$LNX64_ELN_ZIP" --owner=0 --group=0 "$LNX64_ELN" + elif [[ "$OSTYPE" == "darwin"* ]]; then + tar czf "$LNX64_ELN_ZIP" "$LNX64_ELN" + fi + mv "$LNX64_ELN" "$LNX64_ELN_PLT" + FINALS+=("$LNX64_ELN_ZIP") +fi + +popd >/dev/null + +# Move to final release dir +mkdir -p "$FINAL_OUTPUT_DIR" +for var in "${FINALS[@]}"; do + mv "${ELN_OUTPUT_DIR}/${var}" "$FINAL_OUTPUT_DIR" +done + +popd >/dev/null diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/compress-standalone-release.sh b/vendor/github.com/SkycoinProject/skycoin/electron/compress-standalone-release.sh new file mode 100755 index 00000000..92c5ac1c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/compress-standalone-release.sh @@ -0,0 +1,105 @@ +#!/usr/bin/env bash +set -e -o pipefail + +# Compresses packaged standalone release after +# ./package-standalone-release.sh is done + +GOX_OSARCH="$@" + +. build-conf.sh "$GOX_OSARCH" + +SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +pushd "$SCRIPTDIR" >/dev/null + +# Compress archives +pushd "$STL_OUTPUT_DIR" >/dev/null + +FINALS=() + +# OS X +if [ -e "$OSX64_STL" ]; then + if [ -e "$OSX64_STL_ZIP" ]; then + echo "Removing old $OSX64_STL_ZIP" + rm "$OSX64_STL_ZIP" + fi + echo "Zipping $OSX64_STL_ZIP" + # -y preserves symlinks, + # so that the massive .framework library isn't duplicated + zip -r -y --quiet "$OSX64_STL_ZIP" "$OSX64_STL" + FINALS+=("$OSX64_STL_ZIP") +fi + +# Windows 64bit +if [ -e "$WIN64_STL" ]; then + if [ -e "$WIN64_STL_ZIP" ]; then + echo "Removing old $WIN64_STL_ZIP" + rm "$WIN64_STL_ZIP" + fi + echo "Zipping $WIN64_STL_ZIP" + if [[ "$OSTYPE" == "linux"* ]]; then + zip -r --quiet -X "$WIN64_STL_ZIP" "$WIN64_STL" + elif [[ "$OSTYPE" == "darwin"* ]]; then + zip -r --quiet "$WIN64_STL_ZIP" "$WIN64_STL" + elif [[ "$OSTYPE" == "msys"* ]]; then + 7z a "$WIN64_STL_ZIP" "$WIN64_STL" + fi + FINALS+=("$WIN64_STL_ZIP") +fi + +# Windows 32bit +if [ -e "$WIN32_STL" ]; then + if [ -e "$WIN32_STL_ZIP" ]; then + echo "Removing old $WIN32_STL_ZIP" + rm "$WIN32_STL_ZIP" + fi + echo "Zipping $WIN32_STL_ZIP" + if [[ "$OSTYPE" == "linux"* ]]; then + zip -r --quiet -X "$WIN32_STL_ZIP" "$WIN32_STL" + elif [[ "$OSTYPE" == "darwin"* ]]; then + zip -r --quiet "$WIN32_STL_ZIP" "$WIN32_STL" + elif [[ "$OSTYPE" == "msys"* ]]; then + 7z a "$WIN32_STL_ZIP" "$WIN32_STL" + fi + FINALS+=("$WIN32_STL_ZIP") +fi + +# Linux +if [ -e "$LNX64_STL" ]; then + if [ -e "$LNX64_STL_ZIP" ]; then + echo "Removing old $LNX64_STL_ZIP" + rm "$LNX64_STL_ZIP" + fi + echo "Zipping $LNX64_STL_ZIP" + if [[ "$OSTYPE" == "linux"* ]]; then + tar czf "$LNX64_STL_ZIP" --owner=0 --group=0 "$LNX64_STL" + elif [[ "$OSTYPE" == "darwin"* ]]; then + tar czf "$LNX64_STL_ZIP" "$LNX64_STL" + fi + FINALS+=("$LNX64_STL_ZIP") +fi + +# Linux arm +if [ -e "$LNX_ARM_STL" ]; then + if [ -e "$LNX_ARM_STL_ZIP" ]; then + echo "Removing old $LNX_ARM_STL_ZIP" + rm "$LNX_ARM_STL_ZIP" + fi + echo "Zipping $LNX_ARM_STL_ZIP" + if [[ "$OSTYPE" == "linux"* ]]; then + tar czf "$LNX_ARM_STL_ZIP" --owner=0 --group=0 "$LNX_ARM_STL" + elif [[ "$OSTYPE" == "darwin"* ]]; then + tar czf "$LNX_ARM_STL_ZIP" "$LNX_ARM_STL" + fi + FINALS+=("$LNX_ARM_STL_ZIP") +fi + +popd >/dev/null + +# Move to final release dir +mkdir -p "$FINAL_OUTPUT_DIR" +for var in "${FINALS[@]}"; do + mv "${STL_OUTPUT_DIR}/${var}" "$FINAL_OUTPUT_DIR" +done + +popd >/dev/null diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/electron-downloader.sh b/vendor/github.com/SkycoinProject/skycoin/electron/electron-downloader.sh new file mode 100755 index 00000000..8fb2ac0b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/electron-downloader.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash + +set -e -o pipefail + +. build-conf.sh + +VER=$(echo "$ELN_VERSION" | cut -c2-20) + +# download windows electron +electron-download --version="${VER}" --platform="win32" --arch=x64 +electron-download --version="${VER}" --platform="win32" --arch=ia32 + +# download linux electron +electron-download --version="${VER}" --platform="linux" --arch=x64 + +# download mac osx electron +electron-download --version="${VER}" --platform="darwin" + + diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/gox.sh b/vendor/github.com/SkycoinProject/skycoin/electron/gox.sh new file mode 100755 index 00000000..79497e24 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/gox.sh @@ -0,0 +1,102 @@ +#!/usr/bin/env bash +set -e -o pipefail + +. build-conf.sh + +USAGE="./gox.sh \"osarch\" [output directory] [with builder] + +Builds gox with the osarch string (see 'gox --help' for specifications) + +Optionally specify an output directory for the build files. Will be created +if it does not exist. Defaults to the working directory. + +" + +SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +CMDDIR="../cmd" # relative to compile/electron/ +CMD="${CMD:-$PKG_NAME}" # name of folder in ../cmd to build. defaults to PKG_NAME which is the name of the coin + +OSARCH="$1" +OUTPUT_DIR="$2" +BIN_NAME="${3:-$CMD}" + +CONFIG_MODE=${CONFIG_MODE:-} + +if [ -z "$OSARCH" ]; then + echo "$USAGE" + exit 1 +fi + +case "$OUTPUT_DIR" in +"") + ;; +*/) + ;; +*) + OUTPUT_DIR+="/" + ;; +esac + +pushd "$SCRIPTDIR" >/dev/null + +if [ -n "$OUTPUT_DIR" ]; then + mkdir -p "$OUTPUT_DIR" +fi + +COMMIT=`git rev-parse HEAD` + +CLI_IMPORT_PATH=`go list ../src/cli` + +gox -osarch="$OSARCH" \ + -gcflags="-trimpath=${HOME}" \ + -asmflags="-trimpath=${HOME}" \ + -ldflags="-X main.Version=${APP_VERSION} -X main.Commit=${COMMIT} -X main.ConfigMode=${CONFIG_MODE} -X ${CLI_IMPORT_PATH}.Version=${APP_VERSION}" \ + -output="${OUTPUT_DIR}{{.Dir}}_{{.OS}}_{{.Arch}}" \ + "${CMDDIR}/${CMD}" + +# move the executable files into ${os}_${arch} folders, electron-builder will pack +# the file into corresponding packages. + +platforms=$(echo $OSARCH | tr ";" "\n") + +for plt in $platforms +do + set -- "$plt" + IFS="/"; declare -a s=($*) + case "${s[0]}" in + "windows") + if [ "${s[1]}" = "386" ]; then + OUT="${OUTPUT_DIR}${WIN32_OUT}" + echo "mkdir $OUT" + mkdir -p "$OUT" + mv "${OUTPUT_DIR}${CMD}_${s[0]}_${s[1]}.exe" "${OUT}/${BIN_NAME}.exe" + else + OUT="${OUTPUT_DIR}${WIN64_OUT}" + mkdir -p "${OUT}" + mv "${OUTPUT_DIR}${CMD}_${s[0]}_${s[1]}.exe" "${OUT}/${BIN_NAME}.exe" + fi + ;; + "darwin") + OUT="${OUTPUT_DIR}${OSX64_OUT}" + echo "mkdir ${OUT}" + mkdir -p "${OUT}" + mv "${OUTPUT_DIR}${CMD}_${s[0]}_${s[1]}" "${OUT}/${BIN_NAME}" + ;; + "linux") + if [ "${s[1]}" = "amd64" ]; then + OUT="${OUTPUT_DIR}${LNX64_OUT}" + echo "mkdir ${OUT}" + mkdir -p "${OUT}" + mv "${OUTPUT_DIR}${CMD}_${s[0]}_${s[1]}" "${OUT}/${BIN_NAME}" + elif [ "${s[1]}" = "arm" ]; then + OUT="${OUTPUT_DIR}${LNX_ARM_OUT}" + echo "mkdir ${OUT}" + mkdir -p "${OUT}" + mv "${OUTPUT_DIR}${CMD}_${s[0]}_${s[1]}" "${OUT}/${BIN_NAME}" + fi + ;; + esac +done + +popd >/dev/null diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/install-node-modules.sh b/vendor/github.com/SkycoinProject/skycoin/electron/install-node-modules.sh new file mode 100755 index 00000000..d449d75a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/install-node-modules.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash +set -e -o pipefail + +# installs the node modules for the skycoin electron app +# and for the electron build process + +SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +pushd "$SCRIPTDIR" >/dev/null + +npm install +cd src/ +./install-dependencies.sh + +popd >/dev/null diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/package-cli-release.sh b/vendor/github.com/SkycoinProject/skycoin/electron/package-cli-release.sh new file mode 100755 index 00000000..78d4da43 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/package-cli-release.sh @@ -0,0 +1,94 @@ +#!/usr/bin/env bash +set -e -o pipefail + +# Builds the cli release + +GOX_OSARCH="$@" + +echo "In package cli release: $GOX_OSARCH" + +. build-conf.sh "$GOX_OSARCH" + +SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +pushd "$SCRIPTDIR" >/dev/null + +DESTSRCS=() + +function copy_if_exists { + if [ -z "$1" -o -z "$2" -o -z "$3" ]; then + echo "copy_if_exists requires 3 args" + exit 1 + fi + + BIN="${GOX_CLI_OUTPUT_DIR}/${1}" + DESTDIR="$2" + DESTSRC="$3" + + if [ -f "$BIN" ]; then + if [ -e "$DESTDIR" ]; then + rm -r "$DESTDIR" + fi + mkdir -p "$DESTDIR" + + # Copy binary to app + echo "Copying $BIN to $DESTDIR" + cp "$BIN" "$DESTDIR" + + # Copy changelog to app + echo "Copying CHANGELOG.md to $DESTDIR" + cp ../CHANGELOG.md "$DESTDIR" + + # Copy cmd/skycoin-cli/README.md to app + echo "Copying cmd/skycoin-cli/README.md to $DESTDIR" + cp ../cmd/skycoin-cli/README.md "$DESTDIR" + + echo "Adding $DESTSRC to package-source.sh list" + DESTSRCS+=("$DESTSRC") + else + echo "$BIN does not exsit" + fi +} + +echo "Copying ${GOX_CLI_OUTPUT_NAME} binaries" + +# OS X +if [ ! -z "$OSX64_CLI" ]; then + OSX64="${CLI_OUTPUT_DIR}/${OSX64_CLI}" + OSX64_SRC="${OSX64}/src" + copy_if_exists "${OSX64_OUT}/${GOX_CLI_OUTPUT_NAME}" "$OSX64" "$OSX64_SRC" +fi + +# Linux amd64 +if [ ! -z "$LNX64_CLI" ]; then + LNX64="${CLI_OUTPUT_DIR}/${LNX64_CLI}" + LNX64_SRC="${LNX64}/src" + copy_if_exists "${LNX64_OUT}/${GOX_CLI_OUTPUT_NAME}" "$LNX64" "$LNX64_SRC" +fi + +# Linux arm +if [ ! -z "$LNX_ARM_CLI" ]; then + LNX_ARM="${CLI_OUTPUT_DIR}/${LNX_ARM_CLI}" + LNX_ARM_SRC="${LNX_ARM}/src" + copy_if_exists "${LNX_ARM_OUT}/${GOX_CLI_OUTPUT_NAME}" "$LNX_ARM" "$LNX_ARM_SRC" +fi + +# Windows amd64 +if [ ! -z "$WIN64_CLI" ]; then + WIN64="${CLI_OUTPUT_DIR}/${WIN64_CLI}" + WIN64_SRC="${WIN64}/src" + copy_if_exists "${WIN64_OUT}/${GOX_CLI_OUTPUT_NAME}.exe" "$WIN64" "$WIN64_SRC" +fi + +# Windows 386 +if [ ! -z "$WIN32_CLI" ]; then + WIN32="${CLI_OUTPUT_DIR}/${WIN32_CLI}" + WIN32_SRC="${WIN32}/src" + copy_if_exists "${WIN32_OUT}/${GOX_CLI_OUTPUT_NAME}.exe" "$WIN32" "$WIN32_SRC" +fi + +# # Copy the source for reference +# # tar it with filters, move it, then untar in order to do this +# echo "Copying source snapshot" + +# ./package-source.sh "${DESTSRCS[@]}" diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/package-daemon-release.sh b/vendor/github.com/SkycoinProject/skycoin/electron/package-daemon-release.sh new file mode 100755 index 00000000..6001d76b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/package-daemon-release.sh @@ -0,0 +1,107 @@ +#!/usr/bin/env bash +set -e -o pipefail + +# Builds the daemon release + +GOX_OSARCH="$@" + +echo "In package daemon release: $GOX_OSARCH" + +. build-conf.sh "$GOX_OSARCH" + +SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +pushd "$SCRIPTDIR" >/dev/null + +DESTSRCS=() + +function copy_if_exists { + if [ -z "$1" -o -z "$2" -o -z "$3" ]; then + echo "copy_if_exists requires 3 args" + exit 1 + fi + + BIN="${GOX_DMN_OUTPUT_DIR}/${1}" + DESTDIR="$2" + DESTSRC="$3" + + if [ -f "$BIN" ]; then + if [ -e "$DESTDIR" ]; then + rm -r "$DESTDIR" + fi + mkdir -p "$DESTDIR" + + # Copy binary to app + echo "Copying $BIN to $DESTDIR" + cp "$BIN" "$DESTDIR" + + # Copy changelog to app + echo "Copying CHANGELOG.md to $DESTDIR" + cp ../CHANGELOG.md "$DESTDIR" + + echo "Adding $DESTSRC to package-source.sh list" + DESTSRCS+=("$DESTSRC") + else + echo "$BIN does not exsit" + fi +} + +function codesign_if_exists { + if [ -z "$1" ]; then + echo "codesign_if_exists requires binary path" + exit 1 + fi + + BIN="${GOX_GUI_OUTPUT_DIR}/${1}" + + if [ -f "$BIN" ]; then + echo "signing daemon binary" + codesign --force --sign "Developer ID Application: yunfei mao" "${BIN}" + else + echo "$BIN does not exsit" + fi +} + +echo "Copying ${PKG_NAME} binaries" + +# OS X +if [ ! -z "$OSX64_DMN" ]; then + OSX64="${DMN_OUTPUT_DIR}/${OSX64_DMN}" + OSX64_SRC="${OSX64}/src" + codesign_if_exists "${OSX64_OUT}/${PKG_NAME}" + copy_if_exists "${OSX64_OUT}/${PKG_NAME}" "$OSX64" "$OSX64_SRC" +fi + +# Linux amd64 +if [ ! -z "$LNX64_DMN" ]; then + LNX64="${DMN_OUTPUT_DIR}/${LNX64_DMN}" + LNX64_SRC="${LNX64}/src" + copy_if_exists "${LNX64_OUT}/${PKG_NAME}" "$LNX64" "$LNX64_SRC" +fi + +# Linux arm +if [ ! -z "$LNX_ARM_DMN" ]; then + LNX_ARM="${DMN_OUTPUT_DIR}/${LNX_ARM_DMN}" + LNX_ARM_SRC="${LNX_ARM}/src" + copy_if_exists "${LNX_ARM_OUT}/${PKG_NAME}" "$LNX_ARM" "$LNX_ARM_SRC" +fi + +# Windows amd64 +if [ ! -z "$WIN64_DMN" ]; then + WIN64="${DMN_OUTPUT_DIR}/${WIN64_DMN}" + WIN64_SRC="${WIN64}/src" + copy_if_exists "${WIN64_OUT}/${PKG_NAME}.exe" "$WIN64" "$WIN64_SRC" +fi + +# Windows 386 +if [ ! -z "$WIN32_DMN" ]; then + WIN32="${DMN_OUTPUT_DIR}/${WIN32_DMN}" + WIN32_SRC="${WIN32}/src" + copy_if_exists "${WIN32_OUT}/${PKG_NAME}.exe" "$WIN32" "$WIN32_SRC" +fi + +# # Copy the source for reference +# # tar it with filters, move it, then untar in order to do this +# echo "Copying source snapshot" + +# ./package-source.sh "${DESTSRCS[@]}" diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/package-electron-release.sh b/vendor/github.com/SkycoinProject/skycoin/electron/package-electron-release.sh new file mode 100755 index 00000000..a88add7e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/package-electron-release.sh @@ -0,0 +1,79 @@ +#!/usr/bin/env bash +set -e -o pipefail + +# Copies gox-compiled binaries and compiled GUI assets +# into an electron package + +GOX_OSARCH="$@" + +. build-conf.sh "$GOX_OSARCH" + +SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +pushd "$SCRIPTDIR" >/dev/null + +OSX64="${ELN_OUTPUT_DIR}/${OSX64_ELN_PLT}" +WIN64="${ELN_OUTPUT_DIR}/${WIN64_ELN_PLT}" +WIN32="${ELN_OUTPUT_DIR}/${WIN32_ELN_PLT}" +LNX64="${ELN_OUTPUT_DIR}/${LNX64_ELN_PLT}" + +OSX64_RES="${OSX64}/${OSX64_APP}/Contents/Resources/app" +WIN64_RES="${WIN64}/resources/app" +WIN32_RES="${WIN32}/resources/app" +LNX64_RES="${LNX64}/resources/app" + +OSX64_SRC="${OSX64_RES}/src" +WIN64_SRC="${WIN64}/src" +WIN32_SRC="${WIN32}/src" +LNX64_SRC="${LNX64}/src" + +# Capitalize OS X .app for convention +if [ -e "${OSX64}/${PKG_NAME}.app" ]; then + mv "${OSX64}/${PKG_NAME}.app" "${OSX64}/${OSX64_APP}" +fi + +DESTSRCS=() + +function copy_if_exists { + if [ -z "$1" -o -z "$2" -o -z "$3" -o -z "$4" ]; then + echo "copy_if_exists requires 4 args" + exit 1 + fi + + BIN="${GOX_GUI_OUTPUT_DIR}/${1}" + DESTDIR="$2" + DESTBIN="${DESTDIR}/${3}" + DESTSRC="$4" + + if [ -f "$BIN" ]; then + # Copy binary to electron app + echo "Copying $BIN to $DESTBIN" + # mkdir -p $DESTBIN + cp "$BIN" "$DESTBIN" + + # Copy static resources to electron app + echo "Copying $GUI_DIST_DIR to $DESTDIR" + cp -R "$GUI_DIST_DIR" "$DESTDIR" + + # Copy changelog to app + echo "Copying CHANGELOG.md to $DESTDIR" + cp ../CHANGELOG.md "$DESTDIR" + + DESTSRCS+=("$DESTSRC") + else + echo "$BIN does not exist" + fi +} + +echo "Copying ${PKG_NAME} binaries" + +copy_if_exists "${PKG_NAME}_darwin_amd64" "$OSX64_RES" "${PKG_NAME}" "$OSX64_SRC" +copy_if_exists "${PKG_NAME}_windows_amd64.exe" "$WIN64_RES" "${PKG_NAME}.exe" "$WIN64_SRC" +copy_if_exists "${PKG_NAME}_windows_386.exe" "$WIN32_RES" "${PKG_NAME}.exe" "$WIN32_SRC" +copy_if_exists "${PKG_NAME}_linux_amd64" "$LNX64_RES" "${PKG_NAME}" "$LNX64_SRC" + +# # Copy the source for reference +# # tar it with filters, move it, then untar in order to do this +# echo "Copying source snapshot" + +# ./package-source.sh "${DESTSRCS[@]}" diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/package-lock.json b/vendor/github.com/SkycoinProject/skycoin/electron/package-lock.json new file mode 100644 index 00000000..98894a73 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/package-lock.json @@ -0,0 +1,2780 @@ +{ + "name": "skycoin", + "version": "0.27.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "7zip-bin": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-3.1.0.tgz", + "integrity": "sha512-juYJNi8JEpTUWXwz8ssa8Oop4n/kwJ/pIQP22vJAVAe6RTRD+0m+e9LRNnfK2EDaX8uwmUzLNGviFQRD6SxeOw==", + "dev": true, + "requires": { + "7zip-bin-linux": "1.3.1", + "7zip-bin-mac": "1.0.1", + "7zip-bin-win": "2.2.0" + } + }, + "7zip-bin-linux": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/7zip-bin-linux/-/7zip-bin-linux-1.3.1.tgz", + "integrity": "sha512-Wv1uEEeHbTiS1+ycpwUxYNuIcyohU6Y6vEqY3NquBkeqy0YhVdsNUGsj0XKSRciHR6LoJSEUuqYUexmws3zH7Q==", + "dev": true, + "optional": true + }, + "7zip-bin-mac": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/7zip-bin-mac/-/7zip-bin-mac-1.0.1.tgz", + "integrity": "sha1-Pmh3i78JJq3GgVlCcHRQXUdVXAI=", + "dev": true, + "optional": true + }, + "7zip-bin-win": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/7zip-bin-win/-/7zip-bin-win-2.2.0.tgz", + "integrity": "sha512-uPHXapEmUtlUKTBx4asWMlxtFUWXzEY0KVEgU7QKhgO2LJzzM3kYxM6yOyUZTtYE6mhK4dDn3FDut9SCQWHzgg==", + "dev": true, + "optional": true + }, + "@types/node": { + "version": "8.10.45", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.45.tgz", + "integrity": "sha512-tGVTbA+i3qfXsLbq9rEq/hezaHY55QxQLeXQL2ejNgFAxxrgu8eMmYIOsRcl7hN1uTLVsKOOYacV/rcJM3sfgQ==", + "dev": true + }, + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, + "ajv-keywords": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", + "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", + "dev": true + }, + "ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "dev": true, + "requires": { + "string-width": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.2" + } + }, + "app-builder-bin": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-1.8.6.tgz", + "integrity": "sha512-jQiCV8fxW3SPtPnU/BnTEQqawWtBmanCgydzRuzsptFVb/6Q4OKWdB5T3B+XHOf8lqaH89+XeJf6oA1b/QQEnQ==", + "dev": true, + "requires": { + "app-builder-bin-linux": "1.8.6", + "app-builder-bin-mac": "1.8.6", + "app-builder-bin-win": "1.8.6" + } + }, + "app-builder-bin-linux": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/app-builder-bin-linux/-/app-builder-bin-linux-1.8.6.tgz", + "integrity": "sha512-IZSv5Wcz3/OYZENwn3iaTLjDSSVPVFobBiJjUrP3hXeOnitRvB0aI8X5KMFYzfkv7kIhSlyPnRsvNjPqgbjyrw==", + "dev": true, + "optional": true + }, + "app-builder-bin-mac": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/app-builder-bin-mac/-/app-builder-bin-mac-1.8.6.tgz", + "integrity": "sha512-lWIpI2zmOmQ4JCp1IGxK6KngKAEN6QO9nu5k8h+ZzMxHBTCk8+kbBTE+R36BSRGX9q/4FhHBpYGXHVj+N9xOXg==", + "dev": true, + "optional": true + }, + "app-builder-bin-win": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/app-builder-bin-win/-/app-builder-bin-win-1.8.6.tgz", + "integrity": "sha512-nlceArzkRtWgqNoif6OFKaAKNNZ3uZuiG+9UkpOPLf/EDoYdeAq4YdvKWaQx1RHsNNfQTx0s/IODvlD0AdUmPA==", + "dev": true, + "optional": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "1.0.3" + } + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "dev": true + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "async-exit-hook": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", + "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", + "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base64-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.0.tgz", + "integrity": "sha1-o5mS1yNYSBGYK+XikLtqU9hnAPE=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", + "dev": true + }, + "bluebird-lst": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.5.tgz", + "integrity": "sha512-Ey0bDNys5qpYPhZ/oQ9vOEvD0TYQDTILMXWP2iGfvMg7rSDde+oV4aQQgqRH+CvBFNz2BSDQnPGMUl6LKBUUQA==", + "dev": true, + "requires": { + "bluebird": "3.5.1" + } + }, + "boxen": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "dev": true, + "requires": { + "ansi-align": "2.0.0", + "camelcase": "4.1.0", + "chalk": "2.4.1", + "cli-boxes": "1.0.0", + "string-width": "2.1.1", + "term-size": "1.2.0", + "widest-line": "2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", + "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==", + "dev": true + }, + "builder-util": { + "version": "5.8.1", + "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-5.8.1.tgz", + "integrity": "sha512-jWqFPUMO2FBrumqA6U6/UppVkftbwCP+2YM8y9DA7g2rJHzHRZ3J6fHDpPCSWIYYEHbAiEwONTWuVKbwu3oYIw==", + "dev": true, + "requires": { + "7zip-bin": "3.1.0", + "app-builder-bin": "1.8.6", + "bluebird-lst": "1.0.5", + "builder-util-runtime": "4.2.1", + "chalk": "2.4.1", + "debug": "3.1.0", + "fs-extra-p": "4.6.1", + "is-ci": "1.1.0", + "js-yaml": "3.12.0", + "lazy-val": "1.0.3", + "semver": "5.5.0", + "source-map-support": "0.5.6", + "stat-mode": "0.2.2", + "temp-file": "3.1.3" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "builder-util-runtime": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-4.2.1.tgz", + "integrity": "sha512-6Ufp6ExT40RDYNXQgD4xG0fgtpUHyc8XIld6lptKr0re1DNnUrQP4sSV/lJOajpzyercMP/YIzO60/mNuAFiWg==", + "dev": true, + "requires": { + "bluebird-lst": "1.0.5", + "debug": "3.1.0", + "fs-extra-p": "4.6.1", + "sax": "1.2.4" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "2.1.1", + "map-obj": "1.0.1" + } + }, + "capture-stack-trace": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", + "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" + } + }, + "chromium-pickle-js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", + "integrity": "sha1-BKEGZywYsIWrd02YPfo+oTjyIgU=", + "dev": true + }, + "ci-info": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.3.tgz", + "integrity": "sha512-SK/846h/Rcy8q9Z9CAwGBLfCJ6EkjJWdpelWDufQpqVDYq2Wnnv8zlSO6AMQap02jvhVruKKpEtQOufo3pFhLg==", + "dev": true + }, + "cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", + "dev": true + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "wrap-ansi": "2.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "color-convert": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz", + "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==", + "dev": true, + "requires": { + "color-name": "1.1.1" + } + }, + "color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", + "dev": true + }, + "combined-stream": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "compare-version": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", + "integrity": "sha1-AWLsLZNR9d3VmpICy6k1NmpyUIA=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "1.1.0", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "typedarray": "0.0.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + } + } + }, + "configstore": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", + "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", + "dev": true, + "requires": { + "dot-prop": "4.2.0", + "graceful-fs": "4.1.11", + "make-dir": "1.3.0", + "unique-string": "1.0.0", + "write-file-atomic": "2.3.0", + "xdg-basedir": "3.0.0" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "dev": true, + "requires": { + "capture-stack-trace": "1.0.0" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "4.1.3", + "shebang-command": "1.2.0", + "which": "1.3.1" + } + }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "dev": true + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "1.0.2" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "dmg-builder": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-4.1.8.tgz", + "integrity": "sha512-OuGpvbnzu5MC7stpTdYSE3rWiPPOd550X2N/Djomz5PbIZ4Xd96IBM1qd2TDhrZUnIT/un++ns0/FWqd1Wopyg==", + "dev": true, + "requires": { + "bluebird-lst": "1.0.5", + "builder-util": "5.8.1", + "electron-builder-lib": "20.13.3", + "fs-extra-p": "4.6.1", + "iconv-lite": "0.4.23", + "js-yaml": "3.12.0", + "parse-color": "1.0.0", + "sanitize-filename": "1.6.1" + } + }, + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "dev": true, + "requires": { + "is-obj": "1.0.1" + } + }, + "dotenv": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-5.0.1.tgz", + "integrity": "sha512-4As8uPrjfwb7VXC+WnLCbXK7y+Ueb2B3zgNCePYfhxS1PYeaO1YTeplffTEcbfLhvFNGLAz90VvJs9yomG7bow==", + "dev": true + }, + "dotenv-expand": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-4.2.0.tgz", + "integrity": "sha1-3vHxyl1gWdJKdm5YeULCEQbOEnU=", + "dev": true + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "ejs": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz", + "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==", + "dev": true + }, + "electron": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/electron/-/electron-2.0.18.tgz", + "integrity": "sha512-PQRHtFvLxHdJzMMIwTddUtkS+Te/fZIs+PHO+zPmTUTBE76V3Od3WRGzMQwiJHxN679licmCKhJpMyxZfDEVWQ==", + "dev": true, + "requires": { + "@types/node": "8.10.45", + "electron-download": "3.3.0", + "extract-zip": "1.6.7" + } + }, + "electron-builder": { + "version": "20.13.3", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-20.13.3.tgz", + "integrity": "sha512-OnPNIPjJ/Gp50yKWz8M0BP+WMl+CPPkwbipjrWiNCm1UviIUmRq/q1gT2So3Bdn9b37L5MfcFRorF8xWk37WMw==", + "dev": true, + "requires": { + "bluebird-lst": "1.0.5", + "builder-util": "5.8.1", + "builder-util-runtime": "4.2.1", + "chalk": "2.4.1", + "dmg-builder": "4.1.8", + "electron-builder-lib": "20.13.3", + "electron-download-tf": "4.3.4", + "fs-extra-p": "4.6.1", + "is-ci": "1.1.0", + "lazy-val": "1.0.3", + "read-config-file": "3.0.1", + "sanitize-filename": "1.6.1", + "update-notifier": "2.5.0", + "yargs": "11.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "electron-download-tf": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/electron-download-tf/-/electron-download-tf-4.3.4.tgz", + "integrity": "sha512-SQYDGMLpTgty1bx3NycuDb7dNPzktVSdK2sqPZjyRocauq/uN/V4S2lcpFVLupaHhKlD8zozm9fTpm5UdohvTg==", + "dev": true, + "requires": { + "debug": "3.1.0", + "env-paths": "1.0.0", + "fs-extra": "4.0.3", + "minimist": "1.2.0", + "nugget": "2.0.1", + "path-exists": "3.0.0", + "rc": "1.2.8", + "semver": "5.5.0", + "sumchecker": "2.0.2" + } + }, + "fs-extra": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "4.0.0", + "universalify": "0.1.2" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "sumchecker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-2.0.2.tgz", + "integrity": "sha1-D0LBDl0F2l1C7qPlbDOZo31sWz4=", + "dev": true, + "requires": { + "debug": "2.6.9" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + } + } + }, + "electron-builder-lib": { + "version": "20.13.3", + "resolved": "https://registry.npmjs.org/electron-builder-lib/-/electron-builder-lib-20.13.3.tgz", + "integrity": "sha512-UMr7aAfLzKxwTFI1GRUf+Gj9kyeYUSYZ9Hi5qRtlBDTEjSYH+zNkNK+P6KbJ0SPsbKwcGF4eF1UxAsbnpJ3A4w==", + "dev": true, + "requires": { + "7zip-bin": "3.1.0", + "app-builder-bin": "1.8.6", + "async-exit-hook": "2.0.1", + "bluebird-lst": "1.0.5", + "builder-util": "5.8.1", + "builder-util-runtime": "4.2.1", + "chromium-pickle-js": "0.2.0", + "debug": "3.1.0", + "ejs": "2.6.1", + "electron-osx-sign": "0.4.10", + "electron-publish": "20.13.2", + "fs-extra-p": "4.6.1", + "hosted-git-info": "2.7.1", + "is-ci": "1.1.0", + "isbinaryfile": "3.0.2", + "js-yaml": "3.12.0", + "lazy-val": "1.0.3", + "minimatch": "3.0.4", + "normalize-package-data": "2.4.0", + "plist": "3.0.1", + "read-config-file": "3.0.1", + "sanitize-filename": "1.6.1", + "semver": "5.5.0", + "temp-file": "3.1.3" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "electron-download": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/electron-download/-/electron-download-3.3.0.tgz", + "integrity": "sha1-LP1U1pZsAZxNSa1l++Zcyc3vaMg=", + "dev": true, + "requires": { + "debug": "2.6.9", + "fs-extra": "0.30.0", + "home-path": "1.0.6", + "minimist": "1.2.0", + "nugget": "2.0.1", + "path-exists": "2.1.0", + "rc": "1.2.8", + "semver": "5.5.0", + "sumchecker": "1.3.1" + } + }, + "electron-osx-sign": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/electron-osx-sign/-/electron-osx-sign-0.4.10.tgz", + "integrity": "sha1-vk87ibKnWh3F8eckkIGrKSnKOiY=", + "dev": true, + "requires": { + "bluebird": "3.5.1", + "compare-version": "0.1.2", + "debug": "2.6.9", + "isbinaryfile": "3.0.2", + "minimist": "1.2.0", + "plist": "2.1.0" + }, + "dependencies": { + "plist": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-2.1.0.tgz", + "integrity": "sha1-V8zbeggh3yGDEhejytVOPhRqECU=", + "dev": true, + "requires": { + "base64-js": "1.2.0", + "xmlbuilder": "8.2.2", + "xmldom": "0.1.27" + } + } + } + }, + "electron-publish": { + "version": "20.13.2", + "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-20.13.2.tgz", + "integrity": "sha512-Mg/GdDZdUgQep9Ex/NpWM8yeq1Lp2z5k42FB1awW5rz+mSvS/O0MQLJVZ7RaSzEFEgkhBoNlhU7GqirzSxJQTw==", + "dev": true, + "requires": { + "bluebird-lst": "1.0.5", + "builder-util": "5.8.1", + "builder-util-runtime": "4.2.1", + "chalk": "2.4.1", + "fs-extra-p": "4.6.1", + "lazy-val": "1.0.3", + "mime": "2.3.1" + } + }, + "env-paths": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-1.0.0.tgz", + "integrity": "sha1-QWgTO0K7BcOKNbGuQ5fIKYqzaeA=", + "dev": true + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "0.2.1" + } + }, + "es6-promise": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.6.tgz", + "integrity": "sha512-aRVgGdnmW2OiySVPUC9e6m+plolMAJKjZnQlCwNSuK5yQ0JN61DZSO1X1Ufd1foqWRAlig0rhduTCHe7sVtK5Q==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extract-zip": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", + "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=", + "dev": true, + "requires": { + "concat-stream": "1.6.2", + "debug": "2.6.9", + "mkdirp": "0.5.1", + "yauzl": "2.4.1" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fd-slicer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", + "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", + "dev": true, + "requires": { + "pend": "1.2.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "dev": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.6", + "mime-types": "2.1.19" + } + }, + "fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "2.4.0", + "klaw": "1.3.1", + "path-is-absolute": "1.0.1", + "rimraf": "2.6.3" + } + }, + "fs-extra-p": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/fs-extra-p/-/fs-extra-p-4.6.1.tgz", + "integrity": "sha512-IsTMbUS0svZKZTvqF4vDS9c/L7Mw9n8nZQWWeSzAGacOSe+8CzowhUN0tdZEZFIJNP5HC7L9j3MMikz/G4hDeQ==", + "dev": true, + "requires": { + "bluebird-lst": "1.0.5", + "fs-extra": "6.0.1" + }, + "dependencies": { + "fs-extra": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz", + "integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "4.0.0", + "universalify": "0.1.2" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11" + } + } + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + } + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "dev": true, + "requires": { + "ini": "1.3.5" + } + }, + "got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "dev": true, + "requires": { + "create-error-class": "3.0.2", + "duplexer3": "0.1.4", + "get-stream": "3.0.0", + "is-redirect": "1.0.0", + "is-retry-allowed": "1.1.0", + "is-stream": "1.1.0", + "lowercase-keys": "1.0.1", + "safe-buffer": "5.1.2", + "timed-out": "4.0.1", + "unzip-response": "2.0.1", + "url-parse-lax": "1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "dev": true, + "requires": { + "ajv": "5.5.2", + "har-schema": "2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "home-path": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/home-path/-/home-path-1.0.6.tgz", + "integrity": "sha512-wo+yjrdAtoXt43Vy92a+0IPCYViiyLAHyp0QVS4xL/tfvVz5sXIW1ubLZk3nhVkD92fQpUMKX+fzMjr5F489vw==", + "dev": true + }, + "hosted-git-info": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "dev": true + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.14.2" + } + }, + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "dev": true, + "requires": { + "safer-buffer": "2.1.2" + } + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "1.1.1" + } + }, + "is-ci": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.1.0.tgz", + "integrity": "sha512-c7TnwxLePuqIlxHgr7xtxzycJPegNHFuIrBkwbf8hc58//+Op1CqFkyS+xnIMkwn9UsJIwc174BIjkyBmSpjKg==", + "dev": true, + "requires": { + "ci-info": "1.1.3" + } + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "dev": true, + "requires": { + "global-dirs": "0.1.1", + "is-path-inside": "1.0.1" + } + }, + "is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", + "dev": true + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "1.0.2" + } + }, + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", + "dev": true + }, + "is-retry-allowed": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "isbinaryfile": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.2.tgz", + "integrity": "sha1-Sj6XTsDLqQBNP8bN5yCeppNopiE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "js-yaml": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", + "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "dev": true, + "requires": { + "argparse": "1.0.10", + "esprima": "4.0.1" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "1.2.0" + } + }, + "jsonfile": { + "version": "2.4.0", + "resolved": "http://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11" + } + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11" + } + }, + "latest-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "dev": true, + "requires": { + "package-json": "4.0.1" + } + }, + "lazy-val": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.3.tgz", + "integrity": "sha512-pjCf3BYk+uv3ZcPzEVM0BFvO9Uw58TmlrU0oG5tTrr9Kcid3+kdKxapH8CjdYmVa2nO5wOoZn2rdvZx2PKj/xg==", + "dev": true + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "1.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "2.0.0", + "path-exists": "3.0.0" + }, + "dependencies": { + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "0.4.1", + "signal-exit": "3.0.2" + } + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, + "lru-cache": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", + "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "dev": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true, + "requires": { + "mimic-fn": "1.2.0" + } + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "2.1.0", + "decamelize": "1.2.0", + "loud-rejection": "1.6.0", + "map-obj": "1.0.1", + "minimist": "1.2.0", + "normalize-package-data": "2.4.0", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "redent": "1.0.0", + "trim-newlines": "1.0.0" + } + }, + "mime": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz", + "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==", + "dev": true + }, + "mime-db": { + "version": "1.35.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.35.0.tgz", + "integrity": "sha512-JWT/IcCTsB0Io3AhWUMjRqucrHSPsSf2xKLaRldJVULioggvkJvggZ3VXNNSRkCddE6D+BUI4HEIZIA2OjwIvg==", + "dev": true + }, + "mime-types": { + "version": "2.1.19", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.19.tgz", + "integrity": "sha512-P1tKYHVSZ6uFo26mtnve4HQFE3koh1UWVkp8YUC+ESBHe945xWSoXuHHiGarDqcEZ+whpCDnlNw5LON0kLo+sw==", + "dev": true, + "requires": { + "mime-db": "1.35.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "2.7.1", + "is-builtin-module": "1.0.0", + "semver": "5.5.0", + "validate-npm-package-license": "3.0.3" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "2.0.1" + } + }, + "nugget": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nugget/-/nugget-2.0.1.tgz", + "integrity": "sha1-IBCVpIfhrTYIGzQy+jytpPjQcbA=", + "dev": true, + "requires": { + "debug": "2.6.9", + "minimist": "1.2.0", + "pretty-bytes": "1.0.4", + "progress-stream": "1.2.0", + "request": "2.87.0", + "single-line-log": "1.1.2", + "throttleit": "0.0.2" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "requires": { + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "1.3.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "dev": true, + "requires": { + "got": "6.7.1", + "registry-auth-token": "3.3.2", + "registry-url": "3.1.0", + "semver": "5.5.0" + } + }, + "parse-color": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-color/-/parse-color-1.0.0.tgz", + "integrity": "sha1-e3SLlag/A/FqlPU15S1/PZRlhhk=", + "dev": true, + "requires": { + "color-convert": "0.5.3" + }, + "dependencies": { + "color-convert": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz", + "integrity": "sha1-vbbGnOZg+t/+CwAHzER+G59ygr0=", + "dev": true + } + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "1.3.2" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "2.0.4" + } + }, + "plist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.1.tgz", + "integrity": "sha512-GpgvHHocGRyQm74b6FWEZZVRroHKE1I0/BTjAmySaohK+cUn+hZpbqXkc3KWgW3gQYkqcQej35FohcT0FRlkRQ==", + "dev": true, + "requires": { + "base64-js": "1.3.0", + "xmlbuilder": "9.0.7", + "xmldom": "0.1.27" + }, + "dependencies": { + "base64-js": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", + "dev": true + }, + "xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", + "dev": true + } + } + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "pretty-bytes": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-1.0.4.tgz", + "integrity": "sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ=", + "dev": true, + "requires": { + "get-stdin": "4.0.1", + "meow": "3.7.0" + } + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "progress-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/progress-stream/-/progress-stream-1.2.0.tgz", + "integrity": "sha1-LNPP6jO6OonJwSHsM0er6asSX3c=", + "dev": true, + "requires": { + "speedometer": "0.1.4", + "through2": "0.2.3" + } + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "0.6.0", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + } + }, + "read-config-file": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-3.0.1.tgz", + "integrity": "sha512-xMKmxBYENBqcTMc7r/VteufWgqI9c7oASnOxFa6Crlk4d/nVTOTOJKDhAHJCiGpD8cWzUY9t7K1+M3d75w4f9A==", + "dev": true, + "requires": { + "ajv": "6.5.2", + "ajv-keywords": "3.2.0", + "bluebird-lst": "1.0.5", + "dotenv": "5.0.1", + "dotenv-expand": "4.2.0", + "fs-extra-p": "4.6.1", + "js-yaml": "3.12.0", + "json5": "1.0.1", + "lazy-val": "1.0.3" + }, + "dependencies": { + "ajv": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.2.tgz", + "integrity": "sha512-hOs7GfvI6tUI1LfZddH82ky6mOMyTuY0mk7kE2pWpmhhUSkumzaTO5vbVwij39MdwPQWCV4Zv57Eo06NtL/GVA==", + "dev": true, + "requires": { + "fast-deep-equal": "2.0.1", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.4.1", + "uri-js": "4.2.2" + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + } + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + } + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "2.1.0", + "strip-indent": "1.0.1" + } + }, + "registry-auth-token": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", + "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", + "dev": true, + "requires": { + "rc": "1.2.8", + "safe-buffer": "5.1.2" + } + }, + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "dev": true, + "requires": { + "rc": "1.2.8" + } + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "1.0.2" + } + }, + "request": { + "version": "2.87.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", + "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", + "dev": true, + "requires": { + "aws-sign2": "0.7.0", + "aws4": "1.7.0", + "caseless": "0.12.0", + "combined-stream": "1.0.6", + "extend": "3.0.2", + "forever-agent": "0.6.1", + "form-data": "2.3.2", + "har-validator": "5.0.3", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.19", + "oauth-sign": "0.8.2", + "performance-now": "2.1.0", + "qs": "6.5.2", + "safe-buffer": "5.1.2", + "tough-cookie": "2.3.4", + "tunnel-agent": "0.6.0", + "uuid": "3.3.2" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sanitize-filename": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.1.tgz", + "integrity": "sha1-YS2hyWRz+gLczaktzVtKsWSmdyo=", + "dev": true, + "requires": { + "truncate-utf8-bytes": "1.0.2" + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + }, + "semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "dev": true, + "requires": { + "semver": "5.5.0" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "single-line-log": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/single-line-log/-/single-line-log-1.1.2.tgz", + "integrity": "sha1-wvg/Jzo+GhbtsJlWYdoO1e8DM2Q=", + "dev": true, + "requires": { + "string-width": "1.0.2" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz", + "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", + "dev": true, + "requires": { + "buffer-from": "1.1.0", + "source-map": "0.6.1" + } + }, + "spdx-correct": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", + "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", + "dev": true, + "requires": { + "spdx-expression-parse": "3.0.0", + "spdx-license-ids": "3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", + "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "2.1.0", + "spdx-license-ids": "3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", + "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", + "dev": true + }, + "speedometer": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/speedometer/-/speedometer-0.1.4.tgz", + "integrity": "sha1-mHbb0qFp0xFUAtSObqYynIgWpQ0=", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", + "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", + "dev": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.2", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "safer-buffer": "2.1.2", + "tweetnacl": "0.14.5" + } + }, + "stat-mode": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.2.2.tgz", + "integrity": "sha1-5sgLYjEj19gM8TLOU480YokHJQI=", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "4.0.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "sumchecker": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-1.3.1.tgz", + "integrity": "sha1-ebs7RFbdBPGOvbwNcDodHa7FEF0=", + "dev": true, + "requires": { + "debug": "2.6.9", + "es6-promise": "4.2.6" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + }, + "temp-file": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.1.3.tgz", + "integrity": "sha512-oz2J77loDE9sGrlRTqBzwbsUvoBD2BpyXeaRPKyGwBIwaamSs2jdqAfhutw7Tch9llr1u8E2ruoug09rNPa3PA==", + "dev": true, + "requires": { + "async-exit-hook": "2.0.1", + "bluebird-lst": "1.0.5", + "fs-extra-p": "4.6.1", + "lazy-val": "1.0.3" + } + }, + "term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "dev": true, + "requires": { + "execa": "0.7.0" + } + }, + "throttleit": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz", + "integrity": "sha1-z+34jmDADdlpe2H90qg0OptoDq8=", + "dev": true + }, + "through2": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.2.3.tgz", + "integrity": "sha1-6zKE2k6jEbbMis42U3SKUqvyWj8=", + "dev": true, + "requires": { + "readable-stream": "1.1.14", + "xtend": "2.1.2" + } + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "dev": true + }, + "tough-cookie": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "dev": true, + "requires": { + "punycode": "1.4.1" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + }, + "truncate-utf8-bytes": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha1-QFkjkJWS1W94pYGENLC3hInKXys=", + "dev": true, + "requires": { + "utf8-byte-length": "1.0.4" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, + "optional": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dev": true, + "requires": { + "crypto-random-string": "1.0.0" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", + "dev": true + }, + "update-notifier": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", + "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", + "dev": true, + "requires": { + "boxen": "1.3.0", + "chalk": "2.4.1", + "configstore": "3.1.2", + "import-lazy": "2.1.0", + "is-ci": "1.1.0", + "is-installed-globally": "0.1.0", + "is-npm": "1.0.0", + "latest-version": "3.1.0", + "semver-diff": "2.1.0", + "xdg-basedir": "3.0.0" + } + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "2.1.1" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + } + } + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true, + "requires": { + "prepend-http": "1.0.4" + } + }, + "utf8-byte-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", + "integrity": "sha1-9F8VDExm7uloGGUFq5P8u4rWv2E=", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", + "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", + "dev": true, + "requires": { + "spdx-correct": "3.0.0", + "spdx-expression-parse": "3.0.0" + } + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "widest-line": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz", + "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=", + "dev": true, + "requires": { + "string-width": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write-file-atomic": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", + "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "signal-exit": "3.0.2" + } + }, + "xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "dev": true + }, + "xmlbuilder": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-8.2.2.tgz", + "integrity": "sha1-aSSGc0ELS6QuGmE2VR0pIjNap3M=", + "dev": true + }, + "xmldom": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz", + "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=", + "dev": true + }, + "xtend": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", + "dev": true, + "requires": { + "object-keys": "0.4.0" + } + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", + "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==", + "dev": true, + "requires": { + "cliui": "4.1.0", + "decamelize": "1.2.0", + "find-up": "2.1.0", + "get-caller-file": "1.0.3", + "os-locale": "2.1.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "9.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "yargs-parser": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", + "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", + "dev": true, + "requires": { + "camelcase": "4.1.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + } + } + }, + "yauzl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", + "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", + "dev": true, + "requires": { + "fd-slicer": "1.0.1" + } + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/package-source.sh b/vendor/github.com/SkycoinProject/skycoin/electron/package-source.sh new file mode 100755 index 00000000..a10149db --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/package-source.sh @@ -0,0 +1,43 @@ +#!/usr/bin/env bash +set -e -o pipefail + +SRC_TAR="tmp-src-snapshot.tar" + +SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +pushd "${SCRIPTDIR}" + +if [[ "$OSTYPE" == "linux"* ]]; then + tar -C .. -cvPf "${SRC_TAR}" --owner=0 --group=0 --exclude=electron \ + --exclude=node_modules --exclude=_deprecated --exclude='.*' \ + src cmd run-client.sh run-daemon.sh README.md INSTALLATION.md CHANGELOG.md INTEGRATION.md \ + >/dev/null +elif [[ "$OSTYPE" == "darwin"* ]]; then + tar -C .. -cvf "${SRC_TAR}" --exclude=electron \ + --exclude=node_modules --exclude=_deprecated --exclude='.*' \ + src cmd run-client.sh run-daemon.sh README.md INSTALLATION.md CHANGELOG.md INTEGRATION.md \ + >/dev/null +elif [[ "$OSTYPE" == "msys"* ]]; then + tar -C .. -cvPf "${SRC_TAR}" --owner=0 --group=0 --exclude=electron \ + --exclude=node_modules --exclude=_deprecated --exclude='.*' \ + src cmd run-client.sh run-daemon.sh README.md INSTALLATION.md CHANGELOG.md INTEGRATION.md \ + >/dev/null +fi + +popd >/dev/null + +function copy_source { + echo "Copying source tree to $1" + mkdir -p "$1" + cp "${SRC_TAR}" "$1" + pushd "$1" + tar xvPf "${SRC_TAR}" >/dev/null + rm "${SRC_TAR}" + popd >/dev/null +} + +for var in "$@"; do + copy_source "$var" +done + +rm "${SRC_TAR}" diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/package-standalone-release.sh b/vendor/github.com/SkycoinProject/skycoin/electron/package-standalone-release.sh new file mode 100755 index 00000000..b242ab84 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/package-standalone-release.sh @@ -0,0 +1,112 @@ +#!/usr/bin/env bash +set -e -o pipefail + +# Builds the release without electron + +GOX_OSARCH="$@" + +echo "In package standalone release: $GOX_OSARCH" + +. build-conf.sh "$GOX_OSARCH" + +SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +pushd "$SCRIPTDIR" >/dev/null + +DESTSRCS=() + +function copy_if_exists { + if [ -z "$1" -o -z "$2" -o -z "$3" ]; then + echo "copy_if_exists requires 3 args" + exit 1 + fi + + BIN="${GOX_GUI_OUTPUT_DIR}/${1}" + DESTDIR="$2" + DESTSRC="$3" + + if [ -f "$BIN" ]; then + if [ -e "$DESTDIR" ]; then + rm -r "$DESTDIR" + fi + mkdir -p "$DESTDIR" + + # Copy binary to electron app + echo "Copying $BIN to $DESTDIR" + cp "$BIN" "$DESTDIR" + + # Copy static resources to electron app + echo "Copying $GUI_DIST_DIR to ${DESTDIR}/src/gui/static" + mkdir -p "${DESTDIR}/src/gui/static" + cp -R "$GUI_DIST_DIR" "${DESTDIR}/src/gui/static" + + # Copy changelog to app + echo "Copying CHANGELOG.md to $DESTDIR" + cp ../CHANGELOG.md "$DESTDIR" + + echo "Adding $DESTSRC to package-source.sh list" + DESTSRCS+=("$DESTSRC") + else + echo "$BIN does not exsit" + fi +} + +function codesign_if_exists { + if [ -z "$1" ]; then + echo "codesign_if_exists requires binary path" + exit 1 + fi + + BIN="${GOX_GUI_OUTPUT_DIR}/${1}" + + if [ -f "$BIN" ]; then + echo "signing standalone binary" + codesign --force --sign "Developer ID Application: yunfei mao" "${BIN}" + else + echo "$BIN does not exsit" + fi +} + +echo "Copying ${PKG_NAME} binaries" + +# OS X +if [ ! -z "$OSX64_STL" ]; then + OSX64="${STL_OUTPUT_DIR}/${OSX64_STL}" + OSX64_SRC="${OSX64}/src" + codesign_if_exists "${OSX64_OUT}/${PKG_NAME}" + copy_if_exists "${OSX64_OUT}/${PKG_NAME}" "$OSX64" "$OSX64_SRC" +fi + +# Linux amd64 +if [ ! -z "$LNX64_STL" ]; then + LNX64="${STL_OUTPUT_DIR}/${LNX64_STL}" + LNX64_SRC="${LNX64}/src" + copy_if_exists "${LNX64_OUT}/${PKG_NAME}" "$LNX64" "$LNX64_SRC" +fi + +# Linux arm +if [ ! -z "$LNX_ARM_STL" ]; then + LNX_ARM="${STL_OUTPUT_DIR}/${LNX_ARM_STL}" + LNX_ARM_SRC="${LNX_ARM}/src" + copy_if_exists "${LNX_ARM_OUT}/${PKG_NAME}" "$LNX_ARM" "$LNX_ARM_SRC" +fi + +# Windows amd64 +if [ ! -z "$WIN64_STL" ]; then + WIN64="${STL_OUTPUT_DIR}/${WIN64_STL}" + WIN64_SRC="${WIN64}/src" + copy_if_exists "${WIN64_OUT}/${PKG_NAME}.exe" "$WIN64" "$WIN64_SRC" +fi + +# Windows 386 +if [ ! -z "$WIN32_STL" ]; then + WIN32="${STL_OUTPUT_DIR}/${WIN32_STL}" + WIN32_SRC="${WIN32}/src" + copy_if_exists "${WIN32_OUT}/${PKG_NAME}.exe" "$WIN32" "$WIN32_SRC" +fi + +# # Copy the source for reference +# # tar it with filters, move it, then untar in order to do this +# echo "Copying source snapshot" + +# ./package-source.sh "${DESTSRCS[@]}" diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/package.json b/vendor/github.com/SkycoinProject/skycoin/electron/package.json new file mode 100644 index 00000000..d65adc3a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/package.json @@ -0,0 +1,82 @@ +{ + "name": "skycoin", + "productName": "Skycoin", + "author": "skycoin", + "main": "src/electron-main.js", + "version": "0.27.0", + "description": "skycoin wallet", + "license": "MIT", + "build": { + "appId": "org.skycoin.skycoin", + "nsis": { + "oneClick": false, + "allowToChangeInstallationDirectory": true + }, + "mac": { + "category": "public.app-category.productivity", + "extraFiles": [ + { + "from": ".gox_output/gui/${os}_${arch}", + "to": "./Resources/app" + } + ] + }, + "win": { + "target": "nsis", + "extraFiles": [ + { + "from": ".gox_output/gui/${os}_${arch}", + "to": "./resources/app" + } + ] + }, + "linux": { + "category": "Network", + "extraFiles": [ + { + "from": ".gox_output/gui/${os}_${arch}", + "to": "./resources/app" + }, + { + "from": "build/icons/icon512x512.png", + "to": "./Resources" + } + ] + }, + "files": [ + "!**/*", + "src/**/*" + ], + "extraResources": [ + { + "from": "../src/gui/static/dist/", + "to": "./app/dist/", + "filter": [ + "**/*" + ] + }, + { + "from": "./skycoin/", + "to": "./app/dist/" + } + ], + "directories": { + "output": "release" + } + }, + "scripts": { + "start": "electron ./src/electron-main.js dev", + "dist-win32": "build -w --ia32 -p=never", + "dist-win64": "build -w --x64 -p=never", + "dist-win": "build -w --x64 --ia32 -p=never", + "dist-linux": "build -l --x64 -p=never", + "dist-mac": "build -m --x64 -p=never", + "pack-mac": "build --dir -m -p=never", + "postinstall": "electron-builder install-app-deps" + }, + "devDependencies": { + "electron": "^2.0.18", + "electron-builder": "20.13.3" + }, + "dependencies": {} +} diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/skycoin/current-skycoin.json b/vendor/github.com/SkycoinProject/skycoin/electron/skycoin/current-skycoin.json new file mode 100644 index 00000000..9e88679f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/skycoin/current-skycoin.json @@ -0,0 +1 @@ +versionData='{ "version": "0.27.0" }'; diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/src/.snyk b/vendor/github.com/SkycoinProject/skycoin/electron/src/.snyk new file mode 100644 index 00000000..4747845e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/src/.snyk @@ -0,0 +1,9 @@ +# Snyk (https://snyk.io) policy file, patches or ignores known vulnerabilities. +version: v1.13.1 +# ignores vulnerabilities until expiry date; change duration by modifying expiry date +ignore: + 'npm:chownr:20180731': + - '*': + reason: No fix available + expires: '2019-06-25T15:35:33.473Z' +patch: {} diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/src/README.md b/vendor/github.com/SkycoinProject/skycoin/electron/src/README.md new file mode 100644 index 00000000..6607c49e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/src/README.md @@ -0,0 +1,8 @@ +# Electron code + +This folder contains the JS code that is executed by Electron + +## Install How to install/update the dependencies + +To install/update the code dependencies, instead of using `npm install` run `./install-dependencies.sh`. This way the +native dependencies are compiled for the current platform, something that is necessary for the code to run. diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/src/electron-api.js b/vendor/github.com/SkycoinProject/skycoin/electron/src/electron-api.js new file mode 100644 index 00000000..8a3ea383 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/src/electron-api.js @@ -0,0 +1,2 @@ +window.isElectron = true; +window.ipcRenderer = require('electron').ipcRenderer; \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/src/electron-main.js b/vendor/github.com/SkycoinProject/skycoin/electron/src/electron-main.js new file mode 100644 index 00000000..bcea05ab --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/src/electron-main.js @@ -0,0 +1,383 @@ +'use strict' + +const { app, Menu, BrowserWindow, shell, session } = require('electron'); + +const path = require('path'); + +const childProcess = require('child_process'); + +const axios = require('axios'); + +//const hwCode = require('./hardware-wallet'); + +// This adds refresh and devtools console keybindings +// Page can refresh with cmd+r, ctrl+r, F5 +// Devtools can be toggled with cmd+alt+i, ctrl+shift+i, F12 +require('electron-debug')({enabled: true, showDevTools: false}); +require('electron-context-menu')({}); + + +global.eval = function() { throw new Error('bad!!'); } + +let currentURL; +let splashLoaded = false + +// Detect if the code is running with the "dev" arg. The "dev" arg is added when running npm +// start. If this is true, a local node will not be started, but one is expected to be running, +// the contents served in http://localhost:4200 will be displayed and it will be allowed to +// reload the URLs using the Electron window, so that it is easier to test the changes made to +// the UI using npm start. +let dev = process.argv.find(arg => arg === 'dev') ? true : false; + +// Force everything localhost, in case of a leak +app.commandLine.appendSwitch('host-rules', 'MAP * 127.0.0.1, EXCLUDE api.coinpaprika.com, EXCLUDE swaplab.cc, EXCLUDE version.skycoin.com, EXCLUDE downloads.skycoin.com'); +app.commandLine.appendSwitch('ssl-version-fallback-min', 'tls1.2'); +app.commandLine.appendSwitch('--no-proxy-server'); +app.setAsDefaultProtocolClient('skycoin'); + + + +// Keep a global reference of the window object, if you don't, the window will +// be closed automatically when the JavaScript object is garbage collected. +let win; + +var skycoin = null; + +function startSkycoin() { + if (!dev) { + console.log('Starting skycoin from electron'); + + if (skycoin) { + console.log('Skycoin already running'); + app.emit('skycoin-ready'); + return + } + + var reset = () => { + skycoin = null; + } + + // Resolve skycoin binary location + var appPath = app.getPath('exe'); + var exe = (() => { + switch (process.platform) { + case 'darwin': + return path.join(appPath, '../../Resources/app/skycoin'); + case 'win32': + // Use only the relative path on windows due to short path length + // limits + return './resources/app/skycoin.exe'; + case 'linux': + return path.join(path.dirname(appPath), './resources/app/skycoin'); + default: + return './resources/app/skycoin'; + } + })() + + var args = [ + '-launch-browser=false', + '-gui-dir=' + path.dirname(exe), + '-color-log=false', // must be disabled for web interface detection + '-logtofile=true', + '-download-peerlist=true', + '-enable-all-api-sets=true', + '-enable-api-sets=INSECURE_WALLET_SEED', + '-disable-csrf=false', + '-reset-corrupt-db=true', + '-enable-gui=true', + '-web-interface-port=0' // random port assignment + // will break + // broken (automatically generated certs do not work): + // '-web-interface-https=true', + ] + skycoin = childProcess.spawn(exe, args); + + createWindow(); + + skycoin.on('error', (e) => { + showError(); + app.quit(); + }); + + skycoin.stdout.on('data', (data) => { + console.log(data.toString()); + if (currentURL) { + return + } + + const marker = 'Starting web interface on '; + + data.toString().split('\n').forEach(line => { + if (line.indexOf(marker) !== -1) { + currentURL = 'http://' + line.split(marker)[1].trim(); + var id = setInterval(function() { + // wait till the splash page loading is finished + if (splashLoaded) { + app.emit('skycoin-ready', { url: currentURL }); + clearInterval(id); + } + }, 500); + } + }); + }); + + skycoin.stderr.on('data', (data) => { + console.log(data.toString()); + }); + + skycoin.on('close', (code) => { + // log.info('Skycoin closed'); + console.log('Skycoin closed'); + showError(); + reset(); + }); + + skycoin.on('exit', (code) => { + // log.info('Skycoin exited'); + console.log('Skycoin exited'); + showError(); + reset(); + }); + + } else { + // If in dev mode, simply open the dev server URL. + currentURL = 'http://localhost:4200/'; + app.emit('skycoin-ready', { url: currentURL }); + + axios + .get('http://localhost:4200/api/v1/wallets/folderName') + .then(response => { + walletsFolder = response.data.address; + //hwCode.setWalletsFolderPath(walletsFolder); + }) + .catch(() => {}); + } +} + +function showError() { + if (win) { + win.loadURL('file://' + process.resourcesPath + '/app/dist/assets/error-alert/index.html'); + console.log('Showing the error message'); + } +} + +function createWindow(url) { + // To fix appImage doesn't show icon in dock issue. + var appPath = app.getPath('exe'); + var iconPath = (() => { + switch (process.platform) { + case 'linux': + return path.join(path.dirname(appPath), './resources/icon512x512.png'); + } + })() + + // Create the browser window. + win = new BrowserWindow({ + width: 1200, + height: 900, + backgroundColor: '#000000', + title: 'Skycoin', + icon: iconPath, + nodeIntegration: false, + webPreferences: { + webgl: false, + webaudio: false, + contextIsolation: false, + webviewTag: false, + nodeIntegration: false, + nodeIntegrationInWorker: false, + allowRunningInsecureContent: false, + webSecurity: true, + plugins: false, + preload: __dirname + '/electron-api.js', + }, + }); + //hwCode.setWinRef(win); + + win.webContents.on('did-finish-load', function() { + if (!splashLoaded) { + splashLoaded = true; + } + }); + + // patch out eval + win.eval = global.eval; + win.webContents.executeJavaScript('window.eval = 0;'); + + const ses = win.webContents.session + ses.clearCache(function () { + console.log('Cleared the caching of the skycoin wallet.'); + }); + + if (url) { + win.loadURL(url); + } else { + win.loadURL('file://' + __dirname + '/splash/index.html'); + } + + // Open the DevTools. + // win.webContents.openDevTools(); + + // Emitted when the window is closed. + win.on('closed', () => { + // Dereference the window object, usually you would store windows + // in an array if your app supports multi windows, this is the time + // when you should delete the corresponding element. + win = null; + //hwCode.setWinRef(win); + }); + + // If in dev mode, allow to open URLs. + if (!dev) { + win.webContents.on('will-navigate', function(e, url) { + e.preventDefault(); + require('electron').shell.openExternal(url); + }); + } + + // Open links with target='_blank' in the default browser. + win.webContents.on('new-window', function(e, url) { + e.preventDefault(); + require('electron').shell.openExternal(url); + }); + + // create application's main menu + var template = [{ + label: 'Skycoin', + submenu: [ + { label: 'Quit', accelerator: 'Command+Q', click: function() { app.quit(); } } + ] + }, { + label: 'Edit', + submenu: [ + { label: 'Undo', accelerator: 'CmdOrCtrl+Z', role: 'undo' }, + { label: 'Redo', accelerator: 'Shift+CmdOrCtrl+Z', role: 'redo' }, + { type: 'separator' }, + { label: 'Cut', accelerator: 'CmdOrCtrl+X', role: 'cut' }, + { label: 'Copy', accelerator: 'CmdOrCtrl+C', role: 'copy' }, + { label: 'Paste', accelerator: 'CmdOrCtrl+V', role: 'paste' }, + { label: 'Select All', accelerator: 'CmdOrCtrl+A', role: 'selectall' } + ] + }, { + label: 'Show', + submenu: [ + { + label: 'Wallets folder', + click: () => { + if (walletsFolder) { + shell.showItemInFolder(walletsFolder) + } else { + shell.showItemInFolder(path.join(app.getPath("home"), '.skycoin', 'wallets')); + } + }, + }, + { + label: 'Logs folder', + click: () => { + if (walletsFolder) { + shell.showItemInFolder(walletsFolder.replace('wallets', 'logs')) + } else { + shell.showItemInFolder(path.join(app.getPath("home"), '.skycoin', 'logs')); + } + }, + }, + { + label: 'DevTools', + accelerator: process.platform === 'darwin' ? 'Alt+Command+I' : 'Ctrl+Shift+I', + click: (item, focusedWindow) => { + if (focusedWindow) { + focusedWindow.toggleDevTools(); + } + } + }, + ] + }]; + + Menu.setApplicationMenu(Menu.buildFromTemplate(template)); + + session + .fromPartition('') + .setPermissionRequestHandler((webContents, permission, callback) => { + return callback(false); + }); +} + +// Enforce single instance +const alreadyRunning = app.makeSingleInstance((commandLine, workingDirectory) => { + // Someone tried to run a second instance, we should focus our window. + if (win) { + if (win.isMinimized()) { + win.restore(); + } + win.focus(); + } else { + createWindow(currentURL); + } +}); + +if (alreadyRunning) { + app.quit(); + return; +} + +let walletsFolder = null; + +// This method will be called when Electron has finished +// initialization and is ready to create browser windows. +// Some APIs can only be used after this event occurs. +app.on('ready', startSkycoin); + +app.on('skycoin-ready', (e) => { + if (win) { + win.loadURL(e.url); + } else { + createWindow(e.url); + } + + axios + .get(e.url + '/api/v1/wallets/folderName') + .then(response => { + walletsFolder = response.data.address; + //hwCode.setWalletsFolderPath(walletsFolder); + }) + .catch(() => {}); +}); + +// Quit when all windows are closed. +app.on('window-all-closed', () => { + // On OS X it is common for applications and their menu bar + // to stay active until the user quits explicitly with Cmd + Q + if (process.platform !== 'darwin') { + app.quit(); + } +}); + +app.on('activate', () => { + // On OS X it's common to re-create a window in the app when the + // dock icon is clicked and there are no other windows open. + if (win === null) { + createWindow(currentURL); + } +}); + +app.on('will-quit', () => { + if (skycoin) { + skycoin.kill('SIGINT'); + } +}); + +app.on('web-contents-created', (event, contents) => { + contents.on('will-attach-webview', (event, webPreferences, params) => { + // Strip away preload scripts if unused or verify their location is legitimate + delete webPreferences.preload + delete webPreferences.preloadURL + + // Disable Node.js integration + webPreferences.nodeIntegration = false + + // Verify URL being loaded + if (!params.src.startsWith(url)) { + event.preventDefault(); + } + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/src/hardware-wallet.js b/vendor/github.com/SkycoinProject/skycoin/electron/src/hardware-wallet.js new file mode 100644 index 00000000..4050b76c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/src/hardware-wallet.js @@ -0,0 +1,249 @@ +// Code for using the hw wallet js library. Here only for precaution, should be deleted soon. +// If for some reason it have be reactivated, it should be checked, since due to various updates +// in the js library and the hw wallet firmware some parts could fail. Also, for reactivating it +// code should be uncommented in install-dependencies.sh and the package.son file must have the +// following dependency (probably updated to the lastest commit): +// "hardware-wallet-js": "git+https://git@github.com/skycoin/hardware-wallet-js.git#ddf7265" +// +// More changes could be needed in /src/gui/static/src/app/services/hw-wallet.service.ts + +/* +'use strict' + +const { ipcMain } = require('electron'); + +const deviceWallet = require('hardware-wallet-js/device-wallet'); + +const { Observable, of } = require('rxjs'); + +const HID = require('node-hid'); + +const fs = require('fs'); + +const path = require('path'); + +// Global reference of the window object. +let win; + +function setWinRef(winRef) { + win = winRef; +} + +let fullWalletsFilePath; +let walletsFilePath; +let getSavedWalletsDataSyncEvent; + +function setWalletsFolderPath(folderPath) { + fullWalletsFilePath = path.join(folderPath, 'hw.data'); + walletsFilePath = folderPath; + + if (getSavedWalletsDataSyncEvent) { + getSavedWalletsData(getSavedWalletsDataSyncEvent); + getSavedWalletsDataSyncEvent = undefined; + } +} + +deviceWallet.setDeviceType(deviceWallet.DeviceTypeEnum.USB); +ipcMain.on('hwCompatibilityActivated', (event) => { + event.returnValue = true; +}); + +let checkHwSubscription; +let hwConnected = false; + +function checkHw(wait) { + if (checkHwSubscription) { + checkHwSubscription.unsubscribe(); + } + + checkHwSubscription = Observable.of(1) + .delay(wait ? (hwConnected ? 2000 : 10000) : 0) + .subscribe( + () => { + const connected = HID.devices().find((d) => d.manufacturer === "SkycoinFoundation"); + if (connected && !hwConnected) { + hwConnected = true; + if (win) { + win.webContents.send('hwConnectionEvent', true); + } + } else if (!connected && hwConnected) { + hwConnected = false; + if (win) { + win.webContents.send('hwConnectionEvent', false); + } + } + checkHw(true); + } + ); +} + +checkHw(false); + +ipcMain.on('hwGetDeviceConnectedSync', (event) => { + event.returnValue = HID.devices().find((d) => d.manufacturer && d.manufacturer === "SkycoinFoundation") !== undefined; + checkHw(false); +}); + +ipcMain.on('hwGetSavedWalletsDataSync', (event) => { + if (fullWalletsFilePath) { + getSavedWalletsData(event); + } else { + getSavedWalletsDataSyncEvent = event; + } +}); + +function getSavedWalletsData(event) { + if (fs.existsSync(fullWalletsFilePath)) { + event.returnValue = fs.readFileSync(fullWalletsFilePath, 'utf8'); + } else { + event.returnValue = ''; + } +} + +ipcMain.on('hwSaveWalletsDataSync', (event, data) => { + if (!fs.existsSync(walletsFilePath)) { + fs.mkdirSync(walletsFilePath, { recursive: true }); + } + fs.writeFileSync(fullWalletsFilePath, data, 'utf8'); + event.returnValue = null; +}); + +let lastPinPromiseResolve; +let lastPinPromiseReject; + +const pinEvent = function() { + return new Promise((resolve, reject) => { + lastPinPromiseResolve = resolve; + lastPinPromiseReject = reject; + + console.log("Hardware wallet pin requested"); + if (win) { + win.webContents.send('hwPinRequested'); + } + }); +}; + +ipcMain.on('hwSendPin', (event, pin) => { + lastPinPromiseResolve(pin); +}); + +ipcMain.on('hwCancelPin', (event) => { + lastPinPromiseReject(new Error("Cancelled")) +}); + +let lastSeedWordPromiseResolve; +let lastSeedWordPromiseReject; + +const requestSeedWordEvent = function() { + return new Promise((resolve, reject) => { + lastSeedWordPromiseResolve = resolve; + lastSeedWordPromiseReject = reject; + + console.log("Hardware wallet seed word requested"); + if (win) { + win.webContents.send('hwSeedWordRequested'); + } + }); +}; + +ipcMain.on('hwSendSeedWord', (event, word) => { + if (word) { + lastSeedWordPromiseResolve(word); + } else { + lastSeedWordPromiseReject(new Error("Cancelled")) + } +}); + +ipcMain.on('hwCancelLastAction', (event, requestId) => { + const promise = deviceWallet.devCancelRequest(); + promise.then( + result => { console.log("Cancel promise resolved", result); event.sender.send('hwCancelLastActionResponse', requestId, ''); }, + error => { console.log("Cancel promise errored: ", error); event.sender.send('hwCancelLastActionResponse', requestId, ''); } + ); +}); + +ipcMain.on('hwGetFeatures', (event, requestId) => { + const promise = deviceWallet.devGetFeatures(); + promise.then( + result => { console.log("Features promise resolved", result); event.sender.send('hwGetFeaturesResponse', requestId, result); }, + error => { console.log("Features promise errored: ", error); event.sender.send('hwGetFeaturesResponse', requestId, { error: error.toString() }); } + ); +}); + +ipcMain.on('hwGetAddresses', (event, requestId, addressN, startIndex, confirm) => { + const promise = deviceWallet.devAddressGen(addressN, startIndex, confirm, pinEvent); + promise.then( + addresses => { console.log("Addresses promise resolved", addresses); event.sender.send('hwGetAddressesResponse', requestId, addresses); }, + error => { console.log("Addresses promise errored: ", error); event.sender.send('hwGetAddressesResponse', requestId, { error: error.toString() }); } + ); +}); + +ipcMain.on('hwChangePin', (event, requestId) => { + const promise = deviceWallet.devChangePin(pinEvent); + promise.then( + result => { console.log("Change pin promise resolved", result); event.sender.send('hwChangePinResponse', requestId, result); }, + error => { console.log("Change pin promise errored: ", error); event.sender.send('hwChangePinResponse', requestId, { error: error.toString() }); } + ); +}); + +ipcMain.on('hwGenerateMnemonic', (event, requestId, wordCount) => { + const promise = deviceWallet.devGenerateMnemonic(wordCount, false); + promise.then( + result => { console.log("Generate mnemonic promise resolved", result); event.sender.send('hwGenerateMnemonicResponse', requestId, result); }, + error => { console.log("Generate mnemonic promise errored: ", error); event.sender.send('hwGenerateMnemonicResponse', requestId, { error: error.toString() }); } + ); +}); + +ipcMain.on('hwRecoverMnemonic', (event, requestId, wordCount, dryRun) => { + const promise = deviceWallet.devRecoveryDevice(wordCount, false, requestSeedWordEvent, dryRun); + promise.then( + result => { console.log("Recover mnemonic promise resolved", result); event.sender.send('hwRecoverMnemonicResponse', requestId, result); }, + error => { console.log("Recover mnemonic promise errored: ", error); event.sender.send('hwRecoverMnemonicResponse', requestId, { error: error.toString() }); } + ); +}); + +ipcMain.on('hwBackupDevice', (event, requestId) => { + const promise = deviceWallet.devBackupDevice(pinEvent); + promise.then( + result => { console.log("Backup device promise resolved", result); event.sender.send('hwBackupDeviceResponse', requestId, result); }, + error => { console.log("Backup device promise errored: ", error); event.sender.send('hwBackupDeviceResponse', requestId, { error: error.toString() }); } + ); +}); + +ipcMain.on('hwWipe', (event, requestId) => { + const promise = deviceWallet.devWipeDevice(); + promise.then( + result => { console.log("Wipe promise resolved", result); event.sender.send('hwWipeResponse', requestId, result); }, + error => { console.log("Wipe promise errored: ", error); event.sender.send('hwWipeResponse', requestId, { error: error.toString() }); } + ); +}); + +ipcMain.on('hwSignMessage', (event, requestId, addressIndex, message) => { + const promise = deviceWallet.devSkycoinSignMessage(addressIndex, message, pinEvent); + promise.then( + result => { console.log("Signature promise resolved", result); event.sender.send('hwSignMessageResponse', requestId, result); }, + error => { console.log("Signature promise errored: ", error); event.sender.send('hwSignMessageResponse', requestId, { error: error.toString() }); } + ); +}); + +ipcMain.on('hwSignTransaction', (event, requestId, inputs, outputs) => { + const promise = deviceWallet.devSkycoinTransactionSign(inputs, outputs, pinEvent); + promise.then( + result => { console.log("Sign transaction promise resolved", result); event.sender.send('hwSignTransactionResponse', requestId, result); }, + error => { console.log("Sign transaction promise errored: ", error); event.sender.send('hwSignTransactionResponse', requestId, { error: error.toString() }); } + ); +}); + +ipcMain.on('hwChangeLabel', (event, requestId, label) => { + const promise = deviceWallet.devApplySettings(null, label, null, pinEvent); + promise.then( + result => { console.log("Change label promise resolved", result); event.sender.send('hwChangeLabelResponse', requestId, result); }, + error => { console.log("Change label promise errored: ", error); event.sender.send('hwChangeLabelResponse', requestId, { error: error.toString() }); } + ); +}); + +module.exports = { + setWinRef, + setWalletsFolderPath +} +*/ diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/src/install-dependencies.sh b/vendor/github.com/SkycoinProject/skycoin/electron/src/install-dependencies.sh new file mode 100755 index 00000000..3fc0c861 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/src/install-dependencies.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash + +set -e -o pipefail + +npm install + +# Code for compiling the hw wallet js library native dependencies. Here only for precaution, should be deleted soon. +# ./node_modules/.bin/electron-rebuild --only="node-hid" +# cd node_modules/hardware-wallet-js +# npm run make-protobuf-files +# cd ../.. \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/src/package-lock.json b/vendor/github.com/SkycoinProject/skycoin/electron/src/package-lock.json new file mode 100644 index 00000000..09f05271 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/src/package-lock.json @@ -0,0 +1,1544 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "dev": true + }, + "axios": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.0.tgz", + "integrity": "sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI=", + "requires": { + "follow-redirects": "^1.3.0", + "is-buffer": "^1.1.5" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "dev": true, + "requires": { + "inherits": "~2.0.0" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-spinners": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.3.1.tgz", + "integrity": "sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg==", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "colors": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.2.tgz", + "integrity": "sha512-rhP0JSBGYvpcNQj4s5AdShMeE5ahMop96cTeDl/v9qQQm2fYClE2QXZRi8wLzc+GmXSxdIqqbOIAhyObEXDbfQ==", + "dev": true + }, + "combined-stream": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", + "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true + }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "electron-context-menu": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/electron-context-menu/-/electron-context-menu-0.9.1.tgz", + "integrity": "sha1-7U3yDAgEkcPJlqv8s2MVmUajgFg=", + "requires": { + "electron-dl": "^1.2.0", + "electron-is-dev": "^0.1.1" + } + }, + "electron-debug": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/electron-debug/-/electron-debug-1.5.0.tgz", + "integrity": "sha512-23CLHQXW+gMgdlJbeW1EinPX7DpwuLtfdzSuFL0OnsqEhKGJVJufAZTyq2hc3sr+R53rr3P+mJiYoR5VzAHKJQ==", + "requires": { + "electron-is-dev": "^0.3.0", + "electron-localshortcut": "^3.0.0" + }, + "dependencies": { + "electron-is-dev": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/electron-is-dev/-/electron-is-dev-0.3.0.tgz", + "integrity": "sha1-FOb9pcaOnk7L7/nM8DfL18BcWv4=" + } + } + }, + "electron-dl": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/electron-dl/-/electron-dl-1.12.0.tgz", + "integrity": "sha512-UMc2CL45Ybpvu66LDPYzwmDRmYK4Ivz+wdnTM0eXcNMztvQwhixAk2UPme1c7McqG8bAlKEkQpZn3epmQy4EWg==", + "requires": { + "ext-name": "^5.0.0", + "pupa": "^1.0.0", + "unused-filename": "^1.0.0" + } + }, + "electron-is-accelerator": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/electron-is-accelerator/-/electron-is-accelerator-0.1.2.tgz", + "integrity": "sha1-UJ5RDCala1Xhf4Y6SwThEYRqsns=" + }, + "electron-is-dev": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/electron-is-dev/-/electron-is-dev-0.1.2.tgz", + "integrity": "sha1-ihBD4ys6HaHD9VPc4oznZCRhZ+M=" + }, + "electron-localshortcut": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/electron-localshortcut/-/electron-localshortcut-3.1.0.tgz", + "integrity": "sha512-MgL/j5jdjW7iA0R6cI7S045B0GlKXWM1FjjujVPjlrmyXRa6yH0bGSaIAfxXAF9tpJm3pLEiQzerYHkRh9JG/A==", + "requires": { + "debug": "^2.6.8", + "electron-is-accelerator": "^0.1.0", + "keyboardevent-from-electron-accelerator": "^1.1.0", + "keyboardevents-areequal": "^0.2.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "electron-rebuild": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/electron-rebuild/-/electron-rebuild-1.8.2.tgz", + "integrity": "sha512-EeR4dgb6NN7ybxduUWMeeLhU/EuF+FzwFZJfMJXD0bx96K+ttAieCXOn9lTO5nA9Qn3hiS7pEpk8pZ9StpGgSg==", + "dev": true, + "requires": { + "colors": "^1.2.0", + "debug": "^2.6.3", + "detect-libc": "^1.0.3", + "fs-extra": "^3.0.1", + "node-abi": "^2.0.0", + "node-gyp": "^3.6.0", + "ora": "^1.2.0", + "rimraf": "^2.6.1", + "spawn-rx": "^2.0.10", + "yargs": "^7.0.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "ext-list": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", + "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==", + "requires": { + "mime-db": "^1.28.0" + } + }, + "ext-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz", + "integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==", + "requires": { + "ext-list": "^2.0.0", + "sort-keys-length": "^1.0.0" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + } + } + }, + "follow-redirects": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.1.tgz", + "integrity": "sha512-v9GI1hpaqq1ZZR6pBD1+kI7O24PhDvNGNodjS3MdcEqyrahCp8zbtpv+2B/krUnSmUH80lbAS7MrdeK5IylgKg==", + "requires": { + "debug": "^3.1.0" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "1.0.6", + "mime-types": "^2.1.12" + }, + "dependencies": { + "combined-stream": { + "version": "1.0.6", + "resolved": "http://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + } + } + }, + "fs-extra": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", + "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^3.0.0", + "universalify": "^0.1.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fstream": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", + "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", + "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", + "dev": true, + "requires": { + "ajv": "^5.3.0", + "har-schema": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true + }, + "hosted-git-info": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "dev": true + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "jsonfile": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", + "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "keyboardevent-from-electron-accelerator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/keyboardevent-from-electron-accelerator/-/keyboardevent-from-electron-accelerator-1.1.0.tgz", + "integrity": "sha512-VDC4vKWGrR3VgIKCE4CsXnvObGgP8C2idnTKEMUkuEuvDGE1GEBX9FtNdJzrD00iQlhI3xFxRaeItsUmlERVng==" + }, + "keyboardevents-areequal": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/keyboardevents-areequal/-/keyboardevents-areequal-0.2.2.tgz", + "integrity": "sha512-Nv+Kr33T0mEjxR500q+I6IWisOQ0lK1GGOncV0kWE6n4KFmpcu7RUX5/2B0EUtX51Cb0HjZ9VJsSY3u4cBa0kw==" + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", + "dev": true + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "requires": { + "chalk": "^2.0.1" + } + }, + "mime-db": { + "version": "1.35.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.35.0.tgz", + "integrity": "sha512-JWT/IcCTsB0Io3AhWUMjRqucrHSPsSf2xKLaRldJVULioggvkJvggZ3VXNNSRkCddE6D+BUI4HEIZIA2OjwIvg==" + }, + "mime-types": { + "version": "2.1.20", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz", + "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==", + "dev": true, + "requires": { + "mime-db": "~1.36.0" + }, + "dependencies": { + "mime-db": { + "version": "1.36.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz", + "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==", + "dev": true + } + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "modify-filename": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/modify-filename/-/modify-filename-1.1.0.tgz", + "integrity": "sha1-mi3sg4Bvuy2XXyK+7IWcoms5OqE=" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node-abi": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.4.4.tgz", + "integrity": "sha512-DQ9Mo2mf/XectC+s6+grPPRQ1Z9gI3ZbrGv6nyXRkjwT3HrE0xvtvrfnH7YHYBLgC/KLadg+h3XHnhZw1sv88A==", + "dev": true, + "requires": { + "semver": "^5.4.1" + } + }, + "node-gyp": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", + "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", + "dev": true, + "requires": { + "fstream": "^1.0.0", + "glob": "^7.0.3", + "graceful-fs": "^4.1.2", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1 || 2 || 3 || 4", + "osenv": "0", + "request": "^2.87.0", + "rimraf": "2", + "semver": "~5.3.0", + "tar": "^2.0.0", + "which": "1" + }, + "dependencies": { + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true + } + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "ora": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-1.4.0.tgz", + "integrity": "sha512-iMK1DOQxzzh2MBlVsU42G80mnrvUhqsMh74phHtDlrcTZPK0pH6o7l7DRshK+0YsxDyEuaOkziVdvM3T0QTzpw==", + "dev": true, + "requires": { + "chalk": "^2.1.0", + "cli-cursor": "^2.1.0", + "cli-spinners": "^1.0.1", + "log-symbols": "^2.1.0" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "1.4.0", + "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "^1.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "psl": { + "version": "1.1.29", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", + "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==", + "dev": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "pupa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-1.0.0.tgz", + "integrity": "sha1-mpVopa9+ZXuEYqbp1TKHQ1YM7/Y=" + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "requires": { + "glob": "^7.0.5" + } + }, + "rxjs": { + "version": "5.5.12", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", + "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", + "requires": { + "symbol-observable": "1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "semver": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", + "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "sort-keys-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz", + "integrity": "sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg=", + "requires": { + "sort-keys": "^1.0.0" + } + }, + "spawn-rx": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/spawn-rx/-/spawn-rx-2.0.12.tgz", + "integrity": "sha512-gOPXiQQFQ9lTOLuys0iMn3jfxxv9c7zzwhbYLOEbQGvEShHVJ5sSR1oD3Daj88os7jKArDYT7rbOKdvNhe7iEg==", + "dev": true, + "requires": { + "debug": "^2.5.1", + "lodash.assign": "^4.2.0", + "rxjs": "^5.1.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "spdx-correct": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.1.tgz", + "integrity": "sha512-hxSPZbRZvSDuOvADntOElzJpenIR7wXJkuoUcUtS0erbgt2fgeaoPIYretfKpslMhfFDY4k0MZ2F5CUzhBsSvQ==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", + "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.1.tgz", + "integrity": "sha512-TfOfPcYGBB5sDuPn3deByxPhmfegAhpDYKSOXZQN81Oyrrif8ZCodOLzK3AesELnCx03kikhyDwh0pfvvQvF8w==", + "dev": true + }, + "sshpk": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", + "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=" + }, + "tar": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "dev": true, + "requires": { + "block-stream": "*", + "fstream": "^1.0.2", + "inherits": "2" + } + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, + "optional": true + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unused-filename": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unused-filename/-/unused-filename-1.0.0.tgz", + "integrity": "sha1-00CID3GuIRXrqhMlvvBcxmhEacY=", + "requires": { + "modify-filename": "^1.1.0", + "path-exists": "^3.0.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yargs": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", + "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.0" + } + }, + "yargs-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", + "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", + "dev": true, + "requires": { + "camelcase": "^3.0.0" + } + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/src/package.json b/vendor/github.com/SkycoinProject/skycoin/electron/src/package.json new file mode 100644 index 00000000..a1979c0d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/src/package.json @@ -0,0 +1,14 @@ +{ + "main": "electron-main.js", + "license": "MIT", + "description": "skycoin wallet", + "dependencies": { + "axios": "^0.18.0", + "electron-context-menu": "^0.9.1", + "electron-debug": "^1.5.0", + "rxjs": "^5.5.12" + }, + "devDependencies": { + "electron-rebuild": "^1.8.2" + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/electron/src/splash/index.html b/vendor/github.com/SkycoinProject/skycoin/electron/src/splash/index.html new file mode 100644 index 00000000..546f99e8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/electron/src/splash/index.html @@ -0,0 +1,44 @@ + + + + + + + + +
+
+ +
+ +
+
+
+ + diff --git a/vendor/github.com/SkycoinProject/skycoin/fiber.toml b/vendor/github.com/SkycoinProject/skycoin/fiber.toml new file mode 100644 index 00000000..c8ce5860 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/fiber.toml @@ -0,0 +1,149 @@ +# fiber configuration +# Defaults are shown, commented out +# Some values have no defaults and must be filled in +[node] +genesis_signature_str = "eb10468d10054d15f2b6f8946cd46797779aa20a7617ceb4be884189f219bc9a164e56a5b9f7bec392a804ff3740210348d73db77a37adb542a8e08d429ac92700" +genesis_address_str = "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6" +blockchain_pubkey_str = "0328c576d3f420e7682058a981173a4b374c7cc5ff55bf394d3cf57059bbe6456a" +blockchain_seckey_str = "" +genesis_timestamp = 1426562704 +# genesis_coin_volume = 100e12 +default_connections = [ + "139.162.121.185:6000", + "172.104.164.147:6000", + "139.162.248.183:6000", + "45.56.109.228:6000", + "173.230.130.174:6000", + "139.162.39.186:6000", + "45.33.111.142:6000", + "109.237.27.172:6000", + "172.104.41.14:6000" +] +peer_list_url = "https://downloads.skycoin.com/blockchain/peers.txt" +# port = 6000 +# web_interface_port = 6420 +# unconfirmed_burn_factor = 10 +# unconfirmed_max_transaction_size = 32 * 1024 +# unconfirmed_max_decimals = 3 +# create_block_burn_factor = 10 +# create_block_max_transaction_size = 32 * 1024 +# create_block_max_decimals = 3 +# max_block_transactions_size = 32 * 1024 +# display_name = "Skycoin" +# ticker = "SKY" +# coin_hours_display_name = "Coin Hours" +# coin_hours_display_name_singular = "Coin Hour" +# coin_hours_ticker = "SCH" +# explorer_url = "https://explorer.skycoin.com" +# bip44_coin = 8000 + +[params] +# max_coin_supply = 1e8 +# initial_unlocked_count = 25 +# unlock_address_rate = 5 +# unlock_time_interval = 60 * 60 * 24 * 365 +# user_max_decimals = 3 +# user_max_transaction_size = 32 * 1024 +# user_burn_factor = 10 +distribution_addresses = [ + "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", +] diff --git a/vendor/github.com/SkycoinProject/skycoin/iketheadore.asc b/vendor/github.com/SkycoinProject/skycoin/iketheadore.asc new file mode 100644 index 00000000..e92bb2cb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/iketheadore.asc @@ -0,0 +1,14 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mDMEXYCYPxYJKwYBBAHaRw8BAQdAeDPi3n9xLv5xGsxbcbwZjfV4h772W+GPZ3Mz +RS17STm0L2lrZXRoZWFkb3JlIHNreWNvaW4gPGx1eGFpcmxha2VAcHJvdG9ubWFp +bC5jb20+iJYEExYIAD4WIQSY+TTwT5M0uB36M5iRO71SBrGWIAUCXYCYPwIbAwUJ +B4TOAAULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRCRO71SBrGWID0NAP0VRiNA +2Kq2uakPMqV29HY39DVhc9QgxJfMIwXWtFxKAwEAn0NqGRV/iKXNf+qxqAtMWa5X +F2S36hkEfDHO5W44DwC4OARdgJg/EgorBgEEAZdVAQUBAQdAeiEz/tUmCgOA67Rq +ANmHmX2vrdZp/SfJ9KOI2ANCCm8DAQgHiH4EGBYIACYWIQSY+TTwT5M0uB36M5iR +O71SBrGWIAUCXYCYPwIbDAUJB4TOAAAKCRCRO71SBrGWIJOJAQDTaqxpcLtAw5kH +Hp2jWvUnLudIONeqeUTCmkLJhcNv1wD+PFJZWMKD1btIG4pkXRW9YoA7M7t5by5O +x5I+LywZNww= +=p6Gq +-----END PGP PUBLIC KEY BLOCK----- diff --git a/vendor/github.com/SkycoinProject/skycoin/peers.txt b/vendor/github.com/SkycoinProject/skycoin/peers.txt new file mode 100644 index 00000000..8fd3feac --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/peers.txt @@ -0,0 +1,13 @@ +118.178.135.93:6000 +139.162.33.154:6000 +45.63.21.232:6000 +172.105.210.184:6000 +139.162.39.186:6000 +45.33.111.142:6000 +109.237.27.172:6000 +172.104.41.14:6000 +139.162.121.185:6000 +172.104.164.147:6000 +139.162.248.183:6000 +45.56.109.228:6000 +173.230.130.174:6000 diff --git a/vendor/github.com/SkycoinProject/skycoin/run-client.sh b/vendor/github.com/SkycoinProject/skycoin/run-client.sh new file mode 100755 index 00000000..9d168042 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/run-client.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash + +# Runs skycoin in desktop client configuration + +set -x + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +echo "skycoin binary dir:" "$DIR" +pushd "$DIR" >/dev/null + +COMMIT=$(git rev-parse HEAD) +BRANCH=$(git rev-parse --abbrev-ref HEAD) +GOLDFLAGS="${GOLDFLAGS} -X main.Commit=${COMMIT} -X main.Branch=${BRANCH}" + +GORUNFLAGS=${GORUNFLAGS:-} + +go run -ldflags "${GOLDFLAGS}" $GORUNFLAGS cmd/skycoin/skycoin.go \ + -gui-dir="${DIR}/src/gui/static/" \ + -launch-browser=true \ + -enable-all-api-sets=true \ + -enable-gui=true \ + -log-level=debug \ + $@ + +popd >/dev/null diff --git a/vendor/github.com/SkycoinProject/skycoin/run-daemon.sh b/vendor/github.com/SkycoinProject/skycoin/run-daemon.sh new file mode 100755 index 00000000..5761eec6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/run-daemon.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash + +# Runs skycoin in daemon mode configuration + +set -x + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +echo "skycoin binary dir:" "$DIR" +pushd "$DIR" >/dev/null + +COMMIT=$(git rev-parse HEAD) +BRANCH=$(git rev-parse --abbrev-ref HEAD) +GOLDFLAGS="-X main.Commit=${COMMIT} -X main.Branch=${BRANCH}" + +GORUNFLAGS=${GORUNFLAGS:-} + +go run -ldflags "${GOLDFLAGS}" $GORUNFLAGS cmd/skycoin/skycoin.go \ + -enable-gui=false \ + -launch-browser=false \ + -log-level=debug \ + $@ + +popd >/dev/null diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/README.md b/vendor/github.com/SkycoinProject/skycoin/src/api/README.md new file mode 100644 index 00000000..1999f121 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/README.md @@ -0,0 +1,4528 @@ +# REST API Documentation + +API default service port is `6420`. However, if running the desktop or standalone releases from the website, the port is randomized by default. + +A REST API implemented in Go is available, +see [Skycoin REST API Client Godoc](https://godoc.org/github.com/SkycoinProject/skycoin/src/api#Client). + +The API has two versions, `/api/v1` and `/api/v2`. + + + +- [API Version 1](#api-version-1) +- [API Version 2](#api-version-2) +- [API Sets](#api-sets) +- [Authentication](#authentication) +- [CSRF](#csrf) + - [Get current csrf token](#get-current-csrf-token) +- [General system checks](#general-system-checks) + - [Health check](#health-check) + - [Version info](#version-info) + - [Prometheus metrics](#prometheus-metrics) +- [Simple query APIs](#simple-query-apis) + - [Get balance of addresses](#get-balance-of-addresses) + - [Get unspent output set of address or hash](#get-unspent-output-set-of-address-or-hash) + - [Verify an address](#verify-an-address) +- [Wallet APIs](#wallet-apis) + - [Get wallet](#get-wallet) + - [Get unconfirmed transactions of a wallet](#get-unconfirmed-transactions-of-a-wallet) + - [Get wallets](#get-wallets) + - [Get wallet folder name](#get-wallet-folder-name) + - [Generate wallet seed](#generate-wallet-seed) + - [Verify wallet Seed](#verify-wallet-seed) + - [Create wallet](#create-wallet) + - [Generate new address in wallet](#generate-new-address-in-wallet) + - [Change wallet label](#change-wallet-label) + - [Get wallet balance](#get-wallet-balance) + - [Create transaction](#create-transaction) + - [Sign transaction](#sign-transaction) + - [Unload wallet](#unload-wallet) + - [Encrypt wallet](#encrypt-wallet) + - [Decrypt wallet](#decrypt-wallet) + - [Get wallet seed](#get-wallet-seed) + - [Recover encrypted wallet by seed](#recover-encrypted-wallet-by-seed) +- [Key-value storage APIs](#key-value-storage-apis) + - [Get all storage values](#get-all-storage-values) + - [Add value to storage](#add-value-to-storage) + - [Remove value from storage](#remove-value-from-storage) +- [Transaction APIs](#transaction-apis) + - [Get unconfirmed transactions](#get-unconfirmed-transactions) + - [Create transaction from unspent outputs or addresses](#create-transaction-from-unspent-outputs-or-addresses) + - [Get transaction info by id](#get-transaction-info-by-id) + - [Get raw transaction by id](#get-raw-transaction-by-id) + - [Inject raw transaction](#inject-raw-transaction) + - [Get transactions for addresses](#get-transactions-for-addresses) + - [Resend unconfirmed transactions](#resend-unconfirmed-transactions) + - [Verify encoded transaction](#verify-encoded-transaction) +- [Block APIs](#block-apis) + - [Get blockchain metadata](#get-blockchain-metadata) + - [Get blockchain progress](#get-blockchain-progress) + - [Get block by hash or seq](#get-block-by-hash-or-seq) + - [Get blocks in specific range](#get-blocks-in-specific-range) + - [Get last N blocks](#get-last-n-blocks) +- [Uxout APIs](#uxout-apis) + - [Get uxout](#get-uxout) + - [Get historical unspent outputs for an address](#get-historical-unspent-outputs-for-an-address) +- [Coin supply related information](#coin-supply-related-information) + - [Coin supply](#coin-supply) + - [Richlist show top N addresses by uxouts](#richlist-show-top-n-addresses-by-uxouts) + - [Count unique addresses](#count-unique-addresses) +- [Network status](#network-status) + - [Get information for a specific connection](#get-information-for-a-specific-connection) + - [Get a list of all connections](#get-a-list-of-all-connections) + - [Get a list of all default connections](#get-a-list-of-all-default-connections) + - [Get a list of all trusted connections](#get-a-list-of-all-trusted-connections) + - [Get a list of all connections discovered through peer exchange](#get-a-list-of-all-connections-discovered-through-peer-exchange) + - [Disconnect a peer](#disconnect-a-peer) +- [Migrating from the unversioned API](#migrating-from-the-unversioned-api) +- [Migrating from the JSONRPC API](#migrating-from-the-jsonrpc-api) +- [Migrating from /api/v1/spend](#migrating-from-apiv1spend) +- [Migration from /api/v1/explorer/address](#migration-from-apiv1exploreraddress) + + + +## API Version 1 + +`/api/v1` endpoints have no standard format. Most of them accept formdata in POST requests, +but a few accept `application/json` instead. Most of them return JSON but one or two +return a plaintext string. + +All endpoints will set an appropriate HTTP status code, using `200` for success and codes greater than or equal to `400` for error. + +`/api/v1` endpoints guarantee backwards compatibility. + +## API Version 2 + +*Note: API Version 2 is under development, and not stable. The guidelines here are subject to change.* + +`/api/v2` endpoints have a standard format. + +All `/api/v2` `POST` endpoints accept only `application/json` and return `application/json`. + +All `/api/v2` `GET` requires accept data in the query string. +In the future we may have choose to have `GET` requests also accept `POST` with a JSON body, +to support requests with a large query body, such as when requesting data for a large number +of addresses or transactions. + +`/api/v2` responses are always JSON. If there is an error, the JSON object will +look like this: + +```json +{ + "error": { + "code": 400, + "message": "bad arguments", + } +} +``` + +Response data will be included in a `"data"` field, which will always be a JSON object (not an array). + +Some endpoints may return both `"error"` and `"data"`. This will be noted in the documentation for that endpoint. + +All responses will set an appropriate HTTP status code indicating an error, and it will be equal to the value of `response["error"]["code"]`. + +Since `/api/v2` is still under development, there are no guarantees for backwards compatibility. +However, any changes to the API will be recorded in the [changelog](../../CHANGELOG.md). + +Under some circumstances an error response body may not be valid JSON. +Any client consuming the API should accomodate this and conditionally parse JSON for non-`200` responses. + +## API Sets + +API endpoints are grouped into "sets" which can be toggled with the command line parameters +`-enable-api-sets`, `-disable-api-sets` and `-enable-all-api-sets`. + +These API sets are: + +* `READ` - All query-related endpoints, they do not modify the state of the program +* `STATUS` - A subset of `READ`, these endpoints report the application, network or blockchain status +* `TXN` - Enables `/api/v1/injectTransaction` and `/api/v1/resendUnconfirmedTxns` without enabling wallet endpoints +* `WALLET` - These endpoints operate on local wallet files +* `PROMETHEUS` - This is the `/api/v2/metrics` method exposing in Prometheus text format the default metrics for Skycoin node application +* `NET_CTRL` - The `/api/v1/network/connection/disconnect` method, intended for network administration endpoints +* `INSECURE_WALLET_SEED` - This is the `/api/v1/wallet/seed` endpoint, used to decrypt and return the seed from an encrypted wallet. It is only intended for use by the desktop client. +* `STORAGE` - This is the `/api/v2/data` endpoint, used to interact with the key-value storage. + +## Authentication + +Authentication can be enabled with the `-web-interface-username` and `-web-interface-password` options. +The username and password should be provided in an `Authorization: Basic` header. + +Authentication can only be enabled when using HTTPS with `-web-interface-https`, unless `-web-interface-plaintext-auth` is enabled. + +## CSRF + +All `POST`, `PUT` and `DELETE` requests require a CSRF token, obtained with a `GET /api/v1/csrf` call. +The token must be placed in the `X-CSRF-Token` header. A token is only valid +for 30 seconds and it is expected that the client obtains a new CSRF token +for each request. Requesting a CSRF token invalidates any previous CSRF token. + +A request rejected for invalid or expired CSRF will respond with `403 Forbidden - invalid CSRF token` +as the response body. + +### Get current csrf token + +API sets: any + +``` +URI: /api/v1/csrf +Method: GET +``` + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/csrf +``` + +Result: + +```json +{ + "csrf_token": "klSgXoMOFTvEnt8KptBvHjhlFnW0OIkzyFVn4i8frDvIus9iLsFukqA9sM9Rxf3pLZHRLr82vBQxTq50vbYA8g" +} +``` + +## General system checks + +### Health check + +API sets: `STATUS`, `READ` + +``` +URI: /api/v1/health +Method: GET +``` + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/health +``` + +Response: + +```json +{ + "blockchain": { + "head": { + "seq": 58894, + "block_hash": "3961bea8c4ab45d658ae42effd4caf36b81709dc52a5708fdd4c8eb1b199a1f6", + "previous_block_hash": "8eca94e7597b87c8587286b66a6b409f6b4bf288a381a56d7fde3594e319c38a", + "timestamp": 1537581604, + "fee": 485194, + "version": 0, + "tx_body_hash": "c03c0dd28841d5aa87ce4e692ec8adde923799146ec5504e17ac0c95036362dd", + "ux_hash": "f7d30ecb49f132283862ad58f691e8747894c9fc241cb3a864fc15bd3e2c83d3" + }, + "unspents": 38171, + "unconfirmed": 1, + "time_since_last_block": "4m46s" + }, + "version": { + "version": "0.25.0", + "commit": "8798b5ee43c7ce43b9b75d57a1a6cd2c1295cd1e", + "branch": "develop" + }, + "coin": "skycoin", + "user_agent": "skycoin:0.25.0", + "open_connections": 8, + "outgoing_connections": 5, + "incoming_connections": 3, + "uptime": "6m30.629057248s", + "csrf_enabled": true, + "csp_enabled": true, + "wallet_api_enabled": true, + "gui_enabled": true, + "user_verify_transaction": { + "burn_factor": 10, + "max_transaction_size": 32768, + "max_decimals": 3 + }, + "unconfirmed_verify_transaction": { + "burn_factor": 10, + "max_transaction_size": 32768, + "max_decimals": 3 + }, + "started_at": 1542443907, + "fiber": { + "name": "skycoin", + "display_name": "Skycoin", + "ticker": "SKY", + "coin_hours_display_name": "Coin Hours", + "coin_hours_display_name_singular": "Coin Hour", + "coin_hours_ticker": "SCH", + "explorer_url": "https://explorer.skycoin.com", + "bip44_coin": 8000 + } +} +``` + +### Version info + +API sets: any + +``` +URI: /api/v1/version +Method: GET +``` + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/version +``` + +Result: + +```json +{ + "version": "0.20.0", + "commit": "cc733e9922d85c359f5f183d3a3a6e42c73ccb16", + "branch": "develop" +} +``` + +### Prometheus metrics + +API sets: `PROMETHEUS` + +``` +URI: /api/v2/metrics +Method: GET +``` + +Example: + +```sh +curl http://127.0.0.1:6420/api/v2/metrics +``` + +Result: + +``` +# HELP go_gc_duration_seconds A summary of the GC invocation durations. +# TYPE go_gc_duration_seconds summary +go_gc_duration_seconds{quantile="0"} 5.31e-05 +go_gc_duration_seconds{quantile="0.25"} 0.000158 +go_gc_duration_seconds{quantile="0.5"} 0.0001789 +go_gc_duration_seconds{quantile="0.75"} 0.0002216 +go_gc_duration_seconds{quantile="1"} 0.0005878 +go_gc_duration_seconds_sum 0.3881053 +go_gc_duration_seconds_count 1959 +# HELP go_goroutines Number of goroutines that currently exist. +# TYPE go_goroutines gauge +go_goroutines 30 +# HELP go_memstats_alloc_bytes Number of bytes allocated and still in use. +# TYPE go_memstats_alloc_bytes gauge +go_memstats_alloc_bytes 2.862168e+06 +# HELP go_memstats_alloc_bytes_total Total number of bytes allocated, even if freed. +# TYPE go_memstats_alloc_bytes_total counter +go_memstats_alloc_bytes_total 4.462792584e+09 +# HELP go_memstats_buck_hash_sys_bytes Number of bytes used by the profiling bucket hash table. +# TYPE go_memstats_buck_hash_sys_bytes gauge +go_memstats_buck_hash_sys_bytes 1.794588e+06 +# HELP go_memstats_frees_total Total number of frees. +# TYPE go_memstats_frees_total counter +go_memstats_frees_total 4.7917586e+07 +# HELP go_memstats_gc_sys_bytes Number of bytes used for garbage collection system metadata. +# TYPE go_memstats_gc_sys_bytes gauge +go_memstats_gc_sys_bytes 2.392064e+06 +# HELP go_memstats_heap_alloc_bytes Number of heap bytes allocated and still in use. +# TYPE go_memstats_heap_alloc_bytes gauge +go_memstats_heap_alloc_bytes 2.862168e+06 +# HELP go_memstats_heap_idle_bytes Number of heap bytes waiting to be used. +# TYPE go_memstats_heap_idle_bytes gauge +go_memstats_heap_idle_bytes 6.0973056e+07 +# HELP go_memstats_heap_inuse_bytes Number of heap bytes that are in use. +# TYPE go_memstats_heap_inuse_bytes gauge +go_memstats_heap_inuse_bytes 5.087232e+06 +# HELP go_memstats_heap_objects Number of allocated objects. +# TYPE go_memstats_heap_objects gauge +go_memstats_heap_objects 16326 +# HELP go_memstats_heap_released_bytes_total Total number of heap bytes released to OS. +# TYPE go_memstats_heap_released_bytes_total counter +go_memstats_heap_released_bytes_total 0 +# HELP go_memstats_heap_sys_bytes Number of heap bytes obtained from system. +# TYPE go_memstats_heap_sys_bytes gauge +go_memstats_heap_sys_bytes 6.6060288e+07 +# HELP go_memstats_last_gc_time_seconds Number of seconds since 1970 of last garbage collection. +# TYPE go_memstats_last_gc_time_seconds gauge +go_memstats_last_gc_time_seconds 1.5366276699863462e+09 +# HELP go_memstats_lookups_total Total number of pointer lookups. +# TYPE go_memstats_lookups_total counter +go_memstats_lookups_total 0 +# HELP go_memstats_mallocs_total Total number of mallocs. +# TYPE go_memstats_mallocs_total counter +go_memstats_mallocs_total 4.7933912e+07 +# HELP go_memstats_mcache_inuse_bytes Number of bytes in use by mcache structures. +# TYPE go_memstats_mcache_inuse_bytes gauge +go_memstats_mcache_inuse_bytes 6912 +# HELP go_memstats_mcache_sys_bytes Number of bytes used for mcache structures obtained from system. +# TYPE go_memstats_mcache_sys_bytes gauge +go_memstats_mcache_sys_bytes 16384 +# HELP go_memstats_mspan_inuse_bytes Number of bytes in use by mspan structures. +# TYPE go_memstats_mspan_inuse_bytes gauge +go_memstats_mspan_inuse_bytes 76000 +# HELP go_memstats_mspan_sys_bytes Number of bytes used for mspan structures obtained from system. +# TYPE go_memstats_mspan_sys_bytes gauge +go_memstats_mspan_sys_bytes 180224 +# HELP go_memstats_next_gc_bytes Number of heap bytes when next garbage collection will take place. +# TYPE go_memstats_next_gc_bytes gauge +go_memstats_next_gc_bytes 5.576912e+06 +# HELP go_memstats_other_sys_bytes Number of bytes used for other system allocations. +# TYPE go_memstats_other_sys_bytes gauge +go_memstats_other_sys_bytes 792284 +# HELP go_memstats_stack_inuse_bytes Number of bytes in use by the stack allocator. +# TYPE go_memstats_stack_inuse_bytes gauge +go_memstats_stack_inuse_bytes 1.048576e+06 +# HELP go_memstats_stack_sys_bytes Number of bytes obtained from system for stack allocator. +# TYPE go_memstats_stack_sys_bytes gauge +go_memstats_stack_sys_bytes 1.048576e+06 +# HELP go_memstats_sys_bytes Number of bytes obtained by system. Sum of all system allocations. +# TYPE go_memstats_sys_bytes gauge +go_memstats_sys_bytes 7.2284408e+07 +# HELP process_cpu_seconds_total Total user and system CPU time spent in seconds. +# TYPE process_cpu_seconds_total counter +process_cpu_seconds_total 36.04 +# HELP process_max_fds Maximum number of open file descriptors. +# TYPE process_max_fds gauge +process_max_fds 1.048576e+06 +# HELP process_open_fds Number of open file descriptors. +# TYPE process_open_fds gauge +process_open_fds 15 +# HELP process_resident_memory_bytes Resident memory size in bytes. +# TYPE process_resident_memory_bytes gauge +process_resident_memory_bytes 4.9025024e+07 +# HELP process_start_time_seconds Start time of the process since unix epoch in seconds. +# TYPE process_start_time_seconds gauge +process_start_time_seconds 1.53662761869e+09 +# HELP process_virtual_memory_bytes Virtual memory size in bytes. +# TYPE process_virtual_memory_bytes gauge +process_virtual_memory_bytes 8.22317056e+08 +``` + + +## Simple query APIs + +### Get balance of addresses + +API sets: `READ` + +``` +URI: /api/v1/balance +Method: GET, POST +Args: + addrs: comma-separated list of addresses. must contain at least one address +``` + +Returns the cumulative and individual balances of one or more addresses. +The `POST` method can be used if many addresses need to be queried. + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/balance?addrs=7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD,nu7eSpT6hr5P21uzw7bnbxm83B6ywSjHdq,2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6 +``` + +Result: + +```json +{ + "confirmed": { + "coins": 21000000, + "hours": 142744 + }, + "predicted": { + "coins": 21000000, + "hours": 142744 + }, + "addresses": { + "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6": { + "confirmed": { + "coins": 0, + "hours": 0 + }, + "predicted": { + "coins": 0, + "hours": 0 + } + }, + "7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD": { + "confirmed": { + "coins": 9000000, + "hours": 88075 + }, + "predicted": { + "coins": 9000000, + "hours": 88075 + } + }, + "nu7eSpT6hr5P21uzw7bnbxm83B6ywSjHdq": { + "confirmed": { + "coins": 12000000, + "hours": 54669 + }, + "predicted": { + "coins": 12000000, + "hours": 54669 + } + } + } +} +``` + +### Get unspent output set of address or hash + +API sets: `READ` + +``` +URI: /api/v1/outputs +Method: GET, POST +Args: + addrs: address list, joined with "," + hashes: hash list, joined with "," +``` + +Addrs and hashes cannot be combined. + +In the response, `"head_outputs"` are outputs in the current unspent output set, +`"outgoing_outputs"` are head outputs that are being spent by an unconfirmed transaction, +and `"incoming_outputs"` are outputs that will be created by an unconfirmed transaction. + +The current head block header is returned as `"head"`. + +The `POST` method can be used if many addresses or hashes need to be queried. + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/outputs?addrs=6dkVxyKFbFKg9Vdg6HPg1UANLByYRqkrdY +``` + +or + +```sh +curl http://127.0.0.1:6420/api/v1/outputs?hashes=7669ff7350d2c70a88093431a7b30d3e69dda2319dcb048aa80fa0d19e12ebe0 +``` + +Result: + +```json +{ + "head": { + "seq": 58891, + "block_hash": "d9ca9442febd8788de0a3093158943beca228017bf8c9c9b8529a382fad8d991", + "previous_block_hash": "098ea5c6e12370c38529ef7c7c38779f83d05f707affb747022eee77332ba510", + "timestamp": 1537580414, + "fee": 2165, + "version": 0, + "tx_body_hash": "c488835c85ccb153a6d42b39aaae01c3e30d16de33de282f4b3f6fa1ccf6f7eb", + "ux_hash": "f7d30ecb49f132283862ad58f691e8747894c9fc241cb3a864fc15bd3e2c83d3" + }, + "head_outputs": [ + { + "hash": "7669ff7350d2c70a88093431a7b30d3e69dda2319dcb048aa80fa0d19e12ebe0", + "block_seq": 22, + "time": 1494275011, + "src_tx": "b51e1933f286c4f03d73e8966186bafb25f64053db8514327291e690ae8aafa5", + "address": "6dkVxyKFbFKg9Vdg6HPg1UANLByYRqkrdY", + "coins": "2.000000", + "hours": 633, + "calculated_hours": 10023 + }, + ], + "outgoing_outputs": [], + "incoming_outputs": [] +} +``` + +### Verify an address + +API sets: `READ` + +``` +URI: /api/v2/address/verify +Method: POST +Content-Type: application/json +Args: {"address": "
"} +``` + +Parses and validates a Skycoin address. Returns the address version in the response. + +Error responses: + +* `400 Bad Request`: The request body is not valid JSON or the address is missing from the request body +* `422 Unprocessable Entity`: The address is invalid + +Example for a valid address: + +```sh +curl -X POST http://127.0.0.1:6420/api/v2/address/verify \ + -H 'Content-Type: application/json' \ + -d '{"address":"2HTnQe3ZupkG6k8S81brNC3JycGV2Em71F2"}' +``` + +Result: + +```json +{ + "data": { + "version": 0, + } +} +``` + +Example for an invalid address: + +```sh +curl -X POST http://127.0.0.1:6420/api/v2/address/verify \ + -H 'Content-Type: application/json' \ + -d '{"address":"2aTnQe3ZupkG6k8S81brNC3JycGV2Em71F2"}' +``` + +Result: + +```json +{ + "error": { + "message": "Invalid checksum", + "code": 422 + } +} +``` + +## Wallet APIs + +### Get wallet + +API sets: `WALLET` + +``` +URI: /api/v1/wallet +Method: GET +Args: + id: Wallet ID [required] +``` + +Example ("deterministic" wallet): + +```sh +curl http://127.0.0.1:6420/api/v1/wallet?id=2017_11_25_e5fb.wlt +``` + +Result: + +```json +{ + "meta": { + "coin": "skycoin", + "filename": "2017_11_25_e5fb.wlt", + "label": "test", + "type": "deterministic", + "version": "0.2", + "crypto_type": "", + "timestamp": 1511640884, + "encrypted": false + }, + "entries": [ + { + "address": "2HTnQe3ZupkG6k8S81brNC3JycGV2Em71F2", + "public_key": "0316ff74a8004adf9c71fa99808ee34c3505ee73c5cf82aa301d17817da3ca33b1" + }, + { + "address": "SMnCGfpt7zVXm8BkRSFMLeMRA6LUu3Ewne", + "public_key": "02539528248a1a2c4f0b73233491103ca83b40249dac3ae9eee9a10b9f9debd9a3" + } + ] +} +``` + +Example ("bip44" wallet): + +```sh +curl http://127.0.0.1:6420/api/v1/wallet?id=2017_11_25_e5fb.wlt +``` + +Result: + +```json +{ + "meta": { + "coin": "skycoin", + "filename": "2017_11_25_e5fb.wlt", + "label": "test", + "type": "bip44", + "version": "0.3", + "crypto_type": "", + "timestamp": 1511640884, + "encrypted": false, + "bip44_coin": 8000, + }, + "entries": [ + { + "address": "2HTnQe3ZupkG6k8S81brNC3JycGV2Em71F2", + "public_key": "0316ff74a8004adf9c71fa99808ee34c3505ee73c5cf82aa301d17817da3ca33b1", + "child_number": 0, + "change": 0 + }, + { + "address": "SMnCGfpt7zVXm8BkRSFMLeMRA6LUu3Ewne", + "public_key": "02539528248a1a2c4f0b73233491103ca83b40249dac3ae9eee9a10b9f9debd9a3", + "child_number": 1, + "change": 0 + }, + { + "address": "8C5icxR9zdkYTZZTVV3cCX7QoK4EkLuK4p", + "public_key": "0316ff74a8004adf9c71fa99808ee34c3505ee73c5cf82aa301d17817da3ca33b1", + "child_number": 0, + "change": 1 + } + ] +} +``` + + +### Get unconfirmed transactions of a wallet + +API sets: `WALLET` + +``` +URI: /api/v1/wallet/transactions +Method: GET +Args: + id: Wallet ID + verbose: [bool] include verbose transaction input data +``` + +Returns all unconfirmed transactions for all addresses in a given wallet + +If verbose, the transaction inputs include the owner address, coins, hours and calculated hours. +The hours are the original hours the output was created with. +The calculated hours are based upon the current system time, and are approximately +equal to the hours the output would have if it become confirmed immediately. + + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/wallet/transactions?id=2017_11_25_e5fb.wlt +``` + +Result: + +```json +{ + "transactions": [ + { + "transaction": { + "length": 317, + "type": 0, + "txid": "76ecbabc53ea2a3be46983058433dda6a3cf7ea0b86ba14d90b932fa97385de7", + "inner_hash": "5d55837bb0cbda9c9323ff9aafd7c3d31d0d38638346172fbe2d9078ebaa892a", + "sigs": [ + "464b7724302178c1cfeacadaaf3556a3b7e5259adf51919476c3acc695747ed244b5ce2187ce7bedb6ad65c71f7f7ff3fa6805e64fe5da3aaa00ad563c7424f600", + "1155537b0391d4a6ee5eac07dee5798e953dca3a7c30643403dd2d326582c7d35080a16dc22644782ce1087bfc3bd06c2bf68e9a98e3989d90831646a9be2c9101" + ], + "inputs": [ + "782a8662efb0e933cab7d3ae9429ab53c4208cf44d8cdc07c2fbd7204b6b5cad", + "2f6b61a44086588c4eaa56a5dd9f1e0be2528861a6731608fcec38891b95db91" + ], + "outputs": [ + { + "uxid": "bd302ef776efa8548183b89f21e90649f21b90fe2d2e90ecc1b880f2d995f226", + "dst": "2UXZTg4ZHF6715b6tRhtaqceuQQ3G79GiZg", + "coins": "998.000000", + "hours": 247538 + }, + { + "uxid": "31058b6bfb30bfd441aec00929e75782bce47c8a75787ba519dbb268f89d2c4b", + "dst": "2awsJ2CR5H6QXCF2hwDjcvcAH9SgyfxCxgz", + "coins": "1.000000", + "hours": 247538 + } + ] + }, + "received": "2018-03-16T18:03:57.139109904+05:30", + "checked": "2018-03-16T18:03:57.139109904+05:30", + "announced": "0001-01-01T00:00:00Z", + "is_valid": true + } + ] +} +``` + +Example (verbose): + +```sh +curl http://127.0.0.1:6420/api/v1/wallet/transactions?id=2017_11_25_e5fb.wlt&verbose=1 +``` + +Result: + +```json +{ + "transactions": [ + { + "transaction": { + "length": 317, + "type": 0, + "txid": "76ecbabc53ea2a3be46983058433dda6a3cf7ea0b86ba14d90b932fa97385de7", + "inner_hash": "5d55837bb0cbda9c9323ff9aafd7c3d31d0d38638346172fbe2d9078ebaa892a", + "sigs": [ + "464b7724302178c1cfeacadaaf3556a3b7e5259adf51919476c3acc695747ed244b5ce2187ce7bedb6ad65c71f7f7ff3fa6805e64fe5da3aaa00ad563c7424f600", + "1155537b0391d4a6ee5eac07dee5798e953dca3a7c30643403dd2d326582c7d35080a16dc22644782ce1087bfc3bd06c2bf68e9a98e3989d90831646a9be2c9101" + ], + "fee": 495076, + "inputs": [ + { + "uxid": "782a8662efb0e933cab7d3ae9429ab53c4208cf44d8cdc07c2fbd7204b6b5cad", + "owner": "8C5icxR9zdkYTZZTVV3cCX7QoK4EkLuK4p", + "coins": "997.000000", + "hours": 880000, + "calculated_hours": 990000 + }, + { + "uxid": "2f6b61a44086588c4eaa56a5dd9f1e0be2528861a6731608fcec38891b95db91", + "owner": "23A1EWMZopUFLCwtXMe2CU9xTCbi5Gth643", + "coins": "2.000000", + "hours": 10, + "calculated_hours": 152 + } + ], + "outputs": [ + { + "uxid": "bd302ef776efa8548183b89f21e90649f21b90fe2d2e90ecc1b880f2d995f226", + "dst": "2UXZTg4ZHF6715b6tRhtaqceuQQ3G79GiZg", + "coins": "998.000000", + "hours": 247538 + }, + { + "uxid": "31058b6bfb30bfd441aec00929e75782bce47c8a75787ba519dbb268f89d2c4b", + "dst": "2awsJ2CR5H6QXCF2hwDjcvcAH9SgyfxCxgz", + "coins": "1.000000", + "hours": 247538 + } + ] + }, + "received": "2018-03-16T18:03:57.139109904+05:30", + "checked": "2018-03-16T18:03:57.139109904+05:30", + "announced": "0001-01-01T00:00:00Z", + "is_valid": true + } + ] +} +``` + +### Get wallets + +API sets: `WALLET` + +``` +URI: /api/v1/wallets +Method: GET +``` + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/wallets +``` + +Result: + +```json +[ + { + "meta": { + "coin": "skycoin", + "filename": "2017_11_25_e5fb.wlt", + "label": "test", + "type": "deterministic", + "version": "0.2", + "crypto_type": "", + "timestamp": 1511640884, + "encrypted": false + }, + "entries": [ + { + "address": "8C5icxR9zdkYTZZTVV3cCX7QoK4EkLuK4p", + "public_key": "0316ff74a8004adf9c71fa99808ee34c3505ee73c5cf82aa301d17817da3ca33b1" + }, + { + "address": "23A1EWMZopUFLCwtXMe2CU9xTCbi5Gth643", + "public_key": "02539528248a1a2c4f0b73233491103ca83b40249dac3ae9eee9a10b9f9debd9a3" + } + ] + } +] +``` + +### Get wallet folder name + +API sets: `WALLET` + +``` +URI: /api/v1/wallets/folderName +Method: GET +``` + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/wallets/folderName +``` + +Result: + +```json +{ + "address": "/Users/user/.skycoin/wallets" +} +``` + +### Generate wallet seed + +API sets: `WALLET` + +``` +URI: /api/v1/wallet/newSeed +Method: GET +Args: + entropy: seed entropy [optional] + can either be 128 or 256; 128 = 12 word seed, 256 = 24 word seed + default: 128 +``` + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/wallet/newSeed +``` + +Result: + +```json +{ + "seed": "helmet van actor peanut differ icon trial glare member cancel marble rack" +} +``` + +### Verify wallet Seed + +API sets: `WALLET` + +``` +URI: /api/v2/wallet/seed/verify +Method: POST +Args: + seed: seed to be verified +``` + +Example: + +```sh +curl -X POST http://127.0.0.1:6420/api/v2/wallet/seed/verify \ + -H 'Content-type: application/json' \ + -d '{ "seed": "nut wife logic sample addict shop before tobacco crisp bleak lawsuit affair" }' +``` + +Result: + +```json +{ + "data": {} +} +``` + +Example (wrong bip39 seed): + +```sh +curl -X POST http://127.0.0.1:6420/api/v2/wallet/seed/verify \ + -H 'Content-type: application/json' \ + -d '{ "seed": "wrong seed" }' +``` + +Result: + +```json +{ + "error": { + "message": "Mnemonic must have 12, 15, 18, 21 or 24 words", + "code": 422 + } +} +``` + +### Create wallet + +API sets: `WALLET` + +``` +URI: /api/v1/wallet/create +Method: POST +Args: + seed: wallet seed [required] + seed-passphrase: wallet seed passphrase [optional, bip44 type wallet only] + type: wallet type [required, one of "deterministic", "bip44" or "xpub"] + bip44-coin: BIP44 coin type [optional, defaults to 8000 (skycoin's coin type), only valid if type is "bip44"] + xpub: xpub key [required for xpub wallets] + label: wallet label [required] + scan: the number of addresses to scan ahead for balances [optional, must be > 0] + encrypt: encrypt wallet [optional, bool value] + password: wallet password [optional, must be provided if encrypt is true] +``` + +Example (deterministic): + +```sh +curl -X POST http://127.0.0.1:6420/api/v1/wallet/create \ + -H 'Content-Type: application/x-www-form-urlencoded' \ + -d 'seed=$seed' \ + -d 'type=deterministic' \ + -d 'label=$label' \ + -d 'scan=5' \ + -d 'password=$password' +``` + +Result: + +```json +{ + "meta": { + "coin": "skycoin", + "filename": "2017_05_09_d554.wlt", + "label": "test", + "type": "deterministic", + "version": "0.3", + "crypto_type": "", + "timestamp": 1511640884, + "encrypted": false + }, + "entries": [ + { + "address": "y2JeYS4RS8L9GYM7UKdjLRyZanKHXumFoH", + "public_key": "0316ff74a8004adf9c71fa99808ee34c3505ee73c5cf82aa301d17817da3ca33b1" + } + ] +} +``` + +Example (bip44): + +```sh +curl -X POST http://127.0.0.1:6420/api/v1/wallet/create \ + -H 'Content-Type: application/x-www-form-urlencoded' \ + -d 'seed=$seed' \ + -d 'seed-passphrase=$seed' \ + -d 'type=bip44' \ + -d 'label=$label' \ + -d 'scan=5' \ + -d 'password=$password' +``` + +Result: + +```json +{ + "meta": { + "coin": "skycoin", + "filename": "2017_05_09_d554.wlt", + "label": "test", + "type": "bip44", + "version": "0.3", + "crypto_type": "scrypt-chacha20poly1305", + "timestamp": 1511640884, + "encrypted": true, + "bip44_coin": 8000, + }, + "entries": [ + { + "address": "y2JeYS4RS8L9GYM7UKdjLRyZanKHXumFoH", + "public_key": "0316ff74a8004adf9c71fa99808ee34c3505ee73c5cf82aa301d17817da3ca33b1", + "child_number": 0, + "change": 0 + } + ] +} +``` + +Example (xpub): + +```sh +curl -X POST http://127.0.0.1:6420/api/v1/wallet/create \ + -H 'Content-Type: application/x-www-form-urlencoded' \ + -d 'type=xpub' \ + -d 'xpub=xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8' \ + -d 'label=$label' \ + -d 'scan=5' +``` + +Result: + +```json +{ + "meta": { + "coin": "skycoin", + "filename": "2017_05_09_d554.wlt", + "label": "test", + "type": "bip44", + "version": "0.4", + "crypto_type": "", + "timestamp": 1511640884, + "encrypted": false, + "xpub": "xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8" + }, + "entries": [ + { + "address": "y2JeYS4RS8L9GYM7UKdjLRyZanKHXumFoH", + "public_key": "0316ff74a8004adf9c71fa99808ee34c3505ee73c5cf82aa301d17817da3ca33b1", + "child_number": 0 + } + ] +} +``` + +### Generate new address in wallet + +API sets: `WALLET` + +``` +URI: /api/v1/wallet/newAddress +Method: POST +Args: + id: wallet file name + num: the number you want to generate + password: wallet password +``` + +For `bip44` type wallets, the new addresses will be generated on the `external` chain (`change=0`). + +Example: + +```sh +curl -X POST http://127.0.0.1:6420/api/v1/wallet/newAddress \ + -H 'Content-Type: x-www-form-urlencoded' \ + -d 'id=2017_05_09_d554.wlt' \ + -d 'num=2' \ + -d 'password=$password' +``` + +Result: + +```json +{ + "addresses": [ + "TDdQmMgbEVTwLe8EAiH2AoRc4SjoEFKrHB" + ] +} +``` + +### Change wallet label + +API sets: `WALLET` + +``` +URI: /api/v1/wallet/update +Method: POST +Args: + id: wallet file name + label: wallet label +``` + +Example: + +```sh +curl -X POST http://127.0.0.1:6420/api/v1/wallet/update \ + -H 'Content-Type: application/x-www-form-urlencoded' \ + -d 'id=$id' \ + -d 'label=$label' +``` + +Result: + +```json +"success" +``` + +### Get wallet balance + +API sets: `WALLET` + +``` +URI: /api/v1/wallet/balance +Method: GET +Args: + id: wallet file name +``` + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/wallet/balance?id=2018_03_07_3088.wlt +``` + +Result: + +```json +{ + "confirmed": { + "coins": 210400000, + "hours": 1873147 + }, + "predicted": { + "coins": 210400000, + "hours": 1873147 + }, + "addresses": { + "AXrFisGovRhRHipsbGahs4u2hXX7pDRT5p": { + "confirmed": { + "coins": 1250000, + "hours": 941185 + }, + "predicted": { + "coins": 1250000, + "hours": 941185 + } + }, + "AtNorKBpCgkSRL7zES7aAQyNjqjqPp2QJU": { + "confirmed": { + "coins": 1150000, + "hours": 61534 + }, + "predicted": { + "coins": 1150000, + "hours": 61534 + } + }, + "VUv9ehMZWmDvwWV36BQ3eL1ujb4MQ5TGyK": { + "confirmed": { + "coins": 208000000, + "hours": 870428 + }, + "predicted": { + "coins": 208000000, + "hours": 870428 + } + }, + "j4mbF1fTe8jgXbrRARZSBjDpD1hMGSe1E4": { + "confirmed": { + "coins": 0, + "hours": 0 + }, + "predicted": { + "coins": 0, + "hours": 0 + } + }, + "uyqBPcRCWucHXs18e9VZyNEeuNsD5tFDhy": { + "confirmed": { + "coins": 0, + "hours": 0 + }, + "predicted": { + "coins": 0, + "hours": 0 + } + } + } +} +``` + +### Create transaction + +API sets: `WALLET` + +``` +URI: /api/v1/wallet/transaction +Method: POST +Content-Type: application/json +Args: JSON body, see examples +``` + +Creates a transaction, returning the transaction preview and the encoded, serialized transaction. +The `encoded_transaction` can be provided to `POST /api/v1/injectTransaction` to broadcast it to the network +if the transaction is fully signed. + +The request body includes: + +* An optional change address +* A wallet to spend from with the optional ability to restrict which addresses or which unspent outputs in the wallet to use +* A list of destinations with address and coins specified, as well as optionally specifying hours +* A configuration for how destination hours are distributed, either manual or automatic +* Additional options + +`change_address` is optional. If not provided and the wallet is a `deterministic` type +wallet, then the change address will default to an address from one of the +unspent outputs being spent as a transaction input. If the wallet is a `bip44` type +wallet, then a new, unused change address will be created. + +Example request body with manual hours selection type, unencrypted wallet and all wallet addresses may spend: + +```json +{ + "hours_selection": { + "type": "manual" + }, + "wallet_id": "foo.wlt", + "change_address": "nu7eSpT6hr5P21uzw7bnbxm83B6ywSjHdq", + "to": [{ + "address": "fznGedkc87a8SsW94dBowEv6J7zLGAjT17", + "coins": "1.032", + "hours": "7" + }, { + "address": "7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD", + "coins": "99.2", + "hours": "0" + }], + "unsigned": false, + "ignore_unconfirmed": false +} +``` + +Example request body with auto hours selection type, encrypted wallet, specified spending addresses: + +```json +{ + "hours_selection": { + "type": "auto", + "mode": "share", + "share_factor": "0.5" + }, + "wallet_id": "foo.wlt", + "password": "foobar", + "addresses": ["2iVtHS5ye99Km5PonsB42No3pQRGEURmxyc"], + "change_address": "nu7eSpT6hr5P21uzw7bnbxm83B6ywSjHdq", + "to": [{ + "address": "fznGedkc87a8SsW94dBowEv6J7zLGAjT17", + "coins": "1.032" + }, { + "address": "7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD", + "coins": "99.2" + }], + "unsigned": false, + "ignore_unconfirmed": false +} +``` + +Example request body with manual hours selection type, unencrypted wallet and spending specific unspent outputs: + +```json +{ + "hours_selection": { + "type": "manual" + }, + "wallet_id": "foo.wlt", + "unspents": ["519c069a0593e179f226e87b528f60aea72826ec7f99d51279dd8854889ed7e2", "4e4e41996297511a40e2ef0046bd6b7118a8362c1f4f09a288c5c3ea2f4dfb85"], + "change_address": "nu7eSpT6hr5P21uzw7bnbxm83B6ywSjHdq", + "to": [{ + "address": "fznGedkc87a8SsW94dBowEv6J7zLGAjT17", + "coins": "1.032", + "hours": "7" + }, { + "address": "7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD", + "coins": "99.2", + "hours": "0" + }], + "unsigned": false, + "ignore_unconfirmed": false +} +``` + + +The `hours_selection` field has two types: `manual` or `auto`. + +If `manual`, all destination hours must be specified. + +If `auto`, the `mode` field must be set. The only valid value for `mode` is `"share"`. +For the `"share"` mode, `share_factor` must also be set. This must be a decimal value greater than or equal to 0 and less than or equal to 1. +In the auto share mode, the remaining hours after the fee are shared between the destination addresses as a whole, +and the change address. Amongst the destination addresses, the shared hours are distributed proportionally. + +When using the `auto` `"share"` `mode`, if there are remaining coin hours as change, +but no coins are available as change from the wallet (which are needed to retain the coin hours as change), +the `share_factor` will switch to `1.0` so that extra coin hours are distributed to the outputs +instead of being burned as an additional fee. +For the `manual` mode, if there are leftover coin hours but no coins to make change with, +the leftover coin hours will be burned in addition to the required fee. + +All objects in `to` must be unique; a single transaction cannot create multiple outputs with the same `address`, `coins` and `hours`. + +For example, this is a valid value for `to`, if `hours_selection.type` is `"manual"`: + +```json +[{ + "address": "fznGedkc87a8SsW94dBowEv6J7zLGAjT17", + "coins": "1.2", + "hours": "1" +}, { + "address": "fznGedkc87a8SsW94dBowEv6J7zLGAjT17", + "coins": "1.2", + "hours": "2" +}] +``` + +But this is an invalid value for `to`, if `hours_selection.type` is `"manual"`: + +```json +[{ + "address": "fznGedkc87a8SsW94dBowEv6J7zLGAjT17", + "coins": "1.2", + "hours": "1" +}, { + "address": "fznGedkc87a8SsW94dBowEv6J7zLGAjT17", + "coins": "1.2", + "hours": "1" +}] +``` + +And this is a valid value for `to`, if `hours_selection.type` is `"auto"`: + +```json +[{ + "address": "fznGedkc87a8SsW94dBowEv6J7zLGAjT17", + "coins": "1.2" +}, { + "address": "fznGedkc87a8SsW94dBowEv6J7zLGAjT17", + "coins": "1.201" +}] +``` + +But this is an invalid value for `to`, if `hours_selection.type` is `"auto"`: + +```json +[{ + "address": "fznGedkc87a8SsW94dBowEv6J7zLGAjT17", + "coins": "1.2" +}, { + "address": "fznGedkc87a8SsW94dBowEv6J7zLGAjT17", + "coins": "1.2" +}] +``` + +To control which addresses to spend from, specify `addresses`. +A subset of the unspent outputs associated with these addresses will be chosen for spending, +based upon an internal selection algorithm. + +To control which unspent outputs to spend from, specify `unspents`. +A subset of these unspent outputs will be chosen for spending, +based upon an internal selection algorithm. + +`addresses` and `unspents` cannot be combined. + +If neither `addresses` nor `unspents` are specified, +then all outputs associated with all addresses in the wallet may be chosen from to spend with. + +`change_address` is optional. +If set, it is not required to be an address in the wallet. +If not set, it will default to one of the addresses associated with the unspent outputs being spent in the transaction. + +`ignore_unconfirmed` is optional and defaults to `false`. +When `false`, the API will return an error if any of the unspent outputs +associated with the wallet addresses or the wallet outputs appear as spent in +a transaction in the unconfirmed transaction pool. +When `true`, the API will ignore unspent outputs that appear as spent in +a transaction in the unconfirmed transaction pool when building the transaction, +but not return an error. + +`unsigned` is optional and defaults to `false`. +When `true`, the transaction will not be signed by the wallet. +An unsigned transaction will be returned. +The `"txid"` value of the `"transaction"` object will need to be updated +after signing the transaction. +The unsigned `encoded_transaction` can be sent to `POST /api/v2/wallet/transaction/sign` for signing. + +Example: + +```sh +curl -X POST http://127.0.0.1:6420/api/v1/wallet/transaction -H 'content-type: application/json' -d '{ + "hours_selection": { + "type": "auto", + "mode": "share", + "share_factor": "0.5" + }, + "wallet_id": "foo.wlt", + "change_address": "uvcDrKc8rHTjxLrU4mPN56Hyh2tR6RvCvw", + "to": [{ + "address": "2Huip6Eizrq1uWYqfQEh4ymibLysJmXnWXS", + "coins": "1" + }, { + "address": "2Huip6Eizrq1uWYqfQEh4ymibLysJmXnWXS", + "coins": "8.99" + }] +}' +``` + +Result: + +```json +{ + "transaction": { + "length": 257, + "type": 0, + "txid": "5f060918d2da468a784ff440fbba80674c829caca355a27ae067f465d0a5e43e", + "inner_hash": "97dd062820314c46da0fc18c8c6c10bfab1d5da80c30adc79bbe72e90bfab11d", + "fee": "437691", + "sigs": [ + "6120acebfa61ba4d3970dec5665c3c952374f5d9bbf327674a0b240de62b202b319f61182e2a262b2ca5ef5a592084299504689db5448cd64c04b1f26eb01d9100" + ], + "inputs": [ + { + "uxid": "7068bfd0f0f914ea3682d0e5cb3231b75cb9f0776bf9013d79b998d96c93ce2b", + "address": "g4XmbmVyDnkswsQTSqYRsyoh1YqydDX1wp", + "coins": "10.000000", + "hours": "853667", + "calculated_hours": "862290", + "timestamp": 1524242826, + "block": 23575, + "txid": "ccfbb51e94cb58a619a82502bc986fb028f632df299ce189c2ff2932574a03e7" + } + ], + "outputs": [ + { + "uxid": "519c069a0593e179f226e87b528f60aea72826ec7f99d51279dd8854889ed7e2", + "address": "2Huip6Eizrq1uWYqfQEh4ymibLysJmXnWXS", + "coins": "1.000000", + "hours": "22253" + }, + { + "uxid": "4e4e41996297511a40e2ef0046bd6b7118a8362c1f4f09a288c5c3ea2f4dfb85", + "address": "2Huip6Eizrq1uWYqfQEh4ymibLysJmXnWXS", + "coins": "8.990000", + "hours": "200046" + }, + { + "uxid": "fdeb3f77408f39e50a8e3b6803ce2347aac2eba8118c494424f9fa4959bab507", + "address": "uvcDrKc8rHTjxLrU4mPN56Hyh2tR6RvCvw", + "coins": "0.010000", + "hours": "222300" + } + ] + }, + "encoded_transaction": "010100000097dd062820314c46da0fc18c8c6c10bfab1d5da80c30adc79bbe72e90bfab11d010000006120acebfa61ba4d3970dec5665c3c952374f5d9bbf327674a0b240de62b202b319f61182e2a262b2ca5ef5a592084299504689db5448cd64c04b1f26eb01d9100010000007068bfd0f0f914ea3682d0e5cb3231b75cb9f0776bf9013d79b998d96c93ce2b0300000000ba2a4ac4a5ce4e03a82d2240ae3661419f7081b140420f0000000000ed5600000000000000ba2a4ac4a5ce4e03a82d2240ae3661419f7081b1302d8900000000006e0d0300000000000083874350e65e84aa6e06192408951d7aaac7809e10270000000000005c64030000000000" +} +``` + + +### Sign transaction + +API sets: `WALLET` + +``` +URI: /api/v2/wallet/transaction/sign +Method: POST +Content-Type: application/json +Args: JSON body, see examples +``` + +Signs an unsigned transaction, returning the transaction with updated signatures and the encoded, serialized transaction. +The transaction must spendable to be signed. If the inputs of the transaction are not in the unspent pool, signing fails. + +Specific transaction inputs may be signed by specifying `sign_indexes`, otherwise all transaction inputs will be signed. +`sign_indexes` is an array of positional indexes for the transaction's signature array. Indexes start at 0. + +Signing an input that is already signed in the transaction is an error. + +The `encoded_transaction` can be provided to `POST /api/v1/injectTransaction` to broadcast it to the network, if the transaction is fully signed. + +Example: + +```sh +curl -X POST http://127.0.0.1:6420/api/v2/wallet/transaction/sign -H 'content-type: application/json' -d '{ + "wallet_id": "foo.wlt", + "password": "password", + "encoded_transaction": "010100000097dd062820314c46da0fc18c8c6c10bfab1d5da80c30adc79bbe72e90bfab11d010000006120acebfa61ba4d3970dec5665c3c952374f5d9bbf327674a0b240de62b202b319f61182e2a262b2ca5ef5a592084299504689db5448cd64c04b1f26eb01d9100010000007068bfd0f0f914ea3682d0e5cb3231b75cb9f0776bf9013d79b998d96c93ce2b0300000000ba2a4ac4a5ce4e03a82d2240ae3661419f7081b140420f0000000000ed5600000000000000ba2a4ac4a5ce4e03a82d2240ae3661419f7081b1302d8900000000006e0d0300000000000083874350e65e84aa6e06192408951d7aaac7809e10270000000000005c64030000000000" +}' +``` + +Example with `sign_indexes`: + +```sh +curl -X POST http://127.0.0.1:6420/api/v2/wallet/transaction/sign -H 'content-type: application/json' -d '{ + "wallet_id": "foo.wlt", + "password": "password", + "sign_indexes": [1, 2], + "encoded_transaction": "010100000097dd062820314c46da0fc18c8c6c10bfab1d5da80c30adc79bbe72e90bfab11d010000006120acebfa61ba4d3970dec5665c3c952374f5d9bbf327674a0b240de62b202b319f61182e2a262b2ca5ef5a592084299504689db5448cd64c04b1f26eb01d9100010000007068bfd0f0f914ea3682d0e5cb3231b75cb9f0776bf9013d79b998d96c93ce2b0300000000ba2a4ac4a5ce4e03a82d2240ae3661419f7081b140420f0000000000ed5600000000000000ba2a4ac4a5ce4e03a82d2240ae3661419f7081b1302d8900000000006e0d0300000000000083874350e65e84aa6e06192408951d7aaac7809e10270000000000005c64030000000000" +}' +``` + +Result: + +```json +{ + "data": { + "transaction": { + "length": 257, + "type": 0, + "txid": "5f060918d2da468a784ff440fbba80674c829caca355a27ae067f465d0a5e43e", + "inner_hash": "97dd062820314c46da0fc18c8c6c10bfab1d5da80c30adc79bbe72e90bfab11d", + "fee": "437691", + "sigs": [ + "6120acebfa61ba4d3970dec5665c3c952374f5d9bbf327674a0b240de62b202b319f61182e2a262b2ca5ef5a592084299504689db5448cd64c04b1f26eb01d9100" + ], + "inputs": [ + { + "uxid": "7068bfd0f0f914ea3682d0e5cb3231b75cb9f0776bf9013d79b998d96c93ce2b", + "address": "g4XmbmVyDnkswsQTSqYRsyoh1YqydDX1wp", + "coins": "10.000000", + "hours": "853667", + "calculated_hours": "862290", + "timestamp": 1524242826, + "block": 23575, + "txid": "ccfbb51e94cb58a619a82502bc986fb028f632df299ce189c2ff2932574a03e7" + } + ], + "outputs": [ + { + "uxid": "519c069a0593e179f226e87b528f60aea72826ec7f99d51279dd8854889ed7e2", + "address": "2Huip6Eizrq1uWYqfQEh4ymibLysJmXnWXS", + "coins": "1.000000", + "hours": "22253" + }, + { + "uxid": "4e4e41996297511a40e2ef0046bd6b7118a8362c1f4f09a288c5c3ea2f4dfb85", + "address": "2Huip6Eizrq1uWYqfQEh4ymibLysJmXnWXS", + "coins": "8.990000", + "hours": "200046" + }, + { + "uxid": "fdeb3f77408f39e50a8e3b6803ce2347aac2eba8118c494424f9fa4959bab507", + "address": "uvcDrKc8rHTjxLrU4mPN56Hyh2tR6RvCvw", + "coins": "0.010000", + "hours": "222300" + } + ] + }, + "encoded_transaction": "010100000097dd062820314c46da0fc18c8c6c10bfab1d5da80c30adc79bbe72e90bfab11d010000006120acebfa61ba4d3970dec5665c3c952374f5d9bbf327674a0b240de62b202b319f61182e2a262b2ca5ef5a592084299504689db5448cd64c04b1f26eb01d9100010000007068bfd0f0f914ea3682d0e5cb3231b75cb9f0776bf9013d79b998d96c93ce2b0300000000ba2a4ac4a5ce4e03a82d2240ae3661419f7081b140420f0000000000ed5600000000000000ba2a4ac4a5ce4e03a82d2240ae3661419f7081b1302d8900000000006e0d0300000000000083874350e65e84aa6e06192408951d7aaac7809e10270000000000005c64030000000000" + } +} +``` + + +### Unload wallet + +API sets: `WALLET` + +``` +URI: /api/v1/wallet/unload +Method: POST +Args: + id: wallet file name +``` + +Example: + +```sh +curl -X POST http://127.0.0.1:6420/api/v1/wallet/unload \ + -H 'Content-Type: x-www-form-urlencoded' \ + -d 'id=2017_05_09_d554.wlt' +``` + +### Encrypt wallet + +API sets: `WALLET` + +``` +URI: /api/v1/wallet/encrypt +Method: POST +Args: + id: wallet id + password: wallet password +``` + +Example: + +```sh +curl -X POST http://127.0.0.1:6420/api/v1/wallet/encrypt \ + -H 'Content-Type: application/x-www-form-urlencoded' \ + -d 'id=test.wlt' \ + -d 'password=$password' +``` + +Result: + +```json +{ + "meta": { + "coin": "skycoin", + "filename": "test.wlt", + "label": "test", + "type": "deterministic", + "version": "0.2", + "crypto_type": "scrypt-chacha20poly1305", + "timestamp": 1521083044, + "encrypted": true + }, + "entries": [ + { + "address": "fznGedkc87a8SsW94dBowEv6J7zLGAjT17", + "public_key": "0316ff74a8004adf9c71fa99808ee34c3505ee73c5cf82aa301d17817da3ca33b1" + } + ] +} +``` + +### Decrypt wallet + +API sets: `WALLET` + +``` +URI: /api/v1/wallet/decrypt +Method: POST +Args: + id: wallet id + password: wallet password +``` + +Example: + +```sh +curl -X POST http://127.0.0.1:6420/api/v1/wallet/decrypt \ + -H 'Content-Type: application/x-www-form-urlencoded' \ + -d 'id=test.wlt' \ + -d 'password=$password' +``` + +Result: + +```json +{ + "meta": { + "coin": "skycoin", + "filename": "test.wlt", + "label": "test", + "type": "deterministic", + "version": "0.2", + "crypto_type": "", + "timestamp": 1521083044, + "encrypted": false + }, + "entries": [ + { + "address": "fznGedkc87a8SsW94dBowEv6J7zLGAjT17", + "public_key": "032a1218cbafc8a93233f363c19c667cf02d42fa5a8a07c0d6feca79e82d72753d" + } + ] +} +``` + +### Get wallet seed + +API sets: `INSECURE_WALLET_SEED` + +``` +URI: /api/v1/wallet/seed +Method: POST +Args: + id: wallet id + password: wallet password +``` + +This endpoint only works for encrypted wallets. +If the wallet is unencrypted, the seed will not be returned. + +If the wallet is of type `bip44` and has a seed passphrase, it will be included +in the response. Otherwise, the seed passphrase will be missing. + +Example: + +```sh +curl -X POST http://127.0.0.1:6420/api/v1/wallet/seed \ + -H 'Content-type: application/x-www-form-urlencoded' \ + -d 'id=test.wlt' \ + -d 'password=$password' +``` + +Result: + +```json +{ + "seed": "your wallet seed", + "seed_passphrase": "your optional wallet seed-passphrase" +} +``` + +### Recover encrypted wallet by seed + +API sets: `INSECURE_WALLET_SEED` + +``` +URI: /api/v2/wallet/recover +Method: POST +Args: + id: wallet id + seed: wallet seed + seed passphrase: wallet seed passphrase (bip44 wallets only) + password: [optional] password to encrypt the recovered wallet with +``` + +Recovers an encrypted wallet by providing the wallet seed and optional seed passphrase. + +Example: + +```sh +curl -X POST http://127.0.0.1/api/v2/wallet/recover + -H 'Content-Type: application/json' \ + -d '{"id":"2017_11_25_e5fb.wlt","seed":"your wallet seed","seed_passphrase":"your seed passphrase"}' +``` + +Result: + +```json +{ + "data": { + "meta": { + "coin": "skycoin", + "filename": "2017_11_25_e5fb.wlt", + "label": "test", + "type": "deterministic", + "version": "0.2", + "crypto_type": "", + "timestamp": 1511640884, + "encrypted": false + }, + "entries": [ + { + "address": "2HTnQe3ZupkG6k8S81brNC3JycGV2Em71F2", + "public_key": "0316ff74a8004adf9c71fa99808ee34c3505ee73c5cf82aa301d17817da3ca33b1" + }, + { + "address": "SMnCGfpt7zVXm8BkRSFMLeMRA6LUu3Ewne", + "public_key": "02539528248a1a2c4f0b73233491103ca83b40249dac3ae9eee9a10b9f9debd9a3" + } + ] + } +} +``` + +## Key-value storage APIs + +Endpoints interact with the key-value storage. Each request require the `type` argument to +be passed. + +Currently allowed types: + +* `txid`: used for transaction notes +* `client`: used for generic client data, instead of using e.g. LocalStorage in the browser + +### Get all storage values + +API sets: `STORAGE` + +``` +Method: GET +URI: /api/v2/data +Args: + type: storage type + key [string]: key of the specific value to get +``` + +If key is passed, only the specific value will be returned from the storage. +Otherwise the whole dataset will be returned. + +If the key does not exist, a 404 error is returned. + +Example: + +```sh +curl http://127.0.0.1:6420/api/v2/data?type=txid +``` + +Result: + +```json +{ + "data": { + "key1": "value", + "key2": "{\"key\":\"value\"}", + } +} +``` + +Example (key): + +```sh +curl http://127.0.0.1:6420/api/v2/data?type=txid&key=key1 +``` + +Result: + +```json +{ + "data": "value" +} +``` + +### Add value to storage + +API sets: `STORAGE` + +``` +Method: POST +URI: /api/v2/data +Args: JSON Body, see examples +``` + +Sets one or more values by key. Existing values will be overwritten. + +Example request body: + +```json +{ + "type": "txid", + "key": "key1", + "val": "val1" +} +``` + +Example: + +```sh +curl -X POST http://127.0.0.1:6420/api/v2/data -H 'Content-Type: application/json' -d '{ + "type": "txid", + "key": "key1", + "val": "val1" +}' +``` + +Result: + +```json +{} +``` + +### Remove value from storage + +API sets: `STORAGE` + +``` +Method: DELETE +URI: /api/v2/data +Args: + type: storage type + key: key of the specific value to get +``` + +Deletes a value by key. Returns a 404 error if the key does not exist. + +Example: + +```sh +curl http://127.0.0.1:6420/api/v2/data?type=txid&key=key1 +``` + +Result: + +```json +{} +``` + +## Transaction APIs + +### Get unconfirmed transactions + +API sets: `READ` + +``` +URI: /api/v1/pendingTxs +Method: GET +Args: + verbose [bool] include verbose transaction input data +``` + +If verbose, the transaction inputs include the owner address, coins, hours and calculated hours. +The hours are the original hours the output was created with. +The calculated hours are calculated based upon the current system time, and provide an approximate +coin hour value of the output if it were to be confirmed at that instant. + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/pendingTxs +``` + +Result: + +```json +[ + { + "transaction": { + "length": 317, + "type": 0, + "txid": "89578005d8730fe1789288ee7dea036160a9bd43234fb673baa6abd91289a48b", + "inner_hash": "cac977eee019832245724aa643ceff451b9d8b24612b2f6a58177c79e8a4c26f", + "sigs": [ + "3f084a0c750731dd985d3137200f9b5fc3de06069e62edea0cdd3a91d88e56b95aff5104a3e797ab4d6d417861af0c343efb0fff2e5ba9e7cf88ab714e10f38101", + "e9a8aa8860d189daf0b1dbfd2a4cc309fc0c7250fa81113aa7258f9603d19727793c1b7533131605db64752aeb9c1f4465198bb1d8dd597213d6406a0a81ed3701" + ], + "inputs": [ + "bb89d4ed40d0e6e3a82c12e70b01a4bc240d2cd4f252cfac88235abe61bd3ad0", + "170d6fd7be1d722a1969cb3f7d45cdf4d978129c3433915dbaf098d4f075bbfc" + ], + "outputs": [ + { + "uxid": "ec9cf2f6052bab24ec57847c72cfb377c06958a9e04a077d07b6dd5bf23ec106", + "dst": "nu7eSpT6hr5P21uzw7bnbxm83B6ywSjHdq", + "coins": "60.000000", + "hours": 2458 + }, + { + "uxid": "be40210601829ba8653bac1d6ecc4049955d97fb490a48c310fd912280422bd9", + "dst": "2iVtHS5ye99Km5PonsB42No3pQRGEURmxyc", + "coins": "1.000000", + "hours": 2458 + } + ] + }, + "received": "2017-05-09T10:11:57.14303834+02:00", + "checked": "2017-05-09T10:19:58.801315452+02:00", + "announced": "0001-01-01T00:00:00Z", + "is_valid": true + } +] +``` + +Example (verbose): + +```sh +curl http://127.0.0.1:6420/api/v1/pendingTxs?verbose=1 +``` + +Result: + +```json +[ + { + "transaction": { + "length": 220, + "type": 0, + "txid": "d455564dcf1fb666c3846cf579ff33e21c203e2923938c6563fe7fcb8573ba44", + "inner_hash": "4e73155db8ed04a3bd2b953218efcc9122ebfbf4c55f08f50d1563e48eacf71d", + "fee": 12855964, + "sigs": [ + "17330c256a50e2117ddccf51f1980fc14380f0f9476432196ade3043668759847b97e1b209961458745684d9239541f79d9ca9255582864d30a540017ab84f2b01" + ], + "inputs": [ + { + "uxid": "27e7bc48ceca4d47e806a87100a8a98592b7618702e1cd479bf4c190462a6d09", + "owner": "23MjQipM9YsPKkYiuaBmf6m7fD54wrzHxpd", + "coins": "7815.000000", + "hours": 279089, + "calculated_hours": 13101146 + } + ], + "outputs": [ + { + "uxid": "4b4ebf62acbaece798d0dfc92fcea85768a2874dad8a9b8eb5454288deae468c", + "dst": "23MjQipM9YsPKkYiuaBmf6m7fD54wrzHxpd", + "coins": "586.000000", + "hours": 122591 + }, + { + "uxid": "781cfb134d5fdad48f3c937dfcfc66b169a305adc8abdfe92a0ec94c564913f2", + "dst": "2ehrG4VKLRuvBNWYz3U7tS75QWvzyWR89Dg", + "coins": "7229.000000", + "hours": 122591 + } + ] + }, + "received": "2018-06-20T14:14:52.415702671+08:00", + "checked": "2018-08-26T19:47:45.328131142+08:00", + "announced": "2018-08-26T19:51:47.356083569+08:00", + "is_valid": true + } +] +``` + +### Create transaction from unspent outputs or addresses + +API sets: `TXN` + +``` +URI: /api/v2/transaction +Method: POST +Args: JSON Body, see examples +``` + +Creates an unsigned transaction from a pool of unspent outputs or addresses. +`addresses` and `unspents` cannot be combined, and at least one must have elements in their array. + +The transaction will choose unspent outputs from the provided pool to construct a transaction +that satisfies the requested outputs in the `to` field. Not all unspent outputs will necessarily be used +in the transaction. + +If `ignore_unconfirmed` is true, the transaction will not use any outputs which are being spent by an unconfirmed transaction. +If `ignore_unconfirmed` is false, the endpoint returns an error if any unspent output is spent by an unconfirmed transaction. + +`change_address` is optional. If not provided then the change address will +default to an address from one of the +unspent outputs being spent as a transaction input. + +Refer to `POST /api/v1/wallet/transaction` for creating a transaction from a specific wallet. + +`POST /api/v2/wallet/transaction/sign` can be used to sign the transaction with a wallet, +but `POST /api/v1/wallet/transaction` can create and sign a transaction with a wallet in one operation instead. +Otherwise, sign the transaction separately from the API. + +The transaction must be fully valid and spendable (except for the lack of signatures) or else an error is returned. + +Example request body with manual hours selection type, spending from specific addresses, ignoring unconfirmed unspent outputs: + +```json +{ + "hours_selection": { + "type": "manual" + }, + "addresses": ["g4XmbmVyDnkswsQTSqYRsyoh1YqydDX1wp", "2Huip6Eizrq1uWYqfQEh4ymibLysJmXnWXS"], + "change_address": "nu7eSpT6hr5P21uzw7bnbxm83B6ywSjHdq", + "to": [{ + "address": "fznGedkc87a8SsW94dBowEv6J7zLGAjT17", + "coins": "1.032", + "hours": "7" + }, { + "address": "7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD", + "coins": "99.2", + "hours": "0" + }], + "ignore_unconfirmed": false +} +``` + +Example request body with auto hours selection type, spending specific uxouts: + +```json +{ + "hours_selection": { + "type": "auto", + "mode": "share", + "share_factor": "0.5" + }, + "unspents": ["519c069a0593e179f226e87b528f60aea72826ec7f99d51279dd8854889ed7e2", "4e4e41996297511a40e2ef0046bd6b7118a8362c1f4f09a288c5c3ea2f4dfb85"], + "change_address": "uvcDrKc8rHTjxLrU4mPN56Hyh2tR6RvCvw", + "to": [{ + "address": "2Huip6Eizrq1uWYqfQEh4ymibLysJmXnWXS", + "coins": "1" + }, { + "address": "2Huip6Eizrq1uWYqfQEh4ymibLysJmXnWXS", + "coins": "8.99" + }] +} +``` + +Example: + +```sh +curl -X POST http://127.0.0.1:6420/api/v2/transaction -H 'Content-Type: application/json' -d '{ + "hours_selection": { + "type": "auto", + "mode": "share", + "share_factor": "0.5" + }, + "addresses": ["g4XmbmVyDnkswsQTSqYRsyoh1YqydDX1wp"], + "change_address": "uvcDrKc8rHTjxLrU4mPN56Hyh2tR6RvCvw", + "to": [{ + "address": "2Huip6Eizrq1uWYqfQEh4ymibLysJmXnWXS", + "coins": "1" + }, { + "address": "2Huip6Eizrq1uWYqfQEh4ymibLysJmXnWXS", + "coins": "8.99" + }] +}' +``` + +Result: + +```json +{ + "data": { + "transaction": { + "length": 257, + "type": 0, + "txid": "5f060918d2da468a784ff440fbba80674c829caca355a27ae067f465d0a5e43e", + "inner_hash": "97dd062820314c46da0fc18c8c6c10bfab1d5da80c30adc79bbe72e90bfab11d", + "fee": "437691", + "sigs": [ + "6120acebfa61ba4d3970dec5665c3c952374f5d9bbf327674a0b240de62b202b319f61182e2a262b2ca5ef5a592084299504689db5448cd64c04b1f26eb01d9100" + ], + "inputs": [ + { + "uxid": "7068bfd0f0f914ea3682d0e5cb3231b75cb9f0776bf9013d79b998d96c93ce2b", + "address": "g4XmbmVyDnkswsQTSqYRsyoh1YqydDX1wp", + "coins": "10.000000", + "hours": "853667", + "calculated_hours": "862290", + "timestamp": 1524242826, + "block": 23575, + "txid": "ccfbb51e94cb58a619a82502bc986fb028f632df299ce189c2ff2932574a03e7" + } + ], + "outputs": [ + { + "uxid": "519c069a0593e179f226e87b528f60aea72826ec7f99d51279dd8854889ed7e2", + "address": "2Huip6Eizrq1uWYqfQEh4ymibLysJmXnWXS", + "coins": "1.000000", + "hours": "22253" + }, + { + "uxid": "4e4e41996297511a40e2ef0046bd6b7118a8362c1f4f09a288c5c3ea2f4dfb85", + "address": "2Huip6Eizrq1uWYqfQEh4ymibLysJmXnWXS", + "coins": "8.990000", + "hours": "200046" + }, + { + "uxid": "fdeb3f77408f39e50a8e3b6803ce2347aac2eba8118c494424f9fa4959bab507", + "address": "uvcDrKc8rHTjxLrU4mPN56Hyh2tR6RvCvw", + "coins": "0.010000", + "hours": "222300" + } + ] + }, + "encoded_transaction": "010100000097dd062820314c46da0fc18c8c6c10bfab1d5da80c30adc79bbe72e90bfab11d010000006120acebfa61ba4d3970dec5665c3c952374f5d9bbf327674a0b240de62b202b319f61182e2a262b2ca5ef5a592084299504689db5448cd64c04b1f26eb01d9100010000007068bfd0f0f914ea3682d0e5cb3231b75cb9f0776bf9013d79b998d96c93ce2b0300000000ba2a4ac4a5ce4e03a82d2240ae3661419f7081b140420f0000000000ed5600000000000000ba2a4ac4a5ce4e03a82d2240ae3661419f7081b1302d8900000000006e0d0300000000000083874350e65e84aa6e06192408951d7aaac7809e10270000000000005c64030000000000" + } +} +``` + +### Get transaction info by id + +API sets: `READ` + +``` +URI: /api/v1/transaction +Method: GET +Args: + txid: transaction id + verbose: [bool] include verbose transaction input data + encoded: [bool] return the transaction as hex-encoded serialized bytes +``` + +If verbose, the transaction inputs include the owner address, coins, hours and calculated hours. +The hours are the original hours the output was created with. +If the transaction is confirmed, the calculated hours are the hours the transaction had in the block in which it was executed.. +If the transaction is unconfirmed, the calculated hours are based upon the current system time, and are approximately +equal to the hours the output would have if it become confirmed immediately. + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/transaction?txid=a6446654829a4a844add9f181949d12f8291fdd2c0fcb22200361e90e814e2d3 +``` + +Result: + +```json +{ + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 1, + "block_seq": 1178 + }, + "txn": { + "length": 183, + "type": 0, + "txid": "a6446654829a4a844add9f181949d12f8291fdd2c0fcb22200361e90e814e2d3", + "inner_hash": "075f255d42ddd2fb228fe488b8b468526810db7a144aeed1fd091e3fd404626e", + "timestamp": 1494275231, + "sigs": [ + "9b6fae9a70a42464dda089c943fafbf7bae8b8402e6bf4e4077553206eebc2ed4f7630bb1bd92505131cca5bf8bd82a44477ef53058e1995411bdbf1f5dfad1f00" + ], + "inputs": [ + "5287f390628909dd8c25fad0feb37859c0c1ddcf90da0c040c837c89fefd9191" + ], + "outputs": [ + { + "uxid": "70fa9dfb887f9ef55beb4e960f60e4703c56f98201acecf2cad729f5d7e84690", + "dst": "7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD", + "coins": "8.000000", + "hours": 931 + } + ] + } +} +``` + +Example (verbose): + +```sh +curl http://127.0.0.1:6420/api/v1/transaction?txid=a6446654829a4a844add9f181949d12f8291fdd2c0fcb22200361e90e814e2d3&verbose=1 +``` + +Result: + +```json +{ + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 53107, + "block_seq": 1178 + }, + "time": 1494275231, + "txn": { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 53107, + "block_seq": 1178 + }, + "timestamp": 1494275231, + "length": 183, + "type": 0, + "txid": "a6446654829a4a844add9f181949d12f8291fdd2c0fcb22200361e90e814e2d3", + "inner_hash": "075f255d42ddd2fb228fe488b8b468526810db7a144aeed1fd091e3fd404626e", + "fee": 6523, + "sigs": [ + "9b6fae9a70a42464dda089c943fafbf7bae8b8402e6bf4e4077553206eebc2ed4f7630bb1bd92505131cca5bf8bd82a44477ef53058e1995411bdbf1f5dfad1f00" + ], + "inputs": [ + { + "uxid": "5287f390628909dd8c25fad0feb37859c0c1ddcf90da0c040c837c89fefd9191", + "owner": "2K6NuLBBapWndAssUtkxKfCtyjDQDHrEhhT", + "coins": "8.000000", + "hours": 7454, + "calculated_hours": 7454 + } + ], + "outputs": [ + { + "uxid": "70fa9dfb887f9ef55beb4e960f60e4703c56f98201acecf2cad729f5d7e84690", + "dst": "7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD", + "coins": "8.000000", + "hours": 931 + } + ] + } +} +``` + +Example (encoded): + +```sh +curl http://127.0.0.1:6420/api/v1/transaction?txid=a6446654829a4a844add9f181949d12f8291fdd2c0fcb22200361e90e814e2d3&encoded=1 +``` + +Result: + +```json +{ + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 53267, + "block_seq": 1178 + }, + "time": 1494275231, + "encoded_transaction": "b700000000075f255d42ddd2fb228fe488b8b468526810db7a144aeed1fd091e3fd404626e010000009b6fae9a70a42464dda089c943fafbf7bae8b8402e6bf4e4077553206eebc2ed4f7630bb1bd92505131cca5bf8bd82a44477ef53058e1995411bdbf1f5dfad1f00010000005287f390628909dd8c25fad0feb37859c0c1ddcf90da0c040c837c89fefd9191010000000010722f061aa262381dce35193d43eceb112373c300127a0000000000a303000000000000" +} +``` + +### Get raw transaction by id + +API sets: `READ` + +``` +URI: /api/v1/rawtx +Method: GET +``` + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/rawtx?txid=a6446654829a4a844add9f181949d12f8291fdd2c0fcb22200361e90e814e2d3 +``` + +Result: + +```json +"b700000000075f255d42ddd2fb228fe488b8b468526810db7a144aeed1fd091e3fd404626e010000009b6fae9a70a42464dda089c943fafbf7bae8b8402e6bf4e4077553206eebc2ed4f7630bb1bd92505131cca5bf8bd82a44477ef53058e1995411bdbf1f5dfad1f00010000005287f390628909dd8c25fad0feb37859c0c1ddcf90da0c040c837c89fefd9191010000000010722f061aa262381dce35193d43eceb112373c300127a0000000000a303000000000000" +``` + +### Inject raw transaction + +API sets: `TXN`, `WALLET` + +``` +URI: /api/v1/injectTransaction +Method: POST +Content-Type: application/json +Body: {"rawtx": "hex-encoded serialized transaction string"} +Errors: + 400 - Bad input + 500 - Other + 503 - Network unavailable (transaction failed to broadcast) +``` + +Broadcasts a hex-encoded, serialized transaction to the network. +Transactions are serialized with the `encoder` package. +See [`coin.Transaction.Serialize`](https://godoc.org/github.com/SkycoinProject/skycoin/src/coin#Transaction.Serialize). + +If there are no available connections, the API responds with a `503 Service Unavailable` error. + +Note that in some circumstances the transaction can fail to broadcast but this endpoint will still return successfully. +This can happen if the node's network has recently become unavailable but its connections have not timed out yet. + +The recommended way to handle transaction injections from your system is to inject the transaction then wait +for the transaction to be confirmed. Transactions typically confirm quickly, so if it is not confirmed after some +timeout such as 1 minute, the application can continue to retry the broadcast with `/api/v1/resendUnconfirmedTxns`. +Broadcast only fails without an error if the node's peers disconnect or timeout after the broadcast was initiated, +which is a network problem that may recover, so rebroadcasting with `/api/v1/resendUnconfirmedTxns` will resolve it, +or else the network is unavailable. + +`POST /api/v1/transaction` accepts an `ignore_unconfirmed` option to allow transactions to be created without waiting +for unconfirmed transactions to confirm. + +Any unconfirmed transactions found in the database at startup are resent. So, if the network broadcast failed but +the transaction was saved to the database, when you restart the client, it will resend. + +It is safe to retry the injection after a `503` failure. + +To disable the network broadcast, add `"no_broadcast": true` to the JSON request body. +The transaction will be added to the local transaction pool but not be broadcast at the same time. +Note that transactions from the pool are periodically announced, so this transaction will still +be announced eventually if the daemon continues running with connectivity for enough time. + +Example: + +```sh +curl -X POST http://127.0.0.1:6420/api/v1/injectTransaction -H 'content-type: application/json' -d '{ + "rawtx":"dc0000000008b507528697b11340f5a3fcccbff031c487bad59d26c2bdaea0cd8a0199a1720100000017f36c9d8bce784df96a2d6848f1b7a8f5c890986846b7c53489eb310090b91143c98fd233830055b5959f60030b3ca08d95f22f6b96ba8c20e548d62b342b5e0001000000ec9cf2f6052bab24ec57847c72cfb377c06958a9e04a077d07b6dd5bf23ec106020000000072116096fe2207d857d18565e848b403807cd825c044840300000000330100000000000000575e472f8c5295e8fa644e9bc5e06ec10351c65f40420f000000000066020000000000000" +}' +``` + +Result: + +```json +"3615fc23cc12a5cb9190878a2151d1cf54129ff0cd90e5fc4f4e7debebad6868" +``` + +Example, without broadcasting the transaction: + +```sh +curl -X POST http://127.0.0.1:6420/api/v1/injectTransaction -H 'content-type: application/json' -d '{ + "rawtx":"dc0000000008b507528697b11340f5a3fcccbff031c487bad59d26c2bdaea0cd8a0199a1720100000017f36c9d8bce784df96a2d6848f1b7a8f5c890986846b7c53489eb310090b91143c98fd233830055b5959f60030b3ca08d95f22f6b96ba8c20e548d62b342b5e0001000000ec9cf2f6052bab24ec57847c72cfb377c06958a9e04a077d07b6dd5bf23ec106020000000072116096fe2207d857d18565e848b403807cd825c044840300000000330100000000000000575e472f8c5295e8fa644e9bc5e06ec10351c65f40420f000000000066020000000000000", + "no_broadcast": true +}' +``` + +Result: + +```json +"3615fc23cc12a5cb9190878a2151d1cf54129ff0cd90e5fc4f4e7debebad6868" +``` + + +### Get transactions for addresses + +API sets: `READ` + +``` +URI: /api/v1/transactions +Method: GET, POST +Args: + addrs: Comma separated addresses [optional, returns all transactions if no address is provided] + confirmed: Whether the transactions should be confirmed [optional, must be 0 or 1; if not provided, returns all] + verbose: [bool] include verbose transaction input data +``` + +If verbose, the transaction inputs include the owner address, coins, hours and calculated hours. +The hours are the original hours the output was created with. +If the transaction is confirmed, the calculated hours are the hours the transaction had in the block in which it was executed. +If the transaction is unconfirmed, the calculated hours are based upon the current system time, and are approximately +equal to the hours the output would have if it become confirmed immediately. + +The `"time"` field at the top level of each object in the response array indicates either the confirmed timestamp of a confirmed +transaction or the last received timestamp of an unconfirmed transaction. + +The `POST` method can be used if many addresses need to be queried. + +To get confirmed transactions for one or more addresses: + +```sh +curl http://127.0.0.1:6420/api/v1/transactions?addrs=7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD,6dkVxyKFbFKg9Vdg6HPg1UANLByYRqkrdY&confirmed=1 +``` + +To get unconfirmed transactions for one or more addresses: + +```sh +curl http://127.0.0.1:6420/api/v1/transactions?addrs=7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD,6dkVxyKFbFKg9Vdg6HPg1UANLByYRqkrdY&confirmed=0 +``` + +To get both confirmed and unconfirmed transactions for one or more addresses: + +```sh +curl http://127.0.0.1:6420/api/v1/transactions?addrs=7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD,6dkVxyKFbFKg9Vdg6HPg1UANLByYRqkrdY +``` + +Result: + +```json +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 10492, + "block_seq": 1177 + }, + "time": 1494275011, + "txn": { + "length": 317, + "type": 0, + "txid": "b09cd3a8baef6a449848f50a1b97943006ca92747d4e485d0647a3ea74550eca", + "inner_hash": "2cb370051c92521a04ba5357e229d8ffa90d9d1741ea223b44dd60a1483ee0e5", + "timestamp": 1494275011, + "sigs": [ + "a55155ca15f73f0762f79c15917949a936658cff668647daf82a174eed95703a02622881f9cf6c7495536676f931b2d91d389a9e7b034232b3a1519c8da6fb8800", + "cc7d7cbd6f31adabd9bde2c0deaa9277c0f3cf807a4ec97e11872817091dc3705841a6adb74acb625ee20ab6d3525350b8663566003276073d94c3bfe22fe48e01" + ], + "inputs": [ + "4f4b0078a9cd19b3395e54b3f42af6adc997f77f04e0ca54016c67c4f2384e3c", + "36f4871646b6564b2f1ab72bd768a67579a1e0242bc68bcbcf1779bc75b3dddd" + ], + "outputs": [ + { + "uxid": "5287f390628909dd8c25fad0feb37859c0c1ddcf90da0c040c837c89fefd9191", + "dst": "2K6NuLBBapWndAssUtkxKfCtyjDQDHrEhhT", + "coins": "8.000000", + "hours": 7454 + }, + { + "uxid": "a1268e9bd2033b49b44afa765d20876467254f51e5515626780467267a65c563", + "dst": "7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD", + "coins": "1.000000", + "hours": 7454 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 10491, + "block_seq": 1178 + }, + "time": 1494275231, + "txn": { + "length": 183, + "type": 0, + "txid": "a6446654829a4a844add9f181949d12f8291fdd2c0fcb22200361e90e814e2d3", + "inner_hash": "075f255d42ddd2fb228fe488b8b468526810db7a144aeed1fd091e3fd404626e", + "timestamp": 1494275231, + "sigs": [ + "9b6fae9a70a42464dda089c943fafbf7bae8b8402e6bf4e4077553206eebc2ed4f7630bb1bd92505131cca5bf8bd82a44477ef53058e1995411bdbf1f5dfad1f00" + ], + "inputs": [ + "5287f390628909dd8c25fad0feb37859c0c1ddcf90da0c040c837c89fefd9191" + ], + "outputs": [ + { + "uxid": "70fa9dfb887f9ef55beb4e960f60e4703c56f98201acecf2cad729f5d7e84690", + "dst": "7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD", + "coins": "8.000000", + "hours": 931 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 8730, + "block_seq": 2939 + }, + "time": 1505205561, + "txn": { + "length": 474, + "type": 0, + "txid": "b45e571988bc07bd0b623c999655fa878fb9bdd24c8cd24fde179bf4b26ae7b7", + "inner_hash": "393804eca6afadc05db80cfb9e1024ef5761231c70705c406301bad33161f8bf", + "timestamp": 1505205561, + "sigs": [ + "fb9dd021cdff51ab56891cca0fd1600877f6e0691136dbe3f8324c3f4f7ee5bc624ded4954c1d70d8cb776ce3454d8f195bbb252e48b0f2cd388f5a733697d9301", + "0639e61ba87a61f10b0e0114008ddd4e7090d9397370de28da27b7852b231b8e66c36d10fe3424c9b23a41266fd2c50f169233009713b332d6a48ce9c128ccef01", + "055afe17222aab66c48c8e08e03a406bf2b8719f5221ec54c8e678078033bcd56b66bbc46a866f2be5e3f9ca454e3fbc2021630d0430b72e18c24d02df03c03100", + "8cf56fb96e11d49bea728cb35ba5953fbc640817fac01b82e62a959ef8d4c3105298f2a6ea127bb07552abd905a667b58f6c79717e9f05258079de08d91f10a500" + ], + "inputs": [ + "dea9266aa7b687f4391e92f04436407c51a834274a5a33bc8bcf3189732e82e3", + "e811bdce52ddac0d952d2546fdca8d1ac4e0ad32f170d3d73b724fb37c802652", + "e94ccdbc07cc62fb41140b4daa7969438c749837c0808acf20dde113bdf1876b", + "534afc496a7aee2ec55c71d85abfc27f35d16c56506f663b24d8ee4815583b6e" + ], + "outputs": [ + { + "uxid": "732e129fc1630aba3f06d833ce0a7a25f05dae5df3e7a135b5f82e99222e8c28", + "dst": "2hAjmdPP9R3um9JhKczeVdJUVugY6SPJBDm", + "coins": "6.000000", + "hours": 204 + } + ] + } + } +] +``` + +Example (verbose): + +```sh +curl http://127.0.0.1:6420/api/v1/transactions?addrs=7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD,2K6NuLBBapWndAssUtkxKfCtyjDQDHrEhhT&verbose=1 +``` + +Result: + +```json +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 53207, + "block_seq": 1131 + }, + "time": 1494192581, + "txn": { + "timestamp": 1494192581, + "length": 220, + "type": 0, + "txid": "b785dc57a9b53dbf0390213480dd9dffc32356fb79b82fa622a2607894bfab98", + "inner_hash": "5279e944502d6bdaff25af7b7fb7c6e503c62ae70a01084031e1cb563afe2e2c", + "fee": 317021, + "sigs": [ + "f8cd208acc6674de79fa1192e5177325cda871c26707242dbd6fb9df245bf34b2fbc3dfe32e61eefa0543934556cb073bdeab6e555d7bfe6b7220f1ae575613d01" + ], + "inputs": [ + { + "uxid": "004d3ef83af64c542701b923ec5c727734de9d88837bcea37a2927a569dd3f0d", + "owner": "MbZvwdXHnMUZ1eUFxNDqxPEEHkkffKgq2F", + "coins": "904.000000", + "hours": 14, + "calculated_hours": 422693 + } + ], + "outputs": [ + { + "uxid": "4047c5cbbaf0ed927caa1391d5456d58e0857ef188f2eec8ee987a30b3f53aed", + "dst": "MbZvwdXHnMUZ1eUFxNDqxPEEHkkffKgq2F", + "coins": "903.000000", + "hours": 52836 + }, + { + "uxid": "4f4b0078a9cd19b3395e54b3f42af6adc997f77f04e0ca54016c67c4f2384e3c", + "dst": "2K6NuLBBapWndAssUtkxKfCtyjDQDHrEhhT", + "coins": "1.000000", + "hours": 52836 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 53206, + "block_seq": 1132 + }, + "time": 1494192731, + "txn": { + "timestamp": 1494192731, + "length": 220, + "type": 0, + "txid": "dc39c39bea82e5b56a1a77ce8485d9b06fda694e04ddf63af1273351c87dd077", + "inner_hash": "b8f36a57212a68f4b3ecf9d699f286dafcdb624551e07c35a983832ffd37326c", + "fee": 39628, + "sigs": [ + "1005adda19efe31b5cd85caa85b4a42599263f649103fd26761f2261f3ee00460d9693c45406d782b0e04613aa412a5ef6b275c2a665a9f13167912da91777a700" + ], + "inputs": [ + { + "uxid": "4047c5cbbaf0ed927caa1391d5456d58e0857ef188f2eec8ee987a30b3f53aed", + "owner": "MbZvwdXHnMUZ1eUFxNDqxPEEHkkffKgq2F", + "coins": "903.000000", + "hours": 52836, + "calculated_hours": 52836 + } + ], + "outputs": [ + { + "uxid": "a6662ea872dabee2fae96a4561d67728d16cb3da372d4b7bbc74a18f2bc3fecf", + "dst": "MbZvwdXHnMUZ1eUFxNDqxPEEHkkffKgq2F", + "coins": "895.000000", + "hours": 6604 + }, + { + "uxid": "36f4871646b6564b2f1ab72bd768a67579a1e0242bc68bcbcf1779bc75b3dddd", + "dst": "2K6NuLBBapWndAssUtkxKfCtyjDQDHrEhhT", + "coins": "8.000000", + "hours": 6604 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 53161, + "block_seq": 1177 + }, + "time": 1494275011, + "txn": { + "timestamp": 1494275011, + "length": 317, + "type": 0, + "txid": "b09cd3a8baef6a449848f50a1b97943006ca92747d4e485d0647a3ea74550eca", + "inner_hash": "2cb370051c92521a04ba5357e229d8ffa90d9d1741ea223b44dd60a1483ee0e5", + "fee": 44726, + "sigs": [ + "a55155ca15f73f0762f79c15917949a936658cff668647daf82a174eed95703a02622881f9cf6c7495536676f931b2d91d389a9e7b034232b3a1519c8da6fb8800", + "cc7d7cbd6f31adabd9bde2c0deaa9277c0f3cf807a4ec97e11872817091dc3705841a6adb74acb625ee20ab6d3525350b8663566003276073d94c3bfe22fe48e01" + ], + "inputs": [ + { + "uxid": "4f4b0078a9cd19b3395e54b3f42af6adc997f77f04e0ca54016c67c4f2384e3c", + "owner": "2K6NuLBBapWndAssUtkxKfCtyjDQDHrEhhT", + "coins": "1.000000", + "hours": 52836, + "calculated_hours": 52857 + }, + { + "uxid": "36f4871646b6564b2f1ab72bd768a67579a1e0242bc68bcbcf1779bc75b3dddd", + "owner": "2K6NuLBBapWndAssUtkxKfCtyjDQDHrEhhT", + "coins": "8.000000", + "hours": 6604, + "calculated_hours": 6777 + } + ], + "outputs": [ + { + "uxid": "5287f390628909dd8c25fad0feb37859c0c1ddcf90da0c040c837c89fefd9191", + "dst": "2K6NuLBBapWndAssUtkxKfCtyjDQDHrEhhT", + "coins": "8.000000", + "hours": 7454 + }, + { + "uxid": "a1268e9bd2033b49b44afa765d20876467254f51e5515626780467267a65c563", + "dst": "7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD", + "coins": "1.000000", + "hours": 7454 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 53160, + "block_seq": 1178 + }, + "time": 1494275231, + "txn": { + "timestamp": 1494275231, + "length": 183, + "type": 0, + "txid": "a6446654829a4a844add9f181949d12f8291fdd2c0fcb22200361e90e814e2d3", + "inner_hash": "075f255d42ddd2fb228fe488b8b468526810db7a144aeed1fd091e3fd404626e", + "fee": 6523, + "sigs": [ + "9b6fae9a70a42464dda089c943fafbf7bae8b8402e6bf4e4077553206eebc2ed4f7630bb1bd92505131cca5bf8bd82a44477ef53058e1995411bdbf1f5dfad1f00" + ], + "inputs": [ + { + "uxid": "5287f390628909dd8c25fad0feb37859c0c1ddcf90da0c040c837c89fefd9191", + "owner": "2K6NuLBBapWndAssUtkxKfCtyjDQDHrEhhT", + "coins": "8.000000", + "hours": 7454, + "calculated_hours": 7454 + } + ], + "outputs": [ + { + "uxid": "70fa9dfb887f9ef55beb4e960f60e4703c56f98201acecf2cad729f5d7e84690", + "dst": "7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD", + "coins": "8.000000", + "hours": 931 + } + ] + } + } +] +``` + +### Resend unconfirmed transactions + +API sets: `TXN`, `WALLET` + +``` +URI: /api/v1/resendUnconfirmedTxns +Method: POST +``` + +Example: + +```sh +curl -X POST 'http://127.0.0.1:6420/api/v1/resendUnconfirmedTxns' +``` + +Result: + +```json +{ + "txids":[ + "b45e571988bc07bd0b623c999655fa878fb9bdd24c8cd24fde179bf4b26ae7b7", + "a6446654829a4a844add9f181949d12f8291fdd2c0fcb22200361e90e814e2d3" + ] +} +``` + +### Verify encoded transaction + +API sets: `READ` + +``` +URI: /api/v2/transaction/verify +Method: POST +Content-Type: application/json +Args: {"unsigned": false, "encoded_transaction": ""} +``` + +If the transaction can be parsed, passes validation and has not been spent, returns `200 OK` with the decoded transaction data, +and the `"confirmed"` field will be `false`. + +If the transaction is structurally valid, passes validation but has been spent, returns `422 Unprocessable Entity` with the decoded transaction data, +and the `"confirmed"` field will be `true`. The `"error"` `"message"` will be `"transaction has been spent"`. + +`"unsigned"` may be specified in the request. If `true`, the transaction will report an error if it is fully signed. +It will not report an error if the transaction is missing at least one signature, and the remainder of the transaction is valid. +In the response, if the transaction has any unsigned inputs, the `"unsigned"` field will be `true`. +If the request did not specify `"unsigned"` or specified it as `false`, the response will return an error for an unsigned transaction. + +If the transaction can be parsed but does not pass validation, returns `422 Unprocessable Entity` with the decoded transaction data. +The `"error"` object will be included in the response with the reason why. +If the transaction's inputs cannot be found in the unspent pool nor in the historical archive of unspents, +the transaction `"inputs"` metadata will be absent and only `"uxid"` will be present. + +If the transaction can not be parsed, returns `400 Bad Request` and the `"error"` object will be included in the response with the reason why. + +Example of valid transaction that has not been spent: + +```sh +curl -X POST -H 'Content-Type: application/json' http://127.0.0.1:6420/api/v2/transaction/verify \ +-d '{"encoded_transaction": "dc000000004fd024d60939fede67065b36adcaaeaf70fc009e3a5bbb8358940ccc8bbb2074010000007635ce932158ec06d94138adc9c9b19113fa4c2279002e6b13dcd0b65e0359f247e8666aa64d7a55378b9cc9983e252f5877a7cb2671c3568ec36579f8df1581000100000019ad5059a7fffc0369fc24b31db7e92e12a4ee2c134fb00d336d7495dec7354d02000000003f0555073e17ea6e45283f0f1115b520d0698d03a086010000000000010000000000000000b90dc595d102c48d3281b47428670210415f585200f22b0000000000ff01000000000000"}' +``` + +Result: + +```json +{ + "data": { + "unsigned": false, + "confirmed": false, + "transaction": { + "length": 220, + "type": 0, + "txid": "82b5fcb182e3d70c285e59332af6b02bf11d8acc0b1407d7d82b82e9eeed94c0", + "inner_hash": "4fd024d60939fede67065b36adcaaeaf70fc009e3a5bbb8358940ccc8bbb2074", + "fee": "1042", + "sigs": [ + "7635ce932158ec06d94138adc9c9b19113fa4c2279002e6b13dcd0b65e0359f247e8666aa64d7a55378b9cc9983e252f5877a7cb2671c3568ec36579f8df158100" + ], + "inputs": [ + { + "uxid": "19ad5059a7fffc0369fc24b31db7e92e12a4ee2c134fb00d336d7495dec7354d", + "address": "2HTnQe3ZupkG6k8S81brNC3JycGV2Em71F2", + "coins": "2.980000", + "hours": "985", + "calculated_hours": "1554", + "timestamp": 1527080354, + "block": 30074, + "txid": "94204347ef52d90b3c5d6c31a3fced56ae3f74fd8f1f5576931aeb60847f0e59" + } + ], + "outputs": [ + { + "uxid": "b0911a5fc4dfe4524cdb82f6db9c705f4849af42fcd487a3c4abb2d17573d234", + "address": "SMnCGfpt7zVXm8BkRSFMLeMRA6LUu3Ewne", + "coins": "0.100000", + "hours": "1" + }, + { + "uxid": "a492e6b85a434866be40da7e287bfcf14efce9803ff2fcd9d865c4046e81712a", + "address": "2HTnQe3ZupkG6k8S81brNC3JycGV2Em71F2", + "coins": "2.880000", + "hours": "511" + } + ] + } + } +} +``` + +Example of valid transaction that *has* been spent: + +```sh +curl -X POST -H 'Content-Type: application/json' http://127.0.0.1:6420/api/v2/transaction/verify \ +-d '{"encoded_transaction": "dc000000004fd024d60939fede67065b36adcaaeaf70fc009e3a5bbb8358940ccc8bbb2074010000007635ce932158ec06d94138adc9c9b19113fa4c2279002e6b13dcd0b65e0359f247e8666aa64d7a55378b9cc9983e252f5877a7cb2671c3568ec36579f8df1581000100000019ad5059a7fffc0369fc24b31db7e92e12a4ee2c134fb00d336d7495dec7354d02000000003f0555073e17ea6e45283f0f1115b520d0698d03a086010000000000010000000000000000b90dc595d102c48d3281b47428670210415f585200f22b0000000000ff01000000000000"}' +``` + +Result: + +```json +{ + "error": { + "message": "transaction has been spent", + "code": 422 + }, + "data": { + "unsigned": false, + "confirmed": true, + "transaction": { + "length": 220, + "type": 0, + "txid": "82b5fcb182e3d70c285e59332af6b02bf11d8acc0b1407d7d82b82e9eeed94c0", + "inner_hash": "4fd024d60939fede67065b36adcaaeaf70fc009e3a5bbb8358940ccc8bbb2074", + "fee": "1042", + "sigs": [ + "7635ce932158ec06d94138adc9c9b19113fa4c2279002e6b13dcd0b65e0359f247e8666aa64d7a55378b9cc9983e252f5877a7cb2671c3568ec36579f8df158100" + ], + "inputs": [ + { + "uxid": "19ad5059a7fffc0369fc24b31db7e92e12a4ee2c134fb00d336d7495dec7354d", + "address": "2HTnQe3ZupkG6k8S81brNC3JycGV2Em71F2", + "coins": "2.980000", + "hours": "985", + "calculated_hours": "1554", + "timestamp": 1527080354, + "block": 30074, + "txid": "94204347ef52d90b3c5d6c31a3fced56ae3f74fd8f1f5576931aeb60847f0e59" + } + ], + "outputs": [ + { + "uxid": "b0911a5fc4dfe4524cdb82f6db9c705f4849af42fcd487a3c4abb2d17573d234", + "address": "SMnCGfpt7zVXm8BkRSFMLeMRA6LUu3Ewne", + "coins": "0.100000", + "hours": "1" + }, + { + "uxid": "a492e6b85a434866be40da7e287bfcf14efce9803ff2fcd9d865c4046e81712a", + "address": "2HTnQe3ZupkG6k8S81brNC3JycGV2Em71F2", + "coins": "2.880000", + "hours": "511" + } + ] + } + } +} +``` + +Example of valid, unsigned transaction that has not been spent, with the unsigned parameter set to true in the request: + +```sh +curl -X POST -H 'Content-Type: application/json' http://127.0.0.1:6420/api/v2/transaction/verify \ +-d '{"unsigned": true, "encoded_transaction": "dc000000004fd024d60939fede67065b36adcaaeaf70fc009e3a5bbb8358940ccc8bbb2074010000007635ce932158ec06d94138adc9c9b19113fa4c2279002e6b13dcd0b65e0359f247e8666aa64d7a55378b9cc9983e252f5877a7cb2671c3568ec36579f8df1581000100000019ad5059a7fffc0369fc24b31db7e92e12a4ee2c134fb00d336d7495dec7354d02000000003f0555073e17ea6e45283f0f1115b520d0698d03a086010000000000010000000000000000b90dc595d102c48d3281b47428670210415f585200f22b0000000000ff01000000000000"}' +``` + +Result: + +```json +{ + "data": { + "unsigned": true, + "confirmed": false, + "transaction": { + "length": 220, + "type": 0, + "txid": "82b5fcb182e3d70c285e59332af6b02bf11d8acc0b1407d7d82b82e9eeed94c0", + "inner_hash": "4fd024d60939fede67065b36adcaaeaf70fc009e3a5bbb8358940ccc8bbb2074", + "fee": "1042", + "sigs": [ + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + ], + "inputs": [ + { + "uxid": "19ad5059a7fffc0369fc24b31db7e92e12a4ee2c134fb00d336d7495dec7354d", + "address": "2HTnQe3ZupkG6k8S81brNC3JycGV2Em71F2", + "coins": "2.980000", + "hours": "985", + "calculated_hours": "1554", + "timestamp": 1527080354, + "block": 30074, + "txid": "94204347ef52d90b3c5d6c31a3fced56ae3f74fd8f1f5576931aeb60847f0e59" + } + ], + "outputs": [ + { + "uxid": "b0911a5fc4dfe4524cdb82f6db9c705f4849af42fcd487a3c4abb2d17573d234", + "address": "SMnCGfpt7zVXm8BkRSFMLeMRA6LUu3Ewne", + "coins": "0.100000", + "hours": "1" + }, + { + "uxid": "a492e6b85a434866be40da7e287bfcf14efce9803ff2fcd9d865c4046e81712a", + "address": "2HTnQe3ZupkG6k8S81brNC3JycGV2Em71F2", + "coins": "2.880000", + "hours": "511" + } + ] + } + } +} +``` + + +## Block APIs + +### Get blockchain metadata + +API sets: `STATUS`, `READ` + +``` +URI: /api/v1/blockchain/metadata +Method: GET +``` + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/blockchain/metadata +``` + +Result: + +```json +{ + "head": { + "seq": 58894, + "block_hash": "3961bea8c4ab45d658ae42effd4caf36b81709dc52a5708fdd4c8eb1b199a1f6", + "previous_block_hash": "8eca94e7597b87c8587286b66a6b409f6b4bf288a381a56d7fde3594e319c38a", + "timestamp": 1537581604, + "fee": 485194, + "version": 0, + "tx_body_hash": "c03c0dd28841d5aa87ce4e692ec8adde923799146ec5504e17ac0c95036362dd", + "ux_hash": "f7d30ecb49f132283862ad58f691e8747894c9fc241cb3a864fc15bd3e2c83d3" + }, + "unspents": 38171, + "unconfirmed": 1 +} +``` + +### Get blockchain progress + +API sets: `STATUS`, `READ` + +``` +URI: /api/v1/blockchain/progress +Method: GET +``` + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/blockchain/progress +``` + +Result: + +```json +{ + "current": 2760, + "highest": 2760, + "peers": [ + { + "address": "35.157.164.126:6000", + "height": 2760 + }, + { + "address": "63.142.253.76:6000", + "height": 2760 + }, + ] +} +``` + +### Get block by hash or seq + +API sets: `READ` + +``` +URI: /api/v1/block +Method: GET +Args: + hash: get block by hash + seq: get block by sequence number + verbose: [bool] return verbose transaction input data +``` + +If verbose, the transaction inputs include the owner address, coins, hours and calculated hours. +The hours are the original hours the output was created with. +The calculated hours are the hours the transaction had in the block in which it was executed. + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/block?hash=6eafd13ab6823223b714246b32c984b56e0043412950faf17defdbb2cbf3fe30 +``` + +or + +```sh +curl http://127.0.0.1:6420/api/v1/block?seq=2760 +``` + +Result: + +```json +{ + "header": { + "seq": 2760, + "block_hash": "6eafd13ab6823223b714246b32c984b56e0043412950faf17defdbb2cbf3fe30", + "previous_block_hash": "eaccd527ef263573c29000dbfb3c782ee175153c63f42abb671588b7071e877f", + "timestamp": 1504220821, + "fee": 196130, + "version": 0, + "tx_body_hash": "825ae95b81ae0ce037cdf9f1cda138bac3f3ed41c51b09e0befb71848e0f3bfd", + "ux_hash": "366af6bd80cfce79ce1ef63b45fb3ae8d9a6afc92a8590f14e18220884bd9d22" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "825ae95b81ae0ce037cdf9f1cda138bac3f3ed41c51b09e0befb71848e0f3bfd", + "inner_hash": "312e5dd55e06be5f9a0ee43a00d447f2fea47a7f1fb9669ecb477d2768ab04fd", + "sigs": [ + "f0d0eb337e3440af6e8f0c105037ec205f36c83770d26a9e3a0fb4b7ec1a2be64764f4e31cbaf6629933c971613d10d58e6acb592704a7d511f19836441f09fb00" + ], + "inputs": [ + "e7594379c9a6bb111205cbfa6fac908cac1d136e207960eb0429f15fde09ac8c" + ], + "outputs": [ + { + "uxid": "840d0ee483c1dc085e6518e1928c68979af61188b809fc74da9fca982e6a61ba", + "dst": "2GgFvqoyk9RjwVzj8tqfcXVXB4orBwoc9qv", + "coins": "998.000000", + "hours": 35390 + }, + { + "uxid": "38177c437ff42f29dc8d682e2f7c278f2203b6b02f42b1a88f9eb6c2392a7f70", + "dst": "2YHKP9yH7baLvkum3U6HCBiJjnAUCLS5Z9U", + "coins": "2.000000", + "hours": 70780 + } + ] + } + ] + }, + "size": 220 +} +``` + +Example (verbose): + +```sh +curl http://127.0.0.1:6420/api/v1/block?hash=6eafd13ab6823223b714246b32c984b56e0043412950faf17defdbb2cbf3fe30&verbose=1 +``` + +or + +```sh +curl http://127.0.0.1:6420/api/v1/block?seq=2760&verbose=1 +``` + +Result: + +```json +{ + "header": { + "seq": 2760, + "block_hash": "6eafd13ab6823223b714246b32c984b56e0043412950faf17defdbb2cbf3fe30", + "previous_block_hash": "eaccd527ef263573c29000dbfb3c782ee175153c63f42abb671588b7071e877f", + "timestamp": 1504220821, + "fee": 196130, + "version": 0, + "tx_body_hash": "825ae95b81ae0ce037cdf9f1cda138bac3f3ed41c51b09e0befb71848e0f3bfd", + "ux_hash": "366af6bd80cfce79ce1ef63b45fb3ae8d9a6afc92a8590f14e18220884bd9d22" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "825ae95b81ae0ce037cdf9f1cda138bac3f3ed41c51b09e0befb71848e0f3bfd", + "inner_hash": "312e5dd55e06be5f9a0ee43a00d447f2fea47a7f1fb9669ecb477d2768ab04fd", + "fee": 196130, + "sigs": [ + "f0d0eb337e3440af6e8f0c105037ec205f36c83770d26a9e3a0fb4b7ec1a2be64764f4e31cbaf6629933c971613d10d58e6acb592704a7d511f19836441f09fb00" + ], + "inputs": [ + { + "uxid": "e7594379c9a6bb111205cbfa6fac908cac1d136e207960eb0429f15fde09ac8c", + "owner": "kbbzyrUKNVJsJDGFLAjVT5neVcx5SQjFx5", + "coins": "1000.000000", + "hours": 283123, + "calculated_hours": 302300 + } + ], + "outputs": [ + { + "uxid": "840d0ee483c1dc085e6518e1928c68979af61188b809fc74da9fca982e6a61ba", + "dst": "2GgFvqoyk9RjwVzj8tqfcXVXB4orBwoc9qv", + "coins": "998.000000", + "hours": 35390 + }, + { + "uxid": "38177c437ff42f29dc8d682e2f7c278f2203b6b02f42b1a88f9eb6c2392a7f70", + "dst": "2YHKP9yH7baLvkum3U6HCBiJjnAUCLS5Z9U", + "coins": "2.000000", + "hours": 70780 + } + ] + } + ] + }, + "size": 220 +} +``` + + +### Get blocks in specific range + +API sets: `READ` + +``` +URI: /api/v1/blocks +Method: GET, POST +Args: + start: start seq + end: end seq + seqs: comma-separated list of block seqs + verbose: [bool] return verbose transaction input data +``` + +This endpoint has two modes: range and seqs. +The `seqs` parameter cannot be combined with `start`, `end`. + +If `start` and/or `end` are provided, returns blocks in the range [`start`, `end`]. +Both start and end sequences are included in the returned array of blocks. + +If `seqs` is provided, returns blocks matching the specified sequences. +`seqs` must not contain any duplicate values. +If a block does not exist for any of the given sequence numbers, a `404` error is returned. + +If verbose, the transaction inputs include the owner address, coins, hours and calculated hours. +The hours are the original hours the output was created with. +The calculated hours are the hours the transaction had in the block in which it was executed. + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/blocks?start=101&end=102 +``` + +Result: + +```json +{ + "blocks": [ + { + "header": { + "seq": 101, + "block_hash": "8156057fc823589288f66c91edb60c11ff004465bcbe3a402b1328be7f0d6ce0", + "previous_block_hash": "725e76907998485d367a847b0fb49f08536c592247762279fcdbd9907fee5607", + "timestamp": 1429274666, + "fee": 720335, + "version": 0, + "tx_body_hash": "e8fe5290afba3933389fd5860dca2cbcc81821028be9c65d0bb7cf4e8d2c4c18", + "ux_hash": "348989599d30d3adfaaea98577963caa419ab0276279296e7d194a9cbb8cad04" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "e8fe5290afba3933389fd5860dca2cbcc81821028be9c65d0bb7cf4e8d2c4c18", + "inner_hash": "45da31b68748eafdb08ef8bf1ebd1c07c0f14fcb0d66759d6cf4642adc956d06", + "sigs": [ + "09bce2c888ceceeb19999005cceb1efdee254cacb60edee118b51ffd740ff6503a8f9cbd60a16c7581bfd64f7529b649d0ecc8adbe913686da97fe8c6543189001" + ], + "inputs": [ + "6002f3afc7054c0e1161bcf2b4c1d4d1009440751bc1fe806e0eae33291399f4" + ], + "outputs": [ + { + "uxid": "f9bffdcbe252acb1c3a8a1e8c99829342ba1963860d5692eebaeb9bcfbcaf274", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "27000.000000", + "hours": 102905 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 102, + "block_hash": "311f4b83b4fdb9fd1d45648115969cf4b3aab2d1acad9e2aa735829245c525f3", + "previous_block_hash": "8156057fc823589288f66c91edb60c11ff004465bcbe3a402b1328be7f0d6ce0", + "timestamp": 1429274686, + "fee": 710046, + "version": 0, + "tx_body_hash": "7b13cab45b52dd2df291ec97cf000bf6ea1b647d6fdf0261a7527578d8b71b9d", + "ux_hash": "f7512b0718f392c7503f86e69175efd7835ea4c3dd3f71ff65c7ad8873a6a9e8" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "7b13cab45b52dd2df291ec97cf000bf6ea1b647d6fdf0261a7527578d8b71b9d", + "inner_hash": "73bfee3a7c8d4f8a68657ebcaf69a59639f762bfc1a6f4468f3ca4724bc5b9f8", + "sigs": [ + "c4bcada17604a4a62baf50f929655027f2913639c27b773871f2135b72553c1959737e39d50e8349ffa5a7679de845aa6370999dbaaff4c7f9fd01260818683901" + ], + "inputs": [ + "4e75b4bced3404590d38ca06440c275d7fd86618a84966a0a1053fb18164e898" + ], + "outputs": [ + { + "uxid": "0a5603a1a5aeda575aa498cdaec5a4c893a28669dba84163eba2e90db3d9f39d", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26700.000000", + "hours": 101435 + } + ] + } + ] + }, + "size": 183 + } + ] +} +``` + +Example (verbose): + +```sh +curl http://127.0.0.1:6420/api/v1/blocks?start=101&end=102&verbose=1 +``` + +Result: + +```json +{ + "blocks": [ + { + "header": { + "seq": 101, + "block_hash": "8156057fc823589288f66c91edb60c11ff004465bcbe3a402b1328be7f0d6ce0", + "previous_block_hash": "725e76907998485d367a847b0fb49f08536c592247762279fcdbd9907fee5607", + "timestamp": 1429274666, + "fee": 720335, + "version": 0, + "tx_body_hash": "e8fe5290afba3933389fd5860dca2cbcc81821028be9c65d0bb7cf4e8d2c4c18", + "ux_hash": "348989599d30d3adfaaea98577963caa419ab0276279296e7d194a9cbb8cad04" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "e8fe5290afba3933389fd5860dca2cbcc81821028be9c65d0bb7cf4e8d2c4c18", + "inner_hash": "45da31b68748eafdb08ef8bf1ebd1c07c0f14fcb0d66759d6cf4642adc956d06", + "fee": 720335, + "sigs": [ + "09bce2c888ceceeb19999005cceb1efdee254cacb60edee118b51ffd740ff6503a8f9cbd60a16c7581bfd64f7529b649d0ecc8adbe913686da97fe8c6543189001" + ], + "inputs": [ + { + "uxid": "6002f3afc7054c0e1161bcf2b4c1d4d1009440751bc1fe806e0eae33291399f4", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "27000.000000", + "hours": 220, + "calculated_hours": 823240 + } + ], + "outputs": [ + { + "uxid": "f9bffdcbe252acb1c3a8a1e8c99829342ba1963860d5692eebaeb9bcfbcaf274", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "27000.000000", + "hours": 102905 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 102, + "block_hash": "311f4b83b4fdb9fd1d45648115969cf4b3aab2d1acad9e2aa735829245c525f3", + "previous_block_hash": "8156057fc823589288f66c91edb60c11ff004465bcbe3a402b1328be7f0d6ce0", + "timestamp": 1429274686, + "fee": 710046, + "version": 0, + "tx_body_hash": "7b13cab45b52dd2df291ec97cf000bf6ea1b647d6fdf0261a7527578d8b71b9d", + "ux_hash": "f7512b0718f392c7503f86e69175efd7835ea4c3dd3f71ff65c7ad8873a6a9e8" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "7b13cab45b52dd2df291ec97cf000bf6ea1b647d6fdf0261a7527578d8b71b9d", + "inner_hash": "73bfee3a7c8d4f8a68657ebcaf69a59639f762bfc1a6f4468f3ca4724bc5b9f8", + "fee": 710046, + "sigs": [ + "c4bcada17604a4a62baf50f929655027f2913639c27b773871f2135b72553c1959737e39d50e8349ffa5a7679de845aa6370999dbaaff4c7f9fd01260818683901" + ], + "inputs": [ + { + "uxid": "4e75b4bced3404590d38ca06440c275d7fd86618a84966a0a1053fb18164e898", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26700.000000", + "hours": 54, + "calculated_hours": 811481 + } + ], + "outputs": [ + { + "uxid": "0a5603a1a5aeda575aa498cdaec5a4c893a28669dba84163eba2e90db3d9f39d", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26700.000000", + "hours": 101435 + } + ] + } + ] + }, + "size": 183 + } + ] +} +``` + +Example (seqs): + +```sh +curl http://127.0.0.1:6420/api/v1/blocks?seqs=3,5,7 +``` + +```json +{ + "blocks": [ + { + "header": { + "seq": 3, + "block_hash": "35c3ebbe6feaeeab27ac77c1712051787bdd4bbfb5cdcdebc81f8aac98a2f3f3", + "previous_block_hash": "01723bc4dc90f1cb857a94fe5e3bb50c02e6689fd998f8147c9cae07fbfa63af", + "timestamp": 1427927671, + "fee": 0, + "version": 0, + "tx_body_hash": "a6a709e9388a4d67a47d262b11da5f804eddd9d67acc4a3e450f7a567bdc1619" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "a6a709e9388a4d67a47d262b11da5f804eddd9d67acc4a3e450f7a567bdc1619", + "inner_hash": "ea6adee3180c7f9d73d1e693822d5d1c2bba85067f89a873355bc771a078faa1", + "sigs": [ + "ce8fd47e2044ed17998f92621e90329f673a746c802d67f639ca083705dd199f6ee346781497b44132434922879244d819694b5903093f784570c55d293ab4af01" + ], + "inputs": [ + "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a" + ], + "outputs": [ + { + "uxid": "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 5, + "block_hash": "114fe60587a158428a47e0f9571d764f495912c299aa4e67fc88004cf21b0c24", + "previous_block_hash": "415e47348a1e642cb2e31d00ee500747d3aed0336aabfff7d783ed21465251c7", + "timestamp": 1428798821, + "fee": 2036, + "version": 0, + "tx_body_hash": "0579e7727627cd9815a8a8b5e1df86124f45a4132cc0dbd00d2f110e4f409b69" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "0579e7727627cd9815a8a8b5e1df86124f45a4132cc0dbd00d2f110e4f409b69", + "inner_hash": "fe123ca954a82bb1ce2cc9ef9c56d6b649a4cbaf5b17394b0ffda651ed32327e", + "sigs": [ + "056ed0f74367fb1370d7e98689953983d9cf34eb6669854f1645c8a16c93d85075661e7d4f6df0ce5ca8eb9852eff6a12fbac2caafee03bb8c616f847c61416800", + "8aaa7f320a7b01169d3217a600100cb27c55e4ce56cd3455814f56d8e4e65be746e0e20e776087af6f19361f0b898edc2123a5f9bd35d24ef8b8669ca85b142601" + ], + "inputs": [ + "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70" + ], + "outputs": [ + { + "uxid": "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999890.000000", + "hours": 4073 + }, + { + "uxid": "dc63c680f408c4e646037966189383a5d50eda34e666c2a0c75c0c6bf13b71a1", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "100.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 7, + "block_hash": "6cb71b57c998a5367101e01d48c097eccd4f5abf311c89bcca8ee213581f355f", + "previous_block_hash": "103949030e90fcebc5d8ca1c9c59f30a31aa71911401d22a2422e4571b035701", + "timestamp": 1428807671, + "fee": 0, + "version": 0, + "tx_body_hash": "f832428481690fa918d6d29946e191f2c8c89b2388a906e0c53dceee6070a24b" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "f832428481690fa918d6d29946e191f2c8c89b2388a906e0c53dceee6070a24b", + "inner_hash": "f440c514779522a6387edda9b9d9835f00680fb314546efb7bc9762a17884156", + "sigs": [ + "8fe96f5502270e4efa962b2aef2b81795fe26a8f0c9a494e2ae9c7e624af455c49396270ae7a25b41d439fd56dea9d556a135129122de1b1274b1e2a5d75f2ea01" + ], + "inputs": [ + "8ff8a647e4542fab01e078ac467b2c9f2e5f7de55d77ec2711f8abc718e2c91b" + ], + "outputs": [ + { + "uxid": "17090c40091d009d6a684043d3be2e9cb1dc60a664a9c2e388af1f3a7345724b", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "90.000000", + "hours": 0 + }, + { + "uxid": "f9e7a412cdff80e95ddbe1d76fcc73f967cb99d383b0659e1355c8e623f02b62", + "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + } + ] +} +``` + + +### Get last N blocks + +API sets: `READ` + +``` +URI: /api/v1/last_blocks +Method: GET +Args: + num: number of most recent blocks to return + verbose: [bool] return verbose transaction input data +``` + +If verbose, the transaction inputs include the owner address, coins, hours and calculated hours. +The hours are the original hours the output was created with. +The calculated hours are the hours the transaction had in the block in which it was executed. + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/last_blocks?num=2 +``` + +Result: + +```json +{ + "blocks": [ + { + "header": { + "seq": 58893, + "block_hash": "8eca94e7597b87c8587286b66a6b409f6b4bf288a381a56d7fde3594e319c38a", + "previous_block_hash": "1f042ed976c0cb150ea6b71c9608d65b519e4bc1c507eba9f1146e443a856c2d", + "timestamp": 1537581594, + "fee": 970389, + "version": 0, + "tx_body_hash": "1bea5cf1279693a0da24828c37b267c702007842b16ca5557ae497574d15aab7", + "ux_hash": "bf35652af199779bc40cbeb339e8a782ff70673b07779e5c5621d37dfe13b42b" + }, + "body": { + "txns": [ + { + "length": 377, + "type": 0, + "txid": "1bea5cf1279693a0da24828c37b267c702007842b16ca5557ae497574d15aab7", + "inner_hash": "a25232405bcef0c007bb2d7d3520f2a389e17e11125c252ab6c00168ec52c08d", + "sigs": [ + "2ff7390c3b66c6b0fbb2b4c59c8e218291d4cbb82a836bb577c7264677f4a8320f6f3ad72d804e3014728baa214c223ecced8725b64be96fe3b51332ad1eda4201", + "9e7c715f897b3c987c00ee8c6b14e4b90bb3e4e11d003b481f82042b1795b3c75eaa3d563cd0358cdabdab77cfdbead7323323cf73e781f9c1a8cf6d9b4f8ac100", + "5c9748314f2fe0cd442df5ebb8f211087111d22e9463355bf9eee583d44df1bd36addb510eb470cb5dafba0732615f8533072f80ae05fc728c91ce373ada1e7b00" + ], + "inputs": [ + "5f634c825b2a53103758024b3cb8578b17d56d422539e23c26b91ea397161703", + "16ac52084ffdac2e9169b9e057d44630dec23d18cfb90b9437d28220a3dc585d", + "8d3263890d32382e182b86f8772c7685a8f253ed475c05f7d530e9296f692bc9" + ], + "outputs": [ + { + "uxid": "fb8db3f78928aee3f5cbda8db7fc290df9e64414e8107872a1c5cf83e08e4df7", + "dst": "uvcDrKc8rHTjxLrU4mPN56Hyh2tR6RvCvw", + "coins": "26.913000", + "hours": 970388 + } + ] + } + ] + }, + "size": 377 + }, + { + "header": { + "seq": 58894, + "block_hash": "3961bea8c4ab45d658ae42effd4caf36b81709dc52a5708fdd4c8eb1b199a1f6", + "previous_block_hash": "8eca94e7597b87c8587286b66a6b409f6b4bf288a381a56d7fde3594e319c38a", + "timestamp": 1537581604, + "fee": 485194, + "version": 0, + "tx_body_hash": "c03c0dd28841d5aa87ce4e692ec8adde923799146ec5504e17ac0c95036362dd", + "ux_hash": "f7d30ecb49f132283862ad58f691e8747894c9fc241cb3a864fc15bd3e2c83d3" + }, + "body": { + "txns": [ + { + "length": 257, + "type": 0, + "txid": "c03c0dd28841d5aa87ce4e692ec8adde923799146ec5504e17ac0c95036362dd", + "inner_hash": "f7dbd09f7e9f65d87003984640f1977fb9eec95b07ef6275a1ec6261065e68d7", + "sigs": [ + "af5329e77213f34446a0ff41d249fd25bc1dae913390871df359b9bd587c95a10b625a74a3477a05cc7537cb532253b12c03349ead5be066b8e0009e79462b9501" + ], + "inputs": [ + "fb8db3f78928aee3f5cbda8db7fc290df9e64414e8107872a1c5cf83e08e4df7" + ], + "outputs": [ + { + "uxid": "235811602fc96cf8b5b031edb88ee1606830aa641c06e0986681552d8728ec07", + "dst": "2Huip6Eizrq1uWYqfQEh4ymibLysJmXnWXS", + "coins": "0.500000", + "hours": 1 + }, + { + "uxid": "873da4edc01c0b5184e1f26c4c3471dd407d08e9ab36b018ab93874e7392320b", + "dst": "2XBMMDMqTTYmqs2rfjEwYDz8ABd38y9B8r7", + "coins": "0.500000", + "hours": 1 + }, + { + "uxid": "42a6f0127f61e1d7bca8e9680027eddcecad772250c5634a03e56a8b1cf5a816", + "dst": "uvcDrKc8rHTjxLrU4mPN56Hyh2tR6RvCvw", + "coins": "25.913000", + "hours": 485192 + } + ] + } + ] + }, + "size": 257 + } + ] +} +``` + +Example (verbose): + +```sh +curl http://127.0.0.1:6420/api/v1/last_blocks?num=2&verbose=1 +``` + +Result: + +```json +{ + "blocks": [ + { + "header": { + "seq": 58893, + "block_hash": "8eca94e7597b87c8587286b66a6b409f6b4bf288a381a56d7fde3594e319c38a", + "previous_block_hash": "1f042ed976c0cb150ea6b71c9608d65b519e4bc1c507eba9f1146e443a856c2d", + "timestamp": 1537581594, + "fee": 970389, + "version": 0, + "tx_body_hash": "1bea5cf1279693a0da24828c37b267c702007842b16ca5557ae497574d15aab7", + "ux_hash": "bf35652af199779bc40cbeb339e8a782ff70673b07779e5c5621d37dfe13b42b" + }, + "body": { + "txns": [ + { + "length": 377, + "type": 0, + "txid": "1bea5cf1279693a0da24828c37b267c702007842b16ca5557ae497574d15aab7", + "inner_hash": "a25232405bcef0c007bb2d7d3520f2a389e17e11125c252ab6c00168ec52c08d", + "fee": 970389, + "sigs": [ + "2ff7390c3b66c6b0fbb2b4c59c8e218291d4cbb82a836bb577c7264677f4a8320f6f3ad72d804e3014728baa214c223ecced8725b64be96fe3b51332ad1eda4201", + "9e7c715f897b3c987c00ee8c6b14e4b90bb3e4e11d003b481f82042b1795b3c75eaa3d563cd0358cdabdab77cfdbead7323323cf73e781f9c1a8cf6d9b4f8ac100", + "5c9748314f2fe0cd442df5ebb8f211087111d22e9463355bf9eee583d44df1bd36addb510eb470cb5dafba0732615f8533072f80ae05fc728c91ce373ada1e7b00" + ], + "inputs": [ + { + "uxid": "5f634c825b2a53103758024b3cb8578b17d56d422539e23c26b91ea397161703", + "owner": "uvcDrKc8rHTjxLrU4mPN56Hyh2tR6RvCvw", + "coins": "25.910000", + "hours": 7745, + "calculated_hours": 17458 + }, + { + "uxid": "16ac52084ffdac2e9169b9e057d44630dec23d18cfb90b9437d28220a3dc585d", + "owner": "uvcDrKc8rHTjxLrU4mPN56Hyh2tR6RvCvw", + "coins": "1.000000", + "hours": 1915246, + "calculated_hours": 1915573 + }, + { + "uxid": "8d3263890d32382e182b86f8772c7685a8f253ed475c05f7d530e9296f692bc9", + "owner": "2Huip6Eizrq1uWYqfQEh4ymibLysJmXnWXS", + "coins": "0.003000", + "hours": 7745, + "calculated_hours": 7746 + } + ], + "outputs": [ + { + "uxid": "fb8db3f78928aee3f5cbda8db7fc290df9e64414e8107872a1c5cf83e08e4df7", + "dst": "uvcDrKc8rHTjxLrU4mPN56Hyh2tR6RvCvw", + "coins": "26.913000", + "hours": 970388 + } + ] + } + ] + }, + "size": 377 + }, + { + "header": { + "seq": 58894, + "block_hash": "3961bea8c4ab45d658ae42effd4caf36b81709dc52a5708fdd4c8eb1b199a1f6", + "previous_block_hash": "8eca94e7597b87c8587286b66a6b409f6b4bf288a381a56d7fde3594e319c38a", + "timestamp": 1537581604, + "fee": 485194, + "version": 0, + "tx_body_hash": "c03c0dd28841d5aa87ce4e692ec8adde923799146ec5504e17ac0c95036362dd", + "ux_hash": "f7d30ecb49f132283862ad58f691e8747894c9fc241cb3a864fc15bd3e2c83d3" + }, + "body": { + "txns": [ + { + "length": 257, + "type": 0, + "txid": "c03c0dd28841d5aa87ce4e692ec8adde923799146ec5504e17ac0c95036362dd", + "inner_hash": "f7dbd09f7e9f65d87003984640f1977fb9eec95b07ef6275a1ec6261065e68d7", + "fee": 485194, + "sigs": [ + "af5329e77213f34446a0ff41d249fd25bc1dae913390871df359b9bd587c95a10b625a74a3477a05cc7537cb532253b12c03349ead5be066b8e0009e79462b9501" + ], + "inputs": [ + { + "uxid": "fb8db3f78928aee3f5cbda8db7fc290df9e64414e8107872a1c5cf83e08e4df7", + "owner": "uvcDrKc8rHTjxLrU4mPN56Hyh2tR6RvCvw", + "coins": "26.913000", + "hours": 970388, + "calculated_hours": 970388 + } + ], + "outputs": [ + { + "uxid": "235811602fc96cf8b5b031edb88ee1606830aa641c06e0986681552d8728ec07", + "dst": "2Huip6Eizrq1uWYqfQEh4ymibLysJmXnWXS", + "coins": "0.500000", + "hours": 1 + }, + { + "uxid": "873da4edc01c0b5184e1f26c4c3471dd407d08e9ab36b018ab93874e7392320b", + "dst": "2XBMMDMqTTYmqs2rfjEwYDz8ABd38y9B8r7", + "coins": "0.500000", + "hours": 1 + }, + { + "uxid": "42a6f0127f61e1d7bca8e9680027eddcecad772250c5634a03e56a8b1cf5a816", + "dst": "uvcDrKc8rHTjxLrU4mPN56Hyh2tR6RvCvw", + "coins": "25.913000", + "hours": 485192 + } + ] + } + ] + }, + "size": 257 + } + ] +} +``` + +## Uxout APIs + +### Get uxout + +API sets: `READ` + +``` +URI: /api/v1/uxout +Method: GET +Args: + uxid +``` + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/uxout?uxid=8b64d9b058e10472b9457fd2d05a1d89cbbbd78ce1d97b16587d43379271bed1 +``` + +Result: + +```json +{ + "uxid": "8b64d9b058e10472b9457fd2d05a1d89cbbbd78ce1d97b16587d43379271bed1", + "time": 1502870712, + "src_block_seq": 2545, + "src_tx": "ded9e671510ab300a4ea3ee126fe8e2d50b995021e2db4589c6fb4ac000fe7bb", + "owner_address": "c9zyTYwgR4n89KyzknpmGaaDarUCPEs9mV", + "coins": 2000000, + "hours": 5039, + "spent_block_seq": 2556, + "spent_tx": "b51e1933f286c4f03d73e8966186bafb25f64053db8514327291e690ae8aafa5" +} +``` + +### Get historical unspent outputs for an address + +API sets: `READ` + +``` +URI: /api/v1/address_uxouts +Method: GET +Args: + address +``` + +Returns the historical, spent outputs of a given address. + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/address_uxouts?address=6dkVxyKFbFKg9Vdg6HPg1UANLByYRqkrdY +``` + +Result: + +```json +[ + { + "uxid": "7669ff7350d2c70a88093431a7b30d3e69dda2319dcb048aa80fa0d19e12ebe0", + "time": 1502936862, + "src_block_seq": 2556, + "src_tx": "b51e1933f286c4f03d73e8966186bafb25f64053db8514327291e690ae8aafa5", + "owner_address": "6dkVxyKFbFKg9Vdg6HPg1UANLByYRqkrdY", + "coins": 2000000, + "hours": 633, + "spent_block_seq": 0, + "spent_tx": "0000000000000000000000000000000000000000000000000000000000000000" + } +] +``` + +## Coin supply related information + +### Coin supply + +API sets: `READ` + +``` +URI: /api/v1/coinSupply +Method: GET +``` + +Example: + +```sh +curl http://127.0.0.1:6420/api/v1/coinSupply +``` + +Result: + +```json +{ + "current_supply": "7187500.000000", + "total_supply": "25000000.000000", + "max_supply": "100000000.000000", + "current_coinhour_supply": "23499025077", + "total_coinhour_supply": "93679828577", + "unlocked_distribution_addresses": [ + "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm" + ], + "locked_distribution_addresses": [ + "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm" + ] +} +``` + +### Richlist show top N addresses by uxouts + +API sets: `READ` + +``` +URI: /api/v1/richlist +Method: GET +Args: + n: top N addresses, [default 20, returns all if <= 0]. + include-distribution: include distribution addresses or not, default false. +``` + +Example: + +```sh +curl "http://127.0.0.1:6420/api/v1/richlist?n=4&include-distribution=true" +``` + +Result: + +```json +{ + "richlist": [ + { + "address": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "locked": true + } + ] +} +``` + +### Count the addresses that currently have unspent outputs (coins) + +API sets: `READ` + +``` +URI: /api/v1/addresscount +Method: GET +``` + +Example: + +```sh +curl "http://127.0.0.1:6420/api/v1/addresscount" +``` + +Result: + +```json +{ + "count": 10103 +} +``` + +## Network status + +### Get information for a specific connection + +API sets: `STATUS`, `READ` + +``` +URI: /api/v1/network/connection +Method: GET +Args: + addr: ip:port address of a known connection +``` + +Connection `"state"` value can be `"pending"`, `"connected"` or `"introduced"`. + +* The `"pending"` state is prior to connection establishment. +* The `"connected"` state is after connection establishment, but before the introduction handshake has completed. +* The `"introduced"` state is after the introduction handshake has completed. + +Example: + +```sh +curl 'http://127.0.0.1:6420/api/v1/network/connection?addr=176.9.84.75:6000' +``` + +Result: + +```json +{ + "id": 109548, + "address": "176.9.84.75:6000", + "last_sent": 1520675817, + "last_received": 1520675817, + "connected_at": 1520675700, + "outgoing": false, + "state": "introduced", + "mirror": 719118746, + "height": 181, + "listen_port": 6000, + "user_agent": "skycoin:0.25.0", + "is_trusted_peer": true, + "unconfirmed_verify_transaction": { + "burn_factor": 10, + "max_transaction_size": 32768, + "max_decimals": 3 + } +} +``` + +### Get a list of all connections + +API sets: `STATUS`, `READ` + +``` +URI: /api/v1/network/connections +Method: GET +Args: + states: [optional] comma-separated list of connection states ("pending", "connected" or "introduced"). Defaults to "connected,introduced" + direction: [optional] "outgoing" or "incoming". If not provided, both are included. +``` + +Connection `"state"` value can be `"pending"`, `"connected"` or `"introduced"`. + +* The `"pending"` state is prior to connection establishment. +* The `"connected"` state is after connection establishment, but before the introduction handshake has completed. +* The `"introduced"` state is after the introduction handshake has completed. + +By default, both incoming and outgoing connections in the `"connected"` or `"introduced"` state are returned. + +Example: + +```sh +curl 'http://127.0.0.1:6420/api/v1/network/connections' +``` + +Result: + +```json +{ + "connections": [ + { + "id": 99107, + "address": "139.162.161.41:20002", + "last_sent": 1520675750, + "last_received": 1520675750, + "connected_at": 1520675500, + "outgoing": false, + "state": "introduced", + "mirror": 1338939619, + "listen_port": 20002, + "height": 180, + "user_agent": "skycoin:0.25.0", + "is_trusted_peer": true, + "unconfirmed_verify_transaction": { + "burn_factor": 10, + "max_transaction_size": 32768, + "max_decimals": 3 + } + }, + { + "id": 109548, + "address": "176.9.84.75:6000", + "last_sent": 1520675751, + "last_received": 1520675751, + "connected_at": 1520675751, + "state": "connected", + "outgoing": true, + "mirror": 0, + "listen_port": 6000, + "height": 0, + "user_agent": "", + "is_trusted_peer": true, + "unconfirmed_verify_transaction": { + "burn_factor": 0, + "max_transaction_size": 0, + "max_decimals": 0 + } + }, + { + "id": 99115, + "address": "185.120.34.60:6000", + "last_sent": 1520675754, + "last_received": 1520675754, + "connected_at": 1520673013, + "outgoing": false, + "state": "introduced", + "mirror": 1931713869, + "listen_port": 6000, + "height": 180, + "user_agent": "", + "is_trusted_peer": true, + "unconfirmed_verify_transaction": { + "burn_factor": 0, + "max_transaction_size": 0, + "max_decimals": 0 + } + } + ] +} +``` + + +### Get a list of all default connections + +API sets: `STATUS`, `READ` + +``` +URI: /api/v1/network/defaultConnections +Method: GET +``` + +Returns addresses in the default hardcoded list of peers. + +Example: + +```sh +curl 'http://127.0.0.1:6420/api/v1/network/defaultConnections' +``` + +Result: + +```json +[ + "104.237.142.206:6000", + "118.178.135.93:6000", + "139.162.7.132:6000", + "172.104.85.6:6000", + "176.58.126.224:6000", + "47.88.33.156:6000" +] +``` + +### Get a list of all trusted connections + +API sets: `STATUS`, `READ` + +``` +URI: /api/v1/network/connections/trust +Method: GET +``` + +Returns addresses marked as trusted in the peerlist. +This is typically equal to the list of addresses in the default hardcoded list of peers. + +Example: + +```sh +curl 'http://127.0.0.1:6420/api/v1/network/connections/trust' +``` + +Result: + +```json +[ + "104.237.142.206:6000", + "118.178.135.93:6000", + "139.162.7.132:6000", + "172.104.85.6:6000", + "176.58.126.224:6000", + "47.88.33.156:6000" +] +``` + +### Get a list of all connections discovered through peer exchange + +API sets: `STATUS`, `READ` + +``` +URI: /api/v1/network/connections/exchange +Method: GET +``` + +Returns addresses from the peerlist that are known to have an open port. + +Example: + +```sh +curl 'http://127.0.0.1:6420/api/v1/network/connections/exchange' +``` + +Result: + +```json +[ + "104.237.142.206:6000", + "116.62.220.158:7200", + "118.237.210.163:6000", + "139.162.161.41:20000", + "139.162.161.41:20001", + "139.162.161.41:20002", + "139.162.33.154:6000", + "139.162.7.132:6000", + "155.94.137.34:6000", + "164.132.108.92:6000", + "165.227.199.63:6000", + "172.104.145.6:6000", + "172.104.52.230:7200", + "172.104.85.6:6000", + "173.212.205.184:6000", + "173.249.30.221:6000", + "176.58.126.224:6000", + "176.9.84.75:6000", + "185.120.34.60:6000", + "35.201.160.163:6000", + "47.88.33.156:6000" +] +``` + +### Disconnect a peer + +API sets: `NET_CTRL` + +``` +URI: /api/v1/network/connection/disconnect +Method: POST +Args: + id: ID of the connection + +Returns 404 if the connection is not found. +``` + +Disconnects a peer by ID. + +Example: + +```sh +curl -X POST 'http://127.0.0.1:6420/api/v1/network/connection/disconnect?id=999' +``` + +Result: + +```json +{} +``` + +## Migrating from the unversioned API + +The unversioned API are the API endpoints without an `/api` prefix. +These endpoints are all prefixed with `/api/v1` now. + +`-enable-unversioned-api` was added as an option to assist migration to `/api/v1` +but this option was removed in v0.26.0. + +To migrate from the unversioned API, add `/api/v1` to all endpoints that you call +that do not have an `/api` prefix already. + +For example, `/block` would become `/api/v1/block`. + +## Migrating from the JSONRPC API + +The JSONRPC-2.0 RPC API was deprecated in v0.25.0 and removed in v0.26.0. + +Anyone still using this can follow this guide to migrate to the REST API: + +* `get_status` is replaced by `/api/v1/blockchain/metadata` and `/api/v1/health` +* `get_lastblocks` is replaced by `/api/v1/last_blocks` +* `get_blocks` is replaced by `/api/v1/blocks` +* `get_outputs` is replaced by `/api/v1/outputs` +* `inject_transaction` is replaced by `/api/v1/injectTransaction` +* `get_transaction` is replaced by `/api/v1/transaction` + +## Migrating from /api/v1/spend + +The `POST /api/v1/spend` endpoint is deprecated and will be removed in v0.26.0. + +To migrate from it, use [`POST /api/v1/wallet/transaction`](#create-transaction) followed by [`POST /api/v1/injectTransaction`](#inject-raw-transaction). +Do not create another transaction before injecting the created transaction, otherwise you might create two conflicting transactions. + +`POST /api/v1/wallet/transaction` has more options for creating the transaction than the `/api/v1/spend` endpoint. +To replicate the same behavior as `/api/v1/spend`, use the following request body template: + +```json +{ + "hours_selection": { + "type": "auto", + "mode": "share", + "share_factor": "0.5", + }, + "wallet": { + "id": "$wallet_id", + "password": "$password" + }, + "to": [{ + "address": "$dst", + "coins": "$coins" + }] +} +``` + +You must use a string for `"coins"` instead of an integer measured in "droplets" (the smallest unit of currency in Skycoin, 1/1000000 of a skycoin). +For example, if you sent 1 Skycoin with `/api/v1/spend` you would have specified the `coins` field as `1000000`. +Now, you would specify it as `"1"`. + +Some examples: + +* 123.456 coins: before `123456000`, now `"123.456"` +* 0.1 coins: before `100000`, now `"0.1"` +* 1 coin: before `1000000`, now `"1"` + +Extra zeros on the `"coins"` string are ok, for example `"1"` is the same as `"1.0"` or `"1.000000"`. + +Only provide `"password"` if the wallet is encrypted. Note that decryption can take a few seconds, and this can impact +throughput. + +The request header `Content-Type` must be `application/json`. + +The response to `POST /api/v1/wallet/transaction` will include a verbose decoded transaction with details +and the hex-encoded binary transaction in the `"encoded_transaction"` field. +Use the value of `"encoded_transaction"` as the `"rawtx"` value in the request to `/api/v1/injectTransaction`. + +## Migration from /api/v1/explorer/address + +The `GET /api/v1/explorer/address` was deprecated in v0.25.0 and removed in v0.26.0. + +To migrate from it, use [`GET /api/v1/transactions?verbose=1`](#get-transactions-for-addresses). + +`/api/v1/explorer/address` accepted a single `address` query parameter. `/api/v1/transactions` uses an `addrs` query parameter and +accepts multiple addresses at once. + +The response data is the same but the structure is slightly different. Compare the follow two example responses: + +`/api/v1/explorer/address?address=WzPDgdfL1NzSbX96tscUNXUqtCRLjaBugC`: + +```json +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 38076, + "block_seq": 15493 + }, + "timestamp": 1518878675, + "length": 183, + "type": 0, + "txid": "6d8e2f8b436a2f38d604b3aa1196ef2176779c5e11e33fbdd09f993fe659c39f", + "inner_hash": "8da7c64dcedeeb6aa1e0d21fb84a0028dcd68e6801f1a3cc0224fdd50682046f", + "fee": 126249, + "sigs": [ + "c60e43980497daad59b4c72a2eac053b1584f960c57a5e6ac8337118dccfcee4045da3f60d9be674867862a13fdd87af90f4b85cbf39913bde13674e0a039b7800" + ], + "inputs": [ + { + "uxid": "349b06e5707f633fd2d8f048b687b40462d875d968b246831434fb5ab5dcac38", + "owner": "WzPDgdfL1NzSbX96tscUNXUqtCRLjaBugC", + "coins": "125.000000", + "hours": 34596, + "calculated_hours": 178174 + } + ], + "outputs": [ + { + "uxid": "5b4a79c7de2e9099e083bbc8096619ae76ba6fbe34875c61bbe2d3bfa6b18b99", + "dst": "2NfNKsaGJEndpSajJ6TsKJfsdDjW2gFsjXg", + "coins": "125.000000", + "hours": 51925 + } + ] + } +] +``` + +`/api/v1/transactions?verbose=1&addrs=WzPDgdfL1NzSbX96tscUNXUqtCRLjaBugC`: + +```json +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 57564, + "block_seq": 7498 + }, + "time": 1514743602, + "txn": { + "timestamp": 1514743602, + "length": 220, + "type": 0, + "txid": "df5bcef198fe6e96d496c30482730f895cabc1d55b338afe5633b0c2889d02f9", + "inner_hash": "4677ff9b9b56485495a45693cc09f8496199929fccb52091d32f2d3cf2ee8a41", + "fee": 69193, + "sigs": [ + "8e1f6f621a11f737ac2031be975d4b2fc17bf9f17a0da0a2fe219ee018011ab506e2ad0367be302a8d859cc355c552313389cd0aa9fa98dc7d2085a52f11ef5a00" + ], + "inputs": [ + { + "uxid": "2374201ff29f1c024ccfc6c53160e741d06720562853ad3613c121acd8389031", + "owner": "2GgFvqoyk9RjwVzj8tqfcXVXB4orBwoc9qv", + "coins": "162768.000000", + "hours": 485, + "calculated_hours": 138385 + } + ], + "outputs": [ + { + "uxid": "63f299fc85fe6fc34d392718eee55909837c7231b6ffd93e5a9a844c4375b313", + "dst": "2GgFvqoyk9RjwVzj8tqfcXVXB4orBwoc9qv", + "coins": "162643.000000", + "hours": 34596 + }, + { + "uxid": "349b06e5707f633fd2d8f048b687b40462d875d968b246831434fb5ab5dcac38", + "dst": "WzPDgdfL1NzSbX96tscUNXUqtCRLjaBugC", + "coins": "125.000000", + "hours": 34596 + } + ] + } + } +] +``` + +The transaction data is wrapped in a `"txn"` field. A `"time"` field is present at the top level. This `"time"` field +is either the confirmation timestamp of a confirmed transaction or the last received time of an unconfirmed transaction. diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/address.go b/vendor/github.com/SkycoinProject/skycoin/src/api/address.go new file mode 100644 index 00000000..93f2e83d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/address.go @@ -0,0 +1,56 @@ +package api + +import ( + "encoding/json" + "net/http" + + "github.com/SkycoinProject/skycoin/src/cipher" +) + +// VerifyAddressRequest is the request data for POST /api/v2/address/verify +type VerifyAddressRequest struct { + Address string `json:"address"` +} + +// VerifyAddressResponse is returned by POST /api/v2/address/verify +type VerifyAddressResponse struct { + Version byte `json:"version"` +} + +// addressVerifyHandler verifies a Skycoin address +// Method: POST +// URI: /api/v2/address/verify +func addressVerifyHandler(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + resp := NewHTTPErrorResponse(http.StatusMethodNotAllowed, "") + writeHTTPResponse(w, resp) + return + } + + var req VerifyAddressRequest + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + resp := NewHTTPErrorResponse(http.StatusBadRequest, err.Error()) + writeHTTPResponse(w, resp) + return + } + + if req.Address == "" { + resp := NewHTTPErrorResponse(http.StatusBadRequest, "address is required") + writeHTTPResponse(w, resp) + return + } + + addr, err := cipher.DecodeBase58Address(req.Address) + + if err != nil { + resp := NewHTTPErrorResponse(http.StatusUnprocessableEntity, err.Error()) + writeHTTPResponse(w, resp) + return + } + + writeHTTPResponse(w, HTTPResponse{ + Data: VerifyAddressResponse{ + Version: addr.Version, + }, + }) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/address_test.go b/vendor/github.com/SkycoinProject/skycoin/src/api/address_test.go new file mode 100644 index 00000000..9d2fdc39 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/address_test.go @@ -0,0 +1,148 @@ +package api + +import ( + "encoding/json" + "net/http" + "net/http/httptest" + "strings" + "testing" + + "github.com/stretchr/testify/require" +) + +func toJSON(t *testing.T, r interface{}) string { + b, err := json.Marshal(r) + require.NoError(t, err) + return string(b) +} + +func TestVerifyAddress(t *testing.T) { + cases := []struct { + name string + method string + status int + contentType string + csrfDisabled bool + httpBody string + httpResponse HTTPResponse + }{ + { + name: "405", + method: http.MethodGet, + status: http.StatusMethodNotAllowed, + httpResponse: NewHTTPErrorResponse(http.StatusMethodNotAllowed, ""), + }, + + { + name: "415 - Unsupported Media Type", + method: http.MethodPost, + contentType: ContentTypeForm, + status: http.StatusUnsupportedMediaType, + httpResponse: NewHTTPErrorResponse(http.StatusUnsupportedMediaType, ""), + }, + + { + name: "400 - EOF", + method: http.MethodPost, + contentType: ContentTypeJSON, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "EOF"), + }, + + { + name: "400 - Missing address", + method: http.MethodPost, + contentType: ContentTypeJSON, + status: http.StatusBadRequest, + httpBody: "{}", + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "address is required"), + }, + + { + name: "422 - Invalid checksum", + method: http.MethodPost, + status: http.StatusUnprocessableEntity, + httpBody: toJSON(t, VerifyAddressRequest{ + Address: "7apQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD", + }), + httpResponse: NewHTTPErrorResponse(http.StatusUnprocessableEntity, "Invalid checksum"), + }, + { + name: "200", + method: http.MethodPost, + status: http.StatusOK, + httpBody: toJSON(t, VerifyAddressRequest{ + Address: "7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD", + }), + httpResponse: HTTPResponse{ + Data: VerifyAddressResponse{ + Version: 0, + }, + }, + }, + { + name: "200 - csrf disabled", + method: http.MethodPost, + status: http.StatusOK, + httpBody: toJSON(t, VerifyAddressRequest{ + Address: "7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD", + }), + httpResponse: HTTPResponse{ + Data: VerifyAddressResponse{ + Version: 0, + }, + }, + csrfDisabled: true, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v2/address/verify" + gateway := &MockGatewayer{} + + req, err := http.NewRequest(tc.method, endpoint, strings.NewReader(tc.httpBody)) + require.NoError(t, err) + + contentType := tc.contentType + if contentType == "" { + contentType = ContentTypeJSON + } + + req.Header.Set("Content-Type", contentType) + + if tc.csrfDisabled { + setCSRFParameters(t, tokenInvalid, req) + } else { + setCSRFParameters(t, tokenValid, req) + } + + rr := httptest.NewRecorder() + cfg := defaultMuxConfig() + cfg.disableCSRF = tc.csrfDisabled + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + var rsp ReceivedHTTPResponse + err = json.Unmarshal(rr.Body.Bytes(), &rsp) + require.NoError(t, err) + + require.Equal(t, tc.httpResponse.Error, rsp.Error) + + if rsp.Data == nil { + require.Nil(t, tc.httpResponse.Data) + } else { + require.NotNil(t, tc.httpResponse.Data) + + var addrRsp VerifyAddressResponse + err := json.Unmarshal(rsp.Data, &addrRsp) + require.NoError(t, err) + + require.Equal(t, tc.httpResponse.Data.(VerifyAddressResponse), addrRsp) + } + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/blockchain.go b/vendor/github.com/SkycoinProject/skycoin/src/api/blockchain.go new file mode 100644 index 00000000..a986ca3a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/blockchain.go @@ -0,0 +1,395 @@ +package api + +// APIs for blockchain related information + +import ( + "errors" + "fmt" + "net/http" + "strconv" + "strings" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/readable" + wh "github.com/SkycoinProject/skycoin/src/util/http" + "github.com/SkycoinProject/skycoin/src/visor" +) + +// blockchainMetadataHandler returns the blockchain metadata +// Method: GET +// URI: /api/v1/blockchain/metadata +func blockchainMetadataHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + visorMetadata, err := gateway.GetBlockchainMetadata() + if err != nil { + err = fmt.Errorf("gateway.GetBlockchainMetadata failed: %v", err) + wh.Error500(w, err.Error()) + return + } + + // This can happen if the node is shut down at the right moment, guard against a panic + if visorMetadata == nil { + err = errors.New("gateway.GetBlockchainMetadata metadata is nil") + wh.Error500(w, err.Error()) + return + } + + metadata := readable.NewBlockchainMetadata(*visorMetadata) + + wh.SendJSONOr500(logger, w, metadata) + } +} + +// blockchainProgressHandler returns the blockchain sync progress +// Method: GET +// URI: /api/v1/blockchain/progress +func blockchainProgressHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + headSeq, _, err := gateway.HeadBkSeq() + if err != nil { + err = fmt.Errorf("gateway.HeadBkSeq failed: %v", err) + wh.Error500(w, err.Error()) + return + } + + progress := gateway.GetBlockchainProgress(headSeq) + + // This can happen if the node is shut down at the right moment, guard against a panic + if progress == nil { + err = errors.New("gateway.GetBlockchainProgress progress is nil") + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, readable.NewBlockchainProgress(progress)) + } +} + +func parseBoolFlag(v string) (bool, error) { + if v == "" { + return false, nil + } + + return strconv.ParseBool(v) +} + +// blockHandler returns a block by hash or seq +// Method: GET +// URI: /api/v1/block +// Args: +// hash [transaction hash string] +// seq [int] +// Note: only one of hash or seq is allowed +func blockHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + hash := r.FormValue("hash") + seq := r.FormValue("seq") + + verbose, err := parseBoolFlag(r.FormValue("verbose")) + if err != nil { + wh.Error400(w, "Invalid value for verbose") + return + } + + switch { + case hash == "" && seq == "": + wh.Error400(w, "should specify one filter, hash or seq") + return + case hash != "" && seq != "": + wh.Error400(w, "should only specify one filter, hash or seq") + return + } + + var h cipher.SHA256 + if hash != "" { + var err error + h, err = cipher.SHA256FromHex(hash) + if err != nil { + wh.Error400(w, err.Error()) + return + } + } + + var uSeq uint64 + if seq != "" { + var err error + uSeq, err = strconv.ParseUint(seq, 10, 64) + if err != nil { + wh.Error400(w, fmt.Sprintf("Invalid seq value %q", seq)) + return + } + } + + if verbose { + var b *coin.SignedBlock + var inputs [][]visor.TransactionInput + + switch { + case hash != "": + b, inputs, err = gateway.GetSignedBlockByHashVerbose(h) + case seq != "": + b, inputs, err = gateway.GetSignedBlockBySeqVerbose(uSeq) + } + + if err != nil { + wh.Error500(w, err.Error()) + return + } + + if b == nil { + wh.Error404(w, "") + return + } + + rb, err := readable.NewBlockVerbose(b.Block, inputs) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, rb) + return + } + + var b *coin.SignedBlock + switch { + case hash != "": + b, err = gateway.GetSignedBlockByHash(h) + case seq != "": + b, err = gateway.GetSignedBlockBySeq(uSeq) + } + + if err != nil { + wh.Error500(w, err.Error()) + return + } + + if b == nil { + wh.Error404(w, "") + return + } + + rb, err := readable.NewBlock(b.Block) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, rb) + } +} + +// blocksHandler returns blocks between a start and end point, +// or an explicit list of sequences. +// If using start and end, the block sequences include both the start and end point. +// Explicit sequences cannot be combined with start and end. +// Method: GET, POST +// URI: /api/v1/blocks +// Args: +// start [int] +// end [int] +// seqs [comma separated list of ints] +// verbose [bool] +func blocksHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet && r.Method != http.MethodPost { + wh.Error405(w) + return + } + + verbose, err := parseBoolFlag(r.FormValue("verbose")) + if err != nil { + wh.Error400(w, "Invalid value for verbose") + return + } + + sStart := r.FormValue("start") + sEnd := r.FormValue("end") + sSeqs := r.FormValue("seqs") + + if sSeqs != "" && (sStart != "" || sEnd != "") { + wh.Error400(w, "seqs cannot be used with start or end") + return + } + + if sSeqs == "" && sStart == "" && sEnd == "" { + wh.Error400(w, "At least one of seqs or start or end are required") + return + } + + var start uint64 + var end uint64 + var seqs []uint64 + + if sStart != "" { + var err error + start, err = strconv.ParseUint(sStart, 10, 64) + if err != nil { + wh.Error400(w, fmt.Sprintf("Invalid start value %q", sStart)) + return + } + } + + if sEnd != "" { + var err error + end, err = strconv.ParseUint(sEnd, 10, 64) + if err != nil { + wh.Error400(w, fmt.Sprintf("Invalid end value %q", sEnd)) + return + } + } + + if sSeqs != "" { + ssSeqs := strings.Split(sSeqs, ",") + seqs = make([]uint64, len(ssSeqs)) + seqsMap := make(map[uint64]struct{}, len(ssSeqs)) + for i, s := range ssSeqs { + x, err := strconv.ParseUint(s, 10, 64) + if err != nil { + wh.Error400(w, fmt.Sprintf("Invalid sequence %q at seqs[%d]", s, i)) + return + } + + if _, ok := seqsMap[x]; ok { + wh.Error400(w, fmt.Sprintf("Duplicate sequence %d at seqs[%d]", x, i)) + return + } + seqsMap[x] = struct{}{} + + seqs[i] = x + } + } + + if verbose { + var blocks []coin.SignedBlock + var inputs [][][]visor.TransactionInput + var err error + + if len(seqs) > 0 { + blocks, inputs, err = gateway.GetBlocksVerbose(seqs) + } else { + blocks, inputs, err = gateway.GetBlocksInRangeVerbose(start, end) + } + + if err != nil { + switch err.(type) { + case visor.ErrBlockNotExist: + wh.Error404(w, err.Error()) + default: + wh.Error500(w, err.Error()) + } + return + } + + rb, err := readable.NewBlocksVerbose(blocks, inputs) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, rb) + } else { + var blocks []coin.SignedBlock + var err error + + if len(seqs) > 0 { + blocks, err = gateway.GetBlocks(seqs) + } else { + blocks, err = gateway.GetBlocksInRange(start, end) + } + + if err != nil { + switch err.(type) { + case visor.ErrBlockNotExist: + wh.Error404(w, err.Error()) + default: + wh.Error500(w, err.Error()) + } + return + } + + rb, err := readable.NewBlocks(blocks) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, rb) + } + } +} + +// lastBlocksHandler returns the most recent N blocks on the blockchain +// Method: GET +// URI: /api/v1/last_blocks +// Args: +// num [int] +// verbose [bool] +func lastBlocksHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + verbose, err := parseBoolFlag(r.FormValue("verbose")) + if err != nil { + wh.Error400(w, "Invalid value for verbose") + return + } + + num := r.FormValue("num") + n, err := strconv.ParseUint(num, 10, 64) + if err != nil { + wh.Error400(w, fmt.Sprintf("Invalid num value %q", num)) + return + } + + if verbose { + blocks, inputs, err := gateway.GetLastBlocksVerbose(n) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + rb, err := readable.NewBlocksVerbose(blocks, inputs) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, rb) + return + } + + blocks, err := gateway.GetLastBlocks(n) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + rb, err := readable.NewBlocks(blocks) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, rb) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/blockchain_test.go b/vendor/github.com/SkycoinProject/skycoin/src/api/blockchain_test.go new file mode 100644 index 00000000..47353b93 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/blockchain_test.go @@ -0,0 +1,1222 @@ +package api + +import ( + "io" + "net/http" + "net/http/httptest" + "net/url" + "strings" + "testing" + + "encoding/json" + + "math" + + "github.com/stretchr/testify/require" + + "errors" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/daemon" + "github.com/SkycoinProject/skycoin/src/readable" + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/visor" +) + +func TestGetBlockchainMetadata(t *testing.T) { + cases := []struct { + name string + method string + status int + err string + getBlockchainMetadataResult *visor.BlockchainMetadata + getBlockchainMetadataErr error + result readable.BlockchainMetadata + }{ + { + name: "405 method not allowed", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "500 - GetBlockchainMetadata error", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gateway.GetBlockchainMetadata failed: GetBlockchainMetadata error", + getBlockchainMetadataErr: errors.New("GetBlockchainMetadata error"), + }, + { + name: "500 - nil visor.BlockchainMetadata", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gateway.GetBlockchainMetadata metadata is nil", + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + getBlockchainMetadataResult: &visor.BlockchainMetadata{ + HeadBlock: coin.SignedBlock{}, + Unspents: 12, + Unconfirmed: 13, + }, + result: readable.BlockchainMetadata{ + Head: readable.BlockHeader{ + Hash: "7b8ec8dd836b564f0c85ad088fc744de820345204e154bc1503e04e9d6fdd9f1", + PreviousHash: "0000000000000000000000000000000000000000000000000000000000000000", + BodyHash: "0000000000000000000000000000000000000000000000000000000000000000", + UxHash: "0000000000000000000000000000000000000000000000000000000000000000", + }, + Unspents: 12, + Unconfirmed: 13, + }, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + gateway := &MockGatewayer{} + gateway.On("GetBlockchainMetadata").Return(tc.getBlockchainMetadataResult, tc.getBlockchainMetadataErr) + + endpoint := "/api/v1/blockchain/metadata" + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + setCSRFParameters(t, tokenValid, req) + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = false + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v` %s", status, tc.status, strings.TrimSpace(rr.Body.String())) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, want `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg readable.BlockchainMetadata + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.result, msg) + } + }) + } +} + +func TestGetBlockchainProgress(t *testing.T) { + addr1 := testutil.MakeAddress() + addr2 := testutil.MakeAddress() + + cases := []struct { + name string + method string + status int + err string + headBkSeq uint64 + headBkSeqErr error + getBlockchainProgressResult *daemon.BlockchainProgress + result readable.BlockchainProgress + }{ + { + name: "405 method not allowed", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + + { + name: "500 - HeadBkSeq error", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gateway.HeadBkSeq failed: HeadBkSeq error", + headBkSeqErr: errors.New("HeadBkSeq error"), + }, + + { + name: "500 - nil daemon.BlockchainProgress", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gateway.GetBlockchainProgress progress is nil", + }, + + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + headBkSeq: 99, + getBlockchainProgressResult: &daemon.BlockchainProgress{ + Peers: []daemon.PeerBlockchainHeight{ + { + Address: addr1.String(), + Height: 101, + }, + { + Address: addr2.String(), + Height: 102, + }, + }, + Current: 99, + Highest: 102, + }, + result: readable.BlockchainProgress{ + Peers: []readable.PeerBlockchainHeight{ + { + Address: addr1.String(), + Height: 101, + }, + { + Address: addr2.String(), + Height: 102, + }, + }, + Current: 99, + Highest: 102, + }, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + gateway := &MockGatewayer{} + gateway.On("HeadBkSeq").Return(tc.headBkSeq, true, tc.headBkSeqErr) + gateway.On("GetBlockchainProgress", tc.headBkSeq).Return(tc.getBlockchainProgressResult) + + endpoint := "/api/v1/blockchain/progress" + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + setCSRFParameters(t, tokenValid, req) + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = false + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v` %s", status, tc.status, strings.TrimSpace(rr.Body.String())) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, want `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg readable.BlockchainProgress + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.result, msg) + } + }) + } +} + +func makeBadBlock(t *testing.T) *coin.Block { + genPublic, _ := cipher.GenerateKeyPair() + genAddress := cipher.AddressFromPubKey(genPublic) + var genCoins uint64 = 1000e6 + var genTime uint64 = 1000 + now := genTime + 100 + preBlock, err := coin.NewGenesisBlock(genAddress, genCoins, genTime) + require.NoError(t, err) + uxHash := testutil.RandSHA256(t) + txn := coin.Transaction{ + In: []cipher.SHA256{ + testutil.RandSHA256(t), + }, + } + err = txn.PushOutput(genAddress, math.MaxInt64+1, 255) + require.NoError(t, err) + b, err := coin.NewBlock(*preBlock, now, uxHash, coin.Transactions{txn}, func(t *coin.Transaction) (uint64, error) { + return 0, nil + }) + require.NoError(t, err) + require.NotEqual(t, b.Head.BkSeq, uint64(0)) + require.NotEmpty(t, b.Body.Transactions) + for i, txn := range b.Body.Transactions { + require.NotEmpty(t, txn.In, "txn %d/%d", i+1, len(b.Body.Transactions)) + } + return b +} + +func TestGetBlock(t *testing.T) { + badBlock := makeBadBlock(t) + validHashString := testutil.RandSHA256(t).Hex() + validSHA256, err := cipher.SHA256FromHex(validHashString) + require.NoError(t, err) + + type verboseResult struct { + Block *coin.SignedBlock + Inputs [][]visor.TransactionInput + } + + tt := []struct { + name string + method string + status int + err string + hash string + sha256 cipher.SHA256 + seqStr string + seq uint64 + verbose bool + verboseStr string + gatewayGetBlockByHashResult *coin.SignedBlock + gatewayGetBlockByHashErr error + gatewayGetBlockBySeqResult *coin.SignedBlock + gatewayGetBlockBySeqErr error + gatewayGetBlockByHashVerboseResult verboseResult + gatewayGetBlockByHashVerboseErr error + gatewayGetBlockBySeqVerboseResult verboseResult + gatewayGetBlockBySeqVerboseErr error + response interface{} + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "400 - no seq and hash", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - should specify one filter, hash or seq", + }, + { + name: "400 - seq and hash simultaneously", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - should only specify one filter, hash or seq", + hash: "hash", + seqStr: "seq", + }, + { + name: "400 - hash error: encoding/hex err invalid byte: U+0068 'h'", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - encoding/hex: invalid byte: U+0068 'h'", + hash: "hash", + }, + { + name: "400 - hash error: encoding/hex: odd length hex string", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - encoding/hex: odd length hex string", + hash: "1234abc", + }, + { + name: "400 - hash error: Invalid hex length", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - Invalid hex length", + hash: "1234abcd", + }, + { + name: "404 - block by hash does not exist", + method: http.MethodGet, + status: http.StatusNotFound, + err: "404 Not Found", + hash: validHashString, + sha256: validSHA256, + }, + { + name: "400 - seq error: invalid syntax", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - Invalid seq value \"badseq\"", + seqStr: "badseq", + }, + { + name: "404 - block by seq does not exist", + method: http.MethodGet, + status: http.StatusNotFound, + err: "404 Not Found", + seqStr: "1", + seq: 1, + }, + { + name: "500 - readable.NewBlock error", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - Droplet string conversion failed: Value is too large", + seqStr: "1", + seq: 1, + gatewayGetBlockBySeqResult: &coin.SignedBlock{ + Block: *badBlock, + }, + }, + { + name: "500 - get block by hash error", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - GetSignedBlockByHash failed", + hash: validHashString, + sha256: validSHA256, + gatewayGetBlockByHashErr: errors.New("GetSignedBlockByHash failed"), + }, + { + name: "500 - get block by seq error", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - GetSignedBlockBySeq failed", + seqStr: "1", + seq: 1, + gatewayGetBlockBySeqErr: errors.New("GetSignedBlockBySeq failed"), + }, + { + name: "200 - get block by seq", + method: http.MethodGet, + status: http.StatusOK, + seqStr: "1", + seq: 1, + gatewayGetBlockBySeqResult: &coin.SignedBlock{}, + response: &readable.Block{ + Head: readable.BlockHeader{ + BkSeq: 0x0, + Hash: "7b8ec8dd836b564f0c85ad088fc744de820345204e154bc1503e04e9d6fdd9f1", + PreviousHash: "0000000000000000000000000000000000000000000000000000000000000000", + Time: 0x0, + Fee: 0x0, + Version: 0x0, + BodyHash: "0000000000000000000000000000000000000000000000000000000000000000", + UxHash: "0000000000000000000000000000000000000000000000000000000000000000", + }, + Body: readable.BlockBody{ + Transactions: []readable.Transaction{}, + }, + }, + }, + { + name: "200 - get block by hash", + method: http.MethodGet, + status: http.StatusOK, + hash: validHashString, + sha256: validSHA256, + gatewayGetBlockByHashResult: &coin.SignedBlock{}, + response: &readable.Block{ + Head: readable.BlockHeader{ + BkSeq: 0x0, + Hash: "7b8ec8dd836b564f0c85ad088fc744de820345204e154bc1503e04e9d6fdd9f1", + PreviousHash: "0000000000000000000000000000000000000000000000000000000000000000", + Time: 0x0, + Fee: 0x0, + Version: 0x0, + BodyHash: "0000000000000000000000000000000000000000000000000000000000000000", + UxHash: "0000000000000000000000000000000000000000000000000000000000000000", + }, + Body: readable.BlockBody{ + Transactions: []readable.Transaction{}, + }, + }, + }, + + { + name: "200 - get block by hash verbose", + method: http.MethodGet, + status: http.StatusOK, + hash: validHashString, + sha256: validSHA256, + verbose: true, + verboseStr: "1", + gatewayGetBlockByHashVerboseResult: verboseResult{ + Block: &coin.SignedBlock{}, + Inputs: nil, + }, + response: &readable.BlockVerbose{ + Head: readable.BlockHeader{ + BkSeq: 0x0, + Hash: "7b8ec8dd836b564f0c85ad088fc744de820345204e154bc1503e04e9d6fdd9f1", + PreviousHash: "0000000000000000000000000000000000000000000000000000000000000000", + Time: 0x0, + Fee: 0x0, + Version: 0x0, + BodyHash: "0000000000000000000000000000000000000000000000000000000000000000", + UxHash: "0000000000000000000000000000000000000000000000000000000000000000", + }, + Body: readable.BlockBodyVerbose{ + Transactions: []readable.BlockTransactionVerbose{}, + }, + }, + }, + + { + name: "200 - get block by seq verbose", + method: http.MethodGet, + status: http.StatusOK, + seq: 1, + seqStr: "1", + verbose: true, + verboseStr: "1", + gatewayGetBlockBySeqVerboseResult: verboseResult{ + Block: &coin.SignedBlock{}, + Inputs: nil, + }, + response: &readable.BlockVerbose{ + Head: readable.BlockHeader{ + BkSeq: 0x0, + Hash: "7b8ec8dd836b564f0c85ad088fc744de820345204e154bc1503e04e9d6fdd9f1", + PreviousHash: "0000000000000000000000000000000000000000000000000000000000000000", + Time: 0x0, + Fee: 0x0, + Version: 0x0, + BodyHash: "0000000000000000000000000000000000000000000000000000000000000000", + UxHash: "0000000000000000000000000000000000000000000000000000000000000000", + }, + Body: readable.BlockBodyVerbose{ + Transactions: []readable.BlockTransactionVerbose{}, + }, + }, + }, + + { + name: "500 - get block by hash verbose error", + method: http.MethodGet, + status: http.StatusInternalServerError, + hash: validHashString, + sha256: validSHA256, + verbose: true, + verboseStr: "1", + gatewayGetBlockByHashVerboseErr: errors.New("GetSignedBlockByHashVerbose failed"), + err: "500 Internal Server Error - GetSignedBlockByHashVerbose failed", + }, + + { + name: "500 - get block by seq verbose error", + method: http.MethodGet, + status: http.StatusInternalServerError, + seq: 1, + seqStr: "1", + verbose: true, + verboseStr: "1", + gatewayGetBlockBySeqVerboseErr: errors.New("GetSignedBlockBySeqVerbose failed"), + err: "500 Internal Server Error - GetSignedBlockBySeqVerbose failed", + }, + + { + name: "404 - get block by hash verbose not found", + method: http.MethodGet, + status: http.StatusNotFound, + hash: validHashString, + sha256: validSHA256, + verbose: true, + verboseStr: "1", + err: "404 Not Found", + }, + + { + name: "404 - get block by seq verbose not found", + method: http.MethodGet, + status: http.StatusNotFound, + seq: 1, + seqStr: "1", + verbose: true, + verboseStr: "1", + err: "404 Not Found", + }, + + { + name: "400 - invalid verbose flag", + method: http.MethodGet, + status: http.StatusBadRequest, + seq: 1, + seqStr: "1", + verbose: true, + verboseStr: "asdasdasd", + err: "400 Bad Request - Invalid value for verbose", + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &MockGatewayer{} + + gateway.On("GetSignedBlockByHash", tc.sha256).Return(tc.gatewayGetBlockByHashResult, tc.gatewayGetBlockByHashErr) + gateway.On("GetSignedBlockBySeq", tc.seq).Return(tc.gatewayGetBlockBySeqResult, tc.gatewayGetBlockBySeqErr) + gateway.On("GetSignedBlockByHashVerbose", tc.sha256).Return(tc.gatewayGetBlockByHashVerboseResult.Block, + tc.gatewayGetBlockByHashVerboseResult.Inputs, tc.gatewayGetBlockByHashVerboseErr) + gateway.On("GetSignedBlockBySeqVerbose", tc.seq).Return(tc.gatewayGetBlockBySeqVerboseResult.Block, + tc.gatewayGetBlockBySeqVerboseResult.Inputs, tc.gatewayGetBlockBySeqVerboseErr) + + endpoint := "/api/v1/block" + + v := url.Values{} + if tc.hash != "" { + v.Add("hash", tc.hash) + } + if tc.seqStr != "" { + v.Add("seq", tc.seqStr) + } + if tc.verboseStr != "" { + v.Add("verbose", tc.verboseStr) + } + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + req.Header.Add("Content-Type", ContentTypeForm) + + setCSRFParameters(t, tokenValid, req) + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = false + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String())) + } else { + if tc.verbose { + var msg *readable.BlockVerbose + err := json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.response.(*readable.BlockVerbose), msg) + } else { + var msg *readable.Block + err := json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.response.(*readable.Block), msg) + } + } + }) + } +} + +func TestGetBlocks(t *testing.T) { + type httpBody struct { + Start string + End string + Seqs string + Verbose string + } + + type verboseResult struct { + Blocks []coin.SignedBlock + Inputs [][][]visor.TransactionInput + } + + tt := []struct { + name string + method string + status int + err string + body *httpBody + start uint64 + end uint64 + seqs []uint64 + verbose bool + gatewayGetBlocksInRangeResult []coin.SignedBlock + gatewayGetBlocksInRangeError error + gatewayGetBlocksInRangeVerboseResult verboseResult + gatewayGetBlocksInRangeVerboseError error + gatewayGetBlocksResult []coin.SignedBlock + gatewayGetBlocksError error + gatewayGetBlocksVerboseResult verboseResult + gatewayGetBlocksVerboseError error + response interface{} + }{ + { + name: "405", + method: http.MethodDelete, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "400 - empty start, end and seqs", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - At least one of seqs or start or end are required", + }, + { + name: "400 - bad start", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - Invalid start value \"badStart\"", + body: &httpBody{ + Start: "badStart", + }, + }, + { + name: "400 - bad end", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - Invalid end value \"badEnd\"", + body: &httpBody{ + Start: "1", + End: "badEnd", + }, + start: 1, + }, + { + name: "400 - bad verbose", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - Invalid value for verbose", + body: &httpBody{ + Start: "1", + End: "2", + Verbose: "foo", + }, + }, + { + name: "400 - seqs combined with start", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - seqs cannot be used with start or end", + body: &httpBody{ + Seqs: "1,2,3", + Start: "1", + }, + }, + { + name: "400 - seqs combined with end", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - seqs cannot be used with start or end", + body: &httpBody{ + Seqs: "1,2,3", + End: "1", + }, + }, + { + name: "400 - bad seqs", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - Invalid sequence \"a\" at seqs[2]", + body: &httpBody{ + Seqs: "1,2,a", + }, + }, + { + name: "400 - bad seqs", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - Invalid sequence \"\" at seqs[1]", + body: &httpBody{ + Seqs: "1,,2", + }, + }, + { + name: "400 - bad seqs", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - Invalid sequence \"foo\" at seqs[0]", + body: &httpBody{ + Seqs: "foo", + }, + }, + { + name: "400 - duplicate seqs", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - Duplicate sequence 2 at seqs[3]", + body: &httpBody{ + Seqs: "1,2,3,2", + }, + }, + + { + name: "404 - block seq not found", + method: http.MethodGet, + status: http.StatusNotFound, + err: "404 Not Found - block does not exist seq=4", + body: &httpBody{ + Seqs: "1,2,4", + }, + seqs: []uint64{1, 2, 4}, + gatewayGetBlocksError: visor.NewErrBlockNotExist(4), + }, + + { + name: "404 - block seq not found verbose", + method: http.MethodGet, + status: http.StatusNotFound, + err: "404 Not Found - block does not exist seq=4", + body: &httpBody{ + Seqs: "1,2,4", + Verbose: "1", + }, + seqs: []uint64{1, 2, 4}, + verbose: true, + gatewayGetBlocksVerboseError: visor.NewErrBlockNotExist(4), + }, + + { + name: "500 - gatewayGetBlocksInRangeError", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gatewayGetBlocksInRangeError", + body: &httpBody{ + Start: "1", + End: "3", + }, + start: 1, + end: 3, + gatewayGetBlocksInRangeError: errors.New("gatewayGetBlocksInRangeError"), + }, + { + name: "500 - gatewayGetBlocksInRangeVerboseError", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gatewayGetBlocksInRangeVerboseError", + body: &httpBody{ + Start: "1", + End: "3", + Verbose: "1", + }, + start: 1, + end: 3, + verbose: true, + gatewayGetBlocksInRangeVerboseError: errors.New("gatewayGetBlocksInRangeVerboseError"), + }, + + { + name: "500 - gatewayGetBlocksError", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gatewayGetBlocksError", + body: &httpBody{ + Seqs: "1,2,3", + }, + seqs: []uint64{1, 2, 3}, + gatewayGetBlocksError: errors.New("gatewayGetBlocksError"), + }, + { + name: "500 - gatewayGetBlocksVerboseError", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gatewayGetBlocksVerboseError", + body: &httpBody{ + Seqs: "1,2,3", + Verbose: "1", + }, + seqs: []uint64{1, 2, 3}, + verbose: true, + gatewayGetBlocksVerboseError: errors.New("gatewayGetBlocksVerboseError"), + }, + + { + name: "200 range", + method: http.MethodGet, + status: http.StatusOK, + body: &httpBody{ + Start: "1", + End: "3", + }, + start: 1, + end: 3, + gatewayGetBlocksInRangeResult: []coin.SignedBlock{{}}, + response: &readable.Blocks{ + Blocks: []readable.Block{ + readable.Block{ + Head: readable.BlockHeader{ + Hash: "7b8ec8dd836b564f0c85ad088fc744de820345204e154bc1503e04e9d6fdd9f1", + PreviousHash: "0000000000000000000000000000000000000000000000000000000000000000", + BodyHash: "0000000000000000000000000000000000000000000000000000000000000000", + UxHash: "0000000000000000000000000000000000000000000000000000000000000000", + }, + Body: readable.BlockBody{ + Transactions: []readable.Transaction{}, + }, + }, + }, + }, + }, + { + name: "200 range verbose", + method: http.MethodGet, + status: http.StatusOK, + body: &httpBody{ + Start: "1", + End: "3", + Verbose: "1", + }, + start: 1, + end: 3, + verbose: true, + gatewayGetBlocksInRangeVerboseResult: verboseResult{ + Blocks: []coin.SignedBlock{{}}, + Inputs: [][][]visor.TransactionInput{{}}, + }, + response: &readable.BlocksVerbose{ + Blocks: []readable.BlockVerbose{ + readable.BlockVerbose{ + Head: readable.BlockHeader{ + Hash: "7b8ec8dd836b564f0c85ad088fc744de820345204e154bc1503e04e9d6fdd9f1", + PreviousHash: "0000000000000000000000000000000000000000000000000000000000000000", + BodyHash: "0000000000000000000000000000000000000000000000000000000000000000", + UxHash: "0000000000000000000000000000000000000000000000000000000000000000", + }, + Body: readable.BlockBodyVerbose{ + Transactions: []readable.BlockTransactionVerbose{}, + }, + }, + }, + }, + }, + + { + name: "200 seqs", + method: http.MethodGet, + status: http.StatusOK, + body: &httpBody{ + Seqs: "1,2,3", + }, + seqs: []uint64{1, 2, 3}, + gatewayGetBlocksResult: []coin.SignedBlock{{}}, + response: &readable.Blocks{ + Blocks: []readable.Block{ + readable.Block{ + Head: readable.BlockHeader{ + Hash: "7b8ec8dd836b564f0c85ad088fc744de820345204e154bc1503e04e9d6fdd9f1", + PreviousHash: "0000000000000000000000000000000000000000000000000000000000000000", + BodyHash: "0000000000000000000000000000000000000000000000000000000000000000", + UxHash: "0000000000000000000000000000000000000000000000000000000000000000", + }, + Body: readable.BlockBody{ + Transactions: []readable.Transaction{}, + }, + }, + }, + }, + }, + { + name: "200 seqs verbose", + method: http.MethodGet, + status: http.StatusOK, + body: &httpBody{ + Seqs: "1,2,3", + Verbose: "1", + }, + seqs: []uint64{1, 2, 3}, + verbose: true, + gatewayGetBlocksVerboseResult: verboseResult{ + Blocks: []coin.SignedBlock{{}}, + Inputs: [][][]visor.TransactionInput{{}}, + }, + response: &readable.BlocksVerbose{ + Blocks: []readable.BlockVerbose{ + readable.BlockVerbose{ + Head: readable.BlockHeader{ + Hash: "7b8ec8dd836b564f0c85ad088fc744de820345204e154bc1503e04e9d6fdd9f1", + PreviousHash: "0000000000000000000000000000000000000000000000000000000000000000", + BodyHash: "0000000000000000000000000000000000000000000000000000000000000000", + UxHash: "0000000000000000000000000000000000000000000000000000000000000000", + }, + Body: readable.BlockBodyVerbose{ + Transactions: []readable.BlockTransactionVerbose{}, + }, + }, + }, + }, + }, + + { + name: "200 seqs POST", + method: http.MethodPost, + status: http.StatusOK, + body: &httpBody{ + Seqs: "1,2,3", + }, + seqs: []uint64{1, 2, 3}, + gatewayGetBlocksResult: []coin.SignedBlock{{}}, + response: &readable.Blocks{ + Blocks: []readable.Block{ + readable.Block{ + Head: readable.BlockHeader{ + Hash: "7b8ec8dd836b564f0c85ad088fc744de820345204e154bc1503e04e9d6fdd9f1", + PreviousHash: "0000000000000000000000000000000000000000000000000000000000000000", + BodyHash: "0000000000000000000000000000000000000000000000000000000000000000", + UxHash: "0000000000000000000000000000000000000000000000000000000000000000", + }, + Body: readable.BlockBody{ + Transactions: []readable.Transaction{}, + }, + }, + }, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &MockGatewayer{} + gateway.On("GetBlocksInRange", tc.start, tc.end).Return(tc.gatewayGetBlocksInRangeResult, tc.gatewayGetBlocksInRangeError) + gateway.On("GetBlocksInRangeVerbose", tc.start, tc.end).Return(tc.gatewayGetBlocksInRangeVerboseResult.Blocks, + tc.gatewayGetBlocksInRangeVerboseResult.Inputs, tc.gatewayGetBlocksInRangeVerboseError) + gateway.On("GetBlocks", tc.seqs).Return(tc.gatewayGetBlocksResult, tc.gatewayGetBlocksError) + gateway.On("GetBlocksVerbose", tc.seqs).Return(tc.gatewayGetBlocksVerboseResult.Blocks, + tc.gatewayGetBlocksVerboseResult.Inputs, tc.gatewayGetBlocksVerboseError) + + endpoint := "/api/v1/blocks" + + v := url.Values{} + if tc.body != nil { + if tc.body.Start != "" { + v.Add("start", tc.body.Start) + } + if tc.body.End != "" { + v.Add("end", tc.body.End) + } + if tc.body.Verbose != "" { + v.Add("verbose", tc.body.Verbose) + } + if tc.body.Seqs != "" { + v.Add("seqs", tc.body.Seqs) + } + } + + var reqBody io.Reader + if len(v) > 0 { + if tc.method == http.MethodPost { + reqBody = strings.NewReader(v.Encode()) + } else { + endpoint += "?" + v.Encode() + } + } + + req, err := http.NewRequest(tc.method, endpoint, reqBody) + require.NoError(t, err) + + if tc.method == http.MethodPost { + req.Header.Set("Content-Type", ContentTypeForm) + } + + setCSRFParameters(t, tokenValid, req) + + rr := httptest.NewRecorder() + handler := newServerMux(defaultMuxConfig(), gateway) + + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "wrong status code: got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, want `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + if tc.verbose { + var msg *readable.BlocksVerbose + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.response, msg) + } else { + var msg *readable.Blocks + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.response, msg) + } + } + }) + } +} + +func TestGetLastBlocks(t *testing.T) { + type httpBody struct { + Num string + Verbose string + } + + type verboseResult struct { + Blocks []coin.SignedBlock + Inputs [][][]visor.TransactionInput + } + + tt := []struct { + name string + method string + status int + err string + body httpBody + num uint64 + verbose bool + gatewayGetLastBlocksResult []coin.SignedBlock + gatewayGetLastBlocksError error + gatewayGetLastBlocksVerboseResult verboseResult + gatewayGetLastBlocksVerboseError error + response interface{} + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + body: httpBody{ + Num: "1", + }, + }, + { + name: "400 - empty num value", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - Invalid num value \"\"", + }, + { + name: "400 - bad num value", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - Invalid num value \"badNumValue\"", + body: httpBody{ + Num: "badNumValue", + }, + }, + { + name: "400 - bad verbose", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - Invalid value for verbose", + body: httpBody{ + Num: "1", + Verbose: "foo", + }, + }, + { + name: "500 - gatewayGetLastBlocksError", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gatewayGetLastBlocksError", + body: httpBody{ + Num: "1", + }, + num: 1, + gatewayGetLastBlocksError: errors.New("gatewayGetLastBlocksError"), + }, + { + name: "500 - gatewayGetLastBlocksVerboseError", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gatewayGetLastBlocksVerboseError", + body: httpBody{ + Num: "1", + Verbose: "1", + }, + num: 1, + verbose: true, + gatewayGetLastBlocksVerboseError: errors.New("gatewayGetLastBlocksVerboseError"), + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + body: httpBody{ + Num: "1", + }, + num: 1, + gatewayGetLastBlocksResult: []coin.SignedBlock{{}}, + response: &readable.Blocks{ + Blocks: []readable.Block{ + readable.Block{ + Head: readable.BlockHeader{ + Hash: "7b8ec8dd836b564f0c85ad088fc744de820345204e154bc1503e04e9d6fdd9f1", + PreviousHash: "0000000000000000000000000000000000000000000000000000000000000000", + BodyHash: "0000000000000000000000000000000000000000000000000000000000000000", + UxHash: "0000000000000000000000000000000000000000000000000000000000000000", + }, + Body: readable.BlockBody{ + Transactions: []readable.Transaction{}, + }, + }, + }, + }, + }, + { + name: "200 verbose", + method: http.MethodGet, + status: http.StatusOK, + body: httpBody{ + Num: "1", + Verbose: "1", + }, + num: 1, + verbose: true, + gatewayGetLastBlocksVerboseResult: verboseResult{ + Blocks: []coin.SignedBlock{{}}, + Inputs: [][][]visor.TransactionInput{{}}, + }, + response: &readable.BlocksVerbose{ + Blocks: []readable.BlockVerbose{ + readable.BlockVerbose{ + Head: readable.BlockHeader{ + Hash: "7b8ec8dd836b564f0c85ad088fc744de820345204e154bc1503e04e9d6fdd9f1", + PreviousHash: "0000000000000000000000000000000000000000000000000000000000000000", + BodyHash: "0000000000000000000000000000000000000000000000000000000000000000", + UxHash: "0000000000000000000000000000000000000000000000000000000000000000", + }, + Body: readable.BlockBodyVerbose{ + Transactions: []readable.BlockTransactionVerbose{}, + }, + }, + }, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/last_blocks" + gateway := &MockGatewayer{} + + gateway.On("GetLastBlocks", tc.num).Return(tc.gatewayGetLastBlocksResult, tc.gatewayGetLastBlocksError) + gateway.On("GetLastBlocksVerbose", tc.num).Return(tc.gatewayGetLastBlocksVerboseResult.Blocks, + tc.gatewayGetLastBlocksVerboseResult.Inputs, tc.gatewayGetLastBlocksVerboseError) + + v := url.Values{} + if tc.body.Num != "" { + v.Add("num", tc.body.Num) + } + if tc.body.Verbose != "" { + v.Add("verbose", tc.body.Verbose) + } + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + setCSRFParameters(t, tokenValid, req) + + rr := httptest.NewRecorder() + + handler := newServerMux(defaultMuxConfig(), gateway) + + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, want `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + if tc.verbose { + var msg *readable.BlocksVerbose + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.response, msg) + } else { + var msg *readable.Blocks + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.response, msg) + } + } + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/client.go b/vendor/github.com/SkycoinProject/skycoin/src/api/client.go new file mode 100644 index 00000000..3038adc4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/client.go @@ -0,0 +1,1314 @@ +package api + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" + "io" + "io/ioutil" + "net" + "net/http" + "net/url" + "strings" + "time" + + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/daemon" + "github.com/SkycoinProject/skycoin/src/kvstorage" + "github.com/SkycoinProject/skycoin/src/readable" +) + +const ( + dialTimeout = 60 * time.Second + httpClientTimeout = 120 * time.Second + tlsHandshakeTimeout = 60 * time.Second + + // ContentTypeJSON json content type header + ContentTypeJSON = "application/json" + // ContentTypeForm form data content type header + ContentTypeForm = "application/x-www-form-urlencoded" +) + +// ClientError is used for non-200 API responses +type ClientError struct { + Status string + StatusCode int + Message string +} + +// NewClientError creates a ClientError +func NewClientError(status string, statusCode int, message string) ClientError { + return ClientError{ + Status: status, + StatusCode: statusCode, + Message: strings.TrimRight(message, "\n"), + } +} + +func (e ClientError) Error() string { + return e.Message +} + +// ReceivedHTTPResponse parsed a HTTPResponse received by the Client, for the V2 API +type ReceivedHTTPResponse struct { + Error *HTTPError `json:"error,omitempty"` + Data json.RawMessage `json:"data"` +} + +// Client provides an interface to a remote node's HTTP API +type Client struct { + HTTPClient *http.Client + Addr string + Username string + Password string +} + +// NewClient creates a Client +func NewClient(addr string) *Client { + transport := &http.Transport{ + Dial: (&net.Dialer{ + Timeout: dialTimeout, + }).Dial, + TLSHandshakeTimeout: tlsHandshakeTimeout, + } + httpClient := &http.Client{ + Transport: transport, + Timeout: httpClientTimeout, + } + addr = strings.TrimRight(addr, "/") + addr += "/" + + return &Client{ + Addr: addr, + HTTPClient: httpClient, + } +} + +// SetAuth configures the Client's request authentication +func (c *Client) SetAuth(username, password string) { + c.Username = username + c.Password = password +} + +func (c *Client) applyAuth(req *http.Request) { + if c.Username == "" && c.Password == "" { + return + } + + req.SetBasicAuth(c.Username, c.Password) +} + +// GetV2 makes a GET request to an endpoint and unmarshals the response to respObj. +// If the response is not 200 OK, returns an error +func (c *Client) GetV2(endpoint string, respObj interface{}) (bool, error) { + return c.requestV2(http.MethodGet, endpoint, nil, respObj) +} + +// Get makes a GET request to an endpoint and unmarshals the response to obj. +// If the response is not 200 OK, returns an error +func (c *Client) Get(endpoint string, obj interface{}) error { + resp, err := c.get(endpoint) + if err != nil { + return err + } + + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return err + } + + return NewClientError(resp.Status, resp.StatusCode, string(body)) + } + + if obj == nil { + return nil + } + + d := json.NewDecoder(resp.Body) + d.DisallowUnknownFields() + return d.Decode(obj) +} + +// get makes a GET request to an endpoint. Caller must close response body. +func (c *Client) get(endpoint string) (*http.Response, error) { + return c.makeRequestWithoutBody(endpoint, http.MethodGet) +} + +// makeRequestWithoutBody makes a `method` request to an endpoint. Caller must close response body. +func (c *Client) makeRequestWithoutBody(endpoint, method string) (*http.Response, error) { + endpoint = strings.TrimLeft(endpoint, "/") + endpoint = c.Addr + endpoint + + req, err := http.NewRequest(method, endpoint, nil) + if err != nil { + return nil, err + } + + c.applyAuth(req) + + return c.HTTPClient.Do(req) +} + +// DeleteV2 makes a DELETE request to an endpoint with body of json data, +// and parses the standard JSON response. +func (c *Client) DeleteV2(endpoint string, respObj interface{}) (bool, error) { + return c.requestV2(http.MethodDelete, endpoint, nil, respObj) +} + +// PostForm makes a POST request to an endpoint with body of ContentTypeForm formated data. +func (c *Client) PostForm(endpoint string, body io.Reader, obj interface{}) error { + return c.Post(endpoint, ContentTypeForm, body, obj) +} + +// PostJSON makes a POST request to an endpoint with body of json data. +func (c *Client) PostJSON(endpoint string, reqObj, respObj interface{}) error { + body, err := json.Marshal(reqObj) + if err != nil { + return err + } + + return c.Post(endpoint, ContentTypeJSON, bytes.NewReader(body), respObj) +} + +// Post makes a POST request to an endpoint. +func (c *Client) Post(endpoint string, contentType string, body io.Reader, obj interface{}) error { + csrf, err := c.CSRF() + if err != nil { + return err + } + + endpoint = strings.TrimLeft(endpoint, "/") + endpoint = c.Addr + endpoint + + req, err := http.NewRequest(http.MethodPost, endpoint, body) + if err != nil { + return err + } + + c.applyAuth(req) + + if csrf != "" { + req.Header.Set(CSRFHeaderName, csrf) + } + + req.Header.Set("Content-Type", contentType) + + resp, err := c.HTTPClient.Do(req) + if err != nil { + return err + } + + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return err + } + + return NewClientError(resp.Status, resp.StatusCode, string(body)) + } + + if obj == nil { + return nil + } + + decoder := json.NewDecoder(resp.Body) + decoder.DisallowUnknownFields() + return decoder.Decode(obj) +} + +// PostJSONV2 makes a POST request to an endpoint with body of json data, +// and parses the standard JSON response. +func (c *Client) PostJSONV2(endpoint string, reqObj, respObj interface{}) (bool, error) { + body, err := json.Marshal(reqObj) + if err != nil { + return false, err + } + + return c.requestV2(http.MethodPost, endpoint, bytes.NewReader(body), respObj) +} + +func (c *Client) requestV2(method, endpoint string, body io.Reader, respObj interface{}) (bool, error) { + csrf, err := c.CSRF() + if err != nil { + return false, err + } + + endpoint = strings.TrimLeft(endpoint, "/") + endpoint = c.Addr + endpoint + + req, err := http.NewRequest(method, endpoint, body) + if err != nil { + return false, err + } + + c.applyAuth(req) + + if csrf != "" { + req.Header.Set(CSRFHeaderName, csrf) + } + + switch method { + case http.MethodPost: + req.Header.Set("Content-Type", ContentTypeJSON) + } + + req.Header.Set("Accept", ContentTypeJSON) + + resp, err := c.HTTPClient.Do(req) + if err != nil { + return false, err + } + + defer resp.Body.Close() + + respBody, err := ioutil.ReadAll(resp.Body) + if err != nil { + return false, err + } + + decoder := json.NewDecoder(bytes.NewReader(respBody)) + decoder.DisallowUnknownFields() + + var wrapObj ReceivedHTTPResponse + if err := decoder.Decode(&wrapObj); err != nil { + // In some cases, the server can send an error response in a non-JSON format, + // such as a 404 when the endpoint is not registered, or if a 500 error + // occurs in the go HTTP stack, outside of the application's control. + // If this happens, treat the entire response body as the error message. + if resp.StatusCode != http.StatusOK { + return false, NewClientError(resp.Status, resp.StatusCode, string(respBody)) + } + + return false, err + } + + // The JSON decoder stops at the end of the first valid JSON object. + // Check that there is no trailing data after the end of the first valid JSON object. + // This could occur if an endpoint mistakenly wrote an object twice, for example. + // This line returns the decoder's underlying read buffer. Read(nil) will return io.EOF + // if the buffer was completely consumed. + if _, err := decoder.Buffered().Read(nil); err != io.EOF { + return false, NewClientError(resp.Status, resp.StatusCode, "Response has additional bytes after the first JSON object: "+string(respBody)) + } + + var rspErr error + if resp.StatusCode != http.StatusOK { + rspErr = NewClientError(resp.Status, resp.StatusCode, wrapObj.Error.Message) + } + + if wrapObj.Data == nil { + return false, rspErr + } + + decoder = json.NewDecoder(bytes.NewReader(wrapObj.Data)) + decoder.DisallowUnknownFields() + + if err := decoder.Decode(respObj); err != nil { + return false, err + } + + return true, rspErr +} + +// CSRF returns a CSRF token. If CSRF is disabled on the node, returns an empty string and nil error. +func (c *Client) CSRF() (string, error) { + resp, err := c.get("/api/v1/csrf") + if err != nil { + return "", err + } + + defer resp.Body.Close() + + switch resp.StatusCode { + case http.StatusOK: + case http.StatusNotFound: + // CSRF is disabled on the node + return "", nil + default: + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return "", err + } + + return "", NewClientError(resp.Status, resp.StatusCode, string(body)) + } + + d := json.NewDecoder(resp.Body) + d.DisallowUnknownFields() + + var m map[string]string + if err := d.Decode(&m); err != nil { + return "", err + } + + token, ok := m["csrf_token"] + if !ok { + return "", errors.New("csrf_token not found in response") + } + + return token, nil +} + +// Version makes a request to GET /api/v1/version +func (c *Client) Version() (*readable.BuildInfo, error) { + var bi readable.BuildInfo + if err := c.Get("/api/v1/version", &bi); err != nil { + return nil, err + } + return &bi, nil +} + +// Outputs makes a request to GET /api/v1/outputs +func (c *Client) Outputs() (*readable.UnspentOutputsSummary, error) { + var o readable.UnspentOutputsSummary + if err := c.Get("/api/v1/outputs", &o); err != nil { + return nil, err + } + return &o, nil +} + +// OutputsForAddresses makes a request to POST /api/v1/outputs?addrs=xxx +func (c *Client) OutputsForAddresses(addrs []string) (*readable.UnspentOutputsSummary, error) { + v := url.Values{} + v.Add("addrs", strings.Join(addrs, ",")) + + endpoint := "/api/v1/outputs" + + var o readable.UnspentOutputsSummary + if err := c.PostForm(endpoint, strings.NewReader(v.Encode()), &o); err != nil { + return nil, err + } + return &o, nil +} + +// OutputsForHashes makes a request to POST /api/v1/outputs?hashes=zzz +func (c *Client) OutputsForHashes(hashes []string) (*readable.UnspentOutputsSummary, error) { + v := url.Values{} + v.Add("hashes", strings.Join(hashes, ",")) + endpoint := "/api/v1/outputs" + + var o readable.UnspentOutputsSummary + if err := c.PostForm(endpoint, strings.NewReader(v.Encode()), &o); err != nil { + return nil, err + } + return &o, nil +} + +// CoinSupply makes a request to GET /api/v1/coinSupply +func (c *Client) CoinSupply() (*CoinSupply, error) { + var cs CoinSupply + if err := c.Get("/api/v1/coinSupply", &cs); err != nil { + return nil, err + } + return &cs, nil +} + +// BlockByHash makes a request to GET /api/v1/block?hash=xxx +func (c *Client) BlockByHash(hash string) (*readable.Block, error) { + v := url.Values{} + v.Add("hash", hash) + endpoint := "/api/v1/block?" + v.Encode() + + var b readable.Block + if err := c.Get(endpoint, &b); err != nil { + return nil, err + } + return &b, nil +} + +// BlockByHashVerbose makes a request to GET /api/v1/block?hash=xxx&verbose=1 +func (c *Client) BlockByHashVerbose(hash string) (*readable.BlockVerbose, error) { + v := url.Values{} + v.Add("hash", hash) + v.Add("verbose", "1") + endpoint := "/api/v1/block?" + v.Encode() + + var b readable.BlockVerbose + if err := c.Get(endpoint, &b); err != nil { + return nil, err + } + return &b, nil +} + +// BlockBySeq makes a request to GET /api/v1/block?seq=xxx +func (c *Client) BlockBySeq(seq uint64) (*readable.Block, error) { + v := url.Values{} + v.Add("seq", fmt.Sprint(seq)) + endpoint := "/api/v1/block?" + v.Encode() + + var b readable.Block + if err := c.Get(endpoint, &b); err != nil { + return nil, err + } + return &b, nil +} + +// BlockBySeqVerbose makes a request to GET /api/v1/block?seq=xxx&verbose=1 +func (c *Client) BlockBySeqVerbose(seq uint64) (*readable.BlockVerbose, error) { + v := url.Values{} + v.Add("seq", fmt.Sprint(seq)) + v.Add("verbose", "1") + endpoint := "/api/v1/block?" + v.Encode() + + var b readable.BlockVerbose + if err := c.Get(endpoint, &b); err != nil { + return nil, err + } + return &b, nil +} + +// Blocks makes a request to POST /api/v1/blocks?seqs= +func (c *Client) Blocks(seqs []uint64) (*readable.Blocks, error) { + sSeqs := make([]string, len(seqs)) + for i, x := range seqs { + sSeqs[i] = fmt.Sprint(x) + } + + v := url.Values{} + v.Add("seqs", strings.Join(sSeqs, ",")) + endpoint := "/api/v1/blocks" + + var b readable.Blocks + if err := c.PostForm(endpoint, strings.NewReader(v.Encode()), &b); err != nil { + return nil, err + } + return &b, nil +} + +// BlocksVerbose makes a request to POST /api/v1/blocks?verbose=1&seqs= +func (c *Client) BlocksVerbose(seqs []uint64) (*readable.BlocksVerbose, error) { + sSeqs := make([]string, len(seqs)) + for i, x := range seqs { + sSeqs[i] = fmt.Sprint(x) + } + + v := url.Values{} + v.Add("seqs", strings.Join(sSeqs, ",")) + v.Add("verbose", "1") + endpoint := "/api/v1/blocks" + + var b readable.BlocksVerbose + if err := c.PostForm(endpoint, strings.NewReader(v.Encode()), &b); err != nil { + return nil, err + } + return &b, nil +} + +// BlocksInRange makes a request to GET /api/v1/blocks?start=&end= +func (c *Client) BlocksInRange(start, end uint64) (*readable.Blocks, error) { + v := url.Values{} + v.Add("start", fmt.Sprint(start)) + v.Add("end", fmt.Sprint(end)) + endpoint := "/api/v1/blocks?" + v.Encode() + + var b readable.Blocks + if err := c.Get(endpoint, &b); err != nil { + return nil, err + } + return &b, nil +} + +// BlocksInRangeVerbose makes a request to GET /api/v1/blocks?verbose=1&start=&end= +func (c *Client) BlocksInRangeVerbose(start, end uint64) (*readable.BlocksVerbose, error) { + v := url.Values{} + v.Add("start", fmt.Sprint(start)) + v.Add("end", fmt.Sprint(end)) + v.Add("verbose", "1") + endpoint := "/api/v1/blocks?" + v.Encode() + + var b readable.BlocksVerbose + if err := c.Get(endpoint, &b); err != nil { + return nil, err + } + return &b, nil +} + +// LastBlocks makes a request to GET /api/v1/last_blocks +func (c *Client) LastBlocks(n uint64) (*readable.Blocks, error) { + v := url.Values{} + v.Add("num", fmt.Sprint(n)) + endpoint := "/api/v1/last_blocks?" + v.Encode() + + var b readable.Blocks + if err := c.Get(endpoint, &b); err != nil { + return nil, err + } + return &b, nil +} + +// LastBlocksVerbose makes a request to GET /api/v1/last_blocks?verbose=1 +func (c *Client) LastBlocksVerbose(n uint64) (*readable.BlocksVerbose, error) { + v := url.Values{} + v.Add("num", fmt.Sprint(n)) + v.Add("verbose", "1") + endpoint := "/api/v1/last_blocks?" + v.Encode() + + var b readable.BlocksVerbose + if err := c.Get(endpoint, &b); err != nil { + return nil, err + } + return &b, nil +} + +// BlockchainMetadata makes a request to GET /api/v1/blockchain/metadata +func (c *Client) BlockchainMetadata() (*readable.BlockchainMetadata, error) { + var b readable.BlockchainMetadata + if err := c.Get("/api/v1/blockchain/metadata", &b); err != nil { + return nil, err + } + return &b, nil +} + +// BlockchainProgress makes a request to GET /api/v1/blockchain/progress +func (c *Client) BlockchainProgress() (*readable.BlockchainProgress, error) { + var b readable.BlockchainProgress + if err := c.Get("/api/v1/blockchain/progress", &b); err != nil { + return nil, err + } + return &b, nil +} + +// Balance makes a request to POST /api/v1/balance?addrs=xxx +func (c *Client) Balance(addrs []string) (*BalanceResponse, error) { + v := url.Values{} + v.Add("addrs", strings.Join(addrs, ",")) + endpoint := "/api/v1/balance" + + var b BalanceResponse + if err := c.PostForm(endpoint, strings.NewReader(v.Encode()), &b); err != nil { + return nil, err + } + return &b, nil +} + +// UxOut makes a request to GET /api/v1/uxout?uxid=xxx +func (c *Client) UxOut(uxID string) (*readable.SpentOutput, error) { + v := url.Values{} + v.Add("uxid", uxID) + endpoint := "/api/v1/uxout?" + v.Encode() + + var b readable.SpentOutput + if err := c.Get(endpoint, &b); err != nil { + return nil, err + } + return &b, nil +} + +// AddressUxOuts makes a request to GET /api/v1/address_uxouts +func (c *Client) AddressUxOuts(addr string) ([]readable.SpentOutput, error) { + v := url.Values{} + v.Add("address", addr) + endpoint := "/api/v1/address_uxouts?" + v.Encode() + + var b []readable.SpentOutput + if err := c.Get(endpoint, &b); err != nil { + return nil, err + } + return b, nil +} + +// Wallet makes a request to GET /api/v1/wallet +func (c *Client) Wallet(id string) (*WalletResponse, error) { + v := url.Values{} + v.Add("id", id) + endpoint := "/api/v1/wallet?" + v.Encode() + + var wr WalletResponse + if err := c.Get(endpoint, &wr); err != nil { + return nil, err + } + + return &wr, nil +} + +// Wallets makes a request to GET /api/v1/wallets +func (c *Client) Wallets() ([]WalletResponse, error) { + var wrs []WalletResponse + if err := c.Get("/api/v1/wallets", &wrs); err != nil { + return nil, err + } + + return wrs, nil +} + +// CreateWalletOptions are the options for creating a wallet +type CreateWalletOptions struct { + Type string + Seed string + SeedPassphrase string + Label string + Password string + ScanN int + XPub string + Encrypt bool +} + +// CreateWallet makes a request to POST /api/v1/wallet/create and creates a wallet. +// If scanN is <= 0, the scan number defaults to 1 +func (c *Client) CreateWallet(o CreateWalletOptions) (*WalletResponse, error) { + v := url.Values{} + v.Add("type", o.Type) + v.Add("seed", o.Seed) + v.Add("seed-passphrase", o.SeedPassphrase) + v.Add("label", o.Label) + v.Add("password", o.Password) + v.Add("encrypt", fmt.Sprint(o.Encrypt)) + v.Add("xpub", o.XPub) + + if o.ScanN > 0 { + v.Add("scan", fmt.Sprint(o.ScanN)) + } + + var w WalletResponse + if err := c.PostForm("/api/v1/wallet/create", strings.NewReader(v.Encode()), &w); err != nil { + return nil, err + } + return &w, nil +} + +// NewWalletAddress makes a request to POST /api/v1/wallet/newAddress +// if n is <= 0, defaults to 1 +func (c *Client) NewWalletAddress(id string, n int, password string) ([]string, error) { + v := url.Values{} + v.Add("id", id) + if n > 0 { + v.Add("num", fmt.Sprint(n)) + } + + v.Add("password", password) + + var obj struct { + Addresses []string `json:"addresses"` + } + if err := c.PostForm("/api/v1/wallet/newAddress", strings.NewReader(v.Encode()), &obj); err != nil { + return nil, err + } + return obj.Addresses, nil +} + +// WalletBalance makes a request to GET /api/v1/wallet/balance +func (c *Client) WalletBalance(id string) (*BalanceResponse, error) { + v := url.Values{} + v.Add("id", id) + endpoint := "/api/v1/wallet/balance?" + v.Encode() + + var b BalanceResponse + if err := c.Get(endpoint, &b); err != nil { + return nil, err + } + return &b, nil +} + +// CreateTransactionRequest is sent to /api/v2/transaction +type CreateTransactionRequest struct { + IgnoreUnconfirmed bool `json:"ignore_unconfirmed"` + HoursSelection HoursSelection `json:"hours_selection"` + ChangeAddress *string `json:"change_address,omitempty"` + To []Receiver `json:"to"` + UxOuts []string `json:"unspents,omitempty"` + Addresses []string `json:"addresses,omitempty"` +} + +// HoursSelection defines options for hours distribution +type HoursSelection struct { + Type string `json:"type"` + Mode string `json:"mode"` + ShareFactor string `json:"share_factor,omitempty"` +} + +// Receiver specifies a spend destination +type Receiver struct { + Address string `json:"address"` + Coins string `json:"coins"` + Hours string `json:"hours,omitempty"` +} + +// WalletCreateTransactionRequest is sent to /api/v1/wallet/transaction +type WalletCreateTransactionRequest struct { + Unsigned bool `json:"unsigned"` + WalletID string `json:"wallet_id"` + Password string `json:"password"` + CreateTransactionRequest +} + +// WalletCreateTransaction makes a request to POST /api/v1/wallet/transaction +func (c *Client) WalletCreateTransaction(req WalletCreateTransactionRequest) (*CreateTransactionResponse, error) { + var r CreateTransactionResponse + endpoint := "/api/v1/wallet/transaction" + if err := c.PostJSON(endpoint, req, &r); err != nil { + return nil, err + } + + return &r, nil +} + +// WalletSignTransaction makes a request to POST /api/v2/wallet/transaction/sign +func (c *Client) WalletSignTransaction(req WalletSignTransactionRequest) (*CreateTransactionResponse, error) { + var r CreateTransactionResponse + endpoint := "/api/v2/wallet/transaction/sign" + ok, err := c.PostJSONV2(endpoint, req, &r) + if ok { + return &r, err + } + return nil, err +} + +// CreateTransaction makes a request to POST /api/v2/transaction +func (c *Client) CreateTransaction(req CreateTransactionRequest) (*CreateTransactionResponse, error) { + var r CreateTransactionResponse + endpoint := "/api/v2/transaction" + ok, err := c.PostJSONV2(endpoint, req, &r) + if ok { + return &r, err + } + return nil, err +} + +// WalletUnconfirmedTransactions makes a request to GET /api/v1/wallet/transactions +func (c *Client) WalletUnconfirmedTransactions(id string) (*UnconfirmedTxnsResponse, error) { + v := url.Values{} + v.Add("id", id) + endpoint := "/api/v1/wallet/transactions?" + v.Encode() + + var utx *UnconfirmedTxnsResponse + if err := c.Get(endpoint, &utx); err != nil { + return nil, err + } + return utx, nil +} + +// WalletUnconfirmedTransactionsVerbose makes a request to GET /api/v1/wallet/transactions&verbose=1 +func (c *Client) WalletUnconfirmedTransactionsVerbose(id string) (*UnconfirmedTxnsVerboseResponse, error) { + v := url.Values{} + v.Add("id", id) + v.Add("verbose", "1") + endpoint := "/api/v1/wallet/transactions?" + v.Encode() + + var utx *UnconfirmedTxnsVerboseResponse + if err := c.Get(endpoint, &utx); err != nil { + return nil, err + } + return utx, nil +} + +// UpdateWallet makes a request to POST /api/v1/wallet/update +func (c *Client) UpdateWallet(id, label string) error { + v := url.Values{} + v.Add("id", id) + v.Add("label", label) + + return c.PostForm("/api/v1/wallet/update", strings.NewReader(v.Encode()), nil) +} + +// WalletFolderName makes a request to GET /api/v1/wallets/folderName +func (c *Client) WalletFolderName() (*WalletFolder, error) { + var w WalletFolder + if err := c.Get("/api/v1/wallets/folderName", &w); err != nil { + return nil, err + } + return &w, nil +} + +// NewSeed makes a request to GET /api/v1/wallet/newSeed +// entropy must be 128 or 256 +func (c *Client) NewSeed(entropy int) (string, error) { + v := url.Values{} + v.Add("entropy", fmt.Sprint(entropy)) + endpoint := "/api/v1/wallet/newSeed?" + v.Encode() + + var r struct { + Seed string `json:"seed"` + } + if err := c.Get(endpoint, &r); err != nil { + return "", err + } + return r.Seed, nil +} + +// VerifySeed verifies whether the given seed is a valid bip39 mnemonic or not +func (c *Client) VerifySeed(seed string) (bool, error) { + ok, err := c.PostJSONV2("/api/v2/wallet/seed/verify", VerifySeedRequest{ + Seed: seed, + }, &struct{}{}) + if err != nil { + return false, err + } + return ok, nil +} + +// WalletSeed makes a request to POST /api/v1/wallet/seed +func (c *Client) WalletSeed(id string, password string) (*WalletSeedResponse, error) { + v := url.Values{} + v.Add("id", id) + v.Add("password", password) + + var r WalletSeedResponse + if err := c.PostForm("/api/v1/wallet/seed", strings.NewReader(v.Encode()), &r); err != nil { + return nil, err + } + + return &r, nil +} + +// NetworkConnection makes a request to GET /api/v1/network/connection +func (c *Client) NetworkConnection(addr string) (*readable.Connection, error) { + v := url.Values{} + v.Add("addr", addr) + endpoint := "/api/v1/network/connection?" + v.Encode() + + var dc readable.Connection + if err := c.Get(endpoint, &dc); err != nil { + return nil, err + } + return &dc, nil +} + +// NetworkConnectionsFilter filters for network connections +type NetworkConnectionsFilter struct { + States []daemon.ConnectionState // "pending", "connected" and "introduced" + Direction string // "incoming" or "outgoing" +} + +// NetworkConnections makes a request to GET /api/v1/network/connections. +// Connections can be filtered by state and direction. By default, "connected" and "introduced" connections +// of both directions are returned. +func (c *Client) NetworkConnections(filters *NetworkConnectionsFilter) (*Connections, error) { + v := url.Values{} + if filters != nil { + if len(filters.States) != 0 { + states := make([]string, len(filters.States)) + for i, s := range filters.States { + states[i] = string(s) + } + v.Add("states", strings.Join(states, ",")) + } + if filters.Direction != "" { + v.Add("direction", filters.Direction) + } + } + endpoint := "/api/v1/network/connections?" + v.Encode() + + var dc Connections + if err := c.Get(endpoint, &dc); err != nil { + return nil, err + } + return &dc, nil +} + +// NetworkDefaultPeers makes a request to GET /api/v1/network/defaultConnections +func (c *Client) NetworkDefaultPeers() ([]string, error) { + var dc []string + if err := c.Get("/api/v1/network/defaultConnections", &dc); err != nil { + return nil, err + } + return dc, nil +} + +// NetworkTrustedPeers makes a request to GET /api/v1/network/connections/trust +func (c *Client) NetworkTrustedPeers() ([]string, error) { + var dc []string + if err := c.Get("/api/v1/network/connections/trust", &dc); err != nil { + return nil, err + } + return dc, nil +} + +// NetworkExchangedPeers makes a request to GET /api/v1/network/connections/exchange +func (c *Client) NetworkExchangedPeers() ([]string, error) { + var dc []string + if err := c.Get("/api/v1/network/connections/exchange", &dc); err != nil { + return nil, err + } + return dc, nil +} + +// PendingTransactions makes a request to GET /api/v1/pendingTxs +func (c *Client) PendingTransactions() ([]readable.UnconfirmedTransactions, error) { + var v []readable.UnconfirmedTransactions + if err := c.Get("/api/v1/pendingTxs", &v); err != nil { + return nil, err + } + return v, nil +} + +// PendingTransactionsVerbose makes a request to GET /api/v1/pendingTxs?verbose=1 +func (c *Client) PendingTransactionsVerbose() ([]readable.UnconfirmedTransactionVerbose, error) { + var v []readable.UnconfirmedTransactionVerbose + if err := c.Get("/api/v1/pendingTxs?verbose=1", &v); err != nil { + return nil, err + } + return v, nil +} + +// Transaction makes a request to GET /api/v1/transaction +func (c *Client) Transaction(txid string) (*readable.TransactionWithStatus, error) { + v := url.Values{} + v.Add("txid", txid) + endpoint := "/api/v1/transaction?" + v.Encode() + + var r readable.TransactionWithStatus + if err := c.Get(endpoint, &r); err != nil { + return nil, err + } + return &r, nil +} + +// TransactionVerbose makes a request to GET /api/v1/transaction?verbose=1 +func (c *Client) TransactionVerbose(txid string) (*readable.TransactionWithStatusVerbose, error) { + v := url.Values{} + v.Add("txid", txid) + v.Add("verbose", "1") + endpoint := "/api/v1/transaction?" + v.Encode() + + var r readable.TransactionWithStatusVerbose + if err := c.Get(endpoint, &r); err != nil { + return nil, err + } + return &r, nil +} + +// TransactionEncoded makes a request to GET /api/v1/transaction?encoded=1 +func (c *Client) TransactionEncoded(txid string) (*TransactionEncodedResponse, error) { + v := url.Values{} + v.Add("txid", txid) + v.Add("encoded", "1") + endpoint := "/api/v1/transaction?" + v.Encode() + + var r TransactionEncodedResponse + if err := c.Get(endpoint, &r); err != nil { + return nil, err + } + return &r, nil +} + +// Transactions makes a request to POST /api/v1/transactions +func (c *Client) Transactions(addrs []string) ([]readable.TransactionWithStatus, error) { + v := url.Values{} + v.Add("addrs", strings.Join(addrs, ",")) + endpoint := "/api/v1/transactions" + + var r []readable.TransactionWithStatus + if err := c.PostForm(endpoint, strings.NewReader(v.Encode()), &r); err != nil { + return nil, err + } + return r, nil +} + +// ConfirmedTransactions makes a request to POST /api/v1/transactions?confirmed=true +func (c *Client) ConfirmedTransactions(addrs []string) ([]readable.TransactionWithStatus, error) { + v := url.Values{} + v.Add("addrs", strings.Join(addrs, ",")) + v.Add("confirmed", "true") + endpoint := "/api/v1/transactions" + + var r []readable.TransactionWithStatus + if err := c.PostForm(endpoint, strings.NewReader(v.Encode()), &r); err != nil { + return nil, err + } + return r, nil +} + +// UnconfirmedTransactions makes a request to POST /api/v1/transactions?confirmed=false +func (c *Client) UnconfirmedTransactions(addrs []string) ([]readable.TransactionWithStatus, error) { + v := url.Values{} + v.Add("addrs", strings.Join(addrs, ",")) + v.Add("confirmed", "false") + endpoint := "/api/v1/transactions" + + var r []readable.TransactionWithStatus + if err := c.PostForm(endpoint, strings.NewReader(v.Encode()), &r); err != nil { + return nil, err + } + return r, nil +} + +// TransactionsVerbose makes a request to POST /api/v1/transactions?verbose=1 +func (c *Client) TransactionsVerbose(addrs []string) ([]readable.TransactionWithStatusVerbose, error) { + v := url.Values{} + v.Add("addrs", strings.Join(addrs, ",")) + v.Add("verbose", "1") + endpoint := "/api/v1/transactions" + + var r []readable.TransactionWithStatusVerbose + if err := c.PostForm(endpoint, strings.NewReader(v.Encode()), &r); err != nil { + return nil, err + } + return r, nil +} + +// ConfirmedTransactionsVerbose makes a request to POST /api/v1/transactions?confirmed=true&verbose=1 +func (c *Client) ConfirmedTransactionsVerbose(addrs []string) ([]readable.TransactionWithStatusVerbose, error) { + v := url.Values{} + v.Add("addrs", strings.Join(addrs, ",")) + v.Add("confirmed", "true") + v.Add("verbose", "1") + endpoint := "/api/v1/transactions" + + var r []readable.TransactionWithStatusVerbose + if err := c.PostForm(endpoint, strings.NewReader(v.Encode()), &r); err != nil { + return nil, err + } + return r, nil +} + +// UnconfirmedTransactionsVerbose makes a request to POST /api/v1/transactions?confirmed=false&verbose=1 +func (c *Client) UnconfirmedTransactionsVerbose(addrs []string) ([]readable.TransactionWithStatusVerbose, error) { + v := url.Values{} + v.Add("addrs", strings.Join(addrs, ",")) + v.Add("confirmed", "false") + v.Add("verbose", "1") + endpoint := "/api/v1/transactions" + + var r []readable.TransactionWithStatusVerbose + if err := c.PostForm(endpoint, strings.NewReader(v.Encode()), &r); err != nil { + return nil, err + } + return r, nil +} + +// InjectTransaction makes a request to POST /api/v1/injectTransaction. +func (c *Client) InjectTransaction(txn *coin.Transaction) (string, error) { + rawTxn, err := txn.SerializeHex() + if err != nil { + return "", err + } + return c.InjectEncodedTransaction(rawTxn) +} + +// InjectTransactionNoBroadcast makes a request to POST /api/v1/injectTransaction +// but does not broadcast the transaction. +func (c *Client) InjectTransactionNoBroadcast(txn *coin.Transaction) (string, error) { + rawTxn, err := txn.SerializeHex() + if err != nil { + return "", err + } + return c.InjectEncodedTransactionNoBroadcast(rawTxn) +} + +// InjectEncodedTransaction makes a request to POST /api/v1/injectTransaction. +// rawTxn is a hex-encoded, serialized transaction +func (c *Client) InjectEncodedTransaction(rawTxn string) (string, error) { + return c.injectEncodedTransaction(rawTxn, false) +} + +// InjectEncodedTransactionNoBroadcast makes a request to POST /api/v1/injectTransaction +// but does not broadcast the transaction. +// rawTxn is a hex-encoded, serialized transaction +func (c *Client) InjectEncodedTransactionNoBroadcast(rawTxn string) (string, error) { + return c.injectEncodedTransaction(rawTxn, true) +} + +func (c *Client) injectEncodedTransaction(rawTxn string, noBroadcast bool) (string, error) { + v := InjectTransactionRequest{ + RawTxn: rawTxn, + NoBroadcast: noBroadcast, + } + + var txid string + if err := c.PostJSON("/api/v1/injectTransaction", v, &txid); err != nil { + return "", err + } + return txid, nil +} + +// ResendUnconfirmedTransactions makes a request to POST /api/v1/resendUnconfirmedTxns +func (c *Client) ResendUnconfirmedTransactions() (*ResendResult, error) { + endpoint := "/api/v1/resendUnconfirmedTxns" + var r ResendResult + if err := c.PostForm(endpoint, strings.NewReader(""), &r); err != nil { + return nil, err + } + return &r, nil +} + +// RawTransaction makes a request to GET /api/v1/rawtx +func (c *Client) RawTransaction(txid string) (string, error) { + v := url.Values{} + v.Add("txid", txid) + endpoint := "/api/v1/rawtx?" + v.Encode() + + var rawTxn string + if err := c.Get(endpoint, &rawTxn); err != nil { + return "", err + } + return rawTxn, nil +} + +// VerifyTransaction makes a request to POST /api/v2/transaction/verify. +func (c *Client) VerifyTransaction(req VerifyTransactionRequest) (*VerifyTransactionResponse, error) { + var rsp VerifyTransactionResponse + ok, err := c.PostJSONV2("/api/v2/transaction/verify", req, &rsp) + if ok { + return &rsp, err + } + + return nil, err +} + +// VerifyAddress makes a request to POST /api/v2/address/verify +// The API may respond with an error but include data useful for processing, +// so both return values may be non-nil. +func (c *Client) VerifyAddress(addr string) (*VerifyAddressResponse, error) { + req := VerifyAddressRequest{ + Address: addr, + } + + var rsp VerifyAddressResponse + ok, err := c.PostJSONV2("/api/v2/address/verify", req, &rsp) + if ok { + return &rsp, err + } + + return nil, err +} + +// RichlistParams are arguments to the /richlist endpoint +type RichlistParams struct { + N int + IncludeDistribution bool +} + +// Richlist makes a request to GET /api/v1/richlist +func (c *Client) Richlist(params *RichlistParams) (*Richlist, error) { + endpoint := "/api/v1/richlist" + + if params != nil { + v := url.Values{} + v.Add("n", fmt.Sprint(params.N)) + v.Add("include-distribution", fmt.Sprint(params.IncludeDistribution)) + endpoint = "/api/v1/richlist?" + v.Encode() + } + + var r Richlist + if err := c.Get(endpoint, &r); err != nil { + return nil, err + } + return &r, nil +} + +// AddressCount makes a request to GET /api/v1/addresscount +func (c *Client) AddressCount() (uint64, error) { + var r struct { + Count uint64 `json:"count"` + } + if err := c.Get("/api/v1/addresscount", &r); err != nil { + return 0, err + } + return r.Count, nil + +} + +// UnloadWallet makes a request to POST /api/v1/wallet/unload +func (c *Client) UnloadWallet(id string) error { + v := url.Values{} + v.Add("id", id) + return c.PostForm("/api/v1/wallet/unload", strings.NewReader(v.Encode()), nil) +} + +// Health makes a request to GET /api/v1/health +func (c *Client) Health() (*HealthResponse, error) { + var r HealthResponse + if err := c.Get("/api/v1/health", &r); err != nil { + return nil, err + } + + return &r, nil +} + +// EncryptWallet makes a request to POST /api/v1/wallet/encrypt to encrypt a specific wallet with the given password +func (c *Client) EncryptWallet(id, password string) (*WalletResponse, error) { + v := url.Values{} + v.Add("id", id) + v.Add("password", password) + var wlt WalletResponse + if err := c.PostForm("/api/v1/wallet/encrypt", strings.NewReader(v.Encode()), &wlt); err != nil { + return nil, err + } + + return &wlt, nil +} + +// DecryptWallet makes a request to POST /api/v1/wallet/decrypt to decrypt a wallet +func (c *Client) DecryptWallet(id, password string) (*WalletResponse, error) { + v := url.Values{} + v.Add("id", id) + v.Add("password", password) + var wlt WalletResponse + if err := c.PostForm("/api/v1/wallet/decrypt", strings.NewReader(v.Encode()), &wlt); err != nil { + return nil, err + } + + return &wlt, nil +} + +// RecoverWallet makes a request to POST /api/v2/wallet/recover to recover an encrypted wallet by seed. +// The password argument is optional, if provided, the recovered wallet will be encrypted with this password, +// otherwise the recovered wallet will be unencrypted. +func (c *Client) RecoverWallet(req WalletRecoverRequest) (*WalletResponse, error) { + var rsp WalletResponse + ok, err := c.PostJSONV2("/api/v2/wallet/recover", req, &rsp) + if ok { + return &rsp, err + } + + return nil, err +} + +// Disconnect disconnect a connections by ID +func (c *Client) Disconnect(id uint64) error { + v := url.Values{} + v.Add("id", fmt.Sprint(id)) + + var obj struct{} + return c.PostForm("/api/v1/network/connection/disconnect", strings.NewReader(v.Encode()), &obj) +} + +// GetAllStorageValues makes a GET request to /api/v2/data to get all the values from the storage of +// `storageType` type +func (c *Client) GetAllStorageValues(storageType kvstorage.Type) (map[string]string, error) { + var values map[string]string + ok, err := c.GetV2(fmt.Sprintf("/api/v2/data?type=%s", storageType), &values) + if !ok { + return nil, err + } + + return values, err +} + +// GetStorageValue makes a GET request to /api/v2/data to get the value associated with `key` from storage +// of `storageType` type +func (c *Client) GetStorageValue(storageType kvstorage.Type, key string) (string, error) { + var value string + ok, err := c.GetV2(fmt.Sprintf("/api/v2/data?type=%s&key=%s", storageType, key), &value) + if !ok { + return "", err + } + + return value, err +} + +// AddStorageValue make a POST request to /api/v2/data to add a value with the key to the storage +// of `storageType` type +func (c *Client) AddStorageValue(storageType kvstorage.Type, key, val string) error { + _, err := c.PostJSONV2("/api/v2/data", StorageRequest{ + StorageType: storageType, + Key: key, + Val: val, + }, nil) + + return err +} + +// RemoveStorageValue makes a DELETE request to /api/v2/data to remove a value associated with the `key` +// from the storage of `storageType` type +func (c *Client) RemoveStorageValue(storageType kvstorage.Type, key string) error { + _, err := c.DeleteV2(fmt.Sprintf("/api/v2/data?type=%s&key=%s", storageType, key), nil) + + return err +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/csrf.go b/vendor/github.com/SkycoinProject/skycoin/src/api/csrf.go new file mode 100644 index 00000000..48024a0e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/csrf.go @@ -0,0 +1,165 @@ +package api + +import ( + "net/http" + "time" + + "crypto/hmac" + "crypto/sha256" + "encoding/base64" + "encoding/json" + "errors" + "fmt" + "strings" + + "github.com/SkycoinProject/skycoin/src/cipher" + wh "github.com/SkycoinProject/skycoin/src/util/http" +) + +const ( + // CSRFHeaderName is the name of the CSRF header + CSRFHeaderName = "X-CSRF-Token" + + // CSRFMaxAge is the lifetime of a CSRF token in seconds + CSRFMaxAge = time.Second * 30 + + csrfSecretLength = 64 + + csrfNonceLength = 64 +) + +var ( + // ErrCSRFInvalid is returned when the the CSRF token is in invalid format + ErrCSRFInvalid = errors.New("invalid CSRF token") + // ErrCSRFInvalidSignature is returned when the signature of the csrf token is invalid + ErrCSRFInvalidSignature = errors.New("invalid CSRF token signature") + // ErrCSRFExpired is returned when the csrf token has expired + ErrCSRFExpired = errors.New("csrf token expired") +) + +var csrfSecretKey []byte + +func init() { + csrfSecretKey = cipher.RandByte(csrfSecretLength) +} + +// CSRFToken csrf token +type CSRFToken struct { + Nonce []byte + ExpiresAt time.Time +} + +// newCSRFToken generates a new CSRF Token +func newCSRFToken() (string, error) { + return newCSRFTokenWithTime(time.Now().Add(CSRFMaxAge)) +} + +func newCSRFTokenWithTime(expiresAt time.Time) (string, error) { + token := &CSRFToken{ + Nonce: cipher.RandByte(csrfNonceLength), + ExpiresAt: expiresAt, + } + + tokenJSON, err := json.Marshal(token) + if err != nil { + return "", err + } + + h := hmac.New(sha256.New, csrfSecretKey) + _, err = h.Write([]byte(tokenJSON)) + if err != nil { + return "", err + } + + sig := base64.RawURLEncoding.EncodeToString(h.Sum(nil)) + + signingString := base64.RawURLEncoding.EncodeToString(tokenJSON) + + return strings.Join([]string{signingString, sig}, "."), nil +} + +// verifyCSRFToken checks validity of the given token +func verifyCSRFToken(headerToken string) error { + tokenParts := strings.Split(headerToken, ".") + if len(tokenParts) != 2 { + return ErrCSRFInvalid + } + + signingString, err := base64.RawURLEncoding.DecodeString(tokenParts[0]) + if err != nil { + return err + } + + h := hmac.New(sha256.New, csrfSecretKey) + _, err = h.Write([]byte(signingString)) + if err != nil { + return err + } + + sig := base64.RawURLEncoding.EncodeToString(h.Sum(nil)) + + if sig != tokenParts[1] { + return ErrCSRFInvalidSignature + } + + var csrfToken CSRFToken + err = json.Unmarshal(signingString, &csrfToken) + if err != nil { + return err + } + + if time.Now().After(csrfToken.ExpiresAt) { + return ErrCSRFExpired + } + + return nil +} + +// Creates a new CSRF token. Previous CSRF tokens are invalidated by this call. +// URI: /api/v1/csrf +// Method: GET +// Response: +// csrf_token: CSRF token to use in POST requests +func getCSRFToken(disabled bool) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + if disabled { + logger.Warning("CSRF check disabled") + wh.Error404(w, "") + return + } + + // generate a new token + csrfToken, err := newCSRFToken() + if err != nil { + logger.Error(err) + wh.Error500(w, fmt.Sprintf("Failed to create a csrf token: %v", err)) + return + } + + wh.SendJSONOr500(logger, w, &map[string]string{"csrf_token": csrfToken}) + } +} + +// CSRFCheck verifies X-CSRF-Token header value +func CSRFCheck(apiVersion string, disabled bool, handler http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if !disabled { + switch r.Method { + case http.MethodPost, http.MethodPut, http.MethodDelete: + token := r.Header.Get(CSRFHeaderName) + if err := verifyCSRFToken(token); err != nil { + logger.Errorf("CSRF token invalid: %v", err) + writeError(w, apiVersion, http.StatusForbidden, err.Error()) + return + } + } + } + + handler.ServeHTTP(w, r) + }) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/csrf_test.go b/vendor/github.com/SkycoinProject/skycoin/src/api/csrf_test.go new file mode 100644 index 00000000..b30f29bb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/csrf_test.go @@ -0,0 +1,266 @@ +package api + +import ( + "fmt" + "net/http" + "net/http/httptest" + "net/url" + "strings" + "testing" + "time" + + "encoding/json" + "sync" + + "github.com/stretchr/testify/require" +) + +const ( + tokenValid = "token_valid" + tokenInvalid = "token_invalid" + tokenInvalidSignature = "token_invalid_signature" + tokenExpired = "token_expired" + tokenEmpty = "token_empty" +) + +func setCSRFParameters(t *testing.T, tokenType string, req *http.Request) { + token, err := newCSRFToken() + require.NoError(t, err) + // token check + switch tokenType { + case tokenValid: + req.Header.Set("X-CSRF-Token", token) + case tokenInvalid: + // add invalid token value + req.Header.Set("X-CSRF-Token", "xcasadsadsa") + case tokenInvalidSignature: + req.Header.Set("X-CSRF-Token", "YXNkc2Fkcw.YXNkc2Fkcw") + case tokenExpired: + // set some old unix time + expiredToken, err := newCSRFTokenWithTime(time.Unix(1517509381, 10)) + require.NoError(t, err) + req.Header.Set("X-CSRF-Token", expiredToken) + case tokenEmpty: + // add empty token + req.Header.Set("X-CSRF-Token", "") + } +} + +func TestCSRFWrapper(t *testing.T) { + methods := []string{http.MethodPost, http.MethodPut, http.MethodDelete} + cases := []string{tokenInvalid, tokenExpired, tokenEmpty, tokenInvalidSignature} + + for endpoint := range endpointsMethods { + for _, method := range methods { + for _, c := range cases { + name := fmt.Sprintf("%s %s %s", method, endpoint, c) + t.Run(name, func(t *testing.T) { + gateway := &MockGatewayer{} + + req, err := http.NewRequest(method, endpoint, nil) + require.NoError(t, err) + + setCSRFParameters(t, c, req) + + isAPIV2 := strings.HasPrefix(endpoint, "/api/v2") + if isAPIV2 { + req.Header.Set("Content-Type", ContentTypeJSON) + } + + rr := httptest.NewRecorder() + handler := newServerMux(muxConfig{ + host: configuredHost, + appLoc: ".", + disableCSRF: false, + disableCSP: true, + enabledAPISets: allAPISetsEnabled, + }, gateway) + + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, http.StatusForbidden, status, "wrong status code: got `%v` want `%v`", status, http.StatusForbidden) + + var errMsg error + switch c { + case tokenInvalid, tokenEmpty: + errMsg = ErrCSRFInvalid + case tokenInvalidSignature: + errMsg = ErrCSRFInvalidSignature + case tokenExpired: + errMsg = ErrCSRFExpired + } + + if isAPIV2 { + require.Equal(t, fmt.Sprintf("{\n \"error\": {\n \"message\": \"%s\",\n \"code\": 403\n }\n}", errMsg), rr.Body.String()) + } else { + require.Equal(t, fmt.Sprintf("403 Forbidden - %s\n", errMsg), rr.Body.String()) + } + }) + } + } + } +} + +func TestCSRFWrapperConcurrent(t *testing.T) { + methods := []string{http.MethodPost, http.MethodPut, http.MethodDelete} + cases := []string{tokenInvalid, tokenExpired, tokenEmpty, tokenInvalidSignature} + + gateway := &MockGatewayer{} + + handler := newServerMux(muxConfig{ + host: configuredHost, + appLoc: ".", + disableCSRF: false, + disableCSP: true, + enabledAPISets: allAPISetsEnabled, + }, gateway) + + var wg sync.WaitGroup + + for i := 0; i < 6; i++ { + wg.Add(1) + go func() { + defer wg.Done() + for endpoint := range endpointsMethods { + for _, method := range methods { + for _, c := range cases { + name := fmt.Sprintf("%s %s %s", method, endpoint, c) + t.Run(name, func(t *testing.T) { + + req, err := http.NewRequest(method, endpoint, nil) + require.NoError(t, err) + + setCSRFParameters(t, c, req) + + isAPIV2 := strings.HasPrefix(endpoint, "/api/v2") + if isAPIV2 { + req.Header.Set("Content-Type", ContentTypeJSON) + } + + rr := httptest.NewRecorder() + + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, http.StatusForbidden, status, "wrong status code: got `%v` want `%v`", status, http.StatusForbidden) + + var errMsg error + switch c { + case tokenInvalid, tokenEmpty: + errMsg = ErrCSRFInvalid + case tokenInvalidSignature: + errMsg = ErrCSRFInvalidSignature + case tokenExpired: + errMsg = ErrCSRFExpired + } + + if isAPIV2 { + require.Equal(t, fmt.Sprintf("{\n \"error\": {\n \"message\": \"%s\",\n \"code\": 403\n }\n}", errMsg), rr.Body.String()) + } else { + require.Equal(t, fmt.Sprintf("403 Forbidden - %s\n", errMsg), rr.Body.String()) + } + }) + } + } + } + }() + } + wg.Wait() + +} + +func TestCSRF(t *testing.T) { + updateWalletLabel := func(csrfToken string) *httptest.ResponseRecorder { + gateway := &MockGatewayer{} + gateway.On("UpdateWalletLabel", "fooid", "foolabel").Return(nil) + + endpoint := "/api/v1/wallet/update" + + v := url.Values{} + v.Add("id", "fooid") + v.Add("label", "foolabel") + + req, err := http.NewRequest(http.MethodPost, endpoint, strings.NewReader(v.Encode())) + require.NoError(t, err) + req.Header.Add("Content-Type", ContentTypeForm) + + if csrfToken != "" { + req.Header.Set("X-CSRF-Token", csrfToken) + } + + rr := httptest.NewRecorder() + handler := newServerMux(muxConfig{ + host: configuredHost, + appLoc: ".", + disableCSRF: false, + disableCSP: true, + enabledAPISets: allAPISetsEnabled, + }, gateway) + + handler.ServeHTTP(rr, req) + + return rr + } + + // First request to POST /wallet/update is rejected because of missing CSRF + rr := updateWalletLabel("") + require.Equal(t, http.StatusForbidden, rr.Code) + require.Equal(t, "403 Forbidden - invalid CSRF token\n", rr.Body.String()) + + // Make a request to /csrf to get a token + gateway := &MockGatewayer{} + cfg := defaultMuxConfig() + cfg.disableCSRF = false + handler := newServerMux(cfg, gateway) + + // non-GET request to /csrf is invalid + req, err := http.NewRequest(http.MethodPost, "/api/v1/csrf", nil) + require.NoError(t, err) + + rr = httptest.NewRecorder() + handler.ServeHTTP(rr, req) + + require.Equal(t, http.StatusMethodNotAllowed, rr.Code) + + // CSRF disabled 404s + cfg.disableCSRF = true + handler = newServerMux(cfg, gateway) + + req, err = http.NewRequest(http.MethodGet, "/api/v1/csrf", nil) + require.NoError(t, err) + + rr = httptest.NewRecorder() + handler.ServeHTTP(rr, req) + + require.Equal(t, http.StatusNotFound, rr.Code) + + cfg.disableCSRF = false + handler = newServerMux(cfg, gateway) + + // Request a CSRF token, use it in a request + req, err = http.NewRequest(http.MethodGet, "/api/v1/csrf", nil) + require.NoError(t, err) + + rr = httptest.NewRecorder() + handler.ServeHTTP(rr, req) + + require.Equal(t, http.StatusOK, rr.Code) + + var msg map[string]string + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + + token := msg["csrf_token"] + require.NotEmpty(t, token) + + req, err = http.NewRequest(http.MethodPost, "/api/v1/version", nil) + require.NoError(t, err) + + rr = httptest.NewRecorder() + handler.ServeHTTP(rr, req) + + // Make a request to POST /wallet/update again, using the CSRF token + rr = updateWalletLabel(token) + require.Equal(t, http.StatusOK, rr.Code) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/explorer.go b/vendor/github.com/SkycoinProject/skycoin/src/api/explorer.go new file mode 100644 index 00000000..115e7665 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/explorer.go @@ -0,0 +1,242 @@ +package api + +import ( + "fmt" + "net/http" + "strconv" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/readable" + "github.com/SkycoinProject/skycoin/src/util/droplet" + wh "github.com/SkycoinProject/skycoin/src/util/http" + "github.com/SkycoinProject/skycoin/src/util/mathutil" +) + +// CoinSupply records the coin supply info +type CoinSupply struct { + // Coins distributed beyond the project: + CurrentSupply string `json:"current_supply"` + // TotalSupply is CurrentSupply plus coins held by the distribution addresses that are spendable + TotalSupply string `json:"total_supply"` + // MaxSupply is the maximum number of coins to be distributed ever + MaxSupply string `json:"max_supply"` + // CurrentCoinHourSupply is coins hours in non distribution addresses + CurrentCoinHourSupply string `json:"current_coinhour_supply"` + // TotalCoinHourSupply is coin hours in all addresses including unlocked distribution addresses + TotalCoinHourSupply string `json:"total_coinhour_supply"` + // Distribution addresses which count towards total supply + UnlockedAddresses []string `json:"unlocked_distribution_addresses"` + // Distribution addresses which are locked and do not count towards total supply + LockedAddresses []string `json:"locked_distribution_addresses"` +} + +func newAddrSet(addrs []cipher.Address) map[cipher.Address]struct{} { + s := make(map[cipher.Address]struct{}, len(addrs)) + for _, a := range addrs { + s[a] = struct{}{} + } + return s +} + +// coinSupplyHandler returns coin distribution supply stats +// Method: GET +// URI: /api/v1/coinSupply +func coinSupplyHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + allUnspents, err := gateway.GetUnspentOutputsSummary(nil) + if err != nil { + err = fmt.Errorf("gateway.GetUnspentOutputsSummary failed: %v", err) + wh.Error500(w, err.Error()) + return + } + + dist := gateway.VisorConfig().Distribution + + unlockedAddrs := dist.UnlockedAddressesDecoded() + // Search map of unlocked addresses, used to filter unspents + unlockedAddrSet := newAddrSet(unlockedAddrs) + + var unlockedSupply uint64 + // check confirmed unspents only + for _, u := range allUnspents.Confirmed { + // check if address is an unlocked distribution address + if _, ok := unlockedAddrSet[u.Body.Address]; ok { + var err error + unlockedSupply, err = mathutil.AddUint64(unlockedSupply, u.Body.Coins) + if err != nil { + err = fmt.Errorf("uint64 overflow while adding up unlocked supply coins: %v", err) + wh.Error500(w, err.Error()) + return + } + } + } + + // "total supply" is the number of coins unlocked. + // Each distribution address was allocated distribution.AddressInitialBalance coins. + totalSupply := uint64(len(unlockedAddrs)) * dist.AddressInitialBalance() + totalSupply *= droplet.Multiplier + + // "current supply" is the number of coins distributed from the unlocked pool + currentSupply := totalSupply - unlockedSupply + + currentSupplyStr, err := droplet.ToString(currentSupply) + if err != nil { + err = fmt.Errorf("Failed to convert coins to string: %v", err) + wh.Error500(w, err.Error()) + return + } + + totalSupplyStr, err := droplet.ToString(totalSupply) + if err != nil { + err = fmt.Errorf("Failed to convert coins to string: %v", err) + wh.Error500(w, err.Error()) + return + } + + maxSupplyStr, err := droplet.ToString(dist.MaxCoinSupply * droplet.Multiplier) + if err != nil { + err = fmt.Errorf("Failed to convert coins to string: %v", err) + wh.Error500(w, err.Error()) + return + } + + // locked distribution addresses + lockedAddrs := dist.LockedAddressesDecoded() + lockedAddrSet := newAddrSet(lockedAddrs) + + // get total coins hours which excludes locked distribution addresses + var totalCoinHours uint64 + for _, out := range allUnspents.Confirmed { + if _, ok := lockedAddrSet[out.Body.Address]; !ok { + var err error + totalCoinHours, err = mathutil.AddUint64(totalCoinHours, out.CalculatedHours) + if err != nil { + err = fmt.Errorf("uint64 overflow while adding up total coin hours: %v", err) + wh.Error500(w, err.Error()) + return + } + } + } + + // get current coin hours which excludes all distribution addresses + var currentCoinHours uint64 + for _, out := range allUnspents.Confirmed { + // check if address not in locked distribution addresses + if _, ok := lockedAddrSet[out.Body.Address]; !ok { + // check if address not in unlocked distribution addresses + if _, ok := unlockedAddrSet[out.Body.Address]; !ok { + currentCoinHours += out.CalculatedHours + } + } + } + + if err != nil { + err = fmt.Errorf("Failed to get total coinhours: %v", err) + wh.Error500(w, err.Error()) + return + } + + cs := CoinSupply{ + CurrentSupply: currentSupplyStr, + TotalSupply: totalSupplyStr, + MaxSupply: maxSupplyStr, + CurrentCoinHourSupply: strconv.FormatUint(currentCoinHours, 10), + TotalCoinHourSupply: strconv.FormatUint(totalCoinHours, 10), + UnlockedAddresses: dist.UnlockedAddresses(), + LockedAddresses: dist.LockedAddresses(), + } + + wh.SendJSONOr500(logger, w, cs) + } +} + +// Richlist contains top address balances +type Richlist struct { + Richlist []readable.RichlistBalance `json:"richlist"` +} + +// richlistHandler returns the top skycoin holders +// Method: GET +// URI: /richlist?n=${number}&include-distribution=${bool} +// Args: +// n [int, number of results to include] +// include-distribution [bool, include the distribution addresses in the richlist] +func richlistHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + var topn int + topnStr := r.FormValue("n") + if topnStr == "" { + topn = 20 + } else { + var err error + topn, err = strconv.Atoi(topnStr) + if err != nil { + wh.Error400(w, "invalid n") + return + } + } + + var includeDistribution bool + includeDistributionStr := r.FormValue("include-distribution") + if includeDistributionStr == "" { + includeDistribution = false + } else { + var err error + includeDistribution, err = strconv.ParseBool(includeDistributionStr) + if err != nil { + wh.Error400(w, "invalid include-distribution") + return + } + } + + richlist, err := gateway.GetRichlist(includeDistribution) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + if topn > 0 && topn < len(richlist) { + richlist = richlist[:topn] + } + + readableRichlist, err := readable.NewRichlistBalances(richlist) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, Richlist{ + Richlist: readableRichlist, + }) + } +} + +// addressCountHandler returns the total number of unique address that have coins +// Method: GET +// URI: /addresscount +func addressCountHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + addrCount, err := gateway.AddressCount() + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, &map[string]uint64{"count": addrCount}) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/explorer_test.go b/vendor/github.com/SkycoinProject/skycoin/src/api/explorer_test.go new file mode 100644 index 00000000..a1fc875f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/explorer_test.go @@ -0,0 +1,553 @@ +package api + +import ( + "encoding/json" + "errors" + "net/http" + "net/http/httptest" + "net/url" + "strconv" + "strings" + "testing" + + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/readable" + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/util/droplet" + "github.com/SkycoinProject/skycoin/src/visor" +) + +func makeSuccessCoinSupplyResult(t *testing.T, allUnspents readable.UnspentOutputsSummary) *CoinSupply { + unlockedAddrs := params.MainNetDistribution.UnlockedAddressesDecoded() + var unlockedSupply uint64 + // check confirmed unspents only + // Search map of unlocked addresses + // used to filter unspents + unlockedAddrSet := newAddrSet(unlockedAddrs) + for _, u := range allUnspents.HeadOutputs { + // check if address is an unlocked distribution address + if _, ok := unlockedAddrSet[cipher.MustDecodeBase58Address(u.Address)]; ok { + coins, err := droplet.FromString(u.Coins) + require.NoError(t, err) + unlockedSupply += coins + } + } + // "total supply" is the number of coins unlocked. + // Each distribution address was allocated params.MainNetDistribution.AddressInitialBalance coins. + totalSupply := uint64(len(unlockedAddrs)) * params.MainNetDistribution.AddressInitialBalance() + totalSupply *= droplet.Multiplier + + // "current supply" is the number of coins distribution from the unlocked pool + currentSupply := totalSupply - unlockedSupply + + currentSupplyStr, err := droplet.ToString(currentSupply) + require.NoError(t, err) + + totalSupplyStr, err := droplet.ToString(totalSupply) + require.NoError(t, err) + + maxSupplyStr, err := droplet.ToString(params.MainNetDistribution.MaxCoinSupply * droplet.Multiplier) + require.NoError(t, err) + + // locked distribution addresses + lockedAddrs := params.MainNetDistribution.LockedAddressesDecoded() + lockedAddrSet := newAddrSet(lockedAddrs) + + // get total coins hours which excludes locked distribution addresses + var totalCoinHours uint64 + for _, out := range allUnspents.HeadOutputs { + if _, ok := lockedAddrSet[cipher.MustDecodeBase58Address(out.Address)]; !ok { + totalCoinHours += out.Hours + } + } + + // get current coin hours which excludes all distribution addresses + var currentCoinHours uint64 + for _, out := range allUnspents.HeadOutputs { + // check if address not in locked distribution addresses + if _, ok := lockedAddrSet[cipher.MustDecodeBase58Address(out.Address)]; !ok { + // check if address not in unlocked distribution addresses + if _, ok := unlockedAddrSet[cipher.MustDecodeBase58Address(out.Address)]; !ok { + currentCoinHours += out.Hours + } + } + } + + cs := CoinSupply{ + CurrentSupply: currentSupplyStr, + TotalSupply: totalSupplyStr, + MaxSupply: maxSupplyStr, + CurrentCoinHourSupply: strconv.FormatUint(currentCoinHours, 10), + TotalCoinHourSupply: strconv.FormatUint(totalCoinHours, 10), + UnlockedAddresses: params.MainNetDistribution.UnlockedAddresses(), + LockedAddresses: params.MainNetDistribution.LockedAddresses(), + } + return &cs +} + +func TestCoinSupply(t *testing.T) { + addrs := []cipher.Address{ + testutil.MakeAddress(), + testutil.MakeAddress(), + } + + unlockedAddrs := params.MainNetDistribution.UnlockedAddressesDecoded() + successGatewayGetUnspentOutputsResult := readable.UnspentOutputsSummary{ + HeadOutputs: readable.UnspentOutputs{ + readable.UnspentOutput{ + Address: addrs[0].String(), + Coins: "0", + }, + readable.UnspentOutput{ + Address: addrs[1].String(), + Coins: "0", + }, + }, + } + + var filterInUnlocked []visor.OutputsFilter + filterInUnlocked = append(filterInUnlocked, visor.FbyAddresses(unlockedAddrs)) + tt := []struct { + name string + method string + status int + err string + gatewayGetUnspentOutputsArg []visor.OutputsFilter + gatewayGetUnspentOutputsResult *visor.UnspentOutputsSummary + gatewayGetUnspentOutputsErr error + result *CoinSupply + csrfDisabled bool + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "500 - gatewayGetUnspentOutputsErr", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gateway.GetUnspentOutputsSummary failed: gatewayGetUnspentOutputsErr", + gatewayGetUnspentOutputsArg: filterInUnlocked, + gatewayGetUnspentOutputsErr: errors.New("gatewayGetUnspentOutputsErr"), + }, + { + name: "500 - gatewayGetUnspentOutputsErr", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gateway.GetUnspentOutputsSummary failed: gatewayGetUnspentOutputsErr", + gatewayGetUnspentOutputsArg: filterInUnlocked, + gatewayGetUnspentOutputsErr: errors.New("gatewayGetUnspentOutputsErr"), + }, + { + name: "500 - too large HeadOutputs item", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - Failed to convert coins to string: Droplet string conversion failed: Value is too large", + gatewayGetUnspentOutputsArg: filterInUnlocked, + gatewayGetUnspentOutputsResult: &visor.UnspentOutputsSummary{ + Confirmed: []visor.UnspentOutput{ + visor.UnspentOutput{ + UxOut: coin.UxOut{ + Body: coin.UxBody{ + Coins: 9223372036854775807, + Address: unlockedAddrs[0], + }, + }, + }, + visor.UnspentOutput{ + UxOut: coin.UxOut{ + Body: coin.UxBody{ + Coins: 1000000, + Address: unlockedAddrs[0], + }, + }, + }, + }, + }, + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + + gatewayGetUnspentOutputsArg: filterInUnlocked, + gatewayGetUnspentOutputsResult: &visor.UnspentOutputsSummary{ + Confirmed: []visor.UnspentOutput{ + visor.UnspentOutput{ + UxOut: coin.UxOut{ + Body: coin.UxBody{ + Coins: 0, + Address: addrs[0], + }, + }, + }, + visor.UnspentOutput{ + UxOut: coin.UxOut{ + Body: coin.UxBody{ + Coins: 0, + Address: addrs[1], + }, + }, + }, + }, + }, + result: makeSuccessCoinSupplyResult(t, successGatewayGetUnspentOutputsResult), + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/coinSupply" + gateway := &MockGatewayer{} + gateway.On("GetUnspentOutputsSummary", mock.Anything).Return(tc.gatewayGetUnspentOutputsResult, tc.gatewayGetUnspentOutputsErr) + gateway.On("VisorConfig").Return(visor.Config{ + Distribution: params.MainNetDistribution, + }) + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + rr := httptest.NewRecorder() + + if tc.csrfDisabled { + setCSRFParameters(t, tokenInvalid, req) + } else { + setCSRFParameters(t, tokenValid, req) + } + + cfg := defaultMuxConfig() + cfg.disableCSRF = tc.csrfDisabled + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, want `%v`", strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg *CoinSupply + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.result, msg) + } + }) + } +} + +func TestGetRichlist(t *testing.T) { + type httpParams struct { + topn string + includeDistribution string + } + tt := []struct { + name string + method string + status int + err string + httpParams *httpParams + includeDistribution bool + gatewayGetRichlistResult visor.Richlist + gatewayGetRichlistErr error + result Richlist + csrfDisabled bool + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "400 - bad topn param", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid n", + httpParams: &httpParams{ + topn: "bad topn", + }, + }, + { + name: "400 - include-distribution", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid include-distribution", + httpParams: &httpParams{ + topn: "1", + includeDistribution: "bad include-distribution", + }, + }, + { + name: "500 - gw GetRichlist error", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gatewayGetRichlistErr", + httpParams: &httpParams{ + topn: "1", + includeDistribution: "false", + }, + gatewayGetRichlistErr: errors.New("gatewayGetRichlistErr"), + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + httpParams: &httpParams{ + topn: "3", + includeDistribution: "false", + }, + gatewayGetRichlistResult: visor.Richlist{ + { + Address: cipher.MustDecodeBase58Address("2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF"), + Coins: 1000000e6, + Locked: false, + }, + { + Address: cipher.MustDecodeBase58Address("27jg25DZX21MXMypVbKJMmgCJ5SPuEunMF1"), + Coins: 500000e6, + Locked: false, + }, + { + Address: cipher.MustDecodeBase58Address("2fGi2jhvp6ppHg3DecguZgzqvpJj2Gd4KHW"), + Coins: 500000e6, + Locked: false, + }, + { + Address: cipher.MustDecodeBase58Address("2TmvdBWJgxMwGs84R4drS9p5fYkva4dGdfs"), + Coins: 244458e6, + Locked: false, + }, + { + Address: cipher.MustDecodeBase58Address("24gvUHXHtSg5drKiFsMw7iMgoN2PbLub53C"), + Coins: 195503e6, + Locked: false, + }, + }, + result: Richlist{ + Richlist: []readable.RichlistBalance{ + { + Address: "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + Coins: "1000000.000000", + Locked: false, + }, + { + Address: "27jg25DZX21MXMypVbKJMmgCJ5SPuEunMF1", + Coins: "500000.000000", + Locked: false, + }, + { + Address: "2fGi2jhvp6ppHg3DecguZgzqvpJj2Gd4KHW", + Coins: "500000.000000", + Locked: false, + }, + }, + }, + }, + { + name: "200 no limit", + method: http.MethodGet, + status: http.StatusOK, + httpParams: &httpParams{ + topn: "0", + includeDistribution: "false", + }, + gatewayGetRichlistResult: visor.Richlist{ + { + Address: cipher.MustDecodeBase58Address("2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF"), + Coins: 1000000e6, + Locked: false, + }, + { + Address: cipher.MustDecodeBase58Address("27jg25DZX21MXMypVbKJMmgCJ5SPuEunMF1"), + Coins: 500000e6, + Locked: false, + }, + { + Address: cipher.MustDecodeBase58Address("2fGi2jhvp6ppHg3DecguZgzqvpJj2Gd4KHW"), + Coins: 500000e6, + Locked: false, + }, + { + Address: cipher.MustDecodeBase58Address("2TmvdBWJgxMwGs84R4drS9p5fYkva4dGdfs"), + Coins: 244458e6, + Locked: false, + }, + { + Address: cipher.MustDecodeBase58Address("24gvUHXHtSg5drKiFsMw7iMgoN2PbLub53C"), + Coins: 195503e6, + Locked: false, + }, + }, + result: Richlist{ + Richlist: []readable.RichlistBalance{ + { + Address: "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + Coins: "1000000.000000", + Locked: false, + }, + { + Address: "27jg25DZX21MXMypVbKJMmgCJ5SPuEunMF1", + Coins: "500000.000000", + Locked: false, + }, + { + Address: "2fGi2jhvp6ppHg3DecguZgzqvpJj2Gd4KHW", + Coins: "500000.000000", + Locked: false, + }, + { + Address: "2TmvdBWJgxMwGs84R4drS9p5fYkva4dGdfs", + Coins: "244458.000000", + Locked: false, + }, + { + Address: "24gvUHXHtSg5drKiFsMw7iMgoN2PbLub53C", + Coins: "195503.000000", + Locked: false, + }, + }, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/richlist" + gateway := &MockGatewayer{} + gateway.On("GetRichlist", tc.includeDistribution).Return(tc.gatewayGetRichlistResult, tc.gatewayGetRichlistErr) + + v := url.Values{} + if tc.httpParams != nil { + if tc.httpParams.topn != "" { + v.Add("n", tc.httpParams.topn) + } + if tc.httpParams.includeDistribution != "" { + v.Add("include-distribution", tc.httpParams.includeDistribution) + } + } + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + rr := httptest.NewRecorder() + + if tc.csrfDisabled { + setCSRFParameters(t, tokenInvalid, req) + } else { + setCSRFParameters(t, tokenValid, req) + } + handler := newServerMux(muxConfig{ + host: configuredHost, + appLoc: ".", + disableCSRF: tc.csrfDisabled, + disableCSP: true, + enabledAPISets: allAPISetsEnabled, + }, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, want `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg Richlist + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.result, msg) + } + }) + } +} + +func TestGetAddressCount(t *testing.T) { + type Result struct { + Count uint64 + } + tt := []struct { + name string + method string + status int + err string + gatewayGetAddressCountResult uint64 + gatewayGetAddressCountErr error + result Result + csrfDisabled bool + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "500 - gw GetAddressCount error", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gatewayGetAddressCountErr", + gatewayGetAddressCountErr: errors.New("gatewayGetAddressCountErr"), + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + gatewayGetAddressCountResult: 1, + result: Result{ + Count: 1, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/addresscount" + gateway := &MockGatewayer{} + gateway.On("AddressCount").Return(tc.gatewayGetAddressCountResult, tc.gatewayGetAddressCountErr) + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + rr := httptest.NewRecorder() + + if tc.csrfDisabled { + setCSRFParameters(t, tokenInvalid, req) + } else { + setCSRFParameters(t, tokenValid, req) + } + + handler := newServerMux(muxConfig{ + host: configuredHost, + appLoc: ".", + disableCSRF: tc.csrfDisabled, + disableCSP: true, + enabledAPISets: allAPISetsEnabled, + }, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, want `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg Result + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.result, msg) + } + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/gateway.go b/vendor/github.com/SkycoinProject/skycoin/src/api/gateway.go new file mode 100644 index 00000000..83c2a7e3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/gateway.go @@ -0,0 +1,120 @@ +package api + +import ( + "time" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/daemon" + "github.com/SkycoinProject/skycoin/src/kvstorage" + "github.com/SkycoinProject/skycoin/src/transaction" + "github.com/SkycoinProject/skycoin/src/visor" + "github.com/SkycoinProject/skycoin/src/visor/historydb" + "github.com/SkycoinProject/skycoin/src/wallet" +) + +//go:generate mockery -name Gatewayer -case underscore -inpkg -testonly + +// Gateway bundles daemon.Daemon, Visor, wallet.Service and kvstorage.Manager into a single object +type Gateway struct { + *daemon.Daemon + *visor.Visor + *wallet.Service + *kvstorage.Manager +} + +// NewGateway creates a Gateway +func NewGateway(d *daemon.Daemon, v *visor.Visor, w *wallet.Service, m *kvstorage.Manager) *Gateway { + return &Gateway{ + Daemon: d, + Visor: v, + Service: w, + Manager: m, + } +} + +// Gatewayer interface for Gateway methods +type Gatewayer interface { + Daemoner + Visorer + Walleter + Storer +} + +// Daemoner interface for daemon.Daemon methods used by the API +type Daemoner interface { + DaemonConfig() daemon.DaemonConfig + GetConnection(addr string) (*daemon.Connection, error) + GetConnections(f func(c daemon.Connection) bool) ([]daemon.Connection, error) + DisconnectByGnetID(gnetID uint64) error + GetDefaultConnections() []string + GetTrustConnections() []string + GetExchgConnection() []string + GetBlockchainProgress(headSeq uint64) *daemon.BlockchainProgress + InjectBroadcastTransaction(txn coin.Transaction) error + InjectTransaction(txn coin.Transaction) error +} + +// Visorer interface for visor.Visor methods used by the API +type Visorer interface { + VisorConfig() visor.Config + StartedAt() time.Time + HeadBkSeq() (uint64, bool, error) + GetBlockchainMetadata() (*visor.BlockchainMetadata, error) + ResendUnconfirmedTxns() ([]cipher.SHA256, error) + GetSignedBlockByHash(hash cipher.SHA256) (*coin.SignedBlock, error) + GetSignedBlockByHashVerbose(hash cipher.SHA256) (*coin.SignedBlock, [][]visor.TransactionInput, error) + GetSignedBlockBySeq(seq uint64) (*coin.SignedBlock, error) + GetSignedBlockBySeqVerbose(seq uint64) (*coin.SignedBlock, [][]visor.TransactionInput, error) + GetBlocks(seqs []uint64) ([]coin.SignedBlock, error) + GetBlocksVerbose(seqs []uint64) ([]coin.SignedBlock, [][][]visor.TransactionInput, error) + GetBlocksInRange(start, end uint64) ([]coin.SignedBlock, error) + GetBlocksInRangeVerbose(start, end uint64) ([]coin.SignedBlock, [][][]visor.TransactionInput, error) + GetLastBlocks(num uint64) ([]coin.SignedBlock, error) + GetLastBlocksVerbose(num uint64) ([]coin.SignedBlock, [][][]visor.TransactionInput, error) + GetUnspentOutputsSummary(filters []visor.OutputsFilter) (*visor.UnspentOutputsSummary, error) + GetBalanceOfAddresses(addrs []cipher.Address) ([]wallet.BalancePair, error) + VerifyTxnVerbose(txn *coin.Transaction, signed visor.TxnSignedFlag) ([]visor.TransactionInput, bool, error) + AddressCount() (uint64, error) + GetUxOutByID(id cipher.SHA256) (*historydb.UxOut, error) + GetSpentOutputsForAddresses(addr []cipher.Address) ([][]historydb.UxOut, error) + GetVerboseTransactionsForAddress(a cipher.Address) ([]visor.Transaction, [][]visor.TransactionInput, error) + GetRichlist(includeDistribution bool) (visor.Richlist, error) + GetAllUnconfirmedTransactions() ([]visor.UnconfirmedTransaction, error) + GetAllUnconfirmedTransactionsVerbose() ([]visor.UnconfirmedTransaction, [][]visor.TransactionInput, error) + GetTransaction(txid cipher.SHA256) (*visor.Transaction, error) + GetTransactionWithInputs(txid cipher.SHA256) (*visor.Transaction, []visor.TransactionInput, error) + GetTransactions(flts []visor.TxFilter) ([]visor.Transaction, error) + GetTransactionsWithInputs(flts []visor.TxFilter) ([]visor.Transaction, [][]visor.TransactionInput, error) + AddressesActivity(addrs []cipher.Address) ([]bool, error) + GetWalletUnconfirmedTransactions(wltID string) ([]visor.UnconfirmedTransaction, error) + GetWalletUnconfirmedTransactionsVerbose(wltID string) ([]visor.UnconfirmedTransaction, [][]visor.TransactionInput, error) + GetWalletBalance(wltID string) (wallet.BalancePair, wallet.AddressBalances, error) + CreateTransaction(p transaction.Params, wp visor.CreateTransactionParams) (*coin.Transaction, []visor.TransactionInput, error) + WalletCreateTransaction(wltID string, p transaction.Params, wp visor.CreateTransactionParams) (*coin.Transaction, []visor.TransactionInput, error) + WalletCreateTransactionSigned(wltID string, password []byte, p transaction.Params, wp visor.CreateTransactionParams) (*coin.Transaction, []visor.TransactionInput, error) + WalletSignTransaction(wltID string, password []byte, txn *coin.Transaction, signIndexes []int) (*coin.Transaction, []visor.TransactionInput, error) +} + +// Walleter interface for wallet.Service methods used by the API +type Walleter interface { + UnloadWallet(wltID string) error + EncryptWallet(wltID string, password []byte) (wallet.Wallet, error) + DecryptWallet(wltID string, password []byte) (wallet.Wallet, error) + GetWalletSeed(wltID string, password []byte) (string, string, error) + CreateWallet(wltName string, options wallet.Options, bg wallet.TransactionsFinder) (wallet.Wallet, error) + RecoverWallet(wltID, seed, seedPassphrase string, password []byte) (wallet.Wallet, error) + NewAddresses(wltID string, password []byte, n uint64) ([]cipher.Address, error) + GetWallet(wltID string) (wallet.Wallet, error) + GetWallets() (wallet.Wallets, error) + UpdateWalletLabel(wltID, label string) error + WalletDir() (string, error) +} + +// Storer interface for kvstorage.Manager methods used by the API +type Storer interface { + GetStorageValue(storageType kvstorage.Type, key string) (string, error) + GetAllStorageValues(storageType kvstorage.Type) (map[string]string, error) + AddStorageValue(storageType kvstorage.Type, key, val string) error + RemoveStorageValue(storageType kvstorage.Type, key string) error +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/health.go b/vendor/github.com/SkycoinProject/skycoin/src/api/health.go new file mode 100644 index 00000000..a10db54c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/health.go @@ -0,0 +1,118 @@ +package api + +import ( + "fmt" + "net/http" + "time" + + "github.com/SkycoinProject/skycoin/src/daemon" + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/readable" + wh "github.com/SkycoinProject/skycoin/src/util/http" +) + +// BlockchainMetadata extends visor.BlockchainMetadata to include the time since the last block +type BlockchainMetadata struct { + readable.BlockchainMetadata + TimeSinceLastBlock wh.Duration `json:"time_since_last_block"` +} + +// HealthResponse is returned by the /health endpoint +type HealthResponse struct { + BlockchainMetadata BlockchainMetadata `json:"blockchain"` + Version readable.BuildInfo `json:"version"` + CoinName string `json:"coin"` + DaemonUserAgent string `json:"user_agent"` + OpenConnections int `json:"open_connections"` + OutgoingConnections int `json:"outgoing_connections"` + IncomingConnections int `json:"incoming_connections"` + Uptime wh.Duration `json:"uptime"` + CSRFEnabled bool `json:"csrf_enabled"` + HeaderCheckEnabled bool `json:"header_check_enabled"` + CSPEnabled bool `json:"csp_enabled"` + WalletAPIEnabled bool `json:"wallet_api_enabled"` + GUIEnabled bool `json:"gui_enabled"` + BlockPublisher bool `json:"block_publisher"` + UserVerifyTxn readable.VerifyTxn `json:"user_verify_transaction"` + UnconfirmedVerifyTxn readable.VerifyTxn `json:"unconfirmed_verify_transaction"` + StartedAt int64 `json:"started_at"` + Fiber readable.FiberConfig `json:"fiber"` +} + +func getHealthData(c muxConfig, gateway Gatewayer) (*HealthResponse, error) { + metadata, err := gateway.GetBlockchainMetadata() + if err != nil { + return nil, fmt.Errorf("gateway.GetBlockchainMetadata failed: %v", err) + } + + conns, err := gateway.GetConnections(func(c daemon.Connection) bool { + return c.State != daemon.ConnectionStatePending + }) + if err != nil { + return nil, fmt.Errorf("gateway.GetConnections failed: %v", err) + } + + outgoingConns := 0 + incomingConns := 0 + for _, c := range conns { + if c.Outgoing { + outgoingConns++ + } else { + incomingConns++ + } + } + + elapsedBlockTime := time.Now().UTC().Unix() - int64(metadata.HeadBlock.Head.Time) + timeSinceLastBlock := time.Second * time.Duration(elapsedBlockTime) + + _, walletAPIEnabled := c.enabledAPISets[EndpointsWallet] + + userAgent, err := c.health.DaemonUserAgent.Build() + if err != nil { + return nil, err + } + + return &HealthResponse{ + BlockchainMetadata: BlockchainMetadata{ + BlockchainMetadata: readable.NewBlockchainMetadata(*metadata), + TimeSinceLastBlock: wh.FromDuration(timeSinceLastBlock), + }, + Version: c.health.BuildInfo, + CoinName: c.health.Fiber.Name, + Fiber: c.health.Fiber, + DaemonUserAgent: userAgent, + OpenConnections: len(conns), + OutgoingConnections: outgoingConns, + IncomingConnections: incomingConns, + CSRFEnabled: !c.disableCSRF, + HeaderCheckEnabled: !c.disableHeaderCheck, + CSPEnabled: !c.disableCSP, + GUIEnabled: c.enableGUI, + BlockPublisher: c.health.BlockPublisher, + WalletAPIEnabled: walletAPIEnabled, + UserVerifyTxn: readable.NewVerifyTxn(params.UserVerifyTxn), + UnconfirmedVerifyTxn: readable.NewVerifyTxn(gateway.DaemonConfig().UnconfirmedVerifyTxn), + Uptime: wh.FromDuration(time.Since(gateway.StartedAt())), + StartedAt: gateway.StartedAt().Unix(), + }, nil +} + +// healthHandler returns node health data +// URI: /api/v1/health +// Method: GET +func healthHandler(c muxConfig, gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + health, err := getHealthData(c, gateway) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, health) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/health_test.go b/vendor/github.com/SkycoinProject/skycoin/src/api/health_test.go new file mode 100644 index 00000000..6065ea0e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/health_test.go @@ -0,0 +1,260 @@ +package api + +import ( + "errors" + "net/http" + "strings" + "testing" + "time" + + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + + "encoding/json" + "net/http/httptest" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/daemon" + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/readable" + "github.com/SkycoinProject/skycoin/src/util/useragent" + "github.com/SkycoinProject/skycoin/src/visor" +) + +func TestHealthHandler(t *testing.T) { + cases := []struct { + name string + method string + code int + err string + getBlockchainMetadataErr error + getConnectionsErr error + cfg muxConfig + walletAPIEnabled bool + }{ + { + name: "405 method not allowed", + method: http.MethodPost, + code: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + cfg: defaultMuxConfig(), + }, + + { + name: "gateway.GetBlockchainMetadata error", + method: http.MethodGet, + code: http.StatusInternalServerError, + err: "500 Internal Server Error - gateway.GetBlockchainMetadata failed: GetBlockchainMetadata failed", + getBlockchainMetadataErr: errors.New("GetBlockchainMetadata failed"), + cfg: defaultMuxConfig(), + }, + + { + name: "gateway.GetConnections error", + method: http.MethodGet, + code: http.StatusInternalServerError, + err: "500 Internal Server Error - gateway.GetConnections failed: GetConnections failed", + getConnectionsErr: errors.New("GetConnections failed"), + cfg: defaultMuxConfig(), + }, + + { + name: "valid response", + method: http.MethodGet, + code: http.StatusOK, + cfg: defaultMuxConfig(), + walletAPIEnabled: true, + }, + + { + name: "valid response, opposite config", + method: http.MethodGet, + code: http.StatusOK, + cfg: muxConfig{ + health: HealthConfig{ + BlockPublisher: true, + }, + host: configuredHost, + appLoc: ".", + disableCSRF: false, + disableCSP: false, + enableGUI: true, + enabledAPISets: map[string]struct{}{ + EndpointsStatus: struct{}{}, + EndpointsRead: struct{}{}, + }, + }, + walletAPIEnabled: false, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + unspents := uint64(10) + unconfirmed := uint64(20) + + uxHash, err := cipher.SHA256FromHex("8a3e0aac619551ae009cfb28c2b36bb1300925f74da770d1512072314f6a4c80") + require.NoError(t, err) + + prevHash, err := cipher.SHA256FromHex("001eb7911b6a6ab7c75feb88726dd2bc8b87133aebc82201c4404537eb74f7ac") + require.NoError(t, err) + + bodyHash, err := cipher.SHA256FromHex("36be8d70d1e9f70b340ea7ecf0b247c27086bad10568044c1196fe150f6cea1b") + require.NoError(t, err) + + metadata := visor.BlockchainMetadata{ + HeadBlock: coin.SignedBlock{ + Block: coin.Block{ + Head: coin.BlockHeader{ + BkSeq: 21175, + UxHash: uxHash, + PrevHash: prevHash, + Time: 1523168686, + Fee: 2, + Version: 0, + BodyHash: bodyHash, + }, + }, + }, + Unspents: unspents, + Unconfirmed: unconfirmed, + } + + buildInfo := readable.BuildInfo{ + Version: "1.0.0", + Commit: "abcdef", + Branch: "develop", + } + tc.cfg.health.BuildInfo = buildInfo + + tc.cfg.health.Fiber.Name = "skycoin" + tc.cfg.health.DaemonUserAgent = useragent.Data{ + Coin: "skycoin", + Version: "0.25.0", + Remark: "test", + } + + conns := []daemon.Connection{ + { + ConnectionDetails: daemon.ConnectionDetails{ + Outgoing: true, + State: daemon.ConnectionStateConnected, + }, + }, + { + ConnectionDetails: daemon.ConnectionDetails{ + Outgoing: false, + State: daemon.ConnectionStateIntroduced, + }, + }, + { + ConnectionDetails: daemon.ConnectionDetails{ + Outgoing: true, + State: daemon.ConnectionStateIntroduced, + }, + }, + { + ConnectionDetails: daemon.ConnectionDetails{ + Outgoing: false, + State: daemon.ConnectionStateConnected, + }, + }, + { + ConnectionDetails: daemon.ConnectionDetails{ + Outgoing: true, + State: daemon.ConnectionStateConnected, + }, + }, + } + + gateway := &MockGatewayer{} + + if tc.getBlockchainMetadataErr != nil { + gateway.On("GetBlockchainMetadata").Return(nil, tc.getBlockchainMetadataErr) + } else { + gateway.On("GetBlockchainMetadata").Return(&metadata, nil) + } + + if tc.getConnectionsErr != nil { + gateway.On("GetConnections", mock.Anything).Return(nil, tc.getConnectionsErr) + } else { + gateway.On("GetConnections", mock.Anything).Return(conns, nil) + } + + startedAt := time.Now().Add(time.Second * -4) + + gateway.On("StartedAt").Return(startedAt) + + dc := daemon.DaemonConfig{ + UnconfirmedVerifyTxn: params.VerifyTxn{ + BurnFactor: params.UserVerifyTxn.BurnFactor * 2, + MaxTransactionSize: params.UserVerifyTxn.MaxTransactionSize * 2, + MaxDropletPrecision: params.UserVerifyTxn.MaxDropletPrecision - 1, + }, + } + + gateway.On("DaemonConfig").Return(dc) + + endpoint := "/api/v1/health" + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + rr := httptest.NewRecorder() + handler := newServerMux(tc.cfg, gateway) + handler.ServeHTTP(rr, req) + if tc.code != http.StatusOK { + require.Equal(t, tc.code, rr.Code) + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String())) + return + } + + require.Equal(t, http.StatusOK, rr.Code) + + r := &HealthResponse{} + err = json.Unmarshal(rr.Body.Bytes(), r) + require.NoError(t, err) + + require.Equal(t, buildInfo.Version, r.Version.Version) + require.Equal(t, buildInfo.Commit, r.Version.Commit) + require.Equal(t, buildInfo.Branch, r.Version.Branch) + // Put uptime in a range in case the test scheduler is slow and there is a pause. + // Should be at least 4 seconds since startedAt was computed to be 4 seconds ago. + require.True(t, time.Second*4 <= r.Uptime.Duration && time.Second*8 >= r.Uptime.Duration, "uptime should be a little over 4 seconds") + + require.Equal(t, 3, r.OutgoingConnections) + require.Equal(t, 2, r.IncomingConnections) + require.Equal(t, len(conns), r.OpenConnections) + require.Equal(t, "skycoin", r.CoinName) + require.Equal(t, "skycoin:0.25.0(test)", r.DaemonUserAgent) + require.Equal(t, tc.cfg.health.BlockPublisher, r.BlockPublisher) + + require.Equal(t, unconfirmed, r.BlockchainMetadata.Unconfirmed) + require.Equal(t, unspents, r.BlockchainMetadata.Unspents) + require.True(t, r.BlockchainMetadata.TimeSinceLastBlock.Duration > time.Duration(0)) + + require.Equal(t, metadata.HeadBlock.Block.Head.BkSeq, r.BlockchainMetadata.Head.BkSeq) + require.Equal(t, metadata.HeadBlock.Block.Head.Time, r.BlockchainMetadata.Head.Time) + require.Equal(t, metadata.HeadBlock.Block.Head.Fee, r.BlockchainMetadata.Head.Fee) + require.Equal(t, metadata.HeadBlock.Block.Head.Version, r.BlockchainMetadata.Head.Version) + require.Equal(t, metadata.HeadBlock.Block.Head.PrevHash.Hex(), r.BlockchainMetadata.Head.PreviousHash) + require.Equal(t, metadata.HeadBlock.Block.Head.Hash().Hex(), r.BlockchainMetadata.Head.Hash) + require.Equal(t, metadata.HeadBlock.Block.Head.BodyHash.Hex(), r.BlockchainMetadata.Head.BodyHash) + + require.Equal(t, !tc.cfg.disableCSRF, r.CSRFEnabled) + require.Equal(t, !tc.cfg.disableCSP, r.CSPEnabled) + require.Equal(t, tc.cfg.enableGUI, r.GUIEnabled) + require.Equal(t, tc.walletAPIEnabled, r.WalletAPIEnabled) + + require.Equal(t, uint32(10), r.UserVerifyTxn.BurnFactor) + require.Equal(t, uint32(32*1024), r.UserVerifyTxn.MaxTransactionSize) + require.Equal(t, uint8(3), r.UserVerifyTxn.MaxDropletPrecision) + + require.Equal(t, dc.UnconfirmedVerifyTxn.BurnFactor, r.UnconfirmedVerifyTxn.BurnFactor) + require.Equal(t, dc.UnconfirmedVerifyTxn.MaxTransactionSize, r.UnconfirmedVerifyTxn.MaxTransactionSize) + require.Equal(t, dc.UnconfirmedVerifyTxn.MaxDropletPrecision, r.UnconfirmedVerifyTxn.MaxDropletPrecision) + require.True(t, time.Now().Unix() > r.StartedAt) + + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/http.go b/vendor/github.com/SkycoinProject/skycoin/src/api/http.go new file mode 100644 index 00000000..517b7ebe --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/http.go @@ -0,0 +1,703 @@ +/* +Package api implements the REST API interface +*/ +package api + +import ( + "crypto/tls" + "encoding/json" + "fmt" + "io/ioutil" + "net" + "net/http" + "path/filepath" + "strings" + "time" + "unicode" + + "github.com/NYTimes/gziphandler" + "github.com/rs/cors" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/readable" + "github.com/SkycoinProject/skycoin/src/util/file" + wh "github.com/SkycoinProject/skycoin/src/util/http" + "github.com/SkycoinProject/skycoin/src/util/logging" + "github.com/SkycoinProject/skycoin/src/util/useragent" +) + +var ( + logger = logging.MustGetLogger("api") +) + +const ( + resourceDir = "dist/" + devDir = "dev/" + indexPage = "index.html" + + apiVersion1 = "v1" + apiVersion2 = "v2" + + defaultReadTimeout = time.Second * 10 + defaultWriteTimeout = time.Second * 60 + defaultIdleTimeout = time.Second * 120 + + // EndpointsRead endpoints with no side-effects and no changes in node state + EndpointsRead = "READ" + // EndpointsStatus endpoints offer (meta,runtime)data to dashboard and monitoring clients + EndpointsStatus = "STATUS" + // EndpointsTransaction endpoints export operations on transactions that modify node state + EndpointsTransaction = "TXN" + // EndpointsWallet endpoints implement wallet interface + EndpointsWallet = "WALLET" + // EndpointsInsecureWalletSeed endpoints implement wallet interface + EndpointsInsecureWalletSeed = "INSECURE_WALLET_SEED" + // EndpointsPrometheus endpoints for Go application metrics + EndpointsPrometheus = "PROMETHEUS" + // EndpointsNetCtrl endpoints for managing network connections + EndpointsNetCtrl = "NET_CTRL" + // EndpointsStorage endpoints implement interface for key-value storage for arbitrary data + EndpointsStorage = "STORAGE" +) + +// Server exposes an HTTP API +type Server struct { + server *http.Server + listener net.Listener + done chan struct{} +} + +// Config configures Server +type Config struct { + StaticDir string + DisableCSRF bool + DisableHeaderCheck bool + DisableCSP bool + EnableGUI bool + ReadTimeout time.Duration + WriteTimeout time.Duration + IdleTimeout time.Duration + Health HealthConfig + HostWhitelist []string + EnabledAPISets map[string]struct{} + Username string + Password string +} + +// HealthConfig configuration data exposed in /health +type HealthConfig struct { + BuildInfo readable.BuildInfo + Fiber readable.FiberConfig + DaemonUserAgent useragent.Data + BlockPublisher bool +} + +type muxConfig struct { + host string + appLoc string + enableGUI bool + disableCSRF bool + disableHeaderCheck bool + disableCSP bool + enabledAPISets map[string]struct{} + hostWhitelist []string + username string + password string + health HealthConfig +} + +// HTTPResponse represents the http response struct +type HTTPResponse struct { + Error *HTTPError `json:"error,omitempty"` + Data interface{} `json:"data,omitempty"` +} + +// HTTPError is included in an HTTPResponse +type HTTPError struct { + Message string `json:"message"` + Code int `json:"code"` +} + +// NewHTTPErrorResponse returns an HTTPResponse with the Error field populated +func NewHTTPErrorResponse(code int, msg string) HTTPResponse { + if msg == "" { + msg = http.StatusText(code) + } + + return HTTPResponse{ + Error: &HTTPError{ + Code: code, + Message: msg, + }, + } +} + +func writeHTTPResponse(w http.ResponseWriter, resp HTTPResponse) { + out, err := json.MarshalIndent(resp, "", " ") + if err != nil { + wh.Error500(w, "json.MarshalIndent failed") + return + } + + w.Header().Add("Content-Type", ContentTypeJSON) + + if resp.Error == nil { + w.WriteHeader(http.StatusOK) + } else { + if resp.Error.Code < 400 || resp.Error.Code >= 600 { + logger.Critical().Errorf("writeHTTPResponse invalid error status code: %d", resp.Error.Code) + w.WriteHeader(http.StatusInternalServerError) + } else { + w.WriteHeader(resp.Error.Code) + } + } + + if _, err := w.Write(out); err != nil { + logger.WithError(err).Error("http Write failed") + } +} + +func create(host string, c Config, gateway Gatewayer) (*Server, error) { + var appLoc string + if c.EnableGUI { + var err error + appLoc, err = file.DetermineResourcePath(c.StaticDir, resourceDir, devDir) + if err != nil { + return nil, err + } + logger.Infof("Web resources directory: %s", appLoc) + } + + if c.DisableCSRF { + logger.Warning("CSRF check disabled") + } + + if c.DisableHeaderCheck { + logger.Warning("Header check disabled") + } + + if c.ReadTimeout == 0 { + c.ReadTimeout = defaultReadTimeout + } + if c.WriteTimeout == 0 { + c.WriteTimeout = defaultWriteTimeout + } + if c.IdleTimeout == 0 { + c.IdleTimeout = defaultIdleTimeout + } + + mc := muxConfig{ + host: host, + appLoc: appLoc, + enableGUI: c.EnableGUI, + disableCSRF: c.DisableCSRF, + disableHeaderCheck: c.DisableHeaderCheck, + disableCSP: c.DisableCSP, + health: c.Health, + enabledAPISets: c.EnabledAPISets, + hostWhitelist: c.HostWhitelist, + username: c.Username, + password: c.Password, + } + + srvMux := newServerMux(mc, gateway) + srv := &http.Server{ + Handler: srvMux, + ReadTimeout: c.ReadTimeout, + WriteTimeout: c.WriteTimeout, + IdleTimeout: c.IdleTimeout, + // MaxHeaderBytes: http.DefaultMaxHeaderBytes, // adjust this to allow longer GET queries + } + + return &Server{ + server: srv, + done: make(chan struct{}), + }, nil +} + +// Create creates a new Server instance that listens on HTTP +func Create(host string, c Config, gateway Gatewayer) (*Server, error) { + logger.Warning("HTTPS not in use!") + + listener, err := net.Listen("tcp", host) + if err != nil { + return nil, err + } + + // If the host did not specify a port, allowing the kernel to assign one, + // we need to get the assigned address to know the full hostname + host = listener.Addr().String() + + s, err := create(host, c, gateway) + if err != nil { + if closeErr := s.listener.Close(); closeErr != nil { + logger.WithError(err).Warning("s.listener.Close() error") + } + return nil, err + } + + s.listener = listener + + return s, nil +} + +// CreateHTTPS creates a new Server instance that listens on HTTPS +func CreateHTTPS(host string, c Config, gateway Gatewayer, certFile, keyFile string) (*Server, error) { + cert, err := tls.LoadX509KeyPair(certFile, keyFile) + if err != nil { + return nil, err + } + + logger.Infof("Using %s for the certificate", certFile) + logger.Infof("Using %s for the key", keyFile) + + listener, err := tls.Listen("tcp", host, &tls.Config{ + Certificates: []tls.Certificate{cert}, + }) + if err != nil { + return nil, err + } + + // If the host did not specify a port, allowing the kernel to assign one, + // we need to get the assigned address to know the full hostname + host = listener.Addr().String() + + s, err := create(host, c, gateway) + if err != nil { + if closeErr := s.listener.Close(); closeErr != nil { + logger.WithError(err).Warning("s.listener.Close() error") + } + return nil, err + } + + s.listener = listener + + return s, nil +} + +// Addr returns the listening address of the Server +func (s *Server) Addr() string { + if s == nil || s.listener == nil { + return "" + } + return s.listener.Addr().String() +} + +// Serve serves the web interface on the configured host +func (s *Server) Serve() error { + logger.Infof("Starting web interface on %s", s.listener.Addr()) + defer logger.Info("Web interface closed") + defer close(s.done) + + if err := s.server.Serve(s.listener); err != nil { + if err != http.ErrServerClosed { + return err + } + } + return nil +} + +// Shutdown closes the HTTP service. This can only be called after Serve or ServeHTTPS has been called. +func (s *Server) Shutdown() { + if s == nil { + return + } + + logger.Info("Shutting down web interface") + defer logger.Info("Web interface shut down") + if err := s.listener.Close(); err != nil { + logger.WithError(err).Warning("s.listener.Close() error") + } + <-s.done +} + +// newServerMux creates an http.ServeMux with handlers registered +func newServerMux(c muxConfig, gateway Gatewayer) *http.ServeMux { + mux := http.NewServeMux() + + allowedOrigins := []string{fmt.Sprintf("http://%s", c.host)} + for _, s := range c.hostWhitelist { + allowedOrigins = append(allowedOrigins, fmt.Sprintf("http://%s", s)) + } + + corsHandler := cors.New(cors.Options{ + AllowedOrigins: allowedOrigins, + Debug: false, + AllowedMethods: []string{http.MethodGet, http.MethodPost}, + AllowedHeaders: []string{"Origin", "Accept", "Content-Type", "X-Requested-With", CSRFHeaderName}, + AllowCredentials: false, // credentials are not used, but it would be safe to enable if necessary + OptionsPassthrough: false, + }) + + headerCheck := func(apiVersion, host string, hostWhitelist []string, handler http.Handler) http.Handler { + handler = originRefererCheck(apiVersion, host, hostWhitelist, handler) + handler = hostCheck(apiVersion, host, hostWhitelist, handler) + return handler + } + + forMethodAPISets := func(apiVersion string, f http.Handler, methodsAPISets map[string][]string) http.Handler { + if len(methodsAPISets) == 0 { + logger.Panic("methodsAPISets should not be empty") + } + + switch apiVersion { + case apiVersion1, apiVersion2: + default: + logger.Panicf("Invalid API version %q", apiVersion) + } + + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + apiSets := methodsAPISets[r.Method] + + // If no API sets are specified for a given method, return 405 Method Not Allowed + if len(apiSets) == 0 { + switch apiVersion { + case apiVersion1: + wh.Error405(w) + case apiVersion2: + resp := NewHTTPErrorResponse(http.StatusMethodNotAllowed, "") + writeHTTPResponse(w, resp) + } + return + } + + for _, k := range apiSets { + if _, ok := c.enabledAPISets[k]; ok { + f.ServeHTTP(w, r) + return + } + } + + switch apiVersion { + case apiVersion1: + wh.Error403(w, "Endpoint is disabled") + case apiVersion2: + resp := NewHTTPErrorResponse(http.StatusForbidden, "Endpoint is disabled") + writeHTTPResponse(w, resp) + } + }) + } + + webHandlerWithOptionals := func(apiVersion, endpoint string, handlerFunc http.Handler, checkCSRF, checkHeaders bool) { + handler := wh.ElapsedHandler(logger, handlerFunc) + + handler = corsHandler.Handler(handler) + + if checkCSRF { + handler = CSRFCheck(apiVersion, c.disableCSRF, handler) + } + + if checkHeaders { + handler = headerCheck(apiVersion, c.host, c.hostWhitelist, handler) + } + + if apiVersion == apiVersion2 { + handler = ContentTypeJSONRequired(handler) + } + + handler = basicAuth(apiVersion, c.username, c.password, "skycoin daemon", handler) + handler = gziphandler.GzipHandler(handler) + mux.Handle(endpoint, handler) + } + + webHandler := func(apiVersion, endpoint string, handler http.Handler, methodAPISets map[string][]string) { + // methodAPISets can be nil to ignore the concept of API sets for an endpoint. It will always be enabled. + // Explicitly check nil, caller should not pass empty initialized map + if methodAPISets != nil { + handler = forMethodAPISets(apiVersion, handler, methodAPISets) + } + + webHandlerWithOptionals(apiVersion, endpoint, handler, true, !c.disableHeaderCheck) + } + + webHandlerV1 := func(endpoint string, handler http.Handler, methodAPISets map[string][]string) { + webHandler(apiVersion1, "/api/v1"+endpoint, handler, methodAPISets) + } + + webHandlerV2 := func(endpoint string, handler http.Handler, methodAPISets map[string][]string) { + webHandler(apiVersion2, "/api/v2"+endpoint, handler, methodAPISets) + } + + indexHandler := newIndexHandler(c.appLoc, c.enableGUI) + if !c.disableCSP { + indexHandler = CSPHandler(indexHandler, ContentSecurityPolicy) + } + webHandler(apiVersion1, "/", indexHandler, nil) + + if c.enableGUI { + fileInfos, err := ioutil.ReadDir(c.appLoc) + if err != nil { + logger.WithError(err).Panicf("ioutil.ReadDir(%s) failed", c.appLoc) + } + + fs := http.FileServer(http.Dir(c.appLoc)) + if !c.disableCSP { + fs = CSPHandler(fs, ContentSecurityPolicy) + } + + for _, fileInfo := range fileInfos { + route := fmt.Sprintf("/%s", fileInfo.Name()) + if fileInfo.IsDir() { + route = route + "/" + } + + webHandler(apiVersion1, route, fs, nil) + } + } + + // get the current CSRF token + csrfHandlerV1 := func(endpoint string, handler http.Handler) { + webHandlerWithOptionals(apiVersion1, "/api/v1"+endpoint, handler, false, !c.disableHeaderCheck) + } + csrfHandlerV1("/csrf", getCSRFToken(c.disableCSRF)) // csrf is always available, regardless of the API set + + // Status endpoints + webHandlerV1("/version", versionHandler(c.health.BuildInfo), nil) // version is always available, regardless of the API set + webHandlerV1("/health", healthHandler(c, gateway), map[string][]string{ + http.MethodGet: []string{EndpointsRead, EndpointsStatus}, + }) + + // Wallet endpoints + webHandlerV1("/wallet", walletHandler(gateway), map[string][]string{ + http.MethodGet: []string{EndpointsWallet}, + }) + webHandlerV1("/wallet/create", walletCreateHandler(gateway), map[string][]string{ + http.MethodPost: []string{EndpointsWallet}, + }) + webHandlerV1("/wallet/newAddress", walletNewAddressesHandler(gateway), map[string][]string{ + http.MethodPost: []string{EndpointsWallet}, + }) + webHandlerV1("/wallet/balance", walletBalanceHandler(gateway), map[string][]string{ + http.MethodGet: []string{EndpointsWallet}, + }) + webHandlerV1("/wallet/transaction", walletCreateTransactionHandler(gateway), map[string][]string{ + http.MethodPost: []string{EndpointsWallet}, + }) + webHandlerV2("/wallet/transaction/sign", walletSignTransactionHandler(gateway), map[string][]string{ + http.MethodPost: []string{EndpointsWallet}, + }) + webHandlerV1("/wallet/transactions", walletTransactionsHandler(gateway), map[string][]string{ + http.MethodGet: []string{EndpointsWallet}, + }) + webHandlerV1("/wallet/update", walletUpdateHandler(gateway), map[string][]string{ + http.MethodPost: []string{EndpointsWallet}, + }) + webHandlerV1("/wallets", walletsHandler(gateway), map[string][]string{ + http.MethodGet: []string{EndpointsWallet}, + }) + webHandlerV1("/wallets/folderName", walletFolderHandler(gateway), map[string][]string{ + http.MethodGet: []string{EndpointsWallet}, + }) + webHandlerV1("/wallet/newSeed", newSeedHandler(), map[string][]string{ + http.MethodGet: []string{EndpointsWallet}, + }) + webHandlerV1("/wallet/seed", walletSeedHandler(gateway), map[string][]string{ + http.MethodPost: []string{EndpointsInsecureWalletSeed}, + }) + webHandlerV2("/wallet/seed/verify", http.HandlerFunc(walletVerifySeedHandler), map[string][]string{ + http.MethodPost: []string{EndpointsWallet}, + }) + + webHandlerV1("/wallet/unload", walletUnloadHandler(gateway), map[string][]string{ + http.MethodPost: []string{EndpointsWallet}, + }) + webHandlerV1("/wallet/encrypt", walletEncryptHandler(gateway), map[string][]string{ + http.MethodPost: []string{EndpointsWallet}, + }) + webHandlerV1("/wallet/decrypt", walletDecryptHandler(gateway), map[string][]string{ + http.MethodPost: []string{EndpointsWallet}, + }) + webHandlerV2("/wallet/recover", walletRecoverHandler(gateway), map[string][]string{ + http.MethodPost: []string{EndpointsWallet}, + }) + + // Blockchain interface + webHandlerV1("/blockchain/metadata", blockchainMetadataHandler(gateway), map[string][]string{ + http.MethodGet: []string{EndpointsRead, EndpointsStatus}, + }) + webHandlerV1("/blockchain/progress", blockchainProgressHandler(gateway), map[string][]string{ + http.MethodGet: []string{EndpointsRead, EndpointsStatus}, + }) + webHandlerV1("/block", blockHandler(gateway), map[string][]string{ + http.MethodGet: []string{EndpointsRead}, + }) + webHandlerV1("/blocks", blocksHandler(gateway), map[string][]string{ + http.MethodGet: []string{EndpointsRead}, + http.MethodPost: []string{EndpointsRead}, + }) + webHandlerV1("/last_blocks", lastBlocksHandler(gateway), map[string][]string{ + http.MethodGet: []string{EndpointsRead}, + }) + + // Network stats endpoints + webHandlerV1("/network/connection", connectionHandler(gateway), map[string][]string{ + http.MethodGet: []string{EndpointsRead, EndpointsStatus}, + }) + webHandlerV1("/network/connections", connectionsHandler(gateway), map[string][]string{ + http.MethodGet: []string{EndpointsRead, EndpointsStatus}, + }) + webHandlerV1("/network/defaultConnections", defaultConnectionsHandler(gateway), map[string][]string{ + http.MethodGet: []string{EndpointsRead, EndpointsStatus}, + }) + webHandlerV1("/network/connections/trust", trustConnectionsHandler(gateway), map[string][]string{ + http.MethodGet: []string{EndpointsRead, EndpointsStatus}, + }) + webHandlerV1("/network/connections/exchange", exchgConnectionsHandler(gateway), map[string][]string{ + http.MethodGet: []string{EndpointsRead, EndpointsStatus}, + }) + + // Network admin endpoints + webHandlerV1("/network/connection/disconnect", disconnectHandler(gateway), map[string][]string{ + http.MethodPost: []string{EndpointsNetCtrl}, + }) + + // Transaction related endpoints + webHandlerV1("/pendingTxs", pendingTxnsHandler(gateway), map[string][]string{ + http.MethodGet: []string{EndpointsRead}, + }) + webHandlerV1("/transaction", transactionHandler(gateway), map[string][]string{ + http.MethodGet: []string{EndpointsRead}, + }) + webHandlerV2("/transaction", transactionHandlerV2(gateway), map[string][]string{ + // http.MethodGet: []string{EndpointsRead}, + http.MethodPost: []string{EndpointsTransaction}, + }) + webHandlerV2("/transaction/verify", verifyTxnHandler(gateway), map[string][]string{ + http.MethodPost: []string{EndpointsRead}, + }) + webHandlerV1("/transactions", transactionsHandler(gateway), map[string][]string{ + http.MethodGet: []string{EndpointsRead}, + http.MethodPost: []string{EndpointsRead}, + }) + webHandlerV1("/injectTransaction", injectTransactionHandler(gateway), map[string][]string{ + http.MethodPost: []string{EndpointsTransaction, EndpointsWallet}, + }) + webHandlerV1("/resendUnconfirmedTxns", resendUnconfirmedTxnsHandler(gateway), map[string][]string{ + http.MethodPost: []string{EndpointsTransaction, EndpointsWallet}, + }) + webHandlerV1("/rawtx", rawTxnHandler(gateway), map[string][]string{ + http.MethodGet: []string{EndpointsRead}, + }) + + // Unspent output related endpoints + webHandlerV1("/outputs", outputsHandler(gateway), map[string][]string{ + http.MethodGet: []string{EndpointsRead}, + http.MethodPost: []string{EndpointsRead}, + }) + webHandlerV1("/balance", balanceHandler(gateway), map[string][]string{ + http.MethodGet: []string{EndpointsRead}, + http.MethodPost: []string{EndpointsRead}, + }) + webHandlerV1("/uxout", uxOutHandler(gateway), map[string][]string{ + http.MethodGet: []string{EndpointsRead}, + }) + webHandlerV1("/address_uxouts", addrUxOutsHandler(gateway), map[string][]string{ + http.MethodGet: []string{EndpointsRead}, + }) + + // golang process internal metrics for Prometheus + webHandlerV2("/metrics", metricsHandler(c, gateway), map[string][]string{ + http.MethodGet: []string{EndpointsPrometheus}, + }) + + // Address related endpoints + webHandlerV2("/address/verify", http.HandlerFunc(addressVerifyHandler), map[string][]string{ + http.MethodPost: []string{EndpointsRead}, + }) + + // Explorer endpoints + webHandlerV1("/coinSupply", coinSupplyHandler(gateway), map[string][]string{ + http.MethodGet: []string{EndpointsRead}, + }) + webHandlerV1("/richlist", richlistHandler(gateway), map[string][]string{ + http.MethodGet: []string{EndpointsRead}, + }) + webHandlerV1("/addresscount", addressCountHandler(gateway), map[string][]string{ + http.MethodGet: []string{EndpointsRead}, + }) + + // Storage endpoint + webHandlerV2("/data", storageHandler(gateway), map[string][]string{ + http.MethodGet: []string{EndpointsStorage}, + http.MethodPost: []string{EndpointsStorage}, + http.MethodDelete: []string{EndpointsStorage}, + }) + + return mux +} + +// newIndexHandler returns a http.Handler for index.html, where index.html is in appLoc +func newIndexHandler(appLoc string, enableGUI bool) http.Handler { + // Serves the main page + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if !enableGUI { + wh.Error404(w, "") + return + } + + if r.URL.Path != "/" { + wh.Error404(w, "") + return + } + + if r.URL.Path == "/" { + page := filepath.Join(appLoc, indexPage) + logger.Debugf("Serving index page: %s", page) + http.ServeFile(w, r, page) + } + }) +} + +// splitCommaString splits a string separated by commas or whitespace into tokens +// and returns an array of unique tokens split from that string +func splitCommaString(s string) []string { + words := strings.FieldsFunc(s, func(r rune) bool { + return r == ',' || unicode.IsSpace(r) + }) + + // Deduplicate + var dedupWords []string + wordsMap := make(map[string]struct{}) + for _, w := range words { + if _, ok := wordsMap[w]; !ok { + dedupWords = append(dedupWords, w) + } + wordsMap[w] = struct{}{} + } + + return dedupWords +} + +// parseAddressesFromStr parses comma-separated addresses string into []cipher.Address +func parseAddressesFromStr(s string) ([]cipher.Address, error) { + addrsStr := splitCommaString(s) + + addrs := make([]cipher.Address, len(addrsStr)) + for i, s := range addrsStr { + a, err := cipher.DecodeBase58Address(s) + if err != nil { + return nil, fmt.Errorf("address %q is invalid: %v", s, err) + } + + addrs[i] = a + } + + return addrs, nil +} + +// parseAddressesFromStr parses comma-separated hashes string into []cipher.SHA256 +func parseHashesFromStr(s string) ([]cipher.SHA256, error) { + hashesStr := splitCommaString(s) + + hashes := make([]cipher.SHA256, len(hashesStr)) + for i, s := range hashesStr { + h, err := cipher.SHA256FromHex(s) + if err != nil { + return nil, fmt.Errorf("SHA256 hash %q is invalid: %v", s, err) + } + + hashes[i] = h + } + + return hashes, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/http_test.go b/vendor/github.com/SkycoinProject/skycoin/src/api/http_test.go new file mode 100644 index 00000000..508420e1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/http_test.go @@ -0,0 +1,531 @@ +package api + +import ( + "fmt" + "io/ioutil" + "net/http" + "net/http/httptest" + "strings" + "sync" + "testing" + + "github.com/stretchr/testify/require" +) + +const configuredHost = "127.0.0.1:6420" + +var allAPISetsEnabled = map[string]struct{}{ + EndpointsRead: struct{}{}, + EndpointsTransaction: struct{}{}, + EndpointsStatus: struct{}{}, + EndpointsWallet: struct{}{}, + EndpointsInsecureWalletSeed: struct{}{}, + EndpointsPrometheus: struct{}{}, + EndpointsNetCtrl: struct{}{}, + EndpointsStorage: struct{}{}, +} + +func defaultMuxConfig() muxConfig { + return muxConfig{ + host: configuredHost, + appLoc: ".", + disableCSRF: true, + disableCSP: true, + enabledAPISets: allAPISetsEnabled, + } +} + +var endpointsMethods = map[string][]string{ + "/api/v1/address_uxouts": []string{ + http.MethodGet, + }, + "/api/v1/addresscount": []string{ + http.MethodGet, + }, + "/api/v1/balance": []string{ + http.MethodGet, + http.MethodPost, + }, + "/api/v1/block": []string{ + http.MethodGet, + }, + "/api/v1/blockchain/metadata": []string{ + http.MethodGet, + }, + "/api/v1/blockchain/progress": []string{ + http.MethodGet, + }, + "/api/v1/blocks": []string{ + http.MethodGet, + http.MethodPost, + }, + "/api/v1/coinSupply": []string{ + http.MethodGet, + }, + "/api/v1/health": []string{ + http.MethodGet, + }, + "/api/v1/injectTransaction": []string{ + http.MethodPost, + }, + "/api/v1/last_blocks": []string{ + http.MethodGet, + }, + "/api/v1/version": []string{ + http.MethodGet, + }, + "/api/v1/network/connection": []string{ + http.MethodGet, + }, + "/api/v1/network/connections": []string{ + http.MethodGet, + }, + "/api/v1/network/connections/exchange": []string{ + http.MethodGet, + }, + "/api/v1/network/connections/trust": []string{ + http.MethodGet, + }, + "/api/v1/network/defaultConnections": []string{ + http.MethodGet, + }, + "/api/v1/network/connection/disconnect": []string{ + http.MethodPost, + }, + "/api/v1/outputs": []string{ + http.MethodGet, + http.MethodPost, + }, + "/api/v1/pendingTxs": []string{ + http.MethodGet, + }, + "/api/v1/rawtx": []string{ + http.MethodGet, + }, + "/api/v1/richlist": []string{ + http.MethodGet, + }, + "/api/v1/resendUnconfirmedTxns": []string{ + http.MethodPost, + }, + "/api/v1/transaction": []string{ + http.MethodGet, + }, + "/api/v1/transactions": []string{ + http.MethodGet, + http.MethodPost, + }, + "/api/v1/uxout": []string{ + http.MethodGet, + }, + "/api/v1/wallet": []string{ + http.MethodGet, + }, + "/api/v1/wallet/balance": []string{ + http.MethodGet, + }, + "/api/v1/wallet/create": []string{ + http.MethodPost, + }, + "/api/v1/wallet/newAddress": []string{ + http.MethodPost, + }, + "/api/v1/wallet/newSeed": []string{ + http.MethodGet, + }, + "/api/v1/wallet/seed": []string{ + http.MethodPost, + }, + "/api/v1/wallet/transaction": []string{ + http.MethodPost, + }, + "/api/v1/wallet/transactions": []string{ + http.MethodGet, + }, + "/api/v1/wallet/unload": []string{ + http.MethodPost, + }, + "/api/v1/wallet/update": []string{ + http.MethodPost, + }, + "/api/v1/wallets": []string{ + http.MethodGet, + }, + "/api/v1/wallets/folderName": []string{ + http.MethodGet, + }, + + "/api/v2/transaction/verify": []string{ + http.MethodPost, + }, + "/api/v2/address/verify": []string{ + http.MethodPost, + }, + "/api/v2/wallet/recover": []string{ + http.MethodPost, + }, + "/api/v2/wallet/seed/verify": []string{ + http.MethodPost, + }, + "/api/v2/wallet/transaction/sign": []string{ + http.MethodPost, + }, + "/api/v2/transaction": []string{ + http.MethodPost, + }, + + "/api/v2/data": []string{ + http.MethodGet, + http.MethodPost, + http.MethodDelete, + }, +} + +func allEndpoints() []string { + endpoints := make([]string, len(endpointsMethods)) + i := 0 + for e := range endpointsMethods { + endpoints[i] = e + i++ + } + return endpoints +} + +// TestEnableGUI tests enable gui option, EnableGUI isn't part of Gateway API, +// we can't control the output by mocking the Gateway like other tests. Instead, +// we create a full webserver for each test case. +func TestEnableGUI(t *testing.T) { + tt := []struct { + name string + enableGUI bool + endpoint string + appLoc string + expectCode int + expectBody string + }{ + { + name: "disable gui GET /", + enableGUI: false, + endpoint: "/", + appLoc: "", + expectCode: http.StatusNotFound, + expectBody: "404 Not Found\n", + }, + { + name: "disable gui GET /invalid-path", + enableGUI: false, + endpoint: "/invalid-path", + appLoc: "", + expectCode: http.StatusNotFound, + expectBody: "404 Not Found\n", + }, + { + name: "enable gui GET /", + enableGUI: true, + endpoint: "/", + appLoc: "../gui/static", + expectCode: http.StatusOK, + expectBody: "", + }, + { + name: "enable gui GET /invalid-path", + enableGUI: true, + endpoint: "/invalid-path", + appLoc: "../gui/static", + expectCode: http.StatusNotFound, + expectBody: "404 Not Found\n", + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + req, err := http.NewRequest(http.MethodGet, tc.endpoint, nil) + require.NoError(t, err) + + gateway := &MockGatewayer{} + + rr := httptest.NewRecorder() + cfg := defaultMuxConfig() + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + c := Config{ + EnableGUI: tc.enableGUI, + DisableCSRF: true, + StaticDir: tc.appLoc, + } + + host := "127.0.0.1:6423" + s, err := Create(host, c, gateway) + require.NoError(t, err) + + wg := sync.WaitGroup{} + wg.Add(1) + go func() { + defer wg.Done() + err := s.Serve() + if err != nil && err.Error() != fmt.Sprintf("accept tcp %s: use of closed network connection", host) { + require.NoError(t, err) + } + }() + + defer func() { + s.listener.Close() + wg.Wait() + }() + + url := fmt.Sprintf("http://%s/%s", host, tc.endpoint) + rsp, err := http.Get(url) //nolint:gosec + require.NoError(t, err) + + defer rsp.Body.Close() + require.Equal(t, tc.expectCode, rsp.StatusCode) + + body, err := ioutil.ReadAll(rr.Body) + require.NoError(t, err) + + if rsp.StatusCode != http.StatusOK { + require.Equal(t, tc.expectBody, string(body)) + } + }) + } +} + +func TestAPISetDisabled(t *testing.T) { + tf := func(t *testing.T, endpoint, method string, disableCSRF bool) { + req, err := http.NewRequest(method, endpoint, nil) + require.NoError(t, err) + + isAPIV2 := strings.HasPrefix(endpoint, "/api/v2/") + if isAPIV2 { + req.Header.Set("Content-Type", ContentTypeJSON) + } + + cfg := defaultMuxConfig() + cfg.disableCSRF = disableCSRF + cfg.enabledAPISets = map[string]struct{}{} // disable all API sets + + handler := newServerMux(cfg, &MockGatewayer{}) + + rr := httptest.NewRecorder() + handler.ServeHTTP(rr, req) + + switch endpoint { + case "/api/v1/csrf", "/api/v1/version": // always enabled + require.Equal(t, http.StatusOK, rr.Code) + default: + require.Equal(t, http.StatusForbidden, rr.Code) + if isAPIV2 { + require.Equal(t, "{\n \"error\": {\n \"message\": \"Endpoint is disabled\",\n \"code\": 403\n }\n}", rr.Body.String()) + } else { + require.Equal(t, "403 Forbidden - Endpoint is disabled", strings.TrimSpace(rr.Body.String())) + } + } + } + + for e, methods := range endpointsMethods { + for _, m := range methods { + t.Run(fmt.Sprintf("%s %s", m, e), func(t *testing.T) { + tf(t, e, m, true) + }) + } + } + + t.Run("GET /api/v1/csrf", func(t *testing.T) { + tf(t, "/api/v1/csrf", http.MethodGet, false) + }) +} + +func TestCORS(t *testing.T) { + cases := []struct { + name string + origin string + hostWhitelist []string + valid bool + }{ + { + name: "options no whitelist", + origin: configuredHost, + valid: true, + }, + { + name: "options whitelist", + origin: "example.com", + hostWhitelist: []string{"example.com"}, + valid: true, + }, + { + name: "options no whitelist not whitelisted", + origin: "example.com", + valid: false, + }, + } + + for _, e := range append(allEndpoints(), "/api/v1/csrf") { + for _, tc := range cases { + for _, m := range []string{http.MethodPost, http.MethodGet} { + name := fmt.Sprintf("%s %s %s", tc.name, m, e) + t.Run(name, func(t *testing.T) { + cfg := defaultMuxConfig() + cfg.disableCSRF = false + cfg.hostWhitelist = tc.hostWhitelist + + req, err := http.NewRequest(http.MethodOptions, e, nil) + require.NoError(t, err) + + setCSRFParameters(t, tokenValid, req) + + isAPIV2 := strings.HasPrefix(e, "/api/v2/") + if isAPIV2 { + req.Header.Set("Content-Type", ContentTypeJSON) + } + + req.Header.Set("Origin", fmt.Sprintf("http://%s", tc.origin)) + req.Header.Set("Access-Control-Request-Method", m) + + requestHeaders := strings.ToLower(fmt.Sprintf("%s, Content-Type", CSRFHeaderName)) + req.Header.Set("Access-Control-Request-Headers", requestHeaders) + + handler := newServerMux(cfg, &MockGatewayer{}) + + rr := httptest.NewRecorder() + handler.ServeHTTP(rr, req) + + resp := rr.Result() + + allowOrigins := resp.Header.Get("Access-Control-Allow-Origin") + allowHeaders := resp.Header.Get("Access-Control-Allow-Headers") + allowMethods := resp.Header.Get("Access-Control-Allow-Methods") + + if tc.valid { + require.Equal(t, fmt.Sprintf("http://%s", tc.origin), allowOrigins) + require.Equal(t, requestHeaders, strings.ToLower(allowHeaders)) + require.Equal(t, m, allowMethods) + } else { + require.Empty(t, allowOrigins) + require.Empty(t, allowHeaders) + require.Empty(t, allowMethods) + } + + allowCreds := resp.Header.Get("Access-Control-Allow-Credentials") + require.Empty(t, allowCreds) + }) + } + } + } +} + +func TestHTTPBasicAuthInvalid(t *testing.T) { + username := "foo" + badUsername := "foof" + password := "bar" + badPassword := "barb" + + userPassCombos := []struct { + u, p string + }{ + {}, + { + u: username, + }, + { + p: password, + }, + { + u: username, + p: password, + }, + } + + reqUserPassCombos := []struct { + u, p string + }{ + {}, + { + u: username, + }, + { + u: badUsername, + }, + { + p: password, + }, + { + p: badPassword, + }, + { + u: username, + p: password, + }, + { + u: badUsername, + p: badPassword, + }, + { + u: username, + p: badPassword, + }, + { + u: badUsername, + p: password, + }, + } + + type testCase struct { + username string + password string + reqUsername string + reqPassword string + authorized bool + } + + cases := []testCase{} + + for _, a := range userPassCombos { + for _, b := range reqUserPassCombos { + cases = append(cases, testCase{ + username: a.u, + password: a.p, + reqUsername: b.u, + reqPassword: b.p, + authorized: a.u == b.u && a.p == b.p, + }) + } + } + + for _, e := range append(allEndpoints(), []string{"/api/v1/csrf"}...) { + for _, tc := range cases { + name := fmt.Sprintf("u=%s p=%s ru=%s rp=%s auth=%v e=%s", tc.username, tc.password, tc.reqUsername, tc.reqPassword, tc.authorized, e) + t.Run(name, func(t *testing.T) { + // Use a made-up request method so that any authorized request + // is guaranteed to fail before it reaches the mock gateway, + // which will panic without the mocks configured + req, err := http.NewRequest("FOOBAR", e, nil) + require.NoError(t, err) + + req.SetBasicAuth(tc.reqUsername, tc.reqPassword) + + cfg := defaultMuxConfig() + cfg.disableCSRF = false + cfg.username = tc.username + cfg.password = tc.password + + handler := newServerMux(cfg, &MockGatewayer{}) + + rr := httptest.NewRecorder() + handler.ServeHTTP(rr, req) + + if !tc.authorized { + require.Equal(t, http.StatusUnauthorized, rr.Code) + if strings.HasPrefix(e, "/api/v2") { + require.Equal(t, "{\n \"error\": {\n \"message\": \"Unauthorized\",\n \"code\": 401\n }\n}", rr.Body.String()) + } else { + require.Equal(t, "401 Unauthorized", strings.TrimSpace(rr.Body.String())) + } + } else { + require.NotEqual(t, http.StatusUnauthorized, rr.Code) + } + }) + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/empty.go b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/empty.go new file mode 100644 index 00000000..68976fb9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/empty.go @@ -0,0 +1,2 @@ +// Package integration implements API integration tests +package integration diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/integration_test.go b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/integration_test.go new file mode 100644 index 00000000..b91af085 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/integration_test.go @@ -0,0 +1,3848 @@ +// Package integration_test implements API integration tests +package integration_test + +import ( + "encoding/hex" + "encoding/json" + "flag" + "fmt" + "io" + "io/ioutil" + "net/http" + "net/url" + "os" + "path/filepath" + "reflect" + "sort" + "strconv" + "strings" + "testing" + "time" + + "github.com/andreyvit/diff" + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/api" + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/daemon" + "github.com/SkycoinProject/skycoin/src/readable" + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/transaction" + "github.com/SkycoinProject/skycoin/src/util/droplet" + "github.com/SkycoinProject/skycoin/src/util/mathutil" + "github.com/SkycoinProject/skycoin/src/util/useragent" + "github.com/SkycoinProject/skycoin/src/visor" +) + +/* Runs HTTP API tests against a running skycoin node + +Set envvar SKYCOIN_INTEGRATION_TESTS=1 to enable them +Set SKYCOIN_NODE_HOST to the node's address (defaults to http://127.0.0.1:6420) +Set SKYCOIN_INTEGRATION_TEST_MODE to either "stable" or "live" (defaults to "stable") + +Each test has two modes: + 1. against a stable, pinned blockchain + 2. against a live, active blockchain + +When running mode 1, API responses do not change. The exact responses are compared to saved responses on disk. +Make sure the skycoin node is running against the pinned blockchain data provided in this package's folder. + +When running mode 2, API responses may change (such as /coinSupply). The exact responses are not compared, +but the response is checked to be unmarshallable to a known JSON object. + +When update flag is set to true all tests pass +*/ + +const ( + testModeStable = "stable" + testModeLive = "live" + testModeDisableWalletAPI = "disable-wallet-api" + testModeEnableSeedAPI = "enable-seed-api" + testModeDisableGUI = "disable-gui" + + testFixturesDir = "testdata" +) + +type TestData struct { + actual interface{} + expected interface{} +} + +var update = flag.Bool("update", false, "update golden files") +var testLiveWallet = flag.Bool("test-live-wallet", false, "run live wallet tests, requires wallet envvars set") + +func nodeAddress() string { + addr := os.Getenv("SKYCOIN_NODE_HOST") + if addr == "" { + return "http://127.0.0.1:6420" + } + return addr +} + +func nodeUsername() string { + return os.Getenv("SKYCOIN_NODE_USERNAME") +} + +func nodePassword() string { + return os.Getenv("SKYCOIN_NODE_PASSWORD") +} + +func newClient() *api.Client { + c := api.NewClient(nodeAddress()) + c.SetAuth(nodeUsername(), nodePassword()) + return c +} + +func mode(t *testing.T) string { + mode := os.Getenv("SKYCOIN_INTEGRATION_TEST_MODE") + switch mode { + case "": + mode = testModeStable + case testModeLive, + testModeStable, + testModeDisableWalletAPI, + testModeEnableSeedAPI, + testModeDisableGUI: + default: + t.Fatal("Invalid test mode, must be stable, live or disable-wallet-api") + } + return mode +} + +func enabled() bool { + return os.Getenv("SKYCOIN_INTEGRATION_TESTS") == "1" +} + +func useCSRF(t *testing.T) bool { + x := os.Getenv("USE_CSRF") + if x == "" { + return false + } + + useCSRF, err := strconv.ParseBool(x) + require.NoError(t, err) + return useCSRF +} + +func doHeaderCheck(t *testing.T) bool { + x := os.Getenv("HEADER_CHECK") + if x == "" { + return false + } + + doHeaderCheck, err := strconv.ParseBool(x) + require.NoError(t, err) + return doHeaderCheck +} + +func doStable(t *testing.T) bool { + if enabled() && mode(t) == testModeStable { + return true + } + + t.Skip("Stable tests disabled") + return false +} + +func doLive(t *testing.T) bool { + if enabled() && mode(t) == testModeLive { + return true + } + + t.Skip("Live tests disabled") + return false +} + +func doDisableWalletAPI(t *testing.T) bool { + if enabled() && mode(t) == testModeDisableWalletAPI { + return true + } + + t.Skip("DisableWalletApi tests disabled") + return false +} + +func doEnableSeedAPI(t *testing.T) bool { + if enabled() && mode(t) == testModeEnableSeedAPI { + return true + } + + t.Skip("EnableSeedAPI tests disabled") + return false +} + +func doDisableGUI(t *testing.T) bool { + if enabled() && mode(t) == testModeDisableGUI { + return true + } + + t.Skip("DisableGUIAPI tests disabled") + return false +} + +func doLiveOrStable(t *testing.T) bool { + if enabled() { + switch mode(t) { + case testModeStable, testModeLive: + return true + } + } + + t.Skip("Live and stable tests disabled") + return false +} + +func doLiveWallet(t *testing.T) bool { + if *testLiveWallet { + return true + } + + t.Skip("Tests requiring wallet envvars are disabled") + return false +} + +func envParseBool(t *testing.T, key string) bool { + x := os.Getenv(key) + if x == "" { + return false + } + + v, err := strconv.ParseBool(x) + require.NoError(t, err) + return v +} + +func dbNoUnconfirmed(t *testing.T) bool { + return envParseBool(t, "DB_NO_UNCONFIRMED") +} + +func liveDisableNetworking(t *testing.T) bool { + return envParseBool(t, "LIVE_DISABLE_NETWORKING") +} + +func loadGoldenFile(t *testing.T, filename string, testData TestData) { + require.NotEmpty(t, filename, "loadGoldenFile golden filename missing") + + goldenFile := filepath.Join(testFixturesDir, filename) + + if *update { + updateGoldenFile(t, goldenFile, testData.actual) + } + + f, err := os.Open(goldenFile) + require.NoError(t, err) + defer f.Close() + + d := json.NewDecoder(f) + d.DisallowUnknownFields() + + err = d.Decode(testData.expected) + require.NoError(t, err, filename) +} + +func updateGoldenFile(t *testing.T, filename string, content interface{}) { + contentJSON, err := json.MarshalIndent(content, "", "\t") + require.NoError(t, err) + contentJSON = append(contentJSON, '\n') + err = ioutil.WriteFile(filename, contentJSON, 0644) + require.NoError(t, err) +} + +func checkGoldenFile(t *testing.T, goldenFile string, td TestData) { + loadGoldenFile(t, goldenFile, td) + require.Equal(t, reflect.Indirect(reflect.ValueOf(td.expected)).Interface(), td.actual) + + // Serialize expected to JSON and compare to the goldenFile's contents + // This will detect field changes that could be missed otherwise + b, err := json.MarshalIndent(td.expected, "", "\t") + require.NoError(t, err) + + goldenFile = filepath.Join(testFixturesDir, goldenFile) + + f, err := os.Open(goldenFile) + require.NoError(t, err) + defer f.Close() + + c, err := ioutil.ReadAll(f) + require.NoError(t, err) + + sc := string(c) + sb := string(b) + "\n" + + require.Equal(t, sc, sb, "JSON struct output differs from golden file, was a field added to the struct?\nDiff:\n"+diff.LineDiff(sc, sb)) +} + +func assertResponseError(t *testing.T, err error, errCode int, errMsg string) { + require.Error(t, err) + require.IsType(t, api.ClientError{}, err) + require.Equal(t, errCode, err.(api.ClientError).StatusCode, err.(api.ClientError).Message) + require.Equal(t, errMsg, err.(api.ClientError).Message) +} + +func TestStableCoinSupply(t *testing.T) { + if !doStable(t) { + return + } + + c := newClient() + + cs, err := c.CoinSupply() + require.NoError(t, err) + + var expected api.CoinSupply + checkGoldenFile(t, "coinsupply.golden", TestData{*cs, &expected}) +} + +func TestLiveCoinSupply(t *testing.T) { + if !doLive(t) { + return + } + + c := newClient() + + cs, err := c.CoinSupply() + require.NoError(t, err) + + require.NotEmpty(t, cs.CurrentSupply) + require.NotEmpty(t, cs.TotalSupply) + require.NotEmpty(t, cs.MaxSupply) + require.Equal(t, "100000000.000000", cs.MaxSupply) + require.NotEmpty(t, cs.CurrentCoinHourSupply) + require.NotEmpty(t, cs.TotalCoinHourSupply) + require.Equal(t, 100, len(cs.UnlockedAddresses)+len(cs.LockedAddresses)) +} + +func TestVersion(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + c := newClient() + + v, err := c.Version() + require.NoError(t, err) + + require.NotEmpty(t, v.Version) +} + +func TestVerifyAddress(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + c := newClient() + + cases := []struct { + name string + golden string + addr string + errCode int + errMsg string + }{ + { + name: "valid address", + golden: "verify-address.golden", + addr: "7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD", + }, + + { + name: "invalid address", + addr: "7apQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD", + errCode: http.StatusUnprocessableEntity, + errMsg: "Invalid checksum", + }, + + { + name: "missing address", + addr: "", + errCode: http.StatusBadRequest, + errMsg: "address is required", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + resp, err := c.VerifyAddress(tc.addr) + + if tc.errCode != 0 && tc.errCode != http.StatusOK { + assertResponseError(t, err, tc.errCode, tc.errMsg) + return + } + + require.NoError(t, err) + + var expected api.VerifyAddressResponse + checkGoldenFile(t, tc.golden, TestData{*resp, &expected}) + }) + } +} + +func TestStableVerifyTransaction(t *testing.T) { + if !doStable(t) { + return + } + + c := newClient() + + badSigStr := "71f2c01516fe696328e79bcf464eb0db374b63d494f7a307d1e77114f18581d7a81eed5275a9e04a336292dd2fd16977d9bef2a54ea3161d0876603d00c53bc9dd" + badSigBytes, err := hex.DecodeString(badSigStr) + require.NoError(t, err) + badSig := cipher.MustNewSig(badSigBytes) + + inputHash := "75692aeff988ce0da734c474dbef3a1ce19a5a6823bbcd36acb856c83262261e" + input := testutil.SHA256FromHex(t, inputHash) + + destAddrStr := "7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD" + destAddr, err := cipher.DecodeBase58Address(destAddrStr) + require.NoError(t, err) + + inputAddrStr := "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5" + inputAddr, err := cipher.DecodeBase58Address(inputAddrStr) + require.NoError(t, err) + + badSignatureTxn := coin.Transaction{ + Sigs: []cipher.Sig{badSig}, + In: []cipher.SHA256{input}, + Out: []coin.TransactionOutput{ + { + Address: destAddr, + Coins: 1e3, + Hours: 10, + }, + { + Address: inputAddr, + Coins: 22100e6 - 1e3, + Hours: 188761, + }, + }, + } + err = badSignatureTxn.UpdateHeader() + require.NoError(t, err) + + cases := []struct { + name string + golden string + txn coin.Transaction + unsigned bool + errCode int + errMsg string + }{ + { + name: "unsigned=false invalid transaction empty", + txn: coin.Transaction{}, + golden: "verify-transaction-invalid-empty.golden", + errCode: http.StatusUnprocessableEntity, + errMsg: "Transaction violates soft constraint: Transaction has zero coinhour fee", + }, + + { + name: "unsigned=false invalid transaction bad signature", + txn: badSignatureTxn, + golden: "verify-transaction-invalid-bad-sig.golden", + errCode: http.StatusUnprocessableEntity, + errMsg: "Transaction violates hard constraint: Signature not valid for hash", + }, + + { + name: "unsigned=true invalid transaction empty", + txn: coin.Transaction{}, + unsigned: true, + golden: "verify-transaction-invalid-empty.golden", + errCode: http.StatusUnprocessableEntity, + errMsg: "Transaction violates soft constraint: Transaction has zero coinhour fee", + }, + + { + name: "unsigned=true invalid transaction bad signature", + txn: badSignatureTxn, + unsigned: true, + golden: "verify-transaction-invalid-bad-sig.golden", + errCode: http.StatusUnprocessableEntity, + errMsg: "Transaction violates hard constraint: Signature not valid for hash", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + resp, err := c.VerifyTransaction(api.VerifyTransactionRequest{ + EncodedTransaction: tc.txn.MustSerializeHex(), + Unsigned: tc.unsigned, + }) + + if tc.errCode != 0 && tc.errCode != http.StatusOK { + assertResponseError(t, err, tc.errCode, tc.errMsg) + if tc.errCode != http.StatusUnprocessableEntity { + return + } + } + + if tc.errCode != http.StatusUnprocessableEntity { + require.NoError(t, err) + } + + var expected api.VerifyTransactionResponse + checkGoldenFile(t, tc.golden, TestData{*resp, &expected}) + }) + } + +} + +func TestStableNoUnconfirmedOutputs(t *testing.T) { + if !doStable(t) || !dbNoUnconfirmed(t) { + return + } + + c := newClient() + + cases := []struct { + name string + golden string + addrs []string + hashes []string + errCode int + errMsg string + }{ + { + name: "no addrs or hashes", + golden: "no-unconfirmed-outputs-noargs.golden", + }, + { + name: "only addrs", + addrs: []string{ + "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + }, + golden: "no-unconfirmed-outputs-addrs.golden", + }, + { + name: "only hashes", + hashes: []string{ + "9e53268a18f8d32a44b4fb183033b49bebfe9d0da3bf3ef2ad1d560500aa54c6", + "d91e07318227651129b715d2db448ae245b442acd08c8b4525a934f0e87efce9", + "01f9c1d6c83dbc1c993357436cdf7f214acd0bfa107ff7f1466d1b18ec03563e", + "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + }, + golden: "no-unconfirmed-outputs-hashes.golden", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + require.False(t, tc.addrs != nil && tc.hashes != nil) + + var outputs *readable.UnspentOutputsSummary + var err error + switch { + case tc.addrs == nil && tc.hashes == nil: + outputs, err = c.Outputs() + case tc.addrs != nil: + outputs, err = c.OutputsForAddresses(tc.addrs) + case tc.hashes != nil: + outputs, err = c.OutputsForHashes(tc.hashes) + } + + if tc.errCode != 0 && tc.errCode != http.StatusOK { + assertResponseError(t, err, tc.errCode, tc.errMsg) + return + } + + require.NoError(t, err) + + var expected readable.UnspentOutputsSummary + checkGoldenFile(t, tc.golden, TestData{*outputs, &expected}) + + require.Equal(t, len(expected.HeadOutputs), len(outputs.HeadOutputs)) + require.Equal(t, len(expected.OutgoingOutputs), len(outputs.OutgoingOutputs)) + require.Equal(t, len(expected.IncomingOutputs), len(outputs.IncomingOutputs)) + + for i, o := range expected.HeadOutputs { + require.Equal(t, o, outputs.HeadOutputs[i], "mismatch at index %d", i) + } + }) + } +} + +func TestStableOutputs(t *testing.T) { + if !doStable(t) || dbNoUnconfirmed(t) { + return + } + + c := newClient() + + cases := []struct { + name string + golden string + addrs []string + hashes []string + errCode int + errMsg string + }{ + { + name: "no addrs or hashes", + golden: "outputs-noargs.golden", + }, + { + name: "only addrs", + addrs: []string{ + "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + }, + golden: "outputs-addrs.golden", + }, + { + name: "only hashes", + hashes: []string{ + "9e53268a18f8d32a44b4fb183033b49bebfe9d0da3bf3ef2ad1d560500aa54c6", + "d91e07318227651129b715d2db448ae245b442acd08c8b4525a934f0e87efce9", + "01f9c1d6c83dbc1c993357436cdf7f214acd0bfa107ff7f1466d1b18ec03563e", + "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947", + "540582ee4128b733f810f149e908d984a5f403ad2865108e6c1c5423aeefc759", + }, + golden: "outputs-hashes.golden", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + require.False(t, tc.addrs != nil && tc.hashes != nil) + + var outputs *readable.UnspentOutputsSummary + var err error + switch { + case tc.addrs == nil && tc.hashes == nil: + outputs, err = c.Outputs() + case tc.addrs != nil: + outputs, err = c.OutputsForAddresses(tc.addrs) + case tc.hashes != nil: + outputs, err = c.OutputsForHashes(tc.hashes) + } + + if tc.errCode != 0 && tc.errCode != http.StatusOK { + assertResponseError(t, err, tc.errCode, tc.errMsg) + return + } + + require.NoError(t, err) + + var expected readable.UnspentOutputsSummary + checkGoldenFile(t, tc.golden, TestData{*outputs, &expected}) + + require.Equal(t, len(expected.HeadOutputs), len(outputs.HeadOutputs)) + require.Equal(t, len(expected.OutgoingOutputs), len(outputs.OutgoingOutputs)) + require.Equal(t, len(expected.IncomingOutputs), len(outputs.IncomingOutputs)) + + for i, o := range expected.HeadOutputs { + require.Equal(t, o, outputs.HeadOutputs[i], "mismatch at index %d", i) + } + }) + } +} + +func TestLiveOutputs(t *testing.T) { + if !doLive(t) { + return + } + + c := newClient() + + // Request all outputs and check that HeadOutputs is not empty + // OutgoingOutputs and IncomingOutputs are variable and could be empty + outputs, err := c.Outputs() + require.NoError(t, err) + require.NotEmpty(t, outputs.HeadOutputs) + + outputs, err = c.OutputsForAddresses(nil) + require.NoError(t, err) + require.NotEmpty(t, outputs.HeadOutputs) + + outputs, err = c.OutputsForHashes(nil) + require.NoError(t, err) + require.NotEmpty(t, outputs.HeadOutputs) +} + +func TestStableBlock(t *testing.T) { + if !doStable(t) { + return + } + + testKnownBlocks(t) +} + +// These blocks were affected by the coinhour overflow issue or by coinhour fee calculation bugs, +// make sure that they can be queried +var knownBadBlockSeqs = []uint64{ + // coinhour fee calculation mistake, related to distribution addresses: + 297, + 741, + 743, + 749, + 796, + 4956, + 10125, + // coinhour overflow related: + 11685, + 11707, + 11710, + 11709, + 11705, + 11708, + 11711, + 11706, + 11699, + 13277, +} + +func TestLiveBlock(t *testing.T) { + if !doLive(t) { + return + } + + if liveDisableNetworking(t) { + t.Skip("Skipping slow block tests when networking disabled") + return + } + + testKnownBlocks(t) + + // Check the knownBadBlockSeqs + c := newClient() + for _, seq := range knownBadBlockSeqs { + b, err := c.BlockBySeq(seq) + require.NoError(t, err) + require.Equal(t, seq, b.Head.BkSeq) + } +} + +func testKnownBlocks(t *testing.T) { + c := newClient() + + cases := []struct { + name string + golden string + hash string + seq uint64 + errCode int + errMsg string + }{ + { + name: "unknown hash", + hash: "80744ec25e6233f40074d35bf0bfdbddfac777869b954a96833cb89f44204444", + errCode: http.StatusNotFound, + errMsg: "404 Not Found", + }, + { + name: "valid hash", + golden: "block-hash.golden", + hash: "70584db7fb8ab88b8dbcfed72ddc42a1aeb8c4882266dbb78439ba3efcd0458d", + }, + { + name: "genesis hash", + golden: "block-hash-genesis.golden", + hash: "0551a1e5af999fe8fff529f6f2ab341e1e33db95135eef1b2be44fe6981349f3", + }, + { + name: "genesis seq", + golden: "block-seq-0.golden", + seq: 0, + }, + { + name: "seq 1", + golden: "block-seq-1.golden", + seq: 1, + }, + { + name: "seq 100", + golden: "block-seq-100.golden", + seq: 100, + }, + { + name: "unknown seq", + seq: 99999999999999, + errCode: http.StatusNotFound, + errMsg: "404 Not Found", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + var b *readable.Block + var err error + + if tc.hash != "" { + b, err = c.BlockByHash(tc.hash) + } else { + b, err = c.BlockBySeq(tc.seq) + } + + if tc.errCode != 0 && tc.errCode != http.StatusOK { + assertResponseError(t, err, tc.errCode, tc.errMsg) + return + } + + require.NotNil(t, b) + + var expected readable.Block + checkGoldenFile(t, tc.golden, TestData{*b, &expected}) + }) + } + + t.Logf("Querying every block in the blockchain") + + // Scan every block by seq + progress, err := c.BlockchainProgress() + require.NoError(t, err) + + var prevBlock *readable.Block + for i := uint64(0); i < progress.Current; i++ { + t.Run(fmt.Sprintf("block-seq-%d", i), func(t *testing.T) { + b, err := c.BlockBySeq(i) + require.NoError(t, err) + require.NotNil(t, b) + require.Equal(t, i, b.Head.BkSeq) + + if prevBlock != nil { + require.Equal(t, prevBlock.Head.Hash, b.Head.PreviousHash, "%s != %s", prevBlock.Head.Hash, b.Head.PreviousHash) + } + + bHash, err := c.BlockByHash(b.Head.Hash) + require.NoError(t, err) + require.NotNil(t, bHash) + require.Equal(t, b, bHash) + + prevBlock = b + }) + } +} + +func TestStableBlockVerbose(t *testing.T) { + if !doStable(t) { + return + } + + testKnownBlocksVerbose(t) +} + +func TestLiveBlockVerbose(t *testing.T) { + if !doLive(t) { + return + } + + if liveDisableNetworking(t) { + t.Skip("Skipping slow block tests when networking disabled") + return + } + + testKnownBlocksVerbose(t) + + // Check the knownBadBlockSeqs + c := newClient() + for _, seq := range knownBadBlockSeqs { + b, err := c.BlockBySeqVerbose(seq) + require.NoError(t, err) + require.Equal(t, seq, b.Head.BkSeq) + assertVerboseBlockFee(t, b) + } +} + +func testKnownBlocksVerbose(t *testing.T) { + c := newClient() + + cases := []struct { + name string + golden string + hash string + seq uint64 + errCode int + errMsg string + }{ + { + name: "unknown hash", + hash: "80744ec25e6233f40074d35bf0bfdbddfac777869b954a96833cb89f44204444", + errCode: http.StatusNotFound, + errMsg: "404 Not Found", + }, + { + name: "valid hash", + golden: "block-hash-verbose.golden", + hash: "70584db7fb8ab88b8dbcfed72ddc42a1aeb8c4882266dbb78439ba3efcd0458d", + }, + { + name: "genesis hash", + golden: "block-hash-verbose-genesis.golden", + hash: "0551a1e5af999fe8fff529f6f2ab341e1e33db95135eef1b2be44fe6981349f3", + }, + { + name: "genesis seq", + golden: "block-seq-verbose-0.golden", + seq: 0, + }, + { + name: "seq 1", + golden: "block-seq-verbose-1.golden", + seq: 1, + }, + { + name: "seq 100", + golden: "block-seq-verbose-100.golden", + seq: 100, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + var b *readable.BlockVerbose + var err error + + if tc.hash != "" { + b, err = c.BlockByHashVerbose(tc.hash) + } else { + b, err = c.BlockBySeqVerbose(tc.seq) + } + + if tc.errCode != 0 && tc.errCode != http.StatusOK { + assertResponseError(t, err, tc.errCode, tc.errMsg) + return + } + + require.NotNil(t, b) + assertVerboseBlockFee(t, b) + + var expected readable.BlockVerbose + checkGoldenFile(t, tc.golden, TestData{*b, &expected}) + }) + } + + t.Logf("Querying every block in the blockchain") + + // Scan every block by seq + progress, err := c.BlockchainProgress() + require.NoError(t, err) + + var prevBlock *readable.BlockVerbose + for i := uint64(0); i < progress.Current; i++ { + t.Run(fmt.Sprintf("block-seq-verbose-%d", i), func(t *testing.T) { + b, err := c.BlockBySeqVerbose(i) + require.NoError(t, err) + require.NotNil(t, b) + require.Equal(t, i, b.Head.BkSeq) + assertVerboseBlockFee(t, b) + + if prevBlock != nil { + require.Equal(t, prevBlock.Head.Hash, b.Head.PreviousHash) + } + + bHash, err := c.BlockByHashVerbose(b.Head.Hash) + require.NoError(t, err) + require.NotNil(t, bHash) + require.Equal(t, b, bHash) + + prevBlock = b + }) + } +} + +// assertVerboseBlockFee checks that the block's fee matches the calculated fee of the block's transactions +func assertVerboseBlockFee(t *testing.T, b *readable.BlockVerbose) { + fee := uint64(0) + for _, txn := range b.Body.Transactions { + var err error + fee, err = mathutil.AddUint64(fee, txn.Fee) + require.NoError(t, err) + } + + // The estimated transaction fees should equal the block fee, but in a few cases + // it doesn't due to older bugs in fee calculation + if b.Head.Fee != fee { + switch b.Head.BkSeq { + case 297: + require.Equal(t, b.Head.Fee, uint64(3477395194)) + require.Equal(t, fee, uint64(8601490771)) + case 741: + require.Equal(t, b.Head.Fee, uint64(2093567995)) + require.Equal(t, fee, uint64(17465854723)) + case 743: + require.Equal(t, b.Head.Fee, uint64(2093809661)) + require.Equal(t, fee, uint64(17466096389)) + case 749: + require.Equal(t, b.Head.Fee, uint64(1572050737)) + require.Equal(t, fee, uint64(16944337465)) + case 796: + require.Equal(t, b.Head.Fee, uint64(3197771253)) + require.Equal(t, fee, uint64(13445962405)) + case 4956: + require.Equal(t, b.Head.Fee, uint64(2309386399)) + require.Equal(t, fee, uint64(22805768703)) + case 10125: + require.Equal(t, b.Head.Fee, uint64(1938082460)) + require.Equal(t, fee, uint64(22434464764)) + case 13277: + // In this case, the hours overflow, so the API reports calculated_hours and fee as 0 + require.Equal(t, b.Head.Fee, uint64(3)) + require.Equal(t, fee, uint64(0)) + default: + require.Equal(t, b.Head.Fee, fee, "Block seq=%d fee does not match sum of transaction fees %d != %d", b.Head.BkSeq, b.Head.Fee, fee) + } + } +} + +func TestStableBlockchainMetadata(t *testing.T) { + if !doStable(t) { + return + } + + c := newClient() + + metadata, err := c.BlockchainMetadata() + require.NoError(t, err) + + var expected readable.BlockchainMetadata + + goldenFile := "blockchain-metadata.golden" + if dbNoUnconfirmed(t) { + goldenFile = "blockchain-metadata-no-unconfirmed.golden" + } + + checkGoldenFile(t, goldenFile, TestData{*metadata, &expected}) +} + +func TestLiveBlockchainMetadata(t *testing.T) { + if !doLive(t) { + return + } + + c := newClient() + + metadata, err := c.BlockchainMetadata() + require.NoError(t, err) + + require.NotEqual(t, uint64(0), metadata.Head.BkSeq) +} + +func TestStableBlockchainProgress(t *testing.T) { + if !doStable(t) { + return + } + + c := newClient() + + progress, err := c.BlockchainProgress() + require.NoError(t, err) + + var expected readable.BlockchainProgress + checkGoldenFile(t, "blockchain-progress.golden", TestData{*progress, &expected}) +} + +func TestLiveBlockchainProgress(t *testing.T) { + if !doLive(t) { + return + } + + c := newClient() + + progress, err := c.BlockchainProgress() + require.NoError(t, err) + + require.NotEqual(t, uint64(0), progress.Current) + + if liveDisableNetworking(t) { + require.Empty(t, progress.Peers) + require.Equal(t, progress.Current, progress.Highest) + } else { + require.NotEmpty(t, progress.Peers) + require.True(t, progress.Current <= progress.Highest) + } +} + +func TestStableBalance(t *testing.T) { + if !doStable(t) { + return + } + + type balanceTestCase struct { + name string + golden string + addrs []string + } + + c := newClient() + + cases := []balanceTestCase{ + { + name: "unknown address", + addrs: []string{"prRXwTcDK24hs6AFxj69UuWae3LzhrsPW9"}, + golden: "balance-noaddrs.golden", + }, + { + name: "one address", + addrs: []string{"2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf"}, + golden: "balance-2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf.golden", + }, + { + name: "duplicate addresses", + addrs: []string{"2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf"}, + golden: "balance-2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf.golden", + }, + { + name: "two addresses", + addrs: []string{"2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5"}, + golden: "balance-two-addrs.golden", + }, + } + + if !dbNoUnconfirmed(t) { + cases = append(cases, balanceTestCase{ + name: "balance affected by unconfirmed transaction", + addrs: []string{"R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN"}, + golden: "balance-affected-by-unconfirmed-txns.golden", + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + balance, err := c.Balance(tc.addrs) + require.NoError(t, err) + + var expected api.BalanceResponse + checkGoldenFile(t, tc.golden, TestData{*balance, &expected}) + }) + } +} + +func TestLiveBalance(t *testing.T) { + if !doLive(t) { + return + } + + c := newClient() + + // Genesis address check, should not have a balance + b, err := c.Balance([]string{"2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6"}) + require.NoError(t, err) + require.Equal(t, api.BalanceResponse{ + Addresses: readable.AddressBalances{ + "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6": readable.BalancePair{}, + }, + }, *b) + + // Balance of final distribution address. Should have the same coins balance + // for the next 15-20 years. + b, err = c.Balance([]string{"ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm"}) + require.NoError(t, err) + require.Equal(t, b.Confirmed, b.Predicted) + require.NotEmpty(t, b.Confirmed.Hours) + // Add 1e4 because someone sent 0.01 coins to it + expectedBalance := uint64(1e6*1e6 + 1e4) + require.Equal(t, expectedBalance, b.Confirmed.Coins) + + // Check that the balance is queryable for addresses known to be affected + // by the coinhour overflow problem + addrs := []string{ + "n7AR1VMW1pK7F9TxhYdnr3HoXEQ3g9iTNP", + "2aTzmXi9jyiq45oTRFCP9Y7dcvnT6Rsp7u", + "FjFLnus2ePxuaPTXFXfpw6cVAE5owT1t3P", + "KT9vosieyWhn9yWdY8w7UZ6tk31KH4NAQK", + } + for _, a := range addrs { + _, err := c.Balance([]string{a}) + require.NoError(t, err, "Failed to get balance of address %s", a) + } + _, err = c.Balance(addrs) + require.NoError(t, err) +} + +func TestStableUxOut(t *testing.T) { + if !doStable(t) { + return + } + + c := newClient() + + cases := []struct { + name string + golden string + uxID string + }{ + { + name: "valid uxID", + golden: "uxout.golden", + uxID: "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + ux, err := c.UxOut(tc.uxID) + require.NoError(t, err) + + var expected readable.SpentOutput + checkGoldenFile(t, tc.golden, TestData{*ux, &expected}) + }) + } + + // Scan all uxouts from the result of /outputs + scanUxOuts(t) +} + +func TestLiveUxOut(t *testing.T) { + if !doLive(t) { + return + } + + if liveDisableNetworking(t) { + t.Skip("Skipping slow ux out tests when networking disabled") + return + } + + c := newClient() + + // A spent uxout should never change + ux, err := c.UxOut("fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20") + require.NoError(t, err) + + var expected readable.SpentOutput + checkGoldenFile(t, "uxout-spent.golden", TestData{*ux, &expected}) + require.NotEqual(t, uint64(0), ux.SpentBlockSeq) + + // Scan all uxouts from the result of /outputs + scanUxOuts(t) +} + +func scanUxOuts(t *testing.T) { + c := newClient() + + outputs, err := c.Outputs() + require.NoError(t, err) + + for _, ux := range outputs.HeadOutputs { + t.Run(ux.Hash, func(t *testing.T) { + foundUx, err := c.UxOut(ux.Hash) + require.NoError(t, err) + + require.Equal(t, ux.Hash, foundUx.Uxid) + require.Equal(t, ux.Time, foundUx.Time) + require.Equal(t, ux.BkSeq, foundUx.SrcBkSeq) + require.Equal(t, ux.SourceTransaction, foundUx.SrcTx) + require.Equal(t, ux.Address, foundUx.OwnerAddress) + require.Equal(t, ux.Hours, foundUx.Hours) + coinsStr, err := droplet.ToString(foundUx.Coins) + require.NoError(t, err) + require.Equal(t, ux.Coins, coinsStr) + + if foundUx.SpentBlockSeq == 0 { + require.Equal(t, "0000000000000000000000000000000000000000000000000000000000000000", foundUx.SpentTxnID) + } else { + require.NotEqual(t, "0000000000000000000000000000000000000000000000000000000000000000", foundUx.SpentTxnID) + } + }) + } +} + +func TestStableAddressUxOuts(t *testing.T) { + if !doStable(t) { + return + } + + c := newClient() + + cases := []struct { + name string + errCode int + errMsg string + golden string + addr string + }{ + { + name: "no addresses", + errCode: http.StatusBadRequest, + errMsg: "400 Bad Request - address is empty", + }, + { + name: "unknown address", + addr: "prRXwTcDK24hs6AFxj69UuWae3LzhrsPW9", + golden: "uxout-noaddr.golden", + }, + { + name: "one address", + addr: "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + golden: "uxout-addr.golden", + }, + } + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + ux, err := c.AddressUxOuts(tc.addr) + if tc.errCode != 0 && tc.errCode != http.StatusOK { + assertResponseError(t, err, tc.errCode, tc.errMsg) + return + } + require.NoError(t, err) + var expected []readable.SpentOutput + checkGoldenFile(t, tc.golden, TestData{ux, &expected}) + }) + } +} + +func TestLiveAddressUxOuts(t *testing.T) { + if !doLive(t) { + return + } + + c := newClient() + + cases := []struct { + name string + errCode int + errMsg string + addr string + moreThanZero bool + }{ + { + name: "no addresses", + errCode: http.StatusBadRequest, + errMsg: "400 Bad Request - address is empty", + }, + { + name: "invalid address length", + errCode: http.StatusBadRequest, + errMsg: "400 Bad Request - Invalid address length", + addr: "prRXwTcDK24hs6AFxj", + }, + { + name: "unknown address", + addr: "prRXwTcDK24hs6AFxj69UuWae3LzhrsPW9", + }, + { + name: "one address", + addr: "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + }, + } + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + ux, err := c.AddressUxOuts(tc.addr) + if tc.errCode != 0 && tc.errCode != http.StatusOK { + assertResponseError(t, err, tc.errCode, tc.errMsg) + return + } + require.NoError(t, err) + if tc.moreThanZero { + require.NotEqual(t, 0, len(ux)) + } + }) + } +} + +func TestStableBlocksInRange(t *testing.T) { + if !doStable(t) { + return + } + + c := newClient() + + progress, err := c.BlockchainProgress() + require.NoError(t, err) + + var lastNBlocks uint64 = 10 + require.True(t, progress.Current > lastNBlocks+1) + + cases := []struct { + name string + golden string + start uint64 + end uint64 + errCode int + errMsg string + }{ + { + name: "first 10", + golden: "blocks-first-10.golden", + start: 1, + end: 10, + }, + { + name: "last 10", + golden: "blocks-last-10.golden", + start: progress.Current - lastNBlocks, + end: progress.Current, + }, + { + name: "first block", + golden: "blocks-first-1.golden", + start: 1, + end: 1, + }, + { + name: "all blocks", + golden: "blocks-all.golden", + start: 0, + end: progress.Current, + }, + { + name: "start > end", + golden: "blocks-end-less-than-start.golden", + start: 10, + end: 9, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + if tc.errMsg == "" { + resp := testBlocksInRange(t, tc.start, tc.end) + + var expected readable.Blocks + checkGoldenFile(t, tc.golden, TestData{*resp, &expected}) + } else { + _, err := c.BlocksInRange(tc.start, tc.end) + assertResponseError(t, err, tc.errCode, tc.errMsg) + } + }) + } +} + +func TestLiveBlocksInRange(t *testing.T) { + if !doLive(t) { + return + } + + testBlocksInRange(t, 1, 10) +} + +func testBlocksInRange(t *testing.T, start, end uint64) *readable.Blocks { + c := newClient() + + blocks, err := c.BlocksInRange(start, end) + require.NoError(t, err) + + if start > end { + require.Empty(t, blocks.Blocks) + } else { + require.Len(t, blocks.Blocks, int(end-start+1)) + } + + var prevBlock *readable.Block + for idx, b := range blocks.Blocks { + if prevBlock != nil { + require.Equal(t, prevBlock.Head.Hash, b.Head.PreviousHash) + } + + bHash, err := c.BlockByHash(b.Head.Hash) + require.Equal(t, uint64(idx)+start, b.Head.BkSeq) + require.NoError(t, err) + require.NotNil(t, bHash) + require.Equal(t, b, *bHash) + + prevBlock = &blocks.Blocks[idx] + } + + return blocks +} + +func TestStableBlocksInRangeVerbose(t *testing.T) { + if !doStable(t) { + return + } + + c := newClient() + + progress, err := c.BlockchainProgress() + require.NoError(t, err) + + var lastNBlocks uint64 = 10 + require.True(t, progress.Current > lastNBlocks+1) + + cases := []struct { + name string + golden string + start uint64 + end uint64 + errCode int + errMsg string + }{ + { + name: "genesis", + golden: "blocks-verbose-genesis.golden", + start: 0, + end: 0, + }, + { + name: "first 10", + golden: "blocks-verbose-first-10.golden", + start: 1, + end: 10, + }, + { + name: "last 10", + golden: "blocks-verbose-last-10.golden", + start: progress.Current - lastNBlocks, + end: progress.Current, + }, + { + name: "first block", + golden: "blocks-verbose-first-1.golden", + start: 1, + end: 1, + }, + { + name: "all blocks", + golden: "blocks-verbose-all.golden", + start: 0, + end: progress.Current, + }, + { + name: "start > end", + golden: "blocks-verbose-end-less-than-start.golden", + start: 10, + end: 9, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + if tc.errMsg == "" { + resp := testBlocksInRangeVerbose(t, tc.start, tc.end) + + var expected readable.BlocksVerbose + checkGoldenFile(t, tc.golden, TestData{*resp, &expected}) + } else { + blocks, err := c.BlocksInRangeVerbose(tc.start, tc.end) + require.Nil(t, blocks) + assertResponseError(t, err, tc.errCode, tc.errMsg) + } + }) + } +} + +func TestLiveBlocksInRangeVerbose(t *testing.T) { + if !doLive(t) { + return + } + + testBlocksInRangeVerbose(t, 1, 10) +} + +func testBlocksInRangeVerbose(t *testing.T, start, end uint64) *readable.BlocksVerbose { + c := newClient() + + blocks, err := c.BlocksInRangeVerbose(start, end) + require.NoError(t, err) + + if start > end { + require.Empty(t, blocks.Blocks) + } else { + require.Len(t, blocks.Blocks, int(end-start+1)) + } + + var prevBlock *readable.BlockVerbose + for idx, b := range blocks.Blocks { + assertVerboseBlockFee(t, &b) + + if prevBlock != nil { + require.Equal(t, prevBlock.Head.Hash, b.Head.PreviousHash) + } + + bHash, err := c.BlockByHashVerbose(b.Head.Hash) + require.Equal(t, uint64(idx)+start, b.Head.BkSeq) + require.NoError(t, err) + require.NotNil(t, bHash) + require.Equal(t, b, *bHash) + + prevBlock = &blocks.Blocks[idx] + } + + return blocks +} + +func TestStableBlocks(t *testing.T) { + if !doStable(t) { + return + } + + c := newClient() + + cases := []struct { + name string + golden string + seqs []uint64 + errCode int + errMsg string + }{ + { + name: "multiple sequences", + golden: "blocks-3-5-7.golden", + seqs: []uint64{3, 5, 7}, + }, + { + name: "block seq not found", + seqs: []uint64{3, 5, 7, 99999}, + errCode: http.StatusNotFound, + errMsg: "404 Not Found - block does not exist seq=99999", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + if tc.errMsg == "" { + resp := testBlocks(t, tc.seqs) + + var expected readable.Blocks + checkGoldenFile(t, tc.golden, TestData{*resp, &expected}) + } else { + _, err := c.Blocks(tc.seqs) + assertResponseError(t, err, tc.errCode, tc.errMsg) + } + }) + } +} + +func TestLiveBlocks(t *testing.T) { + if !doLive(t) { + return + } + + testBlocks(t, []uint64{3, 5, 7}) +} + +func testBlocks(t *testing.T, seqs []uint64) *readable.Blocks { + c := newClient() + + blocks, err := c.Blocks(seqs) + require.NoError(t, err) + + require.Equal(t, len(seqs), len(blocks.Blocks)) + + seqsMap := make(map[uint64]struct{}, len(seqs)) + for _, x := range seqs { + seqsMap[x] = struct{}{} + } + + for _, b := range blocks.Blocks { + _, ok := seqsMap[b.Head.BkSeq] + require.True(t, ok) + delete(seqsMap, b.Head.BkSeq) + + bHash, err := c.BlockByHash(b.Head.Hash) + require.NoError(t, err) + require.NotNil(t, bHash) + require.Equal(t, b, *bHash) + } + + require.Empty(t, seqsMap) + + return blocks +} + +func TestStableBlocksVerbose(t *testing.T) { + if !doStable(t) { + return + } + + c := newClient() + + cases := []struct { + name string + golden string + seqs []uint64 + errCode int + errMsg string + }{ + { + name: "multiple sequences", + golden: "blocks-3-5-7-verbose.golden", + seqs: []uint64{3, 5, 7}, + }, + { + name: "block seq not found", + seqs: []uint64{3, 5, 7, 99999}, + errCode: http.StatusNotFound, + errMsg: "404 Not Found - block does not exist seq=99999", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + if tc.errMsg == "" { + resp := testBlocksVerbose(t, tc.seqs) + + var expected readable.BlocksVerbose + checkGoldenFile(t, tc.golden, TestData{*resp, &expected}) + } else { + blocks, err := c.BlocksVerbose(tc.seqs) + require.Nil(t, blocks) + assertResponseError(t, err, tc.errCode, tc.errMsg) + } + }) + } +} + +func TestLiveBlocksVerbose(t *testing.T) { + if !doLive(t) { + return + } + + testBlocksVerbose(t, []uint64{3, 5, 7}) +} + +func testBlocksVerbose(t *testing.T, seqs []uint64) *readable.BlocksVerbose { + c := newClient() + + blocks, err := c.BlocksVerbose(seqs) + require.NoError(t, err) + + require.Equal(t, len(seqs), len(blocks.Blocks)) + + seqsMap := make(map[uint64]struct{}, len(seqs)) + for _, x := range seqs { + seqsMap[x] = struct{}{} + } + + for _, b := range blocks.Blocks { + _, ok := seqsMap[b.Head.BkSeq] + require.True(t, ok) + delete(seqsMap, b.Head.BkSeq) + + assertVerboseBlockFee(t, &b) + + bHash, err := c.BlockByHashVerbose(b.Head.Hash) + require.NoError(t, err) + require.NotNil(t, bHash) + require.Equal(t, b, *bHash) + } + + require.Empty(t, seqsMap) + + return blocks +} + +func TestStableLastBlocks(t *testing.T) { + if !doStable(t) { + return + } + + c := newClient() + + blocks, err := c.LastBlocks(1) + require.NoError(t, err) + + var expected *readable.Blocks + checkGoldenFile(t, "block-last.golden", TestData{blocks, &expected}) + + var prevBlock *readable.Block + blocks, err = c.LastBlocks(10) + require.NoError(t, err) + require.Equal(t, 10, len(blocks.Blocks)) + for idx, b := range blocks.Blocks { + if prevBlock != nil { + require.Equal(t, prevBlock.Head.Hash, b.Head.PreviousHash) + } + + bHash, err := c.BlockByHash(b.Head.Hash) + require.NoError(t, err) + require.NotNil(t, bHash) + require.Equal(t, b, *bHash) + + prevBlock = &blocks.Blocks[idx] + } +} + +func TestLiveLastBlocks(t *testing.T) { + if !doLive(t) { + return + } + c := newClient() + var prevBlock *readable.Block + blocks, err := c.LastBlocks(10) + require.NoError(t, err) + require.Equal(t, 10, len(blocks.Blocks)) + for idx, b := range blocks.Blocks { + if prevBlock != nil { + require.Equal(t, prevBlock.Head.Hash, b.Head.PreviousHash) + } + + bHash, err := c.BlockByHash(b.Head.Hash) + require.NoError(t, err) + require.NotNil(t, bHash) + require.Equal(t, b, *bHash) + + prevBlock = &blocks.Blocks[idx] + } +} + +func TestStableLastBlocksVerbose(t *testing.T) { + if !doStable(t) { + return + } + + c := newClient() + + blocks, err := c.LastBlocksVerbose(1) + require.NoError(t, err) + + var expected *readable.BlocksVerbose + checkGoldenFile(t, "block-last-verbose.golden", TestData{blocks, &expected}) + + blocks, err = c.LastBlocksVerbose(10) + require.NoError(t, err) + require.Equal(t, 10, len(blocks.Blocks)) + + var prevBlock *readable.BlockVerbose + for idx, b := range blocks.Blocks { + assertVerboseBlockFee(t, &b) + + if prevBlock != nil { + require.Equal(t, prevBlock.Head.Hash, b.Head.PreviousHash) + } + + bHash, err := c.BlockByHashVerbose(b.Head.Hash) + require.NoError(t, err) + require.NotNil(t, bHash) + require.Equal(t, b, *bHash) + + prevBlock = &blocks.Blocks[idx] + } +} + +func TestLiveLastBlocksVerbose(t *testing.T) { + if !doLive(t) { + return + } + c := newClient() + + blocks, err := c.LastBlocksVerbose(10) + require.NoError(t, err) + require.Equal(t, 10, len(blocks.Blocks)) + + var prevBlock *readable.BlockVerbose + for idx, b := range blocks.Blocks { + assertVerboseBlockFee(t, &b) + + if prevBlock != nil { + require.Equal(t, prevBlock.Head.Hash, b.Head.PreviousHash) + } + + bHash, err := c.BlockByHashVerbose(b.Head.Hash) + require.NoError(t, err) + require.NotNil(t, bHash) + require.Equal(t, b, *bHash) + + prevBlock = &blocks.Blocks[idx] + } +} + +func TestStableNetworkConnections(t *testing.T) { + if !doStable(t) { + return + } + + c := newClient() + connections, err := c.NetworkConnections(nil) + require.NoError(t, err) + require.Empty(t, connections.Connections) + + connection, err := c.NetworkConnection("127.0.0.1:4444") + assertResponseError(t, err, http.StatusNotFound, "404 Not Found") + require.Nil(t, connection) +} + +func TestLiveNetworkConnections(t *testing.T) { + if !doLive(t) { + return + } + + c := newClient() + connections, err := c.NetworkConnections(nil) + require.NoError(t, err) + + if liveDisableNetworking(t) { + require.Empty(t, connections.Connections) + return + } + + require.NotEmpty(t, connections.Connections) + + checked := false + + for _, cc := range connections.Connections { + connection, err := c.NetworkConnection(cc.Addr) + + // The connection may have disconnected by now + if err != nil { + assertResponseError(t, err, http.StatusNotFound, "404 Not Found") + continue + } + + require.NoError(t, err) + require.NotEmpty(t, cc.Addr) + require.Equal(t, cc.Addr, connection.Addr) + require.Equal(t, cc.GnetID, connection.GnetID) + require.Equal(t, cc.ListenPort, connection.ListenPort) + require.Equal(t, cc.Mirror, connection.Mirror) + + switch cc.State { + case daemon.ConnectionStateIntroduced: + // If the connection was introduced it should stay introduced + require.Equal(t, daemon.ConnectionStateIntroduced, connection.State) + case daemon.ConnectionStateConnected: + // If the connection was connected it should stay connected or have become introduced + require.NotEqual(t, daemon.ConnectionStatePending, connection.State) + } + + // The GnetID should be 0 if pending, otherwise it should not be 0 + if cc.State == daemon.ConnectionStatePending { + require.Equal(t, uint64(0), cc.GnetID) + } else { + require.NotEmpty(t, cc.GnetID) + } + + require.Equal(t, cc.Outgoing, connection.Outgoing) + require.True(t, cc.LastReceived <= connection.LastReceived) + require.True(t, cc.LastSent <= connection.LastSent) + require.Equal(t, cc.ConnectedAt, connection.ConnectedAt) + + checked = true + } + + // This could unfortunately occur if a connection disappeared in between the two calls, + // which will require a test re-run. + require.True(t, checked, "Was not able to find any connection by address, despite finding connections when querying all") + + connections, err = c.NetworkConnections(&api.NetworkConnectionsFilter{ + States: []daemon.ConnectionState{daemon.ConnectionStatePending}, + }) + require.NoError(t, err) + + for _, cc := range connections.Connections { + require.Equal(t, daemon.ConnectionStatePending, cc.State) + } + + connections, err = c.NetworkConnections(&api.NetworkConnectionsFilter{ + Direction: "incoming", + }) + require.NoError(t, err) + + for _, cc := range connections.Connections { + require.False(t, cc.Outgoing) + } +} + +func TestNetworkDefaultConnections(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + c := newClient() + connections, err := c.NetworkDefaultPeers() + require.NoError(t, err) + require.NotEmpty(t, connections) + sort.Strings(connections) + + var expected []string + checkGoldenFile(t, "network-default-peers.golden", TestData{connections, &expected}) +} + +func TestNetworkTrustedConnections(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + c := newClient() + connections, err := c.NetworkTrustedPeers() + require.NoError(t, err) + require.NotEmpty(t, connections) + sort.Strings(connections) + + var expected []string + checkGoldenFile(t, "network-trusted-peers.golden", TestData{connections, &expected}) +} + +func TestStableNetworkExchangeableConnections(t *testing.T) { + if !doStable(t) { + return + } + + c := newClient() + connections, err := c.NetworkExchangedPeers() + require.NoError(t, err) + + var expected []string + checkGoldenFile(t, "network-exchanged-peers.golden", TestData{connections, &expected}) +} + +func TestLiveNetworkExchangeableConnections(t *testing.T) { + if !doLive(t) { + return + } + + c := newClient() + _, err := c.NetworkExchangedPeers() + require.NoError(t, err) +} + +type transactionTestCase struct { + name string + txID string + err api.ClientError + goldenFile string +} + +func TestLiveTransaction(t *testing.T) { + if !doLive(t) { + return + } + + cases := []transactionTestCase{ + { + name: "invalid txID", + txID: "abcd", + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - Invalid hex length", + }, + }, + { + name: "empty txID", + txID: "", + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - txid is empty", + }, + }, + { + name: "OK", + txID: "76ecbabc53ea2a3be46983058433dda6a3cf7ea0b86ba14d90b932fa97385de7", + goldenFile: "transaction-block-517.golden", + }, + } + + c := newClient() + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + tx, err := c.Transaction(tc.txID) + if err != nil { + require.Equal(t, tc.err, err) + return + } + + // tx.Status.Height is how many blocks are above this transaction, + // make sure it is past some checkpoint height + require.True(t, tx.Status.Height >= 50836) + + // readable.TransactionWithStatus.Status.Height is not stable + tx.Status.Height = 0 + + var expected readable.TransactionWithStatus + loadGoldenFile(t, tc.goldenFile, TestData{tx, &expected}) + require.Equal(t, &expected, tx) + }) + } +} + +func TestStableTransaction(t *testing.T) { + if !doStable(t) { + return + } + + cases := []transactionTestCase{ + { + name: "invalid txId", + txID: "abcd", + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - Invalid hex length", + }, + goldenFile: "", + }, + { + name: "not exist", + txID: "540582ee4128b733f810f149e908d984a5f403ad2865108e6c1c5423aeefc759", + err: api.ClientError{ + Status: "404 Not Found", + StatusCode: http.StatusNotFound, + Message: "404 Not Found", + }, + goldenFile: "", + }, + { + name: "empty txId", + txID: "", + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - txid is empty", + }, + goldenFile: "", + }, + { + name: "genesis transaction", + txID: "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + goldenFile: "genesis-transaction.golden", + }, + { + name: "transaction in block 101", + txID: "e8fe5290afba3933389fd5860dca2cbcc81821028be9c65d0bb7cf4e8d2c4c18", + goldenFile: "transaction-block-101.golden", + }, + } + + if !dbNoUnconfirmed(t) { + cases = append(cases, transactionTestCase{ + name: "unconfirmed", + txID: "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947", + goldenFile: "transaction-unconfirmed.golden", + }) + } + + c := newClient() + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + tx, err := c.Transaction(tc.txID) + if err != nil { + require.Equal(t, tc.err, err) + return + } + + var expected readable.TransactionWithStatus + loadGoldenFile(t, tc.goldenFile, TestData{tx, &expected}) + require.Equal(t, &expected, tx) + }) + } +} + +func TestLiveTransactionVerbose(t *testing.T) { + if !doLive(t) { + return + } + + cases := []transactionTestCase{ + { + name: "invalid txID", + txID: "abcd", + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - Invalid hex length", + }, + }, + { + name: "empty txID", + txID: "", + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - txid is empty", + }, + }, + { + name: "OK", + txID: "76ecbabc53ea2a3be46983058433dda6a3cf7ea0b86ba14d90b932fa97385de7", + goldenFile: "transaction-verbose-block-517.golden", + }, + } + + c := newClient() + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + tx, err := c.TransactionVerbose(tc.txID) + if err != nil { + require.Equal(t, tc.err, err) + return + } + + // tx.Status.Height is how many blocks are above this transaction, + // make sure it is past some checkpoint height + require.True(t, tx.Status.Height >= 50836) + + // readable.TransactionWithStatus.Status.Height is not stable + tx.Status.Height = 0 + + var expected readable.TransactionWithStatusVerbose + loadGoldenFile(t, tc.goldenFile, TestData{tx, &expected}) + require.Equal(t, &expected, tx) + }) + } +} + +func TestStableTransactionVerbose(t *testing.T) { + if !doStable(t) { + return + } + + cases := []transactionTestCase{ + { + name: "invalid txId", + txID: "abcd", + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - Invalid hex length", + }, + goldenFile: "", + }, + { + name: "not exist", + txID: "540582ee4128b733f810f149e908d984a5f403ad2865108e6c1c5423aeefc759", + err: api.ClientError{ + Status: "404 Not Found", + StatusCode: http.StatusNotFound, + Message: "404 Not Found", + }, + goldenFile: "", + }, + { + name: "empty txId", + txID: "", + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - txid is empty", + }, + goldenFile: "", + }, + { + name: "genesis transaction", + txID: "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + goldenFile: "genesis-transaction-verbose.golden", + }, + { + name: "transaction in block 101", + txID: "e8fe5290afba3933389fd5860dca2cbcc81821028be9c65d0bb7cf4e8d2c4c18", + goldenFile: "transaction-verbose-block-101.golden", + }, + } + + if !dbNoUnconfirmed(t) { + cases = append(cases, transactionTestCase{ + name: "unconfirmed", + txID: "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947", + goldenFile: "transaction-unconfirmed-verbose.golden", + }) + } + + c := newClient() + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + tx, err := c.TransactionVerbose(tc.txID) + if err != nil { + require.Equal(t, tc.err, err) + return + } + + var expected readable.TransactionWithStatusVerbose + loadGoldenFile(t, tc.goldenFile, TestData{tx, &expected}) + require.Equal(t, &expected, tx) + }) + } +} + +func TestLiveTransactionEncoded(t *testing.T) { + if !doLive(t) { + return + } + + cases := []transactionTestCase{ + { + name: "invalid txID", + txID: "abcd", + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - Invalid hex length", + }, + }, + { + name: "empty txID", + txID: "", + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - txid is empty", + }, + }, + { + name: "OK", + txID: "76ecbabc53ea2a3be46983058433dda6a3cf7ea0b86ba14d90b932fa97385de7", + goldenFile: "transaction-encoded.golden", + }, + } + + c := newClient() + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testTransactionEncoded(t, c, tc, false) + }) + } +} + +func TestStableTransactionEncoded(t *testing.T) { + if !doStable(t) { + return + } + + cases := []transactionTestCase{ + { + name: "invalid txId", + txID: "abcd", + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - Invalid hex length", + }, + goldenFile: "", + }, + { + name: "not exist", + txID: "540582ee4128b733f810f149e908d984a5f403ad2865108e6c1c5423aeefc759", + err: api.ClientError{ + Status: "404 Not Found", + StatusCode: http.StatusNotFound, + Message: "404 Not Found", + }, + goldenFile: "", + }, + { + name: "empty txId", + txID: "", + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - txid is empty", + }, + goldenFile: "", + }, + { + name: "genesis transaction", + txID: "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + goldenFile: "genesis-transaction-encoded.golden", + }, + { + name: "transaction in block 101", + txID: "e8fe5290afba3933389fd5860dca2cbcc81821028be9c65d0bb7cf4e8d2c4c18", + goldenFile: "transaction-encoded-block-101.golden", + }, + { + name: "transaction in block 105", + txID: "41ec724bd40c852096379d1ae57d3f27606877fa95ac9c082fbf63900e6c5cb5", + goldenFile: "transaction-encoded-block-105.golden", + }, + } + + if !dbNoUnconfirmed(t) { + cases = append(cases, transactionTestCase{ + name: "unconfirmed", + txID: "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947", + goldenFile: "transaction-unconfirmed-encoded.golden", + }) + } + + c := newClient() + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testTransactionEncoded(t, c, tc, true) + }) + } +} + +func testTransactionEncoded(t *testing.T, c *api.Client, tc transactionTestCase, stable bool) { + encodedTxn, err := c.TransactionEncoded(tc.txID) + if err != nil { + require.Equal(t, tc.err, err) + return + } + + if !stable { + encodedTxn.Status.Height = 0 + } + + decodedTxn, err := coin.DeserializeTransactionHex(encodedTxn.EncodedTransaction) + require.NoError(t, err) + + txnResult, err := readable.NewTransactionWithStatus(&visor.Transaction{ + Transaction: decodedTxn, + Status: visor.TransactionStatus{ + Confirmed: encodedTxn.Status.Confirmed, + Height: encodedTxn.Status.Height, + BlockSeq: encodedTxn.Status.BlockSeq, + }, + Time: encodedTxn.Time, + }) + require.NoError(t, err) + + txn, err := c.Transaction(tc.txID) + require.NoError(t, err) + + if !stable { + txn.Status.Height = 0 + } + + require.Equal(t, txn, txnResult) + + var expected api.TransactionEncodedResponse + loadGoldenFile(t, tc.goldenFile, TestData{encodedTxn, &expected}) + require.Equal(t, &expected, encodedTxn) +} + +func TestLiveTransactions(t *testing.T) { + if !doLive(t) { + return + } + + c := newClient() + addrs := []string{ + "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + } + txns, err := c.Transactions(addrs) + require.NoError(t, err) + require.True(t, len(txns) > 0) + assertNoTransactionsDupes(t, txns) + + // Two addresses with a mutual transaction between the two, to test deduplication + addrs = []string{ + "7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD", + "2K6NuLBBapWndAssUtkxKfCtyjDQDHrEhhT", + } + txns, err = c.Transactions(addrs) + require.NoError(t, err) + // There were 4 transactions amonst these two addresses at the time this was written + require.True(t, len(txns) >= 4) + assertNoTransactionsDupes(t, txns) +} + +type transactionsTestCase struct { + name string + addrs []string + err api.ClientError + goldenFile string +} + +func TestStableTransactions(t *testing.T) { + if !doStable(t) { + return + } + + cases := []transactionsTestCase{ + { + name: "invalid addr length", + addrs: []string{"abcd"}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - parse parameter: 'addrs' failed: address \"abcd\" is invalid: Invalid address length", + }, + }, + { + name: "invalid addr character", + addrs: []string{"701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947"}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - parse parameter: 'addrs' failed: address \"701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947\" is invalid: Invalid base58 character", + }, + }, + { + name: "invalid checksum", + addrs: []string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKk"}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - parse parameter: 'addrs' failed: address \"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKk\" is invalid: Invalid checksum", + }, + }, + { + name: "empty addrs", + addrs: []string{}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - txId is empty", + }, + goldenFile: "empty-addrs-transactions.golden", + }, + { + name: "single addr", + addrs: []string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt"}, + goldenFile: "single-addr-transactions.golden", + }, + { + name: "genesis", + addrs: []string{"2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6"}, + goldenFile: "genesis-addr-transactions.golden", + }, + { + name: "multiple addrs", + addrs: []string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8"}, + goldenFile: "multiple-addr-transactions.golden", + }, + } + + if !dbNoUnconfirmed(t) { + cases = append(cases, transactionsTestCase{ + name: "confirmed and unconfirmed transactions", + addrs: []string{"212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN"}, + goldenFile: "confirmed-and-unconfirmed-transactions.golden", + }) + } + + c := newClient() + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + txnResult, err := c.Transactions(tc.addrs) + if err != nil { + require.Equal(t, tc.err, err, "case: "+tc.name) + return + } + + assertNoTransactionsDupes(t, txnResult) + + var expected []readable.TransactionWithStatus + checkGoldenFile(t, tc.goldenFile, TestData{txnResult, &expected}) + }) + } +} + +func TestLiveConfirmedTransactions(t *testing.T) { + if !doLive(t) { + return + } + + c := newClient() + + cTxsSingle, err := c.ConfirmedTransactions([]string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt"}) + require.NoError(t, err) + require.True(t, len(cTxsSingle) > 0) + assertNoTransactionsDupes(t, cTxsSingle) + + cTxsAll, err := c.ConfirmedTransactions([]string{}) + require.NoError(t, err) + require.True(t, len(cTxsAll) > 0) + require.True(t, len(cTxsAll) > len(cTxsSingle)) + assertNoTransactionsDupes(t, cTxsAll) +} + +func TestStableConfirmedTransactions(t *testing.T) { + if !doStable(t) { + return + } + + cases := []transactionsTestCase{ + { + name: "invalid addr length", + addrs: []string{"abcd"}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - parse parameter: 'addrs' failed: address \"abcd\" is invalid: Invalid address length", + }, + }, + { + name: "invalid addr character", + addrs: []string{"701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947"}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - parse parameter: 'addrs' failed: address \"701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947\" is invalid: Invalid base58 character", + }, + }, + { + name: "invalid checksum", + addrs: []string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKk"}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - parse parameter: 'addrs' failed: address \"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKk\" is invalid: Invalid checksum", + }, + }, + { + name: "empty addrs", + addrs: []string{}, + goldenFile: "empty-addrs-transactions.golden", + }, + { + name: "single addr", + addrs: []string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt"}, + goldenFile: "single-addr-transactions.golden", + }, + { + name: "genesis", + addrs: []string{"2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6"}, + goldenFile: "genesis-addr-transactions.golden", + }, + { + name: "multiple addrs", + addrs: []string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8"}, + goldenFile: "multiple-addr-transactions.golden", + }, + { + name: "unconfirmed should be excluded", + addrs: []string{"212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN"}, + goldenFile: "unconfirmed-excluded-from-transactions.golden", + }, + } + + c := newClient() + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + txnResult, err := c.ConfirmedTransactions(tc.addrs) + if err != nil { + require.Equal(t, tc.err, err, "case: "+tc.name) + return + } + + assertNoTransactionsDupes(t, txnResult) + + var expected []readable.TransactionWithStatus + checkGoldenFile(t, tc.goldenFile, TestData{txnResult, &expected}) + }) + } +} + +func TestStableUnconfirmedTransactions(t *testing.T) { + if !doStable(t) { + return + } + + cases := []transactionsTestCase{ + { + name: "invalid addr length", + addrs: []string{"abcd"}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - parse parameter: 'addrs' failed: address \"abcd\" is invalid: Invalid address length", + }, + }, + { + name: "invalid addr character", + addrs: []string{"701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947"}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - parse parameter: 'addrs' failed: address \"701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947\" is invalid: Invalid base58 character", + }, + }, + { + name: "invalid checksum", + addrs: []string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKk"}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - parse parameter: 'addrs' failed: address \"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKk\" is invalid: Invalid checksum", + }, + }, + } + + if dbNoUnconfirmed(t) { + cases = append(cases, transactionsTestCase{ + name: "empty addrs", + addrs: []string{}, + goldenFile: "no-unconfirmed-txns.golden", + }) + } else { + cases = append(cases, transactionsTestCase{ + name: "empty addrs (all unconfirmed txns)", + addrs: []string{}, + goldenFile: "all-unconfirmed-txns.golden", + }) + } + + c := newClient() + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + txnResult, err := c.UnconfirmedTransactions(tc.addrs) + if err != nil { + require.Equal(t, tc.err, err, "case: "+tc.name) + return + } + + assertNoTransactionsDupes(t, txnResult) + + var expected []readable.TransactionWithStatus + checkGoldenFile(t, tc.goldenFile, TestData{txnResult, &expected}) + }) + } +} + +func TestLiveUnconfirmedTransactions(t *testing.T) { + if !doLive(t) { + return + } + + c := newClient() + + cTxsSingle, err := c.UnconfirmedTransactions([]string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt"}) + require.NoError(t, err) + require.True(t, len(cTxsSingle) >= 0) + assertNoTransactionsDupes(t, cTxsSingle) + + cTxsAll, err := c.UnconfirmedTransactions([]string{}) + require.NoError(t, err) + require.True(t, len(cTxsAll) >= 0) + require.True(t, len(cTxsAll) >= len(cTxsSingle)) + assertNoTransactionsDupes(t, cTxsAll) +} + +func assertNoTransactionsDupes(t *testing.T, r []readable.TransactionWithStatus) { + txids := make(map[string]struct{}) + + for _, x := range r { + _, ok := txids[x.Transaction.Hash] + require.False(t, ok) + txids[x.Transaction.Hash] = struct{}{} + } +} + +func TestLiveTransactionsVerbose(t *testing.T) { + if !doLive(t) { + return + } + + c := newClient() + addrs := []string{ + "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + } + txns, err := c.TransactionsVerbose(addrs) + require.NoError(t, err) + require.True(t, len(txns) > 0) + assertNoTransactionsDupesVerbose(t, txns) +} + +func TestStableTransactionsVerbose(t *testing.T) { + if !doStable(t) { + return + } + + cases := []transactionsTestCase{ + { + name: "invalid addr length", + addrs: []string{"abcd"}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - parse parameter: 'addrs' failed: address \"abcd\" is invalid: Invalid address length", + }, + }, + { + name: "invalid addr character", + addrs: []string{"701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947"}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - parse parameter: 'addrs' failed: address \"701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947\" is invalid: Invalid base58 character", + }, + }, + { + name: "invalid checksum", + addrs: []string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKk"}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - parse parameter: 'addrs' failed: address \"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKk\" is invalid: Invalid checksum", + }, + }, + { + name: "empty addrs", + addrs: []string{}, + goldenFile: "empty-addrs-transactions-verbose.golden", + }, + { + name: "single addr", + addrs: []string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt"}, + goldenFile: "single-addr-transactions-verbose.golden", + }, + { + name: "genesis", + addrs: []string{"2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6"}, + goldenFile: "genesis-addr-transactions-verbose.golden", + }, + { + name: "multiple addrs", + addrs: []string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8"}, + goldenFile: "multiple-addr-transactions-verbose.golden", + }, + } + + if !dbNoUnconfirmed(t) { + cases = append(cases, transactionsTestCase{ + name: "confirmed and unconfirmed transactions", + addrs: []string{"212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN"}, + goldenFile: "confirmed-and-unconfirmed-transactions-verbose.golden", + }) + } + + c := newClient() + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + txnResult, err := c.TransactionsVerbose(tc.addrs) + if err != nil { + require.Equal(t, tc.err, err, "case: "+tc.name) + return + } + + assertNoTransactionsDupesVerbose(t, txnResult) + + var expected []readable.TransactionWithStatusVerbose + checkGoldenFile(t, tc.goldenFile, TestData{txnResult, &expected}) + }) + } +} + +func TestLiveConfirmedTransactionsVerbose(t *testing.T) { + if !doLive(t) { + return + } + + c := newClient() + + cTxsSingle, err := c.ConfirmedTransactionsVerbose([]string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt"}) + require.NoError(t, err) + require.True(t, len(cTxsSingle) > 0) + assertNoTransactionsDupesVerbose(t, cTxsSingle) + + cTxsAll, err := c.ConfirmedTransactionsVerbose([]string{}) + require.NoError(t, err) + require.True(t, len(cTxsAll) > 0) + require.True(t, len(cTxsAll) > len(cTxsSingle)) + assertNoTransactionsDupesVerbose(t, cTxsAll) +} + +func TestStableConfirmedTransactionsVerbose(t *testing.T) { + if !doStable(t) { + return + } + + cases := []transactionsTestCase{ + { + name: "invalid addr length", + addrs: []string{"abcd"}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - parse parameter: 'addrs' failed: address \"abcd\" is invalid: Invalid address length", + }, + }, + { + name: "invalid addr character", + addrs: []string{"701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947"}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - parse parameter: 'addrs' failed: address \"701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947\" is invalid: Invalid base58 character", + }, + }, + { + name: "invalid checksum", + addrs: []string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKk"}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - parse parameter: 'addrs' failed: address \"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKk\" is invalid: Invalid checksum", + }, + }, + { + name: "empty addrs", + addrs: []string{}, + goldenFile: "empty-addrs-transactions-verbose.golden", + }, + { + name: "single addr", + addrs: []string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt"}, + goldenFile: "single-addr-transactions-verbose.golden", + }, + { + name: "genesis", + addrs: []string{"2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6"}, + goldenFile: "genesis-addr-transactions-verbose.golden", + }, + { + name: "multiple addrs", + addrs: []string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8"}, + goldenFile: "multiple-addr-transactions-verbose.golden", + }, + { + name: "unconfirmed should be excluded", + addrs: []string{"212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN"}, + goldenFile: "unconfirmed-excluded-from-transactions-verbose.golden", + }, + } + + c := newClient() + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + txnResult, err := c.ConfirmedTransactionsVerbose(tc.addrs) + if err != nil { + require.Equal(t, tc.err, err, "case: "+tc.name) + return + } + + assertNoTransactionsDupesVerbose(t, txnResult) + + var expected []readable.TransactionWithStatusVerbose + checkGoldenFile(t, tc.goldenFile, TestData{txnResult, &expected}) + }) + } +} + +func TestStableUnconfirmedTransactionsVerbose(t *testing.T) { + if !doStable(t) { + return + } + + cases := []transactionsTestCase{ + { + name: "invalid addr length", + addrs: []string{"abcd"}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - parse parameter: 'addrs' failed: address \"abcd\" is invalid: Invalid address length", + }, + }, + { + name: "invalid addr character", + addrs: []string{"701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947"}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - parse parameter: 'addrs' failed: address \"701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947\" is invalid: Invalid base58 character", + }, + }, + { + name: "invalid checksum", + addrs: []string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKk"}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - parse parameter: 'addrs' failed: address \"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKk\" is invalid: Invalid checksum", + }, + }, + } + + if dbNoUnconfirmed(t) { + cases = append(cases, transactionsTestCase{ + name: "empty addrs", + addrs: []string{}, + goldenFile: "no-unconfirmed-txns.golden", + }) + } else { + cases = append(cases, transactionsTestCase{ + name: "empty addrs (all unconfirmed txns)", + addrs: []string{}, + goldenFile: "all-unconfirmed-txns-verbose.golden", + }) + } + + c := newClient() + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + txnResult, err := c.UnconfirmedTransactionsVerbose(tc.addrs) + if err != nil { + require.Equal(t, tc.err, err, "case: "+tc.name) + return + } + + assertNoTransactionsDupesVerbose(t, txnResult) + + var expected []readable.TransactionWithStatusVerbose + checkGoldenFile(t, tc.goldenFile, TestData{txnResult, &expected}) + }) + } +} + +func assertNoTransactionsDupesVerbose(t *testing.T, r []readable.TransactionWithStatusVerbose) { + txids := make(map[string]struct{}) + + for _, x := range r { + _, ok := txids[x.Transaction.Hash] + require.False(t, ok) + txids[x.Transaction.Hash] = struct{}{} + } +} + +func TestLiveUnconfirmedTransactionsVerbose(t *testing.T) { + if !doLive(t) { + return + } + c := newClient() + + cTxsSingle, err := c.UnconfirmedTransactionsVerbose([]string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt"}) + require.NoError(t, err) + require.True(t, len(cTxsSingle) >= 0) + + cTxsAll, err := c.UnconfirmedTransactionsVerbose([]string{}) + require.NoError(t, err) + require.True(t, len(cTxsAll) >= 0) + require.True(t, len(cTxsAll) >= len(cTxsSingle)) +} + +func TestStableResendUnconfirmedTransactions(t *testing.T) { + if !doStable(t) { + return + } + c := newClient() + _, err := c.ResendUnconfirmedTransactions() + require.NotNil(t, err) + respErr, ok := err.(api.ClientError) + require.True(t, ok) + require.Equal(t, fmt.Sprintf("503 Service Unavailable - %s", daemon.ErrNetworkingDisabled), respErr.Message) + require.Equal(t, http.StatusServiceUnavailable, respErr.StatusCode) +} + +func TestLiveResendUnconfirmedTransactions(t *testing.T) { + if !doLive(t) { + return + } + c := newClient() + _, err := c.ResendUnconfirmedTransactions() + + if liveDisableNetworking(t) { + require.NotNil(t, err) + respErr, ok := err.(api.ClientError) + require.True(t, ok) + require.Equal(t, fmt.Sprintf("503 Service Unavailable - %s", daemon.ErrNetworkingDisabled), respErr.Message) + require.Equal(t, http.StatusServiceUnavailable, respErr.StatusCode) + } else { + require.NoError(t, err) + } +} + +type rawTransactionTestCase struct { + name string + txID string + err api.ClientError + rawTxn string +} + +func TestStableRawTransaction(t *testing.T) { + if !doStable(t) { + return + } + + cases := []rawTransactionTestCase{ + { + name: "invalid hex length", + txID: "abcd", + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - Invalid hex length", + }, + }, + { + name: "not found", + txID: "540582ee4128b733f810f149e908d984a5f403ad2865108e6c1c5423aeefc759", + err: api.ClientError{ + Status: "404 Not Found", + StatusCode: http.StatusNotFound, + Message: "404 Not Found", + }, + }, + { + name: "odd length hex string", + txID: "abcdeffedca", + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - encoding/hex: odd length hex string", + }, + }, + { + name: "OK", + txID: "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + rawTxn: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000f8f9c644772dc5373d85e11094e438df707a42c900407a10f35a000000407a10f35a0000", + }, + } + + if !dbNoUnconfirmed(t) { + cases = append(cases, rawTransactionTestCase{ + name: "unconfirmed", + txID: "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947", + rawTxn: "dc00000000f8293dbfdddcc56a97664655ceee650715d35a0dda32a9f0ce0e2e99d4899124010000003981061c7275ae9cc936e902a5367fdd87ef779bbdb31e1e10d325d17a129abb34f6e597ceeaf67bb051774b41c58276004f6a63cb81de61d4693bc7a5536f320001000000fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f2002000000003be2537f8c0893fddcddc878518f38ea493d949e008988068d0000002739570000000000009037ff169fbec6db95e2537e4ff79396c050aeeb00e40b54020000002739570000000000", + }) + } + + c := newClient() + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + txnResult, err := c.RawTransaction(tc.txID) + if err != nil { + require.Equal(t, tc.err, err, "case: "+tc.name) + return + } + require.Equal(t, tc.rawTxn, txnResult, "case: "+tc.name) + }) + } +} + +func TestLiveRawTransaction(t *testing.T) { + if !doLive(t) { + return + } + + cases := []rawTransactionTestCase{ + { + name: "invalid hex length", + txID: "abcd", + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - Invalid hex length", + }, + }, + { + name: "odd length hex string", + txID: "abcdeffedca", + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - encoding/hex: odd length hex string", + }, + }, + { + name: "OK - genesis tx", + txID: "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + rawTxn: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000f8f9c644772dc5373d85e11094e438df707a42c900407a10f35a000000407a10f35a0000", + }, + { + name: "OK", + txID: "540582ee4128b733f810f149e908d984a5f403ad2865108e6c1c5423aeefc759", + rawTxn: "3d0100000088b4e967d77a8b7155c5378a85c199fabf94048aa84833ef5eab7818545bcda80200000071985c70041fe5a6408a2dfac2ea4963820bc603059521259debb114b2f6630b5658e7ff665b2db7878ce9b0d1d051ec66b5dea23274e52642bc7e451b273a90008afb06133958b03c4795d5a7acd001f3942cc6d3b19e93d357d2675fe9ba8bbf3db30b3cda779e441fced581aee88f48c8af017b30dc276b15be25d4bb44260c000200000050386f195b367f8261e66e3fdfbc942fbacfe25e117e554ca1c1caf8993454767afab03c823346ff8b00c29df6acc05841583d90dfd451ba09e66884a48e83f70200000000ef3b60779f014b3c7acf27c16c9acc3ff3bea61600a8b54b06000000c2ba2400000000000037274869aaa4c2e2e5c91595024c65f8f9458102404b4c0000000000c2ba240000000000", + }, + } + + c := newClient() + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + txnResult, err := c.RawTransaction(tc.txID) + if err != nil { + require.Equal(t, tc.err, err, "case: "+tc.name) + return + } + + require.Equal(t, tc.rawTxn, txnResult, "case: "+tc.name) + }) + } +} + +type addressTransactionsTestCase struct { + name string + address string + golden string + errCode int + errMsg string +} + +func TestStableAddressTransactions(t *testing.T) { + // Formerly tested /api/v1/explorer/address, now tests /api/v1/transactions?verbose=1 + if !doStable(t) { + return + } + + cases := []addressTransactionsTestCase{ + { + name: "genesis address", + address: "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + golden: "address-transactions-2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6.golden", + }, + { + name: "address with transactions", + address: "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + golden: "address-transactions-ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od.golden", + }, + { + name: "address without transactions", + address: "2b8ourW8fbTkC1yQBSLseVt6srhXvNMHvn9", + golden: "address-transactions-2b8ourW8fbTkC1yQBSLseVt6srhXvNMHvn9.golden", + }, + { + name: "invalid address", + address: "prRXwTcDK24hs6AFxj", + errCode: http.StatusBadRequest, + errMsg: "400 Bad Request - parse parameter: 'addrs' failed: address \"prRXwTcDK24hs6AFxj\" is invalid: Invalid address length", + }, + } + + if !dbNoUnconfirmed(t) { + cases = append(cases, []addressTransactionsTestCase{ + { + name: "address with outgoing transaction", + address: "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + golden: "address-transactions-outgoing-R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ.golden", + }, + { + name: "address with incoming transaction", + address: "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + golden: "address-transactions-incoming-212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN.golden", + }, + }...) + } + + c := newClient() + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + txns, err := c.TransactionsVerbose([]string{tc.address}) + if tc.errMsg != "" { + assertResponseError(t, err, tc.errCode, tc.errMsg) + return + } + + require.NoError(t, err) + + var expected []readable.TransactionWithStatusVerbose + checkGoldenFile(t, tc.golden, TestData{txns, &expected}) + }) + } +} + +func TestLiveAddressTransactions(t *testing.T) { + // Formerly tested /api/v1/explorer/address, now tests /api/v1/transactions?verbose=1 + if !doLive(t) { + return + } + + cases := []addressTransactionsTestCase{ + { + name: "address with transactions", + // This is the first distribution address which has spent all of its coins + // Its transactions list should not change, unless someone sends coins to it + address: "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + golden: "address-transactions-R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ.golden", + }, + { + name: "address without transactions", + // This is a randomly generated address, never used + // It should never see new transactions + // (if it ever does, somebody managed to generate this address for use and there is a serious bug) + address: "2RRpfMDmPHEyG4LWmNYT6eWj5VcmUfCJY6D", + golden: "address-transactions-2RRpfMDmPHEyG4LWmNYT6eWj5VcmUfCJY6D.golden", + }, + { + name: "invalid address", + address: "prRXwTcDK24hs6AFxj", + errCode: http.StatusBadRequest, + errMsg: "400 Bad Request - parse parameter: 'addrs' failed: address \"prRXwTcDK24hs6AFxj\" is invalid: Invalid address length", + }, + } + + c := newClient() + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + txns, err := c.TransactionsVerbose([]string{tc.address}) + if tc.errMsg != "" { + assertResponseError(t, err, tc.errCode, tc.errMsg) + return + } + + require.NoError(t, err) + + // Unset height since it is not stable + for i := range txns { + txns[i].Status.Height = 0 + } + + var expected []readable.TransactionWithStatusVerbose + checkGoldenFile(t, tc.golden, TestData{txns, &expected}) + }) + } +} + +func TestStableRichlist(t *testing.T) { + if !doStable(t) { + return + } + + c := newClient() + + richlist, err := c.Richlist(nil) + require.NoError(t, err) + + var expected api.Richlist + checkGoldenFile(t, "richlist-default.golden", TestData{*richlist, &expected}) + + richlist, err = c.Richlist(&api.RichlistParams{ + N: 0, + IncludeDistribution: false, + }) + require.NoError(t, err) + + expected = api.Richlist{} + checkGoldenFile(t, "richlist-all.golden", TestData{*richlist, &expected}) + + richlist, err = c.Richlist(&api.RichlistParams{ + N: 0, + IncludeDistribution: true, + }) + require.NoError(t, err) + + expected = api.Richlist{} + checkGoldenFile(t, "richlist-all-include-distribution.golden", TestData{*richlist, &expected}) + + richlist, err = c.Richlist(&api.RichlistParams{ + N: 8, + IncludeDistribution: false, + }) + require.NoError(t, err) + + expected = api.Richlist{} + checkGoldenFile(t, "richlist-8.golden", TestData{*richlist, &expected}) + + richlist, err = c.Richlist(&api.RichlistParams{ + N: 150, + IncludeDistribution: true, + }) + require.NoError(t, err) + + expected = api.Richlist{} + checkGoldenFile(t, "richlist-150-include-distribution.golden", TestData{*richlist, &expected}) +} + +func TestLiveRichlist(t *testing.T) { + if !doLive(t) { + return + } + + c := newClient() + + richlist, err := c.Richlist(nil) + require.NoError(t, err) + + require.NotEmpty(t, richlist.Richlist) + require.Len(t, richlist.Richlist, 20) + + richlist, err = c.Richlist(&api.RichlistParams{ + N: 150, + IncludeDistribution: true, + }) + require.NoError(t, err) + + require.Len(t, richlist.Richlist, 150) +} + +func TestStableAddressCount(t *testing.T) { + if !doStable(t) { + return + } + + c := newClient() + + count, err := c.AddressCount() + require.NoError(t, err) + + require.Equal(t, uint64(155), count) +} + +func TestLiveAddressCount(t *testing.T) { + if !doLive(t) { + return + } + + c := newClient() + + count, err := c.AddressCount() + require.NoError(t, err) + + // 5296 addresses as of 2018-03-06, the count could decrease but is unlikely to + require.True(t, count > 5000) +} + +func TestStableNoUnconfirmedPendingTransactions(t *testing.T) { + if !doStable(t) || !dbNoUnconfirmed(t) { + return + } + + c := newClient() + + txns, err := c.PendingTransactions() + require.NoError(t, err) + require.Empty(t, txns) +} + +func TestStablePendingTransactions(t *testing.T) { + if !doStable(t) || dbNoUnconfirmed(t) { + return + } + + c := newClient() + + txns, err := c.PendingTransactions() + require.NoError(t, err) + + // Convert Received and Checked times to UTC for stable comparison + for i, txn := range txns { + require.False(t, txn.Received.IsZero()) + require.False(t, txn.Checked.IsZero()) + + txns[i].Received = txn.Received.UTC() + txns[i].Checked = txn.Checked.UTC() + } + + var expect []readable.UnconfirmedTransactions + checkGoldenFile(t, "pending-transactions.golden", TestData{txns, &expect}) +} + +func TestLivePendingTransactions(t *testing.T) { + if !doLive(t) { + return + } + + c := newClient() + + _, err := c.PendingTransactions() + require.NoError(t, err) +} + +func TestStableNoUnconfirmedPendingTransactionsVerbose(t *testing.T) { + if !doStable(t) || !dbNoUnconfirmed(t) { + return + } + + c := newClient() + + txns, err := c.PendingTransactionsVerbose() + require.NoError(t, err) + require.Empty(t, txns) +} + +func TestStablePendingTransactionsVerbose(t *testing.T) { + if !doStable(t) || dbNoUnconfirmed(t) { + return + } + + c := newClient() + + txns, err := c.PendingTransactionsVerbose() + require.NoError(t, err) + + // Convert Received and Checked times to UTC for stable comparison + for i, txn := range txns { + require.False(t, txn.Received.IsZero()) + require.False(t, txn.Checked.IsZero()) + + txns[i].Received = txn.Received.UTC() + txns[i].Checked = txn.Checked.UTC() + } + + var expect []readable.UnconfirmedTransactionVerbose + checkGoldenFile(t, "verbose-pending-transactions.golden", TestData{txns, &expect}) +} + +func TestLivePendingTransactionsVerbose(t *testing.T) { + if !doLive(t) { + return + } + + c := newClient() + + _, err := c.PendingTransactionsVerbose() + require.NoError(t, err) +} + +func TestDisableWalletAPI(t *testing.T) { + if !doDisableWalletAPI(t) { + return + } + + changeAddress := testutil.MakeAddress().String() + + type testCase struct { + name string + method string + endpoint string + contentType string + body func() io.Reader + json func() interface{} + expectErr string + code int + } + + tt := []testCase{ + { + name: "get wallet", + method: http.MethodGet, + endpoint: "/api/v1/wallet?id=test.wlt", + expectErr: "403 Forbidden - Endpoint is disabled", + code: http.StatusForbidden, + }, + { + name: "create wallet", + method: http.MethodPost, + endpoint: "/api/v1/wallet/create", + body: func() io.Reader { + v := url.Values{} + v.Add("seed", "seed") + v.Add("label", "label") + v.Add("scan", "1") + return strings.NewReader(v.Encode()) + }, + expectErr: "403 Forbidden - Endpoint is disabled", + code: http.StatusForbidden, + }, + { + name: "generate new address", + method: http.MethodPost, + endpoint: "/api/v1/wallet/newAddress", + body: func() io.Reader { + v := url.Values{} + v.Add("id", "test.wlt") + return strings.NewReader(v.Encode()) + }, + expectErr: "403 Forbidden - Endpoint is disabled", + code: http.StatusForbidden, + }, + { + name: "get wallet balance", + method: http.MethodGet, + endpoint: "/api/v1/wallet/balance?id=test.wlt", + expectErr: "403 Forbidden - Endpoint is disabled", + code: http.StatusForbidden, + }, + { + name: "get wallet unconfirmed transactions", + method: http.MethodGet, + endpoint: "/api/v1/wallet/transactions?id=test.wlt", + expectErr: "403 Forbidden - Endpoint is disabled", + code: http.StatusForbidden, + }, + { + name: "update wallet label", + method: http.MethodPost, + endpoint: "/api/v1/wallet/update", + body: func() io.Reader { + v := url.Values{} + v.Add("id", "test.wlt") + v.Add("label", "label") + return strings.NewReader(v.Encode()) + }, + expectErr: "403 Forbidden - Endpoint is disabled", + code: http.StatusForbidden, + }, + { + name: "new seed", + method: http.MethodGet, + endpoint: "/api/v1/wallet/newSeed", + expectErr: "403 Forbidden - Endpoint is disabled", + code: http.StatusForbidden, + }, + { + name: "new seed", + method: http.MethodPost, + endpoint: "/api/v1/wallet/seed", + body: func() io.Reader { + v := url.Values{} + v.Add("id", "test.wlt") + return strings.NewReader(v.Encode()) + }, + expectErr: "403 Forbidden - Endpoint is disabled", + code: http.StatusForbidden, + }, + { + name: "get wallets", + method: http.MethodGet, + endpoint: "/api/v1/wallets", + expectErr: "403 Forbidden - Endpoint is disabled", + code: http.StatusForbidden, + }, + { + name: "get wallets folder name", + method: http.MethodGet, + endpoint: "/api/v1/wallets/folderName", + expectErr: "403 Forbidden - Endpoint is disabled", + code: http.StatusForbidden, + }, + { + name: "main index.html 404 not found", + method: http.MethodGet, + endpoint: "/api/v1/", + expectErr: "404 Not Found", + code: http.StatusNotFound, + }, + { + name: "encrypt wallet", + method: http.MethodPost, + endpoint: "/api/v1/wallet/encrypt", + body: func() io.Reader { + v := url.Values{} + v.Add("id", "test.wlt") + v.Add("password", "pwd") + return strings.NewReader(v.Encode()) + }, + expectErr: "403 Forbidden - Endpoint is disabled", + code: http.StatusForbidden, + }, + { + name: "decrypt wallet", + method: http.MethodPost, + endpoint: "/api/v1/wallet/decrypt", + body: func() io.Reader { + v := url.Values{} + v.Add("id", "test.wlt") + v.Add("password", "pwd") + return strings.NewReader(v.Encode()) + }, + expectErr: "403 Forbidden - Endpoint is disabled", + code: http.StatusForbidden, + }, + { + name: "get wallet seed", + method: http.MethodPost, + endpoint: "/api/v1/wallet/seed", + body: func() io.Reader { + v := url.Values{} + v.Add("id", "test.wlt") + v.Add("password", "pwd") + return strings.NewReader(v.Encode()) + }, + expectErr: "403 Forbidden - Endpoint is disabled", + code: http.StatusForbidden, + }, + { + name: "create transaction", + method: http.MethodPost, + endpoint: "/api/v1/wallet/transaction", + contentType: api.ContentTypeJSON, + json: func() interface{} { + return api.WalletCreateTransactionRequest{ + WalletID: "test.wlt", + CreateTransactionRequest: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + ChangeAddress: &changeAddress, + To: []api.Receiver{ + { + Address: changeAddress, + Coins: "0.001", + Hours: "1", + }, + }, + }, + } + }, + expectErr: "403 Forbidden - Endpoint is disabled", + code: http.StatusForbidden, + }, + } + + c := newClient() + for _, tc := range tt { + f := func(tc testCase) func(t *testing.T) { + return func(t *testing.T) { + var err error + switch tc.method { + case http.MethodGet: + err = c.Get(tc.endpoint, nil) + case http.MethodPost: + switch tc.contentType { + case api.ContentTypeJSON: + err = c.PostJSON(tc.endpoint, tc.json(), nil) + default: + err = c.PostForm(tc.endpoint, tc.body(), nil) + } + } + assertResponseError(t, err, tc.code, tc.expectErr) + } + } + + t.Run(tc.name, f(tc)) + } + + // Confirms that no new wallet is created + // API_WALLET_DIR environment variable is set in ci-script/integration-test-disable-wallet-api.sh + walletDir := os.Getenv("API_WALLET_DIR") + if walletDir == "" { + t.Fatal("API_WALLET_DIR is not set") + } + + // Confirms that the wallet directory does not exist + testutil.RequireFileNotExists(t, walletDir) +} + +func checkHealthResponse(t *testing.T, r *api.HealthResponse) { + require.NotEmpty(t, r.BlockchainMetadata.Unspents) + require.NotEmpty(t, r.BlockchainMetadata.Head.BkSeq) + require.NotEmpty(t, r.BlockchainMetadata.Head.Time) + require.NotEmpty(t, r.Version.Version) + require.True(t, r.Uptime.Duration > time.Duration(0)) + require.NotEmpty(t, r.CoinName) + require.NotEmpty(t, r.DaemonUserAgent) + + _, err := useragent.Parse(r.DaemonUserAgent) + require.NoError(t, err) +} + +func TestStableHealth(t *testing.T) { + if !doStable(t) { + return + } + + c := newClient() + + r, err := c.Health() + require.NoError(t, err) + + checkHealthResponse(t, r) + + require.Equal(t, 0, r.OpenConnections) + require.Equal(t, 0, r.IncomingConnections) + require.Equal(t, 0, r.OutgoingConnections) + + require.True(t, r.BlockchainMetadata.TimeSinceLastBlock.Duration > time.Duration(0)) + + // The stable node is always run with the commit and branch ldflags, so they should appear + require.NotEmpty(t, r.Version.Commit) + require.NotEmpty(t, r.Version.Branch) + + coinName := os.Getenv("COIN") + require.Equal(t, coinName, r.CoinName) + require.Equal(t, fmt.Sprintf("%s:%s", coinName, r.Version.Version), r.DaemonUserAgent) + + _, err = useragent.Parse(r.DaemonUserAgent) + require.NoError(t, err) + + require.Equal(t, useCSRF(t), r.CSRFEnabled) + require.Equal(t, doHeaderCheck(t), r.HeaderCheckEnabled) + require.True(t, r.CSPEnabled) + require.True(t, r.WalletAPIEnabled) + require.False(t, r.GUIEnabled) +} + +func TestLiveHealth(t *testing.T) { + if !doLive(t) { + return + } + + c := newClient() + + r, err := c.Health() + require.NoError(t, err) + + checkHealthResponse(t, r) + + if liveDisableNetworking(t) { + require.Equal(t, 0, r.OpenConnections) + require.Equal(t, 0, r.OutgoingConnections) + require.Equal(t, 0, r.IncomingConnections) + } else { + require.NotEqual(t, 0, r.OpenConnections) + } + + require.Equal(t, r.OutgoingConnections+r.IncomingConnections, r.OpenConnections) + + // The TimeSinceLastBlock can be any value, including negative values, due to clock skew + // The live node is not necessarily run with the commit and branch ldflags, so don't check them +} + +func TestDisableGUIAPI(t *testing.T) { + if !doDisableGUI(t) { + return + } + + c := newClient() + err := c.Get("/", nil) + assertResponseError(t, err, http.StatusNotFound, "404 Not Found") +} + +func TestInvalidAuth(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + user := nodeUsername() + pass := nodePassword() + + c := newClient() + + require.Equal(t, user, c.Username) + require.Equal(t, pass, c.Password) + + if user == "" && pass == "" { + // If neither user nor pass are set, assume the node is run without auth, + // and check that providing auth returns a 401 error + testInvalidAuthNoAuthConfigured(t) + } else { + // If either user or pass are set, assume the node is run with auth, + // and check that missing or invalid auth returns a 401 error + testInvalidAuthAuthConfigured(t) + } +} + +func testInvalidAuthAuthConfigured(t *testing.T) { + cases := []struct { + user string + pass string + }{ + {}, // both missing + { + user: nodeUsername(), // user right, pass missing + }, + { + pass: nodePassword(), // pass right, user missing + }, + { + user: nodeUsername() + "x", // user wrong, pass missing + }, + { + pass: nodePassword() + "x", // pass wrong, user missing + }, + { + user: nodeUsername() + "x", // both wrong + pass: nodePassword() + "x", + }, + { + user: nodeUsername(), // user right, pass wrong + pass: nodePassword() + "x", + }, + { + user: nodeUsername() + "x", // user wrong, pass right + pass: nodePassword(), + }, + } + + for _, tc := range cases { + name := fmt.Sprintf("u=%s p=%s", tc.user, tc.pass) + t.Run(name, func(t *testing.T) { + c := newClient() + c.SetAuth(tc.user, tc.pass) + require.Equal(t, tc.user, c.Username) + require.Equal(t, tc.pass, c.Password) + + _, err := c.Health() + assertResponseError(t, err, http.StatusUnauthorized, "401 Unauthorized") + }) + } +} + +func testInvalidAuthNoAuthConfigured(t *testing.T) { + cases := []struct { + user string + pass string + }{ + { + user: "foo", + }, + { + pass: "bar", + }, + { + user: "foo", + pass: "bar", + }, + } + + for _, tc := range cases { + name := fmt.Sprintf("u=%s p=%s", tc.user, tc.pass) + t.Run(name, func(t *testing.T) { + c := newClient() + c.SetAuth(tc.user, tc.pass) + require.Equal(t, tc.user, c.Username) + require.Equal(t, tc.pass, c.Password) + + _, err := c.Health() + assertResponseError(t, err, http.StatusUnauthorized, "401 Unauthorized") + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/storage_test.go b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/storage_test.go new file mode 100644 index 00000000..68d5a147 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/storage_test.go @@ -0,0 +1,80 @@ +package integration_test + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/kvstorage" +) + +func TestStableStorageGetAllValues(t *testing.T) { + if !doStable(t) { + return + } + + wantVals := map[string]string{ + "key": "val", + } + + c := newClient() + + err := c.AddStorageValue(kvstorage.TypeTxIDNotes, "key", "val") + require.NoError(t, err) + + vals, err := c.GetAllStorageValues(kvstorage.TypeTxIDNotes) + require.NoError(t, err) + require.Equal(t, wantVals, vals) +} + +func TestStableStorageGetValue(t *testing.T) { + if !doStable(t) { + return + } + + wantVal := "val" + + c := newClient() + + err := c.AddStorageValue(kvstorage.TypeTxIDNotes, "key", "val") + require.NoError(t, err) + + val, err := c.GetStorageValue(kvstorage.TypeTxIDNotes, "key") + require.NoError(t, err) + require.Equal(t, wantVal, val) +} + +func TestStableStorageAddValue(t *testing.T) { + if !doStable(t) { + return + } + + c := newClient() + + err := c.AddStorageValue(kvstorage.TypeTxIDNotes, "key", "val") + require.NoError(t, err) +} + +func TestStableStorageRemoveValue(t *testing.T) { + if !doStable(t) { + return + } + + wantVals := map[string]string{ + "key": "val", + } + + c := newClient() + + err := c.AddStorageValue(kvstorage.TypeTxIDNotes, "key", "val") + require.NoError(t, err) + err = c.AddStorageValue(kvstorage.TypeTxIDNotes, "key2", "val2") + require.NoError(t, err) + + err = c.RemoveStorageValue(kvstorage.TypeTxIDNotes, "key2") + require.NoError(t, err) + + vals, err := c.GetAllStorageValues(kvstorage.TypeTxIDNotes) + require.NoError(t, err) + require.Equal(t, wantVals, vals) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/address-transactions-2RRpfMDmPHEyG4LWmNYT6eWj5VcmUfCJY6D.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/address-transactions-2RRpfMDmPHEyG4LWmNYT6eWj5VcmUfCJY6D.golden new file mode 100644 index 00000000..fe51488c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/address-transactions-2RRpfMDmPHEyG4LWmNYT6eWj5VcmUfCJY6D.golden @@ -0,0 +1 @@ +[] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/address-transactions-2b8ourW8fbTkC1yQBSLseVt6srhXvNMHvn9.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/address-transactions-2b8ourW8fbTkC1yQBSLseVt6srhXvNMHvn9.golden new file mode 100644 index 00000000..fe51488c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/address-transactions-2b8ourW8fbTkC1yQBSLseVt6srhXvNMHvn9.golden @@ -0,0 +1 @@ +[] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/address-transactions-2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/address-transactions-2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6.golden new file mode 100644 index 00000000..50c8707a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/address-transactions-2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6.golden @@ -0,0 +1,1311 @@ +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 181, + "block_seq": 0 + }, + "time": 1426562704, + "txn": { + "timestamp": 1426562704, + "length": 0, + "type": 0, + "txid": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "fee": 0, + "sigs": [], + "inputs": [], + "outputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 180, + "block_seq": 1 + }, + "time": 1427926392, + "txn": { + "timestamp": 1427926392, + "length": 3846, + "type": 0, + "txid": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "inner_hash": "0f7019627886818d2501af189bbac18e21b8e959891c5b2726f89e29355aa10a", + "fee": 99999999999900, + "sigs": [ + "be602113fe288f750001ab65f254ceedd8b05b1becc456a0a52a0bea10b8280e38d950933992ad3265e1f81d197036fa634b316f08b3b319ffce081aa43f3bb600" + ], + "inputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000, + "calculated_hours": 100000000000000 + } + ], + "outputs": [ + { + "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "26f585cb96f35307f0af5b9aee004a29b7795695f4c5c836104e2fbbf429a3ce", + "dst": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "18a43b8b69bbf12a9e49e6f9783ba258397e6567301aeed9e901a1e4fed9fef9", + "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5a69ef09b5de21b117cac62141a8de4eade7558c42f0ba8b50996f5ec7867c5d", + "dst": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "aef761a12e3d0fa9c4a8db62b8bab1015c32931b7e3a7fc9a77282cec218f79d", + "dst": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "445a4082da251fa161e4705d115fe2018ca15a5f92e8a0950793405410e6be12", + "dst": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "dst": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "368a609ee90ca15bbbd297af07dc6705131764476d54bef641017ffcd0885e65", + "dst": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "13afe1586015c4d7312f89d123153279e4961eb0d53a4d036847d5d989ba90dc", + "dst": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f625cf04412199c16e073dbb500e66c23cfe69043578b4a2d879a329aac563ec", + "dst": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b2da50a08756c34d059a04812451cf3296f73ba87f8cca38473ac8f051ab6d1e", + "dst": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "135c28698e80e3b2a737d59c16c79684c3fb3ec5cec59f466a39f4ac3c73968e", + "dst": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "df63056cf3ae21efa86d241876ad0194387317585dc9e4fcd80954b47d59b57a", + "dst": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4628f4cfdbf1eb7cccc25d461c46cc29e90cffb5d6277e0de641f7701d60c308", + "dst": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "47e4706dc4d80a70b20c889476fb0627ca6d5bdaa790f4ceba44a689d31b2dcc", + "dst": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b64bc50d370a06df117eb543ca051239c985cfc4b6aa527c51b700de32c7fc41", + "dst": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "390bc4c045fa9f289957b7eca529bfadac96a7dd074bcfbdd3b09e99413b8202", + "dst": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6aa162f7fc09598c4dc8f5fab7fb2383f28c3840937a001acd9f37136e1691b2", + "dst": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e440cf4c896735d3299a871f988c134f404fb2065d1f20c87c9c9bc5fa582e09", + "dst": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "eea791e84a53e4d99485519c5d2c3146b0a2ad080cf92904ae7b28c2d9a6e3ca", + "dst": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "01048ad6a538256d9a8c6c9c6321ca1a01b31cbf08e74fd4ff0f141bf97eb8ce", + "dst": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc5f1f1ddc8cb23df3d42f1e5a1dda9d356846fe930ae4484bc1eeb1b3b2c95b", + "dst": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f03087245a6b64bb69cd5866a1887ae595a9e1a86e196754984840eaf6d3eb9c", + "dst": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "239bdba27dabd52f7450f7d8521c9a7e5ac74093ae3f6f2348bf40ac9a6db7a5", + "dst": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d60879e562b65f97d40bec7309d4490ba0a8c80e2349ecb2e3505aaa50ea1e47", + "dst": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "66e685901492c94942522c346759c711ee2e78a059ef274e77a6ab433409683c", + "dst": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b497992663f99f9902deaaf487b00655820003015ea92091628f4a6e8aeb5854", + "dst": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc40377012004566712fa860e74db97305091cc163e95435e04556c70d32f9c5", + "dst": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "73304622e33994bc2d4ade2cab78d28e1b65185e60ad3c781ecfb5cbc8159136", + "dst": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fed15e8506d0e0898510311850b8863ef6d9a499215ae8823a1e3fb9c8140ab2", + "dst": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "12034bc455d0821813d7eb9afed1ed1a8f19b6f29826ef4a057b4aa0b4228817", + "dst": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fc444cdb2598f44209a41ea20afdc9065ebe51b7cd5f65bb1c0f7a7b427ce7b1", + "dst": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "618d242d95d33e2d7316612a164d89859b85f1287f0d5bed4dcb561cf478f706", + "dst": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "07f70fd4108ef4d2fde3b85411728c1f7bd3a135d2062c5a30a46cc885463780", + "dst": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "af9bcf6ba63a08e699bc101aa362f135343aaf78a56e9f88d118fca0e1ce5c08", + "dst": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6b3530bb930ed10bbc4c307663aba4377c08443498a0a2cf023b1be72f378ae1", + "dst": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fd6da5199e528958e68ee8dd003b727d4d840754ea7c1e0c05e4f0e504c9b2cd", + "dst": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "131f07f5b40f365fb537b863e4aa5ef0efcd77b7fa2ff321d90eeb743ac43678", + "dst": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ffbdfdbf3427d04f445c33e867845bec1ee64a9dfe0d0fa8284547c2226fdfa9", + "dst": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b53c7188ebf4d630790ff63275679ba48009e31af6e4fe15806619216caa750", + "dst": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b4c6639b49402c2753f83c7fb7d3ffa65da74e47fef2b781933ff55b14d09bcd", + "dst": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c956289db079c00d2f80c590d3c8ca26c37da534fe5f65e799b3982ceca493c", + "dst": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "550d2a8d3047cdae0c05a61cc3de43e758b123a6955fa067d3ac375f7d0dbadc", + "dst": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78740d5bf49989936d315bf641949232aace582e03de57db8abff940f7d51bd1", + "dst": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9f2c83c5165826de1077f428ad39d41473e32ed64cd83180d49e7d8e5db996d0", + "dst": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "883be4d7173c235933294ab8dcae8cc76609166eaa1c1f07e9b51d551c979709", + "dst": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6384ed19650d384c29db4c3a39a1ca855058fab758075be2dee759dd9e6faae1", + "dst": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", + "dst": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c238e82f3a4beee1be7b5b464e8553404f6927d5ab93c3d649d362c01097782", + "dst": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dad4991bfa5c51eb176f28c1b3f86661e02579905e6e07c997df22004e06244a", + "dst": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4ba91512c168281f41d3934b927d0d86a3136a31cc345b635095928f8e5f013c", + "dst": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c416f5e604eeada9ae8e520a429d8f19d4230626769e7121007e01353730784f", + "dst": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7b8787fd4076c27d074d2a4761377a1aa26c843c432e3b7e6b0ebf1e29528188", + "dst": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "38f22b194f04d85a6b545b37df06195edeb8503798b229ddeaa946018150c05c", + "dst": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "246377a036ad5444bcd5f47ac9e55fec7c85fc40644df593038d360554a809f7", + "dst": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c6d5e543ff5f2c2526728d588fb21753db5b7e05b8b275aa5e9b24d29350afb0", + "dst": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "98e223e6e2240fef83082d3daa86e46f10e0c71f3f74489ba95db0951a166f53", + "dst": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c8971ca91f8e21c556f647940073db003f7dd5582ae55d4ebca602d5e8e91a6e", + "dst": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dfa7822c05f54116c9fc3b2cde1ecb4667f47a2d8771fe886e832c223cdc4e82", + "dst": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6d37c0c4b6fcbac1e53a46c9c2dc5d3c3b36312c53f25b2baacc785ea77a11f7", + "dst": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9ba5e31610f0545666f102465efa8caa48ad3fb5b8abd5ae802f4a71e3f7de3b", + "dst": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "3ca365aace71e24b04d6f2ffbf7171468c5e71783858c710cae539c5e43e0c0e", + "dst": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c858f2db2a20ac562d32f8fb2a3a11039849a6e44d2bec30befb2e173532a9a3", + "dst": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1550a76598693b950346397e0e825bbb2805edde38b0d0240e50050829b7b1dd", + "dst": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "466340ab7733abb23ab24d877c673fe089c273f11808fbbd6f33a91da92ee96c", + "dst": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "401d4c0c1060ebbb4b9fb3859c2eb47789f94086f4deb01234bf46f7cdc81247", + "dst": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2c0e3aa084f5fec45f99b3f125ce7d50c6da526ef5165df5f22ba603147c3fc2", + "dst": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2e724d83e35235c23c0bb16ae9b708a5bba3c23b186b05d4b8c606f6bb4b311", + "dst": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4f30eae8c49eb268fe364eaf5ee0788da6e2f6adc2f83cd82e96a4bfe98496f5", + "dst": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8753d5775c22477a8ef74eeebf61d7de30be702e70118f552cc18ad963ffe950", + "dst": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efa2007c561dcbf7c83a6bbdd2ef75e7cca76b05330a8b948ba0dd94dee949f7", + "dst": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b379d1b8ff0153c63ee69c40a7155b97fa42ab570f68ff847d457316c4d8ab9", + "dst": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cc84f93adce16699d9e84ef32f55333402431b58dc50c17084bcb8b33f382f88", + "dst": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f38f0760769c19075034f70b059abf4d1bfa6d01e1e8c369a99900ed1eaeca6d", + "dst": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8d55f76bb0b3dd222cf85a7193501c0f4071b446f56dbd1da355b1625993325a", + "dst": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efde499c7e4444bc602b7bf5ed50e95a18ce8ec9a06ba9d850a05bb7a25ecb3a", + "dst": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2a4d631d5dc90e397d85f13410d1a6d877dcaf592a0e2be2e727443ac74b5bd5", + "dst": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e936299a21240744f6edbab493449323f920bbe15dcf294463e5a2ace10f27b0", + "dst": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "44e17f4bd29411a1614457171c06183e364bf6ff80a201717b2dfc0748e9ebe3", + "dst": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1941e5cc5e38dd92427580af699b1f410be7b29ff17d3d0ff3d046bfba0aaabf", + "dst": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ff6c0f27fcf92f3b4a3871b801c3116847fe47a7e3bafcadd4855d06012091ad", + "dst": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cd6c4b785e60757fad0e6fd4874b729ea7703fe7ee9560e1283d2eb71fc75321", + "dst": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "745eaff456a390c3868742a039e72c2a93ff8eee10417dbe848d533b89facc04", + "dst": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2f3f050c9ef31bf5c3b14c1c71699c4f4b38aa18479531194d12e6277416516", + "dst": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0b95850edabed70762768ac1695c5d7f230cccaa8de06657cda42cafba36374f", + "dst": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7c767d3a06db1ac0e1809ebe29a7d9689143259f4651837de54423e287c20490", + "dst": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78b07e8fe1366e173f2eeb75c35cd53baf0f6100de50ae12b4ffe7d0d7ba4298", + "dst": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5010eb25f6e1ed725fb901ae1e945e545ae846d7be8a135333d2d41102c33328", + "dst": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "178a33e64826cd2039b8538b74e6de513966acab45ab79d77dc9392018a65ffb", + "dst": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "044dc539d063250dc654b2bf0986a9044b4eea05e1284c11a2b313acd8dc3498", + "dst": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9fd5ea38f383291566def44b6fb932414f97123952578fe0cfb9a30eb075a099", + "dst": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "be5930e9cc35801433bcd21db84da7d4f1d8e744feca16a2c6fb00c81ce93e51", + "dst": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8cd999cd193d315e5f1c6f74c230c12e6abe6847924f6e89d988e09ca413f52e", + "dst": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0cff53628eb0e984c134b68cbe4b1bb7721a05adaa32e93b9df489a9a7a176cf", + "dst": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "a5ef046e84be9ff2485dde49afe6073811286761afac3bbd588b6e4130930479", + "dst": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cdee5f84c4f08098ac740e3a260ced14c1e199e126aa5291ec079b281a7dc407", + "dst": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6a24135f8496e7a37dcf7164218bb3aa530319f3b2bf3c7a1a9cc1bd17831328", + "dst": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "693c7f970b34ce5882e62430f4c9c28957159a257d27d4e21a61fd95c6b97464", + "dst": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c008a613cef129c180dbcc7213f2d41a14d245d06a3844d63d9beac963145385", + "dst": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "439cdfd03972fb4bb5da54208cf8098ee78228c487ce9e84623f5f83e17a7d68", + "dst": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "hours": 1 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 164, + "block_seq": 17 + }, + "time": 1428989855, + "txn": { + "timestamp": 1428989855, + "length": 220, + "type": 0, + "txid": "d952ef4cc45a89c14230ba0f7e30b782fad83cb6506ac0f503a242c568c1287a", + "inner_hash": "8fc48920982066fd4c69e2d2c0c5239cca7c296f0e3ad30e9b976c1230967478", + "fee": 2020394, + "sigs": [ + "b7eb93bcebb6df3dcad48afd66dd60bd42b1fbcdf52aa5e0c7e455e791f64a976fa416534b4e08bf3e62a2df83e13754119634c4255dd1e2e08be447d4d5b47201" + ], + "inputs": [ + { + "uxid": "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999890.000000", + "hours": 4073, + "calculated_hours": 6061184 + } + ], + "outputs": [ + { + "uxid": "4168b9378363cd81939e667cf78055d35a60d3101f5f9e3d2ae709e3981e29fc", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 4040790 + }, + { + "uxid": "c603e99ceae4d15c20360714ee07ba6e3a944a97ea9285d164c23252e93958b6", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 163, + "block_seq": 18 + }, + "time": 1428989925, + "txn": { + "timestamp": 1428989925, + "length": 183, + "type": 0, + "txid": "686db0a8cd429970bb91163033703410d4750c86ba485709fe1a3faabbbb42f6", + "inner_hash": "76732ac6a9936242193011d78a0f2849529aee767a569c9c6bb25b3bbae15cee", + "fee": 0, + "sigs": [ + "d74dcfdc8401a29b1dccc728b40b6b79faea147c65b4a859063ad77cc63aa9a62417c63b91b94678b6656fdba2f242d836b6914e77d244fbd16aaab014ddb44300" + ], + "inputs": [ + { + "uxid": "c603e99ceae4d15c20360714ee07ba6e3a944a97ea9285d164c23252e93958b6", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "d9dae1f82177f979b07016a341ed5c281ed6ed8eaa785a8a107ec16efbe541ef", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 150, + "block_seq": 31 + }, + "time": 1429021184, + "txn": { + "timestamp": 1429021184, + "length": 220, + "type": 0, + "txid": "9004c779cff67b3895500ec14b2c2e566127bb11a8af3358fe8a63dcfae9badc", + "inner_hash": "9e1eed08b004316812f4ad574f3d0f96959b2a335cdda77113abfd1673a8859d", + "fee": 60, + "sigs": [ + "6b3a3b3374c641ca252ee32cceab1b37c4c395b411e4d2515bc51f2a8ec12b9c440d25dee1b94a0231dd9492ab3e07c7a5dc054a0da987d6bf0ba6fc8de6f42000" + ], + "inputs": [ + { + "uxid": "18ea1b3cceb2ca40c01efc8f3cfd7d1d0dd69430ecdf655515aa4f8b21bd2644", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 78, + "calculated_hours": 78 + } + ], + "outputs": [ + { + "uxid": "64194899d317e2a007f89df14538795547e927c242a92f83180e6cc952304964", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "5.000000", + "hours": 9 + }, + { + "uxid": "569aa1260e734017c4eee06d84ab4a6285e2ca2041940b2915d9141527caf179", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "5.000000", + "hours": 9 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 149, + "block_seq": 32 + }, + "time": 1429021214, + "txn": { + "timestamp": 1429021214, + "length": 183, + "type": 0, + "txid": "327375203f20cb68847351c30a48597c0588a8c14319a4eb47bf440207fd045a", + "inner_hash": "217a070c0edd70fc0eaa7f858308444f32bbfe4b48e128b6fa876f60c4639bfb", + "fee": 8, + "sigs": [ + "de82c42e2523b512c0ffea3c91244dc905f59264f3c59e2f82efc3fdb7f446c728afb08bbc3478462cf25b96848da9dc4dd6b87cab569715ebd33e8102c552d101" + ], + "inputs": [ + { + "uxid": "64194899d317e2a007f89df14538795547e927c242a92f83180e6cc952304964", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "5.000000", + "hours": 9, + "calculated_hours": 9 + } + ], + "outputs": [ + { + "uxid": "eb446b8372559249c8e269b6cd028588e2e9e4f8fe9357719da9d1c22aa29911", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "5.000000", + "hours": 1 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 148, + "block_seq": 33 + }, + "time": 1429021674, + "txn": { + "timestamp": 1429021674, + "length": 280, + "type": 0, + "txid": "e89ee3e90e72108e4cd6ccb95c9f8d2b18ccfaa7ce61a7d297454debd69cebbf", + "inner_hash": "dac67377dd9d8247db41f3380288730de2e51514ec3a2986072719553b9f9e27", + "fee": 9, + "sigs": [ + "7df848876a507f4b2855818f059e62e6d2f5924af148607a0c6004b7231fdce920ac80e800a833e55cbce9938b5d8cb755b0dc434c22b03a5037972ff2d6444801", + "6499aeee3ba19247d1ef2d3ec13e46031adf0dd6a383785272776a93621f21696cf217b7375e5721e51133fc3d9806200d2aded757118fbe27a719ebf4ceaea001" + ], + "inputs": [ + { + "uxid": "569aa1260e734017c4eee06d84ab4a6285e2ca2041940b2915d9141527caf179", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "5.000000", + "hours": 9, + "calculated_hours": 9 + }, + { + "uxid": "eb446b8372559249c8e269b6cd028588e2e9e4f8fe9357719da9d1c22aa29911", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "5.000000", + "hours": 1, + "calculated_hours": 1 + } + ], + "outputs": [ + { + "uxid": "e702df2703c3de180f3e4a0e9a503bd534037c2d68e858e97a317575c5a97d95", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 1 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 147, + "block_seq": 34 + }, + "time": 1429021994, + "txn": { + "timestamp": 1429021994, + "length": 220, + "type": 0, + "txid": "08bf0f8f4a8547bcab1fef035adac2a66c80369b4485a736bdd676e782bbb037", + "inner_hash": "8fd6f4e5428c170dede16e8c02596ab0c490dd5c418d003d9232d8c2caedec9c", + "fee": 1, + "sigs": [ + "f68d819dbda0bbf7cd5e2de8088267c5b3a744bbe2d7737c7dc52060b6344a25180cc1081e5c7dadab94763d158e303f697d1d275685b32bfd1de123a376697501" + ], + "inputs": [ + { + "uxid": "e702df2703c3de180f3e4a0e9a503bd534037c2d68e858e97a317575c5a97d95", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 1, + "calculated_hours": 1 + } + ], + "outputs": [ + { + "uxid": "10998e83dc5dfe3c3f5f28ef3e5e2fced4dbd1da389678b0ea3ddb552851b6bf", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "6.000000", + "hours": 0 + }, + { + "uxid": "41c6d29aa5de770de684ab19b40bd75b99ec7f1a5ff7d15288ae4bfff568eabd", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "4.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 146, + "block_seq": 35 + }, + "time": 1429022034, + "txn": { + "timestamp": 1429022034, + "length": 183, + "type": 0, + "txid": "3170f0635cc40aded3a38f84f2ae07bd2238550ea4ee867328d0f891ea9abf14", + "inner_hash": "1cebcd96c2847d219b658733012921d6e10a6c55439736833dd0ae97b898f72a", + "fee": 0, + "sigs": [ + "179826a9f244005b2b34d145948b178533805953adff8ab924a6fd67538daaa4384d67a24473de6bb01d441e4d979e520b055cd9304188d00255eab7c04bf45701" + ], + "inputs": [ + { + "uxid": "10998e83dc5dfe3c3f5f28ef3e5e2fced4dbd1da389678b0ea3ddb552851b6bf", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "6.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "9e5779445f60d62b471862339d7a83dd8355c7a89d5fc3b751f98e9414628ec2", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "6.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 145, + "block_seq": 36 + }, + "time": 1429022064, + "txn": { + "timestamp": 1429022064, + "length": 280, + "type": 0, + "txid": "fba515a9eeaedb891c4dca862bd06108e0452270890b362f0b353b4c86845618", + "inner_hash": "3c24f665a7a02308fe6938ef3ce7e38dfe72644b1d71c5aefbe3d6844c609d58", + "fee": 0, + "sigs": [ + "faf14290ac158576f0dd4311ee4835a2542ae8b52d9ec7ab36d1af938a117f382c42855dec9b980f282e7ff8d7e19d469b084a7d44e38022e246c365368cc07d00", + "52cfd88d334818382413dfa45dd8e00a2136c352b7547dcf97894bf3eaa152cc5b10bf9f35c4dc8c75e7bb62543bd244a7c1de588b2a606aa1eb0b32c9c4ca1501" + ], + "inputs": [ + { + "uxid": "41c6d29aa5de770de684ab19b40bd75b99ec7f1a5ff7d15288ae4bfff568eabd", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "4.000000", + "hours": 0, + "calculated_hours": 0 + }, + { + "uxid": "9e5779445f60d62b471862339d7a83dd8355c7a89d5fc3b751f98e9414628ec2", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "6.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "d46e91fea3c8a6428885f941e5152dbc7f9abd356ad4d054bf20e0e806f1ec99", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 144, + "block_seq": 37 + }, + "time": 1429022094, + "txn": { + "timestamp": 1429022094, + "length": 183, + "type": 0, + "txid": "9fb039cd90a4e9b85669bd6ef878b98a9e84eec7d4804e2bff6f0dc9c2739c44", + "inner_hash": "5bc5636489d4ba7d36b4429cd3ec71491c9fa6f442fede1ea696428b574e0d13", + "fee": 0, + "sigs": [ + "3127749c2123db967563b9726cf5d6daa3ae755ec74f5e5fbc3dcfb10ececc231f5d61de693355aa5c8ade13c4c31ddc3bf9864e87139fdcd64c513702f7425600" + ], + "inputs": [ + { + "uxid": "d46e91fea3c8a6428885f941e5152dbc7f9abd356ad4d054bf20e0e806f1ec99", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "2987e7c89d353ad5d63cea2bf2724dc5f7a5ef5fb81f5ea160a307f0726ac2f5", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 135, + "block_seq": 46 + }, + "time": 1429077374, + "txn": { + "timestamp": 1429077374, + "length": 220, + "type": 0, + "txid": "0a2da0489b14156fad8fb863d051a4dac1f645f144c1e5bb65a44478623b8e4b", + "inner_hash": "787ae7cb222a23641bb33751d1428dc8e07a2f2cf11ee6293a54100836209d09", + "fee": 300354, + "sigs": [ + "9bc3b6d7cb1d66d52fc993d0799baafa1056992049fa86ce76d5909690e88c4a19920b69e2463cf34d1dddb545b61ee38fb2f9b33f92626da8afdd934c353c8e00" + ], + "inputs": [ + { + "uxid": "cb8efc0b1082c39258cb6efd59f64d88b36fcb60143c826829fc5f0ed5c0d668", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944790.000000", + "hours": 400470, + "calculated_hours": 400470 + } + ], + "outputs": [ + { + "uxid": "a6061defc41a8a55e37eaf56ebaa1177446f61719b1d5126698e79a6023f5367", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944780.000000", + "hours": 50058 + }, + { + "uxid": "a52408daa8ce7026c70b61d4df4212fb577462060f340bfce779225b3e18193d", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 50058 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 134, + "block_seq": 47 + }, + "time": 1429077384, + "txn": { + "timestamp": 1429077384, + "length": 220, + "type": 0, + "txid": "a4a202bc4431d95c307d151dea764bfc6d9ceb7e82b3eb50dc8604050622a22c", + "inner_hash": "836145a3e62a7e055acc3404c1fd6ecb237e3251e6f8b39fd526a7f48f21daa8", + "fee": 37544, + "sigs": [ + "f826793e63a3b0b837070e8876461c47af6be7a6898c370c70430b1491457cda76fc3b34e08bff41a336277ec1e93cc008f9c08ca295b418488b1ac92a5f5a4000" + ], + "inputs": [ + { + "uxid": "a6061defc41a8a55e37eaf56ebaa1177446f61719b1d5126698e79a6023f5367", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944780.000000", + "hours": 50058, + "calculated_hours": 50058 + } + ], + "outputs": [ + { + "uxid": "3b5f72e772ea886dd872b9087395398133576a6561072d5294fbcd04b49e1d95", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944770.000000", + "hours": 6257 + }, + { + "uxid": "dc73aac74348dd285a1456c1fae2204d7c2039d50a765bdaae0c31f7c7e059db", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 6257 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 133, + "block_seq": 48 + }, + "time": 1429077394, + "txn": { + "timestamp": 1429077394, + "length": 220, + "type": 0, + "txid": "4e6b363423633ad51114b250478ee7645fbd184066fa41c29e5b14d0728cdfec", + "inner_hash": "8cf88a9e5140d5e01af412c956b3de7c93bfebbb4c5993b9b0285812208f5b33", + "fee": 4693, + "sigs": [ + "670abb369c25a655b0f22c069a9523d439b8a03d122bc9f0861aff796ab965fd5e1b79812b6f458ebc0a1cd4cc223d0137eb22e1bf1cbb40265ac7301018897000" + ], + "inputs": [ + { + "uxid": "3b5f72e772ea886dd872b9087395398133576a6561072d5294fbcd04b49e1d95", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944770.000000", + "hours": 6257, + "calculated_hours": 6257 + } + ], + "outputs": [ + { + "uxid": "f265bea876ffcfb8cf64df3aca4dae4a8d7f424ff495d91fb322feddb3a7e505", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944760.000000", + "hours": 782 + }, + { + "uxid": "e4e375b9dc55ff53d6de9120f1a87ff00e00a779835f8320f2c6b3090d0466e6", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 782 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 132, + "block_seq": 49 + }, + "time": 1429077404, + "txn": { + "timestamp": 1429077404, + "length": 220, + "type": 0, + "txid": "edc27c6ecc1f76d0f23489ad7bbbdb8c653af37cc4b8f18197400aea2011ed83", + "inner_hash": "5432e686f984075091a8d3686d959b63ef620382fcb2b86794ba8dc0fb9656e7", + "fee": 588, + "sigs": [ + "c1902b37a95c5327b0e5a1f05de551d4135831b787c86562867344ee7f06235374dc1618c6b4a8e077041723bc731db72dab5554a808b1ba77d305309144bf5e01" + ], + "inputs": [ + { + "uxid": "f265bea876ffcfb8cf64df3aca4dae4a8d7f424ff495d91fb322feddb3a7e505", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944760.000000", + "hours": 782, + "calculated_hours": 782 + } + ], + "outputs": [ + { + "uxid": "e6d9b56e075a6adf520d1ae7fbab9ae06353ae0b93dc8cb17d82cc3628009a50", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944750.000000", + "hours": 97 + }, + { + "uxid": "d11b05345917d171f60c31bd2634041b73b97eae364724369ddb8d53369397fb", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 97 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 82, + "block_seq": 99 + }, + "time": 1429274616, + "txn": { + "timestamp": 1429274616, + "length": 571, + "type": 0, + "txid": "819106dc50373e5293a7e79f179693e85536e8206d82272930ec08410d92402a", + "inner_hash": "02e9a06b0ca7f91255107993e00f09e9ef983559088c5febff264c17952033c4", + "fee": 52573, + "sigs": [ + "efb713e6a1e5d328e94a51fbeb0f73e2a3b7a54e15db75797f0b709f698b16eb26e522f187a98144807e0e6cd294686ff19037975abb6d44b20b2899968954f400", + "b5d011c60020ce591a21db15823c06188515a63ca95d573c36b3af83d634fc6f1c1125db197f6283510ee33890ac168513254ad37524c77294bb5a12e8ff23f300", + "00d87b91eda33f627f6cd28cc673daf929fbec36e7bcfdf894f7491618a68b5755b5baadedc106d53d2da924fcbedbd106eadc50ec611d426720f67426c7286500", + "e64cf7e74363cfd381a3aa6fd17d7c415d6034b26b93017acaf9cf3475ccdffc53c3714d1d13409323cf77ccc81596f6e6edcec11d890979a436ef960bcb5f6900", + "fc2eb05241afdd15cdbd28cc7158d7eb4442f21a678c52332762b23ac6c2fcc76b0f79731987df0ba84d82044cd474d4cda9afda778a21b78a0659c5b588664301" + ], + "inputs": [ + { + "uxid": "2987e7c89d353ad5d63cea2bf2724dc5f7a5ef5fb81f5ea160a307f0726ac2f5", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 701 + }, + { + "uxid": "a52408daa8ce7026c70b61d4df4212fb577462060f340bfce779225b3e18193d", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 50058, + "calculated_hours": 50605 + }, + { + "uxid": "dc73aac74348dd285a1456c1fae2204d7c2039d50a765bdaae0c31f7c7e059db", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 6257, + "calculated_hours": 6804 + }, + { + "uxid": "e4e375b9dc55ff53d6de9120f1a87ff00e00a779835f8320f2c6b3090d0466e6", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 782, + "calculated_hours": 1329 + }, + { + "uxid": "d11b05345917d171f60c31bd2634041b73b97eae364724369ddb8d53369397fb", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 97, + "calculated_hours": 644 + } + ], + "outputs": [ + { + "uxid": "427462efeb07a6803f013c789ea43d93240f74f886bf9afd63dc1936a7574a37", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 7510 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 58, + "block_seq": 123 + }, + "time": 1429451746, + "txn": { + "timestamp": 1429451746, + "length": 220, + "type": 0, + "txid": "9003d3caba9587d46d000cc614bb52bed34adcc5ea404c560c986eb6dd756e6b", + "inner_hash": "2a87bcb0049b9971713a2e46b75b348785adca751b151290a411bfa5a0ed2287", + "fee": 35498, + "sigs": [ + "0da91c351fb050c243c7b587005bee14ccc2951897ffdf720ad9c757c5946e516a20ca0d92c5f84957161d10a74deab05a2b530ab5bbcd7ad01266213b5eb38401" + ], + "inputs": [ + { + "uxid": "998487775c0e58420673b70204b83c1d6bb5b70e34b1aa0f8169c85ecec2438e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "765600.000000", + "hours": 47330, + "calculated_hours": 47330 + } + ], + "outputs": [ + { + "uxid": "6fb116c110fe391448a1dcb985b67439c2e9a71d8bb2fd1cf345ac73ada6166a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "755600.000000", + "hours": 5916 + }, + { + "uxid": "8e764a87cee9f26b902f748c28a5a49de5c383e5f155129eec84474a3d0349cc", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10000.000000", + "hours": 5916 + } + ] + } + } +] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/address-transactions-ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/address-transactions-ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od.golden new file mode 100644 index 00000000..b7f686a4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/address-transactions-ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od.golden @@ -0,0 +1,633 @@ +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 180, + "block_seq": 1 + }, + "time": 1427926392, + "txn": { + "timestamp": 1427926392, + "length": 3846, + "type": 0, + "txid": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "inner_hash": "0f7019627886818d2501af189bbac18e21b8e959891c5b2726f89e29355aa10a", + "fee": 99999999999900, + "sigs": [ + "be602113fe288f750001ab65f254ceedd8b05b1becc456a0a52a0bea10b8280e38d950933992ad3265e1f81d197036fa634b316f08b3b319ffce081aa43f3bb600" + ], + "inputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000, + "calculated_hours": 100000000000000 + } + ], + "outputs": [ + { + "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "26f585cb96f35307f0af5b9aee004a29b7795695f4c5c836104e2fbbf429a3ce", + "dst": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "18a43b8b69bbf12a9e49e6f9783ba258397e6567301aeed9e901a1e4fed9fef9", + "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5a69ef09b5de21b117cac62141a8de4eade7558c42f0ba8b50996f5ec7867c5d", + "dst": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "aef761a12e3d0fa9c4a8db62b8bab1015c32931b7e3a7fc9a77282cec218f79d", + "dst": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "445a4082da251fa161e4705d115fe2018ca15a5f92e8a0950793405410e6be12", + "dst": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "dst": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "368a609ee90ca15bbbd297af07dc6705131764476d54bef641017ffcd0885e65", + "dst": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "13afe1586015c4d7312f89d123153279e4961eb0d53a4d036847d5d989ba90dc", + "dst": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f625cf04412199c16e073dbb500e66c23cfe69043578b4a2d879a329aac563ec", + "dst": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b2da50a08756c34d059a04812451cf3296f73ba87f8cca38473ac8f051ab6d1e", + "dst": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "135c28698e80e3b2a737d59c16c79684c3fb3ec5cec59f466a39f4ac3c73968e", + "dst": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "df63056cf3ae21efa86d241876ad0194387317585dc9e4fcd80954b47d59b57a", + "dst": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4628f4cfdbf1eb7cccc25d461c46cc29e90cffb5d6277e0de641f7701d60c308", + "dst": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "47e4706dc4d80a70b20c889476fb0627ca6d5bdaa790f4ceba44a689d31b2dcc", + "dst": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b64bc50d370a06df117eb543ca051239c985cfc4b6aa527c51b700de32c7fc41", + "dst": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "390bc4c045fa9f289957b7eca529bfadac96a7dd074bcfbdd3b09e99413b8202", + "dst": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6aa162f7fc09598c4dc8f5fab7fb2383f28c3840937a001acd9f37136e1691b2", + "dst": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e440cf4c896735d3299a871f988c134f404fb2065d1f20c87c9c9bc5fa582e09", + "dst": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "eea791e84a53e4d99485519c5d2c3146b0a2ad080cf92904ae7b28c2d9a6e3ca", + "dst": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "01048ad6a538256d9a8c6c9c6321ca1a01b31cbf08e74fd4ff0f141bf97eb8ce", + "dst": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc5f1f1ddc8cb23df3d42f1e5a1dda9d356846fe930ae4484bc1eeb1b3b2c95b", + "dst": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f03087245a6b64bb69cd5866a1887ae595a9e1a86e196754984840eaf6d3eb9c", + "dst": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "239bdba27dabd52f7450f7d8521c9a7e5ac74093ae3f6f2348bf40ac9a6db7a5", + "dst": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d60879e562b65f97d40bec7309d4490ba0a8c80e2349ecb2e3505aaa50ea1e47", + "dst": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "66e685901492c94942522c346759c711ee2e78a059ef274e77a6ab433409683c", + "dst": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b497992663f99f9902deaaf487b00655820003015ea92091628f4a6e8aeb5854", + "dst": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc40377012004566712fa860e74db97305091cc163e95435e04556c70d32f9c5", + "dst": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "73304622e33994bc2d4ade2cab78d28e1b65185e60ad3c781ecfb5cbc8159136", + "dst": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fed15e8506d0e0898510311850b8863ef6d9a499215ae8823a1e3fb9c8140ab2", + "dst": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "12034bc455d0821813d7eb9afed1ed1a8f19b6f29826ef4a057b4aa0b4228817", + "dst": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fc444cdb2598f44209a41ea20afdc9065ebe51b7cd5f65bb1c0f7a7b427ce7b1", + "dst": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "618d242d95d33e2d7316612a164d89859b85f1287f0d5bed4dcb561cf478f706", + "dst": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "07f70fd4108ef4d2fde3b85411728c1f7bd3a135d2062c5a30a46cc885463780", + "dst": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "af9bcf6ba63a08e699bc101aa362f135343aaf78a56e9f88d118fca0e1ce5c08", + "dst": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6b3530bb930ed10bbc4c307663aba4377c08443498a0a2cf023b1be72f378ae1", + "dst": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fd6da5199e528958e68ee8dd003b727d4d840754ea7c1e0c05e4f0e504c9b2cd", + "dst": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "131f07f5b40f365fb537b863e4aa5ef0efcd77b7fa2ff321d90eeb743ac43678", + "dst": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ffbdfdbf3427d04f445c33e867845bec1ee64a9dfe0d0fa8284547c2226fdfa9", + "dst": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b53c7188ebf4d630790ff63275679ba48009e31af6e4fe15806619216caa750", + "dst": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b4c6639b49402c2753f83c7fb7d3ffa65da74e47fef2b781933ff55b14d09bcd", + "dst": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c956289db079c00d2f80c590d3c8ca26c37da534fe5f65e799b3982ceca493c", + "dst": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "550d2a8d3047cdae0c05a61cc3de43e758b123a6955fa067d3ac375f7d0dbadc", + "dst": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78740d5bf49989936d315bf641949232aace582e03de57db8abff940f7d51bd1", + "dst": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9f2c83c5165826de1077f428ad39d41473e32ed64cd83180d49e7d8e5db996d0", + "dst": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "883be4d7173c235933294ab8dcae8cc76609166eaa1c1f07e9b51d551c979709", + "dst": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6384ed19650d384c29db4c3a39a1ca855058fab758075be2dee759dd9e6faae1", + "dst": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", + "dst": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c238e82f3a4beee1be7b5b464e8553404f6927d5ab93c3d649d362c01097782", + "dst": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dad4991bfa5c51eb176f28c1b3f86661e02579905e6e07c997df22004e06244a", + "dst": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4ba91512c168281f41d3934b927d0d86a3136a31cc345b635095928f8e5f013c", + "dst": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c416f5e604eeada9ae8e520a429d8f19d4230626769e7121007e01353730784f", + "dst": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7b8787fd4076c27d074d2a4761377a1aa26c843c432e3b7e6b0ebf1e29528188", + "dst": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "38f22b194f04d85a6b545b37df06195edeb8503798b229ddeaa946018150c05c", + "dst": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "246377a036ad5444bcd5f47ac9e55fec7c85fc40644df593038d360554a809f7", + "dst": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c6d5e543ff5f2c2526728d588fb21753db5b7e05b8b275aa5e9b24d29350afb0", + "dst": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "98e223e6e2240fef83082d3daa86e46f10e0c71f3f74489ba95db0951a166f53", + "dst": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c8971ca91f8e21c556f647940073db003f7dd5582ae55d4ebca602d5e8e91a6e", + "dst": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dfa7822c05f54116c9fc3b2cde1ecb4667f47a2d8771fe886e832c223cdc4e82", + "dst": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6d37c0c4b6fcbac1e53a46c9c2dc5d3c3b36312c53f25b2baacc785ea77a11f7", + "dst": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9ba5e31610f0545666f102465efa8caa48ad3fb5b8abd5ae802f4a71e3f7de3b", + "dst": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "3ca365aace71e24b04d6f2ffbf7171468c5e71783858c710cae539c5e43e0c0e", + "dst": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c858f2db2a20ac562d32f8fb2a3a11039849a6e44d2bec30befb2e173532a9a3", + "dst": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1550a76598693b950346397e0e825bbb2805edde38b0d0240e50050829b7b1dd", + "dst": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "466340ab7733abb23ab24d877c673fe089c273f11808fbbd6f33a91da92ee96c", + "dst": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "401d4c0c1060ebbb4b9fb3859c2eb47789f94086f4deb01234bf46f7cdc81247", + "dst": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2c0e3aa084f5fec45f99b3f125ce7d50c6da526ef5165df5f22ba603147c3fc2", + "dst": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2e724d83e35235c23c0bb16ae9b708a5bba3c23b186b05d4b8c606f6bb4b311", + "dst": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4f30eae8c49eb268fe364eaf5ee0788da6e2f6adc2f83cd82e96a4bfe98496f5", + "dst": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8753d5775c22477a8ef74eeebf61d7de30be702e70118f552cc18ad963ffe950", + "dst": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efa2007c561dcbf7c83a6bbdd2ef75e7cca76b05330a8b948ba0dd94dee949f7", + "dst": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b379d1b8ff0153c63ee69c40a7155b97fa42ab570f68ff847d457316c4d8ab9", + "dst": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cc84f93adce16699d9e84ef32f55333402431b58dc50c17084bcb8b33f382f88", + "dst": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f38f0760769c19075034f70b059abf4d1bfa6d01e1e8c369a99900ed1eaeca6d", + "dst": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8d55f76bb0b3dd222cf85a7193501c0f4071b446f56dbd1da355b1625993325a", + "dst": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efde499c7e4444bc602b7bf5ed50e95a18ce8ec9a06ba9d850a05bb7a25ecb3a", + "dst": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2a4d631d5dc90e397d85f13410d1a6d877dcaf592a0e2be2e727443ac74b5bd5", + "dst": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e936299a21240744f6edbab493449323f920bbe15dcf294463e5a2ace10f27b0", + "dst": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "44e17f4bd29411a1614457171c06183e364bf6ff80a201717b2dfc0748e9ebe3", + "dst": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1941e5cc5e38dd92427580af699b1f410be7b29ff17d3d0ff3d046bfba0aaabf", + "dst": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ff6c0f27fcf92f3b4a3871b801c3116847fe47a7e3bafcadd4855d06012091ad", + "dst": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cd6c4b785e60757fad0e6fd4874b729ea7703fe7ee9560e1283d2eb71fc75321", + "dst": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "745eaff456a390c3868742a039e72c2a93ff8eee10417dbe848d533b89facc04", + "dst": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2f3f050c9ef31bf5c3b14c1c71699c4f4b38aa18479531194d12e6277416516", + "dst": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0b95850edabed70762768ac1695c5d7f230cccaa8de06657cda42cafba36374f", + "dst": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7c767d3a06db1ac0e1809ebe29a7d9689143259f4651837de54423e287c20490", + "dst": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78b07e8fe1366e173f2eeb75c35cd53baf0f6100de50ae12b4ffe7d0d7ba4298", + "dst": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5010eb25f6e1ed725fb901ae1e945e545ae846d7be8a135333d2d41102c33328", + "dst": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "178a33e64826cd2039b8538b74e6de513966acab45ab79d77dc9392018a65ffb", + "dst": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "044dc539d063250dc654b2bf0986a9044b4eea05e1284c11a2b313acd8dc3498", + "dst": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9fd5ea38f383291566def44b6fb932414f97123952578fe0cfb9a30eb075a099", + "dst": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "be5930e9cc35801433bcd21db84da7d4f1d8e744feca16a2c6fb00c81ce93e51", + "dst": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8cd999cd193d315e5f1c6f74c230c12e6abe6847924f6e89d988e09ca413f52e", + "dst": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0cff53628eb0e984c134b68cbe4b1bb7721a05adaa32e93b9df489a9a7a176cf", + "dst": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "a5ef046e84be9ff2485dde49afe6073811286761afac3bbd588b6e4130930479", + "dst": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cdee5f84c4f08098ac740e3a260ced14c1e199e126aa5291ec079b281a7dc407", + "dst": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6a24135f8496e7a37dcf7164218bb3aa530319f3b2bf3c7a1a9cc1bd17831328", + "dst": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "693c7f970b34ce5882e62430f4c9c28957159a257d27d4e21a61fd95c6b97464", + "dst": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c008a613cef129c180dbcc7213f2d41a14d245d06a3844d63d9beac963145385", + "dst": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "439cdfd03972fb4bb5da54208cf8098ee78228c487ce9e84623f5f83e17a7d68", + "dst": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "hours": 1 + } + ] + } + } +] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/address-transactions-R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/address-transactions-R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ.golden new file mode 100644 index 00000000..fcb48875 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/address-transactions-R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ.golden @@ -0,0 +1,7192 @@ +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 1 + }, + "time": 1427926392, + "txn": { + "timestamp": 1427926392, + "length": 3846, + "type": 0, + "txid": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "inner_hash": "0f7019627886818d2501af189bbac18e21b8e959891c5b2726f89e29355aa10a", + "fee": 99999999999900, + "sigs": [ + "be602113fe288f750001ab65f254ceedd8b05b1becc456a0a52a0bea10b8280e38d950933992ad3265e1f81d197036fa634b316f08b3b319ffce081aa43f3bb600" + ], + "inputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000, + "calculated_hours": 100000000000000 + } + ], + "outputs": [ + { + "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "26f585cb96f35307f0af5b9aee004a29b7795695f4c5c836104e2fbbf429a3ce", + "dst": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "18a43b8b69bbf12a9e49e6f9783ba258397e6567301aeed9e901a1e4fed9fef9", + "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5a69ef09b5de21b117cac62141a8de4eade7558c42f0ba8b50996f5ec7867c5d", + "dst": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "aef761a12e3d0fa9c4a8db62b8bab1015c32931b7e3a7fc9a77282cec218f79d", + "dst": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "445a4082da251fa161e4705d115fe2018ca15a5f92e8a0950793405410e6be12", + "dst": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "dst": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "368a609ee90ca15bbbd297af07dc6705131764476d54bef641017ffcd0885e65", + "dst": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "13afe1586015c4d7312f89d123153279e4961eb0d53a4d036847d5d989ba90dc", + "dst": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f625cf04412199c16e073dbb500e66c23cfe69043578b4a2d879a329aac563ec", + "dst": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b2da50a08756c34d059a04812451cf3296f73ba87f8cca38473ac8f051ab6d1e", + "dst": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "135c28698e80e3b2a737d59c16c79684c3fb3ec5cec59f466a39f4ac3c73968e", + "dst": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "df63056cf3ae21efa86d241876ad0194387317585dc9e4fcd80954b47d59b57a", + "dst": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4628f4cfdbf1eb7cccc25d461c46cc29e90cffb5d6277e0de641f7701d60c308", + "dst": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "47e4706dc4d80a70b20c889476fb0627ca6d5bdaa790f4ceba44a689d31b2dcc", + "dst": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b64bc50d370a06df117eb543ca051239c985cfc4b6aa527c51b700de32c7fc41", + "dst": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "390bc4c045fa9f289957b7eca529bfadac96a7dd074bcfbdd3b09e99413b8202", + "dst": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6aa162f7fc09598c4dc8f5fab7fb2383f28c3840937a001acd9f37136e1691b2", + "dst": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e440cf4c896735d3299a871f988c134f404fb2065d1f20c87c9c9bc5fa582e09", + "dst": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "eea791e84a53e4d99485519c5d2c3146b0a2ad080cf92904ae7b28c2d9a6e3ca", + "dst": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "01048ad6a538256d9a8c6c9c6321ca1a01b31cbf08e74fd4ff0f141bf97eb8ce", + "dst": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc5f1f1ddc8cb23df3d42f1e5a1dda9d356846fe930ae4484bc1eeb1b3b2c95b", + "dst": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f03087245a6b64bb69cd5866a1887ae595a9e1a86e196754984840eaf6d3eb9c", + "dst": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "239bdba27dabd52f7450f7d8521c9a7e5ac74093ae3f6f2348bf40ac9a6db7a5", + "dst": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d60879e562b65f97d40bec7309d4490ba0a8c80e2349ecb2e3505aaa50ea1e47", + "dst": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "66e685901492c94942522c346759c711ee2e78a059ef274e77a6ab433409683c", + "dst": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b497992663f99f9902deaaf487b00655820003015ea92091628f4a6e8aeb5854", + "dst": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc40377012004566712fa860e74db97305091cc163e95435e04556c70d32f9c5", + "dst": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "73304622e33994bc2d4ade2cab78d28e1b65185e60ad3c781ecfb5cbc8159136", + "dst": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fed15e8506d0e0898510311850b8863ef6d9a499215ae8823a1e3fb9c8140ab2", + "dst": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "12034bc455d0821813d7eb9afed1ed1a8f19b6f29826ef4a057b4aa0b4228817", + "dst": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fc444cdb2598f44209a41ea20afdc9065ebe51b7cd5f65bb1c0f7a7b427ce7b1", + "dst": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "618d242d95d33e2d7316612a164d89859b85f1287f0d5bed4dcb561cf478f706", + "dst": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "07f70fd4108ef4d2fde3b85411728c1f7bd3a135d2062c5a30a46cc885463780", + "dst": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "af9bcf6ba63a08e699bc101aa362f135343aaf78a56e9f88d118fca0e1ce5c08", + "dst": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6b3530bb930ed10bbc4c307663aba4377c08443498a0a2cf023b1be72f378ae1", + "dst": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fd6da5199e528958e68ee8dd003b727d4d840754ea7c1e0c05e4f0e504c9b2cd", + "dst": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "131f07f5b40f365fb537b863e4aa5ef0efcd77b7fa2ff321d90eeb743ac43678", + "dst": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ffbdfdbf3427d04f445c33e867845bec1ee64a9dfe0d0fa8284547c2226fdfa9", + "dst": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b53c7188ebf4d630790ff63275679ba48009e31af6e4fe15806619216caa750", + "dst": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b4c6639b49402c2753f83c7fb7d3ffa65da74e47fef2b781933ff55b14d09bcd", + "dst": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c956289db079c00d2f80c590d3c8ca26c37da534fe5f65e799b3982ceca493c", + "dst": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "550d2a8d3047cdae0c05a61cc3de43e758b123a6955fa067d3ac375f7d0dbadc", + "dst": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78740d5bf49989936d315bf641949232aace582e03de57db8abff940f7d51bd1", + "dst": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9f2c83c5165826de1077f428ad39d41473e32ed64cd83180d49e7d8e5db996d0", + "dst": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "883be4d7173c235933294ab8dcae8cc76609166eaa1c1f07e9b51d551c979709", + "dst": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6384ed19650d384c29db4c3a39a1ca855058fab758075be2dee759dd9e6faae1", + "dst": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", + "dst": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c238e82f3a4beee1be7b5b464e8553404f6927d5ab93c3d649d362c01097782", + "dst": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dad4991bfa5c51eb176f28c1b3f86661e02579905e6e07c997df22004e06244a", + "dst": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4ba91512c168281f41d3934b927d0d86a3136a31cc345b635095928f8e5f013c", + "dst": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c416f5e604eeada9ae8e520a429d8f19d4230626769e7121007e01353730784f", + "dst": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7b8787fd4076c27d074d2a4761377a1aa26c843c432e3b7e6b0ebf1e29528188", + "dst": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "38f22b194f04d85a6b545b37df06195edeb8503798b229ddeaa946018150c05c", + "dst": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "246377a036ad5444bcd5f47ac9e55fec7c85fc40644df593038d360554a809f7", + "dst": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c6d5e543ff5f2c2526728d588fb21753db5b7e05b8b275aa5e9b24d29350afb0", + "dst": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "98e223e6e2240fef83082d3daa86e46f10e0c71f3f74489ba95db0951a166f53", + "dst": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c8971ca91f8e21c556f647940073db003f7dd5582ae55d4ebca602d5e8e91a6e", + "dst": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dfa7822c05f54116c9fc3b2cde1ecb4667f47a2d8771fe886e832c223cdc4e82", + "dst": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6d37c0c4b6fcbac1e53a46c9c2dc5d3c3b36312c53f25b2baacc785ea77a11f7", + "dst": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9ba5e31610f0545666f102465efa8caa48ad3fb5b8abd5ae802f4a71e3f7de3b", + "dst": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "3ca365aace71e24b04d6f2ffbf7171468c5e71783858c710cae539c5e43e0c0e", + "dst": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c858f2db2a20ac562d32f8fb2a3a11039849a6e44d2bec30befb2e173532a9a3", + "dst": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1550a76598693b950346397e0e825bbb2805edde38b0d0240e50050829b7b1dd", + "dst": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "466340ab7733abb23ab24d877c673fe089c273f11808fbbd6f33a91da92ee96c", + "dst": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "401d4c0c1060ebbb4b9fb3859c2eb47789f94086f4deb01234bf46f7cdc81247", + "dst": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2c0e3aa084f5fec45f99b3f125ce7d50c6da526ef5165df5f22ba603147c3fc2", + "dst": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2e724d83e35235c23c0bb16ae9b708a5bba3c23b186b05d4b8c606f6bb4b311", + "dst": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4f30eae8c49eb268fe364eaf5ee0788da6e2f6adc2f83cd82e96a4bfe98496f5", + "dst": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8753d5775c22477a8ef74eeebf61d7de30be702e70118f552cc18ad963ffe950", + "dst": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efa2007c561dcbf7c83a6bbdd2ef75e7cca76b05330a8b948ba0dd94dee949f7", + "dst": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b379d1b8ff0153c63ee69c40a7155b97fa42ab570f68ff847d457316c4d8ab9", + "dst": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cc84f93adce16699d9e84ef32f55333402431b58dc50c17084bcb8b33f382f88", + "dst": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f38f0760769c19075034f70b059abf4d1bfa6d01e1e8c369a99900ed1eaeca6d", + "dst": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8d55f76bb0b3dd222cf85a7193501c0f4071b446f56dbd1da355b1625993325a", + "dst": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efde499c7e4444bc602b7bf5ed50e95a18ce8ec9a06ba9d850a05bb7a25ecb3a", + "dst": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2a4d631d5dc90e397d85f13410d1a6d877dcaf592a0e2be2e727443ac74b5bd5", + "dst": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e936299a21240744f6edbab493449323f920bbe15dcf294463e5a2ace10f27b0", + "dst": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "44e17f4bd29411a1614457171c06183e364bf6ff80a201717b2dfc0748e9ebe3", + "dst": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1941e5cc5e38dd92427580af699b1f410be7b29ff17d3d0ff3d046bfba0aaabf", + "dst": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ff6c0f27fcf92f3b4a3871b801c3116847fe47a7e3bafcadd4855d06012091ad", + "dst": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cd6c4b785e60757fad0e6fd4874b729ea7703fe7ee9560e1283d2eb71fc75321", + "dst": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "745eaff456a390c3868742a039e72c2a93ff8eee10417dbe848d533b89facc04", + "dst": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2f3f050c9ef31bf5c3b14c1c71699c4f4b38aa18479531194d12e6277416516", + "dst": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0b95850edabed70762768ac1695c5d7f230cccaa8de06657cda42cafba36374f", + "dst": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7c767d3a06db1ac0e1809ebe29a7d9689143259f4651837de54423e287c20490", + "dst": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78b07e8fe1366e173f2eeb75c35cd53baf0f6100de50ae12b4ffe7d0d7ba4298", + "dst": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5010eb25f6e1ed725fb901ae1e945e545ae846d7be8a135333d2d41102c33328", + "dst": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "178a33e64826cd2039b8538b74e6de513966acab45ab79d77dc9392018a65ffb", + "dst": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "044dc539d063250dc654b2bf0986a9044b4eea05e1284c11a2b313acd8dc3498", + "dst": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9fd5ea38f383291566def44b6fb932414f97123952578fe0cfb9a30eb075a099", + "dst": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "be5930e9cc35801433bcd21db84da7d4f1d8e744feca16a2c6fb00c81ce93e51", + "dst": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8cd999cd193d315e5f1c6f74c230c12e6abe6847924f6e89d988e09ca413f52e", + "dst": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0cff53628eb0e984c134b68cbe4b1bb7721a05adaa32e93b9df489a9a7a176cf", + "dst": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "a5ef046e84be9ff2485dde49afe6073811286761afac3bbd588b6e4130930479", + "dst": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cdee5f84c4f08098ac740e3a260ced14c1e199e126aa5291ec079b281a7dc407", + "dst": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6a24135f8496e7a37dcf7164218bb3aa530319f3b2bf3c7a1a9cc1bd17831328", + "dst": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "693c7f970b34ce5882e62430f4c9c28957159a257d27d4e21a61fd95c6b97464", + "dst": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c008a613cef129c180dbcc7213f2d41a14d245d06a3844d63d9beac963145385", + "dst": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "439cdfd03972fb4bb5da54208cf8098ee78228c487ce9e84623f5f83e17a7d68", + "dst": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "hours": 1 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 2 + }, + "time": 1427927651, + "txn": { + "timestamp": 1427927651, + "length": 220, + "type": 0, + "txid": "312a269b8248e389c61571cc13f4ad13b7d53b64853d990ddc301a58e7071889", + "inner_hash": "4daff2831f5bc2877a98a49b0ef75f8ff01bcb35082fd4018c77707dfca31849", + "fee": 0, + "sigs": [ + "f4482e0781e0d94c8c4773940e1f811405681844a9dc3c1938243442e1cbd5463d5e251880abbf8ff1ed85b4b2659e83ee30f06cc4c5dc9913aa6a9630fbe3de01" + ], + "inputs": [ + { + "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1 + } + ], + "outputs": [ + { + "uxid": "0cd548e03bd13bca8647cd13f6baef0c65fd03081aeb6dc3695536e5bc6018ae", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999990.000000", + "hours": 1 + }, + { + "uxid": "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 3 + }, + "time": 1427927671, + "txn": { + "timestamp": 1427927671, + "length": 183, + "type": 0, + "txid": "a6a709e9388a4d67a47d262b11da5f804eddd9d67acc4a3e450f7a567bdc1619", + "inner_hash": "ea6adee3180c7f9d73d1e693822d5d1c2bba85067f89a873355bc771a078faa1", + "fee": 0, + "sigs": [ + "ce8fd47e2044ed17998f92621e90329f673a746c802d67f639ca083705dd199f6ee346781497b44132434922879244d819694b5903093f784570c55d293ab4af01" + ], + "inputs": [ + { + "uxid": "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 4 + }, + "time": 1428793611, + "txn": { + "timestamp": 1428793611, + "length": 220, + "type": 0, + "txid": "c24b92898381fbebe59a457924184f4cce1e7166e140ca75aea5baf854c1ab75", + "inner_hash": "43dd65d5644ec5214a901ac94e530cbedb83d2174cf402c7b24697cfe55e1de7", + "fee": 1852, + "sigs": [ + "434a7a0b624fda393c1caa57ac9787f69da3d8854d0ec6f69f0da1c96c9b683d787064b644e9ac3dd4dd8466c22c1547cff89c2552420f5efcfd1eacb1a2eac301" + ], + "inputs": [ + { + "uxid": "0cd548e03bd13bca8647cd13f6baef0c65fd03081aeb6dc3695536e5bc6018ae", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999990.000000", + "hours": 1, + "calculated_hours": 5556 + } + ], + "outputs": [ + { + "uxid": "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999980.000000", + "hours": 3704 + }, + { + "uxid": "98b3e6e6d4ed36159b7dbf5f305174fc0c255d2d97528b35a67d50b9968e2b2f", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 5 + }, + "time": 1428798821, + "txn": { + "timestamp": 1428798821, + "length": 317, + "type": 0, + "txid": "0579e7727627cd9815a8a8b5e1df86124f45a4132cc0dbd00d2f110e4f409b69", + "inner_hash": "fe123ca954a82bb1ce2cc9ef9c56d6b649a4cbaf5b17394b0ffda651ed32327e", + "fee": 2036, + "sigs": [ + "056ed0f74367fb1370d7e98689953983d9cf34eb6669854f1645c8a16c93d85075661e7d4f6df0ce5ca8eb9852eff6a12fbac2caafee03bb8c616f847c61416800", + "8aaa7f320a7b01169d3217a600100cb27c55e4ce56cd3455814f56d8e4e65be746e0e20e776087af6f19361f0b898edc2123a5f9bd35d24ef8b8669ca85b142601" + ], + "inputs": [ + { + "uxid": "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 2405 + }, + { + "uxid": "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999980.000000", + "hours": 3704, + "calculated_hours": 3704 + } + ], + "outputs": [ + { + "uxid": "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999890.000000", + "hours": 4073 + }, + { + "uxid": "dc63c680f408c4e646037966189383a5d50eda34e666c2a0c75c0c6bf13b71a1", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "100.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 17 + }, + "time": 1428989855, + "txn": { + "timestamp": 1428989855, + "length": 220, + "type": 0, + "txid": "d952ef4cc45a89c14230ba0f7e30b782fad83cb6506ac0f503a242c568c1287a", + "inner_hash": "8fc48920982066fd4c69e2d2c0c5239cca7c296f0e3ad30e9b976c1230967478", + "fee": 2020394, + "sigs": [ + "b7eb93bcebb6df3dcad48afd66dd60bd42b1fbcdf52aa5e0c7e455e791f64a976fa416534b4e08bf3e62a2df83e13754119634c4255dd1e2e08be447d4d5b47201" + ], + "inputs": [ + { + "uxid": "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999890.000000", + "hours": 4073, + "calculated_hours": 6061184 + } + ], + "outputs": [ + { + "uxid": "4168b9378363cd81939e667cf78055d35a60d3101f5f9e3d2ae709e3981e29fc", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 4040790 + }, + { + "uxid": "c603e99ceae4d15c20360714ee07ba6e3a944a97ea9285d164c23252e93958b6", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 18 + }, + "time": 1428989925, + "txn": { + "timestamp": 1428989925, + "length": 183, + "type": 0, + "txid": "686db0a8cd429970bb91163033703410d4750c86ba485709fe1a3faabbbb42f6", + "inner_hash": "76732ac6a9936242193011d78a0f2849529aee767a569c9c6bb25b3bbae15cee", + "fee": 0, + "sigs": [ + "d74dcfdc8401a29b1dccc728b40b6b79faea147c65b4a859063ad77cc63aa9a62417c63b91b94678b6656fdba2f242d836b6914e77d244fbd16aaab014ddb44300" + ], + "inputs": [ + { + "uxid": "c603e99ceae4d15c20360714ee07ba6e3a944a97ea9285d164c23252e93958b6", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "d9dae1f82177f979b07016a341ed5c281ed6ed8eaa785a8a107ec16efbe541ef", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 26 + }, + "time": 1429011077, + "txn": { + "timestamp": 1429011077, + "length": 317, + "type": 0, + "txid": "56e7bd13dc4c6e1cd80aba66a0a9fed650d0646659ac774e3f1b415848755d85", + "inner_hash": "2894cfa31c21eb04c33f89263aa1e4caae625ceaf30539b82b39ccf79dffa816", + "fee": 3407635, + "sigs": [ + "6aedcd617e69aab9724b6a52e0e71f4f087a2fa84a283ac685c17e274b49cf617e58dbbd6c45a8e2c1c31832a1193ba119f0cb238fd83b9d7eb029dcedbeba0800", + "f1f26b84f247c409d308bf0992c2a044ce649fc09169d5fe4843f22b855f911d6c73b92f679346d30ec6663aa5d0387189935ce8e2f2256dd13e59cbdae7b89e00" + ], + "inputs": [ + { + "uxid": "4168b9378363cd81939e667cf78055d35a60d3101f5f9e3d2ae709e3981e29fc", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 4040790, + "calculated_hours": 4543507 + }, + { + "uxid": "d9dae1f82177f979b07016a341ed5c281ed6ed8eaa785a8a107ec16efbe541ef", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 4 + } + ], + "outputs": [ + { + "uxid": "8793a3782bf673393a8f909f267f3bfcc713b600460893b571fd55f675ac65ba", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 567938 + }, + { + "uxid": "339aeec109a26bab65e618d73ebba16e5b8fc18f7dc1fe502ca891ad5b0f4d5f", + "dst": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", + "coins": "10.000000", + "hours": 567938 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 27 + }, + "time": 1429011137, + "txn": { + "timestamp": 1429011137, + "length": 220, + "type": 0, + "txid": "cff53a059d55f2c90f6dd7ce7de2cc07cbdbd50b25867cba0f41cd0192614d0d", + "inner_hash": "09382455a4e78c62bd0c254e106d349f648944c3747b066a23cc64d9392c6c05", + "fee": 425954, + "sigs": [ + "ade8874855f58653ef198e005a7ec82de992cddb50a4bb5ce8a0ec1cfa7b44086883ad1c85c63128dad5426b8b22873c349e0535191b80b3e92035b120cada7a01" + ], + "inputs": [ + { + "uxid": "8793a3782bf673393a8f909f267f3bfcc713b600460893b571fd55f675ac65ba", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 567938, + "calculated_hours": 567938 + } + ], + "outputs": [ + { + "uxid": "ad742bbc7420c08881e6ccf35e34e8472c0dd6386792359aedcfb752ca618c33", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999790.000000", + "hours": 70992 + }, + { + "uxid": "3e475e76c226a70c87d030d8fc6b8b1c2cc654ba9eaf3bed08be5bd603aec0b7", + "dst": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", + "coins": "90.000000", + "hours": 70992 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 38 + }, + "time": 1429058484, + "txn": { + "timestamp": 1429058484, + "length": 220, + "type": 0, + "txid": "a76cd63b71f1f5425941cd567627e1dcdc8c34306a7945ea48755f5a46efb6f5", + "inner_hash": "39c3ed7f2dfb26d02c9fcbbe853db5c3031644b4a66844a717d8795c6d954d65", + "fee": 2335473, + "sigs": [ + "844af158e935a38f034778a78b646a167b5758df65212546f2eb1c7e838216ad7aa6e7571d1e81d8836808d4315846fe97489bdf2e6d2159a2af77a15a9a2bcb00" + ], + "inputs": [ + { + "uxid": "ad742bbc7420c08881e6ccf35e34e8472c0dd6386792359aedcfb752ca618c33", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999790.000000", + "hours": 70992, + "calculated_hours": 3113963 + } + ], + "outputs": [ + { + "uxid": "108520145179c00f581d91e273714811fe6e82ee059d65218eea91154ebd8205", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "998790.000000", + "hours": 389245 + }, + { + "uxid": "f48432d381a10abecbd1357d81705ea922246e92170fe405d1a4a35c5ceef6a4", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "1000.000000", + "hours": 389245 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 39 + }, + "time": 1429058494, + "txn": { + "timestamp": 1429058494, + "length": 220, + "type": 0, + "txid": "c38b47bd576e3bced2a9309c3df7622064e71177f54020d77193d5cac310719c", + "inner_hash": "7f02ba6476946668f3adcbb35e113531e6788cee4fe94bf8d8da4803e3baa7e3", + "fee": 291935, + "sigs": [ + "2a31eb55da895c59654ad3f1a11efa11b04787ab78dcf8221aeeccf137adec543765f761363390c97f429310fcb39db305494a94b30af906a2d43d5de1effbb701" + ], + "inputs": [ + { + "uxid": "108520145179c00f581d91e273714811fe6e82ee059d65218eea91154ebd8205", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "998790.000000", + "hours": 389245, + "calculated_hours": 389245 + } + ], + "outputs": [ + { + "uxid": "e79c94aa7013c7611901839236b8a1cdf70e8ef7c40b9e33f99359136de981d6", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "988790.000000", + "hours": 48655 + }, + { + "uxid": "df5d6e09da2585a6ac1a37aea2370fa25e9049b549049202d5417138bf033cfa", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "10000.000000", + "hours": 48655 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 40 + }, + "time": 1429058514, + "txn": { + "timestamp": 1429058514, + "length": 220, + "type": 0, + "txid": "b56f3e9239da5c5f9bb5ca80226b8454ba36ce6012f8e323a50c9d9c4eb4a834", + "inner_hash": "bdcf8f2f2b960cfee6b3b1124a554ef4747fe43ac9452d897bd8dedcd643e1ae", + "fee": 36493, + "sigs": [ + "809029f12d5f38906306610feae26c0623bffe63218c8019060ae2d164cc29352066efd20567e3c37837230e74b481730b0fc71bcafe3b3b9f5eb4a7fb42f69101" + ], + "inputs": [ + { + "uxid": "e79c94aa7013c7611901839236b8a1cdf70e8ef7c40b9e33f99359136de981d6", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "988790.000000", + "hours": 48655, + "calculated_hours": 48655 + } + ], + "outputs": [ + { + "uxid": "c65a9e6aa33244958e9595e9eceed678f9f17761753bf77000c5474f7696da53", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "978790.000000", + "hours": 6081 + }, + { + "uxid": "f8ad5c72e7822c7ac9a1dce8de583e34f6f830052bc0a02d749e9e81790dae86", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "10000.000000", + "hours": 6081 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 41 + }, + "time": 1429058524, + "txn": { + "timestamp": 1429058524, + "length": 220, + "type": 0, + "txid": "cf4fe76a08e3296b6f6abdb949604409be66574f211d9d14fde39103c4cfe1d6", + "inner_hash": "2f5942207104d52dbd6191684b2a97392e616b7fa51dde314dbddd58d34b8027", + "fee": 4561, + "sigs": [ + "b2b8c8ec1e1dfdeac4690e88d4ef9fcc4b52fcb771153f391cbcb58d651505a94c6263b6dc15a948c0396c0d8be20d9e0d1993b494bd9189c778d3673363bfc401" + ], + "inputs": [ + { + "uxid": "c65a9e6aa33244958e9595e9eceed678f9f17761753bf77000c5474f7696da53", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "978790.000000", + "hours": 6081, + "calculated_hours": 6081 + } + ], + "outputs": [ + { + "uxid": "195f5e50b4eed1ec7ff968feca90356285437adc8ccfcf6623b55a4eebf7bbb5", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "969790.000000", + "hours": 760 + }, + { + "uxid": "6bbf13da052e1baade111ae8bb85548732532c8f5286eba8345d436d315d1c93", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "9000.000000", + "hours": 760 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 45 + }, + "time": 1429071074, + "txn": { + "timestamp": 1429071074, + "length": 220, + "type": 0, + "txid": "df622e8c9dfaed1d7dca83ad7f6d8946bb86b81398bad521d858cbefef8e4688", + "inner_hash": "91ab4f29d84e9ffba56a108e01984e7b483729da4e61b6976c018fa11ace36a8", + "fee": 2402820, + "sigs": [ + "d0726d81cb1cdce6028668d0d95ceccf39cc9d655a7bff143573b9f52d0586232bbb7bd494df8b9bb5155a271446cfaff1550d5ccf314dd35f044226f98d14e201" + ], + "inputs": [ + { + "uxid": "195f5e50b4eed1ec7ff968feca90356285437adc8ccfcf6623b55a4eebf7bbb5", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "969790.000000", + "hours": 760, + "calculated_hours": 3203760 + } + ], + "outputs": [ + { + "uxid": "cb8efc0b1082c39258cb6efd59f64d88b36fcb60143c826829fc5f0ed5c0d668", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944790.000000", + "hours": 400470 + }, + { + "uxid": "4aca4c715985da352bd9aa84787868dac4f4e305c420fe79e6f05acee3bba14a", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "25000.000000", + "hours": 400470 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 46 + }, + "time": 1429077374, + "txn": { + "timestamp": 1429077374, + "length": 220, + "type": 0, + "txid": "0a2da0489b14156fad8fb863d051a4dac1f645f144c1e5bb65a44478623b8e4b", + "inner_hash": "787ae7cb222a23641bb33751d1428dc8e07a2f2cf11ee6293a54100836209d09", + "fee": 300354, + "sigs": [ + "9bc3b6d7cb1d66d52fc993d0799baafa1056992049fa86ce76d5909690e88c4a19920b69e2463cf34d1dddb545b61ee38fb2f9b33f92626da8afdd934c353c8e00" + ], + "inputs": [ + { + "uxid": "cb8efc0b1082c39258cb6efd59f64d88b36fcb60143c826829fc5f0ed5c0d668", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944790.000000", + "hours": 400470, + "calculated_hours": 400470 + } + ], + "outputs": [ + { + "uxid": "a6061defc41a8a55e37eaf56ebaa1177446f61719b1d5126698e79a6023f5367", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944780.000000", + "hours": 50058 + }, + { + "uxid": "a52408daa8ce7026c70b61d4df4212fb577462060f340bfce779225b3e18193d", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 50058 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 47 + }, + "time": 1429077384, + "txn": { + "timestamp": 1429077384, + "length": 220, + "type": 0, + "txid": "a4a202bc4431d95c307d151dea764bfc6d9ceb7e82b3eb50dc8604050622a22c", + "inner_hash": "836145a3e62a7e055acc3404c1fd6ecb237e3251e6f8b39fd526a7f48f21daa8", + "fee": 37544, + "sigs": [ + "f826793e63a3b0b837070e8876461c47af6be7a6898c370c70430b1491457cda76fc3b34e08bff41a336277ec1e93cc008f9c08ca295b418488b1ac92a5f5a4000" + ], + "inputs": [ + { + "uxid": "a6061defc41a8a55e37eaf56ebaa1177446f61719b1d5126698e79a6023f5367", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944780.000000", + "hours": 50058, + "calculated_hours": 50058 + } + ], + "outputs": [ + { + "uxid": "3b5f72e772ea886dd872b9087395398133576a6561072d5294fbcd04b49e1d95", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944770.000000", + "hours": 6257 + }, + { + "uxid": "dc73aac74348dd285a1456c1fae2204d7c2039d50a765bdaae0c31f7c7e059db", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 6257 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 48 + }, + "time": 1429077394, + "txn": { + "timestamp": 1429077394, + "length": 220, + "type": 0, + "txid": "4e6b363423633ad51114b250478ee7645fbd184066fa41c29e5b14d0728cdfec", + "inner_hash": "8cf88a9e5140d5e01af412c956b3de7c93bfebbb4c5993b9b0285812208f5b33", + "fee": 4693, + "sigs": [ + "670abb369c25a655b0f22c069a9523d439b8a03d122bc9f0861aff796ab965fd5e1b79812b6f458ebc0a1cd4cc223d0137eb22e1bf1cbb40265ac7301018897000" + ], + "inputs": [ + { + "uxid": "3b5f72e772ea886dd872b9087395398133576a6561072d5294fbcd04b49e1d95", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944770.000000", + "hours": 6257, + "calculated_hours": 6257 + } + ], + "outputs": [ + { + "uxid": "f265bea876ffcfb8cf64df3aca4dae4a8d7f424ff495d91fb322feddb3a7e505", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944760.000000", + "hours": 782 + }, + { + "uxid": "e4e375b9dc55ff53d6de9120f1a87ff00e00a779835f8320f2c6b3090d0466e6", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 782 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 49 + }, + "time": 1429077404, + "txn": { + "timestamp": 1429077404, + "length": 220, + "type": 0, + "txid": "edc27c6ecc1f76d0f23489ad7bbbdb8c653af37cc4b8f18197400aea2011ed83", + "inner_hash": "5432e686f984075091a8d3686d959b63ef620382fcb2b86794ba8dc0fb9656e7", + "fee": 588, + "sigs": [ + "c1902b37a95c5327b0e5a1f05de551d4135831b787c86562867344ee7f06235374dc1618c6b4a8e077041723bc731db72dab5554a808b1ba77d305309144bf5e01" + ], + "inputs": [ + { + "uxid": "f265bea876ffcfb8cf64df3aca4dae4a8d7f424ff495d91fb322feddb3a7e505", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944760.000000", + "hours": 782, + "calculated_hours": 782 + } + ], + "outputs": [ + { + "uxid": "e6d9b56e075a6adf520d1ae7fbab9ae06353ae0b93dc8cb17d82cc3628009a50", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944750.000000", + "hours": 97 + }, + { + "uxid": "d11b05345917d171f60c31bd2634041b73b97eae364724369ddb8d53369397fb", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 97 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 53 + }, + "time": 1429077514, + "txn": { + "timestamp": 1429077514, + "length": 220, + "type": 0, + "txid": "d154d8262abbf517c67d529b0fea7cdf097433bd296d5795b17c6379cb1b1430", + "inner_hash": "b69070b10e6bbc276bf155361d7f3238fec46b9d865075c1dc0fc20d81ab0a42", + "fee": 17787, + "sigs": [ + "0a4b7f385a164f5718794382d49c14a6623e7af5f1ddbefe4871c756b754457a7075e822603bd3b22b313278abebe756be92367ef7a81a8c4adf992842c2058601" + ], + "inputs": [ + { + "uxid": "e6d9b56e075a6adf520d1ae7fbab9ae06353ae0b93dc8cb17d82cc3628009a50", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944750.000000", + "hours": 97, + "calculated_hours": 23715 + } + ], + "outputs": [ + { + "uxid": "2df1e88589be43c55d7c6c3dbcbd663fb759b3245eb8d86b0b9cdaa989556aea", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "943750.000000", + "hours": 2964 + }, + { + "uxid": "c7919b892eeb751456d456b37ccde7350a3fca0dda03b17ec426a56f12dcf192", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1000.000000", + "hours": 2964 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 57 + }, + "time": 1429077584, + "txn": { + "timestamp": 1429077584, + "length": 220, + "type": 0, + "txid": "61a33b49e97bfe2d5f026bf45fae43a1b9bdf08c60ec8db017da720a69790c7f", + "inner_hash": "32d2dce8e8043e544b3cb2145b0bfb9d4cfdb7ae8e20437d075f76b75d8e088e", + "fee": 10088, + "sigs": [ + "990bf0a8c74b0b4c4d05f463a0a50e311a6ae27b5d327dcb906bb6e42330709d48998eed6e7cbdf35caeab6d90fac3e56fb222032aefa7b1d4d9c7653aca9fe600" + ], + "inputs": [ + { + "uxid": "2df1e88589be43c55d7c6c3dbcbd663fb759b3245eb8d86b0b9cdaa989556aea", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "943750.000000", + "hours": 2964, + "calculated_hours": 13450 + } + ], + "outputs": [ + { + "uxid": "c5150380691c542b9bdf4cf2280ac612e0576c349f99d47d0a03c77eedc48731", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "942750.000000", + "hours": 1681 + }, + { + "uxid": "3b9059ec909faf64d652dae78944f4a2737df95a3215bf98e2ff33e02e2b377f", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 1681 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 61 + }, + "time": 1429077654, + "txn": { + "timestamp": 1429077654, + "length": 220, + "type": 0, + "txid": "4aeafd20b9df56ec852a2c257ff1630b9530d8375a4e72f20238ea36835f76d5", + "inner_hash": "bc6119c006f7c54c8608cc8050f47c43e6c079397f607f8c9e90d3072a10eca5", + "fee": 9118, + "sigs": [ + "0309322d16d48a35bd42c2ae6a76b240b21974d073f81f440e04431941fc9d550de92dcbcb226ad3baae2b3cbae51db28b2dc8d3e1b51cdd559cbbb6e4b71eda00" + ], + "inputs": [ + { + "uxid": "c5150380691c542b9bdf4cf2280ac612e0576c349f99d47d0a03c77eedc48731", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "942750.000000", + "hours": 1681, + "calculated_hours": 12156 + } + ], + "outputs": [ + { + "uxid": "9bbb8d620aae3efc7c21bb7d6a7159eda441a83e0fef2cd98f8240b38857d648", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "941750.000000", + "hours": 1519 + }, + { + "uxid": "2480aeed2dc47c692e4bce61fb3ee44c4992ea39b0a167235e501330d7ddac62", + "dst": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 1519 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 64 + }, + "time": 1429077694, + "txn": { + "timestamp": 1429077694, + "length": 220, + "type": 0, + "txid": "29c229c97d27bcaf842a367520e1916fb855921906bddf4a3b0413ad3f11517b", + "inner_hash": "bc02dde29d200fa6bc0497f2ddd5e52007aef9b6482d40953fbd44ed88e3cf78", + "fee": 7026, + "sigs": [ + "0674c0617c9e6109ca9af404d446777943bb6aaa5dcb223da63bff1a305498972735e0b2a601cc9c6ee2231ad5fdd025fb92cbb00e200860a2ebde924f76499400" + ], + "inputs": [ + { + "uxid": "9bbb8d620aae3efc7c21bb7d6a7159eda441a83e0fef2cd98f8240b38857d648", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "941750.000000", + "hours": 1519, + "calculated_hours": 9366 + } + ], + "outputs": [ + { + "uxid": "25ad0d5ae6a1a9bc61c6b9099fb7829111977a59e1183de4227a0a5352555639", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "940750.000000", + "hours": 1170 + }, + { + "uxid": "47c74a6d7f1f54cf0a7ac45ec00277539079810068dd95a29a202c43780d65a0", + "dst": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "1000.000000", + "hours": 1170 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 67 + }, + "time": 1429077874, + "txn": { + "timestamp": 1429077874, + "length": 220, + "type": 0, + "txid": "42227683dd9c149859d0578ab300d8509d513afadf7834fd8ae7a321cc07d833", + "inner_hash": "a7a9ea6466bef6cd63f671ae5dd1aafbeb251a717c7da331d40ec376ad0e89ec", + "fee": 8718, + "sigs": [ + "b4a141eb037a4debd99c347f337f67662a3feeb96112d7b05fc035a3556419dc3a9b35028327d925ca5eb9da018371bc333b7365f06ea22366169af6f066524701" + ], + "inputs": [ + { + "uxid": "25ad0d5ae6a1a9bc61c6b9099fb7829111977a59e1183de4227a0a5352555639", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "940750.000000", + "hours": 1170, + "calculated_hours": 11622 + } + ], + "outputs": [ + { + "uxid": "acc75d51ff9f18a224d1ca0481917e2a67298de40955711cd97a08f6733b5b6a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "939750.000000", + "hours": 1452 + }, + { + "uxid": "8bdd2662d7ed495ff82daef9198ee23ac0c75417607675a8da3dd673952c0e39", + "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "1000.000000", + "hours": 1452 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 68 + }, + "time": 1429077914, + "txn": { + "timestamp": 1429077914, + "length": 220, + "type": 0, + "txid": "d803ab903f68f7861cd8eff93b3c097c5b8f6a697ca67bb01e7e645060839fd0", + "inner_hash": "611f096c50da1d98c29b8c9bdc6b7f7c98d96061ab126c66716f17a2fc495166", + "fee": 1090, + "sigs": [ + "d264a023bc6986c1bf16e2e697f4df8b6e33ae2d4b1ddd4e207cb5f902fed54c1234c3ef2429d82507f5c10c0fb4320d753f3bf6b5e155fa3ec03bc91dd8206a00" + ], + "inputs": [ + { + "uxid": "acc75d51ff9f18a224d1ca0481917e2a67298de40955711cd97a08f6733b5b6a", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "939750.000000", + "hours": 1452, + "calculated_hours": 1452 + } + ], + "outputs": [ + { + "uxid": "5c1069a3aa6628ed7f9bdb300bec1a7e7ca6fb4645528a8c6a27c167e7dfe698", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "938750.000000", + "hours": 181 + }, + { + "uxid": "3c56fa9d161783d6fe5c8b055c6d20bae27097e7bcc44d9ece5c94df182ee5bf", + "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 181 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 69 + }, + "time": 1429077944, + "txn": { + "timestamp": 1429077944, + "length": 220, + "type": 0, + "txid": "3bf485890e91268452dc3136c0b294dc9909b3aaa10b9c936743e6e9b1a56f61", + "inner_hash": "e952e5d86f3cff105dab78a455691c871f3b0fd09558e367833c4743339b94d3", + "fee": 137, + "sigs": [ + "632771f1bdae7454911dcb6462aee56827f949dae18e8a98168b57864a62333f4251e17efa15a53ec12ab6980ea72838e9bb0e64aad82ad9e6a0a2a33b3006cd00" + ], + "inputs": [ + { + "uxid": "5c1069a3aa6628ed7f9bdb300bec1a7e7ca6fb4645528a8c6a27c167e7dfe698", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "938750.000000", + "hours": 181, + "calculated_hours": 181 + } + ], + "outputs": [ + { + "uxid": "8190fd31c005510d550c8a241b127fad2558c82aed9483fb4423193d5f4429e3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "913750.000000", + "hours": 22 + }, + { + "uxid": "5a7b2b6568cfa4ff5d44e98446aed92438ede0103b9994cfa3389bd02a35239b", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "25000.000000", + "hours": 22 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 70 + }, + "time": 1429077964, + "txn": { + "timestamp": 1429077964, + "length": 220, + "type": 0, + "txid": "f51e2ce31961b0186e04cc9d78857c3c21d3e2afb25c050d8c1d67d3320fcc07", + "inner_hash": "4a8b13ea0c8a993b3455a374e847bcbea7e7a20392c7cc169cbc41778e65d6e3", + "fee": 18, + "sigs": [ + "74f886780a9df8f6987c8c60bf5d9ad0fc25a502ba8f681188923d3a85f74bb87d57b067e53ed0f423ee7fbb352f3260e65c38e44cc7eec8fe8224374fd77cc800" + ], + "inputs": [ + { + "uxid": "8190fd31c005510d550c8a241b127fad2558c82aed9483fb4423193d5f4429e3", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "913750.000000", + "hours": 22, + "calculated_hours": 22 + } + ], + "outputs": [ + { + "uxid": "450cd7795bb3625daa99d6b64b9a8786d593bf1cad986d6c2933dae04b74a593", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "888750.000000", + "hours": 2 + }, + { + "uxid": "9639a86df8da288fb0fc6a92fa086f3cd5a8387705a14ddd2aa5e30c6c3fc3fb", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "25000.000000", + "hours": 2 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 71 + }, + "time": 1429077974, + "txn": { + "timestamp": 1429077974, + "length": 220, + "type": 0, + "txid": "abed13c2a552633d26b5b51c3ac5abf9808756c0203869ed185a7cd673702ba2", + "inner_hash": "c176a1a85f716055a9e8060c2a4245db0d7f71f4ac5387d4a51d173db467150a", + "fee": 2, + "sigs": [ + "40e8340047f08afd483b2867166e15ae751bb7272a2c24f68ae8561d3619ea021363e987118a2fe516cacff1946d4d6c4c249038581ee2f58f8feea4bcffc3b100" + ], + "inputs": [ + { + "uxid": "450cd7795bb3625daa99d6b64b9a8786d593bf1cad986d6c2933dae04b74a593", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "888750.000000", + "hours": 2, + "calculated_hours": 2 + } + ], + "outputs": [ + { + "uxid": "b44ee00208690c2123989f40edaff0224825afb20ca0952fbd90bddfd3213642", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863750.000000", + "hours": 0 + }, + { + "uxid": "22edb5931e1c54382f18e41ef774931efb08c278209a1fe8a34100147b707220", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "25000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 77 + }, + "time": 1429147880, + "txn": { + "timestamp": 1429147880, + "length": 220, + "type": 0, + "txid": "29798149e90f6442489bcc3294f455441a5a401e81491ed06bdc2c850756f0d9", + "inner_hash": "23ab44d59346b369d258cce6d5142ca7e1b52dd09a1512d8a618e08ae7346004", + "fee": 5860904, + "sigs": [ + "6e0bd761d2d9eeb207f0c4cf9f13d1407f33b5f50e72c3462225c8041882ddcd078a02720d533801a433d917674e3d68a98bb997e9b06664a73a9bdeae46404601" + ], + "inputs": [ + { + "uxid": "b44ee00208690c2123989f40edaff0224825afb20ca0952fbd90bddfd3213642", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863750.000000", + "hours": 0, + "calculated_hours": 7814538 + } + ], + "outputs": [ + { + "uxid": "6060c983054614b8801e405de697c443a1edebd3236582f89f01c6cf6a165c3f", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "862750.000000", + "hours": 976817 + }, + { + "uxid": "08723ed501e11c2053bab6b500f820dd7ae2aeb4a3c9d5109845bb46afebde97", + "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 976817 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 81 + }, + "time": 1429164440, + "txn": { + "timestamp": 1429164440, + "length": 220, + "type": 0, + "txid": "0cded82aa3ac92d78e23d2d0d7faf93c675fc9a321ad55105f65b6fca444b1e7", + "inner_hash": "0ca2ed02f9155bf69af2fd27b40b0300e0c9804cbd2507389d930ef186f48794", + "fee": 754183, + "sigs": [ + "68a82ec4421a37b8116c8bad98d2568802973dbce6f0166b3a9504110ee4873239953c3e8baf3a20d599e300c8b2c524d672c46ed593e126adc908f1decbbf5100" + ], + "inputs": [ + { + "uxid": "6060c983054614b8801e405de697c443a1edebd3236582f89f01c6cf6a165c3f", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "862750.000000", + "hours": 976817, + "calculated_hours": 1005575 + } + ], + "outputs": [ + { + "uxid": "129726406b3101d51ffd5bfca59a501184d6c8ca363be4ef1b8d8bf48a6c70e0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "861750.000000", + "hours": 125696 + }, + { + "uxid": "3fe7d61ffa993e00200ce6be7ba347c603032ac3f8c4ace07767e630fe94d76c", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 125696 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 85 + }, + "time": 1429164620, + "txn": { + "timestamp": 1429164620, + "length": 220, + "type": 0, + "txid": "b7b42b1b29acab0a2328aaf368ec74be49b4d4caf827e82b439ef4d8be976a55", + "inner_hash": "8b5eec10f63b31e72d4dba2c71fb0f7bc230e58f497e255352f02eee965d3595", + "fee": 121202, + "sigs": [ + "82587c832f0c74f185603b934a32a28624712373d188caad0355314ea621a4af3e96dbd1c37e889f630d90047c79b39c495b49964eca20172bb900db1df48b3a01" + ], + "inputs": [ + { + "uxid": "129726406b3101d51ffd5bfca59a501184d6c8ca363be4ef1b8d8bf48a6c70e0", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "861750.000000", + "hours": 125696, + "calculated_hours": 161602 + } + ], + "outputs": [ + { + "uxid": "05f42f22f5fea4b5cac8182dc2b4f280149c686434c6d4195a119a8d02ab24b2", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "861050.000000", + "hours": 20200 + }, + { + "uxid": "6e2abc4bc7820178358a603b7d99c4b39735dd1685d0c5a778ab63f29c9e93d9", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "700.000000", + "hours": 20200 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 86 + }, + "time": 1429164720, + "txn": { + "timestamp": 1429164720, + "length": 220, + "type": 0, + "txid": "ca51f9d0a19bf326d6dd39a1e4dd240adaaae279411093d4a5b20f54cddabb95", + "inner_hash": "47500bd3c5f74835a01b0f696e15780baec2ca3723f45355c9e8cd1c71564d18", + "fee": 15150, + "sigs": [ + "fdbc112b10354be2b85b2f9131a3927e7b4e87ff8ddef91b849a71e0b1445ebc410b61d85ff7af1834b54febf89d903e3151f5a74ccef4e9607851c9005454d001" + ], + "inputs": [ + { + "uxid": "05f42f22f5fea4b5cac8182dc2b4f280149c686434c6d4195a119a8d02ab24b2", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "861050.000000", + "hours": 20200, + "calculated_hours": 20200 + } + ], + "outputs": [ + { + "uxid": "4e1a98a72639efa6253a7cbea0f3b499fa24fb88612ad81414d20e46d2b5784e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "860050.000000", + "hours": 2525 + }, + { + "uxid": "ee69cfd4f15d16ded96745a35ef150f679b5b79cc0fd4009a2d02cdccd81ca3e", + "dst": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", + "coins": "1000.000000", + "hours": 2525 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 90 + }, + "time": 1429164810, + "txn": { + "timestamp": 1429164810, + "length": 220, + "type": 0, + "txid": "bd617ec27c2bea642fad8c153178e11ca08456d752249324e3011f27c845f87a", + "inner_hash": "f8ce5c9cc22005d7f63c0400132b0e70a6a8af574f1a5c1ffb0404f228a02949", + "fee": 16229, + "sigs": [ + "b471a7bdde8b1427f8081d9e91250fd89cdd4dd23062796fe2ee973c612eb28b76f6c7ab4f3fbb7c7f9627c52158066d13d9fbe34dfdb6e77c02d84ff4d45d7d01" + ], + "inputs": [ + { + "uxid": "4e1a98a72639efa6253a7cbea0f3b499fa24fb88612ad81414d20e46d2b5784e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "860050.000000", + "hours": 2525, + "calculated_hours": 21637 + } + ], + "outputs": [ + { + "uxid": "33e0c4c9536afffd491fef6294f22ffb0d16902493946a051db0b218728a1c44", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "859050.000000", + "hours": 2704 + }, + { + "uxid": "2a09e97f7725a35af1357842206875a023252da4ebfce129eaf4cb87119cfd41", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 2704 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 94 + }, + "time": 1429164870, + "txn": { + "timestamp": 1429164870, + "length": 220, + "type": 0, + "txid": "0f4958d590ed4ac9aca79d848731b358b1c01fab9717775cf6515f2bf2706dc8", + "inner_hash": "89c71b68262f8e3acddcec032b4209220ac7b794d1cefa62b45c71b94e017cad", + "fee": 10977, + "sigs": [ + "ede880d4422a1102280918227157997bb7a36d26a358a71bf016963d29e8403d2298754039d8dd14c0b05d776d05bebadb919a620e87439c93008e292086c94d01" + ], + "inputs": [ + { + "uxid": "33e0c4c9536afffd491fef6294f22ffb0d16902493946a051db0b218728a1c44", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "859050.000000", + "hours": 2704, + "calculated_hours": 14635 + } + ], + "outputs": [ + { + "uxid": "f32f03f28eece9ddcdc488a85100c94a7c924c185ae560363518dae5e2aacccb", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "858050.000000", + "hours": 1829 + }, + { + "uxid": "24c4cfc628a0f77ce2e878c6ffa9d4dbd85325f8a5e0b5df970a3a2c36033519", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "1000.000000", + "hours": 1829 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 98 + }, + "time": 1429274566, + "txn": { + "timestamp": 1429274566, + "length": 220, + "type": 0, + "txid": "fe01250cfdf84eb0182c033c216891e7e6971cc85976c4c46d9e3c608974d233", + "inner_hash": "2400f3951d454f663d5097060267f8e31e86e1c3f10391c8a06ed79fd72fe49b", + "fee": 71088, + "sigs": [ + "6ecee1ca0e86de9bf6da9a21e49b1cfade8f1a279f7fc58834c15184bec1de634c82faf30bdab34083bc1f32f87d27daa1987a525db83100f88b9103efbc007701" + ], + "inputs": [ + { + "uxid": "f32f03f28eece9ddcdc488a85100c94a7c924c185ae560363518dae5e2aacccb", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "858050.000000", + "hours": 1829, + "calculated_hours": 94784 + } + ], + "outputs": [ + { + "uxid": "99b4e51e1afd04813656e6202c7e462d88ce87ba980da7a62591190d72d1073c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "858000.000000", + "hours": 11848 + }, + { + "uxid": "f12164a6ea6ce65ff2ca1f2be7251bece8f7c5747ba8ec68e1ec3b27d45d7b9c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 11848 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 99 + }, + "time": 1429274616, + "txn": { + "timestamp": 1429274616, + "length": 571, + "type": 0, + "txid": "819106dc50373e5293a7e79f179693e85536e8206d82272930ec08410d92402a", + "inner_hash": "02e9a06b0ca7f91255107993e00f09e9ef983559088c5febff264c17952033c4", + "fee": 52573, + "sigs": [ + "efb713e6a1e5d328e94a51fbeb0f73e2a3b7a54e15db75797f0b709f698b16eb26e522f187a98144807e0e6cd294686ff19037975abb6d44b20b2899968954f400", + "b5d011c60020ce591a21db15823c06188515a63ca95d573c36b3af83d634fc6f1c1125db197f6283510ee33890ac168513254ad37524c77294bb5a12e8ff23f300", + "00d87b91eda33f627f6cd28cc673daf929fbec36e7bcfdf894f7491618a68b5755b5baadedc106d53d2da924fcbedbd106eadc50ec611d426720f67426c7286500", + "e64cf7e74363cfd381a3aa6fd17d7c415d6034b26b93017acaf9cf3475ccdffc53c3714d1d13409323cf77ccc81596f6e6edcec11d890979a436ef960bcb5f6900", + "fc2eb05241afdd15cdbd28cc7158d7eb4442f21a678c52332762b23ac6c2fcc76b0f79731987df0ba84d82044cd474d4cda9afda778a21b78a0659c5b588664301" + ], + "inputs": [ + { + "uxid": "2987e7c89d353ad5d63cea2bf2724dc5f7a5ef5fb81f5ea160a307f0726ac2f5", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 701 + }, + { + "uxid": "a52408daa8ce7026c70b61d4df4212fb577462060f340bfce779225b3e18193d", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 50058, + "calculated_hours": 50605 + }, + { + "uxid": "dc73aac74348dd285a1456c1fae2204d7c2039d50a765bdaae0c31f7c7e059db", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 6257, + "calculated_hours": 6804 + }, + { + "uxid": "e4e375b9dc55ff53d6de9120f1a87ff00e00a779835f8320f2c6b3090d0466e6", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 782, + "calculated_hours": 1329 + }, + { + "uxid": "d11b05345917d171f60c31bd2634041b73b97eae364724369ddb8d53369397fb", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 97, + "calculated_hours": 644 + } + ], + "outputs": [ + { + "uxid": "427462efeb07a6803f013c789ea43d93240f74f886bf9afd63dc1936a7574a37", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 7510 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 101 + }, + "time": 1429274666, + "txn": { + "timestamp": 1429274666, + "length": 183, + "type": 0, + "txid": "e8fe5290afba3933389fd5860dca2cbcc81821028be9c65d0bb7cf4e8d2c4c18", + "inner_hash": "45da31b68748eafdb08ef8bf1ebd1c07c0f14fcb0d66759d6cf4642adc956d06", + "fee": 720335, + "sigs": [ + "09bce2c888ceceeb19999005cceb1efdee254cacb60edee118b51ffd740ff6503a8f9cbd60a16c7581bfd64f7529b649d0ecc8adbe913686da97fe8c6543189001" + ], + "inputs": [ + { + "uxid": "6002f3afc7054c0e1161bcf2b4c1d4d1009440751bc1fe806e0eae33291399f4", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "27000.000000", + "hours": 220, + "calculated_hours": 823240 + } + ], + "outputs": [ + { + "uxid": "f9bffdcbe252acb1c3a8a1e8c99829342ba1963860d5692eebaeb9bcfbcaf274", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "27000.000000", + "hours": 102905 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 106 + }, + "time": 1429279796, + "txn": { + "timestamp": 1429279796, + "length": 511, + "type": 0, + "txid": "8de17dff34a8798f2ac89584f5c559e3bb82c280a3f6890386b4dbc5fef0e8cf", + "inner_hash": "2ab03a15a9f312d27919ec42a27dfefc5fc5e0b8bf451eb81ef545bf4497f524", + "fee": 835759, + "sigs": [ + "9dd44c7d76d454c7c658649d94e08f75354ba568aae069b38da012f07eacbcfe2a5bbe9b4444f566336c23a03f3625eb4306791437e1bfe69f43efa0c109ec2d01", + "211d2607cef832c989563a3475daf6aa1fec6d73893a72666b5428c6bd93217605990bc3b45f4cf4863a648708ca3bf3526eb1644679f313a297daf82b1865bf01", + "f7e77964485e36b15ade78aacc17407af265c7144767e3f39bfd9765869f90cd0f33120ca996154db82d5462d626f3ae299c8f3b8cc862284432919cfeb6613d01", + "3a1e491d35ad5daa1af54872b5ec1d02c6654cad8f2bcd94c2a624c1a3cd5c9163c373f06a931b5de526654bdbc5cdd221b7fcf7b77329d452562080216ca8fe00" + ], + "inputs": [ + { + "uxid": "99b4e51e1afd04813656e6202c7e462d88ce87ba980da7a62591190d72d1073c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "858000.000000", + "hours": 11848, + "calculated_hours": 962798 + }, + { + "uxid": "f12164a6ea6ce65ff2ca1f2be7251bece8f7c5747ba8ec68e1ec3b27d45d7b9c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 11848, + "calculated_hours": 11903 + }, + { + "uxid": "427462efeb07a6803f013c789ea43d93240f74f886bf9afd63dc1936a7574a37", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 7510, + "calculated_hours": 7564 + }, + { + "uxid": "f9bffdcbe252acb1c3a8a1e8c99829342ba1963860d5692eebaeb9bcfbcaf274", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "27000.000000", + "hours": 102905, + "calculated_hours": 132080 + } + ], + "outputs": [ + { + "uxid": "dfd2834342f3a7caf183472c17801aafacd1775378eb843509d17ad858456cb0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "885000.000000", + "hours": 139293 + }, + { + "uxid": "3bfbe4e80894862d60a053ffb47b8f1749e281603cd6376c8fc6b5e2cec0c843", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "100.000000", + "hours": 139293 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 107 + }, + "time": 1429280596, + "txn": { + "timestamp": 1429280596, + "length": 220, + "type": 0, + "txid": "6546dfbe6e61e81f3e9f6c9afdfee1c07758f2e486d731ae4d19b40602367656", + "inner_hash": "9566ef1826b7f518c043395c2b7a37014f77f8e23796c1c78e55d1fc443a02da", + "fee": 104471, + "sigs": [ + "2773830af5e34a3de4a3ce935ee08c189feaa30ab41ced8f78f9a6434198d9775c58a0b9bcc2931f3d0dfde541ef7f5d3c1cfcf5415776dbd9d871ce036ec42900" + ], + "inputs": [ + { + "uxid": "dfd2834342f3a7caf183472c17801aafacd1775378eb843509d17ad858456cb0", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "885000.000000", + "hours": 139293, + "calculated_hours": 139293 + } + ], + "outputs": [ + { + "uxid": "8ac39d41ec014ca6625e5f17e1fbe62db7a4ac154e0e42a017efa037935ae968", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "884900.000000", + "hours": 17411 + }, + { + "uxid": "ec4b791f2fa22a986d6035e34f5025c3da0398cb2acc59a54d495d4eaacdee8a", + "dst": "2acnXsnJ2k8jxiUahtBe8h4xouPAnpbwwjc", + "coins": "100.000000", + "hours": 17411 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 109 + }, + "time": 1429302756, + "txn": { + "timestamp": 1429302756, + "length": 220, + "type": 0, + "txid": "a4c15ae4743246709ec335d33c289576c8893e71f5c3dcee1db6e43eec9242ee", + "inner_hash": "1d2404a84798154867ab461179a2b4300d65e4886cbb0220f0d5d0b16bbb7628", + "fee": 42555, + "sigs": [ + "3fcfe6d7fe59b9998ac4260c3b788384b2ebb7137e08e3ffc8d8b6efa23490e71f94f381c61af4966ba6a4fb4173079d5a7f31518030900f6c10d64ceb0b774f00" + ], + "inputs": [ + { + "uxid": "8ac39d41ec014ca6625e5f17e1fbe62db7a4ac154e0e42a017efa037935ae968", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "884900.000000", + "hours": 17411, + "calculated_hours": 56739 + } + ], + "outputs": [ + { + "uxid": "bae0e928b795e2a80c88161afcbc102dcad6644386f6f44050dde8d586750140", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "881900.000000", + "hours": 7092 + }, + { + "uxid": "4ca22a0fa2acbd0c9e90c4ae83496d05e122deb1a17c670e9c785479d115e824", + "dst": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", + "coins": "3000.000000", + "hours": 7092 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 111 + }, + "time": 1429348072, + "txn": { + "timestamp": 1429348072, + "length": 220, + "type": 0, + "txid": "6ce27da2ddbc15f03330960b4201dbb3a066ad2e9bbd5366a9564f6befdcae2e", + "inner_hash": "2db237d697bd17aab9121cdfc4d72fa1cbfe7fd37d7f71b1a857833bb56b7dd7", + "fee": 13386, + "sigs": [ + "c50715bd2e53ed971b7559ccaf8a930dae335dc45cad18a25ccfea3209ea2c971e0dc6cc57ff1dbcde49ddfdc612e71e923adcd21b68eaa0eb239bc83a50ff2b01" + ], + "inputs": [ + { + "uxid": "f9bf35f993452b3d490668bb579fd272da969a1bcca8de0c25000ee57b5d7f54", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22700.000000", + "hours": 17848, + "calculated_hours": 17848 + } + ], + "outputs": [ + { + "uxid": "c5df36ce47f6f183475317ab1c53eaa65428c142cb3e3906bf162d80519a203f", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "12700.000000", + "hours": 2231 + }, + { + "uxid": "94889dbe1c20eb942b7932c5301737537ac33abd9c81d72e1642ddc70ce320e0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10000.000000", + "hours": 2231 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 112 + }, + "time": 1429348102, + "txn": { + "timestamp": 1429348102, + "length": 317, + "type": 0, + "txid": "f8a24a25a8e3b206db7ea8a0bd8eeb0f8087f50d230c81a538316bcc5152da3d", + "inner_hash": "cfca9a1aa2ab7ea4d643700ac89e9544f1d4e9ef85e28d1cedeece11469fb885", + "fee": 8332864, + "sigs": [ + "5b68d315f4e84cdae4936db6bb7c8466977e784851b605d1fbc1e0bb65fe259d58d6be37228c96bccb1a1c1e9d316d9102fcfaefeda614e67af20464bc877f2101", + "fdd919590553d428d9b8121644127651c68b5207af9798aaaa6ed18134c5835b5311bb547e07e47157a4fd89867c88a48700255610efd2a3e3f77dc82f5fb3ba01" + ], + "inputs": [ + { + "uxid": "bae0e928b795e2a80c88161afcbc102dcad6644386f6f44050dde8d586750140", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "881900.000000", + "hours": 7092, + "calculated_hours": 11108253 + }, + { + "uxid": "94889dbe1c20eb942b7932c5301737537ac33abd9c81d72e1642ddc70ce320e0", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10000.000000", + "hours": 2231, + "calculated_hours": 2231 + } + ], + "outputs": [ + { + "uxid": "1d4595b9fa1c6c3d64f48b6ae5f8f861b1c08a022cbcb04b279df448da3db660", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873900.000000", + "hours": 1388810 + }, + { + "uxid": "53b376413d550663ab51b229df8b0f55e4055d6577c2d8b5cec8ff748fe0e958", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "18000.000000", + "hours": 1388810 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 113 + }, + "time": 1429348172, + "txn": { + "timestamp": 1429348172, + "length": 220, + "type": 0, + "txid": "1f27afc41896d2c7fdbd2620e606440ad12557e9a4bdd6808dcc2c23d4e32978", + "inner_hash": "4d53c05c731409feef7606cf9514904f4c7704537efb453ac2c439fcfe77a455", + "fee": 1041608, + "sigs": [ + "e36cef84c1c6f999dba462f3134131c105da2255eaf21550ce30ee52a14a33d529a7cd0c37b3883d0d57429b163b4905271c7b1a4d951b4a521f245c7857dd5c01" + ], + "inputs": [ + { + "uxid": "1d4595b9fa1c6c3d64f48b6ae5f8f861b1c08a022cbcb04b279df448da3db660", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873900.000000", + "hours": 1388810, + "calculated_hours": 1388810 + } + ], + "outputs": [ + { + "uxid": "412eff3eef889c682da8db3608fce37d1c5ee2cc297bc88d901648e6ccd418f9", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873800.000000", + "hours": 173601 + }, + { + "uxid": "c961ba554ae30b0edcdf71e834ab2b26d7dff5bcf5955d4874cdba89170392bf", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "100.000000", + "hours": 173601 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 114 + }, + "time": 1429348502, + "txn": { + "timestamp": 1429348502, + "length": 220, + "type": 0, + "txid": "e8765b4e6fbca87144df59a6f66815b175e81999509504b117636edc34cbe2af", + "inner_hash": "b62f9938b195211810976e1719b152fe6c381879adba6061f4ca36d74c06bea2", + "fee": 130201, + "sigs": [ + "9d40ed257bb7586c7d72e90bd99c6883fb836d400107686ba477850c2b63a86b5ad885aa37f352d334d930ea3814844e67a6ac438c36b919daff273a66f21e5201" + ], + "inputs": [ + { + "uxid": "412eff3eef889c682da8db3608fce37d1c5ee2cc297bc88d901648e6ccd418f9", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873800.000000", + "hours": 173601, + "calculated_hours": 173601 + } + ], + "outputs": [ + { + "uxid": "6ad7993fb2728c2c53ac2c8395a6c62d03c5ef9298ca467e7998fb64fd0c90b4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873700.000000", + "hours": 21700 + }, + { + "uxid": "5b0801ec545b132eeafa61bee8f645df7e1e358321ef830a4247fe541c211139", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "100.000000", + "hours": 21700 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 115 + }, + "time": 1429348712, + "txn": { + "timestamp": 1429348712, + "length": 220, + "type": 0, + "txid": "bb700553c3e1a32346912ab311fa38793d929f311daeee0b167fa81c1369717e", + "inner_hash": "253c14d68558b09c034d4945284f5cc3025b9e05723c6e4fa7d95f1e68edb211", + "fee": 16276, + "sigs": [ + "4920f49d47105801fab73c2398bee61ce56bb0b58dd69ab35ec1f959a3b8a8003c2821510d3a97d09f7a4a9f943b04d888b1327539ff48216f148fca693dde5d01" + ], + "inputs": [ + { + "uxid": "6ad7993fb2728c2c53ac2c8395a6c62d03c5ef9298ca467e7998fb64fd0c90b4", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873700.000000", + "hours": 21700, + "calculated_hours": 21700 + } + ], + "outputs": [ + { + "uxid": "0976005ab4540e8211cd929f19634bfaa2f5d8e24177ddb5b803b447ea91f8c3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873600.000000", + "hours": 2712 + }, + { + "uxid": "de995d2361e810cfba1b9b1141413367a722f51c7555b1685f6e68129dfb2679", + "dst": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", + "coins": "100.000000", + "hours": 2712 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 117 + }, + "time": 1429351912, + "txn": { + "timestamp": 1429351912, + "length": 220, + "type": 0, + "txid": "345488861ad3f0d93024c367990e64ef0f7a95bd8b8589f554172f9439808263", + "inner_hash": "258acd45e194051214c9783184c2a9157558e595c4e4da814258f0ffd0e9dd64", + "fee": 125795, + "sigs": [ + "9f44be793a0cb218b6836dfa52e5b8c38fe2b1257d27fcea49f4c6a6ed910f446e8a96a987fc06c6b6ae13ea8ea0290e91ea40b6f8eeaf8054e8efd17306573201" + ], + "inputs": [ + { + "uxid": "0976005ab4540e8211cd929f19634bfaa2f5d8e24177ddb5b803b447ea91f8c3", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873600.000000", + "hours": 2712, + "calculated_hours": 167725 + } + ], + "outputs": [ + { + "uxid": "6beca9fb58a327580c614d7fb5622916849756790b661bcabc880666364fdf47", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863600.000000", + "hours": 20965 + }, + { + "uxid": "2010952c33c83599fa14bfa5982d59865f2a362c97270dacb4c180a485ee5096", + "dst": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", + "coins": "10000.000000", + "hours": 20965 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 121 + }, + "time": 1429382678, + "txn": { + "timestamp": 1429382678, + "length": 220, + "type": 0, + "txid": "da82deafc15c36e7dc9cd95663e0dc910ae626ee543147ac7bd8682be00f7baf", + "inner_hash": "c98f858a27e76b0b565baaa3dffc6cfc7b0ffe9dd7d2d71f4bb0ad4d1c439ca2", + "fee": 2271879, + "sigs": [ + "15fccdc36c966a9571196a3f727ebda47162441df2d9965ac27109ac56d22cb41638b404e84b5b388d809b814ade18022cba0a6e021140c6b7d0144a6facd6d501" + ], + "inputs": [ + { + "uxid": "6beca9fb58a327580c614d7fb5622916849756790b661bcabc880666364fdf47", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863600.000000", + "hours": 20965, + "calculated_hours": 3029171 + } + ], + "outputs": [ + { + "uxid": "f8a1990492f970227ec29e6e095fa724d66fa2d6883bd8723773098d08ca8b3c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "801600.000000", + "hours": 378646 + }, + { + "uxid": "e5596ef0ba04ad9e0adbe0355a24c6bef249654906f917b68f8f0cf072508674", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "62000.000000", + "hours": 378646 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 122 + }, + "time": 1429382898, + "txn": { + "timestamp": 1429382898, + "length": 220, + "type": 0, + "txid": "211f5fc97ba1797d78f84d4e4db78415b5ff4121f78369535fe3f8015571c6df", + "inner_hash": "586a8297d8d148f79d8529fbc3e356f5de9570a3c34bc1ba8494b8269b03d0f2", + "fee": 283986, + "sigs": [ + "cccee00def7817ec1b36ba5b02066f82eae188afc3e05e61524c62d19fe095e0363db085da6591841314da5f836f2f0068eae522e3d3937d2f96de99f924af6a01" + ], + "inputs": [ + { + "uxid": "f8a1990492f970227ec29e6e095fa724d66fa2d6883bd8723773098d08ca8b3c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "801600.000000", + "hours": 378646, + "calculated_hours": 378646 + } + ], + "outputs": [ + { + "uxid": "998487775c0e58420673b70204b83c1d6bb5b70e34b1aa0f8169c85ecec2438e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "765600.000000", + "hours": 47330 + }, + { + "uxid": "1e0cf4e3ed49b52944f533a212e6412291e369ac3e7a8c4440424f475f2983b3", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "36000.000000", + "hours": 47330 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 123 + }, + "time": 1429451746, + "txn": { + "timestamp": 1429451746, + "length": 220, + "type": 0, + "txid": "9003d3caba9587d46d000cc614bb52bed34adcc5ea404c560c986eb6dd756e6b", + "inner_hash": "2a87bcb0049b9971713a2e46b75b348785adca751b151290a411bfa5a0ed2287", + "fee": 35498, + "sigs": [ + "0da91c351fb050c243c7b587005bee14ccc2951897ffdf720ad9c757c5946e516a20ca0d92c5f84957161d10a74deab05a2b530ab5bbcd7ad01266213b5eb38401" + ], + "inputs": [ + { + "uxid": "998487775c0e58420673b70204b83c1d6bb5b70e34b1aa0f8169c85ecec2438e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "765600.000000", + "hours": 47330, + "calculated_hours": 47330 + } + ], + "outputs": [ + { + "uxid": "6fb116c110fe391448a1dcb985b67439c2e9a71d8bb2fd1cf345ac73ada6166a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "755600.000000", + "hours": 5916 + }, + { + "uxid": "8e764a87cee9f26b902f748c28a5a49de5c383e5f155129eec84474a3d0349cc", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10000.000000", + "hours": 5916 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 124 + }, + "time": 1429522086, + "txn": { + "timestamp": 1429522086, + "length": 220, + "type": 0, + "txid": "e9a6dd585b564b19c55d9f56188a45bfad32fa75703fa6336830035f6fa92e3d", + "inner_hash": "9cdad9a848f5b2993d1e5d0593e952b39ccdf7ae56bd13851449797cccdced5f", + "fee": 4438, + "sigs": [ + "1f3d02abe6811c83b4f4b2e270366e8d4c591866b6e984cb8bdea5d80ca1edbb04d651449070bbca22a8c7cfb3d23a6f85c0a5a7e3226e2d0520330faf16291401" + ], + "inputs": [ + { + "uxid": "6fb116c110fe391448a1dcb985b67439c2e9a71d8bb2fd1cf345ac73ada6166a", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "755600.000000", + "hours": 5916, + "calculated_hours": 5916 + } + ], + "outputs": [ + { + "uxid": "04471fb0797bb931e883f7b95cfff6ee4fea5e19a352ca5425fcd353c4f6aba4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "750600.000000", + "hours": 739 + }, + { + "uxid": "a4fdfce34725eb63941ac576651fa406272565a344ffb21435d285111efbc4db", + "dst": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", + "coins": "5000.000000", + "hours": 739 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 125 + }, + "time": 1429578056, + "txn": { + "timestamp": 1429578056, + "length": 220, + "type": 0, + "txid": "1ca0a2d44b6439b91eb839e0f99405abdcafe2c1a49c8b49b1739498129bd1a6", + "inner_hash": "1090d10a5a2210dc205d6f8447918670f9351feed057c76423629b4699777dcb", + "fee": 555, + "sigs": [ + "39817412c5edb4cd928aa3b79a022d4b3276af74eb377d3821c1e95e4d6c6acd61ebbf5eb5d32f87686b6cb4f09c2660e1f148192873208fc963d67a6945fe0101" + ], + "inputs": [ + { + "uxid": "04471fb0797bb931e883f7b95cfff6ee4fea5e19a352ca5425fcd353c4f6aba4", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "750600.000000", + "hours": 739, + "calculated_hours": 739 + } + ], + "outputs": [ + { + "uxid": "6b616ad99a946538c3ab101f245bcab211ab39507848425e80cbfc8ec5bdbc67", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "738100.000000", + "hours": 92 + }, + { + "uxid": "a08089cd67896683d5dcb2d50256354e0d086b9854eb22bb6022cc459d447211", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "12500.000000", + "hours": 92 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 127 + }, + "time": 1429848410, + "txn": { + "timestamp": 1429848410, + "length": 317, + "type": 0, + "txid": "243e1baa955c3f0af42d7acc4c920437dd0a99c754d6c5c2b7defcd143ff288d", + "inner_hash": "e7e030478e5828f44ec15b734638e8c2828f015b2fa5ca2823d24af3ad111ae6", + "fee": 3170256, + "sigs": [ + "1519c5c730648e7be553b2738aaeff38266735276e640c8f8d455f33c4fc07283ae5a7da47742df118337ff0548efebb1c75d0350a4e578ff95269182779db2201", + "ee099f6f42c813d13f097e9b3a8604067d6afd3718e6eeacd88fb25050d42b8603a42c4f7d24058483f70328a24fc91cd6ef190286c4a678e28b757143e23dc701" + ], + "inputs": [ + { + "uxid": "c5df36ce47f6f183475317ab1c53eaa65428c142cb3e3906bf162d80519a203f", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "12700.000000", + "hours": 2231, + "calculated_hours": 1175478 + }, + { + "uxid": "53b376413d550663ab51b229df8b0f55e4055d6577c2d8b5cec8ff748fe0e958", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "18000.000000", + "hours": 1388810, + "calculated_hours": 3051530 + } + ], + "outputs": [ + { + "uxid": "8169bf7f8fa21dc6400b60678b302946cf2765f44893ec8466262fc69b710591", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "30600.000000", + "hours": 528376 + }, + { + "uxid": "ef488d5f4a019502115d3b6b50bd364692315c3954d7e93c3ca22e11b92fc528", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "100.000000", + "hours": 528376 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 128 + }, + "time": 1429849170, + "txn": { + "timestamp": 1429849170, + "length": 317, + "type": 0, + "txid": "c2c9fe882df3b44fbb125b251a7604a7a4f4195dddff6e5396b7f130744e2b27", + "inner_hash": "e23ed05dee949be1aabf237db1fd81be8d73c838eb0ee3026104807053269431", + "fee": 41968911, + "sigs": [ + "8e9b1733227a841009881663a50e1e01ac2790f16416c6f973c89e15a8fc216044e156cc8fee84d3e3cc6371e4da340f5312726bfd66f16a635542d63c869c7101", + "d1f6b7078a9032159a165ffbfb1e0665bf9ced2c3d5db795fd5bd11fc53d790f56589cbbffd117eec50aa0dc8c0e65eccb13c5ccb5d39dc9bae739a49dda03b201" + ], + "inputs": [ + { + "uxid": "6b616ad99a946538c3ab101f245bcab211ab39507848425e80cbfc8ec5bdbc67", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "738100.000000", + "hours": 92, + "calculated_hours": 55430171 + }, + { + "uxid": "ef488d5f4a019502115d3b6b50bd364692315c3954d7e93c3ca22e11b92fc528", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "100.000000", + "hours": 528376, + "calculated_hours": 528376 + } + ], + "outputs": [ + { + "uxid": "ecb92dc2f43d4c6ca124575d8456d8894f3cb137875287beaa73180fcae2b3ca", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "737200.000000", + "hours": 6994818 + }, + { + "uxid": "6143275de37a2b5ec802eeeb8d38a3dfb2db6629128e44c4f9ffc0ce8ddad629", + "dst": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", + "coins": "1000.000000", + "hours": 6994818 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 131 + }, + "time": 1430330041, + "txn": { + "timestamp": 1430330041, + "length": 220, + "type": 0, + "txid": "6538399868cf772fcfa96e68c51aa6aa66faa95d7c685432e4005880932be134", + "inner_hash": "4854d5689f4c2b770d887ebf7f7d3fb975b295b0180d9354d69f2e322ae8b7b7", + "fee": 76257058, + "sigs": [ + "d213d50e53ceffd053571431b78fa6417abae8a7c5080dd3f8cece59dc61ad2444dd541540f5734d34dca94b3b975b613da0800121af8ec83b6f20d81cd53ffd01" + ], + "inputs": [ + { + "uxid": "ecb92dc2f43d4c6ca124575d8456d8894f3cb137875287beaa73180fcae2b3ca", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "737200.000000", + "hours": 6994818, + "calculated_hours": 101676076 + } + ], + "outputs": [ + { + "uxid": "6b4ca83b3f73b62161c90c6da03dff460ca9a5a3ccd6fafca140137416dedc58", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "736000.000000", + "hours": 12709509 + }, + { + "uxid": "e7756fa7a5c067d595f7300828bc4c70152653700844130d88174ba37237e2a3", + "dst": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1200.000000", + "hours": 12709509 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 132 + }, + "time": 1430330311, + "txn": { + "timestamp": 1430330311, + "length": 220, + "type": 0, + "txid": "3dfdfea4614d05c2f5eddf5773ef0afc745f1afe585141659df8e03e82897606", + "inner_hash": "3a4ac407aeec6233d3edf787d5b1f4d8257b594e9ee9d0ad3c32781053579b36", + "fee": 9532133, + "sigs": [ + "f37f3398240cee8e38c41945db72d4feda20f88a2250528fe1165533acdc7dfc0f99c7db0fc965847a100d0a2f598537cdd8c73a96c5fbb4e5e85dbfd9a4384701" + ], + "inputs": [ + { + "uxid": "6b4ca83b3f73b62161c90c6da03dff460ca9a5a3ccd6fafca140137416dedc58", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "736000.000000", + "hours": 12709509, + "calculated_hours": 12709509 + } + ], + "outputs": [ + { + "uxid": "2cd58783beb8a9f6278f7a097151531091b5f15afd7735e1facf02aa720c1191", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "735000.000000", + "hours": 1588688 + }, + { + "uxid": "333156ed20ba6937d3720af3a81939362b9f4ad1e9591bc676945ff0d202131e", + "dst": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 1588688 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 133 + }, + "time": 1430330421, + "txn": { + "timestamp": 1430330421, + "length": 220, + "type": 0, + "txid": "d30cec3ad3a66562d2513a3656b366ea7da583e6ba45214ac12b9c2219b4c5ea", + "inner_hash": "58e355edef48ff22e9a83952130c1bd8fe9a7f9bec7b2e0535c103c0146604c6", + "fee": 1191516, + "sigs": [ + "09baa4739816e5a86a46ecc30df8c00a5f046ad687f0674250640b6df2361dfe3723667872e0f6deb1d3447948e30b06f02b056a62da9dbaaef4db000eab747e01" + ], + "inputs": [ + { + "uxid": "2cd58783beb8a9f6278f7a097151531091b5f15afd7735e1facf02aa720c1191", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "735000.000000", + "hours": 1588688, + "calculated_hours": 1588688 + } + ], + "outputs": [ + { + "uxid": "52288a441c70260f6a3eab0e271969d54492377615a6fba8ec3ad26f11dc9768", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "734500.000000", + "hours": 198586 + }, + { + "uxid": "8b3d335360effd00cabcae13c2495f26f81743b82958629378b7bc78a7e460fe", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "500.000000", + "hours": 198586 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 134 + }, + "time": 1430330481, + "txn": { + "timestamp": 1430330481, + "length": 220, + "type": 0, + "txid": "44d05abc2637d9cd2047984023eb5cfa0a146e58821117de30f9c81703189cde", + "inner_hash": "44886be6952cd483b9425d314836714af65037b58923aa2432ea946131ae10f6", + "fee": 148940, + "sigs": [ + "7990cb04634a5e0de397917e56480805915c73d265fe466757a9e677067483787d457c7e9931a89daa6260c7a262f49ef1503cc88008809c193f1f949badcfbb01" + ], + "inputs": [ + { + "uxid": "52288a441c70260f6a3eab0e271969d54492377615a6fba8ec3ad26f11dc9768", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "734500.000000", + "hours": 198586, + "calculated_hours": 198586 + } + ], + "outputs": [ + { + "uxid": "e29ec214f4afd79e6465d03e4d88e552dc69654750a725d74873ee366c58e552", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "734400.000000", + "hours": 24823 + }, + { + "uxid": "d95d422fb8fe4ad9ce1052e566ec8a5ad7953ceb253366814b3d32e9a1da1f13", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "100.000000", + "hours": 24823 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 135 + }, + "time": 1430330591, + "txn": { + "timestamp": 1430330591, + "length": 220, + "type": 0, + "txid": "072f0738f834db0030d777e6ec0e0443627c51cecffcc55e41d43b0b8edd40d1", + "inner_hash": "e87dc97ec672bb45a3417f307e6f6a1cd75b26f508f188c0554484740ffea8cd", + "fee": 18619, + "sigs": [ + "da4e898bdf324ab50d8f007ee4c65ab832ba64cf86fd0a601e7007a4c3ac2eaa6f1304a3fc8088b108e3f417e5b7c90cbc7d80c059885d397ae978da89c92d5f00" + ], + "inputs": [ + { + "uxid": "e29ec214f4afd79e6465d03e4d88e552dc69654750a725d74873ee366c58e552", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "734400.000000", + "hours": 24823, + "calculated_hours": 24823 + } + ], + "outputs": [ + { + "uxid": "8ea58a3736b35f0e3781e94198e8b73bba2536704b84b15900fb32701db8893e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "733400.000000", + "hours": 3102 + }, + { + "uxid": "617b584bb9e6b1d80daac915fb3079b22a326777d1515a40e7b7eddf427f4099", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 3102 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 136 + }, + "time": 1430330851, + "txn": { + "timestamp": 1430330851, + "length": 220, + "type": 0, + "txid": "b9a795552bec1a722718b44a08ad152656242b1d23afb53d2247b3016d920b7e", + "inner_hash": "8096fec4a2738f5b79df5359724f6cd7597c0d8c5bc18419f5825c5312e1dac0", + "fee": 2328, + "sigs": [ + "315cc1de04ad6d1d68e9d63027cff2abc74d5b11a376623d70211ac0e8b9feed4c7f7952634d60b57604edfbe63f02bef172486320e9790d0bb6e44099d6473500" + ], + "inputs": [ + { + "uxid": "8ea58a3736b35f0e3781e94198e8b73bba2536704b84b15900fb32701db8893e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "733400.000000", + "hours": 3102, + "calculated_hours": 3102 + } + ], + "outputs": [ + { + "uxid": "a1ed39cded6d9a0605b52f25cbedb363e57a168d1ad1d1db437816a401c061ab", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "732400.000000", + "hours": 387 + }, + { + "uxid": "e00c292e151fdafd24984b2dc08a4a328150006f95afaac9909dbffae1f07eaf", + "dst": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 387 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 137 + }, + "time": 1430504186, + "txn": { + "timestamp": 1430504186, + "length": 220, + "type": 0, + "txid": "fc02772662176c282c2b6538732d3d6eb1399f006a0b52e64d07fc104038f638", + "inner_hash": "a7ef2323ca6ef0a15173dcc2ef44c0abd10933be70337360408ffb4087affb80", + "fee": 291, + "sigs": [ + "9a30550db56d9c9ae901d835f856761b9c4298d56ffa94bf41eff5550ac180851189f2adf2e184b6f23485a1405eacb2d4cc937ff05490fb0bc609e654effd7900" + ], + "inputs": [ + { + "uxid": "a1ed39cded6d9a0605b52f25cbedb363e57a168d1ad1d1db437816a401c061ab", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "732400.000000", + "hours": 387, + "calculated_hours": 387 + } + ], + "outputs": [ + { + "uxid": "f89c968840831d03abaf3c41cf8a405e4b4ddbfb19f5ba300a8ea8e4dcb1d9a4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "731400.000000", + "hours": 48 + }, + { + "uxid": "b6b6188973b600af774ad8a7b6d454f77713a51463b9a9a70c901ec5280a9789", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 48 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 138 + }, + "time": 1430504236, + "txn": { + "timestamp": 1430504236, + "length": 220, + "type": 0, + "txid": "9880bebc51471e0b3c520920db836d674f652503314cd74069a59ccad0d0967a", + "inner_hash": "feeb2f638e91dd685e6fe179edc7622ef3fcc8a5a7e795c07be12e03f221f67f", + "fee": 36, + "sigs": [ + "a0c15d7d5f36afc4c78045aae19c8d41a8652f0cb6d633622a1e55b4e54cd5a33113b02c24b02cca10797043d992aaac98bdbb33addd038611ac324795733c0b00" + ], + "inputs": [ + { + "uxid": "f89c968840831d03abaf3c41cf8a405e4b4ddbfb19f5ba300a8ea8e4dcb1d9a4", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "731400.000000", + "hours": 48, + "calculated_hours": 48 + } + ], + "outputs": [ + { + "uxid": "36972dc046829caa340eaecbfeb42f4174bcdecfb87296d56503e5fb10e9de8d", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "730200.000000", + "hours": 6 + }, + { + "uxid": "bceafc261a2250f1bfb8154aea88370acfe6a41a4216bcb76c2016451cbcffd1", + "dst": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1200.000000", + "hours": 6 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 139 + }, + "time": 1430504536, + "txn": { + "timestamp": 1430504536, + "length": 220, + "type": 0, + "txid": "578075959959db70ae86f4f60d2ae3ff245727d086eef86ed80db5e1c7c9fbaf", + "inner_hash": "eead8ec3c5e86e73f1e7add274fdbe0cecd5cd68c4fcd3cf17c1c7af9c5ee43d", + "fee": 6, + "sigs": [ + "d6331b6d3270100b8b009bbd343d6b82208d622b27ca3a4b371492b9c792f8433c981c57dfc760a3974f13acd86bbb24555b958e0c67e247c5a39d97295022d601" + ], + "inputs": [ + { + "uxid": "36972dc046829caa340eaecbfeb42f4174bcdecfb87296d56503e5fb10e9de8d", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "730200.000000", + "hours": 6, + "calculated_hours": 6 + } + ], + "outputs": [ + { + "uxid": "6962c7c1fcc98f532a9003990163bb251811a4700257968a641b1fe975cfc51d", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "729200.000000", + "hours": 0 + }, + { + "uxid": "278b0caa6dddf4ce74772471b15fb9a8c364362b0ae3eeb9379e980504d8d512", + "dst": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 140 + }, + "time": 1430504746, + "txn": { + "timestamp": 1430504746, + "length": 220, + "type": 0, + "txid": "de45a24c9c32f808a3d928f30ba8e1b6ef8117a7c0b7a5d616734d9b121d0c30", + "inner_hash": "efeb898fd032831cdd6d7c311f496f4c2622ee11bedc2831b6411cab51d44736", + "fee": 0, + "sigs": [ + "1646b02579d23e2350e2bc47340e027ad5f74bf55aba41fc1244631ba1e0577b681d364c3802017b5cc5d5fda972d23ac9bffabd6159384223a26aba5f08406401" + ], + "inputs": [ + { + "uxid": "6962c7c1fcc98f532a9003990163bb251811a4700257968a641b1fe975cfc51d", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "729200.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "d53fae3b48bde2d1328964a2e7f42e8e833983db159ba30f627926dea0db7df0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "728200.000000", + "hours": 0 + }, + { + "uxid": "cfdefd8d167947190a223882d20c8ac7880e550ad1a3494bb05bff4b1df4e3ff", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 141 + }, + "time": 1430504846, + "txn": { + "timestamp": 1430504846, + "length": 220, + "type": 0, + "txid": "16f8b9369f76ef6a0c1ecf82e1c18d5bc8ae5ef8b01b6530096cb1ff70bbd3fd", + "inner_hash": "529b1fd21087bf52cb3ebcf02dbe1e3ce5de9daefa9754e5b6cde7be2d8ab0c7", + "fee": 0, + "sigs": [ + "8612c9e160f3e0d7cdcb2adf3611bde867dcb766c63ec4312a9251ba9b6ea6997c0d9a6ce26beaae01e82c22d2b61e5ae7f87aeaf0679fde395888aebafde94500" + ], + "inputs": [ + { + "uxid": "d53fae3b48bde2d1328964a2e7f42e8e833983db159ba30f627926dea0db7df0", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "728200.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "228794e6b3eb69aecc5334e140afbad22883326dcf229bd3092f238ed9ec800f", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "725700.000000", + "hours": 0 + }, + { + "uxid": "908fe94bd28886547f1b7b4fc98d0990a08a216b70877341f566b6b4685de364", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "2500.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 142 + }, + "time": 1430504966, + "txn": { + "timestamp": 1430504966, + "length": 220, + "type": 0, + "txid": "030177271beee04f1a0974d0c5042f07c7ca1db1c5d496fbee3c441b1b7c5bee", + "inner_hash": "d954f0ee1a437cf3809961063145bb205633ac66d9a29e1386eddb13503ddac1", + "fee": 0, + "sigs": [ + "6e5661f0212dfa0800df968dac30f931335d7fe99d23932878d7d2c06bf69691328d66897c3a5c023535035ed95de3b396ea162e4482e70cda5ec9d4c8e36d4b01" + ], + "inputs": [ + { + "uxid": "228794e6b3eb69aecc5334e140afbad22883326dcf229bd3092f238ed9ec800f", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "725700.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "6efc30b4c943ba4de8d2c89901a0b2a4d9a0ecf34713917eae37c6debca616ed", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "724700.000000", + "hours": 0 + }, + { + "uxid": "18293d947aadf89d9e57d18fa01408867a9abe267504edbdabf8c2a57d9a6323", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 143 + }, + "time": 1430505086, + "txn": { + "timestamp": 1430505086, + "length": 220, + "type": 0, + "txid": "57150aecde96bde972183b9b0d7d27dda2c0179fb71630e92c27856d211335cd", + "inner_hash": "8fa5487fbcb62adb17287cc80ea02f113f036035e486fe7a37a96a98d32582b8", + "fee": 0, + "sigs": [ + "ba2442a6f68ef825f2921dc135eca398904426f8d225eb122b210670d1b3bf1b2279abcd5cce5c18533dd8ca0286b23e2be9605f1cb6a5820bc1c783e95b833401" + ], + "inputs": [ + { + "uxid": "6efc30b4c943ba4de8d2c89901a0b2a4d9a0ecf34713917eae37c6debca616ed", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "724700.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "6c8b1ba9dc7e8900b42d55e9fbe6ea0e00d7eaccf67a7b66c0a2b771cf88ea05", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "724200.000000", + "hours": 0 + }, + { + "uxid": "456bcb0a2e57a5c20f2757c8fc7669af1f969bb5a57f89965210daf7107993aa", + "dst": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", + "coins": "500.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 144 + }, + "time": 1430505176, + "txn": { + "timestamp": 1430505176, + "length": 220, + "type": 0, + "txid": "3bb9fc516dc2c522e28f99e6833253863c550547ce0e0a2dd963a0118b7a44a7", + "inner_hash": "111d56ae43b76740e905717e1e440f7611e922c50e83cf84b9edc51efa0271f2", + "fee": 0, + "sigs": [ + "18f2b86a6b51999f0fdc73d411c1db827730652ba2c098f1ff3f3dc0d409d6cf745d18d66bf25dae7e5a975e33f32e8d2b352c025a8e20ff15a68aaa60b1bbb700" + ], + "inputs": [ + { + "uxid": "6c8b1ba9dc7e8900b42d55e9fbe6ea0e00d7eaccf67a7b66c0a2b771cf88ea05", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "724200.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "59d44fefbe86ebae4118dee90609d6a1c08c36f259c65e3fad63b9e41c37bf0c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "723200.000000", + "hours": 0 + }, + { + "uxid": "d8ee5dc5cabcf179365345167d39977ae38a71e55cf357881258be32a45732bc", + "dst": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 146 + }, + "time": 1430641376, + "txn": { + "timestamp": 1430641376, + "length": 220, + "type": 0, + "txid": "5701965d326520f86335da87c6d1781fd49f1e66520b94e1783711eba724f482", + "inner_hash": "b792056beaf4a864c92e40ad63f9117fae52f4bfda9f88aa74f1255490c28ef6", + "fee": 6894507, + "sigs": [ + "1d98fdd17853e4265c17644a993fdbe5047418b7be96258fdf3c2b3e9c739b1d72c5acc23981dac2d478966834fafa1f98aab2402ce37fe818d3919cf490a5e900" + ], + "inputs": [ + { + "uxid": "59d44fefbe86ebae4118dee90609d6a1c08c36f259c65e3fad63b9e41c37bf0c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "723200.000000", + "hours": 0, + "calculated_hours": 9192675 + } + ], + "outputs": [ + { + "uxid": "5baf8c8ab1a01d80a6f496144815cf6bda5289b34055010e21324ea3950d3299", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "722200.000000", + "hours": 1149084 + }, + { + "uxid": "3dd82b00ef4d1e3b1c71be5f13c0c82b3e2b17af4a6b3eb4c966490f47866ccd", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 1149084 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 147 + }, + "time": 1430641536, + "txn": { + "timestamp": 1430641536, + "length": 220, + "type": 0, + "txid": "3fae944ef07d9bcba1bcbc8bde87da50a1232132074803f8442deb563ed2da51", + "inner_hash": "aeceb514529fcf9de954599318d804301689818b8d5c90cdbd3bdf6ce3768c47", + "fee": 861814, + "sigs": [ + "b6b837c14a65c31150c24f93ac60a9b49baeb963cf49a8d97e817883ca46a3763168988b69542c5a52b7501674271ded3888bccda558aad004902ab7b7010f5501" + ], + "inputs": [ + { + "uxid": "5baf8c8ab1a01d80a6f496144815cf6bda5289b34055010e21324ea3950d3299", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "722200.000000", + "hours": 1149084, + "calculated_hours": 1149084 + } + ], + "outputs": [ + { + "uxid": "dd07d759d92e3d628a35c467dcd919dcae825a9fa79a14855714270dae08c0ce", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "721200.000000", + "hours": 143635 + }, + { + "uxid": "3ec30639c24acce65054bdb0d7ab0539199b64cabfcad83c2ed7f266fb8849a6", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 143635 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 148 + }, + "time": 1430642006, + "txn": { + "timestamp": 1430642006, + "length": 220, + "type": 0, + "txid": "79681167a7681edecb998e4a6dccdd0b7be45f163c8f6db23436517936269fb8", + "inner_hash": "b06c37ee520387277d5c174e0fefb11dbbbee9c7ffe53715b7b5bab8f4693dfe", + "fee": 107727, + "sigs": [ + "150ffd203e65dac9dbfcaffb384a9233a274e0ced5a0c2fc9a3127e7a85df894124a5c1f0501c60640dce7d7c09cd1783ed61461f285fa89e6227ba1b427e81d00" + ], + "inputs": [ + { + "uxid": "dd07d759d92e3d628a35c467dcd919dcae825a9fa79a14855714270dae08c0ce", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "721200.000000", + "hours": 143635, + "calculated_hours": 143635 + } + ], + "outputs": [ + { + "uxid": "c739b518f3f700e810f81523d81b15f968fbf202f389ceaa9d9f303319a00275", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "720200.000000", + "hours": 17954 + }, + { + "uxid": "5233e499bd3e38ec4d4fa4d750290f25271c91b4903630d461be51f3c2c02ebd", + "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "1000.000000", + "hours": 17954 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 149 + }, + "time": 1430642106, + "txn": { + "timestamp": 1430642106, + "length": 220, + "type": 0, + "txid": "b69536fbec9911da41e9d0c5ca73459f5e692ba155f8b72c0972792e9937a0fe", + "inner_hash": "a6d1d92496583cefdf9a9d4e278cdeac9d8e7c31eec3061f0a91bc0116ced8e4", + "fee": 13466, + "sigs": [ + "d98168e1f19fbabcf0ec9fdf21d36486a2d70b13624bd2ec765bc773a08c7f5c09c7df2664e3205c7555bd3c5cb64ca78f5f0a81613ef4a7d740348e0132caf901" + ], + "inputs": [ + { + "uxid": "c739b518f3f700e810f81523d81b15f968fbf202f389ceaa9d9f303319a00275", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "720200.000000", + "hours": 17954, + "calculated_hours": 17954 + } + ], + "outputs": [ + { + "uxid": "95694746f813d018be7988aec666b52924a7815adabe9cbdac3f6ab0f51bd1ab", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "719200.000000", + "hours": 2244 + }, + { + "uxid": "eb57ec196fe95a09be19b62b6837d5d12f99568ad0e5e198f70f55083acd656e", + "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 2244 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 150 + }, + "time": 1430642306, + "txn": { + "timestamp": 1430642306, + "length": 220, + "type": 0, + "txid": "3e228564e3c187e22bd489857fdb1db7036021e19f688aad56cfee57d5e13ac5", + "inner_hash": "9b4783f4cd11a81e945a2d09b699f76254caa3bbf22ce8533f3b9f179c207702", + "fee": 1684, + "sigs": [ + "8bd5632a52c39ef9e9ce90ebabd119c8f93e32a5a5b6e8fe80c58163b4adcc040725f18321894b59c3546c8ce9fb182e1a4dd6a3b4405229635e3ac3d80213a700" + ], + "inputs": [ + { + "uxid": "95694746f813d018be7988aec666b52924a7815adabe9cbdac3f6ab0f51bd1ab", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "719200.000000", + "hours": 2244, + "calculated_hours": 2244 + } + ], + "outputs": [ + { + "uxid": "be958e5c47415291a781648335db24e448e1f4f09aa5e9c3f055fbc906b574d7", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "719100.000000", + "hours": 280 + }, + { + "uxid": "0fa23085def7c1dbc95587d3f0f58cbc30b09e099ee1afa42d9120452777740a", + "dst": "sV8sVBgs11uHQtZK5MPbYem2iJ6Hehghv7", + "coins": "100.000000", + "hours": 280 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 151 + }, + "time": 1430642426, + "txn": { + "timestamp": 1430642426, + "length": 220, + "type": 0, + "txid": "18607765c3fbd45eafa15d2d62ab3cbc7ba7bd80c42931aae4db75aa02898671", + "inner_hash": "dbbf7608b67e82363ced90b364a9b8c91029b336ef2b68182d986e399eacb41a", + "fee": 210, + "sigs": [ + "1972310d45a5baf10a8d929a132c725c51cdd19daae3baa640570aeadbb08ea700fbe46e6649289bec61065b05250b84872002f93634e6be81bae042cf80854b01" + ], + "inputs": [ + { + "uxid": "be958e5c47415291a781648335db24e448e1f4f09aa5e9c3f055fbc906b574d7", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "719100.000000", + "hours": 280, + "calculated_hours": 280 + } + ], + "outputs": [ + { + "uxid": "68165429853e18e4414ec6c15630262ebcaa802ff1d83b6cbe116db51cb32066", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "718100.000000", + "hours": 35 + }, + { + "uxid": "efcb1b5f54bceb2d0124d2f89c47d071c2943fb228c2eee62bfddf6e1418cfc8", + "dst": "pMub1Pz3SLVaSwHoomgp5oDVxdkVxLkW6L", + "coins": "1000.000000", + "hours": 35 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 152 + }, + "time": 1430642546, + "txn": { + "timestamp": 1430642546, + "length": 220, + "type": 0, + "txid": "dc10e0565a14dfecda066577581f3e2d073de34ed3e911ed94413d38fc0a33d2", + "inner_hash": "821dfa6422bb093a528a2ec2bedd0566599cef3e2f4f91441f3073888e092832", + "fee": 27, + "sigs": [ + "1bb9e5e58a4a7dfc9a29bb22eabb2ee4dc6e40dd71b35962adf95d1c1208309727f070257b4591e959a4965cb8d22710233dd1f65c3b58ec47bb71e3d7ebd3e700" + ], + "inputs": [ + { + "uxid": "68165429853e18e4414ec6c15630262ebcaa802ff1d83b6cbe116db51cb32066", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "718100.000000", + "hours": 35, + "calculated_hours": 35 + } + ], + "outputs": [ + { + "uxid": "46aeb9ea01bb04e28c55ef11f8e75434dbeee546f7e06bdef332c604590c48a1", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "717100.000000", + "hours": 4 + }, + { + "uxid": "c0548bf35c950a74c206d2c565e3bcac1f2abe170ebabdb7b74e439b642dd9fd", + "dst": "22WGCstVJGVyqnBuvGHt17L5aNNMpURvckd", + "coins": "1000.000000", + "hours": 4 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 153 + }, + "time": 1430642816, + "txn": { + "timestamp": 1430642816, + "length": 220, + "type": 0, + "txid": "b0d7ff47658b3e32d8457eb62f6df0c7caaf7feadcbf8cc0c713976026f0404c", + "inner_hash": "5154559a3393277ed8db279bf27a9572c9aeebe81f321d9fb07a5e4313005a90", + "fee": 4, + "sigs": [ + "a3edf9a3203fc696aefde6180d6c28fbaf3f4ee662ea90d82a93c3a8485593465f956713abfea8322b952d61969b29267f3826775638da77a1bf8567a40564e500" + ], + "inputs": [ + { + "uxid": "46aeb9ea01bb04e28c55ef11f8e75434dbeee546f7e06bdef332c604590c48a1", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "717100.000000", + "hours": 4, + "calculated_hours": 4 + } + ], + "outputs": [ + { + "uxid": "598503902d2e6cb62d6f6478f09d8da05af6fd2da92b50825da3b7f74b2df34c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "716100.000000", + "hours": 0 + }, + { + "uxid": "045dc2e76321e37884588093083ce1b21be12f20ba1fa36f2a755b894229e3cf", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 154 + }, + "time": 1430643706, + "txn": { + "timestamp": 1430643706, + "length": 220, + "type": 0, + "txid": "be0957035ed2ac444f67273fc5c1c6a39ee373f6f83d1604d0023742a8cd7e42", + "inner_hash": "957140523c9acc14a4f6b6a2fd05e70c58d2ed51f43b4e88b1406b398f4e7b2e", + "fee": 0, + "sigs": [ + "ee25ac881aa867780086df4716864a9ec524deeecc140faa60b9f9b87805816c22659836b5169f8eab0977a2337638b6ed7cd7c4a5d4ee3664e7ad28e91dd5b901" + ], + "inputs": [ + { + "uxid": "598503902d2e6cb62d6f6478f09d8da05af6fd2da92b50825da3b7f74b2df34c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "716100.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "4b917e7bd3409c43f9f670f2846ce74f9288708df5aa1d9ae142f2411ce426da", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "715100.000000", + "hours": 0 + }, + { + "uxid": "dbc58940c2457359501c9906589c3d0a0ab7695b983ad79f2bcc087a675671f6", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 155 + }, + "time": 1430643906, + "txn": { + "timestamp": 1430643906, + "length": 220, + "type": 0, + "txid": "c9582c8134fa64fdf08cd93d42035adcced3f16aa8ee1a1393e3fcd7c07aa40c", + "inner_hash": "ecd6b0cab28125e3ec1fe23a046c259a7d608802da7d6397dbd8b410de03b94d", + "fee": 0, + "sigs": [ + "95e5d5d0856bf5387de8fbdae05f5953510fd85ec346e65fa5fb68984bdb1ab83aa7807e57f00354d934f84a0034ecf8aa74fe3b8e9e480021873f62827770ab01" + ], + "inputs": [ + { + "uxid": "4b917e7bd3409c43f9f670f2846ce74f9288708df5aa1d9ae142f2411ce426da", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "715100.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "d50a372f8f8cd1e0b10d847613b68ee760f195f5f212d6c59e86312c84dd07ac", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "714800.000000", + "hours": 0 + }, + { + "uxid": "25a72cc385c1cdabd0ffd7c141ae205d767f3d016c281f835b9f58f9325bd2a5", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "300.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 156 + }, + "time": 1430644036, + "txn": { + "timestamp": 1430644036, + "length": 220, + "type": 0, + "txid": "29a883ef9dc67bc683014187b9865c827b5e2f8afd7bf6f3787483318063789e", + "inner_hash": "bf3a81668fb27c0f55d9ec33490cb4c91ec7636ec1f85761fadbfebc020a618a", + "fee": 0, + "sigs": [ + "970a22ba9a849caf00fc787a182dd67a3be794db9d66c691e9d904a78f90397542dee63e801c8b7f4077060fda76f0ac56a67b30865cc4634679f118abe04fc101" + ], + "inputs": [ + { + "uxid": "d50a372f8f8cd1e0b10d847613b68ee760f195f5f212d6c59e86312c84dd07ac", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "714800.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "896865f9b610f9fb69a741596b3ecb9fff3790d40476a9f7852831bdf477aaee", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "713800.000000", + "hours": 0 + }, + { + "uxid": "a34cfb6f175323917dfda72d58ddcfb86363cc43d22a0c6c3141810f5cac5aa6", + "dst": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 157 + }, + "time": 1430673946, + "txn": { + "timestamp": 1430673946, + "length": 220, + "type": 0, + "txid": "c3fd04cd27ea311b1a67d40cd3dbb2ea8ae2c6f6139620cb86be29f33ed99171", + "inner_hash": "5a975ee4a0f95c51a0a847b1d082bc4859a4b7904acbaece151c58e01f26a870", + "fee": 0, + "sigs": [ + "06c22eb6cb03468010ffbd2b54faa5835ea44cf552779b0adb09817db7e5494d49031d2e4b8994b670857b193766a1f430857955edd627f290f71f970407139b01" + ], + "inputs": [ + { + "uxid": "896865f9b610f9fb69a741596b3ecb9fff3790d40476a9f7852831bdf477aaee", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "713800.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "272d5bbd86a87796a20e3e4debc46a2076718800343bee4f72fc0217a98a10a3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "695800.000000", + "hours": 0 + }, + { + "uxid": "25130a18aca13a37e4f4c08733cdda6a8629759f27ecba775999486c9deffa5e", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "18000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 158 + }, + "time": 1430674696, + "txn": { + "timestamp": 1430674696, + "length": 220, + "type": 0, + "txid": "3d9f1aa1b6206275081cb9c26155f6261be1ef9c94b4eaadb1a7e8277a2099fa", + "inner_hash": "ef7915c2cc32cfd043bf60533a563a89ee68a7b2f88e9e1e55e6a54494bde805", + "fee": 0, + "sigs": [ + "6d2993d471d4b27d4b0c2beef286dab7e38013853926fef032a8a10d9161fbff59b4eba58d7578182f9f1e79ee763ab409aec46748351b0a7d1a020a3fe3824100" + ], + "inputs": [ + { + "uxid": "272d5bbd86a87796a20e3e4debc46a2076718800343bee4f72fc0217a98a10a3", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "695800.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "60906201d3e7c67ddb976972460b2b8ed093e1f6720a784cbaea376ca13e6cef", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "670800.000000", + "hours": 0 + }, + { + "uxid": "c61f27a2247831679d8df293bf9351b16e8429778c875be2cb64224bcb842ed4", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "25000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 159 + }, + "time": 1430715196, + "txn": { + "timestamp": 1430715196, + "length": 220, + "type": 0, + "txid": "d720ca0efb19b964f481724e5d3f932841e9e75a69b998baf4b575cf3298cb87", + "inner_hash": "b35da2487dfd396bc01b5296fab691557760886b23ba5bd18e52808549dbfef2", + "fee": 0, + "sigs": [ + "9cb0a128d17a9c42f3e4e44f4da9106ef11407da8d9a434745add4c5f7a8e379325976d8c2222c3328acdc2c6ca597fab4fae292c5529e07c55919ce0e0320ca01" + ], + "inputs": [ + { + "uxid": "60906201d3e7c67ddb976972460b2b8ed093e1f6720a784cbaea376ca13e6cef", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "670800.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "4912e9dbbb5a4cc7472c27b0212ab443e7b5499207b10666a66257005e182714", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "664464.000000", + "hours": 0 + }, + { + "uxid": "b1e5c694c30326cda3df2e634723999befbcbb141415e9a36bdbf18d7bea9870", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "6336.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 160 + }, + "time": 1430784172, + "txn": { + "timestamp": 1430784172, + "length": 220, + "type": 0, + "txid": "0e8e352b1f2cd419bca619918ce6d5ec1eac0ba7252d76eef5d9d8f8186f737a", + "inner_hash": "49571d7e7c6b3e473b938f1cf4748c67f9301ca710f26ee56d0d8e231cb4515f", + "fee": 0, + "sigs": [ + "8d4556a22c5fb84792cc88bfb47f795e6ba9fc211933776acd89b6da9aff71ea7803bf5b0e1d9afef2f3f77bbc4a7633c459ab9cb11a06723c4cad570717edfd00" + ], + "inputs": [ + { + "uxid": "4912e9dbbb5a4cc7472c27b0212ab443e7b5499207b10666a66257005e182714", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "664464.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "659bac1636b64087ad5d3cb0ae78c52f28ad920016ec67e08415a537e0343072", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "663464.000000", + "hours": 0 + }, + { + "uxid": "ea18f151bbdb611f73596b61ebb0546b9e91281ccb0bbe07a18e7fa69142bb5b", + "dst": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 161 + }, + "time": 1430784312, + "txn": { + "timestamp": 1430784312, + "length": 220, + "type": 0, + "txid": "d5091ca65ff61998dfb4535a7927fb736abf2a81140a11322dcf8226de27cf92", + "inner_hash": "7a000aaa5751b65d3bccd4d307b7b8602aae539971de3af3baa3e126d52a54f2", + "fee": 0, + "sigs": [ + "693d3153218a69e2ef1e676d6c124dd7fab7ee312d41fd9dbe005a0e681a8b052708a9559fc08e8173e1ef83e45f838742e4a1af765ea7f0fddb38cee2cced8000" + ], + "inputs": [ + { + "uxid": "659bac1636b64087ad5d3cb0ae78c52f28ad920016ec67e08415a537e0343072", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "663464.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "97f64c3c636e5fc997e277cd48644055ef51045ed9c473c05dd6e699872a6c3d", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "662464.000000", + "hours": 0 + }, + { + "uxid": "0c19e689e0e34639c71b0136ce336121b042b6d4ac185ac1f9e94ec7535e781f", + "dst": "XnKU1htBL5wFSMX8oytZBsBMeaBSbVNivT", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 162 + }, + "time": 1430784372, + "txn": { + "timestamp": 1430784372, + "length": 220, + "type": 0, + "txid": "30e66ff45cfb145eb465e2ebdef0bb10005138bc1727c83888785b04d548e85b", + "inner_hash": "c87fb6e81fc1d99b16958d4626aa0e5ec4033443230bbc8b35e2882c078bf868", + "fee": 0, + "sigs": [ + "b4feadec09b450b99795044931a94f7b8549bf876db7c62132df60056dd0c88e3821d1656407b1572fbb04eb71f6de57db43c997501989f44042d04fc3afdf4201" + ], + "inputs": [ + { + "uxid": "97f64c3c636e5fc997e277cd48644055ef51045ed9c473c05dd6e699872a6c3d", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "662464.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "122b7a9a61ee04e071002d74ffb26b12ed7952ff9a138b5437f990f4678cc2e5", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "662314.000000", + "hours": 0 + }, + { + "uxid": "db7a63750db787959a9e0d2d6be9a1ba8bb3d6015bae2353a27ae9eb55b39d22", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "150.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 163 + }, + "time": 1430784932, + "txn": { + "timestamp": 1430784932, + "length": 220, + "type": 0, + "txid": "ec79854fade530d84099d5619864a8e1e8ec9d27a086917a239500cada43c6e8", + "inner_hash": "ed6a317c8ea3624337463c1cca78bdcf87bf80dace1bccad050d27a49d3ea1d2", + "fee": 0, + "sigs": [ + "c0548625b3bc88308155f598c3304a124632c0faef8005b8f9306b229b632b253c5e163a02409ba40b01560f77a6acde2ccc48cb0efedd4feb68ecbd925917fa00" + ], + "inputs": [ + { + "uxid": "122b7a9a61ee04e071002d74ffb26b12ed7952ff9a138b5437f990f4678cc2e5", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "662314.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "c07593d4329f82da243e4bbd7430e4b10e7b35f9ce0a3718d0e6d25d20b4939b", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "661314.000000", + "hours": 0 + }, + { + "uxid": "250543215c71a1a9ab7740fff25c3bf9695fcde10bceba3717aef9d0f6dd40d8", + "dst": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 164 + }, + "time": 1430790052, + "txn": { + "timestamp": 1430790052, + "length": 220, + "type": 0, + "txid": "743bf1eede313145824db1c4f8d683b74ab5e0bc825082d986308b73fd52f1d7", + "inner_hash": "a0427c37a8ca9f8205630cc8d4c6d95200413d3397a0de9bf015763107b8fc80", + "fee": 0, + "sigs": [ + "dc400e921f7f94da5f353846f1340e039b4527fff121a56579390fb4fa4154634e3b3aad44ddf0aaebea5abc1dc5ba2a00540fd2888ed5c4ab7b20c51255086a01" + ], + "inputs": [ + { + "uxid": "c07593d4329f82da243e4bbd7430e4b10e7b35f9ce0a3718d0e6d25d20b4939b", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "661314.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "4d52106e41dba0099549fd81fb8feb6915225b0125c53faa0f7c578ea78f213a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "660314.000000", + "hours": 0 + }, + { + "uxid": "bc513a68461d5c401e65a500baf7dfa163735ef63b817bb7b73c4139d5c29d18", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 165 + }, + "time": 1430790152, + "txn": { + "timestamp": 1430790152, + "length": 220, + "type": 0, + "txid": "3991a257eee265481e713917a3a9c15756f61175bcfc7acfdbe84158e43fd5e6", + "inner_hash": "dea502923be2dd8b4c48eb7ed2b146793ef840e9749d129bf7f6bda0fdcc43de", + "fee": 0, + "sigs": [ + "dbb23f6d22438c10b98b437fe2ee4d7c5513aba7b0b6141648ac22f07e3768fc5d8d80f9dbcaa95edf925668b6018793a01ca70cf7b48d7c7deac106557ebf7f00" + ], + "inputs": [ + { + "uxid": "4d52106e41dba0099549fd81fb8feb6915225b0125c53faa0f7c578ea78f213a", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "660314.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "fef9dd3b633274743099e607d9229717a001d6de6a4031479cc30d31d65e8396", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "659314.000000", + "hours": 0 + }, + { + "uxid": "5954742a6ca4e3e872d12d4a93436451ad52e6d25e5ac28371e308b2d7ce75a3", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 167 + }, + "time": 1430791902, + "txn": { + "timestamp": 1430791902, + "length": 220, + "type": 0, + "txid": "b29222c08f10b8bc4ea18981519a3b0e02b9c9cec63ee28d9ffa2efcaf2a8e5a", + "inner_hash": "61c38575be160010335d96cf7c6ef0608cdb7b85079f2518532d00b6f42f13d0", + "fee": 201915, + "sigs": [ + "cb5c75671164755516cbf4d94e2288d56985b4d3113538bc818d1aa1c944a76b1beae28964c8e596ab0cd252cda6cf2a5468cbd0dbeff21e35609b5a6577eb0a01" + ], + "inputs": [ + { + "uxid": "fef9dd3b633274743099e607d9229717a001d6de6a4031479cc30d31d65e8396", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "659314.000000", + "hours": 0, + "calculated_hours": 269219 + } + ], + "outputs": [ + { + "uxid": "21f0fb666dca05d7a43ab26a378f7f7eaedfacde22fa047ca72857e9509cc748", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "659214.000000", + "hours": 33652 + }, + { + "uxid": "0b5e5259c276ac949de97062492ea6dc93ae6215c8dd1615862907e3c3ae9cf0", + "dst": "2A2YC8kxWnUDbscpzZ6UPfNAmx5ddKBeYNs", + "coins": "100.000000", + "hours": 33652 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 168 + }, + "time": 1430792072, + "txn": { + "timestamp": 1430792072, + "length": 220, + "type": 0, + "txid": "50fc81b0ba25669105a169a969459ccdb10278051b604a3f91467c2528c83652", + "inner_hash": "c356824e25deeecd3f531eb56a26d5875b7b81743e9c8f3d6beff5f634bf5e3f", + "fee": 25240, + "sigs": [ + "ac3b968f82649fac3822db1af5c0be17fc20cf86e091362b1584a2b66c033b10541f70fb6f55d8e1b3c57161ce37412a52d2009dd8abc9ef7ab038b19d8d644401" + ], + "inputs": [ + { + "uxid": "21f0fb666dca05d7a43ab26a378f7f7eaedfacde22fa047ca72857e9509cc748", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "659214.000000", + "hours": 33652, + "calculated_hours": 33652 + } + ], + "outputs": [ + { + "uxid": "6b3a0cab1d9ad6fd011a3bac5e6ff4e3f7903bce911dc7fe83926eae557c34c3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "658214.000000", + "hours": 4206 + }, + { + "uxid": "a02148f770788851a35fb90567510044e37f8db930deab7a2b584af67c8efb2f", + "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "1000.000000", + "hours": 4206 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 171 + }, + "time": 1430870562, + "txn": { + "timestamp": 1430870562, + "length": 220, + "type": 0, + "txid": "fb495093f2f4e5c6555c50150ea60c0a6f430e53aa971ebb3e2b5412866a1f06", + "inner_hash": "05596340e51ad628080101c8e92a60f27e0f5ab509e892f9b65a0988b1575ddb", + "fee": 6084778, + "sigs": [ + "068a56e916267a1756d9348bb965f3ed2dcba956fe4c626cd4836921dd836f7c0fa923d6451d5c87aa2eab528ff19ec332434bd12e197eeafbf0896e84940c4401" + ], + "inputs": [ + { + "uxid": "6b3a0cab1d9ad6fd011a3bac5e6ff4e3f7903bce911dc7fe83926eae557c34c3", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "658214.000000", + "hours": 4206, + "calculated_hours": 8113036 + } + ], + "outputs": [ + { + "uxid": "372703f8109295f0f58fbee58795979e10dd887869f4fc1da4881ce8a3c0aeb4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "647750.000000", + "hours": 1014129 + }, + { + "uxid": "a35044035cce79cb988c757dcaf5d9a065957c0fbc1a3559d08ed46831504fc2", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "10464.000000", + "hours": 1014129 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 173 + }, + "time": 1430871512, + "txn": { + "timestamp": 1430871512, + "length": 220, + "type": 0, + "txid": "a7665cec98224150968ec1ef9ef2d6b3175c9de8f9f8c7bc786b30cc74997c57", + "inner_hash": "5bd2503c4ff78e7c9d182bfe5e62e54f1bfb944bb526d97b272021d8ccfa9359", + "fee": 764646, + "sigs": [ + "dbd1e8763cb9681aeb96edc0c8483decee30b670778bec88da249f9d4f2201c330d2a16349608ba51eb8a387805dce9618810c4e6fd7af548cccee7d2c9c5dd201" + ], + "inputs": [ + { + "uxid": "372703f8109295f0f58fbee58795979e10dd887869f4fc1da4881ce8a3c0aeb4", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "647750.000000", + "hours": 1014129, + "calculated_hours": 1019526 + } + ], + "outputs": [ + { + "uxid": "14027340f6e1d98bba3f7f5f3b50e3588f8a19e4d021db944e7a28b2643640e1", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "635750.000000", + "hours": 127440 + }, + { + "uxid": "793f3f0e41c9d1de391d864792b79ed8c24dde5ff84a73c161d660a73ed70c90", + "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "12000.000000", + "hours": 127440 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 175 + }, + "time": 1430908702, + "txn": { + "timestamp": 1430908702, + "length": 220, + "type": 0, + "txid": "9364ed6cfcc289df74dc6bac1993f7ab3441b898cb3f06918198d2476c83dbac", + "inner_hash": "a55922b0495d39c8e9db70ac9aca99266d5a7f3644106b4b5468345d955acf41", + "fee": 110149, + "sigs": [ + "cecae09b7925e9f6db1ccf5ef9a93687a43bbeaefe2888abcc07411c71f850c80c05ed573abd67bf9f0e8a096a1aba8187547e3d062e5ed147ac51961cc3559701" + ], + "inputs": [ + { + "uxid": "14027340f6e1d98bba3f7f5f3b50e3588f8a19e4d021db944e7a28b2643640e1", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "635750.000000", + "hours": 127440, + "calculated_hours": 146865 + } + ], + "outputs": [ + { + "uxid": "8e55f10a0615a0737e6906132e09ac08a206971ba4b656f004acc7f4b7889bc8", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "625750.000000", + "hours": 18358 + }, + { + "uxid": "d91e07318227651129b715d2db448ae245b442acd08c8b4525a934f0e87efce9", + "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "10000.000000", + "hours": 18358 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 179 + }, + "time": 1431339429, + "txn": { + "timestamp": 1431339429, + "length": 220, + "type": 0, + "txid": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "inner_hash": "db98f515ce6c3d99fd7c39a6ac59ab498b1a2cc8fc6a13377ac7d3d463898e7c", + "fee": 33129894, + "sigs": [ + "1ca18424c9a313e9c253aecaec3c532c35c60e454f026a3d2794c772bc74a19809d53f8862962e865dd822dd054cd7f32b89b810968d95c9db6a9a0c1095390601" + ], + "inputs": [ + { + "uxid": "8e55f10a0615a0737e6906132e09ac08a206971ba4b656f004acc7f4b7889bc8", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "625750.000000", + "hours": 18358, + "calculated_hours": 44173190 + } + ], + "outputs": [ + { + "uxid": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "hours": 5521648 + }, + { + "uxid": "01f9c1d6c83dbc1c993357436cdf7f214acd0bfa107ff7f1466d1b18ec03563e", + "dst": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "10050.000000", + "hours": 5521648 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 181 + }, + "time": 1431757585, + "txn": { + "timestamp": 1431757585, + "length": 220, + "type": 0, + "txid": "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947", + "inner_hash": "f8293dbfdddcc56a97664655ceee650715d35a0dda32a9f0ce0e2e99d4899124", + "fee": 34297581, + "sigs": [ + "3981061c7275ae9cc936e902a5367fdd87ef779bbdb31e1e10d325d17a129abb34f6e597ceeaf67bb051774b41c58276004f6a63cb81de61d4693bc7a5536f3200" + ], + "inputs": [ + { + "uxid": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "hours": 5521648, + "calculated_hours": 45730107 + } + ], + "outputs": [ + { + "uxid": "8f9c09c37e0c636178e4229e2e8212c067ef0a8c501be9e2757a97b980d7a98a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "605700.000000", + "hours": 5716263 + }, + { + "uxid": "32a060b2e2025cceb40f3f982c887952d3358d468db1719dd892eab575c14c14", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10000.000000", + "hours": 5716263 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 184 + }, + "time": 1432327272, + "txn": { + "timestamp": 1432327272, + "length": 220, + "type": 0, + "txid": "a230d5b5b745bb51d40e86b11e6508dc84a486f5ffd3584b0d45818ab8520802", + "inner_hash": "e6acee381aaefcd94f28b3a7ef5e6c34232fd5e78e96816d71c9c60248d6c5c6", + "fee": 25433321, + "sigs": [ + "2e70883dc210920e639b5f22efd820a5f04b5290bc65b6ef4c52cd6283ef7a2e580fec499d33a71700a61dcab9200ee09a08a695affa9c12ef00d6d07cb0164001" + ], + "inputs": [ + { + "uxid": "8f9c09c37e0c636178e4229e2e8212c067ef0a8c501be9e2757a97b980d7a98a", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "605700.000000", + "hours": 5716263, + "calculated_hours": 33911093 + } + ], + "outputs": [ + { + "uxid": "d620b98b74f27e2afc0fcd750037de5d157666d2dae15817348059d23ec97f52", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "565700.000000", + "hours": 4238886 + }, + { + "uxid": "d66dad2d285942e38e13fd5d921cd142e86489a16b0f83ece7249e72704f6536", + "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "40000.000000", + "hours": 4238886 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 190 + }, + "time": 1433229543, + "txn": { + "timestamp": 1433229543, + "length": 220, + "type": 0, + "txid": "655651b51d288fae2ca80dd8231fbc8927e7f0203d698bdf0dc47e1e9c63652d", + "inner_hash": "472ae342c5dcb47ec7cf0b63fba1414d5e4a32c63e974ce390d55fb668972151", + "fee": 109513205, + "sigs": [ + "7dfbaddfb6b73fd84f23644a755c025b8480ab8754ad2e1a1c95d53ff52ed87e45030465ead44995235678e6e53ead91926da4af940367bef53ba7ae229edb7901" + ], + "inputs": [ + { + "uxid": "d620b98b74f27e2afc0fcd750037de5d157666d2dae15817348059d23ec97f52", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "565700.000000", + "hours": 4238886, + "calculated_hours": 146017605 + } + ], + "outputs": [ + { + "uxid": "30e062105d7ef8c4981932d80d904bee2270c238bc36a6532a8917cce05f17b4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "565100.000000", + "hours": 18252200 + }, + { + "uxid": "8cb546636d5039df6d4bda41a10322ea6dcd0fa0c766d3e2f45a6f30040765e0", + "dst": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "600.000000", + "hours": 18252200 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 192 + }, + "time": 1433331745, + "txn": { + "timestamp": 1433331745, + "length": 220, + "type": 0, + "txid": "cff22d57daf828015489bba3b01538369f5627cc89ad0f139261bb0be0dac4a8", + "inner_hash": "4fd9cd0aab064ef8cf67e2b6b0102aa1cd4df52cf60b00206cc7b5619bcf5acc", + "fee": 16746812, + "sigs": [ + "36a79d8ce7050bf1df11c9e839ecbb75f889161c7f3a81539a5da630953dad30159d0db804123c48f3bcabe2314887614bd57be64f951f7162ffc08f5810d23101" + ], + "inputs": [ + { + "uxid": "30e062105d7ef8c4981932d80d904bee2270c238bc36a6532a8917cce05f17b4", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "565100.000000", + "hours": 18252200, + "calculated_hours": 22329082 + } + ], + "outputs": [ + { + "uxid": "32463caca7ea96e2fb3fb03502b29513bb9e6385cb6097c4ba411ea808b6e5e1", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "564100.000000", + "hours": 2791135 + }, + { + "uxid": "79fc203078f4a201ed7bfb09977a75a5b22794645606aef22824d3fda9285932", + "dst": "2fcUG6oQSsaWZK9Crqkh6LzGfZexqUqtHWg", + "coins": "1000.000000", + "hours": 2791135 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 193 + }, + "time": 1433334775, + "txn": { + "timestamp": 1433334775, + "length": 220, + "type": 0, + "txid": "1b83454b4e61348b9c643815c26350b4e34796170593895961f329a759cbadf8", + "inner_hash": "d551018fa96bcf1df6ae0136f75bfb5db002e6e41723fa80ab4fb5a1857bfcde", + "fee": 2093353, + "sigs": [ + "9c02e3b3c6cc517badf9a4408bb9bf9d8d72fad0e2cc3f04f2e176bcfc2a7fee1b4740c4bc4eaa4ae008a9a18eda3f0cace91199613b14d2c34178cca1ac8ac500" + ], + "inputs": [ + { + "uxid": "32463caca7ea96e2fb3fb03502b29513bb9e6385cb6097c4ba411ea808b6e5e1", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "564100.000000", + "hours": 2791135, + "calculated_hours": 2791135 + } + ], + "outputs": [ + { + "uxid": "3fa8d60e34b1195ee24fde2c4594b8c0eaf06cb114b395bbce6bebeeccf709b6", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "561700.000000", + "hours": 348891 + }, + { + "uxid": "6a349ba12c5d2827de6c24773d3dd8f6572e86adba4c8954a6d6e68df9e165e2", + "dst": "PRXLNyB64cqaiG4pCoFZZ8Tuv7LWYPpa7m", + "coins": "2400.000000", + "hours": 348891 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 195 + }, + "time": 1437050608, + "txn": { + "timestamp": 1437050608, + "length": 220, + "type": 0, + "txid": "fa7a60f6d4a22404e28ce9d1600442c19237552d8678bd610793cb8e6b3353d4", + "inner_hash": "cc33e2831789b20ec4eb187a6b44a9f772aa243f3f5f6262cb46087a0a6ac3f5", + "fee": 254679355, + "sigs": [ + "9b8e90365377deb3da537fdda4653f117c1c7de525b611d9d07f23139b5d4c642af80ad70779aa012b6399e73af8e08e87952f085edf8060f0832635e3244cb400" + ], + "inputs": [ + { + "uxid": "3fa8d60e34b1195ee24fde2c4594b8c0eaf06cb114b395bbce6bebeeccf709b6", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "561700.000000", + "hours": 348891, + "calculated_hours": 339572471 + } + ], + "outputs": [ + { + "uxid": "ac638ce4f15f749b3ef4168fed59a9ae0e8b5f8894b27b151fae31af102d245a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "561600.000000", + "hours": 42446558 + }, + { + "uxid": "054e39b1d37f10a4e1ee6598d66bd7cdd8f97b5ef0de2666120ef710c053af98", + "dst": "2Rjx22U3oDAv1sK5kNRGbr8ohLZPf7tY5Qa", + "coins": "100.000000", + "hours": 42446558 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 197 + }, + "time": 1437051128, + "txn": { + "timestamp": 1437051128, + "length": 220, + "type": 0, + "txid": "b18ed75097ed7910315e3be9042c0ca0b734d30a1afb8f9346bbe18acddd3a8a", + "inner_hash": "847e1acbed683214ad9e0fe164204db0ae8f2ce1cc420cb25aa63c76a4739580", + "fee": 31868850, + "sigs": [ + "523ef82bcc586c5c885ca0fc7f2ffe5057573556a8bfaa3d9eb30b6316e698e93ac11a9e0d8a3c2a8ace763d80edd8e059153b61a4a35fa6f0b214d8ba0c485d00" + ], + "inputs": [ + { + "uxid": "ac638ce4f15f749b3ef4168fed59a9ae0e8b5f8894b27b151fae31af102d245a", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "561600.000000", + "hours": 42446558, + "calculated_hours": 42491798 + } + ], + "outputs": [ + { + "uxid": "6d453ceff872a65be937598159fac754390c00e7731cc73c72169c476d1625c5", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "527520.000000", + "hours": 5311474 + }, + { + "uxid": "bd55382fd8ca5b623b167dd7180ee0165eca5e74a6b2be453536ce8b5e1231e0", + "dst": "2Rjx22U3oDAv1sK5kNRGbr8ohLZPf7tY5Qa", + "coins": "34080.000000", + "hours": 5311474 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 198 + }, + "time": 1437139506, + "txn": { + "timestamp": 1437139506, + "length": 220, + "type": 0, + "txid": "cd6fae6c021e64768cbb2e0a17ec6853db94b5dde52b417f872371dc3c24a27f", + "inner_hash": "8dde5734f617c1313288ac9d1b762a7d1e88b68846945b83c35935bcce1fdd8a", + "fee": 3983606, + "sigs": [ + "1221df811e418338ca156c42fc881d1cd7384b819a6683d4a54ab6e78521e32761452bcbb7ad856fa345a8f80c6206b19bd178c09975b87180f86448994ba07c00" + ], + "inputs": [ + { + "uxid": "6d453ceff872a65be937598159fac754390c00e7731cc73c72169c476d1625c5", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "527520.000000", + "hours": 5311474, + "calculated_hours": 5311474 + } + ], + "outputs": [ + { + "uxid": "bd9c90d1c11fd00392db236d4c7fc06da07806c1676e4cc6df25c9df35e75d9d", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "527220.000000", + "hours": 663934 + }, + { + "uxid": "42ec7e7302b1464d94e99c7b842e477d10e55328257aa5d1987052a3bdcc8690", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "300.000000", + "hours": 663934 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 200 + }, + "time": 1438939186, + "txn": { + "timestamp": 1438939186, + "length": 220, + "type": 0, + "txid": "2e05ca5b53cdaf3d65102aa6a4a707a324e5bfa7fa46e9b3b7328d1e0363822a", + "inner_hash": "08832259284fe4965625e2ef97d1ff3b40d7832b159b3d5369fc086ebb95479f", + "fee": 47086261, + "sigs": [ + "820dc5d47540b0978818356b512731ae47517c061a1b660e7fd47e8f3d6420700377fd2ec04b618504cd3dadf642111df2f6c1f6edf2a4067fd460c69e8eb07301" + ], + "inputs": [ + { + "uxid": "6c34016037cd17622846e71bc635914d4d8f256c147aa5a0b84a896e83229480", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26400.000000", + "hours": 64785, + "calculated_hours": 62781681 + } + ], + "outputs": [ + { + "uxid": "6e4110a8ed6f2b8b8772516466032a99b4851de65cf9ce1b5c5673946b7408a9", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "25400.000000", + "hours": 7847710 + }, + { + "uxid": "50e534ebc9c3f0b99461ad70b01d415eabfc046e824a5d1ba46854c913928612", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000.000000", + "hours": 7847710 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 225 + }, + "time": 1440298886, + "txn": { + "timestamp": 1440298886, + "length": 317, + "type": 0, + "txid": "5a348a2f9d4e70f1f0d68fa9abc66d8eb4adcd45942c89d79a4121033e7dfc39", + "inner_hash": "a282319ed05751e5df08ece9dfe9fdcc73ee03b3efa2227c78ed1fd65a072c23", + "fee": 344422847, + "sigs": [ + "c2e5060c13dbcbe8bd76cbe8d7fa2aab8a8738bc6b1c1acf50366f211cbda18611feb1e218df129d1e6a6f957310ad08a139c03555d6ba2b99f52fd988e0a96800", + "90ed23dacf21e05817442155cf7ae9867a9531ee0e1c4b575caaec7c65ede2f73344e1b12e093b4d1ebb11e457f066560d1a280cf8cb48fbf7e937202c329fa001" + ], + "inputs": [ + { + "uxid": "bd9c90d1c11fd00392db236d4c7fc06da07806c1676e4cc6df25c9df35e75d9d", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "527220.000000", + "hours": 663934, + "calculated_hours": 451028438 + }, + { + "uxid": "50e534ebc9c3f0b99461ad70b01d415eabfc046e824a5d1ba46854c913928612", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000.000000", + "hours": 7847710, + "calculated_hours": 8202023 + } + ], + "outputs": [ + { + "uxid": "75323e65eec723bb62819835a2e9ae9d7aff770fcf076dd0325e03abec471bb9", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "518220.000000", + "hours": 57403807 + }, + { + "uxid": "44233d76c4cfcf6d45efd339ea004c41a3c21f5e9b1919484f4256c53e8aa5a7", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10000.000000", + "hours": 57403807 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 226 + }, + "time": 1440299046, + "txn": { + "timestamp": 1440299046, + "length": 317, + "type": 0, + "txid": "e91d2553c18538d90847e7d432c75978abb0f6f84edeea2f942d018e7306074b", + "inner_hash": "e16c45b163f87caefb9d231d4608e6a9b67b5d379a7bff3aebd6587cfa349df6", + "fee": 86105712, + "sigs": [ + "cdcc51cad962fa4c6da30a44222c1a7d91501d07ba358c5a017b1105ec6f95091ba4ed430a95220492b228cd1b48a74f19c08ef550108cb639a7451e6d80cb1100", + "6969d30799e0687d3c80ce026bc510f920171ed4fb592ce3bf7ba1c142ec515230856a3c5b618495b449f264dd4ca1c1cea6e0e95756b2d0201d280571ba41e301" + ], + "inputs": [ + { + "uxid": "44233d76c4cfcf6d45efd339ea004c41a3c21f5e9b1919484f4256c53e8aa5a7", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10000.000000", + "hours": 57403807, + "calculated_hours": 57403807 + }, + { + "uxid": "75323e65eec723bb62819835a2e9ae9d7aff770fcf076dd0325e03abec471bb9", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "518220.000000", + "hours": 57403807, + "calculated_hours": 57403807 + } + ], + "outputs": [ + { + "uxid": "7d9bc531b7a990d565c3f8d64de6861a2c619c80ad5014685548261fa13c4b78", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "528170.000000", + "hours": 14350951 + }, + { + "uxid": "dfb90c1854bbf56bb87452a2870b4270214ca163df7d77f37c6bbf9d4ee2878a", + "dst": "2F4uJss1tkD7LNUp5RmxF1DPqgyzKVJm5tb", + "coins": "50.000000", + "hours": 14350951 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 227 + }, + "time": 1440299156, + "txn": { + "timestamp": 1440299156, + "length": 220, + "type": 0, + "txid": "71f762590ff2ca5e0591405ca5bb81aa2540981ea6e5cb71da1b30e4f91124a0", + "inner_hash": "024a7d284281f46931f4068a7dc377064aaf51b1c841e8d43a9f80f19aa52a8e", + "fee": 10763215, + "sigs": [ + "dac9b5146b34a81f1c167cb54a15584e4323cb1910bf8de6c3b999f903a88b25473df3474c5ebce317dc40b121c632a79ecc8e9081406cc5d4b7a9848bd13d0f01" + ], + "inputs": [ + { + "uxid": "7d9bc531b7a990d565c3f8d64de6861a2c619c80ad5014685548261fa13c4b78", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "528170.000000", + "hours": 14350951, + "calculated_hours": 14350951 + } + ], + "outputs": [ + { + "uxid": "e07733e150eee8faacba13e00b2719618f44c57311881b450eff03a8a7fad882", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "528120.000000", + "hours": 1793868 + }, + { + "uxid": "b79723cfa4ff5c819de20392e8f73e16d353dc4af31eb0c7857735d74f0b1469", + "dst": "ywucfMPRof9HqQPXM9xaY865THKsK2bgsS", + "coins": "50.000000", + "hours": 1793868 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 228 + }, + "time": 1440299256, + "txn": { + "timestamp": 1440299256, + "length": 220, + "type": 0, + "txid": "8ca1a46e2ea862c0886adccc211140ff394315c580a8f2da711eeed39d6326eb", + "inner_hash": "e026ab911b2370df6ef3cf8ee91e2005ab9fa978efd4074a8415aa272b0c19a9", + "fee": 1345402, + "sigs": [ + "2805ab4816da23f9e1fc26c8940b5b5b27f90c910201229e239fa2b8f3cb4f9a5d1b57a62c48d5fc21ed11ccc121d22a8269af51a9de1359dd897a78a068d9a300" + ], + "inputs": [ + { + "uxid": "e07733e150eee8faacba13e00b2719618f44c57311881b450eff03a8a7fad882", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "528120.000000", + "hours": 1793868, + "calculated_hours": 1793868 + } + ], + "outputs": [ + { + "uxid": "ad55899c8170d5a577e2a501698002d83dcbf46a72ee351c1f45b366e91ec29c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "528070.000000", + "hours": 224233 + }, + { + "uxid": "03db7662bf54eadcf812dc76fad91d4022dc55b895ce8be3a4f13bda048bd281", + "dst": "23t2jE6DAMUUan6bgqQZchHtwtZo5sRUgR7", + "coins": "50.000000", + "hours": 224233 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 229 + }, + "time": 1440339226, + "txn": { + "timestamp": 1440339226, + "length": 220, + "type": 0, + "txid": "ac0737f4a51a7274f6a32f337d21af0681eff77276f6365c1809a1a73564e850", + "inner_hash": "b0faed6dd74071ff4e4083f9e5f73ff5af90fda24b4e52a00962bae7eaadf5f8", + "fee": 168175, + "sigs": [ + "34abcaa9a093713d2a19323e234d216169d3f75336b3170c1ab7c281386d42da0e97cf5e444a7473a0b1806d3d887e9622a329770c57f27c7532f3b69e3a6b9100" + ], + "inputs": [ + { + "uxid": "ad55899c8170d5a577e2a501698002d83dcbf46a72ee351c1f45b366e91ec29c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "528070.000000", + "hours": 224233, + "calculated_hours": 224233 + } + ], + "outputs": [ + { + "uxid": "daf47014d9191ccfe8bc920aed20088f40c404dbf1836596f021bdd65bdf3467", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "526970.000000", + "hours": 28029 + }, + { + "uxid": "db47ae0c8f6fb640a199a01ceb12c63c26303fd866840f964b634b2f1a7490ab", + "dst": "2bJVVKi3UU9FKEAnZpvNQRWMom9Pp1SYp8k", + "coins": "1100.000000", + "hours": 28029 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 230 + }, + "time": 1440400166, + "txn": { + "timestamp": 1440400166, + "length": 220, + "type": 0, + "txid": "26746e5734590a1ef50f6d8ec6f58c25ed4b2bc57324f9e321f5543807f8830a", + "inner_hash": "66744475146d04a7d95866e1e19b97e1d903e95bc5e8ea96223b281b7b95dbf7", + "fee": 21023, + "sigs": [ + "199134f5ee986ec6a7a86d01920a98c8930be6f224dfeddece5c94155c9b4cea59b78c855887769f00aa6aeb76eb8e632f25b58bd5409fd481fb6663c30db67201" + ], + "inputs": [ + { + "uxid": "daf47014d9191ccfe8bc920aed20088f40c404dbf1836596f021bdd65bdf3467", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "526970.000000", + "hours": 28029, + "calculated_hours": 28029 + } + ], + "outputs": [ + { + "uxid": "8421f4591fa459bba5bb36d8e3465253ae6fa8ce66682a50bbab92bfeb0eac5f", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "526920.000000", + "hours": 3503 + }, + { + "uxid": "10c9fb1e6e6eb1a70af6e6714c1c0edb9588478cddfdbccb9ac5b2194abcbbfd", + "dst": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", + "coins": "50.000000", + "hours": 3503 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 231 + }, + "time": 1440400256, + "txn": { + "timestamp": 1440400256, + "length": 220, + "type": 0, + "txid": "4553ac3bd00bc61bb9deb8a2bf3c606ecf78b857da710728f5b86fdd20434958", + "inner_hash": "0a23fd3f113c52b6b36d397256fe0161a3d7edc77f128ac974173fac90927fb9", + "fee": 2629, + "sigs": [ + "883145c4d76b5032ab0489407e991b247edeac0f89334c0588b8ede6d4ea052a2c330a94598fc9953cf9d25afeee7cf00ecea4d14744657ec9d888fe39b0d55c01" + ], + "inputs": [ + { + "uxid": "8421f4591fa459bba5bb36d8e3465253ae6fa8ce66682a50bbab92bfeb0eac5f", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "526920.000000", + "hours": 3503, + "calculated_hours": 3503 + } + ], + "outputs": [ + { + "uxid": "fa71bd8cc9a8ec39da2b9eb1d6f50d1c79f3c527e0feb4a121c87a82a337106c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "526870.000000", + "hours": 437 + }, + { + "uxid": "e161482d33d132611f343987fc55f400d83de9ce3e51b1e5bd47e2b526c1c567", + "dst": "mkzYUmbUSnBAvweQ3QqqHZM3esy97ubWwQ", + "coins": "50.000000", + "hours": 437 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 232 + }, + "time": 1440412792, + "txn": { + "timestamp": 1440412792, + "length": 220, + "type": 0, + "txid": "ca448d0b9f00c3f779acd75ea6e5d09cb93b4dee8ae417e43cecc58b121155f2", + "inner_hash": "bdcb4cfeae31a07ac42547510c4763b26b139ae2b61d411d7d4a78678a89f4e4", + "fee": 329, + "sigs": [ + "8d5c007633116141c43ff4c87e1394052c4b6832c250ebf5f49781c7b0879ab12261bfd92f41fa6963c4b74e96c2bf8c96e8708f5dd04d4781fdb780c8307bb001" + ], + "inputs": [ + { + "uxid": "fa71bd8cc9a8ec39da2b9eb1d6f50d1c79f3c527e0feb4a121c87a82a337106c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "526870.000000", + "hours": 437, + "calculated_hours": 437 + } + ], + "outputs": [ + { + "uxid": "61d2b0b56b48f446cde90400e87ecd005c555ccc376bbc08208b682c4bafe937", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "511870.000000", + "hours": 54 + }, + { + "uxid": "bc2efd372485b52b954f4bde244c776af12529ba1382ee3e343087754365c3fc", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "15000.000000", + "hours": 54 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 233 + }, + "time": 1440510872, + "txn": { + "timestamp": 1440510872, + "length": 317, + "type": 0, + "txid": "688395456432e777e9bcef2482950d047259da990199d26d88f113ba37e870e6", + "inner_hash": "97a6db93329382d3a23dad5caf203056e6747dca4722c7e8e8d1f316b5f79503", + "fee": 82, + "sigs": [ + "b3a6984d1440aeceb4dac0304215a1bf8d017ab581f19c550b4d8f859f9a15270b54a8e599bff4f4a3a5fb3fcbe2f5bb95b7d61d4d48735696d7dd3c16f8fa7a01", + "5209b5d255a1308f3e25ad6115ed005e34479f4b9155c16c27b40b28da08332b646cc7fb29d82e07f6e8f0de780a4e6a6980ccf4c80214c9fbd0a3fe7eadf84900" + ], + "inputs": [ + { + "uxid": "61d2b0b56b48f446cde90400e87ecd005c555ccc376bbc08208b682c4bafe937", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "511870.000000", + "hours": 54, + "calculated_hours": 54 + }, + { + "uxid": "bc2efd372485b52b954f4bde244c776af12529ba1382ee3e343087754365c3fc", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "15000.000000", + "hours": 54, + "calculated_hours": 54 + } + ], + "outputs": [ + { + "uxid": "f0521d23d6178c3bcf37bbf9755c5e6fc286ae286908fd970bba69fd44cd4f1a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "526093.000000", + "hours": 13 + }, + { + "uxid": "121d93a2019c2bdcd69d58ca47cd4087c5ccc56c5ddc2486885dff8a6febcfb7", + "dst": "2N1izdmWPnPLUSvkRH8Q7aKES7crLYxBo5k", + "coins": "777.000000", + "hours": 13 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 234 + }, + "time": 1440543822, + "txn": { + "timestamp": 1440543822, + "length": 220, + "type": 0, + "txid": "036ad7678b828002f9f75645cd66e8c4a2d2ef66d4866bf7cfe5797be691a648", + "inner_hash": "0751142c1e40396fb2ea4e03cc64f8a7fabc12c1466d44726fa0dd9b2fab4b9e", + "fee": 3773616, + "sigs": [ + "9093c6beef08fc75a1341830aa8da696a9a1f6e043ab8abc48c63f8527c186b26e7f5e802e1743e095031a94b1fee4876245285de8bc76133ea78b403b34b38800" + ], + "inputs": [ + { + "uxid": "18ffebf7d8410a48f00b6bbfa5272ba374c0b70c6c31172975b4c503542d4193", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "25390.000000", + "hours": 980963, + "calculated_hours": 5031486 + } + ], + "outputs": [ + { + "uxid": "a715e01bf641734804ed64e468ec35aa43658dc618784e6aed2f67d10c811f5d", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "24390.000000", + "hours": 628935 + }, + { + "uxid": "b20f489859a7f5236c3cdb5ed9ed7b49fb086622e251c9c73bced00d4de84648", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000.000000", + "hours": 628935 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 238 + }, + "time": 1440675932, + "txn": { + "timestamp": 1440675932, + "length": 317, + "type": 0, + "txid": "768dc6803457ca6ba774e251f0a8f482d8f7134a5a8347831ae1d84ff39040b3", + "inner_hash": "63020c4af6f170888d1ed626be016d895568d3a0aead892b979e55e5d0bd8800", + "fee": 18586963, + "sigs": [ + "442db1af0d6925a01bf9510a5b8ba1dc1787373ba0851b99825533c2bc02f5246cdd56ac98ca2c1039d010f52e7a153c4118fe00dce63692b63dd04cefcce0f701", + "9d3c03789af3832c7cae849eed9ac2b1d5b1c3f89daee13ad46f10d256cd8774431d60b98ab3803709430cceefe1cdb55543064843240af9123ab9ffbb2ffccf01" + ], + "inputs": [ + { + "uxid": "f0521d23d6178c3bcf37bbf9755c5e6fc286ae286908fd970bba69fd44cd4f1a", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "526093.000000", + "hours": 13, + "calculated_hours": 24116992 + }, + { + "uxid": "b20f489859a7f5236c3cdb5ed9ed7b49fb086622e251c9c73bced00d4de84648", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000.000000", + "hours": 628935, + "calculated_hours": 665623 + } + ], + "outputs": [ + { + "uxid": "cfe2c8e49c9de33d4a589a1413f125c6e297aa4c65c220cf3cb14d77ad399950", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "514593.000000", + "hours": 3097826 + }, + { + "uxid": "2b724147fb8daced3ad03b0a94e291410ab70df7f22346ed836bb864904a24ab", + "dst": "23HBeFsA4E7g4pwJpbmQjtmDSHhhi47is1B", + "coins": "12500.000000", + "hours": 3097826 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 239 + }, + "time": 1440676112, + "txn": { + "timestamp": 1440676112, + "length": 220, + "type": 0, + "txid": "60ba5bab66295f08c5c96411f53bdf38bdf2b985b6dec3989b7754a8e2919ef8", + "inner_hash": "e765990d43208cc3e4f2168abd1139b36eeb280d18d8f98b13c14708371a5109", + "fee": 2323370, + "sigs": [ + "91a610f22d4aec320cb9a39a831eea7ff8b5fe5e18d402fda01bf732ccce2ad801d3709a073d0a95d18c8424ea8cb69cce38194a5b12ab11f6bb5278f9a7941d01" + ], + "inputs": [ + { + "uxid": "cfe2c8e49c9de33d4a589a1413f125c6e297aa4c65c220cf3cb14d77ad399950", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "514593.000000", + "hours": 3097826, + "calculated_hours": 3097826 + } + ], + "outputs": [ + { + "uxid": "621e724988e58bf27ec29a910b7a53ed028ee2185a77e727f5612be31886b658", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "514093.000000", + "hours": 387228 + }, + { + "uxid": "52d2c4bda60fcd5e144d1c229a4d31c559a3d1f060b689737148918d4c04e128", + "dst": "Zu5GRV7HcKu1zV4ymwXUBCNogbwFW1sbhA", + "coins": "500.000000", + "hours": 387228 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 240 + }, + "time": 1440677762, + "txn": { + "timestamp": 1440677762, + "length": 220, + "type": 0, + "txid": "8839c0de129a84bb3025f8e314dae4d331b0da6a446a9893ad11225eec650e5e", + "inner_hash": "dd8ca4280d163c57c12c9792b544df85a2535e06b20b2c661d91b6aec80ba8fc", + "fee": 290422, + "sigs": [ + "7ab23848784fdf05602660e838be997277a7c33b2907ba81ae324d735b39864a2235ed3a0bfff86fa3cd7dcec7c6ab519d78e5f42b39443ee3aa4a1e44b9e26400" + ], + "inputs": [ + { + "uxid": "621e724988e58bf27ec29a910b7a53ed028ee2185a77e727f5612be31886b658", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "514093.000000", + "hours": 387228, + "calculated_hours": 387228 + } + ], + "outputs": [ + { + "uxid": "4e421d6b25d84e7bfb4561465e15867cc751cd2527e99901f5afc538a344ee57", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "513793.000000", + "hours": 48403 + }, + { + "uxid": "3e2b813ec4bdb29dd5bc232e00722c00beabf7cbbc2ca8b4e348f2f083978bd3", + "dst": "X7y5AqjNaLEuBGPxF2Rpip7d1AByHWWaXz", + "coins": "300.000000", + "hours": 48403 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 241 + }, + "time": 1440677792, + "txn": { + "timestamp": 1440677792, + "length": 220, + "type": 0, + "txid": "6cf290b9b63988d6126b6101c10992f6d9340988731e67867f011790f1fdf8de", + "inner_hash": "7e4018b41a6906ddfd84f67d271d79ae89ade34ed5de0ae609a6eeddb37f5991", + "fee": 36303, + "sigs": [ + "da30c4a5cd8670d84a8f7f8b7c7cf9ae0da0f5bf806720824ad2d59716b200d349070158bbac66723c1a434747a8c438dec3e40c9e199cf8a2ee6d5622eb6b5901" + ], + "inputs": [ + { + "uxid": "4e421d6b25d84e7bfb4561465e15867cc751cd2527e99901f5afc538a344ee57", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "513793.000000", + "hours": 48403, + "calculated_hours": 48403 + } + ], + "outputs": [ + { + "uxid": "899150e09c28e157df0548f505d6ede097274c9ed69b269085d03c0582141d81", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "512793.000000", + "hours": 6050 + }, + { + "uxid": "3a87d255b1d892d58d606d622196b75e818690e55e74db6e0173b1e28b58e2a9", + "dst": "vneQ7V3nuPwRbSRqvFXhWkXaVou11ynXfC", + "coins": "1000.000000", + "hours": 6050 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 242 + }, + "time": 1440679322, + "txn": { + "timestamp": 1440679322, + "length": 220, + "type": 0, + "txid": "8ca9114947a591d12c8bcb3aed6c2b6f6f50c13ebea44fe62fcfd783b4716166", + "inner_hash": "0aa4f96969cccacc1c03e2d7f8a1719ffb6de7c85ee563f6d55f3da14a377502", + "fee": 4538, + "sigs": [ + "2373f45b0d10eb272c0304af8b75bac0570fc265ae3a446ec74b0bea87e494d86101e9b0c042a84fb20bd2061e694f2791cc76c734e8dcba0f3a601651cd405601" + ], + "inputs": [ + { + "uxid": "899150e09c28e157df0548f505d6ede097274c9ed69b269085d03c0582141d81", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "512793.000000", + "hours": 6050, + "calculated_hours": 6050 + } + ], + "outputs": [ + { + "uxid": "1df6bca39e9eb5491a5cc5c5960277e5da2d3eb7dcba02346a88b8097e9f85cb", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "512743.000000", + "hours": 756 + }, + { + "uxid": "051a357d1fe7f7b417a5892531f1e8b25b5bb78011ed4b440a5af47cfe241605", + "dst": "26AzDqDncyr5VKg5PfAxfTVdDtJf9AnMvoV", + "coins": "50.000000", + "hours": 756 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 243 + }, + "time": 1440682532, + "txn": { + "timestamp": 1440682532, + "length": 220, + "type": 0, + "txid": "6b056847543ff37d8dbb7506d85514b3e18001ce973b7aac2a1a198a7f3be318", + "inner_hash": "583525d962728c33c80c1a511f3f407df0b09f0b22d571b9b857dba3488c0b13", + "fee": 568, + "sigs": [ + "b625dcc6040f599b04f00e9812f93f6e087a68b8277a03efcb49a2e88cf86ea4314ac1d50e5299b9ec48921fed1b56e0221bbb8df5a3df386d524fbcb9fe9aa100" + ], + "inputs": [ + { + "uxid": "1df6bca39e9eb5491a5cc5c5960277e5da2d3eb7dcba02346a88b8097e9f85cb", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "512743.000000", + "hours": 756, + "calculated_hours": 756 + } + ], + "outputs": [ + { + "uxid": "7d72885b66c4b55fa019a084fe867ec0133ccf69a47dc007a6063a98235f2c0c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "500243.000000", + "hours": 94 + }, + { + "uxid": "e7a20c799176f6567f3ad37f67ef0bfe5dd957404bd436d12f378eb35e624430", + "dst": "23HBeFsA4E7g4pwJpbmQjtmDSHhhi47is1B", + "coins": "12500.000000", + "hours": 94 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 244 + }, + "time": 1440911542, + "txn": { + "timestamp": 1440911542, + "length": 220, + "type": 0, + "txid": "7732aba0b8f9773c975158578159f5f6e98e9864d1cd2b0cef23cac03783cb99", + "inner_hash": "0337a9c8ebc9c389166e782b1da8777b01c29894b19d2c34290d9a3b81cd2ee1", + "fee": 72, + "sigs": [ + "c185a7bac79fa042884330bf37c97ad27d9b4726ced145d91aec91dfb1cd9bf71e2c2e0de33837b43b241eddff2ac7067144ab3859859bef3e926b99aab4e5da01" + ], + "inputs": [ + { + "uxid": "7d72885b66c4b55fa019a084fe867ec0133ccf69a47dc007a6063a98235f2c0c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "500243.000000", + "hours": 94, + "calculated_hours": 94 + } + ], + "outputs": [ + { + "uxid": "273800d205c2cde0dd2bdd7d942a394108479e1d0fe7c2d665044f078ee654eb", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "497843.000000", + "hours": 11 + }, + { + "uxid": "5b9ecc773b66edd04478a15c82f019986b973fbc24be45c933e1e8ef62e0b223", + "dst": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", + "coins": "2400.000000", + "hours": 11 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 248 + }, + "time": 1441590662, + "txn": { + "timestamp": 1441590662, + "length": 220, + "type": 0, + "txid": "c8cbf96c9875e5a7f9f20cc301e9541f41182ac02747953f299d97a971e861e8", + "inner_hash": "f2c27d1b408cdd4796f628bff892e43cdfaeb8725b3a83bd0eddc374d9ce3ad1", + "fee": 37709542, + "sigs": [ + "314620c86df48d65a6fcfeb82d028f48660f01b78004a01c0b5e8d5ba5e38e297331862b3f2786cf682e03e81fab3a413068f4eb72991d574b90d6a857b32d6201" + ], + "inputs": [ + { + "uxid": "273800d205c2cde0dd2bdd7d942a394108479e1d0fe7c2d665044f078ee654eb", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "497843.000000", + "hours": 11, + "calculated_hours": 50279388 + } + ], + "outputs": [ + { + "uxid": "a7ae18a9ac1e1787fc13d28cfb6de19711ba19a6737a66aaf29d1577e967c4f3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "492843.000000", + "hours": 6284923 + }, + { + "uxid": "6ade5ea7988126cda24ab050d714172ce41b0ba33359e0d06d319be60e83db9d", + "dst": "SiS1P3maLEzpscmggF6yvBHQ3yn7tA5ZdJ", + "coins": "5000.000000", + "hours": 6284923 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 251 + }, + "time": 1441735522, + "txn": { + "timestamp": 1441735522, + "length": 220, + "type": 0, + "txid": "7c2da40e69c1ab57129cda200cbc4916fc67673436209b549c0496a4991f73be", + "inner_hash": "2d2c7b9c7e9e7c2dac513d277e2ed378a4ccdc5263560e2173b6507e4d70670d", + "fee": 19557508, + "sigs": [ + "9de55cef7a0e80984d48ecfd30acf98d220bb5556d456af477c6879e80ba1bf143e75d6b64a018c1023f1854e538f1b72df3efe932db13d0eb20adf31c38ff9f01" + ], + "inputs": [ + { + "uxid": "a7ae18a9ac1e1787fc13d28cfb6de19711ba19a6737a66aaf29d1577e967c4f3", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "492843.000000", + "hours": 6284923, + "calculated_hours": 26076676 + } + ], + "outputs": [ + { + "uxid": "78523dd46614ec8b6aead939096a0dc77580475ff4ef6029cf15cc6af6121b4c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "491843.000000", + "hours": 3259584 + }, + { + "uxid": "5e41c4784a2ed9b538d07c20c2cadc89e3566ea17653b965715dd8db2015b986", + "dst": "KXSR2KLsButg6ndwUDYoyJ4FE9vGPLvtAj", + "coins": "1000.000000", + "hours": 3259584 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 252 + }, + "time": 1441735692, + "txn": { + "timestamp": 1441735692, + "length": 220, + "type": 0, + "txid": "6638eac25e01cb7aabc20e0bd8fff66267bfa88ef4d3b021cda4248f6c8538a3", + "inner_hash": "ce2201218b3d8b5c734bc18666e409174b77ae022c0e48c30c5a9949edff6b0d", + "fee": 2444688, + "sigs": [ + "94a8d11ba959af4d2160d141989d9a3e21f875b829d07969d1be040b54317c901c47ebcc9431f3cc0af88d4fbc0ac924785de50d27a3af4e4e4dc31a9980e0eb01" + ], + "inputs": [ + { + "uxid": "78523dd46614ec8b6aead939096a0dc77580475ff4ef6029cf15cc6af6121b4c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "491843.000000", + "hours": 3259584, + "calculated_hours": 3259584 + } + ], + "outputs": [ + { + "uxid": "92b97e2593356de140619f723ff1dceeb586ddc074c6d28b638ee21a6c545558", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "491743.000000", + "hours": 407448 + }, + { + "uxid": "4ce358e15868adaf6c5ca420f900d3dd0f737510b5412646e10548fa3d37653d", + "dst": "29vxf99tti4sFPZpg8ghEWV9fhoHSbjeRYd", + "coins": "100.000000", + "hours": 407448 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 260 + }, + "time": 1444883250, + "txn": { + "timestamp": 1444883250, + "length": 220, + "type": 0, + "txid": "22b65c63f88e188f8da71f42e41102cde030d9550cfc990b4391e0339a4cb2dd", + "inner_hash": "0f2f563f1fdf52d53dcc414228d347dc677c4143cb3be4471945709fed3d29f0", + "fee": 296075479, + "sigs": [ + "f0ace9ccccb936a5b46073085d83ca357692dfe0de9635d36292289f6d3a6e4505bd42c7de08dc8642823b8ee2b986c0b926c62df834f694a4d44695ced6690000" + ], + "inputs": [ + { + "uxid": "92b97e2593356de140619f723ff1dceeb586ddc074c6d28b638ee21a6c545558", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "491743.000000", + "hours": 407448, + "calculated_hours": 394767303 + } + ], + "outputs": [ + { + "uxid": "ad23f4d4cfba4a4f531a072bac6b7f3b5002ca97f3bc8a6064d556f404df197c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "479243.000000", + "hours": 49345912 + }, + { + "uxid": "d79a747561a4ae09c22e5ec0baf0eb861b56b1d9b1411868c474d32e9ef392dc", + "dst": "6QpWfvS8PxrWVJLKLFtQVUHvAwUg2oX6GW", + "coins": "12500.000000", + "hours": 49345912 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 262 + }, + "time": 1447060608, + "txn": { + "timestamp": 1447060608, + "length": 220, + "type": 0, + "txid": "bc35493562cbe89797ce21a6202c8b43fc8514910ccb197c2f971c624b1fa5dd", + "inner_hash": "ff7c2bc8682df6f1a080061ca6d646c47636474b9e291dbf9d549fe5e63fddfe", + "fee": 111184070, + "sigs": [ + "d1ffeea69fb213eaa7aea1e5f0d5a09e414247ba07a3860fb66c3af0b7ed611e2e630bfd292b4013e0d1bd9234290f068d49f5922ce895785c18cc4ada578a0e00" + ], + "inputs": [ + { + "uxid": "ad23f4d4cfba4a4f531a072bac6b7f3b5002ca97f3bc8a6064d556f404df197c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "479243.000000", + "hours": 49345912, + "calculated_hours": 148245426 + } + ], + "outputs": [ + { + "uxid": "5405881c286f02327718b8124e1b421123dfe3905fe60b2272ffe7632f4102e9", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "478743.000000", + "hours": 18530678 + }, + { + "uxid": "1a736e8db443d47be27b5772d3d7ef80afd09c5f44bffe2390056e2ba0378679", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "500.000000", + "hours": 18530678 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 263 + }, + "time": 1448245188, + "txn": { + "timestamp": 1448245188, + "length": 317, + "type": 0, + "txid": "32c585c56c5879158e3075f299998f6cf922b06b9620f272ebb4cb4a2353d4eb", + "inner_hash": "e0dcb3b201be487c7feaf513b3f245b08e0f86335fd2bd9a9dba7ca70684e8a7", + "fee": 27796018, + "sigs": [ + "2b0585dc3ac3d497e9b139be51a0e5f6e0520c54e244678459169a82d386f5050f23dd92685efee03bad45f7e166992fb34c3fc036c1fd9204bc0280decb7c8000", + "adcd4b6cb6dc7816416f44649ce1dc4ce3489e9dbac70f4de610d0663e12ed556f3d1fda1781ecb6237652358cd6d1118ec9c2b5795dde594d92c47830c493f500" + ], + "inputs": [ + { + "uxid": "1a736e8db443d47be27b5772d3d7ef80afd09c5f44bffe2390056e2ba0378679", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "500.000000", + "hours": 18530678, + "calculated_hours": 18530678 + }, + { + "uxid": "5405881c286f02327718b8124e1b421123dfe3905fe60b2272ffe7632f4102e9", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "478743.000000", + "hours": 18530678, + "calculated_hours": 18530678 + } + ], + "outputs": [ + { + "uxid": "f98bd5645556fc85678355430dcae91b13bb48a257e51fe4c94565bb450aab3a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "478243.000000", + "hours": 4632669 + }, + { + "uxid": "08c0b08d114154a06a39cf418dd39eb018a55c1c4ee7a96257b33bc6f413d577", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "1000.000000", + "hours": 4632669 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 264 + }, + "time": 1450942022, + "txn": { + "timestamp": 1450942022, + "length": 220, + "type": 0, + "txid": "97ed144d626d0ff6fca09745735aec22a103d182971a45989500a3aa757358d4", + "inner_hash": "4bafee81f542c63b988af48da3250dd56215a42b520892b1ebbb8e9c5271588b", + "fee": 3474503, + "sigs": [ + "c4047afd7722520fea778426868ef461a602a3954b82051c2245107491efdfff54d701d18f5408ef20a7dcea37ae4c1c3555bfe1bc387b1f3a516d076420139e00" + ], + "inputs": [ + { + "uxid": "f98bd5645556fc85678355430dcae91b13bb48a257e51fe4c94565bb450aab3a", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "478243.000000", + "hours": 4632669, + "calculated_hours": 4632669 + } + ], + "outputs": [ + { + "uxid": "019d3c48e4f48ae4c7d2c60ba8ba3d6a821cd1f34cc8d7dcae0e99e448aea268", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "476243.000000", + "hours": 579083 + }, + { + "uxid": "8745efaccbb21edd35d337233d7d1ae0e2c75723e72767c9b42cd27c46146abc", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "2000.000000", + "hours": 579083 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 265 + }, + "time": 1450942402, + "txn": { + "timestamp": 1450942402, + "length": 220, + "type": 0, + "txid": "b5ffbbb48c9900feb663f79c3b3e1c89328a08b592f96071fd4d3171197a5ff7", + "inner_hash": "b6d4ab02e9b05a532402a1b65185e098d4c730854c6f34d20e71da1262524195", + "fee": 434313, + "sigs": [ + "b116c94fd9e32cc371bba4f9a88ad672112d53be861aaa5c77cd335d1553fe0a24fc334d79c61aed344b618a3de49e791cc8aebe83bead076ed2f38dccd9aaee00" + ], + "inputs": [ + { + "uxid": "019d3c48e4f48ae4c7d2c60ba8ba3d6a821cd1f34cc8d7dcae0e99e448aea268", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "476243.000000", + "hours": 579083, + "calculated_hours": 579083 + } + ], + "outputs": [ + { + "uxid": "4cac2776f179bf3b38d862158871a117bde8ca8bd3185490861138b4862ba997", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "456263.000000", + "hours": 72385 + }, + { + "uxid": "c33a3ad731a1375220c0701da00a462e13a11bab4cff684061ce173982227a2d", + "dst": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "19980.000000", + "hours": 72385 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 266 + }, + "time": 1453191853, + "txn": { + "timestamp": 1453191853, + "length": 220, + "type": 0, + "txid": "981c2bb64f9e6717353cad40e21f3e97bd188381fde77862298488a516c31252", + "inner_hash": "cae5fc5f829da5ccb165c97b1140ed161e22e4ba290b1bee703b31a986c3c45c", + "fee": 54289, + "sigs": [ + "e3fb8400221770861288bcb1018a495548af5cd617724aa22efd219f350047086ea0ed5aa7f95e488045d5c31d8551a6cffcdf796d91ebbf573c1ef6492bb25701" + ], + "inputs": [ + { + "uxid": "4cac2776f179bf3b38d862158871a117bde8ca8bd3185490861138b4862ba997", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "456263.000000", + "hours": 72385, + "calculated_hours": 72385 + } + ], + "outputs": [ + { + "uxid": "9eb9840cfe5e9c546b2db592420d4651433a6913eb46a50500834fcde4989af2", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "455263.000000", + "hours": 9048 + }, + { + "uxid": "d7eb0e6bd0ccbf9fd59e314999c37e8f97c652001e1ac1834f9b3c95665a746d", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "1000.000000", + "hours": 9048 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 267 + }, + "time": 1461084047, + "txn": { + "timestamp": 1461084047, + "length": 220, + "type": 0, + "txid": "4edf7e4859bd537481164719a563af45b2603d2caf1b676d6fe1e08713b0d6f3", + "inner_hash": "ac615d16f9c8be45bc50359496bdd6d489b374846f11586c19dc865c3217c1b9", + "fee": 6786, + "sigs": [ + "7ae17fdc81bb3b71304db642c6af046e67ca00e8499d8f3d19f7489cd13ca4b75f2415d1e9639e0a7a26791852331189f5e2bfdde574ccf6c0adbca2fb0c933100" + ], + "inputs": [ + { + "uxid": "9eb9840cfe5e9c546b2db592420d4651433a6913eb46a50500834fcde4989af2", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "455263.000000", + "hours": 9048, + "calculated_hours": 9048 + } + ], + "outputs": [ + { + "uxid": "a6624db7b164d43f52d38f9584a7e79377e46077ee23823b61a53948678e28e7", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "450263.000000", + "hours": 1131 + }, + { + "uxid": "fd99ca48c87575437fcbedd1bf05cf5c4f6a2d199616119ec99dfe61eb085ee5", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "5000.000000", + "hours": 1131 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 268 + }, + "time": 1461280957, + "txn": { + "timestamp": 1461280957, + "length": 220, + "type": 0, + "txid": "76b704d474896c5a3179b45a48c3ad327d5ebc27a6681ea7f514a90ba625bac3", + "inner_hash": "a60b2257f963b247a98f083828bf58d88aa3f327839c599bf1eaf0ee55a325a1", + "fee": 849, + "sigs": [ + "15e30848b1d0aaf92e13f8927115314341ab4452a31f0a61f665c986c952ef6838753688759e98f393b5af088ad0fa4e9aa4e83695afe5734c45e4eb6c15b76f01" + ], + "inputs": [ + { + "uxid": "a6624db7b164d43f52d38f9584a7e79377e46077ee23823b61a53948678e28e7", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "450263.000000", + "hours": 1131, + "calculated_hours": 1131 + } + ], + "outputs": [ + { + "uxid": "36a9b21493d059479a71e7f0cffc8b9a920d572eca50b73483e64dc7facf087a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "437332.000000", + "hours": 141 + }, + { + "uxid": "c85d1d533bf13c0725af9a30bb101670505ed192f6987d55c1db5dd70fb2e4b3", + "dst": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "12931.000000", + "hours": 141 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 269 + }, + "time": 1461296767, + "txn": { + "timestamp": 1461296767, + "length": 220, + "type": 0, + "txid": "8ecc2fb1efa47e6ad0c4670281b364a2828bfe86d59fbc14105c5b3a3c34fd17", + "inner_hash": "0600d27b083aea0d64ba83749b3bb60cbde6dd2cdaa4ec2101adb8de668cdeec", + "fee": 107, + "sigs": [ + "aaa9847aead8e1e43fdeb1548317046c252ddc8b61e9447c18006b8af5805f5c1dbf81b898f25ecbbd0bb97c2d6d89da0e25f7da979932b2a774c7c5e6f2281d01" + ], + "inputs": [ + { + "uxid": "36a9b21493d059479a71e7f0cffc8b9a920d572eca50b73483e64dc7facf087a", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "437332.000000", + "hours": 141, + "calculated_hours": 141 + } + ], + "outputs": [ + { + "uxid": "23bdbe3b210b25da017917ea4345d589adea792ad156dcfd875a55d9509bbe5b", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "434832.000000", + "hours": 17 + }, + { + "uxid": "7bb51af714bcae27ed5c092c6e721f10ca1ac167a61add8bd2989f15c968bab8", + "dst": "28nWDjroTJGr3rmZj9iiiVQK1wEVURcvsSc", + "coins": "2500.000000", + "hours": 17 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 274 + }, + "time": 1461749167, + "txn": { + "timestamp": 1461749167, + "length": 220, + "type": 0, + "txid": "2c97923aba19d8846f8f90db6dc89da7d433ead3ea8dc3155294ab4c9e7e61a4", + "inner_hash": "7d3af96a796daba12cbb863731c09e148f21302064d65945316473ad522e8ca8", + "fee": 40951223, + "sigs": [ + "6f3c6fb3e971ec8b4eb3a352c94b2abcb347a3f476d1b5e3097ce239a32467bd0703a4436ce7c9b4beb1668a9056f6d93055b53aa7a36374c2b3d12793a6ea3900" + ], + "inputs": [ + { + "uxid": "23bdbe3b210b25da017917ea4345d589adea792ad156dcfd875a55d9509bbe5b", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "434832.000000", + "hours": 17, + "calculated_hours": 54601629 + } + ], + "outputs": [ + { + "uxid": "5ec2fea3fa7c2b44b2c2b0dfc8b3085d091eb6b6a9bb2d3330a7c6ff57bd61de", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "433832.000000", + "hours": 6825203 + }, + { + "uxid": "df7cae650d11e13a5308ea9f10662060c57ad749538d5ea1f476556de3257270", + "dst": "A19fNE1BNGAELCJ5bCVgo8t5Y9UPtoxy2F", + "coins": "1000.000000", + "hours": 6825203 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 284 + }, + "time": 1462264727, + "txn": { + "timestamp": 1462264727, + "length": 220, + "type": 0, + "txid": "7c3f991c9cb5098648da480666613a048267678dcf7033c6138b0ac619003bcb", + "inner_hash": "35e2f253fd5936f6086464b4f3bae2a39770f91b2d846533bdd677554a760bbf", + "fee": 11717668, + "sigs": [ + "bd5e540c58e54ccc58d1f7021657665d1f7a1770cc575b47a46bc16f5e3f3c86338f61be266c851201e8441ea5aa3ac91fa1cbf3b77365826c3b76f8f6441b0700" + ], + "inputs": [ + { + "uxid": "5ec2fea3fa7c2b44b2c2b0dfc8b3085d091eb6b6a9bb2d3330a7c6ff57bd61de", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "433832.000000", + "hours": 6825203, + "calculated_hours": 15623556 + } + ], + "outputs": [ + { + "uxid": "8ed671db62d7a541aebcfcbdf4e677d9d5c49979e3dfbc94e532b32b9273b4cd", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "333832.000000", + "hours": 1952944 + }, + { + "uxid": "fba32b8a7e10d7aad23bb8511dd61b9ad67b844142b5acd7ef22d03e540888fb", + "dst": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "100000.000000", + "hours": 1952944 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 288 + }, + "time": 1462711117, + "txn": { + "timestamp": 1462711117, + "length": 220, + "type": 0, + "txid": "4c41f200b398abbba12cb9ad5b935a5dad3bb6283093f062c82ae7c7904747a5", + "inner_hash": "5263bdcff23761f158c7286664908839983135936f1e53bdd2513e7fa317d05f", + "fee": 18014431, + "sigs": [ + "39c94d70cedadb426004bea6137aa774ba757b78c44aad072143eb55cb9207aa7f02be91cd67c27f39f898a2303791665bfb5414a18df62a304c9cbdd4ffb5ff00" + ], + "inputs": [ + { + "uxid": "8ed671db62d7a541aebcfcbdf4e677d9d5c49979e3dfbc94e532b32b9273b4cd", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "333832.000000", + "hours": 1952944, + "calculated_hours": 24019239 + } + ], + "outputs": [ + { + "uxid": "af7420cde3eec0f8ca1b1aa5bc6c47c89055877be61863a50e0665ee4fd2d737", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "333732.000000", + "hours": 3002404 + }, + { + "uxid": "111b2d823bc70d9e8f42063eca3a457abe385b994d59f602d35bafe3e1402233", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "100.000000", + "hours": 3002404 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 289 + }, + "time": 1462711187, + "txn": { + "timestamp": 1462711187, + "length": 220, + "type": 0, + "txid": "6778a6900cf26b0ad69d2ead927663bd2bbaccd9b97d0dffb74655a08757ee5a", + "inner_hash": "53e042fba89ab6233f73a2bd08df87d84d5979b7a1bed5705156b8badc44f5b3", + "fee": 2251804, + "sigs": [ + "006025e5067252a8e37eb4c911d7e2c5283b137f0be2c8ffae27cac8f5a21f723d25745c157e49783354751f3e0bf4ce25fe6271748bd78d31487e826685a59801" + ], + "inputs": [ + { + "uxid": "af7420cde3eec0f8ca1b1aa5bc6c47c89055877be61863a50e0665ee4fd2d737", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "333732.000000", + "hours": 3002404, + "calculated_hours": 3002404 + } + ], + "outputs": [ + { + "uxid": "621e418133fa0e18013978ea4cb8d8de33d00174d5f41ef11c8750a178b20cd3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "283732.000000", + "hours": 375300 + }, + { + "uxid": "4729461061ba3e308d1fea8846b8326bb8300d3dcc8b66b242323ba0aa5a3ccb", + "dst": "2Rjx22U3oDAv1sK5kNRGbr8ohLZPf7tY5Qa", + "coins": "50000.000000", + "hours": 375300 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 290 + }, + "time": 1462715237, + "txn": { + "timestamp": 1462715237, + "length": 220, + "type": 0, + "txid": "99988a504cb60473ad8b5047a9be9049dff3dd2ee13879707a12736ed52ea9a5", + "inner_hash": "13285dd910aca69020333f17bc6d0a9ad3424bba2610acbd062712a3b4b46b6b", + "fee": 281476, + "sigs": [ + "cc4df545eddf94086f0aaf2bb28321d8e3822f835bb3a71ab51674a3a7dc305c57df3609b6dc3a434fa8e2a4c36b5406cdf2fe6833c74049b4b77cf098ca664c01" + ], + "inputs": [ + { + "uxid": "621e418133fa0e18013978ea4cb8d8de33d00174d5f41ef11c8750a178b20cd3", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "283732.000000", + "hours": 375300, + "calculated_hours": 375300 + } + ], + "outputs": [ + { + "uxid": "eacaf7455ea2fb2a028fe670f7bb578c4c1ca767cea247ebfc7e3fecd8f1d5e8", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "278732.000000", + "hours": 46912 + }, + { + "uxid": "a0e76e9cfd75deeb37f2db7bd67c95c95c3896c635ef104a548b77cafa65dd04", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "5000.000000", + "hours": 46912 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 291 + }, + "time": 1462715257, + "txn": { + "timestamp": 1462715257, + "length": 220, + "type": 0, + "txid": "714a3b2ba4479d0a95ad0ebae11bc1198eabc6392dabe776c15e7a68e0d82cf8", + "inner_hash": "32aa300316d5aff19a3aa0a99bfbca6398eef9462cc6c975fe7f41d1ecb9f6d5", + "fee": 35184, + "sigs": [ + "a886ba759476985a6aec555b7acb5b3f7ea7d14201b66bd043bc172206bf4b7c0269959f3f8aac5c7a06a376a628221c67ae89cbd141c96987f852c2e2f4e73400" + ], + "inputs": [ + { + "uxid": "eacaf7455ea2fb2a028fe670f7bb578c4c1ca767cea247ebfc7e3fecd8f1d5e8", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "278732.000000", + "hours": 46912, + "calculated_hours": 46912 + } + ], + "outputs": [ + { + "uxid": "7802f51a5010ce9397a73aabe79ebc1c4ad4bb79f1352cf01064f7657d392079", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "278232.000000", + "hours": 5864 + }, + { + "uxid": "0637e5ea11dba513d8839c02e4d564ec31a8377e5aca51fdef4c854cb5eaa332", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "500.000000", + "hours": 5864 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 292 + }, + "time": 1462715267, + "txn": { + "timestamp": 1462715267, + "length": 220, + "type": 0, + "txid": "7e8d02180c5e49cd36b545c8986ffaadc7e90840259d3fe10ceaff3e4cd931c4", + "inner_hash": "8e1d9f79f43372290c3d497314271a711c33474fdec555b4be6f3f0d7c608d76", + "fee": 4398, + "sigs": [ + "61f0c36e996c391c61daaddd6dced605e79cdabc643d994d99c7a6a479aad25c4030619f1cf7420dbe2d673a2e124f2bae744277b246173342d7fdbddea78bc200" + ], + "inputs": [ + { + "uxid": "7802f51a5010ce9397a73aabe79ebc1c4ad4bb79f1352cf01064f7657d392079", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "278232.000000", + "hours": 5864, + "calculated_hours": 5864 + } + ], + "outputs": [ + { + "uxid": "bb95e005de46b18783350e39ab6f0f969db253445c99e5b97d172dee6f81a4db", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "277732.000000", + "hours": 733 + }, + { + "uxid": "9ab52d70129ef181bbd69a630a3fa929bb12357c5c31bc70173388b71327dab7", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "500.000000", + "hours": 733 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 321 + }, + "time": 1467090951, + "txn": { + "timestamp": 1467090951, + "length": 220, + "type": 0, + "txid": "7388dab349f2d2a59ab071fc592c0173acfa357f23fd17dae1561089da55e74f", + "inner_hash": "a0f3bfacdee3107342adb96e8dcb38a265af8054624dadc0b27d71c55854e6b5", + "fee": 163980409, + "sigs": [ + "dda5202c4c44a5ab8eceb8cf8a7acc1c2714529eee0a69bd396cb74a98706dfe1c7686c1b0f2bf760b5d211ce535c21077944bd1d89bc0baade9606cd561147800" + ], + "inputs": [ + { + "uxid": "bb95e005de46b18783350e39ab6f0f969db253445c99e5b97d172dee6f81a4db", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "277732.000000", + "hours": 733, + "calculated_hours": 218640543 + } + ], + "outputs": [ + { + "uxid": "d187d4cd730f2634e9f8bbd9e5a87eb37d1e319dbcc3d8bd9fe07cbf36f04438", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "277632.000000", + "hours": 27330067 + }, + { + "uxid": "f16b87d2e0ea2e7f43434d058fb4435705cb15f4d01de6c6aa242ab7fcd9a80b", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "100.000000", + "hours": 27330067 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 322 + }, + "time": 1469074433, + "txn": { + "timestamp": 1469074433, + "length": 220, + "type": 0, + "txid": "5733f006dda42be6198d3fb035170c9160428ad321c8255b851574776e03c34f", + "inner_hash": "993a366ebfc7210951eeda4c459389f396a2038f41025f4b729edab75d1dc9c5", + "fee": 20497551, + "sigs": [ + "0612105a7d427841f1f9038bbb778c8c1db52e0dfe5fd7c9409b44bb03fc72a74d60913ad46fef4a525d3314a48e1ee49d4a5da69941075fe816c02ef691979001" + ], + "inputs": [ + { + "uxid": "d187d4cd730f2634e9f8bbd9e5a87eb37d1e319dbcc3d8bd9fe07cbf36f04438", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "277632.000000", + "hours": 27330067, + "calculated_hours": 27330067 + } + ], + "outputs": [ + { + "uxid": "d75874d45892d08632c1b9ee89f2137c21491a70f95bf7c04b4f0d65e465c3f1", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "276632.000000", + "hours": 3416258 + }, + { + "uxid": "02b48571a1a1f628a0e78b5b158a682262a88610cd0614697e17201f35c9ee98", + "dst": "22cmbaPHWozJRJfbxTUbfoy2FfM3oFvFs7k", + "coins": "1000.000000", + "hours": 3416258 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 323 + }, + "time": 1469074773, + "txn": { + "timestamp": 1469074773, + "length": 220, + "type": 0, + "txid": "725698203caf11e909360449956f0285735d44f4573c81413852d25b220e61b0", + "inner_hash": "ef1dc1d55aa04aa6a240a796f6f9c47af2317fdfa7f4843f3884e71cdb79c442", + "fee": 2562194, + "sigs": [ + "77fd6d8da8b2efd32dd50ca558e44fde0f62d8cd15ab084650759ff61d51e3200b7c025488908a7d0f784de819764506ab8a67f9d5c384ab7962c30908695d3700" + ], + "inputs": [ + { + "uxid": "d75874d45892d08632c1b9ee89f2137c21491a70f95bf7c04b4f0d65e465c3f1", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "276632.000000", + "hours": 3416258, + "calculated_hours": 3416258 + } + ], + "outputs": [ + { + "uxid": "92bc1ce78fd98223f4c27438e22214117952de08798c2c5557f3e3350deee45f", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "275632.000000", + "hours": 427032 + }, + { + "uxid": "f575c8f632e92d9e3c7335f68e4e6c24d69d20fddbd05f794016b4d18d4d9c66", + "dst": "8CHWZqQEnBj9dTdZ78iqs1MVy83qgCuTs4", + "coins": "1000.000000", + "hours": 427032 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 327 + }, + "time": 1469463291, + "txn": { + "timestamp": 1469463291, + "length": 220, + "type": 0, + "txid": "823a284da9b7e49180e599552e824c60c23d28cc9fd4915e57037ac6ba5e364f", + "inner_hash": "83da271ca66c1da0f8ba30224552791e51f5334fb2868c01a95aa09aa5d8f8c4", + "fee": 22629699, + "sigs": [ + "bd8a3cfd554c7fcf06c2fbdb0efe399f31d30373c96a0846edd52a3163dca1b43060014bda1db9abbacda35addcd3cd89625fe8e4753067aaf9a2de226fd692c01" + ], + "inputs": [ + { + "uxid": "92bc1ce78fd98223f4c27438e22214117952de08798c2c5557f3e3350deee45f", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "275632.000000", + "hours": 427032, + "calculated_hours": 30172931 + } + ], + "outputs": [ + { + "uxid": "e4cd8349646afcc6fca01e94e0e247a22d447d0a3e6bef728854ebf3fe0a1507", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "275631.000000", + "hours": 3771616 + }, + { + "uxid": "f809efa66df51ff86023c6a514e91274a93dc303c34a191c37deb7e3467b9944", + "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1.000000", + "hours": 3771616 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 350 + }, + "time": 1471358102, + "txn": { + "timestamp": 1471358102, + "length": 220, + "type": 0, + "txid": "ccf809db24bde3af9083bb6ba590e91f71cd93335c945ccae3f815ef68994843", + "inner_hash": "18e96e61845c7f9134eec568476ae5f8909417230382a261384a4116cb6ea980", + "fee": 85052942, + "sigs": [ + "07220c9f545b585905db91d51aa1b00bd3c3c4ad251bd88c48cc1377c2ea86702ac6fb8354188abdf228cd9c05c8d8c0c8185e337f60fb824b06ca5c3893757f00" + ], + "inputs": [ + { + "uxid": "e4cd8349646afcc6fca01e94e0e247a22d447d0a3e6bef728854ebf3fe0a1507", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "275631.000000", + "hours": 3771616, + "calculated_hours": 113403922 + } + ], + "outputs": [ + { + "uxid": "46eec2ffbdaa24e27231765678002ee7c9ac4aeea7bb6df14f66bfa957e58d1a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "274631.000000", + "hours": 14175490 + }, + { + "uxid": "6e269a47dc13704da1058890e839f246fe6f57c52718687c863e0d16adbfbb3e", + "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000.000000", + "hours": 14175490 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 354 + }, + "time": 1472066732, + "txn": { + "timestamp": 1472066732, + "length": 220, + "type": 0, + "txid": "e348450f03f57e10e3cb1227b6874186d72f090c1cb6468b400b4906807cef02", + "inner_hash": "79e866fddd91dea1ba6c8bdb88bc880216d25c812145bb476e91590396146b3f", + "fee": 18254345, + "sigs": [ + "67d3293742ce7cd95612d1a01c0b307a94166fc0b7bdc01efcd312606f88a5a474affc18a56adf6fece4f9b6b593dd1479a70fac8d92d4d285e1af579eafb90b01" + ], + "inputs": [ + { + "uxid": "46eec2ffbdaa24e27231765678002ee7c9ac4aeea7bb6df14f66bfa957e58d1a", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "274631.000000", + "hours": 14175490, + "calculated_hours": 24339125 + } + ], + "outputs": [ + { + "uxid": "d13c10539700b17635d5ca63adb79f7da7faaab1d1c415fdf68e9a70ed5c633e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "273631.000000", + "hours": 3042390 + }, + { + "uxid": "26974a5d7ccd20eebd9c832b5fd40d62fb6bae48227fffa65dd4e5be26d12f84", + "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000.000000", + "hours": 3042390 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 355 + }, + "time": 1472069152, + "txn": { + "timestamp": 1472069152, + "length": 220, + "type": 0, + "txid": "c97bf2e161844d70686539eaec694b32678b130539946af8c3ec36f905e47d9a", + "inner_hash": "1e1f7265be9a1806a23a7f490fbd2f5c179e910102509dc4667e631115cad927", + "fee": 22951218, + "sigs": [ + "085b5436b72b9ccd1b0e8001c42408ff90ecb544a027da4e18dd550933a7ef8f7a9b5a44939856f9f8d47a8805091696148ba86cc174cfe73604f0b34e43290400" + ], + "inputs": [ + { + "uxid": "a0ba6219e79ab6470430b6b387602b58c96ef57a850e9dc94af8da0dfedfcad1", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "25314.000000", + "hours": 10499712, + "calculated_hours": 30601622 + } + ], + "outputs": [ + { + "uxid": "207fcc6aa056e56256b21b73410f679d7e1e1af414e95891e23cd689affdefb9", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "24314.000000", + "hours": 3825202 + }, + { + "uxid": "059f33c1a1a9e33c2518a6ea915534d5093f8aaec9b1c69a82e5348dcac52f6e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000.000000", + "hours": 3825202 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 356 + }, + "time": 1472069172, + "txn": { + "timestamp": 1472069172, + "length": 220, + "type": 0, + "txid": "7ca2667f49dc21f893f2273c592618b0238959ec9aecc881150d6507c6a1755e", + "inner_hash": "06516c42bb9cd1d9584281fc41497afbcdbcf50d227e33d56016d003f426e262", + "fee": 2868902, + "sigs": [ + "8172d96cbb9f33bbe1a2852745015abd99c4702af53aa10a0124efe0a3e1a32766ec459367d62f21dce3b08361feda40eef78dc273577ee4c8f7a0ee5551bc6d00" + ], + "inputs": [ + { + "uxid": "207fcc6aa056e56256b21b73410f679d7e1e1af414e95891e23cd689affdefb9", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "24314.000000", + "hours": 3825202, + "calculated_hours": 3825202 + } + ], + "outputs": [ + { + "uxid": "b636238d9d3c0eba57aeb47daa7a23bef5aac4021b636568d56c8428f62c6827", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23314.000000", + "hours": 478150 + }, + { + "uxid": "c91cd337ffa1a0e7d09ecd3c2f74c2932a5b7d9266b2e85205f64e5a7e8c5426", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000.000000", + "hours": 478150 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 357 + }, + "time": 1472069232, + "txn": { + "timestamp": 1472069232, + "length": 220, + "type": 0, + "txid": "ccf714517563cfb8a9d694a7a0ac534da01cb74e18d8a9cd0d410081970d8015", + "inner_hash": "0470dddb1c719ccb518dc8df7d0150373c61e19e3bbe0d2ced04a6ca66d71215", + "fee": 358614, + "sigs": [ + "8d29d25b00cd13891c3af52b6481d173d186ac4281afdf5a9c0646a55664addd0edbde30ce3d51c3952571ba37f056f289adefc1dedb1dde3465d2a16de6a02c01" + ], + "inputs": [ + { + "uxid": "b636238d9d3c0eba57aeb47daa7a23bef5aac4021b636568d56c8428f62c6827", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23314.000000", + "hours": 478150, + "calculated_hours": 478150 + } + ], + "outputs": [ + { + "uxid": "7e527dff560de74654aada4257259085486ea81716b577f7d8519a44beff78da", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22314.000000", + "hours": 59768 + }, + { + "uxid": "886eaf65af6434d07ca20fd4789825bbe87a61ff633fe1df15b69b9024b3cb99", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000.000000", + "hours": 59768 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 374 + }, + "time": 1473696472, + "txn": { + "timestamp": 1473696472, + "length": 511, + "type": 0, + "txid": "7a05ca15c9860700b34642339e91427ce0b211a8fe14805751d730f8ca0e5363", + "inner_hash": "34ef2b9ef8af1fb8d76b9ea9690356f2e0c20d1f672598020fa4e65aff25a9f5", + "fee": 88703844, + "sigs": [ + "a45592c587087f22e42bbf5ea9061e0668bd7e8fb3daa9c8bde6a1f2644c2a373c91d0b874a2fa95a4ce94284cf663035f83bba786c0c356ae055b89cedd623301", + "d422b1658a5a49642bd1126a269eaa1c939849dd9ca179db7992f0c274a16d313c4b2c9bb8dba458895ad7f12590da944af0880cb75592c0f4185c9b510747c900", + "a4250a03285edf63270784bc3e0d655b709622dfdfdd99af0b6f85060d3f540e36eeba0ed719a415f67d3c542e2efdc93c0fcfd9b0c946cca5c0fa5abc9837d901", + "e89be88a2dfd2beb052d0b628a2b4c09c38c3d19751e0551a65a22b6d9b4ed305974e673c7cb5d7c0259eeea76f2044f708c1ea2abf8cf5d92c84c81eed30b4201" + ], + "inputs": [ + { + "uxid": "d13c10539700b17635d5ca63adb79f7da7faaab1d1c415fdf68e9a70ed5c633e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "273631.000000", + "hours": 3042390, + "calculated_hours": 112708374 + }, + { + "uxid": "059f33c1a1a9e33c2518a6ea915534d5093f8aaec9b1c69a82e5348dcac52f6e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000.000000", + "hours": 3825202, + "calculated_hours": 4225310 + }, + { + "uxid": "c91cd337ffa1a0e7d09ecd3c2f74c2932a5b7d9266b2e85205f64e5a7e8c5426", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000.000000", + "hours": 478150, + "calculated_hours": 878252 + }, + { + "uxid": "886eaf65af6434d07ca20fd4789825bbe87a61ff633fe1df15b69b9024b3cb99", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000.000000", + "hours": 59768, + "calculated_hours": 459854 + } + ], + "outputs": [ + { + "uxid": "7cf5efd1f59555771e82dfbf11047cd856e554daac323e8224c174796b58cef1", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "275631.000000", + "hours": 14783973 + }, + { + "uxid": "aa975eb226edc45f46bc54bbbf08143ae1cc0cfedea598c536e1810b36d26258", + "dst": "2UXZTg4ZHF6715b6tRhtaqceuQQ3G79GiZg", + "coins": "1000.000000", + "hours": 14783973 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 375 + }, + "time": 1473696502, + "txn": { + "timestamp": 1473696502, + "length": 220, + "type": 0, + "txid": "9da07bf85e25c466daeb9e4bb8825161e2f2eb60ce470fecff30a557d8ab8d58", + "inner_hash": "2bf9ee9274c70c66f52d81df6b1f56bdbba9b17d3a67371ee45c94c0d91ffdad", + "fee": 11087981, + "sigs": [ + "13d93765e882705c482307678fc2d7d4d10ec733626066d59a6ee0d83be0c3840f66e43dec32bc09b2dea074675e8cf1fb0e768891191657ff1e8895f6d24edc01" + ], + "inputs": [ + { + "uxid": "7cf5efd1f59555771e82dfbf11047cd856e554daac323e8224c174796b58cef1", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "275631.000000", + "hours": 14783973, + "calculated_hours": 14783973 + } + ], + "outputs": [ + { + "uxid": "00813b3eebc56b3269dc82324b708ed031f816276eef23d2ec4dbaed0fe6be68", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "265631.000000", + "hours": 1847996 + }, + { + "uxid": "cb7e5dd3539b632b7c8de80bdd2bede4890d306ddde001854b21003546bdeb4a", + "dst": "bVMBhye4BsMtB9bC6t6VnQoYkbLH5JEb5A", + "coins": "10000.000000", + "hours": 1847996 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 423 + }, + "time": 1474976262, + "txn": { + "timestamp": 1474976262, + "length": 220, + "type": 0, + "txid": "c0b00aa1fac000b225f3d59983d7be04b41dded7e70549cd118648c0f4120622", + "inner_hash": "409996e4103fb8a6d0a508cd1b4b3f3c0145f255461ed590e013a4a1cec87f53", + "fee": 71142912, + "sigs": [ + "f11babcb58c0526909ab684968566c79f015a35eb5e800382847c58c12cd198b53cd8f5513139ba289ee547cbbbda6313516a8d18e10ee5497805d135020171c01" + ], + "inputs": [ + { + "uxid": "00813b3eebc56b3269dc82324b708ed031f816276eef23d2ec4dbaed0fe6be68", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "265631.000000", + "hours": 1847996, + "calculated_hours": 94857214 + } + ], + "outputs": [ + { + "uxid": "b220185a9f0f1a6af34e4b1ad882b7634d2fe9db3d1f8d7fdbc0815856abc06e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "244831.000000", + "hours": 11857151 + }, + { + "uxid": "9e5bd56c83575b8628dc1c497b7987bccd3cea12267782be95bf7cc9b47d6364", + "dst": "kW69Hh12ng6hqD6GsScVq6Bo6VDGTgq7Gx", + "coins": "20800.000000", + "hours": 11857151 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 491 + }, + "time": 1478603012, + "txn": { + "timestamp": 1478603012, + "length": 414, + "type": 0, + "txid": "127cae7ab2e851738fc4c9894dade853173c658317e5e551c0618f3c14de0c6e", + "inner_hash": "ae44ad68c8a6f83d22436a19ff274d5eeeceb7c515348c910cf09abea87b4449", + "fee": 258638492, + "sigs": [ + "0a332a5c2c501b5fcf6d8ce21ef1aa6c82324dcaf5a4162a0ab8f6cada1ae56b19be195564263ace98db8a0b0b4c37a5ac080c5a55c76b2c9315980a025307b001", + "b2a3d81f2a2bd12ed1fc0d5bb9daa781a2553410902a25cfcf4c179165ef52936b86c4774ad3e9a4fbc2188f8fe7e5ad1949715c307ab4499b4d2bc2536bb2b600", + "e660d1823b2d2637c2da6080443410dadf90c8559e17b37b17fe51d553e2f26c0b71ee1b3a652b522b0f1cc17baef65f63457259b06fd6126fe4e2b1bf101e7d01" + ], + "inputs": [ + { + "uxid": "22f6cbb46c9d8566f6cdb3882dbd77bc473432c097b704c14457babd66da993d", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "400.000000", + "hours": 3128290, + "calculated_hours": 3397714 + }, + { + "uxid": "d0e6c3ff06b1125d70a707f57b4888a96aa56fe26fbf0fc80ce7d560acc77f63", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "400.000000", + "hours": 27225, + "calculated_hours": 489283 + }, + { + "uxid": "b220185a9f0f1a6af34e4b1ad882b7634d2fe9db3d1f8d7fdbc0815856abc06e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "244831.000000", + "hours": 11857151, + "calculated_hours": 258504661 + } + ], + "outputs": [ + { + "uxid": "4594bb2382ac97aa0cf3ae0eeeae2d2a0dbe96a6293d0bd715e2ce7165080977", + "dst": "2X6eRFh6pp6rUHj74NJXLcmTg1TnDaPyYCw", + "coins": "1000.000000", + "hours": 1876583 + }, + { + "uxid": "931267f628963f9faccfaaa4973cb20a4d28a02a8c97a89f83f91d3413af7af7", + "dst": "Qq7dG2S5jwNgpayJzBf7kTtfWmpfSQPCQ6", + "coins": "244631.000000", + "hours": 1876583 + } + ] + } + } +] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/address-transactions-incoming-212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/address-transactions-incoming-212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN.golden new file mode 100644 index 00000000..6279e632 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/address-transactions-incoming-212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN.golden @@ -0,0 +1,168 @@ +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 17, + "block_seq": 164 + }, + "time": 1430790052, + "txn": { + "timestamp": 1430790052, + "length": 220, + "type": 0, + "txid": "743bf1eede313145824db1c4f8d683b74ab5e0bc825082d986308b73fd52f1d7", + "inner_hash": "a0427c37a8ca9f8205630cc8d4c6d95200413d3397a0de9bf015763107b8fc80", + "fee": 0, + "sigs": [ + "dc400e921f7f94da5f353846f1340e039b4527fff121a56579390fb4fa4154634e3b3aad44ddf0aaebea5abc1dc5ba2a00540fd2888ed5c4ab7b20c51255086a01" + ], + "inputs": [ + { + "uxid": "c07593d4329f82da243e4bbd7430e4b10e7b35f9ce0a3718d0e6d25d20b4939b", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "661314.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "4d52106e41dba0099549fd81fb8feb6915225b0125c53faa0f7c578ea78f213a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "660314.000000", + "hours": 0 + }, + { + "uxid": "bc513a68461d5c401e65a500baf7dfa163735ef63b817bb7b73c4139d5c29d18", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 12, + "block_seq": 169 + }, + "time": 1430836392, + "txn": { + "timestamp": 1430836392, + "length": 220, + "type": 0, + "txid": "acfb61f7ca39d5dfe33e8ed66f73ab181da0a3206d457bf055dcc4b9731a3ec8", + "inner_hash": "85c5d3963f2dce44e99500967e8b8b1943839537fb198186131459a3022d161a", + "fee": 421, + "sigs": [ + "473114dcb42e2091f3d0396ecd16ee2685e0a6074c7de218cbd7e7c4335d89146455bc6c259c77f40d4af769e241aba1e3a102c5755946b1783c817ffafa67d101" + ], + "inputs": [ + { + "uxid": "bc513a68461d5c401e65a500baf7dfa163735ef63b817bb7b73c4139d5c29d18", + "owner": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 561 + } + ], + "outputs": [ + { + "uxid": "639e69c4a223b5082b9274caf3e56ecff2ab55cd90cac94fdb4c383a1013ba1f", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "990.000000", + "hours": 70 + }, + { + "uxid": "bffea1990d71311b695b2d343b9f09a216b7a8257c1cdcb01b2ab9459e1490e3", + "dst": "jtuSERvfzN3kUYekg8LemCQ5kF5g97N8ZL", + "coins": "10.000000", + "hours": 70 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 11, + "block_seq": 170 + }, + "time": 1430836422, + "txn": { + "timestamp": 1430836422, + "length": 183, + "type": 0, + "txid": "95d847102c01d071982e67b8e7dfae50715b0fc0179d33f4b050974e634905e1", + "inner_hash": "c13b7e1722f3616f61948ed42382d4ed41164e7e2110d2d60bf86725f32531de", + "fee": 62, + "sigs": [ + "cb7da0e16b83f1717614c7f160580ac0048a4276682ac4046c3324ba6f4e24901d162f7ec81a8e5cdf3676df6ace9a73c77e4d3ab7f03a4f0272c75f3715665001" + ], + "inputs": [ + { + "uxid": "bffea1990d71311b695b2d343b9f09a216b7a8257c1cdcb01b2ab9459e1490e3", + "owner": "jtuSERvfzN3kUYekg8LemCQ5kF5g97N8ZL", + "coins": "10.000000", + "hours": 70, + "calculated_hours": 70 + } + ], + "outputs": [ + { + "uxid": "be081639ea8da63d8542707e9ea9625f6afc97da132f43ed061645c359bb1e65", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10.000000", + "hours": 8 + } + ] + } + }, + { + "status": { + "confirmed": false, + "unconfirmed": true, + "height": 0, + "block_seq": 0 + }, + "time": 1535637620, + "txn": { + "timestamp": 1535637620, + "length": 220, + "type": 0, + "txid": "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947", + "inner_hash": "f8293dbfdddcc56a97664655ceee650715d35a0dda32a9f0ce0e2e99d4899124", + "fee": 34297581, + "sigs": [ + "3981061c7275ae9cc936e902a5367fdd87ef779bbdb31e1e10d325d17a129abb34f6e597ceeaf67bb051774b41c58276004f6a63cb81de61d4693bc7a5536f3200" + ], + "inputs": [ + { + "uxid": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "hours": 5521648, + "calculated_hours": 45730107 + } + ], + "outputs": [ + { + "uxid": "8f9c09c37e0c636178e4229e2e8212c067ef0a8c501be9e2757a97b980d7a98a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "605700.000000", + "hours": 5716263 + }, + { + "uxid": "32a060b2e2025cceb40f3f982c887952d3358d468db1719dd892eab575c14c14", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10000.000000", + "hours": 5716263 + } + ] + } + } +] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/address-transactions-outgoing-R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/address-transactions-outgoing-R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ.golden new file mode 100644 index 00000000..4d0dd8a6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/address-transactions-outgoing-R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ.golden @@ -0,0 +1,4661 @@ +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 180, + "block_seq": 1 + }, + "time": 1427926392, + "txn": { + "timestamp": 1427926392, + "length": 3846, + "type": 0, + "txid": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "inner_hash": "0f7019627886818d2501af189bbac18e21b8e959891c5b2726f89e29355aa10a", + "fee": 99999999999900, + "sigs": [ + "be602113fe288f750001ab65f254ceedd8b05b1becc456a0a52a0bea10b8280e38d950933992ad3265e1f81d197036fa634b316f08b3b319ffce081aa43f3bb600" + ], + "inputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000, + "calculated_hours": 100000000000000 + } + ], + "outputs": [ + { + "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "26f585cb96f35307f0af5b9aee004a29b7795695f4c5c836104e2fbbf429a3ce", + "dst": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "18a43b8b69bbf12a9e49e6f9783ba258397e6567301aeed9e901a1e4fed9fef9", + "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5a69ef09b5de21b117cac62141a8de4eade7558c42f0ba8b50996f5ec7867c5d", + "dst": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "aef761a12e3d0fa9c4a8db62b8bab1015c32931b7e3a7fc9a77282cec218f79d", + "dst": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "445a4082da251fa161e4705d115fe2018ca15a5f92e8a0950793405410e6be12", + "dst": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "dst": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "368a609ee90ca15bbbd297af07dc6705131764476d54bef641017ffcd0885e65", + "dst": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "13afe1586015c4d7312f89d123153279e4961eb0d53a4d036847d5d989ba90dc", + "dst": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f625cf04412199c16e073dbb500e66c23cfe69043578b4a2d879a329aac563ec", + "dst": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b2da50a08756c34d059a04812451cf3296f73ba87f8cca38473ac8f051ab6d1e", + "dst": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "135c28698e80e3b2a737d59c16c79684c3fb3ec5cec59f466a39f4ac3c73968e", + "dst": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "df63056cf3ae21efa86d241876ad0194387317585dc9e4fcd80954b47d59b57a", + "dst": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4628f4cfdbf1eb7cccc25d461c46cc29e90cffb5d6277e0de641f7701d60c308", + "dst": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "47e4706dc4d80a70b20c889476fb0627ca6d5bdaa790f4ceba44a689d31b2dcc", + "dst": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b64bc50d370a06df117eb543ca051239c985cfc4b6aa527c51b700de32c7fc41", + "dst": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "390bc4c045fa9f289957b7eca529bfadac96a7dd074bcfbdd3b09e99413b8202", + "dst": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6aa162f7fc09598c4dc8f5fab7fb2383f28c3840937a001acd9f37136e1691b2", + "dst": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e440cf4c896735d3299a871f988c134f404fb2065d1f20c87c9c9bc5fa582e09", + "dst": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "eea791e84a53e4d99485519c5d2c3146b0a2ad080cf92904ae7b28c2d9a6e3ca", + "dst": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "01048ad6a538256d9a8c6c9c6321ca1a01b31cbf08e74fd4ff0f141bf97eb8ce", + "dst": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc5f1f1ddc8cb23df3d42f1e5a1dda9d356846fe930ae4484bc1eeb1b3b2c95b", + "dst": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f03087245a6b64bb69cd5866a1887ae595a9e1a86e196754984840eaf6d3eb9c", + "dst": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "239bdba27dabd52f7450f7d8521c9a7e5ac74093ae3f6f2348bf40ac9a6db7a5", + "dst": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d60879e562b65f97d40bec7309d4490ba0a8c80e2349ecb2e3505aaa50ea1e47", + "dst": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "66e685901492c94942522c346759c711ee2e78a059ef274e77a6ab433409683c", + "dst": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b497992663f99f9902deaaf487b00655820003015ea92091628f4a6e8aeb5854", + "dst": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc40377012004566712fa860e74db97305091cc163e95435e04556c70d32f9c5", + "dst": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "73304622e33994bc2d4ade2cab78d28e1b65185e60ad3c781ecfb5cbc8159136", + "dst": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fed15e8506d0e0898510311850b8863ef6d9a499215ae8823a1e3fb9c8140ab2", + "dst": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "12034bc455d0821813d7eb9afed1ed1a8f19b6f29826ef4a057b4aa0b4228817", + "dst": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fc444cdb2598f44209a41ea20afdc9065ebe51b7cd5f65bb1c0f7a7b427ce7b1", + "dst": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "618d242d95d33e2d7316612a164d89859b85f1287f0d5bed4dcb561cf478f706", + "dst": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "07f70fd4108ef4d2fde3b85411728c1f7bd3a135d2062c5a30a46cc885463780", + "dst": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "af9bcf6ba63a08e699bc101aa362f135343aaf78a56e9f88d118fca0e1ce5c08", + "dst": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6b3530bb930ed10bbc4c307663aba4377c08443498a0a2cf023b1be72f378ae1", + "dst": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fd6da5199e528958e68ee8dd003b727d4d840754ea7c1e0c05e4f0e504c9b2cd", + "dst": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "131f07f5b40f365fb537b863e4aa5ef0efcd77b7fa2ff321d90eeb743ac43678", + "dst": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ffbdfdbf3427d04f445c33e867845bec1ee64a9dfe0d0fa8284547c2226fdfa9", + "dst": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b53c7188ebf4d630790ff63275679ba48009e31af6e4fe15806619216caa750", + "dst": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b4c6639b49402c2753f83c7fb7d3ffa65da74e47fef2b781933ff55b14d09bcd", + "dst": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c956289db079c00d2f80c590d3c8ca26c37da534fe5f65e799b3982ceca493c", + "dst": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "550d2a8d3047cdae0c05a61cc3de43e758b123a6955fa067d3ac375f7d0dbadc", + "dst": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78740d5bf49989936d315bf641949232aace582e03de57db8abff940f7d51bd1", + "dst": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9f2c83c5165826de1077f428ad39d41473e32ed64cd83180d49e7d8e5db996d0", + "dst": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "883be4d7173c235933294ab8dcae8cc76609166eaa1c1f07e9b51d551c979709", + "dst": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6384ed19650d384c29db4c3a39a1ca855058fab758075be2dee759dd9e6faae1", + "dst": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", + "dst": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c238e82f3a4beee1be7b5b464e8553404f6927d5ab93c3d649d362c01097782", + "dst": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dad4991bfa5c51eb176f28c1b3f86661e02579905e6e07c997df22004e06244a", + "dst": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4ba91512c168281f41d3934b927d0d86a3136a31cc345b635095928f8e5f013c", + "dst": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c416f5e604eeada9ae8e520a429d8f19d4230626769e7121007e01353730784f", + "dst": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7b8787fd4076c27d074d2a4761377a1aa26c843c432e3b7e6b0ebf1e29528188", + "dst": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "38f22b194f04d85a6b545b37df06195edeb8503798b229ddeaa946018150c05c", + "dst": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "246377a036ad5444bcd5f47ac9e55fec7c85fc40644df593038d360554a809f7", + "dst": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c6d5e543ff5f2c2526728d588fb21753db5b7e05b8b275aa5e9b24d29350afb0", + "dst": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "98e223e6e2240fef83082d3daa86e46f10e0c71f3f74489ba95db0951a166f53", + "dst": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c8971ca91f8e21c556f647940073db003f7dd5582ae55d4ebca602d5e8e91a6e", + "dst": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dfa7822c05f54116c9fc3b2cde1ecb4667f47a2d8771fe886e832c223cdc4e82", + "dst": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6d37c0c4b6fcbac1e53a46c9c2dc5d3c3b36312c53f25b2baacc785ea77a11f7", + "dst": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9ba5e31610f0545666f102465efa8caa48ad3fb5b8abd5ae802f4a71e3f7de3b", + "dst": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "3ca365aace71e24b04d6f2ffbf7171468c5e71783858c710cae539c5e43e0c0e", + "dst": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c858f2db2a20ac562d32f8fb2a3a11039849a6e44d2bec30befb2e173532a9a3", + "dst": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1550a76598693b950346397e0e825bbb2805edde38b0d0240e50050829b7b1dd", + "dst": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "466340ab7733abb23ab24d877c673fe089c273f11808fbbd6f33a91da92ee96c", + "dst": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "401d4c0c1060ebbb4b9fb3859c2eb47789f94086f4deb01234bf46f7cdc81247", + "dst": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2c0e3aa084f5fec45f99b3f125ce7d50c6da526ef5165df5f22ba603147c3fc2", + "dst": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2e724d83e35235c23c0bb16ae9b708a5bba3c23b186b05d4b8c606f6bb4b311", + "dst": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4f30eae8c49eb268fe364eaf5ee0788da6e2f6adc2f83cd82e96a4bfe98496f5", + "dst": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8753d5775c22477a8ef74eeebf61d7de30be702e70118f552cc18ad963ffe950", + "dst": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efa2007c561dcbf7c83a6bbdd2ef75e7cca76b05330a8b948ba0dd94dee949f7", + "dst": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b379d1b8ff0153c63ee69c40a7155b97fa42ab570f68ff847d457316c4d8ab9", + "dst": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cc84f93adce16699d9e84ef32f55333402431b58dc50c17084bcb8b33f382f88", + "dst": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f38f0760769c19075034f70b059abf4d1bfa6d01e1e8c369a99900ed1eaeca6d", + "dst": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8d55f76bb0b3dd222cf85a7193501c0f4071b446f56dbd1da355b1625993325a", + "dst": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efde499c7e4444bc602b7bf5ed50e95a18ce8ec9a06ba9d850a05bb7a25ecb3a", + "dst": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2a4d631d5dc90e397d85f13410d1a6d877dcaf592a0e2be2e727443ac74b5bd5", + "dst": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e936299a21240744f6edbab493449323f920bbe15dcf294463e5a2ace10f27b0", + "dst": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "44e17f4bd29411a1614457171c06183e364bf6ff80a201717b2dfc0748e9ebe3", + "dst": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1941e5cc5e38dd92427580af699b1f410be7b29ff17d3d0ff3d046bfba0aaabf", + "dst": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ff6c0f27fcf92f3b4a3871b801c3116847fe47a7e3bafcadd4855d06012091ad", + "dst": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cd6c4b785e60757fad0e6fd4874b729ea7703fe7ee9560e1283d2eb71fc75321", + "dst": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "745eaff456a390c3868742a039e72c2a93ff8eee10417dbe848d533b89facc04", + "dst": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2f3f050c9ef31bf5c3b14c1c71699c4f4b38aa18479531194d12e6277416516", + "dst": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0b95850edabed70762768ac1695c5d7f230cccaa8de06657cda42cafba36374f", + "dst": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7c767d3a06db1ac0e1809ebe29a7d9689143259f4651837de54423e287c20490", + "dst": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78b07e8fe1366e173f2eeb75c35cd53baf0f6100de50ae12b4ffe7d0d7ba4298", + "dst": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5010eb25f6e1ed725fb901ae1e945e545ae846d7be8a135333d2d41102c33328", + "dst": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "178a33e64826cd2039b8538b74e6de513966acab45ab79d77dc9392018a65ffb", + "dst": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "044dc539d063250dc654b2bf0986a9044b4eea05e1284c11a2b313acd8dc3498", + "dst": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9fd5ea38f383291566def44b6fb932414f97123952578fe0cfb9a30eb075a099", + "dst": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "be5930e9cc35801433bcd21db84da7d4f1d8e744feca16a2c6fb00c81ce93e51", + "dst": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8cd999cd193d315e5f1c6f74c230c12e6abe6847924f6e89d988e09ca413f52e", + "dst": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0cff53628eb0e984c134b68cbe4b1bb7721a05adaa32e93b9df489a9a7a176cf", + "dst": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "a5ef046e84be9ff2485dde49afe6073811286761afac3bbd588b6e4130930479", + "dst": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cdee5f84c4f08098ac740e3a260ced14c1e199e126aa5291ec079b281a7dc407", + "dst": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6a24135f8496e7a37dcf7164218bb3aa530319f3b2bf3c7a1a9cc1bd17831328", + "dst": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "693c7f970b34ce5882e62430f4c9c28957159a257d27d4e21a61fd95c6b97464", + "dst": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c008a613cef129c180dbcc7213f2d41a14d245d06a3844d63d9beac963145385", + "dst": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "439cdfd03972fb4bb5da54208cf8098ee78228c487ce9e84623f5f83e17a7d68", + "dst": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "hours": 1 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 179, + "block_seq": 2 + }, + "time": 1427927651, + "txn": { + "timestamp": 1427927651, + "length": 220, + "type": 0, + "txid": "312a269b8248e389c61571cc13f4ad13b7d53b64853d990ddc301a58e7071889", + "inner_hash": "4daff2831f5bc2877a98a49b0ef75f8ff01bcb35082fd4018c77707dfca31849", + "fee": 0, + "sigs": [ + "f4482e0781e0d94c8c4773940e1f811405681844a9dc3c1938243442e1cbd5463d5e251880abbf8ff1ed85b4b2659e83ee30f06cc4c5dc9913aa6a9630fbe3de01" + ], + "inputs": [ + { + "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1 + } + ], + "outputs": [ + { + "uxid": "0cd548e03bd13bca8647cd13f6baef0c65fd03081aeb6dc3695536e5bc6018ae", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999990.000000", + "hours": 1 + }, + { + "uxid": "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 178, + "block_seq": 3 + }, + "time": 1427927671, + "txn": { + "timestamp": 1427927671, + "length": 183, + "type": 0, + "txid": "a6a709e9388a4d67a47d262b11da5f804eddd9d67acc4a3e450f7a567bdc1619", + "inner_hash": "ea6adee3180c7f9d73d1e693822d5d1c2bba85067f89a873355bc771a078faa1", + "fee": 0, + "sigs": [ + "ce8fd47e2044ed17998f92621e90329f673a746c802d67f639ca083705dd199f6ee346781497b44132434922879244d819694b5903093f784570c55d293ab4af01" + ], + "inputs": [ + { + "uxid": "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 177, + "block_seq": 4 + }, + "time": 1428793611, + "txn": { + "timestamp": 1428793611, + "length": 220, + "type": 0, + "txid": "c24b92898381fbebe59a457924184f4cce1e7166e140ca75aea5baf854c1ab75", + "inner_hash": "43dd65d5644ec5214a901ac94e530cbedb83d2174cf402c7b24697cfe55e1de7", + "fee": 1852, + "sigs": [ + "434a7a0b624fda393c1caa57ac9787f69da3d8854d0ec6f69f0da1c96c9b683d787064b644e9ac3dd4dd8466c22c1547cff89c2552420f5efcfd1eacb1a2eac301" + ], + "inputs": [ + { + "uxid": "0cd548e03bd13bca8647cd13f6baef0c65fd03081aeb6dc3695536e5bc6018ae", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999990.000000", + "hours": 1, + "calculated_hours": 5556 + } + ], + "outputs": [ + { + "uxid": "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999980.000000", + "hours": 3704 + }, + { + "uxid": "98b3e6e6d4ed36159b7dbf5f305174fc0c255d2d97528b35a67d50b9968e2b2f", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 176, + "block_seq": 5 + }, + "time": 1428798821, + "txn": { + "timestamp": 1428798821, + "length": 317, + "type": 0, + "txid": "0579e7727627cd9815a8a8b5e1df86124f45a4132cc0dbd00d2f110e4f409b69", + "inner_hash": "fe123ca954a82bb1ce2cc9ef9c56d6b649a4cbaf5b17394b0ffda651ed32327e", + "fee": 2036, + "sigs": [ + "056ed0f74367fb1370d7e98689953983d9cf34eb6669854f1645c8a16c93d85075661e7d4f6df0ce5ca8eb9852eff6a12fbac2caafee03bb8c616f847c61416800", + "8aaa7f320a7b01169d3217a600100cb27c55e4ce56cd3455814f56d8e4e65be746e0e20e776087af6f19361f0b898edc2123a5f9bd35d24ef8b8669ca85b142601" + ], + "inputs": [ + { + "uxid": "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 2405 + }, + { + "uxid": "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999980.000000", + "hours": 3704, + "calculated_hours": 3704 + } + ], + "outputs": [ + { + "uxid": "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999890.000000", + "hours": 4073 + }, + { + "uxid": "dc63c680f408c4e646037966189383a5d50eda34e666c2a0c75c0c6bf13b71a1", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "100.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 164, + "block_seq": 17 + }, + "time": 1428989855, + "txn": { + "timestamp": 1428989855, + "length": 220, + "type": 0, + "txid": "d952ef4cc45a89c14230ba0f7e30b782fad83cb6506ac0f503a242c568c1287a", + "inner_hash": "8fc48920982066fd4c69e2d2c0c5239cca7c296f0e3ad30e9b976c1230967478", + "fee": 2020394, + "sigs": [ + "b7eb93bcebb6df3dcad48afd66dd60bd42b1fbcdf52aa5e0c7e455e791f64a976fa416534b4e08bf3e62a2df83e13754119634c4255dd1e2e08be447d4d5b47201" + ], + "inputs": [ + { + "uxid": "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999890.000000", + "hours": 4073, + "calculated_hours": 6061184 + } + ], + "outputs": [ + { + "uxid": "4168b9378363cd81939e667cf78055d35a60d3101f5f9e3d2ae709e3981e29fc", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 4040790 + }, + { + "uxid": "c603e99ceae4d15c20360714ee07ba6e3a944a97ea9285d164c23252e93958b6", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 163, + "block_seq": 18 + }, + "time": 1428989925, + "txn": { + "timestamp": 1428989925, + "length": 183, + "type": 0, + "txid": "686db0a8cd429970bb91163033703410d4750c86ba485709fe1a3faabbbb42f6", + "inner_hash": "76732ac6a9936242193011d78a0f2849529aee767a569c9c6bb25b3bbae15cee", + "fee": 0, + "sigs": [ + "d74dcfdc8401a29b1dccc728b40b6b79faea147c65b4a859063ad77cc63aa9a62417c63b91b94678b6656fdba2f242d836b6914e77d244fbd16aaab014ddb44300" + ], + "inputs": [ + { + "uxid": "c603e99ceae4d15c20360714ee07ba6e3a944a97ea9285d164c23252e93958b6", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "d9dae1f82177f979b07016a341ed5c281ed6ed8eaa785a8a107ec16efbe541ef", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 155, + "block_seq": 26 + }, + "time": 1429011077, + "txn": { + "timestamp": 1429011077, + "length": 317, + "type": 0, + "txid": "56e7bd13dc4c6e1cd80aba66a0a9fed650d0646659ac774e3f1b415848755d85", + "inner_hash": "2894cfa31c21eb04c33f89263aa1e4caae625ceaf30539b82b39ccf79dffa816", + "fee": 3407635, + "sigs": [ + "6aedcd617e69aab9724b6a52e0e71f4f087a2fa84a283ac685c17e274b49cf617e58dbbd6c45a8e2c1c31832a1193ba119f0cb238fd83b9d7eb029dcedbeba0800", + "f1f26b84f247c409d308bf0992c2a044ce649fc09169d5fe4843f22b855f911d6c73b92f679346d30ec6663aa5d0387189935ce8e2f2256dd13e59cbdae7b89e00" + ], + "inputs": [ + { + "uxid": "4168b9378363cd81939e667cf78055d35a60d3101f5f9e3d2ae709e3981e29fc", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 4040790, + "calculated_hours": 4543507 + }, + { + "uxid": "d9dae1f82177f979b07016a341ed5c281ed6ed8eaa785a8a107ec16efbe541ef", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 4 + } + ], + "outputs": [ + { + "uxid": "8793a3782bf673393a8f909f267f3bfcc713b600460893b571fd55f675ac65ba", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 567938 + }, + { + "uxid": "339aeec109a26bab65e618d73ebba16e5b8fc18f7dc1fe502ca891ad5b0f4d5f", + "dst": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", + "coins": "10.000000", + "hours": 567938 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 154, + "block_seq": 27 + }, + "time": 1429011137, + "txn": { + "timestamp": 1429011137, + "length": 220, + "type": 0, + "txid": "cff53a059d55f2c90f6dd7ce7de2cc07cbdbd50b25867cba0f41cd0192614d0d", + "inner_hash": "09382455a4e78c62bd0c254e106d349f648944c3747b066a23cc64d9392c6c05", + "fee": 425954, + "sigs": [ + "ade8874855f58653ef198e005a7ec82de992cddb50a4bb5ce8a0ec1cfa7b44086883ad1c85c63128dad5426b8b22873c349e0535191b80b3e92035b120cada7a01" + ], + "inputs": [ + { + "uxid": "8793a3782bf673393a8f909f267f3bfcc713b600460893b571fd55f675ac65ba", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 567938, + "calculated_hours": 567938 + } + ], + "outputs": [ + { + "uxid": "ad742bbc7420c08881e6ccf35e34e8472c0dd6386792359aedcfb752ca618c33", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999790.000000", + "hours": 70992 + }, + { + "uxid": "3e475e76c226a70c87d030d8fc6b8b1c2cc654ba9eaf3bed08be5bd603aec0b7", + "dst": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", + "coins": "90.000000", + "hours": 70992 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 143, + "block_seq": 38 + }, + "time": 1429058484, + "txn": { + "timestamp": 1429058484, + "length": 220, + "type": 0, + "txid": "a76cd63b71f1f5425941cd567627e1dcdc8c34306a7945ea48755f5a46efb6f5", + "inner_hash": "39c3ed7f2dfb26d02c9fcbbe853db5c3031644b4a66844a717d8795c6d954d65", + "fee": 2335473, + "sigs": [ + "844af158e935a38f034778a78b646a167b5758df65212546f2eb1c7e838216ad7aa6e7571d1e81d8836808d4315846fe97489bdf2e6d2159a2af77a15a9a2bcb00" + ], + "inputs": [ + { + "uxid": "ad742bbc7420c08881e6ccf35e34e8472c0dd6386792359aedcfb752ca618c33", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999790.000000", + "hours": 70992, + "calculated_hours": 3113963 + } + ], + "outputs": [ + { + "uxid": "108520145179c00f581d91e273714811fe6e82ee059d65218eea91154ebd8205", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "998790.000000", + "hours": 389245 + }, + { + "uxid": "f48432d381a10abecbd1357d81705ea922246e92170fe405d1a4a35c5ceef6a4", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "1000.000000", + "hours": 389245 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 142, + "block_seq": 39 + }, + "time": 1429058494, + "txn": { + "timestamp": 1429058494, + "length": 220, + "type": 0, + "txid": "c38b47bd576e3bced2a9309c3df7622064e71177f54020d77193d5cac310719c", + "inner_hash": "7f02ba6476946668f3adcbb35e113531e6788cee4fe94bf8d8da4803e3baa7e3", + "fee": 291935, + "sigs": [ + "2a31eb55da895c59654ad3f1a11efa11b04787ab78dcf8221aeeccf137adec543765f761363390c97f429310fcb39db305494a94b30af906a2d43d5de1effbb701" + ], + "inputs": [ + { + "uxid": "108520145179c00f581d91e273714811fe6e82ee059d65218eea91154ebd8205", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "998790.000000", + "hours": 389245, + "calculated_hours": 389245 + } + ], + "outputs": [ + { + "uxid": "e79c94aa7013c7611901839236b8a1cdf70e8ef7c40b9e33f99359136de981d6", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "988790.000000", + "hours": 48655 + }, + { + "uxid": "df5d6e09da2585a6ac1a37aea2370fa25e9049b549049202d5417138bf033cfa", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "10000.000000", + "hours": 48655 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 141, + "block_seq": 40 + }, + "time": 1429058514, + "txn": { + "timestamp": 1429058514, + "length": 220, + "type": 0, + "txid": "b56f3e9239da5c5f9bb5ca80226b8454ba36ce6012f8e323a50c9d9c4eb4a834", + "inner_hash": "bdcf8f2f2b960cfee6b3b1124a554ef4747fe43ac9452d897bd8dedcd643e1ae", + "fee": 36493, + "sigs": [ + "809029f12d5f38906306610feae26c0623bffe63218c8019060ae2d164cc29352066efd20567e3c37837230e74b481730b0fc71bcafe3b3b9f5eb4a7fb42f69101" + ], + "inputs": [ + { + "uxid": "e79c94aa7013c7611901839236b8a1cdf70e8ef7c40b9e33f99359136de981d6", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "988790.000000", + "hours": 48655, + "calculated_hours": 48655 + } + ], + "outputs": [ + { + "uxid": "c65a9e6aa33244958e9595e9eceed678f9f17761753bf77000c5474f7696da53", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "978790.000000", + "hours": 6081 + }, + { + "uxid": "f8ad5c72e7822c7ac9a1dce8de583e34f6f830052bc0a02d749e9e81790dae86", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "10000.000000", + "hours": 6081 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 140, + "block_seq": 41 + }, + "time": 1429058524, + "txn": { + "timestamp": 1429058524, + "length": 220, + "type": 0, + "txid": "cf4fe76a08e3296b6f6abdb949604409be66574f211d9d14fde39103c4cfe1d6", + "inner_hash": "2f5942207104d52dbd6191684b2a97392e616b7fa51dde314dbddd58d34b8027", + "fee": 4561, + "sigs": [ + "b2b8c8ec1e1dfdeac4690e88d4ef9fcc4b52fcb771153f391cbcb58d651505a94c6263b6dc15a948c0396c0d8be20d9e0d1993b494bd9189c778d3673363bfc401" + ], + "inputs": [ + { + "uxid": "c65a9e6aa33244958e9595e9eceed678f9f17761753bf77000c5474f7696da53", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "978790.000000", + "hours": 6081, + "calculated_hours": 6081 + } + ], + "outputs": [ + { + "uxid": "195f5e50b4eed1ec7ff968feca90356285437adc8ccfcf6623b55a4eebf7bbb5", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "969790.000000", + "hours": 760 + }, + { + "uxid": "6bbf13da052e1baade111ae8bb85548732532c8f5286eba8345d436d315d1c93", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "9000.000000", + "hours": 760 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 136, + "block_seq": 45 + }, + "time": 1429071074, + "txn": { + "timestamp": 1429071074, + "length": 220, + "type": 0, + "txid": "df622e8c9dfaed1d7dca83ad7f6d8946bb86b81398bad521d858cbefef8e4688", + "inner_hash": "91ab4f29d84e9ffba56a108e01984e7b483729da4e61b6976c018fa11ace36a8", + "fee": 2402820, + "sigs": [ + "d0726d81cb1cdce6028668d0d95ceccf39cc9d655a7bff143573b9f52d0586232bbb7bd494df8b9bb5155a271446cfaff1550d5ccf314dd35f044226f98d14e201" + ], + "inputs": [ + { + "uxid": "195f5e50b4eed1ec7ff968feca90356285437adc8ccfcf6623b55a4eebf7bbb5", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "969790.000000", + "hours": 760, + "calculated_hours": 3203760 + } + ], + "outputs": [ + { + "uxid": "cb8efc0b1082c39258cb6efd59f64d88b36fcb60143c826829fc5f0ed5c0d668", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944790.000000", + "hours": 400470 + }, + { + "uxid": "4aca4c715985da352bd9aa84787868dac4f4e305c420fe79e6f05acee3bba14a", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "25000.000000", + "hours": 400470 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 135, + "block_seq": 46 + }, + "time": 1429077374, + "txn": { + "timestamp": 1429077374, + "length": 220, + "type": 0, + "txid": "0a2da0489b14156fad8fb863d051a4dac1f645f144c1e5bb65a44478623b8e4b", + "inner_hash": "787ae7cb222a23641bb33751d1428dc8e07a2f2cf11ee6293a54100836209d09", + "fee": 300354, + "sigs": [ + "9bc3b6d7cb1d66d52fc993d0799baafa1056992049fa86ce76d5909690e88c4a19920b69e2463cf34d1dddb545b61ee38fb2f9b33f92626da8afdd934c353c8e00" + ], + "inputs": [ + { + "uxid": "cb8efc0b1082c39258cb6efd59f64d88b36fcb60143c826829fc5f0ed5c0d668", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944790.000000", + "hours": 400470, + "calculated_hours": 400470 + } + ], + "outputs": [ + { + "uxid": "a6061defc41a8a55e37eaf56ebaa1177446f61719b1d5126698e79a6023f5367", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944780.000000", + "hours": 50058 + }, + { + "uxid": "a52408daa8ce7026c70b61d4df4212fb577462060f340bfce779225b3e18193d", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 50058 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 134, + "block_seq": 47 + }, + "time": 1429077384, + "txn": { + "timestamp": 1429077384, + "length": 220, + "type": 0, + "txid": "a4a202bc4431d95c307d151dea764bfc6d9ceb7e82b3eb50dc8604050622a22c", + "inner_hash": "836145a3e62a7e055acc3404c1fd6ecb237e3251e6f8b39fd526a7f48f21daa8", + "fee": 37544, + "sigs": [ + "f826793e63a3b0b837070e8876461c47af6be7a6898c370c70430b1491457cda76fc3b34e08bff41a336277ec1e93cc008f9c08ca295b418488b1ac92a5f5a4000" + ], + "inputs": [ + { + "uxid": "a6061defc41a8a55e37eaf56ebaa1177446f61719b1d5126698e79a6023f5367", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944780.000000", + "hours": 50058, + "calculated_hours": 50058 + } + ], + "outputs": [ + { + "uxid": "3b5f72e772ea886dd872b9087395398133576a6561072d5294fbcd04b49e1d95", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944770.000000", + "hours": 6257 + }, + { + "uxid": "dc73aac74348dd285a1456c1fae2204d7c2039d50a765bdaae0c31f7c7e059db", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 6257 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 133, + "block_seq": 48 + }, + "time": 1429077394, + "txn": { + "timestamp": 1429077394, + "length": 220, + "type": 0, + "txid": "4e6b363423633ad51114b250478ee7645fbd184066fa41c29e5b14d0728cdfec", + "inner_hash": "8cf88a9e5140d5e01af412c956b3de7c93bfebbb4c5993b9b0285812208f5b33", + "fee": 4693, + "sigs": [ + "670abb369c25a655b0f22c069a9523d439b8a03d122bc9f0861aff796ab965fd5e1b79812b6f458ebc0a1cd4cc223d0137eb22e1bf1cbb40265ac7301018897000" + ], + "inputs": [ + { + "uxid": "3b5f72e772ea886dd872b9087395398133576a6561072d5294fbcd04b49e1d95", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944770.000000", + "hours": 6257, + "calculated_hours": 6257 + } + ], + "outputs": [ + { + "uxid": "f265bea876ffcfb8cf64df3aca4dae4a8d7f424ff495d91fb322feddb3a7e505", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944760.000000", + "hours": 782 + }, + { + "uxid": "e4e375b9dc55ff53d6de9120f1a87ff00e00a779835f8320f2c6b3090d0466e6", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 782 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 132, + "block_seq": 49 + }, + "time": 1429077404, + "txn": { + "timestamp": 1429077404, + "length": 220, + "type": 0, + "txid": "edc27c6ecc1f76d0f23489ad7bbbdb8c653af37cc4b8f18197400aea2011ed83", + "inner_hash": "5432e686f984075091a8d3686d959b63ef620382fcb2b86794ba8dc0fb9656e7", + "fee": 588, + "sigs": [ + "c1902b37a95c5327b0e5a1f05de551d4135831b787c86562867344ee7f06235374dc1618c6b4a8e077041723bc731db72dab5554a808b1ba77d305309144bf5e01" + ], + "inputs": [ + { + "uxid": "f265bea876ffcfb8cf64df3aca4dae4a8d7f424ff495d91fb322feddb3a7e505", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944760.000000", + "hours": 782, + "calculated_hours": 782 + } + ], + "outputs": [ + { + "uxid": "e6d9b56e075a6adf520d1ae7fbab9ae06353ae0b93dc8cb17d82cc3628009a50", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944750.000000", + "hours": 97 + }, + { + "uxid": "d11b05345917d171f60c31bd2634041b73b97eae364724369ddb8d53369397fb", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 97 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 128, + "block_seq": 53 + }, + "time": 1429077514, + "txn": { + "timestamp": 1429077514, + "length": 220, + "type": 0, + "txid": "d154d8262abbf517c67d529b0fea7cdf097433bd296d5795b17c6379cb1b1430", + "inner_hash": "b69070b10e6bbc276bf155361d7f3238fec46b9d865075c1dc0fc20d81ab0a42", + "fee": 17787, + "sigs": [ + "0a4b7f385a164f5718794382d49c14a6623e7af5f1ddbefe4871c756b754457a7075e822603bd3b22b313278abebe756be92367ef7a81a8c4adf992842c2058601" + ], + "inputs": [ + { + "uxid": "e6d9b56e075a6adf520d1ae7fbab9ae06353ae0b93dc8cb17d82cc3628009a50", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944750.000000", + "hours": 97, + "calculated_hours": 23715 + } + ], + "outputs": [ + { + "uxid": "2df1e88589be43c55d7c6c3dbcbd663fb759b3245eb8d86b0b9cdaa989556aea", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "943750.000000", + "hours": 2964 + }, + { + "uxid": "c7919b892eeb751456d456b37ccde7350a3fca0dda03b17ec426a56f12dcf192", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1000.000000", + "hours": 2964 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 124, + "block_seq": 57 + }, + "time": 1429077584, + "txn": { + "timestamp": 1429077584, + "length": 220, + "type": 0, + "txid": "61a33b49e97bfe2d5f026bf45fae43a1b9bdf08c60ec8db017da720a69790c7f", + "inner_hash": "32d2dce8e8043e544b3cb2145b0bfb9d4cfdb7ae8e20437d075f76b75d8e088e", + "fee": 10088, + "sigs": [ + "990bf0a8c74b0b4c4d05f463a0a50e311a6ae27b5d327dcb906bb6e42330709d48998eed6e7cbdf35caeab6d90fac3e56fb222032aefa7b1d4d9c7653aca9fe600" + ], + "inputs": [ + { + "uxid": "2df1e88589be43c55d7c6c3dbcbd663fb759b3245eb8d86b0b9cdaa989556aea", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "943750.000000", + "hours": 2964, + "calculated_hours": 13450 + } + ], + "outputs": [ + { + "uxid": "c5150380691c542b9bdf4cf2280ac612e0576c349f99d47d0a03c77eedc48731", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "942750.000000", + "hours": 1681 + }, + { + "uxid": "3b9059ec909faf64d652dae78944f4a2737df95a3215bf98e2ff33e02e2b377f", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 1681 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 120, + "block_seq": 61 + }, + "time": 1429077654, + "txn": { + "timestamp": 1429077654, + "length": 220, + "type": 0, + "txid": "4aeafd20b9df56ec852a2c257ff1630b9530d8375a4e72f20238ea36835f76d5", + "inner_hash": "bc6119c006f7c54c8608cc8050f47c43e6c079397f607f8c9e90d3072a10eca5", + "fee": 9118, + "sigs": [ + "0309322d16d48a35bd42c2ae6a76b240b21974d073f81f440e04431941fc9d550de92dcbcb226ad3baae2b3cbae51db28b2dc8d3e1b51cdd559cbbb6e4b71eda00" + ], + "inputs": [ + { + "uxid": "c5150380691c542b9bdf4cf2280ac612e0576c349f99d47d0a03c77eedc48731", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "942750.000000", + "hours": 1681, + "calculated_hours": 12156 + } + ], + "outputs": [ + { + "uxid": "9bbb8d620aae3efc7c21bb7d6a7159eda441a83e0fef2cd98f8240b38857d648", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "941750.000000", + "hours": 1519 + }, + { + "uxid": "2480aeed2dc47c692e4bce61fb3ee44c4992ea39b0a167235e501330d7ddac62", + "dst": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 1519 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 117, + "block_seq": 64 + }, + "time": 1429077694, + "txn": { + "timestamp": 1429077694, + "length": 220, + "type": 0, + "txid": "29c229c97d27bcaf842a367520e1916fb855921906bddf4a3b0413ad3f11517b", + "inner_hash": "bc02dde29d200fa6bc0497f2ddd5e52007aef9b6482d40953fbd44ed88e3cf78", + "fee": 7026, + "sigs": [ + "0674c0617c9e6109ca9af404d446777943bb6aaa5dcb223da63bff1a305498972735e0b2a601cc9c6ee2231ad5fdd025fb92cbb00e200860a2ebde924f76499400" + ], + "inputs": [ + { + "uxid": "9bbb8d620aae3efc7c21bb7d6a7159eda441a83e0fef2cd98f8240b38857d648", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "941750.000000", + "hours": 1519, + "calculated_hours": 9366 + } + ], + "outputs": [ + { + "uxid": "25ad0d5ae6a1a9bc61c6b9099fb7829111977a59e1183de4227a0a5352555639", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "940750.000000", + "hours": 1170 + }, + { + "uxid": "47c74a6d7f1f54cf0a7ac45ec00277539079810068dd95a29a202c43780d65a0", + "dst": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "1000.000000", + "hours": 1170 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 114, + "block_seq": 67 + }, + "time": 1429077874, + "txn": { + "timestamp": 1429077874, + "length": 220, + "type": 0, + "txid": "42227683dd9c149859d0578ab300d8509d513afadf7834fd8ae7a321cc07d833", + "inner_hash": "a7a9ea6466bef6cd63f671ae5dd1aafbeb251a717c7da331d40ec376ad0e89ec", + "fee": 8718, + "sigs": [ + "b4a141eb037a4debd99c347f337f67662a3feeb96112d7b05fc035a3556419dc3a9b35028327d925ca5eb9da018371bc333b7365f06ea22366169af6f066524701" + ], + "inputs": [ + { + "uxid": "25ad0d5ae6a1a9bc61c6b9099fb7829111977a59e1183de4227a0a5352555639", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "940750.000000", + "hours": 1170, + "calculated_hours": 11622 + } + ], + "outputs": [ + { + "uxid": "acc75d51ff9f18a224d1ca0481917e2a67298de40955711cd97a08f6733b5b6a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "939750.000000", + "hours": 1452 + }, + { + "uxid": "8bdd2662d7ed495ff82daef9198ee23ac0c75417607675a8da3dd673952c0e39", + "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "1000.000000", + "hours": 1452 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 113, + "block_seq": 68 + }, + "time": 1429077914, + "txn": { + "timestamp": 1429077914, + "length": 220, + "type": 0, + "txid": "d803ab903f68f7861cd8eff93b3c097c5b8f6a697ca67bb01e7e645060839fd0", + "inner_hash": "611f096c50da1d98c29b8c9bdc6b7f7c98d96061ab126c66716f17a2fc495166", + "fee": 1090, + "sigs": [ + "d264a023bc6986c1bf16e2e697f4df8b6e33ae2d4b1ddd4e207cb5f902fed54c1234c3ef2429d82507f5c10c0fb4320d753f3bf6b5e155fa3ec03bc91dd8206a00" + ], + "inputs": [ + { + "uxid": "acc75d51ff9f18a224d1ca0481917e2a67298de40955711cd97a08f6733b5b6a", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "939750.000000", + "hours": 1452, + "calculated_hours": 1452 + } + ], + "outputs": [ + { + "uxid": "5c1069a3aa6628ed7f9bdb300bec1a7e7ca6fb4645528a8c6a27c167e7dfe698", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "938750.000000", + "hours": 181 + }, + { + "uxid": "3c56fa9d161783d6fe5c8b055c6d20bae27097e7bcc44d9ece5c94df182ee5bf", + "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 181 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 112, + "block_seq": 69 + }, + "time": 1429077944, + "txn": { + "timestamp": 1429077944, + "length": 220, + "type": 0, + "txid": "3bf485890e91268452dc3136c0b294dc9909b3aaa10b9c936743e6e9b1a56f61", + "inner_hash": "e952e5d86f3cff105dab78a455691c871f3b0fd09558e367833c4743339b94d3", + "fee": 137, + "sigs": [ + "632771f1bdae7454911dcb6462aee56827f949dae18e8a98168b57864a62333f4251e17efa15a53ec12ab6980ea72838e9bb0e64aad82ad9e6a0a2a33b3006cd00" + ], + "inputs": [ + { + "uxid": "5c1069a3aa6628ed7f9bdb300bec1a7e7ca6fb4645528a8c6a27c167e7dfe698", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "938750.000000", + "hours": 181, + "calculated_hours": 181 + } + ], + "outputs": [ + { + "uxid": "8190fd31c005510d550c8a241b127fad2558c82aed9483fb4423193d5f4429e3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "913750.000000", + "hours": 22 + }, + { + "uxid": "5a7b2b6568cfa4ff5d44e98446aed92438ede0103b9994cfa3389bd02a35239b", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "25000.000000", + "hours": 22 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 111, + "block_seq": 70 + }, + "time": 1429077964, + "txn": { + "timestamp": 1429077964, + "length": 220, + "type": 0, + "txid": "f51e2ce31961b0186e04cc9d78857c3c21d3e2afb25c050d8c1d67d3320fcc07", + "inner_hash": "4a8b13ea0c8a993b3455a374e847bcbea7e7a20392c7cc169cbc41778e65d6e3", + "fee": 18, + "sigs": [ + "74f886780a9df8f6987c8c60bf5d9ad0fc25a502ba8f681188923d3a85f74bb87d57b067e53ed0f423ee7fbb352f3260e65c38e44cc7eec8fe8224374fd77cc800" + ], + "inputs": [ + { + "uxid": "8190fd31c005510d550c8a241b127fad2558c82aed9483fb4423193d5f4429e3", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "913750.000000", + "hours": 22, + "calculated_hours": 22 + } + ], + "outputs": [ + { + "uxid": "450cd7795bb3625daa99d6b64b9a8786d593bf1cad986d6c2933dae04b74a593", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "888750.000000", + "hours": 2 + }, + { + "uxid": "9639a86df8da288fb0fc6a92fa086f3cd5a8387705a14ddd2aa5e30c6c3fc3fb", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "25000.000000", + "hours": 2 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 110, + "block_seq": 71 + }, + "time": 1429077974, + "txn": { + "timestamp": 1429077974, + "length": 220, + "type": 0, + "txid": "abed13c2a552633d26b5b51c3ac5abf9808756c0203869ed185a7cd673702ba2", + "inner_hash": "c176a1a85f716055a9e8060c2a4245db0d7f71f4ac5387d4a51d173db467150a", + "fee": 2, + "sigs": [ + "40e8340047f08afd483b2867166e15ae751bb7272a2c24f68ae8561d3619ea021363e987118a2fe516cacff1946d4d6c4c249038581ee2f58f8feea4bcffc3b100" + ], + "inputs": [ + { + "uxid": "450cd7795bb3625daa99d6b64b9a8786d593bf1cad986d6c2933dae04b74a593", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "888750.000000", + "hours": 2, + "calculated_hours": 2 + } + ], + "outputs": [ + { + "uxid": "b44ee00208690c2123989f40edaff0224825afb20ca0952fbd90bddfd3213642", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863750.000000", + "hours": 0 + }, + { + "uxid": "22edb5931e1c54382f18e41ef774931efb08c278209a1fe8a34100147b707220", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "25000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 104, + "block_seq": 77 + }, + "time": 1429147880, + "txn": { + "timestamp": 1429147880, + "length": 220, + "type": 0, + "txid": "29798149e90f6442489bcc3294f455441a5a401e81491ed06bdc2c850756f0d9", + "inner_hash": "23ab44d59346b369d258cce6d5142ca7e1b52dd09a1512d8a618e08ae7346004", + "fee": 5860904, + "sigs": [ + "6e0bd761d2d9eeb207f0c4cf9f13d1407f33b5f50e72c3462225c8041882ddcd078a02720d533801a433d917674e3d68a98bb997e9b06664a73a9bdeae46404601" + ], + "inputs": [ + { + "uxid": "b44ee00208690c2123989f40edaff0224825afb20ca0952fbd90bddfd3213642", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863750.000000", + "hours": 0, + "calculated_hours": 7814538 + } + ], + "outputs": [ + { + "uxid": "6060c983054614b8801e405de697c443a1edebd3236582f89f01c6cf6a165c3f", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "862750.000000", + "hours": 976817 + }, + { + "uxid": "08723ed501e11c2053bab6b500f820dd7ae2aeb4a3c9d5109845bb46afebde97", + "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 976817 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 100, + "block_seq": 81 + }, + "time": 1429164440, + "txn": { + "timestamp": 1429164440, + "length": 220, + "type": 0, + "txid": "0cded82aa3ac92d78e23d2d0d7faf93c675fc9a321ad55105f65b6fca444b1e7", + "inner_hash": "0ca2ed02f9155bf69af2fd27b40b0300e0c9804cbd2507389d930ef186f48794", + "fee": 754183, + "sigs": [ + "68a82ec4421a37b8116c8bad98d2568802973dbce6f0166b3a9504110ee4873239953c3e8baf3a20d599e300c8b2c524d672c46ed593e126adc908f1decbbf5100" + ], + "inputs": [ + { + "uxid": "6060c983054614b8801e405de697c443a1edebd3236582f89f01c6cf6a165c3f", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "862750.000000", + "hours": 976817, + "calculated_hours": 1005575 + } + ], + "outputs": [ + { + "uxid": "129726406b3101d51ffd5bfca59a501184d6c8ca363be4ef1b8d8bf48a6c70e0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "861750.000000", + "hours": 125696 + }, + { + "uxid": "3fe7d61ffa993e00200ce6be7ba347c603032ac3f8c4ace07767e630fe94d76c", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 125696 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 96, + "block_seq": 85 + }, + "time": 1429164620, + "txn": { + "timestamp": 1429164620, + "length": 220, + "type": 0, + "txid": "b7b42b1b29acab0a2328aaf368ec74be49b4d4caf827e82b439ef4d8be976a55", + "inner_hash": "8b5eec10f63b31e72d4dba2c71fb0f7bc230e58f497e255352f02eee965d3595", + "fee": 121202, + "sigs": [ + "82587c832f0c74f185603b934a32a28624712373d188caad0355314ea621a4af3e96dbd1c37e889f630d90047c79b39c495b49964eca20172bb900db1df48b3a01" + ], + "inputs": [ + { + "uxid": "129726406b3101d51ffd5bfca59a501184d6c8ca363be4ef1b8d8bf48a6c70e0", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "861750.000000", + "hours": 125696, + "calculated_hours": 161602 + } + ], + "outputs": [ + { + "uxid": "05f42f22f5fea4b5cac8182dc2b4f280149c686434c6d4195a119a8d02ab24b2", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "861050.000000", + "hours": 20200 + }, + { + "uxid": "6e2abc4bc7820178358a603b7d99c4b39735dd1685d0c5a778ab63f29c9e93d9", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "700.000000", + "hours": 20200 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 95, + "block_seq": 86 + }, + "time": 1429164720, + "txn": { + "timestamp": 1429164720, + "length": 220, + "type": 0, + "txid": "ca51f9d0a19bf326d6dd39a1e4dd240adaaae279411093d4a5b20f54cddabb95", + "inner_hash": "47500bd3c5f74835a01b0f696e15780baec2ca3723f45355c9e8cd1c71564d18", + "fee": 15150, + "sigs": [ + "fdbc112b10354be2b85b2f9131a3927e7b4e87ff8ddef91b849a71e0b1445ebc410b61d85ff7af1834b54febf89d903e3151f5a74ccef4e9607851c9005454d001" + ], + "inputs": [ + { + "uxid": "05f42f22f5fea4b5cac8182dc2b4f280149c686434c6d4195a119a8d02ab24b2", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "861050.000000", + "hours": 20200, + "calculated_hours": 20200 + } + ], + "outputs": [ + { + "uxid": "4e1a98a72639efa6253a7cbea0f3b499fa24fb88612ad81414d20e46d2b5784e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "860050.000000", + "hours": 2525 + }, + { + "uxid": "ee69cfd4f15d16ded96745a35ef150f679b5b79cc0fd4009a2d02cdccd81ca3e", + "dst": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", + "coins": "1000.000000", + "hours": 2525 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 91, + "block_seq": 90 + }, + "time": 1429164810, + "txn": { + "timestamp": 1429164810, + "length": 220, + "type": 0, + "txid": "bd617ec27c2bea642fad8c153178e11ca08456d752249324e3011f27c845f87a", + "inner_hash": "f8ce5c9cc22005d7f63c0400132b0e70a6a8af574f1a5c1ffb0404f228a02949", + "fee": 16229, + "sigs": [ + "b471a7bdde8b1427f8081d9e91250fd89cdd4dd23062796fe2ee973c612eb28b76f6c7ab4f3fbb7c7f9627c52158066d13d9fbe34dfdb6e77c02d84ff4d45d7d01" + ], + "inputs": [ + { + "uxid": "4e1a98a72639efa6253a7cbea0f3b499fa24fb88612ad81414d20e46d2b5784e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "860050.000000", + "hours": 2525, + "calculated_hours": 21637 + } + ], + "outputs": [ + { + "uxid": "33e0c4c9536afffd491fef6294f22ffb0d16902493946a051db0b218728a1c44", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "859050.000000", + "hours": 2704 + }, + { + "uxid": "2a09e97f7725a35af1357842206875a023252da4ebfce129eaf4cb87119cfd41", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 2704 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 87, + "block_seq": 94 + }, + "time": 1429164870, + "txn": { + "timestamp": 1429164870, + "length": 220, + "type": 0, + "txid": "0f4958d590ed4ac9aca79d848731b358b1c01fab9717775cf6515f2bf2706dc8", + "inner_hash": "89c71b68262f8e3acddcec032b4209220ac7b794d1cefa62b45c71b94e017cad", + "fee": 10977, + "sigs": [ + "ede880d4422a1102280918227157997bb7a36d26a358a71bf016963d29e8403d2298754039d8dd14c0b05d776d05bebadb919a620e87439c93008e292086c94d01" + ], + "inputs": [ + { + "uxid": "33e0c4c9536afffd491fef6294f22ffb0d16902493946a051db0b218728a1c44", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "859050.000000", + "hours": 2704, + "calculated_hours": 14635 + } + ], + "outputs": [ + { + "uxid": "f32f03f28eece9ddcdc488a85100c94a7c924c185ae560363518dae5e2aacccb", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "858050.000000", + "hours": 1829 + }, + { + "uxid": "24c4cfc628a0f77ce2e878c6ffa9d4dbd85325f8a5e0b5df970a3a2c36033519", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "1000.000000", + "hours": 1829 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 83, + "block_seq": 98 + }, + "time": 1429274566, + "txn": { + "timestamp": 1429274566, + "length": 220, + "type": 0, + "txid": "fe01250cfdf84eb0182c033c216891e7e6971cc85976c4c46d9e3c608974d233", + "inner_hash": "2400f3951d454f663d5097060267f8e31e86e1c3f10391c8a06ed79fd72fe49b", + "fee": 71088, + "sigs": [ + "6ecee1ca0e86de9bf6da9a21e49b1cfade8f1a279f7fc58834c15184bec1de634c82faf30bdab34083bc1f32f87d27daa1987a525db83100f88b9103efbc007701" + ], + "inputs": [ + { + "uxid": "f32f03f28eece9ddcdc488a85100c94a7c924c185ae560363518dae5e2aacccb", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "858050.000000", + "hours": 1829, + "calculated_hours": 94784 + } + ], + "outputs": [ + { + "uxid": "99b4e51e1afd04813656e6202c7e462d88ce87ba980da7a62591190d72d1073c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "858000.000000", + "hours": 11848 + }, + { + "uxid": "f12164a6ea6ce65ff2ca1f2be7251bece8f7c5747ba8ec68e1ec3b27d45d7b9c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 11848 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 82, + "block_seq": 99 + }, + "time": 1429274616, + "txn": { + "timestamp": 1429274616, + "length": 571, + "type": 0, + "txid": "819106dc50373e5293a7e79f179693e85536e8206d82272930ec08410d92402a", + "inner_hash": "02e9a06b0ca7f91255107993e00f09e9ef983559088c5febff264c17952033c4", + "fee": 52573, + "sigs": [ + "efb713e6a1e5d328e94a51fbeb0f73e2a3b7a54e15db75797f0b709f698b16eb26e522f187a98144807e0e6cd294686ff19037975abb6d44b20b2899968954f400", + "b5d011c60020ce591a21db15823c06188515a63ca95d573c36b3af83d634fc6f1c1125db197f6283510ee33890ac168513254ad37524c77294bb5a12e8ff23f300", + "00d87b91eda33f627f6cd28cc673daf929fbec36e7bcfdf894f7491618a68b5755b5baadedc106d53d2da924fcbedbd106eadc50ec611d426720f67426c7286500", + "e64cf7e74363cfd381a3aa6fd17d7c415d6034b26b93017acaf9cf3475ccdffc53c3714d1d13409323cf77ccc81596f6e6edcec11d890979a436ef960bcb5f6900", + "fc2eb05241afdd15cdbd28cc7158d7eb4442f21a678c52332762b23ac6c2fcc76b0f79731987df0ba84d82044cd474d4cda9afda778a21b78a0659c5b588664301" + ], + "inputs": [ + { + "uxid": "2987e7c89d353ad5d63cea2bf2724dc5f7a5ef5fb81f5ea160a307f0726ac2f5", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 701 + }, + { + "uxid": "a52408daa8ce7026c70b61d4df4212fb577462060f340bfce779225b3e18193d", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 50058, + "calculated_hours": 50605 + }, + { + "uxid": "dc73aac74348dd285a1456c1fae2204d7c2039d50a765bdaae0c31f7c7e059db", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 6257, + "calculated_hours": 6804 + }, + { + "uxid": "e4e375b9dc55ff53d6de9120f1a87ff00e00a779835f8320f2c6b3090d0466e6", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 782, + "calculated_hours": 1329 + }, + { + "uxid": "d11b05345917d171f60c31bd2634041b73b97eae364724369ddb8d53369397fb", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 97, + "calculated_hours": 644 + } + ], + "outputs": [ + { + "uxid": "427462efeb07a6803f013c789ea43d93240f74f886bf9afd63dc1936a7574a37", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 7510 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 80, + "block_seq": 101 + }, + "time": 1429274666, + "txn": { + "timestamp": 1429274666, + "length": 183, + "type": 0, + "txid": "e8fe5290afba3933389fd5860dca2cbcc81821028be9c65d0bb7cf4e8d2c4c18", + "inner_hash": "45da31b68748eafdb08ef8bf1ebd1c07c0f14fcb0d66759d6cf4642adc956d06", + "fee": 720335, + "sigs": [ + "09bce2c888ceceeb19999005cceb1efdee254cacb60edee118b51ffd740ff6503a8f9cbd60a16c7581bfd64f7529b649d0ecc8adbe913686da97fe8c6543189001" + ], + "inputs": [ + { + "uxid": "6002f3afc7054c0e1161bcf2b4c1d4d1009440751bc1fe806e0eae33291399f4", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "27000.000000", + "hours": 220, + "calculated_hours": 823240 + } + ], + "outputs": [ + { + "uxid": "f9bffdcbe252acb1c3a8a1e8c99829342ba1963860d5692eebaeb9bcfbcaf274", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "27000.000000", + "hours": 102905 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 75, + "block_seq": 106 + }, + "time": 1429279796, + "txn": { + "timestamp": 1429279796, + "length": 511, + "type": 0, + "txid": "8de17dff34a8798f2ac89584f5c559e3bb82c280a3f6890386b4dbc5fef0e8cf", + "inner_hash": "2ab03a15a9f312d27919ec42a27dfefc5fc5e0b8bf451eb81ef545bf4497f524", + "fee": 835759, + "sigs": [ + "9dd44c7d76d454c7c658649d94e08f75354ba568aae069b38da012f07eacbcfe2a5bbe9b4444f566336c23a03f3625eb4306791437e1bfe69f43efa0c109ec2d01", + "211d2607cef832c989563a3475daf6aa1fec6d73893a72666b5428c6bd93217605990bc3b45f4cf4863a648708ca3bf3526eb1644679f313a297daf82b1865bf01", + "f7e77964485e36b15ade78aacc17407af265c7144767e3f39bfd9765869f90cd0f33120ca996154db82d5462d626f3ae299c8f3b8cc862284432919cfeb6613d01", + "3a1e491d35ad5daa1af54872b5ec1d02c6654cad8f2bcd94c2a624c1a3cd5c9163c373f06a931b5de526654bdbc5cdd221b7fcf7b77329d452562080216ca8fe00" + ], + "inputs": [ + { + "uxid": "99b4e51e1afd04813656e6202c7e462d88ce87ba980da7a62591190d72d1073c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "858000.000000", + "hours": 11848, + "calculated_hours": 962798 + }, + { + "uxid": "f12164a6ea6ce65ff2ca1f2be7251bece8f7c5747ba8ec68e1ec3b27d45d7b9c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 11848, + "calculated_hours": 11903 + }, + { + "uxid": "427462efeb07a6803f013c789ea43d93240f74f886bf9afd63dc1936a7574a37", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 7510, + "calculated_hours": 7564 + }, + { + "uxid": "f9bffdcbe252acb1c3a8a1e8c99829342ba1963860d5692eebaeb9bcfbcaf274", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "27000.000000", + "hours": 102905, + "calculated_hours": 132080 + } + ], + "outputs": [ + { + "uxid": "dfd2834342f3a7caf183472c17801aafacd1775378eb843509d17ad858456cb0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "885000.000000", + "hours": 139293 + }, + { + "uxid": "3bfbe4e80894862d60a053ffb47b8f1749e281603cd6376c8fc6b5e2cec0c843", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "100.000000", + "hours": 139293 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 74, + "block_seq": 107 + }, + "time": 1429280596, + "txn": { + "timestamp": 1429280596, + "length": 220, + "type": 0, + "txid": "6546dfbe6e61e81f3e9f6c9afdfee1c07758f2e486d731ae4d19b40602367656", + "inner_hash": "9566ef1826b7f518c043395c2b7a37014f77f8e23796c1c78e55d1fc443a02da", + "fee": 104471, + "sigs": [ + "2773830af5e34a3de4a3ce935ee08c189feaa30ab41ced8f78f9a6434198d9775c58a0b9bcc2931f3d0dfde541ef7f5d3c1cfcf5415776dbd9d871ce036ec42900" + ], + "inputs": [ + { + "uxid": "dfd2834342f3a7caf183472c17801aafacd1775378eb843509d17ad858456cb0", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "885000.000000", + "hours": 139293, + "calculated_hours": 139293 + } + ], + "outputs": [ + { + "uxid": "8ac39d41ec014ca6625e5f17e1fbe62db7a4ac154e0e42a017efa037935ae968", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "884900.000000", + "hours": 17411 + }, + { + "uxid": "ec4b791f2fa22a986d6035e34f5025c3da0398cb2acc59a54d495d4eaacdee8a", + "dst": "2acnXsnJ2k8jxiUahtBe8h4xouPAnpbwwjc", + "coins": "100.000000", + "hours": 17411 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 72, + "block_seq": 109 + }, + "time": 1429302756, + "txn": { + "timestamp": 1429302756, + "length": 220, + "type": 0, + "txid": "a4c15ae4743246709ec335d33c289576c8893e71f5c3dcee1db6e43eec9242ee", + "inner_hash": "1d2404a84798154867ab461179a2b4300d65e4886cbb0220f0d5d0b16bbb7628", + "fee": 42555, + "sigs": [ + "3fcfe6d7fe59b9998ac4260c3b788384b2ebb7137e08e3ffc8d8b6efa23490e71f94f381c61af4966ba6a4fb4173079d5a7f31518030900f6c10d64ceb0b774f00" + ], + "inputs": [ + { + "uxid": "8ac39d41ec014ca6625e5f17e1fbe62db7a4ac154e0e42a017efa037935ae968", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "884900.000000", + "hours": 17411, + "calculated_hours": 56739 + } + ], + "outputs": [ + { + "uxid": "bae0e928b795e2a80c88161afcbc102dcad6644386f6f44050dde8d586750140", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "881900.000000", + "hours": 7092 + }, + { + "uxid": "4ca22a0fa2acbd0c9e90c4ae83496d05e122deb1a17c670e9c785479d115e824", + "dst": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", + "coins": "3000.000000", + "hours": 7092 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 70, + "block_seq": 111 + }, + "time": 1429348072, + "txn": { + "timestamp": 1429348072, + "length": 220, + "type": 0, + "txid": "6ce27da2ddbc15f03330960b4201dbb3a066ad2e9bbd5366a9564f6befdcae2e", + "inner_hash": "2db237d697bd17aab9121cdfc4d72fa1cbfe7fd37d7f71b1a857833bb56b7dd7", + "fee": 13386, + "sigs": [ + "c50715bd2e53ed971b7559ccaf8a930dae335dc45cad18a25ccfea3209ea2c971e0dc6cc57ff1dbcde49ddfdc612e71e923adcd21b68eaa0eb239bc83a50ff2b01" + ], + "inputs": [ + { + "uxid": "f9bf35f993452b3d490668bb579fd272da969a1bcca8de0c25000ee57b5d7f54", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22700.000000", + "hours": 17848, + "calculated_hours": 17848 + } + ], + "outputs": [ + { + "uxid": "c5df36ce47f6f183475317ab1c53eaa65428c142cb3e3906bf162d80519a203f", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "12700.000000", + "hours": 2231 + }, + { + "uxid": "94889dbe1c20eb942b7932c5301737537ac33abd9c81d72e1642ddc70ce320e0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10000.000000", + "hours": 2231 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 69, + "block_seq": 112 + }, + "time": 1429348102, + "txn": { + "timestamp": 1429348102, + "length": 317, + "type": 0, + "txid": "f8a24a25a8e3b206db7ea8a0bd8eeb0f8087f50d230c81a538316bcc5152da3d", + "inner_hash": "cfca9a1aa2ab7ea4d643700ac89e9544f1d4e9ef85e28d1cedeece11469fb885", + "fee": 8332864, + "sigs": [ + "5b68d315f4e84cdae4936db6bb7c8466977e784851b605d1fbc1e0bb65fe259d58d6be37228c96bccb1a1c1e9d316d9102fcfaefeda614e67af20464bc877f2101", + "fdd919590553d428d9b8121644127651c68b5207af9798aaaa6ed18134c5835b5311bb547e07e47157a4fd89867c88a48700255610efd2a3e3f77dc82f5fb3ba01" + ], + "inputs": [ + { + "uxid": "bae0e928b795e2a80c88161afcbc102dcad6644386f6f44050dde8d586750140", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "881900.000000", + "hours": 7092, + "calculated_hours": 11108253 + }, + { + "uxid": "94889dbe1c20eb942b7932c5301737537ac33abd9c81d72e1642ddc70ce320e0", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10000.000000", + "hours": 2231, + "calculated_hours": 2231 + } + ], + "outputs": [ + { + "uxid": "1d4595b9fa1c6c3d64f48b6ae5f8f861b1c08a022cbcb04b279df448da3db660", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873900.000000", + "hours": 1388810 + }, + { + "uxid": "53b376413d550663ab51b229df8b0f55e4055d6577c2d8b5cec8ff748fe0e958", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "18000.000000", + "hours": 1388810 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 68, + "block_seq": 113 + }, + "time": 1429348172, + "txn": { + "timestamp": 1429348172, + "length": 220, + "type": 0, + "txid": "1f27afc41896d2c7fdbd2620e606440ad12557e9a4bdd6808dcc2c23d4e32978", + "inner_hash": "4d53c05c731409feef7606cf9514904f4c7704537efb453ac2c439fcfe77a455", + "fee": 1041608, + "sigs": [ + "e36cef84c1c6f999dba462f3134131c105da2255eaf21550ce30ee52a14a33d529a7cd0c37b3883d0d57429b163b4905271c7b1a4d951b4a521f245c7857dd5c01" + ], + "inputs": [ + { + "uxid": "1d4595b9fa1c6c3d64f48b6ae5f8f861b1c08a022cbcb04b279df448da3db660", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873900.000000", + "hours": 1388810, + "calculated_hours": 1388810 + } + ], + "outputs": [ + { + "uxid": "412eff3eef889c682da8db3608fce37d1c5ee2cc297bc88d901648e6ccd418f9", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873800.000000", + "hours": 173601 + }, + { + "uxid": "c961ba554ae30b0edcdf71e834ab2b26d7dff5bcf5955d4874cdba89170392bf", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "100.000000", + "hours": 173601 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 67, + "block_seq": 114 + }, + "time": 1429348502, + "txn": { + "timestamp": 1429348502, + "length": 220, + "type": 0, + "txid": "e8765b4e6fbca87144df59a6f66815b175e81999509504b117636edc34cbe2af", + "inner_hash": "b62f9938b195211810976e1719b152fe6c381879adba6061f4ca36d74c06bea2", + "fee": 130201, + "sigs": [ + "9d40ed257bb7586c7d72e90bd99c6883fb836d400107686ba477850c2b63a86b5ad885aa37f352d334d930ea3814844e67a6ac438c36b919daff273a66f21e5201" + ], + "inputs": [ + { + "uxid": "412eff3eef889c682da8db3608fce37d1c5ee2cc297bc88d901648e6ccd418f9", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873800.000000", + "hours": 173601, + "calculated_hours": 173601 + } + ], + "outputs": [ + { + "uxid": "6ad7993fb2728c2c53ac2c8395a6c62d03c5ef9298ca467e7998fb64fd0c90b4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873700.000000", + "hours": 21700 + }, + { + "uxid": "5b0801ec545b132eeafa61bee8f645df7e1e358321ef830a4247fe541c211139", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "100.000000", + "hours": 21700 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 66, + "block_seq": 115 + }, + "time": 1429348712, + "txn": { + "timestamp": 1429348712, + "length": 220, + "type": 0, + "txid": "bb700553c3e1a32346912ab311fa38793d929f311daeee0b167fa81c1369717e", + "inner_hash": "253c14d68558b09c034d4945284f5cc3025b9e05723c6e4fa7d95f1e68edb211", + "fee": 16276, + "sigs": [ + "4920f49d47105801fab73c2398bee61ce56bb0b58dd69ab35ec1f959a3b8a8003c2821510d3a97d09f7a4a9f943b04d888b1327539ff48216f148fca693dde5d01" + ], + "inputs": [ + { + "uxid": "6ad7993fb2728c2c53ac2c8395a6c62d03c5ef9298ca467e7998fb64fd0c90b4", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873700.000000", + "hours": 21700, + "calculated_hours": 21700 + } + ], + "outputs": [ + { + "uxid": "0976005ab4540e8211cd929f19634bfaa2f5d8e24177ddb5b803b447ea91f8c3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873600.000000", + "hours": 2712 + }, + { + "uxid": "de995d2361e810cfba1b9b1141413367a722f51c7555b1685f6e68129dfb2679", + "dst": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", + "coins": "100.000000", + "hours": 2712 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 64, + "block_seq": 117 + }, + "time": 1429351912, + "txn": { + "timestamp": 1429351912, + "length": 220, + "type": 0, + "txid": "345488861ad3f0d93024c367990e64ef0f7a95bd8b8589f554172f9439808263", + "inner_hash": "258acd45e194051214c9783184c2a9157558e595c4e4da814258f0ffd0e9dd64", + "fee": 125795, + "sigs": [ + "9f44be793a0cb218b6836dfa52e5b8c38fe2b1257d27fcea49f4c6a6ed910f446e8a96a987fc06c6b6ae13ea8ea0290e91ea40b6f8eeaf8054e8efd17306573201" + ], + "inputs": [ + { + "uxid": "0976005ab4540e8211cd929f19634bfaa2f5d8e24177ddb5b803b447ea91f8c3", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873600.000000", + "hours": 2712, + "calculated_hours": 167725 + } + ], + "outputs": [ + { + "uxid": "6beca9fb58a327580c614d7fb5622916849756790b661bcabc880666364fdf47", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863600.000000", + "hours": 20965 + }, + { + "uxid": "2010952c33c83599fa14bfa5982d59865f2a362c97270dacb4c180a485ee5096", + "dst": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", + "coins": "10000.000000", + "hours": 20965 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 60, + "block_seq": 121 + }, + "time": 1429382678, + "txn": { + "timestamp": 1429382678, + "length": 220, + "type": 0, + "txid": "da82deafc15c36e7dc9cd95663e0dc910ae626ee543147ac7bd8682be00f7baf", + "inner_hash": "c98f858a27e76b0b565baaa3dffc6cfc7b0ffe9dd7d2d71f4bb0ad4d1c439ca2", + "fee": 2271879, + "sigs": [ + "15fccdc36c966a9571196a3f727ebda47162441df2d9965ac27109ac56d22cb41638b404e84b5b388d809b814ade18022cba0a6e021140c6b7d0144a6facd6d501" + ], + "inputs": [ + { + "uxid": "6beca9fb58a327580c614d7fb5622916849756790b661bcabc880666364fdf47", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863600.000000", + "hours": 20965, + "calculated_hours": 3029171 + } + ], + "outputs": [ + { + "uxid": "f8a1990492f970227ec29e6e095fa724d66fa2d6883bd8723773098d08ca8b3c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "801600.000000", + "hours": 378646 + }, + { + "uxid": "e5596ef0ba04ad9e0adbe0355a24c6bef249654906f917b68f8f0cf072508674", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "62000.000000", + "hours": 378646 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 59, + "block_seq": 122 + }, + "time": 1429382898, + "txn": { + "timestamp": 1429382898, + "length": 220, + "type": 0, + "txid": "211f5fc97ba1797d78f84d4e4db78415b5ff4121f78369535fe3f8015571c6df", + "inner_hash": "586a8297d8d148f79d8529fbc3e356f5de9570a3c34bc1ba8494b8269b03d0f2", + "fee": 283986, + "sigs": [ + "cccee00def7817ec1b36ba5b02066f82eae188afc3e05e61524c62d19fe095e0363db085da6591841314da5f836f2f0068eae522e3d3937d2f96de99f924af6a01" + ], + "inputs": [ + { + "uxid": "f8a1990492f970227ec29e6e095fa724d66fa2d6883bd8723773098d08ca8b3c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "801600.000000", + "hours": 378646, + "calculated_hours": 378646 + } + ], + "outputs": [ + { + "uxid": "998487775c0e58420673b70204b83c1d6bb5b70e34b1aa0f8169c85ecec2438e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "765600.000000", + "hours": 47330 + }, + { + "uxid": "1e0cf4e3ed49b52944f533a212e6412291e369ac3e7a8c4440424f475f2983b3", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "36000.000000", + "hours": 47330 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 58, + "block_seq": 123 + }, + "time": 1429451746, + "txn": { + "timestamp": 1429451746, + "length": 220, + "type": 0, + "txid": "9003d3caba9587d46d000cc614bb52bed34adcc5ea404c560c986eb6dd756e6b", + "inner_hash": "2a87bcb0049b9971713a2e46b75b348785adca751b151290a411bfa5a0ed2287", + "fee": 35498, + "sigs": [ + "0da91c351fb050c243c7b587005bee14ccc2951897ffdf720ad9c757c5946e516a20ca0d92c5f84957161d10a74deab05a2b530ab5bbcd7ad01266213b5eb38401" + ], + "inputs": [ + { + "uxid": "998487775c0e58420673b70204b83c1d6bb5b70e34b1aa0f8169c85ecec2438e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "765600.000000", + "hours": 47330, + "calculated_hours": 47330 + } + ], + "outputs": [ + { + "uxid": "6fb116c110fe391448a1dcb985b67439c2e9a71d8bb2fd1cf345ac73ada6166a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "755600.000000", + "hours": 5916 + }, + { + "uxid": "8e764a87cee9f26b902f748c28a5a49de5c383e5f155129eec84474a3d0349cc", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10000.000000", + "hours": 5916 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 57, + "block_seq": 124 + }, + "time": 1429522086, + "txn": { + "timestamp": 1429522086, + "length": 220, + "type": 0, + "txid": "e9a6dd585b564b19c55d9f56188a45bfad32fa75703fa6336830035f6fa92e3d", + "inner_hash": "9cdad9a848f5b2993d1e5d0593e952b39ccdf7ae56bd13851449797cccdced5f", + "fee": 4438, + "sigs": [ + "1f3d02abe6811c83b4f4b2e270366e8d4c591866b6e984cb8bdea5d80ca1edbb04d651449070bbca22a8c7cfb3d23a6f85c0a5a7e3226e2d0520330faf16291401" + ], + "inputs": [ + { + "uxid": "6fb116c110fe391448a1dcb985b67439c2e9a71d8bb2fd1cf345ac73ada6166a", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "755600.000000", + "hours": 5916, + "calculated_hours": 5916 + } + ], + "outputs": [ + { + "uxid": "04471fb0797bb931e883f7b95cfff6ee4fea5e19a352ca5425fcd353c4f6aba4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "750600.000000", + "hours": 739 + }, + { + "uxid": "a4fdfce34725eb63941ac576651fa406272565a344ffb21435d285111efbc4db", + "dst": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", + "coins": "5000.000000", + "hours": 739 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 56, + "block_seq": 125 + }, + "time": 1429578056, + "txn": { + "timestamp": 1429578056, + "length": 220, + "type": 0, + "txid": "1ca0a2d44b6439b91eb839e0f99405abdcafe2c1a49c8b49b1739498129bd1a6", + "inner_hash": "1090d10a5a2210dc205d6f8447918670f9351feed057c76423629b4699777dcb", + "fee": 555, + "sigs": [ + "39817412c5edb4cd928aa3b79a022d4b3276af74eb377d3821c1e95e4d6c6acd61ebbf5eb5d32f87686b6cb4f09c2660e1f148192873208fc963d67a6945fe0101" + ], + "inputs": [ + { + "uxid": "04471fb0797bb931e883f7b95cfff6ee4fea5e19a352ca5425fcd353c4f6aba4", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "750600.000000", + "hours": 739, + "calculated_hours": 739 + } + ], + "outputs": [ + { + "uxid": "6b616ad99a946538c3ab101f245bcab211ab39507848425e80cbfc8ec5bdbc67", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "738100.000000", + "hours": 92 + }, + { + "uxid": "a08089cd67896683d5dcb2d50256354e0d086b9854eb22bb6022cc459d447211", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "12500.000000", + "hours": 92 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 54, + "block_seq": 127 + }, + "time": 1429848410, + "txn": { + "timestamp": 1429848410, + "length": 317, + "type": 0, + "txid": "243e1baa955c3f0af42d7acc4c920437dd0a99c754d6c5c2b7defcd143ff288d", + "inner_hash": "e7e030478e5828f44ec15b734638e8c2828f015b2fa5ca2823d24af3ad111ae6", + "fee": 3170256, + "sigs": [ + "1519c5c730648e7be553b2738aaeff38266735276e640c8f8d455f33c4fc07283ae5a7da47742df118337ff0548efebb1c75d0350a4e578ff95269182779db2201", + "ee099f6f42c813d13f097e9b3a8604067d6afd3718e6eeacd88fb25050d42b8603a42c4f7d24058483f70328a24fc91cd6ef190286c4a678e28b757143e23dc701" + ], + "inputs": [ + { + "uxid": "c5df36ce47f6f183475317ab1c53eaa65428c142cb3e3906bf162d80519a203f", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "12700.000000", + "hours": 2231, + "calculated_hours": 1175478 + }, + { + "uxid": "53b376413d550663ab51b229df8b0f55e4055d6577c2d8b5cec8ff748fe0e958", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "18000.000000", + "hours": 1388810, + "calculated_hours": 3051530 + } + ], + "outputs": [ + { + "uxid": "8169bf7f8fa21dc6400b60678b302946cf2765f44893ec8466262fc69b710591", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "30600.000000", + "hours": 528376 + }, + { + "uxid": "ef488d5f4a019502115d3b6b50bd364692315c3954d7e93c3ca22e11b92fc528", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "100.000000", + "hours": 528376 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 53, + "block_seq": 128 + }, + "time": 1429849170, + "txn": { + "timestamp": 1429849170, + "length": 317, + "type": 0, + "txid": "c2c9fe882df3b44fbb125b251a7604a7a4f4195dddff6e5396b7f130744e2b27", + "inner_hash": "e23ed05dee949be1aabf237db1fd81be8d73c838eb0ee3026104807053269431", + "fee": 41968911, + "sigs": [ + "8e9b1733227a841009881663a50e1e01ac2790f16416c6f973c89e15a8fc216044e156cc8fee84d3e3cc6371e4da340f5312726bfd66f16a635542d63c869c7101", + "d1f6b7078a9032159a165ffbfb1e0665bf9ced2c3d5db795fd5bd11fc53d790f56589cbbffd117eec50aa0dc8c0e65eccb13c5ccb5d39dc9bae739a49dda03b201" + ], + "inputs": [ + { + "uxid": "6b616ad99a946538c3ab101f245bcab211ab39507848425e80cbfc8ec5bdbc67", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "738100.000000", + "hours": 92, + "calculated_hours": 55430171 + }, + { + "uxid": "ef488d5f4a019502115d3b6b50bd364692315c3954d7e93c3ca22e11b92fc528", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "100.000000", + "hours": 528376, + "calculated_hours": 528376 + } + ], + "outputs": [ + { + "uxid": "ecb92dc2f43d4c6ca124575d8456d8894f3cb137875287beaa73180fcae2b3ca", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "737200.000000", + "hours": 6994818 + }, + { + "uxid": "6143275de37a2b5ec802eeeb8d38a3dfb2db6629128e44c4f9ffc0ce8ddad629", + "dst": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", + "coins": "1000.000000", + "hours": 6994818 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 50, + "block_seq": 131 + }, + "time": 1430330041, + "txn": { + "timestamp": 1430330041, + "length": 220, + "type": 0, + "txid": "6538399868cf772fcfa96e68c51aa6aa66faa95d7c685432e4005880932be134", + "inner_hash": "4854d5689f4c2b770d887ebf7f7d3fb975b295b0180d9354d69f2e322ae8b7b7", + "fee": 76257058, + "sigs": [ + "d213d50e53ceffd053571431b78fa6417abae8a7c5080dd3f8cece59dc61ad2444dd541540f5734d34dca94b3b975b613da0800121af8ec83b6f20d81cd53ffd01" + ], + "inputs": [ + { + "uxid": "ecb92dc2f43d4c6ca124575d8456d8894f3cb137875287beaa73180fcae2b3ca", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "737200.000000", + "hours": 6994818, + "calculated_hours": 101676076 + } + ], + "outputs": [ + { + "uxid": "6b4ca83b3f73b62161c90c6da03dff460ca9a5a3ccd6fafca140137416dedc58", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "736000.000000", + "hours": 12709509 + }, + { + "uxid": "e7756fa7a5c067d595f7300828bc4c70152653700844130d88174ba37237e2a3", + "dst": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1200.000000", + "hours": 12709509 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 49, + "block_seq": 132 + }, + "time": 1430330311, + "txn": { + "timestamp": 1430330311, + "length": 220, + "type": 0, + "txid": "3dfdfea4614d05c2f5eddf5773ef0afc745f1afe585141659df8e03e82897606", + "inner_hash": "3a4ac407aeec6233d3edf787d5b1f4d8257b594e9ee9d0ad3c32781053579b36", + "fee": 9532133, + "sigs": [ + "f37f3398240cee8e38c41945db72d4feda20f88a2250528fe1165533acdc7dfc0f99c7db0fc965847a100d0a2f598537cdd8c73a96c5fbb4e5e85dbfd9a4384701" + ], + "inputs": [ + { + "uxid": "6b4ca83b3f73b62161c90c6da03dff460ca9a5a3ccd6fafca140137416dedc58", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "736000.000000", + "hours": 12709509, + "calculated_hours": 12709509 + } + ], + "outputs": [ + { + "uxid": "2cd58783beb8a9f6278f7a097151531091b5f15afd7735e1facf02aa720c1191", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "735000.000000", + "hours": 1588688 + }, + { + "uxid": "333156ed20ba6937d3720af3a81939362b9f4ad1e9591bc676945ff0d202131e", + "dst": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 1588688 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 48, + "block_seq": 133 + }, + "time": 1430330421, + "txn": { + "timestamp": 1430330421, + "length": 220, + "type": 0, + "txid": "d30cec3ad3a66562d2513a3656b366ea7da583e6ba45214ac12b9c2219b4c5ea", + "inner_hash": "58e355edef48ff22e9a83952130c1bd8fe9a7f9bec7b2e0535c103c0146604c6", + "fee": 1191516, + "sigs": [ + "09baa4739816e5a86a46ecc30df8c00a5f046ad687f0674250640b6df2361dfe3723667872e0f6deb1d3447948e30b06f02b056a62da9dbaaef4db000eab747e01" + ], + "inputs": [ + { + "uxid": "2cd58783beb8a9f6278f7a097151531091b5f15afd7735e1facf02aa720c1191", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "735000.000000", + "hours": 1588688, + "calculated_hours": 1588688 + } + ], + "outputs": [ + { + "uxid": "52288a441c70260f6a3eab0e271969d54492377615a6fba8ec3ad26f11dc9768", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "734500.000000", + "hours": 198586 + }, + { + "uxid": "8b3d335360effd00cabcae13c2495f26f81743b82958629378b7bc78a7e460fe", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "500.000000", + "hours": 198586 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 47, + "block_seq": 134 + }, + "time": 1430330481, + "txn": { + "timestamp": 1430330481, + "length": 220, + "type": 0, + "txid": "44d05abc2637d9cd2047984023eb5cfa0a146e58821117de30f9c81703189cde", + "inner_hash": "44886be6952cd483b9425d314836714af65037b58923aa2432ea946131ae10f6", + "fee": 148940, + "sigs": [ + "7990cb04634a5e0de397917e56480805915c73d265fe466757a9e677067483787d457c7e9931a89daa6260c7a262f49ef1503cc88008809c193f1f949badcfbb01" + ], + "inputs": [ + { + "uxid": "52288a441c70260f6a3eab0e271969d54492377615a6fba8ec3ad26f11dc9768", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "734500.000000", + "hours": 198586, + "calculated_hours": 198586 + } + ], + "outputs": [ + { + "uxid": "e29ec214f4afd79e6465d03e4d88e552dc69654750a725d74873ee366c58e552", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "734400.000000", + "hours": 24823 + }, + { + "uxid": "d95d422fb8fe4ad9ce1052e566ec8a5ad7953ceb253366814b3d32e9a1da1f13", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "100.000000", + "hours": 24823 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46, + "block_seq": 135 + }, + "time": 1430330591, + "txn": { + "timestamp": 1430330591, + "length": 220, + "type": 0, + "txid": "072f0738f834db0030d777e6ec0e0443627c51cecffcc55e41d43b0b8edd40d1", + "inner_hash": "e87dc97ec672bb45a3417f307e6f6a1cd75b26f508f188c0554484740ffea8cd", + "fee": 18619, + "sigs": [ + "da4e898bdf324ab50d8f007ee4c65ab832ba64cf86fd0a601e7007a4c3ac2eaa6f1304a3fc8088b108e3f417e5b7c90cbc7d80c059885d397ae978da89c92d5f00" + ], + "inputs": [ + { + "uxid": "e29ec214f4afd79e6465d03e4d88e552dc69654750a725d74873ee366c58e552", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "734400.000000", + "hours": 24823, + "calculated_hours": 24823 + } + ], + "outputs": [ + { + "uxid": "8ea58a3736b35f0e3781e94198e8b73bba2536704b84b15900fb32701db8893e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "733400.000000", + "hours": 3102 + }, + { + "uxid": "617b584bb9e6b1d80daac915fb3079b22a326777d1515a40e7b7eddf427f4099", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 3102 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 45, + "block_seq": 136 + }, + "time": 1430330851, + "txn": { + "timestamp": 1430330851, + "length": 220, + "type": 0, + "txid": "b9a795552bec1a722718b44a08ad152656242b1d23afb53d2247b3016d920b7e", + "inner_hash": "8096fec4a2738f5b79df5359724f6cd7597c0d8c5bc18419f5825c5312e1dac0", + "fee": 2328, + "sigs": [ + "315cc1de04ad6d1d68e9d63027cff2abc74d5b11a376623d70211ac0e8b9feed4c7f7952634d60b57604edfbe63f02bef172486320e9790d0bb6e44099d6473500" + ], + "inputs": [ + { + "uxid": "8ea58a3736b35f0e3781e94198e8b73bba2536704b84b15900fb32701db8893e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "733400.000000", + "hours": 3102, + "calculated_hours": 3102 + } + ], + "outputs": [ + { + "uxid": "a1ed39cded6d9a0605b52f25cbedb363e57a168d1ad1d1db437816a401c061ab", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "732400.000000", + "hours": 387 + }, + { + "uxid": "e00c292e151fdafd24984b2dc08a4a328150006f95afaac9909dbffae1f07eaf", + "dst": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 387 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 44, + "block_seq": 137 + }, + "time": 1430504186, + "txn": { + "timestamp": 1430504186, + "length": 220, + "type": 0, + "txid": "fc02772662176c282c2b6538732d3d6eb1399f006a0b52e64d07fc104038f638", + "inner_hash": "a7ef2323ca6ef0a15173dcc2ef44c0abd10933be70337360408ffb4087affb80", + "fee": 291, + "sigs": [ + "9a30550db56d9c9ae901d835f856761b9c4298d56ffa94bf41eff5550ac180851189f2adf2e184b6f23485a1405eacb2d4cc937ff05490fb0bc609e654effd7900" + ], + "inputs": [ + { + "uxid": "a1ed39cded6d9a0605b52f25cbedb363e57a168d1ad1d1db437816a401c061ab", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "732400.000000", + "hours": 387, + "calculated_hours": 387 + } + ], + "outputs": [ + { + "uxid": "f89c968840831d03abaf3c41cf8a405e4b4ddbfb19f5ba300a8ea8e4dcb1d9a4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "731400.000000", + "hours": 48 + }, + { + "uxid": "b6b6188973b600af774ad8a7b6d454f77713a51463b9a9a70c901ec5280a9789", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 48 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 43, + "block_seq": 138 + }, + "time": 1430504236, + "txn": { + "timestamp": 1430504236, + "length": 220, + "type": 0, + "txid": "9880bebc51471e0b3c520920db836d674f652503314cd74069a59ccad0d0967a", + "inner_hash": "feeb2f638e91dd685e6fe179edc7622ef3fcc8a5a7e795c07be12e03f221f67f", + "fee": 36, + "sigs": [ + "a0c15d7d5f36afc4c78045aae19c8d41a8652f0cb6d633622a1e55b4e54cd5a33113b02c24b02cca10797043d992aaac98bdbb33addd038611ac324795733c0b00" + ], + "inputs": [ + { + "uxid": "f89c968840831d03abaf3c41cf8a405e4b4ddbfb19f5ba300a8ea8e4dcb1d9a4", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "731400.000000", + "hours": 48, + "calculated_hours": 48 + } + ], + "outputs": [ + { + "uxid": "36972dc046829caa340eaecbfeb42f4174bcdecfb87296d56503e5fb10e9de8d", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "730200.000000", + "hours": 6 + }, + { + "uxid": "bceafc261a2250f1bfb8154aea88370acfe6a41a4216bcb76c2016451cbcffd1", + "dst": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1200.000000", + "hours": 6 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 42, + "block_seq": 139 + }, + "time": 1430504536, + "txn": { + "timestamp": 1430504536, + "length": 220, + "type": 0, + "txid": "578075959959db70ae86f4f60d2ae3ff245727d086eef86ed80db5e1c7c9fbaf", + "inner_hash": "eead8ec3c5e86e73f1e7add274fdbe0cecd5cd68c4fcd3cf17c1c7af9c5ee43d", + "fee": 6, + "sigs": [ + "d6331b6d3270100b8b009bbd343d6b82208d622b27ca3a4b371492b9c792f8433c981c57dfc760a3974f13acd86bbb24555b958e0c67e247c5a39d97295022d601" + ], + "inputs": [ + { + "uxid": "36972dc046829caa340eaecbfeb42f4174bcdecfb87296d56503e5fb10e9de8d", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "730200.000000", + "hours": 6, + "calculated_hours": 6 + } + ], + "outputs": [ + { + "uxid": "6962c7c1fcc98f532a9003990163bb251811a4700257968a641b1fe975cfc51d", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "729200.000000", + "hours": 0 + }, + { + "uxid": "278b0caa6dddf4ce74772471b15fb9a8c364362b0ae3eeb9379e980504d8d512", + "dst": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 41, + "block_seq": 140 + }, + "time": 1430504746, + "txn": { + "timestamp": 1430504746, + "length": 220, + "type": 0, + "txid": "de45a24c9c32f808a3d928f30ba8e1b6ef8117a7c0b7a5d616734d9b121d0c30", + "inner_hash": "efeb898fd032831cdd6d7c311f496f4c2622ee11bedc2831b6411cab51d44736", + "fee": 0, + "sigs": [ + "1646b02579d23e2350e2bc47340e027ad5f74bf55aba41fc1244631ba1e0577b681d364c3802017b5cc5d5fda972d23ac9bffabd6159384223a26aba5f08406401" + ], + "inputs": [ + { + "uxid": "6962c7c1fcc98f532a9003990163bb251811a4700257968a641b1fe975cfc51d", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "729200.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "d53fae3b48bde2d1328964a2e7f42e8e833983db159ba30f627926dea0db7df0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "728200.000000", + "hours": 0 + }, + { + "uxid": "cfdefd8d167947190a223882d20c8ac7880e550ad1a3494bb05bff4b1df4e3ff", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 40, + "block_seq": 141 + }, + "time": 1430504846, + "txn": { + "timestamp": 1430504846, + "length": 220, + "type": 0, + "txid": "16f8b9369f76ef6a0c1ecf82e1c18d5bc8ae5ef8b01b6530096cb1ff70bbd3fd", + "inner_hash": "529b1fd21087bf52cb3ebcf02dbe1e3ce5de9daefa9754e5b6cde7be2d8ab0c7", + "fee": 0, + "sigs": [ + "8612c9e160f3e0d7cdcb2adf3611bde867dcb766c63ec4312a9251ba9b6ea6997c0d9a6ce26beaae01e82c22d2b61e5ae7f87aeaf0679fde395888aebafde94500" + ], + "inputs": [ + { + "uxid": "d53fae3b48bde2d1328964a2e7f42e8e833983db159ba30f627926dea0db7df0", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "728200.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "228794e6b3eb69aecc5334e140afbad22883326dcf229bd3092f238ed9ec800f", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "725700.000000", + "hours": 0 + }, + { + "uxid": "908fe94bd28886547f1b7b4fc98d0990a08a216b70877341f566b6b4685de364", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "2500.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 39, + "block_seq": 142 + }, + "time": 1430504966, + "txn": { + "timestamp": 1430504966, + "length": 220, + "type": 0, + "txid": "030177271beee04f1a0974d0c5042f07c7ca1db1c5d496fbee3c441b1b7c5bee", + "inner_hash": "d954f0ee1a437cf3809961063145bb205633ac66d9a29e1386eddb13503ddac1", + "fee": 0, + "sigs": [ + "6e5661f0212dfa0800df968dac30f931335d7fe99d23932878d7d2c06bf69691328d66897c3a5c023535035ed95de3b396ea162e4482e70cda5ec9d4c8e36d4b01" + ], + "inputs": [ + { + "uxid": "228794e6b3eb69aecc5334e140afbad22883326dcf229bd3092f238ed9ec800f", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "725700.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "6efc30b4c943ba4de8d2c89901a0b2a4d9a0ecf34713917eae37c6debca616ed", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "724700.000000", + "hours": 0 + }, + { + "uxid": "18293d947aadf89d9e57d18fa01408867a9abe267504edbdabf8c2a57d9a6323", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 38, + "block_seq": 143 + }, + "time": 1430505086, + "txn": { + "timestamp": 1430505086, + "length": 220, + "type": 0, + "txid": "57150aecde96bde972183b9b0d7d27dda2c0179fb71630e92c27856d211335cd", + "inner_hash": "8fa5487fbcb62adb17287cc80ea02f113f036035e486fe7a37a96a98d32582b8", + "fee": 0, + "sigs": [ + "ba2442a6f68ef825f2921dc135eca398904426f8d225eb122b210670d1b3bf1b2279abcd5cce5c18533dd8ca0286b23e2be9605f1cb6a5820bc1c783e95b833401" + ], + "inputs": [ + { + "uxid": "6efc30b4c943ba4de8d2c89901a0b2a4d9a0ecf34713917eae37c6debca616ed", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "724700.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "6c8b1ba9dc7e8900b42d55e9fbe6ea0e00d7eaccf67a7b66c0a2b771cf88ea05", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "724200.000000", + "hours": 0 + }, + { + "uxid": "456bcb0a2e57a5c20f2757c8fc7669af1f969bb5a57f89965210daf7107993aa", + "dst": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", + "coins": "500.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 37, + "block_seq": 144 + }, + "time": 1430505176, + "txn": { + "timestamp": 1430505176, + "length": 220, + "type": 0, + "txid": "3bb9fc516dc2c522e28f99e6833253863c550547ce0e0a2dd963a0118b7a44a7", + "inner_hash": "111d56ae43b76740e905717e1e440f7611e922c50e83cf84b9edc51efa0271f2", + "fee": 0, + "sigs": [ + "18f2b86a6b51999f0fdc73d411c1db827730652ba2c098f1ff3f3dc0d409d6cf745d18d66bf25dae7e5a975e33f32e8d2b352c025a8e20ff15a68aaa60b1bbb700" + ], + "inputs": [ + { + "uxid": "6c8b1ba9dc7e8900b42d55e9fbe6ea0e00d7eaccf67a7b66c0a2b771cf88ea05", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "724200.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "59d44fefbe86ebae4118dee90609d6a1c08c36f259c65e3fad63b9e41c37bf0c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "723200.000000", + "hours": 0 + }, + { + "uxid": "d8ee5dc5cabcf179365345167d39977ae38a71e55cf357881258be32a45732bc", + "dst": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 35, + "block_seq": 146 + }, + "time": 1430641376, + "txn": { + "timestamp": 1430641376, + "length": 220, + "type": 0, + "txid": "5701965d326520f86335da87c6d1781fd49f1e66520b94e1783711eba724f482", + "inner_hash": "b792056beaf4a864c92e40ad63f9117fae52f4bfda9f88aa74f1255490c28ef6", + "fee": 6894507, + "sigs": [ + "1d98fdd17853e4265c17644a993fdbe5047418b7be96258fdf3c2b3e9c739b1d72c5acc23981dac2d478966834fafa1f98aab2402ce37fe818d3919cf490a5e900" + ], + "inputs": [ + { + "uxid": "59d44fefbe86ebae4118dee90609d6a1c08c36f259c65e3fad63b9e41c37bf0c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "723200.000000", + "hours": 0, + "calculated_hours": 9192675 + } + ], + "outputs": [ + { + "uxid": "5baf8c8ab1a01d80a6f496144815cf6bda5289b34055010e21324ea3950d3299", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "722200.000000", + "hours": 1149084 + }, + { + "uxid": "3dd82b00ef4d1e3b1c71be5f13c0c82b3e2b17af4a6b3eb4c966490f47866ccd", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 1149084 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 34, + "block_seq": 147 + }, + "time": 1430641536, + "txn": { + "timestamp": 1430641536, + "length": 220, + "type": 0, + "txid": "3fae944ef07d9bcba1bcbc8bde87da50a1232132074803f8442deb563ed2da51", + "inner_hash": "aeceb514529fcf9de954599318d804301689818b8d5c90cdbd3bdf6ce3768c47", + "fee": 861814, + "sigs": [ + "b6b837c14a65c31150c24f93ac60a9b49baeb963cf49a8d97e817883ca46a3763168988b69542c5a52b7501674271ded3888bccda558aad004902ab7b7010f5501" + ], + "inputs": [ + { + "uxid": "5baf8c8ab1a01d80a6f496144815cf6bda5289b34055010e21324ea3950d3299", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "722200.000000", + "hours": 1149084, + "calculated_hours": 1149084 + } + ], + "outputs": [ + { + "uxid": "dd07d759d92e3d628a35c467dcd919dcae825a9fa79a14855714270dae08c0ce", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "721200.000000", + "hours": 143635 + }, + { + "uxid": "3ec30639c24acce65054bdb0d7ab0539199b64cabfcad83c2ed7f266fb8849a6", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 143635 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 33, + "block_seq": 148 + }, + "time": 1430642006, + "txn": { + "timestamp": 1430642006, + "length": 220, + "type": 0, + "txid": "79681167a7681edecb998e4a6dccdd0b7be45f163c8f6db23436517936269fb8", + "inner_hash": "b06c37ee520387277d5c174e0fefb11dbbbee9c7ffe53715b7b5bab8f4693dfe", + "fee": 107727, + "sigs": [ + "150ffd203e65dac9dbfcaffb384a9233a274e0ced5a0c2fc9a3127e7a85df894124a5c1f0501c60640dce7d7c09cd1783ed61461f285fa89e6227ba1b427e81d00" + ], + "inputs": [ + { + "uxid": "dd07d759d92e3d628a35c467dcd919dcae825a9fa79a14855714270dae08c0ce", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "721200.000000", + "hours": 143635, + "calculated_hours": 143635 + } + ], + "outputs": [ + { + "uxid": "c739b518f3f700e810f81523d81b15f968fbf202f389ceaa9d9f303319a00275", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "720200.000000", + "hours": 17954 + }, + { + "uxid": "5233e499bd3e38ec4d4fa4d750290f25271c91b4903630d461be51f3c2c02ebd", + "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "1000.000000", + "hours": 17954 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 32, + "block_seq": 149 + }, + "time": 1430642106, + "txn": { + "timestamp": 1430642106, + "length": 220, + "type": 0, + "txid": "b69536fbec9911da41e9d0c5ca73459f5e692ba155f8b72c0972792e9937a0fe", + "inner_hash": "a6d1d92496583cefdf9a9d4e278cdeac9d8e7c31eec3061f0a91bc0116ced8e4", + "fee": 13466, + "sigs": [ + "d98168e1f19fbabcf0ec9fdf21d36486a2d70b13624bd2ec765bc773a08c7f5c09c7df2664e3205c7555bd3c5cb64ca78f5f0a81613ef4a7d740348e0132caf901" + ], + "inputs": [ + { + "uxid": "c739b518f3f700e810f81523d81b15f968fbf202f389ceaa9d9f303319a00275", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "720200.000000", + "hours": 17954, + "calculated_hours": 17954 + } + ], + "outputs": [ + { + "uxid": "95694746f813d018be7988aec666b52924a7815adabe9cbdac3f6ab0f51bd1ab", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "719200.000000", + "hours": 2244 + }, + { + "uxid": "eb57ec196fe95a09be19b62b6837d5d12f99568ad0e5e198f70f55083acd656e", + "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 2244 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 31, + "block_seq": 150 + }, + "time": 1430642306, + "txn": { + "timestamp": 1430642306, + "length": 220, + "type": 0, + "txid": "3e228564e3c187e22bd489857fdb1db7036021e19f688aad56cfee57d5e13ac5", + "inner_hash": "9b4783f4cd11a81e945a2d09b699f76254caa3bbf22ce8533f3b9f179c207702", + "fee": 1684, + "sigs": [ + "8bd5632a52c39ef9e9ce90ebabd119c8f93e32a5a5b6e8fe80c58163b4adcc040725f18321894b59c3546c8ce9fb182e1a4dd6a3b4405229635e3ac3d80213a700" + ], + "inputs": [ + { + "uxid": "95694746f813d018be7988aec666b52924a7815adabe9cbdac3f6ab0f51bd1ab", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "719200.000000", + "hours": 2244, + "calculated_hours": 2244 + } + ], + "outputs": [ + { + "uxid": "be958e5c47415291a781648335db24e448e1f4f09aa5e9c3f055fbc906b574d7", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "719100.000000", + "hours": 280 + }, + { + "uxid": "0fa23085def7c1dbc95587d3f0f58cbc30b09e099ee1afa42d9120452777740a", + "dst": "sV8sVBgs11uHQtZK5MPbYem2iJ6Hehghv7", + "coins": "100.000000", + "hours": 280 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 30, + "block_seq": 151 + }, + "time": 1430642426, + "txn": { + "timestamp": 1430642426, + "length": 220, + "type": 0, + "txid": "18607765c3fbd45eafa15d2d62ab3cbc7ba7bd80c42931aae4db75aa02898671", + "inner_hash": "dbbf7608b67e82363ced90b364a9b8c91029b336ef2b68182d986e399eacb41a", + "fee": 210, + "sigs": [ + "1972310d45a5baf10a8d929a132c725c51cdd19daae3baa640570aeadbb08ea700fbe46e6649289bec61065b05250b84872002f93634e6be81bae042cf80854b01" + ], + "inputs": [ + { + "uxid": "be958e5c47415291a781648335db24e448e1f4f09aa5e9c3f055fbc906b574d7", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "719100.000000", + "hours": 280, + "calculated_hours": 280 + } + ], + "outputs": [ + { + "uxid": "68165429853e18e4414ec6c15630262ebcaa802ff1d83b6cbe116db51cb32066", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "718100.000000", + "hours": 35 + }, + { + "uxid": "efcb1b5f54bceb2d0124d2f89c47d071c2943fb228c2eee62bfddf6e1418cfc8", + "dst": "pMub1Pz3SLVaSwHoomgp5oDVxdkVxLkW6L", + "coins": "1000.000000", + "hours": 35 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 29, + "block_seq": 152 + }, + "time": 1430642546, + "txn": { + "timestamp": 1430642546, + "length": 220, + "type": 0, + "txid": "dc10e0565a14dfecda066577581f3e2d073de34ed3e911ed94413d38fc0a33d2", + "inner_hash": "821dfa6422bb093a528a2ec2bedd0566599cef3e2f4f91441f3073888e092832", + "fee": 27, + "sigs": [ + "1bb9e5e58a4a7dfc9a29bb22eabb2ee4dc6e40dd71b35962adf95d1c1208309727f070257b4591e959a4965cb8d22710233dd1f65c3b58ec47bb71e3d7ebd3e700" + ], + "inputs": [ + { + "uxid": "68165429853e18e4414ec6c15630262ebcaa802ff1d83b6cbe116db51cb32066", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "718100.000000", + "hours": 35, + "calculated_hours": 35 + } + ], + "outputs": [ + { + "uxid": "46aeb9ea01bb04e28c55ef11f8e75434dbeee546f7e06bdef332c604590c48a1", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "717100.000000", + "hours": 4 + }, + { + "uxid": "c0548bf35c950a74c206d2c565e3bcac1f2abe170ebabdb7b74e439b642dd9fd", + "dst": "22WGCstVJGVyqnBuvGHt17L5aNNMpURvckd", + "coins": "1000.000000", + "hours": 4 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 28, + "block_seq": 153 + }, + "time": 1430642816, + "txn": { + "timestamp": 1430642816, + "length": 220, + "type": 0, + "txid": "b0d7ff47658b3e32d8457eb62f6df0c7caaf7feadcbf8cc0c713976026f0404c", + "inner_hash": "5154559a3393277ed8db279bf27a9572c9aeebe81f321d9fb07a5e4313005a90", + "fee": 4, + "sigs": [ + "a3edf9a3203fc696aefde6180d6c28fbaf3f4ee662ea90d82a93c3a8485593465f956713abfea8322b952d61969b29267f3826775638da77a1bf8567a40564e500" + ], + "inputs": [ + { + "uxid": "46aeb9ea01bb04e28c55ef11f8e75434dbeee546f7e06bdef332c604590c48a1", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "717100.000000", + "hours": 4, + "calculated_hours": 4 + } + ], + "outputs": [ + { + "uxid": "598503902d2e6cb62d6f6478f09d8da05af6fd2da92b50825da3b7f74b2df34c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "716100.000000", + "hours": 0 + }, + { + "uxid": "045dc2e76321e37884588093083ce1b21be12f20ba1fa36f2a755b894229e3cf", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 27, + "block_seq": 154 + }, + "time": 1430643706, + "txn": { + "timestamp": 1430643706, + "length": 220, + "type": 0, + "txid": "be0957035ed2ac444f67273fc5c1c6a39ee373f6f83d1604d0023742a8cd7e42", + "inner_hash": "957140523c9acc14a4f6b6a2fd05e70c58d2ed51f43b4e88b1406b398f4e7b2e", + "fee": 0, + "sigs": [ + "ee25ac881aa867780086df4716864a9ec524deeecc140faa60b9f9b87805816c22659836b5169f8eab0977a2337638b6ed7cd7c4a5d4ee3664e7ad28e91dd5b901" + ], + "inputs": [ + { + "uxid": "598503902d2e6cb62d6f6478f09d8da05af6fd2da92b50825da3b7f74b2df34c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "716100.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "4b917e7bd3409c43f9f670f2846ce74f9288708df5aa1d9ae142f2411ce426da", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "715100.000000", + "hours": 0 + }, + { + "uxid": "dbc58940c2457359501c9906589c3d0a0ab7695b983ad79f2bcc087a675671f6", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 26, + "block_seq": 155 + }, + "time": 1430643906, + "txn": { + "timestamp": 1430643906, + "length": 220, + "type": 0, + "txid": "c9582c8134fa64fdf08cd93d42035adcced3f16aa8ee1a1393e3fcd7c07aa40c", + "inner_hash": "ecd6b0cab28125e3ec1fe23a046c259a7d608802da7d6397dbd8b410de03b94d", + "fee": 0, + "sigs": [ + "95e5d5d0856bf5387de8fbdae05f5953510fd85ec346e65fa5fb68984bdb1ab83aa7807e57f00354d934f84a0034ecf8aa74fe3b8e9e480021873f62827770ab01" + ], + "inputs": [ + { + "uxid": "4b917e7bd3409c43f9f670f2846ce74f9288708df5aa1d9ae142f2411ce426da", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "715100.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "d50a372f8f8cd1e0b10d847613b68ee760f195f5f212d6c59e86312c84dd07ac", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "714800.000000", + "hours": 0 + }, + { + "uxid": "25a72cc385c1cdabd0ffd7c141ae205d767f3d016c281f835b9f58f9325bd2a5", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "300.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 25, + "block_seq": 156 + }, + "time": 1430644036, + "txn": { + "timestamp": 1430644036, + "length": 220, + "type": 0, + "txid": "29a883ef9dc67bc683014187b9865c827b5e2f8afd7bf6f3787483318063789e", + "inner_hash": "bf3a81668fb27c0f55d9ec33490cb4c91ec7636ec1f85761fadbfebc020a618a", + "fee": 0, + "sigs": [ + "970a22ba9a849caf00fc787a182dd67a3be794db9d66c691e9d904a78f90397542dee63e801c8b7f4077060fda76f0ac56a67b30865cc4634679f118abe04fc101" + ], + "inputs": [ + { + "uxid": "d50a372f8f8cd1e0b10d847613b68ee760f195f5f212d6c59e86312c84dd07ac", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "714800.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "896865f9b610f9fb69a741596b3ecb9fff3790d40476a9f7852831bdf477aaee", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "713800.000000", + "hours": 0 + }, + { + "uxid": "a34cfb6f175323917dfda72d58ddcfb86363cc43d22a0c6c3141810f5cac5aa6", + "dst": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 24, + "block_seq": 157 + }, + "time": 1430673946, + "txn": { + "timestamp": 1430673946, + "length": 220, + "type": 0, + "txid": "c3fd04cd27ea311b1a67d40cd3dbb2ea8ae2c6f6139620cb86be29f33ed99171", + "inner_hash": "5a975ee4a0f95c51a0a847b1d082bc4859a4b7904acbaece151c58e01f26a870", + "fee": 0, + "sigs": [ + "06c22eb6cb03468010ffbd2b54faa5835ea44cf552779b0adb09817db7e5494d49031d2e4b8994b670857b193766a1f430857955edd627f290f71f970407139b01" + ], + "inputs": [ + { + "uxid": "896865f9b610f9fb69a741596b3ecb9fff3790d40476a9f7852831bdf477aaee", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "713800.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "272d5bbd86a87796a20e3e4debc46a2076718800343bee4f72fc0217a98a10a3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "695800.000000", + "hours": 0 + }, + { + "uxid": "25130a18aca13a37e4f4c08733cdda6a8629759f27ecba775999486c9deffa5e", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "18000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 23, + "block_seq": 158 + }, + "time": 1430674696, + "txn": { + "timestamp": 1430674696, + "length": 220, + "type": 0, + "txid": "3d9f1aa1b6206275081cb9c26155f6261be1ef9c94b4eaadb1a7e8277a2099fa", + "inner_hash": "ef7915c2cc32cfd043bf60533a563a89ee68a7b2f88e9e1e55e6a54494bde805", + "fee": 0, + "sigs": [ + "6d2993d471d4b27d4b0c2beef286dab7e38013853926fef032a8a10d9161fbff59b4eba58d7578182f9f1e79ee763ab409aec46748351b0a7d1a020a3fe3824100" + ], + "inputs": [ + { + "uxid": "272d5bbd86a87796a20e3e4debc46a2076718800343bee4f72fc0217a98a10a3", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "695800.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "60906201d3e7c67ddb976972460b2b8ed093e1f6720a784cbaea376ca13e6cef", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "670800.000000", + "hours": 0 + }, + { + "uxid": "c61f27a2247831679d8df293bf9351b16e8429778c875be2cb64224bcb842ed4", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "25000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 22, + "block_seq": 159 + }, + "time": 1430715196, + "txn": { + "timestamp": 1430715196, + "length": 220, + "type": 0, + "txid": "d720ca0efb19b964f481724e5d3f932841e9e75a69b998baf4b575cf3298cb87", + "inner_hash": "b35da2487dfd396bc01b5296fab691557760886b23ba5bd18e52808549dbfef2", + "fee": 0, + "sigs": [ + "9cb0a128d17a9c42f3e4e44f4da9106ef11407da8d9a434745add4c5f7a8e379325976d8c2222c3328acdc2c6ca597fab4fae292c5529e07c55919ce0e0320ca01" + ], + "inputs": [ + { + "uxid": "60906201d3e7c67ddb976972460b2b8ed093e1f6720a784cbaea376ca13e6cef", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "670800.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "4912e9dbbb5a4cc7472c27b0212ab443e7b5499207b10666a66257005e182714", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "664464.000000", + "hours": 0 + }, + { + "uxid": "b1e5c694c30326cda3df2e634723999befbcbb141415e9a36bdbf18d7bea9870", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "6336.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 21, + "block_seq": 160 + }, + "time": 1430784172, + "txn": { + "timestamp": 1430784172, + "length": 220, + "type": 0, + "txid": "0e8e352b1f2cd419bca619918ce6d5ec1eac0ba7252d76eef5d9d8f8186f737a", + "inner_hash": "49571d7e7c6b3e473b938f1cf4748c67f9301ca710f26ee56d0d8e231cb4515f", + "fee": 0, + "sigs": [ + "8d4556a22c5fb84792cc88bfb47f795e6ba9fc211933776acd89b6da9aff71ea7803bf5b0e1d9afef2f3f77bbc4a7633c459ab9cb11a06723c4cad570717edfd00" + ], + "inputs": [ + { + "uxid": "4912e9dbbb5a4cc7472c27b0212ab443e7b5499207b10666a66257005e182714", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "664464.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "659bac1636b64087ad5d3cb0ae78c52f28ad920016ec67e08415a537e0343072", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "663464.000000", + "hours": 0 + }, + { + "uxid": "ea18f151bbdb611f73596b61ebb0546b9e91281ccb0bbe07a18e7fa69142bb5b", + "dst": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 20, + "block_seq": 161 + }, + "time": 1430784312, + "txn": { + "timestamp": 1430784312, + "length": 220, + "type": 0, + "txid": "d5091ca65ff61998dfb4535a7927fb736abf2a81140a11322dcf8226de27cf92", + "inner_hash": "7a000aaa5751b65d3bccd4d307b7b8602aae539971de3af3baa3e126d52a54f2", + "fee": 0, + "sigs": [ + "693d3153218a69e2ef1e676d6c124dd7fab7ee312d41fd9dbe005a0e681a8b052708a9559fc08e8173e1ef83e45f838742e4a1af765ea7f0fddb38cee2cced8000" + ], + "inputs": [ + { + "uxid": "659bac1636b64087ad5d3cb0ae78c52f28ad920016ec67e08415a537e0343072", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "663464.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "97f64c3c636e5fc997e277cd48644055ef51045ed9c473c05dd6e699872a6c3d", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "662464.000000", + "hours": 0 + }, + { + "uxid": "0c19e689e0e34639c71b0136ce336121b042b6d4ac185ac1f9e94ec7535e781f", + "dst": "XnKU1htBL5wFSMX8oytZBsBMeaBSbVNivT", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 19, + "block_seq": 162 + }, + "time": 1430784372, + "txn": { + "timestamp": 1430784372, + "length": 220, + "type": 0, + "txid": "30e66ff45cfb145eb465e2ebdef0bb10005138bc1727c83888785b04d548e85b", + "inner_hash": "c87fb6e81fc1d99b16958d4626aa0e5ec4033443230bbc8b35e2882c078bf868", + "fee": 0, + "sigs": [ + "b4feadec09b450b99795044931a94f7b8549bf876db7c62132df60056dd0c88e3821d1656407b1572fbb04eb71f6de57db43c997501989f44042d04fc3afdf4201" + ], + "inputs": [ + { + "uxid": "97f64c3c636e5fc997e277cd48644055ef51045ed9c473c05dd6e699872a6c3d", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "662464.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "122b7a9a61ee04e071002d74ffb26b12ed7952ff9a138b5437f990f4678cc2e5", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "662314.000000", + "hours": 0 + }, + { + "uxid": "db7a63750db787959a9e0d2d6be9a1ba8bb3d6015bae2353a27ae9eb55b39d22", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "150.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 18, + "block_seq": 163 + }, + "time": 1430784932, + "txn": { + "timestamp": 1430784932, + "length": 220, + "type": 0, + "txid": "ec79854fade530d84099d5619864a8e1e8ec9d27a086917a239500cada43c6e8", + "inner_hash": "ed6a317c8ea3624337463c1cca78bdcf87bf80dace1bccad050d27a49d3ea1d2", + "fee": 0, + "sigs": [ + "c0548625b3bc88308155f598c3304a124632c0faef8005b8f9306b229b632b253c5e163a02409ba40b01560f77a6acde2ccc48cb0efedd4feb68ecbd925917fa00" + ], + "inputs": [ + { + "uxid": "122b7a9a61ee04e071002d74ffb26b12ed7952ff9a138b5437f990f4678cc2e5", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "662314.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "c07593d4329f82da243e4bbd7430e4b10e7b35f9ce0a3718d0e6d25d20b4939b", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "661314.000000", + "hours": 0 + }, + { + "uxid": "250543215c71a1a9ab7740fff25c3bf9695fcde10bceba3717aef9d0f6dd40d8", + "dst": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 17, + "block_seq": 164 + }, + "time": 1430790052, + "txn": { + "timestamp": 1430790052, + "length": 220, + "type": 0, + "txid": "743bf1eede313145824db1c4f8d683b74ab5e0bc825082d986308b73fd52f1d7", + "inner_hash": "a0427c37a8ca9f8205630cc8d4c6d95200413d3397a0de9bf015763107b8fc80", + "fee": 0, + "sigs": [ + "dc400e921f7f94da5f353846f1340e039b4527fff121a56579390fb4fa4154634e3b3aad44ddf0aaebea5abc1dc5ba2a00540fd2888ed5c4ab7b20c51255086a01" + ], + "inputs": [ + { + "uxid": "c07593d4329f82da243e4bbd7430e4b10e7b35f9ce0a3718d0e6d25d20b4939b", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "661314.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "4d52106e41dba0099549fd81fb8feb6915225b0125c53faa0f7c578ea78f213a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "660314.000000", + "hours": 0 + }, + { + "uxid": "bc513a68461d5c401e65a500baf7dfa163735ef63b817bb7b73c4139d5c29d18", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 16, + "block_seq": 165 + }, + "time": 1430790152, + "txn": { + "timestamp": 1430790152, + "length": 220, + "type": 0, + "txid": "3991a257eee265481e713917a3a9c15756f61175bcfc7acfdbe84158e43fd5e6", + "inner_hash": "dea502923be2dd8b4c48eb7ed2b146793ef840e9749d129bf7f6bda0fdcc43de", + "fee": 0, + "sigs": [ + "dbb23f6d22438c10b98b437fe2ee4d7c5513aba7b0b6141648ac22f07e3768fc5d8d80f9dbcaa95edf925668b6018793a01ca70cf7b48d7c7deac106557ebf7f00" + ], + "inputs": [ + { + "uxid": "4d52106e41dba0099549fd81fb8feb6915225b0125c53faa0f7c578ea78f213a", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "660314.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "fef9dd3b633274743099e607d9229717a001d6de6a4031479cc30d31d65e8396", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "659314.000000", + "hours": 0 + }, + { + "uxid": "5954742a6ca4e3e872d12d4a93436451ad52e6d25e5ac28371e308b2d7ce75a3", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 14, + "block_seq": 167 + }, + "time": 1430791902, + "txn": { + "timestamp": 1430791902, + "length": 220, + "type": 0, + "txid": "b29222c08f10b8bc4ea18981519a3b0e02b9c9cec63ee28d9ffa2efcaf2a8e5a", + "inner_hash": "61c38575be160010335d96cf7c6ef0608cdb7b85079f2518532d00b6f42f13d0", + "fee": 201915, + "sigs": [ + "cb5c75671164755516cbf4d94e2288d56985b4d3113538bc818d1aa1c944a76b1beae28964c8e596ab0cd252cda6cf2a5468cbd0dbeff21e35609b5a6577eb0a01" + ], + "inputs": [ + { + "uxid": "fef9dd3b633274743099e607d9229717a001d6de6a4031479cc30d31d65e8396", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "659314.000000", + "hours": 0, + "calculated_hours": 269219 + } + ], + "outputs": [ + { + "uxid": "21f0fb666dca05d7a43ab26a378f7f7eaedfacde22fa047ca72857e9509cc748", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "659214.000000", + "hours": 33652 + }, + { + "uxid": "0b5e5259c276ac949de97062492ea6dc93ae6215c8dd1615862907e3c3ae9cf0", + "dst": "2A2YC8kxWnUDbscpzZ6UPfNAmx5ddKBeYNs", + "coins": "100.000000", + "hours": 33652 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 13, + "block_seq": 168 + }, + "time": 1430792072, + "txn": { + "timestamp": 1430792072, + "length": 220, + "type": 0, + "txid": "50fc81b0ba25669105a169a969459ccdb10278051b604a3f91467c2528c83652", + "inner_hash": "c356824e25deeecd3f531eb56a26d5875b7b81743e9c8f3d6beff5f634bf5e3f", + "fee": 25240, + "sigs": [ + "ac3b968f82649fac3822db1af5c0be17fc20cf86e091362b1584a2b66c033b10541f70fb6f55d8e1b3c57161ce37412a52d2009dd8abc9ef7ab038b19d8d644401" + ], + "inputs": [ + { + "uxid": "21f0fb666dca05d7a43ab26a378f7f7eaedfacde22fa047ca72857e9509cc748", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "659214.000000", + "hours": 33652, + "calculated_hours": 33652 + } + ], + "outputs": [ + { + "uxid": "6b3a0cab1d9ad6fd011a3bac5e6ff4e3f7903bce911dc7fe83926eae557c34c3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "658214.000000", + "hours": 4206 + }, + { + "uxid": "a02148f770788851a35fb90567510044e37f8db930deab7a2b584af67c8efb2f", + "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "1000.000000", + "hours": 4206 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 10, + "block_seq": 171 + }, + "time": 1430870562, + "txn": { + "timestamp": 1430870562, + "length": 220, + "type": 0, + "txid": "fb495093f2f4e5c6555c50150ea60c0a6f430e53aa971ebb3e2b5412866a1f06", + "inner_hash": "05596340e51ad628080101c8e92a60f27e0f5ab509e892f9b65a0988b1575ddb", + "fee": 6084778, + "sigs": [ + "068a56e916267a1756d9348bb965f3ed2dcba956fe4c626cd4836921dd836f7c0fa923d6451d5c87aa2eab528ff19ec332434bd12e197eeafbf0896e84940c4401" + ], + "inputs": [ + { + "uxid": "6b3a0cab1d9ad6fd011a3bac5e6ff4e3f7903bce911dc7fe83926eae557c34c3", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "658214.000000", + "hours": 4206, + "calculated_hours": 8113036 + } + ], + "outputs": [ + { + "uxid": "372703f8109295f0f58fbee58795979e10dd887869f4fc1da4881ce8a3c0aeb4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "647750.000000", + "hours": 1014129 + }, + { + "uxid": "a35044035cce79cb988c757dcaf5d9a065957c0fbc1a3559d08ed46831504fc2", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "10464.000000", + "hours": 1014129 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 8, + "block_seq": 173 + }, + "time": 1430871512, + "txn": { + "timestamp": 1430871512, + "length": 220, + "type": 0, + "txid": "a7665cec98224150968ec1ef9ef2d6b3175c9de8f9f8c7bc786b30cc74997c57", + "inner_hash": "5bd2503c4ff78e7c9d182bfe5e62e54f1bfb944bb526d97b272021d8ccfa9359", + "fee": 764646, + "sigs": [ + "dbd1e8763cb9681aeb96edc0c8483decee30b670778bec88da249f9d4f2201c330d2a16349608ba51eb8a387805dce9618810c4e6fd7af548cccee7d2c9c5dd201" + ], + "inputs": [ + { + "uxid": "372703f8109295f0f58fbee58795979e10dd887869f4fc1da4881ce8a3c0aeb4", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "647750.000000", + "hours": 1014129, + "calculated_hours": 1019526 + } + ], + "outputs": [ + { + "uxid": "14027340f6e1d98bba3f7f5f3b50e3588f8a19e4d021db944e7a28b2643640e1", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "635750.000000", + "hours": 127440 + }, + { + "uxid": "793f3f0e41c9d1de391d864792b79ed8c24dde5ff84a73c161d660a73ed70c90", + "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "12000.000000", + "hours": 127440 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 6, + "block_seq": 175 + }, + "time": 1430908702, + "txn": { + "timestamp": 1430908702, + "length": 220, + "type": 0, + "txid": "9364ed6cfcc289df74dc6bac1993f7ab3441b898cb3f06918198d2476c83dbac", + "inner_hash": "a55922b0495d39c8e9db70ac9aca99266d5a7f3644106b4b5468345d955acf41", + "fee": 110149, + "sigs": [ + "cecae09b7925e9f6db1ccf5ef9a93687a43bbeaefe2888abcc07411c71f850c80c05ed573abd67bf9f0e8a096a1aba8187547e3d062e5ed147ac51961cc3559701" + ], + "inputs": [ + { + "uxid": "14027340f6e1d98bba3f7f5f3b50e3588f8a19e4d021db944e7a28b2643640e1", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "635750.000000", + "hours": 127440, + "calculated_hours": 146865 + } + ], + "outputs": [ + { + "uxid": "8e55f10a0615a0737e6906132e09ac08a206971ba4b656f004acc7f4b7889bc8", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "625750.000000", + "hours": 18358 + }, + { + "uxid": "d91e07318227651129b715d2db448ae245b442acd08c8b4525a934f0e87efce9", + "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "10000.000000", + "hours": 18358 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 2, + "block_seq": 179 + }, + "time": 1431339429, + "txn": { + "timestamp": 1431339429, + "length": 220, + "type": 0, + "txid": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "inner_hash": "db98f515ce6c3d99fd7c39a6ac59ab498b1a2cc8fc6a13377ac7d3d463898e7c", + "fee": 33129894, + "sigs": [ + "1ca18424c9a313e9c253aecaec3c532c35c60e454f026a3d2794c772bc74a19809d53f8862962e865dd822dd054cd7f32b89b810968d95c9db6a9a0c1095390601" + ], + "inputs": [ + { + "uxid": "8e55f10a0615a0737e6906132e09ac08a206971ba4b656f004acc7f4b7889bc8", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "625750.000000", + "hours": 18358, + "calculated_hours": 44173190 + } + ], + "outputs": [ + { + "uxid": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "hours": 5521648 + }, + { + "uxid": "01f9c1d6c83dbc1c993357436cdf7f214acd0bfa107ff7f1466d1b18ec03563e", + "dst": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "10050.000000", + "hours": 5521648 + } + ] + } + }, + { + "status": { + "confirmed": false, + "unconfirmed": true, + "height": 0, + "block_seq": 0 + }, + "time": 1535637620, + "txn": { + "timestamp": 1535637620, + "length": 220, + "type": 0, + "txid": "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947", + "inner_hash": "f8293dbfdddcc56a97664655ceee650715d35a0dda32a9f0ce0e2e99d4899124", + "fee": 34297581, + "sigs": [ + "3981061c7275ae9cc936e902a5367fdd87ef779bbdb31e1e10d325d17a129abb34f6e597ceeaf67bb051774b41c58276004f6a63cb81de61d4693bc7a5536f3200" + ], + "inputs": [ + { + "uxid": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "hours": 5521648, + "calculated_hours": 45730107 + } + ], + "outputs": [ + { + "uxid": "8f9c09c37e0c636178e4229e2e8212c067ef0a8c501be9e2757a97b980d7a98a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "605700.000000", + "hours": 5716263 + }, + { + "uxid": "32a060b2e2025cceb40f3f982c887952d3358d468db1719dd892eab575c14c14", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10000.000000", + "hours": 5716263 + } + ] + } + } +] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/all-unconfirmed-txns-verbose.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/all-unconfirmed-txns-verbose.golden new file mode 100644 index 00000000..131bffd2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/all-unconfirmed-txns-verbose.golden @@ -0,0 +1,45 @@ +[ + { + "status": { + "confirmed": false, + "unconfirmed": true, + "height": 0, + "block_seq": 0 + }, + "time": 1535637620, + "txn": { + "timestamp": 1535637620, + "length": 220, + "type": 0, + "txid": "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947", + "inner_hash": "f8293dbfdddcc56a97664655ceee650715d35a0dda32a9f0ce0e2e99d4899124", + "fee": 34297581, + "sigs": [ + "3981061c7275ae9cc936e902a5367fdd87ef779bbdb31e1e10d325d17a129abb34f6e597ceeaf67bb051774b41c58276004f6a63cb81de61d4693bc7a5536f3200" + ], + "inputs": [ + { + "uxid": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "hours": 5521648, + "calculated_hours": 45730107 + } + ], + "outputs": [ + { + "uxid": "8f9c09c37e0c636178e4229e2e8212c067ef0a8c501be9e2757a97b980d7a98a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "605700.000000", + "hours": 5716263 + }, + { + "uxid": "32a060b2e2025cceb40f3f982c887952d3358d468db1719dd892eab575c14c14", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10000.000000", + "hours": 5716263 + } + ] + } + } +] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/all-unconfirmed-txns.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/all-unconfirmed-txns.golden new file mode 100644 index 00000000..6b5f05cf --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/all-unconfirmed-txns.golden @@ -0,0 +1,38 @@ +[ + { + "status": { + "confirmed": false, + "unconfirmed": true, + "height": 0, + "block_seq": 0 + }, + "time": 1535637620, + "txn": { + "timestamp": 1535637620, + "length": 220, + "type": 0, + "txid": "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947", + "inner_hash": "f8293dbfdddcc56a97664655ceee650715d35a0dda32a9f0ce0e2e99d4899124", + "sigs": [ + "3981061c7275ae9cc936e902a5367fdd87ef779bbdb31e1e10d325d17a129abb34f6e597ceeaf67bb051774b41c58276004f6a63cb81de61d4693bc7a5536f3200" + ], + "inputs": [ + "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20" + ], + "outputs": [ + { + "uxid": "8f9c09c37e0c636178e4229e2e8212c067ef0a8c501be9e2757a97b980d7a98a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "605700.000000", + "hours": 5716263 + }, + { + "uxid": "32a060b2e2025cceb40f3f982c887952d3358d468db1719dd892eab575c14c14", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10000.000000", + "hours": 5716263 + } + ] + } + } +] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/balance-2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/balance-2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf.golden new file mode 100644 index 00000000..1904596a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/balance-2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf.golden @@ -0,0 +1,22 @@ +{ + "confirmed": { + "coins": 1000000000000, + "hours": 1013371112 + }, + "predicted": { + "coins": 1000000000000, + "hours": 1013371112 + }, + "addresses": { + "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf": { + "confirmed": { + "coins": 1000000000000, + "hours": 1013371112 + }, + "predicted": { + "coins": 1000000000000, + "hours": 1013371112 + } + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/balance-affected-by-unconfirmed-txns.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/balance-affected-by-unconfirmed-txns.golden new file mode 100644 index 00000000..fa633b3e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/balance-affected-by-unconfirmed-txns.golden @@ -0,0 +1,32 @@ +{ + "confirmed": { + "coins": 616700000000, + "hours": 45935222 + }, + "predicted": { + "coins": 616700000000, + "hours": 11637641 + }, + "addresses": { + "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN": { + "confirmed": { + "coins": 1000000000, + "hours": 205115 + }, + "predicted": { + "coins": 11000000000, + "hours": 5921378 + } + }, + "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ": { + "confirmed": { + "coins": 615700000000, + "hours": 45730107 + }, + "predicted": { + "coins": 605700000000, + "hours": 5716263 + } + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/balance-noaddrs.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/balance-noaddrs.golden new file mode 100644 index 00000000..5113473a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/balance-noaddrs.golden @@ -0,0 +1,22 @@ +{ + "confirmed": { + "coins": 0, + "hours": 0 + }, + "predicted": { + "coins": 0, + "hours": 0 + }, + "addresses": { + "prRXwTcDK24hs6AFxj69UuWae3LzhrsPW9": { + "confirmed": { + "coins": 0, + "hours": 0 + }, + "predicted": { + "coins": 0, + "hours": 0 + } + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/balance-two-addrs.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/balance-two-addrs.golden new file mode 100644 index 00000000..fdf5ffc3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/balance-two-addrs.golden @@ -0,0 +1,32 @@ +{ + "confirmed": { + "coins": 1022100000000, + "hours": 1013748655 + }, + "predicted": { + "coins": 1022100000000, + "hours": 1013748655 + }, + "addresses": { + "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf": { + "confirmed": { + "coins": 1000000000000, + "hours": 1013371112 + }, + "predicted": { + "coins": 1000000000000, + "hours": 1013371112 + } + }, + "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5": { + "confirmed": { + "coins": 22100000000, + "hours": 377543 + }, + "predicted": { + "coins": 22100000000, + "hours": 377543 + } + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-hash-genesis.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-hash-genesis.golden new file mode 100644 index 00000000..b21bc8a6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-hash-genesis.golden @@ -0,0 +1,33 @@ +{ + "header": { + "seq": 0, + "block_hash": "0551a1e5af999fe8fff529f6f2ab341e1e33db95135eef1b2be44fe6981349f3", + "previous_block_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": 1426562704, + "fee": 0, + "version": 0, + "tx_body_hash": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "ux_hash": "0000000000000000000000000000000000000000000000000000000000000000" + }, + "body": { + "txns": [ + { + "length": 0, + "type": 0, + "txid": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "sigs": [], + "inputs": [], + "outputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000 + } + ] + } + ] + }, + "size": 86 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-hash-verbose-genesis.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-hash-verbose-genesis.golden new file mode 100644 index 00000000..7634ffe2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-hash-verbose-genesis.golden @@ -0,0 +1,34 @@ +{ + "header": { + "seq": 0, + "block_hash": "0551a1e5af999fe8fff529f6f2ab341e1e33db95135eef1b2be44fe6981349f3", + "previous_block_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": 1426562704, + "fee": 0, + "version": 0, + "tx_body_hash": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "ux_hash": "0000000000000000000000000000000000000000000000000000000000000000" + }, + "body": { + "txns": [ + { + "length": 0, + "type": 0, + "txid": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "fee": 0, + "sigs": [], + "inputs": [], + "outputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000 + } + ] + } + ] + }, + "size": 86 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-hash-verbose.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-hash-verbose.golden new file mode 100644 index 00000000..3fe1ca5c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-hash-verbose.golden @@ -0,0 +1,50 @@ +{ + "header": { + "seq": 11, + "block_hash": "70584db7fb8ab88b8dbcfed72ddc42a1aeb8c4882266dbb78439ba3efcd0458d", + "previous_block_hash": "5c5e6b0f6620a3af54a3259222a5269e60db768d7f805edce3f3e29f2597a487", + "timestamp": 1428808851, + "fee": 0, + "version": 0, + "tx_body_hash": "4a87de6869c974099e3f5522404fbc7b23f90a8f8dec958bf725317454036cdc", + "ux_hash": "47d440eb55e32969f35f46450636ca919195977ab8bb5fa3d1e9f0f4b48d7fa1" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "4a87de6869c974099e3f5522404fbc7b23f90a8f8dec958bf725317454036cdc", + "inner_hash": "53ecc82b426d4b806eb1c743e892edbc7eb7051c88f3fa8afc74a6a5b80cc57a", + "fee": 0, + "sigs": [ + "dbbb5acf0130c39a6b2fd760dda1df5aaefd94d8a0904e6faf959feade87d17a5c754459b635e0048e1019dadb9815a54d8bca4cf234f6876b19b5a0df5e494a00" + ], + "inputs": [ + { + "uxid": "ec2c2238793d71240502de3e7c46ec1d5bf938c76541185f1c3fdf0d99a90795", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "5.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "9c7d3674d7a6b28a559a052e6d354ec13d2e0396739973c9f0dce08f8c7d157c", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "4.000000", + "hours": 0 + }, + { + "uxid": "3f8c01eefca28ec6d89d34b899fecb5c97f9348b412c61e7c863310b8a85b953", + "dst": "2M2VC93aQv5asdcNKt7pzJdkxeL6xLw9JPp", + "coins": "1.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-hash.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-hash.golden new file mode 100644 index 00000000..622ce74b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-hash.golden @@ -0,0 +1,43 @@ +{ + "header": { + "seq": 11, + "block_hash": "70584db7fb8ab88b8dbcfed72ddc42a1aeb8c4882266dbb78439ba3efcd0458d", + "previous_block_hash": "5c5e6b0f6620a3af54a3259222a5269e60db768d7f805edce3f3e29f2597a487", + "timestamp": 1428808851, + "fee": 0, + "version": 0, + "tx_body_hash": "4a87de6869c974099e3f5522404fbc7b23f90a8f8dec958bf725317454036cdc", + "ux_hash": "47d440eb55e32969f35f46450636ca919195977ab8bb5fa3d1e9f0f4b48d7fa1" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "4a87de6869c974099e3f5522404fbc7b23f90a8f8dec958bf725317454036cdc", + "inner_hash": "53ecc82b426d4b806eb1c743e892edbc7eb7051c88f3fa8afc74a6a5b80cc57a", + "sigs": [ + "dbbb5acf0130c39a6b2fd760dda1df5aaefd94d8a0904e6faf959feade87d17a5c754459b635e0048e1019dadb9815a54d8bca4cf234f6876b19b5a0df5e494a00" + ], + "inputs": [ + "ec2c2238793d71240502de3e7c46ec1d5bf938c76541185f1c3fdf0d99a90795" + ], + "outputs": [ + { + "uxid": "9c7d3674d7a6b28a559a052e6d354ec13d2e0396739973c9f0dce08f8c7d157c", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "4.000000", + "hours": 0 + }, + { + "uxid": "3f8c01eefca28ec6d89d34b899fecb5c97f9348b412c61e7c863310b8a85b953", + "dst": "2M2VC93aQv5asdcNKt7pzJdkxeL6xLw9JPp", + "coins": "1.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-last-verbose.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-last-verbose.golden new file mode 100644 index 00000000..2713e8af --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-last-verbose.golden @@ -0,0 +1,54 @@ +{ + "blocks": [ + { + "header": { + "seq": 180, + "block_hash": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "previous_block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "timestamp": 1431574528, + "fee": 2265261, + "version": 0, + "tx_body_hash": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "ux_hash": "058d1d0a22be7b9f5567a236866836a87d922760581832cfb8bfbd8b337d64b1" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "inner_hash": "d5b18a0c0c454e56fe1f7d0c64236d633f65717c04f08cd943f5669b4cc34667", + "fee": 2265261, + "sigs": [ + "2fac42571bb301783e46e804069c73c8226b637ae6385fec793e3a3860feaa6918058c55f461cef38341670c5c2da230d2241f267dbde6fc0528a6fb24362b3b00" + ], + "inputs": [ + { + "uxid": "c39acd3494113650c1a6a7809287af7b12a78bbd97126d4585dd1715e2cb5a66", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23100.000000", + "hours": 18586, + "calculated_hours": 3020347 + } + ], + "outputs": [ + { + "uxid": "75692aeff988ce0da734c474dbef3a1ce19a5a6823bbcd36acb856c83262261e", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "hours": 377543 + }, + { + "uxid": "a4b70476ea1e079ebd3503b52eee32d490515457fce6a5aa075770b598a9d14f", + "dst": "CDD8GoJUHEvBm1pD3BQ3hEC2KcJNhvUzpu", + "coins": "1000.000000", + "hours": 377543 + } + ] + } + ] + }, + "size": 220 + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-last.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-last.golden new file mode 100644 index 00000000..cccffcd4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-last.golden @@ -0,0 +1,47 @@ +{ + "blocks": [ + { + "header": { + "seq": 180, + "block_hash": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "previous_block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "timestamp": 1431574528, + "fee": 2265261, + "version": 0, + "tx_body_hash": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "ux_hash": "058d1d0a22be7b9f5567a236866836a87d922760581832cfb8bfbd8b337d64b1" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "inner_hash": "d5b18a0c0c454e56fe1f7d0c64236d633f65717c04f08cd943f5669b4cc34667", + "sigs": [ + "2fac42571bb301783e46e804069c73c8226b637ae6385fec793e3a3860feaa6918058c55f461cef38341670c5c2da230d2241f267dbde6fc0528a6fb24362b3b00" + ], + "inputs": [ + "c39acd3494113650c1a6a7809287af7b12a78bbd97126d4585dd1715e2cb5a66" + ], + "outputs": [ + { + "uxid": "75692aeff988ce0da734c474dbef3a1ce19a5a6823bbcd36acb856c83262261e", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "hours": 377543 + }, + { + "uxid": "a4b70476ea1e079ebd3503b52eee32d490515457fce6a5aa075770b598a9d14f", + "dst": "CDD8GoJUHEvBm1pD3BQ3hEC2KcJNhvUzpu", + "coins": "1000.000000", + "hours": 377543 + } + ] + } + ] + }, + "size": 220 + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-seq-0.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-seq-0.golden new file mode 100644 index 00000000..b21bc8a6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-seq-0.golden @@ -0,0 +1,33 @@ +{ + "header": { + "seq": 0, + "block_hash": "0551a1e5af999fe8fff529f6f2ab341e1e33db95135eef1b2be44fe6981349f3", + "previous_block_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": 1426562704, + "fee": 0, + "version": 0, + "tx_body_hash": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "ux_hash": "0000000000000000000000000000000000000000000000000000000000000000" + }, + "body": { + "txns": [ + { + "length": 0, + "type": 0, + "txid": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "sigs": [], + "inputs": [], + "outputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000 + } + ] + } + ] + }, + "size": 86 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-seq-1.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-seq-1.golden new file mode 100644 index 00000000..e4fc6e8f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-seq-1.golden @@ -0,0 +1,631 @@ +{ + "header": { + "seq": 1, + "block_hash": "baf3b622f043bbe3ef480416251a6545d07f173e5969dde2b63c4a12956d38fd", + "previous_block_hash": "0551a1e5af999fe8fff529f6f2ab341e1e33db95135eef1b2be44fe6981349f3", + "timestamp": 1427926392, + "fee": 99999999999900, + "version": 0, + "tx_body_hash": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "ux_hash": "ecc66d67289ecf8b5c5d2758a8f07ef08373a61a4d4e2736905ac2aaa427655f" + }, + "body": { + "txns": [ + { + "length": 3846, + "type": 0, + "txid": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "inner_hash": "0f7019627886818d2501af189bbac18e21b8e959891c5b2726f89e29355aa10a", + "sigs": [ + "be602113fe288f750001ab65f254ceedd8b05b1becc456a0a52a0bea10b8280e38d950933992ad3265e1f81d197036fa634b316f08b3b319ffce081aa43f3bb600" + ], + "inputs": [ + "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0" + ], + "outputs": [ + { + "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "26f585cb96f35307f0af5b9aee004a29b7795695f4c5c836104e2fbbf429a3ce", + "dst": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "18a43b8b69bbf12a9e49e6f9783ba258397e6567301aeed9e901a1e4fed9fef9", + "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5a69ef09b5de21b117cac62141a8de4eade7558c42f0ba8b50996f5ec7867c5d", + "dst": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "aef761a12e3d0fa9c4a8db62b8bab1015c32931b7e3a7fc9a77282cec218f79d", + "dst": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "445a4082da251fa161e4705d115fe2018ca15a5f92e8a0950793405410e6be12", + "dst": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "dst": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "368a609ee90ca15bbbd297af07dc6705131764476d54bef641017ffcd0885e65", + "dst": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "13afe1586015c4d7312f89d123153279e4961eb0d53a4d036847d5d989ba90dc", + "dst": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f625cf04412199c16e073dbb500e66c23cfe69043578b4a2d879a329aac563ec", + "dst": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b2da50a08756c34d059a04812451cf3296f73ba87f8cca38473ac8f051ab6d1e", + "dst": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "135c28698e80e3b2a737d59c16c79684c3fb3ec5cec59f466a39f4ac3c73968e", + "dst": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "df63056cf3ae21efa86d241876ad0194387317585dc9e4fcd80954b47d59b57a", + "dst": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4628f4cfdbf1eb7cccc25d461c46cc29e90cffb5d6277e0de641f7701d60c308", + "dst": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "47e4706dc4d80a70b20c889476fb0627ca6d5bdaa790f4ceba44a689d31b2dcc", + "dst": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b64bc50d370a06df117eb543ca051239c985cfc4b6aa527c51b700de32c7fc41", + "dst": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "390bc4c045fa9f289957b7eca529bfadac96a7dd074bcfbdd3b09e99413b8202", + "dst": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6aa162f7fc09598c4dc8f5fab7fb2383f28c3840937a001acd9f37136e1691b2", + "dst": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e440cf4c896735d3299a871f988c134f404fb2065d1f20c87c9c9bc5fa582e09", + "dst": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "eea791e84a53e4d99485519c5d2c3146b0a2ad080cf92904ae7b28c2d9a6e3ca", + "dst": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "01048ad6a538256d9a8c6c9c6321ca1a01b31cbf08e74fd4ff0f141bf97eb8ce", + "dst": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc5f1f1ddc8cb23df3d42f1e5a1dda9d356846fe930ae4484bc1eeb1b3b2c95b", + "dst": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f03087245a6b64bb69cd5866a1887ae595a9e1a86e196754984840eaf6d3eb9c", + "dst": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "239bdba27dabd52f7450f7d8521c9a7e5ac74093ae3f6f2348bf40ac9a6db7a5", + "dst": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d60879e562b65f97d40bec7309d4490ba0a8c80e2349ecb2e3505aaa50ea1e47", + "dst": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "66e685901492c94942522c346759c711ee2e78a059ef274e77a6ab433409683c", + "dst": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b497992663f99f9902deaaf487b00655820003015ea92091628f4a6e8aeb5854", + "dst": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc40377012004566712fa860e74db97305091cc163e95435e04556c70d32f9c5", + "dst": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "73304622e33994bc2d4ade2cab78d28e1b65185e60ad3c781ecfb5cbc8159136", + "dst": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fed15e8506d0e0898510311850b8863ef6d9a499215ae8823a1e3fb9c8140ab2", + "dst": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "12034bc455d0821813d7eb9afed1ed1a8f19b6f29826ef4a057b4aa0b4228817", + "dst": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fc444cdb2598f44209a41ea20afdc9065ebe51b7cd5f65bb1c0f7a7b427ce7b1", + "dst": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "618d242d95d33e2d7316612a164d89859b85f1287f0d5bed4dcb561cf478f706", + "dst": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "07f70fd4108ef4d2fde3b85411728c1f7bd3a135d2062c5a30a46cc885463780", + "dst": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "af9bcf6ba63a08e699bc101aa362f135343aaf78a56e9f88d118fca0e1ce5c08", + "dst": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6b3530bb930ed10bbc4c307663aba4377c08443498a0a2cf023b1be72f378ae1", + "dst": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fd6da5199e528958e68ee8dd003b727d4d840754ea7c1e0c05e4f0e504c9b2cd", + "dst": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "131f07f5b40f365fb537b863e4aa5ef0efcd77b7fa2ff321d90eeb743ac43678", + "dst": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ffbdfdbf3427d04f445c33e867845bec1ee64a9dfe0d0fa8284547c2226fdfa9", + "dst": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b53c7188ebf4d630790ff63275679ba48009e31af6e4fe15806619216caa750", + "dst": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b4c6639b49402c2753f83c7fb7d3ffa65da74e47fef2b781933ff55b14d09bcd", + "dst": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c956289db079c00d2f80c590d3c8ca26c37da534fe5f65e799b3982ceca493c", + "dst": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "550d2a8d3047cdae0c05a61cc3de43e758b123a6955fa067d3ac375f7d0dbadc", + "dst": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78740d5bf49989936d315bf641949232aace582e03de57db8abff940f7d51bd1", + "dst": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9f2c83c5165826de1077f428ad39d41473e32ed64cd83180d49e7d8e5db996d0", + "dst": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "883be4d7173c235933294ab8dcae8cc76609166eaa1c1f07e9b51d551c979709", + "dst": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6384ed19650d384c29db4c3a39a1ca855058fab758075be2dee759dd9e6faae1", + "dst": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", + "dst": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c238e82f3a4beee1be7b5b464e8553404f6927d5ab93c3d649d362c01097782", + "dst": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dad4991bfa5c51eb176f28c1b3f86661e02579905e6e07c997df22004e06244a", + "dst": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4ba91512c168281f41d3934b927d0d86a3136a31cc345b635095928f8e5f013c", + "dst": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c416f5e604eeada9ae8e520a429d8f19d4230626769e7121007e01353730784f", + "dst": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7b8787fd4076c27d074d2a4761377a1aa26c843c432e3b7e6b0ebf1e29528188", + "dst": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "38f22b194f04d85a6b545b37df06195edeb8503798b229ddeaa946018150c05c", + "dst": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "246377a036ad5444bcd5f47ac9e55fec7c85fc40644df593038d360554a809f7", + "dst": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c6d5e543ff5f2c2526728d588fb21753db5b7e05b8b275aa5e9b24d29350afb0", + "dst": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "98e223e6e2240fef83082d3daa86e46f10e0c71f3f74489ba95db0951a166f53", + "dst": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c8971ca91f8e21c556f647940073db003f7dd5582ae55d4ebca602d5e8e91a6e", + "dst": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dfa7822c05f54116c9fc3b2cde1ecb4667f47a2d8771fe886e832c223cdc4e82", + "dst": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6d37c0c4b6fcbac1e53a46c9c2dc5d3c3b36312c53f25b2baacc785ea77a11f7", + "dst": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9ba5e31610f0545666f102465efa8caa48ad3fb5b8abd5ae802f4a71e3f7de3b", + "dst": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "3ca365aace71e24b04d6f2ffbf7171468c5e71783858c710cae539c5e43e0c0e", + "dst": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c858f2db2a20ac562d32f8fb2a3a11039849a6e44d2bec30befb2e173532a9a3", + "dst": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1550a76598693b950346397e0e825bbb2805edde38b0d0240e50050829b7b1dd", + "dst": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "466340ab7733abb23ab24d877c673fe089c273f11808fbbd6f33a91da92ee96c", + "dst": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "401d4c0c1060ebbb4b9fb3859c2eb47789f94086f4deb01234bf46f7cdc81247", + "dst": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2c0e3aa084f5fec45f99b3f125ce7d50c6da526ef5165df5f22ba603147c3fc2", + "dst": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2e724d83e35235c23c0bb16ae9b708a5bba3c23b186b05d4b8c606f6bb4b311", + "dst": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4f30eae8c49eb268fe364eaf5ee0788da6e2f6adc2f83cd82e96a4bfe98496f5", + "dst": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8753d5775c22477a8ef74eeebf61d7de30be702e70118f552cc18ad963ffe950", + "dst": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efa2007c561dcbf7c83a6bbdd2ef75e7cca76b05330a8b948ba0dd94dee949f7", + "dst": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b379d1b8ff0153c63ee69c40a7155b97fa42ab570f68ff847d457316c4d8ab9", + "dst": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cc84f93adce16699d9e84ef32f55333402431b58dc50c17084bcb8b33f382f88", + "dst": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f38f0760769c19075034f70b059abf4d1bfa6d01e1e8c369a99900ed1eaeca6d", + "dst": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8d55f76bb0b3dd222cf85a7193501c0f4071b446f56dbd1da355b1625993325a", + "dst": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efde499c7e4444bc602b7bf5ed50e95a18ce8ec9a06ba9d850a05bb7a25ecb3a", + "dst": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2a4d631d5dc90e397d85f13410d1a6d877dcaf592a0e2be2e727443ac74b5bd5", + "dst": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e936299a21240744f6edbab493449323f920bbe15dcf294463e5a2ace10f27b0", + "dst": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "44e17f4bd29411a1614457171c06183e364bf6ff80a201717b2dfc0748e9ebe3", + "dst": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1941e5cc5e38dd92427580af699b1f410be7b29ff17d3d0ff3d046bfba0aaabf", + "dst": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ff6c0f27fcf92f3b4a3871b801c3116847fe47a7e3bafcadd4855d06012091ad", + "dst": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cd6c4b785e60757fad0e6fd4874b729ea7703fe7ee9560e1283d2eb71fc75321", + "dst": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "745eaff456a390c3868742a039e72c2a93ff8eee10417dbe848d533b89facc04", + "dst": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2f3f050c9ef31bf5c3b14c1c71699c4f4b38aa18479531194d12e6277416516", + "dst": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0b95850edabed70762768ac1695c5d7f230cccaa8de06657cda42cafba36374f", + "dst": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7c767d3a06db1ac0e1809ebe29a7d9689143259f4651837de54423e287c20490", + "dst": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78b07e8fe1366e173f2eeb75c35cd53baf0f6100de50ae12b4ffe7d0d7ba4298", + "dst": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5010eb25f6e1ed725fb901ae1e945e545ae846d7be8a135333d2d41102c33328", + "dst": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "178a33e64826cd2039b8538b74e6de513966acab45ab79d77dc9392018a65ffb", + "dst": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "044dc539d063250dc654b2bf0986a9044b4eea05e1284c11a2b313acd8dc3498", + "dst": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9fd5ea38f383291566def44b6fb932414f97123952578fe0cfb9a30eb075a099", + "dst": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "be5930e9cc35801433bcd21db84da7d4f1d8e744feca16a2c6fb00c81ce93e51", + "dst": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8cd999cd193d315e5f1c6f74c230c12e6abe6847924f6e89d988e09ca413f52e", + "dst": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0cff53628eb0e984c134b68cbe4b1bb7721a05adaa32e93b9df489a9a7a176cf", + "dst": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "a5ef046e84be9ff2485dde49afe6073811286761afac3bbd588b6e4130930479", + "dst": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cdee5f84c4f08098ac740e3a260ced14c1e199e126aa5291ec079b281a7dc407", + "dst": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6a24135f8496e7a37dcf7164218bb3aa530319f3b2bf3c7a1a9cc1bd17831328", + "dst": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "693c7f970b34ce5882e62430f4c9c28957159a257d27d4e21a61fd95c6b97464", + "dst": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c008a613cef129c180dbcc7213f2d41a14d245d06a3844d63d9beac963145385", + "dst": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "439cdfd03972fb4bb5da54208cf8098ee78228c487ce9e84623f5f83e17a7d68", + "dst": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "hours": 1 + } + ] + } + ] + }, + "size": 3846 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-seq-100.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-seq-100.golden new file mode 100644 index 00000000..4bdbb31f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-seq-100.golden @@ -0,0 +1,37 @@ +{ + "header": { + "seq": 100, + "block_hash": "725e76907998485d367a847b0fb49f08536c592247762279fcdbd9907fee5607", + "previous_block_hash": "5c06896760ace71b02edab01700ff9ca8c32ef1d647e14c3e0d5fa751e47867e", + "timestamp": 1429274636, + "fee": 613712, + "version": 0, + "tx_body_hash": "9f20b52befed2cbaaa4a066de7119b7fdbff09a83d8e2a82628671f51f3f6551", + "ux_hash": "ff354e4774397b6c1ab46e56920c82f79e54ac8edce2f0fc4a2e6f472a5e5aca" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "9f20b52befed2cbaaa4a066de7119b7fdbff09a83d8e2a82628671f51f3f6551", + "inner_hash": "c2e60dbb6ad5095985d21391cbeb679fd0787c4a20471340d63f8de437d915df", + "sigs": [ + "2fefd2da9d3b4af87c4157f87da0b1bf82e3d6c9f6427572bd768cf85900d15d36971ffa17eb3b486f7692584102a7a58d9fb3ef57fa24d9a4ab02eba811ef4f00" + ], + "inputs": [ + "aee4af7e06c24bccc2f87b16d0708bfea68ac1b420f97914965f4a23ad9e11d6" + ], + "outputs": [ + { + "uxid": "194cc596d2beda803d8142ddc455872082f84b09a5edd8085082b60d314c1e29", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23000.000000", + "hours": 87673 + } + ] + } + ] + }, + "size": 183 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-seq-verbose-0.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-seq-verbose-0.golden new file mode 100644 index 00000000..7634ffe2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-seq-verbose-0.golden @@ -0,0 +1,34 @@ +{ + "header": { + "seq": 0, + "block_hash": "0551a1e5af999fe8fff529f6f2ab341e1e33db95135eef1b2be44fe6981349f3", + "previous_block_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": 1426562704, + "fee": 0, + "version": 0, + "tx_body_hash": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "ux_hash": "0000000000000000000000000000000000000000000000000000000000000000" + }, + "body": { + "txns": [ + { + "length": 0, + "type": 0, + "txid": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "fee": 0, + "sigs": [], + "inputs": [], + "outputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000 + } + ] + } + ] + }, + "size": 86 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-seq-verbose-1.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-seq-verbose-1.golden new file mode 100644 index 00000000..b9697e16 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-seq-verbose-1.golden @@ -0,0 +1,638 @@ +{ + "header": { + "seq": 1, + "block_hash": "baf3b622f043bbe3ef480416251a6545d07f173e5969dde2b63c4a12956d38fd", + "previous_block_hash": "0551a1e5af999fe8fff529f6f2ab341e1e33db95135eef1b2be44fe6981349f3", + "timestamp": 1427926392, + "fee": 99999999999900, + "version": 0, + "tx_body_hash": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "ux_hash": "ecc66d67289ecf8b5c5d2758a8f07ef08373a61a4d4e2736905ac2aaa427655f" + }, + "body": { + "txns": [ + { + "length": 3846, + "type": 0, + "txid": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "inner_hash": "0f7019627886818d2501af189bbac18e21b8e959891c5b2726f89e29355aa10a", + "fee": 99999999999900, + "sigs": [ + "be602113fe288f750001ab65f254ceedd8b05b1becc456a0a52a0bea10b8280e38d950933992ad3265e1f81d197036fa634b316f08b3b319ffce081aa43f3bb600" + ], + "inputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000, + "calculated_hours": 100000000000000 + } + ], + "outputs": [ + { + "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "26f585cb96f35307f0af5b9aee004a29b7795695f4c5c836104e2fbbf429a3ce", + "dst": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "18a43b8b69bbf12a9e49e6f9783ba258397e6567301aeed9e901a1e4fed9fef9", + "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5a69ef09b5de21b117cac62141a8de4eade7558c42f0ba8b50996f5ec7867c5d", + "dst": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "aef761a12e3d0fa9c4a8db62b8bab1015c32931b7e3a7fc9a77282cec218f79d", + "dst": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "445a4082da251fa161e4705d115fe2018ca15a5f92e8a0950793405410e6be12", + "dst": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "dst": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "368a609ee90ca15bbbd297af07dc6705131764476d54bef641017ffcd0885e65", + "dst": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "13afe1586015c4d7312f89d123153279e4961eb0d53a4d036847d5d989ba90dc", + "dst": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f625cf04412199c16e073dbb500e66c23cfe69043578b4a2d879a329aac563ec", + "dst": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b2da50a08756c34d059a04812451cf3296f73ba87f8cca38473ac8f051ab6d1e", + "dst": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "135c28698e80e3b2a737d59c16c79684c3fb3ec5cec59f466a39f4ac3c73968e", + "dst": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "df63056cf3ae21efa86d241876ad0194387317585dc9e4fcd80954b47d59b57a", + "dst": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4628f4cfdbf1eb7cccc25d461c46cc29e90cffb5d6277e0de641f7701d60c308", + "dst": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "47e4706dc4d80a70b20c889476fb0627ca6d5bdaa790f4ceba44a689d31b2dcc", + "dst": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b64bc50d370a06df117eb543ca051239c985cfc4b6aa527c51b700de32c7fc41", + "dst": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "390bc4c045fa9f289957b7eca529bfadac96a7dd074bcfbdd3b09e99413b8202", + "dst": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6aa162f7fc09598c4dc8f5fab7fb2383f28c3840937a001acd9f37136e1691b2", + "dst": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e440cf4c896735d3299a871f988c134f404fb2065d1f20c87c9c9bc5fa582e09", + "dst": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "eea791e84a53e4d99485519c5d2c3146b0a2ad080cf92904ae7b28c2d9a6e3ca", + "dst": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "01048ad6a538256d9a8c6c9c6321ca1a01b31cbf08e74fd4ff0f141bf97eb8ce", + "dst": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc5f1f1ddc8cb23df3d42f1e5a1dda9d356846fe930ae4484bc1eeb1b3b2c95b", + "dst": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f03087245a6b64bb69cd5866a1887ae595a9e1a86e196754984840eaf6d3eb9c", + "dst": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "239bdba27dabd52f7450f7d8521c9a7e5ac74093ae3f6f2348bf40ac9a6db7a5", + "dst": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d60879e562b65f97d40bec7309d4490ba0a8c80e2349ecb2e3505aaa50ea1e47", + "dst": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "66e685901492c94942522c346759c711ee2e78a059ef274e77a6ab433409683c", + "dst": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b497992663f99f9902deaaf487b00655820003015ea92091628f4a6e8aeb5854", + "dst": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc40377012004566712fa860e74db97305091cc163e95435e04556c70d32f9c5", + "dst": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "73304622e33994bc2d4ade2cab78d28e1b65185e60ad3c781ecfb5cbc8159136", + "dst": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fed15e8506d0e0898510311850b8863ef6d9a499215ae8823a1e3fb9c8140ab2", + "dst": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "12034bc455d0821813d7eb9afed1ed1a8f19b6f29826ef4a057b4aa0b4228817", + "dst": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fc444cdb2598f44209a41ea20afdc9065ebe51b7cd5f65bb1c0f7a7b427ce7b1", + "dst": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "618d242d95d33e2d7316612a164d89859b85f1287f0d5bed4dcb561cf478f706", + "dst": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "07f70fd4108ef4d2fde3b85411728c1f7bd3a135d2062c5a30a46cc885463780", + "dst": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "af9bcf6ba63a08e699bc101aa362f135343aaf78a56e9f88d118fca0e1ce5c08", + "dst": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6b3530bb930ed10bbc4c307663aba4377c08443498a0a2cf023b1be72f378ae1", + "dst": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fd6da5199e528958e68ee8dd003b727d4d840754ea7c1e0c05e4f0e504c9b2cd", + "dst": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "131f07f5b40f365fb537b863e4aa5ef0efcd77b7fa2ff321d90eeb743ac43678", + "dst": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ffbdfdbf3427d04f445c33e867845bec1ee64a9dfe0d0fa8284547c2226fdfa9", + "dst": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b53c7188ebf4d630790ff63275679ba48009e31af6e4fe15806619216caa750", + "dst": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b4c6639b49402c2753f83c7fb7d3ffa65da74e47fef2b781933ff55b14d09bcd", + "dst": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c956289db079c00d2f80c590d3c8ca26c37da534fe5f65e799b3982ceca493c", + "dst": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "550d2a8d3047cdae0c05a61cc3de43e758b123a6955fa067d3ac375f7d0dbadc", + "dst": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78740d5bf49989936d315bf641949232aace582e03de57db8abff940f7d51bd1", + "dst": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9f2c83c5165826de1077f428ad39d41473e32ed64cd83180d49e7d8e5db996d0", + "dst": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "883be4d7173c235933294ab8dcae8cc76609166eaa1c1f07e9b51d551c979709", + "dst": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6384ed19650d384c29db4c3a39a1ca855058fab758075be2dee759dd9e6faae1", + "dst": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", + "dst": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c238e82f3a4beee1be7b5b464e8553404f6927d5ab93c3d649d362c01097782", + "dst": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dad4991bfa5c51eb176f28c1b3f86661e02579905e6e07c997df22004e06244a", + "dst": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4ba91512c168281f41d3934b927d0d86a3136a31cc345b635095928f8e5f013c", + "dst": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c416f5e604eeada9ae8e520a429d8f19d4230626769e7121007e01353730784f", + "dst": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7b8787fd4076c27d074d2a4761377a1aa26c843c432e3b7e6b0ebf1e29528188", + "dst": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "38f22b194f04d85a6b545b37df06195edeb8503798b229ddeaa946018150c05c", + "dst": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "246377a036ad5444bcd5f47ac9e55fec7c85fc40644df593038d360554a809f7", + "dst": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c6d5e543ff5f2c2526728d588fb21753db5b7e05b8b275aa5e9b24d29350afb0", + "dst": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "98e223e6e2240fef83082d3daa86e46f10e0c71f3f74489ba95db0951a166f53", + "dst": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c8971ca91f8e21c556f647940073db003f7dd5582ae55d4ebca602d5e8e91a6e", + "dst": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dfa7822c05f54116c9fc3b2cde1ecb4667f47a2d8771fe886e832c223cdc4e82", + "dst": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6d37c0c4b6fcbac1e53a46c9c2dc5d3c3b36312c53f25b2baacc785ea77a11f7", + "dst": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9ba5e31610f0545666f102465efa8caa48ad3fb5b8abd5ae802f4a71e3f7de3b", + "dst": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "3ca365aace71e24b04d6f2ffbf7171468c5e71783858c710cae539c5e43e0c0e", + "dst": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c858f2db2a20ac562d32f8fb2a3a11039849a6e44d2bec30befb2e173532a9a3", + "dst": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1550a76598693b950346397e0e825bbb2805edde38b0d0240e50050829b7b1dd", + "dst": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "466340ab7733abb23ab24d877c673fe089c273f11808fbbd6f33a91da92ee96c", + "dst": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "401d4c0c1060ebbb4b9fb3859c2eb47789f94086f4deb01234bf46f7cdc81247", + "dst": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2c0e3aa084f5fec45f99b3f125ce7d50c6da526ef5165df5f22ba603147c3fc2", + "dst": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2e724d83e35235c23c0bb16ae9b708a5bba3c23b186b05d4b8c606f6bb4b311", + "dst": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4f30eae8c49eb268fe364eaf5ee0788da6e2f6adc2f83cd82e96a4bfe98496f5", + "dst": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8753d5775c22477a8ef74eeebf61d7de30be702e70118f552cc18ad963ffe950", + "dst": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efa2007c561dcbf7c83a6bbdd2ef75e7cca76b05330a8b948ba0dd94dee949f7", + "dst": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b379d1b8ff0153c63ee69c40a7155b97fa42ab570f68ff847d457316c4d8ab9", + "dst": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cc84f93adce16699d9e84ef32f55333402431b58dc50c17084bcb8b33f382f88", + "dst": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f38f0760769c19075034f70b059abf4d1bfa6d01e1e8c369a99900ed1eaeca6d", + "dst": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8d55f76bb0b3dd222cf85a7193501c0f4071b446f56dbd1da355b1625993325a", + "dst": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efde499c7e4444bc602b7bf5ed50e95a18ce8ec9a06ba9d850a05bb7a25ecb3a", + "dst": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2a4d631d5dc90e397d85f13410d1a6d877dcaf592a0e2be2e727443ac74b5bd5", + "dst": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e936299a21240744f6edbab493449323f920bbe15dcf294463e5a2ace10f27b0", + "dst": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "44e17f4bd29411a1614457171c06183e364bf6ff80a201717b2dfc0748e9ebe3", + "dst": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1941e5cc5e38dd92427580af699b1f410be7b29ff17d3d0ff3d046bfba0aaabf", + "dst": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ff6c0f27fcf92f3b4a3871b801c3116847fe47a7e3bafcadd4855d06012091ad", + "dst": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cd6c4b785e60757fad0e6fd4874b729ea7703fe7ee9560e1283d2eb71fc75321", + "dst": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "745eaff456a390c3868742a039e72c2a93ff8eee10417dbe848d533b89facc04", + "dst": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2f3f050c9ef31bf5c3b14c1c71699c4f4b38aa18479531194d12e6277416516", + "dst": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0b95850edabed70762768ac1695c5d7f230cccaa8de06657cda42cafba36374f", + "dst": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7c767d3a06db1ac0e1809ebe29a7d9689143259f4651837de54423e287c20490", + "dst": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78b07e8fe1366e173f2eeb75c35cd53baf0f6100de50ae12b4ffe7d0d7ba4298", + "dst": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5010eb25f6e1ed725fb901ae1e945e545ae846d7be8a135333d2d41102c33328", + "dst": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "178a33e64826cd2039b8538b74e6de513966acab45ab79d77dc9392018a65ffb", + "dst": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "044dc539d063250dc654b2bf0986a9044b4eea05e1284c11a2b313acd8dc3498", + "dst": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9fd5ea38f383291566def44b6fb932414f97123952578fe0cfb9a30eb075a099", + "dst": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "be5930e9cc35801433bcd21db84da7d4f1d8e744feca16a2c6fb00c81ce93e51", + "dst": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8cd999cd193d315e5f1c6f74c230c12e6abe6847924f6e89d988e09ca413f52e", + "dst": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0cff53628eb0e984c134b68cbe4b1bb7721a05adaa32e93b9df489a9a7a176cf", + "dst": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "a5ef046e84be9ff2485dde49afe6073811286761afac3bbd588b6e4130930479", + "dst": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cdee5f84c4f08098ac740e3a260ced14c1e199e126aa5291ec079b281a7dc407", + "dst": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6a24135f8496e7a37dcf7164218bb3aa530319f3b2bf3c7a1a9cc1bd17831328", + "dst": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "693c7f970b34ce5882e62430f4c9c28957159a257d27d4e21a61fd95c6b97464", + "dst": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c008a613cef129c180dbcc7213f2d41a14d245d06a3844d63d9beac963145385", + "dst": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "439cdfd03972fb4bb5da54208cf8098ee78228c487ce9e84623f5f83e17a7d68", + "dst": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "hours": 1 + } + ] + } + ] + }, + "size": 3846 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-seq-verbose-100.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-seq-verbose-100.golden new file mode 100644 index 00000000..8bf91b1b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/block-seq-verbose-100.golden @@ -0,0 +1,44 @@ +{ + "header": { + "seq": 100, + "block_hash": "725e76907998485d367a847b0fb49f08536c592247762279fcdbd9907fee5607", + "previous_block_hash": "5c06896760ace71b02edab01700ff9ca8c32ef1d647e14c3e0d5fa751e47867e", + "timestamp": 1429274636, + "fee": 613712, + "version": 0, + "tx_body_hash": "9f20b52befed2cbaaa4a066de7119b7fdbff09a83d8e2a82628671f51f3f6551", + "ux_hash": "ff354e4774397b6c1ab46e56920c82f79e54ac8edce2f0fc4a2e6f472a5e5aca" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "9f20b52befed2cbaaa4a066de7119b7fdbff09a83d8e2a82628671f51f3f6551", + "inner_hash": "c2e60dbb6ad5095985d21391cbeb679fd0787c4a20471340d63f8de437d915df", + "fee": 613712, + "sigs": [ + "2fefd2da9d3b4af87c4157f87da0b1bf82e3d6c9f6427572bd768cf85900d15d36971ffa17eb3b486f7692584102a7a58d9fb3ef57fa24d9a4ab02eba811ef4f00" + ], + "inputs": [ + { + "uxid": "aee4af7e06c24bccc2f87b16d0708bfea68ac1b420f97914965f4a23ad9e11d6", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23000.000000", + "hours": 294, + "calculated_hours": 701385 + } + ], + "outputs": [ + { + "uxid": "194cc596d2beda803d8142ddc455872082f84b09a5edd8085082b60d314c1e29", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23000.000000", + "hours": 87673 + } + ] + } + ] + }, + "size": 183 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blockchain-180-no-unconfirmed.db b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blockchain-180-no-unconfirmed.db new file mode 100644 index 00000000..f0908f2d Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blockchain-180-no-unconfirmed.db differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blockchain-180.db b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blockchain-180.db new file mode 100644 index 00000000..817ab5d6 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blockchain-180.db differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blockchain-metadata-no-unconfirmed.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blockchain-metadata-no-unconfirmed.golden new file mode 100644 index 00000000..251174a4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blockchain-metadata-no-unconfirmed.golden @@ -0,0 +1,14 @@ +{ + "head": { + "seq": 180, + "block_hash": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "previous_block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "timestamp": 1431574528, + "fee": 2265261, + "version": 0, + "tx_body_hash": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "ux_hash": "058d1d0a22be7b9f5567a236866836a87d922760581832cfb8bfbd8b337d64b1" + }, + "unspents": 218, + "unconfirmed": 0 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blockchain-metadata.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blockchain-metadata.golden new file mode 100644 index 00000000..96d25d84 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blockchain-metadata.golden @@ -0,0 +1,14 @@ +{ + "head": { + "seq": 180, + "block_hash": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "previous_block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "timestamp": 1431574528, + "fee": 2265261, + "version": 0, + "tx_body_hash": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "ux_hash": "058d1d0a22be7b9f5567a236866836a87d922760581832cfb8bfbd8b337d64b1" + }, + "unspents": 218, + "unconfirmed": 1 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blockchain-progress.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blockchain-progress.golden new file mode 100644 index 00000000..41f23bcd --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blockchain-progress.golden @@ -0,0 +1,5 @@ +{ + "current": 180, + "highest": 180, + "peers": [] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-3-5-7-verbose.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-3-5-7-verbose.golden new file mode 100644 index 00000000..e58b8875 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-3-5-7-verbose.golden @@ -0,0 +1,156 @@ +{ + "blocks": [ + { + "header": { + "seq": 3, + "block_hash": "35c3ebbe6feaeeab27ac77c1712051787bdd4bbfb5cdcdebc81f8aac98a2f3f3", + "previous_block_hash": "01723bc4dc90f1cb857a94fe5e3bb50c02e6689fd998f8147c9cae07fbfa63af", + "timestamp": 1427927671, + "fee": 0, + "version": 0, + "tx_body_hash": "a6a709e9388a4d67a47d262b11da5f804eddd9d67acc4a3e450f7a567bdc1619", + "ux_hash": "bd8c7dc7aadb8cd70e8ba97fb71b5ca77c9be157932930bc547a30bb095bc6c7" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "a6a709e9388a4d67a47d262b11da5f804eddd9d67acc4a3e450f7a567bdc1619", + "inner_hash": "ea6adee3180c7f9d73d1e693822d5d1c2bba85067f89a873355bc771a078faa1", + "fee": 0, + "sigs": [ + "ce8fd47e2044ed17998f92621e90329f673a746c802d67f639ca083705dd199f6ee346781497b44132434922879244d819694b5903093f784570c55d293ab4af01" + ], + "inputs": [ + { + "uxid": "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 5, + "block_hash": "114fe60587a158428a47e0f9571d764f495912c299aa4e67fc88004cf21b0c24", + "previous_block_hash": "415e47348a1e642cb2e31d00ee500747d3aed0336aabfff7d783ed21465251c7", + "timestamp": 1428798821, + "fee": 2036, + "version": 0, + "tx_body_hash": "0579e7727627cd9815a8a8b5e1df86124f45a4132cc0dbd00d2f110e4f409b69", + "ux_hash": "70439be07958c0dfa9932bfa108d7dad20a37db7ae6db4e06a3225443d4b5481" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "0579e7727627cd9815a8a8b5e1df86124f45a4132cc0dbd00d2f110e4f409b69", + "inner_hash": "fe123ca954a82bb1ce2cc9ef9c56d6b649a4cbaf5b17394b0ffda651ed32327e", + "fee": 2036, + "sigs": [ + "056ed0f74367fb1370d7e98689953983d9cf34eb6669854f1645c8a16c93d85075661e7d4f6df0ce5ca8eb9852eff6a12fbac2caafee03bb8c616f847c61416800", + "8aaa7f320a7b01169d3217a600100cb27c55e4ce56cd3455814f56d8e4e65be746e0e20e776087af6f19361f0b898edc2123a5f9bd35d24ef8b8669ca85b142601" + ], + "inputs": [ + { + "uxid": "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 2405 + }, + { + "uxid": "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999980.000000", + "hours": 3704, + "calculated_hours": 3704 + } + ], + "outputs": [ + { + "uxid": "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999890.000000", + "hours": 4073 + }, + { + "uxid": "dc63c680f408c4e646037966189383a5d50eda34e666c2a0c75c0c6bf13b71a1", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "100.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 7, + "block_hash": "6cb71b57c998a5367101e01d48c097eccd4f5abf311c89bcca8ee213581f355f", + "previous_block_hash": "103949030e90fcebc5d8ca1c9c59f30a31aa71911401d22a2422e4571b035701", + "timestamp": 1428807671, + "fee": 0, + "version": 0, + "tx_body_hash": "f832428481690fa918d6d29946e191f2c8c89b2388a906e0c53dceee6070a24b", + "ux_hash": "ee38fa1b02dd0d190187c9cd9aba2d7296e0aa7b6b983f61c1d1fe998c1433c7" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "f832428481690fa918d6d29946e191f2c8c89b2388a906e0c53dceee6070a24b", + "inner_hash": "f440c514779522a6387edda9b9d9835f00680fb314546efb7bc9762a17884156", + "fee": 0, + "sigs": [ + "8fe96f5502270e4efa962b2aef2b81795fe26a8f0c9a494e2ae9c7e624af455c49396270ae7a25b41d439fd56dea9d556a135129122de1b1274b1e2a5d75f2ea01" + ], + "inputs": [ + { + "uxid": "8ff8a647e4542fab01e078ac467b2c9f2e5f7de55d77ec2711f8abc718e2c91b", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "95.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "17090c40091d009d6a684043d3be2e9cb1dc60a664a9c2e388af1f3a7345724b", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "90.000000", + "hours": 0 + }, + { + "uxid": "f9e7a412cdff80e95ddbe1d76fcc73f967cb99d383b0659e1355c8e623f02b62", + "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-3-5-7.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-3-5-7.golden new file mode 100644 index 00000000..3f51e310 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-3-5-7.golden @@ -0,0 +1,129 @@ +{ + "blocks": [ + { + "header": { + "seq": 3, + "block_hash": "35c3ebbe6feaeeab27ac77c1712051787bdd4bbfb5cdcdebc81f8aac98a2f3f3", + "previous_block_hash": "01723bc4dc90f1cb857a94fe5e3bb50c02e6689fd998f8147c9cae07fbfa63af", + "timestamp": 1427927671, + "fee": 0, + "version": 0, + "tx_body_hash": "a6a709e9388a4d67a47d262b11da5f804eddd9d67acc4a3e450f7a567bdc1619", + "ux_hash": "bd8c7dc7aadb8cd70e8ba97fb71b5ca77c9be157932930bc547a30bb095bc6c7" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "a6a709e9388a4d67a47d262b11da5f804eddd9d67acc4a3e450f7a567bdc1619", + "inner_hash": "ea6adee3180c7f9d73d1e693822d5d1c2bba85067f89a873355bc771a078faa1", + "sigs": [ + "ce8fd47e2044ed17998f92621e90329f673a746c802d67f639ca083705dd199f6ee346781497b44132434922879244d819694b5903093f784570c55d293ab4af01" + ], + "inputs": [ + "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a" + ], + "outputs": [ + { + "uxid": "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 5, + "block_hash": "114fe60587a158428a47e0f9571d764f495912c299aa4e67fc88004cf21b0c24", + "previous_block_hash": "415e47348a1e642cb2e31d00ee500747d3aed0336aabfff7d783ed21465251c7", + "timestamp": 1428798821, + "fee": 2036, + "version": 0, + "tx_body_hash": "0579e7727627cd9815a8a8b5e1df86124f45a4132cc0dbd00d2f110e4f409b69", + "ux_hash": "70439be07958c0dfa9932bfa108d7dad20a37db7ae6db4e06a3225443d4b5481" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "0579e7727627cd9815a8a8b5e1df86124f45a4132cc0dbd00d2f110e4f409b69", + "inner_hash": "fe123ca954a82bb1ce2cc9ef9c56d6b649a4cbaf5b17394b0ffda651ed32327e", + "sigs": [ + "056ed0f74367fb1370d7e98689953983d9cf34eb6669854f1645c8a16c93d85075661e7d4f6df0ce5ca8eb9852eff6a12fbac2caafee03bb8c616f847c61416800", + "8aaa7f320a7b01169d3217a600100cb27c55e4ce56cd3455814f56d8e4e65be746e0e20e776087af6f19361f0b898edc2123a5f9bd35d24ef8b8669ca85b142601" + ], + "inputs": [ + "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70" + ], + "outputs": [ + { + "uxid": "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999890.000000", + "hours": 4073 + }, + { + "uxid": "dc63c680f408c4e646037966189383a5d50eda34e666c2a0c75c0c6bf13b71a1", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "100.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 7, + "block_hash": "6cb71b57c998a5367101e01d48c097eccd4f5abf311c89bcca8ee213581f355f", + "previous_block_hash": "103949030e90fcebc5d8ca1c9c59f30a31aa71911401d22a2422e4571b035701", + "timestamp": 1428807671, + "fee": 0, + "version": 0, + "tx_body_hash": "f832428481690fa918d6d29946e191f2c8c89b2388a906e0c53dceee6070a24b", + "ux_hash": "ee38fa1b02dd0d190187c9cd9aba2d7296e0aa7b6b983f61c1d1fe998c1433c7" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "f832428481690fa918d6d29946e191f2c8c89b2388a906e0c53dceee6070a24b", + "inner_hash": "f440c514779522a6387edda9b9d9835f00680fb314546efb7bc9762a17884156", + "sigs": [ + "8fe96f5502270e4efa962b2aef2b81795fe26a8f0c9a494e2ae9c7e624af455c49396270ae7a25b41d439fd56dea9d556a135129122de1b1274b1e2a5d75f2ea01" + ], + "inputs": [ + "8ff8a647e4542fab01e078ac467b2c9f2e5f7de55d77ec2711f8abc718e2c91b" + ], + "outputs": [ + { + "uxid": "17090c40091d009d6a684043d3be2e9cb1dc60a664a9c2e388af1f3a7345724b", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "90.000000", + "hours": 0 + }, + { + "uxid": "f9e7a412cdff80e95ddbe1d76fcc73f967cb99d383b0659e1355c8e623f02b62", + "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-all.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-all.golden new file mode 100644 index 00000000..eb45b072 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-all.golden @@ -0,0 +1,8327 @@ +{ + "blocks": [ + { + "header": { + "seq": 0, + "block_hash": "0551a1e5af999fe8fff529f6f2ab341e1e33db95135eef1b2be44fe6981349f3", + "previous_block_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": 1426562704, + "fee": 0, + "version": 0, + "tx_body_hash": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "ux_hash": "0000000000000000000000000000000000000000000000000000000000000000" + }, + "body": { + "txns": [ + { + "length": 0, + "type": 0, + "txid": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "sigs": [], + "inputs": [], + "outputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000 + } + ] + } + ] + }, + "size": 86 + }, + { + "header": { + "seq": 1, + "block_hash": "baf3b622f043bbe3ef480416251a6545d07f173e5969dde2b63c4a12956d38fd", + "previous_block_hash": "0551a1e5af999fe8fff529f6f2ab341e1e33db95135eef1b2be44fe6981349f3", + "timestamp": 1427926392, + "fee": 99999999999900, + "version": 0, + "tx_body_hash": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "ux_hash": "ecc66d67289ecf8b5c5d2758a8f07ef08373a61a4d4e2736905ac2aaa427655f" + }, + "body": { + "txns": [ + { + "length": 3846, + "type": 0, + "txid": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "inner_hash": "0f7019627886818d2501af189bbac18e21b8e959891c5b2726f89e29355aa10a", + "sigs": [ + "be602113fe288f750001ab65f254ceedd8b05b1becc456a0a52a0bea10b8280e38d950933992ad3265e1f81d197036fa634b316f08b3b319ffce081aa43f3bb600" + ], + "inputs": [ + "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0" + ], + "outputs": [ + { + "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "26f585cb96f35307f0af5b9aee004a29b7795695f4c5c836104e2fbbf429a3ce", + "dst": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "18a43b8b69bbf12a9e49e6f9783ba258397e6567301aeed9e901a1e4fed9fef9", + "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5a69ef09b5de21b117cac62141a8de4eade7558c42f0ba8b50996f5ec7867c5d", + "dst": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "aef761a12e3d0fa9c4a8db62b8bab1015c32931b7e3a7fc9a77282cec218f79d", + "dst": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "445a4082da251fa161e4705d115fe2018ca15a5f92e8a0950793405410e6be12", + "dst": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "dst": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "368a609ee90ca15bbbd297af07dc6705131764476d54bef641017ffcd0885e65", + "dst": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "13afe1586015c4d7312f89d123153279e4961eb0d53a4d036847d5d989ba90dc", + "dst": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f625cf04412199c16e073dbb500e66c23cfe69043578b4a2d879a329aac563ec", + "dst": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b2da50a08756c34d059a04812451cf3296f73ba87f8cca38473ac8f051ab6d1e", + "dst": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "135c28698e80e3b2a737d59c16c79684c3fb3ec5cec59f466a39f4ac3c73968e", + "dst": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "df63056cf3ae21efa86d241876ad0194387317585dc9e4fcd80954b47d59b57a", + "dst": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4628f4cfdbf1eb7cccc25d461c46cc29e90cffb5d6277e0de641f7701d60c308", + "dst": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "47e4706dc4d80a70b20c889476fb0627ca6d5bdaa790f4ceba44a689d31b2dcc", + "dst": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b64bc50d370a06df117eb543ca051239c985cfc4b6aa527c51b700de32c7fc41", + "dst": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "390bc4c045fa9f289957b7eca529bfadac96a7dd074bcfbdd3b09e99413b8202", + "dst": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6aa162f7fc09598c4dc8f5fab7fb2383f28c3840937a001acd9f37136e1691b2", + "dst": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e440cf4c896735d3299a871f988c134f404fb2065d1f20c87c9c9bc5fa582e09", + "dst": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "eea791e84a53e4d99485519c5d2c3146b0a2ad080cf92904ae7b28c2d9a6e3ca", + "dst": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "01048ad6a538256d9a8c6c9c6321ca1a01b31cbf08e74fd4ff0f141bf97eb8ce", + "dst": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc5f1f1ddc8cb23df3d42f1e5a1dda9d356846fe930ae4484bc1eeb1b3b2c95b", + "dst": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f03087245a6b64bb69cd5866a1887ae595a9e1a86e196754984840eaf6d3eb9c", + "dst": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "239bdba27dabd52f7450f7d8521c9a7e5ac74093ae3f6f2348bf40ac9a6db7a5", + "dst": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d60879e562b65f97d40bec7309d4490ba0a8c80e2349ecb2e3505aaa50ea1e47", + "dst": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "66e685901492c94942522c346759c711ee2e78a059ef274e77a6ab433409683c", + "dst": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b497992663f99f9902deaaf487b00655820003015ea92091628f4a6e8aeb5854", + "dst": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc40377012004566712fa860e74db97305091cc163e95435e04556c70d32f9c5", + "dst": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "73304622e33994bc2d4ade2cab78d28e1b65185e60ad3c781ecfb5cbc8159136", + "dst": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fed15e8506d0e0898510311850b8863ef6d9a499215ae8823a1e3fb9c8140ab2", + "dst": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "12034bc455d0821813d7eb9afed1ed1a8f19b6f29826ef4a057b4aa0b4228817", + "dst": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fc444cdb2598f44209a41ea20afdc9065ebe51b7cd5f65bb1c0f7a7b427ce7b1", + "dst": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "618d242d95d33e2d7316612a164d89859b85f1287f0d5bed4dcb561cf478f706", + "dst": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "07f70fd4108ef4d2fde3b85411728c1f7bd3a135d2062c5a30a46cc885463780", + "dst": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "af9bcf6ba63a08e699bc101aa362f135343aaf78a56e9f88d118fca0e1ce5c08", + "dst": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6b3530bb930ed10bbc4c307663aba4377c08443498a0a2cf023b1be72f378ae1", + "dst": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fd6da5199e528958e68ee8dd003b727d4d840754ea7c1e0c05e4f0e504c9b2cd", + "dst": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "131f07f5b40f365fb537b863e4aa5ef0efcd77b7fa2ff321d90eeb743ac43678", + "dst": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ffbdfdbf3427d04f445c33e867845bec1ee64a9dfe0d0fa8284547c2226fdfa9", + "dst": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b53c7188ebf4d630790ff63275679ba48009e31af6e4fe15806619216caa750", + "dst": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b4c6639b49402c2753f83c7fb7d3ffa65da74e47fef2b781933ff55b14d09bcd", + "dst": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c956289db079c00d2f80c590d3c8ca26c37da534fe5f65e799b3982ceca493c", + "dst": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "550d2a8d3047cdae0c05a61cc3de43e758b123a6955fa067d3ac375f7d0dbadc", + "dst": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78740d5bf49989936d315bf641949232aace582e03de57db8abff940f7d51bd1", + "dst": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9f2c83c5165826de1077f428ad39d41473e32ed64cd83180d49e7d8e5db996d0", + "dst": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "883be4d7173c235933294ab8dcae8cc76609166eaa1c1f07e9b51d551c979709", + "dst": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6384ed19650d384c29db4c3a39a1ca855058fab758075be2dee759dd9e6faae1", + "dst": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", + "dst": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c238e82f3a4beee1be7b5b464e8553404f6927d5ab93c3d649d362c01097782", + "dst": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dad4991bfa5c51eb176f28c1b3f86661e02579905e6e07c997df22004e06244a", + "dst": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4ba91512c168281f41d3934b927d0d86a3136a31cc345b635095928f8e5f013c", + "dst": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c416f5e604eeada9ae8e520a429d8f19d4230626769e7121007e01353730784f", + "dst": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7b8787fd4076c27d074d2a4761377a1aa26c843c432e3b7e6b0ebf1e29528188", + "dst": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "38f22b194f04d85a6b545b37df06195edeb8503798b229ddeaa946018150c05c", + "dst": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "246377a036ad5444bcd5f47ac9e55fec7c85fc40644df593038d360554a809f7", + "dst": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c6d5e543ff5f2c2526728d588fb21753db5b7e05b8b275aa5e9b24d29350afb0", + "dst": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "98e223e6e2240fef83082d3daa86e46f10e0c71f3f74489ba95db0951a166f53", + "dst": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c8971ca91f8e21c556f647940073db003f7dd5582ae55d4ebca602d5e8e91a6e", + "dst": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dfa7822c05f54116c9fc3b2cde1ecb4667f47a2d8771fe886e832c223cdc4e82", + "dst": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6d37c0c4b6fcbac1e53a46c9c2dc5d3c3b36312c53f25b2baacc785ea77a11f7", + "dst": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9ba5e31610f0545666f102465efa8caa48ad3fb5b8abd5ae802f4a71e3f7de3b", + "dst": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "3ca365aace71e24b04d6f2ffbf7171468c5e71783858c710cae539c5e43e0c0e", + "dst": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c858f2db2a20ac562d32f8fb2a3a11039849a6e44d2bec30befb2e173532a9a3", + "dst": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1550a76598693b950346397e0e825bbb2805edde38b0d0240e50050829b7b1dd", + "dst": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "466340ab7733abb23ab24d877c673fe089c273f11808fbbd6f33a91da92ee96c", + "dst": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "401d4c0c1060ebbb4b9fb3859c2eb47789f94086f4deb01234bf46f7cdc81247", + "dst": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2c0e3aa084f5fec45f99b3f125ce7d50c6da526ef5165df5f22ba603147c3fc2", + "dst": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2e724d83e35235c23c0bb16ae9b708a5bba3c23b186b05d4b8c606f6bb4b311", + "dst": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4f30eae8c49eb268fe364eaf5ee0788da6e2f6adc2f83cd82e96a4bfe98496f5", + "dst": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8753d5775c22477a8ef74eeebf61d7de30be702e70118f552cc18ad963ffe950", + "dst": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efa2007c561dcbf7c83a6bbdd2ef75e7cca76b05330a8b948ba0dd94dee949f7", + "dst": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b379d1b8ff0153c63ee69c40a7155b97fa42ab570f68ff847d457316c4d8ab9", + "dst": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cc84f93adce16699d9e84ef32f55333402431b58dc50c17084bcb8b33f382f88", + "dst": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f38f0760769c19075034f70b059abf4d1bfa6d01e1e8c369a99900ed1eaeca6d", + "dst": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8d55f76bb0b3dd222cf85a7193501c0f4071b446f56dbd1da355b1625993325a", + "dst": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efde499c7e4444bc602b7bf5ed50e95a18ce8ec9a06ba9d850a05bb7a25ecb3a", + "dst": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2a4d631d5dc90e397d85f13410d1a6d877dcaf592a0e2be2e727443ac74b5bd5", + "dst": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e936299a21240744f6edbab493449323f920bbe15dcf294463e5a2ace10f27b0", + "dst": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "44e17f4bd29411a1614457171c06183e364bf6ff80a201717b2dfc0748e9ebe3", + "dst": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1941e5cc5e38dd92427580af699b1f410be7b29ff17d3d0ff3d046bfba0aaabf", + "dst": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ff6c0f27fcf92f3b4a3871b801c3116847fe47a7e3bafcadd4855d06012091ad", + "dst": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cd6c4b785e60757fad0e6fd4874b729ea7703fe7ee9560e1283d2eb71fc75321", + "dst": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "745eaff456a390c3868742a039e72c2a93ff8eee10417dbe848d533b89facc04", + "dst": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2f3f050c9ef31bf5c3b14c1c71699c4f4b38aa18479531194d12e6277416516", + "dst": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0b95850edabed70762768ac1695c5d7f230cccaa8de06657cda42cafba36374f", + "dst": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7c767d3a06db1ac0e1809ebe29a7d9689143259f4651837de54423e287c20490", + "dst": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78b07e8fe1366e173f2eeb75c35cd53baf0f6100de50ae12b4ffe7d0d7ba4298", + "dst": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5010eb25f6e1ed725fb901ae1e945e545ae846d7be8a135333d2d41102c33328", + "dst": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "178a33e64826cd2039b8538b74e6de513966acab45ab79d77dc9392018a65ffb", + "dst": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "044dc539d063250dc654b2bf0986a9044b4eea05e1284c11a2b313acd8dc3498", + "dst": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9fd5ea38f383291566def44b6fb932414f97123952578fe0cfb9a30eb075a099", + "dst": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "be5930e9cc35801433bcd21db84da7d4f1d8e744feca16a2c6fb00c81ce93e51", + "dst": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8cd999cd193d315e5f1c6f74c230c12e6abe6847924f6e89d988e09ca413f52e", + "dst": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0cff53628eb0e984c134b68cbe4b1bb7721a05adaa32e93b9df489a9a7a176cf", + "dst": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "a5ef046e84be9ff2485dde49afe6073811286761afac3bbd588b6e4130930479", + "dst": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cdee5f84c4f08098ac740e3a260ced14c1e199e126aa5291ec079b281a7dc407", + "dst": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6a24135f8496e7a37dcf7164218bb3aa530319f3b2bf3c7a1a9cc1bd17831328", + "dst": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "693c7f970b34ce5882e62430f4c9c28957159a257d27d4e21a61fd95c6b97464", + "dst": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c008a613cef129c180dbcc7213f2d41a14d245d06a3844d63d9beac963145385", + "dst": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "439cdfd03972fb4bb5da54208cf8098ee78228c487ce9e84623f5f83e17a7d68", + "dst": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "hours": 1 + } + ] + } + ] + }, + "size": 3846 + }, + { + "header": { + "seq": 2, + "block_hash": "01723bc4dc90f1cb857a94fe5e3bb50c02e6689fd998f8147c9cae07fbfa63af", + "previous_block_hash": "baf3b622f043bbe3ef480416251a6545d07f173e5969dde2b63c4a12956d38fd", + "timestamp": 1427927651, + "fee": 0, + "version": 0, + "tx_body_hash": "312a269b8248e389c61571cc13f4ad13b7d53b64853d990ddc301a58e7071889", + "ux_hash": "163a4a92e3ea23475a854215a8813b327f724e374df4b50ac414b94ec57b3c3e" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "312a269b8248e389c61571cc13f4ad13b7d53b64853d990ddc301a58e7071889", + "inner_hash": "4daff2831f5bc2877a98a49b0ef75f8ff01bcb35082fd4018c77707dfca31849", + "sigs": [ + "f4482e0781e0d94c8c4773940e1f811405681844a9dc3c1938243442e1cbd5463d5e251880abbf8ff1ed85b4b2659e83ee30f06cc4c5dc9913aa6a9630fbe3de01" + ], + "inputs": [ + "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76" + ], + "outputs": [ + { + "uxid": "0cd548e03bd13bca8647cd13f6baef0c65fd03081aeb6dc3695536e5bc6018ae", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999990.000000", + "hours": 1 + }, + { + "uxid": "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 3, + "block_hash": "35c3ebbe6feaeeab27ac77c1712051787bdd4bbfb5cdcdebc81f8aac98a2f3f3", + "previous_block_hash": "01723bc4dc90f1cb857a94fe5e3bb50c02e6689fd998f8147c9cae07fbfa63af", + "timestamp": 1427927671, + "fee": 0, + "version": 0, + "tx_body_hash": "a6a709e9388a4d67a47d262b11da5f804eddd9d67acc4a3e450f7a567bdc1619", + "ux_hash": "bd8c7dc7aadb8cd70e8ba97fb71b5ca77c9be157932930bc547a30bb095bc6c7" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "a6a709e9388a4d67a47d262b11da5f804eddd9d67acc4a3e450f7a567bdc1619", + "inner_hash": "ea6adee3180c7f9d73d1e693822d5d1c2bba85067f89a873355bc771a078faa1", + "sigs": [ + "ce8fd47e2044ed17998f92621e90329f673a746c802d67f639ca083705dd199f6ee346781497b44132434922879244d819694b5903093f784570c55d293ab4af01" + ], + "inputs": [ + "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a" + ], + "outputs": [ + { + "uxid": "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 4, + "block_hash": "415e47348a1e642cb2e31d00ee500747d3aed0336aabfff7d783ed21465251c7", + "previous_block_hash": "35c3ebbe6feaeeab27ac77c1712051787bdd4bbfb5cdcdebc81f8aac98a2f3f3", + "timestamp": 1428793611, + "fee": 1852, + "version": 0, + "tx_body_hash": "c24b92898381fbebe59a457924184f4cce1e7166e140ca75aea5baf854c1ab75", + "ux_hash": "58519fbe20c1ca9db0fb922f5b32808f1d9aed249c266f2d4a14ca2597d80817" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "c24b92898381fbebe59a457924184f4cce1e7166e140ca75aea5baf854c1ab75", + "inner_hash": "43dd65d5644ec5214a901ac94e530cbedb83d2174cf402c7b24697cfe55e1de7", + "sigs": [ + "434a7a0b624fda393c1caa57ac9787f69da3d8854d0ec6f69f0da1c96c9b683d787064b644e9ac3dd4dd8466c22c1547cff89c2552420f5efcfd1eacb1a2eac301" + ], + "inputs": [ + "0cd548e03bd13bca8647cd13f6baef0c65fd03081aeb6dc3695536e5bc6018ae" + ], + "outputs": [ + { + "uxid": "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999980.000000", + "hours": 3704 + }, + { + "uxid": "98b3e6e6d4ed36159b7dbf5f305174fc0c255d2d97528b35a67d50b9968e2b2f", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 5, + "block_hash": "114fe60587a158428a47e0f9571d764f495912c299aa4e67fc88004cf21b0c24", + "previous_block_hash": "415e47348a1e642cb2e31d00ee500747d3aed0336aabfff7d783ed21465251c7", + "timestamp": 1428798821, + "fee": 2036, + "version": 0, + "tx_body_hash": "0579e7727627cd9815a8a8b5e1df86124f45a4132cc0dbd00d2f110e4f409b69", + "ux_hash": "70439be07958c0dfa9932bfa108d7dad20a37db7ae6db4e06a3225443d4b5481" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "0579e7727627cd9815a8a8b5e1df86124f45a4132cc0dbd00d2f110e4f409b69", + "inner_hash": "fe123ca954a82bb1ce2cc9ef9c56d6b649a4cbaf5b17394b0ffda651ed32327e", + "sigs": [ + "056ed0f74367fb1370d7e98689953983d9cf34eb6669854f1645c8a16c93d85075661e7d4f6df0ce5ca8eb9852eff6a12fbac2caafee03bb8c616f847c61416800", + "8aaa7f320a7b01169d3217a600100cb27c55e4ce56cd3455814f56d8e4e65be746e0e20e776087af6f19361f0b898edc2123a5f9bd35d24ef8b8669ca85b142601" + ], + "inputs": [ + "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70" + ], + "outputs": [ + { + "uxid": "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999890.000000", + "hours": 4073 + }, + { + "uxid": "dc63c680f408c4e646037966189383a5d50eda34e666c2a0c75c0c6bf13b71a1", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "100.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 6, + "block_hash": "103949030e90fcebc5d8ca1c9c59f30a31aa71911401d22a2422e4571b035701", + "previous_block_hash": "114fe60587a158428a47e0f9571d764f495912c299aa4e67fc88004cf21b0c24", + "timestamp": 1428806251, + "fee": 0, + "version": 0, + "tx_body_hash": "03b3ab821cdaf0ab8cc1a9e2dd30108772ec3bda09e9d3a8c48df9f30d213b38", + "ux_hash": "dad0a423ff7b1c5c6021698c5c75da34df37b9fc0a5b0c60bcbb50e8665c0610" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "03b3ab821cdaf0ab8cc1a9e2dd30108772ec3bda09e9d3a8c48df9f30d213b38", + "inner_hash": "e49bf8f45cb6664d36ec632e37bd91566d8bd4ea9ce209a0a955323a94dd744f", + "sigs": [ + "0a0d9a3fa0597667fb991bbe047ff93c591313faf759fcec2f47138bc0666b333b7689ad527ddb8ef135897be41016f755eb14e46cd327fc5eb196bce80c3cd400" + ], + "inputs": [ + "dc63c680f408c4e646037966189383a5d50eda34e666c2a0c75c0c6bf13b71a1" + ], + "outputs": [ + { + "uxid": "8ff8a647e4542fab01e078ac467b2c9f2e5f7de55d77ec2711f8abc718e2c91b", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "95.000000", + "hours": 0 + }, + { + "uxid": "778048daec0c83f89525a6d69b60c407d090bb1666711b1c560e6ebee8dcc452", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 7, + "block_hash": "6cb71b57c998a5367101e01d48c097eccd4f5abf311c89bcca8ee213581f355f", + "previous_block_hash": "103949030e90fcebc5d8ca1c9c59f30a31aa71911401d22a2422e4571b035701", + "timestamp": 1428807671, + "fee": 0, + "version": 0, + "tx_body_hash": "f832428481690fa918d6d29946e191f2c8c89b2388a906e0c53dceee6070a24b", + "ux_hash": "ee38fa1b02dd0d190187c9cd9aba2d7296e0aa7b6b983f61c1d1fe998c1433c7" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "f832428481690fa918d6d29946e191f2c8c89b2388a906e0c53dceee6070a24b", + "inner_hash": "f440c514779522a6387edda9b9d9835f00680fb314546efb7bc9762a17884156", + "sigs": [ + "8fe96f5502270e4efa962b2aef2b81795fe26a8f0c9a494e2ae9c7e624af455c49396270ae7a25b41d439fd56dea9d556a135129122de1b1274b1e2a5d75f2ea01" + ], + "inputs": [ + "8ff8a647e4542fab01e078ac467b2c9f2e5f7de55d77ec2711f8abc718e2c91b" + ], + "outputs": [ + { + "uxid": "17090c40091d009d6a684043d3be2e9cb1dc60a664a9c2e388af1f3a7345724b", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "90.000000", + "hours": 0 + }, + { + "uxid": "f9e7a412cdff80e95ddbe1d76fcc73f967cb99d383b0659e1355c8e623f02b62", + "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 8, + "block_hash": "34ec53ac5b15e8c0c60312f67e209318c3b09c5ecbaabf0843a161f889614584", + "previous_block_hash": "6cb71b57c998a5367101e01d48c097eccd4f5abf311c89bcca8ee213581f355f", + "timestamp": 1428807691, + "fee": 0, + "version": 0, + "tx_body_hash": "7229422f3a0afb5f3a9596ed50146440c17a3d54abda0f3c70cd9dc58de96374", + "ux_hash": "34174a65e1b34d0d7dd0e219f7969e303d4117024b14f8fa5ecc58c29c4c417c" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "7229422f3a0afb5f3a9596ed50146440c17a3d54abda0f3c70cd9dc58de96374", + "inner_hash": "68fb8cd96b0d2a94838183ab24f36f71006383add373837d448a7584ef69bc6c", + "sigs": [ + "b859da7c65d6525247973fc62d274343feb3fe6fd76ab392dc30d7cdc609a7e45018b425fbdc3e79647e43b99d25bfab6c23d60495e5e0ce3cf06b6ce2c4897d00" + ], + "inputs": [ + "17090c40091d009d6a684043d3be2e9cb1dc60a664a9c2e388af1f3a7345724b" + ], + "outputs": [ + { + "uxid": "999cc56deae71486a28e19d1ed8d585c2cf07d5ee27d1c33bea186d23aaca06a", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "85.000000", + "hours": 0 + }, + { + "uxid": "1f810bdd1c65ad50f27f2c47a000150877fdba2fdb78b9d8cae39946be6a9e33", + "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 9, + "block_hash": "d33c2466840a09e10efe3736f3aaad05b6b8d05cedcdd0099f84fd1ec6f55282", + "previous_block_hash": "34ec53ac5b15e8c0c60312f67e209318c3b09c5ecbaabf0843a161f889614584", + "timestamp": 1428807711, + "fee": 0, + "version": 0, + "tx_body_hash": "9d87d7bb9e56a3588bacb478c7556280b28c0a49f6e09db8b54a84c20d865f2f", + "ux_hash": "4f560eea54f060c029cedc78480a59f6ca549d4fd6cb84fb0388001dcd11b5b7" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "9d87d7bb9e56a3588bacb478c7556280b28c0a49f6e09db8b54a84c20d865f2f", + "inner_hash": "f60dd876ff32adc5e20759f45c04075f46796b0ca2b76a490d5d1e2d5b18424a", + "sigs": [ + "be2ea2bcb4be07705cd034579d77c2fe0f9c7bb29dad0e690f38f8a2e098041c396820004975298d9d3647dfec7cbb610452e294381b898f28d48f166aaea5a500" + ], + "inputs": [ + "999cc56deae71486a28e19d1ed8d585c2cf07d5ee27d1c33bea186d23aaca06a" + ], + "outputs": [ + { + "uxid": "2f87d77c2a7d00b547db1af50e0ba04bafc5b05711e4939e9ec2640a21127dc0", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "80.000000", + "hours": 0 + }, + { + "uxid": "9e8997e53d2e61955da71dbbc6ba5b0da799eaace0f45870a4e42276a6fdaefa", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 10, + "block_hash": "5c5e6b0f6620a3af54a3259222a5269e60db768d7f805edce3f3e29f2597a487", + "previous_block_hash": "d33c2466840a09e10efe3736f3aaad05b6b8d05cedcdd0099f84fd1ec6f55282", + "timestamp": 1428807771, + "fee": 0, + "version": 0, + "tx_body_hash": "98db7eb30e13853d3dd93d5d8b4061596d5d288b6f8b92c4d43c46c6599f67fb", + "ux_hash": "dc4b68b8067932c191922c68504bc443c46144ef904c12b50008b3d77ae91aeb" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "98db7eb30e13853d3dd93d5d8b4061596d5d288b6f8b92c4d43c46c6599f67fb", + "inner_hash": "affafab93dc807a9306d1f3c6a19066aca57f284825420fb01e48200349f7ba2", + "sigs": [ + "71008403c675d9b3fdf8c09cc6caa64c681b78ba588fe20abb568e318d2e40b55c44ea614efc475c408e1e6e15cc0df753e6d3f04cb521078e6c928d5aa64c3200" + ], + "inputs": [ + "2f87d77c2a7d00b547db1af50e0ba04bafc5b05711e4939e9ec2640a21127dc0" + ], + "outputs": [ + { + "uxid": "0c5d1b6a61c32f9bcc62d3583ac957b3374f0daf1a14fd08679bff2554449840", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "75.000000", + "hours": 0 + }, + { + "uxid": "ec2c2238793d71240502de3e7c46ec1d5bf938c76541185f1c3fdf0d99a90795", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 11, + "block_hash": "70584db7fb8ab88b8dbcfed72ddc42a1aeb8c4882266dbb78439ba3efcd0458d", + "previous_block_hash": "5c5e6b0f6620a3af54a3259222a5269e60db768d7f805edce3f3e29f2597a487", + "timestamp": 1428808851, + "fee": 0, + "version": 0, + "tx_body_hash": "4a87de6869c974099e3f5522404fbc7b23f90a8f8dec958bf725317454036cdc", + "ux_hash": "47d440eb55e32969f35f46450636ca919195977ab8bb5fa3d1e9f0f4b48d7fa1" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "4a87de6869c974099e3f5522404fbc7b23f90a8f8dec958bf725317454036cdc", + "inner_hash": "53ecc82b426d4b806eb1c743e892edbc7eb7051c88f3fa8afc74a6a5b80cc57a", + "sigs": [ + "dbbb5acf0130c39a6b2fd760dda1df5aaefd94d8a0904e6faf959feade87d17a5c754459b635e0048e1019dadb9815a54d8bca4cf234f6876b19b5a0df5e494a00" + ], + "inputs": [ + "ec2c2238793d71240502de3e7c46ec1d5bf938c76541185f1c3fdf0d99a90795" + ], + "outputs": [ + { + "uxid": "9c7d3674d7a6b28a559a052e6d354ec13d2e0396739973c9f0dce08f8c7d157c", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "4.000000", + "hours": 0 + }, + { + "uxid": "3f8c01eefca28ec6d89d34b899fecb5c97f9348b412c61e7c863310b8a85b953", + "dst": "2M2VC93aQv5asdcNKt7pzJdkxeL6xLw9JPp", + "coins": "1.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 12, + "block_hash": "f8da14563b2fe7d532125e5c29be7f544d31d900e4703400cbcbf303f8703a04", + "previous_block_hash": "70584db7fb8ab88b8dbcfed72ddc42a1aeb8c4882266dbb78439ba3efcd0458d", + "timestamp": 1428814821, + "fee": 0, + "version": 0, + "tx_body_hash": "9ea7b912cbfca157ef5fe9c59dd2407302d1b4d95414829d93c45bde6c2d42c8", + "ux_hash": "33777b4a681c64d95213939b1488991d9b055b243fa30e49842d0177224b4d98" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "9ea7b912cbfca157ef5fe9c59dd2407302d1b4d95414829d93c45bde6c2d42c8", + "inner_hash": "8a294b39558a38da2c996a7ce12eb6e045b44ce3b3a153bcfdc664a246b1a46d", + "sigs": [ + "81d65e0a176c322059776922be59a385f3d5f430502e51b94dba78662a42161805bea61e646fdd9cad314fcfea00d6f790f758c4e3c8b22ec3bfcf73c79033c100" + ], + "inputs": [ + "3f8c01eefca28ec6d89d34b899fecb5c97f9348b412c61e7c863310b8a85b953" + ], + "outputs": [ + { + "uxid": "34de4a6d093e880f813b4dc466b51f6814923e157ffbba0e9abbc4bfbd938de8", + "dst": "2AsyTLyWNR3FGhaMbLckaJyAZN46mrqFfXA", + "coins": "1.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 13, + "block_hash": "3351bc6352bf9272c62d72869659d0013786485ef076e8727e03f561f819a06c", + "previous_block_hash": "f8da14563b2fe7d532125e5c29be7f544d31d900e4703400cbcbf303f8703a04", + "timestamp": 1428814891, + "fee": 2, + "version": 0, + "tx_body_hash": "fa33df7c4316cea05095e6c7ce86f361847893d26fe2255af118593a33686c52", + "ux_hash": "000f0d2c246891541cbab3efd2cfad6a1b241c1c716c2e942819eaa59a44370b" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "fa33df7c4316cea05095e6c7ce86f361847893d26fe2255af118593a33686c52", + "inner_hash": "2e88fb3c0f9eaa317794e966e4275cfe62949eed43fa2987729b877178fb9951", + "sigs": [ + "25df6c1b4ae2c0cfac2f3ac608b108e5a83ef07c19a125dd098729734bdd6a1f65ca8a3f34878b07f6cd3e7d3e21ab432b1dec68f273dbb52a0ff90b253b6f9201" + ], + "inputs": [ + "9c7d3674d7a6b28a559a052e6d354ec13d2e0396739973c9f0dce08f8c7d157c" + ], + "outputs": [ + { + "uxid": "04c0cd4cbee1e5414791d9e0b9ae4f889bc52d253b5f70b09fbc32c88fb415ae", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "3.000000", + "hours": 4 + }, + { + "uxid": "f3034ffe54e869315f8e11801d3e755352fb75b878b24313302273c1b7ea62cb", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 14, + "block_hash": "89ab3029eaf4fb979e29dfba29b41ed1b8734f2991098879ac239b2ee4d61c04", + "previous_block_hash": "3351bc6352bf9272c62d72869659d0013786485ef076e8727e03f561f819a06c", + "timestamp": 1428815131, + "fee": 0, + "version": 0, + "tx_body_hash": "b68d78c9a4610b540933eaa550fbb1c473f5cf749eb522882f8154d495453e7d", + "ux_hash": "634b6bb24e8d1c21ea35c83322a18546b3d69b754865c8c8381f3c00ceeaf648" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "b68d78c9a4610b540933eaa550fbb1c473f5cf749eb522882f8154d495453e7d", + "inner_hash": "aeb75b736b0467e49884795158dfc6ea5c6cfe2b4f696d9d5b29c1fcac503834", + "sigs": [ + "dc926994a9bdd69aca5887edab30fbcbe9fc008328424ca0a38a258bd8c78b543af0e8aaa4195ef9e7c4fb7009f1dbdbb322894be8a319f4dff3809a3592a81400" + ], + "inputs": [ + "34de4a6d093e880f813b4dc466b51f6814923e157ffbba0e9abbc4bfbd938de8" + ], + "outputs": [ + { + "uxid": "3538af0016ec0f4d0e943c5d49daf280b416701fde4040fa72710c0ca1b5b559", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 15, + "block_hash": "3b452626e9d6ee1e10e8619fcfd546623ff42bea2053f3b413b719c501edd195", + "previous_block_hash": "89ab3029eaf4fb979e29dfba29b41ed1b8734f2991098879ac239b2ee4d61c04", + "timestamp": 1428820169, + "fee": 51, + "version": 0, + "tx_body_hash": "70dd5840d7260cf584457c76d3226312f4d033c023caf8c0ab3a65f9b831e9e0", + "ux_hash": "162569c321e9d7b1740490a856caec4556df25b5219ddbce1a3c6105158c53d4" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "70dd5840d7260cf584457c76d3226312f4d033c023caf8c0ab3a65f9b831e9e0", + "inner_hash": "4357c427cbc4b55139089389858dd8245464f674d4fff82e5daba9e18384a0b3", + "sigs": [ + "964c4b0c6cde6625863adebd74910851a440a636823dab9d0cf0fbc4581e3dcb486be22ba19d0c6d6eb17db22d1b1389589ec4b6cff8e8a9b231c66fe40c565500" + ], + "inputs": [ + "0c5d1b6a61c32f9bcc62d3583ac957b3374f0daf1a14fd08679bff2554449840" + ], + "outputs": [ + { + "uxid": "acd35cec566de86b4ed464b6cf3c3ec561140c070134d1e03094775454da2159", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "70.000000", + "hours": 102 + }, + { + "uxid": "4a06f4b59bc5626e6a92704b4e4441096e909b884eab84505699a3136abb69b3", + "dst": "PRXLNyB64cqaiG4pCoFZZ8Tuv7LWYPpa7m", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 16, + "block_hash": "4281345d031e0698c18e51f97aa78bbf05672b024209a296acb82ef62c15cf26", + "previous_block_hash": "3b452626e9d6ee1e10e8619fcfd546623ff42bea2053f3b413b719c501edd195", + "timestamp": 1428820629, + "fee": 0, + "version": 0, + "tx_body_hash": "e96e157b685c28847d6758e2ba326ad59cf2661c926fb08000d4b40d78a9eee3", + "ux_hash": "9be6e3e08898bb1dd9e22e3e46a69abd580bbeec7a27daa891ba795afe3cfdb7" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "e96e157b685c28847d6758e2ba326ad59cf2661c926fb08000d4b40d78a9eee3", + "inner_hash": "3153d35c8b133bc76ea6bef8799c9fbfd36a3cd3e8e42e170ab131eb309acea8", + "sigs": [ + "11813ce8ce2db73c23a8167696621443e0d80ec878d964d5164da33f259f55d17e5f1fc2292709542015c7bd86874ed855c0c80406a53a35759722d014a8c31300" + ], + "inputs": [ + "4a06f4b59bc5626e6a92704b4e4441096e909b884eab84505699a3136abb69b3" + ], + "outputs": [ + { + "uxid": "e72d8ba4ce2d3b37aeb71df2e3bed80ee07204b3fa633f56cbce7bca836bd39c", + "dst": "PRXLNyB64cqaiG4pCoFZZ8Tuv7LWYPpa7m", + "coins": "3.000000", + "hours": 0 + }, + { + "uxid": "0b720d05d44354ff0c6c75d55f1cd4e5945bc2ca80f2ba840545205362202925", + "dst": "ZWhZtjwXMS46cpDxfRwQyxxKPhqwsQu8oN", + "coins": "2.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 17, + "block_hash": "eba02044b893c04609b8a6486a5cbc58bf98dbe8bb970ff9bc23c8cde95576da", + "previous_block_hash": "4281345d031e0698c18e51f97aa78bbf05672b024209a296acb82ef62c15cf26", + "timestamp": 1428989855, + "fee": 2020394, + "version": 0, + "tx_body_hash": "d952ef4cc45a89c14230ba0f7e30b782fad83cb6506ac0f503a242c568c1287a", + "ux_hash": "8a65d3fbb5226c9f26466ceecfb8343a5182d46d9088d0d73ac94eebce208a46" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "d952ef4cc45a89c14230ba0f7e30b782fad83cb6506ac0f503a242c568c1287a", + "inner_hash": "8fc48920982066fd4c69e2d2c0c5239cca7c296f0e3ad30e9b976c1230967478", + "sigs": [ + "b7eb93bcebb6df3dcad48afd66dd60bd42b1fbcdf52aa5e0c7e455e791f64a976fa416534b4e08bf3e62a2df83e13754119634c4255dd1e2e08be447d4d5b47201" + ], + "inputs": [ + "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e" + ], + "outputs": [ + { + "uxid": "4168b9378363cd81939e667cf78055d35a60d3101f5f9e3d2ae709e3981e29fc", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 4040790 + }, + { + "uxid": "c603e99ceae4d15c20360714ee07ba6e3a944a97ea9285d164c23252e93958b6", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 18, + "block_hash": "b2b1eb77b4bd3876b2cb33e97e436f2e66a9bc60e7221b6f2bfec19c0ca0fa63", + "previous_block_hash": "eba02044b893c04609b8a6486a5cbc58bf98dbe8bb970ff9bc23c8cde95576da", + "timestamp": 1428989925, + "fee": 0, + "version": 0, + "tx_body_hash": "686db0a8cd429970bb91163033703410d4750c86ba485709fe1a3faabbbb42f6", + "ux_hash": "178eb5802c1c8a49b0886009dde215b34ca386cd3794500d0e5695e0ddc5a139" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "686db0a8cd429970bb91163033703410d4750c86ba485709fe1a3faabbbb42f6", + "inner_hash": "76732ac6a9936242193011d78a0f2849529aee767a569c9c6bb25b3bbae15cee", + "sigs": [ + "d74dcfdc8401a29b1dccc728b40b6b79faea147c65b4a859063ad77cc63aa9a62417c63b91b94678b6656fdba2f242d836b6914e77d244fbd16aaab014ddb44300" + ], + "inputs": [ + "c603e99ceae4d15c20360714ee07ba6e3a944a97ea9285d164c23252e93958b6" + ], + "outputs": [ + { + "uxid": "d9dae1f82177f979b07016a341ed5c281ed6ed8eaa785a8a107ec16efbe541ef", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 19, + "block_hash": "68d19da9e71cbe45ac65906d399e3be68591b26d05a4dff39e696ecec36f81f0", + "previous_block_hash": "b2b1eb77b4bd3876b2cb33e97e436f2e66a9bc60e7221b6f2bfec19c0ca0fa63", + "timestamp": 1428990115, + "fee": 1134, + "version": 0, + "tx_body_hash": "c6eccf17b4b952f19548b1924126c9dc409b45f9e6fcc0954a3494e7399f5fd4", + "ux_hash": "e4e2573c61942302d19d29f41de3894da2998a8dcd70379b053c0fb06929c8ae" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "c6eccf17b4b952f19548b1924126c9dc409b45f9e6fcc0954a3494e7399f5fd4", + "inner_hash": "736a1b4f415c1b0968470fac4d123ec52943b9d2ea7d2ce376307b2477a29acd", + "sigs": [ + "3660a24958b1b20beabb7f77d2ee1ddd91f1e40e8393b48d5ed4722d97bd1430150c5ea0f8ea1a2688a0d9f336c9c1f78a214150cc1ca3d895a694edde65ac0700" + ], + "inputs": [ + "acd35cec566de86b4ed464b6cf3c3ec561140c070134d1e03094775454da2159" + ], + "outputs": [ + { + "uxid": "af7deecc9b45c4696ad50246c8aa06b17aa8280b2574f295697a4210fc45f57d", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "65.000000", + "hours": 2268 + }, + { + "uxid": "b56517b7803a4b2cca522e1cca5f75894db174c97d0e127826f5414544eccb72", + "dst": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 20, + "block_hash": "ff403326d2bd8a047f65ffb4aff00e155d58aebf7feddcd91e290d694c0c5773", + "previous_block_hash": "68d19da9e71cbe45ac65906d399e3be68591b26d05a4dff39e696ecec36f81f0", + "timestamp": 1428990135, + "fee": 756, + "version": 0, + "tx_body_hash": "22766105d0f93d01fed7bed2dcabedfd89fe846621c912b0af845d8ba5d265f8", + "ux_hash": "3b1a3ef6e15819213a7187b8bc8d03577195f09f0213b205c132b5526a299dae" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "22766105d0f93d01fed7bed2dcabedfd89fe846621c912b0af845d8ba5d265f8", + "inner_hash": "3d516c76b1f147942f2237a2c07f9626624385fb858199ba63ec2d39112b6dfd", + "sigs": [ + "94e1b26e60d075536abd602ae88015f73ce638e49ec4e6be358cea8950853d0b4174aeeb0391ea05a9c62a6d37164c1fbab1d1ab53c9e2efd80ca4738ec3480e00" + ], + "inputs": [ + "af7deecc9b45c4696ad50246c8aa06b17aa8280b2574f295697a4210fc45f57d" + ], + "outputs": [ + { + "uxid": "ec9bbaf9309772ade9860f145705b9e9ee4a70ed1eeed1983d058ccaafd6c02c", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "60.000000", + "hours": 1512 + }, + { + "uxid": "e55a8d2ebe0f48f17a175fdd67d47deb5015b2ee8e91de16b2b121c8ad830e40", + "dst": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 21, + "block_hash": "7f3053b91f6e33a53f9bf7e908f8872b109462d1e2ee394f575bff805a31890a", + "previous_block_hash": "ff403326d2bd8a047f65ffb4aff00e155d58aebf7feddcd91e290d694c0c5773", + "timestamp": 1428991365, + "fee": 504, + "version": 0, + "tx_body_hash": "67f180076fed1599152c62337a12deee7e1a468b19f7e720df51415c28bfb986", + "ux_hash": "8564c5d554513f0213063e68c6f30940950bac9e4f7d149b0a75ce27fbe08dbf" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "67f180076fed1599152c62337a12deee7e1a468b19f7e720df51415c28bfb986", + "inner_hash": "1d676e397e50442c001f98385b525f8df39ef7189ebb0744cb3f868d8c96f00c", + "sigs": [ + "797c7987aab5c7a6a63eb06d514063a31b27beed8bfe22f15fbdf7b08c65702903d778d48e8cd027a9569c9973d0e52234977df7e0b9391967c913985ef860a700" + ], + "inputs": [ + "ec9bbaf9309772ade9860f145705b9e9ee4a70ed1eeed1983d058ccaafd6c02c" + ], + "outputs": [ + { + "uxid": "e3e95cd390c42d2f08e2c173135620e09c7a2ec1cf80ff75fbc3940fa5712b3c", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "55.000000", + "hours": 1008 + }, + { + "uxid": "1f4f952c6304e3991cf33519f1084921d50ecfd845edc48bd3b7b7229e28f2a6", + "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 22, + "block_hash": "357e1da88c19175600e9f071a6b4984f7ed2c0532f3678122fd8547e441cac74", + "previous_block_hash": "7f3053b91f6e33a53f9bf7e908f8872b109462d1e2ee394f575bff805a31890a", + "timestamp": 1428991585, + "fee": 0, + "version": 0, + "tx_body_hash": "c820bf59805b4889e59ce5fa320dcccfce5180de5f0f8baef7b391049ea8e286", + "ux_hash": "c0e9ab176138c41212fdfe67ff5bafdf1f847047be08bccb3fb6e86e7ba6ca98" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "c820bf59805b4889e59ce5fa320dcccfce5180de5f0f8baef7b391049ea8e286", + "inner_hash": "6fab8afaec00c1604f67fa7ecdfc968fa870662a46b714a88865e6b83ca555c3", + "sigs": [ + "0fafbcb51bcdf3e797059c26ec09574b9b02672453e31fdc5b8b5debc507dfe917208b33632e7905c9b02252a675b7bd22578686e2882277ac077af86fcaa49a00" + ], + "inputs": [ + "1f4f952c6304e3991cf33519f1084921d50ecfd845edc48bd3b7b7229e28f2a6" + ], + "outputs": [ + { + "uxid": "4c84a4bf9a1b1a3a53d8bf78e8823ca3135321089968068ac60da32083027846", + "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "4.000000", + "hours": 0 + }, + { + "uxid": "182b4c32bb5fe0e6809a19db63eecbeefde97a6c043b9248da94d428ab5a94c2", + "dst": "2bvEzLx4mgyQkYL5bkSc2rD9V1nqWBqn8vp", + "coins": "1.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 23, + "block_hash": "4e0f335204906a11c17ac9837ac911b33309e5c8466e9b05fd3c6010990da342", + "previous_block_hash": "357e1da88c19175600e9f071a6b4984f7ed2c0532f3678122fd8547e441cac74", + "timestamp": 1428991605, + "fee": 0, + "version": 0, + "tx_body_hash": "eb0a48072c5da37962c07d205a1843311f98e886cfcbdb2813359677f36bebc2", + "ux_hash": "87372b955f6c577e7b320721d6b0af7f4629c440ca109894ad873af5c5f48291" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "eb0a48072c5da37962c07d205a1843311f98e886cfcbdb2813359677f36bebc2", + "inner_hash": "104c51c380f54913954c2e16a8cf35dd585666a6e7b67116c05f490e06e5e1e1", + "sigs": [ + "6615ef5540b366a45895feeb91f16a5226d5022737e59ab1b9825843ff54dd7e281f2f014fc95641e3bc6ddda433b86e0c79d87a5b9b8b23fa5e234e5a41da1601" + ], + "inputs": [ + "4c84a4bf9a1b1a3a53d8bf78e8823ca3135321089968068ac60da32083027846" + ], + "outputs": [ + { + "uxid": "f3ce12886e74d6407f9580b47e72156a917083b66ebaa46263c7fde2df35116e", + "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "3.000000", + "hours": 0 + }, + { + "uxid": "20900f1d317e0b10ebab7190a34265f52783ff4f85675398b497ab8eb3723a3c", + "dst": "2bvEzLx4mgyQkYL5bkSc2rD9V1nqWBqn8vp", + "coins": "1.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 24, + "block_hash": "1de41dd34dac9a54143fdfb8cb59957cb0865bf2d7e17e4d7b44523ee87a2f54", + "previous_block_hash": "4e0f335204906a11c17ac9837ac911b33309e5c8466e9b05fd3c6010990da342", + "timestamp": 1428991635, + "fee": 0, + "version": 0, + "tx_body_hash": "f935cd91736604989c08448a2d83d6b044c3198ac1a7483a3b9846f8848a7d84", + "ux_hash": "8460866d61c0680981b655f485a26ce122dcdecc03c3a376a1877bb280303780" + }, + "body": { + "txns": [ + { + "length": 280, + "type": 0, + "txid": "f935cd91736604989c08448a2d83d6b044c3198ac1a7483a3b9846f8848a7d84", + "inner_hash": "02b721422fcadeb8c3217d9b972c81fe9042a32871a180fb1237e213a543cc9d", + "sigs": [ + "fa3ccaecf3a01525fd617fe74971ff2f7270e88f92f17a0f7748c1b258e007fd0fd10a582cc406d7806fd7794e20c4a3178b71cc1cb9f59c3c7d36a4e34d962100", + "23530a4d36d65cb37fc366a8c4a61d47dfd4fbf3b268bd66fd960bcff1b91db419d039049b8f816bedbd73d6baeaea77c5907c0df5b47724ad07420dd225cdaf01" + ], + "inputs": [ + "182b4c32bb5fe0e6809a19db63eecbeefde97a6c043b9248da94d428ab5a94c2", + "20900f1d317e0b10ebab7190a34265f52783ff4f85675398b497ab8eb3723a3c" + ], + "outputs": [ + { + "uxid": "fbe00b341f3e798c3e7e5eea04ffd8f3e70f0e78bc38f9a4927bae7eed6a1411", + "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "2.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 280 + }, + { + "header": { + "seq": 25, + "block_hash": "fadde28e30972cab6974572e6d19b6ecf367c126b3cff677731e33ceafde6c28", + "previous_block_hash": "1de41dd34dac9a54143fdfb8cb59957cb0865bf2d7e17e4d7b44523ee87a2f54", + "timestamp": 1428991665, + "fee": 0, + "version": 0, + "tx_body_hash": "917510897f5d8a018ad8d447876a15e2e1f68d42e71b6f75d89b02c4a599c537", + "ux_hash": "0da490050bc42511d86b8cfcf63172c24ec736ffd6595bce0d2df48596016869" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "917510897f5d8a018ad8d447876a15e2e1f68d42e71b6f75d89b02c4a599c537", + "inner_hash": "be34076fd999f7030f2a51866d641f8a783deb2204a9a93a8b64377a95546916", + "sigs": [ + "880b044ee5559510010d6d5cb4d7b50cb3e5323e5037daf3a048f3fab70254d34ff258aea85ec8ce264679bfb35df4590cd4dcaa527d89f9fb65fa50234dfc2e01" + ], + "inputs": [ + "f3ce12886e74d6407f9580b47e72156a917083b66ebaa46263c7fde2df35116e" + ], + "outputs": [ + { + "uxid": "f910d0e633735df5f041fdb7ffcb9cc8988b71c9375c52ababb54238be4d6852", + "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "1.000000", + "hours": 0 + }, + { + "uxid": "ebedac42a639f0d0a196b47676cb757b95046f0403f74baa5b15e98753ee2d58", + "dst": "2bvEzLx4mgyQkYL5bkSc2rD9V1nqWBqn8vp", + "coins": "2.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 26, + "block_hash": "5bba72f7f8eedda5ac16ee86f344e396172d57e0f32d8f90af68d05790590727", + "previous_block_hash": "fadde28e30972cab6974572e6d19b6ecf367c126b3cff677731e33ceafde6c28", + "timestamp": 1429011077, + "fee": 3407635, + "version": 0, + "tx_body_hash": "56e7bd13dc4c6e1cd80aba66a0a9fed650d0646659ac774e3f1b415848755d85", + "ux_hash": "51bdbf6235d29ffb41102b2eb33ca48a86c49be6e3d6c8f9b2becdb440b43f3d" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "56e7bd13dc4c6e1cd80aba66a0a9fed650d0646659ac774e3f1b415848755d85", + "inner_hash": "2894cfa31c21eb04c33f89263aa1e4caae625ceaf30539b82b39ccf79dffa816", + "sigs": [ + "6aedcd617e69aab9724b6a52e0e71f4f087a2fa84a283ac685c17e274b49cf617e58dbbd6c45a8e2c1c31832a1193ba119f0cb238fd83b9d7eb029dcedbeba0800", + "f1f26b84f247c409d308bf0992c2a044ce649fc09169d5fe4843f22b855f911d6c73b92f679346d30ec6663aa5d0387189935ce8e2f2256dd13e59cbdae7b89e00" + ], + "inputs": [ + "4168b9378363cd81939e667cf78055d35a60d3101f5f9e3d2ae709e3981e29fc", + "d9dae1f82177f979b07016a341ed5c281ed6ed8eaa785a8a107ec16efbe541ef" + ], + "outputs": [ + { + "uxid": "8793a3782bf673393a8f909f267f3bfcc713b600460893b571fd55f675ac65ba", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 567938 + }, + { + "uxid": "339aeec109a26bab65e618d73ebba16e5b8fc18f7dc1fe502ca891ad5b0f4d5f", + "dst": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", + "coins": "10.000000", + "hours": 567938 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 27, + "block_hash": "ad03a81878334d1340e7304524bfda3eda386016170543605218cb7e580da2cc", + "previous_block_hash": "5bba72f7f8eedda5ac16ee86f344e396172d57e0f32d8f90af68d05790590727", + "timestamp": 1429011137, + "fee": 425954, + "version": 0, + "tx_body_hash": "cff53a059d55f2c90f6dd7ce7de2cc07cbdbd50b25867cba0f41cd0192614d0d", + "ux_hash": "c8d8839903bb3f82d6beb62accf60b505048fb587c62f4364031c815c9808f81" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "cff53a059d55f2c90f6dd7ce7de2cc07cbdbd50b25867cba0f41cd0192614d0d", + "inner_hash": "09382455a4e78c62bd0c254e106d349f648944c3747b066a23cc64d9392c6c05", + "sigs": [ + "ade8874855f58653ef198e005a7ec82de992cddb50a4bb5ce8a0ec1cfa7b44086883ad1c85c63128dad5426b8b22873c349e0535191b80b3e92035b120cada7a01" + ], + "inputs": [ + "8793a3782bf673393a8f909f267f3bfcc713b600460893b571fd55f675ac65ba" + ], + "outputs": [ + { + "uxid": "ad742bbc7420c08881e6ccf35e34e8472c0dd6386792359aedcfb752ca618c33", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999790.000000", + "hours": 70992 + }, + { + "uxid": "3e475e76c226a70c87d030d8fc6b8b1c2cc654ba9eaf3bed08be5bd603aec0b7", + "dst": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", + "coins": "90.000000", + "hours": 70992 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 28, + "block_hash": "1a6309d7463f89b08b1e89d6688a13e4901eb457aa48450fd4f5d85d93d4c2b3", + "previous_block_hash": "ad03a81878334d1340e7304524bfda3eda386016170543605218cb7e580da2cc", + "timestamp": 1429020387, + "fee": 214, + "version": 0, + "tx_body_hash": "f2f9926afcd29405327ddb772988a73dc13a67b1fcaa42ad98a416060e96adce", + "ux_hash": "3f71dfad629418433c00eaac3126d584daa269951e286790172c89eadc92a00c" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "f2f9926afcd29405327ddb772988a73dc13a67b1fcaa42ad98a416060e96adce", + "inner_hash": "1e46ec99a425796960a928a95b64be87b568d160c9533a5399d25141b60f74af", + "sigs": [ + "1b59327011b10a2896962898bafd8d587710fb6d99b1b565777e0713a8e5fa072f7f60043c9823d2bcfc589b283e99da90d0649c472199a683428b14bd75374301" + ], + "inputs": [ + "778048daec0c83f89525a6d69b60c407d090bb1666711b1c560e6ebee8dcc452" + ], + "outputs": [ + { + "uxid": "92ae7cf57ad1363a60ce019818f7304040959329b6513f9a2d0f6b464bacafea", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "3.000000", + "hours": 35 + }, + { + "uxid": "7f44d7ef014419278137cbaa344cb550fc3c07355ec619d917bea3bc15fb8817", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "2.000000", + "hours": 35 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 29, + "block_hash": "75b035753c6099f478cdda4f3ac0001d2a3627280df12dd20207e229eac4daee", + "previous_block_hash": "1a6309d7463f89b08b1e89d6688a13e4901eb457aa48450fd4f5d85d93d4c2b3", + "timestamp": 1429020687, + "fee": 551, + "version": 0, + "tx_body_hash": "260d249883165aa9e59e17fb2bd8ba8995d2c3644993530985f8b813ed378650", + "ux_hash": "ad32a8a9357e41dac2a7a38e120862439441f8b78ef187c9b041b5fcd77aed1b" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "260d249883165aa9e59e17fb2bd8ba8995d2c3644993530985f8b813ed378650", + "inner_hash": "c5a9b2a4d2100d45a97a0131f3ffa79fbc4bb37b8969e8a1d5059055ca169c6c", + "sigs": [ + "661c14759218ac72f4b06ac96bce6db7e20cfae5f23643cc4dae2641893ca3686682cb1e3cc3f384afe549a87209e4104ed7d163af8af3be4762686719541e8900" + ], + "inputs": [ + "98b3e6e6d4ed36159b7dbf5f305174fc0c255d2d97528b35a67d50b9968e2b2f" + ], + "outputs": [ + { + "uxid": "18ea1b3cceb2ca40c01efc8f3cfd7d1d0dd69430ecdf655515aa4f8b21bd2644", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 78 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 30, + "block_hash": "47695088da9067532b6733366f5b3379c9946721a0bba7dae98d697391a4546b", + "previous_block_hash": "75b035753c6099f478cdda4f3ac0001d2a3627280df12dd20207e229eac4daee", + "timestamp": 1429021044, + "fee": 31, + "version": 0, + "tx_body_hash": "044a75b1d3d273cae560ca43f9351d9acde206b0ad5578eb3adc2598886b5134", + "ux_hash": "18a38d48eba01d3bf392cfd7c92ae5a1f95d7bc0f91b26abcbb9fdfe11bbf581" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "044a75b1d3d273cae560ca43f9351d9acde206b0ad5578eb3adc2598886b5134", + "inner_hash": "61a1297a213a7642daf445350b49b2df9ccade45cc1498b91f80fceefcad5adf", + "sigs": [ + "ef33f4e1a053728e779296e912df149ad7e20167bd79ae88db24c52da558c6cc0dffaa3aeb9b4aa507865855f7172bb7ac72040dafb56bc2612d152d51e8008000" + ], + "inputs": [ + "92ae7cf57ad1363a60ce019818f7304040959329b6513f9a2d0f6b464bacafea" + ], + "outputs": [ + { + "uxid": "61c61dfe5b82fde557a698b402c82ac0205929478e705cbadec7f5d47a51d403", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "3.000000", + "hours": 4 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 31, + "block_hash": "59770eade7313701b4470c4128cc418ecb5958675d71b7fbfb3cac38b3668741", + "previous_block_hash": "47695088da9067532b6733366f5b3379c9946721a0bba7dae98d697391a4546b", + "timestamp": 1429021184, + "fee": 60, + "version": 0, + "tx_body_hash": "9004c779cff67b3895500ec14b2c2e566127bb11a8af3358fe8a63dcfae9badc", + "ux_hash": "011f23d6473dfdf9802a866ec50b1a4d26984b97c3bc9152ce40a341c35db446" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "9004c779cff67b3895500ec14b2c2e566127bb11a8af3358fe8a63dcfae9badc", + "inner_hash": "9e1eed08b004316812f4ad574f3d0f96959b2a335cdda77113abfd1673a8859d", + "sigs": [ + "6b3a3b3374c641ca252ee32cceab1b37c4c395b411e4d2515bc51f2a8ec12b9c440d25dee1b94a0231dd9492ab3e07c7a5dc054a0da987d6bf0ba6fc8de6f42000" + ], + "inputs": [ + "18ea1b3cceb2ca40c01efc8f3cfd7d1d0dd69430ecdf655515aa4f8b21bd2644" + ], + "outputs": [ + { + "uxid": "64194899d317e2a007f89df14538795547e927c242a92f83180e6cc952304964", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "5.000000", + "hours": 9 + }, + { + "uxid": "569aa1260e734017c4eee06d84ab4a6285e2ca2041940b2915d9141527caf179", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "5.000000", + "hours": 9 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 32, + "block_hash": "cf47f574509b704cf4fc7ed787de91cfd14e8e7fed745fab27db54311cd4a9d2", + "previous_block_hash": "59770eade7313701b4470c4128cc418ecb5958675d71b7fbfb3cac38b3668741", + "timestamp": 1429021214, + "fee": 8, + "version": 0, + "tx_body_hash": "327375203f20cb68847351c30a48597c0588a8c14319a4eb47bf440207fd045a", + "ux_hash": "ccf0002e9020c40441ac01fefb32ab5736833f82e5842473c2ddbe3db4f86418" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "327375203f20cb68847351c30a48597c0588a8c14319a4eb47bf440207fd045a", + "inner_hash": "217a070c0edd70fc0eaa7f858308444f32bbfe4b48e128b6fa876f60c4639bfb", + "sigs": [ + "de82c42e2523b512c0ffea3c91244dc905f59264f3c59e2f82efc3fdb7f446c728afb08bbc3478462cf25b96848da9dc4dd6b87cab569715ebd33e8102c552d101" + ], + "inputs": [ + "64194899d317e2a007f89df14538795547e927c242a92f83180e6cc952304964" + ], + "outputs": [ + { + "uxid": "eb446b8372559249c8e269b6cd028588e2e9e4f8fe9357719da9d1c22aa29911", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "5.000000", + "hours": 1 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 33, + "block_hash": "ab7c5b8eefedea15e05e0fcd52a01b3b87f009c4c9f53127272b8804d00bfd74", + "previous_block_hash": "cf47f574509b704cf4fc7ed787de91cfd14e8e7fed745fab27db54311cd4a9d2", + "timestamp": 1429021674, + "fee": 9, + "version": 0, + "tx_body_hash": "e89ee3e90e72108e4cd6ccb95c9f8d2b18ccfaa7ce61a7d297454debd69cebbf", + "ux_hash": "924f087d5681f12417a20ff9cfc7fc7d92f0e72a3cc75177c0d1194e76e61216" + }, + "body": { + "txns": [ + { + "length": 280, + "type": 0, + "txid": "e89ee3e90e72108e4cd6ccb95c9f8d2b18ccfaa7ce61a7d297454debd69cebbf", + "inner_hash": "dac67377dd9d8247db41f3380288730de2e51514ec3a2986072719553b9f9e27", + "sigs": [ + "7df848876a507f4b2855818f059e62e6d2f5924af148607a0c6004b7231fdce920ac80e800a833e55cbce9938b5d8cb755b0dc434c22b03a5037972ff2d6444801", + "6499aeee3ba19247d1ef2d3ec13e46031adf0dd6a383785272776a93621f21696cf217b7375e5721e51133fc3d9806200d2aded757118fbe27a719ebf4ceaea001" + ], + "inputs": [ + "569aa1260e734017c4eee06d84ab4a6285e2ca2041940b2915d9141527caf179", + "eb446b8372559249c8e269b6cd028588e2e9e4f8fe9357719da9d1c22aa29911" + ], + "outputs": [ + { + "uxid": "e702df2703c3de180f3e4a0e9a503bd534037c2d68e858e97a317575c5a97d95", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 1 + } + ] + } + ] + }, + "size": 280 + }, + { + "header": { + "seq": 34, + "block_hash": "ffc59d36008eb3bae90c37e4942a884ab8a51c87370243ecab2f6ce4a45cbc87", + "previous_block_hash": "ab7c5b8eefedea15e05e0fcd52a01b3b87f009c4c9f53127272b8804d00bfd74", + "timestamp": 1429021994, + "fee": 1, + "version": 0, + "tx_body_hash": "08bf0f8f4a8547bcab1fef035adac2a66c80369b4485a736bdd676e782bbb037", + "ux_hash": "e75a837820ec1bf43a7fbab324c1eec1cefc436d65a12d2bdfd45ecd8c0b0a48" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "08bf0f8f4a8547bcab1fef035adac2a66c80369b4485a736bdd676e782bbb037", + "inner_hash": "8fd6f4e5428c170dede16e8c02596ab0c490dd5c418d003d9232d8c2caedec9c", + "sigs": [ + "f68d819dbda0bbf7cd5e2de8088267c5b3a744bbe2d7737c7dc52060b6344a25180cc1081e5c7dadab94763d158e303f697d1d275685b32bfd1de123a376697501" + ], + "inputs": [ + "e702df2703c3de180f3e4a0e9a503bd534037c2d68e858e97a317575c5a97d95" + ], + "outputs": [ + { + "uxid": "10998e83dc5dfe3c3f5f28ef3e5e2fced4dbd1da389678b0ea3ddb552851b6bf", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "6.000000", + "hours": 0 + }, + { + "uxid": "41c6d29aa5de770de684ab19b40bd75b99ec7f1a5ff7d15288ae4bfff568eabd", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "4.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 35, + "block_hash": "18d0cf1ff691931a24fcf4b7870d68da6487f3f4595cbf68df854da2972d919f", + "previous_block_hash": "ffc59d36008eb3bae90c37e4942a884ab8a51c87370243ecab2f6ce4a45cbc87", + "timestamp": 1429022034, + "fee": 0, + "version": 0, + "tx_body_hash": "3170f0635cc40aded3a38f84f2ae07bd2238550ea4ee867328d0f891ea9abf14", + "ux_hash": "55d2c6ea4d79cd339b7c76d630333f75cc62dd224357ff78ed43066dff854fb3" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "3170f0635cc40aded3a38f84f2ae07bd2238550ea4ee867328d0f891ea9abf14", + "inner_hash": "1cebcd96c2847d219b658733012921d6e10a6c55439736833dd0ae97b898f72a", + "sigs": [ + "179826a9f244005b2b34d145948b178533805953adff8ab924a6fd67538daaa4384d67a24473de6bb01d441e4d979e520b055cd9304188d00255eab7c04bf45701" + ], + "inputs": [ + "10998e83dc5dfe3c3f5f28ef3e5e2fced4dbd1da389678b0ea3ddb552851b6bf" + ], + "outputs": [ + { + "uxid": "9e5779445f60d62b471862339d7a83dd8355c7a89d5fc3b751f98e9414628ec2", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "6.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 36, + "block_hash": "e2fb290dd1103f2fa0ed51279d0a1d4631c0535a6e9abf95d94cabab485f8d2b", + "previous_block_hash": "18d0cf1ff691931a24fcf4b7870d68da6487f3f4595cbf68df854da2972d919f", + "timestamp": 1429022064, + "fee": 0, + "version": 0, + "tx_body_hash": "fba515a9eeaedb891c4dca862bd06108e0452270890b362f0b353b4c86845618", + "ux_hash": "3f5d59f0677d598dbe7c5e4415ae99a50be414c2e831198cdf09fbeb00b47798" + }, + "body": { + "txns": [ + { + "length": 280, + "type": 0, + "txid": "fba515a9eeaedb891c4dca862bd06108e0452270890b362f0b353b4c86845618", + "inner_hash": "3c24f665a7a02308fe6938ef3ce7e38dfe72644b1d71c5aefbe3d6844c609d58", + "sigs": [ + "faf14290ac158576f0dd4311ee4835a2542ae8b52d9ec7ab36d1af938a117f382c42855dec9b980f282e7ff8d7e19d469b084a7d44e38022e246c365368cc07d00", + "52cfd88d334818382413dfa45dd8e00a2136c352b7547dcf97894bf3eaa152cc5b10bf9f35c4dc8c75e7bb62543bd244a7c1de588b2a606aa1eb0b32c9c4ca1501" + ], + "inputs": [ + "41c6d29aa5de770de684ab19b40bd75b99ec7f1a5ff7d15288ae4bfff568eabd", + "9e5779445f60d62b471862339d7a83dd8355c7a89d5fc3b751f98e9414628ec2" + ], + "outputs": [ + { + "uxid": "d46e91fea3c8a6428885f941e5152dbc7f9abd356ad4d054bf20e0e806f1ec99", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 280 + }, + { + "header": { + "seq": 37, + "block_hash": "87ea823bf69a2e24b92fda4b8150d1318df8fde8f4443354df604e76b497d7a0", + "previous_block_hash": "e2fb290dd1103f2fa0ed51279d0a1d4631c0535a6e9abf95d94cabab485f8d2b", + "timestamp": 1429022094, + "fee": 0, + "version": 0, + "tx_body_hash": "9fb039cd90a4e9b85669bd6ef878b98a9e84eec7d4804e2bff6f0dc9c2739c44", + "ux_hash": "9741ded2fb1b032ac1f5a914e4763508a5a8debfa3e3c1309770696ed4119d39" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "9fb039cd90a4e9b85669bd6ef878b98a9e84eec7d4804e2bff6f0dc9c2739c44", + "inner_hash": "5bc5636489d4ba7d36b4429cd3ec71491c9fa6f442fede1ea696428b574e0d13", + "sigs": [ + "3127749c2123db967563b9726cf5d6daa3ae755ec74f5e5fbc3dcfb10ececc231f5d61de693355aa5c8ade13c4c31ddc3bf9864e87139fdcd64c513702f7425600" + ], + "inputs": [ + "d46e91fea3c8a6428885f941e5152dbc7f9abd356ad4d054bf20e0e806f1ec99" + ], + "outputs": [ + { + "uxid": "2987e7c89d353ad5d63cea2bf2724dc5f7a5ef5fb81f5ea160a307f0726ac2f5", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 38, + "block_hash": "812d40f14869b362f41859db216ade292a60db6f3d567e308e08fbd07b032892", + "previous_block_hash": "87ea823bf69a2e24b92fda4b8150d1318df8fde8f4443354df604e76b497d7a0", + "timestamp": 1429058484, + "fee": 2335473, + "version": 0, + "tx_body_hash": "a76cd63b71f1f5425941cd567627e1dcdc8c34306a7945ea48755f5a46efb6f5", + "ux_hash": "92ad4d294c00edfa740be4a8bcd37c0986e5c8dacf8504eaa8aad37661030eb9" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "a76cd63b71f1f5425941cd567627e1dcdc8c34306a7945ea48755f5a46efb6f5", + "inner_hash": "39c3ed7f2dfb26d02c9fcbbe853db5c3031644b4a66844a717d8795c6d954d65", + "sigs": [ + "844af158e935a38f034778a78b646a167b5758df65212546f2eb1c7e838216ad7aa6e7571d1e81d8836808d4315846fe97489bdf2e6d2159a2af77a15a9a2bcb00" + ], + "inputs": [ + "ad742bbc7420c08881e6ccf35e34e8472c0dd6386792359aedcfb752ca618c33" + ], + "outputs": [ + { + "uxid": "108520145179c00f581d91e273714811fe6e82ee059d65218eea91154ebd8205", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "998790.000000", + "hours": 389245 + }, + { + "uxid": "f48432d381a10abecbd1357d81705ea922246e92170fe405d1a4a35c5ceef6a4", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "1000.000000", + "hours": 389245 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 39, + "block_hash": "08a109060182ac50db40931ddfbafe8733a0817f1b0dcd83ac692d466c48a1e1", + "previous_block_hash": "812d40f14869b362f41859db216ade292a60db6f3d567e308e08fbd07b032892", + "timestamp": 1429058494, + "fee": 291935, + "version": 0, + "tx_body_hash": "c38b47bd576e3bced2a9309c3df7622064e71177f54020d77193d5cac310719c", + "ux_hash": "4fb04fb3ff93092a37bebaa62d5b2a3676d801268a86e184ba19a55e8d101df3" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "c38b47bd576e3bced2a9309c3df7622064e71177f54020d77193d5cac310719c", + "inner_hash": "7f02ba6476946668f3adcbb35e113531e6788cee4fe94bf8d8da4803e3baa7e3", + "sigs": [ + "2a31eb55da895c59654ad3f1a11efa11b04787ab78dcf8221aeeccf137adec543765f761363390c97f429310fcb39db305494a94b30af906a2d43d5de1effbb701" + ], + "inputs": [ + "108520145179c00f581d91e273714811fe6e82ee059d65218eea91154ebd8205" + ], + "outputs": [ + { + "uxid": "e79c94aa7013c7611901839236b8a1cdf70e8ef7c40b9e33f99359136de981d6", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "988790.000000", + "hours": 48655 + }, + { + "uxid": "df5d6e09da2585a6ac1a37aea2370fa25e9049b549049202d5417138bf033cfa", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "10000.000000", + "hours": 48655 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 40, + "block_hash": "fad5aca57144cbc86ad916492e814ec84c825d9870a86beac81980de30b0ae60", + "previous_block_hash": "08a109060182ac50db40931ddfbafe8733a0817f1b0dcd83ac692d466c48a1e1", + "timestamp": 1429058514, + "fee": 36493, + "version": 0, + "tx_body_hash": "b56f3e9239da5c5f9bb5ca80226b8454ba36ce6012f8e323a50c9d9c4eb4a834", + "ux_hash": "9e0f4fdc945df9ffcd31adbaddd5469c9ff39b297308fc76469af04bd8349080" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "b56f3e9239da5c5f9bb5ca80226b8454ba36ce6012f8e323a50c9d9c4eb4a834", + "inner_hash": "bdcf8f2f2b960cfee6b3b1124a554ef4747fe43ac9452d897bd8dedcd643e1ae", + "sigs": [ + "809029f12d5f38906306610feae26c0623bffe63218c8019060ae2d164cc29352066efd20567e3c37837230e74b481730b0fc71bcafe3b3b9f5eb4a7fb42f69101" + ], + "inputs": [ + "e79c94aa7013c7611901839236b8a1cdf70e8ef7c40b9e33f99359136de981d6" + ], + "outputs": [ + { + "uxid": "c65a9e6aa33244958e9595e9eceed678f9f17761753bf77000c5474f7696da53", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "978790.000000", + "hours": 6081 + }, + { + "uxid": "f8ad5c72e7822c7ac9a1dce8de583e34f6f830052bc0a02d749e9e81790dae86", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "10000.000000", + "hours": 6081 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 41, + "block_hash": "08f89cfe92be09e9848ba4d77c300908761354933f80401c107644feab1f4c9e", + "previous_block_hash": "fad5aca57144cbc86ad916492e814ec84c825d9870a86beac81980de30b0ae60", + "timestamp": 1429058524, + "fee": 4561, + "version": 0, + "tx_body_hash": "cf4fe76a08e3296b6f6abdb949604409be66574f211d9d14fde39103c4cfe1d6", + "ux_hash": "d3f60f0d20aeac951aacab8d849696cac54c7057da741cfd90b63018100818d0" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "cf4fe76a08e3296b6f6abdb949604409be66574f211d9d14fde39103c4cfe1d6", + "inner_hash": "2f5942207104d52dbd6191684b2a97392e616b7fa51dde314dbddd58d34b8027", + "sigs": [ + "b2b8c8ec1e1dfdeac4690e88d4ef9fcc4b52fcb771153f391cbcb58d651505a94c6263b6dc15a948c0396c0d8be20d9e0d1993b494bd9189c778d3673363bfc401" + ], + "inputs": [ + "c65a9e6aa33244958e9595e9eceed678f9f17761753bf77000c5474f7696da53" + ], + "outputs": [ + { + "uxid": "195f5e50b4eed1ec7ff968feca90356285437adc8ccfcf6623b55a4eebf7bbb5", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "969790.000000", + "hours": 760 + }, + { + "uxid": "6bbf13da052e1baade111ae8bb85548732532c8f5286eba8345d436d315d1c93", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "9000.000000", + "hours": 760 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 42, + "block_hash": "60a17e0cf411e5db7150272e597d343beaa5fbce5d61f6f647a14288262593b1", + "previous_block_hash": "08f89cfe92be09e9848ba4d77c300908761354933f80401c107644feab1f4c9e", + "timestamp": 1429058594, + "fee": 292512, + "version": 0, + "tx_body_hash": "0e91a08561e85a36ddf44e77b9228f7d561c18c0b46d19083d4af511085b697e", + "ux_hash": "9173768496bc49e2a34d5a7ea65d05ad6507dfdb489836e861b3c03d35efeb7a" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "0e91a08561e85a36ddf44e77b9228f7d561c18c0b46d19083d4af511085b697e", + "inner_hash": "d78230e22b358d7cc8d491adb3c0ec1e77a5170602a4ec92d700c4b4bb101f98", + "sigs": [ + "17ba9c495e4d396a37eaf062e1806a13b3bdc91a83151c2455cf948a7e6d91882dc02ec6443970517f0f7daf59ce9b89658a17f5d51c0cbc18056811d0f3006501", + "e4e8f28801fe461cc8097b29cfe1307739bdfbdd6b20c31e04eef89aede641a6407fa0c41b0ad5ef167e3255e1916c0bbd358ffd70f34dc7944ffe67514bc5f501" + ], + "inputs": [ + "f48432d381a10abecbd1357d81705ea922246e92170fe405d1a4a35c5ceef6a4", + "6bbf13da052e1baade111ae8bb85548732532c8f5286eba8345d436d315d1c93" + ], + "outputs": [ + { + "uxid": "19efa2bd8c59623a092612c511fb66333e2049a57d546269c19255852056fead", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "9000.000000", + "hours": 48752 + }, + { + "uxid": "9953e00abe05db134510693a44b8928ca9b29d0009b38d9c4f8dcdedee7edc35", + "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "1000.000000", + "hours": 48752 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 43, + "block_hash": "b98060fcb099ad4dcb6c5f7654bcad99be31375a72a2d30b4e90af4597091149", + "previous_block_hash": "60a17e0cf411e5db7150272e597d343beaa5fbce5d61f6f647a14288262593b1", + "timestamp": 1429070374, + "fee": 1596, + "version": 0, + "tx_body_hash": "d368fc3112b522c52a5b191981ca52678cc7db29bdc3493cf551be88d109ef9c", + "ux_hash": "46d8cf99e912e732164aa7910ab409e056f7190492d00075499d77dbb8108f94" + }, + "body": { + "txns": [ + { + "length": 414, + "type": 0, + "txid": "d368fc3112b522c52a5b191981ca52678cc7db29bdc3493cf551be88d109ef9c", + "inner_hash": "acb0cc7def6ebcfd45b1490aa60d6cb84fc3621bf34be5ab84910a1929efccf5", + "sigs": [ + "9d1fcf32769b70f2eeb88b70434010c5ac5844031d85c515f7854b0aa5b91de7035f4fa3802ebcc6a7e064b4ebf16be5b1ed9a85b31bbb46ceb11694e14648eb00", + "40303be55ccfaef337b8810405d522c2a32a4d86acc5e474626666f3999533b55a33c546b04472e3d10a7870e0435968ce88ac7fbea6fecb8617a680957752ce01", + "3c1d5a5e076cb1274fb478c6c3bd4e0f724106f71edbd16eed7e2b13aabb69a53f7e91df5af8c611ffd2ca9114cd4d4be7df70ccf541606c781af41f986ea51700" + ], + "inputs": [ + "e3e95cd390c42d2f08e2c173135620e09c7a2ec1cf80ff75fbc3940fa5712b3c", + "7f44d7ef014419278137cbaa344cb550fc3c07355ec619d917bea3bc15fb8817", + "61c61dfe5b82fde557a698b402c82ac0205929478e705cbadec7f5d47a51d403" + ], + "outputs": [ + { + "uxid": "88162721a552b1422546024772fc822faa187e897754e0a579e5e4a92a7cf4c9", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "55.000000", + "hours": 265 + }, + { + "uxid": "e64fa1f60e905f1d7b7a8f0ca134ab2b7a467f7363ec9c03628d559e1230eb68", + "dst": "2apVG7f24ezDK13yCDTqBWYrTZpuj94KnCN", + "coins": "5.000000", + "hours": 265 + } + ] + } + ] + }, + "size": 414 + }, + { + "header": { + "seq": 44, + "block_hash": "9fd770857cc65c7d7865a318ea1f6df00a9b589937e2c583188f9301c96f2f7f", + "previous_block_hash": "b98060fcb099ad4dcb6c5f7654bcad99be31375a72a2d30b4e90af4597091149", + "timestamp": 1429070414, + "fee": 199, + "version": 0, + "tx_body_hash": "ced30c4ac3107997efa90faa40c8baed47dafc8ddb4feae3ba21275401c36280", + "ux_hash": "5a8a9e30aa37f987b7f3fe0ae6c6048585b168ffacc602392d6d3855bf2cf64e" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "ced30c4ac3107997efa90faa40c8baed47dafc8ddb4feae3ba21275401c36280", + "inner_hash": "f3a57ef9c95bf41b758b317169e29596448640aad207b88a21b45b1ea46e9a99", + "sigs": [ + "fa16091cb778d496199d0b59f934d38891ff0b3aad42be78565a4f5a9880b9063a8e423fa7dacc624e0ffb01931bbdf4bed0fef8044f9280c8cd562b2f3bb0bd00" + ], + "inputs": [ + "88162721a552b1422546024772fc822faa187e897754e0a579e5e4a92a7cf4c9" + ], + "outputs": [ + { + "uxid": "73ad63090201c13e6fb55d2e51ec5606fe49a40640bea995e347e7389fcea6c6", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "50.000000", + "hours": 33 + }, + { + "uxid": "85fcb22c416b7d430076bb80a324734cb97483cb4544192df252b89ba8f7fd61", + "dst": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "5.000000", + "hours": 33 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 45, + "block_hash": "90a6673c7f7c70884c2ff52a40f6b1de2d0e5e9f763787c7467d6f27d968f187", + "previous_block_hash": "9fd770857cc65c7d7865a318ea1f6df00a9b589937e2c583188f9301c96f2f7f", + "timestamp": 1429071074, + "fee": 2402820, + "version": 0, + "tx_body_hash": "df622e8c9dfaed1d7dca83ad7f6d8946bb86b81398bad521d858cbefef8e4688", + "ux_hash": "ad85d15310a5086ec9f2c9478a540fa5e3d23298f2f2124a5142ae089b4bd567" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "df622e8c9dfaed1d7dca83ad7f6d8946bb86b81398bad521d858cbefef8e4688", + "inner_hash": "91ab4f29d84e9ffba56a108e01984e7b483729da4e61b6976c018fa11ace36a8", + "sigs": [ + "d0726d81cb1cdce6028668d0d95ceccf39cc9d655a7bff143573b9f52d0586232bbb7bd494df8b9bb5155a271446cfaff1550d5ccf314dd35f044226f98d14e201" + ], + "inputs": [ + "195f5e50b4eed1ec7ff968feca90356285437adc8ccfcf6623b55a4eebf7bbb5" + ], + "outputs": [ + { + "uxid": "cb8efc0b1082c39258cb6efd59f64d88b36fcb60143c826829fc5f0ed5c0d668", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944790.000000", + "hours": 400470 + }, + { + "uxid": "4aca4c715985da352bd9aa84787868dac4f4e305c420fe79e6f05acee3bba14a", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "25000.000000", + "hours": 400470 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 46, + "block_hash": "9ac2b1b1d2a7ea6bbc6049f174ba1d82e7bc381438fddad5868d0b2554389aa6", + "previous_block_hash": "90a6673c7f7c70884c2ff52a40f6b1de2d0e5e9f763787c7467d6f27d968f187", + "timestamp": 1429077374, + "fee": 300354, + "version": 0, + "tx_body_hash": "0a2da0489b14156fad8fb863d051a4dac1f645f144c1e5bb65a44478623b8e4b", + "ux_hash": "d444545422cfd535553abee015965d916ad0a9f3e6446222a2c5c248343dec1c" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "0a2da0489b14156fad8fb863d051a4dac1f645f144c1e5bb65a44478623b8e4b", + "inner_hash": "787ae7cb222a23641bb33751d1428dc8e07a2f2cf11ee6293a54100836209d09", + "sigs": [ + "9bc3b6d7cb1d66d52fc993d0799baafa1056992049fa86ce76d5909690e88c4a19920b69e2463cf34d1dddb545b61ee38fb2f9b33f92626da8afdd934c353c8e00" + ], + "inputs": [ + "cb8efc0b1082c39258cb6efd59f64d88b36fcb60143c826829fc5f0ed5c0d668" + ], + "outputs": [ + { + "uxid": "a6061defc41a8a55e37eaf56ebaa1177446f61719b1d5126698e79a6023f5367", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944780.000000", + "hours": 50058 + }, + { + "uxid": "a52408daa8ce7026c70b61d4df4212fb577462060f340bfce779225b3e18193d", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 50058 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 47, + "block_hash": "5709133095b892fee42c20c0b1264e923a0abf75f752768824d86f76d08d9280", + "previous_block_hash": "9ac2b1b1d2a7ea6bbc6049f174ba1d82e7bc381438fddad5868d0b2554389aa6", + "timestamp": 1429077384, + "fee": 37544, + "version": 0, + "tx_body_hash": "a4a202bc4431d95c307d151dea764bfc6d9ceb7e82b3eb50dc8604050622a22c", + "ux_hash": "68ade91c1b0a98b80fbdbb5829a75e95ea2e4a97776883b4576a245bfce271a5" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "a4a202bc4431d95c307d151dea764bfc6d9ceb7e82b3eb50dc8604050622a22c", + "inner_hash": "836145a3e62a7e055acc3404c1fd6ecb237e3251e6f8b39fd526a7f48f21daa8", + "sigs": [ + "f826793e63a3b0b837070e8876461c47af6be7a6898c370c70430b1491457cda76fc3b34e08bff41a336277ec1e93cc008f9c08ca295b418488b1ac92a5f5a4000" + ], + "inputs": [ + "a6061defc41a8a55e37eaf56ebaa1177446f61719b1d5126698e79a6023f5367" + ], + "outputs": [ + { + "uxid": "3b5f72e772ea886dd872b9087395398133576a6561072d5294fbcd04b49e1d95", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944770.000000", + "hours": 6257 + }, + { + "uxid": "dc73aac74348dd285a1456c1fae2204d7c2039d50a765bdaae0c31f7c7e059db", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 6257 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 48, + "block_hash": "aced5a17671fa788542d5c6d5bd1ff8b65714c77a463eeb788e2eb459d710aaf", + "previous_block_hash": "5709133095b892fee42c20c0b1264e923a0abf75f752768824d86f76d08d9280", + "timestamp": 1429077394, + "fee": 4693, + "version": 0, + "tx_body_hash": "4e6b363423633ad51114b250478ee7645fbd184066fa41c29e5b14d0728cdfec", + "ux_hash": "bf2c980d37c36e3a6d1179a698d43ef1d659c438bba0c84b3b09518a94a8a706" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "4e6b363423633ad51114b250478ee7645fbd184066fa41c29e5b14d0728cdfec", + "inner_hash": "8cf88a9e5140d5e01af412c956b3de7c93bfebbb4c5993b9b0285812208f5b33", + "sigs": [ + "670abb369c25a655b0f22c069a9523d439b8a03d122bc9f0861aff796ab965fd5e1b79812b6f458ebc0a1cd4cc223d0137eb22e1bf1cbb40265ac7301018897000" + ], + "inputs": [ + "3b5f72e772ea886dd872b9087395398133576a6561072d5294fbcd04b49e1d95" + ], + "outputs": [ + { + "uxid": "f265bea876ffcfb8cf64df3aca4dae4a8d7f424ff495d91fb322feddb3a7e505", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944760.000000", + "hours": 782 + }, + { + "uxid": "e4e375b9dc55ff53d6de9120f1a87ff00e00a779835f8320f2c6b3090d0466e6", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 782 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 49, + "block_hash": "e74d6630120b2c1f57a7176ef763246609165c33b8974fa29fad95c9654d894f", + "previous_block_hash": "aced5a17671fa788542d5c6d5bd1ff8b65714c77a463eeb788e2eb459d710aaf", + "timestamp": 1429077404, + "fee": 588, + "version": 0, + "tx_body_hash": "edc27c6ecc1f76d0f23489ad7bbbdb8c653af37cc4b8f18197400aea2011ed83", + "ux_hash": "b705b08e59a5ec4ae59f16940fa182f83326ab7278809e25c2094ef2202e3992" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "edc27c6ecc1f76d0f23489ad7bbbdb8c653af37cc4b8f18197400aea2011ed83", + "inner_hash": "5432e686f984075091a8d3686d959b63ef620382fcb2b86794ba8dc0fb9656e7", + "sigs": [ + "c1902b37a95c5327b0e5a1f05de551d4135831b787c86562867344ee7f06235374dc1618c6b4a8e077041723bc731db72dab5554a808b1ba77d305309144bf5e01" + ], + "inputs": [ + "f265bea876ffcfb8cf64df3aca4dae4a8d7f424ff495d91fb322feddb3a7e505" + ], + "outputs": [ + { + "uxid": "e6d9b56e075a6adf520d1ae7fbab9ae06353ae0b93dc8cb17d82cc3628009a50", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944750.000000", + "hours": 97 + }, + { + "uxid": "d11b05345917d171f60c31bd2634041b73b97eae364724369ddb8d53369397fb", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 97 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 50, + "block_hash": "96d249272364547bf1bb6626b99568415384db2bffa0a45c721a62cae6e76ceb", + "previous_block_hash": "e74d6630120b2c1f57a7176ef763246609165c33b8974fa29fad95c9654d894f", + "timestamp": 1429077474, + "fee": 71833, + "version": 0, + "tx_body_hash": "be27621ad46680b343cc1406f5c6a1717704ce169e988ed7afb586f8112ae6f0", + "ux_hash": "589b1ba02530656309a8dddec9b9450d16e4b5b2c8b64708ba0a8b453c5b0b5e" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "be27621ad46680b343cc1406f5c6a1717704ce169e988ed7afb586f8112ae6f0", + "inner_hash": "158b0ca1e5055c4abb6729eeb187d9fc592c425c8f1eaf07c3d64e17e1d1615d", + "sigs": [ + "3624a41ca94d80e7f13ea09f3acdfd701b9425af1a43c62e08a98744f31c651b1f9d2183c35f64aea01431e1c0c3a12d2f63d2c88ff9bd1a124b895a4bfabc6b01" + ], + "inputs": [ + "19efa2bd8c59623a092612c511fb66333e2049a57d546269c19255852056fead" + ], + "outputs": [ + { + "uxid": "5fa90c22a26ecec8c03696a018b590a5e1679efa9cb5e8263facf9bcc6628db6", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "8000.000000", + "hours": 11972 + }, + { + "uxid": "5afa88b6a9ef9168d15d9a0bbc87dd5ab30badc01773460f92703a9c829358c0", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "1000.000000", + "hours": 11972 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 51, + "block_hash": "616d09296fd9dfa108d859a8fc5042252e1a9b88277df2e5adef2336559b52f5", + "previous_block_hash": "96d249272364547bf1bb6626b99568415384db2bffa0a45c721a62cae6e76ceb", + "timestamp": 1429077484, + "fee": 44061, + "version": 0, + "tx_body_hash": "814694a8e32f1c81b627f8eb704622c8893d197bf32bbd7e1bf73bec9a831d7d", + "ux_hash": "f893ff5304a0ad87aec6345e962bb6648411b2b0dfad95940725b676f4e558cd" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "814694a8e32f1c81b627f8eb704622c8893d197bf32bbd7e1bf73bec9a831d7d", + "inner_hash": "10daee0ac47006149435adf9655dbc8796eece3d075f93af9810b204f90003ab", + "sigs": [ + "9cfad1cc126d0b33d6e44b5cf99672c0bbb088dd2ed01090365292d4ba1c188f18772aacbc7931e81202c11d7eb977a8f00bae86ce5b40479482bbbd883dfcaf01" + ], + "inputs": [ + "f8ad5c72e7822c7ac9a1dce8de583e34f6f830052bc0a02d749e9e81790dae86" + ], + "outputs": [ + { + "uxid": "f37efd851f76854852fdb8b8ba9afa2c5b7859315cc1fd12c12bf6831c59beb2", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "9000.000000", + "hours": 7343 + }, + { + "uxid": "2f4daff744e7fd81ceea34ecfb0e383a65ecda1c55f32a0bef313d29b0795eab", + "dst": "2acnXsnJ2k8jxiUahtBe8h4xouPAnpbwwjc", + "coins": "1000.000000", + "hours": 7343 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 52, + "block_hash": "8536b8ff98e646a4a56c5a1a6a8ab72a41a48b72dea6fb35748e5dd4ee8e2e0d", + "previous_block_hash": "616d09296fd9dfa108d859a8fc5042252e1a9b88277df2e5adef2336559b52f5", + "timestamp": 1429077494, + "fee": 8996, + "version": 0, + "tx_body_hash": "231254039042675300dbdd61a6ca54941214e383b5f6380323f848482b4f4628", + "ux_hash": "3241684b9e1c9b5d244b302446b9f947097a312397c04e59bc10ce01212e533d" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "231254039042675300dbdd61a6ca54941214e383b5f6380323f848482b4f4628", + "inner_hash": "ddddc962f9ad468e32f141dcf8479e2ec2293d42a32b2085fbaa0b5e9f80a267", + "sigs": [ + "7cb704180d085d04db6816852111cf3dad3c911337af4e22596c42efe77a45983539abe92b0f08993559f87ac2e4ddb907e46c36c6a746920f2fd0c89b0b7fc201" + ], + "inputs": [ + "5fa90c22a26ecec8c03696a018b590a5e1679efa9cb5e8263facf9bcc6628db6" + ], + "outputs": [ + { + "uxid": "e4fa8fe06d04bb438323f295eea23535856be08b369be71a2ce3e9e7bc0b1e09", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "7000.000000", + "hours": 1499 + }, + { + "uxid": "cec910b5d672e216db306389dc9ebb08f9d37485fbc3ac6aa7a8c37f60be844c", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 1499 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 53, + "block_hash": "a8f4e293af2cec10febbd7b632c8ed15477cae6dfd98060d007fc2538a4d2b39", + "previous_block_hash": "8536b8ff98e646a4a56c5a1a6a8ab72a41a48b72dea6fb35748e5dd4ee8e2e0d", + "timestamp": 1429077514, + "fee": 17787, + "version": 0, + "tx_body_hash": "d154d8262abbf517c67d529b0fea7cdf097433bd296d5795b17c6379cb1b1430", + "ux_hash": "84e514782cf16533fd2794f2f58b184ca4e4e3459ef4ca9a39da4e1be0b4c3bc" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "d154d8262abbf517c67d529b0fea7cdf097433bd296d5795b17c6379cb1b1430", + "inner_hash": "b69070b10e6bbc276bf155361d7f3238fec46b9d865075c1dc0fc20d81ab0a42", + "sigs": [ + "0a4b7f385a164f5718794382d49c14a6623e7af5f1ddbefe4871c756b754457a7075e822603bd3b22b313278abebe756be92367ef7a81a8c4adf992842c2058601" + ], + "inputs": [ + "e6d9b56e075a6adf520d1ae7fbab9ae06353ae0b93dc8cb17d82cc3628009a50" + ], + "outputs": [ + { + "uxid": "2df1e88589be43c55d7c6c3dbcbd663fb759b3245eb8d86b0b9cdaa989556aea", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "943750.000000", + "hours": 2964 + }, + { + "uxid": "c7919b892eeb751456d456b37ccde7350a3fca0dda03b17ec426a56f12dcf192", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1000.000000", + "hours": 2964 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 54, + "block_hash": "a6f4b95091450f21961f12aabd6ff7791aec37b775a9728a0fd970124aa82e85", + "previous_block_hash": "a8f4e293af2cec10febbd7b632c8ed15477cae6dfd98060d007fc2538a4d2b39", + "timestamp": 1429077524, + "fee": 1153, + "version": 0, + "tx_body_hash": "88d239f2584c78b73a1905fd0dcce3beabfdfc5a9c54518862b009e22e972c68", + "ux_hash": "3d81d11b54c9272629d1384de9c386c84337aafb9ffb604cea3a6cebacd0078a" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "88d239f2584c78b73a1905fd0dcce3beabfdfc5a9c54518862b009e22e972c68", + "inner_hash": "bbb61ff8c3b3361e77eae47d4a65c4073e45ded96994efbe605fa7639486b2ba", + "sigs": [ + "c627aa6233c7bc436f7569399554ead829bd21244cb1f938cecde96b493d1ac84099844dc91bbdcf72593285c33f124dba2d3aa1b7807532d647484492b8760900" + ], + "inputs": [ + "e4fa8fe06d04bb438323f295eea23535856be08b369be71a2ce3e9e7bc0b1e09" + ], + "outputs": [ + { + "uxid": "f5beae016bda8260218fc05468c300fa71ddd46f4c6337fffac8d83229461f5f", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "6000.000000", + "hours": 192 + }, + { + "uxid": "470b293870b663b84e1f677e1bc0e486d0b5f412b0562b078a7a1045f7785d7a", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 192 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 55, + "block_hash": "62cdb4edf2a82b894ee0540a494979007ea32ada552321c3daf00700659652b3", + "previous_block_hash": "a6f4b95091450f21961f12aabd6ff7791aec37b775a9728a0fd970124aa82e85", + "timestamp": 1429077544, + "fee": 5583, + "version": 0, + "tx_body_hash": "374f01de8274656147be0a23ccc5677773da6f32b071ee796bda0851b6dcd2ac", + "ux_hash": "64c7ad66527c657e10c2813b87dfc40a0c0a8638c47b925e0d5988ef7282b768" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "374f01de8274656147be0a23ccc5677773da6f32b071ee796bda0851b6dcd2ac", + "inner_hash": "1789978d61189b7e49bea67d8a1d1f0341da0242cb0b801c4d8bc346ec2fd618", + "sigs": [ + "f706829ee37d3f4467aae6341bd20c0455ae172a947ca372028db7f9b1dd2d7a4123b109eba8d4add2f695f6a7aa5806840551096f5357ce09be55e1877fb70c00" + ], + "inputs": [ + "f37efd851f76854852fdb8b8ba9afa2c5b7859315cc1fd12c12bf6831c59beb2" + ], + "outputs": [ + { + "uxid": "298fabb8217a2b0322f104b0cb295383bfdbc599d6a81e07610e0922eb99f89a", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "8000.000000", + "hours": 930 + }, + { + "uxid": "2f1de81eaa83eda52d8eaf44b12599b23134a38b7d55f67de8881ddafbec278b", + "dst": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1000.000000", + "hours": 930 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 56, + "block_hash": "8ffb8910411fee24ddbed4b8775a2d9254f644b12c48f05b3edc6aaf5c0161b1", + "previous_block_hash": "62cdb4edf2a82b894ee0540a494979007ea32ada552321c3daf00700659652b3", + "timestamp": 1429077554, + "fee": 76179, + "version": 0, + "tx_body_hash": "8fba29db2e3e8cad785e723f95aa5fa46ae0dd8b2bb62586977f20e698642cfb", + "ux_hash": "06ec76934a86bc53c39937cff9ba786c83ae1b1e6695bad5a3864611014f9861" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "8fba29db2e3e8cad785e723f95aa5fa46ae0dd8b2bb62586977f20e698642cfb", + "inner_hash": "dc25f33c3b93678ccc3449a318d55782a274c17cd2f45089018bd7c55b21dd96", + "sigs": [ + "6fbe79a6f32b242f97f7e7662e6f7eb5aff065e8063864fc52159071005ffb2570c26a2d8b21a7826cf18c15f4f4ed9b718a7a9fdf1b4d5ac63bdb632452c82401" + ], + "inputs": [ + "df5d6e09da2585a6ac1a37aea2370fa25e9049b549049202d5417138bf033cfa" + ], + "outputs": [ + { + "uxid": "3d7dd4d41e613fe8153f5e5f62b79494e9db9ed98f875d929ca1f90ecfe2d50b", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "9000.000000", + "hours": 12696 + }, + { + "uxid": "9e53268a18f8d32a44b4fb183033b49bebfe9d0da3bf3ef2ad1d560500aa54c6", + "dst": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 12696 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 57, + "block_hash": "371e2ba60743ca0c07e2fd88b3b53ba39fb0cb9e6aad12a7761e6821903ed25c", + "previous_block_hash": "8ffb8910411fee24ddbed4b8775a2d9254f644b12c48f05b3edc6aaf5c0161b1", + "timestamp": 1429077584, + "fee": 10088, + "version": 0, + "tx_body_hash": "61a33b49e97bfe2d5f026bf45fae43a1b9bdf08c60ec8db017da720a69790c7f", + "ux_hash": "453b6d29b16a4858982f81e90d8189d94878d6b215cb1f949982e650576bef8f" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "61a33b49e97bfe2d5f026bf45fae43a1b9bdf08c60ec8db017da720a69790c7f", + "inner_hash": "32d2dce8e8043e544b3cb2145b0bfb9d4cfdb7ae8e20437d075f76b75d8e088e", + "sigs": [ + "990bf0a8c74b0b4c4d05f463a0a50e311a6ae27b5d327dcb906bb6e42330709d48998eed6e7cbdf35caeab6d90fac3e56fb222032aefa7b1d4d9c7653aca9fe600" + ], + "inputs": [ + "2df1e88589be43c55d7c6c3dbcbd663fb759b3245eb8d86b0b9cdaa989556aea" + ], + "outputs": [ + { + "uxid": "c5150380691c542b9bdf4cf2280ac612e0576c349f99d47d0a03c77eedc48731", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "942750.000000", + "hours": 1681 + }, + { + "uxid": "3b9059ec909faf64d652dae78944f4a2737df95a3215bf98e2ff33e02e2b377f", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 1681 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 58, + "block_hash": "f1ac8e75dc1d735737bd0d6f7bbecec46283352f100a70b5b8d26835640c210e", + "previous_block_hash": "371e2ba60743ca0c07e2fd88b3b53ba39fb0cb9e6aad12a7761e6821903ed25c", + "timestamp": 1429077604, + "fee": 220, + "version": 0, + "tx_body_hash": "5d1cb86b48c8834c8c12fc36a83259609300f2f6a148faa1492a473cee21bc02", + "ux_hash": "0b67862cfc42f6128307f583efe4ee78167523cc90d6308a0616f9c9a5470b45" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "5d1cb86b48c8834c8c12fc36a83259609300f2f6a148faa1492a473cee21bc02", + "inner_hash": "34ee80da7f19e17ab8b49569ad514135f6e6120c67288c8f613b758b9db8658c", + "sigs": [ + "228340c209abeb45fe25b93bfccbf08cc4faa1abcd89c95bf0332de0f9846f642c68fb68f49f4dfe6ed556c2e8b86bab6127d47de518179ad467af637e264c7d00" + ], + "inputs": [ + "f5beae016bda8260218fc05468c300fa71ddd46f4c6337fffac8d83229461f5f" + ], + "outputs": [ + { + "uxid": "53ea8733d94ae54bade0b55df03a03b3c0f6e6683b9260c36b14e3fc311d6f49", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "5000.000000", + "hours": 36 + }, + { + "uxid": "d58f3facfb4c9c9459e6fae3000886acb2b1f81322725cdc32cc09a49bb81e43", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 36 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 59, + "block_hash": "439660598874b2e404075928f537ae474b5239ce650f24507429f47f292d3dff", + "previous_block_hash": "f1ac8e75dc1d735737bd0d6f7bbecec46283352f100a70b5b8d26835640c210e", + "timestamp": 1429077614, + "fee": 799, + "version": 0, + "tx_body_hash": "4ce860140dbb5f90f39086b0c51323005145a95b365204bd33e3d90fbdc35f51", + "ux_hash": "790eb4c054ec7664e0775a7012ace595d6daa8fb8b87ce11196592fdc713d56c" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "4ce860140dbb5f90f39086b0c51323005145a95b365204bd33e3d90fbdc35f51", + "inner_hash": "d81940dc03cf3fa1fd3eeadb84ae46e472bf3e281754a79eade7029b5ae1f639", + "sigs": [ + "dbc7327f85a323193b59dde59d2656c8dfeb2b94c40dd01ca70f379d14a7b9123473b7cdf38df1196b55f2c01c4a31ed1c9ba7d75f6670deef3b9816656add2d01" + ], + "inputs": [ + "298fabb8217a2b0322f104b0cb295383bfdbc599d6a81e07610e0922eb99f89a" + ], + "outputs": [ + { + "uxid": "1efc8693845733061e1407a74e86976a52a69c63a14d6a79e1f3e45277662900", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "7000.000000", + "hours": 132 + }, + { + "uxid": "53d7b4778ee9b9537c0439666ca124d81bcaf4195d080ef61fade8c3eae6322e", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 132 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 60, + "block_hash": "5461cd2134a695ade2c7bdf53f7ad18bbc6635d4241e609e7612ac2a7387ba37", + "previous_block_hash": "439660598874b2e404075928f537ae474b5239ce650f24507429f47f292d3dff", + "timestamp": 1429077624, + "fee": 9636, + "version": 0, + "tx_body_hash": "77a69f4c8afd858a2f6767bb9980d4af6520e02b076bf2a78b935021e1147c71", + "ux_hash": "89c92403dce794e750618b5abcfcb03ccf102d8a2475196dee462bbeb3d8d9e9" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "77a69f4c8afd858a2f6767bb9980d4af6520e02b076bf2a78b935021e1147c71", + "inner_hash": "65f97c460ed99ea47ea2cdfd0780af2338f78d80bff93b92dc2ccc8f2411abec", + "sigs": [ + "7c32e34864bc9659222cb26f10058df5cf2fe0c7b78b1d067a7b5af80f4a2b146f8914f4424d9e80a3303d3d2531ddf9d60489011c607ecd5f92cefa5105eee501" + ], + "inputs": [ + "3d7dd4d41e613fe8153f5e5f62b79494e9db9ed98f875d929ca1f90ecfe2d50b" + ], + "outputs": [ + { + "uxid": "77769e6a01cf3dca201ade501767d0abf20dea19d694f3272b647a9a651fdee9", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "8000.000000", + "hours": 1605 + }, + { + "uxid": "0560bae3917bca7581af9b6c5a58e395c701ce9ed0241dac2de8a3e93c0b839b", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 1605 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 61, + "block_hash": "bd5ecd0a7a96b94b93406a27ddcf4155db32ae7434e19d1210412f86d62401cc", + "previous_block_hash": "5461cd2134a695ade2c7bdf53f7ad18bbc6635d4241e609e7612ac2a7387ba37", + "timestamp": 1429077654, + "fee": 9118, + "version": 0, + "tx_body_hash": "4aeafd20b9df56ec852a2c257ff1630b9530d8375a4e72f20238ea36835f76d5", + "ux_hash": "ada8c5ad5da401c9859ccd0b505b2052be5d3e71865fe4ba0b05a17073e2b287" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "4aeafd20b9df56ec852a2c257ff1630b9530d8375a4e72f20238ea36835f76d5", + "inner_hash": "bc6119c006f7c54c8608cc8050f47c43e6c079397f607f8c9e90d3072a10eca5", + "sigs": [ + "0309322d16d48a35bd42c2ae6a76b240b21974d073f81f440e04431941fc9d550de92dcbcb226ad3baae2b3cbae51db28b2dc8d3e1b51cdd559cbbb6e4b71eda00" + ], + "inputs": [ + "c5150380691c542b9bdf4cf2280ac612e0576c349f99d47d0a03c77eedc48731" + ], + "outputs": [ + { + "uxid": "9bbb8d620aae3efc7c21bb7d6a7159eda441a83e0fef2cd98f8240b38857d648", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "941750.000000", + "hours": 1519 + }, + { + "uxid": "2480aeed2dc47c692e4bce61fb3ee44c4992ea39b0a167235e501330d7ddac62", + "dst": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 1519 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 62, + "block_hash": "e103dbe63feed4fab951dd5de742ace3fd72750f7d48c4940f55f65bd7dca7b1", + "previous_block_hash": "bd5ecd0a7a96b94b93406a27ddcf4155db32ae7434e19d1210412f86d62401cc", + "timestamp": 1429077664, + "fee": 79, + "version": 0, + "tx_body_hash": "057ae2bee6e1fc2c9997d48aab3e348a7f17ad0305d6e6a14f4f663404b4a00a", + "ux_hash": "4e0cf3e7a61064664738416c30a67af01c33bfc031bc662c935e14221fe1ab81" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "057ae2bee6e1fc2c9997d48aab3e348a7f17ad0305d6e6a14f4f663404b4a00a", + "inner_hash": "7b253041d4c467262bd144354f1584fc37b1b3a2934b0230919838e60a4320dc", + "sigs": [ + "7587f95e4036b310ce3bafbd1248ae62210120c14c2569d358f0f1363120626060e0797c9728a2cf3cef7839fa6e9d42d31ca899cfab82fa3eb8a0401c3cb8e301" + ], + "inputs": [ + "53ea8733d94ae54bade0b55df03a03b3c0f6e6683b9260c36b14e3fc311d6f49" + ], + "outputs": [ + { + "uxid": "83b5fa4051dbfd50ba903374e5e583a9345c6a980505ee56963de9bd8e539e36", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "4000.000000", + "hours": 13 + }, + { + "uxid": "b9853ab091bdb295de20d765e9bce2d86870791a6a15b8ef9e9dddb71c4cba95", + "dst": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 13 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 63, + "block_hash": "cf9cdcc235d2bb70cf8ef1420d42f35893fe0c2645540bde77694a000f63c274", + "previous_block_hash": "e103dbe63feed4fab951dd5de742ace3fd72750f7d48c4940f55f65bd7dca7b1", + "timestamp": 1429077684, + "fee": 1271, + "version": 0, + "tx_body_hash": "8d10b0ba11d9dd63d3a3522bc35bd260e8da9109298aa488355ea7201eb961b7", + "ux_hash": "146aa609909e365dfa1e1537f21e2679a729846224f4cc906fbc79e11f2547dc" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "8d10b0ba11d9dd63d3a3522bc35bd260e8da9109298aa488355ea7201eb961b7", + "inner_hash": "929218d56de3e94d277827c857a657ef8b1352f75e6938ff5cf10ac4c54d4039", + "sigs": [ + "6c8892c3277b90f5ca71a42515706de993c459f094282fa99168359f00c5cb862811c4225cc1448e99ba2755e9f9eb241ad0df25b20f1a6ec035a673cf42ab2f00" + ], + "inputs": [ + "77769e6a01cf3dca201ade501767d0abf20dea19d694f3272b647a9a651fdee9" + ], + "outputs": [ + { + "uxid": "f5867b05823c81fc53de36b140415b3b98e4f4cec5883512f8553f70c550d8e7", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "7000.000000", + "hours": 211 + }, + { + "uxid": "9011fbc6e82dce0656e7ffc76afb014d2ad70aa4663e7b687d3212e12f8965e2", + "dst": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", + "coins": "1000.000000", + "hours": 211 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 64, + "block_hash": "b6692c358b6642ca1321509e032a479086ff3ebeb596957e12c4c2e5b68c24be", + "previous_block_hash": "cf9cdcc235d2bb70cf8ef1420d42f35893fe0c2645540bde77694a000f63c274", + "timestamp": 1429077694, + "fee": 7026, + "version": 0, + "tx_body_hash": "29c229c97d27bcaf842a367520e1916fb855921906bddf4a3b0413ad3f11517b", + "ux_hash": "a2484ef64ef7dbfc9f694aa080d3a333972e795371b3762a973549c929136e3f" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "29c229c97d27bcaf842a367520e1916fb855921906bddf4a3b0413ad3f11517b", + "inner_hash": "bc02dde29d200fa6bc0497f2ddd5e52007aef9b6482d40953fbd44ed88e3cf78", + "sigs": [ + "0674c0617c9e6109ca9af404d446777943bb6aaa5dcb223da63bff1a305498972735e0b2a601cc9c6ee2231ad5fdd025fb92cbb00e200860a2ebde924f76499400" + ], + "inputs": [ + "9bbb8d620aae3efc7c21bb7d6a7159eda441a83e0fef2cd98f8240b38857d648" + ], + "outputs": [ + { + "uxid": "25ad0d5ae6a1a9bc61c6b9099fb7829111977a59e1183de4227a0a5352555639", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "940750.000000", + "hours": 1170 + }, + { + "uxid": "47c74a6d7f1f54cf0a7ac45ec00277539079810068dd95a29a202c43780d65a0", + "dst": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "1000.000000", + "hours": 1170 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 65, + "block_hash": "a8dd413f76f33d5cc1abd6d429098a75805137a02d8100fbd98f1b2fca62af70", + "previous_block_hash": "b6692c358b6642ca1321509e032a479086ff3ebeb596957e12c4c2e5b68c24be", + "timestamp": 1429077724, + "fee": 36, + "version": 0, + "tx_body_hash": "e3b7236ad4b209d664ee1e2549f2a0d34a3ba58b12ee46f98fba73c01574e484", + "ux_hash": "6231253b3d6f8a4d8383f750e1f98cecb128cf73820ad6e19a251abe76970e94" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "e3b7236ad4b209d664ee1e2549f2a0d34a3ba58b12ee46f98fba73c01574e484", + "inner_hash": "30b5c520717641fa7a5b11c5340e6f239d1502d90809e919003004048582e8de", + "sigs": [ + "3c90ea0882c24e0e17f9f453f7777eba42aa5fea386f21f8f873969a0118d12f0a81169e3600d68026cbbe300b63568db468cbd931087eb0de8635a8453efe3201" + ], + "inputs": [ + "83b5fa4051dbfd50ba903374e5e583a9345c6a980505ee56963de9bd8e539e36" + ], + "outputs": [ + { + "uxid": "70dfcdd1a8a321ffd22c4ce313763464f78c2f85a97bb369ac8b82f76d2ea961", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "3000.000000", + "hours": 5 + }, + { + "uxid": "c2fcd55cf6b73e863c96f7c2d6251069199bfd43688d2515f5c6631688aadcbc", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 5 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 66, + "block_hash": "0816061820617c7318004eb8893b7b7c49fcac1fda0c655d6f75c57edcf5a1a5", + "previous_block_hash": "a8dd413f76f33d5cc1abd6d429098a75805137a02d8100fbd98f1b2fca62af70", + "timestamp": 1429077734, + "fee": 259, + "version": 0, + "tx_body_hash": "bbd1d4b6fe89a5986efbea9f7996cca2a515c3f0788cedccc21990dc78d83509", + "ux_hash": "47b6b7ce444902e1a0c96aea06bcb6e70ad6b41476e02ba536cc82c765743f8b" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "bbd1d4b6fe89a5986efbea9f7996cca2a515c3f0788cedccc21990dc78d83509", + "inner_hash": "f5b418d7156e6ad70bbde6d90be61d4ab2fce406890a3fe764ae2a43da12440d", + "sigs": [ + "1fd3e13f0e55364107d6916ab5002bcc434889e5f5355751f1f688ac469f336d09161f516770cc78f1ece3cb790a1ded56e25948a46546c8d521dea6b3141fad00" + ], + "inputs": [ + "1efc8693845733061e1407a74e86976a52a69c63a14d6a79e1f3e45277662900" + ], + "outputs": [ + { + "uxid": "3fe6b13824f28d69588c309278420069bc0efae95367d0d6f93cb40af15eeaa6", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "6000.000000", + "hours": 43 + }, + { + "uxid": "06292fe8a2036c38f28c4d2f355d9e86e2b55b9d85f84613a64cf5c35d192b28", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 43 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 67, + "block_hash": "7b9a543120ed5b65c8b988b763e09b4ddc9c36eabe1c56d0fd7b26072eaf9fe9", + "previous_block_hash": "0816061820617c7318004eb8893b7b7c49fcac1fda0c655d6f75c57edcf5a1a5", + "timestamp": 1429077874, + "fee": 8718, + "version": 0, + "tx_body_hash": "42227683dd9c149859d0578ab300d8509d513afadf7834fd8ae7a321cc07d833", + "ux_hash": "afb39102e6b76ffcae61504432b16a5309cc6839766b3fb365b5bdbcad318dd2" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "42227683dd9c149859d0578ab300d8509d513afadf7834fd8ae7a321cc07d833", + "inner_hash": "a7a9ea6466bef6cd63f671ae5dd1aafbeb251a717c7da331d40ec376ad0e89ec", + "sigs": [ + "b4a141eb037a4debd99c347f337f67662a3feeb96112d7b05fc035a3556419dc3a9b35028327d925ca5eb9da018371bc333b7365f06ea22366169af6f066524701" + ], + "inputs": [ + "25ad0d5ae6a1a9bc61c6b9099fb7829111977a59e1183de4227a0a5352555639" + ], + "outputs": [ + { + "uxid": "acc75d51ff9f18a224d1ca0481917e2a67298de40955711cd97a08f6733b5b6a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "939750.000000", + "hours": 1452 + }, + { + "uxid": "8bdd2662d7ed495ff82daef9198ee23ac0c75417607675a8da3dd673952c0e39", + "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "1000.000000", + "hours": 1452 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 68, + "block_hash": "0916d93411a574d88a89d8b7646b1876b036e10905cb8fc04d81e1f09a1c3459", + "previous_block_hash": "7b9a543120ed5b65c8b988b763e09b4ddc9c36eabe1c56d0fd7b26072eaf9fe9", + "timestamp": 1429077914, + "fee": 1090, + "version": 0, + "tx_body_hash": "d803ab903f68f7861cd8eff93b3c097c5b8f6a697ca67bb01e7e645060839fd0", + "ux_hash": "1f34f1f16f2e80571b058019258b893019e01bb338870e631711c1755fa0e4fa" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "d803ab903f68f7861cd8eff93b3c097c5b8f6a697ca67bb01e7e645060839fd0", + "inner_hash": "611f096c50da1d98c29b8c9bdc6b7f7c98d96061ab126c66716f17a2fc495166", + "sigs": [ + "d264a023bc6986c1bf16e2e697f4df8b6e33ae2d4b1ddd4e207cb5f902fed54c1234c3ef2429d82507f5c10c0fb4320d753f3bf6b5e155fa3ec03bc91dd8206a00" + ], + "inputs": [ + "acc75d51ff9f18a224d1ca0481917e2a67298de40955711cd97a08f6733b5b6a" + ], + "outputs": [ + { + "uxid": "5c1069a3aa6628ed7f9bdb300bec1a7e7ca6fb4645528a8c6a27c167e7dfe698", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "938750.000000", + "hours": 181 + }, + { + "uxid": "3c56fa9d161783d6fe5c8b055c6d20bae27097e7bcc44d9ece5c94df182ee5bf", + "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 181 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 69, + "block_hash": "8a65ad3031102e032275f0c24bcda248a5af548eef4cff5570f9530ced70ce5a", + "previous_block_hash": "0916d93411a574d88a89d8b7646b1876b036e10905cb8fc04d81e1f09a1c3459", + "timestamp": 1429077944, + "fee": 137, + "version": 0, + "tx_body_hash": "3bf485890e91268452dc3136c0b294dc9909b3aaa10b9c936743e6e9b1a56f61", + "ux_hash": "0fb49592b74e8fd720494fc2bd6a768099381137872e93db7aaba814ca8848a4" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "3bf485890e91268452dc3136c0b294dc9909b3aaa10b9c936743e6e9b1a56f61", + "inner_hash": "e952e5d86f3cff105dab78a455691c871f3b0fd09558e367833c4743339b94d3", + "sigs": [ + "632771f1bdae7454911dcb6462aee56827f949dae18e8a98168b57864a62333f4251e17efa15a53ec12ab6980ea72838e9bb0e64aad82ad9e6a0a2a33b3006cd00" + ], + "inputs": [ + "5c1069a3aa6628ed7f9bdb300bec1a7e7ca6fb4645528a8c6a27c167e7dfe698" + ], + "outputs": [ + { + "uxid": "8190fd31c005510d550c8a241b127fad2558c82aed9483fb4423193d5f4429e3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "913750.000000", + "hours": 22 + }, + { + "uxid": "5a7b2b6568cfa4ff5d44e98446aed92438ede0103b9994cfa3389bd02a35239b", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "25000.000000", + "hours": 22 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 70, + "block_hash": "3ef495620acbcd39eb8a0ecbcac390b72be620c81c2e5c8730bd7457bd1ecb3e", + "previous_block_hash": "8a65ad3031102e032275f0c24bcda248a5af548eef4cff5570f9530ced70ce5a", + "timestamp": 1429077964, + "fee": 18, + "version": 0, + "tx_body_hash": "f51e2ce31961b0186e04cc9d78857c3c21d3e2afb25c050d8c1d67d3320fcc07", + "ux_hash": "2b0d5300dd48c11d46e185ee52c7906ef5f1f547a19cced5376335696c1cfc78" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "f51e2ce31961b0186e04cc9d78857c3c21d3e2afb25c050d8c1d67d3320fcc07", + "inner_hash": "4a8b13ea0c8a993b3455a374e847bcbea7e7a20392c7cc169cbc41778e65d6e3", + "sigs": [ + "74f886780a9df8f6987c8c60bf5d9ad0fc25a502ba8f681188923d3a85f74bb87d57b067e53ed0f423ee7fbb352f3260e65c38e44cc7eec8fe8224374fd77cc800" + ], + "inputs": [ + "8190fd31c005510d550c8a241b127fad2558c82aed9483fb4423193d5f4429e3" + ], + "outputs": [ + { + "uxid": "450cd7795bb3625daa99d6b64b9a8786d593bf1cad986d6c2933dae04b74a593", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "888750.000000", + "hours": 2 + }, + { + "uxid": "9639a86df8da288fb0fc6a92fa086f3cd5a8387705a14ddd2aa5e30c6c3fc3fb", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "25000.000000", + "hours": 2 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 71, + "block_hash": "1ce626f7ffc4affe11bcbac9b0eea5d23383803c714be1af8f97b1e58aef1138", + "previous_block_hash": "3ef495620acbcd39eb8a0ecbcac390b72be620c81c2e5c8730bd7457bd1ecb3e", + "timestamp": 1429077974, + "fee": 2, + "version": 0, + "tx_body_hash": "abed13c2a552633d26b5b51c3ac5abf9808756c0203869ed185a7cd673702ba2", + "ux_hash": "589b2ec4bab9cad26ab92dd189e3b4cc64701e8a82d97c6b19efcab980d44824" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "abed13c2a552633d26b5b51c3ac5abf9808756c0203869ed185a7cd673702ba2", + "inner_hash": "c176a1a85f716055a9e8060c2a4245db0d7f71f4ac5387d4a51d173db467150a", + "sigs": [ + "40e8340047f08afd483b2867166e15ae751bb7272a2c24f68ae8561d3619ea021363e987118a2fe516cacff1946d4d6c4c249038581ee2f58f8feea4bcffc3b100" + ], + "inputs": [ + "450cd7795bb3625daa99d6b64b9a8786d593bf1cad986d6c2933dae04b74a593" + ], + "outputs": [ + { + "uxid": "b44ee00208690c2123989f40edaff0224825afb20ca0952fbd90bddfd3213642", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863750.000000", + "hours": 0 + }, + { + "uxid": "22edb5931e1c54382f18e41ef774931efb08c278209a1fe8a34100147b707220", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "25000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 72, + "block_hash": "8daa2e02f6154135a2ecb309ab14a1a3af7101d53ee1a35c15335e463b21c883", + "previous_block_hash": "1ce626f7ffc4affe11bcbac9b0eea5d23383803c714be1af8f97b1e58aef1138", + "timestamp": 1429078004, + "fee": 558, + "version": 0, + "tx_body_hash": "3872797c8f9964e6ad19552b9b88d2af07be32866bdb9b9c60aa7086f253af43", + "ux_hash": "62b5aa989f79cc3d398f4047a7d5df9f35ca6098fbca504d819b95529bd77222" + }, + "body": { + "txns": [ + { + "length": 414, + "type": 0, + "txid": "3872797c8f9964e6ad19552b9b88d2af07be32866bdb9b9c60aa7086f253af43", + "inner_hash": "5784542f1b1f9284f25c8d3995429e77b1c0cbdf4b1eeb6a1737f5f19b0b576f", + "sigs": [ + "cf51ea4b5631baaa43dcf258cf08f6f87fe4fa9afb2d081e7eeacf6be3b1239058e30d931d22d3befcbde12b51399b438cd8726670f10c0da3889bc08917fb5601", + "bfa55b86721bd2d92144e2108123cc33b62ef50da580fed9d6787cbcc1674f63761ef4d39592f060e98b415c22d272066c36f6499ceb5571b19b4eae1c3110be00", + "3b50522194013cf9ea2dfc387be85c79c7e2379c1936d654c14921cdcbbbaab047a2ab1e09f3a190a09d12f70b41d6428b2e171732630b6a74eeb269853a404500" + ], + "inputs": [ + "3fe6b13824f28d69588c309278420069bc0efae95367d0d6f93cb40af15eeaa6", + "5a7b2b6568cfa4ff5d44e98446aed92438ede0103b9994cfa3389bd02a35239b", + "9639a86df8da288fb0fc6a92fa086f3cd5a8387705a14ddd2aa5e30c6c3fc3fb" + ], + "outputs": [ + { + "uxid": "3a7e60306a5fc882d0c4edcb2990d14be6b80dad1a41b06f8ae5e0308078bafa", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "31000.000000", + "hours": 93 + }, + { + "uxid": "a96ca17d6af858af8c6f24f607a742ae2979ab8f660b8363b7fbe18625c8a048", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "25000.000000", + "hours": 93 + } + ] + } + ] + }, + "size": 414 + }, + { + "header": { + "seq": 73, + "block_hash": "21ac5c256658c7758d4f6dccc34e209bc9ef1433f4036cdd7eff722c9f29a83e", + "previous_block_hash": "8daa2e02f6154135a2ecb309ab14a1a3af7101d53ee1a35c15335e463b21c883", + "timestamp": 1429091164, + "fee": 2326, + "version": 0, + "tx_body_hash": "a95317361364e8cc08a150840bac8a97ea1f56278f8834ca2a2f16c24c4a7f0f", + "ux_hash": "3ba29e2a1959b76b8e90a94686427e1ee461e6a90ab12dbbec5cfa6352e6dc74" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "a95317361364e8cc08a150840bac8a97ea1f56278f8834ca2a2f16c24c4a7f0f", + "inner_hash": "90c166e92a7883037f9634704923d986976ac814f28e4761309bf86d77cdb755", + "sigs": [ + "27ee3b614e5362462bc20c23e873e380b5bcc880053436a640286ead5fe2dcd00094e0eade532ffbfc8ba95d5e3540968b2fff64e19e0e772342aceb3c5d3ce100" + ], + "inputs": [ + "c7919b892eeb751456d456b37ccde7350a3fca0dda03b17ec426a56f12dcf192" + ], + "outputs": [ + { + "uxid": "7b132c07322babefa83ab64971b7bfb29bf2cb9ffe9c42dc7e2975a185dcd8b8", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "995.000000", + "hours": 387 + }, + { + "uxid": "8f52e126bbc359bc3bfd230d82649c3d1c622e8f9c20dae7ccd73bd0b4ee2bad", + "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "5.000000", + "hours": 387 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 74, + "block_hash": "bc712ef025d1281c3fc4922d64f1afdcf1bc6750b15239239a19d02c11284842", + "previous_block_hash": "21ac5c256658c7758d4f6dccc34e209bc9ef1433f4036cdd7eff722c9f29a83e", + "timestamp": 1429091944, + "fee": 43640, + "version": 0, + "tx_body_hash": "edca397ceedb5fb4462b0aff8fe7f9da5091a4e68f11a34c79daf2c5ae7dd748", + "ux_hash": "5704cffe1444e6e24bccba99acf0d6175cb6c6db3e2619cf3b1a9add81e110c7" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "edca397ceedb5fb4462b0aff8fe7f9da5091a4e68f11a34c79daf2c5ae7dd748", + "inner_hash": "873d38a9ff804dab8d83013a6e6b4132d0b0dde6439de24f2190ecd1d31f9ab6", + "sigs": [ + "0c3ca0de3f369e03859d710b18656c92c96b11b8c0e15e31b337293e59776b905f6ce7f91f7b3c9c268b6cb1673b8ef2ffe2dd7f059f7833b62284168bf2065601", + "7755689ff9c10e672b3311b1b69ed69ff82dbcc168683b75e77491c9d36f7a7f1ddd0801b5acbafb467baca8ab9f28cf7189be701bdf169749290ad4cb58e2a801" + ], + "inputs": [ + "9953e00abe05db134510693a44b8928ca9b29d0009b38d9c4f8dcdedee7edc35", + "8f52e126bbc359bc3bfd230d82649c3d1c622e8f9c20dae7ccd73bd0b4ee2bad" + ], + "outputs": [ + { + "uxid": "5f75082377566cf140c8f158e160ab6ecd1cdf02224c66865106fa1a75b39dc2", + "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "955.000000", + "hours": 7273 + }, + { + "uxid": "e2807345a3e76b7050038a9ec40d5a62bd4dcc6b1ed79f186213a32caf7008a1", + "dst": "j6pa8kdKqHbxRm2VXJVbzigQDFzqTVfvfq", + "coins": "50.000000", + "hours": 7273 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 75, + "block_hash": "ef4a2e771d88df1deea69cd55f952bc5e9e6f32424e6f4b5ff35ba05602a9584", + "previous_block_hash": "bc712ef025d1281c3fc4922d64f1afdcf1bc6750b15239239a19d02c11284842", + "timestamp": 1429096344, + "fee": 5455, + "version": 0, + "tx_body_hash": "3122b6b29ac470bfa18fbd1ef6d5ff76717e18ba25374215a5003557b4524f22", + "ux_hash": "ea36ebaf2a3e4a37487a1aac964240f60aa1b2b96aeb4e42c0d443d57218430c" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "3122b6b29ac470bfa18fbd1ef6d5ff76717e18ba25374215a5003557b4524f22", + "inner_hash": "f752c579e2f7663b3e13371c7bb94b09cb047f1cdb597bd52b79c8c81f557b9c", + "sigs": [ + "d12daa336401481611bf15edf07cfa0b181a1f3e2e8d062c6e8b04d690242cd87db5fd5aebda3bb06c49e8450c18c5c0360d6c4b14686cbb361feb394b5c26f501" + ], + "inputs": [ + "e2807345a3e76b7050038a9ec40d5a62bd4dcc6b1ed79f186213a32caf7008a1" + ], + "outputs": [ + { + "uxid": "ec41341d4c9d69e150079550a9051c4cb7cc3e2da49deb2c0faaa632cb1958f8", + "dst": "j6pa8kdKqHbxRm2VXJVbzigQDFzqTVfvfq", + "coins": "5.000000", + "hours": 909 + }, + { + "uxid": "ead07056919be961a9e812a7832356d806d551096284648756b3642a3d4a5570", + "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "45.000000", + "hours": 909 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 76, + "block_hash": "bc51c3788411589efac68dcaef915a14d83aecdbeb250cc48073774997e6cb28", + "previous_block_hash": "ef4a2e771d88df1deea69cd55f952bc5e9e6f32424e6f4b5ff35ba05602a9584", + "timestamp": 1429110544, + "fee": 432263, + "version": 0, + "tx_body_hash": "5369348d67b2dd30dd9164657e372304f81ea10dfe1914ba874d46cd659f52c5", + "ux_hash": "6c5bfb09207562e126ba386e7b106669fb86b94d33b3376c711c15eb47594ca1" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "5369348d67b2dd30dd9164657e372304f81ea10dfe1914ba874d46cd659f52c5", + "inner_hash": "08a8ae61257645c212216e63a96673001fa581c286eaa4ddcb81f6ffaaff8c1a", + "sigs": [ + "75489dbb081962833ce1fffbc393f0040e5c75bf45564a3757573eba816b71bd63e8178eef8add2277864d6d251013b6197bd80efdc069b7c5adf27b0372703c01", + "4587b09d2e08de8379fd1505748ea21db3995f2dd18b04ca729f2ebf76c2645a21acc2e5ca5f4b79f6381b91ef21fe4bb72d2415b74f38fc1569b90233211c8d01" + ], + "inputs": [ + "73ad63090201c13e6fb55d2e51ec5606fe49a40640bea995e347e7389fcea6c6", + "4aca4c715985da352bd9aa84787868dac4f4e305c420fe79e6f05acee3bba14a" + ], + "outputs": [ + { + "uxid": "50386f195b367f8261e66e3fdfbc942fbacfe25e117e554ca1c1caf899345476", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "25045.000000", + "hours": 72043 + }, + { + "uxid": "9c3119ad3edbd17a2135cac6d24ef43c6d7e599710b2aab4e97e731e64c13acb", + "dst": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "5.000000", + "hours": 72043 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 77, + "block_hash": "fc15f0118c4aafe443e8bd919355a89d61c88d22cc63b024ebb7872dbdb60497", + "previous_block_hash": "bc51c3788411589efac68dcaef915a14d83aecdbeb250cc48073774997e6cb28", + "timestamp": 1429147880, + "fee": 5860904, + "version": 0, + "tx_body_hash": "29798149e90f6442489bcc3294f455441a5a401e81491ed06bdc2c850756f0d9", + "ux_hash": "e16c215cddf959cbd0fc5143c4ab211dac70731fc4609e1124b7a5fa5263356d" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "29798149e90f6442489bcc3294f455441a5a401e81491ed06bdc2c850756f0d9", + "inner_hash": "23ab44d59346b369d258cce6d5142ca7e1b52dd09a1512d8a618e08ae7346004", + "sigs": [ + "6e0bd761d2d9eeb207f0c4cf9f13d1407f33b5f50e72c3462225c8041882ddcd078a02720d533801a433d917674e3d68a98bb997e9b06664a73a9bdeae46404601" + ], + "inputs": [ + "b44ee00208690c2123989f40edaff0224825afb20ca0952fbd90bddfd3213642" + ], + "outputs": [ + { + "uxid": "6060c983054614b8801e405de697c443a1edebd3236582f89f01c6cf6a165c3f", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "862750.000000", + "hours": 976817 + }, + { + "uxid": "08723ed501e11c2053bab6b500f820dd7ae2aeb4a3c9d5109845bb46afebde97", + "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 976817 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 78, + "block_hash": "6b8644bdfe7c2542fdcc03e15cf453d9d66604b728014fa4999797a89909bd0c", + "previous_block_hash": "fc15f0118c4aafe443e8bd919355a89d61c88d22cc63b024ebb7872dbdb60497", + "timestamp": 1429147900, + "fee": 407859, + "version": 0, + "tx_body_hash": "c1fb9372439d7f43d17809afc2d1bc9b2aa81fa9fccc1d837c79e649ec4843db", + "ux_hash": "0980923d75cda1985847ebfbd48e0c7bf853fd08eb38cd09277dd09cf60020f5" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "c1fb9372439d7f43d17809afc2d1bc9b2aa81fa9fccc1d837c79e649ec4843db", + "inner_hash": "283b6b1141f7b09348804d18171ec9b0d20446725df1265932a4064385c9c295", + "sigs": [ + "d16d6a7cd11064a91a6ca4917efe946cc38cb4e7dd59281a4b4098e39bdc151036b72fbf9db4f3ca2b97bdb56a861e8fbe010e52926b176172d3e68b85c7b04501", + "5cd9b19556656a6914d2f8a3daf556220e34eb567a741f015a9de0d53920bfff0e0cb3513551ed7ad95301ac8852487b76a3509832379c57572b46e75f0946cc00" + ], + "inputs": [ + "70dfcdd1a8a321ffd22c4ce313763464f78c2f85a97bb369ac8b82f76d2ea961", + "a96ca17d6af858af8c6f24f607a742ae2979ab8f660b8363b7fbe18625c8a048" + ], + "outputs": [ + { + "uxid": "dbe677fec72761ed99467a4d45871aafe173d7dc133e8db0346e3f262ae2598a", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "27000.000000", + "hours": 67976 + }, + { + "uxid": "ce4ca78d810564568c936554d0b6c1a50d91b273648314ffa3fcc1b2d72ac334", + "dst": "sV8sVBgs11uHQtZK5MPbYem2iJ6Hehghv7", + "coins": "1000.000000", + "hours": 67976 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 79, + "block_hash": "1313f73aa897ea032ac1de0741d0b026617933f863f59c4cfd0a3c7cf764f02e", + "previous_block_hash": "6b8644bdfe7c2542fdcc03e15cf453d9d66604b728014fa4999797a89909bd0c", + "timestamp": 1429147950, + "fee": 466755, + "version": 0, + "tx_body_hash": "2558a7cd524acdb58f822a56bd51e8905182b2b35fbfdb1246ce6dc9930d14eb", + "ux_hash": "869ce7a7d48b54f32c34faa2a3517aa7d67db11f5ce59325f9725c030c7151ed" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "2558a7cd524acdb58f822a56bd51e8905182b2b35fbfdb1246ce6dc9930d14eb", + "inner_hash": "37931a3c0b9fe54ebfd93e70c5e872ea8f68669bcd38176bc223be01f7e43aa0", + "sigs": [ + "1d2fa9d76a29f3ce2eda062afe42f3718db434863955ed4f43a83f79dd372a922fd2774d7f5227fa253c65537418b30309932f404e788db91fac1d580d83b28101", + "471ae24bbebd78b5d298edb81e07cc282ce8c1517a2d7426f91f177f111c93873c594e04a215bcd982220b0e6967bd328ec494811cf5eb854091e1d4552545e700" + ], + "inputs": [ + "f5867b05823c81fc53de36b140415b3b98e4f4cec5883512f8553f70c550d8e7", + "22edb5931e1c54382f18e41ef774931efb08c278209a1fe8a34100147b707220" + ], + "outputs": [ + { + "uxid": "09661724179523e8aec95862a5fd12dd1aa50f39f193f81eece0d7aea6197103", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "31000.000000", + "hours": 77792 + }, + { + "uxid": "2a886bcedf8862c351cc4087b89e902202b08b164363567a9be47908e938f280", + "dst": "pMub1Pz3SLVaSwHoomgp5oDVxdkVxLkW6L", + "coins": "1000.000000", + "hours": 77792 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 80, + "block_hash": "c3979d6a8c7b58e677c39350f3aea483ee4ca197d5e76d4a91f1abfdec9e4dc7", + "previous_block_hash": "1313f73aa897ea032ac1de0741d0b026617933f863f59c4cfd0a3c7cf764f02e", + "timestamp": 1429148000, + "fee": 51265, + "version": 0, + "tx_body_hash": "5db4378f5abcbb48774fc3731a164fb7bbdccf410c3ff829c5706e4d9ef1b1c6", + "ux_hash": "ae92c3b70cd1ee84ab8240daacbdf01e2ba39ccf7a590b74658d8afa005c4b28" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "5db4378f5abcbb48774fc3731a164fb7bbdccf410c3ff829c5706e4d9ef1b1c6", + "inner_hash": "3e77cc0080eaa29331c9206044e731992369bf84c89262c80d68b39b68ce77e9", + "sigs": [ + "94e4ecd0016b2c5b10f55941cc0355a2c248eaa04566dedcf84e83cfee959d50578cb85ca0ee6170060e97a6fc766fa79a4f6e0942605681178d4bb8009b31e501" + ], + "inputs": [ + "dbe677fec72761ed99467a4d45871aafe173d7dc133e8db0346e3f262ae2598a" + ], + "outputs": [ + { + "uxid": "fa761f3b902ced1ad8e94231af3447315a8c8bcdbbdcfcd69bb74ca5ae66f6e9", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "26000.000000", + "hours": 8543 + }, + { + "uxid": "e16c0ebbfba61c49b0e98bf8336bc4d8a33ca30386c4d875bba2ec4bf4a59147", + "dst": "22WGCstVJGVyqnBuvGHt17L5aNNMpURvckd", + "coins": "1000.000000", + "hours": 8543 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 81, + "block_hash": "44462e4f9906885068ab6e00e4d84ecfc2c17dfa599e41fb75805e035cb7b60d", + "previous_block_hash": "c3979d6a8c7b58e677c39350f3aea483ee4ca197d5e76d4a91f1abfdec9e4dc7", + "timestamp": 1429164440, + "fee": 754183, + "version": 0, + "tx_body_hash": "0cded82aa3ac92d78e23d2d0d7faf93c675fc9a321ad55105f65b6fca444b1e7", + "ux_hash": "7c481dd4fe40fc2b01ada90537c14a1266dc638a333ef72d38005e9c2c288916" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "0cded82aa3ac92d78e23d2d0d7faf93c675fc9a321ad55105f65b6fca444b1e7", + "inner_hash": "0ca2ed02f9155bf69af2fd27b40b0300e0c9804cbd2507389d930ef186f48794", + "sigs": [ + "68a82ec4421a37b8116c8bad98d2568802973dbce6f0166b3a9504110ee4873239953c3e8baf3a20d599e300c8b2c524d672c46ed593e126adc908f1decbbf5100" + ], + "inputs": [ + "6060c983054614b8801e405de697c443a1edebd3236582f89f01c6cf6a165c3f" + ], + "outputs": [ + { + "uxid": "129726406b3101d51ffd5bfca59a501184d6c8ca363be4ef1b8d8bf48a6c70e0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "861750.000000", + "hours": 125696 + }, + { + "uxid": "3fe7d61ffa993e00200ce6be7ba347c603032ac3f8c4ace07767e630fe94d76c", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 125696 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 82, + "block_hash": "d85c2e5a18844748cf354231f22106bf82ff6f860414d5b7d5e2afd52ea7c221", + "previous_block_hash": "44462e4f9906885068ab6e00e4d84ecfc2c17dfa599e41fb75805e035cb7b60d", + "timestamp": 1429164460, + "fee": 558303, + "version": 0, + "tx_body_hash": "0ad2691de38a15ec31b0fbe9a0c1175138c9d7b7558db2f016a23619f3dbbc6d", + "ux_hash": "46d65f755f018ad9a85c79773f57d048e9178178f63c1dd354c8db6cd97a46e2" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "0ad2691de38a15ec31b0fbe9a0c1175138c9d7b7558db2f016a23619f3dbbc6d", + "inner_hash": "3b3cc2ad41e6248b46bd71e14f91eb2296b730426a8f0481c440271920ddbe27", + "sigs": [ + "e5711c06db00c26d91126e9d024189c1a494ae1357b55247955a4b3bda219e8905dfa03875c1224e754e5e8b4d475d1ce335f2699cd9d490583cd6a0d1e1338c01" + ], + "inputs": [ + "3a7e60306a5fc882d0c4edcb2990d14be6b80dad1a41b06f8ae5e0308078bafa" + ], + "outputs": [ + { + "uxid": "dc8162cf85ce1a434adebab2d13abffb587c0e50b86fd1a997bca67f07a66ebd", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "30000.000000", + "hours": 93050 + }, + { + "uxid": "9bfa6dd7ff610b2e8ba036594244e70d427398eab8607d39be0e45303d45d4d8", + "dst": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "1000.000000", + "hours": 93050 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 83, + "block_hash": "af3db7055c27674d622fe70a3037e704900cdc4ec250972896df53da5f3d8755", + "previous_block_hash": "d85c2e5a18844748cf354231f22106bf82ff6f860414d5b7d5e2afd52ea7c221", + "timestamp": 1429164480, + "fee": 164971, + "version": 0, + "tx_body_hash": "d80d49958166fd7b35cee63cfc4a4fdd434484f9bfd9444f62a1b856da36e9c7", + "ux_hash": "a64f119533068375ed5a85cda7224a0cb794c41500727c2909d1e08575e4ab80" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "d80d49958166fd7b35cee63cfc4a4fdd434484f9bfd9444f62a1b856da36e9c7", + "inner_hash": "ddf70f29cbcb9ab5d04848c77bb605849c5d831c80afed10f64ea2bde710b7bd", + "sigs": [ + "21ccec8663f52b64e6d1983c5c715fc360ef1a01a0f4fce857fe7151e59b4cc87a5b6cc18f770eac98ef640eb15d572ea96b81e90a793bb01ac905778c10f0da00" + ], + "inputs": [ + "09661724179523e8aec95862a5fd12dd1aa50f39f193f81eece0d7aea6197103" + ], + "outputs": [ + { + "uxid": "6a8bc7ef9e8e7b67fd270cf37022edadb13f1fc2ba4e7a026f7ce2ab30cc4572", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "30000.000000", + "hours": 27495 + }, + { + "uxid": "a733e89023ccc12587d0849f9baeda0d2fad640c1cbe97e24ffc531859fd83fd", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "1000.000000", + "hours": 27495 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 84, + "block_hash": "65d91ebf581ddf3b620d960d20130e6ef881530b64030648330896b8a0bc0c29", + "previous_block_hash": "af3db7055c27674d622fe70a3037e704900cdc4ec250972896df53da5f3d8755", + "timestamp": 1429164590, + "fee": 20623, + "version": 0, + "tx_body_hash": "8374d85130bbcf496bff138cd040f91fa362eb1b6b6a1c7c9285523437d5589c", + "ux_hash": "c989c40c9ac5f17f49281254bca90873f4c196c220eef96209e0e60e7927554f" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "8374d85130bbcf496bff138cd040f91fa362eb1b6b6a1c7c9285523437d5589c", + "inner_hash": "3188ba9148add7f2811180f130de2c0668fc21c031a7329993b61bfe35f860f1", + "sigs": [ + "93edab2b508cd33cd76c50a5aeabcbcf35472d25ba2b3f268d1cc0a4a813fbe907f4c0e645893b4efd524d30fabb6ba62d65c2ee050057885eea2ca0d2d1c21500" + ], + "inputs": [ + "6a8bc7ef9e8e7b67fd270cf37022edadb13f1fc2ba4e7a026f7ce2ab30cc4572" + ], + "outputs": [ + { + "uxid": "15700b88043b3c08a46c3c4e36e7f431291a26aef1ef26c44ee413feee14b950", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "29700.000000", + "hours": 3436 + }, + { + "uxid": "e2512ec90800147d0d9ddbd0778511ee5a45a25efcb354c50a101738a65462c5", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "300.000000", + "hours": 3436 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 85, + "block_hash": "fcd2ae4cba80370929bc573a2ddeedc6b57750e4b58e5c063c5f17bb66e938ff", + "previous_block_hash": "65d91ebf581ddf3b620d960d20130e6ef881530b64030648330896b8a0bc0c29", + "timestamp": 1429164620, + "fee": 121202, + "version": 0, + "tx_body_hash": "b7b42b1b29acab0a2328aaf368ec74be49b4d4caf827e82b439ef4d8be976a55", + "ux_hash": "b5f5c67fc21c9259f089688afad62d15bbdacc51704d81b50d432e0a57fc35a1" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "b7b42b1b29acab0a2328aaf368ec74be49b4d4caf827e82b439ef4d8be976a55", + "inner_hash": "8b5eec10f63b31e72d4dba2c71fb0f7bc230e58f497e255352f02eee965d3595", + "sigs": [ + "82587c832f0c74f185603b934a32a28624712373d188caad0355314ea621a4af3e96dbd1c37e889f630d90047c79b39c495b49964eca20172bb900db1df48b3a01" + ], + "inputs": [ + "129726406b3101d51ffd5bfca59a501184d6c8ca363be4ef1b8d8bf48a6c70e0" + ], + "outputs": [ + { + "uxid": "05f42f22f5fea4b5cac8182dc2b4f280149c686434c6d4195a119a8d02ab24b2", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "861050.000000", + "hours": 20200 + }, + { + "uxid": "6e2abc4bc7820178358a603b7d99c4b39735dd1685d0c5a778ab63f29c9e93d9", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "700.000000", + "hours": 20200 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 86, + "block_hash": "21213b77aac2c84f332a43cbb89d7dbbb56e4de7c294fa50573d5f4165504d57", + "previous_block_hash": "fcd2ae4cba80370929bc573a2ddeedc6b57750e4b58e5c063c5f17bb66e938ff", + "timestamp": 1429164720, + "fee": 15150, + "version": 0, + "tx_body_hash": "ca51f9d0a19bf326d6dd39a1e4dd240adaaae279411093d4a5b20f54cddabb95", + "ux_hash": "dafc5be48e442e64240d3e432457f737fea6a0ee9b3cc6d5b192aa50cccb1252" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "ca51f9d0a19bf326d6dd39a1e4dd240adaaae279411093d4a5b20f54cddabb95", + "inner_hash": "47500bd3c5f74835a01b0f696e15780baec2ca3723f45355c9e8cd1c71564d18", + "sigs": [ + "fdbc112b10354be2b85b2f9131a3927e7b4e87ff8ddef91b849a71e0b1445ebc410b61d85ff7af1834b54febf89d903e3151f5a74ccef4e9607851c9005454d001" + ], + "inputs": [ + "05f42f22f5fea4b5cac8182dc2b4f280149c686434c6d4195a119a8d02ab24b2" + ], + "outputs": [ + { + "uxid": "4e1a98a72639efa6253a7cbea0f3b499fa24fb88612ad81414d20e46d2b5784e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "860050.000000", + "hours": 2525 + }, + { + "uxid": "ee69cfd4f15d16ded96745a35ef150f679b5b79cc0fd4009a2d02cdccd81ca3e", + "dst": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", + "coins": "1000.000000", + "hours": 2525 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 87, + "block_hash": "60279d08fadb94691ae4a32b29f69688dcc5e7b6f8e8d03fb3ff398d2c6f8456", + "previous_block_hash": "21213b77aac2c84f332a43cbb89d7dbbb56e4de7c294fa50573d5f4165504d57", + "timestamp": 1429164730, + "fee": 96974, + "version": 0, + "tx_body_hash": "cf5a1fad27f8f874f67d3162ae6347154c980ebd97c668d610280418f0f53ce7", + "ux_hash": "01793218345b2cb5af94baffc6b43d78439bd89e63c9c124e7d640ba07934597" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "cf5a1fad27f8f874f67d3162ae6347154c980ebd97c668d610280418f0f53ce7", + "inner_hash": "937bb1627381dc0e982b5b33a119a458db7605a5ff11df1b7a81957460157bad", + "sigs": [ + "53f091d0b653d50c32aa9bd24c09aa1671b2a8686f744a769a9568d3ea28f7852370d83429dfff6b16b9a721f2ecdf40fe799006229d575cec6e73174e7b84b500" + ], + "inputs": [ + "fa761f3b902ced1ad8e94231af3447315a8c8bcdbbdcfcd69bb74ca5ae66f6e9" + ], + "outputs": [ + { + "uxid": "a68c6c646b6bd42f509a82d0218c8ee648b4a40da20eb0599449a7249b10fee9", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "25000.000000", + "hours": 16162 + }, + { + "uxid": "f98e302e74d8972254b1cdc4de3ca78ff1e60f3f1b7083af397f3bcb219e9454", + "dst": "FtdApqw416skWtXM7ExanZWFmiHNPZ1Ft6", + "coins": "1000.000000", + "hours": 16162 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 88, + "block_hash": "5a708b4af0e1db02adb4016fb035b1df8bb3fe968b5de2c5c98178c4f3a209f9", + "previous_block_hash": "60279d08fadb94691ae4a32b29f69688dcc5e7b6f8e8d03fb3ff398d2c6f8456", + "timestamp": 1429164790, + "fee": 71476, + "version": 0, + "tx_body_hash": "efc98a4f94ffda2f1d6575048d75728f228a0bef0467c331f085a0f41f97ae45", + "ux_hash": "78a3643517aa6a128fedef4feb99693c629d1dbd749280dac09c6dc13c1aad20" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "efc98a4f94ffda2f1d6575048d75728f228a0bef0467c331f085a0f41f97ae45", + "inner_hash": "0134889df5d1e5c7a545f1cd6239ea51513534ed08acd503cc77e0b9d74ebcc2", + "sigs": [ + "9a2582b47df81a77ab148fabe81fa6b1c490b213e0cd79aba779be1c56c225d5591bc6674a08bce27103ce7e1e85756d31c96635ecc07ae40c53ccabb20d254d01" + ], + "inputs": [ + "dc8162cf85ce1a434adebab2d13abffb587c0e50b86fd1a997bca67f07a66ebd" + ], + "outputs": [ + { + "uxid": "b187246f68a768f65663b8a208ab107a9bc24af6a062acf3ad41aeb899315a49", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "29000.000000", + "hours": 11912 + }, + { + "uxid": "f713b6bde2e1956615b23021d20aeb829611d231e2e85b8204c01e5719ac8639", + "dst": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "1000.000000", + "hours": 11912 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 89, + "block_hash": "4fc95139dde67484d9613adb8d235ae42f8e6ec690377daf5f7e6afd375d3624", + "previous_block_hash": "5a708b4af0e1db02adb4016fb035b1df8bb3fe968b5de2c5c98178c4f3a209f9", + "timestamp": 1429164800, + "fee": 3816, + "version": 0, + "tx_body_hash": "a0956843d442bd4b592d0c1323d153c3c1b2d7d52a86629444de6d1d1b6a4c33", + "ux_hash": "2036f6edf1a278ca56ff144b61e7d92ae59a071979092a0a5cce1be9662334d8" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "a0956843d442bd4b592d0c1323d153c3c1b2d7d52a86629444de6d1d1b6a4c33", + "inner_hash": "0fd405b4d4a74b417a27d0bfd2f0d1acf4ed0499a000e94c64a1443c5bb440bd", + "sigs": [ + "9bd640adcf2e1870dd4cdd93f007759626ed9fd87dd8e0485888612ea660435a3104889820e6dab8d692efc3e4afb892de622c46b5f5c25718dfb78d4882d2ec01" + ], + "inputs": [ + "15700b88043b3c08a46c3c4e36e7f431291a26aef1ef26c44ee413feee14b950" + ], + "outputs": [ + { + "uxid": "24c49699aab32caf9456a6b4dacd4d820c853c7639e5500b3be6326660312917", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "28700.000000", + "hours": 635 + }, + { + "uxid": "63154895637eb000146996ffaeb7cc1a547e409d0a2038650e990e7cc9b36826", + "dst": "XnKU1htBL5wFSMX8oytZBsBMeaBSbVNivT", + "coins": "1000.000000", + "hours": 635 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 90, + "block_hash": "67d69d26e52c111625cb26629f53fb9d1fc350e584b14a42749a50a26bd0bb47", + "previous_block_hash": "4fc95139dde67484d9613adb8d235ae42f8e6ec690377daf5f7e6afd375d3624", + "timestamp": 1429164810, + "fee": 16229, + "version": 0, + "tx_body_hash": "bd617ec27c2bea642fad8c153178e11ca08456d752249324e3011f27c845f87a", + "ux_hash": "88b0746b83b29bf1614beb8304ab1cd34327f04f0d857ccbc26f3eb7092d4668" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "bd617ec27c2bea642fad8c153178e11ca08456d752249324e3011f27c845f87a", + "inner_hash": "f8ce5c9cc22005d7f63c0400132b0e70a6a8af574f1a5c1ffb0404f228a02949", + "sigs": [ + "b471a7bdde8b1427f8081d9e91250fd89cdd4dd23062796fe2ee973c612eb28b76f6c7ab4f3fbb7c7f9627c52158066d13d9fbe34dfdb6e77c02d84ff4d45d7d01" + ], + "inputs": [ + "4e1a98a72639efa6253a7cbea0f3b499fa24fb88612ad81414d20e46d2b5784e" + ], + "outputs": [ + { + "uxid": "33e0c4c9536afffd491fef6294f22ffb0d16902493946a051db0b218728a1c44", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "859050.000000", + "hours": 2704 + }, + { + "uxid": "2a09e97f7725a35af1357842206875a023252da4ebfce129eaf4cb87119cfd41", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 2704 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 91, + "block_hash": "b3d041858a5865ead4edad6acb81406ee59c8b32013e4de96405bb40929f24e0", + "previous_block_hash": "67d69d26e52c111625cb26629f53fb9d1fc350e584b14a42749a50a26bd0bb47", + "timestamp": 1429164830, + "fee": 12539, + "version": 0, + "tx_body_hash": "98baeb9799902593d0f61ee22947089a798c6adafd05dc6a5ea918d982a19857", + "ux_hash": "20f35999317908d338a5ce6d4eb236a43660ebebb3dfcc1152b3011aa65838c8" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "98baeb9799902593d0f61ee22947089a798c6adafd05dc6a5ea918d982a19857", + "inner_hash": "8fdb3ac7731310281c5e67ca521d5b925aee8c7dd34b7b8249ae522ccd450943", + "sigs": [ + "c1f82dfa176134077c4512421b01bec50360dae178e43ec9ceb70d24ff38301a33c6780db5b80afb49b08d15b303217ce206601c1a29bfef4f3bbdf6ccdf779200" + ], + "inputs": [ + "a68c6c646b6bd42f509a82d0218c8ee648b4a40da20eb0599449a7249b10fee9" + ], + "outputs": [ + { + "uxid": "d45d0597c7d41fdc69ed09a139925327142589f1e4fb877285fa63c6fa126d38", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "24000.000000", + "hours": 2089 + }, + { + "uxid": "535987a7896501a8a69c1904c0bf98e2ef1fc493bf998c78ee420ef154868731", + "dst": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "1000.000000", + "hours": 2089 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 92, + "block_hash": "32487462ed6177eadb936cc788ecd6be103f4ee7f2fc16082b99132343ef8fc3", + "previous_block_hash": "b3d041858a5865ead4edad6acb81406ee59c8b32013e4de96405bb40929f24e0", + "timestamp": 1429164850, + "fee": 9176, + "version": 0, + "tx_body_hash": "54e65c445d0af9dda82085ca4bfe0f326ae54ea2a03bd37e07f81d937de97777", + "ux_hash": "231a4ef65f5f0944392cf5fb548419c0a6cc70f20fb6865da290a1dbb7f23a24" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "54e65c445d0af9dda82085ca4bfe0f326ae54ea2a03bd37e07f81d937de97777", + "inner_hash": "d8f2215fee34a1104826266582d525f9c267d3a726732ed532fb6572d09b82b6", + "sigs": [ + "9d5aa480261d4d2dfbb8264ccb2bf8944b6abb5267ad89dda83760273abb8c0116f172e257a661a4d3d89c9c2caf237a13519545173c0df741a7dd18770176a401" + ], + "inputs": [ + "b187246f68a768f65663b8a208ab107a9bc24af6a062acf3ad41aeb899315a49" + ], + "outputs": [ + { + "uxid": "74f7dcc6e516634b5d5722d8664ffabaca3b708a53497bb420ced7c300c39806", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "28000.000000", + "hours": 1529 + }, + { + "uxid": "3109e04b5baef2423f4d6d2d639464286c24ef9defa612d3b598802d761b670a", + "dst": "ZWhZtjwXMS46cpDxfRwQyxxKPhqwsQu8oN", + "coins": "1000.000000", + "hours": 1529 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 93, + "block_hash": "2721f47fc405131d29c5eddcca1a1d13e508444b9b24e999d1d67e1ddd4ecabb", + "previous_block_hash": "32487462ed6177eadb936cc788ecd6be103f4ee7f2fc16082b99132343ef8fc3", + "timestamp": 1429164860, + "fee": 775, + "version": 0, + "tx_body_hash": "e2d9da9342b21659da0a679536f9d6f533a4ce7dc33a7f768c3441ca3640458d", + "ux_hash": "5a500555ded8514cdb5f77dea04889edcbfcc595b1589d3ce6edbd9ebe1621c5" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "e2d9da9342b21659da0a679536f9d6f533a4ce7dc33a7f768c3441ca3640458d", + "inner_hash": "72974683d8244d927c63440a169a438611ef88b250f20df2711d83a9f61a75c9", + "sigs": [ + "1c72245ae55779445ae5a6c030ea7f01cee7c29dd6189d0dcb383ec8438297e635b314c44bb0c4173c9e30d225774ee0334cee186e603a61c171af4db3eb961e01" + ], + "inputs": [ + "24c49699aab32caf9456a6b4dacd4d820c853c7639e5500b3be6326660312917" + ], + "outputs": [ + { + "uxid": "fb4d5dcc1c3ac97444e96aa7da392b0d7faf7b7373504c70e497228a4695a7f1", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "27700.000000", + "hours": 129 + }, + { + "uxid": "4a5c1b09ef2216ba2fdae735ec8c6ad404bb61bfbeb7407dee9d6e3578762ffb", + "dst": "2LZzgdFYNhsBBSLATkV6PA1zk6DvWNghP2", + "coins": "1000.000000", + "hours": 129 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 94, + "block_hash": "05e3a9d7a0ddbc08fb514ab0d8033a71540b16a317170bd2a3db762ea1a1928d", + "previous_block_hash": "2721f47fc405131d29c5eddcca1a1d13e508444b9b24e999d1d67e1ddd4ecabb", + "timestamp": 1429164870, + "fee": 10977, + "version": 0, + "tx_body_hash": "0f4958d590ed4ac9aca79d848731b358b1c01fab9717775cf6515f2bf2706dc8", + "ux_hash": "a67e3c8993f7952295c7f365535f8d61002a0d7a969c5fc01cfdee36edd06b12" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "0f4958d590ed4ac9aca79d848731b358b1c01fab9717775cf6515f2bf2706dc8", + "inner_hash": "89c71b68262f8e3acddcec032b4209220ac7b794d1cefa62b45c71b94e017cad", + "sigs": [ + "ede880d4422a1102280918227157997bb7a36d26a358a71bf016963d29e8403d2298754039d8dd14c0b05d776d05bebadb919a620e87439c93008e292086c94d01" + ], + "inputs": [ + "33e0c4c9536afffd491fef6294f22ffb0d16902493946a051db0b218728a1c44" + ], + "outputs": [ + { + "uxid": "f32f03f28eece9ddcdc488a85100c94a7c924c185ae560363518dae5e2aacccb", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "858050.000000", + "hours": 1829 + }, + { + "uxid": "24c4cfc628a0f77ce2e878c6ffa9d4dbd85325f8a5e0b5df970a3a2c36033519", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "1000.000000", + "hours": 1829 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 95, + "block_hash": "a054e14b9c7b9e298b04ba7f3a68270fe9e5fd8184b992917519bd7c038bc53c", + "previous_block_hash": "05e3a9d7a0ddbc08fb514ab0d8033a71540b16a317170bd2a3db762ea1a1928d", + "timestamp": 1429164880, + "fee": 1767, + "version": 0, + "tx_body_hash": "c93f8bb30e75ffbc0075a4baf57a0f536e4a9123395b13ce67af5cd2dd0f8cd4", + "ux_hash": "bc8b3f415d75b9045fe6211e52e550a73869991ad60553af6139c2b5ac6d37e0" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "c93f8bb30e75ffbc0075a4baf57a0f536e4a9123395b13ce67af5cd2dd0f8cd4", + "inner_hash": "20a707a3ccfe4ab0884697e4d9013da5c15f062b0a6f1395086503f2c4d6efb2", + "sigs": [ + "5fa7614080d2b044f1edce8bc42961d311db3fa4596fa14973261272980c37b0776099a37d758c20a2d45ee73aaed7d007e58f9f15191233f4f27b266fb2866c01" + ], + "inputs": [ + "d45d0597c7d41fdc69ed09a139925327142589f1e4fb877285fa63c6fa126d38" + ], + "outputs": [ + { + "uxid": "aee4af7e06c24bccc2f87b16d0708bfea68ac1b420f97914965f4a23ad9e11d6", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23000.000000", + "hours": 294 + }, + { + "uxid": "f9653d496ee2e6499a68a1172e5d60b60758b1edcd02d95a3388b29e113a9041", + "dst": "2U1B6EE5ZCXWJJSyEndouuCk434xpvYqYDF", + "coins": "1000.000000", + "hours": 294 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 96, + "block_hash": "2e30e4dc35301e6f227149d29acbcd9d3f6847963cd4ef8ec31a7bad8b57c534", + "previous_block_hash": "a054e14b9c7b9e298b04ba7f3a68270fe9e5fd8184b992917519bd7c038bc53c", + "timestamp": 1429164900, + "fee": 1322, + "version": 0, + "tx_body_hash": "0301358c2db5314ca43c442bac3c1daf31f4b39f9ac9e22dc157687212cab703", + "ux_hash": "830c7a3f304e0740f30a7cd2051a024498f4eedef43d58372618d916fbe8fb8e" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "0301358c2db5314ca43c442bac3c1daf31f4b39f9ac9e22dc157687212cab703", + "inner_hash": "3a68e8622eaf49013554114c0dac32c444998ef6c65ff1afc399bc772787f502", + "sigs": [ + "8925bcbda7785c7a83a77bd5ce16542e91a8f046163d429fcf9c466ca6a9b1fa5f6b693a19b7d8127717821ae247ba30401068d447d0fde4136c0e49f5e7e57900" + ], + "inputs": [ + "74f7dcc6e516634b5d5722d8664ffabaca3b708a53497bb420ced7c300c39806" + ], + "outputs": [ + { + "uxid": "6002f3afc7054c0e1161bcf2b4c1d4d1009440751bc1fe806e0eae33291399f4", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "27000.000000", + "hours": 220 + }, + { + "uxid": "63768bd1402317f7d3f0a38c9897e609bb72b7d334e54bd4c609292487264c22", + "dst": "22Piwuzo8ZfoXfpMghhbzGz3ptmTeiDhLbg", + "coins": "1000.000000", + "hours": 220 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 97, + "block_hash": "fcc06bfe75b62dcb87e2dcb31f6c1a58d5ba2f2b85576938a9dc49b971b60a75", + "previous_block_hash": "2e30e4dc35301e6f227149d29acbcd9d3f6847963cd4ef8ec31a7bad8b57c534", + "timestamp": 1429165260, + "fee": 328, + "version": 0, + "tx_body_hash": "a689a3589730a351f880176b2c15b395967b38a90950e0491e7a1e5531f020a9", + "ux_hash": "73546a733b7b17ce6611435dd1a5214a7e4f05a312bd60d4a3daa1eb6751614a" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "a689a3589730a351f880176b2c15b395967b38a90950e0491e7a1e5531f020a9", + "inner_hash": "d6cfcef60d17c03b68b94c4284746bc70e8ef66cb6d2bd370094a7e4b19dbaed", + "sigs": [ + "de36c5fac7db61c7a47827e1a9ad1b717d5fa904b69283598eab6003ba1b1e264856f30a6afe0881675e8f11a86e666cec09b789f3971a6ec4ba25183684a18900" + ], + "inputs": [ + "fb4d5dcc1c3ac97444e96aa7da392b0d7faf7b7373504c70e497228a4695a7f1" + ], + "outputs": [ + { + "uxid": "4e75b4bced3404590d38ca06440c275d7fd86618a84966a0a1053fb18164e898", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26700.000000", + "hours": 54 + }, + { + "uxid": "1f9fb89f5b7c41d3df6d72b1f02c998196bc79ec20c3949693b4f5a2c1aae44f", + "dst": "2H7mA88ireMKHqP9LYWK5opnU176v7eYqrn", + "coins": "1000.000000", + "hours": 54 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 98, + "block_hash": "0f4c792700593207a217101aa6349e2737a519de1d5f9f670aa1f550d52cc615", + "previous_block_hash": "fcc06bfe75b62dcb87e2dcb31f6c1a58d5ba2f2b85576938a9dc49b971b60a75", + "timestamp": 1429274566, + "fee": 71088, + "version": 0, + "tx_body_hash": "fe01250cfdf84eb0182c033c216891e7e6971cc85976c4c46d9e3c608974d233", + "ux_hash": "1663bee92c91aeafa18ec37ca21ba4b19a6fe54de74f4d925cdf002c9deb6fc4" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "fe01250cfdf84eb0182c033c216891e7e6971cc85976c4c46d9e3c608974d233", + "inner_hash": "2400f3951d454f663d5097060267f8e31e86e1c3f10391c8a06ed79fd72fe49b", + "sigs": [ + "6ecee1ca0e86de9bf6da9a21e49b1cfade8f1a279f7fc58834c15184bec1de634c82faf30bdab34083bc1f32f87d27daa1987a525db83100f88b9103efbc007701" + ], + "inputs": [ + "f32f03f28eece9ddcdc488a85100c94a7c924c185ae560363518dae5e2aacccb" + ], + "outputs": [ + { + "uxid": "99b4e51e1afd04813656e6202c7e462d88ce87ba980da7a62591190d72d1073c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "858000.000000", + "hours": 11848 + }, + { + "uxid": "f12164a6ea6ce65ff2ca1f2be7251bece8f7c5747ba8ec68e1ec3b27d45d7b9c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 11848 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 99, + "block_hash": "5c06896760ace71b02edab01700ff9ca8c32ef1d647e14c3e0d5fa751e47867e", + "previous_block_hash": "0f4c792700593207a217101aa6349e2737a519de1d5f9f670aa1f550d52cc615", + "timestamp": 1429274616, + "fee": 52573, + "version": 0, + "tx_body_hash": "819106dc50373e5293a7e79f179693e85536e8206d82272930ec08410d92402a", + "ux_hash": "c400f9dfcc2254feba80475a1e7acad4c88178152a1d9ca1b3e7883f85cc5a25" + }, + "body": { + "txns": [ + { + "length": 571, + "type": 0, + "txid": "819106dc50373e5293a7e79f179693e85536e8206d82272930ec08410d92402a", + "inner_hash": "02e9a06b0ca7f91255107993e00f09e9ef983559088c5febff264c17952033c4", + "sigs": [ + "efb713e6a1e5d328e94a51fbeb0f73e2a3b7a54e15db75797f0b709f698b16eb26e522f187a98144807e0e6cd294686ff19037975abb6d44b20b2899968954f400", + "b5d011c60020ce591a21db15823c06188515a63ca95d573c36b3af83d634fc6f1c1125db197f6283510ee33890ac168513254ad37524c77294bb5a12e8ff23f300", + "00d87b91eda33f627f6cd28cc673daf929fbec36e7bcfdf894f7491618a68b5755b5baadedc106d53d2da924fcbedbd106eadc50ec611d426720f67426c7286500", + "e64cf7e74363cfd381a3aa6fd17d7c415d6034b26b93017acaf9cf3475ccdffc53c3714d1d13409323cf77ccc81596f6e6edcec11d890979a436ef960bcb5f6900", + "fc2eb05241afdd15cdbd28cc7158d7eb4442f21a678c52332762b23ac6c2fcc76b0f79731987df0ba84d82044cd474d4cda9afda778a21b78a0659c5b588664301" + ], + "inputs": [ + "2987e7c89d353ad5d63cea2bf2724dc5f7a5ef5fb81f5ea160a307f0726ac2f5", + "a52408daa8ce7026c70b61d4df4212fb577462060f340bfce779225b3e18193d", + "dc73aac74348dd285a1456c1fae2204d7c2039d50a765bdaae0c31f7c7e059db", + "e4e375b9dc55ff53d6de9120f1a87ff00e00a779835f8320f2c6b3090d0466e6", + "d11b05345917d171f60c31bd2634041b73b97eae364724369ddb8d53369397fb" + ], + "outputs": [ + { + "uxid": "427462efeb07a6803f013c789ea43d93240f74f886bf9afd63dc1936a7574a37", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 7510 + } + ] + } + ] + }, + "size": 571 + }, + { + "header": { + "seq": 100, + "block_hash": "725e76907998485d367a847b0fb49f08536c592247762279fcdbd9907fee5607", + "previous_block_hash": "5c06896760ace71b02edab01700ff9ca8c32ef1d647e14c3e0d5fa751e47867e", + "timestamp": 1429274636, + "fee": 613712, + "version": 0, + "tx_body_hash": "9f20b52befed2cbaaa4a066de7119b7fdbff09a83d8e2a82628671f51f3f6551", + "ux_hash": "ff354e4774397b6c1ab46e56920c82f79e54ac8edce2f0fc4a2e6f472a5e5aca" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "9f20b52befed2cbaaa4a066de7119b7fdbff09a83d8e2a82628671f51f3f6551", + "inner_hash": "c2e60dbb6ad5095985d21391cbeb679fd0787c4a20471340d63f8de437d915df", + "sigs": [ + "2fefd2da9d3b4af87c4157f87da0b1bf82e3d6c9f6427572bd768cf85900d15d36971ffa17eb3b486f7692584102a7a58d9fb3ef57fa24d9a4ab02eba811ef4f00" + ], + "inputs": [ + "aee4af7e06c24bccc2f87b16d0708bfea68ac1b420f97914965f4a23ad9e11d6" + ], + "outputs": [ + { + "uxid": "194cc596d2beda803d8142ddc455872082f84b09a5edd8085082b60d314c1e29", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23000.000000", + "hours": 87673 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 101, + "block_hash": "8156057fc823589288f66c91edb60c11ff004465bcbe3a402b1328be7f0d6ce0", + "previous_block_hash": "725e76907998485d367a847b0fb49f08536c592247762279fcdbd9907fee5607", + "timestamp": 1429274666, + "fee": 720335, + "version": 0, + "tx_body_hash": "e8fe5290afba3933389fd5860dca2cbcc81821028be9c65d0bb7cf4e8d2c4c18", + "ux_hash": "348989599d30d3adfaaea98577963caa419ab0276279296e7d194a9cbb8cad04" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "e8fe5290afba3933389fd5860dca2cbcc81821028be9c65d0bb7cf4e8d2c4c18", + "inner_hash": "45da31b68748eafdb08ef8bf1ebd1c07c0f14fcb0d66759d6cf4642adc956d06", + "sigs": [ + "09bce2c888ceceeb19999005cceb1efdee254cacb60edee118b51ffd740ff6503a8f9cbd60a16c7581bfd64f7529b649d0ecc8adbe913686da97fe8c6543189001" + ], + "inputs": [ + "6002f3afc7054c0e1161bcf2b4c1d4d1009440751bc1fe806e0eae33291399f4" + ], + "outputs": [ + { + "uxid": "f9bffdcbe252acb1c3a8a1e8c99829342ba1963860d5692eebaeb9bcfbcaf274", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "27000.000000", + "hours": 102905 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 102, + "block_hash": "311f4b83b4fdb9fd1d45648115969cf4b3aab2d1acad9e2aa735829245c525f3", + "previous_block_hash": "8156057fc823589288f66c91edb60c11ff004465bcbe3a402b1328be7f0d6ce0", + "timestamp": 1429274686, + "fee": 710046, + "version": 0, + "tx_body_hash": "7b13cab45b52dd2df291ec97cf000bf6ea1b647d6fdf0261a7527578d8b71b9d", + "ux_hash": "f7512b0718f392c7503f86e69175efd7835ea4c3dd3f71ff65c7ad8873a6a9e8" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "7b13cab45b52dd2df291ec97cf000bf6ea1b647d6fdf0261a7527578d8b71b9d", + "inner_hash": "73bfee3a7c8d4f8a68657ebcaf69a59639f762bfc1a6f4468f3ca4724bc5b9f8", + "sigs": [ + "c4bcada17604a4a62baf50f929655027f2913639c27b773871f2135b72553c1959737e39d50e8349ffa5a7679de845aa6370999dbaaff4c7f9fd01260818683901" + ], + "inputs": [ + "4e75b4bced3404590d38ca06440c275d7fd86618a84966a0a1053fb18164e898" + ], + "outputs": [ + { + "uxid": "0a5603a1a5aeda575aa498cdaec5a4c893a28669dba84163eba2e90db3d9f39d", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26700.000000", + "hours": 101435 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 103, + "block_hash": "db1e858f66b595214807404728ec4b608d208f1c1f211d1785213b6a09091106", + "previous_block_hash": "311f4b83b4fdb9fd1d45648115969cf4b3aab2d1acad9e2aa735829245c525f3", + "timestamp": 1429278106, + "fee": 76077, + "version": 0, + "tx_body_hash": "9150311508851ca989efb5f82b5a7201724514b6b9f84ec1620c18673462126b", + "ux_hash": "dfb414ebbf9f28662f3e07596d5b6016d38ad1132b595a1f9f16241eaf97417e" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "9150311508851ca989efb5f82b5a7201724514b6b9f84ec1620c18673462126b", + "inner_hash": "83e206eb05ce5708efd174bb9df2c0bc0741c1775e50d139aebf37ed6c46381d", + "sigs": [ + "a6206409a077ec30fe7f0b0ad5162805dffbff743afbc9e8e926d72ae38d15f80ab8183150caa4d745125c1c6e733428e299742d10e07a64ba5bd21d4e5ee06f00" + ], + "inputs": [ + "0a5603a1a5aeda575aa498cdaec5a4c893a28669dba84163eba2e90db3d9f39d" + ], + "outputs": [ + { + "uxid": "1e30e9dfe00e055404063e52a4154a72492b13de6acf4871ec5ea6d7c0fcc968", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26600.000000", + "hours": 12679 + }, + { + "uxid": "435c7095e2531b88feb76f32fc34fac3406882cdf71e17fecdba196aa5bc059a", + "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "100.000000", + "hours": 12679 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 104, + "block_hash": "a67dbd55b75c2613280d3bda4b84d33bc3df5105012a345009a96589d1429374", + "previous_block_hash": "db1e858f66b595214807404728ec4b608d208f1c1f211d1785213b6a09091106", + "timestamp": 1429278406, + "fee": 82382, + "version": 0, + "tx_body_hash": "44d56cfa9f83d874ee10fb32f0d40458f6bf3e86528592c9a9abf3c960fcb278", + "ux_hash": "b3131bb22af0869b73d57590358b6b60b72e26e3e7adb544317651c926e4704e" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "44d56cfa9f83d874ee10fb32f0d40458f6bf3e86528592c9a9abf3c960fcb278", + "inner_hash": "4a9c25a15fe166d87b3fb6474360b39aa52703b70b961212f9494393a3c71c80", + "sigs": [ + "0c8c4e941af19993051d5e7d0aba7414e066d15dcee9bd3eb1f7fab3259fe0345dff7ed1fa68eb243883a3793f3febc7b7eeb7a619601ec9248ec5c063707e2b01" + ], + "inputs": [ + "194cc596d2beda803d8142ddc455872082f84b09a5edd8085082b60d314c1e29" + ], + "outputs": [ + { + "uxid": "aa1133a42417332af8b58e71cc14a651e2731563eaea35f0feacc1e97fac6eef", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22900.000000", + "hours": 13730 + }, + { + "uxid": "52088c63431b6109537bce1e582775f319c9833990c94cc2e8e0dbb8b48b9c27", + "dst": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", + "coins": "100.000000", + "hours": 13730 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 105, + "block_hash": "08622b79bb7e9b79e043152dd8ef759cf9ee8871449d80cc31343736b5aa16c0", + "previous_block_hash": "a67dbd55b75c2613280d3bda4b84d33bc3df5105012a345009a96589d1429374", + "timestamp": 1429278556, + "fee": 11173, + "version": 0, + "tx_body_hash": "41ec724bd40c852096379d1ae57d3f27606877fa95ac9c082fbf63900e6c5cb5", + "ux_hash": "affd2919f37d6bb63b543be3e221802ab6043335a61f9ab1ed10a6c720902c8e" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "41ec724bd40c852096379d1ae57d3f27606877fa95ac9c082fbf63900e6c5cb5", + "inner_hash": "614d7754fa0633e1a701eea3b3a2ce1c2815360f311cd1cb6cf46d5ae94304ba", + "sigs": [ + "bd20e6b6754308d192ba734a573ec4363dae5326b9b21a7203904c076b067bf9313df1df8ac8960f12d9d8b642deb411a504512990181bc2e53264cf661b868f00" + ], + "inputs": [ + "1e30e9dfe00e055404063e52a4154a72492b13de6acf4871ec5ea6d7c0fcc968" + ], + "outputs": [ + { + "uxid": "2426f768e00345b641f5b4b4b058c308d528e22437bc6e552f0a9d5bd665e14a", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26500.000000", + "hours": 1861 + }, + { + "uxid": "8f4435cc1cb45453f1ee8e836a74bdec313a6d3aa1879be24e2ba261d474bf36", + "dst": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", + "coins": "100.000000", + "hours": 1861 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 106, + "block_hash": "6a6db10e08b05f6ccb228ab7fee8b2e3ea10e47c126a43ec8bb6ecf13595329f", + "previous_block_hash": "08622b79bb7e9b79e043152dd8ef759cf9ee8871449d80cc31343736b5aa16c0", + "timestamp": 1429279796, + "fee": 835759, + "version": 0, + "tx_body_hash": "8de17dff34a8798f2ac89584f5c559e3bb82c280a3f6890386b4dbc5fef0e8cf", + "ux_hash": "499137c1cc882d5461d87c843a38df8315b9efb9dde9d7e7928666c2be4077dd" + }, + "body": { + "txns": [ + { + "length": 511, + "type": 0, + "txid": "8de17dff34a8798f2ac89584f5c559e3bb82c280a3f6890386b4dbc5fef0e8cf", + "inner_hash": "2ab03a15a9f312d27919ec42a27dfefc5fc5e0b8bf451eb81ef545bf4497f524", + "sigs": [ + "9dd44c7d76d454c7c658649d94e08f75354ba568aae069b38da012f07eacbcfe2a5bbe9b4444f566336c23a03f3625eb4306791437e1bfe69f43efa0c109ec2d01", + "211d2607cef832c989563a3475daf6aa1fec6d73893a72666b5428c6bd93217605990bc3b45f4cf4863a648708ca3bf3526eb1644679f313a297daf82b1865bf01", + "f7e77964485e36b15ade78aacc17407af265c7144767e3f39bfd9765869f90cd0f33120ca996154db82d5462d626f3ae299c8f3b8cc862284432919cfeb6613d01", + "3a1e491d35ad5daa1af54872b5ec1d02c6654cad8f2bcd94c2a624c1a3cd5c9163c373f06a931b5de526654bdbc5cdd221b7fcf7b77329d452562080216ca8fe00" + ], + "inputs": [ + "99b4e51e1afd04813656e6202c7e462d88ce87ba980da7a62591190d72d1073c", + "f12164a6ea6ce65ff2ca1f2be7251bece8f7c5747ba8ec68e1ec3b27d45d7b9c", + "427462efeb07a6803f013c789ea43d93240f74f886bf9afd63dc1936a7574a37", + "f9bffdcbe252acb1c3a8a1e8c99829342ba1963860d5692eebaeb9bcfbcaf274" + ], + "outputs": [ + { + "uxid": "dfd2834342f3a7caf183472c17801aafacd1775378eb843509d17ad858456cb0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "885000.000000", + "hours": 139293 + }, + { + "uxid": "3bfbe4e80894862d60a053ffb47b8f1749e281603cd6376c8fc6b5e2cec0c843", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "100.000000", + "hours": 139293 + } + ] + } + ] + }, + "size": 511 + }, + { + "header": { + "seq": 107, + "block_hash": "c3e1ef118832446f245de2abcfeb0ef1569f1d4861f6571a63b9d969b275e118", + "previous_block_hash": "6a6db10e08b05f6ccb228ab7fee8b2e3ea10e47c126a43ec8bb6ecf13595329f", + "timestamp": 1429280596, + "fee": 104471, + "version": 0, + "tx_body_hash": "6546dfbe6e61e81f3e9f6c9afdfee1c07758f2e486d731ae4d19b40602367656", + "ux_hash": "e571d0336b141a1162ef3ad14779b36ecdbcaa08780c31c5a903d717d137a3a5" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "6546dfbe6e61e81f3e9f6c9afdfee1c07758f2e486d731ae4d19b40602367656", + "inner_hash": "9566ef1826b7f518c043395c2b7a37014f77f8e23796c1c78e55d1fc443a02da", + "sigs": [ + "2773830af5e34a3de4a3ce935ee08c189feaa30ab41ced8f78f9a6434198d9775c58a0b9bcc2931f3d0dfde541ef7f5d3c1cfcf5415776dbd9d871ce036ec42900" + ], + "inputs": [ + "dfd2834342f3a7caf183472c17801aafacd1775378eb843509d17ad858456cb0" + ], + "outputs": [ + { + "uxid": "8ac39d41ec014ca6625e5f17e1fbe62db7a4ac154e0e42a017efa037935ae968", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "884900.000000", + "hours": 17411 + }, + { + "uxid": "ec4b791f2fa22a986d6035e34f5025c3da0398cb2acc59a54d495d4eaacdee8a", + "dst": "2acnXsnJ2k8jxiUahtBe8h4xouPAnpbwwjc", + "coins": "100.000000", + "hours": 17411 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 108, + "block_hash": "19daeb3b8c9a1c1c30c4c190eec4496c729c7a32e90245b106e252c908fc5053", + "previous_block_hash": "c3e1ef118832446f245de2abcfeb0ef1569f1d4861f6571a63b9d969b275e118", + "timestamp": 1429280756, + "fee": 20746, + "version": 0, + "tx_body_hash": "a8d6420d4f64fad1b698bd77cae5a92aa125f806fb184389edcc278e5cb460fa", + "ux_hash": "ee0f2a6bdc9d816c4887e7674daccd9fec8a50e7ff6fc3da4bffa4f6caf64bb8" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "a8d6420d4f64fad1b698bd77cae5a92aa125f806fb184389edcc278e5cb460fa", + "inner_hash": "6daf17a44251b984449effe21e605ab556ef565940043cff6cc75cb042028783", + "sigs": [ + "dd67813bd08a88b24f695ac10d4390598b25cf19e4edad19091f3b723c4780653a62639153b9bbb53331b66b46dc8c84e719178a96bcd001eb7f2e147268bb2e00" + ], + "inputs": [ + "aa1133a42417332af8b58e71cc14a651e2731563eaea35f0feacc1e97fac6eef" + ], + "outputs": [ + { + "uxid": "4326c936322df6d59b3b539ea340eb9630c7f8484eba2aeba1a0ed4d431ab614", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22800.000000", + "hours": 3457 + }, + { + "uxid": "9404837ee44bc6aaa8c1ad963c8fa7a050e497f89f941fdc7248930ed4e0d5a6", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "100.000000", + "hours": 3457 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 109, + "block_hash": "387c3847ecb312cc873beacaa6cc6e4b71b9fc11532c6b6683e80707a99a0bb5", + "previous_block_hash": "19daeb3b8c9a1c1c30c4c190eec4496c729c7a32e90245b106e252c908fc5053", + "timestamp": 1429302756, + "fee": 42555, + "version": 0, + "tx_body_hash": "a4c15ae4743246709ec335d33c289576c8893e71f5c3dcee1db6e43eec9242ee", + "ux_hash": "7d753a823379eee4f6636d7f663af82e60fabf7b8e52d07d3a48015b1c3d3bb5" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "a4c15ae4743246709ec335d33c289576c8893e71f5c3dcee1db6e43eec9242ee", + "inner_hash": "1d2404a84798154867ab461179a2b4300d65e4886cbb0220f0d5d0b16bbb7628", + "sigs": [ + "3fcfe6d7fe59b9998ac4260c3b788384b2ebb7137e08e3ffc8d8b6efa23490e71f94f381c61af4966ba6a4fb4173079d5a7f31518030900f6c10d64ceb0b774f00" + ], + "inputs": [ + "8ac39d41ec014ca6625e5f17e1fbe62db7a4ac154e0e42a017efa037935ae968" + ], + "outputs": [ + { + "uxid": "bae0e928b795e2a80c88161afcbc102dcad6644386f6f44050dde8d586750140", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "881900.000000", + "hours": 7092 + }, + { + "uxid": "4ca22a0fa2acbd0c9e90c4ae83496d05e122deb1a17c670e9c785479d115e824", + "dst": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", + "coins": "3000.000000", + "hours": 7092 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 110, + "block_hash": "9ba608780f4f2a6652b689e61d2d522059e93c0a0bd25c1b40502d127d824c33", + "previous_block_hash": "387c3847ecb312cc873beacaa6cc6e4b71b9fc11532c6b6683e80707a99a0bb5", + "timestamp": 1429326351, + "fee": 107094, + "version": 0, + "tx_body_hash": "552a4b194478325ee9f3e4a8648d94bc8eb26432be6fecc881bf71ff9ca15356", + "ux_hash": "c6fc1679469a1ae4801f7893f58ddb98f84484debca51069ab2a671d52a6ccfb" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "552a4b194478325ee9f3e4a8648d94bc8eb26432be6fecc881bf71ff9ca15356", + "inner_hash": "bcc319504908b93f4418244049157875514fed19ce76977435d00b7ab712254a", + "sigs": [ + "41b8178ba19326c7f61b5327846c8057bef05c47f2068ff3eaef80bb26bde18642d444647f8c623ca8a3abb040f3527c28737534bc2d1b8c5d53bf71f4c1628c00" + ], + "inputs": [ + "4326c936322df6d59b3b539ea340eb9630c7f8484eba2aeba1a0ed4d431ab614" + ], + "outputs": [ + { + "uxid": "f9bf35f993452b3d490668bb579fd272da969a1bcca8de0c25000ee57b5d7f54", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22700.000000", + "hours": 17848 + }, + { + "uxid": "a7dc3318a975546b7662f0a867c60a4d7e9b4d1d89ab87be8c78b09ffe8852ff", + "dst": "aPF9pL9sVEiyEVhynp3s1dmqLetP1BJrW6", + "coins": "100.000000", + "hours": 17848 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 111, + "block_hash": "8be6b19ea7791d7fe43c49191cd3d73f182dc11cef660046e5450d2b56d0843c", + "previous_block_hash": "9ba608780f4f2a6652b689e61d2d522059e93c0a0bd25c1b40502d127d824c33", + "timestamp": 1429348072, + "fee": 13386, + "version": 0, + "tx_body_hash": "6ce27da2ddbc15f03330960b4201dbb3a066ad2e9bbd5366a9564f6befdcae2e", + "ux_hash": "010bd2fb29f6d5c89ba63e224358a639758aac6ae6d260f94910e2f515b1284a" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "6ce27da2ddbc15f03330960b4201dbb3a066ad2e9bbd5366a9564f6befdcae2e", + "inner_hash": "2db237d697bd17aab9121cdfc4d72fa1cbfe7fd37d7f71b1a857833bb56b7dd7", + "sigs": [ + "c50715bd2e53ed971b7559ccaf8a930dae335dc45cad18a25ccfea3209ea2c971e0dc6cc57ff1dbcde49ddfdc612e71e923adcd21b68eaa0eb239bc83a50ff2b01" + ], + "inputs": [ + "f9bf35f993452b3d490668bb579fd272da969a1bcca8de0c25000ee57b5d7f54" + ], + "outputs": [ + { + "uxid": "c5df36ce47f6f183475317ab1c53eaa65428c142cb3e3906bf162d80519a203f", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "12700.000000", + "hours": 2231 + }, + { + "uxid": "94889dbe1c20eb942b7932c5301737537ac33abd9c81d72e1642ddc70ce320e0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10000.000000", + "hours": 2231 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 112, + "block_hash": "e824946623309bf11d149b257ccd65d66dda02a693e83ecc0cd4429f53b472d7", + "previous_block_hash": "8be6b19ea7791d7fe43c49191cd3d73f182dc11cef660046e5450d2b56d0843c", + "timestamp": 1429348102, + "fee": 8332864, + "version": 0, + "tx_body_hash": "f8a24a25a8e3b206db7ea8a0bd8eeb0f8087f50d230c81a538316bcc5152da3d", + "ux_hash": "7c6f051b8f1edf6bac4aeb4fe434f56074b6b1cd259ae764f9905d241d6719f7" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "f8a24a25a8e3b206db7ea8a0bd8eeb0f8087f50d230c81a538316bcc5152da3d", + "inner_hash": "cfca9a1aa2ab7ea4d643700ac89e9544f1d4e9ef85e28d1cedeece11469fb885", + "sigs": [ + "5b68d315f4e84cdae4936db6bb7c8466977e784851b605d1fbc1e0bb65fe259d58d6be37228c96bccb1a1c1e9d316d9102fcfaefeda614e67af20464bc877f2101", + "fdd919590553d428d9b8121644127651c68b5207af9798aaaa6ed18134c5835b5311bb547e07e47157a4fd89867c88a48700255610efd2a3e3f77dc82f5fb3ba01" + ], + "inputs": [ + "bae0e928b795e2a80c88161afcbc102dcad6644386f6f44050dde8d586750140", + "94889dbe1c20eb942b7932c5301737537ac33abd9c81d72e1642ddc70ce320e0" + ], + "outputs": [ + { + "uxid": "1d4595b9fa1c6c3d64f48b6ae5f8f861b1c08a022cbcb04b279df448da3db660", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873900.000000", + "hours": 1388810 + }, + { + "uxid": "53b376413d550663ab51b229df8b0f55e4055d6577c2d8b5cec8ff748fe0e958", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "18000.000000", + "hours": 1388810 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 113, + "block_hash": "46c2b611585a58ba3cb400970c3ff156fb62b7ca40bd9f8ab37979ebbc69e27d", + "previous_block_hash": "e824946623309bf11d149b257ccd65d66dda02a693e83ecc0cd4429f53b472d7", + "timestamp": 1429348172, + "fee": 1041608, + "version": 0, + "tx_body_hash": "1f27afc41896d2c7fdbd2620e606440ad12557e9a4bdd6808dcc2c23d4e32978", + "ux_hash": "6e57bb2b61fdbc6288ee89183ede904a77500e9e41b9cc2d765f6ece0225b5d7" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "1f27afc41896d2c7fdbd2620e606440ad12557e9a4bdd6808dcc2c23d4e32978", + "inner_hash": "4d53c05c731409feef7606cf9514904f4c7704537efb453ac2c439fcfe77a455", + "sigs": [ + "e36cef84c1c6f999dba462f3134131c105da2255eaf21550ce30ee52a14a33d529a7cd0c37b3883d0d57429b163b4905271c7b1a4d951b4a521f245c7857dd5c01" + ], + "inputs": [ + "1d4595b9fa1c6c3d64f48b6ae5f8f861b1c08a022cbcb04b279df448da3db660" + ], + "outputs": [ + { + "uxid": "412eff3eef889c682da8db3608fce37d1c5ee2cc297bc88d901648e6ccd418f9", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873800.000000", + "hours": 173601 + }, + { + "uxid": "c961ba554ae30b0edcdf71e834ab2b26d7dff5bcf5955d4874cdba89170392bf", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "100.000000", + "hours": 173601 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 114, + "block_hash": "559fbe3f6619596631de1c1ea3e81b170cfe73fcc3ea08588897da22baab8e19", + "previous_block_hash": "46c2b611585a58ba3cb400970c3ff156fb62b7ca40bd9f8ab37979ebbc69e27d", + "timestamp": 1429348502, + "fee": 130201, + "version": 0, + "tx_body_hash": "e8765b4e6fbca87144df59a6f66815b175e81999509504b117636edc34cbe2af", + "ux_hash": "c0fba7a0e2d3de73f62277b2e8147fcb6a1e3ef1386dca06c6a6448d80460031" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "e8765b4e6fbca87144df59a6f66815b175e81999509504b117636edc34cbe2af", + "inner_hash": "b62f9938b195211810976e1719b152fe6c381879adba6061f4ca36d74c06bea2", + "sigs": [ + "9d40ed257bb7586c7d72e90bd99c6883fb836d400107686ba477850c2b63a86b5ad885aa37f352d334d930ea3814844e67a6ac438c36b919daff273a66f21e5201" + ], + "inputs": [ + "412eff3eef889c682da8db3608fce37d1c5ee2cc297bc88d901648e6ccd418f9" + ], + "outputs": [ + { + "uxid": "6ad7993fb2728c2c53ac2c8395a6c62d03c5ef9298ca467e7998fb64fd0c90b4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873700.000000", + "hours": 21700 + }, + { + "uxid": "5b0801ec545b132eeafa61bee8f645df7e1e358321ef830a4247fe541c211139", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "100.000000", + "hours": 21700 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 115, + "block_hash": "504fd4a569f4b3ee5182b12fb082dba7d4853fa40977a4a2dad43143ee616db3", + "previous_block_hash": "559fbe3f6619596631de1c1ea3e81b170cfe73fcc3ea08588897da22baab8e19", + "timestamp": 1429348712, + "fee": 16276, + "version": 0, + "tx_body_hash": "bb700553c3e1a32346912ab311fa38793d929f311daeee0b167fa81c1369717e", + "ux_hash": "81bc3ae9527ef4693109ea9d2ed4e8d55f00c0bda6b215947c195551b6d66681" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "bb700553c3e1a32346912ab311fa38793d929f311daeee0b167fa81c1369717e", + "inner_hash": "253c14d68558b09c034d4945284f5cc3025b9e05723c6e4fa7d95f1e68edb211", + "sigs": [ + "4920f49d47105801fab73c2398bee61ce56bb0b58dd69ab35ec1f959a3b8a8003c2821510d3a97d09f7a4a9f943b04d888b1327539ff48216f148fca693dde5d01" + ], + "inputs": [ + "6ad7993fb2728c2c53ac2c8395a6c62d03c5ef9298ca467e7998fb64fd0c90b4" + ], + "outputs": [ + { + "uxid": "0976005ab4540e8211cd929f19634bfaa2f5d8e24177ddb5b803b447ea91f8c3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873600.000000", + "hours": 2712 + }, + { + "uxid": "de995d2361e810cfba1b9b1141413367a722f51c7555b1685f6e68129dfb2679", + "dst": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", + "coins": "100.000000", + "hours": 2712 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 116, + "block_hash": "87ac9b17ffc3169eb0ac6e758e62a37f9034c294a8fe5b223d9b127fbb7a9f25", + "previous_block_hash": "504fd4a569f4b3ee5182b12fb082dba7d4853fa40977a4a2dad43143ee616db3", + "timestamp": 1429349392, + "fee": 388717, + "version": 0, + "tx_body_hash": "491130fc9f69d101df220116356e82e2ff21dac1167e6da81c95dd4cc417b3d9", + "ux_hash": "913ca96659cadafaabb4c433fb184e35cd0eeaa9dc7f6a4c52e6b6f8c9433eef" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "491130fc9f69d101df220116356e82e2ff21dac1167e6da81c95dd4cc417b3d9", + "inner_hash": "d78596837a36ece9a8bc3a8eed424612651039f4f229969c42ec3d7fd1aceff2", + "sigs": [ + "e22e89ecb303d5eee59eca8a75e0d5b4fdfa3a256576d7ac91264b4c3bf882ce7186572ab68fd1ad4dc837039ef4d7063ead72365506aed71cfe4de0b0449b4900" + ], + "inputs": [ + "2426f768e00345b641f5b4b4b058c308d528e22437bc6e552f0a9d5bd665e14a" + ], + "outputs": [ + { + "uxid": "6c34016037cd17622846e71bc635914d4d8f256c147aa5a0b84a896e83229480", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26400.000000", + "hours": 64785 + }, + { + "uxid": "ab12f4eadaf956be371ff8f239956e33d1cd2fd4b497ca04c9501baf6f241618", + "dst": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", + "coins": "100.000000", + "hours": 64785 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 117, + "block_hash": "0c20262e8f6a28d63f1b7f9a8b0e4bc6801ffb0c6a3676c06a5b2903f865416a", + "previous_block_hash": "87ac9b17ffc3169eb0ac6e758e62a37f9034c294a8fe5b223d9b127fbb7a9f25", + "timestamp": 1429351912, + "fee": 125795, + "version": 0, + "tx_body_hash": "345488861ad3f0d93024c367990e64ef0f7a95bd8b8589f554172f9439808263", + "ux_hash": "fcd1a68f49962723c919b82780797740cd0428c05a072fa9f320028803ee720f" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "345488861ad3f0d93024c367990e64ef0f7a95bd8b8589f554172f9439808263", + "inner_hash": "258acd45e194051214c9783184c2a9157558e595c4e4da814258f0ffd0e9dd64", + "sigs": [ + "9f44be793a0cb218b6836dfa52e5b8c38fe2b1257d27fcea49f4c6a6ed910f446e8a96a987fc06c6b6ae13ea8ea0290e91ea40b6f8eeaf8054e8efd17306573201" + ], + "inputs": [ + "0976005ab4540e8211cd929f19634bfaa2f5d8e24177ddb5b803b447ea91f8c3" + ], + "outputs": [ + { + "uxid": "6beca9fb58a327580c614d7fb5622916849756790b661bcabc880666364fdf47", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863600.000000", + "hours": 20965 + }, + { + "uxid": "2010952c33c83599fa14bfa5982d59865f2a362c97270dacb4c180a485ee5096", + "dst": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", + "coins": "10000.000000", + "hours": 20965 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 118, + "block_hash": "d041c16ee3e7ea54503cddfc4ade9b21b3dce9cb17ebd531a2d52fa122aaee69", + "previous_block_hash": "0c20262e8f6a28d63f1b7f9a8b0e4bc6801ffb0c6a3676c06a5b2903f865416a", + "timestamp": 1429364072, + "fee": 184620, + "version": 0, + "tx_body_hash": "a83e09e976b038d86491d8c029aec84a6313dc33e692da6ce50a2858e50c4666", + "ux_hash": "ef651e6ce43c864fed7fc0f0be888a988e299e277bed9554eb5a926eec66e37e" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "a83e09e976b038d86491d8c029aec84a6313dc33e692da6ce50a2858e50c4666", + "inner_hash": "86b47008bbeb60335762ba70b5bdf8128f09b3f8fff6ec6e5d9553763a5b5cef", + "sigs": [ + "48312c1abe5617609f70a882689f194e8d18c0b56d153adfae4be08bf00d723c6cda6dbd885e7ed7f92c7b7065d583adfd5f18bb37da9b796a394f4a388e978d01", + "4826477aed0387ca448b8225a5d27ebe6824b460d0581fb8ccb5078a865cd8171e7f5c860091a99cc85b1571dce8a550659cb3d02902a77cd1f6d0d27277bdee01" + ], + "inputs": [ + "7b132c07322babefa83ab64971b7bfb29bf2cb9ffe9c42dc7e2975a185dcd8b8", + "c961ba554ae30b0edcdf71e834ab2b26d7dff5bcf5955d4874cdba89170392bf" + ], + "outputs": [ + { + "uxid": "3408638af298419b14a49e8e9dd69e97c9a06827d74edf9f410a870662360b31", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1045.000000", + "hours": 30769 + }, + { + "uxid": "ba0a94662846565969d361b1b7c248847a48e69f2b9eefb4ffb0bc2efc56a8fd", + "dst": "38cVLswijqC2ANV5HxTroeapQzqeoBR88C", + "coins": "50.000000", + "hours": 30769 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 119, + "block_hash": "47c5bf33a544cb4f0a8e7ecfea9db40f43467ae8b8c80ba1d1cc8a39063ea05c", + "previous_block_hash": "d041c16ee3e7ea54503cddfc4ade9b21b3dce9cb17ebd531a2d52fa122aaee69", + "timestamp": 1429364282, + "fee": 23077, + "version": 0, + "tx_body_hash": "4d080ff1f8ac21d8c09a2dca99d28ae88e9441d7a4757dca68469ad64838cb55", + "ux_hash": "06cd243747bd5b7e42c8be4e076fbc25c25beda3d983bd943b45590a5ca35b56" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "4d080ff1f8ac21d8c09a2dca99d28ae88e9441d7a4757dca68469ad64838cb55", + "inner_hash": "bd2066b342e0af8c4bfecd15d3a87f168cac47d1f900642b69b23fbf18bfed05", + "sigs": [ + "ea1adfe309f30a15691fc3e267b19d7b765983694245adbebd92924db1adb67668d4dc8a6467e54323d245a35c0ed822593e10de2fd6c4674d3040b53099a6aa01" + ], + "inputs": [ + "ba0a94662846565969d361b1b7c248847a48e69f2b9eefb4ffb0bc2efc56a8fd" + ], + "outputs": [ + { + "uxid": "cbe8b620c1468dbb1e69e6da63831bde5828db313879a36f783a1f16f2b86541", + "dst": "38cVLswijqC2ANV5HxTroeapQzqeoBR88C", + "coins": "12.000000", + "hours": 3846 + }, + { + "uxid": "f480c6097568036b90a2e019f9ee68c0812b2da8828be33a005a7427caf14a2b", + "dst": "f38daJDg8rpwL5xWgMY78fBHncQ1N5gQZ7", + "coins": "38.000000", + "hours": 3846 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 120, + "block_hash": "644bd4cc468983f429fc64e2ed43338eb0c5def9e12c6b7a0784c4fa928abff6", + "previous_block_hash": "47c5bf33a544cb4f0a8e7ecfea9db40f43467ae8b8c80ba1d1cc8a39063ea05c", + "timestamp": 1429364452, + "fee": 3366, + "version": 0, + "tx_body_hash": "d1569ca879f98450a920a2b427ab0e1d21342308fb6b4ea5031ee6e718217183", + "ux_hash": "b63369302476aaa7e57b3b32b6f141f24bde99208f619b25077ea7a547dc8b72" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "d1569ca879f98450a920a2b427ab0e1d21342308fb6b4ea5031ee6e718217183", + "inner_hash": "12d27fdba804c648b8f72d9740d4021b05c88c95d3595af4afab2150092c5eee", + "sigs": [ + "2baa243ca1b82bd9fc1a31a0b53c9f7eb0ad62b19d6a4d3af62579cc2dc455d81d8ed82ba342dc650d4ae38718d81a8df6a93a9a809749a2f5391894bbaf298400" + ], + "inputs": [ + "f480c6097568036b90a2e019f9ee68c0812b2da8828be33a005a7427caf14a2b" + ], + "outputs": [ + { + "uxid": "3f9712cab0d3aeb217f1751fa19e53d75f814b4218866d4e70d63f32271d2023", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "38.000000", + "hours": 480 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 121, + "block_hash": "48a34e6f6371d5e93cea488f9615bc64b305b47d82cd813218bfc92e5fad2a3e", + "previous_block_hash": "644bd4cc468983f429fc64e2ed43338eb0c5def9e12c6b7a0784c4fa928abff6", + "timestamp": 1429382678, + "fee": 2271879, + "version": 0, + "tx_body_hash": "da82deafc15c36e7dc9cd95663e0dc910ae626ee543147ac7bd8682be00f7baf", + "ux_hash": "4eef95855584018e0cc70e78fa5b77f5c0447bf2456713e80274a3a35b4df479" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "da82deafc15c36e7dc9cd95663e0dc910ae626ee543147ac7bd8682be00f7baf", + "inner_hash": "c98f858a27e76b0b565baaa3dffc6cfc7b0ffe9dd7d2d71f4bb0ad4d1c439ca2", + "sigs": [ + "15fccdc36c966a9571196a3f727ebda47162441df2d9965ac27109ac56d22cb41638b404e84b5b388d809b814ade18022cba0a6e021140c6b7d0144a6facd6d501" + ], + "inputs": [ + "6beca9fb58a327580c614d7fb5622916849756790b661bcabc880666364fdf47" + ], + "outputs": [ + { + "uxid": "f8a1990492f970227ec29e6e095fa724d66fa2d6883bd8723773098d08ca8b3c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "801600.000000", + "hours": 378646 + }, + { + "uxid": "e5596ef0ba04ad9e0adbe0355a24c6bef249654906f917b68f8f0cf072508674", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "62000.000000", + "hours": 378646 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 122, + "block_hash": "42a88e86cb431b2464cd40554a46374775854e588df3c0ec3164b55290c95fec", + "previous_block_hash": "48a34e6f6371d5e93cea488f9615bc64b305b47d82cd813218bfc92e5fad2a3e", + "timestamp": 1429382898, + "fee": 283986, + "version": 0, + "tx_body_hash": "211f5fc97ba1797d78f84d4e4db78415b5ff4121f78369535fe3f8015571c6df", + "ux_hash": "6fe7b36354ce50054dcb32e1eb108bfdaffe14c2c94514d517a3909b725c4ce9" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "211f5fc97ba1797d78f84d4e4db78415b5ff4121f78369535fe3f8015571c6df", + "inner_hash": "586a8297d8d148f79d8529fbc3e356f5de9570a3c34bc1ba8494b8269b03d0f2", + "sigs": [ + "cccee00def7817ec1b36ba5b02066f82eae188afc3e05e61524c62d19fe095e0363db085da6591841314da5f836f2f0068eae522e3d3937d2f96de99f924af6a01" + ], + "inputs": [ + "f8a1990492f970227ec29e6e095fa724d66fa2d6883bd8723773098d08ca8b3c" + ], + "outputs": [ + { + "uxid": "998487775c0e58420673b70204b83c1d6bb5b70e34b1aa0f8169c85ecec2438e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "765600.000000", + "hours": 47330 + }, + { + "uxid": "1e0cf4e3ed49b52944f533a212e6412291e369ac3e7a8c4440424f475f2983b3", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "36000.000000", + "hours": 47330 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 123, + "block_hash": "d6be10dec288c68139841963f3bca742ed29a1a042658ed699bbfad206cb3f4d", + "previous_block_hash": "42a88e86cb431b2464cd40554a46374775854e588df3c0ec3164b55290c95fec", + "timestamp": 1429451746, + "fee": 35498, + "version": 0, + "tx_body_hash": "9003d3caba9587d46d000cc614bb52bed34adcc5ea404c560c986eb6dd756e6b", + "ux_hash": "cc22c972949b69f79394815aed9a9d4d7d73b988bb94e8efa10eefa8b8ff1c70" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "9003d3caba9587d46d000cc614bb52bed34adcc5ea404c560c986eb6dd756e6b", + "inner_hash": "2a87bcb0049b9971713a2e46b75b348785adca751b151290a411bfa5a0ed2287", + "sigs": [ + "0da91c351fb050c243c7b587005bee14ccc2951897ffdf720ad9c757c5946e516a20ca0d92c5f84957161d10a74deab05a2b530ab5bbcd7ad01266213b5eb38401" + ], + "inputs": [ + "998487775c0e58420673b70204b83c1d6bb5b70e34b1aa0f8169c85ecec2438e" + ], + "outputs": [ + { + "uxid": "6fb116c110fe391448a1dcb985b67439c2e9a71d8bb2fd1cf345ac73ada6166a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "755600.000000", + "hours": 5916 + }, + { + "uxid": "8e764a87cee9f26b902f748c28a5a49de5c383e5f155129eec84474a3d0349cc", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10000.000000", + "hours": 5916 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 124, + "block_hash": "d01a6811cc796d32d915257986177c5cf12dbd5f010bfff736457a114f9b6eb2", + "previous_block_hash": "d6be10dec288c68139841963f3bca742ed29a1a042658ed699bbfad206cb3f4d", + "timestamp": 1429522086, + "fee": 4438, + "version": 0, + "tx_body_hash": "e9a6dd585b564b19c55d9f56188a45bfad32fa75703fa6336830035f6fa92e3d", + "ux_hash": "045e587e05099db06ca4abad61b4d9ca2b410c8cfc192b13208c1b2b7ced3fc1" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "e9a6dd585b564b19c55d9f56188a45bfad32fa75703fa6336830035f6fa92e3d", + "inner_hash": "9cdad9a848f5b2993d1e5d0593e952b39ccdf7ae56bd13851449797cccdced5f", + "sigs": [ + "1f3d02abe6811c83b4f4b2e270366e8d4c591866b6e984cb8bdea5d80ca1edbb04d651449070bbca22a8c7cfb3d23a6f85c0a5a7e3226e2d0520330faf16291401" + ], + "inputs": [ + "6fb116c110fe391448a1dcb985b67439c2e9a71d8bb2fd1cf345ac73ada6166a" + ], + "outputs": [ + { + "uxid": "04471fb0797bb931e883f7b95cfff6ee4fea5e19a352ca5425fcd353c4f6aba4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "750600.000000", + "hours": 739 + }, + { + "uxid": "a4fdfce34725eb63941ac576651fa406272565a344ffb21435d285111efbc4db", + "dst": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", + "coins": "5000.000000", + "hours": 739 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 125, + "block_hash": "7f18db3c23f1c460e331749b92b08495b33f9da515e821f6faba239dfc1aaf9d", + "previous_block_hash": "d01a6811cc796d32d915257986177c5cf12dbd5f010bfff736457a114f9b6eb2", + "timestamp": 1429578056, + "fee": 555, + "version": 0, + "tx_body_hash": "1ca0a2d44b6439b91eb839e0f99405abdcafe2c1a49c8b49b1739498129bd1a6", + "ux_hash": "61157b2d787b3955cee3d5c9b2c1793917e35a96122e1e2d751db4c7c2acfe30" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "1ca0a2d44b6439b91eb839e0f99405abdcafe2c1a49c8b49b1739498129bd1a6", + "inner_hash": "1090d10a5a2210dc205d6f8447918670f9351feed057c76423629b4699777dcb", + "sigs": [ + "39817412c5edb4cd928aa3b79a022d4b3276af74eb377d3821c1e95e4d6c6acd61ebbf5eb5d32f87686b6cb4f09c2660e1f148192873208fc963d67a6945fe0101" + ], + "inputs": [ + "04471fb0797bb931e883f7b95cfff6ee4fea5e19a352ca5425fcd353c4f6aba4" + ], + "outputs": [ + { + "uxid": "6b616ad99a946538c3ab101f245bcab211ab39507848425e80cbfc8ec5bdbc67", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "738100.000000", + "hours": 92 + }, + { + "uxid": "a08089cd67896683d5dcb2d50256354e0d086b9854eb22bb6022cc459d447211", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "12500.000000", + "hours": 92 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 126, + "block_hash": "c25b843a329012e23094468a8485c6d989645478307e717db2b17c265d38646a", + "previous_block_hash": "7f18db3c23f1c460e331749b92b08495b33f9da515e821f6faba239dfc1aaf9d", + "timestamp": 1429680646, + "fee": 103861, + "version": 0, + "tx_body_hash": "a67ed00f815a2fd20d0efd18ac04663f0ee3d5621fbfdcdc6af250f19e3cfc53", + "ux_hash": "37e69db1869c70e70a342737933dc309a62528fd90ca96c7ace47ef25f28383f" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "a67ed00f815a2fd20d0efd18ac04663f0ee3d5621fbfdcdc6af250f19e3cfc53", + "inner_hash": "3587ee0a091f047bce0dc6f3a45ba08a0c95db33790c53185f6dfd626040b306", + "sigs": [ + "7753de16df3b46c78529de293ed45ab7d566f3a2fdeeff381aa8bc903111e62c117ce54623e582dceab853fd4d9431e05bd003ae0f470db915e555d3d6dea80500", + "414a1f765e1f437799d095f76a3e0ce23ab9ebe150be93e4f3d0abd72eb403ed32ddb15d36956fc9142cd4b5875d5769803e197bab3ecf91f6b72e75087f40b000" + ], + "inputs": [ + "e2512ec90800147d0d9ddbd0778511ee5a45a25efcb354c50a101738a65462c5", + "6e2abc4bc7820178358a603b7d99c4b39735dd1685d0c5a778ab63f29c9e93d9" + ], + "outputs": [ + { + "uxid": "bca6e6b24cdabecd77186a61168dd3e2290b2fda1b7a79eb3856ca4cc9f589e2", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "990.000000", + "hours": 17310 + }, + { + "uxid": "e4a83076c2ce1bd83953c1c0443054d7f5b0843c551d35b3fc3c116e9a9134d7", + "dst": "odhAMxHhXoBdx1RHNmfu7dTZ1LZivfsbiH", + "coins": "10.000000", + "hours": 17310 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 127, + "block_hash": "a5bea6636befe12f8eaef92076d54e95c00c83724d6a00a78027c0b656cf0e0e", + "previous_block_hash": "c25b843a329012e23094468a8485c6d989645478307e717db2b17c265d38646a", + "timestamp": 1429848410, + "fee": 3170256, + "version": 0, + "tx_body_hash": "243e1baa955c3f0af42d7acc4c920437dd0a99c754d6c5c2b7defcd143ff288d", + "ux_hash": "68180bffce77e7786aeac57c0db2e74788e72528a91bf51f00ad0d5a045811ae" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "243e1baa955c3f0af42d7acc4c920437dd0a99c754d6c5c2b7defcd143ff288d", + "inner_hash": "e7e030478e5828f44ec15b734638e8c2828f015b2fa5ca2823d24af3ad111ae6", + "sigs": [ + "1519c5c730648e7be553b2738aaeff38266735276e640c8f8d455f33c4fc07283ae5a7da47742df118337ff0548efebb1c75d0350a4e578ff95269182779db2201", + "ee099f6f42c813d13f097e9b3a8604067d6afd3718e6eeacd88fb25050d42b8603a42c4f7d24058483f70328a24fc91cd6ef190286c4a678e28b757143e23dc701" + ], + "inputs": [ + "c5df36ce47f6f183475317ab1c53eaa65428c142cb3e3906bf162d80519a203f", + "53b376413d550663ab51b229df8b0f55e4055d6577c2d8b5cec8ff748fe0e958" + ], + "outputs": [ + { + "uxid": "8169bf7f8fa21dc6400b60678b302946cf2765f44893ec8466262fc69b710591", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "30600.000000", + "hours": 528376 + }, + { + "uxid": "ef488d5f4a019502115d3b6b50bd364692315c3954d7e93c3ca22e11b92fc528", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "100.000000", + "hours": 528376 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 128, + "block_hash": "c55baca575f3902afc4865ccd856eae4833c7484524483df172a175c3e1a7d3c", + "previous_block_hash": "a5bea6636befe12f8eaef92076d54e95c00c83724d6a00a78027c0b656cf0e0e", + "timestamp": 1429849170, + "fee": 41968911, + "version": 0, + "tx_body_hash": "c2c9fe882df3b44fbb125b251a7604a7a4f4195dddff6e5396b7f130744e2b27", + "ux_hash": "506be1cdd8502e4d353f48440b18be3b9556b0512b1d418af79e2cacb2c9b494" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "c2c9fe882df3b44fbb125b251a7604a7a4f4195dddff6e5396b7f130744e2b27", + "inner_hash": "e23ed05dee949be1aabf237db1fd81be8d73c838eb0ee3026104807053269431", + "sigs": [ + "8e9b1733227a841009881663a50e1e01ac2790f16416c6f973c89e15a8fc216044e156cc8fee84d3e3cc6371e4da340f5312726bfd66f16a635542d63c869c7101", + "d1f6b7078a9032159a165ffbfb1e0665bf9ced2c3d5db795fd5bd11fc53d790f56589cbbffd117eec50aa0dc8c0e65eccb13c5ccb5d39dc9bae739a49dda03b201" + ], + "inputs": [ + "6b616ad99a946538c3ab101f245bcab211ab39507848425e80cbfc8ec5bdbc67", + "ef488d5f4a019502115d3b6b50bd364692315c3954d7e93c3ca22e11b92fc528" + ], + "outputs": [ + { + "uxid": "ecb92dc2f43d4c6ca124575d8456d8894f3cb137875287beaa73180fcae2b3ca", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "737200.000000", + "hours": 6994818 + }, + { + "uxid": "6143275de37a2b5ec802eeeb8d38a3dfb2db6629128e44c4f9ffc0ce8ddad629", + "dst": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", + "coins": "1000.000000", + "hours": 6994818 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 129, + "block_hash": "41bf956d514a87cff4231377b2d3487eb40ef2d804be347237caf75884f4cb4b", + "previous_block_hash": "c55baca575f3902afc4865ccd856eae4833c7484524483df172a175c3e1a7d3c", + "timestamp": 1429849180, + "fee": 401128, + "version": 0, + "tx_body_hash": "66d415598af081f8a7bd7f292468e67f380d06bf5896eb8152d4d9e8bcdf289e", + "ux_hash": "6bf11335504e4445ab91ac1d5cc80cce680a17758c343c41e69a804e74e795c3" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "66d415598af081f8a7bd7f292468e67f380d06bf5896eb8152d4d9e8bcdf289e", + "inner_hash": "3381919a36bb294377845155efa9f6ebb9314abbe5f9904b20ece45eb0960dc6", + "sigs": [ + "0a7f9eb68798320106f652933bd07181c80571a6f66215a5b10531f1205e0f300c702324cf9c368e67fef67dc42fbfee5bb13377c435873e549d9fd6962bad9501" + ], + "inputs": [ + "8169bf7f8fa21dc6400b60678b302946cf2765f44893ec8466262fc69b710591" + ], + "outputs": [ + { + "uxid": "78126a08c4dd4ea7ca2d6c9f9d4614fa58896ec4ea301cb9b450104b00bc1b94", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "29600.000000", + "hours": 66854 + }, + { + "uxid": "169e9a77557283e0d158fe6e35c439d729d73acfd00e2969147dacbdd599817e", + "dst": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "1000.000000", + "hours": 66854 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 130, + "block_hash": "b591d8741ee1c0996048ec1abf04fee1f46beac77636169f1e2399d275391bd4", + "previous_block_hash": "41bf956d514a87cff4231377b2d3487eb40ef2d804be347237caf75884f4cb4b", + "timestamp": 1430311531, + "fee": 50142, + "version": 0, + "tx_body_hash": "2df67e974b03b46be4e59fcf2f8b751d501f17f8610d5adf94551a7ecc6a58af", + "ux_hash": "b8b18ef9d97022d3f5397bdc35b9e5d411aaff0e598baa3437da9e1fc2c75f3a" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "2df67e974b03b46be4e59fcf2f8b751d501f17f8610d5adf94551a7ecc6a58af", + "inner_hash": "be6b1ad4d9985314d2bc6434f8a49cef708e7461f047154c7283e2a4ed13aae4", + "sigs": [ + "abbfcf7922d466e79c976809cf58932a7030db6b54465a2166168617e6acdafd3d7d62391c626e9c150155c63bee7cc887d84fb5f017298a0ce7c33859b21a4500" + ], + "inputs": [ + "78126a08c4dd4ea7ca2d6c9f9d4614fa58896ec4ea301cb9b450104b00bc1b94" + ], + "outputs": [ + { + "uxid": "903a1bca9b81ed76179cbcffe6e3c8eff269c94826148286f7be0b6038ee4ccb", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "28600.000000", + "hours": 8356 + }, + { + "uxid": "37cc43693a024f9122f5e1fcabeab5d53a4d58590df30a934fc7bc545936e049", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "1000.000000", + "hours": 8356 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 131, + "block_hash": "c81304abb915e3332344b876e675628dd3af311f03e975013d45fef36724bf7b", + "previous_block_hash": "b591d8741ee1c0996048ec1abf04fee1f46beac77636169f1e2399d275391bd4", + "timestamp": 1430330041, + "fee": 76257058, + "version": 0, + "tx_body_hash": "6538399868cf772fcfa96e68c51aa6aa66faa95d7c685432e4005880932be134", + "ux_hash": "0a32c89b53d12fb3b3c8ecb1de09a0d60f6a8fca12f7faa74ea5041bd469c617" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "6538399868cf772fcfa96e68c51aa6aa66faa95d7c685432e4005880932be134", + "inner_hash": "4854d5689f4c2b770d887ebf7f7d3fb975b295b0180d9354d69f2e322ae8b7b7", + "sigs": [ + "d213d50e53ceffd053571431b78fa6417abae8a7c5080dd3f8cece59dc61ad2444dd541540f5734d34dca94b3b975b613da0800121af8ec83b6f20d81cd53ffd01" + ], + "inputs": [ + "ecb92dc2f43d4c6ca124575d8456d8894f3cb137875287beaa73180fcae2b3ca" + ], + "outputs": [ + { + "uxid": "6b4ca83b3f73b62161c90c6da03dff460ca9a5a3ccd6fafca140137416dedc58", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "736000.000000", + "hours": 12709509 + }, + { + "uxid": "e7756fa7a5c067d595f7300828bc4c70152653700844130d88174ba37237e2a3", + "dst": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1200.000000", + "hours": 12709509 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 132, + "block_hash": "cdfc8bac020e63a5735750e39bc23e4a309cdc4014e025268020a8019fa33c99", + "previous_block_hash": "c81304abb915e3332344b876e675628dd3af311f03e975013d45fef36724bf7b", + "timestamp": 1430330311, + "fee": 9532133, + "version": 0, + "tx_body_hash": "3dfdfea4614d05c2f5eddf5773ef0afc745f1afe585141659df8e03e82897606", + "ux_hash": "727fd416b2e4a362417cc32f425a0c6ce6ed339ac79d3fe08c43038a1a627ee3" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "3dfdfea4614d05c2f5eddf5773ef0afc745f1afe585141659df8e03e82897606", + "inner_hash": "3a4ac407aeec6233d3edf787d5b1f4d8257b594e9ee9d0ad3c32781053579b36", + "sigs": [ + "f37f3398240cee8e38c41945db72d4feda20f88a2250528fe1165533acdc7dfc0f99c7db0fc965847a100d0a2f598537cdd8c73a96c5fbb4e5e85dbfd9a4384701" + ], + "inputs": [ + "6b4ca83b3f73b62161c90c6da03dff460ca9a5a3ccd6fafca140137416dedc58" + ], + "outputs": [ + { + "uxid": "2cd58783beb8a9f6278f7a097151531091b5f15afd7735e1facf02aa720c1191", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "735000.000000", + "hours": 1588688 + }, + { + "uxid": "333156ed20ba6937d3720af3a81939362b9f4ad1e9591bc676945ff0d202131e", + "dst": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 1588688 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 133, + "block_hash": "5377b5ef4c36dffa9e699a532e927898084d1a101cf557880bbc50b51a733de5", + "previous_block_hash": "cdfc8bac020e63a5735750e39bc23e4a309cdc4014e025268020a8019fa33c99", + "timestamp": 1430330421, + "fee": 1191516, + "version": 0, + "tx_body_hash": "d30cec3ad3a66562d2513a3656b366ea7da583e6ba45214ac12b9c2219b4c5ea", + "ux_hash": "8451012a69e56bc0d528bb5da1a1a7d07e3cc08a7c2b563edbb58382a6634415" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "d30cec3ad3a66562d2513a3656b366ea7da583e6ba45214ac12b9c2219b4c5ea", + "inner_hash": "58e355edef48ff22e9a83952130c1bd8fe9a7f9bec7b2e0535c103c0146604c6", + "sigs": [ + "09baa4739816e5a86a46ecc30df8c00a5f046ad687f0674250640b6df2361dfe3723667872e0f6deb1d3447948e30b06f02b056a62da9dbaaef4db000eab747e01" + ], + "inputs": [ + "2cd58783beb8a9f6278f7a097151531091b5f15afd7735e1facf02aa720c1191" + ], + "outputs": [ + { + "uxid": "52288a441c70260f6a3eab0e271969d54492377615a6fba8ec3ad26f11dc9768", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "734500.000000", + "hours": 198586 + }, + { + "uxid": "8b3d335360effd00cabcae13c2495f26f81743b82958629378b7bc78a7e460fe", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "500.000000", + "hours": 198586 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 134, + "block_hash": "d42fdd801ccc75cb92fcf63cddbe05adfe6e8d580ea65de0f94332db3f2fd79f", + "previous_block_hash": "5377b5ef4c36dffa9e699a532e927898084d1a101cf557880bbc50b51a733de5", + "timestamp": 1430330481, + "fee": 148940, + "version": 0, + "tx_body_hash": "44d05abc2637d9cd2047984023eb5cfa0a146e58821117de30f9c81703189cde", + "ux_hash": "a106098a9e2bf084efe238342aff5a777f7292219deb38a6bb2b6c97fd3fc1c5" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "44d05abc2637d9cd2047984023eb5cfa0a146e58821117de30f9c81703189cde", + "inner_hash": "44886be6952cd483b9425d314836714af65037b58923aa2432ea946131ae10f6", + "sigs": [ + "7990cb04634a5e0de397917e56480805915c73d265fe466757a9e677067483787d457c7e9931a89daa6260c7a262f49ef1503cc88008809c193f1f949badcfbb01" + ], + "inputs": [ + "52288a441c70260f6a3eab0e271969d54492377615a6fba8ec3ad26f11dc9768" + ], + "outputs": [ + { + "uxid": "e29ec214f4afd79e6465d03e4d88e552dc69654750a725d74873ee366c58e552", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "734400.000000", + "hours": 24823 + }, + { + "uxid": "d95d422fb8fe4ad9ce1052e566ec8a5ad7953ceb253366814b3d32e9a1da1f13", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "100.000000", + "hours": 24823 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 135, + "block_hash": "6ff9e724f389a79b0f36dbda6c527a77a5ea848c514c5f96b67c659b57146750", + "previous_block_hash": "d42fdd801ccc75cb92fcf63cddbe05adfe6e8d580ea65de0f94332db3f2fd79f", + "timestamp": 1430330591, + "fee": 18619, + "version": 0, + "tx_body_hash": "072f0738f834db0030d777e6ec0e0443627c51cecffcc55e41d43b0b8edd40d1", + "ux_hash": "4324929e8fd4832ca1e5552636ad4d21883c4aefa5ca0b4bab47d35b6283128f" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "072f0738f834db0030d777e6ec0e0443627c51cecffcc55e41d43b0b8edd40d1", + "inner_hash": "e87dc97ec672bb45a3417f307e6f6a1cd75b26f508f188c0554484740ffea8cd", + "sigs": [ + "da4e898bdf324ab50d8f007ee4c65ab832ba64cf86fd0a601e7007a4c3ac2eaa6f1304a3fc8088b108e3f417e5b7c90cbc7d80c059885d397ae978da89c92d5f00" + ], + "inputs": [ + "e29ec214f4afd79e6465d03e4d88e552dc69654750a725d74873ee366c58e552" + ], + "outputs": [ + { + "uxid": "8ea58a3736b35f0e3781e94198e8b73bba2536704b84b15900fb32701db8893e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "733400.000000", + "hours": 3102 + }, + { + "uxid": "617b584bb9e6b1d80daac915fb3079b22a326777d1515a40e7b7eddf427f4099", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 3102 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 136, + "block_hash": "227f82c4b9f509c3f346f0222855b3311924dc8bbcfca3e2e7431592373df2d5", + "previous_block_hash": "6ff9e724f389a79b0f36dbda6c527a77a5ea848c514c5f96b67c659b57146750", + "timestamp": 1430330851, + "fee": 2328, + "version": 0, + "tx_body_hash": "b9a795552bec1a722718b44a08ad152656242b1d23afb53d2247b3016d920b7e", + "ux_hash": "7f9134d8a5f432976a4fa787df29a481f8d74e2a8da7138cd19662b3bef08ffe" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "b9a795552bec1a722718b44a08ad152656242b1d23afb53d2247b3016d920b7e", + "inner_hash": "8096fec4a2738f5b79df5359724f6cd7597c0d8c5bc18419f5825c5312e1dac0", + "sigs": [ + "315cc1de04ad6d1d68e9d63027cff2abc74d5b11a376623d70211ac0e8b9feed4c7f7952634d60b57604edfbe63f02bef172486320e9790d0bb6e44099d6473500" + ], + "inputs": [ + "8ea58a3736b35f0e3781e94198e8b73bba2536704b84b15900fb32701db8893e" + ], + "outputs": [ + { + "uxid": "a1ed39cded6d9a0605b52f25cbedb363e57a168d1ad1d1db437816a401c061ab", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "732400.000000", + "hours": 387 + }, + { + "uxid": "e00c292e151fdafd24984b2dc08a4a328150006f95afaac9909dbffae1f07eaf", + "dst": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 387 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 137, + "block_hash": "7597c9f66417a8899eda6964240907092e878cc192b235b6e1a06a288de2d733", + "previous_block_hash": "227f82c4b9f509c3f346f0222855b3311924dc8bbcfca3e2e7431592373df2d5", + "timestamp": 1430504186, + "fee": 291, + "version": 0, + "tx_body_hash": "fc02772662176c282c2b6538732d3d6eb1399f006a0b52e64d07fc104038f638", + "ux_hash": "1a75b074da1b7e3e6fe9b26cd4a175ebe89e16c3f8917cfffa0ecaa458a5e075" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "fc02772662176c282c2b6538732d3d6eb1399f006a0b52e64d07fc104038f638", + "inner_hash": "a7ef2323ca6ef0a15173dcc2ef44c0abd10933be70337360408ffb4087affb80", + "sigs": [ + "9a30550db56d9c9ae901d835f856761b9c4298d56ffa94bf41eff5550ac180851189f2adf2e184b6f23485a1405eacb2d4cc937ff05490fb0bc609e654effd7900" + ], + "inputs": [ + "a1ed39cded6d9a0605b52f25cbedb363e57a168d1ad1d1db437816a401c061ab" + ], + "outputs": [ + { + "uxid": "f89c968840831d03abaf3c41cf8a405e4b4ddbfb19f5ba300a8ea8e4dcb1d9a4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "731400.000000", + "hours": 48 + }, + { + "uxid": "b6b6188973b600af774ad8a7b6d454f77713a51463b9a9a70c901ec5280a9789", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 48 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 138, + "block_hash": "205b52696e2ddc66a276041abeaff192865672a34678046e7b88c4c8d64543b1", + "previous_block_hash": "7597c9f66417a8899eda6964240907092e878cc192b235b6e1a06a288de2d733", + "timestamp": 1430504236, + "fee": 36, + "version": 0, + "tx_body_hash": "9880bebc51471e0b3c520920db836d674f652503314cd74069a59ccad0d0967a", + "ux_hash": "b113407099fd9542a9925c4b1e09e62350b2d6151731358a1c8187a7ee38024d" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "9880bebc51471e0b3c520920db836d674f652503314cd74069a59ccad0d0967a", + "inner_hash": "feeb2f638e91dd685e6fe179edc7622ef3fcc8a5a7e795c07be12e03f221f67f", + "sigs": [ + "a0c15d7d5f36afc4c78045aae19c8d41a8652f0cb6d633622a1e55b4e54cd5a33113b02c24b02cca10797043d992aaac98bdbb33addd038611ac324795733c0b00" + ], + "inputs": [ + "f89c968840831d03abaf3c41cf8a405e4b4ddbfb19f5ba300a8ea8e4dcb1d9a4" + ], + "outputs": [ + { + "uxid": "36972dc046829caa340eaecbfeb42f4174bcdecfb87296d56503e5fb10e9de8d", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "730200.000000", + "hours": 6 + }, + { + "uxid": "bceafc261a2250f1bfb8154aea88370acfe6a41a4216bcb76c2016451cbcffd1", + "dst": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1200.000000", + "hours": 6 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 139, + "block_hash": "9c31d9340bc0aab07837b78625468101d643044d4b38d3a63ec3af92007ae9d7", + "previous_block_hash": "205b52696e2ddc66a276041abeaff192865672a34678046e7b88c4c8d64543b1", + "timestamp": 1430504536, + "fee": 6, + "version": 0, + "tx_body_hash": "578075959959db70ae86f4f60d2ae3ff245727d086eef86ed80db5e1c7c9fbaf", + "ux_hash": "f594d0d454c7216dd6575d60f64b00ab88b064110b324058e094e1d632c40301" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "578075959959db70ae86f4f60d2ae3ff245727d086eef86ed80db5e1c7c9fbaf", + "inner_hash": "eead8ec3c5e86e73f1e7add274fdbe0cecd5cd68c4fcd3cf17c1c7af9c5ee43d", + "sigs": [ + "d6331b6d3270100b8b009bbd343d6b82208d622b27ca3a4b371492b9c792f8433c981c57dfc760a3974f13acd86bbb24555b958e0c67e247c5a39d97295022d601" + ], + "inputs": [ + "36972dc046829caa340eaecbfeb42f4174bcdecfb87296d56503e5fb10e9de8d" + ], + "outputs": [ + { + "uxid": "6962c7c1fcc98f532a9003990163bb251811a4700257968a641b1fe975cfc51d", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "729200.000000", + "hours": 0 + }, + { + "uxid": "278b0caa6dddf4ce74772471b15fb9a8c364362b0ae3eeb9379e980504d8d512", + "dst": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 140, + "block_hash": "939d45a9e5f77daf83af0dd2346f69d92a2ee7cc118038bd20d16ccf848ad344", + "previous_block_hash": "9c31d9340bc0aab07837b78625468101d643044d4b38d3a63ec3af92007ae9d7", + "timestamp": 1430504746, + "fee": 0, + "version": 0, + "tx_body_hash": "de45a24c9c32f808a3d928f30ba8e1b6ef8117a7c0b7a5d616734d9b121d0c30", + "ux_hash": "1ae1ea96ca1845708759569144b21b6646d615c0e4d5237a7b6a55d868f9dd27" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "de45a24c9c32f808a3d928f30ba8e1b6ef8117a7c0b7a5d616734d9b121d0c30", + "inner_hash": "efeb898fd032831cdd6d7c311f496f4c2622ee11bedc2831b6411cab51d44736", + "sigs": [ + "1646b02579d23e2350e2bc47340e027ad5f74bf55aba41fc1244631ba1e0577b681d364c3802017b5cc5d5fda972d23ac9bffabd6159384223a26aba5f08406401" + ], + "inputs": [ + "6962c7c1fcc98f532a9003990163bb251811a4700257968a641b1fe975cfc51d" + ], + "outputs": [ + { + "uxid": "d53fae3b48bde2d1328964a2e7f42e8e833983db159ba30f627926dea0db7df0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "728200.000000", + "hours": 0 + }, + { + "uxid": "cfdefd8d167947190a223882d20c8ac7880e550ad1a3494bb05bff4b1df4e3ff", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 141, + "block_hash": "71ad597d194d7090c1b3bbb8b37dc281fede373eaa81dab6d07226460f36e7b5", + "previous_block_hash": "939d45a9e5f77daf83af0dd2346f69d92a2ee7cc118038bd20d16ccf848ad344", + "timestamp": 1430504846, + "fee": 0, + "version": 0, + "tx_body_hash": "16f8b9369f76ef6a0c1ecf82e1c18d5bc8ae5ef8b01b6530096cb1ff70bbd3fd", + "ux_hash": "62c012a54d2808a078f06d0bde3bdfb54c5a1eb4df241600068b4b5726a081a6" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "16f8b9369f76ef6a0c1ecf82e1c18d5bc8ae5ef8b01b6530096cb1ff70bbd3fd", + "inner_hash": "529b1fd21087bf52cb3ebcf02dbe1e3ce5de9daefa9754e5b6cde7be2d8ab0c7", + "sigs": [ + "8612c9e160f3e0d7cdcb2adf3611bde867dcb766c63ec4312a9251ba9b6ea6997c0d9a6ce26beaae01e82c22d2b61e5ae7f87aeaf0679fde395888aebafde94500" + ], + "inputs": [ + "d53fae3b48bde2d1328964a2e7f42e8e833983db159ba30f627926dea0db7df0" + ], + "outputs": [ + { + "uxid": "228794e6b3eb69aecc5334e140afbad22883326dcf229bd3092f238ed9ec800f", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "725700.000000", + "hours": 0 + }, + { + "uxid": "908fe94bd28886547f1b7b4fc98d0990a08a216b70877341f566b6b4685de364", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "2500.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 142, + "block_hash": "5415760993e68334d9c577322e1c0b81f16ca724417174193c243ad8acef5765", + "previous_block_hash": "71ad597d194d7090c1b3bbb8b37dc281fede373eaa81dab6d07226460f36e7b5", + "timestamp": 1430504966, + "fee": 0, + "version": 0, + "tx_body_hash": "030177271beee04f1a0974d0c5042f07c7ca1db1c5d496fbee3c441b1b7c5bee", + "ux_hash": "f115d4e6e4f10823d5ebb04e913f61a42f6c77a5184d5f5f4af9a5691d94e1a5" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "030177271beee04f1a0974d0c5042f07c7ca1db1c5d496fbee3c441b1b7c5bee", + "inner_hash": "d954f0ee1a437cf3809961063145bb205633ac66d9a29e1386eddb13503ddac1", + "sigs": [ + "6e5661f0212dfa0800df968dac30f931335d7fe99d23932878d7d2c06bf69691328d66897c3a5c023535035ed95de3b396ea162e4482e70cda5ec9d4c8e36d4b01" + ], + "inputs": [ + "228794e6b3eb69aecc5334e140afbad22883326dcf229bd3092f238ed9ec800f" + ], + "outputs": [ + { + "uxid": "6efc30b4c943ba4de8d2c89901a0b2a4d9a0ecf34713917eae37c6debca616ed", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "724700.000000", + "hours": 0 + }, + { + "uxid": "18293d947aadf89d9e57d18fa01408867a9abe267504edbdabf8c2a57d9a6323", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 143, + "block_hash": "a6f2d5edeea837fd64c910f9dd0f09cb28f689e014a4f602376aeb7bd36ebc37", + "previous_block_hash": "5415760993e68334d9c577322e1c0b81f16ca724417174193c243ad8acef5765", + "timestamp": 1430505086, + "fee": 0, + "version": 0, + "tx_body_hash": "57150aecde96bde972183b9b0d7d27dda2c0179fb71630e92c27856d211335cd", + "ux_hash": "54090e16ca9d400aabf58a043688129ad46451dc200abcc9acaaee6278af6707" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "57150aecde96bde972183b9b0d7d27dda2c0179fb71630e92c27856d211335cd", + "inner_hash": "8fa5487fbcb62adb17287cc80ea02f113f036035e486fe7a37a96a98d32582b8", + "sigs": [ + "ba2442a6f68ef825f2921dc135eca398904426f8d225eb122b210670d1b3bf1b2279abcd5cce5c18533dd8ca0286b23e2be9605f1cb6a5820bc1c783e95b833401" + ], + "inputs": [ + "6efc30b4c943ba4de8d2c89901a0b2a4d9a0ecf34713917eae37c6debca616ed" + ], + "outputs": [ + { + "uxid": "6c8b1ba9dc7e8900b42d55e9fbe6ea0e00d7eaccf67a7b66c0a2b771cf88ea05", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "724200.000000", + "hours": 0 + }, + { + "uxid": "456bcb0a2e57a5c20f2757c8fc7669af1f969bb5a57f89965210daf7107993aa", + "dst": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", + "coins": "500.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 144, + "block_hash": "ad7799389d51ded0047284b4ab00fef54496c30b7ec21c5d22bb93431f5601a6", + "previous_block_hash": "a6f2d5edeea837fd64c910f9dd0f09cb28f689e014a4f602376aeb7bd36ebc37", + "timestamp": 1430505176, + "fee": 0, + "version": 0, + "tx_body_hash": "3bb9fc516dc2c522e28f99e6833253863c550547ce0e0a2dd963a0118b7a44a7", + "ux_hash": "95f733b768d9fa3958e49d04e9f0c7c69cfc909c57d80895e76893271d294106" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "3bb9fc516dc2c522e28f99e6833253863c550547ce0e0a2dd963a0118b7a44a7", + "inner_hash": "111d56ae43b76740e905717e1e440f7611e922c50e83cf84b9edc51efa0271f2", + "sigs": [ + "18f2b86a6b51999f0fdc73d411c1db827730652ba2c098f1ff3f3dc0d409d6cf745d18d66bf25dae7e5a975e33f32e8d2b352c025a8e20ff15a68aaa60b1bbb700" + ], + "inputs": [ + "6c8b1ba9dc7e8900b42d55e9fbe6ea0e00d7eaccf67a7b66c0a2b771cf88ea05" + ], + "outputs": [ + { + "uxid": "59d44fefbe86ebae4118dee90609d6a1c08c36f259c65e3fad63b9e41c37bf0c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "723200.000000", + "hours": 0 + }, + { + "uxid": "d8ee5dc5cabcf179365345167d39977ae38a71e55cf357881258be32a45732bc", + "dst": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 145, + "block_hash": "cb389e98bed24ef05313da0275c4b8e4d8038442b06d49fafa6217531fbc9963", + "previous_block_hash": "ad7799389d51ded0047284b4ab00fef54496c30b7ec21c5d22bb93431f5601a6", + "timestamp": 1430550936, + "fee": 693939, + "version": 0, + "tx_body_hash": "f25c1a8a4ae37e8e2b4a0ec6f2553cf11c57fa77de9556cd227857ca270a0275", + "ux_hash": "44eb50878e0a7eef3d8a7c026d9aec54507eb2d28c4898a8172f682a806e1480" + }, + "body": { + "txns": [ + { + "length": 280, + "type": 0, + "txid": "f25c1a8a4ae37e8e2b4a0ec6f2553cf11c57fa77de9556cd227857ca270a0275", + "inner_hash": "c41100ec46608d1982d52cce518abf64c3853a0fff71349c001accff2204de2a", + "sigs": [ + "f5521c2b488dbbd7bd856275b903e176f61a5cc940855d502493b834755fa9037cdf484fef8b3c7950ee166fa1db7bacc5ed18f96b48e13f849c96d76463dd6800", + "f324406fc1ad817ad53cd6d7718b914172ed80828650a6c7a4bd69143dd6be5e681ad4cc897ba5f237bb40836368c580e3fc8231c80ad0f91bf1fd17df28f3b800" + ], + "inputs": [ + "c2fcd55cf6b73e863c96f7c2d6251069199bfd43688d2515f5c6631688aadcbc", + "06292fe8a2036c38f28c4d2f355d9e86e2b55b9d85f84613a64cf5c35d192b28" + ], + "outputs": [ + { + "uxid": "7afab03c823346ff8b00c29df6acc05841583d90dfd451ba09e66884a48e83f7", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "2000.000000", + "hours": 99134 + } + ] + } + ] + }, + "size": 280 + }, + { + "header": { + "seq": 146, + "block_hash": "2e2d340c74deff80c804908b46a355605fdad219e70839d2288dfaffd5d8ff3b", + "previous_block_hash": "cb389e98bed24ef05313da0275c4b8e4d8038442b06d49fafa6217531fbc9963", + "timestamp": 1430641376, + "fee": 6894507, + "version": 0, + "tx_body_hash": "5701965d326520f86335da87c6d1781fd49f1e66520b94e1783711eba724f482", + "ux_hash": "f0108adf2f599f235b4ead2f672d7d8625243d6e0b2d1e880e2c77248a574e0b" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "5701965d326520f86335da87c6d1781fd49f1e66520b94e1783711eba724f482", + "inner_hash": "b792056beaf4a864c92e40ad63f9117fae52f4bfda9f88aa74f1255490c28ef6", + "sigs": [ + "1d98fdd17853e4265c17644a993fdbe5047418b7be96258fdf3c2b3e9c739b1d72c5acc23981dac2d478966834fafa1f98aab2402ce37fe818d3919cf490a5e900" + ], + "inputs": [ + "59d44fefbe86ebae4118dee90609d6a1c08c36f259c65e3fad63b9e41c37bf0c" + ], + "outputs": [ + { + "uxid": "5baf8c8ab1a01d80a6f496144815cf6bda5289b34055010e21324ea3950d3299", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "722200.000000", + "hours": 1149084 + }, + { + "uxid": "3dd82b00ef4d1e3b1c71be5f13c0c82b3e2b17af4a6b3eb4c966490f47866ccd", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 1149084 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 147, + "block_hash": "cf865cf260b6cf99c38563043300120213ddd03e385210e26c8b5ce8de212834", + "previous_block_hash": "2e2d340c74deff80c804908b46a355605fdad219e70839d2288dfaffd5d8ff3b", + "timestamp": 1430641536, + "fee": 861814, + "version": 0, + "tx_body_hash": "3fae944ef07d9bcba1bcbc8bde87da50a1232132074803f8442deb563ed2da51", + "ux_hash": "4b96fbb3a8ee726762486b7de743da01f7d5e70f6eeb3d3ed9ee1d27b5a07acd" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "3fae944ef07d9bcba1bcbc8bde87da50a1232132074803f8442deb563ed2da51", + "inner_hash": "aeceb514529fcf9de954599318d804301689818b8d5c90cdbd3bdf6ce3768c47", + "sigs": [ + "b6b837c14a65c31150c24f93ac60a9b49baeb963cf49a8d97e817883ca46a3763168988b69542c5a52b7501674271ded3888bccda558aad004902ab7b7010f5501" + ], + "inputs": [ + "5baf8c8ab1a01d80a6f496144815cf6bda5289b34055010e21324ea3950d3299" + ], + "outputs": [ + { + "uxid": "dd07d759d92e3d628a35c467dcd919dcae825a9fa79a14855714270dae08c0ce", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "721200.000000", + "hours": 143635 + }, + { + "uxid": "3ec30639c24acce65054bdb0d7ab0539199b64cabfcad83c2ed7f266fb8849a6", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 143635 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 148, + "block_hash": "89f6c33a3c65eadc28e5f84fb25422d21fd06f98ae60b824b8eccfddaaa24fb9", + "previous_block_hash": "cf865cf260b6cf99c38563043300120213ddd03e385210e26c8b5ce8de212834", + "timestamp": 1430642006, + "fee": 107727, + "version": 0, + "tx_body_hash": "79681167a7681edecb998e4a6dccdd0b7be45f163c8f6db23436517936269fb8", + "ux_hash": "39f1cd4b28dc61b08253bc51d39405ad8a35df87bee822f95e5259cb3dd202bd" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "79681167a7681edecb998e4a6dccdd0b7be45f163c8f6db23436517936269fb8", + "inner_hash": "b06c37ee520387277d5c174e0fefb11dbbbee9c7ffe53715b7b5bab8f4693dfe", + "sigs": [ + "150ffd203e65dac9dbfcaffb384a9233a274e0ced5a0c2fc9a3127e7a85df894124a5c1f0501c60640dce7d7c09cd1783ed61461f285fa89e6227ba1b427e81d00" + ], + "inputs": [ + "dd07d759d92e3d628a35c467dcd919dcae825a9fa79a14855714270dae08c0ce" + ], + "outputs": [ + { + "uxid": "c739b518f3f700e810f81523d81b15f968fbf202f389ceaa9d9f303319a00275", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "720200.000000", + "hours": 17954 + }, + { + "uxid": "5233e499bd3e38ec4d4fa4d750290f25271c91b4903630d461be51f3c2c02ebd", + "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "1000.000000", + "hours": 17954 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 149, + "block_hash": "4756bf71efc974ffaa99a1e06a9ca9cbe57784979cf270e72cd0e1955e777db5", + "previous_block_hash": "89f6c33a3c65eadc28e5f84fb25422d21fd06f98ae60b824b8eccfddaaa24fb9", + "timestamp": 1430642106, + "fee": 13466, + "version": 0, + "tx_body_hash": "b69536fbec9911da41e9d0c5ca73459f5e692ba155f8b72c0972792e9937a0fe", + "ux_hash": "ad890aa64b317d35948020e68f3e655ab582914fc4e92d62c58c00d3dc5c9478" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "b69536fbec9911da41e9d0c5ca73459f5e692ba155f8b72c0972792e9937a0fe", + "inner_hash": "a6d1d92496583cefdf9a9d4e278cdeac9d8e7c31eec3061f0a91bc0116ced8e4", + "sigs": [ + "d98168e1f19fbabcf0ec9fdf21d36486a2d70b13624bd2ec765bc773a08c7f5c09c7df2664e3205c7555bd3c5cb64ca78f5f0a81613ef4a7d740348e0132caf901" + ], + "inputs": [ + "c739b518f3f700e810f81523d81b15f968fbf202f389ceaa9d9f303319a00275" + ], + "outputs": [ + { + "uxid": "95694746f813d018be7988aec666b52924a7815adabe9cbdac3f6ab0f51bd1ab", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "719200.000000", + "hours": 2244 + }, + { + "uxid": "eb57ec196fe95a09be19b62b6837d5d12f99568ad0e5e198f70f55083acd656e", + "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 2244 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 150, + "block_hash": "746494f2e6aaa279cabea4cc0d46b1d95044e3f778fa26d39d21f5bf505cf2dc", + "previous_block_hash": "4756bf71efc974ffaa99a1e06a9ca9cbe57784979cf270e72cd0e1955e777db5", + "timestamp": 1430642306, + "fee": 1684, + "version": 0, + "tx_body_hash": "3e228564e3c187e22bd489857fdb1db7036021e19f688aad56cfee57d5e13ac5", + "ux_hash": "95367619af0f79026961c6458133ca702e8e98850a9a45295b8951d5f25feb8c" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "3e228564e3c187e22bd489857fdb1db7036021e19f688aad56cfee57d5e13ac5", + "inner_hash": "9b4783f4cd11a81e945a2d09b699f76254caa3bbf22ce8533f3b9f179c207702", + "sigs": [ + "8bd5632a52c39ef9e9ce90ebabd119c8f93e32a5a5b6e8fe80c58163b4adcc040725f18321894b59c3546c8ce9fb182e1a4dd6a3b4405229635e3ac3d80213a700" + ], + "inputs": [ + "95694746f813d018be7988aec666b52924a7815adabe9cbdac3f6ab0f51bd1ab" + ], + "outputs": [ + { + "uxid": "be958e5c47415291a781648335db24e448e1f4f09aa5e9c3f055fbc906b574d7", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "719100.000000", + "hours": 280 + }, + { + "uxid": "0fa23085def7c1dbc95587d3f0f58cbc30b09e099ee1afa42d9120452777740a", + "dst": "sV8sVBgs11uHQtZK5MPbYem2iJ6Hehghv7", + "coins": "100.000000", + "hours": 280 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 151, + "block_hash": "8fe743db56634fe05a28ac3479ff4b35c2324f8fde1115b582f85e42eda95482", + "previous_block_hash": "746494f2e6aaa279cabea4cc0d46b1d95044e3f778fa26d39d21f5bf505cf2dc", + "timestamp": 1430642426, + "fee": 210, + "version": 0, + "tx_body_hash": "18607765c3fbd45eafa15d2d62ab3cbc7ba7bd80c42931aae4db75aa02898671", + "ux_hash": "4b266d1cb0d20833a2a43044948aaa83c1b4881144b7616ae02b3ee85c13c292" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "18607765c3fbd45eafa15d2d62ab3cbc7ba7bd80c42931aae4db75aa02898671", + "inner_hash": "dbbf7608b67e82363ced90b364a9b8c91029b336ef2b68182d986e399eacb41a", + "sigs": [ + "1972310d45a5baf10a8d929a132c725c51cdd19daae3baa640570aeadbb08ea700fbe46e6649289bec61065b05250b84872002f93634e6be81bae042cf80854b01" + ], + "inputs": [ + "be958e5c47415291a781648335db24e448e1f4f09aa5e9c3f055fbc906b574d7" + ], + "outputs": [ + { + "uxid": "68165429853e18e4414ec6c15630262ebcaa802ff1d83b6cbe116db51cb32066", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "718100.000000", + "hours": 35 + }, + { + "uxid": "efcb1b5f54bceb2d0124d2f89c47d071c2943fb228c2eee62bfddf6e1418cfc8", + "dst": "pMub1Pz3SLVaSwHoomgp5oDVxdkVxLkW6L", + "coins": "1000.000000", + "hours": 35 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 152, + "block_hash": "febfd5d251995c214b17c3d71972f7048a171982fe7f4f7abb6998b485b95cd1", + "previous_block_hash": "8fe743db56634fe05a28ac3479ff4b35c2324f8fde1115b582f85e42eda95482", + "timestamp": 1430642546, + "fee": 27, + "version": 0, + "tx_body_hash": "dc10e0565a14dfecda066577581f3e2d073de34ed3e911ed94413d38fc0a33d2", + "ux_hash": "170ad8a7f0d8441091341dc79a0c7c04d46ea47e60e58623a71b442656050a68" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "dc10e0565a14dfecda066577581f3e2d073de34ed3e911ed94413d38fc0a33d2", + "inner_hash": "821dfa6422bb093a528a2ec2bedd0566599cef3e2f4f91441f3073888e092832", + "sigs": [ + "1bb9e5e58a4a7dfc9a29bb22eabb2ee4dc6e40dd71b35962adf95d1c1208309727f070257b4591e959a4965cb8d22710233dd1f65c3b58ec47bb71e3d7ebd3e700" + ], + "inputs": [ + "68165429853e18e4414ec6c15630262ebcaa802ff1d83b6cbe116db51cb32066" + ], + "outputs": [ + { + "uxid": "46aeb9ea01bb04e28c55ef11f8e75434dbeee546f7e06bdef332c604590c48a1", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "717100.000000", + "hours": 4 + }, + { + "uxid": "c0548bf35c950a74c206d2c565e3bcac1f2abe170ebabdb7b74e439b642dd9fd", + "dst": "22WGCstVJGVyqnBuvGHt17L5aNNMpURvckd", + "coins": "1000.000000", + "hours": 4 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 153, + "block_hash": "84dbe57c5d58b0b412d23e66e47578df7be40779c3dfb55178e08d1aa7921df5", + "previous_block_hash": "febfd5d251995c214b17c3d71972f7048a171982fe7f4f7abb6998b485b95cd1", + "timestamp": 1430642816, + "fee": 4, + "version": 0, + "tx_body_hash": "b0d7ff47658b3e32d8457eb62f6df0c7caaf7feadcbf8cc0c713976026f0404c", + "ux_hash": "9fd52eaacfbcc7b88318fae11a7723eddf1184868d159dd7083bce0cb025e375" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "b0d7ff47658b3e32d8457eb62f6df0c7caaf7feadcbf8cc0c713976026f0404c", + "inner_hash": "5154559a3393277ed8db279bf27a9572c9aeebe81f321d9fb07a5e4313005a90", + "sigs": [ + "a3edf9a3203fc696aefde6180d6c28fbaf3f4ee662ea90d82a93c3a8485593465f956713abfea8322b952d61969b29267f3826775638da77a1bf8567a40564e500" + ], + "inputs": [ + "46aeb9ea01bb04e28c55ef11f8e75434dbeee546f7e06bdef332c604590c48a1" + ], + "outputs": [ + { + "uxid": "598503902d2e6cb62d6f6478f09d8da05af6fd2da92b50825da3b7f74b2df34c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "716100.000000", + "hours": 0 + }, + { + "uxid": "045dc2e76321e37884588093083ce1b21be12f20ba1fa36f2a755b894229e3cf", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 154, + "block_hash": "54c4a6402aa7074c6857844f64e185401d674c4e6f15627b5c1a8fd3e0e568f1", + "previous_block_hash": "84dbe57c5d58b0b412d23e66e47578df7be40779c3dfb55178e08d1aa7921df5", + "timestamp": 1430643706, + "fee": 0, + "version": 0, + "tx_body_hash": "be0957035ed2ac444f67273fc5c1c6a39ee373f6f83d1604d0023742a8cd7e42", + "ux_hash": "56b56c56ad0aaaf6b7ce3e3845f74776049887c452974d68b46af72e8ca30136" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "be0957035ed2ac444f67273fc5c1c6a39ee373f6f83d1604d0023742a8cd7e42", + "inner_hash": "957140523c9acc14a4f6b6a2fd05e70c58d2ed51f43b4e88b1406b398f4e7b2e", + "sigs": [ + "ee25ac881aa867780086df4716864a9ec524deeecc140faa60b9f9b87805816c22659836b5169f8eab0977a2337638b6ed7cd7c4a5d4ee3664e7ad28e91dd5b901" + ], + "inputs": [ + "598503902d2e6cb62d6f6478f09d8da05af6fd2da92b50825da3b7f74b2df34c" + ], + "outputs": [ + { + "uxid": "4b917e7bd3409c43f9f670f2846ce74f9288708df5aa1d9ae142f2411ce426da", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "715100.000000", + "hours": 0 + }, + { + "uxid": "dbc58940c2457359501c9906589c3d0a0ab7695b983ad79f2bcc087a675671f6", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 155, + "block_hash": "04d1b2a0a9e6ab9035cb8265cb2f75af6a5c31bb9a6f927f545be08a9b1379cf", + "previous_block_hash": "54c4a6402aa7074c6857844f64e185401d674c4e6f15627b5c1a8fd3e0e568f1", + "timestamp": 1430643906, + "fee": 0, + "version": 0, + "tx_body_hash": "c9582c8134fa64fdf08cd93d42035adcced3f16aa8ee1a1393e3fcd7c07aa40c", + "ux_hash": "6f2840ca10cb769938ff77900c1bead9f5636b33a59fbd7141b00e9b8ea35e85" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "c9582c8134fa64fdf08cd93d42035adcced3f16aa8ee1a1393e3fcd7c07aa40c", + "inner_hash": "ecd6b0cab28125e3ec1fe23a046c259a7d608802da7d6397dbd8b410de03b94d", + "sigs": [ + "95e5d5d0856bf5387de8fbdae05f5953510fd85ec346e65fa5fb68984bdb1ab83aa7807e57f00354d934f84a0034ecf8aa74fe3b8e9e480021873f62827770ab01" + ], + "inputs": [ + "4b917e7bd3409c43f9f670f2846ce74f9288708df5aa1d9ae142f2411ce426da" + ], + "outputs": [ + { + "uxid": "d50a372f8f8cd1e0b10d847613b68ee760f195f5f212d6c59e86312c84dd07ac", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "714800.000000", + "hours": 0 + }, + { + "uxid": "25a72cc385c1cdabd0ffd7c141ae205d767f3d016c281f835b9f58f9325bd2a5", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "300.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 156, + "block_hash": "ce3bfce7158586ef1c9080fd8e8dd2017ebb7ec2a9634b03cc2c359fa4cefba6", + "previous_block_hash": "04d1b2a0a9e6ab9035cb8265cb2f75af6a5c31bb9a6f927f545be08a9b1379cf", + "timestamp": 1430644036, + "fee": 0, + "version": 0, + "tx_body_hash": "29a883ef9dc67bc683014187b9865c827b5e2f8afd7bf6f3787483318063789e", + "ux_hash": "f407bdb9a454483ea14752c56c622b4268b2bd74f3fc6aab24dc769beba45c4d" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "29a883ef9dc67bc683014187b9865c827b5e2f8afd7bf6f3787483318063789e", + "inner_hash": "bf3a81668fb27c0f55d9ec33490cb4c91ec7636ec1f85761fadbfebc020a618a", + "sigs": [ + "970a22ba9a849caf00fc787a182dd67a3be794db9d66c691e9d904a78f90397542dee63e801c8b7f4077060fda76f0ac56a67b30865cc4634679f118abe04fc101" + ], + "inputs": [ + "d50a372f8f8cd1e0b10d847613b68ee760f195f5f212d6c59e86312c84dd07ac" + ], + "outputs": [ + { + "uxid": "896865f9b610f9fb69a741596b3ecb9fff3790d40476a9f7852831bdf477aaee", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "713800.000000", + "hours": 0 + }, + { + "uxid": "a34cfb6f175323917dfda72d58ddcfb86363cc43d22a0c6c3141810f5cac5aa6", + "dst": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 157, + "block_hash": "05187ea3b0ba876a138a518ac4d1ff1100251701481d348e8c94864bb2b00435", + "previous_block_hash": "ce3bfce7158586ef1c9080fd8e8dd2017ebb7ec2a9634b03cc2c359fa4cefba6", + "timestamp": 1430673946, + "fee": 0, + "version": 0, + "tx_body_hash": "c3fd04cd27ea311b1a67d40cd3dbb2ea8ae2c6f6139620cb86be29f33ed99171", + "ux_hash": "477f749b867d0a5c50ada0728e9781a15380ad5a23d4fd62c91c617164739b40" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "c3fd04cd27ea311b1a67d40cd3dbb2ea8ae2c6f6139620cb86be29f33ed99171", + "inner_hash": "5a975ee4a0f95c51a0a847b1d082bc4859a4b7904acbaece151c58e01f26a870", + "sigs": [ + "06c22eb6cb03468010ffbd2b54faa5835ea44cf552779b0adb09817db7e5494d49031d2e4b8994b670857b193766a1f430857955edd627f290f71f970407139b01" + ], + "inputs": [ + "896865f9b610f9fb69a741596b3ecb9fff3790d40476a9f7852831bdf477aaee" + ], + "outputs": [ + { + "uxid": "272d5bbd86a87796a20e3e4debc46a2076718800343bee4f72fc0217a98a10a3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "695800.000000", + "hours": 0 + }, + { + "uxid": "25130a18aca13a37e4f4c08733cdda6a8629759f27ecba775999486c9deffa5e", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "18000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 158, + "block_hash": "3437e493d6e8a8a970b549eca7592ae46da9e243c75694de0e214f82740a0199", + "previous_block_hash": "05187ea3b0ba876a138a518ac4d1ff1100251701481d348e8c94864bb2b00435", + "timestamp": 1430674696, + "fee": 0, + "version": 0, + "tx_body_hash": "3d9f1aa1b6206275081cb9c26155f6261be1ef9c94b4eaadb1a7e8277a2099fa", + "ux_hash": "bec25fbd537da53dd0516ad735e35e48355955e4c07c1eba0d1c0c1cfe9d0b43" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "3d9f1aa1b6206275081cb9c26155f6261be1ef9c94b4eaadb1a7e8277a2099fa", + "inner_hash": "ef7915c2cc32cfd043bf60533a563a89ee68a7b2f88e9e1e55e6a54494bde805", + "sigs": [ + "6d2993d471d4b27d4b0c2beef286dab7e38013853926fef032a8a10d9161fbff59b4eba58d7578182f9f1e79ee763ab409aec46748351b0a7d1a020a3fe3824100" + ], + "inputs": [ + "272d5bbd86a87796a20e3e4debc46a2076718800343bee4f72fc0217a98a10a3" + ], + "outputs": [ + { + "uxid": "60906201d3e7c67ddb976972460b2b8ed093e1f6720a784cbaea376ca13e6cef", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "670800.000000", + "hours": 0 + }, + { + "uxid": "c61f27a2247831679d8df293bf9351b16e8429778c875be2cb64224bcb842ed4", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "25000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 159, + "block_hash": "ff9538e4db5d5e121eca8a500c56842ce413d9a28187afeea2057bc16daf1eee", + "previous_block_hash": "3437e493d6e8a8a970b549eca7592ae46da9e243c75694de0e214f82740a0199", + "timestamp": 1430715196, + "fee": 0, + "version": 0, + "tx_body_hash": "d720ca0efb19b964f481724e5d3f932841e9e75a69b998baf4b575cf3298cb87", + "ux_hash": "1ee9f722d9a194c61afb295639ca3ffcce249a1c11c46a0d66670d3bb8fd4a6c" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "d720ca0efb19b964f481724e5d3f932841e9e75a69b998baf4b575cf3298cb87", + "inner_hash": "b35da2487dfd396bc01b5296fab691557760886b23ba5bd18e52808549dbfef2", + "sigs": [ + "9cb0a128d17a9c42f3e4e44f4da9106ef11407da8d9a434745add4c5f7a8e379325976d8c2222c3328acdc2c6ca597fab4fae292c5529e07c55919ce0e0320ca01" + ], + "inputs": [ + "60906201d3e7c67ddb976972460b2b8ed093e1f6720a784cbaea376ca13e6cef" + ], + "outputs": [ + { + "uxid": "4912e9dbbb5a4cc7472c27b0212ab443e7b5499207b10666a66257005e182714", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "664464.000000", + "hours": 0 + }, + { + "uxid": "b1e5c694c30326cda3df2e634723999befbcbb141415e9a36bdbf18d7bea9870", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "6336.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 160, + "block_hash": "a1c8c6cb45bb12cb563b9554d71c9fb8fe9c4d6e902b664d2a5ca6007256d75a", + "previous_block_hash": "ff9538e4db5d5e121eca8a500c56842ce413d9a28187afeea2057bc16daf1eee", + "timestamp": 1430784172, + "fee": 0, + "version": 0, + "tx_body_hash": "0e8e352b1f2cd419bca619918ce6d5ec1eac0ba7252d76eef5d9d8f8186f737a", + "ux_hash": "d7596292f43d66b82b0e121d29bf996fff6dcc40a3aa7f5cc89f093410615cf7" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "0e8e352b1f2cd419bca619918ce6d5ec1eac0ba7252d76eef5d9d8f8186f737a", + "inner_hash": "49571d7e7c6b3e473b938f1cf4748c67f9301ca710f26ee56d0d8e231cb4515f", + "sigs": [ + "8d4556a22c5fb84792cc88bfb47f795e6ba9fc211933776acd89b6da9aff71ea7803bf5b0e1d9afef2f3f77bbc4a7633c459ab9cb11a06723c4cad570717edfd00" + ], + "inputs": [ + "4912e9dbbb5a4cc7472c27b0212ab443e7b5499207b10666a66257005e182714" + ], + "outputs": [ + { + "uxid": "659bac1636b64087ad5d3cb0ae78c52f28ad920016ec67e08415a537e0343072", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "663464.000000", + "hours": 0 + }, + { + "uxid": "ea18f151bbdb611f73596b61ebb0546b9e91281ccb0bbe07a18e7fa69142bb5b", + "dst": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 161, + "block_hash": "fe3bc8a9bd17eb6583d9f4e806c20c8d8f89382df32f6a3b6bb8de6a2faf1ee6", + "previous_block_hash": "a1c8c6cb45bb12cb563b9554d71c9fb8fe9c4d6e902b664d2a5ca6007256d75a", + "timestamp": 1430784312, + "fee": 0, + "version": 0, + "tx_body_hash": "d5091ca65ff61998dfb4535a7927fb736abf2a81140a11322dcf8226de27cf92", + "ux_hash": "379551206d8cec6a0b2b35f661957e53687a500dbca0a050b81d55110b5ee077" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "d5091ca65ff61998dfb4535a7927fb736abf2a81140a11322dcf8226de27cf92", + "inner_hash": "7a000aaa5751b65d3bccd4d307b7b8602aae539971de3af3baa3e126d52a54f2", + "sigs": [ + "693d3153218a69e2ef1e676d6c124dd7fab7ee312d41fd9dbe005a0e681a8b052708a9559fc08e8173e1ef83e45f838742e4a1af765ea7f0fddb38cee2cced8000" + ], + "inputs": [ + "659bac1636b64087ad5d3cb0ae78c52f28ad920016ec67e08415a537e0343072" + ], + "outputs": [ + { + "uxid": "97f64c3c636e5fc997e277cd48644055ef51045ed9c473c05dd6e699872a6c3d", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "662464.000000", + "hours": 0 + }, + { + "uxid": "0c19e689e0e34639c71b0136ce336121b042b6d4ac185ac1f9e94ec7535e781f", + "dst": "XnKU1htBL5wFSMX8oytZBsBMeaBSbVNivT", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 162, + "block_hash": "2aaa458d90b3377fd219aef75821b4c8dbd61dafea93deb70ec6282adb08cf7c", + "previous_block_hash": "fe3bc8a9bd17eb6583d9f4e806c20c8d8f89382df32f6a3b6bb8de6a2faf1ee6", + "timestamp": 1430784372, + "fee": 0, + "version": 0, + "tx_body_hash": "30e66ff45cfb145eb465e2ebdef0bb10005138bc1727c83888785b04d548e85b", + "ux_hash": "ca4b55c8abee72fb01a725e4daf45494ae5352fb3494d68334ccb140a4505bc6" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "30e66ff45cfb145eb465e2ebdef0bb10005138bc1727c83888785b04d548e85b", + "inner_hash": "c87fb6e81fc1d99b16958d4626aa0e5ec4033443230bbc8b35e2882c078bf868", + "sigs": [ + "b4feadec09b450b99795044931a94f7b8549bf876db7c62132df60056dd0c88e3821d1656407b1572fbb04eb71f6de57db43c997501989f44042d04fc3afdf4201" + ], + "inputs": [ + "97f64c3c636e5fc997e277cd48644055ef51045ed9c473c05dd6e699872a6c3d" + ], + "outputs": [ + { + "uxid": "122b7a9a61ee04e071002d74ffb26b12ed7952ff9a138b5437f990f4678cc2e5", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "662314.000000", + "hours": 0 + }, + { + "uxid": "db7a63750db787959a9e0d2d6be9a1ba8bb3d6015bae2353a27ae9eb55b39d22", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "150.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 163, + "block_hash": "64a69161afc94dc8abf04dae5e1db3dd37a1bc6d92721301262e3b5b97b2ed7e", + "previous_block_hash": "2aaa458d90b3377fd219aef75821b4c8dbd61dafea93deb70ec6282adb08cf7c", + "timestamp": 1430784932, + "fee": 0, + "version": 0, + "tx_body_hash": "ec79854fade530d84099d5619864a8e1e8ec9d27a086917a239500cada43c6e8", + "ux_hash": "d667c86a072e96b43b096d1f4909d91368c089433adafeef2c0219df9973a9fe" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "ec79854fade530d84099d5619864a8e1e8ec9d27a086917a239500cada43c6e8", + "inner_hash": "ed6a317c8ea3624337463c1cca78bdcf87bf80dace1bccad050d27a49d3ea1d2", + "sigs": [ + "c0548625b3bc88308155f598c3304a124632c0faef8005b8f9306b229b632b253c5e163a02409ba40b01560f77a6acde2ccc48cb0efedd4feb68ecbd925917fa00" + ], + "inputs": [ + "122b7a9a61ee04e071002d74ffb26b12ed7952ff9a138b5437f990f4678cc2e5" + ], + "outputs": [ + { + "uxid": "c07593d4329f82da243e4bbd7430e4b10e7b35f9ce0a3718d0e6d25d20b4939b", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "661314.000000", + "hours": 0 + }, + { + "uxid": "250543215c71a1a9ab7740fff25c3bf9695fcde10bceba3717aef9d0f6dd40d8", + "dst": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 164, + "block_hash": "da48eaee8f9f968a7a13d3a480eba216342593079cc3877bd08b7121589d1e09", + "previous_block_hash": "64a69161afc94dc8abf04dae5e1db3dd37a1bc6d92721301262e3b5b97b2ed7e", + "timestamp": 1430790052, + "fee": 0, + "version": 0, + "tx_body_hash": "743bf1eede313145824db1c4f8d683b74ab5e0bc825082d986308b73fd52f1d7", + "ux_hash": "b9f75495ffa7bc8af5bd2fa4ec693b58516d9b4fd312b5ce5fa2e764116343d6" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "743bf1eede313145824db1c4f8d683b74ab5e0bc825082d986308b73fd52f1d7", + "inner_hash": "a0427c37a8ca9f8205630cc8d4c6d95200413d3397a0de9bf015763107b8fc80", + "sigs": [ + "dc400e921f7f94da5f353846f1340e039b4527fff121a56579390fb4fa4154634e3b3aad44ddf0aaebea5abc1dc5ba2a00540fd2888ed5c4ab7b20c51255086a01" + ], + "inputs": [ + "c07593d4329f82da243e4bbd7430e4b10e7b35f9ce0a3718d0e6d25d20b4939b" + ], + "outputs": [ + { + "uxid": "4d52106e41dba0099549fd81fb8feb6915225b0125c53faa0f7c578ea78f213a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "660314.000000", + "hours": 0 + }, + { + "uxid": "bc513a68461d5c401e65a500baf7dfa163735ef63b817bb7b73c4139d5c29d18", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 165, + "block_hash": "f2df5ef2ee10bb6c302f205d97bde35caa2527db769d87ea02d3892259f3daf2", + "previous_block_hash": "da48eaee8f9f968a7a13d3a480eba216342593079cc3877bd08b7121589d1e09", + "timestamp": 1430790152, + "fee": 0, + "version": 0, + "tx_body_hash": "3991a257eee265481e713917a3a9c15756f61175bcfc7acfdbe84158e43fd5e6", + "ux_hash": "39db90f061f4054b49c458a63cb76f70ef863d90f7d57f6eeac2654793772cf0" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "3991a257eee265481e713917a3a9c15756f61175bcfc7acfdbe84158e43fd5e6", + "inner_hash": "dea502923be2dd8b4c48eb7ed2b146793ef840e9749d129bf7f6bda0fdcc43de", + "sigs": [ + "dbb23f6d22438c10b98b437fe2ee4d7c5513aba7b0b6141648ac22f07e3768fc5d8d80f9dbcaa95edf925668b6018793a01ca70cf7b48d7c7deac106557ebf7f00" + ], + "inputs": [ + "4d52106e41dba0099549fd81fb8feb6915225b0125c53faa0f7c578ea78f213a" + ], + "outputs": [ + { + "uxid": "fef9dd3b633274743099e607d9229717a001d6de6a4031479cc30d31d65e8396", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "659314.000000", + "hours": 0 + }, + { + "uxid": "5954742a6ca4e3e872d12d4a93436451ad52e6d25e5ac28371e308b2d7ce75a3", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 166, + "block_hash": "7b56941017940ca11f48cb71f0830f3aa06489942d118e9e2782ea040568c1c3", + "previous_block_hash": "f2df5ef2ee10bb6c302f205d97bde35caa2527db769d87ea02d3892259f3daf2", + "timestamp": 1430791622, + "fee": 2964031, + "version": 0, + "tx_body_hash": "41589644ea3a344fc616bec0058cf916b8efa5da7c3539241244827bd7e19811", + "ux_hash": "1386a916d2f0e59c5d1fcfbb8707a2cba527fd15486585a42bef96f52a4f9fc4" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "41589644ea3a344fc616bec0058cf916b8efa5da7c3539241244827bd7e19811", + "inner_hash": "140c70de73812b1da58d3df6c62696a0ced32ac1ea0818c3c53da4968407eae4", + "sigs": [ + "c9198240191df5c8b107cb7b6fcb5f4a572d8ae2ac85dd0def832df2f9cd7d806594c1ad2bf2279507de1b9f1e7cb067a4c5562dedf3e40c29fb23387e28277c00", + "cd4e83142b6592dae1d61f92a82b0e17ae43a34207c69e1970cc5e8e8badc06f4067f36da90a142e963d5e35228c0f405482e38064c69eb5d882b6d619109baf00" + ], + "inputs": [ + "37cc43693a024f9122f5e1fcabeab5d53a4d58590df30a934fc7bc545936e049", + "903a1bca9b81ed76179cbcffe6e3c8eff269c94826148286f7be0b6038ee4ccb" + ], + "outputs": [ + { + "uxid": "074645413ab2aae818e657f6f36420447a872e7cdd2ff64324b486be4d4d1edd", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "29100.000000", + "hours": 494004 + }, + { + "uxid": "b945bacb354173c33bc41503f50c29ad5d1d333ecab66b0c70d0ed9e6eec7f3a", + "dst": "2kN23viEG7Kn3Utuwz9voM4Z8ohLR9Y8L2v", + "coins": "500.000000", + "hours": 494004 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 167, + "block_hash": "0f3d6d37388d2a11c7f3532b279d73e01b84987a6a270e920d8f4c30e15ad4c4", + "previous_block_hash": "7b56941017940ca11f48cb71f0830f3aa06489942d118e9e2782ea040568c1c3", + "timestamp": 1430791902, + "fee": 201915, + "version": 0, + "tx_body_hash": "b29222c08f10b8bc4ea18981519a3b0e02b9c9cec63ee28d9ffa2efcaf2a8e5a", + "ux_hash": "7501b8b1ce87f4bb964972942450137fceb82361fb33f604b45719b9a7a32e45" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "b29222c08f10b8bc4ea18981519a3b0e02b9c9cec63ee28d9ffa2efcaf2a8e5a", + "inner_hash": "61c38575be160010335d96cf7c6ef0608cdb7b85079f2518532d00b6f42f13d0", + "sigs": [ + "cb5c75671164755516cbf4d94e2288d56985b4d3113538bc818d1aa1c944a76b1beae28964c8e596ab0cd252cda6cf2a5468cbd0dbeff21e35609b5a6577eb0a01" + ], + "inputs": [ + "fef9dd3b633274743099e607d9229717a001d6de6a4031479cc30d31d65e8396" + ], + "outputs": [ + { + "uxid": "21f0fb666dca05d7a43ab26a378f7f7eaedfacde22fa047ca72857e9509cc748", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "659214.000000", + "hours": 33652 + }, + { + "uxid": "0b5e5259c276ac949de97062492ea6dc93ae6215c8dd1615862907e3c3ae9cf0", + "dst": "2A2YC8kxWnUDbscpzZ6UPfNAmx5ddKBeYNs", + "coins": "100.000000", + "hours": 33652 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 168, + "block_hash": "28b685d4f92a59a055f2e8154da0650a81e912616e90ca21d6949a3cd75634e4", + "previous_block_hash": "0f3d6d37388d2a11c7f3532b279d73e01b84987a6a270e920d8f4c30e15ad4c4", + "timestamp": 1430792072, + "fee": 25240, + "version": 0, + "tx_body_hash": "50fc81b0ba25669105a169a969459ccdb10278051b604a3f91467c2528c83652", + "ux_hash": "524c84abf87fc6ba4ee491a3181c2b0ed8d0e3e7002d4f9e5c7bb9bf229fedd2" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "50fc81b0ba25669105a169a969459ccdb10278051b604a3f91467c2528c83652", + "inner_hash": "c356824e25deeecd3f531eb56a26d5875b7b81743e9c8f3d6beff5f634bf5e3f", + "sigs": [ + "ac3b968f82649fac3822db1af5c0be17fc20cf86e091362b1584a2b66c033b10541f70fb6f55d8e1b3c57161ce37412a52d2009dd8abc9ef7ab038b19d8d644401" + ], + "inputs": [ + "21f0fb666dca05d7a43ab26a378f7f7eaedfacde22fa047ca72857e9509cc748" + ], + "outputs": [ + { + "uxid": "6b3a0cab1d9ad6fd011a3bac5e6ff4e3f7903bce911dc7fe83926eae557c34c3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "658214.000000", + "hours": 4206 + }, + { + "uxid": "a02148f770788851a35fb90567510044e37f8db930deab7a2b584af67c8efb2f", + "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "1000.000000", + "hours": 4206 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 169, + "block_hash": "e266c8beae9f650a3f1cdfa611d9016d99e2ba4b4a67b5d6c4629bc6e66f5f9e", + "previous_block_hash": "28b685d4f92a59a055f2e8154da0650a81e912616e90ca21d6949a3cd75634e4", + "timestamp": 1430836392, + "fee": 421, + "version": 0, + "tx_body_hash": "acfb61f7ca39d5dfe33e8ed66f73ab181da0a3206d457bf055dcc4b9731a3ec8", + "ux_hash": "5c583bd423444d9974a543bbe59e648ca0c252a899fba4731642b02b4d3e28bf" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "acfb61f7ca39d5dfe33e8ed66f73ab181da0a3206d457bf055dcc4b9731a3ec8", + "inner_hash": "85c5d3963f2dce44e99500967e8b8b1943839537fb198186131459a3022d161a", + "sigs": [ + "473114dcb42e2091f3d0396ecd16ee2685e0a6074c7de218cbd7e7c4335d89146455bc6c259c77f40d4af769e241aba1e3a102c5755946b1783c817ffafa67d101" + ], + "inputs": [ + "bc513a68461d5c401e65a500baf7dfa163735ef63b817bb7b73c4139d5c29d18" + ], + "outputs": [ + { + "uxid": "639e69c4a223b5082b9274caf3e56ecff2ab55cd90cac94fdb4c383a1013ba1f", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "990.000000", + "hours": 70 + }, + { + "uxid": "bffea1990d71311b695b2d343b9f09a216b7a8257c1cdcb01b2ab9459e1490e3", + "dst": "jtuSERvfzN3kUYekg8LemCQ5kF5g97N8ZL", + "coins": "10.000000", + "hours": 70 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 170, + "block_hash": "e854e12b5ed0bcb26b2348448fa2af1cd30cf371763fa91019d62a950bf36c95", + "previous_block_hash": "e266c8beae9f650a3f1cdfa611d9016d99e2ba4b4a67b5d6c4629bc6e66f5f9e", + "timestamp": 1430836422, + "fee": 62, + "version": 0, + "tx_body_hash": "95d847102c01d071982e67b8e7dfae50715b0fc0179d33f4b050974e634905e1", + "ux_hash": "d954806eed41026d3c60bc88e8fb569b3aa9007a9679e03ac61724ee3e723b01" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "95d847102c01d071982e67b8e7dfae50715b0fc0179d33f4b050974e634905e1", + "inner_hash": "c13b7e1722f3616f61948ed42382d4ed41164e7e2110d2d60bf86725f32531de", + "sigs": [ + "cb7da0e16b83f1717614c7f160580ac0048a4276682ac4046c3324ba6f4e24901d162f7ec81a8e5cdf3676df6ace9a73c77e4d3ab7f03a4f0272c75f3715665001" + ], + "inputs": [ + "bffea1990d71311b695b2d343b9f09a216b7a8257c1cdcb01b2ab9459e1490e3" + ], + "outputs": [ + { + "uxid": "be081639ea8da63d8542707e9ea9625f6afc97da132f43ed061645c359bb1e65", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10.000000", + "hours": 8 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 171, + "block_hash": "a58ab1c90b6564043f375c48413800c33ff05c9eef017250672ea5a0dd11bf17", + "previous_block_hash": "e854e12b5ed0bcb26b2348448fa2af1cd30cf371763fa91019d62a950bf36c95", + "timestamp": 1430870562, + "fee": 6084778, + "version": 0, + "tx_body_hash": "fb495093f2f4e5c6555c50150ea60c0a6f430e53aa971ebb3e2b5412866a1f06", + "ux_hash": "e06be06b42f1aa65940658c601cf7132041f7a1eeaffdeede72cef54d9465e66" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "fb495093f2f4e5c6555c50150ea60c0a6f430e53aa971ebb3e2b5412866a1f06", + "inner_hash": "05596340e51ad628080101c8e92a60f27e0f5ab509e892f9b65a0988b1575ddb", + "sigs": [ + "068a56e916267a1756d9348bb965f3ed2dcba956fe4c626cd4836921dd836f7c0fa923d6451d5c87aa2eab528ff19ec332434bd12e197eeafbf0896e84940c4401" + ], + "inputs": [ + "6b3a0cab1d9ad6fd011a3bac5e6ff4e3f7903bce911dc7fe83926eae557c34c3" + ], + "outputs": [ + { + "uxid": "372703f8109295f0f58fbee58795979e10dd887869f4fc1da4881ce8a3c0aeb4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "647750.000000", + "hours": 1014129 + }, + { + "uxid": "a35044035cce79cb988c757dcaf5d9a065957c0fbc1a3559d08ed46831504fc2", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "10464.000000", + "hours": 1014129 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 172, + "block_hash": "78ae70c3a0f403b6b5d14dab13e3d29f151a0e279a8a4818fa0fe9becb639dc2", + "previous_block_hash": "a58ab1c90b6564043f375c48413800c33ff05c9eef017250672ea5a0dd11bf17", + "timestamp": 1430870592, + "fee": 849078, + "version": 0, + "tx_body_hash": "7abef7e4080bf2cbe9f147d7c9cbe4c950b38f8477d304466c938b937cd379ba", + "ux_hash": "41c039e8b2ade1a2cd9f7a58873d57729c30d3639a33755b0317ceff66e6f7a9" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "7abef7e4080bf2cbe9f147d7c9cbe4c950b38f8477d304466c938b937cd379ba", + "inner_hash": "f28366f7590220cd42faaf9ea041c8ca4460707e0dbfe1d3ac67da8d9dda268c", + "sigs": [ + "e9ff8a0ce6c5e8b09936e031ef8cc6a0f3f3ed0a5360dcf2f649db3a2da958441c20916b27d1ad2ea8415679755b36967074e20feab7271528cb6b3266268ec201" + ], + "inputs": [ + "074645413ab2aae818e657f6f36420447a872e7cdd2ff64324b486be4d4d1edd" + ], + "outputs": [ + { + "uxid": "b1b832a911d45aeaab73676caad794fe2ab99d423f80c4ff58cfb269656b03dd", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "28100.000000", + "hours": 141512 + }, + { + "uxid": "c31c199a54ecbea5e57bf7f5e73d231a09e11713dd0ee70e340e4b0a9c9f9fdc", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 141512 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 173, + "block_hash": "55b1be7e73d1ec35d71c8bc6f62e1788ded35752b39188c98cab6c9347f77ead", + "previous_block_hash": "78ae70c3a0f403b6b5d14dab13e3d29f151a0e279a8a4818fa0fe9becb639dc2", + "timestamp": 1430871512, + "fee": 764646, + "version": 0, + "tx_body_hash": "a7665cec98224150968ec1ef9ef2d6b3175c9de8f9f8c7bc786b30cc74997c57", + "ux_hash": "abc08f5bf1ed183dd5dfa6dda09d9de6adfa23e310454861ae1fb938e0384321" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "a7665cec98224150968ec1ef9ef2d6b3175c9de8f9f8c7bc786b30cc74997c57", + "inner_hash": "5bd2503c4ff78e7c9d182bfe5e62e54f1bfb944bb526d97b272021d8ccfa9359", + "sigs": [ + "dbd1e8763cb9681aeb96edc0c8483decee30b670778bec88da249f9d4f2201c330d2a16349608ba51eb8a387805dce9618810c4e6fd7af548cccee7d2c9c5dd201" + ], + "inputs": [ + "372703f8109295f0f58fbee58795979e10dd887869f4fc1da4881ce8a3c0aeb4" + ], + "outputs": [ + { + "uxid": "14027340f6e1d98bba3f7f5f3b50e3588f8a19e4d021db944e7a28b2643640e1", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "635750.000000", + "hours": 127440 + }, + { + "uxid": "793f3f0e41c9d1de391d864792b79ed8c24dde5ff84a73c161d660a73ed70c90", + "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "12000.000000", + "hours": 127440 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 174, + "block_hash": "0a4f2c0ea33c75ae7af4eb743935f53f0953e26fec3bf7128f0a88fdb879f497", + "previous_block_hash": "55b1be7e73d1ec35d71c8bc6f62e1788ded35752b39188c98cab6c9347f77ead", + "timestamp": 1430871622, + "fee": 111521, + "version": 0, + "tx_body_hash": "ad44a8027a825e82a20cdd910d9bd41d74025601b7668c80655e9b45afb8bb93", + "ux_hash": "4f36b853bdb042046c522f2f5e397ccb24b59a5ef6931dd1cb1d48cc87a1ffc9" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "ad44a8027a825e82a20cdd910d9bd41d74025601b7668c80655e9b45afb8bb93", + "inner_hash": "af11c711190f9b52114dd31dcc4dbcdff3f169c6ce2559ff5baf14032e057145", + "sigs": [ + "fd019f0cc492d5b6ba1bab0e3c77659b0e4773ea9b7dbe9808ea1392bfcd41e20aec3438076cb6ae4104bb6730b47ad1f1cfe878155f984ee380da10991b2a5601" + ], + "inputs": [ + "b1b832a911d45aeaab73676caad794fe2ab99d423f80c4ff58cfb269656b03dd" + ], + "outputs": [ + { + "uxid": "c39acd3494113650c1a6a7809287af7b12a78bbd97126d4585dd1715e2cb5a66", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23100.000000", + "hours": 18586 + }, + { + "uxid": "2d3f7890d11efedd4cee3a7ab4a5cbc56d2c8df4f02124bdad9ec839400053ba", + "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "5000.000000", + "hours": 18586 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 175, + "block_hash": "218d3fadc712eec96e1ca2f68adbb468092c597f269fb3a3702b77c2b80665af", + "previous_block_hash": "0a4f2c0ea33c75ae7af4eb743935f53f0953e26fec3bf7128f0a88fdb879f497", + "timestamp": 1430908702, + "fee": 110149, + "version": 0, + "tx_body_hash": "9364ed6cfcc289df74dc6bac1993f7ab3441b898cb3f06918198d2476c83dbac", + "ux_hash": "4013a4dd63875f19f124c440685a727e9654d8c2de3298f416bd98c2bbcf2ac9" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "9364ed6cfcc289df74dc6bac1993f7ab3441b898cb3f06918198d2476c83dbac", + "inner_hash": "a55922b0495d39c8e9db70ac9aca99266d5a7f3644106b4b5468345d955acf41", + "sigs": [ + "cecae09b7925e9f6db1ccf5ef9a93687a43bbeaefe2888abcc07411c71f850c80c05ed573abd67bf9f0e8a096a1aba8187547e3d062e5ed147ac51961cc3559701" + ], + "inputs": [ + "14027340f6e1d98bba3f7f5f3b50e3588f8a19e4d021db944e7a28b2643640e1" + ], + "outputs": [ + { + "uxid": "8e55f10a0615a0737e6906132e09ac08a206971ba4b656f004acc7f4b7889bc8", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "625750.000000", + "hours": 18358 + }, + { + "uxid": "d91e07318227651129b715d2db448ae245b442acd08c8b4525a934f0e87efce9", + "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "10000.000000", + "hours": 18358 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 176, + "block_hash": "7ca9af9ed16449652da34d3ab49f3d6fc6be8cc1af3d31be81043e684f14de37", + "previous_block_hash": "218d3fadc712eec96e1ca2f68adbb468092c597f269fb3a3702b77c2b80665af", + "timestamp": 1431162639, + "fee": 2711954, + "version": 0, + "tx_body_hash": "a17cf54c20ac7ec6e1362acf24c5e5589ed8b49bdba791a87430de160a473913", + "ux_hash": "5ad39ab834a65739085413db13fb8c152a641ba28b2b45322d1da9c6d9aa05ef" + }, + "body": { + "txns": [ + { + "length": 1481, + "type": 0, + "txid": "a17cf54c20ac7ec6e1362acf24c5e5589ed8b49bdba791a87430de160a473913", + "inner_hash": "71127fa12d9ca390715586fe313b4e130b24614e0eaec276dc2dd25b7228c39f", + "sigs": [ + "95855ae7d279d4797bafe542fd1803eb6a89533f29ae0d89d3f51256feeacc343dbd3da0d8d104e436c04643c72b5dab7a74634befc942ef9d96ded3e235ab4b01", + "55222337fce2733e7a3f92bf808da32759f33327c616828bdb0a350e5d3567b34fdef1a55340d7f857c4daed9735ad64394697ad941fc883f9365693991299a500", + "950281f4acb6cb8176929740aa90fa8729ac5687ef6500bc087429c43f5414e319c26142fca51c0ed9e5d434a6c83d2e3c837d7c9213398ae2104429d03f35dc01", + "c41f7425ecb51359a1da6ccf090a565beed72c891c49a8c81939a46f914c55de5766e99f1519302bfeef2224f856c859391d1f531004ee088083259fca82b17400", + "ed7085f8ceb26060851a71f665387d7c44774c6b9ddfc8d3a06e1fe50168d48510f63f5b6a0998c2a30d24bf37f1c6030035ef8df6efe6dfdcae38beeaf3a5a701", + "a88fefcc8f2809a288a275aac579f340c5138f8bfedf02964d4e3ed0492ee54e696de7e6f7f0b3f315461fb5df4f8e5e5fc7a5339ca6899c6ca7b122c54c90db00", + "ad9b245807ab8c5c5a713ab7e3bfbbba8af032bc4915c1824d95e95827d95be473eb1f6952ee489ddad59049364220bab124182251142b849235ed552404ba3d01", + "7a403c671ec5a6a6622ff63e4d482d51fda747cbe85cf8ef642aa840154be435409df707aa81a3c4e553e0c2c250a452e8416dc38697c35f830de27924a052fc01", + "06b5966aa7c7dfd425e773aafd46fdf29b41734b73f84ef1cd8941e617e0d6245e99f6d8be8b9609686b0faee4923b8bc149078ebb18c1b2e8f6318c846675e801", + "c5634bef581b26d600ed6f4cea47f402633e74ab8f5497b2c2ca69a01e3dfeda0a38308a4a96cfe58857e4c0c2311ecf4e3f4eef69aa771a1db89c360892492200", + "4807a114ffe9e44797843f76c74e81d72324885a67d560c4e1d6e4cadd271b637176a932dc045844b52a4c92f6892ebb0265838366827fd0e0b6b7e20e4e1ff501", + "bc1ca4e3d0afd920bad8c4ef8a6b847c71f75ae8ca913ddb5d976dca42af12ea3ec3a2e59ec8f57fe4fb41af3f439387272ea847240ee89468c4d808303cf9be00", + "366f0f68a36bccd22e829eb05f960a8015466bb5eeb8e553dd37b52ab624d1756f68501db2a8d14fda04d1adf3239a9785ec142c14c5bb34cb8d47629c191dc901", + "146eed504f7acbbece951bfea4eb426e80852e3dc6ae9c8a68480fdf4e07ddd73a5709e2f9df0154380d837a5ff66582c07a0fc27d0df4e7d6d28bbcb90e3c8d00" + ], + "inputs": [ + "04c0cd4cbee1e5414791d9e0b9ae4f889bc52d253b5f70b09fbc32c88fb415ae", + "f3034ffe54e869315f8e11801d3e755352fb75b878b24313302273c1b7ea62cb", + "3538af0016ec0f4d0e943c5d49daf280b416701fde4040fa72710c0ca1b5b559", + "0560bae3917bca7581af9b6c5a58e395c701ce9ed0241dac2de8a3e93c0b839b", + "3fe7d61ffa993e00200ce6be7ba347c603032ac3f8c4ace07767e630fe94d76c", + "2a09e97f7725a35af1357842206875a023252da4ebfce129eaf4cb87119cfd41", + "617b584bb9e6b1d80daac915fb3079b22a326777d1515a40e7b7eddf427f4099", + "18293d947aadf89d9e57d18fa01408867a9abe267504edbdabf8c2a57d9a6323", + "045dc2e76321e37884588093083ce1b21be12f20ba1fa36f2a755b894229e3cf", + "b1e5c694c30326cda3df2e634723999befbcbb141415e9a36bdbf18d7bea9870", + "db7a63750db787959a9e0d2d6be9a1ba8bb3d6015bae2353a27ae9eb55b39d22", + "5954742a6ca4e3e872d12d4a93436451ad52e6d25e5ac28371e308b2d7ce75a3", + "a35044035cce79cb988c757dcaf5d9a065957c0fbc1a3559d08ed46831504fc2", + "c31c199a54ecbea5e57bf7f5e73d231a09e11713dd0ee70e340e4b0a9c9f9fdc" + ], + "outputs": [ + { + "uxid": "d6735d3ad70dbf553048faf1c529d047ab12282d04e320bd67c915779fc4e3fd", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "24950.000000", + "hours": 451992 + }, + { + "uxid": "a5f3c513b5a01dc5e943a5cae91f54b54cde55e984a9480d68d690f40dfb7914", + "dst": "v4qF7Ceq276tZpTS3HKsZbDguMAcAGAG1q", + "coins": "5.000000", + "hours": 451992 + } + ] + } + ] + }, + "size": 1481 + }, + { + "header": { + "seq": 177, + "block_hash": "3e8ac6b4c715bd92db824163770e28ee1b5362d449241f77719f13614b3c320a", + "previous_block_hash": "7ca9af9ed16449652da34d3ab49f3d6fc6be8cc1af3d31be81043e684f14de37", + "timestamp": 1431162689, + "fee": 338994, + "version": 0, + "tx_body_hash": "e4850021fb706f2b7a94fec9ade3c166823dcd980dc3954437471d98fb9d2280", + "ux_hash": "c9b05516880ca6665a0f4fa52e7feb6fe83c1ffd6f4d2874877dfa67265524e2" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "e4850021fb706f2b7a94fec9ade3c166823dcd980dc3954437471d98fb9d2280", + "inner_hash": "1a07c8a17c429aec5c0725dc6e4891f4e304a483211f99b847a6820e410b56ef", + "sigs": [ + "e7d92fbcc6716645c2c28a66ac289453b2967c620e105c7699cee251aa6916227057789d10889689a3f3c743dadfea09e1cf747cc7b7ccb5381fe1af1069e06201" + ], + "inputs": [ + "d6735d3ad70dbf553048faf1c529d047ab12282d04e320bd67c915779fc4e3fd" + ], + "outputs": [ + { + "uxid": "ec439e7c7d8517824885ae1520fa5b19f991d7ade3a12209c0e87f6ad1d30229", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "4950.000000", + "hours": 56499 + }, + { + "uxid": "f5e7796297b7201b1ea87736fadddc7b451f9ed7d4529cfe9f03082e80917628", + "dst": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "20000.000000", + "hours": 56499 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 178, + "block_hash": "bb943b37f989326b057903ccc6eb1fa58a5d35e38706ae1ba81e0a6100bacf26", + "previous_block_hash": "3e8ac6b4c715bd92db824163770e28ee1b5362d449241f77719f13614b3c320a", + "timestamp": 1431162729, + "fee": 395493, + "version": 0, + "tx_body_hash": "ecd101a6af263973ab75f87a3116231e6fe84a2281d0001c9aa2d7195545e78e", + "ux_hash": "428b5ba5d4928fa538d9a031bf9fa3eb215b47d780e43e69bcd71d87758ada2f" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "ecd101a6af263973ab75f87a3116231e6fe84a2281d0001c9aa2d7195545e78e", + "inner_hash": "41bc4ea9ec8214b461a5377d0ae0da38831bc972b8dd54becaf195b5943dd55e", + "sigs": [ + "4a604f9845e202871ac8741962280bb5db6f1295353042922a6f46671f27cc1d6cd4085aec390205aa5ba08f2c841295b4c86d2fab81d6e29fc958dfe9712e2301" + ], + "inputs": [ + "a5f3c513b5a01dc5e943a5cae91f54b54cde55e984a9480d68d690f40dfb7914" + ], + "outputs": [ + { + "uxid": "ba1adbf3006a239fb7ef6efb1f9390a25951a5185dc312dd81bf88025f838456", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "5.000000", + "hours": 56499 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 179, + "block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "previous_block_hash": "bb943b37f989326b057903ccc6eb1fa58a5d35e38706ae1ba81e0a6100bacf26", + "timestamp": 1431339429, + "fee": 33129894, + "version": 0, + "tx_body_hash": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "ux_hash": "c99075adc48450a9bf04b8b06defba39fc9cb029fbac413d57ee9fea241d84b4" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "inner_hash": "db98f515ce6c3d99fd7c39a6ac59ab498b1a2cc8fc6a13377ac7d3d463898e7c", + "sigs": [ + "1ca18424c9a313e9c253aecaec3c532c35c60e454f026a3d2794c772bc74a19809d53f8862962e865dd822dd054cd7f32b89b810968d95c9db6a9a0c1095390601" + ], + "inputs": [ + "8e55f10a0615a0737e6906132e09ac08a206971ba4b656f004acc7f4b7889bc8" + ], + "outputs": [ + { + "uxid": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "hours": 5521648 + }, + { + "uxid": "01f9c1d6c83dbc1c993357436cdf7f214acd0bfa107ff7f1466d1b18ec03563e", + "dst": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "10050.000000", + "hours": 5521648 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 180, + "block_hash": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "previous_block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "timestamp": 1431574528, + "fee": 2265261, + "version": 0, + "tx_body_hash": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "ux_hash": "058d1d0a22be7b9f5567a236866836a87d922760581832cfb8bfbd8b337d64b1" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "inner_hash": "d5b18a0c0c454e56fe1f7d0c64236d633f65717c04f08cd943f5669b4cc34667", + "sigs": [ + "2fac42571bb301783e46e804069c73c8226b637ae6385fec793e3a3860feaa6918058c55f461cef38341670c5c2da230d2241f267dbde6fc0528a6fb24362b3b00" + ], + "inputs": [ + "c39acd3494113650c1a6a7809287af7b12a78bbd97126d4585dd1715e2cb5a66" + ], + "outputs": [ + { + "uxid": "75692aeff988ce0da734c474dbef3a1ce19a5a6823bbcd36acb856c83262261e", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "hours": 377543 + }, + { + "uxid": "a4b70476ea1e079ebd3503b52eee32d490515457fce6a5aa075770b598a9d14f", + "dst": "CDD8GoJUHEvBm1pD3BQ3hEC2KcJNhvUzpu", + "coins": "1000.000000", + "hours": 377543 + } + ] + } + ] + }, + "size": 220 + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-end-less-than-start.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-end-less-than-start.golden new file mode 100644 index 00000000..b5b27b9c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-end-less-than-start.golden @@ -0,0 +1,3 @@ +{ + "blocks": [] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-first-1.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-first-1.golden new file mode 100644 index 00000000..c92f9af9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-first-1.golden @@ -0,0 +1,635 @@ +{ + "blocks": [ + { + "header": { + "seq": 1, + "block_hash": "baf3b622f043bbe3ef480416251a6545d07f173e5969dde2b63c4a12956d38fd", + "previous_block_hash": "0551a1e5af999fe8fff529f6f2ab341e1e33db95135eef1b2be44fe6981349f3", + "timestamp": 1427926392, + "fee": 99999999999900, + "version": 0, + "tx_body_hash": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "ux_hash": "ecc66d67289ecf8b5c5d2758a8f07ef08373a61a4d4e2736905ac2aaa427655f" + }, + "body": { + "txns": [ + { + "length": 3846, + "type": 0, + "txid": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "inner_hash": "0f7019627886818d2501af189bbac18e21b8e959891c5b2726f89e29355aa10a", + "sigs": [ + "be602113fe288f750001ab65f254ceedd8b05b1becc456a0a52a0bea10b8280e38d950933992ad3265e1f81d197036fa634b316f08b3b319ffce081aa43f3bb600" + ], + "inputs": [ + "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0" + ], + "outputs": [ + { + "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "26f585cb96f35307f0af5b9aee004a29b7795695f4c5c836104e2fbbf429a3ce", + "dst": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "18a43b8b69bbf12a9e49e6f9783ba258397e6567301aeed9e901a1e4fed9fef9", + "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5a69ef09b5de21b117cac62141a8de4eade7558c42f0ba8b50996f5ec7867c5d", + "dst": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "aef761a12e3d0fa9c4a8db62b8bab1015c32931b7e3a7fc9a77282cec218f79d", + "dst": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "445a4082da251fa161e4705d115fe2018ca15a5f92e8a0950793405410e6be12", + "dst": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "dst": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "368a609ee90ca15bbbd297af07dc6705131764476d54bef641017ffcd0885e65", + "dst": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "13afe1586015c4d7312f89d123153279e4961eb0d53a4d036847d5d989ba90dc", + "dst": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f625cf04412199c16e073dbb500e66c23cfe69043578b4a2d879a329aac563ec", + "dst": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b2da50a08756c34d059a04812451cf3296f73ba87f8cca38473ac8f051ab6d1e", + "dst": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "135c28698e80e3b2a737d59c16c79684c3fb3ec5cec59f466a39f4ac3c73968e", + "dst": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "df63056cf3ae21efa86d241876ad0194387317585dc9e4fcd80954b47d59b57a", + "dst": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4628f4cfdbf1eb7cccc25d461c46cc29e90cffb5d6277e0de641f7701d60c308", + "dst": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "47e4706dc4d80a70b20c889476fb0627ca6d5bdaa790f4ceba44a689d31b2dcc", + "dst": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b64bc50d370a06df117eb543ca051239c985cfc4b6aa527c51b700de32c7fc41", + "dst": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "390bc4c045fa9f289957b7eca529bfadac96a7dd074bcfbdd3b09e99413b8202", + "dst": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6aa162f7fc09598c4dc8f5fab7fb2383f28c3840937a001acd9f37136e1691b2", + "dst": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e440cf4c896735d3299a871f988c134f404fb2065d1f20c87c9c9bc5fa582e09", + "dst": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "eea791e84a53e4d99485519c5d2c3146b0a2ad080cf92904ae7b28c2d9a6e3ca", + "dst": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "01048ad6a538256d9a8c6c9c6321ca1a01b31cbf08e74fd4ff0f141bf97eb8ce", + "dst": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc5f1f1ddc8cb23df3d42f1e5a1dda9d356846fe930ae4484bc1eeb1b3b2c95b", + "dst": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f03087245a6b64bb69cd5866a1887ae595a9e1a86e196754984840eaf6d3eb9c", + "dst": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "239bdba27dabd52f7450f7d8521c9a7e5ac74093ae3f6f2348bf40ac9a6db7a5", + "dst": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d60879e562b65f97d40bec7309d4490ba0a8c80e2349ecb2e3505aaa50ea1e47", + "dst": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "66e685901492c94942522c346759c711ee2e78a059ef274e77a6ab433409683c", + "dst": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b497992663f99f9902deaaf487b00655820003015ea92091628f4a6e8aeb5854", + "dst": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc40377012004566712fa860e74db97305091cc163e95435e04556c70d32f9c5", + "dst": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "73304622e33994bc2d4ade2cab78d28e1b65185e60ad3c781ecfb5cbc8159136", + "dst": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fed15e8506d0e0898510311850b8863ef6d9a499215ae8823a1e3fb9c8140ab2", + "dst": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "12034bc455d0821813d7eb9afed1ed1a8f19b6f29826ef4a057b4aa0b4228817", + "dst": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fc444cdb2598f44209a41ea20afdc9065ebe51b7cd5f65bb1c0f7a7b427ce7b1", + "dst": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "618d242d95d33e2d7316612a164d89859b85f1287f0d5bed4dcb561cf478f706", + "dst": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "07f70fd4108ef4d2fde3b85411728c1f7bd3a135d2062c5a30a46cc885463780", + "dst": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "af9bcf6ba63a08e699bc101aa362f135343aaf78a56e9f88d118fca0e1ce5c08", + "dst": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6b3530bb930ed10bbc4c307663aba4377c08443498a0a2cf023b1be72f378ae1", + "dst": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fd6da5199e528958e68ee8dd003b727d4d840754ea7c1e0c05e4f0e504c9b2cd", + "dst": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "131f07f5b40f365fb537b863e4aa5ef0efcd77b7fa2ff321d90eeb743ac43678", + "dst": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ffbdfdbf3427d04f445c33e867845bec1ee64a9dfe0d0fa8284547c2226fdfa9", + "dst": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b53c7188ebf4d630790ff63275679ba48009e31af6e4fe15806619216caa750", + "dst": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b4c6639b49402c2753f83c7fb7d3ffa65da74e47fef2b781933ff55b14d09bcd", + "dst": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c956289db079c00d2f80c590d3c8ca26c37da534fe5f65e799b3982ceca493c", + "dst": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "550d2a8d3047cdae0c05a61cc3de43e758b123a6955fa067d3ac375f7d0dbadc", + "dst": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78740d5bf49989936d315bf641949232aace582e03de57db8abff940f7d51bd1", + "dst": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9f2c83c5165826de1077f428ad39d41473e32ed64cd83180d49e7d8e5db996d0", + "dst": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "883be4d7173c235933294ab8dcae8cc76609166eaa1c1f07e9b51d551c979709", + "dst": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6384ed19650d384c29db4c3a39a1ca855058fab758075be2dee759dd9e6faae1", + "dst": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", + "dst": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c238e82f3a4beee1be7b5b464e8553404f6927d5ab93c3d649d362c01097782", + "dst": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dad4991bfa5c51eb176f28c1b3f86661e02579905e6e07c997df22004e06244a", + "dst": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4ba91512c168281f41d3934b927d0d86a3136a31cc345b635095928f8e5f013c", + "dst": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c416f5e604eeada9ae8e520a429d8f19d4230626769e7121007e01353730784f", + "dst": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7b8787fd4076c27d074d2a4761377a1aa26c843c432e3b7e6b0ebf1e29528188", + "dst": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "38f22b194f04d85a6b545b37df06195edeb8503798b229ddeaa946018150c05c", + "dst": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "246377a036ad5444bcd5f47ac9e55fec7c85fc40644df593038d360554a809f7", + "dst": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c6d5e543ff5f2c2526728d588fb21753db5b7e05b8b275aa5e9b24d29350afb0", + "dst": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "98e223e6e2240fef83082d3daa86e46f10e0c71f3f74489ba95db0951a166f53", + "dst": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c8971ca91f8e21c556f647940073db003f7dd5582ae55d4ebca602d5e8e91a6e", + "dst": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dfa7822c05f54116c9fc3b2cde1ecb4667f47a2d8771fe886e832c223cdc4e82", + "dst": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6d37c0c4b6fcbac1e53a46c9c2dc5d3c3b36312c53f25b2baacc785ea77a11f7", + "dst": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9ba5e31610f0545666f102465efa8caa48ad3fb5b8abd5ae802f4a71e3f7de3b", + "dst": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "3ca365aace71e24b04d6f2ffbf7171468c5e71783858c710cae539c5e43e0c0e", + "dst": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c858f2db2a20ac562d32f8fb2a3a11039849a6e44d2bec30befb2e173532a9a3", + "dst": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1550a76598693b950346397e0e825bbb2805edde38b0d0240e50050829b7b1dd", + "dst": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "466340ab7733abb23ab24d877c673fe089c273f11808fbbd6f33a91da92ee96c", + "dst": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "401d4c0c1060ebbb4b9fb3859c2eb47789f94086f4deb01234bf46f7cdc81247", + "dst": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2c0e3aa084f5fec45f99b3f125ce7d50c6da526ef5165df5f22ba603147c3fc2", + "dst": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2e724d83e35235c23c0bb16ae9b708a5bba3c23b186b05d4b8c606f6bb4b311", + "dst": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4f30eae8c49eb268fe364eaf5ee0788da6e2f6adc2f83cd82e96a4bfe98496f5", + "dst": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8753d5775c22477a8ef74eeebf61d7de30be702e70118f552cc18ad963ffe950", + "dst": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efa2007c561dcbf7c83a6bbdd2ef75e7cca76b05330a8b948ba0dd94dee949f7", + "dst": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b379d1b8ff0153c63ee69c40a7155b97fa42ab570f68ff847d457316c4d8ab9", + "dst": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cc84f93adce16699d9e84ef32f55333402431b58dc50c17084bcb8b33f382f88", + "dst": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f38f0760769c19075034f70b059abf4d1bfa6d01e1e8c369a99900ed1eaeca6d", + "dst": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8d55f76bb0b3dd222cf85a7193501c0f4071b446f56dbd1da355b1625993325a", + "dst": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efde499c7e4444bc602b7bf5ed50e95a18ce8ec9a06ba9d850a05bb7a25ecb3a", + "dst": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2a4d631d5dc90e397d85f13410d1a6d877dcaf592a0e2be2e727443ac74b5bd5", + "dst": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e936299a21240744f6edbab493449323f920bbe15dcf294463e5a2ace10f27b0", + "dst": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "44e17f4bd29411a1614457171c06183e364bf6ff80a201717b2dfc0748e9ebe3", + "dst": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1941e5cc5e38dd92427580af699b1f410be7b29ff17d3d0ff3d046bfba0aaabf", + "dst": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ff6c0f27fcf92f3b4a3871b801c3116847fe47a7e3bafcadd4855d06012091ad", + "dst": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cd6c4b785e60757fad0e6fd4874b729ea7703fe7ee9560e1283d2eb71fc75321", + "dst": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "745eaff456a390c3868742a039e72c2a93ff8eee10417dbe848d533b89facc04", + "dst": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2f3f050c9ef31bf5c3b14c1c71699c4f4b38aa18479531194d12e6277416516", + "dst": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0b95850edabed70762768ac1695c5d7f230cccaa8de06657cda42cafba36374f", + "dst": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7c767d3a06db1ac0e1809ebe29a7d9689143259f4651837de54423e287c20490", + "dst": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78b07e8fe1366e173f2eeb75c35cd53baf0f6100de50ae12b4ffe7d0d7ba4298", + "dst": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5010eb25f6e1ed725fb901ae1e945e545ae846d7be8a135333d2d41102c33328", + "dst": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "178a33e64826cd2039b8538b74e6de513966acab45ab79d77dc9392018a65ffb", + "dst": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "044dc539d063250dc654b2bf0986a9044b4eea05e1284c11a2b313acd8dc3498", + "dst": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9fd5ea38f383291566def44b6fb932414f97123952578fe0cfb9a30eb075a099", + "dst": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "be5930e9cc35801433bcd21db84da7d4f1d8e744feca16a2c6fb00c81ce93e51", + "dst": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8cd999cd193d315e5f1c6f74c230c12e6abe6847924f6e89d988e09ca413f52e", + "dst": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0cff53628eb0e984c134b68cbe4b1bb7721a05adaa32e93b9df489a9a7a176cf", + "dst": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "a5ef046e84be9ff2485dde49afe6073811286761afac3bbd588b6e4130930479", + "dst": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cdee5f84c4f08098ac740e3a260ced14c1e199e126aa5291ec079b281a7dc407", + "dst": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6a24135f8496e7a37dcf7164218bb3aa530319f3b2bf3c7a1a9cc1bd17831328", + "dst": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "693c7f970b34ce5882e62430f4c9c28957159a257d27d4e21a61fd95c6b97464", + "dst": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c008a613cef129c180dbcc7213f2d41a14d245d06a3844d63d9beac963145385", + "dst": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "439cdfd03972fb4bb5da54208cf8098ee78228c487ce9e84623f5f83e17a7d68", + "dst": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "hours": 1 + } + ] + } + ] + }, + "size": 3846 + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-first-10.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-first-10.golden new file mode 100644 index 00000000..8f1975cc --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-first-10.golden @@ -0,0 +1,1018 @@ +{ + "blocks": [ + { + "header": { + "seq": 1, + "block_hash": "baf3b622f043bbe3ef480416251a6545d07f173e5969dde2b63c4a12956d38fd", + "previous_block_hash": "0551a1e5af999fe8fff529f6f2ab341e1e33db95135eef1b2be44fe6981349f3", + "timestamp": 1427926392, + "fee": 99999999999900, + "version": 0, + "tx_body_hash": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "ux_hash": "ecc66d67289ecf8b5c5d2758a8f07ef08373a61a4d4e2736905ac2aaa427655f" + }, + "body": { + "txns": [ + { + "length": 3846, + "type": 0, + "txid": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "inner_hash": "0f7019627886818d2501af189bbac18e21b8e959891c5b2726f89e29355aa10a", + "sigs": [ + "be602113fe288f750001ab65f254ceedd8b05b1becc456a0a52a0bea10b8280e38d950933992ad3265e1f81d197036fa634b316f08b3b319ffce081aa43f3bb600" + ], + "inputs": [ + "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0" + ], + "outputs": [ + { + "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "26f585cb96f35307f0af5b9aee004a29b7795695f4c5c836104e2fbbf429a3ce", + "dst": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "18a43b8b69bbf12a9e49e6f9783ba258397e6567301aeed9e901a1e4fed9fef9", + "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5a69ef09b5de21b117cac62141a8de4eade7558c42f0ba8b50996f5ec7867c5d", + "dst": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "aef761a12e3d0fa9c4a8db62b8bab1015c32931b7e3a7fc9a77282cec218f79d", + "dst": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "445a4082da251fa161e4705d115fe2018ca15a5f92e8a0950793405410e6be12", + "dst": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "dst": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "368a609ee90ca15bbbd297af07dc6705131764476d54bef641017ffcd0885e65", + "dst": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "13afe1586015c4d7312f89d123153279e4961eb0d53a4d036847d5d989ba90dc", + "dst": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f625cf04412199c16e073dbb500e66c23cfe69043578b4a2d879a329aac563ec", + "dst": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b2da50a08756c34d059a04812451cf3296f73ba87f8cca38473ac8f051ab6d1e", + "dst": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "135c28698e80e3b2a737d59c16c79684c3fb3ec5cec59f466a39f4ac3c73968e", + "dst": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "df63056cf3ae21efa86d241876ad0194387317585dc9e4fcd80954b47d59b57a", + "dst": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4628f4cfdbf1eb7cccc25d461c46cc29e90cffb5d6277e0de641f7701d60c308", + "dst": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "47e4706dc4d80a70b20c889476fb0627ca6d5bdaa790f4ceba44a689d31b2dcc", + "dst": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b64bc50d370a06df117eb543ca051239c985cfc4b6aa527c51b700de32c7fc41", + "dst": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "390bc4c045fa9f289957b7eca529bfadac96a7dd074bcfbdd3b09e99413b8202", + "dst": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6aa162f7fc09598c4dc8f5fab7fb2383f28c3840937a001acd9f37136e1691b2", + "dst": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e440cf4c896735d3299a871f988c134f404fb2065d1f20c87c9c9bc5fa582e09", + "dst": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "eea791e84a53e4d99485519c5d2c3146b0a2ad080cf92904ae7b28c2d9a6e3ca", + "dst": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "01048ad6a538256d9a8c6c9c6321ca1a01b31cbf08e74fd4ff0f141bf97eb8ce", + "dst": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc5f1f1ddc8cb23df3d42f1e5a1dda9d356846fe930ae4484bc1eeb1b3b2c95b", + "dst": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f03087245a6b64bb69cd5866a1887ae595a9e1a86e196754984840eaf6d3eb9c", + "dst": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "239bdba27dabd52f7450f7d8521c9a7e5ac74093ae3f6f2348bf40ac9a6db7a5", + "dst": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d60879e562b65f97d40bec7309d4490ba0a8c80e2349ecb2e3505aaa50ea1e47", + "dst": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "66e685901492c94942522c346759c711ee2e78a059ef274e77a6ab433409683c", + "dst": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b497992663f99f9902deaaf487b00655820003015ea92091628f4a6e8aeb5854", + "dst": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc40377012004566712fa860e74db97305091cc163e95435e04556c70d32f9c5", + "dst": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "73304622e33994bc2d4ade2cab78d28e1b65185e60ad3c781ecfb5cbc8159136", + "dst": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fed15e8506d0e0898510311850b8863ef6d9a499215ae8823a1e3fb9c8140ab2", + "dst": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "12034bc455d0821813d7eb9afed1ed1a8f19b6f29826ef4a057b4aa0b4228817", + "dst": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fc444cdb2598f44209a41ea20afdc9065ebe51b7cd5f65bb1c0f7a7b427ce7b1", + "dst": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "618d242d95d33e2d7316612a164d89859b85f1287f0d5bed4dcb561cf478f706", + "dst": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "07f70fd4108ef4d2fde3b85411728c1f7bd3a135d2062c5a30a46cc885463780", + "dst": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "af9bcf6ba63a08e699bc101aa362f135343aaf78a56e9f88d118fca0e1ce5c08", + "dst": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6b3530bb930ed10bbc4c307663aba4377c08443498a0a2cf023b1be72f378ae1", + "dst": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fd6da5199e528958e68ee8dd003b727d4d840754ea7c1e0c05e4f0e504c9b2cd", + "dst": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "131f07f5b40f365fb537b863e4aa5ef0efcd77b7fa2ff321d90eeb743ac43678", + "dst": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ffbdfdbf3427d04f445c33e867845bec1ee64a9dfe0d0fa8284547c2226fdfa9", + "dst": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b53c7188ebf4d630790ff63275679ba48009e31af6e4fe15806619216caa750", + "dst": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b4c6639b49402c2753f83c7fb7d3ffa65da74e47fef2b781933ff55b14d09bcd", + "dst": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c956289db079c00d2f80c590d3c8ca26c37da534fe5f65e799b3982ceca493c", + "dst": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "550d2a8d3047cdae0c05a61cc3de43e758b123a6955fa067d3ac375f7d0dbadc", + "dst": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78740d5bf49989936d315bf641949232aace582e03de57db8abff940f7d51bd1", + "dst": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9f2c83c5165826de1077f428ad39d41473e32ed64cd83180d49e7d8e5db996d0", + "dst": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "883be4d7173c235933294ab8dcae8cc76609166eaa1c1f07e9b51d551c979709", + "dst": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6384ed19650d384c29db4c3a39a1ca855058fab758075be2dee759dd9e6faae1", + "dst": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", + "dst": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c238e82f3a4beee1be7b5b464e8553404f6927d5ab93c3d649d362c01097782", + "dst": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dad4991bfa5c51eb176f28c1b3f86661e02579905e6e07c997df22004e06244a", + "dst": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4ba91512c168281f41d3934b927d0d86a3136a31cc345b635095928f8e5f013c", + "dst": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c416f5e604eeada9ae8e520a429d8f19d4230626769e7121007e01353730784f", + "dst": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7b8787fd4076c27d074d2a4761377a1aa26c843c432e3b7e6b0ebf1e29528188", + "dst": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "38f22b194f04d85a6b545b37df06195edeb8503798b229ddeaa946018150c05c", + "dst": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "246377a036ad5444bcd5f47ac9e55fec7c85fc40644df593038d360554a809f7", + "dst": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c6d5e543ff5f2c2526728d588fb21753db5b7e05b8b275aa5e9b24d29350afb0", + "dst": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "98e223e6e2240fef83082d3daa86e46f10e0c71f3f74489ba95db0951a166f53", + "dst": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c8971ca91f8e21c556f647940073db003f7dd5582ae55d4ebca602d5e8e91a6e", + "dst": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dfa7822c05f54116c9fc3b2cde1ecb4667f47a2d8771fe886e832c223cdc4e82", + "dst": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6d37c0c4b6fcbac1e53a46c9c2dc5d3c3b36312c53f25b2baacc785ea77a11f7", + "dst": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9ba5e31610f0545666f102465efa8caa48ad3fb5b8abd5ae802f4a71e3f7de3b", + "dst": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "3ca365aace71e24b04d6f2ffbf7171468c5e71783858c710cae539c5e43e0c0e", + "dst": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c858f2db2a20ac562d32f8fb2a3a11039849a6e44d2bec30befb2e173532a9a3", + "dst": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1550a76598693b950346397e0e825bbb2805edde38b0d0240e50050829b7b1dd", + "dst": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "466340ab7733abb23ab24d877c673fe089c273f11808fbbd6f33a91da92ee96c", + "dst": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "401d4c0c1060ebbb4b9fb3859c2eb47789f94086f4deb01234bf46f7cdc81247", + "dst": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2c0e3aa084f5fec45f99b3f125ce7d50c6da526ef5165df5f22ba603147c3fc2", + "dst": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2e724d83e35235c23c0bb16ae9b708a5bba3c23b186b05d4b8c606f6bb4b311", + "dst": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4f30eae8c49eb268fe364eaf5ee0788da6e2f6adc2f83cd82e96a4bfe98496f5", + "dst": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8753d5775c22477a8ef74eeebf61d7de30be702e70118f552cc18ad963ffe950", + "dst": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efa2007c561dcbf7c83a6bbdd2ef75e7cca76b05330a8b948ba0dd94dee949f7", + "dst": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b379d1b8ff0153c63ee69c40a7155b97fa42ab570f68ff847d457316c4d8ab9", + "dst": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cc84f93adce16699d9e84ef32f55333402431b58dc50c17084bcb8b33f382f88", + "dst": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f38f0760769c19075034f70b059abf4d1bfa6d01e1e8c369a99900ed1eaeca6d", + "dst": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8d55f76bb0b3dd222cf85a7193501c0f4071b446f56dbd1da355b1625993325a", + "dst": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efde499c7e4444bc602b7bf5ed50e95a18ce8ec9a06ba9d850a05bb7a25ecb3a", + "dst": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2a4d631d5dc90e397d85f13410d1a6d877dcaf592a0e2be2e727443ac74b5bd5", + "dst": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e936299a21240744f6edbab493449323f920bbe15dcf294463e5a2ace10f27b0", + "dst": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "44e17f4bd29411a1614457171c06183e364bf6ff80a201717b2dfc0748e9ebe3", + "dst": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1941e5cc5e38dd92427580af699b1f410be7b29ff17d3d0ff3d046bfba0aaabf", + "dst": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ff6c0f27fcf92f3b4a3871b801c3116847fe47a7e3bafcadd4855d06012091ad", + "dst": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cd6c4b785e60757fad0e6fd4874b729ea7703fe7ee9560e1283d2eb71fc75321", + "dst": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "745eaff456a390c3868742a039e72c2a93ff8eee10417dbe848d533b89facc04", + "dst": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2f3f050c9ef31bf5c3b14c1c71699c4f4b38aa18479531194d12e6277416516", + "dst": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0b95850edabed70762768ac1695c5d7f230cccaa8de06657cda42cafba36374f", + "dst": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7c767d3a06db1ac0e1809ebe29a7d9689143259f4651837de54423e287c20490", + "dst": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78b07e8fe1366e173f2eeb75c35cd53baf0f6100de50ae12b4ffe7d0d7ba4298", + "dst": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5010eb25f6e1ed725fb901ae1e945e545ae846d7be8a135333d2d41102c33328", + "dst": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "178a33e64826cd2039b8538b74e6de513966acab45ab79d77dc9392018a65ffb", + "dst": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "044dc539d063250dc654b2bf0986a9044b4eea05e1284c11a2b313acd8dc3498", + "dst": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9fd5ea38f383291566def44b6fb932414f97123952578fe0cfb9a30eb075a099", + "dst": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "be5930e9cc35801433bcd21db84da7d4f1d8e744feca16a2c6fb00c81ce93e51", + "dst": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8cd999cd193d315e5f1c6f74c230c12e6abe6847924f6e89d988e09ca413f52e", + "dst": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0cff53628eb0e984c134b68cbe4b1bb7721a05adaa32e93b9df489a9a7a176cf", + "dst": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "a5ef046e84be9ff2485dde49afe6073811286761afac3bbd588b6e4130930479", + "dst": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cdee5f84c4f08098ac740e3a260ced14c1e199e126aa5291ec079b281a7dc407", + "dst": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6a24135f8496e7a37dcf7164218bb3aa530319f3b2bf3c7a1a9cc1bd17831328", + "dst": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "693c7f970b34ce5882e62430f4c9c28957159a257d27d4e21a61fd95c6b97464", + "dst": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c008a613cef129c180dbcc7213f2d41a14d245d06a3844d63d9beac963145385", + "dst": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "439cdfd03972fb4bb5da54208cf8098ee78228c487ce9e84623f5f83e17a7d68", + "dst": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "hours": 1 + } + ] + } + ] + }, + "size": 3846 + }, + { + "header": { + "seq": 2, + "block_hash": "01723bc4dc90f1cb857a94fe5e3bb50c02e6689fd998f8147c9cae07fbfa63af", + "previous_block_hash": "baf3b622f043bbe3ef480416251a6545d07f173e5969dde2b63c4a12956d38fd", + "timestamp": 1427927651, + "fee": 0, + "version": 0, + "tx_body_hash": "312a269b8248e389c61571cc13f4ad13b7d53b64853d990ddc301a58e7071889", + "ux_hash": "163a4a92e3ea23475a854215a8813b327f724e374df4b50ac414b94ec57b3c3e" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "312a269b8248e389c61571cc13f4ad13b7d53b64853d990ddc301a58e7071889", + "inner_hash": "4daff2831f5bc2877a98a49b0ef75f8ff01bcb35082fd4018c77707dfca31849", + "sigs": [ + "f4482e0781e0d94c8c4773940e1f811405681844a9dc3c1938243442e1cbd5463d5e251880abbf8ff1ed85b4b2659e83ee30f06cc4c5dc9913aa6a9630fbe3de01" + ], + "inputs": [ + "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76" + ], + "outputs": [ + { + "uxid": "0cd548e03bd13bca8647cd13f6baef0c65fd03081aeb6dc3695536e5bc6018ae", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999990.000000", + "hours": 1 + }, + { + "uxid": "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 3, + "block_hash": "35c3ebbe6feaeeab27ac77c1712051787bdd4bbfb5cdcdebc81f8aac98a2f3f3", + "previous_block_hash": "01723bc4dc90f1cb857a94fe5e3bb50c02e6689fd998f8147c9cae07fbfa63af", + "timestamp": 1427927671, + "fee": 0, + "version": 0, + "tx_body_hash": "a6a709e9388a4d67a47d262b11da5f804eddd9d67acc4a3e450f7a567bdc1619", + "ux_hash": "bd8c7dc7aadb8cd70e8ba97fb71b5ca77c9be157932930bc547a30bb095bc6c7" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "a6a709e9388a4d67a47d262b11da5f804eddd9d67acc4a3e450f7a567bdc1619", + "inner_hash": "ea6adee3180c7f9d73d1e693822d5d1c2bba85067f89a873355bc771a078faa1", + "sigs": [ + "ce8fd47e2044ed17998f92621e90329f673a746c802d67f639ca083705dd199f6ee346781497b44132434922879244d819694b5903093f784570c55d293ab4af01" + ], + "inputs": [ + "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a" + ], + "outputs": [ + { + "uxid": "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 4, + "block_hash": "415e47348a1e642cb2e31d00ee500747d3aed0336aabfff7d783ed21465251c7", + "previous_block_hash": "35c3ebbe6feaeeab27ac77c1712051787bdd4bbfb5cdcdebc81f8aac98a2f3f3", + "timestamp": 1428793611, + "fee": 1852, + "version": 0, + "tx_body_hash": "c24b92898381fbebe59a457924184f4cce1e7166e140ca75aea5baf854c1ab75", + "ux_hash": "58519fbe20c1ca9db0fb922f5b32808f1d9aed249c266f2d4a14ca2597d80817" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "c24b92898381fbebe59a457924184f4cce1e7166e140ca75aea5baf854c1ab75", + "inner_hash": "43dd65d5644ec5214a901ac94e530cbedb83d2174cf402c7b24697cfe55e1de7", + "sigs": [ + "434a7a0b624fda393c1caa57ac9787f69da3d8854d0ec6f69f0da1c96c9b683d787064b644e9ac3dd4dd8466c22c1547cff89c2552420f5efcfd1eacb1a2eac301" + ], + "inputs": [ + "0cd548e03bd13bca8647cd13f6baef0c65fd03081aeb6dc3695536e5bc6018ae" + ], + "outputs": [ + { + "uxid": "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999980.000000", + "hours": 3704 + }, + { + "uxid": "98b3e6e6d4ed36159b7dbf5f305174fc0c255d2d97528b35a67d50b9968e2b2f", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 5, + "block_hash": "114fe60587a158428a47e0f9571d764f495912c299aa4e67fc88004cf21b0c24", + "previous_block_hash": "415e47348a1e642cb2e31d00ee500747d3aed0336aabfff7d783ed21465251c7", + "timestamp": 1428798821, + "fee": 2036, + "version": 0, + "tx_body_hash": "0579e7727627cd9815a8a8b5e1df86124f45a4132cc0dbd00d2f110e4f409b69", + "ux_hash": "70439be07958c0dfa9932bfa108d7dad20a37db7ae6db4e06a3225443d4b5481" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "0579e7727627cd9815a8a8b5e1df86124f45a4132cc0dbd00d2f110e4f409b69", + "inner_hash": "fe123ca954a82bb1ce2cc9ef9c56d6b649a4cbaf5b17394b0ffda651ed32327e", + "sigs": [ + "056ed0f74367fb1370d7e98689953983d9cf34eb6669854f1645c8a16c93d85075661e7d4f6df0ce5ca8eb9852eff6a12fbac2caafee03bb8c616f847c61416800", + "8aaa7f320a7b01169d3217a600100cb27c55e4ce56cd3455814f56d8e4e65be746e0e20e776087af6f19361f0b898edc2123a5f9bd35d24ef8b8669ca85b142601" + ], + "inputs": [ + "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70" + ], + "outputs": [ + { + "uxid": "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999890.000000", + "hours": 4073 + }, + { + "uxid": "dc63c680f408c4e646037966189383a5d50eda34e666c2a0c75c0c6bf13b71a1", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "100.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 6, + "block_hash": "103949030e90fcebc5d8ca1c9c59f30a31aa71911401d22a2422e4571b035701", + "previous_block_hash": "114fe60587a158428a47e0f9571d764f495912c299aa4e67fc88004cf21b0c24", + "timestamp": 1428806251, + "fee": 0, + "version": 0, + "tx_body_hash": "03b3ab821cdaf0ab8cc1a9e2dd30108772ec3bda09e9d3a8c48df9f30d213b38", + "ux_hash": "dad0a423ff7b1c5c6021698c5c75da34df37b9fc0a5b0c60bcbb50e8665c0610" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "03b3ab821cdaf0ab8cc1a9e2dd30108772ec3bda09e9d3a8c48df9f30d213b38", + "inner_hash": "e49bf8f45cb6664d36ec632e37bd91566d8bd4ea9ce209a0a955323a94dd744f", + "sigs": [ + "0a0d9a3fa0597667fb991bbe047ff93c591313faf759fcec2f47138bc0666b333b7689ad527ddb8ef135897be41016f755eb14e46cd327fc5eb196bce80c3cd400" + ], + "inputs": [ + "dc63c680f408c4e646037966189383a5d50eda34e666c2a0c75c0c6bf13b71a1" + ], + "outputs": [ + { + "uxid": "8ff8a647e4542fab01e078ac467b2c9f2e5f7de55d77ec2711f8abc718e2c91b", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "95.000000", + "hours": 0 + }, + { + "uxid": "778048daec0c83f89525a6d69b60c407d090bb1666711b1c560e6ebee8dcc452", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 7, + "block_hash": "6cb71b57c998a5367101e01d48c097eccd4f5abf311c89bcca8ee213581f355f", + "previous_block_hash": "103949030e90fcebc5d8ca1c9c59f30a31aa71911401d22a2422e4571b035701", + "timestamp": 1428807671, + "fee": 0, + "version": 0, + "tx_body_hash": "f832428481690fa918d6d29946e191f2c8c89b2388a906e0c53dceee6070a24b", + "ux_hash": "ee38fa1b02dd0d190187c9cd9aba2d7296e0aa7b6b983f61c1d1fe998c1433c7" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "f832428481690fa918d6d29946e191f2c8c89b2388a906e0c53dceee6070a24b", + "inner_hash": "f440c514779522a6387edda9b9d9835f00680fb314546efb7bc9762a17884156", + "sigs": [ + "8fe96f5502270e4efa962b2aef2b81795fe26a8f0c9a494e2ae9c7e624af455c49396270ae7a25b41d439fd56dea9d556a135129122de1b1274b1e2a5d75f2ea01" + ], + "inputs": [ + "8ff8a647e4542fab01e078ac467b2c9f2e5f7de55d77ec2711f8abc718e2c91b" + ], + "outputs": [ + { + "uxid": "17090c40091d009d6a684043d3be2e9cb1dc60a664a9c2e388af1f3a7345724b", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "90.000000", + "hours": 0 + }, + { + "uxid": "f9e7a412cdff80e95ddbe1d76fcc73f967cb99d383b0659e1355c8e623f02b62", + "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 8, + "block_hash": "34ec53ac5b15e8c0c60312f67e209318c3b09c5ecbaabf0843a161f889614584", + "previous_block_hash": "6cb71b57c998a5367101e01d48c097eccd4f5abf311c89bcca8ee213581f355f", + "timestamp": 1428807691, + "fee": 0, + "version": 0, + "tx_body_hash": "7229422f3a0afb5f3a9596ed50146440c17a3d54abda0f3c70cd9dc58de96374", + "ux_hash": "34174a65e1b34d0d7dd0e219f7969e303d4117024b14f8fa5ecc58c29c4c417c" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "7229422f3a0afb5f3a9596ed50146440c17a3d54abda0f3c70cd9dc58de96374", + "inner_hash": "68fb8cd96b0d2a94838183ab24f36f71006383add373837d448a7584ef69bc6c", + "sigs": [ + "b859da7c65d6525247973fc62d274343feb3fe6fd76ab392dc30d7cdc609a7e45018b425fbdc3e79647e43b99d25bfab6c23d60495e5e0ce3cf06b6ce2c4897d00" + ], + "inputs": [ + "17090c40091d009d6a684043d3be2e9cb1dc60a664a9c2e388af1f3a7345724b" + ], + "outputs": [ + { + "uxid": "999cc56deae71486a28e19d1ed8d585c2cf07d5ee27d1c33bea186d23aaca06a", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "85.000000", + "hours": 0 + }, + { + "uxid": "1f810bdd1c65ad50f27f2c47a000150877fdba2fdb78b9d8cae39946be6a9e33", + "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 9, + "block_hash": "d33c2466840a09e10efe3736f3aaad05b6b8d05cedcdd0099f84fd1ec6f55282", + "previous_block_hash": "34ec53ac5b15e8c0c60312f67e209318c3b09c5ecbaabf0843a161f889614584", + "timestamp": 1428807711, + "fee": 0, + "version": 0, + "tx_body_hash": "9d87d7bb9e56a3588bacb478c7556280b28c0a49f6e09db8b54a84c20d865f2f", + "ux_hash": "4f560eea54f060c029cedc78480a59f6ca549d4fd6cb84fb0388001dcd11b5b7" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "9d87d7bb9e56a3588bacb478c7556280b28c0a49f6e09db8b54a84c20d865f2f", + "inner_hash": "f60dd876ff32adc5e20759f45c04075f46796b0ca2b76a490d5d1e2d5b18424a", + "sigs": [ + "be2ea2bcb4be07705cd034579d77c2fe0f9c7bb29dad0e690f38f8a2e098041c396820004975298d9d3647dfec7cbb610452e294381b898f28d48f166aaea5a500" + ], + "inputs": [ + "999cc56deae71486a28e19d1ed8d585c2cf07d5ee27d1c33bea186d23aaca06a" + ], + "outputs": [ + { + "uxid": "2f87d77c2a7d00b547db1af50e0ba04bafc5b05711e4939e9ec2640a21127dc0", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "80.000000", + "hours": 0 + }, + { + "uxid": "9e8997e53d2e61955da71dbbc6ba5b0da799eaace0f45870a4e42276a6fdaefa", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 10, + "block_hash": "5c5e6b0f6620a3af54a3259222a5269e60db768d7f805edce3f3e29f2597a487", + "previous_block_hash": "d33c2466840a09e10efe3736f3aaad05b6b8d05cedcdd0099f84fd1ec6f55282", + "timestamp": 1428807771, + "fee": 0, + "version": 0, + "tx_body_hash": "98db7eb30e13853d3dd93d5d8b4061596d5d288b6f8b92c4d43c46c6599f67fb", + "ux_hash": "dc4b68b8067932c191922c68504bc443c46144ef904c12b50008b3d77ae91aeb" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "98db7eb30e13853d3dd93d5d8b4061596d5d288b6f8b92c4d43c46c6599f67fb", + "inner_hash": "affafab93dc807a9306d1f3c6a19066aca57f284825420fb01e48200349f7ba2", + "sigs": [ + "71008403c675d9b3fdf8c09cc6caa64c681b78ba588fe20abb568e318d2e40b55c44ea614efc475c408e1e6e15cc0df753e6d3f04cb521078e6c928d5aa64c3200" + ], + "inputs": [ + "2f87d77c2a7d00b547db1af50e0ba04bafc5b05711e4939e9ec2640a21127dc0" + ], + "outputs": [ + { + "uxid": "0c5d1b6a61c32f9bcc62d3583ac957b3374f0daf1a14fd08679bff2554449840", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "75.000000", + "hours": 0 + }, + { + "uxid": "ec2c2238793d71240502de3e7c46ec1d5bf938c76541185f1c3fdf0d99a90795", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-last-10.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-last-10.golden new file mode 100644 index 00000000..f90b580c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-last-10.golden @@ -0,0 +1,491 @@ +{ + "blocks": [ + { + "header": { + "seq": 170, + "block_hash": "e854e12b5ed0bcb26b2348448fa2af1cd30cf371763fa91019d62a950bf36c95", + "previous_block_hash": "e266c8beae9f650a3f1cdfa611d9016d99e2ba4b4a67b5d6c4629bc6e66f5f9e", + "timestamp": 1430836422, + "fee": 62, + "version": 0, + "tx_body_hash": "95d847102c01d071982e67b8e7dfae50715b0fc0179d33f4b050974e634905e1", + "ux_hash": "d954806eed41026d3c60bc88e8fb569b3aa9007a9679e03ac61724ee3e723b01" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "95d847102c01d071982e67b8e7dfae50715b0fc0179d33f4b050974e634905e1", + "inner_hash": "c13b7e1722f3616f61948ed42382d4ed41164e7e2110d2d60bf86725f32531de", + "sigs": [ + "cb7da0e16b83f1717614c7f160580ac0048a4276682ac4046c3324ba6f4e24901d162f7ec81a8e5cdf3676df6ace9a73c77e4d3ab7f03a4f0272c75f3715665001" + ], + "inputs": [ + "bffea1990d71311b695b2d343b9f09a216b7a8257c1cdcb01b2ab9459e1490e3" + ], + "outputs": [ + { + "uxid": "be081639ea8da63d8542707e9ea9625f6afc97da132f43ed061645c359bb1e65", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10.000000", + "hours": 8 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 171, + "block_hash": "a58ab1c90b6564043f375c48413800c33ff05c9eef017250672ea5a0dd11bf17", + "previous_block_hash": "e854e12b5ed0bcb26b2348448fa2af1cd30cf371763fa91019d62a950bf36c95", + "timestamp": 1430870562, + "fee": 6084778, + "version": 0, + "tx_body_hash": "fb495093f2f4e5c6555c50150ea60c0a6f430e53aa971ebb3e2b5412866a1f06", + "ux_hash": "e06be06b42f1aa65940658c601cf7132041f7a1eeaffdeede72cef54d9465e66" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "fb495093f2f4e5c6555c50150ea60c0a6f430e53aa971ebb3e2b5412866a1f06", + "inner_hash": "05596340e51ad628080101c8e92a60f27e0f5ab509e892f9b65a0988b1575ddb", + "sigs": [ + "068a56e916267a1756d9348bb965f3ed2dcba956fe4c626cd4836921dd836f7c0fa923d6451d5c87aa2eab528ff19ec332434bd12e197eeafbf0896e84940c4401" + ], + "inputs": [ + "6b3a0cab1d9ad6fd011a3bac5e6ff4e3f7903bce911dc7fe83926eae557c34c3" + ], + "outputs": [ + { + "uxid": "372703f8109295f0f58fbee58795979e10dd887869f4fc1da4881ce8a3c0aeb4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "647750.000000", + "hours": 1014129 + }, + { + "uxid": "a35044035cce79cb988c757dcaf5d9a065957c0fbc1a3559d08ed46831504fc2", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "10464.000000", + "hours": 1014129 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 172, + "block_hash": "78ae70c3a0f403b6b5d14dab13e3d29f151a0e279a8a4818fa0fe9becb639dc2", + "previous_block_hash": "a58ab1c90b6564043f375c48413800c33ff05c9eef017250672ea5a0dd11bf17", + "timestamp": 1430870592, + "fee": 849078, + "version": 0, + "tx_body_hash": "7abef7e4080bf2cbe9f147d7c9cbe4c950b38f8477d304466c938b937cd379ba", + "ux_hash": "41c039e8b2ade1a2cd9f7a58873d57729c30d3639a33755b0317ceff66e6f7a9" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "7abef7e4080bf2cbe9f147d7c9cbe4c950b38f8477d304466c938b937cd379ba", + "inner_hash": "f28366f7590220cd42faaf9ea041c8ca4460707e0dbfe1d3ac67da8d9dda268c", + "sigs": [ + "e9ff8a0ce6c5e8b09936e031ef8cc6a0f3f3ed0a5360dcf2f649db3a2da958441c20916b27d1ad2ea8415679755b36967074e20feab7271528cb6b3266268ec201" + ], + "inputs": [ + "074645413ab2aae818e657f6f36420447a872e7cdd2ff64324b486be4d4d1edd" + ], + "outputs": [ + { + "uxid": "b1b832a911d45aeaab73676caad794fe2ab99d423f80c4ff58cfb269656b03dd", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "28100.000000", + "hours": 141512 + }, + { + "uxid": "c31c199a54ecbea5e57bf7f5e73d231a09e11713dd0ee70e340e4b0a9c9f9fdc", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 141512 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 173, + "block_hash": "55b1be7e73d1ec35d71c8bc6f62e1788ded35752b39188c98cab6c9347f77ead", + "previous_block_hash": "78ae70c3a0f403b6b5d14dab13e3d29f151a0e279a8a4818fa0fe9becb639dc2", + "timestamp": 1430871512, + "fee": 764646, + "version": 0, + "tx_body_hash": "a7665cec98224150968ec1ef9ef2d6b3175c9de8f9f8c7bc786b30cc74997c57", + "ux_hash": "abc08f5bf1ed183dd5dfa6dda09d9de6adfa23e310454861ae1fb938e0384321" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "a7665cec98224150968ec1ef9ef2d6b3175c9de8f9f8c7bc786b30cc74997c57", + "inner_hash": "5bd2503c4ff78e7c9d182bfe5e62e54f1bfb944bb526d97b272021d8ccfa9359", + "sigs": [ + "dbd1e8763cb9681aeb96edc0c8483decee30b670778bec88da249f9d4f2201c330d2a16349608ba51eb8a387805dce9618810c4e6fd7af548cccee7d2c9c5dd201" + ], + "inputs": [ + "372703f8109295f0f58fbee58795979e10dd887869f4fc1da4881ce8a3c0aeb4" + ], + "outputs": [ + { + "uxid": "14027340f6e1d98bba3f7f5f3b50e3588f8a19e4d021db944e7a28b2643640e1", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "635750.000000", + "hours": 127440 + }, + { + "uxid": "793f3f0e41c9d1de391d864792b79ed8c24dde5ff84a73c161d660a73ed70c90", + "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "12000.000000", + "hours": 127440 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 174, + "block_hash": "0a4f2c0ea33c75ae7af4eb743935f53f0953e26fec3bf7128f0a88fdb879f497", + "previous_block_hash": "55b1be7e73d1ec35d71c8bc6f62e1788ded35752b39188c98cab6c9347f77ead", + "timestamp": 1430871622, + "fee": 111521, + "version": 0, + "tx_body_hash": "ad44a8027a825e82a20cdd910d9bd41d74025601b7668c80655e9b45afb8bb93", + "ux_hash": "4f36b853bdb042046c522f2f5e397ccb24b59a5ef6931dd1cb1d48cc87a1ffc9" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "ad44a8027a825e82a20cdd910d9bd41d74025601b7668c80655e9b45afb8bb93", + "inner_hash": "af11c711190f9b52114dd31dcc4dbcdff3f169c6ce2559ff5baf14032e057145", + "sigs": [ + "fd019f0cc492d5b6ba1bab0e3c77659b0e4773ea9b7dbe9808ea1392bfcd41e20aec3438076cb6ae4104bb6730b47ad1f1cfe878155f984ee380da10991b2a5601" + ], + "inputs": [ + "b1b832a911d45aeaab73676caad794fe2ab99d423f80c4ff58cfb269656b03dd" + ], + "outputs": [ + { + "uxid": "c39acd3494113650c1a6a7809287af7b12a78bbd97126d4585dd1715e2cb5a66", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23100.000000", + "hours": 18586 + }, + { + "uxid": "2d3f7890d11efedd4cee3a7ab4a5cbc56d2c8df4f02124bdad9ec839400053ba", + "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "5000.000000", + "hours": 18586 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 175, + "block_hash": "218d3fadc712eec96e1ca2f68adbb468092c597f269fb3a3702b77c2b80665af", + "previous_block_hash": "0a4f2c0ea33c75ae7af4eb743935f53f0953e26fec3bf7128f0a88fdb879f497", + "timestamp": 1430908702, + "fee": 110149, + "version": 0, + "tx_body_hash": "9364ed6cfcc289df74dc6bac1993f7ab3441b898cb3f06918198d2476c83dbac", + "ux_hash": "4013a4dd63875f19f124c440685a727e9654d8c2de3298f416bd98c2bbcf2ac9" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "9364ed6cfcc289df74dc6bac1993f7ab3441b898cb3f06918198d2476c83dbac", + "inner_hash": "a55922b0495d39c8e9db70ac9aca99266d5a7f3644106b4b5468345d955acf41", + "sigs": [ + "cecae09b7925e9f6db1ccf5ef9a93687a43bbeaefe2888abcc07411c71f850c80c05ed573abd67bf9f0e8a096a1aba8187547e3d062e5ed147ac51961cc3559701" + ], + "inputs": [ + "14027340f6e1d98bba3f7f5f3b50e3588f8a19e4d021db944e7a28b2643640e1" + ], + "outputs": [ + { + "uxid": "8e55f10a0615a0737e6906132e09ac08a206971ba4b656f004acc7f4b7889bc8", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "625750.000000", + "hours": 18358 + }, + { + "uxid": "d91e07318227651129b715d2db448ae245b442acd08c8b4525a934f0e87efce9", + "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "10000.000000", + "hours": 18358 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 176, + "block_hash": "7ca9af9ed16449652da34d3ab49f3d6fc6be8cc1af3d31be81043e684f14de37", + "previous_block_hash": "218d3fadc712eec96e1ca2f68adbb468092c597f269fb3a3702b77c2b80665af", + "timestamp": 1431162639, + "fee": 2711954, + "version": 0, + "tx_body_hash": "a17cf54c20ac7ec6e1362acf24c5e5589ed8b49bdba791a87430de160a473913", + "ux_hash": "5ad39ab834a65739085413db13fb8c152a641ba28b2b45322d1da9c6d9aa05ef" + }, + "body": { + "txns": [ + { + "length": 1481, + "type": 0, + "txid": "a17cf54c20ac7ec6e1362acf24c5e5589ed8b49bdba791a87430de160a473913", + "inner_hash": "71127fa12d9ca390715586fe313b4e130b24614e0eaec276dc2dd25b7228c39f", + "sigs": [ + "95855ae7d279d4797bafe542fd1803eb6a89533f29ae0d89d3f51256feeacc343dbd3da0d8d104e436c04643c72b5dab7a74634befc942ef9d96ded3e235ab4b01", + "55222337fce2733e7a3f92bf808da32759f33327c616828bdb0a350e5d3567b34fdef1a55340d7f857c4daed9735ad64394697ad941fc883f9365693991299a500", + "950281f4acb6cb8176929740aa90fa8729ac5687ef6500bc087429c43f5414e319c26142fca51c0ed9e5d434a6c83d2e3c837d7c9213398ae2104429d03f35dc01", + "c41f7425ecb51359a1da6ccf090a565beed72c891c49a8c81939a46f914c55de5766e99f1519302bfeef2224f856c859391d1f531004ee088083259fca82b17400", + "ed7085f8ceb26060851a71f665387d7c44774c6b9ddfc8d3a06e1fe50168d48510f63f5b6a0998c2a30d24bf37f1c6030035ef8df6efe6dfdcae38beeaf3a5a701", + "a88fefcc8f2809a288a275aac579f340c5138f8bfedf02964d4e3ed0492ee54e696de7e6f7f0b3f315461fb5df4f8e5e5fc7a5339ca6899c6ca7b122c54c90db00", + "ad9b245807ab8c5c5a713ab7e3bfbbba8af032bc4915c1824d95e95827d95be473eb1f6952ee489ddad59049364220bab124182251142b849235ed552404ba3d01", + "7a403c671ec5a6a6622ff63e4d482d51fda747cbe85cf8ef642aa840154be435409df707aa81a3c4e553e0c2c250a452e8416dc38697c35f830de27924a052fc01", + "06b5966aa7c7dfd425e773aafd46fdf29b41734b73f84ef1cd8941e617e0d6245e99f6d8be8b9609686b0faee4923b8bc149078ebb18c1b2e8f6318c846675e801", + "c5634bef581b26d600ed6f4cea47f402633e74ab8f5497b2c2ca69a01e3dfeda0a38308a4a96cfe58857e4c0c2311ecf4e3f4eef69aa771a1db89c360892492200", + "4807a114ffe9e44797843f76c74e81d72324885a67d560c4e1d6e4cadd271b637176a932dc045844b52a4c92f6892ebb0265838366827fd0e0b6b7e20e4e1ff501", + "bc1ca4e3d0afd920bad8c4ef8a6b847c71f75ae8ca913ddb5d976dca42af12ea3ec3a2e59ec8f57fe4fb41af3f439387272ea847240ee89468c4d808303cf9be00", + "366f0f68a36bccd22e829eb05f960a8015466bb5eeb8e553dd37b52ab624d1756f68501db2a8d14fda04d1adf3239a9785ec142c14c5bb34cb8d47629c191dc901", + "146eed504f7acbbece951bfea4eb426e80852e3dc6ae9c8a68480fdf4e07ddd73a5709e2f9df0154380d837a5ff66582c07a0fc27d0df4e7d6d28bbcb90e3c8d00" + ], + "inputs": [ + "04c0cd4cbee1e5414791d9e0b9ae4f889bc52d253b5f70b09fbc32c88fb415ae", + "f3034ffe54e869315f8e11801d3e755352fb75b878b24313302273c1b7ea62cb", + "3538af0016ec0f4d0e943c5d49daf280b416701fde4040fa72710c0ca1b5b559", + "0560bae3917bca7581af9b6c5a58e395c701ce9ed0241dac2de8a3e93c0b839b", + "3fe7d61ffa993e00200ce6be7ba347c603032ac3f8c4ace07767e630fe94d76c", + "2a09e97f7725a35af1357842206875a023252da4ebfce129eaf4cb87119cfd41", + "617b584bb9e6b1d80daac915fb3079b22a326777d1515a40e7b7eddf427f4099", + "18293d947aadf89d9e57d18fa01408867a9abe267504edbdabf8c2a57d9a6323", + "045dc2e76321e37884588093083ce1b21be12f20ba1fa36f2a755b894229e3cf", + "b1e5c694c30326cda3df2e634723999befbcbb141415e9a36bdbf18d7bea9870", + "db7a63750db787959a9e0d2d6be9a1ba8bb3d6015bae2353a27ae9eb55b39d22", + "5954742a6ca4e3e872d12d4a93436451ad52e6d25e5ac28371e308b2d7ce75a3", + "a35044035cce79cb988c757dcaf5d9a065957c0fbc1a3559d08ed46831504fc2", + "c31c199a54ecbea5e57bf7f5e73d231a09e11713dd0ee70e340e4b0a9c9f9fdc" + ], + "outputs": [ + { + "uxid": "d6735d3ad70dbf553048faf1c529d047ab12282d04e320bd67c915779fc4e3fd", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "24950.000000", + "hours": 451992 + }, + { + "uxid": "a5f3c513b5a01dc5e943a5cae91f54b54cde55e984a9480d68d690f40dfb7914", + "dst": "v4qF7Ceq276tZpTS3HKsZbDguMAcAGAG1q", + "coins": "5.000000", + "hours": 451992 + } + ] + } + ] + }, + "size": 1481 + }, + { + "header": { + "seq": 177, + "block_hash": "3e8ac6b4c715bd92db824163770e28ee1b5362d449241f77719f13614b3c320a", + "previous_block_hash": "7ca9af9ed16449652da34d3ab49f3d6fc6be8cc1af3d31be81043e684f14de37", + "timestamp": 1431162689, + "fee": 338994, + "version": 0, + "tx_body_hash": "e4850021fb706f2b7a94fec9ade3c166823dcd980dc3954437471d98fb9d2280", + "ux_hash": "c9b05516880ca6665a0f4fa52e7feb6fe83c1ffd6f4d2874877dfa67265524e2" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "e4850021fb706f2b7a94fec9ade3c166823dcd980dc3954437471d98fb9d2280", + "inner_hash": "1a07c8a17c429aec5c0725dc6e4891f4e304a483211f99b847a6820e410b56ef", + "sigs": [ + "e7d92fbcc6716645c2c28a66ac289453b2967c620e105c7699cee251aa6916227057789d10889689a3f3c743dadfea09e1cf747cc7b7ccb5381fe1af1069e06201" + ], + "inputs": [ + "d6735d3ad70dbf553048faf1c529d047ab12282d04e320bd67c915779fc4e3fd" + ], + "outputs": [ + { + "uxid": "ec439e7c7d8517824885ae1520fa5b19f991d7ade3a12209c0e87f6ad1d30229", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "4950.000000", + "hours": 56499 + }, + { + "uxid": "f5e7796297b7201b1ea87736fadddc7b451f9ed7d4529cfe9f03082e80917628", + "dst": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "20000.000000", + "hours": 56499 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 178, + "block_hash": "bb943b37f989326b057903ccc6eb1fa58a5d35e38706ae1ba81e0a6100bacf26", + "previous_block_hash": "3e8ac6b4c715bd92db824163770e28ee1b5362d449241f77719f13614b3c320a", + "timestamp": 1431162729, + "fee": 395493, + "version": 0, + "tx_body_hash": "ecd101a6af263973ab75f87a3116231e6fe84a2281d0001c9aa2d7195545e78e", + "ux_hash": "428b5ba5d4928fa538d9a031bf9fa3eb215b47d780e43e69bcd71d87758ada2f" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "ecd101a6af263973ab75f87a3116231e6fe84a2281d0001c9aa2d7195545e78e", + "inner_hash": "41bc4ea9ec8214b461a5377d0ae0da38831bc972b8dd54becaf195b5943dd55e", + "sigs": [ + "4a604f9845e202871ac8741962280bb5db6f1295353042922a6f46671f27cc1d6cd4085aec390205aa5ba08f2c841295b4c86d2fab81d6e29fc958dfe9712e2301" + ], + "inputs": [ + "a5f3c513b5a01dc5e943a5cae91f54b54cde55e984a9480d68d690f40dfb7914" + ], + "outputs": [ + { + "uxid": "ba1adbf3006a239fb7ef6efb1f9390a25951a5185dc312dd81bf88025f838456", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "5.000000", + "hours": 56499 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 179, + "block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "previous_block_hash": "bb943b37f989326b057903ccc6eb1fa58a5d35e38706ae1ba81e0a6100bacf26", + "timestamp": 1431339429, + "fee": 33129894, + "version": 0, + "tx_body_hash": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "ux_hash": "c99075adc48450a9bf04b8b06defba39fc9cb029fbac413d57ee9fea241d84b4" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "inner_hash": "db98f515ce6c3d99fd7c39a6ac59ab498b1a2cc8fc6a13377ac7d3d463898e7c", + "sigs": [ + "1ca18424c9a313e9c253aecaec3c532c35c60e454f026a3d2794c772bc74a19809d53f8862962e865dd822dd054cd7f32b89b810968d95c9db6a9a0c1095390601" + ], + "inputs": [ + "8e55f10a0615a0737e6906132e09ac08a206971ba4b656f004acc7f4b7889bc8" + ], + "outputs": [ + { + "uxid": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "hours": 5521648 + }, + { + "uxid": "01f9c1d6c83dbc1c993357436cdf7f214acd0bfa107ff7f1466d1b18ec03563e", + "dst": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "10050.000000", + "hours": 5521648 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 180, + "block_hash": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "previous_block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "timestamp": 1431574528, + "fee": 2265261, + "version": 0, + "tx_body_hash": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "ux_hash": "058d1d0a22be7b9f5567a236866836a87d922760581832cfb8bfbd8b337d64b1" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "inner_hash": "d5b18a0c0c454e56fe1f7d0c64236d633f65717c04f08cd943f5669b4cc34667", + "sigs": [ + "2fac42571bb301783e46e804069c73c8226b637ae6385fec793e3a3860feaa6918058c55f461cef38341670c5c2da230d2241f267dbde6fc0528a6fb24362b3b00" + ], + "inputs": [ + "c39acd3494113650c1a6a7809287af7b12a78bbd97126d4585dd1715e2cb5a66" + ], + "outputs": [ + { + "uxid": "75692aeff988ce0da734c474dbef3a1ce19a5a6823bbcd36acb856c83262261e", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "hours": 377543 + }, + { + "uxid": "a4b70476ea1e079ebd3503b52eee32d490515457fce6a5aa075770b598a9d14f", + "dst": "CDD8GoJUHEvBm1pD3BQ3hEC2KcJNhvUzpu", + "coins": "1000.000000", + "hours": 377543 + } + ] + } + ] + }, + "size": 220 + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-verbose-all.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-verbose-all.golden new file mode 100644 index 00000000..cac46022 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-verbose-all.golden @@ -0,0 +1,9834 @@ +{ + "blocks": [ + { + "header": { + "seq": 0, + "block_hash": "0551a1e5af999fe8fff529f6f2ab341e1e33db95135eef1b2be44fe6981349f3", + "previous_block_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": 1426562704, + "fee": 0, + "version": 0, + "tx_body_hash": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "ux_hash": "0000000000000000000000000000000000000000000000000000000000000000" + }, + "body": { + "txns": [ + { + "length": 0, + "type": 0, + "txid": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "fee": 0, + "sigs": [], + "inputs": [], + "outputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000 + } + ] + } + ] + }, + "size": 86 + }, + { + "header": { + "seq": 1, + "block_hash": "baf3b622f043bbe3ef480416251a6545d07f173e5969dde2b63c4a12956d38fd", + "previous_block_hash": "0551a1e5af999fe8fff529f6f2ab341e1e33db95135eef1b2be44fe6981349f3", + "timestamp": 1427926392, + "fee": 99999999999900, + "version": 0, + "tx_body_hash": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "ux_hash": "ecc66d67289ecf8b5c5d2758a8f07ef08373a61a4d4e2736905ac2aaa427655f" + }, + "body": { + "txns": [ + { + "length": 3846, + "type": 0, + "txid": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "inner_hash": "0f7019627886818d2501af189bbac18e21b8e959891c5b2726f89e29355aa10a", + "fee": 99999999999900, + "sigs": [ + "be602113fe288f750001ab65f254ceedd8b05b1becc456a0a52a0bea10b8280e38d950933992ad3265e1f81d197036fa634b316f08b3b319ffce081aa43f3bb600" + ], + "inputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000, + "calculated_hours": 100000000000000 + } + ], + "outputs": [ + { + "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "26f585cb96f35307f0af5b9aee004a29b7795695f4c5c836104e2fbbf429a3ce", + "dst": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "18a43b8b69bbf12a9e49e6f9783ba258397e6567301aeed9e901a1e4fed9fef9", + "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5a69ef09b5de21b117cac62141a8de4eade7558c42f0ba8b50996f5ec7867c5d", + "dst": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "aef761a12e3d0fa9c4a8db62b8bab1015c32931b7e3a7fc9a77282cec218f79d", + "dst": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "445a4082da251fa161e4705d115fe2018ca15a5f92e8a0950793405410e6be12", + "dst": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "dst": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "368a609ee90ca15bbbd297af07dc6705131764476d54bef641017ffcd0885e65", + "dst": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "13afe1586015c4d7312f89d123153279e4961eb0d53a4d036847d5d989ba90dc", + "dst": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f625cf04412199c16e073dbb500e66c23cfe69043578b4a2d879a329aac563ec", + "dst": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b2da50a08756c34d059a04812451cf3296f73ba87f8cca38473ac8f051ab6d1e", + "dst": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "135c28698e80e3b2a737d59c16c79684c3fb3ec5cec59f466a39f4ac3c73968e", + "dst": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "df63056cf3ae21efa86d241876ad0194387317585dc9e4fcd80954b47d59b57a", + "dst": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4628f4cfdbf1eb7cccc25d461c46cc29e90cffb5d6277e0de641f7701d60c308", + "dst": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "47e4706dc4d80a70b20c889476fb0627ca6d5bdaa790f4ceba44a689d31b2dcc", + "dst": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b64bc50d370a06df117eb543ca051239c985cfc4b6aa527c51b700de32c7fc41", + "dst": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "390bc4c045fa9f289957b7eca529bfadac96a7dd074bcfbdd3b09e99413b8202", + "dst": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6aa162f7fc09598c4dc8f5fab7fb2383f28c3840937a001acd9f37136e1691b2", + "dst": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e440cf4c896735d3299a871f988c134f404fb2065d1f20c87c9c9bc5fa582e09", + "dst": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "eea791e84a53e4d99485519c5d2c3146b0a2ad080cf92904ae7b28c2d9a6e3ca", + "dst": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "01048ad6a538256d9a8c6c9c6321ca1a01b31cbf08e74fd4ff0f141bf97eb8ce", + "dst": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc5f1f1ddc8cb23df3d42f1e5a1dda9d356846fe930ae4484bc1eeb1b3b2c95b", + "dst": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f03087245a6b64bb69cd5866a1887ae595a9e1a86e196754984840eaf6d3eb9c", + "dst": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "239bdba27dabd52f7450f7d8521c9a7e5ac74093ae3f6f2348bf40ac9a6db7a5", + "dst": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d60879e562b65f97d40bec7309d4490ba0a8c80e2349ecb2e3505aaa50ea1e47", + "dst": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "66e685901492c94942522c346759c711ee2e78a059ef274e77a6ab433409683c", + "dst": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b497992663f99f9902deaaf487b00655820003015ea92091628f4a6e8aeb5854", + "dst": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc40377012004566712fa860e74db97305091cc163e95435e04556c70d32f9c5", + "dst": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "73304622e33994bc2d4ade2cab78d28e1b65185e60ad3c781ecfb5cbc8159136", + "dst": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fed15e8506d0e0898510311850b8863ef6d9a499215ae8823a1e3fb9c8140ab2", + "dst": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "12034bc455d0821813d7eb9afed1ed1a8f19b6f29826ef4a057b4aa0b4228817", + "dst": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fc444cdb2598f44209a41ea20afdc9065ebe51b7cd5f65bb1c0f7a7b427ce7b1", + "dst": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "618d242d95d33e2d7316612a164d89859b85f1287f0d5bed4dcb561cf478f706", + "dst": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "07f70fd4108ef4d2fde3b85411728c1f7bd3a135d2062c5a30a46cc885463780", + "dst": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "af9bcf6ba63a08e699bc101aa362f135343aaf78a56e9f88d118fca0e1ce5c08", + "dst": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6b3530bb930ed10bbc4c307663aba4377c08443498a0a2cf023b1be72f378ae1", + "dst": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fd6da5199e528958e68ee8dd003b727d4d840754ea7c1e0c05e4f0e504c9b2cd", + "dst": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "131f07f5b40f365fb537b863e4aa5ef0efcd77b7fa2ff321d90eeb743ac43678", + "dst": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ffbdfdbf3427d04f445c33e867845bec1ee64a9dfe0d0fa8284547c2226fdfa9", + "dst": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b53c7188ebf4d630790ff63275679ba48009e31af6e4fe15806619216caa750", + "dst": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b4c6639b49402c2753f83c7fb7d3ffa65da74e47fef2b781933ff55b14d09bcd", + "dst": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c956289db079c00d2f80c590d3c8ca26c37da534fe5f65e799b3982ceca493c", + "dst": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "550d2a8d3047cdae0c05a61cc3de43e758b123a6955fa067d3ac375f7d0dbadc", + "dst": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78740d5bf49989936d315bf641949232aace582e03de57db8abff940f7d51bd1", + "dst": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9f2c83c5165826de1077f428ad39d41473e32ed64cd83180d49e7d8e5db996d0", + "dst": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "883be4d7173c235933294ab8dcae8cc76609166eaa1c1f07e9b51d551c979709", + "dst": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6384ed19650d384c29db4c3a39a1ca855058fab758075be2dee759dd9e6faae1", + "dst": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", + "dst": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c238e82f3a4beee1be7b5b464e8553404f6927d5ab93c3d649d362c01097782", + "dst": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dad4991bfa5c51eb176f28c1b3f86661e02579905e6e07c997df22004e06244a", + "dst": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4ba91512c168281f41d3934b927d0d86a3136a31cc345b635095928f8e5f013c", + "dst": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c416f5e604eeada9ae8e520a429d8f19d4230626769e7121007e01353730784f", + "dst": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7b8787fd4076c27d074d2a4761377a1aa26c843c432e3b7e6b0ebf1e29528188", + "dst": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "38f22b194f04d85a6b545b37df06195edeb8503798b229ddeaa946018150c05c", + "dst": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "246377a036ad5444bcd5f47ac9e55fec7c85fc40644df593038d360554a809f7", + "dst": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c6d5e543ff5f2c2526728d588fb21753db5b7e05b8b275aa5e9b24d29350afb0", + "dst": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "98e223e6e2240fef83082d3daa86e46f10e0c71f3f74489ba95db0951a166f53", + "dst": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c8971ca91f8e21c556f647940073db003f7dd5582ae55d4ebca602d5e8e91a6e", + "dst": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dfa7822c05f54116c9fc3b2cde1ecb4667f47a2d8771fe886e832c223cdc4e82", + "dst": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6d37c0c4b6fcbac1e53a46c9c2dc5d3c3b36312c53f25b2baacc785ea77a11f7", + "dst": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9ba5e31610f0545666f102465efa8caa48ad3fb5b8abd5ae802f4a71e3f7de3b", + "dst": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "3ca365aace71e24b04d6f2ffbf7171468c5e71783858c710cae539c5e43e0c0e", + "dst": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c858f2db2a20ac562d32f8fb2a3a11039849a6e44d2bec30befb2e173532a9a3", + "dst": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1550a76598693b950346397e0e825bbb2805edde38b0d0240e50050829b7b1dd", + "dst": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "466340ab7733abb23ab24d877c673fe089c273f11808fbbd6f33a91da92ee96c", + "dst": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "401d4c0c1060ebbb4b9fb3859c2eb47789f94086f4deb01234bf46f7cdc81247", + "dst": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2c0e3aa084f5fec45f99b3f125ce7d50c6da526ef5165df5f22ba603147c3fc2", + "dst": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2e724d83e35235c23c0bb16ae9b708a5bba3c23b186b05d4b8c606f6bb4b311", + "dst": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4f30eae8c49eb268fe364eaf5ee0788da6e2f6adc2f83cd82e96a4bfe98496f5", + "dst": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8753d5775c22477a8ef74eeebf61d7de30be702e70118f552cc18ad963ffe950", + "dst": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efa2007c561dcbf7c83a6bbdd2ef75e7cca76b05330a8b948ba0dd94dee949f7", + "dst": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b379d1b8ff0153c63ee69c40a7155b97fa42ab570f68ff847d457316c4d8ab9", + "dst": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cc84f93adce16699d9e84ef32f55333402431b58dc50c17084bcb8b33f382f88", + "dst": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f38f0760769c19075034f70b059abf4d1bfa6d01e1e8c369a99900ed1eaeca6d", + "dst": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8d55f76bb0b3dd222cf85a7193501c0f4071b446f56dbd1da355b1625993325a", + "dst": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efde499c7e4444bc602b7bf5ed50e95a18ce8ec9a06ba9d850a05bb7a25ecb3a", + "dst": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2a4d631d5dc90e397d85f13410d1a6d877dcaf592a0e2be2e727443ac74b5bd5", + "dst": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e936299a21240744f6edbab493449323f920bbe15dcf294463e5a2ace10f27b0", + "dst": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "44e17f4bd29411a1614457171c06183e364bf6ff80a201717b2dfc0748e9ebe3", + "dst": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1941e5cc5e38dd92427580af699b1f410be7b29ff17d3d0ff3d046bfba0aaabf", + "dst": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ff6c0f27fcf92f3b4a3871b801c3116847fe47a7e3bafcadd4855d06012091ad", + "dst": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cd6c4b785e60757fad0e6fd4874b729ea7703fe7ee9560e1283d2eb71fc75321", + "dst": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "745eaff456a390c3868742a039e72c2a93ff8eee10417dbe848d533b89facc04", + "dst": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2f3f050c9ef31bf5c3b14c1c71699c4f4b38aa18479531194d12e6277416516", + "dst": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0b95850edabed70762768ac1695c5d7f230cccaa8de06657cda42cafba36374f", + "dst": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7c767d3a06db1ac0e1809ebe29a7d9689143259f4651837de54423e287c20490", + "dst": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78b07e8fe1366e173f2eeb75c35cd53baf0f6100de50ae12b4ffe7d0d7ba4298", + "dst": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5010eb25f6e1ed725fb901ae1e945e545ae846d7be8a135333d2d41102c33328", + "dst": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "178a33e64826cd2039b8538b74e6de513966acab45ab79d77dc9392018a65ffb", + "dst": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "044dc539d063250dc654b2bf0986a9044b4eea05e1284c11a2b313acd8dc3498", + "dst": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9fd5ea38f383291566def44b6fb932414f97123952578fe0cfb9a30eb075a099", + "dst": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "be5930e9cc35801433bcd21db84da7d4f1d8e744feca16a2c6fb00c81ce93e51", + "dst": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8cd999cd193d315e5f1c6f74c230c12e6abe6847924f6e89d988e09ca413f52e", + "dst": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0cff53628eb0e984c134b68cbe4b1bb7721a05adaa32e93b9df489a9a7a176cf", + "dst": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "a5ef046e84be9ff2485dde49afe6073811286761afac3bbd588b6e4130930479", + "dst": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cdee5f84c4f08098ac740e3a260ced14c1e199e126aa5291ec079b281a7dc407", + "dst": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6a24135f8496e7a37dcf7164218bb3aa530319f3b2bf3c7a1a9cc1bd17831328", + "dst": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "693c7f970b34ce5882e62430f4c9c28957159a257d27d4e21a61fd95c6b97464", + "dst": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c008a613cef129c180dbcc7213f2d41a14d245d06a3844d63d9beac963145385", + "dst": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "439cdfd03972fb4bb5da54208cf8098ee78228c487ce9e84623f5f83e17a7d68", + "dst": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "hours": 1 + } + ] + } + ] + }, + "size": 3846 + }, + { + "header": { + "seq": 2, + "block_hash": "01723bc4dc90f1cb857a94fe5e3bb50c02e6689fd998f8147c9cae07fbfa63af", + "previous_block_hash": "baf3b622f043bbe3ef480416251a6545d07f173e5969dde2b63c4a12956d38fd", + "timestamp": 1427927651, + "fee": 0, + "version": 0, + "tx_body_hash": "312a269b8248e389c61571cc13f4ad13b7d53b64853d990ddc301a58e7071889", + "ux_hash": "163a4a92e3ea23475a854215a8813b327f724e374df4b50ac414b94ec57b3c3e" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "312a269b8248e389c61571cc13f4ad13b7d53b64853d990ddc301a58e7071889", + "inner_hash": "4daff2831f5bc2877a98a49b0ef75f8ff01bcb35082fd4018c77707dfca31849", + "fee": 0, + "sigs": [ + "f4482e0781e0d94c8c4773940e1f811405681844a9dc3c1938243442e1cbd5463d5e251880abbf8ff1ed85b4b2659e83ee30f06cc4c5dc9913aa6a9630fbe3de01" + ], + "inputs": [ + { + "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1 + } + ], + "outputs": [ + { + "uxid": "0cd548e03bd13bca8647cd13f6baef0c65fd03081aeb6dc3695536e5bc6018ae", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999990.000000", + "hours": 1 + }, + { + "uxid": "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 3, + "block_hash": "35c3ebbe6feaeeab27ac77c1712051787bdd4bbfb5cdcdebc81f8aac98a2f3f3", + "previous_block_hash": "01723bc4dc90f1cb857a94fe5e3bb50c02e6689fd998f8147c9cae07fbfa63af", + "timestamp": 1427927671, + "fee": 0, + "version": 0, + "tx_body_hash": "a6a709e9388a4d67a47d262b11da5f804eddd9d67acc4a3e450f7a567bdc1619", + "ux_hash": "bd8c7dc7aadb8cd70e8ba97fb71b5ca77c9be157932930bc547a30bb095bc6c7" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "a6a709e9388a4d67a47d262b11da5f804eddd9d67acc4a3e450f7a567bdc1619", + "inner_hash": "ea6adee3180c7f9d73d1e693822d5d1c2bba85067f89a873355bc771a078faa1", + "fee": 0, + "sigs": [ + "ce8fd47e2044ed17998f92621e90329f673a746c802d67f639ca083705dd199f6ee346781497b44132434922879244d819694b5903093f784570c55d293ab4af01" + ], + "inputs": [ + { + "uxid": "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 4, + "block_hash": "415e47348a1e642cb2e31d00ee500747d3aed0336aabfff7d783ed21465251c7", + "previous_block_hash": "35c3ebbe6feaeeab27ac77c1712051787bdd4bbfb5cdcdebc81f8aac98a2f3f3", + "timestamp": 1428793611, + "fee": 1852, + "version": 0, + "tx_body_hash": "c24b92898381fbebe59a457924184f4cce1e7166e140ca75aea5baf854c1ab75", + "ux_hash": "58519fbe20c1ca9db0fb922f5b32808f1d9aed249c266f2d4a14ca2597d80817" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "c24b92898381fbebe59a457924184f4cce1e7166e140ca75aea5baf854c1ab75", + "inner_hash": "43dd65d5644ec5214a901ac94e530cbedb83d2174cf402c7b24697cfe55e1de7", + "fee": 1852, + "sigs": [ + "434a7a0b624fda393c1caa57ac9787f69da3d8854d0ec6f69f0da1c96c9b683d787064b644e9ac3dd4dd8466c22c1547cff89c2552420f5efcfd1eacb1a2eac301" + ], + "inputs": [ + { + "uxid": "0cd548e03bd13bca8647cd13f6baef0c65fd03081aeb6dc3695536e5bc6018ae", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999990.000000", + "hours": 1, + "calculated_hours": 5556 + } + ], + "outputs": [ + { + "uxid": "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999980.000000", + "hours": 3704 + }, + { + "uxid": "98b3e6e6d4ed36159b7dbf5f305174fc0c255d2d97528b35a67d50b9968e2b2f", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 5, + "block_hash": "114fe60587a158428a47e0f9571d764f495912c299aa4e67fc88004cf21b0c24", + "previous_block_hash": "415e47348a1e642cb2e31d00ee500747d3aed0336aabfff7d783ed21465251c7", + "timestamp": 1428798821, + "fee": 2036, + "version": 0, + "tx_body_hash": "0579e7727627cd9815a8a8b5e1df86124f45a4132cc0dbd00d2f110e4f409b69", + "ux_hash": "70439be07958c0dfa9932bfa108d7dad20a37db7ae6db4e06a3225443d4b5481" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "0579e7727627cd9815a8a8b5e1df86124f45a4132cc0dbd00d2f110e4f409b69", + "inner_hash": "fe123ca954a82bb1ce2cc9ef9c56d6b649a4cbaf5b17394b0ffda651ed32327e", + "fee": 2036, + "sigs": [ + "056ed0f74367fb1370d7e98689953983d9cf34eb6669854f1645c8a16c93d85075661e7d4f6df0ce5ca8eb9852eff6a12fbac2caafee03bb8c616f847c61416800", + "8aaa7f320a7b01169d3217a600100cb27c55e4ce56cd3455814f56d8e4e65be746e0e20e776087af6f19361f0b898edc2123a5f9bd35d24ef8b8669ca85b142601" + ], + "inputs": [ + { + "uxid": "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 2405 + }, + { + "uxid": "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999980.000000", + "hours": 3704, + "calculated_hours": 3704 + } + ], + "outputs": [ + { + "uxid": "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999890.000000", + "hours": 4073 + }, + { + "uxid": "dc63c680f408c4e646037966189383a5d50eda34e666c2a0c75c0c6bf13b71a1", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "100.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 6, + "block_hash": "103949030e90fcebc5d8ca1c9c59f30a31aa71911401d22a2422e4571b035701", + "previous_block_hash": "114fe60587a158428a47e0f9571d764f495912c299aa4e67fc88004cf21b0c24", + "timestamp": 1428806251, + "fee": 0, + "version": 0, + "tx_body_hash": "03b3ab821cdaf0ab8cc1a9e2dd30108772ec3bda09e9d3a8c48df9f30d213b38", + "ux_hash": "dad0a423ff7b1c5c6021698c5c75da34df37b9fc0a5b0c60bcbb50e8665c0610" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "03b3ab821cdaf0ab8cc1a9e2dd30108772ec3bda09e9d3a8c48df9f30d213b38", + "inner_hash": "e49bf8f45cb6664d36ec632e37bd91566d8bd4ea9ce209a0a955323a94dd744f", + "fee": 0, + "sigs": [ + "0a0d9a3fa0597667fb991bbe047ff93c591313faf759fcec2f47138bc0666b333b7689ad527ddb8ef135897be41016f755eb14e46cd327fc5eb196bce80c3cd400" + ], + "inputs": [ + { + "uxid": "dc63c680f408c4e646037966189383a5d50eda34e666c2a0c75c0c6bf13b71a1", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "100.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "8ff8a647e4542fab01e078ac467b2c9f2e5f7de55d77ec2711f8abc718e2c91b", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "95.000000", + "hours": 0 + }, + { + "uxid": "778048daec0c83f89525a6d69b60c407d090bb1666711b1c560e6ebee8dcc452", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 7, + "block_hash": "6cb71b57c998a5367101e01d48c097eccd4f5abf311c89bcca8ee213581f355f", + "previous_block_hash": "103949030e90fcebc5d8ca1c9c59f30a31aa71911401d22a2422e4571b035701", + "timestamp": 1428807671, + "fee": 0, + "version": 0, + "tx_body_hash": "f832428481690fa918d6d29946e191f2c8c89b2388a906e0c53dceee6070a24b", + "ux_hash": "ee38fa1b02dd0d190187c9cd9aba2d7296e0aa7b6b983f61c1d1fe998c1433c7" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "f832428481690fa918d6d29946e191f2c8c89b2388a906e0c53dceee6070a24b", + "inner_hash": "f440c514779522a6387edda9b9d9835f00680fb314546efb7bc9762a17884156", + "fee": 0, + "sigs": [ + "8fe96f5502270e4efa962b2aef2b81795fe26a8f0c9a494e2ae9c7e624af455c49396270ae7a25b41d439fd56dea9d556a135129122de1b1274b1e2a5d75f2ea01" + ], + "inputs": [ + { + "uxid": "8ff8a647e4542fab01e078ac467b2c9f2e5f7de55d77ec2711f8abc718e2c91b", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "95.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "17090c40091d009d6a684043d3be2e9cb1dc60a664a9c2e388af1f3a7345724b", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "90.000000", + "hours": 0 + }, + { + "uxid": "f9e7a412cdff80e95ddbe1d76fcc73f967cb99d383b0659e1355c8e623f02b62", + "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 8, + "block_hash": "34ec53ac5b15e8c0c60312f67e209318c3b09c5ecbaabf0843a161f889614584", + "previous_block_hash": "6cb71b57c998a5367101e01d48c097eccd4f5abf311c89bcca8ee213581f355f", + "timestamp": 1428807691, + "fee": 0, + "version": 0, + "tx_body_hash": "7229422f3a0afb5f3a9596ed50146440c17a3d54abda0f3c70cd9dc58de96374", + "ux_hash": "34174a65e1b34d0d7dd0e219f7969e303d4117024b14f8fa5ecc58c29c4c417c" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "7229422f3a0afb5f3a9596ed50146440c17a3d54abda0f3c70cd9dc58de96374", + "inner_hash": "68fb8cd96b0d2a94838183ab24f36f71006383add373837d448a7584ef69bc6c", + "fee": 0, + "sigs": [ + "b859da7c65d6525247973fc62d274343feb3fe6fd76ab392dc30d7cdc609a7e45018b425fbdc3e79647e43b99d25bfab6c23d60495e5e0ce3cf06b6ce2c4897d00" + ], + "inputs": [ + { + "uxid": "17090c40091d009d6a684043d3be2e9cb1dc60a664a9c2e388af1f3a7345724b", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "90.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "999cc56deae71486a28e19d1ed8d585c2cf07d5ee27d1c33bea186d23aaca06a", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "85.000000", + "hours": 0 + }, + { + "uxid": "1f810bdd1c65ad50f27f2c47a000150877fdba2fdb78b9d8cae39946be6a9e33", + "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 9, + "block_hash": "d33c2466840a09e10efe3736f3aaad05b6b8d05cedcdd0099f84fd1ec6f55282", + "previous_block_hash": "34ec53ac5b15e8c0c60312f67e209318c3b09c5ecbaabf0843a161f889614584", + "timestamp": 1428807711, + "fee": 0, + "version": 0, + "tx_body_hash": "9d87d7bb9e56a3588bacb478c7556280b28c0a49f6e09db8b54a84c20d865f2f", + "ux_hash": "4f560eea54f060c029cedc78480a59f6ca549d4fd6cb84fb0388001dcd11b5b7" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "9d87d7bb9e56a3588bacb478c7556280b28c0a49f6e09db8b54a84c20d865f2f", + "inner_hash": "f60dd876ff32adc5e20759f45c04075f46796b0ca2b76a490d5d1e2d5b18424a", + "fee": 0, + "sigs": [ + "be2ea2bcb4be07705cd034579d77c2fe0f9c7bb29dad0e690f38f8a2e098041c396820004975298d9d3647dfec7cbb610452e294381b898f28d48f166aaea5a500" + ], + "inputs": [ + { + "uxid": "999cc56deae71486a28e19d1ed8d585c2cf07d5ee27d1c33bea186d23aaca06a", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "85.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "2f87d77c2a7d00b547db1af50e0ba04bafc5b05711e4939e9ec2640a21127dc0", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "80.000000", + "hours": 0 + }, + { + "uxid": "9e8997e53d2e61955da71dbbc6ba5b0da799eaace0f45870a4e42276a6fdaefa", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 10, + "block_hash": "5c5e6b0f6620a3af54a3259222a5269e60db768d7f805edce3f3e29f2597a487", + "previous_block_hash": "d33c2466840a09e10efe3736f3aaad05b6b8d05cedcdd0099f84fd1ec6f55282", + "timestamp": 1428807771, + "fee": 0, + "version": 0, + "tx_body_hash": "98db7eb30e13853d3dd93d5d8b4061596d5d288b6f8b92c4d43c46c6599f67fb", + "ux_hash": "dc4b68b8067932c191922c68504bc443c46144ef904c12b50008b3d77ae91aeb" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "98db7eb30e13853d3dd93d5d8b4061596d5d288b6f8b92c4d43c46c6599f67fb", + "inner_hash": "affafab93dc807a9306d1f3c6a19066aca57f284825420fb01e48200349f7ba2", + "fee": 0, + "sigs": [ + "71008403c675d9b3fdf8c09cc6caa64c681b78ba588fe20abb568e318d2e40b55c44ea614efc475c408e1e6e15cc0df753e6d3f04cb521078e6c928d5aa64c3200" + ], + "inputs": [ + { + "uxid": "2f87d77c2a7d00b547db1af50e0ba04bafc5b05711e4939e9ec2640a21127dc0", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "80.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "0c5d1b6a61c32f9bcc62d3583ac957b3374f0daf1a14fd08679bff2554449840", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "75.000000", + "hours": 0 + }, + { + "uxid": "ec2c2238793d71240502de3e7c46ec1d5bf938c76541185f1c3fdf0d99a90795", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 11, + "block_hash": "70584db7fb8ab88b8dbcfed72ddc42a1aeb8c4882266dbb78439ba3efcd0458d", + "previous_block_hash": "5c5e6b0f6620a3af54a3259222a5269e60db768d7f805edce3f3e29f2597a487", + "timestamp": 1428808851, + "fee": 0, + "version": 0, + "tx_body_hash": "4a87de6869c974099e3f5522404fbc7b23f90a8f8dec958bf725317454036cdc", + "ux_hash": "47d440eb55e32969f35f46450636ca919195977ab8bb5fa3d1e9f0f4b48d7fa1" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "4a87de6869c974099e3f5522404fbc7b23f90a8f8dec958bf725317454036cdc", + "inner_hash": "53ecc82b426d4b806eb1c743e892edbc7eb7051c88f3fa8afc74a6a5b80cc57a", + "fee": 0, + "sigs": [ + "dbbb5acf0130c39a6b2fd760dda1df5aaefd94d8a0904e6faf959feade87d17a5c754459b635e0048e1019dadb9815a54d8bca4cf234f6876b19b5a0df5e494a00" + ], + "inputs": [ + { + "uxid": "ec2c2238793d71240502de3e7c46ec1d5bf938c76541185f1c3fdf0d99a90795", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "5.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "9c7d3674d7a6b28a559a052e6d354ec13d2e0396739973c9f0dce08f8c7d157c", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "4.000000", + "hours": 0 + }, + { + "uxid": "3f8c01eefca28ec6d89d34b899fecb5c97f9348b412c61e7c863310b8a85b953", + "dst": "2M2VC93aQv5asdcNKt7pzJdkxeL6xLw9JPp", + "coins": "1.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 12, + "block_hash": "f8da14563b2fe7d532125e5c29be7f544d31d900e4703400cbcbf303f8703a04", + "previous_block_hash": "70584db7fb8ab88b8dbcfed72ddc42a1aeb8c4882266dbb78439ba3efcd0458d", + "timestamp": 1428814821, + "fee": 0, + "version": 0, + "tx_body_hash": "9ea7b912cbfca157ef5fe9c59dd2407302d1b4d95414829d93c45bde6c2d42c8", + "ux_hash": "33777b4a681c64d95213939b1488991d9b055b243fa30e49842d0177224b4d98" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "9ea7b912cbfca157ef5fe9c59dd2407302d1b4d95414829d93c45bde6c2d42c8", + "inner_hash": "8a294b39558a38da2c996a7ce12eb6e045b44ce3b3a153bcfdc664a246b1a46d", + "fee": 0, + "sigs": [ + "81d65e0a176c322059776922be59a385f3d5f430502e51b94dba78662a42161805bea61e646fdd9cad314fcfea00d6f790f758c4e3c8b22ec3bfcf73c79033c100" + ], + "inputs": [ + { + "uxid": "3f8c01eefca28ec6d89d34b899fecb5c97f9348b412c61e7c863310b8a85b953", + "owner": "2M2VC93aQv5asdcNKt7pzJdkxeL6xLw9JPp", + "coins": "1.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "34de4a6d093e880f813b4dc466b51f6814923e157ffbba0e9abbc4bfbd938de8", + "dst": "2AsyTLyWNR3FGhaMbLckaJyAZN46mrqFfXA", + "coins": "1.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 13, + "block_hash": "3351bc6352bf9272c62d72869659d0013786485ef076e8727e03f561f819a06c", + "previous_block_hash": "f8da14563b2fe7d532125e5c29be7f544d31d900e4703400cbcbf303f8703a04", + "timestamp": 1428814891, + "fee": 2, + "version": 0, + "tx_body_hash": "fa33df7c4316cea05095e6c7ce86f361847893d26fe2255af118593a33686c52", + "ux_hash": "000f0d2c246891541cbab3efd2cfad6a1b241c1c716c2e942819eaa59a44370b" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "fa33df7c4316cea05095e6c7ce86f361847893d26fe2255af118593a33686c52", + "inner_hash": "2e88fb3c0f9eaa317794e966e4275cfe62949eed43fa2987729b877178fb9951", + "fee": 2, + "sigs": [ + "25df6c1b4ae2c0cfac2f3ac608b108e5a83ef07c19a125dd098729734bdd6a1f65ca8a3f34878b07f6cd3e7d3e21ab432b1dec68f273dbb52a0ff90b253b6f9201" + ], + "inputs": [ + { + "uxid": "9c7d3674d7a6b28a559a052e6d354ec13d2e0396739973c9f0dce08f8c7d157c", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "4.000000", + "hours": 0, + "calculated_hours": 6 + } + ], + "outputs": [ + { + "uxid": "04c0cd4cbee1e5414791d9e0b9ae4f889bc52d253b5f70b09fbc32c88fb415ae", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "3.000000", + "hours": 4 + }, + { + "uxid": "f3034ffe54e869315f8e11801d3e755352fb75b878b24313302273c1b7ea62cb", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 14, + "block_hash": "89ab3029eaf4fb979e29dfba29b41ed1b8734f2991098879ac239b2ee4d61c04", + "previous_block_hash": "3351bc6352bf9272c62d72869659d0013786485ef076e8727e03f561f819a06c", + "timestamp": 1428815131, + "fee": 0, + "version": 0, + "tx_body_hash": "b68d78c9a4610b540933eaa550fbb1c473f5cf749eb522882f8154d495453e7d", + "ux_hash": "634b6bb24e8d1c21ea35c83322a18546b3d69b754865c8c8381f3c00ceeaf648" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "b68d78c9a4610b540933eaa550fbb1c473f5cf749eb522882f8154d495453e7d", + "inner_hash": "aeb75b736b0467e49884795158dfc6ea5c6cfe2b4f696d9d5b29c1fcac503834", + "fee": 0, + "sigs": [ + "dc926994a9bdd69aca5887edab30fbcbe9fc008328424ca0a38a258bd8c78b543af0e8aaa4195ef9e7c4fb7009f1dbdbb322894be8a319f4dff3809a3592a81400" + ], + "inputs": [ + { + "uxid": "34de4a6d093e880f813b4dc466b51f6814923e157ffbba0e9abbc4bfbd938de8", + "owner": "2AsyTLyWNR3FGhaMbLckaJyAZN46mrqFfXA", + "coins": "1.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "3538af0016ec0f4d0e943c5d49daf280b416701fde4040fa72710c0ca1b5b559", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 15, + "block_hash": "3b452626e9d6ee1e10e8619fcfd546623ff42bea2053f3b413b719c501edd195", + "previous_block_hash": "89ab3029eaf4fb979e29dfba29b41ed1b8734f2991098879ac239b2ee4d61c04", + "timestamp": 1428820169, + "fee": 51, + "version": 0, + "tx_body_hash": "70dd5840d7260cf584457c76d3226312f4d033c023caf8c0ab3a65f9b831e9e0", + "ux_hash": "162569c321e9d7b1740490a856caec4556df25b5219ddbce1a3c6105158c53d4" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "70dd5840d7260cf584457c76d3226312f4d033c023caf8c0ab3a65f9b831e9e0", + "inner_hash": "4357c427cbc4b55139089389858dd8245464f674d4fff82e5daba9e18384a0b3", + "fee": 51, + "sigs": [ + "964c4b0c6cde6625863adebd74910851a440a636823dab9d0cf0fbc4581e3dcb486be22ba19d0c6d6eb17db22d1b1389589ec4b6cff8e8a9b231c66fe40c565500" + ], + "inputs": [ + { + "uxid": "0c5d1b6a61c32f9bcc62d3583ac957b3374f0daf1a14fd08679bff2554449840", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "75.000000", + "hours": 0, + "calculated_hours": 153 + } + ], + "outputs": [ + { + "uxid": "acd35cec566de86b4ed464b6cf3c3ec561140c070134d1e03094775454da2159", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "70.000000", + "hours": 102 + }, + { + "uxid": "4a06f4b59bc5626e6a92704b4e4441096e909b884eab84505699a3136abb69b3", + "dst": "PRXLNyB64cqaiG4pCoFZZ8Tuv7LWYPpa7m", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 16, + "block_hash": "4281345d031e0698c18e51f97aa78bbf05672b024209a296acb82ef62c15cf26", + "previous_block_hash": "3b452626e9d6ee1e10e8619fcfd546623ff42bea2053f3b413b719c501edd195", + "timestamp": 1428820629, + "fee": 0, + "version": 0, + "tx_body_hash": "e96e157b685c28847d6758e2ba326ad59cf2661c926fb08000d4b40d78a9eee3", + "ux_hash": "9be6e3e08898bb1dd9e22e3e46a69abd580bbeec7a27daa891ba795afe3cfdb7" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "e96e157b685c28847d6758e2ba326ad59cf2661c926fb08000d4b40d78a9eee3", + "inner_hash": "3153d35c8b133bc76ea6bef8799c9fbfd36a3cd3e8e42e170ab131eb309acea8", + "fee": 0, + "sigs": [ + "11813ce8ce2db73c23a8167696621443e0d80ec878d964d5164da33f259f55d17e5f1fc2292709542015c7bd86874ed855c0c80406a53a35759722d014a8c31300" + ], + "inputs": [ + { + "uxid": "4a06f4b59bc5626e6a92704b4e4441096e909b884eab84505699a3136abb69b3", + "owner": "PRXLNyB64cqaiG4pCoFZZ8Tuv7LWYPpa7m", + "coins": "5.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "e72d8ba4ce2d3b37aeb71df2e3bed80ee07204b3fa633f56cbce7bca836bd39c", + "dst": "PRXLNyB64cqaiG4pCoFZZ8Tuv7LWYPpa7m", + "coins": "3.000000", + "hours": 0 + }, + { + "uxid": "0b720d05d44354ff0c6c75d55f1cd4e5945bc2ca80f2ba840545205362202925", + "dst": "ZWhZtjwXMS46cpDxfRwQyxxKPhqwsQu8oN", + "coins": "2.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 17, + "block_hash": "eba02044b893c04609b8a6486a5cbc58bf98dbe8bb970ff9bc23c8cde95576da", + "previous_block_hash": "4281345d031e0698c18e51f97aa78bbf05672b024209a296acb82ef62c15cf26", + "timestamp": 1428989855, + "fee": 2020394, + "version": 0, + "tx_body_hash": "d952ef4cc45a89c14230ba0f7e30b782fad83cb6506ac0f503a242c568c1287a", + "ux_hash": "8a65d3fbb5226c9f26466ceecfb8343a5182d46d9088d0d73ac94eebce208a46" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "d952ef4cc45a89c14230ba0f7e30b782fad83cb6506ac0f503a242c568c1287a", + "inner_hash": "8fc48920982066fd4c69e2d2c0c5239cca7c296f0e3ad30e9b976c1230967478", + "fee": 2020394, + "sigs": [ + "b7eb93bcebb6df3dcad48afd66dd60bd42b1fbcdf52aa5e0c7e455e791f64a976fa416534b4e08bf3e62a2df83e13754119634c4255dd1e2e08be447d4d5b47201" + ], + "inputs": [ + { + "uxid": "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999890.000000", + "hours": 4073, + "calculated_hours": 6061184 + } + ], + "outputs": [ + { + "uxid": "4168b9378363cd81939e667cf78055d35a60d3101f5f9e3d2ae709e3981e29fc", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 4040790 + }, + { + "uxid": "c603e99ceae4d15c20360714ee07ba6e3a944a97ea9285d164c23252e93958b6", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 18, + "block_hash": "b2b1eb77b4bd3876b2cb33e97e436f2e66a9bc60e7221b6f2bfec19c0ca0fa63", + "previous_block_hash": "eba02044b893c04609b8a6486a5cbc58bf98dbe8bb970ff9bc23c8cde95576da", + "timestamp": 1428989925, + "fee": 0, + "version": 0, + "tx_body_hash": "686db0a8cd429970bb91163033703410d4750c86ba485709fe1a3faabbbb42f6", + "ux_hash": "178eb5802c1c8a49b0886009dde215b34ca386cd3794500d0e5695e0ddc5a139" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "686db0a8cd429970bb91163033703410d4750c86ba485709fe1a3faabbbb42f6", + "inner_hash": "76732ac6a9936242193011d78a0f2849529aee767a569c9c6bb25b3bbae15cee", + "fee": 0, + "sigs": [ + "d74dcfdc8401a29b1dccc728b40b6b79faea147c65b4a859063ad77cc63aa9a62417c63b91b94678b6656fdba2f242d836b6914e77d244fbd16aaab014ddb44300" + ], + "inputs": [ + { + "uxid": "c603e99ceae4d15c20360714ee07ba6e3a944a97ea9285d164c23252e93958b6", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "d9dae1f82177f979b07016a341ed5c281ed6ed8eaa785a8a107ec16efbe541ef", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 19, + "block_hash": "68d19da9e71cbe45ac65906d399e3be68591b26d05a4dff39e696ecec36f81f0", + "previous_block_hash": "b2b1eb77b4bd3876b2cb33e97e436f2e66a9bc60e7221b6f2bfec19c0ca0fa63", + "timestamp": 1428990115, + "fee": 1134, + "version": 0, + "tx_body_hash": "c6eccf17b4b952f19548b1924126c9dc409b45f9e6fcc0954a3494e7399f5fd4", + "ux_hash": "e4e2573c61942302d19d29f41de3894da2998a8dcd70379b053c0fb06929c8ae" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "c6eccf17b4b952f19548b1924126c9dc409b45f9e6fcc0954a3494e7399f5fd4", + "inner_hash": "736a1b4f415c1b0968470fac4d123ec52943b9d2ea7d2ce376307b2477a29acd", + "fee": 1134, + "sigs": [ + "3660a24958b1b20beabb7f77d2ee1ddd91f1e40e8393b48d5ed4722d97bd1430150c5ea0f8ea1a2688a0d9f336c9c1f78a214150cc1ca3d895a694edde65ac0700" + ], + "inputs": [ + { + "uxid": "acd35cec566de86b4ed464b6cf3c3ec561140c070134d1e03094775454da2159", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "70.000000", + "hours": 102, + "calculated_hours": 3402 + } + ], + "outputs": [ + { + "uxid": "af7deecc9b45c4696ad50246c8aa06b17aa8280b2574f295697a4210fc45f57d", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "65.000000", + "hours": 2268 + }, + { + "uxid": "b56517b7803a4b2cca522e1cca5f75894db174c97d0e127826f5414544eccb72", + "dst": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 20, + "block_hash": "ff403326d2bd8a047f65ffb4aff00e155d58aebf7feddcd91e290d694c0c5773", + "previous_block_hash": "68d19da9e71cbe45ac65906d399e3be68591b26d05a4dff39e696ecec36f81f0", + "timestamp": 1428990135, + "fee": 756, + "version": 0, + "tx_body_hash": "22766105d0f93d01fed7bed2dcabedfd89fe846621c912b0af845d8ba5d265f8", + "ux_hash": "3b1a3ef6e15819213a7187b8bc8d03577195f09f0213b205c132b5526a299dae" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "22766105d0f93d01fed7bed2dcabedfd89fe846621c912b0af845d8ba5d265f8", + "inner_hash": "3d516c76b1f147942f2237a2c07f9626624385fb858199ba63ec2d39112b6dfd", + "fee": 756, + "sigs": [ + "94e1b26e60d075536abd602ae88015f73ce638e49ec4e6be358cea8950853d0b4174aeeb0391ea05a9c62a6d37164c1fbab1d1ab53c9e2efd80ca4738ec3480e00" + ], + "inputs": [ + { + "uxid": "af7deecc9b45c4696ad50246c8aa06b17aa8280b2574f295697a4210fc45f57d", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "65.000000", + "hours": 2268, + "calculated_hours": 2268 + } + ], + "outputs": [ + { + "uxid": "ec9bbaf9309772ade9860f145705b9e9ee4a70ed1eeed1983d058ccaafd6c02c", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "60.000000", + "hours": 1512 + }, + { + "uxid": "e55a8d2ebe0f48f17a175fdd67d47deb5015b2ee8e91de16b2b121c8ad830e40", + "dst": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 21, + "block_hash": "7f3053b91f6e33a53f9bf7e908f8872b109462d1e2ee394f575bff805a31890a", + "previous_block_hash": "ff403326d2bd8a047f65ffb4aff00e155d58aebf7feddcd91e290d694c0c5773", + "timestamp": 1428991365, + "fee": 504, + "version": 0, + "tx_body_hash": "67f180076fed1599152c62337a12deee7e1a468b19f7e720df51415c28bfb986", + "ux_hash": "8564c5d554513f0213063e68c6f30940950bac9e4f7d149b0a75ce27fbe08dbf" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "67f180076fed1599152c62337a12deee7e1a468b19f7e720df51415c28bfb986", + "inner_hash": "1d676e397e50442c001f98385b525f8df39ef7189ebb0744cb3f868d8c96f00c", + "fee": 504, + "sigs": [ + "797c7987aab5c7a6a63eb06d514063a31b27beed8bfe22f15fbdf7b08c65702903d778d48e8cd027a9569c9973d0e52234977df7e0b9391967c913985ef860a700" + ], + "inputs": [ + { + "uxid": "ec9bbaf9309772ade9860f145705b9e9ee4a70ed1eeed1983d058ccaafd6c02c", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "60.000000", + "hours": 1512, + "calculated_hours": 1512 + } + ], + "outputs": [ + { + "uxid": "e3e95cd390c42d2f08e2c173135620e09c7a2ec1cf80ff75fbc3940fa5712b3c", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "55.000000", + "hours": 1008 + }, + { + "uxid": "1f4f952c6304e3991cf33519f1084921d50ecfd845edc48bd3b7b7229e28f2a6", + "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 22, + "block_hash": "357e1da88c19175600e9f071a6b4984f7ed2c0532f3678122fd8547e441cac74", + "previous_block_hash": "7f3053b91f6e33a53f9bf7e908f8872b109462d1e2ee394f575bff805a31890a", + "timestamp": 1428991585, + "fee": 0, + "version": 0, + "tx_body_hash": "c820bf59805b4889e59ce5fa320dcccfce5180de5f0f8baef7b391049ea8e286", + "ux_hash": "c0e9ab176138c41212fdfe67ff5bafdf1f847047be08bccb3fb6e86e7ba6ca98" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "c820bf59805b4889e59ce5fa320dcccfce5180de5f0f8baef7b391049ea8e286", + "inner_hash": "6fab8afaec00c1604f67fa7ecdfc968fa870662a46b714a88865e6b83ca555c3", + "fee": 0, + "sigs": [ + "0fafbcb51bcdf3e797059c26ec09574b9b02672453e31fdc5b8b5debc507dfe917208b33632e7905c9b02252a675b7bd22578686e2882277ac077af86fcaa49a00" + ], + "inputs": [ + { + "uxid": "1f4f952c6304e3991cf33519f1084921d50ecfd845edc48bd3b7b7229e28f2a6", + "owner": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "5.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "4c84a4bf9a1b1a3a53d8bf78e8823ca3135321089968068ac60da32083027846", + "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "4.000000", + "hours": 0 + }, + { + "uxid": "182b4c32bb5fe0e6809a19db63eecbeefde97a6c043b9248da94d428ab5a94c2", + "dst": "2bvEzLx4mgyQkYL5bkSc2rD9V1nqWBqn8vp", + "coins": "1.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 23, + "block_hash": "4e0f335204906a11c17ac9837ac911b33309e5c8466e9b05fd3c6010990da342", + "previous_block_hash": "357e1da88c19175600e9f071a6b4984f7ed2c0532f3678122fd8547e441cac74", + "timestamp": 1428991605, + "fee": 0, + "version": 0, + "tx_body_hash": "eb0a48072c5da37962c07d205a1843311f98e886cfcbdb2813359677f36bebc2", + "ux_hash": "87372b955f6c577e7b320721d6b0af7f4629c440ca109894ad873af5c5f48291" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "eb0a48072c5da37962c07d205a1843311f98e886cfcbdb2813359677f36bebc2", + "inner_hash": "104c51c380f54913954c2e16a8cf35dd585666a6e7b67116c05f490e06e5e1e1", + "fee": 0, + "sigs": [ + "6615ef5540b366a45895feeb91f16a5226d5022737e59ab1b9825843ff54dd7e281f2f014fc95641e3bc6ddda433b86e0c79d87a5b9b8b23fa5e234e5a41da1601" + ], + "inputs": [ + { + "uxid": "4c84a4bf9a1b1a3a53d8bf78e8823ca3135321089968068ac60da32083027846", + "owner": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "4.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "f3ce12886e74d6407f9580b47e72156a917083b66ebaa46263c7fde2df35116e", + "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "3.000000", + "hours": 0 + }, + { + "uxid": "20900f1d317e0b10ebab7190a34265f52783ff4f85675398b497ab8eb3723a3c", + "dst": "2bvEzLx4mgyQkYL5bkSc2rD9V1nqWBqn8vp", + "coins": "1.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 24, + "block_hash": "1de41dd34dac9a54143fdfb8cb59957cb0865bf2d7e17e4d7b44523ee87a2f54", + "previous_block_hash": "4e0f335204906a11c17ac9837ac911b33309e5c8466e9b05fd3c6010990da342", + "timestamp": 1428991635, + "fee": 0, + "version": 0, + "tx_body_hash": "f935cd91736604989c08448a2d83d6b044c3198ac1a7483a3b9846f8848a7d84", + "ux_hash": "8460866d61c0680981b655f485a26ce122dcdecc03c3a376a1877bb280303780" + }, + "body": { + "txns": [ + { + "length": 280, + "type": 0, + "txid": "f935cd91736604989c08448a2d83d6b044c3198ac1a7483a3b9846f8848a7d84", + "inner_hash": "02b721422fcadeb8c3217d9b972c81fe9042a32871a180fb1237e213a543cc9d", + "fee": 0, + "sigs": [ + "fa3ccaecf3a01525fd617fe74971ff2f7270e88f92f17a0f7748c1b258e007fd0fd10a582cc406d7806fd7794e20c4a3178b71cc1cb9f59c3c7d36a4e34d962100", + "23530a4d36d65cb37fc366a8c4a61d47dfd4fbf3b268bd66fd960bcff1b91db419d039049b8f816bedbd73d6baeaea77c5907c0df5b47724ad07420dd225cdaf01" + ], + "inputs": [ + { + "uxid": "182b4c32bb5fe0e6809a19db63eecbeefde97a6c043b9248da94d428ab5a94c2", + "owner": "2bvEzLx4mgyQkYL5bkSc2rD9V1nqWBqn8vp", + "coins": "1.000000", + "hours": 0, + "calculated_hours": 0 + }, + { + "uxid": "20900f1d317e0b10ebab7190a34265f52783ff4f85675398b497ab8eb3723a3c", + "owner": "2bvEzLx4mgyQkYL5bkSc2rD9V1nqWBqn8vp", + "coins": "1.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "fbe00b341f3e798c3e7e5eea04ffd8f3e70f0e78bc38f9a4927bae7eed6a1411", + "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "2.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 280 + }, + { + "header": { + "seq": 25, + "block_hash": "fadde28e30972cab6974572e6d19b6ecf367c126b3cff677731e33ceafde6c28", + "previous_block_hash": "1de41dd34dac9a54143fdfb8cb59957cb0865bf2d7e17e4d7b44523ee87a2f54", + "timestamp": 1428991665, + "fee": 0, + "version": 0, + "tx_body_hash": "917510897f5d8a018ad8d447876a15e2e1f68d42e71b6f75d89b02c4a599c537", + "ux_hash": "0da490050bc42511d86b8cfcf63172c24ec736ffd6595bce0d2df48596016869" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "917510897f5d8a018ad8d447876a15e2e1f68d42e71b6f75d89b02c4a599c537", + "inner_hash": "be34076fd999f7030f2a51866d641f8a783deb2204a9a93a8b64377a95546916", + "fee": 0, + "sigs": [ + "880b044ee5559510010d6d5cb4d7b50cb3e5323e5037daf3a048f3fab70254d34ff258aea85ec8ce264679bfb35df4590cd4dcaa527d89f9fb65fa50234dfc2e01" + ], + "inputs": [ + { + "uxid": "f3ce12886e74d6407f9580b47e72156a917083b66ebaa46263c7fde2df35116e", + "owner": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "3.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "f910d0e633735df5f041fdb7ffcb9cc8988b71c9375c52ababb54238be4d6852", + "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "1.000000", + "hours": 0 + }, + { + "uxid": "ebedac42a639f0d0a196b47676cb757b95046f0403f74baa5b15e98753ee2d58", + "dst": "2bvEzLx4mgyQkYL5bkSc2rD9V1nqWBqn8vp", + "coins": "2.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 26, + "block_hash": "5bba72f7f8eedda5ac16ee86f344e396172d57e0f32d8f90af68d05790590727", + "previous_block_hash": "fadde28e30972cab6974572e6d19b6ecf367c126b3cff677731e33ceafde6c28", + "timestamp": 1429011077, + "fee": 3407635, + "version": 0, + "tx_body_hash": "56e7bd13dc4c6e1cd80aba66a0a9fed650d0646659ac774e3f1b415848755d85", + "ux_hash": "51bdbf6235d29ffb41102b2eb33ca48a86c49be6e3d6c8f9b2becdb440b43f3d" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "56e7bd13dc4c6e1cd80aba66a0a9fed650d0646659ac774e3f1b415848755d85", + "inner_hash": "2894cfa31c21eb04c33f89263aa1e4caae625ceaf30539b82b39ccf79dffa816", + "fee": 3407635, + "sigs": [ + "6aedcd617e69aab9724b6a52e0e71f4f087a2fa84a283ac685c17e274b49cf617e58dbbd6c45a8e2c1c31832a1193ba119f0cb238fd83b9d7eb029dcedbeba0800", + "f1f26b84f247c409d308bf0992c2a044ce649fc09169d5fe4843f22b855f911d6c73b92f679346d30ec6663aa5d0387189935ce8e2f2256dd13e59cbdae7b89e00" + ], + "inputs": [ + { + "uxid": "4168b9378363cd81939e667cf78055d35a60d3101f5f9e3d2ae709e3981e29fc", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 4040790, + "calculated_hours": 4543507 + }, + { + "uxid": "d9dae1f82177f979b07016a341ed5c281ed6ed8eaa785a8a107ec16efbe541ef", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 4 + } + ], + "outputs": [ + { + "uxid": "8793a3782bf673393a8f909f267f3bfcc713b600460893b571fd55f675ac65ba", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 567938 + }, + { + "uxid": "339aeec109a26bab65e618d73ebba16e5b8fc18f7dc1fe502ca891ad5b0f4d5f", + "dst": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", + "coins": "10.000000", + "hours": 567938 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 27, + "block_hash": "ad03a81878334d1340e7304524bfda3eda386016170543605218cb7e580da2cc", + "previous_block_hash": "5bba72f7f8eedda5ac16ee86f344e396172d57e0f32d8f90af68d05790590727", + "timestamp": 1429011137, + "fee": 425954, + "version": 0, + "tx_body_hash": "cff53a059d55f2c90f6dd7ce7de2cc07cbdbd50b25867cba0f41cd0192614d0d", + "ux_hash": "c8d8839903bb3f82d6beb62accf60b505048fb587c62f4364031c815c9808f81" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "cff53a059d55f2c90f6dd7ce7de2cc07cbdbd50b25867cba0f41cd0192614d0d", + "inner_hash": "09382455a4e78c62bd0c254e106d349f648944c3747b066a23cc64d9392c6c05", + "fee": 425954, + "sigs": [ + "ade8874855f58653ef198e005a7ec82de992cddb50a4bb5ce8a0ec1cfa7b44086883ad1c85c63128dad5426b8b22873c349e0535191b80b3e92035b120cada7a01" + ], + "inputs": [ + { + "uxid": "8793a3782bf673393a8f909f267f3bfcc713b600460893b571fd55f675ac65ba", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 567938, + "calculated_hours": 567938 + } + ], + "outputs": [ + { + "uxid": "ad742bbc7420c08881e6ccf35e34e8472c0dd6386792359aedcfb752ca618c33", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999790.000000", + "hours": 70992 + }, + { + "uxid": "3e475e76c226a70c87d030d8fc6b8b1c2cc654ba9eaf3bed08be5bd603aec0b7", + "dst": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", + "coins": "90.000000", + "hours": 70992 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 28, + "block_hash": "1a6309d7463f89b08b1e89d6688a13e4901eb457aa48450fd4f5d85d93d4c2b3", + "previous_block_hash": "ad03a81878334d1340e7304524bfda3eda386016170543605218cb7e580da2cc", + "timestamp": 1429020387, + "fee": 214, + "version": 0, + "tx_body_hash": "f2f9926afcd29405327ddb772988a73dc13a67b1fcaa42ad98a416060e96adce", + "ux_hash": "3f71dfad629418433c00eaac3126d584daa269951e286790172c89eadc92a00c" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "f2f9926afcd29405327ddb772988a73dc13a67b1fcaa42ad98a416060e96adce", + "inner_hash": "1e46ec99a425796960a928a95b64be87b568d160c9533a5399d25141b60f74af", + "fee": 214, + "sigs": [ + "1b59327011b10a2896962898bafd8d587710fb6d99b1b565777e0713a8e5fa072f7f60043c9823d2bcfc589b283e99da90d0649c472199a683428b14bd75374301" + ], + "inputs": [ + { + "uxid": "778048daec0c83f89525a6d69b60c407d090bb1666711b1c560e6ebee8dcc452", + "owner": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "5.000000", + "hours": 0, + "calculated_hours": 284 + } + ], + "outputs": [ + { + "uxid": "92ae7cf57ad1363a60ce019818f7304040959329b6513f9a2d0f6b464bacafea", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "3.000000", + "hours": 35 + }, + { + "uxid": "7f44d7ef014419278137cbaa344cb550fc3c07355ec619d917bea3bc15fb8817", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "2.000000", + "hours": 35 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 29, + "block_hash": "75b035753c6099f478cdda4f3ac0001d2a3627280df12dd20207e229eac4daee", + "previous_block_hash": "1a6309d7463f89b08b1e89d6688a13e4901eb457aa48450fd4f5d85d93d4c2b3", + "timestamp": 1429020687, + "fee": 551, + "version": 0, + "tx_body_hash": "260d249883165aa9e59e17fb2bd8ba8995d2c3644993530985f8b813ed378650", + "ux_hash": "ad32a8a9357e41dac2a7a38e120862439441f8b78ef187c9b041b5fcd77aed1b" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "260d249883165aa9e59e17fb2bd8ba8995d2c3644993530985f8b813ed378650", + "inner_hash": "c5a9b2a4d2100d45a97a0131f3ffa79fbc4bb37b8969e8a1d5059055ca169c6c", + "fee": 551, + "sigs": [ + "661c14759218ac72f4b06ac96bce6db7e20cfae5f23643cc4dae2641893ca3686682cb1e3cc3f384afe549a87209e4104ed7d163af8af3be4762686719541e8900" + ], + "inputs": [ + { + "uxid": "98b3e6e6d4ed36159b7dbf5f305174fc0c255d2d97528b35a67d50b9968e2b2f", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 629 + } + ], + "outputs": [ + { + "uxid": "18ea1b3cceb2ca40c01efc8f3cfd7d1d0dd69430ecdf655515aa4f8b21bd2644", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 78 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 30, + "block_hash": "47695088da9067532b6733366f5b3379c9946721a0bba7dae98d697391a4546b", + "previous_block_hash": "75b035753c6099f478cdda4f3ac0001d2a3627280df12dd20207e229eac4daee", + "timestamp": 1429021044, + "fee": 31, + "version": 0, + "tx_body_hash": "044a75b1d3d273cae560ca43f9351d9acde206b0ad5578eb3adc2598886b5134", + "ux_hash": "18a38d48eba01d3bf392cfd7c92ae5a1f95d7bc0f91b26abcbb9fdfe11bbf581" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "044a75b1d3d273cae560ca43f9351d9acde206b0ad5578eb3adc2598886b5134", + "inner_hash": "61a1297a213a7642daf445350b49b2df9ccade45cc1498b91f80fceefcad5adf", + "fee": 31, + "sigs": [ + "ef33f4e1a053728e779296e912df149ad7e20167bd79ae88db24c52da558c6cc0dffaa3aeb9b4aa507865855f7172bb7ac72040dafb56bc2612d152d51e8008000" + ], + "inputs": [ + { + "uxid": "92ae7cf57ad1363a60ce019818f7304040959329b6513f9a2d0f6b464bacafea", + "owner": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "3.000000", + "hours": 35, + "calculated_hours": 35 + } + ], + "outputs": [ + { + "uxid": "61c61dfe5b82fde557a698b402c82ac0205929478e705cbadec7f5d47a51d403", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "3.000000", + "hours": 4 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 31, + "block_hash": "59770eade7313701b4470c4128cc418ecb5958675d71b7fbfb3cac38b3668741", + "previous_block_hash": "47695088da9067532b6733366f5b3379c9946721a0bba7dae98d697391a4546b", + "timestamp": 1429021184, + "fee": 60, + "version": 0, + "tx_body_hash": "9004c779cff67b3895500ec14b2c2e566127bb11a8af3358fe8a63dcfae9badc", + "ux_hash": "011f23d6473dfdf9802a866ec50b1a4d26984b97c3bc9152ce40a341c35db446" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "9004c779cff67b3895500ec14b2c2e566127bb11a8af3358fe8a63dcfae9badc", + "inner_hash": "9e1eed08b004316812f4ad574f3d0f96959b2a335cdda77113abfd1673a8859d", + "fee": 60, + "sigs": [ + "6b3a3b3374c641ca252ee32cceab1b37c4c395b411e4d2515bc51f2a8ec12b9c440d25dee1b94a0231dd9492ab3e07c7a5dc054a0da987d6bf0ba6fc8de6f42000" + ], + "inputs": [ + { + "uxid": "18ea1b3cceb2ca40c01efc8f3cfd7d1d0dd69430ecdf655515aa4f8b21bd2644", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 78, + "calculated_hours": 78 + } + ], + "outputs": [ + { + "uxid": "64194899d317e2a007f89df14538795547e927c242a92f83180e6cc952304964", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "5.000000", + "hours": 9 + }, + { + "uxid": "569aa1260e734017c4eee06d84ab4a6285e2ca2041940b2915d9141527caf179", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "5.000000", + "hours": 9 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 32, + "block_hash": "cf47f574509b704cf4fc7ed787de91cfd14e8e7fed745fab27db54311cd4a9d2", + "previous_block_hash": "59770eade7313701b4470c4128cc418ecb5958675d71b7fbfb3cac38b3668741", + "timestamp": 1429021214, + "fee": 8, + "version": 0, + "tx_body_hash": "327375203f20cb68847351c30a48597c0588a8c14319a4eb47bf440207fd045a", + "ux_hash": "ccf0002e9020c40441ac01fefb32ab5736833f82e5842473c2ddbe3db4f86418" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "327375203f20cb68847351c30a48597c0588a8c14319a4eb47bf440207fd045a", + "inner_hash": "217a070c0edd70fc0eaa7f858308444f32bbfe4b48e128b6fa876f60c4639bfb", + "fee": 8, + "sigs": [ + "de82c42e2523b512c0ffea3c91244dc905f59264f3c59e2f82efc3fdb7f446c728afb08bbc3478462cf25b96848da9dc4dd6b87cab569715ebd33e8102c552d101" + ], + "inputs": [ + { + "uxid": "64194899d317e2a007f89df14538795547e927c242a92f83180e6cc952304964", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "5.000000", + "hours": 9, + "calculated_hours": 9 + } + ], + "outputs": [ + { + "uxid": "eb446b8372559249c8e269b6cd028588e2e9e4f8fe9357719da9d1c22aa29911", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "5.000000", + "hours": 1 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 33, + "block_hash": "ab7c5b8eefedea15e05e0fcd52a01b3b87f009c4c9f53127272b8804d00bfd74", + "previous_block_hash": "cf47f574509b704cf4fc7ed787de91cfd14e8e7fed745fab27db54311cd4a9d2", + "timestamp": 1429021674, + "fee": 9, + "version": 0, + "tx_body_hash": "e89ee3e90e72108e4cd6ccb95c9f8d2b18ccfaa7ce61a7d297454debd69cebbf", + "ux_hash": "924f087d5681f12417a20ff9cfc7fc7d92f0e72a3cc75177c0d1194e76e61216" + }, + "body": { + "txns": [ + { + "length": 280, + "type": 0, + "txid": "e89ee3e90e72108e4cd6ccb95c9f8d2b18ccfaa7ce61a7d297454debd69cebbf", + "inner_hash": "dac67377dd9d8247db41f3380288730de2e51514ec3a2986072719553b9f9e27", + "fee": 9, + "sigs": [ + "7df848876a507f4b2855818f059e62e6d2f5924af148607a0c6004b7231fdce920ac80e800a833e55cbce9938b5d8cb755b0dc434c22b03a5037972ff2d6444801", + "6499aeee3ba19247d1ef2d3ec13e46031adf0dd6a383785272776a93621f21696cf217b7375e5721e51133fc3d9806200d2aded757118fbe27a719ebf4ceaea001" + ], + "inputs": [ + { + "uxid": "569aa1260e734017c4eee06d84ab4a6285e2ca2041940b2915d9141527caf179", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "5.000000", + "hours": 9, + "calculated_hours": 9 + }, + { + "uxid": "eb446b8372559249c8e269b6cd028588e2e9e4f8fe9357719da9d1c22aa29911", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "5.000000", + "hours": 1, + "calculated_hours": 1 + } + ], + "outputs": [ + { + "uxid": "e702df2703c3de180f3e4a0e9a503bd534037c2d68e858e97a317575c5a97d95", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 1 + } + ] + } + ] + }, + "size": 280 + }, + { + "header": { + "seq": 34, + "block_hash": "ffc59d36008eb3bae90c37e4942a884ab8a51c87370243ecab2f6ce4a45cbc87", + "previous_block_hash": "ab7c5b8eefedea15e05e0fcd52a01b3b87f009c4c9f53127272b8804d00bfd74", + "timestamp": 1429021994, + "fee": 1, + "version": 0, + "tx_body_hash": "08bf0f8f4a8547bcab1fef035adac2a66c80369b4485a736bdd676e782bbb037", + "ux_hash": "e75a837820ec1bf43a7fbab324c1eec1cefc436d65a12d2bdfd45ecd8c0b0a48" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "08bf0f8f4a8547bcab1fef035adac2a66c80369b4485a736bdd676e782bbb037", + "inner_hash": "8fd6f4e5428c170dede16e8c02596ab0c490dd5c418d003d9232d8c2caedec9c", + "fee": 1, + "sigs": [ + "f68d819dbda0bbf7cd5e2de8088267c5b3a744bbe2d7737c7dc52060b6344a25180cc1081e5c7dadab94763d158e303f697d1d275685b32bfd1de123a376697501" + ], + "inputs": [ + { + "uxid": "e702df2703c3de180f3e4a0e9a503bd534037c2d68e858e97a317575c5a97d95", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 1, + "calculated_hours": 1 + } + ], + "outputs": [ + { + "uxid": "10998e83dc5dfe3c3f5f28ef3e5e2fced4dbd1da389678b0ea3ddb552851b6bf", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "6.000000", + "hours": 0 + }, + { + "uxid": "41c6d29aa5de770de684ab19b40bd75b99ec7f1a5ff7d15288ae4bfff568eabd", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "4.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 35, + "block_hash": "18d0cf1ff691931a24fcf4b7870d68da6487f3f4595cbf68df854da2972d919f", + "previous_block_hash": "ffc59d36008eb3bae90c37e4942a884ab8a51c87370243ecab2f6ce4a45cbc87", + "timestamp": 1429022034, + "fee": 0, + "version": 0, + "tx_body_hash": "3170f0635cc40aded3a38f84f2ae07bd2238550ea4ee867328d0f891ea9abf14", + "ux_hash": "55d2c6ea4d79cd339b7c76d630333f75cc62dd224357ff78ed43066dff854fb3" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "3170f0635cc40aded3a38f84f2ae07bd2238550ea4ee867328d0f891ea9abf14", + "inner_hash": "1cebcd96c2847d219b658733012921d6e10a6c55439736833dd0ae97b898f72a", + "fee": 0, + "sigs": [ + "179826a9f244005b2b34d145948b178533805953adff8ab924a6fd67538daaa4384d67a24473de6bb01d441e4d979e520b055cd9304188d00255eab7c04bf45701" + ], + "inputs": [ + { + "uxid": "10998e83dc5dfe3c3f5f28ef3e5e2fced4dbd1da389678b0ea3ddb552851b6bf", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "6.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "9e5779445f60d62b471862339d7a83dd8355c7a89d5fc3b751f98e9414628ec2", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "6.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 36, + "block_hash": "e2fb290dd1103f2fa0ed51279d0a1d4631c0535a6e9abf95d94cabab485f8d2b", + "previous_block_hash": "18d0cf1ff691931a24fcf4b7870d68da6487f3f4595cbf68df854da2972d919f", + "timestamp": 1429022064, + "fee": 0, + "version": 0, + "tx_body_hash": "fba515a9eeaedb891c4dca862bd06108e0452270890b362f0b353b4c86845618", + "ux_hash": "3f5d59f0677d598dbe7c5e4415ae99a50be414c2e831198cdf09fbeb00b47798" + }, + "body": { + "txns": [ + { + "length": 280, + "type": 0, + "txid": "fba515a9eeaedb891c4dca862bd06108e0452270890b362f0b353b4c86845618", + "inner_hash": "3c24f665a7a02308fe6938ef3ce7e38dfe72644b1d71c5aefbe3d6844c609d58", + "fee": 0, + "sigs": [ + "faf14290ac158576f0dd4311ee4835a2542ae8b52d9ec7ab36d1af938a117f382c42855dec9b980f282e7ff8d7e19d469b084a7d44e38022e246c365368cc07d00", + "52cfd88d334818382413dfa45dd8e00a2136c352b7547dcf97894bf3eaa152cc5b10bf9f35c4dc8c75e7bb62543bd244a7c1de588b2a606aa1eb0b32c9c4ca1501" + ], + "inputs": [ + { + "uxid": "41c6d29aa5de770de684ab19b40bd75b99ec7f1a5ff7d15288ae4bfff568eabd", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "4.000000", + "hours": 0, + "calculated_hours": 0 + }, + { + "uxid": "9e5779445f60d62b471862339d7a83dd8355c7a89d5fc3b751f98e9414628ec2", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "6.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "d46e91fea3c8a6428885f941e5152dbc7f9abd356ad4d054bf20e0e806f1ec99", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 280 + }, + { + "header": { + "seq": 37, + "block_hash": "87ea823bf69a2e24b92fda4b8150d1318df8fde8f4443354df604e76b497d7a0", + "previous_block_hash": "e2fb290dd1103f2fa0ed51279d0a1d4631c0535a6e9abf95d94cabab485f8d2b", + "timestamp": 1429022094, + "fee": 0, + "version": 0, + "tx_body_hash": "9fb039cd90a4e9b85669bd6ef878b98a9e84eec7d4804e2bff6f0dc9c2739c44", + "ux_hash": "9741ded2fb1b032ac1f5a914e4763508a5a8debfa3e3c1309770696ed4119d39" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "9fb039cd90a4e9b85669bd6ef878b98a9e84eec7d4804e2bff6f0dc9c2739c44", + "inner_hash": "5bc5636489d4ba7d36b4429cd3ec71491c9fa6f442fede1ea696428b574e0d13", + "fee": 0, + "sigs": [ + "3127749c2123db967563b9726cf5d6daa3ae755ec74f5e5fbc3dcfb10ececc231f5d61de693355aa5c8ade13c4c31ddc3bf9864e87139fdcd64c513702f7425600" + ], + "inputs": [ + { + "uxid": "d46e91fea3c8a6428885f941e5152dbc7f9abd356ad4d054bf20e0e806f1ec99", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "2987e7c89d353ad5d63cea2bf2724dc5f7a5ef5fb81f5ea160a307f0726ac2f5", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 38, + "block_hash": "812d40f14869b362f41859db216ade292a60db6f3d567e308e08fbd07b032892", + "previous_block_hash": "87ea823bf69a2e24b92fda4b8150d1318df8fde8f4443354df604e76b497d7a0", + "timestamp": 1429058484, + "fee": 2335473, + "version": 0, + "tx_body_hash": "a76cd63b71f1f5425941cd567627e1dcdc8c34306a7945ea48755f5a46efb6f5", + "ux_hash": "92ad4d294c00edfa740be4a8bcd37c0986e5c8dacf8504eaa8aad37661030eb9" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "a76cd63b71f1f5425941cd567627e1dcdc8c34306a7945ea48755f5a46efb6f5", + "inner_hash": "39c3ed7f2dfb26d02c9fcbbe853db5c3031644b4a66844a717d8795c6d954d65", + "fee": 2335473, + "sigs": [ + "844af158e935a38f034778a78b646a167b5758df65212546f2eb1c7e838216ad7aa6e7571d1e81d8836808d4315846fe97489bdf2e6d2159a2af77a15a9a2bcb00" + ], + "inputs": [ + { + "uxid": "ad742bbc7420c08881e6ccf35e34e8472c0dd6386792359aedcfb752ca618c33", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999790.000000", + "hours": 70992, + "calculated_hours": 3113963 + } + ], + "outputs": [ + { + "uxid": "108520145179c00f581d91e273714811fe6e82ee059d65218eea91154ebd8205", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "998790.000000", + "hours": 389245 + }, + { + "uxid": "f48432d381a10abecbd1357d81705ea922246e92170fe405d1a4a35c5ceef6a4", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "1000.000000", + "hours": 389245 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 39, + "block_hash": "08a109060182ac50db40931ddfbafe8733a0817f1b0dcd83ac692d466c48a1e1", + "previous_block_hash": "812d40f14869b362f41859db216ade292a60db6f3d567e308e08fbd07b032892", + "timestamp": 1429058494, + "fee": 291935, + "version": 0, + "tx_body_hash": "c38b47bd576e3bced2a9309c3df7622064e71177f54020d77193d5cac310719c", + "ux_hash": "4fb04fb3ff93092a37bebaa62d5b2a3676d801268a86e184ba19a55e8d101df3" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "c38b47bd576e3bced2a9309c3df7622064e71177f54020d77193d5cac310719c", + "inner_hash": "7f02ba6476946668f3adcbb35e113531e6788cee4fe94bf8d8da4803e3baa7e3", + "fee": 291935, + "sigs": [ + "2a31eb55da895c59654ad3f1a11efa11b04787ab78dcf8221aeeccf137adec543765f761363390c97f429310fcb39db305494a94b30af906a2d43d5de1effbb701" + ], + "inputs": [ + { + "uxid": "108520145179c00f581d91e273714811fe6e82ee059d65218eea91154ebd8205", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "998790.000000", + "hours": 389245, + "calculated_hours": 389245 + } + ], + "outputs": [ + { + "uxid": "e79c94aa7013c7611901839236b8a1cdf70e8ef7c40b9e33f99359136de981d6", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "988790.000000", + "hours": 48655 + }, + { + "uxid": "df5d6e09da2585a6ac1a37aea2370fa25e9049b549049202d5417138bf033cfa", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "10000.000000", + "hours": 48655 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 40, + "block_hash": "fad5aca57144cbc86ad916492e814ec84c825d9870a86beac81980de30b0ae60", + "previous_block_hash": "08a109060182ac50db40931ddfbafe8733a0817f1b0dcd83ac692d466c48a1e1", + "timestamp": 1429058514, + "fee": 36493, + "version": 0, + "tx_body_hash": "b56f3e9239da5c5f9bb5ca80226b8454ba36ce6012f8e323a50c9d9c4eb4a834", + "ux_hash": "9e0f4fdc945df9ffcd31adbaddd5469c9ff39b297308fc76469af04bd8349080" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "b56f3e9239da5c5f9bb5ca80226b8454ba36ce6012f8e323a50c9d9c4eb4a834", + "inner_hash": "bdcf8f2f2b960cfee6b3b1124a554ef4747fe43ac9452d897bd8dedcd643e1ae", + "fee": 36493, + "sigs": [ + "809029f12d5f38906306610feae26c0623bffe63218c8019060ae2d164cc29352066efd20567e3c37837230e74b481730b0fc71bcafe3b3b9f5eb4a7fb42f69101" + ], + "inputs": [ + { + "uxid": "e79c94aa7013c7611901839236b8a1cdf70e8ef7c40b9e33f99359136de981d6", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "988790.000000", + "hours": 48655, + "calculated_hours": 48655 + } + ], + "outputs": [ + { + "uxid": "c65a9e6aa33244958e9595e9eceed678f9f17761753bf77000c5474f7696da53", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "978790.000000", + "hours": 6081 + }, + { + "uxid": "f8ad5c72e7822c7ac9a1dce8de583e34f6f830052bc0a02d749e9e81790dae86", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "10000.000000", + "hours": 6081 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 41, + "block_hash": "08f89cfe92be09e9848ba4d77c300908761354933f80401c107644feab1f4c9e", + "previous_block_hash": "fad5aca57144cbc86ad916492e814ec84c825d9870a86beac81980de30b0ae60", + "timestamp": 1429058524, + "fee": 4561, + "version": 0, + "tx_body_hash": "cf4fe76a08e3296b6f6abdb949604409be66574f211d9d14fde39103c4cfe1d6", + "ux_hash": "d3f60f0d20aeac951aacab8d849696cac54c7057da741cfd90b63018100818d0" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "cf4fe76a08e3296b6f6abdb949604409be66574f211d9d14fde39103c4cfe1d6", + "inner_hash": "2f5942207104d52dbd6191684b2a97392e616b7fa51dde314dbddd58d34b8027", + "fee": 4561, + "sigs": [ + "b2b8c8ec1e1dfdeac4690e88d4ef9fcc4b52fcb771153f391cbcb58d651505a94c6263b6dc15a948c0396c0d8be20d9e0d1993b494bd9189c778d3673363bfc401" + ], + "inputs": [ + { + "uxid": "c65a9e6aa33244958e9595e9eceed678f9f17761753bf77000c5474f7696da53", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "978790.000000", + "hours": 6081, + "calculated_hours": 6081 + } + ], + "outputs": [ + { + "uxid": "195f5e50b4eed1ec7ff968feca90356285437adc8ccfcf6623b55a4eebf7bbb5", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "969790.000000", + "hours": 760 + }, + { + "uxid": "6bbf13da052e1baade111ae8bb85548732532c8f5286eba8345d436d315d1c93", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "9000.000000", + "hours": 760 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 42, + "block_hash": "60a17e0cf411e5db7150272e597d343beaa5fbce5d61f6f647a14288262593b1", + "previous_block_hash": "08f89cfe92be09e9848ba4d77c300908761354933f80401c107644feab1f4c9e", + "timestamp": 1429058594, + "fee": 292512, + "version": 0, + "tx_body_hash": "0e91a08561e85a36ddf44e77b9228f7d561c18c0b46d19083d4af511085b697e", + "ux_hash": "9173768496bc49e2a34d5a7ea65d05ad6507dfdb489836e861b3c03d35efeb7a" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "0e91a08561e85a36ddf44e77b9228f7d561c18c0b46d19083d4af511085b697e", + "inner_hash": "d78230e22b358d7cc8d491adb3c0ec1e77a5170602a4ec92d700c4b4bb101f98", + "fee": 292512, + "sigs": [ + "17ba9c495e4d396a37eaf062e1806a13b3bdc91a83151c2455cf948a7e6d91882dc02ec6443970517f0f7daf59ce9b89658a17f5d51c0cbc18056811d0f3006501", + "e4e8f28801fe461cc8097b29cfe1307739bdfbdd6b20c31e04eef89aede641a6407fa0c41b0ad5ef167e3255e1916c0bbd358ffd70f34dc7944ffe67514bc5f501" + ], + "inputs": [ + { + "uxid": "f48432d381a10abecbd1357d81705ea922246e92170fe405d1a4a35c5ceef6a4", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "1000.000000", + "hours": 389245, + "calculated_hours": 389256 + }, + { + "uxid": "6bbf13da052e1baade111ae8bb85548732532c8f5286eba8345d436d315d1c93", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "9000.000000", + "hours": 760, + "calculated_hours": 760 + } + ], + "outputs": [ + { + "uxid": "19efa2bd8c59623a092612c511fb66333e2049a57d546269c19255852056fead", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "9000.000000", + "hours": 48752 + }, + { + "uxid": "9953e00abe05db134510693a44b8928ca9b29d0009b38d9c4f8dcdedee7edc35", + "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "1000.000000", + "hours": 48752 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 43, + "block_hash": "b98060fcb099ad4dcb6c5f7654bcad99be31375a72a2d30b4e90af4597091149", + "previous_block_hash": "60a17e0cf411e5db7150272e597d343beaa5fbce5d61f6f647a14288262593b1", + "timestamp": 1429070374, + "fee": 1596, + "version": 0, + "tx_body_hash": "d368fc3112b522c52a5b191981ca52678cc7db29bdc3493cf551be88d109ef9c", + "ux_hash": "46d8cf99e912e732164aa7910ab409e056f7190492d00075499d77dbb8108f94" + }, + "body": { + "txns": [ + { + "length": 414, + "type": 0, + "txid": "d368fc3112b522c52a5b191981ca52678cc7db29bdc3493cf551be88d109ef9c", + "inner_hash": "acb0cc7def6ebcfd45b1490aa60d6cb84fc3621bf34be5ab84910a1929efccf5", + "fee": 1596, + "sigs": [ + "9d1fcf32769b70f2eeb88b70434010c5ac5844031d85c515f7854b0aa5b91de7035f4fa3802ebcc6a7e064b4ebf16be5b1ed9a85b31bbb46ceb11694e14648eb00", + "40303be55ccfaef337b8810405d522c2a32a4d86acc5e474626666f3999533b55a33c546b04472e3d10a7870e0435968ce88ac7fbea6fecb8617a680957752ce01", + "3c1d5a5e076cb1274fb478c6c3bd4e0f724106f71edbd16eed7e2b13aabb69a53f7e91df5af8c611ffd2ca9114cd4d4be7df70ccf541606c781af41f986ea51700" + ], + "inputs": [ + { + "uxid": "e3e95cd390c42d2f08e2c173135620e09c7a2ec1cf80ff75fbc3940fa5712b3c", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "55.000000", + "hours": 1008, + "calculated_hours": 2035 + }, + { + "uxid": "7f44d7ef014419278137cbaa344cb550fc3c07355ec619d917bea3bc15fb8817", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "2.000000", + "hours": 35, + "calculated_hours": 56 + }, + { + "uxid": "61c61dfe5b82fde557a698b402c82ac0205929478e705cbadec7f5d47a51d403", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "3.000000", + "hours": 4, + "calculated_hours": 35 + } + ], + "outputs": [ + { + "uxid": "88162721a552b1422546024772fc822faa187e897754e0a579e5e4a92a7cf4c9", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "55.000000", + "hours": 265 + }, + { + "uxid": "e64fa1f60e905f1d7b7a8f0ca134ab2b7a467f7363ec9c03628d559e1230eb68", + "dst": "2apVG7f24ezDK13yCDTqBWYrTZpuj94KnCN", + "coins": "5.000000", + "hours": 265 + } + ] + } + ] + }, + "size": 414 + }, + { + "header": { + "seq": 44, + "block_hash": "9fd770857cc65c7d7865a318ea1f6df00a9b589937e2c583188f9301c96f2f7f", + "previous_block_hash": "b98060fcb099ad4dcb6c5f7654bcad99be31375a72a2d30b4e90af4597091149", + "timestamp": 1429070414, + "fee": 199, + "version": 0, + "tx_body_hash": "ced30c4ac3107997efa90faa40c8baed47dafc8ddb4feae3ba21275401c36280", + "ux_hash": "5a8a9e30aa37f987b7f3fe0ae6c6048585b168ffacc602392d6d3855bf2cf64e" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "ced30c4ac3107997efa90faa40c8baed47dafc8ddb4feae3ba21275401c36280", + "inner_hash": "f3a57ef9c95bf41b758b317169e29596448640aad207b88a21b45b1ea46e9a99", + "fee": 199, + "sigs": [ + "fa16091cb778d496199d0b59f934d38891ff0b3aad42be78565a4f5a9880b9063a8e423fa7dacc624e0ffb01931bbdf4bed0fef8044f9280c8cd562b2f3bb0bd00" + ], + "inputs": [ + { + "uxid": "88162721a552b1422546024772fc822faa187e897754e0a579e5e4a92a7cf4c9", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "55.000000", + "hours": 265, + "calculated_hours": 265 + } + ], + "outputs": [ + { + "uxid": "73ad63090201c13e6fb55d2e51ec5606fe49a40640bea995e347e7389fcea6c6", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "50.000000", + "hours": 33 + }, + { + "uxid": "85fcb22c416b7d430076bb80a324734cb97483cb4544192df252b89ba8f7fd61", + "dst": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "5.000000", + "hours": 33 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 45, + "block_hash": "90a6673c7f7c70884c2ff52a40f6b1de2d0e5e9f763787c7467d6f27d968f187", + "previous_block_hash": "9fd770857cc65c7d7865a318ea1f6df00a9b589937e2c583188f9301c96f2f7f", + "timestamp": 1429071074, + "fee": 2402820, + "version": 0, + "tx_body_hash": "df622e8c9dfaed1d7dca83ad7f6d8946bb86b81398bad521d858cbefef8e4688", + "ux_hash": "ad85d15310a5086ec9f2c9478a540fa5e3d23298f2f2124a5142ae089b4bd567" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "df622e8c9dfaed1d7dca83ad7f6d8946bb86b81398bad521d858cbefef8e4688", + "inner_hash": "91ab4f29d84e9ffba56a108e01984e7b483729da4e61b6976c018fa11ace36a8", + "fee": 2402820, + "sigs": [ + "d0726d81cb1cdce6028668d0d95ceccf39cc9d655a7bff143573b9f52d0586232bbb7bd494df8b9bb5155a271446cfaff1550d5ccf314dd35f044226f98d14e201" + ], + "inputs": [ + { + "uxid": "195f5e50b4eed1ec7ff968feca90356285437adc8ccfcf6623b55a4eebf7bbb5", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "969790.000000", + "hours": 760, + "calculated_hours": 3203760 + } + ], + "outputs": [ + { + "uxid": "cb8efc0b1082c39258cb6efd59f64d88b36fcb60143c826829fc5f0ed5c0d668", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944790.000000", + "hours": 400470 + }, + { + "uxid": "4aca4c715985da352bd9aa84787868dac4f4e305c420fe79e6f05acee3bba14a", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "25000.000000", + "hours": 400470 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 46, + "block_hash": "9ac2b1b1d2a7ea6bbc6049f174ba1d82e7bc381438fddad5868d0b2554389aa6", + "previous_block_hash": "90a6673c7f7c70884c2ff52a40f6b1de2d0e5e9f763787c7467d6f27d968f187", + "timestamp": 1429077374, + "fee": 300354, + "version": 0, + "tx_body_hash": "0a2da0489b14156fad8fb863d051a4dac1f645f144c1e5bb65a44478623b8e4b", + "ux_hash": "d444545422cfd535553abee015965d916ad0a9f3e6446222a2c5c248343dec1c" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "0a2da0489b14156fad8fb863d051a4dac1f645f144c1e5bb65a44478623b8e4b", + "inner_hash": "787ae7cb222a23641bb33751d1428dc8e07a2f2cf11ee6293a54100836209d09", + "fee": 300354, + "sigs": [ + "9bc3b6d7cb1d66d52fc993d0799baafa1056992049fa86ce76d5909690e88c4a19920b69e2463cf34d1dddb545b61ee38fb2f9b33f92626da8afdd934c353c8e00" + ], + "inputs": [ + { + "uxid": "cb8efc0b1082c39258cb6efd59f64d88b36fcb60143c826829fc5f0ed5c0d668", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944790.000000", + "hours": 400470, + "calculated_hours": 400470 + } + ], + "outputs": [ + { + "uxid": "a6061defc41a8a55e37eaf56ebaa1177446f61719b1d5126698e79a6023f5367", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944780.000000", + "hours": 50058 + }, + { + "uxid": "a52408daa8ce7026c70b61d4df4212fb577462060f340bfce779225b3e18193d", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 50058 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 47, + "block_hash": "5709133095b892fee42c20c0b1264e923a0abf75f752768824d86f76d08d9280", + "previous_block_hash": "9ac2b1b1d2a7ea6bbc6049f174ba1d82e7bc381438fddad5868d0b2554389aa6", + "timestamp": 1429077384, + "fee": 37544, + "version": 0, + "tx_body_hash": "a4a202bc4431d95c307d151dea764bfc6d9ceb7e82b3eb50dc8604050622a22c", + "ux_hash": "68ade91c1b0a98b80fbdbb5829a75e95ea2e4a97776883b4576a245bfce271a5" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "a4a202bc4431d95c307d151dea764bfc6d9ceb7e82b3eb50dc8604050622a22c", + "inner_hash": "836145a3e62a7e055acc3404c1fd6ecb237e3251e6f8b39fd526a7f48f21daa8", + "fee": 37544, + "sigs": [ + "f826793e63a3b0b837070e8876461c47af6be7a6898c370c70430b1491457cda76fc3b34e08bff41a336277ec1e93cc008f9c08ca295b418488b1ac92a5f5a4000" + ], + "inputs": [ + { + "uxid": "a6061defc41a8a55e37eaf56ebaa1177446f61719b1d5126698e79a6023f5367", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944780.000000", + "hours": 50058, + "calculated_hours": 50058 + } + ], + "outputs": [ + { + "uxid": "3b5f72e772ea886dd872b9087395398133576a6561072d5294fbcd04b49e1d95", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944770.000000", + "hours": 6257 + }, + { + "uxid": "dc73aac74348dd285a1456c1fae2204d7c2039d50a765bdaae0c31f7c7e059db", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 6257 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 48, + "block_hash": "aced5a17671fa788542d5c6d5bd1ff8b65714c77a463eeb788e2eb459d710aaf", + "previous_block_hash": "5709133095b892fee42c20c0b1264e923a0abf75f752768824d86f76d08d9280", + "timestamp": 1429077394, + "fee": 4693, + "version": 0, + "tx_body_hash": "4e6b363423633ad51114b250478ee7645fbd184066fa41c29e5b14d0728cdfec", + "ux_hash": "bf2c980d37c36e3a6d1179a698d43ef1d659c438bba0c84b3b09518a94a8a706" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "4e6b363423633ad51114b250478ee7645fbd184066fa41c29e5b14d0728cdfec", + "inner_hash": "8cf88a9e5140d5e01af412c956b3de7c93bfebbb4c5993b9b0285812208f5b33", + "fee": 4693, + "sigs": [ + "670abb369c25a655b0f22c069a9523d439b8a03d122bc9f0861aff796ab965fd5e1b79812b6f458ebc0a1cd4cc223d0137eb22e1bf1cbb40265ac7301018897000" + ], + "inputs": [ + { + "uxid": "3b5f72e772ea886dd872b9087395398133576a6561072d5294fbcd04b49e1d95", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944770.000000", + "hours": 6257, + "calculated_hours": 6257 + } + ], + "outputs": [ + { + "uxid": "f265bea876ffcfb8cf64df3aca4dae4a8d7f424ff495d91fb322feddb3a7e505", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944760.000000", + "hours": 782 + }, + { + "uxid": "e4e375b9dc55ff53d6de9120f1a87ff00e00a779835f8320f2c6b3090d0466e6", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 782 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 49, + "block_hash": "e74d6630120b2c1f57a7176ef763246609165c33b8974fa29fad95c9654d894f", + "previous_block_hash": "aced5a17671fa788542d5c6d5bd1ff8b65714c77a463eeb788e2eb459d710aaf", + "timestamp": 1429077404, + "fee": 588, + "version": 0, + "tx_body_hash": "edc27c6ecc1f76d0f23489ad7bbbdb8c653af37cc4b8f18197400aea2011ed83", + "ux_hash": "b705b08e59a5ec4ae59f16940fa182f83326ab7278809e25c2094ef2202e3992" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "edc27c6ecc1f76d0f23489ad7bbbdb8c653af37cc4b8f18197400aea2011ed83", + "inner_hash": "5432e686f984075091a8d3686d959b63ef620382fcb2b86794ba8dc0fb9656e7", + "fee": 588, + "sigs": [ + "c1902b37a95c5327b0e5a1f05de551d4135831b787c86562867344ee7f06235374dc1618c6b4a8e077041723bc731db72dab5554a808b1ba77d305309144bf5e01" + ], + "inputs": [ + { + "uxid": "f265bea876ffcfb8cf64df3aca4dae4a8d7f424ff495d91fb322feddb3a7e505", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944760.000000", + "hours": 782, + "calculated_hours": 782 + } + ], + "outputs": [ + { + "uxid": "e6d9b56e075a6adf520d1ae7fbab9ae06353ae0b93dc8cb17d82cc3628009a50", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944750.000000", + "hours": 97 + }, + { + "uxid": "d11b05345917d171f60c31bd2634041b73b97eae364724369ddb8d53369397fb", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 97 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 50, + "block_hash": "96d249272364547bf1bb6626b99568415384db2bffa0a45c721a62cae6e76ceb", + "previous_block_hash": "e74d6630120b2c1f57a7176ef763246609165c33b8974fa29fad95c9654d894f", + "timestamp": 1429077474, + "fee": 71833, + "version": 0, + "tx_body_hash": "be27621ad46680b343cc1406f5c6a1717704ce169e988ed7afb586f8112ae6f0", + "ux_hash": "589b1ba02530656309a8dddec9b9450d16e4b5b2c8b64708ba0a8b453c5b0b5e" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "be27621ad46680b343cc1406f5c6a1717704ce169e988ed7afb586f8112ae6f0", + "inner_hash": "158b0ca1e5055c4abb6729eeb187d9fc592c425c8f1eaf07c3d64e17e1d1615d", + "fee": 71833, + "sigs": [ + "3624a41ca94d80e7f13ea09f3acdfd701b9425af1a43c62e08a98744f31c651b1f9d2183c35f64aea01431e1c0c3a12d2f63d2c88ff9bd1a124b895a4bfabc6b01" + ], + "inputs": [ + { + "uxid": "19efa2bd8c59623a092612c511fb66333e2049a57d546269c19255852056fead", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "9000.000000", + "hours": 48752, + "calculated_hours": 95777 + } + ], + "outputs": [ + { + "uxid": "5fa90c22a26ecec8c03696a018b590a5e1679efa9cb5e8263facf9bcc6628db6", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "8000.000000", + "hours": 11972 + }, + { + "uxid": "5afa88b6a9ef9168d15d9a0bbc87dd5ab30badc01773460f92703a9c829358c0", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "1000.000000", + "hours": 11972 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 51, + "block_hash": "616d09296fd9dfa108d859a8fc5042252e1a9b88277df2e5adef2336559b52f5", + "previous_block_hash": "96d249272364547bf1bb6626b99568415384db2bffa0a45c721a62cae6e76ceb", + "timestamp": 1429077484, + "fee": 44061, + "version": 0, + "tx_body_hash": "814694a8e32f1c81b627f8eb704622c8893d197bf32bbd7e1bf73bec9a831d7d", + "ux_hash": "f893ff5304a0ad87aec6345e962bb6648411b2b0dfad95940725b676f4e558cd" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "814694a8e32f1c81b627f8eb704622c8893d197bf32bbd7e1bf73bec9a831d7d", + "inner_hash": "10daee0ac47006149435adf9655dbc8796eece3d075f93af9810b204f90003ab", + "fee": 44061, + "sigs": [ + "9cfad1cc126d0b33d6e44b5cf99672c0bbb088dd2ed01090365292d4ba1c188f18772aacbc7931e81202c11d7eb977a8f00bae86ce5b40479482bbbd883dfcaf01" + ], + "inputs": [ + { + "uxid": "f8ad5c72e7822c7ac9a1dce8de583e34f6f830052bc0a02d749e9e81790dae86", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "10000.000000", + "hours": 6081, + "calculated_hours": 58747 + } + ], + "outputs": [ + { + "uxid": "f37efd851f76854852fdb8b8ba9afa2c5b7859315cc1fd12c12bf6831c59beb2", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "9000.000000", + "hours": 7343 + }, + { + "uxid": "2f4daff744e7fd81ceea34ecfb0e383a65ecda1c55f32a0bef313d29b0795eab", + "dst": "2acnXsnJ2k8jxiUahtBe8h4xouPAnpbwwjc", + "coins": "1000.000000", + "hours": 7343 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 52, + "block_hash": "8536b8ff98e646a4a56c5a1a6a8ab72a41a48b72dea6fb35748e5dd4ee8e2e0d", + "previous_block_hash": "616d09296fd9dfa108d859a8fc5042252e1a9b88277df2e5adef2336559b52f5", + "timestamp": 1429077494, + "fee": 8996, + "version": 0, + "tx_body_hash": "231254039042675300dbdd61a6ca54941214e383b5f6380323f848482b4f4628", + "ux_hash": "3241684b9e1c9b5d244b302446b9f947097a312397c04e59bc10ce01212e533d" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "231254039042675300dbdd61a6ca54941214e383b5f6380323f848482b4f4628", + "inner_hash": "ddddc962f9ad468e32f141dcf8479e2ec2293d42a32b2085fbaa0b5e9f80a267", + "fee": 8996, + "sigs": [ + "7cb704180d085d04db6816852111cf3dad3c911337af4e22596c42efe77a45983539abe92b0f08993559f87ac2e4ddb907e46c36c6a746920f2fd0c89b0b7fc201" + ], + "inputs": [ + { + "uxid": "5fa90c22a26ecec8c03696a018b590a5e1679efa9cb5e8263facf9bcc6628db6", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "8000.000000", + "hours": 11972, + "calculated_hours": 11994 + } + ], + "outputs": [ + { + "uxid": "e4fa8fe06d04bb438323f295eea23535856be08b369be71a2ce3e9e7bc0b1e09", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "7000.000000", + "hours": 1499 + }, + { + "uxid": "cec910b5d672e216db306389dc9ebb08f9d37485fbc3ac6aa7a8c37f60be844c", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 1499 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 53, + "block_hash": "a8f4e293af2cec10febbd7b632c8ed15477cae6dfd98060d007fc2538a4d2b39", + "previous_block_hash": "8536b8ff98e646a4a56c5a1a6a8ab72a41a48b72dea6fb35748e5dd4ee8e2e0d", + "timestamp": 1429077514, + "fee": 17787, + "version": 0, + "tx_body_hash": "d154d8262abbf517c67d529b0fea7cdf097433bd296d5795b17c6379cb1b1430", + "ux_hash": "84e514782cf16533fd2794f2f58b184ca4e4e3459ef4ca9a39da4e1be0b4c3bc" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "d154d8262abbf517c67d529b0fea7cdf097433bd296d5795b17c6379cb1b1430", + "inner_hash": "b69070b10e6bbc276bf155361d7f3238fec46b9d865075c1dc0fc20d81ab0a42", + "fee": 17787, + "sigs": [ + "0a4b7f385a164f5718794382d49c14a6623e7af5f1ddbefe4871c756b754457a7075e822603bd3b22b313278abebe756be92367ef7a81a8c4adf992842c2058601" + ], + "inputs": [ + { + "uxid": "e6d9b56e075a6adf520d1ae7fbab9ae06353ae0b93dc8cb17d82cc3628009a50", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944750.000000", + "hours": 97, + "calculated_hours": 23715 + } + ], + "outputs": [ + { + "uxid": "2df1e88589be43c55d7c6c3dbcbd663fb759b3245eb8d86b0b9cdaa989556aea", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "943750.000000", + "hours": 2964 + }, + { + "uxid": "c7919b892eeb751456d456b37ccde7350a3fca0dda03b17ec426a56f12dcf192", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1000.000000", + "hours": 2964 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 54, + "block_hash": "a6f4b95091450f21961f12aabd6ff7791aec37b775a9728a0fd970124aa82e85", + "previous_block_hash": "a8f4e293af2cec10febbd7b632c8ed15477cae6dfd98060d007fc2538a4d2b39", + "timestamp": 1429077524, + "fee": 1153, + "version": 0, + "tx_body_hash": "88d239f2584c78b73a1905fd0dcce3beabfdfc5a9c54518862b009e22e972c68", + "ux_hash": "3d81d11b54c9272629d1384de9c386c84337aafb9ffb604cea3a6cebacd0078a" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "88d239f2584c78b73a1905fd0dcce3beabfdfc5a9c54518862b009e22e972c68", + "inner_hash": "bbb61ff8c3b3361e77eae47d4a65c4073e45ded96994efbe605fa7639486b2ba", + "fee": 1153, + "sigs": [ + "c627aa6233c7bc436f7569399554ead829bd21244cb1f938cecde96b493d1ac84099844dc91bbdcf72593285c33f124dba2d3aa1b7807532d647484492b8760900" + ], + "inputs": [ + { + "uxid": "e4fa8fe06d04bb438323f295eea23535856be08b369be71a2ce3e9e7bc0b1e09", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "7000.000000", + "hours": 1499, + "calculated_hours": 1537 + } + ], + "outputs": [ + { + "uxid": "f5beae016bda8260218fc05468c300fa71ddd46f4c6337fffac8d83229461f5f", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "6000.000000", + "hours": 192 + }, + { + "uxid": "470b293870b663b84e1f677e1bc0e486d0b5f412b0562b078a7a1045f7785d7a", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 192 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 55, + "block_hash": "62cdb4edf2a82b894ee0540a494979007ea32ada552321c3daf00700659652b3", + "previous_block_hash": "a6f4b95091450f21961f12aabd6ff7791aec37b775a9728a0fd970124aa82e85", + "timestamp": 1429077544, + "fee": 5583, + "version": 0, + "tx_body_hash": "374f01de8274656147be0a23ccc5677773da6f32b071ee796bda0851b6dcd2ac", + "ux_hash": "64c7ad66527c657e10c2813b87dfc40a0c0a8638c47b925e0d5988ef7282b768" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "374f01de8274656147be0a23ccc5677773da6f32b071ee796bda0851b6dcd2ac", + "inner_hash": "1789978d61189b7e49bea67d8a1d1f0341da0242cb0b801c4d8bc346ec2fd618", + "fee": 5583, + "sigs": [ + "f706829ee37d3f4467aae6341bd20c0455ae172a947ca372028db7f9b1dd2d7a4123b109eba8d4add2f695f6a7aa5806840551096f5357ce09be55e1877fb70c00" + ], + "inputs": [ + { + "uxid": "f37efd851f76854852fdb8b8ba9afa2c5b7859315cc1fd12c12bf6831c59beb2", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "9000.000000", + "hours": 7343, + "calculated_hours": 7443 + } + ], + "outputs": [ + { + "uxid": "298fabb8217a2b0322f104b0cb295383bfdbc599d6a81e07610e0922eb99f89a", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "8000.000000", + "hours": 930 + }, + { + "uxid": "2f1de81eaa83eda52d8eaf44b12599b23134a38b7d55f67de8881ddafbec278b", + "dst": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1000.000000", + "hours": 930 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 56, + "block_hash": "8ffb8910411fee24ddbed4b8775a2d9254f644b12c48f05b3edc6aaf5c0161b1", + "previous_block_hash": "62cdb4edf2a82b894ee0540a494979007ea32ada552321c3daf00700659652b3", + "timestamp": 1429077554, + "fee": 76179, + "version": 0, + "tx_body_hash": "8fba29db2e3e8cad785e723f95aa5fa46ae0dd8b2bb62586977f20e698642cfb", + "ux_hash": "06ec76934a86bc53c39937cff9ba786c83ae1b1e6695bad5a3864611014f9861" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "8fba29db2e3e8cad785e723f95aa5fa46ae0dd8b2bb62586977f20e698642cfb", + "inner_hash": "dc25f33c3b93678ccc3449a318d55782a274c17cd2f45089018bd7c55b21dd96", + "fee": 76179, + "sigs": [ + "6fbe79a6f32b242f97f7e7662e6f7eb5aff065e8063864fc52159071005ffb2570c26a2d8b21a7826cf18c15f4f4ed9b718a7a9fdf1b4d5ac63bdb632452c82401" + ], + "inputs": [ + { + "uxid": "df5d6e09da2585a6ac1a37aea2370fa25e9049b549049202d5417138bf033cfa", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "10000.000000", + "hours": 48655, + "calculated_hours": 101571 + } + ], + "outputs": [ + { + "uxid": "3d7dd4d41e613fe8153f5e5f62b79494e9db9ed98f875d929ca1f90ecfe2d50b", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "9000.000000", + "hours": 12696 + }, + { + "uxid": "9e53268a18f8d32a44b4fb183033b49bebfe9d0da3bf3ef2ad1d560500aa54c6", + "dst": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 12696 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 57, + "block_hash": "371e2ba60743ca0c07e2fd88b3b53ba39fb0cb9e6aad12a7761e6821903ed25c", + "previous_block_hash": "8ffb8910411fee24ddbed4b8775a2d9254f644b12c48f05b3edc6aaf5c0161b1", + "timestamp": 1429077584, + "fee": 10088, + "version": 0, + "tx_body_hash": "61a33b49e97bfe2d5f026bf45fae43a1b9bdf08c60ec8db017da720a69790c7f", + "ux_hash": "453b6d29b16a4858982f81e90d8189d94878d6b215cb1f949982e650576bef8f" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "61a33b49e97bfe2d5f026bf45fae43a1b9bdf08c60ec8db017da720a69790c7f", + "inner_hash": "32d2dce8e8043e544b3cb2145b0bfb9d4cfdb7ae8e20437d075f76b75d8e088e", + "fee": 10088, + "sigs": [ + "990bf0a8c74b0b4c4d05f463a0a50e311a6ae27b5d327dcb906bb6e42330709d48998eed6e7cbdf35caeab6d90fac3e56fb222032aefa7b1d4d9c7653aca9fe600" + ], + "inputs": [ + { + "uxid": "2df1e88589be43c55d7c6c3dbcbd663fb759b3245eb8d86b0b9cdaa989556aea", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "943750.000000", + "hours": 2964, + "calculated_hours": 13450 + } + ], + "outputs": [ + { + "uxid": "c5150380691c542b9bdf4cf2280ac612e0576c349f99d47d0a03c77eedc48731", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "942750.000000", + "hours": 1681 + }, + { + "uxid": "3b9059ec909faf64d652dae78944f4a2737df95a3215bf98e2ff33e02e2b377f", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 1681 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 58, + "block_hash": "f1ac8e75dc1d735737bd0d6f7bbecec46283352f100a70b5b8d26835640c210e", + "previous_block_hash": "371e2ba60743ca0c07e2fd88b3b53ba39fb0cb9e6aad12a7761e6821903ed25c", + "timestamp": 1429077604, + "fee": 220, + "version": 0, + "tx_body_hash": "5d1cb86b48c8834c8c12fc36a83259609300f2f6a148faa1492a473cee21bc02", + "ux_hash": "0b67862cfc42f6128307f583efe4ee78167523cc90d6308a0616f9c9a5470b45" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "5d1cb86b48c8834c8c12fc36a83259609300f2f6a148faa1492a473cee21bc02", + "inner_hash": "34ee80da7f19e17ab8b49569ad514135f6e6120c67288c8f613b758b9db8658c", + "fee": 220, + "sigs": [ + "228340c209abeb45fe25b93bfccbf08cc4faa1abcd89c95bf0332de0f9846f642c68fb68f49f4dfe6ed556c2e8b86bab6127d47de518179ad467af637e264c7d00" + ], + "inputs": [ + { + "uxid": "f5beae016bda8260218fc05468c300fa71ddd46f4c6337fffac8d83229461f5f", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "6000.000000", + "hours": 192, + "calculated_hours": 292 + } + ], + "outputs": [ + { + "uxid": "53ea8733d94ae54bade0b55df03a03b3c0f6e6683b9260c36b14e3fc311d6f49", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "5000.000000", + "hours": 36 + }, + { + "uxid": "d58f3facfb4c9c9459e6fae3000886acb2b1f81322725cdc32cc09a49bb81e43", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 36 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 59, + "block_hash": "439660598874b2e404075928f537ae474b5239ce650f24507429f47f292d3dff", + "previous_block_hash": "f1ac8e75dc1d735737bd0d6f7bbecec46283352f100a70b5b8d26835640c210e", + "timestamp": 1429077614, + "fee": 799, + "version": 0, + "tx_body_hash": "4ce860140dbb5f90f39086b0c51323005145a95b365204bd33e3d90fbdc35f51", + "ux_hash": "790eb4c054ec7664e0775a7012ace595d6daa8fb8b87ce11196592fdc713d56c" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "4ce860140dbb5f90f39086b0c51323005145a95b365204bd33e3d90fbdc35f51", + "inner_hash": "d81940dc03cf3fa1fd3eeadb84ae46e472bf3e281754a79eade7029b5ae1f639", + "fee": 799, + "sigs": [ + "dbc7327f85a323193b59dde59d2656c8dfeb2b94c40dd01ca70f379d14a7b9123473b7cdf38df1196b55f2c01c4a31ed1c9ba7d75f6670deef3b9816656add2d01" + ], + "inputs": [ + { + "uxid": "298fabb8217a2b0322f104b0cb295383bfdbc599d6a81e07610e0922eb99f89a", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "8000.000000", + "hours": 930, + "calculated_hours": 1063 + } + ], + "outputs": [ + { + "uxid": "1efc8693845733061e1407a74e86976a52a69c63a14d6a79e1f3e45277662900", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "7000.000000", + "hours": 132 + }, + { + "uxid": "53d7b4778ee9b9537c0439666ca124d81bcaf4195d080ef61fade8c3eae6322e", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 132 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 60, + "block_hash": "5461cd2134a695ade2c7bdf53f7ad18bbc6635d4241e609e7612ac2a7387ba37", + "previous_block_hash": "439660598874b2e404075928f537ae474b5239ce650f24507429f47f292d3dff", + "timestamp": 1429077624, + "fee": 9636, + "version": 0, + "tx_body_hash": "77a69f4c8afd858a2f6767bb9980d4af6520e02b076bf2a78b935021e1147c71", + "ux_hash": "89c92403dce794e750618b5abcfcb03ccf102d8a2475196dee462bbeb3d8d9e9" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "77a69f4c8afd858a2f6767bb9980d4af6520e02b076bf2a78b935021e1147c71", + "inner_hash": "65f97c460ed99ea47ea2cdfd0780af2338f78d80bff93b92dc2ccc8f2411abec", + "fee": 9636, + "sigs": [ + "7c32e34864bc9659222cb26f10058df5cf2fe0c7b78b1d067a7b5af80f4a2b146f8914f4424d9e80a3303d3d2531ddf9d60489011c607ecd5f92cefa5105eee501" + ], + "inputs": [ + { + "uxid": "3d7dd4d41e613fe8153f5e5f62b79494e9db9ed98f875d929ca1f90ecfe2d50b", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "9000.000000", + "hours": 12696, + "calculated_hours": 12846 + } + ], + "outputs": [ + { + "uxid": "77769e6a01cf3dca201ade501767d0abf20dea19d694f3272b647a9a651fdee9", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "8000.000000", + "hours": 1605 + }, + { + "uxid": "0560bae3917bca7581af9b6c5a58e395c701ce9ed0241dac2de8a3e93c0b839b", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 1605 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 61, + "block_hash": "bd5ecd0a7a96b94b93406a27ddcf4155db32ae7434e19d1210412f86d62401cc", + "previous_block_hash": "5461cd2134a695ade2c7bdf53f7ad18bbc6635d4241e609e7612ac2a7387ba37", + "timestamp": 1429077654, + "fee": 9118, + "version": 0, + "tx_body_hash": "4aeafd20b9df56ec852a2c257ff1630b9530d8375a4e72f20238ea36835f76d5", + "ux_hash": "ada8c5ad5da401c9859ccd0b505b2052be5d3e71865fe4ba0b05a17073e2b287" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "4aeafd20b9df56ec852a2c257ff1630b9530d8375a4e72f20238ea36835f76d5", + "inner_hash": "bc6119c006f7c54c8608cc8050f47c43e6c079397f607f8c9e90d3072a10eca5", + "fee": 9118, + "sigs": [ + "0309322d16d48a35bd42c2ae6a76b240b21974d073f81f440e04431941fc9d550de92dcbcb226ad3baae2b3cbae51db28b2dc8d3e1b51cdd559cbbb6e4b71eda00" + ], + "inputs": [ + { + "uxid": "c5150380691c542b9bdf4cf2280ac612e0576c349f99d47d0a03c77eedc48731", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "942750.000000", + "hours": 1681, + "calculated_hours": 12156 + } + ], + "outputs": [ + { + "uxid": "9bbb8d620aae3efc7c21bb7d6a7159eda441a83e0fef2cd98f8240b38857d648", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "941750.000000", + "hours": 1519 + }, + { + "uxid": "2480aeed2dc47c692e4bce61fb3ee44c4992ea39b0a167235e501330d7ddac62", + "dst": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 1519 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 62, + "block_hash": "e103dbe63feed4fab951dd5de742ace3fd72750f7d48c4940f55f65bd7dca7b1", + "previous_block_hash": "bd5ecd0a7a96b94b93406a27ddcf4155db32ae7434e19d1210412f86d62401cc", + "timestamp": 1429077664, + "fee": 79, + "version": 0, + "tx_body_hash": "057ae2bee6e1fc2c9997d48aab3e348a7f17ad0305d6e6a14f4f663404b4a00a", + "ux_hash": "4e0cf3e7a61064664738416c30a67af01c33bfc031bc662c935e14221fe1ab81" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "057ae2bee6e1fc2c9997d48aab3e348a7f17ad0305d6e6a14f4f663404b4a00a", + "inner_hash": "7b253041d4c467262bd144354f1584fc37b1b3a2934b0230919838e60a4320dc", + "fee": 79, + "sigs": [ + "7587f95e4036b310ce3bafbd1248ae62210120c14c2569d358f0f1363120626060e0797c9728a2cf3cef7839fa6e9d42d31ca899cfab82fa3eb8a0401c3cb8e301" + ], + "inputs": [ + { + "uxid": "53ea8733d94ae54bade0b55df03a03b3c0f6e6683b9260c36b14e3fc311d6f49", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "5000.000000", + "hours": 36, + "calculated_hours": 105 + } + ], + "outputs": [ + { + "uxid": "83b5fa4051dbfd50ba903374e5e583a9345c6a980505ee56963de9bd8e539e36", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "4000.000000", + "hours": 13 + }, + { + "uxid": "b9853ab091bdb295de20d765e9bce2d86870791a6a15b8ef9e9dddb71c4cba95", + "dst": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 13 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 63, + "block_hash": "cf9cdcc235d2bb70cf8ef1420d42f35893fe0c2645540bde77694a000f63c274", + "previous_block_hash": "e103dbe63feed4fab951dd5de742ace3fd72750f7d48c4940f55f65bd7dca7b1", + "timestamp": 1429077684, + "fee": 1271, + "version": 0, + "tx_body_hash": "8d10b0ba11d9dd63d3a3522bc35bd260e8da9109298aa488355ea7201eb961b7", + "ux_hash": "146aa609909e365dfa1e1537f21e2679a729846224f4cc906fbc79e11f2547dc" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "8d10b0ba11d9dd63d3a3522bc35bd260e8da9109298aa488355ea7201eb961b7", + "inner_hash": "929218d56de3e94d277827c857a657ef8b1352f75e6938ff5cf10ac4c54d4039", + "fee": 1271, + "sigs": [ + "6c8892c3277b90f5ca71a42515706de993c459f094282fa99168359f00c5cb862811c4225cc1448e99ba2755e9f9eb241ad0df25b20f1a6ec035a673cf42ab2f00" + ], + "inputs": [ + { + "uxid": "77769e6a01cf3dca201ade501767d0abf20dea19d694f3272b647a9a651fdee9", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "8000.000000", + "hours": 1605, + "calculated_hours": 1693 + } + ], + "outputs": [ + { + "uxid": "f5867b05823c81fc53de36b140415b3b98e4f4cec5883512f8553f70c550d8e7", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "7000.000000", + "hours": 211 + }, + { + "uxid": "9011fbc6e82dce0656e7ffc76afb014d2ad70aa4663e7b687d3212e12f8965e2", + "dst": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", + "coins": "1000.000000", + "hours": 211 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 64, + "block_hash": "b6692c358b6642ca1321509e032a479086ff3ebeb596957e12c4c2e5b68c24be", + "previous_block_hash": "cf9cdcc235d2bb70cf8ef1420d42f35893fe0c2645540bde77694a000f63c274", + "timestamp": 1429077694, + "fee": 7026, + "version": 0, + "tx_body_hash": "29c229c97d27bcaf842a367520e1916fb855921906bddf4a3b0413ad3f11517b", + "ux_hash": "a2484ef64ef7dbfc9f694aa080d3a333972e795371b3762a973549c929136e3f" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "29c229c97d27bcaf842a367520e1916fb855921906bddf4a3b0413ad3f11517b", + "inner_hash": "bc02dde29d200fa6bc0497f2ddd5e52007aef9b6482d40953fbd44ed88e3cf78", + "fee": 7026, + "sigs": [ + "0674c0617c9e6109ca9af404d446777943bb6aaa5dcb223da63bff1a305498972735e0b2a601cc9c6ee2231ad5fdd025fb92cbb00e200860a2ebde924f76499400" + ], + "inputs": [ + { + "uxid": "9bbb8d620aae3efc7c21bb7d6a7159eda441a83e0fef2cd98f8240b38857d648", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "941750.000000", + "hours": 1519, + "calculated_hours": 9366 + } + ], + "outputs": [ + { + "uxid": "25ad0d5ae6a1a9bc61c6b9099fb7829111977a59e1183de4227a0a5352555639", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "940750.000000", + "hours": 1170 + }, + { + "uxid": "47c74a6d7f1f54cf0a7ac45ec00277539079810068dd95a29a202c43780d65a0", + "dst": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "1000.000000", + "hours": 1170 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 65, + "block_hash": "a8dd413f76f33d5cc1abd6d429098a75805137a02d8100fbd98f1b2fca62af70", + "previous_block_hash": "b6692c358b6642ca1321509e032a479086ff3ebeb596957e12c4c2e5b68c24be", + "timestamp": 1429077724, + "fee": 36, + "version": 0, + "tx_body_hash": "e3b7236ad4b209d664ee1e2549f2a0d34a3ba58b12ee46f98fba73c01574e484", + "ux_hash": "6231253b3d6f8a4d8383f750e1f98cecb128cf73820ad6e19a251abe76970e94" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "e3b7236ad4b209d664ee1e2549f2a0d34a3ba58b12ee46f98fba73c01574e484", + "inner_hash": "30b5c520717641fa7a5b11c5340e6f239d1502d90809e919003004048582e8de", + "fee": 36, + "sigs": [ + "3c90ea0882c24e0e17f9f453f7777eba42aa5fea386f21f8f873969a0118d12f0a81169e3600d68026cbbe300b63568db468cbd931087eb0de8635a8453efe3201" + ], + "inputs": [ + { + "uxid": "83b5fa4051dbfd50ba903374e5e583a9345c6a980505ee56963de9bd8e539e36", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "4000.000000", + "hours": 13, + "calculated_hours": 46 + } + ], + "outputs": [ + { + "uxid": "70dfcdd1a8a321ffd22c4ce313763464f78c2f85a97bb369ac8b82f76d2ea961", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "3000.000000", + "hours": 5 + }, + { + "uxid": "c2fcd55cf6b73e863c96f7c2d6251069199bfd43688d2515f5c6631688aadcbc", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 5 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 66, + "block_hash": "0816061820617c7318004eb8893b7b7c49fcac1fda0c655d6f75c57edcf5a1a5", + "previous_block_hash": "a8dd413f76f33d5cc1abd6d429098a75805137a02d8100fbd98f1b2fca62af70", + "timestamp": 1429077734, + "fee": 259, + "version": 0, + "tx_body_hash": "bbd1d4b6fe89a5986efbea9f7996cca2a515c3f0788cedccc21990dc78d83509", + "ux_hash": "47b6b7ce444902e1a0c96aea06bcb6e70ad6b41476e02ba536cc82c765743f8b" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "bbd1d4b6fe89a5986efbea9f7996cca2a515c3f0788cedccc21990dc78d83509", + "inner_hash": "f5b418d7156e6ad70bbde6d90be61d4ab2fce406890a3fe764ae2a43da12440d", + "fee": 259, + "sigs": [ + "1fd3e13f0e55364107d6916ab5002bcc434889e5f5355751f1f688ac469f336d09161f516770cc78f1ece3cb790a1ded56e25948a46546c8d521dea6b3141fad00" + ], + "inputs": [ + { + "uxid": "1efc8693845733061e1407a74e86976a52a69c63a14d6a79e1f3e45277662900", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "7000.000000", + "hours": 132, + "calculated_hours": 345 + } + ], + "outputs": [ + { + "uxid": "3fe6b13824f28d69588c309278420069bc0efae95367d0d6f93cb40af15eeaa6", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "6000.000000", + "hours": 43 + }, + { + "uxid": "06292fe8a2036c38f28c4d2f355d9e86e2b55b9d85f84613a64cf5c35d192b28", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 43 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 67, + "block_hash": "7b9a543120ed5b65c8b988b763e09b4ddc9c36eabe1c56d0fd7b26072eaf9fe9", + "previous_block_hash": "0816061820617c7318004eb8893b7b7c49fcac1fda0c655d6f75c57edcf5a1a5", + "timestamp": 1429077874, + "fee": 8718, + "version": 0, + "tx_body_hash": "42227683dd9c149859d0578ab300d8509d513afadf7834fd8ae7a321cc07d833", + "ux_hash": "afb39102e6b76ffcae61504432b16a5309cc6839766b3fb365b5bdbcad318dd2" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "42227683dd9c149859d0578ab300d8509d513afadf7834fd8ae7a321cc07d833", + "inner_hash": "a7a9ea6466bef6cd63f671ae5dd1aafbeb251a717c7da331d40ec376ad0e89ec", + "fee": 8718, + "sigs": [ + "b4a141eb037a4debd99c347f337f67662a3feeb96112d7b05fc035a3556419dc3a9b35028327d925ca5eb9da018371bc333b7365f06ea22366169af6f066524701" + ], + "inputs": [ + { + "uxid": "25ad0d5ae6a1a9bc61c6b9099fb7829111977a59e1183de4227a0a5352555639", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "940750.000000", + "hours": 1170, + "calculated_hours": 11622 + } + ], + "outputs": [ + { + "uxid": "acc75d51ff9f18a224d1ca0481917e2a67298de40955711cd97a08f6733b5b6a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "939750.000000", + "hours": 1452 + }, + { + "uxid": "8bdd2662d7ed495ff82daef9198ee23ac0c75417607675a8da3dd673952c0e39", + "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "1000.000000", + "hours": 1452 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 68, + "block_hash": "0916d93411a574d88a89d8b7646b1876b036e10905cb8fc04d81e1f09a1c3459", + "previous_block_hash": "7b9a543120ed5b65c8b988b763e09b4ddc9c36eabe1c56d0fd7b26072eaf9fe9", + "timestamp": 1429077914, + "fee": 1090, + "version": 0, + "tx_body_hash": "d803ab903f68f7861cd8eff93b3c097c5b8f6a697ca67bb01e7e645060839fd0", + "ux_hash": "1f34f1f16f2e80571b058019258b893019e01bb338870e631711c1755fa0e4fa" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "d803ab903f68f7861cd8eff93b3c097c5b8f6a697ca67bb01e7e645060839fd0", + "inner_hash": "611f096c50da1d98c29b8c9bdc6b7f7c98d96061ab126c66716f17a2fc495166", + "fee": 1090, + "sigs": [ + "d264a023bc6986c1bf16e2e697f4df8b6e33ae2d4b1ddd4e207cb5f902fed54c1234c3ef2429d82507f5c10c0fb4320d753f3bf6b5e155fa3ec03bc91dd8206a00" + ], + "inputs": [ + { + "uxid": "acc75d51ff9f18a224d1ca0481917e2a67298de40955711cd97a08f6733b5b6a", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "939750.000000", + "hours": 1452, + "calculated_hours": 1452 + } + ], + "outputs": [ + { + "uxid": "5c1069a3aa6628ed7f9bdb300bec1a7e7ca6fb4645528a8c6a27c167e7dfe698", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "938750.000000", + "hours": 181 + }, + { + "uxid": "3c56fa9d161783d6fe5c8b055c6d20bae27097e7bcc44d9ece5c94df182ee5bf", + "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 181 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 69, + "block_hash": "8a65ad3031102e032275f0c24bcda248a5af548eef4cff5570f9530ced70ce5a", + "previous_block_hash": "0916d93411a574d88a89d8b7646b1876b036e10905cb8fc04d81e1f09a1c3459", + "timestamp": 1429077944, + "fee": 137, + "version": 0, + "tx_body_hash": "3bf485890e91268452dc3136c0b294dc9909b3aaa10b9c936743e6e9b1a56f61", + "ux_hash": "0fb49592b74e8fd720494fc2bd6a768099381137872e93db7aaba814ca8848a4" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "3bf485890e91268452dc3136c0b294dc9909b3aaa10b9c936743e6e9b1a56f61", + "inner_hash": "e952e5d86f3cff105dab78a455691c871f3b0fd09558e367833c4743339b94d3", + "fee": 137, + "sigs": [ + "632771f1bdae7454911dcb6462aee56827f949dae18e8a98168b57864a62333f4251e17efa15a53ec12ab6980ea72838e9bb0e64aad82ad9e6a0a2a33b3006cd00" + ], + "inputs": [ + { + "uxid": "5c1069a3aa6628ed7f9bdb300bec1a7e7ca6fb4645528a8c6a27c167e7dfe698", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "938750.000000", + "hours": 181, + "calculated_hours": 181 + } + ], + "outputs": [ + { + "uxid": "8190fd31c005510d550c8a241b127fad2558c82aed9483fb4423193d5f4429e3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "913750.000000", + "hours": 22 + }, + { + "uxid": "5a7b2b6568cfa4ff5d44e98446aed92438ede0103b9994cfa3389bd02a35239b", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "25000.000000", + "hours": 22 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 70, + "block_hash": "3ef495620acbcd39eb8a0ecbcac390b72be620c81c2e5c8730bd7457bd1ecb3e", + "previous_block_hash": "8a65ad3031102e032275f0c24bcda248a5af548eef4cff5570f9530ced70ce5a", + "timestamp": 1429077964, + "fee": 18, + "version": 0, + "tx_body_hash": "f51e2ce31961b0186e04cc9d78857c3c21d3e2afb25c050d8c1d67d3320fcc07", + "ux_hash": "2b0d5300dd48c11d46e185ee52c7906ef5f1f547a19cced5376335696c1cfc78" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "f51e2ce31961b0186e04cc9d78857c3c21d3e2afb25c050d8c1d67d3320fcc07", + "inner_hash": "4a8b13ea0c8a993b3455a374e847bcbea7e7a20392c7cc169cbc41778e65d6e3", + "fee": 18, + "sigs": [ + "74f886780a9df8f6987c8c60bf5d9ad0fc25a502ba8f681188923d3a85f74bb87d57b067e53ed0f423ee7fbb352f3260e65c38e44cc7eec8fe8224374fd77cc800" + ], + "inputs": [ + { + "uxid": "8190fd31c005510d550c8a241b127fad2558c82aed9483fb4423193d5f4429e3", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "913750.000000", + "hours": 22, + "calculated_hours": 22 + } + ], + "outputs": [ + { + "uxid": "450cd7795bb3625daa99d6b64b9a8786d593bf1cad986d6c2933dae04b74a593", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "888750.000000", + "hours": 2 + }, + { + "uxid": "9639a86df8da288fb0fc6a92fa086f3cd5a8387705a14ddd2aa5e30c6c3fc3fb", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "25000.000000", + "hours": 2 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 71, + "block_hash": "1ce626f7ffc4affe11bcbac9b0eea5d23383803c714be1af8f97b1e58aef1138", + "previous_block_hash": "3ef495620acbcd39eb8a0ecbcac390b72be620c81c2e5c8730bd7457bd1ecb3e", + "timestamp": 1429077974, + "fee": 2, + "version": 0, + "tx_body_hash": "abed13c2a552633d26b5b51c3ac5abf9808756c0203869ed185a7cd673702ba2", + "ux_hash": "589b2ec4bab9cad26ab92dd189e3b4cc64701e8a82d97c6b19efcab980d44824" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "abed13c2a552633d26b5b51c3ac5abf9808756c0203869ed185a7cd673702ba2", + "inner_hash": "c176a1a85f716055a9e8060c2a4245db0d7f71f4ac5387d4a51d173db467150a", + "fee": 2, + "sigs": [ + "40e8340047f08afd483b2867166e15ae751bb7272a2c24f68ae8561d3619ea021363e987118a2fe516cacff1946d4d6c4c249038581ee2f58f8feea4bcffc3b100" + ], + "inputs": [ + { + "uxid": "450cd7795bb3625daa99d6b64b9a8786d593bf1cad986d6c2933dae04b74a593", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "888750.000000", + "hours": 2, + "calculated_hours": 2 + } + ], + "outputs": [ + { + "uxid": "b44ee00208690c2123989f40edaff0224825afb20ca0952fbd90bddfd3213642", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863750.000000", + "hours": 0 + }, + { + "uxid": "22edb5931e1c54382f18e41ef774931efb08c278209a1fe8a34100147b707220", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "25000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 72, + "block_hash": "8daa2e02f6154135a2ecb309ab14a1a3af7101d53ee1a35c15335e463b21c883", + "previous_block_hash": "1ce626f7ffc4affe11bcbac9b0eea5d23383803c714be1af8f97b1e58aef1138", + "timestamp": 1429078004, + "fee": 558, + "version": 0, + "tx_body_hash": "3872797c8f9964e6ad19552b9b88d2af07be32866bdb9b9c60aa7086f253af43", + "ux_hash": "62b5aa989f79cc3d398f4047a7d5df9f35ca6098fbca504d819b95529bd77222" + }, + "body": { + "txns": [ + { + "length": 414, + "type": 0, + "txid": "3872797c8f9964e6ad19552b9b88d2af07be32866bdb9b9c60aa7086f253af43", + "inner_hash": "5784542f1b1f9284f25c8d3995429e77b1c0cbdf4b1eeb6a1737f5f19b0b576f", + "fee": 558, + "sigs": [ + "cf51ea4b5631baaa43dcf258cf08f6f87fe4fa9afb2d081e7eeacf6be3b1239058e30d931d22d3befcbde12b51399b438cd8726670f10c0da3889bc08917fb5601", + "bfa55b86721bd2d92144e2108123cc33b62ef50da580fed9d6787cbcc1674f63761ef4d39592f060e98b415c22d272066c36f6499ceb5571b19b4eae1c3110be00", + "3b50522194013cf9ea2dfc387be85c79c7e2379c1936d654c14921cdcbbbaab047a2ab1e09f3a190a09d12f70b41d6428b2e171732630b6a74eeb269853a404500" + ], + "inputs": [ + { + "uxid": "3fe6b13824f28d69588c309278420069bc0efae95367d0d6f93cb40af15eeaa6", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "6000.000000", + "hours": 43, + "calculated_hours": 443 + }, + { + "uxid": "5a7b2b6568cfa4ff5d44e98446aed92438ede0103b9994cfa3389bd02a35239b", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "25000.000000", + "hours": 22, + "calculated_hours": 230 + }, + { + "uxid": "9639a86df8da288fb0fc6a92fa086f3cd5a8387705a14ddd2aa5e30c6c3fc3fb", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "25000.000000", + "hours": 2, + "calculated_hours": 71 + } + ], + "outputs": [ + { + "uxid": "3a7e60306a5fc882d0c4edcb2990d14be6b80dad1a41b06f8ae5e0308078bafa", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "31000.000000", + "hours": 93 + }, + { + "uxid": "a96ca17d6af858af8c6f24f607a742ae2979ab8f660b8363b7fbe18625c8a048", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "25000.000000", + "hours": 93 + } + ] + } + ] + }, + "size": 414 + }, + { + "header": { + "seq": 73, + "block_hash": "21ac5c256658c7758d4f6dccc34e209bc9ef1433f4036cdd7eff722c9f29a83e", + "previous_block_hash": "8daa2e02f6154135a2ecb309ab14a1a3af7101d53ee1a35c15335e463b21c883", + "timestamp": 1429091164, + "fee": 2326, + "version": 0, + "tx_body_hash": "a95317361364e8cc08a150840bac8a97ea1f56278f8834ca2a2f16c24c4a7f0f", + "ux_hash": "3ba29e2a1959b76b8e90a94686427e1ee461e6a90ab12dbbec5cfa6352e6dc74" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "a95317361364e8cc08a150840bac8a97ea1f56278f8834ca2a2f16c24c4a7f0f", + "inner_hash": "90c166e92a7883037f9634704923d986976ac814f28e4761309bf86d77cdb755", + "fee": 2326, + "sigs": [ + "27ee3b614e5362462bc20c23e873e380b5bcc880053436a640286ead5fe2dcd00094e0eade532ffbfc8ba95d5e3540968b2fff64e19e0e772342aceb3c5d3ce100" + ], + "inputs": [ + { + "uxid": "c7919b892eeb751456d456b37ccde7350a3fca0dda03b17ec426a56f12dcf192", + "owner": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1000.000000", + "hours": 2964, + "calculated_hours": 3100 + } + ], + "outputs": [ + { + "uxid": "7b132c07322babefa83ab64971b7bfb29bf2cb9ffe9c42dc7e2975a185dcd8b8", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "995.000000", + "hours": 387 + }, + { + "uxid": "8f52e126bbc359bc3bfd230d82649c3d1c622e8f9c20dae7ccd73bd0b4ee2bad", + "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "5.000000", + "hours": 387 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 74, + "block_hash": "bc712ef025d1281c3fc4922d64f1afdcf1bc6750b15239239a19d02c11284842", + "previous_block_hash": "21ac5c256658c7758d4f6dccc34e209bc9ef1433f4036cdd7eff722c9f29a83e", + "timestamp": 1429091944, + "fee": 43640, + "version": 0, + "tx_body_hash": "edca397ceedb5fb4462b0aff8fe7f9da5091a4e68f11a34c79daf2c5ae7dd748", + "ux_hash": "5704cffe1444e6e24bccba99acf0d6175cb6c6db3e2619cf3b1a9add81e110c7" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "edca397ceedb5fb4462b0aff8fe7f9da5091a4e68f11a34c79daf2c5ae7dd748", + "inner_hash": "873d38a9ff804dab8d83013a6e6b4132d0b0dde6439de24f2190ecd1d31f9ab6", + "fee": 43640, + "sigs": [ + "0c3ca0de3f369e03859d710b18656c92c96b11b8c0e15e31b337293e59776b905f6ce7f91f7b3c9c268b6cb1673b8ef2ffe2dd7f059f7833b62284168bf2065601", + "7755689ff9c10e672b3311b1b69ed69ff82dbcc168683b75e77491c9d36f7a7f1ddd0801b5acbafb467baca8ab9f28cf7189be701bdf169749290ad4cb58e2a801" + ], + "inputs": [ + { + "uxid": "9953e00abe05db134510693a44b8928ca9b29d0009b38d9c4f8dcdedee7edc35", + "owner": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "1000.000000", + "hours": 48752, + "calculated_hours": 57799 + }, + { + "uxid": "8f52e126bbc359bc3bfd230d82649c3d1c622e8f9c20dae7ccd73bd0b4ee2bad", + "owner": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "5.000000", + "hours": 387, + "calculated_hours": 387 + } + ], + "outputs": [ + { + "uxid": "5f75082377566cf140c8f158e160ab6ecd1cdf02224c66865106fa1a75b39dc2", + "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "955.000000", + "hours": 7273 + }, + { + "uxid": "e2807345a3e76b7050038a9ec40d5a62bd4dcc6b1ed79f186213a32caf7008a1", + "dst": "j6pa8kdKqHbxRm2VXJVbzigQDFzqTVfvfq", + "coins": "50.000000", + "hours": 7273 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 75, + "block_hash": "ef4a2e771d88df1deea69cd55f952bc5e9e6f32424e6f4b5ff35ba05602a9584", + "previous_block_hash": "bc712ef025d1281c3fc4922d64f1afdcf1bc6750b15239239a19d02c11284842", + "timestamp": 1429096344, + "fee": 5455, + "version": 0, + "tx_body_hash": "3122b6b29ac470bfa18fbd1ef6d5ff76717e18ba25374215a5003557b4524f22", + "ux_hash": "ea36ebaf2a3e4a37487a1aac964240f60aa1b2b96aeb4e42c0d443d57218430c" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "3122b6b29ac470bfa18fbd1ef6d5ff76717e18ba25374215a5003557b4524f22", + "inner_hash": "f752c579e2f7663b3e13371c7bb94b09cb047f1cdb597bd52b79c8c81f557b9c", + "fee": 5455, + "sigs": [ + "d12daa336401481611bf15edf07cfa0b181a1f3e2e8d062c6e8b04d690242cd87db5fd5aebda3bb06c49e8450c18c5c0360d6c4b14686cbb361feb394b5c26f501" + ], + "inputs": [ + { + "uxid": "e2807345a3e76b7050038a9ec40d5a62bd4dcc6b1ed79f186213a32caf7008a1", + "owner": "j6pa8kdKqHbxRm2VXJVbzigQDFzqTVfvfq", + "coins": "50.000000", + "hours": 7273, + "calculated_hours": 7273 + } + ], + "outputs": [ + { + "uxid": "ec41341d4c9d69e150079550a9051c4cb7cc3e2da49deb2c0faaa632cb1958f8", + "dst": "j6pa8kdKqHbxRm2VXJVbzigQDFzqTVfvfq", + "coins": "5.000000", + "hours": 909 + }, + { + "uxid": "ead07056919be961a9e812a7832356d806d551096284648756b3642a3d4a5570", + "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "45.000000", + "hours": 909 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 76, + "block_hash": "bc51c3788411589efac68dcaef915a14d83aecdbeb250cc48073774997e6cb28", + "previous_block_hash": "ef4a2e771d88df1deea69cd55f952bc5e9e6f32424e6f4b5ff35ba05602a9584", + "timestamp": 1429110544, + "fee": 432263, + "version": 0, + "tx_body_hash": "5369348d67b2dd30dd9164657e372304f81ea10dfe1914ba874d46cd659f52c5", + "ux_hash": "6c5bfb09207562e126ba386e7b106669fb86b94d33b3376c711c15eb47594ca1" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "5369348d67b2dd30dd9164657e372304f81ea10dfe1914ba874d46cd659f52c5", + "inner_hash": "08a8ae61257645c212216e63a96673001fa581c286eaa4ddcb81f6ffaaff8c1a", + "fee": 432263, + "sigs": [ + "75489dbb081962833ce1fffbc393f0040e5c75bf45564a3757573eba816b71bd63e8178eef8add2277864d6d251013b6197bd80efdc069b7c5adf27b0372703c01", + "4587b09d2e08de8379fd1505748ea21db3995f2dd18b04ca729f2ebf76c2645a21acc2e5ca5f4b79f6381b91ef21fe4bb72d2415b74f38fc1569b90233211c8d01" + ], + "inputs": [ + { + "uxid": "73ad63090201c13e6fb55d2e51ec5606fe49a40640bea995e347e7389fcea6c6", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "50.000000", + "hours": 33, + "calculated_hours": 393 + }, + { + "uxid": "4aca4c715985da352bd9aa84787868dac4f4e305c420fe79e6f05acee3bba14a", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "25000.000000", + "hours": 400470, + "calculated_hours": 575956 + } + ], + "outputs": [ + { + "uxid": "50386f195b367f8261e66e3fdfbc942fbacfe25e117e554ca1c1caf899345476", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "25045.000000", + "hours": 72043 + }, + { + "uxid": "9c3119ad3edbd17a2135cac6d24ef43c6d7e599710b2aab4e97e731e64c13acb", + "dst": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "5.000000", + "hours": 72043 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 77, + "block_hash": "fc15f0118c4aafe443e8bd919355a89d61c88d22cc63b024ebb7872dbdb60497", + "previous_block_hash": "bc51c3788411589efac68dcaef915a14d83aecdbeb250cc48073774997e6cb28", + "timestamp": 1429147880, + "fee": 5860904, + "version": 0, + "tx_body_hash": "29798149e90f6442489bcc3294f455441a5a401e81491ed06bdc2c850756f0d9", + "ux_hash": "e16c215cddf959cbd0fc5143c4ab211dac70731fc4609e1124b7a5fa5263356d" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "29798149e90f6442489bcc3294f455441a5a401e81491ed06bdc2c850756f0d9", + "inner_hash": "23ab44d59346b369d258cce6d5142ca7e1b52dd09a1512d8a618e08ae7346004", + "fee": 5860904, + "sigs": [ + "6e0bd761d2d9eeb207f0c4cf9f13d1407f33b5f50e72c3462225c8041882ddcd078a02720d533801a433d917674e3d68a98bb997e9b06664a73a9bdeae46404601" + ], + "inputs": [ + { + "uxid": "b44ee00208690c2123989f40edaff0224825afb20ca0952fbd90bddfd3213642", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863750.000000", + "hours": 0, + "calculated_hours": 7814538 + } + ], + "outputs": [ + { + "uxid": "6060c983054614b8801e405de697c443a1edebd3236582f89f01c6cf6a165c3f", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "862750.000000", + "hours": 976817 + }, + { + "uxid": "08723ed501e11c2053bab6b500f820dd7ae2aeb4a3c9d5109845bb46afebde97", + "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 976817 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 78, + "block_hash": "6b8644bdfe7c2542fdcc03e15cf453d9d66604b728014fa4999797a89909bd0c", + "previous_block_hash": "fc15f0118c4aafe443e8bd919355a89d61c88d22cc63b024ebb7872dbdb60497", + "timestamp": 1429147900, + "fee": 407859, + "version": 0, + "tx_body_hash": "c1fb9372439d7f43d17809afc2d1bc9b2aa81fa9fccc1d837c79e649ec4843db", + "ux_hash": "0980923d75cda1985847ebfbd48e0c7bf853fd08eb38cd09277dd09cf60020f5" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "c1fb9372439d7f43d17809afc2d1bc9b2aa81fa9fccc1d837c79e649ec4843db", + "inner_hash": "283b6b1141f7b09348804d18171ec9b0d20446725df1265932a4064385c9c295", + "fee": 407859, + "sigs": [ + "d16d6a7cd11064a91a6ca4917efe946cc38cb4e7dd59281a4b4098e39bdc151036b72fbf9db4f3ca2b97bdb56a861e8fbe010e52926b176172d3e68b85c7b04501", + "5cd9b19556656a6914d2f8a3daf556220e34eb567a741f015a9de0d53920bfff0e0cb3513551ed7ad95301ac8852487b76a3509832379c57572b46e75f0946cc00" + ], + "inputs": [ + { + "uxid": "70dfcdd1a8a321ffd22c4ce313763464f78c2f85a97bb369ac8b82f76d2ea961", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "3000.000000", + "hours": 5, + "calculated_hours": 58468 + }, + { + "uxid": "a96ca17d6af858af8c6f24f607a742ae2979ab8f660b8363b7fbe18625c8a048", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "25000.000000", + "hours": 93, + "calculated_hours": 485343 + } + ], + "outputs": [ + { + "uxid": "dbe677fec72761ed99467a4d45871aafe173d7dc133e8db0346e3f262ae2598a", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "27000.000000", + "hours": 67976 + }, + { + "uxid": "ce4ca78d810564568c936554d0b6c1a50d91b273648314ffa3fcc1b2d72ac334", + "dst": "sV8sVBgs11uHQtZK5MPbYem2iJ6Hehghv7", + "coins": "1000.000000", + "hours": 67976 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 79, + "block_hash": "1313f73aa897ea032ac1de0741d0b026617933f863f59c4cfd0a3c7cf764f02e", + "previous_block_hash": "6b8644bdfe7c2542fdcc03e15cf453d9d66604b728014fa4999797a89909bd0c", + "timestamp": 1429147950, + "fee": 466755, + "version": 0, + "tx_body_hash": "2558a7cd524acdb58f822a56bd51e8905182b2b35fbfdb1246ce6dc9930d14eb", + "ux_hash": "869ce7a7d48b54f32c34faa2a3517aa7d67db11f5ce59325f9725c030c7151ed" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "2558a7cd524acdb58f822a56bd51e8905182b2b35fbfdb1246ce6dc9930d14eb", + "inner_hash": "37931a3c0b9fe54ebfd93e70c5e872ea8f68669bcd38176bc223be01f7e43aa0", + "fee": 466755, + "sigs": [ + "1d2fa9d76a29f3ce2eda062afe42f3718db434863955ed4f43a83f79dd372a922fd2774d7f5227fa253c65537418b30309932f404e788db91fac1d580d83b28101", + "471ae24bbebd78b5d298edb81e07cc282ce8c1517a2d7426f91f177f111c93873c594e04a215bcd982220b0e6967bd328ec494811cf5eb854091e1d4552545e700" + ], + "inputs": [ + { + "uxid": "f5867b05823c81fc53de36b140415b3b98e4f4cec5883512f8553f70c550d8e7", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "7000.000000", + "hours": 211, + "calculated_hours": 136742 + }, + { + "uxid": "22edb5931e1c54382f18e41ef774931efb08c278209a1fe8a34100147b707220", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "25000.000000", + "hours": 0, + "calculated_hours": 485597 + } + ], + "outputs": [ + { + "uxid": "09661724179523e8aec95862a5fd12dd1aa50f39f193f81eece0d7aea6197103", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "31000.000000", + "hours": 77792 + }, + { + "uxid": "2a886bcedf8862c351cc4087b89e902202b08b164363567a9be47908e938f280", + "dst": "pMub1Pz3SLVaSwHoomgp5oDVxdkVxLkW6L", + "coins": "1000.000000", + "hours": 77792 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 80, + "block_hash": "c3979d6a8c7b58e677c39350f3aea483ee4ca197d5e76d4a91f1abfdec9e4dc7", + "previous_block_hash": "1313f73aa897ea032ac1de0741d0b026617933f863f59c4cfd0a3c7cf764f02e", + "timestamp": 1429148000, + "fee": 51265, + "version": 0, + "tx_body_hash": "5db4378f5abcbb48774fc3731a164fb7bbdccf410c3ff829c5706e4d9ef1b1c6", + "ux_hash": "ae92c3b70cd1ee84ab8240daacbdf01e2ba39ccf7a590b74658d8afa005c4b28" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "5db4378f5abcbb48774fc3731a164fb7bbdccf410c3ff829c5706e4d9ef1b1c6", + "inner_hash": "3e77cc0080eaa29331c9206044e731992369bf84c89262c80d68b39b68ce77e9", + "fee": 51265, + "sigs": [ + "94e4ecd0016b2c5b10f55941cc0355a2c248eaa04566dedcf84e83cfee959d50578cb85ca0ee6170060e97a6fc766fa79a4f6e0942605681178d4bb8009b31e501" + ], + "inputs": [ + { + "uxid": "dbe677fec72761ed99467a4d45871aafe173d7dc133e8db0346e3f262ae2598a", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "27000.000000", + "hours": 67976, + "calculated_hours": 68351 + } + ], + "outputs": [ + { + "uxid": "fa761f3b902ced1ad8e94231af3447315a8c8bcdbbdcfcd69bb74ca5ae66f6e9", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "26000.000000", + "hours": 8543 + }, + { + "uxid": "e16c0ebbfba61c49b0e98bf8336bc4d8a33ca30386c4d875bba2ec4bf4a59147", + "dst": "22WGCstVJGVyqnBuvGHt17L5aNNMpURvckd", + "coins": "1000.000000", + "hours": 8543 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 81, + "block_hash": "44462e4f9906885068ab6e00e4d84ecfc2c17dfa599e41fb75805e035cb7b60d", + "previous_block_hash": "c3979d6a8c7b58e677c39350f3aea483ee4ca197d5e76d4a91f1abfdec9e4dc7", + "timestamp": 1429164440, + "fee": 754183, + "version": 0, + "tx_body_hash": "0cded82aa3ac92d78e23d2d0d7faf93c675fc9a321ad55105f65b6fca444b1e7", + "ux_hash": "7c481dd4fe40fc2b01ada90537c14a1266dc638a333ef72d38005e9c2c288916" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "0cded82aa3ac92d78e23d2d0d7faf93c675fc9a321ad55105f65b6fca444b1e7", + "inner_hash": "0ca2ed02f9155bf69af2fd27b40b0300e0c9804cbd2507389d930ef186f48794", + "fee": 754183, + "sigs": [ + "68a82ec4421a37b8116c8bad98d2568802973dbce6f0166b3a9504110ee4873239953c3e8baf3a20d599e300c8b2c524d672c46ed593e126adc908f1decbbf5100" + ], + "inputs": [ + { + "uxid": "6060c983054614b8801e405de697c443a1edebd3236582f89f01c6cf6a165c3f", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "862750.000000", + "hours": 976817, + "calculated_hours": 1005575 + } + ], + "outputs": [ + { + "uxid": "129726406b3101d51ffd5bfca59a501184d6c8ca363be4ef1b8d8bf48a6c70e0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "861750.000000", + "hours": 125696 + }, + { + "uxid": "3fe7d61ffa993e00200ce6be7ba347c603032ac3f8c4ace07767e630fe94d76c", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 125696 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 82, + "block_hash": "d85c2e5a18844748cf354231f22106bf82ff6f860414d5b7d5e2afd52ea7c221", + "previous_block_hash": "44462e4f9906885068ab6e00e4d84ecfc2c17dfa599e41fb75805e035cb7b60d", + "timestamp": 1429164460, + "fee": 558303, + "version": 0, + "tx_body_hash": "0ad2691de38a15ec31b0fbe9a0c1175138c9d7b7558db2f016a23619f3dbbc6d", + "ux_hash": "46d65f755f018ad9a85c79773f57d048e9178178f63c1dd354c8db6cd97a46e2" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "0ad2691de38a15ec31b0fbe9a0c1175138c9d7b7558db2f016a23619f3dbbc6d", + "inner_hash": "3b3cc2ad41e6248b46bd71e14f91eb2296b730426a8f0481c440271920ddbe27", + "fee": 558303, + "sigs": [ + "e5711c06db00c26d91126e9d024189c1a494ae1357b55247955a4b3bda219e8905dfa03875c1224e754e5e8b4d475d1ce335f2699cd9d490583cd6a0d1e1338c01" + ], + "inputs": [ + { + "uxid": "3a7e60306a5fc882d0c4edcb2990d14be6b80dad1a41b06f8ae5e0308078bafa", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "31000.000000", + "hours": 93, + "calculated_hours": 744403 + } + ], + "outputs": [ + { + "uxid": "dc8162cf85ce1a434adebab2d13abffb587c0e50b86fd1a997bca67f07a66ebd", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "30000.000000", + "hours": 93050 + }, + { + "uxid": "9bfa6dd7ff610b2e8ba036594244e70d427398eab8607d39be0e45303d45d4d8", + "dst": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "1000.000000", + "hours": 93050 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 83, + "block_hash": "af3db7055c27674d622fe70a3037e704900cdc4ec250972896df53da5f3d8755", + "previous_block_hash": "d85c2e5a18844748cf354231f22106bf82ff6f860414d5b7d5e2afd52ea7c221", + "timestamp": 1429164480, + "fee": 164971, + "version": 0, + "tx_body_hash": "d80d49958166fd7b35cee63cfc4a4fdd434484f9bfd9444f62a1b856da36e9c7", + "ux_hash": "a64f119533068375ed5a85cda7224a0cb794c41500727c2909d1e08575e4ab80" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "d80d49958166fd7b35cee63cfc4a4fdd434484f9bfd9444f62a1b856da36e9c7", + "inner_hash": "ddf70f29cbcb9ab5d04848c77bb605849c5d831c80afed10f64ea2bde710b7bd", + "fee": 164971, + "sigs": [ + "21ccec8663f52b64e6d1983c5c715fc360ef1a01a0f4fce857fe7151e59b4cc87a5b6cc18f770eac98ef640eb15d572ea96b81e90a793bb01ac905778c10f0da00" + ], + "inputs": [ + { + "uxid": "09661724179523e8aec95862a5fd12dd1aa50f39f193f81eece0d7aea6197103", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "31000.000000", + "hours": 77792, + "calculated_hours": 219961 + } + ], + "outputs": [ + { + "uxid": "6a8bc7ef9e8e7b67fd270cf37022edadb13f1fc2ba4e7a026f7ce2ab30cc4572", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "30000.000000", + "hours": 27495 + }, + { + "uxid": "a733e89023ccc12587d0849f9baeda0d2fad640c1cbe97e24ffc531859fd83fd", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "1000.000000", + "hours": 27495 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 84, + "block_hash": "65d91ebf581ddf3b620d960d20130e6ef881530b64030648330896b8a0bc0c29", + "previous_block_hash": "af3db7055c27674d622fe70a3037e704900cdc4ec250972896df53da5f3d8755", + "timestamp": 1429164590, + "fee": 20623, + "version": 0, + "tx_body_hash": "8374d85130bbcf496bff138cd040f91fa362eb1b6b6a1c7c9285523437d5589c", + "ux_hash": "c989c40c9ac5f17f49281254bca90873f4c196c220eef96209e0e60e7927554f" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "8374d85130bbcf496bff138cd040f91fa362eb1b6b6a1c7c9285523437d5589c", + "inner_hash": "3188ba9148add7f2811180f130de2c0668fc21c031a7329993b61bfe35f860f1", + "fee": 20623, + "sigs": [ + "93edab2b508cd33cd76c50a5aeabcbcf35472d25ba2b3f268d1cc0a4a813fbe907f4c0e645893b4efd524d30fabb6ba62d65c2ee050057885eea2ca0d2d1c21500" + ], + "inputs": [ + { + "uxid": "6a8bc7ef9e8e7b67fd270cf37022edadb13f1fc2ba4e7a026f7ce2ab30cc4572", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "30000.000000", + "hours": 27495, + "calculated_hours": 27495 + } + ], + "outputs": [ + { + "uxid": "15700b88043b3c08a46c3c4e36e7f431291a26aef1ef26c44ee413feee14b950", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "29700.000000", + "hours": 3436 + }, + { + "uxid": "e2512ec90800147d0d9ddbd0778511ee5a45a25efcb354c50a101738a65462c5", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "300.000000", + "hours": 3436 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 85, + "block_hash": "fcd2ae4cba80370929bc573a2ddeedc6b57750e4b58e5c063c5f17bb66e938ff", + "previous_block_hash": "65d91ebf581ddf3b620d960d20130e6ef881530b64030648330896b8a0bc0c29", + "timestamp": 1429164620, + "fee": 121202, + "version": 0, + "tx_body_hash": "b7b42b1b29acab0a2328aaf368ec74be49b4d4caf827e82b439ef4d8be976a55", + "ux_hash": "b5f5c67fc21c9259f089688afad62d15bbdacc51704d81b50d432e0a57fc35a1" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "b7b42b1b29acab0a2328aaf368ec74be49b4d4caf827e82b439ef4d8be976a55", + "inner_hash": "8b5eec10f63b31e72d4dba2c71fb0f7bc230e58f497e255352f02eee965d3595", + "fee": 121202, + "sigs": [ + "82587c832f0c74f185603b934a32a28624712373d188caad0355314ea621a4af3e96dbd1c37e889f630d90047c79b39c495b49964eca20172bb900db1df48b3a01" + ], + "inputs": [ + { + "uxid": "129726406b3101d51ffd5bfca59a501184d6c8ca363be4ef1b8d8bf48a6c70e0", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "861750.000000", + "hours": 125696, + "calculated_hours": 161602 + } + ], + "outputs": [ + { + "uxid": "05f42f22f5fea4b5cac8182dc2b4f280149c686434c6d4195a119a8d02ab24b2", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "861050.000000", + "hours": 20200 + }, + { + "uxid": "6e2abc4bc7820178358a603b7d99c4b39735dd1685d0c5a778ab63f29c9e93d9", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "700.000000", + "hours": 20200 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 86, + "block_hash": "21213b77aac2c84f332a43cbb89d7dbbb56e4de7c294fa50573d5f4165504d57", + "previous_block_hash": "fcd2ae4cba80370929bc573a2ddeedc6b57750e4b58e5c063c5f17bb66e938ff", + "timestamp": 1429164720, + "fee": 15150, + "version": 0, + "tx_body_hash": "ca51f9d0a19bf326d6dd39a1e4dd240adaaae279411093d4a5b20f54cddabb95", + "ux_hash": "dafc5be48e442e64240d3e432457f737fea6a0ee9b3cc6d5b192aa50cccb1252" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "ca51f9d0a19bf326d6dd39a1e4dd240adaaae279411093d4a5b20f54cddabb95", + "inner_hash": "47500bd3c5f74835a01b0f696e15780baec2ca3723f45355c9e8cd1c71564d18", + "fee": 15150, + "sigs": [ + "fdbc112b10354be2b85b2f9131a3927e7b4e87ff8ddef91b849a71e0b1445ebc410b61d85ff7af1834b54febf89d903e3151f5a74ccef4e9607851c9005454d001" + ], + "inputs": [ + { + "uxid": "05f42f22f5fea4b5cac8182dc2b4f280149c686434c6d4195a119a8d02ab24b2", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "861050.000000", + "hours": 20200, + "calculated_hours": 20200 + } + ], + "outputs": [ + { + "uxid": "4e1a98a72639efa6253a7cbea0f3b499fa24fb88612ad81414d20e46d2b5784e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "860050.000000", + "hours": 2525 + }, + { + "uxid": "ee69cfd4f15d16ded96745a35ef150f679b5b79cc0fd4009a2d02cdccd81ca3e", + "dst": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", + "coins": "1000.000000", + "hours": 2525 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 87, + "block_hash": "60279d08fadb94691ae4a32b29f69688dcc5e7b6f8e8d03fb3ff398d2c6f8456", + "previous_block_hash": "21213b77aac2c84f332a43cbb89d7dbbb56e4de7c294fa50573d5f4165504d57", + "timestamp": 1429164730, + "fee": 96974, + "version": 0, + "tx_body_hash": "cf5a1fad27f8f874f67d3162ae6347154c980ebd97c668d610280418f0f53ce7", + "ux_hash": "01793218345b2cb5af94baffc6b43d78439bd89e63c9c124e7d640ba07934597" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "cf5a1fad27f8f874f67d3162ae6347154c980ebd97c668d610280418f0f53ce7", + "inner_hash": "937bb1627381dc0e982b5b33a119a458db7605a5ff11df1b7a81957460157bad", + "fee": 96974, + "sigs": [ + "53f091d0b653d50c32aa9bd24c09aa1671b2a8686f744a769a9568d3ea28f7852370d83429dfff6b16b9a721f2ecdf40fe799006229d575cec6e73174e7b84b500" + ], + "inputs": [ + { + "uxid": "fa761f3b902ced1ad8e94231af3447315a8c8bcdbbdcfcd69bb74ca5ae66f6e9", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "26000.000000", + "hours": 8543, + "calculated_hours": 129298 + } + ], + "outputs": [ + { + "uxid": "a68c6c646b6bd42f509a82d0218c8ee648b4a40da20eb0599449a7249b10fee9", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "25000.000000", + "hours": 16162 + }, + { + "uxid": "f98e302e74d8972254b1cdc4de3ca78ff1e60f3f1b7083af397f3bcb219e9454", + "dst": "FtdApqw416skWtXM7ExanZWFmiHNPZ1Ft6", + "coins": "1000.000000", + "hours": 16162 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 88, + "block_hash": "5a708b4af0e1db02adb4016fb035b1df8bb3fe968b5de2c5c98178c4f3a209f9", + "previous_block_hash": "60279d08fadb94691ae4a32b29f69688dcc5e7b6f8e8d03fb3ff398d2c6f8456", + "timestamp": 1429164790, + "fee": 71476, + "version": 0, + "tx_body_hash": "efc98a4f94ffda2f1d6575048d75728f228a0bef0467c331f085a0f41f97ae45", + "ux_hash": "78a3643517aa6a128fedef4feb99693c629d1dbd749280dac09c6dc13c1aad20" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "efc98a4f94ffda2f1d6575048d75728f228a0bef0467c331f085a0f41f97ae45", + "inner_hash": "0134889df5d1e5c7a545f1cd6239ea51513534ed08acd503cc77e0b9d74ebcc2", + "fee": 71476, + "sigs": [ + "9a2582b47df81a77ab148fabe81fa6b1c490b213e0cd79aba779be1c56c225d5591bc6674a08bce27103ce7e1e85756d31c96635ecc07ae40c53ccabb20d254d01" + ], + "inputs": [ + { + "uxid": "dc8162cf85ce1a434adebab2d13abffb587c0e50b86fd1a997bca67f07a66ebd", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "30000.000000", + "hours": 93050, + "calculated_hours": 95300 + } + ], + "outputs": [ + { + "uxid": "b187246f68a768f65663b8a208ab107a9bc24af6a062acf3ad41aeb899315a49", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "29000.000000", + "hours": 11912 + }, + { + "uxid": "f713b6bde2e1956615b23021d20aeb829611d231e2e85b8204c01e5719ac8639", + "dst": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "1000.000000", + "hours": 11912 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 89, + "block_hash": "4fc95139dde67484d9613adb8d235ae42f8e6ec690377daf5f7e6afd375d3624", + "previous_block_hash": "5a708b4af0e1db02adb4016fb035b1df8bb3fe968b5de2c5c98178c4f3a209f9", + "timestamp": 1429164800, + "fee": 3816, + "version": 0, + "tx_body_hash": "a0956843d442bd4b592d0c1323d153c3c1b2d7d52a86629444de6d1d1b6a4c33", + "ux_hash": "2036f6edf1a278ca56ff144b61e7d92ae59a071979092a0a5cce1be9662334d8" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "a0956843d442bd4b592d0c1323d153c3c1b2d7d52a86629444de6d1d1b6a4c33", + "inner_hash": "0fd405b4d4a74b417a27d0bfd2f0d1acf4ed0499a000e94c64a1443c5bb440bd", + "fee": 3816, + "sigs": [ + "9bd640adcf2e1870dd4cdd93f007759626ed9fd87dd8e0485888612ea660435a3104889820e6dab8d692efc3e4afb892de622c46b5f5c25718dfb78d4882d2ec01" + ], + "inputs": [ + { + "uxid": "15700b88043b3c08a46c3c4e36e7f431291a26aef1ef26c44ee413feee14b950", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "29700.000000", + "hours": 3436, + "calculated_hours": 5086 + } + ], + "outputs": [ + { + "uxid": "24c49699aab32caf9456a6b4dacd4d820c853c7639e5500b3be6326660312917", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "28700.000000", + "hours": 635 + }, + { + "uxid": "63154895637eb000146996ffaeb7cc1a547e409d0a2038650e990e7cc9b36826", + "dst": "XnKU1htBL5wFSMX8oytZBsBMeaBSbVNivT", + "coins": "1000.000000", + "hours": 635 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 90, + "block_hash": "67d69d26e52c111625cb26629f53fb9d1fc350e584b14a42749a50a26bd0bb47", + "previous_block_hash": "4fc95139dde67484d9613adb8d235ae42f8e6ec690377daf5f7e6afd375d3624", + "timestamp": 1429164810, + "fee": 16229, + "version": 0, + "tx_body_hash": "bd617ec27c2bea642fad8c153178e11ca08456d752249324e3011f27c845f87a", + "ux_hash": "88b0746b83b29bf1614beb8304ab1cd34327f04f0d857ccbc26f3eb7092d4668" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "bd617ec27c2bea642fad8c153178e11ca08456d752249324e3011f27c845f87a", + "inner_hash": "f8ce5c9cc22005d7f63c0400132b0e70a6a8af574f1a5c1ffb0404f228a02949", + "fee": 16229, + "sigs": [ + "b471a7bdde8b1427f8081d9e91250fd89cdd4dd23062796fe2ee973c612eb28b76f6c7ab4f3fbb7c7f9627c52158066d13d9fbe34dfdb6e77c02d84ff4d45d7d01" + ], + "inputs": [ + { + "uxid": "4e1a98a72639efa6253a7cbea0f3b499fa24fb88612ad81414d20e46d2b5784e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "860050.000000", + "hours": 2525, + "calculated_hours": 21637 + } + ], + "outputs": [ + { + "uxid": "33e0c4c9536afffd491fef6294f22ffb0d16902493946a051db0b218728a1c44", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "859050.000000", + "hours": 2704 + }, + { + "uxid": "2a09e97f7725a35af1357842206875a023252da4ebfce129eaf4cb87119cfd41", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 2704 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 91, + "block_hash": "b3d041858a5865ead4edad6acb81406ee59c8b32013e4de96405bb40929f24e0", + "previous_block_hash": "67d69d26e52c111625cb26629f53fb9d1fc350e584b14a42749a50a26bd0bb47", + "timestamp": 1429164830, + "fee": 12539, + "version": 0, + "tx_body_hash": "98baeb9799902593d0f61ee22947089a798c6adafd05dc6a5ea918d982a19857", + "ux_hash": "20f35999317908d338a5ce6d4eb236a43660ebebb3dfcc1152b3011aa65838c8" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "98baeb9799902593d0f61ee22947089a798c6adafd05dc6a5ea918d982a19857", + "inner_hash": "8fdb3ac7731310281c5e67ca521d5b925aee8c7dd34b7b8249ae522ccd450943", + "fee": 12539, + "sigs": [ + "c1f82dfa176134077c4512421b01bec50360dae178e43ec9ceb70d24ff38301a33c6780db5b80afb49b08d15b303217ce206601c1a29bfef4f3bbdf6ccdf779200" + ], + "inputs": [ + { + "uxid": "a68c6c646b6bd42f509a82d0218c8ee648b4a40da20eb0599449a7249b10fee9", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "25000.000000", + "hours": 16162, + "calculated_hours": 16717 + } + ], + "outputs": [ + { + "uxid": "d45d0597c7d41fdc69ed09a139925327142589f1e4fb877285fa63c6fa126d38", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "24000.000000", + "hours": 2089 + }, + { + "uxid": "535987a7896501a8a69c1904c0bf98e2ef1fc493bf998c78ee420ef154868731", + "dst": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "1000.000000", + "hours": 2089 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 92, + "block_hash": "32487462ed6177eadb936cc788ecd6be103f4ee7f2fc16082b99132343ef8fc3", + "previous_block_hash": "b3d041858a5865ead4edad6acb81406ee59c8b32013e4de96405bb40929f24e0", + "timestamp": 1429164850, + "fee": 9176, + "version": 0, + "tx_body_hash": "54e65c445d0af9dda82085ca4bfe0f326ae54ea2a03bd37e07f81d937de97777", + "ux_hash": "231a4ef65f5f0944392cf5fb548419c0a6cc70f20fb6865da290a1dbb7f23a24" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "54e65c445d0af9dda82085ca4bfe0f326ae54ea2a03bd37e07f81d937de97777", + "inner_hash": "d8f2215fee34a1104826266582d525f9c267d3a726732ed532fb6572d09b82b6", + "fee": 9176, + "sigs": [ + "9d5aa480261d4d2dfbb8264ccb2bf8944b6abb5267ad89dda83760273abb8c0116f172e257a661a4d3d89c9c2caf237a13519545173c0df741a7dd18770176a401" + ], + "inputs": [ + { + "uxid": "b187246f68a768f65663b8a208ab107a9bc24af6a062acf3ad41aeb899315a49", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "29000.000000", + "hours": 11912, + "calculated_hours": 12234 + } + ], + "outputs": [ + { + "uxid": "74f7dcc6e516634b5d5722d8664ffabaca3b708a53497bb420ced7c300c39806", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "28000.000000", + "hours": 1529 + }, + { + "uxid": "3109e04b5baef2423f4d6d2d639464286c24ef9defa612d3b598802d761b670a", + "dst": "ZWhZtjwXMS46cpDxfRwQyxxKPhqwsQu8oN", + "coins": "1000.000000", + "hours": 1529 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 93, + "block_hash": "2721f47fc405131d29c5eddcca1a1d13e508444b9b24e999d1d67e1ddd4ecabb", + "previous_block_hash": "32487462ed6177eadb936cc788ecd6be103f4ee7f2fc16082b99132343ef8fc3", + "timestamp": 1429164860, + "fee": 775, + "version": 0, + "tx_body_hash": "e2d9da9342b21659da0a679536f9d6f533a4ce7dc33a7f768c3441ca3640458d", + "ux_hash": "5a500555ded8514cdb5f77dea04889edcbfcc595b1589d3ce6edbd9ebe1621c5" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "e2d9da9342b21659da0a679536f9d6f533a4ce7dc33a7f768c3441ca3640458d", + "inner_hash": "72974683d8244d927c63440a169a438611ef88b250f20df2711d83a9f61a75c9", + "fee": 775, + "sigs": [ + "1c72245ae55779445ae5a6c030ea7f01cee7c29dd6189d0dcb383ec8438297e635b314c44bb0c4173c9e30d225774ee0334cee186e603a61c171af4db3eb961e01" + ], + "inputs": [ + { + "uxid": "24c49699aab32caf9456a6b4dacd4d820c853c7639e5500b3be6326660312917", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "28700.000000", + "hours": 635, + "calculated_hours": 1033 + } + ], + "outputs": [ + { + "uxid": "fb4d5dcc1c3ac97444e96aa7da392b0d7faf7b7373504c70e497228a4695a7f1", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "27700.000000", + "hours": 129 + }, + { + "uxid": "4a5c1b09ef2216ba2fdae735ec8c6ad404bb61bfbeb7407dee9d6e3578762ffb", + "dst": "2LZzgdFYNhsBBSLATkV6PA1zk6DvWNghP2", + "coins": "1000.000000", + "hours": 129 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 94, + "block_hash": "05e3a9d7a0ddbc08fb514ab0d8033a71540b16a317170bd2a3db762ea1a1928d", + "previous_block_hash": "2721f47fc405131d29c5eddcca1a1d13e508444b9b24e999d1d67e1ddd4ecabb", + "timestamp": 1429164870, + "fee": 10977, + "version": 0, + "tx_body_hash": "0f4958d590ed4ac9aca79d848731b358b1c01fab9717775cf6515f2bf2706dc8", + "ux_hash": "a67e3c8993f7952295c7f365535f8d61002a0d7a969c5fc01cfdee36edd06b12" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "0f4958d590ed4ac9aca79d848731b358b1c01fab9717775cf6515f2bf2706dc8", + "inner_hash": "89c71b68262f8e3acddcec032b4209220ac7b794d1cefa62b45c71b94e017cad", + "fee": 10977, + "sigs": [ + "ede880d4422a1102280918227157997bb7a36d26a358a71bf016963d29e8403d2298754039d8dd14c0b05d776d05bebadb919a620e87439c93008e292086c94d01" + ], + "inputs": [ + { + "uxid": "33e0c4c9536afffd491fef6294f22ffb0d16902493946a051db0b218728a1c44", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "859050.000000", + "hours": 2704, + "calculated_hours": 14635 + } + ], + "outputs": [ + { + "uxid": "f32f03f28eece9ddcdc488a85100c94a7c924c185ae560363518dae5e2aacccb", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "858050.000000", + "hours": 1829 + }, + { + "uxid": "24c4cfc628a0f77ce2e878c6ffa9d4dbd85325f8a5e0b5df970a3a2c36033519", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "1000.000000", + "hours": 1829 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 95, + "block_hash": "a054e14b9c7b9e298b04ba7f3a68270fe9e5fd8184b992917519bd7c038bc53c", + "previous_block_hash": "05e3a9d7a0ddbc08fb514ab0d8033a71540b16a317170bd2a3db762ea1a1928d", + "timestamp": 1429164880, + "fee": 1767, + "version": 0, + "tx_body_hash": "c93f8bb30e75ffbc0075a4baf57a0f536e4a9123395b13ce67af5cd2dd0f8cd4", + "ux_hash": "bc8b3f415d75b9045fe6211e52e550a73869991ad60553af6139c2b5ac6d37e0" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "c93f8bb30e75ffbc0075a4baf57a0f536e4a9123395b13ce67af5cd2dd0f8cd4", + "inner_hash": "20a707a3ccfe4ab0884697e4d9013da5c15f062b0a6f1395086503f2c4d6efb2", + "fee": 1767, + "sigs": [ + "5fa7614080d2b044f1edce8bc42961d311db3fa4596fa14973261272980c37b0776099a37d758c20a2d45ee73aaed7d007e58f9f15191233f4f27b266fb2866c01" + ], + "inputs": [ + { + "uxid": "d45d0597c7d41fdc69ed09a139925327142589f1e4fb877285fa63c6fa126d38", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "24000.000000", + "hours": 2089, + "calculated_hours": 2355 + } + ], + "outputs": [ + { + "uxid": "aee4af7e06c24bccc2f87b16d0708bfea68ac1b420f97914965f4a23ad9e11d6", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23000.000000", + "hours": 294 + }, + { + "uxid": "f9653d496ee2e6499a68a1172e5d60b60758b1edcd02d95a3388b29e113a9041", + "dst": "2U1B6EE5ZCXWJJSyEndouuCk434xpvYqYDF", + "coins": "1000.000000", + "hours": 294 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 96, + "block_hash": "2e30e4dc35301e6f227149d29acbcd9d3f6847963cd4ef8ec31a7bad8b57c534", + "previous_block_hash": "a054e14b9c7b9e298b04ba7f3a68270fe9e5fd8184b992917519bd7c038bc53c", + "timestamp": 1429164900, + "fee": 1322, + "version": 0, + "tx_body_hash": "0301358c2db5314ca43c442bac3c1daf31f4b39f9ac9e22dc157687212cab703", + "ux_hash": "830c7a3f304e0740f30a7cd2051a024498f4eedef43d58372618d916fbe8fb8e" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "0301358c2db5314ca43c442bac3c1daf31f4b39f9ac9e22dc157687212cab703", + "inner_hash": "3a68e8622eaf49013554114c0dac32c444998ef6c65ff1afc399bc772787f502", + "fee": 1322, + "sigs": [ + "8925bcbda7785c7a83a77bd5ce16542e91a8f046163d429fcf9c466ca6a9b1fa5f6b693a19b7d8127717821ae247ba30401068d447d0fde4136c0e49f5e7e57900" + ], + "inputs": [ + { + "uxid": "74f7dcc6e516634b5d5722d8664ffabaca3b708a53497bb420ced7c300c39806", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "28000.000000", + "hours": 1529, + "calculated_hours": 1762 + } + ], + "outputs": [ + { + "uxid": "6002f3afc7054c0e1161bcf2b4c1d4d1009440751bc1fe806e0eae33291399f4", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "27000.000000", + "hours": 220 + }, + { + "uxid": "63768bd1402317f7d3f0a38c9897e609bb72b7d334e54bd4c609292487264c22", + "dst": "22Piwuzo8ZfoXfpMghhbzGz3ptmTeiDhLbg", + "coins": "1000.000000", + "hours": 220 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 97, + "block_hash": "fcc06bfe75b62dcb87e2dcb31f6c1a58d5ba2f2b85576938a9dc49b971b60a75", + "previous_block_hash": "2e30e4dc35301e6f227149d29acbcd9d3f6847963cd4ef8ec31a7bad8b57c534", + "timestamp": 1429165260, + "fee": 328, + "version": 0, + "tx_body_hash": "a689a3589730a351f880176b2c15b395967b38a90950e0491e7a1e5531f020a9", + "ux_hash": "73546a733b7b17ce6611435dd1a5214a7e4f05a312bd60d4a3daa1eb6751614a" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "a689a3589730a351f880176b2c15b395967b38a90950e0491e7a1e5531f020a9", + "inner_hash": "d6cfcef60d17c03b68b94c4284746bc70e8ef66cb6d2bd370094a7e4b19dbaed", + "fee": 328, + "sigs": [ + "de36c5fac7db61c7a47827e1a9ad1b717d5fa904b69283598eab6003ba1b1e264856f30a6afe0881675e8f11a86e666cec09b789f3971a6ec4ba25183684a18900" + ], + "inputs": [ + { + "uxid": "fb4d5dcc1c3ac97444e96aa7da392b0d7faf7b7373504c70e497228a4695a7f1", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "27700.000000", + "hours": 129, + "calculated_hours": 436 + } + ], + "outputs": [ + { + "uxid": "4e75b4bced3404590d38ca06440c275d7fd86618a84966a0a1053fb18164e898", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26700.000000", + "hours": 54 + }, + { + "uxid": "1f9fb89f5b7c41d3df6d72b1f02c998196bc79ec20c3949693b4f5a2c1aae44f", + "dst": "2H7mA88ireMKHqP9LYWK5opnU176v7eYqrn", + "coins": "1000.000000", + "hours": 54 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 98, + "block_hash": "0f4c792700593207a217101aa6349e2737a519de1d5f9f670aa1f550d52cc615", + "previous_block_hash": "fcc06bfe75b62dcb87e2dcb31f6c1a58d5ba2f2b85576938a9dc49b971b60a75", + "timestamp": 1429274566, + "fee": 71088, + "version": 0, + "tx_body_hash": "fe01250cfdf84eb0182c033c216891e7e6971cc85976c4c46d9e3c608974d233", + "ux_hash": "1663bee92c91aeafa18ec37ca21ba4b19a6fe54de74f4d925cdf002c9deb6fc4" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "fe01250cfdf84eb0182c033c216891e7e6971cc85976c4c46d9e3c608974d233", + "inner_hash": "2400f3951d454f663d5097060267f8e31e86e1c3f10391c8a06ed79fd72fe49b", + "fee": 71088, + "sigs": [ + "6ecee1ca0e86de9bf6da9a21e49b1cfade8f1a279f7fc58834c15184bec1de634c82faf30bdab34083bc1f32f87d27daa1987a525db83100f88b9103efbc007701" + ], + "inputs": [ + { + "uxid": "f32f03f28eece9ddcdc488a85100c94a7c924c185ae560363518dae5e2aacccb", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "858050.000000", + "hours": 1829, + "calculated_hours": 94784 + } + ], + "outputs": [ + { + "uxid": "99b4e51e1afd04813656e6202c7e462d88ce87ba980da7a62591190d72d1073c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "858000.000000", + "hours": 11848 + }, + { + "uxid": "f12164a6ea6ce65ff2ca1f2be7251bece8f7c5747ba8ec68e1ec3b27d45d7b9c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 11848 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 99, + "block_hash": "5c06896760ace71b02edab01700ff9ca8c32ef1d647e14c3e0d5fa751e47867e", + "previous_block_hash": "0f4c792700593207a217101aa6349e2737a519de1d5f9f670aa1f550d52cc615", + "timestamp": 1429274616, + "fee": 52573, + "version": 0, + "tx_body_hash": "819106dc50373e5293a7e79f179693e85536e8206d82272930ec08410d92402a", + "ux_hash": "c400f9dfcc2254feba80475a1e7acad4c88178152a1d9ca1b3e7883f85cc5a25" + }, + "body": { + "txns": [ + { + "length": 571, + "type": 0, + "txid": "819106dc50373e5293a7e79f179693e85536e8206d82272930ec08410d92402a", + "inner_hash": "02e9a06b0ca7f91255107993e00f09e9ef983559088c5febff264c17952033c4", + "fee": 52573, + "sigs": [ + "efb713e6a1e5d328e94a51fbeb0f73e2a3b7a54e15db75797f0b709f698b16eb26e522f187a98144807e0e6cd294686ff19037975abb6d44b20b2899968954f400", + "b5d011c60020ce591a21db15823c06188515a63ca95d573c36b3af83d634fc6f1c1125db197f6283510ee33890ac168513254ad37524c77294bb5a12e8ff23f300", + "00d87b91eda33f627f6cd28cc673daf929fbec36e7bcfdf894f7491618a68b5755b5baadedc106d53d2da924fcbedbd106eadc50ec611d426720f67426c7286500", + "e64cf7e74363cfd381a3aa6fd17d7c415d6034b26b93017acaf9cf3475ccdffc53c3714d1d13409323cf77ccc81596f6e6edcec11d890979a436ef960bcb5f6900", + "fc2eb05241afdd15cdbd28cc7158d7eb4442f21a678c52332762b23ac6c2fcc76b0f79731987df0ba84d82044cd474d4cda9afda778a21b78a0659c5b588664301" + ], + "inputs": [ + { + "uxid": "2987e7c89d353ad5d63cea2bf2724dc5f7a5ef5fb81f5ea160a307f0726ac2f5", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 701 + }, + { + "uxid": "a52408daa8ce7026c70b61d4df4212fb577462060f340bfce779225b3e18193d", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 50058, + "calculated_hours": 50605 + }, + { + "uxid": "dc73aac74348dd285a1456c1fae2204d7c2039d50a765bdaae0c31f7c7e059db", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 6257, + "calculated_hours": 6804 + }, + { + "uxid": "e4e375b9dc55ff53d6de9120f1a87ff00e00a779835f8320f2c6b3090d0466e6", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 782, + "calculated_hours": 1329 + }, + { + "uxid": "d11b05345917d171f60c31bd2634041b73b97eae364724369ddb8d53369397fb", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 97, + "calculated_hours": 644 + } + ], + "outputs": [ + { + "uxid": "427462efeb07a6803f013c789ea43d93240f74f886bf9afd63dc1936a7574a37", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 7510 + } + ] + } + ] + }, + "size": 571 + }, + { + "header": { + "seq": 100, + "block_hash": "725e76907998485d367a847b0fb49f08536c592247762279fcdbd9907fee5607", + "previous_block_hash": "5c06896760ace71b02edab01700ff9ca8c32ef1d647e14c3e0d5fa751e47867e", + "timestamp": 1429274636, + "fee": 613712, + "version": 0, + "tx_body_hash": "9f20b52befed2cbaaa4a066de7119b7fdbff09a83d8e2a82628671f51f3f6551", + "ux_hash": "ff354e4774397b6c1ab46e56920c82f79e54ac8edce2f0fc4a2e6f472a5e5aca" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "9f20b52befed2cbaaa4a066de7119b7fdbff09a83d8e2a82628671f51f3f6551", + "inner_hash": "c2e60dbb6ad5095985d21391cbeb679fd0787c4a20471340d63f8de437d915df", + "fee": 613712, + "sigs": [ + "2fefd2da9d3b4af87c4157f87da0b1bf82e3d6c9f6427572bd768cf85900d15d36971ffa17eb3b486f7692584102a7a58d9fb3ef57fa24d9a4ab02eba811ef4f00" + ], + "inputs": [ + { + "uxid": "aee4af7e06c24bccc2f87b16d0708bfea68ac1b420f97914965f4a23ad9e11d6", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23000.000000", + "hours": 294, + "calculated_hours": 701385 + } + ], + "outputs": [ + { + "uxid": "194cc596d2beda803d8142ddc455872082f84b09a5edd8085082b60d314c1e29", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23000.000000", + "hours": 87673 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 101, + "block_hash": "8156057fc823589288f66c91edb60c11ff004465bcbe3a402b1328be7f0d6ce0", + "previous_block_hash": "725e76907998485d367a847b0fb49f08536c592247762279fcdbd9907fee5607", + "timestamp": 1429274666, + "fee": 720335, + "version": 0, + "tx_body_hash": "e8fe5290afba3933389fd5860dca2cbcc81821028be9c65d0bb7cf4e8d2c4c18", + "ux_hash": "348989599d30d3adfaaea98577963caa419ab0276279296e7d194a9cbb8cad04" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "e8fe5290afba3933389fd5860dca2cbcc81821028be9c65d0bb7cf4e8d2c4c18", + "inner_hash": "45da31b68748eafdb08ef8bf1ebd1c07c0f14fcb0d66759d6cf4642adc956d06", + "fee": 720335, + "sigs": [ + "09bce2c888ceceeb19999005cceb1efdee254cacb60edee118b51ffd740ff6503a8f9cbd60a16c7581bfd64f7529b649d0ecc8adbe913686da97fe8c6543189001" + ], + "inputs": [ + { + "uxid": "6002f3afc7054c0e1161bcf2b4c1d4d1009440751bc1fe806e0eae33291399f4", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "27000.000000", + "hours": 220, + "calculated_hours": 823240 + } + ], + "outputs": [ + { + "uxid": "f9bffdcbe252acb1c3a8a1e8c99829342ba1963860d5692eebaeb9bcfbcaf274", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "27000.000000", + "hours": 102905 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 102, + "block_hash": "311f4b83b4fdb9fd1d45648115969cf4b3aab2d1acad9e2aa735829245c525f3", + "previous_block_hash": "8156057fc823589288f66c91edb60c11ff004465bcbe3a402b1328be7f0d6ce0", + "timestamp": 1429274686, + "fee": 710046, + "version": 0, + "tx_body_hash": "7b13cab45b52dd2df291ec97cf000bf6ea1b647d6fdf0261a7527578d8b71b9d", + "ux_hash": "f7512b0718f392c7503f86e69175efd7835ea4c3dd3f71ff65c7ad8873a6a9e8" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "7b13cab45b52dd2df291ec97cf000bf6ea1b647d6fdf0261a7527578d8b71b9d", + "inner_hash": "73bfee3a7c8d4f8a68657ebcaf69a59639f762bfc1a6f4468f3ca4724bc5b9f8", + "fee": 710046, + "sigs": [ + "c4bcada17604a4a62baf50f929655027f2913639c27b773871f2135b72553c1959737e39d50e8349ffa5a7679de845aa6370999dbaaff4c7f9fd01260818683901" + ], + "inputs": [ + { + "uxid": "4e75b4bced3404590d38ca06440c275d7fd86618a84966a0a1053fb18164e898", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26700.000000", + "hours": 54, + "calculated_hours": 811481 + } + ], + "outputs": [ + { + "uxid": "0a5603a1a5aeda575aa498cdaec5a4c893a28669dba84163eba2e90db3d9f39d", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26700.000000", + "hours": 101435 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 103, + "block_hash": "db1e858f66b595214807404728ec4b608d208f1c1f211d1785213b6a09091106", + "previous_block_hash": "311f4b83b4fdb9fd1d45648115969cf4b3aab2d1acad9e2aa735829245c525f3", + "timestamp": 1429278106, + "fee": 76077, + "version": 0, + "tx_body_hash": "9150311508851ca989efb5f82b5a7201724514b6b9f84ec1620c18673462126b", + "ux_hash": "dfb414ebbf9f28662f3e07596d5b6016d38ad1132b595a1f9f16241eaf97417e" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "9150311508851ca989efb5f82b5a7201724514b6b9f84ec1620c18673462126b", + "inner_hash": "83e206eb05ce5708efd174bb9df2c0bc0741c1775e50d139aebf37ed6c46381d", + "fee": 76077, + "sigs": [ + "a6206409a077ec30fe7f0b0ad5162805dffbff743afbc9e8e926d72ae38d15f80ab8183150caa4d745125c1c6e733428e299742d10e07a64ba5bd21d4e5ee06f00" + ], + "inputs": [ + { + "uxid": "0a5603a1a5aeda575aa498cdaec5a4c893a28669dba84163eba2e90db3d9f39d", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26700.000000", + "hours": 101435, + "calculated_hours": 101435 + } + ], + "outputs": [ + { + "uxid": "1e30e9dfe00e055404063e52a4154a72492b13de6acf4871ec5ea6d7c0fcc968", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26600.000000", + "hours": 12679 + }, + { + "uxid": "435c7095e2531b88feb76f32fc34fac3406882cdf71e17fecdba196aa5bc059a", + "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "100.000000", + "hours": 12679 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 104, + "block_hash": "a67dbd55b75c2613280d3bda4b84d33bc3df5105012a345009a96589d1429374", + "previous_block_hash": "db1e858f66b595214807404728ec4b608d208f1c1f211d1785213b6a09091106", + "timestamp": 1429278406, + "fee": 82382, + "version": 0, + "tx_body_hash": "44d56cfa9f83d874ee10fb32f0d40458f6bf3e86528592c9a9abf3c960fcb278", + "ux_hash": "b3131bb22af0869b73d57590358b6b60b72e26e3e7adb544317651c926e4704e" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "44d56cfa9f83d874ee10fb32f0d40458f6bf3e86528592c9a9abf3c960fcb278", + "inner_hash": "4a9c25a15fe166d87b3fb6474360b39aa52703b70b961212f9494393a3c71c80", + "fee": 82382, + "sigs": [ + "0c8c4e941af19993051d5e7d0aba7414e066d15dcee9bd3eb1f7fab3259fe0345dff7ed1fa68eb243883a3793f3febc7b7eeb7a619601ec9248ec5c063707e2b01" + ], + "inputs": [ + { + "uxid": "194cc596d2beda803d8142ddc455872082f84b09a5edd8085082b60d314c1e29", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23000.000000", + "hours": 87673, + "calculated_hours": 109842 + } + ], + "outputs": [ + { + "uxid": "aa1133a42417332af8b58e71cc14a651e2731563eaea35f0feacc1e97fac6eef", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22900.000000", + "hours": 13730 + }, + { + "uxid": "52088c63431b6109537bce1e582775f319c9833990c94cc2e8e0dbb8b48b9c27", + "dst": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", + "coins": "100.000000", + "hours": 13730 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 105, + "block_hash": "08622b79bb7e9b79e043152dd8ef759cf9ee8871449d80cc31343736b5aa16c0", + "previous_block_hash": "a67dbd55b75c2613280d3bda4b84d33bc3df5105012a345009a96589d1429374", + "timestamp": 1429278556, + "fee": 11173, + "version": 0, + "tx_body_hash": "41ec724bd40c852096379d1ae57d3f27606877fa95ac9c082fbf63900e6c5cb5", + "ux_hash": "affd2919f37d6bb63b543be3e221802ab6043335a61f9ab1ed10a6c720902c8e" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "41ec724bd40c852096379d1ae57d3f27606877fa95ac9c082fbf63900e6c5cb5", + "inner_hash": "614d7754fa0633e1a701eea3b3a2ce1c2815360f311cd1cb6cf46d5ae94304ba", + "fee": 11173, + "sigs": [ + "bd20e6b6754308d192ba734a573ec4363dae5326b9b21a7203904c076b067bf9313df1df8ac8960f12d9d8b642deb411a504512990181bc2e53264cf661b868f00" + ], + "inputs": [ + { + "uxid": "1e30e9dfe00e055404063e52a4154a72492b13de6acf4871ec5ea6d7c0fcc968", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26600.000000", + "hours": 12679, + "calculated_hours": 14895 + } + ], + "outputs": [ + { + "uxid": "2426f768e00345b641f5b4b4b058c308d528e22437bc6e552f0a9d5bd665e14a", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26500.000000", + "hours": 1861 + }, + { + "uxid": "8f4435cc1cb45453f1ee8e836a74bdec313a6d3aa1879be24e2ba261d474bf36", + "dst": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", + "coins": "100.000000", + "hours": 1861 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 106, + "block_hash": "6a6db10e08b05f6ccb228ab7fee8b2e3ea10e47c126a43ec8bb6ecf13595329f", + "previous_block_hash": "08622b79bb7e9b79e043152dd8ef759cf9ee8871449d80cc31343736b5aa16c0", + "timestamp": 1429279796, + "fee": 835759, + "version": 0, + "tx_body_hash": "8de17dff34a8798f2ac89584f5c559e3bb82c280a3f6890386b4dbc5fef0e8cf", + "ux_hash": "499137c1cc882d5461d87c843a38df8315b9efb9dde9d7e7928666c2be4077dd" + }, + "body": { + "txns": [ + { + "length": 511, + "type": 0, + "txid": "8de17dff34a8798f2ac89584f5c559e3bb82c280a3f6890386b4dbc5fef0e8cf", + "inner_hash": "2ab03a15a9f312d27919ec42a27dfefc5fc5e0b8bf451eb81ef545bf4497f524", + "fee": 835759, + "sigs": [ + "9dd44c7d76d454c7c658649d94e08f75354ba568aae069b38da012f07eacbcfe2a5bbe9b4444f566336c23a03f3625eb4306791437e1bfe69f43efa0c109ec2d01", + "211d2607cef832c989563a3475daf6aa1fec6d73893a72666b5428c6bd93217605990bc3b45f4cf4863a648708ca3bf3526eb1644679f313a297daf82b1865bf01", + "f7e77964485e36b15ade78aacc17407af265c7144767e3f39bfd9765869f90cd0f33120ca996154db82d5462d626f3ae299c8f3b8cc862284432919cfeb6613d01", + "3a1e491d35ad5daa1af54872b5ec1d02c6654cad8f2bcd94c2a624c1a3cd5c9163c373f06a931b5de526654bdbc5cdd221b7fcf7b77329d452562080216ca8fe00" + ], + "inputs": [ + { + "uxid": "99b4e51e1afd04813656e6202c7e462d88ce87ba980da7a62591190d72d1073c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "858000.000000", + "hours": 11848, + "calculated_hours": 962798 + }, + { + "uxid": "f12164a6ea6ce65ff2ca1f2be7251bece8f7c5747ba8ec68e1ec3b27d45d7b9c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 11848, + "calculated_hours": 11903 + }, + { + "uxid": "427462efeb07a6803f013c789ea43d93240f74f886bf9afd63dc1936a7574a37", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 7510, + "calculated_hours": 7564 + }, + { + "uxid": "f9bffdcbe252acb1c3a8a1e8c99829342ba1963860d5692eebaeb9bcfbcaf274", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "27000.000000", + "hours": 102905, + "calculated_hours": 132080 + } + ], + "outputs": [ + { + "uxid": "dfd2834342f3a7caf183472c17801aafacd1775378eb843509d17ad858456cb0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "885000.000000", + "hours": 139293 + }, + { + "uxid": "3bfbe4e80894862d60a053ffb47b8f1749e281603cd6376c8fc6b5e2cec0c843", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "100.000000", + "hours": 139293 + } + ] + } + ] + }, + "size": 511 + }, + { + "header": { + "seq": 107, + "block_hash": "c3e1ef118832446f245de2abcfeb0ef1569f1d4861f6571a63b9d969b275e118", + "previous_block_hash": "6a6db10e08b05f6ccb228ab7fee8b2e3ea10e47c126a43ec8bb6ecf13595329f", + "timestamp": 1429280596, + "fee": 104471, + "version": 0, + "tx_body_hash": "6546dfbe6e61e81f3e9f6c9afdfee1c07758f2e486d731ae4d19b40602367656", + "ux_hash": "e571d0336b141a1162ef3ad14779b36ecdbcaa08780c31c5a903d717d137a3a5" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "6546dfbe6e61e81f3e9f6c9afdfee1c07758f2e486d731ae4d19b40602367656", + "inner_hash": "9566ef1826b7f518c043395c2b7a37014f77f8e23796c1c78e55d1fc443a02da", + "fee": 104471, + "sigs": [ + "2773830af5e34a3de4a3ce935ee08c189feaa30ab41ced8f78f9a6434198d9775c58a0b9bcc2931f3d0dfde541ef7f5d3c1cfcf5415776dbd9d871ce036ec42900" + ], + "inputs": [ + { + "uxid": "dfd2834342f3a7caf183472c17801aafacd1775378eb843509d17ad858456cb0", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "885000.000000", + "hours": 139293, + "calculated_hours": 139293 + } + ], + "outputs": [ + { + "uxid": "8ac39d41ec014ca6625e5f17e1fbe62db7a4ac154e0e42a017efa037935ae968", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "884900.000000", + "hours": 17411 + }, + { + "uxid": "ec4b791f2fa22a986d6035e34f5025c3da0398cb2acc59a54d495d4eaacdee8a", + "dst": "2acnXsnJ2k8jxiUahtBe8h4xouPAnpbwwjc", + "coins": "100.000000", + "hours": 17411 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 108, + "block_hash": "19daeb3b8c9a1c1c30c4c190eec4496c729c7a32e90245b106e252c908fc5053", + "previous_block_hash": "c3e1ef118832446f245de2abcfeb0ef1569f1d4861f6571a63b9d969b275e118", + "timestamp": 1429280756, + "fee": 20746, + "version": 0, + "tx_body_hash": "a8d6420d4f64fad1b698bd77cae5a92aa125f806fb184389edcc278e5cb460fa", + "ux_hash": "ee0f2a6bdc9d816c4887e7674daccd9fec8a50e7ff6fc3da4bffa4f6caf64bb8" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "a8d6420d4f64fad1b698bd77cae5a92aa125f806fb184389edcc278e5cb460fa", + "inner_hash": "6daf17a44251b984449effe21e605ab556ef565940043cff6cc75cb042028783", + "fee": 20746, + "sigs": [ + "dd67813bd08a88b24f695ac10d4390598b25cf19e4edad19091f3b723c4780653a62639153b9bbb53331b66b46dc8c84e719178a96bcd001eb7f2e147268bb2e00" + ], + "inputs": [ + { + "uxid": "aa1133a42417332af8b58e71cc14a651e2731563eaea35f0feacc1e97fac6eef", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22900.000000", + "hours": 13730, + "calculated_hours": 27660 + } + ], + "outputs": [ + { + "uxid": "4326c936322df6d59b3b539ea340eb9630c7f8484eba2aeba1a0ed4d431ab614", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22800.000000", + "hours": 3457 + }, + { + "uxid": "9404837ee44bc6aaa8c1ad963c8fa7a050e497f89f941fdc7248930ed4e0d5a6", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "100.000000", + "hours": 3457 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 109, + "block_hash": "387c3847ecb312cc873beacaa6cc6e4b71b9fc11532c6b6683e80707a99a0bb5", + "previous_block_hash": "19daeb3b8c9a1c1c30c4c190eec4496c729c7a32e90245b106e252c908fc5053", + "timestamp": 1429302756, + "fee": 42555, + "version": 0, + "tx_body_hash": "a4c15ae4743246709ec335d33c289576c8893e71f5c3dcee1db6e43eec9242ee", + "ux_hash": "7d753a823379eee4f6636d7f663af82e60fabf7b8e52d07d3a48015b1c3d3bb5" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "a4c15ae4743246709ec335d33c289576c8893e71f5c3dcee1db6e43eec9242ee", + "inner_hash": "1d2404a84798154867ab461179a2b4300d65e4886cbb0220f0d5d0b16bbb7628", + "fee": 42555, + "sigs": [ + "3fcfe6d7fe59b9998ac4260c3b788384b2ebb7137e08e3ffc8d8b6efa23490e71f94f381c61af4966ba6a4fb4173079d5a7f31518030900f6c10d64ceb0b774f00" + ], + "inputs": [ + { + "uxid": "8ac39d41ec014ca6625e5f17e1fbe62db7a4ac154e0e42a017efa037935ae968", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "884900.000000", + "hours": 17411, + "calculated_hours": 56739 + } + ], + "outputs": [ + { + "uxid": "bae0e928b795e2a80c88161afcbc102dcad6644386f6f44050dde8d586750140", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "881900.000000", + "hours": 7092 + }, + { + "uxid": "4ca22a0fa2acbd0c9e90c4ae83496d05e122deb1a17c670e9c785479d115e824", + "dst": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", + "coins": "3000.000000", + "hours": 7092 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 110, + "block_hash": "9ba608780f4f2a6652b689e61d2d522059e93c0a0bd25c1b40502d127d824c33", + "previous_block_hash": "387c3847ecb312cc873beacaa6cc6e4b71b9fc11532c6b6683e80707a99a0bb5", + "timestamp": 1429326351, + "fee": 107094, + "version": 0, + "tx_body_hash": "552a4b194478325ee9f3e4a8648d94bc8eb26432be6fecc881bf71ff9ca15356", + "ux_hash": "c6fc1679469a1ae4801f7893f58ddb98f84484debca51069ab2a671d52a6ccfb" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "552a4b194478325ee9f3e4a8648d94bc8eb26432be6fecc881bf71ff9ca15356", + "inner_hash": "bcc319504908b93f4418244049157875514fed19ce76977435d00b7ab712254a", + "fee": 107094, + "sigs": [ + "41b8178ba19326c7f61b5327846c8057bef05c47f2068ff3eaef80bb26bde18642d444647f8c623ca8a3abb040f3527c28737534bc2d1b8c5d53bf71f4c1628c00" + ], + "inputs": [ + { + "uxid": "4326c936322df6d59b3b539ea340eb9630c7f8484eba2aeba1a0ed4d431ab614", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22800.000000", + "hours": 3457, + "calculated_hours": 142790 + } + ], + "outputs": [ + { + "uxid": "f9bf35f993452b3d490668bb579fd272da969a1bcca8de0c25000ee57b5d7f54", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22700.000000", + "hours": 17848 + }, + { + "uxid": "a7dc3318a975546b7662f0a867c60a4d7e9b4d1d89ab87be8c78b09ffe8852ff", + "dst": "aPF9pL9sVEiyEVhynp3s1dmqLetP1BJrW6", + "coins": "100.000000", + "hours": 17848 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 111, + "block_hash": "8be6b19ea7791d7fe43c49191cd3d73f182dc11cef660046e5450d2b56d0843c", + "previous_block_hash": "9ba608780f4f2a6652b689e61d2d522059e93c0a0bd25c1b40502d127d824c33", + "timestamp": 1429348072, + "fee": 13386, + "version": 0, + "tx_body_hash": "6ce27da2ddbc15f03330960b4201dbb3a066ad2e9bbd5366a9564f6befdcae2e", + "ux_hash": "010bd2fb29f6d5c89ba63e224358a639758aac6ae6d260f94910e2f515b1284a" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "6ce27da2ddbc15f03330960b4201dbb3a066ad2e9bbd5366a9564f6befdcae2e", + "inner_hash": "2db237d697bd17aab9121cdfc4d72fa1cbfe7fd37d7f71b1a857833bb56b7dd7", + "fee": 13386, + "sigs": [ + "c50715bd2e53ed971b7559ccaf8a930dae335dc45cad18a25ccfea3209ea2c971e0dc6cc57ff1dbcde49ddfdc612e71e923adcd21b68eaa0eb239bc83a50ff2b01" + ], + "inputs": [ + { + "uxid": "f9bf35f993452b3d490668bb579fd272da969a1bcca8de0c25000ee57b5d7f54", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22700.000000", + "hours": 17848, + "calculated_hours": 17848 + } + ], + "outputs": [ + { + "uxid": "c5df36ce47f6f183475317ab1c53eaa65428c142cb3e3906bf162d80519a203f", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "12700.000000", + "hours": 2231 + }, + { + "uxid": "94889dbe1c20eb942b7932c5301737537ac33abd9c81d72e1642ddc70ce320e0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10000.000000", + "hours": 2231 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 112, + "block_hash": "e824946623309bf11d149b257ccd65d66dda02a693e83ecc0cd4429f53b472d7", + "previous_block_hash": "8be6b19ea7791d7fe43c49191cd3d73f182dc11cef660046e5450d2b56d0843c", + "timestamp": 1429348102, + "fee": 8332864, + "version": 0, + "tx_body_hash": "f8a24a25a8e3b206db7ea8a0bd8eeb0f8087f50d230c81a538316bcc5152da3d", + "ux_hash": "7c6f051b8f1edf6bac4aeb4fe434f56074b6b1cd259ae764f9905d241d6719f7" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "f8a24a25a8e3b206db7ea8a0bd8eeb0f8087f50d230c81a538316bcc5152da3d", + "inner_hash": "cfca9a1aa2ab7ea4d643700ac89e9544f1d4e9ef85e28d1cedeece11469fb885", + "fee": 8332864, + "sigs": [ + "5b68d315f4e84cdae4936db6bb7c8466977e784851b605d1fbc1e0bb65fe259d58d6be37228c96bccb1a1c1e9d316d9102fcfaefeda614e67af20464bc877f2101", + "fdd919590553d428d9b8121644127651c68b5207af9798aaaa6ed18134c5835b5311bb547e07e47157a4fd89867c88a48700255610efd2a3e3f77dc82f5fb3ba01" + ], + "inputs": [ + { + "uxid": "bae0e928b795e2a80c88161afcbc102dcad6644386f6f44050dde8d586750140", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "881900.000000", + "hours": 7092, + "calculated_hours": 11108253 + }, + { + "uxid": "94889dbe1c20eb942b7932c5301737537ac33abd9c81d72e1642ddc70ce320e0", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10000.000000", + "hours": 2231, + "calculated_hours": 2231 + } + ], + "outputs": [ + { + "uxid": "1d4595b9fa1c6c3d64f48b6ae5f8f861b1c08a022cbcb04b279df448da3db660", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873900.000000", + "hours": 1388810 + }, + { + "uxid": "53b376413d550663ab51b229df8b0f55e4055d6577c2d8b5cec8ff748fe0e958", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "18000.000000", + "hours": 1388810 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 113, + "block_hash": "46c2b611585a58ba3cb400970c3ff156fb62b7ca40bd9f8ab37979ebbc69e27d", + "previous_block_hash": "e824946623309bf11d149b257ccd65d66dda02a693e83ecc0cd4429f53b472d7", + "timestamp": 1429348172, + "fee": 1041608, + "version": 0, + "tx_body_hash": "1f27afc41896d2c7fdbd2620e606440ad12557e9a4bdd6808dcc2c23d4e32978", + "ux_hash": "6e57bb2b61fdbc6288ee89183ede904a77500e9e41b9cc2d765f6ece0225b5d7" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "1f27afc41896d2c7fdbd2620e606440ad12557e9a4bdd6808dcc2c23d4e32978", + "inner_hash": "4d53c05c731409feef7606cf9514904f4c7704537efb453ac2c439fcfe77a455", + "fee": 1041608, + "sigs": [ + "e36cef84c1c6f999dba462f3134131c105da2255eaf21550ce30ee52a14a33d529a7cd0c37b3883d0d57429b163b4905271c7b1a4d951b4a521f245c7857dd5c01" + ], + "inputs": [ + { + "uxid": "1d4595b9fa1c6c3d64f48b6ae5f8f861b1c08a022cbcb04b279df448da3db660", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873900.000000", + "hours": 1388810, + "calculated_hours": 1388810 + } + ], + "outputs": [ + { + "uxid": "412eff3eef889c682da8db3608fce37d1c5ee2cc297bc88d901648e6ccd418f9", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873800.000000", + "hours": 173601 + }, + { + "uxid": "c961ba554ae30b0edcdf71e834ab2b26d7dff5bcf5955d4874cdba89170392bf", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "100.000000", + "hours": 173601 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 114, + "block_hash": "559fbe3f6619596631de1c1ea3e81b170cfe73fcc3ea08588897da22baab8e19", + "previous_block_hash": "46c2b611585a58ba3cb400970c3ff156fb62b7ca40bd9f8ab37979ebbc69e27d", + "timestamp": 1429348502, + "fee": 130201, + "version": 0, + "tx_body_hash": "e8765b4e6fbca87144df59a6f66815b175e81999509504b117636edc34cbe2af", + "ux_hash": "c0fba7a0e2d3de73f62277b2e8147fcb6a1e3ef1386dca06c6a6448d80460031" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "e8765b4e6fbca87144df59a6f66815b175e81999509504b117636edc34cbe2af", + "inner_hash": "b62f9938b195211810976e1719b152fe6c381879adba6061f4ca36d74c06bea2", + "fee": 130201, + "sigs": [ + "9d40ed257bb7586c7d72e90bd99c6883fb836d400107686ba477850c2b63a86b5ad885aa37f352d334d930ea3814844e67a6ac438c36b919daff273a66f21e5201" + ], + "inputs": [ + { + "uxid": "412eff3eef889c682da8db3608fce37d1c5ee2cc297bc88d901648e6ccd418f9", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873800.000000", + "hours": 173601, + "calculated_hours": 173601 + } + ], + "outputs": [ + { + "uxid": "6ad7993fb2728c2c53ac2c8395a6c62d03c5ef9298ca467e7998fb64fd0c90b4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873700.000000", + "hours": 21700 + }, + { + "uxid": "5b0801ec545b132eeafa61bee8f645df7e1e358321ef830a4247fe541c211139", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "100.000000", + "hours": 21700 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 115, + "block_hash": "504fd4a569f4b3ee5182b12fb082dba7d4853fa40977a4a2dad43143ee616db3", + "previous_block_hash": "559fbe3f6619596631de1c1ea3e81b170cfe73fcc3ea08588897da22baab8e19", + "timestamp": 1429348712, + "fee": 16276, + "version": 0, + "tx_body_hash": "bb700553c3e1a32346912ab311fa38793d929f311daeee0b167fa81c1369717e", + "ux_hash": "81bc3ae9527ef4693109ea9d2ed4e8d55f00c0bda6b215947c195551b6d66681" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "bb700553c3e1a32346912ab311fa38793d929f311daeee0b167fa81c1369717e", + "inner_hash": "253c14d68558b09c034d4945284f5cc3025b9e05723c6e4fa7d95f1e68edb211", + "fee": 16276, + "sigs": [ + "4920f49d47105801fab73c2398bee61ce56bb0b58dd69ab35ec1f959a3b8a8003c2821510d3a97d09f7a4a9f943b04d888b1327539ff48216f148fca693dde5d01" + ], + "inputs": [ + { + "uxid": "6ad7993fb2728c2c53ac2c8395a6c62d03c5ef9298ca467e7998fb64fd0c90b4", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873700.000000", + "hours": 21700, + "calculated_hours": 21700 + } + ], + "outputs": [ + { + "uxid": "0976005ab4540e8211cd929f19634bfaa2f5d8e24177ddb5b803b447ea91f8c3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873600.000000", + "hours": 2712 + }, + { + "uxid": "de995d2361e810cfba1b9b1141413367a722f51c7555b1685f6e68129dfb2679", + "dst": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", + "coins": "100.000000", + "hours": 2712 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 116, + "block_hash": "87ac9b17ffc3169eb0ac6e758e62a37f9034c294a8fe5b223d9b127fbb7a9f25", + "previous_block_hash": "504fd4a569f4b3ee5182b12fb082dba7d4853fa40977a4a2dad43143ee616db3", + "timestamp": 1429349392, + "fee": 388717, + "version": 0, + "tx_body_hash": "491130fc9f69d101df220116356e82e2ff21dac1167e6da81c95dd4cc417b3d9", + "ux_hash": "913ca96659cadafaabb4c433fb184e35cd0eeaa9dc7f6a4c52e6b6f8c9433eef" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "491130fc9f69d101df220116356e82e2ff21dac1167e6da81c95dd4cc417b3d9", + "inner_hash": "d78596837a36ece9a8bc3a8eed424612651039f4f229969c42ec3d7fd1aceff2", + "fee": 388717, + "sigs": [ + "e22e89ecb303d5eee59eca8a75e0d5b4fdfa3a256576d7ac91264b4c3bf882ce7186572ab68fd1ad4dc837039ef4d7063ead72365506aed71cfe4de0b0449b4900" + ], + "inputs": [ + { + "uxid": "2426f768e00345b641f5b4b4b058c308d528e22437bc6e552f0a9d5bd665e14a", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26500.000000", + "hours": 1861, + "calculated_hours": 518287 + } + ], + "outputs": [ + { + "uxid": "6c34016037cd17622846e71bc635914d4d8f256c147aa5a0b84a896e83229480", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26400.000000", + "hours": 64785 + }, + { + "uxid": "ab12f4eadaf956be371ff8f239956e33d1cd2fd4b497ca04c9501baf6f241618", + "dst": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", + "coins": "100.000000", + "hours": 64785 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 117, + "block_hash": "0c20262e8f6a28d63f1b7f9a8b0e4bc6801ffb0c6a3676c06a5b2903f865416a", + "previous_block_hash": "87ac9b17ffc3169eb0ac6e758e62a37f9034c294a8fe5b223d9b127fbb7a9f25", + "timestamp": 1429351912, + "fee": 125795, + "version": 0, + "tx_body_hash": "345488861ad3f0d93024c367990e64ef0f7a95bd8b8589f554172f9439808263", + "ux_hash": "fcd1a68f49962723c919b82780797740cd0428c05a072fa9f320028803ee720f" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "345488861ad3f0d93024c367990e64ef0f7a95bd8b8589f554172f9439808263", + "inner_hash": "258acd45e194051214c9783184c2a9157558e595c4e4da814258f0ffd0e9dd64", + "fee": 125795, + "sigs": [ + "9f44be793a0cb218b6836dfa52e5b8c38fe2b1257d27fcea49f4c6a6ed910f446e8a96a987fc06c6b6ae13ea8ea0290e91ea40b6f8eeaf8054e8efd17306573201" + ], + "inputs": [ + { + "uxid": "0976005ab4540e8211cd929f19634bfaa2f5d8e24177ddb5b803b447ea91f8c3", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873600.000000", + "hours": 2712, + "calculated_hours": 167725 + } + ], + "outputs": [ + { + "uxid": "6beca9fb58a327580c614d7fb5622916849756790b661bcabc880666364fdf47", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863600.000000", + "hours": 20965 + }, + { + "uxid": "2010952c33c83599fa14bfa5982d59865f2a362c97270dacb4c180a485ee5096", + "dst": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", + "coins": "10000.000000", + "hours": 20965 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 118, + "block_hash": "d041c16ee3e7ea54503cddfc4ade9b21b3dce9cb17ebd531a2d52fa122aaee69", + "previous_block_hash": "0c20262e8f6a28d63f1b7f9a8b0e4bc6801ffb0c6a3676c06a5b2903f865416a", + "timestamp": 1429364072, + "fee": 184620, + "version": 0, + "tx_body_hash": "a83e09e976b038d86491d8c029aec84a6313dc33e692da6ce50a2858e50c4666", + "ux_hash": "ef651e6ce43c864fed7fc0f0be888a988e299e277bed9554eb5a926eec66e37e" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "a83e09e976b038d86491d8c029aec84a6313dc33e692da6ce50a2858e50c4666", + "inner_hash": "86b47008bbeb60335762ba70b5bdf8128f09b3f8fff6ec6e5d9553763a5b5cef", + "fee": 184620, + "sigs": [ + "48312c1abe5617609f70a882689f194e8d18c0b56d153adfae4be08bf00d723c6cda6dbd885e7ed7f92c7b7065d583adfd5f18bb37da9b796a394f4a388e978d01", + "4826477aed0387ca448b8225a5d27ebe6824b460d0581fb8ccb5078a865cd8171e7f5c860091a99cc85b1571dce8a550659cb3d02902a77cd1f6d0d27277bdee01" + ], + "inputs": [ + { + "uxid": "7b132c07322babefa83ab64971b7bfb29bf2cb9ffe9c42dc7e2975a185dcd8b8", + "owner": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "995.000000", + "hours": 387, + "calculated_hours": 72454 + }, + { + "uxid": "c961ba554ae30b0edcdf71e834ab2b26d7dff5bcf5955d4874cdba89170392bf", + "owner": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "100.000000", + "hours": 173601, + "calculated_hours": 173704 + } + ], + "outputs": [ + { + "uxid": "3408638af298419b14a49e8e9dd69e97c9a06827d74edf9f410a870662360b31", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1045.000000", + "hours": 30769 + }, + { + "uxid": "ba0a94662846565969d361b1b7c248847a48e69f2b9eefb4ffb0bc2efc56a8fd", + "dst": "38cVLswijqC2ANV5HxTroeapQzqeoBR88C", + "coins": "50.000000", + "hours": 30769 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 119, + "block_hash": "47c5bf33a544cb4f0a8e7ecfea9db40f43467ae8b8c80ba1d1cc8a39063ea05c", + "previous_block_hash": "d041c16ee3e7ea54503cddfc4ade9b21b3dce9cb17ebd531a2d52fa122aaee69", + "timestamp": 1429364282, + "fee": 23077, + "version": 0, + "tx_body_hash": "4d080ff1f8ac21d8c09a2dca99d28ae88e9441d7a4757dca68469ad64838cb55", + "ux_hash": "06cd243747bd5b7e42c8be4e076fbc25c25beda3d983bd943b45590a5ca35b56" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "4d080ff1f8ac21d8c09a2dca99d28ae88e9441d7a4757dca68469ad64838cb55", + "inner_hash": "bd2066b342e0af8c4bfecd15d3a87f168cac47d1f900642b69b23fbf18bfed05", + "fee": 23077, + "sigs": [ + "ea1adfe309f30a15691fc3e267b19d7b765983694245adbebd92924db1adb67668d4dc8a6467e54323d245a35c0ed822593e10de2fd6c4674d3040b53099a6aa01" + ], + "inputs": [ + { + "uxid": "ba0a94662846565969d361b1b7c248847a48e69f2b9eefb4ffb0bc2efc56a8fd", + "owner": "38cVLswijqC2ANV5HxTroeapQzqeoBR88C", + "coins": "50.000000", + "hours": 30769, + "calculated_hours": 30769 + } + ], + "outputs": [ + { + "uxid": "cbe8b620c1468dbb1e69e6da63831bde5828db313879a36f783a1f16f2b86541", + "dst": "38cVLswijqC2ANV5HxTroeapQzqeoBR88C", + "coins": "12.000000", + "hours": 3846 + }, + { + "uxid": "f480c6097568036b90a2e019f9ee68c0812b2da8828be33a005a7427caf14a2b", + "dst": "f38daJDg8rpwL5xWgMY78fBHncQ1N5gQZ7", + "coins": "38.000000", + "hours": 3846 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 120, + "block_hash": "644bd4cc468983f429fc64e2ed43338eb0c5def9e12c6b7a0784c4fa928abff6", + "previous_block_hash": "47c5bf33a544cb4f0a8e7ecfea9db40f43467ae8b8c80ba1d1cc8a39063ea05c", + "timestamp": 1429364452, + "fee": 3366, + "version": 0, + "tx_body_hash": "d1569ca879f98450a920a2b427ab0e1d21342308fb6b4ea5031ee6e718217183", + "ux_hash": "b63369302476aaa7e57b3b32b6f141f24bde99208f619b25077ea7a547dc8b72" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "d1569ca879f98450a920a2b427ab0e1d21342308fb6b4ea5031ee6e718217183", + "inner_hash": "12d27fdba804c648b8f72d9740d4021b05c88c95d3595af4afab2150092c5eee", + "fee": 3366, + "sigs": [ + "2baa243ca1b82bd9fc1a31a0b53c9f7eb0ad62b19d6a4d3af62579cc2dc455d81d8ed82ba342dc650d4ae38718d81a8df6a93a9a809749a2f5391894bbaf298400" + ], + "inputs": [ + { + "uxid": "f480c6097568036b90a2e019f9ee68c0812b2da8828be33a005a7427caf14a2b", + "owner": "f38daJDg8rpwL5xWgMY78fBHncQ1N5gQZ7", + "coins": "38.000000", + "hours": 3846, + "calculated_hours": 3846 + } + ], + "outputs": [ + { + "uxid": "3f9712cab0d3aeb217f1751fa19e53d75f814b4218866d4e70d63f32271d2023", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "38.000000", + "hours": 480 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 121, + "block_hash": "48a34e6f6371d5e93cea488f9615bc64b305b47d82cd813218bfc92e5fad2a3e", + "previous_block_hash": "644bd4cc468983f429fc64e2ed43338eb0c5def9e12c6b7a0784c4fa928abff6", + "timestamp": 1429382678, + "fee": 2271879, + "version": 0, + "tx_body_hash": "da82deafc15c36e7dc9cd95663e0dc910ae626ee543147ac7bd8682be00f7baf", + "ux_hash": "4eef95855584018e0cc70e78fa5b77f5c0447bf2456713e80274a3a35b4df479" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "da82deafc15c36e7dc9cd95663e0dc910ae626ee543147ac7bd8682be00f7baf", + "inner_hash": "c98f858a27e76b0b565baaa3dffc6cfc7b0ffe9dd7d2d71f4bb0ad4d1c439ca2", + "fee": 2271879, + "sigs": [ + "15fccdc36c966a9571196a3f727ebda47162441df2d9965ac27109ac56d22cb41638b404e84b5b388d809b814ade18022cba0a6e021140c6b7d0144a6facd6d501" + ], + "inputs": [ + { + "uxid": "6beca9fb58a327580c614d7fb5622916849756790b661bcabc880666364fdf47", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863600.000000", + "hours": 20965, + "calculated_hours": 3029171 + } + ], + "outputs": [ + { + "uxid": "f8a1990492f970227ec29e6e095fa724d66fa2d6883bd8723773098d08ca8b3c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "801600.000000", + "hours": 378646 + }, + { + "uxid": "e5596ef0ba04ad9e0adbe0355a24c6bef249654906f917b68f8f0cf072508674", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "62000.000000", + "hours": 378646 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 122, + "block_hash": "42a88e86cb431b2464cd40554a46374775854e588df3c0ec3164b55290c95fec", + "previous_block_hash": "48a34e6f6371d5e93cea488f9615bc64b305b47d82cd813218bfc92e5fad2a3e", + "timestamp": 1429382898, + "fee": 283986, + "version": 0, + "tx_body_hash": "211f5fc97ba1797d78f84d4e4db78415b5ff4121f78369535fe3f8015571c6df", + "ux_hash": "6fe7b36354ce50054dcb32e1eb108bfdaffe14c2c94514d517a3909b725c4ce9" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "211f5fc97ba1797d78f84d4e4db78415b5ff4121f78369535fe3f8015571c6df", + "inner_hash": "586a8297d8d148f79d8529fbc3e356f5de9570a3c34bc1ba8494b8269b03d0f2", + "fee": 283986, + "sigs": [ + "cccee00def7817ec1b36ba5b02066f82eae188afc3e05e61524c62d19fe095e0363db085da6591841314da5f836f2f0068eae522e3d3937d2f96de99f924af6a01" + ], + "inputs": [ + { + "uxid": "f8a1990492f970227ec29e6e095fa724d66fa2d6883bd8723773098d08ca8b3c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "801600.000000", + "hours": 378646, + "calculated_hours": 378646 + } + ], + "outputs": [ + { + "uxid": "998487775c0e58420673b70204b83c1d6bb5b70e34b1aa0f8169c85ecec2438e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "765600.000000", + "hours": 47330 + }, + { + "uxid": "1e0cf4e3ed49b52944f533a212e6412291e369ac3e7a8c4440424f475f2983b3", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "36000.000000", + "hours": 47330 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 123, + "block_hash": "d6be10dec288c68139841963f3bca742ed29a1a042658ed699bbfad206cb3f4d", + "previous_block_hash": "42a88e86cb431b2464cd40554a46374775854e588df3c0ec3164b55290c95fec", + "timestamp": 1429451746, + "fee": 35498, + "version": 0, + "tx_body_hash": "9003d3caba9587d46d000cc614bb52bed34adcc5ea404c560c986eb6dd756e6b", + "ux_hash": "cc22c972949b69f79394815aed9a9d4d7d73b988bb94e8efa10eefa8b8ff1c70" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "9003d3caba9587d46d000cc614bb52bed34adcc5ea404c560c986eb6dd756e6b", + "inner_hash": "2a87bcb0049b9971713a2e46b75b348785adca751b151290a411bfa5a0ed2287", + "fee": 35498, + "sigs": [ + "0da91c351fb050c243c7b587005bee14ccc2951897ffdf720ad9c757c5946e516a20ca0d92c5f84957161d10a74deab05a2b530ab5bbcd7ad01266213b5eb38401" + ], + "inputs": [ + { + "uxid": "998487775c0e58420673b70204b83c1d6bb5b70e34b1aa0f8169c85ecec2438e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "765600.000000", + "hours": 47330, + "calculated_hours": 47330 + } + ], + "outputs": [ + { + "uxid": "6fb116c110fe391448a1dcb985b67439c2e9a71d8bb2fd1cf345ac73ada6166a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "755600.000000", + "hours": 5916 + }, + { + "uxid": "8e764a87cee9f26b902f748c28a5a49de5c383e5f155129eec84474a3d0349cc", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10000.000000", + "hours": 5916 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 124, + "block_hash": "d01a6811cc796d32d915257986177c5cf12dbd5f010bfff736457a114f9b6eb2", + "previous_block_hash": "d6be10dec288c68139841963f3bca742ed29a1a042658ed699bbfad206cb3f4d", + "timestamp": 1429522086, + "fee": 4438, + "version": 0, + "tx_body_hash": "e9a6dd585b564b19c55d9f56188a45bfad32fa75703fa6336830035f6fa92e3d", + "ux_hash": "045e587e05099db06ca4abad61b4d9ca2b410c8cfc192b13208c1b2b7ced3fc1" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "e9a6dd585b564b19c55d9f56188a45bfad32fa75703fa6336830035f6fa92e3d", + "inner_hash": "9cdad9a848f5b2993d1e5d0593e952b39ccdf7ae56bd13851449797cccdced5f", + "fee": 4438, + "sigs": [ + "1f3d02abe6811c83b4f4b2e270366e8d4c591866b6e984cb8bdea5d80ca1edbb04d651449070bbca22a8c7cfb3d23a6f85c0a5a7e3226e2d0520330faf16291401" + ], + "inputs": [ + { + "uxid": "6fb116c110fe391448a1dcb985b67439c2e9a71d8bb2fd1cf345ac73ada6166a", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "755600.000000", + "hours": 5916, + "calculated_hours": 5916 + } + ], + "outputs": [ + { + "uxid": "04471fb0797bb931e883f7b95cfff6ee4fea5e19a352ca5425fcd353c4f6aba4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "750600.000000", + "hours": 739 + }, + { + "uxid": "a4fdfce34725eb63941ac576651fa406272565a344ffb21435d285111efbc4db", + "dst": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", + "coins": "5000.000000", + "hours": 739 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 125, + "block_hash": "7f18db3c23f1c460e331749b92b08495b33f9da515e821f6faba239dfc1aaf9d", + "previous_block_hash": "d01a6811cc796d32d915257986177c5cf12dbd5f010bfff736457a114f9b6eb2", + "timestamp": 1429578056, + "fee": 555, + "version": 0, + "tx_body_hash": "1ca0a2d44b6439b91eb839e0f99405abdcafe2c1a49c8b49b1739498129bd1a6", + "ux_hash": "61157b2d787b3955cee3d5c9b2c1793917e35a96122e1e2d751db4c7c2acfe30" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "1ca0a2d44b6439b91eb839e0f99405abdcafe2c1a49c8b49b1739498129bd1a6", + "inner_hash": "1090d10a5a2210dc205d6f8447918670f9351feed057c76423629b4699777dcb", + "fee": 555, + "sigs": [ + "39817412c5edb4cd928aa3b79a022d4b3276af74eb377d3821c1e95e4d6c6acd61ebbf5eb5d32f87686b6cb4f09c2660e1f148192873208fc963d67a6945fe0101" + ], + "inputs": [ + { + "uxid": "04471fb0797bb931e883f7b95cfff6ee4fea5e19a352ca5425fcd353c4f6aba4", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "750600.000000", + "hours": 739, + "calculated_hours": 739 + } + ], + "outputs": [ + { + "uxid": "6b616ad99a946538c3ab101f245bcab211ab39507848425e80cbfc8ec5bdbc67", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "738100.000000", + "hours": 92 + }, + { + "uxid": "a08089cd67896683d5dcb2d50256354e0d086b9854eb22bb6022cc459d447211", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "12500.000000", + "hours": 92 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 126, + "block_hash": "c25b843a329012e23094468a8485c6d989645478307e717db2b17c265d38646a", + "previous_block_hash": "7f18db3c23f1c460e331749b92b08495b33f9da515e821f6faba239dfc1aaf9d", + "timestamp": 1429680646, + "fee": 103861, + "version": 0, + "tx_body_hash": "a67ed00f815a2fd20d0efd18ac04663f0ee3d5621fbfdcdc6af250f19e3cfc53", + "ux_hash": "37e69db1869c70e70a342737933dc309a62528fd90ca96c7ace47ef25f28383f" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "a67ed00f815a2fd20d0efd18ac04663f0ee3d5621fbfdcdc6af250f19e3cfc53", + "inner_hash": "3587ee0a091f047bce0dc6f3a45ba08a0c95db33790c53185f6dfd626040b306", + "fee": 103861, + "sigs": [ + "7753de16df3b46c78529de293ed45ab7d566f3a2fdeeff381aa8bc903111e62c117ce54623e582dceab853fd4d9431e05bd003ae0f470db915e555d3d6dea80500", + "414a1f765e1f437799d095f76a3e0ce23ab9ebe150be93e4f3d0abd72eb403ed32ddb15d36956fc9142cd4b5875d5769803e197bab3ecf91f6b72e75087f40b000" + ], + "inputs": [ + { + "uxid": "e2512ec90800147d0d9ddbd0778511ee5a45a25efcb354c50a101738a65462c5", + "owner": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "300.000000", + "hours": 3436, + "calculated_hours": 37891 + }, + { + "uxid": "6e2abc4bc7820178358a603b7d99c4b39735dd1685d0c5a778ab63f29c9e93d9", + "owner": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "700.000000", + "hours": 20200, + "calculated_hours": 100590 + } + ], + "outputs": [ + { + "uxid": "bca6e6b24cdabecd77186a61168dd3e2290b2fda1b7a79eb3856ca4cc9f589e2", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "990.000000", + "hours": 17310 + }, + { + "uxid": "e4a83076c2ce1bd83953c1c0443054d7f5b0843c551d35b3fc3c116e9a9134d7", + "dst": "odhAMxHhXoBdx1RHNmfu7dTZ1LZivfsbiH", + "coins": "10.000000", + "hours": 17310 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 127, + "block_hash": "a5bea6636befe12f8eaef92076d54e95c00c83724d6a00a78027c0b656cf0e0e", + "previous_block_hash": "c25b843a329012e23094468a8485c6d989645478307e717db2b17c265d38646a", + "timestamp": 1429848410, + "fee": 3170256, + "version": 0, + "tx_body_hash": "243e1baa955c3f0af42d7acc4c920437dd0a99c754d6c5c2b7defcd143ff288d", + "ux_hash": "68180bffce77e7786aeac57c0db2e74788e72528a91bf51f00ad0d5a045811ae" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "243e1baa955c3f0af42d7acc4c920437dd0a99c754d6c5c2b7defcd143ff288d", + "inner_hash": "e7e030478e5828f44ec15b734638e8c2828f015b2fa5ca2823d24af3ad111ae6", + "fee": 3170256, + "sigs": [ + "1519c5c730648e7be553b2738aaeff38266735276e640c8f8d455f33c4fc07283ae5a7da47742df118337ff0548efebb1c75d0350a4e578ff95269182779db2201", + "ee099f6f42c813d13f097e9b3a8604067d6afd3718e6eeacd88fb25050d42b8603a42c4f7d24058483f70328a24fc91cd6ef190286c4a678e28b757143e23dc701" + ], + "inputs": [ + { + "uxid": "c5df36ce47f6f183475317ab1c53eaa65428c142cb3e3906bf162d80519a203f", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "12700.000000", + "hours": 2231, + "calculated_hours": 1175478 + }, + { + "uxid": "53b376413d550663ab51b229df8b0f55e4055d6577c2d8b5cec8ff748fe0e958", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "18000.000000", + "hours": 1388810, + "calculated_hours": 3051530 + } + ], + "outputs": [ + { + "uxid": "8169bf7f8fa21dc6400b60678b302946cf2765f44893ec8466262fc69b710591", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "30600.000000", + "hours": 528376 + }, + { + "uxid": "ef488d5f4a019502115d3b6b50bd364692315c3954d7e93c3ca22e11b92fc528", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "100.000000", + "hours": 528376 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 128, + "block_hash": "c55baca575f3902afc4865ccd856eae4833c7484524483df172a175c3e1a7d3c", + "previous_block_hash": "a5bea6636befe12f8eaef92076d54e95c00c83724d6a00a78027c0b656cf0e0e", + "timestamp": 1429849170, + "fee": 41968911, + "version": 0, + "tx_body_hash": "c2c9fe882df3b44fbb125b251a7604a7a4f4195dddff6e5396b7f130744e2b27", + "ux_hash": "506be1cdd8502e4d353f48440b18be3b9556b0512b1d418af79e2cacb2c9b494" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "c2c9fe882df3b44fbb125b251a7604a7a4f4195dddff6e5396b7f130744e2b27", + "inner_hash": "e23ed05dee949be1aabf237db1fd81be8d73c838eb0ee3026104807053269431", + "fee": 41968911, + "sigs": [ + "8e9b1733227a841009881663a50e1e01ac2790f16416c6f973c89e15a8fc216044e156cc8fee84d3e3cc6371e4da340f5312726bfd66f16a635542d63c869c7101", + "d1f6b7078a9032159a165ffbfb1e0665bf9ced2c3d5db795fd5bd11fc53d790f56589cbbffd117eec50aa0dc8c0e65eccb13c5ccb5d39dc9bae739a49dda03b201" + ], + "inputs": [ + { + "uxid": "6b616ad99a946538c3ab101f245bcab211ab39507848425e80cbfc8ec5bdbc67", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "738100.000000", + "hours": 92, + "calculated_hours": 55430171 + }, + { + "uxid": "ef488d5f4a019502115d3b6b50bd364692315c3954d7e93c3ca22e11b92fc528", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "100.000000", + "hours": 528376, + "calculated_hours": 528376 + } + ], + "outputs": [ + { + "uxid": "ecb92dc2f43d4c6ca124575d8456d8894f3cb137875287beaa73180fcae2b3ca", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "737200.000000", + "hours": 6994818 + }, + { + "uxid": "6143275de37a2b5ec802eeeb8d38a3dfb2db6629128e44c4f9ffc0ce8ddad629", + "dst": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", + "coins": "1000.000000", + "hours": 6994818 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 129, + "block_hash": "41bf956d514a87cff4231377b2d3487eb40ef2d804be347237caf75884f4cb4b", + "previous_block_hash": "c55baca575f3902afc4865ccd856eae4833c7484524483df172a175c3e1a7d3c", + "timestamp": 1429849180, + "fee": 401128, + "version": 0, + "tx_body_hash": "66d415598af081f8a7bd7f292468e67f380d06bf5896eb8152d4d9e8bcdf289e", + "ux_hash": "6bf11335504e4445ab91ac1d5cc80cce680a17758c343c41e69a804e74e795c3" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "66d415598af081f8a7bd7f292468e67f380d06bf5896eb8152d4d9e8bcdf289e", + "inner_hash": "3381919a36bb294377845155efa9f6ebb9314abbe5f9904b20ece45eb0960dc6", + "fee": 401128, + "sigs": [ + "0a7f9eb68798320106f652933bd07181c80571a6f66215a5b10531f1205e0f300c702324cf9c368e67fef67dc42fbfee5bb13377c435873e549d9fd6962bad9501" + ], + "inputs": [ + { + "uxid": "8169bf7f8fa21dc6400b60678b302946cf2765f44893ec8466262fc69b710591", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "30600.000000", + "hours": 528376, + "calculated_hours": 534836 + } + ], + "outputs": [ + { + "uxid": "78126a08c4dd4ea7ca2d6c9f9d4614fa58896ec4ea301cb9b450104b00bc1b94", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "29600.000000", + "hours": 66854 + }, + { + "uxid": "169e9a77557283e0d158fe6e35c439d729d73acfd00e2969147dacbdd599817e", + "dst": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "1000.000000", + "hours": 66854 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 130, + "block_hash": "b591d8741ee1c0996048ec1abf04fee1f46beac77636169f1e2399d275391bd4", + "previous_block_hash": "41bf956d514a87cff4231377b2d3487eb40ef2d804be347237caf75884f4cb4b", + "timestamp": 1430311531, + "fee": 50142, + "version": 0, + "tx_body_hash": "2df67e974b03b46be4e59fcf2f8b751d501f17f8610d5adf94551a7ecc6a58af", + "ux_hash": "b8b18ef9d97022d3f5397bdc35b9e5d411aaff0e598baa3437da9e1fc2c75f3a" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "2df67e974b03b46be4e59fcf2f8b751d501f17f8610d5adf94551a7ecc6a58af", + "inner_hash": "be6b1ad4d9985314d2bc6434f8a49cef708e7461f047154c7283e2a4ed13aae4", + "fee": 50142, + "sigs": [ + "abbfcf7922d466e79c976809cf58932a7030db6b54465a2166168617e6acdafd3d7d62391c626e9c150155c63bee7cc887d84fb5f017298a0ce7c33859b21a4500" + ], + "inputs": [ + { + "uxid": "78126a08c4dd4ea7ca2d6c9f9d4614fa58896ec4ea301cb9b450104b00bc1b94", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "29600.000000", + "hours": 66854, + "calculated_hours": 66854 + } + ], + "outputs": [ + { + "uxid": "903a1bca9b81ed76179cbcffe6e3c8eff269c94826148286f7be0b6038ee4ccb", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "28600.000000", + "hours": 8356 + }, + { + "uxid": "37cc43693a024f9122f5e1fcabeab5d53a4d58590df30a934fc7bc545936e049", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "1000.000000", + "hours": 8356 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 131, + "block_hash": "c81304abb915e3332344b876e675628dd3af311f03e975013d45fef36724bf7b", + "previous_block_hash": "b591d8741ee1c0996048ec1abf04fee1f46beac77636169f1e2399d275391bd4", + "timestamp": 1430330041, + "fee": 76257058, + "version": 0, + "tx_body_hash": "6538399868cf772fcfa96e68c51aa6aa66faa95d7c685432e4005880932be134", + "ux_hash": "0a32c89b53d12fb3b3c8ecb1de09a0d60f6a8fca12f7faa74ea5041bd469c617" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "6538399868cf772fcfa96e68c51aa6aa66faa95d7c685432e4005880932be134", + "inner_hash": "4854d5689f4c2b770d887ebf7f7d3fb975b295b0180d9354d69f2e322ae8b7b7", + "fee": 76257058, + "sigs": [ + "d213d50e53ceffd053571431b78fa6417abae8a7c5080dd3f8cece59dc61ad2444dd541540f5734d34dca94b3b975b613da0800121af8ec83b6f20d81cd53ffd01" + ], + "inputs": [ + { + "uxid": "ecb92dc2f43d4c6ca124575d8456d8894f3cb137875287beaa73180fcae2b3ca", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "737200.000000", + "hours": 6994818, + "calculated_hours": 101676076 + } + ], + "outputs": [ + { + "uxid": "6b4ca83b3f73b62161c90c6da03dff460ca9a5a3ccd6fafca140137416dedc58", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "736000.000000", + "hours": 12709509 + }, + { + "uxid": "e7756fa7a5c067d595f7300828bc4c70152653700844130d88174ba37237e2a3", + "dst": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1200.000000", + "hours": 12709509 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 132, + "block_hash": "cdfc8bac020e63a5735750e39bc23e4a309cdc4014e025268020a8019fa33c99", + "previous_block_hash": "c81304abb915e3332344b876e675628dd3af311f03e975013d45fef36724bf7b", + "timestamp": 1430330311, + "fee": 9532133, + "version": 0, + "tx_body_hash": "3dfdfea4614d05c2f5eddf5773ef0afc745f1afe585141659df8e03e82897606", + "ux_hash": "727fd416b2e4a362417cc32f425a0c6ce6ed339ac79d3fe08c43038a1a627ee3" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "3dfdfea4614d05c2f5eddf5773ef0afc745f1afe585141659df8e03e82897606", + "inner_hash": "3a4ac407aeec6233d3edf787d5b1f4d8257b594e9ee9d0ad3c32781053579b36", + "fee": 9532133, + "sigs": [ + "f37f3398240cee8e38c41945db72d4feda20f88a2250528fe1165533acdc7dfc0f99c7db0fc965847a100d0a2f598537cdd8c73a96c5fbb4e5e85dbfd9a4384701" + ], + "inputs": [ + { + "uxid": "6b4ca83b3f73b62161c90c6da03dff460ca9a5a3ccd6fafca140137416dedc58", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "736000.000000", + "hours": 12709509, + "calculated_hours": 12709509 + } + ], + "outputs": [ + { + "uxid": "2cd58783beb8a9f6278f7a097151531091b5f15afd7735e1facf02aa720c1191", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "735000.000000", + "hours": 1588688 + }, + { + "uxid": "333156ed20ba6937d3720af3a81939362b9f4ad1e9591bc676945ff0d202131e", + "dst": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 1588688 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 133, + "block_hash": "5377b5ef4c36dffa9e699a532e927898084d1a101cf557880bbc50b51a733de5", + "previous_block_hash": "cdfc8bac020e63a5735750e39bc23e4a309cdc4014e025268020a8019fa33c99", + "timestamp": 1430330421, + "fee": 1191516, + "version": 0, + "tx_body_hash": "d30cec3ad3a66562d2513a3656b366ea7da583e6ba45214ac12b9c2219b4c5ea", + "ux_hash": "8451012a69e56bc0d528bb5da1a1a7d07e3cc08a7c2b563edbb58382a6634415" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "d30cec3ad3a66562d2513a3656b366ea7da583e6ba45214ac12b9c2219b4c5ea", + "inner_hash": "58e355edef48ff22e9a83952130c1bd8fe9a7f9bec7b2e0535c103c0146604c6", + "fee": 1191516, + "sigs": [ + "09baa4739816e5a86a46ecc30df8c00a5f046ad687f0674250640b6df2361dfe3723667872e0f6deb1d3447948e30b06f02b056a62da9dbaaef4db000eab747e01" + ], + "inputs": [ + { + "uxid": "2cd58783beb8a9f6278f7a097151531091b5f15afd7735e1facf02aa720c1191", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "735000.000000", + "hours": 1588688, + "calculated_hours": 1588688 + } + ], + "outputs": [ + { + "uxid": "52288a441c70260f6a3eab0e271969d54492377615a6fba8ec3ad26f11dc9768", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "734500.000000", + "hours": 198586 + }, + { + "uxid": "8b3d335360effd00cabcae13c2495f26f81743b82958629378b7bc78a7e460fe", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "500.000000", + "hours": 198586 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 134, + "block_hash": "d42fdd801ccc75cb92fcf63cddbe05adfe6e8d580ea65de0f94332db3f2fd79f", + "previous_block_hash": "5377b5ef4c36dffa9e699a532e927898084d1a101cf557880bbc50b51a733de5", + "timestamp": 1430330481, + "fee": 148940, + "version": 0, + "tx_body_hash": "44d05abc2637d9cd2047984023eb5cfa0a146e58821117de30f9c81703189cde", + "ux_hash": "a106098a9e2bf084efe238342aff5a777f7292219deb38a6bb2b6c97fd3fc1c5" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "44d05abc2637d9cd2047984023eb5cfa0a146e58821117de30f9c81703189cde", + "inner_hash": "44886be6952cd483b9425d314836714af65037b58923aa2432ea946131ae10f6", + "fee": 148940, + "sigs": [ + "7990cb04634a5e0de397917e56480805915c73d265fe466757a9e677067483787d457c7e9931a89daa6260c7a262f49ef1503cc88008809c193f1f949badcfbb01" + ], + "inputs": [ + { + "uxid": "52288a441c70260f6a3eab0e271969d54492377615a6fba8ec3ad26f11dc9768", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "734500.000000", + "hours": 198586, + "calculated_hours": 198586 + } + ], + "outputs": [ + { + "uxid": "e29ec214f4afd79e6465d03e4d88e552dc69654750a725d74873ee366c58e552", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "734400.000000", + "hours": 24823 + }, + { + "uxid": "d95d422fb8fe4ad9ce1052e566ec8a5ad7953ceb253366814b3d32e9a1da1f13", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "100.000000", + "hours": 24823 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 135, + "block_hash": "6ff9e724f389a79b0f36dbda6c527a77a5ea848c514c5f96b67c659b57146750", + "previous_block_hash": "d42fdd801ccc75cb92fcf63cddbe05adfe6e8d580ea65de0f94332db3f2fd79f", + "timestamp": 1430330591, + "fee": 18619, + "version": 0, + "tx_body_hash": "072f0738f834db0030d777e6ec0e0443627c51cecffcc55e41d43b0b8edd40d1", + "ux_hash": "4324929e8fd4832ca1e5552636ad4d21883c4aefa5ca0b4bab47d35b6283128f" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "072f0738f834db0030d777e6ec0e0443627c51cecffcc55e41d43b0b8edd40d1", + "inner_hash": "e87dc97ec672bb45a3417f307e6f6a1cd75b26f508f188c0554484740ffea8cd", + "fee": 18619, + "sigs": [ + "da4e898bdf324ab50d8f007ee4c65ab832ba64cf86fd0a601e7007a4c3ac2eaa6f1304a3fc8088b108e3f417e5b7c90cbc7d80c059885d397ae978da89c92d5f00" + ], + "inputs": [ + { + "uxid": "e29ec214f4afd79e6465d03e4d88e552dc69654750a725d74873ee366c58e552", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "734400.000000", + "hours": 24823, + "calculated_hours": 24823 + } + ], + "outputs": [ + { + "uxid": "8ea58a3736b35f0e3781e94198e8b73bba2536704b84b15900fb32701db8893e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "733400.000000", + "hours": 3102 + }, + { + "uxid": "617b584bb9e6b1d80daac915fb3079b22a326777d1515a40e7b7eddf427f4099", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 3102 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 136, + "block_hash": "227f82c4b9f509c3f346f0222855b3311924dc8bbcfca3e2e7431592373df2d5", + "previous_block_hash": "6ff9e724f389a79b0f36dbda6c527a77a5ea848c514c5f96b67c659b57146750", + "timestamp": 1430330851, + "fee": 2328, + "version": 0, + "tx_body_hash": "b9a795552bec1a722718b44a08ad152656242b1d23afb53d2247b3016d920b7e", + "ux_hash": "7f9134d8a5f432976a4fa787df29a481f8d74e2a8da7138cd19662b3bef08ffe" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "b9a795552bec1a722718b44a08ad152656242b1d23afb53d2247b3016d920b7e", + "inner_hash": "8096fec4a2738f5b79df5359724f6cd7597c0d8c5bc18419f5825c5312e1dac0", + "fee": 2328, + "sigs": [ + "315cc1de04ad6d1d68e9d63027cff2abc74d5b11a376623d70211ac0e8b9feed4c7f7952634d60b57604edfbe63f02bef172486320e9790d0bb6e44099d6473500" + ], + "inputs": [ + { + "uxid": "8ea58a3736b35f0e3781e94198e8b73bba2536704b84b15900fb32701db8893e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "733400.000000", + "hours": 3102, + "calculated_hours": 3102 + } + ], + "outputs": [ + { + "uxid": "a1ed39cded6d9a0605b52f25cbedb363e57a168d1ad1d1db437816a401c061ab", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "732400.000000", + "hours": 387 + }, + { + "uxid": "e00c292e151fdafd24984b2dc08a4a328150006f95afaac9909dbffae1f07eaf", + "dst": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 387 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 137, + "block_hash": "7597c9f66417a8899eda6964240907092e878cc192b235b6e1a06a288de2d733", + "previous_block_hash": "227f82c4b9f509c3f346f0222855b3311924dc8bbcfca3e2e7431592373df2d5", + "timestamp": 1430504186, + "fee": 291, + "version": 0, + "tx_body_hash": "fc02772662176c282c2b6538732d3d6eb1399f006a0b52e64d07fc104038f638", + "ux_hash": "1a75b074da1b7e3e6fe9b26cd4a175ebe89e16c3f8917cfffa0ecaa458a5e075" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "fc02772662176c282c2b6538732d3d6eb1399f006a0b52e64d07fc104038f638", + "inner_hash": "a7ef2323ca6ef0a15173dcc2ef44c0abd10933be70337360408ffb4087affb80", + "fee": 291, + "sigs": [ + "9a30550db56d9c9ae901d835f856761b9c4298d56ffa94bf41eff5550ac180851189f2adf2e184b6f23485a1405eacb2d4cc937ff05490fb0bc609e654effd7900" + ], + "inputs": [ + { + "uxid": "a1ed39cded6d9a0605b52f25cbedb363e57a168d1ad1d1db437816a401c061ab", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "732400.000000", + "hours": 387, + "calculated_hours": 387 + } + ], + "outputs": [ + { + "uxid": "f89c968840831d03abaf3c41cf8a405e4b4ddbfb19f5ba300a8ea8e4dcb1d9a4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "731400.000000", + "hours": 48 + }, + { + "uxid": "b6b6188973b600af774ad8a7b6d454f77713a51463b9a9a70c901ec5280a9789", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 48 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 138, + "block_hash": "205b52696e2ddc66a276041abeaff192865672a34678046e7b88c4c8d64543b1", + "previous_block_hash": "7597c9f66417a8899eda6964240907092e878cc192b235b6e1a06a288de2d733", + "timestamp": 1430504236, + "fee": 36, + "version": 0, + "tx_body_hash": "9880bebc51471e0b3c520920db836d674f652503314cd74069a59ccad0d0967a", + "ux_hash": "b113407099fd9542a9925c4b1e09e62350b2d6151731358a1c8187a7ee38024d" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "9880bebc51471e0b3c520920db836d674f652503314cd74069a59ccad0d0967a", + "inner_hash": "feeb2f638e91dd685e6fe179edc7622ef3fcc8a5a7e795c07be12e03f221f67f", + "fee": 36, + "sigs": [ + "a0c15d7d5f36afc4c78045aae19c8d41a8652f0cb6d633622a1e55b4e54cd5a33113b02c24b02cca10797043d992aaac98bdbb33addd038611ac324795733c0b00" + ], + "inputs": [ + { + "uxid": "f89c968840831d03abaf3c41cf8a405e4b4ddbfb19f5ba300a8ea8e4dcb1d9a4", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "731400.000000", + "hours": 48, + "calculated_hours": 48 + } + ], + "outputs": [ + { + "uxid": "36972dc046829caa340eaecbfeb42f4174bcdecfb87296d56503e5fb10e9de8d", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "730200.000000", + "hours": 6 + }, + { + "uxid": "bceafc261a2250f1bfb8154aea88370acfe6a41a4216bcb76c2016451cbcffd1", + "dst": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1200.000000", + "hours": 6 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 139, + "block_hash": "9c31d9340bc0aab07837b78625468101d643044d4b38d3a63ec3af92007ae9d7", + "previous_block_hash": "205b52696e2ddc66a276041abeaff192865672a34678046e7b88c4c8d64543b1", + "timestamp": 1430504536, + "fee": 6, + "version": 0, + "tx_body_hash": "578075959959db70ae86f4f60d2ae3ff245727d086eef86ed80db5e1c7c9fbaf", + "ux_hash": "f594d0d454c7216dd6575d60f64b00ab88b064110b324058e094e1d632c40301" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "578075959959db70ae86f4f60d2ae3ff245727d086eef86ed80db5e1c7c9fbaf", + "inner_hash": "eead8ec3c5e86e73f1e7add274fdbe0cecd5cd68c4fcd3cf17c1c7af9c5ee43d", + "fee": 6, + "sigs": [ + "d6331b6d3270100b8b009bbd343d6b82208d622b27ca3a4b371492b9c792f8433c981c57dfc760a3974f13acd86bbb24555b958e0c67e247c5a39d97295022d601" + ], + "inputs": [ + { + "uxid": "36972dc046829caa340eaecbfeb42f4174bcdecfb87296d56503e5fb10e9de8d", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "730200.000000", + "hours": 6, + "calculated_hours": 6 + } + ], + "outputs": [ + { + "uxid": "6962c7c1fcc98f532a9003990163bb251811a4700257968a641b1fe975cfc51d", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "729200.000000", + "hours": 0 + }, + { + "uxid": "278b0caa6dddf4ce74772471b15fb9a8c364362b0ae3eeb9379e980504d8d512", + "dst": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 140, + "block_hash": "939d45a9e5f77daf83af0dd2346f69d92a2ee7cc118038bd20d16ccf848ad344", + "previous_block_hash": "9c31d9340bc0aab07837b78625468101d643044d4b38d3a63ec3af92007ae9d7", + "timestamp": 1430504746, + "fee": 0, + "version": 0, + "tx_body_hash": "de45a24c9c32f808a3d928f30ba8e1b6ef8117a7c0b7a5d616734d9b121d0c30", + "ux_hash": "1ae1ea96ca1845708759569144b21b6646d615c0e4d5237a7b6a55d868f9dd27" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "de45a24c9c32f808a3d928f30ba8e1b6ef8117a7c0b7a5d616734d9b121d0c30", + "inner_hash": "efeb898fd032831cdd6d7c311f496f4c2622ee11bedc2831b6411cab51d44736", + "fee": 0, + "sigs": [ + "1646b02579d23e2350e2bc47340e027ad5f74bf55aba41fc1244631ba1e0577b681d364c3802017b5cc5d5fda972d23ac9bffabd6159384223a26aba5f08406401" + ], + "inputs": [ + { + "uxid": "6962c7c1fcc98f532a9003990163bb251811a4700257968a641b1fe975cfc51d", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "729200.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "d53fae3b48bde2d1328964a2e7f42e8e833983db159ba30f627926dea0db7df0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "728200.000000", + "hours": 0 + }, + { + "uxid": "cfdefd8d167947190a223882d20c8ac7880e550ad1a3494bb05bff4b1df4e3ff", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 141, + "block_hash": "71ad597d194d7090c1b3bbb8b37dc281fede373eaa81dab6d07226460f36e7b5", + "previous_block_hash": "939d45a9e5f77daf83af0dd2346f69d92a2ee7cc118038bd20d16ccf848ad344", + "timestamp": 1430504846, + "fee": 0, + "version": 0, + "tx_body_hash": "16f8b9369f76ef6a0c1ecf82e1c18d5bc8ae5ef8b01b6530096cb1ff70bbd3fd", + "ux_hash": "62c012a54d2808a078f06d0bde3bdfb54c5a1eb4df241600068b4b5726a081a6" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "16f8b9369f76ef6a0c1ecf82e1c18d5bc8ae5ef8b01b6530096cb1ff70bbd3fd", + "inner_hash": "529b1fd21087bf52cb3ebcf02dbe1e3ce5de9daefa9754e5b6cde7be2d8ab0c7", + "fee": 0, + "sigs": [ + "8612c9e160f3e0d7cdcb2adf3611bde867dcb766c63ec4312a9251ba9b6ea6997c0d9a6ce26beaae01e82c22d2b61e5ae7f87aeaf0679fde395888aebafde94500" + ], + "inputs": [ + { + "uxid": "d53fae3b48bde2d1328964a2e7f42e8e833983db159ba30f627926dea0db7df0", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "728200.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "228794e6b3eb69aecc5334e140afbad22883326dcf229bd3092f238ed9ec800f", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "725700.000000", + "hours": 0 + }, + { + "uxid": "908fe94bd28886547f1b7b4fc98d0990a08a216b70877341f566b6b4685de364", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "2500.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 142, + "block_hash": "5415760993e68334d9c577322e1c0b81f16ca724417174193c243ad8acef5765", + "previous_block_hash": "71ad597d194d7090c1b3bbb8b37dc281fede373eaa81dab6d07226460f36e7b5", + "timestamp": 1430504966, + "fee": 0, + "version": 0, + "tx_body_hash": "030177271beee04f1a0974d0c5042f07c7ca1db1c5d496fbee3c441b1b7c5bee", + "ux_hash": "f115d4e6e4f10823d5ebb04e913f61a42f6c77a5184d5f5f4af9a5691d94e1a5" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "030177271beee04f1a0974d0c5042f07c7ca1db1c5d496fbee3c441b1b7c5bee", + "inner_hash": "d954f0ee1a437cf3809961063145bb205633ac66d9a29e1386eddb13503ddac1", + "fee": 0, + "sigs": [ + "6e5661f0212dfa0800df968dac30f931335d7fe99d23932878d7d2c06bf69691328d66897c3a5c023535035ed95de3b396ea162e4482e70cda5ec9d4c8e36d4b01" + ], + "inputs": [ + { + "uxid": "228794e6b3eb69aecc5334e140afbad22883326dcf229bd3092f238ed9ec800f", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "725700.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "6efc30b4c943ba4de8d2c89901a0b2a4d9a0ecf34713917eae37c6debca616ed", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "724700.000000", + "hours": 0 + }, + { + "uxid": "18293d947aadf89d9e57d18fa01408867a9abe267504edbdabf8c2a57d9a6323", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 143, + "block_hash": "a6f2d5edeea837fd64c910f9dd0f09cb28f689e014a4f602376aeb7bd36ebc37", + "previous_block_hash": "5415760993e68334d9c577322e1c0b81f16ca724417174193c243ad8acef5765", + "timestamp": 1430505086, + "fee": 0, + "version": 0, + "tx_body_hash": "57150aecde96bde972183b9b0d7d27dda2c0179fb71630e92c27856d211335cd", + "ux_hash": "54090e16ca9d400aabf58a043688129ad46451dc200abcc9acaaee6278af6707" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "57150aecde96bde972183b9b0d7d27dda2c0179fb71630e92c27856d211335cd", + "inner_hash": "8fa5487fbcb62adb17287cc80ea02f113f036035e486fe7a37a96a98d32582b8", + "fee": 0, + "sigs": [ + "ba2442a6f68ef825f2921dc135eca398904426f8d225eb122b210670d1b3bf1b2279abcd5cce5c18533dd8ca0286b23e2be9605f1cb6a5820bc1c783e95b833401" + ], + "inputs": [ + { + "uxid": "6efc30b4c943ba4de8d2c89901a0b2a4d9a0ecf34713917eae37c6debca616ed", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "724700.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "6c8b1ba9dc7e8900b42d55e9fbe6ea0e00d7eaccf67a7b66c0a2b771cf88ea05", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "724200.000000", + "hours": 0 + }, + { + "uxid": "456bcb0a2e57a5c20f2757c8fc7669af1f969bb5a57f89965210daf7107993aa", + "dst": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", + "coins": "500.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 144, + "block_hash": "ad7799389d51ded0047284b4ab00fef54496c30b7ec21c5d22bb93431f5601a6", + "previous_block_hash": "a6f2d5edeea837fd64c910f9dd0f09cb28f689e014a4f602376aeb7bd36ebc37", + "timestamp": 1430505176, + "fee": 0, + "version": 0, + "tx_body_hash": "3bb9fc516dc2c522e28f99e6833253863c550547ce0e0a2dd963a0118b7a44a7", + "ux_hash": "95f733b768d9fa3958e49d04e9f0c7c69cfc909c57d80895e76893271d294106" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "3bb9fc516dc2c522e28f99e6833253863c550547ce0e0a2dd963a0118b7a44a7", + "inner_hash": "111d56ae43b76740e905717e1e440f7611e922c50e83cf84b9edc51efa0271f2", + "fee": 0, + "sigs": [ + "18f2b86a6b51999f0fdc73d411c1db827730652ba2c098f1ff3f3dc0d409d6cf745d18d66bf25dae7e5a975e33f32e8d2b352c025a8e20ff15a68aaa60b1bbb700" + ], + "inputs": [ + { + "uxid": "6c8b1ba9dc7e8900b42d55e9fbe6ea0e00d7eaccf67a7b66c0a2b771cf88ea05", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "724200.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "59d44fefbe86ebae4118dee90609d6a1c08c36f259c65e3fad63b9e41c37bf0c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "723200.000000", + "hours": 0 + }, + { + "uxid": "d8ee5dc5cabcf179365345167d39977ae38a71e55cf357881258be32a45732bc", + "dst": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 145, + "block_hash": "cb389e98bed24ef05313da0275c4b8e4d8038442b06d49fafa6217531fbc9963", + "previous_block_hash": "ad7799389d51ded0047284b4ab00fef54496c30b7ec21c5d22bb93431f5601a6", + "timestamp": 1430550936, + "fee": 693939, + "version": 0, + "tx_body_hash": "f25c1a8a4ae37e8e2b4a0ec6f2553cf11c57fa77de9556cd227857ca270a0275", + "ux_hash": "44eb50878e0a7eef3d8a7c026d9aec54507eb2d28c4898a8172f682a806e1480" + }, + "body": { + "txns": [ + { + "length": 280, + "type": 0, + "txid": "f25c1a8a4ae37e8e2b4a0ec6f2553cf11c57fa77de9556cd227857ca270a0275", + "inner_hash": "c41100ec46608d1982d52cce518abf64c3853a0fff71349c001accff2204de2a", + "fee": 693939, + "sigs": [ + "f5521c2b488dbbd7bd856275b903e176f61a5cc940855d502493b834755fa9037cdf484fef8b3c7950ee166fa1db7bacc5ed18f96b48e13f849c96d76463dd6800", + "f324406fc1ad817ad53cd6d7718b914172ed80828650a6c7a4bd69143dd6be5e681ad4cc897ba5f237bb40836368c580e3fc8231c80ad0f91bf1fd17df28f3b800" + ], + "inputs": [ + { + "uxid": "c2fcd55cf6b73e863c96f7c2d6251069199bfd43688d2515f5c6631688aadcbc", + "owner": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 5, + "calculated_hours": 396519 + }, + { + "uxid": "06292fe8a2036c38f28c4d2f355d9e86e2b55b9d85f84613a64cf5c35d192b28", + "owner": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 43, + "calculated_hours": 396554 + } + ], + "outputs": [ + { + "uxid": "7afab03c823346ff8b00c29df6acc05841583d90dfd451ba09e66884a48e83f7", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "2000.000000", + "hours": 99134 + } + ] + } + ] + }, + "size": 280 + }, + { + "header": { + "seq": 146, + "block_hash": "2e2d340c74deff80c804908b46a355605fdad219e70839d2288dfaffd5d8ff3b", + "previous_block_hash": "cb389e98bed24ef05313da0275c4b8e4d8038442b06d49fafa6217531fbc9963", + "timestamp": 1430641376, + "fee": 6894507, + "version": 0, + "tx_body_hash": "5701965d326520f86335da87c6d1781fd49f1e66520b94e1783711eba724f482", + "ux_hash": "f0108adf2f599f235b4ead2f672d7d8625243d6e0b2d1e880e2c77248a574e0b" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "5701965d326520f86335da87c6d1781fd49f1e66520b94e1783711eba724f482", + "inner_hash": "b792056beaf4a864c92e40ad63f9117fae52f4bfda9f88aa74f1255490c28ef6", + "fee": 6894507, + "sigs": [ + "1d98fdd17853e4265c17644a993fdbe5047418b7be96258fdf3c2b3e9c739b1d72c5acc23981dac2d478966834fafa1f98aab2402ce37fe818d3919cf490a5e900" + ], + "inputs": [ + { + "uxid": "59d44fefbe86ebae4118dee90609d6a1c08c36f259c65e3fad63b9e41c37bf0c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "723200.000000", + "hours": 0, + "calculated_hours": 9192675 + } + ], + "outputs": [ + { + "uxid": "5baf8c8ab1a01d80a6f496144815cf6bda5289b34055010e21324ea3950d3299", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "722200.000000", + "hours": 1149084 + }, + { + "uxid": "3dd82b00ef4d1e3b1c71be5f13c0c82b3e2b17af4a6b3eb4c966490f47866ccd", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 1149084 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 147, + "block_hash": "cf865cf260b6cf99c38563043300120213ddd03e385210e26c8b5ce8de212834", + "previous_block_hash": "2e2d340c74deff80c804908b46a355605fdad219e70839d2288dfaffd5d8ff3b", + "timestamp": 1430641536, + "fee": 861814, + "version": 0, + "tx_body_hash": "3fae944ef07d9bcba1bcbc8bde87da50a1232132074803f8442deb563ed2da51", + "ux_hash": "4b96fbb3a8ee726762486b7de743da01f7d5e70f6eeb3d3ed9ee1d27b5a07acd" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "3fae944ef07d9bcba1bcbc8bde87da50a1232132074803f8442deb563ed2da51", + "inner_hash": "aeceb514529fcf9de954599318d804301689818b8d5c90cdbd3bdf6ce3768c47", + "fee": 861814, + "sigs": [ + "b6b837c14a65c31150c24f93ac60a9b49baeb963cf49a8d97e817883ca46a3763168988b69542c5a52b7501674271ded3888bccda558aad004902ab7b7010f5501" + ], + "inputs": [ + { + "uxid": "5baf8c8ab1a01d80a6f496144815cf6bda5289b34055010e21324ea3950d3299", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "722200.000000", + "hours": 1149084, + "calculated_hours": 1149084 + } + ], + "outputs": [ + { + "uxid": "dd07d759d92e3d628a35c467dcd919dcae825a9fa79a14855714270dae08c0ce", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "721200.000000", + "hours": 143635 + }, + { + "uxid": "3ec30639c24acce65054bdb0d7ab0539199b64cabfcad83c2ed7f266fb8849a6", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 143635 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 148, + "block_hash": "89f6c33a3c65eadc28e5f84fb25422d21fd06f98ae60b824b8eccfddaaa24fb9", + "previous_block_hash": "cf865cf260b6cf99c38563043300120213ddd03e385210e26c8b5ce8de212834", + "timestamp": 1430642006, + "fee": 107727, + "version": 0, + "tx_body_hash": "79681167a7681edecb998e4a6dccdd0b7be45f163c8f6db23436517936269fb8", + "ux_hash": "39f1cd4b28dc61b08253bc51d39405ad8a35df87bee822f95e5259cb3dd202bd" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "79681167a7681edecb998e4a6dccdd0b7be45f163c8f6db23436517936269fb8", + "inner_hash": "b06c37ee520387277d5c174e0fefb11dbbbee9c7ffe53715b7b5bab8f4693dfe", + "fee": 107727, + "sigs": [ + "150ffd203e65dac9dbfcaffb384a9233a274e0ced5a0c2fc9a3127e7a85df894124a5c1f0501c60640dce7d7c09cd1783ed61461f285fa89e6227ba1b427e81d00" + ], + "inputs": [ + { + "uxid": "dd07d759d92e3d628a35c467dcd919dcae825a9fa79a14855714270dae08c0ce", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "721200.000000", + "hours": 143635, + "calculated_hours": 143635 + } + ], + "outputs": [ + { + "uxid": "c739b518f3f700e810f81523d81b15f968fbf202f389ceaa9d9f303319a00275", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "720200.000000", + "hours": 17954 + }, + { + "uxid": "5233e499bd3e38ec4d4fa4d750290f25271c91b4903630d461be51f3c2c02ebd", + "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "1000.000000", + "hours": 17954 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 149, + "block_hash": "4756bf71efc974ffaa99a1e06a9ca9cbe57784979cf270e72cd0e1955e777db5", + "previous_block_hash": "89f6c33a3c65eadc28e5f84fb25422d21fd06f98ae60b824b8eccfddaaa24fb9", + "timestamp": 1430642106, + "fee": 13466, + "version": 0, + "tx_body_hash": "b69536fbec9911da41e9d0c5ca73459f5e692ba155f8b72c0972792e9937a0fe", + "ux_hash": "ad890aa64b317d35948020e68f3e655ab582914fc4e92d62c58c00d3dc5c9478" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "b69536fbec9911da41e9d0c5ca73459f5e692ba155f8b72c0972792e9937a0fe", + "inner_hash": "a6d1d92496583cefdf9a9d4e278cdeac9d8e7c31eec3061f0a91bc0116ced8e4", + "fee": 13466, + "sigs": [ + "d98168e1f19fbabcf0ec9fdf21d36486a2d70b13624bd2ec765bc773a08c7f5c09c7df2664e3205c7555bd3c5cb64ca78f5f0a81613ef4a7d740348e0132caf901" + ], + "inputs": [ + { + "uxid": "c739b518f3f700e810f81523d81b15f968fbf202f389ceaa9d9f303319a00275", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "720200.000000", + "hours": 17954, + "calculated_hours": 17954 + } + ], + "outputs": [ + { + "uxid": "95694746f813d018be7988aec666b52924a7815adabe9cbdac3f6ab0f51bd1ab", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "719200.000000", + "hours": 2244 + }, + { + "uxid": "eb57ec196fe95a09be19b62b6837d5d12f99568ad0e5e198f70f55083acd656e", + "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 2244 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 150, + "block_hash": "746494f2e6aaa279cabea4cc0d46b1d95044e3f778fa26d39d21f5bf505cf2dc", + "previous_block_hash": "4756bf71efc974ffaa99a1e06a9ca9cbe57784979cf270e72cd0e1955e777db5", + "timestamp": 1430642306, + "fee": 1684, + "version": 0, + "tx_body_hash": "3e228564e3c187e22bd489857fdb1db7036021e19f688aad56cfee57d5e13ac5", + "ux_hash": "95367619af0f79026961c6458133ca702e8e98850a9a45295b8951d5f25feb8c" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "3e228564e3c187e22bd489857fdb1db7036021e19f688aad56cfee57d5e13ac5", + "inner_hash": "9b4783f4cd11a81e945a2d09b699f76254caa3bbf22ce8533f3b9f179c207702", + "fee": 1684, + "sigs": [ + "8bd5632a52c39ef9e9ce90ebabd119c8f93e32a5a5b6e8fe80c58163b4adcc040725f18321894b59c3546c8ce9fb182e1a4dd6a3b4405229635e3ac3d80213a700" + ], + "inputs": [ + { + "uxid": "95694746f813d018be7988aec666b52924a7815adabe9cbdac3f6ab0f51bd1ab", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "719200.000000", + "hours": 2244, + "calculated_hours": 2244 + } + ], + "outputs": [ + { + "uxid": "be958e5c47415291a781648335db24e448e1f4f09aa5e9c3f055fbc906b574d7", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "719100.000000", + "hours": 280 + }, + { + "uxid": "0fa23085def7c1dbc95587d3f0f58cbc30b09e099ee1afa42d9120452777740a", + "dst": "sV8sVBgs11uHQtZK5MPbYem2iJ6Hehghv7", + "coins": "100.000000", + "hours": 280 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 151, + "block_hash": "8fe743db56634fe05a28ac3479ff4b35c2324f8fde1115b582f85e42eda95482", + "previous_block_hash": "746494f2e6aaa279cabea4cc0d46b1d95044e3f778fa26d39d21f5bf505cf2dc", + "timestamp": 1430642426, + "fee": 210, + "version": 0, + "tx_body_hash": "18607765c3fbd45eafa15d2d62ab3cbc7ba7bd80c42931aae4db75aa02898671", + "ux_hash": "4b266d1cb0d20833a2a43044948aaa83c1b4881144b7616ae02b3ee85c13c292" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "18607765c3fbd45eafa15d2d62ab3cbc7ba7bd80c42931aae4db75aa02898671", + "inner_hash": "dbbf7608b67e82363ced90b364a9b8c91029b336ef2b68182d986e399eacb41a", + "fee": 210, + "sigs": [ + "1972310d45a5baf10a8d929a132c725c51cdd19daae3baa640570aeadbb08ea700fbe46e6649289bec61065b05250b84872002f93634e6be81bae042cf80854b01" + ], + "inputs": [ + { + "uxid": "be958e5c47415291a781648335db24e448e1f4f09aa5e9c3f055fbc906b574d7", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "719100.000000", + "hours": 280, + "calculated_hours": 280 + } + ], + "outputs": [ + { + "uxid": "68165429853e18e4414ec6c15630262ebcaa802ff1d83b6cbe116db51cb32066", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "718100.000000", + "hours": 35 + }, + { + "uxid": "efcb1b5f54bceb2d0124d2f89c47d071c2943fb228c2eee62bfddf6e1418cfc8", + "dst": "pMub1Pz3SLVaSwHoomgp5oDVxdkVxLkW6L", + "coins": "1000.000000", + "hours": 35 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 152, + "block_hash": "febfd5d251995c214b17c3d71972f7048a171982fe7f4f7abb6998b485b95cd1", + "previous_block_hash": "8fe743db56634fe05a28ac3479ff4b35c2324f8fde1115b582f85e42eda95482", + "timestamp": 1430642546, + "fee": 27, + "version": 0, + "tx_body_hash": "dc10e0565a14dfecda066577581f3e2d073de34ed3e911ed94413d38fc0a33d2", + "ux_hash": "170ad8a7f0d8441091341dc79a0c7c04d46ea47e60e58623a71b442656050a68" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "dc10e0565a14dfecda066577581f3e2d073de34ed3e911ed94413d38fc0a33d2", + "inner_hash": "821dfa6422bb093a528a2ec2bedd0566599cef3e2f4f91441f3073888e092832", + "fee": 27, + "sigs": [ + "1bb9e5e58a4a7dfc9a29bb22eabb2ee4dc6e40dd71b35962adf95d1c1208309727f070257b4591e959a4965cb8d22710233dd1f65c3b58ec47bb71e3d7ebd3e700" + ], + "inputs": [ + { + "uxid": "68165429853e18e4414ec6c15630262ebcaa802ff1d83b6cbe116db51cb32066", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "718100.000000", + "hours": 35, + "calculated_hours": 35 + } + ], + "outputs": [ + { + "uxid": "46aeb9ea01bb04e28c55ef11f8e75434dbeee546f7e06bdef332c604590c48a1", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "717100.000000", + "hours": 4 + }, + { + "uxid": "c0548bf35c950a74c206d2c565e3bcac1f2abe170ebabdb7b74e439b642dd9fd", + "dst": "22WGCstVJGVyqnBuvGHt17L5aNNMpURvckd", + "coins": "1000.000000", + "hours": 4 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 153, + "block_hash": "84dbe57c5d58b0b412d23e66e47578df7be40779c3dfb55178e08d1aa7921df5", + "previous_block_hash": "febfd5d251995c214b17c3d71972f7048a171982fe7f4f7abb6998b485b95cd1", + "timestamp": 1430642816, + "fee": 4, + "version": 0, + "tx_body_hash": "b0d7ff47658b3e32d8457eb62f6df0c7caaf7feadcbf8cc0c713976026f0404c", + "ux_hash": "9fd52eaacfbcc7b88318fae11a7723eddf1184868d159dd7083bce0cb025e375" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "b0d7ff47658b3e32d8457eb62f6df0c7caaf7feadcbf8cc0c713976026f0404c", + "inner_hash": "5154559a3393277ed8db279bf27a9572c9aeebe81f321d9fb07a5e4313005a90", + "fee": 4, + "sigs": [ + "a3edf9a3203fc696aefde6180d6c28fbaf3f4ee662ea90d82a93c3a8485593465f956713abfea8322b952d61969b29267f3826775638da77a1bf8567a40564e500" + ], + "inputs": [ + { + "uxid": "46aeb9ea01bb04e28c55ef11f8e75434dbeee546f7e06bdef332c604590c48a1", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "717100.000000", + "hours": 4, + "calculated_hours": 4 + } + ], + "outputs": [ + { + "uxid": "598503902d2e6cb62d6f6478f09d8da05af6fd2da92b50825da3b7f74b2df34c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "716100.000000", + "hours": 0 + }, + { + "uxid": "045dc2e76321e37884588093083ce1b21be12f20ba1fa36f2a755b894229e3cf", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 154, + "block_hash": "54c4a6402aa7074c6857844f64e185401d674c4e6f15627b5c1a8fd3e0e568f1", + "previous_block_hash": "84dbe57c5d58b0b412d23e66e47578df7be40779c3dfb55178e08d1aa7921df5", + "timestamp": 1430643706, + "fee": 0, + "version": 0, + "tx_body_hash": "be0957035ed2ac444f67273fc5c1c6a39ee373f6f83d1604d0023742a8cd7e42", + "ux_hash": "56b56c56ad0aaaf6b7ce3e3845f74776049887c452974d68b46af72e8ca30136" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "be0957035ed2ac444f67273fc5c1c6a39ee373f6f83d1604d0023742a8cd7e42", + "inner_hash": "957140523c9acc14a4f6b6a2fd05e70c58d2ed51f43b4e88b1406b398f4e7b2e", + "fee": 0, + "sigs": [ + "ee25ac881aa867780086df4716864a9ec524deeecc140faa60b9f9b87805816c22659836b5169f8eab0977a2337638b6ed7cd7c4a5d4ee3664e7ad28e91dd5b901" + ], + "inputs": [ + { + "uxid": "598503902d2e6cb62d6f6478f09d8da05af6fd2da92b50825da3b7f74b2df34c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "716100.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "4b917e7bd3409c43f9f670f2846ce74f9288708df5aa1d9ae142f2411ce426da", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "715100.000000", + "hours": 0 + }, + { + "uxid": "dbc58940c2457359501c9906589c3d0a0ab7695b983ad79f2bcc087a675671f6", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 155, + "block_hash": "04d1b2a0a9e6ab9035cb8265cb2f75af6a5c31bb9a6f927f545be08a9b1379cf", + "previous_block_hash": "54c4a6402aa7074c6857844f64e185401d674c4e6f15627b5c1a8fd3e0e568f1", + "timestamp": 1430643906, + "fee": 0, + "version": 0, + "tx_body_hash": "c9582c8134fa64fdf08cd93d42035adcced3f16aa8ee1a1393e3fcd7c07aa40c", + "ux_hash": "6f2840ca10cb769938ff77900c1bead9f5636b33a59fbd7141b00e9b8ea35e85" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "c9582c8134fa64fdf08cd93d42035adcced3f16aa8ee1a1393e3fcd7c07aa40c", + "inner_hash": "ecd6b0cab28125e3ec1fe23a046c259a7d608802da7d6397dbd8b410de03b94d", + "fee": 0, + "sigs": [ + "95e5d5d0856bf5387de8fbdae05f5953510fd85ec346e65fa5fb68984bdb1ab83aa7807e57f00354d934f84a0034ecf8aa74fe3b8e9e480021873f62827770ab01" + ], + "inputs": [ + { + "uxid": "4b917e7bd3409c43f9f670f2846ce74f9288708df5aa1d9ae142f2411ce426da", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "715100.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "d50a372f8f8cd1e0b10d847613b68ee760f195f5f212d6c59e86312c84dd07ac", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "714800.000000", + "hours": 0 + }, + { + "uxid": "25a72cc385c1cdabd0ffd7c141ae205d767f3d016c281f835b9f58f9325bd2a5", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "300.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 156, + "block_hash": "ce3bfce7158586ef1c9080fd8e8dd2017ebb7ec2a9634b03cc2c359fa4cefba6", + "previous_block_hash": "04d1b2a0a9e6ab9035cb8265cb2f75af6a5c31bb9a6f927f545be08a9b1379cf", + "timestamp": 1430644036, + "fee": 0, + "version": 0, + "tx_body_hash": "29a883ef9dc67bc683014187b9865c827b5e2f8afd7bf6f3787483318063789e", + "ux_hash": "f407bdb9a454483ea14752c56c622b4268b2bd74f3fc6aab24dc769beba45c4d" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "29a883ef9dc67bc683014187b9865c827b5e2f8afd7bf6f3787483318063789e", + "inner_hash": "bf3a81668fb27c0f55d9ec33490cb4c91ec7636ec1f85761fadbfebc020a618a", + "fee": 0, + "sigs": [ + "970a22ba9a849caf00fc787a182dd67a3be794db9d66c691e9d904a78f90397542dee63e801c8b7f4077060fda76f0ac56a67b30865cc4634679f118abe04fc101" + ], + "inputs": [ + { + "uxid": "d50a372f8f8cd1e0b10d847613b68ee760f195f5f212d6c59e86312c84dd07ac", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "714800.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "896865f9b610f9fb69a741596b3ecb9fff3790d40476a9f7852831bdf477aaee", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "713800.000000", + "hours": 0 + }, + { + "uxid": "a34cfb6f175323917dfda72d58ddcfb86363cc43d22a0c6c3141810f5cac5aa6", + "dst": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 157, + "block_hash": "05187ea3b0ba876a138a518ac4d1ff1100251701481d348e8c94864bb2b00435", + "previous_block_hash": "ce3bfce7158586ef1c9080fd8e8dd2017ebb7ec2a9634b03cc2c359fa4cefba6", + "timestamp": 1430673946, + "fee": 0, + "version": 0, + "tx_body_hash": "c3fd04cd27ea311b1a67d40cd3dbb2ea8ae2c6f6139620cb86be29f33ed99171", + "ux_hash": "477f749b867d0a5c50ada0728e9781a15380ad5a23d4fd62c91c617164739b40" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "c3fd04cd27ea311b1a67d40cd3dbb2ea8ae2c6f6139620cb86be29f33ed99171", + "inner_hash": "5a975ee4a0f95c51a0a847b1d082bc4859a4b7904acbaece151c58e01f26a870", + "fee": 0, + "sigs": [ + "06c22eb6cb03468010ffbd2b54faa5835ea44cf552779b0adb09817db7e5494d49031d2e4b8994b670857b193766a1f430857955edd627f290f71f970407139b01" + ], + "inputs": [ + { + "uxid": "896865f9b610f9fb69a741596b3ecb9fff3790d40476a9f7852831bdf477aaee", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "713800.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "272d5bbd86a87796a20e3e4debc46a2076718800343bee4f72fc0217a98a10a3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "695800.000000", + "hours": 0 + }, + { + "uxid": "25130a18aca13a37e4f4c08733cdda6a8629759f27ecba775999486c9deffa5e", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "18000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 158, + "block_hash": "3437e493d6e8a8a970b549eca7592ae46da9e243c75694de0e214f82740a0199", + "previous_block_hash": "05187ea3b0ba876a138a518ac4d1ff1100251701481d348e8c94864bb2b00435", + "timestamp": 1430674696, + "fee": 0, + "version": 0, + "tx_body_hash": "3d9f1aa1b6206275081cb9c26155f6261be1ef9c94b4eaadb1a7e8277a2099fa", + "ux_hash": "bec25fbd537da53dd0516ad735e35e48355955e4c07c1eba0d1c0c1cfe9d0b43" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "3d9f1aa1b6206275081cb9c26155f6261be1ef9c94b4eaadb1a7e8277a2099fa", + "inner_hash": "ef7915c2cc32cfd043bf60533a563a89ee68a7b2f88e9e1e55e6a54494bde805", + "fee": 0, + "sigs": [ + "6d2993d471d4b27d4b0c2beef286dab7e38013853926fef032a8a10d9161fbff59b4eba58d7578182f9f1e79ee763ab409aec46748351b0a7d1a020a3fe3824100" + ], + "inputs": [ + { + "uxid": "272d5bbd86a87796a20e3e4debc46a2076718800343bee4f72fc0217a98a10a3", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "695800.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "60906201d3e7c67ddb976972460b2b8ed093e1f6720a784cbaea376ca13e6cef", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "670800.000000", + "hours": 0 + }, + { + "uxid": "c61f27a2247831679d8df293bf9351b16e8429778c875be2cb64224bcb842ed4", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "25000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 159, + "block_hash": "ff9538e4db5d5e121eca8a500c56842ce413d9a28187afeea2057bc16daf1eee", + "previous_block_hash": "3437e493d6e8a8a970b549eca7592ae46da9e243c75694de0e214f82740a0199", + "timestamp": 1430715196, + "fee": 0, + "version": 0, + "tx_body_hash": "d720ca0efb19b964f481724e5d3f932841e9e75a69b998baf4b575cf3298cb87", + "ux_hash": "1ee9f722d9a194c61afb295639ca3ffcce249a1c11c46a0d66670d3bb8fd4a6c" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "d720ca0efb19b964f481724e5d3f932841e9e75a69b998baf4b575cf3298cb87", + "inner_hash": "b35da2487dfd396bc01b5296fab691557760886b23ba5bd18e52808549dbfef2", + "fee": 0, + "sigs": [ + "9cb0a128d17a9c42f3e4e44f4da9106ef11407da8d9a434745add4c5f7a8e379325976d8c2222c3328acdc2c6ca597fab4fae292c5529e07c55919ce0e0320ca01" + ], + "inputs": [ + { + "uxid": "60906201d3e7c67ddb976972460b2b8ed093e1f6720a784cbaea376ca13e6cef", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "670800.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "4912e9dbbb5a4cc7472c27b0212ab443e7b5499207b10666a66257005e182714", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "664464.000000", + "hours": 0 + }, + { + "uxid": "b1e5c694c30326cda3df2e634723999befbcbb141415e9a36bdbf18d7bea9870", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "6336.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 160, + "block_hash": "a1c8c6cb45bb12cb563b9554d71c9fb8fe9c4d6e902b664d2a5ca6007256d75a", + "previous_block_hash": "ff9538e4db5d5e121eca8a500c56842ce413d9a28187afeea2057bc16daf1eee", + "timestamp": 1430784172, + "fee": 0, + "version": 0, + "tx_body_hash": "0e8e352b1f2cd419bca619918ce6d5ec1eac0ba7252d76eef5d9d8f8186f737a", + "ux_hash": "d7596292f43d66b82b0e121d29bf996fff6dcc40a3aa7f5cc89f093410615cf7" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "0e8e352b1f2cd419bca619918ce6d5ec1eac0ba7252d76eef5d9d8f8186f737a", + "inner_hash": "49571d7e7c6b3e473b938f1cf4748c67f9301ca710f26ee56d0d8e231cb4515f", + "fee": 0, + "sigs": [ + "8d4556a22c5fb84792cc88bfb47f795e6ba9fc211933776acd89b6da9aff71ea7803bf5b0e1d9afef2f3f77bbc4a7633c459ab9cb11a06723c4cad570717edfd00" + ], + "inputs": [ + { + "uxid": "4912e9dbbb5a4cc7472c27b0212ab443e7b5499207b10666a66257005e182714", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "664464.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "659bac1636b64087ad5d3cb0ae78c52f28ad920016ec67e08415a537e0343072", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "663464.000000", + "hours": 0 + }, + { + "uxid": "ea18f151bbdb611f73596b61ebb0546b9e91281ccb0bbe07a18e7fa69142bb5b", + "dst": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 161, + "block_hash": "fe3bc8a9bd17eb6583d9f4e806c20c8d8f89382df32f6a3b6bb8de6a2faf1ee6", + "previous_block_hash": "a1c8c6cb45bb12cb563b9554d71c9fb8fe9c4d6e902b664d2a5ca6007256d75a", + "timestamp": 1430784312, + "fee": 0, + "version": 0, + "tx_body_hash": "d5091ca65ff61998dfb4535a7927fb736abf2a81140a11322dcf8226de27cf92", + "ux_hash": "379551206d8cec6a0b2b35f661957e53687a500dbca0a050b81d55110b5ee077" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "d5091ca65ff61998dfb4535a7927fb736abf2a81140a11322dcf8226de27cf92", + "inner_hash": "7a000aaa5751b65d3bccd4d307b7b8602aae539971de3af3baa3e126d52a54f2", + "fee": 0, + "sigs": [ + "693d3153218a69e2ef1e676d6c124dd7fab7ee312d41fd9dbe005a0e681a8b052708a9559fc08e8173e1ef83e45f838742e4a1af765ea7f0fddb38cee2cced8000" + ], + "inputs": [ + { + "uxid": "659bac1636b64087ad5d3cb0ae78c52f28ad920016ec67e08415a537e0343072", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "663464.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "97f64c3c636e5fc997e277cd48644055ef51045ed9c473c05dd6e699872a6c3d", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "662464.000000", + "hours": 0 + }, + { + "uxid": "0c19e689e0e34639c71b0136ce336121b042b6d4ac185ac1f9e94ec7535e781f", + "dst": "XnKU1htBL5wFSMX8oytZBsBMeaBSbVNivT", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 162, + "block_hash": "2aaa458d90b3377fd219aef75821b4c8dbd61dafea93deb70ec6282adb08cf7c", + "previous_block_hash": "fe3bc8a9bd17eb6583d9f4e806c20c8d8f89382df32f6a3b6bb8de6a2faf1ee6", + "timestamp": 1430784372, + "fee": 0, + "version": 0, + "tx_body_hash": "30e66ff45cfb145eb465e2ebdef0bb10005138bc1727c83888785b04d548e85b", + "ux_hash": "ca4b55c8abee72fb01a725e4daf45494ae5352fb3494d68334ccb140a4505bc6" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "30e66ff45cfb145eb465e2ebdef0bb10005138bc1727c83888785b04d548e85b", + "inner_hash": "c87fb6e81fc1d99b16958d4626aa0e5ec4033443230bbc8b35e2882c078bf868", + "fee": 0, + "sigs": [ + "b4feadec09b450b99795044931a94f7b8549bf876db7c62132df60056dd0c88e3821d1656407b1572fbb04eb71f6de57db43c997501989f44042d04fc3afdf4201" + ], + "inputs": [ + { + "uxid": "97f64c3c636e5fc997e277cd48644055ef51045ed9c473c05dd6e699872a6c3d", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "662464.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "122b7a9a61ee04e071002d74ffb26b12ed7952ff9a138b5437f990f4678cc2e5", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "662314.000000", + "hours": 0 + }, + { + "uxid": "db7a63750db787959a9e0d2d6be9a1ba8bb3d6015bae2353a27ae9eb55b39d22", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "150.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 163, + "block_hash": "64a69161afc94dc8abf04dae5e1db3dd37a1bc6d92721301262e3b5b97b2ed7e", + "previous_block_hash": "2aaa458d90b3377fd219aef75821b4c8dbd61dafea93deb70ec6282adb08cf7c", + "timestamp": 1430784932, + "fee": 0, + "version": 0, + "tx_body_hash": "ec79854fade530d84099d5619864a8e1e8ec9d27a086917a239500cada43c6e8", + "ux_hash": "d667c86a072e96b43b096d1f4909d91368c089433adafeef2c0219df9973a9fe" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "ec79854fade530d84099d5619864a8e1e8ec9d27a086917a239500cada43c6e8", + "inner_hash": "ed6a317c8ea3624337463c1cca78bdcf87bf80dace1bccad050d27a49d3ea1d2", + "fee": 0, + "sigs": [ + "c0548625b3bc88308155f598c3304a124632c0faef8005b8f9306b229b632b253c5e163a02409ba40b01560f77a6acde2ccc48cb0efedd4feb68ecbd925917fa00" + ], + "inputs": [ + { + "uxid": "122b7a9a61ee04e071002d74ffb26b12ed7952ff9a138b5437f990f4678cc2e5", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "662314.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "c07593d4329f82da243e4bbd7430e4b10e7b35f9ce0a3718d0e6d25d20b4939b", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "661314.000000", + "hours": 0 + }, + { + "uxid": "250543215c71a1a9ab7740fff25c3bf9695fcde10bceba3717aef9d0f6dd40d8", + "dst": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 164, + "block_hash": "da48eaee8f9f968a7a13d3a480eba216342593079cc3877bd08b7121589d1e09", + "previous_block_hash": "64a69161afc94dc8abf04dae5e1db3dd37a1bc6d92721301262e3b5b97b2ed7e", + "timestamp": 1430790052, + "fee": 0, + "version": 0, + "tx_body_hash": "743bf1eede313145824db1c4f8d683b74ab5e0bc825082d986308b73fd52f1d7", + "ux_hash": "b9f75495ffa7bc8af5bd2fa4ec693b58516d9b4fd312b5ce5fa2e764116343d6" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "743bf1eede313145824db1c4f8d683b74ab5e0bc825082d986308b73fd52f1d7", + "inner_hash": "a0427c37a8ca9f8205630cc8d4c6d95200413d3397a0de9bf015763107b8fc80", + "fee": 0, + "sigs": [ + "dc400e921f7f94da5f353846f1340e039b4527fff121a56579390fb4fa4154634e3b3aad44ddf0aaebea5abc1dc5ba2a00540fd2888ed5c4ab7b20c51255086a01" + ], + "inputs": [ + { + "uxid": "c07593d4329f82da243e4bbd7430e4b10e7b35f9ce0a3718d0e6d25d20b4939b", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "661314.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "4d52106e41dba0099549fd81fb8feb6915225b0125c53faa0f7c578ea78f213a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "660314.000000", + "hours": 0 + }, + { + "uxid": "bc513a68461d5c401e65a500baf7dfa163735ef63b817bb7b73c4139d5c29d18", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 165, + "block_hash": "f2df5ef2ee10bb6c302f205d97bde35caa2527db769d87ea02d3892259f3daf2", + "previous_block_hash": "da48eaee8f9f968a7a13d3a480eba216342593079cc3877bd08b7121589d1e09", + "timestamp": 1430790152, + "fee": 0, + "version": 0, + "tx_body_hash": "3991a257eee265481e713917a3a9c15756f61175bcfc7acfdbe84158e43fd5e6", + "ux_hash": "39db90f061f4054b49c458a63cb76f70ef863d90f7d57f6eeac2654793772cf0" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "3991a257eee265481e713917a3a9c15756f61175bcfc7acfdbe84158e43fd5e6", + "inner_hash": "dea502923be2dd8b4c48eb7ed2b146793ef840e9749d129bf7f6bda0fdcc43de", + "fee": 0, + "sigs": [ + "dbb23f6d22438c10b98b437fe2ee4d7c5513aba7b0b6141648ac22f07e3768fc5d8d80f9dbcaa95edf925668b6018793a01ca70cf7b48d7c7deac106557ebf7f00" + ], + "inputs": [ + { + "uxid": "4d52106e41dba0099549fd81fb8feb6915225b0125c53faa0f7c578ea78f213a", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "660314.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "fef9dd3b633274743099e607d9229717a001d6de6a4031479cc30d31d65e8396", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "659314.000000", + "hours": 0 + }, + { + "uxid": "5954742a6ca4e3e872d12d4a93436451ad52e6d25e5ac28371e308b2d7ce75a3", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 166, + "block_hash": "7b56941017940ca11f48cb71f0830f3aa06489942d118e9e2782ea040568c1c3", + "previous_block_hash": "f2df5ef2ee10bb6c302f205d97bde35caa2527db769d87ea02d3892259f3daf2", + "timestamp": 1430791622, + "fee": 2964031, + "version": 0, + "tx_body_hash": "41589644ea3a344fc616bec0058cf916b8efa5da7c3539241244827bd7e19811", + "ux_hash": "1386a916d2f0e59c5d1fcfbb8707a2cba527fd15486585a42bef96f52a4f9fc4" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "41589644ea3a344fc616bec0058cf916b8efa5da7c3539241244827bd7e19811", + "inner_hash": "140c70de73812b1da58d3df6c62696a0ced32ac1ea0818c3c53da4968407eae4", + "fee": 2964031, + "sigs": [ + "c9198240191df5c8b107cb7b6fcb5f4a572d8ae2ac85dd0def832df2f9cd7d806594c1ad2bf2279507de1b9f1e7cb067a4c5562dedf3e40c29fb23387e28277c00", + "cd4e83142b6592dae1d61f92a82b0e17ae43a34207c69e1970cc5e8e8badc06f4067f36da90a142e963d5e35228c0f405482e38064c69eb5d882b6d619109baf00" + ], + "inputs": [ + { + "uxid": "37cc43693a024f9122f5e1fcabeab5d53a4d58590df30a934fc7bc545936e049", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "1000.000000", + "hours": 8356, + "calculated_hours": 141306 + }, + { + "uxid": "903a1bca9b81ed76179cbcffe6e3c8eff269c94826148286f7be0b6038ee4ccb", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "28600.000000", + "hours": 8356, + "calculated_hours": 3810733 + } + ], + "outputs": [ + { + "uxid": "074645413ab2aae818e657f6f36420447a872e7cdd2ff64324b486be4d4d1edd", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "29100.000000", + "hours": 494004 + }, + { + "uxid": "b945bacb354173c33bc41503f50c29ad5d1d333ecab66b0c70d0ed9e6eec7f3a", + "dst": "2kN23viEG7Kn3Utuwz9voM4Z8ohLR9Y8L2v", + "coins": "500.000000", + "hours": 494004 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 167, + "block_hash": "0f3d6d37388d2a11c7f3532b279d73e01b84987a6a270e920d8f4c30e15ad4c4", + "previous_block_hash": "7b56941017940ca11f48cb71f0830f3aa06489942d118e9e2782ea040568c1c3", + "timestamp": 1430791902, + "fee": 201915, + "version": 0, + "tx_body_hash": "b29222c08f10b8bc4ea18981519a3b0e02b9c9cec63ee28d9ffa2efcaf2a8e5a", + "ux_hash": "7501b8b1ce87f4bb964972942450137fceb82361fb33f604b45719b9a7a32e45" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "b29222c08f10b8bc4ea18981519a3b0e02b9c9cec63ee28d9ffa2efcaf2a8e5a", + "inner_hash": "61c38575be160010335d96cf7c6ef0608cdb7b85079f2518532d00b6f42f13d0", + "fee": 201915, + "sigs": [ + "cb5c75671164755516cbf4d94e2288d56985b4d3113538bc818d1aa1c944a76b1beae28964c8e596ab0cd252cda6cf2a5468cbd0dbeff21e35609b5a6577eb0a01" + ], + "inputs": [ + { + "uxid": "fef9dd3b633274743099e607d9229717a001d6de6a4031479cc30d31d65e8396", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "659314.000000", + "hours": 0, + "calculated_hours": 269219 + } + ], + "outputs": [ + { + "uxid": "21f0fb666dca05d7a43ab26a378f7f7eaedfacde22fa047ca72857e9509cc748", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "659214.000000", + "hours": 33652 + }, + { + "uxid": "0b5e5259c276ac949de97062492ea6dc93ae6215c8dd1615862907e3c3ae9cf0", + "dst": "2A2YC8kxWnUDbscpzZ6UPfNAmx5ddKBeYNs", + "coins": "100.000000", + "hours": 33652 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 168, + "block_hash": "28b685d4f92a59a055f2e8154da0650a81e912616e90ca21d6949a3cd75634e4", + "previous_block_hash": "0f3d6d37388d2a11c7f3532b279d73e01b84987a6a270e920d8f4c30e15ad4c4", + "timestamp": 1430792072, + "fee": 25240, + "version": 0, + "tx_body_hash": "50fc81b0ba25669105a169a969459ccdb10278051b604a3f91467c2528c83652", + "ux_hash": "524c84abf87fc6ba4ee491a3181c2b0ed8d0e3e7002d4f9e5c7bb9bf229fedd2" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "50fc81b0ba25669105a169a969459ccdb10278051b604a3f91467c2528c83652", + "inner_hash": "c356824e25deeecd3f531eb56a26d5875b7b81743e9c8f3d6beff5f634bf5e3f", + "fee": 25240, + "sigs": [ + "ac3b968f82649fac3822db1af5c0be17fc20cf86e091362b1584a2b66c033b10541f70fb6f55d8e1b3c57161ce37412a52d2009dd8abc9ef7ab038b19d8d644401" + ], + "inputs": [ + { + "uxid": "21f0fb666dca05d7a43ab26a378f7f7eaedfacde22fa047ca72857e9509cc748", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "659214.000000", + "hours": 33652, + "calculated_hours": 33652 + } + ], + "outputs": [ + { + "uxid": "6b3a0cab1d9ad6fd011a3bac5e6ff4e3f7903bce911dc7fe83926eae557c34c3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "658214.000000", + "hours": 4206 + }, + { + "uxid": "a02148f770788851a35fb90567510044e37f8db930deab7a2b584af67c8efb2f", + "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "1000.000000", + "hours": 4206 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 169, + "block_hash": "e266c8beae9f650a3f1cdfa611d9016d99e2ba4b4a67b5d6c4629bc6e66f5f9e", + "previous_block_hash": "28b685d4f92a59a055f2e8154da0650a81e912616e90ca21d6949a3cd75634e4", + "timestamp": 1430836392, + "fee": 421, + "version": 0, + "tx_body_hash": "acfb61f7ca39d5dfe33e8ed66f73ab181da0a3206d457bf055dcc4b9731a3ec8", + "ux_hash": "5c583bd423444d9974a543bbe59e648ca0c252a899fba4731642b02b4d3e28bf" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "acfb61f7ca39d5dfe33e8ed66f73ab181da0a3206d457bf055dcc4b9731a3ec8", + "inner_hash": "85c5d3963f2dce44e99500967e8b8b1943839537fb198186131459a3022d161a", + "fee": 421, + "sigs": [ + "473114dcb42e2091f3d0396ecd16ee2685e0a6074c7de218cbd7e7c4335d89146455bc6c259c77f40d4af769e241aba1e3a102c5755946b1783c817ffafa67d101" + ], + "inputs": [ + { + "uxid": "bc513a68461d5c401e65a500baf7dfa163735ef63b817bb7b73c4139d5c29d18", + "owner": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 561 + } + ], + "outputs": [ + { + "uxid": "639e69c4a223b5082b9274caf3e56ecff2ab55cd90cac94fdb4c383a1013ba1f", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "990.000000", + "hours": 70 + }, + { + "uxid": "bffea1990d71311b695b2d343b9f09a216b7a8257c1cdcb01b2ab9459e1490e3", + "dst": "jtuSERvfzN3kUYekg8LemCQ5kF5g97N8ZL", + "coins": "10.000000", + "hours": 70 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 170, + "block_hash": "e854e12b5ed0bcb26b2348448fa2af1cd30cf371763fa91019d62a950bf36c95", + "previous_block_hash": "e266c8beae9f650a3f1cdfa611d9016d99e2ba4b4a67b5d6c4629bc6e66f5f9e", + "timestamp": 1430836422, + "fee": 62, + "version": 0, + "tx_body_hash": "95d847102c01d071982e67b8e7dfae50715b0fc0179d33f4b050974e634905e1", + "ux_hash": "d954806eed41026d3c60bc88e8fb569b3aa9007a9679e03ac61724ee3e723b01" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "95d847102c01d071982e67b8e7dfae50715b0fc0179d33f4b050974e634905e1", + "inner_hash": "c13b7e1722f3616f61948ed42382d4ed41164e7e2110d2d60bf86725f32531de", + "fee": 62, + "sigs": [ + "cb7da0e16b83f1717614c7f160580ac0048a4276682ac4046c3324ba6f4e24901d162f7ec81a8e5cdf3676df6ace9a73c77e4d3ab7f03a4f0272c75f3715665001" + ], + "inputs": [ + { + "uxid": "bffea1990d71311b695b2d343b9f09a216b7a8257c1cdcb01b2ab9459e1490e3", + "owner": "jtuSERvfzN3kUYekg8LemCQ5kF5g97N8ZL", + "coins": "10.000000", + "hours": 70, + "calculated_hours": 70 + } + ], + "outputs": [ + { + "uxid": "be081639ea8da63d8542707e9ea9625f6afc97da132f43ed061645c359bb1e65", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10.000000", + "hours": 8 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 171, + "block_hash": "a58ab1c90b6564043f375c48413800c33ff05c9eef017250672ea5a0dd11bf17", + "previous_block_hash": "e854e12b5ed0bcb26b2348448fa2af1cd30cf371763fa91019d62a950bf36c95", + "timestamp": 1430870562, + "fee": 6084778, + "version": 0, + "tx_body_hash": "fb495093f2f4e5c6555c50150ea60c0a6f430e53aa971ebb3e2b5412866a1f06", + "ux_hash": "e06be06b42f1aa65940658c601cf7132041f7a1eeaffdeede72cef54d9465e66" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "fb495093f2f4e5c6555c50150ea60c0a6f430e53aa971ebb3e2b5412866a1f06", + "inner_hash": "05596340e51ad628080101c8e92a60f27e0f5ab509e892f9b65a0988b1575ddb", + "fee": 6084778, + "sigs": [ + "068a56e916267a1756d9348bb965f3ed2dcba956fe4c626cd4836921dd836f7c0fa923d6451d5c87aa2eab528ff19ec332434bd12e197eeafbf0896e84940c4401" + ], + "inputs": [ + { + "uxid": "6b3a0cab1d9ad6fd011a3bac5e6ff4e3f7903bce911dc7fe83926eae557c34c3", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "658214.000000", + "hours": 4206, + "calculated_hours": 8113036 + } + ], + "outputs": [ + { + "uxid": "372703f8109295f0f58fbee58795979e10dd887869f4fc1da4881ce8a3c0aeb4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "647750.000000", + "hours": 1014129 + }, + { + "uxid": "a35044035cce79cb988c757dcaf5d9a065957c0fbc1a3559d08ed46831504fc2", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "10464.000000", + "hours": 1014129 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 172, + "block_hash": "78ae70c3a0f403b6b5d14dab13e3d29f151a0e279a8a4818fa0fe9becb639dc2", + "previous_block_hash": "a58ab1c90b6564043f375c48413800c33ff05c9eef017250672ea5a0dd11bf17", + "timestamp": 1430870592, + "fee": 849078, + "version": 0, + "tx_body_hash": "7abef7e4080bf2cbe9f147d7c9cbe4c950b38f8477d304466c938b937cd379ba", + "ux_hash": "41c039e8b2ade1a2cd9f7a58873d57729c30d3639a33755b0317ceff66e6f7a9" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "7abef7e4080bf2cbe9f147d7c9cbe4c950b38f8477d304466c938b937cd379ba", + "inner_hash": "f28366f7590220cd42faaf9ea041c8ca4460707e0dbfe1d3ac67da8d9dda268c", + "fee": 849078, + "sigs": [ + "e9ff8a0ce6c5e8b09936e031ef8cc6a0f3f3ed0a5360dcf2f649db3a2da958441c20916b27d1ad2ea8415679755b36967074e20feab7271528cb6b3266268ec201" + ], + "inputs": [ + { + "uxid": "074645413ab2aae818e657f6f36420447a872e7cdd2ff64324b486be4d4d1edd", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "29100.000000", + "hours": 494004, + "calculated_hours": 1132102 + } + ], + "outputs": [ + { + "uxid": "b1b832a911d45aeaab73676caad794fe2ab99d423f80c4ff58cfb269656b03dd", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "28100.000000", + "hours": 141512 + }, + { + "uxid": "c31c199a54ecbea5e57bf7f5e73d231a09e11713dd0ee70e340e4b0a9c9f9fdc", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 141512 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 173, + "block_hash": "55b1be7e73d1ec35d71c8bc6f62e1788ded35752b39188c98cab6c9347f77ead", + "previous_block_hash": "78ae70c3a0f403b6b5d14dab13e3d29f151a0e279a8a4818fa0fe9becb639dc2", + "timestamp": 1430871512, + "fee": 764646, + "version": 0, + "tx_body_hash": "a7665cec98224150968ec1ef9ef2d6b3175c9de8f9f8c7bc786b30cc74997c57", + "ux_hash": "abc08f5bf1ed183dd5dfa6dda09d9de6adfa23e310454861ae1fb938e0384321" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "a7665cec98224150968ec1ef9ef2d6b3175c9de8f9f8c7bc786b30cc74997c57", + "inner_hash": "5bd2503c4ff78e7c9d182bfe5e62e54f1bfb944bb526d97b272021d8ccfa9359", + "fee": 764646, + "sigs": [ + "dbd1e8763cb9681aeb96edc0c8483decee30b670778bec88da249f9d4f2201c330d2a16349608ba51eb8a387805dce9618810c4e6fd7af548cccee7d2c9c5dd201" + ], + "inputs": [ + { + "uxid": "372703f8109295f0f58fbee58795979e10dd887869f4fc1da4881ce8a3c0aeb4", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "647750.000000", + "hours": 1014129, + "calculated_hours": 1019526 + } + ], + "outputs": [ + { + "uxid": "14027340f6e1d98bba3f7f5f3b50e3588f8a19e4d021db944e7a28b2643640e1", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "635750.000000", + "hours": 127440 + }, + { + "uxid": "793f3f0e41c9d1de391d864792b79ed8c24dde5ff84a73c161d660a73ed70c90", + "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "12000.000000", + "hours": 127440 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 174, + "block_hash": "0a4f2c0ea33c75ae7af4eb743935f53f0953e26fec3bf7128f0a88fdb879f497", + "previous_block_hash": "55b1be7e73d1ec35d71c8bc6f62e1788ded35752b39188c98cab6c9347f77ead", + "timestamp": 1430871622, + "fee": 111521, + "version": 0, + "tx_body_hash": "ad44a8027a825e82a20cdd910d9bd41d74025601b7668c80655e9b45afb8bb93", + "ux_hash": "4f36b853bdb042046c522f2f5e397ccb24b59a5ef6931dd1cb1d48cc87a1ffc9" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "ad44a8027a825e82a20cdd910d9bd41d74025601b7668c80655e9b45afb8bb93", + "inner_hash": "af11c711190f9b52114dd31dcc4dbcdff3f169c6ce2559ff5baf14032e057145", + "fee": 111521, + "sigs": [ + "fd019f0cc492d5b6ba1bab0e3c77659b0e4773ea9b7dbe9808ea1392bfcd41e20aec3438076cb6ae4104bb6730b47ad1f1cfe878155f984ee380da10991b2a5601" + ], + "inputs": [ + { + "uxid": "b1b832a911d45aeaab73676caad794fe2ab99d423f80c4ff58cfb269656b03dd", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "28100.000000", + "hours": 141512, + "calculated_hours": 148693 + } + ], + "outputs": [ + { + "uxid": "c39acd3494113650c1a6a7809287af7b12a78bbd97126d4585dd1715e2cb5a66", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23100.000000", + "hours": 18586 + }, + { + "uxid": "2d3f7890d11efedd4cee3a7ab4a5cbc56d2c8df4f02124bdad9ec839400053ba", + "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "5000.000000", + "hours": 18586 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 175, + "block_hash": "218d3fadc712eec96e1ca2f68adbb468092c597f269fb3a3702b77c2b80665af", + "previous_block_hash": "0a4f2c0ea33c75ae7af4eb743935f53f0953e26fec3bf7128f0a88fdb879f497", + "timestamp": 1430908702, + "fee": 110149, + "version": 0, + "tx_body_hash": "9364ed6cfcc289df74dc6bac1993f7ab3441b898cb3f06918198d2476c83dbac", + "ux_hash": "4013a4dd63875f19f124c440685a727e9654d8c2de3298f416bd98c2bbcf2ac9" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "9364ed6cfcc289df74dc6bac1993f7ab3441b898cb3f06918198d2476c83dbac", + "inner_hash": "a55922b0495d39c8e9db70ac9aca99266d5a7f3644106b4b5468345d955acf41", + "fee": 110149, + "sigs": [ + "cecae09b7925e9f6db1ccf5ef9a93687a43bbeaefe2888abcc07411c71f850c80c05ed573abd67bf9f0e8a096a1aba8187547e3d062e5ed147ac51961cc3559701" + ], + "inputs": [ + { + "uxid": "14027340f6e1d98bba3f7f5f3b50e3588f8a19e4d021db944e7a28b2643640e1", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "635750.000000", + "hours": 127440, + "calculated_hours": 146865 + } + ], + "outputs": [ + { + "uxid": "8e55f10a0615a0737e6906132e09ac08a206971ba4b656f004acc7f4b7889bc8", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "625750.000000", + "hours": 18358 + }, + { + "uxid": "d91e07318227651129b715d2db448ae245b442acd08c8b4525a934f0e87efce9", + "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "10000.000000", + "hours": 18358 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 176, + "block_hash": "7ca9af9ed16449652da34d3ab49f3d6fc6be8cc1af3d31be81043e684f14de37", + "previous_block_hash": "218d3fadc712eec96e1ca2f68adbb468092c597f269fb3a3702b77c2b80665af", + "timestamp": 1431162639, + "fee": 2711954, + "version": 0, + "tx_body_hash": "a17cf54c20ac7ec6e1362acf24c5e5589ed8b49bdba791a87430de160a473913", + "ux_hash": "5ad39ab834a65739085413db13fb8c152a641ba28b2b45322d1da9c6d9aa05ef" + }, + "body": { + "txns": [ + { + "length": 1481, + "type": 0, + "txid": "a17cf54c20ac7ec6e1362acf24c5e5589ed8b49bdba791a87430de160a473913", + "inner_hash": "71127fa12d9ca390715586fe313b4e130b24614e0eaec276dc2dd25b7228c39f", + "fee": 2711954, + "sigs": [ + "95855ae7d279d4797bafe542fd1803eb6a89533f29ae0d89d3f51256feeacc343dbd3da0d8d104e436c04643c72b5dab7a74634befc942ef9d96ded3e235ab4b01", + "55222337fce2733e7a3f92bf808da32759f33327c616828bdb0a350e5d3567b34fdef1a55340d7f857c4daed9735ad64394697ad941fc883f9365693991299a500", + "950281f4acb6cb8176929740aa90fa8729ac5687ef6500bc087429c43f5414e319c26142fca51c0ed9e5d434a6c83d2e3c837d7c9213398ae2104429d03f35dc01", + "c41f7425ecb51359a1da6ccf090a565beed72c891c49a8c81939a46f914c55de5766e99f1519302bfeef2224f856c859391d1f531004ee088083259fca82b17400", + "ed7085f8ceb26060851a71f665387d7c44774c6b9ddfc8d3a06e1fe50168d48510f63f5b6a0998c2a30d24bf37f1c6030035ef8df6efe6dfdcae38beeaf3a5a701", + "a88fefcc8f2809a288a275aac579f340c5138f8bfedf02964d4e3ed0492ee54e696de7e6f7f0b3f315461fb5df4f8e5e5fc7a5339ca6899c6ca7b122c54c90db00", + "ad9b245807ab8c5c5a713ab7e3bfbbba8af032bc4915c1824d95e95827d95be473eb1f6952ee489ddad59049364220bab124182251142b849235ed552404ba3d01", + "7a403c671ec5a6a6622ff63e4d482d51fda747cbe85cf8ef642aa840154be435409df707aa81a3c4e553e0c2c250a452e8416dc38697c35f830de27924a052fc01", + "06b5966aa7c7dfd425e773aafd46fdf29b41734b73f84ef1cd8941e617e0d6245e99f6d8be8b9609686b0faee4923b8bc149078ebb18c1b2e8f6318c846675e801", + "c5634bef581b26d600ed6f4cea47f402633e74ab8f5497b2c2ca69a01e3dfeda0a38308a4a96cfe58857e4c0c2311ecf4e3f4eef69aa771a1db89c360892492200", + "4807a114ffe9e44797843f76c74e81d72324885a67d560c4e1d6e4cadd271b637176a932dc045844b52a4c92f6892ebb0265838366827fd0e0b6b7e20e4e1ff501", + "bc1ca4e3d0afd920bad8c4ef8a6b847c71f75ae8ca913ddb5d976dca42af12ea3ec3a2e59ec8f57fe4fb41af3f439387272ea847240ee89468c4d808303cf9be00", + "366f0f68a36bccd22e829eb05f960a8015466bb5eeb8e553dd37b52ab624d1756f68501db2a8d14fda04d1adf3239a9785ec142c14c5bb34cb8d47629c191dc901", + "146eed504f7acbbece951bfea4eb426e80852e3dc6ae9c8a68480fdf4e07ddd73a5709e2f9df0154380d837a5ff66582c07a0fc27d0df4e7d6d28bbcb90e3c8d00" + ], + "inputs": [ + { + "uxid": "04c0cd4cbee1e5414791d9e0b9ae4f889bc52d253b5f70b09fbc32c88fb415ae", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "3.000000", + "hours": 4, + "calculated_hours": 1748 + }, + { + "uxid": "f3034ffe54e869315f8e11801d3e755352fb75b878b24313302273c1b7ea62cb", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1.000000", + "hours": 0, + "calculated_hours": 581 + }, + { + "uxid": "3538af0016ec0f4d0e943c5d49daf280b416701fde4040fa72710c0ca1b5b559", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1.000000", + "hours": 0, + "calculated_hours": 581 + }, + { + "uxid": "0560bae3917bca7581af9b6c5a58e395c701ce9ed0241dac2de8a3e93c0b839b", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 1605, + "calculated_hours": 510237 + }, + { + "uxid": "3fe7d61ffa993e00200ce6be7ba347c603032ac3f8c4ace07767e630fe94d76c", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 125696, + "calculated_hours": 610213 + }, + { + "uxid": "2a09e97f7725a35af1357842206875a023252da4ebfce129eaf4cb87119cfd41", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 2704, + "calculated_hours": 487118 + }, + { + "uxid": "617b584bb9e6b1d80daac915fb3079b22a326777d1515a40e7b7eddf427f4099", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 3102, + "calculated_hours": 163688 + }, + { + "uxid": "18293d947aadf89d9e57d18fa01408867a9abe267504edbdabf8c2a57d9a6323", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 112148 + }, + { + "uxid": "045dc2e76321e37884588093083ce1b21be12f20ba1fa36f2a755b894229e3cf", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 73857 + }, + { + "uxid": "b1e5c694c30326cda3df2e634723999befbcbb141415e9a36bdbf18d7bea9870", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "6336.000000", + "hours": 0, + "calculated_hours": 340570 + }, + { + "uxid": "db7a63750db787959a9e0d2d6be9a1ba8bb3d6015bae2353a27ae9eb55b39d22", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "150.000000", + "hours": 0, + "calculated_hours": 5180 + }, + { + "uxid": "5954742a6ca4e3e872d12d4a93436451ad52e6d25e5ac28371e308b2d7ce75a3", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 32930 + }, + { + "uxid": "a35044035cce79cb988c757dcaf5d9a065957c0fbc1a3559d08ed46831504fc2", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "10464.000000", + "hours": 1014129, + "calculated_hours": 1124989 + }, + { + "uxid": "c31c199a54ecbea5e57bf7f5e73d231a09e11713dd0ee70e340e4b0a9c9f9fdc", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 141512, + "calculated_hours": 152098 + } + ], + "outputs": [ + { + "uxid": "d6735d3ad70dbf553048faf1c529d047ab12282d04e320bd67c915779fc4e3fd", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "24950.000000", + "hours": 451992 + }, + { + "uxid": "a5f3c513b5a01dc5e943a5cae91f54b54cde55e984a9480d68d690f40dfb7914", + "dst": "v4qF7Ceq276tZpTS3HKsZbDguMAcAGAG1q", + "coins": "5.000000", + "hours": 451992 + } + ] + } + ] + }, + "size": 1481 + }, + { + "header": { + "seq": 177, + "block_hash": "3e8ac6b4c715bd92db824163770e28ee1b5362d449241f77719f13614b3c320a", + "previous_block_hash": "7ca9af9ed16449652da34d3ab49f3d6fc6be8cc1af3d31be81043e684f14de37", + "timestamp": 1431162689, + "fee": 338994, + "version": 0, + "tx_body_hash": "e4850021fb706f2b7a94fec9ade3c166823dcd980dc3954437471d98fb9d2280", + "ux_hash": "c9b05516880ca6665a0f4fa52e7feb6fe83c1ffd6f4d2874877dfa67265524e2" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "e4850021fb706f2b7a94fec9ade3c166823dcd980dc3954437471d98fb9d2280", + "inner_hash": "1a07c8a17c429aec5c0725dc6e4891f4e304a483211f99b847a6820e410b56ef", + "fee": 338994, + "sigs": [ + "e7d92fbcc6716645c2c28a66ac289453b2967c620e105c7699cee251aa6916227057789d10889689a3f3c743dadfea09e1cf747cc7b7ccb5381fe1af1069e06201" + ], + "inputs": [ + { + "uxid": "d6735d3ad70dbf553048faf1c529d047ab12282d04e320bd67c915779fc4e3fd", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "24950.000000", + "hours": 451992, + "calculated_hours": 451992 + } + ], + "outputs": [ + { + "uxid": "ec439e7c7d8517824885ae1520fa5b19f991d7ade3a12209c0e87f6ad1d30229", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "4950.000000", + "hours": 56499 + }, + { + "uxid": "f5e7796297b7201b1ea87736fadddc7b451f9ed7d4529cfe9f03082e80917628", + "dst": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "20000.000000", + "hours": 56499 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 178, + "block_hash": "bb943b37f989326b057903ccc6eb1fa58a5d35e38706ae1ba81e0a6100bacf26", + "previous_block_hash": "3e8ac6b4c715bd92db824163770e28ee1b5362d449241f77719f13614b3c320a", + "timestamp": 1431162729, + "fee": 395493, + "version": 0, + "tx_body_hash": "ecd101a6af263973ab75f87a3116231e6fe84a2281d0001c9aa2d7195545e78e", + "ux_hash": "428b5ba5d4928fa538d9a031bf9fa3eb215b47d780e43e69bcd71d87758ada2f" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "ecd101a6af263973ab75f87a3116231e6fe84a2281d0001c9aa2d7195545e78e", + "inner_hash": "41bc4ea9ec8214b461a5377d0ae0da38831bc972b8dd54becaf195b5943dd55e", + "fee": 395493, + "sigs": [ + "4a604f9845e202871ac8741962280bb5db6f1295353042922a6f46671f27cc1d6cd4085aec390205aa5ba08f2c841295b4c86d2fab81d6e29fc958dfe9712e2301" + ], + "inputs": [ + { + "uxid": "a5f3c513b5a01dc5e943a5cae91f54b54cde55e984a9480d68d690f40dfb7914", + "owner": "v4qF7Ceq276tZpTS3HKsZbDguMAcAGAG1q", + "coins": "5.000000", + "hours": 451992, + "calculated_hours": 451992 + } + ], + "outputs": [ + { + "uxid": "ba1adbf3006a239fb7ef6efb1f9390a25951a5185dc312dd81bf88025f838456", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "5.000000", + "hours": 56499 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 179, + "block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "previous_block_hash": "bb943b37f989326b057903ccc6eb1fa58a5d35e38706ae1ba81e0a6100bacf26", + "timestamp": 1431339429, + "fee": 33129894, + "version": 0, + "tx_body_hash": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "ux_hash": "c99075adc48450a9bf04b8b06defba39fc9cb029fbac413d57ee9fea241d84b4" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "inner_hash": "db98f515ce6c3d99fd7c39a6ac59ab498b1a2cc8fc6a13377ac7d3d463898e7c", + "fee": 33129894, + "sigs": [ + "1ca18424c9a313e9c253aecaec3c532c35c60e454f026a3d2794c772bc74a19809d53f8862962e865dd822dd054cd7f32b89b810968d95c9db6a9a0c1095390601" + ], + "inputs": [ + { + "uxid": "8e55f10a0615a0737e6906132e09ac08a206971ba4b656f004acc7f4b7889bc8", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "625750.000000", + "hours": 18358, + "calculated_hours": 44173190 + } + ], + "outputs": [ + { + "uxid": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "hours": 5521648 + }, + { + "uxid": "01f9c1d6c83dbc1c993357436cdf7f214acd0bfa107ff7f1466d1b18ec03563e", + "dst": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "10050.000000", + "hours": 5521648 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 180, + "block_hash": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "previous_block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "timestamp": 1431574528, + "fee": 2265261, + "version": 0, + "tx_body_hash": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "ux_hash": "058d1d0a22be7b9f5567a236866836a87d922760581832cfb8bfbd8b337d64b1" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "inner_hash": "d5b18a0c0c454e56fe1f7d0c64236d633f65717c04f08cd943f5669b4cc34667", + "fee": 2265261, + "sigs": [ + "2fac42571bb301783e46e804069c73c8226b637ae6385fec793e3a3860feaa6918058c55f461cef38341670c5c2da230d2241f267dbde6fc0528a6fb24362b3b00" + ], + "inputs": [ + { + "uxid": "c39acd3494113650c1a6a7809287af7b12a78bbd97126d4585dd1715e2cb5a66", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23100.000000", + "hours": 18586, + "calculated_hours": 3020347 + } + ], + "outputs": [ + { + "uxid": "75692aeff988ce0da734c474dbef3a1ce19a5a6823bbcd36acb856c83262261e", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "hours": 377543 + }, + { + "uxid": "a4b70476ea1e079ebd3503b52eee32d490515457fce6a5aa075770b598a9d14f", + "dst": "CDD8GoJUHEvBm1pD3BQ3hEC2KcJNhvUzpu", + "coins": "1000.000000", + "hours": 377543 + } + ] + } + ] + }, + "size": 220 + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-verbose-end-less-than-start.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-verbose-end-less-than-start.golden new file mode 100644 index 00000000..b5b27b9c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-verbose-end-less-than-start.golden @@ -0,0 +1,3 @@ +{ + "blocks": [] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-verbose-first-1.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-verbose-first-1.golden new file mode 100644 index 00000000..c024e19f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-verbose-first-1.golden @@ -0,0 +1,642 @@ +{ + "blocks": [ + { + "header": { + "seq": 1, + "block_hash": "baf3b622f043bbe3ef480416251a6545d07f173e5969dde2b63c4a12956d38fd", + "previous_block_hash": "0551a1e5af999fe8fff529f6f2ab341e1e33db95135eef1b2be44fe6981349f3", + "timestamp": 1427926392, + "fee": 99999999999900, + "version": 0, + "tx_body_hash": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "ux_hash": "ecc66d67289ecf8b5c5d2758a8f07ef08373a61a4d4e2736905ac2aaa427655f" + }, + "body": { + "txns": [ + { + "length": 3846, + "type": 0, + "txid": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "inner_hash": "0f7019627886818d2501af189bbac18e21b8e959891c5b2726f89e29355aa10a", + "fee": 99999999999900, + "sigs": [ + "be602113fe288f750001ab65f254ceedd8b05b1becc456a0a52a0bea10b8280e38d950933992ad3265e1f81d197036fa634b316f08b3b319ffce081aa43f3bb600" + ], + "inputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000, + "calculated_hours": 100000000000000 + } + ], + "outputs": [ + { + "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "26f585cb96f35307f0af5b9aee004a29b7795695f4c5c836104e2fbbf429a3ce", + "dst": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "18a43b8b69bbf12a9e49e6f9783ba258397e6567301aeed9e901a1e4fed9fef9", + "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5a69ef09b5de21b117cac62141a8de4eade7558c42f0ba8b50996f5ec7867c5d", + "dst": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "aef761a12e3d0fa9c4a8db62b8bab1015c32931b7e3a7fc9a77282cec218f79d", + "dst": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "445a4082da251fa161e4705d115fe2018ca15a5f92e8a0950793405410e6be12", + "dst": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "dst": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "368a609ee90ca15bbbd297af07dc6705131764476d54bef641017ffcd0885e65", + "dst": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "13afe1586015c4d7312f89d123153279e4961eb0d53a4d036847d5d989ba90dc", + "dst": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f625cf04412199c16e073dbb500e66c23cfe69043578b4a2d879a329aac563ec", + "dst": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b2da50a08756c34d059a04812451cf3296f73ba87f8cca38473ac8f051ab6d1e", + "dst": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "135c28698e80e3b2a737d59c16c79684c3fb3ec5cec59f466a39f4ac3c73968e", + "dst": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "df63056cf3ae21efa86d241876ad0194387317585dc9e4fcd80954b47d59b57a", + "dst": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4628f4cfdbf1eb7cccc25d461c46cc29e90cffb5d6277e0de641f7701d60c308", + "dst": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "47e4706dc4d80a70b20c889476fb0627ca6d5bdaa790f4ceba44a689d31b2dcc", + "dst": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b64bc50d370a06df117eb543ca051239c985cfc4b6aa527c51b700de32c7fc41", + "dst": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "390bc4c045fa9f289957b7eca529bfadac96a7dd074bcfbdd3b09e99413b8202", + "dst": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6aa162f7fc09598c4dc8f5fab7fb2383f28c3840937a001acd9f37136e1691b2", + "dst": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e440cf4c896735d3299a871f988c134f404fb2065d1f20c87c9c9bc5fa582e09", + "dst": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "eea791e84a53e4d99485519c5d2c3146b0a2ad080cf92904ae7b28c2d9a6e3ca", + "dst": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "01048ad6a538256d9a8c6c9c6321ca1a01b31cbf08e74fd4ff0f141bf97eb8ce", + "dst": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc5f1f1ddc8cb23df3d42f1e5a1dda9d356846fe930ae4484bc1eeb1b3b2c95b", + "dst": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f03087245a6b64bb69cd5866a1887ae595a9e1a86e196754984840eaf6d3eb9c", + "dst": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "239bdba27dabd52f7450f7d8521c9a7e5ac74093ae3f6f2348bf40ac9a6db7a5", + "dst": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d60879e562b65f97d40bec7309d4490ba0a8c80e2349ecb2e3505aaa50ea1e47", + "dst": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "66e685901492c94942522c346759c711ee2e78a059ef274e77a6ab433409683c", + "dst": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b497992663f99f9902deaaf487b00655820003015ea92091628f4a6e8aeb5854", + "dst": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc40377012004566712fa860e74db97305091cc163e95435e04556c70d32f9c5", + "dst": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "73304622e33994bc2d4ade2cab78d28e1b65185e60ad3c781ecfb5cbc8159136", + "dst": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fed15e8506d0e0898510311850b8863ef6d9a499215ae8823a1e3fb9c8140ab2", + "dst": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "12034bc455d0821813d7eb9afed1ed1a8f19b6f29826ef4a057b4aa0b4228817", + "dst": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fc444cdb2598f44209a41ea20afdc9065ebe51b7cd5f65bb1c0f7a7b427ce7b1", + "dst": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "618d242d95d33e2d7316612a164d89859b85f1287f0d5bed4dcb561cf478f706", + "dst": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "07f70fd4108ef4d2fde3b85411728c1f7bd3a135d2062c5a30a46cc885463780", + "dst": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "af9bcf6ba63a08e699bc101aa362f135343aaf78a56e9f88d118fca0e1ce5c08", + "dst": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6b3530bb930ed10bbc4c307663aba4377c08443498a0a2cf023b1be72f378ae1", + "dst": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fd6da5199e528958e68ee8dd003b727d4d840754ea7c1e0c05e4f0e504c9b2cd", + "dst": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "131f07f5b40f365fb537b863e4aa5ef0efcd77b7fa2ff321d90eeb743ac43678", + "dst": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ffbdfdbf3427d04f445c33e867845bec1ee64a9dfe0d0fa8284547c2226fdfa9", + "dst": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b53c7188ebf4d630790ff63275679ba48009e31af6e4fe15806619216caa750", + "dst": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b4c6639b49402c2753f83c7fb7d3ffa65da74e47fef2b781933ff55b14d09bcd", + "dst": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c956289db079c00d2f80c590d3c8ca26c37da534fe5f65e799b3982ceca493c", + "dst": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "550d2a8d3047cdae0c05a61cc3de43e758b123a6955fa067d3ac375f7d0dbadc", + "dst": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78740d5bf49989936d315bf641949232aace582e03de57db8abff940f7d51bd1", + "dst": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9f2c83c5165826de1077f428ad39d41473e32ed64cd83180d49e7d8e5db996d0", + "dst": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "883be4d7173c235933294ab8dcae8cc76609166eaa1c1f07e9b51d551c979709", + "dst": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6384ed19650d384c29db4c3a39a1ca855058fab758075be2dee759dd9e6faae1", + "dst": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", + "dst": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c238e82f3a4beee1be7b5b464e8553404f6927d5ab93c3d649d362c01097782", + "dst": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dad4991bfa5c51eb176f28c1b3f86661e02579905e6e07c997df22004e06244a", + "dst": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4ba91512c168281f41d3934b927d0d86a3136a31cc345b635095928f8e5f013c", + "dst": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c416f5e604eeada9ae8e520a429d8f19d4230626769e7121007e01353730784f", + "dst": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7b8787fd4076c27d074d2a4761377a1aa26c843c432e3b7e6b0ebf1e29528188", + "dst": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "38f22b194f04d85a6b545b37df06195edeb8503798b229ddeaa946018150c05c", + "dst": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "246377a036ad5444bcd5f47ac9e55fec7c85fc40644df593038d360554a809f7", + "dst": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c6d5e543ff5f2c2526728d588fb21753db5b7e05b8b275aa5e9b24d29350afb0", + "dst": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "98e223e6e2240fef83082d3daa86e46f10e0c71f3f74489ba95db0951a166f53", + "dst": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c8971ca91f8e21c556f647940073db003f7dd5582ae55d4ebca602d5e8e91a6e", + "dst": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dfa7822c05f54116c9fc3b2cde1ecb4667f47a2d8771fe886e832c223cdc4e82", + "dst": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6d37c0c4b6fcbac1e53a46c9c2dc5d3c3b36312c53f25b2baacc785ea77a11f7", + "dst": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9ba5e31610f0545666f102465efa8caa48ad3fb5b8abd5ae802f4a71e3f7de3b", + "dst": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "3ca365aace71e24b04d6f2ffbf7171468c5e71783858c710cae539c5e43e0c0e", + "dst": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c858f2db2a20ac562d32f8fb2a3a11039849a6e44d2bec30befb2e173532a9a3", + "dst": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1550a76598693b950346397e0e825bbb2805edde38b0d0240e50050829b7b1dd", + "dst": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "466340ab7733abb23ab24d877c673fe089c273f11808fbbd6f33a91da92ee96c", + "dst": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "401d4c0c1060ebbb4b9fb3859c2eb47789f94086f4deb01234bf46f7cdc81247", + "dst": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2c0e3aa084f5fec45f99b3f125ce7d50c6da526ef5165df5f22ba603147c3fc2", + "dst": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2e724d83e35235c23c0bb16ae9b708a5bba3c23b186b05d4b8c606f6bb4b311", + "dst": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4f30eae8c49eb268fe364eaf5ee0788da6e2f6adc2f83cd82e96a4bfe98496f5", + "dst": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8753d5775c22477a8ef74eeebf61d7de30be702e70118f552cc18ad963ffe950", + "dst": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efa2007c561dcbf7c83a6bbdd2ef75e7cca76b05330a8b948ba0dd94dee949f7", + "dst": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b379d1b8ff0153c63ee69c40a7155b97fa42ab570f68ff847d457316c4d8ab9", + "dst": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cc84f93adce16699d9e84ef32f55333402431b58dc50c17084bcb8b33f382f88", + "dst": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f38f0760769c19075034f70b059abf4d1bfa6d01e1e8c369a99900ed1eaeca6d", + "dst": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8d55f76bb0b3dd222cf85a7193501c0f4071b446f56dbd1da355b1625993325a", + "dst": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efde499c7e4444bc602b7bf5ed50e95a18ce8ec9a06ba9d850a05bb7a25ecb3a", + "dst": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2a4d631d5dc90e397d85f13410d1a6d877dcaf592a0e2be2e727443ac74b5bd5", + "dst": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e936299a21240744f6edbab493449323f920bbe15dcf294463e5a2ace10f27b0", + "dst": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "44e17f4bd29411a1614457171c06183e364bf6ff80a201717b2dfc0748e9ebe3", + "dst": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1941e5cc5e38dd92427580af699b1f410be7b29ff17d3d0ff3d046bfba0aaabf", + "dst": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ff6c0f27fcf92f3b4a3871b801c3116847fe47a7e3bafcadd4855d06012091ad", + "dst": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cd6c4b785e60757fad0e6fd4874b729ea7703fe7ee9560e1283d2eb71fc75321", + "dst": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "745eaff456a390c3868742a039e72c2a93ff8eee10417dbe848d533b89facc04", + "dst": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2f3f050c9ef31bf5c3b14c1c71699c4f4b38aa18479531194d12e6277416516", + "dst": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0b95850edabed70762768ac1695c5d7f230cccaa8de06657cda42cafba36374f", + "dst": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7c767d3a06db1ac0e1809ebe29a7d9689143259f4651837de54423e287c20490", + "dst": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78b07e8fe1366e173f2eeb75c35cd53baf0f6100de50ae12b4ffe7d0d7ba4298", + "dst": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5010eb25f6e1ed725fb901ae1e945e545ae846d7be8a135333d2d41102c33328", + "dst": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "178a33e64826cd2039b8538b74e6de513966acab45ab79d77dc9392018a65ffb", + "dst": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "044dc539d063250dc654b2bf0986a9044b4eea05e1284c11a2b313acd8dc3498", + "dst": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9fd5ea38f383291566def44b6fb932414f97123952578fe0cfb9a30eb075a099", + "dst": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "be5930e9cc35801433bcd21db84da7d4f1d8e744feca16a2c6fb00c81ce93e51", + "dst": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8cd999cd193d315e5f1c6f74c230c12e6abe6847924f6e89d988e09ca413f52e", + "dst": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0cff53628eb0e984c134b68cbe4b1bb7721a05adaa32e93b9df489a9a7a176cf", + "dst": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "a5ef046e84be9ff2485dde49afe6073811286761afac3bbd588b6e4130930479", + "dst": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cdee5f84c4f08098ac740e3a260ced14c1e199e126aa5291ec079b281a7dc407", + "dst": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6a24135f8496e7a37dcf7164218bb3aa530319f3b2bf3c7a1a9cc1bd17831328", + "dst": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "693c7f970b34ce5882e62430f4c9c28957159a257d27d4e21a61fd95c6b97464", + "dst": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c008a613cef129c180dbcc7213f2d41a14d245d06a3844d63d9beac963145385", + "dst": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "439cdfd03972fb4bb5da54208cf8098ee78228c487ce9e84623f5f83e17a7d68", + "dst": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "hours": 1 + } + ] + } + ] + }, + "size": 3846 + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-verbose-first-10.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-verbose-first-10.golden new file mode 100644 index 00000000..365dfc2a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-verbose-first-10.golden @@ -0,0 +1,1094 @@ +{ + "blocks": [ + { + "header": { + "seq": 1, + "block_hash": "baf3b622f043bbe3ef480416251a6545d07f173e5969dde2b63c4a12956d38fd", + "previous_block_hash": "0551a1e5af999fe8fff529f6f2ab341e1e33db95135eef1b2be44fe6981349f3", + "timestamp": 1427926392, + "fee": 99999999999900, + "version": 0, + "tx_body_hash": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "ux_hash": "ecc66d67289ecf8b5c5d2758a8f07ef08373a61a4d4e2736905ac2aaa427655f" + }, + "body": { + "txns": [ + { + "length": 3846, + "type": 0, + "txid": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "inner_hash": "0f7019627886818d2501af189bbac18e21b8e959891c5b2726f89e29355aa10a", + "fee": 99999999999900, + "sigs": [ + "be602113fe288f750001ab65f254ceedd8b05b1becc456a0a52a0bea10b8280e38d950933992ad3265e1f81d197036fa634b316f08b3b319ffce081aa43f3bb600" + ], + "inputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000, + "calculated_hours": 100000000000000 + } + ], + "outputs": [ + { + "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "26f585cb96f35307f0af5b9aee004a29b7795695f4c5c836104e2fbbf429a3ce", + "dst": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "18a43b8b69bbf12a9e49e6f9783ba258397e6567301aeed9e901a1e4fed9fef9", + "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5a69ef09b5de21b117cac62141a8de4eade7558c42f0ba8b50996f5ec7867c5d", + "dst": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "aef761a12e3d0fa9c4a8db62b8bab1015c32931b7e3a7fc9a77282cec218f79d", + "dst": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "445a4082da251fa161e4705d115fe2018ca15a5f92e8a0950793405410e6be12", + "dst": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "dst": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "368a609ee90ca15bbbd297af07dc6705131764476d54bef641017ffcd0885e65", + "dst": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "13afe1586015c4d7312f89d123153279e4961eb0d53a4d036847d5d989ba90dc", + "dst": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f625cf04412199c16e073dbb500e66c23cfe69043578b4a2d879a329aac563ec", + "dst": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b2da50a08756c34d059a04812451cf3296f73ba87f8cca38473ac8f051ab6d1e", + "dst": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "135c28698e80e3b2a737d59c16c79684c3fb3ec5cec59f466a39f4ac3c73968e", + "dst": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "df63056cf3ae21efa86d241876ad0194387317585dc9e4fcd80954b47d59b57a", + "dst": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4628f4cfdbf1eb7cccc25d461c46cc29e90cffb5d6277e0de641f7701d60c308", + "dst": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "47e4706dc4d80a70b20c889476fb0627ca6d5bdaa790f4ceba44a689d31b2dcc", + "dst": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b64bc50d370a06df117eb543ca051239c985cfc4b6aa527c51b700de32c7fc41", + "dst": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "390bc4c045fa9f289957b7eca529bfadac96a7dd074bcfbdd3b09e99413b8202", + "dst": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6aa162f7fc09598c4dc8f5fab7fb2383f28c3840937a001acd9f37136e1691b2", + "dst": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e440cf4c896735d3299a871f988c134f404fb2065d1f20c87c9c9bc5fa582e09", + "dst": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "eea791e84a53e4d99485519c5d2c3146b0a2ad080cf92904ae7b28c2d9a6e3ca", + "dst": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "01048ad6a538256d9a8c6c9c6321ca1a01b31cbf08e74fd4ff0f141bf97eb8ce", + "dst": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc5f1f1ddc8cb23df3d42f1e5a1dda9d356846fe930ae4484bc1eeb1b3b2c95b", + "dst": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f03087245a6b64bb69cd5866a1887ae595a9e1a86e196754984840eaf6d3eb9c", + "dst": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "239bdba27dabd52f7450f7d8521c9a7e5ac74093ae3f6f2348bf40ac9a6db7a5", + "dst": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d60879e562b65f97d40bec7309d4490ba0a8c80e2349ecb2e3505aaa50ea1e47", + "dst": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "66e685901492c94942522c346759c711ee2e78a059ef274e77a6ab433409683c", + "dst": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b497992663f99f9902deaaf487b00655820003015ea92091628f4a6e8aeb5854", + "dst": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc40377012004566712fa860e74db97305091cc163e95435e04556c70d32f9c5", + "dst": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "73304622e33994bc2d4ade2cab78d28e1b65185e60ad3c781ecfb5cbc8159136", + "dst": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fed15e8506d0e0898510311850b8863ef6d9a499215ae8823a1e3fb9c8140ab2", + "dst": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "12034bc455d0821813d7eb9afed1ed1a8f19b6f29826ef4a057b4aa0b4228817", + "dst": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fc444cdb2598f44209a41ea20afdc9065ebe51b7cd5f65bb1c0f7a7b427ce7b1", + "dst": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "618d242d95d33e2d7316612a164d89859b85f1287f0d5bed4dcb561cf478f706", + "dst": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "07f70fd4108ef4d2fde3b85411728c1f7bd3a135d2062c5a30a46cc885463780", + "dst": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "af9bcf6ba63a08e699bc101aa362f135343aaf78a56e9f88d118fca0e1ce5c08", + "dst": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6b3530bb930ed10bbc4c307663aba4377c08443498a0a2cf023b1be72f378ae1", + "dst": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fd6da5199e528958e68ee8dd003b727d4d840754ea7c1e0c05e4f0e504c9b2cd", + "dst": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "131f07f5b40f365fb537b863e4aa5ef0efcd77b7fa2ff321d90eeb743ac43678", + "dst": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ffbdfdbf3427d04f445c33e867845bec1ee64a9dfe0d0fa8284547c2226fdfa9", + "dst": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b53c7188ebf4d630790ff63275679ba48009e31af6e4fe15806619216caa750", + "dst": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b4c6639b49402c2753f83c7fb7d3ffa65da74e47fef2b781933ff55b14d09bcd", + "dst": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c956289db079c00d2f80c590d3c8ca26c37da534fe5f65e799b3982ceca493c", + "dst": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "550d2a8d3047cdae0c05a61cc3de43e758b123a6955fa067d3ac375f7d0dbadc", + "dst": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78740d5bf49989936d315bf641949232aace582e03de57db8abff940f7d51bd1", + "dst": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9f2c83c5165826de1077f428ad39d41473e32ed64cd83180d49e7d8e5db996d0", + "dst": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "883be4d7173c235933294ab8dcae8cc76609166eaa1c1f07e9b51d551c979709", + "dst": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6384ed19650d384c29db4c3a39a1ca855058fab758075be2dee759dd9e6faae1", + "dst": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", + "dst": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c238e82f3a4beee1be7b5b464e8553404f6927d5ab93c3d649d362c01097782", + "dst": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dad4991bfa5c51eb176f28c1b3f86661e02579905e6e07c997df22004e06244a", + "dst": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4ba91512c168281f41d3934b927d0d86a3136a31cc345b635095928f8e5f013c", + "dst": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c416f5e604eeada9ae8e520a429d8f19d4230626769e7121007e01353730784f", + "dst": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7b8787fd4076c27d074d2a4761377a1aa26c843c432e3b7e6b0ebf1e29528188", + "dst": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "38f22b194f04d85a6b545b37df06195edeb8503798b229ddeaa946018150c05c", + "dst": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "246377a036ad5444bcd5f47ac9e55fec7c85fc40644df593038d360554a809f7", + "dst": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c6d5e543ff5f2c2526728d588fb21753db5b7e05b8b275aa5e9b24d29350afb0", + "dst": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "98e223e6e2240fef83082d3daa86e46f10e0c71f3f74489ba95db0951a166f53", + "dst": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c8971ca91f8e21c556f647940073db003f7dd5582ae55d4ebca602d5e8e91a6e", + "dst": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dfa7822c05f54116c9fc3b2cde1ecb4667f47a2d8771fe886e832c223cdc4e82", + "dst": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6d37c0c4b6fcbac1e53a46c9c2dc5d3c3b36312c53f25b2baacc785ea77a11f7", + "dst": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9ba5e31610f0545666f102465efa8caa48ad3fb5b8abd5ae802f4a71e3f7de3b", + "dst": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "3ca365aace71e24b04d6f2ffbf7171468c5e71783858c710cae539c5e43e0c0e", + "dst": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c858f2db2a20ac562d32f8fb2a3a11039849a6e44d2bec30befb2e173532a9a3", + "dst": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1550a76598693b950346397e0e825bbb2805edde38b0d0240e50050829b7b1dd", + "dst": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "466340ab7733abb23ab24d877c673fe089c273f11808fbbd6f33a91da92ee96c", + "dst": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "401d4c0c1060ebbb4b9fb3859c2eb47789f94086f4deb01234bf46f7cdc81247", + "dst": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2c0e3aa084f5fec45f99b3f125ce7d50c6da526ef5165df5f22ba603147c3fc2", + "dst": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2e724d83e35235c23c0bb16ae9b708a5bba3c23b186b05d4b8c606f6bb4b311", + "dst": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4f30eae8c49eb268fe364eaf5ee0788da6e2f6adc2f83cd82e96a4bfe98496f5", + "dst": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8753d5775c22477a8ef74eeebf61d7de30be702e70118f552cc18ad963ffe950", + "dst": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efa2007c561dcbf7c83a6bbdd2ef75e7cca76b05330a8b948ba0dd94dee949f7", + "dst": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b379d1b8ff0153c63ee69c40a7155b97fa42ab570f68ff847d457316c4d8ab9", + "dst": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cc84f93adce16699d9e84ef32f55333402431b58dc50c17084bcb8b33f382f88", + "dst": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f38f0760769c19075034f70b059abf4d1bfa6d01e1e8c369a99900ed1eaeca6d", + "dst": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8d55f76bb0b3dd222cf85a7193501c0f4071b446f56dbd1da355b1625993325a", + "dst": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efde499c7e4444bc602b7bf5ed50e95a18ce8ec9a06ba9d850a05bb7a25ecb3a", + "dst": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2a4d631d5dc90e397d85f13410d1a6d877dcaf592a0e2be2e727443ac74b5bd5", + "dst": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e936299a21240744f6edbab493449323f920bbe15dcf294463e5a2ace10f27b0", + "dst": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "44e17f4bd29411a1614457171c06183e364bf6ff80a201717b2dfc0748e9ebe3", + "dst": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1941e5cc5e38dd92427580af699b1f410be7b29ff17d3d0ff3d046bfba0aaabf", + "dst": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ff6c0f27fcf92f3b4a3871b801c3116847fe47a7e3bafcadd4855d06012091ad", + "dst": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cd6c4b785e60757fad0e6fd4874b729ea7703fe7ee9560e1283d2eb71fc75321", + "dst": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "745eaff456a390c3868742a039e72c2a93ff8eee10417dbe848d533b89facc04", + "dst": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2f3f050c9ef31bf5c3b14c1c71699c4f4b38aa18479531194d12e6277416516", + "dst": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0b95850edabed70762768ac1695c5d7f230cccaa8de06657cda42cafba36374f", + "dst": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7c767d3a06db1ac0e1809ebe29a7d9689143259f4651837de54423e287c20490", + "dst": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78b07e8fe1366e173f2eeb75c35cd53baf0f6100de50ae12b4ffe7d0d7ba4298", + "dst": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5010eb25f6e1ed725fb901ae1e945e545ae846d7be8a135333d2d41102c33328", + "dst": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "178a33e64826cd2039b8538b74e6de513966acab45ab79d77dc9392018a65ffb", + "dst": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "044dc539d063250dc654b2bf0986a9044b4eea05e1284c11a2b313acd8dc3498", + "dst": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9fd5ea38f383291566def44b6fb932414f97123952578fe0cfb9a30eb075a099", + "dst": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "be5930e9cc35801433bcd21db84da7d4f1d8e744feca16a2c6fb00c81ce93e51", + "dst": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8cd999cd193d315e5f1c6f74c230c12e6abe6847924f6e89d988e09ca413f52e", + "dst": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0cff53628eb0e984c134b68cbe4b1bb7721a05adaa32e93b9df489a9a7a176cf", + "dst": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "a5ef046e84be9ff2485dde49afe6073811286761afac3bbd588b6e4130930479", + "dst": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cdee5f84c4f08098ac740e3a260ced14c1e199e126aa5291ec079b281a7dc407", + "dst": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6a24135f8496e7a37dcf7164218bb3aa530319f3b2bf3c7a1a9cc1bd17831328", + "dst": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "693c7f970b34ce5882e62430f4c9c28957159a257d27d4e21a61fd95c6b97464", + "dst": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c008a613cef129c180dbcc7213f2d41a14d245d06a3844d63d9beac963145385", + "dst": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "439cdfd03972fb4bb5da54208cf8098ee78228c487ce9e84623f5f83e17a7d68", + "dst": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "hours": 1 + } + ] + } + ] + }, + "size": 3846 + }, + { + "header": { + "seq": 2, + "block_hash": "01723bc4dc90f1cb857a94fe5e3bb50c02e6689fd998f8147c9cae07fbfa63af", + "previous_block_hash": "baf3b622f043bbe3ef480416251a6545d07f173e5969dde2b63c4a12956d38fd", + "timestamp": 1427927651, + "fee": 0, + "version": 0, + "tx_body_hash": "312a269b8248e389c61571cc13f4ad13b7d53b64853d990ddc301a58e7071889", + "ux_hash": "163a4a92e3ea23475a854215a8813b327f724e374df4b50ac414b94ec57b3c3e" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "312a269b8248e389c61571cc13f4ad13b7d53b64853d990ddc301a58e7071889", + "inner_hash": "4daff2831f5bc2877a98a49b0ef75f8ff01bcb35082fd4018c77707dfca31849", + "fee": 0, + "sigs": [ + "f4482e0781e0d94c8c4773940e1f811405681844a9dc3c1938243442e1cbd5463d5e251880abbf8ff1ed85b4b2659e83ee30f06cc4c5dc9913aa6a9630fbe3de01" + ], + "inputs": [ + { + "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1 + } + ], + "outputs": [ + { + "uxid": "0cd548e03bd13bca8647cd13f6baef0c65fd03081aeb6dc3695536e5bc6018ae", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999990.000000", + "hours": 1 + }, + { + "uxid": "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 3, + "block_hash": "35c3ebbe6feaeeab27ac77c1712051787bdd4bbfb5cdcdebc81f8aac98a2f3f3", + "previous_block_hash": "01723bc4dc90f1cb857a94fe5e3bb50c02e6689fd998f8147c9cae07fbfa63af", + "timestamp": 1427927671, + "fee": 0, + "version": 0, + "tx_body_hash": "a6a709e9388a4d67a47d262b11da5f804eddd9d67acc4a3e450f7a567bdc1619", + "ux_hash": "bd8c7dc7aadb8cd70e8ba97fb71b5ca77c9be157932930bc547a30bb095bc6c7" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "a6a709e9388a4d67a47d262b11da5f804eddd9d67acc4a3e450f7a567bdc1619", + "inner_hash": "ea6adee3180c7f9d73d1e693822d5d1c2bba85067f89a873355bc771a078faa1", + "fee": 0, + "sigs": [ + "ce8fd47e2044ed17998f92621e90329f673a746c802d67f639ca083705dd199f6ee346781497b44132434922879244d819694b5903093f784570c55d293ab4af01" + ], + "inputs": [ + { + "uxid": "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 4, + "block_hash": "415e47348a1e642cb2e31d00ee500747d3aed0336aabfff7d783ed21465251c7", + "previous_block_hash": "35c3ebbe6feaeeab27ac77c1712051787bdd4bbfb5cdcdebc81f8aac98a2f3f3", + "timestamp": 1428793611, + "fee": 1852, + "version": 0, + "tx_body_hash": "c24b92898381fbebe59a457924184f4cce1e7166e140ca75aea5baf854c1ab75", + "ux_hash": "58519fbe20c1ca9db0fb922f5b32808f1d9aed249c266f2d4a14ca2597d80817" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "c24b92898381fbebe59a457924184f4cce1e7166e140ca75aea5baf854c1ab75", + "inner_hash": "43dd65d5644ec5214a901ac94e530cbedb83d2174cf402c7b24697cfe55e1de7", + "fee": 1852, + "sigs": [ + "434a7a0b624fda393c1caa57ac9787f69da3d8854d0ec6f69f0da1c96c9b683d787064b644e9ac3dd4dd8466c22c1547cff89c2552420f5efcfd1eacb1a2eac301" + ], + "inputs": [ + { + "uxid": "0cd548e03bd13bca8647cd13f6baef0c65fd03081aeb6dc3695536e5bc6018ae", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999990.000000", + "hours": 1, + "calculated_hours": 5556 + } + ], + "outputs": [ + { + "uxid": "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999980.000000", + "hours": 3704 + }, + { + "uxid": "98b3e6e6d4ed36159b7dbf5f305174fc0c255d2d97528b35a67d50b9968e2b2f", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 5, + "block_hash": "114fe60587a158428a47e0f9571d764f495912c299aa4e67fc88004cf21b0c24", + "previous_block_hash": "415e47348a1e642cb2e31d00ee500747d3aed0336aabfff7d783ed21465251c7", + "timestamp": 1428798821, + "fee": 2036, + "version": 0, + "tx_body_hash": "0579e7727627cd9815a8a8b5e1df86124f45a4132cc0dbd00d2f110e4f409b69", + "ux_hash": "70439be07958c0dfa9932bfa108d7dad20a37db7ae6db4e06a3225443d4b5481" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "0579e7727627cd9815a8a8b5e1df86124f45a4132cc0dbd00d2f110e4f409b69", + "inner_hash": "fe123ca954a82bb1ce2cc9ef9c56d6b649a4cbaf5b17394b0ffda651ed32327e", + "fee": 2036, + "sigs": [ + "056ed0f74367fb1370d7e98689953983d9cf34eb6669854f1645c8a16c93d85075661e7d4f6df0ce5ca8eb9852eff6a12fbac2caafee03bb8c616f847c61416800", + "8aaa7f320a7b01169d3217a600100cb27c55e4ce56cd3455814f56d8e4e65be746e0e20e776087af6f19361f0b898edc2123a5f9bd35d24ef8b8669ca85b142601" + ], + "inputs": [ + { + "uxid": "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 2405 + }, + { + "uxid": "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999980.000000", + "hours": 3704, + "calculated_hours": 3704 + } + ], + "outputs": [ + { + "uxid": "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999890.000000", + "hours": 4073 + }, + { + "uxid": "dc63c680f408c4e646037966189383a5d50eda34e666c2a0c75c0c6bf13b71a1", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "100.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 6, + "block_hash": "103949030e90fcebc5d8ca1c9c59f30a31aa71911401d22a2422e4571b035701", + "previous_block_hash": "114fe60587a158428a47e0f9571d764f495912c299aa4e67fc88004cf21b0c24", + "timestamp": 1428806251, + "fee": 0, + "version": 0, + "tx_body_hash": "03b3ab821cdaf0ab8cc1a9e2dd30108772ec3bda09e9d3a8c48df9f30d213b38", + "ux_hash": "dad0a423ff7b1c5c6021698c5c75da34df37b9fc0a5b0c60bcbb50e8665c0610" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "03b3ab821cdaf0ab8cc1a9e2dd30108772ec3bda09e9d3a8c48df9f30d213b38", + "inner_hash": "e49bf8f45cb6664d36ec632e37bd91566d8bd4ea9ce209a0a955323a94dd744f", + "fee": 0, + "sigs": [ + "0a0d9a3fa0597667fb991bbe047ff93c591313faf759fcec2f47138bc0666b333b7689ad527ddb8ef135897be41016f755eb14e46cd327fc5eb196bce80c3cd400" + ], + "inputs": [ + { + "uxid": "dc63c680f408c4e646037966189383a5d50eda34e666c2a0c75c0c6bf13b71a1", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "100.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "8ff8a647e4542fab01e078ac467b2c9f2e5f7de55d77ec2711f8abc718e2c91b", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "95.000000", + "hours": 0 + }, + { + "uxid": "778048daec0c83f89525a6d69b60c407d090bb1666711b1c560e6ebee8dcc452", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 7, + "block_hash": "6cb71b57c998a5367101e01d48c097eccd4f5abf311c89bcca8ee213581f355f", + "previous_block_hash": "103949030e90fcebc5d8ca1c9c59f30a31aa71911401d22a2422e4571b035701", + "timestamp": 1428807671, + "fee": 0, + "version": 0, + "tx_body_hash": "f832428481690fa918d6d29946e191f2c8c89b2388a906e0c53dceee6070a24b", + "ux_hash": "ee38fa1b02dd0d190187c9cd9aba2d7296e0aa7b6b983f61c1d1fe998c1433c7" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "f832428481690fa918d6d29946e191f2c8c89b2388a906e0c53dceee6070a24b", + "inner_hash": "f440c514779522a6387edda9b9d9835f00680fb314546efb7bc9762a17884156", + "fee": 0, + "sigs": [ + "8fe96f5502270e4efa962b2aef2b81795fe26a8f0c9a494e2ae9c7e624af455c49396270ae7a25b41d439fd56dea9d556a135129122de1b1274b1e2a5d75f2ea01" + ], + "inputs": [ + { + "uxid": "8ff8a647e4542fab01e078ac467b2c9f2e5f7de55d77ec2711f8abc718e2c91b", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "95.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "17090c40091d009d6a684043d3be2e9cb1dc60a664a9c2e388af1f3a7345724b", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "90.000000", + "hours": 0 + }, + { + "uxid": "f9e7a412cdff80e95ddbe1d76fcc73f967cb99d383b0659e1355c8e623f02b62", + "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 8, + "block_hash": "34ec53ac5b15e8c0c60312f67e209318c3b09c5ecbaabf0843a161f889614584", + "previous_block_hash": "6cb71b57c998a5367101e01d48c097eccd4f5abf311c89bcca8ee213581f355f", + "timestamp": 1428807691, + "fee": 0, + "version": 0, + "tx_body_hash": "7229422f3a0afb5f3a9596ed50146440c17a3d54abda0f3c70cd9dc58de96374", + "ux_hash": "34174a65e1b34d0d7dd0e219f7969e303d4117024b14f8fa5ecc58c29c4c417c" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "7229422f3a0afb5f3a9596ed50146440c17a3d54abda0f3c70cd9dc58de96374", + "inner_hash": "68fb8cd96b0d2a94838183ab24f36f71006383add373837d448a7584ef69bc6c", + "fee": 0, + "sigs": [ + "b859da7c65d6525247973fc62d274343feb3fe6fd76ab392dc30d7cdc609a7e45018b425fbdc3e79647e43b99d25bfab6c23d60495e5e0ce3cf06b6ce2c4897d00" + ], + "inputs": [ + { + "uxid": "17090c40091d009d6a684043d3be2e9cb1dc60a664a9c2e388af1f3a7345724b", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "90.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "999cc56deae71486a28e19d1ed8d585c2cf07d5ee27d1c33bea186d23aaca06a", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "85.000000", + "hours": 0 + }, + { + "uxid": "1f810bdd1c65ad50f27f2c47a000150877fdba2fdb78b9d8cae39946be6a9e33", + "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 9, + "block_hash": "d33c2466840a09e10efe3736f3aaad05b6b8d05cedcdd0099f84fd1ec6f55282", + "previous_block_hash": "34ec53ac5b15e8c0c60312f67e209318c3b09c5ecbaabf0843a161f889614584", + "timestamp": 1428807711, + "fee": 0, + "version": 0, + "tx_body_hash": "9d87d7bb9e56a3588bacb478c7556280b28c0a49f6e09db8b54a84c20d865f2f", + "ux_hash": "4f560eea54f060c029cedc78480a59f6ca549d4fd6cb84fb0388001dcd11b5b7" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "9d87d7bb9e56a3588bacb478c7556280b28c0a49f6e09db8b54a84c20d865f2f", + "inner_hash": "f60dd876ff32adc5e20759f45c04075f46796b0ca2b76a490d5d1e2d5b18424a", + "fee": 0, + "sigs": [ + "be2ea2bcb4be07705cd034579d77c2fe0f9c7bb29dad0e690f38f8a2e098041c396820004975298d9d3647dfec7cbb610452e294381b898f28d48f166aaea5a500" + ], + "inputs": [ + { + "uxid": "999cc56deae71486a28e19d1ed8d585c2cf07d5ee27d1c33bea186d23aaca06a", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "85.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "2f87d77c2a7d00b547db1af50e0ba04bafc5b05711e4939e9ec2640a21127dc0", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "80.000000", + "hours": 0 + }, + { + "uxid": "9e8997e53d2e61955da71dbbc6ba5b0da799eaace0f45870a4e42276a6fdaefa", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 10, + "block_hash": "5c5e6b0f6620a3af54a3259222a5269e60db768d7f805edce3f3e29f2597a487", + "previous_block_hash": "d33c2466840a09e10efe3736f3aaad05b6b8d05cedcdd0099f84fd1ec6f55282", + "timestamp": 1428807771, + "fee": 0, + "version": 0, + "tx_body_hash": "98db7eb30e13853d3dd93d5d8b4061596d5d288b6f8b92c4d43c46c6599f67fb", + "ux_hash": "dc4b68b8067932c191922c68504bc443c46144ef904c12b50008b3d77ae91aeb" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "98db7eb30e13853d3dd93d5d8b4061596d5d288b6f8b92c4d43c46c6599f67fb", + "inner_hash": "affafab93dc807a9306d1f3c6a19066aca57f284825420fb01e48200349f7ba2", + "fee": 0, + "sigs": [ + "71008403c675d9b3fdf8c09cc6caa64c681b78ba588fe20abb568e318d2e40b55c44ea614efc475c408e1e6e15cc0df753e6d3f04cb521078e6c928d5aa64c3200" + ], + "inputs": [ + { + "uxid": "2f87d77c2a7d00b547db1af50e0ba04bafc5b05711e4939e9ec2640a21127dc0", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "80.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "0c5d1b6a61c32f9bcc62d3583ac957b3374f0daf1a14fd08679bff2554449840", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "75.000000", + "hours": 0 + }, + { + "uxid": "ec2c2238793d71240502de3e7c46ec1d5bf938c76541185f1c3fdf0d99a90795", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-verbose-genesis.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-verbose-genesis.golden new file mode 100644 index 00000000..b9123399 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-verbose-genesis.golden @@ -0,0 +1,38 @@ +{ + "blocks": [ + { + "header": { + "seq": 0, + "block_hash": "0551a1e5af999fe8fff529f6f2ab341e1e33db95135eef1b2be44fe6981349f3", + "previous_block_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": 1426562704, + "fee": 0, + "version": 0, + "tx_body_hash": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "ux_hash": "0000000000000000000000000000000000000000000000000000000000000000" + }, + "body": { + "txns": [ + { + "length": 0, + "type": 0, + "txid": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "fee": 0, + "sigs": [], + "inputs": [], + "outputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000 + } + ] + } + ] + }, + "size": 86 + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-verbose-last-10.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-verbose-last-10.golden new file mode 100644 index 00000000..807419ef --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/blocks-verbose-last-10.golden @@ -0,0 +1,646 @@ +{ + "blocks": [ + { + "header": { + "seq": 170, + "block_hash": "e854e12b5ed0bcb26b2348448fa2af1cd30cf371763fa91019d62a950bf36c95", + "previous_block_hash": "e266c8beae9f650a3f1cdfa611d9016d99e2ba4b4a67b5d6c4629bc6e66f5f9e", + "timestamp": 1430836422, + "fee": 62, + "version": 0, + "tx_body_hash": "95d847102c01d071982e67b8e7dfae50715b0fc0179d33f4b050974e634905e1", + "ux_hash": "d954806eed41026d3c60bc88e8fb569b3aa9007a9679e03ac61724ee3e723b01" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "95d847102c01d071982e67b8e7dfae50715b0fc0179d33f4b050974e634905e1", + "inner_hash": "c13b7e1722f3616f61948ed42382d4ed41164e7e2110d2d60bf86725f32531de", + "fee": 62, + "sigs": [ + "cb7da0e16b83f1717614c7f160580ac0048a4276682ac4046c3324ba6f4e24901d162f7ec81a8e5cdf3676df6ace9a73c77e4d3ab7f03a4f0272c75f3715665001" + ], + "inputs": [ + { + "uxid": "bffea1990d71311b695b2d343b9f09a216b7a8257c1cdcb01b2ab9459e1490e3", + "owner": "jtuSERvfzN3kUYekg8LemCQ5kF5g97N8ZL", + "coins": "10.000000", + "hours": 70, + "calculated_hours": 70 + } + ], + "outputs": [ + { + "uxid": "be081639ea8da63d8542707e9ea9625f6afc97da132f43ed061645c359bb1e65", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10.000000", + "hours": 8 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 171, + "block_hash": "a58ab1c90b6564043f375c48413800c33ff05c9eef017250672ea5a0dd11bf17", + "previous_block_hash": "e854e12b5ed0bcb26b2348448fa2af1cd30cf371763fa91019d62a950bf36c95", + "timestamp": 1430870562, + "fee": 6084778, + "version": 0, + "tx_body_hash": "fb495093f2f4e5c6555c50150ea60c0a6f430e53aa971ebb3e2b5412866a1f06", + "ux_hash": "e06be06b42f1aa65940658c601cf7132041f7a1eeaffdeede72cef54d9465e66" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "fb495093f2f4e5c6555c50150ea60c0a6f430e53aa971ebb3e2b5412866a1f06", + "inner_hash": "05596340e51ad628080101c8e92a60f27e0f5ab509e892f9b65a0988b1575ddb", + "fee": 6084778, + "sigs": [ + "068a56e916267a1756d9348bb965f3ed2dcba956fe4c626cd4836921dd836f7c0fa923d6451d5c87aa2eab528ff19ec332434bd12e197eeafbf0896e84940c4401" + ], + "inputs": [ + { + "uxid": "6b3a0cab1d9ad6fd011a3bac5e6ff4e3f7903bce911dc7fe83926eae557c34c3", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "658214.000000", + "hours": 4206, + "calculated_hours": 8113036 + } + ], + "outputs": [ + { + "uxid": "372703f8109295f0f58fbee58795979e10dd887869f4fc1da4881ce8a3c0aeb4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "647750.000000", + "hours": 1014129 + }, + { + "uxid": "a35044035cce79cb988c757dcaf5d9a065957c0fbc1a3559d08ed46831504fc2", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "10464.000000", + "hours": 1014129 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 172, + "block_hash": "78ae70c3a0f403b6b5d14dab13e3d29f151a0e279a8a4818fa0fe9becb639dc2", + "previous_block_hash": "a58ab1c90b6564043f375c48413800c33ff05c9eef017250672ea5a0dd11bf17", + "timestamp": 1430870592, + "fee": 849078, + "version": 0, + "tx_body_hash": "7abef7e4080bf2cbe9f147d7c9cbe4c950b38f8477d304466c938b937cd379ba", + "ux_hash": "41c039e8b2ade1a2cd9f7a58873d57729c30d3639a33755b0317ceff66e6f7a9" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "7abef7e4080bf2cbe9f147d7c9cbe4c950b38f8477d304466c938b937cd379ba", + "inner_hash": "f28366f7590220cd42faaf9ea041c8ca4460707e0dbfe1d3ac67da8d9dda268c", + "fee": 849078, + "sigs": [ + "e9ff8a0ce6c5e8b09936e031ef8cc6a0f3f3ed0a5360dcf2f649db3a2da958441c20916b27d1ad2ea8415679755b36967074e20feab7271528cb6b3266268ec201" + ], + "inputs": [ + { + "uxid": "074645413ab2aae818e657f6f36420447a872e7cdd2ff64324b486be4d4d1edd", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "29100.000000", + "hours": 494004, + "calculated_hours": 1132102 + } + ], + "outputs": [ + { + "uxid": "b1b832a911d45aeaab73676caad794fe2ab99d423f80c4ff58cfb269656b03dd", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "28100.000000", + "hours": 141512 + }, + { + "uxid": "c31c199a54ecbea5e57bf7f5e73d231a09e11713dd0ee70e340e4b0a9c9f9fdc", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 141512 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 173, + "block_hash": "55b1be7e73d1ec35d71c8bc6f62e1788ded35752b39188c98cab6c9347f77ead", + "previous_block_hash": "78ae70c3a0f403b6b5d14dab13e3d29f151a0e279a8a4818fa0fe9becb639dc2", + "timestamp": 1430871512, + "fee": 764646, + "version": 0, + "tx_body_hash": "a7665cec98224150968ec1ef9ef2d6b3175c9de8f9f8c7bc786b30cc74997c57", + "ux_hash": "abc08f5bf1ed183dd5dfa6dda09d9de6adfa23e310454861ae1fb938e0384321" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "a7665cec98224150968ec1ef9ef2d6b3175c9de8f9f8c7bc786b30cc74997c57", + "inner_hash": "5bd2503c4ff78e7c9d182bfe5e62e54f1bfb944bb526d97b272021d8ccfa9359", + "fee": 764646, + "sigs": [ + "dbd1e8763cb9681aeb96edc0c8483decee30b670778bec88da249f9d4f2201c330d2a16349608ba51eb8a387805dce9618810c4e6fd7af548cccee7d2c9c5dd201" + ], + "inputs": [ + { + "uxid": "372703f8109295f0f58fbee58795979e10dd887869f4fc1da4881ce8a3c0aeb4", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "647750.000000", + "hours": 1014129, + "calculated_hours": 1019526 + } + ], + "outputs": [ + { + "uxid": "14027340f6e1d98bba3f7f5f3b50e3588f8a19e4d021db944e7a28b2643640e1", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "635750.000000", + "hours": 127440 + }, + { + "uxid": "793f3f0e41c9d1de391d864792b79ed8c24dde5ff84a73c161d660a73ed70c90", + "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "12000.000000", + "hours": 127440 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 174, + "block_hash": "0a4f2c0ea33c75ae7af4eb743935f53f0953e26fec3bf7128f0a88fdb879f497", + "previous_block_hash": "55b1be7e73d1ec35d71c8bc6f62e1788ded35752b39188c98cab6c9347f77ead", + "timestamp": 1430871622, + "fee": 111521, + "version": 0, + "tx_body_hash": "ad44a8027a825e82a20cdd910d9bd41d74025601b7668c80655e9b45afb8bb93", + "ux_hash": "4f36b853bdb042046c522f2f5e397ccb24b59a5ef6931dd1cb1d48cc87a1ffc9" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "ad44a8027a825e82a20cdd910d9bd41d74025601b7668c80655e9b45afb8bb93", + "inner_hash": "af11c711190f9b52114dd31dcc4dbcdff3f169c6ce2559ff5baf14032e057145", + "fee": 111521, + "sigs": [ + "fd019f0cc492d5b6ba1bab0e3c77659b0e4773ea9b7dbe9808ea1392bfcd41e20aec3438076cb6ae4104bb6730b47ad1f1cfe878155f984ee380da10991b2a5601" + ], + "inputs": [ + { + "uxid": "b1b832a911d45aeaab73676caad794fe2ab99d423f80c4ff58cfb269656b03dd", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "28100.000000", + "hours": 141512, + "calculated_hours": 148693 + } + ], + "outputs": [ + { + "uxid": "c39acd3494113650c1a6a7809287af7b12a78bbd97126d4585dd1715e2cb5a66", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23100.000000", + "hours": 18586 + }, + { + "uxid": "2d3f7890d11efedd4cee3a7ab4a5cbc56d2c8df4f02124bdad9ec839400053ba", + "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "5000.000000", + "hours": 18586 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 175, + "block_hash": "218d3fadc712eec96e1ca2f68adbb468092c597f269fb3a3702b77c2b80665af", + "previous_block_hash": "0a4f2c0ea33c75ae7af4eb743935f53f0953e26fec3bf7128f0a88fdb879f497", + "timestamp": 1430908702, + "fee": 110149, + "version": 0, + "tx_body_hash": "9364ed6cfcc289df74dc6bac1993f7ab3441b898cb3f06918198d2476c83dbac", + "ux_hash": "4013a4dd63875f19f124c440685a727e9654d8c2de3298f416bd98c2bbcf2ac9" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "9364ed6cfcc289df74dc6bac1993f7ab3441b898cb3f06918198d2476c83dbac", + "inner_hash": "a55922b0495d39c8e9db70ac9aca99266d5a7f3644106b4b5468345d955acf41", + "fee": 110149, + "sigs": [ + "cecae09b7925e9f6db1ccf5ef9a93687a43bbeaefe2888abcc07411c71f850c80c05ed573abd67bf9f0e8a096a1aba8187547e3d062e5ed147ac51961cc3559701" + ], + "inputs": [ + { + "uxid": "14027340f6e1d98bba3f7f5f3b50e3588f8a19e4d021db944e7a28b2643640e1", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "635750.000000", + "hours": 127440, + "calculated_hours": 146865 + } + ], + "outputs": [ + { + "uxid": "8e55f10a0615a0737e6906132e09ac08a206971ba4b656f004acc7f4b7889bc8", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "625750.000000", + "hours": 18358 + }, + { + "uxid": "d91e07318227651129b715d2db448ae245b442acd08c8b4525a934f0e87efce9", + "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "10000.000000", + "hours": 18358 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 176, + "block_hash": "7ca9af9ed16449652da34d3ab49f3d6fc6be8cc1af3d31be81043e684f14de37", + "previous_block_hash": "218d3fadc712eec96e1ca2f68adbb468092c597f269fb3a3702b77c2b80665af", + "timestamp": 1431162639, + "fee": 2711954, + "version": 0, + "tx_body_hash": "a17cf54c20ac7ec6e1362acf24c5e5589ed8b49bdba791a87430de160a473913", + "ux_hash": "5ad39ab834a65739085413db13fb8c152a641ba28b2b45322d1da9c6d9aa05ef" + }, + "body": { + "txns": [ + { + "length": 1481, + "type": 0, + "txid": "a17cf54c20ac7ec6e1362acf24c5e5589ed8b49bdba791a87430de160a473913", + "inner_hash": "71127fa12d9ca390715586fe313b4e130b24614e0eaec276dc2dd25b7228c39f", + "fee": 2711954, + "sigs": [ + "95855ae7d279d4797bafe542fd1803eb6a89533f29ae0d89d3f51256feeacc343dbd3da0d8d104e436c04643c72b5dab7a74634befc942ef9d96ded3e235ab4b01", + "55222337fce2733e7a3f92bf808da32759f33327c616828bdb0a350e5d3567b34fdef1a55340d7f857c4daed9735ad64394697ad941fc883f9365693991299a500", + "950281f4acb6cb8176929740aa90fa8729ac5687ef6500bc087429c43f5414e319c26142fca51c0ed9e5d434a6c83d2e3c837d7c9213398ae2104429d03f35dc01", + "c41f7425ecb51359a1da6ccf090a565beed72c891c49a8c81939a46f914c55de5766e99f1519302bfeef2224f856c859391d1f531004ee088083259fca82b17400", + "ed7085f8ceb26060851a71f665387d7c44774c6b9ddfc8d3a06e1fe50168d48510f63f5b6a0998c2a30d24bf37f1c6030035ef8df6efe6dfdcae38beeaf3a5a701", + "a88fefcc8f2809a288a275aac579f340c5138f8bfedf02964d4e3ed0492ee54e696de7e6f7f0b3f315461fb5df4f8e5e5fc7a5339ca6899c6ca7b122c54c90db00", + "ad9b245807ab8c5c5a713ab7e3bfbbba8af032bc4915c1824d95e95827d95be473eb1f6952ee489ddad59049364220bab124182251142b849235ed552404ba3d01", + "7a403c671ec5a6a6622ff63e4d482d51fda747cbe85cf8ef642aa840154be435409df707aa81a3c4e553e0c2c250a452e8416dc38697c35f830de27924a052fc01", + "06b5966aa7c7dfd425e773aafd46fdf29b41734b73f84ef1cd8941e617e0d6245e99f6d8be8b9609686b0faee4923b8bc149078ebb18c1b2e8f6318c846675e801", + "c5634bef581b26d600ed6f4cea47f402633e74ab8f5497b2c2ca69a01e3dfeda0a38308a4a96cfe58857e4c0c2311ecf4e3f4eef69aa771a1db89c360892492200", + "4807a114ffe9e44797843f76c74e81d72324885a67d560c4e1d6e4cadd271b637176a932dc045844b52a4c92f6892ebb0265838366827fd0e0b6b7e20e4e1ff501", + "bc1ca4e3d0afd920bad8c4ef8a6b847c71f75ae8ca913ddb5d976dca42af12ea3ec3a2e59ec8f57fe4fb41af3f439387272ea847240ee89468c4d808303cf9be00", + "366f0f68a36bccd22e829eb05f960a8015466bb5eeb8e553dd37b52ab624d1756f68501db2a8d14fda04d1adf3239a9785ec142c14c5bb34cb8d47629c191dc901", + "146eed504f7acbbece951bfea4eb426e80852e3dc6ae9c8a68480fdf4e07ddd73a5709e2f9df0154380d837a5ff66582c07a0fc27d0df4e7d6d28bbcb90e3c8d00" + ], + "inputs": [ + { + "uxid": "04c0cd4cbee1e5414791d9e0b9ae4f889bc52d253b5f70b09fbc32c88fb415ae", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "3.000000", + "hours": 4, + "calculated_hours": 1748 + }, + { + "uxid": "f3034ffe54e869315f8e11801d3e755352fb75b878b24313302273c1b7ea62cb", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1.000000", + "hours": 0, + "calculated_hours": 581 + }, + { + "uxid": "3538af0016ec0f4d0e943c5d49daf280b416701fde4040fa72710c0ca1b5b559", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1.000000", + "hours": 0, + "calculated_hours": 581 + }, + { + "uxid": "0560bae3917bca7581af9b6c5a58e395c701ce9ed0241dac2de8a3e93c0b839b", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 1605, + "calculated_hours": 510237 + }, + { + "uxid": "3fe7d61ffa993e00200ce6be7ba347c603032ac3f8c4ace07767e630fe94d76c", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 125696, + "calculated_hours": 610213 + }, + { + "uxid": "2a09e97f7725a35af1357842206875a023252da4ebfce129eaf4cb87119cfd41", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 2704, + "calculated_hours": 487118 + }, + { + "uxid": "617b584bb9e6b1d80daac915fb3079b22a326777d1515a40e7b7eddf427f4099", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 3102, + "calculated_hours": 163688 + }, + { + "uxid": "18293d947aadf89d9e57d18fa01408867a9abe267504edbdabf8c2a57d9a6323", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 112148 + }, + { + "uxid": "045dc2e76321e37884588093083ce1b21be12f20ba1fa36f2a755b894229e3cf", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 73857 + }, + { + "uxid": "b1e5c694c30326cda3df2e634723999befbcbb141415e9a36bdbf18d7bea9870", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "6336.000000", + "hours": 0, + "calculated_hours": 340570 + }, + { + "uxid": "db7a63750db787959a9e0d2d6be9a1ba8bb3d6015bae2353a27ae9eb55b39d22", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "150.000000", + "hours": 0, + "calculated_hours": 5180 + }, + { + "uxid": "5954742a6ca4e3e872d12d4a93436451ad52e6d25e5ac28371e308b2d7ce75a3", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 32930 + }, + { + "uxid": "a35044035cce79cb988c757dcaf5d9a065957c0fbc1a3559d08ed46831504fc2", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "10464.000000", + "hours": 1014129, + "calculated_hours": 1124989 + }, + { + "uxid": "c31c199a54ecbea5e57bf7f5e73d231a09e11713dd0ee70e340e4b0a9c9f9fdc", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 141512, + "calculated_hours": 152098 + } + ], + "outputs": [ + { + "uxid": "d6735d3ad70dbf553048faf1c529d047ab12282d04e320bd67c915779fc4e3fd", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "24950.000000", + "hours": 451992 + }, + { + "uxid": "a5f3c513b5a01dc5e943a5cae91f54b54cde55e984a9480d68d690f40dfb7914", + "dst": "v4qF7Ceq276tZpTS3HKsZbDguMAcAGAG1q", + "coins": "5.000000", + "hours": 451992 + } + ] + } + ] + }, + "size": 1481 + }, + { + "header": { + "seq": 177, + "block_hash": "3e8ac6b4c715bd92db824163770e28ee1b5362d449241f77719f13614b3c320a", + "previous_block_hash": "7ca9af9ed16449652da34d3ab49f3d6fc6be8cc1af3d31be81043e684f14de37", + "timestamp": 1431162689, + "fee": 338994, + "version": 0, + "tx_body_hash": "e4850021fb706f2b7a94fec9ade3c166823dcd980dc3954437471d98fb9d2280", + "ux_hash": "c9b05516880ca6665a0f4fa52e7feb6fe83c1ffd6f4d2874877dfa67265524e2" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "e4850021fb706f2b7a94fec9ade3c166823dcd980dc3954437471d98fb9d2280", + "inner_hash": "1a07c8a17c429aec5c0725dc6e4891f4e304a483211f99b847a6820e410b56ef", + "fee": 338994, + "sigs": [ + "e7d92fbcc6716645c2c28a66ac289453b2967c620e105c7699cee251aa6916227057789d10889689a3f3c743dadfea09e1cf747cc7b7ccb5381fe1af1069e06201" + ], + "inputs": [ + { + "uxid": "d6735d3ad70dbf553048faf1c529d047ab12282d04e320bd67c915779fc4e3fd", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "24950.000000", + "hours": 451992, + "calculated_hours": 451992 + } + ], + "outputs": [ + { + "uxid": "ec439e7c7d8517824885ae1520fa5b19f991d7ade3a12209c0e87f6ad1d30229", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "4950.000000", + "hours": 56499 + }, + { + "uxid": "f5e7796297b7201b1ea87736fadddc7b451f9ed7d4529cfe9f03082e80917628", + "dst": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "20000.000000", + "hours": 56499 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 178, + "block_hash": "bb943b37f989326b057903ccc6eb1fa58a5d35e38706ae1ba81e0a6100bacf26", + "previous_block_hash": "3e8ac6b4c715bd92db824163770e28ee1b5362d449241f77719f13614b3c320a", + "timestamp": 1431162729, + "fee": 395493, + "version": 0, + "tx_body_hash": "ecd101a6af263973ab75f87a3116231e6fe84a2281d0001c9aa2d7195545e78e", + "ux_hash": "428b5ba5d4928fa538d9a031bf9fa3eb215b47d780e43e69bcd71d87758ada2f" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "ecd101a6af263973ab75f87a3116231e6fe84a2281d0001c9aa2d7195545e78e", + "inner_hash": "41bc4ea9ec8214b461a5377d0ae0da38831bc972b8dd54becaf195b5943dd55e", + "fee": 395493, + "sigs": [ + "4a604f9845e202871ac8741962280bb5db6f1295353042922a6f46671f27cc1d6cd4085aec390205aa5ba08f2c841295b4c86d2fab81d6e29fc958dfe9712e2301" + ], + "inputs": [ + { + "uxid": "a5f3c513b5a01dc5e943a5cae91f54b54cde55e984a9480d68d690f40dfb7914", + "owner": "v4qF7Ceq276tZpTS3HKsZbDguMAcAGAG1q", + "coins": "5.000000", + "hours": 451992, + "calculated_hours": 451992 + } + ], + "outputs": [ + { + "uxid": "ba1adbf3006a239fb7ef6efb1f9390a25951a5185dc312dd81bf88025f838456", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "5.000000", + "hours": 56499 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 179, + "block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "previous_block_hash": "bb943b37f989326b057903ccc6eb1fa58a5d35e38706ae1ba81e0a6100bacf26", + "timestamp": 1431339429, + "fee": 33129894, + "version": 0, + "tx_body_hash": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "ux_hash": "c99075adc48450a9bf04b8b06defba39fc9cb029fbac413d57ee9fea241d84b4" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "inner_hash": "db98f515ce6c3d99fd7c39a6ac59ab498b1a2cc8fc6a13377ac7d3d463898e7c", + "fee": 33129894, + "sigs": [ + "1ca18424c9a313e9c253aecaec3c532c35c60e454f026a3d2794c772bc74a19809d53f8862962e865dd822dd054cd7f32b89b810968d95c9db6a9a0c1095390601" + ], + "inputs": [ + { + "uxid": "8e55f10a0615a0737e6906132e09ac08a206971ba4b656f004acc7f4b7889bc8", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "625750.000000", + "hours": 18358, + "calculated_hours": 44173190 + } + ], + "outputs": [ + { + "uxid": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "hours": 5521648 + }, + { + "uxid": "01f9c1d6c83dbc1c993357436cdf7f214acd0bfa107ff7f1466d1b18ec03563e", + "dst": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "10050.000000", + "hours": 5521648 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 180, + "block_hash": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "previous_block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "timestamp": 1431574528, + "fee": 2265261, + "version": 0, + "tx_body_hash": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "ux_hash": "058d1d0a22be7b9f5567a236866836a87d922760581832cfb8bfbd8b337d64b1" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "inner_hash": "d5b18a0c0c454e56fe1f7d0c64236d633f65717c04f08cd943f5669b4cc34667", + "fee": 2265261, + "sigs": [ + "2fac42571bb301783e46e804069c73c8226b637ae6385fec793e3a3860feaa6918058c55f461cef38341670c5c2da230d2241f267dbde6fc0528a6fb24362b3b00" + ], + "inputs": [ + { + "uxid": "c39acd3494113650c1a6a7809287af7b12a78bbd97126d4585dd1715e2cb5a66", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23100.000000", + "hours": 18586, + "calculated_hours": 3020347 + } + ], + "outputs": [ + { + "uxid": "75692aeff988ce0da734c474dbef3a1ce19a5a6823bbcd36acb856c83262261e", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "hours": 377543 + }, + { + "uxid": "a4b70476ea1e079ebd3503b52eee32d490515457fce6a5aa075770b598a9d14f", + "dst": "CDD8GoJUHEvBm1pD3BQ3hEC2KcJNhvUzpu", + "coins": "1000.000000", + "hours": 377543 + } + ] + } + ] + }, + "size": 220 + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/coinsupply.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/coinsupply.golden new file mode 100644 index 00000000..2ac17eb8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/coinsupply.golden @@ -0,0 +1,111 @@ +{ + "current_supply": "384300.000000", + "total_supply": "25000000.000000", + "max_supply": "100000000.000000", + "current_coinhour_supply": "202549286", + "total_coinhour_supply": "24569186081", + "unlocked_distribution_addresses": [ + "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm" + ], + "locked_distribution_addresses": [ + "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm" + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/confirmed-and-unconfirmed-transactions-verbose.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/confirmed-and-unconfirmed-transactions-verbose.golden new file mode 100644 index 00000000..6279e632 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/confirmed-and-unconfirmed-transactions-verbose.golden @@ -0,0 +1,168 @@ +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 17, + "block_seq": 164 + }, + "time": 1430790052, + "txn": { + "timestamp": 1430790052, + "length": 220, + "type": 0, + "txid": "743bf1eede313145824db1c4f8d683b74ab5e0bc825082d986308b73fd52f1d7", + "inner_hash": "a0427c37a8ca9f8205630cc8d4c6d95200413d3397a0de9bf015763107b8fc80", + "fee": 0, + "sigs": [ + "dc400e921f7f94da5f353846f1340e039b4527fff121a56579390fb4fa4154634e3b3aad44ddf0aaebea5abc1dc5ba2a00540fd2888ed5c4ab7b20c51255086a01" + ], + "inputs": [ + { + "uxid": "c07593d4329f82da243e4bbd7430e4b10e7b35f9ce0a3718d0e6d25d20b4939b", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "661314.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "4d52106e41dba0099549fd81fb8feb6915225b0125c53faa0f7c578ea78f213a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "660314.000000", + "hours": 0 + }, + { + "uxid": "bc513a68461d5c401e65a500baf7dfa163735ef63b817bb7b73c4139d5c29d18", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 12, + "block_seq": 169 + }, + "time": 1430836392, + "txn": { + "timestamp": 1430836392, + "length": 220, + "type": 0, + "txid": "acfb61f7ca39d5dfe33e8ed66f73ab181da0a3206d457bf055dcc4b9731a3ec8", + "inner_hash": "85c5d3963f2dce44e99500967e8b8b1943839537fb198186131459a3022d161a", + "fee": 421, + "sigs": [ + "473114dcb42e2091f3d0396ecd16ee2685e0a6074c7de218cbd7e7c4335d89146455bc6c259c77f40d4af769e241aba1e3a102c5755946b1783c817ffafa67d101" + ], + "inputs": [ + { + "uxid": "bc513a68461d5c401e65a500baf7dfa163735ef63b817bb7b73c4139d5c29d18", + "owner": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 561 + } + ], + "outputs": [ + { + "uxid": "639e69c4a223b5082b9274caf3e56ecff2ab55cd90cac94fdb4c383a1013ba1f", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "990.000000", + "hours": 70 + }, + { + "uxid": "bffea1990d71311b695b2d343b9f09a216b7a8257c1cdcb01b2ab9459e1490e3", + "dst": "jtuSERvfzN3kUYekg8LemCQ5kF5g97N8ZL", + "coins": "10.000000", + "hours": 70 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 11, + "block_seq": 170 + }, + "time": 1430836422, + "txn": { + "timestamp": 1430836422, + "length": 183, + "type": 0, + "txid": "95d847102c01d071982e67b8e7dfae50715b0fc0179d33f4b050974e634905e1", + "inner_hash": "c13b7e1722f3616f61948ed42382d4ed41164e7e2110d2d60bf86725f32531de", + "fee": 62, + "sigs": [ + "cb7da0e16b83f1717614c7f160580ac0048a4276682ac4046c3324ba6f4e24901d162f7ec81a8e5cdf3676df6ace9a73c77e4d3ab7f03a4f0272c75f3715665001" + ], + "inputs": [ + { + "uxid": "bffea1990d71311b695b2d343b9f09a216b7a8257c1cdcb01b2ab9459e1490e3", + "owner": "jtuSERvfzN3kUYekg8LemCQ5kF5g97N8ZL", + "coins": "10.000000", + "hours": 70, + "calculated_hours": 70 + } + ], + "outputs": [ + { + "uxid": "be081639ea8da63d8542707e9ea9625f6afc97da132f43ed061645c359bb1e65", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10.000000", + "hours": 8 + } + ] + } + }, + { + "status": { + "confirmed": false, + "unconfirmed": true, + "height": 0, + "block_seq": 0 + }, + "time": 1535637620, + "txn": { + "timestamp": 1535637620, + "length": 220, + "type": 0, + "txid": "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947", + "inner_hash": "f8293dbfdddcc56a97664655ceee650715d35a0dda32a9f0ce0e2e99d4899124", + "fee": 34297581, + "sigs": [ + "3981061c7275ae9cc936e902a5367fdd87ef779bbdb31e1e10d325d17a129abb34f6e597ceeaf67bb051774b41c58276004f6a63cb81de61d4693bc7a5536f3200" + ], + "inputs": [ + { + "uxid": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "hours": 5521648, + "calculated_hours": 45730107 + } + ], + "outputs": [ + { + "uxid": "8f9c09c37e0c636178e4229e2e8212c067ef0a8c501be9e2757a97b980d7a98a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "605700.000000", + "hours": 5716263 + }, + { + "uxid": "32a060b2e2025cceb40f3f982c887952d3358d468db1719dd892eab575c14c14", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10000.000000", + "hours": 5716263 + } + ] + } + } +] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/confirmed-and-unconfirmed-transactions.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/confirmed-and-unconfirmed-transactions.golden new file mode 100644 index 00000000..ecc1d6f9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/confirmed-and-unconfirmed-transactions.golden @@ -0,0 +1,140 @@ +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 17, + "block_seq": 164 + }, + "time": 1430790052, + "txn": { + "timestamp": 1430790052, + "length": 220, + "type": 0, + "txid": "743bf1eede313145824db1c4f8d683b74ab5e0bc825082d986308b73fd52f1d7", + "inner_hash": "a0427c37a8ca9f8205630cc8d4c6d95200413d3397a0de9bf015763107b8fc80", + "sigs": [ + "dc400e921f7f94da5f353846f1340e039b4527fff121a56579390fb4fa4154634e3b3aad44ddf0aaebea5abc1dc5ba2a00540fd2888ed5c4ab7b20c51255086a01" + ], + "inputs": [ + "c07593d4329f82da243e4bbd7430e4b10e7b35f9ce0a3718d0e6d25d20b4939b" + ], + "outputs": [ + { + "uxid": "4d52106e41dba0099549fd81fb8feb6915225b0125c53faa0f7c578ea78f213a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "660314.000000", + "hours": 0 + }, + { + "uxid": "bc513a68461d5c401e65a500baf7dfa163735ef63b817bb7b73c4139d5c29d18", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 12, + "block_seq": 169 + }, + "time": 1430836392, + "txn": { + "timestamp": 1430836392, + "length": 220, + "type": 0, + "txid": "acfb61f7ca39d5dfe33e8ed66f73ab181da0a3206d457bf055dcc4b9731a3ec8", + "inner_hash": "85c5d3963f2dce44e99500967e8b8b1943839537fb198186131459a3022d161a", + "sigs": [ + "473114dcb42e2091f3d0396ecd16ee2685e0a6074c7de218cbd7e7c4335d89146455bc6c259c77f40d4af769e241aba1e3a102c5755946b1783c817ffafa67d101" + ], + "inputs": [ + "bc513a68461d5c401e65a500baf7dfa163735ef63b817bb7b73c4139d5c29d18" + ], + "outputs": [ + { + "uxid": "639e69c4a223b5082b9274caf3e56ecff2ab55cd90cac94fdb4c383a1013ba1f", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "990.000000", + "hours": 70 + }, + { + "uxid": "bffea1990d71311b695b2d343b9f09a216b7a8257c1cdcb01b2ab9459e1490e3", + "dst": "jtuSERvfzN3kUYekg8LemCQ5kF5g97N8ZL", + "coins": "10.000000", + "hours": 70 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 11, + "block_seq": 170 + }, + "time": 1430836422, + "txn": { + "timestamp": 1430836422, + "length": 183, + "type": 0, + "txid": "95d847102c01d071982e67b8e7dfae50715b0fc0179d33f4b050974e634905e1", + "inner_hash": "c13b7e1722f3616f61948ed42382d4ed41164e7e2110d2d60bf86725f32531de", + "sigs": [ + "cb7da0e16b83f1717614c7f160580ac0048a4276682ac4046c3324ba6f4e24901d162f7ec81a8e5cdf3676df6ace9a73c77e4d3ab7f03a4f0272c75f3715665001" + ], + "inputs": [ + "bffea1990d71311b695b2d343b9f09a216b7a8257c1cdcb01b2ab9459e1490e3" + ], + "outputs": [ + { + "uxid": "be081639ea8da63d8542707e9ea9625f6afc97da132f43ed061645c359bb1e65", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10.000000", + "hours": 8 + } + ] + } + }, + { + "status": { + "confirmed": false, + "unconfirmed": true, + "height": 0, + "block_seq": 0 + }, + "time": 1535637620, + "txn": { + "timestamp": 1535637620, + "length": 220, + "type": 0, + "txid": "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947", + "inner_hash": "f8293dbfdddcc56a97664655ceee650715d35a0dda32a9f0ce0e2e99d4899124", + "sigs": [ + "3981061c7275ae9cc936e902a5367fdd87ef779bbdb31e1e10d325d17a129abb34f6e597ceeaf67bb051774b41c58276004f6a63cb81de61d4693bc7a5536f3200" + ], + "inputs": [ + "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20" + ], + "outputs": [ + { + "uxid": "8f9c09c37e0c636178e4229e2e8212c067ef0a8c501be9e2757a97b980d7a98a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "605700.000000", + "hours": 5716263 + }, + { + "uxid": "32a060b2e2025cceb40f3f982c887952d3358d468db1719dd892eab575c14c14", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10000.000000", + "hours": 5716263 + } + ] + } + } +] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/empty-addrs-transactions-verbose.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/empty-addrs-transactions-verbose.golden new file mode 100644 index 00000000..4ddf3f5b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/empty-addrs-transactions-verbose.golden @@ -0,0 +1,8565 @@ +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 181, + "block_seq": 0 + }, + "time": 1426562704, + "txn": { + "timestamp": 1426562704, + "length": 0, + "type": 0, + "txid": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "fee": 0, + "sigs": [], + "inputs": [], + "outputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 180, + "block_seq": 1 + }, + "time": 1427926392, + "txn": { + "timestamp": 1427926392, + "length": 3846, + "type": 0, + "txid": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "inner_hash": "0f7019627886818d2501af189bbac18e21b8e959891c5b2726f89e29355aa10a", + "fee": 99999999999900, + "sigs": [ + "be602113fe288f750001ab65f254ceedd8b05b1becc456a0a52a0bea10b8280e38d950933992ad3265e1f81d197036fa634b316f08b3b319ffce081aa43f3bb600" + ], + "inputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000, + "calculated_hours": 100000000000000 + } + ], + "outputs": [ + { + "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "26f585cb96f35307f0af5b9aee004a29b7795695f4c5c836104e2fbbf429a3ce", + "dst": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "18a43b8b69bbf12a9e49e6f9783ba258397e6567301aeed9e901a1e4fed9fef9", + "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5a69ef09b5de21b117cac62141a8de4eade7558c42f0ba8b50996f5ec7867c5d", + "dst": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "aef761a12e3d0fa9c4a8db62b8bab1015c32931b7e3a7fc9a77282cec218f79d", + "dst": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "445a4082da251fa161e4705d115fe2018ca15a5f92e8a0950793405410e6be12", + "dst": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "dst": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "368a609ee90ca15bbbd297af07dc6705131764476d54bef641017ffcd0885e65", + "dst": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "13afe1586015c4d7312f89d123153279e4961eb0d53a4d036847d5d989ba90dc", + "dst": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f625cf04412199c16e073dbb500e66c23cfe69043578b4a2d879a329aac563ec", + "dst": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b2da50a08756c34d059a04812451cf3296f73ba87f8cca38473ac8f051ab6d1e", + "dst": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "135c28698e80e3b2a737d59c16c79684c3fb3ec5cec59f466a39f4ac3c73968e", + "dst": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "df63056cf3ae21efa86d241876ad0194387317585dc9e4fcd80954b47d59b57a", + "dst": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4628f4cfdbf1eb7cccc25d461c46cc29e90cffb5d6277e0de641f7701d60c308", + "dst": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "47e4706dc4d80a70b20c889476fb0627ca6d5bdaa790f4ceba44a689d31b2dcc", + "dst": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b64bc50d370a06df117eb543ca051239c985cfc4b6aa527c51b700de32c7fc41", + "dst": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "390bc4c045fa9f289957b7eca529bfadac96a7dd074bcfbdd3b09e99413b8202", + "dst": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6aa162f7fc09598c4dc8f5fab7fb2383f28c3840937a001acd9f37136e1691b2", + "dst": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e440cf4c896735d3299a871f988c134f404fb2065d1f20c87c9c9bc5fa582e09", + "dst": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "eea791e84a53e4d99485519c5d2c3146b0a2ad080cf92904ae7b28c2d9a6e3ca", + "dst": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "01048ad6a538256d9a8c6c9c6321ca1a01b31cbf08e74fd4ff0f141bf97eb8ce", + "dst": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc5f1f1ddc8cb23df3d42f1e5a1dda9d356846fe930ae4484bc1eeb1b3b2c95b", + "dst": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f03087245a6b64bb69cd5866a1887ae595a9e1a86e196754984840eaf6d3eb9c", + "dst": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "239bdba27dabd52f7450f7d8521c9a7e5ac74093ae3f6f2348bf40ac9a6db7a5", + "dst": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d60879e562b65f97d40bec7309d4490ba0a8c80e2349ecb2e3505aaa50ea1e47", + "dst": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "66e685901492c94942522c346759c711ee2e78a059ef274e77a6ab433409683c", + "dst": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b497992663f99f9902deaaf487b00655820003015ea92091628f4a6e8aeb5854", + "dst": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc40377012004566712fa860e74db97305091cc163e95435e04556c70d32f9c5", + "dst": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "73304622e33994bc2d4ade2cab78d28e1b65185e60ad3c781ecfb5cbc8159136", + "dst": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fed15e8506d0e0898510311850b8863ef6d9a499215ae8823a1e3fb9c8140ab2", + "dst": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "12034bc455d0821813d7eb9afed1ed1a8f19b6f29826ef4a057b4aa0b4228817", + "dst": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fc444cdb2598f44209a41ea20afdc9065ebe51b7cd5f65bb1c0f7a7b427ce7b1", + "dst": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "618d242d95d33e2d7316612a164d89859b85f1287f0d5bed4dcb561cf478f706", + "dst": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "07f70fd4108ef4d2fde3b85411728c1f7bd3a135d2062c5a30a46cc885463780", + "dst": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "af9bcf6ba63a08e699bc101aa362f135343aaf78a56e9f88d118fca0e1ce5c08", + "dst": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6b3530bb930ed10bbc4c307663aba4377c08443498a0a2cf023b1be72f378ae1", + "dst": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fd6da5199e528958e68ee8dd003b727d4d840754ea7c1e0c05e4f0e504c9b2cd", + "dst": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "131f07f5b40f365fb537b863e4aa5ef0efcd77b7fa2ff321d90eeb743ac43678", + "dst": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ffbdfdbf3427d04f445c33e867845bec1ee64a9dfe0d0fa8284547c2226fdfa9", + "dst": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b53c7188ebf4d630790ff63275679ba48009e31af6e4fe15806619216caa750", + "dst": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b4c6639b49402c2753f83c7fb7d3ffa65da74e47fef2b781933ff55b14d09bcd", + "dst": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c956289db079c00d2f80c590d3c8ca26c37da534fe5f65e799b3982ceca493c", + "dst": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "550d2a8d3047cdae0c05a61cc3de43e758b123a6955fa067d3ac375f7d0dbadc", + "dst": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78740d5bf49989936d315bf641949232aace582e03de57db8abff940f7d51bd1", + "dst": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9f2c83c5165826de1077f428ad39d41473e32ed64cd83180d49e7d8e5db996d0", + "dst": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "883be4d7173c235933294ab8dcae8cc76609166eaa1c1f07e9b51d551c979709", + "dst": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6384ed19650d384c29db4c3a39a1ca855058fab758075be2dee759dd9e6faae1", + "dst": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", + "dst": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c238e82f3a4beee1be7b5b464e8553404f6927d5ab93c3d649d362c01097782", + "dst": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dad4991bfa5c51eb176f28c1b3f86661e02579905e6e07c997df22004e06244a", + "dst": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4ba91512c168281f41d3934b927d0d86a3136a31cc345b635095928f8e5f013c", + "dst": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c416f5e604eeada9ae8e520a429d8f19d4230626769e7121007e01353730784f", + "dst": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7b8787fd4076c27d074d2a4761377a1aa26c843c432e3b7e6b0ebf1e29528188", + "dst": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "38f22b194f04d85a6b545b37df06195edeb8503798b229ddeaa946018150c05c", + "dst": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "246377a036ad5444bcd5f47ac9e55fec7c85fc40644df593038d360554a809f7", + "dst": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c6d5e543ff5f2c2526728d588fb21753db5b7e05b8b275aa5e9b24d29350afb0", + "dst": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "98e223e6e2240fef83082d3daa86e46f10e0c71f3f74489ba95db0951a166f53", + "dst": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c8971ca91f8e21c556f647940073db003f7dd5582ae55d4ebca602d5e8e91a6e", + "dst": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dfa7822c05f54116c9fc3b2cde1ecb4667f47a2d8771fe886e832c223cdc4e82", + "dst": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6d37c0c4b6fcbac1e53a46c9c2dc5d3c3b36312c53f25b2baacc785ea77a11f7", + "dst": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9ba5e31610f0545666f102465efa8caa48ad3fb5b8abd5ae802f4a71e3f7de3b", + "dst": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "3ca365aace71e24b04d6f2ffbf7171468c5e71783858c710cae539c5e43e0c0e", + "dst": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c858f2db2a20ac562d32f8fb2a3a11039849a6e44d2bec30befb2e173532a9a3", + "dst": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1550a76598693b950346397e0e825bbb2805edde38b0d0240e50050829b7b1dd", + "dst": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "466340ab7733abb23ab24d877c673fe089c273f11808fbbd6f33a91da92ee96c", + "dst": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "401d4c0c1060ebbb4b9fb3859c2eb47789f94086f4deb01234bf46f7cdc81247", + "dst": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2c0e3aa084f5fec45f99b3f125ce7d50c6da526ef5165df5f22ba603147c3fc2", + "dst": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2e724d83e35235c23c0bb16ae9b708a5bba3c23b186b05d4b8c606f6bb4b311", + "dst": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4f30eae8c49eb268fe364eaf5ee0788da6e2f6adc2f83cd82e96a4bfe98496f5", + "dst": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8753d5775c22477a8ef74eeebf61d7de30be702e70118f552cc18ad963ffe950", + "dst": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efa2007c561dcbf7c83a6bbdd2ef75e7cca76b05330a8b948ba0dd94dee949f7", + "dst": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b379d1b8ff0153c63ee69c40a7155b97fa42ab570f68ff847d457316c4d8ab9", + "dst": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cc84f93adce16699d9e84ef32f55333402431b58dc50c17084bcb8b33f382f88", + "dst": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f38f0760769c19075034f70b059abf4d1bfa6d01e1e8c369a99900ed1eaeca6d", + "dst": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8d55f76bb0b3dd222cf85a7193501c0f4071b446f56dbd1da355b1625993325a", + "dst": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efde499c7e4444bc602b7bf5ed50e95a18ce8ec9a06ba9d850a05bb7a25ecb3a", + "dst": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2a4d631d5dc90e397d85f13410d1a6d877dcaf592a0e2be2e727443ac74b5bd5", + "dst": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e936299a21240744f6edbab493449323f920bbe15dcf294463e5a2ace10f27b0", + "dst": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "44e17f4bd29411a1614457171c06183e364bf6ff80a201717b2dfc0748e9ebe3", + "dst": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1941e5cc5e38dd92427580af699b1f410be7b29ff17d3d0ff3d046bfba0aaabf", + "dst": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ff6c0f27fcf92f3b4a3871b801c3116847fe47a7e3bafcadd4855d06012091ad", + "dst": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cd6c4b785e60757fad0e6fd4874b729ea7703fe7ee9560e1283d2eb71fc75321", + "dst": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "745eaff456a390c3868742a039e72c2a93ff8eee10417dbe848d533b89facc04", + "dst": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2f3f050c9ef31bf5c3b14c1c71699c4f4b38aa18479531194d12e6277416516", + "dst": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0b95850edabed70762768ac1695c5d7f230cccaa8de06657cda42cafba36374f", + "dst": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7c767d3a06db1ac0e1809ebe29a7d9689143259f4651837de54423e287c20490", + "dst": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78b07e8fe1366e173f2eeb75c35cd53baf0f6100de50ae12b4ffe7d0d7ba4298", + "dst": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5010eb25f6e1ed725fb901ae1e945e545ae846d7be8a135333d2d41102c33328", + "dst": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "178a33e64826cd2039b8538b74e6de513966acab45ab79d77dc9392018a65ffb", + "dst": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "044dc539d063250dc654b2bf0986a9044b4eea05e1284c11a2b313acd8dc3498", + "dst": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9fd5ea38f383291566def44b6fb932414f97123952578fe0cfb9a30eb075a099", + "dst": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "be5930e9cc35801433bcd21db84da7d4f1d8e744feca16a2c6fb00c81ce93e51", + "dst": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8cd999cd193d315e5f1c6f74c230c12e6abe6847924f6e89d988e09ca413f52e", + "dst": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0cff53628eb0e984c134b68cbe4b1bb7721a05adaa32e93b9df489a9a7a176cf", + "dst": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "a5ef046e84be9ff2485dde49afe6073811286761afac3bbd588b6e4130930479", + "dst": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cdee5f84c4f08098ac740e3a260ced14c1e199e126aa5291ec079b281a7dc407", + "dst": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6a24135f8496e7a37dcf7164218bb3aa530319f3b2bf3c7a1a9cc1bd17831328", + "dst": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "693c7f970b34ce5882e62430f4c9c28957159a257d27d4e21a61fd95c6b97464", + "dst": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c008a613cef129c180dbcc7213f2d41a14d245d06a3844d63d9beac963145385", + "dst": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "439cdfd03972fb4bb5da54208cf8098ee78228c487ce9e84623f5f83e17a7d68", + "dst": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "hours": 1 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 179, + "block_seq": 2 + }, + "time": 1427927651, + "txn": { + "timestamp": 1427927651, + "length": 220, + "type": 0, + "txid": "312a269b8248e389c61571cc13f4ad13b7d53b64853d990ddc301a58e7071889", + "inner_hash": "4daff2831f5bc2877a98a49b0ef75f8ff01bcb35082fd4018c77707dfca31849", + "fee": 0, + "sigs": [ + "f4482e0781e0d94c8c4773940e1f811405681844a9dc3c1938243442e1cbd5463d5e251880abbf8ff1ed85b4b2659e83ee30f06cc4c5dc9913aa6a9630fbe3de01" + ], + "inputs": [ + { + "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1 + } + ], + "outputs": [ + { + "uxid": "0cd548e03bd13bca8647cd13f6baef0c65fd03081aeb6dc3695536e5bc6018ae", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999990.000000", + "hours": 1 + }, + { + "uxid": "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 178, + "block_seq": 3 + }, + "time": 1427927671, + "txn": { + "timestamp": 1427927671, + "length": 183, + "type": 0, + "txid": "a6a709e9388a4d67a47d262b11da5f804eddd9d67acc4a3e450f7a567bdc1619", + "inner_hash": "ea6adee3180c7f9d73d1e693822d5d1c2bba85067f89a873355bc771a078faa1", + "fee": 0, + "sigs": [ + "ce8fd47e2044ed17998f92621e90329f673a746c802d67f639ca083705dd199f6ee346781497b44132434922879244d819694b5903093f784570c55d293ab4af01" + ], + "inputs": [ + { + "uxid": "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 177, + "block_seq": 4 + }, + "time": 1428793611, + "txn": { + "timestamp": 1428793611, + "length": 220, + "type": 0, + "txid": "c24b92898381fbebe59a457924184f4cce1e7166e140ca75aea5baf854c1ab75", + "inner_hash": "43dd65d5644ec5214a901ac94e530cbedb83d2174cf402c7b24697cfe55e1de7", + "fee": 1852, + "sigs": [ + "434a7a0b624fda393c1caa57ac9787f69da3d8854d0ec6f69f0da1c96c9b683d787064b644e9ac3dd4dd8466c22c1547cff89c2552420f5efcfd1eacb1a2eac301" + ], + "inputs": [ + { + "uxid": "0cd548e03bd13bca8647cd13f6baef0c65fd03081aeb6dc3695536e5bc6018ae", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999990.000000", + "hours": 1, + "calculated_hours": 5556 + } + ], + "outputs": [ + { + "uxid": "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999980.000000", + "hours": 3704 + }, + { + "uxid": "98b3e6e6d4ed36159b7dbf5f305174fc0c255d2d97528b35a67d50b9968e2b2f", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 176, + "block_seq": 5 + }, + "time": 1428798821, + "txn": { + "timestamp": 1428798821, + "length": 317, + "type": 0, + "txid": "0579e7727627cd9815a8a8b5e1df86124f45a4132cc0dbd00d2f110e4f409b69", + "inner_hash": "fe123ca954a82bb1ce2cc9ef9c56d6b649a4cbaf5b17394b0ffda651ed32327e", + "fee": 2036, + "sigs": [ + "056ed0f74367fb1370d7e98689953983d9cf34eb6669854f1645c8a16c93d85075661e7d4f6df0ce5ca8eb9852eff6a12fbac2caafee03bb8c616f847c61416800", + "8aaa7f320a7b01169d3217a600100cb27c55e4ce56cd3455814f56d8e4e65be746e0e20e776087af6f19361f0b898edc2123a5f9bd35d24ef8b8669ca85b142601" + ], + "inputs": [ + { + "uxid": "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 2405 + }, + { + "uxid": "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999980.000000", + "hours": 3704, + "calculated_hours": 3704 + } + ], + "outputs": [ + { + "uxid": "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999890.000000", + "hours": 4073 + }, + { + "uxid": "dc63c680f408c4e646037966189383a5d50eda34e666c2a0c75c0c6bf13b71a1", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "100.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 175, + "block_seq": 6 + }, + "time": 1428806251, + "txn": { + "timestamp": 1428806251, + "length": 220, + "type": 0, + "txid": "03b3ab821cdaf0ab8cc1a9e2dd30108772ec3bda09e9d3a8c48df9f30d213b38", + "inner_hash": "e49bf8f45cb6664d36ec632e37bd91566d8bd4ea9ce209a0a955323a94dd744f", + "fee": 0, + "sigs": [ + "0a0d9a3fa0597667fb991bbe047ff93c591313faf759fcec2f47138bc0666b333b7689ad527ddb8ef135897be41016f755eb14e46cd327fc5eb196bce80c3cd400" + ], + "inputs": [ + { + "uxid": "dc63c680f408c4e646037966189383a5d50eda34e666c2a0c75c0c6bf13b71a1", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "100.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "8ff8a647e4542fab01e078ac467b2c9f2e5f7de55d77ec2711f8abc718e2c91b", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "95.000000", + "hours": 0 + }, + { + "uxid": "778048daec0c83f89525a6d69b60c407d090bb1666711b1c560e6ebee8dcc452", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "5.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 174, + "block_seq": 7 + }, + "time": 1428807671, + "txn": { + "timestamp": 1428807671, + "length": 220, + "type": 0, + "txid": "f832428481690fa918d6d29946e191f2c8c89b2388a906e0c53dceee6070a24b", + "inner_hash": "f440c514779522a6387edda9b9d9835f00680fb314546efb7bc9762a17884156", + "fee": 0, + "sigs": [ + "8fe96f5502270e4efa962b2aef2b81795fe26a8f0c9a494e2ae9c7e624af455c49396270ae7a25b41d439fd56dea9d556a135129122de1b1274b1e2a5d75f2ea01" + ], + "inputs": [ + { + "uxid": "8ff8a647e4542fab01e078ac467b2c9f2e5f7de55d77ec2711f8abc718e2c91b", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "95.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "17090c40091d009d6a684043d3be2e9cb1dc60a664a9c2e388af1f3a7345724b", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "90.000000", + "hours": 0 + }, + { + "uxid": "f9e7a412cdff80e95ddbe1d76fcc73f967cb99d383b0659e1355c8e623f02b62", + "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "5.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 173, + "block_seq": 8 + }, + "time": 1428807691, + "txn": { + "timestamp": 1428807691, + "length": 220, + "type": 0, + "txid": "7229422f3a0afb5f3a9596ed50146440c17a3d54abda0f3c70cd9dc58de96374", + "inner_hash": "68fb8cd96b0d2a94838183ab24f36f71006383add373837d448a7584ef69bc6c", + "fee": 0, + "sigs": [ + "b859da7c65d6525247973fc62d274343feb3fe6fd76ab392dc30d7cdc609a7e45018b425fbdc3e79647e43b99d25bfab6c23d60495e5e0ce3cf06b6ce2c4897d00" + ], + "inputs": [ + { + "uxid": "17090c40091d009d6a684043d3be2e9cb1dc60a664a9c2e388af1f3a7345724b", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "90.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "999cc56deae71486a28e19d1ed8d585c2cf07d5ee27d1c33bea186d23aaca06a", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "85.000000", + "hours": 0 + }, + { + "uxid": "1f810bdd1c65ad50f27f2c47a000150877fdba2fdb78b9d8cae39946be6a9e33", + "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "5.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 172, + "block_seq": 9 + }, + "time": 1428807711, + "txn": { + "timestamp": 1428807711, + "length": 220, + "type": 0, + "txid": "9d87d7bb9e56a3588bacb478c7556280b28c0a49f6e09db8b54a84c20d865f2f", + "inner_hash": "f60dd876ff32adc5e20759f45c04075f46796b0ca2b76a490d5d1e2d5b18424a", + "fee": 0, + "sigs": [ + "be2ea2bcb4be07705cd034579d77c2fe0f9c7bb29dad0e690f38f8a2e098041c396820004975298d9d3647dfec7cbb610452e294381b898f28d48f166aaea5a500" + ], + "inputs": [ + { + "uxid": "999cc56deae71486a28e19d1ed8d585c2cf07d5ee27d1c33bea186d23aaca06a", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "85.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "2f87d77c2a7d00b547db1af50e0ba04bafc5b05711e4939e9ec2640a21127dc0", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "80.000000", + "hours": 0 + }, + { + "uxid": "9e8997e53d2e61955da71dbbc6ba5b0da799eaace0f45870a4e42276a6fdaefa", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "5.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 171, + "block_seq": 10 + }, + "time": 1428807771, + "txn": { + "timestamp": 1428807771, + "length": 220, + "type": 0, + "txid": "98db7eb30e13853d3dd93d5d8b4061596d5d288b6f8b92c4d43c46c6599f67fb", + "inner_hash": "affafab93dc807a9306d1f3c6a19066aca57f284825420fb01e48200349f7ba2", + "fee": 0, + "sigs": [ + "71008403c675d9b3fdf8c09cc6caa64c681b78ba588fe20abb568e318d2e40b55c44ea614efc475c408e1e6e15cc0df753e6d3f04cb521078e6c928d5aa64c3200" + ], + "inputs": [ + { + "uxid": "2f87d77c2a7d00b547db1af50e0ba04bafc5b05711e4939e9ec2640a21127dc0", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "80.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "0c5d1b6a61c32f9bcc62d3583ac957b3374f0daf1a14fd08679bff2554449840", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "75.000000", + "hours": 0 + }, + { + "uxid": "ec2c2238793d71240502de3e7c46ec1d5bf938c76541185f1c3fdf0d99a90795", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "5.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 170, + "block_seq": 11 + }, + "time": 1428808851, + "txn": { + "timestamp": 1428808851, + "length": 220, + "type": 0, + "txid": "4a87de6869c974099e3f5522404fbc7b23f90a8f8dec958bf725317454036cdc", + "inner_hash": "53ecc82b426d4b806eb1c743e892edbc7eb7051c88f3fa8afc74a6a5b80cc57a", + "fee": 0, + "sigs": [ + "dbbb5acf0130c39a6b2fd760dda1df5aaefd94d8a0904e6faf959feade87d17a5c754459b635e0048e1019dadb9815a54d8bca4cf234f6876b19b5a0df5e494a00" + ], + "inputs": [ + { + "uxid": "ec2c2238793d71240502de3e7c46ec1d5bf938c76541185f1c3fdf0d99a90795", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "5.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "9c7d3674d7a6b28a559a052e6d354ec13d2e0396739973c9f0dce08f8c7d157c", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "4.000000", + "hours": 0 + }, + { + "uxid": "3f8c01eefca28ec6d89d34b899fecb5c97f9348b412c61e7c863310b8a85b953", + "dst": "2M2VC93aQv5asdcNKt7pzJdkxeL6xLw9JPp", + "coins": "1.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 169, + "block_seq": 12 + }, + "time": 1428814821, + "txn": { + "timestamp": 1428814821, + "length": 183, + "type": 0, + "txid": "9ea7b912cbfca157ef5fe9c59dd2407302d1b4d95414829d93c45bde6c2d42c8", + "inner_hash": "8a294b39558a38da2c996a7ce12eb6e045b44ce3b3a153bcfdc664a246b1a46d", + "fee": 0, + "sigs": [ + "81d65e0a176c322059776922be59a385f3d5f430502e51b94dba78662a42161805bea61e646fdd9cad314fcfea00d6f790f758c4e3c8b22ec3bfcf73c79033c100" + ], + "inputs": [ + { + "uxid": "3f8c01eefca28ec6d89d34b899fecb5c97f9348b412c61e7c863310b8a85b953", + "owner": "2M2VC93aQv5asdcNKt7pzJdkxeL6xLw9JPp", + "coins": "1.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "34de4a6d093e880f813b4dc466b51f6814923e157ffbba0e9abbc4bfbd938de8", + "dst": "2AsyTLyWNR3FGhaMbLckaJyAZN46mrqFfXA", + "coins": "1.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 168, + "block_seq": 13 + }, + "time": 1428814891, + "txn": { + "timestamp": 1428814891, + "length": 220, + "type": 0, + "txid": "fa33df7c4316cea05095e6c7ce86f361847893d26fe2255af118593a33686c52", + "inner_hash": "2e88fb3c0f9eaa317794e966e4275cfe62949eed43fa2987729b877178fb9951", + "fee": 2, + "sigs": [ + "25df6c1b4ae2c0cfac2f3ac608b108e5a83ef07c19a125dd098729734bdd6a1f65ca8a3f34878b07f6cd3e7d3e21ab432b1dec68f273dbb52a0ff90b253b6f9201" + ], + "inputs": [ + { + "uxid": "9c7d3674d7a6b28a559a052e6d354ec13d2e0396739973c9f0dce08f8c7d157c", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "4.000000", + "hours": 0, + "calculated_hours": 6 + } + ], + "outputs": [ + { + "uxid": "04c0cd4cbee1e5414791d9e0b9ae4f889bc52d253b5f70b09fbc32c88fb415ae", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "3.000000", + "hours": 4 + }, + { + "uxid": "f3034ffe54e869315f8e11801d3e755352fb75b878b24313302273c1b7ea62cb", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 167, + "block_seq": 14 + }, + "time": 1428815131, + "txn": { + "timestamp": 1428815131, + "length": 183, + "type": 0, + "txid": "b68d78c9a4610b540933eaa550fbb1c473f5cf749eb522882f8154d495453e7d", + "inner_hash": "aeb75b736b0467e49884795158dfc6ea5c6cfe2b4f696d9d5b29c1fcac503834", + "fee": 0, + "sigs": [ + "dc926994a9bdd69aca5887edab30fbcbe9fc008328424ca0a38a258bd8c78b543af0e8aaa4195ef9e7c4fb7009f1dbdbb322894be8a319f4dff3809a3592a81400" + ], + "inputs": [ + { + "uxid": "34de4a6d093e880f813b4dc466b51f6814923e157ffbba0e9abbc4bfbd938de8", + "owner": "2AsyTLyWNR3FGhaMbLckaJyAZN46mrqFfXA", + "coins": "1.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "3538af0016ec0f4d0e943c5d49daf280b416701fde4040fa72710c0ca1b5b559", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 166, + "block_seq": 15 + }, + "time": 1428820169, + "txn": { + "timestamp": 1428820169, + "length": 220, + "type": 0, + "txid": "70dd5840d7260cf584457c76d3226312f4d033c023caf8c0ab3a65f9b831e9e0", + "inner_hash": "4357c427cbc4b55139089389858dd8245464f674d4fff82e5daba9e18384a0b3", + "fee": 51, + "sigs": [ + "964c4b0c6cde6625863adebd74910851a440a636823dab9d0cf0fbc4581e3dcb486be22ba19d0c6d6eb17db22d1b1389589ec4b6cff8e8a9b231c66fe40c565500" + ], + "inputs": [ + { + "uxid": "0c5d1b6a61c32f9bcc62d3583ac957b3374f0daf1a14fd08679bff2554449840", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "75.000000", + "hours": 0, + "calculated_hours": 153 + } + ], + "outputs": [ + { + "uxid": "acd35cec566de86b4ed464b6cf3c3ec561140c070134d1e03094775454da2159", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "70.000000", + "hours": 102 + }, + { + "uxid": "4a06f4b59bc5626e6a92704b4e4441096e909b884eab84505699a3136abb69b3", + "dst": "PRXLNyB64cqaiG4pCoFZZ8Tuv7LWYPpa7m", + "coins": "5.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 165, + "block_seq": 16 + }, + "time": 1428820629, + "txn": { + "timestamp": 1428820629, + "length": 220, + "type": 0, + "txid": "e96e157b685c28847d6758e2ba326ad59cf2661c926fb08000d4b40d78a9eee3", + "inner_hash": "3153d35c8b133bc76ea6bef8799c9fbfd36a3cd3e8e42e170ab131eb309acea8", + "fee": 0, + "sigs": [ + "11813ce8ce2db73c23a8167696621443e0d80ec878d964d5164da33f259f55d17e5f1fc2292709542015c7bd86874ed855c0c80406a53a35759722d014a8c31300" + ], + "inputs": [ + { + "uxid": "4a06f4b59bc5626e6a92704b4e4441096e909b884eab84505699a3136abb69b3", + "owner": "PRXLNyB64cqaiG4pCoFZZ8Tuv7LWYPpa7m", + "coins": "5.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "e72d8ba4ce2d3b37aeb71df2e3bed80ee07204b3fa633f56cbce7bca836bd39c", + "dst": "PRXLNyB64cqaiG4pCoFZZ8Tuv7LWYPpa7m", + "coins": "3.000000", + "hours": 0 + }, + { + "uxid": "0b720d05d44354ff0c6c75d55f1cd4e5945bc2ca80f2ba840545205362202925", + "dst": "ZWhZtjwXMS46cpDxfRwQyxxKPhqwsQu8oN", + "coins": "2.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 164, + "block_seq": 17 + }, + "time": 1428989855, + "txn": { + "timestamp": 1428989855, + "length": 220, + "type": 0, + "txid": "d952ef4cc45a89c14230ba0f7e30b782fad83cb6506ac0f503a242c568c1287a", + "inner_hash": "8fc48920982066fd4c69e2d2c0c5239cca7c296f0e3ad30e9b976c1230967478", + "fee": 2020394, + "sigs": [ + "b7eb93bcebb6df3dcad48afd66dd60bd42b1fbcdf52aa5e0c7e455e791f64a976fa416534b4e08bf3e62a2df83e13754119634c4255dd1e2e08be447d4d5b47201" + ], + "inputs": [ + { + "uxid": "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999890.000000", + "hours": 4073, + "calculated_hours": 6061184 + } + ], + "outputs": [ + { + "uxid": "4168b9378363cd81939e667cf78055d35a60d3101f5f9e3d2ae709e3981e29fc", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 4040790 + }, + { + "uxid": "c603e99ceae4d15c20360714ee07ba6e3a944a97ea9285d164c23252e93958b6", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 163, + "block_seq": 18 + }, + "time": 1428989925, + "txn": { + "timestamp": 1428989925, + "length": 183, + "type": 0, + "txid": "686db0a8cd429970bb91163033703410d4750c86ba485709fe1a3faabbbb42f6", + "inner_hash": "76732ac6a9936242193011d78a0f2849529aee767a569c9c6bb25b3bbae15cee", + "fee": 0, + "sigs": [ + "d74dcfdc8401a29b1dccc728b40b6b79faea147c65b4a859063ad77cc63aa9a62417c63b91b94678b6656fdba2f242d836b6914e77d244fbd16aaab014ddb44300" + ], + "inputs": [ + { + "uxid": "c603e99ceae4d15c20360714ee07ba6e3a944a97ea9285d164c23252e93958b6", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "d9dae1f82177f979b07016a341ed5c281ed6ed8eaa785a8a107ec16efbe541ef", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 162, + "block_seq": 19 + }, + "time": 1428990115, + "txn": { + "timestamp": 1428990115, + "length": 220, + "type": 0, + "txid": "c6eccf17b4b952f19548b1924126c9dc409b45f9e6fcc0954a3494e7399f5fd4", + "inner_hash": "736a1b4f415c1b0968470fac4d123ec52943b9d2ea7d2ce376307b2477a29acd", + "fee": 1134, + "sigs": [ + "3660a24958b1b20beabb7f77d2ee1ddd91f1e40e8393b48d5ed4722d97bd1430150c5ea0f8ea1a2688a0d9f336c9c1f78a214150cc1ca3d895a694edde65ac0700" + ], + "inputs": [ + { + "uxid": "acd35cec566de86b4ed464b6cf3c3ec561140c070134d1e03094775454da2159", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "70.000000", + "hours": 102, + "calculated_hours": 3402 + } + ], + "outputs": [ + { + "uxid": "af7deecc9b45c4696ad50246c8aa06b17aa8280b2574f295697a4210fc45f57d", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "65.000000", + "hours": 2268 + }, + { + "uxid": "b56517b7803a4b2cca522e1cca5f75894db174c97d0e127826f5414544eccb72", + "dst": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "5.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 161, + "block_seq": 20 + }, + "time": 1428990135, + "txn": { + "timestamp": 1428990135, + "length": 220, + "type": 0, + "txid": "22766105d0f93d01fed7bed2dcabedfd89fe846621c912b0af845d8ba5d265f8", + "inner_hash": "3d516c76b1f147942f2237a2c07f9626624385fb858199ba63ec2d39112b6dfd", + "fee": 756, + "sigs": [ + "94e1b26e60d075536abd602ae88015f73ce638e49ec4e6be358cea8950853d0b4174aeeb0391ea05a9c62a6d37164c1fbab1d1ab53c9e2efd80ca4738ec3480e00" + ], + "inputs": [ + { + "uxid": "af7deecc9b45c4696ad50246c8aa06b17aa8280b2574f295697a4210fc45f57d", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "65.000000", + "hours": 2268, + "calculated_hours": 2268 + } + ], + "outputs": [ + { + "uxid": "ec9bbaf9309772ade9860f145705b9e9ee4a70ed1eeed1983d058ccaafd6c02c", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "60.000000", + "hours": 1512 + }, + { + "uxid": "e55a8d2ebe0f48f17a175fdd67d47deb5015b2ee8e91de16b2b121c8ad830e40", + "dst": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "5.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 160, + "block_seq": 21 + }, + "time": 1428991365, + "txn": { + "timestamp": 1428991365, + "length": 220, + "type": 0, + "txid": "67f180076fed1599152c62337a12deee7e1a468b19f7e720df51415c28bfb986", + "inner_hash": "1d676e397e50442c001f98385b525f8df39ef7189ebb0744cb3f868d8c96f00c", + "fee": 504, + "sigs": [ + "797c7987aab5c7a6a63eb06d514063a31b27beed8bfe22f15fbdf7b08c65702903d778d48e8cd027a9569c9973d0e52234977df7e0b9391967c913985ef860a700" + ], + "inputs": [ + { + "uxid": "ec9bbaf9309772ade9860f145705b9e9ee4a70ed1eeed1983d058ccaafd6c02c", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "60.000000", + "hours": 1512, + "calculated_hours": 1512 + } + ], + "outputs": [ + { + "uxid": "e3e95cd390c42d2f08e2c173135620e09c7a2ec1cf80ff75fbc3940fa5712b3c", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "55.000000", + "hours": 1008 + }, + { + "uxid": "1f4f952c6304e3991cf33519f1084921d50ecfd845edc48bd3b7b7229e28f2a6", + "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "5.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 159, + "block_seq": 22 + }, + "time": 1428991585, + "txn": { + "timestamp": 1428991585, + "length": 220, + "type": 0, + "txid": "c820bf59805b4889e59ce5fa320dcccfce5180de5f0f8baef7b391049ea8e286", + "inner_hash": "6fab8afaec00c1604f67fa7ecdfc968fa870662a46b714a88865e6b83ca555c3", + "fee": 0, + "sigs": [ + "0fafbcb51bcdf3e797059c26ec09574b9b02672453e31fdc5b8b5debc507dfe917208b33632e7905c9b02252a675b7bd22578686e2882277ac077af86fcaa49a00" + ], + "inputs": [ + { + "uxid": "1f4f952c6304e3991cf33519f1084921d50ecfd845edc48bd3b7b7229e28f2a6", + "owner": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "5.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "4c84a4bf9a1b1a3a53d8bf78e8823ca3135321089968068ac60da32083027846", + "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "4.000000", + "hours": 0 + }, + { + "uxid": "182b4c32bb5fe0e6809a19db63eecbeefde97a6c043b9248da94d428ab5a94c2", + "dst": "2bvEzLx4mgyQkYL5bkSc2rD9V1nqWBqn8vp", + "coins": "1.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 158, + "block_seq": 23 + }, + "time": 1428991605, + "txn": { + "timestamp": 1428991605, + "length": 220, + "type": 0, + "txid": "eb0a48072c5da37962c07d205a1843311f98e886cfcbdb2813359677f36bebc2", + "inner_hash": "104c51c380f54913954c2e16a8cf35dd585666a6e7b67116c05f490e06e5e1e1", + "fee": 0, + "sigs": [ + "6615ef5540b366a45895feeb91f16a5226d5022737e59ab1b9825843ff54dd7e281f2f014fc95641e3bc6ddda433b86e0c79d87a5b9b8b23fa5e234e5a41da1601" + ], + "inputs": [ + { + "uxid": "4c84a4bf9a1b1a3a53d8bf78e8823ca3135321089968068ac60da32083027846", + "owner": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "4.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "f3ce12886e74d6407f9580b47e72156a917083b66ebaa46263c7fde2df35116e", + "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "3.000000", + "hours": 0 + }, + { + "uxid": "20900f1d317e0b10ebab7190a34265f52783ff4f85675398b497ab8eb3723a3c", + "dst": "2bvEzLx4mgyQkYL5bkSc2rD9V1nqWBqn8vp", + "coins": "1.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 157, + "block_seq": 24 + }, + "time": 1428991635, + "txn": { + "timestamp": 1428991635, + "length": 280, + "type": 0, + "txid": "f935cd91736604989c08448a2d83d6b044c3198ac1a7483a3b9846f8848a7d84", + "inner_hash": "02b721422fcadeb8c3217d9b972c81fe9042a32871a180fb1237e213a543cc9d", + "fee": 0, + "sigs": [ + "fa3ccaecf3a01525fd617fe74971ff2f7270e88f92f17a0f7748c1b258e007fd0fd10a582cc406d7806fd7794e20c4a3178b71cc1cb9f59c3c7d36a4e34d962100", + "23530a4d36d65cb37fc366a8c4a61d47dfd4fbf3b268bd66fd960bcff1b91db419d039049b8f816bedbd73d6baeaea77c5907c0df5b47724ad07420dd225cdaf01" + ], + "inputs": [ + { + "uxid": "182b4c32bb5fe0e6809a19db63eecbeefde97a6c043b9248da94d428ab5a94c2", + "owner": "2bvEzLx4mgyQkYL5bkSc2rD9V1nqWBqn8vp", + "coins": "1.000000", + "hours": 0, + "calculated_hours": 0 + }, + { + "uxid": "20900f1d317e0b10ebab7190a34265f52783ff4f85675398b497ab8eb3723a3c", + "owner": "2bvEzLx4mgyQkYL5bkSc2rD9V1nqWBqn8vp", + "coins": "1.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "fbe00b341f3e798c3e7e5eea04ffd8f3e70f0e78bc38f9a4927bae7eed6a1411", + "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "2.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 156, + "block_seq": 25 + }, + "time": 1428991665, + "txn": { + "timestamp": 1428991665, + "length": 220, + "type": 0, + "txid": "917510897f5d8a018ad8d447876a15e2e1f68d42e71b6f75d89b02c4a599c537", + "inner_hash": "be34076fd999f7030f2a51866d641f8a783deb2204a9a93a8b64377a95546916", + "fee": 0, + "sigs": [ + "880b044ee5559510010d6d5cb4d7b50cb3e5323e5037daf3a048f3fab70254d34ff258aea85ec8ce264679bfb35df4590cd4dcaa527d89f9fb65fa50234dfc2e01" + ], + "inputs": [ + { + "uxid": "f3ce12886e74d6407f9580b47e72156a917083b66ebaa46263c7fde2df35116e", + "owner": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "3.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "f910d0e633735df5f041fdb7ffcb9cc8988b71c9375c52ababb54238be4d6852", + "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "1.000000", + "hours": 0 + }, + { + "uxid": "ebedac42a639f0d0a196b47676cb757b95046f0403f74baa5b15e98753ee2d58", + "dst": "2bvEzLx4mgyQkYL5bkSc2rD9V1nqWBqn8vp", + "coins": "2.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 155, + "block_seq": 26 + }, + "time": 1429011077, + "txn": { + "timestamp": 1429011077, + "length": 317, + "type": 0, + "txid": "56e7bd13dc4c6e1cd80aba66a0a9fed650d0646659ac774e3f1b415848755d85", + "inner_hash": "2894cfa31c21eb04c33f89263aa1e4caae625ceaf30539b82b39ccf79dffa816", + "fee": 3407635, + "sigs": [ + "6aedcd617e69aab9724b6a52e0e71f4f087a2fa84a283ac685c17e274b49cf617e58dbbd6c45a8e2c1c31832a1193ba119f0cb238fd83b9d7eb029dcedbeba0800", + "f1f26b84f247c409d308bf0992c2a044ce649fc09169d5fe4843f22b855f911d6c73b92f679346d30ec6663aa5d0387189935ce8e2f2256dd13e59cbdae7b89e00" + ], + "inputs": [ + { + "uxid": "4168b9378363cd81939e667cf78055d35a60d3101f5f9e3d2ae709e3981e29fc", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 4040790, + "calculated_hours": 4543507 + }, + { + "uxid": "d9dae1f82177f979b07016a341ed5c281ed6ed8eaa785a8a107ec16efbe541ef", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 4 + } + ], + "outputs": [ + { + "uxid": "8793a3782bf673393a8f909f267f3bfcc713b600460893b571fd55f675ac65ba", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 567938 + }, + { + "uxid": "339aeec109a26bab65e618d73ebba16e5b8fc18f7dc1fe502ca891ad5b0f4d5f", + "dst": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", + "coins": "10.000000", + "hours": 567938 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 154, + "block_seq": 27 + }, + "time": 1429011137, + "txn": { + "timestamp": 1429011137, + "length": 220, + "type": 0, + "txid": "cff53a059d55f2c90f6dd7ce7de2cc07cbdbd50b25867cba0f41cd0192614d0d", + "inner_hash": "09382455a4e78c62bd0c254e106d349f648944c3747b066a23cc64d9392c6c05", + "fee": 425954, + "sigs": [ + "ade8874855f58653ef198e005a7ec82de992cddb50a4bb5ce8a0ec1cfa7b44086883ad1c85c63128dad5426b8b22873c349e0535191b80b3e92035b120cada7a01" + ], + "inputs": [ + { + "uxid": "8793a3782bf673393a8f909f267f3bfcc713b600460893b571fd55f675ac65ba", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 567938, + "calculated_hours": 567938 + } + ], + "outputs": [ + { + "uxid": "ad742bbc7420c08881e6ccf35e34e8472c0dd6386792359aedcfb752ca618c33", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999790.000000", + "hours": 70992 + }, + { + "uxid": "3e475e76c226a70c87d030d8fc6b8b1c2cc654ba9eaf3bed08be5bd603aec0b7", + "dst": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", + "coins": "90.000000", + "hours": 70992 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 153, + "block_seq": 28 + }, + "time": 1429020387, + "txn": { + "timestamp": 1429020387, + "length": 220, + "type": 0, + "txid": "f2f9926afcd29405327ddb772988a73dc13a67b1fcaa42ad98a416060e96adce", + "inner_hash": "1e46ec99a425796960a928a95b64be87b568d160c9533a5399d25141b60f74af", + "fee": 214, + "sigs": [ + "1b59327011b10a2896962898bafd8d587710fb6d99b1b565777e0713a8e5fa072f7f60043c9823d2bcfc589b283e99da90d0649c472199a683428b14bd75374301" + ], + "inputs": [ + { + "uxid": "778048daec0c83f89525a6d69b60c407d090bb1666711b1c560e6ebee8dcc452", + "owner": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "5.000000", + "hours": 0, + "calculated_hours": 284 + } + ], + "outputs": [ + { + "uxid": "92ae7cf57ad1363a60ce019818f7304040959329b6513f9a2d0f6b464bacafea", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "3.000000", + "hours": 35 + }, + { + "uxid": "7f44d7ef014419278137cbaa344cb550fc3c07355ec619d917bea3bc15fb8817", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "2.000000", + "hours": 35 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 152, + "block_seq": 29 + }, + "time": 1429020687, + "txn": { + "timestamp": 1429020687, + "length": 183, + "type": 0, + "txid": "260d249883165aa9e59e17fb2bd8ba8995d2c3644993530985f8b813ed378650", + "inner_hash": "c5a9b2a4d2100d45a97a0131f3ffa79fbc4bb37b8969e8a1d5059055ca169c6c", + "fee": 551, + "sigs": [ + "661c14759218ac72f4b06ac96bce6db7e20cfae5f23643cc4dae2641893ca3686682cb1e3cc3f384afe549a87209e4104ed7d163af8af3be4762686719541e8900" + ], + "inputs": [ + { + "uxid": "98b3e6e6d4ed36159b7dbf5f305174fc0c255d2d97528b35a67d50b9968e2b2f", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 629 + } + ], + "outputs": [ + { + "uxid": "18ea1b3cceb2ca40c01efc8f3cfd7d1d0dd69430ecdf655515aa4f8b21bd2644", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 78 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 151, + "block_seq": 30 + }, + "time": 1429021044, + "txn": { + "timestamp": 1429021044, + "length": 183, + "type": 0, + "txid": "044a75b1d3d273cae560ca43f9351d9acde206b0ad5578eb3adc2598886b5134", + "inner_hash": "61a1297a213a7642daf445350b49b2df9ccade45cc1498b91f80fceefcad5adf", + "fee": 31, + "sigs": [ + "ef33f4e1a053728e779296e912df149ad7e20167bd79ae88db24c52da558c6cc0dffaa3aeb9b4aa507865855f7172bb7ac72040dafb56bc2612d152d51e8008000" + ], + "inputs": [ + { + "uxid": "92ae7cf57ad1363a60ce019818f7304040959329b6513f9a2d0f6b464bacafea", + "owner": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "3.000000", + "hours": 35, + "calculated_hours": 35 + } + ], + "outputs": [ + { + "uxid": "61c61dfe5b82fde557a698b402c82ac0205929478e705cbadec7f5d47a51d403", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "3.000000", + "hours": 4 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 150, + "block_seq": 31 + }, + "time": 1429021184, + "txn": { + "timestamp": 1429021184, + "length": 220, + "type": 0, + "txid": "9004c779cff67b3895500ec14b2c2e566127bb11a8af3358fe8a63dcfae9badc", + "inner_hash": "9e1eed08b004316812f4ad574f3d0f96959b2a335cdda77113abfd1673a8859d", + "fee": 60, + "sigs": [ + "6b3a3b3374c641ca252ee32cceab1b37c4c395b411e4d2515bc51f2a8ec12b9c440d25dee1b94a0231dd9492ab3e07c7a5dc054a0da987d6bf0ba6fc8de6f42000" + ], + "inputs": [ + { + "uxid": "18ea1b3cceb2ca40c01efc8f3cfd7d1d0dd69430ecdf655515aa4f8b21bd2644", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 78, + "calculated_hours": 78 + } + ], + "outputs": [ + { + "uxid": "64194899d317e2a007f89df14538795547e927c242a92f83180e6cc952304964", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "5.000000", + "hours": 9 + }, + { + "uxid": "569aa1260e734017c4eee06d84ab4a6285e2ca2041940b2915d9141527caf179", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "5.000000", + "hours": 9 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 149, + "block_seq": 32 + }, + "time": 1429021214, + "txn": { + "timestamp": 1429021214, + "length": 183, + "type": 0, + "txid": "327375203f20cb68847351c30a48597c0588a8c14319a4eb47bf440207fd045a", + "inner_hash": "217a070c0edd70fc0eaa7f858308444f32bbfe4b48e128b6fa876f60c4639bfb", + "fee": 8, + "sigs": [ + "de82c42e2523b512c0ffea3c91244dc905f59264f3c59e2f82efc3fdb7f446c728afb08bbc3478462cf25b96848da9dc4dd6b87cab569715ebd33e8102c552d101" + ], + "inputs": [ + { + "uxid": "64194899d317e2a007f89df14538795547e927c242a92f83180e6cc952304964", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "5.000000", + "hours": 9, + "calculated_hours": 9 + } + ], + "outputs": [ + { + "uxid": "eb446b8372559249c8e269b6cd028588e2e9e4f8fe9357719da9d1c22aa29911", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "5.000000", + "hours": 1 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 148, + "block_seq": 33 + }, + "time": 1429021674, + "txn": { + "timestamp": 1429021674, + "length": 280, + "type": 0, + "txid": "e89ee3e90e72108e4cd6ccb95c9f8d2b18ccfaa7ce61a7d297454debd69cebbf", + "inner_hash": "dac67377dd9d8247db41f3380288730de2e51514ec3a2986072719553b9f9e27", + "fee": 9, + "sigs": [ + "7df848876a507f4b2855818f059e62e6d2f5924af148607a0c6004b7231fdce920ac80e800a833e55cbce9938b5d8cb755b0dc434c22b03a5037972ff2d6444801", + "6499aeee3ba19247d1ef2d3ec13e46031adf0dd6a383785272776a93621f21696cf217b7375e5721e51133fc3d9806200d2aded757118fbe27a719ebf4ceaea001" + ], + "inputs": [ + { + "uxid": "569aa1260e734017c4eee06d84ab4a6285e2ca2041940b2915d9141527caf179", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "5.000000", + "hours": 9, + "calculated_hours": 9 + }, + { + "uxid": "eb446b8372559249c8e269b6cd028588e2e9e4f8fe9357719da9d1c22aa29911", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "5.000000", + "hours": 1, + "calculated_hours": 1 + } + ], + "outputs": [ + { + "uxid": "e702df2703c3de180f3e4a0e9a503bd534037c2d68e858e97a317575c5a97d95", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 1 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 147, + "block_seq": 34 + }, + "time": 1429021994, + "txn": { + "timestamp": 1429021994, + "length": 220, + "type": 0, + "txid": "08bf0f8f4a8547bcab1fef035adac2a66c80369b4485a736bdd676e782bbb037", + "inner_hash": "8fd6f4e5428c170dede16e8c02596ab0c490dd5c418d003d9232d8c2caedec9c", + "fee": 1, + "sigs": [ + "f68d819dbda0bbf7cd5e2de8088267c5b3a744bbe2d7737c7dc52060b6344a25180cc1081e5c7dadab94763d158e303f697d1d275685b32bfd1de123a376697501" + ], + "inputs": [ + { + "uxid": "e702df2703c3de180f3e4a0e9a503bd534037c2d68e858e97a317575c5a97d95", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 1, + "calculated_hours": 1 + } + ], + "outputs": [ + { + "uxid": "10998e83dc5dfe3c3f5f28ef3e5e2fced4dbd1da389678b0ea3ddb552851b6bf", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "6.000000", + "hours": 0 + }, + { + "uxid": "41c6d29aa5de770de684ab19b40bd75b99ec7f1a5ff7d15288ae4bfff568eabd", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "4.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 146, + "block_seq": 35 + }, + "time": 1429022034, + "txn": { + "timestamp": 1429022034, + "length": 183, + "type": 0, + "txid": "3170f0635cc40aded3a38f84f2ae07bd2238550ea4ee867328d0f891ea9abf14", + "inner_hash": "1cebcd96c2847d219b658733012921d6e10a6c55439736833dd0ae97b898f72a", + "fee": 0, + "sigs": [ + "179826a9f244005b2b34d145948b178533805953adff8ab924a6fd67538daaa4384d67a24473de6bb01d441e4d979e520b055cd9304188d00255eab7c04bf45701" + ], + "inputs": [ + { + "uxid": "10998e83dc5dfe3c3f5f28ef3e5e2fced4dbd1da389678b0ea3ddb552851b6bf", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "6.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "9e5779445f60d62b471862339d7a83dd8355c7a89d5fc3b751f98e9414628ec2", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "6.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 145, + "block_seq": 36 + }, + "time": 1429022064, + "txn": { + "timestamp": 1429022064, + "length": 280, + "type": 0, + "txid": "fba515a9eeaedb891c4dca862bd06108e0452270890b362f0b353b4c86845618", + "inner_hash": "3c24f665a7a02308fe6938ef3ce7e38dfe72644b1d71c5aefbe3d6844c609d58", + "fee": 0, + "sigs": [ + "faf14290ac158576f0dd4311ee4835a2542ae8b52d9ec7ab36d1af938a117f382c42855dec9b980f282e7ff8d7e19d469b084a7d44e38022e246c365368cc07d00", + "52cfd88d334818382413dfa45dd8e00a2136c352b7547dcf97894bf3eaa152cc5b10bf9f35c4dc8c75e7bb62543bd244a7c1de588b2a606aa1eb0b32c9c4ca1501" + ], + "inputs": [ + { + "uxid": "41c6d29aa5de770de684ab19b40bd75b99ec7f1a5ff7d15288ae4bfff568eabd", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "4.000000", + "hours": 0, + "calculated_hours": 0 + }, + { + "uxid": "9e5779445f60d62b471862339d7a83dd8355c7a89d5fc3b751f98e9414628ec2", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "6.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "d46e91fea3c8a6428885f941e5152dbc7f9abd356ad4d054bf20e0e806f1ec99", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 144, + "block_seq": 37 + }, + "time": 1429022094, + "txn": { + "timestamp": 1429022094, + "length": 183, + "type": 0, + "txid": "9fb039cd90a4e9b85669bd6ef878b98a9e84eec7d4804e2bff6f0dc9c2739c44", + "inner_hash": "5bc5636489d4ba7d36b4429cd3ec71491c9fa6f442fede1ea696428b574e0d13", + "fee": 0, + "sigs": [ + "3127749c2123db967563b9726cf5d6daa3ae755ec74f5e5fbc3dcfb10ececc231f5d61de693355aa5c8ade13c4c31ddc3bf9864e87139fdcd64c513702f7425600" + ], + "inputs": [ + { + "uxid": "d46e91fea3c8a6428885f941e5152dbc7f9abd356ad4d054bf20e0e806f1ec99", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "2987e7c89d353ad5d63cea2bf2724dc5f7a5ef5fb81f5ea160a307f0726ac2f5", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 143, + "block_seq": 38 + }, + "time": 1429058484, + "txn": { + "timestamp": 1429058484, + "length": 220, + "type": 0, + "txid": "a76cd63b71f1f5425941cd567627e1dcdc8c34306a7945ea48755f5a46efb6f5", + "inner_hash": "39c3ed7f2dfb26d02c9fcbbe853db5c3031644b4a66844a717d8795c6d954d65", + "fee": 2335473, + "sigs": [ + "844af158e935a38f034778a78b646a167b5758df65212546f2eb1c7e838216ad7aa6e7571d1e81d8836808d4315846fe97489bdf2e6d2159a2af77a15a9a2bcb00" + ], + "inputs": [ + { + "uxid": "ad742bbc7420c08881e6ccf35e34e8472c0dd6386792359aedcfb752ca618c33", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999790.000000", + "hours": 70992, + "calculated_hours": 3113963 + } + ], + "outputs": [ + { + "uxid": "108520145179c00f581d91e273714811fe6e82ee059d65218eea91154ebd8205", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "998790.000000", + "hours": 389245 + }, + { + "uxid": "f48432d381a10abecbd1357d81705ea922246e92170fe405d1a4a35c5ceef6a4", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "1000.000000", + "hours": 389245 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 142, + "block_seq": 39 + }, + "time": 1429058494, + "txn": { + "timestamp": 1429058494, + "length": 220, + "type": 0, + "txid": "c38b47bd576e3bced2a9309c3df7622064e71177f54020d77193d5cac310719c", + "inner_hash": "7f02ba6476946668f3adcbb35e113531e6788cee4fe94bf8d8da4803e3baa7e3", + "fee": 291935, + "sigs": [ + "2a31eb55da895c59654ad3f1a11efa11b04787ab78dcf8221aeeccf137adec543765f761363390c97f429310fcb39db305494a94b30af906a2d43d5de1effbb701" + ], + "inputs": [ + { + "uxid": "108520145179c00f581d91e273714811fe6e82ee059d65218eea91154ebd8205", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "998790.000000", + "hours": 389245, + "calculated_hours": 389245 + } + ], + "outputs": [ + { + "uxid": "e79c94aa7013c7611901839236b8a1cdf70e8ef7c40b9e33f99359136de981d6", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "988790.000000", + "hours": 48655 + }, + { + "uxid": "df5d6e09da2585a6ac1a37aea2370fa25e9049b549049202d5417138bf033cfa", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "10000.000000", + "hours": 48655 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 141, + "block_seq": 40 + }, + "time": 1429058514, + "txn": { + "timestamp": 1429058514, + "length": 220, + "type": 0, + "txid": "b56f3e9239da5c5f9bb5ca80226b8454ba36ce6012f8e323a50c9d9c4eb4a834", + "inner_hash": "bdcf8f2f2b960cfee6b3b1124a554ef4747fe43ac9452d897bd8dedcd643e1ae", + "fee": 36493, + "sigs": [ + "809029f12d5f38906306610feae26c0623bffe63218c8019060ae2d164cc29352066efd20567e3c37837230e74b481730b0fc71bcafe3b3b9f5eb4a7fb42f69101" + ], + "inputs": [ + { + "uxid": "e79c94aa7013c7611901839236b8a1cdf70e8ef7c40b9e33f99359136de981d6", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "988790.000000", + "hours": 48655, + "calculated_hours": 48655 + } + ], + "outputs": [ + { + "uxid": "c65a9e6aa33244958e9595e9eceed678f9f17761753bf77000c5474f7696da53", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "978790.000000", + "hours": 6081 + }, + { + "uxid": "f8ad5c72e7822c7ac9a1dce8de583e34f6f830052bc0a02d749e9e81790dae86", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "10000.000000", + "hours": 6081 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 140, + "block_seq": 41 + }, + "time": 1429058524, + "txn": { + "timestamp": 1429058524, + "length": 220, + "type": 0, + "txid": "cf4fe76a08e3296b6f6abdb949604409be66574f211d9d14fde39103c4cfe1d6", + "inner_hash": "2f5942207104d52dbd6191684b2a97392e616b7fa51dde314dbddd58d34b8027", + "fee": 4561, + "sigs": [ + "b2b8c8ec1e1dfdeac4690e88d4ef9fcc4b52fcb771153f391cbcb58d651505a94c6263b6dc15a948c0396c0d8be20d9e0d1993b494bd9189c778d3673363bfc401" + ], + "inputs": [ + { + "uxid": "c65a9e6aa33244958e9595e9eceed678f9f17761753bf77000c5474f7696da53", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "978790.000000", + "hours": 6081, + "calculated_hours": 6081 + } + ], + "outputs": [ + { + "uxid": "195f5e50b4eed1ec7ff968feca90356285437adc8ccfcf6623b55a4eebf7bbb5", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "969790.000000", + "hours": 760 + }, + { + "uxid": "6bbf13da052e1baade111ae8bb85548732532c8f5286eba8345d436d315d1c93", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "9000.000000", + "hours": 760 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 139, + "block_seq": 42 + }, + "time": 1429058594, + "txn": { + "timestamp": 1429058594, + "length": 317, + "type": 0, + "txid": "0e91a08561e85a36ddf44e77b9228f7d561c18c0b46d19083d4af511085b697e", + "inner_hash": "d78230e22b358d7cc8d491adb3c0ec1e77a5170602a4ec92d700c4b4bb101f98", + "fee": 292512, + "sigs": [ + "17ba9c495e4d396a37eaf062e1806a13b3bdc91a83151c2455cf948a7e6d91882dc02ec6443970517f0f7daf59ce9b89658a17f5d51c0cbc18056811d0f3006501", + "e4e8f28801fe461cc8097b29cfe1307739bdfbdd6b20c31e04eef89aede641a6407fa0c41b0ad5ef167e3255e1916c0bbd358ffd70f34dc7944ffe67514bc5f501" + ], + "inputs": [ + { + "uxid": "f48432d381a10abecbd1357d81705ea922246e92170fe405d1a4a35c5ceef6a4", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "1000.000000", + "hours": 389245, + "calculated_hours": 389256 + }, + { + "uxid": "6bbf13da052e1baade111ae8bb85548732532c8f5286eba8345d436d315d1c93", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "9000.000000", + "hours": 760, + "calculated_hours": 760 + } + ], + "outputs": [ + { + "uxid": "19efa2bd8c59623a092612c511fb66333e2049a57d546269c19255852056fead", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "9000.000000", + "hours": 48752 + }, + { + "uxid": "9953e00abe05db134510693a44b8928ca9b29d0009b38d9c4f8dcdedee7edc35", + "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "1000.000000", + "hours": 48752 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 138, + "block_seq": 43 + }, + "time": 1429070374, + "txn": { + "timestamp": 1429070374, + "length": 414, + "type": 0, + "txid": "d368fc3112b522c52a5b191981ca52678cc7db29bdc3493cf551be88d109ef9c", + "inner_hash": "acb0cc7def6ebcfd45b1490aa60d6cb84fc3621bf34be5ab84910a1929efccf5", + "fee": 1596, + "sigs": [ + "9d1fcf32769b70f2eeb88b70434010c5ac5844031d85c515f7854b0aa5b91de7035f4fa3802ebcc6a7e064b4ebf16be5b1ed9a85b31bbb46ceb11694e14648eb00", + "40303be55ccfaef337b8810405d522c2a32a4d86acc5e474626666f3999533b55a33c546b04472e3d10a7870e0435968ce88ac7fbea6fecb8617a680957752ce01", + "3c1d5a5e076cb1274fb478c6c3bd4e0f724106f71edbd16eed7e2b13aabb69a53f7e91df5af8c611ffd2ca9114cd4d4be7df70ccf541606c781af41f986ea51700" + ], + "inputs": [ + { + "uxid": "e3e95cd390c42d2f08e2c173135620e09c7a2ec1cf80ff75fbc3940fa5712b3c", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "55.000000", + "hours": 1008, + "calculated_hours": 2035 + }, + { + "uxid": "7f44d7ef014419278137cbaa344cb550fc3c07355ec619d917bea3bc15fb8817", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "2.000000", + "hours": 35, + "calculated_hours": 56 + }, + { + "uxid": "61c61dfe5b82fde557a698b402c82ac0205929478e705cbadec7f5d47a51d403", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "3.000000", + "hours": 4, + "calculated_hours": 35 + } + ], + "outputs": [ + { + "uxid": "88162721a552b1422546024772fc822faa187e897754e0a579e5e4a92a7cf4c9", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "55.000000", + "hours": 265 + }, + { + "uxid": "e64fa1f60e905f1d7b7a8f0ca134ab2b7a467f7363ec9c03628d559e1230eb68", + "dst": "2apVG7f24ezDK13yCDTqBWYrTZpuj94KnCN", + "coins": "5.000000", + "hours": 265 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 137, + "block_seq": 44 + }, + "time": 1429070414, + "txn": { + "timestamp": 1429070414, + "length": 220, + "type": 0, + "txid": "ced30c4ac3107997efa90faa40c8baed47dafc8ddb4feae3ba21275401c36280", + "inner_hash": "f3a57ef9c95bf41b758b317169e29596448640aad207b88a21b45b1ea46e9a99", + "fee": 199, + "sigs": [ + "fa16091cb778d496199d0b59f934d38891ff0b3aad42be78565a4f5a9880b9063a8e423fa7dacc624e0ffb01931bbdf4bed0fef8044f9280c8cd562b2f3bb0bd00" + ], + "inputs": [ + { + "uxid": "88162721a552b1422546024772fc822faa187e897754e0a579e5e4a92a7cf4c9", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "55.000000", + "hours": 265, + "calculated_hours": 265 + } + ], + "outputs": [ + { + "uxid": "73ad63090201c13e6fb55d2e51ec5606fe49a40640bea995e347e7389fcea6c6", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "50.000000", + "hours": 33 + }, + { + "uxid": "85fcb22c416b7d430076bb80a324734cb97483cb4544192df252b89ba8f7fd61", + "dst": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "5.000000", + "hours": 33 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 136, + "block_seq": 45 + }, + "time": 1429071074, + "txn": { + "timestamp": 1429071074, + "length": 220, + "type": 0, + "txid": "df622e8c9dfaed1d7dca83ad7f6d8946bb86b81398bad521d858cbefef8e4688", + "inner_hash": "91ab4f29d84e9ffba56a108e01984e7b483729da4e61b6976c018fa11ace36a8", + "fee": 2402820, + "sigs": [ + "d0726d81cb1cdce6028668d0d95ceccf39cc9d655a7bff143573b9f52d0586232bbb7bd494df8b9bb5155a271446cfaff1550d5ccf314dd35f044226f98d14e201" + ], + "inputs": [ + { + "uxid": "195f5e50b4eed1ec7ff968feca90356285437adc8ccfcf6623b55a4eebf7bbb5", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "969790.000000", + "hours": 760, + "calculated_hours": 3203760 + } + ], + "outputs": [ + { + "uxid": "cb8efc0b1082c39258cb6efd59f64d88b36fcb60143c826829fc5f0ed5c0d668", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944790.000000", + "hours": 400470 + }, + { + "uxid": "4aca4c715985da352bd9aa84787868dac4f4e305c420fe79e6f05acee3bba14a", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "25000.000000", + "hours": 400470 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 135, + "block_seq": 46 + }, + "time": 1429077374, + "txn": { + "timestamp": 1429077374, + "length": 220, + "type": 0, + "txid": "0a2da0489b14156fad8fb863d051a4dac1f645f144c1e5bb65a44478623b8e4b", + "inner_hash": "787ae7cb222a23641bb33751d1428dc8e07a2f2cf11ee6293a54100836209d09", + "fee": 300354, + "sigs": [ + "9bc3b6d7cb1d66d52fc993d0799baafa1056992049fa86ce76d5909690e88c4a19920b69e2463cf34d1dddb545b61ee38fb2f9b33f92626da8afdd934c353c8e00" + ], + "inputs": [ + { + "uxid": "cb8efc0b1082c39258cb6efd59f64d88b36fcb60143c826829fc5f0ed5c0d668", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944790.000000", + "hours": 400470, + "calculated_hours": 400470 + } + ], + "outputs": [ + { + "uxid": "a6061defc41a8a55e37eaf56ebaa1177446f61719b1d5126698e79a6023f5367", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944780.000000", + "hours": 50058 + }, + { + "uxid": "a52408daa8ce7026c70b61d4df4212fb577462060f340bfce779225b3e18193d", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 50058 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 134, + "block_seq": 47 + }, + "time": 1429077384, + "txn": { + "timestamp": 1429077384, + "length": 220, + "type": 0, + "txid": "a4a202bc4431d95c307d151dea764bfc6d9ceb7e82b3eb50dc8604050622a22c", + "inner_hash": "836145a3e62a7e055acc3404c1fd6ecb237e3251e6f8b39fd526a7f48f21daa8", + "fee": 37544, + "sigs": [ + "f826793e63a3b0b837070e8876461c47af6be7a6898c370c70430b1491457cda76fc3b34e08bff41a336277ec1e93cc008f9c08ca295b418488b1ac92a5f5a4000" + ], + "inputs": [ + { + "uxid": "a6061defc41a8a55e37eaf56ebaa1177446f61719b1d5126698e79a6023f5367", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944780.000000", + "hours": 50058, + "calculated_hours": 50058 + } + ], + "outputs": [ + { + "uxid": "3b5f72e772ea886dd872b9087395398133576a6561072d5294fbcd04b49e1d95", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944770.000000", + "hours": 6257 + }, + { + "uxid": "dc73aac74348dd285a1456c1fae2204d7c2039d50a765bdaae0c31f7c7e059db", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 6257 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 133, + "block_seq": 48 + }, + "time": 1429077394, + "txn": { + "timestamp": 1429077394, + "length": 220, + "type": 0, + "txid": "4e6b363423633ad51114b250478ee7645fbd184066fa41c29e5b14d0728cdfec", + "inner_hash": "8cf88a9e5140d5e01af412c956b3de7c93bfebbb4c5993b9b0285812208f5b33", + "fee": 4693, + "sigs": [ + "670abb369c25a655b0f22c069a9523d439b8a03d122bc9f0861aff796ab965fd5e1b79812b6f458ebc0a1cd4cc223d0137eb22e1bf1cbb40265ac7301018897000" + ], + "inputs": [ + { + "uxid": "3b5f72e772ea886dd872b9087395398133576a6561072d5294fbcd04b49e1d95", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944770.000000", + "hours": 6257, + "calculated_hours": 6257 + } + ], + "outputs": [ + { + "uxid": "f265bea876ffcfb8cf64df3aca4dae4a8d7f424ff495d91fb322feddb3a7e505", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944760.000000", + "hours": 782 + }, + { + "uxid": "e4e375b9dc55ff53d6de9120f1a87ff00e00a779835f8320f2c6b3090d0466e6", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 782 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 132, + "block_seq": 49 + }, + "time": 1429077404, + "txn": { + "timestamp": 1429077404, + "length": 220, + "type": 0, + "txid": "edc27c6ecc1f76d0f23489ad7bbbdb8c653af37cc4b8f18197400aea2011ed83", + "inner_hash": "5432e686f984075091a8d3686d959b63ef620382fcb2b86794ba8dc0fb9656e7", + "fee": 588, + "sigs": [ + "c1902b37a95c5327b0e5a1f05de551d4135831b787c86562867344ee7f06235374dc1618c6b4a8e077041723bc731db72dab5554a808b1ba77d305309144bf5e01" + ], + "inputs": [ + { + "uxid": "f265bea876ffcfb8cf64df3aca4dae4a8d7f424ff495d91fb322feddb3a7e505", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944760.000000", + "hours": 782, + "calculated_hours": 782 + } + ], + "outputs": [ + { + "uxid": "e6d9b56e075a6adf520d1ae7fbab9ae06353ae0b93dc8cb17d82cc3628009a50", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944750.000000", + "hours": 97 + }, + { + "uxid": "d11b05345917d171f60c31bd2634041b73b97eae364724369ddb8d53369397fb", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 97 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 131, + "block_seq": 50 + }, + "time": 1429077474, + "txn": { + "timestamp": 1429077474, + "length": 220, + "type": 0, + "txid": "be27621ad46680b343cc1406f5c6a1717704ce169e988ed7afb586f8112ae6f0", + "inner_hash": "158b0ca1e5055c4abb6729eeb187d9fc592c425c8f1eaf07c3d64e17e1d1615d", + "fee": 71833, + "sigs": [ + "3624a41ca94d80e7f13ea09f3acdfd701b9425af1a43c62e08a98744f31c651b1f9d2183c35f64aea01431e1c0c3a12d2f63d2c88ff9bd1a124b895a4bfabc6b01" + ], + "inputs": [ + { + "uxid": "19efa2bd8c59623a092612c511fb66333e2049a57d546269c19255852056fead", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "9000.000000", + "hours": 48752, + "calculated_hours": 95777 + } + ], + "outputs": [ + { + "uxid": "5fa90c22a26ecec8c03696a018b590a5e1679efa9cb5e8263facf9bcc6628db6", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "8000.000000", + "hours": 11972 + }, + { + "uxid": "5afa88b6a9ef9168d15d9a0bbc87dd5ab30badc01773460f92703a9c829358c0", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "1000.000000", + "hours": 11972 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 130, + "block_seq": 51 + }, + "time": 1429077484, + "txn": { + "timestamp": 1429077484, + "length": 220, + "type": 0, + "txid": "814694a8e32f1c81b627f8eb704622c8893d197bf32bbd7e1bf73bec9a831d7d", + "inner_hash": "10daee0ac47006149435adf9655dbc8796eece3d075f93af9810b204f90003ab", + "fee": 44061, + "sigs": [ + "9cfad1cc126d0b33d6e44b5cf99672c0bbb088dd2ed01090365292d4ba1c188f18772aacbc7931e81202c11d7eb977a8f00bae86ce5b40479482bbbd883dfcaf01" + ], + "inputs": [ + { + "uxid": "f8ad5c72e7822c7ac9a1dce8de583e34f6f830052bc0a02d749e9e81790dae86", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "10000.000000", + "hours": 6081, + "calculated_hours": 58747 + } + ], + "outputs": [ + { + "uxid": "f37efd851f76854852fdb8b8ba9afa2c5b7859315cc1fd12c12bf6831c59beb2", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "9000.000000", + "hours": 7343 + }, + { + "uxid": "2f4daff744e7fd81ceea34ecfb0e383a65ecda1c55f32a0bef313d29b0795eab", + "dst": "2acnXsnJ2k8jxiUahtBe8h4xouPAnpbwwjc", + "coins": "1000.000000", + "hours": 7343 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 129, + "block_seq": 52 + }, + "time": 1429077494, + "txn": { + "timestamp": 1429077494, + "length": 220, + "type": 0, + "txid": "231254039042675300dbdd61a6ca54941214e383b5f6380323f848482b4f4628", + "inner_hash": "ddddc962f9ad468e32f141dcf8479e2ec2293d42a32b2085fbaa0b5e9f80a267", + "fee": 8996, + "sigs": [ + "7cb704180d085d04db6816852111cf3dad3c911337af4e22596c42efe77a45983539abe92b0f08993559f87ac2e4ddb907e46c36c6a746920f2fd0c89b0b7fc201" + ], + "inputs": [ + { + "uxid": "5fa90c22a26ecec8c03696a018b590a5e1679efa9cb5e8263facf9bcc6628db6", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "8000.000000", + "hours": 11972, + "calculated_hours": 11994 + } + ], + "outputs": [ + { + "uxid": "e4fa8fe06d04bb438323f295eea23535856be08b369be71a2ce3e9e7bc0b1e09", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "7000.000000", + "hours": 1499 + }, + { + "uxid": "cec910b5d672e216db306389dc9ebb08f9d37485fbc3ac6aa7a8c37f60be844c", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 1499 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 128, + "block_seq": 53 + }, + "time": 1429077514, + "txn": { + "timestamp": 1429077514, + "length": 220, + "type": 0, + "txid": "d154d8262abbf517c67d529b0fea7cdf097433bd296d5795b17c6379cb1b1430", + "inner_hash": "b69070b10e6bbc276bf155361d7f3238fec46b9d865075c1dc0fc20d81ab0a42", + "fee": 17787, + "sigs": [ + "0a4b7f385a164f5718794382d49c14a6623e7af5f1ddbefe4871c756b754457a7075e822603bd3b22b313278abebe756be92367ef7a81a8c4adf992842c2058601" + ], + "inputs": [ + { + "uxid": "e6d9b56e075a6adf520d1ae7fbab9ae06353ae0b93dc8cb17d82cc3628009a50", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944750.000000", + "hours": 97, + "calculated_hours": 23715 + } + ], + "outputs": [ + { + "uxid": "2df1e88589be43c55d7c6c3dbcbd663fb759b3245eb8d86b0b9cdaa989556aea", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "943750.000000", + "hours": 2964 + }, + { + "uxid": "c7919b892eeb751456d456b37ccde7350a3fca0dda03b17ec426a56f12dcf192", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1000.000000", + "hours": 2964 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 127, + "block_seq": 54 + }, + "time": 1429077524, + "txn": { + "timestamp": 1429077524, + "length": 220, + "type": 0, + "txid": "88d239f2584c78b73a1905fd0dcce3beabfdfc5a9c54518862b009e22e972c68", + "inner_hash": "bbb61ff8c3b3361e77eae47d4a65c4073e45ded96994efbe605fa7639486b2ba", + "fee": 1153, + "sigs": [ + "c627aa6233c7bc436f7569399554ead829bd21244cb1f938cecde96b493d1ac84099844dc91bbdcf72593285c33f124dba2d3aa1b7807532d647484492b8760900" + ], + "inputs": [ + { + "uxid": "e4fa8fe06d04bb438323f295eea23535856be08b369be71a2ce3e9e7bc0b1e09", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "7000.000000", + "hours": 1499, + "calculated_hours": 1537 + } + ], + "outputs": [ + { + "uxid": "f5beae016bda8260218fc05468c300fa71ddd46f4c6337fffac8d83229461f5f", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "6000.000000", + "hours": 192 + }, + { + "uxid": "470b293870b663b84e1f677e1bc0e486d0b5f412b0562b078a7a1045f7785d7a", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 192 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 126, + "block_seq": 55 + }, + "time": 1429077544, + "txn": { + "timestamp": 1429077544, + "length": 220, + "type": 0, + "txid": "374f01de8274656147be0a23ccc5677773da6f32b071ee796bda0851b6dcd2ac", + "inner_hash": "1789978d61189b7e49bea67d8a1d1f0341da0242cb0b801c4d8bc346ec2fd618", + "fee": 5583, + "sigs": [ + "f706829ee37d3f4467aae6341bd20c0455ae172a947ca372028db7f9b1dd2d7a4123b109eba8d4add2f695f6a7aa5806840551096f5357ce09be55e1877fb70c00" + ], + "inputs": [ + { + "uxid": "f37efd851f76854852fdb8b8ba9afa2c5b7859315cc1fd12c12bf6831c59beb2", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "9000.000000", + "hours": 7343, + "calculated_hours": 7443 + } + ], + "outputs": [ + { + "uxid": "298fabb8217a2b0322f104b0cb295383bfdbc599d6a81e07610e0922eb99f89a", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "8000.000000", + "hours": 930 + }, + { + "uxid": "2f1de81eaa83eda52d8eaf44b12599b23134a38b7d55f67de8881ddafbec278b", + "dst": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1000.000000", + "hours": 930 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 125, + "block_seq": 56 + }, + "time": 1429077554, + "txn": { + "timestamp": 1429077554, + "length": 220, + "type": 0, + "txid": "8fba29db2e3e8cad785e723f95aa5fa46ae0dd8b2bb62586977f20e698642cfb", + "inner_hash": "dc25f33c3b93678ccc3449a318d55782a274c17cd2f45089018bd7c55b21dd96", + "fee": 76179, + "sigs": [ + "6fbe79a6f32b242f97f7e7662e6f7eb5aff065e8063864fc52159071005ffb2570c26a2d8b21a7826cf18c15f4f4ed9b718a7a9fdf1b4d5ac63bdb632452c82401" + ], + "inputs": [ + { + "uxid": "df5d6e09da2585a6ac1a37aea2370fa25e9049b549049202d5417138bf033cfa", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "10000.000000", + "hours": 48655, + "calculated_hours": 101571 + } + ], + "outputs": [ + { + "uxid": "3d7dd4d41e613fe8153f5e5f62b79494e9db9ed98f875d929ca1f90ecfe2d50b", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "9000.000000", + "hours": 12696 + }, + { + "uxid": "9e53268a18f8d32a44b4fb183033b49bebfe9d0da3bf3ef2ad1d560500aa54c6", + "dst": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 12696 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 124, + "block_seq": 57 + }, + "time": 1429077584, + "txn": { + "timestamp": 1429077584, + "length": 220, + "type": 0, + "txid": "61a33b49e97bfe2d5f026bf45fae43a1b9bdf08c60ec8db017da720a69790c7f", + "inner_hash": "32d2dce8e8043e544b3cb2145b0bfb9d4cfdb7ae8e20437d075f76b75d8e088e", + "fee": 10088, + "sigs": [ + "990bf0a8c74b0b4c4d05f463a0a50e311a6ae27b5d327dcb906bb6e42330709d48998eed6e7cbdf35caeab6d90fac3e56fb222032aefa7b1d4d9c7653aca9fe600" + ], + "inputs": [ + { + "uxid": "2df1e88589be43c55d7c6c3dbcbd663fb759b3245eb8d86b0b9cdaa989556aea", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "943750.000000", + "hours": 2964, + "calculated_hours": 13450 + } + ], + "outputs": [ + { + "uxid": "c5150380691c542b9bdf4cf2280ac612e0576c349f99d47d0a03c77eedc48731", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "942750.000000", + "hours": 1681 + }, + { + "uxid": "3b9059ec909faf64d652dae78944f4a2737df95a3215bf98e2ff33e02e2b377f", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 1681 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 123, + "block_seq": 58 + }, + "time": 1429077604, + "txn": { + "timestamp": 1429077604, + "length": 220, + "type": 0, + "txid": "5d1cb86b48c8834c8c12fc36a83259609300f2f6a148faa1492a473cee21bc02", + "inner_hash": "34ee80da7f19e17ab8b49569ad514135f6e6120c67288c8f613b758b9db8658c", + "fee": 220, + "sigs": [ + "228340c209abeb45fe25b93bfccbf08cc4faa1abcd89c95bf0332de0f9846f642c68fb68f49f4dfe6ed556c2e8b86bab6127d47de518179ad467af637e264c7d00" + ], + "inputs": [ + { + "uxid": "f5beae016bda8260218fc05468c300fa71ddd46f4c6337fffac8d83229461f5f", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "6000.000000", + "hours": 192, + "calculated_hours": 292 + } + ], + "outputs": [ + { + "uxid": "53ea8733d94ae54bade0b55df03a03b3c0f6e6683b9260c36b14e3fc311d6f49", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "5000.000000", + "hours": 36 + }, + { + "uxid": "d58f3facfb4c9c9459e6fae3000886acb2b1f81322725cdc32cc09a49bb81e43", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 36 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 122, + "block_seq": 59 + }, + "time": 1429077614, + "txn": { + "timestamp": 1429077614, + "length": 220, + "type": 0, + "txid": "4ce860140dbb5f90f39086b0c51323005145a95b365204bd33e3d90fbdc35f51", + "inner_hash": "d81940dc03cf3fa1fd3eeadb84ae46e472bf3e281754a79eade7029b5ae1f639", + "fee": 799, + "sigs": [ + "dbc7327f85a323193b59dde59d2656c8dfeb2b94c40dd01ca70f379d14a7b9123473b7cdf38df1196b55f2c01c4a31ed1c9ba7d75f6670deef3b9816656add2d01" + ], + "inputs": [ + { + "uxid": "298fabb8217a2b0322f104b0cb295383bfdbc599d6a81e07610e0922eb99f89a", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "8000.000000", + "hours": 930, + "calculated_hours": 1063 + } + ], + "outputs": [ + { + "uxid": "1efc8693845733061e1407a74e86976a52a69c63a14d6a79e1f3e45277662900", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "7000.000000", + "hours": 132 + }, + { + "uxid": "53d7b4778ee9b9537c0439666ca124d81bcaf4195d080ef61fade8c3eae6322e", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 132 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 121, + "block_seq": 60 + }, + "time": 1429077624, + "txn": { + "timestamp": 1429077624, + "length": 220, + "type": 0, + "txid": "77a69f4c8afd858a2f6767bb9980d4af6520e02b076bf2a78b935021e1147c71", + "inner_hash": "65f97c460ed99ea47ea2cdfd0780af2338f78d80bff93b92dc2ccc8f2411abec", + "fee": 9636, + "sigs": [ + "7c32e34864bc9659222cb26f10058df5cf2fe0c7b78b1d067a7b5af80f4a2b146f8914f4424d9e80a3303d3d2531ddf9d60489011c607ecd5f92cefa5105eee501" + ], + "inputs": [ + { + "uxid": "3d7dd4d41e613fe8153f5e5f62b79494e9db9ed98f875d929ca1f90ecfe2d50b", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "9000.000000", + "hours": 12696, + "calculated_hours": 12846 + } + ], + "outputs": [ + { + "uxid": "77769e6a01cf3dca201ade501767d0abf20dea19d694f3272b647a9a651fdee9", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "8000.000000", + "hours": 1605 + }, + { + "uxid": "0560bae3917bca7581af9b6c5a58e395c701ce9ed0241dac2de8a3e93c0b839b", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 1605 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 120, + "block_seq": 61 + }, + "time": 1429077654, + "txn": { + "timestamp": 1429077654, + "length": 220, + "type": 0, + "txid": "4aeafd20b9df56ec852a2c257ff1630b9530d8375a4e72f20238ea36835f76d5", + "inner_hash": "bc6119c006f7c54c8608cc8050f47c43e6c079397f607f8c9e90d3072a10eca5", + "fee": 9118, + "sigs": [ + "0309322d16d48a35bd42c2ae6a76b240b21974d073f81f440e04431941fc9d550de92dcbcb226ad3baae2b3cbae51db28b2dc8d3e1b51cdd559cbbb6e4b71eda00" + ], + "inputs": [ + { + "uxid": "c5150380691c542b9bdf4cf2280ac612e0576c349f99d47d0a03c77eedc48731", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "942750.000000", + "hours": 1681, + "calculated_hours": 12156 + } + ], + "outputs": [ + { + "uxid": "9bbb8d620aae3efc7c21bb7d6a7159eda441a83e0fef2cd98f8240b38857d648", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "941750.000000", + "hours": 1519 + }, + { + "uxid": "2480aeed2dc47c692e4bce61fb3ee44c4992ea39b0a167235e501330d7ddac62", + "dst": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 1519 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 119, + "block_seq": 62 + }, + "time": 1429077664, + "txn": { + "timestamp": 1429077664, + "length": 220, + "type": 0, + "txid": "057ae2bee6e1fc2c9997d48aab3e348a7f17ad0305d6e6a14f4f663404b4a00a", + "inner_hash": "7b253041d4c467262bd144354f1584fc37b1b3a2934b0230919838e60a4320dc", + "fee": 79, + "sigs": [ + "7587f95e4036b310ce3bafbd1248ae62210120c14c2569d358f0f1363120626060e0797c9728a2cf3cef7839fa6e9d42d31ca899cfab82fa3eb8a0401c3cb8e301" + ], + "inputs": [ + { + "uxid": "53ea8733d94ae54bade0b55df03a03b3c0f6e6683b9260c36b14e3fc311d6f49", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "5000.000000", + "hours": 36, + "calculated_hours": 105 + } + ], + "outputs": [ + { + "uxid": "83b5fa4051dbfd50ba903374e5e583a9345c6a980505ee56963de9bd8e539e36", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "4000.000000", + "hours": 13 + }, + { + "uxid": "b9853ab091bdb295de20d765e9bce2d86870791a6a15b8ef9e9dddb71c4cba95", + "dst": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 13 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 118, + "block_seq": 63 + }, + "time": 1429077684, + "txn": { + "timestamp": 1429077684, + "length": 220, + "type": 0, + "txid": "8d10b0ba11d9dd63d3a3522bc35bd260e8da9109298aa488355ea7201eb961b7", + "inner_hash": "929218d56de3e94d277827c857a657ef8b1352f75e6938ff5cf10ac4c54d4039", + "fee": 1271, + "sigs": [ + "6c8892c3277b90f5ca71a42515706de993c459f094282fa99168359f00c5cb862811c4225cc1448e99ba2755e9f9eb241ad0df25b20f1a6ec035a673cf42ab2f00" + ], + "inputs": [ + { + "uxid": "77769e6a01cf3dca201ade501767d0abf20dea19d694f3272b647a9a651fdee9", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "8000.000000", + "hours": 1605, + "calculated_hours": 1693 + } + ], + "outputs": [ + { + "uxid": "f5867b05823c81fc53de36b140415b3b98e4f4cec5883512f8553f70c550d8e7", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "7000.000000", + "hours": 211 + }, + { + "uxid": "9011fbc6e82dce0656e7ffc76afb014d2ad70aa4663e7b687d3212e12f8965e2", + "dst": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", + "coins": "1000.000000", + "hours": 211 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 117, + "block_seq": 64 + }, + "time": 1429077694, + "txn": { + "timestamp": 1429077694, + "length": 220, + "type": 0, + "txid": "29c229c97d27bcaf842a367520e1916fb855921906bddf4a3b0413ad3f11517b", + "inner_hash": "bc02dde29d200fa6bc0497f2ddd5e52007aef9b6482d40953fbd44ed88e3cf78", + "fee": 7026, + "sigs": [ + "0674c0617c9e6109ca9af404d446777943bb6aaa5dcb223da63bff1a305498972735e0b2a601cc9c6ee2231ad5fdd025fb92cbb00e200860a2ebde924f76499400" + ], + "inputs": [ + { + "uxid": "9bbb8d620aae3efc7c21bb7d6a7159eda441a83e0fef2cd98f8240b38857d648", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "941750.000000", + "hours": 1519, + "calculated_hours": 9366 + } + ], + "outputs": [ + { + "uxid": "25ad0d5ae6a1a9bc61c6b9099fb7829111977a59e1183de4227a0a5352555639", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "940750.000000", + "hours": 1170 + }, + { + "uxid": "47c74a6d7f1f54cf0a7ac45ec00277539079810068dd95a29a202c43780d65a0", + "dst": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "1000.000000", + "hours": 1170 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 116, + "block_seq": 65 + }, + "time": 1429077724, + "txn": { + "timestamp": 1429077724, + "length": 220, + "type": 0, + "txid": "e3b7236ad4b209d664ee1e2549f2a0d34a3ba58b12ee46f98fba73c01574e484", + "inner_hash": "30b5c520717641fa7a5b11c5340e6f239d1502d90809e919003004048582e8de", + "fee": 36, + "sigs": [ + "3c90ea0882c24e0e17f9f453f7777eba42aa5fea386f21f8f873969a0118d12f0a81169e3600d68026cbbe300b63568db468cbd931087eb0de8635a8453efe3201" + ], + "inputs": [ + { + "uxid": "83b5fa4051dbfd50ba903374e5e583a9345c6a980505ee56963de9bd8e539e36", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "4000.000000", + "hours": 13, + "calculated_hours": 46 + } + ], + "outputs": [ + { + "uxid": "70dfcdd1a8a321ffd22c4ce313763464f78c2f85a97bb369ac8b82f76d2ea961", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "3000.000000", + "hours": 5 + }, + { + "uxid": "c2fcd55cf6b73e863c96f7c2d6251069199bfd43688d2515f5c6631688aadcbc", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 5 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 115, + "block_seq": 66 + }, + "time": 1429077734, + "txn": { + "timestamp": 1429077734, + "length": 220, + "type": 0, + "txid": "bbd1d4b6fe89a5986efbea9f7996cca2a515c3f0788cedccc21990dc78d83509", + "inner_hash": "f5b418d7156e6ad70bbde6d90be61d4ab2fce406890a3fe764ae2a43da12440d", + "fee": 259, + "sigs": [ + "1fd3e13f0e55364107d6916ab5002bcc434889e5f5355751f1f688ac469f336d09161f516770cc78f1ece3cb790a1ded56e25948a46546c8d521dea6b3141fad00" + ], + "inputs": [ + { + "uxid": "1efc8693845733061e1407a74e86976a52a69c63a14d6a79e1f3e45277662900", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "7000.000000", + "hours": 132, + "calculated_hours": 345 + } + ], + "outputs": [ + { + "uxid": "3fe6b13824f28d69588c309278420069bc0efae95367d0d6f93cb40af15eeaa6", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "6000.000000", + "hours": 43 + }, + { + "uxid": "06292fe8a2036c38f28c4d2f355d9e86e2b55b9d85f84613a64cf5c35d192b28", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 43 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 114, + "block_seq": 67 + }, + "time": 1429077874, + "txn": { + "timestamp": 1429077874, + "length": 220, + "type": 0, + "txid": "42227683dd9c149859d0578ab300d8509d513afadf7834fd8ae7a321cc07d833", + "inner_hash": "a7a9ea6466bef6cd63f671ae5dd1aafbeb251a717c7da331d40ec376ad0e89ec", + "fee": 8718, + "sigs": [ + "b4a141eb037a4debd99c347f337f67662a3feeb96112d7b05fc035a3556419dc3a9b35028327d925ca5eb9da018371bc333b7365f06ea22366169af6f066524701" + ], + "inputs": [ + { + "uxid": "25ad0d5ae6a1a9bc61c6b9099fb7829111977a59e1183de4227a0a5352555639", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "940750.000000", + "hours": 1170, + "calculated_hours": 11622 + } + ], + "outputs": [ + { + "uxid": "acc75d51ff9f18a224d1ca0481917e2a67298de40955711cd97a08f6733b5b6a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "939750.000000", + "hours": 1452 + }, + { + "uxid": "8bdd2662d7ed495ff82daef9198ee23ac0c75417607675a8da3dd673952c0e39", + "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "1000.000000", + "hours": 1452 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 113, + "block_seq": 68 + }, + "time": 1429077914, + "txn": { + "timestamp": 1429077914, + "length": 220, + "type": 0, + "txid": "d803ab903f68f7861cd8eff93b3c097c5b8f6a697ca67bb01e7e645060839fd0", + "inner_hash": "611f096c50da1d98c29b8c9bdc6b7f7c98d96061ab126c66716f17a2fc495166", + "fee": 1090, + "sigs": [ + "d264a023bc6986c1bf16e2e697f4df8b6e33ae2d4b1ddd4e207cb5f902fed54c1234c3ef2429d82507f5c10c0fb4320d753f3bf6b5e155fa3ec03bc91dd8206a00" + ], + "inputs": [ + { + "uxid": "acc75d51ff9f18a224d1ca0481917e2a67298de40955711cd97a08f6733b5b6a", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "939750.000000", + "hours": 1452, + "calculated_hours": 1452 + } + ], + "outputs": [ + { + "uxid": "5c1069a3aa6628ed7f9bdb300bec1a7e7ca6fb4645528a8c6a27c167e7dfe698", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "938750.000000", + "hours": 181 + }, + { + "uxid": "3c56fa9d161783d6fe5c8b055c6d20bae27097e7bcc44d9ece5c94df182ee5bf", + "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 181 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 112, + "block_seq": 69 + }, + "time": 1429077944, + "txn": { + "timestamp": 1429077944, + "length": 220, + "type": 0, + "txid": "3bf485890e91268452dc3136c0b294dc9909b3aaa10b9c936743e6e9b1a56f61", + "inner_hash": "e952e5d86f3cff105dab78a455691c871f3b0fd09558e367833c4743339b94d3", + "fee": 137, + "sigs": [ + "632771f1bdae7454911dcb6462aee56827f949dae18e8a98168b57864a62333f4251e17efa15a53ec12ab6980ea72838e9bb0e64aad82ad9e6a0a2a33b3006cd00" + ], + "inputs": [ + { + "uxid": "5c1069a3aa6628ed7f9bdb300bec1a7e7ca6fb4645528a8c6a27c167e7dfe698", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "938750.000000", + "hours": 181, + "calculated_hours": 181 + } + ], + "outputs": [ + { + "uxid": "8190fd31c005510d550c8a241b127fad2558c82aed9483fb4423193d5f4429e3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "913750.000000", + "hours": 22 + }, + { + "uxid": "5a7b2b6568cfa4ff5d44e98446aed92438ede0103b9994cfa3389bd02a35239b", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "25000.000000", + "hours": 22 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 111, + "block_seq": 70 + }, + "time": 1429077964, + "txn": { + "timestamp": 1429077964, + "length": 220, + "type": 0, + "txid": "f51e2ce31961b0186e04cc9d78857c3c21d3e2afb25c050d8c1d67d3320fcc07", + "inner_hash": "4a8b13ea0c8a993b3455a374e847bcbea7e7a20392c7cc169cbc41778e65d6e3", + "fee": 18, + "sigs": [ + "74f886780a9df8f6987c8c60bf5d9ad0fc25a502ba8f681188923d3a85f74bb87d57b067e53ed0f423ee7fbb352f3260e65c38e44cc7eec8fe8224374fd77cc800" + ], + "inputs": [ + { + "uxid": "8190fd31c005510d550c8a241b127fad2558c82aed9483fb4423193d5f4429e3", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "913750.000000", + "hours": 22, + "calculated_hours": 22 + } + ], + "outputs": [ + { + "uxid": "450cd7795bb3625daa99d6b64b9a8786d593bf1cad986d6c2933dae04b74a593", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "888750.000000", + "hours": 2 + }, + { + "uxid": "9639a86df8da288fb0fc6a92fa086f3cd5a8387705a14ddd2aa5e30c6c3fc3fb", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "25000.000000", + "hours": 2 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 110, + "block_seq": 71 + }, + "time": 1429077974, + "txn": { + "timestamp": 1429077974, + "length": 220, + "type": 0, + "txid": "abed13c2a552633d26b5b51c3ac5abf9808756c0203869ed185a7cd673702ba2", + "inner_hash": "c176a1a85f716055a9e8060c2a4245db0d7f71f4ac5387d4a51d173db467150a", + "fee": 2, + "sigs": [ + "40e8340047f08afd483b2867166e15ae751bb7272a2c24f68ae8561d3619ea021363e987118a2fe516cacff1946d4d6c4c249038581ee2f58f8feea4bcffc3b100" + ], + "inputs": [ + { + "uxid": "450cd7795bb3625daa99d6b64b9a8786d593bf1cad986d6c2933dae04b74a593", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "888750.000000", + "hours": 2, + "calculated_hours": 2 + } + ], + "outputs": [ + { + "uxid": "b44ee00208690c2123989f40edaff0224825afb20ca0952fbd90bddfd3213642", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863750.000000", + "hours": 0 + }, + { + "uxid": "22edb5931e1c54382f18e41ef774931efb08c278209a1fe8a34100147b707220", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "25000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 109, + "block_seq": 72 + }, + "time": 1429078004, + "txn": { + "timestamp": 1429078004, + "length": 414, + "type": 0, + "txid": "3872797c8f9964e6ad19552b9b88d2af07be32866bdb9b9c60aa7086f253af43", + "inner_hash": "5784542f1b1f9284f25c8d3995429e77b1c0cbdf4b1eeb6a1737f5f19b0b576f", + "fee": 558, + "sigs": [ + "cf51ea4b5631baaa43dcf258cf08f6f87fe4fa9afb2d081e7eeacf6be3b1239058e30d931d22d3befcbde12b51399b438cd8726670f10c0da3889bc08917fb5601", + "bfa55b86721bd2d92144e2108123cc33b62ef50da580fed9d6787cbcc1674f63761ef4d39592f060e98b415c22d272066c36f6499ceb5571b19b4eae1c3110be00", + "3b50522194013cf9ea2dfc387be85c79c7e2379c1936d654c14921cdcbbbaab047a2ab1e09f3a190a09d12f70b41d6428b2e171732630b6a74eeb269853a404500" + ], + "inputs": [ + { + "uxid": "3fe6b13824f28d69588c309278420069bc0efae95367d0d6f93cb40af15eeaa6", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "6000.000000", + "hours": 43, + "calculated_hours": 443 + }, + { + "uxid": "5a7b2b6568cfa4ff5d44e98446aed92438ede0103b9994cfa3389bd02a35239b", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "25000.000000", + "hours": 22, + "calculated_hours": 230 + }, + { + "uxid": "9639a86df8da288fb0fc6a92fa086f3cd5a8387705a14ddd2aa5e30c6c3fc3fb", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "25000.000000", + "hours": 2, + "calculated_hours": 71 + } + ], + "outputs": [ + { + "uxid": "3a7e60306a5fc882d0c4edcb2990d14be6b80dad1a41b06f8ae5e0308078bafa", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "31000.000000", + "hours": 93 + }, + { + "uxid": "a96ca17d6af858af8c6f24f607a742ae2979ab8f660b8363b7fbe18625c8a048", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "25000.000000", + "hours": 93 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 108, + "block_seq": 73 + }, + "time": 1429091164, + "txn": { + "timestamp": 1429091164, + "length": 220, + "type": 0, + "txid": "a95317361364e8cc08a150840bac8a97ea1f56278f8834ca2a2f16c24c4a7f0f", + "inner_hash": "90c166e92a7883037f9634704923d986976ac814f28e4761309bf86d77cdb755", + "fee": 2326, + "sigs": [ + "27ee3b614e5362462bc20c23e873e380b5bcc880053436a640286ead5fe2dcd00094e0eade532ffbfc8ba95d5e3540968b2fff64e19e0e772342aceb3c5d3ce100" + ], + "inputs": [ + { + "uxid": "c7919b892eeb751456d456b37ccde7350a3fca0dda03b17ec426a56f12dcf192", + "owner": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1000.000000", + "hours": 2964, + "calculated_hours": 3100 + } + ], + "outputs": [ + { + "uxid": "7b132c07322babefa83ab64971b7bfb29bf2cb9ffe9c42dc7e2975a185dcd8b8", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "995.000000", + "hours": 387 + }, + { + "uxid": "8f52e126bbc359bc3bfd230d82649c3d1c622e8f9c20dae7ccd73bd0b4ee2bad", + "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "5.000000", + "hours": 387 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 107, + "block_seq": 74 + }, + "time": 1429091944, + "txn": { + "timestamp": 1429091944, + "length": 317, + "type": 0, + "txid": "edca397ceedb5fb4462b0aff8fe7f9da5091a4e68f11a34c79daf2c5ae7dd748", + "inner_hash": "873d38a9ff804dab8d83013a6e6b4132d0b0dde6439de24f2190ecd1d31f9ab6", + "fee": 43640, + "sigs": [ + "0c3ca0de3f369e03859d710b18656c92c96b11b8c0e15e31b337293e59776b905f6ce7f91f7b3c9c268b6cb1673b8ef2ffe2dd7f059f7833b62284168bf2065601", + "7755689ff9c10e672b3311b1b69ed69ff82dbcc168683b75e77491c9d36f7a7f1ddd0801b5acbafb467baca8ab9f28cf7189be701bdf169749290ad4cb58e2a801" + ], + "inputs": [ + { + "uxid": "9953e00abe05db134510693a44b8928ca9b29d0009b38d9c4f8dcdedee7edc35", + "owner": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "1000.000000", + "hours": 48752, + "calculated_hours": 57799 + }, + { + "uxid": "8f52e126bbc359bc3bfd230d82649c3d1c622e8f9c20dae7ccd73bd0b4ee2bad", + "owner": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "5.000000", + "hours": 387, + "calculated_hours": 387 + } + ], + "outputs": [ + { + "uxid": "5f75082377566cf140c8f158e160ab6ecd1cdf02224c66865106fa1a75b39dc2", + "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "955.000000", + "hours": 7273 + }, + { + "uxid": "e2807345a3e76b7050038a9ec40d5a62bd4dcc6b1ed79f186213a32caf7008a1", + "dst": "j6pa8kdKqHbxRm2VXJVbzigQDFzqTVfvfq", + "coins": "50.000000", + "hours": 7273 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 106, + "block_seq": 75 + }, + "time": 1429096344, + "txn": { + "timestamp": 1429096344, + "length": 220, + "type": 0, + "txid": "3122b6b29ac470bfa18fbd1ef6d5ff76717e18ba25374215a5003557b4524f22", + "inner_hash": "f752c579e2f7663b3e13371c7bb94b09cb047f1cdb597bd52b79c8c81f557b9c", + "fee": 5455, + "sigs": [ + "d12daa336401481611bf15edf07cfa0b181a1f3e2e8d062c6e8b04d690242cd87db5fd5aebda3bb06c49e8450c18c5c0360d6c4b14686cbb361feb394b5c26f501" + ], + "inputs": [ + { + "uxid": "e2807345a3e76b7050038a9ec40d5a62bd4dcc6b1ed79f186213a32caf7008a1", + "owner": "j6pa8kdKqHbxRm2VXJVbzigQDFzqTVfvfq", + "coins": "50.000000", + "hours": 7273, + "calculated_hours": 7273 + } + ], + "outputs": [ + { + "uxid": "ec41341d4c9d69e150079550a9051c4cb7cc3e2da49deb2c0faaa632cb1958f8", + "dst": "j6pa8kdKqHbxRm2VXJVbzigQDFzqTVfvfq", + "coins": "5.000000", + "hours": 909 + }, + { + "uxid": "ead07056919be961a9e812a7832356d806d551096284648756b3642a3d4a5570", + "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "45.000000", + "hours": 909 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 105, + "block_seq": 76 + }, + "time": 1429110544, + "txn": { + "timestamp": 1429110544, + "length": 317, + "type": 0, + "txid": "5369348d67b2dd30dd9164657e372304f81ea10dfe1914ba874d46cd659f52c5", + "inner_hash": "08a8ae61257645c212216e63a96673001fa581c286eaa4ddcb81f6ffaaff8c1a", + "fee": 432263, + "sigs": [ + "75489dbb081962833ce1fffbc393f0040e5c75bf45564a3757573eba816b71bd63e8178eef8add2277864d6d251013b6197bd80efdc069b7c5adf27b0372703c01", + "4587b09d2e08de8379fd1505748ea21db3995f2dd18b04ca729f2ebf76c2645a21acc2e5ca5f4b79f6381b91ef21fe4bb72d2415b74f38fc1569b90233211c8d01" + ], + "inputs": [ + { + "uxid": "73ad63090201c13e6fb55d2e51ec5606fe49a40640bea995e347e7389fcea6c6", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "50.000000", + "hours": 33, + "calculated_hours": 393 + }, + { + "uxid": "4aca4c715985da352bd9aa84787868dac4f4e305c420fe79e6f05acee3bba14a", + "owner": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "25000.000000", + "hours": 400470, + "calculated_hours": 575956 + } + ], + "outputs": [ + { + "uxid": "50386f195b367f8261e66e3fdfbc942fbacfe25e117e554ca1c1caf899345476", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "25045.000000", + "hours": 72043 + }, + { + "uxid": "9c3119ad3edbd17a2135cac6d24ef43c6d7e599710b2aab4e97e731e64c13acb", + "dst": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "5.000000", + "hours": 72043 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 104, + "block_seq": 77 + }, + "time": 1429147880, + "txn": { + "timestamp": 1429147880, + "length": 220, + "type": 0, + "txid": "29798149e90f6442489bcc3294f455441a5a401e81491ed06bdc2c850756f0d9", + "inner_hash": "23ab44d59346b369d258cce6d5142ca7e1b52dd09a1512d8a618e08ae7346004", + "fee": 5860904, + "sigs": [ + "6e0bd761d2d9eeb207f0c4cf9f13d1407f33b5f50e72c3462225c8041882ddcd078a02720d533801a433d917674e3d68a98bb997e9b06664a73a9bdeae46404601" + ], + "inputs": [ + { + "uxid": "b44ee00208690c2123989f40edaff0224825afb20ca0952fbd90bddfd3213642", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863750.000000", + "hours": 0, + "calculated_hours": 7814538 + } + ], + "outputs": [ + { + "uxid": "6060c983054614b8801e405de697c443a1edebd3236582f89f01c6cf6a165c3f", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "862750.000000", + "hours": 976817 + }, + { + "uxid": "08723ed501e11c2053bab6b500f820dd7ae2aeb4a3c9d5109845bb46afebde97", + "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 976817 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 103, + "block_seq": 78 + }, + "time": 1429147900, + "txn": { + "timestamp": 1429147900, + "length": 317, + "type": 0, + "txid": "c1fb9372439d7f43d17809afc2d1bc9b2aa81fa9fccc1d837c79e649ec4843db", + "inner_hash": "283b6b1141f7b09348804d18171ec9b0d20446725df1265932a4064385c9c295", + "fee": 407859, + "sigs": [ + "d16d6a7cd11064a91a6ca4917efe946cc38cb4e7dd59281a4b4098e39bdc151036b72fbf9db4f3ca2b97bdb56a861e8fbe010e52926b176172d3e68b85c7b04501", + "5cd9b19556656a6914d2f8a3daf556220e34eb567a741f015a9de0d53920bfff0e0cb3513551ed7ad95301ac8852487b76a3509832379c57572b46e75f0946cc00" + ], + "inputs": [ + { + "uxid": "70dfcdd1a8a321ffd22c4ce313763464f78c2f85a97bb369ac8b82f76d2ea961", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "3000.000000", + "hours": 5, + "calculated_hours": 58468 + }, + { + "uxid": "a96ca17d6af858af8c6f24f607a742ae2979ab8f660b8363b7fbe18625c8a048", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "25000.000000", + "hours": 93, + "calculated_hours": 485343 + } + ], + "outputs": [ + { + "uxid": "dbe677fec72761ed99467a4d45871aafe173d7dc133e8db0346e3f262ae2598a", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "27000.000000", + "hours": 67976 + }, + { + "uxid": "ce4ca78d810564568c936554d0b6c1a50d91b273648314ffa3fcc1b2d72ac334", + "dst": "sV8sVBgs11uHQtZK5MPbYem2iJ6Hehghv7", + "coins": "1000.000000", + "hours": 67976 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 102, + "block_seq": 79 + }, + "time": 1429147950, + "txn": { + "timestamp": 1429147950, + "length": 317, + "type": 0, + "txid": "2558a7cd524acdb58f822a56bd51e8905182b2b35fbfdb1246ce6dc9930d14eb", + "inner_hash": "37931a3c0b9fe54ebfd93e70c5e872ea8f68669bcd38176bc223be01f7e43aa0", + "fee": 466755, + "sigs": [ + "1d2fa9d76a29f3ce2eda062afe42f3718db434863955ed4f43a83f79dd372a922fd2774d7f5227fa253c65537418b30309932f404e788db91fac1d580d83b28101", + "471ae24bbebd78b5d298edb81e07cc282ce8c1517a2d7426f91f177f111c93873c594e04a215bcd982220b0e6967bd328ec494811cf5eb854091e1d4552545e700" + ], + "inputs": [ + { + "uxid": "f5867b05823c81fc53de36b140415b3b98e4f4cec5883512f8553f70c550d8e7", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "7000.000000", + "hours": 211, + "calculated_hours": 136742 + }, + { + "uxid": "22edb5931e1c54382f18e41ef774931efb08c278209a1fe8a34100147b707220", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "25000.000000", + "hours": 0, + "calculated_hours": 485597 + } + ], + "outputs": [ + { + "uxid": "09661724179523e8aec95862a5fd12dd1aa50f39f193f81eece0d7aea6197103", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "31000.000000", + "hours": 77792 + }, + { + "uxid": "2a886bcedf8862c351cc4087b89e902202b08b164363567a9be47908e938f280", + "dst": "pMub1Pz3SLVaSwHoomgp5oDVxdkVxLkW6L", + "coins": "1000.000000", + "hours": 77792 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 101, + "block_seq": 80 + }, + "time": 1429148000, + "txn": { + "timestamp": 1429148000, + "length": 220, + "type": 0, + "txid": "5db4378f5abcbb48774fc3731a164fb7bbdccf410c3ff829c5706e4d9ef1b1c6", + "inner_hash": "3e77cc0080eaa29331c9206044e731992369bf84c89262c80d68b39b68ce77e9", + "fee": 51265, + "sigs": [ + "94e4ecd0016b2c5b10f55941cc0355a2c248eaa04566dedcf84e83cfee959d50578cb85ca0ee6170060e97a6fc766fa79a4f6e0942605681178d4bb8009b31e501" + ], + "inputs": [ + { + "uxid": "dbe677fec72761ed99467a4d45871aafe173d7dc133e8db0346e3f262ae2598a", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "27000.000000", + "hours": 67976, + "calculated_hours": 68351 + } + ], + "outputs": [ + { + "uxid": "fa761f3b902ced1ad8e94231af3447315a8c8bcdbbdcfcd69bb74ca5ae66f6e9", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "26000.000000", + "hours": 8543 + }, + { + "uxid": "e16c0ebbfba61c49b0e98bf8336bc4d8a33ca30386c4d875bba2ec4bf4a59147", + "dst": "22WGCstVJGVyqnBuvGHt17L5aNNMpURvckd", + "coins": "1000.000000", + "hours": 8543 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 100, + "block_seq": 81 + }, + "time": 1429164440, + "txn": { + "timestamp": 1429164440, + "length": 220, + "type": 0, + "txid": "0cded82aa3ac92d78e23d2d0d7faf93c675fc9a321ad55105f65b6fca444b1e7", + "inner_hash": "0ca2ed02f9155bf69af2fd27b40b0300e0c9804cbd2507389d930ef186f48794", + "fee": 754183, + "sigs": [ + "68a82ec4421a37b8116c8bad98d2568802973dbce6f0166b3a9504110ee4873239953c3e8baf3a20d599e300c8b2c524d672c46ed593e126adc908f1decbbf5100" + ], + "inputs": [ + { + "uxid": "6060c983054614b8801e405de697c443a1edebd3236582f89f01c6cf6a165c3f", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "862750.000000", + "hours": 976817, + "calculated_hours": 1005575 + } + ], + "outputs": [ + { + "uxid": "129726406b3101d51ffd5bfca59a501184d6c8ca363be4ef1b8d8bf48a6c70e0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "861750.000000", + "hours": 125696 + }, + { + "uxid": "3fe7d61ffa993e00200ce6be7ba347c603032ac3f8c4ace07767e630fe94d76c", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 125696 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 99, + "block_seq": 82 + }, + "time": 1429164460, + "txn": { + "timestamp": 1429164460, + "length": 220, + "type": 0, + "txid": "0ad2691de38a15ec31b0fbe9a0c1175138c9d7b7558db2f016a23619f3dbbc6d", + "inner_hash": "3b3cc2ad41e6248b46bd71e14f91eb2296b730426a8f0481c440271920ddbe27", + "fee": 558303, + "sigs": [ + "e5711c06db00c26d91126e9d024189c1a494ae1357b55247955a4b3bda219e8905dfa03875c1224e754e5e8b4d475d1ce335f2699cd9d490583cd6a0d1e1338c01" + ], + "inputs": [ + { + "uxid": "3a7e60306a5fc882d0c4edcb2990d14be6b80dad1a41b06f8ae5e0308078bafa", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "31000.000000", + "hours": 93, + "calculated_hours": 744403 + } + ], + "outputs": [ + { + "uxid": "dc8162cf85ce1a434adebab2d13abffb587c0e50b86fd1a997bca67f07a66ebd", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "30000.000000", + "hours": 93050 + }, + { + "uxid": "9bfa6dd7ff610b2e8ba036594244e70d427398eab8607d39be0e45303d45d4d8", + "dst": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "1000.000000", + "hours": 93050 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 98, + "block_seq": 83 + }, + "time": 1429164480, + "txn": { + "timestamp": 1429164480, + "length": 220, + "type": 0, + "txid": "d80d49958166fd7b35cee63cfc4a4fdd434484f9bfd9444f62a1b856da36e9c7", + "inner_hash": "ddf70f29cbcb9ab5d04848c77bb605849c5d831c80afed10f64ea2bde710b7bd", + "fee": 164971, + "sigs": [ + "21ccec8663f52b64e6d1983c5c715fc360ef1a01a0f4fce857fe7151e59b4cc87a5b6cc18f770eac98ef640eb15d572ea96b81e90a793bb01ac905778c10f0da00" + ], + "inputs": [ + { + "uxid": "09661724179523e8aec95862a5fd12dd1aa50f39f193f81eece0d7aea6197103", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "31000.000000", + "hours": 77792, + "calculated_hours": 219961 + } + ], + "outputs": [ + { + "uxid": "6a8bc7ef9e8e7b67fd270cf37022edadb13f1fc2ba4e7a026f7ce2ab30cc4572", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "30000.000000", + "hours": 27495 + }, + { + "uxid": "a733e89023ccc12587d0849f9baeda0d2fad640c1cbe97e24ffc531859fd83fd", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "1000.000000", + "hours": 27495 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 97, + "block_seq": 84 + }, + "time": 1429164590, + "txn": { + "timestamp": 1429164590, + "length": 220, + "type": 0, + "txid": "8374d85130bbcf496bff138cd040f91fa362eb1b6b6a1c7c9285523437d5589c", + "inner_hash": "3188ba9148add7f2811180f130de2c0668fc21c031a7329993b61bfe35f860f1", + "fee": 20623, + "sigs": [ + "93edab2b508cd33cd76c50a5aeabcbcf35472d25ba2b3f268d1cc0a4a813fbe907f4c0e645893b4efd524d30fabb6ba62d65c2ee050057885eea2ca0d2d1c21500" + ], + "inputs": [ + { + "uxid": "6a8bc7ef9e8e7b67fd270cf37022edadb13f1fc2ba4e7a026f7ce2ab30cc4572", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "30000.000000", + "hours": 27495, + "calculated_hours": 27495 + } + ], + "outputs": [ + { + "uxid": "15700b88043b3c08a46c3c4e36e7f431291a26aef1ef26c44ee413feee14b950", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "29700.000000", + "hours": 3436 + }, + { + "uxid": "e2512ec90800147d0d9ddbd0778511ee5a45a25efcb354c50a101738a65462c5", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "300.000000", + "hours": 3436 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 96, + "block_seq": 85 + }, + "time": 1429164620, + "txn": { + "timestamp": 1429164620, + "length": 220, + "type": 0, + "txid": "b7b42b1b29acab0a2328aaf368ec74be49b4d4caf827e82b439ef4d8be976a55", + "inner_hash": "8b5eec10f63b31e72d4dba2c71fb0f7bc230e58f497e255352f02eee965d3595", + "fee": 121202, + "sigs": [ + "82587c832f0c74f185603b934a32a28624712373d188caad0355314ea621a4af3e96dbd1c37e889f630d90047c79b39c495b49964eca20172bb900db1df48b3a01" + ], + "inputs": [ + { + "uxid": "129726406b3101d51ffd5bfca59a501184d6c8ca363be4ef1b8d8bf48a6c70e0", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "861750.000000", + "hours": 125696, + "calculated_hours": 161602 + } + ], + "outputs": [ + { + "uxid": "05f42f22f5fea4b5cac8182dc2b4f280149c686434c6d4195a119a8d02ab24b2", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "861050.000000", + "hours": 20200 + }, + { + "uxid": "6e2abc4bc7820178358a603b7d99c4b39735dd1685d0c5a778ab63f29c9e93d9", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "700.000000", + "hours": 20200 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 95, + "block_seq": 86 + }, + "time": 1429164720, + "txn": { + "timestamp": 1429164720, + "length": 220, + "type": 0, + "txid": "ca51f9d0a19bf326d6dd39a1e4dd240adaaae279411093d4a5b20f54cddabb95", + "inner_hash": "47500bd3c5f74835a01b0f696e15780baec2ca3723f45355c9e8cd1c71564d18", + "fee": 15150, + "sigs": [ + "fdbc112b10354be2b85b2f9131a3927e7b4e87ff8ddef91b849a71e0b1445ebc410b61d85ff7af1834b54febf89d903e3151f5a74ccef4e9607851c9005454d001" + ], + "inputs": [ + { + "uxid": "05f42f22f5fea4b5cac8182dc2b4f280149c686434c6d4195a119a8d02ab24b2", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "861050.000000", + "hours": 20200, + "calculated_hours": 20200 + } + ], + "outputs": [ + { + "uxid": "4e1a98a72639efa6253a7cbea0f3b499fa24fb88612ad81414d20e46d2b5784e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "860050.000000", + "hours": 2525 + }, + { + "uxid": "ee69cfd4f15d16ded96745a35ef150f679b5b79cc0fd4009a2d02cdccd81ca3e", + "dst": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", + "coins": "1000.000000", + "hours": 2525 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 94, + "block_seq": 87 + }, + "time": 1429164730, + "txn": { + "timestamp": 1429164730, + "length": 220, + "type": 0, + "txid": "cf5a1fad27f8f874f67d3162ae6347154c980ebd97c668d610280418f0f53ce7", + "inner_hash": "937bb1627381dc0e982b5b33a119a458db7605a5ff11df1b7a81957460157bad", + "fee": 96974, + "sigs": [ + "53f091d0b653d50c32aa9bd24c09aa1671b2a8686f744a769a9568d3ea28f7852370d83429dfff6b16b9a721f2ecdf40fe799006229d575cec6e73174e7b84b500" + ], + "inputs": [ + { + "uxid": "fa761f3b902ced1ad8e94231af3447315a8c8bcdbbdcfcd69bb74ca5ae66f6e9", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "26000.000000", + "hours": 8543, + "calculated_hours": 129298 + } + ], + "outputs": [ + { + "uxid": "a68c6c646b6bd42f509a82d0218c8ee648b4a40da20eb0599449a7249b10fee9", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "25000.000000", + "hours": 16162 + }, + { + "uxid": "f98e302e74d8972254b1cdc4de3ca78ff1e60f3f1b7083af397f3bcb219e9454", + "dst": "FtdApqw416skWtXM7ExanZWFmiHNPZ1Ft6", + "coins": "1000.000000", + "hours": 16162 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 93, + "block_seq": 88 + }, + "time": 1429164790, + "txn": { + "timestamp": 1429164790, + "length": 220, + "type": 0, + "txid": "efc98a4f94ffda2f1d6575048d75728f228a0bef0467c331f085a0f41f97ae45", + "inner_hash": "0134889df5d1e5c7a545f1cd6239ea51513534ed08acd503cc77e0b9d74ebcc2", + "fee": 71476, + "sigs": [ + "9a2582b47df81a77ab148fabe81fa6b1c490b213e0cd79aba779be1c56c225d5591bc6674a08bce27103ce7e1e85756d31c96635ecc07ae40c53ccabb20d254d01" + ], + "inputs": [ + { + "uxid": "dc8162cf85ce1a434adebab2d13abffb587c0e50b86fd1a997bca67f07a66ebd", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "30000.000000", + "hours": 93050, + "calculated_hours": 95300 + } + ], + "outputs": [ + { + "uxid": "b187246f68a768f65663b8a208ab107a9bc24af6a062acf3ad41aeb899315a49", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "29000.000000", + "hours": 11912 + }, + { + "uxid": "f713b6bde2e1956615b23021d20aeb829611d231e2e85b8204c01e5719ac8639", + "dst": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "1000.000000", + "hours": 11912 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 92, + "block_seq": 89 + }, + "time": 1429164800, + "txn": { + "timestamp": 1429164800, + "length": 220, + "type": 0, + "txid": "a0956843d442bd4b592d0c1323d153c3c1b2d7d52a86629444de6d1d1b6a4c33", + "inner_hash": "0fd405b4d4a74b417a27d0bfd2f0d1acf4ed0499a000e94c64a1443c5bb440bd", + "fee": 3816, + "sigs": [ + "9bd640adcf2e1870dd4cdd93f007759626ed9fd87dd8e0485888612ea660435a3104889820e6dab8d692efc3e4afb892de622c46b5f5c25718dfb78d4882d2ec01" + ], + "inputs": [ + { + "uxid": "15700b88043b3c08a46c3c4e36e7f431291a26aef1ef26c44ee413feee14b950", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "29700.000000", + "hours": 3436, + "calculated_hours": 5086 + } + ], + "outputs": [ + { + "uxid": "24c49699aab32caf9456a6b4dacd4d820c853c7639e5500b3be6326660312917", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "28700.000000", + "hours": 635 + }, + { + "uxid": "63154895637eb000146996ffaeb7cc1a547e409d0a2038650e990e7cc9b36826", + "dst": "XnKU1htBL5wFSMX8oytZBsBMeaBSbVNivT", + "coins": "1000.000000", + "hours": 635 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 91, + "block_seq": 90 + }, + "time": 1429164810, + "txn": { + "timestamp": 1429164810, + "length": 220, + "type": 0, + "txid": "bd617ec27c2bea642fad8c153178e11ca08456d752249324e3011f27c845f87a", + "inner_hash": "f8ce5c9cc22005d7f63c0400132b0e70a6a8af574f1a5c1ffb0404f228a02949", + "fee": 16229, + "sigs": [ + "b471a7bdde8b1427f8081d9e91250fd89cdd4dd23062796fe2ee973c612eb28b76f6c7ab4f3fbb7c7f9627c52158066d13d9fbe34dfdb6e77c02d84ff4d45d7d01" + ], + "inputs": [ + { + "uxid": "4e1a98a72639efa6253a7cbea0f3b499fa24fb88612ad81414d20e46d2b5784e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "860050.000000", + "hours": 2525, + "calculated_hours": 21637 + } + ], + "outputs": [ + { + "uxid": "33e0c4c9536afffd491fef6294f22ffb0d16902493946a051db0b218728a1c44", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "859050.000000", + "hours": 2704 + }, + { + "uxid": "2a09e97f7725a35af1357842206875a023252da4ebfce129eaf4cb87119cfd41", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 2704 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 90, + "block_seq": 91 + }, + "time": 1429164830, + "txn": { + "timestamp": 1429164830, + "length": 220, + "type": 0, + "txid": "98baeb9799902593d0f61ee22947089a798c6adafd05dc6a5ea918d982a19857", + "inner_hash": "8fdb3ac7731310281c5e67ca521d5b925aee8c7dd34b7b8249ae522ccd450943", + "fee": 12539, + "sigs": [ + "c1f82dfa176134077c4512421b01bec50360dae178e43ec9ceb70d24ff38301a33c6780db5b80afb49b08d15b303217ce206601c1a29bfef4f3bbdf6ccdf779200" + ], + "inputs": [ + { + "uxid": "a68c6c646b6bd42f509a82d0218c8ee648b4a40da20eb0599449a7249b10fee9", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "25000.000000", + "hours": 16162, + "calculated_hours": 16717 + } + ], + "outputs": [ + { + "uxid": "d45d0597c7d41fdc69ed09a139925327142589f1e4fb877285fa63c6fa126d38", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "24000.000000", + "hours": 2089 + }, + { + "uxid": "535987a7896501a8a69c1904c0bf98e2ef1fc493bf998c78ee420ef154868731", + "dst": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "1000.000000", + "hours": 2089 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 89, + "block_seq": 92 + }, + "time": 1429164850, + "txn": { + "timestamp": 1429164850, + "length": 220, + "type": 0, + "txid": "54e65c445d0af9dda82085ca4bfe0f326ae54ea2a03bd37e07f81d937de97777", + "inner_hash": "d8f2215fee34a1104826266582d525f9c267d3a726732ed532fb6572d09b82b6", + "fee": 9176, + "sigs": [ + "9d5aa480261d4d2dfbb8264ccb2bf8944b6abb5267ad89dda83760273abb8c0116f172e257a661a4d3d89c9c2caf237a13519545173c0df741a7dd18770176a401" + ], + "inputs": [ + { + "uxid": "b187246f68a768f65663b8a208ab107a9bc24af6a062acf3ad41aeb899315a49", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "29000.000000", + "hours": 11912, + "calculated_hours": 12234 + } + ], + "outputs": [ + { + "uxid": "74f7dcc6e516634b5d5722d8664ffabaca3b708a53497bb420ced7c300c39806", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "28000.000000", + "hours": 1529 + }, + { + "uxid": "3109e04b5baef2423f4d6d2d639464286c24ef9defa612d3b598802d761b670a", + "dst": "ZWhZtjwXMS46cpDxfRwQyxxKPhqwsQu8oN", + "coins": "1000.000000", + "hours": 1529 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 88, + "block_seq": 93 + }, + "time": 1429164860, + "txn": { + "timestamp": 1429164860, + "length": 220, + "type": 0, + "txid": "e2d9da9342b21659da0a679536f9d6f533a4ce7dc33a7f768c3441ca3640458d", + "inner_hash": "72974683d8244d927c63440a169a438611ef88b250f20df2711d83a9f61a75c9", + "fee": 775, + "sigs": [ + "1c72245ae55779445ae5a6c030ea7f01cee7c29dd6189d0dcb383ec8438297e635b314c44bb0c4173c9e30d225774ee0334cee186e603a61c171af4db3eb961e01" + ], + "inputs": [ + { + "uxid": "24c49699aab32caf9456a6b4dacd4d820c853c7639e5500b3be6326660312917", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "28700.000000", + "hours": 635, + "calculated_hours": 1033 + } + ], + "outputs": [ + { + "uxid": "fb4d5dcc1c3ac97444e96aa7da392b0d7faf7b7373504c70e497228a4695a7f1", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "27700.000000", + "hours": 129 + }, + { + "uxid": "4a5c1b09ef2216ba2fdae735ec8c6ad404bb61bfbeb7407dee9d6e3578762ffb", + "dst": "2LZzgdFYNhsBBSLATkV6PA1zk6DvWNghP2", + "coins": "1000.000000", + "hours": 129 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 87, + "block_seq": 94 + }, + "time": 1429164870, + "txn": { + "timestamp": 1429164870, + "length": 220, + "type": 0, + "txid": "0f4958d590ed4ac9aca79d848731b358b1c01fab9717775cf6515f2bf2706dc8", + "inner_hash": "89c71b68262f8e3acddcec032b4209220ac7b794d1cefa62b45c71b94e017cad", + "fee": 10977, + "sigs": [ + "ede880d4422a1102280918227157997bb7a36d26a358a71bf016963d29e8403d2298754039d8dd14c0b05d776d05bebadb919a620e87439c93008e292086c94d01" + ], + "inputs": [ + { + "uxid": "33e0c4c9536afffd491fef6294f22ffb0d16902493946a051db0b218728a1c44", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "859050.000000", + "hours": 2704, + "calculated_hours": 14635 + } + ], + "outputs": [ + { + "uxid": "f32f03f28eece9ddcdc488a85100c94a7c924c185ae560363518dae5e2aacccb", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "858050.000000", + "hours": 1829 + }, + { + "uxid": "24c4cfc628a0f77ce2e878c6ffa9d4dbd85325f8a5e0b5df970a3a2c36033519", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "1000.000000", + "hours": 1829 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 86, + "block_seq": 95 + }, + "time": 1429164880, + "txn": { + "timestamp": 1429164880, + "length": 220, + "type": 0, + "txid": "c93f8bb30e75ffbc0075a4baf57a0f536e4a9123395b13ce67af5cd2dd0f8cd4", + "inner_hash": "20a707a3ccfe4ab0884697e4d9013da5c15f062b0a6f1395086503f2c4d6efb2", + "fee": 1767, + "sigs": [ + "5fa7614080d2b044f1edce8bc42961d311db3fa4596fa14973261272980c37b0776099a37d758c20a2d45ee73aaed7d007e58f9f15191233f4f27b266fb2866c01" + ], + "inputs": [ + { + "uxid": "d45d0597c7d41fdc69ed09a139925327142589f1e4fb877285fa63c6fa126d38", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "24000.000000", + "hours": 2089, + "calculated_hours": 2355 + } + ], + "outputs": [ + { + "uxid": "aee4af7e06c24bccc2f87b16d0708bfea68ac1b420f97914965f4a23ad9e11d6", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23000.000000", + "hours": 294 + }, + { + "uxid": "f9653d496ee2e6499a68a1172e5d60b60758b1edcd02d95a3388b29e113a9041", + "dst": "2U1B6EE5ZCXWJJSyEndouuCk434xpvYqYDF", + "coins": "1000.000000", + "hours": 294 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 85, + "block_seq": 96 + }, + "time": 1429164900, + "txn": { + "timestamp": 1429164900, + "length": 220, + "type": 0, + "txid": "0301358c2db5314ca43c442bac3c1daf31f4b39f9ac9e22dc157687212cab703", + "inner_hash": "3a68e8622eaf49013554114c0dac32c444998ef6c65ff1afc399bc772787f502", + "fee": 1322, + "sigs": [ + "8925bcbda7785c7a83a77bd5ce16542e91a8f046163d429fcf9c466ca6a9b1fa5f6b693a19b7d8127717821ae247ba30401068d447d0fde4136c0e49f5e7e57900" + ], + "inputs": [ + { + "uxid": "74f7dcc6e516634b5d5722d8664ffabaca3b708a53497bb420ced7c300c39806", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "28000.000000", + "hours": 1529, + "calculated_hours": 1762 + } + ], + "outputs": [ + { + "uxid": "6002f3afc7054c0e1161bcf2b4c1d4d1009440751bc1fe806e0eae33291399f4", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "27000.000000", + "hours": 220 + }, + { + "uxid": "63768bd1402317f7d3f0a38c9897e609bb72b7d334e54bd4c609292487264c22", + "dst": "22Piwuzo8ZfoXfpMghhbzGz3ptmTeiDhLbg", + "coins": "1000.000000", + "hours": 220 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 84, + "block_seq": 97 + }, + "time": 1429165260, + "txn": { + "timestamp": 1429165260, + "length": 220, + "type": 0, + "txid": "a689a3589730a351f880176b2c15b395967b38a90950e0491e7a1e5531f020a9", + "inner_hash": "d6cfcef60d17c03b68b94c4284746bc70e8ef66cb6d2bd370094a7e4b19dbaed", + "fee": 328, + "sigs": [ + "de36c5fac7db61c7a47827e1a9ad1b717d5fa904b69283598eab6003ba1b1e264856f30a6afe0881675e8f11a86e666cec09b789f3971a6ec4ba25183684a18900" + ], + "inputs": [ + { + "uxid": "fb4d5dcc1c3ac97444e96aa7da392b0d7faf7b7373504c70e497228a4695a7f1", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "27700.000000", + "hours": 129, + "calculated_hours": 436 + } + ], + "outputs": [ + { + "uxid": "4e75b4bced3404590d38ca06440c275d7fd86618a84966a0a1053fb18164e898", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26700.000000", + "hours": 54 + }, + { + "uxid": "1f9fb89f5b7c41d3df6d72b1f02c998196bc79ec20c3949693b4f5a2c1aae44f", + "dst": "2H7mA88ireMKHqP9LYWK5opnU176v7eYqrn", + "coins": "1000.000000", + "hours": 54 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 83, + "block_seq": 98 + }, + "time": 1429274566, + "txn": { + "timestamp": 1429274566, + "length": 220, + "type": 0, + "txid": "fe01250cfdf84eb0182c033c216891e7e6971cc85976c4c46d9e3c608974d233", + "inner_hash": "2400f3951d454f663d5097060267f8e31e86e1c3f10391c8a06ed79fd72fe49b", + "fee": 71088, + "sigs": [ + "6ecee1ca0e86de9bf6da9a21e49b1cfade8f1a279f7fc58834c15184bec1de634c82faf30bdab34083bc1f32f87d27daa1987a525db83100f88b9103efbc007701" + ], + "inputs": [ + { + "uxid": "f32f03f28eece9ddcdc488a85100c94a7c924c185ae560363518dae5e2aacccb", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "858050.000000", + "hours": 1829, + "calculated_hours": 94784 + } + ], + "outputs": [ + { + "uxid": "99b4e51e1afd04813656e6202c7e462d88ce87ba980da7a62591190d72d1073c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "858000.000000", + "hours": 11848 + }, + { + "uxid": "f12164a6ea6ce65ff2ca1f2be7251bece8f7c5747ba8ec68e1ec3b27d45d7b9c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 11848 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 82, + "block_seq": 99 + }, + "time": 1429274616, + "txn": { + "timestamp": 1429274616, + "length": 571, + "type": 0, + "txid": "819106dc50373e5293a7e79f179693e85536e8206d82272930ec08410d92402a", + "inner_hash": "02e9a06b0ca7f91255107993e00f09e9ef983559088c5febff264c17952033c4", + "fee": 52573, + "sigs": [ + "efb713e6a1e5d328e94a51fbeb0f73e2a3b7a54e15db75797f0b709f698b16eb26e522f187a98144807e0e6cd294686ff19037975abb6d44b20b2899968954f400", + "b5d011c60020ce591a21db15823c06188515a63ca95d573c36b3af83d634fc6f1c1125db197f6283510ee33890ac168513254ad37524c77294bb5a12e8ff23f300", + "00d87b91eda33f627f6cd28cc673daf929fbec36e7bcfdf894f7491618a68b5755b5baadedc106d53d2da924fcbedbd106eadc50ec611d426720f67426c7286500", + "e64cf7e74363cfd381a3aa6fd17d7c415d6034b26b93017acaf9cf3475ccdffc53c3714d1d13409323cf77ccc81596f6e6edcec11d890979a436ef960bcb5f6900", + "fc2eb05241afdd15cdbd28cc7158d7eb4442f21a678c52332762b23ac6c2fcc76b0f79731987df0ba84d82044cd474d4cda9afda778a21b78a0659c5b588664301" + ], + "inputs": [ + { + "uxid": "2987e7c89d353ad5d63cea2bf2724dc5f7a5ef5fb81f5ea160a307f0726ac2f5", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 701 + }, + { + "uxid": "a52408daa8ce7026c70b61d4df4212fb577462060f340bfce779225b3e18193d", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 50058, + "calculated_hours": 50605 + }, + { + "uxid": "dc73aac74348dd285a1456c1fae2204d7c2039d50a765bdaae0c31f7c7e059db", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 6257, + "calculated_hours": 6804 + }, + { + "uxid": "e4e375b9dc55ff53d6de9120f1a87ff00e00a779835f8320f2c6b3090d0466e6", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 782, + "calculated_hours": 1329 + }, + { + "uxid": "d11b05345917d171f60c31bd2634041b73b97eae364724369ddb8d53369397fb", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 97, + "calculated_hours": 644 + } + ], + "outputs": [ + { + "uxid": "427462efeb07a6803f013c789ea43d93240f74f886bf9afd63dc1936a7574a37", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 7510 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 81, + "block_seq": 100 + }, + "time": 1429274636, + "txn": { + "timestamp": 1429274636, + "length": 183, + "type": 0, + "txid": "9f20b52befed2cbaaa4a066de7119b7fdbff09a83d8e2a82628671f51f3f6551", + "inner_hash": "c2e60dbb6ad5095985d21391cbeb679fd0787c4a20471340d63f8de437d915df", + "fee": 613712, + "sigs": [ + "2fefd2da9d3b4af87c4157f87da0b1bf82e3d6c9f6427572bd768cf85900d15d36971ffa17eb3b486f7692584102a7a58d9fb3ef57fa24d9a4ab02eba811ef4f00" + ], + "inputs": [ + { + "uxid": "aee4af7e06c24bccc2f87b16d0708bfea68ac1b420f97914965f4a23ad9e11d6", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23000.000000", + "hours": 294, + "calculated_hours": 701385 + } + ], + "outputs": [ + { + "uxid": "194cc596d2beda803d8142ddc455872082f84b09a5edd8085082b60d314c1e29", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23000.000000", + "hours": 87673 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 80, + "block_seq": 101 + }, + "time": 1429274666, + "txn": { + "timestamp": 1429274666, + "length": 183, + "type": 0, + "txid": "e8fe5290afba3933389fd5860dca2cbcc81821028be9c65d0bb7cf4e8d2c4c18", + "inner_hash": "45da31b68748eafdb08ef8bf1ebd1c07c0f14fcb0d66759d6cf4642adc956d06", + "fee": 720335, + "sigs": [ + "09bce2c888ceceeb19999005cceb1efdee254cacb60edee118b51ffd740ff6503a8f9cbd60a16c7581bfd64f7529b649d0ecc8adbe913686da97fe8c6543189001" + ], + "inputs": [ + { + "uxid": "6002f3afc7054c0e1161bcf2b4c1d4d1009440751bc1fe806e0eae33291399f4", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "27000.000000", + "hours": 220, + "calculated_hours": 823240 + } + ], + "outputs": [ + { + "uxid": "f9bffdcbe252acb1c3a8a1e8c99829342ba1963860d5692eebaeb9bcfbcaf274", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "27000.000000", + "hours": 102905 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 79, + "block_seq": 102 + }, + "time": 1429274686, + "txn": { + "timestamp": 1429274686, + "length": 183, + "type": 0, + "txid": "7b13cab45b52dd2df291ec97cf000bf6ea1b647d6fdf0261a7527578d8b71b9d", + "inner_hash": "73bfee3a7c8d4f8a68657ebcaf69a59639f762bfc1a6f4468f3ca4724bc5b9f8", + "fee": 710046, + "sigs": [ + "c4bcada17604a4a62baf50f929655027f2913639c27b773871f2135b72553c1959737e39d50e8349ffa5a7679de845aa6370999dbaaff4c7f9fd01260818683901" + ], + "inputs": [ + { + "uxid": "4e75b4bced3404590d38ca06440c275d7fd86618a84966a0a1053fb18164e898", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26700.000000", + "hours": 54, + "calculated_hours": 811481 + } + ], + "outputs": [ + { + "uxid": "0a5603a1a5aeda575aa498cdaec5a4c893a28669dba84163eba2e90db3d9f39d", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26700.000000", + "hours": 101435 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 78, + "block_seq": 103 + }, + "time": 1429278106, + "txn": { + "timestamp": 1429278106, + "length": 220, + "type": 0, + "txid": "9150311508851ca989efb5f82b5a7201724514b6b9f84ec1620c18673462126b", + "inner_hash": "83e206eb05ce5708efd174bb9df2c0bc0741c1775e50d139aebf37ed6c46381d", + "fee": 76077, + "sigs": [ + "a6206409a077ec30fe7f0b0ad5162805dffbff743afbc9e8e926d72ae38d15f80ab8183150caa4d745125c1c6e733428e299742d10e07a64ba5bd21d4e5ee06f00" + ], + "inputs": [ + { + "uxid": "0a5603a1a5aeda575aa498cdaec5a4c893a28669dba84163eba2e90db3d9f39d", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26700.000000", + "hours": 101435, + "calculated_hours": 101435 + } + ], + "outputs": [ + { + "uxid": "1e30e9dfe00e055404063e52a4154a72492b13de6acf4871ec5ea6d7c0fcc968", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26600.000000", + "hours": 12679 + }, + { + "uxid": "435c7095e2531b88feb76f32fc34fac3406882cdf71e17fecdba196aa5bc059a", + "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "100.000000", + "hours": 12679 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 77, + "block_seq": 104 + }, + "time": 1429278406, + "txn": { + "timestamp": 1429278406, + "length": 220, + "type": 0, + "txid": "44d56cfa9f83d874ee10fb32f0d40458f6bf3e86528592c9a9abf3c960fcb278", + "inner_hash": "4a9c25a15fe166d87b3fb6474360b39aa52703b70b961212f9494393a3c71c80", + "fee": 82382, + "sigs": [ + "0c8c4e941af19993051d5e7d0aba7414e066d15dcee9bd3eb1f7fab3259fe0345dff7ed1fa68eb243883a3793f3febc7b7eeb7a619601ec9248ec5c063707e2b01" + ], + "inputs": [ + { + "uxid": "194cc596d2beda803d8142ddc455872082f84b09a5edd8085082b60d314c1e29", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23000.000000", + "hours": 87673, + "calculated_hours": 109842 + } + ], + "outputs": [ + { + "uxid": "aa1133a42417332af8b58e71cc14a651e2731563eaea35f0feacc1e97fac6eef", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22900.000000", + "hours": 13730 + }, + { + "uxid": "52088c63431b6109537bce1e582775f319c9833990c94cc2e8e0dbb8b48b9c27", + "dst": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", + "coins": "100.000000", + "hours": 13730 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 76, + "block_seq": 105 + }, + "time": 1429278556, + "txn": { + "timestamp": 1429278556, + "length": 220, + "type": 0, + "txid": "41ec724bd40c852096379d1ae57d3f27606877fa95ac9c082fbf63900e6c5cb5", + "inner_hash": "614d7754fa0633e1a701eea3b3a2ce1c2815360f311cd1cb6cf46d5ae94304ba", + "fee": 11173, + "sigs": [ + "bd20e6b6754308d192ba734a573ec4363dae5326b9b21a7203904c076b067bf9313df1df8ac8960f12d9d8b642deb411a504512990181bc2e53264cf661b868f00" + ], + "inputs": [ + { + "uxid": "1e30e9dfe00e055404063e52a4154a72492b13de6acf4871ec5ea6d7c0fcc968", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26600.000000", + "hours": 12679, + "calculated_hours": 14895 + } + ], + "outputs": [ + { + "uxid": "2426f768e00345b641f5b4b4b058c308d528e22437bc6e552f0a9d5bd665e14a", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26500.000000", + "hours": 1861 + }, + { + "uxid": "8f4435cc1cb45453f1ee8e836a74bdec313a6d3aa1879be24e2ba261d474bf36", + "dst": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", + "coins": "100.000000", + "hours": 1861 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 75, + "block_seq": 106 + }, + "time": 1429279796, + "txn": { + "timestamp": 1429279796, + "length": 511, + "type": 0, + "txid": "8de17dff34a8798f2ac89584f5c559e3bb82c280a3f6890386b4dbc5fef0e8cf", + "inner_hash": "2ab03a15a9f312d27919ec42a27dfefc5fc5e0b8bf451eb81ef545bf4497f524", + "fee": 835759, + "sigs": [ + "9dd44c7d76d454c7c658649d94e08f75354ba568aae069b38da012f07eacbcfe2a5bbe9b4444f566336c23a03f3625eb4306791437e1bfe69f43efa0c109ec2d01", + "211d2607cef832c989563a3475daf6aa1fec6d73893a72666b5428c6bd93217605990bc3b45f4cf4863a648708ca3bf3526eb1644679f313a297daf82b1865bf01", + "f7e77964485e36b15ade78aacc17407af265c7144767e3f39bfd9765869f90cd0f33120ca996154db82d5462d626f3ae299c8f3b8cc862284432919cfeb6613d01", + "3a1e491d35ad5daa1af54872b5ec1d02c6654cad8f2bcd94c2a624c1a3cd5c9163c373f06a931b5de526654bdbc5cdd221b7fcf7b77329d452562080216ca8fe00" + ], + "inputs": [ + { + "uxid": "99b4e51e1afd04813656e6202c7e462d88ce87ba980da7a62591190d72d1073c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "858000.000000", + "hours": 11848, + "calculated_hours": 962798 + }, + { + "uxid": "f12164a6ea6ce65ff2ca1f2be7251bece8f7c5747ba8ec68e1ec3b27d45d7b9c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 11848, + "calculated_hours": 11903 + }, + { + "uxid": "427462efeb07a6803f013c789ea43d93240f74f886bf9afd63dc1936a7574a37", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 7510, + "calculated_hours": 7564 + }, + { + "uxid": "f9bffdcbe252acb1c3a8a1e8c99829342ba1963860d5692eebaeb9bcfbcaf274", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "27000.000000", + "hours": 102905, + "calculated_hours": 132080 + } + ], + "outputs": [ + { + "uxid": "dfd2834342f3a7caf183472c17801aafacd1775378eb843509d17ad858456cb0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "885000.000000", + "hours": 139293 + }, + { + "uxid": "3bfbe4e80894862d60a053ffb47b8f1749e281603cd6376c8fc6b5e2cec0c843", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "100.000000", + "hours": 139293 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 74, + "block_seq": 107 + }, + "time": 1429280596, + "txn": { + "timestamp": 1429280596, + "length": 220, + "type": 0, + "txid": "6546dfbe6e61e81f3e9f6c9afdfee1c07758f2e486d731ae4d19b40602367656", + "inner_hash": "9566ef1826b7f518c043395c2b7a37014f77f8e23796c1c78e55d1fc443a02da", + "fee": 104471, + "sigs": [ + "2773830af5e34a3de4a3ce935ee08c189feaa30ab41ced8f78f9a6434198d9775c58a0b9bcc2931f3d0dfde541ef7f5d3c1cfcf5415776dbd9d871ce036ec42900" + ], + "inputs": [ + { + "uxid": "dfd2834342f3a7caf183472c17801aafacd1775378eb843509d17ad858456cb0", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "885000.000000", + "hours": 139293, + "calculated_hours": 139293 + } + ], + "outputs": [ + { + "uxid": "8ac39d41ec014ca6625e5f17e1fbe62db7a4ac154e0e42a017efa037935ae968", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "884900.000000", + "hours": 17411 + }, + { + "uxid": "ec4b791f2fa22a986d6035e34f5025c3da0398cb2acc59a54d495d4eaacdee8a", + "dst": "2acnXsnJ2k8jxiUahtBe8h4xouPAnpbwwjc", + "coins": "100.000000", + "hours": 17411 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 73, + "block_seq": 108 + }, + "time": 1429280756, + "txn": { + "timestamp": 1429280756, + "length": 220, + "type": 0, + "txid": "a8d6420d4f64fad1b698bd77cae5a92aa125f806fb184389edcc278e5cb460fa", + "inner_hash": "6daf17a44251b984449effe21e605ab556ef565940043cff6cc75cb042028783", + "fee": 20746, + "sigs": [ + "dd67813bd08a88b24f695ac10d4390598b25cf19e4edad19091f3b723c4780653a62639153b9bbb53331b66b46dc8c84e719178a96bcd001eb7f2e147268bb2e00" + ], + "inputs": [ + { + "uxid": "aa1133a42417332af8b58e71cc14a651e2731563eaea35f0feacc1e97fac6eef", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22900.000000", + "hours": 13730, + "calculated_hours": 27660 + } + ], + "outputs": [ + { + "uxid": "4326c936322df6d59b3b539ea340eb9630c7f8484eba2aeba1a0ed4d431ab614", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22800.000000", + "hours": 3457 + }, + { + "uxid": "9404837ee44bc6aaa8c1ad963c8fa7a050e497f89f941fdc7248930ed4e0d5a6", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "100.000000", + "hours": 3457 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 72, + "block_seq": 109 + }, + "time": 1429302756, + "txn": { + "timestamp": 1429302756, + "length": 220, + "type": 0, + "txid": "a4c15ae4743246709ec335d33c289576c8893e71f5c3dcee1db6e43eec9242ee", + "inner_hash": "1d2404a84798154867ab461179a2b4300d65e4886cbb0220f0d5d0b16bbb7628", + "fee": 42555, + "sigs": [ + "3fcfe6d7fe59b9998ac4260c3b788384b2ebb7137e08e3ffc8d8b6efa23490e71f94f381c61af4966ba6a4fb4173079d5a7f31518030900f6c10d64ceb0b774f00" + ], + "inputs": [ + { + "uxid": "8ac39d41ec014ca6625e5f17e1fbe62db7a4ac154e0e42a017efa037935ae968", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "884900.000000", + "hours": 17411, + "calculated_hours": 56739 + } + ], + "outputs": [ + { + "uxid": "bae0e928b795e2a80c88161afcbc102dcad6644386f6f44050dde8d586750140", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "881900.000000", + "hours": 7092 + }, + { + "uxid": "4ca22a0fa2acbd0c9e90c4ae83496d05e122deb1a17c670e9c785479d115e824", + "dst": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", + "coins": "3000.000000", + "hours": 7092 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 71, + "block_seq": 110 + }, + "time": 1429326351, + "txn": { + "timestamp": 1429326351, + "length": 220, + "type": 0, + "txid": "552a4b194478325ee9f3e4a8648d94bc8eb26432be6fecc881bf71ff9ca15356", + "inner_hash": "bcc319504908b93f4418244049157875514fed19ce76977435d00b7ab712254a", + "fee": 107094, + "sigs": [ + "41b8178ba19326c7f61b5327846c8057bef05c47f2068ff3eaef80bb26bde18642d444647f8c623ca8a3abb040f3527c28737534bc2d1b8c5d53bf71f4c1628c00" + ], + "inputs": [ + { + "uxid": "4326c936322df6d59b3b539ea340eb9630c7f8484eba2aeba1a0ed4d431ab614", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22800.000000", + "hours": 3457, + "calculated_hours": 142790 + } + ], + "outputs": [ + { + "uxid": "f9bf35f993452b3d490668bb579fd272da969a1bcca8de0c25000ee57b5d7f54", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22700.000000", + "hours": 17848 + }, + { + "uxid": "a7dc3318a975546b7662f0a867c60a4d7e9b4d1d89ab87be8c78b09ffe8852ff", + "dst": "aPF9pL9sVEiyEVhynp3s1dmqLetP1BJrW6", + "coins": "100.000000", + "hours": 17848 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 70, + "block_seq": 111 + }, + "time": 1429348072, + "txn": { + "timestamp": 1429348072, + "length": 220, + "type": 0, + "txid": "6ce27da2ddbc15f03330960b4201dbb3a066ad2e9bbd5366a9564f6befdcae2e", + "inner_hash": "2db237d697bd17aab9121cdfc4d72fa1cbfe7fd37d7f71b1a857833bb56b7dd7", + "fee": 13386, + "sigs": [ + "c50715bd2e53ed971b7559ccaf8a930dae335dc45cad18a25ccfea3209ea2c971e0dc6cc57ff1dbcde49ddfdc612e71e923adcd21b68eaa0eb239bc83a50ff2b01" + ], + "inputs": [ + { + "uxid": "f9bf35f993452b3d490668bb579fd272da969a1bcca8de0c25000ee57b5d7f54", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22700.000000", + "hours": 17848, + "calculated_hours": 17848 + } + ], + "outputs": [ + { + "uxid": "c5df36ce47f6f183475317ab1c53eaa65428c142cb3e3906bf162d80519a203f", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "12700.000000", + "hours": 2231 + }, + { + "uxid": "94889dbe1c20eb942b7932c5301737537ac33abd9c81d72e1642ddc70ce320e0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10000.000000", + "hours": 2231 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 69, + "block_seq": 112 + }, + "time": 1429348102, + "txn": { + "timestamp": 1429348102, + "length": 317, + "type": 0, + "txid": "f8a24a25a8e3b206db7ea8a0bd8eeb0f8087f50d230c81a538316bcc5152da3d", + "inner_hash": "cfca9a1aa2ab7ea4d643700ac89e9544f1d4e9ef85e28d1cedeece11469fb885", + "fee": 8332864, + "sigs": [ + "5b68d315f4e84cdae4936db6bb7c8466977e784851b605d1fbc1e0bb65fe259d58d6be37228c96bccb1a1c1e9d316d9102fcfaefeda614e67af20464bc877f2101", + "fdd919590553d428d9b8121644127651c68b5207af9798aaaa6ed18134c5835b5311bb547e07e47157a4fd89867c88a48700255610efd2a3e3f77dc82f5fb3ba01" + ], + "inputs": [ + { + "uxid": "bae0e928b795e2a80c88161afcbc102dcad6644386f6f44050dde8d586750140", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "881900.000000", + "hours": 7092, + "calculated_hours": 11108253 + }, + { + "uxid": "94889dbe1c20eb942b7932c5301737537ac33abd9c81d72e1642ddc70ce320e0", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10000.000000", + "hours": 2231, + "calculated_hours": 2231 + } + ], + "outputs": [ + { + "uxid": "1d4595b9fa1c6c3d64f48b6ae5f8f861b1c08a022cbcb04b279df448da3db660", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873900.000000", + "hours": 1388810 + }, + { + "uxid": "53b376413d550663ab51b229df8b0f55e4055d6577c2d8b5cec8ff748fe0e958", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "18000.000000", + "hours": 1388810 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 68, + "block_seq": 113 + }, + "time": 1429348172, + "txn": { + "timestamp": 1429348172, + "length": 220, + "type": 0, + "txid": "1f27afc41896d2c7fdbd2620e606440ad12557e9a4bdd6808dcc2c23d4e32978", + "inner_hash": "4d53c05c731409feef7606cf9514904f4c7704537efb453ac2c439fcfe77a455", + "fee": 1041608, + "sigs": [ + "e36cef84c1c6f999dba462f3134131c105da2255eaf21550ce30ee52a14a33d529a7cd0c37b3883d0d57429b163b4905271c7b1a4d951b4a521f245c7857dd5c01" + ], + "inputs": [ + { + "uxid": "1d4595b9fa1c6c3d64f48b6ae5f8f861b1c08a022cbcb04b279df448da3db660", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873900.000000", + "hours": 1388810, + "calculated_hours": 1388810 + } + ], + "outputs": [ + { + "uxid": "412eff3eef889c682da8db3608fce37d1c5ee2cc297bc88d901648e6ccd418f9", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873800.000000", + "hours": 173601 + }, + { + "uxid": "c961ba554ae30b0edcdf71e834ab2b26d7dff5bcf5955d4874cdba89170392bf", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "100.000000", + "hours": 173601 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 67, + "block_seq": 114 + }, + "time": 1429348502, + "txn": { + "timestamp": 1429348502, + "length": 220, + "type": 0, + "txid": "e8765b4e6fbca87144df59a6f66815b175e81999509504b117636edc34cbe2af", + "inner_hash": "b62f9938b195211810976e1719b152fe6c381879adba6061f4ca36d74c06bea2", + "fee": 130201, + "sigs": [ + "9d40ed257bb7586c7d72e90bd99c6883fb836d400107686ba477850c2b63a86b5ad885aa37f352d334d930ea3814844e67a6ac438c36b919daff273a66f21e5201" + ], + "inputs": [ + { + "uxid": "412eff3eef889c682da8db3608fce37d1c5ee2cc297bc88d901648e6ccd418f9", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873800.000000", + "hours": 173601, + "calculated_hours": 173601 + } + ], + "outputs": [ + { + "uxid": "6ad7993fb2728c2c53ac2c8395a6c62d03c5ef9298ca467e7998fb64fd0c90b4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873700.000000", + "hours": 21700 + }, + { + "uxid": "5b0801ec545b132eeafa61bee8f645df7e1e358321ef830a4247fe541c211139", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "100.000000", + "hours": 21700 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 66, + "block_seq": 115 + }, + "time": 1429348712, + "txn": { + "timestamp": 1429348712, + "length": 220, + "type": 0, + "txid": "bb700553c3e1a32346912ab311fa38793d929f311daeee0b167fa81c1369717e", + "inner_hash": "253c14d68558b09c034d4945284f5cc3025b9e05723c6e4fa7d95f1e68edb211", + "fee": 16276, + "sigs": [ + "4920f49d47105801fab73c2398bee61ce56bb0b58dd69ab35ec1f959a3b8a8003c2821510d3a97d09f7a4a9f943b04d888b1327539ff48216f148fca693dde5d01" + ], + "inputs": [ + { + "uxid": "6ad7993fb2728c2c53ac2c8395a6c62d03c5ef9298ca467e7998fb64fd0c90b4", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873700.000000", + "hours": 21700, + "calculated_hours": 21700 + } + ], + "outputs": [ + { + "uxid": "0976005ab4540e8211cd929f19634bfaa2f5d8e24177ddb5b803b447ea91f8c3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873600.000000", + "hours": 2712 + }, + { + "uxid": "de995d2361e810cfba1b9b1141413367a722f51c7555b1685f6e68129dfb2679", + "dst": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", + "coins": "100.000000", + "hours": 2712 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 65, + "block_seq": 116 + }, + "time": 1429349392, + "txn": { + "timestamp": 1429349392, + "length": 220, + "type": 0, + "txid": "491130fc9f69d101df220116356e82e2ff21dac1167e6da81c95dd4cc417b3d9", + "inner_hash": "d78596837a36ece9a8bc3a8eed424612651039f4f229969c42ec3d7fd1aceff2", + "fee": 388717, + "sigs": [ + "e22e89ecb303d5eee59eca8a75e0d5b4fdfa3a256576d7ac91264b4c3bf882ce7186572ab68fd1ad4dc837039ef4d7063ead72365506aed71cfe4de0b0449b4900" + ], + "inputs": [ + { + "uxid": "2426f768e00345b641f5b4b4b058c308d528e22437bc6e552f0a9d5bd665e14a", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26500.000000", + "hours": 1861, + "calculated_hours": 518287 + } + ], + "outputs": [ + { + "uxid": "6c34016037cd17622846e71bc635914d4d8f256c147aa5a0b84a896e83229480", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26400.000000", + "hours": 64785 + }, + { + "uxid": "ab12f4eadaf956be371ff8f239956e33d1cd2fd4b497ca04c9501baf6f241618", + "dst": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", + "coins": "100.000000", + "hours": 64785 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 64, + "block_seq": 117 + }, + "time": 1429351912, + "txn": { + "timestamp": 1429351912, + "length": 220, + "type": 0, + "txid": "345488861ad3f0d93024c367990e64ef0f7a95bd8b8589f554172f9439808263", + "inner_hash": "258acd45e194051214c9783184c2a9157558e595c4e4da814258f0ffd0e9dd64", + "fee": 125795, + "sigs": [ + "9f44be793a0cb218b6836dfa52e5b8c38fe2b1257d27fcea49f4c6a6ed910f446e8a96a987fc06c6b6ae13ea8ea0290e91ea40b6f8eeaf8054e8efd17306573201" + ], + "inputs": [ + { + "uxid": "0976005ab4540e8211cd929f19634bfaa2f5d8e24177ddb5b803b447ea91f8c3", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873600.000000", + "hours": 2712, + "calculated_hours": 167725 + } + ], + "outputs": [ + { + "uxid": "6beca9fb58a327580c614d7fb5622916849756790b661bcabc880666364fdf47", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863600.000000", + "hours": 20965 + }, + { + "uxid": "2010952c33c83599fa14bfa5982d59865f2a362c97270dacb4c180a485ee5096", + "dst": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", + "coins": "10000.000000", + "hours": 20965 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 63, + "block_seq": 118 + }, + "time": 1429364072, + "txn": { + "timestamp": 1429364072, + "length": 317, + "type": 0, + "txid": "a83e09e976b038d86491d8c029aec84a6313dc33e692da6ce50a2858e50c4666", + "inner_hash": "86b47008bbeb60335762ba70b5bdf8128f09b3f8fff6ec6e5d9553763a5b5cef", + "fee": 184620, + "sigs": [ + "48312c1abe5617609f70a882689f194e8d18c0b56d153adfae4be08bf00d723c6cda6dbd885e7ed7f92c7b7065d583adfd5f18bb37da9b796a394f4a388e978d01", + "4826477aed0387ca448b8225a5d27ebe6824b460d0581fb8ccb5078a865cd8171e7f5c860091a99cc85b1571dce8a550659cb3d02902a77cd1f6d0d27277bdee01" + ], + "inputs": [ + { + "uxid": "7b132c07322babefa83ab64971b7bfb29bf2cb9ffe9c42dc7e2975a185dcd8b8", + "owner": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "995.000000", + "hours": 387, + "calculated_hours": 72454 + }, + { + "uxid": "c961ba554ae30b0edcdf71e834ab2b26d7dff5bcf5955d4874cdba89170392bf", + "owner": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "100.000000", + "hours": 173601, + "calculated_hours": 173704 + } + ], + "outputs": [ + { + "uxid": "3408638af298419b14a49e8e9dd69e97c9a06827d74edf9f410a870662360b31", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1045.000000", + "hours": 30769 + }, + { + "uxid": "ba0a94662846565969d361b1b7c248847a48e69f2b9eefb4ffb0bc2efc56a8fd", + "dst": "38cVLswijqC2ANV5HxTroeapQzqeoBR88C", + "coins": "50.000000", + "hours": 30769 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 62, + "block_seq": 119 + }, + "time": 1429364282, + "txn": { + "timestamp": 1429364282, + "length": 220, + "type": 0, + "txid": "4d080ff1f8ac21d8c09a2dca99d28ae88e9441d7a4757dca68469ad64838cb55", + "inner_hash": "bd2066b342e0af8c4bfecd15d3a87f168cac47d1f900642b69b23fbf18bfed05", + "fee": 23077, + "sigs": [ + "ea1adfe309f30a15691fc3e267b19d7b765983694245adbebd92924db1adb67668d4dc8a6467e54323d245a35c0ed822593e10de2fd6c4674d3040b53099a6aa01" + ], + "inputs": [ + { + "uxid": "ba0a94662846565969d361b1b7c248847a48e69f2b9eefb4ffb0bc2efc56a8fd", + "owner": "38cVLswijqC2ANV5HxTroeapQzqeoBR88C", + "coins": "50.000000", + "hours": 30769, + "calculated_hours": 30769 + } + ], + "outputs": [ + { + "uxid": "cbe8b620c1468dbb1e69e6da63831bde5828db313879a36f783a1f16f2b86541", + "dst": "38cVLswijqC2ANV5HxTroeapQzqeoBR88C", + "coins": "12.000000", + "hours": 3846 + }, + { + "uxid": "f480c6097568036b90a2e019f9ee68c0812b2da8828be33a005a7427caf14a2b", + "dst": "f38daJDg8rpwL5xWgMY78fBHncQ1N5gQZ7", + "coins": "38.000000", + "hours": 3846 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 61, + "block_seq": 120 + }, + "time": 1429364452, + "txn": { + "timestamp": 1429364452, + "length": 183, + "type": 0, + "txid": "d1569ca879f98450a920a2b427ab0e1d21342308fb6b4ea5031ee6e718217183", + "inner_hash": "12d27fdba804c648b8f72d9740d4021b05c88c95d3595af4afab2150092c5eee", + "fee": 3366, + "sigs": [ + "2baa243ca1b82bd9fc1a31a0b53c9f7eb0ad62b19d6a4d3af62579cc2dc455d81d8ed82ba342dc650d4ae38718d81a8df6a93a9a809749a2f5391894bbaf298400" + ], + "inputs": [ + { + "uxid": "f480c6097568036b90a2e019f9ee68c0812b2da8828be33a005a7427caf14a2b", + "owner": "f38daJDg8rpwL5xWgMY78fBHncQ1N5gQZ7", + "coins": "38.000000", + "hours": 3846, + "calculated_hours": 3846 + } + ], + "outputs": [ + { + "uxid": "3f9712cab0d3aeb217f1751fa19e53d75f814b4218866d4e70d63f32271d2023", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "38.000000", + "hours": 480 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 60, + "block_seq": 121 + }, + "time": 1429382678, + "txn": { + "timestamp": 1429382678, + "length": 220, + "type": 0, + "txid": "da82deafc15c36e7dc9cd95663e0dc910ae626ee543147ac7bd8682be00f7baf", + "inner_hash": "c98f858a27e76b0b565baaa3dffc6cfc7b0ffe9dd7d2d71f4bb0ad4d1c439ca2", + "fee": 2271879, + "sigs": [ + "15fccdc36c966a9571196a3f727ebda47162441df2d9965ac27109ac56d22cb41638b404e84b5b388d809b814ade18022cba0a6e021140c6b7d0144a6facd6d501" + ], + "inputs": [ + { + "uxid": "6beca9fb58a327580c614d7fb5622916849756790b661bcabc880666364fdf47", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863600.000000", + "hours": 20965, + "calculated_hours": 3029171 + } + ], + "outputs": [ + { + "uxid": "f8a1990492f970227ec29e6e095fa724d66fa2d6883bd8723773098d08ca8b3c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "801600.000000", + "hours": 378646 + }, + { + "uxid": "e5596ef0ba04ad9e0adbe0355a24c6bef249654906f917b68f8f0cf072508674", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "62000.000000", + "hours": 378646 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 59, + "block_seq": 122 + }, + "time": 1429382898, + "txn": { + "timestamp": 1429382898, + "length": 220, + "type": 0, + "txid": "211f5fc97ba1797d78f84d4e4db78415b5ff4121f78369535fe3f8015571c6df", + "inner_hash": "586a8297d8d148f79d8529fbc3e356f5de9570a3c34bc1ba8494b8269b03d0f2", + "fee": 283986, + "sigs": [ + "cccee00def7817ec1b36ba5b02066f82eae188afc3e05e61524c62d19fe095e0363db085da6591841314da5f836f2f0068eae522e3d3937d2f96de99f924af6a01" + ], + "inputs": [ + { + "uxid": "f8a1990492f970227ec29e6e095fa724d66fa2d6883bd8723773098d08ca8b3c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "801600.000000", + "hours": 378646, + "calculated_hours": 378646 + } + ], + "outputs": [ + { + "uxid": "998487775c0e58420673b70204b83c1d6bb5b70e34b1aa0f8169c85ecec2438e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "765600.000000", + "hours": 47330 + }, + { + "uxid": "1e0cf4e3ed49b52944f533a212e6412291e369ac3e7a8c4440424f475f2983b3", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "36000.000000", + "hours": 47330 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 58, + "block_seq": 123 + }, + "time": 1429451746, + "txn": { + "timestamp": 1429451746, + "length": 220, + "type": 0, + "txid": "9003d3caba9587d46d000cc614bb52bed34adcc5ea404c560c986eb6dd756e6b", + "inner_hash": "2a87bcb0049b9971713a2e46b75b348785adca751b151290a411bfa5a0ed2287", + "fee": 35498, + "sigs": [ + "0da91c351fb050c243c7b587005bee14ccc2951897ffdf720ad9c757c5946e516a20ca0d92c5f84957161d10a74deab05a2b530ab5bbcd7ad01266213b5eb38401" + ], + "inputs": [ + { + "uxid": "998487775c0e58420673b70204b83c1d6bb5b70e34b1aa0f8169c85ecec2438e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "765600.000000", + "hours": 47330, + "calculated_hours": 47330 + } + ], + "outputs": [ + { + "uxid": "6fb116c110fe391448a1dcb985b67439c2e9a71d8bb2fd1cf345ac73ada6166a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "755600.000000", + "hours": 5916 + }, + { + "uxid": "8e764a87cee9f26b902f748c28a5a49de5c383e5f155129eec84474a3d0349cc", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10000.000000", + "hours": 5916 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 57, + "block_seq": 124 + }, + "time": 1429522086, + "txn": { + "timestamp": 1429522086, + "length": 220, + "type": 0, + "txid": "e9a6dd585b564b19c55d9f56188a45bfad32fa75703fa6336830035f6fa92e3d", + "inner_hash": "9cdad9a848f5b2993d1e5d0593e952b39ccdf7ae56bd13851449797cccdced5f", + "fee": 4438, + "sigs": [ + "1f3d02abe6811c83b4f4b2e270366e8d4c591866b6e984cb8bdea5d80ca1edbb04d651449070bbca22a8c7cfb3d23a6f85c0a5a7e3226e2d0520330faf16291401" + ], + "inputs": [ + { + "uxid": "6fb116c110fe391448a1dcb985b67439c2e9a71d8bb2fd1cf345ac73ada6166a", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "755600.000000", + "hours": 5916, + "calculated_hours": 5916 + } + ], + "outputs": [ + { + "uxid": "04471fb0797bb931e883f7b95cfff6ee4fea5e19a352ca5425fcd353c4f6aba4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "750600.000000", + "hours": 739 + }, + { + "uxid": "a4fdfce34725eb63941ac576651fa406272565a344ffb21435d285111efbc4db", + "dst": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", + "coins": "5000.000000", + "hours": 739 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 56, + "block_seq": 125 + }, + "time": 1429578056, + "txn": { + "timestamp": 1429578056, + "length": 220, + "type": 0, + "txid": "1ca0a2d44b6439b91eb839e0f99405abdcafe2c1a49c8b49b1739498129bd1a6", + "inner_hash": "1090d10a5a2210dc205d6f8447918670f9351feed057c76423629b4699777dcb", + "fee": 555, + "sigs": [ + "39817412c5edb4cd928aa3b79a022d4b3276af74eb377d3821c1e95e4d6c6acd61ebbf5eb5d32f87686b6cb4f09c2660e1f148192873208fc963d67a6945fe0101" + ], + "inputs": [ + { + "uxid": "04471fb0797bb931e883f7b95cfff6ee4fea5e19a352ca5425fcd353c4f6aba4", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "750600.000000", + "hours": 739, + "calculated_hours": 739 + } + ], + "outputs": [ + { + "uxid": "6b616ad99a946538c3ab101f245bcab211ab39507848425e80cbfc8ec5bdbc67", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "738100.000000", + "hours": 92 + }, + { + "uxid": "a08089cd67896683d5dcb2d50256354e0d086b9854eb22bb6022cc459d447211", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "12500.000000", + "hours": 92 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 55, + "block_seq": 126 + }, + "time": 1429680646, + "txn": { + "timestamp": 1429680646, + "length": 317, + "type": 0, + "txid": "a67ed00f815a2fd20d0efd18ac04663f0ee3d5621fbfdcdc6af250f19e3cfc53", + "inner_hash": "3587ee0a091f047bce0dc6f3a45ba08a0c95db33790c53185f6dfd626040b306", + "fee": 103861, + "sigs": [ + "7753de16df3b46c78529de293ed45ab7d566f3a2fdeeff381aa8bc903111e62c117ce54623e582dceab853fd4d9431e05bd003ae0f470db915e555d3d6dea80500", + "414a1f765e1f437799d095f76a3e0ce23ab9ebe150be93e4f3d0abd72eb403ed32ddb15d36956fc9142cd4b5875d5769803e197bab3ecf91f6b72e75087f40b000" + ], + "inputs": [ + { + "uxid": "e2512ec90800147d0d9ddbd0778511ee5a45a25efcb354c50a101738a65462c5", + "owner": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "300.000000", + "hours": 3436, + "calculated_hours": 37891 + }, + { + "uxid": "6e2abc4bc7820178358a603b7d99c4b39735dd1685d0c5a778ab63f29c9e93d9", + "owner": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "700.000000", + "hours": 20200, + "calculated_hours": 100590 + } + ], + "outputs": [ + { + "uxid": "bca6e6b24cdabecd77186a61168dd3e2290b2fda1b7a79eb3856ca4cc9f589e2", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "990.000000", + "hours": 17310 + }, + { + "uxid": "e4a83076c2ce1bd83953c1c0443054d7f5b0843c551d35b3fc3c116e9a9134d7", + "dst": "odhAMxHhXoBdx1RHNmfu7dTZ1LZivfsbiH", + "coins": "10.000000", + "hours": 17310 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 54, + "block_seq": 127 + }, + "time": 1429848410, + "txn": { + "timestamp": 1429848410, + "length": 317, + "type": 0, + "txid": "243e1baa955c3f0af42d7acc4c920437dd0a99c754d6c5c2b7defcd143ff288d", + "inner_hash": "e7e030478e5828f44ec15b734638e8c2828f015b2fa5ca2823d24af3ad111ae6", + "fee": 3170256, + "sigs": [ + "1519c5c730648e7be553b2738aaeff38266735276e640c8f8d455f33c4fc07283ae5a7da47742df118337ff0548efebb1c75d0350a4e578ff95269182779db2201", + "ee099f6f42c813d13f097e9b3a8604067d6afd3718e6eeacd88fb25050d42b8603a42c4f7d24058483f70328a24fc91cd6ef190286c4a678e28b757143e23dc701" + ], + "inputs": [ + { + "uxid": "c5df36ce47f6f183475317ab1c53eaa65428c142cb3e3906bf162d80519a203f", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "12700.000000", + "hours": 2231, + "calculated_hours": 1175478 + }, + { + "uxid": "53b376413d550663ab51b229df8b0f55e4055d6577c2d8b5cec8ff748fe0e958", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "18000.000000", + "hours": 1388810, + "calculated_hours": 3051530 + } + ], + "outputs": [ + { + "uxid": "8169bf7f8fa21dc6400b60678b302946cf2765f44893ec8466262fc69b710591", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "30600.000000", + "hours": 528376 + }, + { + "uxid": "ef488d5f4a019502115d3b6b50bd364692315c3954d7e93c3ca22e11b92fc528", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "100.000000", + "hours": 528376 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 53, + "block_seq": 128 + }, + "time": 1429849170, + "txn": { + "timestamp": 1429849170, + "length": 317, + "type": 0, + "txid": "c2c9fe882df3b44fbb125b251a7604a7a4f4195dddff6e5396b7f130744e2b27", + "inner_hash": "e23ed05dee949be1aabf237db1fd81be8d73c838eb0ee3026104807053269431", + "fee": 41968911, + "sigs": [ + "8e9b1733227a841009881663a50e1e01ac2790f16416c6f973c89e15a8fc216044e156cc8fee84d3e3cc6371e4da340f5312726bfd66f16a635542d63c869c7101", + "d1f6b7078a9032159a165ffbfb1e0665bf9ced2c3d5db795fd5bd11fc53d790f56589cbbffd117eec50aa0dc8c0e65eccb13c5ccb5d39dc9bae739a49dda03b201" + ], + "inputs": [ + { + "uxid": "6b616ad99a946538c3ab101f245bcab211ab39507848425e80cbfc8ec5bdbc67", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "738100.000000", + "hours": 92, + "calculated_hours": 55430171 + }, + { + "uxid": "ef488d5f4a019502115d3b6b50bd364692315c3954d7e93c3ca22e11b92fc528", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "100.000000", + "hours": 528376, + "calculated_hours": 528376 + } + ], + "outputs": [ + { + "uxid": "ecb92dc2f43d4c6ca124575d8456d8894f3cb137875287beaa73180fcae2b3ca", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "737200.000000", + "hours": 6994818 + }, + { + "uxid": "6143275de37a2b5ec802eeeb8d38a3dfb2db6629128e44c4f9ffc0ce8ddad629", + "dst": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", + "coins": "1000.000000", + "hours": 6994818 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 52, + "block_seq": 129 + }, + "time": 1429849180, + "txn": { + "timestamp": 1429849180, + "length": 220, + "type": 0, + "txid": "66d415598af081f8a7bd7f292468e67f380d06bf5896eb8152d4d9e8bcdf289e", + "inner_hash": "3381919a36bb294377845155efa9f6ebb9314abbe5f9904b20ece45eb0960dc6", + "fee": 401128, + "sigs": [ + "0a7f9eb68798320106f652933bd07181c80571a6f66215a5b10531f1205e0f300c702324cf9c368e67fef67dc42fbfee5bb13377c435873e549d9fd6962bad9501" + ], + "inputs": [ + { + "uxid": "8169bf7f8fa21dc6400b60678b302946cf2765f44893ec8466262fc69b710591", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "30600.000000", + "hours": 528376, + "calculated_hours": 534836 + } + ], + "outputs": [ + { + "uxid": "78126a08c4dd4ea7ca2d6c9f9d4614fa58896ec4ea301cb9b450104b00bc1b94", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "29600.000000", + "hours": 66854 + }, + { + "uxid": "169e9a77557283e0d158fe6e35c439d729d73acfd00e2969147dacbdd599817e", + "dst": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "1000.000000", + "hours": 66854 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 51, + "block_seq": 130 + }, + "time": 1430311531, + "txn": { + "timestamp": 1430311531, + "length": 220, + "type": 0, + "txid": "2df67e974b03b46be4e59fcf2f8b751d501f17f8610d5adf94551a7ecc6a58af", + "inner_hash": "be6b1ad4d9985314d2bc6434f8a49cef708e7461f047154c7283e2a4ed13aae4", + "fee": 50142, + "sigs": [ + "abbfcf7922d466e79c976809cf58932a7030db6b54465a2166168617e6acdafd3d7d62391c626e9c150155c63bee7cc887d84fb5f017298a0ce7c33859b21a4500" + ], + "inputs": [ + { + "uxid": "78126a08c4dd4ea7ca2d6c9f9d4614fa58896ec4ea301cb9b450104b00bc1b94", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "29600.000000", + "hours": 66854, + "calculated_hours": 66854 + } + ], + "outputs": [ + { + "uxid": "903a1bca9b81ed76179cbcffe6e3c8eff269c94826148286f7be0b6038ee4ccb", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "28600.000000", + "hours": 8356 + }, + { + "uxid": "37cc43693a024f9122f5e1fcabeab5d53a4d58590df30a934fc7bc545936e049", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "1000.000000", + "hours": 8356 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 50, + "block_seq": 131 + }, + "time": 1430330041, + "txn": { + "timestamp": 1430330041, + "length": 220, + "type": 0, + "txid": "6538399868cf772fcfa96e68c51aa6aa66faa95d7c685432e4005880932be134", + "inner_hash": "4854d5689f4c2b770d887ebf7f7d3fb975b295b0180d9354d69f2e322ae8b7b7", + "fee": 76257058, + "sigs": [ + "d213d50e53ceffd053571431b78fa6417abae8a7c5080dd3f8cece59dc61ad2444dd541540f5734d34dca94b3b975b613da0800121af8ec83b6f20d81cd53ffd01" + ], + "inputs": [ + { + "uxid": "ecb92dc2f43d4c6ca124575d8456d8894f3cb137875287beaa73180fcae2b3ca", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "737200.000000", + "hours": 6994818, + "calculated_hours": 101676076 + } + ], + "outputs": [ + { + "uxid": "6b4ca83b3f73b62161c90c6da03dff460ca9a5a3ccd6fafca140137416dedc58", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "736000.000000", + "hours": 12709509 + }, + { + "uxid": "e7756fa7a5c067d595f7300828bc4c70152653700844130d88174ba37237e2a3", + "dst": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1200.000000", + "hours": 12709509 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 49, + "block_seq": 132 + }, + "time": 1430330311, + "txn": { + "timestamp": 1430330311, + "length": 220, + "type": 0, + "txid": "3dfdfea4614d05c2f5eddf5773ef0afc745f1afe585141659df8e03e82897606", + "inner_hash": "3a4ac407aeec6233d3edf787d5b1f4d8257b594e9ee9d0ad3c32781053579b36", + "fee": 9532133, + "sigs": [ + "f37f3398240cee8e38c41945db72d4feda20f88a2250528fe1165533acdc7dfc0f99c7db0fc965847a100d0a2f598537cdd8c73a96c5fbb4e5e85dbfd9a4384701" + ], + "inputs": [ + { + "uxid": "6b4ca83b3f73b62161c90c6da03dff460ca9a5a3ccd6fafca140137416dedc58", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "736000.000000", + "hours": 12709509, + "calculated_hours": 12709509 + } + ], + "outputs": [ + { + "uxid": "2cd58783beb8a9f6278f7a097151531091b5f15afd7735e1facf02aa720c1191", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "735000.000000", + "hours": 1588688 + }, + { + "uxid": "333156ed20ba6937d3720af3a81939362b9f4ad1e9591bc676945ff0d202131e", + "dst": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 1588688 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 48, + "block_seq": 133 + }, + "time": 1430330421, + "txn": { + "timestamp": 1430330421, + "length": 220, + "type": 0, + "txid": "d30cec3ad3a66562d2513a3656b366ea7da583e6ba45214ac12b9c2219b4c5ea", + "inner_hash": "58e355edef48ff22e9a83952130c1bd8fe9a7f9bec7b2e0535c103c0146604c6", + "fee": 1191516, + "sigs": [ + "09baa4739816e5a86a46ecc30df8c00a5f046ad687f0674250640b6df2361dfe3723667872e0f6deb1d3447948e30b06f02b056a62da9dbaaef4db000eab747e01" + ], + "inputs": [ + { + "uxid": "2cd58783beb8a9f6278f7a097151531091b5f15afd7735e1facf02aa720c1191", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "735000.000000", + "hours": 1588688, + "calculated_hours": 1588688 + } + ], + "outputs": [ + { + "uxid": "52288a441c70260f6a3eab0e271969d54492377615a6fba8ec3ad26f11dc9768", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "734500.000000", + "hours": 198586 + }, + { + "uxid": "8b3d335360effd00cabcae13c2495f26f81743b82958629378b7bc78a7e460fe", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "500.000000", + "hours": 198586 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 47, + "block_seq": 134 + }, + "time": 1430330481, + "txn": { + "timestamp": 1430330481, + "length": 220, + "type": 0, + "txid": "44d05abc2637d9cd2047984023eb5cfa0a146e58821117de30f9c81703189cde", + "inner_hash": "44886be6952cd483b9425d314836714af65037b58923aa2432ea946131ae10f6", + "fee": 148940, + "sigs": [ + "7990cb04634a5e0de397917e56480805915c73d265fe466757a9e677067483787d457c7e9931a89daa6260c7a262f49ef1503cc88008809c193f1f949badcfbb01" + ], + "inputs": [ + { + "uxid": "52288a441c70260f6a3eab0e271969d54492377615a6fba8ec3ad26f11dc9768", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "734500.000000", + "hours": 198586, + "calculated_hours": 198586 + } + ], + "outputs": [ + { + "uxid": "e29ec214f4afd79e6465d03e4d88e552dc69654750a725d74873ee366c58e552", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "734400.000000", + "hours": 24823 + }, + { + "uxid": "d95d422fb8fe4ad9ce1052e566ec8a5ad7953ceb253366814b3d32e9a1da1f13", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "100.000000", + "hours": 24823 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46, + "block_seq": 135 + }, + "time": 1430330591, + "txn": { + "timestamp": 1430330591, + "length": 220, + "type": 0, + "txid": "072f0738f834db0030d777e6ec0e0443627c51cecffcc55e41d43b0b8edd40d1", + "inner_hash": "e87dc97ec672bb45a3417f307e6f6a1cd75b26f508f188c0554484740ffea8cd", + "fee": 18619, + "sigs": [ + "da4e898bdf324ab50d8f007ee4c65ab832ba64cf86fd0a601e7007a4c3ac2eaa6f1304a3fc8088b108e3f417e5b7c90cbc7d80c059885d397ae978da89c92d5f00" + ], + "inputs": [ + { + "uxid": "e29ec214f4afd79e6465d03e4d88e552dc69654750a725d74873ee366c58e552", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "734400.000000", + "hours": 24823, + "calculated_hours": 24823 + } + ], + "outputs": [ + { + "uxid": "8ea58a3736b35f0e3781e94198e8b73bba2536704b84b15900fb32701db8893e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "733400.000000", + "hours": 3102 + }, + { + "uxid": "617b584bb9e6b1d80daac915fb3079b22a326777d1515a40e7b7eddf427f4099", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 3102 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 45, + "block_seq": 136 + }, + "time": 1430330851, + "txn": { + "timestamp": 1430330851, + "length": 220, + "type": 0, + "txid": "b9a795552bec1a722718b44a08ad152656242b1d23afb53d2247b3016d920b7e", + "inner_hash": "8096fec4a2738f5b79df5359724f6cd7597c0d8c5bc18419f5825c5312e1dac0", + "fee": 2328, + "sigs": [ + "315cc1de04ad6d1d68e9d63027cff2abc74d5b11a376623d70211ac0e8b9feed4c7f7952634d60b57604edfbe63f02bef172486320e9790d0bb6e44099d6473500" + ], + "inputs": [ + { + "uxid": "8ea58a3736b35f0e3781e94198e8b73bba2536704b84b15900fb32701db8893e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "733400.000000", + "hours": 3102, + "calculated_hours": 3102 + } + ], + "outputs": [ + { + "uxid": "a1ed39cded6d9a0605b52f25cbedb363e57a168d1ad1d1db437816a401c061ab", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "732400.000000", + "hours": 387 + }, + { + "uxid": "e00c292e151fdafd24984b2dc08a4a328150006f95afaac9909dbffae1f07eaf", + "dst": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 387 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 44, + "block_seq": 137 + }, + "time": 1430504186, + "txn": { + "timestamp": 1430504186, + "length": 220, + "type": 0, + "txid": "fc02772662176c282c2b6538732d3d6eb1399f006a0b52e64d07fc104038f638", + "inner_hash": "a7ef2323ca6ef0a15173dcc2ef44c0abd10933be70337360408ffb4087affb80", + "fee": 291, + "sigs": [ + "9a30550db56d9c9ae901d835f856761b9c4298d56ffa94bf41eff5550ac180851189f2adf2e184b6f23485a1405eacb2d4cc937ff05490fb0bc609e654effd7900" + ], + "inputs": [ + { + "uxid": "a1ed39cded6d9a0605b52f25cbedb363e57a168d1ad1d1db437816a401c061ab", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "732400.000000", + "hours": 387, + "calculated_hours": 387 + } + ], + "outputs": [ + { + "uxid": "f89c968840831d03abaf3c41cf8a405e4b4ddbfb19f5ba300a8ea8e4dcb1d9a4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "731400.000000", + "hours": 48 + }, + { + "uxid": "b6b6188973b600af774ad8a7b6d454f77713a51463b9a9a70c901ec5280a9789", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 48 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 43, + "block_seq": 138 + }, + "time": 1430504236, + "txn": { + "timestamp": 1430504236, + "length": 220, + "type": 0, + "txid": "9880bebc51471e0b3c520920db836d674f652503314cd74069a59ccad0d0967a", + "inner_hash": "feeb2f638e91dd685e6fe179edc7622ef3fcc8a5a7e795c07be12e03f221f67f", + "fee": 36, + "sigs": [ + "a0c15d7d5f36afc4c78045aae19c8d41a8652f0cb6d633622a1e55b4e54cd5a33113b02c24b02cca10797043d992aaac98bdbb33addd038611ac324795733c0b00" + ], + "inputs": [ + { + "uxid": "f89c968840831d03abaf3c41cf8a405e4b4ddbfb19f5ba300a8ea8e4dcb1d9a4", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "731400.000000", + "hours": 48, + "calculated_hours": 48 + } + ], + "outputs": [ + { + "uxid": "36972dc046829caa340eaecbfeb42f4174bcdecfb87296d56503e5fb10e9de8d", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "730200.000000", + "hours": 6 + }, + { + "uxid": "bceafc261a2250f1bfb8154aea88370acfe6a41a4216bcb76c2016451cbcffd1", + "dst": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1200.000000", + "hours": 6 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 42, + "block_seq": 139 + }, + "time": 1430504536, + "txn": { + "timestamp": 1430504536, + "length": 220, + "type": 0, + "txid": "578075959959db70ae86f4f60d2ae3ff245727d086eef86ed80db5e1c7c9fbaf", + "inner_hash": "eead8ec3c5e86e73f1e7add274fdbe0cecd5cd68c4fcd3cf17c1c7af9c5ee43d", + "fee": 6, + "sigs": [ + "d6331b6d3270100b8b009bbd343d6b82208d622b27ca3a4b371492b9c792f8433c981c57dfc760a3974f13acd86bbb24555b958e0c67e247c5a39d97295022d601" + ], + "inputs": [ + { + "uxid": "36972dc046829caa340eaecbfeb42f4174bcdecfb87296d56503e5fb10e9de8d", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "730200.000000", + "hours": 6, + "calculated_hours": 6 + } + ], + "outputs": [ + { + "uxid": "6962c7c1fcc98f532a9003990163bb251811a4700257968a641b1fe975cfc51d", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "729200.000000", + "hours": 0 + }, + { + "uxid": "278b0caa6dddf4ce74772471b15fb9a8c364362b0ae3eeb9379e980504d8d512", + "dst": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 41, + "block_seq": 140 + }, + "time": 1430504746, + "txn": { + "timestamp": 1430504746, + "length": 220, + "type": 0, + "txid": "de45a24c9c32f808a3d928f30ba8e1b6ef8117a7c0b7a5d616734d9b121d0c30", + "inner_hash": "efeb898fd032831cdd6d7c311f496f4c2622ee11bedc2831b6411cab51d44736", + "fee": 0, + "sigs": [ + "1646b02579d23e2350e2bc47340e027ad5f74bf55aba41fc1244631ba1e0577b681d364c3802017b5cc5d5fda972d23ac9bffabd6159384223a26aba5f08406401" + ], + "inputs": [ + { + "uxid": "6962c7c1fcc98f532a9003990163bb251811a4700257968a641b1fe975cfc51d", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "729200.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "d53fae3b48bde2d1328964a2e7f42e8e833983db159ba30f627926dea0db7df0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "728200.000000", + "hours": 0 + }, + { + "uxid": "cfdefd8d167947190a223882d20c8ac7880e550ad1a3494bb05bff4b1df4e3ff", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 40, + "block_seq": 141 + }, + "time": 1430504846, + "txn": { + "timestamp": 1430504846, + "length": 220, + "type": 0, + "txid": "16f8b9369f76ef6a0c1ecf82e1c18d5bc8ae5ef8b01b6530096cb1ff70bbd3fd", + "inner_hash": "529b1fd21087bf52cb3ebcf02dbe1e3ce5de9daefa9754e5b6cde7be2d8ab0c7", + "fee": 0, + "sigs": [ + "8612c9e160f3e0d7cdcb2adf3611bde867dcb766c63ec4312a9251ba9b6ea6997c0d9a6ce26beaae01e82c22d2b61e5ae7f87aeaf0679fde395888aebafde94500" + ], + "inputs": [ + { + "uxid": "d53fae3b48bde2d1328964a2e7f42e8e833983db159ba30f627926dea0db7df0", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "728200.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "228794e6b3eb69aecc5334e140afbad22883326dcf229bd3092f238ed9ec800f", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "725700.000000", + "hours": 0 + }, + { + "uxid": "908fe94bd28886547f1b7b4fc98d0990a08a216b70877341f566b6b4685de364", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "2500.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 39, + "block_seq": 142 + }, + "time": 1430504966, + "txn": { + "timestamp": 1430504966, + "length": 220, + "type": 0, + "txid": "030177271beee04f1a0974d0c5042f07c7ca1db1c5d496fbee3c441b1b7c5bee", + "inner_hash": "d954f0ee1a437cf3809961063145bb205633ac66d9a29e1386eddb13503ddac1", + "fee": 0, + "sigs": [ + "6e5661f0212dfa0800df968dac30f931335d7fe99d23932878d7d2c06bf69691328d66897c3a5c023535035ed95de3b396ea162e4482e70cda5ec9d4c8e36d4b01" + ], + "inputs": [ + { + "uxid": "228794e6b3eb69aecc5334e140afbad22883326dcf229bd3092f238ed9ec800f", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "725700.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "6efc30b4c943ba4de8d2c89901a0b2a4d9a0ecf34713917eae37c6debca616ed", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "724700.000000", + "hours": 0 + }, + { + "uxid": "18293d947aadf89d9e57d18fa01408867a9abe267504edbdabf8c2a57d9a6323", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 38, + "block_seq": 143 + }, + "time": 1430505086, + "txn": { + "timestamp": 1430505086, + "length": 220, + "type": 0, + "txid": "57150aecde96bde972183b9b0d7d27dda2c0179fb71630e92c27856d211335cd", + "inner_hash": "8fa5487fbcb62adb17287cc80ea02f113f036035e486fe7a37a96a98d32582b8", + "fee": 0, + "sigs": [ + "ba2442a6f68ef825f2921dc135eca398904426f8d225eb122b210670d1b3bf1b2279abcd5cce5c18533dd8ca0286b23e2be9605f1cb6a5820bc1c783e95b833401" + ], + "inputs": [ + { + "uxid": "6efc30b4c943ba4de8d2c89901a0b2a4d9a0ecf34713917eae37c6debca616ed", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "724700.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "6c8b1ba9dc7e8900b42d55e9fbe6ea0e00d7eaccf67a7b66c0a2b771cf88ea05", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "724200.000000", + "hours": 0 + }, + { + "uxid": "456bcb0a2e57a5c20f2757c8fc7669af1f969bb5a57f89965210daf7107993aa", + "dst": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", + "coins": "500.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 37, + "block_seq": 144 + }, + "time": 1430505176, + "txn": { + "timestamp": 1430505176, + "length": 220, + "type": 0, + "txid": "3bb9fc516dc2c522e28f99e6833253863c550547ce0e0a2dd963a0118b7a44a7", + "inner_hash": "111d56ae43b76740e905717e1e440f7611e922c50e83cf84b9edc51efa0271f2", + "fee": 0, + "sigs": [ + "18f2b86a6b51999f0fdc73d411c1db827730652ba2c098f1ff3f3dc0d409d6cf745d18d66bf25dae7e5a975e33f32e8d2b352c025a8e20ff15a68aaa60b1bbb700" + ], + "inputs": [ + { + "uxid": "6c8b1ba9dc7e8900b42d55e9fbe6ea0e00d7eaccf67a7b66c0a2b771cf88ea05", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "724200.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "59d44fefbe86ebae4118dee90609d6a1c08c36f259c65e3fad63b9e41c37bf0c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "723200.000000", + "hours": 0 + }, + { + "uxid": "d8ee5dc5cabcf179365345167d39977ae38a71e55cf357881258be32a45732bc", + "dst": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 36, + "block_seq": 145 + }, + "time": 1430550936, + "txn": { + "timestamp": 1430550936, + "length": 280, + "type": 0, + "txid": "f25c1a8a4ae37e8e2b4a0ec6f2553cf11c57fa77de9556cd227857ca270a0275", + "inner_hash": "c41100ec46608d1982d52cce518abf64c3853a0fff71349c001accff2204de2a", + "fee": 693939, + "sigs": [ + "f5521c2b488dbbd7bd856275b903e176f61a5cc940855d502493b834755fa9037cdf484fef8b3c7950ee166fa1db7bacc5ed18f96b48e13f849c96d76463dd6800", + "f324406fc1ad817ad53cd6d7718b914172ed80828650a6c7a4bd69143dd6be5e681ad4cc897ba5f237bb40836368c580e3fc8231c80ad0f91bf1fd17df28f3b800" + ], + "inputs": [ + { + "uxid": "c2fcd55cf6b73e863c96f7c2d6251069199bfd43688d2515f5c6631688aadcbc", + "owner": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 5, + "calculated_hours": 396519 + }, + { + "uxid": "06292fe8a2036c38f28c4d2f355d9e86e2b55b9d85f84613a64cf5c35d192b28", + "owner": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 43, + "calculated_hours": 396554 + } + ], + "outputs": [ + { + "uxid": "7afab03c823346ff8b00c29df6acc05841583d90dfd451ba09e66884a48e83f7", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "2000.000000", + "hours": 99134 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 35, + "block_seq": 146 + }, + "time": 1430641376, + "txn": { + "timestamp": 1430641376, + "length": 220, + "type": 0, + "txid": "5701965d326520f86335da87c6d1781fd49f1e66520b94e1783711eba724f482", + "inner_hash": "b792056beaf4a864c92e40ad63f9117fae52f4bfda9f88aa74f1255490c28ef6", + "fee": 6894507, + "sigs": [ + "1d98fdd17853e4265c17644a993fdbe5047418b7be96258fdf3c2b3e9c739b1d72c5acc23981dac2d478966834fafa1f98aab2402ce37fe818d3919cf490a5e900" + ], + "inputs": [ + { + "uxid": "59d44fefbe86ebae4118dee90609d6a1c08c36f259c65e3fad63b9e41c37bf0c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "723200.000000", + "hours": 0, + "calculated_hours": 9192675 + } + ], + "outputs": [ + { + "uxid": "5baf8c8ab1a01d80a6f496144815cf6bda5289b34055010e21324ea3950d3299", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "722200.000000", + "hours": 1149084 + }, + { + "uxid": "3dd82b00ef4d1e3b1c71be5f13c0c82b3e2b17af4a6b3eb4c966490f47866ccd", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 1149084 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 34, + "block_seq": 147 + }, + "time": 1430641536, + "txn": { + "timestamp": 1430641536, + "length": 220, + "type": 0, + "txid": "3fae944ef07d9bcba1bcbc8bde87da50a1232132074803f8442deb563ed2da51", + "inner_hash": "aeceb514529fcf9de954599318d804301689818b8d5c90cdbd3bdf6ce3768c47", + "fee": 861814, + "sigs": [ + "b6b837c14a65c31150c24f93ac60a9b49baeb963cf49a8d97e817883ca46a3763168988b69542c5a52b7501674271ded3888bccda558aad004902ab7b7010f5501" + ], + "inputs": [ + { + "uxid": "5baf8c8ab1a01d80a6f496144815cf6bda5289b34055010e21324ea3950d3299", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "722200.000000", + "hours": 1149084, + "calculated_hours": 1149084 + } + ], + "outputs": [ + { + "uxid": "dd07d759d92e3d628a35c467dcd919dcae825a9fa79a14855714270dae08c0ce", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "721200.000000", + "hours": 143635 + }, + { + "uxid": "3ec30639c24acce65054bdb0d7ab0539199b64cabfcad83c2ed7f266fb8849a6", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 143635 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 33, + "block_seq": 148 + }, + "time": 1430642006, + "txn": { + "timestamp": 1430642006, + "length": 220, + "type": 0, + "txid": "79681167a7681edecb998e4a6dccdd0b7be45f163c8f6db23436517936269fb8", + "inner_hash": "b06c37ee520387277d5c174e0fefb11dbbbee9c7ffe53715b7b5bab8f4693dfe", + "fee": 107727, + "sigs": [ + "150ffd203e65dac9dbfcaffb384a9233a274e0ced5a0c2fc9a3127e7a85df894124a5c1f0501c60640dce7d7c09cd1783ed61461f285fa89e6227ba1b427e81d00" + ], + "inputs": [ + { + "uxid": "dd07d759d92e3d628a35c467dcd919dcae825a9fa79a14855714270dae08c0ce", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "721200.000000", + "hours": 143635, + "calculated_hours": 143635 + } + ], + "outputs": [ + { + "uxid": "c739b518f3f700e810f81523d81b15f968fbf202f389ceaa9d9f303319a00275", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "720200.000000", + "hours": 17954 + }, + { + "uxid": "5233e499bd3e38ec4d4fa4d750290f25271c91b4903630d461be51f3c2c02ebd", + "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "1000.000000", + "hours": 17954 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 32, + "block_seq": 149 + }, + "time": 1430642106, + "txn": { + "timestamp": 1430642106, + "length": 220, + "type": 0, + "txid": "b69536fbec9911da41e9d0c5ca73459f5e692ba155f8b72c0972792e9937a0fe", + "inner_hash": "a6d1d92496583cefdf9a9d4e278cdeac9d8e7c31eec3061f0a91bc0116ced8e4", + "fee": 13466, + "sigs": [ + "d98168e1f19fbabcf0ec9fdf21d36486a2d70b13624bd2ec765bc773a08c7f5c09c7df2664e3205c7555bd3c5cb64ca78f5f0a81613ef4a7d740348e0132caf901" + ], + "inputs": [ + { + "uxid": "c739b518f3f700e810f81523d81b15f968fbf202f389ceaa9d9f303319a00275", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "720200.000000", + "hours": 17954, + "calculated_hours": 17954 + } + ], + "outputs": [ + { + "uxid": "95694746f813d018be7988aec666b52924a7815adabe9cbdac3f6ab0f51bd1ab", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "719200.000000", + "hours": 2244 + }, + { + "uxid": "eb57ec196fe95a09be19b62b6837d5d12f99568ad0e5e198f70f55083acd656e", + "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 2244 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 31, + "block_seq": 150 + }, + "time": 1430642306, + "txn": { + "timestamp": 1430642306, + "length": 220, + "type": 0, + "txid": "3e228564e3c187e22bd489857fdb1db7036021e19f688aad56cfee57d5e13ac5", + "inner_hash": "9b4783f4cd11a81e945a2d09b699f76254caa3bbf22ce8533f3b9f179c207702", + "fee": 1684, + "sigs": [ + "8bd5632a52c39ef9e9ce90ebabd119c8f93e32a5a5b6e8fe80c58163b4adcc040725f18321894b59c3546c8ce9fb182e1a4dd6a3b4405229635e3ac3d80213a700" + ], + "inputs": [ + { + "uxid": "95694746f813d018be7988aec666b52924a7815adabe9cbdac3f6ab0f51bd1ab", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "719200.000000", + "hours": 2244, + "calculated_hours": 2244 + } + ], + "outputs": [ + { + "uxid": "be958e5c47415291a781648335db24e448e1f4f09aa5e9c3f055fbc906b574d7", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "719100.000000", + "hours": 280 + }, + { + "uxid": "0fa23085def7c1dbc95587d3f0f58cbc30b09e099ee1afa42d9120452777740a", + "dst": "sV8sVBgs11uHQtZK5MPbYem2iJ6Hehghv7", + "coins": "100.000000", + "hours": 280 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 30, + "block_seq": 151 + }, + "time": 1430642426, + "txn": { + "timestamp": 1430642426, + "length": 220, + "type": 0, + "txid": "18607765c3fbd45eafa15d2d62ab3cbc7ba7bd80c42931aae4db75aa02898671", + "inner_hash": "dbbf7608b67e82363ced90b364a9b8c91029b336ef2b68182d986e399eacb41a", + "fee": 210, + "sigs": [ + "1972310d45a5baf10a8d929a132c725c51cdd19daae3baa640570aeadbb08ea700fbe46e6649289bec61065b05250b84872002f93634e6be81bae042cf80854b01" + ], + "inputs": [ + { + "uxid": "be958e5c47415291a781648335db24e448e1f4f09aa5e9c3f055fbc906b574d7", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "719100.000000", + "hours": 280, + "calculated_hours": 280 + } + ], + "outputs": [ + { + "uxid": "68165429853e18e4414ec6c15630262ebcaa802ff1d83b6cbe116db51cb32066", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "718100.000000", + "hours": 35 + }, + { + "uxid": "efcb1b5f54bceb2d0124d2f89c47d071c2943fb228c2eee62bfddf6e1418cfc8", + "dst": "pMub1Pz3SLVaSwHoomgp5oDVxdkVxLkW6L", + "coins": "1000.000000", + "hours": 35 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 29, + "block_seq": 152 + }, + "time": 1430642546, + "txn": { + "timestamp": 1430642546, + "length": 220, + "type": 0, + "txid": "dc10e0565a14dfecda066577581f3e2d073de34ed3e911ed94413d38fc0a33d2", + "inner_hash": "821dfa6422bb093a528a2ec2bedd0566599cef3e2f4f91441f3073888e092832", + "fee": 27, + "sigs": [ + "1bb9e5e58a4a7dfc9a29bb22eabb2ee4dc6e40dd71b35962adf95d1c1208309727f070257b4591e959a4965cb8d22710233dd1f65c3b58ec47bb71e3d7ebd3e700" + ], + "inputs": [ + { + "uxid": "68165429853e18e4414ec6c15630262ebcaa802ff1d83b6cbe116db51cb32066", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "718100.000000", + "hours": 35, + "calculated_hours": 35 + } + ], + "outputs": [ + { + "uxid": "46aeb9ea01bb04e28c55ef11f8e75434dbeee546f7e06bdef332c604590c48a1", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "717100.000000", + "hours": 4 + }, + { + "uxid": "c0548bf35c950a74c206d2c565e3bcac1f2abe170ebabdb7b74e439b642dd9fd", + "dst": "22WGCstVJGVyqnBuvGHt17L5aNNMpURvckd", + "coins": "1000.000000", + "hours": 4 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 28, + "block_seq": 153 + }, + "time": 1430642816, + "txn": { + "timestamp": 1430642816, + "length": 220, + "type": 0, + "txid": "b0d7ff47658b3e32d8457eb62f6df0c7caaf7feadcbf8cc0c713976026f0404c", + "inner_hash": "5154559a3393277ed8db279bf27a9572c9aeebe81f321d9fb07a5e4313005a90", + "fee": 4, + "sigs": [ + "a3edf9a3203fc696aefde6180d6c28fbaf3f4ee662ea90d82a93c3a8485593465f956713abfea8322b952d61969b29267f3826775638da77a1bf8567a40564e500" + ], + "inputs": [ + { + "uxid": "46aeb9ea01bb04e28c55ef11f8e75434dbeee546f7e06bdef332c604590c48a1", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "717100.000000", + "hours": 4, + "calculated_hours": 4 + } + ], + "outputs": [ + { + "uxid": "598503902d2e6cb62d6f6478f09d8da05af6fd2da92b50825da3b7f74b2df34c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "716100.000000", + "hours": 0 + }, + { + "uxid": "045dc2e76321e37884588093083ce1b21be12f20ba1fa36f2a755b894229e3cf", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 27, + "block_seq": 154 + }, + "time": 1430643706, + "txn": { + "timestamp": 1430643706, + "length": 220, + "type": 0, + "txid": "be0957035ed2ac444f67273fc5c1c6a39ee373f6f83d1604d0023742a8cd7e42", + "inner_hash": "957140523c9acc14a4f6b6a2fd05e70c58d2ed51f43b4e88b1406b398f4e7b2e", + "fee": 0, + "sigs": [ + "ee25ac881aa867780086df4716864a9ec524deeecc140faa60b9f9b87805816c22659836b5169f8eab0977a2337638b6ed7cd7c4a5d4ee3664e7ad28e91dd5b901" + ], + "inputs": [ + { + "uxid": "598503902d2e6cb62d6f6478f09d8da05af6fd2da92b50825da3b7f74b2df34c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "716100.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "4b917e7bd3409c43f9f670f2846ce74f9288708df5aa1d9ae142f2411ce426da", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "715100.000000", + "hours": 0 + }, + { + "uxid": "dbc58940c2457359501c9906589c3d0a0ab7695b983ad79f2bcc087a675671f6", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 26, + "block_seq": 155 + }, + "time": 1430643906, + "txn": { + "timestamp": 1430643906, + "length": 220, + "type": 0, + "txid": "c9582c8134fa64fdf08cd93d42035adcced3f16aa8ee1a1393e3fcd7c07aa40c", + "inner_hash": "ecd6b0cab28125e3ec1fe23a046c259a7d608802da7d6397dbd8b410de03b94d", + "fee": 0, + "sigs": [ + "95e5d5d0856bf5387de8fbdae05f5953510fd85ec346e65fa5fb68984bdb1ab83aa7807e57f00354d934f84a0034ecf8aa74fe3b8e9e480021873f62827770ab01" + ], + "inputs": [ + { + "uxid": "4b917e7bd3409c43f9f670f2846ce74f9288708df5aa1d9ae142f2411ce426da", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "715100.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "d50a372f8f8cd1e0b10d847613b68ee760f195f5f212d6c59e86312c84dd07ac", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "714800.000000", + "hours": 0 + }, + { + "uxid": "25a72cc385c1cdabd0ffd7c141ae205d767f3d016c281f835b9f58f9325bd2a5", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "300.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 25, + "block_seq": 156 + }, + "time": 1430644036, + "txn": { + "timestamp": 1430644036, + "length": 220, + "type": 0, + "txid": "29a883ef9dc67bc683014187b9865c827b5e2f8afd7bf6f3787483318063789e", + "inner_hash": "bf3a81668fb27c0f55d9ec33490cb4c91ec7636ec1f85761fadbfebc020a618a", + "fee": 0, + "sigs": [ + "970a22ba9a849caf00fc787a182dd67a3be794db9d66c691e9d904a78f90397542dee63e801c8b7f4077060fda76f0ac56a67b30865cc4634679f118abe04fc101" + ], + "inputs": [ + { + "uxid": "d50a372f8f8cd1e0b10d847613b68ee760f195f5f212d6c59e86312c84dd07ac", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "714800.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "896865f9b610f9fb69a741596b3ecb9fff3790d40476a9f7852831bdf477aaee", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "713800.000000", + "hours": 0 + }, + { + "uxid": "a34cfb6f175323917dfda72d58ddcfb86363cc43d22a0c6c3141810f5cac5aa6", + "dst": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 24, + "block_seq": 157 + }, + "time": 1430673946, + "txn": { + "timestamp": 1430673946, + "length": 220, + "type": 0, + "txid": "c3fd04cd27ea311b1a67d40cd3dbb2ea8ae2c6f6139620cb86be29f33ed99171", + "inner_hash": "5a975ee4a0f95c51a0a847b1d082bc4859a4b7904acbaece151c58e01f26a870", + "fee": 0, + "sigs": [ + "06c22eb6cb03468010ffbd2b54faa5835ea44cf552779b0adb09817db7e5494d49031d2e4b8994b670857b193766a1f430857955edd627f290f71f970407139b01" + ], + "inputs": [ + { + "uxid": "896865f9b610f9fb69a741596b3ecb9fff3790d40476a9f7852831bdf477aaee", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "713800.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "272d5bbd86a87796a20e3e4debc46a2076718800343bee4f72fc0217a98a10a3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "695800.000000", + "hours": 0 + }, + { + "uxid": "25130a18aca13a37e4f4c08733cdda6a8629759f27ecba775999486c9deffa5e", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "18000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 23, + "block_seq": 158 + }, + "time": 1430674696, + "txn": { + "timestamp": 1430674696, + "length": 220, + "type": 0, + "txid": "3d9f1aa1b6206275081cb9c26155f6261be1ef9c94b4eaadb1a7e8277a2099fa", + "inner_hash": "ef7915c2cc32cfd043bf60533a563a89ee68a7b2f88e9e1e55e6a54494bde805", + "fee": 0, + "sigs": [ + "6d2993d471d4b27d4b0c2beef286dab7e38013853926fef032a8a10d9161fbff59b4eba58d7578182f9f1e79ee763ab409aec46748351b0a7d1a020a3fe3824100" + ], + "inputs": [ + { + "uxid": "272d5bbd86a87796a20e3e4debc46a2076718800343bee4f72fc0217a98a10a3", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "695800.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "60906201d3e7c67ddb976972460b2b8ed093e1f6720a784cbaea376ca13e6cef", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "670800.000000", + "hours": 0 + }, + { + "uxid": "c61f27a2247831679d8df293bf9351b16e8429778c875be2cb64224bcb842ed4", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "25000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 22, + "block_seq": 159 + }, + "time": 1430715196, + "txn": { + "timestamp": 1430715196, + "length": 220, + "type": 0, + "txid": "d720ca0efb19b964f481724e5d3f932841e9e75a69b998baf4b575cf3298cb87", + "inner_hash": "b35da2487dfd396bc01b5296fab691557760886b23ba5bd18e52808549dbfef2", + "fee": 0, + "sigs": [ + "9cb0a128d17a9c42f3e4e44f4da9106ef11407da8d9a434745add4c5f7a8e379325976d8c2222c3328acdc2c6ca597fab4fae292c5529e07c55919ce0e0320ca01" + ], + "inputs": [ + { + "uxid": "60906201d3e7c67ddb976972460b2b8ed093e1f6720a784cbaea376ca13e6cef", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "670800.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "4912e9dbbb5a4cc7472c27b0212ab443e7b5499207b10666a66257005e182714", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "664464.000000", + "hours": 0 + }, + { + "uxid": "b1e5c694c30326cda3df2e634723999befbcbb141415e9a36bdbf18d7bea9870", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "6336.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 21, + "block_seq": 160 + }, + "time": 1430784172, + "txn": { + "timestamp": 1430784172, + "length": 220, + "type": 0, + "txid": "0e8e352b1f2cd419bca619918ce6d5ec1eac0ba7252d76eef5d9d8f8186f737a", + "inner_hash": "49571d7e7c6b3e473b938f1cf4748c67f9301ca710f26ee56d0d8e231cb4515f", + "fee": 0, + "sigs": [ + "8d4556a22c5fb84792cc88bfb47f795e6ba9fc211933776acd89b6da9aff71ea7803bf5b0e1d9afef2f3f77bbc4a7633c459ab9cb11a06723c4cad570717edfd00" + ], + "inputs": [ + { + "uxid": "4912e9dbbb5a4cc7472c27b0212ab443e7b5499207b10666a66257005e182714", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "664464.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "659bac1636b64087ad5d3cb0ae78c52f28ad920016ec67e08415a537e0343072", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "663464.000000", + "hours": 0 + }, + { + "uxid": "ea18f151bbdb611f73596b61ebb0546b9e91281ccb0bbe07a18e7fa69142bb5b", + "dst": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 20, + "block_seq": 161 + }, + "time": 1430784312, + "txn": { + "timestamp": 1430784312, + "length": 220, + "type": 0, + "txid": "d5091ca65ff61998dfb4535a7927fb736abf2a81140a11322dcf8226de27cf92", + "inner_hash": "7a000aaa5751b65d3bccd4d307b7b8602aae539971de3af3baa3e126d52a54f2", + "fee": 0, + "sigs": [ + "693d3153218a69e2ef1e676d6c124dd7fab7ee312d41fd9dbe005a0e681a8b052708a9559fc08e8173e1ef83e45f838742e4a1af765ea7f0fddb38cee2cced8000" + ], + "inputs": [ + { + "uxid": "659bac1636b64087ad5d3cb0ae78c52f28ad920016ec67e08415a537e0343072", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "663464.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "97f64c3c636e5fc997e277cd48644055ef51045ed9c473c05dd6e699872a6c3d", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "662464.000000", + "hours": 0 + }, + { + "uxid": "0c19e689e0e34639c71b0136ce336121b042b6d4ac185ac1f9e94ec7535e781f", + "dst": "XnKU1htBL5wFSMX8oytZBsBMeaBSbVNivT", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 19, + "block_seq": 162 + }, + "time": 1430784372, + "txn": { + "timestamp": 1430784372, + "length": 220, + "type": 0, + "txid": "30e66ff45cfb145eb465e2ebdef0bb10005138bc1727c83888785b04d548e85b", + "inner_hash": "c87fb6e81fc1d99b16958d4626aa0e5ec4033443230bbc8b35e2882c078bf868", + "fee": 0, + "sigs": [ + "b4feadec09b450b99795044931a94f7b8549bf876db7c62132df60056dd0c88e3821d1656407b1572fbb04eb71f6de57db43c997501989f44042d04fc3afdf4201" + ], + "inputs": [ + { + "uxid": "97f64c3c636e5fc997e277cd48644055ef51045ed9c473c05dd6e699872a6c3d", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "662464.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "122b7a9a61ee04e071002d74ffb26b12ed7952ff9a138b5437f990f4678cc2e5", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "662314.000000", + "hours": 0 + }, + { + "uxid": "db7a63750db787959a9e0d2d6be9a1ba8bb3d6015bae2353a27ae9eb55b39d22", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "150.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 18, + "block_seq": 163 + }, + "time": 1430784932, + "txn": { + "timestamp": 1430784932, + "length": 220, + "type": 0, + "txid": "ec79854fade530d84099d5619864a8e1e8ec9d27a086917a239500cada43c6e8", + "inner_hash": "ed6a317c8ea3624337463c1cca78bdcf87bf80dace1bccad050d27a49d3ea1d2", + "fee": 0, + "sigs": [ + "c0548625b3bc88308155f598c3304a124632c0faef8005b8f9306b229b632b253c5e163a02409ba40b01560f77a6acde2ccc48cb0efedd4feb68ecbd925917fa00" + ], + "inputs": [ + { + "uxid": "122b7a9a61ee04e071002d74ffb26b12ed7952ff9a138b5437f990f4678cc2e5", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "662314.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "c07593d4329f82da243e4bbd7430e4b10e7b35f9ce0a3718d0e6d25d20b4939b", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "661314.000000", + "hours": 0 + }, + { + "uxid": "250543215c71a1a9ab7740fff25c3bf9695fcde10bceba3717aef9d0f6dd40d8", + "dst": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 17, + "block_seq": 164 + }, + "time": 1430790052, + "txn": { + "timestamp": 1430790052, + "length": 220, + "type": 0, + "txid": "743bf1eede313145824db1c4f8d683b74ab5e0bc825082d986308b73fd52f1d7", + "inner_hash": "a0427c37a8ca9f8205630cc8d4c6d95200413d3397a0de9bf015763107b8fc80", + "fee": 0, + "sigs": [ + "dc400e921f7f94da5f353846f1340e039b4527fff121a56579390fb4fa4154634e3b3aad44ddf0aaebea5abc1dc5ba2a00540fd2888ed5c4ab7b20c51255086a01" + ], + "inputs": [ + { + "uxid": "c07593d4329f82da243e4bbd7430e4b10e7b35f9ce0a3718d0e6d25d20b4939b", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "661314.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "4d52106e41dba0099549fd81fb8feb6915225b0125c53faa0f7c578ea78f213a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "660314.000000", + "hours": 0 + }, + { + "uxid": "bc513a68461d5c401e65a500baf7dfa163735ef63b817bb7b73c4139d5c29d18", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 16, + "block_seq": 165 + }, + "time": 1430790152, + "txn": { + "timestamp": 1430790152, + "length": 220, + "type": 0, + "txid": "3991a257eee265481e713917a3a9c15756f61175bcfc7acfdbe84158e43fd5e6", + "inner_hash": "dea502923be2dd8b4c48eb7ed2b146793ef840e9749d129bf7f6bda0fdcc43de", + "fee": 0, + "sigs": [ + "dbb23f6d22438c10b98b437fe2ee4d7c5513aba7b0b6141648ac22f07e3768fc5d8d80f9dbcaa95edf925668b6018793a01ca70cf7b48d7c7deac106557ebf7f00" + ], + "inputs": [ + { + "uxid": "4d52106e41dba0099549fd81fb8feb6915225b0125c53faa0f7c578ea78f213a", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "660314.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "fef9dd3b633274743099e607d9229717a001d6de6a4031479cc30d31d65e8396", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "659314.000000", + "hours": 0 + }, + { + "uxid": "5954742a6ca4e3e872d12d4a93436451ad52e6d25e5ac28371e308b2d7ce75a3", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 15, + "block_seq": 166 + }, + "time": 1430791622, + "txn": { + "timestamp": 1430791622, + "length": 317, + "type": 0, + "txid": "41589644ea3a344fc616bec0058cf916b8efa5da7c3539241244827bd7e19811", + "inner_hash": "140c70de73812b1da58d3df6c62696a0ced32ac1ea0818c3c53da4968407eae4", + "fee": 2964031, + "sigs": [ + "c9198240191df5c8b107cb7b6fcb5f4a572d8ae2ac85dd0def832df2f9cd7d806594c1ad2bf2279507de1b9f1e7cb067a4c5562dedf3e40c29fb23387e28277c00", + "cd4e83142b6592dae1d61f92a82b0e17ae43a34207c69e1970cc5e8e8badc06f4067f36da90a142e963d5e35228c0f405482e38064c69eb5d882b6d619109baf00" + ], + "inputs": [ + { + "uxid": "37cc43693a024f9122f5e1fcabeab5d53a4d58590df30a934fc7bc545936e049", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "1000.000000", + "hours": 8356, + "calculated_hours": 141306 + }, + { + "uxid": "903a1bca9b81ed76179cbcffe6e3c8eff269c94826148286f7be0b6038ee4ccb", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "28600.000000", + "hours": 8356, + "calculated_hours": 3810733 + } + ], + "outputs": [ + { + "uxid": "074645413ab2aae818e657f6f36420447a872e7cdd2ff64324b486be4d4d1edd", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "29100.000000", + "hours": 494004 + }, + { + "uxid": "b945bacb354173c33bc41503f50c29ad5d1d333ecab66b0c70d0ed9e6eec7f3a", + "dst": "2kN23viEG7Kn3Utuwz9voM4Z8ohLR9Y8L2v", + "coins": "500.000000", + "hours": 494004 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 14, + "block_seq": 167 + }, + "time": 1430791902, + "txn": { + "timestamp": 1430791902, + "length": 220, + "type": 0, + "txid": "b29222c08f10b8bc4ea18981519a3b0e02b9c9cec63ee28d9ffa2efcaf2a8e5a", + "inner_hash": "61c38575be160010335d96cf7c6ef0608cdb7b85079f2518532d00b6f42f13d0", + "fee": 201915, + "sigs": [ + "cb5c75671164755516cbf4d94e2288d56985b4d3113538bc818d1aa1c944a76b1beae28964c8e596ab0cd252cda6cf2a5468cbd0dbeff21e35609b5a6577eb0a01" + ], + "inputs": [ + { + "uxid": "fef9dd3b633274743099e607d9229717a001d6de6a4031479cc30d31d65e8396", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "659314.000000", + "hours": 0, + "calculated_hours": 269219 + } + ], + "outputs": [ + { + "uxid": "21f0fb666dca05d7a43ab26a378f7f7eaedfacde22fa047ca72857e9509cc748", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "659214.000000", + "hours": 33652 + }, + { + "uxid": "0b5e5259c276ac949de97062492ea6dc93ae6215c8dd1615862907e3c3ae9cf0", + "dst": "2A2YC8kxWnUDbscpzZ6UPfNAmx5ddKBeYNs", + "coins": "100.000000", + "hours": 33652 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 13, + "block_seq": 168 + }, + "time": 1430792072, + "txn": { + "timestamp": 1430792072, + "length": 220, + "type": 0, + "txid": "50fc81b0ba25669105a169a969459ccdb10278051b604a3f91467c2528c83652", + "inner_hash": "c356824e25deeecd3f531eb56a26d5875b7b81743e9c8f3d6beff5f634bf5e3f", + "fee": 25240, + "sigs": [ + "ac3b968f82649fac3822db1af5c0be17fc20cf86e091362b1584a2b66c033b10541f70fb6f55d8e1b3c57161ce37412a52d2009dd8abc9ef7ab038b19d8d644401" + ], + "inputs": [ + { + "uxid": "21f0fb666dca05d7a43ab26a378f7f7eaedfacde22fa047ca72857e9509cc748", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "659214.000000", + "hours": 33652, + "calculated_hours": 33652 + } + ], + "outputs": [ + { + "uxid": "6b3a0cab1d9ad6fd011a3bac5e6ff4e3f7903bce911dc7fe83926eae557c34c3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "658214.000000", + "hours": 4206 + }, + { + "uxid": "a02148f770788851a35fb90567510044e37f8db930deab7a2b584af67c8efb2f", + "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "1000.000000", + "hours": 4206 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 12, + "block_seq": 169 + }, + "time": 1430836392, + "txn": { + "timestamp": 1430836392, + "length": 220, + "type": 0, + "txid": "acfb61f7ca39d5dfe33e8ed66f73ab181da0a3206d457bf055dcc4b9731a3ec8", + "inner_hash": "85c5d3963f2dce44e99500967e8b8b1943839537fb198186131459a3022d161a", + "fee": 421, + "sigs": [ + "473114dcb42e2091f3d0396ecd16ee2685e0a6074c7de218cbd7e7c4335d89146455bc6c259c77f40d4af769e241aba1e3a102c5755946b1783c817ffafa67d101" + ], + "inputs": [ + { + "uxid": "bc513a68461d5c401e65a500baf7dfa163735ef63b817bb7b73c4139d5c29d18", + "owner": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 561 + } + ], + "outputs": [ + { + "uxid": "639e69c4a223b5082b9274caf3e56ecff2ab55cd90cac94fdb4c383a1013ba1f", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "990.000000", + "hours": 70 + }, + { + "uxid": "bffea1990d71311b695b2d343b9f09a216b7a8257c1cdcb01b2ab9459e1490e3", + "dst": "jtuSERvfzN3kUYekg8LemCQ5kF5g97N8ZL", + "coins": "10.000000", + "hours": 70 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 11, + "block_seq": 170 + }, + "time": 1430836422, + "txn": { + "timestamp": 1430836422, + "length": 183, + "type": 0, + "txid": "95d847102c01d071982e67b8e7dfae50715b0fc0179d33f4b050974e634905e1", + "inner_hash": "c13b7e1722f3616f61948ed42382d4ed41164e7e2110d2d60bf86725f32531de", + "fee": 62, + "sigs": [ + "cb7da0e16b83f1717614c7f160580ac0048a4276682ac4046c3324ba6f4e24901d162f7ec81a8e5cdf3676df6ace9a73c77e4d3ab7f03a4f0272c75f3715665001" + ], + "inputs": [ + { + "uxid": "bffea1990d71311b695b2d343b9f09a216b7a8257c1cdcb01b2ab9459e1490e3", + "owner": "jtuSERvfzN3kUYekg8LemCQ5kF5g97N8ZL", + "coins": "10.000000", + "hours": 70, + "calculated_hours": 70 + } + ], + "outputs": [ + { + "uxid": "be081639ea8da63d8542707e9ea9625f6afc97da132f43ed061645c359bb1e65", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10.000000", + "hours": 8 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 10, + "block_seq": 171 + }, + "time": 1430870562, + "txn": { + "timestamp": 1430870562, + "length": 220, + "type": 0, + "txid": "fb495093f2f4e5c6555c50150ea60c0a6f430e53aa971ebb3e2b5412866a1f06", + "inner_hash": "05596340e51ad628080101c8e92a60f27e0f5ab509e892f9b65a0988b1575ddb", + "fee": 6084778, + "sigs": [ + "068a56e916267a1756d9348bb965f3ed2dcba956fe4c626cd4836921dd836f7c0fa923d6451d5c87aa2eab528ff19ec332434bd12e197eeafbf0896e84940c4401" + ], + "inputs": [ + { + "uxid": "6b3a0cab1d9ad6fd011a3bac5e6ff4e3f7903bce911dc7fe83926eae557c34c3", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "658214.000000", + "hours": 4206, + "calculated_hours": 8113036 + } + ], + "outputs": [ + { + "uxid": "372703f8109295f0f58fbee58795979e10dd887869f4fc1da4881ce8a3c0aeb4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "647750.000000", + "hours": 1014129 + }, + { + "uxid": "a35044035cce79cb988c757dcaf5d9a065957c0fbc1a3559d08ed46831504fc2", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "10464.000000", + "hours": 1014129 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 9, + "block_seq": 172 + }, + "time": 1430870592, + "txn": { + "timestamp": 1430870592, + "length": 220, + "type": 0, + "txid": "7abef7e4080bf2cbe9f147d7c9cbe4c950b38f8477d304466c938b937cd379ba", + "inner_hash": "f28366f7590220cd42faaf9ea041c8ca4460707e0dbfe1d3ac67da8d9dda268c", + "fee": 849078, + "sigs": [ + "e9ff8a0ce6c5e8b09936e031ef8cc6a0f3f3ed0a5360dcf2f649db3a2da958441c20916b27d1ad2ea8415679755b36967074e20feab7271528cb6b3266268ec201" + ], + "inputs": [ + { + "uxid": "074645413ab2aae818e657f6f36420447a872e7cdd2ff64324b486be4d4d1edd", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "29100.000000", + "hours": 494004, + "calculated_hours": 1132102 + } + ], + "outputs": [ + { + "uxid": "b1b832a911d45aeaab73676caad794fe2ab99d423f80c4ff58cfb269656b03dd", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "28100.000000", + "hours": 141512 + }, + { + "uxid": "c31c199a54ecbea5e57bf7f5e73d231a09e11713dd0ee70e340e4b0a9c9f9fdc", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 141512 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 8, + "block_seq": 173 + }, + "time": 1430871512, + "txn": { + "timestamp": 1430871512, + "length": 220, + "type": 0, + "txid": "a7665cec98224150968ec1ef9ef2d6b3175c9de8f9f8c7bc786b30cc74997c57", + "inner_hash": "5bd2503c4ff78e7c9d182bfe5e62e54f1bfb944bb526d97b272021d8ccfa9359", + "fee": 764646, + "sigs": [ + "dbd1e8763cb9681aeb96edc0c8483decee30b670778bec88da249f9d4f2201c330d2a16349608ba51eb8a387805dce9618810c4e6fd7af548cccee7d2c9c5dd201" + ], + "inputs": [ + { + "uxid": "372703f8109295f0f58fbee58795979e10dd887869f4fc1da4881ce8a3c0aeb4", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "647750.000000", + "hours": 1014129, + "calculated_hours": 1019526 + } + ], + "outputs": [ + { + "uxid": "14027340f6e1d98bba3f7f5f3b50e3588f8a19e4d021db944e7a28b2643640e1", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "635750.000000", + "hours": 127440 + }, + { + "uxid": "793f3f0e41c9d1de391d864792b79ed8c24dde5ff84a73c161d660a73ed70c90", + "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "12000.000000", + "hours": 127440 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 7, + "block_seq": 174 + }, + "time": 1430871622, + "txn": { + "timestamp": 1430871622, + "length": 220, + "type": 0, + "txid": "ad44a8027a825e82a20cdd910d9bd41d74025601b7668c80655e9b45afb8bb93", + "inner_hash": "af11c711190f9b52114dd31dcc4dbcdff3f169c6ce2559ff5baf14032e057145", + "fee": 111521, + "sigs": [ + "fd019f0cc492d5b6ba1bab0e3c77659b0e4773ea9b7dbe9808ea1392bfcd41e20aec3438076cb6ae4104bb6730b47ad1f1cfe878155f984ee380da10991b2a5601" + ], + "inputs": [ + { + "uxid": "b1b832a911d45aeaab73676caad794fe2ab99d423f80c4ff58cfb269656b03dd", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "28100.000000", + "hours": 141512, + "calculated_hours": 148693 + } + ], + "outputs": [ + { + "uxid": "c39acd3494113650c1a6a7809287af7b12a78bbd97126d4585dd1715e2cb5a66", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23100.000000", + "hours": 18586 + }, + { + "uxid": "2d3f7890d11efedd4cee3a7ab4a5cbc56d2c8df4f02124bdad9ec839400053ba", + "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "5000.000000", + "hours": 18586 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 6, + "block_seq": 175 + }, + "time": 1430908702, + "txn": { + "timestamp": 1430908702, + "length": 220, + "type": 0, + "txid": "9364ed6cfcc289df74dc6bac1993f7ab3441b898cb3f06918198d2476c83dbac", + "inner_hash": "a55922b0495d39c8e9db70ac9aca99266d5a7f3644106b4b5468345d955acf41", + "fee": 110149, + "sigs": [ + "cecae09b7925e9f6db1ccf5ef9a93687a43bbeaefe2888abcc07411c71f850c80c05ed573abd67bf9f0e8a096a1aba8187547e3d062e5ed147ac51961cc3559701" + ], + "inputs": [ + { + "uxid": "14027340f6e1d98bba3f7f5f3b50e3588f8a19e4d021db944e7a28b2643640e1", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "635750.000000", + "hours": 127440, + "calculated_hours": 146865 + } + ], + "outputs": [ + { + "uxid": "8e55f10a0615a0737e6906132e09ac08a206971ba4b656f004acc7f4b7889bc8", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "625750.000000", + "hours": 18358 + }, + { + "uxid": "d91e07318227651129b715d2db448ae245b442acd08c8b4525a934f0e87efce9", + "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "10000.000000", + "hours": 18358 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 5, + "block_seq": 176 + }, + "time": 1431162639, + "txn": { + "timestamp": 1431162639, + "length": 1481, + "type": 0, + "txid": "a17cf54c20ac7ec6e1362acf24c5e5589ed8b49bdba791a87430de160a473913", + "inner_hash": "71127fa12d9ca390715586fe313b4e130b24614e0eaec276dc2dd25b7228c39f", + "fee": 2711954, + "sigs": [ + "95855ae7d279d4797bafe542fd1803eb6a89533f29ae0d89d3f51256feeacc343dbd3da0d8d104e436c04643c72b5dab7a74634befc942ef9d96ded3e235ab4b01", + "55222337fce2733e7a3f92bf808da32759f33327c616828bdb0a350e5d3567b34fdef1a55340d7f857c4daed9735ad64394697ad941fc883f9365693991299a500", + "950281f4acb6cb8176929740aa90fa8729ac5687ef6500bc087429c43f5414e319c26142fca51c0ed9e5d434a6c83d2e3c837d7c9213398ae2104429d03f35dc01", + "c41f7425ecb51359a1da6ccf090a565beed72c891c49a8c81939a46f914c55de5766e99f1519302bfeef2224f856c859391d1f531004ee088083259fca82b17400", + "ed7085f8ceb26060851a71f665387d7c44774c6b9ddfc8d3a06e1fe50168d48510f63f5b6a0998c2a30d24bf37f1c6030035ef8df6efe6dfdcae38beeaf3a5a701", + "a88fefcc8f2809a288a275aac579f340c5138f8bfedf02964d4e3ed0492ee54e696de7e6f7f0b3f315461fb5df4f8e5e5fc7a5339ca6899c6ca7b122c54c90db00", + "ad9b245807ab8c5c5a713ab7e3bfbbba8af032bc4915c1824d95e95827d95be473eb1f6952ee489ddad59049364220bab124182251142b849235ed552404ba3d01", + "7a403c671ec5a6a6622ff63e4d482d51fda747cbe85cf8ef642aa840154be435409df707aa81a3c4e553e0c2c250a452e8416dc38697c35f830de27924a052fc01", + "06b5966aa7c7dfd425e773aafd46fdf29b41734b73f84ef1cd8941e617e0d6245e99f6d8be8b9609686b0faee4923b8bc149078ebb18c1b2e8f6318c846675e801", + "c5634bef581b26d600ed6f4cea47f402633e74ab8f5497b2c2ca69a01e3dfeda0a38308a4a96cfe58857e4c0c2311ecf4e3f4eef69aa771a1db89c360892492200", + "4807a114ffe9e44797843f76c74e81d72324885a67d560c4e1d6e4cadd271b637176a932dc045844b52a4c92f6892ebb0265838366827fd0e0b6b7e20e4e1ff501", + "bc1ca4e3d0afd920bad8c4ef8a6b847c71f75ae8ca913ddb5d976dca42af12ea3ec3a2e59ec8f57fe4fb41af3f439387272ea847240ee89468c4d808303cf9be00", + "366f0f68a36bccd22e829eb05f960a8015466bb5eeb8e553dd37b52ab624d1756f68501db2a8d14fda04d1adf3239a9785ec142c14c5bb34cb8d47629c191dc901", + "146eed504f7acbbece951bfea4eb426e80852e3dc6ae9c8a68480fdf4e07ddd73a5709e2f9df0154380d837a5ff66582c07a0fc27d0df4e7d6d28bbcb90e3c8d00" + ], + "inputs": [ + { + "uxid": "04c0cd4cbee1e5414791d9e0b9ae4f889bc52d253b5f70b09fbc32c88fb415ae", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "3.000000", + "hours": 4, + "calculated_hours": 1748 + }, + { + "uxid": "f3034ffe54e869315f8e11801d3e755352fb75b878b24313302273c1b7ea62cb", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1.000000", + "hours": 0, + "calculated_hours": 581 + }, + { + "uxid": "3538af0016ec0f4d0e943c5d49daf280b416701fde4040fa72710c0ca1b5b559", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1.000000", + "hours": 0, + "calculated_hours": 581 + }, + { + "uxid": "0560bae3917bca7581af9b6c5a58e395c701ce9ed0241dac2de8a3e93c0b839b", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 1605, + "calculated_hours": 510237 + }, + { + "uxid": "3fe7d61ffa993e00200ce6be7ba347c603032ac3f8c4ace07767e630fe94d76c", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 125696, + "calculated_hours": 610213 + }, + { + "uxid": "2a09e97f7725a35af1357842206875a023252da4ebfce129eaf4cb87119cfd41", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 2704, + "calculated_hours": 487118 + }, + { + "uxid": "617b584bb9e6b1d80daac915fb3079b22a326777d1515a40e7b7eddf427f4099", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 3102, + "calculated_hours": 163688 + }, + { + "uxid": "18293d947aadf89d9e57d18fa01408867a9abe267504edbdabf8c2a57d9a6323", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 112148 + }, + { + "uxid": "045dc2e76321e37884588093083ce1b21be12f20ba1fa36f2a755b894229e3cf", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 73857 + }, + { + "uxid": "b1e5c694c30326cda3df2e634723999befbcbb141415e9a36bdbf18d7bea9870", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "6336.000000", + "hours": 0, + "calculated_hours": 340570 + }, + { + "uxid": "db7a63750db787959a9e0d2d6be9a1ba8bb3d6015bae2353a27ae9eb55b39d22", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "150.000000", + "hours": 0, + "calculated_hours": 5180 + }, + { + "uxid": "5954742a6ca4e3e872d12d4a93436451ad52e6d25e5ac28371e308b2d7ce75a3", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 32930 + }, + { + "uxid": "a35044035cce79cb988c757dcaf5d9a065957c0fbc1a3559d08ed46831504fc2", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "10464.000000", + "hours": 1014129, + "calculated_hours": 1124989 + }, + { + "uxid": "c31c199a54ecbea5e57bf7f5e73d231a09e11713dd0ee70e340e4b0a9c9f9fdc", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 141512, + "calculated_hours": 152098 + } + ], + "outputs": [ + { + "uxid": "d6735d3ad70dbf553048faf1c529d047ab12282d04e320bd67c915779fc4e3fd", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "24950.000000", + "hours": 451992 + }, + { + "uxid": "a5f3c513b5a01dc5e943a5cae91f54b54cde55e984a9480d68d690f40dfb7914", + "dst": "v4qF7Ceq276tZpTS3HKsZbDguMAcAGAG1q", + "coins": "5.000000", + "hours": 451992 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 4, + "block_seq": 177 + }, + "time": 1431162689, + "txn": { + "timestamp": 1431162689, + "length": 220, + "type": 0, + "txid": "e4850021fb706f2b7a94fec9ade3c166823dcd980dc3954437471d98fb9d2280", + "inner_hash": "1a07c8a17c429aec5c0725dc6e4891f4e304a483211f99b847a6820e410b56ef", + "fee": 338994, + "sigs": [ + "e7d92fbcc6716645c2c28a66ac289453b2967c620e105c7699cee251aa6916227057789d10889689a3f3c743dadfea09e1cf747cc7b7ccb5381fe1af1069e06201" + ], + "inputs": [ + { + "uxid": "d6735d3ad70dbf553048faf1c529d047ab12282d04e320bd67c915779fc4e3fd", + "owner": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "24950.000000", + "hours": 451992, + "calculated_hours": 451992 + } + ], + "outputs": [ + { + "uxid": "ec439e7c7d8517824885ae1520fa5b19f991d7ade3a12209c0e87f6ad1d30229", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "4950.000000", + "hours": 56499 + }, + { + "uxid": "f5e7796297b7201b1ea87736fadddc7b451f9ed7d4529cfe9f03082e80917628", + "dst": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "20000.000000", + "hours": 56499 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 3, + "block_seq": 178 + }, + "time": 1431162729, + "txn": { + "timestamp": 1431162729, + "length": 183, + "type": 0, + "txid": "ecd101a6af263973ab75f87a3116231e6fe84a2281d0001c9aa2d7195545e78e", + "inner_hash": "41bc4ea9ec8214b461a5377d0ae0da38831bc972b8dd54becaf195b5943dd55e", + "fee": 395493, + "sigs": [ + "4a604f9845e202871ac8741962280bb5db6f1295353042922a6f46671f27cc1d6cd4085aec390205aa5ba08f2c841295b4c86d2fab81d6e29fc958dfe9712e2301" + ], + "inputs": [ + { + "uxid": "a5f3c513b5a01dc5e943a5cae91f54b54cde55e984a9480d68d690f40dfb7914", + "owner": "v4qF7Ceq276tZpTS3HKsZbDguMAcAGAG1q", + "coins": "5.000000", + "hours": 451992, + "calculated_hours": 451992 + } + ], + "outputs": [ + { + "uxid": "ba1adbf3006a239fb7ef6efb1f9390a25951a5185dc312dd81bf88025f838456", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "5.000000", + "hours": 56499 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 2, + "block_seq": 179 + }, + "time": 1431339429, + "txn": { + "timestamp": 1431339429, + "length": 220, + "type": 0, + "txid": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "inner_hash": "db98f515ce6c3d99fd7c39a6ac59ab498b1a2cc8fc6a13377ac7d3d463898e7c", + "fee": 33129894, + "sigs": [ + "1ca18424c9a313e9c253aecaec3c532c35c60e454f026a3d2794c772bc74a19809d53f8862962e865dd822dd054cd7f32b89b810968d95c9db6a9a0c1095390601" + ], + "inputs": [ + { + "uxid": "8e55f10a0615a0737e6906132e09ac08a206971ba4b656f004acc7f4b7889bc8", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "625750.000000", + "hours": 18358, + "calculated_hours": 44173190 + } + ], + "outputs": [ + { + "uxid": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "hours": 5521648 + }, + { + "uxid": "01f9c1d6c83dbc1c993357436cdf7f214acd0bfa107ff7f1466d1b18ec03563e", + "dst": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "10050.000000", + "hours": 5521648 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 1, + "block_seq": 180 + }, + "time": 1431574528, + "txn": { + "timestamp": 1431574528, + "length": 220, + "type": 0, + "txid": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "inner_hash": "d5b18a0c0c454e56fe1f7d0c64236d633f65717c04f08cd943f5669b4cc34667", + "fee": 2265261, + "sigs": [ + "2fac42571bb301783e46e804069c73c8226b637ae6385fec793e3a3860feaa6918058c55f461cef38341670c5c2da230d2241f267dbde6fc0528a6fb24362b3b00" + ], + "inputs": [ + { + "uxid": "c39acd3494113650c1a6a7809287af7b12a78bbd97126d4585dd1715e2cb5a66", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23100.000000", + "hours": 18586, + "calculated_hours": 3020347 + } + ], + "outputs": [ + { + "uxid": "75692aeff988ce0da734c474dbef3a1ce19a5a6823bbcd36acb856c83262261e", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "hours": 377543 + }, + { + "uxid": "a4b70476ea1e079ebd3503b52eee32d490515457fce6a5aa075770b598a9d14f", + "dst": "CDD8GoJUHEvBm1pD3BQ3hEC2KcJNhvUzpu", + "coins": "1000.000000", + "hours": 377543 + } + ] + } + } +] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/empty-addrs-transactions.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/empty-addrs-transactions.golden new file mode 100644 index 00000000..acd0dcfa --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/empty-addrs-transactions.golden @@ -0,0 +1,7058 @@ +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 181, + "block_seq": 0 + }, + "time": 1426562704, + "txn": { + "timestamp": 1426562704, + "length": 0, + "type": 0, + "txid": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "sigs": [], + "inputs": [], + "outputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 180, + "block_seq": 1 + }, + "time": 1427926392, + "txn": { + "timestamp": 1427926392, + "length": 3846, + "type": 0, + "txid": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "inner_hash": "0f7019627886818d2501af189bbac18e21b8e959891c5b2726f89e29355aa10a", + "sigs": [ + "be602113fe288f750001ab65f254ceedd8b05b1becc456a0a52a0bea10b8280e38d950933992ad3265e1f81d197036fa634b316f08b3b319ffce081aa43f3bb600" + ], + "inputs": [ + "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0" + ], + "outputs": [ + { + "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "26f585cb96f35307f0af5b9aee004a29b7795695f4c5c836104e2fbbf429a3ce", + "dst": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "18a43b8b69bbf12a9e49e6f9783ba258397e6567301aeed9e901a1e4fed9fef9", + "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5a69ef09b5de21b117cac62141a8de4eade7558c42f0ba8b50996f5ec7867c5d", + "dst": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "aef761a12e3d0fa9c4a8db62b8bab1015c32931b7e3a7fc9a77282cec218f79d", + "dst": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "445a4082da251fa161e4705d115fe2018ca15a5f92e8a0950793405410e6be12", + "dst": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "dst": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "368a609ee90ca15bbbd297af07dc6705131764476d54bef641017ffcd0885e65", + "dst": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "13afe1586015c4d7312f89d123153279e4961eb0d53a4d036847d5d989ba90dc", + "dst": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f625cf04412199c16e073dbb500e66c23cfe69043578b4a2d879a329aac563ec", + "dst": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b2da50a08756c34d059a04812451cf3296f73ba87f8cca38473ac8f051ab6d1e", + "dst": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "135c28698e80e3b2a737d59c16c79684c3fb3ec5cec59f466a39f4ac3c73968e", + "dst": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "df63056cf3ae21efa86d241876ad0194387317585dc9e4fcd80954b47d59b57a", + "dst": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4628f4cfdbf1eb7cccc25d461c46cc29e90cffb5d6277e0de641f7701d60c308", + "dst": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "47e4706dc4d80a70b20c889476fb0627ca6d5bdaa790f4ceba44a689d31b2dcc", + "dst": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b64bc50d370a06df117eb543ca051239c985cfc4b6aa527c51b700de32c7fc41", + "dst": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "390bc4c045fa9f289957b7eca529bfadac96a7dd074bcfbdd3b09e99413b8202", + "dst": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6aa162f7fc09598c4dc8f5fab7fb2383f28c3840937a001acd9f37136e1691b2", + "dst": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e440cf4c896735d3299a871f988c134f404fb2065d1f20c87c9c9bc5fa582e09", + "dst": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "eea791e84a53e4d99485519c5d2c3146b0a2ad080cf92904ae7b28c2d9a6e3ca", + "dst": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "01048ad6a538256d9a8c6c9c6321ca1a01b31cbf08e74fd4ff0f141bf97eb8ce", + "dst": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc5f1f1ddc8cb23df3d42f1e5a1dda9d356846fe930ae4484bc1eeb1b3b2c95b", + "dst": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f03087245a6b64bb69cd5866a1887ae595a9e1a86e196754984840eaf6d3eb9c", + "dst": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "239bdba27dabd52f7450f7d8521c9a7e5ac74093ae3f6f2348bf40ac9a6db7a5", + "dst": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d60879e562b65f97d40bec7309d4490ba0a8c80e2349ecb2e3505aaa50ea1e47", + "dst": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "66e685901492c94942522c346759c711ee2e78a059ef274e77a6ab433409683c", + "dst": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b497992663f99f9902deaaf487b00655820003015ea92091628f4a6e8aeb5854", + "dst": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc40377012004566712fa860e74db97305091cc163e95435e04556c70d32f9c5", + "dst": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "73304622e33994bc2d4ade2cab78d28e1b65185e60ad3c781ecfb5cbc8159136", + "dst": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fed15e8506d0e0898510311850b8863ef6d9a499215ae8823a1e3fb9c8140ab2", + "dst": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "12034bc455d0821813d7eb9afed1ed1a8f19b6f29826ef4a057b4aa0b4228817", + "dst": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fc444cdb2598f44209a41ea20afdc9065ebe51b7cd5f65bb1c0f7a7b427ce7b1", + "dst": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "618d242d95d33e2d7316612a164d89859b85f1287f0d5bed4dcb561cf478f706", + "dst": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "07f70fd4108ef4d2fde3b85411728c1f7bd3a135d2062c5a30a46cc885463780", + "dst": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "af9bcf6ba63a08e699bc101aa362f135343aaf78a56e9f88d118fca0e1ce5c08", + "dst": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6b3530bb930ed10bbc4c307663aba4377c08443498a0a2cf023b1be72f378ae1", + "dst": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fd6da5199e528958e68ee8dd003b727d4d840754ea7c1e0c05e4f0e504c9b2cd", + "dst": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "131f07f5b40f365fb537b863e4aa5ef0efcd77b7fa2ff321d90eeb743ac43678", + "dst": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ffbdfdbf3427d04f445c33e867845bec1ee64a9dfe0d0fa8284547c2226fdfa9", + "dst": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b53c7188ebf4d630790ff63275679ba48009e31af6e4fe15806619216caa750", + "dst": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b4c6639b49402c2753f83c7fb7d3ffa65da74e47fef2b781933ff55b14d09bcd", + "dst": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c956289db079c00d2f80c590d3c8ca26c37da534fe5f65e799b3982ceca493c", + "dst": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "550d2a8d3047cdae0c05a61cc3de43e758b123a6955fa067d3ac375f7d0dbadc", + "dst": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78740d5bf49989936d315bf641949232aace582e03de57db8abff940f7d51bd1", + "dst": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9f2c83c5165826de1077f428ad39d41473e32ed64cd83180d49e7d8e5db996d0", + "dst": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "883be4d7173c235933294ab8dcae8cc76609166eaa1c1f07e9b51d551c979709", + "dst": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6384ed19650d384c29db4c3a39a1ca855058fab758075be2dee759dd9e6faae1", + "dst": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", + "dst": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c238e82f3a4beee1be7b5b464e8553404f6927d5ab93c3d649d362c01097782", + "dst": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dad4991bfa5c51eb176f28c1b3f86661e02579905e6e07c997df22004e06244a", + "dst": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4ba91512c168281f41d3934b927d0d86a3136a31cc345b635095928f8e5f013c", + "dst": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c416f5e604eeada9ae8e520a429d8f19d4230626769e7121007e01353730784f", + "dst": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7b8787fd4076c27d074d2a4761377a1aa26c843c432e3b7e6b0ebf1e29528188", + "dst": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "38f22b194f04d85a6b545b37df06195edeb8503798b229ddeaa946018150c05c", + "dst": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "246377a036ad5444bcd5f47ac9e55fec7c85fc40644df593038d360554a809f7", + "dst": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c6d5e543ff5f2c2526728d588fb21753db5b7e05b8b275aa5e9b24d29350afb0", + "dst": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "98e223e6e2240fef83082d3daa86e46f10e0c71f3f74489ba95db0951a166f53", + "dst": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c8971ca91f8e21c556f647940073db003f7dd5582ae55d4ebca602d5e8e91a6e", + "dst": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dfa7822c05f54116c9fc3b2cde1ecb4667f47a2d8771fe886e832c223cdc4e82", + "dst": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6d37c0c4b6fcbac1e53a46c9c2dc5d3c3b36312c53f25b2baacc785ea77a11f7", + "dst": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9ba5e31610f0545666f102465efa8caa48ad3fb5b8abd5ae802f4a71e3f7de3b", + "dst": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "3ca365aace71e24b04d6f2ffbf7171468c5e71783858c710cae539c5e43e0c0e", + "dst": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c858f2db2a20ac562d32f8fb2a3a11039849a6e44d2bec30befb2e173532a9a3", + "dst": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1550a76598693b950346397e0e825bbb2805edde38b0d0240e50050829b7b1dd", + "dst": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "466340ab7733abb23ab24d877c673fe089c273f11808fbbd6f33a91da92ee96c", + "dst": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "401d4c0c1060ebbb4b9fb3859c2eb47789f94086f4deb01234bf46f7cdc81247", + "dst": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2c0e3aa084f5fec45f99b3f125ce7d50c6da526ef5165df5f22ba603147c3fc2", + "dst": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2e724d83e35235c23c0bb16ae9b708a5bba3c23b186b05d4b8c606f6bb4b311", + "dst": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4f30eae8c49eb268fe364eaf5ee0788da6e2f6adc2f83cd82e96a4bfe98496f5", + "dst": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8753d5775c22477a8ef74eeebf61d7de30be702e70118f552cc18ad963ffe950", + "dst": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efa2007c561dcbf7c83a6bbdd2ef75e7cca76b05330a8b948ba0dd94dee949f7", + "dst": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b379d1b8ff0153c63ee69c40a7155b97fa42ab570f68ff847d457316c4d8ab9", + "dst": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cc84f93adce16699d9e84ef32f55333402431b58dc50c17084bcb8b33f382f88", + "dst": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f38f0760769c19075034f70b059abf4d1bfa6d01e1e8c369a99900ed1eaeca6d", + "dst": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8d55f76bb0b3dd222cf85a7193501c0f4071b446f56dbd1da355b1625993325a", + "dst": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efde499c7e4444bc602b7bf5ed50e95a18ce8ec9a06ba9d850a05bb7a25ecb3a", + "dst": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2a4d631d5dc90e397d85f13410d1a6d877dcaf592a0e2be2e727443ac74b5bd5", + "dst": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e936299a21240744f6edbab493449323f920bbe15dcf294463e5a2ace10f27b0", + "dst": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "44e17f4bd29411a1614457171c06183e364bf6ff80a201717b2dfc0748e9ebe3", + "dst": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1941e5cc5e38dd92427580af699b1f410be7b29ff17d3d0ff3d046bfba0aaabf", + "dst": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ff6c0f27fcf92f3b4a3871b801c3116847fe47a7e3bafcadd4855d06012091ad", + "dst": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cd6c4b785e60757fad0e6fd4874b729ea7703fe7ee9560e1283d2eb71fc75321", + "dst": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "745eaff456a390c3868742a039e72c2a93ff8eee10417dbe848d533b89facc04", + "dst": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2f3f050c9ef31bf5c3b14c1c71699c4f4b38aa18479531194d12e6277416516", + "dst": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0b95850edabed70762768ac1695c5d7f230cccaa8de06657cda42cafba36374f", + "dst": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7c767d3a06db1ac0e1809ebe29a7d9689143259f4651837de54423e287c20490", + "dst": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78b07e8fe1366e173f2eeb75c35cd53baf0f6100de50ae12b4ffe7d0d7ba4298", + "dst": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5010eb25f6e1ed725fb901ae1e945e545ae846d7be8a135333d2d41102c33328", + "dst": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "178a33e64826cd2039b8538b74e6de513966acab45ab79d77dc9392018a65ffb", + "dst": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "044dc539d063250dc654b2bf0986a9044b4eea05e1284c11a2b313acd8dc3498", + "dst": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9fd5ea38f383291566def44b6fb932414f97123952578fe0cfb9a30eb075a099", + "dst": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "be5930e9cc35801433bcd21db84da7d4f1d8e744feca16a2c6fb00c81ce93e51", + "dst": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8cd999cd193d315e5f1c6f74c230c12e6abe6847924f6e89d988e09ca413f52e", + "dst": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0cff53628eb0e984c134b68cbe4b1bb7721a05adaa32e93b9df489a9a7a176cf", + "dst": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "a5ef046e84be9ff2485dde49afe6073811286761afac3bbd588b6e4130930479", + "dst": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cdee5f84c4f08098ac740e3a260ced14c1e199e126aa5291ec079b281a7dc407", + "dst": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6a24135f8496e7a37dcf7164218bb3aa530319f3b2bf3c7a1a9cc1bd17831328", + "dst": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "693c7f970b34ce5882e62430f4c9c28957159a257d27d4e21a61fd95c6b97464", + "dst": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c008a613cef129c180dbcc7213f2d41a14d245d06a3844d63d9beac963145385", + "dst": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "439cdfd03972fb4bb5da54208cf8098ee78228c487ce9e84623f5f83e17a7d68", + "dst": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "hours": 1 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 179, + "block_seq": 2 + }, + "time": 1427927651, + "txn": { + "timestamp": 1427927651, + "length": 220, + "type": 0, + "txid": "312a269b8248e389c61571cc13f4ad13b7d53b64853d990ddc301a58e7071889", + "inner_hash": "4daff2831f5bc2877a98a49b0ef75f8ff01bcb35082fd4018c77707dfca31849", + "sigs": [ + "f4482e0781e0d94c8c4773940e1f811405681844a9dc3c1938243442e1cbd5463d5e251880abbf8ff1ed85b4b2659e83ee30f06cc4c5dc9913aa6a9630fbe3de01" + ], + "inputs": [ + "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76" + ], + "outputs": [ + { + "uxid": "0cd548e03bd13bca8647cd13f6baef0c65fd03081aeb6dc3695536e5bc6018ae", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999990.000000", + "hours": 1 + }, + { + "uxid": "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 178, + "block_seq": 3 + }, + "time": 1427927671, + "txn": { + "timestamp": 1427927671, + "length": 183, + "type": 0, + "txid": "a6a709e9388a4d67a47d262b11da5f804eddd9d67acc4a3e450f7a567bdc1619", + "inner_hash": "ea6adee3180c7f9d73d1e693822d5d1c2bba85067f89a873355bc771a078faa1", + "sigs": [ + "ce8fd47e2044ed17998f92621e90329f673a746c802d67f639ca083705dd199f6ee346781497b44132434922879244d819694b5903093f784570c55d293ab4af01" + ], + "inputs": [ + "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a" + ], + "outputs": [ + { + "uxid": "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 177, + "block_seq": 4 + }, + "time": 1428793611, + "txn": { + "timestamp": 1428793611, + "length": 220, + "type": 0, + "txid": "c24b92898381fbebe59a457924184f4cce1e7166e140ca75aea5baf854c1ab75", + "inner_hash": "43dd65d5644ec5214a901ac94e530cbedb83d2174cf402c7b24697cfe55e1de7", + "sigs": [ + "434a7a0b624fda393c1caa57ac9787f69da3d8854d0ec6f69f0da1c96c9b683d787064b644e9ac3dd4dd8466c22c1547cff89c2552420f5efcfd1eacb1a2eac301" + ], + "inputs": [ + "0cd548e03bd13bca8647cd13f6baef0c65fd03081aeb6dc3695536e5bc6018ae" + ], + "outputs": [ + { + "uxid": "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999980.000000", + "hours": 3704 + }, + { + "uxid": "98b3e6e6d4ed36159b7dbf5f305174fc0c255d2d97528b35a67d50b9968e2b2f", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 176, + "block_seq": 5 + }, + "time": 1428798821, + "txn": { + "timestamp": 1428798821, + "length": 317, + "type": 0, + "txid": "0579e7727627cd9815a8a8b5e1df86124f45a4132cc0dbd00d2f110e4f409b69", + "inner_hash": "fe123ca954a82bb1ce2cc9ef9c56d6b649a4cbaf5b17394b0ffda651ed32327e", + "sigs": [ + "056ed0f74367fb1370d7e98689953983d9cf34eb6669854f1645c8a16c93d85075661e7d4f6df0ce5ca8eb9852eff6a12fbac2caafee03bb8c616f847c61416800", + "8aaa7f320a7b01169d3217a600100cb27c55e4ce56cd3455814f56d8e4e65be746e0e20e776087af6f19361f0b898edc2123a5f9bd35d24ef8b8669ca85b142601" + ], + "inputs": [ + "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70" + ], + "outputs": [ + { + "uxid": "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999890.000000", + "hours": 4073 + }, + { + "uxid": "dc63c680f408c4e646037966189383a5d50eda34e666c2a0c75c0c6bf13b71a1", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "100.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 175, + "block_seq": 6 + }, + "time": 1428806251, + "txn": { + "timestamp": 1428806251, + "length": 220, + "type": 0, + "txid": "03b3ab821cdaf0ab8cc1a9e2dd30108772ec3bda09e9d3a8c48df9f30d213b38", + "inner_hash": "e49bf8f45cb6664d36ec632e37bd91566d8bd4ea9ce209a0a955323a94dd744f", + "sigs": [ + "0a0d9a3fa0597667fb991bbe047ff93c591313faf759fcec2f47138bc0666b333b7689ad527ddb8ef135897be41016f755eb14e46cd327fc5eb196bce80c3cd400" + ], + "inputs": [ + "dc63c680f408c4e646037966189383a5d50eda34e666c2a0c75c0c6bf13b71a1" + ], + "outputs": [ + { + "uxid": "8ff8a647e4542fab01e078ac467b2c9f2e5f7de55d77ec2711f8abc718e2c91b", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "95.000000", + "hours": 0 + }, + { + "uxid": "778048daec0c83f89525a6d69b60c407d090bb1666711b1c560e6ebee8dcc452", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "5.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 174, + "block_seq": 7 + }, + "time": 1428807671, + "txn": { + "timestamp": 1428807671, + "length": 220, + "type": 0, + "txid": "f832428481690fa918d6d29946e191f2c8c89b2388a906e0c53dceee6070a24b", + "inner_hash": "f440c514779522a6387edda9b9d9835f00680fb314546efb7bc9762a17884156", + "sigs": [ + "8fe96f5502270e4efa962b2aef2b81795fe26a8f0c9a494e2ae9c7e624af455c49396270ae7a25b41d439fd56dea9d556a135129122de1b1274b1e2a5d75f2ea01" + ], + "inputs": [ + "8ff8a647e4542fab01e078ac467b2c9f2e5f7de55d77ec2711f8abc718e2c91b" + ], + "outputs": [ + { + "uxid": "17090c40091d009d6a684043d3be2e9cb1dc60a664a9c2e388af1f3a7345724b", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "90.000000", + "hours": 0 + }, + { + "uxid": "f9e7a412cdff80e95ddbe1d76fcc73f967cb99d383b0659e1355c8e623f02b62", + "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "5.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 173, + "block_seq": 8 + }, + "time": 1428807691, + "txn": { + "timestamp": 1428807691, + "length": 220, + "type": 0, + "txid": "7229422f3a0afb5f3a9596ed50146440c17a3d54abda0f3c70cd9dc58de96374", + "inner_hash": "68fb8cd96b0d2a94838183ab24f36f71006383add373837d448a7584ef69bc6c", + "sigs": [ + "b859da7c65d6525247973fc62d274343feb3fe6fd76ab392dc30d7cdc609a7e45018b425fbdc3e79647e43b99d25bfab6c23d60495e5e0ce3cf06b6ce2c4897d00" + ], + "inputs": [ + "17090c40091d009d6a684043d3be2e9cb1dc60a664a9c2e388af1f3a7345724b" + ], + "outputs": [ + { + "uxid": "999cc56deae71486a28e19d1ed8d585c2cf07d5ee27d1c33bea186d23aaca06a", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "85.000000", + "hours": 0 + }, + { + "uxid": "1f810bdd1c65ad50f27f2c47a000150877fdba2fdb78b9d8cae39946be6a9e33", + "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "5.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 172, + "block_seq": 9 + }, + "time": 1428807711, + "txn": { + "timestamp": 1428807711, + "length": 220, + "type": 0, + "txid": "9d87d7bb9e56a3588bacb478c7556280b28c0a49f6e09db8b54a84c20d865f2f", + "inner_hash": "f60dd876ff32adc5e20759f45c04075f46796b0ca2b76a490d5d1e2d5b18424a", + "sigs": [ + "be2ea2bcb4be07705cd034579d77c2fe0f9c7bb29dad0e690f38f8a2e098041c396820004975298d9d3647dfec7cbb610452e294381b898f28d48f166aaea5a500" + ], + "inputs": [ + "999cc56deae71486a28e19d1ed8d585c2cf07d5ee27d1c33bea186d23aaca06a" + ], + "outputs": [ + { + "uxid": "2f87d77c2a7d00b547db1af50e0ba04bafc5b05711e4939e9ec2640a21127dc0", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "80.000000", + "hours": 0 + }, + { + "uxid": "9e8997e53d2e61955da71dbbc6ba5b0da799eaace0f45870a4e42276a6fdaefa", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "5.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 171, + "block_seq": 10 + }, + "time": 1428807771, + "txn": { + "timestamp": 1428807771, + "length": 220, + "type": 0, + "txid": "98db7eb30e13853d3dd93d5d8b4061596d5d288b6f8b92c4d43c46c6599f67fb", + "inner_hash": "affafab93dc807a9306d1f3c6a19066aca57f284825420fb01e48200349f7ba2", + "sigs": [ + "71008403c675d9b3fdf8c09cc6caa64c681b78ba588fe20abb568e318d2e40b55c44ea614efc475c408e1e6e15cc0df753e6d3f04cb521078e6c928d5aa64c3200" + ], + "inputs": [ + "2f87d77c2a7d00b547db1af50e0ba04bafc5b05711e4939e9ec2640a21127dc0" + ], + "outputs": [ + { + "uxid": "0c5d1b6a61c32f9bcc62d3583ac957b3374f0daf1a14fd08679bff2554449840", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "75.000000", + "hours": 0 + }, + { + "uxid": "ec2c2238793d71240502de3e7c46ec1d5bf938c76541185f1c3fdf0d99a90795", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "5.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 170, + "block_seq": 11 + }, + "time": 1428808851, + "txn": { + "timestamp": 1428808851, + "length": 220, + "type": 0, + "txid": "4a87de6869c974099e3f5522404fbc7b23f90a8f8dec958bf725317454036cdc", + "inner_hash": "53ecc82b426d4b806eb1c743e892edbc7eb7051c88f3fa8afc74a6a5b80cc57a", + "sigs": [ + "dbbb5acf0130c39a6b2fd760dda1df5aaefd94d8a0904e6faf959feade87d17a5c754459b635e0048e1019dadb9815a54d8bca4cf234f6876b19b5a0df5e494a00" + ], + "inputs": [ + "ec2c2238793d71240502de3e7c46ec1d5bf938c76541185f1c3fdf0d99a90795" + ], + "outputs": [ + { + "uxid": "9c7d3674d7a6b28a559a052e6d354ec13d2e0396739973c9f0dce08f8c7d157c", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "4.000000", + "hours": 0 + }, + { + "uxid": "3f8c01eefca28ec6d89d34b899fecb5c97f9348b412c61e7c863310b8a85b953", + "dst": "2M2VC93aQv5asdcNKt7pzJdkxeL6xLw9JPp", + "coins": "1.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 169, + "block_seq": 12 + }, + "time": 1428814821, + "txn": { + "timestamp": 1428814821, + "length": 183, + "type": 0, + "txid": "9ea7b912cbfca157ef5fe9c59dd2407302d1b4d95414829d93c45bde6c2d42c8", + "inner_hash": "8a294b39558a38da2c996a7ce12eb6e045b44ce3b3a153bcfdc664a246b1a46d", + "sigs": [ + "81d65e0a176c322059776922be59a385f3d5f430502e51b94dba78662a42161805bea61e646fdd9cad314fcfea00d6f790f758c4e3c8b22ec3bfcf73c79033c100" + ], + "inputs": [ + "3f8c01eefca28ec6d89d34b899fecb5c97f9348b412c61e7c863310b8a85b953" + ], + "outputs": [ + { + "uxid": "34de4a6d093e880f813b4dc466b51f6814923e157ffbba0e9abbc4bfbd938de8", + "dst": "2AsyTLyWNR3FGhaMbLckaJyAZN46mrqFfXA", + "coins": "1.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 168, + "block_seq": 13 + }, + "time": 1428814891, + "txn": { + "timestamp": 1428814891, + "length": 220, + "type": 0, + "txid": "fa33df7c4316cea05095e6c7ce86f361847893d26fe2255af118593a33686c52", + "inner_hash": "2e88fb3c0f9eaa317794e966e4275cfe62949eed43fa2987729b877178fb9951", + "sigs": [ + "25df6c1b4ae2c0cfac2f3ac608b108e5a83ef07c19a125dd098729734bdd6a1f65ca8a3f34878b07f6cd3e7d3e21ab432b1dec68f273dbb52a0ff90b253b6f9201" + ], + "inputs": [ + "9c7d3674d7a6b28a559a052e6d354ec13d2e0396739973c9f0dce08f8c7d157c" + ], + "outputs": [ + { + "uxid": "04c0cd4cbee1e5414791d9e0b9ae4f889bc52d253b5f70b09fbc32c88fb415ae", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "3.000000", + "hours": 4 + }, + { + "uxid": "f3034ffe54e869315f8e11801d3e755352fb75b878b24313302273c1b7ea62cb", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 167, + "block_seq": 14 + }, + "time": 1428815131, + "txn": { + "timestamp": 1428815131, + "length": 183, + "type": 0, + "txid": "b68d78c9a4610b540933eaa550fbb1c473f5cf749eb522882f8154d495453e7d", + "inner_hash": "aeb75b736b0467e49884795158dfc6ea5c6cfe2b4f696d9d5b29c1fcac503834", + "sigs": [ + "dc926994a9bdd69aca5887edab30fbcbe9fc008328424ca0a38a258bd8c78b543af0e8aaa4195ef9e7c4fb7009f1dbdbb322894be8a319f4dff3809a3592a81400" + ], + "inputs": [ + "34de4a6d093e880f813b4dc466b51f6814923e157ffbba0e9abbc4bfbd938de8" + ], + "outputs": [ + { + "uxid": "3538af0016ec0f4d0e943c5d49daf280b416701fde4040fa72710c0ca1b5b559", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 166, + "block_seq": 15 + }, + "time": 1428820169, + "txn": { + "timestamp": 1428820169, + "length": 220, + "type": 0, + "txid": "70dd5840d7260cf584457c76d3226312f4d033c023caf8c0ab3a65f9b831e9e0", + "inner_hash": "4357c427cbc4b55139089389858dd8245464f674d4fff82e5daba9e18384a0b3", + "sigs": [ + "964c4b0c6cde6625863adebd74910851a440a636823dab9d0cf0fbc4581e3dcb486be22ba19d0c6d6eb17db22d1b1389589ec4b6cff8e8a9b231c66fe40c565500" + ], + "inputs": [ + "0c5d1b6a61c32f9bcc62d3583ac957b3374f0daf1a14fd08679bff2554449840" + ], + "outputs": [ + { + "uxid": "acd35cec566de86b4ed464b6cf3c3ec561140c070134d1e03094775454da2159", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "70.000000", + "hours": 102 + }, + { + "uxid": "4a06f4b59bc5626e6a92704b4e4441096e909b884eab84505699a3136abb69b3", + "dst": "PRXLNyB64cqaiG4pCoFZZ8Tuv7LWYPpa7m", + "coins": "5.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 165, + "block_seq": 16 + }, + "time": 1428820629, + "txn": { + "timestamp": 1428820629, + "length": 220, + "type": 0, + "txid": "e96e157b685c28847d6758e2ba326ad59cf2661c926fb08000d4b40d78a9eee3", + "inner_hash": "3153d35c8b133bc76ea6bef8799c9fbfd36a3cd3e8e42e170ab131eb309acea8", + "sigs": [ + "11813ce8ce2db73c23a8167696621443e0d80ec878d964d5164da33f259f55d17e5f1fc2292709542015c7bd86874ed855c0c80406a53a35759722d014a8c31300" + ], + "inputs": [ + "4a06f4b59bc5626e6a92704b4e4441096e909b884eab84505699a3136abb69b3" + ], + "outputs": [ + { + "uxid": "e72d8ba4ce2d3b37aeb71df2e3bed80ee07204b3fa633f56cbce7bca836bd39c", + "dst": "PRXLNyB64cqaiG4pCoFZZ8Tuv7LWYPpa7m", + "coins": "3.000000", + "hours": 0 + }, + { + "uxid": "0b720d05d44354ff0c6c75d55f1cd4e5945bc2ca80f2ba840545205362202925", + "dst": "ZWhZtjwXMS46cpDxfRwQyxxKPhqwsQu8oN", + "coins": "2.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 164, + "block_seq": 17 + }, + "time": 1428989855, + "txn": { + "timestamp": 1428989855, + "length": 220, + "type": 0, + "txid": "d952ef4cc45a89c14230ba0f7e30b782fad83cb6506ac0f503a242c568c1287a", + "inner_hash": "8fc48920982066fd4c69e2d2c0c5239cca7c296f0e3ad30e9b976c1230967478", + "sigs": [ + "b7eb93bcebb6df3dcad48afd66dd60bd42b1fbcdf52aa5e0c7e455e791f64a976fa416534b4e08bf3e62a2df83e13754119634c4255dd1e2e08be447d4d5b47201" + ], + "inputs": [ + "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e" + ], + "outputs": [ + { + "uxid": "4168b9378363cd81939e667cf78055d35a60d3101f5f9e3d2ae709e3981e29fc", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 4040790 + }, + { + "uxid": "c603e99ceae4d15c20360714ee07ba6e3a944a97ea9285d164c23252e93958b6", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 163, + "block_seq": 18 + }, + "time": 1428989925, + "txn": { + "timestamp": 1428989925, + "length": 183, + "type": 0, + "txid": "686db0a8cd429970bb91163033703410d4750c86ba485709fe1a3faabbbb42f6", + "inner_hash": "76732ac6a9936242193011d78a0f2849529aee767a569c9c6bb25b3bbae15cee", + "sigs": [ + "d74dcfdc8401a29b1dccc728b40b6b79faea147c65b4a859063ad77cc63aa9a62417c63b91b94678b6656fdba2f242d836b6914e77d244fbd16aaab014ddb44300" + ], + "inputs": [ + "c603e99ceae4d15c20360714ee07ba6e3a944a97ea9285d164c23252e93958b6" + ], + "outputs": [ + { + "uxid": "d9dae1f82177f979b07016a341ed5c281ed6ed8eaa785a8a107ec16efbe541ef", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 162, + "block_seq": 19 + }, + "time": 1428990115, + "txn": { + "timestamp": 1428990115, + "length": 220, + "type": 0, + "txid": "c6eccf17b4b952f19548b1924126c9dc409b45f9e6fcc0954a3494e7399f5fd4", + "inner_hash": "736a1b4f415c1b0968470fac4d123ec52943b9d2ea7d2ce376307b2477a29acd", + "sigs": [ + "3660a24958b1b20beabb7f77d2ee1ddd91f1e40e8393b48d5ed4722d97bd1430150c5ea0f8ea1a2688a0d9f336c9c1f78a214150cc1ca3d895a694edde65ac0700" + ], + "inputs": [ + "acd35cec566de86b4ed464b6cf3c3ec561140c070134d1e03094775454da2159" + ], + "outputs": [ + { + "uxid": "af7deecc9b45c4696ad50246c8aa06b17aa8280b2574f295697a4210fc45f57d", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "65.000000", + "hours": 2268 + }, + { + "uxid": "b56517b7803a4b2cca522e1cca5f75894db174c97d0e127826f5414544eccb72", + "dst": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "5.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 161, + "block_seq": 20 + }, + "time": 1428990135, + "txn": { + "timestamp": 1428990135, + "length": 220, + "type": 0, + "txid": "22766105d0f93d01fed7bed2dcabedfd89fe846621c912b0af845d8ba5d265f8", + "inner_hash": "3d516c76b1f147942f2237a2c07f9626624385fb858199ba63ec2d39112b6dfd", + "sigs": [ + "94e1b26e60d075536abd602ae88015f73ce638e49ec4e6be358cea8950853d0b4174aeeb0391ea05a9c62a6d37164c1fbab1d1ab53c9e2efd80ca4738ec3480e00" + ], + "inputs": [ + "af7deecc9b45c4696ad50246c8aa06b17aa8280b2574f295697a4210fc45f57d" + ], + "outputs": [ + { + "uxid": "ec9bbaf9309772ade9860f145705b9e9ee4a70ed1eeed1983d058ccaafd6c02c", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "60.000000", + "hours": 1512 + }, + { + "uxid": "e55a8d2ebe0f48f17a175fdd67d47deb5015b2ee8e91de16b2b121c8ad830e40", + "dst": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "5.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 160, + "block_seq": 21 + }, + "time": 1428991365, + "txn": { + "timestamp": 1428991365, + "length": 220, + "type": 0, + "txid": "67f180076fed1599152c62337a12deee7e1a468b19f7e720df51415c28bfb986", + "inner_hash": "1d676e397e50442c001f98385b525f8df39ef7189ebb0744cb3f868d8c96f00c", + "sigs": [ + "797c7987aab5c7a6a63eb06d514063a31b27beed8bfe22f15fbdf7b08c65702903d778d48e8cd027a9569c9973d0e52234977df7e0b9391967c913985ef860a700" + ], + "inputs": [ + "ec9bbaf9309772ade9860f145705b9e9ee4a70ed1eeed1983d058ccaafd6c02c" + ], + "outputs": [ + { + "uxid": "e3e95cd390c42d2f08e2c173135620e09c7a2ec1cf80ff75fbc3940fa5712b3c", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "55.000000", + "hours": 1008 + }, + { + "uxid": "1f4f952c6304e3991cf33519f1084921d50ecfd845edc48bd3b7b7229e28f2a6", + "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "5.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 159, + "block_seq": 22 + }, + "time": 1428991585, + "txn": { + "timestamp": 1428991585, + "length": 220, + "type": 0, + "txid": "c820bf59805b4889e59ce5fa320dcccfce5180de5f0f8baef7b391049ea8e286", + "inner_hash": "6fab8afaec00c1604f67fa7ecdfc968fa870662a46b714a88865e6b83ca555c3", + "sigs": [ + "0fafbcb51bcdf3e797059c26ec09574b9b02672453e31fdc5b8b5debc507dfe917208b33632e7905c9b02252a675b7bd22578686e2882277ac077af86fcaa49a00" + ], + "inputs": [ + "1f4f952c6304e3991cf33519f1084921d50ecfd845edc48bd3b7b7229e28f2a6" + ], + "outputs": [ + { + "uxid": "4c84a4bf9a1b1a3a53d8bf78e8823ca3135321089968068ac60da32083027846", + "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "4.000000", + "hours": 0 + }, + { + "uxid": "182b4c32bb5fe0e6809a19db63eecbeefde97a6c043b9248da94d428ab5a94c2", + "dst": "2bvEzLx4mgyQkYL5bkSc2rD9V1nqWBqn8vp", + "coins": "1.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 158, + "block_seq": 23 + }, + "time": 1428991605, + "txn": { + "timestamp": 1428991605, + "length": 220, + "type": 0, + "txid": "eb0a48072c5da37962c07d205a1843311f98e886cfcbdb2813359677f36bebc2", + "inner_hash": "104c51c380f54913954c2e16a8cf35dd585666a6e7b67116c05f490e06e5e1e1", + "sigs": [ + "6615ef5540b366a45895feeb91f16a5226d5022737e59ab1b9825843ff54dd7e281f2f014fc95641e3bc6ddda433b86e0c79d87a5b9b8b23fa5e234e5a41da1601" + ], + "inputs": [ + "4c84a4bf9a1b1a3a53d8bf78e8823ca3135321089968068ac60da32083027846" + ], + "outputs": [ + { + "uxid": "f3ce12886e74d6407f9580b47e72156a917083b66ebaa46263c7fde2df35116e", + "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "3.000000", + "hours": 0 + }, + { + "uxid": "20900f1d317e0b10ebab7190a34265f52783ff4f85675398b497ab8eb3723a3c", + "dst": "2bvEzLx4mgyQkYL5bkSc2rD9V1nqWBqn8vp", + "coins": "1.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 157, + "block_seq": 24 + }, + "time": 1428991635, + "txn": { + "timestamp": 1428991635, + "length": 280, + "type": 0, + "txid": "f935cd91736604989c08448a2d83d6b044c3198ac1a7483a3b9846f8848a7d84", + "inner_hash": "02b721422fcadeb8c3217d9b972c81fe9042a32871a180fb1237e213a543cc9d", + "sigs": [ + "fa3ccaecf3a01525fd617fe74971ff2f7270e88f92f17a0f7748c1b258e007fd0fd10a582cc406d7806fd7794e20c4a3178b71cc1cb9f59c3c7d36a4e34d962100", + "23530a4d36d65cb37fc366a8c4a61d47dfd4fbf3b268bd66fd960bcff1b91db419d039049b8f816bedbd73d6baeaea77c5907c0df5b47724ad07420dd225cdaf01" + ], + "inputs": [ + "182b4c32bb5fe0e6809a19db63eecbeefde97a6c043b9248da94d428ab5a94c2", + "20900f1d317e0b10ebab7190a34265f52783ff4f85675398b497ab8eb3723a3c" + ], + "outputs": [ + { + "uxid": "fbe00b341f3e798c3e7e5eea04ffd8f3e70f0e78bc38f9a4927bae7eed6a1411", + "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "2.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 156, + "block_seq": 25 + }, + "time": 1428991665, + "txn": { + "timestamp": 1428991665, + "length": 220, + "type": 0, + "txid": "917510897f5d8a018ad8d447876a15e2e1f68d42e71b6f75d89b02c4a599c537", + "inner_hash": "be34076fd999f7030f2a51866d641f8a783deb2204a9a93a8b64377a95546916", + "sigs": [ + "880b044ee5559510010d6d5cb4d7b50cb3e5323e5037daf3a048f3fab70254d34ff258aea85ec8ce264679bfb35df4590cd4dcaa527d89f9fb65fa50234dfc2e01" + ], + "inputs": [ + "f3ce12886e74d6407f9580b47e72156a917083b66ebaa46263c7fde2df35116e" + ], + "outputs": [ + { + "uxid": "f910d0e633735df5f041fdb7ffcb9cc8988b71c9375c52ababb54238be4d6852", + "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "1.000000", + "hours": 0 + }, + { + "uxid": "ebedac42a639f0d0a196b47676cb757b95046f0403f74baa5b15e98753ee2d58", + "dst": "2bvEzLx4mgyQkYL5bkSc2rD9V1nqWBqn8vp", + "coins": "2.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 155, + "block_seq": 26 + }, + "time": 1429011077, + "txn": { + "timestamp": 1429011077, + "length": 317, + "type": 0, + "txid": "56e7bd13dc4c6e1cd80aba66a0a9fed650d0646659ac774e3f1b415848755d85", + "inner_hash": "2894cfa31c21eb04c33f89263aa1e4caae625ceaf30539b82b39ccf79dffa816", + "sigs": [ + "6aedcd617e69aab9724b6a52e0e71f4f087a2fa84a283ac685c17e274b49cf617e58dbbd6c45a8e2c1c31832a1193ba119f0cb238fd83b9d7eb029dcedbeba0800", + "f1f26b84f247c409d308bf0992c2a044ce649fc09169d5fe4843f22b855f911d6c73b92f679346d30ec6663aa5d0387189935ce8e2f2256dd13e59cbdae7b89e00" + ], + "inputs": [ + "4168b9378363cd81939e667cf78055d35a60d3101f5f9e3d2ae709e3981e29fc", + "d9dae1f82177f979b07016a341ed5c281ed6ed8eaa785a8a107ec16efbe541ef" + ], + "outputs": [ + { + "uxid": "8793a3782bf673393a8f909f267f3bfcc713b600460893b571fd55f675ac65ba", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 567938 + }, + { + "uxid": "339aeec109a26bab65e618d73ebba16e5b8fc18f7dc1fe502ca891ad5b0f4d5f", + "dst": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", + "coins": "10.000000", + "hours": 567938 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 154, + "block_seq": 27 + }, + "time": 1429011137, + "txn": { + "timestamp": 1429011137, + "length": 220, + "type": 0, + "txid": "cff53a059d55f2c90f6dd7ce7de2cc07cbdbd50b25867cba0f41cd0192614d0d", + "inner_hash": "09382455a4e78c62bd0c254e106d349f648944c3747b066a23cc64d9392c6c05", + "sigs": [ + "ade8874855f58653ef198e005a7ec82de992cddb50a4bb5ce8a0ec1cfa7b44086883ad1c85c63128dad5426b8b22873c349e0535191b80b3e92035b120cada7a01" + ], + "inputs": [ + "8793a3782bf673393a8f909f267f3bfcc713b600460893b571fd55f675ac65ba" + ], + "outputs": [ + { + "uxid": "ad742bbc7420c08881e6ccf35e34e8472c0dd6386792359aedcfb752ca618c33", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999790.000000", + "hours": 70992 + }, + { + "uxid": "3e475e76c226a70c87d030d8fc6b8b1c2cc654ba9eaf3bed08be5bd603aec0b7", + "dst": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", + "coins": "90.000000", + "hours": 70992 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 153, + "block_seq": 28 + }, + "time": 1429020387, + "txn": { + "timestamp": 1429020387, + "length": 220, + "type": 0, + "txid": "f2f9926afcd29405327ddb772988a73dc13a67b1fcaa42ad98a416060e96adce", + "inner_hash": "1e46ec99a425796960a928a95b64be87b568d160c9533a5399d25141b60f74af", + "sigs": [ + "1b59327011b10a2896962898bafd8d587710fb6d99b1b565777e0713a8e5fa072f7f60043c9823d2bcfc589b283e99da90d0649c472199a683428b14bd75374301" + ], + "inputs": [ + "778048daec0c83f89525a6d69b60c407d090bb1666711b1c560e6ebee8dcc452" + ], + "outputs": [ + { + "uxid": "92ae7cf57ad1363a60ce019818f7304040959329b6513f9a2d0f6b464bacafea", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "3.000000", + "hours": 35 + }, + { + "uxid": "7f44d7ef014419278137cbaa344cb550fc3c07355ec619d917bea3bc15fb8817", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "2.000000", + "hours": 35 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 152, + "block_seq": 29 + }, + "time": 1429020687, + "txn": { + "timestamp": 1429020687, + "length": 183, + "type": 0, + "txid": "260d249883165aa9e59e17fb2bd8ba8995d2c3644993530985f8b813ed378650", + "inner_hash": "c5a9b2a4d2100d45a97a0131f3ffa79fbc4bb37b8969e8a1d5059055ca169c6c", + "sigs": [ + "661c14759218ac72f4b06ac96bce6db7e20cfae5f23643cc4dae2641893ca3686682cb1e3cc3f384afe549a87209e4104ed7d163af8af3be4762686719541e8900" + ], + "inputs": [ + "98b3e6e6d4ed36159b7dbf5f305174fc0c255d2d97528b35a67d50b9968e2b2f" + ], + "outputs": [ + { + "uxid": "18ea1b3cceb2ca40c01efc8f3cfd7d1d0dd69430ecdf655515aa4f8b21bd2644", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 78 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 151, + "block_seq": 30 + }, + "time": 1429021044, + "txn": { + "timestamp": 1429021044, + "length": 183, + "type": 0, + "txid": "044a75b1d3d273cae560ca43f9351d9acde206b0ad5578eb3adc2598886b5134", + "inner_hash": "61a1297a213a7642daf445350b49b2df9ccade45cc1498b91f80fceefcad5adf", + "sigs": [ + "ef33f4e1a053728e779296e912df149ad7e20167bd79ae88db24c52da558c6cc0dffaa3aeb9b4aa507865855f7172bb7ac72040dafb56bc2612d152d51e8008000" + ], + "inputs": [ + "92ae7cf57ad1363a60ce019818f7304040959329b6513f9a2d0f6b464bacafea" + ], + "outputs": [ + { + "uxid": "61c61dfe5b82fde557a698b402c82ac0205929478e705cbadec7f5d47a51d403", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "3.000000", + "hours": 4 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 150, + "block_seq": 31 + }, + "time": 1429021184, + "txn": { + "timestamp": 1429021184, + "length": 220, + "type": 0, + "txid": "9004c779cff67b3895500ec14b2c2e566127bb11a8af3358fe8a63dcfae9badc", + "inner_hash": "9e1eed08b004316812f4ad574f3d0f96959b2a335cdda77113abfd1673a8859d", + "sigs": [ + "6b3a3b3374c641ca252ee32cceab1b37c4c395b411e4d2515bc51f2a8ec12b9c440d25dee1b94a0231dd9492ab3e07c7a5dc054a0da987d6bf0ba6fc8de6f42000" + ], + "inputs": [ + "18ea1b3cceb2ca40c01efc8f3cfd7d1d0dd69430ecdf655515aa4f8b21bd2644" + ], + "outputs": [ + { + "uxid": "64194899d317e2a007f89df14538795547e927c242a92f83180e6cc952304964", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "5.000000", + "hours": 9 + }, + { + "uxid": "569aa1260e734017c4eee06d84ab4a6285e2ca2041940b2915d9141527caf179", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "5.000000", + "hours": 9 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 149, + "block_seq": 32 + }, + "time": 1429021214, + "txn": { + "timestamp": 1429021214, + "length": 183, + "type": 0, + "txid": "327375203f20cb68847351c30a48597c0588a8c14319a4eb47bf440207fd045a", + "inner_hash": "217a070c0edd70fc0eaa7f858308444f32bbfe4b48e128b6fa876f60c4639bfb", + "sigs": [ + "de82c42e2523b512c0ffea3c91244dc905f59264f3c59e2f82efc3fdb7f446c728afb08bbc3478462cf25b96848da9dc4dd6b87cab569715ebd33e8102c552d101" + ], + "inputs": [ + "64194899d317e2a007f89df14538795547e927c242a92f83180e6cc952304964" + ], + "outputs": [ + { + "uxid": "eb446b8372559249c8e269b6cd028588e2e9e4f8fe9357719da9d1c22aa29911", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "5.000000", + "hours": 1 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 148, + "block_seq": 33 + }, + "time": 1429021674, + "txn": { + "timestamp": 1429021674, + "length": 280, + "type": 0, + "txid": "e89ee3e90e72108e4cd6ccb95c9f8d2b18ccfaa7ce61a7d297454debd69cebbf", + "inner_hash": "dac67377dd9d8247db41f3380288730de2e51514ec3a2986072719553b9f9e27", + "sigs": [ + "7df848876a507f4b2855818f059e62e6d2f5924af148607a0c6004b7231fdce920ac80e800a833e55cbce9938b5d8cb755b0dc434c22b03a5037972ff2d6444801", + "6499aeee3ba19247d1ef2d3ec13e46031adf0dd6a383785272776a93621f21696cf217b7375e5721e51133fc3d9806200d2aded757118fbe27a719ebf4ceaea001" + ], + "inputs": [ + "569aa1260e734017c4eee06d84ab4a6285e2ca2041940b2915d9141527caf179", + "eb446b8372559249c8e269b6cd028588e2e9e4f8fe9357719da9d1c22aa29911" + ], + "outputs": [ + { + "uxid": "e702df2703c3de180f3e4a0e9a503bd534037c2d68e858e97a317575c5a97d95", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 1 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 147, + "block_seq": 34 + }, + "time": 1429021994, + "txn": { + "timestamp": 1429021994, + "length": 220, + "type": 0, + "txid": "08bf0f8f4a8547bcab1fef035adac2a66c80369b4485a736bdd676e782bbb037", + "inner_hash": "8fd6f4e5428c170dede16e8c02596ab0c490dd5c418d003d9232d8c2caedec9c", + "sigs": [ + "f68d819dbda0bbf7cd5e2de8088267c5b3a744bbe2d7737c7dc52060b6344a25180cc1081e5c7dadab94763d158e303f697d1d275685b32bfd1de123a376697501" + ], + "inputs": [ + "e702df2703c3de180f3e4a0e9a503bd534037c2d68e858e97a317575c5a97d95" + ], + "outputs": [ + { + "uxid": "10998e83dc5dfe3c3f5f28ef3e5e2fced4dbd1da389678b0ea3ddb552851b6bf", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "6.000000", + "hours": 0 + }, + { + "uxid": "41c6d29aa5de770de684ab19b40bd75b99ec7f1a5ff7d15288ae4bfff568eabd", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "4.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 146, + "block_seq": 35 + }, + "time": 1429022034, + "txn": { + "timestamp": 1429022034, + "length": 183, + "type": 0, + "txid": "3170f0635cc40aded3a38f84f2ae07bd2238550ea4ee867328d0f891ea9abf14", + "inner_hash": "1cebcd96c2847d219b658733012921d6e10a6c55439736833dd0ae97b898f72a", + "sigs": [ + "179826a9f244005b2b34d145948b178533805953adff8ab924a6fd67538daaa4384d67a24473de6bb01d441e4d979e520b055cd9304188d00255eab7c04bf45701" + ], + "inputs": [ + "10998e83dc5dfe3c3f5f28ef3e5e2fced4dbd1da389678b0ea3ddb552851b6bf" + ], + "outputs": [ + { + "uxid": "9e5779445f60d62b471862339d7a83dd8355c7a89d5fc3b751f98e9414628ec2", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "6.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 145, + "block_seq": 36 + }, + "time": 1429022064, + "txn": { + "timestamp": 1429022064, + "length": 280, + "type": 0, + "txid": "fba515a9eeaedb891c4dca862bd06108e0452270890b362f0b353b4c86845618", + "inner_hash": "3c24f665a7a02308fe6938ef3ce7e38dfe72644b1d71c5aefbe3d6844c609d58", + "sigs": [ + "faf14290ac158576f0dd4311ee4835a2542ae8b52d9ec7ab36d1af938a117f382c42855dec9b980f282e7ff8d7e19d469b084a7d44e38022e246c365368cc07d00", + "52cfd88d334818382413dfa45dd8e00a2136c352b7547dcf97894bf3eaa152cc5b10bf9f35c4dc8c75e7bb62543bd244a7c1de588b2a606aa1eb0b32c9c4ca1501" + ], + "inputs": [ + "41c6d29aa5de770de684ab19b40bd75b99ec7f1a5ff7d15288ae4bfff568eabd", + "9e5779445f60d62b471862339d7a83dd8355c7a89d5fc3b751f98e9414628ec2" + ], + "outputs": [ + { + "uxid": "d46e91fea3c8a6428885f941e5152dbc7f9abd356ad4d054bf20e0e806f1ec99", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 144, + "block_seq": 37 + }, + "time": 1429022094, + "txn": { + "timestamp": 1429022094, + "length": 183, + "type": 0, + "txid": "9fb039cd90a4e9b85669bd6ef878b98a9e84eec7d4804e2bff6f0dc9c2739c44", + "inner_hash": "5bc5636489d4ba7d36b4429cd3ec71491c9fa6f442fede1ea696428b574e0d13", + "sigs": [ + "3127749c2123db967563b9726cf5d6daa3ae755ec74f5e5fbc3dcfb10ececc231f5d61de693355aa5c8ade13c4c31ddc3bf9864e87139fdcd64c513702f7425600" + ], + "inputs": [ + "d46e91fea3c8a6428885f941e5152dbc7f9abd356ad4d054bf20e0e806f1ec99" + ], + "outputs": [ + { + "uxid": "2987e7c89d353ad5d63cea2bf2724dc5f7a5ef5fb81f5ea160a307f0726ac2f5", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 143, + "block_seq": 38 + }, + "time": 1429058484, + "txn": { + "timestamp": 1429058484, + "length": 220, + "type": 0, + "txid": "a76cd63b71f1f5425941cd567627e1dcdc8c34306a7945ea48755f5a46efb6f5", + "inner_hash": "39c3ed7f2dfb26d02c9fcbbe853db5c3031644b4a66844a717d8795c6d954d65", + "sigs": [ + "844af158e935a38f034778a78b646a167b5758df65212546f2eb1c7e838216ad7aa6e7571d1e81d8836808d4315846fe97489bdf2e6d2159a2af77a15a9a2bcb00" + ], + "inputs": [ + "ad742bbc7420c08881e6ccf35e34e8472c0dd6386792359aedcfb752ca618c33" + ], + "outputs": [ + { + "uxid": "108520145179c00f581d91e273714811fe6e82ee059d65218eea91154ebd8205", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "998790.000000", + "hours": 389245 + }, + { + "uxid": "f48432d381a10abecbd1357d81705ea922246e92170fe405d1a4a35c5ceef6a4", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "1000.000000", + "hours": 389245 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 142, + "block_seq": 39 + }, + "time": 1429058494, + "txn": { + "timestamp": 1429058494, + "length": 220, + "type": 0, + "txid": "c38b47bd576e3bced2a9309c3df7622064e71177f54020d77193d5cac310719c", + "inner_hash": "7f02ba6476946668f3adcbb35e113531e6788cee4fe94bf8d8da4803e3baa7e3", + "sigs": [ + "2a31eb55da895c59654ad3f1a11efa11b04787ab78dcf8221aeeccf137adec543765f761363390c97f429310fcb39db305494a94b30af906a2d43d5de1effbb701" + ], + "inputs": [ + "108520145179c00f581d91e273714811fe6e82ee059d65218eea91154ebd8205" + ], + "outputs": [ + { + "uxid": "e79c94aa7013c7611901839236b8a1cdf70e8ef7c40b9e33f99359136de981d6", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "988790.000000", + "hours": 48655 + }, + { + "uxid": "df5d6e09da2585a6ac1a37aea2370fa25e9049b549049202d5417138bf033cfa", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "10000.000000", + "hours": 48655 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 141, + "block_seq": 40 + }, + "time": 1429058514, + "txn": { + "timestamp": 1429058514, + "length": 220, + "type": 0, + "txid": "b56f3e9239da5c5f9bb5ca80226b8454ba36ce6012f8e323a50c9d9c4eb4a834", + "inner_hash": "bdcf8f2f2b960cfee6b3b1124a554ef4747fe43ac9452d897bd8dedcd643e1ae", + "sigs": [ + "809029f12d5f38906306610feae26c0623bffe63218c8019060ae2d164cc29352066efd20567e3c37837230e74b481730b0fc71bcafe3b3b9f5eb4a7fb42f69101" + ], + "inputs": [ + "e79c94aa7013c7611901839236b8a1cdf70e8ef7c40b9e33f99359136de981d6" + ], + "outputs": [ + { + "uxid": "c65a9e6aa33244958e9595e9eceed678f9f17761753bf77000c5474f7696da53", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "978790.000000", + "hours": 6081 + }, + { + "uxid": "f8ad5c72e7822c7ac9a1dce8de583e34f6f830052bc0a02d749e9e81790dae86", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "10000.000000", + "hours": 6081 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 140, + "block_seq": 41 + }, + "time": 1429058524, + "txn": { + "timestamp": 1429058524, + "length": 220, + "type": 0, + "txid": "cf4fe76a08e3296b6f6abdb949604409be66574f211d9d14fde39103c4cfe1d6", + "inner_hash": "2f5942207104d52dbd6191684b2a97392e616b7fa51dde314dbddd58d34b8027", + "sigs": [ + "b2b8c8ec1e1dfdeac4690e88d4ef9fcc4b52fcb771153f391cbcb58d651505a94c6263b6dc15a948c0396c0d8be20d9e0d1993b494bd9189c778d3673363bfc401" + ], + "inputs": [ + "c65a9e6aa33244958e9595e9eceed678f9f17761753bf77000c5474f7696da53" + ], + "outputs": [ + { + "uxid": "195f5e50b4eed1ec7ff968feca90356285437adc8ccfcf6623b55a4eebf7bbb5", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "969790.000000", + "hours": 760 + }, + { + "uxid": "6bbf13da052e1baade111ae8bb85548732532c8f5286eba8345d436d315d1c93", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "9000.000000", + "hours": 760 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 139, + "block_seq": 42 + }, + "time": 1429058594, + "txn": { + "timestamp": 1429058594, + "length": 317, + "type": 0, + "txid": "0e91a08561e85a36ddf44e77b9228f7d561c18c0b46d19083d4af511085b697e", + "inner_hash": "d78230e22b358d7cc8d491adb3c0ec1e77a5170602a4ec92d700c4b4bb101f98", + "sigs": [ + "17ba9c495e4d396a37eaf062e1806a13b3bdc91a83151c2455cf948a7e6d91882dc02ec6443970517f0f7daf59ce9b89658a17f5d51c0cbc18056811d0f3006501", + "e4e8f28801fe461cc8097b29cfe1307739bdfbdd6b20c31e04eef89aede641a6407fa0c41b0ad5ef167e3255e1916c0bbd358ffd70f34dc7944ffe67514bc5f501" + ], + "inputs": [ + "f48432d381a10abecbd1357d81705ea922246e92170fe405d1a4a35c5ceef6a4", + "6bbf13da052e1baade111ae8bb85548732532c8f5286eba8345d436d315d1c93" + ], + "outputs": [ + { + "uxid": "19efa2bd8c59623a092612c511fb66333e2049a57d546269c19255852056fead", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "9000.000000", + "hours": 48752 + }, + { + "uxid": "9953e00abe05db134510693a44b8928ca9b29d0009b38d9c4f8dcdedee7edc35", + "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "1000.000000", + "hours": 48752 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 138, + "block_seq": 43 + }, + "time": 1429070374, + "txn": { + "timestamp": 1429070374, + "length": 414, + "type": 0, + "txid": "d368fc3112b522c52a5b191981ca52678cc7db29bdc3493cf551be88d109ef9c", + "inner_hash": "acb0cc7def6ebcfd45b1490aa60d6cb84fc3621bf34be5ab84910a1929efccf5", + "sigs": [ + "9d1fcf32769b70f2eeb88b70434010c5ac5844031d85c515f7854b0aa5b91de7035f4fa3802ebcc6a7e064b4ebf16be5b1ed9a85b31bbb46ceb11694e14648eb00", + "40303be55ccfaef337b8810405d522c2a32a4d86acc5e474626666f3999533b55a33c546b04472e3d10a7870e0435968ce88ac7fbea6fecb8617a680957752ce01", + "3c1d5a5e076cb1274fb478c6c3bd4e0f724106f71edbd16eed7e2b13aabb69a53f7e91df5af8c611ffd2ca9114cd4d4be7df70ccf541606c781af41f986ea51700" + ], + "inputs": [ + "e3e95cd390c42d2f08e2c173135620e09c7a2ec1cf80ff75fbc3940fa5712b3c", + "7f44d7ef014419278137cbaa344cb550fc3c07355ec619d917bea3bc15fb8817", + "61c61dfe5b82fde557a698b402c82ac0205929478e705cbadec7f5d47a51d403" + ], + "outputs": [ + { + "uxid": "88162721a552b1422546024772fc822faa187e897754e0a579e5e4a92a7cf4c9", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "55.000000", + "hours": 265 + }, + { + "uxid": "e64fa1f60e905f1d7b7a8f0ca134ab2b7a467f7363ec9c03628d559e1230eb68", + "dst": "2apVG7f24ezDK13yCDTqBWYrTZpuj94KnCN", + "coins": "5.000000", + "hours": 265 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 137, + "block_seq": 44 + }, + "time": 1429070414, + "txn": { + "timestamp": 1429070414, + "length": 220, + "type": 0, + "txid": "ced30c4ac3107997efa90faa40c8baed47dafc8ddb4feae3ba21275401c36280", + "inner_hash": "f3a57ef9c95bf41b758b317169e29596448640aad207b88a21b45b1ea46e9a99", + "sigs": [ + "fa16091cb778d496199d0b59f934d38891ff0b3aad42be78565a4f5a9880b9063a8e423fa7dacc624e0ffb01931bbdf4bed0fef8044f9280c8cd562b2f3bb0bd00" + ], + "inputs": [ + "88162721a552b1422546024772fc822faa187e897754e0a579e5e4a92a7cf4c9" + ], + "outputs": [ + { + "uxid": "73ad63090201c13e6fb55d2e51ec5606fe49a40640bea995e347e7389fcea6c6", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "50.000000", + "hours": 33 + }, + { + "uxid": "85fcb22c416b7d430076bb80a324734cb97483cb4544192df252b89ba8f7fd61", + "dst": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "5.000000", + "hours": 33 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 136, + "block_seq": 45 + }, + "time": 1429071074, + "txn": { + "timestamp": 1429071074, + "length": 220, + "type": 0, + "txid": "df622e8c9dfaed1d7dca83ad7f6d8946bb86b81398bad521d858cbefef8e4688", + "inner_hash": "91ab4f29d84e9ffba56a108e01984e7b483729da4e61b6976c018fa11ace36a8", + "sigs": [ + "d0726d81cb1cdce6028668d0d95ceccf39cc9d655a7bff143573b9f52d0586232bbb7bd494df8b9bb5155a271446cfaff1550d5ccf314dd35f044226f98d14e201" + ], + "inputs": [ + "195f5e50b4eed1ec7ff968feca90356285437adc8ccfcf6623b55a4eebf7bbb5" + ], + "outputs": [ + { + "uxid": "cb8efc0b1082c39258cb6efd59f64d88b36fcb60143c826829fc5f0ed5c0d668", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944790.000000", + "hours": 400470 + }, + { + "uxid": "4aca4c715985da352bd9aa84787868dac4f4e305c420fe79e6f05acee3bba14a", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "25000.000000", + "hours": 400470 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 135, + "block_seq": 46 + }, + "time": 1429077374, + "txn": { + "timestamp": 1429077374, + "length": 220, + "type": 0, + "txid": "0a2da0489b14156fad8fb863d051a4dac1f645f144c1e5bb65a44478623b8e4b", + "inner_hash": "787ae7cb222a23641bb33751d1428dc8e07a2f2cf11ee6293a54100836209d09", + "sigs": [ + "9bc3b6d7cb1d66d52fc993d0799baafa1056992049fa86ce76d5909690e88c4a19920b69e2463cf34d1dddb545b61ee38fb2f9b33f92626da8afdd934c353c8e00" + ], + "inputs": [ + "cb8efc0b1082c39258cb6efd59f64d88b36fcb60143c826829fc5f0ed5c0d668" + ], + "outputs": [ + { + "uxid": "a6061defc41a8a55e37eaf56ebaa1177446f61719b1d5126698e79a6023f5367", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944780.000000", + "hours": 50058 + }, + { + "uxid": "a52408daa8ce7026c70b61d4df4212fb577462060f340bfce779225b3e18193d", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 50058 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 134, + "block_seq": 47 + }, + "time": 1429077384, + "txn": { + "timestamp": 1429077384, + "length": 220, + "type": 0, + "txid": "a4a202bc4431d95c307d151dea764bfc6d9ceb7e82b3eb50dc8604050622a22c", + "inner_hash": "836145a3e62a7e055acc3404c1fd6ecb237e3251e6f8b39fd526a7f48f21daa8", + "sigs": [ + "f826793e63a3b0b837070e8876461c47af6be7a6898c370c70430b1491457cda76fc3b34e08bff41a336277ec1e93cc008f9c08ca295b418488b1ac92a5f5a4000" + ], + "inputs": [ + "a6061defc41a8a55e37eaf56ebaa1177446f61719b1d5126698e79a6023f5367" + ], + "outputs": [ + { + "uxid": "3b5f72e772ea886dd872b9087395398133576a6561072d5294fbcd04b49e1d95", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944770.000000", + "hours": 6257 + }, + { + "uxid": "dc73aac74348dd285a1456c1fae2204d7c2039d50a765bdaae0c31f7c7e059db", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 6257 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 133, + "block_seq": 48 + }, + "time": 1429077394, + "txn": { + "timestamp": 1429077394, + "length": 220, + "type": 0, + "txid": "4e6b363423633ad51114b250478ee7645fbd184066fa41c29e5b14d0728cdfec", + "inner_hash": "8cf88a9e5140d5e01af412c956b3de7c93bfebbb4c5993b9b0285812208f5b33", + "sigs": [ + "670abb369c25a655b0f22c069a9523d439b8a03d122bc9f0861aff796ab965fd5e1b79812b6f458ebc0a1cd4cc223d0137eb22e1bf1cbb40265ac7301018897000" + ], + "inputs": [ + "3b5f72e772ea886dd872b9087395398133576a6561072d5294fbcd04b49e1d95" + ], + "outputs": [ + { + "uxid": "f265bea876ffcfb8cf64df3aca4dae4a8d7f424ff495d91fb322feddb3a7e505", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944760.000000", + "hours": 782 + }, + { + "uxid": "e4e375b9dc55ff53d6de9120f1a87ff00e00a779835f8320f2c6b3090d0466e6", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 782 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 132, + "block_seq": 49 + }, + "time": 1429077404, + "txn": { + "timestamp": 1429077404, + "length": 220, + "type": 0, + "txid": "edc27c6ecc1f76d0f23489ad7bbbdb8c653af37cc4b8f18197400aea2011ed83", + "inner_hash": "5432e686f984075091a8d3686d959b63ef620382fcb2b86794ba8dc0fb9656e7", + "sigs": [ + "c1902b37a95c5327b0e5a1f05de551d4135831b787c86562867344ee7f06235374dc1618c6b4a8e077041723bc731db72dab5554a808b1ba77d305309144bf5e01" + ], + "inputs": [ + "f265bea876ffcfb8cf64df3aca4dae4a8d7f424ff495d91fb322feddb3a7e505" + ], + "outputs": [ + { + "uxid": "e6d9b56e075a6adf520d1ae7fbab9ae06353ae0b93dc8cb17d82cc3628009a50", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944750.000000", + "hours": 97 + }, + { + "uxid": "d11b05345917d171f60c31bd2634041b73b97eae364724369ddb8d53369397fb", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 97 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 131, + "block_seq": 50 + }, + "time": 1429077474, + "txn": { + "timestamp": 1429077474, + "length": 220, + "type": 0, + "txid": "be27621ad46680b343cc1406f5c6a1717704ce169e988ed7afb586f8112ae6f0", + "inner_hash": "158b0ca1e5055c4abb6729eeb187d9fc592c425c8f1eaf07c3d64e17e1d1615d", + "sigs": [ + "3624a41ca94d80e7f13ea09f3acdfd701b9425af1a43c62e08a98744f31c651b1f9d2183c35f64aea01431e1c0c3a12d2f63d2c88ff9bd1a124b895a4bfabc6b01" + ], + "inputs": [ + "19efa2bd8c59623a092612c511fb66333e2049a57d546269c19255852056fead" + ], + "outputs": [ + { + "uxid": "5fa90c22a26ecec8c03696a018b590a5e1679efa9cb5e8263facf9bcc6628db6", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "8000.000000", + "hours": 11972 + }, + { + "uxid": "5afa88b6a9ef9168d15d9a0bbc87dd5ab30badc01773460f92703a9c829358c0", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "1000.000000", + "hours": 11972 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 130, + "block_seq": 51 + }, + "time": 1429077484, + "txn": { + "timestamp": 1429077484, + "length": 220, + "type": 0, + "txid": "814694a8e32f1c81b627f8eb704622c8893d197bf32bbd7e1bf73bec9a831d7d", + "inner_hash": "10daee0ac47006149435adf9655dbc8796eece3d075f93af9810b204f90003ab", + "sigs": [ + "9cfad1cc126d0b33d6e44b5cf99672c0bbb088dd2ed01090365292d4ba1c188f18772aacbc7931e81202c11d7eb977a8f00bae86ce5b40479482bbbd883dfcaf01" + ], + "inputs": [ + "f8ad5c72e7822c7ac9a1dce8de583e34f6f830052bc0a02d749e9e81790dae86" + ], + "outputs": [ + { + "uxid": "f37efd851f76854852fdb8b8ba9afa2c5b7859315cc1fd12c12bf6831c59beb2", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "9000.000000", + "hours": 7343 + }, + { + "uxid": "2f4daff744e7fd81ceea34ecfb0e383a65ecda1c55f32a0bef313d29b0795eab", + "dst": "2acnXsnJ2k8jxiUahtBe8h4xouPAnpbwwjc", + "coins": "1000.000000", + "hours": 7343 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 129, + "block_seq": 52 + }, + "time": 1429077494, + "txn": { + "timestamp": 1429077494, + "length": 220, + "type": 0, + "txid": "231254039042675300dbdd61a6ca54941214e383b5f6380323f848482b4f4628", + "inner_hash": "ddddc962f9ad468e32f141dcf8479e2ec2293d42a32b2085fbaa0b5e9f80a267", + "sigs": [ + "7cb704180d085d04db6816852111cf3dad3c911337af4e22596c42efe77a45983539abe92b0f08993559f87ac2e4ddb907e46c36c6a746920f2fd0c89b0b7fc201" + ], + "inputs": [ + "5fa90c22a26ecec8c03696a018b590a5e1679efa9cb5e8263facf9bcc6628db6" + ], + "outputs": [ + { + "uxid": "e4fa8fe06d04bb438323f295eea23535856be08b369be71a2ce3e9e7bc0b1e09", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "7000.000000", + "hours": 1499 + }, + { + "uxid": "cec910b5d672e216db306389dc9ebb08f9d37485fbc3ac6aa7a8c37f60be844c", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 1499 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 128, + "block_seq": 53 + }, + "time": 1429077514, + "txn": { + "timestamp": 1429077514, + "length": 220, + "type": 0, + "txid": "d154d8262abbf517c67d529b0fea7cdf097433bd296d5795b17c6379cb1b1430", + "inner_hash": "b69070b10e6bbc276bf155361d7f3238fec46b9d865075c1dc0fc20d81ab0a42", + "sigs": [ + "0a4b7f385a164f5718794382d49c14a6623e7af5f1ddbefe4871c756b754457a7075e822603bd3b22b313278abebe756be92367ef7a81a8c4adf992842c2058601" + ], + "inputs": [ + "e6d9b56e075a6adf520d1ae7fbab9ae06353ae0b93dc8cb17d82cc3628009a50" + ], + "outputs": [ + { + "uxid": "2df1e88589be43c55d7c6c3dbcbd663fb759b3245eb8d86b0b9cdaa989556aea", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "943750.000000", + "hours": 2964 + }, + { + "uxid": "c7919b892eeb751456d456b37ccde7350a3fca0dda03b17ec426a56f12dcf192", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1000.000000", + "hours": 2964 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 127, + "block_seq": 54 + }, + "time": 1429077524, + "txn": { + "timestamp": 1429077524, + "length": 220, + "type": 0, + "txid": "88d239f2584c78b73a1905fd0dcce3beabfdfc5a9c54518862b009e22e972c68", + "inner_hash": "bbb61ff8c3b3361e77eae47d4a65c4073e45ded96994efbe605fa7639486b2ba", + "sigs": [ + "c627aa6233c7bc436f7569399554ead829bd21244cb1f938cecde96b493d1ac84099844dc91bbdcf72593285c33f124dba2d3aa1b7807532d647484492b8760900" + ], + "inputs": [ + "e4fa8fe06d04bb438323f295eea23535856be08b369be71a2ce3e9e7bc0b1e09" + ], + "outputs": [ + { + "uxid": "f5beae016bda8260218fc05468c300fa71ddd46f4c6337fffac8d83229461f5f", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "6000.000000", + "hours": 192 + }, + { + "uxid": "470b293870b663b84e1f677e1bc0e486d0b5f412b0562b078a7a1045f7785d7a", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 192 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 126, + "block_seq": 55 + }, + "time": 1429077544, + "txn": { + "timestamp": 1429077544, + "length": 220, + "type": 0, + "txid": "374f01de8274656147be0a23ccc5677773da6f32b071ee796bda0851b6dcd2ac", + "inner_hash": "1789978d61189b7e49bea67d8a1d1f0341da0242cb0b801c4d8bc346ec2fd618", + "sigs": [ + "f706829ee37d3f4467aae6341bd20c0455ae172a947ca372028db7f9b1dd2d7a4123b109eba8d4add2f695f6a7aa5806840551096f5357ce09be55e1877fb70c00" + ], + "inputs": [ + "f37efd851f76854852fdb8b8ba9afa2c5b7859315cc1fd12c12bf6831c59beb2" + ], + "outputs": [ + { + "uxid": "298fabb8217a2b0322f104b0cb295383bfdbc599d6a81e07610e0922eb99f89a", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "8000.000000", + "hours": 930 + }, + { + "uxid": "2f1de81eaa83eda52d8eaf44b12599b23134a38b7d55f67de8881ddafbec278b", + "dst": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1000.000000", + "hours": 930 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 125, + "block_seq": 56 + }, + "time": 1429077554, + "txn": { + "timestamp": 1429077554, + "length": 220, + "type": 0, + "txid": "8fba29db2e3e8cad785e723f95aa5fa46ae0dd8b2bb62586977f20e698642cfb", + "inner_hash": "dc25f33c3b93678ccc3449a318d55782a274c17cd2f45089018bd7c55b21dd96", + "sigs": [ + "6fbe79a6f32b242f97f7e7662e6f7eb5aff065e8063864fc52159071005ffb2570c26a2d8b21a7826cf18c15f4f4ed9b718a7a9fdf1b4d5ac63bdb632452c82401" + ], + "inputs": [ + "df5d6e09da2585a6ac1a37aea2370fa25e9049b549049202d5417138bf033cfa" + ], + "outputs": [ + { + "uxid": "3d7dd4d41e613fe8153f5e5f62b79494e9db9ed98f875d929ca1f90ecfe2d50b", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "9000.000000", + "hours": 12696 + }, + { + "uxid": "9e53268a18f8d32a44b4fb183033b49bebfe9d0da3bf3ef2ad1d560500aa54c6", + "dst": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 12696 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 124, + "block_seq": 57 + }, + "time": 1429077584, + "txn": { + "timestamp": 1429077584, + "length": 220, + "type": 0, + "txid": "61a33b49e97bfe2d5f026bf45fae43a1b9bdf08c60ec8db017da720a69790c7f", + "inner_hash": "32d2dce8e8043e544b3cb2145b0bfb9d4cfdb7ae8e20437d075f76b75d8e088e", + "sigs": [ + "990bf0a8c74b0b4c4d05f463a0a50e311a6ae27b5d327dcb906bb6e42330709d48998eed6e7cbdf35caeab6d90fac3e56fb222032aefa7b1d4d9c7653aca9fe600" + ], + "inputs": [ + "2df1e88589be43c55d7c6c3dbcbd663fb759b3245eb8d86b0b9cdaa989556aea" + ], + "outputs": [ + { + "uxid": "c5150380691c542b9bdf4cf2280ac612e0576c349f99d47d0a03c77eedc48731", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "942750.000000", + "hours": 1681 + }, + { + "uxid": "3b9059ec909faf64d652dae78944f4a2737df95a3215bf98e2ff33e02e2b377f", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 1681 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 123, + "block_seq": 58 + }, + "time": 1429077604, + "txn": { + "timestamp": 1429077604, + "length": 220, + "type": 0, + "txid": "5d1cb86b48c8834c8c12fc36a83259609300f2f6a148faa1492a473cee21bc02", + "inner_hash": "34ee80da7f19e17ab8b49569ad514135f6e6120c67288c8f613b758b9db8658c", + "sigs": [ + "228340c209abeb45fe25b93bfccbf08cc4faa1abcd89c95bf0332de0f9846f642c68fb68f49f4dfe6ed556c2e8b86bab6127d47de518179ad467af637e264c7d00" + ], + "inputs": [ + "f5beae016bda8260218fc05468c300fa71ddd46f4c6337fffac8d83229461f5f" + ], + "outputs": [ + { + "uxid": "53ea8733d94ae54bade0b55df03a03b3c0f6e6683b9260c36b14e3fc311d6f49", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "5000.000000", + "hours": 36 + }, + { + "uxid": "d58f3facfb4c9c9459e6fae3000886acb2b1f81322725cdc32cc09a49bb81e43", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 36 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 122, + "block_seq": 59 + }, + "time": 1429077614, + "txn": { + "timestamp": 1429077614, + "length": 220, + "type": 0, + "txid": "4ce860140dbb5f90f39086b0c51323005145a95b365204bd33e3d90fbdc35f51", + "inner_hash": "d81940dc03cf3fa1fd3eeadb84ae46e472bf3e281754a79eade7029b5ae1f639", + "sigs": [ + "dbc7327f85a323193b59dde59d2656c8dfeb2b94c40dd01ca70f379d14a7b9123473b7cdf38df1196b55f2c01c4a31ed1c9ba7d75f6670deef3b9816656add2d01" + ], + "inputs": [ + "298fabb8217a2b0322f104b0cb295383bfdbc599d6a81e07610e0922eb99f89a" + ], + "outputs": [ + { + "uxid": "1efc8693845733061e1407a74e86976a52a69c63a14d6a79e1f3e45277662900", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "7000.000000", + "hours": 132 + }, + { + "uxid": "53d7b4778ee9b9537c0439666ca124d81bcaf4195d080ef61fade8c3eae6322e", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 132 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 121, + "block_seq": 60 + }, + "time": 1429077624, + "txn": { + "timestamp": 1429077624, + "length": 220, + "type": 0, + "txid": "77a69f4c8afd858a2f6767bb9980d4af6520e02b076bf2a78b935021e1147c71", + "inner_hash": "65f97c460ed99ea47ea2cdfd0780af2338f78d80bff93b92dc2ccc8f2411abec", + "sigs": [ + "7c32e34864bc9659222cb26f10058df5cf2fe0c7b78b1d067a7b5af80f4a2b146f8914f4424d9e80a3303d3d2531ddf9d60489011c607ecd5f92cefa5105eee501" + ], + "inputs": [ + "3d7dd4d41e613fe8153f5e5f62b79494e9db9ed98f875d929ca1f90ecfe2d50b" + ], + "outputs": [ + { + "uxid": "77769e6a01cf3dca201ade501767d0abf20dea19d694f3272b647a9a651fdee9", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "8000.000000", + "hours": 1605 + }, + { + "uxid": "0560bae3917bca7581af9b6c5a58e395c701ce9ed0241dac2de8a3e93c0b839b", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 1605 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 120, + "block_seq": 61 + }, + "time": 1429077654, + "txn": { + "timestamp": 1429077654, + "length": 220, + "type": 0, + "txid": "4aeafd20b9df56ec852a2c257ff1630b9530d8375a4e72f20238ea36835f76d5", + "inner_hash": "bc6119c006f7c54c8608cc8050f47c43e6c079397f607f8c9e90d3072a10eca5", + "sigs": [ + "0309322d16d48a35bd42c2ae6a76b240b21974d073f81f440e04431941fc9d550de92dcbcb226ad3baae2b3cbae51db28b2dc8d3e1b51cdd559cbbb6e4b71eda00" + ], + "inputs": [ + "c5150380691c542b9bdf4cf2280ac612e0576c349f99d47d0a03c77eedc48731" + ], + "outputs": [ + { + "uxid": "9bbb8d620aae3efc7c21bb7d6a7159eda441a83e0fef2cd98f8240b38857d648", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "941750.000000", + "hours": 1519 + }, + { + "uxid": "2480aeed2dc47c692e4bce61fb3ee44c4992ea39b0a167235e501330d7ddac62", + "dst": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 1519 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 119, + "block_seq": 62 + }, + "time": 1429077664, + "txn": { + "timestamp": 1429077664, + "length": 220, + "type": 0, + "txid": "057ae2bee6e1fc2c9997d48aab3e348a7f17ad0305d6e6a14f4f663404b4a00a", + "inner_hash": "7b253041d4c467262bd144354f1584fc37b1b3a2934b0230919838e60a4320dc", + "sigs": [ + "7587f95e4036b310ce3bafbd1248ae62210120c14c2569d358f0f1363120626060e0797c9728a2cf3cef7839fa6e9d42d31ca899cfab82fa3eb8a0401c3cb8e301" + ], + "inputs": [ + "53ea8733d94ae54bade0b55df03a03b3c0f6e6683b9260c36b14e3fc311d6f49" + ], + "outputs": [ + { + "uxid": "83b5fa4051dbfd50ba903374e5e583a9345c6a980505ee56963de9bd8e539e36", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "4000.000000", + "hours": 13 + }, + { + "uxid": "b9853ab091bdb295de20d765e9bce2d86870791a6a15b8ef9e9dddb71c4cba95", + "dst": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 13 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 118, + "block_seq": 63 + }, + "time": 1429077684, + "txn": { + "timestamp": 1429077684, + "length": 220, + "type": 0, + "txid": "8d10b0ba11d9dd63d3a3522bc35bd260e8da9109298aa488355ea7201eb961b7", + "inner_hash": "929218d56de3e94d277827c857a657ef8b1352f75e6938ff5cf10ac4c54d4039", + "sigs": [ + "6c8892c3277b90f5ca71a42515706de993c459f094282fa99168359f00c5cb862811c4225cc1448e99ba2755e9f9eb241ad0df25b20f1a6ec035a673cf42ab2f00" + ], + "inputs": [ + "77769e6a01cf3dca201ade501767d0abf20dea19d694f3272b647a9a651fdee9" + ], + "outputs": [ + { + "uxid": "f5867b05823c81fc53de36b140415b3b98e4f4cec5883512f8553f70c550d8e7", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "7000.000000", + "hours": 211 + }, + { + "uxid": "9011fbc6e82dce0656e7ffc76afb014d2ad70aa4663e7b687d3212e12f8965e2", + "dst": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", + "coins": "1000.000000", + "hours": 211 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 117, + "block_seq": 64 + }, + "time": 1429077694, + "txn": { + "timestamp": 1429077694, + "length": 220, + "type": 0, + "txid": "29c229c97d27bcaf842a367520e1916fb855921906bddf4a3b0413ad3f11517b", + "inner_hash": "bc02dde29d200fa6bc0497f2ddd5e52007aef9b6482d40953fbd44ed88e3cf78", + "sigs": [ + "0674c0617c9e6109ca9af404d446777943bb6aaa5dcb223da63bff1a305498972735e0b2a601cc9c6ee2231ad5fdd025fb92cbb00e200860a2ebde924f76499400" + ], + "inputs": [ + "9bbb8d620aae3efc7c21bb7d6a7159eda441a83e0fef2cd98f8240b38857d648" + ], + "outputs": [ + { + "uxid": "25ad0d5ae6a1a9bc61c6b9099fb7829111977a59e1183de4227a0a5352555639", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "940750.000000", + "hours": 1170 + }, + { + "uxid": "47c74a6d7f1f54cf0a7ac45ec00277539079810068dd95a29a202c43780d65a0", + "dst": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "1000.000000", + "hours": 1170 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 116, + "block_seq": 65 + }, + "time": 1429077724, + "txn": { + "timestamp": 1429077724, + "length": 220, + "type": 0, + "txid": "e3b7236ad4b209d664ee1e2549f2a0d34a3ba58b12ee46f98fba73c01574e484", + "inner_hash": "30b5c520717641fa7a5b11c5340e6f239d1502d90809e919003004048582e8de", + "sigs": [ + "3c90ea0882c24e0e17f9f453f7777eba42aa5fea386f21f8f873969a0118d12f0a81169e3600d68026cbbe300b63568db468cbd931087eb0de8635a8453efe3201" + ], + "inputs": [ + "83b5fa4051dbfd50ba903374e5e583a9345c6a980505ee56963de9bd8e539e36" + ], + "outputs": [ + { + "uxid": "70dfcdd1a8a321ffd22c4ce313763464f78c2f85a97bb369ac8b82f76d2ea961", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "3000.000000", + "hours": 5 + }, + { + "uxid": "c2fcd55cf6b73e863c96f7c2d6251069199bfd43688d2515f5c6631688aadcbc", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 5 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 115, + "block_seq": 66 + }, + "time": 1429077734, + "txn": { + "timestamp": 1429077734, + "length": 220, + "type": 0, + "txid": "bbd1d4b6fe89a5986efbea9f7996cca2a515c3f0788cedccc21990dc78d83509", + "inner_hash": "f5b418d7156e6ad70bbde6d90be61d4ab2fce406890a3fe764ae2a43da12440d", + "sigs": [ + "1fd3e13f0e55364107d6916ab5002bcc434889e5f5355751f1f688ac469f336d09161f516770cc78f1ece3cb790a1ded56e25948a46546c8d521dea6b3141fad00" + ], + "inputs": [ + "1efc8693845733061e1407a74e86976a52a69c63a14d6a79e1f3e45277662900" + ], + "outputs": [ + { + "uxid": "3fe6b13824f28d69588c309278420069bc0efae95367d0d6f93cb40af15eeaa6", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "6000.000000", + "hours": 43 + }, + { + "uxid": "06292fe8a2036c38f28c4d2f355d9e86e2b55b9d85f84613a64cf5c35d192b28", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 43 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 114, + "block_seq": 67 + }, + "time": 1429077874, + "txn": { + "timestamp": 1429077874, + "length": 220, + "type": 0, + "txid": "42227683dd9c149859d0578ab300d8509d513afadf7834fd8ae7a321cc07d833", + "inner_hash": "a7a9ea6466bef6cd63f671ae5dd1aafbeb251a717c7da331d40ec376ad0e89ec", + "sigs": [ + "b4a141eb037a4debd99c347f337f67662a3feeb96112d7b05fc035a3556419dc3a9b35028327d925ca5eb9da018371bc333b7365f06ea22366169af6f066524701" + ], + "inputs": [ + "25ad0d5ae6a1a9bc61c6b9099fb7829111977a59e1183de4227a0a5352555639" + ], + "outputs": [ + { + "uxid": "acc75d51ff9f18a224d1ca0481917e2a67298de40955711cd97a08f6733b5b6a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "939750.000000", + "hours": 1452 + }, + { + "uxid": "8bdd2662d7ed495ff82daef9198ee23ac0c75417607675a8da3dd673952c0e39", + "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "1000.000000", + "hours": 1452 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 113, + "block_seq": 68 + }, + "time": 1429077914, + "txn": { + "timestamp": 1429077914, + "length": 220, + "type": 0, + "txid": "d803ab903f68f7861cd8eff93b3c097c5b8f6a697ca67bb01e7e645060839fd0", + "inner_hash": "611f096c50da1d98c29b8c9bdc6b7f7c98d96061ab126c66716f17a2fc495166", + "sigs": [ + "d264a023bc6986c1bf16e2e697f4df8b6e33ae2d4b1ddd4e207cb5f902fed54c1234c3ef2429d82507f5c10c0fb4320d753f3bf6b5e155fa3ec03bc91dd8206a00" + ], + "inputs": [ + "acc75d51ff9f18a224d1ca0481917e2a67298de40955711cd97a08f6733b5b6a" + ], + "outputs": [ + { + "uxid": "5c1069a3aa6628ed7f9bdb300bec1a7e7ca6fb4645528a8c6a27c167e7dfe698", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "938750.000000", + "hours": 181 + }, + { + "uxid": "3c56fa9d161783d6fe5c8b055c6d20bae27097e7bcc44d9ece5c94df182ee5bf", + "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 181 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 112, + "block_seq": 69 + }, + "time": 1429077944, + "txn": { + "timestamp": 1429077944, + "length": 220, + "type": 0, + "txid": "3bf485890e91268452dc3136c0b294dc9909b3aaa10b9c936743e6e9b1a56f61", + "inner_hash": "e952e5d86f3cff105dab78a455691c871f3b0fd09558e367833c4743339b94d3", + "sigs": [ + "632771f1bdae7454911dcb6462aee56827f949dae18e8a98168b57864a62333f4251e17efa15a53ec12ab6980ea72838e9bb0e64aad82ad9e6a0a2a33b3006cd00" + ], + "inputs": [ + "5c1069a3aa6628ed7f9bdb300bec1a7e7ca6fb4645528a8c6a27c167e7dfe698" + ], + "outputs": [ + { + "uxid": "8190fd31c005510d550c8a241b127fad2558c82aed9483fb4423193d5f4429e3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "913750.000000", + "hours": 22 + }, + { + "uxid": "5a7b2b6568cfa4ff5d44e98446aed92438ede0103b9994cfa3389bd02a35239b", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "25000.000000", + "hours": 22 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 111, + "block_seq": 70 + }, + "time": 1429077964, + "txn": { + "timestamp": 1429077964, + "length": 220, + "type": 0, + "txid": "f51e2ce31961b0186e04cc9d78857c3c21d3e2afb25c050d8c1d67d3320fcc07", + "inner_hash": "4a8b13ea0c8a993b3455a374e847bcbea7e7a20392c7cc169cbc41778e65d6e3", + "sigs": [ + "74f886780a9df8f6987c8c60bf5d9ad0fc25a502ba8f681188923d3a85f74bb87d57b067e53ed0f423ee7fbb352f3260e65c38e44cc7eec8fe8224374fd77cc800" + ], + "inputs": [ + "8190fd31c005510d550c8a241b127fad2558c82aed9483fb4423193d5f4429e3" + ], + "outputs": [ + { + "uxid": "450cd7795bb3625daa99d6b64b9a8786d593bf1cad986d6c2933dae04b74a593", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "888750.000000", + "hours": 2 + }, + { + "uxid": "9639a86df8da288fb0fc6a92fa086f3cd5a8387705a14ddd2aa5e30c6c3fc3fb", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "25000.000000", + "hours": 2 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 110, + "block_seq": 71 + }, + "time": 1429077974, + "txn": { + "timestamp": 1429077974, + "length": 220, + "type": 0, + "txid": "abed13c2a552633d26b5b51c3ac5abf9808756c0203869ed185a7cd673702ba2", + "inner_hash": "c176a1a85f716055a9e8060c2a4245db0d7f71f4ac5387d4a51d173db467150a", + "sigs": [ + "40e8340047f08afd483b2867166e15ae751bb7272a2c24f68ae8561d3619ea021363e987118a2fe516cacff1946d4d6c4c249038581ee2f58f8feea4bcffc3b100" + ], + "inputs": [ + "450cd7795bb3625daa99d6b64b9a8786d593bf1cad986d6c2933dae04b74a593" + ], + "outputs": [ + { + "uxid": "b44ee00208690c2123989f40edaff0224825afb20ca0952fbd90bddfd3213642", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863750.000000", + "hours": 0 + }, + { + "uxid": "22edb5931e1c54382f18e41ef774931efb08c278209a1fe8a34100147b707220", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "25000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 109, + "block_seq": 72 + }, + "time": 1429078004, + "txn": { + "timestamp": 1429078004, + "length": 414, + "type": 0, + "txid": "3872797c8f9964e6ad19552b9b88d2af07be32866bdb9b9c60aa7086f253af43", + "inner_hash": "5784542f1b1f9284f25c8d3995429e77b1c0cbdf4b1eeb6a1737f5f19b0b576f", + "sigs": [ + "cf51ea4b5631baaa43dcf258cf08f6f87fe4fa9afb2d081e7eeacf6be3b1239058e30d931d22d3befcbde12b51399b438cd8726670f10c0da3889bc08917fb5601", + "bfa55b86721bd2d92144e2108123cc33b62ef50da580fed9d6787cbcc1674f63761ef4d39592f060e98b415c22d272066c36f6499ceb5571b19b4eae1c3110be00", + "3b50522194013cf9ea2dfc387be85c79c7e2379c1936d654c14921cdcbbbaab047a2ab1e09f3a190a09d12f70b41d6428b2e171732630b6a74eeb269853a404500" + ], + "inputs": [ + "3fe6b13824f28d69588c309278420069bc0efae95367d0d6f93cb40af15eeaa6", + "5a7b2b6568cfa4ff5d44e98446aed92438ede0103b9994cfa3389bd02a35239b", + "9639a86df8da288fb0fc6a92fa086f3cd5a8387705a14ddd2aa5e30c6c3fc3fb" + ], + "outputs": [ + { + "uxid": "3a7e60306a5fc882d0c4edcb2990d14be6b80dad1a41b06f8ae5e0308078bafa", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "31000.000000", + "hours": 93 + }, + { + "uxid": "a96ca17d6af858af8c6f24f607a742ae2979ab8f660b8363b7fbe18625c8a048", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "25000.000000", + "hours": 93 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 108, + "block_seq": 73 + }, + "time": 1429091164, + "txn": { + "timestamp": 1429091164, + "length": 220, + "type": 0, + "txid": "a95317361364e8cc08a150840bac8a97ea1f56278f8834ca2a2f16c24c4a7f0f", + "inner_hash": "90c166e92a7883037f9634704923d986976ac814f28e4761309bf86d77cdb755", + "sigs": [ + "27ee3b614e5362462bc20c23e873e380b5bcc880053436a640286ead5fe2dcd00094e0eade532ffbfc8ba95d5e3540968b2fff64e19e0e772342aceb3c5d3ce100" + ], + "inputs": [ + "c7919b892eeb751456d456b37ccde7350a3fca0dda03b17ec426a56f12dcf192" + ], + "outputs": [ + { + "uxid": "7b132c07322babefa83ab64971b7bfb29bf2cb9ffe9c42dc7e2975a185dcd8b8", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "995.000000", + "hours": 387 + }, + { + "uxid": "8f52e126bbc359bc3bfd230d82649c3d1c622e8f9c20dae7ccd73bd0b4ee2bad", + "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "5.000000", + "hours": 387 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 107, + "block_seq": 74 + }, + "time": 1429091944, + "txn": { + "timestamp": 1429091944, + "length": 317, + "type": 0, + "txid": "edca397ceedb5fb4462b0aff8fe7f9da5091a4e68f11a34c79daf2c5ae7dd748", + "inner_hash": "873d38a9ff804dab8d83013a6e6b4132d0b0dde6439de24f2190ecd1d31f9ab6", + "sigs": [ + "0c3ca0de3f369e03859d710b18656c92c96b11b8c0e15e31b337293e59776b905f6ce7f91f7b3c9c268b6cb1673b8ef2ffe2dd7f059f7833b62284168bf2065601", + "7755689ff9c10e672b3311b1b69ed69ff82dbcc168683b75e77491c9d36f7a7f1ddd0801b5acbafb467baca8ab9f28cf7189be701bdf169749290ad4cb58e2a801" + ], + "inputs": [ + "9953e00abe05db134510693a44b8928ca9b29d0009b38d9c4f8dcdedee7edc35", + "8f52e126bbc359bc3bfd230d82649c3d1c622e8f9c20dae7ccd73bd0b4ee2bad" + ], + "outputs": [ + { + "uxid": "5f75082377566cf140c8f158e160ab6ecd1cdf02224c66865106fa1a75b39dc2", + "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "955.000000", + "hours": 7273 + }, + { + "uxid": "e2807345a3e76b7050038a9ec40d5a62bd4dcc6b1ed79f186213a32caf7008a1", + "dst": "j6pa8kdKqHbxRm2VXJVbzigQDFzqTVfvfq", + "coins": "50.000000", + "hours": 7273 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 106, + "block_seq": 75 + }, + "time": 1429096344, + "txn": { + "timestamp": 1429096344, + "length": 220, + "type": 0, + "txid": "3122b6b29ac470bfa18fbd1ef6d5ff76717e18ba25374215a5003557b4524f22", + "inner_hash": "f752c579e2f7663b3e13371c7bb94b09cb047f1cdb597bd52b79c8c81f557b9c", + "sigs": [ + "d12daa336401481611bf15edf07cfa0b181a1f3e2e8d062c6e8b04d690242cd87db5fd5aebda3bb06c49e8450c18c5c0360d6c4b14686cbb361feb394b5c26f501" + ], + "inputs": [ + "e2807345a3e76b7050038a9ec40d5a62bd4dcc6b1ed79f186213a32caf7008a1" + ], + "outputs": [ + { + "uxid": "ec41341d4c9d69e150079550a9051c4cb7cc3e2da49deb2c0faaa632cb1958f8", + "dst": "j6pa8kdKqHbxRm2VXJVbzigQDFzqTVfvfq", + "coins": "5.000000", + "hours": 909 + }, + { + "uxid": "ead07056919be961a9e812a7832356d806d551096284648756b3642a3d4a5570", + "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "45.000000", + "hours": 909 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 105, + "block_seq": 76 + }, + "time": 1429110544, + "txn": { + "timestamp": 1429110544, + "length": 317, + "type": 0, + "txid": "5369348d67b2dd30dd9164657e372304f81ea10dfe1914ba874d46cd659f52c5", + "inner_hash": "08a8ae61257645c212216e63a96673001fa581c286eaa4ddcb81f6ffaaff8c1a", + "sigs": [ + "75489dbb081962833ce1fffbc393f0040e5c75bf45564a3757573eba816b71bd63e8178eef8add2277864d6d251013b6197bd80efdc069b7c5adf27b0372703c01", + "4587b09d2e08de8379fd1505748ea21db3995f2dd18b04ca729f2ebf76c2645a21acc2e5ca5f4b79f6381b91ef21fe4bb72d2415b74f38fc1569b90233211c8d01" + ], + "inputs": [ + "73ad63090201c13e6fb55d2e51ec5606fe49a40640bea995e347e7389fcea6c6", + "4aca4c715985da352bd9aa84787868dac4f4e305c420fe79e6f05acee3bba14a" + ], + "outputs": [ + { + "uxid": "50386f195b367f8261e66e3fdfbc942fbacfe25e117e554ca1c1caf899345476", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "25045.000000", + "hours": 72043 + }, + { + "uxid": "9c3119ad3edbd17a2135cac6d24ef43c6d7e599710b2aab4e97e731e64c13acb", + "dst": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "5.000000", + "hours": 72043 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 104, + "block_seq": 77 + }, + "time": 1429147880, + "txn": { + "timestamp": 1429147880, + "length": 220, + "type": 0, + "txid": "29798149e90f6442489bcc3294f455441a5a401e81491ed06bdc2c850756f0d9", + "inner_hash": "23ab44d59346b369d258cce6d5142ca7e1b52dd09a1512d8a618e08ae7346004", + "sigs": [ + "6e0bd761d2d9eeb207f0c4cf9f13d1407f33b5f50e72c3462225c8041882ddcd078a02720d533801a433d917674e3d68a98bb997e9b06664a73a9bdeae46404601" + ], + "inputs": [ + "b44ee00208690c2123989f40edaff0224825afb20ca0952fbd90bddfd3213642" + ], + "outputs": [ + { + "uxid": "6060c983054614b8801e405de697c443a1edebd3236582f89f01c6cf6a165c3f", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "862750.000000", + "hours": 976817 + }, + { + "uxid": "08723ed501e11c2053bab6b500f820dd7ae2aeb4a3c9d5109845bb46afebde97", + "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 976817 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 103, + "block_seq": 78 + }, + "time": 1429147900, + "txn": { + "timestamp": 1429147900, + "length": 317, + "type": 0, + "txid": "c1fb9372439d7f43d17809afc2d1bc9b2aa81fa9fccc1d837c79e649ec4843db", + "inner_hash": "283b6b1141f7b09348804d18171ec9b0d20446725df1265932a4064385c9c295", + "sigs": [ + "d16d6a7cd11064a91a6ca4917efe946cc38cb4e7dd59281a4b4098e39bdc151036b72fbf9db4f3ca2b97bdb56a861e8fbe010e52926b176172d3e68b85c7b04501", + "5cd9b19556656a6914d2f8a3daf556220e34eb567a741f015a9de0d53920bfff0e0cb3513551ed7ad95301ac8852487b76a3509832379c57572b46e75f0946cc00" + ], + "inputs": [ + "70dfcdd1a8a321ffd22c4ce313763464f78c2f85a97bb369ac8b82f76d2ea961", + "a96ca17d6af858af8c6f24f607a742ae2979ab8f660b8363b7fbe18625c8a048" + ], + "outputs": [ + { + "uxid": "dbe677fec72761ed99467a4d45871aafe173d7dc133e8db0346e3f262ae2598a", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "27000.000000", + "hours": 67976 + }, + { + "uxid": "ce4ca78d810564568c936554d0b6c1a50d91b273648314ffa3fcc1b2d72ac334", + "dst": "sV8sVBgs11uHQtZK5MPbYem2iJ6Hehghv7", + "coins": "1000.000000", + "hours": 67976 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 102, + "block_seq": 79 + }, + "time": 1429147950, + "txn": { + "timestamp": 1429147950, + "length": 317, + "type": 0, + "txid": "2558a7cd524acdb58f822a56bd51e8905182b2b35fbfdb1246ce6dc9930d14eb", + "inner_hash": "37931a3c0b9fe54ebfd93e70c5e872ea8f68669bcd38176bc223be01f7e43aa0", + "sigs": [ + "1d2fa9d76a29f3ce2eda062afe42f3718db434863955ed4f43a83f79dd372a922fd2774d7f5227fa253c65537418b30309932f404e788db91fac1d580d83b28101", + "471ae24bbebd78b5d298edb81e07cc282ce8c1517a2d7426f91f177f111c93873c594e04a215bcd982220b0e6967bd328ec494811cf5eb854091e1d4552545e700" + ], + "inputs": [ + "f5867b05823c81fc53de36b140415b3b98e4f4cec5883512f8553f70c550d8e7", + "22edb5931e1c54382f18e41ef774931efb08c278209a1fe8a34100147b707220" + ], + "outputs": [ + { + "uxid": "09661724179523e8aec95862a5fd12dd1aa50f39f193f81eece0d7aea6197103", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "31000.000000", + "hours": 77792 + }, + { + "uxid": "2a886bcedf8862c351cc4087b89e902202b08b164363567a9be47908e938f280", + "dst": "pMub1Pz3SLVaSwHoomgp5oDVxdkVxLkW6L", + "coins": "1000.000000", + "hours": 77792 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 101, + "block_seq": 80 + }, + "time": 1429148000, + "txn": { + "timestamp": 1429148000, + "length": 220, + "type": 0, + "txid": "5db4378f5abcbb48774fc3731a164fb7bbdccf410c3ff829c5706e4d9ef1b1c6", + "inner_hash": "3e77cc0080eaa29331c9206044e731992369bf84c89262c80d68b39b68ce77e9", + "sigs": [ + "94e4ecd0016b2c5b10f55941cc0355a2c248eaa04566dedcf84e83cfee959d50578cb85ca0ee6170060e97a6fc766fa79a4f6e0942605681178d4bb8009b31e501" + ], + "inputs": [ + "dbe677fec72761ed99467a4d45871aafe173d7dc133e8db0346e3f262ae2598a" + ], + "outputs": [ + { + "uxid": "fa761f3b902ced1ad8e94231af3447315a8c8bcdbbdcfcd69bb74ca5ae66f6e9", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "26000.000000", + "hours": 8543 + }, + { + "uxid": "e16c0ebbfba61c49b0e98bf8336bc4d8a33ca30386c4d875bba2ec4bf4a59147", + "dst": "22WGCstVJGVyqnBuvGHt17L5aNNMpURvckd", + "coins": "1000.000000", + "hours": 8543 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 100, + "block_seq": 81 + }, + "time": 1429164440, + "txn": { + "timestamp": 1429164440, + "length": 220, + "type": 0, + "txid": "0cded82aa3ac92d78e23d2d0d7faf93c675fc9a321ad55105f65b6fca444b1e7", + "inner_hash": "0ca2ed02f9155bf69af2fd27b40b0300e0c9804cbd2507389d930ef186f48794", + "sigs": [ + "68a82ec4421a37b8116c8bad98d2568802973dbce6f0166b3a9504110ee4873239953c3e8baf3a20d599e300c8b2c524d672c46ed593e126adc908f1decbbf5100" + ], + "inputs": [ + "6060c983054614b8801e405de697c443a1edebd3236582f89f01c6cf6a165c3f" + ], + "outputs": [ + { + "uxid": "129726406b3101d51ffd5bfca59a501184d6c8ca363be4ef1b8d8bf48a6c70e0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "861750.000000", + "hours": 125696 + }, + { + "uxid": "3fe7d61ffa993e00200ce6be7ba347c603032ac3f8c4ace07767e630fe94d76c", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 125696 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 99, + "block_seq": 82 + }, + "time": 1429164460, + "txn": { + "timestamp": 1429164460, + "length": 220, + "type": 0, + "txid": "0ad2691de38a15ec31b0fbe9a0c1175138c9d7b7558db2f016a23619f3dbbc6d", + "inner_hash": "3b3cc2ad41e6248b46bd71e14f91eb2296b730426a8f0481c440271920ddbe27", + "sigs": [ + "e5711c06db00c26d91126e9d024189c1a494ae1357b55247955a4b3bda219e8905dfa03875c1224e754e5e8b4d475d1ce335f2699cd9d490583cd6a0d1e1338c01" + ], + "inputs": [ + "3a7e60306a5fc882d0c4edcb2990d14be6b80dad1a41b06f8ae5e0308078bafa" + ], + "outputs": [ + { + "uxid": "dc8162cf85ce1a434adebab2d13abffb587c0e50b86fd1a997bca67f07a66ebd", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "30000.000000", + "hours": 93050 + }, + { + "uxid": "9bfa6dd7ff610b2e8ba036594244e70d427398eab8607d39be0e45303d45d4d8", + "dst": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "1000.000000", + "hours": 93050 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 98, + "block_seq": 83 + }, + "time": 1429164480, + "txn": { + "timestamp": 1429164480, + "length": 220, + "type": 0, + "txid": "d80d49958166fd7b35cee63cfc4a4fdd434484f9bfd9444f62a1b856da36e9c7", + "inner_hash": "ddf70f29cbcb9ab5d04848c77bb605849c5d831c80afed10f64ea2bde710b7bd", + "sigs": [ + "21ccec8663f52b64e6d1983c5c715fc360ef1a01a0f4fce857fe7151e59b4cc87a5b6cc18f770eac98ef640eb15d572ea96b81e90a793bb01ac905778c10f0da00" + ], + "inputs": [ + "09661724179523e8aec95862a5fd12dd1aa50f39f193f81eece0d7aea6197103" + ], + "outputs": [ + { + "uxid": "6a8bc7ef9e8e7b67fd270cf37022edadb13f1fc2ba4e7a026f7ce2ab30cc4572", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "30000.000000", + "hours": 27495 + }, + { + "uxid": "a733e89023ccc12587d0849f9baeda0d2fad640c1cbe97e24ffc531859fd83fd", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "1000.000000", + "hours": 27495 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 97, + "block_seq": 84 + }, + "time": 1429164590, + "txn": { + "timestamp": 1429164590, + "length": 220, + "type": 0, + "txid": "8374d85130bbcf496bff138cd040f91fa362eb1b6b6a1c7c9285523437d5589c", + "inner_hash": "3188ba9148add7f2811180f130de2c0668fc21c031a7329993b61bfe35f860f1", + "sigs": [ + "93edab2b508cd33cd76c50a5aeabcbcf35472d25ba2b3f268d1cc0a4a813fbe907f4c0e645893b4efd524d30fabb6ba62d65c2ee050057885eea2ca0d2d1c21500" + ], + "inputs": [ + "6a8bc7ef9e8e7b67fd270cf37022edadb13f1fc2ba4e7a026f7ce2ab30cc4572" + ], + "outputs": [ + { + "uxid": "15700b88043b3c08a46c3c4e36e7f431291a26aef1ef26c44ee413feee14b950", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "29700.000000", + "hours": 3436 + }, + { + "uxid": "e2512ec90800147d0d9ddbd0778511ee5a45a25efcb354c50a101738a65462c5", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "300.000000", + "hours": 3436 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 96, + "block_seq": 85 + }, + "time": 1429164620, + "txn": { + "timestamp": 1429164620, + "length": 220, + "type": 0, + "txid": "b7b42b1b29acab0a2328aaf368ec74be49b4d4caf827e82b439ef4d8be976a55", + "inner_hash": "8b5eec10f63b31e72d4dba2c71fb0f7bc230e58f497e255352f02eee965d3595", + "sigs": [ + "82587c832f0c74f185603b934a32a28624712373d188caad0355314ea621a4af3e96dbd1c37e889f630d90047c79b39c495b49964eca20172bb900db1df48b3a01" + ], + "inputs": [ + "129726406b3101d51ffd5bfca59a501184d6c8ca363be4ef1b8d8bf48a6c70e0" + ], + "outputs": [ + { + "uxid": "05f42f22f5fea4b5cac8182dc2b4f280149c686434c6d4195a119a8d02ab24b2", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "861050.000000", + "hours": 20200 + }, + { + "uxid": "6e2abc4bc7820178358a603b7d99c4b39735dd1685d0c5a778ab63f29c9e93d9", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "700.000000", + "hours": 20200 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 95, + "block_seq": 86 + }, + "time": 1429164720, + "txn": { + "timestamp": 1429164720, + "length": 220, + "type": 0, + "txid": "ca51f9d0a19bf326d6dd39a1e4dd240adaaae279411093d4a5b20f54cddabb95", + "inner_hash": "47500bd3c5f74835a01b0f696e15780baec2ca3723f45355c9e8cd1c71564d18", + "sigs": [ + "fdbc112b10354be2b85b2f9131a3927e7b4e87ff8ddef91b849a71e0b1445ebc410b61d85ff7af1834b54febf89d903e3151f5a74ccef4e9607851c9005454d001" + ], + "inputs": [ + "05f42f22f5fea4b5cac8182dc2b4f280149c686434c6d4195a119a8d02ab24b2" + ], + "outputs": [ + { + "uxid": "4e1a98a72639efa6253a7cbea0f3b499fa24fb88612ad81414d20e46d2b5784e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "860050.000000", + "hours": 2525 + }, + { + "uxid": "ee69cfd4f15d16ded96745a35ef150f679b5b79cc0fd4009a2d02cdccd81ca3e", + "dst": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", + "coins": "1000.000000", + "hours": 2525 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 94, + "block_seq": 87 + }, + "time": 1429164730, + "txn": { + "timestamp": 1429164730, + "length": 220, + "type": 0, + "txid": "cf5a1fad27f8f874f67d3162ae6347154c980ebd97c668d610280418f0f53ce7", + "inner_hash": "937bb1627381dc0e982b5b33a119a458db7605a5ff11df1b7a81957460157bad", + "sigs": [ + "53f091d0b653d50c32aa9bd24c09aa1671b2a8686f744a769a9568d3ea28f7852370d83429dfff6b16b9a721f2ecdf40fe799006229d575cec6e73174e7b84b500" + ], + "inputs": [ + "fa761f3b902ced1ad8e94231af3447315a8c8bcdbbdcfcd69bb74ca5ae66f6e9" + ], + "outputs": [ + { + "uxid": "a68c6c646b6bd42f509a82d0218c8ee648b4a40da20eb0599449a7249b10fee9", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "25000.000000", + "hours": 16162 + }, + { + "uxid": "f98e302e74d8972254b1cdc4de3ca78ff1e60f3f1b7083af397f3bcb219e9454", + "dst": "FtdApqw416skWtXM7ExanZWFmiHNPZ1Ft6", + "coins": "1000.000000", + "hours": 16162 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 93, + "block_seq": 88 + }, + "time": 1429164790, + "txn": { + "timestamp": 1429164790, + "length": 220, + "type": 0, + "txid": "efc98a4f94ffda2f1d6575048d75728f228a0bef0467c331f085a0f41f97ae45", + "inner_hash": "0134889df5d1e5c7a545f1cd6239ea51513534ed08acd503cc77e0b9d74ebcc2", + "sigs": [ + "9a2582b47df81a77ab148fabe81fa6b1c490b213e0cd79aba779be1c56c225d5591bc6674a08bce27103ce7e1e85756d31c96635ecc07ae40c53ccabb20d254d01" + ], + "inputs": [ + "dc8162cf85ce1a434adebab2d13abffb587c0e50b86fd1a997bca67f07a66ebd" + ], + "outputs": [ + { + "uxid": "b187246f68a768f65663b8a208ab107a9bc24af6a062acf3ad41aeb899315a49", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "29000.000000", + "hours": 11912 + }, + { + "uxid": "f713b6bde2e1956615b23021d20aeb829611d231e2e85b8204c01e5719ac8639", + "dst": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "1000.000000", + "hours": 11912 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 92, + "block_seq": 89 + }, + "time": 1429164800, + "txn": { + "timestamp": 1429164800, + "length": 220, + "type": 0, + "txid": "a0956843d442bd4b592d0c1323d153c3c1b2d7d52a86629444de6d1d1b6a4c33", + "inner_hash": "0fd405b4d4a74b417a27d0bfd2f0d1acf4ed0499a000e94c64a1443c5bb440bd", + "sigs": [ + "9bd640adcf2e1870dd4cdd93f007759626ed9fd87dd8e0485888612ea660435a3104889820e6dab8d692efc3e4afb892de622c46b5f5c25718dfb78d4882d2ec01" + ], + "inputs": [ + "15700b88043b3c08a46c3c4e36e7f431291a26aef1ef26c44ee413feee14b950" + ], + "outputs": [ + { + "uxid": "24c49699aab32caf9456a6b4dacd4d820c853c7639e5500b3be6326660312917", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "28700.000000", + "hours": 635 + }, + { + "uxid": "63154895637eb000146996ffaeb7cc1a547e409d0a2038650e990e7cc9b36826", + "dst": "XnKU1htBL5wFSMX8oytZBsBMeaBSbVNivT", + "coins": "1000.000000", + "hours": 635 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 91, + "block_seq": 90 + }, + "time": 1429164810, + "txn": { + "timestamp": 1429164810, + "length": 220, + "type": 0, + "txid": "bd617ec27c2bea642fad8c153178e11ca08456d752249324e3011f27c845f87a", + "inner_hash": "f8ce5c9cc22005d7f63c0400132b0e70a6a8af574f1a5c1ffb0404f228a02949", + "sigs": [ + "b471a7bdde8b1427f8081d9e91250fd89cdd4dd23062796fe2ee973c612eb28b76f6c7ab4f3fbb7c7f9627c52158066d13d9fbe34dfdb6e77c02d84ff4d45d7d01" + ], + "inputs": [ + "4e1a98a72639efa6253a7cbea0f3b499fa24fb88612ad81414d20e46d2b5784e" + ], + "outputs": [ + { + "uxid": "33e0c4c9536afffd491fef6294f22ffb0d16902493946a051db0b218728a1c44", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "859050.000000", + "hours": 2704 + }, + { + "uxid": "2a09e97f7725a35af1357842206875a023252da4ebfce129eaf4cb87119cfd41", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 2704 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 90, + "block_seq": 91 + }, + "time": 1429164830, + "txn": { + "timestamp": 1429164830, + "length": 220, + "type": 0, + "txid": "98baeb9799902593d0f61ee22947089a798c6adafd05dc6a5ea918d982a19857", + "inner_hash": "8fdb3ac7731310281c5e67ca521d5b925aee8c7dd34b7b8249ae522ccd450943", + "sigs": [ + "c1f82dfa176134077c4512421b01bec50360dae178e43ec9ceb70d24ff38301a33c6780db5b80afb49b08d15b303217ce206601c1a29bfef4f3bbdf6ccdf779200" + ], + "inputs": [ + "a68c6c646b6bd42f509a82d0218c8ee648b4a40da20eb0599449a7249b10fee9" + ], + "outputs": [ + { + "uxid": "d45d0597c7d41fdc69ed09a139925327142589f1e4fb877285fa63c6fa126d38", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "24000.000000", + "hours": 2089 + }, + { + "uxid": "535987a7896501a8a69c1904c0bf98e2ef1fc493bf998c78ee420ef154868731", + "dst": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "1000.000000", + "hours": 2089 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 89, + "block_seq": 92 + }, + "time": 1429164850, + "txn": { + "timestamp": 1429164850, + "length": 220, + "type": 0, + "txid": "54e65c445d0af9dda82085ca4bfe0f326ae54ea2a03bd37e07f81d937de97777", + "inner_hash": "d8f2215fee34a1104826266582d525f9c267d3a726732ed532fb6572d09b82b6", + "sigs": [ + "9d5aa480261d4d2dfbb8264ccb2bf8944b6abb5267ad89dda83760273abb8c0116f172e257a661a4d3d89c9c2caf237a13519545173c0df741a7dd18770176a401" + ], + "inputs": [ + "b187246f68a768f65663b8a208ab107a9bc24af6a062acf3ad41aeb899315a49" + ], + "outputs": [ + { + "uxid": "74f7dcc6e516634b5d5722d8664ffabaca3b708a53497bb420ced7c300c39806", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "28000.000000", + "hours": 1529 + }, + { + "uxid": "3109e04b5baef2423f4d6d2d639464286c24ef9defa612d3b598802d761b670a", + "dst": "ZWhZtjwXMS46cpDxfRwQyxxKPhqwsQu8oN", + "coins": "1000.000000", + "hours": 1529 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 88, + "block_seq": 93 + }, + "time": 1429164860, + "txn": { + "timestamp": 1429164860, + "length": 220, + "type": 0, + "txid": "e2d9da9342b21659da0a679536f9d6f533a4ce7dc33a7f768c3441ca3640458d", + "inner_hash": "72974683d8244d927c63440a169a438611ef88b250f20df2711d83a9f61a75c9", + "sigs": [ + "1c72245ae55779445ae5a6c030ea7f01cee7c29dd6189d0dcb383ec8438297e635b314c44bb0c4173c9e30d225774ee0334cee186e603a61c171af4db3eb961e01" + ], + "inputs": [ + "24c49699aab32caf9456a6b4dacd4d820c853c7639e5500b3be6326660312917" + ], + "outputs": [ + { + "uxid": "fb4d5dcc1c3ac97444e96aa7da392b0d7faf7b7373504c70e497228a4695a7f1", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "27700.000000", + "hours": 129 + }, + { + "uxid": "4a5c1b09ef2216ba2fdae735ec8c6ad404bb61bfbeb7407dee9d6e3578762ffb", + "dst": "2LZzgdFYNhsBBSLATkV6PA1zk6DvWNghP2", + "coins": "1000.000000", + "hours": 129 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 87, + "block_seq": 94 + }, + "time": 1429164870, + "txn": { + "timestamp": 1429164870, + "length": 220, + "type": 0, + "txid": "0f4958d590ed4ac9aca79d848731b358b1c01fab9717775cf6515f2bf2706dc8", + "inner_hash": "89c71b68262f8e3acddcec032b4209220ac7b794d1cefa62b45c71b94e017cad", + "sigs": [ + "ede880d4422a1102280918227157997bb7a36d26a358a71bf016963d29e8403d2298754039d8dd14c0b05d776d05bebadb919a620e87439c93008e292086c94d01" + ], + "inputs": [ + "33e0c4c9536afffd491fef6294f22ffb0d16902493946a051db0b218728a1c44" + ], + "outputs": [ + { + "uxid": "f32f03f28eece9ddcdc488a85100c94a7c924c185ae560363518dae5e2aacccb", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "858050.000000", + "hours": 1829 + }, + { + "uxid": "24c4cfc628a0f77ce2e878c6ffa9d4dbd85325f8a5e0b5df970a3a2c36033519", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "1000.000000", + "hours": 1829 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 86, + "block_seq": 95 + }, + "time": 1429164880, + "txn": { + "timestamp": 1429164880, + "length": 220, + "type": 0, + "txid": "c93f8bb30e75ffbc0075a4baf57a0f536e4a9123395b13ce67af5cd2dd0f8cd4", + "inner_hash": "20a707a3ccfe4ab0884697e4d9013da5c15f062b0a6f1395086503f2c4d6efb2", + "sigs": [ + "5fa7614080d2b044f1edce8bc42961d311db3fa4596fa14973261272980c37b0776099a37d758c20a2d45ee73aaed7d007e58f9f15191233f4f27b266fb2866c01" + ], + "inputs": [ + "d45d0597c7d41fdc69ed09a139925327142589f1e4fb877285fa63c6fa126d38" + ], + "outputs": [ + { + "uxid": "aee4af7e06c24bccc2f87b16d0708bfea68ac1b420f97914965f4a23ad9e11d6", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23000.000000", + "hours": 294 + }, + { + "uxid": "f9653d496ee2e6499a68a1172e5d60b60758b1edcd02d95a3388b29e113a9041", + "dst": "2U1B6EE5ZCXWJJSyEndouuCk434xpvYqYDF", + "coins": "1000.000000", + "hours": 294 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 85, + "block_seq": 96 + }, + "time": 1429164900, + "txn": { + "timestamp": 1429164900, + "length": 220, + "type": 0, + "txid": "0301358c2db5314ca43c442bac3c1daf31f4b39f9ac9e22dc157687212cab703", + "inner_hash": "3a68e8622eaf49013554114c0dac32c444998ef6c65ff1afc399bc772787f502", + "sigs": [ + "8925bcbda7785c7a83a77bd5ce16542e91a8f046163d429fcf9c466ca6a9b1fa5f6b693a19b7d8127717821ae247ba30401068d447d0fde4136c0e49f5e7e57900" + ], + "inputs": [ + "74f7dcc6e516634b5d5722d8664ffabaca3b708a53497bb420ced7c300c39806" + ], + "outputs": [ + { + "uxid": "6002f3afc7054c0e1161bcf2b4c1d4d1009440751bc1fe806e0eae33291399f4", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "27000.000000", + "hours": 220 + }, + { + "uxid": "63768bd1402317f7d3f0a38c9897e609bb72b7d334e54bd4c609292487264c22", + "dst": "22Piwuzo8ZfoXfpMghhbzGz3ptmTeiDhLbg", + "coins": "1000.000000", + "hours": 220 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 84, + "block_seq": 97 + }, + "time": 1429165260, + "txn": { + "timestamp": 1429165260, + "length": 220, + "type": 0, + "txid": "a689a3589730a351f880176b2c15b395967b38a90950e0491e7a1e5531f020a9", + "inner_hash": "d6cfcef60d17c03b68b94c4284746bc70e8ef66cb6d2bd370094a7e4b19dbaed", + "sigs": [ + "de36c5fac7db61c7a47827e1a9ad1b717d5fa904b69283598eab6003ba1b1e264856f30a6afe0881675e8f11a86e666cec09b789f3971a6ec4ba25183684a18900" + ], + "inputs": [ + "fb4d5dcc1c3ac97444e96aa7da392b0d7faf7b7373504c70e497228a4695a7f1" + ], + "outputs": [ + { + "uxid": "4e75b4bced3404590d38ca06440c275d7fd86618a84966a0a1053fb18164e898", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26700.000000", + "hours": 54 + }, + { + "uxid": "1f9fb89f5b7c41d3df6d72b1f02c998196bc79ec20c3949693b4f5a2c1aae44f", + "dst": "2H7mA88ireMKHqP9LYWK5opnU176v7eYqrn", + "coins": "1000.000000", + "hours": 54 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 83, + "block_seq": 98 + }, + "time": 1429274566, + "txn": { + "timestamp": 1429274566, + "length": 220, + "type": 0, + "txid": "fe01250cfdf84eb0182c033c216891e7e6971cc85976c4c46d9e3c608974d233", + "inner_hash": "2400f3951d454f663d5097060267f8e31e86e1c3f10391c8a06ed79fd72fe49b", + "sigs": [ + "6ecee1ca0e86de9bf6da9a21e49b1cfade8f1a279f7fc58834c15184bec1de634c82faf30bdab34083bc1f32f87d27daa1987a525db83100f88b9103efbc007701" + ], + "inputs": [ + "f32f03f28eece9ddcdc488a85100c94a7c924c185ae560363518dae5e2aacccb" + ], + "outputs": [ + { + "uxid": "99b4e51e1afd04813656e6202c7e462d88ce87ba980da7a62591190d72d1073c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "858000.000000", + "hours": 11848 + }, + { + "uxid": "f12164a6ea6ce65ff2ca1f2be7251bece8f7c5747ba8ec68e1ec3b27d45d7b9c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 11848 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 82, + "block_seq": 99 + }, + "time": 1429274616, + "txn": { + "timestamp": 1429274616, + "length": 571, + "type": 0, + "txid": "819106dc50373e5293a7e79f179693e85536e8206d82272930ec08410d92402a", + "inner_hash": "02e9a06b0ca7f91255107993e00f09e9ef983559088c5febff264c17952033c4", + "sigs": [ + "efb713e6a1e5d328e94a51fbeb0f73e2a3b7a54e15db75797f0b709f698b16eb26e522f187a98144807e0e6cd294686ff19037975abb6d44b20b2899968954f400", + "b5d011c60020ce591a21db15823c06188515a63ca95d573c36b3af83d634fc6f1c1125db197f6283510ee33890ac168513254ad37524c77294bb5a12e8ff23f300", + "00d87b91eda33f627f6cd28cc673daf929fbec36e7bcfdf894f7491618a68b5755b5baadedc106d53d2da924fcbedbd106eadc50ec611d426720f67426c7286500", + "e64cf7e74363cfd381a3aa6fd17d7c415d6034b26b93017acaf9cf3475ccdffc53c3714d1d13409323cf77ccc81596f6e6edcec11d890979a436ef960bcb5f6900", + "fc2eb05241afdd15cdbd28cc7158d7eb4442f21a678c52332762b23ac6c2fcc76b0f79731987df0ba84d82044cd474d4cda9afda778a21b78a0659c5b588664301" + ], + "inputs": [ + "2987e7c89d353ad5d63cea2bf2724dc5f7a5ef5fb81f5ea160a307f0726ac2f5", + "a52408daa8ce7026c70b61d4df4212fb577462060f340bfce779225b3e18193d", + "dc73aac74348dd285a1456c1fae2204d7c2039d50a765bdaae0c31f7c7e059db", + "e4e375b9dc55ff53d6de9120f1a87ff00e00a779835f8320f2c6b3090d0466e6", + "d11b05345917d171f60c31bd2634041b73b97eae364724369ddb8d53369397fb" + ], + "outputs": [ + { + "uxid": "427462efeb07a6803f013c789ea43d93240f74f886bf9afd63dc1936a7574a37", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 7510 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 81, + "block_seq": 100 + }, + "time": 1429274636, + "txn": { + "timestamp": 1429274636, + "length": 183, + "type": 0, + "txid": "9f20b52befed2cbaaa4a066de7119b7fdbff09a83d8e2a82628671f51f3f6551", + "inner_hash": "c2e60dbb6ad5095985d21391cbeb679fd0787c4a20471340d63f8de437d915df", + "sigs": [ + "2fefd2da9d3b4af87c4157f87da0b1bf82e3d6c9f6427572bd768cf85900d15d36971ffa17eb3b486f7692584102a7a58d9fb3ef57fa24d9a4ab02eba811ef4f00" + ], + "inputs": [ + "aee4af7e06c24bccc2f87b16d0708bfea68ac1b420f97914965f4a23ad9e11d6" + ], + "outputs": [ + { + "uxid": "194cc596d2beda803d8142ddc455872082f84b09a5edd8085082b60d314c1e29", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23000.000000", + "hours": 87673 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 80, + "block_seq": 101 + }, + "time": 1429274666, + "txn": { + "timestamp": 1429274666, + "length": 183, + "type": 0, + "txid": "e8fe5290afba3933389fd5860dca2cbcc81821028be9c65d0bb7cf4e8d2c4c18", + "inner_hash": "45da31b68748eafdb08ef8bf1ebd1c07c0f14fcb0d66759d6cf4642adc956d06", + "sigs": [ + "09bce2c888ceceeb19999005cceb1efdee254cacb60edee118b51ffd740ff6503a8f9cbd60a16c7581bfd64f7529b649d0ecc8adbe913686da97fe8c6543189001" + ], + "inputs": [ + "6002f3afc7054c0e1161bcf2b4c1d4d1009440751bc1fe806e0eae33291399f4" + ], + "outputs": [ + { + "uxid": "f9bffdcbe252acb1c3a8a1e8c99829342ba1963860d5692eebaeb9bcfbcaf274", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "27000.000000", + "hours": 102905 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 79, + "block_seq": 102 + }, + "time": 1429274686, + "txn": { + "timestamp": 1429274686, + "length": 183, + "type": 0, + "txid": "7b13cab45b52dd2df291ec97cf000bf6ea1b647d6fdf0261a7527578d8b71b9d", + "inner_hash": "73bfee3a7c8d4f8a68657ebcaf69a59639f762bfc1a6f4468f3ca4724bc5b9f8", + "sigs": [ + "c4bcada17604a4a62baf50f929655027f2913639c27b773871f2135b72553c1959737e39d50e8349ffa5a7679de845aa6370999dbaaff4c7f9fd01260818683901" + ], + "inputs": [ + "4e75b4bced3404590d38ca06440c275d7fd86618a84966a0a1053fb18164e898" + ], + "outputs": [ + { + "uxid": "0a5603a1a5aeda575aa498cdaec5a4c893a28669dba84163eba2e90db3d9f39d", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26700.000000", + "hours": 101435 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 78, + "block_seq": 103 + }, + "time": 1429278106, + "txn": { + "timestamp": 1429278106, + "length": 220, + "type": 0, + "txid": "9150311508851ca989efb5f82b5a7201724514b6b9f84ec1620c18673462126b", + "inner_hash": "83e206eb05ce5708efd174bb9df2c0bc0741c1775e50d139aebf37ed6c46381d", + "sigs": [ + "a6206409a077ec30fe7f0b0ad5162805dffbff743afbc9e8e926d72ae38d15f80ab8183150caa4d745125c1c6e733428e299742d10e07a64ba5bd21d4e5ee06f00" + ], + "inputs": [ + "0a5603a1a5aeda575aa498cdaec5a4c893a28669dba84163eba2e90db3d9f39d" + ], + "outputs": [ + { + "uxid": "1e30e9dfe00e055404063e52a4154a72492b13de6acf4871ec5ea6d7c0fcc968", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26600.000000", + "hours": 12679 + }, + { + "uxid": "435c7095e2531b88feb76f32fc34fac3406882cdf71e17fecdba196aa5bc059a", + "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "100.000000", + "hours": 12679 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 77, + "block_seq": 104 + }, + "time": 1429278406, + "txn": { + "timestamp": 1429278406, + "length": 220, + "type": 0, + "txid": "44d56cfa9f83d874ee10fb32f0d40458f6bf3e86528592c9a9abf3c960fcb278", + "inner_hash": "4a9c25a15fe166d87b3fb6474360b39aa52703b70b961212f9494393a3c71c80", + "sigs": [ + "0c8c4e941af19993051d5e7d0aba7414e066d15dcee9bd3eb1f7fab3259fe0345dff7ed1fa68eb243883a3793f3febc7b7eeb7a619601ec9248ec5c063707e2b01" + ], + "inputs": [ + "194cc596d2beda803d8142ddc455872082f84b09a5edd8085082b60d314c1e29" + ], + "outputs": [ + { + "uxid": "aa1133a42417332af8b58e71cc14a651e2731563eaea35f0feacc1e97fac6eef", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22900.000000", + "hours": 13730 + }, + { + "uxid": "52088c63431b6109537bce1e582775f319c9833990c94cc2e8e0dbb8b48b9c27", + "dst": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", + "coins": "100.000000", + "hours": 13730 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 76, + "block_seq": 105 + }, + "time": 1429278556, + "txn": { + "timestamp": 1429278556, + "length": 220, + "type": 0, + "txid": "41ec724bd40c852096379d1ae57d3f27606877fa95ac9c082fbf63900e6c5cb5", + "inner_hash": "614d7754fa0633e1a701eea3b3a2ce1c2815360f311cd1cb6cf46d5ae94304ba", + "sigs": [ + "bd20e6b6754308d192ba734a573ec4363dae5326b9b21a7203904c076b067bf9313df1df8ac8960f12d9d8b642deb411a504512990181bc2e53264cf661b868f00" + ], + "inputs": [ + "1e30e9dfe00e055404063e52a4154a72492b13de6acf4871ec5ea6d7c0fcc968" + ], + "outputs": [ + { + "uxid": "2426f768e00345b641f5b4b4b058c308d528e22437bc6e552f0a9d5bd665e14a", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26500.000000", + "hours": 1861 + }, + { + "uxid": "8f4435cc1cb45453f1ee8e836a74bdec313a6d3aa1879be24e2ba261d474bf36", + "dst": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", + "coins": "100.000000", + "hours": 1861 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 75, + "block_seq": 106 + }, + "time": 1429279796, + "txn": { + "timestamp": 1429279796, + "length": 511, + "type": 0, + "txid": "8de17dff34a8798f2ac89584f5c559e3bb82c280a3f6890386b4dbc5fef0e8cf", + "inner_hash": "2ab03a15a9f312d27919ec42a27dfefc5fc5e0b8bf451eb81ef545bf4497f524", + "sigs": [ + "9dd44c7d76d454c7c658649d94e08f75354ba568aae069b38da012f07eacbcfe2a5bbe9b4444f566336c23a03f3625eb4306791437e1bfe69f43efa0c109ec2d01", + "211d2607cef832c989563a3475daf6aa1fec6d73893a72666b5428c6bd93217605990bc3b45f4cf4863a648708ca3bf3526eb1644679f313a297daf82b1865bf01", + "f7e77964485e36b15ade78aacc17407af265c7144767e3f39bfd9765869f90cd0f33120ca996154db82d5462d626f3ae299c8f3b8cc862284432919cfeb6613d01", + "3a1e491d35ad5daa1af54872b5ec1d02c6654cad8f2bcd94c2a624c1a3cd5c9163c373f06a931b5de526654bdbc5cdd221b7fcf7b77329d452562080216ca8fe00" + ], + "inputs": [ + "99b4e51e1afd04813656e6202c7e462d88ce87ba980da7a62591190d72d1073c", + "f12164a6ea6ce65ff2ca1f2be7251bece8f7c5747ba8ec68e1ec3b27d45d7b9c", + "427462efeb07a6803f013c789ea43d93240f74f886bf9afd63dc1936a7574a37", + "f9bffdcbe252acb1c3a8a1e8c99829342ba1963860d5692eebaeb9bcfbcaf274" + ], + "outputs": [ + { + "uxid": "dfd2834342f3a7caf183472c17801aafacd1775378eb843509d17ad858456cb0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "885000.000000", + "hours": 139293 + }, + { + "uxid": "3bfbe4e80894862d60a053ffb47b8f1749e281603cd6376c8fc6b5e2cec0c843", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "100.000000", + "hours": 139293 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 74, + "block_seq": 107 + }, + "time": 1429280596, + "txn": { + "timestamp": 1429280596, + "length": 220, + "type": 0, + "txid": "6546dfbe6e61e81f3e9f6c9afdfee1c07758f2e486d731ae4d19b40602367656", + "inner_hash": "9566ef1826b7f518c043395c2b7a37014f77f8e23796c1c78e55d1fc443a02da", + "sigs": [ + "2773830af5e34a3de4a3ce935ee08c189feaa30ab41ced8f78f9a6434198d9775c58a0b9bcc2931f3d0dfde541ef7f5d3c1cfcf5415776dbd9d871ce036ec42900" + ], + "inputs": [ + "dfd2834342f3a7caf183472c17801aafacd1775378eb843509d17ad858456cb0" + ], + "outputs": [ + { + "uxid": "8ac39d41ec014ca6625e5f17e1fbe62db7a4ac154e0e42a017efa037935ae968", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "884900.000000", + "hours": 17411 + }, + { + "uxid": "ec4b791f2fa22a986d6035e34f5025c3da0398cb2acc59a54d495d4eaacdee8a", + "dst": "2acnXsnJ2k8jxiUahtBe8h4xouPAnpbwwjc", + "coins": "100.000000", + "hours": 17411 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 73, + "block_seq": 108 + }, + "time": 1429280756, + "txn": { + "timestamp": 1429280756, + "length": 220, + "type": 0, + "txid": "a8d6420d4f64fad1b698bd77cae5a92aa125f806fb184389edcc278e5cb460fa", + "inner_hash": "6daf17a44251b984449effe21e605ab556ef565940043cff6cc75cb042028783", + "sigs": [ + "dd67813bd08a88b24f695ac10d4390598b25cf19e4edad19091f3b723c4780653a62639153b9bbb53331b66b46dc8c84e719178a96bcd001eb7f2e147268bb2e00" + ], + "inputs": [ + "aa1133a42417332af8b58e71cc14a651e2731563eaea35f0feacc1e97fac6eef" + ], + "outputs": [ + { + "uxid": "4326c936322df6d59b3b539ea340eb9630c7f8484eba2aeba1a0ed4d431ab614", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22800.000000", + "hours": 3457 + }, + { + "uxid": "9404837ee44bc6aaa8c1ad963c8fa7a050e497f89f941fdc7248930ed4e0d5a6", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "100.000000", + "hours": 3457 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 72, + "block_seq": 109 + }, + "time": 1429302756, + "txn": { + "timestamp": 1429302756, + "length": 220, + "type": 0, + "txid": "a4c15ae4743246709ec335d33c289576c8893e71f5c3dcee1db6e43eec9242ee", + "inner_hash": "1d2404a84798154867ab461179a2b4300d65e4886cbb0220f0d5d0b16bbb7628", + "sigs": [ + "3fcfe6d7fe59b9998ac4260c3b788384b2ebb7137e08e3ffc8d8b6efa23490e71f94f381c61af4966ba6a4fb4173079d5a7f31518030900f6c10d64ceb0b774f00" + ], + "inputs": [ + "8ac39d41ec014ca6625e5f17e1fbe62db7a4ac154e0e42a017efa037935ae968" + ], + "outputs": [ + { + "uxid": "bae0e928b795e2a80c88161afcbc102dcad6644386f6f44050dde8d586750140", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "881900.000000", + "hours": 7092 + }, + { + "uxid": "4ca22a0fa2acbd0c9e90c4ae83496d05e122deb1a17c670e9c785479d115e824", + "dst": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", + "coins": "3000.000000", + "hours": 7092 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 71, + "block_seq": 110 + }, + "time": 1429326351, + "txn": { + "timestamp": 1429326351, + "length": 220, + "type": 0, + "txid": "552a4b194478325ee9f3e4a8648d94bc8eb26432be6fecc881bf71ff9ca15356", + "inner_hash": "bcc319504908b93f4418244049157875514fed19ce76977435d00b7ab712254a", + "sigs": [ + "41b8178ba19326c7f61b5327846c8057bef05c47f2068ff3eaef80bb26bde18642d444647f8c623ca8a3abb040f3527c28737534bc2d1b8c5d53bf71f4c1628c00" + ], + "inputs": [ + "4326c936322df6d59b3b539ea340eb9630c7f8484eba2aeba1a0ed4d431ab614" + ], + "outputs": [ + { + "uxid": "f9bf35f993452b3d490668bb579fd272da969a1bcca8de0c25000ee57b5d7f54", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22700.000000", + "hours": 17848 + }, + { + "uxid": "a7dc3318a975546b7662f0a867c60a4d7e9b4d1d89ab87be8c78b09ffe8852ff", + "dst": "aPF9pL9sVEiyEVhynp3s1dmqLetP1BJrW6", + "coins": "100.000000", + "hours": 17848 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 70, + "block_seq": 111 + }, + "time": 1429348072, + "txn": { + "timestamp": 1429348072, + "length": 220, + "type": 0, + "txid": "6ce27da2ddbc15f03330960b4201dbb3a066ad2e9bbd5366a9564f6befdcae2e", + "inner_hash": "2db237d697bd17aab9121cdfc4d72fa1cbfe7fd37d7f71b1a857833bb56b7dd7", + "sigs": [ + "c50715bd2e53ed971b7559ccaf8a930dae335dc45cad18a25ccfea3209ea2c971e0dc6cc57ff1dbcde49ddfdc612e71e923adcd21b68eaa0eb239bc83a50ff2b01" + ], + "inputs": [ + "f9bf35f993452b3d490668bb579fd272da969a1bcca8de0c25000ee57b5d7f54" + ], + "outputs": [ + { + "uxid": "c5df36ce47f6f183475317ab1c53eaa65428c142cb3e3906bf162d80519a203f", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "12700.000000", + "hours": 2231 + }, + { + "uxid": "94889dbe1c20eb942b7932c5301737537ac33abd9c81d72e1642ddc70ce320e0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10000.000000", + "hours": 2231 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 69, + "block_seq": 112 + }, + "time": 1429348102, + "txn": { + "timestamp": 1429348102, + "length": 317, + "type": 0, + "txid": "f8a24a25a8e3b206db7ea8a0bd8eeb0f8087f50d230c81a538316bcc5152da3d", + "inner_hash": "cfca9a1aa2ab7ea4d643700ac89e9544f1d4e9ef85e28d1cedeece11469fb885", + "sigs": [ + "5b68d315f4e84cdae4936db6bb7c8466977e784851b605d1fbc1e0bb65fe259d58d6be37228c96bccb1a1c1e9d316d9102fcfaefeda614e67af20464bc877f2101", + "fdd919590553d428d9b8121644127651c68b5207af9798aaaa6ed18134c5835b5311bb547e07e47157a4fd89867c88a48700255610efd2a3e3f77dc82f5fb3ba01" + ], + "inputs": [ + "bae0e928b795e2a80c88161afcbc102dcad6644386f6f44050dde8d586750140", + "94889dbe1c20eb942b7932c5301737537ac33abd9c81d72e1642ddc70ce320e0" + ], + "outputs": [ + { + "uxid": "1d4595b9fa1c6c3d64f48b6ae5f8f861b1c08a022cbcb04b279df448da3db660", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873900.000000", + "hours": 1388810 + }, + { + "uxid": "53b376413d550663ab51b229df8b0f55e4055d6577c2d8b5cec8ff748fe0e958", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "18000.000000", + "hours": 1388810 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 68, + "block_seq": 113 + }, + "time": 1429348172, + "txn": { + "timestamp": 1429348172, + "length": 220, + "type": 0, + "txid": "1f27afc41896d2c7fdbd2620e606440ad12557e9a4bdd6808dcc2c23d4e32978", + "inner_hash": "4d53c05c731409feef7606cf9514904f4c7704537efb453ac2c439fcfe77a455", + "sigs": [ + "e36cef84c1c6f999dba462f3134131c105da2255eaf21550ce30ee52a14a33d529a7cd0c37b3883d0d57429b163b4905271c7b1a4d951b4a521f245c7857dd5c01" + ], + "inputs": [ + "1d4595b9fa1c6c3d64f48b6ae5f8f861b1c08a022cbcb04b279df448da3db660" + ], + "outputs": [ + { + "uxid": "412eff3eef889c682da8db3608fce37d1c5ee2cc297bc88d901648e6ccd418f9", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873800.000000", + "hours": 173601 + }, + { + "uxid": "c961ba554ae30b0edcdf71e834ab2b26d7dff5bcf5955d4874cdba89170392bf", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "100.000000", + "hours": 173601 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 67, + "block_seq": 114 + }, + "time": 1429348502, + "txn": { + "timestamp": 1429348502, + "length": 220, + "type": 0, + "txid": "e8765b4e6fbca87144df59a6f66815b175e81999509504b117636edc34cbe2af", + "inner_hash": "b62f9938b195211810976e1719b152fe6c381879adba6061f4ca36d74c06bea2", + "sigs": [ + "9d40ed257bb7586c7d72e90bd99c6883fb836d400107686ba477850c2b63a86b5ad885aa37f352d334d930ea3814844e67a6ac438c36b919daff273a66f21e5201" + ], + "inputs": [ + "412eff3eef889c682da8db3608fce37d1c5ee2cc297bc88d901648e6ccd418f9" + ], + "outputs": [ + { + "uxid": "6ad7993fb2728c2c53ac2c8395a6c62d03c5ef9298ca467e7998fb64fd0c90b4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873700.000000", + "hours": 21700 + }, + { + "uxid": "5b0801ec545b132eeafa61bee8f645df7e1e358321ef830a4247fe541c211139", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "100.000000", + "hours": 21700 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 66, + "block_seq": 115 + }, + "time": 1429348712, + "txn": { + "timestamp": 1429348712, + "length": 220, + "type": 0, + "txid": "bb700553c3e1a32346912ab311fa38793d929f311daeee0b167fa81c1369717e", + "inner_hash": "253c14d68558b09c034d4945284f5cc3025b9e05723c6e4fa7d95f1e68edb211", + "sigs": [ + "4920f49d47105801fab73c2398bee61ce56bb0b58dd69ab35ec1f959a3b8a8003c2821510d3a97d09f7a4a9f943b04d888b1327539ff48216f148fca693dde5d01" + ], + "inputs": [ + "6ad7993fb2728c2c53ac2c8395a6c62d03c5ef9298ca467e7998fb64fd0c90b4" + ], + "outputs": [ + { + "uxid": "0976005ab4540e8211cd929f19634bfaa2f5d8e24177ddb5b803b447ea91f8c3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873600.000000", + "hours": 2712 + }, + { + "uxid": "de995d2361e810cfba1b9b1141413367a722f51c7555b1685f6e68129dfb2679", + "dst": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", + "coins": "100.000000", + "hours": 2712 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 65, + "block_seq": 116 + }, + "time": 1429349392, + "txn": { + "timestamp": 1429349392, + "length": 220, + "type": 0, + "txid": "491130fc9f69d101df220116356e82e2ff21dac1167e6da81c95dd4cc417b3d9", + "inner_hash": "d78596837a36ece9a8bc3a8eed424612651039f4f229969c42ec3d7fd1aceff2", + "sigs": [ + "e22e89ecb303d5eee59eca8a75e0d5b4fdfa3a256576d7ac91264b4c3bf882ce7186572ab68fd1ad4dc837039ef4d7063ead72365506aed71cfe4de0b0449b4900" + ], + "inputs": [ + "2426f768e00345b641f5b4b4b058c308d528e22437bc6e552f0a9d5bd665e14a" + ], + "outputs": [ + { + "uxid": "6c34016037cd17622846e71bc635914d4d8f256c147aa5a0b84a896e83229480", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26400.000000", + "hours": 64785 + }, + { + "uxid": "ab12f4eadaf956be371ff8f239956e33d1cd2fd4b497ca04c9501baf6f241618", + "dst": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", + "coins": "100.000000", + "hours": 64785 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 64, + "block_seq": 117 + }, + "time": 1429351912, + "txn": { + "timestamp": 1429351912, + "length": 220, + "type": 0, + "txid": "345488861ad3f0d93024c367990e64ef0f7a95bd8b8589f554172f9439808263", + "inner_hash": "258acd45e194051214c9783184c2a9157558e595c4e4da814258f0ffd0e9dd64", + "sigs": [ + "9f44be793a0cb218b6836dfa52e5b8c38fe2b1257d27fcea49f4c6a6ed910f446e8a96a987fc06c6b6ae13ea8ea0290e91ea40b6f8eeaf8054e8efd17306573201" + ], + "inputs": [ + "0976005ab4540e8211cd929f19634bfaa2f5d8e24177ddb5b803b447ea91f8c3" + ], + "outputs": [ + { + "uxid": "6beca9fb58a327580c614d7fb5622916849756790b661bcabc880666364fdf47", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863600.000000", + "hours": 20965 + }, + { + "uxid": "2010952c33c83599fa14bfa5982d59865f2a362c97270dacb4c180a485ee5096", + "dst": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", + "coins": "10000.000000", + "hours": 20965 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 63, + "block_seq": 118 + }, + "time": 1429364072, + "txn": { + "timestamp": 1429364072, + "length": 317, + "type": 0, + "txid": "a83e09e976b038d86491d8c029aec84a6313dc33e692da6ce50a2858e50c4666", + "inner_hash": "86b47008bbeb60335762ba70b5bdf8128f09b3f8fff6ec6e5d9553763a5b5cef", + "sigs": [ + "48312c1abe5617609f70a882689f194e8d18c0b56d153adfae4be08bf00d723c6cda6dbd885e7ed7f92c7b7065d583adfd5f18bb37da9b796a394f4a388e978d01", + "4826477aed0387ca448b8225a5d27ebe6824b460d0581fb8ccb5078a865cd8171e7f5c860091a99cc85b1571dce8a550659cb3d02902a77cd1f6d0d27277bdee01" + ], + "inputs": [ + "7b132c07322babefa83ab64971b7bfb29bf2cb9ffe9c42dc7e2975a185dcd8b8", + "c961ba554ae30b0edcdf71e834ab2b26d7dff5bcf5955d4874cdba89170392bf" + ], + "outputs": [ + { + "uxid": "3408638af298419b14a49e8e9dd69e97c9a06827d74edf9f410a870662360b31", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1045.000000", + "hours": 30769 + }, + { + "uxid": "ba0a94662846565969d361b1b7c248847a48e69f2b9eefb4ffb0bc2efc56a8fd", + "dst": "38cVLswijqC2ANV5HxTroeapQzqeoBR88C", + "coins": "50.000000", + "hours": 30769 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 62, + "block_seq": 119 + }, + "time": 1429364282, + "txn": { + "timestamp": 1429364282, + "length": 220, + "type": 0, + "txid": "4d080ff1f8ac21d8c09a2dca99d28ae88e9441d7a4757dca68469ad64838cb55", + "inner_hash": "bd2066b342e0af8c4bfecd15d3a87f168cac47d1f900642b69b23fbf18bfed05", + "sigs": [ + "ea1adfe309f30a15691fc3e267b19d7b765983694245adbebd92924db1adb67668d4dc8a6467e54323d245a35c0ed822593e10de2fd6c4674d3040b53099a6aa01" + ], + "inputs": [ + "ba0a94662846565969d361b1b7c248847a48e69f2b9eefb4ffb0bc2efc56a8fd" + ], + "outputs": [ + { + "uxid": "cbe8b620c1468dbb1e69e6da63831bde5828db313879a36f783a1f16f2b86541", + "dst": "38cVLswijqC2ANV5HxTroeapQzqeoBR88C", + "coins": "12.000000", + "hours": 3846 + }, + { + "uxid": "f480c6097568036b90a2e019f9ee68c0812b2da8828be33a005a7427caf14a2b", + "dst": "f38daJDg8rpwL5xWgMY78fBHncQ1N5gQZ7", + "coins": "38.000000", + "hours": 3846 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 61, + "block_seq": 120 + }, + "time": 1429364452, + "txn": { + "timestamp": 1429364452, + "length": 183, + "type": 0, + "txid": "d1569ca879f98450a920a2b427ab0e1d21342308fb6b4ea5031ee6e718217183", + "inner_hash": "12d27fdba804c648b8f72d9740d4021b05c88c95d3595af4afab2150092c5eee", + "sigs": [ + "2baa243ca1b82bd9fc1a31a0b53c9f7eb0ad62b19d6a4d3af62579cc2dc455d81d8ed82ba342dc650d4ae38718d81a8df6a93a9a809749a2f5391894bbaf298400" + ], + "inputs": [ + "f480c6097568036b90a2e019f9ee68c0812b2da8828be33a005a7427caf14a2b" + ], + "outputs": [ + { + "uxid": "3f9712cab0d3aeb217f1751fa19e53d75f814b4218866d4e70d63f32271d2023", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "38.000000", + "hours": 480 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 60, + "block_seq": 121 + }, + "time": 1429382678, + "txn": { + "timestamp": 1429382678, + "length": 220, + "type": 0, + "txid": "da82deafc15c36e7dc9cd95663e0dc910ae626ee543147ac7bd8682be00f7baf", + "inner_hash": "c98f858a27e76b0b565baaa3dffc6cfc7b0ffe9dd7d2d71f4bb0ad4d1c439ca2", + "sigs": [ + "15fccdc36c966a9571196a3f727ebda47162441df2d9965ac27109ac56d22cb41638b404e84b5b388d809b814ade18022cba0a6e021140c6b7d0144a6facd6d501" + ], + "inputs": [ + "6beca9fb58a327580c614d7fb5622916849756790b661bcabc880666364fdf47" + ], + "outputs": [ + { + "uxid": "f8a1990492f970227ec29e6e095fa724d66fa2d6883bd8723773098d08ca8b3c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "801600.000000", + "hours": 378646 + }, + { + "uxid": "e5596ef0ba04ad9e0adbe0355a24c6bef249654906f917b68f8f0cf072508674", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "62000.000000", + "hours": 378646 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 59, + "block_seq": 122 + }, + "time": 1429382898, + "txn": { + "timestamp": 1429382898, + "length": 220, + "type": 0, + "txid": "211f5fc97ba1797d78f84d4e4db78415b5ff4121f78369535fe3f8015571c6df", + "inner_hash": "586a8297d8d148f79d8529fbc3e356f5de9570a3c34bc1ba8494b8269b03d0f2", + "sigs": [ + "cccee00def7817ec1b36ba5b02066f82eae188afc3e05e61524c62d19fe095e0363db085da6591841314da5f836f2f0068eae522e3d3937d2f96de99f924af6a01" + ], + "inputs": [ + "f8a1990492f970227ec29e6e095fa724d66fa2d6883bd8723773098d08ca8b3c" + ], + "outputs": [ + { + "uxid": "998487775c0e58420673b70204b83c1d6bb5b70e34b1aa0f8169c85ecec2438e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "765600.000000", + "hours": 47330 + }, + { + "uxid": "1e0cf4e3ed49b52944f533a212e6412291e369ac3e7a8c4440424f475f2983b3", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "36000.000000", + "hours": 47330 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 58, + "block_seq": 123 + }, + "time": 1429451746, + "txn": { + "timestamp": 1429451746, + "length": 220, + "type": 0, + "txid": "9003d3caba9587d46d000cc614bb52bed34adcc5ea404c560c986eb6dd756e6b", + "inner_hash": "2a87bcb0049b9971713a2e46b75b348785adca751b151290a411bfa5a0ed2287", + "sigs": [ + "0da91c351fb050c243c7b587005bee14ccc2951897ffdf720ad9c757c5946e516a20ca0d92c5f84957161d10a74deab05a2b530ab5bbcd7ad01266213b5eb38401" + ], + "inputs": [ + "998487775c0e58420673b70204b83c1d6bb5b70e34b1aa0f8169c85ecec2438e" + ], + "outputs": [ + { + "uxid": "6fb116c110fe391448a1dcb985b67439c2e9a71d8bb2fd1cf345ac73ada6166a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "755600.000000", + "hours": 5916 + }, + { + "uxid": "8e764a87cee9f26b902f748c28a5a49de5c383e5f155129eec84474a3d0349cc", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10000.000000", + "hours": 5916 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 57, + "block_seq": 124 + }, + "time": 1429522086, + "txn": { + "timestamp": 1429522086, + "length": 220, + "type": 0, + "txid": "e9a6dd585b564b19c55d9f56188a45bfad32fa75703fa6336830035f6fa92e3d", + "inner_hash": "9cdad9a848f5b2993d1e5d0593e952b39ccdf7ae56bd13851449797cccdced5f", + "sigs": [ + "1f3d02abe6811c83b4f4b2e270366e8d4c591866b6e984cb8bdea5d80ca1edbb04d651449070bbca22a8c7cfb3d23a6f85c0a5a7e3226e2d0520330faf16291401" + ], + "inputs": [ + "6fb116c110fe391448a1dcb985b67439c2e9a71d8bb2fd1cf345ac73ada6166a" + ], + "outputs": [ + { + "uxid": "04471fb0797bb931e883f7b95cfff6ee4fea5e19a352ca5425fcd353c4f6aba4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "750600.000000", + "hours": 739 + }, + { + "uxid": "a4fdfce34725eb63941ac576651fa406272565a344ffb21435d285111efbc4db", + "dst": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", + "coins": "5000.000000", + "hours": 739 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 56, + "block_seq": 125 + }, + "time": 1429578056, + "txn": { + "timestamp": 1429578056, + "length": 220, + "type": 0, + "txid": "1ca0a2d44b6439b91eb839e0f99405abdcafe2c1a49c8b49b1739498129bd1a6", + "inner_hash": "1090d10a5a2210dc205d6f8447918670f9351feed057c76423629b4699777dcb", + "sigs": [ + "39817412c5edb4cd928aa3b79a022d4b3276af74eb377d3821c1e95e4d6c6acd61ebbf5eb5d32f87686b6cb4f09c2660e1f148192873208fc963d67a6945fe0101" + ], + "inputs": [ + "04471fb0797bb931e883f7b95cfff6ee4fea5e19a352ca5425fcd353c4f6aba4" + ], + "outputs": [ + { + "uxid": "6b616ad99a946538c3ab101f245bcab211ab39507848425e80cbfc8ec5bdbc67", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "738100.000000", + "hours": 92 + }, + { + "uxid": "a08089cd67896683d5dcb2d50256354e0d086b9854eb22bb6022cc459d447211", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "12500.000000", + "hours": 92 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 55, + "block_seq": 126 + }, + "time": 1429680646, + "txn": { + "timestamp": 1429680646, + "length": 317, + "type": 0, + "txid": "a67ed00f815a2fd20d0efd18ac04663f0ee3d5621fbfdcdc6af250f19e3cfc53", + "inner_hash": "3587ee0a091f047bce0dc6f3a45ba08a0c95db33790c53185f6dfd626040b306", + "sigs": [ + "7753de16df3b46c78529de293ed45ab7d566f3a2fdeeff381aa8bc903111e62c117ce54623e582dceab853fd4d9431e05bd003ae0f470db915e555d3d6dea80500", + "414a1f765e1f437799d095f76a3e0ce23ab9ebe150be93e4f3d0abd72eb403ed32ddb15d36956fc9142cd4b5875d5769803e197bab3ecf91f6b72e75087f40b000" + ], + "inputs": [ + "e2512ec90800147d0d9ddbd0778511ee5a45a25efcb354c50a101738a65462c5", + "6e2abc4bc7820178358a603b7d99c4b39735dd1685d0c5a778ab63f29c9e93d9" + ], + "outputs": [ + { + "uxid": "bca6e6b24cdabecd77186a61168dd3e2290b2fda1b7a79eb3856ca4cc9f589e2", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "990.000000", + "hours": 17310 + }, + { + "uxid": "e4a83076c2ce1bd83953c1c0443054d7f5b0843c551d35b3fc3c116e9a9134d7", + "dst": "odhAMxHhXoBdx1RHNmfu7dTZ1LZivfsbiH", + "coins": "10.000000", + "hours": 17310 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 54, + "block_seq": 127 + }, + "time": 1429848410, + "txn": { + "timestamp": 1429848410, + "length": 317, + "type": 0, + "txid": "243e1baa955c3f0af42d7acc4c920437dd0a99c754d6c5c2b7defcd143ff288d", + "inner_hash": "e7e030478e5828f44ec15b734638e8c2828f015b2fa5ca2823d24af3ad111ae6", + "sigs": [ + "1519c5c730648e7be553b2738aaeff38266735276e640c8f8d455f33c4fc07283ae5a7da47742df118337ff0548efebb1c75d0350a4e578ff95269182779db2201", + "ee099f6f42c813d13f097e9b3a8604067d6afd3718e6eeacd88fb25050d42b8603a42c4f7d24058483f70328a24fc91cd6ef190286c4a678e28b757143e23dc701" + ], + "inputs": [ + "c5df36ce47f6f183475317ab1c53eaa65428c142cb3e3906bf162d80519a203f", + "53b376413d550663ab51b229df8b0f55e4055d6577c2d8b5cec8ff748fe0e958" + ], + "outputs": [ + { + "uxid": "8169bf7f8fa21dc6400b60678b302946cf2765f44893ec8466262fc69b710591", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "30600.000000", + "hours": 528376 + }, + { + "uxid": "ef488d5f4a019502115d3b6b50bd364692315c3954d7e93c3ca22e11b92fc528", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "100.000000", + "hours": 528376 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 53, + "block_seq": 128 + }, + "time": 1429849170, + "txn": { + "timestamp": 1429849170, + "length": 317, + "type": 0, + "txid": "c2c9fe882df3b44fbb125b251a7604a7a4f4195dddff6e5396b7f130744e2b27", + "inner_hash": "e23ed05dee949be1aabf237db1fd81be8d73c838eb0ee3026104807053269431", + "sigs": [ + "8e9b1733227a841009881663a50e1e01ac2790f16416c6f973c89e15a8fc216044e156cc8fee84d3e3cc6371e4da340f5312726bfd66f16a635542d63c869c7101", + "d1f6b7078a9032159a165ffbfb1e0665bf9ced2c3d5db795fd5bd11fc53d790f56589cbbffd117eec50aa0dc8c0e65eccb13c5ccb5d39dc9bae739a49dda03b201" + ], + "inputs": [ + "6b616ad99a946538c3ab101f245bcab211ab39507848425e80cbfc8ec5bdbc67", + "ef488d5f4a019502115d3b6b50bd364692315c3954d7e93c3ca22e11b92fc528" + ], + "outputs": [ + { + "uxid": "ecb92dc2f43d4c6ca124575d8456d8894f3cb137875287beaa73180fcae2b3ca", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "737200.000000", + "hours": 6994818 + }, + { + "uxid": "6143275de37a2b5ec802eeeb8d38a3dfb2db6629128e44c4f9ffc0ce8ddad629", + "dst": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", + "coins": "1000.000000", + "hours": 6994818 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 52, + "block_seq": 129 + }, + "time": 1429849180, + "txn": { + "timestamp": 1429849180, + "length": 220, + "type": 0, + "txid": "66d415598af081f8a7bd7f292468e67f380d06bf5896eb8152d4d9e8bcdf289e", + "inner_hash": "3381919a36bb294377845155efa9f6ebb9314abbe5f9904b20ece45eb0960dc6", + "sigs": [ + "0a7f9eb68798320106f652933bd07181c80571a6f66215a5b10531f1205e0f300c702324cf9c368e67fef67dc42fbfee5bb13377c435873e549d9fd6962bad9501" + ], + "inputs": [ + "8169bf7f8fa21dc6400b60678b302946cf2765f44893ec8466262fc69b710591" + ], + "outputs": [ + { + "uxid": "78126a08c4dd4ea7ca2d6c9f9d4614fa58896ec4ea301cb9b450104b00bc1b94", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "29600.000000", + "hours": 66854 + }, + { + "uxid": "169e9a77557283e0d158fe6e35c439d729d73acfd00e2969147dacbdd599817e", + "dst": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "1000.000000", + "hours": 66854 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 51, + "block_seq": 130 + }, + "time": 1430311531, + "txn": { + "timestamp": 1430311531, + "length": 220, + "type": 0, + "txid": "2df67e974b03b46be4e59fcf2f8b751d501f17f8610d5adf94551a7ecc6a58af", + "inner_hash": "be6b1ad4d9985314d2bc6434f8a49cef708e7461f047154c7283e2a4ed13aae4", + "sigs": [ + "abbfcf7922d466e79c976809cf58932a7030db6b54465a2166168617e6acdafd3d7d62391c626e9c150155c63bee7cc887d84fb5f017298a0ce7c33859b21a4500" + ], + "inputs": [ + "78126a08c4dd4ea7ca2d6c9f9d4614fa58896ec4ea301cb9b450104b00bc1b94" + ], + "outputs": [ + { + "uxid": "903a1bca9b81ed76179cbcffe6e3c8eff269c94826148286f7be0b6038ee4ccb", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "28600.000000", + "hours": 8356 + }, + { + "uxid": "37cc43693a024f9122f5e1fcabeab5d53a4d58590df30a934fc7bc545936e049", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "1000.000000", + "hours": 8356 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 50, + "block_seq": 131 + }, + "time": 1430330041, + "txn": { + "timestamp": 1430330041, + "length": 220, + "type": 0, + "txid": "6538399868cf772fcfa96e68c51aa6aa66faa95d7c685432e4005880932be134", + "inner_hash": "4854d5689f4c2b770d887ebf7f7d3fb975b295b0180d9354d69f2e322ae8b7b7", + "sigs": [ + "d213d50e53ceffd053571431b78fa6417abae8a7c5080dd3f8cece59dc61ad2444dd541540f5734d34dca94b3b975b613da0800121af8ec83b6f20d81cd53ffd01" + ], + "inputs": [ + "ecb92dc2f43d4c6ca124575d8456d8894f3cb137875287beaa73180fcae2b3ca" + ], + "outputs": [ + { + "uxid": "6b4ca83b3f73b62161c90c6da03dff460ca9a5a3ccd6fafca140137416dedc58", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "736000.000000", + "hours": 12709509 + }, + { + "uxid": "e7756fa7a5c067d595f7300828bc4c70152653700844130d88174ba37237e2a3", + "dst": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1200.000000", + "hours": 12709509 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 49, + "block_seq": 132 + }, + "time": 1430330311, + "txn": { + "timestamp": 1430330311, + "length": 220, + "type": 0, + "txid": "3dfdfea4614d05c2f5eddf5773ef0afc745f1afe585141659df8e03e82897606", + "inner_hash": "3a4ac407aeec6233d3edf787d5b1f4d8257b594e9ee9d0ad3c32781053579b36", + "sigs": [ + "f37f3398240cee8e38c41945db72d4feda20f88a2250528fe1165533acdc7dfc0f99c7db0fc965847a100d0a2f598537cdd8c73a96c5fbb4e5e85dbfd9a4384701" + ], + "inputs": [ + "6b4ca83b3f73b62161c90c6da03dff460ca9a5a3ccd6fafca140137416dedc58" + ], + "outputs": [ + { + "uxid": "2cd58783beb8a9f6278f7a097151531091b5f15afd7735e1facf02aa720c1191", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "735000.000000", + "hours": 1588688 + }, + { + "uxid": "333156ed20ba6937d3720af3a81939362b9f4ad1e9591bc676945ff0d202131e", + "dst": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 1588688 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 48, + "block_seq": 133 + }, + "time": 1430330421, + "txn": { + "timestamp": 1430330421, + "length": 220, + "type": 0, + "txid": "d30cec3ad3a66562d2513a3656b366ea7da583e6ba45214ac12b9c2219b4c5ea", + "inner_hash": "58e355edef48ff22e9a83952130c1bd8fe9a7f9bec7b2e0535c103c0146604c6", + "sigs": [ + "09baa4739816e5a86a46ecc30df8c00a5f046ad687f0674250640b6df2361dfe3723667872e0f6deb1d3447948e30b06f02b056a62da9dbaaef4db000eab747e01" + ], + "inputs": [ + "2cd58783beb8a9f6278f7a097151531091b5f15afd7735e1facf02aa720c1191" + ], + "outputs": [ + { + "uxid": "52288a441c70260f6a3eab0e271969d54492377615a6fba8ec3ad26f11dc9768", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "734500.000000", + "hours": 198586 + }, + { + "uxid": "8b3d335360effd00cabcae13c2495f26f81743b82958629378b7bc78a7e460fe", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "500.000000", + "hours": 198586 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 47, + "block_seq": 134 + }, + "time": 1430330481, + "txn": { + "timestamp": 1430330481, + "length": 220, + "type": 0, + "txid": "44d05abc2637d9cd2047984023eb5cfa0a146e58821117de30f9c81703189cde", + "inner_hash": "44886be6952cd483b9425d314836714af65037b58923aa2432ea946131ae10f6", + "sigs": [ + "7990cb04634a5e0de397917e56480805915c73d265fe466757a9e677067483787d457c7e9931a89daa6260c7a262f49ef1503cc88008809c193f1f949badcfbb01" + ], + "inputs": [ + "52288a441c70260f6a3eab0e271969d54492377615a6fba8ec3ad26f11dc9768" + ], + "outputs": [ + { + "uxid": "e29ec214f4afd79e6465d03e4d88e552dc69654750a725d74873ee366c58e552", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "734400.000000", + "hours": 24823 + }, + { + "uxid": "d95d422fb8fe4ad9ce1052e566ec8a5ad7953ceb253366814b3d32e9a1da1f13", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "100.000000", + "hours": 24823 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46, + "block_seq": 135 + }, + "time": 1430330591, + "txn": { + "timestamp": 1430330591, + "length": 220, + "type": 0, + "txid": "072f0738f834db0030d777e6ec0e0443627c51cecffcc55e41d43b0b8edd40d1", + "inner_hash": "e87dc97ec672bb45a3417f307e6f6a1cd75b26f508f188c0554484740ffea8cd", + "sigs": [ + "da4e898bdf324ab50d8f007ee4c65ab832ba64cf86fd0a601e7007a4c3ac2eaa6f1304a3fc8088b108e3f417e5b7c90cbc7d80c059885d397ae978da89c92d5f00" + ], + "inputs": [ + "e29ec214f4afd79e6465d03e4d88e552dc69654750a725d74873ee366c58e552" + ], + "outputs": [ + { + "uxid": "8ea58a3736b35f0e3781e94198e8b73bba2536704b84b15900fb32701db8893e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "733400.000000", + "hours": 3102 + }, + { + "uxid": "617b584bb9e6b1d80daac915fb3079b22a326777d1515a40e7b7eddf427f4099", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 3102 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 45, + "block_seq": 136 + }, + "time": 1430330851, + "txn": { + "timestamp": 1430330851, + "length": 220, + "type": 0, + "txid": "b9a795552bec1a722718b44a08ad152656242b1d23afb53d2247b3016d920b7e", + "inner_hash": "8096fec4a2738f5b79df5359724f6cd7597c0d8c5bc18419f5825c5312e1dac0", + "sigs": [ + "315cc1de04ad6d1d68e9d63027cff2abc74d5b11a376623d70211ac0e8b9feed4c7f7952634d60b57604edfbe63f02bef172486320e9790d0bb6e44099d6473500" + ], + "inputs": [ + "8ea58a3736b35f0e3781e94198e8b73bba2536704b84b15900fb32701db8893e" + ], + "outputs": [ + { + "uxid": "a1ed39cded6d9a0605b52f25cbedb363e57a168d1ad1d1db437816a401c061ab", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "732400.000000", + "hours": 387 + }, + { + "uxid": "e00c292e151fdafd24984b2dc08a4a328150006f95afaac9909dbffae1f07eaf", + "dst": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 387 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 44, + "block_seq": 137 + }, + "time": 1430504186, + "txn": { + "timestamp": 1430504186, + "length": 220, + "type": 0, + "txid": "fc02772662176c282c2b6538732d3d6eb1399f006a0b52e64d07fc104038f638", + "inner_hash": "a7ef2323ca6ef0a15173dcc2ef44c0abd10933be70337360408ffb4087affb80", + "sigs": [ + "9a30550db56d9c9ae901d835f856761b9c4298d56ffa94bf41eff5550ac180851189f2adf2e184b6f23485a1405eacb2d4cc937ff05490fb0bc609e654effd7900" + ], + "inputs": [ + "a1ed39cded6d9a0605b52f25cbedb363e57a168d1ad1d1db437816a401c061ab" + ], + "outputs": [ + { + "uxid": "f89c968840831d03abaf3c41cf8a405e4b4ddbfb19f5ba300a8ea8e4dcb1d9a4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "731400.000000", + "hours": 48 + }, + { + "uxid": "b6b6188973b600af774ad8a7b6d454f77713a51463b9a9a70c901ec5280a9789", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 48 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 43, + "block_seq": 138 + }, + "time": 1430504236, + "txn": { + "timestamp": 1430504236, + "length": 220, + "type": 0, + "txid": "9880bebc51471e0b3c520920db836d674f652503314cd74069a59ccad0d0967a", + "inner_hash": "feeb2f638e91dd685e6fe179edc7622ef3fcc8a5a7e795c07be12e03f221f67f", + "sigs": [ + "a0c15d7d5f36afc4c78045aae19c8d41a8652f0cb6d633622a1e55b4e54cd5a33113b02c24b02cca10797043d992aaac98bdbb33addd038611ac324795733c0b00" + ], + "inputs": [ + "f89c968840831d03abaf3c41cf8a405e4b4ddbfb19f5ba300a8ea8e4dcb1d9a4" + ], + "outputs": [ + { + "uxid": "36972dc046829caa340eaecbfeb42f4174bcdecfb87296d56503e5fb10e9de8d", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "730200.000000", + "hours": 6 + }, + { + "uxid": "bceafc261a2250f1bfb8154aea88370acfe6a41a4216bcb76c2016451cbcffd1", + "dst": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1200.000000", + "hours": 6 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 42, + "block_seq": 139 + }, + "time": 1430504536, + "txn": { + "timestamp": 1430504536, + "length": 220, + "type": 0, + "txid": "578075959959db70ae86f4f60d2ae3ff245727d086eef86ed80db5e1c7c9fbaf", + "inner_hash": "eead8ec3c5e86e73f1e7add274fdbe0cecd5cd68c4fcd3cf17c1c7af9c5ee43d", + "sigs": [ + "d6331b6d3270100b8b009bbd343d6b82208d622b27ca3a4b371492b9c792f8433c981c57dfc760a3974f13acd86bbb24555b958e0c67e247c5a39d97295022d601" + ], + "inputs": [ + "36972dc046829caa340eaecbfeb42f4174bcdecfb87296d56503e5fb10e9de8d" + ], + "outputs": [ + { + "uxid": "6962c7c1fcc98f532a9003990163bb251811a4700257968a641b1fe975cfc51d", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "729200.000000", + "hours": 0 + }, + { + "uxid": "278b0caa6dddf4ce74772471b15fb9a8c364362b0ae3eeb9379e980504d8d512", + "dst": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 41, + "block_seq": 140 + }, + "time": 1430504746, + "txn": { + "timestamp": 1430504746, + "length": 220, + "type": 0, + "txid": "de45a24c9c32f808a3d928f30ba8e1b6ef8117a7c0b7a5d616734d9b121d0c30", + "inner_hash": "efeb898fd032831cdd6d7c311f496f4c2622ee11bedc2831b6411cab51d44736", + "sigs": [ + "1646b02579d23e2350e2bc47340e027ad5f74bf55aba41fc1244631ba1e0577b681d364c3802017b5cc5d5fda972d23ac9bffabd6159384223a26aba5f08406401" + ], + "inputs": [ + "6962c7c1fcc98f532a9003990163bb251811a4700257968a641b1fe975cfc51d" + ], + "outputs": [ + { + "uxid": "d53fae3b48bde2d1328964a2e7f42e8e833983db159ba30f627926dea0db7df0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "728200.000000", + "hours": 0 + }, + { + "uxid": "cfdefd8d167947190a223882d20c8ac7880e550ad1a3494bb05bff4b1df4e3ff", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 40, + "block_seq": 141 + }, + "time": 1430504846, + "txn": { + "timestamp": 1430504846, + "length": 220, + "type": 0, + "txid": "16f8b9369f76ef6a0c1ecf82e1c18d5bc8ae5ef8b01b6530096cb1ff70bbd3fd", + "inner_hash": "529b1fd21087bf52cb3ebcf02dbe1e3ce5de9daefa9754e5b6cde7be2d8ab0c7", + "sigs": [ + "8612c9e160f3e0d7cdcb2adf3611bde867dcb766c63ec4312a9251ba9b6ea6997c0d9a6ce26beaae01e82c22d2b61e5ae7f87aeaf0679fde395888aebafde94500" + ], + "inputs": [ + "d53fae3b48bde2d1328964a2e7f42e8e833983db159ba30f627926dea0db7df0" + ], + "outputs": [ + { + "uxid": "228794e6b3eb69aecc5334e140afbad22883326dcf229bd3092f238ed9ec800f", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "725700.000000", + "hours": 0 + }, + { + "uxid": "908fe94bd28886547f1b7b4fc98d0990a08a216b70877341f566b6b4685de364", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "2500.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 39, + "block_seq": 142 + }, + "time": 1430504966, + "txn": { + "timestamp": 1430504966, + "length": 220, + "type": 0, + "txid": "030177271beee04f1a0974d0c5042f07c7ca1db1c5d496fbee3c441b1b7c5bee", + "inner_hash": "d954f0ee1a437cf3809961063145bb205633ac66d9a29e1386eddb13503ddac1", + "sigs": [ + "6e5661f0212dfa0800df968dac30f931335d7fe99d23932878d7d2c06bf69691328d66897c3a5c023535035ed95de3b396ea162e4482e70cda5ec9d4c8e36d4b01" + ], + "inputs": [ + "228794e6b3eb69aecc5334e140afbad22883326dcf229bd3092f238ed9ec800f" + ], + "outputs": [ + { + "uxid": "6efc30b4c943ba4de8d2c89901a0b2a4d9a0ecf34713917eae37c6debca616ed", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "724700.000000", + "hours": 0 + }, + { + "uxid": "18293d947aadf89d9e57d18fa01408867a9abe267504edbdabf8c2a57d9a6323", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 38, + "block_seq": 143 + }, + "time": 1430505086, + "txn": { + "timestamp": 1430505086, + "length": 220, + "type": 0, + "txid": "57150aecde96bde972183b9b0d7d27dda2c0179fb71630e92c27856d211335cd", + "inner_hash": "8fa5487fbcb62adb17287cc80ea02f113f036035e486fe7a37a96a98d32582b8", + "sigs": [ + "ba2442a6f68ef825f2921dc135eca398904426f8d225eb122b210670d1b3bf1b2279abcd5cce5c18533dd8ca0286b23e2be9605f1cb6a5820bc1c783e95b833401" + ], + "inputs": [ + "6efc30b4c943ba4de8d2c89901a0b2a4d9a0ecf34713917eae37c6debca616ed" + ], + "outputs": [ + { + "uxid": "6c8b1ba9dc7e8900b42d55e9fbe6ea0e00d7eaccf67a7b66c0a2b771cf88ea05", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "724200.000000", + "hours": 0 + }, + { + "uxid": "456bcb0a2e57a5c20f2757c8fc7669af1f969bb5a57f89965210daf7107993aa", + "dst": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", + "coins": "500.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 37, + "block_seq": 144 + }, + "time": 1430505176, + "txn": { + "timestamp": 1430505176, + "length": 220, + "type": 0, + "txid": "3bb9fc516dc2c522e28f99e6833253863c550547ce0e0a2dd963a0118b7a44a7", + "inner_hash": "111d56ae43b76740e905717e1e440f7611e922c50e83cf84b9edc51efa0271f2", + "sigs": [ + "18f2b86a6b51999f0fdc73d411c1db827730652ba2c098f1ff3f3dc0d409d6cf745d18d66bf25dae7e5a975e33f32e8d2b352c025a8e20ff15a68aaa60b1bbb700" + ], + "inputs": [ + "6c8b1ba9dc7e8900b42d55e9fbe6ea0e00d7eaccf67a7b66c0a2b771cf88ea05" + ], + "outputs": [ + { + "uxid": "59d44fefbe86ebae4118dee90609d6a1c08c36f259c65e3fad63b9e41c37bf0c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "723200.000000", + "hours": 0 + }, + { + "uxid": "d8ee5dc5cabcf179365345167d39977ae38a71e55cf357881258be32a45732bc", + "dst": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 36, + "block_seq": 145 + }, + "time": 1430550936, + "txn": { + "timestamp": 1430550936, + "length": 280, + "type": 0, + "txid": "f25c1a8a4ae37e8e2b4a0ec6f2553cf11c57fa77de9556cd227857ca270a0275", + "inner_hash": "c41100ec46608d1982d52cce518abf64c3853a0fff71349c001accff2204de2a", + "sigs": [ + "f5521c2b488dbbd7bd856275b903e176f61a5cc940855d502493b834755fa9037cdf484fef8b3c7950ee166fa1db7bacc5ed18f96b48e13f849c96d76463dd6800", + "f324406fc1ad817ad53cd6d7718b914172ed80828650a6c7a4bd69143dd6be5e681ad4cc897ba5f237bb40836368c580e3fc8231c80ad0f91bf1fd17df28f3b800" + ], + "inputs": [ + "c2fcd55cf6b73e863c96f7c2d6251069199bfd43688d2515f5c6631688aadcbc", + "06292fe8a2036c38f28c4d2f355d9e86e2b55b9d85f84613a64cf5c35d192b28" + ], + "outputs": [ + { + "uxid": "7afab03c823346ff8b00c29df6acc05841583d90dfd451ba09e66884a48e83f7", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "2000.000000", + "hours": 99134 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 35, + "block_seq": 146 + }, + "time": 1430641376, + "txn": { + "timestamp": 1430641376, + "length": 220, + "type": 0, + "txid": "5701965d326520f86335da87c6d1781fd49f1e66520b94e1783711eba724f482", + "inner_hash": "b792056beaf4a864c92e40ad63f9117fae52f4bfda9f88aa74f1255490c28ef6", + "sigs": [ + "1d98fdd17853e4265c17644a993fdbe5047418b7be96258fdf3c2b3e9c739b1d72c5acc23981dac2d478966834fafa1f98aab2402ce37fe818d3919cf490a5e900" + ], + "inputs": [ + "59d44fefbe86ebae4118dee90609d6a1c08c36f259c65e3fad63b9e41c37bf0c" + ], + "outputs": [ + { + "uxid": "5baf8c8ab1a01d80a6f496144815cf6bda5289b34055010e21324ea3950d3299", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "722200.000000", + "hours": 1149084 + }, + { + "uxid": "3dd82b00ef4d1e3b1c71be5f13c0c82b3e2b17af4a6b3eb4c966490f47866ccd", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 1149084 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 34, + "block_seq": 147 + }, + "time": 1430641536, + "txn": { + "timestamp": 1430641536, + "length": 220, + "type": 0, + "txid": "3fae944ef07d9bcba1bcbc8bde87da50a1232132074803f8442deb563ed2da51", + "inner_hash": "aeceb514529fcf9de954599318d804301689818b8d5c90cdbd3bdf6ce3768c47", + "sigs": [ + "b6b837c14a65c31150c24f93ac60a9b49baeb963cf49a8d97e817883ca46a3763168988b69542c5a52b7501674271ded3888bccda558aad004902ab7b7010f5501" + ], + "inputs": [ + "5baf8c8ab1a01d80a6f496144815cf6bda5289b34055010e21324ea3950d3299" + ], + "outputs": [ + { + "uxid": "dd07d759d92e3d628a35c467dcd919dcae825a9fa79a14855714270dae08c0ce", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "721200.000000", + "hours": 143635 + }, + { + "uxid": "3ec30639c24acce65054bdb0d7ab0539199b64cabfcad83c2ed7f266fb8849a6", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 143635 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 33, + "block_seq": 148 + }, + "time": 1430642006, + "txn": { + "timestamp": 1430642006, + "length": 220, + "type": 0, + "txid": "79681167a7681edecb998e4a6dccdd0b7be45f163c8f6db23436517936269fb8", + "inner_hash": "b06c37ee520387277d5c174e0fefb11dbbbee9c7ffe53715b7b5bab8f4693dfe", + "sigs": [ + "150ffd203e65dac9dbfcaffb384a9233a274e0ced5a0c2fc9a3127e7a85df894124a5c1f0501c60640dce7d7c09cd1783ed61461f285fa89e6227ba1b427e81d00" + ], + "inputs": [ + "dd07d759d92e3d628a35c467dcd919dcae825a9fa79a14855714270dae08c0ce" + ], + "outputs": [ + { + "uxid": "c739b518f3f700e810f81523d81b15f968fbf202f389ceaa9d9f303319a00275", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "720200.000000", + "hours": 17954 + }, + { + "uxid": "5233e499bd3e38ec4d4fa4d750290f25271c91b4903630d461be51f3c2c02ebd", + "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "1000.000000", + "hours": 17954 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 32, + "block_seq": 149 + }, + "time": 1430642106, + "txn": { + "timestamp": 1430642106, + "length": 220, + "type": 0, + "txid": "b69536fbec9911da41e9d0c5ca73459f5e692ba155f8b72c0972792e9937a0fe", + "inner_hash": "a6d1d92496583cefdf9a9d4e278cdeac9d8e7c31eec3061f0a91bc0116ced8e4", + "sigs": [ + "d98168e1f19fbabcf0ec9fdf21d36486a2d70b13624bd2ec765bc773a08c7f5c09c7df2664e3205c7555bd3c5cb64ca78f5f0a81613ef4a7d740348e0132caf901" + ], + "inputs": [ + "c739b518f3f700e810f81523d81b15f968fbf202f389ceaa9d9f303319a00275" + ], + "outputs": [ + { + "uxid": "95694746f813d018be7988aec666b52924a7815adabe9cbdac3f6ab0f51bd1ab", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "719200.000000", + "hours": 2244 + }, + { + "uxid": "eb57ec196fe95a09be19b62b6837d5d12f99568ad0e5e198f70f55083acd656e", + "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 2244 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 31, + "block_seq": 150 + }, + "time": 1430642306, + "txn": { + "timestamp": 1430642306, + "length": 220, + "type": 0, + "txid": "3e228564e3c187e22bd489857fdb1db7036021e19f688aad56cfee57d5e13ac5", + "inner_hash": "9b4783f4cd11a81e945a2d09b699f76254caa3bbf22ce8533f3b9f179c207702", + "sigs": [ + "8bd5632a52c39ef9e9ce90ebabd119c8f93e32a5a5b6e8fe80c58163b4adcc040725f18321894b59c3546c8ce9fb182e1a4dd6a3b4405229635e3ac3d80213a700" + ], + "inputs": [ + "95694746f813d018be7988aec666b52924a7815adabe9cbdac3f6ab0f51bd1ab" + ], + "outputs": [ + { + "uxid": "be958e5c47415291a781648335db24e448e1f4f09aa5e9c3f055fbc906b574d7", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "719100.000000", + "hours": 280 + }, + { + "uxid": "0fa23085def7c1dbc95587d3f0f58cbc30b09e099ee1afa42d9120452777740a", + "dst": "sV8sVBgs11uHQtZK5MPbYem2iJ6Hehghv7", + "coins": "100.000000", + "hours": 280 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 30, + "block_seq": 151 + }, + "time": 1430642426, + "txn": { + "timestamp": 1430642426, + "length": 220, + "type": 0, + "txid": "18607765c3fbd45eafa15d2d62ab3cbc7ba7bd80c42931aae4db75aa02898671", + "inner_hash": "dbbf7608b67e82363ced90b364a9b8c91029b336ef2b68182d986e399eacb41a", + "sigs": [ + "1972310d45a5baf10a8d929a132c725c51cdd19daae3baa640570aeadbb08ea700fbe46e6649289bec61065b05250b84872002f93634e6be81bae042cf80854b01" + ], + "inputs": [ + "be958e5c47415291a781648335db24e448e1f4f09aa5e9c3f055fbc906b574d7" + ], + "outputs": [ + { + "uxid": "68165429853e18e4414ec6c15630262ebcaa802ff1d83b6cbe116db51cb32066", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "718100.000000", + "hours": 35 + }, + { + "uxid": "efcb1b5f54bceb2d0124d2f89c47d071c2943fb228c2eee62bfddf6e1418cfc8", + "dst": "pMub1Pz3SLVaSwHoomgp5oDVxdkVxLkW6L", + "coins": "1000.000000", + "hours": 35 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 29, + "block_seq": 152 + }, + "time": 1430642546, + "txn": { + "timestamp": 1430642546, + "length": 220, + "type": 0, + "txid": "dc10e0565a14dfecda066577581f3e2d073de34ed3e911ed94413d38fc0a33d2", + "inner_hash": "821dfa6422bb093a528a2ec2bedd0566599cef3e2f4f91441f3073888e092832", + "sigs": [ + "1bb9e5e58a4a7dfc9a29bb22eabb2ee4dc6e40dd71b35962adf95d1c1208309727f070257b4591e959a4965cb8d22710233dd1f65c3b58ec47bb71e3d7ebd3e700" + ], + "inputs": [ + "68165429853e18e4414ec6c15630262ebcaa802ff1d83b6cbe116db51cb32066" + ], + "outputs": [ + { + "uxid": "46aeb9ea01bb04e28c55ef11f8e75434dbeee546f7e06bdef332c604590c48a1", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "717100.000000", + "hours": 4 + }, + { + "uxid": "c0548bf35c950a74c206d2c565e3bcac1f2abe170ebabdb7b74e439b642dd9fd", + "dst": "22WGCstVJGVyqnBuvGHt17L5aNNMpURvckd", + "coins": "1000.000000", + "hours": 4 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 28, + "block_seq": 153 + }, + "time": 1430642816, + "txn": { + "timestamp": 1430642816, + "length": 220, + "type": 0, + "txid": "b0d7ff47658b3e32d8457eb62f6df0c7caaf7feadcbf8cc0c713976026f0404c", + "inner_hash": "5154559a3393277ed8db279bf27a9572c9aeebe81f321d9fb07a5e4313005a90", + "sigs": [ + "a3edf9a3203fc696aefde6180d6c28fbaf3f4ee662ea90d82a93c3a8485593465f956713abfea8322b952d61969b29267f3826775638da77a1bf8567a40564e500" + ], + "inputs": [ + "46aeb9ea01bb04e28c55ef11f8e75434dbeee546f7e06bdef332c604590c48a1" + ], + "outputs": [ + { + "uxid": "598503902d2e6cb62d6f6478f09d8da05af6fd2da92b50825da3b7f74b2df34c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "716100.000000", + "hours": 0 + }, + { + "uxid": "045dc2e76321e37884588093083ce1b21be12f20ba1fa36f2a755b894229e3cf", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 27, + "block_seq": 154 + }, + "time": 1430643706, + "txn": { + "timestamp": 1430643706, + "length": 220, + "type": 0, + "txid": "be0957035ed2ac444f67273fc5c1c6a39ee373f6f83d1604d0023742a8cd7e42", + "inner_hash": "957140523c9acc14a4f6b6a2fd05e70c58d2ed51f43b4e88b1406b398f4e7b2e", + "sigs": [ + "ee25ac881aa867780086df4716864a9ec524deeecc140faa60b9f9b87805816c22659836b5169f8eab0977a2337638b6ed7cd7c4a5d4ee3664e7ad28e91dd5b901" + ], + "inputs": [ + "598503902d2e6cb62d6f6478f09d8da05af6fd2da92b50825da3b7f74b2df34c" + ], + "outputs": [ + { + "uxid": "4b917e7bd3409c43f9f670f2846ce74f9288708df5aa1d9ae142f2411ce426da", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "715100.000000", + "hours": 0 + }, + { + "uxid": "dbc58940c2457359501c9906589c3d0a0ab7695b983ad79f2bcc087a675671f6", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 26, + "block_seq": 155 + }, + "time": 1430643906, + "txn": { + "timestamp": 1430643906, + "length": 220, + "type": 0, + "txid": "c9582c8134fa64fdf08cd93d42035adcced3f16aa8ee1a1393e3fcd7c07aa40c", + "inner_hash": "ecd6b0cab28125e3ec1fe23a046c259a7d608802da7d6397dbd8b410de03b94d", + "sigs": [ + "95e5d5d0856bf5387de8fbdae05f5953510fd85ec346e65fa5fb68984bdb1ab83aa7807e57f00354d934f84a0034ecf8aa74fe3b8e9e480021873f62827770ab01" + ], + "inputs": [ + "4b917e7bd3409c43f9f670f2846ce74f9288708df5aa1d9ae142f2411ce426da" + ], + "outputs": [ + { + "uxid": "d50a372f8f8cd1e0b10d847613b68ee760f195f5f212d6c59e86312c84dd07ac", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "714800.000000", + "hours": 0 + }, + { + "uxid": "25a72cc385c1cdabd0ffd7c141ae205d767f3d016c281f835b9f58f9325bd2a5", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "300.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 25, + "block_seq": 156 + }, + "time": 1430644036, + "txn": { + "timestamp": 1430644036, + "length": 220, + "type": 0, + "txid": "29a883ef9dc67bc683014187b9865c827b5e2f8afd7bf6f3787483318063789e", + "inner_hash": "bf3a81668fb27c0f55d9ec33490cb4c91ec7636ec1f85761fadbfebc020a618a", + "sigs": [ + "970a22ba9a849caf00fc787a182dd67a3be794db9d66c691e9d904a78f90397542dee63e801c8b7f4077060fda76f0ac56a67b30865cc4634679f118abe04fc101" + ], + "inputs": [ + "d50a372f8f8cd1e0b10d847613b68ee760f195f5f212d6c59e86312c84dd07ac" + ], + "outputs": [ + { + "uxid": "896865f9b610f9fb69a741596b3ecb9fff3790d40476a9f7852831bdf477aaee", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "713800.000000", + "hours": 0 + }, + { + "uxid": "a34cfb6f175323917dfda72d58ddcfb86363cc43d22a0c6c3141810f5cac5aa6", + "dst": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 24, + "block_seq": 157 + }, + "time": 1430673946, + "txn": { + "timestamp": 1430673946, + "length": 220, + "type": 0, + "txid": "c3fd04cd27ea311b1a67d40cd3dbb2ea8ae2c6f6139620cb86be29f33ed99171", + "inner_hash": "5a975ee4a0f95c51a0a847b1d082bc4859a4b7904acbaece151c58e01f26a870", + "sigs": [ + "06c22eb6cb03468010ffbd2b54faa5835ea44cf552779b0adb09817db7e5494d49031d2e4b8994b670857b193766a1f430857955edd627f290f71f970407139b01" + ], + "inputs": [ + "896865f9b610f9fb69a741596b3ecb9fff3790d40476a9f7852831bdf477aaee" + ], + "outputs": [ + { + "uxid": "272d5bbd86a87796a20e3e4debc46a2076718800343bee4f72fc0217a98a10a3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "695800.000000", + "hours": 0 + }, + { + "uxid": "25130a18aca13a37e4f4c08733cdda6a8629759f27ecba775999486c9deffa5e", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "18000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 23, + "block_seq": 158 + }, + "time": 1430674696, + "txn": { + "timestamp": 1430674696, + "length": 220, + "type": 0, + "txid": "3d9f1aa1b6206275081cb9c26155f6261be1ef9c94b4eaadb1a7e8277a2099fa", + "inner_hash": "ef7915c2cc32cfd043bf60533a563a89ee68a7b2f88e9e1e55e6a54494bde805", + "sigs": [ + "6d2993d471d4b27d4b0c2beef286dab7e38013853926fef032a8a10d9161fbff59b4eba58d7578182f9f1e79ee763ab409aec46748351b0a7d1a020a3fe3824100" + ], + "inputs": [ + "272d5bbd86a87796a20e3e4debc46a2076718800343bee4f72fc0217a98a10a3" + ], + "outputs": [ + { + "uxid": "60906201d3e7c67ddb976972460b2b8ed093e1f6720a784cbaea376ca13e6cef", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "670800.000000", + "hours": 0 + }, + { + "uxid": "c61f27a2247831679d8df293bf9351b16e8429778c875be2cb64224bcb842ed4", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "25000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 22, + "block_seq": 159 + }, + "time": 1430715196, + "txn": { + "timestamp": 1430715196, + "length": 220, + "type": 0, + "txid": "d720ca0efb19b964f481724e5d3f932841e9e75a69b998baf4b575cf3298cb87", + "inner_hash": "b35da2487dfd396bc01b5296fab691557760886b23ba5bd18e52808549dbfef2", + "sigs": [ + "9cb0a128d17a9c42f3e4e44f4da9106ef11407da8d9a434745add4c5f7a8e379325976d8c2222c3328acdc2c6ca597fab4fae292c5529e07c55919ce0e0320ca01" + ], + "inputs": [ + "60906201d3e7c67ddb976972460b2b8ed093e1f6720a784cbaea376ca13e6cef" + ], + "outputs": [ + { + "uxid": "4912e9dbbb5a4cc7472c27b0212ab443e7b5499207b10666a66257005e182714", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "664464.000000", + "hours": 0 + }, + { + "uxid": "b1e5c694c30326cda3df2e634723999befbcbb141415e9a36bdbf18d7bea9870", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "6336.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 21, + "block_seq": 160 + }, + "time": 1430784172, + "txn": { + "timestamp": 1430784172, + "length": 220, + "type": 0, + "txid": "0e8e352b1f2cd419bca619918ce6d5ec1eac0ba7252d76eef5d9d8f8186f737a", + "inner_hash": "49571d7e7c6b3e473b938f1cf4748c67f9301ca710f26ee56d0d8e231cb4515f", + "sigs": [ + "8d4556a22c5fb84792cc88bfb47f795e6ba9fc211933776acd89b6da9aff71ea7803bf5b0e1d9afef2f3f77bbc4a7633c459ab9cb11a06723c4cad570717edfd00" + ], + "inputs": [ + "4912e9dbbb5a4cc7472c27b0212ab443e7b5499207b10666a66257005e182714" + ], + "outputs": [ + { + "uxid": "659bac1636b64087ad5d3cb0ae78c52f28ad920016ec67e08415a537e0343072", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "663464.000000", + "hours": 0 + }, + { + "uxid": "ea18f151bbdb611f73596b61ebb0546b9e91281ccb0bbe07a18e7fa69142bb5b", + "dst": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 20, + "block_seq": 161 + }, + "time": 1430784312, + "txn": { + "timestamp": 1430784312, + "length": 220, + "type": 0, + "txid": "d5091ca65ff61998dfb4535a7927fb736abf2a81140a11322dcf8226de27cf92", + "inner_hash": "7a000aaa5751b65d3bccd4d307b7b8602aae539971de3af3baa3e126d52a54f2", + "sigs": [ + "693d3153218a69e2ef1e676d6c124dd7fab7ee312d41fd9dbe005a0e681a8b052708a9559fc08e8173e1ef83e45f838742e4a1af765ea7f0fddb38cee2cced8000" + ], + "inputs": [ + "659bac1636b64087ad5d3cb0ae78c52f28ad920016ec67e08415a537e0343072" + ], + "outputs": [ + { + "uxid": "97f64c3c636e5fc997e277cd48644055ef51045ed9c473c05dd6e699872a6c3d", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "662464.000000", + "hours": 0 + }, + { + "uxid": "0c19e689e0e34639c71b0136ce336121b042b6d4ac185ac1f9e94ec7535e781f", + "dst": "XnKU1htBL5wFSMX8oytZBsBMeaBSbVNivT", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 19, + "block_seq": 162 + }, + "time": 1430784372, + "txn": { + "timestamp": 1430784372, + "length": 220, + "type": 0, + "txid": "30e66ff45cfb145eb465e2ebdef0bb10005138bc1727c83888785b04d548e85b", + "inner_hash": "c87fb6e81fc1d99b16958d4626aa0e5ec4033443230bbc8b35e2882c078bf868", + "sigs": [ + "b4feadec09b450b99795044931a94f7b8549bf876db7c62132df60056dd0c88e3821d1656407b1572fbb04eb71f6de57db43c997501989f44042d04fc3afdf4201" + ], + "inputs": [ + "97f64c3c636e5fc997e277cd48644055ef51045ed9c473c05dd6e699872a6c3d" + ], + "outputs": [ + { + "uxid": "122b7a9a61ee04e071002d74ffb26b12ed7952ff9a138b5437f990f4678cc2e5", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "662314.000000", + "hours": 0 + }, + { + "uxid": "db7a63750db787959a9e0d2d6be9a1ba8bb3d6015bae2353a27ae9eb55b39d22", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "150.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 18, + "block_seq": 163 + }, + "time": 1430784932, + "txn": { + "timestamp": 1430784932, + "length": 220, + "type": 0, + "txid": "ec79854fade530d84099d5619864a8e1e8ec9d27a086917a239500cada43c6e8", + "inner_hash": "ed6a317c8ea3624337463c1cca78bdcf87bf80dace1bccad050d27a49d3ea1d2", + "sigs": [ + "c0548625b3bc88308155f598c3304a124632c0faef8005b8f9306b229b632b253c5e163a02409ba40b01560f77a6acde2ccc48cb0efedd4feb68ecbd925917fa00" + ], + "inputs": [ + "122b7a9a61ee04e071002d74ffb26b12ed7952ff9a138b5437f990f4678cc2e5" + ], + "outputs": [ + { + "uxid": "c07593d4329f82da243e4bbd7430e4b10e7b35f9ce0a3718d0e6d25d20b4939b", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "661314.000000", + "hours": 0 + }, + { + "uxid": "250543215c71a1a9ab7740fff25c3bf9695fcde10bceba3717aef9d0f6dd40d8", + "dst": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 17, + "block_seq": 164 + }, + "time": 1430790052, + "txn": { + "timestamp": 1430790052, + "length": 220, + "type": 0, + "txid": "743bf1eede313145824db1c4f8d683b74ab5e0bc825082d986308b73fd52f1d7", + "inner_hash": "a0427c37a8ca9f8205630cc8d4c6d95200413d3397a0de9bf015763107b8fc80", + "sigs": [ + "dc400e921f7f94da5f353846f1340e039b4527fff121a56579390fb4fa4154634e3b3aad44ddf0aaebea5abc1dc5ba2a00540fd2888ed5c4ab7b20c51255086a01" + ], + "inputs": [ + "c07593d4329f82da243e4bbd7430e4b10e7b35f9ce0a3718d0e6d25d20b4939b" + ], + "outputs": [ + { + "uxid": "4d52106e41dba0099549fd81fb8feb6915225b0125c53faa0f7c578ea78f213a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "660314.000000", + "hours": 0 + }, + { + "uxid": "bc513a68461d5c401e65a500baf7dfa163735ef63b817bb7b73c4139d5c29d18", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 16, + "block_seq": 165 + }, + "time": 1430790152, + "txn": { + "timestamp": 1430790152, + "length": 220, + "type": 0, + "txid": "3991a257eee265481e713917a3a9c15756f61175bcfc7acfdbe84158e43fd5e6", + "inner_hash": "dea502923be2dd8b4c48eb7ed2b146793ef840e9749d129bf7f6bda0fdcc43de", + "sigs": [ + "dbb23f6d22438c10b98b437fe2ee4d7c5513aba7b0b6141648ac22f07e3768fc5d8d80f9dbcaa95edf925668b6018793a01ca70cf7b48d7c7deac106557ebf7f00" + ], + "inputs": [ + "4d52106e41dba0099549fd81fb8feb6915225b0125c53faa0f7c578ea78f213a" + ], + "outputs": [ + { + "uxid": "fef9dd3b633274743099e607d9229717a001d6de6a4031479cc30d31d65e8396", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "659314.000000", + "hours": 0 + }, + { + "uxid": "5954742a6ca4e3e872d12d4a93436451ad52e6d25e5ac28371e308b2d7ce75a3", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 15, + "block_seq": 166 + }, + "time": 1430791622, + "txn": { + "timestamp": 1430791622, + "length": 317, + "type": 0, + "txid": "41589644ea3a344fc616bec0058cf916b8efa5da7c3539241244827bd7e19811", + "inner_hash": "140c70de73812b1da58d3df6c62696a0ced32ac1ea0818c3c53da4968407eae4", + "sigs": [ + "c9198240191df5c8b107cb7b6fcb5f4a572d8ae2ac85dd0def832df2f9cd7d806594c1ad2bf2279507de1b9f1e7cb067a4c5562dedf3e40c29fb23387e28277c00", + "cd4e83142b6592dae1d61f92a82b0e17ae43a34207c69e1970cc5e8e8badc06f4067f36da90a142e963d5e35228c0f405482e38064c69eb5d882b6d619109baf00" + ], + "inputs": [ + "37cc43693a024f9122f5e1fcabeab5d53a4d58590df30a934fc7bc545936e049", + "903a1bca9b81ed76179cbcffe6e3c8eff269c94826148286f7be0b6038ee4ccb" + ], + "outputs": [ + { + "uxid": "074645413ab2aae818e657f6f36420447a872e7cdd2ff64324b486be4d4d1edd", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "29100.000000", + "hours": 494004 + }, + { + "uxid": "b945bacb354173c33bc41503f50c29ad5d1d333ecab66b0c70d0ed9e6eec7f3a", + "dst": "2kN23viEG7Kn3Utuwz9voM4Z8ohLR9Y8L2v", + "coins": "500.000000", + "hours": 494004 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 14, + "block_seq": 167 + }, + "time": 1430791902, + "txn": { + "timestamp": 1430791902, + "length": 220, + "type": 0, + "txid": "b29222c08f10b8bc4ea18981519a3b0e02b9c9cec63ee28d9ffa2efcaf2a8e5a", + "inner_hash": "61c38575be160010335d96cf7c6ef0608cdb7b85079f2518532d00b6f42f13d0", + "sigs": [ + "cb5c75671164755516cbf4d94e2288d56985b4d3113538bc818d1aa1c944a76b1beae28964c8e596ab0cd252cda6cf2a5468cbd0dbeff21e35609b5a6577eb0a01" + ], + "inputs": [ + "fef9dd3b633274743099e607d9229717a001d6de6a4031479cc30d31d65e8396" + ], + "outputs": [ + { + "uxid": "21f0fb666dca05d7a43ab26a378f7f7eaedfacde22fa047ca72857e9509cc748", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "659214.000000", + "hours": 33652 + }, + { + "uxid": "0b5e5259c276ac949de97062492ea6dc93ae6215c8dd1615862907e3c3ae9cf0", + "dst": "2A2YC8kxWnUDbscpzZ6UPfNAmx5ddKBeYNs", + "coins": "100.000000", + "hours": 33652 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 13, + "block_seq": 168 + }, + "time": 1430792072, + "txn": { + "timestamp": 1430792072, + "length": 220, + "type": 0, + "txid": "50fc81b0ba25669105a169a969459ccdb10278051b604a3f91467c2528c83652", + "inner_hash": "c356824e25deeecd3f531eb56a26d5875b7b81743e9c8f3d6beff5f634bf5e3f", + "sigs": [ + "ac3b968f82649fac3822db1af5c0be17fc20cf86e091362b1584a2b66c033b10541f70fb6f55d8e1b3c57161ce37412a52d2009dd8abc9ef7ab038b19d8d644401" + ], + "inputs": [ + "21f0fb666dca05d7a43ab26a378f7f7eaedfacde22fa047ca72857e9509cc748" + ], + "outputs": [ + { + "uxid": "6b3a0cab1d9ad6fd011a3bac5e6ff4e3f7903bce911dc7fe83926eae557c34c3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "658214.000000", + "hours": 4206 + }, + { + "uxid": "a02148f770788851a35fb90567510044e37f8db930deab7a2b584af67c8efb2f", + "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "1000.000000", + "hours": 4206 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 12, + "block_seq": 169 + }, + "time": 1430836392, + "txn": { + "timestamp": 1430836392, + "length": 220, + "type": 0, + "txid": "acfb61f7ca39d5dfe33e8ed66f73ab181da0a3206d457bf055dcc4b9731a3ec8", + "inner_hash": "85c5d3963f2dce44e99500967e8b8b1943839537fb198186131459a3022d161a", + "sigs": [ + "473114dcb42e2091f3d0396ecd16ee2685e0a6074c7de218cbd7e7c4335d89146455bc6c259c77f40d4af769e241aba1e3a102c5755946b1783c817ffafa67d101" + ], + "inputs": [ + "bc513a68461d5c401e65a500baf7dfa163735ef63b817bb7b73c4139d5c29d18" + ], + "outputs": [ + { + "uxid": "639e69c4a223b5082b9274caf3e56ecff2ab55cd90cac94fdb4c383a1013ba1f", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "990.000000", + "hours": 70 + }, + { + "uxid": "bffea1990d71311b695b2d343b9f09a216b7a8257c1cdcb01b2ab9459e1490e3", + "dst": "jtuSERvfzN3kUYekg8LemCQ5kF5g97N8ZL", + "coins": "10.000000", + "hours": 70 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 11, + "block_seq": 170 + }, + "time": 1430836422, + "txn": { + "timestamp": 1430836422, + "length": 183, + "type": 0, + "txid": "95d847102c01d071982e67b8e7dfae50715b0fc0179d33f4b050974e634905e1", + "inner_hash": "c13b7e1722f3616f61948ed42382d4ed41164e7e2110d2d60bf86725f32531de", + "sigs": [ + "cb7da0e16b83f1717614c7f160580ac0048a4276682ac4046c3324ba6f4e24901d162f7ec81a8e5cdf3676df6ace9a73c77e4d3ab7f03a4f0272c75f3715665001" + ], + "inputs": [ + "bffea1990d71311b695b2d343b9f09a216b7a8257c1cdcb01b2ab9459e1490e3" + ], + "outputs": [ + { + "uxid": "be081639ea8da63d8542707e9ea9625f6afc97da132f43ed061645c359bb1e65", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10.000000", + "hours": 8 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 10, + "block_seq": 171 + }, + "time": 1430870562, + "txn": { + "timestamp": 1430870562, + "length": 220, + "type": 0, + "txid": "fb495093f2f4e5c6555c50150ea60c0a6f430e53aa971ebb3e2b5412866a1f06", + "inner_hash": "05596340e51ad628080101c8e92a60f27e0f5ab509e892f9b65a0988b1575ddb", + "sigs": [ + "068a56e916267a1756d9348bb965f3ed2dcba956fe4c626cd4836921dd836f7c0fa923d6451d5c87aa2eab528ff19ec332434bd12e197eeafbf0896e84940c4401" + ], + "inputs": [ + "6b3a0cab1d9ad6fd011a3bac5e6ff4e3f7903bce911dc7fe83926eae557c34c3" + ], + "outputs": [ + { + "uxid": "372703f8109295f0f58fbee58795979e10dd887869f4fc1da4881ce8a3c0aeb4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "647750.000000", + "hours": 1014129 + }, + { + "uxid": "a35044035cce79cb988c757dcaf5d9a065957c0fbc1a3559d08ed46831504fc2", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "10464.000000", + "hours": 1014129 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 9, + "block_seq": 172 + }, + "time": 1430870592, + "txn": { + "timestamp": 1430870592, + "length": 220, + "type": 0, + "txid": "7abef7e4080bf2cbe9f147d7c9cbe4c950b38f8477d304466c938b937cd379ba", + "inner_hash": "f28366f7590220cd42faaf9ea041c8ca4460707e0dbfe1d3ac67da8d9dda268c", + "sigs": [ + "e9ff8a0ce6c5e8b09936e031ef8cc6a0f3f3ed0a5360dcf2f649db3a2da958441c20916b27d1ad2ea8415679755b36967074e20feab7271528cb6b3266268ec201" + ], + "inputs": [ + "074645413ab2aae818e657f6f36420447a872e7cdd2ff64324b486be4d4d1edd" + ], + "outputs": [ + { + "uxid": "b1b832a911d45aeaab73676caad794fe2ab99d423f80c4ff58cfb269656b03dd", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "28100.000000", + "hours": 141512 + }, + { + "uxid": "c31c199a54ecbea5e57bf7f5e73d231a09e11713dd0ee70e340e4b0a9c9f9fdc", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 141512 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 8, + "block_seq": 173 + }, + "time": 1430871512, + "txn": { + "timestamp": 1430871512, + "length": 220, + "type": 0, + "txid": "a7665cec98224150968ec1ef9ef2d6b3175c9de8f9f8c7bc786b30cc74997c57", + "inner_hash": "5bd2503c4ff78e7c9d182bfe5e62e54f1bfb944bb526d97b272021d8ccfa9359", + "sigs": [ + "dbd1e8763cb9681aeb96edc0c8483decee30b670778bec88da249f9d4f2201c330d2a16349608ba51eb8a387805dce9618810c4e6fd7af548cccee7d2c9c5dd201" + ], + "inputs": [ + "372703f8109295f0f58fbee58795979e10dd887869f4fc1da4881ce8a3c0aeb4" + ], + "outputs": [ + { + "uxid": "14027340f6e1d98bba3f7f5f3b50e3588f8a19e4d021db944e7a28b2643640e1", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "635750.000000", + "hours": 127440 + }, + { + "uxid": "793f3f0e41c9d1de391d864792b79ed8c24dde5ff84a73c161d660a73ed70c90", + "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "12000.000000", + "hours": 127440 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 7, + "block_seq": 174 + }, + "time": 1430871622, + "txn": { + "timestamp": 1430871622, + "length": 220, + "type": 0, + "txid": "ad44a8027a825e82a20cdd910d9bd41d74025601b7668c80655e9b45afb8bb93", + "inner_hash": "af11c711190f9b52114dd31dcc4dbcdff3f169c6ce2559ff5baf14032e057145", + "sigs": [ + "fd019f0cc492d5b6ba1bab0e3c77659b0e4773ea9b7dbe9808ea1392bfcd41e20aec3438076cb6ae4104bb6730b47ad1f1cfe878155f984ee380da10991b2a5601" + ], + "inputs": [ + "b1b832a911d45aeaab73676caad794fe2ab99d423f80c4ff58cfb269656b03dd" + ], + "outputs": [ + { + "uxid": "c39acd3494113650c1a6a7809287af7b12a78bbd97126d4585dd1715e2cb5a66", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23100.000000", + "hours": 18586 + }, + { + "uxid": "2d3f7890d11efedd4cee3a7ab4a5cbc56d2c8df4f02124bdad9ec839400053ba", + "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "5000.000000", + "hours": 18586 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 6, + "block_seq": 175 + }, + "time": 1430908702, + "txn": { + "timestamp": 1430908702, + "length": 220, + "type": 0, + "txid": "9364ed6cfcc289df74dc6bac1993f7ab3441b898cb3f06918198d2476c83dbac", + "inner_hash": "a55922b0495d39c8e9db70ac9aca99266d5a7f3644106b4b5468345d955acf41", + "sigs": [ + "cecae09b7925e9f6db1ccf5ef9a93687a43bbeaefe2888abcc07411c71f850c80c05ed573abd67bf9f0e8a096a1aba8187547e3d062e5ed147ac51961cc3559701" + ], + "inputs": [ + "14027340f6e1d98bba3f7f5f3b50e3588f8a19e4d021db944e7a28b2643640e1" + ], + "outputs": [ + { + "uxid": "8e55f10a0615a0737e6906132e09ac08a206971ba4b656f004acc7f4b7889bc8", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "625750.000000", + "hours": 18358 + }, + { + "uxid": "d91e07318227651129b715d2db448ae245b442acd08c8b4525a934f0e87efce9", + "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "10000.000000", + "hours": 18358 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 5, + "block_seq": 176 + }, + "time": 1431162639, + "txn": { + "timestamp": 1431162639, + "length": 1481, + "type": 0, + "txid": "a17cf54c20ac7ec6e1362acf24c5e5589ed8b49bdba791a87430de160a473913", + "inner_hash": "71127fa12d9ca390715586fe313b4e130b24614e0eaec276dc2dd25b7228c39f", + "sigs": [ + "95855ae7d279d4797bafe542fd1803eb6a89533f29ae0d89d3f51256feeacc343dbd3da0d8d104e436c04643c72b5dab7a74634befc942ef9d96ded3e235ab4b01", + "55222337fce2733e7a3f92bf808da32759f33327c616828bdb0a350e5d3567b34fdef1a55340d7f857c4daed9735ad64394697ad941fc883f9365693991299a500", + "950281f4acb6cb8176929740aa90fa8729ac5687ef6500bc087429c43f5414e319c26142fca51c0ed9e5d434a6c83d2e3c837d7c9213398ae2104429d03f35dc01", + "c41f7425ecb51359a1da6ccf090a565beed72c891c49a8c81939a46f914c55de5766e99f1519302bfeef2224f856c859391d1f531004ee088083259fca82b17400", + "ed7085f8ceb26060851a71f665387d7c44774c6b9ddfc8d3a06e1fe50168d48510f63f5b6a0998c2a30d24bf37f1c6030035ef8df6efe6dfdcae38beeaf3a5a701", + "a88fefcc8f2809a288a275aac579f340c5138f8bfedf02964d4e3ed0492ee54e696de7e6f7f0b3f315461fb5df4f8e5e5fc7a5339ca6899c6ca7b122c54c90db00", + "ad9b245807ab8c5c5a713ab7e3bfbbba8af032bc4915c1824d95e95827d95be473eb1f6952ee489ddad59049364220bab124182251142b849235ed552404ba3d01", + "7a403c671ec5a6a6622ff63e4d482d51fda747cbe85cf8ef642aa840154be435409df707aa81a3c4e553e0c2c250a452e8416dc38697c35f830de27924a052fc01", + "06b5966aa7c7dfd425e773aafd46fdf29b41734b73f84ef1cd8941e617e0d6245e99f6d8be8b9609686b0faee4923b8bc149078ebb18c1b2e8f6318c846675e801", + "c5634bef581b26d600ed6f4cea47f402633e74ab8f5497b2c2ca69a01e3dfeda0a38308a4a96cfe58857e4c0c2311ecf4e3f4eef69aa771a1db89c360892492200", + "4807a114ffe9e44797843f76c74e81d72324885a67d560c4e1d6e4cadd271b637176a932dc045844b52a4c92f6892ebb0265838366827fd0e0b6b7e20e4e1ff501", + "bc1ca4e3d0afd920bad8c4ef8a6b847c71f75ae8ca913ddb5d976dca42af12ea3ec3a2e59ec8f57fe4fb41af3f439387272ea847240ee89468c4d808303cf9be00", + "366f0f68a36bccd22e829eb05f960a8015466bb5eeb8e553dd37b52ab624d1756f68501db2a8d14fda04d1adf3239a9785ec142c14c5bb34cb8d47629c191dc901", + "146eed504f7acbbece951bfea4eb426e80852e3dc6ae9c8a68480fdf4e07ddd73a5709e2f9df0154380d837a5ff66582c07a0fc27d0df4e7d6d28bbcb90e3c8d00" + ], + "inputs": [ + "04c0cd4cbee1e5414791d9e0b9ae4f889bc52d253b5f70b09fbc32c88fb415ae", + "f3034ffe54e869315f8e11801d3e755352fb75b878b24313302273c1b7ea62cb", + "3538af0016ec0f4d0e943c5d49daf280b416701fde4040fa72710c0ca1b5b559", + "0560bae3917bca7581af9b6c5a58e395c701ce9ed0241dac2de8a3e93c0b839b", + "3fe7d61ffa993e00200ce6be7ba347c603032ac3f8c4ace07767e630fe94d76c", + "2a09e97f7725a35af1357842206875a023252da4ebfce129eaf4cb87119cfd41", + "617b584bb9e6b1d80daac915fb3079b22a326777d1515a40e7b7eddf427f4099", + "18293d947aadf89d9e57d18fa01408867a9abe267504edbdabf8c2a57d9a6323", + "045dc2e76321e37884588093083ce1b21be12f20ba1fa36f2a755b894229e3cf", + "b1e5c694c30326cda3df2e634723999befbcbb141415e9a36bdbf18d7bea9870", + "db7a63750db787959a9e0d2d6be9a1ba8bb3d6015bae2353a27ae9eb55b39d22", + "5954742a6ca4e3e872d12d4a93436451ad52e6d25e5ac28371e308b2d7ce75a3", + "a35044035cce79cb988c757dcaf5d9a065957c0fbc1a3559d08ed46831504fc2", + "c31c199a54ecbea5e57bf7f5e73d231a09e11713dd0ee70e340e4b0a9c9f9fdc" + ], + "outputs": [ + { + "uxid": "d6735d3ad70dbf553048faf1c529d047ab12282d04e320bd67c915779fc4e3fd", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "24950.000000", + "hours": 451992 + }, + { + "uxid": "a5f3c513b5a01dc5e943a5cae91f54b54cde55e984a9480d68d690f40dfb7914", + "dst": "v4qF7Ceq276tZpTS3HKsZbDguMAcAGAG1q", + "coins": "5.000000", + "hours": 451992 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 4, + "block_seq": 177 + }, + "time": 1431162689, + "txn": { + "timestamp": 1431162689, + "length": 220, + "type": 0, + "txid": "e4850021fb706f2b7a94fec9ade3c166823dcd980dc3954437471d98fb9d2280", + "inner_hash": "1a07c8a17c429aec5c0725dc6e4891f4e304a483211f99b847a6820e410b56ef", + "sigs": [ + "e7d92fbcc6716645c2c28a66ac289453b2967c620e105c7699cee251aa6916227057789d10889689a3f3c743dadfea09e1cf747cc7b7ccb5381fe1af1069e06201" + ], + "inputs": [ + "d6735d3ad70dbf553048faf1c529d047ab12282d04e320bd67c915779fc4e3fd" + ], + "outputs": [ + { + "uxid": "ec439e7c7d8517824885ae1520fa5b19f991d7ade3a12209c0e87f6ad1d30229", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "4950.000000", + "hours": 56499 + }, + { + "uxid": "f5e7796297b7201b1ea87736fadddc7b451f9ed7d4529cfe9f03082e80917628", + "dst": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "20000.000000", + "hours": 56499 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 3, + "block_seq": 178 + }, + "time": 1431162729, + "txn": { + "timestamp": 1431162729, + "length": 183, + "type": 0, + "txid": "ecd101a6af263973ab75f87a3116231e6fe84a2281d0001c9aa2d7195545e78e", + "inner_hash": "41bc4ea9ec8214b461a5377d0ae0da38831bc972b8dd54becaf195b5943dd55e", + "sigs": [ + "4a604f9845e202871ac8741962280bb5db6f1295353042922a6f46671f27cc1d6cd4085aec390205aa5ba08f2c841295b4c86d2fab81d6e29fc958dfe9712e2301" + ], + "inputs": [ + "a5f3c513b5a01dc5e943a5cae91f54b54cde55e984a9480d68d690f40dfb7914" + ], + "outputs": [ + { + "uxid": "ba1adbf3006a239fb7ef6efb1f9390a25951a5185dc312dd81bf88025f838456", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "5.000000", + "hours": 56499 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 2, + "block_seq": 179 + }, + "time": 1431339429, + "txn": { + "timestamp": 1431339429, + "length": 220, + "type": 0, + "txid": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "inner_hash": "db98f515ce6c3d99fd7c39a6ac59ab498b1a2cc8fc6a13377ac7d3d463898e7c", + "sigs": [ + "1ca18424c9a313e9c253aecaec3c532c35c60e454f026a3d2794c772bc74a19809d53f8862962e865dd822dd054cd7f32b89b810968d95c9db6a9a0c1095390601" + ], + "inputs": [ + "8e55f10a0615a0737e6906132e09ac08a206971ba4b656f004acc7f4b7889bc8" + ], + "outputs": [ + { + "uxid": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "hours": 5521648 + }, + { + "uxid": "01f9c1d6c83dbc1c993357436cdf7f214acd0bfa107ff7f1466d1b18ec03563e", + "dst": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "10050.000000", + "hours": 5521648 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 1, + "block_seq": 180 + }, + "time": 1431574528, + "txn": { + "timestamp": 1431574528, + "length": 220, + "type": 0, + "txid": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "inner_hash": "d5b18a0c0c454e56fe1f7d0c64236d633f65717c04f08cd943f5669b4cc34667", + "sigs": [ + "2fac42571bb301783e46e804069c73c8226b637ae6385fec793e3a3860feaa6918058c55f461cef38341670c5c2da230d2241f267dbde6fc0528a6fb24362b3b00" + ], + "inputs": [ + "c39acd3494113650c1a6a7809287af7b12a78bbd97126d4585dd1715e2cb5a66" + ], + "outputs": [ + { + "uxid": "75692aeff988ce0da734c474dbef3a1ce19a5a6823bbcd36acb856c83262261e", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "hours": 377543 + }, + { + "uxid": "a4b70476ea1e079ebd3503b52eee32d490515457fce6a5aa075770b598a9d14f", + "dst": "CDD8GoJUHEvBm1pD3BQ3hEC2KcJNhvUzpu", + "coins": "1000.000000", + "hours": 377543 + } + ] + } + } +] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/genesis-addr-transactions-verbose.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/genesis-addr-transactions-verbose.golden new file mode 100644 index 00000000..50c8707a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/genesis-addr-transactions-verbose.golden @@ -0,0 +1,1311 @@ +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 181, + "block_seq": 0 + }, + "time": 1426562704, + "txn": { + "timestamp": 1426562704, + "length": 0, + "type": 0, + "txid": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "fee": 0, + "sigs": [], + "inputs": [], + "outputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 180, + "block_seq": 1 + }, + "time": 1427926392, + "txn": { + "timestamp": 1427926392, + "length": 3846, + "type": 0, + "txid": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "inner_hash": "0f7019627886818d2501af189bbac18e21b8e959891c5b2726f89e29355aa10a", + "fee": 99999999999900, + "sigs": [ + "be602113fe288f750001ab65f254ceedd8b05b1becc456a0a52a0bea10b8280e38d950933992ad3265e1f81d197036fa634b316f08b3b319ffce081aa43f3bb600" + ], + "inputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000, + "calculated_hours": 100000000000000 + } + ], + "outputs": [ + { + "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "26f585cb96f35307f0af5b9aee004a29b7795695f4c5c836104e2fbbf429a3ce", + "dst": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "18a43b8b69bbf12a9e49e6f9783ba258397e6567301aeed9e901a1e4fed9fef9", + "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5a69ef09b5de21b117cac62141a8de4eade7558c42f0ba8b50996f5ec7867c5d", + "dst": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "aef761a12e3d0fa9c4a8db62b8bab1015c32931b7e3a7fc9a77282cec218f79d", + "dst": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "445a4082da251fa161e4705d115fe2018ca15a5f92e8a0950793405410e6be12", + "dst": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "dst": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "368a609ee90ca15bbbd297af07dc6705131764476d54bef641017ffcd0885e65", + "dst": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "13afe1586015c4d7312f89d123153279e4961eb0d53a4d036847d5d989ba90dc", + "dst": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f625cf04412199c16e073dbb500e66c23cfe69043578b4a2d879a329aac563ec", + "dst": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b2da50a08756c34d059a04812451cf3296f73ba87f8cca38473ac8f051ab6d1e", + "dst": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "135c28698e80e3b2a737d59c16c79684c3fb3ec5cec59f466a39f4ac3c73968e", + "dst": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "df63056cf3ae21efa86d241876ad0194387317585dc9e4fcd80954b47d59b57a", + "dst": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4628f4cfdbf1eb7cccc25d461c46cc29e90cffb5d6277e0de641f7701d60c308", + "dst": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "47e4706dc4d80a70b20c889476fb0627ca6d5bdaa790f4ceba44a689d31b2dcc", + "dst": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b64bc50d370a06df117eb543ca051239c985cfc4b6aa527c51b700de32c7fc41", + "dst": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "390bc4c045fa9f289957b7eca529bfadac96a7dd074bcfbdd3b09e99413b8202", + "dst": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6aa162f7fc09598c4dc8f5fab7fb2383f28c3840937a001acd9f37136e1691b2", + "dst": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e440cf4c896735d3299a871f988c134f404fb2065d1f20c87c9c9bc5fa582e09", + "dst": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "eea791e84a53e4d99485519c5d2c3146b0a2ad080cf92904ae7b28c2d9a6e3ca", + "dst": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "01048ad6a538256d9a8c6c9c6321ca1a01b31cbf08e74fd4ff0f141bf97eb8ce", + "dst": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc5f1f1ddc8cb23df3d42f1e5a1dda9d356846fe930ae4484bc1eeb1b3b2c95b", + "dst": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f03087245a6b64bb69cd5866a1887ae595a9e1a86e196754984840eaf6d3eb9c", + "dst": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "239bdba27dabd52f7450f7d8521c9a7e5ac74093ae3f6f2348bf40ac9a6db7a5", + "dst": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d60879e562b65f97d40bec7309d4490ba0a8c80e2349ecb2e3505aaa50ea1e47", + "dst": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "66e685901492c94942522c346759c711ee2e78a059ef274e77a6ab433409683c", + "dst": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b497992663f99f9902deaaf487b00655820003015ea92091628f4a6e8aeb5854", + "dst": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc40377012004566712fa860e74db97305091cc163e95435e04556c70d32f9c5", + "dst": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "73304622e33994bc2d4ade2cab78d28e1b65185e60ad3c781ecfb5cbc8159136", + "dst": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fed15e8506d0e0898510311850b8863ef6d9a499215ae8823a1e3fb9c8140ab2", + "dst": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "12034bc455d0821813d7eb9afed1ed1a8f19b6f29826ef4a057b4aa0b4228817", + "dst": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fc444cdb2598f44209a41ea20afdc9065ebe51b7cd5f65bb1c0f7a7b427ce7b1", + "dst": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "618d242d95d33e2d7316612a164d89859b85f1287f0d5bed4dcb561cf478f706", + "dst": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "07f70fd4108ef4d2fde3b85411728c1f7bd3a135d2062c5a30a46cc885463780", + "dst": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "af9bcf6ba63a08e699bc101aa362f135343aaf78a56e9f88d118fca0e1ce5c08", + "dst": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6b3530bb930ed10bbc4c307663aba4377c08443498a0a2cf023b1be72f378ae1", + "dst": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fd6da5199e528958e68ee8dd003b727d4d840754ea7c1e0c05e4f0e504c9b2cd", + "dst": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "131f07f5b40f365fb537b863e4aa5ef0efcd77b7fa2ff321d90eeb743ac43678", + "dst": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ffbdfdbf3427d04f445c33e867845bec1ee64a9dfe0d0fa8284547c2226fdfa9", + "dst": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b53c7188ebf4d630790ff63275679ba48009e31af6e4fe15806619216caa750", + "dst": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b4c6639b49402c2753f83c7fb7d3ffa65da74e47fef2b781933ff55b14d09bcd", + "dst": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c956289db079c00d2f80c590d3c8ca26c37da534fe5f65e799b3982ceca493c", + "dst": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "550d2a8d3047cdae0c05a61cc3de43e758b123a6955fa067d3ac375f7d0dbadc", + "dst": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78740d5bf49989936d315bf641949232aace582e03de57db8abff940f7d51bd1", + "dst": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9f2c83c5165826de1077f428ad39d41473e32ed64cd83180d49e7d8e5db996d0", + "dst": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "883be4d7173c235933294ab8dcae8cc76609166eaa1c1f07e9b51d551c979709", + "dst": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6384ed19650d384c29db4c3a39a1ca855058fab758075be2dee759dd9e6faae1", + "dst": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", + "dst": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c238e82f3a4beee1be7b5b464e8553404f6927d5ab93c3d649d362c01097782", + "dst": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dad4991bfa5c51eb176f28c1b3f86661e02579905e6e07c997df22004e06244a", + "dst": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4ba91512c168281f41d3934b927d0d86a3136a31cc345b635095928f8e5f013c", + "dst": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c416f5e604eeada9ae8e520a429d8f19d4230626769e7121007e01353730784f", + "dst": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7b8787fd4076c27d074d2a4761377a1aa26c843c432e3b7e6b0ebf1e29528188", + "dst": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "38f22b194f04d85a6b545b37df06195edeb8503798b229ddeaa946018150c05c", + "dst": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "246377a036ad5444bcd5f47ac9e55fec7c85fc40644df593038d360554a809f7", + "dst": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c6d5e543ff5f2c2526728d588fb21753db5b7e05b8b275aa5e9b24d29350afb0", + "dst": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "98e223e6e2240fef83082d3daa86e46f10e0c71f3f74489ba95db0951a166f53", + "dst": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c8971ca91f8e21c556f647940073db003f7dd5582ae55d4ebca602d5e8e91a6e", + "dst": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dfa7822c05f54116c9fc3b2cde1ecb4667f47a2d8771fe886e832c223cdc4e82", + "dst": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6d37c0c4b6fcbac1e53a46c9c2dc5d3c3b36312c53f25b2baacc785ea77a11f7", + "dst": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9ba5e31610f0545666f102465efa8caa48ad3fb5b8abd5ae802f4a71e3f7de3b", + "dst": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "3ca365aace71e24b04d6f2ffbf7171468c5e71783858c710cae539c5e43e0c0e", + "dst": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c858f2db2a20ac562d32f8fb2a3a11039849a6e44d2bec30befb2e173532a9a3", + "dst": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1550a76598693b950346397e0e825bbb2805edde38b0d0240e50050829b7b1dd", + "dst": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "466340ab7733abb23ab24d877c673fe089c273f11808fbbd6f33a91da92ee96c", + "dst": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "401d4c0c1060ebbb4b9fb3859c2eb47789f94086f4deb01234bf46f7cdc81247", + "dst": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2c0e3aa084f5fec45f99b3f125ce7d50c6da526ef5165df5f22ba603147c3fc2", + "dst": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2e724d83e35235c23c0bb16ae9b708a5bba3c23b186b05d4b8c606f6bb4b311", + "dst": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4f30eae8c49eb268fe364eaf5ee0788da6e2f6adc2f83cd82e96a4bfe98496f5", + "dst": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8753d5775c22477a8ef74eeebf61d7de30be702e70118f552cc18ad963ffe950", + "dst": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efa2007c561dcbf7c83a6bbdd2ef75e7cca76b05330a8b948ba0dd94dee949f7", + "dst": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b379d1b8ff0153c63ee69c40a7155b97fa42ab570f68ff847d457316c4d8ab9", + "dst": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cc84f93adce16699d9e84ef32f55333402431b58dc50c17084bcb8b33f382f88", + "dst": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f38f0760769c19075034f70b059abf4d1bfa6d01e1e8c369a99900ed1eaeca6d", + "dst": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8d55f76bb0b3dd222cf85a7193501c0f4071b446f56dbd1da355b1625993325a", + "dst": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efde499c7e4444bc602b7bf5ed50e95a18ce8ec9a06ba9d850a05bb7a25ecb3a", + "dst": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2a4d631d5dc90e397d85f13410d1a6d877dcaf592a0e2be2e727443ac74b5bd5", + "dst": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e936299a21240744f6edbab493449323f920bbe15dcf294463e5a2ace10f27b0", + "dst": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "44e17f4bd29411a1614457171c06183e364bf6ff80a201717b2dfc0748e9ebe3", + "dst": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1941e5cc5e38dd92427580af699b1f410be7b29ff17d3d0ff3d046bfba0aaabf", + "dst": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ff6c0f27fcf92f3b4a3871b801c3116847fe47a7e3bafcadd4855d06012091ad", + "dst": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cd6c4b785e60757fad0e6fd4874b729ea7703fe7ee9560e1283d2eb71fc75321", + "dst": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "745eaff456a390c3868742a039e72c2a93ff8eee10417dbe848d533b89facc04", + "dst": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2f3f050c9ef31bf5c3b14c1c71699c4f4b38aa18479531194d12e6277416516", + "dst": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0b95850edabed70762768ac1695c5d7f230cccaa8de06657cda42cafba36374f", + "dst": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7c767d3a06db1ac0e1809ebe29a7d9689143259f4651837de54423e287c20490", + "dst": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78b07e8fe1366e173f2eeb75c35cd53baf0f6100de50ae12b4ffe7d0d7ba4298", + "dst": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5010eb25f6e1ed725fb901ae1e945e545ae846d7be8a135333d2d41102c33328", + "dst": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "178a33e64826cd2039b8538b74e6de513966acab45ab79d77dc9392018a65ffb", + "dst": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "044dc539d063250dc654b2bf0986a9044b4eea05e1284c11a2b313acd8dc3498", + "dst": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9fd5ea38f383291566def44b6fb932414f97123952578fe0cfb9a30eb075a099", + "dst": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "be5930e9cc35801433bcd21db84da7d4f1d8e744feca16a2c6fb00c81ce93e51", + "dst": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8cd999cd193d315e5f1c6f74c230c12e6abe6847924f6e89d988e09ca413f52e", + "dst": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0cff53628eb0e984c134b68cbe4b1bb7721a05adaa32e93b9df489a9a7a176cf", + "dst": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "a5ef046e84be9ff2485dde49afe6073811286761afac3bbd588b6e4130930479", + "dst": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cdee5f84c4f08098ac740e3a260ced14c1e199e126aa5291ec079b281a7dc407", + "dst": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6a24135f8496e7a37dcf7164218bb3aa530319f3b2bf3c7a1a9cc1bd17831328", + "dst": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "693c7f970b34ce5882e62430f4c9c28957159a257d27d4e21a61fd95c6b97464", + "dst": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c008a613cef129c180dbcc7213f2d41a14d245d06a3844d63d9beac963145385", + "dst": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "439cdfd03972fb4bb5da54208cf8098ee78228c487ce9e84623f5f83e17a7d68", + "dst": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "hours": 1 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 164, + "block_seq": 17 + }, + "time": 1428989855, + "txn": { + "timestamp": 1428989855, + "length": 220, + "type": 0, + "txid": "d952ef4cc45a89c14230ba0f7e30b782fad83cb6506ac0f503a242c568c1287a", + "inner_hash": "8fc48920982066fd4c69e2d2c0c5239cca7c296f0e3ad30e9b976c1230967478", + "fee": 2020394, + "sigs": [ + "b7eb93bcebb6df3dcad48afd66dd60bd42b1fbcdf52aa5e0c7e455e791f64a976fa416534b4e08bf3e62a2df83e13754119634c4255dd1e2e08be447d4d5b47201" + ], + "inputs": [ + { + "uxid": "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999890.000000", + "hours": 4073, + "calculated_hours": 6061184 + } + ], + "outputs": [ + { + "uxid": "4168b9378363cd81939e667cf78055d35a60d3101f5f9e3d2ae709e3981e29fc", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 4040790 + }, + { + "uxid": "c603e99ceae4d15c20360714ee07ba6e3a944a97ea9285d164c23252e93958b6", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 163, + "block_seq": 18 + }, + "time": 1428989925, + "txn": { + "timestamp": 1428989925, + "length": 183, + "type": 0, + "txid": "686db0a8cd429970bb91163033703410d4750c86ba485709fe1a3faabbbb42f6", + "inner_hash": "76732ac6a9936242193011d78a0f2849529aee767a569c9c6bb25b3bbae15cee", + "fee": 0, + "sigs": [ + "d74dcfdc8401a29b1dccc728b40b6b79faea147c65b4a859063ad77cc63aa9a62417c63b91b94678b6656fdba2f242d836b6914e77d244fbd16aaab014ddb44300" + ], + "inputs": [ + { + "uxid": "c603e99ceae4d15c20360714ee07ba6e3a944a97ea9285d164c23252e93958b6", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "d9dae1f82177f979b07016a341ed5c281ed6ed8eaa785a8a107ec16efbe541ef", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 150, + "block_seq": 31 + }, + "time": 1429021184, + "txn": { + "timestamp": 1429021184, + "length": 220, + "type": 0, + "txid": "9004c779cff67b3895500ec14b2c2e566127bb11a8af3358fe8a63dcfae9badc", + "inner_hash": "9e1eed08b004316812f4ad574f3d0f96959b2a335cdda77113abfd1673a8859d", + "fee": 60, + "sigs": [ + "6b3a3b3374c641ca252ee32cceab1b37c4c395b411e4d2515bc51f2a8ec12b9c440d25dee1b94a0231dd9492ab3e07c7a5dc054a0da987d6bf0ba6fc8de6f42000" + ], + "inputs": [ + { + "uxid": "18ea1b3cceb2ca40c01efc8f3cfd7d1d0dd69430ecdf655515aa4f8b21bd2644", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 78, + "calculated_hours": 78 + } + ], + "outputs": [ + { + "uxid": "64194899d317e2a007f89df14538795547e927c242a92f83180e6cc952304964", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "5.000000", + "hours": 9 + }, + { + "uxid": "569aa1260e734017c4eee06d84ab4a6285e2ca2041940b2915d9141527caf179", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "5.000000", + "hours": 9 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 149, + "block_seq": 32 + }, + "time": 1429021214, + "txn": { + "timestamp": 1429021214, + "length": 183, + "type": 0, + "txid": "327375203f20cb68847351c30a48597c0588a8c14319a4eb47bf440207fd045a", + "inner_hash": "217a070c0edd70fc0eaa7f858308444f32bbfe4b48e128b6fa876f60c4639bfb", + "fee": 8, + "sigs": [ + "de82c42e2523b512c0ffea3c91244dc905f59264f3c59e2f82efc3fdb7f446c728afb08bbc3478462cf25b96848da9dc4dd6b87cab569715ebd33e8102c552d101" + ], + "inputs": [ + { + "uxid": "64194899d317e2a007f89df14538795547e927c242a92f83180e6cc952304964", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "5.000000", + "hours": 9, + "calculated_hours": 9 + } + ], + "outputs": [ + { + "uxid": "eb446b8372559249c8e269b6cd028588e2e9e4f8fe9357719da9d1c22aa29911", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "5.000000", + "hours": 1 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 148, + "block_seq": 33 + }, + "time": 1429021674, + "txn": { + "timestamp": 1429021674, + "length": 280, + "type": 0, + "txid": "e89ee3e90e72108e4cd6ccb95c9f8d2b18ccfaa7ce61a7d297454debd69cebbf", + "inner_hash": "dac67377dd9d8247db41f3380288730de2e51514ec3a2986072719553b9f9e27", + "fee": 9, + "sigs": [ + "7df848876a507f4b2855818f059e62e6d2f5924af148607a0c6004b7231fdce920ac80e800a833e55cbce9938b5d8cb755b0dc434c22b03a5037972ff2d6444801", + "6499aeee3ba19247d1ef2d3ec13e46031adf0dd6a383785272776a93621f21696cf217b7375e5721e51133fc3d9806200d2aded757118fbe27a719ebf4ceaea001" + ], + "inputs": [ + { + "uxid": "569aa1260e734017c4eee06d84ab4a6285e2ca2041940b2915d9141527caf179", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "5.000000", + "hours": 9, + "calculated_hours": 9 + }, + { + "uxid": "eb446b8372559249c8e269b6cd028588e2e9e4f8fe9357719da9d1c22aa29911", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "5.000000", + "hours": 1, + "calculated_hours": 1 + } + ], + "outputs": [ + { + "uxid": "e702df2703c3de180f3e4a0e9a503bd534037c2d68e858e97a317575c5a97d95", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 1 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 147, + "block_seq": 34 + }, + "time": 1429021994, + "txn": { + "timestamp": 1429021994, + "length": 220, + "type": 0, + "txid": "08bf0f8f4a8547bcab1fef035adac2a66c80369b4485a736bdd676e782bbb037", + "inner_hash": "8fd6f4e5428c170dede16e8c02596ab0c490dd5c418d003d9232d8c2caedec9c", + "fee": 1, + "sigs": [ + "f68d819dbda0bbf7cd5e2de8088267c5b3a744bbe2d7737c7dc52060b6344a25180cc1081e5c7dadab94763d158e303f697d1d275685b32bfd1de123a376697501" + ], + "inputs": [ + { + "uxid": "e702df2703c3de180f3e4a0e9a503bd534037c2d68e858e97a317575c5a97d95", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 1, + "calculated_hours": 1 + } + ], + "outputs": [ + { + "uxid": "10998e83dc5dfe3c3f5f28ef3e5e2fced4dbd1da389678b0ea3ddb552851b6bf", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "6.000000", + "hours": 0 + }, + { + "uxid": "41c6d29aa5de770de684ab19b40bd75b99ec7f1a5ff7d15288ae4bfff568eabd", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "4.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 146, + "block_seq": 35 + }, + "time": 1429022034, + "txn": { + "timestamp": 1429022034, + "length": 183, + "type": 0, + "txid": "3170f0635cc40aded3a38f84f2ae07bd2238550ea4ee867328d0f891ea9abf14", + "inner_hash": "1cebcd96c2847d219b658733012921d6e10a6c55439736833dd0ae97b898f72a", + "fee": 0, + "sigs": [ + "179826a9f244005b2b34d145948b178533805953adff8ab924a6fd67538daaa4384d67a24473de6bb01d441e4d979e520b055cd9304188d00255eab7c04bf45701" + ], + "inputs": [ + { + "uxid": "10998e83dc5dfe3c3f5f28ef3e5e2fced4dbd1da389678b0ea3ddb552851b6bf", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "6.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "9e5779445f60d62b471862339d7a83dd8355c7a89d5fc3b751f98e9414628ec2", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "6.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 145, + "block_seq": 36 + }, + "time": 1429022064, + "txn": { + "timestamp": 1429022064, + "length": 280, + "type": 0, + "txid": "fba515a9eeaedb891c4dca862bd06108e0452270890b362f0b353b4c86845618", + "inner_hash": "3c24f665a7a02308fe6938ef3ce7e38dfe72644b1d71c5aefbe3d6844c609d58", + "fee": 0, + "sigs": [ + "faf14290ac158576f0dd4311ee4835a2542ae8b52d9ec7ab36d1af938a117f382c42855dec9b980f282e7ff8d7e19d469b084a7d44e38022e246c365368cc07d00", + "52cfd88d334818382413dfa45dd8e00a2136c352b7547dcf97894bf3eaa152cc5b10bf9f35c4dc8c75e7bb62543bd244a7c1de588b2a606aa1eb0b32c9c4ca1501" + ], + "inputs": [ + { + "uxid": "41c6d29aa5de770de684ab19b40bd75b99ec7f1a5ff7d15288ae4bfff568eabd", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "4.000000", + "hours": 0, + "calculated_hours": 0 + }, + { + "uxid": "9e5779445f60d62b471862339d7a83dd8355c7a89d5fc3b751f98e9414628ec2", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "6.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "d46e91fea3c8a6428885f941e5152dbc7f9abd356ad4d054bf20e0e806f1ec99", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 144, + "block_seq": 37 + }, + "time": 1429022094, + "txn": { + "timestamp": 1429022094, + "length": 183, + "type": 0, + "txid": "9fb039cd90a4e9b85669bd6ef878b98a9e84eec7d4804e2bff6f0dc9c2739c44", + "inner_hash": "5bc5636489d4ba7d36b4429cd3ec71491c9fa6f442fede1ea696428b574e0d13", + "fee": 0, + "sigs": [ + "3127749c2123db967563b9726cf5d6daa3ae755ec74f5e5fbc3dcfb10ececc231f5d61de693355aa5c8ade13c4c31ddc3bf9864e87139fdcd64c513702f7425600" + ], + "inputs": [ + { + "uxid": "d46e91fea3c8a6428885f941e5152dbc7f9abd356ad4d054bf20e0e806f1ec99", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "2987e7c89d353ad5d63cea2bf2724dc5f7a5ef5fb81f5ea160a307f0726ac2f5", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 135, + "block_seq": 46 + }, + "time": 1429077374, + "txn": { + "timestamp": 1429077374, + "length": 220, + "type": 0, + "txid": "0a2da0489b14156fad8fb863d051a4dac1f645f144c1e5bb65a44478623b8e4b", + "inner_hash": "787ae7cb222a23641bb33751d1428dc8e07a2f2cf11ee6293a54100836209d09", + "fee": 300354, + "sigs": [ + "9bc3b6d7cb1d66d52fc993d0799baafa1056992049fa86ce76d5909690e88c4a19920b69e2463cf34d1dddb545b61ee38fb2f9b33f92626da8afdd934c353c8e00" + ], + "inputs": [ + { + "uxid": "cb8efc0b1082c39258cb6efd59f64d88b36fcb60143c826829fc5f0ed5c0d668", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944790.000000", + "hours": 400470, + "calculated_hours": 400470 + } + ], + "outputs": [ + { + "uxid": "a6061defc41a8a55e37eaf56ebaa1177446f61719b1d5126698e79a6023f5367", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944780.000000", + "hours": 50058 + }, + { + "uxid": "a52408daa8ce7026c70b61d4df4212fb577462060f340bfce779225b3e18193d", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 50058 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 134, + "block_seq": 47 + }, + "time": 1429077384, + "txn": { + "timestamp": 1429077384, + "length": 220, + "type": 0, + "txid": "a4a202bc4431d95c307d151dea764bfc6d9ceb7e82b3eb50dc8604050622a22c", + "inner_hash": "836145a3e62a7e055acc3404c1fd6ecb237e3251e6f8b39fd526a7f48f21daa8", + "fee": 37544, + "sigs": [ + "f826793e63a3b0b837070e8876461c47af6be7a6898c370c70430b1491457cda76fc3b34e08bff41a336277ec1e93cc008f9c08ca295b418488b1ac92a5f5a4000" + ], + "inputs": [ + { + "uxid": "a6061defc41a8a55e37eaf56ebaa1177446f61719b1d5126698e79a6023f5367", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944780.000000", + "hours": 50058, + "calculated_hours": 50058 + } + ], + "outputs": [ + { + "uxid": "3b5f72e772ea886dd872b9087395398133576a6561072d5294fbcd04b49e1d95", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944770.000000", + "hours": 6257 + }, + { + "uxid": "dc73aac74348dd285a1456c1fae2204d7c2039d50a765bdaae0c31f7c7e059db", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 6257 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 133, + "block_seq": 48 + }, + "time": 1429077394, + "txn": { + "timestamp": 1429077394, + "length": 220, + "type": 0, + "txid": "4e6b363423633ad51114b250478ee7645fbd184066fa41c29e5b14d0728cdfec", + "inner_hash": "8cf88a9e5140d5e01af412c956b3de7c93bfebbb4c5993b9b0285812208f5b33", + "fee": 4693, + "sigs": [ + "670abb369c25a655b0f22c069a9523d439b8a03d122bc9f0861aff796ab965fd5e1b79812b6f458ebc0a1cd4cc223d0137eb22e1bf1cbb40265ac7301018897000" + ], + "inputs": [ + { + "uxid": "3b5f72e772ea886dd872b9087395398133576a6561072d5294fbcd04b49e1d95", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944770.000000", + "hours": 6257, + "calculated_hours": 6257 + } + ], + "outputs": [ + { + "uxid": "f265bea876ffcfb8cf64df3aca4dae4a8d7f424ff495d91fb322feddb3a7e505", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944760.000000", + "hours": 782 + }, + { + "uxid": "e4e375b9dc55ff53d6de9120f1a87ff00e00a779835f8320f2c6b3090d0466e6", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 782 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 132, + "block_seq": 49 + }, + "time": 1429077404, + "txn": { + "timestamp": 1429077404, + "length": 220, + "type": 0, + "txid": "edc27c6ecc1f76d0f23489ad7bbbdb8c653af37cc4b8f18197400aea2011ed83", + "inner_hash": "5432e686f984075091a8d3686d959b63ef620382fcb2b86794ba8dc0fb9656e7", + "fee": 588, + "sigs": [ + "c1902b37a95c5327b0e5a1f05de551d4135831b787c86562867344ee7f06235374dc1618c6b4a8e077041723bc731db72dab5554a808b1ba77d305309144bf5e01" + ], + "inputs": [ + { + "uxid": "f265bea876ffcfb8cf64df3aca4dae4a8d7f424ff495d91fb322feddb3a7e505", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944760.000000", + "hours": 782, + "calculated_hours": 782 + } + ], + "outputs": [ + { + "uxid": "e6d9b56e075a6adf520d1ae7fbab9ae06353ae0b93dc8cb17d82cc3628009a50", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944750.000000", + "hours": 97 + }, + { + "uxid": "d11b05345917d171f60c31bd2634041b73b97eae364724369ddb8d53369397fb", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 97 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 82, + "block_seq": 99 + }, + "time": 1429274616, + "txn": { + "timestamp": 1429274616, + "length": 571, + "type": 0, + "txid": "819106dc50373e5293a7e79f179693e85536e8206d82272930ec08410d92402a", + "inner_hash": "02e9a06b0ca7f91255107993e00f09e9ef983559088c5febff264c17952033c4", + "fee": 52573, + "sigs": [ + "efb713e6a1e5d328e94a51fbeb0f73e2a3b7a54e15db75797f0b709f698b16eb26e522f187a98144807e0e6cd294686ff19037975abb6d44b20b2899968954f400", + "b5d011c60020ce591a21db15823c06188515a63ca95d573c36b3af83d634fc6f1c1125db197f6283510ee33890ac168513254ad37524c77294bb5a12e8ff23f300", + "00d87b91eda33f627f6cd28cc673daf929fbec36e7bcfdf894f7491618a68b5755b5baadedc106d53d2da924fcbedbd106eadc50ec611d426720f67426c7286500", + "e64cf7e74363cfd381a3aa6fd17d7c415d6034b26b93017acaf9cf3475ccdffc53c3714d1d13409323cf77ccc81596f6e6edcec11d890979a436ef960bcb5f6900", + "fc2eb05241afdd15cdbd28cc7158d7eb4442f21a678c52332762b23ac6c2fcc76b0f79731987df0ba84d82044cd474d4cda9afda778a21b78a0659c5b588664301" + ], + "inputs": [ + { + "uxid": "2987e7c89d353ad5d63cea2bf2724dc5f7a5ef5fb81f5ea160a307f0726ac2f5", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 701 + }, + { + "uxid": "a52408daa8ce7026c70b61d4df4212fb577462060f340bfce779225b3e18193d", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 50058, + "calculated_hours": 50605 + }, + { + "uxid": "dc73aac74348dd285a1456c1fae2204d7c2039d50a765bdaae0c31f7c7e059db", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 6257, + "calculated_hours": 6804 + }, + { + "uxid": "e4e375b9dc55ff53d6de9120f1a87ff00e00a779835f8320f2c6b3090d0466e6", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 782, + "calculated_hours": 1329 + }, + { + "uxid": "d11b05345917d171f60c31bd2634041b73b97eae364724369ddb8d53369397fb", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 97, + "calculated_hours": 644 + } + ], + "outputs": [ + { + "uxid": "427462efeb07a6803f013c789ea43d93240f74f886bf9afd63dc1936a7574a37", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 7510 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 58, + "block_seq": 123 + }, + "time": 1429451746, + "txn": { + "timestamp": 1429451746, + "length": 220, + "type": 0, + "txid": "9003d3caba9587d46d000cc614bb52bed34adcc5ea404c560c986eb6dd756e6b", + "inner_hash": "2a87bcb0049b9971713a2e46b75b348785adca751b151290a411bfa5a0ed2287", + "fee": 35498, + "sigs": [ + "0da91c351fb050c243c7b587005bee14ccc2951897ffdf720ad9c757c5946e516a20ca0d92c5f84957161d10a74deab05a2b530ab5bbcd7ad01266213b5eb38401" + ], + "inputs": [ + { + "uxid": "998487775c0e58420673b70204b83c1d6bb5b70e34b1aa0f8169c85ecec2438e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "765600.000000", + "hours": 47330, + "calculated_hours": 47330 + } + ], + "outputs": [ + { + "uxid": "6fb116c110fe391448a1dcb985b67439c2e9a71d8bb2fd1cf345ac73ada6166a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "755600.000000", + "hours": 5916 + }, + { + "uxid": "8e764a87cee9f26b902f748c28a5a49de5c383e5f155129eec84474a3d0349cc", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10000.000000", + "hours": 5916 + } + ] + } + } +] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/genesis-addr-transactions.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/genesis-addr-transactions.golden new file mode 100644 index 00000000..1c93994e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/genesis-addr-transactions.golden @@ -0,0 +1,1162 @@ +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 181, + "block_seq": 0 + }, + "time": 1426562704, + "txn": { + "timestamp": 1426562704, + "length": 0, + "type": 0, + "txid": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "sigs": [], + "inputs": [], + "outputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 180, + "block_seq": 1 + }, + "time": 1427926392, + "txn": { + "timestamp": 1427926392, + "length": 3846, + "type": 0, + "txid": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "inner_hash": "0f7019627886818d2501af189bbac18e21b8e959891c5b2726f89e29355aa10a", + "sigs": [ + "be602113fe288f750001ab65f254ceedd8b05b1becc456a0a52a0bea10b8280e38d950933992ad3265e1f81d197036fa634b316f08b3b319ffce081aa43f3bb600" + ], + "inputs": [ + "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0" + ], + "outputs": [ + { + "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "26f585cb96f35307f0af5b9aee004a29b7795695f4c5c836104e2fbbf429a3ce", + "dst": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "18a43b8b69bbf12a9e49e6f9783ba258397e6567301aeed9e901a1e4fed9fef9", + "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5a69ef09b5de21b117cac62141a8de4eade7558c42f0ba8b50996f5ec7867c5d", + "dst": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "aef761a12e3d0fa9c4a8db62b8bab1015c32931b7e3a7fc9a77282cec218f79d", + "dst": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "445a4082da251fa161e4705d115fe2018ca15a5f92e8a0950793405410e6be12", + "dst": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "dst": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "368a609ee90ca15bbbd297af07dc6705131764476d54bef641017ffcd0885e65", + "dst": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "13afe1586015c4d7312f89d123153279e4961eb0d53a4d036847d5d989ba90dc", + "dst": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f625cf04412199c16e073dbb500e66c23cfe69043578b4a2d879a329aac563ec", + "dst": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b2da50a08756c34d059a04812451cf3296f73ba87f8cca38473ac8f051ab6d1e", + "dst": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "135c28698e80e3b2a737d59c16c79684c3fb3ec5cec59f466a39f4ac3c73968e", + "dst": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "df63056cf3ae21efa86d241876ad0194387317585dc9e4fcd80954b47d59b57a", + "dst": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4628f4cfdbf1eb7cccc25d461c46cc29e90cffb5d6277e0de641f7701d60c308", + "dst": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "47e4706dc4d80a70b20c889476fb0627ca6d5bdaa790f4ceba44a689d31b2dcc", + "dst": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b64bc50d370a06df117eb543ca051239c985cfc4b6aa527c51b700de32c7fc41", + "dst": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "390bc4c045fa9f289957b7eca529bfadac96a7dd074bcfbdd3b09e99413b8202", + "dst": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6aa162f7fc09598c4dc8f5fab7fb2383f28c3840937a001acd9f37136e1691b2", + "dst": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e440cf4c896735d3299a871f988c134f404fb2065d1f20c87c9c9bc5fa582e09", + "dst": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "eea791e84a53e4d99485519c5d2c3146b0a2ad080cf92904ae7b28c2d9a6e3ca", + "dst": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "01048ad6a538256d9a8c6c9c6321ca1a01b31cbf08e74fd4ff0f141bf97eb8ce", + "dst": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc5f1f1ddc8cb23df3d42f1e5a1dda9d356846fe930ae4484bc1eeb1b3b2c95b", + "dst": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f03087245a6b64bb69cd5866a1887ae595a9e1a86e196754984840eaf6d3eb9c", + "dst": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "239bdba27dabd52f7450f7d8521c9a7e5ac74093ae3f6f2348bf40ac9a6db7a5", + "dst": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d60879e562b65f97d40bec7309d4490ba0a8c80e2349ecb2e3505aaa50ea1e47", + "dst": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "66e685901492c94942522c346759c711ee2e78a059ef274e77a6ab433409683c", + "dst": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b497992663f99f9902deaaf487b00655820003015ea92091628f4a6e8aeb5854", + "dst": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc40377012004566712fa860e74db97305091cc163e95435e04556c70d32f9c5", + "dst": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "73304622e33994bc2d4ade2cab78d28e1b65185e60ad3c781ecfb5cbc8159136", + "dst": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fed15e8506d0e0898510311850b8863ef6d9a499215ae8823a1e3fb9c8140ab2", + "dst": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "12034bc455d0821813d7eb9afed1ed1a8f19b6f29826ef4a057b4aa0b4228817", + "dst": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fc444cdb2598f44209a41ea20afdc9065ebe51b7cd5f65bb1c0f7a7b427ce7b1", + "dst": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "618d242d95d33e2d7316612a164d89859b85f1287f0d5bed4dcb561cf478f706", + "dst": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "07f70fd4108ef4d2fde3b85411728c1f7bd3a135d2062c5a30a46cc885463780", + "dst": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "af9bcf6ba63a08e699bc101aa362f135343aaf78a56e9f88d118fca0e1ce5c08", + "dst": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6b3530bb930ed10bbc4c307663aba4377c08443498a0a2cf023b1be72f378ae1", + "dst": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fd6da5199e528958e68ee8dd003b727d4d840754ea7c1e0c05e4f0e504c9b2cd", + "dst": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "131f07f5b40f365fb537b863e4aa5ef0efcd77b7fa2ff321d90eeb743ac43678", + "dst": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ffbdfdbf3427d04f445c33e867845bec1ee64a9dfe0d0fa8284547c2226fdfa9", + "dst": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b53c7188ebf4d630790ff63275679ba48009e31af6e4fe15806619216caa750", + "dst": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b4c6639b49402c2753f83c7fb7d3ffa65da74e47fef2b781933ff55b14d09bcd", + "dst": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c956289db079c00d2f80c590d3c8ca26c37da534fe5f65e799b3982ceca493c", + "dst": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "550d2a8d3047cdae0c05a61cc3de43e758b123a6955fa067d3ac375f7d0dbadc", + "dst": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78740d5bf49989936d315bf641949232aace582e03de57db8abff940f7d51bd1", + "dst": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9f2c83c5165826de1077f428ad39d41473e32ed64cd83180d49e7d8e5db996d0", + "dst": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "883be4d7173c235933294ab8dcae8cc76609166eaa1c1f07e9b51d551c979709", + "dst": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6384ed19650d384c29db4c3a39a1ca855058fab758075be2dee759dd9e6faae1", + "dst": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", + "dst": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c238e82f3a4beee1be7b5b464e8553404f6927d5ab93c3d649d362c01097782", + "dst": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dad4991bfa5c51eb176f28c1b3f86661e02579905e6e07c997df22004e06244a", + "dst": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4ba91512c168281f41d3934b927d0d86a3136a31cc345b635095928f8e5f013c", + "dst": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c416f5e604eeada9ae8e520a429d8f19d4230626769e7121007e01353730784f", + "dst": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7b8787fd4076c27d074d2a4761377a1aa26c843c432e3b7e6b0ebf1e29528188", + "dst": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "38f22b194f04d85a6b545b37df06195edeb8503798b229ddeaa946018150c05c", + "dst": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "246377a036ad5444bcd5f47ac9e55fec7c85fc40644df593038d360554a809f7", + "dst": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c6d5e543ff5f2c2526728d588fb21753db5b7e05b8b275aa5e9b24d29350afb0", + "dst": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "98e223e6e2240fef83082d3daa86e46f10e0c71f3f74489ba95db0951a166f53", + "dst": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c8971ca91f8e21c556f647940073db003f7dd5582ae55d4ebca602d5e8e91a6e", + "dst": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dfa7822c05f54116c9fc3b2cde1ecb4667f47a2d8771fe886e832c223cdc4e82", + "dst": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6d37c0c4b6fcbac1e53a46c9c2dc5d3c3b36312c53f25b2baacc785ea77a11f7", + "dst": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9ba5e31610f0545666f102465efa8caa48ad3fb5b8abd5ae802f4a71e3f7de3b", + "dst": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "3ca365aace71e24b04d6f2ffbf7171468c5e71783858c710cae539c5e43e0c0e", + "dst": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c858f2db2a20ac562d32f8fb2a3a11039849a6e44d2bec30befb2e173532a9a3", + "dst": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1550a76598693b950346397e0e825bbb2805edde38b0d0240e50050829b7b1dd", + "dst": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "466340ab7733abb23ab24d877c673fe089c273f11808fbbd6f33a91da92ee96c", + "dst": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "401d4c0c1060ebbb4b9fb3859c2eb47789f94086f4deb01234bf46f7cdc81247", + "dst": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2c0e3aa084f5fec45f99b3f125ce7d50c6da526ef5165df5f22ba603147c3fc2", + "dst": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2e724d83e35235c23c0bb16ae9b708a5bba3c23b186b05d4b8c606f6bb4b311", + "dst": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4f30eae8c49eb268fe364eaf5ee0788da6e2f6adc2f83cd82e96a4bfe98496f5", + "dst": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8753d5775c22477a8ef74eeebf61d7de30be702e70118f552cc18ad963ffe950", + "dst": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efa2007c561dcbf7c83a6bbdd2ef75e7cca76b05330a8b948ba0dd94dee949f7", + "dst": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b379d1b8ff0153c63ee69c40a7155b97fa42ab570f68ff847d457316c4d8ab9", + "dst": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cc84f93adce16699d9e84ef32f55333402431b58dc50c17084bcb8b33f382f88", + "dst": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f38f0760769c19075034f70b059abf4d1bfa6d01e1e8c369a99900ed1eaeca6d", + "dst": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8d55f76bb0b3dd222cf85a7193501c0f4071b446f56dbd1da355b1625993325a", + "dst": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efde499c7e4444bc602b7bf5ed50e95a18ce8ec9a06ba9d850a05bb7a25ecb3a", + "dst": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2a4d631d5dc90e397d85f13410d1a6d877dcaf592a0e2be2e727443ac74b5bd5", + "dst": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e936299a21240744f6edbab493449323f920bbe15dcf294463e5a2ace10f27b0", + "dst": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "44e17f4bd29411a1614457171c06183e364bf6ff80a201717b2dfc0748e9ebe3", + "dst": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1941e5cc5e38dd92427580af699b1f410be7b29ff17d3d0ff3d046bfba0aaabf", + "dst": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ff6c0f27fcf92f3b4a3871b801c3116847fe47a7e3bafcadd4855d06012091ad", + "dst": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cd6c4b785e60757fad0e6fd4874b729ea7703fe7ee9560e1283d2eb71fc75321", + "dst": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "745eaff456a390c3868742a039e72c2a93ff8eee10417dbe848d533b89facc04", + "dst": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2f3f050c9ef31bf5c3b14c1c71699c4f4b38aa18479531194d12e6277416516", + "dst": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0b95850edabed70762768ac1695c5d7f230cccaa8de06657cda42cafba36374f", + "dst": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7c767d3a06db1ac0e1809ebe29a7d9689143259f4651837de54423e287c20490", + "dst": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78b07e8fe1366e173f2eeb75c35cd53baf0f6100de50ae12b4ffe7d0d7ba4298", + "dst": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5010eb25f6e1ed725fb901ae1e945e545ae846d7be8a135333d2d41102c33328", + "dst": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "178a33e64826cd2039b8538b74e6de513966acab45ab79d77dc9392018a65ffb", + "dst": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "044dc539d063250dc654b2bf0986a9044b4eea05e1284c11a2b313acd8dc3498", + "dst": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9fd5ea38f383291566def44b6fb932414f97123952578fe0cfb9a30eb075a099", + "dst": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "be5930e9cc35801433bcd21db84da7d4f1d8e744feca16a2c6fb00c81ce93e51", + "dst": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8cd999cd193d315e5f1c6f74c230c12e6abe6847924f6e89d988e09ca413f52e", + "dst": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0cff53628eb0e984c134b68cbe4b1bb7721a05adaa32e93b9df489a9a7a176cf", + "dst": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "a5ef046e84be9ff2485dde49afe6073811286761afac3bbd588b6e4130930479", + "dst": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cdee5f84c4f08098ac740e3a260ced14c1e199e126aa5291ec079b281a7dc407", + "dst": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6a24135f8496e7a37dcf7164218bb3aa530319f3b2bf3c7a1a9cc1bd17831328", + "dst": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "693c7f970b34ce5882e62430f4c9c28957159a257d27d4e21a61fd95c6b97464", + "dst": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c008a613cef129c180dbcc7213f2d41a14d245d06a3844d63d9beac963145385", + "dst": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "439cdfd03972fb4bb5da54208cf8098ee78228c487ce9e84623f5f83e17a7d68", + "dst": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "hours": 1 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 164, + "block_seq": 17 + }, + "time": 1428989855, + "txn": { + "timestamp": 1428989855, + "length": 220, + "type": 0, + "txid": "d952ef4cc45a89c14230ba0f7e30b782fad83cb6506ac0f503a242c568c1287a", + "inner_hash": "8fc48920982066fd4c69e2d2c0c5239cca7c296f0e3ad30e9b976c1230967478", + "sigs": [ + "b7eb93bcebb6df3dcad48afd66dd60bd42b1fbcdf52aa5e0c7e455e791f64a976fa416534b4e08bf3e62a2df83e13754119634c4255dd1e2e08be447d4d5b47201" + ], + "inputs": [ + "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e" + ], + "outputs": [ + { + "uxid": "4168b9378363cd81939e667cf78055d35a60d3101f5f9e3d2ae709e3981e29fc", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 4040790 + }, + { + "uxid": "c603e99ceae4d15c20360714ee07ba6e3a944a97ea9285d164c23252e93958b6", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 163, + "block_seq": 18 + }, + "time": 1428989925, + "txn": { + "timestamp": 1428989925, + "length": 183, + "type": 0, + "txid": "686db0a8cd429970bb91163033703410d4750c86ba485709fe1a3faabbbb42f6", + "inner_hash": "76732ac6a9936242193011d78a0f2849529aee767a569c9c6bb25b3bbae15cee", + "sigs": [ + "d74dcfdc8401a29b1dccc728b40b6b79faea147c65b4a859063ad77cc63aa9a62417c63b91b94678b6656fdba2f242d836b6914e77d244fbd16aaab014ddb44300" + ], + "inputs": [ + "c603e99ceae4d15c20360714ee07ba6e3a944a97ea9285d164c23252e93958b6" + ], + "outputs": [ + { + "uxid": "d9dae1f82177f979b07016a341ed5c281ed6ed8eaa785a8a107ec16efbe541ef", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 150, + "block_seq": 31 + }, + "time": 1429021184, + "txn": { + "timestamp": 1429021184, + "length": 220, + "type": 0, + "txid": "9004c779cff67b3895500ec14b2c2e566127bb11a8af3358fe8a63dcfae9badc", + "inner_hash": "9e1eed08b004316812f4ad574f3d0f96959b2a335cdda77113abfd1673a8859d", + "sigs": [ + "6b3a3b3374c641ca252ee32cceab1b37c4c395b411e4d2515bc51f2a8ec12b9c440d25dee1b94a0231dd9492ab3e07c7a5dc054a0da987d6bf0ba6fc8de6f42000" + ], + "inputs": [ + "18ea1b3cceb2ca40c01efc8f3cfd7d1d0dd69430ecdf655515aa4f8b21bd2644" + ], + "outputs": [ + { + "uxid": "64194899d317e2a007f89df14538795547e927c242a92f83180e6cc952304964", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "5.000000", + "hours": 9 + }, + { + "uxid": "569aa1260e734017c4eee06d84ab4a6285e2ca2041940b2915d9141527caf179", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "5.000000", + "hours": 9 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 149, + "block_seq": 32 + }, + "time": 1429021214, + "txn": { + "timestamp": 1429021214, + "length": 183, + "type": 0, + "txid": "327375203f20cb68847351c30a48597c0588a8c14319a4eb47bf440207fd045a", + "inner_hash": "217a070c0edd70fc0eaa7f858308444f32bbfe4b48e128b6fa876f60c4639bfb", + "sigs": [ + "de82c42e2523b512c0ffea3c91244dc905f59264f3c59e2f82efc3fdb7f446c728afb08bbc3478462cf25b96848da9dc4dd6b87cab569715ebd33e8102c552d101" + ], + "inputs": [ + "64194899d317e2a007f89df14538795547e927c242a92f83180e6cc952304964" + ], + "outputs": [ + { + "uxid": "eb446b8372559249c8e269b6cd028588e2e9e4f8fe9357719da9d1c22aa29911", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "5.000000", + "hours": 1 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 148, + "block_seq": 33 + }, + "time": 1429021674, + "txn": { + "timestamp": 1429021674, + "length": 280, + "type": 0, + "txid": "e89ee3e90e72108e4cd6ccb95c9f8d2b18ccfaa7ce61a7d297454debd69cebbf", + "inner_hash": "dac67377dd9d8247db41f3380288730de2e51514ec3a2986072719553b9f9e27", + "sigs": [ + "7df848876a507f4b2855818f059e62e6d2f5924af148607a0c6004b7231fdce920ac80e800a833e55cbce9938b5d8cb755b0dc434c22b03a5037972ff2d6444801", + "6499aeee3ba19247d1ef2d3ec13e46031adf0dd6a383785272776a93621f21696cf217b7375e5721e51133fc3d9806200d2aded757118fbe27a719ebf4ceaea001" + ], + "inputs": [ + "569aa1260e734017c4eee06d84ab4a6285e2ca2041940b2915d9141527caf179", + "eb446b8372559249c8e269b6cd028588e2e9e4f8fe9357719da9d1c22aa29911" + ], + "outputs": [ + { + "uxid": "e702df2703c3de180f3e4a0e9a503bd534037c2d68e858e97a317575c5a97d95", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 1 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 147, + "block_seq": 34 + }, + "time": 1429021994, + "txn": { + "timestamp": 1429021994, + "length": 220, + "type": 0, + "txid": "08bf0f8f4a8547bcab1fef035adac2a66c80369b4485a736bdd676e782bbb037", + "inner_hash": "8fd6f4e5428c170dede16e8c02596ab0c490dd5c418d003d9232d8c2caedec9c", + "sigs": [ + "f68d819dbda0bbf7cd5e2de8088267c5b3a744bbe2d7737c7dc52060b6344a25180cc1081e5c7dadab94763d158e303f697d1d275685b32bfd1de123a376697501" + ], + "inputs": [ + "e702df2703c3de180f3e4a0e9a503bd534037c2d68e858e97a317575c5a97d95" + ], + "outputs": [ + { + "uxid": "10998e83dc5dfe3c3f5f28ef3e5e2fced4dbd1da389678b0ea3ddb552851b6bf", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "6.000000", + "hours": 0 + }, + { + "uxid": "41c6d29aa5de770de684ab19b40bd75b99ec7f1a5ff7d15288ae4bfff568eabd", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "4.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 146, + "block_seq": 35 + }, + "time": 1429022034, + "txn": { + "timestamp": 1429022034, + "length": 183, + "type": 0, + "txid": "3170f0635cc40aded3a38f84f2ae07bd2238550ea4ee867328d0f891ea9abf14", + "inner_hash": "1cebcd96c2847d219b658733012921d6e10a6c55439736833dd0ae97b898f72a", + "sigs": [ + "179826a9f244005b2b34d145948b178533805953adff8ab924a6fd67538daaa4384d67a24473de6bb01d441e4d979e520b055cd9304188d00255eab7c04bf45701" + ], + "inputs": [ + "10998e83dc5dfe3c3f5f28ef3e5e2fced4dbd1da389678b0ea3ddb552851b6bf" + ], + "outputs": [ + { + "uxid": "9e5779445f60d62b471862339d7a83dd8355c7a89d5fc3b751f98e9414628ec2", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "6.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 145, + "block_seq": 36 + }, + "time": 1429022064, + "txn": { + "timestamp": 1429022064, + "length": 280, + "type": 0, + "txid": "fba515a9eeaedb891c4dca862bd06108e0452270890b362f0b353b4c86845618", + "inner_hash": "3c24f665a7a02308fe6938ef3ce7e38dfe72644b1d71c5aefbe3d6844c609d58", + "sigs": [ + "faf14290ac158576f0dd4311ee4835a2542ae8b52d9ec7ab36d1af938a117f382c42855dec9b980f282e7ff8d7e19d469b084a7d44e38022e246c365368cc07d00", + "52cfd88d334818382413dfa45dd8e00a2136c352b7547dcf97894bf3eaa152cc5b10bf9f35c4dc8c75e7bb62543bd244a7c1de588b2a606aa1eb0b32c9c4ca1501" + ], + "inputs": [ + "41c6d29aa5de770de684ab19b40bd75b99ec7f1a5ff7d15288ae4bfff568eabd", + "9e5779445f60d62b471862339d7a83dd8355c7a89d5fc3b751f98e9414628ec2" + ], + "outputs": [ + { + "uxid": "d46e91fea3c8a6428885f941e5152dbc7f9abd356ad4d054bf20e0e806f1ec99", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 144, + "block_seq": 37 + }, + "time": 1429022094, + "txn": { + "timestamp": 1429022094, + "length": 183, + "type": 0, + "txid": "9fb039cd90a4e9b85669bd6ef878b98a9e84eec7d4804e2bff6f0dc9c2739c44", + "inner_hash": "5bc5636489d4ba7d36b4429cd3ec71491c9fa6f442fede1ea696428b574e0d13", + "sigs": [ + "3127749c2123db967563b9726cf5d6daa3ae755ec74f5e5fbc3dcfb10ececc231f5d61de693355aa5c8ade13c4c31ddc3bf9864e87139fdcd64c513702f7425600" + ], + "inputs": [ + "d46e91fea3c8a6428885f941e5152dbc7f9abd356ad4d054bf20e0e806f1ec99" + ], + "outputs": [ + { + "uxid": "2987e7c89d353ad5d63cea2bf2724dc5f7a5ef5fb81f5ea160a307f0726ac2f5", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 135, + "block_seq": 46 + }, + "time": 1429077374, + "txn": { + "timestamp": 1429077374, + "length": 220, + "type": 0, + "txid": "0a2da0489b14156fad8fb863d051a4dac1f645f144c1e5bb65a44478623b8e4b", + "inner_hash": "787ae7cb222a23641bb33751d1428dc8e07a2f2cf11ee6293a54100836209d09", + "sigs": [ + "9bc3b6d7cb1d66d52fc993d0799baafa1056992049fa86ce76d5909690e88c4a19920b69e2463cf34d1dddb545b61ee38fb2f9b33f92626da8afdd934c353c8e00" + ], + "inputs": [ + "cb8efc0b1082c39258cb6efd59f64d88b36fcb60143c826829fc5f0ed5c0d668" + ], + "outputs": [ + { + "uxid": "a6061defc41a8a55e37eaf56ebaa1177446f61719b1d5126698e79a6023f5367", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944780.000000", + "hours": 50058 + }, + { + "uxid": "a52408daa8ce7026c70b61d4df4212fb577462060f340bfce779225b3e18193d", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 50058 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 134, + "block_seq": 47 + }, + "time": 1429077384, + "txn": { + "timestamp": 1429077384, + "length": 220, + "type": 0, + "txid": "a4a202bc4431d95c307d151dea764bfc6d9ceb7e82b3eb50dc8604050622a22c", + "inner_hash": "836145a3e62a7e055acc3404c1fd6ecb237e3251e6f8b39fd526a7f48f21daa8", + "sigs": [ + "f826793e63a3b0b837070e8876461c47af6be7a6898c370c70430b1491457cda76fc3b34e08bff41a336277ec1e93cc008f9c08ca295b418488b1ac92a5f5a4000" + ], + "inputs": [ + "a6061defc41a8a55e37eaf56ebaa1177446f61719b1d5126698e79a6023f5367" + ], + "outputs": [ + { + "uxid": "3b5f72e772ea886dd872b9087395398133576a6561072d5294fbcd04b49e1d95", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944770.000000", + "hours": 6257 + }, + { + "uxid": "dc73aac74348dd285a1456c1fae2204d7c2039d50a765bdaae0c31f7c7e059db", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 6257 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 133, + "block_seq": 48 + }, + "time": 1429077394, + "txn": { + "timestamp": 1429077394, + "length": 220, + "type": 0, + "txid": "4e6b363423633ad51114b250478ee7645fbd184066fa41c29e5b14d0728cdfec", + "inner_hash": "8cf88a9e5140d5e01af412c956b3de7c93bfebbb4c5993b9b0285812208f5b33", + "sigs": [ + "670abb369c25a655b0f22c069a9523d439b8a03d122bc9f0861aff796ab965fd5e1b79812b6f458ebc0a1cd4cc223d0137eb22e1bf1cbb40265ac7301018897000" + ], + "inputs": [ + "3b5f72e772ea886dd872b9087395398133576a6561072d5294fbcd04b49e1d95" + ], + "outputs": [ + { + "uxid": "f265bea876ffcfb8cf64df3aca4dae4a8d7f424ff495d91fb322feddb3a7e505", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944760.000000", + "hours": 782 + }, + { + "uxid": "e4e375b9dc55ff53d6de9120f1a87ff00e00a779835f8320f2c6b3090d0466e6", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 782 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 132, + "block_seq": 49 + }, + "time": 1429077404, + "txn": { + "timestamp": 1429077404, + "length": 220, + "type": 0, + "txid": "edc27c6ecc1f76d0f23489ad7bbbdb8c653af37cc4b8f18197400aea2011ed83", + "inner_hash": "5432e686f984075091a8d3686d959b63ef620382fcb2b86794ba8dc0fb9656e7", + "sigs": [ + "c1902b37a95c5327b0e5a1f05de551d4135831b787c86562867344ee7f06235374dc1618c6b4a8e077041723bc731db72dab5554a808b1ba77d305309144bf5e01" + ], + "inputs": [ + "f265bea876ffcfb8cf64df3aca4dae4a8d7f424ff495d91fb322feddb3a7e505" + ], + "outputs": [ + { + "uxid": "e6d9b56e075a6adf520d1ae7fbab9ae06353ae0b93dc8cb17d82cc3628009a50", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944750.000000", + "hours": 97 + }, + { + "uxid": "d11b05345917d171f60c31bd2634041b73b97eae364724369ddb8d53369397fb", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 97 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 82, + "block_seq": 99 + }, + "time": 1429274616, + "txn": { + "timestamp": 1429274616, + "length": 571, + "type": 0, + "txid": "819106dc50373e5293a7e79f179693e85536e8206d82272930ec08410d92402a", + "inner_hash": "02e9a06b0ca7f91255107993e00f09e9ef983559088c5febff264c17952033c4", + "sigs": [ + "efb713e6a1e5d328e94a51fbeb0f73e2a3b7a54e15db75797f0b709f698b16eb26e522f187a98144807e0e6cd294686ff19037975abb6d44b20b2899968954f400", + "b5d011c60020ce591a21db15823c06188515a63ca95d573c36b3af83d634fc6f1c1125db197f6283510ee33890ac168513254ad37524c77294bb5a12e8ff23f300", + "00d87b91eda33f627f6cd28cc673daf929fbec36e7bcfdf894f7491618a68b5755b5baadedc106d53d2da924fcbedbd106eadc50ec611d426720f67426c7286500", + "e64cf7e74363cfd381a3aa6fd17d7c415d6034b26b93017acaf9cf3475ccdffc53c3714d1d13409323cf77ccc81596f6e6edcec11d890979a436ef960bcb5f6900", + "fc2eb05241afdd15cdbd28cc7158d7eb4442f21a678c52332762b23ac6c2fcc76b0f79731987df0ba84d82044cd474d4cda9afda778a21b78a0659c5b588664301" + ], + "inputs": [ + "2987e7c89d353ad5d63cea2bf2724dc5f7a5ef5fb81f5ea160a307f0726ac2f5", + "a52408daa8ce7026c70b61d4df4212fb577462060f340bfce779225b3e18193d", + "dc73aac74348dd285a1456c1fae2204d7c2039d50a765bdaae0c31f7c7e059db", + "e4e375b9dc55ff53d6de9120f1a87ff00e00a779835f8320f2c6b3090d0466e6", + "d11b05345917d171f60c31bd2634041b73b97eae364724369ddb8d53369397fb" + ], + "outputs": [ + { + "uxid": "427462efeb07a6803f013c789ea43d93240f74f886bf9afd63dc1936a7574a37", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 7510 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 58, + "block_seq": 123 + }, + "time": 1429451746, + "txn": { + "timestamp": 1429451746, + "length": 220, + "type": 0, + "txid": "9003d3caba9587d46d000cc614bb52bed34adcc5ea404c560c986eb6dd756e6b", + "inner_hash": "2a87bcb0049b9971713a2e46b75b348785adca751b151290a411bfa5a0ed2287", + "sigs": [ + "0da91c351fb050c243c7b587005bee14ccc2951897ffdf720ad9c757c5946e516a20ca0d92c5f84957161d10a74deab05a2b530ab5bbcd7ad01266213b5eb38401" + ], + "inputs": [ + "998487775c0e58420673b70204b83c1d6bb5b70e34b1aa0f8169c85ecec2438e" + ], + "outputs": [ + { + "uxid": "6fb116c110fe391448a1dcb985b67439c2e9a71d8bb2fd1cf345ac73ada6166a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "755600.000000", + "hours": 5916 + }, + { + "uxid": "8e764a87cee9f26b902f748c28a5a49de5c383e5f155129eec84474a3d0349cc", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10000.000000", + "hours": 5916 + } + ] + } + } +] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/genesis-raw-tx.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/genesis-raw-tx.golden new file mode 100644 index 00000000..e69de29b diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/genesis-transaction-encoded.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/genesis-transaction-encoded.golden new file mode 100644 index 00000000..94902af2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/genesis-transaction-encoded.golden @@ -0,0 +1,10 @@ +{ + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 181, + "block_seq": 0 + }, + "time": 1426562704, + "encoded_transaction": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000f8f9c644772dc5373d85e11094e438df707a42c900407a10f35a000000407a10f35a0000" +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/genesis-transaction-verbose.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/genesis-transaction-verbose.golden new file mode 100644 index 00000000..1daaf62b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/genesis-transaction-verbose.golden @@ -0,0 +1,27 @@ +{ + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 181, + "block_seq": 0 + }, + "time": 1426562704, + "txn": { + "timestamp": 1426562704, + "length": 0, + "type": 0, + "txid": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "fee": 0, + "sigs": [], + "inputs": [], + "outputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000 + } + ] + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/genesis-transaction.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/genesis-transaction.golden new file mode 100644 index 00000000..448ae158 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/genesis-transaction.golden @@ -0,0 +1,26 @@ +{ + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 181, + "block_seq": 0 + }, + "time": 1426562704, + "txn": { + "timestamp": 1426562704, + "length": 0, + "type": 0, + "txid": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "sigs": [], + "inputs": [], + "outputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000 + } + ] + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/multiple-addr-transactions-verbose.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/multiple-addr-transactions-verbose.golden new file mode 100644 index 00000000..26a78fbd --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/multiple-addr-transactions-verbose.golden @@ -0,0 +1,909 @@ +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 142, + "block_seq": 39 + }, + "time": 1429058494, + "txn": { + "timestamp": 1429058494, + "length": 220, + "type": 0, + "txid": "c38b47bd576e3bced2a9309c3df7622064e71177f54020d77193d5cac310719c", + "inner_hash": "7f02ba6476946668f3adcbb35e113531e6788cee4fe94bf8d8da4803e3baa7e3", + "fee": 291935, + "sigs": [ + "2a31eb55da895c59654ad3f1a11efa11b04787ab78dcf8221aeeccf137adec543765f761363390c97f429310fcb39db305494a94b30af906a2d43d5de1effbb701" + ], + "inputs": [ + { + "uxid": "108520145179c00f581d91e273714811fe6e82ee059d65218eea91154ebd8205", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "998790.000000", + "hours": 389245, + "calculated_hours": 389245 + } + ], + "outputs": [ + { + "uxid": "e79c94aa7013c7611901839236b8a1cdf70e8ef7c40b9e33f99359136de981d6", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "988790.000000", + "hours": 48655 + }, + { + "uxid": "df5d6e09da2585a6ac1a37aea2370fa25e9049b549049202d5417138bf033cfa", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "10000.000000", + "hours": 48655 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 128, + "block_seq": 53 + }, + "time": 1429077514, + "txn": { + "timestamp": 1429077514, + "length": 220, + "type": 0, + "txid": "d154d8262abbf517c67d529b0fea7cdf097433bd296d5795b17c6379cb1b1430", + "inner_hash": "b69070b10e6bbc276bf155361d7f3238fec46b9d865075c1dc0fc20d81ab0a42", + "fee": 17787, + "sigs": [ + "0a4b7f385a164f5718794382d49c14a6623e7af5f1ddbefe4871c756b754457a7075e822603bd3b22b313278abebe756be92367ef7a81a8c4adf992842c2058601" + ], + "inputs": [ + { + "uxid": "e6d9b56e075a6adf520d1ae7fbab9ae06353ae0b93dc8cb17d82cc3628009a50", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944750.000000", + "hours": 97, + "calculated_hours": 23715 + } + ], + "outputs": [ + { + "uxid": "2df1e88589be43c55d7c6c3dbcbd663fb759b3245eb8d86b0b9cdaa989556aea", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "943750.000000", + "hours": 2964 + }, + { + "uxid": "c7919b892eeb751456d456b37ccde7350a3fca0dda03b17ec426a56f12dcf192", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1000.000000", + "hours": 2964 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 125, + "block_seq": 56 + }, + "time": 1429077554, + "txn": { + "timestamp": 1429077554, + "length": 220, + "type": 0, + "txid": "8fba29db2e3e8cad785e723f95aa5fa46ae0dd8b2bb62586977f20e698642cfb", + "inner_hash": "dc25f33c3b93678ccc3449a318d55782a274c17cd2f45089018bd7c55b21dd96", + "fee": 76179, + "sigs": [ + "6fbe79a6f32b242f97f7e7662e6f7eb5aff065e8063864fc52159071005ffb2570c26a2d8b21a7826cf18c15f4f4ed9b718a7a9fdf1b4d5ac63bdb632452c82401" + ], + "inputs": [ + { + "uxid": "df5d6e09da2585a6ac1a37aea2370fa25e9049b549049202d5417138bf033cfa", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "10000.000000", + "hours": 48655, + "calculated_hours": 101571 + } + ], + "outputs": [ + { + "uxid": "3d7dd4d41e613fe8153f5e5f62b79494e9db9ed98f875d929ca1f90ecfe2d50b", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "9000.000000", + "hours": 12696 + }, + { + "uxid": "9e53268a18f8d32a44b4fb183033b49bebfe9d0da3bf3ef2ad1d560500aa54c6", + "dst": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 12696 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 121, + "block_seq": 60 + }, + "time": 1429077624, + "txn": { + "timestamp": 1429077624, + "length": 220, + "type": 0, + "txid": "77a69f4c8afd858a2f6767bb9980d4af6520e02b076bf2a78b935021e1147c71", + "inner_hash": "65f97c460ed99ea47ea2cdfd0780af2338f78d80bff93b92dc2ccc8f2411abec", + "fee": 9636, + "sigs": [ + "7c32e34864bc9659222cb26f10058df5cf2fe0c7b78b1d067a7b5af80f4a2b146f8914f4424d9e80a3303d3d2531ddf9d60489011c607ecd5f92cefa5105eee501" + ], + "inputs": [ + { + "uxid": "3d7dd4d41e613fe8153f5e5f62b79494e9db9ed98f875d929ca1f90ecfe2d50b", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "9000.000000", + "hours": 12696, + "calculated_hours": 12846 + } + ], + "outputs": [ + { + "uxid": "77769e6a01cf3dca201ade501767d0abf20dea19d694f3272b647a9a651fdee9", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "8000.000000", + "hours": 1605 + }, + { + "uxid": "0560bae3917bca7581af9b6c5a58e395c701ce9ed0241dac2de8a3e93c0b839b", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 1605 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 118, + "block_seq": 63 + }, + "time": 1429077684, + "txn": { + "timestamp": 1429077684, + "length": 220, + "type": 0, + "txid": "8d10b0ba11d9dd63d3a3522bc35bd260e8da9109298aa488355ea7201eb961b7", + "inner_hash": "929218d56de3e94d277827c857a657ef8b1352f75e6938ff5cf10ac4c54d4039", + "fee": 1271, + "sigs": [ + "6c8892c3277b90f5ca71a42515706de993c459f094282fa99168359f00c5cb862811c4225cc1448e99ba2755e9f9eb241ad0df25b20f1a6ec035a673cf42ab2f00" + ], + "inputs": [ + { + "uxid": "77769e6a01cf3dca201ade501767d0abf20dea19d694f3272b647a9a651fdee9", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "8000.000000", + "hours": 1605, + "calculated_hours": 1693 + } + ], + "outputs": [ + { + "uxid": "f5867b05823c81fc53de36b140415b3b98e4f4cec5883512f8553f70c550d8e7", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "7000.000000", + "hours": 211 + }, + { + "uxid": "9011fbc6e82dce0656e7ffc76afb014d2ad70aa4663e7b687d3212e12f8965e2", + "dst": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", + "coins": "1000.000000", + "hours": 211 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 110, + "block_seq": 71 + }, + "time": 1429077974, + "txn": { + "timestamp": 1429077974, + "length": 220, + "type": 0, + "txid": "abed13c2a552633d26b5b51c3ac5abf9808756c0203869ed185a7cd673702ba2", + "inner_hash": "c176a1a85f716055a9e8060c2a4245db0d7f71f4ac5387d4a51d173db467150a", + "fee": 2, + "sigs": [ + "40e8340047f08afd483b2867166e15ae751bb7272a2c24f68ae8561d3619ea021363e987118a2fe516cacff1946d4d6c4c249038581ee2f58f8feea4bcffc3b100" + ], + "inputs": [ + { + "uxid": "450cd7795bb3625daa99d6b64b9a8786d593bf1cad986d6c2933dae04b74a593", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "888750.000000", + "hours": 2, + "calculated_hours": 2 + } + ], + "outputs": [ + { + "uxid": "b44ee00208690c2123989f40edaff0224825afb20ca0952fbd90bddfd3213642", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863750.000000", + "hours": 0 + }, + { + "uxid": "22edb5931e1c54382f18e41ef774931efb08c278209a1fe8a34100147b707220", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "25000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 108, + "block_seq": 73 + }, + "time": 1429091164, + "txn": { + "timestamp": 1429091164, + "length": 220, + "type": 0, + "txid": "a95317361364e8cc08a150840bac8a97ea1f56278f8834ca2a2f16c24c4a7f0f", + "inner_hash": "90c166e92a7883037f9634704923d986976ac814f28e4761309bf86d77cdb755", + "fee": 2326, + "sigs": [ + "27ee3b614e5362462bc20c23e873e380b5bcc880053436a640286ead5fe2dcd00094e0eade532ffbfc8ba95d5e3540968b2fff64e19e0e772342aceb3c5d3ce100" + ], + "inputs": [ + { + "uxid": "c7919b892eeb751456d456b37ccde7350a3fca0dda03b17ec426a56f12dcf192", + "owner": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1000.000000", + "hours": 2964, + "calculated_hours": 3100 + } + ], + "outputs": [ + { + "uxid": "7b132c07322babefa83ab64971b7bfb29bf2cb9ffe9c42dc7e2975a185dcd8b8", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "995.000000", + "hours": 387 + }, + { + "uxid": "8f52e126bbc359bc3bfd230d82649c3d1c622e8f9c20dae7ccd73bd0b4ee2bad", + "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "5.000000", + "hours": 387 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 102, + "block_seq": 79 + }, + "time": 1429147950, + "txn": { + "timestamp": 1429147950, + "length": 317, + "type": 0, + "txid": "2558a7cd524acdb58f822a56bd51e8905182b2b35fbfdb1246ce6dc9930d14eb", + "inner_hash": "37931a3c0b9fe54ebfd93e70c5e872ea8f68669bcd38176bc223be01f7e43aa0", + "fee": 466755, + "sigs": [ + "1d2fa9d76a29f3ce2eda062afe42f3718db434863955ed4f43a83f79dd372a922fd2774d7f5227fa253c65537418b30309932f404e788db91fac1d580d83b28101", + "471ae24bbebd78b5d298edb81e07cc282ce8c1517a2d7426f91f177f111c93873c594e04a215bcd982220b0e6967bd328ec494811cf5eb854091e1d4552545e700" + ], + "inputs": [ + { + "uxid": "f5867b05823c81fc53de36b140415b3b98e4f4cec5883512f8553f70c550d8e7", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "7000.000000", + "hours": 211, + "calculated_hours": 136742 + }, + { + "uxid": "22edb5931e1c54382f18e41ef774931efb08c278209a1fe8a34100147b707220", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "25000.000000", + "hours": 0, + "calculated_hours": 485597 + } + ], + "outputs": [ + { + "uxid": "09661724179523e8aec95862a5fd12dd1aa50f39f193f81eece0d7aea6197103", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "31000.000000", + "hours": 77792 + }, + { + "uxid": "2a886bcedf8862c351cc4087b89e902202b08b164363567a9be47908e938f280", + "dst": "pMub1Pz3SLVaSwHoomgp5oDVxdkVxLkW6L", + "coins": "1000.000000", + "hours": 77792 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 98, + "block_seq": 83 + }, + "time": 1429164480, + "txn": { + "timestamp": 1429164480, + "length": 220, + "type": 0, + "txid": "d80d49958166fd7b35cee63cfc4a4fdd434484f9bfd9444f62a1b856da36e9c7", + "inner_hash": "ddf70f29cbcb9ab5d04848c77bb605849c5d831c80afed10f64ea2bde710b7bd", + "fee": 164971, + "sigs": [ + "21ccec8663f52b64e6d1983c5c715fc360ef1a01a0f4fce857fe7151e59b4cc87a5b6cc18f770eac98ef640eb15d572ea96b81e90a793bb01ac905778c10f0da00" + ], + "inputs": [ + { + "uxid": "09661724179523e8aec95862a5fd12dd1aa50f39f193f81eece0d7aea6197103", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "31000.000000", + "hours": 77792, + "calculated_hours": 219961 + } + ], + "outputs": [ + { + "uxid": "6a8bc7ef9e8e7b67fd270cf37022edadb13f1fc2ba4e7a026f7ce2ab30cc4572", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "30000.000000", + "hours": 27495 + }, + { + "uxid": "a733e89023ccc12587d0849f9baeda0d2fad640c1cbe97e24ffc531859fd83fd", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "1000.000000", + "hours": 27495 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 97, + "block_seq": 84 + }, + "time": 1429164590, + "txn": { + "timestamp": 1429164590, + "length": 220, + "type": 0, + "txid": "8374d85130bbcf496bff138cd040f91fa362eb1b6b6a1c7c9285523437d5589c", + "inner_hash": "3188ba9148add7f2811180f130de2c0668fc21c031a7329993b61bfe35f860f1", + "fee": 20623, + "sigs": [ + "93edab2b508cd33cd76c50a5aeabcbcf35472d25ba2b3f268d1cc0a4a813fbe907f4c0e645893b4efd524d30fabb6ba62d65c2ee050057885eea2ca0d2d1c21500" + ], + "inputs": [ + { + "uxid": "6a8bc7ef9e8e7b67fd270cf37022edadb13f1fc2ba4e7a026f7ce2ab30cc4572", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "30000.000000", + "hours": 27495, + "calculated_hours": 27495 + } + ], + "outputs": [ + { + "uxid": "15700b88043b3c08a46c3c4e36e7f431291a26aef1ef26c44ee413feee14b950", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "29700.000000", + "hours": 3436 + }, + { + "uxid": "e2512ec90800147d0d9ddbd0778511ee5a45a25efcb354c50a101738a65462c5", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "300.000000", + "hours": 3436 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 92, + "block_seq": 89 + }, + "time": 1429164800, + "txn": { + "timestamp": 1429164800, + "length": 220, + "type": 0, + "txid": "a0956843d442bd4b592d0c1323d153c3c1b2d7d52a86629444de6d1d1b6a4c33", + "inner_hash": "0fd405b4d4a74b417a27d0bfd2f0d1acf4ed0499a000e94c64a1443c5bb440bd", + "fee": 3816, + "sigs": [ + "9bd640adcf2e1870dd4cdd93f007759626ed9fd87dd8e0485888612ea660435a3104889820e6dab8d692efc3e4afb892de622c46b5f5c25718dfb78d4882d2ec01" + ], + "inputs": [ + { + "uxid": "15700b88043b3c08a46c3c4e36e7f431291a26aef1ef26c44ee413feee14b950", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "29700.000000", + "hours": 3436, + "calculated_hours": 5086 + } + ], + "outputs": [ + { + "uxid": "24c49699aab32caf9456a6b4dacd4d820c853c7639e5500b3be6326660312917", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "28700.000000", + "hours": 635 + }, + { + "uxid": "63154895637eb000146996ffaeb7cc1a547e409d0a2038650e990e7cc9b36826", + "dst": "XnKU1htBL5wFSMX8oytZBsBMeaBSbVNivT", + "coins": "1000.000000", + "hours": 635 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 88, + "block_seq": 93 + }, + "time": 1429164860, + "txn": { + "timestamp": 1429164860, + "length": 220, + "type": 0, + "txid": "e2d9da9342b21659da0a679536f9d6f533a4ce7dc33a7f768c3441ca3640458d", + "inner_hash": "72974683d8244d927c63440a169a438611ef88b250f20df2711d83a9f61a75c9", + "fee": 775, + "sigs": [ + "1c72245ae55779445ae5a6c030ea7f01cee7c29dd6189d0dcb383ec8438297e635b314c44bb0c4173c9e30d225774ee0334cee186e603a61c171af4db3eb961e01" + ], + "inputs": [ + { + "uxid": "24c49699aab32caf9456a6b4dacd4d820c853c7639e5500b3be6326660312917", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "28700.000000", + "hours": 635, + "calculated_hours": 1033 + } + ], + "outputs": [ + { + "uxid": "fb4d5dcc1c3ac97444e96aa7da392b0d7faf7b7373504c70e497228a4695a7f1", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "27700.000000", + "hours": 129 + }, + { + "uxid": "4a5c1b09ef2216ba2fdae735ec8c6ad404bb61bfbeb7407dee9d6e3578762ffb", + "dst": "2LZzgdFYNhsBBSLATkV6PA1zk6DvWNghP2", + "coins": "1000.000000", + "hours": 129 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 84, + "block_seq": 97 + }, + "time": 1429165260, + "txn": { + "timestamp": 1429165260, + "length": 220, + "type": 0, + "txid": "a689a3589730a351f880176b2c15b395967b38a90950e0491e7a1e5531f020a9", + "inner_hash": "d6cfcef60d17c03b68b94c4284746bc70e8ef66cb6d2bd370094a7e4b19dbaed", + "fee": 328, + "sigs": [ + "de36c5fac7db61c7a47827e1a9ad1b717d5fa904b69283598eab6003ba1b1e264856f30a6afe0881675e8f11a86e666cec09b789f3971a6ec4ba25183684a18900" + ], + "inputs": [ + { + "uxid": "fb4d5dcc1c3ac97444e96aa7da392b0d7faf7b7373504c70e497228a4695a7f1", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "27700.000000", + "hours": 129, + "calculated_hours": 436 + } + ], + "outputs": [ + { + "uxid": "4e75b4bced3404590d38ca06440c275d7fd86618a84966a0a1053fb18164e898", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26700.000000", + "hours": 54 + }, + { + "uxid": "1f9fb89f5b7c41d3df6d72b1f02c998196bc79ec20c3949693b4f5a2c1aae44f", + "dst": "2H7mA88ireMKHqP9LYWK5opnU176v7eYqrn", + "coins": "1000.000000", + "hours": 54 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 79, + "block_seq": 102 + }, + "time": 1429274686, + "txn": { + "timestamp": 1429274686, + "length": 183, + "type": 0, + "txid": "7b13cab45b52dd2df291ec97cf000bf6ea1b647d6fdf0261a7527578d8b71b9d", + "inner_hash": "73bfee3a7c8d4f8a68657ebcaf69a59639f762bfc1a6f4468f3ca4724bc5b9f8", + "fee": 710046, + "sigs": [ + "c4bcada17604a4a62baf50f929655027f2913639c27b773871f2135b72553c1959737e39d50e8349ffa5a7679de845aa6370999dbaaff4c7f9fd01260818683901" + ], + "inputs": [ + { + "uxid": "4e75b4bced3404590d38ca06440c275d7fd86618a84966a0a1053fb18164e898", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26700.000000", + "hours": 54, + "calculated_hours": 811481 + } + ], + "outputs": [ + { + "uxid": "0a5603a1a5aeda575aa498cdaec5a4c893a28669dba84163eba2e90db3d9f39d", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26700.000000", + "hours": 101435 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 78, + "block_seq": 103 + }, + "time": 1429278106, + "txn": { + "timestamp": 1429278106, + "length": 220, + "type": 0, + "txid": "9150311508851ca989efb5f82b5a7201724514b6b9f84ec1620c18673462126b", + "inner_hash": "83e206eb05ce5708efd174bb9df2c0bc0741c1775e50d139aebf37ed6c46381d", + "fee": 76077, + "sigs": [ + "a6206409a077ec30fe7f0b0ad5162805dffbff743afbc9e8e926d72ae38d15f80ab8183150caa4d745125c1c6e733428e299742d10e07a64ba5bd21d4e5ee06f00" + ], + "inputs": [ + { + "uxid": "0a5603a1a5aeda575aa498cdaec5a4c893a28669dba84163eba2e90db3d9f39d", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26700.000000", + "hours": 101435, + "calculated_hours": 101435 + } + ], + "outputs": [ + { + "uxid": "1e30e9dfe00e055404063e52a4154a72492b13de6acf4871ec5ea6d7c0fcc968", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26600.000000", + "hours": 12679 + }, + { + "uxid": "435c7095e2531b88feb76f32fc34fac3406882cdf71e17fecdba196aa5bc059a", + "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "100.000000", + "hours": 12679 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 76, + "block_seq": 105 + }, + "time": 1429278556, + "txn": { + "timestamp": 1429278556, + "length": 220, + "type": 0, + "txid": "41ec724bd40c852096379d1ae57d3f27606877fa95ac9c082fbf63900e6c5cb5", + "inner_hash": "614d7754fa0633e1a701eea3b3a2ce1c2815360f311cd1cb6cf46d5ae94304ba", + "fee": 11173, + "sigs": [ + "bd20e6b6754308d192ba734a573ec4363dae5326b9b21a7203904c076b067bf9313df1df8ac8960f12d9d8b642deb411a504512990181bc2e53264cf661b868f00" + ], + "inputs": [ + { + "uxid": "1e30e9dfe00e055404063e52a4154a72492b13de6acf4871ec5ea6d7c0fcc968", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26600.000000", + "hours": 12679, + "calculated_hours": 14895 + } + ], + "outputs": [ + { + "uxid": "2426f768e00345b641f5b4b4b058c308d528e22437bc6e552f0a9d5bd665e14a", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26500.000000", + "hours": 1861 + }, + { + "uxid": "8f4435cc1cb45453f1ee8e836a74bdec313a6d3aa1879be24e2ba261d474bf36", + "dst": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", + "coins": "100.000000", + "hours": 1861 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 68, + "block_seq": 113 + }, + "time": 1429348172, + "txn": { + "timestamp": 1429348172, + "length": 220, + "type": 0, + "txid": "1f27afc41896d2c7fdbd2620e606440ad12557e9a4bdd6808dcc2c23d4e32978", + "inner_hash": "4d53c05c731409feef7606cf9514904f4c7704537efb453ac2c439fcfe77a455", + "fee": 1041608, + "sigs": [ + "e36cef84c1c6f999dba462f3134131c105da2255eaf21550ce30ee52a14a33d529a7cd0c37b3883d0d57429b163b4905271c7b1a4d951b4a521f245c7857dd5c01" + ], + "inputs": [ + { + "uxid": "1d4595b9fa1c6c3d64f48b6ae5f8f861b1c08a022cbcb04b279df448da3db660", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873900.000000", + "hours": 1388810, + "calculated_hours": 1388810 + } + ], + "outputs": [ + { + "uxid": "412eff3eef889c682da8db3608fce37d1c5ee2cc297bc88d901648e6ccd418f9", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873800.000000", + "hours": 173601 + }, + { + "uxid": "c961ba554ae30b0edcdf71e834ab2b26d7dff5bcf5955d4874cdba89170392bf", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "100.000000", + "hours": 173601 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 65, + "block_seq": 116 + }, + "time": 1429349392, + "txn": { + "timestamp": 1429349392, + "length": 220, + "type": 0, + "txid": "491130fc9f69d101df220116356e82e2ff21dac1167e6da81c95dd4cc417b3d9", + "inner_hash": "d78596837a36ece9a8bc3a8eed424612651039f4f229969c42ec3d7fd1aceff2", + "fee": 388717, + "sigs": [ + "e22e89ecb303d5eee59eca8a75e0d5b4fdfa3a256576d7ac91264b4c3bf882ce7186572ab68fd1ad4dc837039ef4d7063ead72365506aed71cfe4de0b0449b4900" + ], + "inputs": [ + { + "uxid": "2426f768e00345b641f5b4b4b058c308d528e22437bc6e552f0a9d5bd665e14a", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26500.000000", + "hours": 1861, + "calculated_hours": 518287 + } + ], + "outputs": [ + { + "uxid": "6c34016037cd17622846e71bc635914d4d8f256c147aa5a0b84a896e83229480", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26400.000000", + "hours": 64785 + }, + { + "uxid": "ab12f4eadaf956be371ff8f239956e33d1cd2fd4b497ca04c9501baf6f241618", + "dst": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", + "coins": "100.000000", + "hours": 64785 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 63, + "block_seq": 118 + }, + "time": 1429364072, + "txn": { + "timestamp": 1429364072, + "length": 317, + "type": 0, + "txid": "a83e09e976b038d86491d8c029aec84a6313dc33e692da6ce50a2858e50c4666", + "inner_hash": "86b47008bbeb60335762ba70b5bdf8128f09b3f8fff6ec6e5d9553763a5b5cef", + "fee": 184620, + "sigs": [ + "48312c1abe5617609f70a882689f194e8d18c0b56d153adfae4be08bf00d723c6cda6dbd885e7ed7f92c7b7065d583adfd5f18bb37da9b796a394f4a388e978d01", + "4826477aed0387ca448b8225a5d27ebe6824b460d0581fb8ccb5078a865cd8171e7f5c860091a99cc85b1571dce8a550659cb3d02902a77cd1f6d0d27277bdee01" + ], + "inputs": [ + { + "uxid": "7b132c07322babefa83ab64971b7bfb29bf2cb9ffe9c42dc7e2975a185dcd8b8", + "owner": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "995.000000", + "hours": 387, + "calculated_hours": 72454 + }, + { + "uxid": "c961ba554ae30b0edcdf71e834ab2b26d7dff5bcf5955d4874cdba89170392bf", + "owner": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "100.000000", + "hours": 173601, + "calculated_hours": 173704 + } + ], + "outputs": [ + { + "uxid": "3408638af298419b14a49e8e9dd69e97c9a06827d74edf9f410a870662360b31", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1045.000000", + "hours": 30769 + }, + { + "uxid": "ba0a94662846565969d361b1b7c248847a48e69f2b9eefb4ffb0bc2efc56a8fd", + "dst": "38cVLswijqC2ANV5HxTroeapQzqeoBR88C", + "coins": "50.000000", + "hours": 30769 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 61, + "block_seq": 120 + }, + "time": 1429364452, + "txn": { + "timestamp": 1429364452, + "length": 183, + "type": 0, + "txid": "d1569ca879f98450a920a2b427ab0e1d21342308fb6b4ea5031ee6e718217183", + "inner_hash": "12d27fdba804c648b8f72d9740d4021b05c88c95d3595af4afab2150092c5eee", + "fee": 3366, + "sigs": [ + "2baa243ca1b82bd9fc1a31a0b53c9f7eb0ad62b19d6a4d3af62579cc2dc455d81d8ed82ba342dc650d4ae38718d81a8df6a93a9a809749a2f5391894bbaf298400" + ], + "inputs": [ + { + "uxid": "f480c6097568036b90a2e019f9ee68c0812b2da8828be33a005a7427caf14a2b", + "owner": "f38daJDg8rpwL5xWgMY78fBHncQ1N5gQZ7", + "coins": "38.000000", + "hours": 3846, + "calculated_hours": 3846 + } + ], + "outputs": [ + { + "uxid": "3f9712cab0d3aeb217f1751fa19e53d75f814b4218866d4e70d63f32271d2023", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "38.000000", + "hours": 480 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 60, + "block_seq": 121 + }, + "time": 1429382678, + "txn": { + "timestamp": 1429382678, + "length": 220, + "type": 0, + "txid": "da82deafc15c36e7dc9cd95663e0dc910ae626ee543147ac7bd8682be00f7baf", + "inner_hash": "c98f858a27e76b0b565baaa3dffc6cfc7b0ffe9dd7d2d71f4bb0ad4d1c439ca2", + "fee": 2271879, + "sigs": [ + "15fccdc36c966a9571196a3f727ebda47162441df2d9965ac27109ac56d22cb41638b404e84b5b388d809b814ade18022cba0a6e021140c6b7d0144a6facd6d501" + ], + "inputs": [ + { + "uxid": "6beca9fb58a327580c614d7fb5622916849756790b661bcabc880666364fdf47", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863600.000000", + "hours": 20965, + "calculated_hours": 3029171 + } + ], + "outputs": [ + { + "uxid": "f8a1990492f970227ec29e6e095fa724d66fa2d6883bd8723773098d08ca8b3c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "801600.000000", + "hours": 378646 + }, + { + "uxid": "e5596ef0ba04ad9e0adbe0355a24c6bef249654906f917b68f8f0cf072508674", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "62000.000000", + "hours": 378646 + } + ] + } + } +] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/multiple-addr-transactions.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/multiple-addr-transactions.golden new file mode 100644 index 00000000..e4d5d51c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/multiple-addr-transactions.golden @@ -0,0 +1,750 @@ +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 142, + "block_seq": 39 + }, + "time": 1429058494, + "txn": { + "timestamp": 1429058494, + "length": 220, + "type": 0, + "txid": "c38b47bd576e3bced2a9309c3df7622064e71177f54020d77193d5cac310719c", + "inner_hash": "7f02ba6476946668f3adcbb35e113531e6788cee4fe94bf8d8da4803e3baa7e3", + "sigs": [ + "2a31eb55da895c59654ad3f1a11efa11b04787ab78dcf8221aeeccf137adec543765f761363390c97f429310fcb39db305494a94b30af906a2d43d5de1effbb701" + ], + "inputs": [ + "108520145179c00f581d91e273714811fe6e82ee059d65218eea91154ebd8205" + ], + "outputs": [ + { + "uxid": "e79c94aa7013c7611901839236b8a1cdf70e8ef7c40b9e33f99359136de981d6", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "988790.000000", + "hours": 48655 + }, + { + "uxid": "df5d6e09da2585a6ac1a37aea2370fa25e9049b549049202d5417138bf033cfa", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "10000.000000", + "hours": 48655 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 128, + "block_seq": 53 + }, + "time": 1429077514, + "txn": { + "timestamp": 1429077514, + "length": 220, + "type": 0, + "txid": "d154d8262abbf517c67d529b0fea7cdf097433bd296d5795b17c6379cb1b1430", + "inner_hash": "b69070b10e6bbc276bf155361d7f3238fec46b9d865075c1dc0fc20d81ab0a42", + "sigs": [ + "0a4b7f385a164f5718794382d49c14a6623e7af5f1ddbefe4871c756b754457a7075e822603bd3b22b313278abebe756be92367ef7a81a8c4adf992842c2058601" + ], + "inputs": [ + "e6d9b56e075a6adf520d1ae7fbab9ae06353ae0b93dc8cb17d82cc3628009a50" + ], + "outputs": [ + { + "uxid": "2df1e88589be43c55d7c6c3dbcbd663fb759b3245eb8d86b0b9cdaa989556aea", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "943750.000000", + "hours": 2964 + }, + { + "uxid": "c7919b892eeb751456d456b37ccde7350a3fca0dda03b17ec426a56f12dcf192", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1000.000000", + "hours": 2964 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 125, + "block_seq": 56 + }, + "time": 1429077554, + "txn": { + "timestamp": 1429077554, + "length": 220, + "type": 0, + "txid": "8fba29db2e3e8cad785e723f95aa5fa46ae0dd8b2bb62586977f20e698642cfb", + "inner_hash": "dc25f33c3b93678ccc3449a318d55782a274c17cd2f45089018bd7c55b21dd96", + "sigs": [ + "6fbe79a6f32b242f97f7e7662e6f7eb5aff065e8063864fc52159071005ffb2570c26a2d8b21a7826cf18c15f4f4ed9b718a7a9fdf1b4d5ac63bdb632452c82401" + ], + "inputs": [ + "df5d6e09da2585a6ac1a37aea2370fa25e9049b549049202d5417138bf033cfa" + ], + "outputs": [ + { + "uxid": "3d7dd4d41e613fe8153f5e5f62b79494e9db9ed98f875d929ca1f90ecfe2d50b", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "9000.000000", + "hours": 12696 + }, + { + "uxid": "9e53268a18f8d32a44b4fb183033b49bebfe9d0da3bf3ef2ad1d560500aa54c6", + "dst": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 12696 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 121, + "block_seq": 60 + }, + "time": 1429077624, + "txn": { + "timestamp": 1429077624, + "length": 220, + "type": 0, + "txid": "77a69f4c8afd858a2f6767bb9980d4af6520e02b076bf2a78b935021e1147c71", + "inner_hash": "65f97c460ed99ea47ea2cdfd0780af2338f78d80bff93b92dc2ccc8f2411abec", + "sigs": [ + "7c32e34864bc9659222cb26f10058df5cf2fe0c7b78b1d067a7b5af80f4a2b146f8914f4424d9e80a3303d3d2531ddf9d60489011c607ecd5f92cefa5105eee501" + ], + "inputs": [ + "3d7dd4d41e613fe8153f5e5f62b79494e9db9ed98f875d929ca1f90ecfe2d50b" + ], + "outputs": [ + { + "uxid": "77769e6a01cf3dca201ade501767d0abf20dea19d694f3272b647a9a651fdee9", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "8000.000000", + "hours": 1605 + }, + { + "uxid": "0560bae3917bca7581af9b6c5a58e395c701ce9ed0241dac2de8a3e93c0b839b", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 1605 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 118, + "block_seq": 63 + }, + "time": 1429077684, + "txn": { + "timestamp": 1429077684, + "length": 220, + "type": 0, + "txid": "8d10b0ba11d9dd63d3a3522bc35bd260e8da9109298aa488355ea7201eb961b7", + "inner_hash": "929218d56de3e94d277827c857a657ef8b1352f75e6938ff5cf10ac4c54d4039", + "sigs": [ + "6c8892c3277b90f5ca71a42515706de993c459f094282fa99168359f00c5cb862811c4225cc1448e99ba2755e9f9eb241ad0df25b20f1a6ec035a673cf42ab2f00" + ], + "inputs": [ + "77769e6a01cf3dca201ade501767d0abf20dea19d694f3272b647a9a651fdee9" + ], + "outputs": [ + { + "uxid": "f5867b05823c81fc53de36b140415b3b98e4f4cec5883512f8553f70c550d8e7", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "7000.000000", + "hours": 211 + }, + { + "uxid": "9011fbc6e82dce0656e7ffc76afb014d2ad70aa4663e7b687d3212e12f8965e2", + "dst": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", + "coins": "1000.000000", + "hours": 211 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 110, + "block_seq": 71 + }, + "time": 1429077974, + "txn": { + "timestamp": 1429077974, + "length": 220, + "type": 0, + "txid": "abed13c2a552633d26b5b51c3ac5abf9808756c0203869ed185a7cd673702ba2", + "inner_hash": "c176a1a85f716055a9e8060c2a4245db0d7f71f4ac5387d4a51d173db467150a", + "sigs": [ + "40e8340047f08afd483b2867166e15ae751bb7272a2c24f68ae8561d3619ea021363e987118a2fe516cacff1946d4d6c4c249038581ee2f58f8feea4bcffc3b100" + ], + "inputs": [ + "450cd7795bb3625daa99d6b64b9a8786d593bf1cad986d6c2933dae04b74a593" + ], + "outputs": [ + { + "uxid": "b44ee00208690c2123989f40edaff0224825afb20ca0952fbd90bddfd3213642", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863750.000000", + "hours": 0 + }, + { + "uxid": "22edb5931e1c54382f18e41ef774931efb08c278209a1fe8a34100147b707220", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "25000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 108, + "block_seq": 73 + }, + "time": 1429091164, + "txn": { + "timestamp": 1429091164, + "length": 220, + "type": 0, + "txid": "a95317361364e8cc08a150840bac8a97ea1f56278f8834ca2a2f16c24c4a7f0f", + "inner_hash": "90c166e92a7883037f9634704923d986976ac814f28e4761309bf86d77cdb755", + "sigs": [ + "27ee3b614e5362462bc20c23e873e380b5bcc880053436a640286ead5fe2dcd00094e0eade532ffbfc8ba95d5e3540968b2fff64e19e0e772342aceb3c5d3ce100" + ], + "inputs": [ + "c7919b892eeb751456d456b37ccde7350a3fca0dda03b17ec426a56f12dcf192" + ], + "outputs": [ + { + "uxid": "7b132c07322babefa83ab64971b7bfb29bf2cb9ffe9c42dc7e2975a185dcd8b8", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "995.000000", + "hours": 387 + }, + { + "uxid": "8f52e126bbc359bc3bfd230d82649c3d1c622e8f9c20dae7ccd73bd0b4ee2bad", + "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "5.000000", + "hours": 387 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 102, + "block_seq": 79 + }, + "time": 1429147950, + "txn": { + "timestamp": 1429147950, + "length": 317, + "type": 0, + "txid": "2558a7cd524acdb58f822a56bd51e8905182b2b35fbfdb1246ce6dc9930d14eb", + "inner_hash": "37931a3c0b9fe54ebfd93e70c5e872ea8f68669bcd38176bc223be01f7e43aa0", + "sigs": [ + "1d2fa9d76a29f3ce2eda062afe42f3718db434863955ed4f43a83f79dd372a922fd2774d7f5227fa253c65537418b30309932f404e788db91fac1d580d83b28101", + "471ae24bbebd78b5d298edb81e07cc282ce8c1517a2d7426f91f177f111c93873c594e04a215bcd982220b0e6967bd328ec494811cf5eb854091e1d4552545e700" + ], + "inputs": [ + "f5867b05823c81fc53de36b140415b3b98e4f4cec5883512f8553f70c550d8e7", + "22edb5931e1c54382f18e41ef774931efb08c278209a1fe8a34100147b707220" + ], + "outputs": [ + { + "uxid": "09661724179523e8aec95862a5fd12dd1aa50f39f193f81eece0d7aea6197103", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "31000.000000", + "hours": 77792 + }, + { + "uxid": "2a886bcedf8862c351cc4087b89e902202b08b164363567a9be47908e938f280", + "dst": "pMub1Pz3SLVaSwHoomgp5oDVxdkVxLkW6L", + "coins": "1000.000000", + "hours": 77792 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 98, + "block_seq": 83 + }, + "time": 1429164480, + "txn": { + "timestamp": 1429164480, + "length": 220, + "type": 0, + "txid": "d80d49958166fd7b35cee63cfc4a4fdd434484f9bfd9444f62a1b856da36e9c7", + "inner_hash": "ddf70f29cbcb9ab5d04848c77bb605849c5d831c80afed10f64ea2bde710b7bd", + "sigs": [ + "21ccec8663f52b64e6d1983c5c715fc360ef1a01a0f4fce857fe7151e59b4cc87a5b6cc18f770eac98ef640eb15d572ea96b81e90a793bb01ac905778c10f0da00" + ], + "inputs": [ + "09661724179523e8aec95862a5fd12dd1aa50f39f193f81eece0d7aea6197103" + ], + "outputs": [ + { + "uxid": "6a8bc7ef9e8e7b67fd270cf37022edadb13f1fc2ba4e7a026f7ce2ab30cc4572", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "30000.000000", + "hours": 27495 + }, + { + "uxid": "a733e89023ccc12587d0849f9baeda0d2fad640c1cbe97e24ffc531859fd83fd", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "1000.000000", + "hours": 27495 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 97, + "block_seq": 84 + }, + "time": 1429164590, + "txn": { + "timestamp": 1429164590, + "length": 220, + "type": 0, + "txid": "8374d85130bbcf496bff138cd040f91fa362eb1b6b6a1c7c9285523437d5589c", + "inner_hash": "3188ba9148add7f2811180f130de2c0668fc21c031a7329993b61bfe35f860f1", + "sigs": [ + "93edab2b508cd33cd76c50a5aeabcbcf35472d25ba2b3f268d1cc0a4a813fbe907f4c0e645893b4efd524d30fabb6ba62d65c2ee050057885eea2ca0d2d1c21500" + ], + "inputs": [ + "6a8bc7ef9e8e7b67fd270cf37022edadb13f1fc2ba4e7a026f7ce2ab30cc4572" + ], + "outputs": [ + { + "uxid": "15700b88043b3c08a46c3c4e36e7f431291a26aef1ef26c44ee413feee14b950", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "29700.000000", + "hours": 3436 + }, + { + "uxid": "e2512ec90800147d0d9ddbd0778511ee5a45a25efcb354c50a101738a65462c5", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "300.000000", + "hours": 3436 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 92, + "block_seq": 89 + }, + "time": 1429164800, + "txn": { + "timestamp": 1429164800, + "length": 220, + "type": 0, + "txid": "a0956843d442bd4b592d0c1323d153c3c1b2d7d52a86629444de6d1d1b6a4c33", + "inner_hash": "0fd405b4d4a74b417a27d0bfd2f0d1acf4ed0499a000e94c64a1443c5bb440bd", + "sigs": [ + "9bd640adcf2e1870dd4cdd93f007759626ed9fd87dd8e0485888612ea660435a3104889820e6dab8d692efc3e4afb892de622c46b5f5c25718dfb78d4882d2ec01" + ], + "inputs": [ + "15700b88043b3c08a46c3c4e36e7f431291a26aef1ef26c44ee413feee14b950" + ], + "outputs": [ + { + "uxid": "24c49699aab32caf9456a6b4dacd4d820c853c7639e5500b3be6326660312917", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "28700.000000", + "hours": 635 + }, + { + "uxid": "63154895637eb000146996ffaeb7cc1a547e409d0a2038650e990e7cc9b36826", + "dst": "XnKU1htBL5wFSMX8oytZBsBMeaBSbVNivT", + "coins": "1000.000000", + "hours": 635 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 88, + "block_seq": 93 + }, + "time": 1429164860, + "txn": { + "timestamp": 1429164860, + "length": 220, + "type": 0, + "txid": "e2d9da9342b21659da0a679536f9d6f533a4ce7dc33a7f768c3441ca3640458d", + "inner_hash": "72974683d8244d927c63440a169a438611ef88b250f20df2711d83a9f61a75c9", + "sigs": [ + "1c72245ae55779445ae5a6c030ea7f01cee7c29dd6189d0dcb383ec8438297e635b314c44bb0c4173c9e30d225774ee0334cee186e603a61c171af4db3eb961e01" + ], + "inputs": [ + "24c49699aab32caf9456a6b4dacd4d820c853c7639e5500b3be6326660312917" + ], + "outputs": [ + { + "uxid": "fb4d5dcc1c3ac97444e96aa7da392b0d7faf7b7373504c70e497228a4695a7f1", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "27700.000000", + "hours": 129 + }, + { + "uxid": "4a5c1b09ef2216ba2fdae735ec8c6ad404bb61bfbeb7407dee9d6e3578762ffb", + "dst": "2LZzgdFYNhsBBSLATkV6PA1zk6DvWNghP2", + "coins": "1000.000000", + "hours": 129 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 84, + "block_seq": 97 + }, + "time": 1429165260, + "txn": { + "timestamp": 1429165260, + "length": 220, + "type": 0, + "txid": "a689a3589730a351f880176b2c15b395967b38a90950e0491e7a1e5531f020a9", + "inner_hash": "d6cfcef60d17c03b68b94c4284746bc70e8ef66cb6d2bd370094a7e4b19dbaed", + "sigs": [ + "de36c5fac7db61c7a47827e1a9ad1b717d5fa904b69283598eab6003ba1b1e264856f30a6afe0881675e8f11a86e666cec09b789f3971a6ec4ba25183684a18900" + ], + "inputs": [ + "fb4d5dcc1c3ac97444e96aa7da392b0d7faf7b7373504c70e497228a4695a7f1" + ], + "outputs": [ + { + "uxid": "4e75b4bced3404590d38ca06440c275d7fd86618a84966a0a1053fb18164e898", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26700.000000", + "hours": 54 + }, + { + "uxid": "1f9fb89f5b7c41d3df6d72b1f02c998196bc79ec20c3949693b4f5a2c1aae44f", + "dst": "2H7mA88ireMKHqP9LYWK5opnU176v7eYqrn", + "coins": "1000.000000", + "hours": 54 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 79, + "block_seq": 102 + }, + "time": 1429274686, + "txn": { + "timestamp": 1429274686, + "length": 183, + "type": 0, + "txid": "7b13cab45b52dd2df291ec97cf000bf6ea1b647d6fdf0261a7527578d8b71b9d", + "inner_hash": "73bfee3a7c8d4f8a68657ebcaf69a59639f762bfc1a6f4468f3ca4724bc5b9f8", + "sigs": [ + "c4bcada17604a4a62baf50f929655027f2913639c27b773871f2135b72553c1959737e39d50e8349ffa5a7679de845aa6370999dbaaff4c7f9fd01260818683901" + ], + "inputs": [ + "4e75b4bced3404590d38ca06440c275d7fd86618a84966a0a1053fb18164e898" + ], + "outputs": [ + { + "uxid": "0a5603a1a5aeda575aa498cdaec5a4c893a28669dba84163eba2e90db3d9f39d", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26700.000000", + "hours": 101435 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 78, + "block_seq": 103 + }, + "time": 1429278106, + "txn": { + "timestamp": 1429278106, + "length": 220, + "type": 0, + "txid": "9150311508851ca989efb5f82b5a7201724514b6b9f84ec1620c18673462126b", + "inner_hash": "83e206eb05ce5708efd174bb9df2c0bc0741c1775e50d139aebf37ed6c46381d", + "sigs": [ + "a6206409a077ec30fe7f0b0ad5162805dffbff743afbc9e8e926d72ae38d15f80ab8183150caa4d745125c1c6e733428e299742d10e07a64ba5bd21d4e5ee06f00" + ], + "inputs": [ + "0a5603a1a5aeda575aa498cdaec5a4c893a28669dba84163eba2e90db3d9f39d" + ], + "outputs": [ + { + "uxid": "1e30e9dfe00e055404063e52a4154a72492b13de6acf4871ec5ea6d7c0fcc968", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26600.000000", + "hours": 12679 + }, + { + "uxid": "435c7095e2531b88feb76f32fc34fac3406882cdf71e17fecdba196aa5bc059a", + "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "100.000000", + "hours": 12679 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 76, + "block_seq": 105 + }, + "time": 1429278556, + "txn": { + "timestamp": 1429278556, + "length": 220, + "type": 0, + "txid": "41ec724bd40c852096379d1ae57d3f27606877fa95ac9c082fbf63900e6c5cb5", + "inner_hash": "614d7754fa0633e1a701eea3b3a2ce1c2815360f311cd1cb6cf46d5ae94304ba", + "sigs": [ + "bd20e6b6754308d192ba734a573ec4363dae5326b9b21a7203904c076b067bf9313df1df8ac8960f12d9d8b642deb411a504512990181bc2e53264cf661b868f00" + ], + "inputs": [ + "1e30e9dfe00e055404063e52a4154a72492b13de6acf4871ec5ea6d7c0fcc968" + ], + "outputs": [ + { + "uxid": "2426f768e00345b641f5b4b4b058c308d528e22437bc6e552f0a9d5bd665e14a", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26500.000000", + "hours": 1861 + }, + { + "uxid": "8f4435cc1cb45453f1ee8e836a74bdec313a6d3aa1879be24e2ba261d474bf36", + "dst": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", + "coins": "100.000000", + "hours": 1861 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 68, + "block_seq": 113 + }, + "time": 1429348172, + "txn": { + "timestamp": 1429348172, + "length": 220, + "type": 0, + "txid": "1f27afc41896d2c7fdbd2620e606440ad12557e9a4bdd6808dcc2c23d4e32978", + "inner_hash": "4d53c05c731409feef7606cf9514904f4c7704537efb453ac2c439fcfe77a455", + "sigs": [ + "e36cef84c1c6f999dba462f3134131c105da2255eaf21550ce30ee52a14a33d529a7cd0c37b3883d0d57429b163b4905271c7b1a4d951b4a521f245c7857dd5c01" + ], + "inputs": [ + "1d4595b9fa1c6c3d64f48b6ae5f8f861b1c08a022cbcb04b279df448da3db660" + ], + "outputs": [ + { + "uxid": "412eff3eef889c682da8db3608fce37d1c5ee2cc297bc88d901648e6ccd418f9", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873800.000000", + "hours": 173601 + }, + { + "uxid": "c961ba554ae30b0edcdf71e834ab2b26d7dff5bcf5955d4874cdba89170392bf", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "100.000000", + "hours": 173601 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 65, + "block_seq": 116 + }, + "time": 1429349392, + "txn": { + "timestamp": 1429349392, + "length": 220, + "type": 0, + "txid": "491130fc9f69d101df220116356e82e2ff21dac1167e6da81c95dd4cc417b3d9", + "inner_hash": "d78596837a36ece9a8bc3a8eed424612651039f4f229969c42ec3d7fd1aceff2", + "sigs": [ + "e22e89ecb303d5eee59eca8a75e0d5b4fdfa3a256576d7ac91264b4c3bf882ce7186572ab68fd1ad4dc837039ef4d7063ead72365506aed71cfe4de0b0449b4900" + ], + "inputs": [ + "2426f768e00345b641f5b4b4b058c308d528e22437bc6e552f0a9d5bd665e14a" + ], + "outputs": [ + { + "uxid": "6c34016037cd17622846e71bc635914d4d8f256c147aa5a0b84a896e83229480", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26400.000000", + "hours": 64785 + }, + { + "uxid": "ab12f4eadaf956be371ff8f239956e33d1cd2fd4b497ca04c9501baf6f241618", + "dst": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", + "coins": "100.000000", + "hours": 64785 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 63, + "block_seq": 118 + }, + "time": 1429364072, + "txn": { + "timestamp": 1429364072, + "length": 317, + "type": 0, + "txid": "a83e09e976b038d86491d8c029aec84a6313dc33e692da6ce50a2858e50c4666", + "inner_hash": "86b47008bbeb60335762ba70b5bdf8128f09b3f8fff6ec6e5d9553763a5b5cef", + "sigs": [ + "48312c1abe5617609f70a882689f194e8d18c0b56d153adfae4be08bf00d723c6cda6dbd885e7ed7f92c7b7065d583adfd5f18bb37da9b796a394f4a388e978d01", + "4826477aed0387ca448b8225a5d27ebe6824b460d0581fb8ccb5078a865cd8171e7f5c860091a99cc85b1571dce8a550659cb3d02902a77cd1f6d0d27277bdee01" + ], + "inputs": [ + "7b132c07322babefa83ab64971b7bfb29bf2cb9ffe9c42dc7e2975a185dcd8b8", + "c961ba554ae30b0edcdf71e834ab2b26d7dff5bcf5955d4874cdba89170392bf" + ], + "outputs": [ + { + "uxid": "3408638af298419b14a49e8e9dd69e97c9a06827d74edf9f410a870662360b31", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1045.000000", + "hours": 30769 + }, + { + "uxid": "ba0a94662846565969d361b1b7c248847a48e69f2b9eefb4ffb0bc2efc56a8fd", + "dst": "38cVLswijqC2ANV5HxTroeapQzqeoBR88C", + "coins": "50.000000", + "hours": 30769 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 61, + "block_seq": 120 + }, + "time": 1429364452, + "txn": { + "timestamp": 1429364452, + "length": 183, + "type": 0, + "txid": "d1569ca879f98450a920a2b427ab0e1d21342308fb6b4ea5031ee6e718217183", + "inner_hash": "12d27fdba804c648b8f72d9740d4021b05c88c95d3595af4afab2150092c5eee", + "sigs": [ + "2baa243ca1b82bd9fc1a31a0b53c9f7eb0ad62b19d6a4d3af62579cc2dc455d81d8ed82ba342dc650d4ae38718d81a8df6a93a9a809749a2f5391894bbaf298400" + ], + "inputs": [ + "f480c6097568036b90a2e019f9ee68c0812b2da8828be33a005a7427caf14a2b" + ], + "outputs": [ + { + "uxid": "3f9712cab0d3aeb217f1751fa19e53d75f814b4218866d4e70d63f32271d2023", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "38.000000", + "hours": 480 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 60, + "block_seq": 121 + }, + "time": 1429382678, + "txn": { + "timestamp": 1429382678, + "length": 220, + "type": 0, + "txid": "da82deafc15c36e7dc9cd95663e0dc910ae626ee543147ac7bd8682be00f7baf", + "inner_hash": "c98f858a27e76b0b565baaa3dffc6cfc7b0ffe9dd7d2d71f4bb0ad4d1c439ca2", + "sigs": [ + "15fccdc36c966a9571196a3f727ebda47162441df2d9965ac27109ac56d22cb41638b404e84b5b388d809b814ade18022cba0a6e021140c6b7d0144a6facd6d501" + ], + "inputs": [ + "6beca9fb58a327580c614d7fb5622916849756790b661bcabc880666364fdf47" + ], + "outputs": [ + { + "uxid": "f8a1990492f970227ec29e6e095fa724d66fa2d6883bd8723773098d08ca8b3c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "801600.000000", + "hours": 378646 + }, + { + "uxid": "e5596ef0ba04ad9e0adbe0355a24c6bef249654906f917b68f8f0cf072508674", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "62000.000000", + "hours": 378646 + } + ] + } + } +] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/network-default-peers.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/network-default-peers.golden new file mode 100644 index 00000000..ba385bcc --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/network-default-peers.golden @@ -0,0 +1,11 @@ +[ + "109.237.27.172:6000", + "139.162.121.185:6000", + "139.162.248.183:6000", + "139.162.39.186:6000", + "172.104.164.147:6000", + "172.104.41.14:6000", + "173.230.130.174:6000", + "45.33.111.142:6000", + "45.56.109.228:6000" +] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/network-exchanged-peers.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/network-exchanged-peers.golden new file mode 100644 index 00000000..fe51488c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/network-exchanged-peers.golden @@ -0,0 +1 @@ +[] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/network-trusted-peers.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/network-trusted-peers.golden new file mode 100644 index 00000000..ba385bcc --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/network-trusted-peers.golden @@ -0,0 +1,11 @@ +[ + "109.237.27.172:6000", + "139.162.121.185:6000", + "139.162.248.183:6000", + "139.162.39.186:6000", + "172.104.164.147:6000", + "172.104.41.14:6000", + "173.230.130.174:6000", + "45.33.111.142:6000", + "45.56.109.228:6000" +] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/no-unconfirmed-outputs-addrs.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/no-unconfirmed-outputs-addrs.golden new file mode 100644 index 00000000..198f4c51 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/no-unconfirmed-outputs-addrs.golden @@ -0,0 +1,46 @@ +{ + "head": { + "seq": 180, + "block_hash": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "previous_block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "timestamp": 1431574528, + "fee": 2265261, + "version": 0, + "tx_body_hash": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "ux_hash": "058d1d0a22be7b9f5567a236866836a87d922760581832cfb8bfbd8b337d64b1" + }, + "head_outputs": [ + { + "hash": "75692aeff988ce0da734c474dbef3a1ce19a5a6823bbcd36acb856c83262261e", + "time": 1431574528, + "block_seq": 180, + "src_tx": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "address": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "hours": 377543, + "calculated_hours": 377543 + }, + { + "hash": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + } + ], + "outgoing_outputs": [], + "incoming_outputs": [] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/no-unconfirmed-outputs-hashes.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/no-unconfirmed-outputs-hashes.golden new file mode 100644 index 00000000..a9805388 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/no-unconfirmed-outputs-hashes.golden @@ -0,0 +1,56 @@ +{ + "head": { + "seq": 180, + "block_hash": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "previous_block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "timestamp": 1431574528, + "fee": 2265261, + "version": 0, + "tx_body_hash": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "ux_hash": "058d1d0a22be7b9f5567a236866836a87d922760581832cfb8bfbd8b337d64b1" + }, + "head_outputs": [ + { + "hash": "01f9c1d6c83dbc1c993357436cdf7f214acd0bfa107ff7f1466d1b18ec03563e", + "time": 1431339429, + "block_seq": 179, + "src_tx": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "address": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "10050.000000", + "hours": 5521648, + "calculated_hours": 6177966 + }, + { + "hash": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "time": 1431339429, + "block_seq": 179, + "src_tx": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "address": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "hours": 5521648, + "calculated_hours": 45730107 + }, + { + "hash": "d91e07318227651129b715d2db448ae245b442acd08c8b4525a934f0e87efce9", + "time": 1430908702, + "block_seq": 175, + "src_tx": "9364ed6cfcc289df74dc6bac1993f7ab3441b898cb3f06918198d2476c83dbac", + "address": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "10000.000000", + "hours": 18358, + "calculated_hours": 1867874 + }, + { + "hash": "9e53268a18f8d32a44b4fb183033b49bebfe9d0da3bf3ef2ad1d560500aa54c6", + "time": 1429077554, + "block_seq": 56, + "src_tx": "8fba29db2e3e8cad785e723f95aa5fa46ae0dd8b2bb62586977f20e698642cfb", + "address": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 12696, + "calculated_hours": 706299 + } + ], + "outgoing_outputs": [], + "incoming_outputs": [] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/no-unconfirmed-outputs-noargs.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/no-unconfirmed-outputs-noargs.golden new file mode 100644 index 00000000..c8e228ed --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/no-unconfirmed-outputs-noargs.golden @@ -0,0 +1,2196 @@ +{ + "head": { + "seq": 180, + "block_hash": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "previous_block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "timestamp": 1431574528, + "fee": 2265261, + "version": 0, + "tx_body_hash": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "ux_hash": "058d1d0a22be7b9f5567a236866836a87d922760581832cfb8bfbd8b337d64b1" + }, + "head_outputs": [ + { + "hash": "75692aeff988ce0da734c474dbef3a1ce19a5a6823bbcd36acb856c83262261e", + "time": 1431574528, + "block_seq": 180, + "src_tx": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "address": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "hours": 377543, + "calculated_hours": 377543 + }, + { + "hash": "a4b70476ea1e079ebd3503b52eee32d490515457fce6a5aa075770b598a9d14f", + "time": 1431574528, + "block_seq": 180, + "src_tx": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "address": "CDD8GoJUHEvBm1pD3BQ3hEC2KcJNhvUzpu", + "coins": "1000.000000", + "hours": 377543, + "calculated_hours": 377543 + }, + { + "hash": "01f9c1d6c83dbc1c993357436cdf7f214acd0bfa107ff7f1466d1b18ec03563e", + "time": 1431339429, + "block_seq": 179, + "src_tx": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "address": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "10050.000000", + "hours": 5521648, + "calculated_hours": 6177966 + }, + { + "hash": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "time": 1431339429, + "block_seq": 179, + "src_tx": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "address": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "hours": 5521648, + "calculated_hours": 45730107 + }, + { + "hash": "ba1adbf3006a239fb7ef6efb1f9390a25951a5185dc312dd81bf88025f838456", + "time": 1431162729, + "block_seq": 178, + "src_tx": "ecd101a6af263973ab75f87a3116231e6fe84a2281d0001c9aa2d7195545e78e", + "address": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "5.000000", + "hours": 56499, + "calculated_hours": 57070 + }, + { + "hash": "ec439e7c7d8517824885ae1520fa5b19f991d7ade3a12209c0e87f6ad1d30229", + "time": 1431162689, + "block_seq": 177, + "src_tx": "e4850021fb706f2b7a94fec9ade3c166823dcd980dc3954437471d98fb9d2280", + "address": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "4950.000000", + "hours": 56499, + "calculated_hours": 622777 + }, + { + "hash": "f5e7796297b7201b1ea87736fadddc7b451f9ed7d4529cfe9f03082e80917628", + "time": 1431162689, + "block_seq": 177, + "src_tx": "e4850021fb706f2b7a94fec9ade3c166823dcd980dc3954437471d98fb9d2280", + "address": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "20000.000000", + "hours": 56499, + "calculated_hours": 2344493 + }, + { + "hash": "d91e07318227651129b715d2db448ae245b442acd08c8b4525a934f0e87efce9", + "time": 1430908702, + "block_seq": 175, + "src_tx": "9364ed6cfcc289df74dc6bac1993f7ab3441b898cb3f06918198d2476c83dbac", + "address": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "10000.000000", + "hours": 18358, + "calculated_hours": 1867874 + }, + { + "hash": "2d3f7890d11efedd4cee3a7ab4a5cbc56d2c8df4f02124bdad9ec839400053ba", + "time": 1430871622, + "block_seq": 174, + "src_tx": "ad44a8027a825e82a20cdd910d9bd41d74025601b7668c80655e9b45afb8bb93", + "address": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "5000.000000", + "hours": 18586, + "calculated_hours": 994844 + }, + { + "hash": "793f3f0e41c9d1de391d864792b79ed8c24dde5ff84a73c161d660a73ed70c90", + "time": 1430871512, + "block_seq": 173, + "src_tx": "a7665cec98224150968ec1ef9ef2d6b3175c9de8f9f8c7bc786b30cc74997c57", + "address": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "12000.000000", + "hours": 127440, + "calculated_hours": 2470826 + }, + { + "hash": "be081639ea8da63d8542707e9ea9625f6afc97da132f43ed061645c359bb1e65", + "time": 1430836422, + "block_seq": 170, + "src_tx": "95d847102c01d071982e67b8e7dfae50715b0fc0179d33f4b050974e634905e1", + "address": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10.000000", + "hours": 8, + "calculated_hours": 2058 + }, + { + "hash": "639e69c4a223b5082b9274caf3e56ecff2ab55cd90cac94fdb4c383a1013ba1f", + "time": 1430836392, + "block_seq": 169, + "src_tx": "acfb61f7ca39d5dfe33e8ed66f73ab181da0a3206d457bf055dcc4b9731a3ec8", + "address": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "990.000000", + "hours": 70, + "calculated_hours": 203057 + }, + { + "hash": "a02148f770788851a35fb90567510044e37f8db930deab7a2b584af67c8efb2f", + "time": 1430792072, + "block_seq": 168, + "src_tx": "50fc81b0ba25669105a169a969459ccdb10278051b604a3f91467c2528c83652", + "address": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "1000.000000", + "hours": 4206, + "calculated_hours": 221554 + }, + { + "hash": "0b5e5259c276ac949de97062492ea6dc93ae6215c8dd1615862907e3c3ae9cf0", + "time": 1430791902, + "block_seq": 167, + "src_tx": "b29222c08f10b8bc4ea18981519a3b0e02b9c9cec63ee28d9ffa2efcaf2a8e5a", + "address": "2A2YC8kxWnUDbscpzZ6UPfNAmx5ddKBeYNs", + "coins": "100.000000", + "hours": 33652, + "calculated_hours": 55391 + }, + { + "hash": "b945bacb354173c33bc41503f50c29ad5d1d333ecab66b0c70d0ed9e6eec7f3a", + "time": 1430791622, + "block_seq": 166, + "src_tx": "41589644ea3a344fc616bec0058cf916b8efa5da7c3539241244827bd7e19811", + "address": "2kN23viEG7Kn3Utuwz9voM4Z8ohLR9Y8L2v", + "coins": "500.000000", + "hours": 494004, + "calculated_hours": 602740 + }, + { + "hash": "250543215c71a1a9ab7740fff25c3bf9695fcde10bceba3717aef9d0f6dd40d8", + "time": 1430784932, + "block_seq": 163, + "src_tx": "ec79854fade530d84099d5619864a8e1e8ec9d27a086917a239500cada43c6e8", + "address": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 219332 + }, + { + "hash": "0c19e689e0e34639c71b0136ce336121b042b6d4ac185ac1f9e94ec7535e781f", + "time": 1430784312, + "block_seq": 161, + "src_tx": "d5091ca65ff61998dfb4535a7927fb736abf2a81140a11322dcf8226de27cf92", + "address": "XnKU1htBL5wFSMX8oytZBsBMeaBSbVNivT", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 219504 + }, + { + "hash": "ea18f151bbdb611f73596b61ebb0546b9e91281ccb0bbe07a18e7fa69142bb5b", + "time": 1430784172, + "block_seq": 160, + "src_tx": "0e8e352b1f2cd419bca619918ce6d5ec1eac0ba7252d76eef5d9d8f8186f737a", + "address": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 219543 + }, + { + "hash": "c61f27a2247831679d8df293bf9351b16e8429778c875be2cb64224bcb842ed4", + "time": 1430674696, + "block_seq": 158, + "src_tx": "3d9f1aa1b6206275081cb9c26155f6261be1ef9c94b4eaadb1a7e8277a2099fa", + "address": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "25000.000000", + "hours": 0, + "calculated_hours": 6248833 + }, + { + "hash": "25130a18aca13a37e4f4c08733cdda6a8629759f27ecba775999486c9deffa5e", + "time": 1430673946, + "block_seq": 157, + "src_tx": "c3fd04cd27ea311b1a67d40cd3dbb2ea8ae2c6f6139620cb86be29f33ed99171", + "address": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "18000.000000", + "hours": 0, + "calculated_hours": 4502910 + }, + { + "hash": "a34cfb6f175323917dfda72d58ddcfb86363cc43d22a0c6c3141810f5cac5aa6", + "time": 1430644036, + "block_seq": 156, + "src_tx": "29a883ef9dc67bc683014187b9865c827b5e2f8afd7bf6f3787483318063789e", + "address": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 258470 + }, + { + "hash": "25a72cc385c1cdabd0ffd7c141ae205d767f3d016c281f835b9f58f9325bd2a5", + "time": 1430643906, + "block_seq": 155, + "src_tx": "c9582c8134fa64fdf08cd93d42035adcced3f16aa8ee1a1393e3fcd7c07aa40c", + "address": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "300.000000", + "hours": 0, + "calculated_hours": 77551 + }, + { + "hash": "dbc58940c2457359501c9906589c3d0a0ab7695b983ad79f2bcc087a675671f6", + "time": 1430643706, + "block_seq": 154, + "src_tx": "be0957035ed2ac444f67273fc5c1c6a39ee373f6f83d1604d0023742a8cd7e42", + "address": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 258561 + }, + { + "hash": "c0548bf35c950a74c206d2c565e3bcac1f2abe170ebabdb7b74e439b642dd9fd", + "time": 1430642546, + "block_seq": 152, + "src_tx": "dc10e0565a14dfecda066577581f3e2d073de34ed3e911ed94413d38fc0a33d2", + "address": "22WGCstVJGVyqnBuvGHt17L5aNNMpURvckd", + "coins": "1000.000000", + "hours": 4, + "calculated_hours": 258887 + }, + { + "hash": "efcb1b5f54bceb2d0124d2f89c47d071c2943fb228c2eee62bfddf6e1418cfc8", + "time": 1430642426, + "block_seq": 151, + "src_tx": "18607765c3fbd45eafa15d2d62ab3cbc7ba7bd80c42931aae4db75aa02898671", + "address": "pMub1Pz3SLVaSwHoomgp5oDVxdkVxLkW6L", + "coins": "1000.000000", + "hours": 35, + "calculated_hours": 258952 + }, + { + "hash": "0fa23085def7c1dbc95587d3f0f58cbc30b09e099ee1afa42d9120452777740a", + "time": 1430642306, + "block_seq": 150, + "src_tx": "3e228564e3c187e22bd489857fdb1db7036021e19f688aad56cfee57d5e13ac5", + "address": "sV8sVBgs11uHQtZK5MPbYem2iJ6Hehghv7", + "coins": "100.000000", + "hours": 280, + "calculated_hours": 26175 + }, + { + "hash": "eb57ec196fe95a09be19b62b6837d5d12f99568ad0e5e198f70f55083acd656e", + "time": 1430642106, + "block_seq": 149, + "src_tx": "b69536fbec9911da41e9d0c5ca73459f5e692ba155f8b72c0972792e9937a0fe", + "address": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 2244, + "calculated_hours": 261250 + }, + { + "hash": "5233e499bd3e38ec4d4fa4d750290f25271c91b4903630d461be51f3c2c02ebd", + "time": 1430642006, + "block_seq": 148, + "src_tx": "79681167a7681edecb998e4a6dccdd0b7be45f163c8f6db23436517936269fb8", + "address": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "1000.000000", + "hours": 17954, + "calculated_hours": 276987 + }, + { + "hash": "3ec30639c24acce65054bdb0d7ab0539199b64cabfcad83c2ed7f266fb8849a6", + "time": 1430641536, + "block_seq": 147, + "src_tx": "3fae944ef07d9bcba1bcbc8bde87da50a1232132074803f8442deb563ed2da51", + "address": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 143635, + "calculated_hours": 402799 + }, + { + "hash": "3dd82b00ef4d1e3b1c71be5f13c0c82b3e2b17af4a6b3eb4c966490f47866ccd", + "time": 1430641376, + "block_seq": 146, + "src_tx": "5701965d326520f86335da87c6d1781fd49f1e66520b94e1783711eba724f482", + "address": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 1149084, + "calculated_hours": 1408292 + }, + { + "hash": "7afab03c823346ff8b00c29df6acc05841583d90dfd451ba09e66884a48e83f7", + "time": 1430550936, + "block_seq": 145, + "src_tx": "f25c1a8a4ae37e8e2b4a0ec6f2553cf11c57fa77de9556cd227857ca270a0275", + "address": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "2000.000000", + "hours": 99134, + "calculated_hours": 667796 + }, + { + "hash": "d8ee5dc5cabcf179365345167d39977ae38a71e55cf357881258be32a45732bc", + "time": 1430505176, + "block_seq": 144, + "src_tx": "3bb9fc516dc2c522e28f99e6833253863c550547ce0e0a2dd963a0118b7a44a7", + "address": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 297042 + }, + { + "hash": "456bcb0a2e57a5c20f2757c8fc7669af1f969bb5a57f89965210daf7107993aa", + "time": 1430505086, + "block_seq": 143, + "src_tx": "57150aecde96bde972183b9b0d7d27dda2c0179fb71630e92c27856d211335cd", + "address": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", + "coins": "500.000000", + "hours": 0, + "calculated_hours": 148533 + }, + { + "hash": "908fe94bd28886547f1b7b4fc98d0990a08a216b70877341f566b6b4685de364", + "time": 1430504846, + "block_seq": 141, + "src_tx": "16f8b9369f76ef6a0c1ecf82e1c18d5bc8ae5ef8b01b6530096cb1ff70bbd3fd", + "address": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "2500.000000", + "hours": 0, + "calculated_hours": 742834 + }, + { + "hash": "cfdefd8d167947190a223882d20c8ac7880e550ad1a3494bb05bff4b1df4e3ff", + "time": 1430504746, + "block_seq": 140, + "src_tx": "de45a24c9c32f808a3d928f30ba8e1b6ef8117a7c0b7a5d616734d9b121d0c30", + "address": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 297161 + }, + { + "hash": "278b0caa6dddf4ce74772471b15fb9a8c364362b0ae3eeb9379e980504d8d512", + "time": 1430504536, + "block_seq": 139, + "src_tx": "578075959959db70ae86f4f60d2ae3ff245727d086eef86ed80db5e1c7c9fbaf", + "address": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 297220 + }, + { + "hash": "bceafc261a2250f1bfb8154aea88370acfe6a41a4216bcb76c2016451cbcffd1", + "time": 1430504236, + "block_seq": 138, + "src_tx": "9880bebc51471e0b3c520920db836d674f652503314cd74069a59ccad0d0967a", + "address": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1200.000000", + "hours": 6, + "calculated_hours": 356770 + }, + { + "hash": "b6b6188973b600af774ad8a7b6d454f77713a51463b9a9a70c901ec5280a9789", + "time": 1430504186, + "block_seq": 137, + "src_tx": "fc02772662176c282c2b6538732d3d6eb1399f006a0b52e64d07fc104038f638", + "address": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 48, + "calculated_hours": 297365 + }, + { + "hash": "e00c292e151fdafd24984b2dc08a4a328150006f95afaac9909dbffae1f07eaf", + "time": 1430330851, + "block_seq": 136, + "src_tx": "b9a795552bec1a722718b44a08ad152656242b1d23afb53d2247b3016d920b7e", + "address": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 387, + "calculated_hours": 345852 + }, + { + "hash": "d95d422fb8fe4ad9ce1052e566ec8a5ad7953ceb253366814b3d32e9a1da1f13", + "time": 1430330481, + "block_seq": 134, + "src_tx": "44d05abc2637d9cd2047984023eb5cfa0a146e58821117de30f9c81703189cde", + "address": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "100.000000", + "hours": 24823, + "calculated_hours": 59379 + }, + { + "hash": "8b3d335360effd00cabcae13c2495f26f81743b82958629378b7bc78a7e460fe", + "time": 1430330421, + "block_seq": 133, + "src_tx": "d30cec3ad3a66562d2513a3656b366ea7da583e6ba45214ac12b9c2219b4c5ea", + "address": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "500.000000", + "hours": 198586, + "calculated_hours": 371378 + }, + { + "hash": "333156ed20ba6937d3720af3a81939362b9f4ad1e9591bc676945ff0d202131e", + "time": 1430330311, + "block_seq": 132, + "src_tx": "3dfdfea4614d05c2f5eddf5773ef0afc745f1afe585141659df8e03e82897606", + "address": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 1588688, + "calculated_hours": 1934303 + }, + { + "hash": "e7756fa7a5c067d595f7300828bc4c70152653700844130d88174ba37237e2a3", + "time": 1430330041, + "block_seq": 131, + "src_tx": "6538399868cf772fcfa96e68c51aa6aa66faa95d7c685432e4005880932be134", + "address": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1200.000000", + "hours": 12709509, + "calculated_hours": 13124338 + }, + { + "hash": "169e9a77557283e0d158fe6e35c439d729d73acfd00e2969147dacbdd599817e", + "time": 1429849180, + "block_seq": 129, + "src_tx": "66d415598af081f8a7bd7f292468e67f380d06bf5896eb8152d4d9e8bcdf289e", + "address": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "1000.000000", + "hours": 66854, + "calculated_hours": 546117 + }, + { + "hash": "6143275de37a2b5ec802eeeb8d38a3dfb2db6629128e44c4f9ffc0ce8ddad629", + "time": 1429849170, + "block_seq": 128, + "src_tx": "c2c9fe882df3b44fbb125b251a7604a7a4f4195dddff6e5396b7f130744e2b27", + "address": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", + "coins": "1000.000000", + "hours": 6994818, + "calculated_hours": 7474084 + }, + { + "hash": "bca6e6b24cdabecd77186a61168dd3e2290b2fda1b7a79eb3856ca4cc9f589e2", + "time": 1429680646, + "block_seq": 126, + "src_tx": "a67ed00f815a2fd20d0efd18ac04663f0ee3d5621fbfdcdc6af250f19e3cfc53", + "address": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "990.000000", + "hours": 17310, + "calculated_hours": 538127 + }, + { + "hash": "e4a83076c2ce1bd83953c1c0443054d7f5b0843c551d35b3fc3c116e9a9134d7", + "time": 1429680646, + "block_seq": 126, + "src_tx": "a67ed00f815a2fd20d0efd18ac04663f0ee3d5621fbfdcdc6af250f19e3cfc53", + "address": "odhAMxHhXoBdx1RHNmfu7dTZ1LZivfsbiH", + "coins": "10.000000", + "hours": 17310, + "calculated_hours": 22570 + }, + { + "hash": "a08089cd67896683d5dcb2d50256354e0d086b9854eb22bb6022cc459d447211", + "time": 1429578056, + "block_seq": 125, + "src_tx": "1ca0a2d44b6439b91eb839e0f99405abdcafe2c1a49c8b49b1739498129bd1a6", + "address": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "12500.000000", + "hours": 92, + "calculated_hours": 6932286 + }, + { + "hash": "a4fdfce34725eb63941ac576651fa406272565a344ffb21435d285111efbc4db", + "time": 1429522086, + "block_seq": 124, + "src_tx": "e9a6dd585b564b19c55d9f56188a45bfad32fa75703fa6336830035f6fa92e3d", + "address": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", + "coins": "5000.000000", + "hours": 739, + "calculated_hours": 2851352 + }, + { + "hash": "8e764a87cee9f26b902f748c28a5a49de5c383e5f155129eec84474a3d0349cc", + "time": 1429451746, + "block_seq": 123, + "src_tx": "9003d3caba9587d46d000cc614bb52bed34adcc5ea404c560c986eb6dd756e6b", + "address": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10000.000000", + "hours": 5916, + "calculated_hours": 5902532 + }, + { + "hash": "1e0cf4e3ed49b52944f533a212e6412291e369ac3e7a8c4440424f475f2983b3", + "time": 1429382898, + "block_seq": 122, + "src_tx": "211f5fc97ba1797d78f84d4e4db78415b5ff4121f78369535fe3f8015571c6df", + "address": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "36000.000000", + "hours": 47330, + "calculated_hours": 21963630 + }, + { + "hash": "e5596ef0ba04ad9e0adbe0355a24c6bef249654906f917b68f8f0cf072508674", + "time": 1429382678, + "block_seq": 121, + "src_tx": "da82deafc15c36e7dc9cd95663e0dc910ae626ee543147ac7bd8682be00f7baf", + "address": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "62000.000000", + "hours": 378646, + "calculated_hours": 38127173 + }, + { + "hash": "3f9712cab0d3aeb217f1751fa19e53d75f814b4218866d4e70d63f32271d2023", + "time": 1429364452, + "block_seq": 120, + "src_tx": "d1569ca879f98450a920a2b427ab0e1d21342308fb6b4ea5031ee6e718217183", + "address": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "38.000000", + "hours": 480, + "calculated_hours": 23808 + }, + { + "hash": "cbe8b620c1468dbb1e69e6da63831bde5828db313879a36f783a1f16f2b86541", + "time": 1429364282, + "block_seq": 119, + "src_tx": "4d080ff1f8ac21d8c09a2dca99d28ae88e9441d7a4757dca68469ad64838cb55", + "address": "38cVLswijqC2ANV5HxTroeapQzqeoBR88C", + "coins": "12.000000", + "hours": 3846, + "calculated_hours": 11213 + }, + { + "hash": "3408638af298419b14a49e8e9dd69e97c9a06827d74edf9f410a870662360b31", + "time": 1429364072, + "block_seq": 118, + "src_tx": "a83e09e976b038d86491d8c029aec84a6313dc33e692da6ce50a2858e50c4666", + "address": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1045.000000", + "hours": 30769, + "calculated_hours": 672415 + }, + { + "hash": "2010952c33c83599fa14bfa5982d59865f2a362c97270dacb4c180a485ee5096", + "time": 1429351912, + "block_seq": 117, + "src_tx": "345488861ad3f0d93024c367990e64ef0f7a95bd8b8589f554172f9439808263", + "address": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", + "coins": "10000.000000", + "hours": 20965, + "calculated_hours": 6194898 + }, + { + "hash": "6c34016037cd17622846e71bc635914d4d8f256c147aa5a0b84a896e83229480", + "time": 1429349392, + "block_seq": 116, + "src_tx": "491130fc9f69d101df220116356e82e2ff21dac1167e6da81c95dd4cc417b3d9", + "address": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26400.000000", + "hours": 64785, + "calculated_hours": 16382449 + }, + { + "hash": "ab12f4eadaf956be371ff8f239956e33d1cd2fd4b497ca04c9501baf6f241618", + "time": 1429349392, + "block_seq": 116, + "src_tx": "491130fc9f69d101df220116356e82e2ff21dac1167e6da81c95dd4cc417b3d9", + "address": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", + "coins": "100.000000", + "hours": 64785, + "calculated_hours": 126594 + }, + { + "hash": "de995d2361e810cfba1b9b1141413367a722f51c7555b1685f6e68129dfb2679", + "time": 1429348712, + "block_seq": 115, + "src_tx": "bb700553c3e1a32346912ab311fa38793d929f311daeee0b167fa81c1369717e", + "address": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", + "coins": "100.000000", + "hours": 2712, + "calculated_hours": 64540 + }, + { + "hash": "5b0801ec545b132eeafa61bee8f645df7e1e358321ef830a4247fe541c211139", + "time": 1429348502, + "block_seq": 114, + "src_tx": "e8765b4e6fbca87144df59a6f66815b175e81999509504b117636edc34cbe2af", + "address": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "100.000000", + "hours": 21700, + "calculated_hours": 83534 + }, + { + "hash": "a7dc3318a975546b7662f0a867c60a4d7e9b4d1d89ab87be8c78b09ffe8852ff", + "time": 1429326351, + "block_seq": 110, + "src_tx": "552a4b194478325ee9f3e4a8648d94bc8eb26432be6fecc881bf71ff9ca15356", + "address": "aPF9pL9sVEiyEVhynp3s1dmqLetP1BJrW6", + "coins": "100.000000", + "hours": 17848, + "calculated_hours": 80297 + }, + { + "hash": "4ca22a0fa2acbd0c9e90c4ae83496d05e122deb1a17c670e9c785479d115e824", + "time": 1429302756, + "block_seq": 109, + "src_tx": "a4c15ae4743246709ec335d33c289576c8893e71f5c3dcee1db6e43eec9242ee", + "address": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", + "coins": "3000.000000", + "hours": 7092, + "calculated_hours": 1900235 + }, + { + "hash": "9404837ee44bc6aaa8c1ad963c8fa7a050e497f89f941fdc7248930ed4e0d5a6", + "time": 1429280756, + "block_seq": 108, + "src_tx": "a8d6420d4f64fad1b698bd77cae5a92aa125f806fb184389edcc278e5cb460fa", + "address": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "100.000000", + "hours": 3457, + "calculated_hours": 67172 + }, + { + "hash": "ec4b791f2fa22a986d6035e34f5025c3da0398cb2acc59a54d495d4eaacdee8a", + "time": 1429280596, + "block_seq": 107, + "src_tx": "6546dfbe6e61e81f3e9f6c9afdfee1c07758f2e486d731ae4d19b40602367656", + "address": "2acnXsnJ2k8jxiUahtBe8h4xouPAnpbwwjc", + "coins": "100.000000", + "hours": 17411, + "calculated_hours": 81131 + }, + { + "hash": "3bfbe4e80894862d60a053ffb47b8f1749e281603cd6376c8fc6b5e2cec0c843", + "time": 1429279796, + "block_seq": 106, + "src_tx": "8de17dff34a8798f2ac89584f5c559e3bb82c280a3f6890386b4dbc5fef0e8cf", + "address": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "100.000000", + "hours": 139293, + "calculated_hours": 203035 + }, + { + "hash": "8f4435cc1cb45453f1ee8e836a74bdec313a6d3aa1879be24e2ba261d474bf36", + "time": 1429278556, + "block_seq": 105, + "src_tx": "41ec724bd40c852096379d1ae57d3f27606877fa95ac9c082fbf63900e6c5cb5", + "address": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", + "coins": "100.000000", + "hours": 1861, + "calculated_hours": 65638 + }, + { + "hash": "52088c63431b6109537bce1e582775f319c9833990c94cc2e8e0dbb8b48b9c27", + "time": 1429278406, + "block_seq": 104, + "src_tx": "44d56cfa9f83d874ee10fb32f0d40458f6bf3e86528592c9a9abf3c960fcb278", + "address": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", + "coins": "100.000000", + "hours": 13730, + "calculated_hours": 77511 + }, + { + "hash": "435c7095e2531b88feb76f32fc34fac3406882cdf71e17fecdba196aa5bc059a", + "time": 1429278106, + "block_seq": 103, + "src_tx": "9150311508851ca989efb5f82b5a7201724514b6b9f84ec1620c18673462126b", + "address": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "100.000000", + "hours": 12679, + "calculated_hours": 76468 + }, + { + "hash": "1f9fb89f5b7c41d3df6d72b1f02c998196bc79ec20c3949693b4f5a2c1aae44f", + "time": 1429165260, + "block_seq": 97, + "src_tx": "a689a3589730a351f880176b2c15b395967b38a90950e0491e7a1e5531f020a9", + "address": "2H7mA88ireMKHqP9LYWK5opnU176v7eYqrn", + "coins": "1000.000000", + "hours": 54, + "calculated_hours": 669295 + }, + { + "hash": "63768bd1402317f7d3f0a38c9897e609bb72b7d334e54bd4c609292487264c22", + "time": 1429164900, + "block_seq": 96, + "src_tx": "0301358c2db5314ca43c442bac3c1daf31f4b39f9ac9e22dc157687212cab703", + "address": "22Piwuzo8ZfoXfpMghhbzGz3ptmTeiDhLbg", + "coins": "1000.000000", + "hours": 220, + "calculated_hours": 669561 + }, + { + "hash": "f9653d496ee2e6499a68a1172e5d60b60758b1edcd02d95a3388b29e113a9041", + "time": 1429164880, + "block_seq": 95, + "src_tx": "c93f8bb30e75ffbc0075a4baf57a0f536e4a9123395b13ce67af5cd2dd0f8cd4", + "address": "2U1B6EE5ZCXWJJSyEndouuCk434xpvYqYDF", + "coins": "1000.000000", + "hours": 294, + "calculated_hours": 669640 + }, + { + "hash": "24c4cfc628a0f77ce2e878c6ffa9d4dbd85325f8a5e0b5df970a3a2c36033519", + "time": 1429164870, + "block_seq": 94, + "src_tx": "0f4958d590ed4ac9aca79d848731b358b1c01fab9717775cf6515f2bf2706dc8", + "address": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "1000.000000", + "hours": 1829, + "calculated_hours": 671178 + }, + { + "hash": "4a5c1b09ef2216ba2fdae735ec8c6ad404bb61bfbeb7407dee9d6e3578762ffb", + "time": 1429164860, + "block_seq": 93, + "src_tx": "e2d9da9342b21659da0a679536f9d6f533a4ce7dc33a7f768c3441ca3640458d", + "address": "2LZzgdFYNhsBBSLATkV6PA1zk6DvWNghP2", + "coins": "1000.000000", + "hours": 129, + "calculated_hours": 669481 + }, + { + "hash": "3109e04b5baef2423f4d6d2d639464286c24ef9defa612d3b598802d761b670a", + "time": 1429164850, + "block_seq": 92, + "src_tx": "54e65c445d0af9dda82085ca4bfe0f326ae54ea2a03bd37e07f81d937de97777", + "address": "ZWhZtjwXMS46cpDxfRwQyxxKPhqwsQu8oN", + "coins": "1000.000000", + "hours": 1529, + "calculated_hours": 670884 + }, + { + "hash": "535987a7896501a8a69c1904c0bf98e2ef1fc493bf998c78ee420ef154868731", + "time": 1429164830, + "block_seq": 91, + "src_tx": "98baeb9799902593d0f61ee22947089a798c6adafd05dc6a5ea918d982a19857", + "address": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "1000.000000", + "hours": 2089, + "calculated_hours": 671449 + }, + { + "hash": "63154895637eb000146996ffaeb7cc1a547e409d0a2038650e990e7cc9b36826", + "time": 1429164800, + "block_seq": 89, + "src_tx": "a0956843d442bd4b592d0c1323d153c3c1b2d7d52a86629444de6d1d1b6a4c33", + "address": "XnKU1htBL5wFSMX8oytZBsBMeaBSbVNivT", + "coins": "1000.000000", + "hours": 635, + "calculated_hours": 670003 + }, + { + "hash": "f713b6bde2e1956615b23021d20aeb829611d231e2e85b8204c01e5719ac8639", + "time": 1429164790, + "block_seq": 88, + "src_tx": "efc98a4f94ffda2f1d6575048d75728f228a0bef0467c331f085a0f41f97ae45", + "address": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "1000.000000", + "hours": 11912, + "calculated_hours": 681283 + }, + { + "hash": "f98e302e74d8972254b1cdc4de3ca78ff1e60f3f1b7083af397f3bcb219e9454", + "time": 1429164730, + "block_seq": 87, + "src_tx": "cf5a1fad27f8f874f67d3162ae6347154c980ebd97c668d610280418f0f53ce7", + "address": "FtdApqw416skWtXM7ExanZWFmiHNPZ1Ft6", + "coins": "1000.000000", + "hours": 16162, + "calculated_hours": 685550 + }, + { + "hash": "ee69cfd4f15d16ded96745a35ef150f679b5b79cc0fd4009a2d02cdccd81ca3e", + "time": 1429164720, + "block_seq": 86, + "src_tx": "ca51f9d0a19bf326d6dd39a1e4dd240adaaae279411093d4a5b20f54cddabb95", + "address": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", + "coins": "1000.000000", + "hours": 2525, + "calculated_hours": 671916 + }, + { + "hash": "a733e89023ccc12587d0849f9baeda0d2fad640c1cbe97e24ffc531859fd83fd", + "time": 1429164480, + "block_seq": 83, + "src_tx": "d80d49958166fd7b35cee63cfc4a4fdd434484f9bfd9444f62a1b856da36e9c7", + "address": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "1000.000000", + "hours": 27495, + "calculated_hours": 696952 + }, + { + "hash": "9bfa6dd7ff610b2e8ba036594244e70d427398eab8607d39be0e45303d45d4d8", + "time": 1429164460, + "block_seq": 82, + "src_tx": "0ad2691de38a15ec31b0fbe9a0c1175138c9d7b7558db2f016a23619f3dbbc6d", + "address": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "1000.000000", + "hours": 93050, + "calculated_hours": 762513 + }, + { + "hash": "e16c0ebbfba61c49b0e98bf8336bc4d8a33ca30386c4d875bba2ec4bf4a59147", + "time": 1429148000, + "block_seq": 80, + "src_tx": "5db4378f5abcbb48774fc3731a164fb7bbdccf410c3ff829c5706e4d9ef1b1c6", + "address": "22WGCstVJGVyqnBuvGHt17L5aNNMpURvckd", + "coins": "1000.000000", + "hours": 8543, + "calculated_hours": 682578 + }, + { + "hash": "2a886bcedf8862c351cc4087b89e902202b08b164363567a9be47908e938f280", + "time": 1429147950, + "block_seq": 79, + "src_tx": "2558a7cd524acdb58f822a56bd51e8905182b2b35fbfdb1246ce6dc9930d14eb", + "address": "pMub1Pz3SLVaSwHoomgp5oDVxdkVxLkW6L", + "coins": "1000.000000", + "hours": 77792, + "calculated_hours": 751841 + }, + { + "hash": "ce4ca78d810564568c936554d0b6c1a50d91b273648314ffa3fcc1b2d72ac334", + "time": 1429147900, + "block_seq": 78, + "src_tx": "c1fb9372439d7f43d17809afc2d1bc9b2aa81fa9fccc1d837c79e649ec4843db", + "address": "sV8sVBgs11uHQtZK5MPbYem2iJ6Hehghv7", + "coins": "1000.000000", + "hours": 67976, + "calculated_hours": 742039 + }, + { + "hash": "08723ed501e11c2053bab6b500f820dd7ae2aeb4a3c9d5109845bb46afebde97", + "time": 1429147880, + "block_seq": 77, + "src_tx": "29798149e90f6442489bcc3294f455441a5a401e81491ed06bdc2c850756f0d9", + "address": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 976817, + "calculated_hours": 1650885 + }, + { + "hash": "50386f195b367f8261e66e3fdfbc942fbacfe25e117e554ca1c1caf899345476", + "time": 1429110544, + "block_seq": 76, + "src_tx": "5369348d67b2dd30dd9164657e372304f81ea10dfe1914ba874d46cd659f52c5", + "address": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "25045.000000", + "hours": 72043, + "calculated_hours": 17213842 + }, + { + "hash": "9c3119ad3edbd17a2135cac6d24ef43c6d7e599710b2aab4e97e731e64c13acb", + "time": 1429110544, + "block_seq": 76, + "src_tx": "5369348d67b2dd30dd9164657e372304f81ea10dfe1914ba874d46cd659f52c5", + "address": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "5.000000", + "hours": 72043, + "calculated_hours": 75465 + }, + { + "hash": "ead07056919be961a9e812a7832356d806d551096284648756b3642a3d4a5570", + "time": 1429096344, + "block_seq": 75, + "src_tx": "3122b6b29ac470bfa18fbd1ef6d5ff76717e18ba25374215a5003557b4524f22", + "address": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "45.000000", + "hours": 909, + "calculated_hours": 31886 + }, + { + "hash": "ec41341d4c9d69e150079550a9051c4cb7cc3e2da49deb2c0faaa632cb1958f8", + "time": 1429096344, + "block_seq": 75, + "src_tx": "3122b6b29ac470bfa18fbd1ef6d5ff76717e18ba25374215a5003557b4524f22", + "address": "j6pa8kdKqHbxRm2VXJVbzigQDFzqTVfvfq", + "coins": "5.000000", + "hours": 909, + "calculated_hours": 4350 + }, + { + "hash": "5f75082377566cf140c8f158e160ab6ecd1cdf02224c66865106fa1a75b39dc2", + "time": 1429091944, + "block_seq": 74, + "src_tx": "edca397ceedb5fb4462b0aff8fe7f9da5091a4e68f11a34c79daf2c5ae7dd748", + "address": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "955.000000", + "hours": 7273, + "calculated_hours": 665847 + }, + { + "hash": "3c56fa9d161783d6fe5c8b055c6d20bae27097e7bcc44d9ece5c94df182ee5bf", + "time": 1429077914, + "block_seq": 68, + "src_tx": "d803ab903f68f7861cd8eff93b3c097c5b8f6a697ca67bb01e7e645060839fd0", + "address": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 181, + "calculated_hours": 693684 + }, + { + "hash": "8bdd2662d7ed495ff82daef9198ee23ac0c75417607675a8da3dd673952c0e39", + "time": 1429077874, + "block_seq": 67, + "src_tx": "42227683dd9c149859d0578ab300d8509d513afadf7834fd8ae7a321cc07d833", + "address": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "1000.000000", + "hours": 1452, + "calculated_hours": 694967 + }, + { + "hash": "47c74a6d7f1f54cf0a7ac45ec00277539079810068dd95a29a202c43780d65a0", + "time": 1429077694, + "block_seq": 64, + "src_tx": "29c229c97d27bcaf842a367520e1916fb855921906bddf4a3b0413ad3f11517b", + "address": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "1000.000000", + "hours": 1170, + "calculated_hours": 694735 + }, + { + "hash": "9011fbc6e82dce0656e7ffc76afb014d2ad70aa4663e7b687d3212e12f8965e2", + "time": 1429077684, + "block_seq": 63, + "src_tx": "8d10b0ba11d9dd63d3a3522bc35bd260e8da9109298aa488355ea7201eb961b7", + "address": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", + "coins": "1000.000000", + "hours": 211, + "calculated_hours": 693778 + }, + { + "hash": "b9853ab091bdb295de20d765e9bce2d86870791a6a15b8ef9e9dddb71c4cba95", + "time": 1429077664, + "block_seq": 62, + "src_tx": "057ae2bee6e1fc2c9997d48aab3e348a7f17ad0305d6e6a14f4f663404b4a00a", + "address": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 13, + "calculated_hours": 693586 + }, + { + "hash": "2480aeed2dc47c692e4bce61fb3ee44c4992ea39b0a167235e501330d7ddac62", + "time": 1429077654, + "block_seq": 61, + "src_tx": "4aeafd20b9df56ec852a2c257ff1630b9530d8375a4e72f20238ea36835f76d5", + "address": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 1519, + "calculated_hours": 695095 + }, + { + "hash": "53d7b4778ee9b9537c0439666ca124d81bcaf4195d080ef61fade8c3eae6322e", + "time": 1429077614, + "block_seq": 59, + "src_tx": "4ce860140dbb5f90f39086b0c51323005145a95b365204bd33e3d90fbdc35f51", + "address": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 132, + "calculated_hours": 693719 + }, + { + "hash": "d58f3facfb4c9c9459e6fae3000886acb2b1f81322725cdc32cc09a49bb81e43", + "time": 1429077604, + "block_seq": 58, + "src_tx": "5d1cb86b48c8834c8c12fc36a83259609300f2f6a148faa1492a473cee21bc02", + "address": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 36, + "calculated_hours": 693626 + }, + { + "hash": "3b9059ec909faf64d652dae78944f4a2737df95a3215bf98e2ff33e02e2b377f", + "time": 1429077584, + "block_seq": 57, + "src_tx": "61a33b49e97bfe2d5f026bf45fae43a1b9bdf08c60ec8db017da720a69790c7f", + "address": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 1681, + "calculated_hours": 695276 + }, + { + "hash": "9e53268a18f8d32a44b4fb183033b49bebfe9d0da3bf3ef2ad1d560500aa54c6", + "time": 1429077554, + "block_seq": 56, + "src_tx": "8fba29db2e3e8cad785e723f95aa5fa46ae0dd8b2bb62586977f20e698642cfb", + "address": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 12696, + "calculated_hours": 706299 + }, + { + "hash": "2f1de81eaa83eda52d8eaf44b12599b23134a38b7d55f67de8881ddafbec278b", + "time": 1429077544, + "block_seq": 55, + "src_tx": "374f01de8274656147be0a23ccc5677773da6f32b071ee796bda0851b6dcd2ac", + "address": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1000.000000", + "hours": 930, + "calculated_hours": 694536 + }, + { + "hash": "470b293870b663b84e1f677e1bc0e486d0b5f412b0562b078a7a1045f7785d7a", + "time": 1429077524, + "block_seq": 54, + "src_tx": "88d239f2584c78b73a1905fd0dcce3beabfdfc5a9c54518862b009e22e972c68", + "address": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 192, + "calculated_hours": 693804 + }, + { + "hash": "cec910b5d672e216db306389dc9ebb08f9d37485fbc3ac6aa7a8c37f60be844c", + "time": 1429077494, + "block_seq": 52, + "src_tx": "231254039042675300dbdd61a6ca54941214e383b5f6380323f848482b4f4628", + "address": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 1499, + "calculated_hours": 695119 + }, + { + "hash": "2f4daff744e7fd81ceea34ecfb0e383a65ecda1c55f32a0bef313d29b0795eab", + "time": 1429077484, + "block_seq": 51, + "src_tx": "814694a8e32f1c81b627f8eb704622c8893d197bf32bbd7e1bf73bec9a831d7d", + "address": "2acnXsnJ2k8jxiUahtBe8h4xouPAnpbwwjc", + "coins": "1000.000000", + "hours": 7343, + "calculated_hours": 700966 + }, + { + "hash": "5afa88b6a9ef9168d15d9a0bbc87dd5ab30badc01773460f92703a9c829358c0", + "time": 1429077474, + "block_seq": 50, + "src_tx": "be27621ad46680b343cc1406f5c6a1717704ce169e988ed7afb586f8112ae6f0", + "address": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "1000.000000", + "hours": 11972, + "calculated_hours": 705598 + }, + { + "hash": "85fcb22c416b7d430076bb80a324734cb97483cb4544192df252b89ba8f7fd61", + "time": 1429070414, + "block_seq": 44, + "src_tx": "ced30c4ac3107997efa90faa40c8baed47dafc8ddb4feae3ba21275401c36280", + "address": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "5.000000", + "hours": 33, + "calculated_hours": 3510 + }, + { + "hash": "e64fa1f60e905f1d7b7a8f0ca134ab2b7a467f7363ec9c03628d559e1230eb68", + "time": 1429070374, + "block_seq": 43, + "src_tx": "d368fc3112b522c52a5b191981ca52678cc7db29bdc3493cf551be88d109ef9c", + "address": "2apVG7f24ezDK13yCDTqBWYrTZpuj94KnCN", + "coins": "5.000000", + "hours": 265, + "calculated_hours": 3742 + }, + { + "hash": "3e475e76c226a70c87d030d8fc6b8b1c2cc654ba9eaf3bed08be5bd603aec0b7", + "time": 1429011137, + "block_seq": 27, + "src_tx": "cff53a059d55f2c90f6dd7ce7de2cc07cbdbd50b25867cba0f41cd0192614d0d", + "address": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", + "coins": "90.000000", + "hours": 70992, + "calculated_hours": 135076 + }, + { + "hash": "339aeec109a26bab65e618d73ebba16e5b8fc18f7dc1fe502ca891ad5b0f4d5f", + "time": 1429011077, + "block_seq": 26, + "src_tx": "56e7bd13dc4c6e1cd80aba66a0a9fed650d0646659ac774e3f1b415848755d85", + "address": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", + "coins": "10.000000", + "hours": 567938, + "calculated_hours": 575058 + }, + { + "hash": "ebedac42a639f0d0a196b47676cb757b95046f0403f74baa5b15e98753ee2d58", + "time": 1428991665, + "block_seq": 25, + "src_tx": "917510897f5d8a018ad8d447876a15e2e1f68d42e71b6f75d89b02c4a599c537", + "address": "2bvEzLx4mgyQkYL5bkSc2rD9V1nqWBqn8vp", + "coins": "2.000000", + "hours": 0, + "calculated_hours": 1434 + }, + { + "hash": "f910d0e633735df5f041fdb7ffcb9cc8988b71c9375c52ababb54238be4d6852", + "time": 1428991665, + "block_seq": 25, + "src_tx": "917510897f5d8a018ad8d447876a15e2e1f68d42e71b6f75d89b02c4a599c537", + "address": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "1.000000", + "hours": 0, + "calculated_hours": 717 + }, + { + "hash": "fbe00b341f3e798c3e7e5eea04ffd8f3e70f0e78bc38f9a4927bae7eed6a1411", + "time": 1428991635, + "block_seq": 24, + "src_tx": "f935cd91736604989c08448a2d83d6b044c3198ac1a7483a3b9846f8848a7d84", + "address": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "2.000000", + "hours": 0, + "calculated_hours": 1434 + }, + { + "hash": "e55a8d2ebe0f48f17a175fdd67d47deb5015b2ee8e91de16b2b121c8ad830e40", + "time": 1428990135, + "block_seq": 20, + "src_tx": "22766105d0f93d01fed7bed2dcabedfd89fe846621c912b0af845d8ba5d265f8", + "address": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "5.000000", + "hours": 0, + "calculated_hours": 3589 + }, + { + "hash": "b56517b7803a4b2cca522e1cca5f75894db174c97d0e127826f5414544eccb72", + "time": 1428990115, + "block_seq": 19, + "src_tx": "c6eccf17b4b952f19548b1924126c9dc409b45f9e6fcc0954a3494e7399f5fd4", + "address": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "5.000000", + "hours": 0, + "calculated_hours": 3589 + }, + { + "hash": "0b720d05d44354ff0c6c75d55f1cd4e5945bc2ca80f2ba840545205362202925", + "time": 1428820629, + "block_seq": 16, + "src_tx": "e96e157b685c28847d6758e2ba326ad59cf2661c926fb08000d4b40d78a9eee3", + "address": "ZWhZtjwXMS46cpDxfRwQyxxKPhqwsQu8oN", + "coins": "2.000000", + "hours": 0, + "calculated_hours": 1529 + }, + { + "hash": "e72d8ba4ce2d3b37aeb71df2e3bed80ee07204b3fa633f56cbce7bca836bd39c", + "time": 1428820629, + "block_seq": 16, + "src_tx": "e96e157b685c28847d6758e2ba326ad59cf2661c926fb08000d4b40d78a9eee3", + "address": "PRXLNyB64cqaiG4pCoFZZ8Tuv7LWYPpa7m", + "coins": "3.000000", + "hours": 0, + "calculated_hours": 2294 + }, + { + "hash": "9e8997e53d2e61955da71dbbc6ba5b0da799eaace0f45870a4e42276a6fdaefa", + "time": 1428807711, + "block_seq": 9, + "src_tx": "9d87d7bb9e56a3588bacb478c7556280b28c0a49f6e09db8b54a84c20d865f2f", + "address": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "5.000000", + "hours": 0, + "calculated_hours": 3842 + }, + { + "hash": "1f810bdd1c65ad50f27f2c47a000150877fdba2fdb78b9d8cae39946be6a9e33", + "time": 1428807691, + "block_seq": 8, + "src_tx": "7229422f3a0afb5f3a9596ed50146440c17a3d54abda0f3c70cd9dc58de96374", + "address": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "5.000000", + "hours": 0, + "calculated_hours": 3842 + }, + { + "hash": "f9e7a412cdff80e95ddbe1d76fcc73f967cb99d383b0659e1355c8e623f02b62", + "time": 1428807671, + "block_seq": 7, + "src_tx": "f832428481690fa918d6d29946e191f2c8c89b2388a906e0c53dceee6070a24b", + "address": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "5.000000", + "hours": 0, + "calculated_hours": 3842 + }, + { + "hash": "01048ad6a538256d9a8c6c9c6321ca1a01b31cbf08e74fd4ff0f141bf97eb8ce", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "044dc539d063250dc654b2bf0986a9044b4eea05e1284c11a2b313acd8dc3498", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "07f70fd4108ef4d2fde3b85411728c1f7bd3a135d2062c5a30a46cc885463780", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "0b95850edabed70762768ac1695c5d7f230cccaa8de06657cda42cafba36374f", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "0c238e82f3a4beee1be7b5b464e8553404f6927d5ab93c3d649d362c01097782", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "0c956289db079c00d2f80c590d3c8ca26c37da534fe5f65e799b3982ceca493c", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "0cff53628eb0e984c134b68cbe4b1bb7721a05adaa32e93b9df489a9a7a176cf", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "12034bc455d0821813d7eb9afed1ed1a8f19b6f29826ef4a057b4aa0b4228817", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "131f07f5b40f365fb537b863e4aa5ef0efcd77b7fa2ff321d90eeb743ac43678", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "135c28698e80e3b2a737d59c16c79684c3fb3ec5cec59f466a39f4ac3c73968e", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "13afe1586015c4d7312f89d123153279e4961eb0d53a4d036847d5d989ba90dc", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "1550a76598693b950346397e0e825bbb2805edde38b0d0240e50050829b7b1dd", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "178a33e64826cd2039b8538b74e6de513966acab45ab79d77dc9392018a65ffb", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "18a43b8b69bbf12a9e49e6f9783ba258397e6567301aeed9e901a1e4fed9fef9", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "1941e5cc5e38dd92427580af699b1f410be7b29ff17d3d0ff3d046bfba0aaabf", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "239bdba27dabd52f7450f7d8521c9a7e5ac74093ae3f6f2348bf40ac9a6db7a5", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "246377a036ad5444bcd5f47ac9e55fec7c85fc40644df593038d360554a809f7", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "26f585cb96f35307f0af5b9aee004a29b7795695f4c5c836104e2fbbf429a3ce", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "2a4d631d5dc90e397d85f13410d1a6d877dcaf592a0e2be2e727443ac74b5bd5", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "2c0e3aa084f5fec45f99b3f125ce7d50c6da526ef5165df5f22ba603147c3fc2", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "368a609ee90ca15bbbd297af07dc6705131764476d54bef641017ffcd0885e65", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "38f22b194f04d85a6b545b37df06195edeb8503798b229ddeaa946018150c05c", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "390bc4c045fa9f289957b7eca529bfadac96a7dd074bcfbdd3b09e99413b8202", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "3ca365aace71e24b04d6f2ffbf7171468c5e71783858c710cae539c5e43e0c0e", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "401d4c0c1060ebbb4b9fb3859c2eb47789f94086f4deb01234bf46f7cdc81247", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "439cdfd03972fb4bb5da54208cf8098ee78228c487ce9e84623f5f83e17a7d68", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "445a4082da251fa161e4705d115fe2018ca15a5f92e8a0950793405410e6be12", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "44e17f4bd29411a1614457171c06183e364bf6ff80a201717b2dfc0748e9ebe3", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "4628f4cfdbf1eb7cccc25d461c46cc29e90cffb5d6277e0de641f7701d60c308", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "466340ab7733abb23ab24d877c673fe089c273f11808fbbd6f33a91da92ee96c", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "47e4706dc4d80a70b20c889476fb0627ca6d5bdaa790f4ceba44a689d31b2dcc", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "4ba91512c168281f41d3934b927d0d86a3136a31cc345b635095928f8e5f013c", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "4f30eae8c49eb268fe364eaf5ee0788da6e2f6adc2f83cd82e96a4bfe98496f5", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "5010eb25f6e1ed725fb901ae1e945e545ae846d7be8a135333d2d41102c33328", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "550d2a8d3047cdae0c05a61cc3de43e758b123a6955fa067d3ac375f7d0dbadc", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "5a69ef09b5de21b117cac62141a8de4eade7558c42f0ba8b50996f5ec7867c5d", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "618d242d95d33e2d7316612a164d89859b85f1287f0d5bed4dcb561cf478f706", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "6384ed19650d384c29db4c3a39a1ca855058fab758075be2dee759dd9e6faae1", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "66e685901492c94942522c346759c711ee2e78a059ef274e77a6ab433409683c", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "693c7f970b34ce5882e62430f4c9c28957159a257d27d4e21a61fd95c6b97464", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "6a24135f8496e7a37dcf7164218bb3aa530319f3b2bf3c7a1a9cc1bd17831328", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "6aa162f7fc09598c4dc8f5fab7fb2383f28c3840937a001acd9f37136e1691b2", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "6b3530bb930ed10bbc4c307663aba4377c08443498a0a2cf023b1be72f378ae1", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "6d37c0c4b6fcbac1e53a46c9c2dc5d3c3b36312c53f25b2baacc785ea77a11f7", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "73304622e33994bc2d4ade2cab78d28e1b65185e60ad3c781ecfb5cbc8159136", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "745eaff456a390c3868742a039e72c2a93ff8eee10417dbe848d533b89facc04", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "78740d5bf49989936d315bf641949232aace582e03de57db8abff940f7d51bd1", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "78b07e8fe1366e173f2eeb75c35cd53baf0f6100de50ae12b4ffe7d0d7ba4298", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "7b8787fd4076c27d074d2a4761377a1aa26c843c432e3b7e6b0ebf1e29528188", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "7c767d3a06db1ac0e1809ebe29a7d9689143259f4651837de54423e287c20490", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "8753d5775c22477a8ef74eeebf61d7de30be702e70118f552cc18ad963ffe950", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "883be4d7173c235933294ab8dcae8cc76609166eaa1c1f07e9b51d551c979709", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "8b379d1b8ff0153c63ee69c40a7155b97fa42ab570f68ff847d457316c4d8ab9", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "8b53c7188ebf4d630790ff63275679ba48009e31af6e4fe15806619216caa750", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "8cd999cd193d315e5f1c6f74c230c12e6abe6847924f6e89d988e09ca413f52e", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "8d55f76bb0b3dd222cf85a7193501c0f4071b446f56dbd1da355b1625993325a", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "98e223e6e2240fef83082d3daa86e46f10e0c71f3f74489ba95db0951a166f53", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "9ba5e31610f0545666f102465efa8caa48ad3fb5b8abd5ae802f4a71e3f7de3b", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "9f2c83c5165826de1077f428ad39d41473e32ed64cd83180d49e7d8e5db996d0", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "9fd5ea38f383291566def44b6fb932414f97123952578fe0cfb9a30eb075a099", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "a5ef046e84be9ff2485dde49afe6073811286761afac3bbd588b6e4130930479", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "aef761a12e3d0fa9c4a8db62b8bab1015c32931b7e3a7fc9a77282cec218f79d", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "af9bcf6ba63a08e699bc101aa362f135343aaf78a56e9f88d118fca0e1ce5c08", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "b2da50a08756c34d059a04812451cf3296f73ba87f8cca38473ac8f051ab6d1e", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "b497992663f99f9902deaaf487b00655820003015ea92091628f4a6e8aeb5854", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "b4c6639b49402c2753f83c7fb7d3ffa65da74e47fef2b781933ff55b14d09bcd", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "b64bc50d370a06df117eb543ca051239c985cfc4b6aa527c51b700de32c7fc41", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "bc40377012004566712fa860e74db97305091cc163e95435e04556c70d32f9c5", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "bc5f1f1ddc8cb23df3d42f1e5a1dda9d356846fe930ae4484bc1eeb1b3b2c95b", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "be5930e9cc35801433bcd21db84da7d4f1d8e744feca16a2c6fb00c81ce93e51", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "c008a613cef129c180dbcc7213f2d41a14d245d06a3844d63d9beac963145385", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "c416f5e604eeada9ae8e520a429d8f19d4230626769e7121007e01353730784f", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "c6d5e543ff5f2c2526728d588fb21753db5b7e05b8b275aa5e9b24d29350afb0", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "c858f2db2a20ac562d32f8fb2a3a11039849a6e44d2bec30befb2e173532a9a3", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "c8971ca91f8e21c556f647940073db003f7dd5582ae55d4ebca602d5e8e91a6e", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "cc84f93adce16699d9e84ef32f55333402431b58dc50c17084bcb8b33f382f88", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "cd6c4b785e60757fad0e6fd4874b729ea7703fe7ee9560e1283d2eb71fc75321", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "cdee5f84c4f08098ac740e3a260ced14c1e199e126aa5291ec079b281a7dc407", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "d2e724d83e35235c23c0bb16ae9b708a5bba3c23b186b05d4b8c606f6bb4b311", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "d2f3f050c9ef31bf5c3b14c1c71699c4f4b38aa18479531194d12e6277416516", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "d60879e562b65f97d40bec7309d4490ba0a8c80e2349ecb2e3505aaa50ea1e47", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "dad4991bfa5c51eb176f28c1b3f86661e02579905e6e07c997df22004e06244a", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "df63056cf3ae21efa86d241876ad0194387317585dc9e4fcd80954b47d59b57a", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "dfa7822c05f54116c9fc3b2cde1ecb4667f47a2d8771fe886e832c223cdc4e82", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "e440cf4c896735d3299a871f988c134f404fb2065d1f20c87c9c9bc5fa582e09", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "e936299a21240744f6edbab493449323f920bbe15dcf294463e5a2ace10f27b0", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "eea791e84a53e4d99485519c5d2c3146b0a2ad080cf92904ae7b28c2d9a6e3ca", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "efa2007c561dcbf7c83a6bbdd2ef75e7cca76b05330a8b948ba0dd94dee949f7", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "efde499c7e4444bc602b7bf5ed50e95a18ce8ec9a06ba9d850a05bb7a25ecb3a", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "f03087245a6b64bb69cd5866a1887ae595a9e1a86e196754984840eaf6d3eb9c", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "f38f0760769c19075034f70b059abf4d1bfa6d01e1e8c369a99900ed1eaeca6d", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "f625cf04412199c16e073dbb500e66c23cfe69043578b4a2d879a329aac563ec", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "fc444cdb2598f44209a41ea20afdc9065ebe51b7cd5f65bb1c0f7a7b427ce7b1", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "fd6da5199e528958e68ee8dd003b727d4d840754ea7c1e0c05e4f0e504c9b2cd", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "fed15e8506d0e0898510311850b8863ef6d9a499215ae8823a1e3fb9c8140ab2", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "ff6c0f27fcf92f3b4a3871b801c3116847fe47a7e3bafcadd4855d06012091ad", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "ffbdfdbf3427d04f445c33e867845bec1ee64a9dfe0d0fa8284547c2226fdfa9", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + } + ], + "outgoing_outputs": [], + "incoming_outputs": [] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/no-unconfirmed-txns.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/no-unconfirmed-txns.golden new file mode 100644 index 00000000..fe51488c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/no-unconfirmed-txns.golden @@ -0,0 +1 @@ +[] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/outputs-addrs.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/outputs-addrs.golden new file mode 100644 index 00000000..cbca9952 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/outputs-addrs.golden @@ -0,0 +1,77 @@ +{ + "head": { + "seq": 180, + "block_hash": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "previous_block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "timestamp": 1431574528, + "fee": 2265261, + "version": 0, + "tx_body_hash": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "ux_hash": "058d1d0a22be7b9f5567a236866836a87d922760581832cfb8bfbd8b337d64b1" + }, + "head_outputs": [ + { + "hash": "75692aeff988ce0da734c474dbef3a1ce19a5a6823bbcd36acb856c83262261e", + "time": 1431574528, + "block_seq": 180, + "src_tx": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "address": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "hours": 377543, + "calculated_hours": 377543 + }, + { + "hash": "be081639ea8da63d8542707e9ea9625f6afc97da132f43ed061645c359bb1e65", + "time": 1430836422, + "block_seq": 170, + "src_tx": "95d847102c01d071982e67b8e7dfae50715b0fc0179d33f4b050974e634905e1", + "address": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10.000000", + "hours": 8, + "calculated_hours": 2058 + }, + { + "hash": "639e69c4a223b5082b9274caf3e56ecff2ab55cd90cac94fdb4c383a1013ba1f", + "time": 1430836392, + "block_seq": 169, + "src_tx": "acfb61f7ca39d5dfe33e8ed66f73ab181da0a3206d457bf055dcc4b9731a3ec8", + "address": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "990.000000", + "hours": 70, + "calculated_hours": 203057 + }, + { + "hash": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + } + ], + "outgoing_outputs": [], + "incoming_outputs": [ + { + "hash": "32a060b2e2025cceb40f3f982c887952d3358d468db1719dd892eab575c14c14", + "time": 1431574528, + "block_seq": 180, + "src_tx": "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947", + "address": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10000.000000", + "hours": 5716263, + "calculated_hours": 5716263 + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/outputs-hashes.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/outputs-hashes.golden new file mode 100644 index 00000000..1f80cb92 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/outputs-hashes.golden @@ -0,0 +1,67 @@ +{ + "head": { + "seq": 180, + "block_hash": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "previous_block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "timestamp": 1431574528, + "fee": 2265261, + "version": 0, + "tx_body_hash": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "ux_hash": "058d1d0a22be7b9f5567a236866836a87d922760581832cfb8bfbd8b337d64b1" + }, + "head_outputs": [ + { + "hash": "01f9c1d6c83dbc1c993357436cdf7f214acd0bfa107ff7f1466d1b18ec03563e", + "time": 1431339429, + "block_seq": 179, + "src_tx": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "address": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "10050.000000", + "hours": 5521648, + "calculated_hours": 6177966 + }, + { + "hash": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "time": 1431339429, + "block_seq": 179, + "src_tx": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "address": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "hours": 5521648, + "calculated_hours": 45730107 + }, + { + "hash": "d91e07318227651129b715d2db448ae245b442acd08c8b4525a934f0e87efce9", + "time": 1430908702, + "block_seq": 175, + "src_tx": "9364ed6cfcc289df74dc6bac1993f7ab3441b898cb3f06918198d2476c83dbac", + "address": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "10000.000000", + "hours": 18358, + "calculated_hours": 1867874 + }, + { + "hash": "9e53268a18f8d32a44b4fb183033b49bebfe9d0da3bf3ef2ad1d560500aa54c6", + "time": 1429077554, + "block_seq": 56, + "src_tx": "8fba29db2e3e8cad785e723f95aa5fa46ae0dd8b2bb62586977f20e698642cfb", + "address": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 12696, + "calculated_hours": 706299 + } + ], + "outgoing_outputs": [ + { + "hash": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "time": 1431339429, + "block_seq": 179, + "src_tx": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "address": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "hours": 5521648, + "calculated_hours": 45730107 + } + ], + "incoming_outputs": [] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/outputs-noargs.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/outputs-noargs.golden new file mode 100644 index 00000000..3b1d0032 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/outputs-noargs.golden @@ -0,0 +1,2228 @@ +{ + "head": { + "seq": 180, + "block_hash": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "previous_block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "timestamp": 1431574528, + "fee": 2265261, + "version": 0, + "tx_body_hash": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "ux_hash": "058d1d0a22be7b9f5567a236866836a87d922760581832cfb8bfbd8b337d64b1" + }, + "head_outputs": [ + { + "hash": "75692aeff988ce0da734c474dbef3a1ce19a5a6823bbcd36acb856c83262261e", + "time": 1431574528, + "block_seq": 180, + "src_tx": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "address": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "hours": 377543, + "calculated_hours": 377543 + }, + { + "hash": "a4b70476ea1e079ebd3503b52eee32d490515457fce6a5aa075770b598a9d14f", + "time": 1431574528, + "block_seq": 180, + "src_tx": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "address": "CDD8GoJUHEvBm1pD3BQ3hEC2KcJNhvUzpu", + "coins": "1000.000000", + "hours": 377543, + "calculated_hours": 377543 + }, + { + "hash": "01f9c1d6c83dbc1c993357436cdf7f214acd0bfa107ff7f1466d1b18ec03563e", + "time": 1431339429, + "block_seq": 179, + "src_tx": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "address": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "10050.000000", + "hours": 5521648, + "calculated_hours": 6177966 + }, + { + "hash": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "time": 1431339429, + "block_seq": 179, + "src_tx": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "address": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "hours": 5521648, + "calculated_hours": 45730107 + }, + { + "hash": "ba1adbf3006a239fb7ef6efb1f9390a25951a5185dc312dd81bf88025f838456", + "time": 1431162729, + "block_seq": 178, + "src_tx": "ecd101a6af263973ab75f87a3116231e6fe84a2281d0001c9aa2d7195545e78e", + "address": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "5.000000", + "hours": 56499, + "calculated_hours": 57070 + }, + { + "hash": "ec439e7c7d8517824885ae1520fa5b19f991d7ade3a12209c0e87f6ad1d30229", + "time": 1431162689, + "block_seq": 177, + "src_tx": "e4850021fb706f2b7a94fec9ade3c166823dcd980dc3954437471d98fb9d2280", + "address": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "4950.000000", + "hours": 56499, + "calculated_hours": 622777 + }, + { + "hash": "f5e7796297b7201b1ea87736fadddc7b451f9ed7d4529cfe9f03082e80917628", + "time": 1431162689, + "block_seq": 177, + "src_tx": "e4850021fb706f2b7a94fec9ade3c166823dcd980dc3954437471d98fb9d2280", + "address": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "20000.000000", + "hours": 56499, + "calculated_hours": 2344493 + }, + { + "hash": "d91e07318227651129b715d2db448ae245b442acd08c8b4525a934f0e87efce9", + "time": 1430908702, + "block_seq": 175, + "src_tx": "9364ed6cfcc289df74dc6bac1993f7ab3441b898cb3f06918198d2476c83dbac", + "address": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "10000.000000", + "hours": 18358, + "calculated_hours": 1867874 + }, + { + "hash": "2d3f7890d11efedd4cee3a7ab4a5cbc56d2c8df4f02124bdad9ec839400053ba", + "time": 1430871622, + "block_seq": 174, + "src_tx": "ad44a8027a825e82a20cdd910d9bd41d74025601b7668c80655e9b45afb8bb93", + "address": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "5000.000000", + "hours": 18586, + "calculated_hours": 994844 + }, + { + "hash": "793f3f0e41c9d1de391d864792b79ed8c24dde5ff84a73c161d660a73ed70c90", + "time": 1430871512, + "block_seq": 173, + "src_tx": "a7665cec98224150968ec1ef9ef2d6b3175c9de8f9f8c7bc786b30cc74997c57", + "address": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "12000.000000", + "hours": 127440, + "calculated_hours": 2470826 + }, + { + "hash": "be081639ea8da63d8542707e9ea9625f6afc97da132f43ed061645c359bb1e65", + "time": 1430836422, + "block_seq": 170, + "src_tx": "95d847102c01d071982e67b8e7dfae50715b0fc0179d33f4b050974e634905e1", + "address": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10.000000", + "hours": 8, + "calculated_hours": 2058 + }, + { + "hash": "639e69c4a223b5082b9274caf3e56ecff2ab55cd90cac94fdb4c383a1013ba1f", + "time": 1430836392, + "block_seq": 169, + "src_tx": "acfb61f7ca39d5dfe33e8ed66f73ab181da0a3206d457bf055dcc4b9731a3ec8", + "address": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "990.000000", + "hours": 70, + "calculated_hours": 203057 + }, + { + "hash": "a02148f770788851a35fb90567510044e37f8db930deab7a2b584af67c8efb2f", + "time": 1430792072, + "block_seq": 168, + "src_tx": "50fc81b0ba25669105a169a969459ccdb10278051b604a3f91467c2528c83652", + "address": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "1000.000000", + "hours": 4206, + "calculated_hours": 221554 + }, + { + "hash": "0b5e5259c276ac949de97062492ea6dc93ae6215c8dd1615862907e3c3ae9cf0", + "time": 1430791902, + "block_seq": 167, + "src_tx": "b29222c08f10b8bc4ea18981519a3b0e02b9c9cec63ee28d9ffa2efcaf2a8e5a", + "address": "2A2YC8kxWnUDbscpzZ6UPfNAmx5ddKBeYNs", + "coins": "100.000000", + "hours": 33652, + "calculated_hours": 55391 + }, + { + "hash": "b945bacb354173c33bc41503f50c29ad5d1d333ecab66b0c70d0ed9e6eec7f3a", + "time": 1430791622, + "block_seq": 166, + "src_tx": "41589644ea3a344fc616bec0058cf916b8efa5da7c3539241244827bd7e19811", + "address": "2kN23viEG7Kn3Utuwz9voM4Z8ohLR9Y8L2v", + "coins": "500.000000", + "hours": 494004, + "calculated_hours": 602740 + }, + { + "hash": "250543215c71a1a9ab7740fff25c3bf9695fcde10bceba3717aef9d0f6dd40d8", + "time": 1430784932, + "block_seq": 163, + "src_tx": "ec79854fade530d84099d5619864a8e1e8ec9d27a086917a239500cada43c6e8", + "address": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 219332 + }, + { + "hash": "0c19e689e0e34639c71b0136ce336121b042b6d4ac185ac1f9e94ec7535e781f", + "time": 1430784312, + "block_seq": 161, + "src_tx": "d5091ca65ff61998dfb4535a7927fb736abf2a81140a11322dcf8226de27cf92", + "address": "XnKU1htBL5wFSMX8oytZBsBMeaBSbVNivT", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 219504 + }, + { + "hash": "ea18f151bbdb611f73596b61ebb0546b9e91281ccb0bbe07a18e7fa69142bb5b", + "time": 1430784172, + "block_seq": 160, + "src_tx": "0e8e352b1f2cd419bca619918ce6d5ec1eac0ba7252d76eef5d9d8f8186f737a", + "address": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 219543 + }, + { + "hash": "c61f27a2247831679d8df293bf9351b16e8429778c875be2cb64224bcb842ed4", + "time": 1430674696, + "block_seq": 158, + "src_tx": "3d9f1aa1b6206275081cb9c26155f6261be1ef9c94b4eaadb1a7e8277a2099fa", + "address": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "25000.000000", + "hours": 0, + "calculated_hours": 6248833 + }, + { + "hash": "25130a18aca13a37e4f4c08733cdda6a8629759f27ecba775999486c9deffa5e", + "time": 1430673946, + "block_seq": 157, + "src_tx": "c3fd04cd27ea311b1a67d40cd3dbb2ea8ae2c6f6139620cb86be29f33ed99171", + "address": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "18000.000000", + "hours": 0, + "calculated_hours": 4502910 + }, + { + "hash": "a34cfb6f175323917dfda72d58ddcfb86363cc43d22a0c6c3141810f5cac5aa6", + "time": 1430644036, + "block_seq": 156, + "src_tx": "29a883ef9dc67bc683014187b9865c827b5e2f8afd7bf6f3787483318063789e", + "address": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 258470 + }, + { + "hash": "25a72cc385c1cdabd0ffd7c141ae205d767f3d016c281f835b9f58f9325bd2a5", + "time": 1430643906, + "block_seq": 155, + "src_tx": "c9582c8134fa64fdf08cd93d42035adcced3f16aa8ee1a1393e3fcd7c07aa40c", + "address": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "300.000000", + "hours": 0, + "calculated_hours": 77551 + }, + { + "hash": "dbc58940c2457359501c9906589c3d0a0ab7695b983ad79f2bcc087a675671f6", + "time": 1430643706, + "block_seq": 154, + "src_tx": "be0957035ed2ac444f67273fc5c1c6a39ee373f6f83d1604d0023742a8cd7e42", + "address": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 258561 + }, + { + "hash": "c0548bf35c950a74c206d2c565e3bcac1f2abe170ebabdb7b74e439b642dd9fd", + "time": 1430642546, + "block_seq": 152, + "src_tx": "dc10e0565a14dfecda066577581f3e2d073de34ed3e911ed94413d38fc0a33d2", + "address": "22WGCstVJGVyqnBuvGHt17L5aNNMpURvckd", + "coins": "1000.000000", + "hours": 4, + "calculated_hours": 258887 + }, + { + "hash": "efcb1b5f54bceb2d0124d2f89c47d071c2943fb228c2eee62bfddf6e1418cfc8", + "time": 1430642426, + "block_seq": 151, + "src_tx": "18607765c3fbd45eafa15d2d62ab3cbc7ba7bd80c42931aae4db75aa02898671", + "address": "pMub1Pz3SLVaSwHoomgp5oDVxdkVxLkW6L", + "coins": "1000.000000", + "hours": 35, + "calculated_hours": 258952 + }, + { + "hash": "0fa23085def7c1dbc95587d3f0f58cbc30b09e099ee1afa42d9120452777740a", + "time": 1430642306, + "block_seq": 150, + "src_tx": "3e228564e3c187e22bd489857fdb1db7036021e19f688aad56cfee57d5e13ac5", + "address": "sV8sVBgs11uHQtZK5MPbYem2iJ6Hehghv7", + "coins": "100.000000", + "hours": 280, + "calculated_hours": 26175 + }, + { + "hash": "eb57ec196fe95a09be19b62b6837d5d12f99568ad0e5e198f70f55083acd656e", + "time": 1430642106, + "block_seq": 149, + "src_tx": "b69536fbec9911da41e9d0c5ca73459f5e692ba155f8b72c0972792e9937a0fe", + "address": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 2244, + "calculated_hours": 261250 + }, + { + "hash": "5233e499bd3e38ec4d4fa4d750290f25271c91b4903630d461be51f3c2c02ebd", + "time": 1430642006, + "block_seq": 148, + "src_tx": "79681167a7681edecb998e4a6dccdd0b7be45f163c8f6db23436517936269fb8", + "address": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "1000.000000", + "hours": 17954, + "calculated_hours": 276987 + }, + { + "hash": "3ec30639c24acce65054bdb0d7ab0539199b64cabfcad83c2ed7f266fb8849a6", + "time": 1430641536, + "block_seq": 147, + "src_tx": "3fae944ef07d9bcba1bcbc8bde87da50a1232132074803f8442deb563ed2da51", + "address": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 143635, + "calculated_hours": 402799 + }, + { + "hash": "3dd82b00ef4d1e3b1c71be5f13c0c82b3e2b17af4a6b3eb4c966490f47866ccd", + "time": 1430641376, + "block_seq": 146, + "src_tx": "5701965d326520f86335da87c6d1781fd49f1e66520b94e1783711eba724f482", + "address": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 1149084, + "calculated_hours": 1408292 + }, + { + "hash": "7afab03c823346ff8b00c29df6acc05841583d90dfd451ba09e66884a48e83f7", + "time": 1430550936, + "block_seq": 145, + "src_tx": "f25c1a8a4ae37e8e2b4a0ec6f2553cf11c57fa77de9556cd227857ca270a0275", + "address": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "2000.000000", + "hours": 99134, + "calculated_hours": 667796 + }, + { + "hash": "d8ee5dc5cabcf179365345167d39977ae38a71e55cf357881258be32a45732bc", + "time": 1430505176, + "block_seq": 144, + "src_tx": "3bb9fc516dc2c522e28f99e6833253863c550547ce0e0a2dd963a0118b7a44a7", + "address": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 297042 + }, + { + "hash": "456bcb0a2e57a5c20f2757c8fc7669af1f969bb5a57f89965210daf7107993aa", + "time": 1430505086, + "block_seq": 143, + "src_tx": "57150aecde96bde972183b9b0d7d27dda2c0179fb71630e92c27856d211335cd", + "address": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", + "coins": "500.000000", + "hours": 0, + "calculated_hours": 148533 + }, + { + "hash": "908fe94bd28886547f1b7b4fc98d0990a08a216b70877341f566b6b4685de364", + "time": 1430504846, + "block_seq": 141, + "src_tx": "16f8b9369f76ef6a0c1ecf82e1c18d5bc8ae5ef8b01b6530096cb1ff70bbd3fd", + "address": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "2500.000000", + "hours": 0, + "calculated_hours": 742834 + }, + { + "hash": "cfdefd8d167947190a223882d20c8ac7880e550ad1a3494bb05bff4b1df4e3ff", + "time": 1430504746, + "block_seq": 140, + "src_tx": "de45a24c9c32f808a3d928f30ba8e1b6ef8117a7c0b7a5d616734d9b121d0c30", + "address": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 297161 + }, + { + "hash": "278b0caa6dddf4ce74772471b15fb9a8c364362b0ae3eeb9379e980504d8d512", + "time": 1430504536, + "block_seq": 139, + "src_tx": "578075959959db70ae86f4f60d2ae3ff245727d086eef86ed80db5e1c7c9fbaf", + "address": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 297220 + }, + { + "hash": "bceafc261a2250f1bfb8154aea88370acfe6a41a4216bcb76c2016451cbcffd1", + "time": 1430504236, + "block_seq": 138, + "src_tx": "9880bebc51471e0b3c520920db836d674f652503314cd74069a59ccad0d0967a", + "address": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1200.000000", + "hours": 6, + "calculated_hours": 356770 + }, + { + "hash": "b6b6188973b600af774ad8a7b6d454f77713a51463b9a9a70c901ec5280a9789", + "time": 1430504186, + "block_seq": 137, + "src_tx": "fc02772662176c282c2b6538732d3d6eb1399f006a0b52e64d07fc104038f638", + "address": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 48, + "calculated_hours": 297365 + }, + { + "hash": "e00c292e151fdafd24984b2dc08a4a328150006f95afaac9909dbffae1f07eaf", + "time": 1430330851, + "block_seq": 136, + "src_tx": "b9a795552bec1a722718b44a08ad152656242b1d23afb53d2247b3016d920b7e", + "address": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 387, + "calculated_hours": 345852 + }, + { + "hash": "d95d422fb8fe4ad9ce1052e566ec8a5ad7953ceb253366814b3d32e9a1da1f13", + "time": 1430330481, + "block_seq": 134, + "src_tx": "44d05abc2637d9cd2047984023eb5cfa0a146e58821117de30f9c81703189cde", + "address": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "100.000000", + "hours": 24823, + "calculated_hours": 59379 + }, + { + "hash": "8b3d335360effd00cabcae13c2495f26f81743b82958629378b7bc78a7e460fe", + "time": 1430330421, + "block_seq": 133, + "src_tx": "d30cec3ad3a66562d2513a3656b366ea7da583e6ba45214ac12b9c2219b4c5ea", + "address": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "500.000000", + "hours": 198586, + "calculated_hours": 371378 + }, + { + "hash": "333156ed20ba6937d3720af3a81939362b9f4ad1e9591bc676945ff0d202131e", + "time": 1430330311, + "block_seq": 132, + "src_tx": "3dfdfea4614d05c2f5eddf5773ef0afc745f1afe585141659df8e03e82897606", + "address": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 1588688, + "calculated_hours": 1934303 + }, + { + "hash": "e7756fa7a5c067d595f7300828bc4c70152653700844130d88174ba37237e2a3", + "time": 1430330041, + "block_seq": 131, + "src_tx": "6538399868cf772fcfa96e68c51aa6aa66faa95d7c685432e4005880932be134", + "address": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1200.000000", + "hours": 12709509, + "calculated_hours": 13124338 + }, + { + "hash": "169e9a77557283e0d158fe6e35c439d729d73acfd00e2969147dacbdd599817e", + "time": 1429849180, + "block_seq": 129, + "src_tx": "66d415598af081f8a7bd7f292468e67f380d06bf5896eb8152d4d9e8bcdf289e", + "address": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "1000.000000", + "hours": 66854, + "calculated_hours": 546117 + }, + { + "hash": "6143275de37a2b5ec802eeeb8d38a3dfb2db6629128e44c4f9ffc0ce8ddad629", + "time": 1429849170, + "block_seq": 128, + "src_tx": "c2c9fe882df3b44fbb125b251a7604a7a4f4195dddff6e5396b7f130744e2b27", + "address": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", + "coins": "1000.000000", + "hours": 6994818, + "calculated_hours": 7474084 + }, + { + "hash": "bca6e6b24cdabecd77186a61168dd3e2290b2fda1b7a79eb3856ca4cc9f589e2", + "time": 1429680646, + "block_seq": 126, + "src_tx": "a67ed00f815a2fd20d0efd18ac04663f0ee3d5621fbfdcdc6af250f19e3cfc53", + "address": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "990.000000", + "hours": 17310, + "calculated_hours": 538127 + }, + { + "hash": "e4a83076c2ce1bd83953c1c0443054d7f5b0843c551d35b3fc3c116e9a9134d7", + "time": 1429680646, + "block_seq": 126, + "src_tx": "a67ed00f815a2fd20d0efd18ac04663f0ee3d5621fbfdcdc6af250f19e3cfc53", + "address": "odhAMxHhXoBdx1RHNmfu7dTZ1LZivfsbiH", + "coins": "10.000000", + "hours": 17310, + "calculated_hours": 22570 + }, + { + "hash": "a08089cd67896683d5dcb2d50256354e0d086b9854eb22bb6022cc459d447211", + "time": 1429578056, + "block_seq": 125, + "src_tx": "1ca0a2d44b6439b91eb839e0f99405abdcafe2c1a49c8b49b1739498129bd1a6", + "address": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "12500.000000", + "hours": 92, + "calculated_hours": 6932286 + }, + { + "hash": "a4fdfce34725eb63941ac576651fa406272565a344ffb21435d285111efbc4db", + "time": 1429522086, + "block_seq": 124, + "src_tx": "e9a6dd585b564b19c55d9f56188a45bfad32fa75703fa6336830035f6fa92e3d", + "address": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", + "coins": "5000.000000", + "hours": 739, + "calculated_hours": 2851352 + }, + { + "hash": "8e764a87cee9f26b902f748c28a5a49de5c383e5f155129eec84474a3d0349cc", + "time": 1429451746, + "block_seq": 123, + "src_tx": "9003d3caba9587d46d000cc614bb52bed34adcc5ea404c560c986eb6dd756e6b", + "address": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10000.000000", + "hours": 5916, + "calculated_hours": 5902532 + }, + { + "hash": "1e0cf4e3ed49b52944f533a212e6412291e369ac3e7a8c4440424f475f2983b3", + "time": 1429382898, + "block_seq": 122, + "src_tx": "211f5fc97ba1797d78f84d4e4db78415b5ff4121f78369535fe3f8015571c6df", + "address": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "36000.000000", + "hours": 47330, + "calculated_hours": 21963630 + }, + { + "hash": "e5596ef0ba04ad9e0adbe0355a24c6bef249654906f917b68f8f0cf072508674", + "time": 1429382678, + "block_seq": 121, + "src_tx": "da82deafc15c36e7dc9cd95663e0dc910ae626ee543147ac7bd8682be00f7baf", + "address": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "62000.000000", + "hours": 378646, + "calculated_hours": 38127173 + }, + { + "hash": "3f9712cab0d3aeb217f1751fa19e53d75f814b4218866d4e70d63f32271d2023", + "time": 1429364452, + "block_seq": 120, + "src_tx": "d1569ca879f98450a920a2b427ab0e1d21342308fb6b4ea5031ee6e718217183", + "address": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "38.000000", + "hours": 480, + "calculated_hours": 23808 + }, + { + "hash": "cbe8b620c1468dbb1e69e6da63831bde5828db313879a36f783a1f16f2b86541", + "time": 1429364282, + "block_seq": 119, + "src_tx": "4d080ff1f8ac21d8c09a2dca99d28ae88e9441d7a4757dca68469ad64838cb55", + "address": "38cVLswijqC2ANV5HxTroeapQzqeoBR88C", + "coins": "12.000000", + "hours": 3846, + "calculated_hours": 11213 + }, + { + "hash": "3408638af298419b14a49e8e9dd69e97c9a06827d74edf9f410a870662360b31", + "time": 1429364072, + "block_seq": 118, + "src_tx": "a83e09e976b038d86491d8c029aec84a6313dc33e692da6ce50a2858e50c4666", + "address": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1045.000000", + "hours": 30769, + "calculated_hours": 672415 + }, + { + "hash": "2010952c33c83599fa14bfa5982d59865f2a362c97270dacb4c180a485ee5096", + "time": 1429351912, + "block_seq": 117, + "src_tx": "345488861ad3f0d93024c367990e64ef0f7a95bd8b8589f554172f9439808263", + "address": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", + "coins": "10000.000000", + "hours": 20965, + "calculated_hours": 6194898 + }, + { + "hash": "6c34016037cd17622846e71bc635914d4d8f256c147aa5a0b84a896e83229480", + "time": 1429349392, + "block_seq": 116, + "src_tx": "491130fc9f69d101df220116356e82e2ff21dac1167e6da81c95dd4cc417b3d9", + "address": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26400.000000", + "hours": 64785, + "calculated_hours": 16382449 + }, + { + "hash": "ab12f4eadaf956be371ff8f239956e33d1cd2fd4b497ca04c9501baf6f241618", + "time": 1429349392, + "block_seq": 116, + "src_tx": "491130fc9f69d101df220116356e82e2ff21dac1167e6da81c95dd4cc417b3d9", + "address": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", + "coins": "100.000000", + "hours": 64785, + "calculated_hours": 126594 + }, + { + "hash": "de995d2361e810cfba1b9b1141413367a722f51c7555b1685f6e68129dfb2679", + "time": 1429348712, + "block_seq": 115, + "src_tx": "bb700553c3e1a32346912ab311fa38793d929f311daeee0b167fa81c1369717e", + "address": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", + "coins": "100.000000", + "hours": 2712, + "calculated_hours": 64540 + }, + { + "hash": "5b0801ec545b132eeafa61bee8f645df7e1e358321ef830a4247fe541c211139", + "time": 1429348502, + "block_seq": 114, + "src_tx": "e8765b4e6fbca87144df59a6f66815b175e81999509504b117636edc34cbe2af", + "address": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "100.000000", + "hours": 21700, + "calculated_hours": 83534 + }, + { + "hash": "a7dc3318a975546b7662f0a867c60a4d7e9b4d1d89ab87be8c78b09ffe8852ff", + "time": 1429326351, + "block_seq": 110, + "src_tx": "552a4b194478325ee9f3e4a8648d94bc8eb26432be6fecc881bf71ff9ca15356", + "address": "aPF9pL9sVEiyEVhynp3s1dmqLetP1BJrW6", + "coins": "100.000000", + "hours": 17848, + "calculated_hours": 80297 + }, + { + "hash": "4ca22a0fa2acbd0c9e90c4ae83496d05e122deb1a17c670e9c785479d115e824", + "time": 1429302756, + "block_seq": 109, + "src_tx": "a4c15ae4743246709ec335d33c289576c8893e71f5c3dcee1db6e43eec9242ee", + "address": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", + "coins": "3000.000000", + "hours": 7092, + "calculated_hours": 1900235 + }, + { + "hash": "9404837ee44bc6aaa8c1ad963c8fa7a050e497f89f941fdc7248930ed4e0d5a6", + "time": 1429280756, + "block_seq": 108, + "src_tx": "a8d6420d4f64fad1b698bd77cae5a92aa125f806fb184389edcc278e5cb460fa", + "address": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "100.000000", + "hours": 3457, + "calculated_hours": 67172 + }, + { + "hash": "ec4b791f2fa22a986d6035e34f5025c3da0398cb2acc59a54d495d4eaacdee8a", + "time": 1429280596, + "block_seq": 107, + "src_tx": "6546dfbe6e61e81f3e9f6c9afdfee1c07758f2e486d731ae4d19b40602367656", + "address": "2acnXsnJ2k8jxiUahtBe8h4xouPAnpbwwjc", + "coins": "100.000000", + "hours": 17411, + "calculated_hours": 81131 + }, + { + "hash": "3bfbe4e80894862d60a053ffb47b8f1749e281603cd6376c8fc6b5e2cec0c843", + "time": 1429279796, + "block_seq": 106, + "src_tx": "8de17dff34a8798f2ac89584f5c559e3bb82c280a3f6890386b4dbc5fef0e8cf", + "address": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "100.000000", + "hours": 139293, + "calculated_hours": 203035 + }, + { + "hash": "8f4435cc1cb45453f1ee8e836a74bdec313a6d3aa1879be24e2ba261d474bf36", + "time": 1429278556, + "block_seq": 105, + "src_tx": "41ec724bd40c852096379d1ae57d3f27606877fa95ac9c082fbf63900e6c5cb5", + "address": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", + "coins": "100.000000", + "hours": 1861, + "calculated_hours": 65638 + }, + { + "hash": "52088c63431b6109537bce1e582775f319c9833990c94cc2e8e0dbb8b48b9c27", + "time": 1429278406, + "block_seq": 104, + "src_tx": "44d56cfa9f83d874ee10fb32f0d40458f6bf3e86528592c9a9abf3c960fcb278", + "address": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", + "coins": "100.000000", + "hours": 13730, + "calculated_hours": 77511 + }, + { + "hash": "435c7095e2531b88feb76f32fc34fac3406882cdf71e17fecdba196aa5bc059a", + "time": 1429278106, + "block_seq": 103, + "src_tx": "9150311508851ca989efb5f82b5a7201724514b6b9f84ec1620c18673462126b", + "address": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "100.000000", + "hours": 12679, + "calculated_hours": 76468 + }, + { + "hash": "1f9fb89f5b7c41d3df6d72b1f02c998196bc79ec20c3949693b4f5a2c1aae44f", + "time": 1429165260, + "block_seq": 97, + "src_tx": "a689a3589730a351f880176b2c15b395967b38a90950e0491e7a1e5531f020a9", + "address": "2H7mA88ireMKHqP9LYWK5opnU176v7eYqrn", + "coins": "1000.000000", + "hours": 54, + "calculated_hours": 669295 + }, + { + "hash": "63768bd1402317f7d3f0a38c9897e609bb72b7d334e54bd4c609292487264c22", + "time": 1429164900, + "block_seq": 96, + "src_tx": "0301358c2db5314ca43c442bac3c1daf31f4b39f9ac9e22dc157687212cab703", + "address": "22Piwuzo8ZfoXfpMghhbzGz3ptmTeiDhLbg", + "coins": "1000.000000", + "hours": 220, + "calculated_hours": 669561 + }, + { + "hash": "f9653d496ee2e6499a68a1172e5d60b60758b1edcd02d95a3388b29e113a9041", + "time": 1429164880, + "block_seq": 95, + "src_tx": "c93f8bb30e75ffbc0075a4baf57a0f536e4a9123395b13ce67af5cd2dd0f8cd4", + "address": "2U1B6EE5ZCXWJJSyEndouuCk434xpvYqYDF", + "coins": "1000.000000", + "hours": 294, + "calculated_hours": 669640 + }, + { + "hash": "24c4cfc628a0f77ce2e878c6ffa9d4dbd85325f8a5e0b5df970a3a2c36033519", + "time": 1429164870, + "block_seq": 94, + "src_tx": "0f4958d590ed4ac9aca79d848731b358b1c01fab9717775cf6515f2bf2706dc8", + "address": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "1000.000000", + "hours": 1829, + "calculated_hours": 671178 + }, + { + "hash": "4a5c1b09ef2216ba2fdae735ec8c6ad404bb61bfbeb7407dee9d6e3578762ffb", + "time": 1429164860, + "block_seq": 93, + "src_tx": "e2d9da9342b21659da0a679536f9d6f533a4ce7dc33a7f768c3441ca3640458d", + "address": "2LZzgdFYNhsBBSLATkV6PA1zk6DvWNghP2", + "coins": "1000.000000", + "hours": 129, + "calculated_hours": 669481 + }, + { + "hash": "3109e04b5baef2423f4d6d2d639464286c24ef9defa612d3b598802d761b670a", + "time": 1429164850, + "block_seq": 92, + "src_tx": "54e65c445d0af9dda82085ca4bfe0f326ae54ea2a03bd37e07f81d937de97777", + "address": "ZWhZtjwXMS46cpDxfRwQyxxKPhqwsQu8oN", + "coins": "1000.000000", + "hours": 1529, + "calculated_hours": 670884 + }, + { + "hash": "535987a7896501a8a69c1904c0bf98e2ef1fc493bf998c78ee420ef154868731", + "time": 1429164830, + "block_seq": 91, + "src_tx": "98baeb9799902593d0f61ee22947089a798c6adafd05dc6a5ea918d982a19857", + "address": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "1000.000000", + "hours": 2089, + "calculated_hours": 671449 + }, + { + "hash": "63154895637eb000146996ffaeb7cc1a547e409d0a2038650e990e7cc9b36826", + "time": 1429164800, + "block_seq": 89, + "src_tx": "a0956843d442bd4b592d0c1323d153c3c1b2d7d52a86629444de6d1d1b6a4c33", + "address": "XnKU1htBL5wFSMX8oytZBsBMeaBSbVNivT", + "coins": "1000.000000", + "hours": 635, + "calculated_hours": 670003 + }, + { + "hash": "f713b6bde2e1956615b23021d20aeb829611d231e2e85b8204c01e5719ac8639", + "time": 1429164790, + "block_seq": 88, + "src_tx": "efc98a4f94ffda2f1d6575048d75728f228a0bef0467c331f085a0f41f97ae45", + "address": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "1000.000000", + "hours": 11912, + "calculated_hours": 681283 + }, + { + "hash": "f98e302e74d8972254b1cdc4de3ca78ff1e60f3f1b7083af397f3bcb219e9454", + "time": 1429164730, + "block_seq": 87, + "src_tx": "cf5a1fad27f8f874f67d3162ae6347154c980ebd97c668d610280418f0f53ce7", + "address": "FtdApqw416skWtXM7ExanZWFmiHNPZ1Ft6", + "coins": "1000.000000", + "hours": 16162, + "calculated_hours": 685550 + }, + { + "hash": "ee69cfd4f15d16ded96745a35ef150f679b5b79cc0fd4009a2d02cdccd81ca3e", + "time": 1429164720, + "block_seq": 86, + "src_tx": "ca51f9d0a19bf326d6dd39a1e4dd240adaaae279411093d4a5b20f54cddabb95", + "address": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", + "coins": "1000.000000", + "hours": 2525, + "calculated_hours": 671916 + }, + { + "hash": "a733e89023ccc12587d0849f9baeda0d2fad640c1cbe97e24ffc531859fd83fd", + "time": 1429164480, + "block_seq": 83, + "src_tx": "d80d49958166fd7b35cee63cfc4a4fdd434484f9bfd9444f62a1b856da36e9c7", + "address": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "1000.000000", + "hours": 27495, + "calculated_hours": 696952 + }, + { + "hash": "9bfa6dd7ff610b2e8ba036594244e70d427398eab8607d39be0e45303d45d4d8", + "time": 1429164460, + "block_seq": 82, + "src_tx": "0ad2691de38a15ec31b0fbe9a0c1175138c9d7b7558db2f016a23619f3dbbc6d", + "address": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "1000.000000", + "hours": 93050, + "calculated_hours": 762513 + }, + { + "hash": "e16c0ebbfba61c49b0e98bf8336bc4d8a33ca30386c4d875bba2ec4bf4a59147", + "time": 1429148000, + "block_seq": 80, + "src_tx": "5db4378f5abcbb48774fc3731a164fb7bbdccf410c3ff829c5706e4d9ef1b1c6", + "address": "22WGCstVJGVyqnBuvGHt17L5aNNMpURvckd", + "coins": "1000.000000", + "hours": 8543, + "calculated_hours": 682578 + }, + { + "hash": "2a886bcedf8862c351cc4087b89e902202b08b164363567a9be47908e938f280", + "time": 1429147950, + "block_seq": 79, + "src_tx": "2558a7cd524acdb58f822a56bd51e8905182b2b35fbfdb1246ce6dc9930d14eb", + "address": "pMub1Pz3SLVaSwHoomgp5oDVxdkVxLkW6L", + "coins": "1000.000000", + "hours": 77792, + "calculated_hours": 751841 + }, + { + "hash": "ce4ca78d810564568c936554d0b6c1a50d91b273648314ffa3fcc1b2d72ac334", + "time": 1429147900, + "block_seq": 78, + "src_tx": "c1fb9372439d7f43d17809afc2d1bc9b2aa81fa9fccc1d837c79e649ec4843db", + "address": "sV8sVBgs11uHQtZK5MPbYem2iJ6Hehghv7", + "coins": "1000.000000", + "hours": 67976, + "calculated_hours": 742039 + }, + { + "hash": "08723ed501e11c2053bab6b500f820dd7ae2aeb4a3c9d5109845bb46afebde97", + "time": 1429147880, + "block_seq": 77, + "src_tx": "29798149e90f6442489bcc3294f455441a5a401e81491ed06bdc2c850756f0d9", + "address": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 976817, + "calculated_hours": 1650885 + }, + { + "hash": "50386f195b367f8261e66e3fdfbc942fbacfe25e117e554ca1c1caf899345476", + "time": 1429110544, + "block_seq": 76, + "src_tx": "5369348d67b2dd30dd9164657e372304f81ea10dfe1914ba874d46cd659f52c5", + "address": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "25045.000000", + "hours": 72043, + "calculated_hours": 17213842 + }, + { + "hash": "9c3119ad3edbd17a2135cac6d24ef43c6d7e599710b2aab4e97e731e64c13acb", + "time": 1429110544, + "block_seq": 76, + "src_tx": "5369348d67b2dd30dd9164657e372304f81ea10dfe1914ba874d46cd659f52c5", + "address": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "5.000000", + "hours": 72043, + "calculated_hours": 75465 + }, + { + "hash": "ead07056919be961a9e812a7832356d806d551096284648756b3642a3d4a5570", + "time": 1429096344, + "block_seq": 75, + "src_tx": "3122b6b29ac470bfa18fbd1ef6d5ff76717e18ba25374215a5003557b4524f22", + "address": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "45.000000", + "hours": 909, + "calculated_hours": 31886 + }, + { + "hash": "ec41341d4c9d69e150079550a9051c4cb7cc3e2da49deb2c0faaa632cb1958f8", + "time": 1429096344, + "block_seq": 75, + "src_tx": "3122b6b29ac470bfa18fbd1ef6d5ff76717e18ba25374215a5003557b4524f22", + "address": "j6pa8kdKqHbxRm2VXJVbzigQDFzqTVfvfq", + "coins": "5.000000", + "hours": 909, + "calculated_hours": 4350 + }, + { + "hash": "5f75082377566cf140c8f158e160ab6ecd1cdf02224c66865106fa1a75b39dc2", + "time": 1429091944, + "block_seq": 74, + "src_tx": "edca397ceedb5fb4462b0aff8fe7f9da5091a4e68f11a34c79daf2c5ae7dd748", + "address": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "955.000000", + "hours": 7273, + "calculated_hours": 665847 + }, + { + "hash": "3c56fa9d161783d6fe5c8b055c6d20bae27097e7bcc44d9ece5c94df182ee5bf", + "time": 1429077914, + "block_seq": 68, + "src_tx": "d803ab903f68f7861cd8eff93b3c097c5b8f6a697ca67bb01e7e645060839fd0", + "address": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 181, + "calculated_hours": 693684 + }, + { + "hash": "8bdd2662d7ed495ff82daef9198ee23ac0c75417607675a8da3dd673952c0e39", + "time": 1429077874, + "block_seq": 67, + "src_tx": "42227683dd9c149859d0578ab300d8509d513afadf7834fd8ae7a321cc07d833", + "address": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "1000.000000", + "hours": 1452, + "calculated_hours": 694967 + }, + { + "hash": "47c74a6d7f1f54cf0a7ac45ec00277539079810068dd95a29a202c43780d65a0", + "time": 1429077694, + "block_seq": 64, + "src_tx": "29c229c97d27bcaf842a367520e1916fb855921906bddf4a3b0413ad3f11517b", + "address": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "1000.000000", + "hours": 1170, + "calculated_hours": 694735 + }, + { + "hash": "9011fbc6e82dce0656e7ffc76afb014d2ad70aa4663e7b687d3212e12f8965e2", + "time": 1429077684, + "block_seq": 63, + "src_tx": "8d10b0ba11d9dd63d3a3522bc35bd260e8da9109298aa488355ea7201eb961b7", + "address": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", + "coins": "1000.000000", + "hours": 211, + "calculated_hours": 693778 + }, + { + "hash": "b9853ab091bdb295de20d765e9bce2d86870791a6a15b8ef9e9dddb71c4cba95", + "time": 1429077664, + "block_seq": 62, + "src_tx": "057ae2bee6e1fc2c9997d48aab3e348a7f17ad0305d6e6a14f4f663404b4a00a", + "address": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 13, + "calculated_hours": 693586 + }, + { + "hash": "2480aeed2dc47c692e4bce61fb3ee44c4992ea39b0a167235e501330d7ddac62", + "time": 1429077654, + "block_seq": 61, + "src_tx": "4aeafd20b9df56ec852a2c257ff1630b9530d8375a4e72f20238ea36835f76d5", + "address": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 1519, + "calculated_hours": 695095 + }, + { + "hash": "53d7b4778ee9b9537c0439666ca124d81bcaf4195d080ef61fade8c3eae6322e", + "time": 1429077614, + "block_seq": 59, + "src_tx": "4ce860140dbb5f90f39086b0c51323005145a95b365204bd33e3d90fbdc35f51", + "address": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 132, + "calculated_hours": 693719 + }, + { + "hash": "d58f3facfb4c9c9459e6fae3000886acb2b1f81322725cdc32cc09a49bb81e43", + "time": 1429077604, + "block_seq": 58, + "src_tx": "5d1cb86b48c8834c8c12fc36a83259609300f2f6a148faa1492a473cee21bc02", + "address": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 36, + "calculated_hours": 693626 + }, + { + "hash": "3b9059ec909faf64d652dae78944f4a2737df95a3215bf98e2ff33e02e2b377f", + "time": 1429077584, + "block_seq": 57, + "src_tx": "61a33b49e97bfe2d5f026bf45fae43a1b9bdf08c60ec8db017da720a69790c7f", + "address": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 1681, + "calculated_hours": 695276 + }, + { + "hash": "9e53268a18f8d32a44b4fb183033b49bebfe9d0da3bf3ef2ad1d560500aa54c6", + "time": 1429077554, + "block_seq": 56, + "src_tx": "8fba29db2e3e8cad785e723f95aa5fa46ae0dd8b2bb62586977f20e698642cfb", + "address": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 12696, + "calculated_hours": 706299 + }, + { + "hash": "2f1de81eaa83eda52d8eaf44b12599b23134a38b7d55f67de8881ddafbec278b", + "time": 1429077544, + "block_seq": 55, + "src_tx": "374f01de8274656147be0a23ccc5677773da6f32b071ee796bda0851b6dcd2ac", + "address": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1000.000000", + "hours": 930, + "calculated_hours": 694536 + }, + { + "hash": "470b293870b663b84e1f677e1bc0e486d0b5f412b0562b078a7a1045f7785d7a", + "time": 1429077524, + "block_seq": 54, + "src_tx": "88d239f2584c78b73a1905fd0dcce3beabfdfc5a9c54518862b009e22e972c68", + "address": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 192, + "calculated_hours": 693804 + }, + { + "hash": "cec910b5d672e216db306389dc9ebb08f9d37485fbc3ac6aa7a8c37f60be844c", + "time": 1429077494, + "block_seq": 52, + "src_tx": "231254039042675300dbdd61a6ca54941214e383b5f6380323f848482b4f4628", + "address": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 1499, + "calculated_hours": 695119 + }, + { + "hash": "2f4daff744e7fd81ceea34ecfb0e383a65ecda1c55f32a0bef313d29b0795eab", + "time": 1429077484, + "block_seq": 51, + "src_tx": "814694a8e32f1c81b627f8eb704622c8893d197bf32bbd7e1bf73bec9a831d7d", + "address": "2acnXsnJ2k8jxiUahtBe8h4xouPAnpbwwjc", + "coins": "1000.000000", + "hours": 7343, + "calculated_hours": 700966 + }, + { + "hash": "5afa88b6a9ef9168d15d9a0bbc87dd5ab30badc01773460f92703a9c829358c0", + "time": 1429077474, + "block_seq": 50, + "src_tx": "be27621ad46680b343cc1406f5c6a1717704ce169e988ed7afb586f8112ae6f0", + "address": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "1000.000000", + "hours": 11972, + "calculated_hours": 705598 + }, + { + "hash": "85fcb22c416b7d430076bb80a324734cb97483cb4544192df252b89ba8f7fd61", + "time": 1429070414, + "block_seq": 44, + "src_tx": "ced30c4ac3107997efa90faa40c8baed47dafc8ddb4feae3ba21275401c36280", + "address": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "5.000000", + "hours": 33, + "calculated_hours": 3510 + }, + { + "hash": "e64fa1f60e905f1d7b7a8f0ca134ab2b7a467f7363ec9c03628d559e1230eb68", + "time": 1429070374, + "block_seq": 43, + "src_tx": "d368fc3112b522c52a5b191981ca52678cc7db29bdc3493cf551be88d109ef9c", + "address": "2apVG7f24ezDK13yCDTqBWYrTZpuj94KnCN", + "coins": "5.000000", + "hours": 265, + "calculated_hours": 3742 + }, + { + "hash": "3e475e76c226a70c87d030d8fc6b8b1c2cc654ba9eaf3bed08be5bd603aec0b7", + "time": 1429011137, + "block_seq": 27, + "src_tx": "cff53a059d55f2c90f6dd7ce7de2cc07cbdbd50b25867cba0f41cd0192614d0d", + "address": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", + "coins": "90.000000", + "hours": 70992, + "calculated_hours": 135076 + }, + { + "hash": "339aeec109a26bab65e618d73ebba16e5b8fc18f7dc1fe502ca891ad5b0f4d5f", + "time": 1429011077, + "block_seq": 26, + "src_tx": "56e7bd13dc4c6e1cd80aba66a0a9fed650d0646659ac774e3f1b415848755d85", + "address": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", + "coins": "10.000000", + "hours": 567938, + "calculated_hours": 575058 + }, + { + "hash": "ebedac42a639f0d0a196b47676cb757b95046f0403f74baa5b15e98753ee2d58", + "time": 1428991665, + "block_seq": 25, + "src_tx": "917510897f5d8a018ad8d447876a15e2e1f68d42e71b6f75d89b02c4a599c537", + "address": "2bvEzLx4mgyQkYL5bkSc2rD9V1nqWBqn8vp", + "coins": "2.000000", + "hours": 0, + "calculated_hours": 1434 + }, + { + "hash": "f910d0e633735df5f041fdb7ffcb9cc8988b71c9375c52ababb54238be4d6852", + "time": 1428991665, + "block_seq": 25, + "src_tx": "917510897f5d8a018ad8d447876a15e2e1f68d42e71b6f75d89b02c4a599c537", + "address": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "1.000000", + "hours": 0, + "calculated_hours": 717 + }, + { + "hash": "fbe00b341f3e798c3e7e5eea04ffd8f3e70f0e78bc38f9a4927bae7eed6a1411", + "time": 1428991635, + "block_seq": 24, + "src_tx": "f935cd91736604989c08448a2d83d6b044c3198ac1a7483a3b9846f8848a7d84", + "address": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "2.000000", + "hours": 0, + "calculated_hours": 1434 + }, + { + "hash": "e55a8d2ebe0f48f17a175fdd67d47deb5015b2ee8e91de16b2b121c8ad830e40", + "time": 1428990135, + "block_seq": 20, + "src_tx": "22766105d0f93d01fed7bed2dcabedfd89fe846621c912b0af845d8ba5d265f8", + "address": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "5.000000", + "hours": 0, + "calculated_hours": 3589 + }, + { + "hash": "b56517b7803a4b2cca522e1cca5f75894db174c97d0e127826f5414544eccb72", + "time": 1428990115, + "block_seq": 19, + "src_tx": "c6eccf17b4b952f19548b1924126c9dc409b45f9e6fcc0954a3494e7399f5fd4", + "address": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "5.000000", + "hours": 0, + "calculated_hours": 3589 + }, + { + "hash": "0b720d05d44354ff0c6c75d55f1cd4e5945bc2ca80f2ba840545205362202925", + "time": 1428820629, + "block_seq": 16, + "src_tx": "e96e157b685c28847d6758e2ba326ad59cf2661c926fb08000d4b40d78a9eee3", + "address": "ZWhZtjwXMS46cpDxfRwQyxxKPhqwsQu8oN", + "coins": "2.000000", + "hours": 0, + "calculated_hours": 1529 + }, + { + "hash": "e72d8ba4ce2d3b37aeb71df2e3bed80ee07204b3fa633f56cbce7bca836bd39c", + "time": 1428820629, + "block_seq": 16, + "src_tx": "e96e157b685c28847d6758e2ba326ad59cf2661c926fb08000d4b40d78a9eee3", + "address": "PRXLNyB64cqaiG4pCoFZZ8Tuv7LWYPpa7m", + "coins": "3.000000", + "hours": 0, + "calculated_hours": 2294 + }, + { + "hash": "9e8997e53d2e61955da71dbbc6ba5b0da799eaace0f45870a4e42276a6fdaefa", + "time": 1428807711, + "block_seq": 9, + "src_tx": "9d87d7bb9e56a3588bacb478c7556280b28c0a49f6e09db8b54a84c20d865f2f", + "address": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "5.000000", + "hours": 0, + "calculated_hours": 3842 + }, + { + "hash": "1f810bdd1c65ad50f27f2c47a000150877fdba2fdb78b9d8cae39946be6a9e33", + "time": 1428807691, + "block_seq": 8, + "src_tx": "7229422f3a0afb5f3a9596ed50146440c17a3d54abda0f3c70cd9dc58de96374", + "address": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "5.000000", + "hours": 0, + "calculated_hours": 3842 + }, + { + "hash": "f9e7a412cdff80e95ddbe1d76fcc73f967cb99d383b0659e1355c8e623f02b62", + "time": 1428807671, + "block_seq": 7, + "src_tx": "f832428481690fa918d6d29946e191f2c8c89b2388a906e0c53dceee6070a24b", + "address": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "5.000000", + "hours": 0, + "calculated_hours": 3842 + }, + { + "hash": "01048ad6a538256d9a8c6c9c6321ca1a01b31cbf08e74fd4ff0f141bf97eb8ce", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "044dc539d063250dc654b2bf0986a9044b4eea05e1284c11a2b313acd8dc3498", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "07f70fd4108ef4d2fde3b85411728c1f7bd3a135d2062c5a30a46cc885463780", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "0b95850edabed70762768ac1695c5d7f230cccaa8de06657cda42cafba36374f", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "0c238e82f3a4beee1be7b5b464e8553404f6927d5ab93c3d649d362c01097782", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "0c956289db079c00d2f80c590d3c8ca26c37da534fe5f65e799b3982ceca493c", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "0cff53628eb0e984c134b68cbe4b1bb7721a05adaa32e93b9df489a9a7a176cf", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "12034bc455d0821813d7eb9afed1ed1a8f19b6f29826ef4a057b4aa0b4228817", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "131f07f5b40f365fb537b863e4aa5ef0efcd77b7fa2ff321d90eeb743ac43678", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "135c28698e80e3b2a737d59c16c79684c3fb3ec5cec59f466a39f4ac3c73968e", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "13afe1586015c4d7312f89d123153279e4961eb0d53a4d036847d5d989ba90dc", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "1550a76598693b950346397e0e825bbb2805edde38b0d0240e50050829b7b1dd", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "178a33e64826cd2039b8538b74e6de513966acab45ab79d77dc9392018a65ffb", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "18a43b8b69bbf12a9e49e6f9783ba258397e6567301aeed9e901a1e4fed9fef9", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "1941e5cc5e38dd92427580af699b1f410be7b29ff17d3d0ff3d046bfba0aaabf", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "239bdba27dabd52f7450f7d8521c9a7e5ac74093ae3f6f2348bf40ac9a6db7a5", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "246377a036ad5444bcd5f47ac9e55fec7c85fc40644df593038d360554a809f7", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "26f585cb96f35307f0af5b9aee004a29b7795695f4c5c836104e2fbbf429a3ce", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "2a4d631d5dc90e397d85f13410d1a6d877dcaf592a0e2be2e727443ac74b5bd5", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "2c0e3aa084f5fec45f99b3f125ce7d50c6da526ef5165df5f22ba603147c3fc2", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "368a609ee90ca15bbbd297af07dc6705131764476d54bef641017ffcd0885e65", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "38f22b194f04d85a6b545b37df06195edeb8503798b229ddeaa946018150c05c", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "390bc4c045fa9f289957b7eca529bfadac96a7dd074bcfbdd3b09e99413b8202", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "3ca365aace71e24b04d6f2ffbf7171468c5e71783858c710cae539c5e43e0c0e", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "401d4c0c1060ebbb4b9fb3859c2eb47789f94086f4deb01234bf46f7cdc81247", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "439cdfd03972fb4bb5da54208cf8098ee78228c487ce9e84623f5f83e17a7d68", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "445a4082da251fa161e4705d115fe2018ca15a5f92e8a0950793405410e6be12", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "44e17f4bd29411a1614457171c06183e364bf6ff80a201717b2dfc0748e9ebe3", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "4628f4cfdbf1eb7cccc25d461c46cc29e90cffb5d6277e0de641f7701d60c308", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "466340ab7733abb23ab24d877c673fe089c273f11808fbbd6f33a91da92ee96c", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "47e4706dc4d80a70b20c889476fb0627ca6d5bdaa790f4ceba44a689d31b2dcc", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "4ba91512c168281f41d3934b927d0d86a3136a31cc345b635095928f8e5f013c", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "4f30eae8c49eb268fe364eaf5ee0788da6e2f6adc2f83cd82e96a4bfe98496f5", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "5010eb25f6e1ed725fb901ae1e945e545ae846d7be8a135333d2d41102c33328", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "550d2a8d3047cdae0c05a61cc3de43e758b123a6955fa067d3ac375f7d0dbadc", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "5a69ef09b5de21b117cac62141a8de4eade7558c42f0ba8b50996f5ec7867c5d", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "618d242d95d33e2d7316612a164d89859b85f1287f0d5bed4dcb561cf478f706", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "6384ed19650d384c29db4c3a39a1ca855058fab758075be2dee759dd9e6faae1", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "66e685901492c94942522c346759c711ee2e78a059ef274e77a6ab433409683c", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "693c7f970b34ce5882e62430f4c9c28957159a257d27d4e21a61fd95c6b97464", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "6a24135f8496e7a37dcf7164218bb3aa530319f3b2bf3c7a1a9cc1bd17831328", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "6aa162f7fc09598c4dc8f5fab7fb2383f28c3840937a001acd9f37136e1691b2", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "6b3530bb930ed10bbc4c307663aba4377c08443498a0a2cf023b1be72f378ae1", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "6d37c0c4b6fcbac1e53a46c9c2dc5d3c3b36312c53f25b2baacc785ea77a11f7", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "73304622e33994bc2d4ade2cab78d28e1b65185e60ad3c781ecfb5cbc8159136", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "745eaff456a390c3868742a039e72c2a93ff8eee10417dbe848d533b89facc04", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "78740d5bf49989936d315bf641949232aace582e03de57db8abff940f7d51bd1", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "78b07e8fe1366e173f2eeb75c35cd53baf0f6100de50ae12b4ffe7d0d7ba4298", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "7b8787fd4076c27d074d2a4761377a1aa26c843c432e3b7e6b0ebf1e29528188", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "7c767d3a06db1ac0e1809ebe29a7d9689143259f4651837de54423e287c20490", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "8753d5775c22477a8ef74eeebf61d7de30be702e70118f552cc18ad963ffe950", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "883be4d7173c235933294ab8dcae8cc76609166eaa1c1f07e9b51d551c979709", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "8b379d1b8ff0153c63ee69c40a7155b97fa42ab570f68ff847d457316c4d8ab9", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "8b53c7188ebf4d630790ff63275679ba48009e31af6e4fe15806619216caa750", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "8cd999cd193d315e5f1c6f74c230c12e6abe6847924f6e89d988e09ca413f52e", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "8d55f76bb0b3dd222cf85a7193501c0f4071b446f56dbd1da355b1625993325a", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "98e223e6e2240fef83082d3daa86e46f10e0c71f3f74489ba95db0951a166f53", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "9ba5e31610f0545666f102465efa8caa48ad3fb5b8abd5ae802f4a71e3f7de3b", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "9f2c83c5165826de1077f428ad39d41473e32ed64cd83180d49e7d8e5db996d0", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "9fd5ea38f383291566def44b6fb932414f97123952578fe0cfb9a30eb075a099", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "a5ef046e84be9ff2485dde49afe6073811286761afac3bbd588b6e4130930479", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "aef761a12e3d0fa9c4a8db62b8bab1015c32931b7e3a7fc9a77282cec218f79d", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "af9bcf6ba63a08e699bc101aa362f135343aaf78a56e9f88d118fca0e1ce5c08", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "b2da50a08756c34d059a04812451cf3296f73ba87f8cca38473ac8f051ab6d1e", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "b497992663f99f9902deaaf487b00655820003015ea92091628f4a6e8aeb5854", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "b4c6639b49402c2753f83c7fb7d3ffa65da74e47fef2b781933ff55b14d09bcd", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "b64bc50d370a06df117eb543ca051239c985cfc4b6aa527c51b700de32c7fc41", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "bc40377012004566712fa860e74db97305091cc163e95435e04556c70d32f9c5", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "bc5f1f1ddc8cb23df3d42f1e5a1dda9d356846fe930ae4484bc1eeb1b3b2c95b", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "be5930e9cc35801433bcd21db84da7d4f1d8e744feca16a2c6fb00c81ce93e51", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "c008a613cef129c180dbcc7213f2d41a14d245d06a3844d63d9beac963145385", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "c416f5e604eeada9ae8e520a429d8f19d4230626769e7121007e01353730784f", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "c6d5e543ff5f2c2526728d588fb21753db5b7e05b8b275aa5e9b24d29350afb0", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "c858f2db2a20ac562d32f8fb2a3a11039849a6e44d2bec30befb2e173532a9a3", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "c8971ca91f8e21c556f647940073db003f7dd5582ae55d4ebca602d5e8e91a6e", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "cc84f93adce16699d9e84ef32f55333402431b58dc50c17084bcb8b33f382f88", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "cd6c4b785e60757fad0e6fd4874b729ea7703fe7ee9560e1283d2eb71fc75321", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "cdee5f84c4f08098ac740e3a260ced14c1e199e126aa5291ec079b281a7dc407", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "d2e724d83e35235c23c0bb16ae9b708a5bba3c23b186b05d4b8c606f6bb4b311", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "d2f3f050c9ef31bf5c3b14c1c71699c4f4b38aa18479531194d12e6277416516", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "d60879e562b65f97d40bec7309d4490ba0a8c80e2349ecb2e3505aaa50ea1e47", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "dad4991bfa5c51eb176f28c1b3f86661e02579905e6e07c997df22004e06244a", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "df63056cf3ae21efa86d241876ad0194387317585dc9e4fcd80954b47d59b57a", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "dfa7822c05f54116c9fc3b2cde1ecb4667f47a2d8771fe886e832c223cdc4e82", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "e440cf4c896735d3299a871f988c134f404fb2065d1f20c87c9c9bc5fa582e09", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "e936299a21240744f6edbab493449323f920bbe15dcf294463e5a2ace10f27b0", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "eea791e84a53e4d99485519c5d2c3146b0a2ad080cf92904ae7b28c2d9a6e3ca", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "efa2007c561dcbf7c83a6bbdd2ef75e7cca76b05330a8b948ba0dd94dee949f7", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "efde499c7e4444bc602b7bf5ed50e95a18ce8ec9a06ba9d850a05bb7a25ecb3a", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "f03087245a6b64bb69cd5866a1887ae595a9e1a86e196754984840eaf6d3eb9c", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "f38f0760769c19075034f70b059abf4d1bfa6d01e1e8c369a99900ed1eaeca6d", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "f625cf04412199c16e073dbb500e66c23cfe69043578b4a2d879a329aac563ec", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "fc444cdb2598f44209a41ea20afdc9065ebe51b7cd5f65bb1c0f7a7b427ce7b1", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "fd6da5199e528958e68ee8dd003b727d4d840754ea7c1e0c05e4f0e504c9b2cd", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "fed15e8506d0e0898510311850b8863ef6d9a499215ae8823a1e3fb9c8140ab2", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "ff6c0f27fcf92f3b4a3871b801c3116847fe47a7e3bafcadd4855d06012091ad", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "ffbdfdbf3427d04f445c33e867845bec1ee64a9dfe0d0fa8284547c2226fdfa9", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + } + ], + "outgoing_outputs": [ + { + "hash": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "time": 1431339429, + "block_seq": 179, + "src_tx": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "address": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "hours": 5521648, + "calculated_hours": 45730107 + } + ], + "incoming_outputs": [ + { + "hash": "32a060b2e2025cceb40f3f982c887952d3358d468db1719dd892eab575c14c14", + "time": 1431574528, + "block_seq": 180, + "src_tx": "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947", + "address": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10000.000000", + "hours": 5716263, + "calculated_hours": 5716263 + }, + { + "hash": "8f9c09c37e0c636178e4229e2e8212c067ef0a8c501be9e2757a97b980d7a98a", + "time": 1431574528, + "block_seq": 180, + "src_tx": "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947", + "address": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "605700.000000", + "hours": 5716263, + "calculated_hours": 5716263 + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/pending-transactions.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/pending-transactions.golden new file mode 100644 index 00000000..27c07b45 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/pending-transactions.golden @@ -0,0 +1,34 @@ +[ + { + "transaction": { + "length": 220, + "type": 0, + "txid": "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947", + "inner_hash": "f8293dbfdddcc56a97664655ceee650715d35a0dda32a9f0ce0e2e99d4899124", + "sigs": [ + "3981061c7275ae9cc936e902a5367fdd87ef779bbdb31e1e10d325d17a129abb34f6e597ceeaf67bb051774b41c58276004f6a63cb81de61d4693bc7a5536f3200" + ], + "inputs": [ + "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20" + ], + "outputs": [ + { + "uxid": "8f9c09c37e0c636178e4229e2e8212c067ef0a8c501be9e2757a97b980d7a98a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "605700.000000", + "hours": 5716263 + }, + { + "uxid": "32a060b2e2025cceb40f3f982c887952d3358d468db1719dd892eab575c14c14", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10000.000000", + "hours": 5716263 + } + ] + }, + "received": "2018-08-30T14:00:20.406949Z", + "checked": "2018-08-30T14:00:20.406949Z", + "announced": "0001-01-01T00:00:00Z", + "is_valid": true + } +] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/richlist-150-include-distribution.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/richlist-150-include-distribution.golden new file mode 100644 index 00000000..a13a4671 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/richlist-150-include-distribution.golden @@ -0,0 +1,754 @@ +{ + "richlist": [ + { + "address": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "locked": false + }, + { + "address": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "63083.000000", + "locked": false + }, + { + "address": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "38105.000000", + "locked": false + }, + { + "address": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "27045.000000", + "locked": false + }, + { + "address": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "27000.000000", + "locked": false + }, + { + "address": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26400.000000", + "locked": false + }, + { + "address": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "locked": false + }, + { + "address": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "22000.000000", + "locked": false + }, + { + "address": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "21500.000000", + "locked": false + }, + { + "address": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "18000.000000", + "locked": false + }, + { + "address": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "14600.000000", + "locked": false + }, + { + "address": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "12000.000000", + "locked": false + }, + { + "address": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", + "coins": "10100.000000", + "locked": false + }, + { + "address": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "10060.000000", + "locked": false + }, + { + "address": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10000.000000", + "locked": false + }, + { + "address": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "6700.000000", + "locked": false + }, + { + "address": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", + "coins": "5100.000000", + "locked": false + }, + { + "address": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "4955.000000", + "locked": false + }, + { + "address": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "3400.000000", + "locked": false + }, + { + "address": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", + "coins": "3100.000000", + "locked": false + }, + { + "address": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "3000.000000", + "locked": false + }, + { + "address": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "3000.000000", + "locked": false + }, + { + "address": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "3000.000000", + "locked": false + }, + { + "address": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "3000.000000", + "locked": false + }, + { + "address": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "2000.000000", + "locked": false + }, + { + "address": "XnKU1htBL5wFSMX8oytZBsBMeaBSbVNivT", + "coins": "2000.000000", + "locked": false + }, + { + "address": "pMub1Pz3SLVaSwHoomgp5oDVxdkVxLkW6L", + "coins": "2000.000000", + "locked": false + }, + { + "address": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", + "coins": "2000.000000", + "locked": false + }, + { + "address": "22WGCstVJGVyqnBuvGHt17L5aNNMpURvckd", + "coins": "2000.000000", + "locked": false + }, + { + "address": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", + "coins": "1500.000000", + "locked": false + }, + { + "address": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "1290.000000", + "locked": false + }, + { + "address": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", + "coins": "1100.000000", + "locked": false + }, + { + "address": "sV8sVBgs11uHQtZK5MPbYem2iJ6Hehghv7", + "coins": "1100.000000", + "locked": false + }, + { + "address": "2acnXsnJ2k8jxiUahtBe8h4xouPAnpbwwjc", + "coins": "1100.000000", + "locked": false + }, + { + "address": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "1010.000000", + "locked": false + }, + { + "address": "ZWhZtjwXMS46cpDxfRwQyxxKPhqwsQu8oN", + "coins": "1002.000000", + "locked": false + }, + { + "address": "2LZzgdFYNhsBBSLATkV6PA1zk6DvWNghP2", + "coins": "1000.000000", + "locked": false + }, + { + "address": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "1000.000000", + "locked": false + }, + { + "address": "CDD8GoJUHEvBm1pD3BQ3hEC2KcJNhvUzpu", + "coins": "1000.000000", + "locked": false + }, + { + "address": "FtdApqw416skWtXM7ExanZWFmiHNPZ1Ft6", + "coins": "1000.000000", + "locked": false + }, + { + "address": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "1000.000000", + "locked": false + }, + { + "address": "22Piwuzo8ZfoXfpMghhbzGz3ptmTeiDhLbg", + "coins": "1000.000000", + "locked": false + }, + { + "address": "2H7mA88ireMKHqP9LYWK5opnU176v7eYqrn", + "coins": "1000.000000", + "locked": false + }, + { + "address": "2U1B6EE5ZCXWJJSyEndouuCk434xpvYqYDF", + "coins": "1000.000000", + "locked": false + }, + { + "address": "2kN23viEG7Kn3Utuwz9voM4Z8ohLR9Y8L2v", + "coins": "500.000000", + "locked": false + }, + { + "address": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "110.000000", + "locked": false + }, + { + "address": "aPF9pL9sVEiyEVhynp3s1dmqLetP1BJrW6", + "coins": "100.000000", + "locked": false + }, + { + "address": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", + "coins": "100.000000", + "locked": false + }, + { + "address": "2A2YC8kxWnUDbscpzZ6UPfNAmx5ddKBeYNs", + "coins": "100.000000", + "locked": false + }, + { + "address": "38cVLswijqC2ANV5HxTroeapQzqeoBR88C", + "coins": "12.000000", + "locked": false + }, + { + "address": "odhAMxHhXoBdx1RHNmfu7dTZ1LZivfsbiH", + "coins": "10.000000", + "locked": false + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/richlist-8.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/richlist-8.golden new file mode 100644 index 00000000..7aade80e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/richlist-8.golden @@ -0,0 +1,44 @@ +{ + "richlist": [ + { + "address": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "63083.000000", + "locked": false + }, + { + "address": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "38105.000000", + "locked": false + }, + { + "address": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "27045.000000", + "locked": false + }, + { + "address": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "27000.000000", + "locked": false + }, + { + "address": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26400.000000", + "locked": false + }, + { + "address": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "locked": false + }, + { + "address": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "22000.000000", + "locked": false + }, + { + "address": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "21500.000000", + "locked": false + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/richlist-all-include-distribution.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/richlist-all-include-distribution.golden new file mode 100644 index 00000000..01bf8a1e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/richlist-all-include-distribution.golden @@ -0,0 +1,779 @@ +{ + "richlist": [ + { + "address": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "locked": false + }, + { + "address": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "63083.000000", + "locked": false + }, + { + "address": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "38105.000000", + "locked": false + }, + { + "address": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "27045.000000", + "locked": false + }, + { + "address": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "27000.000000", + "locked": false + }, + { + "address": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26400.000000", + "locked": false + }, + { + "address": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "locked": false + }, + { + "address": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "22000.000000", + "locked": false + }, + { + "address": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "21500.000000", + "locked": false + }, + { + "address": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "18000.000000", + "locked": false + }, + { + "address": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "14600.000000", + "locked": false + }, + { + "address": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "12000.000000", + "locked": false + }, + { + "address": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", + "coins": "10100.000000", + "locked": false + }, + { + "address": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "10060.000000", + "locked": false + }, + { + "address": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10000.000000", + "locked": false + }, + { + "address": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "6700.000000", + "locked": false + }, + { + "address": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", + "coins": "5100.000000", + "locked": false + }, + { + "address": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "4955.000000", + "locked": false + }, + { + "address": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "3400.000000", + "locked": false + }, + { + "address": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", + "coins": "3100.000000", + "locked": false + }, + { + "address": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "3000.000000", + "locked": false + }, + { + "address": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "3000.000000", + "locked": false + }, + { + "address": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "3000.000000", + "locked": false + }, + { + "address": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "3000.000000", + "locked": false + }, + { + "address": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "2000.000000", + "locked": false + }, + { + "address": "XnKU1htBL5wFSMX8oytZBsBMeaBSbVNivT", + "coins": "2000.000000", + "locked": false + }, + { + "address": "pMub1Pz3SLVaSwHoomgp5oDVxdkVxLkW6L", + "coins": "2000.000000", + "locked": false + }, + { + "address": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", + "coins": "2000.000000", + "locked": false + }, + { + "address": "22WGCstVJGVyqnBuvGHt17L5aNNMpURvckd", + "coins": "2000.000000", + "locked": false + }, + { + "address": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", + "coins": "1500.000000", + "locked": false + }, + { + "address": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "1290.000000", + "locked": false + }, + { + "address": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", + "coins": "1100.000000", + "locked": false + }, + { + "address": "sV8sVBgs11uHQtZK5MPbYem2iJ6Hehghv7", + "coins": "1100.000000", + "locked": false + }, + { + "address": "2acnXsnJ2k8jxiUahtBe8h4xouPAnpbwwjc", + "coins": "1100.000000", + "locked": false + }, + { + "address": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "1010.000000", + "locked": false + }, + { + "address": "ZWhZtjwXMS46cpDxfRwQyxxKPhqwsQu8oN", + "coins": "1002.000000", + "locked": false + }, + { + "address": "2LZzgdFYNhsBBSLATkV6PA1zk6DvWNghP2", + "coins": "1000.000000", + "locked": false + }, + { + "address": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "1000.000000", + "locked": false + }, + { + "address": "CDD8GoJUHEvBm1pD3BQ3hEC2KcJNhvUzpu", + "coins": "1000.000000", + "locked": false + }, + { + "address": "FtdApqw416skWtXM7ExanZWFmiHNPZ1Ft6", + "coins": "1000.000000", + "locked": false + }, + { + "address": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "1000.000000", + "locked": false + }, + { + "address": "22Piwuzo8ZfoXfpMghhbzGz3ptmTeiDhLbg", + "coins": "1000.000000", + "locked": false + }, + { + "address": "2H7mA88ireMKHqP9LYWK5opnU176v7eYqrn", + "coins": "1000.000000", + "locked": false + }, + { + "address": "2U1B6EE5ZCXWJJSyEndouuCk434xpvYqYDF", + "coins": "1000.000000", + "locked": false + }, + { + "address": "2kN23viEG7Kn3Utuwz9voM4Z8ohLR9Y8L2v", + "coins": "500.000000", + "locked": false + }, + { + "address": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "110.000000", + "locked": false + }, + { + "address": "aPF9pL9sVEiyEVhynp3s1dmqLetP1BJrW6", + "coins": "100.000000", + "locked": false + }, + { + "address": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", + "coins": "100.000000", + "locked": false + }, + { + "address": "2A2YC8kxWnUDbscpzZ6UPfNAmx5ddKBeYNs", + "coins": "100.000000", + "locked": false + }, + { + "address": "38cVLswijqC2ANV5HxTroeapQzqeoBR88C", + "coins": "12.000000", + "locked": false + }, + { + "address": "odhAMxHhXoBdx1RHNmfu7dTZ1LZivfsbiH", + "coins": "10.000000", + "locked": false + }, + { + "address": "j6pa8kdKqHbxRm2VXJVbzigQDFzqTVfvfq", + "coins": "5.000000", + "locked": false + }, + { + "address": "2apVG7f24ezDK13yCDTqBWYrTZpuj94KnCN", + "coins": "5.000000", + "locked": false + }, + { + "address": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "3.000000", + "locked": false + }, + { + "address": "PRXLNyB64cqaiG4pCoFZZ8Tuv7LWYPpa7m", + "coins": "3.000000", + "locked": false + }, + { + "address": "2bvEzLx4mgyQkYL5bkSc2rD9V1nqWBqn8vp", + "coins": "2.000000", + "locked": false + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/richlist-all.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/richlist-all.golden new file mode 100644 index 00000000..8db70a9b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/richlist-all.golden @@ -0,0 +1,279 @@ +{ + "richlist": [ + { + "address": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "63083.000000", + "locked": false + }, + { + "address": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "38105.000000", + "locked": false + }, + { + "address": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "27045.000000", + "locked": false + }, + { + "address": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "27000.000000", + "locked": false + }, + { + "address": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26400.000000", + "locked": false + }, + { + "address": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "locked": false + }, + { + "address": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "22000.000000", + "locked": false + }, + { + "address": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "21500.000000", + "locked": false + }, + { + "address": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "18000.000000", + "locked": false + }, + { + "address": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "14600.000000", + "locked": false + }, + { + "address": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "12000.000000", + "locked": false + }, + { + "address": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", + "coins": "10100.000000", + "locked": false + }, + { + "address": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "10060.000000", + "locked": false + }, + { + "address": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10000.000000", + "locked": false + }, + { + "address": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "6700.000000", + "locked": false + }, + { + "address": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", + "coins": "5100.000000", + "locked": false + }, + { + "address": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "4955.000000", + "locked": false + }, + { + "address": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "3400.000000", + "locked": false + }, + { + "address": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", + "coins": "3100.000000", + "locked": false + }, + { + "address": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "3000.000000", + "locked": false + }, + { + "address": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "3000.000000", + "locked": false + }, + { + "address": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "3000.000000", + "locked": false + }, + { + "address": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "3000.000000", + "locked": false + }, + { + "address": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "2000.000000", + "locked": false + }, + { + "address": "XnKU1htBL5wFSMX8oytZBsBMeaBSbVNivT", + "coins": "2000.000000", + "locked": false + }, + { + "address": "pMub1Pz3SLVaSwHoomgp5oDVxdkVxLkW6L", + "coins": "2000.000000", + "locked": false + }, + { + "address": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", + "coins": "2000.000000", + "locked": false + }, + { + "address": "22WGCstVJGVyqnBuvGHt17L5aNNMpURvckd", + "coins": "2000.000000", + "locked": false + }, + { + "address": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", + "coins": "1500.000000", + "locked": false + }, + { + "address": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "1290.000000", + "locked": false + }, + { + "address": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", + "coins": "1100.000000", + "locked": false + }, + { + "address": "sV8sVBgs11uHQtZK5MPbYem2iJ6Hehghv7", + "coins": "1100.000000", + "locked": false + }, + { + "address": "2acnXsnJ2k8jxiUahtBe8h4xouPAnpbwwjc", + "coins": "1100.000000", + "locked": false + }, + { + "address": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "1010.000000", + "locked": false + }, + { + "address": "ZWhZtjwXMS46cpDxfRwQyxxKPhqwsQu8oN", + "coins": "1002.000000", + "locked": false + }, + { + "address": "2LZzgdFYNhsBBSLATkV6PA1zk6DvWNghP2", + "coins": "1000.000000", + "locked": false + }, + { + "address": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "1000.000000", + "locked": false + }, + { + "address": "CDD8GoJUHEvBm1pD3BQ3hEC2KcJNhvUzpu", + "coins": "1000.000000", + "locked": false + }, + { + "address": "FtdApqw416skWtXM7ExanZWFmiHNPZ1Ft6", + "coins": "1000.000000", + "locked": false + }, + { + "address": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "1000.000000", + "locked": false + }, + { + "address": "22Piwuzo8ZfoXfpMghhbzGz3ptmTeiDhLbg", + "coins": "1000.000000", + "locked": false + }, + { + "address": "2H7mA88ireMKHqP9LYWK5opnU176v7eYqrn", + "coins": "1000.000000", + "locked": false + }, + { + "address": "2U1B6EE5ZCXWJJSyEndouuCk434xpvYqYDF", + "coins": "1000.000000", + "locked": false + }, + { + "address": "2kN23viEG7Kn3Utuwz9voM4Z8ohLR9Y8L2v", + "coins": "500.000000", + "locked": false + }, + { + "address": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "110.000000", + "locked": false + }, + { + "address": "aPF9pL9sVEiyEVhynp3s1dmqLetP1BJrW6", + "coins": "100.000000", + "locked": false + }, + { + "address": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", + "coins": "100.000000", + "locked": false + }, + { + "address": "2A2YC8kxWnUDbscpzZ6UPfNAmx5ddKBeYNs", + "coins": "100.000000", + "locked": false + }, + { + "address": "38cVLswijqC2ANV5HxTroeapQzqeoBR88C", + "coins": "12.000000", + "locked": false + }, + { + "address": "odhAMxHhXoBdx1RHNmfu7dTZ1LZivfsbiH", + "coins": "10.000000", + "locked": false + }, + { + "address": "j6pa8kdKqHbxRm2VXJVbzigQDFzqTVfvfq", + "coins": "5.000000", + "locked": false + }, + { + "address": "2apVG7f24ezDK13yCDTqBWYrTZpuj94KnCN", + "coins": "5.000000", + "locked": false + }, + { + "address": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "3.000000", + "locked": false + }, + { + "address": "PRXLNyB64cqaiG4pCoFZZ8Tuv7LWYPpa7m", + "coins": "3.000000", + "locked": false + }, + { + "address": "2bvEzLx4mgyQkYL5bkSc2rD9V1nqWBqn8vp", + "coins": "2.000000", + "locked": false + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/richlist-default.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/richlist-default.golden new file mode 100644 index 00000000..2c6b03a0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/richlist-default.golden @@ -0,0 +1,104 @@ +{ + "richlist": [ + { + "address": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "63083.000000", + "locked": false + }, + { + "address": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "38105.000000", + "locked": false + }, + { + "address": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "27045.000000", + "locked": false + }, + { + "address": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "27000.000000", + "locked": false + }, + { + "address": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26400.000000", + "locked": false + }, + { + "address": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "locked": false + }, + { + "address": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "22000.000000", + "locked": false + }, + { + "address": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "21500.000000", + "locked": false + }, + { + "address": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "18000.000000", + "locked": false + }, + { + "address": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "14600.000000", + "locked": false + }, + { + "address": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "12000.000000", + "locked": false + }, + { + "address": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", + "coins": "10100.000000", + "locked": false + }, + { + "address": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "10060.000000", + "locked": false + }, + { + "address": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10000.000000", + "locked": false + }, + { + "address": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "6700.000000", + "locked": false + }, + { + "address": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", + "coins": "5100.000000", + "locked": false + }, + { + "address": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "4955.000000", + "locked": false + }, + { + "address": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "3400.000000", + "locked": false + }, + { + "address": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", + "coins": "3100.000000", + "locked": false + }, + { + "address": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "3000.000000", + "locked": false + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/single-addr-transactions-verbose.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/single-addr-transactions-verbose.golden new file mode 100644 index 00000000..e2776cc3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/single-addr-transactions-verbose.golden @@ -0,0 +1,262 @@ +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 128, + "block_seq": 53 + }, + "time": 1429077514, + "txn": { + "timestamp": 1429077514, + "length": 220, + "type": 0, + "txid": "d154d8262abbf517c67d529b0fea7cdf097433bd296d5795b17c6379cb1b1430", + "inner_hash": "b69070b10e6bbc276bf155361d7f3238fec46b9d865075c1dc0fc20d81ab0a42", + "fee": 17787, + "sigs": [ + "0a4b7f385a164f5718794382d49c14a6623e7af5f1ddbefe4871c756b754457a7075e822603bd3b22b313278abebe756be92367ef7a81a8c4adf992842c2058601" + ], + "inputs": [ + { + "uxid": "e6d9b56e075a6adf520d1ae7fbab9ae06353ae0b93dc8cb17d82cc3628009a50", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944750.000000", + "hours": 97, + "calculated_hours": 23715 + } + ], + "outputs": [ + { + "uxid": "2df1e88589be43c55d7c6c3dbcbd663fb759b3245eb8d86b0b9cdaa989556aea", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "943750.000000", + "hours": 2964 + }, + { + "uxid": "c7919b892eeb751456d456b37ccde7350a3fca0dda03b17ec426a56f12dcf192", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1000.000000", + "hours": 2964 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 108, + "block_seq": 73 + }, + "time": 1429091164, + "txn": { + "timestamp": 1429091164, + "length": 220, + "type": 0, + "txid": "a95317361364e8cc08a150840bac8a97ea1f56278f8834ca2a2f16c24c4a7f0f", + "inner_hash": "90c166e92a7883037f9634704923d986976ac814f28e4761309bf86d77cdb755", + "fee": 2326, + "sigs": [ + "27ee3b614e5362462bc20c23e873e380b5bcc880053436a640286ead5fe2dcd00094e0eade532ffbfc8ba95d5e3540968b2fff64e19e0e772342aceb3c5d3ce100" + ], + "inputs": [ + { + "uxid": "c7919b892eeb751456d456b37ccde7350a3fca0dda03b17ec426a56f12dcf192", + "owner": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1000.000000", + "hours": 2964, + "calculated_hours": 3100 + } + ], + "outputs": [ + { + "uxid": "7b132c07322babefa83ab64971b7bfb29bf2cb9ffe9c42dc7e2975a185dcd8b8", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "995.000000", + "hours": 387 + }, + { + "uxid": "8f52e126bbc359bc3bfd230d82649c3d1c622e8f9c20dae7ccd73bd0b4ee2bad", + "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "5.000000", + "hours": 387 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 68, + "block_seq": 113 + }, + "time": 1429348172, + "txn": { + "timestamp": 1429348172, + "length": 220, + "type": 0, + "txid": "1f27afc41896d2c7fdbd2620e606440ad12557e9a4bdd6808dcc2c23d4e32978", + "inner_hash": "4d53c05c731409feef7606cf9514904f4c7704537efb453ac2c439fcfe77a455", + "fee": 1041608, + "sigs": [ + "e36cef84c1c6f999dba462f3134131c105da2255eaf21550ce30ee52a14a33d529a7cd0c37b3883d0d57429b163b4905271c7b1a4d951b4a521f245c7857dd5c01" + ], + "inputs": [ + { + "uxid": "1d4595b9fa1c6c3d64f48b6ae5f8f861b1c08a022cbcb04b279df448da3db660", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873900.000000", + "hours": 1388810, + "calculated_hours": 1388810 + } + ], + "outputs": [ + { + "uxid": "412eff3eef889c682da8db3608fce37d1c5ee2cc297bc88d901648e6ccd418f9", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873800.000000", + "hours": 173601 + }, + { + "uxid": "c961ba554ae30b0edcdf71e834ab2b26d7dff5bcf5955d4874cdba89170392bf", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "100.000000", + "hours": 173601 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 63, + "block_seq": 118 + }, + "time": 1429364072, + "txn": { + "timestamp": 1429364072, + "length": 317, + "type": 0, + "txid": "a83e09e976b038d86491d8c029aec84a6313dc33e692da6ce50a2858e50c4666", + "inner_hash": "86b47008bbeb60335762ba70b5bdf8128f09b3f8fff6ec6e5d9553763a5b5cef", + "fee": 184620, + "sigs": [ + "48312c1abe5617609f70a882689f194e8d18c0b56d153adfae4be08bf00d723c6cda6dbd885e7ed7f92c7b7065d583adfd5f18bb37da9b796a394f4a388e978d01", + "4826477aed0387ca448b8225a5d27ebe6824b460d0581fb8ccb5078a865cd8171e7f5c860091a99cc85b1571dce8a550659cb3d02902a77cd1f6d0d27277bdee01" + ], + "inputs": [ + { + "uxid": "7b132c07322babefa83ab64971b7bfb29bf2cb9ffe9c42dc7e2975a185dcd8b8", + "owner": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "995.000000", + "hours": 387, + "calculated_hours": 72454 + }, + { + "uxid": "c961ba554ae30b0edcdf71e834ab2b26d7dff5bcf5955d4874cdba89170392bf", + "owner": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "100.000000", + "hours": 173601, + "calculated_hours": 173704 + } + ], + "outputs": [ + { + "uxid": "3408638af298419b14a49e8e9dd69e97c9a06827d74edf9f410a870662360b31", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1045.000000", + "hours": 30769 + }, + { + "uxid": "ba0a94662846565969d361b1b7c248847a48e69f2b9eefb4ffb0bc2efc56a8fd", + "dst": "38cVLswijqC2ANV5HxTroeapQzqeoBR88C", + "coins": "50.000000", + "hours": 30769 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 61, + "block_seq": 120 + }, + "time": 1429364452, + "txn": { + "timestamp": 1429364452, + "length": 183, + "type": 0, + "txid": "d1569ca879f98450a920a2b427ab0e1d21342308fb6b4ea5031ee6e718217183", + "inner_hash": "12d27fdba804c648b8f72d9740d4021b05c88c95d3595af4afab2150092c5eee", + "fee": 3366, + "sigs": [ + "2baa243ca1b82bd9fc1a31a0b53c9f7eb0ad62b19d6a4d3af62579cc2dc455d81d8ed82ba342dc650d4ae38718d81a8df6a93a9a809749a2f5391894bbaf298400" + ], + "inputs": [ + { + "uxid": "f480c6097568036b90a2e019f9ee68c0812b2da8828be33a005a7427caf14a2b", + "owner": "f38daJDg8rpwL5xWgMY78fBHncQ1N5gQZ7", + "coins": "38.000000", + "hours": 3846, + "calculated_hours": 3846 + } + ], + "outputs": [ + { + "uxid": "3f9712cab0d3aeb217f1751fa19e53d75f814b4218866d4e70d63f32271d2023", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "38.000000", + "hours": 480 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 60, + "block_seq": 121 + }, + "time": 1429382678, + "txn": { + "timestamp": 1429382678, + "length": 220, + "type": 0, + "txid": "da82deafc15c36e7dc9cd95663e0dc910ae626ee543147ac7bd8682be00f7baf", + "inner_hash": "c98f858a27e76b0b565baaa3dffc6cfc7b0ffe9dd7d2d71f4bb0ad4d1c439ca2", + "fee": 2271879, + "sigs": [ + "15fccdc36c966a9571196a3f727ebda47162441df2d9965ac27109ac56d22cb41638b404e84b5b388d809b814ade18022cba0a6e021140c6b7d0144a6facd6d501" + ], + "inputs": [ + { + "uxid": "6beca9fb58a327580c614d7fb5622916849756790b661bcabc880666364fdf47", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863600.000000", + "hours": 20965, + "calculated_hours": 3029171 + } + ], + "outputs": [ + { + "uxid": "f8a1990492f970227ec29e6e095fa724d66fa2d6883bd8723773098d08ca8b3c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "801600.000000", + "hours": 378646 + }, + { + "uxid": "e5596ef0ba04ad9e0adbe0355a24c6bef249654906f917b68f8f0cf072508674", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "62000.000000", + "hours": 378646 + } + ] + } + } +] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/single-addr-transactions.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/single-addr-transactions.golden new file mode 100644 index 00000000..ea3846f1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/single-addr-transactions.golden @@ -0,0 +1,214 @@ +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 128, + "block_seq": 53 + }, + "time": 1429077514, + "txn": { + "timestamp": 1429077514, + "length": 220, + "type": 0, + "txid": "d154d8262abbf517c67d529b0fea7cdf097433bd296d5795b17c6379cb1b1430", + "inner_hash": "b69070b10e6bbc276bf155361d7f3238fec46b9d865075c1dc0fc20d81ab0a42", + "sigs": [ + "0a4b7f385a164f5718794382d49c14a6623e7af5f1ddbefe4871c756b754457a7075e822603bd3b22b313278abebe756be92367ef7a81a8c4adf992842c2058601" + ], + "inputs": [ + "e6d9b56e075a6adf520d1ae7fbab9ae06353ae0b93dc8cb17d82cc3628009a50" + ], + "outputs": [ + { + "uxid": "2df1e88589be43c55d7c6c3dbcbd663fb759b3245eb8d86b0b9cdaa989556aea", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "943750.000000", + "hours": 2964 + }, + { + "uxid": "c7919b892eeb751456d456b37ccde7350a3fca0dda03b17ec426a56f12dcf192", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1000.000000", + "hours": 2964 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 108, + "block_seq": 73 + }, + "time": 1429091164, + "txn": { + "timestamp": 1429091164, + "length": 220, + "type": 0, + "txid": "a95317361364e8cc08a150840bac8a97ea1f56278f8834ca2a2f16c24c4a7f0f", + "inner_hash": "90c166e92a7883037f9634704923d986976ac814f28e4761309bf86d77cdb755", + "sigs": [ + "27ee3b614e5362462bc20c23e873e380b5bcc880053436a640286ead5fe2dcd00094e0eade532ffbfc8ba95d5e3540968b2fff64e19e0e772342aceb3c5d3ce100" + ], + "inputs": [ + "c7919b892eeb751456d456b37ccde7350a3fca0dda03b17ec426a56f12dcf192" + ], + "outputs": [ + { + "uxid": "7b132c07322babefa83ab64971b7bfb29bf2cb9ffe9c42dc7e2975a185dcd8b8", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "995.000000", + "hours": 387 + }, + { + "uxid": "8f52e126bbc359bc3bfd230d82649c3d1c622e8f9c20dae7ccd73bd0b4ee2bad", + "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "5.000000", + "hours": 387 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 68, + "block_seq": 113 + }, + "time": 1429348172, + "txn": { + "timestamp": 1429348172, + "length": 220, + "type": 0, + "txid": "1f27afc41896d2c7fdbd2620e606440ad12557e9a4bdd6808dcc2c23d4e32978", + "inner_hash": "4d53c05c731409feef7606cf9514904f4c7704537efb453ac2c439fcfe77a455", + "sigs": [ + "e36cef84c1c6f999dba462f3134131c105da2255eaf21550ce30ee52a14a33d529a7cd0c37b3883d0d57429b163b4905271c7b1a4d951b4a521f245c7857dd5c01" + ], + "inputs": [ + "1d4595b9fa1c6c3d64f48b6ae5f8f861b1c08a022cbcb04b279df448da3db660" + ], + "outputs": [ + { + "uxid": "412eff3eef889c682da8db3608fce37d1c5ee2cc297bc88d901648e6ccd418f9", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873800.000000", + "hours": 173601 + }, + { + "uxid": "c961ba554ae30b0edcdf71e834ab2b26d7dff5bcf5955d4874cdba89170392bf", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "100.000000", + "hours": 173601 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 63, + "block_seq": 118 + }, + "time": 1429364072, + "txn": { + "timestamp": 1429364072, + "length": 317, + "type": 0, + "txid": "a83e09e976b038d86491d8c029aec84a6313dc33e692da6ce50a2858e50c4666", + "inner_hash": "86b47008bbeb60335762ba70b5bdf8128f09b3f8fff6ec6e5d9553763a5b5cef", + "sigs": [ + "48312c1abe5617609f70a882689f194e8d18c0b56d153adfae4be08bf00d723c6cda6dbd885e7ed7f92c7b7065d583adfd5f18bb37da9b796a394f4a388e978d01", + "4826477aed0387ca448b8225a5d27ebe6824b460d0581fb8ccb5078a865cd8171e7f5c860091a99cc85b1571dce8a550659cb3d02902a77cd1f6d0d27277bdee01" + ], + "inputs": [ + "7b132c07322babefa83ab64971b7bfb29bf2cb9ffe9c42dc7e2975a185dcd8b8", + "c961ba554ae30b0edcdf71e834ab2b26d7dff5bcf5955d4874cdba89170392bf" + ], + "outputs": [ + { + "uxid": "3408638af298419b14a49e8e9dd69e97c9a06827d74edf9f410a870662360b31", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1045.000000", + "hours": 30769 + }, + { + "uxid": "ba0a94662846565969d361b1b7c248847a48e69f2b9eefb4ffb0bc2efc56a8fd", + "dst": "38cVLswijqC2ANV5HxTroeapQzqeoBR88C", + "coins": "50.000000", + "hours": 30769 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 61, + "block_seq": 120 + }, + "time": 1429364452, + "txn": { + "timestamp": 1429364452, + "length": 183, + "type": 0, + "txid": "d1569ca879f98450a920a2b427ab0e1d21342308fb6b4ea5031ee6e718217183", + "inner_hash": "12d27fdba804c648b8f72d9740d4021b05c88c95d3595af4afab2150092c5eee", + "sigs": [ + "2baa243ca1b82bd9fc1a31a0b53c9f7eb0ad62b19d6a4d3af62579cc2dc455d81d8ed82ba342dc650d4ae38718d81a8df6a93a9a809749a2f5391894bbaf298400" + ], + "inputs": [ + "f480c6097568036b90a2e019f9ee68c0812b2da8828be33a005a7427caf14a2b" + ], + "outputs": [ + { + "uxid": "3f9712cab0d3aeb217f1751fa19e53d75f814b4218866d4e70d63f32271d2023", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "38.000000", + "hours": 480 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 60, + "block_seq": 121 + }, + "time": 1429382678, + "txn": { + "timestamp": 1429382678, + "length": 220, + "type": 0, + "txid": "da82deafc15c36e7dc9cd95663e0dc910ae626ee543147ac7bd8682be00f7baf", + "inner_hash": "c98f858a27e76b0b565baaa3dffc6cfc7b0ffe9dd7d2d71f4bb0ad4d1c439ca2", + "sigs": [ + "15fccdc36c966a9571196a3f727ebda47162441df2d9965ac27109ac56d22cb41638b404e84b5b388d809b814ade18022cba0a6e021140c6b7d0144a6facd6d501" + ], + "inputs": [ + "6beca9fb58a327580c614d7fb5622916849756790b661bcabc880666364fdf47" + ], + "outputs": [ + { + "uxid": "f8a1990492f970227ec29e6e095fa724d66fa2d6883bd8723773098d08ca8b3c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "801600.000000", + "hours": 378646 + }, + { + "uxid": "e5596ef0ba04ad9e0adbe0355a24c6bef249654906f917b68f8f0cf072508674", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "62000.000000", + "hours": 378646 + } + ] + } + } +] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-block-101.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-block-101.golden new file mode 100644 index 00000000..23ef8dc1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-block-101.golden @@ -0,0 +1,30 @@ +{ + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 80, + "block_seq": 101 + }, + "time": 1429274666, + "txn": { + "timestamp": 1429274666, + "length": 183, + "type": 0, + "txid": "e8fe5290afba3933389fd5860dca2cbcc81821028be9c65d0bb7cf4e8d2c4c18", + "inner_hash": "45da31b68748eafdb08ef8bf1ebd1c07c0f14fcb0d66759d6cf4642adc956d06", + "sigs": [ + "09bce2c888ceceeb19999005cceb1efdee254cacb60edee118b51ffd740ff6503a8f9cbd60a16c7581bfd64f7529b649d0ecc8adbe913686da97fe8c6543189001" + ], + "inputs": [ + "6002f3afc7054c0e1161bcf2b4c1d4d1009440751bc1fe806e0eae33291399f4" + ], + "outputs": [ + { + "uxid": "f9bffdcbe252acb1c3a8a1e8c99829342ba1963860d5692eebaeb9bcfbcaf274", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "27000.000000", + "hours": 102905 + } + ] + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-block-517.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-block-517.golden new file mode 100644 index 00000000..f4f87764 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-block-517.golden @@ -0,0 +1,38 @@ +{ + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 517 + }, + "time": 1479100522, + "txn": { + "length": 317, + "type": 0, + "txid": "76ecbabc53ea2a3be46983058433dda6a3cf7ea0b86ba14d90b932fa97385de7", + "inner_hash": "5d55837bb0cbda9c9323ff9aafd7c3d31d0d38638346172fbe2d9078ebaa892a", + "timestamp": 1479100522, + "sigs": [ + "464b7724302178c1cfeacadaaf3556a3b7e5259adf51919476c3acc695747ed244b5ce2187ce7bedb6ad65c71f7f7ff3fa6805e64fe5da3aaa00ad563c7424f600", + "1155537b0391d4a6ee5eac07dee5798e953dca3a7c30643403dd2d326582c7d35080a16dc22644782ce1087bfc3bd06c2bf68e9a98e3989d90831646a9be2c9101" + ], + "inputs": [ + "782a8662efb0e933cab7d3ae9429ab53c4208cf44d8cdc07c2fbd7204b6b5cad", + "2f6b61a44086588c4eaa56a5dd9f1e0be2528861a6731608fcec38891b95db91" + ], + "outputs": [ + { + "uxid": "bd302ef776efa8548183b89f21e90649f21b90fe2d2e90ecc1b880f2d995f226", + "dst": "2UXZTg4ZHF6715b6tRhtaqceuQQ3G79GiZg", + "coins": "998.000000", + "hours": 247538 + }, + { + "uxid": "31058b6bfb30bfd441aec00929e75782bce47c8a75787ba519dbb268f89d2c4b", + "dst": "2awsJ2CR5H6QXCF2hwDjcvcAH9SgyfxCxgz", + "coins": "1.000000", + "hours": 247538 + } + ] + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-encoded-block-101.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-encoded-block-101.golden new file mode 100644 index 00000000..6c074e02 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-encoded-block-101.golden @@ -0,0 +1,10 @@ +{ + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 80, + "block_seq": 101 + }, + "time": 1429274666, + "encoded_transaction": "b70000000045da31b68748eafdb08ef8bf1ebd1c07c0f14fcb0d66759d6cf4642adc956d060100000009bce2c888ceceeb19999005cceb1efdee254cacb60edee118b51ffd740ff6503a8f9cbd60a16c7581bfd64f7529b649d0ecc8adbe913686da97fe8c6543189001010000006002f3afc7054c0e1161bcf2b4c1d4d1009440751bc1fe806e0eae33291399f401000000003be2537f8c0893fddcddc878518f38ea493d949e004e534906000000f991010000000000" +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-encoded-block-105.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-encoded-block-105.golden new file mode 100644 index 00000000..1a531fff --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-encoded-block-105.golden @@ -0,0 +1,10 @@ +{ + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 76, + "block_seq": 105 + }, + "time": 1429278556, + "encoded_transaction": "dc00000000614d7754fa0633e1a701eea3b3a2ce1c2815360f311cd1cb6cf46d5ae94304ba01000000bd20e6b6754308d192ba734a573ec4363dae5326b9b21a7203904c076b067bf9313df1df8ac8960f12d9d8b642deb411a504512990181bc2e53264cf661b868f00010000001e30e9dfe00e055404063e52a4154a72492b13de6acf4871ec5ea6d7c0fcc9680200000000bb202804300d62db2fcfae5ee720eeb28493e3f800e9852b0600000045070000000000000083fb4cc7a3ee6548f47b5967e2c48bc74e3b2ff400e1f505000000004507000000000000" +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-encoded.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-encoded.golden new file mode 100644 index 00000000..087063a9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-encoded.golden @@ -0,0 +1,10 @@ +{ + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 517 + }, + "time": 1479100522, + "encoded_transaction": "3d010000005d55837bb0cbda9c9323ff9aafd7c3d31d0d38638346172fbe2d9078ebaa892a02000000464b7724302178c1cfeacadaaf3556a3b7e5259adf51919476c3acc695747ed244b5ce2187ce7bedb6ad65c71f7f7ff3fa6805e64fe5da3aaa00ad563c7424f6001155537b0391d4a6ee5eac07dee5798e953dca3a7c30643403dd2d326582c7d35080a16dc22644782ce1087bfc3bd06c2bf68e9a98e3989d90831646a9be2c910102000000782a8662efb0e933cab7d3ae9429ab53c4208cf44d8cdc07c2fbd7204b6b5cad2f6b61a44086588c4eaa56a5dd9f1e0be2528861a6731608fcec38891b95db910200000000d48d9376d63dc1a1e97d6ae0abcb3bb05d3bbedb80457c3b00000000f2c603000000000000e48181af6ff468288eb5e4f550549a2d73c0e79940420f0000000000f2c6030000000000" +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-unconfirmed-encoded.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-unconfirmed-encoded.golden new file mode 100644 index 00000000..444c33a9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-unconfirmed-encoded.golden @@ -0,0 +1,10 @@ +{ + "status": { + "confirmed": false, + "unconfirmed": true, + "height": 0, + "block_seq": 0 + }, + "time": 1535637620, + "encoded_transaction": "dc00000000f8293dbfdddcc56a97664655ceee650715d35a0dda32a9f0ce0e2e99d4899124010000003981061c7275ae9cc936e902a5367fdd87ef779bbdb31e1e10d325d17a129abb34f6e597ceeaf67bb051774b41c58276004f6a63cb81de61d4693bc7a5536f320001000000fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f2002000000003be2537f8c0893fddcddc878518f38ea493d949e008988068d0000002739570000000000009037ff169fbec6db95e2537e4ff79396c050aeeb00e40b54020000002739570000000000" +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-unconfirmed-verbose.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-unconfirmed-verbose.golden new file mode 100644 index 00000000..7ee325f5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-unconfirmed-verbose.golden @@ -0,0 +1,43 @@ +{ + "status": { + "confirmed": false, + "unconfirmed": true, + "height": 0, + "block_seq": 0 + }, + "time": 1535637620, + "txn": { + "timestamp": 1535637620, + "length": 220, + "type": 0, + "txid": "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947", + "inner_hash": "f8293dbfdddcc56a97664655ceee650715d35a0dda32a9f0ce0e2e99d4899124", + "fee": 34297581, + "sigs": [ + "3981061c7275ae9cc936e902a5367fdd87ef779bbdb31e1e10d325d17a129abb34f6e597ceeaf67bb051774b41c58276004f6a63cb81de61d4693bc7a5536f3200" + ], + "inputs": [ + { + "uxid": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "hours": 5521648, + "calculated_hours": 45730107 + } + ], + "outputs": [ + { + "uxid": "8f9c09c37e0c636178e4229e2e8212c067ef0a8c501be9e2757a97b980d7a98a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "605700.000000", + "hours": 5716263 + }, + { + "uxid": "32a060b2e2025cceb40f3f982c887952d3358d468db1719dd892eab575c14c14", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10000.000000", + "hours": 5716263 + } + ] + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-unconfirmed.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-unconfirmed.golden new file mode 100644 index 00000000..0462adc0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-unconfirmed.golden @@ -0,0 +1,36 @@ +{ + "status": { + "confirmed": false, + "unconfirmed": true, + "height": 0, + "block_seq": 0 + }, + "time": 1535637620, + "txn": { + "timestamp": 1535637620, + "length": 220, + "type": 0, + "txid": "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947", + "inner_hash": "f8293dbfdddcc56a97664655ceee650715d35a0dda32a9f0ce0e2e99d4899124", + "sigs": [ + "3981061c7275ae9cc936e902a5367fdd87ef779bbdb31e1e10d325d17a129abb34f6e597ceeaf67bb051774b41c58276004f6a63cb81de61d4693bc7a5536f3200" + ], + "inputs": [ + "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20" + ], + "outputs": [ + { + "uxid": "8f9c09c37e0c636178e4229e2e8212c067ef0a8c501be9e2757a97b980d7a98a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "605700.000000", + "hours": 5716263 + }, + { + "uxid": "32a060b2e2025cceb40f3f982c887952d3358d468db1719dd892eab575c14c14", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10000.000000", + "hours": 5716263 + } + ] + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-verbose-block-101.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-verbose-block-101.golden new file mode 100644 index 00000000..81f2b7e0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-verbose-block-101.golden @@ -0,0 +1,37 @@ +{ + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 80, + "block_seq": 101 + }, + "time": 1429274666, + "txn": { + "timestamp": 1429274666, + "length": 183, + "type": 0, + "txid": "e8fe5290afba3933389fd5860dca2cbcc81821028be9c65d0bb7cf4e8d2c4c18", + "inner_hash": "45da31b68748eafdb08ef8bf1ebd1c07c0f14fcb0d66759d6cf4642adc956d06", + "fee": 720335, + "sigs": [ + "09bce2c888ceceeb19999005cceb1efdee254cacb60edee118b51ffd740ff6503a8f9cbd60a16c7581bfd64f7529b649d0ecc8adbe913686da97fe8c6543189001" + ], + "inputs": [ + { + "uxid": "6002f3afc7054c0e1161bcf2b4c1d4d1009440751bc1fe806e0eae33291399f4", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "27000.000000", + "hours": 220, + "calculated_hours": 823240 + } + ], + "outputs": [ + { + "uxid": "f9bffdcbe252acb1c3a8a1e8c99829342ba1963860d5692eebaeb9bcfbcaf274", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "27000.000000", + "hours": 102905 + } + ] + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-verbose-block-517.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-verbose-block-517.golden new file mode 100644 index 00000000..7844d294 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/transaction-verbose-block-517.golden @@ -0,0 +1,51 @@ +{ + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 0, + "block_seq": 517 + }, + "time": 1479100522, + "txn": { + "timestamp": 1479100522, + "length": 317, + "type": 0, + "txid": "76ecbabc53ea2a3be46983058433dda6a3cf7ea0b86ba14d90b932fa97385de7", + "inner_hash": "5d55837bb0cbda9c9323ff9aafd7c3d31d0d38638346172fbe2d9078ebaa892a", + "fee": 1485232, + "sigs": [ + "464b7724302178c1cfeacadaaf3556a3b7e5259adf51919476c3acc695747ed244b5ce2187ce7bedb6ad65c71f7f7ff3fa6805e64fe5da3aaa00ad563c7424f600", + "1155537b0391d4a6ee5eac07dee5798e953dca3a7c30643403dd2d326582c7d35080a16dc22644782ce1087bfc3bd06c2bf68e9a98e3989d90831646a9be2c9101" + ], + "inputs": [ + { + "uxid": "782a8662efb0e933cab7d3ae9429ab53c4208cf44d8cdc07c2fbd7204b6b5cad", + "owner": "2UXZTg4ZHF6715b6tRhtaqceuQQ3G79GiZg", + "coins": "998.000000", + "hours": 230999, + "calculated_hours": 1718944 + }, + { + "uxid": "2f6b61a44086588c4eaa56a5dd9f1e0be2528861a6731608fcec38891b95db91", + "owner": "2UXZTg4ZHF6715b6tRhtaqceuQQ3G79GiZg", + "coins": "1.000000", + "hours": 259874, + "calculated_hours": 261364 + } + ], + "outputs": [ + { + "uxid": "bd302ef776efa8548183b89f21e90649f21b90fe2d2e90ecc1b880f2d995f226", + "dst": "2UXZTg4ZHF6715b6tRhtaqceuQQ3G79GiZg", + "coins": "998.000000", + "hours": 247538 + }, + { + "uxid": "31058b6bfb30bfd441aec00929e75782bce47c8a75787ba519dbb268f89d2c4b", + "dst": "2awsJ2CR5H6QXCF2hwDjcvcAH9SgyfxCxgz", + "coins": "1.000000", + "hours": 247538 + } + ] + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/unconfirmed-excluded-from-transactions-verbose.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/unconfirmed-excluded-from-transactions-verbose.golden new file mode 100644 index 00000000..579478b9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/unconfirmed-excluded-from-transactions-verbose.golden @@ -0,0 +1,125 @@ +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 17, + "block_seq": 164 + }, + "time": 1430790052, + "txn": { + "timestamp": 1430790052, + "length": 220, + "type": 0, + "txid": "743bf1eede313145824db1c4f8d683b74ab5e0bc825082d986308b73fd52f1d7", + "inner_hash": "a0427c37a8ca9f8205630cc8d4c6d95200413d3397a0de9bf015763107b8fc80", + "fee": 0, + "sigs": [ + "dc400e921f7f94da5f353846f1340e039b4527fff121a56579390fb4fa4154634e3b3aad44ddf0aaebea5abc1dc5ba2a00540fd2888ed5c4ab7b20c51255086a01" + ], + "inputs": [ + { + "uxid": "c07593d4329f82da243e4bbd7430e4b10e7b35f9ce0a3718d0e6d25d20b4939b", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "661314.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "4d52106e41dba0099549fd81fb8feb6915225b0125c53faa0f7c578ea78f213a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "660314.000000", + "hours": 0 + }, + { + "uxid": "bc513a68461d5c401e65a500baf7dfa163735ef63b817bb7b73c4139d5c29d18", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 12, + "block_seq": 169 + }, + "time": 1430836392, + "txn": { + "timestamp": 1430836392, + "length": 220, + "type": 0, + "txid": "acfb61f7ca39d5dfe33e8ed66f73ab181da0a3206d457bf055dcc4b9731a3ec8", + "inner_hash": "85c5d3963f2dce44e99500967e8b8b1943839537fb198186131459a3022d161a", + "fee": 421, + "sigs": [ + "473114dcb42e2091f3d0396ecd16ee2685e0a6074c7de218cbd7e7c4335d89146455bc6c259c77f40d4af769e241aba1e3a102c5755946b1783c817ffafa67d101" + ], + "inputs": [ + { + "uxid": "bc513a68461d5c401e65a500baf7dfa163735ef63b817bb7b73c4139d5c29d18", + "owner": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 561 + } + ], + "outputs": [ + { + "uxid": "639e69c4a223b5082b9274caf3e56ecff2ab55cd90cac94fdb4c383a1013ba1f", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "990.000000", + "hours": 70 + }, + { + "uxid": "bffea1990d71311b695b2d343b9f09a216b7a8257c1cdcb01b2ab9459e1490e3", + "dst": "jtuSERvfzN3kUYekg8LemCQ5kF5g97N8ZL", + "coins": "10.000000", + "hours": 70 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 11, + "block_seq": 170 + }, + "time": 1430836422, + "txn": { + "timestamp": 1430836422, + "length": 183, + "type": 0, + "txid": "95d847102c01d071982e67b8e7dfae50715b0fc0179d33f4b050974e634905e1", + "inner_hash": "c13b7e1722f3616f61948ed42382d4ed41164e7e2110d2d60bf86725f32531de", + "fee": 62, + "sigs": [ + "cb7da0e16b83f1717614c7f160580ac0048a4276682ac4046c3324ba6f4e24901d162f7ec81a8e5cdf3676df6ace9a73c77e4d3ab7f03a4f0272c75f3715665001" + ], + "inputs": [ + { + "uxid": "bffea1990d71311b695b2d343b9f09a216b7a8257c1cdcb01b2ab9459e1490e3", + "owner": "jtuSERvfzN3kUYekg8LemCQ5kF5g97N8ZL", + "coins": "10.000000", + "hours": 70, + "calculated_hours": 70 + } + ], + "outputs": [ + { + "uxid": "be081639ea8da63d8542707e9ea9625f6afc97da132f43ed061645c359bb1e65", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10.000000", + "hours": 8 + } + ] + } + } +] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/unconfirmed-excluded-from-transactions.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/unconfirmed-excluded-from-transactions.golden new file mode 100644 index 00000000..5c8fc9db --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/unconfirmed-excluded-from-transactions.golden @@ -0,0 +1,104 @@ +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 17, + "block_seq": 164 + }, + "time": 1430790052, + "txn": { + "timestamp": 1430790052, + "length": 220, + "type": 0, + "txid": "743bf1eede313145824db1c4f8d683b74ab5e0bc825082d986308b73fd52f1d7", + "inner_hash": "a0427c37a8ca9f8205630cc8d4c6d95200413d3397a0de9bf015763107b8fc80", + "sigs": [ + "dc400e921f7f94da5f353846f1340e039b4527fff121a56579390fb4fa4154634e3b3aad44ddf0aaebea5abc1dc5ba2a00540fd2888ed5c4ab7b20c51255086a01" + ], + "inputs": [ + "c07593d4329f82da243e4bbd7430e4b10e7b35f9ce0a3718d0e6d25d20b4939b" + ], + "outputs": [ + { + "uxid": "4d52106e41dba0099549fd81fb8feb6915225b0125c53faa0f7c578ea78f213a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "660314.000000", + "hours": 0 + }, + { + "uxid": "bc513a68461d5c401e65a500baf7dfa163735ef63b817bb7b73c4139d5c29d18", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 12, + "block_seq": 169 + }, + "time": 1430836392, + "txn": { + "timestamp": 1430836392, + "length": 220, + "type": 0, + "txid": "acfb61f7ca39d5dfe33e8ed66f73ab181da0a3206d457bf055dcc4b9731a3ec8", + "inner_hash": "85c5d3963f2dce44e99500967e8b8b1943839537fb198186131459a3022d161a", + "sigs": [ + "473114dcb42e2091f3d0396ecd16ee2685e0a6074c7de218cbd7e7c4335d89146455bc6c259c77f40d4af769e241aba1e3a102c5755946b1783c817ffafa67d101" + ], + "inputs": [ + "bc513a68461d5c401e65a500baf7dfa163735ef63b817bb7b73c4139d5c29d18" + ], + "outputs": [ + { + "uxid": "639e69c4a223b5082b9274caf3e56ecff2ab55cd90cac94fdb4c383a1013ba1f", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "990.000000", + "hours": 70 + }, + { + "uxid": "bffea1990d71311b695b2d343b9f09a216b7a8257c1cdcb01b2ab9459e1490e3", + "dst": "jtuSERvfzN3kUYekg8LemCQ5kF5g97N8ZL", + "coins": "10.000000", + "hours": 70 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 11, + "block_seq": 170 + }, + "time": 1430836422, + "txn": { + "timestamp": 1430836422, + "length": 183, + "type": 0, + "txid": "95d847102c01d071982e67b8e7dfae50715b0fc0179d33f4b050974e634905e1", + "inner_hash": "c13b7e1722f3616f61948ed42382d4ed41164e7e2110d2d60bf86725f32531de", + "sigs": [ + "cb7da0e16b83f1717614c7f160580ac0048a4276682ac4046c3324ba6f4e24901d162f7ec81a8e5cdf3676df6ace9a73c77e4d3ab7f03a4f0272c75f3715665001" + ], + "inputs": [ + "bffea1990d71311b695b2d343b9f09a216b7a8257c1cdcb01b2ab9459e1490e3" + ], + "outputs": [ + { + "uxid": "be081639ea8da63d8542707e9ea9625f6afc97da132f43ed061645c359bb1e65", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10.000000", + "hours": 8 + } + ] + } + } +] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/uxout-addr.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/uxout-addr.golden new file mode 100644 index 00000000..c9d35960 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/uxout-addr.golden @@ -0,0 +1,13 @@ +[ + { + "uxid": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "time": 1427926392, + "src_block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "owner_address": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": 1000000000000, + "hours": 1, + "spent_block_seq": 0, + "spent_tx": "0000000000000000000000000000000000000000000000000000000000000000" + } +] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/uxout-noaddr.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/uxout-noaddr.golden new file mode 100644 index 00000000..fe51488c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/uxout-noaddr.golden @@ -0,0 +1 @@ +[] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/uxout-spent.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/uxout-spent.golden new file mode 100644 index 00000000..4ed814e5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/uxout-spent.golden @@ -0,0 +1,11 @@ +{ + "uxid": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "time": 1431339429, + "src_block_seq": 179, + "src_tx": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "owner_address": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": 615700000000, + "hours": 5521648, + "spent_block_seq": 181, + "spent_tx": "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947" +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/uxout.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/uxout.golden new file mode 100644 index 00000000..b45c139b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/uxout.golden @@ -0,0 +1,11 @@ +{ + "uxid": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "time": 1431339429, + "src_block_seq": 179, + "src_tx": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "owner_address": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": 615700000000, + "hours": 5521648, + "spent_block_seq": 0, + "spent_tx": "0000000000000000000000000000000000000000000000000000000000000000" +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/verbose-pending-transactions.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/verbose-pending-transactions.golden new file mode 100644 index 00000000..cf18807c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/verbose-pending-transactions.golden @@ -0,0 +1,41 @@ +[ + { + "transaction": { + "length": 220, + "type": 0, + "txid": "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947", + "inner_hash": "f8293dbfdddcc56a97664655ceee650715d35a0dda32a9f0ce0e2e99d4899124", + "fee": 34297581, + "sigs": [ + "3981061c7275ae9cc936e902a5367fdd87ef779bbdb31e1e10d325d17a129abb34f6e597ceeaf67bb051774b41c58276004f6a63cb81de61d4693bc7a5536f3200" + ], + "inputs": [ + { + "uxid": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "hours": 5521648, + "calculated_hours": 45730107 + } + ], + "outputs": [ + { + "uxid": "8f9c09c37e0c636178e4229e2e8212c067ef0a8c501be9e2757a97b980d7a98a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "605700.000000", + "hours": 5716263 + }, + { + "uxid": "32a060b2e2025cceb40f3f982c887952d3358d468db1719dd892eab575c14c14", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10000.000000", + "hours": 5716263 + } + ] + }, + "received": "2018-08-30T14:00:20.406949Z", + "checked": "2018-08-30T14:00:20.406949Z", + "announced": "0001-01-01T00:00:00Z", + "is_valid": true + } +] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/verify-address.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/verify-address.golden new file mode 100644 index 00000000..268bb847 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/verify-address.golden @@ -0,0 +1,3 @@ +{ + "version": 0 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/verify-transaction-invalid-bad-sig.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/verify-transaction-invalid-bad-sig.golden new file mode 100644 index 00000000..27233b52 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/verify-transaction-invalid-bad-sig.golden @@ -0,0 +1,40 @@ +{ + "unsigned": false, + "confirmed": false, + "transaction": { + "length": 220, + "type": 0, + "txid": "de977ea93c0090ebe6e0c2dea002ffaf4fc314d08d06534120d96b96cc0042ce", + "inner_hash": "c30ba73f9422e909c601777ace12c777db329e06875cc6b29383bac3766acdc7", + "fee": "188772", + "sigs": [ + "71f2c01516fe696328e79bcf464eb0db374b63d494f7a307d1e77114f18581d7a81eed5275a9e04a336292dd2fd16977d9bef2a54ea3161d0876603d00c53bc9dd" + ], + "inputs": [ + { + "uxid": "75692aeff988ce0da734c474dbef3a1ce19a5a6823bbcd36acb856c83262261e", + "address": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "hours": "377543", + "calculated_hours": "377543", + "timestamp": 1431574528, + "block": 180, + "txid": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d" + } + ], + "outputs": [ + { + "uxid": "4ac148c444b86560bde4005fcf5d9f53ae18226b35a60911ab777dfe00e4cb89", + "address": "7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD", + "coins": "0.001000", + "hours": "10" + }, + { + "uxid": "a7369917d622df48d8f205e0935144a825df4d8318d82c8bd9492ab3ee11f102", + "address": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22099.999000", + "hours": "188761" + } + ] + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/verify-transaction-invalid-empty.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/verify-transaction-invalid-empty.golden new file mode 100644 index 00000000..11d34b1b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/verify-transaction-invalid-empty.golden @@ -0,0 +1,14 @@ +{ + "unsigned": true, + "confirmed": false, + "transaction": { + "length": 0, + "type": 0, + "txid": "78877fa898f0b4c45c9c33ae941e40617ad7c8657a307db62bc5691f92f4f60e", + "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "fee": "0", + "sigs": [], + "inputs": [], + "outputs": [] + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/wallet-balance-bip44.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/wallet-balance-bip44.golden new file mode 100644 index 00000000..797f638e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/wallet-balance-bip44.golden @@ -0,0 +1,22 @@ +{ + "confirmed": { + "coins": 0, + "hours": 0 + }, + "predicted": { + "coins": 0, + "hours": 0 + }, + "addresses": { + "2VPNXUuSueeGUts8amEpa5McXeuzrReZzkU": { + "confirmed": { + "coins": 0, + "hours": 0 + }, + "predicted": { + "coins": 0, + "hours": 0 + } + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/wallet-balance-deterministic.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/wallet-balance-deterministic.golden new file mode 100644 index 00000000..3b861459 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/wallet-balance-deterministic.golden @@ -0,0 +1,22 @@ +{ + "confirmed": { + "coins": 0, + "hours": 0 + }, + "predicted": { + "coins": 0, + "hours": 0 + }, + "addresses": { + "27nAhbBjHLcvD3UdbrH1YouKWYwmG94K9cw": { + "confirmed": { + "coins": 0, + "hours": 0 + }, + "predicted": { + "coins": 0, + "hours": 0 + } + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/wallet-balance-xpub.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/wallet-balance-xpub.golden new file mode 100644 index 00000000..1f5789a1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/wallet-balance-xpub.golden @@ -0,0 +1,22 @@ +{ + "confirmed": { + "coins": 0, + "hours": 0 + }, + "predicted": { + "coins": 0, + "hours": 0 + }, + "addresses": { + "ZkExZ2bprtVVgXgYN5Rg8jHrse1LUtDQKF": { + "confirmed": { + "coins": 0, + "hours": 0 + }, + "predicted": { + "coins": 0, + "hours": 0 + } + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/wallet-bip44-transactions-verbose.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/wallet-bip44-transactions-verbose.golden new file mode 100644 index 00000000..f3d21018 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/wallet-bip44-transactions-verbose.golden @@ -0,0 +1,3 @@ +{ + "transactions": [] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/wallet-bip44-transactions.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/wallet-bip44-transactions.golden new file mode 100644 index 00000000..f3d21018 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/wallet-bip44-transactions.golden @@ -0,0 +1,3 @@ +{ + "transactions": [] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/wallet-deterministic-transactions-verbose.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/wallet-deterministic-transactions-verbose.golden new file mode 100644 index 00000000..f3d21018 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/wallet-deterministic-transactions-verbose.golden @@ -0,0 +1,3 @@ +{ + "transactions": [] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/wallet-deterministic-transactions.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/wallet-deterministic-transactions.golden new file mode 100644 index 00000000..f3d21018 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/wallet-deterministic-transactions.golden @@ -0,0 +1,3 @@ +{ + "transactions": [] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/wallet-xpub-transactions-verbose.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/wallet-xpub-transactions-verbose.golden new file mode 100644 index 00000000..f3d21018 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/wallet-xpub-transactions-verbose.golden @@ -0,0 +1,3 @@ +{ + "transactions": [] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/wallet-xpub-transactions.golden b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/wallet-xpub-transactions.golden new file mode 100644 index 00000000..f3d21018 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/testdata/wallet-xpub-transactions.golden @@ -0,0 +1,3 @@ +{ + "transactions": [] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/transactions_test.go b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/transactions_test.go new file mode 100644 index 00000000..88c9f263 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/transactions_test.go @@ -0,0 +1,2172 @@ +package integration_test + +import ( + "errors" + "fmt" + "math" + "math/rand" + "net/http" + "os" + "sort" + "strconv" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/api" + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/bip44" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/readable" + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/transaction" + "github.com/SkycoinProject/skycoin/src/util/droplet" + "github.com/SkycoinProject/skycoin/src/util/fee" + "github.com/SkycoinProject/skycoin/src/util/mathutil" + "github.com/SkycoinProject/skycoin/src/wallet" +) + +func TestStableInjectTransaction(t *testing.T) { + if !doStable(t) { + return + } + + c := newClient() + + cases := []struct { + name string + txn coin.Transaction + code int + err string + }{ + { + name: "database is read only", + txn: coin.Transaction{}, + code: http.StatusInternalServerError, + err: "500 Internal Server Error - database is in read-only mode", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + result, err := c.InjectTransaction(&tc.txn) + if tc.err != "" { + assertResponseError(t, err, tc.code, tc.err) + return + } + + require.NoError(t, err) + + // Result should be a valid txid + require.NotEmpty(t, result) + h, err := cipher.SHA256FromHex(result) + require.NoError(t, err) + require.NotEqual(t, cipher.SHA256{}, h) + }) + } +} + +func TestLiveInjectTransactionDisableNetworking(t *testing.T) { + if !doLive(t) { + return + } + + if !liveDisableNetworking(t) { + t.Skip("Networking must be disabled for this test") + return + } + + requireWalletEnv(t) + + c := newClient() + + w, totalCoins, totalHours, password := prepareAndCheckWallet(t, c, 2e6, 20) + + defaultChangeAddress := w.GetEntryAt(0).Address.String() + + type testCase struct { + name string + createTxnReq api.WalletCreateTransactionRequest + err string + code int + } + + cases := []testCase{ + { + name: "valid request, networking disabled", + err: "503 Service Unavailable - Outgoing connections are disabled", + code: http.StatusServiceUnavailable, + createTxnReq: api.WalletCreateTransactionRequest{ + WalletID: w.Filename(), + Password: password, + CreateTransactionRequest: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.GetEntryAt(1).Address.String(), + Coins: toDropletString(t, totalCoins), + Hours: fmt.Sprint(totalHours / 2), + }, + }, + }, + }, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + txnResp, err := c.WalletCreateTransaction(tc.createTxnReq) + require.NoError(t, err) + + txid, err := c.InjectEncodedTransaction(txnResp.EncodedTransaction) + if tc.err != "" { + assertResponseError(t, err, tc.code, tc.err) + + // A second injection will fail with the same error, + // since the transaction should not be saved to the DB + _, err = c.InjectEncodedTransaction(txnResp.EncodedTransaction) + assertResponseError(t, err, tc.code, tc.err) + return + } + + require.NotEmpty(t, txid) + require.Equal(t, txnResp.Transaction.TxID, txid) + + h, err := cipher.SHA256FromHex(txid) + require.NoError(t, err) + require.NotEqual(t, cipher.SHA256{}, h) + }) + } +} + +func TestLiveInjectTransactionEnableNetworking(t *testing.T) { + if !doLive(t) { + return + } + + if liveDisableNetworking(t) { + t.Skip("This tests requires networking enabled") + return + } + + requireWalletEnv(t) + + c := newClient() + w, totalCoins, _, password := prepareAndCheckWallet(t, c, 2e6, 2) + + defaultChangeAddress := w.GetEntryAt(0).Address.String() + + // prepareTxnFunc prepares a valid transaction + prepareTxnFunc := func(t *testing.T, toAddr string, coins uint64, shareFactor string) (coin.Transaction, *api.CreateTransactionResponse) { + createTxnReq := api.WalletCreateTransactionRequest{ + WalletID: w.Filename(), + Password: password, + CreateTransactionRequest: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + ShareFactor: shareFactor, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + // Address: w.GetEntryAt(1).Address.String(), + Address: toAddr, + Coins: toDropletString(t, coins), + }, + }, + }, + } + + txnResp, err := c.WalletCreateTransaction(createTxnReq) + require.NoError(t, err) + + txn, err := coin.DeserializeTransactionHex(txnResp.EncodedTransaction) + require.NoError(t, err) + return txn, txnResp + } + + reSignTxnFunc := func(t *testing.T, txn coin.Transaction, txnRsp *api.CreateTransactionResponse, wlt wallet.Wallet) coin.Transaction { + walletPassword := os.Getenv("WALLET_PASSWORD") + err := wallet.GuardView(wlt, []byte(walletPassword), func(unlockWlt wallet.Wallet) error { + keyMap := make(map[string]cipher.SecKey, unlockWlt.EntriesLen()) + for _, e := range unlockWlt.GetEntries() { + addr := cipher.MustAddressFromSecKey(e.Secret) + keyMap[addr.String()] = e.Secret + } + + // Get seckeys in wallet of input addresses + keys := make([]cipher.SecKey, len(txnRsp.Transaction.In)) + for i, in := range txnRsp.Transaction.In { + k, ok := keyMap[in.Address] + if !ok { + t.Fatal("seckey does not exist") + return errors.New("seckey does not exist") + } + keys[i] = k + } + // clear the old signatures + txn.Sigs = []cipher.Sig{} + txn.SignInputs(keys) + return nil + }) + require.NoError(t, err) + return txn + } + + tt := []struct { + name string + createTxn func(t *testing.T) *coin.Transaction + code int + err string + checkTxn func(t *testing.T, tx *readable.TransactionWithStatus) + }{ + { + name: "send all coins to the first address", + createTxn: func(t *testing.T) *coin.Transaction { + txn, _ := prepareTxnFunc(t, w.GetEntryAt(0).Address.String(), totalCoins, "1") + return &txn + }, + checkTxn: func(t *testing.T, tx *readable.TransactionWithStatus) { + // Confirms the total output coins are equal to the totalCoins + var coins uint64 + for _, o := range tx.Transaction.Out { + c, err := droplet.FromString(o.Coins) + require.NoError(t, err) + coins, err = mathutil.AddUint64(coins, c) + require.NoError(t, err) + } + + // Confirms the address balance are equal to the totalCoins + coins, _ = getAddressBalance(t, c, w.GetEntryAt(0).Address.String()) + require.Equal(t, totalCoins, coins) + }, + code: http.StatusOK, + }, + { + // send 0.003 coin to the second address, + // this amount is chosen to not interfere with TestLiveWalletCreateTransaction + name: "send 0.003 coin to second address", + createTxn: func(t *testing.T) *coin.Transaction { + txn, _ := prepareTxnFunc(t, w.GetEntryAt(1).Address.String(), 3e3, "0.5") + return &txn + }, + checkTxn: func(t *testing.T, tx *readable.TransactionWithStatus) { + // Confirms there're two outputs, one to the second address, one as change output to the first address. + require.Len(t, tx.Transaction.Out, 2) + + // Gets the output of the second address in the transaction + getAddrOutputInTxn := func(t *testing.T, tx *readable.TransactionWithStatus, addr string) *readable.TransactionOutput { + for _, output := range tx.Transaction.Out { + if output.Address == addr { + return &output + } + } + t.Fatalf("transaction doesn't have output to address: %v", addr) + return nil + } + + out := getAddrOutputInTxn(t, tx, w.GetEntryAt(1).Address.String()) + + // Confirms the second address has 0.003 coin + require.Equal(t, out.Coins, "0.003000") + require.Equal(t, out.Address, w.GetEntryAt(1).Address.String()) + + coin, err := droplet.FromString(out.Coins) + require.NoError(t, err) + + // Gets the expected change coins + expectChangeCoins := totalCoins - coin + + // Gets the real change coins + changeOut := getAddrOutputInTxn(t, tx, w.GetEntryAt(0).Address.String()) + changeCoins, err := droplet.FromString(changeOut.Coins) + require.NoError(t, err) + // Confirms the change coins are matched. + require.Equal(t, expectChangeCoins, changeCoins) + }, + code: http.StatusOK, + }, + { + name: "send to null address", + createTxn: func(t *testing.T) *coin.Transaction { + txn, _ := prepareTxnFunc(t, w.GetEntryAt(0).Address.String(), totalCoins, "1") + + // set the transaction output address as null + txn.Out[0].Address = cipher.Address{} + return &txn + }, + code: http.StatusBadRequest, + err: "400 Bad Request - Transaction violates user constraint: Transaction output is sent to the null address", + }, + { + // Use an input from block 1024: 2f842b0fbf5ef2dd59c8b5127795f1e88bfa6b510a41c62eac28fc2006d279e3 + name: "double spend", + createTxn: func(t *testing.T) *coin.Transaction { + txn, _ := prepareTxnFunc(t, w.GetEntryAt(0).Address.String(), totalCoins, "1") + + hash, err := cipher.SHA256FromHex("2f842b0fbf5ef2dd59c8b5127795f1e88bfa6b510a41c62eac28fc2006d279e3") + require.NoError(t, err) + txn.In[0] = hash + return &txn + }, + code: http.StatusBadRequest, + err: "400 Bad Request - Transaction violates hard constraint: unspent output of 2f842b0fbf5ef2dd59c8b5127795f1e88bfa6b510a41c62eac28fc2006d279e3 does not exist", + }, + { + name: "output hours overflow", + createTxn: func(t *testing.T) *coin.Transaction { + txn, _ := prepareTxnFunc(t, w.GetEntryAt(1).Address.String(), 1e6, "1") + + // set one output hours as math.MaxUint64 + txn.Out[0].Hours = math.MaxUint64 - 1 + txn.Out[1].Hours = 100 + txn.InnerHash = txn.HashInner() + return &txn + }, + code: http.StatusBadRequest, + err: "400 Bad Request - Transaction violates hard constraint: Transaction output hours overflow", + }, + { + name: "no inputs", + createTxn: func(t *testing.T) *coin.Transaction { + txn, _ := prepareTxnFunc(t, w.GetEntryAt(0).Address.String(), totalCoins, "1") + + txn.In = []cipher.SHA256{} + txn.InnerHash = txn.HashInner() + return &txn + }, + code: http.StatusBadRequest, + err: "400 Bad Request - Transaction violates hard constraint: No inputs", + }, + { + name: "no outputs", + createTxn: func(t *testing.T) *coin.Transaction { + txn, _ := prepareTxnFunc(t, w.GetEntryAt(0).Address.String(), totalCoins, "1") + + txn.Out = []coin.TransactionOutput{} + txn.InnerHash = txn.HashInner() + return &txn + }, + code: http.StatusBadRequest, + err: "400 Bad Request - Transaction violates hard constraint: No outputs", + }, + { + name: "invalid number of signatures", + createTxn: func(t *testing.T) *coin.Transaction { + txn, _ := prepareTxnFunc(t, w.GetEntryAt(0).Address.String(), totalCoins, "1") + txn.Sigs = []cipher.Sig{} + txn.InnerHash = txn.HashInner() + return &txn + }, + code: http.StatusBadRequest, + err: "400 Bad Request - Transaction violates hard constraint: Invalid number of signatures", + }, + { + name: "duplicate spend", + createTxn: func(t *testing.T) *coin.Transaction { + txn, _ := prepareTxnFunc(t, w.GetEntryAt(0).Address.String(), totalCoins, "1") + // Make duplicate inputs + txn.In = append(txn.In, txn.In[0]) + // Make duplicate sigs + txn.Sigs = append(txn.Sigs, txn.Sigs[0]) + txn.InnerHash = txn.HashInner() + return &txn + }, + code: http.StatusBadRequest, + err: "400 Bad Request - Transaction violates hard constraint: Duplicate spend", + }, + { + name: "transaction type invalid", + createTxn: func(t *testing.T) *coin.Transaction { + txn, _ := prepareTxnFunc(t, w.GetEntryAt(0).Address.String(), totalCoins, "1") + txn.Type = 1 + return &txn + }, + code: http.StatusBadRequest, + err: "400 Bad Request - Transaction violates hard constraint: transaction type invalid", + }, + { + name: "zero coin output", + createTxn: func(t *testing.T) *coin.Transaction { + txn, _ := prepareTxnFunc(t, w.GetEntryAt(0).Address.String(), totalCoins, "1") + txn.Out[0].Coins = 0 + txn.InnerHash = txn.HashInner() + return &txn + }, + code: http.StatusBadRequest, + err: "400 Bad Request - Transaction violates hard constraint: Zero coin output", + }, + { + name: "output coins overflow", + createTxn: func(t *testing.T) *coin.Transaction { + txn, _ := prepareTxnFunc(t, w.GetEntryAt(0).Address.String(), 1e6, "1") + txn.Out[0].Coins = math.MaxUint64 - 1 + txn.Out[1].Coins = 2 + return &txn + }, + code: http.StatusBadRequest, + err: "400 Bad Request - Transaction violates hard constraint: Output coins overflow", + }, + { + name: "incorrect transaction length", + createTxn: func(t *testing.T) *coin.Transaction { + txn, _ := prepareTxnFunc(t, w.GetEntryAt(0).Address.String(), totalCoins, "1") + txn.Length = 1 + txn.InnerHash = txn.HashInner() + return &txn + }, + code: http.StatusBadRequest, + err: "400 Bad Request - Transaction violates hard constraint: Incorrect transaction length", + }, + { + name: "duplicate output", + createTxn: func(t *testing.T) *coin.Transaction { + txn, _ := prepareTxnFunc(t, w.GetEntryAt(0).Address.String(), totalCoins, "1") + txn.Out = append(txn.Out, txn.Out[0]) + txn.InnerHash = txn.HashInner() + size, _, err := txn.SizeHash() + require.NoError(t, err) + txn.Length = size + return &txn + }, + code: http.StatusBadRequest, + err: "400 Bad Request - Transaction violates hard constraint: Duplicate output in transaction", + }, + { + name: "inner hash does not match", + createTxn: func(t *testing.T) *coin.Transaction { + txn, _ := prepareTxnFunc(t, w.GetEntryAt(0).Address.String(), totalCoins, "1") + txn.InnerHash = testutil.RandSHA256(t) + return &txn + }, + code: http.StatusBadRequest, + err: "400 Bad Request - Transaction violates hard constraint: InnerHash does not match computed hash", + }, + { + name: "unsigned input", + createTxn: func(t *testing.T) *coin.Transaction { + txn, _ := prepareTxnFunc(t, w.GetEntryAt(0).Address.String(), totalCoins, "1") + txn.Sigs[0] = cipher.Sig{} + txn.InnerHash = txn.HashInner() + return &txn + }, + code: http.StatusBadRequest, + err: "400 Bad Request - Transaction violates hard constraint: Unsigned input in transaction", + }, + { + name: "invalid sig", + createTxn: func(t *testing.T) *coin.Transaction { + txn, _ := prepareTxnFunc(t, w.GetEntryAt(0).Address.String(), totalCoins, "1") + txn.Sigs[0] = testutil.RandSig(t) + + txn.InnerHash = txn.HashInner() + return &txn + }, + code: http.StatusBadRequest, + err: "400 Bad Request - Transaction violates hard constraint: Failed to recover pubkey from signature", + }, + { + name: "signature not valid for output being spent", + createTxn: func(t *testing.T) *coin.Transaction { + txn, _ := prepareTxnFunc(t, w.GetEntryAt(0).Address.String(), totalCoins, "1") + // Use a wrong private key to sign txn.In[0] and change txn.Sigs[0] + _, seckey := cipher.GenerateKeyPair() + h := cipher.AddSHA256(txn.InnerHash, txn.In[0]) + txn.Sigs[0] = cipher.MustSignHash(h, seckey) + + return &txn + }, + code: http.StatusBadRequest, + err: "400 Bad Request - Transaction violates hard constraint: Signature not valid for output being spent", + }, + { + name: "insufficient coins", + createTxn: func(t *testing.T) *coin.Transaction { + txn, txnRsp := prepareTxnFunc(t, w.GetEntryAt(0).Address.String(), totalCoins, "1") + // Make output coins > input coins + txn.Out[0].Coins = txn.Out[0].Coins + 1 + txn.InnerHash = txn.HashInner() + // Sign txn again as the inner hash is changed + txn = reSignTxnFunc(t, txn, txnRsp, w) + + return &txn + }, + code: http.StatusBadRequest, + err: "400 Bad Request - Transaction violates hard constraint: Insufficient coins", + }, + { + name: "transaction may not destry coins", + createTxn: func(t *testing.T) *coin.Transaction { + txn, txnRsp := prepareTxnFunc(t, w.GetEntryAt(0).Address.String(), totalCoins, "1") + // Make output coins < input coins + txn.Out[0].Coins = txn.Out[0].Coins - 1 + txn.InnerHash = txn.HashInner() + // Sign the txn again as the inner hash is changed + txn = reSignTxnFunc(t, txn, txnRsp, w) + return &txn + }, + code: http.StatusBadRequest, + err: "400 Bad Request - Transaction violates hard constraint: Transactions may not destroy coins", + }, + { + name: "insufficient coin hours", + createTxn: func(t *testing.T) *coin.Transaction { + txn, txnRsp := prepareTxnFunc(t, w.GetEntryAt(0).Address.String(), totalCoins, "1") + // Make up more output coin hours + txn.Out[0].Hours = txn.Out[0].Hours + 1e6 + // Recalculate inner hash + txn.InnerHash = txn.HashInner() + // Sign the txn again + txn = reSignTxnFunc(t, txn, txnRsp, w) + return &txn + }, + code: http.StatusBadRequest, + err: "400 Bad Request - Transaction violates hard constraint: Insufficient coin hours", + }, + { + name: "invalid amount, too many decimal places", + createTxn: func(t *testing.T) *coin.Transaction { + // Make a txn with txn.Out[0].Coins equal 1e3, as we have at least 2e6 coins + // so there will have at least two outputs. + txn, txnRsp := prepareTxnFunc(t, w.GetEntryAt(0).Address.String(), 1e3, "1") + // Make txn.Out[0].Coins too many decimal places + txn.Out[0].Coins = 5e2 + // Move the remaining 5e2 from the first output to the second output, so that + // we won't lose coins + txn.Out[1].Coins = txn.Out[1].Coins + 5e2 + txn.InnerHash = txn.HashInner() + + txn = reSignTxnFunc(t, txn, txnRsp, w) + return &txn + }, + code: http.StatusBadRequest, + err: "400 Bad Request - Transaction violates soft constraint: invalid amount, too many decimal places", + }, + } + // TODO: + // The following test cases can not be added here, as we cannot use the big size + // transaction is not allowed in encoder/decoder, which will fail the test + // in building transaction step. + // + // 1. Make up a txn which exceeds max block size to violate the soft constraint + // 2. Make up a transaction that can exceed max block size + // expected err: "400 Bad Request - Transaction violates hard constraint: Transaction size bigger than max block size" + // 3. Make up a transaction that has inputs/outputs exceed max + // expected err: + // - "400 Bad Request - Transaction violates hard constraint: Too many signatures and inputs" + // - "400 Bad Request - Transaction violates hard constraint: Too many outputs" + // TODO: + // 1. Add test case to inject transaction who has inputs locked. + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + txn := tc.createTxn(t) + txid, err := c.InjectTransaction(txn) + if tc.code != http.StatusOK { + assertResponseError(t, err, tc.code, tc.err) + return + } + + require.NoError(t, err) + require.Equal(t, txn.Hash().Hex(), txid) + + tk := time.NewTicker(time.Second) + var txnStatus *readable.TransactionWithStatus + loop: + for { + select { + case <-time.After(30 * time.Second): + t.Fatal("Waiting for transaction to be confirmed timeout") + case <-tk.C: + txnStatus = getTransaction(t, c, txn.Hash().Hex()) + if txnStatus.Status.Confirmed { + break loop + } + } + } + tc.checkTxn(t, txnStatus) + }) + } + + // Test to inject invalid rawtx + _, err := c.InjectEncodedTransaction("invalidrawtx") + assertResponseError(t, err, 400, "400 Bad Request - Transaction violates user constraint: Transaction output is sent to the null address") + +} + +func TestLiveWalletSignTransaction(t *testing.T) { + if !doLive(t) { + return + } + + requireWalletEnv(t) + + c := newClient() + + w, _, _, password := prepareAndCheckWallet(t, c, 2e6, 20) + + // Fetch outputs held by the wallet + addrs := make([]string, w.EntriesLen()) + for i, e := range w.GetEntries() { + addrs[i] = e.SkycoinAddress().String() + } + + summary, err := c.OutputsForAddresses(addrs) + require.NoError(t, err) + // Abort if the transaction is spending summary + require.Empty(t, summary.OutgoingOutputs) + // Need at least 2 summary for the created transaction + require.True(t, len(summary.HeadOutputs) > 1) + + // Use the first two outputs for a transaction + headOutputs := summary.HeadOutputs[:2] + outputs, err := headOutputs.ToUxArray() + require.NoError(t, err) + totalCoins, err := outputs.Coins() + require.NoError(t, err) + totalCoinsStr, err := droplet.ToString(totalCoins) + require.NoError(t, err) + + uxOutHashes := make([]string, len(outputs)) + for i, o := range outputs { + uxOutHashes[i] = o.Hash().Hex() + } + + // Create an unsigned transaction using two inputs + // Ensure at least 2 inputs + // Specify outputs in the request to create txn + // Specify unsigned in the request to create txn + txnResp, err := c.WalletCreateTransaction(api.WalletCreateTransactionRequest{ + Unsigned: true, + WalletID: w.Filename(), + Password: password, + CreateTransactionRequest: api.CreateTransactionRequest{ + UxOuts: uxOutHashes, + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + ShareFactor: "0.5", + }, + To: []api.Receiver{ + { + Address: w.GetEntryAt(0).SkycoinAddress().String(), + Coins: totalCoinsStr, + }, + }, + }, + }) + require.NoError(t, err) + + // Create an invalid txn with an extra null sig + invalidTxn := coin.MustDeserializeTransactionHex(txnResp.EncodedTransaction) + invalidTxn.Sigs = append(invalidTxn.Sigs, cipher.Sig{}) + require.NotEqual(t, len(invalidTxn.In), len(invalidTxn.Sigs)) + + type testCase struct { + name string + req api.WalletSignTransactionRequest + fullySigned bool + err string + code int + } + + cases := []testCase{ + { + name: "sign one input", + req: api.WalletSignTransactionRequest{ + WalletID: w.Filename(), + Password: password, + SignIndexes: []int{1}, + EncodedTransaction: txnResp.EncodedTransaction, + }, + fullySigned: false, + }, + + { + name: "sign all inputs", + req: api.WalletSignTransactionRequest{ + WalletID: w.Filename(), + Password: password, + SignIndexes: nil, + EncodedTransaction: txnResp.EncodedTransaction, + }, + fullySigned: true, + }, + + { + name: "sign invalid txn", + req: api.WalletSignTransactionRequest{ + WalletID: w.Filename(), + Password: password, + SignIndexes: nil, + EncodedTransaction: invalidTxn.MustSerializeHex(), + }, + code: http.StatusBadRequest, + err: "Transaction violates hard constraint: Invalid number of signatures", + }, + } + + doTest := func(tc testCase) { + t.Run(tc.name, func(t *testing.T) { + resp, err := c.WalletSignTransaction(tc.req) + if tc.err != "" { + assertResponseError(t, err, tc.code, tc.err) + return + } + + require.NoError(t, err) + + txn, err := coin.DeserializeTransactionHex(tc.req.EncodedTransaction) + require.NoError(t, err) + + // TxID should have changed + require.NotEqual(t, txn.Hash(), resp.Transaction.TxID) + // Length, InnerHash should not have changed + require.Equal(t, txn.Length, resp.Transaction.Length) + require.Equal(t, txn.InnerHash.Hex(), resp.Transaction.InnerHash) + + _, err = c.VerifyTransaction(api.VerifyTransactionRequest{ + EncodedTransaction: resp.EncodedTransaction, + Unsigned: false, + }) + if tc.fullySigned { + require.NoError(t, err) + } else { + testutil.RequireError(t, err, "Transaction violates hard constraint: Unsigned input in transaction") + } + + _, err = c.VerifyTransaction(api.VerifyTransactionRequest{ + EncodedTransaction: resp.EncodedTransaction, + Unsigned: true, + }) + if tc.fullySigned { + testutil.RequireError(t, err, "Transaction violates hard constraint: Unsigned transaction must contain a null signature") + } else { + require.NoError(t, err) + } + }) + } + + for _, tc := range cases { + doTest(tc) + } + + // Create a partially signed transaction then sign the remainder of it + resp, err := c.WalletSignTransaction(api.WalletSignTransactionRequest{ + WalletID: w.Filename(), + Password: password, + SignIndexes: []int{1}, + EncodedTransaction: txnResp.EncodedTransaction, + }) + require.NoError(t, err) + + doTest(testCase{ + name: "sign partially signed transaction", + req: api.WalletSignTransactionRequest{ + WalletID: w.Filename(), + Password: password, + EncodedTransaction: resp.EncodedTransaction, + }, + fullySigned: true, + }) +} + +func toDropletString(t *testing.T, i uint64) string { + x, err := droplet.ToString(i) + require.NoError(t, err) + return x +} + +func TestStableCreateTransaction(t *testing.T) { + if !doStable(t) { + return + } + + c := newClient() + + unknownHash := testutil.RandSHA256(t).Hex() + + cases := []struct { + name string + req api.CreateTransactionRequest + err string + code int + }{ + { + name: "invalid no uxouts for addresses", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + Addresses: []string{testutil.MakeAddress().String()}, + To: []api.Receiver{ + { + Address: testutil.MakeAddress().String(), + Coins: "1.000000", + Hours: "100", + }, + }, + }, + code: http.StatusBadRequest, + err: "no unspents to spend", + }, + + { + name: "invalid uxouts do not exist", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + UxOuts: []string{unknownHash}, + To: []api.Receiver{ + { + Address: testutil.MakeAddress().String(), + Coins: "1.000000", + Hours: "100", + }, + }, + }, + code: http.StatusBadRequest, + err: fmt.Sprintf("unspent output of %s does not exist", unknownHash), + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + require.NotEmpty(t, tc.err) + _, err := c.CreateTransaction(tc.req) + assertResponseError(t, err, tc.code, tc.err) + }) + } +} + +type liveCreateTxnTestCase struct { + name string + req api.CreateTransactionRequest + outputs []coin.TransactionOutput + outputsSubset []coin.TransactionOutput + err string + code int + ignoreHours bool + additionalRespVerify func(t *testing.T, r *api.CreateTransactionResponse) +} + +func makeLiveCreateTxnTestCases(t *testing.T, w wallet.Wallet, totalCoins, totalHours uint64) []liveCreateTxnTestCase { + remainingHours := fee.RemainingHours(totalHours, params.UserVerifyTxn.BurnFactor) + require.True(t, remainingHours > 1) + unknownOutput := testutil.RandSHA256(t) + defaultChangeAddress := w.GetEntryAt(0).Address.String() + + // Get all outputs + c := newClient() + outputs, err := c.Outputs() + require.NoError(t, err) + + // Split outputs into those held by the wallet and those not + addresses := make([]string, w.EntriesLen()) + addressMap := make(map[string]struct{}, w.EntriesLen()) + for i, e := range w.GetEntries() { + addresses[i] = e.Address.String() + addressMap[e.Address.String()] = struct{}{} + } + + var walletOutputHashes []string + var walletOutputs readable.UnspentOutputs + walletAuxs := make(map[string][]string) + for _, o := range outputs.HeadOutputs { + if _, ok := addressMap[o.Address]; ok { + walletOutputs = append(walletOutputs, o) + walletOutputHashes = append(walletOutputHashes, o.Hash) + walletAuxs[o.Address] = append(walletAuxs[o.Address], o.Hash) + } + } + + require.NotEmpty(t, walletOutputs) + + return []liveCreateTxnTestCase{ + { + name: "invalid decimals", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + Addresses: addresses, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.GetEntryAt(0).Address.String(), + Coins: "0.0001", + Hours: "1", + }, + }, + }, + err: "to[0].coins has too many decimal places", + code: http.StatusBadRequest, + }, + + { + name: "overflowing hours", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + Addresses: addresses, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.GetEntryAt(0).Address.String(), + Coins: "0.001", + Hours: "1", + }, + { + Address: w.GetEntryAt(0).Address.String(), + Coins: "0.001", + Hours: fmt.Sprint(uint64(math.MaxUint64)), + }, + { + Address: w.GetEntryAt(0).Address.String(), + Coins: "0.001", + Hours: fmt.Sprint(uint64(math.MaxUint64) - 1), + }, + }, + }, + err: "total output hours error: uint64 addition overflow", + code: http.StatusBadRequest, + }, + + { + name: "insufficient coins", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + Addresses: addresses, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.GetEntryAt(0).Address.String(), + Coins: fmt.Sprint(totalCoins + 1), + Hours: "1", + }, + }, + }, + err: "balance is not sufficient", + code: http.StatusBadRequest, + }, + + { + name: "insufficient hours", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + Addresses: addresses, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.GetEntryAt(0).Address.String(), + Coins: toDropletString(t, totalCoins), + Hours: fmt.Sprint(totalHours + 1), + }, + }, + }, + err: "hours are not sufficient", + code: http.StatusBadRequest, + }, + + { + // NOTE: this test will fail if "totalCoins - 1e3" does not require + // all of the outputs to be spent, e.g. if there is an output with + // "totalCoins - 1e3" coins in it. + // TODO -- Check that the wallet does not have an output of 0.001, + // because then this test cannot be performed, since there is no + // way to use all outputs and produce change in that case. + name: "valid request, manual one output with change, spend all", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + Addresses: addresses, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.GetEntryAt(1).Address.String(), + Coins: toDropletString(t, totalCoins-1e3), + Hours: "1", + }, + }, + }, + outputs: []coin.TransactionOutput{ + { + Address: w.GetEntryAt(1).SkycoinAddress(), + Coins: totalCoins - 1e3, + Hours: 1, + }, + { + Address: w.GetEntryAt(0).SkycoinAddress(), + Coins: 1e3, + Hours: remainingHours - 1, + }, + }, + }, + + { + // NOTE: this test will fail if "totalCoins - 1e3" does not require + // all of the outputs to be spent, e.g. if there is an output with + // "totalCoins - 1e3" coins in it. + // TODO -- Check that the wallet does not have an output of 0.001, + // because then this test cannot be performed, since there is no + // way to use all outputs and produce change in that case. + name: "valid request, manual one output with change, spend all, unspecified change address", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + Addresses: addresses, + To: []api.Receiver{ + { + Address: w.GetEntryAt(1).Address.String(), + Coins: toDropletString(t, totalCoins-1e3), + Hours: "1", + }, + }, + }, + outputs: []coin.TransactionOutput{ + { + Address: w.GetEntryAt(1).SkycoinAddress(), + Coins: totalCoins - 1e3, + Hours: 1, + }, + { + // Address omitted -- will be checked later in the test body + Coins: 1e3, + Hours: remainingHours - 1, + }, + }, + }, + + { + name: "valid request, manual one output with change, don't spend all", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + Addresses: addresses, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.GetEntryAt(1).Address.String(), + Coins: toDropletString(t, 1e3), + Hours: "1", + }, + }, + }, + outputsSubset: []coin.TransactionOutput{ + { + Address: w.GetEntryAt(1).SkycoinAddress(), + Coins: 1e3, + Hours: 1, + }, + // NOTE: change omitted, + // change is too difficult to predict in this case, we are + // just checking that not all uxouts get spent in the transaction + }, + }, + + { + name: "valid request, manual one output no change", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + Addresses: addresses, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.GetEntryAt(1).Address.String(), + Coins: toDropletString(t, totalCoins), + Hours: "1", + }, + }, + }, + outputs: []coin.TransactionOutput{ + { + Address: w.GetEntryAt(1).SkycoinAddress(), + Coins: totalCoins, + Hours: 1, + }, + }, + }, + + { + // NOTE: no reliable way to test the ignore unconfirmed behavior, + // this test only checks that if IgnoreUnconfirmed is specified, + // the API doesn't throw up some parsing error + name: "valid request, manual one output no change, ignore unconfirmed", + req: api.CreateTransactionRequest{ + IgnoreUnconfirmed: true, + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + Addresses: addresses, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.GetEntryAt(1).Address.String(), + Coins: toDropletString(t, totalCoins), + Hours: "1", + }, + }, + }, + outputs: []coin.TransactionOutput{ + { + Address: w.GetEntryAt(1).SkycoinAddress(), + Coins: totalCoins, + Hours: 1, + }, + }, + }, + + { + name: "valid request, auto one output no change, share factor recalculates to 1.0", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + ShareFactor: "0.5", + }, + Addresses: addresses, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.GetEntryAt(1).Address.String(), + Coins: toDropletString(t, totalCoins), + }, + }, + }, + outputs: []coin.TransactionOutput{ + { + Address: w.GetEntryAt(1).SkycoinAddress(), + Coins: totalCoins, + Hours: remainingHours, + }, + }, + }, + + { + name: "valid request, auto two outputs with change", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + ShareFactor: "0.5", + }, + Addresses: addresses, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.GetEntryAt(1).Address.String(), + Coins: toDropletString(t, 1e3), + }, + { + Address: w.GetEntryAt(1).Address.String(), + Coins: toDropletString(t, totalCoins-2e3), + }, + }, + }, + outputs: []coin.TransactionOutput{ + { + Address: w.GetEntryAt(1).SkycoinAddress(), + Coins: 1e3, + }, + { + Address: w.GetEntryAt(1).SkycoinAddress(), + Coins: totalCoins - 2e3, + }, + { + Address: w.GetEntryAt(0).SkycoinAddress(), + Coins: 1e3, + }, + }, + ignoreHours: true, // the hours are too unpredictable + }, + + { + name: "uxout does not exist", + req: api.CreateTransactionRequest{ + UxOuts: []string{unknownOutput.Hex()}, + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.GetEntryAt(1).Address.String(), + Coins: toDropletString(t, totalCoins), + Hours: "1", + }, + }, + }, + err: fmt.Sprintf("unspent output of %s does not exist", unknownOutput.Hex()), + code: http.StatusBadRequest, + }, + + { + name: "insufficient balance with uxouts", + req: api.CreateTransactionRequest{ + UxOuts: []string{walletOutputs[0].Hash}, + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.GetEntryAt(1).Address.String(), + Coins: toDropletString(t, totalCoins+1e3), + Hours: "1", + }, + }, + }, + err: "balance is not sufficient", + code: http.StatusBadRequest, + }, + + { + // NOTE: expects wallet to have multiple outputs with non-zero coins + name: "insufficient hours with uxouts", + req: api.CreateTransactionRequest{ + UxOuts: []string{walletOutputs[0].Hash}, + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.GetEntryAt(1).Address.String(), + Coins: toDropletString(t, 1e3), + Hours: fmt.Sprint(totalHours + 1), + }, + }, + }, + err: "hours are not sufficient", + code: http.StatusBadRequest, + }, + + { + name: "valid request, uxouts specified", + req: api.CreateTransactionRequest{ + // NOTE: all uxouts are provided, which has the same behavior as + // not providing any uxouts or addresses. + // Using a subset of uxouts makes the wallet setup very + // difficult, especially to make deterministic, in the live test + // More complex cases should be covered by unit tests + UxOuts: walletOutputHashes, + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.GetEntryAt(1).Address.String(), + Coins: toDropletString(t, totalCoins-1e3), + Hours: "1", + }, + }, + }, + outputs: []coin.TransactionOutput{ + { + Address: w.GetEntryAt(1).SkycoinAddress(), + Coins: totalCoins - 1e3, + Hours: 1, + }, + { + Address: w.GetEntryAt(0).SkycoinAddress(), + Coins: 1e3, + Hours: remainingHours - 1, + }, + }, + additionalRespVerify: func(t *testing.T, r *api.CreateTransactionResponse) { + require.Equal(t, len(walletOutputHashes), len(r.Transaction.In)) + }, + }, + + { + name: "valid request, addresses specified", + req: api.CreateTransactionRequest{ + // NOTE: all addresses are provided, which has the same behavior as + // not providing any addresses. + // Using a subset of addresses makes the wallet setup very + // difficult, especially to make deterministic, in the live test + // More complex cases should be covered by unit tests + Addresses: addresses, + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.GetEntryAt(1).Address.String(), + Coins: toDropletString(t, totalCoins-1e3), + Hours: "1", + }, + }, + }, + outputs: []coin.TransactionOutput{ + { + Address: w.GetEntryAt(1).SkycoinAddress(), + Coins: totalCoins - 1e3, + Hours: 1, + }, + { + Address: w.GetEntryAt(0).SkycoinAddress(), + Coins: 1e3, + Hours: remainingHours - 1, + }, + }, + }, + } +} + +func TestLiveCreateTransaction(t *testing.T) { + if !doLive(t) { + return + } + + requireWalletEnv(t) + + c := newClient() + + w, totalCoins, totalHours, _ := prepareAndCheckWallet(t, c, 2e6, 20) + + cases := makeLiveCreateTxnTestCases(t, w, totalCoins, totalHours) + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + require.False(t, len(tc.outputs) != 0 && len(tc.outputsSubset) != 0, "outputs and outputsSubset can't both be set") + + result, err := c.CreateTransaction(tc.req) + if tc.err != "" { + assertResponseError(t, err, tc.code, tc.err) + return + } + + require.NoError(t, err) + + assertCreateTransactionResult(t, c, tc, result, true, nil) + }) + } +} + +func TestLiveWalletCreateTransactionSpecificUnsigned(t *testing.T) { + testLiveWalletCreateTransactionSpecific(t, true) +} + +func TestLiveWalletCreateTransactionSpecificSigned(t *testing.T) { + testLiveWalletCreateTransactionSpecific(t, false) +} + +func testLiveWalletCreateTransactionSpecific(t *testing.T, unsigned bool) { + if !doLive(t) { + return + } + + requireWalletEnv(t) + + c := newClient() + + w, totalCoins, totalHours, password := prepareAndCheckWallet(t, c, 2e6, 20) + + remainingHours := fee.RemainingHours(totalHours, params.UserVerifyTxn.BurnFactor) + require.True(t, remainingHours > 1) + + // Split outputs into those held by the wallet and those not + addresses := make([]string, w.EntriesLen()) + addressMap := make(map[string]struct{}, w.EntriesLen()) + for i, e := range w.GetEntries() { + addresses[i] = e.Address.String() + addressMap[e.Address.String()] = struct{}{} + } + + outputs, err := c.Outputs() + require.NoError(t, err) + + var walletOutputs readable.UnspentOutputs + walletAuxs := make(map[string][]string) + var nonWalletOutputs readable.UnspentOutputs + for _, o := range outputs.HeadOutputs { + if _, ok := addressMap[o.Address]; ok { + walletOutputs = append(walletOutputs, o) + walletAuxs[o.Address] = append(walletAuxs[o.Address], o.Hash) + } else { + nonWalletOutputs = append(nonWalletOutputs, o) + } + } + + require.NotEmpty(t, walletOutputs) + require.NotEmpty(t, nonWalletOutputs) + + defaultChangeAddress := w.GetEntryAt(0).Address.String() + + baseCases := makeLiveCreateTxnTestCases(t, w, totalCoins, totalHours) + + type liveWalletCreateTxnTestCase struct { + liveCreateTxnTestCase + password string + walletID string + } + + cases := make([]liveWalletCreateTxnTestCase, len(baseCases)) + for i, tc := range baseCases { + cases[i] = liveWalletCreateTxnTestCase{ + liveCreateTxnTestCase: tc, + walletID: w.Filename(), + password: password, + } + } + + cases = append(cases, []liveWalletCreateTxnTestCase{ + { + walletID: w.Filename(), + password: password, + liveCreateTxnTestCase: liveCreateTxnTestCase{ + name: "uxout not held by the wallet", + req: api.CreateTransactionRequest{ + UxOuts: []string{nonWalletOutputs[0].Hash}, + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.GetEntryAt(1).Address.String(), + Coins: nonWalletOutputs[0].Coins, + Hours: "1", + }, + }, + }, + err: "uxout is not owned by any address in the wallet", + code: http.StatusBadRequest, + }, + }, + + { + walletID: w.Filename(), + password: password, + liveCreateTxnTestCase: liveCreateTxnTestCase{ + name: "specified addresses not in wallet", + req: api.CreateTransactionRequest{ + Addresses: []string{testutil.MakeAddress().String()}, + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.GetEntryAt(1).Address.String(), + Coins: toDropletString(t, totalCoins), + Hours: "1", + }, + }, + }, + err: "address not found in wallet", + code: http.StatusBadRequest, + }, + }, + + { + walletID: w.Filename(), + password: password, + liveCreateTxnTestCase: liveCreateTxnTestCase{ + name: "valid request, addresses and uxouts not specified", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.GetEntryAt(1).Address.String(), + Coins: toDropletString(t, totalCoins-1e3), + Hours: "1", + }, + }, + }, + outputs: []coin.TransactionOutput{ + { + Address: w.GetEntryAt(1).SkycoinAddress(), + Coins: totalCoins - 1e3, + Hours: 1, + }, + { + Address: w.GetEntryAt(0).SkycoinAddress(), + Coins: 1e3, + Hours: remainingHours - 1, + }, + }, + }, + }, + }...) + + if w.IsEncrypted() { + cases = append(cases, liveWalletCreateTxnTestCase{ + walletID: w.Filename(), + password: password + "foo", + liveCreateTxnTestCase: liveCreateTxnTestCase{ + name: "invalid password", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.GetEntryAt(0).Address.String(), + Coins: "1000", + Hours: "1", + }, + }, + }, + err: "invalid password", + code: http.StatusBadRequest, + }, + }) + + cases = append(cases, liveWalletCreateTxnTestCase{ + walletID: w.Filename(), + password: "", + liveCreateTxnTestCase: liveCreateTxnTestCase{ + name: "password not provided", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.GetEntryAt(0).Address.String(), + Coins: "1000", + Hours: "1", + }, + }, + }, + err: "missing password", + code: http.StatusBadRequest, + }, + }) + + } else { + err := "wallet is not encrypted" + if unsigned { + err = "password must not be used for unsigned transactions" + } + + cases = append(cases, liveWalletCreateTxnTestCase{ + walletID: w.Filename(), + password: password + "foo", + liveCreateTxnTestCase: liveCreateTxnTestCase{ + name: "password provided for unencrypted wallet", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.GetEntryAt(0).Address.String(), + Coins: "1000", + Hours: "1", + }, + }, + }, + err: err, + code: http.StatusBadRequest, + }, + }) + } + + for _, tc := range cases { + name := fmt.Sprintf("unsigned=%v %s", unsigned, tc.name) + t.Run(name, func(t *testing.T) { + require.False(t, len(tc.outputs) != 0 && len(tc.outputsSubset) != 0, "outputs and outputsSubset can't both be set") + + // Fetch a copy of the wallet to look for modifications to the wallet + // after the transaction is created + w, err := c.Wallet(tc.walletID) + require.NoError(t, err) + + req := api.WalletCreateTransactionRequest{ + CreateTransactionRequest: tc.req, + WalletID: tc.walletID, + Password: tc.password, + Unsigned: unsigned, + } + + if tc.err != "" { + tc.err = fmt.Sprintf("%d %s - %s", tc.code, http.StatusText(tc.code), tc.err) + } + + result, err := c.WalletCreateTransaction(req) + if tc.err != "" { + assertResponseError(t, err, tc.code, tc.err) + return + } + + require.NoError(t, err) + + assertCreateTransactionResult(t, c, tc.liveCreateTxnTestCase, result, unsigned, w) + }) + } +} + +func getLastChangeEntry(t *testing.T, w *api.WalletResponse) *readable.WalletEntry { + require.Equal(t, wallet.WalletTypeBip44, w.Meta.Type) + + // Find the last "change" entry + require.NotEmpty(t, w.Entries) + sort.Slice(w.Entries, func(i, j int) bool { + if *w.Entries[i].Change == *w.Entries[j].Change { + return *w.Entries[i].ChildNumber > *w.Entries[j].ChildNumber + } + return *w.Entries[i].Change > *w.Entries[j].Change + }) + + lastChangeEntry := w.Entries[0] + if *lastChangeEntry.Change != bip44.ChangeChainIndex { + // no change entry + return nil + } + + return &lastChangeEntry +} + +func isNullAddress(a string) bool { + if a == "" { + return true + } + + addr := cipher.MustDecodeBase58Address(a) + return addr.Null() +} + +func assertCreateTransactionResult(t *testing.T, c *api.Client, tc liveCreateTxnTestCase, result *api.CreateTransactionResponse, unsigned bool, w *api.WalletResponse) { + if len(tc.outputsSubset) == 0 { + require.Equal(t, len(tc.outputs), len(result.Transaction.Out)) + } + + for i, o := range tc.outputs { + coins, err := droplet.FromString(result.Transaction.Out[i].Coins) + require.NoError(t, err) + require.Equal(t, o.Coins, coins, "[%d] %d != %d", i, o.Coins, coins) + + if !tc.ignoreHours { + hours, err := strconv.ParseUint(result.Transaction.Out[i].Hours, 10, 64) + require.NoError(t, err) + require.Equal(t, o.Hours, hours, "[%d] %d != %d", i, o.Hours, hours) + } + + if o.Address.Null() { + // The final change output may not have the address specified, + // if the ChangeAddress was not specified in the wallet params. + require.Equal(t, i, len(tc.outputs)-1) + require.Nil(t, tc.req.ChangeAddress) + changeAddr := result.Transaction.Out[i].Address + require.False(t, isNullAddress(changeAddr)) + + if w != nil && w.Meta.Type == wallet.WalletTypeBip44 { + // Check that the change address was a new address generated + // from the wallet's change path + + // Get the update wallet from the API. + // Look for the last change address. + // It should match the change address that was used. + // Compare it to the previous wallet + w2, err := c.Wallet(w.Meta.Filename) + require.NoError(t, err) + lastChangeEntry := getLastChangeEntry(t, w2) + + // Compare it to the initial wallet state. + // It should be a new address with an incremented child number + prevLastChangeEntry := getLastChangeEntry(t, w) + require.NotEqual(t, prevLastChangeEntry, lastChangeEntry) + if prevLastChangeEntry == nil { + require.Equal(t, uint32(0), *lastChangeEntry.ChildNumber) + } else { + require.Equal(t, *prevLastChangeEntry.ChildNumber+1, *lastChangeEntry.ChildNumber) + } + + // Make sure that the last change address in the wallet was used + require.False(t, isNullAddress(lastChangeEntry.Address)) + require.Equal(t, changeAddr, lastChangeEntry.Address) + } else { + // Check that the automatically-selected change address was one + // of the addresses for the UTXOs spent by the transaction + changeAddrFound := false + for _, x := range result.Transaction.In { + require.False(t, isNullAddress(x.Address)) + if changeAddr == x.Address { + changeAddrFound = true + break + } + } + + require.True(t, changeAddrFound) + } + } else { + require.Equal(t, o.Address.String(), result.Transaction.Out[i].Address) + } + } + + // The wallet should be unmodified if the wallet type is not bip44 + if w != nil && w.Meta.Type != wallet.WalletTypeBip44 { + w2, err := c.Wallet(w.Meta.Filename) + require.NoError(t, err) + require.Equal(t, w, w2) + } + + assertEncodeTxnMatchesTxn(t, result) + assertRequestedCoins(t, tc.req.To, result.Transaction.Out) + assertCreatedTransactionValid(t, result.Transaction, unsigned) + + if tc.req.HoursSelection.Type == transaction.HoursSelectionTypeManual { + assertRequestedHours(t, tc.req.To, result.Transaction.Out) + } + + if tc.additionalRespVerify != nil { + tc.additionalRespVerify(t, result) + } + + assertVerifyTransaction(t, result.EncodedTransaction, unsigned) +} + +func TestLiveWalletCreateTransactionRandomUnsigned(t *testing.T) { + testLiveWalletCreateTransactionRandom(t, true) +} + +func TestLiveWalletCreateTransactionRandomSigned(t *testing.T) { + testLiveWalletCreateTransactionRandom(t, false) +} + +func testLiveWalletCreateTransactionRandom(t *testing.T, unsigned bool) { + if !doLive(t) { + return + } + + debug := false + tLog := func(t *testing.T, args ...interface{}) { + if debug { + t.Log(args...) + } + } + tLogf := func(t *testing.T, msg string, args ...interface{}) { + if debug { + t.Logf(msg, args...) + } + } + + requireWalletEnv(t) + + c := newClient() + + w, totalCoins, totalHours, password := prepareAndCheckWallet(t, c, 2e6, 20) + + if w.IsEncrypted() { + t.Skip("Skipping TestLiveWalletCreateTransactionRandom tests with encrypted wallet") + return + } + + remainingHours := fee.RemainingHours(totalHours, params.UserVerifyTxn.BurnFactor) + require.True(t, remainingHours > 1) + + assertTxnOutputCount := func(t *testing.T, changeAddress string, nOutputs int, result *api.CreateTransactionResponse) { + nResultOutputs := len(result.Transaction.Out) + require.True(t, nResultOutputs == nOutputs || nResultOutputs == nOutputs+1) + hasChange := nResultOutputs == nOutputs+1 + changeOutput := result.Transaction.Out[nResultOutputs-1] + if hasChange { + require.Equal(t, changeOutput.Address, changeAddress) + } + + tLog(t, "hasChange", hasChange) + if hasChange { + tLog(t, "changeCoins", changeOutput.Coins) + tLog(t, "changeHours", changeOutput.Hours) + } + } + + iterations := 250 + maxOutputs := 10 + destAddrs := make([]cipher.Address, maxOutputs) + for i := range destAddrs { + destAddrs[i] = testutil.MakeAddress() + } + + for i := 0; i < iterations; i++ { + tLog(t, "iteration", i) + tLog(t, "totalCoins", totalCoins) + tLog(t, "totalHours", totalHours) + + spendableHours := fee.RemainingHours(totalHours, params.UserVerifyTxn.BurnFactor) + tLog(t, "spendableHours", spendableHours) + + coins := rand.Intn(int(totalCoins)) + 1 + coins -= coins % int(params.UserVerifyTxn.MaxDropletDivisor()) + if coins == 0 { + coins = int(params.UserVerifyTxn.MaxDropletDivisor()) + } + hours := rand.Intn(int(spendableHours + 1)) + nOutputs := rand.Intn(maxOutputs) + 1 + + tLog(t, "sendCoins", coins) + tLog(t, "sendHours", hours) + + changeAddress := w.GetEntryAt(0).Address.String() + + shareFactor := strconv.FormatFloat(rand.Float64(), 'f', 8, 64) + + tLog(t, "shareFactor", shareFactor) + + to := make([]api.Receiver, 0, nOutputs) + remainingHours := hours + remainingCoins := coins + for i := 0; i < nOutputs; i++ { + if remainingCoins == 0 { + break + } + + receiver := api.Receiver{} + receiver.Address = destAddrs[rand.Intn(len(destAddrs))].String() + + if i == nOutputs-1 { + var err error + receiver.Coins, err = droplet.ToString(uint64(remainingCoins)) + require.NoError(t, err) + receiver.Hours = fmt.Sprint(remainingHours) + + remainingCoins = 0 + remainingHours = 0 + } else { + receiverCoins := rand.Intn(remainingCoins) + 1 + receiverCoins -= receiverCoins % int(params.UserVerifyTxn.MaxDropletDivisor()) + if receiverCoins == 0 { + receiverCoins = int(params.UserVerifyTxn.MaxDropletDivisor()) + } + + var err error + receiver.Coins, err = droplet.ToString(uint64(receiverCoins)) + require.NoError(t, err) + remainingCoins -= receiverCoins + + receiverHours := rand.Intn(remainingHours + 1) + receiver.Hours = fmt.Sprint(receiverHours) + remainingHours -= receiverHours + } + + to = append(to, receiver) + } + + // Remove duplicate outputs + dup := make(map[api.Receiver]struct{}, len(to)) + newTo := make([]api.Receiver, 0, len(dup)) + for _, o := range to { + if _, ok := dup[o]; !ok { + dup[o] = struct{}{} + newTo = append(newTo, o) + } + } + to = newTo + + nOutputs = len(to) + tLog(t, "nOutputs", nOutputs) + + rand.Shuffle(len(to), func(i, j int) { + to[i], to[j] = to[j], to[i] + }) + + for i, o := range to { + tLogf(t, "to[%d].Hours %s\n", i, o.Hours) + } + + autoTo := make([]api.Receiver, len(to)) + for i, o := range to { + autoTo[i] = api.Receiver{ + Address: o.Address, + Coins: o.Coins, + Hours: "", + } + } + + // Remove duplicate outputs + dup = make(map[api.Receiver]struct{}, len(autoTo)) + newAutoTo := make([]api.Receiver, 0, len(dup)) + for _, o := range autoTo { + if _, ok := dup[o]; !ok { + dup[o] = struct{}{} + newAutoTo = append(newAutoTo, o) + } + } + autoTo = newAutoTo + + nAutoOutputs := len(autoTo) + tLog(t, "nAutoOutputs", nAutoOutputs) + + for i, o := range autoTo { + tLogf(t, "autoTo[%d].Coins %s\n", i, o.Coins) + } + + // Auto, random share factor + + result, err := c.WalletCreateTransaction(api.WalletCreateTransactionRequest{ + WalletID: w.Filename(), + Password: password, + Unsigned: unsigned, + CreateTransactionRequest: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + ShareFactor: shareFactor, + }, + ChangeAddress: &changeAddress, + To: autoTo, + }, + }) + require.NoError(t, err) + + assertEncodeTxnMatchesTxn(t, result) + assertTxnOutputCount(t, changeAddress, nAutoOutputs, result) + assertRequestedCoins(t, autoTo, result.Transaction.Out) + assertCreatedTransactionValid(t, result.Transaction, unsigned) + assertVerifyTransaction(t, result.EncodedTransaction, unsigned) + + // Auto, share factor 0 + + result, err = c.WalletCreateTransaction(api.WalletCreateTransactionRequest{ + WalletID: w.Filename(), + Password: password, + Unsigned: unsigned, + CreateTransactionRequest: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + ShareFactor: "0", + }, + ChangeAddress: &changeAddress, + To: autoTo, + }, + }) + require.NoError(t, err) + + assertEncodeTxnMatchesTxn(t, result) + assertTxnOutputCount(t, changeAddress, nAutoOutputs, result) + assertRequestedCoins(t, autoTo, result.Transaction.Out) + assertCreatedTransactionValid(t, result.Transaction, unsigned) + assertVerifyTransaction(t, result.EncodedTransaction, unsigned) + + // Check that the non-change outputs have 0 hours + for _, o := range result.Transaction.Out[:nAutoOutputs] { + require.Equal(t, "0", o.Hours) + } + + // Auto, share factor 1 + + result, err = c.WalletCreateTransaction(api.WalletCreateTransactionRequest{ + Unsigned: unsigned, + WalletID: w.Filename(), + Password: password, + CreateTransactionRequest: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + ShareFactor: "1", + }, + ChangeAddress: &changeAddress, + To: autoTo, + }, + }) + require.NoError(t, err) + + assertEncodeTxnMatchesTxn(t, result) + assertTxnOutputCount(t, changeAddress, nAutoOutputs, result) + assertRequestedCoins(t, autoTo, result.Transaction.Out) + assertCreatedTransactionValid(t, result.Transaction, unsigned) + assertVerifyTransaction(t, result.EncodedTransaction, unsigned) + + // Check that the change output has 0 hours + if len(result.Transaction.Out) > nAutoOutputs { + require.Equal(t, "0", result.Transaction.Out[nAutoOutputs].Hours) + } + + // Manual + + result, err = c.WalletCreateTransaction(api.WalletCreateTransactionRequest{ + Unsigned: unsigned, + WalletID: w.Filename(), + Password: password, + CreateTransactionRequest: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + ChangeAddress: &changeAddress, + To: to, + }, + }) + require.NoError(t, err) + + assertEncodeTxnMatchesTxn(t, result) + assertTxnOutputCount(t, changeAddress, nOutputs, result) + assertRequestedCoins(t, to, result.Transaction.Out) + assertRequestedHours(t, to, result.Transaction.Out) + assertCreatedTransactionValid(t, result.Transaction, unsigned) + assertVerifyTransaction(t, result.EncodedTransaction, unsigned) + } +} + +func assertEncodeTxnMatchesTxn(t *testing.T, result *api.CreateTransactionResponse) { + require.NotEmpty(t, result.EncodedTransaction) + emptyTxn := &coin.Transaction{} + require.NotEqual(t, emptyTxn.MustSerializeHex(), result.EncodedTransaction) + + txn, err := result.Transaction.ToTransaction() + require.NoError(t, err) + + require.Equal(t, txn.MustSerializeHex(), result.EncodedTransaction) + require.Equal(t, int(txn.Length), len(txn.MustSerialize())) +} + +func assertRequestedCoins(t *testing.T, to []api.Receiver, out []api.CreatedTransactionOutput) { + var requestedCoins uint64 + for _, o := range to { + c, err := droplet.FromString(o.Coins) + require.NoError(t, err) + requestedCoins += c + } + + var sentCoins uint64 + for _, o := range out[:len(to)] { // exclude change output + c, err := droplet.FromString(o.Coins) + require.NoError(t, err) + sentCoins += c + } + + require.Equal(t, requestedCoins, sentCoins) +} + +func assertRequestedHours(t *testing.T, to []api.Receiver, out []api.CreatedTransactionOutput) { + for i, o := range out[:len(to)] { // exclude change output + toHours, err := strconv.ParseUint(to[i].Hours, 10, 64) + require.NoError(t, err) + + outHours, err := strconv.ParseUint(o.Hours, 10, 64) + require.NoError(t, err) + require.Equal(t, toHours, outHours) + } +} + +func assertVerifyTransaction(t *testing.T, encodedTransaction string, unsigned bool) { + c := newClient() + _, err := c.VerifyTransaction(api.VerifyTransactionRequest{ + EncodedTransaction: encodedTransaction, + Unsigned: false, + }) + if unsigned { + assertResponseError(t, err, http.StatusUnprocessableEntity, "Transaction violates hard constraint: Unsigned input in transaction") + } else { + require.NoError(t, err) + } + + _, err = c.VerifyTransaction(api.VerifyTransactionRequest{ + EncodedTransaction: encodedTransaction, + Unsigned: true, + }) + if unsigned { + require.NoError(t, err) + } else { + assertResponseError(t, err, http.StatusUnprocessableEntity, "Transaction violates hard constraint: Unsigned transaction must contain a null signature") + } +} + +func assertCreatedTransactionValid(t *testing.T, r api.CreatedTransaction, unsigned bool) { + require.NotEmpty(t, r.In) + require.NotEmpty(t, r.Out) + + require.Equal(t, len(r.In), len(r.Sigs)) + if unsigned { + for _, s := range r.Sigs { + ss := cipher.MustSigFromHex(s) + require.True(t, ss.Null()) + } + } + + fee, err := strconv.ParseUint(r.Fee, 10, 64) + require.NoError(t, err) + + require.NotEqual(t, uint64(0), fee) + + var inputHours uint64 + var inputCoins uint64 + for _, in := range r.In { + require.NotNil(t, in.CalculatedHours) + calculatedHours, err := strconv.ParseUint(in.CalculatedHours, 10, 64) + require.NoError(t, err) + inputHours, err = mathutil.AddUint64(inputHours, calculatedHours) + require.NoError(t, err) + + require.NotNil(t, in.Hours) + hours, err := strconv.ParseUint(in.Hours, 10, 64) + require.NoError(t, err) + + require.True(t, hours <= calculatedHours) + + require.NotNil(t, in.Coins) + coins, err := droplet.FromString(in.Coins) + require.NoError(t, err) + inputCoins, err = mathutil.AddUint64(inputCoins, coins) + require.NoError(t, err) + } + + var outputHours uint64 + var outputCoins uint64 + for _, out := range r.Out { + hours, err := strconv.ParseUint(out.Hours, 10, 64) + require.NoError(t, err) + outputHours, err = mathutil.AddUint64(outputHours, hours) + require.NoError(t, err) + + coins, err := droplet.FromString(out.Coins) + require.NoError(t, err) + outputCoins, err = mathutil.AddUint64(outputCoins, coins) + require.NoError(t, err) + } + + require.True(t, inputHours > outputHours) + require.Equal(t, inputHours-outputHours, fee) + + require.Equal(t, inputCoins, outputCoins) + + require.Equal(t, uint8(0), r.Type) + require.NotEmpty(t, r.Length) +} + +func getTransaction(t *testing.T, c *api.Client, txid string) *readable.TransactionWithStatus { + tx, err := c.Transaction(txid) + if err != nil { + t.Fatalf("%v", err) + } + + return tx +} + +// getAddressBalance gets balance of given address. +// Returns coins and coin hours. +func getAddressBalance(t *testing.T, c *api.Client, addr string) (uint64, uint64) { //nolint:unparam + bp, err := c.Balance([]string{addr}) + if err != nil { + t.Fatalf("%v", err) + } + return bp.Confirmed.Coins, bp.Confirmed.Hours +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/integration/wallet_test.go b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/wallet_test.go new file mode 100644 index 00000000..eb3449a6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/integration/wallet_test.go @@ -0,0 +1,1159 @@ +package integration_test + +import ( + "encoding/hex" + "fmt" + "net/http" + "os" + "path/filepath" + "strings" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/api" + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/bip39" + "github.com/SkycoinProject/skycoin/src/cipher/bip44" + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/wallet" +) + +func skipWalletIfLive(t *testing.T) bool { + skip := enabled() && mode(t) == testModeLive && !doLiveWallet(t) + if skip { + t.Skip("live wallet tests disabled") + } + return skip +} + +func TestWalletNewSeed(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + if skipWalletIfLive(t) { + return + } + + cases := []struct { + name string + entropy int + numWords int + errCode int + errMsg string + }{ + { + name: "entropy 128", + entropy: 128, + numWords: 12, + }, + { + name: "entropy 256", + entropy: 256, + numWords: 24, + }, + { + name: "entropy 100", + entropy: 100, + errCode: http.StatusBadRequest, + errMsg: "400 Bad Request - entropy length must be 128 or 256", + }, + } + + c := newClient() + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + seed, err := c.NewSeed(tc.entropy) + if tc.errMsg != "" { + assertResponseError(t, err, tc.errCode, tc.errMsg) + return + } + + require.NoError(t, err) + words := strings.Split(seed, " ") + require.Len(t, words, tc.numWords) + + // no extra whitespace on the seed + require.Equal(t, seed, strings.TrimSpace(seed)) + + // should generate a different seed each time + seed2, err := c.NewSeed(tc.entropy) + require.NoError(t, err) + require.NotEqual(t, seed, seed2) + }) + } +} + +func TestCreateWallet(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + if skipWalletIfLive(t) { + return + } + + c := newClient() + + mnemonicSeed := bip39.MustNewDefaultMnemonic() + + cases := []struct { + name string + seed string + seedPassphrase string + xpub string + walletType string + encrypted bool + }{ + { + name: "deterministic encrypted", + seed: "fooseed2", + walletType: wallet.WalletTypeDeterministic, + encrypted: true, + }, + { + name: "deterministic unencrypted", + seed: "fooseed2", + walletType: wallet.WalletTypeDeterministic, + }, + + { + name: "bip44 with seed passphrase encrypted", + seed: mnemonicSeed, + seedPassphrase: "foobar", + walletType: wallet.WalletTypeBip44, + encrypted: true, + }, + { + name: "bip44 without seed passphrase encrypted", + seed: mnemonicSeed, + seedPassphrase: "", + walletType: wallet.WalletTypeBip44, + encrypted: true, + }, + { + name: "bip44 with seed passphrase unencrypted", + seed: mnemonicSeed, + seedPassphrase: "foobar", + walletType: wallet.WalletTypeBip44, + }, + { + name: "bip44 without seed passphrase unencrypted", + seed: mnemonicSeed, + seedPassphrase: "", + walletType: wallet.WalletTypeBip44, + }, + + { + name: "xpub wallet", + xpub: "xpub6CkxdS1d4vNqqcnf9xPgqR5e2jE2PZKmKSw93QQMjHE1hRk22nU4zns85EDRgmLWYXYtu62XexwqaET33XA28c26NbXCAUJh1xmqq6B3S2v", + walletType: wallet.WalletTypeXPub, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + pwd := "" + if tc.encrypted { + pwd = "pwd" + } + + w, _, clean := createWallet(t, c, api.CreateWalletOptions{ + Type: tc.walletType, + Seed: tc.seed, + SeedPassphrase: tc.seedPassphrase, + Password: pwd, + Encrypt: tc.encrypted, + XPub: tc.xpub, + }) + defer clean() + require.Equal(t, tc.encrypted, w.Meta.Encrypted) + + walletDir := getWalletDir(t, c) + + // Confirms the wallet does exist + walletPath := filepath.Join(walletDir, w.Meta.Filename) + _, err := os.Stat(walletPath) + require.NoError(t, err) + + // Loads the wallet and confirms that the wallet has the same seed + lw, err := wallet.Load(walletPath) + require.NoError(t, err) + require.Equal(t, len(w.Entries), lw.EntriesLen()) + require.Equal(t, tc.walletType, lw.Type()) + + if tc.encrypted { + require.True(t, lw.IsEncrypted()) + require.Empty(t, lw.Seed()) + require.Empty(t, lw.SeedPassphrase()) + } else { + require.False(t, lw.IsEncrypted()) + require.Equal(t, tc.seed, lw.Seed()) + require.Equal(t, tc.seedPassphrase, lw.SeedPassphrase()) + } + + for i := range w.Entries { + require.Equal(t, w.Entries[i].Address, lw.GetEntryAt(i).Address.String()) + require.Equal(t, w.Entries[i].Public, lw.GetEntryAt(i).Public.Hex()) + + if tc.encrypted || tc.walletType == wallet.WalletTypeXPub { + require.True(t, lw.GetEntryAt(i).Secret.Null()) + } else { + require.False(t, lw.GetEntryAt(i).Secret.Null()) + } + + switch tc.walletType { + case wallet.WalletTypeBip44: + require.NotNil(t, w.Entries[i].ChildNumber) + require.Equal(t, uint32(i), *w.Entries[i].ChildNumber) + require.NotNil(t, w.Entries[i].Change) + require.Equal(t, bip44.ExternalChainIndex, *w.Entries[i].Change) + case wallet.WalletTypeXPub: + require.NotNil(t, w.Entries[i].ChildNumber) + require.Equal(t, uint32(i), *w.Entries[i].ChildNumber) + require.Nil(t, w.Entries[i].Change) + default: + require.Nil(t, w.Entries[i].ChildNumber) + require.Nil(t, w.Entries[i].Change) + } + } + }) + } +} + +func TestGetWallet(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + if skipWalletIfLive(t) { + return + } + + c := newClient() + + for _, walletType := range createWalletTypes { + t.Run(walletType, func(t *testing.T) { + // Create a wallet + w, _, clean := createWallet(t, c, api.CreateWalletOptions{ + Type: walletType, + }) + defer clean() + + // Confirms the wallet can be acquired + w1, err := c.Wallet(w.Meta.Filename) + require.NoError(t, err) + require.Equal(t, *w, *w1) + }) + } +} + +func TestGetWallets(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + if skipWalletIfLive(t) { + return + } + + c := newClient() + + // Creates 2 new wallets of each type + var ws []api.WalletResponse + for i := 0; i < 2; i++ { + for _, walletType := range createWalletTypes { + w, _, clean := createWallet(t, c, api.CreateWalletOptions{ + Type: walletType, + }) + defer clean() + ws = append(ws, *w) + } + } + + // Gets wallet from node + wlts, err := c.Wallets() + require.NoError(t, err) + + // Create the wallet map + walletMap := make(map[string]api.WalletResponse) + for _, w := range wlts { + walletMap[w.Meta.Filename] = w + } + + // Confirms the returned wallets contains the wallet we created. + for _, w := range ws { + retW, ok := walletMap[w.Meta.Filename] + require.True(t, ok) + require.Equal(t, w, retW) + } +} + +// TestWalletNewAddress will generate 30 wallets for testing, and they will +// be removed automatically after testing. +func TestWalletNewAddress(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + if skipWalletIfLive(t) { + return + } + + seed := bip39.MustNewDefaultMnemonic() + + cases := []struct { + name string + seed string + seedPassphrase string + walletType string + expectErr error + postWalletHandle func(t *testing.T, c *api.Client, wltName string) + }{ + { + name: "deterministic", + seed: seed, + walletType: wallet.WalletTypeDeterministic, + expectErr: nil, + }, + { + name: "deterministic writable=false", + seed: seed, + walletType: wallet.WalletTypeDeterministic, + postWalletHandle: func(t *testing.T, c *api.Client, wltName string) { + dir := getWalletDir(t, c) + wltPath := filepath.Join(dir, wltName) + err := os.Chmod(wltPath, 0555) // Remove write permission + require.NoError(t, err) + }, + expectErr: api.NewClientError("400 Bad Request", http.StatusBadRequest, "400 Bad Request - saving wallet permission denied"), + }, + { + name: "bip44 without seed passphrase", + seed: seed, + walletType: wallet.WalletTypeBip44, + expectErr: nil, + }, + { + name: "bip44 with seed passphrase", + seed: seed, + seedPassphrase: "foobar", + walletType: wallet.WalletTypeBip44, + expectErr: nil, + }, + } + + // We only test 30 cases, because the more addresses we generate, the longer + // it takes, we don't want to spend much time here. + for _, tc := range cases { + for i := 1; i <= 30; i++ { + name := fmt.Sprintf("%s generate %v addresses", tc.name, i) + t.Run(name, func(t *testing.T) { + c := newClient() + var encrypt bool + var password string + // Test wallet with encryption only when i == 2, so that + // the tests won't time out. + if i == 2 { + encrypt = true + password = "pwd" + } + + w, _, clean := createWallet(t, c, api.CreateWalletOptions{ + Type: tc.walletType, + Seed: tc.seed, + SeedPassphrase: tc.seedPassphrase, + Password: password, + Encrypt: encrypt, + }) + defer clean() + if tc.postWalletHandle != nil { + tc.postWalletHandle(t, c, w.Meta.Filename) + } + + addrs, err := c.NewWalletAddress(w.Meta.Filename, i, password) + require.Equal(t, tc.expectErr, err) + + // Confirms no intermediate tmp file exists + walletDir := getWalletDir(t, c) + wltPath := filepath.Join(walletDir, w.Meta.Filename) + ".tmp" + _, existErr := os.Stat(wltPath) + require.True(t, os.IsNotExist(existErr)) + + if err != nil { + return + } + + switch tc.walletType { + case wallet.WalletTypeDeterministic: + seckeys := cipher.MustGenerateDeterministicKeyPairs([]byte(tc.seed), i+1) + var as []string + for _, k := range seckeys { + as = append(as, cipher.MustAddressFromSecKey(k).String()) + } + + // Confirms that the new generated addresses match + require.Equal(t, len(addrs), len(as)-1) + for i := range addrs { + require.Equal(t, as[i+1], addrs[i]) + } + case wallet.WalletTypeBip44: + ss, err := bip39.NewSeed(tc.seed, tc.seedPassphrase) + require.NoError(t, err) + + cc, err := bip44.NewCoin(ss, bip44.CoinTypeSkycoin) + require.NoError(t, err) + + acct, err := cc.Account(0) + require.NoError(t, err) + + ext, err := acct.External() + require.NoError(t, err) + + var as []string + for j := uint32(0); j < uint32(i+1); j++ { + k, err := ext.NewPrivateChildKey(j) + require.NoError(t, err) + sk := cipher.MustNewSecKey(k.Key) + as = append(as, cipher.MustAddressFromSecKey(sk).String()) + } + + // Confirms that the new generated addresses match + require.Equal(t, len(addrs), len(as)-1) + for i := range addrs { + require.Equal(t, as[i+1], addrs[i]) + } + default: + t.Fatalf("unhandled wallet type %q", tc.walletType) + } + }) + } + } +} + +func TestStableWalletBalance(t *testing.T) { + if !doStable(t) { + return + } + + seed := "casino away claim road artist where blossom warrior demise royal still palm" + xpub := "xpub6CkxdS1d4vNqqcnf9xPgqR5e2jE2PZKmKSw93QQMjHE1hRk22nU4zns85EDRgmLWYXYtu62XexwqaET33XA28c26NbXCAUJh1xmqq6B3S2v" + c := newClient() + + for _, walletType := range createWalletTypes { + t.Run(walletType, func(t *testing.T) { + opts := api.CreateWalletOptions{ + Type: walletType, + } + + switch walletType { + case wallet.WalletTypeBip44, wallet.WalletTypeDeterministic: + opts.Seed = seed + case wallet.WalletTypeXPub: + opts.XPub = xpub + } + + w, _, clean := createWallet(t, c, opts) + defer clean() + + bp, err := c.WalletBalance(w.Meta.Filename) + require.NoError(t, err) + + var expect api.BalanceResponse + checkGoldenFile(t, fmt.Sprintf("wallet-balance-%s.golden", walletType), TestData{*bp, &expect}) + }) + } +} + +func TestLiveWalletBalance(t *testing.T) { + if !doLive(t) { + return + } + + requireWalletEnv(t) + + c := newClient() + _, walletName, _ := getWalletFromEnv(t, c) + bp, err := c.WalletBalance(walletName) + require.NoError(t, err) + require.NotNil(t, bp) + require.NotNil(t, bp.Addresses) +} + +func TestWalletUpdate(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + if skipWalletIfLive(t) { + return + } + + c := newClient() + for _, walletType := range createWalletTypes { + t.Run(walletType, func(t *testing.T) { + w, _, clean := createWallet(t, c, api.CreateWalletOptions{ + Type: walletType, + }) + defer clean() + + err := c.UpdateWallet(w.Meta.Filename, "new wallet") + require.NoError(t, err) + + // Confirms the wallet has label of "new wallet" + w1, err := c.Wallet(w.Meta.Filename) + require.NoError(t, err) + require.Equal(t, w1.Meta.Label, "new wallet") + }) + } +} + +func TestStableWalletUnconfirmedTransactions(t *testing.T) { + if !doStable(t) { + return + } + + c := newClient() + for _, walletType := range createWalletTypes { + t.Run(walletType, func(t *testing.T) { + w, _, clean := createWallet(t, c, api.CreateWalletOptions{ + Type: walletType, + }) + defer clean() + + txns, err := c.WalletUnconfirmedTransactions(w.Meta.Filename) + require.NoError(t, err) + + goldenFile := fmt.Sprintf("wallet-%s-transactions.golden", walletType) + var expect api.UnconfirmedTxnsResponse + checkGoldenFile(t, goldenFile, TestData{*txns, &expect}) + }) + } +} + +func TestLiveWalletUnconfirmedTransactions(t *testing.T) { + if !doLive(t) { + return + } + + requireWalletEnv(t) + + c := newClient() + w, _, _, _ := prepareAndCheckWallet(t, c, 1e6, 1) + txns, err := c.WalletUnconfirmedTransactions(w.Filename()) + require.NoError(t, err) + + bp, err := c.WalletBalance(w.Filename()) + require.NoError(t, err) + // There's pending transactions if predicted coins are not the same as confirmed coins + if bp.Predicted.Coins != bp.Confirmed.Coins { + require.NotEmpty(t, txns.Transactions) + return + } + + require.Empty(t, txns.Transactions) +} + +func TestStableWalletUnconfirmedTransactionsVerbose(t *testing.T) { + if !doStable(t) { + return + } + + c := newClient() + for _, walletType := range createWalletTypes { + t.Run(walletType, func(t *testing.T) { + w, _, clean := createWallet(t, c, api.CreateWalletOptions{ + Type: walletType, + }) + defer clean() + + txns, err := c.WalletUnconfirmedTransactionsVerbose(w.Meta.Filename) + require.NoError(t, err) + + goldenFile := fmt.Sprintf("wallet-%s-transactions-verbose.golden", walletType) + var expect api.UnconfirmedTxnsVerboseResponse + checkGoldenFile(t, goldenFile, TestData{*txns, &expect}) + }) + } +} + +func TestLiveWalletUnconfirmedTransactionsVerbose(t *testing.T) { + if !doLive(t) { + return + } + + requireWalletEnv(t) + + c := newClient() + w, _, _, _ := prepareAndCheckWallet(t, c, 1e6, 1) + txns, err := c.WalletUnconfirmedTransactionsVerbose(w.Filename()) + require.NoError(t, err) + + bp, err := c.WalletBalance(w.Filename()) + require.NoError(t, err) + // There's pending transactions if predicted coins are not the same as confirmed coins + if bp.Predicted.Coins != bp.Confirmed.Coins { + require.NotEmpty(t, txns.Transactions) + return + } + + require.Empty(t, txns.Transactions) +} + +func TestWalletFolderName(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + if skipWalletIfLive(t) { + return + } + + c := newClient() + folderName, err := c.WalletFolderName() + require.NoError(t, err) + + require.NotNil(t, folderName) + require.NotEmpty(t, folderName.Address) +} + +func TestEncryptWallet(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + if skipWalletIfLive(t) { + return + } + + c := newClient() + + // Create a unencrypted wallet + for _, walletType := range createWalletTypes { + t.Run(walletType, func(t *testing.T) { + w, _, clean := createWallet(t, c, api.CreateWalletOptions{ + Type: walletType, + }) + defer clean() + + // Encrypts the wallet + rlt, err := c.EncryptWallet(w.Meta.Filename, "pwd") + require.NoError(t, err) + require.NotEmpty(t, rlt.Meta.CryptoType) + require.True(t, rlt.Meta.Encrypted) + + // Encrypt the wallet again, should returns error + _, err = c.EncryptWallet(w.Meta.Filename, "pwd") + assertResponseError(t, err, http.StatusBadRequest, "400 Bad Request - wallet is encrypted") + + // Confirms that no sensitive data do exist in wallet file + wf, err := c.WalletFolderName() + require.NoError(t, err) + wltPath := filepath.Join(wf.Address, w.Meta.Filename) + lw, err := wallet.Load(wltPath) + require.NoError(t, err) + require.Empty(t, lw.Seed()) + require.Empty(t, lw.LastSeed()) + require.NotEmpty(t, lw.Secrets()) + + // Decrypts the wallet, and confirms that the + // seed and address entries are the same as it was before being encrypted. + dw, err := c.DecryptWallet(w.Meta.Filename, "pwd") + require.NoError(t, err) + require.Equal(t, w, dw) + }) + } +} + +func TestDecryptWallet(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + if skipWalletIfLive(t) { + return + } + + c := newClient() + + for _, walletType := range createWalletTypes { + t.Run(walletType, func(t *testing.T) { + w, seed, clean := createWallet(t, c, api.CreateWalletOptions{ + Type: walletType, + Password: "pwd", + Encrypt: true, + }) + defer clean() + + // Decrypt wallet with different password, must fail + _, err := c.DecryptWallet(w.Meta.Filename, "pwd1") + assertResponseError(t, err, http.StatusBadRequest, "400 Bad Request - invalid password") + + // Decrypt wallet with no password, must fail + _, err = c.DecryptWallet(w.Meta.Filename, "") + assertResponseError(t, err, http.StatusBadRequest, "400 Bad Request - missing password") + + // Decrypts wallet with correct password + dw, err := c.DecryptWallet(w.Meta.Filename, "pwd") + require.NoError(t, err) + + // Confirms that no sensitive data are returned + require.Empty(t, dw.Meta.CryptoType) + require.False(t, dw.Meta.Encrypted) + + // Loads wallet from file + wf, err := c.WalletFolderName() + require.NoError(t, err) + wltPath := filepath.Join(wf.Address, w.Meta.Filename) + lw, err := wallet.Load(wltPath) + require.NoError(t, err) + + require.Equal(t, lw.Seed(), seed) + require.Equal(t, 1, lw.EntriesLen()) + + switch walletType { + case wallet.WalletTypeDeterministic: + // Confirms the last seed matches + lseed, seckeys := cipher.MustGenerateDeterministicKeyPairsSeed([]byte(seed), 1) + require.Equal(t, hex.EncodeToString(lseed), lw.LastSeed()) + + // Confirms that the first address is derived from the private key + pubkey := cipher.MustPubKeyFromSecKey(seckeys[0]) + require.Equal(t, w.Entries[0].Address, cipher.AddressFromPubKey(pubkey).String()) + require.Equal(t, lw.GetEntryAt(0).Address.String(), w.Entries[0].Address) + require.Empty(t, lw.XPub()) + + case wallet.WalletTypeBip44: + require.Empty(t, lw.LastSeed()) + require.Empty(t, lw.XPub()) + + case wallet.WalletTypeXPub: + require.Empty(t, lw.Seed()) + require.Empty(t, lw.LastSeed()) + require.NotEmpty(t, lw.XPub()) + + default: + t.Fatalf("unhandled wallet type %q", walletType) + } + }) + } +} + +func TestRecoverWallet(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + if skipWalletIfLive(t) { + return + } + + // Create an encrypted wallet with some addresses pregenerated, + // to make sure recover recovers the same number of addresses + c := newClient() + wf, err := c.WalletFolderName() + require.NoError(t, err) + + // Load the wallet from disk to check that it was saved + checkWalletOnDisk := func(w *api.WalletResponse) { + wltPath := filepath.Join(wf.Address, w.Meta.Filename) + lw, err := wallet.Load(wltPath) + require.NoError(t, err) + lwr, err := api.NewWalletResponse(lw) + require.NoError(t, err) + require.Equal(t, w, lwr) + } + + cases := []struct { + name string + seed string + seedPassphrase string + badSeed string + walletType string + }{ + { + name: "deterministic", + seed: "fooseed", + badSeed: "fooseed2", + walletType: wallet.WalletTypeDeterministic, + }, + { + name: "bip44 with seed passphrase", + seed: "voyage say extend find sheriff surge priority merit ignore maple cash argue", + seedPassphrase: "foobar", + badSeed: "mule seed lady practice desk length roast tongue attract heavy spirit focus", + walletType: wallet.WalletTypeBip44, + }, + { + name: "bip44 without seed passphrase", + seed: "voyage say extend find sheriff surge priority merit ignore maple cash argue", + seedPassphrase: "", + badSeed: "mule seed lady practice desk length roast tongue attract heavy spirit focus", + walletType: wallet.WalletTypeBip44, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + w, _, clean := createWallet(t, c, api.CreateWalletOptions{ + Type: tc.walletType, + Seed: tc.seed, + SeedPassphrase: tc.seedPassphrase, + }) + defer clean() + + _, err = c.NewWalletAddress(w.Meta.Filename, 10, "") + require.NoError(t, err) + + w, err = c.Wallet(w.Meta.Filename) + require.NoError(t, err) + + // Recover fails if the wallet is not encrypted + _, err = c.RecoverWallet(api.WalletRecoverRequest{ + ID: w.Meta.Filename, + Seed: tc.seed, + SeedPassphrase: tc.seedPassphrase, + }) + assertResponseError(t, err, http.StatusBadRequest, "wallet is not encrypted") + + _, err = c.EncryptWallet(w.Meta.Filename, "pwd") + require.NoError(t, err) + + // Recovery fails if the seed doesn't match + _, err = c.RecoverWallet(api.WalletRecoverRequest{ + ID: w.Meta.Filename, + Seed: tc.badSeed, + SeedPassphrase: tc.seedPassphrase, + }) + assertResponseError(t, err, http.StatusBadRequest, "wallet recovery seed or seed passphrase is wrong") + + // Recovery fails if the seed passphrase doesn't match + _, err = c.RecoverWallet(api.WalletRecoverRequest{ + ID: w.Meta.Filename, + Seed: tc.seed, + SeedPassphrase: tc.seedPassphrase + "2", + }) + + switch tc.walletType { + case wallet.WalletTypeBip44: + assertResponseError(t, err, http.StatusBadRequest, "wallet recovery seed or seed passphrase is wrong") + case wallet.WalletTypeDeterministic: + assertResponseError(t, err, http.StatusBadRequest, "RecoverWallet failed to create temporary wallet for fingerprint comparison: seedPassphrase is only used for \"bip44\" wallets") + default: + t.Fatalf("unhandled wallet type %q", tc.walletType) + } + + // Successful recovery with no new password + w2, err := c.RecoverWallet(api.WalletRecoverRequest{ + ID: w.Meta.Filename, + Seed: tc.seed, + SeedPassphrase: tc.seedPassphrase, + }) + require.NoError(t, err) + require.False(t, w2.Meta.Encrypted) + checkWalletOnDisk(w2) + require.Equal(t, w, w2) + + _, err = c.EncryptWallet(w.Meta.Filename, "pwd2") + require.NoError(t, err) + + // Successful recovery with a new password + w3, err := c.RecoverWallet(api.WalletRecoverRequest{ + ID: w.Meta.Filename, + Seed: tc.seed, + SeedPassphrase: tc.seedPassphrase, + Password: "pwd3", + }) + require.NoError(t, err) + require.True(t, w3.Meta.Encrypted) + require.Equal(t, wallet.CryptoTypeScryptChacha20poly1305, w3.Meta.CryptoType) + checkWalletOnDisk(w3) + w3.Meta.Encrypted = w.Meta.Encrypted + w3.Meta.CryptoType = w.Meta.CryptoType + require.Equal(t, w, w3) + + w4, err := c.DecryptWallet(w.Meta.Filename, "pwd3") + require.NoError(t, err) + require.False(t, w.Meta.Encrypted) + require.Equal(t, w, w4) + }) + } +} + +func TestVerifyWallet(t *testing.T) { + if !doLiveOrStable(t) { + return + } + c := newClient() + + // check with correct seed + isValid, err := c.VerifySeed("nut wife logic sample addict shop before tobacco crisp bleak lawsuit affair") + require.NoError(t, err) + require.True(t, isValid) + + // check with incorrect seed + isValid, err = c.VerifySeed("nut ") + require.False(t, isValid) + assertResponseError(t, err, http.StatusUnprocessableEntity, bip39.ErrSurroundingWhitespace.Error()) +} + +func TestGetWalletSeedDisabledAPI(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + if mode(t) == testModeLive && !*testLiveWallet { + t.Skip("Skipping tests because live mode enabled but wallet tests disabled") + } + + if mode(t) == testModeEnableSeedAPI { + t.Skip("Skipping because enable seed API tests is on") + } + + c := newClient() + + for _, walletType := range []string{ + wallet.WalletTypeBip44, + wallet.WalletTypeDeterministic, + } { + t.Run(walletType, func(t *testing.T) { + // Create an encrypted wallet + w, _, clean := createWallet(t, c, api.CreateWalletOptions{ + Type: walletType, + Password: "pwd", + Encrypt: true, + }) + defer clean() + + _, err := c.WalletSeed(w.Meta.Filename, "pwd") + assertResponseError(t, err, http.StatusForbidden, "403 Forbidden - Endpoint is disabled") + }) + } +} + +func TestGetWalletSeedEnabledAPI(t *testing.T) { + if !doEnableSeedAPI(t) { + return + } + + c := newClient() + + cases := []struct { + name string + walletType string + seed1 string + seed2 string + seedPassphrase string + }{ + { + name: "deterministic", + walletType: wallet.WalletTypeDeterministic, + seed1: bip39.MustNewDefaultMnemonic(), + seed2: bip39.MustNewDefaultMnemonic(), + }, + { + name: "bip44 without seed passphrase", + walletType: wallet.WalletTypeBip44, + seed1: bip39.MustNewDefaultMnemonic(), + seed2: bip39.MustNewDefaultMnemonic(), + }, + { + name: "bip44 with seed passphrase", + walletType: wallet.WalletTypeBip44, + seed1: bip39.MustNewDefaultMnemonic(), + seed2: bip39.MustNewDefaultMnemonic(), + seedPassphrase: "foobar", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + require.NotEmpty(t, tc.seed1) + require.NotEmpty(t, tc.seed2) + + // Create an encrypted wallet + w, _, clean := createWallet(t, c, api.CreateWalletOptions{ + Type: tc.walletType, + Seed: tc.seed1, + SeedPassphrase: tc.seedPassphrase, + Password: "pwd", + Encrypt: true, + }) + defer clean() + + resp, err := c.WalletSeed(w.Meta.Filename, "pwd") + require.NoError(t, err) + + // Confirms the seed are matched + require.Equal(t, tc.seed1, resp.Seed) + require.Equal(t, tc.seedPassphrase, resp.SeedPassphrase) + + // Get seed of wrong wallet id + _, err = c.WalletSeed("w.wlt", "pwd") + assertResponseError(t, err, http.StatusNotFound, "404 Not Found") + + // Check with invalid password + _, err = c.WalletSeed(w.Meta.Filename, "wrong password") + assertResponseError(t, err, http.StatusBadRequest, "400 Bad Request - invalid password") + + // Check with missing password + _, err = c.WalletSeed(w.Meta.Filename, "") + assertResponseError(t, err, http.StatusBadRequest, "400 Bad Request - missing password") + + // Create unencrypted wallet to check against + nw, _, nclean := createWallet(t, c, api.CreateWalletOptions{ + Type: tc.walletType, + Seed: tc.seed2, + SeedPassphrase: tc.seedPassphrase, + }) + defer nclean() + _, err = c.WalletSeed(nw.Meta.Filename, "pwd") + assertResponseError(t, err, http.StatusBadRequest, "400 Bad Request - wallet is not encrypted") + }) + } +} + +// prepareAndCheckWallet gets wallet from environment, and confirms: +// 1. The minimal coins and coin hours requirements are met. +// 2. The wallet has at least two address entry. +// Returns the loaded wallet, total coins, total coin hours and password of the wallet. +func prepareAndCheckWallet(t *testing.T, c *api.Client, minCoins, minCoinHours uint64) (wallet.Wallet, uint64, uint64, string) { + walletDir, walletName, password := getWalletFromEnv(t, c) + walletPath := filepath.Join(walletDir, walletName) + + // Checks if the wallet does exist + if _, err := os.Stat(walletPath); os.IsNotExist(err) { + t.Fatalf("Wallet %v doesn't exist", walletPath) + } + + w, err := wallet.Load(walletPath) + if err != nil { + t.Fatalf("Load wallet %v failed: %v", walletPath, err) + } + + if w.IsEncrypted() && password == "" { + t.Fatalf("Wallet is encrypted, must set WALLET_PASSWORD env var") + } + + // Generate more addresses if address entries less than 2. + if w.EntriesLen() < 2 { + _, err := c.NewWalletAddress(w.Filename(), 2-w.EntriesLen(), password) + if err != nil { + t.Fatalf("New wallet address failed: %v", err) + } + + w, err = wallet.Load(walletPath) + if err != nil { + t.Fatalf("Reload wallet %v failed: %v", walletPath, err) + } + } + + coins, hours := getWalletBalance(t, c, walletName) + if coins < minCoins { + t.Fatalf("Wallet must have at least %d coins", minCoins) + } + + if hours < minCoinHours { + t.Fatalf("Wallet must have at least %d coin hours", minCoinHours) + } + + if err := wallet.Save(w, walletDir); err != nil { + t.Fatalf("%v", err) + } + + return w, coins, hours, password +} + +// getWalletFromEnv loads wallet from environment variables. +// Returns wallet dir, wallet name and wallet password is any. +func getWalletFromEnv(t *testing.T, c *api.Client) (string, string, string) { + walletDir := getWalletDir(t, c) + + walletName := os.Getenv("API_WALLET_ID") + if walletName == "" { + t.Fatal("Missing API_WALLET_ID environment value") + } + + walletPassword := os.Getenv("WALLET_PASSWORD") + return walletDir, walletName, walletPassword +} + +func requireWalletEnv(t *testing.T) { + if !doLiveWallet(t) { + return + } + + walletName := os.Getenv("API_WALLET_ID") + if walletName == "" { + t.Fatal("missing API_WALLET_ID environment value") + } +} + +// getWalletBalance gets wallet balance. +// Returns coins and hours +func getWalletBalance(t *testing.T, c *api.Client, walletName string) (uint64, uint64) { + wp, err := c.WalletBalance(walletName) + if err != nil { + t.Fatalf("Get wallet balance of %v failed: %v", walletName, err) + } + + return wp.Confirmed.Coins, wp.Confirmed.Hours +} + +func getWalletDir(t *testing.T, c *api.Client) string { + wf, err := c.WalletFolderName() + if err != nil { + t.Fatalf("%v", err) + } + return wf.Address +} + +var createWalletTypes = []string{ + wallet.WalletTypeDeterministic, + wallet.WalletTypeBip44, + wallet.WalletTypeXPub, + // wallet.WalletTypeCollection, // TODO +} + +func createWallet(t *testing.T, c *api.Client, o api.CreateWalletOptions) (*api.WalletResponse, string, func()) { + switch o.Type { + case wallet.WalletTypeDeterministic, wallet.WalletTypeBip44: + if o.Seed == "" { + o.Seed = bip39.MustNewDefaultMnemonic() + } + case wallet.WalletTypeXPub: + if o.XPub == "" { + o.XPub = testutil.RandXPub(t).String() + } + } + + if o.Label == "" { + o.Label = hex.EncodeToString(testutil.RandBytes(t, 6)) + } + + w, err := c.CreateWallet(o) + require.NoError(t, err) + + walletDir := getWalletDir(t, c) + + return w, o.Seed, func() { + // Cleaner function to delete the wallet and bak wallet + walletPath := filepath.Join(walletDir, w.Meta.Filename) + err = os.Remove(walletPath) + require.NoError(t, err) + + bakWalletPath := walletPath + ".bak" + if _, err := os.Stat(bakWalletPath); !os.IsNotExist(err) { + // Return directly if no .bak file does exist + err = os.Remove(bakWalletPath) + require.NoError(t, err) + } + + require.NoError(t, err) + + // Removes the wallet from memory + err = c.UnloadWallet(w.Meta.Filename) + require.NoError(t, err) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/metrics.go b/vendor/github.com/SkycoinProject/skycoin/src/api/metrics.go new file mode 100644 index 00000000..fd73b906 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/metrics.go @@ -0,0 +1,85 @@ +package api + +import ( + "net/http" + + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promhttp" + + wh "github.com/SkycoinProject/skycoin/src/util/http" +) + +var ( + promUnspents = prometheus.NewGauge( + prometheus.GaugeOpts{ + Name: "unspent_outputs", + Help: "Number of unspent outputs", + }) + promUnconfirmedTxns = prometheus.NewGauge( + prometheus.GaugeOpts{ + Name: "unconfirmed_txns", + Help: "Number of unconfirmed transactions", + }) + promTimeSinceLastBlock = prometheus.NewGauge( + prometheus.GaugeOpts{ + Name: "time_since_last_block_seconds", + Help: "Time since the last block created", + }) + promOpenConns = prometheus.NewGauge( + prometheus.GaugeOpts{ + Name: "open_connections", + Help: "Number of open connections", + }) + promOutgoingConns = prometheus.NewGauge( + prometheus.GaugeOpts{ + Name: "outgoing_connections", + Help: "Number of outgoing connections", + }) + promIncomingConns = prometheus.NewGauge( + prometheus.GaugeOpts{ + Name: "incoming_connections", + Help: "Number of incoming connections", + }) + promStartedAt = prometheus.NewGauge( + prometheus.GaugeOpts{ + Name: "started_at", + Help: "Node start time, in unixtime", + }) + promLastBlockSeq = prometheus.NewGauge( + prometheus.GaugeOpts{ + Name: "last_block_seq", + Help: "Last block sequence number", + }) +) + +func init() { + prometheus.MustRegister(promUnspents) + prometheus.MustRegister(promUnconfirmedTxns) + prometheus.MustRegister(promTimeSinceLastBlock) + prometheus.MustRegister(promOpenConns) + prometheus.MustRegister(promOutgoingConns) + prometheus.MustRegister(promIncomingConns) + prometheus.MustRegister(promStartedAt) + prometheus.MustRegister(promLastBlockSeq) +} + +func metricsHandler(c muxConfig, gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + health, err := getHealthData(c, gateway) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + promUnspents.Set(float64(health.BlockchainMetadata.Unspents)) + promUnconfirmedTxns.Set(float64(health.BlockchainMetadata.Unconfirmed)) + promTimeSinceLastBlock.Set(health.BlockchainMetadata.TimeSinceLastBlock.Seconds()) + promOpenConns.Set(float64(health.OpenConnections)) + promOutgoingConns.Set(float64(health.OutgoingConnections)) + promIncomingConns.Set(float64(health.IncomingConnections)) + promStartedAt.Set(float64(gateway.StartedAt().Unix())) + promLastBlockSeq.Set(float64(health.BlockchainMetadata.Head.BkSeq)) + + promhttp.Handler().ServeHTTP(w, r) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/middleware.go b/vendor/github.com/SkycoinProject/skycoin/src/api/middleware.go new file mode 100644 index 00000000..357883b7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/middleware.go @@ -0,0 +1,208 @@ +package api + +import ( + "crypto/subtle" + "fmt" + "net/http" + "net/url" + "strings" + + "github.com/SkycoinProject/skycoin/src/cipher" + wh "github.com/SkycoinProject/skycoin/src/util/http" + "github.com/SkycoinProject/skycoin/src/util/iputil" +) + +// ContentSecurityPolicy represents the value of content-security-policy +// header in http response +const ContentSecurityPolicy = "default-src 'self'" + + "; connect-src 'self' https://api.coinpaprika.com https://swaplab.cc https://version.skycoin.com https://downloads.skycoin.com http://127.0.0.1:9510" + + "; img-src 'self' 'unsafe-inline' data:" + + "; style-src 'self' 'unsafe-inline'" + + "; object-src 'none'" + + "; form-action 'none'" + + "; frame-ancestors 'none'" + + "; block-all-mixed-content" + + "; base-uri 'self'" + +// CSPHandler sets the Content-Security-Policy header +func CSPHandler(handler http.Handler, policy string) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Security-Policy", policy) + handler.ServeHTTP(w, r) + }) +} + +// ContentTypeJSONRequired enforces Content-Type: application/json in a POST request. +// Return 415 Unsupported Media Type if the Content-Type is not application/json, +// in the V2 error format. +func ContentTypeJSONRequired(handler http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method == http.MethodPost { + contentType := r.Header.Get("Content-Type") + if !isContentTypeJSON(contentType) { + resp := NewHTTPErrorResponse(http.StatusUnsupportedMediaType, "") + writeHTTPResponse(w, resp) + return + } + } + + handler.ServeHTTP(w, r) + }) +} + +// isContentTypeJSON returns true if the content type is application/json, +// allowing the content-type string to include extra parameters like charset=utf-8, +// for example `Content-Type: application/json; charset=utf-8` will return true. +func isContentTypeJSON(contentType string) bool { + return contentType == ContentTypeJSON || strings.HasPrefix(contentType, ContentTypeJSON+";") +} + +// HostCheck checks that the request's Host header is 127.0.0.1:$port or localhost:$port +// if the HTTP interface host is also a localhost address. +// This prevents DNS rebinding attacks, where an attacker uses a DNS rebinding service +// to bypass CORS checks. +// If the HTTP interface host is not a localhost address, +// the Host header is not checked. This is considered a public interface. +// If the Host header is not set, it is not checked. +// All major browsers send the Host header as required by the HTTP spec. +// hostWhitelist allows additional Host header values to be accepted. +func HostCheck(host string, hostWhitelist []string, handler http.Handler) http.Handler { + return hostCheck(apiVersion1, host, hostWhitelist, handler) +} + +func hostCheck(apiVersion, host string, hostWhitelist []string, handler http.Handler) http.Handler { + addr := host + var port uint16 + if strings.Contains(host, ":") { + var err error + addr, port, err = iputil.SplitAddr(host) + if err != nil { + logger.Panic(err) + } + } + + isLocalhost := iputil.IsLocalhost(addr) + + if isLocalhost && port == 0 { + logger.Panic("localhost with no port specified is unsupported") + } + + hostWhitelistMap := make(map[string]struct{}, len(hostWhitelist)+2) + for _, k := range hostWhitelist { + hostWhitelistMap[k] = struct{}{} + } + hostWhitelistMap[fmt.Sprintf("127.0.0.1:%d", port)] = struct{}{} + hostWhitelistMap[fmt.Sprintf("localhost:%d", port)] = struct{}{} + + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + // NOTE: The "Host" header is not in http.Request.Header, it's put in the http.Request.Host field + _, isWhitelisted := hostWhitelistMap[r.Host] + if isLocalhost && r.Host != "" && !isWhitelisted { + logger.Critical().Errorf("Detected DNS rebind attempt - configured-host=%s header-host=%s", host, r.Host) + writeError(w, apiVersion, http.StatusForbidden, "Invalid Host") + return + } + + handler.ServeHTTP(w, r) + }) +} + +// OriginRefererCheck checks the Origin header if present, falling back on Referer. +// The Origin or Referer hostname must match the configured host. +// If neither are present, the request is allowed. All major browsers will set +// at least one of these values. If neither are set, assume it is a request +// from curl/wget. +func OriginRefererCheck(host string, hostWhitelist []string, handler http.Handler) http.Handler { + return originRefererCheck(apiVersion1, host, hostWhitelist, handler) +} + +func originRefererCheck(apiVersion, host string, hostWhitelist []string, handler http.Handler) http.Handler { + hostWhitelistMap := make(map[string]struct{}, len(hostWhitelist)+2) + for _, k := range hostWhitelist { + hostWhitelistMap[k] = struct{}{} + } + + if addr, port, _ := iputil.SplitAddr(host); iputil.IsLocalhost(addr) { //nolint:errcheck + hostWhitelistMap[fmt.Sprintf("127.0.0.1:%d", port)] = struct{}{} + hostWhitelistMap[fmt.Sprintf("localhost:%d", port)] = struct{}{} + } else { + hostWhitelistMap[host] = struct{}{} + } + + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + origin := r.Header.Get("Origin") + referer := r.Header.Get("Referer") + toCheck := origin + toCheckHeader := "Origin" + if toCheck == "" { + toCheck = referer + toCheckHeader = "Referer" + } + + if toCheck != "" { + u, err := url.Parse(toCheck) + if err != nil { + logger.Critical().Errorf("Invalid URL in %s header: %s %v", toCheckHeader, toCheck, err) + writeError(w, apiVersion, http.StatusForbidden, "Invalid URL in Origin or Referer header") + return + } + + if _, isWhitelisted := hostWhitelistMap[u.Host]; !isWhitelisted { + logger.Critical().Errorf("%s header value %s does not match host and is not whitelisted", toCheckHeader, toCheck) + writeError(w, apiVersion, http.StatusForbidden, "Invalid Origin or Referer") + return + } + } + + handler.ServeHTTP(w, r) + }) +} + +func basicAuth(apiVersion, username, password, realm string, f http.Handler) http.HandlerFunc { + needsAuth := username != "" || password != "" + usernamePasswordHash := cipher.SumSHA256(append([]byte(username), []byte(password)...)) + authHeader := fmt.Sprintf("Basic realm=%q", realm) + + return func(w http.ResponseWriter, r *http.Request) { + user, pass, ok := r.BasicAuth() + + if needsAuth { + if !ok { + w.Header().Set("WWW-Authenticate", authHeader) + writeError(w, apiVersion, http.StatusUnauthorized, "") + return + } + + userPassHash := cipher.SumSHA256(append([]byte(user), []byte(pass)...)) + + if subtle.ConstantTimeCompare(userPassHash[:], usernamePasswordHash[:]) != 1 { + w.Header().Set("WWW-Authenticate", authHeader) + writeError(w, apiVersion, http.StatusUnauthorized, "") + return + } + } else { + // If auth is not configured but the request provides auth, reject + // This will avoid a mistake where the daemon is not configured with auth, + // but the client is, and does not realize the daemon is not configured with auth + // because all requests are accepted + if user != "" || pass != "" { + w.Header().Set("WWW-Authenticate", authHeader) + writeError(w, apiVersion, http.StatusUnauthorized, "") + return + } + } + + f.ServeHTTP(w, r) + } +} + +func writeError(w http.ResponseWriter, apiVersion string, code int, msg string) { + switch apiVersion { + case apiVersion1: + wh.ErrorXXX(w, code, msg) + case apiVersion2: + writeHTTPResponse(w, NewHTTPErrorResponse(code, msg)) + default: + wh.Error500(w, "Invalid internal API version") + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/middleware_test.go b/vendor/github.com/SkycoinProject/skycoin/src/api/middleware_test.go new file mode 100644 index 00000000..835c2d94 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/middleware_test.go @@ -0,0 +1,284 @@ +package api + +import ( + "fmt" + "net/http" + "net/http/httptest" + "strings" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestOriginRefererCheck(t *testing.T) { + cases := []struct { + name string + origin string + referer string + enableHeaderCheck bool + status int + errV1 string + errV2 string + hostWhitelist []string + }{ + { + name: "unparseable origin header", + origin: ":?4foo", + enableHeaderCheck: true, + status: http.StatusForbidden, + errV1: "403 Forbidden - Invalid URL in Origin or Referer header\n", + errV2: "{\n \"error\": {\n \"message\": \"Invalid URL in Origin or Referer header\",\n \"code\": 403\n }\n}", + }, + { + name: "mismatched origin header", + origin: "http://example.com/", + enableHeaderCheck: true, + status: http.StatusForbidden, + errV1: "403 Forbidden - Invalid Origin or Referer\n", + errV2: "{\n \"error\": {\n \"message\": \"Invalid Origin or Referer\",\n \"code\": 403\n }\n}", + }, + { + name: "mismatched referer header", + referer: "http://example.com/", + enableHeaderCheck: true, + status: http.StatusForbidden, + errV1: "403 Forbidden - Invalid Origin or Referer\n", + errV2: "{\n \"error\": {\n \"message\": \"Invalid Origin or Referer\",\n \"code\": 403\n }\n}", + }, + { + name: "whitelisted referer header", + referer: "http://example.com/", + enableHeaderCheck: true, + hostWhitelist: []string{"example.com"}, + }, + { + name: "whitelisted origin header", + referer: "http://example.com/", + enableHeaderCheck: true, + hostWhitelist: []string{"example.com"}, + }, + { + name: "mismatched referer header", + referer: "http://example.com/", + enableHeaderCheck: false, + }, + { + name: "mismatched origin header", + origin: "http://example.com/", + enableHeaderCheck: false, + }, + } + + for _, endpoint := range allEndpoints() { + for _, tc := range cases { + name := fmt.Sprintf("%s %s", tc.name, endpoint) + t.Run(name, func(t *testing.T) { + gateway := &MockGatewayer{} + + req, err := http.NewRequest(http.MethodGet, endpoint, nil) + require.NoError(t, err) + + setCSRFParameters(t, tokenValid, req) + + isAPIV2 := strings.HasPrefix(endpoint, "/api/v2") + if isAPIV2 { + req.Header.Set("Content-Type", ContentTypeJSON) + } + + if tc.origin != "" { + req.Header.Set("Origin", tc.origin) + } + if tc.referer != "" { + req.Header.Set("Referer", tc.referer) + } + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = false + cfg.disableHeaderCheck = !tc.enableHeaderCheck + // disable all api sets to avoid mocking gateway methods + cfg.enabledAPISets = map[string]struct{}{} + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + switch tc.status { + case http.StatusForbidden: + require.Equal(t, tc.status, rr.Code) + + if isAPIV2 { + require.Equal(t, tc.errV2, rr.Body.String()) + } else { + require.Equal(t, tc.errV1, rr.Body.String()) + } + default: + if tc.enableHeaderCheck || tc.hostWhitelist == nil { + // Arbitrary endpoints could return any status, since we don't customize the request per endpoint + // Make sure that the request only didn't return the origin check error + require.False(t, strings.Contains("Invalid URL in Origin or Referer header", rr.Body.String())) + require.False(t, strings.Contains("Invalid Origin or Referer", rr.Body.String())) + } + } + + }) + } + } +} + +func TestHostCheck(t *testing.T) { + cases := []struct { + name string + host string + status int + enableHeaderCheck bool + errV1 string + errV2 string + hostWhitelist []string + }{ + { + name: "invalid host", + host: "example.com", + status: http.StatusForbidden, + enableHeaderCheck: true, + errV1: "403 Forbidden - Invalid Host\n", + errV2: "{\n \"error\": {\n \"message\": \"Invalid Host\",\n \"code\": 403\n }\n}", + }, + { + name: "invalid host is whitelisted", + host: "example.com", + hostWhitelist: []string{"example.com"}, + enableHeaderCheck: true, + }, + { + name: "invalid host - header check disabled", + host: "example.com", + enableHeaderCheck: false, + }, + } + + for endpoint, methods := range endpointsMethods { + for _, m := range methods { + for _, tc := range cases { + name := fmt.Sprintf("%s %s %s", tc.name, m, endpoint) + t.Run(name, func(t *testing.T) { + gateway := &MockGatewayer{} + + req, err := http.NewRequest(m, endpoint, nil) + require.NoError(t, err) + + setCSRFParameters(t, tokenValid, req) + + isAPIV2 := strings.HasPrefix(endpoint, "/api/v2") + if isAPIV2 { + req.Header.Set("Content-Type", ContentTypeJSON) + } + + req.Host = "example.com" + + rr := httptest.NewRecorder() + handler := newServerMux(muxConfig{ + host: configuredHost, + appLoc: ".", + disableCSRF: false, + disableHeaderCheck: !tc.enableHeaderCheck, + disableCSP: true, + hostWhitelist: tc.hostWhitelist, + }, gateway) + + handler.ServeHTTP(rr, req) + + switch tc.status { + case http.StatusForbidden: + require.Equal(t, http.StatusForbidden, rr.Code) + if isAPIV2 { + require.Equal(t, tc.errV2, rr.Body.String()) + } else { + require.Equal(t, tc.errV1, rr.Body.String()) + } + default: + if tc.enableHeaderCheck || tc.hostWhitelist == nil { + // Arbitrary endpoints could return any status, since we don't customize the request per endpoint + // Make sure that the request only didn't return the invalid host error + require.False(t, strings.Contains("Invalid Host", rr.Body.String())) + } + } + }) + } + } + } +} + +func TestContentSecurityPolicy(t *testing.T) { + tt := []struct { + name string + endpoint string + enableCSP bool + appLoc string + expectCSPHeader string + enableGUI bool + }{ + { + name: "enable CSP GET /", + endpoint: "/", + enableCSP: true, + appLoc: "../gui/static/dist", + expectCSPHeader: "default-src 'self'; connect-src 'self' https://api.coinpaprika.com https://swaplab.cc https://version.skycoin.com https://downloads.skycoin.com http://127.0.0.1:9510; img-src 'self' 'unsafe-inline' data:; style-src 'self' 'unsafe-inline'; object-src 'none'; form-action 'none'; frame-ancestors 'none'; block-all-mixed-content; base-uri 'self'", + enableGUI: true, + }, + { + name: "disable CSP GET /", + endpoint: "/", + enableCSP: false, + appLoc: "../gui/static/dist", + expectCSPHeader: "", + enableGUI: true, + }, + { + // Confirms that the /csrf api won't be affected by the csp setting + name: "enable CSP GET /csrf", + endpoint: "/api/v1/csrf", + enableCSP: true, + appLoc: "", + expectCSPHeader: "", + enableGUI: false, + }, + { + // Confirms that the /version api won't be affected by the csp setting + name: "enable CSP GET /version", + endpoint: "/api/v1/version", + enableCSP: true, + appLoc: "", + expectCSPHeader: "", + enableGUI: false, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + req, err := http.NewRequest(http.MethodGet, tc.endpoint, nil) + require.NoError(t, err) + + rr := httptest.NewRecorder() + handler := newServerMux(muxConfig{ + host: configuredHost, + appLoc: tc.appLoc, + enableGUI: tc.enableGUI, + disableCSP: !tc.enableCSP, + disableCSRF: true, + }, &MockGatewayer{}) + handler.ServeHTTP(rr, req) + + csp := rr.Header().Get("Content-Security-Policy") + require.Equal(t, tc.expectCSPHeader, csp) + }) + } +} + +func TestIsContentTypeJSON(t *testing.T) { + require.True(t, isContentTypeJSON(ContentTypeJSON)) + require.True(t, isContentTypeJSON("application/json")) + require.True(t, isContentTypeJSON("application/json; charset=utf-8")) + require.False(t, isContentTypeJSON("application/x-www-form-urlencoded")) + require.False(t, isContentTypeJSON(ContentTypeForm)) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/mock_gatewayer_test.go b/vendor/github.com/SkycoinProject/skycoin/src/api/mock_gatewayer_test.go new file mode 100644 index 00000000..496807fd --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/mock_gatewayer_test.go @@ -0,0 +1,1471 @@ +// Code generated by mockery v1.0.0. DO NOT EDIT. + +package api + +import cipher "github.com/SkycoinProject/skycoin/src/cipher" +import coin "github.com/SkycoinProject/skycoin/src/coin" +import daemon "github.com/SkycoinProject/skycoin/src/daemon" +import historydb "github.com/SkycoinProject/skycoin/src/visor/historydb" +import kvstorage "github.com/SkycoinProject/skycoin/src/kvstorage" +import mock "github.com/stretchr/testify/mock" +import time "time" +import transaction "github.com/SkycoinProject/skycoin/src/transaction" +import visor "github.com/SkycoinProject/skycoin/src/visor" +import wallet "github.com/SkycoinProject/skycoin/src/wallet" + +// MockGatewayer is an autogenerated mock type for the Gatewayer type +type MockGatewayer struct { + mock.Mock +} + +// AddStorageValue provides a mock function with given fields: storageType, key, val +func (_m *MockGatewayer) AddStorageValue(storageType kvstorage.Type, key string, val string) error { + ret := _m.Called(storageType, key, val) + + var r0 error + if rf, ok := ret.Get(0).(func(kvstorage.Type, string, string) error); ok { + r0 = rf(storageType, key, val) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// AddressCount provides a mock function with given fields: +func (_m *MockGatewayer) AddressCount() (uint64, error) { + ret := _m.Called() + + var r0 uint64 + if rf, ok := ret.Get(0).(func() uint64); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(uint64) + } + + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// AddressesActivity provides a mock function with given fields: addrs +func (_m *MockGatewayer) AddressesActivity(addrs []cipher.Address) ([]bool, error) { + ret := _m.Called(addrs) + + var r0 []bool + if rf, ok := ret.Get(0).(func([]cipher.Address) []bool); ok { + r0 = rf(addrs) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]bool) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func([]cipher.Address) error); ok { + r1 = rf(addrs) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// CreateTransaction provides a mock function with given fields: p, wp +func (_m *MockGatewayer) CreateTransaction(p transaction.Params, wp visor.CreateTransactionParams) (*coin.Transaction, []visor.TransactionInput, error) { + ret := _m.Called(p, wp) + + var r0 *coin.Transaction + if rf, ok := ret.Get(0).(func(transaction.Params, visor.CreateTransactionParams) *coin.Transaction); ok { + r0 = rf(p, wp) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coin.Transaction) + } + } + + var r1 []visor.TransactionInput + if rf, ok := ret.Get(1).(func(transaction.Params, visor.CreateTransactionParams) []visor.TransactionInput); ok { + r1 = rf(p, wp) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).([]visor.TransactionInput) + } + } + + var r2 error + if rf, ok := ret.Get(2).(func(transaction.Params, visor.CreateTransactionParams) error); ok { + r2 = rf(p, wp) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// CreateWallet provides a mock function with given fields: wltName, options, bg +func (_m *MockGatewayer) CreateWallet(wltName string, options wallet.Options, bg wallet.TransactionsFinder) (wallet.Wallet, error) { + ret := _m.Called(wltName, options, bg) + + var r0 wallet.Wallet + if rf, ok := ret.Get(0).(func(string, wallet.Options, wallet.TransactionsFinder) wallet.Wallet); ok { + r0 = rf(wltName, options, bg) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(wallet.Wallet) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, wallet.Options, wallet.TransactionsFinder) error); ok { + r1 = rf(wltName, options, bg) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// DaemonConfig provides a mock function with given fields: +func (_m *MockGatewayer) DaemonConfig() daemon.DaemonConfig { + ret := _m.Called() + + var r0 daemon.DaemonConfig + if rf, ok := ret.Get(0).(func() daemon.DaemonConfig); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(daemon.DaemonConfig) + } + + return r0 +} + +// DecryptWallet provides a mock function with given fields: wltID, password +func (_m *MockGatewayer) DecryptWallet(wltID string, password []byte) (wallet.Wallet, error) { + ret := _m.Called(wltID, password) + + var r0 wallet.Wallet + if rf, ok := ret.Get(0).(func(string, []byte) wallet.Wallet); ok { + r0 = rf(wltID, password) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(wallet.Wallet) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, []byte) error); ok { + r1 = rf(wltID, password) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// DisconnectByGnetID provides a mock function with given fields: gnetID +func (_m *MockGatewayer) DisconnectByGnetID(gnetID uint64) error { + ret := _m.Called(gnetID) + + var r0 error + if rf, ok := ret.Get(0).(func(uint64) error); ok { + r0 = rf(gnetID) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// EncryptWallet provides a mock function with given fields: wltID, password +func (_m *MockGatewayer) EncryptWallet(wltID string, password []byte) (wallet.Wallet, error) { + ret := _m.Called(wltID, password) + + var r0 wallet.Wallet + if rf, ok := ret.Get(0).(func(string, []byte) wallet.Wallet); ok { + r0 = rf(wltID, password) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(wallet.Wallet) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, []byte) error); ok { + r1 = rf(wltID, password) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetAllStorageValues provides a mock function with given fields: storageType +func (_m *MockGatewayer) GetAllStorageValues(storageType kvstorage.Type) (map[string]string, error) { + ret := _m.Called(storageType) + + var r0 map[string]string + if rf, ok := ret.Get(0).(func(kvstorage.Type) map[string]string); ok { + r0 = rf(storageType) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(map[string]string) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(kvstorage.Type) error); ok { + r1 = rf(storageType) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetAllUnconfirmedTransactions provides a mock function with given fields: +func (_m *MockGatewayer) GetAllUnconfirmedTransactions() ([]visor.UnconfirmedTransaction, error) { + ret := _m.Called() + + var r0 []visor.UnconfirmedTransaction + if rf, ok := ret.Get(0).(func() []visor.UnconfirmedTransaction); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]visor.UnconfirmedTransaction) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetAllUnconfirmedTransactionsVerbose provides a mock function with given fields: +func (_m *MockGatewayer) GetAllUnconfirmedTransactionsVerbose() ([]visor.UnconfirmedTransaction, [][]visor.TransactionInput, error) { + ret := _m.Called() + + var r0 []visor.UnconfirmedTransaction + if rf, ok := ret.Get(0).(func() []visor.UnconfirmedTransaction); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]visor.UnconfirmedTransaction) + } + } + + var r1 [][]visor.TransactionInput + if rf, ok := ret.Get(1).(func() [][]visor.TransactionInput); ok { + r1 = rf() + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).([][]visor.TransactionInput) + } + } + + var r2 error + if rf, ok := ret.Get(2).(func() error); ok { + r2 = rf() + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// GetBalanceOfAddresses provides a mock function with given fields: addrs +func (_m *MockGatewayer) GetBalanceOfAddresses(addrs []cipher.Address) ([]wallet.BalancePair, error) { + ret := _m.Called(addrs) + + var r0 []wallet.BalancePair + if rf, ok := ret.Get(0).(func([]cipher.Address) []wallet.BalancePair); ok { + r0 = rf(addrs) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]wallet.BalancePair) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func([]cipher.Address) error); ok { + r1 = rf(addrs) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetBlockchainMetadata provides a mock function with given fields: +func (_m *MockGatewayer) GetBlockchainMetadata() (*visor.BlockchainMetadata, error) { + ret := _m.Called() + + var r0 *visor.BlockchainMetadata + if rf, ok := ret.Get(0).(func() *visor.BlockchainMetadata); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*visor.BlockchainMetadata) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetBlockchainProgress provides a mock function with given fields: headSeq +func (_m *MockGatewayer) GetBlockchainProgress(headSeq uint64) *daemon.BlockchainProgress { + ret := _m.Called(headSeq) + + var r0 *daemon.BlockchainProgress + if rf, ok := ret.Get(0).(func(uint64) *daemon.BlockchainProgress); ok { + r0 = rf(headSeq) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*daemon.BlockchainProgress) + } + } + + return r0 +} + +// GetBlocks provides a mock function with given fields: seqs +func (_m *MockGatewayer) GetBlocks(seqs []uint64) ([]coin.SignedBlock, error) { + ret := _m.Called(seqs) + + var r0 []coin.SignedBlock + if rf, ok := ret.Get(0).(func([]uint64) []coin.SignedBlock); ok { + r0 = rf(seqs) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]coin.SignedBlock) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func([]uint64) error); ok { + r1 = rf(seqs) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetBlocksInRange provides a mock function with given fields: start, end +func (_m *MockGatewayer) GetBlocksInRange(start uint64, end uint64) ([]coin.SignedBlock, error) { + ret := _m.Called(start, end) + + var r0 []coin.SignedBlock + if rf, ok := ret.Get(0).(func(uint64, uint64) []coin.SignedBlock); ok { + r0 = rf(start, end) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]coin.SignedBlock) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(uint64, uint64) error); ok { + r1 = rf(start, end) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetBlocksInRangeVerbose provides a mock function with given fields: start, end +func (_m *MockGatewayer) GetBlocksInRangeVerbose(start uint64, end uint64) ([]coin.SignedBlock, [][][]visor.TransactionInput, error) { + ret := _m.Called(start, end) + + var r0 []coin.SignedBlock + if rf, ok := ret.Get(0).(func(uint64, uint64) []coin.SignedBlock); ok { + r0 = rf(start, end) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]coin.SignedBlock) + } + } + + var r1 [][][]visor.TransactionInput + if rf, ok := ret.Get(1).(func(uint64, uint64) [][][]visor.TransactionInput); ok { + r1 = rf(start, end) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).([][][]visor.TransactionInput) + } + } + + var r2 error + if rf, ok := ret.Get(2).(func(uint64, uint64) error); ok { + r2 = rf(start, end) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// GetBlocksVerbose provides a mock function with given fields: seqs +func (_m *MockGatewayer) GetBlocksVerbose(seqs []uint64) ([]coin.SignedBlock, [][][]visor.TransactionInput, error) { + ret := _m.Called(seqs) + + var r0 []coin.SignedBlock + if rf, ok := ret.Get(0).(func([]uint64) []coin.SignedBlock); ok { + r0 = rf(seqs) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]coin.SignedBlock) + } + } + + var r1 [][][]visor.TransactionInput + if rf, ok := ret.Get(1).(func([]uint64) [][][]visor.TransactionInput); ok { + r1 = rf(seqs) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).([][][]visor.TransactionInput) + } + } + + var r2 error + if rf, ok := ret.Get(2).(func([]uint64) error); ok { + r2 = rf(seqs) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// GetConnection provides a mock function with given fields: addr +func (_m *MockGatewayer) GetConnection(addr string) (*daemon.Connection, error) { + ret := _m.Called(addr) + + var r0 *daemon.Connection + if rf, ok := ret.Get(0).(func(string) *daemon.Connection); ok { + r0 = rf(addr) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*daemon.Connection) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string) error); ok { + r1 = rf(addr) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetConnections provides a mock function with given fields: f +func (_m *MockGatewayer) GetConnections(f func(daemon.Connection) bool) ([]daemon.Connection, error) { + ret := _m.Called(f) + + var r0 []daemon.Connection + if rf, ok := ret.Get(0).(func(func(daemon.Connection) bool) []daemon.Connection); ok { + r0 = rf(f) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]daemon.Connection) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(func(daemon.Connection) bool) error); ok { + r1 = rf(f) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetDefaultConnections provides a mock function with given fields: +func (_m *MockGatewayer) GetDefaultConnections() []string { + ret := _m.Called() + + var r0 []string + if rf, ok := ret.Get(0).(func() []string); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]string) + } + } + + return r0 +} + +// GetExchgConnection provides a mock function with given fields: +func (_m *MockGatewayer) GetExchgConnection() []string { + ret := _m.Called() + + var r0 []string + if rf, ok := ret.Get(0).(func() []string); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]string) + } + } + + return r0 +} + +// GetLastBlocks provides a mock function with given fields: num +func (_m *MockGatewayer) GetLastBlocks(num uint64) ([]coin.SignedBlock, error) { + ret := _m.Called(num) + + var r0 []coin.SignedBlock + if rf, ok := ret.Get(0).(func(uint64) []coin.SignedBlock); ok { + r0 = rf(num) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]coin.SignedBlock) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(uint64) error); ok { + r1 = rf(num) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetLastBlocksVerbose provides a mock function with given fields: num +func (_m *MockGatewayer) GetLastBlocksVerbose(num uint64) ([]coin.SignedBlock, [][][]visor.TransactionInput, error) { + ret := _m.Called(num) + + var r0 []coin.SignedBlock + if rf, ok := ret.Get(0).(func(uint64) []coin.SignedBlock); ok { + r0 = rf(num) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]coin.SignedBlock) + } + } + + var r1 [][][]visor.TransactionInput + if rf, ok := ret.Get(1).(func(uint64) [][][]visor.TransactionInput); ok { + r1 = rf(num) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).([][][]visor.TransactionInput) + } + } + + var r2 error + if rf, ok := ret.Get(2).(func(uint64) error); ok { + r2 = rf(num) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// GetRichlist provides a mock function with given fields: includeDistribution +func (_m *MockGatewayer) GetRichlist(includeDistribution bool) (visor.Richlist, error) { + ret := _m.Called(includeDistribution) + + var r0 visor.Richlist + if rf, ok := ret.Get(0).(func(bool) visor.Richlist); ok { + r0 = rf(includeDistribution) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(visor.Richlist) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(bool) error); ok { + r1 = rf(includeDistribution) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetSignedBlockByHash provides a mock function with given fields: hash +func (_m *MockGatewayer) GetSignedBlockByHash(hash cipher.SHA256) (*coin.SignedBlock, error) { + ret := _m.Called(hash) + + var r0 *coin.SignedBlock + if rf, ok := ret.Get(0).(func(cipher.SHA256) *coin.SignedBlock); ok { + r0 = rf(hash) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coin.SignedBlock) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(cipher.SHA256) error); ok { + r1 = rf(hash) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetSignedBlockByHashVerbose provides a mock function with given fields: hash +func (_m *MockGatewayer) GetSignedBlockByHashVerbose(hash cipher.SHA256) (*coin.SignedBlock, [][]visor.TransactionInput, error) { + ret := _m.Called(hash) + + var r0 *coin.SignedBlock + if rf, ok := ret.Get(0).(func(cipher.SHA256) *coin.SignedBlock); ok { + r0 = rf(hash) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coin.SignedBlock) + } + } + + var r1 [][]visor.TransactionInput + if rf, ok := ret.Get(1).(func(cipher.SHA256) [][]visor.TransactionInput); ok { + r1 = rf(hash) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).([][]visor.TransactionInput) + } + } + + var r2 error + if rf, ok := ret.Get(2).(func(cipher.SHA256) error); ok { + r2 = rf(hash) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// GetSignedBlockBySeq provides a mock function with given fields: seq +func (_m *MockGatewayer) GetSignedBlockBySeq(seq uint64) (*coin.SignedBlock, error) { + ret := _m.Called(seq) + + var r0 *coin.SignedBlock + if rf, ok := ret.Get(0).(func(uint64) *coin.SignedBlock); ok { + r0 = rf(seq) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coin.SignedBlock) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(uint64) error); ok { + r1 = rf(seq) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetSignedBlockBySeqVerbose provides a mock function with given fields: seq +func (_m *MockGatewayer) GetSignedBlockBySeqVerbose(seq uint64) (*coin.SignedBlock, [][]visor.TransactionInput, error) { + ret := _m.Called(seq) + + var r0 *coin.SignedBlock + if rf, ok := ret.Get(0).(func(uint64) *coin.SignedBlock); ok { + r0 = rf(seq) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coin.SignedBlock) + } + } + + var r1 [][]visor.TransactionInput + if rf, ok := ret.Get(1).(func(uint64) [][]visor.TransactionInput); ok { + r1 = rf(seq) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).([][]visor.TransactionInput) + } + } + + var r2 error + if rf, ok := ret.Get(2).(func(uint64) error); ok { + r2 = rf(seq) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// GetSpentOutputsForAddresses provides a mock function with given fields: addr +func (_m *MockGatewayer) GetSpentOutputsForAddresses(addr []cipher.Address) ([][]historydb.UxOut, error) { + ret := _m.Called(addr) + + var r0 [][]historydb.UxOut + if rf, ok := ret.Get(0).(func([]cipher.Address) [][]historydb.UxOut); ok { + r0 = rf(addr) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([][]historydb.UxOut) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func([]cipher.Address) error); ok { + r1 = rf(addr) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetStorageValue provides a mock function with given fields: storageType, key +func (_m *MockGatewayer) GetStorageValue(storageType kvstorage.Type, key string) (string, error) { + ret := _m.Called(storageType, key) + + var r0 string + if rf, ok := ret.Get(0).(func(kvstorage.Type, string) string); ok { + r0 = rf(storageType, key) + } else { + r0 = ret.Get(0).(string) + } + + var r1 error + if rf, ok := ret.Get(1).(func(kvstorage.Type, string) error); ok { + r1 = rf(storageType, key) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetTransaction provides a mock function with given fields: txid +func (_m *MockGatewayer) GetTransaction(txid cipher.SHA256) (*visor.Transaction, error) { + ret := _m.Called(txid) + + var r0 *visor.Transaction + if rf, ok := ret.Get(0).(func(cipher.SHA256) *visor.Transaction); ok { + r0 = rf(txid) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*visor.Transaction) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(cipher.SHA256) error); ok { + r1 = rf(txid) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetTransactionWithInputs provides a mock function with given fields: txid +func (_m *MockGatewayer) GetTransactionWithInputs(txid cipher.SHA256) (*visor.Transaction, []visor.TransactionInput, error) { + ret := _m.Called(txid) + + var r0 *visor.Transaction + if rf, ok := ret.Get(0).(func(cipher.SHA256) *visor.Transaction); ok { + r0 = rf(txid) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*visor.Transaction) + } + } + + var r1 []visor.TransactionInput + if rf, ok := ret.Get(1).(func(cipher.SHA256) []visor.TransactionInput); ok { + r1 = rf(txid) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).([]visor.TransactionInput) + } + } + + var r2 error + if rf, ok := ret.Get(2).(func(cipher.SHA256) error); ok { + r2 = rf(txid) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// GetTransactions provides a mock function with given fields: flts +func (_m *MockGatewayer) GetTransactions(flts []visor.TxFilter) ([]visor.Transaction, error) { + ret := _m.Called(flts) + + var r0 []visor.Transaction + if rf, ok := ret.Get(0).(func([]visor.TxFilter) []visor.Transaction); ok { + r0 = rf(flts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]visor.Transaction) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func([]visor.TxFilter) error); ok { + r1 = rf(flts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetTransactionsWithInputs provides a mock function with given fields: flts +func (_m *MockGatewayer) GetTransactionsWithInputs(flts []visor.TxFilter) ([]visor.Transaction, [][]visor.TransactionInput, error) { + ret := _m.Called(flts) + + var r0 []visor.Transaction + if rf, ok := ret.Get(0).(func([]visor.TxFilter) []visor.Transaction); ok { + r0 = rf(flts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]visor.Transaction) + } + } + + var r1 [][]visor.TransactionInput + if rf, ok := ret.Get(1).(func([]visor.TxFilter) [][]visor.TransactionInput); ok { + r1 = rf(flts) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).([][]visor.TransactionInput) + } + } + + var r2 error + if rf, ok := ret.Get(2).(func([]visor.TxFilter) error); ok { + r2 = rf(flts) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// GetTrustConnections provides a mock function with given fields: +func (_m *MockGatewayer) GetTrustConnections() []string { + ret := _m.Called() + + var r0 []string + if rf, ok := ret.Get(0).(func() []string); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]string) + } + } + + return r0 +} + +// GetUnspentOutputsSummary provides a mock function with given fields: filters +func (_m *MockGatewayer) GetUnspentOutputsSummary(filters []visor.OutputsFilter) (*visor.UnspentOutputsSummary, error) { + ret := _m.Called(filters) + + var r0 *visor.UnspentOutputsSummary + if rf, ok := ret.Get(0).(func([]visor.OutputsFilter) *visor.UnspentOutputsSummary); ok { + r0 = rf(filters) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*visor.UnspentOutputsSummary) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func([]visor.OutputsFilter) error); ok { + r1 = rf(filters) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetUxOutByID provides a mock function with given fields: id +func (_m *MockGatewayer) GetUxOutByID(id cipher.SHA256) (*historydb.UxOut, error) { + ret := _m.Called(id) + + var r0 *historydb.UxOut + if rf, ok := ret.Get(0).(func(cipher.SHA256) *historydb.UxOut); ok { + r0 = rf(id) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*historydb.UxOut) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(cipher.SHA256) error); ok { + r1 = rf(id) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetVerboseTransactionsForAddress provides a mock function with given fields: a +func (_m *MockGatewayer) GetVerboseTransactionsForAddress(a cipher.Address) ([]visor.Transaction, [][]visor.TransactionInput, error) { + ret := _m.Called(a) + + var r0 []visor.Transaction + if rf, ok := ret.Get(0).(func(cipher.Address) []visor.Transaction); ok { + r0 = rf(a) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]visor.Transaction) + } + } + + var r1 [][]visor.TransactionInput + if rf, ok := ret.Get(1).(func(cipher.Address) [][]visor.TransactionInput); ok { + r1 = rf(a) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).([][]visor.TransactionInput) + } + } + + var r2 error + if rf, ok := ret.Get(2).(func(cipher.Address) error); ok { + r2 = rf(a) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// GetWallet provides a mock function with given fields: wltID +func (_m *MockGatewayer) GetWallet(wltID string) (wallet.Wallet, error) { + ret := _m.Called(wltID) + + var r0 wallet.Wallet + if rf, ok := ret.Get(0).(func(string) wallet.Wallet); ok { + r0 = rf(wltID) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(wallet.Wallet) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string) error); ok { + r1 = rf(wltID) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetWalletBalance provides a mock function with given fields: wltID +func (_m *MockGatewayer) GetWalletBalance(wltID string) (wallet.BalancePair, wallet.AddressBalances, error) { + ret := _m.Called(wltID) + + var r0 wallet.BalancePair + if rf, ok := ret.Get(0).(func(string) wallet.BalancePair); ok { + r0 = rf(wltID) + } else { + r0 = ret.Get(0).(wallet.BalancePair) + } + + var r1 wallet.AddressBalances + if rf, ok := ret.Get(1).(func(string) wallet.AddressBalances); ok { + r1 = rf(wltID) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(wallet.AddressBalances) + } + } + + var r2 error + if rf, ok := ret.Get(2).(func(string) error); ok { + r2 = rf(wltID) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// GetWalletSeed provides a mock function with given fields: wltID, password +func (_m *MockGatewayer) GetWalletSeed(wltID string, password []byte) (string, string, error) { + ret := _m.Called(wltID, password) + + var r0 string + if rf, ok := ret.Get(0).(func(string, []byte) string); ok { + r0 = rf(wltID, password) + } else { + r0 = ret.Get(0).(string) + } + + var r1 string + if rf, ok := ret.Get(1).(func(string, []byte) string); ok { + r1 = rf(wltID, password) + } else { + r1 = ret.Get(1).(string) + } + + var r2 error + if rf, ok := ret.Get(2).(func(string, []byte) error); ok { + r2 = rf(wltID, password) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// GetWalletUnconfirmedTransactions provides a mock function with given fields: wltID +func (_m *MockGatewayer) GetWalletUnconfirmedTransactions(wltID string) ([]visor.UnconfirmedTransaction, error) { + ret := _m.Called(wltID) + + var r0 []visor.UnconfirmedTransaction + if rf, ok := ret.Get(0).(func(string) []visor.UnconfirmedTransaction); ok { + r0 = rf(wltID) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]visor.UnconfirmedTransaction) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string) error); ok { + r1 = rf(wltID) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetWalletUnconfirmedTransactionsVerbose provides a mock function with given fields: wltID +func (_m *MockGatewayer) GetWalletUnconfirmedTransactionsVerbose(wltID string) ([]visor.UnconfirmedTransaction, [][]visor.TransactionInput, error) { + ret := _m.Called(wltID) + + var r0 []visor.UnconfirmedTransaction + if rf, ok := ret.Get(0).(func(string) []visor.UnconfirmedTransaction); ok { + r0 = rf(wltID) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]visor.UnconfirmedTransaction) + } + } + + var r1 [][]visor.TransactionInput + if rf, ok := ret.Get(1).(func(string) [][]visor.TransactionInput); ok { + r1 = rf(wltID) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).([][]visor.TransactionInput) + } + } + + var r2 error + if rf, ok := ret.Get(2).(func(string) error); ok { + r2 = rf(wltID) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// GetWallets provides a mock function with given fields: +func (_m *MockGatewayer) GetWallets() (wallet.Wallets, error) { + ret := _m.Called() + + var r0 wallet.Wallets + if rf, ok := ret.Get(0).(func() wallet.Wallets); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(wallet.Wallets) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// HeadBkSeq provides a mock function with given fields: +func (_m *MockGatewayer) HeadBkSeq() (uint64, bool, error) { + ret := _m.Called() + + var r0 uint64 + if rf, ok := ret.Get(0).(func() uint64); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(uint64) + } + + var r1 bool + if rf, ok := ret.Get(1).(func() bool); ok { + r1 = rf() + } else { + r1 = ret.Get(1).(bool) + } + + var r2 error + if rf, ok := ret.Get(2).(func() error); ok { + r2 = rf() + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// InjectBroadcastTransaction provides a mock function with given fields: txn +func (_m *MockGatewayer) InjectBroadcastTransaction(txn coin.Transaction) error { + ret := _m.Called(txn) + + var r0 error + if rf, ok := ret.Get(0).(func(coin.Transaction) error); ok { + r0 = rf(txn) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// InjectTransaction provides a mock function with given fields: txn +func (_m *MockGatewayer) InjectTransaction(txn coin.Transaction) error { + ret := _m.Called(txn) + + var r0 error + if rf, ok := ret.Get(0).(func(coin.Transaction) error); ok { + r0 = rf(txn) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// NewAddresses provides a mock function with given fields: wltID, password, n +func (_m *MockGatewayer) NewAddresses(wltID string, password []byte, n uint64) ([]cipher.Address, error) { + ret := _m.Called(wltID, password, n) + + var r0 []cipher.Address + if rf, ok := ret.Get(0).(func(string, []byte, uint64) []cipher.Address); ok { + r0 = rf(wltID, password, n) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]cipher.Address) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, []byte, uint64) error); ok { + r1 = rf(wltID, password, n) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RecoverWallet provides a mock function with given fields: wltID, seed, seedPassphrase, password +func (_m *MockGatewayer) RecoverWallet(wltID string, seed string, seedPassphrase string, password []byte) (wallet.Wallet, error) { + ret := _m.Called(wltID, seed, seedPassphrase, password) + + var r0 wallet.Wallet + if rf, ok := ret.Get(0).(func(string, string, string, []byte) wallet.Wallet); ok { + r0 = rf(wltID, seed, seedPassphrase, password) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(wallet.Wallet) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, string, string, []byte) error); ok { + r1 = rf(wltID, seed, seedPassphrase, password) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RemoveStorageValue provides a mock function with given fields: storageType, key +func (_m *MockGatewayer) RemoveStorageValue(storageType kvstorage.Type, key string) error { + ret := _m.Called(storageType, key) + + var r0 error + if rf, ok := ret.Get(0).(func(kvstorage.Type, string) error); ok { + r0 = rf(storageType, key) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// ResendUnconfirmedTxns provides a mock function with given fields: +func (_m *MockGatewayer) ResendUnconfirmedTxns() ([]cipher.SHA256, error) { + ret := _m.Called() + + var r0 []cipher.SHA256 + if rf, ok := ret.Get(0).(func() []cipher.SHA256); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]cipher.SHA256) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// StartedAt provides a mock function with given fields: +func (_m *MockGatewayer) StartedAt() time.Time { + ret := _m.Called() + + var r0 time.Time + if rf, ok := ret.Get(0).(func() time.Time); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(time.Time) + } + + return r0 +} + +// UnloadWallet provides a mock function with given fields: wltID +func (_m *MockGatewayer) UnloadWallet(wltID string) error { + ret := _m.Called(wltID) + + var r0 error + if rf, ok := ret.Get(0).(func(string) error); ok { + r0 = rf(wltID) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// UpdateWalletLabel provides a mock function with given fields: wltID, label +func (_m *MockGatewayer) UpdateWalletLabel(wltID string, label string) error { + ret := _m.Called(wltID, label) + + var r0 error + if rf, ok := ret.Get(0).(func(string, string) error); ok { + r0 = rf(wltID, label) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// VerifyTxnVerbose provides a mock function with given fields: txn, signed +func (_m *MockGatewayer) VerifyTxnVerbose(txn *coin.Transaction, signed visor.TxnSignedFlag) ([]visor.TransactionInput, bool, error) { + ret := _m.Called(txn, signed) + + var r0 []visor.TransactionInput + if rf, ok := ret.Get(0).(func(*coin.Transaction, visor.TxnSignedFlag) []visor.TransactionInput); ok { + r0 = rf(txn, signed) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]visor.TransactionInput) + } + } + + var r1 bool + if rf, ok := ret.Get(1).(func(*coin.Transaction, visor.TxnSignedFlag) bool); ok { + r1 = rf(txn, signed) + } else { + r1 = ret.Get(1).(bool) + } + + var r2 error + if rf, ok := ret.Get(2).(func(*coin.Transaction, visor.TxnSignedFlag) error); ok { + r2 = rf(txn, signed) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// VisorConfig provides a mock function with given fields: +func (_m *MockGatewayer) VisorConfig() visor.Config { + ret := _m.Called() + + var r0 visor.Config + if rf, ok := ret.Get(0).(func() visor.Config); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(visor.Config) + } + + return r0 +} + +// WalletCreateTransaction provides a mock function with given fields: wltID, p, wp +func (_m *MockGatewayer) WalletCreateTransaction(wltID string, p transaction.Params, wp visor.CreateTransactionParams) (*coin.Transaction, []visor.TransactionInput, error) { + ret := _m.Called(wltID, p, wp) + + var r0 *coin.Transaction + if rf, ok := ret.Get(0).(func(string, transaction.Params, visor.CreateTransactionParams) *coin.Transaction); ok { + r0 = rf(wltID, p, wp) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coin.Transaction) + } + } + + var r1 []visor.TransactionInput + if rf, ok := ret.Get(1).(func(string, transaction.Params, visor.CreateTransactionParams) []visor.TransactionInput); ok { + r1 = rf(wltID, p, wp) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).([]visor.TransactionInput) + } + } + + var r2 error + if rf, ok := ret.Get(2).(func(string, transaction.Params, visor.CreateTransactionParams) error); ok { + r2 = rf(wltID, p, wp) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// WalletCreateTransactionSigned provides a mock function with given fields: wltID, password, p, wp +func (_m *MockGatewayer) WalletCreateTransactionSigned(wltID string, password []byte, p transaction.Params, wp visor.CreateTransactionParams) (*coin.Transaction, []visor.TransactionInput, error) { + ret := _m.Called(wltID, password, p, wp) + + var r0 *coin.Transaction + if rf, ok := ret.Get(0).(func(string, []byte, transaction.Params, visor.CreateTransactionParams) *coin.Transaction); ok { + r0 = rf(wltID, password, p, wp) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coin.Transaction) + } + } + + var r1 []visor.TransactionInput + if rf, ok := ret.Get(1).(func(string, []byte, transaction.Params, visor.CreateTransactionParams) []visor.TransactionInput); ok { + r1 = rf(wltID, password, p, wp) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).([]visor.TransactionInput) + } + } + + var r2 error + if rf, ok := ret.Get(2).(func(string, []byte, transaction.Params, visor.CreateTransactionParams) error); ok { + r2 = rf(wltID, password, p, wp) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// WalletDir provides a mock function with given fields: +func (_m *MockGatewayer) WalletDir() (string, error) { + ret := _m.Called() + + var r0 string + if rf, ok := ret.Get(0).(func() string); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(string) + } + + var r1 error + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WalletSignTransaction provides a mock function with given fields: wltID, password, txn, signIndexes +func (_m *MockGatewayer) WalletSignTransaction(wltID string, password []byte, txn *coin.Transaction, signIndexes []int) (*coin.Transaction, []visor.TransactionInput, error) { + ret := _m.Called(wltID, password, txn, signIndexes) + + var r0 *coin.Transaction + if rf, ok := ret.Get(0).(func(string, []byte, *coin.Transaction, []int) *coin.Transaction); ok { + r0 = rf(wltID, password, txn, signIndexes) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coin.Transaction) + } + } + + var r1 []visor.TransactionInput + if rf, ok := ret.Get(1).(func(string, []byte, *coin.Transaction, []int) []visor.TransactionInput); ok { + r1 = rf(wltID, password, txn, signIndexes) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).([]visor.TransactionInput) + } + } + + var r2 error + if rf, ok := ret.Get(2).(func(string, []byte, *coin.Transaction, []int) error); ok { + r2 = rf(wltID, password, txn, signIndexes) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/network.go b/vendor/github.com/SkycoinProject/skycoin/src/api/network.go new file mode 100644 index 00000000..7d3a33ae --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/network.go @@ -0,0 +1,228 @@ +package api + +// APIs for network-related information + +import ( + "fmt" + "net/http" + "sort" + "strconv" + "strings" + + "github.com/SkycoinProject/skycoin/src/daemon" + "github.com/SkycoinProject/skycoin/src/readable" + wh "github.com/SkycoinProject/skycoin/src/util/http" +) + +// connectionHandler returns a specific connection +// URI: /api/v1/network/connections +// Method: GET +// Args: +// addr - An IP:Port string +func connectionHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + addr := r.FormValue("addr") + if addr == "" { + wh.Error400(w, "addr is required") + return + } + + c, err := gateway.GetConnection(addr) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + if c == nil { + wh.Error404(w, "") + return + } + + wh.SendJSONOr500(logger, w, readable.NewConnection(c)) + } +} + +// Connections wraps []Connection +type Connections struct { + Connections []readable.Connection `json:"connections"` +} + +// NewConnections copies []daemon.Connection to a struct with json tags +func NewConnections(dconns []daemon.Connection) Connections { + conns := make([]readable.Connection, len(dconns)) + for i, dc := range dconns { + conns[i] = readable.NewConnection(&dc) + } + + return Connections{ + Connections: conns, + } +} + +// connectionsHandler returns all outgoing connections +// URI: /api/v1/network/connections +// Method: GET +// Args: +// states: [optional] comma-separated list of connection states ("pending", "connected" or "introduced"). Defaults to "connected,introduced" +// direction: [optional] "outgoing" or "incoming". If not provided, both are included. +func connectionsHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + formStates := r.FormValue("states") + statesMap := make(map[daemon.ConnectionState]struct{}, 3) + if formStates != "" { + states := strings.Split(formStates, ",") + for _, s := range states { + switch daemon.ConnectionState(s) { + case daemon.ConnectionStatePending, + daemon.ConnectionStateConnected, + daemon.ConnectionStateIntroduced: + statesMap[daemon.ConnectionState(s)] = struct{}{} + default: + wh.Error400(w, fmt.Sprintf("Invalid state in states. Valid states are %q, %q or %q", daemon.ConnectionStatePending, daemon.ConnectionStateConnected, daemon.ConnectionStateIntroduced)) + return + } + } + } + + // "connected" and "introduced" are the defaults, if not specified + if len(statesMap) == 0 { + statesMap[daemon.ConnectionStateConnected] = struct{}{} + statesMap[daemon.ConnectionStateIntroduced] = struct{}{} + } + + direction := r.FormValue("direction") + switch direction { + case "incoming", "outgoing", "": + default: + wh.Error400(w, "Invalid direction. Valid directions are \"outgoing\" or \"incoming\"") + return + } + + conns, err := gateway.GetConnections(func(c daemon.Connection) bool { + switch direction { + case "outgoing": + if !c.Outgoing { + return false + } + case "incoming": + if c.Outgoing { + return false + } + } + + if _, ok := statesMap[c.State]; !ok { + return false + } + + return true + }) + + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, NewConnections(conns)) + } +} + +// defaultConnectionsHandler returns the list of default hardcoded bootstrap addresses. +// They are not necessarily connected to. +// URI: /api/v1/network/defaultConnections +// Method: GET +func defaultConnectionsHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + conns := gateway.GetDefaultConnections() + sort.Strings(conns) + + wh.SendJSONOr500(logger, w, conns) + } +} + +// trustConnectionsHandler returns all trusted connections +// In the default configuration, these will be a subset of the default hardcoded bootstrap addresses +// URI: /api/v1/network/trust +// Method: GET +func trustConnectionsHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + conns := gateway.GetTrustConnections() + sort.Strings(conns) + + wh.SendJSONOr500(logger, w, conns) + } +} + +// exchgConnectionsHandler returns all connections found through peer exchange +// URI: /api/v1/network/exchange +// Method: GET +func exchgConnectionsHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + conns := gateway.GetExchgConnection() + sort.Strings(conns) + + wh.SendJSONOr500(logger, w, conns) + } +} + +// disconnectHandler disconnects a connection by ID or address +// URI: /api/v1/network/connection/disconnect +// Method: POST +// Args: +// id: ID of the connection +func disconnectHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + wh.Error405(w) + return + } + + formID := r.FormValue("id") + if formID == "" { + wh.Error400(w, "id is required") + return + } + + id, err := strconv.ParseUint(formID, 10, 64) + if err != nil || id == 0 { // gnet IDs are non-zero + wh.Error400(w, "invalid id") + return + } + + if err := gateway.DisconnectByGnetID(uint64(id)); err != nil { + switch err { + case daemon.ErrConnectionNotExist: + wh.Error404(w, "") + default: + wh.Error500(w, err.Error()) + } + return + } + + wh.SendJSONOr500(logger, w, struct{}{}) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/network_test.go b/vendor/github.com/SkycoinProject/skycoin/src/api/network_test.go new file mode 100644 index 00000000..c474aa4d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/network_test.go @@ -0,0 +1,630 @@ +package api + +import ( + "encoding/json" + "errors" + "net/http" + "net/http/httptest" + "net/url" + "strings" + "testing" + "time" + + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/daemon" + "github.com/SkycoinProject/skycoin/src/daemon/pex" + "github.com/SkycoinProject/skycoin/src/readable" + "github.com/SkycoinProject/skycoin/src/util/useragent" +) + +func TestConnection(t *testing.T) { + tt := []struct { + name string + method string + status int + err string + addr string + gatewayGetConnectionResult *daemon.Connection + gatewayGetConnectionError error + result *readable.Connection + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "400 - empty addr", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - addr is required", + addr: "", + gatewayGetConnectionResult: nil, + result: nil, + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + err: "", + addr: "addr", + gatewayGetConnectionResult: &daemon.Connection{ + Addr: "127.0.0.1:6061", + Gnet: daemon.GnetConnectionDetails{ + ID: 1, + LastSent: time.Unix(99999, 0), + LastReceived: time.Unix(1111111, 0), + }, + ConnectionDetails: daemon.ConnectionDetails{ + Outgoing: true, + ConnectedAt: time.Unix(222222, 0), + State: daemon.ConnectionStateIntroduced, + Mirror: 6789, + ListenPort: 9877, + Height: 1234, + UserAgent: useragent.MustParse("skycoin:0.25.1(foo)"), + }, + Pex: pex.Peer{ + Trusted: false, + }, + }, + result: &readable.Connection{ + Addr: "127.0.0.1:6061", + GnetID: 1, + LastSent: 99999, + LastReceived: 1111111, + ConnectedAt: 222222, + Outgoing: true, + State: daemon.ConnectionStateIntroduced, + Mirror: 6789, + ListenPort: 9877, + Height: 1234, + UserAgent: useragent.MustParse("skycoin:0.25.1(foo)"), + IsTrustedPeer: false, + }, + }, + + { + name: "500 - GetConnection failed", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - GetConnection failed", + addr: "addr", + gatewayGetConnectionError: errors.New("GetConnection failed"), + }, + + { + name: "404", + method: http.MethodGet, + status: http.StatusNotFound, + addr: "addr", + err: "404 Not Found", + }, + } + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/network/connection" + gateway := &MockGatewayer{} + gateway.On("GetConnection", tc.addr).Return(tc.gatewayGetConnectionResult, tc.gatewayGetConnectionError) + + v := url.Values{} + if tc.addr != "" { + v.Add("addr", tc.addr) + } + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + rr := httptest.NewRecorder() + handler := newServerMux(defaultMuxConfig(), gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, want `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg *readable.Connection + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.result, msg) + } + }) + } +} + +func TestConnections(t *testing.T) { + intrOut := daemon.Connection{ + Addr: "127.0.0.1:6061", + Gnet: daemon.GnetConnectionDetails{ + ID: 1, + LastSent: time.Unix(99999, 0), + LastReceived: time.Unix(1111111, 0), + }, + ConnectionDetails: daemon.ConnectionDetails{ + Outgoing: true, + State: daemon.ConnectionStateIntroduced, + ConnectedAt: time.Unix(222222, 0), + Mirror: 9876, + ListenPort: 9877, + Height: 1234, + UserAgent: useragent.MustParse("skycoin:0.25.1(foo)"), + }, + Pex: pex.Peer{ + Trusted: true, + }, + } + + intrIn := daemon.Connection{ + Addr: "127.0.0.2:6062", + Gnet: daemon.GnetConnectionDetails{ + ID: 2, + LastSent: time.Unix(99999, 0), + LastReceived: time.Unix(1111111, 0), + }, + ConnectionDetails: daemon.ConnectionDetails{ + Outgoing: false, + State: daemon.ConnectionStateIntroduced, + ConnectedAt: time.Unix(222222, 0), + Mirror: 9877, + ListenPort: 9879, + Height: 1234, + UserAgent: useragent.MustParse("skycoin:0.25.1(foo)"), + }, + } + + readIntrOut := readable.Connection{ + Addr: "127.0.0.1:6061", + GnetID: 1, + LastSent: 99999, + LastReceived: 1111111, + ConnectedAt: 222222, + Outgoing: true, + State: daemon.ConnectionStateIntroduced, + Mirror: 9876, + ListenPort: 9877, + Height: 1234, + UserAgent: useragent.MustParse("skycoin:0.25.1(foo)"), + IsTrustedPeer: true, + } + + readIntrIn := readable.Connection{ + Addr: "127.0.0.2:6062", + GnetID: 2, + LastSent: 99999, + LastReceived: 1111111, + ConnectedAt: 222222, + Outgoing: false, + State: daemon.ConnectionStateIntroduced, + Mirror: 9877, + ListenPort: 9879, + Height: 1234, + UserAgent: useragent.MustParse("skycoin:0.25.1(foo)"), + IsTrustedPeer: false, + } + + conns := []daemon.Connection{intrOut, intrIn} + readConns := []readable.Connection{readIntrOut, readIntrIn} + + tt := []struct { + name string + method string + status int + states string + direction string + err string + gatewayGetSolicitedConnectionsResult []daemon.Connection + gatewayGetSolicitedConnectionsError error + result Connections + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + + { + name: "200 defaults", + method: http.MethodGet, + status: http.StatusOK, + err: "", + gatewayGetSolicitedConnectionsResult: conns, + result: Connections{ + Connections: readConns, + }, + }, + + { + name: "200 incoming", + method: http.MethodGet, + status: http.StatusOK, + direction: "incoming", + err: "", + gatewayGetSolicitedConnectionsResult: conns, + result: Connections{ + Connections: readConns, + }, + }, + + { + name: "200 outgoing", + method: http.MethodGet, + status: http.StatusOK, + direction: "outgoing", + err: "", + gatewayGetSolicitedConnectionsResult: conns, + result: Connections{ + Connections: readConns, + }, + }, + + { + name: "200 pending,connected", + method: http.MethodGet, + status: http.StatusOK, + states: "pending,connected", + err: "", + gatewayGetSolicitedConnectionsResult: conns, + result: Connections{ + Connections: readConns, + }, + }, + + { + name: "200 pending,connected outgoing", + method: http.MethodGet, + status: http.StatusOK, + states: "pending,connected", + direction: "outgoing", + err: "", + gatewayGetSolicitedConnectionsResult: conns, + result: Connections{ + Connections: readConns, + }, + }, + + { + name: "200 pending,introduced,connected", + method: http.MethodGet, + status: http.StatusOK, + states: "pending,introduced,connected", + err: "", + gatewayGetSolicitedConnectionsResult: conns, + result: Connections{ + Connections: readConns, + }, + }, + + { + name: "400 - bad state", + method: http.MethodGet, + status: http.StatusBadRequest, + states: "pending,foo", + err: "400 Bad Request - Invalid state in states. Valid states are \"pending\", \"connected\" or \"introduced\"", + }, + + { + name: "400 - bad direction", + method: http.MethodGet, + status: http.StatusBadRequest, + direction: "foo", + err: "400 Bad Request - Invalid direction. Valid directions are \"outgoing\" or \"incoming\"", + }, + + { + name: "500 - GetConnections failed", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - GetConnections failed", + gatewayGetSolicitedConnectionsError: errors.New("GetConnections failed"), + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/network/connections" + gateway := &MockGatewayer{} + gateway.On("GetConnections", mock.Anything).Return(tc.gatewayGetSolicitedConnectionsResult, tc.gatewayGetSolicitedConnectionsError) + + v := url.Values{} + if tc.states != "" { + v.Add("states", tc.states) + } + if tc.direction != "" { + v.Add("direction", tc.direction) + } + + endpoint += "?" + v.Encode() + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + rr := httptest.NewRecorder() + handler := newServerMux(defaultMuxConfig(), gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, want `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg Connections + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.result, msg) + } + }) + } +} + +func TestDefaultConnections(t *testing.T) { + tt := []struct { + name string + method string + status int + err string + gatewayGetDefaultConnectionsResult []string + result []string + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + err: "", + gatewayGetDefaultConnectionsResult: []string{"44.33.22.11", "11.44.66.88"}, + result: []string{"11.44.66.88", "44.33.22.11"}, + }, + } + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/network/defaultConnections" + gateway := &MockGatewayer{} + gateway.On("GetDefaultConnections").Return(tc.gatewayGetDefaultConnectionsResult) + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + rr := httptest.NewRecorder() + handler := newServerMux(defaultMuxConfig(), gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, want `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg []string + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.result, msg) + } + }) + } +} + +func TestGetTrustConnections(t *testing.T) { + tt := []struct { + name string + method string + status int + err string + gatewayGetTrustConnectionsResult []string + result []string + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + err: "", + gatewayGetTrustConnectionsResult: []string{"44.33.22.11", "11.44.66.88"}, + result: []string{"11.44.66.88", "44.33.22.11"}, + }, + } + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/network/connections/trust" + gateway := &MockGatewayer{} + gateway.On("GetTrustConnections").Return(tc.gatewayGetTrustConnectionsResult) + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + rr := httptest.NewRecorder() + handler := newServerMux(defaultMuxConfig(), gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, want `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg []string + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.result, msg) + } + }) + } +} + +func TestGetExchgConnection(t *testing.T) { + tt := []struct { + name string + method string + status int + err string + gatewayGetExchgConnectionResult []string + result []string + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + err: "", + gatewayGetExchgConnectionResult: []string{"44.33.22.11", "11.44.66.88"}, + result: []string{"11.44.66.88", "44.33.22.11"}, + }, + } + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/network/connections/exchange" + gateway := &MockGatewayer{} + gateway.On("GetExchgConnection").Return(tc.gatewayGetExchgConnectionResult) + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + rr := httptest.NewRecorder() + handler := newServerMux(defaultMuxConfig(), gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, want `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg []string + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.result, msg) + } + }) + } +} + +func TestDisconnect(t *testing.T) { + tt := []struct { + name string + method string + status int + err string + disconnectErr error + id string + gnetID uint64 + }{ + { + name: "405", + method: http.MethodGet, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + + { + name: "400 missing ID", + method: http.MethodPost, + status: http.StatusBadRequest, + err: "400 Bad Request - id is required", + }, + + { + name: "400 invalid ID 0", + method: http.MethodPost, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid id", + id: "0", + }, + + { + name: "400 invalid ID negative", + method: http.MethodPost, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid id", + id: "-100", + }, + + { + name: "404 Disconnect connection not found", + method: http.MethodPost, + status: http.StatusNotFound, + err: "404 Not Found", + disconnectErr: daemon.ErrConnectionNotExist, + id: "100", + gnetID: 100, + }, + + { + name: "500 Disconnect error", + method: http.MethodPost, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - foo", + disconnectErr: errors.New("foo"), + id: "100", + gnetID: 100, + }, + + { + name: "200", + method: http.MethodPost, + status: http.StatusOK, + id: "100", + gnetID: 100, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &MockGatewayer{} + gateway.On("DisconnectByGnetID", tc.gnetID).Return(tc.disconnectErr) + + endpoint := "/api/v1/network/connection/disconnect" + v := url.Values{} + if tc.id != "" { + v.Add("id", tc.id) + } + + req, err := http.NewRequest(tc.method, endpoint, strings.NewReader(v.Encode())) + require.NoError(t, err) + req.Header.Add("Content-Type", "application/x-www-form-urlencoded") + + rr := httptest.NewRecorder() + handler := newServerMux(defaultMuxConfig(), gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, want `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var obj struct{} + err = json.Unmarshal(rr.Body.Bytes(), &obj) + require.NoError(t, err) + } + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/outputs.go b/vendor/github.com/SkycoinProject/skycoin/src/api/outputs.go new file mode 100644 index 00000000..db6288db --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/outputs.go @@ -0,0 +1,77 @@ +package api + +import ( + "fmt" + "net/http" + + "github.com/SkycoinProject/skycoin/src/readable" + wh "github.com/SkycoinProject/skycoin/src/util/http" + "github.com/SkycoinProject/skycoin/src/visor" +) + +// outputsHandler returns UxOuts filtered by a set of addresses or a set of hashes +// URI: /api/v1/outputs +// Method: GET, POST +// Args: +// addrs: comma-separated list of addresses +// hashes: comma-separated list of uxout hashes +// If neither addrs nor hashes are specificed, return all unspent outputs. +// If only one filter is specified, then return outputs match the filter. +// Both filters cannot be specified. +func outputsHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet && r.Method != http.MethodPost { + wh.Error405(w) + return + } + + addrStr := r.FormValue("addrs") + hashStr := r.FormValue("hashes") + + if addrStr != "" && hashStr != "" { + wh.Error400(w, "addrs and hashes cannot be specified together") + return + } + + var filters []visor.OutputsFilter + + if addrStr != "" { + addrs, err := parseAddressesFromStr(addrStr) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + if len(addrs) > 0 { + filters = append(filters, visor.FbyAddresses(addrs)) + } + } + + if hashStr != "" { + hashes, err := parseHashesFromStr(hashStr) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + if len(hashes) > 0 { + filters = append(filters, visor.FbyHashes(hashes)) + } + } + + summary, err := gateway.GetUnspentOutputsSummary(filters) + if err != nil { + err = fmt.Errorf("gateway.GetUnspentOutputsSummary failed: %v", err) + wh.Error500(w, err.Error()) + return + } + + rSummary, err := readable.NewUnspentOutputsSummary(summary) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, rSummary) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/outputs_test.go b/vendor/github.com/SkycoinProject/skycoin/src/api/outputs_test.go new file mode 100644 index 00000000..ca7f36dc --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/outputs_test.go @@ -0,0 +1,162 @@ +package api + +import ( + "encoding/json" + "errors" + "io" + "net/http" + "net/http/httptest" + "net/url" + "strings" + "testing" + + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/readable" + "github.com/SkycoinProject/skycoin/src/visor" +) + +func TestGetOutputsHandler(t *testing.T) { + validAddr := "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf" + invalidAddr := "invalidAddr" + validHash := "79216473e8f2c17095c6887cc9edca6c023afedfac2e0c5460e8b6f359684f8b" + + type httpBody struct { + addrs string + hashStr string + } + tt := []struct { + name string + method string + status int + err string + httpBody *httpBody + getUnspentOutputsResponse *visor.UnspentOutputsSummary + getUnspentOutputsError error + httpResponse *readable.UnspentOutputsSummary + }{ + { + name: "405", + method: http.MethodDelete, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "400 - addrs and hashes together", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - addrs and hashes cannot be specified together", + httpBody: &httpBody{ + addrs: validAddr, + hashStr: validHash, + }, + }, + { + name: "400 - invalid address", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - address \"invalidAddr\" is invalid: Invalid base58 character", + httpBody: &httpBody{ + addrs: invalidAddr, + }, + }, + { + name: "500 - getUnspentOutputsError", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gateway.GetUnspentOutputsSummary failed: getUnspentOutputsError", + getUnspentOutputsResponse: nil, + getUnspentOutputsError: errors.New("getUnspentOutputsError"), + }, + { + name: "200 - OK", + method: http.MethodGet, + status: http.StatusOK, + getUnspentOutputsResponse: &visor.UnspentOutputsSummary{ + HeadBlock: &coin.SignedBlock{}, + }, + httpResponse: &readable.UnspentOutputsSummary{ + Head: readable.BlockHeader{ + Hash: "7b8ec8dd836b564f0c85ad088fc744de820345204e154bc1503e04e9d6fdd9f1", + PreviousHash: "0000000000000000000000000000000000000000000000000000000000000000", + BodyHash: "0000000000000000000000000000000000000000000000000000000000000000", + UxHash: "0000000000000000000000000000000000000000000000000000000000000000", + }, + HeadOutputs: readable.UnspentOutputs{}, + OutgoingOutputs: readable.UnspentOutputs{}, + IncomingOutputs: readable.UnspentOutputs{}, + }, + }, + { + name: "200 - OK POST", + method: http.MethodPost, + status: http.StatusOK, + getUnspentOutputsResponse: &visor.UnspentOutputsSummary{ + HeadBlock: &coin.SignedBlock{}, + }, + httpResponse: &readable.UnspentOutputsSummary{ + Head: readable.BlockHeader{ + Hash: "7b8ec8dd836b564f0c85ad088fc744de820345204e154bc1503e04e9d6fdd9f1", + PreviousHash: "0000000000000000000000000000000000000000000000000000000000000000", + BodyHash: "0000000000000000000000000000000000000000000000000000000000000000", + UxHash: "0000000000000000000000000000000000000000000000000000000000000000", + }, + HeadOutputs: readable.UnspentOutputs{}, + OutgoingOutputs: readable.UnspentOutputs{}, + IncomingOutputs: readable.UnspentOutputs{}, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &MockGatewayer{} + endpoint := "/api/v1/outputs" + gateway.On("GetUnspentOutputsSummary", mock.Anything).Return(tc.getUnspentOutputsResponse, tc.getUnspentOutputsError) + + v := url.Values{} + if tc.httpBody != nil { + if tc.httpBody.hashStr != "" { + v.Add("hashes", tc.httpBody.hashStr) + } + if tc.httpBody.addrs != "" { + v.Add("addrs", tc.httpBody.addrs) + } + } + + var reqBody io.Reader + if len(v) > 0 { + if tc.method == http.MethodPost { + reqBody = strings.NewReader(v.Encode()) + } else { + endpoint += "?" + v.Encode() + } + } + + req, err := http.NewRequest(tc.method, endpoint, reqBody) + require.NoError(t, err) + + if tc.method == http.MethodPost { + req.Header.Set("Content-Type", ContentTypeForm) + } + + rr := httptest.NewRecorder() + handler := newServerMux(defaultMuxConfig(), gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String())) + } else { + var msg *readable.UnspentOutputsSummary + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.httpResponse, msg, tc.name) + } + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/spend.go b/vendor/github.com/SkycoinProject/skycoin/src/api/spend.go new file mode 100644 index 00000000..94bd61b0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/spend.go @@ -0,0 +1,748 @@ +package api + +import ( + "encoding/json" + "errors" + "fmt" + "net/http" + "strconv" + + "github.com/shopspring/decimal" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/transaction" + "github.com/SkycoinProject/skycoin/src/util/droplet" + "github.com/SkycoinProject/skycoin/src/util/fee" + wh "github.com/SkycoinProject/skycoin/src/util/http" + "github.com/SkycoinProject/skycoin/src/util/mathutil" + "github.com/SkycoinProject/skycoin/src/visor" + "github.com/SkycoinProject/skycoin/src/visor/blockdb" + "github.com/SkycoinProject/skycoin/src/wallet" +) + +// CreateTransactionResponse is returned by /wallet/transaction +type CreateTransactionResponse struct { + Transaction CreatedTransaction `json:"transaction"` + EncodedTransaction string `json:"encoded_transaction"` +} + +// NewCreateTransactionResponse creates a CreateTransactionResponse +func NewCreateTransactionResponse(txn *coin.Transaction, inputs []visor.TransactionInput) (*CreateTransactionResponse, error) { + cTxn, err := NewCreatedTransaction(txn, inputs) + if err != nil { + return nil, err + } + + txnHex, err := txn.SerializeHex() + if err != nil { + return nil, err + } + + return &CreateTransactionResponse{ + Transaction: *cTxn, + EncodedTransaction: txnHex, + }, nil +} + +// CreatedTransaction represents a transaction created by /wallet/transaction +type CreatedTransaction struct { + Length uint32 `json:"length"` + Type uint8 `json:"type"` + TxID string `json:"txid"` + InnerHash string `json:"inner_hash"` + Fee string `json:"fee"` + + Sigs []string `json:"sigs"` + In []CreatedTransactionInput `json:"inputs"` + Out []CreatedTransactionOutput `json:"outputs"` +} + +// NewCreatedTransaction returns a CreatedTransaction +func NewCreatedTransaction(txn *coin.Transaction, inputs []visor.TransactionInput) (*CreatedTransaction, error) { + if len(txn.In) != len(inputs) { + return nil, errors.New("len(txn.In) != len(inputs)") + } + + var outputHours uint64 + for _, o := range txn.Out { + var err error + outputHours, err = mathutil.AddUint64(outputHours, o.Hours) + if err != nil { + return nil, err + } + } + + var inputHours uint64 + for _, i := range inputs { + var err error + inputHours, err = mathutil.AddUint64(inputHours, i.CalculatedHours) + if err != nil { + return nil, err + } + } + + if inputHours < outputHours { + return nil, errors.New("inputHours unexpectedly less than output hours") + } + + fee := inputHours - outputHours + + sigs := make([]string, len(txn.Sigs)) + for i, s := range txn.Sigs { + sigs[i] = s.Hex() + } + + txID := txn.Hash() + out := make([]CreatedTransactionOutput, len(txn.Out)) + for i, o := range txn.Out { + co, err := NewCreatedTransactionOutput(o, txID) + if err != nil { + return nil, err + } + out[i] = *co + } + + in := make([]CreatedTransactionInput, len(inputs)) + for i, o := range inputs { + ci, err := NewCreatedTransactionInput(o) + if err != nil { + return nil, err + } + in[i] = *ci + } + + return &CreatedTransaction{ + Length: txn.Length, + Type: txn.Type, + TxID: txID.Hex(), + InnerHash: txn.InnerHash.Hex(), + Fee: fmt.Sprint(fee), + + Sigs: sigs, + In: in, + Out: out, + }, nil +} + +// ToTransaction converts a CreatedTransaction back to a coin.Transaction +func (r *CreatedTransaction) ToTransaction() (*coin.Transaction, error) { + t := coin.Transaction{} + + t.Length = r.Length + t.Type = r.Type + + var err error + t.InnerHash, err = cipher.SHA256FromHex(r.InnerHash) + if err != nil { + return nil, err + } + + sigs := make([]cipher.Sig, len(r.Sigs)) + for i, s := range r.Sigs { + sigs[i], err = cipher.SigFromHex(s) + if err != nil { + return nil, err + } + } + + t.Sigs = sigs + + in := make([]cipher.SHA256, len(r.In)) + for i, n := range r.In { + in[i], err = cipher.SHA256FromHex(n.UxID) + if err != nil { + return nil, err + } + } + + t.In = in + + out := make([]coin.TransactionOutput, len(r.Out)) + for i, o := range r.Out { + addr, err := cipher.DecodeBase58Address(o.Address) + if err != nil { + return nil, err + } + + coins, err := droplet.FromString(o.Coins) + if err != nil { + return nil, err + } + + hours, err := strconv.ParseUint(o.Hours, 10, 64) + if err != nil { + return nil, err + } + + out[i] = coin.TransactionOutput{ + Address: addr, + Coins: coins, + Hours: hours, + } + } + + t.Out = out + + hash, err := cipher.SHA256FromHex(r.TxID) + if err != nil { + return nil, err + } + + if t.Hash() != hash { + return nil, fmt.Errorf("readable.Transaction.Hash %s does not match parsed transaction hash %s", t.Hash().Hex(), hash.Hex()) + } + + return &t, nil +} + +// CreatedTransactionOutput is a transaction output +type CreatedTransactionOutput struct { + UxID string `json:"uxid"` + Address string `json:"address"` + Coins string `json:"coins"` + Hours string `json:"hours"` +} + +// NewCreatedTransactionOutput creates CreatedTransactionOutput +func NewCreatedTransactionOutput(out coin.TransactionOutput, txid cipher.SHA256) (*CreatedTransactionOutput, error) { + coins, err := droplet.ToString(out.Coins) + if err != nil { + return nil, err + } + + return &CreatedTransactionOutput{ + UxID: out.UxID(txid).Hex(), + Address: out.Address.String(), + Coins: coins, + Hours: fmt.Sprint(out.Hours), + }, nil +} + +// CreatedTransactionInput is a verbose transaction input +type CreatedTransactionInput struct { + UxID string `json:"uxid"` + Address string `json:"address,omitempty"` + Coins string `json:"coins,omitempty"` + Hours string `json:"hours,omitempty"` + CalculatedHours string `json:"calculated_hours,omitempty"` + Time uint64 `json:"timestamp,omitempty"` + Block uint64 `json:"block,omitempty"` + TxID string `json:"txid,omitempty"` +} + +// NewCreatedTransactionInput creates CreatedTransactionInput +func NewCreatedTransactionInput(out visor.TransactionInput) (*CreatedTransactionInput, error) { + coins, err := droplet.ToString(out.UxOut.Body.Coins) + if err != nil { + return nil, err + } + + if out.UxOut.Body.SrcTransaction.Null() { + return nil, errors.New("NewCreatedTransactionInput UxOut.SrcTransaction is not initialized") + } + + addr := out.UxOut.Body.Address.String() + hours := fmt.Sprint(out.UxOut.Body.Hours) + calculatedHours := fmt.Sprint(out.CalculatedHours) + txID := out.UxOut.Body.SrcTransaction.Hex() + + return &CreatedTransactionInput{ + UxID: out.UxOut.Hash().Hex(), + Address: addr, + Coins: coins, + Hours: hours, + CalculatedHours: calculatedHours, + Time: out.UxOut.Head.Time, + Block: out.UxOut.Head.BkSeq, + TxID: txID, + }, nil +} + +// createTransactionRequest is sent to POST /api/v2/transaction +type createTransactionRequest struct { + IgnoreUnconfirmed bool `json:"ignore_unconfirmed"` + HoursSelection hoursSelection `json:"hours_selection"` + ChangeAddress *wh.Address `json:"change_address,omitempty"` + To []receiver `json:"to"` + UxOuts []wh.SHA256 `json:"unspents,omitempty"` + Addresses []wh.Address `json:"addresses,omitempty"` +} + +// hoursSelection defines options for hours distribution +type hoursSelection struct { + Type string `json:"type"` + Mode string `json:"mode"` + ShareFactor *decimal.Decimal `json:"share_factor,omitempty"` +} + +// receiver specifies a spend destination +type receiver struct { + Address wh.Address `json:"address"` + Coins wh.Coins `json:"coins"` + Hours *wh.Hours `json:"hours,omitempty"` +} + +// Validate validates createTransactionRequest data +func (r createTransactionRequest) Validate() error { + if r.ChangeAddress != nil && r.ChangeAddress.Null() { + return errors.New("change_address must not be the null address") + } + + switch r.HoursSelection.Type { + case transaction.HoursSelectionTypeAuto: + for i, to := range r.To { + if to.Hours != nil { + return fmt.Errorf("to[%d].hours must not be specified for auto hours_selection.mode", i) + } + } + + switch r.HoursSelection.Mode { + case transaction.HoursSelectionModeShare: + case "": + return errors.New("missing hours_selection.mode") + default: + return errors.New("invalid hours_selection.mode") + } + + case transaction.HoursSelectionTypeManual: + for i, to := range r.To { + if to.Hours == nil { + return fmt.Errorf("to[%d].hours must be specified for manual hours_selection.mode", i) + } + } + + if r.HoursSelection.Mode != "" { + return errors.New("hours_selection.mode cannot be used for manual hours_selection.type") + } + + case "": + return errors.New("missing hours_selection.type") + default: + return errors.New("invalid hours_selection.type") + } + + if r.HoursSelection.ShareFactor == nil { + if r.HoursSelection.Mode == transaction.HoursSelectionModeShare { + return errors.New("missing hours_selection.share_factor when hours_selection.mode is share") + } + } else { + if r.HoursSelection.Mode != transaction.HoursSelectionModeShare { + return errors.New("hours_selection.share_factor can only be used when hours_selection.mode is share") + } + + switch { + case r.HoursSelection.ShareFactor.LessThan(decimal.New(0, 0)): + return errors.New("hours_selection.share_factor cannot be negative") + case r.HoursSelection.ShareFactor.GreaterThan(decimal.New(1, 0)): + return errors.New("hours_selection.share_factor cannot be more than 1") + } + } + + if len(r.UxOuts) != 0 && len(r.Addresses) != 0 { + return errors.New("unspents and addresses cannot be combined") + } + + addressMap := make(map[cipher.Address]struct{}, len(r.Addresses)) + for i, a := range r.Addresses { + if a.Null() { + return fmt.Errorf("addresses[%d] is empty", i) + } + + if _, ok := addressMap[a.Address]; ok { + return errors.New("addresses contains duplicate values") + } + + addressMap[a.Address] = struct{}{} + } + + // Check for duplicate spending uxouts + uxouts := make(map[cipher.SHA256]struct{}, len(r.UxOuts)) + for _, o := range r.UxOuts { + if _, ok := uxouts[o.SHA256]; ok { + return errors.New("unspents contains duplicate values") + } + + uxouts[o.SHA256] = struct{}{} + } + + if len(r.To) == 0 { + return errors.New("to is empty") + } + + for i, to := range r.To { + if to.Address.Null() { + return fmt.Errorf("to[%d].address is empty", i) + } + + if to.Coins == 0 { + return fmt.Errorf("to[%d].coins must not be zero", i) + } + + if to.Coins.Value()%params.UserVerifyTxn.MaxDropletDivisor() != 0 { + return fmt.Errorf("to[%d].coins has too many decimal places", i) + } + } + + // Check for duplicate created outputs, a transaction can't have outputs with + // the same (address, coins, hours) + // Auto mode would distribute hours to the outputs and could hypothetically + // avoid assigning duplicate hours in many cases, but the complexity for doing + // so is very high, so also reject duplicate (address, coins) for auto mode. + outputs := make(map[coin.TransactionOutput]struct{}, len(r.To)) + for _, to := range r.To { + var hours uint64 + if to.Hours != nil { + hours = to.Hours.Value() + } + + txo := coin.TransactionOutput{ + Address: to.Address.Address, + Coins: to.Coins.Value(), + Hours: hours, + } + + if _, ok := outputs[txo]; ok { + return errors.New("to contains duplicate values") + } + + outputs[txo] = struct{}{} + } + + return nil +} + +// TransactionParams converts createTransactionRequest to transaction.Params +func (r createTransactionRequest) TransactionParams() transaction.Params { + to := make([]coin.TransactionOutput, len(r.To)) + for i, t := range r.To { + var hours uint64 + if t.Hours != nil { + hours = t.Hours.Value() + } + + to[i] = coin.TransactionOutput{ + Address: t.Address.Address, + Coins: t.Coins.Value(), + Hours: hours, + } + } + + var changeAddress *cipher.Address + if r.ChangeAddress != nil { + changeAddress = &r.ChangeAddress.Address + } + + return transaction.Params{ + HoursSelection: transaction.HoursSelection{ + Type: r.HoursSelection.Type, + Mode: r.HoursSelection.Mode, + ShareFactor: r.HoursSelection.ShareFactor, + }, + ChangeAddress: changeAddress, + To: to, + } +} + +func (r createTransactionRequest) VisorParams() visor.CreateTransactionParams { + return visor.CreateTransactionParams{ + IgnoreUnconfirmed: r.IgnoreUnconfirmed, + Addresses: r.addresses(), + UxOuts: r.uxOuts(), + } +} + +func (r createTransactionRequest) addresses() []cipher.Address { + if len(r.Addresses) == 0 { + return nil + } + addresses := make([]cipher.Address, len(r.Addresses)) + for i, a := range r.Addresses { + addresses[i] = a.Address + } + return addresses +} + +func (r createTransactionRequest) uxOuts() []cipher.SHA256 { + if len(r.UxOuts) == 0 { + return nil + } + uxouts := make([]cipher.SHA256, len(r.UxOuts)) + for i, o := range r.UxOuts { + uxouts[i] = o.SHA256 + } + return uxouts +} + +// transactionHandlerV2 creates a transaction from provided outputs and parameters +// Method: POST +// URI: /api/v2/transaction +// Args: JSON body +func transactionHandlerV2(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + resp := NewHTTPErrorResponse(http.StatusMethodNotAllowed, "") + writeHTTPResponse(w, resp) + return + } + + var req createTransactionRequest + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + resp := NewHTTPErrorResponse(http.StatusBadRequest, err.Error()) + writeHTTPResponse(w, resp) + return + } + + if err := req.Validate(); err != nil { + resp := NewHTTPErrorResponse(http.StatusBadRequest, err.Error()) + writeHTTPResponse(w, resp) + return + } + + // Check that addresses or unspents are not empty + // This is not checked in Validate() because POST /api/v1/wallet/transaction + // allows both to be empty + if len(req.Addresses) == 0 && len(req.UxOuts) == 0 { + resp := NewHTTPErrorResponse(http.StatusBadRequest, "one of addresses or unspents must not be empty") + writeHTTPResponse(w, resp) + return + } + + txn, inputs, err := gateway.CreateTransaction(req.TransactionParams(), req.VisorParams()) + if err != nil { + var resp HTTPResponse + switch err.(type) { + case blockdb.ErrUnspentNotExist, transaction.Error, visor.UserError, wallet.Error: + resp = NewHTTPErrorResponse(http.StatusBadRequest, err.Error()) + default: + switch err { + case fee.ErrTxnNoFee, fee.ErrTxnInsufficientCoinHours: + resp = NewHTTPErrorResponse(http.StatusBadRequest, err.Error()) + default: + resp = NewHTTPErrorResponse(http.StatusInternalServerError, err.Error()) + } + } + writeHTTPResponse(w, resp) + return + } + + txnResp, err := NewCreateTransactionResponse(txn, inputs) + if err != nil { + resp := NewHTTPErrorResponse(http.StatusInternalServerError, fmt.Sprintf("NewCreateTransactionResponse failed: %v", err)) + writeHTTPResponse(w, resp) + return + } + + writeHTTPResponse(w, HTTPResponse{ + Data: txnResp, + }) + } +} + +// walletCreateTransactionRequest is sent to POST /api/v1/wallet/transaction +type walletCreateTransactionRequest struct { + Unsigned bool `json:"unsigned"` + WalletID string `json:"wallet_id"` + Password string `json:"password"` + createTransactionRequest +} + +// Validate validates walletCreateTransactionRequest data +func (r walletCreateTransactionRequest) Validate() error { + if r.WalletID == "" { + return errors.New("missing wallet_id") + } + + if r.Unsigned && len(r.Password) != 0 { + return errors.New("password must not be used for unsigned transactions") + } + + return r.createTransactionRequest.Validate() +} + +// walletCreateTransactionHandler creates a transaction +// Method: POST +// URI: /api/v1/wallet/transaction +// Args: JSON body +func walletCreateTransactionHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + wh.Error405(w) + return + } + + if !isContentTypeJSON(r.Header.Get("Content-Type")) { + wh.Error415(w) + return + } + + var req walletCreateTransactionRequest + err := json.NewDecoder(r.Body).Decode(&req) + if err != nil { + logger.WithError(err).Error("Invalid create transaction request") + wh.Error400(w, err.Error()) + return + } + + if err := req.Validate(); err != nil { + logger.WithError(err).Error("Invalid create transaction request") + wh.Error400(w, err.Error()) + return + } + + var txn *coin.Transaction + var inputs []visor.TransactionInput + if req.Unsigned { + txn, inputs, err = gateway.WalletCreateTransaction(req.WalletID, req.TransactionParams(), req.VisorParams()) + } else { + txn, inputs, err = gateway.WalletCreateTransactionSigned(req.WalletID, []byte(req.Password), req.TransactionParams(), req.VisorParams()) + } + if err != nil { + switch err.(type) { + case wallet.Error: + switch err { + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + case wallet.ErrWalletNotExist: + wh.Error404(w, err.Error()) + default: + wh.Error400(w, err.Error()) + } + case blockdb.ErrUnspentNotExist, + transaction.Error, + visor.UserError: + wh.Error400(w, err.Error()) + default: + switch err { + case fee.ErrTxnNoFee, + fee.ErrTxnInsufficientCoinHours: + wh.Error400(w, err.Error()) + default: + wh.Error500(w, err.Error()) + } + } + return + } + + txnResp, err := NewCreateTransactionResponse(txn, inputs) + if err != nil { + err = fmt.Errorf("NewCreateTransactionResponse failed: %v", err) + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, txnResp) + } +} + +// WalletSignTransactionRequest is the request body object for /api/v2/wallet/transaction/sign +type WalletSignTransactionRequest struct { + WalletID string `json:"wallet_id"` + Password string `json:"password"` + EncodedTransaction string `json:"encoded_transaction"` + SignIndexes []int `json:"sign_indexes"` +} + +// walletSignTransactionHandler signs an unsigned transaction +// Method: POST +// URI: /api/v2/wallet/transaction/sign +// Args: JSON body +func walletSignTransactionHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + resp := NewHTTPErrorResponse(http.StatusMethodNotAllowed, "") + writeHTTPResponse(w, resp) + return + } + + var req WalletSignTransactionRequest + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + resp := NewHTTPErrorResponse(http.StatusBadRequest, err.Error()) + writeHTTPResponse(w, resp) + return + } + + if req.WalletID == "" { + resp := NewHTTPErrorResponse(http.StatusBadRequest, "wallet_id is required") + writeHTTPResponse(w, resp) + return + } + + if req.EncodedTransaction == "" { + resp := NewHTTPErrorResponse(http.StatusBadRequest, "encoded_transaction is required") + writeHTTPResponse(w, resp) + return + } + + txn, err := decodeTxn(req.EncodedTransaction) + if err != nil { + resp := NewHTTPErrorResponse(http.StatusBadRequest, fmt.Sprintf("Decode transaction failed: %v", err)) + writeHTTPResponse(w, resp) + return + } + + // Check that number of sign_indexes does not exceed number of inputs + if len(req.SignIndexes) > len(txn.In) { + resp := NewHTTPErrorResponse(http.StatusBadRequest, "Too many values in sign_indexes") + writeHTTPResponse(w, resp) + return + } + + // Check that values in sign_indexes are in the range of txn inputs + for _, i := range req.SignIndexes { + if i < 0 || i >= len(txn.In) { + resp := NewHTTPErrorResponse(http.StatusBadRequest, "Value in sign_indexes exceeds range of transaction inputs array") + writeHTTPResponse(w, resp) + return + } + } + + // Check for duplicate values in sign_indexes + signIndexesMap := make(map[int]struct{}, len(req.SignIndexes)) + for _, i := range req.SignIndexes { + if _, ok := signIndexesMap[i]; ok { + resp := NewHTTPErrorResponse(http.StatusBadRequest, "Duplicate value in sign_indexes") + writeHTTPResponse(w, resp) + return + } + signIndexesMap[i] = struct{}{} + } + + signedTxn, inputs, err := gateway.WalletSignTransaction(req.WalletID, []byte(req.Password), txn, req.SignIndexes) + if err != nil { + var resp HTTPResponse + switch err.(type) { + case wallet.Error: + switch err { + case wallet.ErrWalletNotExist: + resp = NewHTTPErrorResponse(http.StatusNotFound, err.Error()) + case wallet.ErrWalletAPIDisabled: + resp = NewHTTPErrorResponse(http.StatusForbidden, err.Error()) + default: + resp = NewHTTPErrorResponse(http.StatusBadRequest, err.Error()) + } + case visor.ErrTxnViolatesSoftConstraint, + visor.ErrTxnViolatesHardConstraint, + visor.ErrTxnViolatesUserConstraint, + blockdb.ErrUnspentNotExist: + resp = NewHTTPErrorResponse(http.StatusBadRequest, err.Error()) + default: + resp = NewHTTPErrorResponse(http.StatusInternalServerError, err.Error()) + } + writeHTTPResponse(w, resp) + return + } + + txnResp, err := NewCreateTransactionResponse(signedTxn, inputs) + if err != nil { + resp := NewHTTPErrorResponse(http.StatusInternalServerError, err.Error()) + writeHTTPResponse(w, resp) + return + } + + writeHTTPResponse(w, HTTPResponse{ + Data: txnResp, + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/spend_test.go b/vendor/github.com/SkycoinProject/skycoin/src/api/spend_test.go new file mode 100644 index 00000000..12c6a925 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/spend_test.go @@ -0,0 +1,2193 @@ +package api + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" + "net/http" + "net/http/httptest" + "strings" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/transaction" + "github.com/SkycoinProject/skycoin/src/util/fee" + "github.com/SkycoinProject/skycoin/src/visor" + "github.com/SkycoinProject/skycoin/src/visor/blockdb" + "github.com/SkycoinProject/skycoin/src/wallet" +) + +type rawHoursSelection struct { + Type string `json:"type"` + Mode string `json:"mode"` + ShareFactor *string `json:"share_factor,omitempty"` +} + +type rawReceiver struct { + Address string `json:"address"` + Coins string `json:"coins"` + Hours string `json:"hours,omitempty"` +} + +type rawCreateTxnRequest struct { + UxOuts []string `json:"unspents,omitempty"` + Addresses []string `json:"addresses,omitempty"` + HoursSelection rawHoursSelection `json:"hours_selection"` + ChangeAddress string `json:"change_address,omitempty"` + To []rawReceiver `json:"to"` + Password string `json:"password"` +} + +func TestCreateTransaction(t *testing.T) { + changeAddress := testutil.MakeAddress() + destinationAddress := testutil.MakeAddress() + emptyAddress := cipher.Address{} + + txn := &coin.Transaction{ + Length: 100, + Type: 0, + InnerHash: testutil.RandSHA256(t), + In: []cipher.SHA256{testutil.RandSHA256(t)}, + Out: []coin.TransactionOutput{ + { + Address: destinationAddress, + Coins: 1e6, + Hours: 100, + }, + }, + } + + inputs := []visor.TransactionInput{ + { + UxOut: coin.UxOut{ + Head: coin.UxHead{ + Time: uint64(time.Now().UTC().Unix()), + BkSeq: 9999, + }, + Body: coin.UxBody{ + SrcTransaction: testutil.RandSHA256(t), + Address: testutil.MakeAddress(), + Coins: 1e6, + Hours: 100, + }, + }, + CalculatedHours: 200, + }, + } + + createdTxn, err := NewCreatedTransaction(txn, inputs) + require.NoError(t, err) + + createTxnResponse := CreateTransactionResponse{ + Transaction: *createdTxn, + EncodedTransaction: txn.MustSerializeHex(), + } + + validBody := &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "100", + Hours: "10", + }, + }, + ChangeAddress: changeAddress.String(), + UxOuts: []string{testutil.RandSHA256(t).Hex(), testutil.RandSHA256(t).Hex()}, + } + + walletInput := testutil.RandSHA256(t) + + tt := []struct { + name string + method string + status int + body *rawCreateTxnRequest + rawBody string + + gatewayCreateTransactionResult *coin.Transaction + gatewayCreateTransactionInputs []visor.TransactionInput + gatewayCreateTransactionErr error + + csrfDisabled bool + contentType string + + httpResponse HTTPResponse + }{ + { + name: "405", + method: http.MethodGet, + status: http.StatusMethodNotAllowed, + httpResponse: NewHTTPErrorResponse(http.StatusMethodNotAllowed, ""), + }, + + { + name: "415", + method: http.MethodPost, + status: http.StatusUnsupportedMediaType, + contentType: ContentTypeForm, + httpResponse: NewHTTPErrorResponse(http.StatusUnsupportedMediaType, ""), + }, + + { + name: "400 - missing hours selection type", + method: http.MethodPost, + body: &rawCreateTxnRequest{}, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "missing hours_selection.type"), + }, + + { + name: "400 - invalid hours selection type", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: "foo", + }, + }, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "invalid hours_selection.type"), + }, + + { + name: "400 - missing hours selection mode", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + }, + }, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "missing hours_selection.mode"), + }, + + { + name: "400 - invalid hours selection mode", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: "foo", + }, + }, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "invalid hours_selection.mode"), + }, + + { + name: "400 - missing hours selection share factor", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + }, + }, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "missing hours_selection.share_factor when hours_selection.mode is share"), + }, + + { + name: "400 - share factor set but mode is not share", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + ShareFactor: newStrPtr("0.5"), + }, + }, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "hours_selection.share_factor can only be used when hours_selection.mode is share"), + }, + + { + name: "400 - negative share factor", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + ShareFactor: newStrPtr("-1"), + }, + }, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "hours_selection.share_factor cannot be negative"), + }, + + { + name: "400 - share factor greater than 1", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + ShareFactor: newStrPtr("1.1"), + }, + }, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "hours_selection.share_factor cannot be more than 1"), + }, + + { + name: "400 - empty sender address", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + ChangeAddress: changeAddress.String(), + Addresses: []string{""}, + }, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "invalid address: Invalid base58 string"), + }, + + { + name: "400 - invalid sender address", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + ChangeAddress: changeAddress.String(), + Addresses: []string{"xxx"}, + }, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "invalid address: Invalid address length"), + }, + + { + name: "400 - invalid change address", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + ChangeAddress: "xxx", + }, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "invalid address: Invalid address length"), + }, + + { + name: "400 - empty change address", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + ChangeAddress: emptyAddress.String(), + }, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "change_address must not be the null address"), + }, + + { + name: "400 - auto type destination has hours", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + ShareFactor: newStrPtr("0.5"), + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Hours: "100", + Coins: "1.01", + }, + }, + ChangeAddress: changeAddress.String(), + }, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "to[0].hours must not be specified for auto hours_selection.mode"), + }, + + { + name: "400 - manual type destination missing hours", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.01", + }, + }, + ChangeAddress: changeAddress.String(), + }, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "to[0].hours must be specified for manual hours_selection.mode"), + }, + + { + name: "400 - manual type has mode set", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + Mode: transaction.HoursSelectionModeShare, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.01", + Hours: "100", + }, + }, + ChangeAddress: changeAddress.String(), + }, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "hours_selection.mode cannot be used for manual hours_selection.type"), + }, + + { + name: "400 - address is empty", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.01", + Hours: "100", + }, + }, + ChangeAddress: changeAddress.String(), + Addresses: []string{emptyAddress.String()}, + }, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "addresses[0] is empty"), + }, + + { + name: "400 - to address is empty", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: emptyAddress.String(), + Coins: "1.01", + Hours: "100", + }, + }, + ChangeAddress: changeAddress.String(), + }, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "to[0].address is empty"), + }, + + { + name: "400 - to coins is zero", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "0", + Hours: "100", + }, + }, + ChangeAddress: changeAddress.String(), + }, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "to[0].coins must not be zero"), + }, + + { + name: "400 - invalid to coins", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "0.1a", + Hours: "100", + }, + }, + ChangeAddress: changeAddress.String(), + }, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "can't convert 0.1a to decimal"), + }, + + { + name: "400 - invalid to hours", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "0.1", + Hours: "100.1", + }, + }, + ChangeAddress: changeAddress.String(), + }, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "invalid hours value: strconv.ParseUint: parsing \"100.1\": invalid syntax"), + }, + + { + name: "400 - empty string to coins", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + ShareFactor: newStrPtr("0.5"), + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "", + Hours: "", + }, + }, + ChangeAddress: changeAddress.String(), + }, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "can't convert to decimal"), + }, + + { + name: "400 - coins has too many decimals", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + ShareFactor: newStrPtr("0.5"), + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.1234", + }, + }, + ChangeAddress: changeAddress.String(), + }, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "to[0].coins has too many decimal places"), + }, + + { + name: "400 - empty to", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + ChangeAddress: changeAddress.String(), + }, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "to is empty"), + }, + + { + name: "400 - manual duplicate outputs", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + ChangeAddress: changeAddress.String(), + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.2", + Hours: "100", + }, + { + Address: destinationAddress.String(), + Coins: "1.2", + Hours: "100", + }, + }, + }, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "to contains duplicate values"), + }, + + { + name: "400 - auto duplicate outputs", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + ShareFactor: newStrPtr("0.5"), + }, + ChangeAddress: changeAddress.String(), + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.2", + }, + { + Address: destinationAddress.String(), + Coins: "1.2", + }, + }, + }, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "to contains duplicate values"), + }, + + { + name: "400 - both uxouts and addresses specified", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + ShareFactor: newStrPtr("0.5"), + }, + ChangeAddress: changeAddress.String(), + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.2", + }, + }, + Addresses: []string{destinationAddress.String()}, + UxOuts: []string{walletInput.Hex()}, + }, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "unspents and addresses cannot be combined"), + }, + + { + name: "400 - missing uxouts and addresses", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + ShareFactor: newStrPtr("0.5"), + }, + ChangeAddress: changeAddress.String(), + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.2", + }, + }, + }, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "one of addresses or unspents must not be empty"), + }, + + { + name: "400 - duplicate uxouts", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + ShareFactor: newStrPtr("0.5"), + }, + ChangeAddress: changeAddress.String(), + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.2", + }, + }, + UxOuts: []string{walletInput.Hex(), walletInput.Hex()}, + }, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "unspents contains duplicate values"), + }, + + { + name: "400 - duplicate addresses", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + ShareFactor: newStrPtr("0.5"), + }, + ChangeAddress: changeAddress.String(), + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.2", + }, + }, + Addresses: []string{destinationAddress.String(), destinationAddress.String()}, + }, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "addresses contains duplicate values"), + }, + + { + name: "200 - auto type split even", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + ShareFactor: newStrPtr("0.5"), + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "100", + }, + }, + ChangeAddress: changeAddress.String(), + Addresses: []string{changeAddress.String()}, + }, + status: http.StatusOK, + gatewayCreateTransactionResult: txn, + gatewayCreateTransactionInputs: inputs, + httpResponse: HTTPResponse{ + Data: createTxnResponse, + }, + }, + + { + name: "200 - manual type zero hours", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "100", + Hours: "0", + }, + }, + ChangeAddress: changeAddress.String(), + Addresses: []string{changeAddress.String()}, + }, + status: http.StatusOK, + gatewayCreateTransactionResult: txn, + gatewayCreateTransactionInputs: inputs, + httpResponse: HTTPResponse{ + Data: createTxnResponse, + }, + }, + + { + name: "200 - manual type nonzero hours", + method: http.MethodPost, + body: &rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "100", + Hours: "10", + }, + }, + ChangeAddress: changeAddress.String(), + Addresses: []string{changeAddress.String()}, + }, + status: http.StatusOK, + gatewayCreateTransactionResult: txn, + gatewayCreateTransactionInputs: inputs, + httpResponse: HTTPResponse{ + Data: createTxnResponse, + }, + }, + + { + name: "200 - manual type nonzero hours - csrf disabled", + method: http.MethodPost, + body: validBody, + status: http.StatusOK, + gatewayCreateTransactionResult: txn, + gatewayCreateTransactionInputs: inputs, + httpResponse: HTTPResponse{ + Data: createTxnResponse, + }, + csrfDisabled: true, + }, + + { + name: "500 - misc error", + method: http.MethodPost, + body: validBody, + status: http.StatusInternalServerError, + gatewayCreateTransactionErr: errors.New("unhandled error"), + httpResponse: NewHTTPErrorResponse(http.StatusInternalServerError, "unhandled error"), + }, + + { + name: "400 - no fee", + method: http.MethodPost, + body: validBody, + status: http.StatusBadRequest, + gatewayCreateTransactionErr: fee.ErrTxnNoFee, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "Transaction has zero coinhour fee"), + }, + + { + name: "400 - insufficient coin hours", + method: http.MethodPost, + body: validBody, + status: http.StatusBadRequest, + gatewayCreateTransactionErr: fee.ErrTxnInsufficientCoinHours, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "Insufficient coinhours for transaction outputs"), + }, + + { + name: "400 - uxout doesn't exist", + method: http.MethodPost, + body: validBody, + status: http.StatusBadRequest, + gatewayCreateTransactionErr: blockdb.NewErrUnspentNotExist("foo"), + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "unspent output of foo does not exist"), + }, + + { + name: "400 - visor error", + method: http.MethodPost, + body: validBody, + status: http.StatusBadRequest, + gatewayCreateTransactionErr: visor.ErrSpendingUnconfirmed, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "Please spend after your pending transaction is confirmed"), + }, + + { + name: "400 - txn create error", + method: http.MethodPost, + body: validBody, + status: http.StatusBadRequest, + gatewayCreateTransactionErr: transaction.ErrInsufficientBalance, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "balance is not sufficient"), + }, + + { + name: "400 - invalid json", + method: http.MethodPost, + rawBody: "{ca", + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "invalid character 'c' looking for beginning of object key string"), + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &MockGatewayer{} + + // If the rawRequestBody can be deserialized to CreateTransactionRequest, use it to mock gateway.WalletCreateTransaction + serializedBody, err := json.Marshal(tc.body) + require.NoError(t, err) + var body walletCreateTransactionRequest + err = json.Unmarshal(serializedBody, &body) + if err == nil { + x := gateway.On("CreateTransaction", body.TransactionParams(), body.VisorParams()) + x.Return(tc.gatewayCreateTransactionResult, tc.gatewayCreateTransactionInputs, tc.gatewayCreateTransactionErr) + } + + endpoint := "/api/v2/transaction" + + bodyText := []byte(tc.rawBody) + if len(bodyText) == 0 { + bodyText, err = json.Marshal(tc.body) + require.NoError(t, err) + } + + req, err := http.NewRequest(tc.method, endpoint, bytes.NewBuffer(bodyText)) + require.NoError(t, err) + + contentType := tc.contentType + if contentType == "" { + contentType = ContentTypeJSON + } + + req.Header.Add("Content-Type", contentType) + + if tc.csrfDisabled { + setCSRFParameters(t, tokenInvalid, req) + } else { + setCSRFParameters(t, tokenValid, req) + } + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = tc.csrfDisabled + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v` (%v)", status, tc.status, rr.Body) + + var rsp ReceivedHTTPResponse + err = json.Unmarshal(rr.Body.Bytes(), &rsp) + require.NoError(t, err) + + require.Equal(t, tc.httpResponse.Error, rsp.Error) + + if rsp.Data == nil { + require.Nil(t, tc.httpResponse.Data) + } else { + require.NotNil(t, tc.httpResponse.Data) + + var msg CreateTransactionResponse + err := json.Unmarshal(rsp.Data, &msg) + require.NoError(t, err) + + require.Equal(t, tc.httpResponse.Data.(CreateTransactionResponse), msg) + } + }) + } +} + +func TestWalletCreateTransaction(t *testing.T) { + type rawWalletCreateTxnRequest struct { + rawCreateTxnRequest + WalletID string `json:"wallet_id"` + Password string `json:"password"` + Unsigned bool `json:"unsigned"` + } + + changeAddress := testutil.MakeAddress() + destinationAddress := testutil.MakeAddress() + emptyAddress := cipher.Address{} + + txn := &coin.Transaction{ + Length: 100, + Type: 0, + InnerHash: testutil.RandSHA256(t), + In: []cipher.SHA256{testutil.RandSHA256(t)}, + Out: []coin.TransactionOutput{ + { + Address: destinationAddress, + Coins: 1e6, + Hours: 100, + }, + }, + } + + inputs := []visor.TransactionInput{ + { + UxOut: coin.UxOut{ + Head: coin.UxHead{ + Time: uint64(time.Now().UTC().Unix()), + BkSeq: 9999, + }, + Body: coin.UxBody{ + SrcTransaction: testutil.RandSHA256(t), + Address: testutil.MakeAddress(), + Coins: 1e6, + Hours: 100, + }, + }, + CalculatedHours: 200, + }, + } + + createdTxn, err := NewCreatedTransaction(txn, inputs) + require.NoError(t, err) + + createTxnResponse := &CreateTransactionResponse{ + Transaction: *createdTxn, + EncodedTransaction: txn.MustSerializeHex(), + } + + validBody := rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "100", + Hours: "10", + }, + }, + ChangeAddress: changeAddress.String(), + }, + WalletID: "foo.wlt", + } + + walletInput := testutil.RandSHA256(t) + + type testCase struct { + name string + method string + body rawWalletCreateTxnRequest + rawBody string + status int + err string + gatewayCreateTransactionResult *coin.Transaction + gatewayCreateTransactionInputs []visor.TransactionInput + gatewayCreateTransactionErr error + createTransactionResponse *CreateTransactionResponse + csrfDisabled bool + contentType string + } + + baseCases := []testCase{ + { + name: "405", + method: http.MethodGet, + status: http.StatusMethodNotAllowed, + body: rawWalletCreateTxnRequest{}, + err: "405 Method Not Allowed", + }, + + { + name: "415", + method: http.MethodPost, + status: http.StatusUnsupportedMediaType, + body: rawWalletCreateTxnRequest{}, + contentType: ContentTypeForm, + err: "415 Unsupported Media Type", + }, + + { + name: "400 - missing hours selection type", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + WalletID: "foo.wlt", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - missing hours_selection.type", + }, + + { + name: "400 - invalid hours selection type", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: "foo", + }, + }, + WalletID: "foo.wlt", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid hours_selection.type", + }, + + { + name: "400 - missing hours selection mode", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + }, + }, + WalletID: "foo.wlt", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - missing hours_selection.mode", + }, + + { + name: "400 - invalid hours selection mode", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: "foo", + }, + }, + WalletID: "foo.wlt", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid hours_selection.mode", + }, + + { + name: "400 - missing hours selection share factor", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + }, + }, + WalletID: "foo.wlt", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - missing hours_selection.share_factor when hours_selection.mode is share", + }, + + { + name: "400 - share factor set but mode is not share", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + ShareFactor: newStrPtr("0.5"), + }, + }, + WalletID: "foo.wlt", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - hours_selection.share_factor can only be used when hours_selection.mode is share", + }, + + { + name: "400 - negative share factor", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + ShareFactor: newStrPtr("-1"), + }, + }, + WalletID: "foo.wlt", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - hours_selection.share_factor cannot be negative", + }, + + { + name: "400 - share factor greater than 1", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + ShareFactor: newStrPtr("1.1"), + }, + }, + WalletID: "foo.wlt", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - hours_selection.share_factor cannot be more than 1", + }, + + { + name: "400 - empty sender address", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + Addresses: []string{""}, + ChangeAddress: changeAddress.String(), + }, + WalletID: "foo.wlt", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid address: Invalid base58 string", + }, + + { + name: "400 - invalid sender address", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + ChangeAddress: changeAddress.String(), + Addresses: []string{"xxx"}, + }, + WalletID: "foo.wlt", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid address: Invalid address length", + }, + + { + name: "400 - invalid change address", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + ChangeAddress: "xxx", + }, + }, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid address: Invalid address length", + }, + + { + name: "400 - empty change address", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + ChangeAddress: emptyAddress.String(), + }, + WalletID: "foo.wlt", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - change_address must not be the null address", + }, + + { + name: "400 - auto type destination has hours", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + ShareFactor: newStrPtr("0.5"), + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Hours: "100", + Coins: "1.01", + }, + }, + ChangeAddress: changeAddress.String(), + }, + WalletID: "foo.wlt", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - to[0].hours must not be specified for auto hours_selection.mode", + }, + + { + name: "400 - manual type destination missing hours", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.01", + }, + }, + ChangeAddress: changeAddress.String(), + }, + WalletID: "foo.wlt", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - to[0].hours must be specified for manual hours_selection.mode", + }, + + { + name: "400 - manual type has mode set", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + Mode: transaction.HoursSelectionModeShare, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.01", + Hours: "100", + }, + }, + ChangeAddress: changeAddress.String(), + }, + WalletID: "foo.wlt", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - hours_selection.mode cannot be used for manual hours_selection.type", + }, + + { + name: "400 - missing wallet ID", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.01", + Hours: "100", + }, + }, + ChangeAddress: changeAddress.String(), + }, + }, + status: http.StatusBadRequest, + err: "400 Bad Request - missing wallet_id", + }, + + { + name: "400 - address is empty", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.01", + Hours: "100", + }, + }, + ChangeAddress: changeAddress.String(), + Addresses: []string{emptyAddress.String()}, + }, + WalletID: "foo.wlt", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - addresses[0] is empty", + }, + + { + name: "400 - to address is empty", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: emptyAddress.String(), + Coins: "1.01", + Hours: "100", + }, + }, + ChangeAddress: changeAddress.String(), + }, + WalletID: "foo.wlt", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - to[0].address is empty", + }, + + { + name: "400 - to coins is zero", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "0", + Hours: "100", + }, + }, + ChangeAddress: changeAddress.String(), + }, + WalletID: "foo.wlt", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - to[0].coins must not be zero", + }, + + { + name: "400 - invalid to coins", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "0.1a", + Hours: "100", + }, + }, + ChangeAddress: changeAddress.String(), + }, + WalletID: "foo.wlt", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - can't convert 0.1a to decimal", + }, + + { + name: "400 - invalid to hours", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "0.1", + Hours: "100.1", + }, + }, + ChangeAddress: changeAddress.String(), + }, + WalletID: "foo.wlt", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid hours value: strconv.ParseUint: parsing \"100.1\": invalid syntax", + }, + + { + name: "400 - empty string to coins", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + ShareFactor: newStrPtr("0.5"), + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "", + Hours: "", + }, + }, + ChangeAddress: changeAddress.String(), + }, + WalletID: "foo.wlt", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - can't convert to decimal", + }, + + { + name: "400 - coins has too many decimals", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + ShareFactor: newStrPtr("0.5"), + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.1234", + }, + }, + ChangeAddress: changeAddress.String(), + }, + WalletID: "foo.wlt", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - to[0].coins has too many decimal places", + }, + + { + name: "400 - empty to", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + ChangeAddress: changeAddress.String(), + }, + WalletID: "foo.wlt", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - to is empty", + }, + + { + name: "400 - manual duplicate outputs", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + ChangeAddress: changeAddress.String(), + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.2", + Hours: "100", + }, + { + Address: destinationAddress.String(), + Coins: "1.2", + Hours: "100", + }, + }, + }, + WalletID: "foo.wlt", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - to contains duplicate values", + }, + + { + name: "400 - auto duplicate outputs", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + ShareFactor: newStrPtr("0.5"), + }, + ChangeAddress: changeAddress.String(), + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.2", + }, + { + Address: destinationAddress.String(), + Coins: "1.2", + }, + }, + }, + WalletID: "foo.wlt", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - to contains duplicate values", + }, + + { + name: "400 - both uxouts and addresses specified", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + ShareFactor: newStrPtr("0.5"), + }, + ChangeAddress: changeAddress.String(), + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.2", + }, + }, + Addresses: []string{destinationAddress.String()}, + UxOuts: []string{walletInput.Hex()}, + }, + WalletID: "foo.wlt", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - unspents and addresses cannot be combined", + }, + + { + name: "400 - duplicate uxouts", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + ShareFactor: newStrPtr("0.5"), + }, + ChangeAddress: changeAddress.String(), + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.2", + }, + }, + UxOuts: []string{walletInput.Hex(), walletInput.Hex()}, + }, + WalletID: "foo.wlt", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - unspents contains duplicate values", + }, + + { + name: "400 - duplicate addresses", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + ShareFactor: newStrPtr("0.5"), + }, + ChangeAddress: changeAddress.String(), + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.2", + }, + }, + Addresses: []string{destinationAddress.String(), destinationAddress.String()}, + }, + WalletID: "foo.wlt", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - addresses contains duplicate values", + }, + + { + name: "200 - auto type split even", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeAuto, + Mode: transaction.HoursSelectionModeShare, + ShareFactor: newStrPtr("0.5"), + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "100", + }, + }, + ChangeAddress: changeAddress.String(), + }, + WalletID: "foo.wlt", + }, + status: http.StatusOK, + gatewayCreateTransactionResult: txn, + gatewayCreateTransactionInputs: inputs, + createTransactionResponse: createTxnResponse, + }, + + { + name: "200 - manual type zero hours", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "100", + Hours: "0", + }, + }, + ChangeAddress: changeAddress.String(), + }, + WalletID: "foo.wlt", + }, + status: http.StatusOK, + gatewayCreateTransactionResult: txn, + gatewayCreateTransactionInputs: inputs, + createTransactionResponse: createTxnResponse, + }, + + { + name: "200 - manual type nonzero hours", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "100", + Hours: "10", + }, + }, + ChangeAddress: changeAddress.String(), + }, + WalletID: "foo.wlt", + }, + status: http.StatusOK, + gatewayCreateTransactionResult: txn, + gatewayCreateTransactionInputs: inputs, + createTransactionResponse: createTxnResponse, + }, + + { + name: "200 - manual type nonzero hours - csrf disabled", + method: http.MethodPost, + body: validBody, + status: http.StatusOK, + gatewayCreateTransactionResult: txn, + gatewayCreateTransactionInputs: inputs, + createTransactionResponse: createTxnResponse, + csrfDisabled: true, + }, + + { + name: "500 - misc error", + method: http.MethodPost, + body: validBody, + status: http.StatusInternalServerError, + gatewayCreateTransactionErr: errors.New("unhandled error"), + err: "500 Internal Server Error - unhandled error", + }, + + { + name: "400 - no fee", + method: http.MethodPost, + body: validBody, + status: http.StatusBadRequest, + gatewayCreateTransactionErr: fee.ErrTxnNoFee, + err: "400 Bad Request - Transaction has zero coinhour fee", + }, + + { + name: "400 - insufficient coin hours", + method: http.MethodPost, + body: validBody, + status: http.StatusBadRequest, + gatewayCreateTransactionErr: fee.ErrTxnInsufficientCoinHours, + err: "400 Bad Request - Insufficient coinhours for transaction outputs", + }, + + { + name: "400 - uxout doesn't exist", + method: http.MethodPost, + body: validBody, + status: http.StatusBadRequest, + gatewayCreateTransactionErr: blockdb.NewErrUnspentNotExist("foo"), + err: "400 Bad Request - unspent output of foo does not exist", + }, + + { + name: "400 - invalid json", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{}, + rawBody: "{ca", + status: http.StatusBadRequest, + err: "400 Bad Request - invalid character 'c' looking for beginning of object key string", + }, + + { + name: "400 - other wallet error", + method: http.MethodPost, + body: validBody, + status: http.StatusBadRequest, + gatewayCreateTransactionErr: wallet.ErrWalletEncrypted, + err: "400 Bad Request - wallet is encrypted", + }, + + { + name: "404 - wallet not found", + method: http.MethodPost, + body: validBody, + status: http.StatusNotFound, + gatewayCreateTransactionErr: wallet.ErrWalletNotExist, + err: "404 Not Found - wallet doesn't exist", + }, + + { + name: "403 - wallet API disabled", + method: http.MethodPost, + body: validBody, + status: http.StatusForbidden, + gatewayCreateTransactionErr: wallet.ErrWalletAPIDisabled, + err: "403 Forbidden", + }, + } + + cases := make([]testCase, len(baseCases)*2) + copy(cases, baseCases) + copy(cases[len(baseCases):], baseCases) + for i := range baseCases { + cases[i].body.Unsigned = true + } + + cases = append(cases, testCase{ + name: "400 - password provided for unsigned request", + method: http.MethodPost, + body: rawWalletCreateTxnRequest{ + rawCreateTxnRequest: rawCreateTxnRequest{ + HoursSelection: rawHoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.01", + Hours: "100", + }, + }, + ChangeAddress: changeAddress.String(), + }, + WalletID: "foo.wlt", + Password: "foo", + Unsigned: true, + }, + status: http.StatusBadRequest, + err: "400 Bad Request - password must not be used for unsigned transactions", + }) + + for _, tc := range cases { + name := fmt.Sprintf("unsigned=%v %s", tc.body.Unsigned, tc.name) + t.Run(name, func(t *testing.T) { + gateway := &MockGatewayer{} + + // If the rawRequestBody can be deserialized to CreateTransactionRequest, use it to mock gateway.WalletCreateTransaction + serializedBody, err := json.Marshal(tc.body) + require.NoError(t, err) + var body walletCreateTransactionRequest + err = json.Unmarshal(serializedBody, &body) + if err == nil { + if tc.body.Unsigned { + x := gateway.On("WalletCreateTransaction", body.WalletID, body.TransactionParams(), body.VisorParams()) + x.Return(tc.gatewayCreateTransactionResult, tc.gatewayCreateTransactionInputs, tc.gatewayCreateTransactionErr) + } else { + x := gateway.On("WalletCreateTransactionSigned", body.WalletID, []byte(body.Password), body.TransactionParams(), body.VisorParams()) + x.Return(tc.gatewayCreateTransactionResult, tc.gatewayCreateTransactionInputs, tc.gatewayCreateTransactionErr) + + } + } + + endpoint := "/api/v1/wallet/transaction" + + bodyText := []byte(tc.rawBody) + if len(bodyText) == 0 { + bodyText, err = json.Marshal(tc.body) + require.NoError(t, err) + } + + req, err := http.NewRequest(tc.method, endpoint, bytes.NewBuffer(bodyText)) + require.NoError(t, err) + + contentType := tc.contentType + if contentType == "" { + contentType = ContentTypeJSON + } + + req.Header.Add("Content-Type", contentType) + + if tc.csrfDisabled { + setCSRFParameters(t, tokenInvalid, req) + } else { + setCSRFParameters(t, tokenValid, req) + } + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = tc.csrfDisabled + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String())) + } else { + var msg CreateTransactionResponse + err := json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.NotNil(t, tc.createTransactionResponse) + require.Equal(t, *tc.createTransactionResponse, msg) + } + }) + } +} + +func newStrPtr(s string) *string { + return &s +} + +func TestWalletSignTransaction(t *testing.T) { + destinationAddress := testutil.MakeAddress() + + signedTxn := coin.Transaction{ + Length: 100, + Type: 0, + InnerHash: testutil.RandSHA256(t), + Sigs: []cipher.Sig{testutil.RandSig(t), testutil.RandSig(t)}, + In: []cipher.SHA256{testutil.RandSHA256(t), testutil.RandSHA256(t)}, + Out: []coin.TransactionOutput{ + { + Address: destinationAddress, + Coins: 1e6, + Hours: 100, + }, + }, + } + + txn := signedTxn + txn.Sigs = make([]cipher.Sig, len(txn.In)) + + inputs := []visor.TransactionInput{ + { + UxOut: coin.UxOut{ + Head: coin.UxHead{ + Time: uint64(time.Now().UTC().Unix()), + BkSeq: 9999, + }, + Body: coin.UxBody{ + SrcTransaction: testutil.RandSHA256(t), + Address: testutil.MakeAddress(), + Coins: 1e6, + Hours: 100, + }, + }, + CalculatedHours: 200, + }, + { + UxOut: coin.UxOut{ + Head: coin.UxHead{ + Time: uint64(time.Now().UTC().Unix()), + BkSeq: 9999, + }, + Body: coin.UxBody{ + SrcTransaction: testutil.RandSHA256(t), + Address: testutil.MakeAddress(), + Coins: 1e6, + Hours: 100, + }, + }, + CalculatedHours: 200, + }, + } + + signedTxnResp, err := NewCreateTransactionResponse(&signedTxn, inputs) + require.NoError(t, err) + + validBody := &WalletSignTransactionRequest{ + WalletID: "foo.wlt", + EncodedTransaction: txn.MustSerializeHex(), + } + + tt := []struct { + name string + method string + body *WalletSignTransactionRequest + rawBody string + status int + gatewaySignTransactionResult *coin.Transaction + gatewaySignTransactionInputs []visor.TransactionInput + gatewaySignTransactionErr error + csrfDisabled bool + contentType string + httpResponse HTTPResponse + }{ + { + name: "405", + method: http.MethodGet, + status: http.StatusMethodNotAllowed, + httpResponse: NewHTTPErrorResponse(http.StatusMethodNotAllowed, ""), + }, + + { + name: "415", + method: http.MethodPost, + status: http.StatusUnsupportedMediaType, + contentType: ContentTypeForm, + httpResponse: NewHTTPErrorResponse(http.StatusUnsupportedMediaType, ""), + }, + + { + name: "400 wallet ID required", + method: http.MethodPost, + status: http.StatusBadRequest, + body: &WalletSignTransactionRequest{ + EncodedTransaction: validBody.EncodedTransaction, + }, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "wallet_id is required"), + }, + + { + name: "400 encoded_transaction is required", + method: http.MethodPost, + status: http.StatusBadRequest, + body: &WalletSignTransactionRequest{ + WalletID: "foo.wlt", + }, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "encoded_transaction is required"), + }, + + { + name: "400 decode transaction failed", + method: http.MethodPost, + status: http.StatusBadRequest, + body: &WalletSignTransactionRequest{ + WalletID: "foo.wlt", + EncodedTransaction: "abc", + }, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "Decode transaction failed: encoding/hex: odd length hex string"), + }, + + { + name: "400 too many sign indexes", + method: http.MethodPost, + status: http.StatusBadRequest, + body: &WalletSignTransactionRequest{ + WalletID: "foo.wlt", + EncodedTransaction: validBody.EncodedTransaction, + SignIndexes: []int{0, 1, 2}, + }, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "Too many values in sign_indexes"), + }, + + { + name: "400 sign indexes out of range", + method: http.MethodPost, + status: http.StatusBadRequest, + body: &WalletSignTransactionRequest{ + WalletID: "foo.wlt", + EncodedTransaction: validBody.EncodedTransaction, + SignIndexes: []int{5}, + }, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "Value in sign_indexes exceeds range of transaction inputs array"), + }, + + { + name: "400 duplicate sign indexes", + method: http.MethodPost, + status: http.StatusBadRequest, + body: &WalletSignTransactionRequest{ + WalletID: "foo.wlt", + EncodedTransaction: validBody.EncodedTransaction, + SignIndexes: []int{1, 1}, + }, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "Duplicate value in sign_indexes"), + }, + + { + name: "500 - misc error", + method: http.MethodPost, + body: validBody, + status: http.StatusInternalServerError, + gatewaySignTransactionErr: errors.New("unhandled error"), + httpResponse: NewHTTPErrorResponse(http.StatusInternalServerError, "unhandled error"), + }, + + { + name: "400 - wallet not encrypted", + method: http.MethodPost, + body: validBody, + status: http.StatusBadRequest, + gatewaySignTransactionErr: wallet.ErrWalletNotEncrypted, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "wallet is not encrypted"), + }, + + { + name: "400 - wallet encrypted", + method: http.MethodPost, + body: validBody, + status: http.StatusBadRequest, + gatewaySignTransactionErr: wallet.ErrWalletEncrypted, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "wallet is encrypted"), + }, + + { + name: "400 - violates hard constraint", + method: http.MethodPost, + body: validBody, + status: http.StatusBadRequest, + gatewaySignTransactionErr: visor.NewErrTxnViolatesHardConstraint(errors.New("bad txn")), + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "Transaction violates hard constraint: bad txn"), + }, + + { + name: "400 - unspents do not exist", + method: http.MethodPost, + body: validBody, + status: http.StatusBadRequest, + gatewaySignTransactionErr: blockdb.NewErrUnspentNotExist("foo"), + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "unspent output of foo does not exist"), + }, + + { + name: "400 - invalid json", + method: http.MethodPost, + rawBody: "{ca", + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "invalid character 'c' looking for beginning of object key string"), + }, + + { + name: "404 - wallet not found", + method: http.MethodPost, + body: validBody, + status: http.StatusNotFound, + gatewaySignTransactionErr: wallet.ErrWalletNotExist, + httpResponse: NewHTTPErrorResponse(http.StatusNotFound, "wallet doesn't exist"), + }, + + { + name: "403 - wallet API disabled", + method: http.MethodPost, + body: validBody, + status: http.StatusForbidden, + gatewaySignTransactionErr: wallet.ErrWalletAPIDisabled, + httpResponse: NewHTTPErrorResponse(http.StatusForbidden, "wallet api is disabled"), + }, + + { + name: "200 - no password", + method: http.MethodPost, + body: validBody, + status: http.StatusOK, + gatewaySignTransactionResult: &signedTxn, + gatewaySignTransactionInputs: inputs, + httpResponse: HTTPResponse{ + Data: *signedTxnResp, + }, + }, + + { + name: "200 - no password csrf disabled", + method: http.MethodPost, + body: validBody, + status: http.StatusOK, + gatewaySignTransactionResult: &signedTxn, + gatewaySignTransactionInputs: inputs, + httpResponse: HTTPResponse{ + Data: *signedTxnResp, + }, + csrfDisabled: true, + }, + + { + name: "200 - password", + method: http.MethodPost, + body: &WalletSignTransactionRequest{ + WalletID: "foo.wlt", + Password: "foo", + EncodedTransaction: validBody.EncodedTransaction, + }, + status: http.StatusOK, + gatewaySignTransactionResult: &signedTxn, + gatewaySignTransactionInputs: inputs, + httpResponse: HTTPResponse{ + Data: *signedTxnResp, + }, + }, + + { + name: "200 - sign indexes", + method: http.MethodPost, + body: &WalletSignTransactionRequest{ + WalletID: "foo.wlt", + SignIndexes: []int{1}, + EncodedTransaction: validBody.EncodedTransaction, + }, + status: http.StatusOK, + gatewaySignTransactionResult: &signedTxn, + gatewaySignTransactionInputs: inputs, + httpResponse: HTTPResponse{ + Data: *signedTxnResp, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &MockGatewayer{} + + var txn *coin.Transaction + if tc.body != nil { + // Decode the transaction used in the request body, but ignore an error in case the + // transaction is intentionally malformed + txnx, err := coin.DeserializeTransactionHex(tc.body.EncodedTransaction) + if err == nil { + txn = &txnx + } + } + + if tc.body != nil { + gateway.On("WalletSignTransaction", tc.body.WalletID, []byte(tc.body.Password), txn, tc.body.SignIndexes).Return(tc.gatewaySignTransactionResult, tc.gatewaySignTransactionInputs, tc.gatewaySignTransactionErr) + } + + endpoint := "/api/v2/wallet/transaction/sign" + + bodyText := []byte(tc.rawBody) + if len(bodyText) == 0 { + var err error + bodyText, err = json.Marshal(tc.body) + require.NoError(t, err) + } + + req, err := http.NewRequest(tc.method, endpoint, bytes.NewBuffer(bodyText)) + require.NoError(t, err) + + contentType := tc.contentType + if contentType == "" { + contentType = ContentTypeJSON + } + + req.Header.Add("Content-Type", contentType) + + if tc.csrfDisabled { + setCSRFParameters(t, tokenInvalid, req) + } else { + setCSRFParameters(t, tokenValid, req) + } + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = tc.csrfDisabled + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + var rsp ReceivedHTTPResponse + err = json.Unmarshal(rr.Body.Bytes(), &rsp) + require.NoError(t, err) + + require.Equal(t, tc.httpResponse.Error, rsp.Error) + + if rsp.Data == nil { + require.Nil(t, tc.httpResponse.Data) + } else { + require.NotNil(t, tc.httpResponse.Data) + + var cRsp CreateTransactionResponse + err := json.Unmarshal(rsp.Data, &cRsp) + require.NoError(t, err) + + require.Equal(t, tc.httpResponse.Data.(CreateTransactionResponse), cRsp) + } + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/storage.go b/vendor/github.com/SkycoinProject/skycoin/src/api/storage.go new file mode 100644 index 00000000..9ddf189a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/storage.go @@ -0,0 +1,190 @@ +package api + +import ( + "encoding/json" + "net/http" + + "github.com/SkycoinProject/skycoin/src/kvstorage" +) + +// Dispatches /data endpoint. +// Method: GET, POST, DELETE +// URI: /api/v2/data +func storageHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + switch r.Method { + case http.MethodGet: + getStorageValuesHandler(w, r, gateway) + case http.MethodPost: + addStorageValueHandler(w, r, gateway) + case http.MethodDelete: + removeStorageValueHandler(w, r, gateway) + default: + resp := NewHTTPErrorResponse(http.StatusMethodNotAllowed, "") + writeHTTPResponse(w, resp) + } + } +} + +// serves GET requests for /data enpdoint +func getStorageValuesHandler(w http.ResponseWriter, r *http.Request, gateway Gatewayer) { + storageType := r.FormValue("type") + if storageType == "" { + resp := NewHTTPErrorResponse(http.StatusBadRequest, "type is required") + writeHTTPResponse(w, resp) + return + } + + key := r.FormValue("key") + + if key == "" { + getAllStorageValuesHandler(w, gateway, kvstorage.Type(storageType)) + } else { + getStorageValueHandler(w, gateway, kvstorage.Type(storageType), key) + } +} + +// Returns all existing storage values of a given storage type. +// Args: +// type: storage type to get values from +func getAllStorageValuesHandler(w http.ResponseWriter, gateway Gatewayer, storageType kvstorage.Type) { + data, err := gateway.GetAllStorageValues(kvstorage.Type(storageType)) + if err != nil { + var resp HTTPResponse + switch err { + case kvstorage.ErrStorageAPIDisabled: + resp = NewHTTPErrorResponse(http.StatusForbidden, "") + case kvstorage.ErrNoSuchStorage: + resp = NewHTTPErrorResponse(http.StatusNotFound, "storage is not loaded") + case kvstorage.ErrUnknownKVStorageType: + resp = NewHTTPErrorResponse(http.StatusBadRequest, "unknown storage") + default: + resp = NewHTTPErrorResponse(http.StatusInternalServerError, err.Error()) + } + writeHTTPResponse(w, resp) + return + } + + writeHTTPResponse(w, HTTPResponse{ + Data: data, + }) +} + +// Returns value from storage of a given type by key. +// Args: +// key: key for a value to be retrieved +func getStorageValueHandler(w http.ResponseWriter, gateway Gatewayer, storageType kvstorage.Type, key string) { + val, err := gateway.GetStorageValue(storageType, key) + if err != nil { + var resp HTTPResponse + switch err { + case kvstorage.ErrStorageAPIDisabled: + resp = NewHTTPErrorResponse(http.StatusForbidden, "") + case kvstorage.ErrNoSuchStorage: + resp = NewHTTPErrorResponse(http.StatusNotFound, "storage is not loaded") + case kvstorage.ErrUnknownKVStorageType: + resp = NewHTTPErrorResponse(http.StatusBadRequest, "unknown storage") + case kvstorage.ErrNoSuchKey: + resp = NewHTTPErrorResponse(http.StatusNotFound, "") + default: + resp = NewHTTPErrorResponse(http.StatusInternalServerError, err.Error()) + } + writeHTTPResponse(w, resp) + return + } + + writeHTTPResponse(w, HTTPResponse{ + Data: val, + }) +} + +// StorageRequest is the request data for POST /api/v2/data +type StorageRequest struct { + StorageType kvstorage.Type `json:"type"` + Key string `json:"key"` + Val string `json:"val"` +} + +// Adds the value to the storage of a given type +// Args: +// type: storage type +// key: key +// val: value +func addStorageValueHandler(w http.ResponseWriter, r *http.Request, gateway Gatewayer) { + var req StorageRequest + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + resp := NewHTTPErrorResponse(http.StatusBadRequest, err.Error()) + writeHTTPResponse(w, resp) + return + } + + if req.StorageType == "" { + resp := NewHTTPErrorResponse(http.StatusBadRequest, "type is required") + writeHTTPResponse(w, resp) + return + } + + if req.Key == "" { + resp := NewHTTPErrorResponse(http.StatusBadRequest, "key is required") + writeHTTPResponse(w, resp) + return + } + + if err := gateway.AddStorageValue(req.StorageType, req.Key, req.Val); err != nil { + var resp HTTPResponse + switch err { + case kvstorage.ErrStorageAPIDisabled: + resp = NewHTTPErrorResponse(http.StatusForbidden, "") + case kvstorage.ErrNoSuchStorage: + resp = NewHTTPErrorResponse(http.StatusNotFound, "storage is not loaded") + case kvstorage.ErrUnknownKVStorageType: + resp = NewHTTPErrorResponse(http.StatusBadRequest, "unknown storage") + default: + resp = NewHTTPErrorResponse(http.StatusInternalServerError, err.Error()) + } + writeHTTPResponse(w, resp) + return + } + + writeHTTPResponse(w, HTTPResponse{}) +} + +// Removes the value by key from the storage of a given type +// Args: +// type: storage type +// key: key +func removeStorageValueHandler(w http.ResponseWriter, r *http.Request, gateway Gatewayer) { + storageType := r.FormValue("type") + if storageType == "" { + resp := NewHTTPErrorResponse(http.StatusBadRequest, "type is required") + writeHTTPResponse(w, resp) + return + } + + key := r.FormValue("key") + if key == "" { + resp := NewHTTPErrorResponse(http.StatusBadRequest, "key is required") + writeHTTPResponse(w, resp) + return + } + + if err := gateway.RemoveStorageValue(kvstorage.Type(storageType), key); err != nil { + var resp HTTPResponse + switch err { + case kvstorage.ErrStorageAPIDisabled: + resp = NewHTTPErrorResponse(http.StatusForbidden, "") + case kvstorage.ErrNoSuchStorage: + resp = NewHTTPErrorResponse(http.StatusNotFound, "storage is not loaded") + case kvstorage.ErrUnknownKVStorageType: + resp = NewHTTPErrorResponse(http.StatusBadRequest, "unknown storage") + case kvstorage.ErrNoSuchKey: + resp = NewHTTPErrorResponse(http.StatusNotFound, "") + default: + resp = NewHTTPErrorResponse(http.StatusInternalServerError, err.Error()) + } + writeHTTPResponse(w, resp) + return + } + + writeHTTPResponse(w, HTTPResponse{}) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/storage_test.go b/vendor/github.com/SkycoinProject/skycoin/src/api/storage_test.go new file mode 100644 index 00000000..b5ea910e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/storage_test.go @@ -0,0 +1,773 @@ +package api + +import ( + "encoding/json" + "net/http" + "net/http/httptest" + "net/url" + "strings" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/kvstorage" +) + +func TestGetAllStorageValuesHandler(t *testing.T) { + tt := []struct { + name string + method string + contentType string + query string + status int + storageType kvstorage.Type + getAllStorageValuesResult map[string]string + getAllStorageValuesErr error + httpResponse HTTPResponse + csrfDisabled bool + }{ + { + name: "405", + method: http.MethodPut, + contentType: ContentTypeForm, + query: url.Values{ + "type": []string{string(kvstorage.TypeTxIDNotes)}, + }.Encode(), + status: http.StatusMethodNotAllowed, + storageType: kvstorage.TypeTxIDNotes, + getAllStorageValuesResult: make(map[string]string), + getAllStorageValuesErr: nil, + httpResponse: NewHTTPErrorResponse(http.StatusMethodNotAllowed, ""), + }, + { + name: "403", + method: http.MethodGet, + contentType: ContentTypeForm, + query: url.Values{ + "type": []string{string(kvstorage.TypeTxIDNotes)}, + }.Encode(), + status: http.StatusForbidden, + storageType: kvstorage.TypeTxIDNotes, + getAllStorageValuesResult: nil, + getAllStorageValuesErr: kvstorage.ErrStorageAPIDisabled, + httpResponse: NewHTTPErrorResponse(http.StatusForbidden, ""), + }, + { + name: "400 - missing type", + method: http.MethodGet, + contentType: ContentTypeForm, + status: http.StatusBadRequest, + storageType: "", + getAllStorageValuesResult: nil, + getAllStorageValuesErr: kvstorage.ErrUnknownKVStorageType, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "type is required"), + }, + { + name: "400 - unknown type", + method: http.MethodGet, + contentType: ContentTypeForm, + query: url.Values{ + "type": []string{"unknown"}, + }.Encode(), + status: http.StatusBadRequest, + storageType: "unknown", + getAllStorageValuesResult: nil, + getAllStorageValuesErr: kvstorage.ErrUnknownKVStorageType, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "unknown storage"), + }, + { + name: "404 - storage not loaded", + method: http.MethodGet, + contentType: ContentTypeForm, + query: url.Values{ + "type": []string{string(kvstorage.TypeTxIDNotes)}, + }.Encode(), + status: http.StatusNotFound, + storageType: kvstorage.TypeTxIDNotes, + getAllStorageValuesResult: nil, + getAllStorageValuesErr: kvstorage.ErrNoSuchStorage, + httpResponse: NewHTTPErrorResponse(http.StatusNotFound, "storage is not loaded"), + }, + { + name: "200", + method: http.MethodGet, + contentType: ContentTypeForm, + query: url.Values{ + "type": []string{string(kvstorage.TypeTxIDNotes)}, + }.Encode(), + status: http.StatusOK, + storageType: kvstorage.TypeTxIDNotes, + getAllStorageValuesResult: map[string]string{ + "test1": "some value", + "test2": "{\"key\":\"val\",\"key2\":2}", + }, + getAllStorageValuesErr: nil, + httpResponse: HTTPResponse{ + Data: map[string]string{ + "test1": "some value", + "test2": "{\"key\":\"val\",\"key2\":2}", + }, + }, + }, + { + name: "200 - csrf disabled", + method: http.MethodGet, + contentType: ContentTypeForm, + query: url.Values{ + "type": []string{string(kvstorage.TypeTxIDNotes)}, + }.Encode(), + status: http.StatusOK, + storageType: kvstorage.TypeTxIDNotes, + getAllStorageValuesResult: map[string]string{ + "test1": "some value", + "test2": "{\"key\":\"val\",\"key2\":2}", + }, + getAllStorageValuesErr: nil, + httpResponse: HTTPResponse{ + Data: map[string]string{ + "test1": "some value", + "test2": "{\"key\":\"val\",\"key2\":2}", + }, + }, + csrfDisabled: true, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &MockGatewayer{} + gateway.On("GetAllStorageValues", tc.storageType).Return(tc.getAllStorageValuesResult, + tc.getAllStorageValuesErr) + + endpoint := "/api/v2/data" + + if tc.query != "" { + endpoint += "?" + tc.query + } + + req, err := http.NewRequest(tc.method, endpoint, strings.NewReader("")) + require.NoError(t, err) + + req.Header.Set("Content-Type", tc.contentType) + + if tc.csrfDisabled { + setCSRFParameters(t, tokenInvalid, req) + } else { + setCSRFParameters(t, tokenValid, req) + } + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = false + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + var rsp ReceivedHTTPResponse + err = json.Unmarshal(rr.Body.Bytes(), &rsp) + require.NoError(t, err) + + require.Equal(t, tc.httpResponse.Error, rsp.Error) + + if rsp.Data == nil { + require.Nil(t, tc.httpResponse.Data) + } else { + require.NotNil(t, tc.httpResponse.Data) + + var getAllStorageValuesRsp map[string]string + err := json.Unmarshal(rsp.Data, &getAllStorageValuesRsp) + require.NoError(t, err) + + require.Equal(t, tc.httpResponse.Data, getAllStorageValuesRsp) + } + }) + } +} + +func TestGetStorageValueHandler(t *testing.T) { + tt := []struct { + name string + method string + contentType string + query string + status int + storageType kvstorage.Type + key string + getStorageValueResult string + getStorageValueErr error + httpResponse HTTPResponse + csrfDisabled bool + }{ + { + name: "405", + method: http.MethodPut, + contentType: ContentTypeForm, + query: url.Values{ + "type": []string{string(kvstorage.TypeTxIDNotes)}, + "key": []string{"test1"}, + }.Encode(), + status: http.StatusMethodNotAllowed, + storageType: kvstorage.TypeTxIDNotes, + key: "test1", + getStorageValueResult: "some value", + getStorageValueErr: nil, + httpResponse: NewHTTPErrorResponse(http.StatusMethodNotAllowed, ""), + }, + { + name: "403", + method: http.MethodGet, + contentType: ContentTypeForm, + query: url.Values{ + "type": []string{string(kvstorage.TypeTxIDNotes)}, + "key": []string{"test1"}, + }.Encode(), + status: http.StatusForbidden, + storageType: kvstorage.TypeTxIDNotes, + key: "test1", + getStorageValueResult: "", + getStorageValueErr: kvstorage.ErrStorageAPIDisabled, + httpResponse: NewHTTPErrorResponse(http.StatusForbidden, ""), + }, + { + name: "400 - missing type", + method: http.MethodGet, + contentType: ContentTypeForm, + query: url.Values{ + "key": []string{"test1"}, + }.Encode(), + status: http.StatusBadRequest, + storageType: "", + key: "test1", + getStorageValueResult: "", + getStorageValueErr: kvstorage.ErrUnknownKVStorageType, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "type is required"), + }, + { + name: "400 - unknown type", + method: http.MethodGet, + contentType: ContentTypeForm, + query: url.Values{ + "type": []string{"unknown"}, + "key": []string{"test1"}, + }.Encode(), + status: http.StatusBadRequest, + storageType: "unknown", + key: "test1", + getStorageValueResult: "", + getStorageValueErr: kvstorage.ErrUnknownKVStorageType, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "unknown storage"), + }, + { + name: "404 - storage not loaded", + method: http.MethodGet, + contentType: ContentTypeForm, + query: url.Values{ + "type": []string{string(kvstorage.TypeTxIDNotes)}, + "key": []string{"test1"}, + }.Encode(), + status: http.StatusNotFound, + storageType: kvstorage.TypeTxIDNotes, + key: "test1", + getStorageValueResult: "", + getStorageValueErr: kvstorage.ErrNoSuchStorage, + httpResponse: NewHTTPErrorResponse(http.StatusNotFound, "storage is not loaded"), + }, + { + name: "400 - not found", + method: http.MethodGet, + contentType: ContentTypeForm, + query: url.Values{ + "type": []string{string(kvstorage.TypeTxIDNotes)}, + "key": []string{"test1"}, + }.Encode(), + status: http.StatusNotFound, + storageType: kvstorage.TypeTxIDNotes, + key: "test1", + getStorageValueResult: "", + getStorageValueErr: kvstorage.ErrNoSuchKey, + httpResponse: NewHTTPErrorResponse(http.StatusNotFound, ""), + }, + { + name: "200", + method: http.MethodGet, + contentType: ContentTypeForm, + query: url.Values{ + "type": []string{string(kvstorage.TypeTxIDNotes)}, + "key": []string{"test1"}, + }.Encode(), + status: http.StatusOK, + storageType: kvstorage.TypeTxIDNotes, + key: "test1", + getStorageValueResult: "some value", + getStorageValueErr: nil, + httpResponse: HTTPResponse{ + Data: "some value", + }, + }, + { + name: "200 - csrf disabled", + method: http.MethodGet, + contentType: ContentTypeForm, + query: url.Values{ + "type": []string{string(kvstorage.TypeTxIDNotes)}, + "key": []string{"test1"}, + }.Encode(), + status: http.StatusOK, + storageType: kvstorage.TypeTxIDNotes, + key: "test1", + getStorageValueResult: "some value", + getStorageValueErr: nil, + httpResponse: HTTPResponse{ + Data: "some value", + }, + csrfDisabled: true, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &MockGatewayer{} + gateway.On("GetStorageValue", tc.storageType, tc.key).Return(tc.getStorageValueResult, + tc.getStorageValueErr) + + endpoint := "/api/v2/data" + + if tc.query != "" { + endpoint += "?" + tc.query + } + + req, err := http.NewRequest(tc.method, endpoint, strings.NewReader("")) + require.NoError(t, err) + + req.Header.Set("Content-Type", tc.contentType) + + if tc.csrfDisabled { + setCSRFParameters(t, tokenInvalid, req) + } else { + setCSRFParameters(t, tokenValid, req) + } + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = false + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + var rsp ReceivedHTTPResponse + err = json.Unmarshal(rr.Body.Bytes(), &rsp) + require.NoError(t, err) + + require.Equal(t, tc.httpResponse.Error, rsp.Error) + + if rsp.Data == nil { + require.Nil(t, tc.httpResponse.Data) + } else { + require.NotNil(t, tc.httpResponse.Data) + + var getStorageValueRsp string + err := json.Unmarshal(rsp.Data, &getStorageValueRsp) + require.NoError(t, err) + + require.Equal(t, tc.httpResponse.Data, getStorageValueRsp) + } + }) + } +} + +func TestAddStorageValueHandler(t *testing.T) { + tt := []struct { + name string + method string + contentType string + httpBody string + status int + storageType kvstorage.Type + key string + val string + addStorageValueErr error + httpResponse HTTPResponse + csrfDisabled bool + }{ + { + name: "405", + method: http.MethodPut, + contentType: ContentTypeJSON, + httpBody: toJSON(t, StorageRequest{ + StorageType: kvstorage.TypeTxIDNotes, + Key: "test", + Val: "qwe", + }), + status: http.StatusMethodNotAllowed, + storageType: kvstorage.TypeTxIDNotes, + key: "test", + val: "qwe", + addStorageValueErr: nil, + httpResponse: NewHTTPErrorResponse(http.StatusMethodNotAllowed, ""), + }, + { + name: "403", + method: http.MethodPost, + contentType: ContentTypeJSON, + httpBody: toJSON(t, StorageRequest{ + StorageType: kvstorage.TypeTxIDNotes, + Key: "test", + Val: "qwe", + }), + status: http.StatusForbidden, + storageType: kvstorage.TypeTxIDNotes, + key: "test", + val: "qwe", + addStorageValueErr: kvstorage.ErrStorageAPIDisabled, + httpResponse: NewHTTPErrorResponse(http.StatusForbidden, ""), + }, + { + name: "415", + method: http.MethodPost, + contentType: ContentTypeForm, + httpBody: toJSON(t, StorageRequest{ + StorageType: kvstorage.TypeTxIDNotes, + Key: "test", + Val: "qwe", + }), + status: http.StatusUnsupportedMediaType, + storageType: kvstorage.TypeTxIDNotes, + key: "test", + val: "qwe", + addStorageValueErr: nil, + httpResponse: NewHTTPErrorResponse(http.StatusUnsupportedMediaType, ""), + }, + { + name: "400 - EOF", + method: http.MethodPost, + contentType: ContentTypeJSON, + httpBody: "", + status: http.StatusBadRequest, + storageType: "", + key: "", + val: "", + addStorageValueErr: kvstorage.ErrUnknownKVStorageType, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "EOF"), + }, + { + name: "400 - missing type", + method: http.MethodPost, + contentType: ContentTypeJSON, + httpBody: toJSON(t, StorageRequest{ + Key: "test", + Val: "qwe", + }), + status: http.StatusBadRequest, + storageType: "", + key: "test", + val: "qwe", + addStorageValueErr: kvstorage.ErrUnknownKVStorageType, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "type is required"), + }, + { + name: "400 - unknown type", + method: http.MethodPost, + contentType: ContentTypeJSON, + httpBody: toJSON(t, StorageRequest{ + StorageType: "unknown", + Key: "test", + Val: "qwe", + }), + status: http.StatusBadRequest, + storageType: "unknown", + key: "test", + val: "qwe", + addStorageValueErr: kvstorage.ErrUnknownKVStorageType, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "unknown storage"), + }, + { + name: "404 - storage not loaded", + method: http.MethodPost, + contentType: ContentTypeJSON, + httpBody: toJSON(t, StorageRequest{ + StorageType: kvstorage.TypeTxIDNotes, + Key: "test", + Val: "qwe", + }), + status: http.StatusNotFound, + storageType: kvstorage.TypeTxIDNotes, + key: "test", + val: "qwe", + addStorageValueErr: kvstorage.ErrNoSuchStorage, + httpResponse: NewHTTPErrorResponse(http.StatusNotFound, "storage is not loaded"), + }, + { + name: "400 - missing key", + method: http.MethodPost, + contentType: ContentTypeJSON, + httpBody: toJSON(t, StorageRequest{ + StorageType: kvstorage.TypeTxIDNotes, + Val: "qwe", + }), + status: http.StatusBadRequest, + storageType: kvstorage.TypeTxIDNotes, + val: "qwe", + addStorageValueErr: nil, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "key is required"), + }, + { + name: "200", + method: http.MethodPost, + contentType: ContentTypeJSON, + httpBody: toJSON(t, StorageRequest{ + StorageType: kvstorage.TypeTxIDNotes, + Key: "test", + Val: "qwe", + }), + status: http.StatusOK, + storageType: kvstorage.TypeTxIDNotes, + key: "test", + val: "qwe", + addStorageValueErr: nil, + httpResponse: HTTPResponse{}, + }, + { + name: "403 - csrf disabled", + method: http.MethodPost, + contentType: ContentTypeJSON, + httpBody: toJSON(t, StorageRequest{ + StorageType: kvstorage.TypeTxIDNotes, + Key: "test", + Val: "qwe", + }), + status: http.StatusForbidden, + storageType: kvstorage.TypeTxIDNotes, + key: "test", + val: "qwe", + addStorageValueErr: nil, + httpResponse: NewHTTPErrorResponse(http.StatusForbidden, "invalid CSRF token"), + csrfDisabled: true, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &MockGatewayer{} + gateway.On("AddStorageValue", tc.storageType, tc.key, tc.val).Return(tc.addStorageValueErr) + + endpoint := "/api/v2/data" + + req, err := http.NewRequest(tc.method, endpoint, strings.NewReader(tc.httpBody)) + require.NoError(t, err) + + req.Header.Set("Content-Type", tc.contentType) + + if tc.csrfDisabled { + setCSRFParameters(t, tokenInvalid, req) + } else { + setCSRFParameters(t, tokenValid, req) + } + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = false + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + var rsp ReceivedHTTPResponse + err = json.Unmarshal(rr.Body.Bytes(), &rsp) + require.NoError(t, err) + + require.Equal(t, tc.httpResponse.Error, rsp.Error) + + if rsp.Data == nil { + require.Nil(t, tc.httpResponse.Data) + } else { + require.NotNil(t, tc.httpResponse.Data) + } + }) + } +} + +func TestRemoveStorageValueHandler(t *testing.T) { + tt := []struct { + name string + method string + query string + status int + storageType kvstorage.Type + key string + removeStorageValueErr error + httpResponse HTTPResponse + csrfDisabled bool + }{ + { + name: "405", + method: http.MethodPut, + query: url.Values{ + "type": []string{string(kvstorage.TypeTxIDNotes)}, + "key": []string{"test"}, + }.Encode(), + status: http.StatusMethodNotAllowed, + storageType: kvstorage.TypeTxIDNotes, + key: "test", + removeStorageValueErr: nil, + httpResponse: NewHTTPErrorResponse(http.StatusMethodNotAllowed, ""), + }, + { + name: "403", + method: http.MethodDelete, + query: url.Values{ + "type": []string{string(kvstorage.TypeTxIDNotes)}, + "key": []string{"test"}, + }.Encode(), + status: http.StatusForbidden, + storageType: kvstorage.TypeTxIDNotes, + key: "test", + removeStorageValueErr: kvstorage.ErrStorageAPIDisabled, + httpResponse: NewHTTPErrorResponse(http.StatusForbidden, ""), + }, + { + name: "400 - missing type", + method: http.MethodDelete, + query: url.Values{ + "key": []string{"test"}, + }.Encode(), + status: http.StatusBadRequest, + storageType: kvstorage.TypeTxIDNotes, + key: "test", + removeStorageValueErr: kvstorage.ErrUnknownKVStorageType, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "type is required"), + }, + { + name: "400 - unknown type", + method: http.MethodDelete, + query: url.Values{ + "type": []string{"unknown"}, + "key": []string{"test"}, + }.Encode(), + status: http.StatusBadRequest, + storageType: "unknown", + key: "test", + removeStorageValueErr: kvstorage.ErrUnknownKVStorageType, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "unknown storage"), + }, + { + name: "404 - storage not loaded", + method: http.MethodDelete, + query: url.Values{ + "type": []string{string(kvstorage.TypeTxIDNotes)}, + "key": []string{"test"}, + }.Encode(), + status: http.StatusNotFound, + storageType: kvstorage.TypeTxIDNotes, + key: "test", + removeStorageValueErr: kvstorage.ErrNoSuchStorage, + httpResponse: NewHTTPErrorResponse(http.StatusNotFound, "storage is not loaded"), + }, + { + name: "400 - missing key", + method: http.MethodDelete, + query: url.Values{ + "type": []string{string(kvstorage.TypeTxIDNotes)}, + }.Encode(), + status: http.StatusBadRequest, + storageType: kvstorage.TypeTxIDNotes, + removeStorageValueErr: nil, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "key is required"), + }, + { + name: "404 - not found", + method: http.MethodDelete, + query: url.Values{ + "type": []string{string(kvstorage.TypeTxIDNotes)}, + "key": []string{"test"}, + }.Encode(), + status: http.StatusNotFound, + storageType: kvstorage.TypeTxIDNotes, + key: "test", + removeStorageValueErr: kvstorage.ErrNoSuchKey, + httpResponse: NewHTTPErrorResponse(http.StatusNotFound, ""), + }, + { + name: "200", + method: http.MethodDelete, + query: url.Values{ + "type": []string{string(kvstorage.TypeTxIDNotes)}, + "key": []string{"test"}, + }.Encode(), + status: http.StatusOK, + storageType: kvstorage.TypeTxIDNotes, + key: "test", + removeStorageValueErr: nil, + httpResponse: HTTPResponse{}, + }, + { + name: "403 - csrf disabled", + method: http.MethodDelete, + query: url.Values{ + "type": []string{string(kvstorage.TypeTxIDNotes)}, + "key": []string{"test"}, + }.Encode(), + status: http.StatusForbidden, + storageType: kvstorage.TypeTxIDNotes, + key: "test", + removeStorageValueErr: nil, + httpResponse: NewHTTPErrorResponse(http.StatusForbidden, "invalid CSRF token"), + csrfDisabled: true, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &MockGatewayer{} + gateway.On("RemoveStorageValue", tc.storageType, tc.key).Return(tc.removeStorageValueErr) + + endpoint := "/api/v2/data" + + if tc.query != "" { + endpoint += "?" + tc.query + } + + req, err := http.NewRequest(tc.method, endpoint, strings.NewReader("")) + require.NoError(t, err) + + if tc.csrfDisabled { + setCSRFParameters(t, tokenInvalid, req) + } else { + setCSRFParameters(t, tokenValid, req) + } + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = false + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + var rsp ReceivedHTTPResponse + err = json.Unmarshal(rr.Body.Bytes(), &rsp) + require.NoError(t, err) + + require.Equal(t, tc.httpResponse.Error, rsp.Error) + + if rsp.Data == nil { + require.Nil(t, tc.httpResponse.Data) + } else { + require.NotNil(t, tc.httpResponse.Data) + } + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/transaction.go b/vendor/github.com/SkycoinProject/skycoin/src/api/transaction.go new file mode 100644 index 00000000..f32ebd77 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/transaction.go @@ -0,0 +1,685 @@ +package api + +import ( + "encoding/hex" + "encoding/json" + "errors" + "fmt" + "net/http" + "sort" + "strconv" + "strings" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/daemon" + "github.com/SkycoinProject/skycoin/src/readable" + wh "github.com/SkycoinProject/skycoin/src/util/http" + "github.com/SkycoinProject/skycoin/src/util/mathutil" + "github.com/SkycoinProject/skycoin/src/visor" +) + +// pendingTxnsHandler returns pending (unconfirmed) transactions +// Method: GET +// URI: /api/v1/pendingTxs +// Args: +// verbose: [bool] include verbose transaction input data +func pendingTxnsHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + verbose, err := parseBoolFlag(r.FormValue("verbose")) + if err != nil { + wh.Error400(w, "Invalid value for verbose") + return + } + + if verbose { + txns, inputs, err := gateway.GetAllUnconfirmedTransactionsVerbose() + if err != nil { + wh.Error500(w, err.Error()) + return + } + + vb, err := readable.NewUnconfirmedTransactionsVerbose(txns, inputs) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, vb) + } else { + txns, err := gateway.GetAllUnconfirmedTransactions() + if err != nil { + wh.Error500(w, err.Error()) + return + } + + ret, err := readable.NewUnconfirmedTransactions(txns) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, ret) + } + } +} + +// TransactionEncodedResponse represents the data struct of the response to /api/v1/transaction?encoded=1 +type TransactionEncodedResponse struct { + Status readable.TransactionStatus `json:"status"` + Time uint64 `json:"time"` + EncodedTransaction string `json:"encoded_transaction"` +} + +// transactionHandler returns a transaction identified by its txid hash +// Method: GET +// URI: /api/v1/transaction +// Args: +// txid: transaction hash +// verbose: [bool] include verbose transaction input data +// encoded: [bool] return as a raw encoded transaction +func transactionHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + txid := r.FormValue("txid") + if txid == "" { + wh.Error400(w, "txid is empty") + return + } + + verbose, err := parseBoolFlag(r.FormValue("verbose")) + if err != nil { + wh.Error400(w, "Invalid value for verbose") + return + } + + encoded, err := parseBoolFlag(r.FormValue("encoded")) + if err != nil { + wh.Error400(w, "Invalid value for encoded") + return + } + + if verbose && encoded { + wh.Error400(w, "verbose and encoded cannot be combined") + return + } + + h, err := cipher.SHA256FromHex(txid) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + if verbose { + txn, inputs, err := gateway.GetTransactionWithInputs(h) + if err != nil { + wh.Error500(w, err.Error()) + return + } + if txn == nil { + wh.Error404(w, "") + return + } + + rTxn, err := readable.NewTransactionWithStatusVerbose(txn, inputs) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, rTxn) + return + } + + txn, err := gateway.GetTransaction(h) + if err != nil { + wh.Error500(w, err.Error()) + return + } + if txn == nil { + wh.Error404(w, "") + return + } + + if encoded { + txnHex, err := txn.Transaction.SerializeHex() + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, TransactionEncodedResponse{ + EncodedTransaction: txnHex, + Status: readable.NewTransactionStatus(txn.Status), + Time: txn.Time, + }) + return + } + + rTxn, err := readable.NewTransactionWithStatus(txn) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, rTxn) + } +} + +// TransactionsWithStatus array of transaction results +type TransactionsWithStatus struct { + Transactions []readable.TransactionWithStatus `json:"txns"` +} + +// Sort sorts transactions chronologically, using txid for tiebreaking +func (r TransactionsWithStatus) Sort() { + sort.Slice(r.Transactions, func(i, j int) bool { + a := r.Transactions[i] + b := r.Transactions[j] + + if a.Time == b.Time { + return strings.Compare(a.Transaction.Hash, b.Transaction.Hash) < 0 + } + + return a.Time < b.Time + }) +} + +// NewTransactionsWithStatus converts []Transaction to TransactionsWithStatus +func NewTransactionsWithStatus(txns []visor.Transaction) (*TransactionsWithStatus, error) { + txnRlts := make([]readable.TransactionWithStatus, 0, len(txns)) + for _, txn := range txns { + rTxn, err := readable.NewTransactionWithStatus(&txn) + if err != nil { + return nil, err + } + txnRlts = append(txnRlts, *rTxn) + } + + return &TransactionsWithStatus{ + Transactions: txnRlts, + }, nil +} + +// TransactionsWithStatusVerbose array of transaction results +type TransactionsWithStatusVerbose struct { + Transactions []readable.TransactionWithStatusVerbose `json:"txns"` +} + +// Sort sorts transactions chronologically, using txid for tiebreaking +func (r TransactionsWithStatusVerbose) Sort() { + sort.Slice(r.Transactions, func(i, j int) bool { + a := r.Transactions[i] + b := r.Transactions[j] + + if a.Time == b.Time { + return strings.Compare(a.Transaction.Hash, b.Transaction.Hash) < 0 + } + + return a.Time < b.Time + }) +} + +// NewTransactionsWithStatusVerbose converts []Transaction to []TransactionsWithStatusVerbose +func NewTransactionsWithStatusVerbose(txns []visor.Transaction, inputs [][]visor.TransactionInput) (*TransactionsWithStatusVerbose, error) { + if len(txns) != len(inputs) { + return nil, errors.New("NewTransactionsWithStatusVerbose: len(txns) != len(inputs)") + } + + txnRlts := make([]readable.TransactionWithStatusVerbose, len(txns)) + for i, txn := range txns { + rTxn, err := readable.NewTransactionWithStatusVerbose(&txn, inputs[i]) + if err != nil { + return nil, err + } + txnRlts[i] = *rTxn + } + + return &TransactionsWithStatusVerbose{ + Transactions: txnRlts, + }, nil +} + +// Returns transactions that match the filters. +// Method: GET, POST +// URI: /api/v1/transactions +// Args: +// addrs: Comma separated addresses [optional, returns all transactions if no address provided] +// confirmed: Whether the transactions should be confirmed [optional, must be 0 or 1; if not provided, returns all] +// verbose: [bool] include verbose transaction input data +func transactionsHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet && r.Method != http.MethodPost { + wh.Error405(w) + return + } + + verbose, err := parseBoolFlag(r.FormValue("verbose")) + if err != nil { + wh.Error400(w, "Invalid value for verbose") + return + } + + // Gets 'addrs' parameter value + addrs, err := parseAddressesFromStr(r.FormValue("addrs")) + if err != nil { + wh.Error400(w, fmt.Sprintf("parse parameter: 'addrs' failed: %v", err)) + return + } + + // Initialize transaction filters + flts := []visor.TxFilter{visor.NewAddrsFilter(addrs)} + + // Gets the 'confirmed' parameter value + confirmedStr := r.FormValue("confirmed") + if confirmedStr != "" { + confirmed, err := strconv.ParseBool(confirmedStr) + if err != nil { + wh.Error400(w, fmt.Sprintf("invalid 'confirmed' value: %v", err)) + return + } + + flts = append(flts, visor.NewConfirmedTxFilter(confirmed)) + } + + if verbose { + txns, inputs, err := gateway.GetTransactionsWithInputs(flts) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + rTxns, err := NewTransactionsWithStatusVerbose(txns, inputs) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + rTxns.Sort() + + wh.SendJSONOr500(logger, w, rTxns.Transactions) + } else { + txns, err := gateway.GetTransactions(flts) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + rTxns, err := NewTransactionsWithStatus(txns) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + rTxns.Sort() + + wh.SendJSONOr500(logger, w, rTxns.Transactions) + } + } +} + +// InjectTransactionRequest is sent to POST /api/v1/injectTransaction +type InjectTransactionRequest struct { + RawTxn string `json:"rawtx"` + NoBroadcast bool `json:"no_broadcast,omitempty"` +} + +// URI: /api/v1/injectTransaction +// Method: POST +// Content-Type: application/json +// Body: {"rawtx": ""} +// Response: +// 200 - ok, returns the transaction hash in hex as string +// 400 - bad transaction +// 500 - other error +// 503 - network unavailable for broadcasting transaction +func injectTransactionHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + wh.Error405(w) + return + } + + var v InjectTransactionRequest + if err := json.NewDecoder(r.Body).Decode(&v); err != nil { + wh.Error400(w, err.Error()) + return + } + + if v.RawTxn == "" { + wh.Error400(w, "rawtx is required") + return + } + + txn, err := coin.DeserializeTransactionHex(v.RawTxn) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + if v.NoBroadcast { + if err := gateway.InjectTransaction(txn); err != nil { + switch err.(type) { + case visor.ErrTxnViolatesUserConstraint, + visor.ErrTxnViolatesHardConstraint, + visor.ErrTxnViolatesSoftConstraint: + wh.Error400(w, err.Error()) + default: + wh.Error500(w, err.Error()) + } + return + } + } else { + if err := gateway.InjectBroadcastTransaction(txn); err != nil { + switch err.(type) { + case visor.ErrTxnViolatesUserConstraint, + visor.ErrTxnViolatesHardConstraint, + visor.ErrTxnViolatesSoftConstraint: + wh.Error400(w, err.Error()) + default: + if daemon.IsBroadcastFailure(err) { + wh.Error503(w, err.Error()) + } else { + wh.Error500(w, err.Error()) + } + } + return + } + } + + wh.SendJSONOr500(logger, w, txn.Hash().Hex()) + } +} + +// ResendResult the result of rebroadcasting transaction +type ResendResult struct { + Txids []string `json:"txids"` +} + +// NewResendResult creates a ResendResult from a list of transaction ID hashes +func NewResendResult(hashes []cipher.SHA256) ResendResult { + txids := make([]string, len(hashes)) + for i, h := range hashes { + txids[i] = h.Hex() + } + return ResendResult{ + Txids: txids, + } +} + +// URI: /api/v1/resendUnconfirmedTxns +// Method: POST +// Broadcasts all unconfirmed transactions from the unconfirmed transaction pool +// Response: +// 200 - ok, returns the transaction hashes that were resent +// 405 - method not POST +// 500 - other error +// 503 - network unavailable for broadcasting transaction +func resendUnconfirmedTxnsHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + wh.Error405(w) + return + } + + hashes, err := gateway.ResendUnconfirmedTxns() + if err != nil { + if daemon.IsBroadcastFailure(err) { + wh.Error503(w, err.Error()) + } else { + wh.Error500(w, err.Error()) + } + return + } + + wh.SendJSONOr500(logger, w, NewResendResult(hashes)) + } +} + +// URI: /api/v1/rawtx +// Method: GET +// Args: +// txid: transaction ID hash +// Returns the hex-encoded byte serialization of a transaction. +// The transaction may be confirmed or unconfirmed. +func rawTxnHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + txid := r.FormValue("txid") + if txid == "" { + wh.Error400(w, "txid is empty") + return + } + + h, err := cipher.SHA256FromHex(txid) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + txn, err := gateway.GetTransaction(h) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + if txn == nil { + wh.Error404(w, "") + return + } + + txnHex, err := txn.Transaction.SerializeHex() + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, txnHex) + } +} + +// VerifyTransactionRequest represents the data struct of the request for /api/v2/transaction/verify +type VerifyTransactionRequest struct { + Unsigned bool `json:"unsigned"` + EncodedTransaction string `json:"encoded_transaction"` +} + +// VerifyTransactionResponse the response data struct for /api/v2/transaction/verify +type VerifyTransactionResponse struct { + Unsigned bool `json:"unsigned"` + Confirmed bool `json:"confirmed"` + Transaction CreatedTransaction `json:"transaction"` +} + +// Decode and verify an encoded transaction +// Method: POST +// URI: /api/v2/transaction/verify +func verifyTxnHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + resp := NewHTTPErrorResponse(http.StatusMethodNotAllowed, "") + writeHTTPResponse(w, resp) + return + } + + var req VerifyTransactionRequest + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + resp := NewHTTPErrorResponse(http.StatusBadRequest, err.Error()) + writeHTTPResponse(w, resp) + return + } + + if req.EncodedTransaction == "" { + resp := NewHTTPErrorResponse(http.StatusBadRequest, "encoded_transaction is required") + writeHTTPResponse(w, resp) + return + } + + txn, err := decodeTxn(req.EncodedTransaction) + if err != nil { + resp := NewHTTPErrorResponse(http.StatusBadRequest, fmt.Sprintf("decode transaction failed: %v", err)) + writeHTTPResponse(w, resp) + return + } + + signed := visor.TxnSigned + if req.Unsigned { + signed = visor.TxnUnsigned + } + + var resp HTTPResponse + inputs, isTxnConfirmed, err := gateway.VerifyTxnVerbose(txn, signed) + if err != nil { + switch err.(type) { + case visor.ErrTxnViolatesSoftConstraint, + visor.ErrTxnViolatesHardConstraint, + visor.ErrTxnViolatesUserConstraint: + resp.Error = &HTTPError{ + Code: http.StatusUnprocessableEntity, + Message: err.Error(), + } + default: + resp := NewHTTPErrorResponse(http.StatusInternalServerError, err.Error()) + writeHTTPResponse(w, resp) + return + } + } + + verifyTxnResp := VerifyTransactionResponse{ + Confirmed: isTxnConfirmed, + Unsigned: !txn.IsFullySigned(), + } + + if len(inputs) != len(txn.In) { + inputs = nil + } + verboseTxn, err := newCreatedTransactionFuzzy(txn, inputs) + if err != nil { + resp := NewHTTPErrorResponse(http.StatusInternalServerError, err.Error()) + writeHTTPResponse(w, resp) + return + } + + verifyTxnResp.Transaction = *verboseTxn + + resp.Data = verifyTxnResp + + if isTxnConfirmed && resp.Error == nil { + resp.Error = &HTTPError{ + Code: http.StatusUnprocessableEntity, + Message: "transaction has been spent", + } + } + + writeHTTPResponse(w, resp) + } +} + +func decodeTxn(encodedTxn string) (*coin.Transaction, error) { + var txn coin.Transaction + b, err := hex.DecodeString(encodedTxn) + if err != nil { + return nil, err + } + + txn, err = coin.DeserializeTransaction(b) + if err != nil { + return nil, err + } + + return &txn, nil +} + +// newCreatedTransactionFuzzy creates a CreatedTransaction but accommodates possibly invalid txn input +func newCreatedTransactionFuzzy(txn *coin.Transaction, inputs []visor.TransactionInput) (*CreatedTransaction, error) { + if len(txn.In) != len(inputs) && len(inputs) != 0 { + return nil, errors.New("len(txn.In) != len(inputs)") + } + + var outputHours uint64 + var feeInvalid bool + for _, o := range txn.Out { + var err error + outputHours, err = mathutil.AddUint64(outputHours, o.Hours) + if err != nil { + feeInvalid = true + } + } + + var inputHours uint64 + for _, i := range inputs { + var err error + inputHours, err = mathutil.AddUint64(inputHours, i.CalculatedHours) + if err != nil { + feeInvalid = true + } + } + + if inputHours < outputHours { + feeInvalid = true + } + + var fee uint64 + if !feeInvalid { + fee = inputHours - outputHours + } + + sigs := make([]string, len(txn.Sigs)) + for i, s := range txn.Sigs { + sigs[i] = s.Hex() + } + + txID := txn.Hash() + out := make([]CreatedTransactionOutput, len(txn.Out)) + for i, o := range txn.Out { + co, err := NewCreatedTransactionOutput(o, txID) + if err != nil { + logger.WithError(err).Error("NewCreatedTransactionOutput failed") + continue + } + out[i] = *co + } + + in := make([]CreatedTransactionInput, len(txn.In)) + if len(inputs) == 0 { + for i, h := range txn.In { + in[i] = CreatedTransactionInput{ + UxID: h.Hex(), + } + } + } else { + for i, o := range inputs { + ci, err := NewCreatedTransactionInput(o) + if err != nil { + logger.WithError(err).Error("NewCreatedTransactionInput failed") + continue + } + in[i] = *ci + } + } + + return &CreatedTransaction{ + Length: txn.Length, + Type: txn.Type, + TxID: txID.Hex(), + InnerHash: txn.InnerHash.Hex(), + Fee: fmt.Sprint(fee), + + Sigs: sigs, + In: in, + Out: out, + }, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/transaction_test.go b/vendor/github.com/SkycoinProject/skycoin/src/api/transaction_test.go new file mode 100644 index 00000000..c401e3ce --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/transaction_test.go @@ -0,0 +1,1663 @@ +package api + +import ( + "bytes" + "encoding/hex" + "encoding/json" + "errors" + "io" + "math" + "net/http" + "net/http/httptest" + "net/url" + "strings" + "testing" + "time" + + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/daemon" + "github.com/SkycoinProject/skycoin/src/daemon/gnet" + "github.com/SkycoinProject/skycoin/src/readable" + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/visor" +) + +func createUnconfirmedTxn(t *testing.T) visor.UnconfirmedTransaction { + ut := visor.UnconfirmedTransaction{} + ut.Transaction = coin.Transaction{} + ut.Transaction.InnerHash = testutil.RandSHA256(t) + ut.Transaction.In = []cipher.SHA256{testutil.RandSHA256(t)} + ut.Received = time.Now().UTC().UnixNano() + ut.Checked = ut.Received + ut.Announced = time.Time{}.UnixNano() + return ut +} + +func makeUxOutWithSecret(t *testing.T) (coin.UxOut, cipher.SecKey) { + body, sec := makeUxBodyWithSecret(t) + return coin.UxOut{ + Head: coin.UxHead{ + Time: 100, + BkSeq: 2, + }, + Body: body, + }, sec +} + +func makeUxBodyWithSecret(t *testing.T) (coin.UxBody, cipher.SecKey) { + p, s := cipher.GenerateKeyPair() + return coin.UxBody{ + SrcTransaction: testutil.RandSHA256(t), + Address: cipher.AddressFromPubKey(p), + Coins: 1e6, + Hours: 100, + }, s +} + +func makeAddress() cipher.Address { + p, _ := cipher.GenerateKeyPair() + return cipher.AddressFromPubKey(p) +} + +func makeTransaction(t *testing.T) coin.Transaction { + txn := coin.Transaction{} + ux, s := makeUxOutWithSecret(t) + + err := txn.PushInput(ux.Hash()) + require.NoError(t, err) + err = txn.PushOutput(makeAddress(), 1e6, 50) + require.NoError(t, err) + err = txn.PushOutput(makeAddress(), 5e6, 50) + require.NoError(t, err) + txn.SignInputs([]cipher.SecKey{s}) + err = txn.UpdateHeader() + require.NoError(t, err) + return txn +} + +func TestGetPendingTxs(t *testing.T) { + invalidTxn := createUnconfirmedTxn(t) + invalidTxn.Transaction.Out = append(invalidTxn.Transaction.Out, coin.TransactionOutput{ + Coins: math.MaxInt64 + 1, + }) + + type verboseResult struct { + Transactions []visor.UnconfirmedTransaction + Inputs [][]visor.TransactionInput + } + + tt := []struct { + name string + method string + status int + err string + verbose bool + verboseStr string + getAllUnconfirmedTxnsResponse []visor.UnconfirmedTransaction + getAllUnconfirmedTxnsErr error + getAllUnconfirmedTxnsVerboseResponse verboseResult + getAllUnconfirmedTxnsVerboseErr error + httpResponse interface{} + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + getAllUnconfirmedTxnsResponse: []visor.UnconfirmedTransaction{}, + }, + { + name: "400 - bad verbose", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - Invalid value for verbose", + verboseStr: "foo", + }, + { + name: "500 - bad unconfirmedTxn", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - Droplet string conversion failed: Value is too large", + getAllUnconfirmedTxnsResponse: []visor.UnconfirmedTransaction{ + invalidTxn, + }, + }, + { + name: "500 - get unconfirmedTxn error", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - GetAllUnconfirmedTransactions failed", + getAllUnconfirmedTxnsErr: errors.New("GetAllUnconfirmedTransactions failed"), + }, + { + name: "500 - get unconfirmedTxnVerbose error", + method: http.MethodGet, + status: http.StatusInternalServerError, + verboseStr: "1", + verbose: true, + err: "500 Internal Server Error - GetAllUnconfirmedTransactionsVerbose failed", + getAllUnconfirmedTxnsVerboseErr: errors.New("GetAllUnconfirmedTransactionsVerbose failed"), + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + getAllUnconfirmedTxnsResponse: []visor.UnconfirmedTransaction{}, + httpResponse: []readable.UnconfirmedTransactions{}, + }, + { + name: "200 verbose", + method: http.MethodGet, + status: http.StatusOK, + verboseStr: "1", + verbose: true, + getAllUnconfirmedTxnsVerboseResponse: verboseResult{ + Transactions: []visor.UnconfirmedTransaction{}, + Inputs: [][]visor.TransactionInput{}, + }, + httpResponse: []readable.UnconfirmedTransactionVerbose{}, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/pendingTxs" + gateway := &MockGatewayer{} + gateway.On("GetAllUnconfirmedTransactions").Return(tc.getAllUnconfirmedTxnsResponse, tc.getAllUnconfirmedTxnsErr) + gateway.On("GetAllUnconfirmedTransactionsVerbose").Return(tc.getAllUnconfirmedTxnsVerboseResponse.Transactions, + tc.getAllUnconfirmedTxnsVerboseResponse.Inputs, tc.getAllUnconfirmedTxnsVerboseErr) + + v := url.Values{} + if tc.verboseStr != "" { + v.Add("verbose", tc.verboseStr) + } + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + setCSRFParameters(t, tokenValid, req) + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = false + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, want `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + if tc.verbose { + var msg []readable.UnconfirmedTransactionVerbose + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.httpResponse, msg, tc.name) + } else { + var msg []readable.UnconfirmedTransactions + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.httpResponse, msg, tc.name) + } + } + }) + } +} + +func TestGetTransactionByID(t *testing.T) { + oddHash := "cafcb" + invalidHash := "cabrca" + validHash := "79216473e8f2c17095c6887cc9edca6c023afedfac2e0c5460e8b6f359684f8b" + validHashRaw, err := cipher.SHA256FromHex(validHash) + require.NoError(t, err) + + validAddr := "28ATuZGXJm6dJDGyJbdknFWgv8kbBX9hAdN" + validAddrRaw, err := cipher.DecodeBase58Address(validAddr) + require.NoError(t, err) + + validSig := "cca1595fb27375789da47bb1cf78e14febc2be6f3c3034247fea6f700b853cddbab5d16f4ffc1912fca8373f10e468b745d6a1d686cb73ade1e3c3b3653b2f9d7f" + validSigRaw, err := cipher.SigFromHex(validSig) + require.NoError(t, err) + + type httpBody struct { + txid string + verbose string + encoded string + } + + type verboseResult struct { + Transaction *visor.Transaction + Inputs []visor.TransactionInput + } + + tt := []struct { + name string + method string + status int + err string + httpBody *httpBody + verbose bool + encoded bool + txid cipher.SHA256 + getTransactionReponse *visor.Transaction + getTransactionError error + getTransactionResultVerboseReponse verboseResult + getTransactionResultVerboseError error + httpResponse interface{} + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + txid: testutil.RandSHA256(t), + }, + + { + name: "400 - empty txid", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - txid is empty", + httpBody: &httpBody{ + txid: "", + }, + txid: testutil.RandSHA256(t), + }, + + { + name: "400 - invalid hash: odd length hex string", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - encoding/hex: odd length hex string", + httpBody: &httpBody{ + txid: oddHash, + }, + txid: testutil.RandSHA256(t), + }, + + { + name: "400 - invalid hash: invalid byte: U+0072 'r'", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - encoding/hex: invalid byte: U+0072 'r'", + httpBody: &httpBody{ + txid: invalidHash, + }, + txid: testutil.RandSHA256(t), + }, + + { + name: "400 - invalid verbose", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - Invalid value for verbose", + httpBody: &httpBody{ + txid: validHash, + verbose: "foo", + }, + }, + + { + name: "400 - invalid encoded", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - Invalid value for encoded", + httpBody: &httpBody{ + txid: validHash, + encoded: "foo", + }, + }, + + { + name: "400 - verbose and encoded combined", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - verbose and encoded cannot be combined", + httpBody: &httpBody{ + txid: validHash, + verbose: "1", + encoded: "1", + }, + }, + + { + name: "500 - getTransactionError encoded", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - getTransactionError", + httpBody: &httpBody{ + txid: validHash, + encoded: "1", + }, + encoded: true, + txid: testutil.SHA256FromHex(t, validHash), + getTransactionError: errors.New("getTransactionError"), + }, + + { + name: "500 - getTransactionError", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - getTransactionError", + httpBody: &httpBody{ + txid: validHash, + }, + txid: testutil.SHA256FromHex(t, validHash), + getTransactionError: errors.New("getTransactionError"), + }, + + { + name: "500 - getTransactionResultVerboseError", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - getTransactionResultVerboseError", + httpBody: &httpBody{ + txid: validHash, + verbose: "1", + }, + verbose: true, + txid: testutil.SHA256FromHex(t, validHash), + getTransactionResultVerboseError: errors.New("getTransactionResultVerboseError"), + }, + + { + name: "404", + method: http.MethodGet, + status: http.StatusNotFound, + err: "404 Not Found", + httpBody: &httpBody{ + txid: validHash, + }, + txid: testutil.SHA256FromHex(t, validHash), + }, + + { + name: "404 verbose", + method: http.MethodGet, + status: http.StatusNotFound, + err: "404 Not Found", + httpBody: &httpBody{ + txid: validHash, + verbose: "1", + }, + verbose: true, + txid: testutil.SHA256FromHex(t, validHash), + }, + + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + httpBody: &httpBody{ + txid: validHash, + }, + txid: testutil.SHA256FromHex(t, validHash), + getTransactionReponse: &visor.Transaction{ + Transaction: coin.Transaction{ + Sigs: []cipher.Sig{validSigRaw}, + In: []cipher.SHA256{validHashRaw}, + Out: []coin.TransactionOutput{ + { + Coins: 9999, + Hours: 1111, + Address: validAddrRaw, + }, + }, + }, + Status: visor.TransactionStatus{ + Confirmed: true, + BlockSeq: 100, + Height: 9, + }, + }, + httpResponse: &readable.TransactionWithStatus{ + Status: readable.TransactionStatus{ + Confirmed: true, + BlockSeq: 100, + Height: 9, + }, + Transaction: readable.Transaction{ + Hash: "b64525bc14edb3c838ff3ef4f01bd74712432b32c18463dbda59b431959b2e52", + InnerHash: "0000000000000000000000000000000000000000000000000000000000000000", + Sigs: []string{validSig}, + In: []string{validHash}, + Out: []readable.TransactionOutput{ + { + Hash: "87ec4d440fd64bb4c26839d58684e567e499265ca396649c03304b928378720b", + Coins: "0.009999", + Hours: 1111, + Address: validAddr, + }, + }, + }, + }, + }, + + { + name: "200 verbose", + method: http.MethodGet, + status: http.StatusOK, + httpBody: &httpBody{ + txid: validHash, + verbose: "1", + }, + verbose: true, + txid: testutil.SHA256FromHex(t, validHash), + getTransactionResultVerboseReponse: verboseResult{ + Transaction: &visor.Transaction{ + Transaction: coin.Transaction{ + Sigs: []cipher.Sig{validSigRaw}, + In: []cipher.SHA256{validHashRaw}, + Out: []coin.TransactionOutput{ + { + Coins: 9999, + Hours: 1111, + Address: validAddrRaw, + }, + }, + }, + Status: visor.TransactionStatus{ + Confirmed: true, + BlockSeq: 100, + Height: 9, + }, + }, + Inputs: []visor.TransactionInput{ + { + UxOut: coin.UxOut{ + Body: coin.UxBody{ + Coins: 9999, + Hours: 1111, + Address: validAddrRaw, + }, + }, + CalculatedHours: 3333, + }, + }, + }, + httpResponse: &readable.TransactionWithStatusVerbose{ + Status: readable.TransactionStatus{ + Confirmed: true, + BlockSeq: 100, + Height: 9, + }, + Transaction: readable.TransactionVerbose{ + BlockTransactionVerbose: readable.BlockTransactionVerbose{ + Fee: 2222, + Hash: "b64525bc14edb3c838ff3ef4f01bd74712432b32c18463dbda59b431959b2e52", + InnerHash: "0000000000000000000000000000000000000000000000000000000000000000", + Sigs: []string{validSig}, + In: []readable.TransactionInput{ + { + Hash: "50e8ad459e29a051d969f221f1fb9775e26248e8b443982fef0cfaa117ee6c0c", + Coins: "0.009999", + Hours: 1111, + CalculatedHours: 3333, + Address: validAddr, + }, + }, + Out: []readable.TransactionOutput{ + { + Hash: "87ec4d440fd64bb4c26839d58684e567e499265ca396649c03304b928378720b", + Coins: "0.009999", + Hours: 1111, + Address: validAddr, + }, + }, + }, + }, + }, + }, + + { + name: "200 encoded", + method: http.MethodGet, + status: http.StatusOK, + httpBody: &httpBody{ + txid: validHash, + encoded: "1", + }, + encoded: true, + txid: testutil.SHA256FromHex(t, validHash), + getTransactionReponse: &visor.Transaction{ + Transaction: coin.Transaction{ + Sigs: []cipher.Sig{validSigRaw}, + In: []cipher.SHA256{validHashRaw}, + Out: []coin.TransactionOutput{ + { + Coins: 9999, + Hours: 1111, + Address: validAddrRaw, + }, + }, + }, + Status: visor.TransactionStatus{ + Confirmed: true, + BlockSeq: 100, + Height: 9, + }, + }, + httpResponse: &TransactionEncodedResponse{ + Status: readable.TransactionStatus{ + Confirmed: true, + BlockSeq: 100, + Height: 9, + }, + EncodedTransaction: "0000000000000000000000000000000000000000000000000000000000000000000000000001000000cca1595fb27375789da47bb1cf78e14febc2be6f3c3034247fea6f700b853cddbab5d16f4ffc1912fca8373f10e468b745d6a1d686cb73ade1e3c3b3653b2f9d7f0100000079216473e8f2c17095c6887cc9edca6c023afedfac2e0c5460e8b6f359684f8b0100000000a1f1da0612c870cbb2d88fb3d7f95ba7118d6efb0f270000000000005704000000000000", + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/transaction" + gateway := &MockGatewayer{} + gateway.On("GetTransaction", tc.txid).Return(tc.getTransactionReponse, tc.getTransactionError) + gateway.On("GetTransactionWithInputs", tc.txid).Return(tc.getTransactionResultVerboseReponse.Transaction, + tc.getTransactionResultVerboseReponse.Inputs, tc.getTransactionResultVerboseError) + + v := url.Values{} + if tc.httpBody != nil { + if tc.httpBody.txid != "" { + v.Add("txid", tc.httpBody.txid) + } + if tc.httpBody.verbose != "" { + v.Add("verbose", tc.httpBody.verbose) + } + if tc.httpBody.encoded != "" { + v.Add("encoded", tc.httpBody.encoded) + } + } + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + setCSRFParameters(t, tokenValid, req) + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = false + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, want `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + if tc.verbose { + var msg readable.TransactionWithStatusVerbose + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.httpResponse, &msg, tc.name) + } else if tc.encoded { + var msg TransactionEncodedResponse + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.httpResponse, &msg, tc.name) + } else { + var msg readable.TransactionWithStatus + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.httpResponse, &msg, tc.name) + } + } + + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + }) + } +} + +func TestInjectTransaction(t *testing.T) { + validTransaction := makeTransaction(t) + + validTxnBody := &InjectTransactionRequest{ + RawTxn: validTransaction.MustSerializeHex(), + } + validTxnBodyJSON, err := json.Marshal(validTxnBody) + require.NoError(t, err) + + validTxnBodyNoBroadcast := &InjectTransactionRequest{ + RawTxn: validTransaction.MustSerializeHex(), + NoBroadcast: true, + } + validTxnBodyNoBroadcastJSON, err := json.Marshal(validTxnBodyNoBroadcast) + require.NoError(t, err) + + b := &InjectTransactionRequest{ + RawTxn: hex.EncodeToString(testutil.RandBytes(t, 128)), + } + invalidTxnBodyJSON, err := json.Marshal(b) + require.NoError(t, err) + + tt := []struct { + name string + method string + status int + err string + httpBody string + injectTransactionArg coin.Transaction + injectTransactionError error + httpResponse string + csrfDisabled bool + }{ + { + name: "405", + method: http.MethodGet, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + injectTransactionArg: validTransaction, + }, + { + name: "400 - EOF", + method: http.MethodPost, + status: http.StatusBadRequest, + err: "400 Bad Request - EOF", + }, + { + name: "400 - rawtx required", + method: http.MethodPost, + status: http.StatusBadRequest, + err: "400 Bad Request - rawtx is required", + httpBody: `{"wrongKey":"wrongValue"}`, + }, + { + name: "400 - encoding/hex: odd length hex string", + method: http.MethodPost, + status: http.StatusBadRequest, + err: "400 Bad Request - encoding/hex: odd length hex string", + httpBody: `{"rawtx":"aab"}`, + }, + { + name: "400 - rawtx deserialization error", + method: http.MethodPost, + status: http.StatusBadRequest, + err: "400 Bad Request - Invalid transaction: Not enough buffer data to deserialize", + httpBody: string(invalidTxnBodyJSON), + }, + { + name: "503 - daemon.ErrNetworkingDisabled", + method: http.MethodPost, + status: http.StatusServiceUnavailable, + err: "503 Service Unavailable - Networking is disabled", + httpBody: string(validTxnBodyJSON), + injectTransactionArg: validTransaction, + injectTransactionError: daemon.ErrNetworkingDisabled, + }, + { + name: "503 - gnet.ErrNoReachableConnections", + method: http.MethodPost, + status: http.StatusServiceUnavailable, + err: "503 Service Unavailable - All pool connections are unreachable at this time", + httpBody: string(validTxnBodyJSON), + injectTransactionArg: validTransaction, + injectTransactionError: gnet.ErrNoReachableConnections, + }, + { + name: "503 - gnet.ErrPoolEmpty", + method: http.MethodPost, + status: http.StatusServiceUnavailable, + err: "503 Service Unavailable - Connection pool is empty after filtering connections", + httpBody: string(validTxnBodyJSON), + injectTransactionArg: validTransaction, + injectTransactionError: gnet.ErrPoolEmpty, + }, + { + name: "500 - other injectBroadcastTransactionError", + method: http.MethodPost, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - injectBroadcastTransactionError", + httpBody: string(validTxnBodyJSON), + injectTransactionArg: validTransaction, + injectTransactionError: errors.New("injectBroadcastTransactionError"), + }, + { + name: "500 - no broadcast other injectTransactionError", + method: http.MethodPost, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - injectTransactionError", + httpBody: string(validTxnBodyNoBroadcastJSON), + injectTransactionArg: validTransaction, + injectTransactionError: errors.New("injectTransactionError"), + }, + { + name: "400 - txn constraint violation", + method: http.MethodPost, + status: http.StatusBadRequest, + err: "400 Bad Request - Transaction violates hard constraint: bad transaction", + httpBody: string(validTxnBodyJSON), + injectTransactionArg: validTransaction, + injectTransactionError: visor.ErrTxnViolatesHardConstraint{ + Err: errors.New("bad transaction"), + }, + }, + { + name: "400 - no broadcast txn constraint violation", + method: http.MethodPost, + status: http.StatusBadRequest, + err: "400 Bad Request - Transaction violates hard constraint: bad transaction", + httpBody: string(validTxnBodyNoBroadcastJSON), + injectTransactionArg: validTransaction, + injectTransactionError: visor.ErrTxnViolatesHardConstraint{ + Err: errors.New("bad transaction"), + }, + }, + { + name: "200", + method: http.MethodPost, + status: http.StatusOK, + httpBody: string(validTxnBodyJSON), + injectTransactionArg: validTransaction, + httpResponse: validTransaction.Hash().Hex(), + }, + { + name: "200 no broadcast", + method: http.MethodPost, + status: http.StatusOK, + httpBody: string(validTxnBodyNoBroadcastJSON), + injectTransactionArg: validTransaction, + httpResponse: validTransaction.Hash().Hex(), + }, + { + name: "200 - csrf disabled", + method: http.MethodPost, + status: http.StatusOK, + httpBody: string(validTxnBodyJSON), + injectTransactionArg: validTransaction, + httpResponse: validTransaction.Hash().Hex(), + csrfDisabled: true, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/injectTransaction" + gateway := &MockGatewayer{} + gateway.On("InjectBroadcastTransaction", tc.injectTransactionArg).Return(tc.injectTransactionError) + gateway.On("InjectTransaction", tc.injectTransactionArg).Return(tc.injectTransactionError) + + req, err := http.NewRequest(tc.method, endpoint, strings.NewReader(tc.httpBody)) + require.NoError(t, err) + + if tc.csrfDisabled { + setCSRFParameters(t, tokenInvalid, req) + } else { + setCSRFParameters(t, tokenValid, req) + + } + + rr := httptest.NewRecorder() + + handler := newServerMux(defaultMuxConfig(), gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, want `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + expectedResponse, err := json.MarshalIndent(tc.httpResponse, "", " ") + require.NoError(t, err) + require.Equal(t, string(expectedResponse), rr.Body.String(), tc.name) + } + }) + } +} + +func TestResendUnconfirmedTxns(t *testing.T) { + validHash1 := testutil.RandSHA256(t) + validHash2 := testutil.RandSHA256(t) + + tt := []struct { + name string + method string + status int + err string + httpBody string + resendUnconfirmedTxnsResponse []cipher.SHA256 + resendUnconfirmedTxnsErr error + httpResponse ResendResult + }{ + { + name: "405", + method: http.MethodGet, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + + { + name: "500 resend failed network error", + method: http.MethodPost, + status: http.StatusServiceUnavailable, + err: "503 Service Unavailable - All pool connections are unreachable at this time", + resendUnconfirmedTxnsErr: gnet.ErrNoReachableConnections, + }, + + { + name: "500 resend failed unknown error", + method: http.MethodPost, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - ResendUnconfirmedTxns failed", + resendUnconfirmedTxnsErr: errors.New("ResendUnconfirmedTxns failed"), + }, + + { + name: "200", + method: http.MethodPost, + status: http.StatusOK, + resendUnconfirmedTxnsResponse: nil, + httpResponse: ResendResult{ + Txids: []string{}, + }, + }, + + { + name: "200 with hashes", + method: http.MethodPost, + status: http.StatusOK, + resendUnconfirmedTxnsResponse: []cipher.SHA256{validHash1, validHash2}, + httpResponse: ResendResult{ + Txids: []string{validHash1.Hex(), validHash2.Hex()}, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/resendUnconfirmedTxns" + gateway := &MockGatewayer{} + gateway.On("ResendUnconfirmedTxns").Return(tc.resendUnconfirmedTxnsResponse, tc.resendUnconfirmedTxnsErr) + + req, err := http.NewRequest(tc.method, endpoint, strings.NewReader(tc.httpBody)) + require.NoError(t, err) + + setCSRFParameters(t, tokenValid, req) + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = false + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, want `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg ResendResult + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.httpResponse, msg, tc.name) + } + }) + } +} + +func TestGetRawTxn(t *testing.T) { + oddHash := "cafcb" + invalidHash := "cabrca" + validHash := "79216473e8f2c17095c6887cc9edca6c023afedfac2e0c5460e8b6f359684f8b" + type httpBody struct { + txid string + } + + tt := []struct { + name string + method string + status int + err string + httpBody *httpBody + getTransactionArg cipher.SHA256 + getTransactionResponse *visor.Transaction + getTransactionError error + httpResponse string + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + getTransactionArg: testutil.RandSHA256(t), + }, + { + name: "400 - txid is empty", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - txid is empty", + httpBody: &httpBody{}, + getTransactionArg: testutil.RandSHA256(t), + }, + { + name: "400 - invalid hash: odd length hex string", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - encoding/hex: odd length hex string", + httpBody: &httpBody{ + txid: oddHash, + }, + getTransactionArg: testutil.RandSHA256(t), + }, + { + name: "400 - invalid hash: invalid byte: U+0072 'r'", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - encoding/hex: invalid byte: U+0072 'r'", + httpBody: &httpBody{ + txid: invalidHash, + }, + getTransactionArg: testutil.RandSHA256(t), + }, + { + name: "400 - getTransactionError", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - getTransactionError", + httpBody: &httpBody{ + txid: validHash, + }, + getTransactionArg: testutil.SHA256FromHex(t, validHash), + getTransactionError: errors.New("getTransactionError"), + }, + { + name: "404", + method: http.MethodGet, + status: http.StatusNotFound, + err: "404 Not Found", + httpBody: &httpBody{ + txid: validHash, + }, + getTransactionArg: testutil.SHA256FromHex(t, validHash), + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + httpBody: &httpBody{ + txid: validHash, + }, + getTransactionArg: testutil.SHA256FromHex(t, validHash), + getTransactionResponse: &visor.Transaction{}, + httpResponse: "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/rawtx" + gateway := &MockGatewayer{} + gateway.On("GetTransaction", tc.getTransactionArg).Return(tc.getTransactionResponse, tc.getTransactionError) + + v := url.Values{} + if tc.httpBody != nil { + if tc.httpBody.txid != "" { + v.Add("txid", tc.httpBody.txid) + } + } + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + setCSRFParameters(t, tokenValid, req) + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = false + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, want `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + expectedResponse, err := json.MarshalIndent(tc.httpResponse, "", " ") + require.NoError(t, err) + require.Equal(t, string(expectedResponse), rr.Body.String(), tc.name) + } + }) + } +} + +func TestGetTransactions(t *testing.T) { + invalidAddrsStr := "invalid,addrs" + addrsStr := "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ,2PBmUva7J8WFsyWg979cREZkU3z2pkYjNkE" + var addrs []cipher.Address + for _, item := range []string{"2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", "2PBmUva7J8WFsyWg979cREZkU3z2pkYjNkE"} { + addr, err := cipher.DecodeBase58Address(item) + require.NoError(t, err) + addrs = append(addrs, addr) + } + + type httpBody struct { + addrs string + confirmed string + verbose string + } + + type verboseResult struct { + Transactions []visor.Transaction + Inputs [][]visor.TransactionInput + } + + tt := []struct { + name string + method string + status int + err string + httpBody *httpBody + verbose bool + getTransactionsArg []visor.TxFilter + getTransactionsResponse []visor.Transaction + getTransactionsError error + getTransactionsVerboseResponse verboseResult + getTransactionsVerboseError error + httpResponse interface{} + }{ + { + name: "405", + method: http.MethodDelete, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + + { + name: "400 - invalid `addrs` param", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - parse parameter: 'addrs' failed: address \"invalid\" is invalid: Invalid base58 character", + httpBody: &httpBody{ + addrs: invalidAddrsStr, + }, + getTransactionsArg: []visor.TxFilter{ + visor.NewAddrsFilter(addrs), + }, + }, + + { + name: "400 - invalid `confirmed` param", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid 'confirmed' value: strconv.ParseBool: parsing \"invalidConfirmed\": invalid syntax", + httpBody: &httpBody{ + addrs: addrsStr, + confirmed: "invalidConfirmed", + }, + getTransactionsArg: []visor.TxFilter{ + visor.NewAddrsFilter(addrs), + }, + }, + + { + name: "400 - invalid verbose", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - Invalid value for verbose", + httpBody: &httpBody{ + addrs: addrsStr, + verbose: "foo", + }, + getTransactionsArg: []visor.TxFilter{ + visor.NewAddrsFilter(addrs), + }, + }, + + { + name: "500 - getTransactionsError", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - getTransactionsError", + httpBody: &httpBody{ + addrs: addrsStr, + confirmed: "true", + }, + getTransactionsArg: []visor.TxFilter{ + visor.NewAddrsFilter(addrs), + visor.NewConfirmedTxFilter(true), + }, + getTransactionsError: errors.New("getTransactionsError"), + }, + + { + name: "500 - getTransactionsVerboseError", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - getTransactionsVerboseError", + httpBody: &httpBody{ + addrs: addrsStr, + confirmed: "true", + verbose: "1", + }, + verbose: true, + getTransactionsArg: []visor.TxFilter{ + visor.NewAddrsFilter(addrs), + visor.NewConfirmedTxFilter(true), + }, + getTransactionsVerboseError: errors.New("getTransactionsVerboseError"), + }, + + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + httpBody: &httpBody{ + addrs: addrsStr, + confirmed: "true", + }, + getTransactionsArg: []visor.TxFilter{ + visor.NewAddrsFilter(addrs), + visor.NewConfirmedTxFilter(true), + }, + getTransactionsResponse: []visor.Transaction{}, + httpResponse: []readable.TransactionWithStatus{}, + }, + + { + name: "200 verbose", + method: http.MethodGet, + status: http.StatusOK, + httpBody: &httpBody{ + addrs: addrsStr, + confirmed: "true", + verbose: "1", + }, + verbose: true, + getTransactionsArg: []visor.TxFilter{ + visor.NewAddrsFilter(addrs), + visor.NewConfirmedTxFilter(true), + }, + getTransactionsVerboseResponse: verboseResult{ + Transactions: []visor.Transaction{}, + Inputs: [][]visor.TransactionInput{}, + }, + httpResponse: []readable.TransactionWithStatusVerbose{}, + }, + + { + name: "200 POST", + method: http.MethodPost, + status: http.StatusOK, + httpBody: &httpBody{ + addrs: addrsStr, + confirmed: "true", + }, + getTransactionsArg: []visor.TxFilter{ + visor.NewAddrsFilter(addrs), + visor.NewConfirmedTxFilter(true), + }, + getTransactionsResponse: []visor.Transaction{}, + httpResponse: []readable.TransactionWithStatus{}, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/transactions" + gateway := &MockGatewayer{} + + // Custom argument matching function for matching TxFilter args + matchFunc := mock.MatchedBy(func(flts []visor.TxFilter) bool { + if len(flts) != len(tc.getTransactionsArg) { + return false + } + + for i, f := range flts { + switch f.(type) { + case visor.AddrsFilter: + flt, ok := tc.getTransactionsArg[i].(visor.AddrsFilter) + if !ok { + return false + } + + if len(flt.Addrs) != len(f.(visor.AddrsFilter).Addrs) { + return false + } + + for j, a := range flt.Addrs { + ab := a.Bytes() + bb := f.(visor.AddrsFilter).Addrs[j].Bytes() + if !bytes.Equal(ab[:], bb[:]) { + return false + } + } + + case visor.BaseFilter: + // This part assumes that the filter is a ConfirmedTxFilter + flt, ok := tc.getTransactionsArg[i].(visor.BaseFilter) + if !ok { + return false + } + + dummyTxn := &visor.Transaction{ + Status: visor.TransactionStatus{ + Confirmed: true, + }, + } + + if flt.F(dummyTxn) != f.(visor.BaseFilter).F(dummyTxn) { + return false + } + + default: + return false + } + } + + return true + }) + + gateway.On("GetTransactions", matchFunc).Return(tc.getTransactionsResponse, tc.getTransactionsError) + gateway.On("GetTransactionsWithInputs", matchFunc).Return(tc.getTransactionsVerboseResponse.Transactions, + tc.getTransactionsVerboseResponse.Inputs, tc.getTransactionsVerboseError) + + v := url.Values{} + if tc.httpBody != nil { + if tc.httpBody.addrs != "" { + v.Add("addrs", tc.httpBody.addrs) + } + if tc.httpBody.confirmed != "" { + v.Add("confirmed", tc.httpBody.confirmed) + } + if tc.httpBody.verbose != "" { + v.Add("verbose", tc.httpBody.verbose) + } + } + + var reqBody io.Reader + if len(v) > 0 { + if tc.method == http.MethodPost { + reqBody = strings.NewReader(v.Encode()) + } else { + endpoint += "?" + v.Encode() + } + } + + req, err := http.NewRequest(tc.method, endpoint, reqBody) + require.NoError(t, err) + + if tc.method == http.MethodPost { + req.Header.Set("Content-Type", ContentTypeForm) + } + + setCSRFParameters(t, tokenValid, req) + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = false + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, want `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + if tc.verbose { + var msg []readable.TransactionWithStatusVerbose + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.httpResponse, msg, tc.name) + } else { + var msg []readable.TransactionWithStatus + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.httpResponse, msg, tc.name) + } + } + }) + } +} + +type transactionAndInputs struct { + txn coin.Transaction + inputs []visor.TransactionInput +} + +func newVerifyTxnResponseJSON(t *testing.T, txn *coin.Transaction, inputs []visor.TransactionInput, isTxnConfirmed, isUnsigned bool) VerifyTransactionResponse { + ctxn, err := newCreatedTransactionFuzzy(txn, inputs) + require.NoError(t, err) + return VerifyTransactionResponse{ + Transaction: *ctxn, + Confirmed: isTxnConfirmed, + Unsigned: isUnsigned, + } +} + +func prepareTxnAndInputs(t *testing.T) transactionAndInputs { + txn := coin.Transaction{} + ux, s := makeUxOutWithSecret(t) + + err := txn.PushInput(ux.Hash()) + require.NoError(t, err) + err = txn.PushOutput(makeAddress(), 1e6, 50) + require.NoError(t, err) + err = txn.PushOutput(makeAddress(), 5e6, 50) + require.NoError(t, err) + txn.SignInputs([]cipher.SecKey{s}) + err = txn.UpdateHeader() + require.NoError(t, err) + + input, err := visor.NewTransactionInput(ux, uint64(time.Now().UTC().Unix())) + require.NoError(t, err) + + return transactionAndInputs{ + txn: txn, + inputs: []visor.TransactionInput{input}, + } +} + +func makeTransactionWithEmptyAddressOutput(t *testing.T) transactionAndInputs { + txn := coin.Transaction{} + ux, s := makeUxOutWithSecret(t) + + err := txn.PushInput(ux.Hash()) + require.NoError(t, err) + err = txn.PushOutput(makeAddress(), 1e6, 50) + require.NoError(t, err) + err = txn.PushOutput(cipher.Address{}, 5e6, 50) + require.NoError(t, err) + txn.SignInputs([]cipher.SecKey{s}) + err = txn.UpdateHeader() + require.NoError(t, err) + + input, err := visor.NewTransactionInput(ux, uint64(time.Now().UTC().Unix())) + require.NoError(t, err) + + return transactionAndInputs{ + txn: txn, + inputs: []visor.TransactionInput{input}, + } +} + +func TestVerifyTransaction(t *testing.T) { + txnAndInputs := prepareTxnAndInputs(t) + type httpBody struct { + Unsigned bool `json:"unsigned"` + EncodedTransaction string `json:"encoded_transaction"` + } + + validTxnBody := &httpBody{ + EncodedTransaction: txnAndInputs.txn.MustSerializeHex(), + } + validTxnBodyJSON, err := json.Marshal(validTxnBody) + require.NoError(t, err) + + b := &httpBody{ + EncodedTransaction: hex.EncodeToString(testutil.RandBytes(t, 128)), + } + invalidTxnBodyJSON, err := json.Marshal(b) + require.NoError(t, err) + + invalidTxnEmptyAddress := makeTransactionWithEmptyAddressOutput(t) + invalidTxnEmptyAddressBody := &httpBody{ + EncodedTransaction: invalidTxnEmptyAddress.txn.MustSerializeHex(), + } + invalidTxnEmptyAddressBodyJSON, err := json.Marshal(invalidTxnEmptyAddressBody) + require.NoError(t, err) + + unsignedTxnAndInputs := prepareTxnAndInputs(t) + unsignedTxnAndInputs.txn.Sigs = make([]cipher.Sig, len(unsignedTxnAndInputs.txn.Sigs)) + err = unsignedTxnAndInputs.txn.UpdateHeader() + require.NoError(t, err) + unsignedTxnBody := &httpBody{ + EncodedTransaction: unsignedTxnAndInputs.txn.MustSerializeHex(), + } + unsignedTxnBodyJSON, err := json.Marshal(unsignedTxnBody) + require.NoError(t, err) + + unsignedTxnBodyUnsigned := &httpBody{ + Unsigned: true, + EncodedTransaction: unsignedTxnAndInputs.txn.MustSerializeHex(), + } + unsignedTxnBodyUnsignedJSON, err := json.Marshal(unsignedTxnBodyUnsigned) + require.NoError(t, err) + + type verifyTxnVerboseResult struct { + Uxouts []visor.TransactionInput + IsTxnConfirmed bool + Err error + } + + tt := []struct { + name string + method string + contentType string + status int + httpBody string + gatewayVerifyTxnVerboseArg coin.Transaction + gatewayVerifyTxnVerboseSigned visor.TxnSignedFlag + gatewayVerifyTxnVerboseResult verifyTxnVerboseResult + httpResponse HTTPResponse + csrfDisabled bool + }{ + { + name: "405", + method: http.MethodGet, + status: http.StatusMethodNotAllowed, + gatewayVerifyTxnVerboseArg: txnAndInputs.txn, + httpResponse: NewHTTPErrorResponse(http.StatusMethodNotAllowed, ""), + }, + { + name: "400 - EOF", + method: http.MethodPost, + contentType: ContentTypeJSON, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "EOF"), + }, + { + name: "415 - Unsupported Media Type", + method: http.MethodPost, + contentType: "", + status: http.StatusUnsupportedMediaType, + httpResponse: NewHTTPErrorResponse(http.StatusUnsupportedMediaType, ""), + }, + { + name: "400 - encoded_transaction is required", + method: http.MethodPost, + contentType: ContentTypeJSON, + status: http.StatusBadRequest, + httpBody: `{"wrongKey":"wrongValue"}`, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "encoded_transaction is required"), + }, + { + name: "400 - encoding/hex: odd length hex string", + method: http.MethodPost, + contentType: ContentTypeJSON, + status: http.StatusBadRequest, + httpBody: `{"encoded_transaction":"aab"}`, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "decode transaction failed: encoding/hex: odd length hex string"), + }, + { + name: "400 - deserialization error", + method: http.MethodPost, + contentType: ContentTypeJSON, + status: http.StatusBadRequest, + httpBody: string(invalidTxnBodyJSON), + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "decode transaction failed: Invalid transaction: Not enough buffer data to deserialize"), + }, + { + name: "422 - txn sends to empty address", + method: http.MethodPost, + contentType: ContentTypeJSON, + status: http.StatusUnprocessableEntity, + httpBody: string(invalidTxnEmptyAddressBodyJSON), + gatewayVerifyTxnVerboseArg: invalidTxnEmptyAddress.txn, + gatewayVerifyTxnVerboseSigned: visor.TxnSigned, + gatewayVerifyTxnVerboseResult: verifyTxnVerboseResult{ + Uxouts: invalidTxnEmptyAddress.inputs, + Err: visor.NewErrTxnViolatesUserConstraint(errors.New("Transaction.Out contains an output sending to an empty address")), + }, + httpResponse: HTTPResponse{ + Data: newVerifyTxnResponseJSON(t, &invalidTxnEmptyAddress.txn, invalidTxnEmptyAddress.inputs, false, false), + Error: &HTTPError{ + Code: http.StatusUnprocessableEntity, + Message: "Transaction violates user constraint: Transaction.Out contains an output sending to an empty address", + }, + }, + }, + { + name: "422 - txn is unsigned", + method: http.MethodPost, + contentType: ContentTypeJSON, + status: http.StatusUnprocessableEntity, + httpBody: string(unsignedTxnBodyJSON), + gatewayVerifyTxnVerboseArg: unsignedTxnAndInputs.txn, + gatewayVerifyTxnVerboseSigned: visor.TxnSigned, + gatewayVerifyTxnVerboseResult: verifyTxnVerboseResult{ + Uxouts: unsignedTxnAndInputs.inputs, + Err: visor.NewErrTxnViolatesUserConstraint(errors.New("Transaction.Out contains an output sending to an empty address")), + }, + httpResponse: HTTPResponse{ + Data: newVerifyTxnResponseJSON(t, &unsignedTxnAndInputs.txn, unsignedTxnAndInputs.inputs, false, true), + Error: &HTTPError{ + Code: http.StatusUnprocessableEntity, + Message: "Transaction violates user constraint: Transaction.Out contains an output sending to an empty address", + }, + }, + }, + { + name: "500 - internal server error", + method: http.MethodPost, + contentType: ContentTypeJSON, + status: http.StatusInternalServerError, + httpBody: string(validTxnBodyJSON), + gatewayVerifyTxnVerboseArg: txnAndInputs.txn, + gatewayVerifyTxnVerboseSigned: visor.TxnSigned, + gatewayVerifyTxnVerboseResult: verifyTxnVerboseResult{ + Err: errors.New("verify transaction failed"), + }, + httpResponse: NewHTTPErrorResponse(http.StatusInternalServerError, "verify transaction failed"), + }, + { + name: "422 - txn is confirmed", + method: http.MethodPost, + contentType: ContentTypeJSON, + status: http.StatusUnprocessableEntity, + httpBody: string(validTxnBodyJSON), + gatewayVerifyTxnVerboseArg: txnAndInputs.txn, + gatewayVerifyTxnVerboseSigned: visor.TxnSigned, + gatewayVerifyTxnVerboseResult: verifyTxnVerboseResult{ + Uxouts: txnAndInputs.inputs, + IsTxnConfirmed: true, + }, + httpResponse: HTTPResponse{ + Error: &HTTPError{ + Message: "transaction has been spent", + Code: http.StatusUnprocessableEntity, + }, + Data: newVerifyTxnResponseJSON(t, &txnAndInputs.txn, txnAndInputs.inputs, true, false), + }, + }, + { + name: "200 - unsigned", + method: http.MethodPost, + contentType: ContentTypeJSON, + status: http.StatusOK, + httpBody: string(unsignedTxnBodyUnsignedJSON), + gatewayVerifyTxnVerboseArg: unsignedTxnAndInputs.txn, + gatewayVerifyTxnVerboseSigned: visor.TxnUnsigned, + gatewayVerifyTxnVerboseResult: verifyTxnVerboseResult{ + Uxouts: unsignedTxnAndInputs.inputs, + }, + httpResponse: HTTPResponse{ + Data: newVerifyTxnResponseJSON(t, &unsignedTxnAndInputs.txn, unsignedTxnAndInputs.inputs, false, true), + }, + }, + { + name: "200", + method: http.MethodPost, + contentType: ContentTypeJSON, + status: http.StatusOK, + httpBody: string(validTxnBodyJSON), + gatewayVerifyTxnVerboseArg: txnAndInputs.txn, + gatewayVerifyTxnVerboseSigned: visor.TxnSigned, + gatewayVerifyTxnVerboseResult: verifyTxnVerboseResult{ + Uxouts: txnAndInputs.inputs, + }, + httpResponse: HTTPResponse{ + Data: newVerifyTxnResponseJSON(t, &txnAndInputs.txn, txnAndInputs.inputs, false, false), + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v2/transaction/verify" + gateway := &MockGatewayer{} + gateway.On("VerifyTxnVerbose", &tc.gatewayVerifyTxnVerboseArg, tc.gatewayVerifyTxnVerboseSigned).Return(tc.gatewayVerifyTxnVerboseResult.Uxouts, + tc.gatewayVerifyTxnVerboseResult.IsTxnConfirmed, tc.gatewayVerifyTxnVerboseResult.Err) + + req, err := http.NewRequest(tc.method, endpoint, strings.NewReader(tc.httpBody)) + require.NoError(t, err) + req.Header.Set("Content-Type", tc.contentType) + + if tc.csrfDisabled { + setCSRFParameters(t, tokenInvalid, req) + } else { + setCSRFParameters(t, tokenValid, req) + } + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = false + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + var rsp ReceivedHTTPResponse + err = json.Unmarshal(rr.Body.Bytes(), &rsp) + require.NoError(t, err) + + require.Equal(t, tc.httpResponse.Error, rsp.Error) + + if rsp.Data == nil { + require.Nil(t, tc.httpResponse.Data) + } else { + require.NotNil(t, tc.httpResponse.Data) + + var txnRsp VerifyTransactionResponse + err := json.Unmarshal(rsp.Data, &txnRsp) + require.NoError(t, err) + + require.Equal(t, tc.httpResponse.Data.(VerifyTransactionResponse), txnRsp) + } + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/uxout.go b/vendor/github.com/SkycoinProject/skycoin/src/api/uxout.go new file mode 100644 index 00000000..7eb478f9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/uxout.go @@ -0,0 +1,87 @@ +package api + +import ( + "net/http" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/readable" + wh "github.com/SkycoinProject/skycoin/src/util/http" +) + +// URI: /api/v1/uxout +// Method: GET +// Args: +// uxid: unspent output ID hash +// Returns an unspent output by ID +func uxOutHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + uxid := r.FormValue("uxid") + if uxid == "" { + wh.Error400(w, "uxid is empty") + return + } + + id, err := cipher.SHA256FromHex(uxid) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + uxout, err := gateway.GetUxOutByID(id) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + if uxout == nil { + wh.Error404(w, "") + return + } + + wh.SendJSONOr500(logger, w, readable.NewSpentOutput(uxout)) + } +} + +// URI: /api/v1/address_uxouts +// Method: GET +// Args: +// address +// Returns the historical, spent outputs associated with an address +func addrUxOutsHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + addr := r.FormValue("address") + if addr == "" { + wh.Error400(w, "address is empty") + return + } + + cipherAddr, err := cipher.DecodeBase58Address(addr) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + uxs, err := gateway.GetSpentOutputsForAddresses([]cipher.Address{cipherAddr}) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + ret := make([]readable.SpentOutput, 0) + for _, u := range uxs { + ret = append(ret, readable.NewSpentOutputs(u)...) + } + + wh.SendJSONOr500(logger, w, ret) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/uxout_test.go b/vendor/github.com/SkycoinProject/skycoin/src/api/uxout_test.go new file mode 100644 index 00000000..8c47608b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/uxout_test.go @@ -0,0 +1,280 @@ +package api + +import ( + "encoding/json" + "net/http" + "net/http/httptest" + "net/url" + "strings" + "testing" + + "errors" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/readable" + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/visor/historydb" +) + +func TestGetUxOutByID(t *testing.T) { + invalidHash := "carccb" + oddHash := "caccb" + validHash := "79216473e8f2c17095c6887cc9edca6c023afedfac2e0c5460e8b6f359684f8b" + + type httpBody struct { + uxid string + } + + tt := []struct { + name string + method string + status int + err string + httpBody *httpBody + uxid string + getGetUxOutByIDArg cipher.SHA256 + getGetUxOutByIDResponse *historydb.UxOut + getGetUxOutByIDError error + httpResponse readable.SpentOutput + csrfDisabled bool + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "400 - empty uxin value", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - uxid is empty", + httpBody: &httpBody{ + uxid: "", + }, + }, + { + name: "400 - odd length uxin value", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - encoding/hex: odd length hex string", + httpBody: &httpBody{ + uxid: oddHash, + }, + uxid: oddHash, + }, + { + name: "400 - invalid uxin value", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - encoding/hex: invalid byte: U+0072 'r'", + httpBody: &httpBody{ + uxid: invalidHash, + }, + uxid: invalidHash, + }, + { + name: "400 - getGetUxOutByIDError", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - getGetUxOutByIDError", + httpBody: &httpBody{ + uxid: validHash, + }, + uxid: validHash, + getGetUxOutByIDArg: testutil.SHA256FromHex(t, validHash), + getGetUxOutByIDError: errors.New("getGetUxOutByIDError"), + }, + { + name: "404 - uxout == nil", + method: http.MethodGet, + status: http.StatusNotFound, + err: "404 Not Found", + httpBody: &httpBody{ + uxid: validHash, + }, + uxid: validHash, + getGetUxOutByIDArg: testutil.SHA256FromHex(t, validHash), + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + err: "404 Not Found", + httpBody: &httpBody{ + uxid: validHash, + }, + uxid: validHash, + getGetUxOutByIDArg: testutil.SHA256FromHex(t, validHash), + getGetUxOutByIDResponse: &historydb.UxOut{}, + httpResponse: readable.NewSpentOutput(&historydb.UxOut{}), + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &MockGatewayer{} + endpoint := "/api/v1/uxout" + gateway.On("GetUxOutByID", tc.getGetUxOutByIDArg).Return(tc.getGetUxOutByIDResponse, tc.getGetUxOutByIDError) + + v := url.Values{} + if tc.httpBody != nil { + if tc.httpBody.uxid != "" { + v.Add("uxid", tc.httpBody.uxid) + } + } + + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + if tc.csrfDisabled { + setCSRFParameters(t, tokenInvalid, req) + } else { + setCSRFParameters(t, tokenValid, req) + } + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = tc.csrfDisabled + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, want `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg readable.SpentOutput + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.httpResponse, msg, tc.name) + } + }) + } +} + +func TestGetAddrUxOuts(t *testing.T) { + addressForGwError := testutil.MakeAddress() + addressForGwResponse := testutil.MakeAddress() + type httpBody struct { + address string + } + + tt := []struct { + name string + method string + status int + err string + httpBody *httpBody + getSpentOutputsForAddressesArg []cipher.Address + getSpentOutputsForAddressesResponse [][]historydb.UxOut + getSpentOutputsForAddressesError error + httpResponse []readable.SpentOutput + csrfDisabled bool + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "400 - address is empty", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - address is empty", + httpBody: &httpBody{ + address: "", + }, + }, + { + name: "400 - cipher.DecodeBase58Address error", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - Invalid address length", + httpBody: &httpBody{ + address: "abcd", + }, + }, + { + name: "400 - gateway.GetSpentOutputsForAddresses error", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - getSpentOutputsForAddressesError", + httpBody: &httpBody{ + address: addressForGwError.String(), + }, + getSpentOutputsForAddressesArg: []cipher.Address{addressForGwError}, + getSpentOutputsForAddressesError: errors.New("getSpentOutputsForAddressesError"), + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + httpBody: &httpBody{ + address: addressForGwResponse.String(), + }, + getSpentOutputsForAddressesArg: []cipher.Address{addressForGwResponse}, + getSpentOutputsForAddressesResponse: [][]historydb.UxOut{{}}, + httpResponse: []readable.SpentOutput{}, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/address_uxouts" + gateway := &MockGatewayer{} + gateway.On("GetSpentOutputsForAddresses", tc.getSpentOutputsForAddressesArg).Return(tc.getSpentOutputsForAddressesResponse, tc.getSpentOutputsForAddressesError) + + v := url.Values{} + if tc.httpBody != nil { + if tc.httpBody.address != "" { + v.Add("address", tc.httpBody.address) + } + } + + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + if tc.csrfDisabled { + setCSRFParameters(t, tokenInvalid, req) + } else { + setCSRFParameters(t, tokenValid, req) + } + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = tc.csrfDisabled + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, want `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg []readable.SpentOutput + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.httpResponse, msg, tc.name) + } + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/version.go b/vendor/github.com/SkycoinProject/skycoin/src/api/version.go new file mode 100644 index 00000000..bdbd0d85 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/version.go @@ -0,0 +1,22 @@ +package api + +import ( + "net/http" + + "github.com/SkycoinProject/skycoin/src/readable" + wh "github.com/SkycoinProject/skycoin/src/util/http" +) + +// versionHandler returns the application version info +// URI: /api/v1/version +// Method: GET +func versionHandler(bi readable.BuildInfo) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + wh.SendJSONOr500(logger, w, bi) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/wallet.go b/vendor/github.com/SkycoinProject/skycoin/src/api/wallet.go new file mode 100644 index 00000000..5ca4e974 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/wallet.go @@ -0,0 +1,986 @@ +package api + +// APIs for wallet-related information + +import ( + "encoding/json" + "fmt" + "net/http" + "sort" + "strconv" + + "github.com/SkycoinProject/skycoin/src/cipher/bip39" + "github.com/SkycoinProject/skycoin/src/cipher/bip44" + "github.com/SkycoinProject/skycoin/src/readable" + wh "github.com/SkycoinProject/skycoin/src/util/http" + "github.com/SkycoinProject/skycoin/src/wallet" +) + +// UnconfirmedTxnsResponse contains unconfirmed transaction data +type UnconfirmedTxnsResponse struct { + Transactions []readable.UnconfirmedTransactions `json:"transactions"` +} + +// UnconfirmedTxnsVerboseResponse contains verbose unconfirmed transaction data +type UnconfirmedTxnsVerboseResponse struct { + Transactions []readable.UnconfirmedTransactionVerbose `json:"transactions"` +} + +// BalanceResponse address balance summary struct +type BalanceResponse struct { + readable.BalancePair + Addresses readable.AddressBalances `json:"addresses"` +} + +// WalletResponse wallet response struct for http apis +type WalletResponse struct { + Meta readable.WalletMeta `json:"meta"` + Entries []readable.WalletEntry `json:"entries"` +} + +// NewWalletResponse creates WalletResponse struct from wallet.Wallet +func NewWalletResponse(w wallet.Wallet) (*WalletResponse, error) { + var wr WalletResponse + + wr.Meta.Coin = w.Coin() + wr.Meta.Filename = w.Filename() + wr.Meta.Label = w.Label() + wr.Meta.Type = w.Type() + wr.Meta.Version = w.Version() + wr.Meta.CryptoType = w.CryptoType() + wr.Meta.Encrypted = w.IsEncrypted() + wr.Meta.Timestamp = w.Timestamp() + + switch w.Type() { + case wallet.WalletTypeBip44: + bip44Coin := w.Bip44Coin() + wr.Meta.Bip44Coin = &bip44Coin + case wallet.WalletTypeXPub: + wr.Meta.XPub = w.XPub() + } + + entries := w.GetEntries() + wr.Entries = make([]readable.WalletEntry, len(entries)) + + for i, e := range entries { + wr.Entries[i] = readable.WalletEntry{ + Address: e.Address.String(), + Public: e.Public.Hex(), + } + + switch w.Type() { + // Copy these values to another ref to avoid having a pointer + // to an element of Entry which could affect GC of the Entry, + // which could cause retention/copying of secret data in the Entry. + // This is speculative. I don't know if this matters to the go runtime + case wallet.WalletTypeBip44: + childNumber := e.ChildNumber + wr.Entries[i].ChildNumber = &childNumber + change := e.Change + wr.Entries[i].Change = &change + case wallet.WalletTypeXPub: + childNumber := e.ChildNumber + wr.Entries[i].ChildNumber = &childNumber + } + } + + return &wr, nil +} + +// Returns the wallet's balance, both confirmed and predicted. The predicted +// balance is the confirmed balance minus the pending spends. +// URI: /api/v1/wallet/balance +// Method: GET +// Args: +// id: wallet id [required] +func walletBalanceHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + wltID := r.FormValue("id") + if wltID == "" { + wh.Error400(w, "missing wallet id") + return + } + + walletBalance, addressBalances, err := gateway.GetWalletBalance(wltID) + if err != nil { + logger.Errorf("Get wallet balance failed: %v", err) + switch err { + case wallet.ErrWalletNotExist: + wh.Error404(w, "") + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + default: + wh.Error500(w, err.Error()) + } + return + } + + wh.SendJSONOr500(logger, w, BalanceResponse{ + BalancePair: readable.NewBalancePair(walletBalance), + Addresses: readable.NewAddressBalances(addressBalances), + }) + } +} + +// Returns the balance of one or more addresses, both confirmed and predicted. The predicted +// balance is the confirmed balance minus the pending spends. +// URI: /api/v1s/balance +// Method: GET, POST +// Args: +// addrs: command separated list of addresses [required] +func balanceHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet && r.Method != http.MethodPost { + wh.Error405(w) + return + } + + addrsParam := r.FormValue("addrs") + addrs, err := parseAddressesFromStr(addrsParam) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + if len(addrs) == 0 { + wh.Error400(w, "addrs is required") + return + } + + bals, err := gateway.GetBalanceOfAddresses(addrs) + if err != nil { + err = fmt.Errorf("gateway.GetBalanceOfAddresses failed: %v", err) + wh.Error500(w, err.Error()) + return + } + + // create map of address to balance + addressBalances := make(readable.AddressBalances, len(addrs)) + for idx, addr := range addrs { + addressBalances[addr.String()] = readable.NewBalancePair(bals[idx]) + } + + var balance wallet.BalancePair + for _, bal := range bals { + var err error + balance.Confirmed, err = balance.Confirmed.Add(bal.Confirmed) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + balance.Predicted, err = balance.Predicted.Add(bal.Predicted) + if err != nil { + wh.Error500(w, err.Error()) + return + } + } + + wh.SendJSONOr500(logger, w, BalanceResponse{ + BalancePair: readable.NewBalancePair(balance), + Addresses: addressBalances, + }) + } +} + +// Loads wallet from seed, will scan ahead N address and +// load addresses till the last one that have coins. +// URI: /api/v1/wallet/create +// Method: POST +// Args: +// seed: wallet seed [required] +// seed-passphrase: wallet seed passphrase [optional, bip44 type wallet only] +// type: wallet type [required, one of "deterministic", "bip44" or "xpub"] +// bip44-coin: BIP44 coin type [optional, defaults to 8000 (skycoin's coin type), only valid if type is "bip44"] +// xpub: xpub key [required for xpub wallets] +// label: wallet label [required] +// scan: the number of addresses to scan ahead for balances [optional, must be > 0] +// encrypt: bool value, whether encrypt the wallet [optional] +// password: password for encrypting wallet [optional, must be provided if "encrypt" is set] +func walletCreateHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + wh.Error405(w) + return + } + + walletType := r.FormValue("type") + if walletType == "" { + wh.Error400(w, "missing type") + return + } + + seed := r.FormValue("seed") + switch walletType { + case wallet.WalletTypeDeterministic, wallet.WalletTypeBip44: + if seed == "" { + wh.Error400(w, "missing seed") + return + } + } + + label := r.FormValue("label") + if label == "" { + wh.Error400(w, "missing label") + return + } + + password := r.FormValue("password") + defer func() { + password = "" + }() + + var encrypt bool + encryptStr := r.FormValue("encrypt") + if encryptStr != "" { + var err error + encrypt, err = strconv.ParseBool(encryptStr) + if err != nil { + wh.Error400(w, fmt.Sprintf("invalid encrypt value: %v", err)) + return + } + } + + if encrypt && len(password) == 0 { + wh.Error400(w, "missing password") + return + } + + if !encrypt && len(password) > 0 { + wh.Error400(w, "encrypt must be true as password is provided") + return + } + + scanNStr := r.FormValue("scan") + var scanN uint64 = 1 + if scanNStr != "" { + var err error + scanN, err = strconv.ParseUint(scanNStr, 10, 64) + if err != nil { + wh.Error400(w, "invalid scan value") + return + } + } + + if scanN == 0 { + wh.Error400(w, "scan must be > 0") + return + } + + var bip44Coin *bip44.CoinType + bip44CoinStr := r.FormValue("bip44-coin") + if bip44CoinStr != "" { + if walletType != wallet.WalletTypeBip44 { + wh.Error400(w, "bip44-coin is only valid for bip44 type wallets") + return + } + + bip44CoinInt, err := strconv.ParseUint(bip44CoinStr, 10, 32) + if err != nil { + wh.Error400(w, "invalid bip44-coin value") + return + } + + c := bip44.CoinType(bip44CoinInt) + bip44Coin = &c + } + + wlt, err := gateway.CreateWallet("", wallet.Options{ + Seed: seed, + Label: label, + Encrypt: encrypt, + Password: []byte(password), + ScanN: scanN, + Type: walletType, + SeedPassphrase: r.FormValue("seed-passphrase"), + Bip44Coin: bip44Coin, + XPub: r.FormValue("xpub"), + }, gateway) + if err != nil { + switch err.(type) { + case wallet.Error: + switch err { + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + return + default: + wh.Error400(w, err.Error()) + return + } + default: + wh.Error500(w, err.Error()) + return + } + + } + + rlt, err := NewWalletResponse(wlt) + if err != nil { + wh.Error500(w, err.Error()) + return + } + wh.SendJSONOr500(logger, w, rlt) + } +} + +// Genreates new addresses +// URI: /api/v1/wallet/newAddress +// Method: POST +// Args: +// id: wallet id [required] +// num: number of address need to create [optional, if not set the default value is 1] +// password: wallet password [optional, must be provided if the wallet is encrypted] +func walletNewAddressesHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + wh.Error405(w) + return + } + + wltID := r.FormValue("id") + if wltID == "" { + wh.Error400(w, "missing wallet id") + return + } + + // Compute the number of addresses to create, default is 1 + var n uint64 = 1 + var err error + num := r.FormValue("num") + if num != "" { + n, err = strconv.ParseUint(num, 10, 64) + if err != nil { + wh.Error400(w, "invalid num value") + return + } + } + + password := r.FormValue("password") + defer func() { + password = "" + }() + + addrs, err := gateway.NewAddresses(wltID, []byte(password), n) + if err != nil { + switch err { + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + default: + wh.Error400(w, err.Error()) + } + return + } + + var rlt = struct { + Addresses []string `json:"addresses"` + }{} + + for _, a := range addrs { + rlt.Addresses = append(rlt.Addresses, a.String()) + } + + wh.SendJSONOr500(logger, w, rlt) + } +} + +// Update wallet label +// URI: /api/v1/wallet/update +// Method: POST +// Args: +// id: wallet id [required] +// label: the label the wallet will be updated to [required] +func walletUpdateHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + wh.Error405(w) + return + } + + // Update wallet + wltID := r.FormValue("id") + if wltID == "" { + wh.Error400(w, "missing wallet id") + return + } + + label := r.FormValue("label") + if label == "" { + wh.Error400(w, "missing label") + return + } + + if err := gateway.UpdateWalletLabel(wltID, label); err != nil { + logger.Errorf("update wallet label failed: %v", err) + + switch err { + case wallet.ErrWalletNotExist: + wh.Error404(w, "") + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + default: + wh.Error500(w, err.Error()) + } + return + } + + wh.SendJSONOr500(logger, w, "success") + } +} + +// Returns a wallet by id +// URI: /api/v1/wallet +// Method: GET +// Args: +// id: wallet id [required] +func walletHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + wltID := r.FormValue("id") + if wltID == "" { + wh.Error400(w, fmt.Sprintf("missing wallet id")) + return + } + + wlt, err := gateway.GetWallet(wltID) + if err != nil { + switch err { + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + default: + wh.Error400(w, err.Error()) + } + return + } + rlt, err := NewWalletResponse(wlt) + if err != nil { + wh.Error500(w, err.Error()) + return + } + wh.SendJSONOr500(logger, w, rlt) + } +} + +// walletTransactionsHandler returns all unconfirmed transactions for all addresses in a given wallet +// URI: /api/v1/wallet/transactions +// Method: GET +// Args: +// id: wallet id [required] +// verbose: [bool] include verbose transaction input data +func walletTransactionsHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + verbose, err := parseBoolFlag(r.FormValue("verbose")) + if err != nil { + wh.Error400(w, "Invalid value for verbose") + return + } + + wltID := r.FormValue("id") + if wltID == "" { + wh.Error400(w, "missing wallet id") + return + } + + handleWalletError := func(err error) { + switch err { + case nil: + case wallet.ErrWalletNotExist: + wh.Error404(w, "") + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + default: + wh.Error500(w, err.Error()) + } + } + + if verbose { + txns, inputs, err := gateway.GetWalletUnconfirmedTransactionsVerbose(wltID) + if err != nil { + logger.Errorf("get wallet unconfirmed transactions verbose failed: %v", err) + handleWalletError(err) + return + } + + vb := make([]readable.UnconfirmedTransactionVerbose, len(txns)) + for i, txn := range txns { + v, err := readable.NewUnconfirmedTransactionVerbose(&txn, inputs[i]) + if err != nil { + wh.Error500(w, err.Error()) + return + } + vb[i] = *v + } + + wh.SendJSONOr500(logger, w, UnconfirmedTxnsVerboseResponse{ + Transactions: vb, + }) + } else { + txns, err := gateway.GetWalletUnconfirmedTransactions(wltID) + if err != nil { + logger.Errorf("get wallet unconfirmed transactions failed: %v", err) + handleWalletError(err) + return + } + + unconfirmedTxns, err := readable.NewUnconfirmedTransactions(txns) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, UnconfirmedTxnsResponse{ + Transactions: unconfirmedTxns, + }) + } + } +} + +// Returns all loaded wallets +// URI: /api/v1/wallets +// Method: GET +func walletsHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + wlts, err := gateway.GetWallets() + if err != nil { + switch err { + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + default: + wh.Error500(w, err.Error()) + } + return + } + + wrs := make([]*WalletResponse, 0, len(wlts)) + for _, wlt := range wlts { + wr, err := NewWalletResponse(wlt) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wrs = append(wrs, wr) + } + + sort.Slice(wrs, func(i, j int) bool { + return wrs[i].Meta.Timestamp < wrs[j].Meta.Timestamp + }) + + wh.SendJSONOr500(logger, w, wrs) + } +} + +// WalletFolder struct +type WalletFolder struct { + Address string `json:"address"` +} + +// Returns the wallet directory path +// URI: /api/v1/wallets/folderName +// Method: GET +func walletFolderHandler(s Walleter) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + addr, err := s.WalletDir() + if err != nil { + switch err { + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + default: + wh.Error500(w, err.Error()) + } + return + } + ret := WalletFolder{ + Address: addr, + } + wh.SendJSONOr500(logger, w, ret) + } +} + +// Generates wallet seed +// URI: /api/v1/wallet/newSeed +// Method: GET +// Args: +// entropy: entropy bitsize [optional, default value of 128 will be used if not set] +func newSeedHandler() http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + entropyValue := r.FormValue("entropy") + if entropyValue == "" { + entropyValue = "128" + } + + entropyBits, err := strconv.Atoi(entropyValue) + if err != nil { + wh.Error400(w, "invalid entropy") + return + } + + // Entropy bit size can either be 128 or 256 + if entropyBits != 128 && entropyBits != 256 { + wh.Error400(w, "entropy length must be 128 or 256") + return + } + + entropy, err := bip39.NewEntropy(entropyBits) + if err != nil { + err = fmt.Errorf("bip39.NewEntropy failed: %v", err) + wh.Error500(w, err.Error()) + return + } + + mnemonic, err := bip39.NewMnemonic(entropy) + if err != nil { + err = fmt.Errorf("bip39.NewDefaultMnemonic failed: %v", err) + wh.Error500(w, err.Error()) + return + } + + var rlt = struct { + Seed string `json:"seed"` + }{ + mnemonic, + } + wh.SendJSONOr500(logger, w, rlt) + } +} + +// WalletSeedResponse is returned by /api/v1/wallet/seed +type WalletSeedResponse struct { + Seed string `json:"seed"` + SeedPassphrase string `json:"seed_passphrase,omitempty"` +} + +// Returns seed and seed passphrase of wallet of given id +// URI: /api/v1/wallet/seed +// Method: POST +// Args: +// id: wallet id +// password: wallet password +func walletSeedHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + wh.Error405(w) + return + } + + id := r.FormValue("id") + if id == "" { + wh.Error400(w, "missing wallet id") + return + } + + password := r.FormValue("password") + defer func() { + password = "" + }() + + seed, seedPassphrase, err := gateway.GetWalletSeed(id, []byte(password)) + if err != nil { + switch err { + case wallet.ErrMissingPassword, + wallet.ErrWalletNotEncrypted, + wallet.ErrInvalidPassword: + wh.Error400(w, err.Error()) + case wallet.ErrWalletAPIDisabled, wallet.ErrSeedAPIDisabled: + wh.Error403(w, "") + case wallet.ErrWalletNotExist: + wh.Error404(w, "") + default: + wh.Error500(w, err.Error()) + } + return + } + + v := WalletSeedResponse{ + Seed: seed, + SeedPassphrase: seedPassphrase, + } + + wh.SendJSONOr500(logger, w, v) + } +} + +// VerifySeedRequest is the request data for POST /api/v2/wallet/seed/verify +type VerifySeedRequest struct { + Seed string `json:"seed"` +} + +// walletVerifySeedHandler verifies a wallet seed +// Method: POST +// URI: /api/v2/wallet/seed/verify +func walletVerifySeedHandler(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + resp := NewHTTPErrorResponse(http.StatusMethodNotAllowed, "") + writeHTTPResponse(w, resp) + return + } + + var req VerifySeedRequest + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + resp := NewHTTPErrorResponse(http.StatusBadRequest, err.Error()) + writeHTTPResponse(w, resp) + return + } + + if req.Seed == "" { + resp := NewHTTPErrorResponse(http.StatusBadRequest, "seed is required") + writeHTTPResponse(w, resp) + return + } + + if err := bip39.ValidateMnemonic(req.Seed); err != nil { + resp := NewHTTPErrorResponse(http.StatusUnprocessableEntity, err.Error()) + writeHTTPResponse(w, resp) + return + } + + writeHTTPResponse(w, HTTPResponse{Data: struct{}{}}) +} + +// Unloads wallet from the wallet service +// URI: /api/v1/wallet/unload +// Method: POST +// Args: +// id: wallet id +func walletUnloadHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + wh.Error405(w) + return + } + + id := r.FormValue("id") + if id == "" { + wh.Error400(w, "missing wallet id") + return + } + + if err := gateway.UnloadWallet(id); err != nil { + switch err { + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + default: + wh.Error500(w, err.Error()) + } + } + } +} + +// Encrypts wallet +// URI: /api/v1/wallet/encrypt +// Method: POST +// Args: +// id: wallet id +// password: wallet password +func walletEncryptHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + wh.Error405(w) + return + } + + id := r.FormValue("id") + if id == "" { + wh.Error400(w, "missing wallet id") + return + } + + password := r.FormValue("password") + defer func() { + password = "" + }() + + wlt, err := gateway.EncryptWallet(id, []byte(password)) + if err != nil { + switch err { + case wallet.ErrWalletEncrypted, + wallet.ErrMissingPassword, + wallet.ErrInvalidPassword: + wh.Error400(w, err.Error()) + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + case wallet.ErrWalletNotExist: + wh.Error404(w, "") + default: + wh.Error500(w, err.Error()) + } + return + } + + // Make sure the sensitive data are wiped + rlt, err := NewWalletResponse(wlt) + if err != nil { + wh.Error500(w, err.Error()) + return + } + wh.SendJSONOr500(logger, w, rlt) + } +} + +// Decrypts wallet +// URI: /api/v1/wallet/decrypt +// Method: POST +// Args: +// id: wallet id +// password: wallet password +func walletDecryptHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + wh.Error405(w) + return + } + + id := r.FormValue("id") + if id == "" { + wh.Error400(w, "missing wallet id") + return + } + + password := r.FormValue("password") + defer func() { + password = "" + }() + + wlt, err := gateway.DecryptWallet(id, []byte(password)) + if err != nil { + switch err { + case wallet.ErrMissingPassword, + wallet.ErrWalletNotEncrypted, + wallet.ErrInvalidPassword: + wh.Error400(w, err.Error()) + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + case wallet.ErrWalletNotExist: + wh.Error404(w, "") + default: + wh.Error500(w, err.Error()) + } + return + } + + rlt, err := NewWalletResponse(wlt) + if err != nil { + wh.Error500(w, err.Error()) + return + } + wh.SendJSONOr500(logger, w, rlt) + } +} + +// WalletRecoverRequest is the request data for POST /api/v2/wallet/recover +type WalletRecoverRequest struct { + ID string `json:"id"` + Seed string `json:"seed"` + SeedPassphrase string `json:"seed_passphrase"` + Password string `json:"password"` +} + +// URI: /api/v2/wallet/recover +// Method: POST +// Args: +// id: wallet id +// seed: wallet seed +// password: [optional] new password +// Recovers an encrypted wallet by providing the seed. +// The first address will be generated from seed and compared to the first address +// of the specified wallet. If they match, the wallet will be regenerated +// with an optional password. +// If the wallet is not encrypted, an error is returned. +func walletRecoverHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + resp := NewHTTPErrorResponse(http.StatusMethodNotAllowed, "") + writeHTTPResponse(w, resp) + return + } + + var req WalletRecoverRequest + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + resp := NewHTTPErrorResponse(http.StatusBadRequest, err.Error()) + writeHTTPResponse(w, resp) + return + } + + if req.ID == "" { + resp := NewHTTPErrorResponse(http.StatusBadRequest, "id is required") + writeHTTPResponse(w, resp) + return + } + + if req.Seed == "" { + resp := NewHTTPErrorResponse(http.StatusBadRequest, "seed is required") + writeHTTPResponse(w, resp) + return + } + + var password []byte + if req.Password != "" { + password = []byte(req.Password) + } + + defer func() { + req.Seed = "" + req.SeedPassphrase = "" + req.Password = "" + password = nil + }() + + wlt, err := gateway.RecoverWallet(req.ID, req.Seed, req.SeedPassphrase, password) + if err != nil { + var resp HTTPResponse + switch err.(type) { + case wallet.Error: + switch err { + case wallet.ErrWalletNotExist: + resp = NewHTTPErrorResponse(http.StatusNotFound, "") + case wallet.ErrWalletAPIDisabled: + resp = NewHTTPErrorResponse(http.StatusForbidden, "") + default: + resp = NewHTTPErrorResponse(http.StatusBadRequest, err.Error()) + } + default: + resp = NewHTTPErrorResponse(http.StatusInternalServerError, err.Error()) + } + writeHTTPResponse(w, resp) + return + } + + rlt, err := NewWalletResponse(wlt) + if err != nil { + resp := NewHTTPErrorResponse(http.StatusInternalServerError, err.Error()) + writeHTTPResponse(w, resp) + return + } + + writeHTTPResponse(w, HTTPResponse{ + Data: rlt, + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/api/wallet_test.go b/vendor/github.com/SkycoinProject/skycoin/src/api/wallet_test.go new file mode 100644 index 00000000..e26b142f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/api/wallet_test.go @@ -0,0 +1,2978 @@ +package api + +import ( + "errors" + "io" + "math" + "net/http" + "net/http/httptest" + "net/url" + "strconv" + "strings" + "testing" + + "encoding/json" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/bip39" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/readable" + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/visor" + "github.com/SkycoinProject/skycoin/src/wallet" +) + +func TestGetBalanceHandler(t *testing.T) { + type httpBody struct { + addrs string + } + invalidAddr := "invalidAddr" + validAddr := "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf" + address, err := cipher.DecodeBase58Address(validAddr) + require.NoError(t, err) + tt := []struct { + name string + method string + status int + err string + httpBody *httpBody + getBalanceOfAddrsArg []cipher.Address + getBalanceOfAddrsResponse []wallet.BalancePair + getBalanceOfAddrsError error + httpResponse readable.BalancePair + }{ + { + name: "405", + method: http.MethodDelete, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "400 - invalid address", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - address \"invalidAddr\" is invalid: Invalid base58 character", + httpBody: &httpBody{ + addrs: invalidAddr, + }, + }, + { + name: "400 - no addresses", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - addrs is required", + httpBody: &httpBody{}, + }, + { + name: "500 - GetBalanceOfAddrsError", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gateway.GetBalanceOfAddresses failed: GetBalanceOfAddrsError", + httpBody: &httpBody{ + addrs: validAddr, + }, + getBalanceOfAddrsArg: []cipher.Address{address}, + getBalanceOfAddrsError: errors.New("GetBalanceOfAddrsError"), + }, + { + name: "500 - balance Confirmed coins uint64 addition overflow", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - uint64 addition overflow", + httpBody: &httpBody{ + addrs: validAddr, + }, + getBalanceOfAddrsArg: []cipher.Address{address}, + getBalanceOfAddrsResponse: []wallet.BalancePair{ + { + Confirmed: wallet.Balance{Coins: math.MaxInt64 + 1, Hours: 0}, + Predicted: wallet.Balance{Coins: 0, Hours: 0}, + }, + { + Confirmed: wallet.Balance{Coins: math.MaxInt64 + 1, Hours: 0}, + Predicted: wallet.Balance{Coins: 0, Hours: 0}, + }, + }, + }, + { + name: "500 - balance Predicted coins uint64 addition overflow", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - uint64 addition overflow", + httpBody: &httpBody{ + addrs: validAddr, + }, + getBalanceOfAddrsArg: []cipher.Address{address}, + getBalanceOfAddrsResponse: []wallet.BalancePair{ + { + Confirmed: wallet.Balance{Coins: 0, Hours: 0}, + Predicted: wallet.Balance{Coins: math.MaxInt64 + 1, Hours: 0}, + }, + { + Confirmed: wallet.Balance{Coins: 0, Hours: 0}, + Predicted: wallet.Balance{Coins: math.MaxInt64 + 1, Hours: 0}, + }, + }, + }, + { + name: "200 - OK", + method: http.MethodGet, + status: http.StatusOK, + err: "200 - OK", + httpBody: &httpBody{ + addrs: validAddr, + }, + getBalanceOfAddrsArg: []cipher.Address{address}, + getBalanceOfAddrsResponse: []wallet.BalancePair{ + { + Confirmed: wallet.Balance{Coins: 0, Hours: 0}, + Predicted: wallet.Balance{Coins: 0, Hours: 0}, + }, + { + Confirmed: wallet.Balance{Coins: 0, Hours: 0}, + Predicted: wallet.Balance{Coins: 0, Hours: 0}, + }, + }, + httpResponse: readable.BalancePair{}, + }, + { + name: "200 - OK POST", + method: http.MethodPost, + status: http.StatusOK, + err: "200 - OK", + httpBody: &httpBody{ + addrs: validAddr, + }, + getBalanceOfAddrsArg: []cipher.Address{address}, + getBalanceOfAddrsResponse: []wallet.BalancePair{ + { + Confirmed: wallet.Balance{Coins: 0, Hours: 0}, + Predicted: wallet.Balance{Coins: 0, Hours: 0}, + }, + { + Confirmed: wallet.Balance{Coins: 0, Hours: 0}, + Predicted: wallet.Balance{Coins: 0, Hours: 0}, + }, + }, + httpResponse: readable.BalancePair{}, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &MockGatewayer{} + endpoint := "/api/v1/balance" + gateway.On("GetBalanceOfAddresses", tc.getBalanceOfAddrsArg).Return(tc.getBalanceOfAddrsResponse, tc.getBalanceOfAddrsError) + + v := url.Values{} + if tc.httpBody != nil { + if tc.httpBody.addrs != "" { + v.Add("addrs", tc.httpBody.addrs) + } + } + + var reqBody io.Reader + if len(v) > 0 { + if tc.method == http.MethodPost { + reqBody = strings.NewReader(v.Encode()) + } else { + endpoint += "?" + v.Encode() + } + } + + req, err := http.NewRequest(tc.method, endpoint, reqBody) + require.NoError(t, err) + + if tc.method == http.MethodPost { + req.Header.Set("Content-Type", ContentTypeForm) + } + + rr := httptest.NewRecorder() + + handler := newServerMux(defaultMuxConfig(), gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String())) + } else { + var msg readable.BalancePair + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.httpResponse, msg, tc.name) + } + }) + } +} + +func TestWalletGet(t *testing.T) { + entries, resEntries := makeEntries([]byte("seed"), 5) + type httpBody struct { + WalletID string + Dst string + Coins string + } + + tt := []struct { + name string + method string + body *httpBody + status int + err string + walletID string + gatewayGetWalletResultFunc func(string) wallet.Wallet + responseBody WalletResponse + gatewayGetWalletErr error + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + walletID: "0", + }, + { + name: "400 - no walletID", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - missing wallet id", + walletID: "", + }, + { + name: "400 - error from the `gateway.GetWallet(wltID)`", + method: http.MethodGet, + body: &httpBody{ + WalletID: "123", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - wallet 123 doesn't exist", + walletID: "123", + gatewayGetWalletResultFunc: func(_ string) wallet.Wallet { + var p *wallet.DeterministicWallet + return p + }, + gatewayGetWalletErr: errors.New("wallet 123 doesn't exist"), + }, + { + name: "403 - Forbidden - wallet API disabled", + method: http.MethodGet, + body: &httpBody{ + WalletID: "1234", + }, + status: http.StatusForbidden, + err: "403 Forbidden", + walletID: "1234", + gatewayGetWalletResultFunc: func(_ string) wallet.Wallet { + return &wallet.DeterministicWallet{ + Meta: wallet.Meta{"seed": "seed", "lastSeed": "seed"}, + Entries: []wallet.Entry{}, + } + }, + gatewayGetWalletErr: wallet.ErrWalletAPIDisabled, + }, + { + name: "200 - OK", + method: http.MethodGet, + body: &httpBody{ + WalletID: "1234", + }, + status: http.StatusOK, + walletID: "1234", + gatewayGetWalletResultFunc: func(_ string) wallet.Wallet { + return &wallet.DeterministicWallet{ + Meta: wallet.Meta{"seed": "seed", "lastSeed": "seed"}, + Entries: cloneEntries(entries), + } + }, + responseBody: WalletResponse{Entries: resEntries[:]}, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &MockGatewayer{} + gateway.On("GetWallet", tc.walletID).Return(tc.gatewayGetWalletResultFunc, tc.gatewayGetWalletErr) + + v := url.Values{} + + endpoint := "/api/v1/wallet" + + if tc.body != nil { + if tc.body.WalletID != "" { + v.Add("id", tc.body.WalletID) + } + } + + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + setCSRFParameters(t, tokenValid, req) + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = false + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), + "got `%v`| %d, want `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var rlt WalletResponse + err = json.Unmarshal(rr.Body.Bytes(), &rlt) + require.NoError(t, err) + require.Equal(t, tc.responseBody, rlt) + } + }) + } +} + +func TestWalletBalanceHandler(t *testing.T) { + type httpBody struct { + WalletID string + Dst string + Coins string + } + + type balanceResult struct { + BalancePair wallet.BalancePair + Addresses wallet.AddressBalances + } + + tt := []struct { + name string + method string + body *httpBody + status int + err string + walletID string + gatewayGetWalletBalanceResult balanceResult + gatewayBalanceErr error + result *readable.BalancePair + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + walletID: "0", + }, + { + name: "400 - no walletID", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - missing wallet id", + walletID: "0", + }, + { + name: "404 - gw `wallet doesn't exist` error", + method: http.MethodGet, + body: &httpBody{ + WalletID: "notFoundId", + }, + status: http.StatusNotFound, + err: "404 Not Found", + walletID: "notFoundId", + gatewayGetWalletBalanceResult: balanceResult{}, + gatewayBalanceErr: wallet.ErrWalletNotExist, + result: &readable.BalancePair{ + Confirmed: readable.Balance{Coins: 0, Hours: 0}, + Predicted: readable.Balance{Coins: 0, Hours: 0}, + }, + }, + { + name: "500 - gw other error", + method: http.MethodGet, + body: &httpBody{ + WalletID: "someId", + }, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gatewayBalanceError", + walletID: "someId", + gatewayGetWalletBalanceResult: balanceResult{}, + gatewayBalanceErr: errors.New("gatewayBalanceError"), + result: &readable.BalancePair{ + Confirmed: readable.Balance{Coins: 0, Hours: 0}, + Predicted: readable.Balance{Coins: 0, Hours: 0}, + }, + }, + { + name: "403 - Forbidden - wallet API disabled", + method: http.MethodGet, + body: &httpBody{ + WalletID: "foo", + }, + status: http.StatusForbidden, + err: "403 Forbidden", + walletID: "foo", + gatewayGetWalletBalanceResult: balanceResult{}, + gatewayBalanceErr: wallet.ErrWalletAPIDisabled, + }, + { + name: "200 - OK", + method: http.MethodGet, + body: &httpBody{ + WalletID: "foo", + }, + status: http.StatusOK, + err: "", + walletID: "foo", + result: &readable.BalancePair{}, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &MockGatewayer{} + gateway.On("GetWalletBalance", tc.walletID).Return(tc.gatewayGetWalletBalanceResult.BalancePair, + tc.gatewayGetWalletBalanceResult.Addresses, tc.gatewayBalanceErr) + + endpoint := "/api/v1/wallet/balance" + + v := url.Values{} + if tc.body != nil { + if tc.body.WalletID != "" { + v.Add("id", tc.body.WalletID) + } + } + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + req, err := http.NewRequest(tc.method, endpoint, strings.NewReader(v.Encode())) + require.NoError(t, err) + req.Header.Add("Content-Type", ContentTypeForm) + + setCSRFParameters(t, tokenValid, req) + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = false + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + if status != tc.status { + t.Errorf("got `%v` want `%v`", status, tc.status) + } + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, want `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg readable.BalancePair + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.result, &msg, tc.name) + } + }) + } +} + +func TestUpdateWalletLabelHandler(t *testing.T) { + type httpBody struct { + WalletID string + Label string + } + + tt := []struct { + name string + method string + body *httpBody + status int + err string + walletID string + label string + gatewayUpdateWalletLabelErr error + responseBody string + }{ + { + name: "405", + method: http.MethodGet, + body: &httpBody{}, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "400 - missing wallet id", + method: http.MethodPost, + body: &httpBody{}, + status: http.StatusBadRequest, + err: "400 Bad Request - missing wallet id", + }, + { + name: "400 - missing label", + method: http.MethodPost, + body: &httpBody{ + WalletID: "foo", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - missing label", + walletID: "foo", + }, + { + name: "404 - gateway.UpdateWalletLabel ErrWalletNotExist", + method: http.MethodPost, + body: &httpBody{ + WalletID: "foo", + Label: "label", + }, + status: http.StatusNotFound, + err: "404 Not Found", + walletID: "foo", + label: "label", + gatewayUpdateWalletLabelErr: wallet.ErrWalletNotExist, + }, + { + name: "500 - gateway.UpdateWalletLabel error", + method: http.MethodPost, + body: &httpBody{ + WalletID: "foo", + Label: "label", + }, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gateway.UpdateWalletLabel error", + walletID: "foo", + label: "label", + gatewayUpdateWalletLabelErr: errors.New("gateway.UpdateWalletLabel error"), + }, + { + name: "403 Forbidden - wallet API disabled", + method: http.MethodPost, + body: &httpBody{ + WalletID: "foo", + Label: "label", + }, + status: http.StatusForbidden, + err: "403 Forbidden", + walletID: "foo", + label: "label", + gatewayUpdateWalletLabelErr: wallet.ErrWalletAPIDisabled, + }, + { + name: "200 OK", + method: http.MethodPost, + body: &httpBody{ + WalletID: "foo", + Label: "label", + }, + status: http.StatusOK, + err: "", + walletID: "foo", + label: "label", + gatewayUpdateWalletLabelErr: nil, + responseBody: "\"success\"", + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &MockGatewayer{} + gateway.On("UpdateWalletLabel", tc.walletID, tc.label).Return(tc.gatewayUpdateWalletLabelErr) + + endpoint := "/api/v1/wallet/update" + + v := url.Values{} + if tc.body != nil { + if tc.body.WalletID != "" { + v.Add("id", tc.body.WalletID) + } + if tc.body.Label != "" { + v.Add("label", tc.body.Label) + } + } + + req, err := http.NewRequest(tc.method, endpoint, strings.NewReader(v.Encode())) + require.NoError(t, err) + req.Header.Add("Content-Type", ContentTypeForm) + + setCSRFParameters(t, tokenValid, req) + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = false + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, want `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + require.Equal(t, tc.responseBody, rr.Body.String(), tc.name) + } + }) + } +} + +func TestWalletTransactionsHandler(t *testing.T) { + type httpBody struct { + walletID string + verbose string + } + + uTxn := &visor.UnconfirmedTransaction{ + Transaction: coin.Transaction{ + In: []cipher.SHA256{testutil.RandSHA256(t)}, + }, + } + + unconfirmedTxn, err := readable.NewUnconfirmedTransaction(uTxn) + require.NoError(t, err) + + unconfirmedTxnVerbose, err := readable.NewUnconfirmedTransactionVerbose(uTxn, []visor.TransactionInput{ + visor.TransactionInput{}, + }) + require.NoError(t, err) + + tt := []struct { + name string + method string + body *httpBody + status int + err string + walletID string + verbose bool + gatewayGetWalletUnconfirmedTxnsResult []visor.UnconfirmedTransaction + gatewayGetWalletUnconfirmedTxnsErr error + gatewayGetWalletUnconfirmedTxnsVerboseResult []readable.UnconfirmedTransactionVerbose + gatewayGetWalletUnconfirmedTxnsVerboseErr error + responseBody interface{} + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + + { + name: "400 - missing wallet id", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - missing wallet id", + }, + + { + name: "400 - invalid verbose", + method: http.MethodGet, + status: http.StatusBadRequest, + body: &httpBody{ + verbose: "foo", + }, + err: "400 Bad Request - Invalid value for verbose", + }, + + { + name: "500 - gateway.GetWalletUnconfirmedTransactions error", + method: http.MethodGet, + body: &httpBody{ + walletID: "foo", + }, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gateway.GetWalletUnconfirmedTransactions error", + walletID: "foo", + gatewayGetWalletUnconfirmedTxnsErr: errors.New("gateway.GetWalletUnconfirmedTransactions error"), + }, + + { + name: "500 - gateway.GetWalletUnconfirmedTransactionsVerbose error", + method: http.MethodGet, + body: &httpBody{ + walletID: "foo", + verbose: "1", + }, + verbose: true, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gateway.GetWalletUnconfirmedTransactionsVerbose error", + walletID: "foo", + gatewayGetWalletUnconfirmedTxnsVerboseErr: errors.New("gateway.GetWalletUnconfirmedTransactionsVerbose error"), + }, + + { + name: "404 - wallet doesn't exist", + method: http.MethodGet, + body: &httpBody{ + walletID: "foo", + }, + status: http.StatusNotFound, + err: "404 Not Found", + walletID: "foo", + gatewayGetWalletUnconfirmedTxnsErr: wallet.ErrWalletNotExist, + }, + + { + name: "404 - wallet doesn't exist verbose", + method: http.MethodGet, + body: &httpBody{ + walletID: "foo", + verbose: "1", + }, + verbose: true, + status: http.StatusNotFound, + err: "404 Not Found", + walletID: "foo", + gatewayGetWalletUnconfirmedTxnsVerboseErr: wallet.ErrWalletNotExist, + }, + + { + name: "403 - Forbidden - wallet API disabled", + method: http.MethodGet, + body: &httpBody{ + walletID: "foo", + }, + status: http.StatusForbidden, + err: "403 Forbidden", + walletID: "foo", + gatewayGetWalletUnconfirmedTxnsErr: wallet.ErrWalletAPIDisabled, + }, + + { + name: "403 - Forbidden - wallet API disabled verbose", + method: http.MethodGet, + body: &httpBody{ + walletID: "foo", + verbose: "1", + }, + verbose: true, + status: http.StatusForbidden, + err: "403 Forbidden", + walletID: "foo", + gatewayGetWalletUnconfirmedTxnsVerboseErr: wallet.ErrWalletAPIDisabled, + }, + + { + name: "200 - OK", + method: http.MethodGet, + body: &httpBody{ + walletID: "foo", + }, + status: http.StatusOK, + walletID: "foo", + gatewayGetWalletUnconfirmedTxnsResult: make([]visor.UnconfirmedTransaction, 1), + responseBody: UnconfirmedTxnsResponse{ + Transactions: []readable.UnconfirmedTransactions{ + *unconfirmedTxn, + }, + }, + }, + + { + name: "200 - OK verbose", + method: http.MethodGet, + body: &httpBody{ + walletID: "foo", + verbose: "1", + }, + verbose: true, + status: http.StatusOK, + walletID: "foo", + gatewayGetWalletUnconfirmedTxnsVerboseResult: make([]readable.UnconfirmedTransactionVerbose, 1), + responseBody: UnconfirmedTxnsVerboseResponse{ + Transactions: []readable.UnconfirmedTransactionVerbose{ + *unconfirmedTxnVerbose, + }, + }, + }, + } + + for _, tc := range tt { + gateway := &MockGatewayer{} + gateway.On("GetWalletUnconfirmedTransactions", tc.walletID).Return(tc.gatewayGetWalletUnconfirmedTxnsResult, tc.gatewayGetWalletUnconfirmedTxnsErr) + gateway.On("GetWalletUnconfirmedTransactionsVerbose", tc.walletID).Return(tc.gatewayGetWalletUnconfirmedTxnsVerboseResult, tc.gatewayGetWalletUnconfirmedTxnsVerboseErr) + + endpoint := "/api/v1/wallet/transactions" + + v := url.Values{} + if tc.body != nil { + if tc.body.walletID != "" { + v.Add("id", tc.body.walletID) + } + } + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + setCSRFParameters(t, tokenValid, req) + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = false + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", + tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, want `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + return + } + + if tc.verbose { + var msg UnconfirmedTxnsVerboseResponse + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + // require.Equal on whole response might result in flaky tests as there is a time field attached to unconfirmed txn response + require.IsType(t, msg, tc.responseBody) + require.Len(t, msg.Transactions, 1) + require.Equal(t, msg.Transactions[0].Transaction, tc.responseBody.(UnconfirmedTxnsVerboseResponse).Transactions[0].Transaction) + } else { + var msg UnconfirmedTxnsResponse + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + // require.Equal on whole response might result in flaky tests as there is a time field attached to unconfirmed txn response + require.IsType(t, msg, tc.responseBody) + require.Len(t, msg.Transactions, 1) + require.Equal(t, msg.Transactions[0].Transaction, tc.responseBody.(UnconfirmedTxnsResponse).Transactions[0].Transaction) + } + } +} + +func TestWalletCreateHandler(t *testing.T) { + entries, responseEntries := makeEntries([]byte("seed"), 5) + type httpBody struct { + Seed string + Label string + ScanN string + Encrypt bool + Password string + Type string + SeedPassphrase string + Bip44Coin string + XPub string + } + tt := []struct { + name string + method string + body *httpBody + status int + err string + wltName string + options wallet.Options + gatewayCreateWalletResult func(string, wallet.Options, wallet.TransactionsFinder) wallet.Wallet + gatewayCreateWalletErr error + responseBody WalletResponse + csrfDisabled bool + }{ + { + name: "405", + method: http.MethodGet, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + wltName: "foo", + }, + { + name: "400 - missing type", + method: http.MethodPost, + body: &httpBody{}, + status: http.StatusBadRequest, + err: "400 Bad Request - missing type", + wltName: "foo", + }, + { + name: "400 - missing seed", + method: http.MethodPost, + body: &httpBody{ + Type: wallet.WalletTypeDeterministic, + }, + status: http.StatusBadRequest, + err: "400 Bad Request - missing seed", + wltName: "foo", + }, + { + name: "400 - missing label", + method: http.MethodPost, + body: &httpBody{ + Type: wallet.WalletTypeDeterministic, + Seed: "foo", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - missing label", + wltName: "foo", + }, + { + name: "400 - invalid scan value", + method: http.MethodPost, + body: &httpBody{ + Type: wallet.WalletTypeDeterministic, + Seed: "foo", + Label: "bar", + ScanN: "bad scanN", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid scan value", + wltName: "foo", + }, + { + name: "400 - scan must be > 0", + method: http.MethodPost, + body: &httpBody{ + Type: wallet.WalletTypeDeterministic, + Seed: "foo", + Label: "bar", + ScanN: "0", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - scan must be > 0", + wltName: "foo", + }, + { + name: "400 - invalid bip44 coin", + method: http.MethodPost, + body: &httpBody{ + Type: wallet.WalletTypeBip44, + Seed: bip39.MustNewDefaultMnemonic(), + Label: "bar", + ScanN: "1", + Bip44Coin: "foo", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid bip44-coin value", + wltName: "foo", + }, + { + name: "400 - invalid bip44 coin 2", + method: http.MethodPost, + body: &httpBody{ + Type: wallet.WalletTypeBip44, + Seed: bip39.MustNewDefaultMnemonic(), + Label: "bar", + ScanN: "1", + Bip44Coin: "4294967296", // MaxUint32+1: Bip44Coin must be uint32 + }, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid bip44-coin value", + wltName: "foo", + }, + { + name: "400 - bip44 coin does not match type", + method: http.MethodPost, + body: &httpBody{ + Type: wallet.WalletTypeDeterministic, + Seed: bip39.MustNewDefaultMnemonic(), + Label: "bar", + ScanN: "1", + Bip44Coin: "8000", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - bip44-coin is only valid for bip44 type wallets", + wltName: "foo", + }, + { + name: "400 - seed in use", + method: http.MethodPost, + body: &httpBody{ + Type: wallet.WalletTypeDeterministic, + Seed: "foo", + Label: "bar", + ScanN: "1", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - a wallet already exists with this seed", + options: wallet.Options{ + Type: wallet.WalletTypeDeterministic, + Label: "bar", + Seed: "foo", + Password: []byte{}, + }, + gatewayCreateWalletErr: wallet.ErrSeedUsed, + gatewayCreateWalletResult: func(_ string, _ wallet.Options, _ wallet.TransactionsFinder) wallet.Wallet { + var p *wallet.DeterministicWallet + return p + }, + }, + { + name: "500 - gateway.CreateWallet error", + method: http.MethodPost, + body: &httpBody{ + Type: wallet.WalletTypeDeterministic, + Seed: "foo", + Label: "bar", + ScanN: "1", + }, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gateway.CreateWallet error", + options: wallet.Options{ + Type: wallet.WalletTypeDeterministic, + Label: "bar", + Seed: "foo", + Password: []byte{}, + }, + gatewayCreateWalletErr: errors.New("gateway.CreateWallet error"), + gatewayCreateWalletResult: func(_ string, _ wallet.Options, _ wallet.TransactionsFinder) wallet.Wallet { + var p *wallet.DeterministicWallet + return p + }, + }, + { + name: "403 - Forbidden - wallet API disabled", + method: http.MethodPost, + body: &httpBody{ + Type: wallet.WalletTypeDeterministic, + Seed: "foo", + Label: "bar", + ScanN: "2", + }, + status: http.StatusForbidden, + err: "403 Forbidden", + wltName: "filename", + options: wallet.Options{ + Type: wallet.WalletTypeDeterministic, + Label: "bar", + Seed: "foo", + Password: []byte{}, + ScanN: 2, + }, + gatewayCreateWalletErr: wallet.ErrWalletAPIDisabled, + gatewayCreateWalletResult: func(_ string, _ wallet.Options, _ wallet.TransactionsFinder) wallet.Wallet { + var p *wallet.DeterministicWallet + return p + }, + }, + { + name: "200 - OK", + method: http.MethodPost, + body: &httpBody{ + Type: wallet.WalletTypeDeterministic, + Seed: "foo", + Label: "bar", + ScanN: "2", + }, + status: http.StatusOK, + err: "", + wltName: "filename", + options: wallet.Options{ + Type: wallet.WalletTypeDeterministic, + Label: "bar", + Seed: "foo", + Password: []byte{}, + ScanN: 2, + }, + gatewayCreateWalletResult: func(_ string, _ wallet.Options, _ wallet.TransactionsFinder) wallet.Wallet { + return &wallet.DeterministicWallet{ + Meta: wallet.Meta{ + "filename": "filename", + }, + Entries: cloneEntries(entries), + } + }, + responseBody: WalletResponse{ + Meta: readable.WalletMeta{ + Filename: "filename", + }, + Entries: responseEntries[:], + }, + }, + { + name: "200 - OK - with seed passphrase", + method: http.MethodPost, + body: &httpBody{ + Type: wallet.WalletTypeBip44, + Seed: "foo", + Label: "bar", + ScanN: "2", + SeedPassphrase: "foobar", + }, + status: http.StatusOK, + err: "", + wltName: "filename", + options: wallet.Options{ + Type: wallet.WalletTypeBip44, + Label: "bar", + Seed: "foo", + Password: []byte{}, + ScanN: 2, + SeedPassphrase: "foobar", + }, + gatewayCreateWalletResult: func(_ string, _ wallet.Options, _ wallet.TransactionsFinder) wallet.Wallet { + return &wallet.DeterministicWallet{ + Meta: wallet.Meta{ + "filename": "filename", + }, + Entries: cloneEntries(entries), + } + }, + responseBody: WalletResponse{ + Meta: readable.WalletMeta{ + Filename: "filename", + }, + Entries: responseEntries[:], + }, + }, + { + name: "200 - OK - xpub", + method: http.MethodPost, + body: &httpBody{ + Type: wallet.WalletTypeXPub, + Label: "bar", + ScanN: "2", + XPub: "xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8", + }, + status: http.StatusOK, + err: "", + wltName: "filename", + options: wallet.Options{ + Type: wallet.WalletTypeXPub, + Label: "bar", + Password: []byte{}, + ScanN: 2, + XPub: "xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8", + }, + gatewayCreateWalletResult: func(_ string, _ wallet.Options, _ wallet.TransactionsFinder) wallet.Wallet { + return &wallet.DeterministicWallet{ + Meta: wallet.Meta{ + "filename": "filename", + }, + Entries: cloneEntries(entries), + } + }, + responseBody: WalletResponse{ + Meta: readable.WalletMeta{ + Filename: "filename", + }, + Entries: responseEntries[:], + }, + }, + // CSRF Tests + { + name: "200 - OK - CSRF disabled", + method: http.MethodPost, + body: &httpBody{ + Type: wallet.WalletTypeDeterministic, + Seed: "foo", + Label: "bar", + ScanN: "2", + }, + status: http.StatusOK, + err: "", + wltName: "filename", + options: wallet.Options{ + Type: wallet.WalletTypeDeterministic, + Label: "bar", + Seed: "foo", + Password: []byte{}, + ScanN: 2, + }, + gatewayCreateWalletResult: func(_ string, _ wallet.Options, _ wallet.TransactionsFinder) wallet.Wallet { + return &wallet.DeterministicWallet{ + Meta: wallet.Meta{ + "filename": "filename", + }, + } + }, + responseBody: WalletResponse{ + Meta: readable.WalletMeta{ + Filename: "filename", + }, + Entries: []readable.WalletEntry{}, + }, + csrfDisabled: true, + }, + { + name: "200 - OK - Encrypted", + method: http.MethodPost, + body: &httpBody{ + Type: wallet.WalletTypeDeterministic, + Seed: "foo", + Label: "bar", + Encrypt: true, + Password: "pwd", + ScanN: "2", + }, + status: http.StatusOK, + err: "", + wltName: "filename", + options: wallet.Options{ + Type: wallet.WalletTypeDeterministic, + Label: "bar", + Seed: "foo", + Encrypt: true, + Password: []byte("pwd"), + ScanN: 2, + }, + gatewayCreateWalletResult: func(_ string, _ wallet.Options, _ wallet.TransactionsFinder) wallet.Wallet { + return &wallet.DeterministicWallet{ + Meta: wallet.Meta{ + "filename": "filename", + "label": "bar", + "encrypted": "true", + "secrets": "secrets", + }, + } + }, + responseBody: WalletResponse{ + Meta: readable.WalletMeta{ + Filename: "filename", + Label: "bar", + Encrypted: true, + }, + Entries: []readable.WalletEntry{}, + }, + }, + { + name: "400 Bad request - encrypt without password", + method: http.MethodPost, + body: &httpBody{ + Type: wallet.WalletTypeDeterministic, + Seed: "foo", + Label: "bar", + Encrypt: true, + }, + status: http.StatusBadRequest, + err: "400 Bad Request - missing password", + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &MockGatewayer{} + if tc.options.ScanN == 0 { + tc.options.ScanN = 1 + } + gateway.On("CreateWallet", "", tc.options, gateway).Return(tc.gatewayCreateWalletResult, tc.gatewayCreateWalletErr) + + endpoint := "/api/v1/wallet/create" + + v := url.Values{} + if tc.body != nil { + if tc.body.Seed != "" { + v.Add("seed", tc.body.Seed) + } + if tc.body.Label != "" { + v.Add("label", tc.body.Label) + } + if tc.body.ScanN != "" { + v.Add("scan", tc.body.ScanN) + } + + if tc.body.Encrypt { + v.Add("encrypt", strconv.FormatBool(tc.body.Encrypt)) + } + + if tc.body.Password != "" { + v.Add("password", tc.body.Password) + } + + if tc.body.Type != "" { + v.Add("type", tc.body.Type) + } + + if tc.body.SeedPassphrase != "" { + v.Add("seed-passphrase", tc.body.SeedPassphrase) + } + + if tc.body.Bip44Coin != "" { + v.Add("bip44-coin", tc.body.Bip44Coin) + } + + if tc.body.XPub != "" { + v.Add("xpub", tc.body.XPub) + } + } + + req, err := http.NewRequest(tc.method, endpoint, strings.NewReader(v.Encode())) + req.Header.Add("Content-Type", ContentTypeForm) + require.NoError(t, err) + + if tc.csrfDisabled { + setCSRFParameters(t, tokenInvalid, req) + } else { + setCSRFParameters(t, tokenValid, req) + } + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = tc.csrfDisabled + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + body := strings.TrimSpace(rr.Body.String()) + require.Equal(t, tc.err, body, "got `%v`| %d, want `%v`", body, status, tc.err) + return + } + + var msg WalletResponse + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.responseBody, msg, tc.name) + }) + } +} + +func TestWalletNewSeed(t *testing.T) { + type httpBody struct { + Entropy string + } + tt := []struct { + name string + method string + body *httpBody + status int + err string + entropy string + resultLen int + }{ + { + name: "405", + method: http.MethodPut, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "400 - invalid entropy type", + method: http.MethodGet, + body: &httpBody{ + Entropy: "xx", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid entropy", + entropy: "xx", + }, + { + name: "400 - `wrong entropy length` error", + method: http.MethodGet, + body: &httpBody{ + Entropy: "200", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - entropy length must be 128 or 256", + entropy: "200", + }, + { + name: "200 - OK with no entropy", + method: http.MethodGet, + body: &httpBody{}, + status: http.StatusOK, + entropy: "128", + resultLen: 12, + }, + { + name: "200 - OK | 12 word seed", + method: http.MethodGet, + body: &httpBody{ + Entropy: "128", + }, + status: http.StatusOK, + entropy: "128", + resultLen: 12, + }, + { + name: "200 - OK | 24 word seed", + method: http.MethodGet, + body: &httpBody{ + Entropy: "256", + }, + status: http.StatusOK, + entropy: "256", + resultLen: 24, + }, + } + + // Loop over each test case + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &MockGatewayer{} + + endpoint := "/api/v1/wallet/newSeed" + + // Add request parameters to url + v := url.Values{} + if tc.body != nil { + if tc.body.Entropy != "" { + v.Add("entropy", tc.body.Entropy) + } + } + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + + req, err := http.NewRequest(tc.method, endpoint, strings.NewReader(v.Encode())) + require.NoError(t, err) + req.Header.Add("Content-Type", ContentTypeForm) + + setCSRFParameters(t, tokenValid, req) + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = false + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` expected `%v`", tc.name, status, tc.status) + if status != tc.status { + t.Errorf("got `%v` want `%v`", status, tc.status) + } + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, expected `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg struct { + Seed string `json:"seed"` + } + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + // check that expected length is equal to response length + require.Equal(t, tc.resultLen, len(strings.Fields(msg.Seed)), tc.name) + } + }) + } +} + +func TestVerifySeed(t *testing.T) { + cases := []struct { + name string + method string + status int + contentType string + csrfDisabled bool + httpBody string + httpResponse HTTPResponse + }{ + { + name: "405", + method: http.MethodGet, + status: http.StatusMethodNotAllowed, + httpResponse: NewHTTPErrorResponse(http.StatusMethodNotAllowed, ""), + }, + + { + name: "415 - Unsupported Media Type", + method: http.MethodPost, + contentType: ContentTypeForm, + status: http.StatusUnsupportedMediaType, + httpResponse: NewHTTPErrorResponse(http.StatusUnsupportedMediaType, ""), + }, + + { + name: "400 - EOF", + method: http.MethodPost, + contentType: ContentTypeJSON, + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "EOF"), + }, + { + name: "400 - Missing Seed", + method: http.MethodPost, + contentType: ContentTypeJSON, + status: http.StatusBadRequest, + httpBody: "{}", + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "seed is required"), + }, + { + name: "400 - Invalid seed", + method: http.MethodPost, + contentType: ContentTypeJSON, + status: http.StatusUnprocessableEntity, + httpBody: toJSON(t, VerifySeedRequest{ + Seed: "bag attitude butter flock slab desk ship brain famous scheme clerk", + }), + httpResponse: NewHTTPErrorResponse(http.StatusUnprocessableEntity, bip39.ErrInvalidNumberOfWords.Error()), + }, + { + name: "200", + method: http.MethodPost, + status: http.StatusOK, + httpBody: toJSON(t, VerifySeedRequest{ + Seed: "chief stadium sniff exhibit ostrich exit fruit noodle good lava coin supply", + }), + httpResponse: HTTPResponse{Data: struct{}{}}, + }, + { + name: "200 - csrf disabled", + method: http.MethodPost, + status: http.StatusOK, + httpBody: toJSON(t, VerifySeedRequest{ + Seed: "chief stadium sniff exhibit ostrich exit fruit noodle good lava coin supply", + }), + httpResponse: HTTPResponse{Data: struct{}{}}, + csrfDisabled: true, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v2/wallet/seed/verify" + gateway := &MockGatewayer{} + + req, err := http.NewRequest(tc.method, endpoint, strings.NewReader(tc.httpBody)) + require.NoError(t, err) + + contentType := tc.contentType + if contentType == "" { + contentType = ContentTypeJSON + } + + req.Header.Set("Content-Type", contentType) + + if tc.csrfDisabled { + setCSRFParameters(t, tokenInvalid, req) + } else { + setCSRFParameters(t, tokenValid, req) + } + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = tc.csrfDisabled + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + var rsp ReceivedHTTPResponse + err = json.Unmarshal(rr.Body.Bytes(), &rsp) + require.NoError(t, err) + + require.Equal(t, tc.httpResponse.Error, rsp.Error) + + if rsp.Data == nil { + require.Nil(t, tc.httpResponse.Data) + } else { + require.NotNil(t, tc.httpResponse.Data) + + var addrRsp struct{} + err := json.Unmarshal(rsp.Data, &addrRsp) + require.NoError(t, err) + + require.Equal(t, tc.httpResponse.Data, addrRsp) + } + + }) + } +} + +func TestGetWalletSeed(t *testing.T) { + tt := []struct { + name string + method string + wltID string + password string + gatewayReturnArgs []interface{} + expectStatus int + expectSeed string + expectSeedPassphrase string + expectErr string + csrfDisabled bool + }{ + { + name: "200 - OK", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturnArgs: []interface{}{ + "seed", + "seed-passphrase", + nil, + }, + expectStatus: http.StatusOK, + expectSeed: "seed", + expectSeedPassphrase: "seed-passphrase", + }, + { + name: "200 - OK - CSRF disabled", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturnArgs: []interface{}{ + "seed", + "", + nil, + }, + expectStatus: http.StatusOK, + expectSeed: "seed", + expectSeedPassphrase: "", + csrfDisabled: true, + }, + { + name: "400 - missing wallet id ", + method: http.MethodPost, + wltID: "", + password: "pwd", + gatewayReturnArgs: []interface{}{ + "seed", + "", + nil, + }, + expectStatus: http.StatusBadRequest, + expectErr: "400 Bad Request - missing wallet id", + }, + { + name: "400 - missing password", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "", + gatewayReturnArgs: []interface{}{ + "", + "", + wallet.ErrMissingPassword, + }, + expectStatus: http.StatusBadRequest, + expectErr: "400 Bad Request - missing password", + }, + { + name: "400 Bad Request - Invalid password", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturnArgs: []interface{}{ + "", + "", + wallet.ErrInvalidPassword, + }, + expectStatus: http.StatusBadRequest, + expectErr: "400 Bad Request - invalid password", + }, + { + name: "400 - wallet not encrypted", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturnArgs: []interface{}{ + "", + "", + wallet.ErrWalletNotEncrypted, + }, + expectStatus: http.StatusBadRequest, + expectErr: "400 Bad Request - wallet is not encrypted", + }, + { + name: "404 - wallet does not exist", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturnArgs: []interface{}{ + "", + "", + wallet.ErrWalletNotExist, + }, + expectStatus: http.StatusNotFound, + expectErr: "404 Not Found", + }, + { + name: "405 - Method Not Allowed", + method: http.MethodGet, + expectStatus: http.StatusMethodNotAllowed, + expectErr: "405 Method Not Allowed", + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &MockGatewayer{} + gateway.On("GetWalletSeed", tc.wltID, []byte(tc.password)).Return(tc.gatewayReturnArgs...) + + endpoint := "/api/v1/wallet/seed" + + v := url.Values{} + v.Add("id", tc.wltID) + if len(tc.password) > 0 { + v.Add("password", tc.password) + } + + req, err := http.NewRequest(tc.method, endpoint, strings.NewReader(v.Encode())) + require.NoError(t, err) + req.Header.Add("Content-Type", ContentTypeForm) + + setCSRFParameters(t, tokenValid, req) + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = false + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.expectStatus, status) + + if status != http.StatusOK { + require.Equal(t, tc.expectErr, strings.TrimSpace(rr.Body.String())) + } else { + var r WalletSeedResponse + err := json.Unmarshal(rr.Body.Bytes(), &r) + require.NoError(t, err) + require.Equal(t, tc.expectSeed, r.Seed) + require.Equal(t, tc.expectSeedPassphrase, r.SeedPassphrase) + } + }) + } +} + +func TestWalletNewAddressesHandler(t *testing.T) { + type httpBody struct { + ID string + Num string + Password string + } + type Addresses struct { + Address []string `json:"addresses"` + } + + var responseAddresses = Addresses{} + var responseEmptyAddresses = Addresses{} + + var emptyAddrs = make([]cipher.Address, 0) + var addrs = make([]cipher.Address, 3) + + for i := 0; i < 3; i++ { + pub, _ := cipher.MustGenerateDeterministicKeyPair(cipher.RandByte(32)) + addrs[i] = cipher.AddressFromPubKey(pub) + responseAddresses.Address = append(responseAddresses.Address, addrs[i].String()) + } + + tt := []struct { + name string + method string + body *httpBody + status int + err string + walletID string + n uint64 + password string + gatewayNewAddressesResult []cipher.Address + gatewayNewAddressesErr error + responseBody Addresses + csrfDisabled bool + }{ + { + name: "405", + method: http.MethodGet, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "400 - missing wallet id", + method: http.MethodPost, + status: http.StatusBadRequest, + err: "400 Bad Request - missing wallet id", + }, + { + name: "400 - invalid num value", + method: http.MethodPost, + body: &httpBody{ + ID: "foo", + Num: "bar", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid num value", + }, + { + name: "400 - gateway.NewAddresses error", + method: http.MethodPost, + body: &httpBody{ + ID: "foo", + Num: "1", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - gateway.NewAddresses error", + walletID: "foo", + n: 1, + gatewayNewAddressesErr: errors.New("gateway.NewAddresses error"), + }, + { + name: "403 - Forbidden - wallet API disabled", + method: http.MethodPost, + body: &httpBody{ + ID: "foo", + Num: "1", + }, + status: http.StatusForbidden, + err: "403 Forbidden", + walletID: "foo", + n: 1, + gatewayNewAddressesErr: wallet.ErrWalletAPIDisabled, + }, + { + name: "400 Bad Request - missing password", + method: http.MethodPost, + body: &httpBody{ + ID: "foo", + Num: "1", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - missing password", + walletID: "foo", + n: 1, + gatewayNewAddressesErr: wallet.ErrMissingPassword, + }, + { + name: "400 Bad Request - Invalid password", + method: http.MethodPost, + body: &httpBody{ + ID: "foo", + Num: "1", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid password", + walletID: "foo", + n: 1, + gatewayNewAddressesErr: wallet.ErrInvalidPassword, + }, + { + name: "400 Bad Request - permission denied", + method: http.MethodPost, + body: &httpBody{ + ID: "foo", + Num: "1", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - saving wallet permission denied", + walletID: "foo", + n: 1, + gatewayNewAddressesErr: wallet.ErrWalletPermission, + }, + { + name: "200 - OK", + method: http.MethodPost, + body: &httpBody{ + ID: "foo", + Num: "1", + }, + status: http.StatusOK, + walletID: "foo", + n: 1, + gatewayNewAddressesResult: addrs, + responseBody: responseAddresses, + }, + { + name: "200 - OK with password", + method: http.MethodPost, + body: &httpBody{ + ID: "foo", + Num: "1", + Password: "pwd", + }, + status: http.StatusOK, + walletID: "foo", + n: 1, + gatewayNewAddressesResult: addrs, + responseBody: responseAddresses, + }, + { + name: "200 - OK empty addresses", + method: http.MethodPost, + body: &httpBody{ + ID: "foo", + Num: "0", + }, + status: http.StatusOK, + walletID: "foo", + n: 0, + gatewayNewAddressesResult: emptyAddrs, + responseBody: responseEmptyAddresses, + }, + { + name: "200 - OK - CSRF disabled", + method: http.MethodPost, + body: &httpBody{ + ID: "foo", + Num: "1", + }, + status: http.StatusOK, + walletID: "foo", + n: 1, + gatewayNewAddressesResult: addrs, + responseBody: responseAddresses, + csrfDisabled: true, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &MockGatewayer{} + gateway.On("NewAddresses", tc.walletID, []byte(tc.password), tc.n).Return(tc.gatewayNewAddressesResult, tc.gatewayNewAddressesErr) + + endpoint := "/api/v1/wallet/newAddress" + + v := url.Values{} + if tc.body != nil { + if tc.body.ID != "" { + v.Add("id", tc.body.ID) + } + if tc.body.Num != "" { + v.Add("num", tc.body.Num) + } + } + + req, err := http.NewRequest(tc.method, endpoint, strings.NewReader(v.Encode())) + require.NoError(t, err) + req.Header.Add("Content-Type", ContentTypeForm) + + if tc.csrfDisabled { + setCSRFParameters(t, tokenInvalid, req) + } else { + setCSRFParameters(t, tokenValid, req) + } + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = tc.csrfDisabled + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "wrong status code: got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, want `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg Addresses + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.responseBody, msg, tc.name) + } + }) + } +} + +func TestGetWalletFolderHandler(t *testing.T) { + tt := []struct { + name string + method string + status int + err string + getWalletDirResponse string + getWalletDirErr error + httpResponse WalletFolder + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + getWalletDirResponse: "/wallet/folder/address", + httpResponse: WalletFolder{ + Address: "/wallet/folder/address", + }, + }, + { + name: "403 - wallet API disabled", + method: http.MethodGet, + status: http.StatusForbidden, + err: "403 Forbidden", + getWalletDirErr: wallet.ErrWalletAPIDisabled, + }, + } + + for _, tc := range tt { + gateway := &MockGatewayer{} + gateway.On("WalletDir").Return(tc.getWalletDirResponse, tc.getWalletDirErr) + + endpoint := "/api/v1/wallets/folderName" + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + setCSRFParameters(t, tokenValid, req) + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = false + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", + tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, want `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg WalletFolder + err := json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.httpResponse, msg, tc.name) + } + } +} + +func TestGetWallets(t *testing.T) { + var pubkeys []cipher.PubKey + var seckeys []cipher.SecKey + var addrs []cipher.Address + + for i := 0; i < 4; i++ { + pubkey, seckey := cipher.GenerateKeyPair() + addr := cipher.AddressFromPubKey(pubkey) + pubkeys = append(pubkeys, pubkey) + seckeys = append(seckeys, seckey) + addrs = append(addrs, addr) + } + + cases := []struct { + name string + method string + status int + err string + getWalletsResponse wallet.Wallets + getWalletsErr error + httpResponse []*WalletResponse + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "403 - wallet API disabled", + method: http.MethodGet, + status: http.StatusForbidden, + err: "403 Forbidden", + getWalletsErr: wallet.ErrWalletAPIDisabled, + }, + { + name: "200 no wallets", + method: http.MethodGet, + status: http.StatusOK, + getWalletsResponse: nil, + httpResponse: []*WalletResponse{}, + }, + { + name: "200 no wallets 2", + method: http.MethodGet, + status: http.StatusOK, + getWalletsResponse: wallet.Wallets{}, + httpResponse: []*WalletResponse{}, + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + getWalletsResponse: wallet.Wallets{ + "foofilename": &wallet.DeterministicWallet{ + Meta: wallet.Meta{ + "foo": "bar", + "seed": "fooseed", + "lastSeed": "foolastseed", + "coin": "foocoin", + "filename": "foofilename", + "label": "foolabel", + "type": "footype", + "version": "fooversion", + "cryptoType": "foocryptotype", + "tm": "345678", + "encrypted": "true", + }, + Entries: []wallet.Entry{ + { + Address: addrs[0], + Public: pubkeys[0], + Secret: seckeys[0], + }, + }, + }, + "foofilename2": &wallet.DeterministicWallet{ + Meta: wallet.Meta{ + "foo": "bar2", + "seed": "fooseed2", + "lastSeed": "foolastseed2", + "coin": "foocoin", + "filename": "foofilename2", + "label": "foolabel2", + "type": "footype", + "version": "fooversion", + "cryptoType": "foocryptotype", + "tm": "123456", + "encrypted": "false", + }, + Entries: []wallet.Entry{ + { + Address: addrs[1], + Public: pubkeys[1], + Secret: seckeys[1], + }, + }, + }, + "foofilename3": &wallet.DeterministicWallet{ + Meta: wallet.Meta{ + "foo": "bar3", + "seed": "fooseed3", + "lastSeed": "foolastseed3", + "coin": "foocoin", + "filename": "foofilename3", + "label": "foolabel3", + "type": "footype", + "version": "fooversion", + "cryptoType": "foocryptotype", + "tm": "234567", + "encrypted": "true", + }, + Entries: []wallet.Entry{ + { + Address: addrs[2], + Public: pubkeys[2], + Secret: seckeys[2], + }, + { + Address: addrs[3], + Public: pubkeys[3], + Secret: seckeys[3], + }, + }, + }, + }, + httpResponse: []*WalletResponse{ + { + Meta: readable.WalletMeta{ + Coin: "foocoin", + Filename: "foofilename2", + Label: "foolabel2", + Type: "footype", + Version: "fooversion", + CryptoType: "foocryptotype", + Timestamp: 123456, + Encrypted: false, + }, + Entries: []readable.WalletEntry{ + { + Address: addrs[1].String(), + Public: pubkeys[1].Hex(), + }, + }, + }, + { + Meta: readable.WalletMeta{ + Coin: "foocoin", + Filename: "foofilename3", + Label: "foolabel3", + Type: "footype", + Version: "fooversion", + CryptoType: "foocryptotype", + Timestamp: 234567, + Encrypted: true, + }, + Entries: []readable.WalletEntry{ + { + Address: addrs[2].String(), + Public: pubkeys[2].Hex(), + }, + { + Address: addrs[3].String(), + Public: pubkeys[3].Hex(), + }, + }, + }, + { + Meta: readable.WalletMeta{ + Coin: "foocoin", + Filename: "foofilename", + Label: "foolabel", + Type: "footype", + Version: "fooversion", + CryptoType: "foocryptotype", + Timestamp: 345678, + Encrypted: true, + }, + Entries: []readable.WalletEntry{ + { + Address: addrs[0].String(), + Public: pubkeys[0].Hex(), + }, + }, + }, + }, + }, + } + + for _, tc := range cases { + gateway := &MockGatewayer{} + gateway.On("GetWallets").Return(tc.getWalletsResponse, tc.getWalletsErr) + + endpoint := "/api/v1/wallets" + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + setCSRFParameters(t, tokenValid, req) + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = false + + handler := newServerMux(cfg, gateway) + + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", + tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, want `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg []*WalletResponse + err := json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.NotNil(t, msg) + require.Equal(t, tc.httpResponse, msg, tc.name) + } + } +} + +func TestWalletUnloadHandler(t *testing.T) { + tt := []struct { + name string + method string + status int + err string + walletID string + unloadWalletErr error + csrfDisabled bool + }{ + { + name: "405", + method: http.MethodGet, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + walletID: "wallet.wlt", + }, + { + name: "400 - missing wallet id", + method: http.MethodPost, + status: http.StatusBadRequest, + err: "400 Bad Request - missing wallet id", + }, + { + name: "403 - Forbidden - wallet API disabled", + method: http.MethodPost, + status: http.StatusForbidden, + err: "403 Forbidden", + walletID: "wallet.wlt", + unloadWalletErr: wallet.ErrWalletAPIDisabled, + }, + { + name: "200 - ok", + method: http.MethodPost, + status: http.StatusOK, + walletID: "wallet.wlt", + }, + { + name: "200 - ok, csrf disabled", + method: http.MethodPost, + status: http.StatusOK, + walletID: "wallet.wlt", + csrfDisabled: true, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &MockGatewayer{} + gateway.On("UnloadWallet", tc.walletID).Return(tc.unloadWalletErr) + + endpoint := "/api/v1/wallet/unload" + v := url.Values{} + v.Add("id", tc.walletID) + + req, err := http.NewRequest(tc.method, endpoint, strings.NewReader(v.Encode())) + require.NoError(t, err) + req.Header.Add("Content-Type", ContentTypeForm) + + if tc.csrfDisabled { + setCSRFParameters(t, tokenInvalid, req) + } else { + setCSRFParameters(t, tokenValid, req) + } + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = tc.csrfDisabled + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "wrong status code: got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "got `%v`| %d, want `%v`", + strings.TrimSpace(rr.Body.String()), status, tc.err) + } + }) + } +} + +func TestEncryptWallet(t *testing.T) { + entries, responseEntries := makeEntries([]byte("seed"), 5) + type gatewayReturnPair struct { + w wallet.Wallet + err error + } + tt := []struct { + name string + method string + wltID string + password string + gatewayReturn gatewayReturnPair + status int + expectWallet WalletResponse + expectErr string + }{ + { + name: "200 - OK", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturn: gatewayReturnPair{ + w: &wallet.DeterministicWallet{ + Meta: wallet.Meta{ + "filename": "wallet.wlt", + "seed": "seed", + "lastSeed": "lastSeed", + "secrets": "secrets", + "encrypted": "true", + }, + Entries: cloneEntries(entries), + }, + }, + status: http.StatusOK, + expectWallet: WalletResponse{ + Meta: readable.WalletMeta{ + Filename: "wallet.wlt", + Encrypted: true, + }, + Entries: responseEntries, + }, + }, + { + name: "403 Forbidden", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturn: gatewayReturnPair{ + err: wallet.ErrWalletAPIDisabled, + }, + status: http.StatusForbidden, + expectErr: "403 Forbidden", + }, + { + name: "405 Method Not Allowed", + method: http.MethodGet, + wltID: "wallet.wlt", + password: "pwd", + status: http.StatusMethodNotAllowed, + expectErr: "405 Method Not Allowed", + }, + { + name: "400 - Missing Password", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "", + gatewayReturn: gatewayReturnPair{ + err: wallet.ErrMissingPassword, + }, + status: http.StatusBadRequest, + expectErr: "400 Bad Request - missing password", + }, + { + name: "400 - Missing Wallet Id", + method: http.MethodPost, + wltID: "", + status: http.StatusBadRequest, + expectErr: "400 Bad Request - missing wallet id", + }, + { + name: "400 Bad Request - Invalid Password", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturn: gatewayReturnPair{ + err: wallet.ErrInvalidPassword, + }, + status: http.StatusBadRequest, + expectErr: "400 Bad Request - invalid password", + }, + { + name: "404 - Wallet Not Found", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturn: gatewayReturnPair{ + err: wallet.ErrWalletNotExist, + }, + status: http.StatusNotFound, + expectErr: "404 Not Found", + }, + { + name: "400 - Wallet Is Encrypted", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturn: gatewayReturnPair{ + err: wallet.ErrWalletEncrypted, + }, + status: http.StatusBadRequest, + expectErr: "400 Bad Request - wallet is encrypted", + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &MockGatewayer{} + gateway.On("EncryptWallet", tc.wltID, []byte(tc.password)).Return(tc.gatewayReturn.w, tc.gatewayReturn.err) + + endpoint := "/api/v1/wallet/encrypt" + v := url.Values{} + v.Add("id", tc.wltID) + v.Add("password", tc.password) + + req, err := http.NewRequest(tc.method, endpoint, strings.NewReader(v.Encode())) + require.NoError(t, err) + req.Header.Add("Content-Type", ContentTypeForm) + + setCSRFParameters(t, tokenValid, req) + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = false + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "wrong status code: got `%v` want `%v`, body: %v", status, tc.status, rr.Body.String()) + + if status != http.StatusOK { + require.Equal(t, tc.expectErr, strings.TrimSpace(rr.Body.String())) + return + } + + var rsp WalletResponse + err = json.Unmarshal(rr.Body.Bytes(), &rsp) + require.NoError(t, err) + require.Equal(t, tc.expectWallet, rsp) + }) + } +} + +func TestDecryptWallet(t *testing.T) { + entries, responseEntries := makeEntries([]byte("seed"), 5) + type gatewayReturnPair struct { + w wallet.Wallet + err error + } + + tt := []struct { + name string + method string + wltID string + password string + gatewayReturn gatewayReturnPair + status int + expectWallet WalletResponse + expectErr string + csrfDisabled bool + }{ + { + name: "200 OK", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturn: gatewayReturnPair{ + w: &wallet.DeterministicWallet{ + Meta: wallet.Meta{ + "filename": "wallet", + "seed": "seed", + "lastSeed": "lastSeed", + "secrets": "", + "encrypted": "false", + }, + Entries: cloneEntries(entries), + }, + }, + status: http.StatusOK, + expectWallet: WalletResponse{ + Meta: readable.WalletMeta{ + Filename: "wallet", + Encrypted: false, + }, + Entries: responseEntries, + }, + }, + { + name: "200 OK CSRF disabled", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturn: gatewayReturnPair{ + w: &wallet.DeterministicWallet{ + Meta: wallet.Meta{ + "filename": "wallet", + "seed": "seed", + "lastSeed": "lastSeed", + "secrets": "", + "encrypted": "false", + }, + Entries: cloneEntries(entries), + }, + }, + status: http.StatusOK, + expectWallet: WalletResponse{ + Meta: readable.WalletMeta{ + Filename: "wallet", + Encrypted: false, + }, + Entries: responseEntries, + }, + csrfDisabled: true, + }, + + { + name: "403 Forbidden", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturn: gatewayReturnPair{ + err: wallet.ErrWalletAPIDisabled, + }, + status: http.StatusForbidden, + expectErr: "403 Forbidden", + }, + { + name: "405 Method Not Allowed", + method: http.MethodGet, + status: http.StatusMethodNotAllowed, + expectErr: "405 Method Not Allowed", + }, + { + name: "400 - Missing Wallet ID", + method: http.MethodPost, + wltID: "", + password: "", + status: http.StatusBadRequest, + expectErr: "400 Bad Request - missing wallet id", + }, + { + name: "400 - Missing Password", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "", + gatewayReturn: gatewayReturnPair{ + err: wallet.ErrMissingPassword, + }, + status: http.StatusBadRequest, + expectErr: "400 Bad Request - missing password", + }, + { + name: "400 - Wallet IS Not Encrypted", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturn: gatewayReturnPair{ + err: wallet.ErrWalletNotEncrypted, + }, + status: http.StatusBadRequest, + expectErr: "400 Bad Request - wallet is not encrypted", + }, + { + name: "400 Bad Request - Invalid Password", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturn: gatewayReturnPair{ + err: wallet.ErrInvalidPassword, + }, + status: http.StatusBadRequest, + expectErr: "400 Bad Request - invalid password", + }, + { + name: "404 - Wallet Does Not Exist", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturn: gatewayReturnPair{ + err: wallet.ErrWalletNotExist, + }, + status: http.StatusNotFound, + expectErr: "404 Not Found", + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &MockGatewayer{} + gateway.On("DecryptWallet", tc.wltID, []byte(tc.password)).Return(tc.gatewayReturn.w, tc.gatewayReturn.err) + + endpoint := "/api/v1/wallet/decrypt" + v := url.Values{} + v.Add("id", tc.wltID) + v.Add("password", tc.password) + + req, err := http.NewRequest(tc.method, endpoint, strings.NewReader(v.Encode())) + require.NoError(t, err) + req.Header.Add("Content-Type", ContentTypeForm) + + setCSRFParameters(t, tokenValid, req) + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = false + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "wrong status code: got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.expectErr, strings.TrimSpace(rr.Body.String())) + return + } + + var rsp WalletResponse + err = json.Unmarshal(rr.Body.Bytes(), &rsp) + require.NoError(t, err) + require.Equal(t, tc.expectWallet, rsp) + }) + } +} + +// makeEntries derives N wallet address entries from given seed +// Returns set of wallet.Entry and wallet.ReadableEntry, the readable +// entries' secrets are removed. +func makeEntries(seed []byte, n int) ([]wallet.Entry, []readable.WalletEntry) { //nolint:unparam + seckeys := cipher.MustGenerateDeterministicKeyPairs(seed, n) + var entries []wallet.Entry + var responseEntries []readable.WalletEntry + for i, seckey := range seckeys { + pubkey := cipher.MustPubKeyFromSecKey(seckey) + entries = append(entries, wallet.Entry{ + Address: cipher.AddressFromPubKey(pubkey), + Public: pubkey, + Secret: seckey, + }) + responseEntries = append(responseEntries, readable.WalletEntry{ + Address: entries[i].Address.String(), + Public: entries[i].Public.Hex(), + }) + } + return entries, responseEntries +} + +func cloneEntries(es []wallet.Entry) []wallet.Entry { + var entries []wallet.Entry + entries = append(entries, es...) + return entries +} + +func TestWalletRecover(t *testing.T) { + type gatewayReturnPair struct { + w wallet.Wallet + err error + } + + okWalletUnencrypted, err := wallet.NewWallet("foo", wallet.Options{ + Type: wallet.WalletTypeDeterministic, + Coin: wallet.CoinTypeSkycoin, + Label: "foolabel", + Seed: "fooseed", + GenerateN: 10, + }) + require.NoError(t, err) + okWalletUnencryptedResponse, err := NewWalletResponse(okWalletUnencrypted) + require.NoError(t, err) + + okWalletEncrypted, err := wallet.NewWallet("foo", wallet.Options{ + Type: wallet.WalletTypeDeterministic, + Coin: wallet.CoinTypeSkycoin, + Label: "foolabel", + Seed: "fooseed", + Encrypt: true, + Password: []byte("foopassword"), + CryptoType: wallet.CryptoTypeScryptChacha20poly1305Insecure, + GenerateN: 10, + }) + require.NoError(t, err) + okWalletEncryptedResponse, err := NewWalletResponse(okWalletEncrypted) + require.NoError(t, err) + + cases := []struct { + name string + method string + status int + contentType string + req *WalletRecoverRequest + httpBody string + httpResponse HTTPResponse + gatewayReturn gatewayReturnPair + }{ + { + name: "method not allowed", + method: http.MethodGet, + status: http.StatusMethodNotAllowed, + contentType: ContentTypeJSON, + httpBody: toJSON(t, WalletRecoverRequest{}), + httpResponse: NewHTTPErrorResponse(http.StatusMethodNotAllowed, "Method Not Allowed"), + }, + { + name: "wrong content-type", + method: http.MethodPost, + status: http.StatusUnsupportedMediaType, + contentType: ContentTypeForm, + httpBody: toJSON(t, WalletRecoverRequest{}), + httpResponse: NewHTTPErrorResponse(http.StatusUnsupportedMediaType, "Unsupported Media Type"), + }, + { + name: "empty json body", + method: http.MethodPost, + status: http.StatusBadRequest, + contentType: ContentTypeJSON, + httpBody: "", + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "EOF"), + }, + { + name: "id missing", + method: http.MethodPost, + status: http.StatusBadRequest, + contentType: ContentTypeJSON, + req: &WalletRecoverRequest{ + Seed: "fooseed", + }, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "id is required"), + }, + { + name: "seed missing", + method: http.MethodPost, + status: http.StatusBadRequest, + contentType: ContentTypeJSON, + req: &WalletRecoverRequest{ + ID: "foo", + }, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "seed is required"), + }, + { + name: "wallet not encrypted", + method: http.MethodPost, + status: http.StatusBadRequest, + contentType: ContentTypeJSON, + req: &WalletRecoverRequest{ + ID: "foo", + Seed: "fooseed", + }, + gatewayReturn: gatewayReturnPair{ + err: wallet.ErrWalletNotEncrypted, + }, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, wallet.ErrWalletNotEncrypted.Error()), + }, + { + name: "wallet seed wrong", + method: http.MethodPost, + status: http.StatusBadRequest, + contentType: ContentTypeJSON, + req: &WalletRecoverRequest{ + ID: "foo", + Seed: "fooseed", + }, + gatewayReturn: gatewayReturnPair{ + err: wallet.ErrWalletRecoverSeedWrong, + }, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, wallet.ErrWalletRecoverSeedWrong.Error()), + }, + { + name: "wallet does not exist", + method: http.MethodPost, + status: http.StatusNotFound, + contentType: ContentTypeJSON, + req: &WalletRecoverRequest{ + ID: "foo", + Seed: "fooseed", + }, + gatewayReturn: gatewayReturnPair{ + err: wallet.ErrWalletNotExist, + }, + httpResponse: NewHTTPErrorResponse(http.StatusNotFound, "Not Found"), + }, + { + name: "wallet api disabled", + method: http.MethodPost, + status: http.StatusForbidden, + contentType: ContentTypeJSON, + req: &WalletRecoverRequest{ + ID: "foo", + Seed: "fooseed", + }, + gatewayReturn: gatewayReturnPair{ + err: wallet.ErrWalletAPIDisabled, + }, + httpResponse: NewHTTPErrorResponse(http.StatusForbidden, ""), + }, + { + name: "wallet other error", + method: http.MethodPost, + status: http.StatusInternalServerError, + contentType: ContentTypeJSON, + req: &WalletRecoverRequest{ + ID: "foo", + Seed: "fooseed", + }, + gatewayReturn: gatewayReturnPair{ + err: errors.New("wallet error"), + }, + httpResponse: NewHTTPErrorResponse(http.StatusInternalServerError, "wallet error"), + }, + { + name: "ok, no password", + method: http.MethodPost, + status: http.StatusOK, + contentType: ContentTypeJSON, + req: &WalletRecoverRequest{ + ID: "foo", + Seed: "fooseed", + }, + gatewayReturn: gatewayReturnPair{ + w: okWalletUnencrypted, + }, + httpResponse: HTTPResponse{ + Data: *okWalletUnencryptedResponse, + }, + }, + { + name: "ok, seed passphrase, no password", + method: http.MethodPost, + status: http.StatusOK, + contentType: ContentTypeJSON, + req: &WalletRecoverRequest{ + ID: "foo", + Seed: "fooseed", + SeedPassphrase: "fooseedpassphrase", + }, + gatewayReturn: gatewayReturnPair{ + w: okWalletUnencrypted, + }, + httpResponse: HTTPResponse{ + Data: *okWalletUnencryptedResponse, + }, + }, + { + name: "ok, password", + method: http.MethodPost, + status: http.StatusOK, + contentType: ContentTypeJSON, + req: &WalletRecoverRequest{ + ID: "foo", + Seed: "fooseed", + Password: "foopassword", + }, + gatewayReturn: gatewayReturnPair{ + w: okWalletEncrypted, + }, + httpResponse: HTTPResponse{ + Data: *okWalletEncryptedResponse, + }, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + gateway := &MockGatewayer{} + if tc.req != nil { + var password []byte + if tc.req.Password != "" { + password = []byte(tc.req.Password) + } + gateway.On("RecoverWallet", tc.req.ID, tc.req.Seed, tc.req.SeedPassphrase, password).Return(tc.gatewayReturn.w, tc.gatewayReturn.err) + } + + if tc.httpBody == "" && tc.req != nil { + tc.httpBody = toJSON(t, tc.req) + } + + endpoint := "/api/v2/wallet/recover" + req, err := http.NewRequest(tc.method, endpoint, strings.NewReader(tc.httpBody)) + require.NoError(t, err) + + contentType := tc.contentType + if contentType == "" { + contentType = ContentTypeJSON + } + + req.Header.Set("Content-Type", contentType) + + setCSRFParameters(t, tokenValid, req) + + rr := httptest.NewRecorder() + + cfg := defaultMuxConfig() + cfg.disableCSRF = false + + handler := newServerMux(cfg, gateway) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "got `%v` want `%v`", status, tc.status) + + var rsp ReceivedHTTPResponse + err = json.Unmarshal(rr.Body.Bytes(), &rsp) + require.NoError(t, err) + + require.Equal(t, tc.httpResponse.Error, rsp.Error) + + if rsp.Data == nil { + require.Nil(t, tc.httpResponse.Data) + } else { + require.NotNil(t, tc.httpResponse.Data) + + var wltRsp WalletResponse + err := json.Unmarshal(rsp.Data, &wltRsp) + require.NoError(t, err) + + require.Equal(t, tc.httpResponse.Data.(WalletResponse), wltRsp) + } + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/address.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/address.go new file mode 100644 index 00000000..3ada34ac --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/address.go @@ -0,0 +1,183 @@ +package cipher + +import ( + "errors" + "log" + + "github.com/SkycoinProject/skycoin/src/cipher/base58" +) + +var ( + // ErrAddressInvalidLength Unexpected size of address bytes buffer + ErrAddressInvalidLength = errors.New("Invalid address length") + // ErrAddressInvalidChecksum Computed checksum did not match expected value + ErrAddressInvalidChecksum = errors.New("Invalid checksum") + // ErrAddressInvalidVersion Unsupported address version value + ErrAddressInvalidVersion = errors.New("Address version invalid") + // ErrAddressInvalidPubKey Public key invalid for address + ErrAddressInvalidPubKey = errors.New("Public key invalid for address") + // ErrAddressInvalidFirstByte Invalid first byte in wallet import format string + ErrAddressInvalidFirstByte = errors.New("first byte invalid") + // ErrAddressInvalidLastByte 33rd byte in wallet import format string is invalid + ErrAddressInvalidLastByte = errors.New("invalid 33rd byte") +) + +/* +Addresses are the Ripemd160 of the double SHA256 of the public key +- public key must be in compressed format + +In the block chain the address is 20+1 bytes +- the first byte is the version byte +- the next twenty bytes are RIPMD160(SHA256(SHA256(pubkey))) + +In base 58 format the address is 20+1+4 bytes +- the first 20 bytes are RIPMD160(SHA256(SHA256(pubkey))). +-- this is to allow for any prefix in vanity addresses +- the next byte is the version byte +- the next 4 bytes are a checksum +-- the first 4 bytes of the SHA256 of the 21 bytes that come before + +*/ + +// Checksum 4 bytes +type Checksum [4]byte + +// Addresser defines an interface for cryptocurrency addresses +type Addresser interface { + Bytes() []byte + String() string + Checksum() Checksum + Verify(PubKey) error + Null() bool +} + +// PubKeyRipemd160 returns ripemd160(sha256(sha256(pubkey))) +func PubKeyRipemd160(pubKey PubKey) Ripemd160 { + r1 := SumSHA256(pubKey[:]) + r2 := SumSHA256(r1[:]) + return HashRipemd160(r2[:]) +} + +// Address version is after Key to enable better vanity address generation +// Address struct is a 25 byte with a 20 byte public key hash, 1 byte address +// type and 4 byte checksum. +type Address struct { + Version byte //1 byte + Key Ripemd160 //20 byte pubkey hash +} + +// AddressFromPubKey creates Address from PubKey as ripemd160(sha256(sha256(pubkey))) +func AddressFromPubKey(pubKey PubKey) Address { + return Address{ + Version: 0, + Key: PubKeyRipemd160(pubKey), + } +} + +// AddressFromSecKey generates address from secret key +func AddressFromSecKey(secKey SecKey) (Address, error) { + p, err := PubKeyFromSecKey(secKey) + if err != nil { + return Address{}, err + } + return AddressFromPubKey(p), nil +} + +// MustAddressFromSecKey generates address from secret key, panics on error +func MustAddressFromSecKey(secKey SecKey) Address { + return AddressFromPubKey(MustPubKeyFromSecKey(secKey)) +} + +// DecodeBase58Address creates an Address from its base58 encoding +func DecodeBase58Address(addr string) (Address, error) { + b, err := base58.Decode(addr) + if err != nil { + return Address{}, err + } + return AddressFromBytes(b) +} + +// MustDecodeBase58Address creates an Address from its base58 encoding, panics on error +func MustDecodeBase58Address(addr string) Address { + a, err := DecodeBase58Address(addr) + if err != nil { + log.Panicf("Invalid address %s: %v", addr, err) + } + return a +} + +// AddressFromBytes converts []byte to an Address +func AddressFromBytes(b []byte) (Address, error) { + if len(b) != 20+1+4 { + return Address{}, ErrAddressInvalidLength + } + a := Address{} + copy(a.Key[0:20], b[0:20]) + a.Version = b[20] + + chksum := a.Checksum() + var checksum [4]byte + copy(checksum[0:4], b[21:25]) + + if checksum != chksum { + return Address{}, ErrAddressInvalidChecksum + } + + if a.Version != 0 { + return Address{}, ErrAddressInvalidVersion + } + + return a, nil +} + +// MustAddressFromBytes converts []byte to an Address, panics on error +func MustAddressFromBytes(b []byte) Address { + addr, err := AddressFromBytes(b) + if err != nil { + log.Panic(err) + } + + return addr +} + +// Null returns true if the address is null (0x0000....) +func (addr Address) Null() bool { + return addr == Address{} +} + +// Bytes return address as a byte slice +func (addr Address) Bytes() []byte { + b := make([]byte, 20+1+4) + copy(b[0:20], addr.Key[0:20]) + b[20] = addr.Version + chksum := addr.Checksum() + copy(b[21:25], chksum[0:4]) + return b +} + +// Verify checks that the address appears valid for the public key +func (addr Address) Verify(pubKey PubKey) error { + if addr.Version != 0x00 { + return ErrAddressInvalidVersion + } + + if addr.Key != PubKeyRipemd160(pubKey) { + return ErrAddressInvalidPubKey + } + + return nil +} + +// String address as Base58 encoded string +func (addr Address) String() string { + return string(base58.Encode(addr.Bytes())) +} + +// Checksum returns Address Checksum which is the first 4 bytes of sha256(key+version) +func (addr Address) Checksum() Checksum { + r1 := append(addr.Key[:], []byte{addr.Version}...) + r2 := SumSHA256(r1[:]) + c := Checksum{} + copy(c[:], r2[:len(c)]) + return c +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/address_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/address_test.go new file mode 100644 index 00000000..48817035 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/address_test.go @@ -0,0 +1,232 @@ +package cipher + +import ( + "errors" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher/base58" +) + +func TestMustDecodeBase58Address(t *testing.T) { + p, _ := GenerateKeyPair() + a := AddressFromPubKey(p) + require.NoError(t, a.Verify(p)) + + require.Panics(t, func() { MustDecodeBase58Address("") }) + require.Panics(t, func() { MustDecodeBase58Address("cascs") }) + b := a.Bytes() + h := string(base58.Encode(b[:len(b)/2])) + require.Panics(t, func() { MustDecodeBase58Address(h) }) + h = string(base58.Encode(b)) + require.NotPanics(t, func() { MustDecodeBase58Address(h) }) + a2 := MustDecodeBase58Address(h) + require.Equal(t, a, a2) + + require.NotPanics(t, func() { MustDecodeBase58Address(a.String()) }) + a2 = MustDecodeBase58Address(a.String()) + require.Equal(t, a, a2) + + // preceding whitespace is invalid + badAddr := " " + a.String() + require.Panics(t, func() { MustDecodeBase58Address(badAddr) }) + + // preceding zeroes are invalid + badAddr = "000" + a.String() + require.Panics(t, func() { MustDecodeBase58Address(badAddr) }) + + // trailing whitespace is invalid + badAddr = a.String() + " " + require.Panics(t, func() { MustDecodeBase58Address(badAddr) }) + + // trailing zeroes are invalid + badAddr = a.String() + "000" + require.Panics(t, func() { MustDecodeBase58Address(badAddr) }) + + null := "1111111111111111111111111" + require.Panics(t, func() { MustDecodeBase58Address(null) }) +} + +func TestDecodeBase58Address(t *testing.T) { + p, _ := GenerateKeyPair() + a := AddressFromPubKey(p) + require.NoError(t, a.Verify(p)) + + _, err := DecodeBase58Address("") + require.Error(t, err) + + _, err = DecodeBase58Address("cascs") + require.Error(t, err) + + b := a.Bytes() + h := string(base58.Encode(b[:len(b)/2])) + _, err = DecodeBase58Address(h) + require.Error(t, err) + + h = string(base58.Encode(b)) + a2, err := DecodeBase58Address(h) + require.NoError(t, err) + require.Equal(t, a, a2) + + as := a.String() + a2, err = DecodeBase58Address(as) + require.NoError(t, err) + require.Equal(t, a, a2) + + // preceding whitespace is invalid + as2 := " " + as + _, err = DecodeBase58Address(as2) + require.Error(t, err) + + // preceding zeroes are invalid + as2 = "000" + as + _, err = DecodeBase58Address(as2) + require.Error(t, err) + + // trailing whitespace is invalid + as2 = as + " " + _, err = DecodeBase58Address(as2) + require.Error(t, err) + + // trailing zeroes are invalid + as2 = as + "000" + _, err = DecodeBase58Address(as2) + require.Error(t, err) + + // null address is invalid + null := "1111111111111111111111111" + _, err = DecodeBase58Address(null) + require.Error(t, err) + require.Equal(t, ErrAddressInvalidChecksum, err) +} + +func TestAddressFromBytes(t *testing.T) { + p, _ := GenerateKeyPair() + a := AddressFromPubKey(p) + a2, err := AddressFromBytes(a.Bytes()) + require.NoError(t, err) + require.Equal(t, a2, a) + + // Invalid number of bytes + b := a.Bytes() + _, err = AddressFromBytes(b[:len(b)-2]) + require.EqualError(t, err, "Invalid address length") + + // Invalid checksum + b[len(b)-1] += byte(1) + _, err = AddressFromBytes(b) + require.EqualError(t, err, "Invalid checksum") + + a.Version = 2 + b = a.Bytes() + _, err = AddressFromBytes(b) + require.EqualError(t, err, "Address version invalid") +} + +func TestMustAddressFromBytes(t *testing.T) { + p, _ := GenerateKeyPair() + a := AddressFromPubKey(p) + a2 := MustAddressFromBytes(a.Bytes()) + require.Equal(t, a2, a) + + // Invalid number of bytes + b := a.Bytes() + require.Panics(t, func() { + MustAddressFromBytes(b[:len(b)-2]) + }) + + // Invalid checksum + b[len(b)-1] += byte(1) + require.Panics(t, func() { + MustAddressFromBytes(b) + }) + + a.Version = 2 + b = a.Bytes() + require.Panics(t, func() { + MustAddressFromBytes(b) + }) +} + +func TestAddressRoundtrip(t *testing.T) { + // Tests encode and decode + p, _ := GenerateKeyPair() + a := AddressFromPubKey(p) + a2, err := AddressFromBytes(a.Bytes()) + require.NoError(t, err) + require.Equal(t, a, a2) + require.Equal(t, a.String(), a2.String()) +} + +func TestAddressVerify(t *testing.T) { + p, _ := GenerateKeyPair() + a := AddressFromPubKey(p) + // Valid pubkey+address + require.NoError(t, a.Verify(p)) + // Invalid pubkey + require.Error(t, a.Verify(PubKey{})) + p2, _ := GenerateKeyPair() + require.Error(t, a.Verify(p2)) + // Bad version + a.Version = 0x01 + require.Error(t, a.Verify(p)) +} + +func TestAddressString(t *testing.T) { + p, _ := GenerateKeyPair() + a := AddressFromPubKey(p) + s := a.String() + a2, err := DecodeBase58Address(s) + require.NoError(t, err) + require.Equal(t, a2, a) + s2 := a2.String() + a3, err := DecodeBase58Address(s2) + require.NoError(t, err) + require.Equal(t, a2, a3) +} + +func TestAddressBulk(t *testing.T) { + for i := 0; i < 1024; i++ { + pub, _, err := GenerateDeterministicKeyPair(RandByte(32)) + require.NoError(t, err) + + a := AddressFromPubKey(pub) + require.NoError(t, a.Verify(pub)) + s := a.String() + a2, err := DecodeBase58Address(s) + require.NoError(t, err) + require.Equal(t, a2, a) + } +} + +func TestAddressNull(t *testing.T) { + var a Address + require.True(t, a.Null()) + + p, _ := GenerateKeyPair() + a = AddressFromPubKey(p) + require.False(t, a.Null()) +} + +func TestAddressFromSecKey(t *testing.T) { + p, s := GenerateKeyPair() + a, err := AddressFromSecKey(s) + require.NoError(t, err) + // Valid pubkey+address + require.NoError(t, a.Verify(p)) + + _, err = AddressFromSecKey(SecKey{}) + require.Equal(t, errors.New("Attempt to load null seckey, unsafe"), err) +} + +func TestMustAddressFromSecKey(t *testing.T) { + p, s := GenerateKeyPair() + a := MustAddressFromSecKey(s) + // Valid pubkey+address + require.NoError(t, a.Verify(p)) + + require.Panics(t, func() { + MustAddressFromSecKey(SecKey{}) + }) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/LICENSE b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/LICENSE new file mode 100644 index 00000000..9d58fbb4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/LICENSE @@ -0,0 +1,24 @@ +MIT License + +Copyright (c) 2017 Denis Subbotin +Copyright (c) 2017 Nika Jones +Copyright (c) 2017 Philip Schlump +Copyright (c) 2019 gz-c + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/LICENSE_old b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/LICENSE_old new file mode 100644 index 00000000..58da01b3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/LICENSE_old @@ -0,0 +1,27 @@ +Copyright (c) 2012 ThePiachu. All rights reserved. +Copyright (c) 2019 gz-c, Skycoin developers. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * The name of ThePiachu may not be used to endorse or promote products +derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/README.md b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/README.md new file mode 100644 index 00000000..94251a44 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/README.md @@ -0,0 +1,47 @@ +# Fast Implementation of Base58 encoding + +[![GoDoc](https://godoc.org/github.com/SkycoinProject/skycoin/src/cipher/base58?status.svg)](https://godoc.org/github.com/SkycoinProject/skycoin/src/cipher/base58) + +Fast implementation of base58 encoding in Go. + +This code is a fork of https://github.com/mr-tron/base58 + +Base algorithm is copied from https://github.com/trezor/trezor-crypto/blob/master/base58.c +Which was copied from an older version of libbase58 https://github.com/bitcoin/libbase58 + +## Performance + +Other base58 golang libraries use `big.Int` which has a lot of malloc overhead and shows up as a common bottleneck when profiling. + +This version removes the use of `big.Int`. + +## Usage example + +```go +package main + +import ( + "fmt" + "os" + + "github.com/SkycoinProject/skycoin/src/cipher/base58" +) + +func main() { + encoded := "1QCaxc8hutpdZ62iKZsn1TCG3nh7uPZojq" + bin, err := base58.Decode(encoded) + if err != nil { + fmt.Println("Decode error:", err) + os.Exit(1) + } + + chk := base58.Encode(bin) + if encoded == string(chk) { + fmt.Println("Successfully decoded then re-encoded") + } +} +``` + +## base58-old + +The old base58 code is retained here as a reference and used in tests to compare the output is equivalent. diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/base58.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/base58.go new file mode 100644 index 00000000..c18ae5a8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/base58.go @@ -0,0 +1,178 @@ +package base58 + +import ( + "errors" + "fmt" +) + +var ( + // ErrInvalidChar Invalid base58 character + ErrInvalidChar = errors.New("Invalid base58 character") + // ErrInvalidString Invalid base58 string + ErrInvalidString = errors.New("Invalid base58 string") +) + +// Alphabet is a a b58 alphabet. +type Alphabet struct { + decode [128]int8 + encode [58]byte +} + +// NewAlphabet creates a new alphabet from the passed string. +// +// It panics if the passed string is not 58 bytes long or isn't valid ASCII. +func NewAlphabet(s string) *Alphabet { + if len(s) != 58 { + panic("base58 alphabets must be 58 bytes long") + } + + ret := &Alphabet{} + + copy(ret.encode[:], s) + + for i := range ret.decode { + ret.decode[i] = -1 + } + for i, b := range ret.encode { + ret.decode[b] = int8(i) + } + + return ret +} + +// btcAlphabet is the bitcoin base58 alphabet. +var btcAlphabet = NewAlphabet("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz") + +// Encode encodes the passed bytes into a base58 encoded string. +func Encode(bin []byte) string { + return fastBase58EncodingAlphabet(bin, btcAlphabet) +} + +// fastBase58EncodingAlphabet encodes the passed bytes into a base58 encoded +// string with the passed alphabet. +func fastBase58EncodingAlphabet(bin []byte, alphabet *Alphabet) string { + binsz := len(bin) + var i, j, zcount, high int + var carry uint32 + + for zcount < binsz && bin[zcount] == 0 { + zcount++ + } + + size := (binsz-zcount)*138/100 + 1 + var buf = make([]uint32, size) + + high = size - 1 + for i = zcount; i < binsz; i++ { + j = size - 1 + for carry = uint32(bin[i]); j > high || carry != 0; j-- { + carry += buf[j] << 8 + buf[j] = carry % 58 + carry /= 58 + } + high = j + } + + for j = 0; j < size && buf[j] == 0; j++ { + } + + var b58 = make([]byte, size-j+zcount) + + if zcount != 0 { + for i = 0; i < zcount; i++ { + b58[i] = '1' + } + } + + for i = zcount; j < size; i++ { + b58[i] = alphabet.encode[buf[j]] + j++ + } + + return string(b58) +} + +// Decode decodes the base58 encoded bytes. +func Decode(str string) ([]byte, error) { + return fastBase58DecodingAlphabet(str, btcAlphabet) +} + +// fastBase58DecodingAlphabet decodes the base58 encoded bytes using the given +// b58 alphabet. +func fastBase58DecodingAlphabet(str string, alphabet *Alphabet) ([]byte, error) { + if len(str) == 0 { + return nil, ErrInvalidString + } + + var ( + t, c uint64 + zmask uint32 + zcount int + + b58u = []rune(str) + b58sz = len(b58u) + + outisz = (b58sz + 3) >> 2 + binu = make([]byte, (b58sz+3)*3) + bytesleft = b58sz & 3 + ) + + if bytesleft > 0 { + zmask = 0xffffffff << uint32(bytesleft*8) + } else { + bytesleft = 4 + } + + var outi = make([]uint32, outisz) + + for i := 0; i < b58sz && b58u[i] == '1'; i++ { + zcount++ + } + + for _, r := range b58u { + if r > 127 { + return nil, ErrInvalidChar + } + if alphabet.decode[r] == -1 { + return nil, ErrInvalidChar + } + + c = uint64(alphabet.decode[r]) + + for j := outisz - 1; j >= 0; j-- { + t = uint64(outi[j])*58 + c + c = (t >> 32) & 0x3f + outi[j] = uint32(t & 0xffffffff) + } + + // Neither of these should occur because the buffer is allocated ourselves + if c > 0 { + return nil, fmt.Errorf("output number too big (carry to the next int32)") + } + + if outi[0]&zmask != 0 { + return nil, fmt.Errorf("output number too big (last int32 filled too far)") + } + } + + var j, cnt int + for j, cnt = 0, 0; j < outisz; j++ { + for mask := byte(bytesleft-1) * 8; mask <= 0x18; mask, cnt = mask-8, cnt+1 { + binu[cnt] = byte(outi[j] >> mask) + } + if j == 0 { + bytesleft = 4 // because it could be less than 4 the first time through + } + } + + for n, v := range binu { + if v > 0 { + start := n - zcount + if start < 0 { + start = 0 + } + return binu[start:cnt], nil + } + } + return binu[:cnt], nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/base58_old.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/base58_old.go new file mode 100644 index 00000000..ffa4bca5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/base58_old.go @@ -0,0 +1,190 @@ +// Copyright 2011 ThePiachu. All rights reserved. +// Copyright 2019 gz-c, Skycoin developers. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package base58 + +import ( + "errors" + "fmt" + "math/big" +) + +//alphabet used by Bitcoins +var alphabet = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz" + +var ( + // errInvalidBase58Char Invalid base58 character + errInvalidBase58Char = errors.New("Invalid base58 character") + // errInvalidBase58String Invalid base58 string + errInvalidBase58String = errors.New("Invalid base58 string") + // errInvalidBase58Length Invalid base58 length + errInvalidBase58Length = errors.New("base58 invalid length") +) + +// oldBase58 type to hold the oldBase58 string +type oldBase58 string + +//reverse alphabet used for quckly converting base58 strings into numbers +var revalp = map[string]int{ + "1": 0, "2": 1, "3": 2, "4": 3, "5": 4, "6": 5, "7": 6, "8": 7, "9": 8, "A": 9, + "B": 10, "C": 11, "D": 12, "E": 13, "F": 14, "G": 15, "H": 16, "J": 17, "K": 18, "L": 19, + "M": 20, "N": 21, "P": 22, "Q": 23, "R": 24, "S": 25, "T": 26, "U": 27, "V": 28, "W": 29, + "X": 30, "Y": 31, "Z": 32, "a": 33, "b": 34, "c": 35, "d": 36, "e": 37, "f": 38, "g": 39, + "h": 40, "i": 41, "j": 42, "k": 43, "m": 44, "n": 45, "o": 46, "p": 47, "q": 48, "r": 49, + "s": 50, "t": 51, "u": 52, "v": 53, "w": 54, "x": 55, "y": 56, "z": 57, +} + +// oldHex2Big converts hex to big +func oldHex2Big(b []byte) *big.Int { + answer := big.NewInt(0) + + for i := 0; i < len(b); i++ { + answer.Lsh(answer, 8) + answer.Add(answer, big.NewInt(int64(b[i]))) + } + + return answer +} + +// ToBig convert base58 to big.Int +func (b oldBase58) ToBig() (*big.Int, error) { + answer := new(big.Int) + for i := 0; i < len(b); i++ { + answer.Mul(answer, big.NewInt(58)) //multiply current value by 58 + c, ok := revalp[string(b[i:i+1])] + if !ok { + return nil, errInvalidBase58Char + } + answer.Add(answer, big.NewInt(int64(c))) //add value of the current letter + } + return answer, nil +} + +// ToInt converts base58 to int +func (b oldBase58) ToInt() (int, error) { + answer := 0 + for i := 0; i < len(b); i++ { + answer *= 58 //multiply current value by 58 + c, ok := revalp[string(b[i:i+1])] + if !ok { + return 0, errInvalidBase58Char + } + answer += c //add value of the current letter + } + return answer, nil +} + +//ToHex converts base58 to hex bytes +func (b oldBase58) ToHex() ([]byte, error) { + value, err := b.ToBig() //convert to big.Int + if err != nil { + return nil, err + } + oneCount := 0 + bs := string(b) + if len(bs) == 0 { + return nil, fmt.Errorf("%v - len(bs) == 0", errInvalidBase58String) + } + for bs[oneCount] == '1' { + oneCount++ + if oneCount >= len(bs) { + return nil, fmt.Errorf("%v - oneCount >= len(bs)", errInvalidBase58String) + } + } + //convert big.Int to bytes + return append(make([]byte, oneCount), value.Bytes()...), nil +} + +// Base582Big converts base58 to big +func (b oldBase58) Base582Big() (*big.Int, error) { + answer := new(big.Int) + for i := 0; i < len(b); i++ { + answer.Mul(answer, big.NewInt(58)) //multiply current value by 58 + c, ok := revalp[string(b[i:i+1])] + if !ok { + return nil, errInvalidBase58Char + } + answer.Add(answer, big.NewInt(int64(c))) //add value of the current letter + } + return answer, nil +} + +// Base582Int converts base58 to int +func (b oldBase58) Base582Int() (int, error) { + answer := 0 + for i := 0; i < len(b); i++ { + answer *= 58 //multiply current value by 58 + c, ok := revalp[string(b[i:i+1])] + if !ok { + return 0, errInvalidBase58Char + } + answer += c //add value of the current letter + } + return answer, nil +} + +// oldBase582Hex converts base58 to hex bytes +func oldBase582Hex(b string) ([]byte, error) { + return oldBase58(b).ToHex() +} + +// BitHex converts base58 to hexes used by Bitcoins (keeping the zeroes on the front, 25 bytes long) +func (b oldBase58) BitHex() ([]byte, error) { + value, err := b.ToBig() //convert to big.Int + if err != nil { + return nil, err + } + + tmp := value.Bytes() //convert to hex bytes + if len(tmp) == 25 { //if it is exactly 25 bytes, return + return tmp, nil + } else if len(tmp) > 25 { //if it is longer than 25, return nothing + return nil, errInvalidBase58Length + } + answer := make([]byte, 25) //make 25 byte container + for i := 0; i < len(tmp); i++ { //copy converted bytes + answer[24-i] = tmp[len(tmp)-1-i] + } + return answer, nil +} + +// oldBig2Base58 encodes big.Int to base58 string +func oldBig2Base58(val *big.Int) oldBase58 { + answer := "" + valCopy := new(big.Int).Abs(val) //copies big.Int + + if val.Cmp(big.NewInt(0)) <= 0 { //if it is less than 0, returns empty string + return oldBase58("") + } + + tmpStr := "" + tmp := new(big.Int) + for valCopy.Cmp(big.NewInt(0)) > 0 { //converts the number into base58 + tmp.Mod(valCopy, big.NewInt(58)) //takes modulo 58 value + valCopy.Div(valCopy, big.NewInt(58)) //divides the rest by 58 + tmpStr += alphabet[tmp.Int64() : tmp.Int64()+1] //encodes + } + for i := (len(tmpStr) - 1); i > -1; i-- { + answer += tmpStr[i : i+1] //reverses the order + } + return oldBase58(answer) //returns +} + +// oldHex2Base58 encodes hex bytes into base58 +func oldHex2Base58(val []byte) oldBase58 { + tmp := oldBig2Base58(oldHex2Big(val)) //encoding of the number without zeroes in front + + //looking for zeros at the beginning + i := 0 + for i = 0; val[i] == 0 && i < len(val); i++ { + } + answer := "" + for j := 0; j < i; j++ { //adds zeroes from the front + answer += alphabet[0:1] + } + answer += string(tmp) //concatenates + + return oldBase58(answer) //returns +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/base58_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/base58_test.go new file mode 100644 index 00000000..447fcab5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/base58_test.go @@ -0,0 +1,1199 @@ +/* +Package base58 implements base58 encoding, used for Skycoin and Bitcoin addresses +*/ +package base58 + +// Useful materials: +// https://en.bitcoin.it/wiki/Base_58_Encoding +// http://www.strongasanox.co.uk/2011/03/11/base58-encoding-in-python/ + +import ( + "bytes" + "crypto/rand" + "testing" + + "github.com/stretchr/testify/require" +) + +var benchmarkAddr = "BbZ79o3JNbvi4fifByyopgdS5q6uT9ytmj" + +func BenchmarkEncode(b *testing.B) { + b.ReportAllocs() + if _, err := Decode(benchmarkAddr); err != nil { + b.Fail() + } + + b.ResetTimer() + + for i := 0; i < b.N; i++ { + _, _ = Decode(benchmarkAddr) //nolint:errcheck + } +} + +func BenchmarkEncodeOld(b *testing.B) { + b.ReportAllocs() + if _, err := oldBase582Hex(benchmarkAddr); err != nil { + b.Fail() + } + + b.ResetTimer() + + for i := 0; i < b.N; i++ { + _, _ = oldBase582Hex(benchmarkAddr) //nolint:errcheck + } +} + +func BenchmarkDecode(b *testing.B) { + b.ReportAllocs() + d, err := Decode(benchmarkAddr) + if err != nil { + b.Fail() + } + + e := Encode(d) + if e != benchmarkAddr { + b.Fail() + } + + b.ResetTimer() + + for i := 0; i < b.N; i++ { + _ = Encode(d) + } +} + +func BenchmarkDecodeOld(b *testing.B) { + b.ReportAllocs() + d, err := oldBase582Hex(benchmarkAddr) + if err != nil { + b.Fail() + } + + e := oldHex2Base58(d) + if string(e) != benchmarkAddr { + b.Fail() + } + + b.ResetTimer() + + for i := 0; i < b.N; i++ { + _ = oldHex2Base58(d) + } +} + +func testEncodeDecode(t *testing.T, a string) { + bin, err := Decode(a) + require.NoError(t, err) + chk := Encode(bin) + require.Equal(t, a, chk) + + // The old base58 package cannot decode strings of all 1s + allZeros := true + for _, c := range a { + if c != '1' { + allZeros = false + break + } + } + if allZeros { + return + } + + bin2, err := oldBase582Hex(a) + require.NoError(t, err) + require.True(t, bytes.Equal(bin, bin2)) + + chk2 := oldHex2Base58(bin) + require.Equal(t, chk, string(chk2)) +} + +func randBase58String(t *testing.T, n int) string { + b := make([]byte, n) + _, err := rand.Read(b) + require.NoError(t, err) + for i, c := range b { + b[i] = btcAlphabet.encode[c%58] + } + return string(b) +} + +func TestEncodeDecodeRandom(t *testing.T) { + strlen := 127 + n := strlen * 1000 + + for i := 0; i < n; i++ { + x := randBase58String(t, (i%strlen)+1) + t.Run(x, func(t *testing.T) { + testEncodeDecode(t, x) + }) + } + + for i := 128; i < 1024; i++ { + x := randBase58String(t, i) + t.Run(x, func(t *testing.T) { + testEncodeDecode(t, x) + }) + } +} + +func TestEncodeDecodeEmpty(t *testing.T) { + b, err := Decode("") + require.Nil(t, b) + require.Equal(t, ErrInvalidString, err) + + x := Encode(nil) + require.Equal(t, x, "") + + x = Encode([]byte{}) + require.Equal(t, x, "") +} + +func TestDecodeBadChar(t *testing.T) { + x := []byte("1111") + + for i := 0; i < 256; i++ { + if i < 128 && btcAlphabet.decode[i] != -1 { + continue + } + y := append(x, byte(i)) + _, err := Decode(string(y)) + require.Equal(t, ErrInvalidChar, err) + } + + bad := []string{ + " bxpUG8sCjeT6X1ES5SbD2LZrRudqiTY7wx", // preceding whitespace + " bxpUG8sCjeT6X1ES5SbD2LZrRudqiTY7wx", // preceding whitespaces + "0bxpUG8sCjeT6X1ES5SbD2LZrRudqiTY7wx", // preceding 0 + "00000bxpUG8sCjeT6X1ES5SbD2LZrRudqiTY7wx", // preceding 0s + "bxpUG8sCjeT6X1ES5SbD2LZrRudqiTY7wx0", // trailing 0 + "bxpUG8sCjeT6X1ES5SbD2LZrRudqiTY7wx0000", // trailing 0s + "-0xaA7F2DfD73e7035-93___x___6P3Or9N81_1____n__285_nJ25WTRQ_vexQWdN14S__9.9274920729751111", + "-05425.-2-___0xfF.037171326036317302-0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198.-07771-0x2f6E663acEaDdaae7e", + } + + for _, y := range bad { + _, err := Decode(y) + require.Equal(t, ErrInvalidChar, err) + } +} + +func TestEncodeDecodeKnownAddrs(t *testing.T) { + testAddr := []string{ + // Empty address + "1111111111111111111111111", + + // Example addresses from mr-tron/base58 + "1QCaxc8hutpdZ62iKZsn1TCG3nh7uPZojq", + "1DhRmSGnhPjUaVPAj48zgPV9e2oRhAQFUb", + "17LN2oPYRYsXS9TdYdXCCDvF2FegshLDU2", + "14h2bDLZSuvRFhUL45VjPHJcW667mmRAAn", + + // Randomly generated Skycoin addresses + "968o2vpiSDAMBCNNAAMCdVHYVvZcxgH2eW", + "CBKuGtiSttzgy6JyYYUTx9JTesxjhXKSHo", + "UBWDAVvH6ZmKX8KH86EWLfA7Du2qKVgKNw", + "21G6AU7rpRzCMuFp2UCstD6PZY3Mcjage4W", + "rRfsgEUCTgk3AZcoYCRmS5Rinadrw8LAp6", + "28QAWt5iBxYnJVtpSayLHsqqWUSQp6XDNE8", + "DVjnRXWnxyr1ueeSYpVKWn61jxbYyYND4X", + "4gWTKmjDvpJe34i9i2i33riVZiew21V3P6", + "2gcpPYo9XLjSfAcFS1mV4NJR9jF7528L7TU", + "pxUF2qJ34aKgNLWSsoTHm8iuMH9bgyXyAB", + "2jsTjaKPWwomBGzHoa5qZm22wdt59LmkFwb", + "Nadb59i6pkMeTkwbXMfWbftoaTj8Qx1o7Z", + "2iEPcNEQg6YQYt2GLjSGJwJEDdLcLvgnatA", + "2WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH", + "oq4yRyppcigt4S25Sdjx1Ncpmzyxw67SLe", + "2NauYwSe9RPsHY7oZaLuakP44ofYziv5wte", + "Y9jPpWaLfoTQYkhrFzgnKbCpjMrrTDvWX2", + "TQfQQQ8ciaSz2DT8tBzqyoVzA5vg3qZm8n", + "yUn7TxndNzRoZ34hMijhMyh7CQnYA7dAn4", + "26rQC5KKEgYyiLhSWpef94gHXKjYWPdjQx2", + "8i4EU2R8aiS1QE1PMhE6qvgqencUowHZnp", + "TbFtcHeUqef3JeKMBrRxzRvBXK4nJtRoe7", + "w1tyShnSfWH3sUjz4HcK6rPVHvzgdhLwJz", + "m7QJ6LxNFnGs2vD3dXYrbisfT56QqkW15b", + "2VtEEEvHDSCMGq72KBjzyS27ZADwKG4kjgd", + "2LCYUfj3rwu4N5NY4wqNX7STAkyXu3LfdYC", + "WVmwB9KMYnd2c1xRfESa7wdgGuNLMU4cni", + "cj29Fobo9aRSSEJuWEtfBihHsgHExuYVBD", + "ZLyUpWtSMDqHHse2xA55zbefa84cx8ykUd", + "PBENV7bgFYMsnvUbDJJfUF46JukjAvf7Dm", + "UY7vLUfL8cRLCLuRdGTPRxye5sRxrxFTbV", + "27q7HQnk73eBwKSLd1yTocrMuwiTAy8Q7mp", + "Vb4Qa9uhz2erHQvFZfV9Ns449WDj3rfCwm", + "upWBoRfwhi4Fh6AytmypNgpXVVZTydhtzM", + "2GwBqNwooQcZWcToHZPJXu8oe6zM1GDSssz", + "SpV85zojCcHQAvarwo2i1EDVmTyh1FzffJ", + "eniYXrjCMu2R83kVzjmSq4peLwPWEyBHJj", + "2R5mhWq2ruoBAqpR4o1rrkz7UzmVdfs5eWw", + "24fhrKkXGSTjJHLdSiHNYQCWXHJAq6sevKq", + "hHHRHkDv3Qzmg3nTpdkao3Fy6FFQNmtEJS", + "PV1EuQjLv62DK6b2dgd8mgE3idK9mJZTmY", + "2hQH3Ku45HYYQR4pyjaNwxRY84GbKXVkypB", + "iAJ8FTFQRvb546QX2i5GP3u5s52GwBJme7", + "2ivAdyrhQmAHqMzxEXUvv6B6gdUSuoT77uF", + "v2KqYbcPvBRpAbC2mf5xnJ5WTUmGHdwc3U", + "2Xe6Y6LMghjUnYv27MXPUNukSgKpWUSeLPG", + "2mWaLTPRU2ZjdGZNrrCEvP9jFuNxSq54NUb", + "2eEYNokgJJheKu3ooFqCQTUFCx7H2oaPHs6", + "24PwdbES8vCVRnLhnazrD4Eh6NQ2oUQTaUy", + "TuHr8eDRWQL2T9ZkpjeFVFknEBdHpWG3Qa", + "29ebg5EJRsQDhx9NWMpvx8vsWaJmHEa3Jc3", + "bgVmUpTcA5DN4gT4vpprY1pTeWvUcoMpu9", + "eFP8myi627SNbPr31TcV9KixvcRGyvjAf7", + "2hasdKBRdiZ6D4h9qPWyrQJepvbFBxwrQQE", + "25UaV7LCx3Xbof9Qb2rwkhw41Diqb8zZWAL", + "2XKjCqmATQVNdg7QabYfDTr87ngym71Fk5q", + "S7NPCyF2M3HMGUtahnxBNf7hkjhZrrvTkp", + "e9Yp46wQtFcraRj7h7KnxuRZEEBt7wWKwv", + "2FPW4JERBWzSf9n6jruTYPGAAVuMP4QFtNB", + "2FgrEY92rrs4TYQxw7GSCeg6tR4CSg58CnU", + "5N3XbiQoLX4wSd9ZAi1KVT89j5pqkDAARY", + "224TYwgFgaxZ4Wa9NMzvvD9ejG6mWBboDCF", + "S996QG5U5Kbe5p3pDVLgss2GUDxQdG7PHE", + "aDBFEf9dXw4voDYNVY4fvwG2GkTGH6X5D5", + "MyvhxtWXo88FKFhUjw3AXbjK6YtMiXYjv8", + "2iVHso1BsyZJyaFurJjuhTBHSM6i7dU34Av", + "GqciZuy28KkK6AKb4U7rgb897xLtyqwe1Y", + "UvZSTRe6XfwtLSFN9tEkVQL3qoAT5hQk4s", + "2A5fRgBV4hf3vesoboUsJQDsGo4wFbBpHcg", + "DnmQebrTbSRwq6aqZNKnVpKPUkNhEdVJYh", + "o9BccckziLRNxM7paqdCmMDS36qV4uy3pC", + "jC48GN98UjrRkMgqAse4CcWrW4D1kjuE9p", + "2fsc1SRRoBt2f6RLEEWnTS85Vmj57oXyUHT", + "AKBqyAJd9L2eVY2EZfsjrzFgKYZufg7sHd", + "FbxYyQBVLFihSokT5bR66HgmZ2cnbqpmAL", + "ktHsYrPsjRBYfhaXfhQc4eoTAN11SELmvA", + "WyKgazrVaN4XteQqw4G6o34E1MtcKZAzun", + "WH8WiwzXH5vpnZe8xGwU55vzpHZoaWreZL", + "2aQC5HrMfXnjUyDfTpUv2nN7mpZcM6JZpUo", + "nT5FpoERESCs29c1DAsL9EFLyEVxkvSDjJ", + "UkR5f61ptH8sBC4WdRogrNKRpMyHtw4iB", + "D1F9egTEGr6dZ4mizzKtUEuZDFaqGwNf3t", + "Ahskhos7U4cBeV3JjLu1A7PDrqGmRw9Chf", + "26HRUBYwWnGUrg7MCozbcjgny3kraS4AG4T", + "2QhZvWvSx3kY2PqLf1CcQ6SxjrWTxN8SnLQ", + "2icM26PGcD53GhtWvnwnDRgtLHmV16qSucZ", + "quWXbQGiPbNmrK2bxv3wzem4vBgvF8uYyP", + "pX6AYyWV7dHxf8p7T2LSTxqrFWsmZPeGvK", + "E1wqrVyf1ZfbVGBoEZRDMUv3kVQu3Pkq8x", + "obzkDamYMoe4SwHj7wS5By8C7eKU8GBNic", + "pD5aLHXrL6eo1QBeNYoc2TKHN7cS7ewqgD", + "2eZxS4UnNNcStV6S17UpYauK2mS5bSxom4o", + "Lc7GM5ZEcWQpVExM8Xxw1YMxtth2dZpQDs", + "AjKGaucxKzt6s3T2RDBSkjz4Kmu1eDiNtX", + "PgYHzrzQw2MXK8YGmeRoiUysMhQgK5DmQq", + "2hmh5piFh7myRwfhbsCE7VRSSLnxFAsf1me", + "2CrYxhD4DZZEZMzmid8LHh4RPmuRzGVQe7Q", + "RupPXqWnE3qQpYeYPqvG9w72ywWyPu7znM", + "2G6WxnQxVqRXxYsnccnBD3eg2G4Ai6mTswW", + "BbZ79o3JNbvi4fifByyopgdS5q6uT9ytmj", + "2Y8Agusra9684LaXkmbcTYTmYLm4E6vV7M2", + "29zJ7qwq8pQpSEjR9qGMnpUwAHX5ufruaiK", + "AtcW5LJNTzm4inSbuMzxs5a2nFezVxzysC", + "zGPm8xVsbdYqLqsC7RjKNvHsQ9kWuMEE9r", + "od1i8rihfJE55yW63FxHL8o911QqVNqotW", + "2FUrR8Tietcz9hT2PKktgHU57xFs26ahtqV", + "2b2Cw64hQBCwrtDTuuaXyapLwq1BJgb3VUV", + "9RbKMTftN9NmZNhN5wE4efHrS2T7KFMrPn", + "Dp3ayfLQC5d9izUyttG9d4c4HVYmHeWWUW", + "ssYjtzYAiz1MPsbuYzXgx6v82mjgCGaYBM", + "9xpM5rijPu3hmsUkGcvqUwPSbW8EVyxL8W", + "25T4ptpFRKAKnPDbF6XdL2KLdC4yf3kvvQ8", + "xtCU2AkDdBAGRRt8CVe422ys718EJfevoi", + "TWwozvxWJUeH322fNmUc5DurgihJMMTt7v", + "2eoLN4nKupyfHvZpNCwJuh54d2ZXMBmMTe8", + "tQPc7ZDnmab7XCoX5zhnXBhUbDTDinhbpZ", + "7yPsXcyaBRMZAvc7kbFLgvAqyFgkKtF1zP", + "2AUkoPcTtV7n34r6GEjJ5NpB4Tvxe38J1zX", + "vKVLoMtZqY2Z6mGBjZqHtXKkMCQU4YNKHk", + "2d1hagw2Nc9GCcMgFbHJmdjJz4ZYHfXeNHy", + "2juX5e7E9Hd71Sgy2QouFp25oCo1JtnC185", + "2SZ7GsR2GiDRxSpc9dAFbrULfLjRaq79scQ", + "2L7LtusSY1Mbf3XXEeUvnhayVXvdNDJLpkN", + "dtWjBFwsm8bGWTX6hPHyrhD5PU6pmyTjKJ", + "crRaWgbh95SMSj9RFtqkT7Dv4f5AuaSiA2", + "MHNy4X42aTmpstxd75S8UMTZVLyVtsaTP7", + "29Z3CUJutadX9qwP86BaY3k5fkPKo4M44JL", + "JiQYF3Y4ZG2qbHeCfLsWu7KTeLoWYHRpp7", + "JwhyzTPruhtkuMsCF8RiBx3nX7ancW4rfg", + "2MGxsK46oqWiYBzTaMMABDtNDD58u1uKJ84", + "2CP7cXex8MnNWrRbpbGQYmNCSwuuztPV6dm", + "X3jWBpMKqHVUGBvWFL1VXj7JAUQx1Hd6NL", + "2QbwgXpfxRapxL3NfQfxBp8xNsH6yieC1b", + "6yMo7f4eQQGRn5C4pr9T9GvCCkNcNEHFqc", + "dwSMDngNY4TCv3KzjxtWqLPHy1M4jDtbGU", + "2S9PBRNJsYXa1ZoKahHttQwp9bfF89SHURj", + "2eFu9YJokP8A4FPnqN9PecZSwBKwXjAZWGS", + "uqjUcBkrMoieS5dF7H7v2mpA7o5MA2gU6", + "2hUFEB1bBdRWJP4CM756ZH6z54Vzx3VhXp3", + "CW42KnE5fu1TEzFevYM4HWge3oYS4KjoCz", + "2EdGc2LXy5Jha1uJoACWiBaWL8KuuRExXjP", + "S4RT6pKPxzH8zZb3ZX5L22F1fKsugfe9QM", + "j1AvZ3FYGEjeK5zMA6JqYy26mKkSgHCik7", + "2BriifqsgCbshuaPDvXKF6qtAauc6Y28M9f", + "xTwV8bL6cqG6XzfhjZq2RhAwAq1sCpEd1u", + "KxuGSVGkW2otJjkZqtT2SBciaxq8Y8rgXt", + "tsrbLTBEs9z62mGRQSe4koEd1cBiMBXhSo", + "rXjQwusifw9KGYe5yefVwaJ81z8S7ufnPY", + "zk9efvbDD8SvBnTCXneWPN9tQNLUb5FwGr", + "2WxkLNq5dhTSdUL1TF6ewjuYomPdpwV7Ebz", + "x49WSdipZ8d8aibBSUrxxTYeqaTiDE6quk", + "zVyoz9W2zSCfYhWwSWjsQ1xrHSVkuEYJ43", + "24zBSMs4abJXH4rmHfCMYGUZkaQf5NFSutL", + "2mZs6wDTJrEoRSWkYaub4VpgiGg2CZE4jVZ", + "2DFRuFFHJBbfePD1ZvrbforZo3ntPg32eHM", + "Ak54Z28R8ov6zwWXz4fZ2m9jYC66rKxZvh", + "2Wkn3PfetHFQzkm5xkJVK4NGcETokvDj6MH", + "2M1XpNSr3gRide7aRyufQeky9mHhVcPhtgA", + "2U9rNTcUvTT7F9pdMf9g8QPdjETmU2ux1Vi", + "2NTowTEg7K1876jhggYLAbr2AyVE8j3vPRN", + "jZDVtUiSXEvxwgnU1uTapFzPT6pfyHWNgc", + "aH3qZEo2cytHemDurzdo9hHveDmkyi6jcR", + "2XDHzAcfZu3H27kmCzT7DmEH1N8PHg5sMbc", + "Cd3Z7Lxrvdgb3EuuuyqNmqCJu2VAiionvU", + "BdU8LDbRz817PDiyJRbUzX9kvwgJuRJL4v", + "2fD34aN1kxUkKSHAVUkcTSZmVpV1ZPMK4jY", + "2SGdzLKVwRY7dA6vrfZTZqioUuR7yEWHb8", + "t4aPvPTwy4NQr4sHUbXFPCbEpPHMnHn9fw", + "2fywmk1JFBWfrbYKpyivF2qt1XjV7rTuCqD", + "zSP3W2ZbzCWwvk69JqvREPxHEvb1U9Q68G", + "2QHvvvKBKNraiCvoGx4fU3Xwq9tgrrc5arR", + "2kVXSkF2EXE7LxbcSwLs6Gyh9CgUXf2gYgE", + "PmSgmhtqHJq5Rs7LxvMTFuZH5TQzZgHamz", + "28CeHJSraNtzbtFRCVCf35ju3sMrmKGJwwX", + "22KKg3ZgPeay3rQirrQmaARYwqEqinHyppQ", + "2k8z7Me72JErTCZ1LsZby2fp8NewHKST1iV", + "VMvAaPF5xer1ajGXZRdjGLVpCMLpTc9MeZ", + "2Qj61y52vYpAJvSLwgBABADvLZ5F4BErJHE", + "2grhyrLNiRNyqTWJcGsvAbR8y14M4zuHCDY", + "y6xApWEtFdG52uzi2ZJudJUiNMsmCBFxgr", + "2dvXKoFtbt8Gwqvb2HsxWvsxf8wFfArnGg4", + "2PZCcqs48BZRm6mBQEbTC4gG7t64nNgqEi3", + "sq7PPbj2JyWywT46BNsEnnwmH9tPVnGKSp", + "PCWi3JbuFvkbpE9swb7F1SYW6aFk2tDYbo", + "2GfvH3qbf1SFs7cPJCHEVzYqjdKiXuqJ2gt", + "vgXornG4bZRsg4NUWBqrhT2Aooh8ejxY6t", + "RBV2tdZuUnj2UWZSocwTEmTkpw6y4YbLr7", + "2L3oRRE9GkyLLarwnCw4anARV5UVmNW6eD2", + "2bJgFYgXe7tGddAHSaRY9h36s6AGEg3S2Hc", + "2hjQgYU2p4mdDqHe5y4bt79vvzTeKJReqMv", + "v5e2svHhrgZSrNBkiHwjFf7r5sS5jF6vkc", + "2VphWiCSLxM4gPdNpoSJBTHQeBTAMTb4H3R", + "2DYvZpmSiM8tsCRmy8syW72jE4ZHfctorUd", + "r9iTn1j4FHt71asV4sLkF22AcwtRNvmBmL", + "cseFYUEh1qhDgfaLkSwZCZBdNWKam4gJPf", + "27jdv47Ja6E361DSKqRcnsiDM7zDongfwvp", + "2GQsqSbrkY9gfWpFrBUMJb4W4rq2tAPeWnp", + "2SkNmxHNGXFjCgFRd1xrt6Fr59LDyXwhDzT", + "2f4WVaas2bLAG6x275qgvgpaWnbMejYA7uh", + "kNzATym7CgPeLLZ7H2nTBgfBeoYR8QjHrz", + "S6zBom4WwXEQzE5Spa8DAJm3qemBnv6yxM", + "wv53C1kFaEtEdw9fRWvcMurpKfCRLj9jRS", + "fcRHD2WWVu6RqMwvaWk5KpQcDWnpPbZr7e", + "26rugbJW2TUpQW9q9ypLX17pKVjMMC1CuWu", + "scXdT4VzVWBAzZ1br9xSjpC21GvdMk48rj", + "X1GkgcZNSBJkuQ9BSQUAtmds23z34amY3d", + "24R69LPg37jUVAMmyHeS3dqM7j2mdX5uiZ", + "2PVAfoEp8aPL2Jjb2zGNGLNjTqx6A6ZsNRD", + "2AS42RwRamadzj6b4txfrurW9vcXmfBDih3", + "2kwtSmvkSDB9uWT6euiYrP96Lc1NUH5SQx1", + "qqM6vDSRNRxahM67yPuBvrJNt5EVuykEss", + "2j4FF9MWZwJPt8N39LvP7eGGUTbMuvqiwd2", + "FaQUteg23WSWdxqvZ39G6cxJgCJcAyuFzd", + "bpDBL8w4nkiViH6xz3wk5qYAfT1eNra3Ss", + "oHBvU5gzsMhigpN145k3uHL1xJFEinK9BJ", + "FzWD5iUccjFDEp3rFKeyzFnd4Y8YSpCeov", + "ys2svmjLCs77rjyDXBeKzusSxYx2dQBpgM", + "2DcbwH1WyBtvkkw3zbFHx6hRno9tE2CTqwB", + "23SpMyB611QbNvHuoYUpm6Bg7Z7KscfkafE", + "21YPWiGiaRGLcKKfqnt1GjNUAxSYkgbGRp5", + "2icA39FHL4o8VnSjT2EK9RkJ9qKPo1ajZFf", + "2FZBJr7yzpd9VkVToCNwCyyvHuLw7F7oBfT", + "2MCtyY5LMVWjZufukWRQPiN1ekwX9xdZ8SK", + "2faXP6FNQe5UU6iuJsG1rcsoQ2Y4NAFXGtj", + "r5Z3kHMN26WgHUtmgoQZ5qYRaKoDzmYdyM", + "2Lc8KDF5F6PtJtZCK8D37ogxdLuyAx6cPKr", + "pPbh3MUE1jGizzjTN7cDg7Kz8wHSFUU3yC", + "B58XCUERBveC3qwq7nW2HCrSjQYTCFBe3m", + "2ACaa3SBQtnyKifQuCcP9ScGzzcywJh8g2Z", + "VbQuu42eVtCdrYHyqZnPMrSaWWTiL6jRbP", + "cHxLEALyiKNV9aRuLD6AJBMdJb3mGpVqJK", + "7ygN2yK3oQ7iMndkSwfqwsX5sRUGMy4EJr", + "d3JNUvvLrgQwiBYqsZqf4swF7eRFZ6LzSZ", + "JaFL1fTrFqGEi6TRWfsEb6XfP9r3FUEiby", + "2SxTvW6rroUZuCtCo5knrnQXAXBGnyzHuB6", + "qttTHjfMpRgPzcjcWCEYaNB4nNZVVU51EB", + "AtfRrwvMjcvBTrBbsxoBCpw5Lte73hy8ei", + "r8ZLUe5q8z2FpEZmQDiQ9VAcp3jzmPsgPZ", + "2ZWmujCztGX39TYED9imhn2v2eQUP25pYyj", + "2dATBrygCj6R4F589c8XPweZ4FHnyJ4hnd1", + "2DY9iaqgXwhAeEVD3xyEeNwcR3YQkMEQbi5", + "HsN7mEWu5h2puz2od3xhLWUKd68a9bsFE5", + "V2r1gZtgXE5yseBigyQAScnT6YScRSrmMS", + "gp2LPg1eDMH3DE4SW41uTXz521Kh1TnHuh", + "j5218YBFmnyMtvL6R9H4upiRsCQiwxthX", + "2LvEjhkp2mzYUMQwZDE2oQzdVQuFEjaJ1qd", + "3BCoLWCcwhd4MzTvNY4zK8DkKN6PMfD5i7", + "zePVaeyXvbGdcdEBgMmyTuWny3msTvmhbh", + "2iS7zccqPhzCLWwpJnrCYrigDFVQypby4HJ", + "Ac9nPU5cdbc3xyK8gq8ibucqYcvzbK8XX3", + "2LdJtjTs2DqLVukKwK4uuURrXvsr3pfdjVs", + "28WU8Q2XPD75abALS3QQfURNAWU42esV3Ef", + "2HmjBLrJpBVHLWGZ4nMcA34Atkt4UFpmqRV", + "odB8hai7RDuaas42sC6UC4JDXbuXosDyoF", + "QeSQftaAK7auZYjieieA5x51R2QrkPNx4i", + "T7xJKGwc6bP4HCCfzCeZujkbDhEobis441", + "2Wyqg6Ub6QHv9zba1vCAvFh2aZNzxXZD1y", + "9JXQZZJRBXq89jNasT5A397KTcy9nhMLi1", + "2JWQE7JJ8fKP3sgNvTrQU1iWV6LCCsgTCLJ", + "i8fhbbMLHJry3JJzck6yRxGn5WQe749raj", + "WfVL4C1LwQBWAAn9acvryuSJkWmzFWQXbr", + "2WGbaZtSxj15MeYnPWV7UFGUQzcSUYmdEb1", + "2MNLJARNutG75d1Sonm69hbiwwWnEZJToMm", + "QWESFNiqAuw2xDq53XLsYBtmitRx67Mduu", + "pv4bUUkzG1J1V98c44E2xEpPu5xZMnzG9y", + "26iMZ8fVzHPkf2cnyRLiqLW9FG68eDhwZhT", + "Za3Lz5KBpVQxLJRwiwt21xV9g3skHhnJtY", + "2D1NrC32foTBDcowbx3DGsYQnHhwKpEFrRw", + "WHUQ1LScVYtScdj4zbsVSiKrkokVMYkT29", + "Q8ct6Uo3rZvbu8wM9QvtK79UgYW3u7US4o", + "sD2etFo4bsxVzQzqXNRvppG5mxjs5593Kb", + "LaB7KFHWyYp42bXnfMxrpDJz5fPr1Fo7Mg", + "x1tnyYT2GvcGG8HxV5oVfYfaZQYxTtVF1C", + "2iXFMtz3fBjyWUEBRvus4M9UZxNMjGg54CP", + "UhjjML6iwVhjF2cyQVow87c5tsMzFEEL4J", + "m6XgSPMLn25pQKErbjcN6ySNdGzJK6Czi7", + "RiihQXtVyb3gUqgVYz9J4oXoZJiWZcrNGA", + "2UxCaHF3JmC8u2z9wJYncxWvximAnAQVQPf", + "tS7pMxfb4YMaJrjQtA8Pj654raEdQWw4YJ", + "LogPXpHU1KSgNtunRisL3oCsPh56ov1mh7", + "VpHJKb1fF5EEJKAG5pzSxfwPVT84wvST3K", + "2ZDbmk9wq6GvDPMTx1V6fMSwXs3nta2BmEw", + "2DmmMLt8xSoDMgmWG2kzEgyyN8P9EywTGNA", + "2RHNDJ4c1CTA8gjgJLyfxKFZBfCMjVZjJtW", + "2fPR3QNRuK5BksW5EKoETC92UhQmwpQ1P47", + "2FKoApfy88pA8v5jMhRbo6Zqfa1t8KZ25fz", + "2Dv6XTJWUkDscKJYAkXakKQ8o695s4BBjdE", + "EVRDLK9n8RduQcXZDAR2jciwnmNjYfULBX", + "SANvVBkc79rUbdcYyYhAgXFaqNTEYRm5T9", + "2zNM1cfutEVYSkeDKsHy7pLEMu7voXaFJU", + "2QFCHCM7kApUjq8F8tgULK7Yyk8ryNucnCe", + "2Uj2ZerjUsjiwf6R21eccURZZa31anBdACo", + "TYLS8yFs36C99U7rYK3N1CUTj5JQ3Y64bh", + "H6qZgezxVK36ctSChodvGtKpRUoKzhgoYC", + "t6tp91kpqsYCLFEenK11h5X5SvpCZJwyuY", + "2BETM51cYTqnzC2vyrjTBKi7HwPfiGrvm5G", + "2DRyRcJxfSJB4UBv9arEcKkQQsdxmbk7L9c", + "2JfYhANaA9cV6wPr1eUgcXznUbEhdekZQaN", + "J2T8duWvN1vdrekZis3bE9B2GJzowEnaAP", + "Abcsp4svT7L1L5YG7WCr56UAkMZNcnexCj", + "ZTwiXNTh57ox33BJKBLrTvgAd44nM5ocTc", + "iqvHjmBh6om9yeoWttwvdEcS8c7ikQVFhN", + "x5xx8onr5N8ZdD19uoWMAdr2KN3pATid6h", + "2LKxjyNUa3wJWifsEhsemD3D5VYEBWuR6hB", + "WWyYjDKsdH9c6k42vYV7xUVeE3W5QMoDRP", + "2FvRFAkzyWVnEsobsLdUXaKWHziZXgPYY4B", + "pgfDSRXW8YoGJMbTygVcmGAocnacifgWeN", + "9hPAFWvNbuncxpnZSJ8VTBmvbtsNyrAAjU", + "2XSct4fJN4PbfYyUf1ptTrQGJYEZjN61QMf", + "GUuQkaZHEJi9CSKrkDvgMPRtUugJR1e1SG", + "2UDLvfTcYPXHQigHtntKEHm8omNUhxHjJ3y", + "YbB29S65seuZj11QQ2HwLPirBC21rCzGWu", + "NQozKm4H3JucTXApyYrb1xSiAVCRm92Egh", + "rnqkTxcpoJpvJ3YWBr6FBKLf2bHmeagWEj", + "7Sy46MPugGv8LfXd4HYqVKKDJUeR13Mbcj", + "ZmYsjwMDxaxS8dDHNctyqii8exgzGZGHxB", + "2PK83Ah6KW5zCAXTew6YbJTKFfUZ2Be1uqG", + "2eBv3rnJWUTY6J1uGHZwrFfs9hdEG8Qp7vy", + "2cpdD3eBPqEGC9KBnrwVjQu2MWtMSsweLXu", + "EbusqpeXdHSGWveCe37xB1LuBkRHa7HHiA", + "23dWjaxitheagVKRrv6wyp5PpeTcEWL1aKi", + "D8Cmz8fjmxrPgeuU1P2ade72x6G4srKt22", + "uGvLVnDZmaWxR9XVTr33uhJ6zgbabnjd7B", + "bhZoVKietn2YYQqN6FuoZVdaJD7BQDTp53", + "22Pr5b6ThHzveHyBHYhTV2PxcH1uCKUhgj2", + "USHbaDyDJvbut4JYjDq7Pk82VA6fp5eWXB", + "EFc1NuPKFLHpJiqS4Jhtjrqxw18ECVL5dh", + "2Wiu3sYsbbB6JXPdJkg1JQc5CWSUKoEWmn3", + "2GZAg7zBNucXt8RvYqtnUYhELVgNBvn7d1T", + "AsXziWrAtba2TeG1meq1UiFBSw99skaPZk", + "kSFHuhrtHBWrsaN81A3RnBCd86V4RFxETW", + "FhbRyXNp9PhSJZwPiXSr99p5yHxvYFwcs9", + "kWYWfkhuW63JeY9bQk5wP8QevS2pXEwQNE", + "2KjSeTh1LJezE5nfSBv31z5frLdbJDtoVDq", + "WGo3AmKPy2S7sfosmFSUeUWnrKo7htgePz", + "o7Qs8DZF2z9jYTqs5iwn7SdurQ5VkuNqiE", + "UJw1vB7bkB2vVcrvcXK1dWvJE7GrXxcc9m", + "6DXNuZqS4Qz2Duip7H8jLy1warLCLfwriD", + "5fGVmbKSah57EKmqXdfdeuULqWFGhWwKwX", + "2VFbTvHqRWe6xFazo5YfTAauMupcEdAc5iL", + "vhByUiBJEQMLFhJMndvfeN2fZ3H21rGHK8", + "n1Bq6U2q51rZkxvjfkYyfJYdkzU36S7ERu", + "2CsTf7QcA6x2yiqJSg4LPs3ekwx2B7ca6ey", + "ZdBvpEYeZ1FBU6yhWwnm7hQseMT6d2GS5Z", + "2M2CLXodzgmFUaNoJHzRn8ybK3Q5YNxwUSj", + "8o8EDreff7XVuuW6CMHxL7dCZXRfwqio5Q", + "zcfm9q1sJYmwFRcmorfUcY9pfyXDt5V5M1", + "24z7yH2uGTLGwQXxeB1eYxSp5n6U4iUcRV8", + "pNz3yFCLwHkWoEucDfmLx7de6rDVtAP6ye", + "2Gji3WZif3m2bwsXHMXC3kk5KjxQJxbAbDX", + "279rNP8buEFnxgH91TChnd7BjEdUFjhCKbM", + "Y9AeMqziJEKRjFeFS2ndQP74RAfxkPCiPd", + "9DSHXhSnRjUvU7wg7wK9wrf3Cws1rWqxdy", + "2jSc6aubgKxfGi5LEGLfqsKn6ErbnDWxz7f", + "fAwgBYeqkNsVEJuCYwtrwi9EAbjzFMagPy", + "BTTjycRbzKiq7ANJunQYeDskRD1DkWzuui", + "2B7Gfyp3vCu6ZTnmvn3yXGWdogJJUzZ6Y3W", + "u9ytRd75EitwfcdyF4mKtFMKoT7vRbuVQ4", + "sVTmfs1U49RA2tDv49mpFPtxe572ghySrh", + "dzrZPdWmYg96EbrimjCQMTQ4jXN1CfCNVB", + "9ZTPux2h63jCiwcWG56pjeYcc4VqVRaMRw", + "73wFGG5hQvP2fRfLchVSuoLLf6fD65mPqK", + "2EMjHmxZffXofkgV5mxdhvgKaKFGHJPPvhz", + "2JVq3V3XZkkmkauMrXrxhiFjvhSyVhjkHvV", + "28PpwQyRdScWBaPtbZ8Xs9QxaZ5LhsELuAe", + "jLMUJxfiBSBNF863czaNmGBUzX9USvGqW8", + "2A3ytdxzegtxC4UPc7dzJjLLsDkwRL5fUDu", + "6FaqwhbVTBKExZCo52Xrw3NVrLsa4U8RJx", + "KGAYZE98subRmLpUneDqJfmwZTfs5GiJvo", + "KHyAUg5Rm9udYgkQbvDn8HGa1i8qCHiaqT", + "qEbtRTcnF9382iD61xd384JEmuGnamTMNU", + "2TUA6iWeuMXSLPkg7mQ7kAcPTjJinF9fcoV", + "d8q9PuocjHRKkpViEgcMruihTZ7LBxPQtt", + "VTe4PKZ4m7PdxmzQMK6aEgBTPd3rM9FxpL", + "D35H9k6v7MQHv1S3JX6auDyxRUizNRthUa", + "aKeJsYKw8H7DHSgMRQ4TNegy6uHukr8zsZ", + "2WBvZtBY8NJoNk1rXvRoD6t2Tsa5dirouah", + "Wxp3BHydpoHvh8amF6CfPnpWdnZfYykFoi", + "QZ6qoEFWKqnat2gEJqpvdjYapwH1aURKYv", + "q3TfzjM2jXATnLyYswDCenn4w2nRbFpate", + "G51YQhi4WdekifpV9UF78AECxN4Ew4yo29", + "Mo4XtmT9SZFhN78w7ByqBFhAr8H5k2Nno7", + "2ATrnekWcP8mZuPJ6FtjHBRFyMsNpbuxJZ4", + "rKQyC5gwQdtXLruXRzK4KWoFE3YCN51J3s", + "2EbyKP1GoGoQGEc1nqP3jsU8jH95jdQaZ6K", + "fdFjQhPpUybaEoxSSUWcVBwpQNM57Q2dEe", + "ipToi36PJLhumbp1HtzZ7YEerqS58ypJgm", + "2EAUuc4EyQk5aCQYXpAdmNsnp3BHawKV5vX", + "2QsXdXiNettFYYEbzXMfbRQUsQjZsxFBcT6", + "2fWKm871YjbvcTBcyVxdoZZBdo1VP9GdDH6", + "22jGbfa5XJZ4JUUYNK9diNBvCy575nFsUKW", + "zYF1pA9UkjKeRLEBqQig1iz5jtH9YFBiEj", + "2FB7346MUZY3XimDZ9RTM9WhGnuRzdJXd2x", + "kSVPyoAWXSszkzUQjVxM1zo1xLKYwbQLz2", + "2ZD4TvbXQwpvQ2pGJL1oLUqVbtdQ5H3C7mf", + "2HD8hwurNHcKxmW68zjvvqa2HGTVKc1uve9", + "mCr2XgYuPL1fRULFU8vM1C9bouJKrFD2tJ", + "21mJNT98GNcQvY6bCVC1k5xqJbqhhSm7sk", + "qX3c2ZUXUpWEVaf97Z5uJpUUpDszfmFHpm", + "2my7qAW3rgLqCZ8bvfnkqvn332fJDLf9Q7v", + "2PFXBcUikRwEDiuE5PRxeisJ3VnvR7sCgT4", + "iTHmpJqSaKR3gzgZv24x711SLPjmXF5vfz", + "2dFeubDMugcGSHN7yvpu54Z3NiKdfoBZQGV", + "qAw5Dg1vH9VW5zgthhjpApUob5RcKCphxR", + "2X7yaNvNeSyUZ9odXPKVBZNC2sK6mxd59dm", + "275S5zxqgdb3QkQFvEZvmnpN8HjQdM9gcg9", + "264RKB64NHgRUsm8N27NRQgBWhUQCNZQ8Px", + "2G67wabyeqfAFn8f45bv75D3FiP5yc3fgT5", + "2Pmw5G7bm6PUZ4tuh98bWMLK5JsEnouHoxY", + "2gVSrUYSRcXFfAQ84N8euMqxiAY4C1Ma9Mw", + "pTW6o9Uu1y6TX3uPMpthkP4hFzGn2rhbRn", + "28kJVjf7DrD6dQwdS6eNccjDFeLZyqHgit", + "2B2vmEJnUPALMtBWk4SVwjF1ieipCti1Whp", + "VUzo7YVBJW2RGYmCzt58mqXuxnHCuGgNRT", + "2KhY53kJWQXS1bAd1rAsuxQTfwihUTZJbm7", + "23Bm4w2N6yvjztzBFh9m3cwhWaVaDCACKXD", + "dC1CbqNLVmGjidDpCLnWGvCVErX2cStu7k", + "2N9Kpdkc7RMFc7YoSMwLnCBrJwuHrq1GfTC", + "2Gp7BCQ1Mcop8mDxfHqw919LsHi4uYvPqB7", + "bhgzNjYzMNBdCKPobBQu8Nr3ymxApUUdbG", + "wjPB8B6AyWFiXdncfYGyaVzn9UaHL8SNLt", + "2965DLJePnk3P7gmJr8iBxBmbEvMreVH9pg", + "U93sPPLeCUm2zYq2Xr1m8bEDnMC2qkSccY", + "ZScxXN8aMTRUKQY83qa4YMP1t9wVBbcbAb", + "2K3UXfrcdPhvfibbJabjVzoUmgCVahk89my", + "2P7chzgs6ySFe2BMNVHpv3ALgaCZXvKDvW5", + "2UiS8X5DzCjkXab86BPpsLEZWTZP38kWdTG", + "2SYwoSzatN2srLEXNRFi6g9xTzgmfkx6GDL", + "2H2eDvPEMgzVsQVjPCPKKgwBigusgT74Ad1", + "wKwnsaDu6W19FJ2LgAH49Hgr93wwzceR8Q", + "2ZC5pnUGAzuZz6YVqJ1KB8X5EVAsNw9gVer", + "2RmXy98mxKRCLcWgGbaW72zNwduM9ESc6oy", + "22temNXH8CaoAjcgp4ckMmpPX51TcjUCrtV", + "2bxk56j8SzAorKkPLFvuK7rARaLrW5nxDKe", + "2citeCcLqiga6gvXT84gNgTuFQV7eZZQUbz", + "PWnDMFTpQHypn2NCgpGxUbbpFznjnsYKCT", + "qKi7sYfkX3Ho97v5jh6bnenLREUmDaVmVZ", + "2YyFV36bxB5YgnbyjKvf7DG8hg1RRRRW6QM", + "2mKeR4Zon97znL2YN6wWYG1Z2Vb9n8c11c4", + "2YQgNreV5K1Ddi1Tg4vDrgs2g4Rr4Ve68ET", + "71hXWX4ZWZjjVCBypYSoKqrUJYShxCgB1o", + "2Zh9AooP5QqPDxwD2CyJ1jpZz9Eh8uJQmFK", + "mvt7fKqNxaRmu67wRbGKa6esaTkmKrVPbW", + "4hd48TitidFfVJA7PgeEjTo5uCLYqdVx6n", + "2kVrcp5e5fMQ5nobLGTj1as4PubjUvVdzEh", + "2KXtdeAaG7Sit3Dn2e8J7qUkT5UnF1e8GSD", + "Qk6ppegaZsKzBafYnGWmvvA4A43pCEyV4F", + "2gGTSiyYR1FHnJWsM2ZwAVP51SLTS9Ytong", + "32xUWZdeEQqrA258ofviDMJKydvJB5nBBp", + "n3SNQqZseF67wssSTR2Uey32oDjgkEcrgG", + "a55rAF1QrVk2AvncsjBh2cWrz3qe7BNPSQ", + "qEWewbfwoF933ZHq2MY5cQK6ERX7jMbrcz", + "22x77efFKUiKkMAMsLK5rHZz9AnwfRZEoq6", + "DjRAQSCHqrcLpta3BN4QMYWkn32pxXSieB", + "svgWUw8e7UJ6FfYhke12NH1RHkVp1QnrKn", + "2PtLXN2AdGA6EkjyKGTUPnwwiv469sVsLcR", + "2krE2Y4SM3adGuvLrbcsWVjDjmarK6fNLC9", + "hXj3uCN4qAAjdHutkFZmgQV2frZPsroccv", + "xiNdrpYhC49FuxCAS32AJTA5W7234YLXdw", + "2ZBzmkycL5aM54hQqYwQF7FRcC2K1FhbMY6", + "2ev996qFXc14ipF2onNre4doPzJwdGdz5Lt", + "2TY4q3ZX8XNLDsLbj2BpcZMT7BTfENVq1FC", + "29mUGDmVzaxB8eSxnhHeKUM8Loq2WVV8bgJ", + "GdybrYrqnZhCMZAFQbjfYsWvipzAXKzXaJ", + "2HXhnSVQziUTxCJ7mSUuU5sX6Kd1Go9nV6t", + "272aiBoYgCHu15C8XTZYghoMJhbPSvLggJk", + "5pqf7jE2YmvrzpHMsdxPAeT7yDgkoDNQwa", + "2EdhWc1AJqDHAfxt2EWSNGy92KeyD5VrrmX", + "pChD8xx1qaCKUz4AWDKmqadDPbKsKPk8z", + "GRSTtaK2iUi62WARETPSrqbPJaAmWVJ7TR", + "2iyXPWZQfyED5keLrCvFJ9dSnDEQ4KC5jtq", + "kW9FaFMHciY54CQbjwtUVxD7aNpEbPYs98", + "VY3CwaiMFF3A26CWA3oVR1bVvGMTGq1HTM", + "g9TXfNhdHLs7LPFrff1SRVKtv8r8Eh4we9", + "w8n9mL1mvg5AuRmcXzfKAfz3KTUqireetq", + "3jXUJUNypj2PWPAPGU6RvDR6kLPQSo99rf", + "2EhPvEwE9v1uR9JWPqyVhs3C4EDgh6A83Tm", + "FGd8PaHwVmLKe7Bb2QtaWygh1xsU5jXpdy", + "zBgRHaKFhCTUrjoFmaFv45KsthnvWd8zgM", + "2kERzcke41xND8amAghL1ZGqqENALwmSqEQ", + "2g4vmC8eYjxsEjTqicVYfZ4GL4G4cWLQ9bt", + "9xa2eXd5Lcj8SeHz9Zf5r4dTdKx5f4mJtu", + "tQP5PShYf8Myw2b2GjNtCnJSBkc6Hmm8zq", + "24zys4ATNj1CQBA3jPkSb77kPkf4XUUA2Aa", + "2MEv6A9AJ46VDRTtHVCZgZBmc3gQCtVdWhA", + "Lwxvt1Bp6rkMDnD3BHkjoyjk9SWguswnyq", + "gqW3mrYhxh2k9gRzzNBuMyELVU3RwvFLPg", + "2iuD9JdwqmHX32uHBT279sm9uEMPahLFsNa", + "wkEnW3fP1bcsaPfSagbjVAkFczF2Bf6e9h", + "HJg4eisTopK9xwQojdiZk7WPEuDeexQQxe", + "2cfqJC7Yy8qksPBV1hHkjrcu2XwtcC5MLug", + "j65P9RrMBqJxHHttYFJkotAbLMtkaskFKD", + "2G9jtJG5f3iJ5Xg1mipUfo3Cqg1ob4heY7q", + "2RY2PtFPfLWuMaE2CRcfA9mpvpE442ZnUJ4", + "2JQDSNYehQMrDhYnBDouBiB27gjpzGFXUTJ", + "SecSSp2bWg12g9wvL3w9cM9a3YeNwj2Z7h", + "yZeGyGdR96oVj6tDdCu8hu9uUit2TNU9iB", + "2WoB1ZrT2pSfUC9DABmouhsA2ymwx5D2Y7u", + "2a1Y54DLBV1tvjCXhoEHnRHRi1SEpJr6zwX", + "m6A48nPJu8x7zCFKXjdLhR6tP7GMPiqfCF", + "2D5NbU6awwaBu6DVvN5aWn8wjVfF8Yrgvyx", + "27WnC8X8S4vmzTkG3DivVDNAEUh73wMvkT1", + "2eioRV2JveEzseGV8tZ5EwV8pgqzfRzkcKa", + "2EWdcFgAcJXEeQvsqsT5TkSizPCAq4Q4gw1", + "NXjbWdD4E4nVUVJr9hFCgUMvAk8vKVv4no", + "2kBbcZPh9ESgDiGQD9Chgnuqp15hp4M4d49", + "2kMgnRmiJusFHFzRhcx9NhN8iyhgYUNyZ4G", + "2XeiysuxPjCr6LQDCViz2baEZqLe4dRopvD", + "gheVR16FBFRPB2nqyZeh3Z7BvG8AaQbjfm", + "mqKZhBAdnwRNu9zfSLhkFbunw7JDebw1KJ", + "2ShXZ3ABrVUgJS7x2BjnkQ76NAjqZMoAac8", + "jFTEEjkzbcEy3siZMPW6MNUvLfSfTHKbk7", + "2KRhnJRGzFQZk6b5JdXeSGnPoZ93FNHa8Av", + "28HC12dpjRYwuGYokVZqFWG4yb2PohDvqZ3", + "EngRrHn6H8XWibuC3umWVwKUZu3fubn5Wk", + "KJ2SrNrpVRu4k6LGHWXCtS7u791WyPZsxz", + "2Gj6RaT3GdnZGTLZhSSdq1YLftnWiq3Rn1U", + "2G82D85gXbTNrh3omKGo2dhU3QX19ahpPct", + "9Q9eAKKF6gW81Y1Lt1fCRWqxsy74LALLxG", + "dWf7P9kHNixeLXezF7ALSnyKRzv3tb1oPP", + "amStoiSTVCh6Macih36WCQjfesHrLfZwTC", + "2mZDB97w1uHfzDMZySeJttXnbT3cpWbfJim", + "2AVAusdbM7qx6hN9M4CMTitvoBjHaXdb6B9", + "JBnibxjtgNRSHRjniQbkWEg9CczT8vikkb", + "fJ9RcPoAZsfC5Z7xVNKV5K1f6p76kpqPB1", + "aNkM9Y9rzSnapxPwuJ8S2mPzSpoJGeAi3H", + "NTcWsoz4mEDmpLUqSayMHacDcMp6PbigCs", + "UARa6yBWSYAdutsFGUZksVpLzuvE8VRpue", + "hLCpMLHxfCqSDpd4d7EtGiTiu9eqNHVv7y", + "sZDwAoDuLNv9jgzVbCYMorNvsKYgyxDtwm", + "WBuffV1ZEnVxkxge1oqaKM4LxeBHhiXQMP", + "i4Sw4wKLk3rwuK84BpTkm3FaXt3Dd5Fzst", + "VQV2axCh8vUhDCuvQH6j718PxRNK9pRf62", + "27wF2RLDdzX2MQPexSVHqpD3YmgoWC6VSkk", + "22Q4YZpZbXiJnHCejynUUT2f2bZiaWPm5ZS", + "2Jd2JaBEG5J66ynwxLjvKcAQDWhAA8Zfy3t", + "2CZmbuyiNSBScu2ySM1zyHw2Nm4rnx1qA29", + "mR5Zh2qRosvdntUHXp9FNBaGizS37RrR3s", + "2CxZNSjcbwF84SaURg29Ekf7Q83dbkTWzdL", + "nifeEr5FMsJ8P2s9uov3JtEj6GtQAPVRYV", + "XzMY8DzegifK476oax5RCrKTrfHP1GvbSV", + "2UL8eo2pmRsZm14Wk5GEKdKhQXt4n7RNReo", + "2R3kJ93ydK9biwoW4wNytu9atugmZFfapZY", + "5SppvUZrFhDJr1HL9RK4cYWpkW5XyMa3T8", + "2YaKHDtcsBPDsruivjW3WU1bk4oWYysKWN1", + "hqqJyFuJGqraAdENHnmk3tjqn2KCCzNuCu", + "doWGCkfbZfPUwtwDkiTUvjqbSMPtF5iqRN", + "29p5vKRkfKNyRNzZezQ367dSCmQ2WQfCd8W", + "5v1WsP98EtmyFGRkV9eZzmFwhoKYoCUjxG", + "dJWPjQ9bK2Q5e4d1R4TN8ELmBvE9CtWUjk", + "df4G7zUS3q71hREM7gDeKs2Jdy3xMYaKmk", + "2kTitsnyqf3iFck7pzEcBexN2di5q626bGT", + "22EMNTEUr5rjgyuNdJDjf4EE9vu1UweXks2", + "XWewC5ys9aL2HTkXpSR9EePaeY9d4JqWY6", + "2CL9NnXUTJSUnT6rVkETjkajgTiKgxkpehB", + "1HdYyhcJ1gs34DJdrw92q47kGdVhJpqGUw", + "2hXC4pYWmYAH4pHm1QhdUWu9rAxWSDSiSYD", + "gZSgkE59bV8xq22wRKLL9cbAxAybekMVNk", + "nPeoMYwR1qcKu8uWkCUBvdtduEapgoJ6cr", + "2g6WYh3uDwuRWxdqb8dkQ3pA8DoJuVVepQA", + "1JfGCbVEtodwrh8ge1a5BWLCizftsKohpd", + "PL6T69QRxPEYhh57nVW5ZP2frgEDakE3yg", + "Ek4ZVJPkJcAYMBXmVK77VCxWWzj5dHcUBD", + "tDGXNZUk7NhyXVD91R92RPrC8nEX8C4KnJ", + "2S7nLTpD8oBk77jbmrK4cbFzjjb5ULfJutM", + "NcqCL64x9cLFupo2Cp8VBiEG4jZ6RkweDx", + "9EWpoRyT3LcCBx2XDcSVqG24p2JHjZdMQk", + "2YjHEM53twokKsv9vNgXCgZPx7yx2f7WUi5", + "oVxPm4zQVFB8Tn93fTjDySAwoBLg7qC4u2", + "2erUMeaiMxGgbSnGg8SrMtNSCFfKtL1RMm4", + "ah1EdcvTbnRiSQzmjmys7bsPYiELZp3uX", + "2fJHwfLQHJKarRT7aGspuNeD9foL5mGR8Bj", + "JmS8nQL5hm5GPZg2kdFhbKEcAAE61zrGEs", + "27vpLnkjnkbxCWCxK4E78SdT1xaSwQFrYFt", + "miqaYxDjRhHxiT9pciQJrkns9mbcpXZGPA", + "6BZ5cmEFMt3z1zty8zdMJS9fB72DeDb1mi", + "257ZuvtWwfdcUWpgguM571CLsTHMdAh8BSM", + "2PLGyxDpMuXkD3K6Qxoui5RQeJmTP3JM5aU", + "hSmBxbq2bS7Ap5VdkRiqZnopAAoZWYPc2c", + "MG1RMWzA8CzHMMLkDZ3M3P5QkPoEGMR4iY", + "4HPd8g5iSZ24vyAgsMWCczw2MntXEnjcn9", + "FUue9XroCvaApvgtC6vP6aFsS9raujbboZ", + "x3BRXMaE1Vq1B88ijxZcfGVyH1L3o3UE3E", + "kFt65AqGUcZ6BnYwxkg8ouLvMU65EfnpSG", + "EgToqreozYyjLoP1RwJbEwbDL6BxVGu3Hi", + "2c8Ma4k7SFFut9KH6zFJDj3AWm49JVwfSGG", + "2kjAKoUJaPuvT6LLf9MJHJsipaFeXxvZGFS", + "2ko72nZJLWF2uRK8hdgdpA8TwZQAa3XbKLY", + "bVTQrQD9nn6FU5EW4FGTZfhGsBSgNmAwRw", + "2AGXtMso9sm5P47TwYaVKTrRyK1SdeU3yjg", + "LhtGk6r77ExeewBzTMbBbb16mR5Y8Rnpbi", + "t47gigvmPnC9a2EdrfbLzLrcNdNUAZQyta", + "RPZucq2gsguqnbyAxSMrMFydaFnjtacE9k", + "2QJ92zVRimrktnLab8GFB7QUe4dvSUr3oBv", + "2buZakH1rVkNHmjxmfAfW2mZXEHncsL8eip", + "22wD4qBLR11JoimzcE6miwtgG3ngEbhYmts", + "aiS6DEwjHwVybB8eyU9kGq9SN3uVBxRACW", + "sPjLfyfnkBidqif8hRywECKUsaSoNb6Yhv", + "2jXw7Nu2DgH2crp5f5ZrYTGk7RMSAfSSGVy", + "295YKvNdC8r3qDwV2pHF7bRnFz4sX18rLqg", + "BJU2EkxAaxfxLQ87uoQtmk5MyzYXyE5395", + "2huiXTLXLt1nL1n6oaft9Z6hiLDB1CvoyZY", + "2e5741PuQ6t6my7pgJZajK4ZSWCQusw3zAB", + "27ekJKoVe2HoLeeBCuvTrwjFALC2QT6wPQ5", + "28qetYhMqtMX223SnCG84uc5z6Ba3o3kXez", + "pabLSpoZ7R3oD2Xb4S817USF75RdLA58wz", + "3xRRkeRJiTSUAAftxCucttZ58KctQhi76D", + "2XcuDdxW6HawGcDEUkJRkXvBc4ZdXofcL53", + "4o1a5fFaFQETj5dKNDGpFA6s6cYofQw3Ly", + "2ZWnE8qXSiitCPf1qoJBGKnsgTZnXZbBocS", + "2eMDQHRoXkf2HaE5jnpfwsm2whPhBUnZ8ev", + "XTutpLyat2NHDCqtNU5ZeEmsyNFf5BbV2W", + "7BMFBvJMMCna4qWGU4xA9fCBdc6du76tBL", + "tN9hPYbBqqWm6oywzCEnttYgevHt5EtpJi", + "2Vmv5mgessEsoLRzRVHeErhGh1BgbhUX9vN", + "28nJZQJXcyCXcRQL68SKpgigDgXxdsxKwJo", + "FutR6b55AZEbmpjBxnvw43SKgJ9yz8347Y", + "LBP6mi9rz4LkK5uT8KdGoZoBBWNQ4EcMXZ", + "2JUkgNUX6CbrfHA693MaVZVg2EhmsFjBCE9", + "dDurygy5tph6k6CbenucjHq2pMeDY7LxXW", + "8Arek1skSnERYfL8DJD2aoJoyArjwm8TBi", + "2hsoYhBY6XhfREDLQsJ59hQ5fbrVYxaSt5C", + "2fXEJLW8ryBb9wyZFyGAp7vEjNPjSnTMLo3", + "U6sW3LibpVwJM2UA6oCVMyNS1up9XTH9Y4", + "FL2igxLzxxe4v9DgtLnZeAPvcnimq9S2h5", + "pxLypSbcXC7mFn2aL9sW5w2bEiiwGsSAnB", + "PXoDpxstsNGarHJbYym42cQPxRUfrhKPng", + "kUtHWMzuSuXRjqDjCF7a5Bu8HM2Ea5eXUi", + "2LAfD9yJNeaBAdhyKmD6S3kMcegV2J7J9Xp", + "8ZP42ww8jAJRd1sYPaeGVN9XT1amDEDVMy", + "2anN6ZShHz1fsXPDKpyHZAzTjomA5Xcd1f3", + "LrjjNpBM9QAxKYCqtsVd1gBFFoNKKFHxrm", + "2dktQJfAcAHcYznAXUAySxR6KDyE4fSZDok", + "2RuYSz89YVpxbbJSiUzAh312hFSHgDgejbs", + "2E5E6krKnyCiMKq98RSwCMxPwSVVGcddL5m", + "c44rh2ch6zmBbm5vWbTQyDmTic98bn3GbR", + "6kzn1ehUgWAnf5rKHAa36nFTTDg2yuE4Ge", + "KBo4PbckAGLcGaww3Q68HVynww5obFgfUM", + "sVB21HAJZaSQYmoEvPzwW3MaL8XdfqCrdC", + "2Xx1gA93rtLhdC2nYdXHDFgoJ4vqMVEGUGK", + "2ht9CvsP3K9kJGxw6tvAVhQNYscwarbr5m3", + "VM5iCziZpxRvcoKht3PEp6xjd4iC4Ltq5R", + "zHpt3Hh9BnYSVDBQtjgrSTbxx6TX9NK22i", + "yQZxBn9cDU16NacqgqG1E1CN1bVPvFpHP5", + "26njdygvPE4qwZZ3Yj8r8Nr6kAPL1ahaega", + "XE9ZGsSoD9D6yyc1fmSWVvhymHtALc5gq1", + "uqXZWnWQi8924AnD14Qefo4Cqp9oyD1fdg", + "A3kW6XJAtocb3RZzxp1hhKUi7x3prwARst", + "hcRypWRZ95k7W54cDEQyhXbo3jQJhntSxL", + "R19BH293zm9LtwHUmYbwY1nRMkdiNdcjUW", + "y6vz4cEbAYLxo5YpuCATXmpBHHXp8baW6k", + "MVXpZvBBZ1hKXpoBb6ADEZ5PskhfmQoAY7", + "7nxQpV5JTLdET8BrS5u1QBKBdXdoi1n8uu", + "dNwTPXscUyB8DDDei4uhaFNVn1zwZZXSXV", + "HzqUKWAye8ELT2dFYJXSh7nxTEaGmKwwqQ", + "E7ecz6ByxYPH15qi61dZxVTnGVfiVSKXLz", + "PbrcqhsS7nxABkacLbS5D1TcGNmbQjNJvw", + "2AbQzSf3NJF24Wbz1Q8yoNnb14XkHQS4Skk", + "2feEwyW7kthjXyDA2PE3Qc8zK3wZiZmpHb4", + "2hujgC8BN6mm2ynJEWkUr9u9PRTmGpW4Quh", + "2ZQNF6xDTS6u3PdsFZkUUw92x6X2E3heG6Z", + "2PYEWoh9vtehcTiXk3aKbaU9MSKzCFmdEdf", + "VbAJiS94usC6xc2g9gC18B8jJ2KJgJtNdZ", + "Db9Psfwdn7J2JsnLn5PSVYkEP6WtMPp5H7", + "BTmPvxVKb3o7B3qP9brwomqcaWDaxG4JTB", + "2AZ8TkwAxiYE6dp6MmEdajMCJFT9mJ6SCsW", + "eCirqjde3tABttJq8nWQHhEtybfKBGiYRT", + "FtuE4z7jeWMMT3GGwyrzc49w6EfVpx5ACL", + "2JbSrKi8iLmGEEtAiaRXv5vjgf7hCDxvfae", + "26CWn2LeVZf7nGb6zS1T2Qq1sMbDMWpDfSk", + "WrNnqNhLJRaSg43oNRn27znvUL85Faj2G7", + "zvhWMuLG3yn4DNSWnZv2PC8KL7uf4zzA7H", + "2Vv1fmjXqwEtqm1sFmbVCQFEtvRR5nhYic6", + "nNEjceCZGZ39r1rEDkNNi1tvF1vFeHgjd5", + "qNuPoX1Pa2GTL4VTqtST5mFUH9514nCiYB", + "4aMDuFNdZLL8GUHwXynv9yRsDvkT1eYwbW", + "2BJ1a7MMZ4LyLJHyYmUDJXTz4BwW2m8NpD2", + "2g5HsThBpsWyBJCH3vt9n5sue8cY5F6ShnY", + "2ANR6AQVnBP1ELMF888y9bvMXBGotyPF27d", + "U4kMG3nE55vggZhY4g5W2b7LJFnri38nXS", + "vP8LuC5f3JsyuxdNnjQE4cYX1x1Jneq91U", + "MnedMSKUUcFWDH7t6wQCHUVbLpYCVz54E6", + "2bYCbfrHuKT1qoipEF2WCaqYF2VLiWVmStr", + "21g3DaraHoi3ErJPnqVhmAUhEKYjaMjUX7z", + "KycARv1ZHFhHjMQRi8USeT3fA1vfpvixg4", + "PeVNeU814LHqysUkWjBY4g6HDFAWuvWU6g", + "y3TRuV9sGEkLydFFeTUv63rbKmD8P9tdMM", + "Qk45V9xFiTBGzc3V5KuthUYvm4rwsdCcjM", + "v5DJHsHz9Hxk9qtjGrWhhBirDF6jxAQcw8", + "2YunxooVtNTGUTuU4nymP1TstdePX3CjgfJ", + "qcUNUmuC2PxS349R7Zn3f8rHs5Zr54cTeF", + "3oizXQ9A5Faaz2eUfL2ai8VSZQrKUrq4KZ", + "28AfnQzpVgh5PvrBBktYWQrFXxzeNoFeZab", + "jZ3aqq8Gpvqx6EEyufA9XbwAtaeo1Z4XTW", + "2KAjjMvCdY8hD1NpYJ3N4PoqAQhxJxsLW9X", + "2EXCRGeRVSG9fWMa8TAdFozZ51BM5wQQemb", + "26SrUQWBqXuSiLJtPpSuEHQAmKKrSopVanP", + "21TCNYspXtny11NsSB3XyHnmKhHMYb4kCQx", + "xHj8ZYniXjXxt5nKNP2SpHAS9CHecYPEyE", + "ooV4AyjEuTxDbGjRv9H28EQNrZamr3gkFs", + "2fG1VLNPHRHx2STRwmzRGRPYUMoy3crF1SK", + "7Uv8eKHSRSF2v529FQtdSiqj25KrwUdtQr", + "2m2zaBUFoxDisNJDvYAiHpniVzhPKXyHKer", + "FWZeG7EFVAPqPSuv726QNoPEkJTfMJs7sW", + "R3z5YsC9UdeyateCNM6cseofr6mr2YHiF6", + "2bEee3HGuCFBEXfo5ptYvJxauAX3Z491ne3", + "YUcseh4SwGq5s1o1z3Je1AxyvYxbHaXH1M", + "2FtFHEEjpUZABFnYUdxfwJgN2f8cNshQBNK", + "2A2tQEmDSVu4r5e4V8XpHjsU7sCUGKg3k6H", + "2iEtyRcCr8BJDjZPRdkhmjs9DPdVeZAXAv7", + "2aDtoXE8n8tqt74Nf1t4vewhKni96mxs1Hd", + "28aWLBqsAWvV9FZzWGyFZbvfCcbXASCtDs6", + "2TQa7jL32GxVjpDURjA7MA9ttoPh1LxPac9", + "5D2kD3VjH3uHRPZR1KGsDqq1pG4gg1L9pH", + "2jCh9sVAttBSApgpQbnXneWDmEABEcUWes", + "2HWkxMq5wse8eMzdSg7SFRGdL78dhCrUnQF", + "2USF76oow7qg2JYZevCso3MVZ6oiLrKajnT", + "2k4dhY4LoyRm8wNFvxpSYWpzNUdEmpNwAeM", + "BYPEpZi8MMavCg72qYgrjfamrMefywbNUX", + "EXqYUC9qGhkocaAS977mYiiHTzxcE5iLjP", + "YL1xTa11Q5P8W9dvDhotR7HidkEt8cqDTk", + "DcLFpRpQs8DnUvx1nButqKjsgrVJCM3gA4", + "tUyQ3qtuLXY16DA8ChmavF8k2iSghuEZba", + "2bSgdeeuQcACouNKCHr77Myc2UckCHgLwoa", + "2LuiyDaLRELuPVoAt73U5jxokVhUzQVTkY7", + "tJp2cDzzjc3thS1peTdHqojjoeJHQdmWVw", + "24AAqR7Z84r7nWBvDsCEF7WLKwPhNsrZTfd", + "QR9XKx2hcYwQZSn7s9uZdTpuPhCD3SPU8Q", + "euPtyPekuzTWm9MtsEYtwMSfw5X6vfV1n4", + "2TmLQvUuow1UAQ5ZQ648sJfMieajJFyDyee", + "r8W8463DSkaeMXsHVk31M3H6fKf3Tad1da", + "2P5bpaSiWB4PTu5ReLmzrU9F28Q3Nzi67FD", + "M6ptsP2BtArEYywwfs62Bm6wpjvgi8KUHf", + "2STvXAePrTriUngyEB2FXgHyjoJjovDn6CL", + "2h8SZ7HZqChSidBXBR7N1KFRBrM9MgQxhkf", + "2daoffo1BrUSQvySftTVngVk1pRXFwmUjzd", + "QyipQphGo6eMWZJcGYXjN7tVNNRKXXGJfZ", + "zHLNxJnUiW2Xu7TQkXodaGXVe5kcPrrjhz", + "fbGDKVQwg8b9RZmmA7ruce82t2LNvPtQ8G", + "2CezKLkxkZk3uQs5k9YrunQ77GPVhz6xWXb", + "295jZueDnavv4qNSN3KFbYME4N35hirB2z4", + "CFkEWjxcuV9HP3QFQbozd8tiPq1UUNBVk9", + "uRJaiydoRpcEVMMDPaLC79Udh2kYLeWtbm", + "3aKVUkAw2uwD7yiVYoYpRhu81kLTySHpNX", + "3WiEk7ZmtwteTTuytNMf2xTr4Y2zcYc6SR", + "YFhB65fLnp23BdvCcWuZcBegQ5Gts8kbUH", + "2RQaD4ex4LBKRSTAYhrXnZ4w7cMguM3dMHN", + "sPdiieYPLeroaSec3qmuAmP2VrZp4YfvxD", + "29bB7wKVhKhBYpLB9HLt1ehbVRDvCjkxSXp", + "DvXK9casvN59sojtam1rYVVENAgKva1fC5", + "BRcWLz687gDQiMoGzdH9ExNXgjUadhxDbv", + "CfXTPXYceco11bEZ7WpwzXsu9i4buiGHdG", + "tvwyK36nRQUbt1TJhaNRKWnTYJLgHi9eGn", + "xVyUggaKkYhNiW9bEaztZ9epKY483kbn5x", + "2dWFKMC2c3oUksE8QmRWwo8K57iW1SPTGXs", + "MLVKyKDSbirCranKJFmiTnHfdHvtf4MaMb", + "27vLouPtqdFmrCkECctwAt6zQ1wpQ3vbCJu", + "2aScLc7V9im4HwnUa6FsXcNFRxMYZ2i8evw", + "c5hqkgrZCN2U3DdpXNaT1mghv9qWjLJqoE", + "2k3hToJKR62vQbNEHcj8FFn6ttgwGyDRAA8", + "2EiqFfDYciqBFcHKECQTYAajppNq14a9DKn", + "2N6awRsijdC6ZSrGsZStoc4n6vLtTuSFi5u", + "2dp2984zEz6RYFziJo9oGmiL9rNam4umhv2", + "2aZoaj5o1Ws94ciu3RGamaow8yotwk1QoZS", + "32jJQGued6qthCZGJsjeEyErVRBXW8YERZ", + "2k2vekekt5fZGkJDvcuL2y9npEsNGRyo8tx", + "Ht65zgYDWE2KLUWxKjVkeJx83pS6xGHZwH", + "W1i9YxYwzwDS3wG2RwnV1cERbs7ZTNyrMn", + "2gRyTf9pXQigUxgcn3HJT3fk9E3ur1vJkX1", + "GRJrCk8QMVuM4CYfFiLM6v5uj1kTA51uMF", + "fS6d7x6FGDsJVNsqgp6hmDDY7zXHFvLDVg", + "fbB3oweWooiSniSPN2Uhnkk7GQmiD54FUV", + "2eGzpSwFLVxs89eCKDuFXnRK8PaPr65GDD5", + "2AZ5xbx8tRVyFW7VUHw9uCzfFQSAtFwcU1A", + "2ZMrWv6PDN3wu4ar46WoiTqrHwrKkY7w4m8", + "22GyZB2fGxVsVkHstTNCUNpSt1ydhjfqwTK", + "2g81ii6LVKj6vpcuupEcZV9zuPVoxVgA9Mo", + "uoCGmWNtezqosyaKY6kP1iw1p7xfDG16wH", + "2aUzxeDp1iewqNjr72QwFB7DBx6ZvgTUEjM", + "22fDSGFdhti7Py7zykMqbja48SVkQfedsBA", + "ixRXVfn6hMRUsdsJTE7GgMm3Eid4UanKcK", + "C4HyC45crxL2Dy3va8PFhJEayicUSNcmPF", + "2TEgtqLSYXH9QVAU3H3NsY29begjFLs8iFi", + "23tWavj2UgBg1Jsk3G8Ns1HeYoGkqtNFis2", + "hNHihCGa73WtGv9cfZFrbqorAH3pvtcuuZ", + "2Lwtn55kqb9d6BNvD5ecJW7yBfZTxF52rhn", + "2eMfihWbmnvZ4KvSJPbRiSTTL3oFv3nuMTL", + "2JQ4BWC9BTHUUSHpd3Xc8S34xrenukdUSUv", + "2i3ZhPSdnp8NswPsw2p9883cfm4zqUWkMFN", + "44uk8fU7k2gFqerwkAKTFzWvwPayWmjTCx", + "2gDeQvfwJnmeDVtQt516hUbxUK1xTZfraay", + "2GtoNJMcB3RBxvNq8qAo5xvZiFHSJ7dGKi", + "289R19783EYott6pMQAPCCA5MkKpDSrUBoN", + "BFP3PK4WWqfD24dLp45tvGWWg6RznWRF9X", + "2mPjq2MP3jDs9hfvjJPewuWui4GurBUmcGV", + "2Mfb2mini3tccBzstfLvbjXN8a32pv55Gjq", + "eGmq3kfnftYqhv8igCHdBfYPfiSJyjL1AT", + "hMTQToHnS8wyu9mmt6KtZqhZ4JxSJrbGxh", + "VzyfHd1eos6Vsmhikpr2iZPHtdzMKSYM5X", + "W9Zgr6oM5baXiQSVDFCemfNpoKCn4Semhj", + "hJtq5WKgFE7xWJmoHwhqi9S297YwKNxpSA", + "86kvVQHJQMZrNBHctbqmuWNvRemU1RhL88", + "PGgDzvKoVmK7MVy1r9gFPKNRMRAjAEhGAg", + "2WawfhEctHJCXbX71vXg3NyECnZYmjpHqQS", + "2BBtShwjUwPD8g2kXABNo8fNfNB4zUL1x9M", + "EnXRAsuNMnNPjXE9zJDgamtdnjAcgE6qB5", + "bRMDHVuxgK7nVWRrHbM8m2387KS47C2Sdo", + "HMM8ocaqGax5YqB1tgx8xxtFiX2G99AvGa", + "wqMj7Cdd5AffBtNbd6hT7Kp8XvmTB8w3wz", + "VTJeVgM7vdHCSCUZftuADNgEubFWaBnmP1", + "3UVQ74z9hLVxV7hoghseqyKgGcok7uR2YC", + "2cF8jAYUp42i8HRJPu55GwFKor1Ur5UQt1i", + "2FuLm7pRUJtmDox91PYhLjuk1VX6CRYAdSB", + "2g14ENUNkP77iRgT9YNZsZvmg3MAToEe2iP", + "v2L1JbbYFAZdVezpZdw9crruveeaYNmmqD", + "vwT5HtduJmX8vPJCEdKps8xm1EeXdSP4qR", + "EJQdcnbL2qRD7DSEFLtKYntAKGuSkvarZS", + "jpotWYe8jjXErZZgYjbeRvVjav8Wi8Raqs", + "QTcmdbXUHgqAvnm6s86i9gXX2YKc87Bcko", + "fDFrEE4eZJ7RKSj2zMLD5b9FycuowTgq1p", + "zg1vUUgNRKPHua9Z3h2cjrComgyvEfzAjZ", + "2FPvP8Yv1JJr9ufeZWTg3Lf1qfBgTGatMWz", + "jr4ZwmRgGFSD4ZH3hNhZx3udHp8LdvanAf", + "msZD8PQsmt2fWufG68VGzyRRi1qvpsJdQ6", + "2YeyFYSEwvA4Zif3US662Wmkf6VEsJHKJ7S", + "DbNKRPLiiyqMuC75W83wzMsrf87Wcvjt8Z", + "2jS1HqNnnFKiPsitjFmMgZsSJ9yxXy7ZPGW", + "2FE453QFdNnjJ8RMA7QyxtsFGpi4wH2q2i3", + "25Sf84m7VBrdMQK1kLDF65ve22bEX5LGxua", + "xU4LQ1vRi1dyYWFseNnPFWyJeYMtohyoLZ", + "Ms5uBZoBoDxH1iFGj9bGPo3kpEqSuLR9Z7", + "cngBTW2gGvUcGkxtixnRgJ1fnj9GrABYSg", + "mSWApCCUJgTpT4HtABQDYSVupEd4UoL7xf", + "FjzvUD45SqbN2Zv5xRGWN3SNgLG3B1quPB", + "25ddKzdgp3TmpoEyqQTPc1yqrYfmcsJqXac", + "2gA5kcj8gx3b4zhFXN28JHDG5obB4wM2ZJC", + "2exkzZ39ZXx2Hvt7XMAbAGoMb9kRetQC9xN", + "29VCcYNC1soY2RnyjjG2c1FNhYcxdPPmDwV", + "2d6CABNcvWznWgxunfjqt57AD6N5VjbtUnG", + "23kXjScid5HCyfmvtJZ5pdpA3PucTCxiJoj", + "fFRZH7xwVihKMGiDUSUoWZMrvtQ9j3awxX", + "GxFd4XqpLQQWyaH6Hbtt1piCcXJ3rqdjZY", + "24iVPSDSRLktUj23YdXp3531s2Dbd4XvNpn", + "dQkEJxUmR9MRYKz6iVRa1ms22q72nYn4iL", + "dnjXVAWJv6Gt58oNTtHD63Z77uVkRfAHos", + "qckoWihwox9rv33CE7e54dgWLaDY4itqrf", + "2D2dkjUMVgiR4yU75WvedcKvQSmwCj6W6qk", + "2BvfGqZYwyFaXE1nvzsJ7Pei25x7v4d41yR", + "wzxU9YGrkjLFuX72F2YdbsRm1NFR5D5CMF", + "2YbDyeXPvC4bHMVczmgQbvY6gJUYpxVRkB3", + "dFVDtdMt6R8ZyALFiAvBKTTCqKBsU7E3DF", + "2fuX8DA98usnxbChNFLQV4iLE5upuWup6W3", + "j2YAkSPuE3pRw5jEwozATxZGPdYcETedj", + "wsBi211Y5PXahQaxrwKU3P49ZhQbubeZVj", + "2Bh7Dh4JsMR5wNttAiFtfoK8oBcbGLt8nDg", + "21cxcry6r3Y8UU4dfQUJ4bNqtgf5LWZNX4b", + "iU9oD7yPQPzxdacx1GCuaypoyUDDVUe4rN", + "2JgLq6FqPbKiQgM8u5JpgcgiQzn19psNfgn", + "2aSVoqpBng4KFqKQtsQVyCCf5zKqH7dWHEY", + "22Wi1Fno3wNCDFnZfQjDNoEbS9TDpNNq78H", + "Mhvb5fHdboaap923fJxtGXxZEojtY9VNU4", + "Pe6tpFpqsEu4m2o3FkDmDpHU6w2dCB71fk", + "2f28YxxZCAGkVxkr6DVRWxTvVzKue8HPnSk", + "nqAJNrLP96e1WJofgHQJrtSA9gTpM5L86v", + "2XD7UGAGJupLTuk1Yj22iQ5CwBEdykMBsP7", + "LKa5BryDBB7ug2dZhrncoS8dz2cUv5K4Rb", + "N7RTfu8LMhDEQS3eSeJjQzBuHU4Yj3rLwd", + "nr7MwYTRWKKB8WFshUmfsDkQrjrax2H4y7", + "2QocRUM19a8LVT7CnjoR6HJWXntXDJsmmDF", + "58FY3KLFKkEBAWna8nH2oquov9rCyY5QJ2", + "2MR1MzzQzfD4AUCoXurnjdwxwhgh2mkcSwj", + "7uHb3zmZTmSQeSz1HARZgZoDErWuDhhXBA", + "icXsPHrk6NcLhUQAyMxZTFRegNLqbkajkp", + "XnsKrf9qkQnZAD2usiUvF8aKCXhVb5Da7d", + "oEBRgWgDt2GcfBCcWMEpJ8RBctd9yFuGAg", + "24RGKPsnsQCiVkes14R1RdDEhscy7meGA1f", + "2hyLKdVomKv2Tko8hEeQMkDn8HqaeauThcw", + "2GMUDBMXe6hepJV7uefZwGYiB4invamLZ87", + "2NSk3tJpFCuGybSR3bNngirXUeykPfVHr6e", + "TtBZd52cZhhjdJ7t5QXUnPXo3eYkQVuUuR", + "4rkTmJ82Db8tMxb2yZQtAboVnUUUBaBy6k", + "rqdH4MwHbFHUVUc2692jXtdXZqcAhxjmkh", + "2Ra18ScFZ1wdv2gTq589fQoYDfCJR74k7HR", + "JQz5ohVZEt8tZXTsPdMJE4Cpgb6WdcH9um", + "Ckdc3PiH32snnm1PFMwcjjEbLn49evTU7Z", + "o69vXRUxV8aX8w3FDauDjeVd6RcDcaxV51", + "2j4DCNfztT2cBPBdFEaf1Unk2HjYRA7o3bs", + "24Y8B4NsqZo9PH5GSeFqWwRaKDcwSpRwX3Z", + "htTbpfjWK8gm2wmpy4FRnLPSTpe9BeAVHH", + "SqGxx6t6iqn8AZsf14mUBmtUT11A6Zq7tZ", + "2QBb8ikJsYv3WdrFHjTPNF4PuLgwkSgqvPf", + "2Qb4D16HgVzNndycVjZXRrQyYzdEe5f1kEt", + "WqEbGKqH94Xtkzjh7pGWAK5v3UfspRUpfg", + "5aGZPV7q3vowUbhS1VAhTCXtouYc4o4srj", + "2SgENwkuMyKh2s3wdufjWg3JW3sCSjwFaRr", + "2W3k2kdexCsayjWpP9wnK7JF2Khw61nvhGa", + "4KYYn3BErgD5eswHs3rsEQZZWpsVYkXHUX", + "mY1ZbgmxqvP1JFqdq4YzC31SQNd8oTGw2c", + "qC6deJVWhZqKPbRYW7JXeiUNf8RjrAZsD", + "2YKjavRXaqwzauLALMV3vECrtjBJXVd2CRX", + "2A3uXa8GWNomPRJmt1KspWpTuYgUJbySkwx", + "2XJe7KXzxUoHXYdAnhkvDTr1EJU1xqhP85Q", + "NfaqAXcAAri6fjf6PMZGMugwiwiYHY1Q7z", + "2T6Qhq7uWCx1YguXya7weFtgtChhaV29bEF", + "22xPFCd49usGrtNyAbcsmQtyCDSUd9f7N2U", + "pPsLH84x8r8ZJat1M6cBMuh1jcTXnq3sLf", + "kyACjo6QicoctHQ7AyRxTCviFzqJKstxBK", + "2TZk4CMbXby81a6hajgeQRQoiL8Kw8YmUuw", + "Ap3j7fzSCDYeLeaqDyRhngsaZbvX7GwyRs", + "UvDfq7gGsCxVwcDGag3kjjT5g5AQht3J32", + "xKZWXzMkoHLyGYRhVpRtAmbJU9qNqHiFp", + "KfUZUpLCAoASRtSgeFqeieYBGFBNLTQJFV", + "2eit8zm9DPNrnhoHy7zs8Koz6Jg2TpS7sLu", + "2cJEWMdNjZaTWttc3yqsNkTaMyQcqYSinyu", + "BQJRWm6W9zFXMKaqAR8Su1TWXNvyN8PRVb", + "dPpQ91cFJJHGLCnK73re86f3dZcvUbsptA", + "2Tn7ndbNiTtAdcRYv9YdVYQKm9wzSe9BjP5", + "dzTmuPoa7uiwtZjTmyu79f4UgniD9mFsVR", + "229kyj2TCuMjjojymiTe26qxguA1BkZwSoZ", + "2bcZkbEbtUSe6J18F2JXh3uCJ7sVNg2UmVR", + "2fu9DukFeEyfGVkAfb8iWBFy2mDghVQUcj7", + "2fxkpW9HxwHU1bC6z3dzHTb6gEWzoy8Xs9L", + "2VvuBQEJBCTFRgJdHWUxgLonqC4QpnsfDaf", + "24vAY9PQ7Qi2R8WyS8PNqPoE3ao9GoHPRZb", + "qkv9hF4p4pBTtx9d9gZsE1umdV62auJw51", + "nqZxyANHHZRGfMCX1piVVTxNpyqefaKDYK", + "yXWPxHDZ9H692aXryEcCzmvj1fq9m9QEe9", + "5eryPdnvguPh6RMt7L9ipmiheNqNfDKgFE", + "235epnEHmGYLDUKt9VkUmtJZhd3WMYUEpNB", + "21MiQWFa8aPHmFD8g2SK9b6V3in6rPmk9ss", + "sGKq1txePv5iQRe5rnPLVTTKttCs3zjmDz", + "2LvUuM9G6TamL9RuVxvyvGVqjwHiiYBRotZ", + "2jZGHc1LKCie4agCG71cZYe8Kq5611fLfAL", + "21YArvzZEMNxN76H7S2bbdUDA7ZXAXoeGqr", + "sEDoamsSRKqRZtGf6G1GdXh7vR58UvzKgC", + "2bWPKVnhPpAM7gn1QUoyJNwwSvqBNMh7GFm", + "2juNZeS8hvQWVtgBtAkdyJh9oZgmaR4u4LA", + "2jEMQeDGuNs9Cjjbwnd6zfX9j5Cgk78qZQz", + "2aZLbTLJNvHN1KLS6bfedEYqqLk1NedrqQR", + "TexLgwbxQtVkZreqfd8ts7MgZXAxsKhqwa", + "fQ71HRkSJasCCMVJmAevQa5fpanCuoegUh", + "EQLWYk8bzDzVpXGHeAbs1EkS1bxDyStqJq", + "rHimzsNiYrjTDi2eyAmMVE9BKBNqwBzv3X", + "2cieRLhQMY6636tbZnwfsu2B9pxjJieh6u2", + "21MbG627zkijtP9EfWvdqPytiP7E8gZs4e1", + "2PuYo6dYwkNKUSPEPi7NU1Q4Jseg3sPYc7k", + "2jY2JbZJWzW5cF5uPnS1k1CXgQf1s8dkbdt", + "2RH3mjLtsqkiCAg6cauiuFaxkvosTBq51WM", + "Lm72QmciFF3gvn3XttqFPQroPiaC2j4qnQ", + "2XEMsTyFd5DLA4MHaY67YLpxKUxMeRTmCKG", + "4AM2uaS51GhjomXqtDkQtovc1jS7iMRETG", + "JMpqpGE2eykKCWishNiCXXaN4agU5zpw2C", + "2SjQ63GgZaMy5ChNipekx9nC6B61Z6zyhE7", + "xZryS9tNPZDcdZMFgtdGEWbzvrURYMHgqH", + "W7GgbZWJLV4z1mWxyuYGBZabgPCfvRcVAP", + "Sqsyw19LsXHw7jkTHEANmc9sepQoNFitCo", + "2jPE5oFdGbWtwgmZxTt6uhDyHVeod3yphN6", + "6pUf4J3qUcQcRQ6Zpm4FD2XiYksWhNLVS6", + "PT2XJ2hzoEMEMNrBoy1Cy3Kp5nxyqygkh5", + "96NQ8YvrHTU9y41iUYMqM1Epk6JwwQcmJu", + "2RL2yhBwN5WreMkchJrn2vDDWJHQcRtEaFt", + "2gNoXa9m67NoaTy6eZ4GMpBmvdcQ9nriUop", + "G3n5VmgdwuwX8yk9cWpPEp3FHKEey5YmHa", + "kfaNrSPWjRAepn7QWtdEMABi96MsihhFnS", + "EHUQJ6c2wsSbAKB6ZcxVLWVf8Q3sgNUx3E", + "84wW1qSfVA5g8T2CiNTdxJ4JqfevRghgpU", + "2LTs4BuSTWjHivxPuUP41w2PA71u46dCz2p", + "ErnM32JwBMDYJSKNRM9Y8JtWoYFZ6LnnhY", + "5Tw8R7YdSBTTVj6xhQNi9GZ1g7MR97inE9", + "2RDKpGhkpsPfnjE63BdfhrBvkxLuSipQR2m", + "2LAtjkk4wS1npFGEdcTpjgtNBmSS6u6ArUo", + "5bRNsJqBiF5gvC5nQnqZ74nvcKtDCwtPGU", + "j6SatM2gF3R2PQVMA6PUPu4D3ZbKQJCg57", + "2iA7RoAcMhrtfJvmqM9azcmYYrJXXXGpxd8", + "27QyjoaHdbBYqUTXYYB1eFbUL66SxYpSs2u", + "u4yJk7eP9oPA3GYRaHwurA7LMsjVx4sBuK", + "fBnytDvmJgRrVJfuUDmzKoy1NoQ3m8SKQz", + "2FAS9ewd3wfjAyNhYuXasdx4udC37mcuhCZ", + "6u1DL9SoPYKGp2ighH5rEgam1F2QRumj2T", + "2ZVj2H1qdvZuBymu6oxR16y3uAfas5AiVUq", + "2WhMD7E3AKesy4nUMMEp2CTrmE9VPukdyAs", + "227F4gBrr8fjR9cG4MAjnLb8bvoXTRe3ZWU", + "2mft21a6b9xMdXAAURPSoQNaLCsmPc5hqZg", + "pyyySNdtVfDm8gv2TNhhrEgdNZgmMat5bL", + "6MfnPVFmhXFJKpFgqgjKpfTBGCaZ2ZT42T", + "jNQSAN3UfGdfTECx4ZZvLTYGhEX7ZyxsJD", + "2g4apJrWacF6mwKUnvzt5QQV9W2Hmb5NknG", + "2MrL5PtWHqhsnh2oRnfLp3db7eCQTFUitD2", + "92dAsJKwHqGbprAT9EMXjFc373KpotysZn", + "2AwGo5UKYbKnwSg3B5aRzrEqNW7weUpYver", + "8ieRD9NwcKpxMYz6c7kQZ9Zke33cbzHaew", + "21zAWa4MmzNW1oCaDdpCo5PQDgXNiiAswD", + "6cJBYvqCfzaegYugFKbLgyHrrfYKo1X5Xr", + "ZGDXhCBa4BguMuqMfimsYXThgY3aQU85oR", + "23DeMFwzFJdBNhvQEzSKpcJMtbdQ3SbuSq9", + "SLzPyGEMg5U7piPRjVrvpTqUP8w2zaYNQM", + "2fzxDPhzcLVNf4ZccVuAHqMxYBEP4km6mr", + "FUqsNrZpKCY8uXL1yvUhycbXuDoWmdG5ZX", + "YL7KAnjsBPQHobWAZzPq3E9MSzviErY6RA", + "YxMo7jCkihzzMR3KMPmWkHhK5464B2B6tC", + } + + for _, a := range testAddr { + t.Run(a, func(t *testing.T) { + testEncodeDecode(t, a) + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/base58fuzz.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/base58fuzz.go new file mode 100644 index 00000000..70fa5f77 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/base58fuzz.go @@ -0,0 +1,62 @@ +package base58fuzz + +import ( + "bytes" + + "github.com/SkycoinProject/skycoin/src/cipher/base58" +) + +// To use the fuzzer: +// Follow the install instructions from https://github.com/dvyukov/go-fuzz +// Then, from the repo root, +// $ go-fuzz-build github.com/SkycoinProject/skycoin/src/cipher/base58/internal +// This creates a file base58fuzz-fuzz.zip +// Then, +// $ go-fuzz -bin=base58fuzz-fuzz.zip -workdir=src/cipher/base58/internal +// New corpus and crash objects will be put in src/cipher/base58/internal + +// Fuzz is the entrypoint for go-fuzz +func Fuzz(b []byte) int { + decodeErr := encodeDecode(b) + encodeErr := decodeEncode(b) + + if decodeErr == nil || encodeErr == nil { + return 1 + } + + return 0 +} + +func decodeEncode(b []byte) error { + x, err := base58.Decode(string(b)) + if err != nil { + if x != nil { + panic("x != nil on error number 2") + } + } else { + s := base58.Encode(x) + + if s != string(b) { + panic("encoded strings are not equal") + } + } + + return err +} + +func encodeDecode(b []byte) error { + s := base58.Encode(b) + + x, err := base58.Decode(s) + if err != nil { + if x != nil { + panic("x != nil on error") + } + } else { + if !bytes.Equal(b, x) { + panic("decoded bytes are not equal") + } + } + + return err +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/1111bad b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/1111bad new file mode 100644 index 00000000..89f55c21 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/1111bad @@ -0,0 +1 @@ +1111~ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/1111x b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/1111x new file mode 100644 index 00000000..7e275eb6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/1111x @@ -0,0 +1 @@ +1111x diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/29e2dcfbb16f63bb0254df7585a15bb6fb5e927d-2 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/29e2dcfbb16f63bb0254df7585a15bb6fb5e927d-2 new file mode 100644 index 00000000..4227ca4e Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/29e2dcfbb16f63bb0254df7585a15bb6fb5e927d-2 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/5ba93c9db0cff93f52b521d7420e43f6eda2784f-2 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/5ba93c9db0cff93f52b521d7420e43f6eda2784f-2 new file mode 100644 index 00000000..f76dd238 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/5ba93c9db0cff93f52b521d7420e43f6eda2784f-2 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/63cc529d9461baca5d2c91e0324ca72f5cb1aed7 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/63cc529d9461baca5d2c91e0324ca72f5cb1aed7 new file mode 100644 index 00000000..f19fc8b1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/63cc529d9461baca5d2c91e0324ca72f5cb1aed7 @@ -0,0 +1,26 @@ +h_U_cLjkQkiYTG_0KGGN_G___2y__6___lzph_QC8__e5Ubb__j_zAZW809_-1547645227.04710714. +-40e58665688-b87_q060.-0510149274920729751111 +/0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH828856049065101329351980xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198.00560xba64AFa20d5e450178080724168137832)0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198* +}0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH828856049065101329351980xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198.00560xba64AFa20d5e450178080724168137832-0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198 +-7411872254212360590982.-6477118781916455-3_x_oT_iX__pI--0xfEe-5529h_U_cLjkQkiYTG_0KGGN_G___2y__6___lzph_QC8__e5Ubb__j_zAZW809_?0xdF76eCFe-04543351643.- +-0xaA7F2DfD73e7035-ycXY_2HT_4u9_3DSr8_79_F41_r_5x88xSQ__4G4__uh2I_a244PAeR_OU3_0G_c1_Rn___f_kB.-07.-0xbcb15DE4BdBf10B1D3f6cA +/0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH828856049065101329351980xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198.00560xba64AFa20d5e450178080724168137832&0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH828856049065101329351980xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198 +-006.-0126566107155424362540334--0x69B15a9bf58bBcfd8C9dfA21CeCfFbCe-49766235370341764003880900701-8B_83t4cZ.79722470717.7 +-006.-0126566107155424362540334- --0xfEe-5529-22n7s__l2__3Yt24_n.-067 +973342690560.-033315306155657-0xF43e0xd5C-70-8KpqE.0xf96EDffe3De6EBbAedaadFebE5Ca4De.-024731004146461.-0xaFc2A9CaBB77Da0EC42Ec0cE7D61d +02413.99738449662581951489162355177-0xF43e0xd5CrRfsgEUCTgk3AZcoYCRmS5Rinadrw8LAp60f_wjhe_g_78O_B_t_M_lF_hN59__9--06413567043453004025375136.-0726--.0xd9386 +0xe5fe-00.-E__nu2G_DpB_iqH__b_a__0ldOo40z87bLW_Wt_Kj___qk48s_bpD_p_5L5y_2E_d__1_pMX0_nHA_95Ji4_Yt2J-0544.-0xf6a62aD04t.-0511732120653234107227532274473555373747.-6114476950521989-0xfAD3f7Fcbee8c5F79Aea2bbdEC2Be29bc9B2e-0x66B5f1b +0532764.-0xB46cCE5fA06e062c.0x7BC9D78b6Bd35c8EacFFfec9cwJ4a49A_eFT1_VUlzfr6__K5J8__a9j6N7_P_IP5P_7yX_____z____805440xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198.-0xf6a62aD-.0660346107762416e-0405201517 +-531079164626289269122874709106613365093_t_An_Q__809_2__c3EtW60bYo_qd7IQTN___Z6371_CduR__-0136.-7541495148-03333030442064660713611034e-0xcf450xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH828856049065101329351980xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH828856049065101329351980x3Fe0x4d06135571321300035.-65762-0724.032520566567 +-066.070QE-0xEd-006.-0126566107155424362540334--0xAe09-5529-22n7s__l2__3Yt24_n.0xa5.0x2eBA5dDEADfc^0x2cEaDd1a0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198"bS70QCM2___8n_VFvfx.116902415149383881445049750374663834--0xD3de0xaCc578118448500e-07170xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH828856049065101329351980035731632473632074163523342667103253e +-239518260546888e-0x7dEa9bebea-A0xfF.037171326036317302-0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198.0x0CCCAadd7ab7e0x9-0176323111240613221322102216402611110660.835591737428 +066T7xNq_Y56bj_3K5p1rX_f9-04177052174.-17010190548677gL\037.0110205 +2678.-004-0xF43e0xd5C-70-0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198.-00565567031731e-0xeA6Ff4b0abA +02413.99738449662581951489162355177-0xF43e0xd5CrRfsgEUCTgk3AZcoYCRmS5Rinadrw8LAp60f_wjhe_g_78O_B_t_M_lF_hN59__9--3574278248121-Grj0y.0xbbE64EBAaAFa1ebEDf832e-071507355270540660341000120303 +-070xF43e0xd5C22615989569092723004268082692631328470446.06604t.-0060422115.0xAbCc67068131293555.0x010 +--.-0641542152157751106534234666315-0xBBBd1fA5B9d9DA8c0eF4f5-- +0063101735516635143766111.0x7BC9D78b6Bd35c8EacFFfec9cwJ4a49A_eFT1_VUlzfr6__K5J8__a9j6N7_P_IP5P_7yX_____z____805440xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198.0xA.-0443322224---02122e0552701355250304-577747724149231321899038152296.-045553275121627314 +-531079164626289269122874709106613365093_t_An_Q__809_2__c3EtW60bYo_qd7IQTN___Z6371_CduR__-594941773e-0xFB-0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH828856049065101329351980xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198.9274920729751111-14668.97131243923-0724.032520566567 +0x53E7.-06723-0QE--0x2a4DAC1EDBe0x6D0dd6DbFfd-21340583824958-0x2f6E663acEaDdaae7e0x2cEaDd1a0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198.0x6c3e9A14FDAc4bBbAB0xDc6Fe23D4ec9Cd2464bbA4808.19591.052502005310236253677310151064230xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH828856049065101329351980035731632473632074163523342667103253e-053860xAe-01704760226311444217422004 +*-8__o_0tg0_UVB_0xfF.037171326036317302-0xaAd-00404e-330xDA +-0e20xF43e0xd5C0xF43e0xd5C \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/7722745105e9e02e8f1aaf17f7b3aac5c56cd805-4 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/7722745105e9e02e8f1aaf17f7b3aac5c56cd805-4 new file mode 100644 index 00000000..ab2c6846 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/7722745105e9e02e8f1aaf17f7b3aac5c56cd805-4 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/7f39d13d5e2aa7375797fb77077e6aa12a60ae0a b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/7f39d13d5e2aa7375797fb77077e6aa12a60ae0a new file mode 100644 index 00000000..405644f7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/7f39d13d5e2aa7375797fb77077e6aa12a60ae0a @@ -0,0 +1,4 @@ +2WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH +2WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH +ec__x0_A__T6_F1_9Zyg__5Zm0_c_G46___j12U15H6R___4_MpvuUIVzGM_r__Zjzv_Jk10_5_6_YlSJ__Ncfd_8U_1o +2WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH2WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH2WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH2WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH2WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH2WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/81b1b384bb7472094196462c7df78a379f7b138d b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/81b1b384bb7472094196462c7df78a379f7b138d new file mode 100644 index 00000000..ac225529 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/81b1b384bb7472094196462c7df78a379f7b138d @@ -0,0 +1 @@ +_t_An_Q__809_2__c3EtW60bYo_qd7IQTN___Z6371_CduR__ \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/82571bcccd0d67578b68076a0a3e5d5613e0d645-1 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/82571bcccd0d67578b68076a0a3e5d5613e0d645-1 new file mode 100644 index 00000000..3e255c63 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/82571bcccd0d67578b68076a0a3e5d5613e0d645-1 @@ -0,0 +1 @@ +LNmw2BHSH2WBKTdT5KPgQ8ZxXGpoYtbaJ5UPYnVLNmw2BHSH2WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH2WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH2WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHS \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/8696cf0f4655636cc93c566c1be2dad311da646c-7 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/8696cf0f4655636cc93c566c1be2dad311da646c-7 new file mode 100644 index 00000000..5516e8f9 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/8696cf0f4655636cc93c566c1be2dad311da646c-7 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/8c1e6ab4270792c51304ea06f47dc20ce51ba57b-2 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/8c1e6ab4270792c51304ea06f47dc20ce51ba57b-2 new file mode 100644 index 00000000..195ee381 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/8c1e6ab4270792c51304ea06f47dc20ce51ba57b-2 @@ -0,0 +1 @@ +È \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/8d9f954cc9a4c3ef1840c989f2b71e18873f0589 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/8d9f954cc9a4c3ef1840c989f2b71e18873f0589 new file mode 100644 index 00000000..c7b23917 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/8d9f954cc9a4c3ef1840c989f2b71e18873f0589 @@ -0,0 +1 @@ +2WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSHP6160f7w2WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSHnLt_a2QE diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/9069ca78e7450a285173431b3e52c5c25299e473-3 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/9069ca78e7450a285173431b3e52c5c25299e473-3 new file mode 100644 index 00000000..593f4708 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/9069ca78e7450a285173431b3e52c5c25299e473-3 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/930e9a975a3e73d83f90ea559a52017e69bd0a00 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/930e9a975a3e73d83f90ea559a52017e69bd0a00 new file mode 100644 index 00000000..b3d2771a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/930e9a975a3e73d83f90ea559a52017e69bd0a00 @@ -0,0 +1 @@ +-6401412389804551415228303801292635.-066275545551367501325533-0xF43e0xd5C-0544.-0xf6a62aD-0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198.9274920729751111-0x2f6E663acEaDdaae7e diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/931613845dd0e72f1b1a5ba0c89f1c34e5cc089d-8 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/931613845dd0e72f1b1a5ba0c89f1c34e5cc089d-8 new file mode 100644 index 00000000..34886a1c Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/931613845dd0e72f1b1a5ba0c89f1c34e5cc089d-8 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/9694c4ebd673a5e2fd26e4b2e64f92e914ebd95f-5 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/9694c4ebd673a5e2fd26e4b2e64f92e914ebd95f-5 new file mode 100644 index 00000000..cb43b5ce Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/9694c4ebd673a5e2fd26e4b2e64f92e914ebd95f-5 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/979280a6ddd4c774e8f1747337ee9a95b0a8a515-3 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/979280a6ddd4c774e8f1747337ee9a95b0a8a515-3 new file mode 100644 index 00000000..3214a50e Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/979280a6ddd4c774e8f1747337ee9a95b0a8a515-3 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/990f38b139e8a5d4b80012947e7512c6fc32c58b-2 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/990f38b139e8a5d4b80012947e7512c6fc32c58b-2 new file mode 100644 index 00000000..669587f7 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/990f38b139e8a5d4b80012947e7512c6fc32c58b-2 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/a0b42fa23623c8d15ac8477d74c13d5299ac8461-1 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/a0b42fa23623c8d15ac8477d74c13d5299ac8461-1 new file mode 100644 index 00000000..7e02db91 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/a0b42fa23623c8d15ac8477d74c13d5299ac8461-1 @@ -0,0 +1 @@ +8ZxXGpoYtbaJ5UPYnVLNmw2BHS \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/a614af7858f3baeec55490a10c3b9e6283838faf b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/a614af7858f3baeec55490a10c3b9e6283838faf new file mode 100644 index 00000000..14c8ccd6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/a614af7858f3baeec55490a10c3b9e6283838faf @@ -0,0 +1,12 @@ +h_U_cLjkQkiYTG_0KGGN_G___2y__6___lzph_QC8__e5Ubb__j_zAZW809_-1679479854121560.047673640521410216331613771373351.- +-0xaA7F2DfD73e7035-ycXY_2HT_4u9_3DSr8_79_F41_r_5x88xSQ__4G4__uh2I_a244PAeR_OU3_0G_c1_Rn___f_kB.9274920729751111 +/0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH828856049065101329351980xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198.00560xba64AFa20d5e450178080724168137832-0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198* +-006.-0126566107155424362540334-3_x_oT_iX__pI--0xfEe-5529-22n7s__l2__3Yt24_n.79722470717.7 +2678.-004-0xF43e0xd5C-70-0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198.0xf96EDffe3De6EBbAedaadFebE5Ca4De.-024731004146461.-0xaFc2A9CaBB77Da0EC42Ec0cE7D61d +02413.99738449662581951489162355177-0xF43e0xd5CrRfsgEUCTgk3AZcoYCRmS5Rinadrw8LAp60f_wjhe_g_78O_B_t_M_lF_hN59__9--06413567043453004025375136.-0726-0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198.0xbbE64EBAaAFa1ebEDf832e-071507355270540660341000120303 +0016e00047021416122.-070xF43e0xd5C-0544.-0xf6a62aD-04t.-0060422115.0xAbCc-0x2f6E663acEaDdaae7e +0063101735516635143766111.0x7BC9D78b6Bd35c8EacFFfec9cwJ4a49A_eFT1_VUlzfr6__K5J8__a9j6N7_P_IP5P_7yX_____z____805440xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198.-0xf6a62aD--.9274920729751111-577747724149231321899038152296.-045553275121627314 +-531079164626289269122874709106613365093_t_An_Q__809_2__c3EtW60bYo_qd7IQTN___Z6371_CduR__-0544.-0xf6a62aD-0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH828856049065101329351980xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198.9274920729751111-274-0724.032520566567 +-066.07-0QE--0x0e-21340583824958-0x2cEaDd1a0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198.0x6c3e9A14FDAc4bBbAB0xDc6Fe23D4ec9Cd2464bbA4808.-0xbA9b2FDE9abCeA0-0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH828856049065101329351980035731632473632074163523342667103253e-05386-0xaAd +-05425.-2-___0xfF.037171326036317302-0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198.-07771-0x2f6E663acEaDdaae7e +-6401412389804551415228303801292635.-0662755455513675013255330xF43e0xd5C-050101147315 \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/a770e927c71c77a0a9ba32e12cd7eae07148f0e7-6 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/a770e927c71c77a0a9ba32e12cd7eae07148f0e7-6 new file mode 100644 index 00000000..bd6ceca6 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/a770e927c71c77a0a9ba32e12cd7eae07148f0e7-6 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/abcd b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/abcd new file mode 100644 index 00000000..acbe86c7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/abcd @@ -0,0 +1 @@ +abcd diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/b6589fc6ab0dc82cf12099d1c2d40ab994e8410c b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/b6589fc6ab0dc82cf12099d1c2d40ab994e8410c new file mode 100644 index 00000000..c2270834 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/b6589fc6ab0dc82cf12099d1c2d40ab994e8410c @@ -0,0 +1 @@ +0 \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/bfcb34f317e08e8d0b3d10c2e03c3704cb99242d b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/bfcb34f317e08e8d0b3d10c2e03c3704cb99242d new file mode 100644 index 00000000..ddf99bd7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/bfcb34f317e08e8d0b3d10c2e03c3704cb99242d @@ -0,0 +1 @@ +2WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH2WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH2WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH2WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH2WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH2WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH2WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH2WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHS \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/d5aa874081d093c9ba2af462799ba66d98033b8c b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/d5aa874081d093c9ba2af462799ba66d98033b8c new file mode 100644 index 00000000..b4e14256 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/d5aa874081d093c9ba2af462799ba66d98033b8c @@ -0,0 +1,3 @@ +rRfsgEUCTgk3AZcoYCRmS5Rinadrw8LAp6 +rRfsgEUCTgk3AZcoYCRmS5Rinadrw8LAp6 +rRfsgEUCTgk3AZcoYCRmS5Rinadrw8LAp6 diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/d775adbd66b5eeebfeb273d73655a908fcad5498 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/d775adbd66b5eeebfeb273d73655a908fcad5498 new file mode 100644 index 00000000..65c31d3a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/d775adbd66b5eeebfeb273d73655a908fcad5498 @@ -0,0 +1,5 @@ +0f_wjhe_g_78O_B_t_M_lF_hN59__9-0544.-0xf6a62aD-0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198.-0041650170332e-244041227875243-0x2f6E663acEaDdaae7e +0xee7BBbf2DA412fF7bF4FC8B6E580c2d.-070xF43e0xd5C-0544.-0xf6a62aD-04t.-0060422115.0xAbCc-0x2f6E663acEaDdaae7e +-6401412389804551415228303801292635.-066275545551367501325533-wJ4a49A_eFT1_VUlzfr6__K5J8__a9j6N7_P_IP5P_7yX_____z____80544.-0xf6a62aD-0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198.9274920729751111-0x2f6E663acEaDdaae7e +-0670xF43e0xd5C-0544.-0xf6a62aD-0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH828856049065101329351980xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198.9274920729751111-0xfdc1.0167425-0724.032520566567 +-0xD30ca73-0QE-0xDC80eFCf1f3b299e-0x2cEaDd1a0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198.0x6c3e9A14FDAc4bBbAB0xDc6Fe23D4ec9Cd2464bbA \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/da39a3ee5e6b4b0d3255bfef95601890afd80709-1 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/da39a3ee5e6b4b0d3255bfef95601890afd80709-1 new file mode 100644 index 00000000..e69de29b diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/da6ce8d669450d7c33af7d22a55b97e3b7123734-1 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/da6ce8d669450d7c33af7d22a55b97e3b7123734-1 new file mode 100644 index 00000000..8dce517d Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/da6ce8d669450d7c33af7d22a55b97e3b7123734-1 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/e93a7ad811a68a06a65b11f91bd7266fb29a9f79 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/e93a7ad811a68a06a65b11f91bd7266fb29a9f79 new file mode 100644 index 00000000..d9ccde48 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/e93a7ad811a68a06a65b11f91bd7266fb29a9f79 @@ -0,0 +1 @@ +ec__x0_A__T6_F1_9Zyg__5Zm0_c_G46___j12U15H6R___4_MpvuUIVzGM_r__Zjzv_Jk10_5_6_YlSJ__Ncfd_8U_1o diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/ec541f6dcf03854cc36fb729db91fb04e6421ea0-2 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/ec541f6dcf03854cc36fb729db91fb04e6421ea0-2 new file mode 100644 index 00000000..f219ddff --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/ec541f6dcf03854cc36fb729db91fb04e6421ea0-2 @@ -0,0 +1 @@ +51 \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/empty b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/empty new file mode 100644 index 00000000..e69de29b diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/f061cd9b3021c1d204229980a55e56546bf1978b b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/f061cd9b3021c1d204229980a55e56546bf1978b new file mode 100644 index 00000000..a22b940a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/f061cd9b3021c1d204229980a55e56546bf1978b @@ -0,0 +1,9 @@ +5160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198.-803523175500423 +-6401412389804551415228303801292635.-06627554555136750132553332M_3LSTwZ8to_Z87l_ +-0xaA7F2DfD73e7035-93___x___6P3Or9N81_1____n__285_nJ25WTRQ_vexQWdN14S__9.9274920729751111 +-0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198.00560xba64AFa20d5e450178080724168137832-0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198* +-6401412389804551415228303801292635.-066275545551367501325533-3_x_oT_iX__pI-0544.-0xf6a62aD-0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198.0x4 +-6401412389804551415228303801292635.-066275545551367501325533-0xF43e0xd5C--70-0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198.0xf96EDffe3De6EBbAedaadFebE5Ca4De.-024731004146461.-0xaFc2A9CaBB77Da0EC42Ec0cE7D61d +-33.00-0xF43e0xd5CrRfsgEUCTgk3AZcoYCRmS5Rinadrw8LAp6-04664647530616632576752600-0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198.9274920729751111-0xaAd +073-0xF43e0xd5C0xfF.037171326036317302-0xaBe05160542057653662WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH82885604906510132935198.-07771-0x2f6E663acEaDdaae7e +-6401412389804551415228303801292635.-0662755455513675013255330xF43e0xd5C-050101147315107e0x3AD3A__7G3_f_d_4U__71A2G8nLQK5v1bBda_2Z_WZzkuW_R_pY0oXq165_m0h4C59eU433Zjv \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/f62410abfef601b7470b42124a59aa0d0ec3a673-1 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/f62410abfef601b7470b42124a59aa0d0ec3a673-1 new file mode 100644 index 00000000..b80aa6fc Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/f62410abfef601b7470b42124a59aa0d0ec3a673-1 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/test1 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/test1 new file mode 100644 index 00000000..5f2f16bf --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/test1 @@ -0,0 +1 @@ +1111 diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/test2 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/test2 new file mode 100644 index 00000000..58073b33 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/test2 @@ -0,0 +1 @@ +rRfsgEUCTgk3AZcoYCRmS5Rinadrw8LAp6 diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/test3 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/test3 new file mode 100644 index 00000000..71e7af17 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/base58/internal/corpus/test3 @@ -0,0 +1 @@ +2WBKTdT58ZxXGpoYtbaJ5UPYnVLNmw2BHSH diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip32/LICENSE b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip32/LICENSE new file mode 100644 index 00000000..23d5c3ef --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip32/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2017 Tyler Smith +Copyright (c) 2019 Skycoin Developers + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip32/README.md b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip32/README.md new file mode 100644 index 00000000..e113c426 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip32/README.md @@ -0,0 +1,102 @@ +# go-bip32 + +An implementation of the BIP32 spec for Hierarchical Deterministic Bitcoin addresses as a simple Go library. The semantics of derived keys are up to the user. +[BIP43](https://github.com/bitcoin/bips/blob/master/bip-0043.mediawiki) and [BIP44](https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki) are good schemes to implement with this library. +An additional library for either or both of those on top of this library should be developed. + +Modified for use in Skycoin, derived from https://github.com/tyler-smith/go-bip32 + +## Example + +It's very unlikely, but possible, that a given index does not produce a valid +private key. Error checking is skipped in this example for brevity but should be +handled in real code. In such a case, an error of type `Error` is returned and it's +method `ImpossibleChild()` will return true. + +An example for handling this: + +```go +func tryNewPrivateKeyFromPath() (*bip32.PrivateKey, error) { + k, err := bip32.NewPrivateKeyFromPath([]byte("abc123"), "m/1'/1'/0/1") + if err != nil { + if bip32.IsImpossibleChildError(err) { + fmt.Println("Child number 1 generated an invalid key, use the next child number") + } + return err + } + + return k, nil +} +``` + +Any valid private key will have a valid public key so that `PrivateKey.PublicKey()` +method never returns an error. + +```go +package main + +import ( + "github.com/SkycoinProject/skycoin/src/cipher/bip32" + "github.com/SkycoinProject/skycoin/src/cipher/bip39" + "fmt" + "log" +) + +// Example address creation for a fictitious company ComputerVoice Inc. where +// each department has their own wallet to manage +func main(){ + // Generate a mnemonic to determine all keys from. Don't lose it. + mnemonic := bip39.MustNewDefaultMnemonic() + + // Derivce a seed from the mnemonic + seed, err := bip39.NewSeed(mnemonic, "") + if err != nil { + log.Fatalln("Error generating seed:", err) + } + + // Create master private key from seed + computerVoiceMasterKey, err := bip32.NewMasterKey(seed) + if err != nil { + log.Fatalln("NewMasterKey failed:", err) + } + + // Map departments to keys + // There is a very small chance a given child index is invalid (less than 1 in 2^127) + // If so your real program should handle this by skipping the index + departmentKeys := map[string]*bip32.Key{} + departmentKeys["Sales"], err = computerVoiceMasterKey.NewChildKey(0) + if err != nil { + log.Fatalln("NewChildKey:", err) + } + departmentKeys["Marketing"], err = computerVoiceMasterKey.NewChildKey(1) + if err != nil { + log.Fatalln("NewChildKey:", err) + } + departmentKeys["Engineering"], err = computerVoiceMasterKey.NewChildKey(2) + if err != nil { + log.Fatalln("NewChildKey:", err) + } + departmentKeys["Customer Support"], err = computerVoiceMasterKey.NewChildKey(3) + if err != nil { + log.Fatalln("NewChildKey:", err) + } + + // Create public keys for record keeping, auditors, payroll, etc + departmentAuditKeys := map[string]*bip32.Key{} + departmentAuditKeys["Sales"] = departmentKeys["Sales"].PublicKey() + departmentAuditKeys["Marketing"] = departmentKeys["Marketing"].PublicKey() + departmentAuditKeys["Engineering"] = departmentKeys["Engineering"].PublicKey() + departmentAuditKeys["Customer Support"] = departmentKeys["Customer Support"].PublicKey() + + // Print public keys + for department, pubKey := range departmentAuditKeys { + fmt.Println(department, pubKey) + } +} +``` + +## Thanks + +The developers at [Factom](https://www.factom.com/) have contributed a lot to this library and have made many great improvements to it. Please check out their project(s) and give them a thanks if you use this library. + +Thanks to [bartekn](https://github.com/bartekn) from Stellar for some important bug catches. diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip32/bip32.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip32/bip32.go new file mode 100644 index 00000000..0d9a04d7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip32/bip32.go @@ -0,0 +1,632 @@ +/* +Package bip32 implements the bip32 spec https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki +*/ +package bip32 + +import ( + "bytes" + "crypto/hmac" + "crypto/sha512" + "encoding/binary" + "errors" + "fmt" + "log" + + "github.com/SkycoinProject/skycoin/src/cipher/base58" +) + +const ( + // FirstHardenedChild is the index of the firxt "hardened" child key as per the + // bip32 spec + FirstHardenedChild = uint32(0x80000000) + + // masterKey is the "Key" value specified by bip32 for the master key + masterKey = "Bitcoin seed" +) + +// Error wraps bip32 errors +type Error struct { + error + impossibleChild bool +} + +// NewError creates an Error +func NewError(err error) error { + if err == nil { + log.Panic("NewError called with nil error") + } + return Error{ + error: err, + } +} + +// ImpossibleChild returns true if this error indicates +// that a given child number cannot produce a valid key. +// If the caller receives this error, they should skip this child and go to the next number. +// The probability of this happening is less than 1 in 2^127. +func (err Error) ImpossibleChild() bool { + return err.impossibleChild +} + +// NewImpossibleChildError creates an Error flagged as an ImpossibleChild error +func NewImpossibleChildError(err error, childNumber uint32) error { + if err == nil { + log.Panic("NewImpossibleChildError called with nil error") + } + return Error{ + error: fmt.Errorf("childNumber=%d %v", childNumber, err), + impossibleChild: true, + } +} + +// IsImpossibleChildError returns true if the error is an ImpossibleChild Error +func IsImpossibleChildError(err error) bool { + if err == nil { + return false + } + + switch t := err.(type) { + case Error: + return t.ImpossibleChild() + default: + return false + } +} + +var ( + // PrivateWalletVersion is the version flag for serialized private keys ("xpriv") + PrivateWalletVersion = []byte{0x04, 0x88, 0xAD, 0xE4} + + // PublicWalletVersion is the version flag for serialized public keys ("xpub") + PublicWalletVersion = []byte{0x04, 0x88, 0xB2, 0x1E} + + // ErrSerializedKeyWrongSize is returned when trying to deserialize a key that + // has an incorrect length + ErrSerializedKeyWrongSize = NewError(errors.New("Serialized keys should be exactly 82 bytes")) + + // ErrHardenedChildPublicKey is returned when trying to create a harded child + // of the public key + ErrHardenedChildPublicKey = NewError(errors.New("Can't create hardened child for public key")) + + // ErrInvalidChecksum is returned when deserializing a key with an incorrect checksum + ErrInvalidChecksum = NewError(errors.New("Checksum doesn't match")) + + // ErrDerivedInvalidPrivateKey is returned when an invalid private key was derived + ErrDerivedInvalidPrivateKey = NewError(errors.New("Derived invalid private key")) + + // ErrDerivedInvalidPublicKey is returned when an invalid public key was derived + ErrDerivedInvalidPublicKey = NewError(errors.New("Derived invalid public key")) + + // ErrInvalidPrivateKeyVersion is returned when a deserializing a private key without the 'xprv' prefix + ErrInvalidPrivateKeyVersion = NewError(errors.New("Invalid private key version")) + + // ErrInvalidPublicKeyVersion is returned when a deserializing a public key without the 'xpub' prefix + ErrInvalidPublicKeyVersion = NewError(errors.New("Invalid public key version")) + + // ErrInvalidSeedLength is returned when generating a master key with an invalid number of seed bits + ErrInvalidSeedLength = NewError(errors.New("Invalid master key seed length")) + + // ErrDeserializePrivateFromPublic attempted to deserialize a private key from an encoded public key + ErrDeserializePrivateFromPublic = NewError(errors.New("Cannot deserialize a private key from a public key")) + + // ErrInvalidKeyVersion is returned if the key version is not 'xpub' or 'xprv' + ErrInvalidKeyVersion = NewError(errors.New("Invalid key version")) + + // ErrInvalidFingerprint is returned if a deserialized key has an invalid fingerprint + ErrInvalidFingerprint = NewError(errors.New("Invalid key fingerprint")) + + // ErrInvalidChildNumber is returned if a deserialized key has an invalid child number + ErrInvalidChildNumber = NewError(errors.New("Invalid key child number")) + + // ErrInvalidPrivateKey is returned if a deserialized xprv key's private key is invalid + ErrInvalidPrivateKey = NewError(errors.New("Invalid private key")) + + // ErrInvalidPublicKey is returned if a deserialized xpub key's public key is invalid + ErrInvalidPublicKey = NewError(errors.New("Invalid public key")) + + // ErrMaxDepthReached maximum allowed depth (255) reached for child key + ErrMaxDepthReached = NewError(errors.New("Maximum child depth reached")) +) + +// key represents a bip32 extended key +type key struct { + Version []byte // 4 bytes + Depth byte // 1 bytes + ParentFingerprint []byte // 4 bytes + childNumber []byte // 4 bytes + ChainCode []byte // 32 bytes + Key []byte // 33 bytes for public keys; 32 bytes for private keys +} + +func (k key) ChildNumber() uint32 { + return binary.BigEndian.Uint32(k.childNumber) +} + +// PrivateKey represents a bip32 extended private key +type PrivateKey struct { + key +} + +// PublicKey represents a bip32 extended public key +type PublicKey struct { + key +} + +// NewMasterKey creates a new master extended key from a seed. +// Seed should be between 128 and 512 bits; 256 bits are recommended. +// https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki#master-key-generation +func NewMasterKey(seed []byte) (*PrivateKey, error) { + if len(seed) < 16 || len(seed) > 64 { + return nil, ErrInvalidSeedLength + } + + return newMasterKey(seed) +} + +func newMasterKey(seed []byte) (*PrivateKey, error) { + // Generate key and chaincode + hmac := hmac.New(sha512.New, []byte(masterKey)) + if _, err := hmac.Write(seed); err != nil { + log.Panic(err) + } + intermediary := hmac.Sum(nil) + + // Split it into our key and chain code + keyBytes := intermediary[:32] + chainCode := intermediary[32:] + + // Validate key + if err := validatePrivateKey(keyBytes); err != nil { + return nil, err + } + + // Create the key struct + key := &PrivateKey{ + key: key{ + Version: PrivateWalletVersion, + ChainCode: chainCode, + Key: keyBytes, + Depth: 0x0, + childNumber: []byte{0x00, 0x00, 0x00, 0x00}, + ParentFingerprint: []byte{0x00, 0x00, 0x00, 0x00}, + }, + } + + return key, nil +} + +// NewPrivateKeyFromPath returns a private key at a given bip32 path. +// The path must be a full path starting with m/, and the initial seed +// must be provided. +// This method can return an ImpossibleChild error. +func NewPrivateKeyFromPath(seed []byte, p string) (*PrivateKey, error) { + path, err := ParsePath(p) + if err != nil { + return nil, err + } + + k, err := NewMasterKey(seed) + if err != nil { + return nil, err + } + + if len(path.Elements) > 1 { + return k.DeriveSubpath(path.Elements[1:]) + } + + return k, nil +} + +// DeriveSubpath derives a PrivateKey at at bip32 subpath, e.g. `0'/1'/0`. +// The nodes argument must not be empty. +// This method can return an ImpossibleChild error. +func (k *PrivateKey) DeriveSubpath(nodes []PathNode) (*PrivateKey, error) { + if len(nodes) == 0 { + return nil, errors.New("Path nodes array empty when deriving a bip32 subpath") + } + + ck, err := k.newPrivateChildKeyFromPathNode(nodes[0]) + if err != nil { + return nil, err + } + + for _, e := range nodes[1:] { + ck, err = ck.newPrivateChildKeyFromPathNode(e) + if err != nil { + return nil, err + } + } + + return ck, nil +} + +func (k *PrivateKey) newPrivateChildKeyFromPathNode(n PathNode) (*PrivateKey, error) { + if n.Master { + return nil, errors.New("PathNode is Master at a non-zero depth") + } + + return k.NewPrivateChildKey(n.ChildNumber) +} + +// PublicKey returns the public version of key or return a copy +// The 'Neuter' function from the bip32 spec, N((k, c) -> (K, c). +// https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki#private-parent-key--public-child-key +func (k *PrivateKey) PublicKey() *PublicKey { + pubKey, err := publicKeyForPrivateKey(k.Key) + if err != nil { + log.Panicf("PrivateKey.PublicKey failed: %v", err) + } + return &PublicKey{ + key: key{ + Version: PublicWalletVersion, + Key: pubKey, + Depth: k.Depth, + childNumber: k.childNumber, + ChainCode: k.ChainCode, + ParentFingerprint: k.ParentFingerprint, + }, + } +} + +// Fingerprint returns the key fingerprint +func (k *PrivateKey) Fingerprint() []byte { + // "Extended keys can be identified by the Hash160 (RIPEMD160 after SHA256) + // of the serialized ECDSA public key K, ignoring the chain code." + return k.PublicKey().Fingerprint() +} + +// Identifier returns the key ID +func (k *PrivateKey) Identifier() []byte { + return k.PublicKey().Identifier() +} + +// Fingerprint returns the key fingerprint +func (k *PublicKey) Fingerprint() []byte { + return fingerprint(k.Key) +} + +// Identifier returns the key ID +func (k *PublicKey) Identifier() []byte { + return identifier(k.Key) +} + +func identifier(key []byte) []byte { + // "Extended keys can be identified by the Hash160 (RIPEMD160 after SHA256) + // of the serialized ECDSA public key K, ignoring the chain code." + + // ripemd160(sha256(key)) + return hash160(key) +} + +func fingerprint(key []byte) []byte { + id := identifier(key) + // "The first 32 bits of the identifier are called the key fingerprint." + return id[:4] +} + +// NewPrivateChildKey derives a private child key from a given parent as outlined by bip32, CDKpriv(). +// https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki#private-parent-key--private-child-key +// This method can return an ImpossibleChild error. +func (k *PrivateKey) NewPrivateChildKey(childIdx uint32) (*PrivateKey, error) { + if k.Depth == 0xFF { + return nil, ErrMaxDepthReached + } + + intermediary := k.ckdPrivHMAC(childIdx) + + iL := intermediary[:32] // used for computing the next key + chainCode := intermediary[32:] // iR + + // ki = parse256(IL) + kpar (mod n) + // In case parse256(IL) ≥ n or ki = 0, the resulting key is invalid + newKey, err := addPrivateKeys(iL, k.Key) + if err != nil { + return nil, NewImpossibleChildError(err, childIdx) + } + + return &PrivateKey{ + key: key{ + Version: PrivateWalletVersion, + childNumber: uint32Bytes(childIdx), + ChainCode: chainCode, + Depth: k.Depth + 1, + Key: newKey, + ParentFingerprint: k.Fingerprint(), + }, + }, nil +} + +// NewPublicChildKey derives a public child key from an extended public key, N(CKDpriv()). +// https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki#private-parent-key--public-child-key +// This method can return an ImpossibleChild error. +func (k *PrivateKey) NewPublicChildKey(childIdx uint32) (*PublicKey, error) { + k2, err := k.NewPrivateChildKey(childIdx) + if err != nil { + return nil, err + } + return k2.PublicKey(), nil +} + +// NewPublicChildKey derives a public child key from an extended public key, CKDpub(). +// Hardened child keys cannot be derived; the value of childIdx must be less than 2^31. +// https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki#public-parent-key--public-child-key +// This method can return an ImpossibleChild error. +func (k *PublicKey) NewPublicChildKey(childIdx uint32) (*PublicKey, error) { + if k.Depth == 0xFF { + return nil, ErrMaxDepthReached + } + + // CKDPub step 1 + intermediary, err := k.ckdPubHMAC(childIdx) + if err != nil { + return nil, err + } + + // CKDPub step 2 + iL := intermediary[:32] // used for computing the next key + + // CKDPub step 3: Ki = point(parse256(IL)) + Kpar + // CKDPub step 5: In case parse256(IL) ≥ n or Ki is the point at infinity, the resulting key is invalid + keyBytes, err := publicKeyForPrivateKey(iL) + if err != nil { + return nil, NewImpossibleChildError(err, childIdx) + } + + // CKDPub step 4 + chainCode := intermediary[32:] // iR + + newKey, err := addPublicKeys(keyBytes[:], k.Key) + if err != nil { + return nil, err + } + + // Create child Key with data common to all both scenarios + return &PublicKey{ + key: key{ + Version: PublicWalletVersion, + childNumber: uint32Bytes(childIdx), + ChainCode: chainCode, + Depth: k.Depth + 1, + Key: newKey, + ParentFingerprint: k.Fingerprint(), + }, + }, nil +} + +// ckdPrivHMAC computes the first step of the CKDPriv function, which computes an HMAC +func (k *key) ckdPrivHMAC(childIdx uint32) []byte { + // Get intermediary to create key and chaincode. + // Hardened children are based on the private key. + // Non-hardened children are based on the public key. + + var data []byte + if childIdx >= FirstHardenedChild { + // Hardened child + // I = HMAC-SHA512(Key = cpar, Data = 0x00 || ser256(kpar) || ser32(i)) + // 0x00 || ser256(kpar) + data = append([]byte{0x0}, k.Key...) + } else { + // Non-hardened child + // I = HMAC-SHA512(Key = cpar, Data = serP(point(kpar)) || ser32(i)) + // The equation below is "convert private key to compressed public key" + // serP(point(kpar)) + var err error + data, err = publicKeyForPrivateKey(k.Key) + if err != nil { + log.Panic(err) + } + } + + // Append the child index as big-endian serialized bytes + // || ser32(i) + childIndexBytes := uint32Bytes(childIdx) + data = append(data, childIndexBytes...) + + // HMAC-SHA512(Key = cpar, Data) + hmac := hmac.New(sha512.New, k.ChainCode) + if _, err := hmac.Write(data); err != nil { + log.Panic(err) + } + + return hmac.Sum(nil) +} + +// ckdPubHMAC computes the first step of the CKDPub function, which computes an HMAC +func (k *key) ckdPubHMAC(childIdx uint32) ([]byte, error) { + // Get intermediary to create key and chaincode. + // Hardened children are based on the private key. + // Non-hardened children are based on the public key. + + if childIdx >= FirstHardenedChild { + // Public keys can't derive hardened child keys + return nil, ErrHardenedChildPublicKey + } + + // I = HMAC-SHA512(Key = cpar, Data = serP(Kpar) || ser32(i)) + + // serP(Kpar) + data := make([]byte, len(k.Key)) + copy(data, k.Key) + + // ser32(i) + childIndexBytes := uint32Bytes(childIdx) + + // serP(Kpar) || ser32(i) + data = append(data, childIndexBytes...) + + // HMAC-SHA512(Key = cpar, Data = serP(Kpar) || ser32(i)) + hmac := hmac.New(sha512.New, k.ChainCode) + if _, err := hmac.Write(data); err != nil { + log.Panic(err) + } + + return hmac.Sum(nil), nil +} + +// Serialize a Key to a 78 byte byte slice +func (k *PrivateKey) Serialize() []byte { + // Private keys should be prepended with a single null byte + return k.serialize(append([]byte{0x0}, k.Key...)) +} + +// Serialize a Key to a 78 byte byte slice +func (k *PublicKey) Serialize() []byte { + return k.serialize(k.Key) +} + +// serialize a Key to a 78 byte byte slice +func (k *key) serialize(key []byte) []byte { + n := len(k.Version) + n++ // k.Depth + n += len(k.ParentFingerprint) + n += len(k.childNumber) + n += len(k.ChainCode) + n += len(key) + + buffer := &bytes.Buffer{} + buffer.Grow(n) + + // Write fields to buffer in order + buffer.Write(k.Version) + buffer.WriteByte(k.Depth) + buffer.Write(k.ParentFingerprint) + buffer.Write(k.childNumber) + buffer.Write(k.ChainCode) + buffer.Write(key) + + // Append the standard doublesha256 checksum + return addChecksumToBytes(buffer.Bytes()) +} + +// String encodes the Key in the standard Bitcoin base58 encoding +func (k *PrivateKey) String() string { + return base58.Encode(k.Serialize()) +} + +// String encodes the Key in the standard Bitcoin base58 encoding +func (k *PublicKey) String() string { + return base58.Encode(k.Serialize()) +} + +// DeserializeEncodedPrivateKey deserializes a base58 xprv key to a PrivateKey +func DeserializeEncodedPrivateKey(xprv string) (*PrivateKey, error) { + b, err := base58.Decode(xprv) + if err != nil { + return nil, err + } + return DeserializePrivateKey(b) +} + +// DeserializePrivateKey deserializes the []byte serialization of a PrivateKey +func DeserializePrivateKey(data []byte) (*PrivateKey, error) { + k, err := deserialize(data, true) + if err != nil { + return nil, err + } + + if len(k.Key) != 32 { + log.Panic("DeserializePrivateKey expected 32 bytes key length") + } + if !bytes.Equal(k.Version, PrivateWalletVersion) { + log.Panic("DeserializePrivateKey expected xprv prefix") + } + + return &PrivateKey{ + key: *k, + }, nil +} + +// DeserializeEncodedPublicKey deserializes a base58 xpub key to a PublicKey +func DeserializeEncodedPublicKey(xpub string) (*PublicKey, error) { + b, err := base58.Decode(xpub) + if err != nil { + return nil, err + } + return DeserializePublicKey(b) +} + +// DeserializePublicKey deserializes the []byte serialization of a PublicKey +func DeserializePublicKey(data []byte) (*PublicKey, error) { + k, err := deserialize(data, false) + if err != nil { + return nil, err + } + + if len(k.Key) != 33 { + log.Panic("DeserializePublicKey expected 33 bytes key length") + } + if !bytes.Equal(k.Version, PublicWalletVersion) { + log.Panic("DeserializePublicKey expected xpub prefix") + } + + return &PublicKey{ + key: *k, + }, nil +} + +// deserialize a byte slice into a Key. +// If the Key.Key length is 32 bytes it is a private key, otherwise it is a public key. +func deserialize(data []byte, wantPrivate bool) (*key, error) { + if len(data) != 82 { + return nil, ErrSerializedKeyWrongSize + } + + // Validate checksum + cs1 := checksum(data[0 : len(data)-4]) + cs2 := data[len(data)-4:] + if !bytes.Equal(cs1, cs2) { + return nil, ErrInvalidChecksum + } + + k := &key{} + k.Version = data[0:4] + k.Depth = data[4] + k.ParentFingerprint = data[5:9] + k.childNumber = data[9:13] + k.ChainCode = data[13:45] + + isPrivate := bytes.Equal(k.Version, PrivateWalletVersion) + isPublic := bytes.Equal(k.Version, PublicWalletVersion) + + if !isPrivate && !isPublic { + return nil, ErrInvalidKeyVersion + } + + if wantPrivate && !isPrivate { + return nil, ErrInvalidPrivateKeyVersion + } + + if !wantPrivate && !isPublic { + return nil, ErrInvalidPublicKeyVersion + } + + // Master keys (depth=0) have an empty fingerprint and a ChildNumber of 0 + if k.Depth == 0 { + var emptyBytes [4]byte + if !bytes.Equal(k.ParentFingerprint, emptyBytes[:]) { + return nil, ErrInvalidFingerprint + } + + if k.ChildNumber() != 0 { + return nil, ErrInvalidChildNumber + } + } + + // Private keys must have a 0 byte prefix padding + if isPrivate { + if data[45] != 0 { + return nil, ErrInvalidPrivateKey + } + k.Key = data[46:78] + if err := validatePrivateKey(k.Key); err != nil { + return nil, ErrInvalidPrivateKey + } + } else { + k.Key = data[45:78] + if err := validatePublicKey(k.Key); err != nil { + return nil, ErrInvalidPublicKey + } + } + + return k, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip32/bip32_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip32/bip32_test.go new file mode 100644 index 00000000..2d2f559e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip32/bip32_test.go @@ -0,0 +1,1221 @@ +package bip32 + +import ( + "encoding/hex" + "errors" + "fmt" + "strings" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/base58" +) + +type testMasterKey struct { + seed string + children []testChildKey + privKey string + pubKey string + hexPubKey string + wifPrivKey string + fingerprint string + identifier string + chainCode string + childNumber uint32 + depth byte +} + +type testChildKey struct { + path string + privKey string + pubKey string + fingerprint string + identifier string + chainCode string + hexPubKey string + wifPrivKey string + childNumber uint32 + depth byte +} + +func TestBip32TestVectors(t *testing.T) { + // vector1,2,3 test cases from: + // https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki#test-vectors + // https://en.bitcoin.it/wiki/BIP_0032_TestVectors + // Note: the 2nd link lacks the detailed values of test vector 3 + vector1 := testMasterKey{ + seed: "000102030405060708090a0b0c0d0e0f", + privKey: "xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi", + pubKey: "xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8", + hexPubKey: "0339a36013301597daef41fbe593a02cc513d0b55527ec2df1050e2e8ff49c85c2", + wifPrivKey: "L52XzL2cMkHxqxBXRyEpnPQZGUs3uKiL3R11XbAdHigRzDozKZeW", + fingerprint: "3442193e", + identifier: "3442193e1bb70916e914552172cd4e2dbc9df811", + chainCode: "873dff81c02f525623fd1fe5167eac3a55a049de3d314bb42ee227ffed37d508", + childNumber: 0, + depth: 0, + children: []testChildKey{ + { + path: "m/0'", + privKey: "xprv9uHRZZhk6KAJC1avXpDAp4MDc3sQKNxDiPvvkX8Br5ngLNv1TxvUxt4cV1rGL5hj6KCesnDYUhd7oWgT11eZG7XnxHrnYeSvkzY7d2bhkJ7", + pubKey: "xpub68Gmy5EdvgibQVfPdqkBBCHxA5htiqg55crXYuXoQRKfDBFA1WEjWgP6LHhwBZeNK1VTsfTFUHCdrfp1bgwQ9xv5ski8PX9rL2dZXvgGDnw", + fingerprint: "5c1bd648", + identifier: "5c1bd648ed23aa5fd50ba52b2457c11e9e80a6a7", + chainCode: "47fdacbd0f1097043b78c63c20c34ef4ed9a111d980047ad16282c7ae6236141", + hexPubKey: "035a784662a4a20a65bf6aab9ae98a6c068a81c52e4b032c0fb5400c706cfccc56", + wifPrivKey: "L5BmPijJjrKbiUfG4zbiFKNqkvuJ8usooJmzuD7Z8dkRoTThYnAT", + childNumber: 2147483648, + depth: 1, + }, + { + path: "m/0'/1", + privKey: "xprv9wTYmMFdV23N2TdNG573QoEsfRrWKQgWeibmLntzniatZvR9BmLnvSxqu53Kw1UmYPxLgboyZQaXwTCg8MSY3H2EU4pWcQDnRnrVA1xe8fs", + pubKey: "xpub6ASuArnXKPbfEwhqN6e3mwBcDTgzisQN1wXN9BJcM47sSikHjJf3UFHKkNAWbWMiGj7Wf5uMash7SyYq527Hqck2AxYysAA7xmALppuCkwQ", + fingerprint: "bef5a2f9", + identifier: "bef5a2f9a56a94aab12459f72ad9cf8cf19c7bbe", + chainCode: "2a7857631386ba23dacac34180dd1983734e444fdbf774041578e9b6adb37c19", + hexPubKey: "03501e454bf00751f24b1b489aa925215d66af2234e3891c3b21a52bedb3cd711c", + wifPrivKey: "KyFAjQ5rgrKvhXvNMtFB5PCSKUYD1yyPEe3xr3T34TZSUHycXtMM", + childNumber: 1, + depth: 2, + }, + { + path: "m/0'/1/2'", + privKey: "xprv9z4pot5VBttmtdRTWfWQmoH1taj2axGVzFqSb8C9xaxKymcFzXBDptWmT7FwuEzG3ryjH4ktypQSAewRiNMjANTtpgP4mLTj34bhnZX7UiM", + pubKey: "xpub6D4BDPcP2GT577Vvch3R8wDkScZWzQzMMUm3PWbmWvVJrZwQY4VUNgqFJPMM3No2dFDFGTsxxpG5uJh7n7epu4trkrX7x7DogT5Uv6fcLW5", + fingerprint: "ee7ab90c", + identifier: "ee7ab90cde56a8c0e2bb086ac49748b8db9dce72", + chainCode: "04466b9cc8e161e966409ca52986c584f07e9dc81f735db683c3ff6ec7b1503f", + hexPubKey: "0357bfe1e341d01c69fe5654309956cbea516822fba8a601743a012a7896ee8dc2", + wifPrivKey: "L43t3od1Gh7Lj55Bzjj1xDAgJDcL7YFo2nEcNaMGiyRZS1CidBVU", + childNumber: 2 + FirstHardenedChild, + depth: 3, + }, + { + path: "m/0'/1/2'/2", + privKey: "xprvA2JDeKCSNNZky6uBCviVfJSKyQ1mDYahRjijr5idH2WwLsEd4Hsb2Tyh8RfQMuPh7f7RtyzTtdrbdqqsunu5Mm3wDvUAKRHSC34sJ7in334", + pubKey: "xpub6FHa3pjLCk84BayeJxFW2SP4XRrFd1JYnxeLeU8EqN3vDfZmbqBqaGJAyiLjTAwm6ZLRQUMv1ZACTj37sR62cfN7fe5JnJ7dh8zL4fiyLHV", + fingerprint: "d880d7d8", + identifier: "d880d7d893848509a62d8fb74e32148dac68412f", + chainCode: "cfb71883f01676f587d023cc53a35bc7f88f724b1f8c2892ac1275ac822a3edd", + hexPubKey: "02e8445082a72f29b75ca48748a914df60622a609cacfce8ed0e35804560741d29", + wifPrivKey: "KwjQsVuMjbCP2Zmr3VaFaStav7NvevwjvvkqrWd5Qmh1XVnCteBR", + childNumber: 2, + depth: 4, + }, + { + path: "m/0'/1/2'/2/1000000000", + privKey: "xprvA41z7zogVVwxVSgdKUHDy1SKmdb533PjDz7J6N6mV6uS3ze1ai8FHa8kmHScGpWmj4WggLyQjgPie1rFSruoUihUZREPSL39UNdE3BBDu76", + pubKey: "xpub6H1LXWLaKsWFhvm6RVpEL9P4KfRZSW7abD2ttkWP3SSQvnyA8FSVqNTEcYFgJS2UaFcxupHiYkro49S8yGasTvXEYBVPamhGW6cFJodrTHy", + fingerprint: "d69aa102", + identifier: "d69aa102255fed74378278c7812701ea641fdf32", + chainCode: "c783e67b921d2beb8f6b389cc646d7263b4145701dadd2161548a8b078e65e9e", + hexPubKey: "022a471424da5e657499d1ff51cb43c47481a03b1e77f951fe64cec9f5a48f7011", + wifPrivKey: "Kybw8izYevo5xMh1TK7aUr7jHFCxXS1zv8p3oqFz3o2zFbhRXHYs", + childNumber: 1000000000, + depth: 5, + }, + }, + } + + vector2 := testMasterKey{ + seed: "fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542", + privKey: "xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U", + pubKey: "xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB", + fingerprint: "bd16bee5", + identifier: "bd16bee53961a47d6ad888e29545434a89bdfe95", + chainCode: "60499f801b896d83179a4374aeb7822aaeaceaa0db1f85ee3e904c4defbd9689", + hexPubKey: "03cbcaa9c98c877a26977d00825c956a238e8dddfbd322cce4f74b0b5bd6ace4a7", + wifPrivKey: "KyjXhyHF9wTphBkfpxjL8hkDXDUSbE3tKANT94kXSyh6vn6nKaoy", + children: []testChildKey{ + { + path: "m/0", + privKey: "xprv9vHkqa6EV4sPZHYqZznhT2NPtPCjKuDKGY38FBWLvgaDx45zo9WQRUT3dKYnjwih2yJD9mkrocEZXo1ex8G81dwSM1fwqWpWkeS3v86pgKt", + pubKey: "xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH", + fingerprint: "5a61ff8e", + identifier: "5a61ff8eb7aaca3010db97ebda76121610b78096", + chainCode: "f0909affaa7ee7abe5dd4e100598d4dc53cd709d5a5c2cac40e7412f232f7c9c", + hexPubKey: "02fc9e5af0ac8d9b3cecfe2a888e2117ba3d089d8585886c9c826b6b22a98d12ea", + wifPrivKey: "L2ysLrR6KMSAtx7uPqmYpoTeiRzydXBattRXjXz5GDFPrdfPzKbj", + childNumber: 0, + depth: 1, + }, + { + path: "m/0/2147483647'", + privKey: "xprv9wSp6B7kry3Vj9m1zSnLvN3xH8RdsPP1Mh7fAaR7aRLcQMKTR2vidYEeEg2mUCTAwCd6vnxVrcjfy2kRgVsFawNzmjuHc2YmYRmagcEPdU9", + pubKey: "xpub6ASAVgeehLbnwdqV6UKMHVzgqAG8Gr6riv3Fxxpj8ksbH9ebxaEyBLZ85ySDhKiLDBrQSARLq1uNRts8RuJiHjaDMBU4Zn9h8LZNnBC5y4a", + fingerprint: "d8ab4937", + identifier: "d8ab493736da02f11ed682f88339e720fb0379d1", + chainCode: "be17a268474a6bb9c61e1d720cf6215e2a88c5406c4aee7b38547f585c9a37d9", + hexPubKey: "03c01e7425647bdefa82b12d9bad5e3e6865bee0502694b94ca58b666abc0a5c3b", + wifPrivKey: "L1m5VpbXmMp57P3knskwhoMTLdhAAaXiHvnGLMribbfwzVRpz2Sr", + childNumber: 2147483647 + FirstHardenedChild, + depth: 2, + }, + { + path: "m/0/2147483647'/1", + privKey: "xprv9zFnWC6h2cLgpmSA46vutJzBcfJ8yaJGg8cX1e5StJh45BBciYTRXSd25UEPVuesF9yog62tGAQtHjXajPPdbRCHuWS6T8XA2ECKADdw4Ef", + pubKey: "xpub6DF8uhdarytz3FWdA8TvFSvvAh8dP3283MY7p2V4SeE2wyWmG5mg5EwVvmdMVCQcoNJxGoWaU9DCWh89LojfZ537wTfunKau47EL2dhHKon", + fingerprint: "78412e3a", + identifier: "78412e3a2296a40de124307b6485bd19833e2e34", + chainCode: "f366f48f1ea9f2d1d3fe958c95ca84ea18e4c4ddb9366c336c927eb246fb38cb", + hexPubKey: "03a7d1d856deb74c508e05031f9895dab54626251b3806e16b4bd12e781a7df5b9", + wifPrivKey: "KzyzXnznxSv249b4KuNkBwowaN3akiNeEHy5FWoPCJpStZbEKXN2", + childNumber: 1, + depth: 3, + }, + { + path: "m/0/2147483647'/1/2147483646'", + privKey: "xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc", + pubKey: "xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL", + fingerprint: "31a507b8", + identifier: "31a507b815593dfc51ffc7245ae7e5aee304246e", + chainCode: "637807030d55d01f9a0cb3a7839515d796bd07706386a6eddf06cc29a65a0e29", + hexPubKey: "02d2b36900396c9282fa14628566582f206a5dd0bcc8d5e892611806cafb0301f0", + wifPrivKey: "L5KhaMvPYRW1ZoFmRjUtxxPypQ94m6BcDrPhqArhggdaTbbAFJEF", + childNumber: 2147483646 + FirstHardenedChild, + depth: 4, + }, + { + path: "m/0/2147483647'/1/2147483646'/2", + privKey: "xprvA2nrNbFZABcdryreWet9Ea4LvTJcGsqrMzxHx98MMrotbir7yrKCEXw7nadnHM8Dq38EGfSh6dqA9QWTyefMLEcBYJUuekgW4BYPJcr9E7j", + pubKey: "xpub6FnCn6nSzZAw5Tw7cgR9bi15UV96gLZhjDstkXXxvCLsUXBGXPdSnLFbdpq8p9HmGsApME5hQTZ3emM2rnY5agb9rXpVGyy3bdW6EEgAtqt", + fingerprint: "26132fdb", + identifier: "26132fdbe7bf89cbc64cf8dafa3f9f88b8666220", + chainCode: "9452b549be8cea3ecb7a84bec10dcfd94afe4d129ebfd3b3cb58eedf394ed271", + hexPubKey: "024d902e1a2fc7a8755ab5b694c575fce742c48d9ff192e63df5193e4c7afe1f9c", + wifPrivKey: "L3WAYNAZPxx1fr7KCz7GN9nD5qMBnNiqEJNJMU1z9MMaannAt4aK", + childNumber: 2, + depth: 5, + }, + }, + } + + vector3 := testMasterKey{ + seed: "4b381541583be4423346c643850da4b320e46a87ae3d2a4e6da11eba819cd4acba45d239319ac14f863b8d5ab5a0d0c64d2e8a1e7d1457df2e5a3c51c73235be", + privKey: "xprv9s21ZrQH143K25QhxbucbDDuQ4naNntJRi4KUfWT7xo4EKsHt2QJDu7KXp1A3u7Bi1j8ph3EGsZ9Xvz9dGuVrtHHs7pXeTzjuxBrCmmhgC6", + pubKey: "xpub661MyMwAqRbcEZVB4dScxMAdx6d4nFc9nvyvH3v4gJL378CSRZiYmhRoP7mBy6gSPSCYk6SzXPTf3ND1cZAceL7SfJ1Z3GC8vBgp2epUt13", + fingerprint: "41d63b50", + identifier: "41d63b50d8dd5e730cdf4c79a56fc929a757c548", + chainCode: "01d28a3e53cffa419ec122c968b3259e16b65076495494d97cae10bbfec3c36f", + hexPubKey: "03683af1ba5743bdfc798cf814efeeab2735ec52d95eced528e692b8e34c4e5669", + wifPrivKey: "KwFPqAq9SKx1sPg15Qk56mqkHwrfGPuywtLUxoWPkiTSBoxCs8am", + children: []testChildKey{ + { + path: "m/0'", + privKey: "xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L", + pubKey: "xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y", + fingerprint: "c61368bb", + identifier: "c61368bb50e066acd95bd04a0b23d3837fb75698", + chainCode: "e5fea12a97b927fc9dc3d2cb0d1ea1cf50aa5a1fdc1f933e8906bb38df3377bd", + hexPubKey: "027c3591221e28939e45f8ea297d62c3640ebb09d7058b01d09c963d984a40ad49", + wifPrivKey: "L3z3MSqZtDQ1FPHKi7oWf1nc9rMEGFtZUDCoFa7n4F695g5qZiSu", + childNumber: FirstHardenedChild, + depth: 1, + }, + }, + } + + // Test case copied from: + // https://github.com/bitcoinjs/bip32/blob/master/test/fixtures/index.json + vector4 := testMasterKey{ + seed: "d13de7bd1e54422d1a3b3b699a27fb460de2849e7e66a005c647e8e4a54075cb", + privKey: "xprv9s21ZrQH143K3zWpEJm5QtHFh93eNJrNbNqzqLN5XoE9MvC7gs5TmBFaL2PpaXpDc8FBYVe5EChc73ApjSQ5fWsXS7auHy1MmG6hdpywE1q", + pubKey: "xpub661MyMwAqRbcGUbHLLJ5n2DzFAt8mmaDxbmbdimh68m8EiXGEQPiJya4BJat5yMzy4e68VSUoLGCu5uvzf8dUoGvwuJsLE6F1cibmWsxFNn", + fingerprint: "1a87677b", + identifier: "1a87677be6f73cc9655e8b4c5d2fd0aeeb1b23c7", + chainCode: "c23ab32b36ddff49fae350a1bed8ec6b4d9fc252238dd789b7273ba4416054eb", + hexPubKey: "0298ccc720d5dea817c7077605263bae52bca083cf8888fee77ff4c1b4797ee180", + wifPrivKey: "KwDiCU5bs8xQwsRgxjhkcJcVuR7NE4Mei8X9uSAVviVTE7JmMoS6", + children: []testChildKey{ + { + path: "m/44'/0'/0'/0/0'", + privKey: "xprvA3cqPFaMpr7n1wRh6BPtYfwdYRoKCaPzgDdQnUmgMrz1WxWNEW3EmbBr9ieh9BJAsRGKFPLvotb4p4Aq79jddUVKPVJt7exVzLHcv777JVf", + pubKey: "xpub6GcBnm7FfDg5ERWACCvtuotN6Tdoc37r3SZ1asBHvCWzPkqWn3MVKPWKzy6GsfmdMUGanR3D12dH1cp5tJauuubwc4FAJDn67SH2uUjwAT1", + fingerprint: "e371d69b", + identifier: "e371d69b5dae6eacee832a130ee9f55545275a09", + chainCode: "ca27553aa89617e982e621637d6478f564b32738f8bbe2e48d0a58a8e0f6da40", + hexPubKey: "027c3591221e28939e45f8ea297d62c3640ebb09d7058b01d09c963d984a40ad49", + wifPrivKey: "L3z3MSqZtDQ1FPHKi7oWf1nc9rMEGFtZUDCoFa7n4F695g5qZiSu", + childNumber: FirstHardenedChild, + depth: 5, + }, + }, + } + + vectors := []testMasterKey{ + vector1, + vector2, + vector3, + vector4, + } + + for _, v := range vectors { + t.Run(v.seed, func(t *testing.T) { + testVectorKeyPairs(t, v) + }) + } +} + +func testVectorKeyPairs(t *testing.T, vector testMasterKey) { + // Decode master seed into hex + seed, err := hex.DecodeString(vector.seed) + require.NoError(t, err) + + // Generate a master private and public key + privKey, err := NewMasterKey(seed) + require.NoError(t, err) + + pubKey := privKey.PublicKey() + + require.Equal(t, byte(0), privKey.Depth) + require.Equal(t, byte(0), pubKey.Depth) + + require.Equal(t, uint32(0), privKey.ChildNumber()) + require.Equal(t, uint32(0), pubKey.ChildNumber()) + + require.Equal(t, vector.privKey, privKey.String()) + require.Equal(t, vector.pubKey, pubKey.String()) + + require.Equal(t, vector.hexPubKey, hex.EncodeToString(pubKey.Key)) + + wif := cipher.BitcoinWalletImportFormatFromSeckey(cipher.MustNewSecKey(privKey.Key)) + require.Equal(t, vector.wifPrivKey, wif) + + require.Equal(t, vector.chainCode, hex.EncodeToString(privKey.ChainCode)) + require.Equal(t, vector.chainCode, hex.EncodeToString(pubKey.ChainCode)) + + require.Equal(t, vector.fingerprint, hex.EncodeToString(privKey.Fingerprint())) + require.Equal(t, vector.fingerprint, hex.EncodeToString(pubKey.Fingerprint())) + + require.Equal(t, vector.identifier, hex.EncodeToString(privKey.Identifier())) + require.Equal(t, vector.identifier, hex.EncodeToString(pubKey.Identifier())) + + require.Equal(t, vector.depth, privKey.Depth) + require.Equal(t, vector.depth, pubKey.Depth) + + require.Equal(t, vector.childNumber, privKey.ChildNumber()) + require.Equal(t, vector.childNumber, pubKey.ChildNumber()) + + // Serialize and deserialize both keys and ensure they're the same + assertPrivateKeySerialization(t, privKey, vector.privKey) + assertPublicKeySerialization(t, pubKey, vector.pubKey) + + b58pk, err := base58.Decode(vector.privKey) + require.NoError(t, err) + privKey2, err := DeserializePrivateKey(b58pk) + require.NoError(t, err) + require.Equal(t, privKey, privKey2) + + // Test that DeserializeEncodedPrivateKey + // is equivalent to DeserializePrivateKey(base58.Decode(key)) + privKey3, err := DeserializeEncodedPrivateKey(vector.privKey) + require.NoError(t, err) + require.Equal(t, privKey2, privKey3) + + // Iterate over the entire child chain and test the given keys + for _, testChildKey := range vector.children { + t.Run(testChildKey.path, func(t *testing.T) { + // Get the private key at the given key tree path + privKey, err := NewPrivateKeyFromPath(seed, testChildKey.path) + require.NoError(t, err) + + // Get this private key's public key + pubKey := privKey.PublicKey() + + // Test DeserializePrivateKey + ppk, err := base58.Decode(testChildKey.privKey) + require.NoError(t, err) + xx, err := DeserializePrivateKey(ppk) + require.NoError(t, err) + + require.Equal(t, xx, privKey) + + // Assert correctness + require.Equal(t, testChildKey.privKey, privKey.String()) + require.Equal(t, testChildKey.pubKey, pubKey.String()) + + require.Equal(t, testChildKey.chainCode, hex.EncodeToString(privKey.ChainCode)) + require.Equal(t, testChildKey.chainCode, hex.EncodeToString(pubKey.ChainCode)) + + require.Equal(t, testChildKey.fingerprint, hex.EncodeToString(privKey.Fingerprint())) + require.Equal(t, testChildKey.fingerprint, hex.EncodeToString(pubKey.Fingerprint())) + + require.Equal(t, testChildKey.identifier, hex.EncodeToString(privKey.Identifier())) + require.Equal(t, testChildKey.identifier, hex.EncodeToString(pubKey.Identifier())) + + require.Equal(t, testChildKey.depth, privKey.Depth) + require.Equal(t, testChildKey.depth, pubKey.Depth) + + require.Equal(t, testChildKey.childNumber, privKey.ChildNumber()) + require.Equal(t, testChildKey.childNumber, pubKey.ChildNumber()) + + // Serialize and deserialize both keys and ensure they're the same + assertPrivateKeySerialization(t, privKey, testChildKey.privKey) + assertPublicKeySerialization(t, pubKey, testChildKey.pubKey) + }) + } +} + +func TestParentPublicChildDerivation(t *testing.T) { + // Generated using https://iancoleman.github.io/bip39/ + // Root key: + // xprv9s21ZrQH143K2Cfj4mDZBcEecBmJmawReGwwoAou2zZzG45bM6cFPJSvobVTCB55L6Ld2y8RzC61CpvadeAnhws3CHsMFhNjozBKGNgucYm + // Derivation Path m/44'/60'/0'/0: + // xprv9zy5o7z1GMmYdaeQdmabWFhUf52Ytbpe3G5hduA4SghboqWe7aDGWseN8BJy1GU72wPjkCbBE1hvbXYqpCecAYdaivxjNnBoSNxwYD4wHpW + // xpub6DxSCdWu6jKqr4isjo7bsPeDD6s3J4YVQV1JSHZg12Eagdqnf7XX4fxqyW2sLhUoFWutL7tAELU2LiGZrEXtjVbvYptvTX5Eoa4Mamdjm9u + + extendedMasterPublicBytes, err := base58.Decode("xpub6DxSCdWu6jKqr4isjo7bsPeDD6s3J4YVQV1JSHZg12Eagdqnf7XX4fxqyW2sLhUoFWutL7tAELU2LiGZrEXtjVbvYptvTX5Eoa4Mamdjm9u") + require.NoError(t, err) + + extendedMasterPublic, err := DeserializePublicKey(extendedMasterPublicBytes) + require.NoError(t, err) + + extendedMasterPrivateBytes, err := base58.Decode("xprv9zy5o7z1GMmYdaeQdmabWFhUf52Ytbpe3G5hduA4SghboqWe7aDGWseN8BJy1GU72wPjkCbBE1hvbXYqpCecAYdaivxjNnBoSNxwYD4wHpW") + require.NoError(t, err) + + extendedMasterPrivate, err := DeserializePrivateKey(extendedMasterPrivateBytes) + require.NoError(t, err) + + expectedChildren := []testChildKey{ + { + path: "m/0", + hexPubKey: "0243187e1a2ba9ba824f5f81090650c8f4faa82b7baf93060d10b81f4b705afd46", + wifPrivKey: "KyNPkzzaQ9xa7d2iFacTBgjP4rM3SydTzUZW7uwDh6raePWRJkeM", + }, + { + path: "m/1", + hexPubKey: "023790d11eb715c4320d8e31fba3a09b700051dc2cdbcce03f44b11c274d1e220b", + wifPrivKey: "KwVyk5XXaamsPPiGLHciv6AjhUV88CM7xTto7sRMCEy12GfwZzZQ", + }, + { + path: "m/2", + hexPubKey: "0302c5749c3c75cea234878ae3f4d8f65b75d584bcd7ed0943b016d6f6b59a2bad", + wifPrivKey: "L1o7CpgTjkcBYmbeuNigVpypgJ9GKq87WNqz8QDjWMqdKVKFf826", + }, + { + path: "m/3", + hexPubKey: "03f0440c94e5b14ea5b15875934597afff541bec287c6e65dc1102cafc07f69699", + wifPrivKey: "KzmYqf8WSUNzf2LhAWJjxv7pYX34XhFeLLxSoaSD8y9weJ4j6Z7q", + }, + { + path: "m/4", + hexPubKey: "026419d0d8996707605508ac44c5871edc7fe206a79ef615b74f2eea09c5852e2b", + wifPrivKey: "KzezMKd7Yc4jwJd6ASji2DwXX8jB8XwNTggLoAJU78zPAfXhzRLD", + }, + { + path: "m/5", + hexPubKey: "02f63c6f195eea98bdb163c4a094260dea71d264b21234bed4df3899236e6c2298", + wifPrivKey: "Kwxik5cHiQCZYy5g9gdfQmr7c3ivLDhFjpSF7McHKHeox6iu6MjL", + }, + { + path: "m/6", + hexPubKey: "02d74709cd522081064858f393d009ead5a0ecd43ede3a1f57befcc942025cb5f9", + wifPrivKey: "KwGhZYHovZoczyfupFRgZcr2xz1nHTSKx79uZuWhuzDSU7L7LrxE", + }, + { + path: "m/7", + hexPubKey: "03e54bb92630c943d38bbd8a4a2e65fca7605e672d30a0e545a7198cbb60729ceb", + wifPrivKey: "L4iGJ3JCfnMU1ia2bMQeF88hs6tkkS9QrmLbWPsj1ULHrUJid4KT", + }, + { + path: "m/8", + hexPubKey: "027e9d5acd14d39c4938697fba388cd2e8f31fc1c5dc02fafb93a10a280de85199", + wifPrivKey: "L3xfynMTDMR8vs6G5VxxjoKLBQyihvtcBHF4KHY5wvFMwevLjZKU", + }, + { + path: "m/9", + hexPubKey: "02a167a9f0d57468fb6abf2f3f7967e2cadf574314753a06a9ef29bc76c54638d2", + wifPrivKey: "KxiUV7CcdCuF3bLajqaP6qMFERQFvzsRj9aeCCf3TNWXioLwwJAm", + }, + + { + path: "m/100", + hexPubKey: "020db9ba00ddf68428e3f5bfe54252bbcd75b21e42f51bf3bfc4172bf0e5fa7905", + wifPrivKey: "L5ipKgExgKZYaxsQPEmyjrhoSepoxuSAxSWgK1GX5kaTUN3zGCU7", + }, + { + path: "m/101", + hexPubKey: "0299e3790956570737d6164e6fcda5a3daa304065ca95ba46bc73d436b84f34d46", + wifPrivKey: "L1iUjHWpYSead5vYZycMdMzCZDFQzveG3S6NviAi5BvvGdnuQbi6", + }, + { + path: "m/102", + hexPubKey: "0202e0732c4c5d2b1036af173640e01957998cfd4f9cdaefab6ffe76eb869e2c59", + wifPrivKey: "KybjnK4e985dgzxL5pgXTfq8YFagG8gB9HWAjLimagR4pdodCSNo", + }, + { + path: "m/103", + hexPubKey: "03d050adbd996c0c5d737ff638402dfbb8c08e451fef10e6d62fb57887c1ac6cb2", + wifPrivKey: "Kx9bf5cyf29fp7uuMVnqn47692xRwXStVmnL75w9i1sLQDjbFHP5", + }, + { + path: "m/104", + hexPubKey: "038d466399e2d68b4b16043ad4d88893b3b2f84fc443368729a973df1e66f4f530", + wifPrivKey: "L5myg7MNjKHcgVMS9ytmHgBftiWAi1awGpeC6p9dygsEQV9ZRvpz", + }, + { + path: "m/105", + hexPubKey: "034811e2f0c8c50440c08c2c9799b99c911c036e877e8325386ff61723ae3ffdce", + wifPrivKey: "L1KHrLBPhaJnvysjKUYk5QwkyWDb6uHgDM8EmE4eKtfqyJ13a7HC", + }, + { + path: "m/106", + hexPubKey: "026339fd5842921888e711a6ba9104a5f0c94cc0569855273cf5faefdfbcd3cc29", + wifPrivKey: "Kz4WPV43po7LRkatwHf9YGknGZRYfvo7TkvojinzxoFRXRYXyfDn", + }, + { + path: "m/107", + hexPubKey: "02833705c1069fab2aa92c6b0dac27807290d72e9f52378d493ac44849ca003b22", + wifPrivKey: "L3PxeN4w336kTk1becdFsAnR8ihh8SeMYXRHEzSmRNQTjtmcUjr9", + }, + { + path: "m/108", + hexPubKey: "032d2639bde1eb7bdf8444bd4f6cc26a9d1bdecd8ea15fac3b992c3da68d9d1df5", + wifPrivKey: "L2wf8FYiA888qrhDzHkFkZ3ZRBntysjtJa1QfcxE1eFiyDUZBRSi", + }, + { + path: "m/109", + hexPubKey: "02479c6d4a64b93a2f4343aa862c938fbc658c99219dd7bebb4830307cbd76c9e9", + wifPrivKey: "L5A5hcupWnYTNJTLTWDDfWyb3hnrJgdDgyN7c4PuF17bsY1tNjxS", + }, + } + + for _, child := range expectedChildren { + t.Run(fmt.Sprint(child.path), func(t *testing.T) { + path, err := ParsePath(child.path) + require.NoError(t, err) + require.Len(t, path.Elements, 2) + + pubKey, err := extendedMasterPublic.NewPublicChildKey(path.Elements[1].ChildNumber) + require.NoError(t, err) + require.Equal(t, child.hexPubKey, hex.EncodeToString(pubKey.Key)) + + pubKey2, err := extendedMasterPrivate.NewPublicChildKey(path.Elements[1].ChildNumber) + require.NoError(t, err) + require.Equal(t, pubKey, pubKey2) + + privKey, err := extendedMasterPrivate.NewPrivateChildKey(path.Elements[1].ChildNumber) + require.NoError(t, err) + + expectedPrivKey, err := cipher.SecKeyFromBitcoinWalletImportFormat(child.wifPrivKey) + require.NoError(t, err) + + require.Equal(t, expectedPrivKey[:], privKey.Key) + + pubKey3 := privKey.PublicKey() + require.Equal(t, pubKey, pubKey3) + }) + } +} + +// func TestPrivateParentPublicChildKey(childIdx + +func TestNewMasterKey(t *testing.T) { + tests := []struct { + seed []byte + base58 string + }{ + {[]byte{}, "xprv9s21ZrQH143K4YUcKrp6cVxQaX59ZFkN6MFdeZjt8CHVYNs55xxQSvZpHWfojWMv6zgjmzopCyWPSFAnV4RU33J4pwCcnhsB4R4mPEnTsMC"}, + {[]byte{1}, "xprv9s21ZrQH143K3YSbAXLMPCzJso5QAarQksAGc5rQCyZCBfw4Rj2PqVLFNgezSBhktYkiL3Ta2stLPDF9yZtLMaxk6Spiqh3DNFG8p8MVeEC"}, + {[]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}, "xprv9s21ZrQH143K2hKT3jMKPFEcQLbx2XD55NtqQA7B4C5U9mTZY7gBeCdoFgurN4pxkQshzP8AQhBmUNgAo5djj5FzvUFh5pKH6wcRMSXVuc1"}, + } + + for _, test := range tests { + key, err := newMasterKey(test.seed) + require.NoError(t, err) + assertPrivateKeySerialization(t, key, test.base58) + } + + // NewMasterKey requires a seed length >=16 and <=64 bytes + badSeeds := [][]byte{ + nil, + []byte{}, + []byte{1}, + make([]byte, 15), + make([]byte, 65), + } + + for _, b := range badSeeds { + _, err := NewMasterKey(b) + require.Equal(t, ErrInvalidSeedLength, err) + } +} + +func TestDeserializePrivateInvalidStrings(t *testing.T) { + // Some test cases sourced from bitcoinjs-lib: + // https://github.com/bitcoinjs/bitcoinjs-lib/blob/4b4f32ffacb1b6e269ac3f16d68dba803c564c16/test/fixtures/hdnode.json + tests := []struct { + err error + base58 string + }{ + { + err: ErrSerializedKeyWrongSize, + base58: "xprv9s21ZrQH143K4YUcKrp6cVxQaX59ZFkN6MFdeZjt8CHVYNs55xxQSvZpHWfojWMv6zgjmzopCyWPSFAnV4RU33J4pwCcnhsB4R4mPEnTsM", + }, + { + err: ErrInvalidChecksum, + base58: "xprv9s21ZrQH143K3YSbAXLMPCzJso5QAarQksAGc5rQCyZCBfw4Rj2PqVLFNgezSBhktYkiL3Ta2stLPDF9yZtLMaxk6Spiqh3DNFG8p8MVeEc", + }, + { + err: ErrInvalidPrivateKeyVersion, + base58: "xpub6DxSCdWu6jKqr4isjo7bsPeDD6s3J4YVQV1JSHZg12Eagdqnf7XX4fxqyW2sLhUoFWutL7tAELU2LiGZrEXtjVbvYptvTX5Eoa4Mamdjm9u", + }, + { + err: ErrInvalidKeyVersion, + base58: "8FH81Rao5EgGmdScoN66TJAHsQP7phEMeyMTku9NBJd7hXgaj3HTvSNjqJjoqBpxdbuushwPEM5otvxXt2p9dcw33AqNKzZEPMqGHmz7Dpayi6Vb", + }, + { + err: ErrInvalidChecksum, + base58: "xprvQQQQQQQQQQQQQQQQCviVfJSKyQ1mDYahRjijr5idH2WwLsEd4Hsb2Tyh8RfQMuPh7f7RtyzTtdrbdqqsunu5Mm3wDvUAKRHSC34sJ7in334", + }, + { + err: ErrSerializedKeyWrongSize, + base58: "HAsbc6CgKmTYEQg2CTz7m5STEPAB", + }, + { + err: ErrInvalidFingerprint, + base58: "xprv9tnJFvAXAXPfPnMTKfwpwnkty7MzJwELVgp4NTBquaKXy4RndyfJJCJJf7zNaVpBpzrwVRutZNLRCVLEcZHcvuCNG3zGbGBcZn57FbNnmSP", + }, + { + err: ErrInvalidPrivateKey, + base58: "xprv9s21ZrQH143K3yLysFvsu3n1dMwhNusmNHr7xArzAeCc7MQYqDBBStmqnZq6WLi668siBBNs3SjiyaexduHu9sXT9ixTsqptL67ADqcaBdm", + }, + { + err: ErrInvalidChildNumber, + base58: "xprv9s21ZrQYdgnodnKW4Drm1Qg7poU6Gf2WUDsjPxvYiK7iLBMrsjbnF1wsZZQgmXNeMSG3s7jmHk1b3JrzhG5w8mwXGxqFxfrweico7k8DtxR", + }, + { + err: ErrInvalidKeyVersion, + base58: "1111111111111adADjFaSNPxwXqLjHLj4mBfYxuewDPbw9hEj1uaXCzMxRPXDFF3cUoezTFYom4sEmEVSQmENPPR315cFk9YUFVek73wE9", + }, + { + err: ErrSerializedKeyWrongSize, + base58: "9XpNiB4DberdMn4jZiMhNGtuZUd7xUrCEGw4MG967zsVNvUKBEC9XLrmVmFasanWGp15zXfTNw4vW4KdvUAynEwyKjdho9QdLMPA2H5uyt", + }, + { + err: ErrSerializedKeyWrongSize, + base58: "7JJikZQ2NUXjSAnAF2SjFYE3KXbnnVxzRBNddFE1DjbDEHVGEJzYC7zqSgPoauBJS3cWmZwsER94oYSFrW9vZ4Ch5FtGeifdzmtS3FGYDB1vxFZsYKgMc", + }, + } + + for _, test := range tests { + t.Run(test.base58, func(t *testing.T) { + b, err := base58.Decode(test.base58) + require.NoError(t, err) + + _, err = DeserializePrivateKey(b) + require.Equal(t, test.err, err) + }) + } +} + +func TestDeserializePublicInvalidStrings(t *testing.T) { + // Some test cases sourced from bitcoinjs-lib: + // https://github.com/bitcoinjs/bitcoinjs-lib/blob/4b4f32ffacb1b6e269ac3f16d68dba803c564c16/test/fixtures/hdnode.json + tests := []struct { + err error + base58 string + }{ + { + err: ErrSerializedKeyWrongSize, + base58: "xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet888", + }, + { + err: ErrInvalidChecksum, + base58: "xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W11GMcet8", + }, + { + err: ErrInvalidPublicKeyVersion, + base58: "xprv9uHRZZhk6KAJC1avXpDAp4MDc3sQKNxDiPvvkX8Br5ngLNv1TxvUxt4cV1rGL5hj6KCesnDYUhd7oWgT11eZG7XnxHrnYeSvkzY7d2bhkJ7", + }, + { + err: ErrInvalidFingerprint, + base58: "xpub67tVq9SuNQCfm2PXBqjGRAtNZ935kx2uHJaURePth4JBpMfEy6jum7Euj7FTpbs7fnjhfZcNEktCucWHcJf74dbKLKNSTZCQozdDVwvkJhs", + }, + { + err: ErrInvalidChildNumber, + base58: "xpub661MyMwTWkfYZq6BEh3ywGVXFvNj5hhzmWMhFBHSqmub31B1LZ9wbJ3DEYXZ8bHXGqnHKfepTud5a2XxGdnnePzZa2m2DyzTnFGBUXtaf9M", + }, + { + err: ErrInvalidPublicKey, + base58: "xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gYymDsxxRe3WWeZQ7TadaLSdKUffezzczTCpB8j3JP96UwE2n6w1", + }, + { + err: ErrInvalidKeyVersion, + base58: "8FH81Rao5EgGmdScoN66TJAHsQP7phEMeyMTku9NBJd7hXgaj3HTvSNjqJjoqBpxdbuushwPEM5otvxXt2p9dcw33AqNKzZEPMqGHmz7Dpayi6Vb", + }, + { + err: ErrInvalidKeyVersion, + base58: "1111111111111adADjFaSNPxwXqLjHLj4mBfYxuewDPbw9hEj1uaXCzMxRPXDFF3cUoezTFYom4sEmEVSQmENPPR315cFk9YUFVek73wE9", + }, + { + err: ErrSerializedKeyWrongSize, + base58: "7JJikZQ2NUXjSAnAF2SjFYE3KXbnnVxzRBNddFE1DjbDEHVGEJzYC7zqSgPoauBJS3cWmZwsER94oYSFrW9vZ4Ch5FtGeifdzmtS3FGYDB1vxFZsYKgMc", + }, + } + + for _, test := range tests { + t.Run(test.base58, func(t *testing.T) { + b, err := base58.Decode(test.base58) + require.NoError(t, err) + + _, err = DeserializePublicKey(b) + require.Equal(t, test.err, err) + }) + } +} + +func TestCantCreateHardenedPublicChild(t *testing.T) { + key, err := NewMasterKey(make([]byte, 32)) + require.NoError(t, err) + + // Test that it works for private keys + _, err = key.NewPrivateChildKey(FirstHardenedChild - 1) + require.NoError(t, err) + _, err = key.NewPrivateChildKey(FirstHardenedChild) + require.NoError(t, err) + _, err = key.NewPrivateChildKey(FirstHardenedChild + 1) + require.NoError(t, err) + + // Test that it throws an error for public keys if hardened + pubkey := key.PublicKey() + + _, err = pubkey.NewPublicChildKey(FirstHardenedChild - 1) + require.NoError(t, err) + _, err = pubkey.NewPublicChildKey(FirstHardenedChild) + require.Equal(t, ErrHardenedChildPublicKey, err) + _, err = pubkey.NewPublicChildKey(FirstHardenedChild + 1) + require.Equal(t, ErrHardenedChildPublicKey, err) +} + +func assertPrivateKeySerialization(t *testing.T, key *PrivateKey, expected string) { + expectedBytes, err := base58.Decode(expected) + require.NoError(t, err) + + serialized := key.Serialize() + + require.Equal(t, expectedBytes, serialized) + + key2, err := DeserializePrivateKey(serialized) + require.NoError(t, err) + require.Equal(t, key, key2) + + key3, err := DeserializeEncodedPrivateKey(expected) + require.NoError(t, err) + require.Equal(t, key2, key3) +} + +func assertPublicKeySerialization(t *testing.T, key *PublicKey, expected string) { + expectedBytes, err := base58.Decode(expected) + require.NoError(t, err) + + serialized := key.Serialize() + + require.Equal(t, expectedBytes, serialized) + + key2, err := DeserializePublicKey(serialized) + require.NoError(t, err) + require.Equal(t, key, key2) + + key3, err := DeserializeEncodedPublicKey(expected) + require.NoError(t, err) + require.Equal(t, key2, key3) +} + +func TestValidatePrivateKey(t *testing.T) { + cases := []struct { + name string + key []byte + }{ + { + name: "null key", + key: make([]byte, 32), + }, + + { + name: "nil key", + key: nil, + }, + + { + name: "invalid length key", + key: make([]byte, 30), + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + err := validatePrivateKey(tc.key) + require.Error(t, err) + }) + } +} + +func TestValidatePublicKey(t *testing.T) { + cases := []struct { + name string + key []byte + }{ + { + name: "null key", + key: make([]byte, 33), + }, + + { + name: "nil key", + key: nil, + }, + + { + name: "invalid length key", + key: make([]byte, 30), + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + err := validatePublicKey(tc.key) + require.Error(t, err) + }) + } +} + +func TestAddPrivateKeys(t *testing.T) { + _, validKey := cipher.GenerateKeyPair() + + cases := []struct { + name string + key []byte + keyPar []byte + keyInvalid bool + keyParInvalid bool + }{ + { + name: "null key", + key: make([]byte, 32), + keyPar: validKey[:], + keyInvalid: true, + }, + + { + name: "nil key", + key: nil, + keyPar: validKey[:], + keyInvalid: true, + }, + + { + name: "invalid length key", + key: make([]byte, 30), + keyPar: validKey[:], + keyInvalid: true, + }, + + { + name: "null keyPar", + key: validKey[:], + keyPar: make([]byte, 32), + keyParInvalid: true, + }, + + { + name: "nil keyPar", + key: validKey[:], + keyPar: nil, + keyParInvalid: true, + }, + + { + name: "invalid length keyPar", + key: validKey[:], + keyPar: make([]byte, 30), + keyParInvalid: true, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + _, err := addPrivateKeys(tc.key, tc.keyPar) + require.Error(t, err) + + if tc.keyInvalid && tc.keyParInvalid { + t.Fatal("keyInvalid and keyParInvalid can't both be true") + } + + if tc.keyInvalid { + require.True(t, strings.HasPrefix(err.Error(), "addPrivateKeys: key is invalid"), err.Error()) + } else { + require.True(t, strings.HasPrefix(err.Error(), "addPrivateKeys: keyPar is invalid"), err.Error()) + } + }) + } +} + +func TestAddPublicKeys(t *testing.T) { + validKey, _ := cipher.GenerateKeyPair() + + cases := []struct { + name string + key []byte + keyPar []byte + keyInvalid bool + keyParInvalid bool + }{ + { + name: "null key", + key: make([]byte, 33), + keyPar: validKey[:], + keyInvalid: true, + }, + + { + name: "nil key", + key: nil, + keyPar: validKey[:], + keyInvalid: true, + }, + + { + name: "invalid length key", + key: make([]byte, 30), + keyPar: validKey[:], + keyInvalid: true, + }, + + { + name: "null keyPar", + key: validKey[:], + keyPar: make([]byte, 33), + keyParInvalid: true, + }, + + { + name: "nil keyPar", + key: validKey[:], + keyPar: nil, + keyParInvalid: true, + }, + + { + name: "invalid length keyPar", + key: validKey[:], + keyPar: make([]byte, 30), + keyParInvalid: true, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + _, err := addPublicKeys(tc.key, tc.keyPar) + require.Error(t, err) + + if tc.keyInvalid && tc.keyParInvalid { + t.Fatal("keyInvalid and keyParInvalid can't both be true") + } + + if tc.keyInvalid { + require.True(t, strings.HasPrefix(err.Error(), "addPublicKeys: key is invalid"), err.Error()) + } else { + require.True(t, strings.HasPrefix(err.Error(), "addPublicKeys: keyPar is invalid"), err.Error()) + } + }) + } +} + +func TestPublicKeyForPrivateKey(t *testing.T) { + + cases := []struct { + name string + key []byte + }{ + { + name: "null key", + key: make([]byte, 33), + }, + + { + name: "nil key", + key: nil, + }, + + { + name: "invalid length key", + key: make([]byte, 30), + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + _, err := publicKeyForPrivateKey(tc.key) + require.Error(t, err) + }) + } +} + +func TestNewPrivateKeyFromPath(t *testing.T) { + cases := []struct { + seed string + path string + key string + err error + }{ + { + seed: "6162636465666768696A6B6C6D6E6F707172737475767778797A", + path: "m", + key: "xprv9s21ZrQH143K3GfuLFf1UxUB4GzmFav1hrzTG1bPorBTejryu4YfYVxZn6LNmwfvsi6uj1Wyv9vLDPsfKDuuqwEqYier1ZsbgWVd9NCieNv", + }, + + { + seed: "6162636465666768696A6B6C6D6E6F707172737475767778797A", + path: "m/1'", + key: "xprv9uWf8oyvCHcAUg3kSjSroz67s7M3qJRWmNcdVwYGf91GFsaAatsVVp1bjH7z3WiWevqB7WK92B415oBwcahjoMvvb4mopPyqZUDeVW4168c", + }, + + { + seed: "6162636465666768696A6B6C6D6E6F707172737475767778797A", + path: "m/1'/foo", + err: ErrPathNodeNotNumber, + }, + + { + seed: "6162", + path: "m/1'", + err: ErrInvalidSeedLength, + }, + } + + for _, tc := range cases { + t.Run(tc.path, func(t *testing.T) { + seed, err := hex.DecodeString(tc.seed) + require.NoError(t, err) + + k, err := NewPrivateKeyFromPath(seed, tc.path) + if tc.err != nil { + require.Equal(t, tc.err, err) + return + } + + require.NoError(t, err) + + require.Equal(t, tc.key, k.String()) + }) + } +} + +func TestParsePath(t *testing.T) { + cases := []struct { + path string + err error + p *Path + hardenedDepths []int + }{ + { + path: "m", + p: &Path{ + Elements: []PathNode{{ + Master: true, + ChildNumber: 0, + }}, + }, + }, + + { + path: "m/0", + p: &Path{ + Elements: []PathNode{{ + Master: true, + ChildNumber: 0, + }, { + ChildNumber: 0, + }}, + }, + }, + + { + path: "m/0'", + p: &Path{ + Elements: []PathNode{{ + Master: true, + ChildNumber: 0, + }, { + ChildNumber: FirstHardenedChild, + }}, + }, + hardenedDepths: []int{1}, + }, + + { + path: "m/2147483647", + p: &Path{ + Elements: []PathNode{{ + Master: true, + ChildNumber: 0, + }, { + ChildNumber: 2147483647, + }}, + }, + }, + + { + path: "m/2147483647'", + p: &Path{ + Elements: []PathNode{{ + Master: true, + ChildNumber: 0, + }, { + ChildNumber: 4294967295, + }}, + }, + hardenedDepths: []int{1}, + }, + + { + path: "m/1'/1", + p: &Path{ + Elements: []PathNode{{ + Master: true, + ChildNumber: 0, + }, { + ChildNumber: FirstHardenedChild + 1, + }, { + ChildNumber: 1, + }}, + }, + hardenedDepths: []int{1}, + }, + + { + path: "m/44'/0'/0'/0/0'", + p: &Path{ + Elements: []PathNode{{ + Master: true, + ChildNumber: 0, + }, { + ChildNumber: FirstHardenedChild + 44, + }, { + ChildNumber: FirstHardenedChild, + }, { + ChildNumber: FirstHardenedChild, + }, { + ChildNumber: 0, + }, { + ChildNumber: FirstHardenedChild, + }}, + }, + hardenedDepths: []int{1, 2, 3, 5}, + }, + + { + path: "m'/1'/1", + err: ErrPathNoMaster, + }, + + { + path: "foo", + err: ErrPathNoMaster, + }, + + { + path: "1'/1", + err: ErrPathNoMaster, + }, + + { + path: "m/1\"/1", + err: ErrPathNodeNotNumber, + }, + + { + path: "m/1'/f/1", + err: ErrPathNodeNotNumber, + }, + + { + path: "m/1'/m/1", + err: ErrPathChildMaster, + }, + + { + path: "m/1'/1/4294967296", // maxuint32+1 + err: ErrPathNodeNotNumber, + }, + + { + path: "m/1'/1/2147483648", // maxint32+1 + err: ErrPathNodeNumberTooLarge, + }, + } + + for _, tc := range cases { + t.Run(tc.path, func(t *testing.T) { + + p, err := ParsePath(tc.path) + if tc.err != nil { + require.Equal(t, tc.err, err) + return + } + + require.NoError(t, err) + require.Equal(t, tc.p, p) + + hardenedDepthsMap := make(map[int]struct{}, len(tc.hardenedDepths)) + for _, x := range tc.hardenedDepths { + hardenedDepthsMap[x] = struct{}{} + } + + for i, n := range p.Elements { + _, ok := hardenedDepthsMap[i] + require.Equal(t, ok, n.Hardened()) + } + }) + } +} + +func TestMaxChildDepthError(t *testing.T) { + key, err := NewMasterKey(make([]byte, 32)) + require.NoError(t, err) + + reached := false + for i := 0; i < 256; i++ { + key, err = key.NewPrivateChildKey(0) + switch i { + case 255: + require.Equal(t, err, ErrMaxDepthReached) + reached = true + default: + require.NoError(t, err) + } + } + + require.True(t, reached) +} + +func TestImpossibleChildError(t *testing.T) { + baseErr := errors.New("foo") + childNumber := uint32(4) + + err := NewImpossibleChildError(baseErr, childNumber) + + switch x := err.(type) { + case Error: + require.True(t, x.ImpossibleChild()) + default: + t.Fatal("Expected err type Error") + } + + require.True(t, IsImpossibleChildError(err)) + + switch x := ErrHardenedChildPublicKey.(type) { + case Error: + require.False(t, x.ImpossibleChild()) + default: + t.Fatal("Expected err type Error") + } + + require.False(t, IsImpossibleChildError(ErrHardenedChildPublicKey)) + + require.False(t, IsImpossibleChildError(nil)) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip32/path.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip32/path.go new file mode 100644 index 00000000..d95e6af3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip32/path.go @@ -0,0 +1,108 @@ +package bip32 + +import ( + "errors" + "log" + "strconv" + "strings" +) + +// Path represents a parsed HD wallet path +type Path struct { + Elements []PathNode +} + +// PathNode is an element of an HD wallet path +type PathNode struct { + Master bool + ChildNumber uint32 +} + +// Hardened returns true if this path node is hardened +func (p PathNode) Hardened() bool { + return p.ChildNumber >= FirstHardenedChild +} + +var ( + // ErrPathNoMaster HD wallet path does not start with m + ErrPathNoMaster = errors.New("Path must start with m") + // ErrPathChildMaster HD wallet path contains m in a child node + ErrPathChildMaster = errors.New("Path contains m as a child node") + // ErrPathNodeNotNumber HD wallet path node is not a valid uint32 number + ErrPathNodeNotNumber = errors.New("Path node is not a valid uint32 number") + // ErrPathNodeNumberTooLarge HD wallet path node is >= 2^31 + ErrPathNodeNumberTooLarge = errors.New("Path node must be less than 2^31") +) + +// ParsePath parses a bip32 HD wallet path. The path must start with m/. +func ParsePath(p string) (*Path, error) { + pts := strings.Split(p, "/") + + path := &Path{ + Elements: []PathNode{ + { + Master: true, + ChildNumber: 0, + }, + }, + } + + for i, x := range pts { + if i == 0 { + if x != "m" { + return nil, ErrPathNoMaster + } + // Path.Elements already initialized with master node + continue + } else if x == "m" { + return nil, ErrPathChildMaster + } + + n, err := parseNode(x) + if err != nil { + return nil, err + } + + path.Elements = append(path.Elements, n) + } + + return path, nil +} + +func parseNode(x string) (PathNode, error) { + // Hardened nodes have an apostrophe ' appended + hardened := false + if strings.HasSuffix(x, "'") { + hardened = true + x = x[:len(x)-1] + } + + // Node element (minus a single trailing apostrophe) must be a valid uint32 number + n, err := strconv.ParseUint(x, 10, 32) + if err != nil { + return PathNode{}, ErrPathNodeNotNumber + } + + // Node number must be <2^31. If hardened, 2^31 will be added to it + if n >= uint64(FirstHardenedChild) { + return PathNode{}, ErrPathNodeNumberTooLarge + } + + nn := uint32(n) + + // Add 2^31 to the base number for hardened nodes + if hardened { + nnn := nn + FirstHardenedChild + + // Sanity check + if nnn < nn { + log.Panic("Unexpected overflow of path number when adjusting hardened child number") + } + nn = nnn + } + + return PathNode{ + Master: false, + ChildNumber: nn, + }, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip32/utils.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip32/utils.go new file mode 100644 index 00000000..5034dbc1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip32/utils.go @@ -0,0 +1,171 @@ +package bip32 + +import ( + "crypto/sha256" + "encoding/binary" + "fmt" + "log" + "math/big" + + "github.com/SkycoinProject/skycoin/src/cipher/ripemd160" + secp256k1 "github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go" + secp256k1go "github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2" +) + +// +// Hashes +// + +func hashSHA256(data []byte) []byte { + h := sha256.New() + h.Write(data) //nolint:errcheck + return h.Sum(nil) +} + +func hashDoubleSHA256(data []byte) []byte { + hash1 := hashSHA256(data) + hash2 := hashSHA256(hash1) + return hash2 +} + +func hashRipemd160(data []byte) []byte { + h := ripemd160.New() + h.Write(data) //nolint:errcheck + return h.Sum(nil) +} + +func hash160(data []byte) []byte { + hash1 := hashSHA256(data) + hash2 := hashRipemd160(hash1) + return hash2 +} + +// +// Checksum +// + +func checksum(data []byte) []byte { + hash := hashDoubleSHA256(data) + return hash[:4] +} + +func addChecksumToBytes(data []byte) []byte { + checksum := checksum(data) + return append(data, checksum...) +} + +// +// Keys +// + +// publicKeyForPrivateKey converts a private key to a public key. +// Equivalent to `serP(point(k))` in the bip32 spec +func publicKeyForPrivateKey(key []byte) ([]byte, error) { + // From bip32: If parse256(IL) ≥ n, fail + if err := validatePrivateKey(key); err != nil { + return nil, err + } + + b := secp256k1.PubkeyFromSeckey(key) + if b == nil { + log.Panic("publicKeyForPrivateKey: invalid private key") + } + + // From bip32: If Ki == 0 fail + if err := validatePublicKey(b); err != nil { + return nil, err + } + + return b, nil +} + +func addPublicKeys(key, keyPar []byte) ([]byte, error) { + if code := secp256k1.VerifyPubkey(key); code != 1 { + return nil, fmt.Errorf("addPublicKeys: key is invalid, secp256k1.VerifyPubkey error code %d", code) + } + if code := secp256k1.VerifyPubkey(keyPar); code != 1 { + return nil, fmt.Errorf("addPublicKeys: keyPar is invalid, secp256k1.VerifyPubkey error code %d", code) + } + + // expandPublicKey + var pk1, pk2 secp256k1go.XY + if err := pk1.ParsePubkey(key); err != nil { + log.Panicf("addPublicKeys: invalid pubkey1: %v", err) + } + if err := pk2.ParsePubkey(keyPar); err != nil { + log.Panicf("addPublicKeys: invalid pubkey1: %v", err) + } + + // add public keys + pk1.AddXY(&pk2) + + // compress + newKey := pk1.Bytes() + + if code := secp256k1.VerifyPubkey(newKey); code != 1 { + return nil, fmt.Errorf("addPublicKeys: newKey is invalid, secp256k1.VerifyPubkey error code %d", code) + } + + return newKey, nil +} + +// addPrivateKeys computes the CKDPriv equation `parse256(IL) + kpar (mod n)` +// and verifies the result +func addPrivateKeys(key, keyPar []byte) ([]byte, error) { + // From bip32: If parse256(IL) ≥ n, fail + if code := secp256k1.VerifySeckey(key); code != 1 { + return nil, fmt.Errorf("addPrivateKeys: key is invalid, secp256k1.VerifySeckey error code %d", code) + } + if code := secp256k1.VerifySeckey(keyPar); code != 1 { + return nil, fmt.Errorf("addPrivateKeys: keyPar is invalid, secp256k1.VerifySeckey error code %d", code) + } + + var keyInt big.Int + var keyParInt big.Int + keyInt.SetBytes(key) + keyParInt.SetBytes(keyPar) + + // Computes this CKDPriv equation: + // parse256(IL) + kpar (mod n) + keyInt.Add(&keyInt, &keyParInt) + keyInt.Mod(&keyInt, &secp256k1go.TheCurve.Order.Int) + + newKey := secp256k1go.LeftPadBytes(keyInt.Bytes(), 32) + + // From bip32: If ki == 0 fail + if code := secp256k1.VerifySeckey(newKey); code != 1 { + return nil, fmt.Errorf("addPrivateKeys: newKey is invalid, secp256k1.VerifySeckey error code %d", code) + } + + return newKey, nil +} + +// validatePrivateKey verifies that the secret key is not zero and that it is inside the curve +// Corresponds to bip32 spec constraints `parse256(IL) < n && ki != 0` +func validatePrivateKey(key []byte) error { + // VerifySeckey checks that the key is > 0 and inside the curve + if secp256k1.VerifySeckey(key) != 1 { + return ErrDerivedInvalidPrivateKey + } + + return nil +} + +func validatePublicKey(key []byte) error { + if secp256k1.VerifyPubkey(key) != 1 { + return ErrDerivedInvalidPublicKey + } + + return nil +} + +// +// Numerical +// + +// uint32Bytes serializes a uint32 as bytes in big-endian form +func uint32Bytes(i uint32) []byte { + bytes := make([]byte, 4) + binary.BigEndian.PutUint32(bytes, i) + return bytes +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/LICENSE b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/LICENSE new file mode 100644 index 00000000..1dc11de8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2014-2018 Tyler Smith and contributors +Copyright (c) 2018-2019 Skycoin Developers + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/README.md b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/README.md new file mode 100644 index 00000000..529edcd3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/README.md @@ -0,0 +1,43 @@ +# bip39 +[![Documentation](https://godoc.org/github.com/SkycoinProject/skycoin/src/cipher/bip39?status.svg)](http://godoc.org/github.com/SkycoinProject/skycoin/src/cipher/bip39) + +A golang implementation of the BIP0039 spec for mnemonic seeds. + +Forked from https://github.com/tyler-smith/go-bip39 to manually vendor the code in the `cipher/` path +and to make some structural modifications. + +## Example + +```go +package main + +import ( + "github.com/SkycoinProject/skycoin/src/cipher/bip39" + "github.com/tyler-smith/go-bip32" + "fmt" +) + +func main(){ + // Generate a mnemonic for memorization or user-friendly seeds + entropy, _ := bip39.NewEntropy(256) + mnemonic, _ := bip39.NewMnemonic(entropy) + + // Generate a Bip32 HD wallet for the mnemonic and a user supplied password + seed := bip39.NewSeed(mnemonic, "Secret Passphrase") + + masterKey, _ := bip32.NewMasterKey(seed) + publicKey := masterKey.PublicKey() + + // Display mnemonic and keys + fmt.Println("Mnemonic: ", mnemonic) + fmt.Println("Master private key: ", masterKey) + fmt.Println("Master public key: ", publicKey) +} +``` + +## Credits + +Wordlists are from the [bip39 spec](https://github.com/bitcoin/bips/tree/master/bip-0039). + +Test vectors are from the standard Python BIP0039 implementation from the +Trezor team: [https://github.com/trezor/python-mnemonic](https://github.com/trezor/python-mnemonic) diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/bip39.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/bip39.go new file mode 100644 index 00000000..2ee376b6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/bip39.go @@ -0,0 +1,408 @@ +// Package bip39 is the Golang implementation of the BIP39 spec. +// +// The official BIP39 spec can be found at +// https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki +package bip39 + +import ( + "bytes" + "crypto/sha256" + "crypto/sha512" + "encoding/binary" + "errors" + "fmt" + "math/big" + "strings" + "sync" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/bip39/wordlists" + + "github.com/SkycoinProject/skycoin/src/cipher/pbkdf2" +) + +var ( + // Some bitwise operands for working with big.Ints + last11BitsMask = big.NewInt(2047) + shift11BitsMask = big.NewInt(2048) + bigOne = big.NewInt(1) + bigTwo = big.NewInt(2) + + // used to isolate the checksum bits from the entropy+checksum byte array + wordLengthChecksumMasksMapping = map[int]*big.Int{ + 12: big.NewInt(15), + 15: big.NewInt(31), + 18: big.NewInt(63), + 21: big.NewInt(127), + 24: big.NewInt(255), + } + // used to use only the desired x of 8 available checksum bits. + // 256 bit (word length 24) requires all 8 bits of the checksum, + // and thus no shifting is needed for it (we would get a divByZero crash if we did) + wordLengthChecksumShiftMapping = map[int]*big.Int{ + 12: big.NewInt(16), + 15: big.NewInt(8), + 18: big.NewInt(4), + 21: big.NewInt(2), + } + + // wordList is the set of words to use + wordList []string + + // wordMap is a reverse lookup map for wordList + wordMap map[string]int + + // wordListMutex is held when changing wordList + // TODO -- make wordList non-global + wordListMutex sync.Mutex +) + +var ( + // ErrInvalidEntropyLength is returned when trying to use an entropy set with + // an invalid size. + ErrInvalidEntropyLength = errors.New("Entropy length must be [128, 256] and a multiple of 32") + + // ErrChecksumIncorrect is returned when entropy has the incorrect checksum. + ErrChecksumIncorrect = errors.New("Mnemonic checksum incorrect") + + // ErrSurroundingWhitespace is returned if a mnemonic sentence has extra whitespace around it + ErrSurroundingWhitespace = errors.New("Mnemonic has extra whitespace around it") + + // ErrInvalidSeparator is returned if the words in a mnemonic sentence are not separated by a single ASCII space + ErrInvalidSeparator = errors.New("Mnemonic must be separated by single spaces") + + // ErrUnknownWord is returned if a mnemonic sentence contains an unrecognized word + ErrUnknownWord = errors.New("Mnemonic contains an unrecognized word") + + // ErrInvalidNumberOfWords is returned if a mnemonic sentence does not have 12, 15, 18, 21 or 24 words + ErrInvalidNumberOfWords = errors.New("Mnemonic must have 12, 15, 18, 21 or 24 words") +) + +func init() { + setWordList(wordlists.English) +} + +// setWordList sets the list of words to use for mnemonics. Currently the list +// that is set is used package-wide. +func setWordList(list []string) { + wordListMutex.Lock() + defer wordListMutex.Unlock() + wordList = list + wordMap = map[string]int{} + for i, v := range wordList { + wordMap[v] = i + } +} + +// getWordList gets the list of words to use for mnemonics. +func getWordList() []string { + wordListMutex.Lock() + defer wordListMutex.Unlock() + return wordList +} + +// getWordIndex gets word index in wordMap. +func getWordIndex(word string) (int, bool) { + wordListMutex.Lock() + defer wordListMutex.Unlock() + idx, ok := wordMap[word] + return idx, ok +} + +// DefaultMnemonicEntropyBitSize is the default bit size for NewDefaultMnemonic's entropy +// TODO -- make 24 word seeds default? (256 bits entropy - recommended for HD wallets) +const DefaultMnemonicEntropyBitSize = 128 + +// NewDefaultMnemonic returns a generated mnemonic using entropy with bitSize 128 +func NewDefaultMnemonic() (string, error) { + entropy, err := NewEntropy(DefaultMnemonicEntropyBitSize) + if err != nil { + return "", err + } + + return NewMnemonic(entropy) +} + +// MustNewDefaultMnemonic returns a generated mnemonic using entropy with bitSize 128 and panics if there is an error +func MustNewDefaultMnemonic() string { + seed, err := NewDefaultMnemonic() + if err != nil { + panic(err) + } + return seed +} + +// NewEntropy will create random entropy bytes +// so long as the requested size bitSize is an appropriate size. +// +// bitSize has to be a multiple of 32 and be within the inclusive range of {128, 256} +func NewEntropy(bitSize int) ([]byte, error) { + err := validateEntropyBitSize(bitSize) + if err != nil { + return nil, err + } + + entropy := cipher.RandByte(bitSize / 8) + return entropy, err +} + +// EntropyFromMnemonic takes a mnemonic generated by this library, +// and returns the input entropy used to generate the given mnemonic. +// An error is returned if the given mnemonic is invalid. +func EntropyFromMnemonic(mnemonic string) ([]byte, error) { + words, err := splitMnemonicWords(mnemonic) + if err != nil { + return nil, err + } + + // Decode the words into a big.Int. + b := big.NewInt(0) + for _, v := range words { + index, found := wordMap[v] + if !found { + // This should have been caught by splitMnemonicWords() + panic(fmt.Sprintf("word %q not found in reverse map", v)) + } + var wordBytes [2]byte + binary.BigEndian.PutUint16(wordBytes[:], uint16(index)) + b = b.Mul(b, shift11BitsMask) + b = b.Or(b, big.NewInt(0).SetBytes(wordBytes[:])) + } + + // Build and add the checksum to the big.Int. + checksum := big.NewInt(0) + checksumMask := wordLengthChecksumMasksMapping[len(words)] + checksum = checksum.And(b, checksumMask) + + b.Div(b, big.NewInt(0).Add(checksumMask, bigOne)) + + // The entropy is the underlying bytes of the big.Int. Any upper bytes of + // all 0's are not returned so we pad the beginning of the slice with empty + // bytes if necessary. + entropy := b.Bytes() + entropy = padByteSlice(entropy, len(words)/3*4) + + // Generate the checksum and compare with the one we got from the mnemonic. + entropyChecksumBytes := computeChecksum(entropy) + entropyChecksum := big.NewInt(int64(entropyChecksumBytes[0])) + if l := len(words); l != 24 { + checksumShift := wordLengthChecksumShiftMapping[l] + entropyChecksum.Div(entropyChecksum, checksumShift) + } + + if checksum.Cmp(entropyChecksum) != 0 { + return nil, ErrChecksumIncorrect + } + + return entropy, nil +} + +// NewMnemonic will return a string consisting of the mnemonic words for +// the given entropy. +// If the provide entropy is invalid, an error will be returned. +func NewMnemonic(entropy []byte) (string, error) { + // Compute some lengths for convenience. + entropyBitLength := len(entropy) * 8 + checksumBitLength := entropyBitLength / 32 + sentenceLength := (entropyBitLength + checksumBitLength) / 11 + + // Validate that the requested size is supported. + err := validateEntropyBitSize(entropyBitLength) + if err != nil { + return "", err + } + + // Add checksum to entropy. + entropy = addChecksum(entropy) + + // Break entropy up into sentenceLength chunks of 11 bits. + // For each word AND mask the rightmost 11 bits and find the word at that index. + // Then bitshift entropy 11 bits right and repeat. + // Add to the last empty slot so we can work with LSBs instead of MSB. + + // Entropy as an int so we can bitmask without worrying about bytes slices. + entropyInt := new(big.Int).SetBytes(entropy) + + // Slice to hold words in. + words := make([]string, sentenceLength) + + // Throw away big.Int for AND masking. + word := big.NewInt(0) + + for i := sentenceLength - 1; i >= 0; i-- { + // Get 11 right most bits and bitshift 11 to the right for next time. + word.And(entropyInt, last11BitsMask) + entropyInt.Div(entropyInt, shift11BitsMask) + + // Get the bytes representing the 11 bits as a 2 byte slice. + wordBytes := padByteSlice(word.Bytes(), 2) + + // Convert bytes to an index and add that word to the list. + words[i] = wordList[binary.BigEndian.Uint16(wordBytes)] + } + + return strings.Join(words, " "), nil +} + +// NewSeed creates a hashed seed output given the mnemonic string and a password. +// An error is returned if the mnemonic is not valid. +func NewSeed(mnemonic string, password string) ([]byte, error) { + if err := ValidateMnemonic(mnemonic); err != nil { + return nil, err + } + + return newSeed(mnemonic, password), nil +} + +// newSeed creates a hashed seed output given a provided string and password. +// No checking is performed to validate that the string provided is a valid mnemonic. +func newSeed(mnemonic, password string) []byte { + return pbkdf2.Key([]byte(mnemonic), []byte("mnemonic"+password), 2048, 64, sha512.New) +} + +// ValidateMnemonic returns an error if a mnemonic is invalid. It can be invalid +// for these reasons: +// - Number of words not a multiple of 3 and not at least 12 or at most 24 words +// - Words are not separated by exactly one ascii space +// - Mnemonic string has leading or trailing whitespace +// - Any word is not present in the wordlist +// - The mnemonic checksum is incorrect +// Note: this only works on ascii wordlists. Japanese, Chinese etc are not supported yet. +func ValidateMnemonic(mnemonic string) error { + words, err := splitMnemonicWords(mnemonic) + if err != nil { + return err + } + + if !isMnemonicChecksumValid(words) { + return ErrChecksumIncorrect + } + + return nil +} + +// splitMnemonicWords attempts to verify that the provided mnemonic is valid. +// Validity is determined by both the number of words being appropriate, +// and that all the words in the mnemonic are present in the word list. +func splitMnemonicWords(mnemonic string) ([]string, error) { + // Make sure no leading/trailing whitespace + if mnemonic != strings.TrimSpace(mnemonic) { + return nil, ErrSurroundingWhitespace + } + + // Create a list of all the words in the mnemonic sentence + words := strings.Split(mnemonic, " ") + + // Detect duplicate whitespace + for _, w := range words { + if w == "" { + return nil, ErrInvalidSeparator + } + } + + numOfWords := len(words) + + // The number of words should be 12, 15, 18, 21 or 24 + if numOfWords%3 != 0 || numOfWords < 12 || numOfWords > 24 { + return nil, ErrInvalidNumberOfWords + } + + // Check if all words belong in the wordlist + for _, word := range words { + if _, ok := wordMap[word]; !ok { + return nil, ErrUnknownWord + } + } + + return words, nil +} + +// isMnemonicChecksumValid validates the checksum value of a mnemonic +func isMnemonicChecksumValid(words []string) bool { + if len(words)%3 != 0 || len(words) < 12 || len(words) > 24 { + panic("invalid number of words") // caller should validate words before passing to this function + } + + var ( + entropyBitSize = len(words) * 11 + checksumBitSize = entropyBitSize % 32 + fullByteSize = (entropyBitSize-checksumBitSize)/8 + 1 + checksumByteSize = fullByteSize - (fullByteSize % 4) + ) + + // Convert word indices to a big.Int representing the entropy. + checksummedEntropy := big.NewInt(0) + modulo := big.NewInt(2048) + for _, v := range words { + index := big.NewInt(int64(wordMap[v])) + checksummedEntropy.Mul(checksummedEntropy, modulo) + checksummedEntropy.Add(checksummedEntropy, index) + } + + // Calculate the unchecksummed entropy so we can validate that the checksum is + // correct. + checksumModulo := big.NewInt(0).Exp(bigTwo, big.NewInt(int64(checksumBitSize)), nil) + rawEntropy := big.NewInt(0).Div(checksummedEntropy, checksumModulo) + + // Convert big.Ints to byte padded byte slices. + rawEntropyBytes := padByteSlice(rawEntropy.Bytes(), checksumByteSize) + checksummedEntropyBytes := padByteSlice(checksummedEntropy.Bytes(), fullByteSize) + + // Validate that the checksum is correct. + newChecksummedEntropyBytes := padByteSlice(addChecksum(rawEntropyBytes), fullByteSize) + return bytes.Equal(checksummedEntropyBytes, newChecksummedEntropyBytes) +} + +// Appends to data the first (len(data) / 32)bits of the result of sha256(data) +// Currently only supports data up to 32 bytes +func addChecksum(data []byte) []byte { + // Get first byte of sha256 + hash := computeChecksum(data) + firstChecksumByte := hash[0] + + // len() is in bytes so we divide by 4 + checksumBitLength := uint(len(data) / 4) + + // For each bit of check sum we want we shift the data one the left + // and then set the (new) right most bit equal to checksum bit at that index + // staring from the left + dataBigInt := new(big.Int).SetBytes(data) + for i := uint(0); i < checksumBitLength; i++ { + // Bitshift 1 left + dataBigInt.Mul(dataBigInt, bigTwo) + + // Set rightmost bit if leftmost checksum bit is set + if uint8(firstChecksumByte&(1<<(7-i))) > 0 { + dataBigInt.Or(dataBigInt, bigOne) + } + } + + return dataBigInt.Bytes() +} + +func computeChecksum(data []byte) []byte { + hasher := sha256.New() + hasher.Write(data) //nolint:errcheck + return hasher.Sum(nil) +} + +// validateEntropyBitSize ensures that entropy is the correct size for being a +// mnemonic. +func validateEntropyBitSize(bitSize int) error { + if (bitSize%32) != 0 || bitSize < 128 || bitSize > 256 { + return ErrInvalidEntropyLength + } + return nil +} + +// padByteSlice returns a byte slice of the given size with contents of the +// given slice left padded and any empty spaces filled with 0's. +func padByteSlice(slice []byte, length int) []byte { + offset := length - len(slice) + if offset <= 0 { + return slice + } + newSlice := make([]byte, length) + copy(newSlice[offset:], slice) + return newSlice +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/bip39_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/bip39_test.go new file mode 100644 index 00000000..3fff978c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/bip39_test.go @@ -0,0 +1,553 @@ +package bip39 + +import ( + "crypto/rand" + "encoding/hex" + "strings" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher/bip39/wordlists" +) + +type vector struct { + entropy string + mnemonic string + seed string + err error +} + +func TestGetWordList(t *testing.T) { + require.Equal(t, wordlists.English, getWordList()) +} + +func TestGetWordIndex(t *testing.T) { + for expectedIdx, word := range wordList { + actualIdx, ok := getWordIndex(word) + require.True(t, ok) + require.Equal(t, actualIdx, expectedIdx) + } + + for _, word := range []string{"a", "set", "of", "invalid", "words"} { + actualIdx, ok := getWordIndex(word) + require.False(t, ok) + require.Equal(t, actualIdx, 0) + } +} + +func TestNewMnemonic(t *testing.T) { + for _, vector := range testVectors() { + entropy, err := hex.DecodeString(vector.entropy) + require.NoError(t, err) + + mnemonic, err := NewMnemonic(entropy) + require.NoError(t, err) + require.Equal(t, vector.mnemonic, mnemonic) + + seed, err := NewSeed(mnemonic, "TREZOR") + require.NoError(t, err) + require.Equal(t, vector.seed, hex.EncodeToString(seed)) + } +} + +func TestNewMnemonicInvalidEntropy(t *testing.T) { + _, err := NewMnemonic([]byte{}) + require.Error(t, err) + require.Equal(t, ErrInvalidEntropyLength, err) +} + +func TestNewSeedCheckingInvalidMnemonics(t *testing.T) { + for _, vector := range badMnemonicSentences() { + t.Run(vector.mnemonic, func(t *testing.T) { + _, err := NewSeed(vector.mnemonic, "TREZOR") + require.Error(t, err) + require.Equal(t, vector.err, err) + }) + } +} + +func TestValidateMnemonic(t *testing.T) { + for _, vector := range badMnemonicSentences() { + t.Run(vector.mnemonic, func(t *testing.T) { + err := ValidateMnemonic(vector.mnemonic) + require.Error(t, err) + require.Equal(t, vector.err, err) + }) + } + + for _, vector := range testVectors() { + t.Run(vector.mnemonic, func(t *testing.T) { + err := ValidateMnemonic(vector.mnemonic) + require.NoError(t, err) + }) + } +} + +func TestValidateMnemonic2(t *testing.T) { + m := MustNewDefaultMnemonic() + require.NoError(t, ValidateMnemonic(m)) + + m, err := NewDefaultMnemonic() + require.NoError(t, err) + require.NoError(t, ValidateMnemonic(m)) + + // Truncated + m = m[:len(m)-15] + err = ValidateMnemonic(m) + require.Error(t, err) + // Multiple kinds of errors can result from a truncated random mnemonic; + // don't bother comparing to any specific one + + // Trailing whitespace + m, err = NewDefaultMnemonic() + require.NoError(t, err) + m += " " + err = ValidateMnemonic(m) + require.Error(t, err) + require.Equal(t, ErrSurroundingWhitespace, err) + + m, err = NewDefaultMnemonic() + require.NoError(t, err) + m += "\n" + err = ValidateMnemonic(m) + require.Error(t, err) + require.Equal(t, ErrSurroundingWhitespace, err) + + // Preceding whitespace + m, err = NewDefaultMnemonic() + require.NoError(t, err) + m = " " + m + err = ValidateMnemonic(m) + require.Error(t, err) + require.Equal(t, ErrSurroundingWhitespace, err) + + m, err = NewDefaultMnemonic() + require.NoError(t, err) + m = "\n" + m + err = ValidateMnemonic(m) + require.Error(t, err) + require.Equal(t, ErrSurroundingWhitespace, err) + + // Extra whitespace between words + m, err = NewDefaultMnemonic() + require.NoError(t, err) + ms := strings.Split(m, " ") + m = strings.Join(ms, " ") + err = ValidateMnemonic(m) + require.Error(t, err) + require.Equal(t, ErrInvalidSeparator, err) + + // Contains invalid word + m, err = NewDefaultMnemonic() + require.NoError(t, err) + ms = strings.Split(m, " ") + ms[2] = "foo" + m = strings.Join(ms, " ") + err = ValidateMnemonic(m) + require.Error(t, err) + require.Equal(t, ErrUnknownWord, err) + + // Invalid number of words + m, err = NewDefaultMnemonic() + require.NoError(t, err) + ms = strings.Split(m, " ") + m = strings.Join(ms[:len(ms)-1], " ") + err = ValidateMnemonic(m) + require.Error(t, err) + require.Equal(t, ErrInvalidNumberOfWords, err) +} + +func TestInvalidMnemonicChecksum(t *testing.T) { + badChecksumMnemonics := []string{ + "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon yellow", + "chief stadium sniff exhibit ostrich exit fruit noodle good coin coin supply", + } + + for _, m := range badChecksumMnemonics { + t.Run(m, func(t *testing.T) { + err := ValidateMnemonic(m) + require.Error(t, err) + require.Equal(t, ErrChecksumIncorrect, err) + }) + } +} + +func TestNewEntropy(t *testing.T) { + // Good tests. + for i := 128; i <= 256; i += 32 { + _, err := NewEntropy(i) + require.NoError(t, err) + } + // Bad Values + for i := 0; i <= 256; i++ { + if i%8 != 0 { + _, err := NewEntropy(i) + require.Error(t, err) + require.Equal(t, ErrInvalidEntropyLength, err) + } + } +} + +func TestIsMnemonicChecksumValidForDifferentArrayLangths(t *testing.T) { + max := 1000 + for i := 0; i < max; i++ { + //16, 20, 24, 28, 32 + length := 16 + (i%5)*4 + seed := make([]byte, length) + if n, err := rand.Read(seed); err != nil { + t.Errorf("%v", err) + } else if n != length { + t.Errorf("Wrong number of bytes read: %d", n) + } + + mnemonic, err := NewMnemonic(seed) + if err != nil { + t.Errorf("%v", err) + } + + isValid := isMnemonicChecksumValid(strings.Split(mnemonic, " ")) + require.True(t, isValid) + } +} + +func TestPadByteSlice(t *testing.T) { + require.Equal(t, []byte{0}, padByteSlice([]byte{}, 1)) + require.Equal(t, []byte{0, 1}, padByteSlice([]byte{1}, 2)) + require.Equal(t, []byte{1, 1}, padByteSlice([]byte{1, 1}, 2)) + require.Equal(t, []byte{1, 1, 1}, padByteSlice([]byte{1, 1, 1}, 2)) +} + +func TestIsMnemonicChecksumValidForZeroLeadingSeeds(t *testing.T) { + ms := []string{ + "00000000000000000000000000000000", + "00a84c51041d49acca66e6160c1fa999", + "00ca45df1673c76537a2020bfed1dafd", + "0019d5871c7b81fd83d474ef1c1e1dae", + "00dcb021afb35ffcdd1d032d2056fc86", + "0062be7bd09a27288b6cf0eb565ec739", + "00dc705b5efa0adf25b9734226ba60d4", + "0017747418d54c6003fa64fade83374b", + "000d44d3ee7c3dfa45e608c65384431b", + "008241c1ef976b0323061affe5bf24b9", + "00a6aec77e4d16bea80b50a34991aaba", + "0011527b8c6ddecb9d0c20beccdeb58d", + "001c938c503c8f5a2bba2248ff621546", + "0002f90aaf7a8327698f0031b6317c36", + "00bff43071ed7e07f77b14f615993bac", + "00da143e00ef17fc63b6fb22dcc2c326", + "00ffc6764fb32a354cab1a3ddefb015d", + "0062ef47e0985e8953f24760b7598cdd", + "003bf9765064f71d304908d906c065f5", + "00993851503471439d154b3613947474", + "007ad0ffe9eae753a483a76af06dfa67", + "00091824db9ec19e663bee51d64c83cc", + "00f48ac621f7e3cb39b2012ac3121543", + "0072917415cdca24dfa66c4a92c885b4", + "0027ced2b279ea8a91d29364487cdbf4", + "00b9c0d37fb10ba272e55842ad812583", + "004b3d0d2b9285946c687a5350479c8c", + "00c7c12a37d3a7f8c1532b17c89b724c", + "00f400c5545f06ae17ad00f3041e4e26", + "001e290be10df4d209f247ac5878662b", + "00bf0f74568e582a7dd1ee64f792ec8b", + "00d2e43ecde6b72b847db1539ed89e23", + "00cecba6678505bb7bfec8ed307251f6", + "000aeed1a9edcbb4bc88f610d3ce84eb", + "00d06206aadfc25c2b21805d283f15ae", + "00a31789a2ab2d54f8fadd5331010287", + "003493c5f520e8d5c0483e895a121dc9", + "004706112800b76001ece2e268bc830e", + "00ab31e28bb5305be56e38337dbfa486", + "006872fe85df6b0fa945248e6f9379d1", + "00717e5e375da6934e3cfdf57edaf3bd", + "007f1b46e7b9c4c76e77c434b9bccd6b", + "00dc93735aa35def3b9a2ff676560205", + "002cd5dcd881a49c7b87714c6a570a76", + "0013b5af9e13fac87e0c505686cfb6bf", + "007ab1ec9526b0bc04b64ae65fd42631", + "00abb4e11d8385c1cca905a6a65e9144", + "00574fc62a0501ad8afada2e246708c3", + "005207e0a815bb2da6b4c35ec1f2bf52", + "00f3460f136fb9700080099cbd62bc18", + "007a591f204c03ca7b93981237112526", + "00cfe0befd428f8e5f83a5bfc801472e", + "00987551ac7a879bf0c09b8bc474d9af", + "00cadd3ce3d78e49fbc933a85682df3f", + "00bfbf2e346c855ccc360d03281455a1", + "004cdf55d429d028f715544ce22d4f31", + "0075c84a7d15e0ac85e1e41025eed23b", + "00807dddd61f71725d336cab844d2cb5", + "00422f21b77fe20e367467ed98c18410", + "00b44d0ac622907119c626c850a462fd", + "00363f5e7f22fc49f3cd662a28956563", + "000fe5837e68397bbf58db9f221bdc4e", + "0056af33835c888ef0c22599686445d3", + "00790a8647fd3dfb38b7e2b6f578f2c6", + "00da8d9009675cb7beec930e263014fb", + "00d4b384540a5bb54aa760edaa4fb2fe", + "00be9b1479ed680fdd5d91a41eb926d0", + "009182347502af97077c40a6e74b4b5c", + "00f5c90ee1c67fa77fd821f8e9fab4f1", + "005568f9a2dd6b0c0cc2f5ba3d9cac38", + "008b481f8678577d9cf6aa3f6cd6056b", + "00c4323ece5e4fe3b6cd4c5c932931af", + "009791f7550c3798c5a214cb2d0ea773", + "008a7baab22481f0ad8167dd9f90d55c", + "00f0e601519aafdc8ff94975e64c946d", + "0083b61e0daa9219df59d697c270cd31", + } + + for _, m := range ms { + seed, err := hex.DecodeString(m) + require.NoError(t, err) + + mnemonic, err := NewMnemonic(seed) + require.NoError(t, err) + + isValid := isMnemonicChecksumValid(strings.Split(mnemonic, " ")) + require.True(t, isValid) + } +} + +func TestEntropyFromMnemonic128(t *testing.T) { + testEntropyFromMnemonic(t, 128) +} + +func TestEntropyFromMnemonic160(t *testing.T) { + testEntropyFromMnemonic(t, 160) +} + +func TestEntropyFromMnemonic192(t *testing.T) { + testEntropyFromMnemonic(t, 192) +} + +func TestEntropyFromMnemonic224(t *testing.T) { + testEntropyFromMnemonic(t, 224) +} + +func TestEntropyFromMnemonic256(t *testing.T) { + testEntropyFromMnemonic(t, 256) +} + +func TestEntropyFromMnemonicInvalidChecksum(t *testing.T) { + _, err := EntropyFromMnemonic("abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon yellow") + require.Equal(t, ErrChecksumIncorrect, err) +} + +func TestEntropyFromMnemonicInvalidMnemonicSize(t *testing.T) { + for _, mnemonic := range []string{ + "a a a a a a a a a a a a a a a a a a a a a a a a a", // Too many words + "a", // Too few + "a a a a a a a a a a a a a a", // Not multiple of 3 + } { + _, err := EntropyFromMnemonic(mnemonic) + require.Equal(t, ErrInvalidNumberOfWords, err) + } +} + +func testEntropyFromMnemonic(t *testing.T, bitSize int) { + for i := 0; i < 512; i++ { + expectedEntropy, err := NewEntropy(bitSize) + require.NoError(t, err) + require.True(t, len(expectedEntropy) != 0) + + mnemonic, err := NewMnemonic(expectedEntropy) + require.NoError(t, err) + require.True(t, len(mnemonic) != 0) + + actualEntropy, err := EntropyFromMnemonic(mnemonic) + require.NoError(t, err) + require.Equal(t, expectedEntropy, actualEntropy) + } +} + +func testVectors() []vector { + return []vector{ + { + entropy: "00000000000000000000000000000000", + mnemonic: "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about", + seed: "c55257c360c07c72029aebc1b53c05ed0362ada38ead3e3e9efa3708e53495531f09a6987599d18264c1e1c92f2cf141630c7a3c4ab7c81b2f001698e7463b04", + }, + { + entropy: "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f", + mnemonic: "legal winner thank year wave sausage worth useful legal winner thank yellow", + seed: "2e8905819b8723fe2c1d161860e5ee1830318dbf49a83bd451cfb8440c28bd6fa457fe1296106559a3c80937a1c1069be3a3a5bd381ee6260e8d9739fce1f607", + }, + { + entropy: "80808080808080808080808080808080", + mnemonic: "letter advice cage absurd amount doctor acoustic avoid letter advice cage above", + seed: "d71de856f81a8acc65e6fc851a38d4d7ec216fd0796d0a6827a3ad6ed5511a30fa280f12eb2e47ed2ac03b5c462a0358d18d69fe4f985ec81778c1b370b652a8", + }, + { + entropy: "ffffffffffffffffffffffffffffffff", + mnemonic: "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo wrong", + seed: "ac27495480225222079d7be181583751e86f571027b0497b5b5d11218e0a8a13332572917f0f8e5a589620c6f15b11c61dee327651a14c34e18231052e48c069", + }, + { + entropy: "000000000000000000000000000000000000000000000000", + mnemonic: "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon agent", + seed: "035895f2f481b1b0f01fcf8c289c794660b289981a78f8106447707fdd9666ca06da5a9a565181599b79f53b844d8a71dd9f439c52a3d7b3e8a79c906ac845fa", + }, + { + entropy: "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f", + mnemonic: "legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth useful legal will", + seed: "f2b94508732bcbacbcc020faefecfc89feafa6649a5491b8c952cede496c214a0c7b3c392d168748f2d4a612bada0753b52a1c7ac53c1e93abd5c6320b9e95dd", + }, + { + entropy: "808080808080808080808080808080808080808080808080", + mnemonic: "letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter always", + seed: "107d7c02a5aa6f38c58083ff74f04c607c2d2c0ecc55501dadd72d025b751bc27fe913ffb796f841c49b1d33b610cf0e91d3aa239027f5e99fe4ce9e5088cd65", + }, + { + entropy: "ffffffffffffffffffffffffffffffffffffffffffffffff", + mnemonic: "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo when", + seed: "0cd6e5d827bb62eb8fc1e262254223817fd068a74b5b449cc2f667c3f1f985a76379b43348d952e2265b4cd129090758b3e3c2c49103b5051aac2eaeb890a528", + }, + { + entropy: "0000000000000000000000000000000000000000000000000000000000000000", + mnemonic: "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon art", + seed: "bda85446c68413707090a52022edd26a1c9462295029f2e60cd7c4f2bbd3097170af7a4d73245cafa9c3cca8d561a7c3de6f5d4a10be8ed2a5e608d68f92fcc8", + }, + { + entropy: "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f", + mnemonic: "legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth title", + seed: "bc09fca1804f7e69da93c2f2028eb238c227f2e9dda30cd63699232578480a4021b146ad717fbb7e451ce9eb835f43620bf5c514db0f8add49f5d121449d3e87", + }, + { + entropy: "8080808080808080808080808080808080808080808080808080808080808080", + mnemonic: "letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic bless", + seed: "c0c519bd0e91a2ed54357d9d1ebef6f5af218a153624cf4f2da911a0ed8f7a09e2ef61af0aca007096df430022f7a2b6fb91661a9589097069720d015e4e982f", + }, + { + entropy: "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + mnemonic: "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo vote", + seed: "dd48c104698c30cfe2b6142103248622fb7bb0ff692eebb00089b32d22484e1613912f0a5b694407be899ffd31ed3992c456cdf60f5d4564b8ba3f05a69890ad", + }, + { + entropy: "77c2b00716cec7213839159e404db50d", + mnemonic: "jelly better achieve collect unaware mountain thought cargo oxygen act hood bridge", + seed: "b5b6d0127db1a9d2226af0c3346031d77af31e918dba64287a1b44b8ebf63cdd52676f672a290aae502472cf2d602c051f3e6f18055e84e4c43897fc4e51a6ff", + }, + { + entropy: "b63a9c59a6e641f288ebc103017f1da9f8290b3da6bdef7b", + mnemonic: "renew stay biology evidence goat welcome casual join adapt armor shuffle fault little machine walk stumble urge swap", + seed: "9248d83e06f4cd98debf5b6f010542760df925ce46cf38a1bdb4e4de7d21f5c39366941c69e1bdbf2966e0f6e6dbece898a0e2f0a4c2b3e640953dfe8b7bbdc5", + }, + { + entropy: "3e141609b97933b66a060dcddc71fad1d91677db872031e85f4c015c5e7e8982", + mnemonic: "dignity pass list indicate nasty swamp pool script soccer toe leaf photo multiply desk host tomato cradle drill spread actor shine dismiss champion exotic", + seed: "ff7f3184df8696d8bef94b6c03114dbee0ef89ff938712301d27ed8336ca89ef9635da20af07d4175f2bf5f3de130f39c9d9e8dd0472489c19b1a020a940da67", + }, + { + entropy: "0460ef47585604c5660618db2e6a7e7f", + mnemonic: "afford alter spike radar gate glance object seek swamp infant panel yellow", + seed: "65f93a9f36b6c85cbe634ffc1f99f2b82cbb10b31edc7f087b4f6cb9e976e9faf76ff41f8f27c99afdf38f7a303ba1136ee48a4c1e7fcd3dba7aa876113a36e4", + }, + { + entropy: "72f60ebac5dd8add8d2a25a797102c3ce21bc029c200076f", + mnemonic: "indicate race push merry suffer human cruise dwarf pole review arch keep canvas theme poem divorce alter left", + seed: "3bbf9daa0dfad8229786ace5ddb4e00fa98a044ae4c4975ffd5e094dba9e0bb289349dbe2091761f30f382d4e35c4a670ee8ab50758d2c55881be69e327117ba", + }, + { + entropy: "2c85efc7f24ee4573d2b81a6ec66cee209b2dcbd09d8eddc51e0215b0b68e416", + mnemonic: "clutch control vehicle tonight unusual clog visa ice plunge glimpse recipe series open hour vintage deposit universe tip job dress radar refuse motion taste", + seed: "fe908f96f46668b2d5b37d82f558c77ed0d69dd0e7e043a5b0511c48c2f1064694a956f86360c93dd04052a8899497ce9e985ebe0c8c52b955e6ae86d4ff4449", + }, + { + entropy: "eaebabb2383351fd31d703840b32e9e2", + mnemonic: "turtle front uncle idea crush write shrug there lottery flower risk shell", + seed: "bdfb76a0759f301b0b899a1e3985227e53b3f51e67e3f2a65363caedf3e32fde42a66c404f18d7b05818c95ef3ca1e5146646856c461c073169467511680876c", + }, + { + entropy: "7ac45cfe7722ee6c7ba84fbc2d5bd61b45cb2fe5eb65aa78", + mnemonic: "kiss carry display unusual confirm curtain upgrade antique rotate hello void custom frequent obey nut hole price segment", + seed: "ed56ff6c833c07982eb7119a8f48fd363c4a9b1601cd2de736b01045c5eb8ab4f57b079403485d1c4924f0790dc10a971763337cb9f9c62226f64fff26397c79", + }, + { + entropy: "4fa1a8bc3e6d80ee1316050e862c1812031493212b7ec3f3bb1b08f168cabeef", + mnemonic: "exile ask congress lamp submit jacket era scheme attend cousin alcohol catch course end lucky hurt sentence oven short ball bird grab wing top", + seed: "095ee6f817b4c2cb30a5a797360a81a40ab0f9a4e25ecd672a3f58a0b5ba0687c096a6b14d2c0deb3bdefce4f61d01ae07417d502429352e27695163f7447a8c", + }, + { + entropy: "18ab19a9f54a9274f03e5209a2ac8a91", + mnemonic: "board flee heavy tunnel powder denial science ski answer betray cargo cat", + seed: "6eff1bb21562918509c73cb990260db07c0ce34ff0e3cc4a8cb3276129fbcb300bddfe005831350efd633909f476c45c88253276d9fd0df6ef48609e8bb7dca8", + }, + { + entropy: "18a2e1d81b8ecfb2a333adcb0c17a5b9eb76cc5d05db91a4", + mnemonic: "board blade invite damage undo sun mimic interest slam gaze truly inherit resist great inject rocket museum chief", + seed: "f84521c777a13b61564234bf8f8b62b3afce27fc4062b51bb5e62bdfecb23864ee6ecf07c1d5a97c0834307c5c852d8ceb88e7c97923c0a3b496bedd4e5f88a9", + }, + { + entropy: "15da872c95a13dd738fbf50e427583ad61f18fd99f628c417a61cf8343c90419", + mnemonic: "beyond stage sleep clip because twist token leaf atom beauty genius food business side grid unable middle armed observe pair crouch tonight away coconut", + seed: "b15509eaa2d09d3efd3e006ef42151b30367dc6e3aa5e44caba3fe4d3e352e65101fbdb86a96776b91946ff06f8eac594dc6ee1d3e82a42dfe1b40fef6bcc3fd", + }, + } +} + +func badMnemonicSentences() []vector { + return []vector{ + { + mnemonic: "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon", + err: ErrInvalidNumberOfWords, + }, + { + mnemonic: "legal winner thank year wave sausage worth useful legal winner thank yellow yellow", + err: ErrInvalidNumberOfWords, + }, + { + mnemonic: "letter advice cage absurd amount doctor acoustic avoid letter advice caged above", + err: ErrUnknownWord, + }, + { + mnemonic: "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo, wrong", + err: ErrUnknownWord, + }, + { + mnemonic: "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon", + err: ErrInvalidNumberOfWords, + }, + { + mnemonic: "legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth useful legal will will will", + err: ErrInvalidNumberOfWords, + }, + { + mnemonic: "letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter always.", + err: ErrUnknownWord, + }, + { + mnemonic: "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo why", + err: ErrUnknownWord, + }, + { + mnemonic: "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon art art", + err: ErrInvalidNumberOfWords, + }, + { + mnemonic: "legal winner thank year wave sausage worth useful legal winner thanks year wave worth useful legal winner thank year wave sausage worth title", + err: ErrInvalidNumberOfWords, + }, + { + mnemonic: "letter advice cage absurd amount doctor acoustic avoid letters advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic bless", + err: ErrUnknownWord, + }, + { + mnemonic: "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo voted", + err: ErrUnknownWord, + }, + { + mnemonic: "jello better achieve collect unaware mountain thought cargo oxygen act hood bridge", + err: ErrUnknownWord, + }, + { + mnemonic: "renew, stay, biology, evidence, goat, welcome, casual, join, adapt, armor, shuffle, fault, little, machine, walk, stumble, urge, swap", + err: ErrUnknownWord, + }, + { + mnemonic: "dignity pass list indicate nasty", + err: ErrInvalidNumberOfWords, + }, + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/example_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/example_test.go new file mode 100644 index 00000000..78fc9e62 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/example_test.go @@ -0,0 +1,37 @@ +package bip39_test + +import ( + "encoding/hex" + "fmt" + + "github.com/SkycoinProject/skycoin/src/cipher/bip39" +) + +func ExampleNewMnemonic() { + // the entropy can be any byte slice, generated how pleased, + // as long its bit size is a multiple of 32 and is within + // the inclusive range of {128,256} + entropy, err := hex.DecodeString("066dca1a2bb7e8a1db2832148ce9933eea0f3ac9548d793112d9a95c9407efad") + if err != nil { + panic(err) + } + + // generate a mnemomic + mnemomic, err := bip39.NewMnemonic(entropy) + if err != nil { + panic(err) + } + fmt.Println(mnemomic) + // output: + // all hour make first leader extend hole alien behind guard gospel lava path output census museum junior mass reopen famous sing advance salt reform +} + +func ExampleNewSeed() { + seed, err := bip39.NewSeed("all hour make first leader extend hole alien behind guard gospel lava path output census museum junior mass reopen famous sing advance salt reform", "TREZOR") + if err != nil { + panic(err) + } + fmt.Println(hex.EncodeToString(seed)) + // output: + // 26e975ec644423f4a4c4f4215ef09b4bd7ef924e85d1d17c4cf3f136c2863cf6df0a475045652c57eb5fb41513ca2a2d67722b77e954b4b3fc11f7590449191d +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/wordlists/chinese_simplified.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/wordlists/chinese_simplified.go new file mode 100644 index 00000000..0ee29727 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/wordlists/chinese_simplified.go @@ -0,0 +1,2071 @@ +package wordlists + +import ( + "fmt" + "hash/crc32" + "strings" +) + +func init() { + // Ensure word list is correct + // $ wget https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/chinese_simplified.txt + // $ crc32 chinese_simplified.txt + // e3721bbf + checksum := crc32.ChecksumIEEE([]byte(chineseSimplified)) + if fmt.Sprintf("%x", checksum) != "e3721bbf" { + panic("chineseSimplified checksum invalid") + } +} + +// ChineseSimplified is a slice of mnemonic words taken from the bip39 specification +// https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/chinese_simplified.txt +var ChineseSimplified = strings.Split(strings.TrimSpace(chineseSimplified), "\n") +var chineseSimplified = `çš„ +一 +是 +在 +ä¸ +了 +有 +å’Œ +人 +è¿™ +中 +大 +为 +上 +个 +国 +我 +以 +è¦ +ä»– +æ—¶ +æ¥ +用 +们 +生 +到 +作 +地 +于 +出 +å°± +分 +对 +æˆ +会 +å¯ +主 +å‘ +å¹´ +动 +åŒ +å·¥ +也 +能 +下 +过 +å­ +说 +产 +ç§ +é¢ +而 +æ–¹ +åŽ +多 +定 +è¡Œ +å­¦ +法 +所 +æ°‘ +å¾— +ç» +å +三 +之 +è¿› +ç€ +ç­‰ +部 +度 +家 +电 +力 +里 +如 +æ°´ +化 +高 +自 +二 +ç† +èµ· +å° +物 +现 +实 +加 +é‡ +都 +两 +体 +制 +机 +当 +使 +点 +从 +业 +本 +去 +把 +性 +好 +应 +å¼€ +它 +åˆ +还 +å›  +ç”± +å…¶ +些 +然 +å‰ +外 +天 +政 +å›› +æ—¥ +é‚£ +社 +义 +事 +å¹³ +å½¢ +相 +å…¨ +表 +é—´ +æ · +与 +å…³ +å„ +é‡ +æ–° +线 +内 +æ•° +æ­£ +心 +å +ä½  +明 +看 +原 +åˆ +么 +利 +比 +或 +但 +è´¨ +æ°” +第 +å‘ +é“ +命 +æ­¤ +å˜ +æ¡ +åª +没 +结 +解 +é—® +æ„ +建 +月 +å…¬ +æ—  +ç³» +军 +很 +情 +者 +最 +ç«‹ +代 +想 +å·² +通 +并 +æ +ç›´ +题 +å…š +程 +展 +五 +æžœ +æ–™ +象 +员 +é© +ä½ +å…¥ +常 +æ–‡ +总 +次 +å“ +å¼ +æ´» +设 +åŠ +管 +特 +件 +é•¿ +求 +è€ +头 +基 +资 +è¾¹ +æµ +è·¯ +级 +å°‘ +图 +å±± +统 +接 +知 +较 +å°† +组 +è§ +计 +别 +她 +手 +角 +期 +æ ¹ +论 +è¿ +农 +指 +几 +ä¹ +区 +强 +放 +决 +西 +被 +å¹² +åš +å¿… +战 +å…ˆ +回 +则 +ä»» +å– +æ® +处 +队 +å— +ç»™ +色 +å…‰ +é—¨ +å³ +ä¿ +æ²» +北 +造 +百 +规 +热 +领 +七 +æµ· +å£ +东 +导 +器 +压 +å¿— +世 +金 +增 +争 +济 +阶 +æ²¹ +æ€ +术 +æž +交 +å— +è” +什 +认 +å…­ +å…± +æƒ +收 +è¯ +改 +清 +美 +å† +采 +转 +æ›´ +å• +风 +切 +打 +白 +æ•™ +速 +花 +带 +安 +场 +身 +车 +例 +真 +务 +å…· +万 +æ¯ +ç›® +至 +è¾¾ +èµ° +积 +示 +è®® +声 +报 +æ–— +完 +ç±» +å…« +离 +åŽ +å +ç¡® +æ‰ +科 +å¼  +ä¿¡ +马 +节 +è¯ +ç±³ +æ•´ +空 +å…ƒ +况 +今 +集 +温 +ä¼  +土 +许 +æ­¥ +群 +广 +石 +è®° +需 +段 +ç ” +ç•Œ +拉 +æž— +律 +å« +且 +究 +观 +越 +织 +装 +å½± +ç®— +低 +æŒ +音 +ä¼— +书 +布 +å¤ +容 +å„¿ +é¡» +é™… +商 +éž +验 +è¿ž +æ–­ +æ·± +éš¾ +è¿‘ +矿 +åƒ +周 +委 +ç´  +技 +备 +åŠ +办 +é’ +çœ +列 +ä¹  +å“ +约 +支 +般 +å² +æ„Ÿ +劳 +便 +团 +å¾€ +é…¸ +历 +市 +å…‹ +何 +除 +消 +æž„ +府 +称 +太 +准 +ç²¾ +值 +å· +率 +æ— +ç»´ +划 +选 +æ ‡ +写 +å­˜ +候 +毛 +亲 +å¿« +效 +æ–¯ +院 +查 +江 +åž‹ +眼 +王 +按 +æ ¼ +å…» +易 +ç½® +æ´¾ +层 +片 +始 +å´ +专 +状 +育 +厂 +京 +识 +适 +属 +圆 +包 +ç« +ä½ +è°ƒ +满 +县 +å±€ +ç…§ +å‚ +红 +细 +引 +å¬ +该 +é“ +ä»· +严 +首 +底 +液 +官 +å¾· +éš +ç—… +è‹ +失 +å°” +æ­» +讲 +é… +女 +黄 +推 +显 +è°ˆ +罪 +神 +艺 +å‘¢ +席 +å« +ä¼ +望 +密 +批 +è¥ +项 +防 +举 +çƒ +英 +æ°§ +势 +å‘Š +æŽ +å° +è½ +木 +帮 +è½® +ç ´ +亚 +师 +å›´ +注 +è¿œ +å­— +æ +排 +ä¾› +æ²³ +æ€ +å° +å¦ +æ–½ +å‡ +æ ‘ +溶 +怎 +æ­¢ +案 +言 +士 +å‡ +æ­¦ +固 +å¶ +é±¼ +æ³¢ +视 +ä»… +è´¹ +ç´§ +爱 +å·¦ +ç«  +æ—© +æœ +害 +ç»­ +è½» +æœ +试 +食 +å…… +å…µ +æº +判 +护 +å¸ +足 +æŸ +练 +å·® +致 +æ¿ +ç”° +é™ +黑 +犯 +è´Ÿ +击 +范 +继 +å…´ +ä¼¼ +ä½™ +åš +曲 +输 +ä¿® +æ•… +城 +夫 +够 +é€ +笔 +船 +å  +å³ +è´¢ +åƒ +富 +春 +èŒ +觉 +汉 +ç”» +功 +å·´ +è·Ÿ +虽 +æ‚ +飞 +检 +å¸ +助 +å‡ +阳 +互 +åˆ +创 +抗 +考 +投 +å +ç­– +å¤ +径 +æ¢ +未 +è·‘ +ç•™ +é’¢ +曾 +端 +è´£ +ç«™ +简 +è¿° +é’± +副 +å°½ +å¸ +å°„ +è‰ +冲 +承 +独 +令 +é™ +阿 +宣 +环 +åŒ +请 +超 +å¾® +让 +控 +å·ž +良 +è½´ +找 +å¦ +纪 +益 +ä¾ +优 +顶 +ç¡€ +è½½ +倒 +房 +çª +å +粉 +æ•Œ +ç•¥ +客 +è¢ +冷 +胜 +ç» +æž +å— +剂 +测 +ä¸ +å +诉 +念 +陈 +ä» +ç½— +ç› +å‹ +æ´‹ +é”™ +苦 +夜 +刑 +移 +频 +é€ +é  +æ·· +æ¯ +短 +çš® +终 +èš +æ±½ +æ‘ +云 +哪 +æ—¢ +è· +å« +åœ +烈 +央 +察 +烧 +è¿… +境 +è‹¥ +å° +æ´² +刻 +括 +æ¿€ +å­” +æž +甚 +室 +å¾… +æ ¸ +æ ¡ +æ•£ +ä¾µ +å§ +甲 +游 +ä¹… +èœ +味 +æ—§ +模 +æ¹– +è´§ +æŸ +预 +阻 +毫 +æ™® +稳 +ä¹™ +妈 +æ¤ +æ¯ +扩 +银 +语 +挥 +é…’ +守 +æ‹¿ +åº +纸 +医 +缺 +雨 +å— +é’ˆ +刘 +å•Š +急 +å”± +误 +è®­ +æ„¿ +审 +附 +获 +茶 +鲜 +ç²® +æ–¤ +å­© +脱 +ç¡« +è‚¥ +å–„ +é¾™ +æ¼” +父 +æ¸ +è¡€ +欢 +械 +掌 +æ­Œ +æ²™ +刚 +æ”» +è°“ +盾 +讨 +晚 +ç²’ +ä¹± +燃 +矛 +乎 +æ€ +è¯ +å® +é² +è´µ +é’Ÿ +ç…¤ +读 +ç­ +伯 +香 +介 +è¿« +å¥ +丰 +培 +æ¡ +å…° +æ‹… +弦 +蛋 +沉 +å‡ +ç©¿ +执 +ç­” +ä¹ +è° +顺 +烟 +缩 +å¾ +脸 +å–œ +æ¾ +è„š +å›° +异 +å… +背 +星 +ç¦ +ä¹° +染 +井 +概 +æ…¢ +怕 +ç£ +å€ +祖 +皇 +促 +é™ +è¡¥ +评 +ç¿» +肉 +è·µ +å°¼ +è¡£ +宽 +扬 +棉 +希 +伤 +æ“ +åž‚ +秋 +宜 +æ°¢ +套 +ç£ +振 +架 +亮 +末 +宪 +庆 +ç¼– +牛 +触 +映 +é›· +销 +诗 +座 +å±… +抓 +裂 +胞 +呼 +娘 +景 +å¨ +绿 +晶 +厚 +盟 +è¡¡ +鸡 +å­™ +延 +å± +胶 +屋 +乡 +临 +陆 +顾 +掉 +å‘€ +ç¯ +å² +措 +æŸ +è€ +剧 +玉 +èµµ +è·³ +å“¥ +å­£ +课 +凯 +胡 +é¢ +款 +ç» +å· +é½ +伟 +è’¸ +æ®– +æ°¸ +å®— +è‹— +å· +炉 +岩 +å¼± +零 +æ¨ +å¥ +沿 +露 +æ† +探 +滑 +镇 +饭 +浓 +航 +怀 +赶 +库 +夺 +伊 +çµ +税 +途 +ç­ +èµ› +å½’ +å¬ +鼓 +æ’­ +盘 +è£ +险 +康 +唯 +录 +èŒ +纯 +借 +ç³– +ç›– +横 +符 +ç§ +努 +å ‚ +域 +枪 +润 +å¹… +哈 +ç«Ÿ +熟 +虫 +æ³½ +è„‘ +壤 +碳 +欧 +é +侧 +寨 +æ•¢ +å½» +虑 +æ–œ +è–„ +庭 +纳 +å¼¹ +饲 +伸 +折 +麦 +湿 +æš— +è· +瓦 +å¡ž +床 +ç­‘ +æ¶ +户 +访 +å¡” +奇 +é€ +æ¢ +刀 +æ—‹ +迹 +å¡ +æ°¯ +é‡ +份 +毒 +æ³¥ +退 +æ´— +摆 +ç° +彩 +å– +耗 +å¤ +æ‹© +å¿™ +é“œ +献 +硬 +予 +ç¹ +圈 +雪 +函 +亦 +抽 +篇 +阵 +阴 +ä¸ +å°º +追 +å † +雄 +è¿Ž +æ³› +爸 +楼 +é¿ +è°‹ +å¨ +野 +猪 +æ—— +ç´¯ +å +å…¸ +馆 +ç´¢ +秦 +è„‚ +æ½® +爷 +豆 +忽 +托 +惊 +å¡‘ +é— +愈 +朱 +替 +纤 +ç²— +倾 +å°š +ç—› +楚 +è°¢ +奋 +è´­ +磨 +å› +æ±  +æ— +碎 +骨 +监 +æ• +弟 +æš´ +割 +è´¯ +殊 +释 +è¯ +亡 +å£ +é¡¿ +å® +åˆ +å°˜ +é—» +æ­ +ç‚® +残 +冬 +æ¡¥ +妇 +è­¦ +综 +æ‹› +å´ +付 +æµ® +é­ +å¾ +您 +摇 +è°· +赞 +ç®± +éš” +订 +ç”· +å¹ +å›­ +纷 +å” +è´¥ +宋 +玻 +å·¨ +耕 +å¦ +è£ +é—­ +æ¹¾ +é”® +凡 +é©» +é”… +æ•‘ +æ© +剥 +å‡ +碱 +齿 +截 +炼 +麻 +纺 +ç¦ +废 +ç›› +版 +缓 +净 +ç› +昌 +å©š +涉 +ç­’ +嘴 +æ’ +岸 +朗 +庄 +è¡— +è— +姑 +è´¸ +è… +奴 +啦 +惯 +乘 +ä¼™ +æ¢ +匀 +纱 +扎 +辩 +耳 +彪 +臣 +亿 +ç’ƒ +抵 +脉 +秀 +è¨ +ä¿„ +网 +舞 +店 +å–· +纵 +寸 +æ±— +挂 +æ´ª +è´º +é—ª +柬 +爆 +烯 +æ´¥ +稻 +墙 +软 +勇 +åƒ +滚 +厘 +è’™ +芳 +肯 +å¡ +柱 +è¡ +è…¿ +仪 +æ—… +å°¾ +轧 +冰 +è´¡ +ç™» +黎 +削 +é’» +å‹’ +逃 +éšœ +æ°¨ +郭 +å³° +å¸ +港 +ä¼ +轨 +亩 +毕 +擦 +莫 +刺 +浪 +秘 +æ´ +æ ª +å¥ +å”® +è‚¡ +å²› +甘 +泡 +ç¡ +ç«¥ +铸 +汤 +阀 +休 +汇 +èˆ +牧 +绕 +炸 +哲 +磷 +绩 +朋 +æ·¡ +å°– +å¯ +é™· +柴 +呈 +å¾’ +颜 +泪 +ç¨ +忘 +æ³µ +è“ +æ‹– +æ´ž +授 +é•œ +è¾› +壮 +锋 +è´« +虚 +弯 +æ‘© +æ³° +å¹¼ +å»· +å°Š +窗 +纲 +弄 +隶 +ç–‘ +æ° +宫 +å§ +震 +ç‘ž +怪 +å°¤ +ç´ +循 +æ +膜 +è¿ +夹 +è…° +缘 +ç  +ç©· +森 +æž +竹 +沟 +催 +绳 +忆 +邦 +剩 +幸 +浆 +æ  +æ‹¥ +牙 +è´® +礼 +滤 +é’  +纹 +ç½¢ +æ‹ +å’± +å–Š +袖 +埃 +勤 +罚 +焦 +潜 +ä¼ +墨 +欲 +ç¼ +姓 +刊 +饱 +仿 +奖 +é“ +鬼 +丽 +è·¨ +默 +挖 +链 +扫 +å– +袋 +ç‚­ +污 +幕 +诸 +弧 +励 +梅 +奶 +æ´ +ç¾ +舟 +鉴 +苯 +讼 +抱 +æ¯ +懂 +寒 +智 +埔 +寄 +届 +è·ƒ +渡 +挑 +丹 +艰 +è´ +碰 +æ‹” +爹 +戴 +ç  +梦 +芽 +熔 +赤 +渔 +å“­ +敬 +颗 +奔 +é“… +仲 +虎 +稀 +妹 +ä¹ +ç +申 +æ¡Œ +éµ +å… +隆 +螺 +仓 +é­ +é” +晓 +æ°® +å…¼ +éš +ç¢ +赫 +拨 +å¿  +肃 +缸 +牵 +抢 +åš +å·§ +壳 +å…„ +æœ +讯 +诚 +碧 +祥 +柯 +页 +å·¡ +矩 +悲 +çŒ +龄 +伦 +票 +寻 +æ¡‚ +铺 +圣 +æ +æ° +郑 +趣 +抬 +è’ +è…¾ +è´´ +柔 +æ»´ +猛 +阔 +辆 +妻 +å¡« +æ’¤ +储 +ç­¾ +é—¹ +扰 +ç´« +ç ‚ +递 +æˆ +åŠ +陶 +ä¼ +å–‚ +ç–— +瓶 +婆 +抚 +臂 +摸 +å¿ +虾 +蜡 +é‚» +胸 +å·© +挤 +å¶ +弃 +槽 +劲 +ä¹³ +é‚“ +å‰ +ä» +烂 +ç – +租 +乌 +舰 +ä¼´ +ç“œ +æµ… +丙 +æš‚ +燥 +æ©¡ +柳 +è¿· +æš– +牌 +秧 +胆 +详 +ç°§ +è¸ +ç“· +è°± +呆 +宾 +糊 +æ´› +辉 +愤 +ç«ž +éš™ +怒 +粘 +乃 +绪 +è‚© +ç± +æ• +涂 +熙 +皆 +侦 +悬 +掘 +享 +纠 +醒 +ç‹‚ +é” +æ·€ +æ¨ +牲 +霸 +爬 +èµ +逆 +玩 +陵 +ç¥ +秒 +æµ™ +貌 +å½¹ +å½¼ +悉 +鸭 +趋 +凤 +晨 +ç•œ +辈 +秩 +åµ +ç½² +梯 +ç‚Ž +滩 +棋 +驱 +ç­› +峡 +冒 +å•¥ +寿 +译 +浸 +泉 +帽 +è¿Ÿ +ç¡… +ç–† +è´· +æ¼ +稿 +冠 +å«© +èƒ +芯 +牢 +å› +蚀 +奥 +鸣 +å²­ +羊 +凭 +串 +塘 +绘 +é…µ +èž +盆 +锡 +庙 +ç­¹ +冻 +è¾… +æ‘„ +袭 +ç­‹ +æ‹’ +僚 +æ—± +é’¾ +鸟 +漆 +沈 +眉 +ç– +æ·» +棒 +ç©— +ç¡ +韩 +逼 +扭 +侨 +凉 +挺 +碗 +æ ½ +ç‚’ +æ¯ +æ‚£ +é¦ +åŠ +豪 +è¾½ +勃 +鸿 +æ—¦ +å +æ‹œ +ç‹— +埋 +辊 +掩 +饮 +æ¬ +骂 +辞 +勾 +扣 +ä¼° +è’‹ +ç»’ +雾 +丈 +朵 +姆 +æ‹Ÿ +宇 +辑 +陕 +雕 +å¿ +è“„ +å´‡ +剪 +倡 +厅 +å’¬ +驶 +è–¯ +刷 +æ–¥ +番 +赋 +奉 +ä½› +浇 +漫 +曼 +扇 +é’™ +桃 +扶 +ä»” +è¿” +ä¿— +äº +è…” +éž‹ +棱 +覆 +框 +æ‚„ +å” +æ’ž +骗 +勘 +æ—º +沸 +å­¤ +å +å­Ÿ +渠 +屈 +ç–¾ +妙 +惜 +ä»° +ç‹  +胀 +è° +抛 +霉 +æ¡‘ +å²— +嘛 +è¡° +ç›— +渗 +è„ +èµ– +涌 +甜 +曹 +阅 +è‚Œ +å“© +厉 +烃 +纬 +毅 +昨 +伪 +ç—‡ +ç…® +å¹ +é’‰ +æ­ +茎 +笼 +é…· +å· +弓 +锥 +æ’ +æ° +å‘ +é¼» +翼 +纶 +å™ +狱 +逮 +ç½ +络 +棚 +抑 +膨 +蔬 +寺 +骤 +穆 +冶 +枯 +册 +å°¸ +凸 +ç»… +å¯ +牺 +ç„° +è½° +欣 +晋 +瘦 +御 +é”­ +锦 +丧 +æ—¬ +é”» +åž„ +æœ +扑 +é‚€ +亭 +é…¯ +迈 +舒 +脆 +é…¶ +é—² +忧 +é…š +顽 +ç¾½ +涨 +å¸ +ä»— +陪 +辟 +惩 +æ­ +姚 +è‚š +æ‰ +飘 +漂 +昆 +欺 +å¾ +郎 +烷 +æ± +呵 +饰 +è§ +é›… +é‚® +è¿ +燕 +æ’’ +姻 +èµ´ +å®´ +烦 +债 +å¸ +æ–‘ +铃 +æ—¨ +醇 +è‘£ +饼 +é› +姿 +æ‹Œ +å‚… +è…¹ +妥 +æ‰ +è´¤ +拆 +æ­ª +è‘¡ +胺 +丢 +浩 +å¾½ +昂 +åž« +挡 +览 +è´ª +æ…° +ç¼´ +汪 +æ…Œ +冯 +诺 +姜 +è°Š +凶 +劣 +诬 +耀 +æ˜ +躺 +盈 +骑 +ä¹” +溪 +丛 +å¢ +抹 +é—· +å’¨ +刮 +驾 +缆 +æ‚Ÿ +摘 +é“’ +掷 +颇 +å¹» +柄 +惠 +惨 +ä½³ +仇 +è…Š +çª +涤 +剑 +瞧 +å ¡ +æ³¼ +葱 +罩 +éœ +æž +胎 +è‹ +滨 +ä¿© +æ… +湘 +ç  +霞 +邵 +è„ +ç–¯ +æ·® +é‚ +熊 +粪 +烘 +宿 +æ¡£ +戈 +驳 +å«‚ +裕 +å¾™ +ç®­ +æ +è‚  +æ’‘ +æ™’ +辨 +殿 +莲 +æ‘Š +æ… +é…± +å± +ç–« +å“€ +蔡 +å µ +沫 +çš± +ç•… +å  +é˜ +莱 +敲 +è¾– +é’© +ç—• +å +å·· +饿 +祸 +丘 +玄 +溜 +æ›° +逻 +å½­ +å° +å¿ +妨 +艇 +åž +韦 +怨 +矮 +æ­‡ +` diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/wordlists/chinese_traditional.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/wordlists/chinese_traditional.go new file mode 100644 index 00000000..83812cee --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/wordlists/chinese_traditional.go @@ -0,0 +1,2071 @@ +package wordlists + +import ( + "fmt" + "hash/crc32" + "strings" +) + +func init() { + // Ensure word list is correct + // $ wget https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/chinese_traditional.txt + // $ crc32 chinese_traditional.txt + // 3c20b443 + checksum := crc32.ChecksumIEEE([]byte(chineseTraditional)) + if fmt.Sprintf("%x", checksum) != "3c20b443" { + panic("chineseTraditional checksum invalid") + } +} + +// ChineseTraditional is a slice of mnemonic words taken from the bip39 specification +// https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/chinese_traditional.txt +var ChineseTraditional = strings.Split(strings.TrimSpace(chineseTraditional), "\n") +var chineseTraditional = `çš„ +一 +是 +在 +ä¸ +了 +有 +å’Œ +人 +這 +中 +大 +為 +上 +個 +國 +我 +以 +è¦ +ä»– +時 +來 +用 +們 +生 +到 +作 +地 +æ–¼ +出 +å°± +分 +å° +æˆ +會 +å¯ +主 +發 +å¹´ +å‹• +åŒ +å·¥ +也 +能 +下 +éŽ +å­ +說 +產 +種 +é¢ +而 +æ–¹ +後 +多 +定 +è¡Œ +å­¸ +法 +所 +æ°‘ +å¾— +經 +å +三 +之 +進 +è‘— +ç­‰ +部 +度 +家 +é›» +力 +裡 +如 +æ°´ +化 +高 +自 +二 +ç† +èµ· +å° +物 +ç¾ +實 +加 +é‡ +都 +å…© +é«” +制 +æ©Ÿ +當 +使 +點 +從 +業 +本 +去 +把 +性 +好 +應 +é–‹ +它 +åˆ +é‚„ +å›  +ç”± +å…¶ +些 +然 +å‰ +外 +天 +政 +å›› +æ—¥ +é‚£ +社 +義 +事 +å¹³ +å½¢ +相 +å…¨ +表 +é–“ +樣 +與 +é—œ +å„ +é‡ +æ–° +ç·š +å…§ +數 +æ­£ +心 +å +ä½  +明 +看 +原 +åˆ +麼 +利 +比 +或 +但 +質 +æ°£ +第 +å‘ +é“ +命 +æ­¤ +變 +æ¢ +åª +æ²’ +çµ +解 +å• +æ„ +建 +月 +å…¬ +ç„¡ +ç³» +è» +很 +情 +者 +最 +ç«‹ +代 +想 +å·² +通 +並 +æ +ç›´ +é¡Œ +黨 +程 +展 +五 +æžœ +æ–™ +象 +å“¡ +é© +ä½ +å…¥ +常 +æ–‡ +總 +次 +å“ +å¼ +æ´» +設 +åŠ +管 +特 +件 +é•· +求 +è€ +é ­ +基 +資 +é‚Š +æµ +è·¯ +ç´š +å°‘ +圖 +å±± +çµ± +接 +知 +較 +å°‡ +組 +見 +計 +別 +她 +手 +角 +期 +æ ¹ +è«– +é‹ +è¾² +指 +å¹¾ +ä¹ +å€ +å¼· +放 +決 +西 +被 +å¹¹ +åš +å¿… +戰 +å…ˆ +回 +則 +ä»» +å– +æ“š +處 +隊 +å— +給 +色 +å…‰ +é–€ +å³ +ä¿ +æ²» +北 +造 +百 +è¦ +熱 +é ˜ +七 +æµ· +å£ +æ± +å°Ž +器 +壓 +å¿— +世 +金 +增 +爭 +æ¿Ÿ +階 +æ²¹ +æ€ +è¡“ +極 +交 +å— +è¯ +什 +èª +å…­ +å…± +權 +收 +è­‰ +改 +清 +美 +å† +採 +轉 +æ›´ +å–® +風 +切 +打 +白 +æ•™ +速 +花 +帶 +安 +å ´ +身 +車 +例 +真 +å‹™ +å…· +è¬ +æ¯ +ç›® +至 +é” +èµ° +ç© +示 +è­° +è² +å ± +鬥 +完 +é¡ž +å…« +離 +è¯ +å +確 +æ‰ +科 +å¼µ +ä¿¡ +馬 +節 +話 +ç±³ +æ•´ +空 +å…ƒ +æ³ +今 +集 +溫 +傳 +土 +許 +æ­¥ +群 +廣 +石 +記 +需 +段 +ç ” +ç•Œ +拉 +æž— +律 +å« +且 +究 +觀 +越 +ç¹” +è£ +å½± +ç®— +低 +æŒ +音 +眾 +書 +布 +å¤ +容 +å…’ +é ˆ +éš› +商 +éž +é©— +連 +æ–· +æ·± +難 +è¿‘ +礦 +åƒ +週 +委 +ç´  +技 +å‚™ +åŠ +辦 +é’ +çœ +列 +ç¿’ +響 +ç´„ +支 +般 +å² +æ„Ÿ +å‹ž +便 +團 +å¾€ +é…¸ +æ­· +市 +å…‹ +何 +除 +消 +構 +府 +稱 +太 +準 +ç²¾ +值 +號 +率 +æ— +維 +劃 +é¸ +標 +寫 +å­˜ +候 +毛 +親 +å¿« +效 +æ–¯ +院 +查 +江 +åž‹ +眼 +王 +按 +æ ¼ +養 +易 +ç½® +æ´¾ +層 +片 +始 +å» +å°ˆ +ç‹€ +育 +å»  +京 +è­˜ +é© +屬 +圓 +包 +ç« +ä½ +調 +滿 +縣 +å±€ +ç…§ +åƒ +ç´… +ç´° +引 +è½ +該 +éµ +價 +åš´ +首 +底 +液 +官 +å¾· +隨 +ç—… +蘇 +失 +爾 +æ­» +講 +é… +女 +黃 +推 +顯 +談 +罪 +神 +è— +å‘¢ +席 +å« +ä¼ +望 +密 +批 +營 +é … +防 +舉 +çƒ +英 +æ°§ +å‹¢ +å‘Š +æŽ +å° +è½ +木 +幫 +輪 +ç ´ +亞 +師 +åœ +注 +é  +å­— +æ +排 +ä¾› +æ²³ +æ…‹ +å° +å¦ +æ–½ +減 +樹 +溶 +怎 +æ­¢ +案 +言 +士 +å‡ +æ­¦ +固 +葉 +é­š +æ³¢ +視 +僅 +è²» +ç·Š +æ„› +å·¦ +ç«  +æ—© +æœ +害 +續 +輕 +æœ +試 +食 +å…… +å…µ +æº +判 +è­· +å¸ +足 +æŸ +ç·´ +å·® +致 +æ¿ +ç”° +é™ +黑 +犯 +è²  +æ“Š +范 +ç¹¼ +興 +ä¼¼ +餘 +å … +曲 +輸 +ä¿® +æ•… +城 +夫 +夠 +é€ +ç­† +船 +ä½” +å³ +財 +åƒ +富 +春 +è· +覺 +æ¼¢ +ç•« +功 +å·´ +è·Ÿ +é›– +雜 +飛 +檢 +å¸ +助 +昇 +陽 +互 +åˆ +創 +抗 +考 +投 +壞 +ç­– +å¤ +徑 +æ› +未 +è·‘ +ç•™ +鋼 +曾 +端 +責 +ç«™ +ç°¡ +è¿° +錢 +副 +盡 +å¸ +å°„ +è‰ +è¡ +承 +ç¨ +令 +é™ +阿 +宣 +ç’° +é›™ +è«‹ +超 +å¾® +讓 +控 +å·ž +良 +軸 +找 +å¦ +ç´€ +益 +ä¾ +優 +é ‚ +礎 +載 +倒 +房 +çª +å +粉 +敵 +ç•¥ +客 +è¢ +冷 +å‹ +絕 +æž +å¡Š +劑 +測 +çµ² +å” +訴 +念 +陳 +ä» +ç¾… +é¹½ +å‹ +æ´‹ +錯 +苦 +夜 +刑 +移 +é » +é€ +é  +æ·· +æ¯ +短 +çš® +終 +èš +æ±½ +æ‘ +雲 +哪 +æ—¢ +è· +è¡› +åœ +烈 +央 +察 +燒 +è¿… +境 +è‹¥ +å° +æ´² +刻 +括 +æ¿€ +å­” +æž +甚 +室 +å¾… +æ ¸ +æ ¡ +æ•£ +ä¾µ +å§ +甲 +éŠ +ä¹… +èœ +味 +舊 +模 +æ¹– +貨 +æ +é  +阻 +毫 +æ™® +ç©© +ä¹™ +媽 +æ¤ +æ¯ +æ“´ +銀 +語 +æ® +é…’ +守 +æ‹¿ +åº +ç´™ +醫 +缺 +雨 +å—Ž +é‡ +劉 +å•Š +急 +å”± +誤 +訓 +願 +審 +附 +ç² +茶 +é®® +糧 +æ–¤ +å­© +è„« +ç¡« +è‚¥ +å–„ +é¾ +æ¼” +父 +漸 +è¡€ +æ­¡ +械 +掌 +æ­Œ +æ²™ +剛 +æ”» +謂 +盾 +討 +晚 +ç²’ +亂 +燃 +矛 +乎 +殺 +è—¥ +寧 +é­¯ +è²´ +é˜ +ç…¤ +讀 +ç­ +伯 +香 +介 +è¿« +å¥ +è± +培 +æ¡ +蘭 +æ“” +弦 +蛋 +沉 +å‡ +ç©¿ +執 +ç­” +樂 +誰 +é † +ç…™ +縮 +å¾µ +臉 +å–œ +æ¾ +è…³ +å›° +ç•° +å… +背 +星 +ç¦ +è²· +染 +井 +概 +æ…¢ +怕 +ç£ +å€ +祖 +皇 +促 +éœ +補 +è©• +ç¿» +肉 +è¸ +å°¼ +è¡£ +寬 +æš +棉 +希 +å‚· +æ“ +åž‚ +秋 +宜 +æ°« +套 +ç£ +振 +架 +亮 +末 +憲 +æ…¶ +ç·¨ +牛 +觸 +映 +é›· +銷 +è©© +座 +å±… +抓 +裂 +胞 +呼 +娘 +景 +å¨ +綠 +晶 +厚 +盟 +è¡¡ +雞 +å­« +延 +å± +膠 +屋 +鄉 +臨 +陸 +顧 +掉 +å‘€ +燈 +æ­² +措 +æŸ +è€ +劇 +玉 +趙 +è·³ +å“¥ +å­£ +課 +凱 +胡 +é¡ +款 +ç´¹ +å· +齊 +å‰ +è’¸ +æ®– +æ°¸ +å®— +è‹— +å· +çˆ +岩 +å¼± +零 +楊 +å¥ +沿 +露 +æ¡¿ +探 +滑 +鎮 +飯 +濃 +航 +懷 +趕 +庫 +奪 +伊 +éˆ +稅 +途 +æ»… +è³½ +æ­¸ +å¬ +鼓 +æ’­ +盤 +è£ +險 +康 +唯 +錄 +èŒ +ç´” +借 +ç³– +è“‹ +æ©« +符 +ç§ +努 +å ‚ +域 +æ§ +潤 +å¹… +哈 +ç«Ÿ +熟 +蟲 +澤 +è…¦ +壤 +碳 +æ­ +é +å´ +寨 +æ•¢ +å¾¹ +æ…® +æ–œ +è–„ +庭 +ç´ +彈 +飼 +伸 +折 +麥 +æ¿• +æš— +è· +瓦 +å¡ž +床 +築 +惡 +戶 +訪 +å¡” +奇 +é€ +æ¢ +刀 +æ—‹ +è·¡ +å¡ +æ°¯ +é‡ +份 +毒 +æ³¥ +退 +æ´— +擺 +ç° +彩 +è³£ +耗 +å¤ +擇 +å¿™ +銅 +ç» +硬 +予 +ç¹ +圈 +雪 +函 +亦 +抽 +篇 +陣 +é™° +ä¸ +å°º +追 +å † +雄 +è¿Ž +æ³› +爸 +樓 +é¿ +謀 +噸 +野 +豬 +æ—— +ç´¯ +å +å…¸ +館 +ç´¢ +秦 +è„‚ +æ½® +爺 +豆 +忽 +托 +é©š +å¡‘ +éº +愈 +朱 +替 +纖 +ç²— +傾 +å°š +ç—› +楚 +è¬ +奮 +è³¼ +磨 +å› +æ±  +æ— +碎 +骨 +監 +æ• +弟 +æš´ +割 +貫 +殊 +釋 +è©ž +亡 +å£ +é “ +寶 +åˆ +塵 +èž +æ­ +ç‚® +殘 +冬 +æ©‹ +婦 +è­¦ +綜 +æ‹› +å³ +付 +æµ® +é­ +å¾ +您 +æ– +è°· +è´Š +ç®± +éš” +訂 +ç”· +å¹ +園 +ç´› +å” +æ•— +宋 +玻 +å·¨ +耕 +å¦ +榮 +é–‰ +ç£ +éµ +凡 +é§ +é‹ +æ•‘ +æ© +å‰ +å‡ +é¹¼ +é½’ +截 +ç…‰ +麻 +ç´¡ +ç¦ +廢 +ç›› +版 +ç·© +æ·¨ +ç› +昌 +å©š +涉 +ç­’ +嘴 +æ’ +岸 +朗 +莊 +è¡— +è— +姑 +貿 +è… +奴 +啦 +æ…£ +乘 +夥 +æ¢ +å‹» +ç´— +扎 +辯 +耳 +彪 +臣 +å„„ +ç’ƒ +抵 +脈 +秀 +è–© +ä¿„ +網 +舞 +店 +å™´ +縱 +寸 +æ±— +掛 +æ´ª +è³€ +é–ƒ +柬 +爆 +烯 +æ´¥ +稻 +牆 +軟 +勇 +åƒ +滾 +厘 +è’™ +芳 +肯 +å¡ +柱 +盪 +è…¿ +å„€ +æ—… +å°¾ +軋 +冰 +è²¢ +ç™» +黎 +削 +鑽 +å‹’ +逃 +éšœ +æ°¨ +郭 +å³° +å¹£ +港 +ä¼ +軌 +ç• +ç•¢ +擦 +莫 +刺 +浪 +秘 +æ´ +æ ª +å¥ +å”® +è‚¡ +島 +甘 +泡 +ç¡ +ç«¥ +é‘„ +湯 +é–¥ +休 +匯 +èˆ +牧 +繞 +炸 +哲 +磷 +績 +朋 +æ·¡ +å°– +å•Ÿ +é™· +柴 +呈 +å¾’ +é¡ +æ·š +ç¨ +忘 +æ³µ +è— +æ‹– +æ´ž +授 +é¡ +è¾› +壯 +é‹’ +貧 +è™› +彎 +æ‘© +æ³° +å¹¼ +å»· +å°Š +窗 +綱 +弄 +隸 +ç–‘ +æ° +å®® +å§ +震 +ç‘ž +怪 +å°¤ +ç´ +循 +æ +膜 +é• +夾 +è…° +ç·£ +ç  +窮 +森 +æž +竹 +æº +催 +繩 +憶 +邦 +剩 +幸 +漿 +欄 +æ“ +牙 +貯 +禮 +濾 +鈉 +ç´‹ +ç½· +æ‹ +å’± +å–Š +袖 +埃 +勤 +ç½° +焦 +æ½› +ä¼ +墨 +欲 +縫 +姓 +刊 +飽 +仿 +çŽ +é‹ +鬼 +麗 +è·¨ +默 +挖 +éˆ +掃 +å– +袋 +ç‚­ +污 +幕 +諸 +弧 +勵 +梅 +奶 +æ½” +ç½ +舟 +é‘‘ +苯 +訟 +抱 +毀 +懂 +寒 +智 +埔 +寄 +屆 +èº +渡 +挑 +丹 +艱 +è² +碰 +æ‹” +爹 +戴 +碼 +夢 +芽 +熔 +赤 +æ¼ +å“­ +敬 +顆 +奔 +鉛 +仲 +虎 +稀 +妹 +ä¹ +ç +申 +æ¡Œ +éµ +å… +隆 +螺 +倉 +é­ +銳 +曉 +æ°® +å…¼ +éš± +礙 +赫 +æ’¥ +å¿  +è‚… +缸 +牽 +æ¶ +åš +å·§ +殼 +å…„ +æœ +訊 +誠 +碧 +祥 +柯 +é  +å·¡ +矩 +悲 +çŒ +齡 +倫 +票 +å°‹ +æ¡‚ +鋪 +è– +æ +æ° +é„­ +趣 +抬 +è’ +騰 +è²¼ +柔 +æ»´ +猛 +é—Š +è¼› +妻 +å¡« +æ’¤ +儲 +ç°½ +鬧 +擾 +ç´« +ç ‚ +éž +戲 +åŠ +陶 +ä¼ +餵 +療 +瓶 +婆 +æ’« +臂 +摸 +å¿ +è¦ +è Ÿ +é„° +胸 +éž +æ“  +å¶ +棄 +槽 +å‹ +ä¹³ +鄧 +å‰ +ä» +爛 +磚 +租 +çƒ +艦 +ä¼´ +ç“œ +æ·º +丙 +æš« +燥 +æ©¡ +柳 +è¿· +æš– +牌 +秧 +膽 +詳 +ç°§ +è¸ +ç“· +è­œ +呆 +賓 +糊 +æ´› +è¼ +憤 +競 +éš™ +怒 +粘 +乃 +ç·’ +è‚© +ç± +æ• +å¡— +熙 +皆 +åµ +懸 +掘 +享 +ç³¾ +醒 +ç‹‚ +鎖 +æ·€ +æ¨ +牲 +霸 +爬 +賞 +逆 +玩 +陵 +ç¥ +秒 +æµ™ +貌 +å½¹ +å½¼ +悉 +é´¨ +趨 +é³³ +晨 +ç•œ +輩 +秩 +åµ +ç½² +梯 +ç‚Ž +ç˜ +棋 +é©… +篩 +å³½ +冒 +å•¥ +壽 +è­¯ +浸 +泉 +帽 +é² +矽 +ç–† +貸 +æ¼ +稿 +冠 +å«© +è„… +芯 +牢 +å› +è• +奧 +é³´ +嶺 +羊 +憑 +串 +塘 +繪 +é…µ +èž +盆 +錫 +廟 +籌 +å‡ +è¼” +æ” +襲 +ç­‹ +æ‹’ +僚 +æ—± +鉀 +é³¥ +漆 +沈 +眉 +ç– +æ·» +棒 +ç©— +ç¡ +韓 +逼 +扭 +僑 +涼 +挺 +碗 +æ ½ +ç‚’ +æ¯ +æ‚£ +餾 +勸 +豪 +é¼ +勃 +é´» +æ—¦ +å +æ‹œ +ç‹— +埋 +è¼¥ +掩 +飲 +æ¬ +ç½µ +è¾­ +勾 +扣 +ä¼° +蔣 +絨 +霧 +丈 +朵 +姆 +擬 +宇 +輯 +é™ +雕 +å„Ÿ +è“„ +å´‡ +剪 +倡 +廳 +å’¬ +駛 +è–¯ +刷 +æ–¥ +番 +賦 +奉 +ä½› +澆 +漫 +曼 +扇 +鈣 +桃 +扶 +ä»” +è¿” +ä¿— +虧 +è…” +éž‹ +棱 +覆 +框 +æ‚„ +å” +æ’ž +騙 +勘 +æ—º +沸 +å­¤ +å +å­Ÿ +渠 +屈 +ç–¾ +妙 +惜 +ä»° +ç‹  +脹 +諧 +æ‹‹ +é»´ +æ¡‘ +å´— +嘛 +è¡° +盜 +滲 +臟 +è³´ +湧 +甜 +曹 +é–± +è‚Œ +å“© +厲 +烴 +ç·¯ +毅 +昨 +å½ +ç—‡ +ç…® +嘆 +釘 +æ­ +莖 +ç±  +é…· +å· +弓 +éŒ +æ† +å‚‘ +å‘ +é¼» +翼 +綸 +敘 +ç„ +逮 +ç½ +絡 +棚 +抑 +膨 +蔬 +寺 +é©Ÿ +穆 +冶 +枯 +冊 +å± +凸 +ç´³ +å¯ +犧 +ç„° +轟 +欣 +晉 +瘦 +禦 +錠 +錦 +å–ª +æ—¬ +é› +壟 +æœ +æ’² +é‚€ +亭 +é…¯ +é‚ +舒 +脆 +é…¶ +é–’ +憂 +é…š +é ‘ +ç¾½ +æ¼² +å¸ +ä»— +陪 +é—¢ +懲 +æ­ +姚 +è‚š +æ‰ +飄 +漂 +昆 +欺 +å¾ +郎 +烷 +æ± +呵 +飾 +è•­ +é›… +郵 +é· +燕 +æ’’ +姻 +èµ´ +å®´ +ç…© +債 +帳 +æ–‘ +鈴 +æ—¨ +醇 +è‘£ +餅 +é›› +姿 +æ‹Œ +å‚… +è…¹ +妥 +æ‰ +è³¢ +拆 +æ­ª +è‘¡ +胺 +丟 +浩 +å¾½ +昂 +墊 +æ“‹ +覽 +貪 +æ…° +ç¹³ +汪 +æ…Œ +馮 +諾 +姜 +誼 +å…‡ +劣 +誣 +耀 +æ˜ +躺 +盈 +騎 +å–¬ +溪 +å¢ +盧 +抹 +悶 +è«® +刮 +駕 +纜 +æ‚Ÿ +摘 +鉺 +擲 +é — +å¹» +柄 +惠 +æ…˜ +ä½³ +仇 +臘 +窩 +滌 +åŠ +瞧 +å ¡ +潑 +蔥 +罩 +éœ +æ’ˆ +胎 +è’¼ +濱 +倆 +æ… +湘 +ç  +霞 +邵 +è„ +瘋 +æ·® +é‚ +熊 +糞 +烘 +宿 +檔 +戈 +é§ +å«‚ +裕 +å¾™ +ç®­ +æ +è…¸ +æ’ +曬 +辨 +殿 +è“® +攤 +攪 +醬 +å± +ç–« +å“€ +蔡 +å µ +沫 +皺 +暢 +ç–Š +é–£ +èŠ +敲 +轄 +鉤 +ç—• +壩 +å·· +餓 +ç¦ +丘 +玄 +溜 +æ›° +é‚ +å½­ +嘗 +å¿ +妨 +艇 +åž +韋 +怨 +矮 +æ­‡ +` diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/wordlists/english.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/wordlists/english.go new file mode 100644 index 00000000..f69e8a47 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/wordlists/english.go @@ -0,0 +1,2071 @@ +package wordlists + +import ( + "fmt" + "hash/crc32" + "strings" +) + +func init() { + // Ensure word list is correct + // $ wget https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/english.txt + // $ crc32 english.txt + // c1dbd296 + checksum := crc32.ChecksumIEEE([]byte(english)) + if fmt.Sprintf("%x", checksum) != "c1dbd296" { + panic("english checksum invalid") + } +} + +// English is a slice of mnemonic words taken from the bip39 specification +// https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/english.txt +var English = strings.Split(strings.TrimSpace(english), "\n") +var english = `abandon +ability +able +about +above +absent +absorb +abstract +absurd +abuse +access +accident +account +accuse +achieve +acid +acoustic +acquire +across +act +action +actor +actress +actual +adapt +add +addict +address +adjust +admit +adult +advance +advice +aerobic +affair +afford +afraid +again +age +agent +agree +ahead +aim +air +airport +aisle +alarm +album +alcohol +alert +alien +all +alley +allow +almost +alone +alpha +already +also +alter +always +amateur +amazing +among +amount +amused +analyst +anchor +ancient +anger +angle +angry +animal +ankle +announce +annual +another +answer +antenna +antique +anxiety +any +apart +apology +appear +apple +approve +april +arch +arctic +area +arena +argue +arm +armed +armor +army +around +arrange +arrest +arrive +arrow +art +artefact +artist +artwork +ask +aspect +assault +asset +assist +assume +asthma +athlete +atom +attack +attend +attitude +attract +auction +audit +august +aunt +author +auto +autumn +average +avocado +avoid +awake +aware +away +awesome +awful +awkward +axis +baby +bachelor +bacon +badge +bag +balance +balcony +ball +bamboo +banana +banner +bar +barely +bargain +barrel +base +basic +basket +battle +beach +bean +beauty +because +become +beef +before +begin +behave +behind +believe +below +belt +bench +benefit +best +betray +better +between +beyond +bicycle +bid +bike +bind +biology +bird +birth +bitter +black +blade +blame +blanket +blast +bleak +bless +blind +blood +blossom +blouse +blue +blur +blush +board +boat +body +boil +bomb +bone +bonus +book +boost +border +boring +borrow +boss +bottom +bounce +box +boy +bracket +brain +brand +brass +brave +bread +breeze +brick +bridge +brief +bright +bring +brisk +broccoli +broken +bronze +broom +brother +brown +brush +bubble +buddy +budget +buffalo +build +bulb +bulk +bullet +bundle +bunker +burden +burger +burst +bus +business +busy +butter +buyer +buzz +cabbage +cabin +cable +cactus +cage +cake +call +calm +camera +camp +can +canal +cancel +candy +cannon +canoe +canvas +canyon +capable +capital +captain +car +carbon +card +cargo +carpet +carry +cart +case +cash +casino +castle +casual +cat +catalog +catch +category +cattle +caught +cause +caution +cave +ceiling +celery +cement +census +century +cereal +certain +chair +chalk +champion +change +chaos +chapter +charge +chase +chat +cheap +check +cheese +chef +cherry +chest +chicken +chief +child +chimney +choice +choose +chronic +chuckle +chunk +churn +cigar +cinnamon +circle +citizen +city +civil +claim +clap +clarify +claw +clay +clean +clerk +clever +click +client +cliff +climb +clinic +clip +clock +clog +close +cloth +cloud +clown +club +clump +cluster +clutch +coach +coast +coconut +code +coffee +coil +coin +collect +color +column +combine +come +comfort +comic +common +company +concert +conduct +confirm +congress +connect +consider +control +convince +cook +cool +copper +copy +coral +core +corn +correct +cost +cotton +couch +country +couple +course +cousin +cover +coyote +crack +cradle +craft +cram +crane +crash +crater +crawl +crazy +cream +credit +creek +crew +cricket +crime +crisp +critic +crop +cross +crouch +crowd +crucial +cruel +cruise +crumble +crunch +crush +cry +crystal +cube +culture +cup +cupboard +curious +current +curtain +curve +cushion +custom +cute +cycle +dad +damage +damp +dance +danger +daring +dash +daughter +dawn +day +deal +debate +debris +decade +december +decide +decline +decorate +decrease +deer +defense +define +defy +degree +delay +deliver +demand +demise +denial +dentist +deny +depart +depend +deposit +depth +deputy +derive +describe +desert +design +desk +despair +destroy +detail +detect +develop +device +devote +diagram +dial +diamond +diary +dice +diesel +diet +differ +digital +dignity +dilemma +dinner +dinosaur +direct +dirt +disagree +discover +disease +dish +dismiss +disorder +display +distance +divert +divide +divorce +dizzy +doctor +document +dog +doll +dolphin +domain +donate +donkey +donor +door +dose +double +dove +draft +dragon +drama +drastic +draw +dream +dress +drift +drill +drink +drip +drive +drop +drum +dry +duck +dumb +dune +during +dust +dutch +duty +dwarf +dynamic +eager +eagle +early +earn +earth +easily +east +easy +echo +ecology +economy +edge +edit +educate +effort +egg +eight +either +elbow +elder +electric +elegant +element +elephant +elevator +elite +else +embark +embody +embrace +emerge +emotion +employ +empower +empty +enable +enact +end +endless +endorse +enemy +energy +enforce +engage +engine +enhance +enjoy +enlist +enough +enrich +enroll +ensure +enter +entire +entry +envelope +episode +equal +equip +era +erase +erode +erosion +error +erupt +escape +essay +essence +estate +eternal +ethics +evidence +evil +evoke +evolve +exact +example +excess +exchange +excite +exclude +excuse +execute +exercise +exhaust +exhibit +exile +exist +exit +exotic +expand +expect +expire +explain +expose +express +extend +extra +eye +eyebrow +fabric +face +faculty +fade +faint +faith +fall +false +fame +family +famous +fan +fancy +fantasy +farm +fashion +fat +fatal +father +fatigue +fault +favorite +feature +february +federal +fee +feed +feel +female +fence +festival +fetch +fever +few +fiber +fiction +field +figure +file +film +filter +final +find +fine +finger +finish +fire +firm +first +fiscal +fish +fit +fitness +fix +flag +flame +flash +flat +flavor +flee +flight +flip +float +flock +floor +flower +fluid +flush +fly +foam +focus +fog +foil +fold +follow +food +foot +force +forest +forget +fork +fortune +forum +forward +fossil +foster +found +fox +fragile +frame +frequent +fresh +friend +fringe +frog +front +frost +frown +frozen +fruit +fuel +fun +funny +furnace +fury +future +gadget +gain +galaxy +gallery +game +gap +garage +garbage +garden +garlic +garment +gas +gasp +gate +gather +gauge +gaze +general +genius +genre +gentle +genuine +gesture +ghost +giant +gift +giggle +ginger +giraffe +girl +give +glad +glance +glare +glass +glide +glimpse +globe +gloom +glory +glove +glow +glue +goat +goddess +gold +good +goose +gorilla +gospel +gossip +govern +gown +grab +grace +grain +grant +grape +grass +gravity +great +green +grid +grief +grit +grocery +group +grow +grunt +guard +guess +guide +guilt +guitar +gun +gym +habit +hair +half +hammer +hamster +hand +happy +harbor +hard +harsh +harvest +hat +have +hawk +hazard +head +health +heart +heavy +hedgehog +height +hello +helmet +help +hen +hero +hidden +high +hill +hint +hip +hire +history +hobby +hockey +hold +hole +holiday +hollow +home +honey +hood +hope +horn +horror +horse +hospital +host +hotel +hour +hover +hub +huge +human +humble +humor +hundred +hungry +hunt +hurdle +hurry +hurt +husband +hybrid +ice +icon +idea +identify +idle +ignore +ill +illegal +illness +image +imitate +immense +immune +impact +impose +improve +impulse +inch +include +income +increase +index +indicate +indoor +industry +infant +inflict +inform +inhale +inherit +initial +inject +injury +inmate +inner +innocent +input +inquiry +insane +insect +inside +inspire +install +intact +interest +into +invest +invite +involve +iron +island +isolate +issue +item +ivory +jacket +jaguar +jar +jazz +jealous +jeans +jelly +jewel +job +join +joke +journey +joy +judge +juice +jump +jungle +junior +junk +just +kangaroo +keen +keep +ketchup +key +kick +kid +kidney +kind +kingdom +kiss +kit +kitchen +kite +kitten +kiwi +knee +knife +knock +know +lab +label +labor +ladder +lady +lake +lamp +language +laptop +large +later +latin +laugh +laundry +lava +law +lawn +lawsuit +layer +lazy +leader +leaf +learn +leave +lecture +left +leg +legal +legend +leisure +lemon +lend +length +lens +leopard +lesson +letter +level +liar +liberty +library +license +life +lift +light +like +limb +limit +link +lion +liquid +list +little +live +lizard +load +loan +lobster +local +lock +logic +lonely +long +loop +lottery +loud +lounge +love +loyal +lucky +luggage +lumber +lunar +lunch +luxury +lyrics +machine +mad +magic +magnet +maid +mail +main +major +make +mammal +man +manage +mandate +mango +mansion +manual +maple +marble +march +margin +marine +market +marriage +mask +mass +master +match +material +math +matrix +matter +maximum +maze +meadow +mean +measure +meat +mechanic +medal +media +melody +melt +member +memory +mention +menu +mercy +merge +merit +merry +mesh +message +metal +method +middle +midnight +milk +million +mimic +mind +minimum +minor +minute +miracle +mirror +misery +miss +mistake +mix +mixed +mixture +mobile +model +modify +mom +moment +monitor +monkey +monster +month +moon +moral +more +morning +mosquito +mother +motion +motor +mountain +mouse +move +movie +much +muffin +mule +multiply +muscle +museum +mushroom +music +must +mutual +myself +mystery +myth +naive +name +napkin +narrow +nasty +nation +nature +near +neck +need +negative +neglect +neither +nephew +nerve +nest +net +network +neutral +never +news +next +nice +night +noble +noise +nominee +noodle +normal +north +nose +notable +note +nothing +notice +novel +now +nuclear +number +nurse +nut +oak +obey +object +oblige +obscure +observe +obtain +obvious +occur +ocean +october +odor +off +offer +office +often +oil +okay +old +olive +olympic +omit +once +one +onion +online +only +open +opera +opinion +oppose +option +orange +orbit +orchard +order +ordinary +organ +orient +original +orphan +ostrich +other +outdoor +outer +output +outside +oval +oven +over +own +owner +oxygen +oyster +ozone +pact +paddle +page +pair +palace +palm +panda +panel +panic +panther +paper +parade +parent +park +parrot +party +pass +patch +path +patient +patrol +pattern +pause +pave +payment +peace +peanut +pear +peasant +pelican +pen +penalty +pencil +people +pepper +perfect +permit +person +pet +phone +photo +phrase +physical +piano +picnic +picture +piece +pig +pigeon +pill +pilot +pink +pioneer +pipe +pistol +pitch +pizza +place +planet +plastic +plate +play +please +pledge +pluck +plug +plunge +poem +poet +point +polar +pole +police +pond +pony +pool +popular +portion +position +possible +post +potato +pottery +poverty +powder +power +practice +praise +predict +prefer +prepare +present +pretty +prevent +price +pride +primary +print +priority +prison +private +prize +problem +process +produce +profit +program +project +promote +proof +property +prosper +protect +proud +provide +public +pudding +pull +pulp +pulse +pumpkin +punch +pupil +puppy +purchase +purity +purpose +purse +push +put +puzzle +pyramid +quality +quantum +quarter +question +quick +quit +quiz +quote +rabbit +raccoon +race +rack +radar +radio +rail +rain +raise +rally +ramp +ranch +random +range +rapid +rare +rate +rather +raven +raw +razor +ready +real +reason +rebel +rebuild +recall +receive +recipe +record +recycle +reduce +reflect +reform +refuse +region +regret +regular +reject +relax +release +relief +rely +remain +remember +remind +remove +render +renew +rent +reopen +repair +repeat +replace +report +require +rescue +resemble +resist +resource +response +result +retire +retreat +return +reunion +reveal +review +reward +rhythm +rib +ribbon +rice +rich +ride +ridge +rifle +right +rigid +ring +riot +ripple +risk +ritual +rival +river +road +roast +robot +robust +rocket +romance +roof +rookie +room +rose +rotate +rough +round +route +royal +rubber +rude +rug +rule +run +runway +rural +sad +saddle +sadness +safe +sail +salad +salmon +salon +salt +salute +same +sample +sand +satisfy +satoshi +sauce +sausage +save +say +scale +scan +scare +scatter +scene +scheme +school +science +scissors +scorpion +scout +scrap +screen +script +scrub +sea +search +season +seat +second +secret +section +security +seed +seek +segment +select +sell +seminar +senior +sense +sentence +series +service +session +settle +setup +seven +shadow +shaft +shallow +share +shed +shell +sheriff +shield +shift +shine +ship +shiver +shock +shoe +shoot +shop +short +shoulder +shove +shrimp +shrug +shuffle +shy +sibling +sick +side +siege +sight +sign +silent +silk +silly +silver +similar +simple +since +sing +siren +sister +situate +six +size +skate +sketch +ski +skill +skin +skirt +skull +slab +slam +sleep +slender +slice +slide +slight +slim +slogan +slot +slow +slush +small +smart +smile +smoke +smooth +snack +snake +snap +sniff +snow +soap +soccer +social +sock +soda +soft +solar +soldier +solid +solution +solve +someone +song +soon +sorry +sort +soul +sound +soup +source +south +space +spare +spatial +spawn +speak +special +speed +spell +spend +sphere +spice +spider +spike +spin +spirit +split +spoil +sponsor +spoon +sport +spot +spray +spread +spring +spy +square +squeeze +squirrel +stable +stadium +staff +stage +stairs +stamp +stand +start +state +stay +steak +steel +stem +step +stereo +stick +still +sting +stock +stomach +stone +stool +story +stove +strategy +street +strike +strong +struggle +student +stuff +stumble +style +subject +submit +subway +success +such +sudden +suffer +sugar +suggest +suit +summer +sun +sunny +sunset +super +supply +supreme +sure +surface +surge +surprise +surround +survey +suspect +sustain +swallow +swamp +swap +swarm +swear +sweet +swift +swim +swing +switch +sword +symbol +symptom +syrup +system +table +tackle +tag +tail +talent +talk +tank +tape +target +task +taste +tattoo +taxi +teach +team +tell +ten +tenant +tennis +tent +term +test +text +thank +that +theme +then +theory +there +they +thing +this +thought +three +thrive +throw +thumb +thunder +ticket +tide +tiger +tilt +timber +time +tiny +tip +tired +tissue +title +toast +tobacco +today +toddler +toe +together +toilet +token +tomato +tomorrow +tone +tongue +tonight +tool +tooth +top +topic +topple +torch +tornado +tortoise +toss +total +tourist +toward +tower +town +toy +track +trade +traffic +tragic +train +transfer +trap +trash +travel +tray +treat +tree +trend +trial +tribe +trick +trigger +trim +trip +trophy +trouble +truck +true +truly +trumpet +trust +truth +try +tube +tuition +tumble +tuna +tunnel +turkey +turn +turtle +twelve +twenty +twice +twin +twist +two +type +typical +ugly +umbrella +unable +unaware +uncle +uncover +under +undo +unfair +unfold +unhappy +uniform +unique +unit +universe +unknown +unlock +until +unusual +unveil +update +upgrade +uphold +upon +upper +upset +urban +urge +usage +use +used +useful +useless +usual +utility +vacant +vacuum +vague +valid +valley +valve +van +vanish +vapor +various +vast +vault +vehicle +velvet +vendor +venture +venue +verb +verify +version +very +vessel +veteran +viable +vibrant +vicious +victory +video +view +village +vintage +violin +virtual +virus +visa +visit +visual +vital +vivid +vocal +voice +void +volcano +volume +vote +voyage +wage +wagon +wait +walk +wall +walnut +want +warfare +warm +warrior +wash +wasp +waste +water +wave +way +wealth +weapon +wear +weasel +weather +web +wedding +weekend +weird +welcome +west +wet +whale +what +wheat +wheel +when +where +whip +whisper +wide +width +wife +wild +will +win +window +wine +wing +wink +winner +winter +wire +wisdom +wise +wish +witness +wolf +woman +wonder +wood +wool +word +work +world +worry +worth +wrap +wreck +wrestle +wrist +write +wrong +yard +year +yellow +you +young +youth +zebra +zero +zone +zoo +` diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/wordlists/french.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/wordlists/french.go new file mode 100644 index 00000000..1ae685d3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/wordlists/french.go @@ -0,0 +1,2071 @@ +package wordlists + +import ( + "fmt" + "hash/crc32" + "strings" +) + +func init() { + // Ensure word list is correct + // $ wget https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/french.txt + // $ crc32 french.txt + // 3e56b216 + checksum := crc32.ChecksumIEEE([]byte(french)) + if fmt.Sprintf("%x", checksum) != "3e56b216" { + panic("french checksum invalid") + } +} + +// French is a slice of mnemonic words taken from the bip39 specification +// https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/french.txt +var French = strings.Split(strings.TrimSpace(french), "\n") +var french = `abaisser +abandon +abdiquer +abeille +abolir +aborder +aboutir +aboyer +abrasif +abreuver +abriter +abroger +abrupt +absence +absolu +absurde +abusif +abyssal +acadeÌmie +acajou +acarien +accabler +accepter +acclamer +accolade +accroche +accuser +acerbe +achat +acheter +aciduler +acier +acompte +acqueÌrir +acronyme +acteur +actif +actuel +adepte +adeÌquat +adheÌsif +adjectif +adjuger +admettre +admirer +adopter +adorer +adoucir +adresse +adroit +adulte +adverbe +aeÌrer +aeÌronef +affaire +affecter +affiche +affreux +affubler +agacer +agencer +agile +agiter +agrafer +agreÌable +agrume +aider +aiguille +ailier +aimable +aisance +ajouter +ajuster +alarmer +alchimie +alerte +algeÌ€bre +algue +alieÌner +aliment +alleÌger +alliage +allouer +allumer +alourdir +alpaga +altesse +alveÌole +amateur +ambigu +ambre +ameÌnager +amertume +amidon +amiral +amorcer +amour +amovible +amphibie +ampleur +amusant +analyse +anaphore +anarchie +anatomie +ancien +aneÌantir +angle +angoisse +anguleux +animal +annexer +annonce +annuel +anodin +anomalie +anonyme +anormal +antenne +antidote +anxieux +apaiser +apeÌritif +aplanir +apologie +appareil +appeler +apporter +appuyer +aquarium +aqueduc +arbitre +arbuste +ardeur +ardoise +argent +arlequin +armature +armement +armoire +armure +arpenter +arracher +arriver +arroser +arsenic +arteÌriel +article +aspect +asphalte +aspirer +assaut +asservir +assiette +associer +assurer +asticot +astre +astuce +atelier +atome +atrium +atroce +attaque +attentif +attirer +attraper +aubaine +auberge +audace +audible +augurer +aurore +automne +autruche +avaler +avancer +avarice +avenir +averse +aveugle +aviateur +avide +avion +aviser +avoine +avouer +avril +axial +axiome +badge +bafouer +bagage +baguette +baignade +balancer +balcon +baleine +balisage +bambin +bancaire +bandage +banlieue +bannieÌ€re +banquier +barbier +baril +baron +barque +barrage +bassin +bastion +bataille +bateau +batterie +baudrier +bavarder +belette +beÌlier +belote +beÌneÌfice +berceau +berger +berline +bermuda +besace +besogne +beÌtail +beurre +biberon +bicycle +bidule +bijou +bilan +bilingue +billard +binaire +biologie +biopsie +biotype +biscuit +bison +bistouri +bitume +bizarre +blafard +blague +blanchir +blessant +blinder +blond +bloquer +blouson +bobard +bobine +boire +boiser +bolide +bonbon +bondir +bonheur +bonifier +bonus +bordure +borne +botte +boucle +boueux +bougie +boulon +bouquin +bourse +boussole +boutique +boxeur +branche +brasier +brave +brebis +breÌ€che +breuvage +bricoler +brigade +brillant +brioche +brique +brochure +broder +bronzer +brousse +broyeur +brume +brusque +brutal +bruyant +buffle +buisson +bulletin +bureau +burin +bustier +butiner +butoir +buvable +buvette +cabanon +cabine +cachette +cadeau +cadre +cafeÌine +caillou +caisson +calculer +calepin +calibre +calmer +calomnie +calvaire +camarade +cameÌra +camion +campagne +canal +caneton +canon +cantine +canular +capable +caporal +caprice +capsule +capter +capuche +carabine +carbone +caresser +caribou +carnage +carotte +carreau +carton +cascade +casier +casque +cassure +causer +caution +cavalier +caverne +caviar +ceÌdille +ceinture +ceÌleste +cellule +cendrier +censurer +central +cercle +ceÌreÌbral +cerise +cerner +cerveau +cesser +chagrin +chaise +chaleur +chambre +chance +chapitre +charbon +chasseur +chaton +chausson +chavirer +chemise +chenille +cheÌquier +chercher +cheval +chien +chiffre +chignon +chimeÌ€re +chiot +chlorure +chocolat +choisir +chose +chouette +chrome +chute +cigare +cigogne +cimenter +cineÌma +cintrer +circuler +cirer +cirque +citerne +citoyen +citron +civil +clairon +clameur +claquer +classe +clavier +client +cligner +climat +clivage +cloche +clonage +cloporte +cobalt +cobra +cocasse +cocotier +coder +codifier +coffre +cogner +coheÌsion +coiffer +coincer +coleÌ€re +colibri +colline +colmater +colonel +combat +comeÌdie +commande +compact +concert +conduire +confier +congeler +connoter +consonne +contact +convexe +copain +copie +corail +corbeau +cordage +corniche +corpus +correct +corteÌ€ge +cosmique +costume +coton +coude +coupure +courage +couteau +couvrir +coyote +crabe +crainte +cravate +crayon +creÌature +creÌditer +creÌmeux +creuser +crevette +cribler +crier +cristal +criteÌ€re +croire +croquer +crotale +crucial +cruel +crypter +cubique +cueillir +cuilleÌ€re +cuisine +cuivre +culminer +cultiver +cumuler +cupide +curatif +curseur +cyanure +cycle +cylindre +cynique +daigner +damier +danger +danseur +dauphin +deÌbattre +deÌbiter +deÌborder +deÌbrider +deÌbutant +deÌcaler +deÌcembre +deÌchirer +deÌcider +deÌclarer +deÌcorer +deÌcrire +deÌcupler +deÌdale +deÌductif +deÌesse +deÌfensif +deÌfiler +deÌfrayer +deÌgager +deÌgivrer +deÌglutir +deÌgrafer +deÌjeuner +deÌlice +deÌloger +demander +demeurer +deÌmolir +deÌnicher +deÌnouer +dentelle +deÌnuder +deÌpart +deÌpenser +deÌphaser +deÌplacer +deÌposer +deÌranger +deÌrober +deÌsastre +descente +deÌsert +deÌsigner +deÌsobeÌir +dessiner +destrier +deÌtacher +deÌtester +deÌtourer +deÌtresse +devancer +devenir +deviner +devoir +diable +dialogue +diamant +dicter +diffeÌrer +digeÌrer +digital +digne +diluer +dimanche +diminuer +dioxyde +directif +diriger +discuter +disposer +dissiper +distance +divertir +diviser +docile +docteur +dogme +doigt +domaine +domicile +dompter +donateur +donjon +donner +dopamine +dortoir +dorure +dosage +doseur +dossier +dotation +douanier +double +douceur +douter +doyen +dragon +draper +dresser +dribbler +droiture +duperie +duplexe +durable +durcir +dynastie +eÌblouir +eÌcarter +eÌcharpe +eÌchelle +eÌclairer +eÌclipse +eÌclore +eÌcluse +eÌcole +eÌconomie +eÌcorce +eÌcouter +eÌcraser +eÌcreÌmer +eÌcrivain +eÌcrou +eÌcume +eÌcureuil +eÌdifier +eÌduquer +effacer +effectif +effigie +effort +effrayer +effusion +eÌgaliser +eÌgarer +eÌjecter +eÌlaborer +eÌlargir +eÌlectron +eÌleÌgant +eÌleÌphant +eÌleÌ€ve +eÌligible +eÌlitisme +eÌloge +eÌlucider +eÌluder +emballer +embellir +embryon +eÌmeraude +eÌmission +emmener +eÌmotion +eÌmouvoir +empereur +employer +emporter +emprise +eÌmulsion +encadrer +encheÌ€re +enclave +encoche +endiguer +endosser +endroit +enduire +eÌnergie +enfance +enfermer +enfouir +engager +engin +englober +eÌnigme +enjamber +enjeu +enlever +ennemi +ennuyeux +enrichir +enrobage +enseigne +entasser +entendre +entier +entourer +entraver +eÌnumeÌrer +envahir +enviable +envoyer +enzyme +eÌolien +eÌpaissir +eÌpargne +eÌpatant +eÌpaule +eÌpicerie +eÌpideÌmie +eÌpier +eÌpilogue +eÌpine +eÌpisode +eÌpitaphe +eÌpoque +eÌpreuve +eÌprouver +eÌpuisant +eÌquerre +eÌquipe +eÌriger +eÌrosion +erreur +eÌruption +escalier +espadon +espeÌ€ce +espieÌ€gle +espoir +esprit +esquiver +essayer +essence +essieu +essorer +estime +estomac +estrade +eÌtageÌ€re +eÌtaler +eÌtanche +eÌtatique +eÌteindre +eÌtendoir +eÌternel +eÌthanol +eÌthique +ethnie +eÌtirer +eÌtoffer +eÌtoile +eÌtonnant +eÌtourdir +eÌtrange +eÌtroit +eÌtude +euphorie +eÌvaluer +eÌvasion +eÌventail +eÌvidence +eÌviter +eÌvolutif +eÌvoquer +exact +exageÌrer +exaucer +exceller +excitant +exclusif +excuse +exeÌcuter +exemple +exercer +exhaler +exhorter +exigence +exiler +exister +exotique +expeÌdier +explorer +exposer +exprimer +exquis +extensif +extraire +exulter +fable +fabuleux +facette +facile +facture +faiblir +falaise +fameux +famille +farceur +farfelu +farine +farouche +fasciner +fatal +fatigue +faucon +fautif +faveur +favori +feÌbrile +feÌconder +feÌdeÌrer +feÌlin +femme +feÌmur +fendoir +feÌodal +fermer +feÌroce +ferveur +festival +feuille +feutre +feÌvrier +fiasco +ficeler +fictif +fideÌ€le +figure +filature +filetage +filieÌ€re +filleul +filmer +filou +filtrer +financer +finir +fiole +firme +fissure +fixer +flairer +flamme +flasque +flatteur +fleÌau +fleÌ€che +fleur +flexion +flocon +flore +fluctuer +fluide +fluvial +folie +fonderie +fongible +fontaine +forcer +forgeron +formuler +fortune +fossile +foudre +fougeÌ€re +fouiller +foulure +fourmi +fragile +fraise +franchir +frapper +frayeur +freÌgate +freiner +frelon +freÌmir +freÌneÌsie +freÌ€re +friable +friction +frisson +frivole +froid +fromage +frontal +frotter +fruit +fugitif +fuite +fureur +furieux +furtif +fusion +futur +gagner +galaxie +galerie +gambader +garantir +gardien +garnir +garrigue +gazelle +gazon +geÌant +geÌlatine +geÌlule +gendarme +geÌneÌral +geÌnie +genou +gentil +geÌologie +geÌomeÌ€tre +geÌranium +germe +gestuel +geyser +gibier +gicler +girafe +givre +glace +glaive +glisser +globe +gloire +glorieux +golfeur +gomme +gonfler +gorge +gorille +goudron +gouffre +goulot +goupille +gourmand +goutte +graduel +graffiti +graine +grand +grappin +gratuit +gravir +grenat +griffure +griller +grimper +grogner +gronder +grotte +groupe +gruger +grutier +gruyeÌ€re +gueÌpard +guerrier +guide +guimauve +guitare +gustatif +gymnaste +gyrostat +habitude +hachoir +halte +hameau +hangar +hanneton +haricot +harmonie +harpon +hasard +heÌlium +heÌmatome +herbe +heÌrisson +hermine +heÌron +heÌsiter +heureux +hiberner +hibou +hilarant +histoire +hiver +homard +hommage +homogeÌ€ne +honneur +honorer +honteux +horde +horizon +horloge +hormone +horrible +houleux +housse +hublot +huileux +humain +humble +humide +humour +hurler +hydromel +hygieÌ€ne +hymne +hypnose +idylle +ignorer +iguane +illicite +illusion +image +imbiber +imiter +immense +immobile +immuable +impact +impeÌrial +implorer +imposer +imprimer +imputer +incarner +incendie +incident +incliner +incolore +indexer +indice +inductif +ineÌdit +ineptie +inexact +infini +infliger +informer +infusion +ingeÌrer +inhaler +inhiber +injecter +injure +innocent +inoculer +inonder +inscrire +insecte +insigne +insolite +inspirer +instinct +insulter +intact +intense +intime +intrigue +intuitif +inutile +invasion +inventer +inviter +invoquer +ironique +irradier +irreÌel +irriter +isoler +ivoire +ivresse +jaguar +jaillir +jambe +janvier +jardin +jauger +jaune +javelot +jetable +jeton +jeudi +jeunesse +joindre +joncher +jongler +joueur +jouissif +journal +jovial +joyau +joyeux +jubiler +jugement +junior +jupon +juriste +justice +juteux +juveÌnile +kayak +kimono +kiosque +label +labial +labourer +laceÌrer +lactose +lagune +laine +laisser +laitier +lambeau +lamelle +lampe +lanceur +langage +lanterne +lapin +largeur +larme +laurier +lavabo +lavoir +lecture +leÌgal +leÌger +leÌgume +lessive +lettre +levier +lexique +leÌzard +liasse +libeÌrer +libre +licence +licorne +lieÌ€ge +lieÌ€vre +ligature +ligoter +ligue +limer +limite +limonade +limpide +lineÌaire +lingot +lionceau +liquide +lisieÌ€re +lister +lithium +litige +littoral +livreur +logique +lointain +loisir +lombric +loterie +louer +lourd +loutre +louve +loyal +lubie +lucide +lucratif +lueur +lugubre +luisant +lumieÌ€re +lunaire +lundi +luron +lutter +luxueux +machine +magasin +magenta +magique +maigre +maillon +maintien +mairie +maison +majorer +malaxer +maleÌfice +malheur +malice +mallette +mammouth +mandater +maniable +manquant +manteau +manuel +marathon +marbre +marchand +mardi +maritime +marqueur +marron +marteler +mascotte +massif +mateÌriel +matieÌ€re +matraque +maudire +maussade +mauve +maximal +meÌchant +meÌconnu +meÌdaille +meÌdecin +meÌditer +meÌduse +meilleur +meÌlange +meÌlodie +membre +meÌmoire +menacer +mener +menhir +mensonge +mentor +mercredi +meÌrite +merle +messager +mesure +meÌtal +meÌteÌore +meÌthode +meÌtier +meuble +miauler +microbe +miette +mignon +migrer +milieu +million +mimique +mince +mineÌral +minimal +minorer +minute +miracle +miroiter +missile +mixte +mobile +moderne +moelleux +mondial +moniteur +monnaie +monotone +monstre +montagne +monument +moqueur +morceau +morsure +mortier +moteur +motif +mouche +moufle +moulin +mousson +mouton +mouvant +multiple +munition +muraille +mureÌ€ne +murmure +muscle +museÌum +musicien +mutation +muter +mutuel +myriade +myrtille +mysteÌ€re +mythique +nageur +nappe +narquois +narrer +natation +nation +nature +naufrage +nautique +navire +neÌbuleux +nectar +neÌfaste +neÌgation +neÌgliger +neÌgocier +neige +nerveux +nettoyer +neurone +neutron +neveu +niche +nickel +nitrate +niveau +noble +nocif +nocturne +noirceur +noisette +nomade +nombreux +nommer +normatif +notable +notifier +notoire +nourrir +nouveau +novateur +novembre +novice +nuage +nuancer +nuire +nuisible +numeÌro +nuptial +nuque +nutritif +obeÌir +objectif +obliger +obscur +observer +obstacle +obtenir +obturer +occasion +occuper +oceÌan +octobre +octroyer +octupler +oculaire +odeur +odorant +offenser +officier +offrir +ogive +oiseau +oisillon +olfactif +olivier +ombrage +omettre +onctueux +onduler +oneÌreux +onirique +opale +opaque +opeÌrer +opinion +opportun +opprimer +opter +optique +orageux +orange +orbite +ordonner +oreille +organe +orgueil +orifice +ornement +orque +ortie +osciller +osmose +ossature +otarie +ouragan +ourson +outil +outrager +ouvrage +ovation +oxyde +oxygeÌ€ne +ozone +paisible +palace +palmareÌ€s +palourde +palper +panache +panda +pangolin +paniquer +panneau +panorama +pantalon +papaye +papier +papoter +papyrus +paradoxe +parcelle +paresse +parfumer +parler +parole +parrain +parsemer +partager +parure +parvenir +passion +pasteÌ€que +paternel +patience +patron +pavillon +pavoiser +payer +paysage +peigne +peintre +pelage +peÌlican +pelle +pelouse +peluche +pendule +peÌneÌtrer +peÌnible +pensif +peÌnurie +peÌpite +peÌplum +perdrix +perforer +peÌriode +permuter +perplexe +persil +perte +peser +peÌtale +petit +peÌtrir +peuple +pharaon +phobie +phoque +photon +phrase +physique +piano +pictural +pieÌ€ce +pierre +pieuvre +pilote +pinceau +pipette +piquer +pirogue +piscine +piston +pivoter +pixel +pizza +placard +plafond +plaisir +planer +plaque +plastron +plateau +pleurer +plexus +pliage +plomb +plonger +pluie +plumage +pochette +poeÌsie +poeÌ€te +pointe +poirier +poisson +poivre +polaire +policier +pollen +polygone +pommade +pompier +ponctuel +pondeÌrer +poney +portique +position +posseÌder +posture +potager +poteau +potion +pouce +poulain +poumon +pourpre +poussin +pouvoir +prairie +pratique +preÌcieux +preÌdire +preÌfixe +preÌlude +preÌnom +preÌsence +preÌtexte +preÌvoir +primitif +prince +prison +priver +probleÌ€me +proceÌder +prodige +profond +progreÌ€s +proie +projeter +prologue +promener +propre +prospeÌ€re +proteÌger +prouesse +proverbe +prudence +pruneau +psychose +public +puceron +puiser +pulpe +pulsar +punaise +punitif +pupitre +purifier +puzzle +pyramide +quasar +querelle +question +quieÌtude +quitter +quotient +racine +raconter +radieux +ragondin +raideur +raisin +ralentir +rallonge +ramasser +rapide +rasage +ratisser +ravager +ravin +rayonner +reÌactif +reÌagir +reÌaliser +reÌanimer +recevoir +reÌciter +reÌclamer +reÌcolter +recruter +reculer +recycler +reÌdiger +redouter +refaire +reÌflexe +reÌformer +refrain +refuge +reÌgalien +reÌgion +reÌglage +reÌgulier +reÌiteÌrer +rejeter +rejouer +relatif +relever +relief +remarque +remeÌ€de +remise +remonter +remplir +remuer +renard +renfort +renifler +renoncer +rentrer +renvoi +replier +reporter +reprise +reptile +requin +reÌserve +reÌsineux +reÌsoudre +respect +rester +reÌsultat +reÌtablir +retenir +reÌticule +retomber +retracer +reÌunion +reÌussir +revanche +revivre +reÌvolte +reÌvulsif +richesse +rideau +rieur +rigide +rigoler +rincer +riposter +risible +risque +rituel +rival +rivieÌ€re +rocheux +romance +rompre +ronce +rondin +roseau +rosier +rotatif +rotor +rotule +rouge +rouille +rouleau +routine +royaume +ruban +rubis +ruche +ruelle +rugueux +ruiner +ruisseau +ruser +rustique +rythme +sabler +saboter +sabre +sacoche +safari +sagesse +saisir +salade +salive +salon +saluer +samedi +sanction +sanglier +sarcasme +sardine +saturer +saugrenu +saumon +sauter +sauvage +savant +savonner +scalpel +scandale +sceÌleÌrat +sceÌnario +sceptre +scheÌma +science +scinder +score +scrutin +sculpter +seÌance +seÌcable +seÌcher +secouer +seÌcreÌter +seÌdatif +seÌduire +seigneur +seÌjour +seÌlectif +semaine +sembler +semence +seÌminal +seÌnateur +sensible +sentence +seÌparer +seÌquence +serein +sergent +seÌrieux +serrure +seÌrum +service +seÌsame +seÌvir +sevrage +sextuple +sideÌral +sieÌ€cle +sieÌger +siffler +sigle +signal +silence +silicium +simple +sinceÌ€re +sinistre +siphon +sirop +sismique +situer +skier +social +socle +sodium +soigneux +soldat +soleil +solitude +soluble +sombre +sommeil +somnoler +sonde +songeur +sonnette +sonore +sorcier +sortir +sosie +sottise +soucieux +soudure +souffle +soulever +soupape +source +soutirer +souvenir +spacieux +spatial +speÌcial +spheÌ€re +spiral +stable +station +sternum +stimulus +stipuler +strict +studieux +stupeur +styliste +sublime +substrat +subtil +subvenir +succeÌ€s +sucre +suffixe +suggeÌrer +suiveur +sulfate +superbe +supplier +surface +suricate +surmener +surprise +sursaut +survie +suspect +syllabe +symbole +symeÌtrie +synapse +syntaxe +systeÌ€me +tabac +tablier +tactile +tailler +talent +talisman +talonner +tambour +tamiser +tangible +tapis +taquiner +tarder +tarif +tartine +tasse +tatami +tatouage +taupe +taureau +taxer +teÌmoin +temporel +tenaille +tendre +teneur +tenir +tension +terminer +terne +terrible +teÌtine +texte +theÌ€me +theÌorie +theÌrapie +thorax +tibia +tieÌ€de +timide +tirelire +tiroir +tissu +titane +titre +tituber +toboggan +toleÌrant +tomate +tonique +tonneau +toponyme +torche +tordre +tornade +torpille +torrent +torse +tortue +totem +toucher +tournage +tousser +toxine +traction +trafic +tragique +trahir +train +trancher +travail +treÌ€fle +tremper +treÌsor +treuil +triage +tribunal +tricoter +trilogie +triomphe +tripler +triturer +trivial +trombone +tronc +tropical +troupeau +tuile +tulipe +tumulte +tunnel +turbine +tuteur +tutoyer +tuyau +tympan +typhon +typique +tyran +ubuesque +ultime +ultrason +unanime +unifier +union +unique +unitaire +univers +uranium +urbain +urticant +usage +usine +usuel +usure +utile +utopie +vacarme +vaccin +vagabond +vague +vaillant +vaincre +vaisseau +valable +valise +vallon +valve +vampire +vanille +vapeur +varier +vaseux +vassal +vaste +vecteur +vedette +veÌgeÌtal +veÌhicule +veinard +veÌloce +vendredi +veÌneÌrer +venger +venimeux +ventouse +verdure +veÌrin +vernir +verrou +verser +vertu +veston +veÌteÌran +veÌtuste +vexant +vexer +viaduc +viande +victoire +vidange +videÌo +vignette +vigueur +vilain +village +vinaigre +violon +vipeÌ€re +virement +virtuose +virus +visage +viseur +vision +visqueux +visuel +vital +vitesse +viticole +vitrine +vivace +vivipare +vocation +voguer +voile +voisin +voiture +volaille +volcan +voltiger +volume +vorace +vortex +voter +vouloir +voyage +voyelle +wagon +xeÌnon +yacht +zeÌ€bre +zeÌnith +zeste +zoologie +` diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/wordlists/italian.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/wordlists/italian.go new file mode 100644 index 00000000..32cd2cf6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/wordlists/italian.go @@ -0,0 +1,2071 @@ +package wordlists + +import ( + "fmt" + "hash/crc32" + "strings" +) + +func init() { + // Ensure word list is correct + // $ wget https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/italian.txt + // $ crc32 italian.txt + // 2fc7d07e + checksum := crc32.ChecksumIEEE([]byte(italian)) + if fmt.Sprintf("%x", checksum) != "2fc7d07e" { + panic("italian checksum invalid") + } +} + +// Italian is a slice of mnemonic words taken from the bip39 specification +// https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/italian.txt +var Italian = strings.Split(strings.TrimSpace(italian), "\n") +var italian = `abaco +abbaglio +abbinato +abete +abisso +abolire +abrasivo +abrogato +accadere +accenno +accusato +acetone +achille +acido +acqua +acre +acrilico +acrobata +acuto +adagio +addebito +addome +adeguato +aderire +adipe +adottare +adulare +affabile +affetto +affisso +affranto +aforisma +afoso +africano +agave +agente +agevole +aggancio +agire +agitare +agonismo +agricolo +agrumeto +aguzzo +alabarda +alato +albatro +alberato +albo +albume +alce +alcolico +alettone +alfa +algebra +aliante +alibi +alimento +allagato +allegro +allievo +allodola +allusivo +almeno +alogeno +alpaca +alpestre +altalena +alterno +alticcio +altrove +alunno +alveolo +alzare +amalgama +amanita +amarena +ambito +ambrato +ameba +america +ametista +amico +ammasso +ammenda +ammirare +ammonito +amore +ampio +ampliare +amuleto +anacardo +anagrafe +analista +anarchia +anatra +anca +ancella +ancora +andare +andrea +anello +angelo +angolare +angusto +anima +annegare +annidato +anno +annuncio +anonimo +anticipo +anzi +apatico +apertura +apode +apparire +appetito +appoggio +approdo +appunto +aprile +arabica +arachide +aragosta +araldica +arancio +aratura +arazzo +arbitro +archivio +ardito +arenile +argento +argine +arguto +aria +armonia +arnese +arredato +arringa +arrosto +arsenico +arso +artefice +arzillo +asciutto +ascolto +asepsi +asettico +asfalto +asino +asola +aspirato +aspro +assaggio +asse +assoluto +assurdo +asta +astenuto +astice +astratto +atavico +ateismo +atomico +atono +attesa +attivare +attorno +attrito +attuale +ausilio +austria +autista +autonomo +autunno +avanzato +avere +avvenire +avviso +avvolgere +azione +azoto +azzimo +azzurro +babele +baccano +bacino +baco +badessa +badilata +bagnato +baita +balcone +baldo +balena +ballata +balzano +bambino +bandire +baraonda +barbaro +barca +baritono +barlume +barocco +basilico +basso +batosta +battuto +baule +bava +bavosa +becco +beffa +belgio +belva +benda +benevole +benigno +benzina +bere +berlina +beta +bibita +bici +bidone +bifido +biga +bilancia +bimbo +binocolo +biologo +bipede +bipolare +birbante +birra +biscotto +bisesto +bisnonno +bisonte +bisturi +bizzarro +blando +blatta +bollito +bonifico +bordo +bosco +botanico +bottino +bozzolo +braccio +bradipo +brama +branca +bravura +bretella +brevetto +brezza +briglia +brillante +brindare +broccolo +brodo +bronzina +brullo +bruno +bubbone +buca +budino +buffone +buio +bulbo +buono +burlone +burrasca +bussola +busta +cadetto +caduco +calamaro +calcolo +calesse +calibro +calmo +caloria +cambusa +camerata +camicia +cammino +camola +campale +canapa +candela +cane +canino +canotto +cantina +capace +capello +capitolo +capogiro +cappero +capra +capsula +carapace +carcassa +cardo +carisma +carovana +carretto +cartolina +casaccio +cascata +caserma +caso +cassone +castello +casuale +catasta +catena +catrame +cauto +cavillo +cedibile +cedrata +cefalo +celebre +cellulare +cena +cenone +centesimo +ceramica +cercare +certo +cerume +cervello +cesoia +cespo +ceto +chela +chiaro +chicca +chiedere +chimera +china +chirurgo +chitarra +ciao +ciclismo +cifrare +cigno +cilindro +ciottolo +circa +cirrosi +citrico +cittadino +ciuffo +civetta +civile +classico +clinica +cloro +cocco +codardo +codice +coerente +cognome +collare +colmato +colore +colposo +coltivato +colza +coma +cometa +commando +comodo +computer +comune +conciso +condurre +conferma +congelare +coniuge +connesso +conoscere +consumo +continuo +convegno +coperto +copione +coppia +copricapo +corazza +cordata +coricato +cornice +corolla +corpo +corredo +corsia +cortese +cosmico +costante +cottura +covato +cratere +cravatta +creato +credere +cremoso +crescita +creta +criceto +crinale +crisi +critico +croce +cronaca +crostata +cruciale +crusca +cucire +cuculo +cugino +cullato +cupola +curatore +cursore +curvo +cuscino +custode +dado +daino +dalmata +damerino +daniela +dannoso +danzare +datato +davanti +davvero +debutto +decennio +deciso +declino +decollo +decreto +dedicato +definito +deforme +degno +delegare +delfino +delirio +delta +demenza +denotato +dentro +deposito +derapata +derivare +deroga +descritto +deserto +desiderio +desumere +detersivo +devoto +diametro +dicembre +diedro +difeso +diffuso +digerire +digitale +diluvio +dinamico +dinnanzi +dipinto +diploma +dipolo +diradare +dire +dirotto +dirupo +disagio +discreto +disfare +disgelo +disposto +distanza +disumano +dito +divano +divelto +dividere +divorato +doblone +docente +doganale +dogma +dolce +domato +domenica +dominare +dondolo +dono +dormire +dote +dottore +dovuto +dozzina +drago +druido +dubbio +dubitare +ducale +duna +duomo +duplice +duraturo +ebano +eccesso +ecco +eclissi +economia +edera +edicola +edile +editoria +educare +egemonia +egli +egoismo +egregio +elaborato +elargire +elegante +elencato +eletto +elevare +elfico +elica +elmo +elsa +eluso +emanato +emblema +emesso +emiro +emotivo +emozione +empirico +emulo +endemico +enduro +energia +enfasi +enoteca +entrare +enzima +epatite +epilogo +episodio +epocale +eppure +equatore +erario +erba +erboso +erede +eremita +erigere +ermetico +eroe +erosivo +errante +esagono +esame +esanime +esaudire +esca +esempio +esercito +esibito +esigente +esistere +esito +esofago +esortato +esoso +espanso +espresso +essenza +esso +esteso +estimare +estonia +estroso +esultare +etilico +etnico +etrusco +etto +euclideo +europa +evaso +evidenza +evitato +evoluto +evviva +fabbrica +faccenda +fachiro +falco +famiglia +fanale +fanfara +fango +fantasma +fare +farfalla +farinoso +farmaco +fascia +fastoso +fasullo +faticare +fato +favoloso +febbre +fecola +fede +fegato +felpa +feltro +femmina +fendere +fenomeno +fermento +ferro +fertile +fessura +festivo +fetta +feudo +fiaba +fiducia +fifa +figurato +filo +finanza +finestra +finire +fiore +fiscale +fisico +fiume +flacone +flamenco +flebo +flemma +florido +fluente +fluoro +fobico +focaccia +focoso +foderato +foglio +folata +folclore +folgore +fondente +fonetico +fonia +fontana +forbito +forchetta +foresta +formica +fornaio +foro +fortezza +forzare +fosfato +fosso +fracasso +frana +frassino +fratello +freccetta +frenata +fresco +frigo +frollino +fronde +frugale +frutta +fucilata +fucsia +fuggente +fulmine +fulvo +fumante +fumetto +fumoso +fune +funzione +fuoco +furbo +furgone +furore +fuso +futile +gabbiano +gaffe +galateo +gallina +galoppo +gambero +gamma +garanzia +garbo +garofano +garzone +gasdotto +gasolio +gastrico +gatto +gaudio +gazebo +gazzella +geco +gelatina +gelso +gemello +gemmato +gene +genitore +gennaio +genotipo +gergo +ghepardo +ghiaccio +ghisa +giallo +gilda +ginepro +giocare +gioiello +giorno +giove +girato +girone +gittata +giudizio +giurato +giusto +globulo +glutine +gnomo +gobba +golf +gomito +gommone +gonfio +gonna +governo +gracile +grado +grafico +grammo +grande +grattare +gravoso +grazia +greca +gregge +grifone +grigio +grinza +grotta +gruppo +guadagno +guaio +guanto +guardare +gufo +guidare +ibernato +icona +identico +idillio +idolo +idra +idrico +idrogeno +igiene +ignaro +ignorato +ilare +illeso +illogico +illudere +imballo +imbevuto +imbocco +imbuto +immane +immerso +immolato +impacco +impeto +impiego +importo +impronta +inalare +inarcare +inattivo +incanto +incendio +inchino +incisivo +incluso +incontro +incrocio +incubo +indagine +india +indole +inedito +infatti +infilare +inflitto +ingaggio +ingegno +inglese +ingordo +ingrosso +innesco +inodore +inoltrare +inondato +insano +insetto +insieme +insonnia +insulina +intasato +intero +intonaco +intuito +inumidire +invalido +invece +invito +iperbole +ipnotico +ipotesi +ippica +iride +irlanda +ironico +irrigato +irrorare +isolato +isotopo +isterico +istituto +istrice +italia +iterare +labbro +labirinto +lacca +lacerato +lacrima +lacuna +laddove +lago +lampo +lancetta +lanterna +lardoso +larga +laringe +lastra +latenza +latino +lattuga +lavagna +lavoro +legale +leggero +lembo +lentezza +lenza +leone +lepre +lesivo +lessato +lesto +letterale +leva +levigato +libero +lido +lievito +lilla +limatura +limitare +limpido +lineare +lingua +liquido +lira +lirica +lisca +lite +litigio +livrea +locanda +lode +logica +lombare +londra +longevo +loquace +lorenzo +loto +lotteria +luce +lucidato +lumaca +luminoso +lungo +lupo +luppolo +lusinga +lusso +lutto +macabro +macchina +macero +macinato +madama +magico +maglia +magnete +magro +maiolica +malafede +malgrado +malinteso +malsano +malto +malumore +mana +mancia +mandorla +mangiare +manifesto +mannaro +manovra +mansarda +mantide +manubrio +mappa +maratona +marcire +maretta +marmo +marsupio +maschera +massaia +mastino +materasso +matricola +mattone +maturo +mazurca +meandro +meccanico +mecenate +medesimo +meditare +mega +melassa +melis +melodia +meninge +meno +mensola +mercurio +merenda +merlo +meschino +mese +messere +mestolo +metallo +metodo +mettere +miagolare +mica +micelio +michele +microbo +midollo +miele +migliore +milano +milite +mimosa +minerale +mini +minore +mirino +mirtillo +miscela +missiva +misto +misurare +mitezza +mitigare +mitra +mittente +mnemonico +modello +modifica +modulo +mogano +mogio +mole +molosso +monastero +monco +mondina +monetario +monile +monotono +monsone +montato +monviso +mora +mordere +morsicato +mostro +motivato +motosega +motto +movenza +movimento +mozzo +mucca +mucosa +muffa +mughetto +mugnaio +mulatto +mulinello +multiplo +mummia +munto +muovere +murale +musa +muscolo +musica +mutevole +muto +nababbo +nafta +nanometro +narciso +narice +narrato +nascere +nastrare +naturale +nautica +naviglio +nebulosa +necrosi +negativo +negozio +nemmeno +neofita +neretto +nervo +nessuno +nettuno +neutrale +neve +nevrotico +nicchia +ninfa +nitido +nobile +nocivo +nodo +nome +nomina +nordico +normale +norvegese +nostrano +notare +notizia +notturno +novella +nucleo +nulla +numero +nuovo +nutrire +nuvola +nuziale +oasi +obbedire +obbligo +obelisco +oblio +obolo +obsoleto +occasione +occhio +occidente +occorrere +occultare +ocra +oculato +odierno +odorare +offerta +offrire +offuscato +oggetto +oggi +ognuno +olandese +olfatto +oliato +oliva +ologramma +oltre +omaggio +ombelico +ombra +omega +omissione +ondoso +onere +onice +onnivoro +onorevole +onta +operato +opinione +opposto +oracolo +orafo +ordine +orecchino +orefice +orfano +organico +origine +orizzonte +orma +ormeggio +ornativo +orologio +orrendo +orribile +ortensia +ortica +orzata +orzo +osare +oscurare +osmosi +ospedale +ospite +ossa +ossidare +ostacolo +oste +otite +otre +ottagono +ottimo +ottobre +ovale +ovest +ovino +oviparo +ovocito +ovunque +ovviare +ozio +pacchetto +pace +pacifico +padella +padrone +paese +paga +pagina +palazzina +palesare +pallido +palo +palude +pandoro +pannello +paolo +paonazzo +paprica +parabola +parcella +parere +pargolo +pari +parlato +parola +partire +parvenza +parziale +passivo +pasticca +patacca +patologia +pattume +pavone +peccato +pedalare +pedonale +peggio +peloso +penare +pendice +penisola +pennuto +penombra +pensare +pentola +pepe +pepita +perbene +percorso +perdonato +perforare +pergamena +periodo +permesso +perno +perplesso +persuaso +pertugio +pervaso +pesatore +pesista +peso +pestifero +petalo +pettine +petulante +pezzo +piacere +pianta +piattino +piccino +picozza +piega +pietra +piffero +pigiama +pigolio +pigro +pila +pilifero +pillola +pilota +pimpante +pineta +pinna +pinolo +pioggia +piombo +piramide +piretico +pirite +pirolisi +pitone +pizzico +placebo +planare +plasma +platano +plenario +pochezza +poderoso +podismo +poesia +poggiare +polenta +poligono +pollice +polmonite +polpetta +polso +poltrona +polvere +pomice +pomodoro +ponte +popoloso +porfido +poroso +porpora +porre +portata +posa +positivo +possesso +postulato +potassio +potere +pranzo +prassi +pratica +precluso +predica +prefisso +pregiato +prelievo +premere +prenotare +preparato +presenza +pretesto +prevalso +prima +principe +privato +problema +procura +produrre +profumo +progetto +prolunga +promessa +pronome +proposta +proroga +proteso +prova +prudente +prugna +prurito +psiche +pubblico +pudica +pugilato +pugno +pulce +pulito +pulsante +puntare +pupazzo +pupilla +puro +quadro +qualcosa +quasi +querela +quota +raccolto +raddoppio +radicale +radunato +raffica +ragazzo +ragione +ragno +ramarro +ramingo +ramo +randagio +rantolare +rapato +rapina +rappreso +rasatura +raschiato +rasente +rassegna +rastrello +rata +ravveduto +reale +recepire +recinto +recluta +recondito +recupero +reddito +redimere +regalato +registro +regola +regresso +relazione +remare +remoto +renna +replica +reprimere +reputare +resa +residente +responso +restauro +rete +retina +retorica +rettifica +revocato +riassunto +ribadire +ribelle +ribrezzo +ricarica +ricco +ricevere +riciclato +ricordo +ricreduto +ridicolo +ridurre +rifasare +riflesso +riforma +rifugio +rigare +rigettato +righello +rilassato +rilevato +rimanere +rimbalzo +rimedio +rimorchio +rinascita +rincaro +rinforzo +rinnovo +rinomato +rinsavito +rintocco +rinuncia +rinvenire +riparato +ripetuto +ripieno +riportare +ripresa +ripulire +risata +rischio +riserva +risibile +riso +rispetto +ristoro +risultato +risvolto +ritardo +ritegno +ritmico +ritrovo +riunione +riva +riverso +rivincita +rivolto +rizoma +roba +robotico +robusto +roccia +roco +rodaggio +rodere +roditore +rogito +rollio +romantico +rompere +ronzio +rosolare +rospo +rotante +rotondo +rotula +rovescio +rubizzo +rubrica +ruga +rullino +rumine +rumoroso +ruolo +rupe +russare +rustico +sabato +sabbiare +sabotato +sagoma +salasso +saldatura +salgemma +salivare +salmone +salone +saltare +saluto +salvo +sapere +sapido +saporito +saraceno +sarcasmo +sarto +sassoso +satellite +satira +satollo +saturno +savana +savio +saziato +sbadiglio +sbalzo +sbancato +sbarra +sbattere +sbavare +sbendare +sbirciare +sbloccato +sbocciato +sbrinare +sbruffone +sbuffare +scabroso +scadenza +scala +scambiare +scandalo +scapola +scarso +scatenare +scavato +scelto +scenico +scettro +scheda +schiena +sciarpa +scienza +scindere +scippo +sciroppo +scivolo +sclerare +scodella +scolpito +scomparto +sconforto +scoprire +scorta +scossone +scozzese +scriba +scrollare +scrutinio +scuderia +scultore +scuola +scuro +scusare +sdebitare +sdoganare +seccatura +secondo +sedano +seggiola +segnalato +segregato +seguito +selciato +selettivo +sella +selvaggio +semaforo +sembrare +seme +seminato +sempre +senso +sentire +sepolto +sequenza +serata +serbato +sereno +serio +serpente +serraglio +servire +sestina +setola +settimana +sfacelo +sfaldare +sfamato +sfarzoso +sfaticato +sfera +sfida +sfilato +sfinge +sfocato +sfoderare +sfogo +sfoltire +sforzato +sfratto +sfruttato +sfuggito +sfumare +sfuso +sgabello +sgarbato +sgonfiare +sgorbio +sgrassato +sguardo +sibilo +siccome +sierra +sigla +signore +silenzio +sillaba +simbolo +simpatico +simulato +sinfonia +singolo +sinistro +sino +sintesi +sinusoide +sipario +sisma +sistole +situato +slitta +slogatura +sloveno +smarrito +smemorato +smentito +smeraldo +smilzo +smontare +smottato +smussato +snellire +snervato +snodo +sobbalzo +sobrio +soccorso +sociale +sodale +soffitto +sogno +soldato +solenne +solido +sollazzo +solo +solubile +solvente +somatico +somma +sonda +sonetto +sonnifero +sopire +soppeso +sopra +sorgere +sorpasso +sorriso +sorso +sorteggio +sorvolato +sospiro +sosta +sottile +spada +spalla +spargere +spatola +spavento +spazzola +specie +spedire +spegnere +spelatura +speranza +spessore +spettrale +spezzato +spia +spigoloso +spillato +spinoso +spirale +splendido +sportivo +sposo +spranga +sprecare +spronato +spruzzo +spuntino +squillo +sradicare +srotolato +stabile +stacco +staffa +stagnare +stampato +stantio +starnuto +stasera +statuto +stelo +steppa +sterzo +stiletto +stima +stirpe +stivale +stizzoso +stonato +storico +strappo +stregato +stridulo +strozzare +strutto +stuccare +stufo +stupendo +subentro +succoso +sudore +suggerito +sugo +sultano +suonare +superbo +supporto +surgelato +surrogato +sussurro +sutura +svagare +svedese +sveglio +svelare +svenuto +svezia +sviluppo +svista +svizzera +svolta +svuotare +tabacco +tabulato +tacciare +taciturno +tale +talismano +tampone +tannino +tara +tardivo +targato +tariffa +tarpare +tartaruga +tasto +tattico +taverna +tavolata +tazza +teca +tecnico +telefono +temerario +tempo +temuto +tendone +tenero +tensione +tentacolo +teorema +terme +terrazzo +terzetto +tesi +tesserato +testato +tetro +tettoia +tifare +tigella +timbro +tinto +tipico +tipografo +tiraggio +tiro +titanio +titolo +titubante +tizio +tizzone +toccare +tollerare +tolto +tombola +tomo +tonfo +tonsilla +topazio +topologia +toppa +torba +tornare +torrone +tortora +toscano +tossire +tostatura +totano +trabocco +trachea +trafila +tragedia +tralcio +tramonto +transito +trapano +trarre +trasloco +trattato +trave +treccia +tremolio +trespolo +tributo +tricheco +trifoglio +trillo +trincea +trio +tristezza +triturato +trivella +tromba +trono +troppo +trottola +trovare +truccato +tubatura +tuffato +tulipano +tumulto +tunisia +turbare +turchino +tuta +tutela +ubicato +uccello +uccisore +udire +uditivo +uffa +ufficio +uguale +ulisse +ultimato +umano +umile +umorismo +uncinetto +ungere +ungherese +unicorno +unificato +unisono +unitario +unte +uovo +upupa +uragano +urgenza +urlo +usanza +usato +uscito +usignolo +usuraio +utensile +utilizzo +utopia +vacante +vaccinato +vagabondo +vagliato +valanga +valgo +valico +valletta +valoroso +valutare +valvola +vampata +vangare +vanitoso +vano +vantaggio +vanvera +vapore +varano +varcato +variante +vasca +vedetta +vedova +veduto +vegetale +veicolo +velcro +velina +velluto +veloce +venato +vendemmia +vento +verace +verbale +vergogna +verifica +vero +verruca +verticale +vescica +vessillo +vestale +veterano +vetrina +vetusto +viandante +vibrante +vicenda +vichingo +vicinanza +vidimare +vigilia +vigneto +vigore +vile +villano +vimini +vincitore +viola +vipera +virgola +virologo +virulento +viscoso +visione +vispo +vissuto +visura +vita +vitello +vittima +vivanda +vivido +viziare +voce +voga +volatile +volere +volpe +voragine +vulcano +zampogna +zanna +zappato +zattera +zavorra +zefiro +zelante +zelo +zenzero +zerbino +zibetto +zinco +zircone +zitto +zolla +zotico +zucchero +zufolo +zulu +zuppa +` diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/wordlists/japanese.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/wordlists/japanese.go new file mode 100644 index 00000000..23a76a34 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/wordlists/japanese.go @@ -0,0 +1,2071 @@ +package wordlists + +import ( + "fmt" + "hash/crc32" + "strings" +) + +func init() { + // Ensure word list is correct + // $ wget https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/japanese.txt + // $ crc32 japanese.txt + // 0acc1419 + checksum := crc32.ChecksumIEEE([]byte(japanese)) + if fmt.Sprintf("%x", checksum) != "acc1419" { + panic(fmt.Sprintf("japanese checksum invalid: %x", checksum)) + } +} + +// Japanese is a slice of mnemonic words taken from the bip39 specification +// https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/japanese.txt +var Japanese = strings.Split(strings.TrimSpace(japanese), "\n") +var japanese = `ã‚ã„ã“ãã—ã‚“ +ã‚ã„ã•ã¤ +ã‚ã„ãŸã‚™ +ã‚ãŠã゙ら +ã‚ã‹ã¡ã‚ƒã‚“ +ã‚ãã‚‹ +ã‚ã‘ã‹ã‚™ãŸ +ã‚ã‘ã‚‹ +ã‚ã“ã‹ã‚™ã‚Œã‚‹ +ã‚ã•ã„ +ã‚ã•ã² +ã‚ã—ã‚㨠+ã‚ã—ã‚™ã‚ㆠ+ã‚ã™ã‚™ã‹ã‚‹ +ã‚ã™ã‚™ã +ã‚ããµã‚™ +ã‚ãŸãˆã‚‹ +ã‚ãŸãŸã‚ã‚‹ +ã‚ãŸã‚Šã¾ãˆ +ã‚ãŸã‚‹ +ã‚ã¤ã„ +ã‚ã¤ã‹ã† +ã‚ã£ã—ã‚…ã +ã‚ã¤ã¾ã‚Š +ã‚ã¤ã‚ã‚‹ +ã‚ã¦ãª +ã‚ã¦ã¯ã¾ã‚‹ +ã‚ã²ã‚‹ +ã‚ãµã‚™ã‚‰ +ã‚ãµã‚™ã‚‹ +ã‚ãµã‚Œã‚‹ +ã‚ã¾ã„ +ã‚ã¾ã¨ã‚™ +ã‚ã¾ã‚„ã‹ã™ +ã‚ã¾ã‚Š +ã‚ã¿ã‚‚ã® +ã‚ã‚ã‚Šã‹ +ã‚ã‚„ã¾ã‚‹ +ã‚ゆむ +ã‚らã„ã゙㾠+ã‚ら㗠+ã‚らã™ã—ã‚™ +ã‚らãŸã‚ã‚‹ +ã‚らゆる +ã‚らã‚ã™ +ã‚ã‚Šã‹ã‚™ã¨ã† +ã‚ã‚ã›ã‚‹ +ã‚ã‚ã¦ã‚‹ +ã‚ã‚“ã„ +ã‚ã‚“ã‹ã‚™ã„ +ã‚ã‚“ã“ +ã‚ã‚“ã›ã‚™ã‚“ +ã‚ã‚“ã¦ã„ +ã‚ã‚“ãªã„ +ã‚ã‚“ã¾ã‚Š +ã„ã„ãŸã‚™ã™ +ã„ãŠã‚“ +ã„ã‹ã‚™ã„ +ã„ã‹ã‚™ã +ã„ããŠã„ +ã„ããªã‚Š +ã„ãã‚‚ã® +ã„ãã‚‹ +ã„ãã—ã‚™ +ã„ããµã‚™ã‚“ +ã„ã‘ã¯ã‚™ãª +ã„ã‘ã‚“ +ã„ã“ㆠ+ã„ã“ã +ã„ã“㤠+ã„ã•ã¾ã—ã„ +ã„ã•ã‚“ +ã„ã—ã +ã„ã—゙ゅㆠ+ã„ã—゙ょㆠ+ã„ã—ã‚™ã‚ã‚‹ +ã„ã™ã‚™ã¿ +ã„ã™ã‚™ã‚Œ +ã„ã›ã„ +ã„ã›ãˆã²ã‚™ +ã„ã›ã‹ã„ +ã„ã›ã +ã„ã›ã‚™ã‚“ +ã„ãã†ã‚ㆠ+ã„ãã‹ã‚™ã—ã„ +ã„ãŸã‚™ã„ +ã„ãŸã‚™ã +ã„ãŸã™ã‚™ã‚‰ +ã„ãŸã¿ +ã„ãŸã‚Šã‚ +ã„ã¡ãŠã† +ã„ã¡ã—ã‚™ +ã„ã¡ã¨ã‚™ +ã„ã¡ã¯ã‚™ +ã„ã¡ãµã‚™ +ã„ã¡ã‚Šã‚…ㆠ+ã„ã¤ã‹ +ã„ã£ã—ã‚…ã‚“ +ã„ã£ã›ã„ +ã„ã£ãㆠ+ã„ã£ãŸã‚“ +ã„ã£ã¡ +ã„ã£ã¦ã„ +ã„ã£ã»ã‚šã† +ã„ã¦ã•ã‚™ +ã„ã¦ã‚“ +ã„ã¨ã‚™ã† +ã„ã¨ã“ +ã„ãªã„ +ã„ãªã‹ +ã„ã­ã‚€ã‚Š +ã„ã®ã¡ +ã„ã®ã‚‹ +ã„ã¯ã¤ +ã„ã¯ã‚™ã‚‹ +ã„ã¯ã‚“ +ã„ã²ã‚™ã +ã„ã²ã‚“ +ã„ãµã +ã„ã¸ã‚“ +ã„ã»ã† +ã„ã¿ã‚“ +ã„ã‚‚ã†ã¨ +ã„ã‚‚ãŸã‚Œ +ã„ã‚‚ã‚Š +ã„ã‚„ã‹ã‚™ã‚‹ +ã„ã‚„ã™ +ã„よã‹ã‚“ +ã„よã +ã„らㄠ+ã„らã™ã¨ +ã„ã‚Šã゙㡠+ã„りょㆠ+ã„れㄠ+ã„れも㮠+ã„れる +ã„ã‚ãˆã‚“ã²ã‚šã¤ +ã„ã‚ã„ +ã„ã‚ㆠ+ã„ã‚ã‹ã‚“ +ã„ã‚ã¯ã‚™ +ã„ã‚ゆる +ã„ã‚“ã‘゙んã¾ã‚ +ã„ã‚“ã•ã¤ +ã„ã‚“ã—ょㆠ+ã„んよㆠ+ã†ãˆã +ã†ãˆã‚‹ +ã†ãŠã•ã‚™ +ã†ã‹ã‚™ã„ +ã†ã‹ãµã‚™ +ã†ã‹ã¸ã‚™ã‚‹ +ã†ãã‚ +ã†ãらã„㪠+ã†ãれれ +ã†ã‘ãŸã¾ã‚ã‚‹ +ã†ã‘ã¤ã‘ +ã†ã‘ã¨ã‚‹ +ã†ã‘も㤠+ã†ã‘ã‚‹ +ã†ã“ã‚™ã‹ã™ +ã†ã“ã‚™ã +ã†ã“ã‚“ +ã†ã•ãã‚™ +ã†ã—ãªã† +ã†ã—ã‚ã‹ã‚™ã¿ +ã†ã™ã„ +ã†ã™ãã‚™ +ã†ã™ã゙らㄠ+ã†ã™ã‚ã‚‹ +ã†ã›ã¤ +ã†ã¡ã‚ã‚ã› +ã†ã¡ã‹ã‚™ã‚ +ã†ã¡ã +ã†ã¡ã‚…ㆠ+ã†ã£ã‹ã‚Š +ã†ã¤ãã—ã„ +ã†ã£ãŸãˆã‚‹ +ã†ã¤ã‚‹ +ã†ã¨ã‚™ã‚“ +ã†ãªãã‚™ +ã†ãªã—ã‚™ +ã†ãªã™ã‚™ã +ã†ãªã‚‹ +ã†ã­ã‚‹ +ã†ã®ã† +ã†ãµã‚™ã‘ã‚™ +ã†ãµã‚™ã“゙㈠+ã†ã¾ã‚Œã‚‹ +ã†ã‚ã‚‹ +ã†ã‚‚ㆠ+ã†ã‚„ã¾ã† +ã†ã‚ˆã +ã†ã‚‰ã‹ã‚™ãˆã™ +ã†ã‚‰ã゙㡠+ã†ã‚‰ãªã„ +ã†ã‚Šã‚ã‘ã‚™ +ã†ã‚Šãã‚Œ +ã†ã‚‹ã•ã„ +ã†ã‚Œã—ã„ +ã†ã‚Œã‚†ã +ã†ã‚Œã‚‹ +ã†ã‚ã“ +ã†ã‚ã +ã†ã‚ã• +ã†ã‚“ã“ㆠ+ã†ã‚“ã¡ã‚“ +ã†ã‚“ã¦ã‚“ +ã†ã‚“ã¨ã‚™ã† +ãˆã„ãˆã‚“ +ãˆã„ã‹ã‚™ +ãˆã„ãょㆠ+ãˆã„ã“ã‚™ +ãˆã„ã›ã„ +ãˆã„ãµã‚™ã‚“ +ãˆã„よㆠ+ãˆã„ã‚ +ãˆãŠã‚Š +ãˆã‹ã‚™ãŠ +ãˆã‹ã‚™ã +ãˆããŸã„ +ãˆãã›ã‚‹ +ãˆã—ゃã +ãˆã™ã¦ +ãˆã¤ã‚‰ã‚“ +ãˆã®ãã‚™ +ãˆã»ã†ã¾ã +ãˆã»ã‚“ +ãˆã¾ã +ãˆã‚‚ã—ã‚™ +ãˆã‚‚ã® +ãˆã‚‰ã„ +ãˆã‚‰ãµã‚™ +ãˆã‚Šã‚ +ãˆã‚“ãˆã‚“ +ãˆã‚“ã‹ã„ +ãˆã‚“ãã‚™ +ãˆã‚“ã‘ã‚™ã +ãˆã‚“ã—ゅㆠ+ãˆã‚“ã›ã‚™ã¤ +ãˆã‚“ãã +ãˆã‚“ã¡ã‚‡ã† +ãˆã‚“ã¨ã¤ +ãŠã„ã‹ã‘ã‚‹ +ãŠã„ã“ã™ +ãŠã„ã—ã„ +ãŠã„ã¤ã +ãŠã†ãˆã‚“ +ãŠã†ã•ã¾ +ãŠã†ã—ã‚™ +ãŠã†ã›ã¤ +ãŠã†ãŸã„ +ãŠã†ãµã +ãŠã†ã¸ã‚™ã„ +ãŠã†ã‚ˆã† +ãŠãˆã‚‹ +ãŠãŠã„ +ãŠãŠã† +ãŠãŠã¨ã‚™ãŠã‚Š +ãŠãŠã‚„ +ãŠãŠã‚ˆã +ãŠã‹ãˆã‚Š +ãŠã‹ã™ã‚™ +ãŠã‹ã‚™ã‚€ +ãŠã‹ã‚ã‚Š +ãŠãã‚™ãªã† +ãŠãã‚‹ +ãŠãã•ã¾ +ãŠãã—゙ょㆠ+ãŠãã‚Šã‹ã‚™ãª +ãŠãã‚‹ +ãŠãれる +ãŠã“ã™ +ãŠã“ãªã† +ãŠã“ã‚‹ +ãŠã•ãˆã‚‹ +ãŠã•ãªã„ +ãŠã•ã‚ã‚‹ +ãŠã—ã„ã‚Œ +ãŠã—ãˆã‚‹ +ãŠã—ã‚™ãã‚™ +ãŠã—ã‚™ã•ã‚“ +ãŠã—ゃれ +ãŠãらã +ãŠãã‚ã‚‹ +ãŠãŸã‹ã‚™ã„ +ãŠãŸã +ãŠãŸã‚™ã‚„ã‹ +ãŠã¡ã¤ã +ãŠã£ã¨ +ãŠã¤ã‚Š +ãŠã¦ã‚™ã‹ã‘ +ãŠã¨ã—ã‚‚ã® +ãŠã¨ãªã—ã„ +ãŠã¨ã‚™ã‚Š +ãŠã¨ã‚™ã‚ã‹ã™ +ãŠã¯ã‚™ã•ã‚“ +ãŠã¾ã„ã‚Š +ãŠã‚ã¦ã‚™ã¨ã† +ãŠã‚‚ã„ã¦ã‚™ +ãŠã‚‚ㆠ+ãŠã‚‚ãŸã„ +ãŠã‚‚ã¡ã‚ƒ +ãŠã‚„㤠+ãŠã‚„ゆã²ã‚™ +ãŠã‚ˆã»ã‚™ã™ +ãŠã‚‰ã‚“ãŸã‚™ +ãŠã‚ã™ +ãŠã‚“ã‹ã‚™ã +ãŠã‚“ã‘ã„ +ãŠã‚“ã—ゃ +ãŠã‚“ã›ã‚“ +ãŠã‚“ãŸã‚™ã‚“ +ãŠã‚“ã¡ã‚…ㆠ+ãŠã‚“ã¨ã‚™ã‘ã„ +ã‹ã‚㤠+ã‹ã„ã‹ã‚™ +ã‹ã‚™ã„ã +ã‹ã‚™ã„ã‘ã‚“ +ã‹ã‚™ã„ã“ㆠ+ã‹ã„ã•ã¤ +ã‹ã„ã—ゃ +ã‹ã„ã™ã„よã +ã‹ã„ã›ã‚™ã‚“ +ã‹ã„ãã‚™ã†ã¨ã‚™ +ã‹ã„ã¤ã† +ã‹ã„ã¦ã‚“ +ã‹ã„ã¨ã† +ã‹ã„ãµã +ã‹ã‚™ã„ã¸ã +ã‹ã„ã»ã† +ã‹ã„よㆠ+ã‹ã‚™ã„らㄠ+ã‹ã„ã‚ +ã‹ãˆã‚‹ +ã‹ãŠã‚Š +ã‹ã‹ãˆã‚‹ +ã‹ã‹ã‚™ã +ã‹ã‹ã‚™ã— +ã‹ã‹ã‚™ã¿ +ã‹ãã“ã‚™ +ã‹ãã¨ã +ã‹ã•ã‚™ã‚‹ +ã‹ã‚™ã゙ㆠ+ã‹ãŸã„ +ã‹ãŸã¡ +ã‹ã‚™ã¡ã‚‡ã† +ã‹ã‚™ã£ãゅㆠ+ã‹ã‚™ã£ã“ㆠ+ã‹ã‚™ã£ã•ã‚“ +ã‹ã‚™ã£ã—ょㆠ+ã‹ãªã•ã‚™ã‚ã— +ã‹ã®ã† +ã‹ã‚™ã¯ã +ã‹ãµã‚™ã‹ +ã‹ã»ã† +ã‹ã»ã“ã‚™ +ã‹ã¾ã† +ã‹ã¾ã»ã‚™ã“ +ã‹ã‚ã‚ŒãŠã‚“ +ã‹ã‚†ã„ +ã‹ã‚ˆã†ã²ã‚™ +ã‹ã‚‰ã„ +ã‹ã‚‹ã„ +ã‹ã‚ㆠ+ã‹ã‚ã +ã‹ã‚ら +ã‹ã‚™ã‚“ã‹ +ã‹ã‚“ã‘ã„ +ã‹ã‚“ã“ㆠ+ã‹ã‚“ã—ゃ +ã‹ã‚“ãㆠ+ã‹ã‚“ãŸã‚“ +ã‹ã‚“ã¡ +ã‹ã‚™ã‚“ã¯ã‚™ã‚‹ +ãã‚ã„ +ãã‚㤠+ãã„ã‚ +ãã‚™ã„ã‚“ +ãã†ã„ +ãã†ã‚“ +ããˆã‚‹ +ããŠã† +ããŠã +ããŠã¡ +ããŠã‚“ +ãã‹ã„ +ãã‹ã +ãã‹ã‚“ã—ゃ +ãã㦠+ããã¯ã‚™ã‚Š +ããらã‘ã‚™ +ãã‘ã‚“ã›ã„ +ãã“ㆠ+ãã“ãˆã‚‹ +ãã“ã +ãã•ã„ +ãã•ã +ãã•ã¾ +ãã•ã‚‰ãã‚™ +ãã‚™ã—ã‚™ã‹ã‹ã‚™ã +ãã‚™ã—ã +ãã‚™ã—ã‚™ãŸã„ã‘ã‚“ +ãã‚™ã—ã‚™ã«ã£ã¦ã„ +ãã‚™ã—゙ゅã¤ã—ゃ +ãã™ã† +ãã›ã„ +ãã›ã +ãã›ã¤ +ããㆠ+ããã‚™ã +ãã゙ん +ããŸãˆã‚‹ +ãã¡ã‚‡ã† +ãã¤ãˆã‚“ +ãã‚™ã£ã¡ã‚Š +ãã¤ã¤ã +ãã¤ã­ +ãã¦ã„ +ãã¨ã‚™ã† +ãã¨ã‚™ã +ããªã„ +ããªã‹ã‚™ +ããªã“ +ãã¬ã“゙㗠+ãã­ã‚“ +ãã®ã† +ãã®ã—㟠+ãã¯ã +ãã²ã‚™ã—ã„ +ãã²ã‚“ +ããµã +ããµã‚™ã‚“ +ãã»ã‚™ã† +ãã»ã‚“ +ãã¾ã‚‹ +ãã¿ã¤ +ãã‚€ã™ã‚™ã‹ã—ã„ +ãã‚ã‚‹ +ãã‚‚ãŸã‚™ã‚ã— +ãã‚‚ã¡ +ãã‚‚ã® +ãゃã +ãã‚„ã +ã゙ゅã†ã«ã +ãよㆠ+ãょã†ã‚Šã‚…ㆠ+ãらㄠ+ãらã +ãã‚Šã‚“ +ãれㄠ+ãれ㤠+ãã‚ã +ãã‚™ã‚ã‚“ +ãã‚ã‚ã‚‹ +ã゙んã„ã‚ +ãã‚“ã‹ãã—ã‚™ +ãã‚“ã—゙ょ +ãんよã†ã²ã‚™ +ãã‚™ã‚ã„ +ãã„ã™ã‚™ +ãã†ã‹ã‚“ +ãã†ã +ãã†ã゙ん +ãã†ã“ㆠ+ãã‚™ã†ã›ã„ +ãã†ãㆠ+ãã‚™ã†ãŸã‚‰ +ãã†ãµã +ãã†ã»ã‚™ +ãã‹ã‚“ +ããょㆠ+ãã‘゙ん +ãã‚™ã“ㆠ+ãã•ã„ +ãã•ã +ãã•ã¯ã‚™ãª +ãã•ã‚‹ +ãã—ゃ㿠+ãã—ょㆠ+ãã™ã®ã +ãã™ã‚Šã‚†ã²ã‚™ +ãã›ã‘ã‚™ +ãã›ã‚“ +ãã‚™ãŸã„ã¦ã +ããŸã‚™ã•ã‚‹ +ããŸã²ã‚™ã‚Œã‚‹ +ãã¡ã“ã¿ +ãã¡ã•ã +ãã¤ã—㟠+ãã‚™ã£ã™ã‚Š +ãã¤ã‚ãã‚™ +ãã¨ã†ã¦ã‚“ +ãã¨ã‚™ã +ããªã‚“ +ãã­ãã­ +ãã®ã† +ããµã† +ãã¿ã‚ã‚ã› +ãã¿ãŸã¦ã‚‹ +ãã‚ã‚‹ +ãã‚„ãã—ょ +ãら㙠+ãらã¸ã‚™ã‚‹ +ãã‚‹ã¾ +ãれる +ãã‚ㆠ+ãã‚ã—ã„ +ã゙んã‹ã‚“ +ã゙んã—ょã +ã゙んãŸã„ +ã゙ん㦠+ã‘ã‚㪠+ã‘ã„ã‹ã +ã‘ã„ã‘ã‚“ +ã‘ã„ã“ +ã‘ã„ã•ã¤ +ã‘ã‚™ã„ã—゙ゅ㤠+ã‘ã„ãŸã„ +ã‘ã‚™ã„ã®ã†ã—゙ん +ã‘ã„ã‚Œã +ã‘ã„ã‚ +ã‘ãŠã¨ã™ +ã‘ãŠã‚Šã‚‚ã® +ã‘ã‚™ãã‹ +ã‘ã‚™ãã‘゙ん +ã‘ã‚™ããŸã‚™ã‚“ +ã‘ã‚™ãã¡ã‚“ +ã‘ã‚™ãã¨ã¤ +ã‘ã‚™ã㯠+ã‘ã‚™ãã‚„ã +ã‘ã‚™ã“ㆠ+ã‘ã‚™ã“ãã—゙ょㆠ+ã‘ã‚™ã•ã‚™ã„ +ã‘ã•ã +ã‘ã‚™ã•ã‚™ã‚“ +ã‘ã—ã +ã‘ã—ã“゙む +ã‘ã—ょㆠ+ã‘ã‚™ã™ã¨ +ã‘ãŸã¯ã‚™ +ã‘ã¡ã‚ƒã£ãµã‚š +ã‘ã¡ã‚‰ã™ +ã‘ã¤ã‚㤠+ã‘ã¤ã„ +ã‘ã¤ãˆã +ã‘ã£ã“ã‚“ +ã‘ã¤ã—゙ょ +ã‘ã£ã›ã +ã‘ã£ã¦ã„ +ã‘ã¤ã¾ã¤ +ã‘ã‚™ã¤ã‚ˆã†ã²ã‚™ +ã‘ã‚™ã¤ã‚Œã„ +ã‘ã¤ã‚ã‚“ +ã‘ã‚™ã¨ã‚™ã +ã‘ã¨ã¯ã‚™ã™ +ã‘ã¨ã‚‹ +ã‘ãªã‘ã‚™ +ã‘ãªã™ +ã‘ãªã¿ +ã‘ã¬ã +ã‘ã‚™ã­ã¤ +ã‘ã­ã‚“ +ã‘ã¯ã„ +ã‘ã‚™ã²ã‚“ +ã‘ãµã‚™ã‹ã„ +ã‘ã‚™ã»ã‚™ã +ã‘ã¾ã‚Š +ã‘ã¿ã‹ã‚‹ +ã‘む㗠+ã‘むり +ã‘ã‚‚ã® +ã‘らㄠ+ã‘ã‚ã‘ã‚ +ã‘ã‚ã—ã„ +ã‘ã‚“ã„ +ã‘ã‚“ãˆã¤ +ã‘ん㊠+ã‘ã‚“ã‹ +ã‘゙んã +ã‘ã‚“ã‘゙ん +ã‘ã‚“ã“ㆠ+ã‘ã‚“ã•ã +ã‘ã‚“ã—ゅㆠ+ã‘ã‚“ã™ã† +ã‘゙んãㆠ+ã‘ã‚“ã¡ã +ã‘ã‚“ã¦ã„ +ã‘ã‚“ã¨ã† +ã‘ã‚“ãªã„ +ã‘ã‚“ã«ã‚“ +ã‘゙んãµã‚™ã¤ +ã‘ã‚“ã¾ +ã‘ã‚“ã¿ã‚“ +ã‘ã‚“ã‚ã„ +ã‘んらん +ã‘ã‚“ã‚Š +ã“ã‚ãã¾ +ã“ã„㬠+ã“ã„ã²ã‚™ã¨ +ã“ã‚™ã†ã„ +ã“ã†ãˆã‚“ +ã“ã†ãŠã‚“ +ã“ã†ã‹ã‚“ +ã“ã‚™ã†ãゅㆠ+ã“ã‚™ã†ã‘ã„ +ã“ã†ã“ㆠ+ã“ã†ã•ã„ +ã“ã†ã—ã‚™ +ã“ã†ã™ã„ +ã“ã‚™ã†ã›ã„ +ã“ã†ãã +ã“ã†ãŸã„ +ã“ã†ã¡ã‚ƒ +ã“ã†ã¤ã† +ã“ã†ã¦ã„ +ã“ã†ã¨ã‚™ã† +ã“ã†ãªã„ +ã“ã†ã¯ã„ +ã“ã‚™ã†ã»ã† +ã“ã‚™ã†ã¾ã‚“ +ã“ã†ã‚‚ã +ã“ã†ã‚Šã¤ +ã“ãˆã‚‹ +ã“ãŠã‚Š +ã“ã‚™ã‹ã„ +ã“ã‚™ã‹ã‚™ã¤ +ã“ã‚™ã‹ã‚“ +ã“ãã“ã‚™ +ã“ãã•ã„ +ã“ãã¨ã† +ã“ããªã„ +ã“ãã¯ã +ã“ã゙㾠+ã“ã‘ã„ +ã“ã‘ã‚‹ +ã“ã“ã®ã‹ +ã“ã“ã‚ +ã“ã•ã‚ +ã“ã—㤠+ã“ã™ã† +ã“ã›ã„ +ã“ã›ã +ã“ã›ã‚™ã‚“ +ã“ããŸã‚™ã¦ +ã“ãŸã„ +ã“ãŸãˆã‚‹ +ã“ãŸã¤ +ã“ã¡ã‚‡ã† +ã“ã£ã‹ +ã“ã¤ã“㤠+ã“ã¤ã¯ã‚™ã‚“ +ã“ã¤ãµã‚™ +ã“ã¦ã„ +ã“ã¦ã‚“ +ã“ã¨ã‹ã‚™ã‚‰ +ã“ã¨ã— +ã“ã¨ã¯ã‚™ +ã“ã¨ã‚Š +ã“ãªã“゙㪠+ã“ã­ã“ã­ +ã“ã®ã¾ã¾ +ã“ã®ã¿ +ã“ã®ã‚ˆ +ã“ã‚™ã¯ã‚“ +ã“ã²ã¤ã—ã‚™ +ã“ãµã† +ã“ãµã‚“ +ã“ã»ã‚™ã‚Œã‚‹ +ã“ã‚™ã¾ã‚ãµã‚™ã‚‰ +ã“ã¾ã‹ã„ +ã“ã‚™ã¾ã™ã‚Š +ã“ã¾ã¤ãª +ã“ã¾ã‚‹ +ã“ã‚€ã゙㓠+ã“ã‚‚ã—ã‚™ +ã“ã‚‚ã¡ +ã“ã‚‚ã® +ã“ã‚‚ã‚“ +ã“ã‚„ã +ã“ã‚„ã¾ +ã“ゆㆠ+ã“ゆã²ã‚™ +ã“よㄠ+ã“よㆠ+ã“ã‚Šã‚‹ +ã“ã‚Œãã—ょん +ã“ã‚ã£ã‘ +ã“ã‚も㦠+ã“ã‚れる +ã“ã‚“ã„ã‚“ +ã“ã‚“ã‹ã„ +ã“ã‚“ã +ã“ã‚“ã—ゅㆠ+ã“ã‚“ã™ã„ +ã“ã‚“ãŸã‚™ã¦ +ã“ã‚“ã¨ã‚“ +ã“ã‚“ãªã‚“ +ã“ã‚“ã²ã‚™ã« +ã“ã‚“ã»ã‚šã‚“ +ã“ã‚“ã¾ã‘ +ã“ã‚“ã‚„ +ã“んれㄠ+ã“ã‚“ã‚ã +ã•ã‚™ã„ãˆã +ã•ã„ã‹ã„ +ã•ã„ãã‚“ +ã•ã‚™ã„ã‘゙ん +ã•ã‚™ã„ã“ +ã•ã„ã—ょ +ã•ã„ã›ã„ +ã•ã‚™ã„ãŸã +ã•ã‚™ã„ã¡ã‚…ㆠ+ã•ã„ã¦ã +ã•ã‚™ã„りょㆠ+ã•ã†ãª +ã•ã‹ã„ã— +ã•ã‹ã‚™ã™ +ã•ã‹ãª +ã•ã‹ã¿ã¡ +ã•ã‹ã‚™ã‚‹ +ã•ã゙ょㆠ+ã•ãã— +ã•ãã²ã‚“ +ã•ãら +ã•ã“ã +ã•ã“㤠+ã•ã™ã‚™ã‹ã‚‹ +ã•ã‚™ã›ã +ã•ãŸã‚“ +ã•ã¤ãˆã„ +ã•ã‚™ã¤ãŠã‚“ +ã•ã‚™ã£ã‹ +ã•ã‚™ã¤ã‹ã‚™ã +ã•ã£ãょã +ã•ã‚™ã£ã— +ã•ã¤ã—゙ん +ã•ã‚™ã£ãㆠ+ã•ã¤ãŸã¯ã‚™ +ã•ã¤ã¾ã„ã‚‚ +ã•ã¦ã„ +ã•ã¨ã„ã‚‚ +ã•ã¨ã† +ã•ã¨ãŠã‚„ +ã•ã¨ã— +ã•ã¨ã‚‹ +ã•ã®ã† +ã•ã¯ã‚™ã +ã•ã²ã‚™ã—ã„ +ã•ã¸ã‚™ã¤ +ã•ã»ã† +ã•ã»ã¨ã‚™ +ã•ã¾ã™ +ã•ã¿ã—ã„ +ã•ã¿ãŸã‚™ã‚Œ +ã•ã‚€ã‘ +ã•ã‚ã‚‹ +ã•ã‚„ãˆã‚“ã¨ã‚™ã† +ã•ã‚†ã† +ã•ã‚ˆã† +ã•ã‚ˆã +ã•ã‚‰ãŸã‚™ +ã•ã‚™ã‚‹ãã¯ã‚™ +ã•ã‚ã‚„ã‹ +ã•ã‚ã‚‹ +ã•ã‚“ã„ã‚“ +ã•ã‚“ã‹ +ã•ã‚“ãゃã +ã•ã‚“ã“ㆠ+ã•ã‚“ã•ã„ +ã•ã‚™ã‚“ã—ょ +ã•ã‚“ã™ã† +ã•ã‚“ã›ã„ +ã•ã‚“ã +ã•ã‚“ã¡ +ã•ã‚“ã¾ +ã•ã‚“ã¿ +ã•ã‚“らん +ã—ã‚ã„ +ã—ã‚ã‘ã‚™ +ã—ã‚ã•ã£ã¦ +ã—ã‚ã‚ã› +ã—ã„ã +ã—ã„ã‚“ +ã—ã†ã¡ +ã—ãˆã„ +ã—ãŠã‘ +ã—ã‹ã„ +ã—ã‹ã +ã—ã‚™ã‹ã‚“ +ã—ã“゙㨠+ã—ã™ã† +ã—ã‚™ãŸã‚™ã„ +ã—ãŸã†ã‘ +ã—ãŸãã‚™ +ã—ãŸã¦ +ã—ãŸã¿ +ã—ã¡ã‚‡ã† +ã—ã¡ã‚Šã‚“ +ã—ã£ã‹ã‚Š +ã—ã¤ã—ã‚™ +ã—ã¤ã‚‚ã‚“ +ã—ã¦ã„ +ã—ã¦ã +ã—ã¦ã¤ +ã—ã‚™ã¦ã‚“ +ã—ã‚™ã¨ã‚™ã† +ã—ãªã゙れ +ã—ãªã‚‚ã® +ã—ãªã‚“ +ã—ã­ã¾ +ã—ã­ã‚“ +ã—ã®ãã‚™ +ã—ã®ãµã‚™ +ã—ã¯ã„ +ã—ã¯ã‚™ã‹ã‚Š +ã—ã¯ã¤ +ã—ã¯ã‚‰ã„ +ã—ã¯ã‚“ +ã—ã²ã‚‡ã† +ã—ãµã +ã—ã‚™ãµã‚™ã‚“ +ã—ã¸ã„ +ã—ã»ã† +ã—ã»ã‚“ +ã—ã¾ã† +ã—ã¾ã‚‹ +ã—ã¿ã‚“ +ã—ã‚€ã‘ã‚‹ +ã—゙むã—ょ +ã—ã‚ã„ +ã—ã‚ã‚‹ +ã—ã‚‚ã‚“ +ã—ゃã„ã‚“ +ã—ゃã†ã‚“ +ã—ゃãŠã‚“ +ã—゙ゃã‹ã‚™ã„ã‚‚ +ã—ã‚„ãã—ょ +ã—ゃãã»ã† +ã—ゃã‘ã‚“ +ã—ゃ㓠+ã—ゃã•ã‚™ã„ +ã—ゃã—ã‚“ +ã—ゃã›ã‚“ +ã—ゃãㆠ+ã—ゃãŸã„ +ã—ゃã¡ã‚‡ã† +ã—ゃã£ãã‚“ +ã—゙ゃ㾠+ã—ゃりん +ã—ゃれㄠ+ã—゙ゆㆠ+ã—゙ゅã†ã—ょ +ã—ã‚…ãã¯ã +ã—゙ゅã—ã‚“ +ã—ã‚…ã£ã›ã +ã—ã‚…ã¿ +ã—ゅらã¯ã‚™ +ã—゙ゅんã¯ã‚™ã‚“ +ã—ょã†ã‹ã„ +ã—ょããŸã +ã—ょã£ã‘ã‚“ +ã—ょã¨ã‚™ã† +ã—ょも㤠+ã—らã›ã‚‹ +ã—らã¸ã‚™ã‚‹ +ã—ã‚“ã‹ +ã—ã‚“ã“ㆠ+ã—゙んã—゙ゃ +ã—ã‚“ã›ã„ã—ã‚™ +ã—ã‚“ã¡ã +ã—ã‚“ã‚Šã‚“ +ã™ã‚ã‘ã‚™ +ã™ã‚ã— +ã™ã‚㪠+ã™ã‚™ã‚ã‚“ +ã™ã„ãˆã„ +ã™ã„ã‹ +ã™ã„ã¨ã† +ã™ã‚™ã„ãµã‚™ã‚“ +ã™ã„よã†ã²ã‚™ +ã™ã†ã‹ã‚™ã +ã™ã†ã—゙㤠+ã™ã†ã›ã‚“ +ã™ãŠã¨ã‚™ã‚Š +ã™ãã¾ +ã™ãㆠ+ã™ããªã„ +ã™ã‘ã‚‹ +ã™ã“゙ㄠ+ã™ã“ã— +ã™ã‚™ã•ã‚“ +ã™ã™ã‚™ã—ã„ +ã™ã™ã‚€ +ã™ã™ã‚ã‚‹ +ã™ã£ã‹ã‚Š +ã™ã‚™ã£ã—ã‚Š +ã™ã‚™ã£ã¨ +ã™ã¦ã +ã™ã¦ã‚‹ +ã™ã­ã‚‹ +ã™ã®ã“ +ã™ã¯ãŸã‚™ +ã™ã¯ã‚™ã‚‰ã—ã„ +ã™ã‚™ã²ã‚‡ã† +ã™ã‚™ãµã‚™ã¬ã‚Œ +ã™ãµã‚™ã‚Š +ã™ãµã‚Œ +ã™ã¸ã‚™ã¦ +ã™ã¸ã‚™ã‚‹ +ã™ã‚™ã»ã† +ã™ã»ã‚™ã‚“ +ã™ã¾ã„ +ã™ã‚ã— +ã™ã‚‚ㆠ+ã™ã‚„ã +ã™ã‚‰ã™ã‚‰ +ã™ã‚‹ã‚ +ã™ã‚Œã¡ã‹ã‚™ã† +ã™ã‚ã£ã¨ +ã™ã‚ã‚‹ +ã™ã‚“ã›ã‚™ã‚“ +ã™ã‚“ã»ã‚šã† +ã›ã‚ãµã‚™ã‚‰ +ã›ã„ã‹ã¤ +ã›ã„ã‘゙ん +ã›ã„ã—ã‚™ +ã›ã„よㆠ+ã›ãŠã† +ã›ã‹ã„ã‹ã‚“ +ã›ãã«ã‚“ +ã›ãã‚€ +ã›ãゆ +ã›ãらんã†ã‚“ +ã›ã‘ã‚“ +ã›ã“ㆠ+ã›ã™ã—ã‚™ +ã›ãŸã„ +ã›ãŸã‘ +ã›ã£ã‹ã +ã›ã£ãゃã +ã›ã‚™ã£ã +ã›ã£ã‘ã‚“ +ã›ã£ã“㤠+ã›ã£ã•ãŸãã¾ +ã›ã¤ãã‚™ã +ã›ã¤ãŸã‚™ã‚“ +ã›ã¤ã¦ã‚™ã‚“ +ã›ã£ã¯ã‚šã‚“ +ã›ã¤ã²ã‚™ +ã›ã¤ãµã‚™ã‚“ +ã›ã¤ã‚ã„ +ã›ã¤ã‚Šã¤ +ã›ãªã‹ +ã›ã®ã²ã‚™ +ã›ã¯ã¯ã‚™ +ã›ã²ã‚™ã‚ +ã›ã»ã‚™ã­ +ã›ã¾ã„ +ã›ã¾ã‚‹ +ã›ã‚ã‚‹ +ã›ã‚‚ãŸã‚Œ +ã›ã‚Šãµ +ã›ã‚™ã‚“ã‚ã +ã›ã‚“ã„ +ã›ã‚“ãˆã„ +ã›ã‚“ã‹ +ã›ã‚“ãょ +ã›ã‚“ã +ã›ã‚“ã‘゙ん +ã›ã‚™ã‚“ã“ã‚™ +ã›ã‚“ã•ã„ +ã›ã‚“ã—ã‚… +ã›ã‚“ã™ã„ +ã›ã‚“ã›ã„ +ã›ã‚“ãã‚™ +ã›ã‚“ãŸã +ã›ã‚“ã¡ã‚‡ã† +ã›ã‚“ã¦ã„ +ã›ã‚“ã¨ã† +ã›ã‚“ã¬ã +ã›ã‚“ã­ã‚“ +ã›ã‚“ã¯ã‚šã„ +ã›ã‚™ã‚“ãµã‚™ +ã›ã‚™ã‚“ã»ã‚šã† +ã›ã‚“ã‚€ +ã›ã‚“ã‚ã‚“ã—゙ょ +ã›ã‚“ã‚‚ã‚“ +ã›ã‚“ã‚„ã +ã›ã‚“ゆㆠ+ã›ã‚“よㆠ+ã›ã‚™ã‚“ら +ã›ã‚™ã‚“りゃã +ã›ã‚“れㄠ+ã›ã‚“ã‚ +ãã‚ã +ãã„ã¨ã‘゙る +ãã„ã­ +ãã†ã‹ã‚™ã‚“ãょㆠ+ãã†ã +ãã†ã“ã‚™ +ãã†ã—ã‚“ +ãã†ãŸã‚™ã‚“ +ãã†ãªã‚“ +ãã†ã²ã‚™ +ãã†ã‚ã‚“ +ãã†ã‚Š +ããˆã‚‚ã® +ããˆã‚“ +ãã‹ã‚™ã„ +ãã‘ã‚™ã +ãã“ㆠ+ãã“ãã“ +ãã•ã‚™ã„ +ãã—㪠+ãã›ã„ +ãã›ã‚“ +ãããã‚™ +ããŸã‚™ã¦ã‚‹ +ãã¤ã† +ãã¤ãˆã‚“ +ãã£ã‹ã‚“ +ãã¤ã゙ょㆠ+ãã£ã‘㤠+ãã£ã“ㆠ+ãã£ã›ã‚“ +ãã£ã¨ +ãã¨ã‹ã‚™ã‚ +ãã¨ã¤ã‚™ã‚‰ +ããªãˆã‚‹ +ããªãŸ +ããµã»ã‚™ +ãã»ã‚™ã +ãã»ã‚™ã‚ +ãã¾ã¤ +ãã¾ã‚‹ +ãã‚€ã +ãむり㈠+ãã‚ã‚‹ +ãã‚‚ãã‚‚ +ãよã‹ã›ã‚™ +ãらã¾ã‚ +ãã‚ㆠ+ãã‚“ã‹ã„ +ãã‚“ã‘ã„ +ãã‚“ã•ã‚™ã„ +ãã‚“ã—㤠+ãã‚“ãã‚™ã +ãã‚“ã¡ã‚‡ã† +ã゙んã²ã‚™ +ã゙んãµã‚™ã‚“ +ãã‚“ã¿ã‚“ +ãŸã‚ã„ +ãŸã„ã„ã‚“ +ãŸã„ã†ã‚“ +ãŸã„ãˆã +ãŸã„ãŠã† +ãŸã‚™ã„ã‹ã‚™ã +ãŸã„ã +ãŸã„ã゙ㆠ+ãŸã„ã‘ã‚“ +ãŸã„ã“ +ãŸã„ã•ã‚™ã„ +ãŸã‚™ã„ã—゙ょã†ãµã‚™ +ãŸã‚™ã„ã™ã +ãŸã„ã›ã¤ +ãŸã„ãㆠ+ãŸã‚™ã„ãŸã„ +ãŸã„ã¡ã‚‡ã† +ãŸã„ã¦ã„ +ãŸã‚™ã„ã¨ã‚™ã“ã‚ +ãŸã„ãªã„ +ãŸã„ã­ã¤ +ãŸã„ã®ã† +ãŸã„ã¯ã‚“ +ãŸã‚™ã„ã²ã‚‡ã† +ãŸã„ãµã† +ãŸã„ã¸ã‚“ +ãŸã„ã» +ãŸã„ã¾ã¤ã¯ã‚™ãª +ãŸã„ã¿ã‚“ãã‚™ +ãŸã„ã‚€ +ãŸã„ã‚ã‚“ +ãŸã„ã‚„ã +ãŸã„よㆠ+ãŸã„ら +ãŸã„りょã +ãŸã„ã‚‹ +ãŸã„ã‚ã‚“ +ãŸã†ãˆ +ãŸãˆã‚‹ +ãŸãŠã™ +ãŸãŠã‚‹ +ãŸãŠã‚Œã‚‹ +ãŸã‹ã„ +ãŸã‹ã­ +ãŸãã²ã‚™ +ãŸãã•ã‚“ +ãŸã“ã +ãŸã“ã‚„ã +ãŸã•ã„ +ãŸã—ã•ã‚™ã‚“ +ãŸã‚™ã—゙ゃれ +ãŸã™ã‘ã‚‹ +ãŸã™ã‚™ã•ã‚ã‚‹ +ãŸãã‹ã‚™ã‚Œ +ãŸãŸã‹ã† +ãŸãŸã +ãŸãŸã‚™ã—ã„ +ãŸãŸã¿ +ãŸã¡ã¯ã‚™ãª +ãŸã‚™ã£ã‹ã„ +ãŸã‚™ã£ãゃã +ãŸã‚™ã£ã“ +ãŸã‚™ã£ã—ゅ㤠+ãŸã‚™ã£ãŸã„ +ãŸã¦ã‚‹ +ãŸã¨ãˆã‚‹ +ãŸãªã¯ã‚™ãŸ +ãŸã«ã‚“ +ãŸã¬ã +ãŸã®ã—ã¿ +ãŸã¯ã¤ +ãŸãµã‚™ã‚“ +ãŸã¸ã‚™ã‚‹ +ãŸã»ã‚™ã† +ãŸã¾ã“ã‚™ +ãŸã¾ã‚‹ +ãŸã‚™ã‚€ã‚‹ +ãŸã‚ã„ã +ãŸã‚ã™ +ãŸã‚ã‚‹ +ãŸã‚‚㤠+ãŸã‚„ã™ã„ +ãŸã‚ˆã‚‹ +ãŸã‚‰ã™ +ãŸã‚Šãã»ã‚“ã‹ã‚™ã‚“ +ãŸã‚Šã‚‡ã† +ãŸã‚Šã‚‹ +ãŸã‚‹ã¨ +ãŸã‚Œã‚‹ +ãŸã‚Œã‚“㨠+ãŸã‚ã£ã¨ +ãŸã‚むれる +ãŸã‚™ã‚“ã‚㤠+ãŸã‚“ã„ +ãŸã‚“ãŠã‚“ +ãŸã‚“ã‹ +ãŸã‚“ã +ãŸã‚“ã‘ã‚“ +ãŸã‚“ã“ã‚™ +ãŸã‚“ã•ã‚“ +ãŸã‚“ã—゙ょã†ã²ã‚™ +ãŸã‚™ã‚“ã›ã„ +ãŸã‚“ãã +ãŸã‚“ãŸã„ +ãŸã‚™ã‚“ã¡ +ãŸã‚“ã¦ã„ +ãŸã‚“ã¨ã† +ãŸã‚™ã‚“㪠+ãŸã‚“ã«ã‚“ +ãŸã‚™ã‚“ã­ã¤ +ãŸã‚“ã®ã† +ãŸã‚“ã²ã‚šã‚“ +ãŸã‚™ã‚“ã»ã‚™ã† +ãŸã‚“ã¾ã¤ +ãŸã‚“ã‚ã„ +ãŸã‚™ã‚“れ㤠+ãŸã‚™ã‚“ã‚ +ãŸã‚™ã‚“ã‚ +ã¡ã‚ã„ +ã¡ã‚ã‚“ +ã¡ã„ã +ã¡ã„ã•ã„ +ã¡ãˆã‚“ +ã¡ã‹ã„ +ã¡ã‹ã‚‰ +ã¡ãゅㆠ+ã¡ãã‚“ +ã¡ã‘ã„ã™ã‚™ +ã¡ã‘ã‚“ +ã¡ã“ã +ã¡ã•ã„ +ã¡ã—ã +ã¡ã—りょㆠ+ã¡ã›ã„ +ã¡ãㆠ+ã¡ãŸã„ +ã¡ãŸã‚“ +ã¡ã¡ãŠã‚„ +ã¡ã¤ã—゙ょ +ã¡ã¦ã +ã¡ã¦ã‚“ +ã¡ã¬ã +ã¡ã¬ã‚Š +ã¡ã®ã† +ã¡ã²ã‚‡ã† +ã¡ã¸ã„ã›ã‚“ +ã¡ã»ã† +ã¡ã¾ãŸ +ã¡ã¿ã¤ +ã¡ã¿ã¨ã‚™ã‚ +ã¡ã‚ã„ã¨ã‚™ +ã¡ã‚ƒã‚“ã“ãªã¸ã‚™ +ã¡ã‚…ã†ã„ +ã¡ã‚†ã‚Šã‚‡ã +ã¡ã‚‡ã†ã— +ã¡ã‚‡ã•ãã‘ã‚“ +ã¡ã‚‰ã— +ã¡ã‚‰ã¿ +ã¡ã‚Šã‹ã‚™ã¿ +ã¡ã‚Šã‚‡ã† +ã¡ã‚‹ã¨ã‚™ +ã¡ã‚ã‚ +ã¡ã‚“ãŸã„ +ã¡ã‚“ã‚‚ã +ã¤ã„ã‹ +ã¤ã„ãŸã¡ +ã¤ã†ã‹ +ã¤ã†ã—゙ょㆠ+ã¤ã†ã¯ã‚“ +ã¤ã†ã‚ +ã¤ã‹ã† +ã¤ã‹ã‚Œã‚‹ +ã¤ãã­ +ã¤ãã‚‹ +ã¤ã‘ã­ +ã¤ã‘ã‚‹ +ã¤ã“゙ㆠ+ã¤ãŸãˆã‚‹ +ã¤ã¤ã‚™ã +ã¤ã¤ã—ã‚™ +ã¤ã¤ã‚€ +ã¤ã¨ã‚ã‚‹ +ã¤ãªã‹ã‚™ã‚‹ +ã¤ãªã¿ +ã¤ã­ã¤ã‚™ã­ +ã¤ã®ã‚‹ +ã¤ãµã‚™ã™ +ã¤ã¾ã‚‰ãªã„ +ã¤ã¾ã‚‹ +ã¤ã¿ã +ã¤ã‚ãŸã„ +ã¤ã‚‚ã‚Š +ã¤ã‚‚ã‚‹ +ã¤ã‚ˆã„ +ã¤ã‚‹ã»ã‚™ +ã¤ã‚‹ã¿ã +ã¤ã‚ã‚‚ã® +ã¤ã‚ã‚Š +ã¦ã‚ã— +ã¦ã‚㦠+ã¦ã‚ã¿ +ã¦ã„ãŠã‚“ +ã¦ã„ã‹ +ã¦ã„ã +ã¦ã„ã‘ã„ +ã¦ã„ã“ã +ã¦ã„ã•ã¤ +ã¦ã„ã— +ã¦ã„ã›ã„ +ã¦ã„ãŸã„ +ã¦ã„ã¨ã‚™ +ã¦ã„ã­ã„ +ã¦ã„ã²ã‚‡ã† +ã¦ã„ã¸ã‚“ +ã¦ã„ã»ã‚™ã† +ã¦ã†ã¡ +ã¦ãŠãã‚Œ +ã¦ãã¨ã† +ã¦ãã²ã‚™ +ã¦ã‚™ã“ã»ã‚™ã“ +ã¦ã•ã゙ょㆠ+ã¦ã•ã‘ã‚™ +ã¦ã™ã‚Š +ã¦ãㆠ+ã¦ã¡ã‹ã‚™ã„ +ã¦ã¡ã‚‡ã† +ã¦ã¤ã‹ã‚™ã +ã¦ã¤ã¤ã‚™ã +ã¦ã‚™ã£ã¯ã‚š +ã¦ã¤ã»ã‚™ã† +ã¦ã¤ã‚„ +ã¦ã‚™ã¬ã‹ãˆ +ã¦ã¬ã +ã¦ã¬ã゙ㄠ+ã¦ã®ã²ã‚‰ +ã¦ã¯ã„ +ã¦ãµã‚™ãã‚ +ã¦ãµãŸã‚™ +ã¦ã»ã¨ã‚™ã +ã¦ã»ã‚“ +ã¦ã¾ãˆ +ã¦ã¾ãã™ã‚™ã— +ã¦ã¿ã—゙㋠+ã¦ã¿ã‚„ã‘ã‚™ +ã¦ã‚‰ã™ +ã¦ã‚Œã²ã‚™ +ã¦ã‚ã‘ +ã¦ã‚ãŸã— +ã¦ã‚™ã‚“ã‚㤠+ã¦ã‚“ã„ã‚“ +ã¦ã‚“ã‹ã„ +ã¦ã‚“ã +ã¦ã‚“ãã‚™ +ã¦ã‚“ã‘ã‚“ +ã¦ã‚“ã“ã‚™ã +ã¦ã‚“ã•ã„ +ã¦ã‚“ã— +ã¦ã‚“ã™ã† +ã¦ã‚™ã‚“ã¡ +ã¦ã‚“ã¦ã +ã¦ã‚“ã¨ã† +ã¦ã‚“ãªã„ +ã¦ã‚“ãµã‚šã‚‰ +ã¦ã‚“ã»ã‚™ã†ãŸã‚™ã„ +ã¦ã‚“ã‚㤠+ã¦ã‚“らんã‹ã„ +ã¦ã‚™ã‚“りょã +ã¦ã‚™ã‚“ã‚ +ã¨ã‚™ã‚ã„ +ã¨ã„ã‚Œ +ã¨ã‚™ã†ã‹ã‚“ +ã¨ã†ãゅㆠ+ã¨ã‚™ã†ãã‚™ +ã¨ã†ã— +ã¨ã†ã‚€ãã‚™ +ã¨ãŠã„ +ã¨ãŠã‹ +ã¨ãŠã +ã¨ãŠã™ +ã¨ãŠã‚‹ +ã¨ã‹ã„ +ã¨ã‹ã™ +ã¨ããŠã‚Š +ã¨ãã¨ã‚™ã +ã¨ãã„ +ã¨ãã—ゅㆠ+ã¨ãã¦ã‚“ +ã¨ãã« +ã¨ãã¸ã‚™ã¤ +ã¨ã‘ã„ +ã¨ã‘ã‚‹ +ã¨ã“ã‚„ +ã¨ã•ã‹ +ã¨ã—ょã‹ã‚“ +ã¨ãㆠ+ã¨ãŸã‚“ +ã¨ã¡ã‚…ㆠ+ã¨ã£ãゅㆠ+ã¨ã£ãã‚“ +ã¨ã¤ã›ã‚™ã‚“ +ã¨ã¤ã«ã‚…ㆠ+ã¨ã¨ã‚™ã‘ã‚‹ +ã¨ã¨ã®ãˆã‚‹ +ã¨ãªã„ +ã¨ãªãˆã‚‹ +ã¨ãªã‚Š +ã¨ã®ã•ã¾ +ã¨ã¯ã‚™ã™ +ã¨ã‚™ãµã‚™ã‹ã‚™ã‚ +ã¨ã»ã† +ã¨ã¾ã‚‹ +ã¨ã‚ã‚‹ +ã¨ã‚‚ãŸã‚™ã¡ +ã¨ã‚‚ã‚‹ +ã¨ã‚™ã‚ˆã†ã²ã‚™ +ã¨ã‚‰ãˆã‚‹ +ã¨ã‚“ã‹ã¤ +ã¨ã‚™ã‚“ãµã‚™ã‚Š +ãªã„ã‹ã +ãªã„ã“ㆠ+ãªã„ã—ょ +ãªã„ã™ +ãªã„ã›ã‚“ +ãªã„ãㆠ+ãªãŠã™ +ãªã‹ã‚™ã„ +ãªãã™ +ãªã‘゙る +ãªã“ã†ã¨ã‚™ +ãªã•ã‘ +ãªãŸã¦ã‚™ã“ã“ +ãªã£ã¨ã† +ãªã¤ã‚„ã™ã¿ +ãªãªãŠã— +ãªã«ã“゙㨠+ãªã«ã‚‚ã® +ãªã«ã‚ +ãªã®ã‹ +ãªãµãŸã‚™ +ãªã¾ã„ã +ãªã¾ãˆ +ãªã¾ã¿ +ãªã¿ãŸã‚™ +ãªã‚ら㋠+ãªã‚ã‚‹ +ãªã‚„ã‚€ +ãªã‚‰ã† +ãªã‚‰ã²ã‚™ +ãªã‚‰ãµã‚™ +ãªã‚Œã‚‹ +ãªã‚ã¨ã²ã‚™ +ãªã‚ã¯ã‚™ã‚Š +ã«ã‚ㆠ+ã«ã„ã‹ã‚™ãŸ +ã«ã†ã‘ +ã«ãŠã„ +ã«ã‹ã„ +ã«ã‹ã‚™ã¦ +ã«ãã²ã‚™ +ã«ãã—ã¿ +ã«ãã¾ã‚“ +ã«ã‘゙る +ã«ã•ã‚“ã‹ãŸã‚“ã +ã«ã—ã +ã«ã›ã‚‚ã® +ã«ã¡ã—゙ょㆠ+ã«ã¡ã‚ˆã†ã²ã‚™ +ã«ã£ã‹ +ã«ã£ã +ã«ã£ã‘ã„ +ã«ã£ã“ㆠ+ã«ã£ã•ã‚“ +ã«ã£ã—ょã +ã«ã£ã™ã† +ã«ã£ã›ã +ã«ã£ã¦ã„ +ã«ãªã† +ã«ã»ã‚“ +ã«ã¾ã‚ +ã«ã‚‚㤠+ã«ã‚„ã‚Š +ã«ã‚…ã†ã„ã‚“ +ã«ã‚Šã‚“ã—ゃ +ã«ã‚ã¨ã‚Š +ã«ã‚“ã„ +ã«ã‚“ã‹ +ã«ã‚“ã +ã«ã‚“ã‘゙ん +ã«ã‚“ã—ã +ã«ã‚“ã™ã‚™ã† +ã«ã‚“ãㆠ+ã«ã‚“ãŸã„ +ã«ã‚“ã¡ +ã«ã‚“ã¦ã„ +ã«ã‚“ã«ã +ã«ã‚“ãµã‚š +ã«ã‚“ã¾ã‚Š +ã«ã‚“ã‚€ +ã«ã‚“ã‚ã„ +ã«ã‚“よㆠ+ã¬ã„ããã‚™ +ã¬ã‹ã™ +ã¬ãã‚™ã„ã¨ã‚‹ +ã¬ã゙ㆠ+ã¬ãã‚‚ã‚Š +ã¬ã™ã‚€ +ã¬ã¾ãˆã²ã‚™ +ã¬ã‚ã‚Š +ã¬ã‚‰ã™ +ã¬ã‚“ã¡ã‚ƒã +ã­ã‚ã‘ã‚™ +ã­ã„ã +ã­ã„ã‚‹ +ã­ã„ã‚ +ã­ã゙㛠+ã­ããŸã„ +ã­ãら +ã­ã“ã›ã‚™ +ã­ã“ã‚€ +ã­ã•ã‘ã‚™ +ã­ã™ã“゙㙠+ã­ãã¸ã‚™ã‚‹ +ã­ãŸã‚™ã‚“ +ã­ã¤ã„ +ã­ã£ã—ã‚“ +ã­ã¤ã゙ㆠ+ã­ã£ãŸã„ã゙ょ +ã­ãµã‚™ãã +ã­ãµãŸã‚™ +ã­ã»ã‚™ã† +ã­ã»ã‚Šã¯ã»ã‚Š +ã­ã¾ã +ã­ã¾ã‚ã— +ã­ã¿ã¿ +ã­ã‚€ã„ +ã­ã‚€ãŸã„ +ã­ã‚‚㨠+ã­ã‚‰ã† +ã­ã‚ã•ã‚™ +ã­ã‚“ã„ã‚Š +ã­ã‚“ãŠã— +ã­ã‚“ã‹ã‚“ +ã­ã‚“ãã‚“ +ã­ã‚“ãã‚™ +ã­ã‚“ã•ã‚™ +ã­ã‚“ã— +ã­ã‚“ã¡ã‚ƒã +ã­ã‚“ã¨ã‚™ +ã­ã‚“ã²ã‚š +ã­ã‚“ãµã‚™ã¤ +ã­ã‚“ã¾ã¤ +ã­ã‚“りょㆠ+ã­ã‚“れㄠ+ã®ã„ã™ã‚™ +ã®ãŠã¤ã‚™ã¾ +ã®ã‹ã‚™ã™ +ã®ããªã¿ +ã®ã“ã゙り +ã®ã“ã™ +ã®ã“ã‚‹ +ã®ã›ã‚‹ +ã®ãã‚™ã +ã®ã゙む +ã®ãŸã¾ã† +ã®ã¡ã»ã¨ã‚™ +ã®ã£ã +ã®ã¯ã‚™ã™ +ã®ã¯ã‚‰ +ã®ã¸ã‚™ã‚‹ +ã®ã»ã‚™ã‚‹ +ã®ã¿ã‚‚ã® +ã®ã‚„ã¾ +ã®ã‚‰ã„㬠+ã®ã‚‰ã­ã“ +ã®ã‚Šã‚‚ã® +ã®ã‚Šã‚†ã +ã®ã‚Œã‚“ +ã®ã‚“ã +ã¯ã‚™ã‚ã„ +ã¯ã‚ã +ã¯ã‚™ã‚ã•ã‚“ +ã¯ã‚™ã„ã‹ +ã¯ã‚™ã„ã +ã¯ã„ã‘ã‚“ +ã¯ã„ã“ã‚™ +ã¯ã„ã—ã‚“ +ã¯ã„ã™ã„ +ã¯ã„ã›ã‚“ +ã¯ã„ãㆠ+ã¯ã„ã¡ +ã¯ã‚™ã„ã¯ã‚™ã„ +ã¯ã„れ㤠+ã¯ãˆã‚‹ +ã¯ãŠã‚‹ +ã¯ã‹ã„ +ã¯ã‚™ã‹ã‚Š +ã¯ã‹ã‚‹ +ã¯ãã—ã‚… +ã¯ã‘ã‚“ +ã¯ã“ãµã‚™ +ã¯ã•ã¿ +ã¯ã•ã‚“ +ã¯ã—ã“ã‚™ +ã¯ã‚™ã—ょ +ã¯ã—ã‚‹ +ã¯ã›ã‚‹ +ã¯ã‚šãã“ã‚“ +ã¯ãã‚“ +ã¯ãŸã‚“ +ã¯ã¡ã¿ã¤ +ã¯ã¤ãŠã‚“ +ã¯ã£ã‹ã +ã¯ã¤ã‚™ã +ã¯ã£ãã‚Š +ã¯ã£ã㤠+ã¯ã£ã‘ã‚“ +ã¯ã£ã“ㆠ+ã¯ã£ã•ã‚“ +ã¯ã£ã—ã‚“ +ã¯ã£ãŸã¤ +ã¯ã£ã¡ã‚…ㆠ+ã¯ã£ã¦ã‚“ +ã¯ã£ã²ã‚šã‚‡ã† +ã¯ã£ã»ã‚šã† +ã¯ãªã™ +ã¯ãªã²ã‚™ +ã¯ã«ã‹ã‚€ +ã¯ãµã‚™ã‚‰ã— +ã¯ã¿ã‹ã‚™ã +ã¯ã‚€ã‹ã† +ã¯ã‚㤠+ã¯ã‚„ã„ +ã¯ã‚„ã— +ã¯ã‚‰ã† +ã¯ã‚ã†ãƒã‚“ +ã¯ã‚ã„ +ã¯ã‚“ã„ +ã¯ã‚“ãˆã„ +ã¯ã‚“ãŠã‚“ +ã¯ã‚“ã‹ã +ã¯ã‚“ãょㆠ+ã¯ã‚™ã‚“ã゙㿠+ã¯ã‚“ã“ +ã¯ã‚“ã—ゃ +ã¯ã‚“ã™ã† +ã¯ã‚“ãŸã‚™ã‚“ +ã¯ã‚šã‚“ã¡ +ã¯ã‚šã‚“㤠+ã¯ã‚“ã¦ã„ +ã¯ã‚“ã¨ã— +ã¯ã‚“ã®ã† +ã¯ã‚“ã¯ã‚š +ã¯ã‚“ãµã‚™ã‚“ +ã¯ã‚“ã¸ã‚šã‚“ +ã¯ã‚“ã»ã‚™ã†ã +ã¯ã‚“ã‚ã„ +ã¯ã‚“らん +ã¯ã‚“ã‚ã‚“ +ã²ã„ã +ã²ã†ã‚“ +ã²ãˆã‚‹ +ã²ã‹ã +ã²ã‹ã‚Š +ã²ã‹ã‚‹ +ã²ã‹ã‚“ +ã²ãã„ +ã²ã‘㤠+ã²ã“ã†ã +ã²ã“ã +ã²ã•ã„ +ã²ã•ã—ãµã‚™ã‚Š +ã²ã•ã‚“ +ã²ã‚™ã—゙ゅã¤ã‹ã‚“ +ã²ã—ょ +ã²ãã‹ +ã²ãã‚€ +ã²ãŸã‚€ã +ã²ãŸã‚™ã‚Š +ã²ãŸã‚‹ +ã²ã¤ãã‚™ +ã²ã£ã“ã— +ã²ã£ã— +ã²ã¤ã—゙ゅã²ã‚“ +ã²ã£ã™ +ã²ã¤ã›ã‚™ã‚“ +ã²ã‚šã£ãŸã‚Š +ã²ã‚šã£ã¡ã‚Š +ã²ã¤ã‚ˆã† +ã²ã¦ã„ +ã²ã¨ã“゙㿠+ã²ãªã¾ã¤ã‚Š +ã²ãªã‚“ +ã²ã­ã‚‹ +ã²ã¯ã‚“ +ã²ã²ã‚™ã +ã²ã²ã‚‡ã† +ã²ã»ã† +ã²ã¾ã‚ã‚Š +ã²ã¾ã‚“ +ã²ã¿ã¤ +ã²ã‚ã„ +ã²ã‚ã—゙㗠+ã²ã‚„ã‘ +ã²ã‚„ã™ +ã²ã‚ˆã† +ã²ã‚™ã‚‡ã†ã +ã²ã‚‰ã‹ã‚™ãª +ã²ã‚‰ã +ã²ã‚Šã¤ +ã²ã‚Šã‚‡ã† +ã²ã‚‹ã¾ +ã²ã‚‹ã‚„ã™ã¿ +ã²ã‚Œã„ +ã²ã‚ã„ +ã²ã‚ㆠ+ã²ã‚ã +ã²ã‚ゆã +ã²ã‚“ã‹ã +ã²ã‚“ã‘㤠+ã²ã‚“ã“ã‚“ +ã²ã‚“ã—ã‚… +ã²ã‚“ãㆠ+ã²ã‚šã‚“ã¡ +ã²ã‚“ã¯ã‚šã‚“ +ã²ã‚™ã‚“ã»ã‚™ã† +ãµã‚ã‚“ +ãµã„ã†ã¡ +ãµã†ã‘ã„ +ãµã†ã›ã‚“ +ãµã‚šã†ãŸã‚ㆠ+ãµã†ã¨ã† +ãµã†ãµ +ãµãˆã‚‹ +ãµãŠã‚“ +ãµã‹ã„ +ãµãã‚“ +ãµãã•ã‚™ã¤ +ãµããµã‚™ãã‚ +ãµã“ㆠ+ãµã•ã„ +ãµã—ãã‚™ +ãµã—゙㿠+ãµã™ã¾ +ãµã›ã„ +ãµã›ãã‚™ +ãµãã +ãµã‚™ãŸã«ã +ãµãŸã‚“ +ãµã¡ã‚‡ã† +ãµã¤ã† +ãµã¤ã‹ +ãµã£ã‹ã¤ +ãµã£ã +ãµã£ã“ã +ãµã‚™ã¨ã‚™ã† +ãµã¨ã‚‹ +ãµã¨ã‚“ +ãµã®ã† +ãµã¯ã„ +ãµã²ã‚‡ã† +ãµã¸ã‚“ +ãµã¾ã‚“ +ãµã¿ã‚“ +ãµã‚㤠+ãµã‚ã‚“ +ãµã‚ˆã† +ãµã‚Šã“ +ãµã‚Šã‚‹ +ãµã‚‹ã„ +ãµã‚“ã„ã +ãµã‚™ã‚“ã‹ã‚™ã +ãµã‚™ã‚“ãã‚™ +ãµã‚“ã—㤠+ãµã‚™ã‚“ã›ã +ãµã‚“ãㆠ+ãµã‚™ã‚“ã»ã‚šã† +ã¸ã„ã‚ã‚“ +ã¸ã„ãŠã‚“ +ã¸ã„ã‹ã‚™ã„ +ã¸ã„ã +ã¸ã„ã‘゙ん +ã¸ã„ã“ㆠ+ã¸ã„ã• +ã¸ã„ã—ゃ +ã¸ã„ã›ã¤ +ã¸ã„ã +ã¸ã„ãŸã +ã¸ã„ã¦ã‚“ +ã¸ã„ã­ã¤ +ã¸ã„ã‚ +ã¸ãã‹ã‚™ +ã¸ã“ã‚€ +ã¸ã‚™ã«ã„ã‚ +ã¸ã‚™ã«ã—ょã†ã‹ã‚™ +ã¸ã‚‰ã™ +ã¸ã‚“ã‹ã‚“ +ã¸ã‚™ã‚“ãょㆠ+ã¸ã‚™ã‚“ã“゙㗠+ã¸ã‚“ã•ã„ +ã¸ã‚“ãŸã„ +ã¸ã‚™ã‚“ã‚Š +ã»ã‚ã‚“ +ã»ã„ã +ã»ã‚™ã†ã゙ょ +ã»ã†ã“ã +ã»ã†ãㆠ+ã»ã†ã»ã† +ã»ã†ã‚‚ã‚“ +ã»ã†ã‚Šã¤ +ã»ãˆã‚‹ +ã»ãŠã‚“ +ã»ã‹ã‚“ +ã»ãょㆠ+ã»ã‚™ãã‚“ +ã»ãã‚ +ã»ã‘㤠+ã»ã‘ã‚“ +ã»ã“ㆠ+ã»ã“ã‚‹ +ã»ã—ã„ +ã»ã—㤠+ã»ã—ã‚… +ã»ã—ょㆠ+ã»ã›ã„ +ã»ãã„ +ã»ãã +ã»ãŸã¦ +ã»ãŸã‚‹ +ã»ã‚šã¡ãµã‚™ãã‚ +ã»ã£ãょã +ã»ã£ã• +ã»ã£ãŸã‚“ +ã»ã¨ã‚“ã¨ã‚™ +ã»ã‚ã‚‹ +ã»ã‚“ã„ +ã»ã‚“ã +ã»ã‚“ã‘ +ã»ã‚“ã—㤠+ã»ã‚“ã‚„ã +ã¾ã„ã«ã¡ +ã¾ã‹ã„ +ã¾ã‹ã›ã‚‹ +ã¾ã‹ã‚™ã‚‹ +ã¾ã‘ã‚‹ +ã¾ã“㨠+ã¾ã•ã¤ +ã¾ã—゙゠+ã¾ã™ã +ã¾ã›ã‚™ã‚‹ +ã¾ã¤ã‚Š +ã¾ã¨ã‚ +ã¾ãªãµã‚™ +ã¾ã¬ã‘ +ã¾ã­ã +ã¾ã»ã† +ã¾ã‚‚ã‚‹ +ã¾ã‚†ã‘ã‚™ +ã¾ã‚ˆã† +ã¾ã‚ã‚„ã‹ +ã¾ã‚ã™ +ã¾ã‚ã‚Š +ã¾ã‚ã‚‹ +ã¾ã‚“ã‹ã‚™ +ã¾ã‚“ã㤠+ã¾ã‚“ãã‚™ã +ã¾ã‚“ãªã‹ +ã¿ã„ら +ã¿ã†ã¡ +ã¿ãˆã‚‹ +ã¿ã‹ã‚™ã +ã¿ã‹ãŸ +ã¿ã‹ã‚“ +ã¿ã‘ã‚“ +ã¿ã“ã‚“ +ã¿ã—ã‚™ã‹ã„ +ã¿ã™ã„ +ã¿ã™ãˆã‚‹ +ã¿ã›ã‚‹ +ã¿ã£ã‹ +ã¿ã¤ã‹ã‚‹ +ã¿ã¤ã‘ã‚‹ +ã¿ã¦ã„ +ã¿ã¨ã‚ã‚‹ +ã¿ãªã¨ +ã¿ãªã¿ã‹ã•ã„ +ã¿ã­ã‚‰ã‚‹ +ã¿ã®ã† +ã¿ã®ã‹ã‚™ã™ +ã¿ã»ã‚“ +ã¿ã‚‚㨠+ã¿ã‚„ã‘ã‚™ +ã¿ã‚‰ã„ +ã¿ã‚Šã‚‡ã +ã¿ã‚ã +ã¿ã‚“ã‹ +ã¿ã‚“ãã‚™ã +ã‚€ã„ã‹ +ã‚€ãˆã +ã‚€ãˆã‚“ +ã‚€ã‹ã„ +ã‚€ã‹ã† +ã‚€ã‹ãˆ +ã‚€ã‹ã— +ã‚€ãã‚™ã¡ã‚ƒ +ã‚€ã‘ã‚‹ +ã‚€ã‘゙ん +ã‚€ã•ã»ã‚™ã‚‹ +ã‚€ã—ã‚ã¤ã„ +ã‚€ã—ã¯ã‚™ +ã‚€ã—゙ゅん +ã‚€ã—ã‚ +ã‚€ã™ã† +ã‚€ã™ã“ +ã‚€ã™ãµã‚™ +ã‚€ã™ã‚ +ã‚€ã›ã‚‹ +ã‚€ã›ã‚“ +ã‚€ã¡ã‚…ㆠ+ã‚€ãªã—ã„ +ã‚€ã®ã† +むや㿠+むよㆠ+むらã•ã +むりょㆠ+ã‚€ã‚ã‚“ +ã‚ã„ã‚ã‚“ +ã‚ã„ã†ã‚“ +ã‚ã„ãˆã‚“ +ã‚ã„ã‹ã +ã‚ã„ãょã +ã‚ã„ã•ã„ +ã‚ã„ã— +ã‚ã„ãㆠ+ã‚ã„ãµã‚™ã¤ +ã‚ã„れㄠ+ã‚ã„ã‚ã +ã‚ãã‚™ã¾ã‚Œã‚‹ +ã‚ã•ã‚™ã™ +ã‚ã—㟠+ã‚ã™ã‚™ã‚‰ã—ã„ +ã‚ãŸã‚™ã¤ +ã‚ã¾ã„ +ã‚ã‚„ã™ +ã‚ã‚“ãょ +ã‚ã‚“ã›ã +ã‚ã‚“ã¨ã‚™ã† +ã‚‚ã†ã—ã‚ã‘゙る +ã‚‚ã†ã¨ã‚™ã†ã‘ã‚“ +ã‚‚ãˆã‚‹ +ã‚‚ãã— +ã‚‚ãã¦ã +ã‚‚ãよã†ã²ã‚™ +ã‚‚ã¡ã‚ã‚“ +ã‚‚ã¨ã‚™ã‚‹ +もらㆠ+ã‚‚ã‚“ã +ã‚‚ã‚“ãŸã‚™ã„ +ã‚„ãŠã‚„ +ã‚„ã‘ã‚‹ +ã‚„ã•ã„ +ã‚„ã•ã—ã„ +ã‚„ã™ã„ +ã‚„ã™ãŸã‚ㆠ+ã‚„ã™ã¿ +ã‚„ã›ã‚‹ +ã‚„ãㆠ+ã‚„ãŸã„ +ã‚„ã¡ã‚“ +ã‚„ã£ã¨ +ã‚„ã£ã¯ã‚šã‚Š +ã‚„ãµã‚™ã‚‹ +ã‚„ã‚ã‚‹ +ã‚„ã‚„ã“ã—ã„ +やよㄠ+ã‚„ã‚らã‹ã„ +ゆã†ã +ゆã†ã²ã‚™ã‚“ãょã +ゆã†ã¸ã‚™ +ゆã†ã‚ã„ +ゆã‘㤠+ゆã—ゅ㤠+ゆã›ã‚“ +ゆãㆠ+ゆãŸã‹ +ゆã¡ã‚ƒã +ゆã¦ã‚™ã‚‹ +ゆã«ã‚…ㆠ+ゆã²ã‚™ã‚ +ゆらㄠ+ゆれる +よã†ã„ +よã†ã‹ +よã†ãゅㆠ+よã†ã—ã‚™ +よã†ã™ +よã†ã¡ãˆã‚“ +よã‹ã›ã‚™ +よã‹ã‚“ +よãã‚“ +よãã›ã„ +よãã»ã‚™ã† +よã‘ã„ +よã“゙れる +よã•ã‚“ +よã—ゅㆠ+よãㆠ+よãã +よã£ã‹ +よã¦ã„ +よã¨ã‚™ã‹ã‚™ã‚ã +よã­ã¤ +よやã +よゆㆠ+よã‚ã“ãµã‚™ +よã‚ã—ã„ +らã„ㆠ+らãã‹ã‚™ã +らãã“ã‚™ +らãã•ã¤ +らããŸã‚™ +らã—ã‚“ã¯ã‚™ã‚“ +らã›ã‚“ +らãã‚™ã +らãŸã„ +らã£ã‹ +られ㤠+ã‚Šãˆã +ã‚Šã‹ã„ +ã‚Šãã•ã +ã‚Šãã›ã¤ +ã‚Šãã゙ん +ã‚Šã㤠+ã‚Šã‘ã‚“ +ã‚Šã“ㆠ+ã‚Šã›ã„ +ã‚Šãㆠ+ã‚Šãã +ã‚Šã¦ã‚“ +ã‚Šã­ã‚“ +りゆㆠ+ã‚Šã‚…ã†ã‹ã‚™ã +りよㆠ+りょã†ã‚Š +りょã‹ã‚“ +りょãã¡ã‚ƒ +りょã“ㆠ+ã‚Šã‚Šã +ã‚Šã‚Œã +ã‚Šã‚ã‚“ +ã‚Šã‚“ã“ã‚™ +ã‚‹ã„ã‘ã„ +ã‚‹ã„ã•ã„ +ã‚‹ã„ã—ã‚™ +ã‚‹ã„ã›ã +ã‚‹ã™ã¯ã‚™ã‚“ +ã‚‹ã‚Šã‹ã‚™ã‚ら +ã‚Œã„ã‹ã‚“ +ã‚Œã„ãã‚™ +ã‚Œã„ã›ã„ +ã‚Œã„ãã‚™ã†ã“ +ã‚Œã„ã¨ã† +ã‚Œã„ã»ã‚™ã† +ã‚Œãã— +ã‚ŒããŸã‚™ã„ +れんã‚ã„ +れんã‘ã„ +れんã“ã‚“ +れんã•ã„ +れんã—ゅㆠ+れんãã‚™ã +れんらã +ã‚ã†ã‹ +ã‚ã†ã“ã‚™ +ã‚ã†ã—゙ん +ã‚ã†ãã +ã‚ãã‹ã‚™ +ã‚ã“㤠+ã‚ã—ã‚™ã†ã‚‰ +ã‚ã—ゅ㤠+ã‚ã›ã‚“ +ã‚ã¦ã‚“ +ã‚ã‚ã‚“ +ã‚れ㤠+ã‚ã‚“ãã‚™ +ã‚ã‚“ã¯ã‚š +ã‚ã‚“ãµã‚™ã‚“ +ã‚ã‚“ã‚Š +ã‚ã‹ã™ +ã‚ã‹ã‚ +ã‚ã‹ã‚„ã¾ +ã‚ã‹ã‚Œã‚‹ +ã‚ã—㤠+ã‚ã—ã‚™ã¾ã— +ã‚ã™ã‚Œã‚‚ã® +ã‚らㆠ+ã‚れる +` diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/wordlists/korean.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/wordlists/korean.go new file mode 100644 index 00000000..1d317756 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/wordlists/korean.go @@ -0,0 +1,2071 @@ +package wordlists + +import ( + "fmt" + "hash/crc32" + "strings" +) + +func init() { + // Ensure word list is correct + // $ wget https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/korean.txt + // $ crc32 korean.txt + // 4ef461eb + checksum := crc32.ChecksumIEEE([]byte(korean)) + if fmt.Sprintf("%x", checksum) != "4ef461eb" { + panic("korean checksum invalid") + } +} + +// Korean is a slice of mnemonic words taken from the bip39 specification +// https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/korean.txt +var Korean = strings.Split(strings.TrimSpace(korean), "\n") +var korean = `가격 +가á„ᅳᆷ +가난 +가능 +가득 +가르침 +가뭄 +가방 +가상 +가슴 +가운데 +가을 +가이드 +가입 +가장 +가정 +가족 +가죽 +각오 +각자 +간격 +간부 +간섭 +간장 +간접 +간판 +갈등 +갈비 +갈색 +갈증 +감각 +감기 +감소 +감수성 +감자 +감정 +갑자기 +강남 +강당 +강도 +강력히 +강변 +강북 +강사 +강수량 +강아지 +강원도 +강의 +강제 +강조 +같이 +개구리 +개나리 +개방 +개별 +개선 +개성 +개인 +객관적 +거실 +거액 +거울 +거짓 +거품 +걱정 +건강 +건물 +건설 +건조 +건축 +걸음 +검사 +검á„á…© +게시판 +게임 +겨울 +견해 +결과 +결국 +결론 +결석 +결승 +결심 +결정 +결혼 +경계 +경고 +경기 +경력 +경복궁 +경비 +경상도 +경영 +경우 +경쟁 +경제 +경주 +경찰 +경치 +경향 +경험 +계곡 +계단 +계란 +계산 +계속 +계약 +계절 +계층 +계획 +고객 +고구려 +고궁 +고급 +고등학생 +고무신 +고민 +고양이 +고장 +고전 +고집 +고춧가루 +고á„ᅩᆼ +고향 +곡식 +골목 +골á„ᅡ기 +골프 +공간 +공개 +공격 +공군 +공급 +공기 +공동 +공무원 +공부 +공사 +공식 +공업 +공연 +공원 +공장 +공á„á…¡ +공책 +공á„ᅩᆼ +공포 +공항 +공휴일 +과목 +과일 +과장 +과정 +과학 +관객 +관계 +관광 +관념 +관람 +관련 +관리 +관습 +관심 +관점 +관찰 +광경 +광고 +광장 +광주 +괴로움 +굉장히 +교과서 +교문 +교복 +교실 +교양 +교육 +교장 +교직 +교á„ᅩᆼ +교환 +교훈 +구경 +구름 +구멍 +구별 +구분 +구석 +구성 +구속 +구역 +구입 +구청 +구체적 +국가 +국기 +국내 +국립 +국물 +국민 +국수 +국어 +국왕 +국적 +국제 +국회 +군대 +군사 +군인 +궁극적 +권리 +권위 +권á„á…® +귀국 +귀신 +규정 +규칙 +균형 +그날 +그냥 +그늘 +그러나 +그룹 +그릇 +그림 +그제서야 +그á„ᅩ록 +극복 +극히 +근거 +근교 +근래 +근로 +근무 +근본 +근원 +근육 +근처 +글씨 +글자 +금강산 +금고 +금년 +금메달 +금액 +금연 +금요일 +금지 +긍정적 +기간 +기관 +기념 +기능 +기독교 +기둥 +기록 +기름 +기법 +기본 +기분 +기쁨 +기숙사 +기술 +기억 +기업 +기온 +기운 +기원 +기적 +기준 +기침 +기혼 +기획 +긴급 +긴장 +길이 +김밥 +김치 +김포공항 +á„ᅡᆨ두기 +á„ᅡᆷ빡 +á„ᅢ달음 +á„ᅢ소금 +á„ᅥᆸ질 +á„ᅩᆨ대기 +á„ᅩᆾ이ᇠ+나들이 +나란히 +나머지 +나물 +나침반 +나흘 +낙엽 +난방 +날개 +날씨 +날á„á…¡ +남녀 +남대문 +남매 +남산 +남자 +남편 +남학생 +낭비 +낱말 +내년 +내용 +내일 +냄비 +냄새 +냇물 +냉동 +냉면 +냉방 +냉장고 +넥á„á…¡á„‹á…µ +넷á„á…¢ +노동 +노란색 +노력 +노인 +녹음 +녹차 +녹화 +논리 +논문 +논쟁 +놀이 +농구 +농담 +농민 +농부 +농업 +농장 +농촌 +á„‚á…©á‡á„‹á…µ +눈동자 +눈물 +눈썹 +뉴욕 +á„‚á…³á„ᅵᆷ +늑대 +능동적 +능력 +다방 +다양성 +다음 +다이어á„á…³ +다행 +단계 +단골 +단독 +단맛 +단순 +단어 +단위 +단점 +단체 +단추 +단편 +단풍 +달걀 +달러 +달력 +달리 +닭고기 +담당 +담배 +담요 +담임 +답변 +답장 +당근 +당분간 +당연히 +당장 +대규모 +대낮 +대단히 +대답 +대도시 +대략 +대량 +대륙 +대문 +대부분 +대신 +대응 +대장 +대전 +대접 +대중 +대책 +대출 +대충 +대á„ᅩᆼ령 +대학 +대한민국 +대합실 +대형 +덩어리 +데이á„á…³ +도대체 +도덕 +도둑 +도망 +도서관 +도심 +도움 +도입 +도자기 +도저히 +도전 +도중 +도착 +독감 +독립 +독서 +독일 +독창적 +동화책 +뒷모습 +뒷산 +딸아이 +마누라 +마늘 +마당 +마라á„ᅩᆫ +마련 +마무리 +마사지 +마약 +마요네즈 +마을 +마음 +마이á„á…³ +마중 +마지막 +마찬가지 +마찰 +마흔 +막걸리 +막내 +막상 +만남 +만두 +만세 +만약 +만일 +만점 +만족 +만화 +많이 +말기 +말씀 +말á„á…® +맘대로 +망원경 +매년 +매달 +매력 +매번 +매스á„ᅥᆷ +매일 +매장 +맥주 +먹이 +먼저 +먼지 +멀리 +메일 +며느리 +며칠 +면담 +멸치 +명단 +명령 +명예 +명의 +명절 +명칭 +명함 +모금 +모니á„á…¥ +모델 +모든 +모범 +모습 +모양 +모임 +모조리 +모집 +모á„ᅮᆼ이 +목걸이 +목록 +목사 +목소리 +목숨 +목적 +목표 +몰래 +몸매 +몸무게 +몸살 +몸속 +몸짓 +몸á„ᅩᆼ +몹시 +무관심 +무궁화 +무더위 +무덤 +무르ᇠ+무슨 +무엇 +무역 +무용 +무조건 +무지개 +무척 +문구 +문득 +문법 +문서 +문제 +문학 +문화 +물가 +물건 +물결 +물고기 +물론 +물리학 +물음 +물질 +물체 +미국 +미디어 +미사일 +미술 +미역 +미용실 +미움 +미인 +미á„ᅵᆼ +미혼 +민간 +민족 +민주 +믿음 +밀가루 +밀리미á„á…¥ +밑바닥 +바가지 +바구니 +바나나 +바늘 +바닥 +바닷가 +바람 +바이러스 +바á„ᅡᆼ +박물관 +박사 +박수 +반대 +반드시 +반말 +반발 +반성 +반응 +반장 +반죽 +반지 +반찬 +받침 +발가락 +발걸음 +발견 +발달 +발레 +발목 +발바닥 +발생 +발음 +발자국 +발전 +발á„ᅩᆸ +발표 +밤하늘 +밥그릇 +밥맛 +밥상 +밥솥 +방금 +방면 +방문 +방바닥 +방법 +방송 +방식 +방안 +방울 +방지 +방학 +방해 +방향 +배경 +배á„ᅩᆸ +배달 +배드민á„ᅥᆫ +백두산 +백색 +백성 +백인 +백제 +백화점 +버릇 +버섯 +버á„ᅳᆫ +번개 +번역 +번지 +번호 +벌금 +벌레 +벌써 +범위 +범인 +범죄 +법률 +법원 +법적 +법칙 +베이징 +벨á„á…³ +변경 +변동 +변명 +변신 +변호사 +변화 +별도 +별명 +별일 +병실 +병아리 +병원 +보관 +보너스 +보라색 +보람 +보름 +보상 +보안 +보자기 +보장 +보전 +보존 +보á„ᅩᆼ +보편적 +보험 +복도 +복사 +복숭아 +복습 +볶음 +본격적 +본래 +본부 +본사 +본성 +본인 +본질 +볼펜 +봉사 +봉지 +봉á„á…® +부근 +부á„ᅳ러움 +부담 +부동산 +부문 +부분 +부산 +부상 +부엌 +부인 +부작용 +부장 +부정 +부족 +부지런히 +부친 +부á„ᅡᆨ +부품 +부회장 +북부 +북한 +분노 +분량 +분리 +분명 +분석 +분야 +분위기 +분필 +분홍색 +불고기 +불과 +불교 +불á„ᅩᆾ +불만 +불법 +불빛 +불안 +불이익 +불행 +브랜드 +비극 +비난 +비닐 +비둘기 +비디오 +비로소 +비만 +비명 +비밀 +비바람 +비빔밥 +비상 +비용 +비율 +비중 +비á„ᅡ민 +비판 +빌딩 +빗물 +빗방울 +빗줄기 +빛á„ᅡᆯ +빨간색 +빨래 +빨리 +사건 +사계절 +사나이 +사냥 +사람 +사랑 +사립 +사모님 +사물 +사방 +사상 +사생활 +사설 +사슴 +사실 +사업 +사용 +사월 +사장 +사전 +사진 +사촌 +사춘기 +사á„ᅡᆼ +사á„ᅮ리 +사흘 +산길 +산부인과 +산업 +산책 +살림 +살인 +살á„ᅡᆨ +삼계á„ᅡᆼ +삼국 +삼십 +삼월 +삼촌 +상관 +상금 +상대 +상류 +상반기 +상상 +상식 +상업 +상인 +상자 +상점 +상처 +상추 +상á„á…¢ +상표 +상품 +상황 +새벽 +색á„ᅡᆯ +색연필 +생각 +생명 +생물 +생방송 +생산 +생선 +생신 +생일 +생활 +서랍 +서른 +서명 +서민 +서비스 +서양 +서울 +서적 +서점 +서á„ᅩᆨ +서á„ᅳᆯ +석사 +석유 +선거 +선물 +선배 +선생 +선수 +선원 +선장 +선전 +선á„ᅢᆨ +선풍기 +설거지 +설날 +설렁á„ᅡᆼ +설명 +설문 +설사 +설악산 +설치 +설á„ᅡᆼ +섭씨 +성공 +성당 +성명 +성별 +성인 +성장 +성적 +성질 +성함 +세금 +세미나 +세상 +세월 +세종대왕 +세á„ᅡᆨ +센á„á…¥ +센á„ᅵ미á„á…¥ +셋á„á…¢ +소규모 +소극적 +소금 +소나기 +소년 +소득 +소망 +소문 +소설 +소속 +소아과 +소용 +소원 +소음 +소중히 +소지품 +소질 +소풍 +소형 +속담 +속도 +속옷 +손가락 +손길 +손녀 +손님 +손등 +손목 +손뼉 +손실 +손질 +손á„ᅩᆸ +손해 +솔직히 +솜씨 +송아지 +송이 +송편 +쇠고기 +쇼핑 +수건 +수년 +수단 +수돗물 +수동적 +수면 +수명 +수박 +수상 +수석 +수술 +수시로 +수업 +수염 +수영 +수입 +수준 +수집 +수출 +수á„ᅥᆺ +수필 +수학 +수험생 +수화기 +숙녀 +숙소 +숙제 +순간 +순서 +순수 +순식간 +순위 +숟가락 +술병 +술집 +숫자 +스님 +스물 +스스로 +스승 +스웨á„á…¥ +스위치 +스á„ᅦ이á„á…³ +스á„ᅲ디오 +스á„ᅳ레스 +스포츠 +슬á„ᅥᆨ +슬픔 +습관 +습기 +승객 +승리 +승부 +승용차 +승진 +시각 +시간 +시골 +시금치 +시나리오 +시댁 +시리즈 +시멘á„á…³ +시민 +시부모 +시선 +시설 +시스á„ᅦᆷ +시아버지 +시어머니 +시월 +시인 +시일 +시작 +시장 +시절 +시점 +시중 +시즌 +시집 +시청 +시합 +시험 +식구 +식기 +식당 +식량 +식료품 +식물 +식빵 +식사 +식생활 +식초 +식á„ᅡᆨ +식품 +신고 +신규 +신념 +신문 +신발 +신비 +신사 +신세 +신용 +신제품 +신청 +신체 +신화 +실감 +실내 +실력 +실례 +실망 +실수 +실습 +실시 +실장 +실정 +실질적 +실천 +실체 +실á„ᅥᆺ +실á„á…¢ +실패 +실험 +실현 +심리 +심부름 +심사 +심장 +심정 +심판 +쌍둥이 +씨름 +씨앗 +아가씨 +아나운서 +아드님 +아들 +아쉬움 +아스팔á„á…³ +아시아 +아울러 +아저씨 +아줌마 +아직 +아침 +á„‹á…¡á„‘á…¡á„á…³ +아프리á„á…¡ +아픔 +아홉 +아흔 +악기 +악몽 +악수 +안개 +안경 +안과 +안내 +안녕 +안동 +안방 +안부 +안주 +알루미늄 +알á„ᅩ올 +암시 +암á„ᅥᆺ +압력 +á„‹á…¡á‡á„‚ᅡᆯ +á„‹á…¡á‡á„†á…®á†« +애인 +애정 +액수 +앨범 +야간 +야단 +야옹 +약간 +약국 +약속 +약수 +약점 +약품 +약혼녀 +양념 +양력 +양말 +양배추 +양주 +양파 +어둠 +어려움 +어른 +어젯밤 +á„‹á…¥á„ᅢᆻ든 +á„‹á…¥á„ᅥ다가 +á„‹á…¥á„ᅥᆫ지 +언니 +언덕 +언론 +언어 +얼굴 +얼른 +얼음 +얼핏 +엄마 +업무 +업종 +업체 +엉덩이 +엉망 +엉á„ᅥ리 +엊그제 +에너지 +에어á„ᅥᆫ +엔진 +여건 +여고생 +여관 +여군 +여권 +여대생 +여덟 +여동생 +여든 +여론 +여름 +여섯 +여성 +여왕 +여인 +여전히 +여직원 +여학생 +여행 +역사 +역시 +역할 +연결 +연구 +연극 +연기 +연락 +연설 +연세 +연속 +연습 +연애 +연예인 +연인 +연장 +연주 +연출 +연필 +연합 +연휴 +열기 +열매 +열쇠 +열심히 +열정 +열차 +열흘 +염려 +엽서 +영국 +영남 +영상 +영양 +영역 +영웅 +영원히 +영하 +영향 +영혼 +영화 +á„‹á…§á‡á„€á…®á„…á…µ +á„‹á…§á‡á„‡á…¡á†¼ +á„‹á…§á‡á„Œá…µá†¸ +예감 +예금 +예방 +예산 +예상 +예선 +예술 +예습 +예식장 +예약 +예전 +예절 +예정 +á„‹á…¨á„ᅥᆫ대 +옛날 +오늘 +오락 +오랫동안 +오렌지 +오로지 +오른발 +오븐 +오십 +오염 +오월 +오전 +오직 +오징어 +오페라 +오피스á„ᅦᆯ +오히려 +옥상 +옥수수 +온갖 +온라인 +온몸 +온종일 +온á„ᅩᆼ +올가을 +올림픽 +올해 +옷차림 +와이셔츠 +와인 +완성 +완전 +왕비 +왕자 +왜냐하면 +왠지 +외갓집 +외국 +외로움 +외삼촌 +외출 +외침 +외할머니 +왼발 +왼손 +왼á„ᅩᆨ +요금 +요일 +요즘 +요청 +용기 +용서 +용어 +우산 +우선 +우승 +우연히 +우정 +우체국 +우편 +운동 +운명 +운반 +운전 +운행 +울산 +울음 +움직임 +웃어른 +웃음 +워낙 +원고 +원래 +원서 +원숭이 +원인 +원장 +원피스 +월급 +월드á„ᅥᆸ +월세 +월요일 +á„‹á…°á„‹á…µá„á…¥ +위반 +위법 +위성 +위원 +위험 +위협 +윗사람 +유난히 +유럽 +유명 +유물 +유산 +유적 +유치원 +유학 +유행 +유형 +육군 +육상 +육십 +육체 +은행 +음력 +음료 +음반 +음성 +음식 +음악 +음주 +의견 +의논 +의문 +의복 +의식 +의심 +의외로 +의욕 +의원 +의학 +이것 +이곳 +이념 +이놈 +이달 +이대로 +이동 +이렇게 +이력서 +이론적 +이름 +이민 +이발소 +이별 +이불 +이빨 +이상 +이성 +이슬 +이야기 +이용 +이웃 +이월 +이윽고 +이익 +이전 +이중 +á„‹á…µá„ᅳᆮ날 +á„‹á…µá„ᅳᆯ +이혼 +인간 +인격 +인공 +인구 +인근 +인기 +인도 +인류 +인물 +인생 +인쇄 +인연 +인원 +인재 +인종 +인천 +인체 +인á„ᅥ넷 +인하 +인형 +일곱 +일기 +일단 +일대 +일등 +일반 +일본 +일부 +일상 +일생 +일손 +일요일 +일월 +일정 +일종 +일주일 +일á„ᅵᆨ +일체 +일치 +일행 +일회용 +임금 +임무 +입대 +입력 +입맛 +입사 +입술 +입시 +입원 +입장 +입학 +자가용 +자격 +자극 +자동 +자랑 +자부심 +자식 +자신 +자연 +자원 +자율 +자전거 +자정 +자존심 +자판 +작가 +작년 +작성 +작업 +작용 +작은딸 +작품 +잔디 +잔뜩 +잔치 +잘못 +잠á„ᅡᆫ +잠수함 +잠시 +잠옷 +잠자리 +잡지 +장관 +장군 +장기간 +장래 +장례 +장르 +장마 +장면 +장모 +장미 +장비 +장사 +장소 +장식 +장애인 +장인 +장점 +장차 +장학금 +재능 +재빨리 +재산 +재생 +재작년 +재정 +재채기 +재판 +재학 +재활용 +저것 +저고리 +저곳 +저녁 +저런 +저렇게 +저번 +저울 +저절로 +저축 +적극 +적당히 +적성 +적용 +적응 +전개 +전공 +전기 +전달 +전라도 +전망 +전문 +전반 +전부 +전세 +전시 +전용 +전자 +전쟁 +전주 +전철 +전체 +전á„ᅩᆼ +전혀 +전후 +절대 +절망 +절반 +절약 +절차 +점검 +점수 +점심 +점원 +점점 +점차 +접근 +접시 +접촉 +젓가락 +정거장 +정도 +정류장 +정리 +정말 +정면 +정문 +정반대 +정보 +정부 +정비 +정상 +정성 +정오 +정원 +정장 +정지 +정치 +정확히 +제공 +제과점 +제대로 +제목 +제발 +제법 +제삿날 +제안 +제일 +제작 +제주도 +제출 +제품 +제한 +조각 +조건 +조금 +조깅 +조명 +조미료 +조상 +조선 +조용히 +조절 +조정 +조직 +존댓말 +존재 +졸업 +졸음 +종교 +종로 +종류 +종소리 +종업원 +종종 +종합 +좌석 +죄인 +주관적 +주름 +주말 +주머니 +주먹 +주문 +주민 +주방 +주변 +주식 +주인 +주일 +주장 +주전자 +주á„ᅢᆨ +준비 +줄거리 +줄기 +줄무늬 +중간 +중계방송 +중국 +중년 +중단 +중독 +중반 +중부 +중세 +중소기업 +중순 +중앙 +중요 +중학교 +즉석 +즉시 +즐거움 +증가 +증거 +증권 +증상 +증세 +지각 +지갑 +지경 +지극히 +지금 +지급 +지능 +지름길 +지리산 +지방 +지붕 +지식 +지역 +지우개 +지원 +지적 +지점 +지진 +지출 +직선 +직업 +직원 +직장 +진급 +진동 +진로 +진료 +진리 +진á„á…¡ +진찰 +진출 +진á„ᅩᆼ +진행 +질문 +질병 +질서 +짐작 +집단 +집안 +집중 +á„ᅡ증 +á„á…µá„ᅥ기 +차남 +á„Žá…¡á„…á…¡á„…á…µ +차량 +차림 +차별 +차선 +차츰 +착각 +찬물 +찬성 +참가 +참기름 +참새 +참석 +참여 +참외 +참조 +찻잔 +창가 +창고 +창구 +창문 +창밖 +창작 +창조 +채널 +채점 +책가방 +책방 +책상 +책임 +챔피언 +처벌 +처음 +천국 +천둥 +천장 +천재 +천천히 +철도 +철저히 +철학 +첫날 +첫á„á…¢ +청년 +청바지 +청소 +청춘 +체계 +체력 +체온 +체육 +체중 +체험 +초등학생 +초반 +초밥 +초상화 +초순 +초여름 +초원 +초저녁 +초점 +초청 +á„Žá…©á„ᅩᆯ릿 +촛불 +총각 +총리 +총장 +촬영 +최근 +최상 +최선 +최신 +최악 +최종 +추석 +추억 +추진 +추천 +추측 +축구 +축소 +축제 +축하 +출근 +출발 +출산 +출신 +출연 +출입 +출장 +출판 +충격 +충고 +충돌 +충분히 +충청도 +취업 +취직 +취향 +치약 +친구 +친척 +칠십 +칠월 +칠판 +침대 +침묵 +침실 +칫솔 +칭찬 +á„ᅡ메라 +á„ᅡ운á„á…¥ +á„ᅡᆯ국수 +á„ᅢ릭á„á…¥ +á„ᅢᆷ퍼스 +á„ᅢᆷ페인 +á„á…¥á„ᅳᆫ +á„ᅥᆫ디션 +á„ᅥᆯ러 +á„ᅥᆷ퓨á„á…¥ +á„á…©á„ᅵ리 +á„ᅩ미디 +á„ᅩᆫ서á„á…³ +á„ᅩᆯ라 +á„ᅩᆷ플렉스 +á„ᅩᆼ나물 +á„ᅫ감 +á„ᅮ데á„á…¡ +á„ᅳ림 +á„ᅳᆫ길 +á„ᅳᆫ딸 +á„ᅳᆫ소리 +á„ᅳᆫ아들 +á„ᅳᆫ어머니 +á„ᅳᆫ일 +á„ᅳᆫ절 +á„ᅳᆯ래식 +á„ᅳᆯ럽 +á„ᅵᆯ로 +á„ᅡ입 +á„ᅡ자기 +á„ᅡᆨ구 +á„ᅡᆨ자 +á„ᅡᆫ생 +á„ᅢ권도 +á„ᅢ양 +á„ᅢ풍 +á„ᅢᆨ시 +á„ᅢᆯ런á„á…³ +á„ᅥ널 +á„ᅥ미널 +á„ᅦ니스 +á„ᅦ스á„á…³ +á„ᅦ이블 +á„ᅦᆯ레비전 +á„ᅩ론 +á„ᅩ마á„á…© +á„ᅩ요일 +á„ᅩᆼ계 +á„ᅩᆼ과 +á„ᅩᆼ로 +á„ᅩᆼ신 +á„ᅩᆼ역 +á„ᅩᆼ일 +á„ᅩᆼ장 +á„ᅩᆼ제 +á„ᅩᆼ증 +á„ᅩᆼ합 +á„ᅩᆼ화 +á„ᅬ근 +á„ᅬ원 +á„ᅬ직금 +á„ᅱ김 +á„ᅳ럭 +á„ᅳᆨ급 +á„ᅳᆨ별 +á„ᅳᆨ성 +á„ᅳᆨ수 +á„ᅳᆨ징 +á„ᅳᆨ히 +á„ᅳᆫá„ᅳᆫ히 +á„ᅵ셔츠 +파란색 +파일 +파출소 +판결 +판단 +판매 +판사 +팔십 +팔월 +팝송 +패션 +팩스 +팩시밀리 +팬á„á…µ +퍼센á„á…³ +페인á„á…³ +편견 +편의 +편지 +편히 +평가 +평균 +평생 +평소 +평양 +평일 +평화 +포스á„á…¥ +포인á„á…³ +포장 +포함 +표면 +표정 +표준 +표현 +품목 +품질 +풍경 +풍속 +풍습 +프랑스 +프린á„á…¥ +플라스á„ᅵᆨ +피곤 +피망 +피아노 +필름 +필수 +필요 +필자 +필á„ᅩᆼ +핑계 +하느님 +하늘 +하드웨어 +하룻밤 +하반기 +하숙집 +하순 +á„’á…¡á„‹á…§á„ᅳᆫ +하지만 +하천 +하품 +하필 +학과 +학교 +학급 +학기 +학년 +학력 +학번 +학부모 +학비 +학생 +학술 +학습 +학용품 +학원 +학위 +학자 +학점 +한계 +한글 +한á„ᅥ번에 +한낮 +한눈 +한동안 +한때 +한라산 +한마디 +한문 +한번 +한복 +한식 +한여름 +한á„ᅩᆨ +할머니 +할아버지 +할인 +함á„á…¦ +함부로 +합격 +합리적 +항공 +항구 +항상 +항의 +해결 +해군 +해답 +해당 +해물 +해석 +해설 +해수욕장 +해안 +핵심 +핸드백 +햄버거 +햇볕 +햇살 +행동 +행복 +행사 +행운 +행위 +향기 +향상 +향수 +허락 +허용 +헬기 +현관 +현금 +현대 +현상 +현실 +현장 +현재 +현지 +혈액 +협력 +형부 +형사 +형수 +형식 +형제 +형á„á…¢ +형편 +á„’á…¨á„ᅢᆨ +호기심 +호남 +호랑이 +호박 +á„’á…©á„ᅦᆯ +호흡 +혹시 +홀로 +홈페이지 +홍보 +홍수 +홍차 +화면 +화분 +화살 +화요일 +화장 +화학 +확보 +확인 +확장 +확정 +환갑 +환경 +환영 +환율 +환자 +활기 +활동 +활발히 +활용 +활á„ᅡᆨ +회견 +회관 +회복 +회색 +회원 +회장 +회전 +횟수 +횡단보도 +효율적 +후반 +후춧가루 +훈련 +훨씬 +휴식 +휴일 +흉내 +흐름 +흑백 +흑인 +흔적 +흔히 +흥미 +흥분 +희곡 +희망 +희생 +흰색 +힘á„ᅥᆺ +` diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/wordlists/spanish.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/wordlists/spanish.go new file mode 100644 index 00000000..ad76da97 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip39/wordlists/spanish.go @@ -0,0 +1,2071 @@ +package wordlists + +import ( + "fmt" + "hash/crc32" + "strings" +) + +func init() { + // Ensure word list is correct + // $ wget https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/spanish.txt + // $ crc32 spanish.txt + // 266e4f3d + checksum := crc32.ChecksumIEEE([]byte(spanish)) + if fmt.Sprintf("%x", checksum) != "266e4f3d" { + panic("spanish checksum invalid") + } +} + +// Spanish is a slice of mnemonic words taken from the bip39 specification +// https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/spanish.txt +var Spanish = strings.Split(strings.TrimSpace(spanish), "\n") +var spanish = `aÌbaco +abdomen +abeja +abierto +abogado +abono +aborto +abrazo +abrir +abuelo +abuso +acabar +academia +acceso +accioÌn +aceite +acelga +acento +aceptar +aÌcido +aclarar +acneÌ +acoger +acoso +activo +acto +actriz +actuar +acudir +acuerdo +acusar +adicto +admitir +adoptar +adorno +aduana +adulto +aeÌreo +afectar +aficioÌn +afinar +afirmar +aÌgil +agitar +agoniÌa +agosto +agotar +agregar +agrio +agua +agudo +aÌguila +aguja +ahogo +ahorro +aire +aislar +ajedrez +ajeno +ajuste +alacraÌn +alambre +alarma +alba +aÌlbum +alcalde +aldea +alegre +alejar +alerta +aleta +alfiler +alga +algodoÌn +aliado +aliento +alivio +alma +almeja +almiÌbar +altar +alteza +altivo +alto +altura +alumno +alzar +amable +amante +amapola +amargo +amasar +aÌmbar +aÌmbito +ameno +amigo +amistad +amor +amparo +amplio +ancho +anciano +ancla +andar +andeÌn +anemia +aÌngulo +anillo +aÌnimo +aniÌs +anotar +antena +antiguo +antojo +anual +anular +anuncio +añadir +añejo +año +apagar +aparato +apetito +apio +aplicar +apodo +aporte +apoyo +aprender +aprobar +apuesta +apuro +arado +araña +arar +aÌrbitro +aÌrbol +arbusto +archivo +arco +arder +ardilla +arduo +aÌrea +aÌrido +aries +armoniÌa +arneÌs +aroma +arpa +arpoÌn +arreglo +arroz +arruga +arte +artista +asa +asado +asalto +ascenso +asegurar +aseo +asesor +asiento +asilo +asistir +asno +asombro +aÌspero +astilla +astro +astuto +asumir +asunto +atajo +ataque +atar +atento +ateo +aÌtico +atleta +aÌtomo +atraer +atroz +atuÌn +audaz +audio +auge +aula +aumento +ausente +autor +aval +avance +avaro +ave +avellana +avena +avestruz +avioÌn +aviso +ayer +ayuda +ayuno +azafraÌn +azar +azote +azuÌcar +azufre +azul +baba +babor +bache +bahiÌa +baile +bajar +balanza +balcoÌn +balde +bambuÌ +banco +banda +baño +barba +barco +barniz +barro +baÌscula +bastoÌn +basura +batalla +bateriÌa +batir +batuta +bauÌl +bazar +bebeÌ +bebida +bello +besar +beso +bestia +bicho +bien +bingo +blanco +bloque +blusa +boa +bobina +bobo +boca +bocina +boda +bodega +boina +bola +bolero +bolsa +bomba +bondad +bonito +bono +bonsaÌi +borde +borrar +bosque +bote +botiÌn +boÌveda +bozal +bravo +brazo +brecha +breve +brillo +brinco +brisa +broca +broma +bronce +brote +bruja +brusco +bruto +buceo +bucle +bueno +buey +bufanda +bufoÌn +buÌho +buitre +bulto +burbuja +burla +burro +buscar +butaca +buzoÌn +caballo +cabeza +cabina +cabra +cacao +cadaÌver +cadena +caer +cafeÌ +caiÌda +caimaÌn +caja +cajoÌn +cal +calamar +calcio +caldo +calidad +calle +calma +calor +calvo +cama +cambio +camello +camino +campo +caÌncer +candil +canela +canguro +canica +canto +caña +cañoÌn +caoba +caos +capaz +capitaÌn +capote +captar +capucha +cara +carboÌn +caÌrcel +careta +carga +cariño +carne +carpeta +carro +carta +casa +casco +casero +caspa +castor +catorce +catre +caudal +causa +cazo +cebolla +ceder +cedro +celda +ceÌlebre +celoso +ceÌlula +cemento +ceniza +centro +cerca +cerdo +cereza +cero +cerrar +certeza +ceÌsped +cetro +chacal +chaleco +champuÌ +chancla +chapa +charla +chico +chiste +chivo +choque +choza +chuleta +chupar +cicloÌn +ciego +cielo +cien +cierto +cifra +cigarro +cima +cinco +cine +cinta +cipreÌs +circo +ciruela +cisne +cita +ciudad +clamor +clan +claro +clase +clave +cliente +clima +cliÌnica +cobre +coccioÌn +cochino +cocina +coco +coÌdigo +codo +cofre +coger +cohete +cojiÌn +cojo +cola +colcha +colegio +colgar +colina +collar +colmo +columna +combate +comer +comida +coÌmodo +compra +conde +conejo +conga +conocer +consejo +contar +copa +copia +corazoÌn +corbata +corcho +cordoÌn +corona +correr +coser +cosmos +costa +craÌneo +craÌter +crear +crecer +creiÌdo +crema +criÌa +crimen +cripta +crisis +cromo +croÌnica +croqueta +crudo +cruz +cuadro +cuarto +cuatro +cubo +cubrir +cuchara +cuello +cuento +cuerda +cuesta +cueva +cuidar +culebra +culpa +culto +cumbre +cumplir +cuna +cuneta +cuota +cupoÌn +cuÌpula +curar +curioso +curso +curva +cutis +dama +danza +dar +dardo +daÌtil +deber +deÌbil +deÌcada +decir +dedo +defensa +definir +dejar +delfiÌn +delgado +delito +demora +denso +dental +deporte +derecho +derrota +desayuno +deseo +desfile +desnudo +destino +desviÌo +detalle +detener +deuda +diÌa +diablo +diadema +diamante +diana +diario +dibujo +dictar +diente +dieta +diez +difiÌcil +digno +dilema +diluir +dinero +directo +dirigir +disco +diseño +disfraz +diva +divino +doble +doce +dolor +domingo +don +donar +dorado +dormir +dorso +dos +dosis +dragoÌn +droga +ducha +duda +duelo +dueño +dulce +duÌo +duque +durar +dureza +duro +eÌbano +ebrio +echar +eco +ecuador +edad +edicioÌn +edificio +editor +educar +efecto +eficaz +eje +ejemplo +elefante +elegir +elemento +elevar +elipse +eÌlite +elixir +elogio +eludir +embudo +emitir +emocioÌn +empate +empeño +empleo +empresa +enano +encargo +enchufe +enciÌa +enemigo +enero +enfado +enfermo +engaño +enigma +enlace +enorme +enredo +ensayo +enseñar +entero +entrar +envase +enviÌo +eÌpoca +equipo +erizo +escala +escena +escolar +escribir +escudo +esencia +esfera +esfuerzo +espada +espejo +espiÌa +esposa +espuma +esquiÌ +estar +este +estilo +estufa +etapa +eterno +eÌtica +etnia +evadir +evaluar +evento +evitar +exacto +examen +exceso +excusa +exento +exigir +exilio +existir +eÌxito +experto +explicar +exponer +extremo +faÌbrica +faÌbula +fachada +faÌcil +factor +faena +faja +falda +fallo +falso +faltar +fama +familia +famoso +faraoÌn +farmacia +farol +farsa +fase +fatiga +fauna +favor +fax +febrero +fecha +feliz +feo +feria +feroz +feÌrtil +fervor +festiÌn +fiable +fianza +fiar +fibra +ficcioÌn +ficha +fideo +fiebre +fiel +fiera +fiesta +figura +fijar +fijo +fila +filete +filial +filtro +fin +finca +fingir +finito +firma +flaco +flauta +flecha +flor +flota +fluir +flujo +fluÌor +fobia +foca +fogata +fogoÌn +folio +folleto +fondo +forma +forro +fortuna +forzar +fosa +foto +fracaso +fraÌgil +franja +frase +fraude +freiÌr +freno +fresa +friÌo +frito +fruta +fuego +fuente +fuerza +fuga +fumar +funcioÌn +funda +furgoÌn +furia +fusil +fuÌtbol +futuro +gacela +gafas +gaita +gajo +gala +galeriÌa +gallo +gamba +ganar +gancho +ganga +ganso +garaje +garza +gasolina +gastar +gato +gavilaÌn +gemelo +gemir +gen +geÌnero +genio +gente +geranio +gerente +germen +gesto +gigante +gimnasio +girar +giro +glaciar +globo +gloria +gol +golfo +goloso +golpe +goma +gordo +gorila +gorra +gota +goteo +gozar +grada +graÌfico +grano +grasa +gratis +grave +grieta +grillo +gripe +gris +grito +grosor +gruÌa +grueso +grumo +grupo +guante +guapo +guardia +guerra +guiÌa +guiño +guion +guiso +guitarra +gusano +gustar +haber +haÌbil +hablar +hacer +hacha +hada +hallar +hamaca +harina +haz +hazaña +hebilla +hebra +hecho +helado +helio +hembra +herir +hermano +heÌroe +hervir +hielo +hierro +hiÌgado +higiene +hijo +himno +historia +hocico +hogar +hoguera +hoja +hombre +hongo +honor +honra +hora +hormiga +horno +hostil +hoyo +hueco +huelga +huerta +hueso +huevo +huida +huir +humano +huÌmedo +humilde +humo +hundir +huracaÌn +hurto +icono +ideal +idioma +iÌdolo +iglesia +igluÌ +igual +ilegal +ilusioÌn +imagen +imaÌn +imitar +impar +imperio +imponer +impulso +incapaz +iÌndice +inerte +infiel +informe +ingenio +inicio +inmenso +inmune +innato +insecto +instante +intereÌs +iÌntimo +intuir +inuÌtil +invierno +ira +iris +ironiÌa +isla +islote +jabaliÌ +jaboÌn +jamoÌn +jarabe +jardiÌn +jarra +jaula +jazmiÌn +jefe +jeringa +jinete +jornada +joroba +joven +joya +juerga +jueves +juez +jugador +jugo +juguete +juicio +junco +jungla +junio +juntar +juÌpiter +jurar +justo +juvenil +juzgar +kilo +koala +labio +lacio +lacra +lado +ladroÌn +lagarto +laÌgrima +laguna +laico +lamer +laÌmina +laÌmpara +lana +lancha +langosta +lanza +laÌpiz +largo +larva +laÌstima +lata +laÌtex +latir +laurel +lavar +lazo +leal +leccioÌn +leche +lector +leer +legioÌn +legumbre +lejano +lengua +lento +leña +leoÌn +leopardo +lesioÌn +letal +letra +leve +leyenda +libertad +libro +licor +liÌder +lidiar +lienzo +liga +ligero +lima +liÌmite +limoÌn +limpio +lince +lindo +liÌnea +lingote +lino +linterna +liÌquido +liso +lista +litera +litio +litro +llaga +llama +llanto +llave +llegar +llenar +llevar +llorar +llover +lluvia +lobo +locioÌn +loco +locura +loÌgica +logro +lombriz +lomo +lonja +lote +lucha +lucir +lugar +lujo +luna +lunes +lupa +lustro +luto +luz +maceta +macho +madera +madre +maduro +maestro +mafia +magia +mago +maiÌz +maldad +maleta +malla +malo +mamaÌ +mambo +mamut +manco +mando +manejar +manga +maniquiÌ +manjar +mano +manso +manta +mañana +mapa +maÌquina +mar +marco +marea +marfil +margen +marido +maÌrmol +marroÌn +martes +marzo +masa +maÌscara +masivo +matar +materia +matiz +matriz +maÌximo +mayor +mazorca +mecha +medalla +medio +meÌdula +mejilla +mejor +melena +meloÌn +memoria +menor +mensaje +mente +menuÌ +mercado +merengue +meÌrito +mes +mesoÌn +meta +meter +meÌtodo +metro +mezcla +miedo +miel +miembro +miga +mil +milagro +militar +milloÌn +mimo +mina +minero +miÌnimo +minuto +miope +mirar +misa +miseria +misil +mismo +mitad +mito +mochila +mocioÌn +moda +modelo +moho +mojar +molde +moler +molino +momento +momia +monarca +moneda +monja +monto +moño +morada +morder +moreno +morir +morro +morsa +mortal +mosca +mostrar +motivo +mover +moÌvil +mozo +mucho +mudar +mueble +muela +muerte +muestra +mugre +mujer +mula +muleta +multa +mundo +muñeca +mural +muro +muÌsculo +museo +musgo +muÌsica +muslo +naÌcar +nacioÌn +nadar +naipe +naranja +nariz +narrar +nasal +natal +nativo +natural +naÌusea +naval +nave +navidad +necio +neÌctar +negar +negocio +negro +neoÌn +nervio +neto +neutro +nevar +nevera +nicho +nido +niebla +nieto +niñez +niño +niÌtido +nivel +nobleza +noche +noÌmina +noria +norma +norte +nota +noticia +novato +novela +novio +nube +nuca +nuÌcleo +nudillo +nudo +nuera +nueve +nuez +nulo +nuÌmero +nutria +oasis +obeso +obispo +objeto +obra +obrero +observar +obtener +obvio +oca +ocaso +oceÌano +ochenta +ocho +ocio +ocre +octavo +octubre +oculto +ocupar +ocurrir +odiar +odio +odisea +oeste +ofensa +oferta +oficio +ofrecer +ogro +oiÌdo +oiÌr +ojo +ola +oleada +olfato +olivo +olla +olmo +olor +olvido +ombligo +onda +onza +opaco +opcioÌn +oÌpera +opinar +oponer +optar +oÌptica +opuesto +oracioÌn +orador +oral +oÌrbita +orca +orden +oreja +oÌrgano +orgiÌa +orgullo +oriente +origen +orilla +oro +orquesta +oruga +osadiÌa +oscuro +osezno +oso +ostra +otoño +otro +oveja +oÌvulo +oÌxido +oxiÌgeno +oyente +ozono +pacto +padre +paella +paÌgina +pago +paiÌs +paÌjaro +palabra +palco +paleta +paÌlido +palma +paloma +palpar +pan +panal +paÌnico +pantera +pañuelo +papaÌ +papel +papilla +paquete +parar +parcela +pared +parir +paro +paÌrpado +parque +paÌrrafo +parte +pasar +paseo +pasioÌn +paso +pasta +pata +patio +patria +pausa +pauta +pavo +payaso +peatoÌn +pecado +pecera +pecho +pedal +pedir +pegar +peine +pelar +peldaño +pelea +peligro +pellejo +pelo +peluca +pena +pensar +peñoÌn +peoÌn +peor +pepino +pequeño +pera +percha +perder +pereza +perfil +perico +perla +permiso +perro +persona +pesa +pesca +peÌsimo +pestaña +peÌtalo +petroÌleo +pez +pezuña +picar +pichoÌn +pie +piedra +pierna +pieza +pijama +pilar +piloto +pimienta +pino +pintor +pinza +piña +piojo +pipa +pirata +pisar +piscina +piso +pista +pitoÌn +pizca +placa +plan +plata +playa +plaza +pleito +pleno +plomo +pluma +plural +pobre +poco +poder +podio +poema +poesiÌa +poeta +polen +policiÌa +pollo +polvo +pomada +pomelo +pomo +pompa +poner +porcioÌn +portal +posada +poseer +posible +poste +potencia +potro +pozo +prado +precoz +pregunta +premio +prensa +preso +previo +primo +priÌncipe +prisioÌn +privar +proa +probar +proceso +producto +proeza +profesor +programa +prole +promesa +pronto +propio +proÌximo +prueba +puÌblico +puchero +pudor +pueblo +puerta +puesto +pulga +pulir +pulmoÌn +pulpo +pulso +puma +punto +puñal +puño +pupa +pupila +pureÌ +quedar +queja +quemar +querer +queso +quieto +quiÌmica +quince +quitar +raÌbano +rabia +rabo +racioÌn +radical +raiÌz +rama +rampa +rancho +rango +rapaz +raÌpido +rapto +rasgo +raspa +rato +rayo +raza +razoÌn +reaccioÌn +realidad +rebaño +rebote +recaer +receta +rechazo +recoger +recreo +recto +recurso +red +redondo +reducir +reflejo +reforma +refraÌn +refugio +regalo +regir +regla +regreso +reheÌn +reino +reiÌr +reja +relato +relevo +relieve +relleno +reloj +remar +remedio +remo +rencor +rendir +renta +reparto +repetir +reposo +reptil +res +rescate +resina +respeto +resto +resumen +retiro +retorno +retrato +reunir +reveÌs +revista +rey +rezar +rico +riego +rienda +riesgo +rifa +riÌgido +rigor +rincoÌn +riñoÌn +riÌo +riqueza +risa +ritmo +rito +rizo +roble +roce +rociar +rodar +rodeo +rodilla +roer +rojizo +rojo +romero +romper +ron +ronco +ronda +ropa +ropero +rosa +rosca +rostro +rotar +rubiÌ +rubor +rudo +rueda +rugir +ruido +ruina +ruleta +rulo +rumbo +rumor +ruptura +ruta +rutina +saÌbado +saber +sabio +sable +sacar +sagaz +sagrado +sala +saldo +salero +salir +salmoÌn +saloÌn +salsa +salto +salud +salvar +samba +sancioÌn +sandiÌa +sanear +sangre +sanidad +sano +santo +sapo +saque +sardina +sarteÌn +sastre +sataÌn +sauna +saxofoÌn +seccioÌn +seco +secreto +secta +sed +seguir +seis +sello +selva +semana +semilla +senda +sensor +señal +señor +separar +sepia +sequiÌa +ser +serie +sermoÌn +servir +sesenta +sesioÌn +seta +setenta +severo +sexo +sexto +sidra +siesta +siete +siglo +signo +siÌlaba +silbar +silencio +silla +siÌmbolo +simio +sirena +sistema +sitio +situar +sobre +socio +sodio +sol +solapa +soldado +soledad +soÌlido +soltar +solucioÌn +sombra +sondeo +sonido +sonoro +sonrisa +sopa +soplar +soporte +sordo +sorpresa +sorteo +sosteÌn +soÌtano +suave +subir +suceso +sudor +suegra +suelo +sueño +suerte +sufrir +sujeto +sultaÌn +sumar +superar +suplir +suponer +supremo +sur +surco +sureño +surgir +susto +sutil +tabaco +tabique +tabla +tabuÌ +taco +tacto +tajo +talar +talco +talento +talla +taloÌn +tamaño +tambor +tango +tanque +tapa +tapete +tapia +tapoÌn +taquilla +tarde +tarea +tarifa +tarjeta +tarot +tarro +tarta +tatuaje +tauro +taza +tazoÌn +teatro +techo +tecla +teÌcnica +tejado +tejer +tejido +tela +teleÌfono +tema +temor +templo +tenaz +tender +tener +tenis +tenso +teoriÌa +terapia +terco +teÌrmino +ternura +terror +tesis +tesoro +testigo +tetera +texto +tez +tibio +tiburoÌn +tiempo +tienda +tierra +tieso +tigre +tijera +tilde +timbre +tiÌmido +timo +tinta +tiÌo +tiÌpico +tipo +tira +tiroÌn +titaÌn +tiÌtere +tiÌtulo +tiza +toalla +tobillo +tocar +tocino +todo +toga +toldo +tomar +tono +tonto +topar +tope +toque +toÌrax +torero +tormenta +torneo +toro +torpedo +torre +torso +tortuga +tos +tosco +toser +toÌxico +trabajo +tractor +traer +traÌfico +trago +traje +tramo +trance +trato +trauma +trazar +treÌbol +tregua +treinta +tren +trepar +tres +tribu +trigo +tripa +triste +triunfo +trofeo +trompa +tronco +tropa +trote +trozo +truco +trueno +trufa +tuberiÌa +tubo +tuerto +tumba +tumor +tuÌnel +tuÌnica +turbina +turismo +turno +tutor +ubicar +uÌlcera +umbral +unidad +unir +universo +uno +untar +uña +urbano +urbe +urgente +urna +usar +usuario +uÌtil +utopiÌa +uva +vaca +vaciÌo +vacuna +vagar +vago +vaina +vajilla +vale +vaÌlido +valle +valor +vaÌlvula +vampiro +vara +variar +varoÌn +vaso +vecino +vector +vehiÌculo +veinte +vejez +vela +velero +veloz +vena +vencer +venda +veneno +vengar +venir +venta +venus +ver +verano +verbo +verde +vereda +verja +verso +verter +viÌa +viaje +vibrar +vicio +viÌctima +vida +viÌdeo +vidrio +viejo +viernes +vigor +vil +villa +vinagre +vino +viñedo +violiÌn +viral +virgo +virtud +visor +viÌspera +vista +vitamina +viudo +vivaz +vivero +vivir +vivo +volcaÌn +volumen +volver +voraz +votar +voto +voz +vuelo +vulgar +yacer +yate +yegua +yema +yerno +yeso +yodo +yoga +yogur +zafiro +zanja +zapato +zarza +zona +zorro +zumo +zurdo +` diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip44/bip44.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip44/bip44.go new file mode 100644 index 00000000..cb85d5a8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip44/bip44.go @@ -0,0 +1,93 @@ +/* +Package bip44 implements the bip44 spec https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki +*/ +package bip44 + +import ( + "errors" + "fmt" + + "github.com/SkycoinProject/skycoin/src/cipher/bip32" +) + +// Bip44's bip32 path: m / purpose' / coin_type' / account' / change / address_index + +var ( + // ErrInvalidCoinType coin_type is >= 0x80000000 + ErrInvalidCoinType = errors.New("invalid bip44 coin type") + + // ErrInvalidAccount account is >= 0x80000000 + ErrInvalidAccount = errors.New("bip44 account index must be < 0x80000000") +) + +// CoinType is the coin_type part of the bip44 path +type CoinType uint32 + +const ( + // CoinTypeBitcoin is the coin_type for Bitcoin + CoinTypeBitcoin CoinType = 0 + // CoinTypeBitcoinTestnet is the coin_type for Skycoin + CoinTypeBitcoinTestnet CoinType = 1 + // CoinTypeSkycoin is the coin_type for Skycoin + CoinTypeSkycoin CoinType = 8000 + + // ExternalChainIndex is the index of the external chain + ExternalChainIndex uint32 = 0 + // ChangeChainIndex is the index of the change chain + ChangeChainIndex uint32 = 1 +) + +// Coin is a bip32 node at the `coin_type` level of a bip44 path +type Coin struct { + *bip32.PrivateKey +} + +// NewCoin creates a bip32 node at the `coin_type` level of a bip44 path +func NewCoin(seed []byte, coinType CoinType) (*Coin, error) { + if uint32(coinType) >= bip32.FirstHardenedChild { + return nil, ErrInvalidCoinType + } + + path := fmt.Sprintf("m/44'/%d'", coinType) + pk, err := bip32.NewPrivateKeyFromPath(seed, path) + if err != nil { + return nil, err + } + + return &Coin{ + pk, + }, nil +} + +// Account creates a bip32 node at the `account'` level of the bip44 path. +// The account number should be as it would appear in the path string, without +// the apostrophe that indicates hardening +func (c *Coin) Account(account uint32) (*Account, error) { + if account >= bip32.FirstHardenedChild { + return nil, ErrInvalidAccount + } + + pk, err := c.NewPrivateChildKey(account + bip32.FirstHardenedChild) + if err != nil { + return nil, err + } + + return &Account{ + pk, + }, nil +} + +// Account is a bip32 node at the `account` level of a bip44 path +type Account struct { + *bip32.PrivateKey +} + +// External returns the external chain node, to be used for receiving coins +func (a *Account) External() (*bip32.PrivateKey, error) { + return a.NewPrivateChildKey(ExternalChainIndex) +} + +// Change returns the change chain node, to be used for change addresses +func (a *Account) Change() (*bip32.PrivateKey, error) { + return a.NewPrivateChildKey(ChangeChainIndex) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip44/bip44_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip44/bip44_test.go new file mode 100644 index 00000000..413b8703 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip44/bip44_test.go @@ -0,0 +1,76 @@ +package bip44 + +import ( + "encoding/hex" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher/bip32" + "github.com/SkycoinProject/skycoin/src/cipher/bip39" +) + +func mustDefaultSeed(t *testing.T) []byte { + mnemonic := "dizzy cigar grant ramp inmate uniform gold success able payment faith practice" + passphrase := "" + seed, err := bip39.NewSeed(mnemonic, passphrase) + require.NoError(t, err) + require.Equal(t, "24e563fb095d766df3862c70432cc1b2210b24d232da69af7af09d2ec86d28782ce58035bae29994c84081836aebe36a9b46af1578262fefc53e37efbe94be57", hex.EncodeToString(seed)) + return seed +} + +func TestNewCoin(t *testing.T) { + // bad seed + _, err := NewCoin(make([]byte, 3), CoinTypeBitcoin) + require.Equal(t, err, bip32.ErrInvalidSeedLength) + + // bad coin_type + _, err = NewCoin(mustDefaultSeed(t), CoinType(bip32.FirstHardenedChild)) + require.Equal(t, err, ErrInvalidCoinType) + _, err = NewCoin(mustDefaultSeed(t), CoinType(1+bip32.FirstHardenedChild)) + require.Equal(t, err, ErrInvalidCoinType) + + c, err := NewCoin(mustDefaultSeed(t), CoinTypeBitcoin) + require.NoError(t, err) + + account, err := c.Account(0) + require.NoError(t, err) + require.Equal(t, "xprv9yKAFQtFghZSe4mfdpdqFm1WWmGeQbYMB4MSGUB85zbKGQgSxty4duZb8k6hNoHVd2UR7Y3QhWU3rS9wox9ewgVG7gDLyYTL4yzEuqUCjvF", account.String()) + require.Equal(t, "xpub6CJWevR9X57jrYr8jrAqctxF4o78p4GCYHH34rajeL8J9D1bWSHKBht4yzwiTQ4FP4HyQpx99iLxvU54rbEbcxBUgxzTGGudBVXb1N2gcHF", account.PublicKey().String()) + + account, err = c.Account(1) + require.NoError(t, err) + require.Equal(t, "xprv9yKAFQtFghZSgShGXkxHsYQfFaqMyutf3izng8tV4Tmp7gidQUPB8kCuv66yukidivM2oSaUvGus8ffnYvYKChB7DME2H2AvUq8LM2rXUzF", account.String()) + require.Equal(t, "xpub6CJWevR9X57jtvmjdnVJEgMPocfrPNcWQwvPUXJ6coJnzV3mx1hRgYXPmQJh5vLQvrVCY8LtJB5xLLiPJVmpSwBe2yhonQLoQuSsCF8YPLN", account.PublicKey().String()) + + _, err = c.Account(0x80000000) + require.Equal(t, err, ErrInvalidAccount) + _, err = c.Account(0x80000001) + require.Equal(t, err, ErrInvalidAccount) + + external, err := account.External() + require.NoError(t, err) + require.Equal(t, "xprv9zjsvjLiqSerDzbeRXPeXwz8tuQ7eRUABkgFAgLPHw1KzGKkgBhJhGaMYHM8j2KDXBZTCv4m19qjxrrD7gusrtdpZ7xzJywdXHaMZEjf3Uv", external.String()) + require.Equal(t, "xpub6DjELEscfpD9SUg7XYveu5vsSwEc3tC1Yybqy4jzrGYJs4euDj1ZF4tqPZYvViMn9cvBobHyubuuh69PZ1szaBBx5oxPiQzD492B6C4QDHe", external.PublicKey().String()) + + external0, err := external.NewPublicChildKey(0) + require.NoError(t, err) + require.Equal(t, "034d36f3bcd74e19204e75b81b9c0726e41b799858b92bab73f4cd7498308c5c8b", hex.EncodeToString(external0.Key)) + + external1, err := external.NewPublicChildKey(1) + require.NoError(t, err) + require.Equal(t, "02f7309e9f559d847ee9cc9ee144cfa490791e33e908fdbde2dade50a389408b01", hex.EncodeToString(external1.Key)) + + change, err := account.Change() + require.NoError(t, err) + require.Equal(t, "xprv9zjsvjLiqSerGzJyBrpZgCaGpQCeFDnZEuAV714WigmFyHT4nFLhZLeuHzLNE19PgkZeQ5Uf2pjFZjQTHbkugDbmw5TAPAvgo2jsaTnZo2A", change.String()) + require.Equal(t, "xpub6DjELEscfpD9VUPSHtMa3LX1NS38egWQc865uPU8H2JEr5nDKnex78yP9GxhFr5cnCRgiQF1dkv7aR7moraPrv73KHwSkDaXdWookR1Sh9p", change.PublicKey().String()) + + change0, err := change.NewPublicChildKey(0) + require.NoError(t, err) + require.Equal(t, "026d3eb891e81ecabedfa8560166af383457aedaf172af9d57d00508faa5f57c4c", hex.EncodeToString(change0.Key)) + + change1, err := change.NewPublicChildKey(1) + require.NoError(t, err) + require.Equal(t, "02681b301293fdf0292cd679b37d60b92a71b389fd994b2b57c8daf99532bfb4a5", hex.EncodeToString(change1.Key)) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip44/example_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip44/example_test.go new file mode 100644 index 00000000..70bdec7e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bip44/example_test.go @@ -0,0 +1,114 @@ +package bip44 + +import ( + "encoding/hex" + "fmt" + + "github.com/SkycoinProject/skycoin/src/cipher/bip39" +) + +func Example() { + // Create a bip39 seed from a mnenomic + // import "github.com/SkycoinProject/skycoin/src/cipher/bip39" + // mnemonic := bip39.NewDefaultMnemonic() + mnemonic := "dizzy cigar grant ramp inmate uniform gold success able payment faith practice" + passphrase := "" + seed, err := bip39.NewSeed(mnemonic, passphrase) + if err != nil { + panic(err) + } + fmt.Println("bip39 seed") + fmt.Println(hex.EncodeToString(seed)) + + // Create a root node for Bitcoin + c, err := NewCoin(seed, CoinTypeBitcoin) + if err != nil { + panic(err) + } + + // Create an account node + fmt.Println("m/44'/0'/0'") + account, err := c.Account(0) + if err != nil { + panic(err) + } + + fmt.Println(account.PrivateKey) + fmt.Println(account.PublicKey()) + + // Create an external address node + fmt.Println("m/44'/0'/0'/0") + external, err := account.External() + if err != nil { + panic(err) + } + + fmt.Println(external) + fmt.Println(external.PublicKey()) + + // Create the first child of the external address chain + fmt.Println("m/44'/0'/0'/0/0") + external0, err := external.NewPrivateChildKey(0) + if err != nil { + panic(err) + } + + fmt.Println("pubkey:", hex.EncodeToString(external0.PublicKey().Key)) + + // Create the second child of the external address chain + fmt.Println("m/44'/0'/0'/0/1") + external1, err := external.NewPrivateChildKey(1) + if err != nil { + panic(err) + } + + fmt.Println("pubkey:", hex.EncodeToString(external1.PublicKey().Key)) + + // Create a change address node + fmt.Println("m/44'/0'/0'/1") + change, err := account.Change() + if err != nil { + panic(err) + } + + fmt.Println(change) + fmt.Println(change.PublicKey()) + + // Create the first child of the change address chain + fmt.Println("m/44'/0'/0'/1/0") + change0, err := change.NewPrivateChildKey(0) + if err != nil { + panic(err) + } + + fmt.Println("pubkey:", hex.EncodeToString(change0.PublicKey().Key)) + + // Create the second child of the change address chain + fmt.Println("m/44'/0'/0'/1/1") + change1, err := change.NewPrivateChildKey(1) + if err != nil { + panic(err) + } + + fmt.Println("pubkey:", hex.EncodeToString(change1.PublicKey().Key)) + + // Output: bip39 seed + // 24e563fb095d766df3862c70432cc1b2210b24d232da69af7af09d2ec86d28782ce58035bae29994c84081836aebe36a9b46af1578262fefc53e37efbe94be57 + // m/44'/0'/0' + // xprv9yKAFQtFghZSe4mfdpdqFm1WWmGeQbYMB4MSGUB85zbKGQgSxty4duZb8k6hNoHVd2UR7Y3QhWU3rS9wox9ewgVG7gDLyYTL4yzEuqUCjvF + // xpub6CJWevR9X57jrYr8jrAqctxF4o78p4GCYHH34rajeL8J9D1bWSHKBht4yzwiTQ4FP4HyQpx99iLxvU54rbEbcxBUgxzTGGudBVXb1N2gcHF + // m/44'/0'/0'/0 + // xprv9zeGUHRUFEwnEAY21z9XBWsY2LpS1ZKhViJt9dhTqsqb8wjnhP2B2rv2mXAzvcUnUnSNZTzTs2sEUSqxAXaD6ptwjrLAmFrRHw6QkwN7KEa + // xpub6DdcsnxN5cW5SecV81gXYepGaNevR23YrwEUx275QDNa1k4wEvLRafEWcpP5gKP3AkR67td8nx2PykEWxzUvJCgeoUKuM8px7uhAmYCQWEg + // m/44'/0'/0'/0/0 + // pubkey: 021008142807feb53f67baa91c166d97cf74f7f059f3eb29f24ff8a6d1f2c80500 + // m/44'/0'/0'/0/1 + // pubkey: 020606c2577bb430dcaf405246e85456638dfb266d774c1e8386f9276892fd6fdc + // m/44'/0'/0'/1 + // xprv9zeGUHRUFEwnGcomH56JtQ7Xp66GYMH3o77jHDfVaLG1gN6dVtDp7ndvEcpvEK7JjYg3sTkteV8FziQ3HGjzSp3KxAcFAy3u84EQFYDqkPq + // xpub6DdcsnxN5cW5V6tEP6dKFY4GN7vkwozuAL3L5c578fnzZARn3RY4faxQ5rqy1dR8mY8GUWoQJtLBLyXnFiGE9j3r4ShiVb12W5NPSmkgrpp + // m/44'/0'/0'/1/0 + // pubkey: 030d61ebd6f36a4552127b35d1b8e13b1d8060534c6ccbb2f77c76cfbea56cf87f + // m/44'/0'/0'/1/1 + // pubkey: 03513484252259b77c8aeb594e2cfd0437e1650da18fe6296be8a3aa3979313219 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/bitcoin.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bitcoin.go new file mode 100644 index 00000000..61747e4f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bitcoin.go @@ -0,0 +1,195 @@ +package cipher + +import ( + "bytes" + "errors" + "log" + + "github.com/SkycoinProject/skycoin/src/cipher/base58" +) + +var ( + // ErrInvalidLength Unexpected size of string or bytes buffer + ErrInvalidLength = errors.New("Invalid length") + // ErrBitcoinWIFInvalidFirstByte Unexpected value (!= 0x80) of first byte in Bitcoin Wallet Import Format + ErrBitcoinWIFInvalidFirstByte = errors.New("Bitcoin WIF: First byte invalid") + // ErrBitcoinWIFInvalidSuffix Unexpected value (!= 0x01) of 33rd byte in Bitcoin Wallet Import Format + ErrBitcoinWIFInvalidSuffix = errors.New("Bitcoin WIF: Invalid 33rd byte") + // ErrBitcoinWIFInvalidChecksum Invalid Checksum in Bitcoin WIF address + ErrBitcoinWIFInvalidChecksum = errors.New("Bitcoin WIF: Checksum fail") +) + +// BitcoinAddress is a bitcoin address +type BitcoinAddress struct { + Version byte // 1 byte + Key Ripemd160 // 20 byte pubkey hash +} + +// BitcoinPubKeyRipemd160 returns ripemd160(sha256(key)) +func BitcoinPubKeyRipemd160(pubKey PubKey) Ripemd160 { + r1 := SumSHA256(pubKey[:]) + return HashRipemd160(r1[:]) +} + +// BitcoinAddressFromPubKey creates a mainnet (version 0) BitcoinAddress from PubKey as ripemd160(sha256(pubkey))) +func BitcoinAddressFromPubKey(pubKey PubKey) BitcoinAddress { + return BitcoinAddress{ + Version: 0, + Key: BitcoinPubKeyRipemd160(pubKey), + } +} + +// BitcoinAddressFromSecKey generates a BitcoinAddress from SecKey +func BitcoinAddressFromSecKey(secKey SecKey) (BitcoinAddress, error) { + p, err := PubKeyFromSecKey(secKey) + if err != nil { + return BitcoinAddress{}, err + } + return BitcoinAddressFromPubKey(p), nil +} + +// MustBitcoinAddressFromSecKey generates a BitcoinAddress from SecKey, panics on error +func MustBitcoinAddressFromSecKey(secKey SecKey) BitcoinAddress { + return BitcoinAddressFromPubKey(MustPubKeyFromSecKey(secKey)) +} + +// DecodeBase58BitcoinAddress creates a BitcoinAddress from its base58 encoding +func DecodeBase58BitcoinAddress(addr string) (BitcoinAddress, error) { + b, err := base58.Decode(addr) + if err != nil { + return BitcoinAddress{}, err + } + return BitcoinAddressFromBytes(b) +} + +// MustDecodeBase58BitcoinAddress creates a BitcoinAddress from its base58 encoding, panics on error +func MustDecodeBase58BitcoinAddress(addr string) BitcoinAddress { + a, err := DecodeBase58BitcoinAddress(addr) + if err != nil { + log.Panicf("Invalid bitcoin address %s: %v", addr, err) + } + return a +} + +// BitcoinAddressFromBytes converts []byte to a BitcoinAddress. Only supports mainnet (version 0) addresses. +func BitcoinAddressFromBytes(b []byte) (BitcoinAddress, error) { + if len(b) != 20+1+4 { + return BitcoinAddress{}, ErrAddressInvalidLength + } + a := BitcoinAddress{} + copy(a.Key[0:20], b[1:21]) + a.Version = b[0] + + var checksum [4]byte + copy(checksum[0:4], b[21:25]) + + if checksum != a.Checksum() { + return BitcoinAddress{}, ErrAddressInvalidChecksum + } + + // BitcoinAddress only supports mainnet addresses for now + if a.Version != 0 { + return BitcoinAddress{}, ErrAddressInvalidVersion + } + + return a, nil +} + +// MustBitcoinAddressFromBytes converts []byte to a BitcoinAddress, panics on error +func MustBitcoinAddressFromBytes(b []byte) BitcoinAddress { + addr, err := BitcoinAddressFromBytes(b) + if err != nil { + log.Panic(err) + } + + return addr +} + +// Null returns true if the address is null (0x0000....) +func (addr BitcoinAddress) Null() bool { + return addr == BitcoinAddress{} +} + +// Bytes returns bitcoin address as byte slice +func (addr BitcoinAddress) Bytes() []byte { + b := make([]byte, 20+1+4) + b[0] = addr.Version + copy(b[1:21], addr.Key[0:20]) + chksum := addr.Checksum() + copy(b[21:25], chksum[0:4]) + return b +} + +// Verify checks that the bitcoin address appears valid for the public key +func (addr BitcoinAddress) Verify(key PubKey) error { + // BitcoinAddress only supports mainnet addresses for now + if addr.Version != 0x00 { + return ErrAddressInvalidVersion + } + if addr.Key != BitcoinPubKeyRipemd160(key) { + return ErrAddressInvalidPubKey + } + return nil +} + +// String convert bitcoin address to hex string +func (addr BitcoinAddress) String() string { + return string(base58.Encode(addr.Bytes())) +} + +// Checksum returns a bitcoin address Checksum which is the first 4 bytes of sha256(sha256(version+key)) +func (addr BitcoinAddress) Checksum() Checksum { + r1 := append([]byte{addr.Version}, addr.Key[:]...) + r2 := DoubleSHA256(r1[:]) + c := Checksum{} + copy(c[:], r2[:len(c)]) + return c +} + +// BitcoinWalletImportFormatFromSeckey exports seckey in wallet import format +// key must be compressed +func BitcoinWalletImportFormatFromSeckey(seckey SecKey) string { + b1 := append([]byte{byte(0x80)}, seckey[:]...) + b2 := append(b1[:], []byte{0x01}...) + b3 := DoubleSHA256(b2) //checksum + b4 := append(b2, b3[0:4]...) + return string(base58.Encode(b4)) +} + +// SecKeyFromBitcoinWalletImportFormat extracts a seckey from the bitcoin wallet import format +func SecKeyFromBitcoinWalletImportFormat(input string) (SecKey, error) { + b, err := base58.Decode(input) + if err != nil { + return SecKey{}, err + } + + //1+32+1+4 + if len(b) != 38 { + return SecKey{}, ErrInvalidLength + } + if b[0] != 0x80 { + return SecKey{}, ErrBitcoinWIFInvalidFirstByte + } + + if b[1+32] != 0x01 { + return SecKey{}, ErrBitcoinWIFInvalidSuffix + } + + b2 := DoubleSHA256(b[0:34]) + chksum := b[34:38] + + if !bytes.Equal(chksum, b2[0:4]) { + return SecKey{}, ErrBitcoinWIFInvalidChecksum + } + + return NewSecKey(b[1:33]) +} + +// MustSecKeyFromBitcoinWalletImportFormat extracts a seckey from the bitcoin wallet import format, panics on error +func MustSecKeyFromBitcoinWalletImportFormat(input string) SecKey { + seckey, err := SecKeyFromBitcoinWalletImportFormat(input) + if err != nil { + log.Panicf("MustSecKeyFromBitcoinWalletImportFormat, invalid seckey, %v", err) + } + return seckey +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/bitcoin_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bitcoin_test.go new file mode 100644 index 00000000..2e8e500f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/bitcoin_test.go @@ -0,0 +1,376 @@ +package cipher + +import ( + "errors" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher/base58" +) + +func TestBitcoinAddress(t *testing.T) { + cases := []struct { + seckey string + pubkey string + addr string + }{ + { + seckey: "1111111111111111111111111111111111111111111111111111111111111111", + pubkey: "034f355bdcb7cc0af728ef3cceb9615d90684bb5b2ca5f859ab0f0b704075871aa", + addr: "1Q1pE5vPGEEMqRcVRMbtBK842Y6Pzo6nK9", + }, + { + seckey: "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + pubkey: "02ed83704c95d829046f1ac27806211132102c34e9ac7ffa1b71110658e5b9d1bd", + addr: "1NKRhS7iYUGTaAfaR5z8BueAJesqaTyc4a", + }, + { + seckey: "47f7616ea6f9b923076625b4488115de1ef1187f760e65f89eb6f4f7ff04b012", + pubkey: "032596957532fc37e40486b910802ff45eeaa924548c0e1c080ef804e523ec3ed3", + addr: "19ck9VKC6KjGxR9LJg4DNMRc45qFrJguvV", + }, + } + + for _, tc := range cases { + t.Run(tc.addr, func(t *testing.T) { + seckey := MustSecKeyFromHex(tc.seckey) + + pubkey := MustPubKeyFromSecKey(seckey) + require.Equal(t, tc.pubkey, pubkey.Hex()) + + bitcoinAddr := BitcoinAddressFromPubKey(pubkey) + require.Equal(t, tc.addr, bitcoinAddr.String()) + + secAddr := MustBitcoinAddressFromSecKey(seckey) + require.Equal(t, tc.addr, secAddr.String()) + + secAddr, err := BitcoinAddressFromSecKey(seckey) + require.NoError(t, err) + require.Equal(t, tc.addr, secAddr.String()) + + pubAddr := BitcoinAddressFromPubKey(pubkey) + require.Equal(t, tc.addr, pubAddr.String()) + }) + } +} + +func TestMustDecodeBase58BitcoinAddress(t *testing.T) { + p, _ := GenerateKeyPair() + a := BitcoinAddressFromPubKey(p) + require.NoError(t, a.Verify(p)) + + require.Panics(t, func() { MustDecodeBase58BitcoinAddress("") }) + require.Panics(t, func() { MustDecodeBase58BitcoinAddress("cascs") }) + b := a.Bytes() + h := string(base58.Encode(b[:len(b)/2])) + require.Panics(t, func() { MustDecodeBase58BitcoinAddress(h) }) + h = string(base58.Encode(b)) + require.NotPanics(t, func() { MustDecodeBase58BitcoinAddress(h) }) + a2 := MustDecodeBase58BitcoinAddress(h) + require.Equal(t, a, a2) + + require.NotPanics(t, func() { MustDecodeBase58BitcoinAddress(a.String()) }) + a2 = MustDecodeBase58BitcoinAddress(a.String()) + require.Equal(t, a, a2) + + // preceding whitespace is invalid + badAddr := " " + a.String() + require.Panics(t, func() { MustDecodeBase58BitcoinAddress(badAddr) }) + + // preceding zeroes are invalid + badAddr = "000" + a.String() + require.Panics(t, func() { MustDecodeBase58BitcoinAddress(badAddr) }) + + // trailing whitespace is invalid + badAddr = a.String() + " " + require.Panics(t, func() { MustDecodeBase58BitcoinAddress(badAddr) }) + + // trailing zeroes are invalid + badAddr = a.String() + "000" + require.Panics(t, func() { MustDecodeBase58BitcoinAddress(badAddr) }) + + null := "1111111111111111111111111" + require.Panics(t, func() { MustDecodeBase58BitcoinAddress(null) }) +} + +func TestDecodeBase58BitcoinAddress(t *testing.T) { + p, _ := GenerateKeyPair() + a := BitcoinAddressFromPubKey(p) + require.NoError(t, a.Verify(p)) + + _, err := DecodeBase58BitcoinAddress("") + require.Error(t, err) + + _, err = DecodeBase58BitcoinAddress("cascs") + require.Error(t, err) + + b := a.Bytes() + h := string(base58.Encode(b[:len(b)/2])) + _, err = DecodeBase58BitcoinAddress(h) + require.Error(t, err) + + h = string(base58.Encode(b)) + a2, err := DecodeBase58BitcoinAddress(h) + require.NoError(t, err) + require.Equal(t, a, a2) + + as := a.String() + a2, err = DecodeBase58BitcoinAddress(as) + require.NoError(t, err) + require.Equal(t, a, a2) + + // preceding whitespace is invalid + as2 := " " + as + _, err = DecodeBase58BitcoinAddress(as2) + require.Error(t, err) + + // preceding zeroes are invalid + as2 = "000" + as + _, err = DecodeBase58BitcoinAddress(as2) + require.Error(t, err) + + // trailing whitespace is invalid + as2 = as + " " + _, err = DecodeBase58BitcoinAddress(as2) + require.Error(t, err) + + // trailing zeroes are invalid + as2 = as + "000" + _, err = DecodeBase58BitcoinAddress(as2) + require.Error(t, err) + + // null address is invalid + null := "1111111111111111111111111" + _, err = DecodeBase58BitcoinAddress(null) + require.Error(t, err) + require.Equal(t, ErrAddressInvalidChecksum, err) +} + +func TestBitcoinAddressFromBytes(t *testing.T) { + p, _ := GenerateKeyPair() + a := BitcoinAddressFromPubKey(p) + a2, err := BitcoinAddressFromBytes(a.Bytes()) + require.NoError(t, err) + require.Equal(t, a2, a) + + // Invalid number of bytes + b := a.Bytes() + _, err = BitcoinAddressFromBytes(b[:len(b)-2]) + require.EqualError(t, err, "Invalid address length") + + // Invalid checksum + b[len(b)-1] += byte(1) + _, err = BitcoinAddressFromBytes(b) + require.EqualError(t, err, "Invalid checksum") + + a.Version = 2 + b = a.Bytes() + _, err = BitcoinAddressFromBytes(b) + require.EqualError(t, err, "Address version invalid") +} + +func TestMustBitcoinAddressFromBytes(t *testing.T) { + p, _ := GenerateKeyPair() + a := BitcoinAddressFromPubKey(p) + a2 := MustBitcoinAddressFromBytes(a.Bytes()) + require.Equal(t, a2, a) + + // Invalid number of bytes + b := a.Bytes() + require.Panics(t, func() { + MustBitcoinAddressFromBytes(b[:len(b)-2]) + }) + + // Invalid checksum + b[len(b)-1] += byte(1) + require.Panics(t, func() { + MustBitcoinAddressFromBytes(b) + }) + + a.Version = 2 + b = a.Bytes() + require.Panics(t, func() { + MustBitcoinAddressFromBytes(b) + }) +} + +func TestBitcoinAddressFromSecKey(t *testing.T) { + p, s := GenerateKeyPair() + a, err := BitcoinAddressFromSecKey(s) + require.NoError(t, err) + // Valid pubkey+address + require.NoError(t, a.Verify(p)) + + _, err = BitcoinAddressFromSecKey(SecKey{}) + require.Equal(t, errors.New("Attempt to load null seckey, unsafe"), err) +} + +func TestMustBitcoinAddressFromSecKey(t *testing.T) { + p, s := GenerateKeyPair() + a := MustBitcoinAddressFromSecKey(s) + // Valid pubkey+address + require.NoError(t, a.Verify(p)) + + require.Panics(t, func() { + MustBitcoinAddressFromSecKey(SecKey{}) + }) +} + +func TestBitcoinAddressNull(t *testing.T) { + var a BitcoinAddress + require.True(t, a.Null()) + + p, _ := GenerateKeyPair() + a = BitcoinAddressFromPubKey(p) + require.False(t, a.Null()) +} + +func TestBitcoinAddressVerify(t *testing.T) { + p, _ := GenerateKeyPair() + a := BitcoinAddressFromPubKey(p) + // Valid pubkey+address + require.NoError(t, a.Verify(p)) + // Invalid pubkey + require.Error(t, a.Verify(PubKey{})) + p2, _ := GenerateKeyPair() + require.Error(t, a.Verify(p2)) + // Bad version + a.Version = 0x01 + require.Error(t, a.Verify(p)) +} + +func TestBitcoinWIFRoundTrip(t *testing.T) { + _, seckey1 := GenerateKeyPair() + wif1 := BitcoinWalletImportFormatFromSeckey(seckey1) + seckey2, err := SecKeyFromBitcoinWalletImportFormat(wif1) + wif2 := BitcoinWalletImportFormatFromSeckey(seckey2) + + require.NoError(t, err) + require.Equal(t, seckey1, seckey2) + require.Equal(t, seckey1.Hex(), seckey2.Hex()) + require.Equal(t, wif1, wif2) +} + +func TestBitcoinWIF(t *testing.T) { + cases := []struct { + wif string + pubkey string + addr string + }{ + { + wif: "KwntMbt59tTsj8xqpqYqRRWufyjGunvhSyeMo3NTYpFYzZbXJ5Hp", + pubkey: "034f355bdcb7cc0af728ef3cceb9615d90684bb5b2ca5f859ab0f0b704075871aa", + addr: "1Q1pE5vPGEEMqRcVRMbtBK842Y6Pzo6nK9", + }, + { + wif: "L4ezQvyC6QoBhxB4GVs9fAPhUKtbaXYUn8YTqoeXwbevQq4U92vN", + pubkey: "02ed83704c95d829046f1ac27806211132102c34e9ac7ffa1b71110658e5b9d1bd", + addr: "1NKRhS7iYUGTaAfaR5z8BueAJesqaTyc4a", + }, + { + wif: "KydbzBtk6uc7M6dXwEgTEH2sphZxSPbmDSz6kUUHi4eUpSQuhEbq", + pubkey: "032596957532fc37e40486b910802ff45eeaa924548c0e1c080ef804e523ec3ed3", + addr: "19ck9VKC6KjGxR9LJg4DNMRc45qFrJguvV", + }, + } + + for _, tc := range cases { + t.Run(tc.addr, func(t *testing.T) { + seckey, err := SecKeyFromBitcoinWalletImportFormat(tc.wif) + require.NoError(t, err) + + require.NotPanics(t, func() { + MustSecKeyFromBitcoinWalletImportFormat(tc.wif) + }) + + pubkey := MustPubKeyFromSecKey(seckey) + require.Equal(t, tc.pubkey, pubkey.Hex()) + + bitcoinAddr := BitcoinAddressFromPubKey(pubkey) + require.Equal(t, tc.addr, bitcoinAddr.String()) + }) + } +} + +func TestBitcoinWIFFailures(t *testing.T) { + a := " asdio" + _, err := SecKeyFromBitcoinWalletImportFormat(a) + require.Equal(t, errors.New("Invalid base58 character"), err) + + a = string(base58.Encode(randBytes(t, 37))) + _, err = SecKeyFromBitcoinWalletImportFormat(a) + require.Equal(t, errors.New("Invalid length"), err) + + a = string(base58.Encode(randBytes(t, 39))) + _, err = SecKeyFromBitcoinWalletImportFormat(a) + require.Equal(t, errors.New("Invalid length"), err) + + b := randBytes(t, 38) + b[0] = 0x70 + a = string(base58.Encode(b)) + _, err = SecKeyFromBitcoinWalletImportFormat(a) + require.Equal(t, errors.New("Bitcoin WIF: First byte invalid"), err) + + b = randBytes(t, 38) + b[0] = 0x80 + b[33] = 0x02 + a = string(base58.Encode(b)) + _, err = SecKeyFromBitcoinWalletImportFormat(a) + require.Equal(t, errors.New("Bitcoin WIF: Invalid 33rd byte"), err) + + b = randBytes(t, 38) + b[0] = 0x80 + b[33] = 0x01 + hashed := DoubleSHA256(b[0:34]) + chksum := hashed[0:4] + chksum[0] = chksum[0] + 1 + copy(b[34:38], chksum[:]) + a = string(base58.Encode(b)) + _, err = SecKeyFromBitcoinWalletImportFormat(a) + require.Equal(t, errors.New("Bitcoin WIF: Checksum fail"), err) +} + +func TestMustBitcoinWIFFailures(t *testing.T) { + a := " asdio" + require.Panics(t, func() { + MustSecKeyFromBitcoinWalletImportFormat(a) + }) + + a = string(base58.Encode(randBytes(t, 37))) + require.Panics(t, func() { + MustSecKeyFromBitcoinWalletImportFormat(a) + }) + + a = string(base58.Encode(randBytes(t, 39))) + require.Panics(t, func() { + MustSecKeyFromBitcoinWalletImportFormat(a) + }) + + b := randBytes(t, 38) + b[0] = 0x70 + a = string(base58.Encode(b)) + require.Panics(t, func() { + MustSecKeyFromBitcoinWalletImportFormat(a) + }) + + b = randBytes(t, 38) + b[0] = 0x80 + b[33] = 0x02 + a = string(base58.Encode(b)) + require.Panics(t, func() { + MustSecKeyFromBitcoinWalletImportFormat(a) + }) + + b = randBytes(t, 38) + b[0] = 0x80 + b[33] = 0x01 + hashed := DoubleSHA256(b[0:34]) + chksum := hashed[0:4] + chksum[0] = chksum[0] + 1 + copy(b[34:38], chksum[:]) + a = string(base58.Encode(b)) + require.Panics(t, func() { + MustSecKeyFromBitcoinWalletImportFormat(a) + }) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/chacha20poly1305/chacha20poly1305.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/chacha20poly1305/chacha20poly1305.go new file mode 100644 index 00000000..aa62b306 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/chacha20poly1305/chacha20poly1305.go @@ -0,0 +1,83 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package chacha20poly1305 implements the ChaCha20-Poly1305 AEAD as specified in RFC 7539. +package chacha20poly1305 // import "github.com/SkycoinProject/skycoin/src/cipher/chacha20poly1305" + +import ( + "crypto/cipher" + "errors" +) + +const ( + // KeySize is the size of the key used by this AEAD, in bytes. + KeySize = 32 + // NonceSize is the size of the nonce used with this AEAD, in bytes. + NonceSize = 12 +) + +type chacha20poly1305 struct { + key [32]byte +} + +// New returns a ChaCha20-Poly1305 AEAD that uses the given, 256-bit key. +func New(key []byte) (cipher.AEAD, error) { + if len(key) != KeySize { + return nil, errors.New("chacha20poly1305: bad key length") + } + ret := new(chacha20poly1305) + copy(ret.key[:], key) + return ret, nil +} + +func (c *chacha20poly1305) NonceSize() int { + return NonceSize +} + +func (c *chacha20poly1305) Overhead() int { + return 16 +} + +func (c *chacha20poly1305) Seal(dst, nonce, plaintext, additionalData []byte) []byte { + if len(nonce) != NonceSize { + panic("chacha20poly1305: bad nonce length passed to Seal") + } + + if uint64(len(plaintext)) > (1<<38)-64 { + panic("chacha20poly1305: plaintext too large") + } + + return c.seal(dst, nonce, plaintext, additionalData) +} + +var errOpen = errors.New("chacha20poly1305: message authentication failed") + +func (c *chacha20poly1305) Open(dst, nonce, ciphertext, additionalData []byte) ([]byte, error) { + if len(nonce) != NonceSize { + panic("chacha20poly1305: bad nonce length passed to Open") + } + if len(ciphertext) < 16 { + return nil, errOpen + } + if uint64(len(ciphertext)) > (1<<38)-48 { + panic("chacha20poly1305: ciphertext too large") + } + + return c.open(dst, nonce, ciphertext, additionalData) +} + +// sliceForAppend takes a slice and a requested number of bytes. It returns a +// slice with the contents of the given slice followed by that many bytes and a +// second slice that aliases into it and contains only the extra bytes. If the +// original slice has sufficient capacity then no allocation is performed. +func sliceForAppend(in []byte, n int) (head, tail []byte) { + if total := len(in) + n; cap(in) >= total { + head = in[:total] + } else { + head = make([]byte, total) + copy(head, in) + } + tail = head[len(in):] + return +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_amd64.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_amd64.go new file mode 100644 index 00000000..7cd7ad83 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_amd64.go @@ -0,0 +1,127 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build go1.7,amd64,!gccgo,!appengine + +package chacha20poly1305 + +import "encoding/binary" + +//go:noescape +func chacha20Poly1305Open(dst []byte, key []uint32, src, ad []byte) bool + +//go:noescape +func chacha20Poly1305Seal(dst []byte, key []uint32, src, ad []byte) + +// cpuid is implemented in chacha20poly1305_amd64.s. +func cpuid(eaxArg, ecxArg uint32) (eax, ebx, ecx, edx uint32) + +// xgetbv with ecx = 0 is implemented in chacha20poly1305_amd64.s. +func xgetbv() (eax, edx uint32) + +var ( + useASM bool + useAVX2 bool +) + +func init() { + detectCPUFeatures() +} + +// detectCPUFeatures is used to detect if cpu instructions +// used by the functions implemented in assembler in +// chacha20poly1305_amd64.s are supported. +func detectCPUFeatures() { + maxID, _, _, _ := cpuid(0, 0) + if maxID < 1 { + return + } + + _, _, ecx1, _ := cpuid(1, 0) + + haveSSSE3 := isSet(9, ecx1) + useASM = haveSSSE3 + + haveOSXSAVE := isSet(27, ecx1) + + osSupportsAVX := false + // For XGETBV, OSXSAVE bit is required and sufficient. + if haveOSXSAVE { + eax, _ := xgetbv() + // Check if XMM and YMM registers have OS support. + osSupportsAVX = isSet(1, eax) && isSet(2, eax) + } + haveAVX := isSet(28, ecx1) && osSupportsAVX + + if maxID < 7 { + return + } + + _, ebx7, _, _ := cpuid(7, 0) + haveAVX2 := isSet(5, ebx7) && haveAVX + haveBMI2 := isSet(8, ebx7) + + useAVX2 = haveAVX2 && haveBMI2 +} + +// isSet checks if bit at bitpos is set in value. +func isSet(bitpos uint, value uint32) bool { + return value&(1<+0x00(SB)/4, $0x61707865 +DATA ·chacha20Constants<>+0x04(SB)/4, $0x3320646e +DATA ·chacha20Constants<>+0x08(SB)/4, $0x79622d32 +DATA ·chacha20Constants<>+0x0c(SB)/4, $0x6b206574 +DATA ·chacha20Constants<>+0x10(SB)/4, $0x61707865 +DATA ·chacha20Constants<>+0x14(SB)/4, $0x3320646e +DATA ·chacha20Constants<>+0x18(SB)/4, $0x79622d32 +DATA ·chacha20Constants<>+0x1c(SB)/4, $0x6b206574 +// <<< 16 with PSHUFB +DATA ·rol16<>+0x00(SB)/8, $0x0504070601000302 +DATA ·rol16<>+0x08(SB)/8, $0x0D0C0F0E09080B0A +DATA ·rol16<>+0x10(SB)/8, $0x0504070601000302 +DATA ·rol16<>+0x18(SB)/8, $0x0D0C0F0E09080B0A +// <<< 8 with PSHUFB +DATA ·rol8<>+0x00(SB)/8, $0x0605040702010003 +DATA ·rol8<>+0x08(SB)/8, $0x0E0D0C0F0A09080B +DATA ·rol8<>+0x10(SB)/8, $0x0605040702010003 +DATA ·rol8<>+0x18(SB)/8, $0x0E0D0C0F0A09080B + +DATA ·avx2InitMask<>+0x00(SB)/8, $0x0 +DATA ·avx2InitMask<>+0x08(SB)/8, $0x0 +DATA ·avx2InitMask<>+0x10(SB)/8, $0x1 +DATA ·avx2InitMask<>+0x18(SB)/8, $0x0 + +DATA ·avx2IncMask<>+0x00(SB)/8, $0x2 +DATA ·avx2IncMask<>+0x08(SB)/8, $0x0 +DATA ·avx2IncMask<>+0x10(SB)/8, $0x2 +DATA ·avx2IncMask<>+0x18(SB)/8, $0x0 +// Poly1305 key clamp +DATA ·polyClampMask<>+0x00(SB)/8, $0x0FFFFFFC0FFFFFFF +DATA ·polyClampMask<>+0x08(SB)/8, $0x0FFFFFFC0FFFFFFC +DATA ·polyClampMask<>+0x10(SB)/8, $0xFFFFFFFFFFFFFFFF +DATA ·polyClampMask<>+0x18(SB)/8, $0xFFFFFFFFFFFFFFFF + +DATA ·sseIncMask<>+0x00(SB)/8, $0x1 +DATA ·sseIncMask<>+0x08(SB)/8, $0x0 +// To load/store the last < 16 bytes in a buffer +DATA ·andMask<>+0x00(SB)/8, $0x00000000000000ff +DATA ·andMask<>+0x08(SB)/8, $0x0000000000000000 +DATA ·andMask<>+0x10(SB)/8, $0x000000000000ffff +DATA ·andMask<>+0x18(SB)/8, $0x0000000000000000 +DATA ·andMask<>+0x20(SB)/8, $0x0000000000ffffff +DATA ·andMask<>+0x28(SB)/8, $0x0000000000000000 +DATA ·andMask<>+0x30(SB)/8, $0x00000000ffffffff +DATA ·andMask<>+0x38(SB)/8, $0x0000000000000000 +DATA ·andMask<>+0x40(SB)/8, $0x000000ffffffffff +DATA ·andMask<>+0x48(SB)/8, $0x0000000000000000 +DATA ·andMask<>+0x50(SB)/8, $0x0000ffffffffffff +DATA ·andMask<>+0x58(SB)/8, $0x0000000000000000 +DATA ·andMask<>+0x60(SB)/8, $0x00ffffffffffffff +DATA ·andMask<>+0x68(SB)/8, $0x0000000000000000 +DATA ·andMask<>+0x70(SB)/8, $0xffffffffffffffff +DATA ·andMask<>+0x78(SB)/8, $0x0000000000000000 +DATA ·andMask<>+0x80(SB)/8, $0xffffffffffffffff +DATA ·andMask<>+0x88(SB)/8, $0x00000000000000ff +DATA ·andMask<>+0x90(SB)/8, $0xffffffffffffffff +DATA ·andMask<>+0x98(SB)/8, $0x000000000000ffff +DATA ·andMask<>+0xa0(SB)/8, $0xffffffffffffffff +DATA ·andMask<>+0xa8(SB)/8, $0x0000000000ffffff +DATA ·andMask<>+0xb0(SB)/8, $0xffffffffffffffff +DATA ·andMask<>+0xb8(SB)/8, $0x00000000ffffffff +DATA ·andMask<>+0xc0(SB)/8, $0xffffffffffffffff +DATA ·andMask<>+0xc8(SB)/8, $0x000000ffffffffff +DATA ·andMask<>+0xd0(SB)/8, $0xffffffffffffffff +DATA ·andMask<>+0xd8(SB)/8, $0x0000ffffffffffff +DATA ·andMask<>+0xe0(SB)/8, $0xffffffffffffffff +DATA ·andMask<>+0xe8(SB)/8, $0x00ffffffffffffff + +GLOBL ·chacha20Constants<>(SB), (NOPTR+RODATA), $32 +GLOBL ·rol16<>(SB), (NOPTR+RODATA), $32 +GLOBL ·rol8<>(SB), (NOPTR+RODATA), $32 +GLOBL ·sseIncMask<>(SB), (NOPTR+RODATA), $16 +GLOBL ·avx2IncMask<>(SB), (NOPTR+RODATA), $32 +GLOBL ·avx2InitMask<>(SB), (NOPTR+RODATA), $32 +GLOBL ·polyClampMask<>(SB), (NOPTR+RODATA), $32 +GLOBL ·andMask<>(SB), (NOPTR+RODATA), $240 +// No PALIGNR in Go ASM yet (but VPALIGNR is present). +#define shiftB0Left BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xdb; BYTE $0x04 // PALIGNR $4, X3, X3 +#define shiftB1Left BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xe4; BYTE $0x04 // PALIGNR $4, X4, X4 +#define shiftB2Left BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xed; BYTE $0x04 // PALIGNR $4, X5, X5 +#define shiftB3Left BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xed; BYTE $0x04 // PALIGNR $4, X13, X13 +#define shiftC0Left BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xf6; BYTE $0x08 // PALIGNR $8, X6, X6 +#define shiftC1Left BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xff; BYTE $0x08 // PALIGNR $8, X7, X7 +#define shiftC2Left BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xc0; BYTE $0x08 // PALIGNR $8, X8, X8 +#define shiftC3Left BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xf6; BYTE $0x08 // PALIGNR $8, X14, X14 +#define shiftD0Left BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xc9; BYTE $0x0c // PALIGNR $12, X9, X9 +#define shiftD1Left BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xd2; BYTE $0x0c // PALIGNR $12, X10, X10 +#define shiftD2Left BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xdb; BYTE $0x0c // PALIGNR $12, X11, X11 +#define shiftD3Left BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xff; BYTE $0x0c // PALIGNR $12, X15, X15 +#define shiftB0Right BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xdb; BYTE $0x0c // PALIGNR $12, X3, X3 +#define shiftB1Right BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xe4; BYTE $0x0c // PALIGNR $12, X4, X4 +#define shiftB2Right BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xed; BYTE $0x0c // PALIGNR $12, X5, X5 +#define shiftB3Right BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xed; BYTE $0x0c // PALIGNR $12, X13, X13 +#define shiftC0Right shiftC0Left +#define shiftC1Right shiftC1Left +#define shiftC2Right shiftC2Left +#define shiftC3Right shiftC3Left +#define shiftD0Right BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xc9; BYTE $0x04 // PALIGNR $4, X9, X9 +#define shiftD1Right BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xd2; BYTE $0x04 // PALIGNR $4, X10, X10 +#define shiftD2Right BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xdb; BYTE $0x04 // PALIGNR $4, X11, X11 +#define shiftD3Right BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xff; BYTE $0x04 // PALIGNR $4, X15, X15 +// Some macros +#define chachaQR(A, B, C, D, T) \ + PADDD B, A; PXOR A, D; PSHUFB ·rol16<>(SB), D \ + PADDD D, C; PXOR C, B; MOVO B, T; PSLLL $12, T; PSRLL $20, B; PXOR T, B \ + PADDD B, A; PXOR A, D; PSHUFB ·rol8<>(SB), D \ + PADDD D, C; PXOR C, B; MOVO B, T; PSLLL $7, T; PSRLL $25, B; PXOR T, B + +#define chachaQR_AVX2(A, B, C, D, T) \ + VPADDD B, A, A; VPXOR A, D, D; VPSHUFB ·rol16<>(SB), D, D \ + VPADDD D, C, C; VPXOR C, B, B; VPSLLD $12, B, T; VPSRLD $20, B, B; VPXOR T, B, B \ + VPADDD B, A, A; VPXOR A, D, D; VPSHUFB ·rol8<>(SB), D, D \ + VPADDD D, C, C; VPXOR C, B, B; VPSLLD $7, B, T; VPSRLD $25, B, B; VPXOR T, B, B + +#define polyAdd(S) ADDQ S, acc0; ADCQ 8+S, acc1; ADCQ $1, acc2 +#define polyMulStage1 MOVQ (0*8)(BP), AX; MOVQ AX, t2; MULQ acc0; MOVQ AX, t0; MOVQ DX, t1; MOVQ (0*8)(BP), AX; MULQ acc1; IMULQ acc2, t2; ADDQ AX, t1; ADCQ DX, t2 +#define polyMulStage2 MOVQ (1*8)(BP), AX; MOVQ AX, t3; MULQ acc0; ADDQ AX, t1; ADCQ $0, DX; MOVQ DX, acc0; MOVQ (1*8)(BP), AX; MULQ acc1; ADDQ AX, t2; ADCQ $0, DX +#define polyMulStage3 IMULQ acc2, t3; ADDQ acc0, t2; ADCQ DX, t3 +#define polyMulReduceStage MOVQ t0, acc0; MOVQ t1, acc1; MOVQ t2, acc2; ANDQ $3, acc2; MOVQ t2, t0; ANDQ $-4, t0; MOVQ t3, t1; SHRQ $2, t2:t3; SHRQ $2, t3; ADDQ t0, acc0; ADCQ t1, acc1; ADCQ $0, acc2; ADDQ t2, acc0; ADCQ t3, acc1; ADCQ $0, acc2 + +#define polyMulStage1_AVX2 MOVQ (0*8)(BP), DX; MOVQ DX, t2; MULXQ acc0, t0, t1; IMULQ acc2, t2; MULXQ acc1, AX, DX; ADDQ AX, t1; ADCQ DX, t2 +#define polyMulStage2_AVX2 MOVQ (1*8)(BP), DX; MULXQ acc0, acc0, AX; ADDQ acc0, t1; MULXQ acc1, acc1, t3; ADCQ acc1, t2; ADCQ $0, t3 +#define polyMulStage3_AVX2 IMULQ acc2, DX; ADDQ AX, t2; ADCQ DX, t3 + +#define polyMul polyMulStage1; polyMulStage2; polyMulStage3; polyMulReduceStage +#define polyMulAVX2 polyMulStage1_AVX2; polyMulStage2_AVX2; polyMulStage3_AVX2; polyMulReduceStage +// ---------------------------------------------------------------------------- +TEXT polyHashADInternal<>(SB), NOSPLIT, $0 + // adp points to beginning of additional data + // itr2 holds ad length + XORQ acc0, acc0 + XORQ acc1, acc1 + XORQ acc2, acc2 + CMPQ itr2, $13 + JNE hashADLoop + +openFastTLSAD: + // Special treatment for the TLS case of 13 bytes + MOVQ (adp), acc0 + MOVQ 5(adp), acc1 + SHRQ $24, acc1 + MOVQ $1, acc2 + polyMul + RET + +hashADLoop: + // Hash in 16 byte chunks + CMPQ itr2, $16 + JB hashADTail + polyAdd(0(adp)) + LEAQ (1*16)(adp), adp + SUBQ $16, itr2 + polyMul + JMP hashADLoop + +hashADTail: + CMPQ itr2, $0 + JE hashADDone + + // Hash last < 16 byte tail + XORQ t0, t0 + XORQ t1, t1 + XORQ t2, t2 + ADDQ itr2, adp + +hashADTailLoop: + SHLQ $8, t1:t0 + SHLQ $8, t0 + MOVB -1(adp), t2 + XORQ t2, t0 + DECQ adp + DECQ itr2 + JNE hashADTailLoop + +hashADTailFinish: + ADDQ t0, acc0; ADCQ t1, acc1; ADCQ $1, acc2 + polyMul + + // Finished AD +hashADDone: + RET + +// ---------------------------------------------------------------------------- +// func chacha20Poly1305Open(dst, key, src, ad []byte) bool +TEXT ·chacha20Poly1305Open(SB), 0, $288-97 + // For aligned stack access + MOVQ SP, BP + ADDQ $32, BP + ANDQ $-32, BP + MOVQ dst+0(FP), oup + MOVQ key+24(FP), keyp + MOVQ src+48(FP), inp + MOVQ src_len+56(FP), inl + MOVQ ad+72(FP), adp + + // Check for AVX2 support + CMPB ·useAVX2(SB), $1 + JE chacha20Poly1305Open_AVX2 + + // Special optimization, for very short buffers + CMPQ inl, $128 + JBE openSSE128 // About 16% faster + + // For long buffers, prepare the poly key first + MOVOU ·chacha20Constants<>(SB), A0 + MOVOU (1*16)(keyp), B0 + MOVOU (2*16)(keyp), C0 + MOVOU (3*16)(keyp), D0 + MOVO D0, T1 + + // Store state on stack for future use + MOVO B0, state1Store + MOVO C0, state2Store + MOVO D0, ctr3Store + MOVQ $10, itr2 + +openSSEPreparePolyKey: + chachaQR(A0, B0, C0, D0, T0) + shiftB0Left; shiftC0Left; shiftD0Left + chachaQR(A0, B0, C0, D0, T0) + shiftB0Right; shiftC0Right; shiftD0Right + DECQ itr2 + JNE openSSEPreparePolyKey + + // A0|B0 hold the Poly1305 32-byte key, C0,D0 can be discarded + PADDL ·chacha20Constants<>(SB), A0; PADDL state1Store, B0 + + // Clamp and store the key + PAND ·polyClampMask<>(SB), A0 + MOVO A0, rStore; MOVO B0, sStore + + // Hash AAD + MOVQ ad_len+80(FP), itr2 + CALL polyHashADInternal<>(SB) + +openSSEMainLoop: + CMPQ inl, $256 + JB openSSEMainLoopDone + + // Load state, increment counter blocks + MOVO ·chacha20Constants<>(SB), A0; MOVO state1Store, B0; MOVO state2Store, C0; MOVO ctr3Store, D0; PADDL ·sseIncMask<>(SB), D0 + MOVO A0, A1; MOVO B0, B1; MOVO C0, C1; MOVO D0, D1; PADDL ·sseIncMask<>(SB), D1 + MOVO A1, A2; MOVO B1, B2; MOVO C1, C2; MOVO D1, D2; PADDL ·sseIncMask<>(SB), D2 + MOVO A2, A3; MOVO B2, B3; MOVO C2, C3; MOVO D2, D3; PADDL ·sseIncMask<>(SB), D3 + + // Store counters + MOVO D0, ctr0Store; MOVO D1, ctr1Store; MOVO D2, ctr2Store; MOVO D3, ctr3Store + + // There are 10 ChaCha20 iterations of 2QR each, so for 6 iterations we hash 2 blocks, and for the remaining 4 only 1 block - for a total of 16 + MOVQ $4, itr1 + MOVQ inp, itr2 + +openSSEInternalLoop: + MOVO C3, tmpStore + chachaQR(A0, B0, C0, D0, C3); chachaQR(A1, B1, C1, D1, C3); chachaQR(A2, B2, C2, D2, C3) + MOVO tmpStore, C3 + MOVO C1, tmpStore + chachaQR(A3, B3, C3, D3, C1) + MOVO tmpStore, C1 + polyAdd(0(itr2)) + shiftB0Left; shiftB1Left; shiftB2Left; shiftB3Left + shiftC0Left; shiftC1Left; shiftC2Left; shiftC3Left + shiftD0Left; shiftD1Left; shiftD2Left; shiftD3Left + polyMulStage1 + polyMulStage2 + LEAQ (2*8)(itr2), itr2 + MOVO C3, tmpStore + chachaQR(A0, B0, C0, D0, C3); chachaQR(A1, B1, C1, D1, C3); chachaQR(A2, B2, C2, D2, C3) + MOVO tmpStore, C3 + MOVO C1, tmpStore + polyMulStage3 + chachaQR(A3, B3, C3, D3, C1) + MOVO tmpStore, C1 + polyMulReduceStage + shiftB0Right; shiftB1Right; shiftB2Right; shiftB3Right + shiftC0Right; shiftC1Right; shiftC2Right; shiftC3Right + shiftD0Right; shiftD1Right; shiftD2Right; shiftD3Right + DECQ itr1 + JGE openSSEInternalLoop + + polyAdd(0(itr2)) + polyMul + LEAQ (2*8)(itr2), itr2 + + CMPQ itr1, $-6 + JG openSSEInternalLoop + + // Add in the state + PADDD ·chacha20Constants<>(SB), A0; PADDD ·chacha20Constants<>(SB), A1; PADDD ·chacha20Constants<>(SB), A2; PADDD ·chacha20Constants<>(SB), A3 + PADDD state1Store, B0; PADDD state1Store, B1; PADDD state1Store, B2; PADDD state1Store, B3 + PADDD state2Store, C0; PADDD state2Store, C1; PADDD state2Store, C2; PADDD state2Store, C3 + PADDD ctr0Store, D0; PADDD ctr1Store, D1; PADDD ctr2Store, D2; PADDD ctr3Store, D3 + + // Load - xor - store + MOVO D3, tmpStore + MOVOU (0*16)(inp), D3; PXOR D3, A0; MOVOU A0, (0*16)(oup) + MOVOU (1*16)(inp), D3; PXOR D3, B0; MOVOU B0, (1*16)(oup) + MOVOU (2*16)(inp), D3; PXOR D3, C0; MOVOU C0, (2*16)(oup) + MOVOU (3*16)(inp), D3; PXOR D3, D0; MOVOU D0, (3*16)(oup) + MOVOU (4*16)(inp), D0; PXOR D0, A1; MOVOU A1, (4*16)(oup) + MOVOU (5*16)(inp), D0; PXOR D0, B1; MOVOU B1, (5*16)(oup) + MOVOU (6*16)(inp), D0; PXOR D0, C1; MOVOU C1, (6*16)(oup) + MOVOU (7*16)(inp), D0; PXOR D0, D1; MOVOU D1, (7*16)(oup) + MOVOU (8*16)(inp), D0; PXOR D0, A2; MOVOU A2, (8*16)(oup) + MOVOU (9*16)(inp), D0; PXOR D0, B2; MOVOU B2, (9*16)(oup) + MOVOU (10*16)(inp), D0; PXOR D0, C2; MOVOU C2, (10*16)(oup) + MOVOU (11*16)(inp), D0; PXOR D0, D2; MOVOU D2, (11*16)(oup) + MOVOU (12*16)(inp), D0; PXOR D0, A3; MOVOU A3, (12*16)(oup) + MOVOU (13*16)(inp), D0; PXOR D0, B3; MOVOU B3, (13*16)(oup) + MOVOU (14*16)(inp), D0; PXOR D0, C3; MOVOU C3, (14*16)(oup) + MOVOU (15*16)(inp), D0; PXOR tmpStore, D0; MOVOU D0, (15*16)(oup) + LEAQ 256(inp), inp + LEAQ 256(oup), oup + SUBQ $256, inl + JMP openSSEMainLoop + +openSSEMainLoopDone: + // Handle the various tail sizes efficiently + TESTQ inl, inl + JE openSSEFinalize + CMPQ inl, $64 + JBE openSSETail64 + CMPQ inl, $128 + JBE openSSETail128 + CMPQ inl, $192 + JBE openSSETail192 + JMP openSSETail256 + +openSSEFinalize: + // Hash in the PT, AAD lengths + ADDQ ad_len+80(FP), acc0; ADCQ src_len+56(FP), acc1; ADCQ $1, acc2 + polyMul + + // Final reduce + MOVQ acc0, t0 + MOVQ acc1, t1 + MOVQ acc2, t2 + SUBQ $-5, acc0 + SBBQ $-1, acc1 + SBBQ $3, acc2 + CMOVQCS t0, acc0 + CMOVQCS t1, acc1 + CMOVQCS t2, acc2 + + // Add in the "s" part of the key + ADDQ 0+sStore, acc0 + ADCQ 8+sStore, acc1 + + // Finally, constant time compare to the tag at the end of the message + XORQ AX, AX + MOVQ $1, DX + XORQ (0*8)(inp), acc0 + XORQ (1*8)(inp), acc1 + ORQ acc1, acc0 + CMOVQEQ DX, AX + + // Return true iff tags are equal + MOVB AX, ret+96(FP) + RET + +// ---------------------------------------------------------------------------- +// Special optimization for buffers smaller than 129 bytes +openSSE128: + // For up to 128 bytes of ciphertext and 64 bytes for the poly key, we require to process three blocks + MOVOU ·chacha20Constants<>(SB), A0; MOVOU (1*16)(keyp), B0; MOVOU (2*16)(keyp), C0; MOVOU (3*16)(keyp), D0 + MOVO A0, A1; MOVO B0, B1; MOVO C0, C1; MOVO D0, D1; PADDL ·sseIncMask<>(SB), D1 + MOVO A1, A2; MOVO B1, B2; MOVO C1, C2; MOVO D1, D2; PADDL ·sseIncMask<>(SB), D2 + MOVO B0, T1; MOVO C0, T2; MOVO D1, T3 + MOVQ $10, itr2 + +openSSE128InnerCipherLoop: + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0); chachaQR(A2, B2, C2, D2, T0) + shiftB0Left; shiftB1Left; shiftB2Left + shiftC0Left; shiftC1Left; shiftC2Left + shiftD0Left; shiftD1Left; shiftD2Left + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0); chachaQR(A2, B2, C2, D2, T0) + shiftB0Right; shiftB1Right; shiftB2Right + shiftC0Right; shiftC1Right; shiftC2Right + shiftD0Right; shiftD1Right; shiftD2Right + DECQ itr2 + JNE openSSE128InnerCipherLoop + + // A0|B0 hold the Poly1305 32-byte key, C0,D0 can be discarded + PADDL ·chacha20Constants<>(SB), A0; PADDL ·chacha20Constants<>(SB), A1; PADDL ·chacha20Constants<>(SB), A2 + PADDL T1, B0; PADDL T1, B1; PADDL T1, B2 + PADDL T2, C1; PADDL T2, C2 + PADDL T3, D1; PADDL ·sseIncMask<>(SB), T3; PADDL T3, D2 + + // Clamp and store the key + PAND ·polyClampMask<>(SB), A0 + MOVOU A0, rStore; MOVOU B0, sStore + + // Hash + MOVQ ad_len+80(FP), itr2 + CALL polyHashADInternal<>(SB) + +openSSE128Open: + CMPQ inl, $16 + JB openSSETail16 + SUBQ $16, inl + + // Load for hashing + polyAdd(0(inp)) + + // Load for decryption + MOVOU (inp), T0; PXOR T0, A1; MOVOU A1, (oup) + LEAQ (1*16)(inp), inp + LEAQ (1*16)(oup), oup + polyMul + + // Shift the stream "left" + MOVO B1, A1 + MOVO C1, B1 + MOVO D1, C1 + MOVO A2, D1 + MOVO B2, A2 + MOVO C2, B2 + MOVO D2, C2 + JMP openSSE128Open + +openSSETail16: + TESTQ inl, inl + JE openSSEFinalize + + // We can safely load the CT from the end, because it is padded with the MAC + MOVQ inl, itr2 + SHLQ $4, itr2 + LEAQ ·andMask<>(SB), t0 + MOVOU (inp), T0 + ADDQ inl, inp + PAND -16(t0)(itr2*1), T0 + MOVO T0, 0+tmpStore + MOVQ T0, t0 + MOVQ 8+tmpStore, t1 + PXOR A1, T0 + + // We can only store one byte at a time, since plaintext can be shorter than 16 bytes +openSSETail16Store: + MOVQ T0, t3 + MOVB t3, (oup) + PSRLDQ $1, T0 + INCQ oup + DECQ inl + JNE openSSETail16Store + ADDQ t0, acc0; ADCQ t1, acc1; ADCQ $1, acc2 + polyMul + JMP openSSEFinalize + +// ---------------------------------------------------------------------------- +// Special optimization for the last 64 bytes of ciphertext +openSSETail64: + // Need to decrypt up to 64 bytes - prepare single block + MOVO ·chacha20Constants<>(SB), A0; MOVO state1Store, B0; MOVO state2Store, C0; MOVO ctr3Store, D0; PADDL ·sseIncMask<>(SB), D0; MOVO D0, ctr0Store + XORQ itr2, itr2 + MOVQ inl, itr1 + CMPQ itr1, $16 + JB openSSETail64LoopB + +openSSETail64LoopA: + // Perform ChaCha rounds, while hashing the remaining input + polyAdd(0(inp)(itr2*1)) + polyMul + SUBQ $16, itr1 + +openSSETail64LoopB: + ADDQ $16, itr2 + chachaQR(A0, B0, C0, D0, T0) + shiftB0Left; shiftC0Left; shiftD0Left + chachaQR(A0, B0, C0, D0, T0) + shiftB0Right; shiftC0Right; shiftD0Right + + CMPQ itr1, $16 + JAE openSSETail64LoopA + + CMPQ itr2, $160 + JNE openSSETail64LoopB + + PADDL ·chacha20Constants<>(SB), A0; PADDL state1Store, B0; PADDL state2Store, C0; PADDL ctr0Store, D0 + +openSSETail64DecLoop: + CMPQ inl, $16 + JB openSSETail64DecLoopDone + SUBQ $16, inl + MOVOU (inp), T0 + PXOR T0, A0 + MOVOU A0, (oup) + LEAQ 16(inp), inp + LEAQ 16(oup), oup + MOVO B0, A0 + MOVO C0, B0 + MOVO D0, C0 + JMP openSSETail64DecLoop + +openSSETail64DecLoopDone: + MOVO A0, A1 + JMP openSSETail16 + +// ---------------------------------------------------------------------------- +// Special optimization for the last 128 bytes of ciphertext +openSSETail128: + // Need to decrypt up to 128 bytes - prepare two blocks + MOVO ·chacha20Constants<>(SB), A1; MOVO state1Store, B1; MOVO state2Store, C1; MOVO ctr3Store, D1; PADDL ·sseIncMask<>(SB), D1; MOVO D1, ctr0Store + MOVO A1, A0; MOVO B1, B0; MOVO C1, C0; MOVO D1, D0; PADDL ·sseIncMask<>(SB), D0; MOVO D0, ctr1Store + XORQ itr2, itr2 + MOVQ inl, itr1 + ANDQ $-16, itr1 + +openSSETail128LoopA: + // Perform ChaCha rounds, while hashing the remaining input + polyAdd(0(inp)(itr2*1)) + polyMul + +openSSETail128LoopB: + ADDQ $16, itr2 + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0) + shiftB0Left; shiftC0Left; shiftD0Left + shiftB1Left; shiftC1Left; shiftD1Left + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0) + shiftB0Right; shiftC0Right; shiftD0Right + shiftB1Right; shiftC1Right; shiftD1Right + + CMPQ itr2, itr1 + JB openSSETail128LoopA + + CMPQ itr2, $160 + JNE openSSETail128LoopB + + PADDL ·chacha20Constants<>(SB), A0; PADDL ·chacha20Constants<>(SB), A1 + PADDL state1Store, B0; PADDL state1Store, B1 + PADDL state2Store, C0; PADDL state2Store, C1 + PADDL ctr1Store, D0; PADDL ctr0Store, D1 + + MOVOU (0*16)(inp), T0; MOVOU (1*16)(inp), T1; MOVOU (2*16)(inp), T2; MOVOU (3*16)(inp), T3 + PXOR T0, A1; PXOR T1, B1; PXOR T2, C1; PXOR T3, D1 + MOVOU A1, (0*16)(oup); MOVOU B1, (1*16)(oup); MOVOU C1, (2*16)(oup); MOVOU D1, (3*16)(oup) + + SUBQ $64, inl + LEAQ 64(inp), inp + LEAQ 64(oup), oup + JMP openSSETail64DecLoop + +// ---------------------------------------------------------------------------- +// Special optimization for the last 192 bytes of ciphertext +openSSETail192: + // Need to decrypt up to 192 bytes - prepare three blocks + MOVO ·chacha20Constants<>(SB), A2; MOVO state1Store, B2; MOVO state2Store, C2; MOVO ctr3Store, D2; PADDL ·sseIncMask<>(SB), D2; MOVO D2, ctr0Store + MOVO A2, A1; MOVO B2, B1; MOVO C2, C1; MOVO D2, D1; PADDL ·sseIncMask<>(SB), D1; MOVO D1, ctr1Store + MOVO A1, A0; MOVO B1, B0; MOVO C1, C0; MOVO D1, D0; PADDL ·sseIncMask<>(SB), D0; MOVO D0, ctr2Store + + MOVQ inl, itr1 + MOVQ $160, itr2 + CMPQ itr1, $160 + CMOVQGT itr2, itr1 + ANDQ $-16, itr1 + XORQ itr2, itr2 + +openSSLTail192LoopA: + // Perform ChaCha rounds, while hashing the remaining input + polyAdd(0(inp)(itr2*1)) + polyMul + +openSSLTail192LoopB: + ADDQ $16, itr2 + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0); chachaQR(A2, B2, C2, D2, T0) + shiftB0Left; shiftC0Left; shiftD0Left + shiftB1Left; shiftC1Left; shiftD1Left + shiftB2Left; shiftC2Left; shiftD2Left + + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0); chachaQR(A2, B2, C2, D2, T0) + shiftB0Right; shiftC0Right; shiftD0Right + shiftB1Right; shiftC1Right; shiftD1Right + shiftB2Right; shiftC2Right; shiftD2Right + + CMPQ itr2, itr1 + JB openSSLTail192LoopA + + CMPQ itr2, $160 + JNE openSSLTail192LoopB + + CMPQ inl, $176 + JB openSSLTail192Store + + polyAdd(160(inp)) + polyMul + + CMPQ inl, $192 + JB openSSLTail192Store + + polyAdd(176(inp)) + polyMul + +openSSLTail192Store: + PADDL ·chacha20Constants<>(SB), A0; PADDL ·chacha20Constants<>(SB), A1; PADDL ·chacha20Constants<>(SB), A2 + PADDL state1Store, B0; PADDL state1Store, B1; PADDL state1Store, B2 + PADDL state2Store, C0; PADDL state2Store, C1; PADDL state2Store, C2 + PADDL ctr2Store, D0; PADDL ctr1Store, D1; PADDL ctr0Store, D2 + + MOVOU (0*16)(inp), T0; MOVOU (1*16)(inp), T1; MOVOU (2*16)(inp), T2; MOVOU (3*16)(inp), T3 + PXOR T0, A2; PXOR T1, B2; PXOR T2, C2; PXOR T3, D2 + MOVOU A2, (0*16)(oup); MOVOU B2, (1*16)(oup); MOVOU C2, (2*16)(oup); MOVOU D2, (3*16)(oup) + + MOVOU (4*16)(inp), T0; MOVOU (5*16)(inp), T1; MOVOU (6*16)(inp), T2; MOVOU (7*16)(inp), T3 + PXOR T0, A1; PXOR T1, B1; PXOR T2, C1; PXOR T3, D1 + MOVOU A1, (4*16)(oup); MOVOU B1, (5*16)(oup); MOVOU C1, (6*16)(oup); MOVOU D1, (7*16)(oup) + + SUBQ $128, inl + LEAQ 128(inp), inp + LEAQ 128(oup), oup + JMP openSSETail64DecLoop + +// ---------------------------------------------------------------------------- +// Special optimization for the last 256 bytes of ciphertext +openSSETail256: + // Need to decrypt up to 256 bytes - prepare four blocks + MOVO ·chacha20Constants<>(SB), A0; MOVO state1Store, B0; MOVO state2Store, C0; MOVO ctr3Store, D0; PADDL ·sseIncMask<>(SB), D0 + MOVO A0, A1; MOVO B0, B1; MOVO C0, C1; MOVO D0, D1; PADDL ·sseIncMask<>(SB), D1 + MOVO A1, A2; MOVO B1, B2; MOVO C1, C2; MOVO D1, D2; PADDL ·sseIncMask<>(SB), D2 + MOVO A2, A3; MOVO B2, B3; MOVO C2, C3; MOVO D2, D3; PADDL ·sseIncMask<>(SB), D3 + + // Store counters + MOVO D0, ctr0Store; MOVO D1, ctr1Store; MOVO D2, ctr2Store; MOVO D3, ctr3Store + XORQ itr2, itr2 + +openSSETail256Loop: + // This loop inteleaves 8 ChaCha quarter rounds with 1 poly multiplication + polyAdd(0(inp)(itr2*1)) + MOVO C3, tmpStore + chachaQR(A0, B0, C0, D0, C3); chachaQR(A1, B1, C1, D1, C3); chachaQR(A2, B2, C2, D2, C3) + MOVO tmpStore, C3 + MOVO C1, tmpStore + chachaQR(A3, B3, C3, D3, C1) + MOVO tmpStore, C1 + shiftB0Left; shiftB1Left; shiftB2Left; shiftB3Left + shiftC0Left; shiftC1Left; shiftC2Left; shiftC3Left + shiftD0Left; shiftD1Left; shiftD2Left; shiftD3Left + polyMulStage1 + polyMulStage2 + MOVO C3, tmpStore + chachaQR(A0, B0, C0, D0, C3); chachaQR(A1, B1, C1, D1, C3); chachaQR(A2, B2, C2, D2, C3) + MOVO tmpStore, C3 + MOVO C1, tmpStore + chachaQR(A3, B3, C3, D3, C1) + MOVO tmpStore, C1 + polyMulStage3 + polyMulReduceStage + shiftB0Right; shiftB1Right; shiftB2Right; shiftB3Right + shiftC0Right; shiftC1Right; shiftC2Right; shiftC3Right + shiftD0Right; shiftD1Right; shiftD2Right; shiftD3Right + ADDQ $2*8, itr2 + CMPQ itr2, $160 + JB openSSETail256Loop + MOVQ inl, itr1 + ANDQ $-16, itr1 + +openSSETail256HashLoop: + polyAdd(0(inp)(itr2*1)) + polyMul + ADDQ $2*8, itr2 + CMPQ itr2, itr1 + JB openSSETail256HashLoop + + // Add in the state + PADDD ·chacha20Constants<>(SB), A0; PADDD ·chacha20Constants<>(SB), A1; PADDD ·chacha20Constants<>(SB), A2; PADDD ·chacha20Constants<>(SB), A3 + PADDD state1Store, B0; PADDD state1Store, B1; PADDD state1Store, B2; PADDD state1Store, B3 + PADDD state2Store, C0; PADDD state2Store, C1; PADDD state2Store, C2; PADDD state2Store, C3 + PADDD ctr0Store, D0; PADDD ctr1Store, D1; PADDD ctr2Store, D2; PADDD ctr3Store, D3 + MOVO D3, tmpStore + + // Load - xor - store + MOVOU (0*16)(inp), D3; PXOR D3, A0 + MOVOU (1*16)(inp), D3; PXOR D3, B0 + MOVOU (2*16)(inp), D3; PXOR D3, C0 + MOVOU (3*16)(inp), D3; PXOR D3, D0 + MOVOU A0, (0*16)(oup) + MOVOU B0, (1*16)(oup) + MOVOU C0, (2*16)(oup) + MOVOU D0, (3*16)(oup) + MOVOU (4*16)(inp), A0; MOVOU (5*16)(inp), B0; MOVOU (6*16)(inp), C0; MOVOU (7*16)(inp), D0 + PXOR A0, A1; PXOR B0, B1; PXOR C0, C1; PXOR D0, D1 + MOVOU A1, (4*16)(oup); MOVOU B1, (5*16)(oup); MOVOU C1, (6*16)(oup); MOVOU D1, (7*16)(oup) + MOVOU (8*16)(inp), A0; MOVOU (9*16)(inp), B0; MOVOU (10*16)(inp), C0; MOVOU (11*16)(inp), D0 + PXOR A0, A2; PXOR B0, B2; PXOR C0, C2; PXOR D0, D2 + MOVOU A2, (8*16)(oup); MOVOU B2, (9*16)(oup); MOVOU C2, (10*16)(oup); MOVOU D2, (11*16)(oup) + LEAQ 192(inp), inp + LEAQ 192(oup), oup + SUBQ $192, inl + MOVO A3, A0 + MOVO B3, B0 + MOVO C3, C0 + MOVO tmpStore, D0 + + JMP openSSETail64DecLoop + +// ---------------------------------------------------------------------------- +// ------------------------- AVX2 Code ---------------------------------------- +chacha20Poly1305Open_AVX2: + VZEROUPPER + VMOVDQU ·chacha20Constants<>(SB), AA0 + BYTE $0xc4; BYTE $0x42; BYTE $0x7d; BYTE $0x5a; BYTE $0x70; BYTE $0x10 // broadcasti128 16(r8), ymm14 + BYTE $0xc4; BYTE $0x42; BYTE $0x7d; BYTE $0x5a; BYTE $0x60; BYTE $0x20 // broadcasti128 32(r8), ymm12 + BYTE $0xc4; BYTE $0xc2; BYTE $0x7d; BYTE $0x5a; BYTE $0x60; BYTE $0x30 // broadcasti128 48(r8), ymm4 + VPADDD ·avx2InitMask<>(SB), DD0, DD0 + + // Special optimization, for very short buffers + CMPQ inl, $192 + JBE openAVX2192 + CMPQ inl, $320 + JBE openAVX2320 + + // For the general key prepare the key first - as a byproduct we have 64 bytes of cipher stream + VMOVDQA BB0, state1StoreAVX2 + VMOVDQA CC0, state2StoreAVX2 + VMOVDQA DD0, ctr3StoreAVX2 + MOVQ $10, itr2 + +openAVX2PreparePolyKey: + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0) + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $12, DD0, DD0, DD0 + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0) + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $4, DD0, DD0, DD0 + DECQ itr2 + JNE openAVX2PreparePolyKey + + VPADDD ·chacha20Constants<>(SB), AA0, AA0 + VPADDD state1StoreAVX2, BB0, BB0 + VPADDD state2StoreAVX2, CC0, CC0 + VPADDD ctr3StoreAVX2, DD0, DD0 + + VPERM2I128 $0x02, AA0, BB0, TT0 + + // Clamp and store poly key + VPAND ·polyClampMask<>(SB), TT0, TT0 + VMOVDQA TT0, rsStoreAVX2 + + // Stream for the first 64 bytes + VPERM2I128 $0x13, AA0, BB0, AA0 + VPERM2I128 $0x13, CC0, DD0, BB0 + + // Hash AD + first 64 bytes + MOVQ ad_len+80(FP), itr2 + CALL polyHashADInternal<>(SB) + XORQ itr1, itr1 + +openAVX2InitialHash64: + polyAdd(0(inp)(itr1*1)) + polyMulAVX2 + ADDQ $16, itr1 + CMPQ itr1, $64 + JNE openAVX2InitialHash64 + + // Decrypt the first 64 bytes + VPXOR (0*32)(inp), AA0, AA0 + VPXOR (1*32)(inp), BB0, BB0 + VMOVDQU AA0, (0*32)(oup) + VMOVDQU BB0, (1*32)(oup) + LEAQ (2*32)(inp), inp + LEAQ (2*32)(oup), oup + SUBQ $64, inl + +openAVX2MainLoop: + CMPQ inl, $512 + JB openAVX2MainLoopDone + + // Load state, increment counter blocks, store the incremented counters + VMOVDQU ·chacha20Constants<>(SB), AA0; VMOVDQA AA0, AA1; VMOVDQA AA0, AA2; VMOVDQA AA0, AA3 + VMOVDQA state1StoreAVX2, BB0; VMOVDQA BB0, BB1; VMOVDQA BB0, BB2; VMOVDQA BB0, BB3 + VMOVDQA state2StoreAVX2, CC0; VMOVDQA CC0, CC1; VMOVDQA CC0, CC2; VMOVDQA CC0, CC3 + VMOVDQA ctr3StoreAVX2, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD1; VPADDD ·avx2IncMask<>(SB), DD1, DD2; VPADDD ·avx2IncMask<>(SB), DD2, DD3 + VMOVDQA DD0, ctr0StoreAVX2; VMOVDQA DD1, ctr1StoreAVX2; VMOVDQA DD2, ctr2StoreAVX2; VMOVDQA DD3, ctr3StoreAVX2 + XORQ itr1, itr1 + +openAVX2InternalLoop: + // Lets just say this spaghetti loop interleaves 2 quarter rounds with 3 poly multiplications + // Effectively per 512 bytes of stream we hash 480 bytes of ciphertext + polyAdd(0*8(inp)(itr1*1)) + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + polyMulStage1_AVX2 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 + polyMulStage2_AVX2 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + polyMulStage3_AVX2 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + polyMulReduceStage + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol8<>(SB), DD0, DD0; VPSHUFB ·rol8<>(SB), DD1, DD1; VPSHUFB ·rol8<>(SB), DD2, DD2; VPSHUFB ·rol8<>(SB), DD3, DD3 + polyAdd(2*8(inp)(itr1*1)) + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + polyMulStage1_AVX2 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $7, BB0, CC3; VPSRLD $25, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $7, BB1, CC3; VPSRLD $25, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $7, BB2, CC3; VPSRLD $25, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $7, BB3, CC3; VPSRLD $25, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + polyMulStage2_AVX2 + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $4, BB2, BB2, BB2; VPALIGNR $4, BB3, BB3, BB3 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $8, CC3, CC3, CC3 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1; VPALIGNR $12, DD2, DD2, DD2; VPALIGNR $12, DD3, DD3, DD3 + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + polyMulStage3_AVX2 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 + polyMulReduceStage + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + polyAdd(4*8(inp)(itr1*1)) + LEAQ (6*8)(itr1), itr1 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + polyMulStage1_AVX2 + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + polyMulStage2_AVX2 + VPSHUFB ·rol8<>(SB), DD0, DD0; VPSHUFB ·rol8<>(SB), DD1, DD1; VPSHUFB ·rol8<>(SB), DD2, DD2; VPSHUFB ·rol8<>(SB), DD3, DD3 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + polyMulStage3_AVX2 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $7, BB0, CC3; VPSRLD $25, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $7, BB1, CC3; VPSRLD $25, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $7, BB2, CC3; VPSRLD $25, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $7, BB3, CC3; VPSRLD $25, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + polyMulReduceStage + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $12, BB2, BB2, BB2; VPALIGNR $12, BB3, BB3, BB3 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $8, CC3, CC3, CC3 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1; VPALIGNR $4, DD2, DD2, DD2; VPALIGNR $4, DD3, DD3, DD3 + CMPQ itr1, $480 + JNE openAVX2InternalLoop + + VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1; VPADDD ·chacha20Constants<>(SB), AA2, AA2; VPADDD ·chacha20Constants<>(SB), AA3, AA3 + VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1; VPADDD state1StoreAVX2, BB2, BB2; VPADDD state1StoreAVX2, BB3, BB3 + VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1; VPADDD state2StoreAVX2, CC2, CC2; VPADDD state2StoreAVX2, CC3, CC3 + VPADDD ctr0StoreAVX2, DD0, DD0; VPADDD ctr1StoreAVX2, DD1, DD1; VPADDD ctr2StoreAVX2, DD2, DD2; VPADDD ctr3StoreAVX2, DD3, DD3 + VMOVDQA CC3, tmpStoreAVX2 + + // We only hashed 480 of the 512 bytes available - hash the remaining 32 here + polyAdd(480(inp)) + polyMulAVX2 + VPERM2I128 $0x02, AA0, BB0, CC3; VPERM2I128 $0x13, AA0, BB0, BB0; VPERM2I128 $0x02, CC0, DD0, AA0; VPERM2I128 $0x13, CC0, DD0, CC0 + VPXOR (0*32)(inp), CC3, CC3; VPXOR (1*32)(inp), AA0, AA0; VPXOR (2*32)(inp), BB0, BB0; VPXOR (3*32)(inp), CC0, CC0 + VMOVDQU CC3, (0*32)(oup); VMOVDQU AA0, (1*32)(oup); VMOVDQU BB0, (2*32)(oup); VMOVDQU CC0, (3*32)(oup) + VPERM2I128 $0x02, AA1, BB1, AA0; VPERM2I128 $0x02, CC1, DD1, BB0; VPERM2I128 $0x13, AA1, BB1, CC0; VPERM2I128 $0x13, CC1, DD1, DD0 + VPXOR (4*32)(inp), AA0, AA0; VPXOR (5*32)(inp), BB0, BB0; VPXOR (6*32)(inp), CC0, CC0; VPXOR (7*32)(inp), DD0, DD0 + VMOVDQU AA0, (4*32)(oup); VMOVDQU BB0, (5*32)(oup); VMOVDQU CC0, (6*32)(oup); VMOVDQU DD0, (7*32)(oup) + + // and here + polyAdd(496(inp)) + polyMulAVX2 + VPERM2I128 $0x02, AA2, BB2, AA0; VPERM2I128 $0x02, CC2, DD2, BB0; VPERM2I128 $0x13, AA2, BB2, CC0; VPERM2I128 $0x13, CC2, DD2, DD0 + VPXOR (8*32)(inp), AA0, AA0; VPXOR (9*32)(inp), BB0, BB0; VPXOR (10*32)(inp), CC0, CC0; VPXOR (11*32)(inp), DD0, DD0 + VMOVDQU AA0, (8*32)(oup); VMOVDQU BB0, (9*32)(oup); VMOVDQU CC0, (10*32)(oup); VMOVDQU DD0, (11*32)(oup) + VPERM2I128 $0x02, AA3, BB3, AA0; VPERM2I128 $0x02, tmpStoreAVX2, DD3, BB0; VPERM2I128 $0x13, AA3, BB3, CC0; VPERM2I128 $0x13, tmpStoreAVX2, DD3, DD0 + VPXOR (12*32)(inp), AA0, AA0; VPXOR (13*32)(inp), BB0, BB0; VPXOR (14*32)(inp), CC0, CC0; VPXOR (15*32)(inp), DD0, DD0 + VMOVDQU AA0, (12*32)(oup); VMOVDQU BB0, (13*32)(oup); VMOVDQU CC0, (14*32)(oup); VMOVDQU DD0, (15*32)(oup) + LEAQ (32*16)(inp), inp + LEAQ (32*16)(oup), oup + SUBQ $(32*16), inl + JMP openAVX2MainLoop + +openAVX2MainLoopDone: + // Handle the various tail sizes efficiently + TESTQ inl, inl + JE openSSEFinalize + CMPQ inl, $128 + JBE openAVX2Tail128 + CMPQ inl, $256 + JBE openAVX2Tail256 + CMPQ inl, $384 + JBE openAVX2Tail384 + JMP openAVX2Tail512 + +// ---------------------------------------------------------------------------- +// Special optimization for buffers smaller than 193 bytes +openAVX2192: + // For up to 192 bytes of ciphertext and 64 bytes for the poly key, we process four blocks + VMOVDQA AA0, AA1 + VMOVDQA BB0, BB1 + VMOVDQA CC0, CC1 + VPADDD ·avx2IncMask<>(SB), DD0, DD1 + VMOVDQA AA0, AA2 + VMOVDQA BB0, BB2 + VMOVDQA CC0, CC2 + VMOVDQA DD0, DD2 + VMOVDQA DD1, TT3 + MOVQ $10, itr2 + +openAVX2192InnerCipherLoop: + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1 + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1 + DECQ itr2 + JNE openAVX2192InnerCipherLoop + VPADDD AA2, AA0, AA0; VPADDD AA2, AA1, AA1 + VPADDD BB2, BB0, BB0; VPADDD BB2, BB1, BB1 + VPADDD CC2, CC0, CC0; VPADDD CC2, CC1, CC1 + VPADDD DD2, DD0, DD0; VPADDD TT3, DD1, DD1 + VPERM2I128 $0x02, AA0, BB0, TT0 + + // Clamp and store poly key + VPAND ·polyClampMask<>(SB), TT0, TT0 + VMOVDQA TT0, rsStoreAVX2 + + // Stream for up to 192 bytes + VPERM2I128 $0x13, AA0, BB0, AA0 + VPERM2I128 $0x13, CC0, DD0, BB0 + VPERM2I128 $0x02, AA1, BB1, CC0 + VPERM2I128 $0x02, CC1, DD1, DD0 + VPERM2I128 $0x13, AA1, BB1, AA1 + VPERM2I128 $0x13, CC1, DD1, BB1 + +openAVX2ShortOpen: + // Hash + MOVQ ad_len+80(FP), itr2 + CALL polyHashADInternal<>(SB) + +openAVX2ShortOpenLoop: + CMPQ inl, $32 + JB openAVX2ShortTail32 + SUBQ $32, inl + + // Load for hashing + polyAdd(0*8(inp)) + polyMulAVX2 + polyAdd(2*8(inp)) + polyMulAVX2 + + // Load for decryption + VPXOR (inp), AA0, AA0 + VMOVDQU AA0, (oup) + LEAQ (1*32)(inp), inp + LEAQ (1*32)(oup), oup + + // Shift stream left + VMOVDQA BB0, AA0 + VMOVDQA CC0, BB0 + VMOVDQA DD0, CC0 + VMOVDQA AA1, DD0 + VMOVDQA BB1, AA1 + VMOVDQA CC1, BB1 + VMOVDQA DD1, CC1 + VMOVDQA AA2, DD1 + VMOVDQA BB2, AA2 + JMP openAVX2ShortOpenLoop + +openAVX2ShortTail32: + CMPQ inl, $16 + VMOVDQA A0, A1 + JB openAVX2ShortDone + + SUBQ $16, inl + + // Load for hashing + polyAdd(0*8(inp)) + polyMulAVX2 + + // Load for decryption + VPXOR (inp), A0, T0 + VMOVDQU T0, (oup) + LEAQ (1*16)(inp), inp + LEAQ (1*16)(oup), oup + VPERM2I128 $0x11, AA0, AA0, AA0 + VMOVDQA A0, A1 + +openAVX2ShortDone: + VZEROUPPER + JMP openSSETail16 + +// ---------------------------------------------------------------------------- +// Special optimization for buffers smaller than 321 bytes +openAVX2320: + // For up to 320 bytes of ciphertext and 64 bytes for the poly key, we process six blocks + VMOVDQA AA0, AA1; VMOVDQA BB0, BB1; VMOVDQA CC0, CC1; VPADDD ·avx2IncMask<>(SB), DD0, DD1 + VMOVDQA AA0, AA2; VMOVDQA BB0, BB2; VMOVDQA CC0, CC2; VPADDD ·avx2IncMask<>(SB), DD1, DD2 + VMOVDQA BB0, TT1; VMOVDQA CC0, TT2; VMOVDQA DD0, TT3 + MOVQ $10, itr2 + +openAVX2320InnerCipherLoop: + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0); chachaQR_AVX2(AA2, BB2, CC2, DD2, TT0) + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $4, BB2, BB2, BB2 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1; VPALIGNR $12, DD2, DD2, DD2 + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0); chachaQR_AVX2(AA2, BB2, CC2, DD2, TT0) + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $12, BB2, BB2, BB2 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1; VPALIGNR $4, DD2, DD2, DD2 + DECQ itr2 + JNE openAVX2320InnerCipherLoop + + VMOVDQA ·chacha20Constants<>(SB), TT0 + VPADDD TT0, AA0, AA0; VPADDD TT0, AA1, AA1; VPADDD TT0, AA2, AA2 + VPADDD TT1, BB0, BB0; VPADDD TT1, BB1, BB1; VPADDD TT1, BB2, BB2 + VPADDD TT2, CC0, CC0; VPADDD TT2, CC1, CC1; VPADDD TT2, CC2, CC2 + VMOVDQA ·avx2IncMask<>(SB), TT0 + VPADDD TT3, DD0, DD0; VPADDD TT0, TT3, TT3 + VPADDD TT3, DD1, DD1; VPADDD TT0, TT3, TT3 + VPADDD TT3, DD2, DD2 + + // Clamp and store poly key + VPERM2I128 $0x02, AA0, BB0, TT0 + VPAND ·polyClampMask<>(SB), TT0, TT0 + VMOVDQA TT0, rsStoreAVX2 + + // Stream for up to 320 bytes + VPERM2I128 $0x13, AA0, BB0, AA0 + VPERM2I128 $0x13, CC0, DD0, BB0 + VPERM2I128 $0x02, AA1, BB1, CC0 + VPERM2I128 $0x02, CC1, DD1, DD0 + VPERM2I128 $0x13, AA1, BB1, AA1 + VPERM2I128 $0x13, CC1, DD1, BB1 + VPERM2I128 $0x02, AA2, BB2, CC1 + VPERM2I128 $0x02, CC2, DD2, DD1 + VPERM2I128 $0x13, AA2, BB2, AA2 + VPERM2I128 $0x13, CC2, DD2, BB2 + JMP openAVX2ShortOpen + +// ---------------------------------------------------------------------------- +// Special optimization for the last 128 bytes of ciphertext +openAVX2Tail128: + // Need to decrypt up to 128 bytes - prepare two blocks + VMOVDQA ·chacha20Constants<>(SB), AA1 + VMOVDQA state1StoreAVX2, BB1 + VMOVDQA state2StoreAVX2, CC1 + VMOVDQA ctr3StoreAVX2, DD1 + VPADDD ·avx2IncMask<>(SB), DD1, DD1 + VMOVDQA DD1, DD0 + + XORQ itr2, itr2 + MOVQ inl, itr1 + ANDQ $-16, itr1 + TESTQ itr1, itr1 + JE openAVX2Tail128LoopB + +openAVX2Tail128LoopA: + // Perform ChaCha rounds, while hashing the remaining input + polyAdd(0(inp)(itr2*1)) + polyMulAVX2 + +openAVX2Tail128LoopB: + ADDQ $16, itr2 + chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) + VPALIGNR $4, BB1, BB1, BB1 + VPALIGNR $8, CC1, CC1, CC1 + VPALIGNR $12, DD1, DD1, DD1 + chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) + VPALIGNR $12, BB1, BB1, BB1 + VPALIGNR $8, CC1, CC1, CC1 + VPALIGNR $4, DD1, DD1, DD1 + CMPQ itr2, itr1 + JB openAVX2Tail128LoopA + CMPQ itr2, $160 + JNE openAVX2Tail128LoopB + + VPADDD ·chacha20Constants<>(SB), AA1, AA1 + VPADDD state1StoreAVX2, BB1, BB1 + VPADDD state2StoreAVX2, CC1, CC1 + VPADDD DD0, DD1, DD1 + VPERM2I128 $0x02, AA1, BB1, AA0; VPERM2I128 $0x02, CC1, DD1, BB0; VPERM2I128 $0x13, AA1, BB1, CC0; VPERM2I128 $0x13, CC1, DD1, DD0 + +openAVX2TailLoop: + CMPQ inl, $32 + JB openAVX2Tail + SUBQ $32, inl + + // Load for decryption + VPXOR (inp), AA0, AA0 + VMOVDQU AA0, (oup) + LEAQ (1*32)(inp), inp + LEAQ (1*32)(oup), oup + VMOVDQA BB0, AA0 + VMOVDQA CC0, BB0 + VMOVDQA DD0, CC0 + JMP openAVX2TailLoop + +openAVX2Tail: + CMPQ inl, $16 + VMOVDQA A0, A1 + JB openAVX2TailDone + SUBQ $16, inl + + // Load for decryption + VPXOR (inp), A0, T0 + VMOVDQU T0, (oup) + LEAQ (1*16)(inp), inp + LEAQ (1*16)(oup), oup + VPERM2I128 $0x11, AA0, AA0, AA0 + VMOVDQA A0, A1 + +openAVX2TailDone: + VZEROUPPER + JMP openSSETail16 + +// ---------------------------------------------------------------------------- +// Special optimization for the last 256 bytes of ciphertext +openAVX2Tail256: + // Need to decrypt up to 256 bytes - prepare four blocks + VMOVDQA ·chacha20Constants<>(SB), AA0; VMOVDQA AA0, AA1 + VMOVDQA state1StoreAVX2, BB0; VMOVDQA BB0, BB1 + VMOVDQA state2StoreAVX2, CC0; VMOVDQA CC0, CC1 + VMOVDQA ctr3StoreAVX2, DD0 + VPADDD ·avx2IncMask<>(SB), DD0, DD0 + VPADDD ·avx2IncMask<>(SB), DD0, DD1 + VMOVDQA DD0, TT1 + VMOVDQA DD1, TT2 + + // Compute the number of iterations that will hash data + MOVQ inl, tmpStoreAVX2 + MOVQ inl, itr1 + SUBQ $128, itr1 + SHRQ $4, itr1 + MOVQ $10, itr2 + CMPQ itr1, $10 + CMOVQGT itr2, itr1 + MOVQ inp, inl + XORQ itr2, itr2 + +openAVX2Tail256LoopA: + polyAdd(0(inl)) + polyMulAVX2 + LEAQ 16(inl), inl + + // Perform ChaCha rounds, while hashing the remaining input +openAVX2Tail256LoopB: + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1 + INCQ itr2 + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1 + CMPQ itr2, itr1 + JB openAVX2Tail256LoopA + + CMPQ itr2, $10 + JNE openAVX2Tail256LoopB + + MOVQ inl, itr2 + SUBQ inp, inl + MOVQ inl, itr1 + MOVQ tmpStoreAVX2, inl + + // Hash the remainder of data (if any) +openAVX2Tail256Hash: + ADDQ $16, itr1 + CMPQ itr1, inl + JGT openAVX2Tail256HashEnd + polyAdd (0(itr2)) + polyMulAVX2 + LEAQ 16(itr2), itr2 + JMP openAVX2Tail256Hash + +// Store 128 bytes safely, then go to store loop +openAVX2Tail256HashEnd: + VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1 + VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1 + VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1 + VPADDD TT1, DD0, DD0; VPADDD TT2, DD1, DD1 + VPERM2I128 $0x02, AA0, BB0, AA2; VPERM2I128 $0x02, CC0, DD0, BB2; VPERM2I128 $0x13, AA0, BB0, CC2; VPERM2I128 $0x13, CC0, DD0, DD2 + VPERM2I128 $0x02, AA1, BB1, AA0; VPERM2I128 $0x02, CC1, DD1, BB0; VPERM2I128 $0x13, AA1, BB1, CC0; VPERM2I128 $0x13, CC1, DD1, DD0 + + VPXOR (0*32)(inp), AA2, AA2; VPXOR (1*32)(inp), BB2, BB2; VPXOR (2*32)(inp), CC2, CC2; VPXOR (3*32)(inp), DD2, DD2 + VMOVDQU AA2, (0*32)(oup); VMOVDQU BB2, (1*32)(oup); VMOVDQU CC2, (2*32)(oup); VMOVDQU DD2, (3*32)(oup) + LEAQ (4*32)(inp), inp + LEAQ (4*32)(oup), oup + SUBQ $4*32, inl + + JMP openAVX2TailLoop + +// ---------------------------------------------------------------------------- +// Special optimization for the last 384 bytes of ciphertext +openAVX2Tail384: + // Need to decrypt up to 384 bytes - prepare six blocks + VMOVDQA ·chacha20Constants<>(SB), AA0; VMOVDQA AA0, AA1; VMOVDQA AA0, AA2 + VMOVDQA state1StoreAVX2, BB0; VMOVDQA BB0, BB1; VMOVDQA BB0, BB2 + VMOVDQA state2StoreAVX2, CC0; VMOVDQA CC0, CC1; VMOVDQA CC0, CC2 + VMOVDQA ctr3StoreAVX2, DD0 + VPADDD ·avx2IncMask<>(SB), DD0, DD0 + VPADDD ·avx2IncMask<>(SB), DD0, DD1 + VPADDD ·avx2IncMask<>(SB), DD1, DD2 + VMOVDQA DD0, ctr0StoreAVX2 + VMOVDQA DD1, ctr1StoreAVX2 + VMOVDQA DD2, ctr2StoreAVX2 + + // Compute the number of iterations that will hash two blocks of data + MOVQ inl, tmpStoreAVX2 + MOVQ inl, itr1 + SUBQ $256, itr1 + SHRQ $4, itr1 + ADDQ $6, itr1 + MOVQ $10, itr2 + CMPQ itr1, $10 + CMOVQGT itr2, itr1 + MOVQ inp, inl + XORQ itr2, itr2 + + // Perform ChaCha rounds, while hashing the remaining input +openAVX2Tail384LoopB: + polyAdd(0(inl)) + polyMulAVX2 + LEAQ 16(inl), inl + +openAVX2Tail384LoopA: + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0); chachaQR_AVX2(AA2, BB2, CC2, DD2, TT0) + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $4, BB2, BB2, BB2 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1; VPALIGNR $12, DD2, DD2, DD2 + polyAdd(0(inl)) + polyMulAVX2 + LEAQ 16(inl), inl + INCQ itr2 + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0); chachaQR_AVX2(AA2, BB2, CC2, DD2, TT0) + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $12, BB2, BB2, BB2 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1; VPALIGNR $4, DD2, DD2, DD2 + + CMPQ itr2, itr1 + JB openAVX2Tail384LoopB + + CMPQ itr2, $10 + JNE openAVX2Tail384LoopA + + MOVQ inl, itr2 + SUBQ inp, inl + MOVQ inl, itr1 + MOVQ tmpStoreAVX2, inl + +openAVX2Tail384Hash: + ADDQ $16, itr1 + CMPQ itr1, inl + JGT openAVX2Tail384HashEnd + polyAdd(0(itr2)) + polyMulAVX2 + LEAQ 16(itr2), itr2 + JMP openAVX2Tail384Hash + +// Store 256 bytes safely, then go to store loop +openAVX2Tail384HashEnd: + VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1; VPADDD ·chacha20Constants<>(SB), AA2, AA2 + VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1; VPADDD state1StoreAVX2, BB2, BB2 + VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1; VPADDD state2StoreAVX2, CC2, CC2 + VPADDD ctr0StoreAVX2, DD0, DD0; VPADDD ctr1StoreAVX2, DD1, DD1; VPADDD ctr2StoreAVX2, DD2, DD2 + VPERM2I128 $0x02, AA0, BB0, TT0; VPERM2I128 $0x02, CC0, DD0, TT1; VPERM2I128 $0x13, AA0, BB0, TT2; VPERM2I128 $0x13, CC0, DD0, TT3 + VPXOR (0*32)(inp), TT0, TT0; VPXOR (1*32)(inp), TT1, TT1; VPXOR (2*32)(inp), TT2, TT2; VPXOR (3*32)(inp), TT3, TT3 + VMOVDQU TT0, (0*32)(oup); VMOVDQU TT1, (1*32)(oup); VMOVDQU TT2, (2*32)(oup); VMOVDQU TT3, (3*32)(oup) + VPERM2I128 $0x02, AA1, BB1, TT0; VPERM2I128 $0x02, CC1, DD1, TT1; VPERM2I128 $0x13, AA1, BB1, TT2; VPERM2I128 $0x13, CC1, DD1, TT3 + VPXOR (4*32)(inp), TT0, TT0; VPXOR (5*32)(inp), TT1, TT1; VPXOR (6*32)(inp), TT2, TT2; VPXOR (7*32)(inp), TT3, TT3 + VMOVDQU TT0, (4*32)(oup); VMOVDQU TT1, (5*32)(oup); VMOVDQU TT2, (6*32)(oup); VMOVDQU TT3, (7*32)(oup) + VPERM2I128 $0x02, AA2, BB2, AA0; VPERM2I128 $0x02, CC2, DD2, BB0; VPERM2I128 $0x13, AA2, BB2, CC0; VPERM2I128 $0x13, CC2, DD2, DD0 + LEAQ (8*32)(inp), inp + LEAQ (8*32)(oup), oup + SUBQ $8*32, inl + JMP openAVX2TailLoop + +// ---------------------------------------------------------------------------- +// Special optimization for the last 512 bytes of ciphertext +openAVX2Tail512: + VMOVDQU ·chacha20Constants<>(SB), AA0; VMOVDQA AA0, AA1; VMOVDQA AA0, AA2; VMOVDQA AA0, AA3 + VMOVDQA state1StoreAVX2, BB0; VMOVDQA BB0, BB1; VMOVDQA BB0, BB2; VMOVDQA BB0, BB3 + VMOVDQA state2StoreAVX2, CC0; VMOVDQA CC0, CC1; VMOVDQA CC0, CC2; VMOVDQA CC0, CC3 + VMOVDQA ctr3StoreAVX2, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD1; VPADDD ·avx2IncMask<>(SB), DD1, DD2; VPADDD ·avx2IncMask<>(SB), DD2, DD3 + VMOVDQA DD0, ctr0StoreAVX2; VMOVDQA DD1, ctr1StoreAVX2; VMOVDQA DD2, ctr2StoreAVX2; VMOVDQA DD3, ctr3StoreAVX2 + XORQ itr1, itr1 + MOVQ inp, itr2 + +openAVX2Tail512LoopB: + polyAdd(0(itr2)) + polyMulAVX2 + LEAQ (2*8)(itr2), itr2 + +openAVX2Tail512LoopA: + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + polyAdd(0*8(itr2)) + polyMulAVX2 + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol8<>(SB), DD0, DD0; VPSHUFB ·rol8<>(SB), DD1, DD1; VPSHUFB ·rol8<>(SB), DD2, DD2; VPSHUFB ·rol8<>(SB), DD3, DD3 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $7, BB0, CC3; VPSRLD $25, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $7, BB1, CC3; VPSRLD $25, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $7, BB2, CC3; VPSRLD $25, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $7, BB3, CC3; VPSRLD $25, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $4, BB2, BB2, BB2; VPALIGNR $4, BB3, BB3, BB3 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $8, CC3, CC3, CC3 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1; VPALIGNR $12, DD2, DD2, DD2; VPALIGNR $12, DD3, DD3, DD3 + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + polyAdd(2*8(itr2)) + polyMulAVX2 + LEAQ (4*8)(itr2), itr2 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol8<>(SB), DD0, DD0; VPSHUFB ·rol8<>(SB), DD1, DD1; VPSHUFB ·rol8<>(SB), DD2, DD2; VPSHUFB ·rol8<>(SB), DD3, DD3 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $7, BB0, CC3; VPSRLD $25, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $7, BB1, CC3; VPSRLD $25, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $7, BB2, CC3; VPSRLD $25, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $7, BB3, CC3; VPSRLD $25, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $12, BB2, BB2, BB2; VPALIGNR $12, BB3, BB3, BB3 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $8, CC3, CC3, CC3 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1; VPALIGNR $4, DD2, DD2, DD2; VPALIGNR $4, DD3, DD3, DD3 + INCQ itr1 + CMPQ itr1, $4 + JLT openAVX2Tail512LoopB + + CMPQ itr1, $10 + JNE openAVX2Tail512LoopA + + MOVQ inl, itr1 + SUBQ $384, itr1 + ANDQ $-16, itr1 + +openAVX2Tail512HashLoop: + TESTQ itr1, itr1 + JE openAVX2Tail512HashEnd + polyAdd(0(itr2)) + polyMulAVX2 + LEAQ 16(itr2), itr2 + SUBQ $16, itr1 + JMP openAVX2Tail512HashLoop + +openAVX2Tail512HashEnd: + VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1; VPADDD ·chacha20Constants<>(SB), AA2, AA2; VPADDD ·chacha20Constants<>(SB), AA3, AA3 + VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1; VPADDD state1StoreAVX2, BB2, BB2; VPADDD state1StoreAVX2, BB3, BB3 + VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1; VPADDD state2StoreAVX2, CC2, CC2; VPADDD state2StoreAVX2, CC3, CC3 + VPADDD ctr0StoreAVX2, DD0, DD0; VPADDD ctr1StoreAVX2, DD1, DD1; VPADDD ctr2StoreAVX2, DD2, DD2; VPADDD ctr3StoreAVX2, DD3, DD3 + VMOVDQA CC3, tmpStoreAVX2 + VPERM2I128 $0x02, AA0, BB0, CC3; VPERM2I128 $0x13, AA0, BB0, BB0; VPERM2I128 $0x02, CC0, DD0, AA0; VPERM2I128 $0x13, CC0, DD0, CC0 + VPXOR (0*32)(inp), CC3, CC3; VPXOR (1*32)(inp), AA0, AA0; VPXOR (2*32)(inp), BB0, BB0; VPXOR (3*32)(inp), CC0, CC0 + VMOVDQU CC3, (0*32)(oup); VMOVDQU AA0, (1*32)(oup); VMOVDQU BB0, (2*32)(oup); VMOVDQU CC0, (3*32)(oup) + VPERM2I128 $0x02, AA1, BB1, AA0; VPERM2I128 $0x02, CC1, DD1, BB0; VPERM2I128 $0x13, AA1, BB1, CC0; VPERM2I128 $0x13, CC1, DD1, DD0 + VPXOR (4*32)(inp), AA0, AA0; VPXOR (5*32)(inp), BB0, BB0; VPXOR (6*32)(inp), CC0, CC0; VPXOR (7*32)(inp), DD0, DD0 + VMOVDQU AA0, (4*32)(oup); VMOVDQU BB0, (5*32)(oup); VMOVDQU CC0, (6*32)(oup); VMOVDQU DD0, (7*32)(oup) + VPERM2I128 $0x02, AA2, BB2, AA0; VPERM2I128 $0x02, CC2, DD2, BB0; VPERM2I128 $0x13, AA2, BB2, CC0; VPERM2I128 $0x13, CC2, DD2, DD0 + VPXOR (8*32)(inp), AA0, AA0; VPXOR (9*32)(inp), BB0, BB0; VPXOR (10*32)(inp), CC0, CC0; VPXOR (11*32)(inp), DD0, DD0 + VMOVDQU AA0, (8*32)(oup); VMOVDQU BB0, (9*32)(oup); VMOVDQU CC0, (10*32)(oup); VMOVDQU DD0, (11*32)(oup) + VPERM2I128 $0x02, AA3, BB3, AA0; VPERM2I128 $0x02, tmpStoreAVX2, DD3, BB0; VPERM2I128 $0x13, AA3, BB3, CC0; VPERM2I128 $0x13, tmpStoreAVX2, DD3, DD0 + + LEAQ (12*32)(inp), inp + LEAQ (12*32)(oup), oup + SUBQ $12*32, inl + + JMP openAVX2TailLoop + +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- +// func chacha20Poly1305Seal(dst, key, src, ad []byte) +TEXT ·chacha20Poly1305Seal(SB), 0, $288-96 + // For aligned stack access + MOVQ SP, BP + ADDQ $32, BP + ANDQ $-32, BP + MOVQ dst+0(FP), oup + MOVQ key+24(FP), keyp + MOVQ src+48(FP), inp + MOVQ src_len+56(FP), inl + MOVQ ad+72(FP), adp + + CMPB ·useAVX2(SB), $1 + JE chacha20Poly1305Seal_AVX2 + + // Special optimization, for very short buffers + CMPQ inl, $128 + JBE sealSSE128 // About 15% faster + + // In the seal case - prepare the poly key + 3 blocks of stream in the first iteration + MOVOU ·chacha20Constants<>(SB), A0 + MOVOU (1*16)(keyp), B0 + MOVOU (2*16)(keyp), C0 + MOVOU (3*16)(keyp), D0 + + // Store state on stack for future use + MOVO B0, state1Store + MOVO C0, state2Store + + // Load state, increment counter blocks + MOVO A0, A1; MOVO B0, B1; MOVO C0, C1; MOVO D0, D1; PADDL ·sseIncMask<>(SB), D1 + MOVO A1, A2; MOVO B1, B2; MOVO C1, C2; MOVO D1, D2; PADDL ·sseIncMask<>(SB), D2 + MOVO A2, A3; MOVO B2, B3; MOVO C2, C3; MOVO D2, D3; PADDL ·sseIncMask<>(SB), D3 + + // Store counters + MOVO D0, ctr0Store; MOVO D1, ctr1Store; MOVO D2, ctr2Store; MOVO D3, ctr3Store + MOVQ $10, itr2 + +sealSSEIntroLoop: + MOVO C3, tmpStore + chachaQR(A0, B0, C0, D0, C3); chachaQR(A1, B1, C1, D1, C3); chachaQR(A2, B2, C2, D2, C3) + MOVO tmpStore, C3 + MOVO C1, tmpStore + chachaQR(A3, B3, C3, D3, C1) + MOVO tmpStore, C1 + shiftB0Left; shiftB1Left; shiftB2Left; shiftB3Left + shiftC0Left; shiftC1Left; shiftC2Left; shiftC3Left + shiftD0Left; shiftD1Left; shiftD2Left; shiftD3Left + + MOVO C3, tmpStore + chachaQR(A0, B0, C0, D0, C3); chachaQR(A1, B1, C1, D1, C3); chachaQR(A2, B2, C2, D2, C3) + MOVO tmpStore, C3 + MOVO C1, tmpStore + chachaQR(A3, B3, C3, D3, C1) + MOVO tmpStore, C1 + shiftB0Right; shiftB1Right; shiftB2Right; shiftB3Right + shiftC0Right; shiftC1Right; shiftC2Right; shiftC3Right + shiftD0Right; shiftD1Right; shiftD2Right; shiftD3Right + DECQ itr2 + JNE sealSSEIntroLoop + + // Add in the state + PADDD ·chacha20Constants<>(SB), A0; PADDD ·chacha20Constants<>(SB), A1; PADDD ·chacha20Constants<>(SB), A2; PADDD ·chacha20Constants<>(SB), A3 + PADDD state1Store, B0; PADDD state1Store, B1; PADDD state1Store, B2; PADDD state1Store, B3 + PADDD state2Store, C1; PADDD state2Store, C2; PADDD state2Store, C3 + PADDD ctr1Store, D1; PADDD ctr2Store, D2; PADDD ctr3Store, D3 + + // Clamp and store the key + PAND ·polyClampMask<>(SB), A0 + MOVO A0, rStore + MOVO B0, sStore + + // Hash AAD + MOVQ ad_len+80(FP), itr2 + CALL polyHashADInternal<>(SB) + + MOVOU (0*16)(inp), A0; MOVOU (1*16)(inp), B0; MOVOU (2*16)(inp), C0; MOVOU (3*16)(inp), D0 + PXOR A0, A1; PXOR B0, B1; PXOR C0, C1; PXOR D0, D1 + MOVOU A1, (0*16)(oup); MOVOU B1, (1*16)(oup); MOVOU C1, (2*16)(oup); MOVOU D1, (3*16)(oup) + MOVOU (4*16)(inp), A0; MOVOU (5*16)(inp), B0; MOVOU (6*16)(inp), C0; MOVOU (7*16)(inp), D0 + PXOR A0, A2; PXOR B0, B2; PXOR C0, C2; PXOR D0, D2 + MOVOU A2, (4*16)(oup); MOVOU B2, (5*16)(oup); MOVOU C2, (6*16)(oup); MOVOU D2, (7*16)(oup) + + MOVQ $128, itr1 + SUBQ $128, inl + LEAQ 128(inp), inp + + MOVO A3, A1; MOVO B3, B1; MOVO C3, C1; MOVO D3, D1 + + CMPQ inl, $64 + JBE sealSSE128SealHash + + MOVOU (0*16)(inp), A0; MOVOU (1*16)(inp), B0; MOVOU (2*16)(inp), C0; MOVOU (3*16)(inp), D0 + PXOR A0, A3; PXOR B0, B3; PXOR C0, C3; PXOR D0, D3 + MOVOU A3, (8*16)(oup); MOVOU B3, (9*16)(oup); MOVOU C3, (10*16)(oup); MOVOU D3, (11*16)(oup) + + ADDQ $64, itr1 + SUBQ $64, inl + LEAQ 64(inp), inp + + MOVQ $2, itr1 + MOVQ $8, itr2 + + CMPQ inl, $64 + JBE sealSSETail64 + CMPQ inl, $128 + JBE sealSSETail128 + CMPQ inl, $192 + JBE sealSSETail192 + +sealSSEMainLoop: + // Load state, increment counter blocks + MOVO ·chacha20Constants<>(SB), A0; MOVO state1Store, B0; MOVO state2Store, C0; MOVO ctr3Store, D0; PADDL ·sseIncMask<>(SB), D0 + MOVO A0, A1; MOVO B0, B1; MOVO C0, C1; MOVO D0, D1; PADDL ·sseIncMask<>(SB), D1 + MOVO A1, A2; MOVO B1, B2; MOVO C1, C2; MOVO D1, D2; PADDL ·sseIncMask<>(SB), D2 + MOVO A2, A3; MOVO B2, B3; MOVO C2, C3; MOVO D2, D3; PADDL ·sseIncMask<>(SB), D3 + + // Store counters + MOVO D0, ctr0Store; MOVO D1, ctr1Store; MOVO D2, ctr2Store; MOVO D3, ctr3Store + +sealSSEInnerLoop: + MOVO C3, tmpStore + chachaQR(A0, B0, C0, D0, C3); chachaQR(A1, B1, C1, D1, C3); chachaQR(A2, B2, C2, D2, C3) + MOVO tmpStore, C3 + MOVO C1, tmpStore + chachaQR(A3, B3, C3, D3, C1) + MOVO tmpStore, C1 + polyAdd(0(oup)) + shiftB0Left; shiftB1Left; shiftB2Left; shiftB3Left + shiftC0Left; shiftC1Left; shiftC2Left; shiftC3Left + shiftD0Left; shiftD1Left; shiftD2Left; shiftD3Left + polyMulStage1 + polyMulStage2 + LEAQ (2*8)(oup), oup + MOVO C3, tmpStore + chachaQR(A0, B0, C0, D0, C3); chachaQR(A1, B1, C1, D1, C3); chachaQR(A2, B2, C2, D2, C3) + MOVO tmpStore, C3 + MOVO C1, tmpStore + polyMulStage3 + chachaQR(A3, B3, C3, D3, C1) + MOVO tmpStore, C1 + polyMulReduceStage + shiftB0Right; shiftB1Right; shiftB2Right; shiftB3Right + shiftC0Right; shiftC1Right; shiftC2Right; shiftC3Right + shiftD0Right; shiftD1Right; shiftD2Right; shiftD3Right + DECQ itr2 + JGE sealSSEInnerLoop + polyAdd(0(oup)) + polyMul + LEAQ (2*8)(oup), oup + DECQ itr1 + JG sealSSEInnerLoop + + // Add in the state + PADDD ·chacha20Constants<>(SB), A0; PADDD ·chacha20Constants<>(SB), A1; PADDD ·chacha20Constants<>(SB), A2; PADDD ·chacha20Constants<>(SB), A3 + PADDD state1Store, B0; PADDD state1Store, B1; PADDD state1Store, B2; PADDD state1Store, B3 + PADDD state2Store, C0; PADDD state2Store, C1; PADDD state2Store, C2; PADDD state2Store, C3 + PADDD ctr0Store, D0; PADDD ctr1Store, D1; PADDD ctr2Store, D2; PADDD ctr3Store, D3 + MOVO D3, tmpStore + + // Load - xor - store + MOVOU (0*16)(inp), D3; PXOR D3, A0 + MOVOU (1*16)(inp), D3; PXOR D3, B0 + MOVOU (2*16)(inp), D3; PXOR D3, C0 + MOVOU (3*16)(inp), D3; PXOR D3, D0 + MOVOU A0, (0*16)(oup) + MOVOU B0, (1*16)(oup) + MOVOU C0, (2*16)(oup) + MOVOU D0, (3*16)(oup) + MOVO tmpStore, D3 + + MOVOU (4*16)(inp), A0; MOVOU (5*16)(inp), B0; MOVOU (6*16)(inp), C0; MOVOU (7*16)(inp), D0 + PXOR A0, A1; PXOR B0, B1; PXOR C0, C1; PXOR D0, D1 + MOVOU A1, (4*16)(oup); MOVOU B1, (5*16)(oup); MOVOU C1, (6*16)(oup); MOVOU D1, (7*16)(oup) + MOVOU (8*16)(inp), A0; MOVOU (9*16)(inp), B0; MOVOU (10*16)(inp), C0; MOVOU (11*16)(inp), D0 + PXOR A0, A2; PXOR B0, B2; PXOR C0, C2; PXOR D0, D2 + MOVOU A2, (8*16)(oup); MOVOU B2, (9*16)(oup); MOVOU C2, (10*16)(oup); MOVOU D2, (11*16)(oup) + ADDQ $192, inp + MOVQ $192, itr1 + SUBQ $192, inl + MOVO A3, A1 + MOVO B3, B1 + MOVO C3, C1 + MOVO D3, D1 + CMPQ inl, $64 + JBE sealSSE128SealHash + MOVOU (0*16)(inp), A0; MOVOU (1*16)(inp), B0; MOVOU (2*16)(inp), C0; MOVOU (3*16)(inp), D0 + PXOR A0, A3; PXOR B0, B3; PXOR C0, C3; PXOR D0, D3 + MOVOU A3, (12*16)(oup); MOVOU B3, (13*16)(oup); MOVOU C3, (14*16)(oup); MOVOU D3, (15*16)(oup) + LEAQ 64(inp), inp + SUBQ $64, inl + MOVQ $6, itr1 + MOVQ $4, itr2 + CMPQ inl, $192 + JG sealSSEMainLoop + + MOVQ inl, itr1 + TESTQ inl, inl + JE sealSSE128SealHash + MOVQ $6, itr1 + CMPQ inl, $64 + JBE sealSSETail64 + CMPQ inl, $128 + JBE sealSSETail128 + JMP sealSSETail192 + +// ---------------------------------------------------------------------------- +// Special optimization for the last 64 bytes of plaintext +sealSSETail64: + // Need to encrypt up to 64 bytes - prepare single block, hash 192 or 256 bytes + MOVO ·chacha20Constants<>(SB), A1 + MOVO state1Store, B1 + MOVO state2Store, C1 + MOVO ctr3Store, D1 + PADDL ·sseIncMask<>(SB), D1 + MOVO D1, ctr0Store + +sealSSETail64LoopA: + // Perform ChaCha rounds, while hashing the previously encrypted ciphertext + polyAdd(0(oup)) + polyMul + LEAQ 16(oup), oup + +sealSSETail64LoopB: + chachaQR(A1, B1, C1, D1, T1) + shiftB1Left; shiftC1Left; shiftD1Left + chachaQR(A1, B1, C1, D1, T1) + shiftB1Right; shiftC1Right; shiftD1Right + polyAdd(0(oup)) + polyMul + LEAQ 16(oup), oup + + DECQ itr1 + JG sealSSETail64LoopA + + DECQ itr2 + JGE sealSSETail64LoopB + PADDL ·chacha20Constants<>(SB), A1 + PADDL state1Store, B1 + PADDL state2Store, C1 + PADDL ctr0Store, D1 + + JMP sealSSE128Seal + +// ---------------------------------------------------------------------------- +// Special optimization for the last 128 bytes of plaintext +sealSSETail128: + // Need to encrypt up to 128 bytes - prepare two blocks, hash 192 or 256 bytes + MOVO ·chacha20Constants<>(SB), A0; MOVO state1Store, B0; MOVO state2Store, C0; MOVO ctr3Store, D0; PADDL ·sseIncMask<>(SB), D0; MOVO D0, ctr0Store + MOVO A0, A1; MOVO B0, B1; MOVO C0, C1; MOVO D0, D1; PADDL ·sseIncMask<>(SB), D1; MOVO D1, ctr1Store + +sealSSETail128LoopA: + // Perform ChaCha rounds, while hashing the previously encrypted ciphertext + polyAdd(0(oup)) + polyMul + LEAQ 16(oup), oup + +sealSSETail128LoopB: + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0) + shiftB0Left; shiftC0Left; shiftD0Left + shiftB1Left; shiftC1Left; shiftD1Left + polyAdd(0(oup)) + polyMul + LEAQ 16(oup), oup + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0) + shiftB0Right; shiftC0Right; shiftD0Right + shiftB1Right; shiftC1Right; shiftD1Right + + DECQ itr1 + JG sealSSETail128LoopA + + DECQ itr2 + JGE sealSSETail128LoopB + + PADDL ·chacha20Constants<>(SB), A0; PADDL ·chacha20Constants<>(SB), A1 + PADDL state1Store, B0; PADDL state1Store, B1 + PADDL state2Store, C0; PADDL state2Store, C1 + PADDL ctr0Store, D0; PADDL ctr1Store, D1 + + MOVOU (0*16)(inp), T0; MOVOU (1*16)(inp), T1; MOVOU (2*16)(inp), T2; MOVOU (3*16)(inp), T3 + PXOR T0, A0; PXOR T1, B0; PXOR T2, C0; PXOR T3, D0 + MOVOU A0, (0*16)(oup); MOVOU B0, (1*16)(oup); MOVOU C0, (2*16)(oup); MOVOU D0, (3*16)(oup) + + MOVQ $64, itr1 + LEAQ 64(inp), inp + SUBQ $64, inl + + JMP sealSSE128SealHash + +// ---------------------------------------------------------------------------- +// Special optimization for the last 192 bytes of plaintext +sealSSETail192: + // Need to encrypt up to 192 bytes - prepare three blocks, hash 192 or 256 bytes + MOVO ·chacha20Constants<>(SB), A0; MOVO state1Store, B0; MOVO state2Store, C0; MOVO ctr3Store, D0; PADDL ·sseIncMask<>(SB), D0; MOVO D0, ctr0Store + MOVO A0, A1; MOVO B0, B1; MOVO C0, C1; MOVO D0, D1; PADDL ·sseIncMask<>(SB), D1; MOVO D1, ctr1Store + MOVO A1, A2; MOVO B1, B2; MOVO C1, C2; MOVO D1, D2; PADDL ·sseIncMask<>(SB), D2; MOVO D2, ctr2Store + +sealSSETail192LoopA: + // Perform ChaCha rounds, while hashing the previously encrypted ciphertext + polyAdd(0(oup)) + polyMul + LEAQ 16(oup), oup + +sealSSETail192LoopB: + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0); chachaQR(A2, B2, C2, D2, T0) + shiftB0Left; shiftC0Left; shiftD0Left + shiftB1Left; shiftC1Left; shiftD1Left + shiftB2Left; shiftC2Left; shiftD2Left + + polyAdd(0(oup)) + polyMul + LEAQ 16(oup), oup + + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0); chachaQR(A2, B2, C2, D2, T0) + shiftB0Right; shiftC0Right; shiftD0Right + shiftB1Right; shiftC1Right; shiftD1Right + shiftB2Right; shiftC2Right; shiftD2Right + + DECQ itr1 + JG sealSSETail192LoopA + + DECQ itr2 + JGE sealSSETail192LoopB + + PADDL ·chacha20Constants<>(SB), A0; PADDL ·chacha20Constants<>(SB), A1; PADDL ·chacha20Constants<>(SB), A2 + PADDL state1Store, B0; PADDL state1Store, B1; PADDL state1Store, B2 + PADDL state2Store, C0; PADDL state2Store, C1; PADDL state2Store, C2 + PADDL ctr0Store, D0; PADDL ctr1Store, D1; PADDL ctr2Store, D2 + + MOVOU (0*16)(inp), T0; MOVOU (1*16)(inp), T1; MOVOU (2*16)(inp), T2; MOVOU (3*16)(inp), T3 + PXOR T0, A0; PXOR T1, B0; PXOR T2, C0; PXOR T3, D0 + MOVOU A0, (0*16)(oup); MOVOU B0, (1*16)(oup); MOVOU C0, (2*16)(oup); MOVOU D0, (3*16)(oup) + MOVOU (4*16)(inp), T0; MOVOU (5*16)(inp), T1; MOVOU (6*16)(inp), T2; MOVOU (7*16)(inp), T3 + PXOR T0, A1; PXOR T1, B1; PXOR T2, C1; PXOR T3, D1 + MOVOU A1, (4*16)(oup); MOVOU B1, (5*16)(oup); MOVOU C1, (6*16)(oup); MOVOU D1, (7*16)(oup) + + MOVO A2, A1 + MOVO B2, B1 + MOVO C2, C1 + MOVO D2, D1 + MOVQ $128, itr1 + LEAQ 128(inp), inp + SUBQ $128, inl + + JMP sealSSE128SealHash + +// ---------------------------------------------------------------------------- +// Special seal optimization for buffers smaller than 129 bytes +sealSSE128: + // For up to 128 bytes of ciphertext and 64 bytes for the poly key, we require to process three blocks + MOVOU ·chacha20Constants<>(SB), A0; MOVOU (1*16)(keyp), B0; MOVOU (2*16)(keyp), C0; MOVOU (3*16)(keyp), D0 + MOVO A0, A1; MOVO B0, B1; MOVO C0, C1; MOVO D0, D1; PADDL ·sseIncMask<>(SB), D1 + MOVO A1, A2; MOVO B1, B2; MOVO C1, C2; MOVO D1, D2; PADDL ·sseIncMask<>(SB), D2 + MOVO B0, T1; MOVO C0, T2; MOVO D1, T3 + MOVQ $10, itr2 + +sealSSE128InnerCipherLoop: + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0); chachaQR(A2, B2, C2, D2, T0) + shiftB0Left; shiftB1Left; shiftB2Left + shiftC0Left; shiftC1Left; shiftC2Left + shiftD0Left; shiftD1Left; shiftD2Left + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0); chachaQR(A2, B2, C2, D2, T0) + shiftB0Right; shiftB1Right; shiftB2Right + shiftC0Right; shiftC1Right; shiftC2Right + shiftD0Right; shiftD1Right; shiftD2Right + DECQ itr2 + JNE sealSSE128InnerCipherLoop + + // A0|B0 hold the Poly1305 32-byte key, C0,D0 can be discarded + PADDL ·chacha20Constants<>(SB), A0; PADDL ·chacha20Constants<>(SB), A1; PADDL ·chacha20Constants<>(SB), A2 + PADDL T1, B0; PADDL T1, B1; PADDL T1, B2 + PADDL T2, C1; PADDL T2, C2 + PADDL T3, D1; PADDL ·sseIncMask<>(SB), T3; PADDL T3, D2 + PAND ·polyClampMask<>(SB), A0 + MOVOU A0, rStore + MOVOU B0, sStore + + // Hash + MOVQ ad_len+80(FP), itr2 + CALL polyHashADInternal<>(SB) + XORQ itr1, itr1 + +sealSSE128SealHash: + // itr1 holds the number of bytes encrypted but not yet hashed + CMPQ itr1, $16 + JB sealSSE128Seal + polyAdd(0(oup)) + polyMul + + SUBQ $16, itr1 + ADDQ $16, oup + + JMP sealSSE128SealHash + +sealSSE128Seal: + CMPQ inl, $16 + JB sealSSETail + SUBQ $16, inl + + // Load for decryption + MOVOU (inp), T0 + PXOR T0, A1 + MOVOU A1, (oup) + LEAQ (1*16)(inp), inp + LEAQ (1*16)(oup), oup + + // Extract for hashing + MOVQ A1, t0 + PSRLDQ $8, A1 + MOVQ A1, t1 + ADDQ t0, acc0; ADCQ t1, acc1; ADCQ $1, acc2 + polyMul + + // Shift the stream "left" + MOVO B1, A1 + MOVO C1, B1 + MOVO D1, C1 + MOVO A2, D1 + MOVO B2, A2 + MOVO C2, B2 + MOVO D2, C2 + JMP sealSSE128Seal + +sealSSETail: + TESTQ inl, inl + JE sealSSEFinalize + + // We can only load the PT one byte at a time to avoid read after end of buffer + MOVQ inl, itr2 + SHLQ $4, itr2 + LEAQ ·andMask<>(SB), t0 + MOVQ inl, itr1 + LEAQ -1(inp)(inl*1), inp + XORQ t2, t2 + XORQ t3, t3 + XORQ AX, AX + +sealSSETailLoadLoop: + SHLQ $8, t2, t3 + SHLQ $8, t2 + MOVB (inp), AX + XORQ AX, t2 + LEAQ -1(inp), inp + DECQ itr1 + JNE sealSSETailLoadLoop + MOVQ t2, 0+tmpStore + MOVQ t3, 8+tmpStore + PXOR 0+tmpStore, A1 + MOVOU A1, (oup) + MOVOU -16(t0)(itr2*1), T0 + PAND T0, A1 + MOVQ A1, t0 + PSRLDQ $8, A1 + MOVQ A1, t1 + ADDQ t0, acc0; ADCQ t1, acc1; ADCQ $1, acc2 + polyMul + + ADDQ inl, oup + +sealSSEFinalize: + // Hash in the buffer lengths + ADDQ ad_len+80(FP), acc0 + ADCQ src_len+56(FP), acc1 + ADCQ $1, acc2 + polyMul + + // Final reduce + MOVQ acc0, t0 + MOVQ acc1, t1 + MOVQ acc2, t2 + SUBQ $-5, acc0 + SBBQ $-1, acc1 + SBBQ $3, acc2 + CMOVQCS t0, acc0 + CMOVQCS t1, acc1 + CMOVQCS t2, acc2 + + // Add in the "s" part of the key + ADDQ 0+sStore, acc0 + ADCQ 8+sStore, acc1 + + // Finally store the tag at the end of the message + MOVQ acc0, (0*8)(oup) + MOVQ acc1, (1*8)(oup) + RET + +// ---------------------------------------------------------------------------- +// ------------------------- AVX2 Code ---------------------------------------- +chacha20Poly1305Seal_AVX2: + VZEROUPPER + VMOVDQU ·chacha20Constants<>(SB), AA0 + BYTE $0xc4; BYTE $0x42; BYTE $0x7d; BYTE $0x5a; BYTE $0x70; BYTE $0x10 // broadcasti128 16(r8), ymm14 + BYTE $0xc4; BYTE $0x42; BYTE $0x7d; BYTE $0x5a; BYTE $0x60; BYTE $0x20 // broadcasti128 32(r8), ymm12 + BYTE $0xc4; BYTE $0xc2; BYTE $0x7d; BYTE $0x5a; BYTE $0x60; BYTE $0x30 // broadcasti128 48(r8), ymm4 + VPADDD ·avx2InitMask<>(SB), DD0, DD0 + + // Special optimizations, for very short buffers + CMPQ inl, $192 + JBE seal192AVX2 // 33% faster + CMPQ inl, $320 + JBE seal320AVX2 // 17% faster + + // For the general key prepare the key first - as a byproduct we have 64 bytes of cipher stream + VMOVDQA AA0, AA1; VMOVDQA AA0, AA2; VMOVDQA AA0, AA3 + VMOVDQA BB0, BB1; VMOVDQA BB0, BB2; VMOVDQA BB0, BB3; VMOVDQA BB0, state1StoreAVX2 + VMOVDQA CC0, CC1; VMOVDQA CC0, CC2; VMOVDQA CC0, CC3; VMOVDQA CC0, state2StoreAVX2 + VPADDD ·avx2IncMask<>(SB), DD0, DD1; VMOVDQA DD0, ctr0StoreAVX2 + VPADDD ·avx2IncMask<>(SB), DD1, DD2; VMOVDQA DD1, ctr1StoreAVX2 + VPADDD ·avx2IncMask<>(SB), DD2, DD3; VMOVDQA DD2, ctr2StoreAVX2 + VMOVDQA DD3, ctr3StoreAVX2 + MOVQ $10, itr2 + +sealAVX2IntroLoop: + VMOVDQA CC3, tmpStoreAVX2 + chachaQR_AVX2(AA0, BB0, CC0, DD0, CC3); chachaQR_AVX2(AA1, BB1, CC1, DD1, CC3); chachaQR_AVX2(AA2, BB2, CC2, DD2, CC3) + VMOVDQA tmpStoreAVX2, CC3 + VMOVDQA CC1, tmpStoreAVX2 + chachaQR_AVX2(AA3, BB3, CC3, DD3, CC1) + VMOVDQA tmpStoreAVX2, CC1 + + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $12, DD0, DD0, DD0 + VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $12, DD1, DD1, DD1 + VPALIGNR $4, BB2, BB2, BB2; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $12, DD2, DD2, DD2 + VPALIGNR $4, BB3, BB3, BB3; VPALIGNR $8, CC3, CC3, CC3; VPALIGNR $12, DD3, DD3, DD3 + + VMOVDQA CC3, tmpStoreAVX2 + chachaQR_AVX2(AA0, BB0, CC0, DD0, CC3); chachaQR_AVX2(AA1, BB1, CC1, DD1, CC3); chachaQR_AVX2(AA2, BB2, CC2, DD2, CC3) + VMOVDQA tmpStoreAVX2, CC3 + VMOVDQA CC1, tmpStoreAVX2 + chachaQR_AVX2(AA3, BB3, CC3, DD3, CC1) + VMOVDQA tmpStoreAVX2, CC1 + + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $4, DD0, DD0, DD0 + VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $4, DD1, DD1, DD1 + VPALIGNR $12, BB2, BB2, BB2; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $4, DD2, DD2, DD2 + VPALIGNR $12, BB3, BB3, BB3; VPALIGNR $8, CC3, CC3, CC3; VPALIGNR $4, DD3, DD3, DD3 + DECQ itr2 + JNE sealAVX2IntroLoop + + VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1; VPADDD ·chacha20Constants<>(SB), AA2, AA2; VPADDD ·chacha20Constants<>(SB), AA3, AA3 + VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1; VPADDD state1StoreAVX2, BB2, BB2; VPADDD state1StoreAVX2, BB3, BB3 + VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1; VPADDD state2StoreAVX2, CC2, CC2; VPADDD state2StoreAVX2, CC3, CC3 + VPADDD ctr0StoreAVX2, DD0, DD0; VPADDD ctr1StoreAVX2, DD1, DD1; VPADDD ctr2StoreAVX2, DD2, DD2; VPADDD ctr3StoreAVX2, DD3, DD3 + + VPERM2I128 $0x13, CC0, DD0, CC0 // Stream bytes 96 - 127 + VPERM2I128 $0x02, AA0, BB0, DD0 // The Poly1305 key + VPERM2I128 $0x13, AA0, BB0, AA0 // Stream bytes 64 - 95 + + // Clamp and store poly key + VPAND ·polyClampMask<>(SB), DD0, DD0 + VMOVDQA DD0, rsStoreAVX2 + + // Hash AD + MOVQ ad_len+80(FP), itr2 + CALL polyHashADInternal<>(SB) + + // Can store at least 320 bytes + VPXOR (0*32)(inp), AA0, AA0 + VPXOR (1*32)(inp), CC0, CC0 + VMOVDQU AA0, (0*32)(oup) + VMOVDQU CC0, (1*32)(oup) + + VPERM2I128 $0x02, AA1, BB1, AA0; VPERM2I128 $0x02, CC1, DD1, BB0; VPERM2I128 $0x13, AA1, BB1, CC0; VPERM2I128 $0x13, CC1, DD1, DD0 + VPXOR (2*32)(inp), AA0, AA0; VPXOR (3*32)(inp), BB0, BB0; VPXOR (4*32)(inp), CC0, CC0; VPXOR (5*32)(inp), DD0, DD0 + VMOVDQU AA0, (2*32)(oup); VMOVDQU BB0, (3*32)(oup); VMOVDQU CC0, (4*32)(oup); VMOVDQU DD0, (5*32)(oup) + VPERM2I128 $0x02, AA2, BB2, AA0; VPERM2I128 $0x02, CC2, DD2, BB0; VPERM2I128 $0x13, AA2, BB2, CC0; VPERM2I128 $0x13, CC2, DD2, DD0 + VPXOR (6*32)(inp), AA0, AA0; VPXOR (7*32)(inp), BB0, BB0; VPXOR (8*32)(inp), CC0, CC0; VPXOR (9*32)(inp), DD0, DD0 + VMOVDQU AA0, (6*32)(oup); VMOVDQU BB0, (7*32)(oup); VMOVDQU CC0, (8*32)(oup); VMOVDQU DD0, (9*32)(oup) + + MOVQ $320, itr1 + SUBQ $320, inl + LEAQ 320(inp), inp + + VPERM2I128 $0x02, AA3, BB3, AA0; VPERM2I128 $0x02, CC3, DD3, BB0; VPERM2I128 $0x13, AA3, BB3, CC0; VPERM2I128 $0x13, CC3, DD3, DD0 + CMPQ inl, $128 + JBE sealAVX2SealHash + + VPXOR (0*32)(inp), AA0, AA0; VPXOR (1*32)(inp), BB0, BB0; VPXOR (2*32)(inp), CC0, CC0; VPXOR (3*32)(inp), DD0, DD0 + VMOVDQU AA0, (10*32)(oup); VMOVDQU BB0, (11*32)(oup); VMOVDQU CC0, (12*32)(oup); VMOVDQU DD0, (13*32)(oup) + SUBQ $128, inl + LEAQ 128(inp), inp + + MOVQ $8, itr1 + MOVQ $2, itr2 + + CMPQ inl, $128 + JBE sealAVX2Tail128 + CMPQ inl, $256 + JBE sealAVX2Tail256 + CMPQ inl, $384 + JBE sealAVX2Tail384 + CMPQ inl, $512 + JBE sealAVX2Tail512 + + // We have 448 bytes to hash, but main loop hashes 512 bytes at a time - perform some rounds, before the main loop + VMOVDQA ·chacha20Constants<>(SB), AA0; VMOVDQA AA0, AA1; VMOVDQA AA0, AA2; VMOVDQA AA0, AA3 + VMOVDQA state1StoreAVX2, BB0; VMOVDQA BB0, BB1; VMOVDQA BB0, BB2; VMOVDQA BB0, BB3 + VMOVDQA state2StoreAVX2, CC0; VMOVDQA CC0, CC1; VMOVDQA CC0, CC2; VMOVDQA CC0, CC3 + VMOVDQA ctr3StoreAVX2, DD0 + VPADDD ·avx2IncMask<>(SB), DD0, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD1; VPADDD ·avx2IncMask<>(SB), DD1, DD2; VPADDD ·avx2IncMask<>(SB), DD2, DD3 + VMOVDQA DD0, ctr0StoreAVX2; VMOVDQA DD1, ctr1StoreAVX2; VMOVDQA DD2, ctr2StoreAVX2; VMOVDQA DD3, ctr3StoreAVX2 + + VMOVDQA CC3, tmpStoreAVX2 + chachaQR_AVX2(AA0, BB0, CC0, DD0, CC3); chachaQR_AVX2(AA1, BB1, CC1, DD1, CC3); chachaQR_AVX2(AA2, BB2, CC2, DD2, CC3) + VMOVDQA tmpStoreAVX2, CC3 + VMOVDQA CC1, tmpStoreAVX2 + chachaQR_AVX2(AA3, BB3, CC3, DD3, CC1) + VMOVDQA tmpStoreAVX2, CC1 + + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $12, DD0, DD0, DD0 + VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $12, DD1, DD1, DD1 + VPALIGNR $4, BB2, BB2, BB2; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $12, DD2, DD2, DD2 + VPALIGNR $4, BB3, BB3, BB3; VPALIGNR $8, CC3, CC3, CC3; VPALIGNR $12, DD3, DD3, DD3 + + VMOVDQA CC3, tmpStoreAVX2 + chachaQR_AVX2(AA0, BB0, CC0, DD0, CC3); chachaQR_AVX2(AA1, BB1, CC1, DD1, CC3); chachaQR_AVX2(AA2, BB2, CC2, DD2, CC3) + VMOVDQA tmpStoreAVX2, CC3 + VMOVDQA CC1, tmpStoreAVX2 + chachaQR_AVX2(AA3, BB3, CC3, DD3, CC1) + VMOVDQA tmpStoreAVX2, CC1 + + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $4, DD0, DD0, DD0 + VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $4, DD1, DD1, DD1 + VPALIGNR $12, BB2, BB2, BB2; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $4, DD2, DD2, DD2 + VPALIGNR $12, BB3, BB3, BB3; VPALIGNR $8, CC3, CC3, CC3; VPALIGNR $4, DD3, DD3, DD3 + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + + SUBQ $16, oup // Adjust the pointer + MOVQ $9, itr1 + JMP sealAVX2InternalLoopStart + +sealAVX2MainLoop: + // Load state, increment counter blocks, store the incremented counters + VMOVDQU ·chacha20Constants<>(SB), AA0; VMOVDQA AA0, AA1; VMOVDQA AA0, AA2; VMOVDQA AA0, AA3 + VMOVDQA state1StoreAVX2, BB0; VMOVDQA BB0, BB1; VMOVDQA BB0, BB2; VMOVDQA BB0, BB3 + VMOVDQA state2StoreAVX2, CC0; VMOVDQA CC0, CC1; VMOVDQA CC0, CC2; VMOVDQA CC0, CC3 + VMOVDQA ctr3StoreAVX2, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD1; VPADDD ·avx2IncMask<>(SB), DD1, DD2; VPADDD ·avx2IncMask<>(SB), DD2, DD3 + VMOVDQA DD0, ctr0StoreAVX2; VMOVDQA DD1, ctr1StoreAVX2; VMOVDQA DD2, ctr2StoreAVX2; VMOVDQA DD3, ctr3StoreAVX2 + MOVQ $10, itr1 + +sealAVX2InternalLoop: + polyAdd(0*8(oup)) + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + polyMulStage1_AVX2 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 + polyMulStage2_AVX2 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + polyMulStage3_AVX2 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + polyMulReduceStage + +sealAVX2InternalLoopStart: + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol8<>(SB), DD0, DD0; VPSHUFB ·rol8<>(SB), DD1, DD1; VPSHUFB ·rol8<>(SB), DD2, DD2; VPSHUFB ·rol8<>(SB), DD3, DD3 + polyAdd(2*8(oup)) + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + polyMulStage1_AVX2 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $7, BB0, CC3; VPSRLD $25, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $7, BB1, CC3; VPSRLD $25, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $7, BB2, CC3; VPSRLD $25, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $7, BB3, CC3; VPSRLD $25, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + polyMulStage2_AVX2 + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $4, BB2, BB2, BB2; VPALIGNR $4, BB3, BB3, BB3 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $8, CC3, CC3, CC3 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1; VPALIGNR $12, DD2, DD2, DD2; VPALIGNR $12, DD3, DD3, DD3 + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + polyMulStage3_AVX2 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 + polyMulReduceStage + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + polyAdd(4*8(oup)) + LEAQ (6*8)(oup), oup + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + polyMulStage1_AVX2 + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + polyMulStage2_AVX2 + VPSHUFB ·rol8<>(SB), DD0, DD0; VPSHUFB ·rol8<>(SB), DD1, DD1; VPSHUFB ·rol8<>(SB), DD2, DD2; VPSHUFB ·rol8<>(SB), DD3, DD3 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + polyMulStage3_AVX2 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $7, BB0, CC3; VPSRLD $25, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $7, BB1, CC3; VPSRLD $25, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $7, BB2, CC3; VPSRLD $25, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $7, BB3, CC3; VPSRLD $25, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + polyMulReduceStage + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $12, BB2, BB2, BB2; VPALIGNR $12, BB3, BB3, BB3 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $8, CC3, CC3, CC3 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1; VPALIGNR $4, DD2, DD2, DD2; VPALIGNR $4, DD3, DD3, DD3 + DECQ itr1 + JNE sealAVX2InternalLoop + + VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1; VPADDD ·chacha20Constants<>(SB), AA2, AA2; VPADDD ·chacha20Constants<>(SB), AA3, AA3 + VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1; VPADDD state1StoreAVX2, BB2, BB2; VPADDD state1StoreAVX2, BB3, BB3 + VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1; VPADDD state2StoreAVX2, CC2, CC2; VPADDD state2StoreAVX2, CC3, CC3 + VPADDD ctr0StoreAVX2, DD0, DD0; VPADDD ctr1StoreAVX2, DD1, DD1; VPADDD ctr2StoreAVX2, DD2, DD2; VPADDD ctr3StoreAVX2, DD3, DD3 + VMOVDQA CC3, tmpStoreAVX2 + + // We only hashed 480 of the 512 bytes available - hash the remaining 32 here + polyAdd(0*8(oup)) + polyMulAVX2 + LEAQ (4*8)(oup), oup + VPERM2I128 $0x02, AA0, BB0, CC3; VPERM2I128 $0x13, AA0, BB0, BB0; VPERM2I128 $0x02, CC0, DD0, AA0; VPERM2I128 $0x13, CC0, DD0, CC0 + VPXOR (0*32)(inp), CC3, CC3; VPXOR (1*32)(inp), AA0, AA0; VPXOR (2*32)(inp), BB0, BB0; VPXOR (3*32)(inp), CC0, CC0 + VMOVDQU CC3, (0*32)(oup); VMOVDQU AA0, (1*32)(oup); VMOVDQU BB0, (2*32)(oup); VMOVDQU CC0, (3*32)(oup) + VPERM2I128 $0x02, AA1, BB1, AA0; VPERM2I128 $0x02, CC1, DD1, BB0; VPERM2I128 $0x13, AA1, BB1, CC0; VPERM2I128 $0x13, CC1, DD1, DD0 + VPXOR (4*32)(inp), AA0, AA0; VPXOR (5*32)(inp), BB0, BB0; VPXOR (6*32)(inp), CC0, CC0; VPXOR (7*32)(inp), DD0, DD0 + VMOVDQU AA0, (4*32)(oup); VMOVDQU BB0, (5*32)(oup); VMOVDQU CC0, (6*32)(oup); VMOVDQU DD0, (7*32)(oup) + + // and here + polyAdd(-2*8(oup)) + polyMulAVX2 + VPERM2I128 $0x02, AA2, BB2, AA0; VPERM2I128 $0x02, CC2, DD2, BB0; VPERM2I128 $0x13, AA2, BB2, CC0; VPERM2I128 $0x13, CC2, DD2, DD0 + VPXOR (8*32)(inp), AA0, AA0; VPXOR (9*32)(inp), BB0, BB0; VPXOR (10*32)(inp), CC0, CC0; VPXOR (11*32)(inp), DD0, DD0 + VMOVDQU AA0, (8*32)(oup); VMOVDQU BB0, (9*32)(oup); VMOVDQU CC0, (10*32)(oup); VMOVDQU DD0, (11*32)(oup) + VPERM2I128 $0x02, AA3, BB3, AA0; VPERM2I128 $0x02, tmpStoreAVX2, DD3, BB0; VPERM2I128 $0x13, AA3, BB3, CC0; VPERM2I128 $0x13, tmpStoreAVX2, DD3, DD0 + VPXOR (12*32)(inp), AA0, AA0; VPXOR (13*32)(inp), BB0, BB0; VPXOR (14*32)(inp), CC0, CC0; VPXOR (15*32)(inp), DD0, DD0 + VMOVDQU AA0, (12*32)(oup); VMOVDQU BB0, (13*32)(oup); VMOVDQU CC0, (14*32)(oup); VMOVDQU DD0, (15*32)(oup) + LEAQ (32*16)(inp), inp + SUBQ $(32*16), inl + CMPQ inl, $512 + JG sealAVX2MainLoop + + // Tail can only hash 480 bytes + polyAdd(0*8(oup)) + polyMulAVX2 + polyAdd(2*8(oup)) + polyMulAVX2 + LEAQ 32(oup), oup + + MOVQ $10, itr1 + MOVQ $0, itr2 + CMPQ inl, $128 + JBE sealAVX2Tail128 + CMPQ inl, $256 + JBE sealAVX2Tail256 + CMPQ inl, $384 + JBE sealAVX2Tail384 + JMP sealAVX2Tail512 + +// ---------------------------------------------------------------------------- +// Special optimization for buffers smaller than 193 bytes +seal192AVX2: + // For up to 192 bytes of ciphertext and 64 bytes for the poly key, we process four blocks + VMOVDQA AA0, AA1 + VMOVDQA BB0, BB1 + VMOVDQA CC0, CC1 + VPADDD ·avx2IncMask<>(SB), DD0, DD1 + VMOVDQA AA0, AA2 + VMOVDQA BB0, BB2 + VMOVDQA CC0, CC2 + VMOVDQA DD0, DD2 + VMOVDQA DD1, TT3 + MOVQ $10, itr2 + +sealAVX2192InnerCipherLoop: + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1 + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1 + DECQ itr2 + JNE sealAVX2192InnerCipherLoop + VPADDD AA2, AA0, AA0; VPADDD AA2, AA1, AA1 + VPADDD BB2, BB0, BB0; VPADDD BB2, BB1, BB1 + VPADDD CC2, CC0, CC0; VPADDD CC2, CC1, CC1 + VPADDD DD2, DD0, DD0; VPADDD TT3, DD1, DD1 + VPERM2I128 $0x02, AA0, BB0, TT0 + + // Clamp and store poly key + VPAND ·polyClampMask<>(SB), TT0, TT0 + VMOVDQA TT0, rsStoreAVX2 + + // Stream for up to 192 bytes + VPERM2I128 $0x13, AA0, BB0, AA0 + VPERM2I128 $0x13, CC0, DD0, BB0 + VPERM2I128 $0x02, AA1, BB1, CC0 + VPERM2I128 $0x02, CC1, DD1, DD0 + VPERM2I128 $0x13, AA1, BB1, AA1 + VPERM2I128 $0x13, CC1, DD1, BB1 + +sealAVX2ShortSeal: + // Hash aad + MOVQ ad_len+80(FP), itr2 + CALL polyHashADInternal<>(SB) + XORQ itr1, itr1 + +sealAVX2SealHash: + // itr1 holds the number of bytes encrypted but not yet hashed + CMPQ itr1, $16 + JB sealAVX2ShortSealLoop + polyAdd(0(oup)) + polyMul + SUBQ $16, itr1 + ADDQ $16, oup + JMP sealAVX2SealHash + +sealAVX2ShortSealLoop: + CMPQ inl, $32 + JB sealAVX2ShortTail32 + SUBQ $32, inl + + // Load for encryption + VPXOR (inp), AA0, AA0 + VMOVDQU AA0, (oup) + LEAQ (1*32)(inp), inp + + // Now can hash + polyAdd(0*8(oup)) + polyMulAVX2 + polyAdd(2*8(oup)) + polyMulAVX2 + LEAQ (1*32)(oup), oup + + // Shift stream left + VMOVDQA BB0, AA0 + VMOVDQA CC0, BB0 + VMOVDQA DD0, CC0 + VMOVDQA AA1, DD0 + VMOVDQA BB1, AA1 + VMOVDQA CC1, BB1 + VMOVDQA DD1, CC1 + VMOVDQA AA2, DD1 + VMOVDQA BB2, AA2 + JMP sealAVX2ShortSealLoop + +sealAVX2ShortTail32: + CMPQ inl, $16 + VMOVDQA A0, A1 + JB sealAVX2ShortDone + + SUBQ $16, inl + + // Load for encryption + VPXOR (inp), A0, T0 + VMOVDQU T0, (oup) + LEAQ (1*16)(inp), inp + + // Hash + polyAdd(0*8(oup)) + polyMulAVX2 + LEAQ (1*16)(oup), oup + VPERM2I128 $0x11, AA0, AA0, AA0 + VMOVDQA A0, A1 + +sealAVX2ShortDone: + VZEROUPPER + JMP sealSSETail + +// ---------------------------------------------------------------------------- +// Special optimization for buffers smaller than 321 bytes +seal320AVX2: + // For up to 320 bytes of ciphertext and 64 bytes for the poly key, we process six blocks + VMOVDQA AA0, AA1; VMOVDQA BB0, BB1; VMOVDQA CC0, CC1; VPADDD ·avx2IncMask<>(SB), DD0, DD1 + VMOVDQA AA0, AA2; VMOVDQA BB0, BB2; VMOVDQA CC0, CC2; VPADDD ·avx2IncMask<>(SB), DD1, DD2 + VMOVDQA BB0, TT1; VMOVDQA CC0, TT2; VMOVDQA DD0, TT3 + MOVQ $10, itr2 + +sealAVX2320InnerCipherLoop: + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0); chachaQR_AVX2(AA2, BB2, CC2, DD2, TT0) + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $4, BB2, BB2, BB2 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1; VPALIGNR $12, DD2, DD2, DD2 + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0); chachaQR_AVX2(AA2, BB2, CC2, DD2, TT0) + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $12, BB2, BB2, BB2 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1; VPALIGNR $4, DD2, DD2, DD2 + DECQ itr2 + JNE sealAVX2320InnerCipherLoop + + VMOVDQA ·chacha20Constants<>(SB), TT0 + VPADDD TT0, AA0, AA0; VPADDD TT0, AA1, AA1; VPADDD TT0, AA2, AA2 + VPADDD TT1, BB0, BB0; VPADDD TT1, BB1, BB1; VPADDD TT1, BB2, BB2 + VPADDD TT2, CC0, CC0; VPADDD TT2, CC1, CC1; VPADDD TT2, CC2, CC2 + VMOVDQA ·avx2IncMask<>(SB), TT0 + VPADDD TT3, DD0, DD0; VPADDD TT0, TT3, TT3 + VPADDD TT3, DD1, DD1; VPADDD TT0, TT3, TT3 + VPADDD TT3, DD2, DD2 + + // Clamp and store poly key + VPERM2I128 $0x02, AA0, BB0, TT0 + VPAND ·polyClampMask<>(SB), TT0, TT0 + VMOVDQA TT0, rsStoreAVX2 + + // Stream for up to 320 bytes + VPERM2I128 $0x13, AA0, BB0, AA0 + VPERM2I128 $0x13, CC0, DD0, BB0 + VPERM2I128 $0x02, AA1, BB1, CC0 + VPERM2I128 $0x02, CC1, DD1, DD0 + VPERM2I128 $0x13, AA1, BB1, AA1 + VPERM2I128 $0x13, CC1, DD1, BB1 + VPERM2I128 $0x02, AA2, BB2, CC1 + VPERM2I128 $0x02, CC2, DD2, DD1 + VPERM2I128 $0x13, AA2, BB2, AA2 + VPERM2I128 $0x13, CC2, DD2, BB2 + JMP sealAVX2ShortSeal + +// ---------------------------------------------------------------------------- +// Special optimization for the last 128 bytes of ciphertext +sealAVX2Tail128: + // Need to decrypt up to 128 bytes - prepare two blocks + // If we got here after the main loop - there are 512 encrypted bytes waiting to be hashed + // If we got here before the main loop - there are 448 encrpyred bytes waiting to be hashed + VMOVDQA ·chacha20Constants<>(SB), AA0 + VMOVDQA state1StoreAVX2, BB0 + VMOVDQA state2StoreAVX2, CC0 + VMOVDQA ctr3StoreAVX2, DD0 + VPADDD ·avx2IncMask<>(SB), DD0, DD0 + VMOVDQA DD0, DD1 + +sealAVX2Tail128LoopA: + polyAdd(0(oup)) + polyMul + LEAQ 16(oup), oup + +sealAVX2Tail128LoopB: + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0) + polyAdd(0(oup)) + polyMul + VPALIGNR $4, BB0, BB0, BB0 + VPALIGNR $8, CC0, CC0, CC0 + VPALIGNR $12, DD0, DD0, DD0 + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0) + polyAdd(16(oup)) + polyMul + LEAQ 32(oup), oup + VPALIGNR $12, BB0, BB0, BB0 + VPALIGNR $8, CC0, CC0, CC0 + VPALIGNR $4, DD0, DD0, DD0 + DECQ itr1 + JG sealAVX2Tail128LoopA + DECQ itr2 + JGE sealAVX2Tail128LoopB + + VPADDD ·chacha20Constants<>(SB), AA0, AA1 + VPADDD state1StoreAVX2, BB0, BB1 + VPADDD state2StoreAVX2, CC0, CC1 + VPADDD DD1, DD0, DD1 + + VPERM2I128 $0x02, AA1, BB1, AA0 + VPERM2I128 $0x02, CC1, DD1, BB0 + VPERM2I128 $0x13, AA1, BB1, CC0 + VPERM2I128 $0x13, CC1, DD1, DD0 + JMP sealAVX2ShortSealLoop + +// ---------------------------------------------------------------------------- +// Special optimization for the last 256 bytes of ciphertext +sealAVX2Tail256: + // Need to decrypt up to 256 bytes - prepare two blocks + // If we got here after the main loop - there are 512 encrypted bytes waiting to be hashed + // If we got here before the main loop - there are 448 encrpyred bytes waiting to be hashed + VMOVDQA ·chacha20Constants<>(SB), AA0; VMOVDQA ·chacha20Constants<>(SB), AA1 + VMOVDQA state1StoreAVX2, BB0; VMOVDQA state1StoreAVX2, BB1 + VMOVDQA state2StoreAVX2, CC0; VMOVDQA state2StoreAVX2, CC1 + VMOVDQA ctr3StoreAVX2, DD0 + VPADDD ·avx2IncMask<>(SB), DD0, DD0 + VPADDD ·avx2IncMask<>(SB), DD0, DD1 + VMOVDQA DD0, TT1 + VMOVDQA DD1, TT2 + +sealAVX2Tail256LoopA: + polyAdd(0(oup)) + polyMul + LEAQ 16(oup), oup + +sealAVX2Tail256LoopB: + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) + polyAdd(0(oup)) + polyMul + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1 + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) + polyAdd(16(oup)) + polyMul + LEAQ 32(oup), oup + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1 + DECQ itr1 + JG sealAVX2Tail256LoopA + DECQ itr2 + JGE sealAVX2Tail256LoopB + + VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1 + VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1 + VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1 + VPADDD TT1, DD0, DD0; VPADDD TT2, DD1, DD1 + VPERM2I128 $0x02, AA0, BB0, TT0 + VPERM2I128 $0x02, CC0, DD0, TT1 + VPERM2I128 $0x13, AA0, BB0, TT2 + VPERM2I128 $0x13, CC0, DD0, TT3 + VPXOR (0*32)(inp), TT0, TT0; VPXOR (1*32)(inp), TT1, TT1; VPXOR (2*32)(inp), TT2, TT2; VPXOR (3*32)(inp), TT3, TT3 + VMOVDQU TT0, (0*32)(oup); VMOVDQU TT1, (1*32)(oup); VMOVDQU TT2, (2*32)(oup); VMOVDQU TT3, (3*32)(oup) + MOVQ $128, itr1 + LEAQ 128(inp), inp + SUBQ $128, inl + VPERM2I128 $0x02, AA1, BB1, AA0 + VPERM2I128 $0x02, CC1, DD1, BB0 + VPERM2I128 $0x13, AA1, BB1, CC0 + VPERM2I128 $0x13, CC1, DD1, DD0 + + JMP sealAVX2SealHash + +// ---------------------------------------------------------------------------- +// Special optimization for the last 384 bytes of ciphertext +sealAVX2Tail384: + // Need to decrypt up to 384 bytes - prepare two blocks + // If we got here after the main loop - there are 512 encrypted bytes waiting to be hashed + // If we got here before the main loop - there are 448 encrpyred bytes waiting to be hashed + VMOVDQA ·chacha20Constants<>(SB), AA0; VMOVDQA AA0, AA1; VMOVDQA AA0, AA2 + VMOVDQA state1StoreAVX2, BB0; VMOVDQA BB0, BB1; VMOVDQA BB0, BB2 + VMOVDQA state2StoreAVX2, CC0; VMOVDQA CC0, CC1; VMOVDQA CC0, CC2 + VMOVDQA ctr3StoreAVX2, DD0 + VPADDD ·avx2IncMask<>(SB), DD0, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD1; VPADDD ·avx2IncMask<>(SB), DD1, DD2 + VMOVDQA DD0, TT1; VMOVDQA DD1, TT2; VMOVDQA DD2, TT3 + +sealAVX2Tail384LoopA: + polyAdd(0(oup)) + polyMul + LEAQ 16(oup), oup + +sealAVX2Tail384LoopB: + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0); chachaQR_AVX2(AA2, BB2, CC2, DD2, TT0) + polyAdd(0(oup)) + polyMul + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $4, BB2, BB2, BB2 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1; VPALIGNR $12, DD2, DD2, DD2 + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0); chachaQR_AVX2(AA2, BB2, CC2, DD2, TT0) + polyAdd(16(oup)) + polyMul + LEAQ 32(oup), oup + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $12, BB2, BB2, BB2 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1; VPALIGNR $4, DD2, DD2, DD2 + DECQ itr1 + JG sealAVX2Tail384LoopA + DECQ itr2 + JGE sealAVX2Tail384LoopB + + VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1; VPADDD ·chacha20Constants<>(SB), AA2, AA2 + VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1; VPADDD state1StoreAVX2, BB2, BB2 + VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1; VPADDD state2StoreAVX2, CC2, CC2 + VPADDD TT1, DD0, DD0; VPADDD TT2, DD1, DD1; VPADDD TT3, DD2, DD2 + VPERM2I128 $0x02, AA0, BB0, TT0 + VPERM2I128 $0x02, CC0, DD0, TT1 + VPERM2I128 $0x13, AA0, BB0, TT2 + VPERM2I128 $0x13, CC0, DD0, TT3 + VPXOR (0*32)(inp), TT0, TT0; VPXOR (1*32)(inp), TT1, TT1; VPXOR (2*32)(inp), TT2, TT2; VPXOR (3*32)(inp), TT3, TT3 + VMOVDQU TT0, (0*32)(oup); VMOVDQU TT1, (1*32)(oup); VMOVDQU TT2, (2*32)(oup); VMOVDQU TT3, (3*32)(oup) + VPERM2I128 $0x02, AA1, BB1, TT0 + VPERM2I128 $0x02, CC1, DD1, TT1 + VPERM2I128 $0x13, AA1, BB1, TT2 + VPERM2I128 $0x13, CC1, DD1, TT3 + VPXOR (4*32)(inp), TT0, TT0; VPXOR (5*32)(inp), TT1, TT1; VPXOR (6*32)(inp), TT2, TT2; VPXOR (7*32)(inp), TT3, TT3 + VMOVDQU TT0, (4*32)(oup); VMOVDQU TT1, (5*32)(oup); VMOVDQU TT2, (6*32)(oup); VMOVDQU TT3, (7*32)(oup) + MOVQ $256, itr1 + LEAQ 256(inp), inp + SUBQ $256, inl + VPERM2I128 $0x02, AA2, BB2, AA0 + VPERM2I128 $0x02, CC2, DD2, BB0 + VPERM2I128 $0x13, AA2, BB2, CC0 + VPERM2I128 $0x13, CC2, DD2, DD0 + + JMP sealAVX2SealHash + +// ---------------------------------------------------------------------------- +// Special optimization for the last 512 bytes of ciphertext +sealAVX2Tail512: + // Need to decrypt up to 512 bytes - prepare two blocks + // If we got here after the main loop - there are 512 encrypted bytes waiting to be hashed + // If we got here before the main loop - there are 448 encrpyred bytes waiting to be hashed + VMOVDQA ·chacha20Constants<>(SB), AA0; VMOVDQA AA0, AA1; VMOVDQA AA0, AA2; VMOVDQA AA0, AA3 + VMOVDQA state1StoreAVX2, BB0; VMOVDQA BB0, BB1; VMOVDQA BB0, BB2; VMOVDQA BB0, BB3 + VMOVDQA state2StoreAVX2, CC0; VMOVDQA CC0, CC1; VMOVDQA CC0, CC2; VMOVDQA CC0, CC3 + VMOVDQA ctr3StoreAVX2, DD0 + VPADDD ·avx2IncMask<>(SB), DD0, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD1; VPADDD ·avx2IncMask<>(SB), DD1, DD2; VPADDD ·avx2IncMask<>(SB), DD2, DD3 + VMOVDQA DD0, ctr0StoreAVX2; VMOVDQA DD1, ctr1StoreAVX2; VMOVDQA DD2, ctr2StoreAVX2; VMOVDQA DD3, ctr3StoreAVX2 + +sealAVX2Tail512LoopA: + polyAdd(0(oup)) + polyMul + LEAQ 16(oup), oup + +sealAVX2Tail512LoopB: + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + polyAdd(0*8(oup)) + polyMulAVX2 + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol8<>(SB), DD0, DD0; VPSHUFB ·rol8<>(SB), DD1, DD1; VPSHUFB ·rol8<>(SB), DD2, DD2; VPSHUFB ·rol8<>(SB), DD3, DD3 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $7, BB0, CC3; VPSRLD $25, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $7, BB1, CC3; VPSRLD $25, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $7, BB2, CC3; VPSRLD $25, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $7, BB3, CC3; VPSRLD $25, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $4, BB2, BB2, BB2; VPALIGNR $4, BB3, BB3, BB3 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $8, CC3, CC3, CC3 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1; VPALIGNR $12, DD2, DD2, DD2; VPALIGNR $12, DD3, DD3, DD3 + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + polyAdd(2*8(oup)) + polyMulAVX2 + LEAQ (4*8)(oup), oup + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol8<>(SB), DD0, DD0; VPSHUFB ·rol8<>(SB), DD1, DD1; VPSHUFB ·rol8<>(SB), DD2, DD2; VPSHUFB ·rol8<>(SB), DD3, DD3 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $7, BB0, CC3; VPSRLD $25, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $7, BB1, CC3; VPSRLD $25, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $7, BB2, CC3; VPSRLD $25, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $7, BB3, CC3; VPSRLD $25, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $12, BB2, BB2, BB2; VPALIGNR $12, BB3, BB3, BB3 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $8, CC3, CC3, CC3 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1; VPALIGNR $4, DD2, DD2, DD2; VPALIGNR $4, DD3, DD3, DD3 + + DECQ itr1 + JG sealAVX2Tail512LoopA + DECQ itr2 + JGE sealAVX2Tail512LoopB + + VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1; VPADDD ·chacha20Constants<>(SB), AA2, AA2; VPADDD ·chacha20Constants<>(SB), AA3, AA3 + VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1; VPADDD state1StoreAVX2, BB2, BB2; VPADDD state1StoreAVX2, BB3, BB3 + VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1; VPADDD state2StoreAVX2, CC2, CC2; VPADDD state2StoreAVX2, CC3, CC3 + VPADDD ctr0StoreAVX2, DD0, DD0; VPADDD ctr1StoreAVX2, DD1, DD1; VPADDD ctr2StoreAVX2, DD2, DD2; VPADDD ctr3StoreAVX2, DD3, DD3 + VMOVDQA CC3, tmpStoreAVX2 + VPERM2I128 $0x02, AA0, BB0, CC3 + VPXOR (0*32)(inp), CC3, CC3 + VMOVDQU CC3, (0*32)(oup) + VPERM2I128 $0x02, CC0, DD0, CC3 + VPXOR (1*32)(inp), CC3, CC3 + VMOVDQU CC3, (1*32)(oup) + VPERM2I128 $0x13, AA0, BB0, CC3 + VPXOR (2*32)(inp), CC3, CC3 + VMOVDQU CC3, (2*32)(oup) + VPERM2I128 $0x13, CC0, DD0, CC3 + VPXOR (3*32)(inp), CC3, CC3 + VMOVDQU CC3, (3*32)(oup) + + VPERM2I128 $0x02, AA1, BB1, AA0 + VPERM2I128 $0x02, CC1, DD1, BB0 + VPERM2I128 $0x13, AA1, BB1, CC0 + VPERM2I128 $0x13, CC1, DD1, DD0 + VPXOR (4*32)(inp), AA0, AA0; VPXOR (5*32)(inp), BB0, BB0; VPXOR (6*32)(inp), CC0, CC0; VPXOR (7*32)(inp), DD0, DD0 + VMOVDQU AA0, (4*32)(oup); VMOVDQU BB0, (5*32)(oup); VMOVDQU CC0, (6*32)(oup); VMOVDQU DD0, (7*32)(oup) + + VPERM2I128 $0x02, AA2, BB2, AA0 + VPERM2I128 $0x02, CC2, DD2, BB0 + VPERM2I128 $0x13, AA2, BB2, CC0 + VPERM2I128 $0x13, CC2, DD2, DD0 + VPXOR (8*32)(inp), AA0, AA0; VPXOR (9*32)(inp), BB0, BB0; VPXOR (10*32)(inp), CC0, CC0; VPXOR (11*32)(inp), DD0, DD0 + VMOVDQU AA0, (8*32)(oup); VMOVDQU BB0, (9*32)(oup); VMOVDQU CC0, (10*32)(oup); VMOVDQU DD0, (11*32)(oup) + + MOVQ $384, itr1 + LEAQ 384(inp), inp + SUBQ $384, inl + VPERM2I128 $0x02, AA3, BB3, AA0 + VPERM2I128 $0x02, tmpStoreAVX2, DD3, BB0 + VPERM2I128 $0x13, AA3, BB3, CC0 + VPERM2I128 $0x13, tmpStoreAVX2, DD3, DD0 + + JMP sealAVX2SealHash + +// func cpuid(eaxArg, ecxArg uint32) (eax, ebx, ecx, edx uint32) +TEXT ·cpuid(SB), NOSPLIT, $0-24 + MOVL eaxArg+0(FP), AX + MOVL ecxArg+4(FP), CX + CPUID + MOVL AX, eax+8(FP) + MOVL BX, ebx+12(FP) + MOVL CX, ecx+16(FP) + MOVL DX, edx+20(FP) + RET + +// func xgetbv() (eax, edx uint32) +TEXT ·xgetbv(SB),NOSPLIT,$0-8 + MOVL $0, CX + XGETBV + MOVL AX, eax+0(FP) + MOVL DX, edx+4(FP) + RET diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_generic.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_generic.go new file mode 100644 index 00000000..744282be --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_generic.go @@ -0,0 +1,70 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package chacha20poly1305 + +import ( + "encoding/binary" + + "github.com/SkycoinProject/skycoin/src/cipher/chacha20poly1305/internal/chacha20" + "github.com/SkycoinProject/skycoin/src/cipher/poly1305" +) + +func roundTo16(n int) int { + return 16 * ((n + 15) / 16) +} + +func (c *chacha20poly1305) sealGeneric(dst, nonce, plaintext, additionalData []byte) []byte { + var counter [16]byte + copy(counter[4:], nonce) + + var polyKey [32]byte + chacha20.XORKeyStream(polyKey[:], polyKey[:], &counter, &c.key) + + ret, out := sliceForAppend(dst, len(plaintext)+poly1305.TagSize) + counter[0] = 1 + chacha20.XORKeyStream(out, plaintext, &counter, &c.key) + + polyInput := make([]byte, roundTo16(len(additionalData))+roundTo16(len(plaintext))+8+8) + copy(polyInput, additionalData) + copy(polyInput[roundTo16(len(additionalData)):], out[:len(plaintext)]) + binary.LittleEndian.PutUint64(polyInput[len(polyInput)-16:], uint64(len(additionalData))) + binary.LittleEndian.PutUint64(polyInput[len(polyInput)-8:], uint64(len(plaintext))) + + var tag [poly1305.TagSize]byte + poly1305.Sum(&tag, polyInput, &polyKey) + copy(out[len(plaintext):], tag[:]) + + return ret +} + +func (c *chacha20poly1305) openGeneric(dst, nonce, ciphertext, additionalData []byte) ([]byte, error) { + var tag [poly1305.TagSize]byte + copy(tag[:], ciphertext[len(ciphertext)-16:]) + ciphertext = ciphertext[:len(ciphertext)-16] + + var counter [16]byte + copy(counter[4:], nonce) + + var polyKey [32]byte + chacha20.XORKeyStream(polyKey[:], polyKey[:], &counter, &c.key) + + polyInput := make([]byte, roundTo16(len(additionalData))+roundTo16(len(ciphertext))+8+8) + copy(polyInput, additionalData) + copy(polyInput[roundTo16(len(additionalData)):], ciphertext) + binary.LittleEndian.PutUint64(polyInput[len(polyInput)-16:], uint64(len(additionalData))) + binary.LittleEndian.PutUint64(polyInput[len(polyInput)-8:], uint64(len(ciphertext))) + + ret, out := sliceForAppend(dst, len(ciphertext)) + if !poly1305.Verify(&tag, polyInput, &polyKey) { + for i := range out { + out[i] = 0 + } + return nil, errOpen + } + + counter[0] = 1 + chacha20.XORKeyStream(out, ciphertext, &counter, &c.key) + return ret, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_noasm.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_noasm.go new file mode 100644 index 00000000..4c2eb703 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_noasm.go @@ -0,0 +1,15 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !amd64 !go1.7 gccgo appengine + +package chacha20poly1305 + +func (c *chacha20poly1305) seal(dst, nonce, plaintext, additionalData []byte) []byte { + return c.sealGeneric(dst, nonce, plaintext, additionalData) +} + +func (c *chacha20poly1305) open(dst, nonce, ciphertext, additionalData []byte) ([]byte, error) { + return c.openGeneric(dst, nonce, ciphertext, additionalData) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_test.go new file mode 100644 index 00000000..7cda04dd --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_test.go @@ -0,0 +1,221 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package chacha20poly1305 + +import ( + "bytes" + cr "crypto/rand" + "encoding/hex" + mr "math/rand" + "testing" +) + +func TestVectors(t *testing.T) { + for i, test := range chacha20Poly1305Tests { + key, err := hex.DecodeString(test.key) + if err != nil { + t.Error(err) + continue + } + + nonce, err := hex.DecodeString(test.nonce) + if err != nil { + t.Error(err) + continue + } + + ad, err := hex.DecodeString(test.aad) + if err != nil { + t.Error(err) + continue + } + + plaintext, err := hex.DecodeString(test.plaintext) + if err != nil { + t.Error(err) + continue + } + + aead, err := New(key) + if err != nil { + t.Fatal(err) + } + + ct := aead.Seal(nil, nonce, plaintext, ad) + if ctHex := hex.EncodeToString(ct); ctHex != test.out { + t.Errorf("#%d: got %s, want %s", i, ctHex, test.out) + continue + } + + plaintext2, err := aead.Open(nil, nonce, ct, ad) + if err != nil { + t.Errorf("#%d: Open failed", i) + continue + } + + if !bytes.Equal(plaintext, plaintext2) { + t.Errorf("#%d: plaintext's don't match: got %x vs %x", i, plaintext2, plaintext) + continue + } + + if len(ad) > 0 { + alterAdIdx := mr.Intn(len(ad)) + ad[alterAdIdx] ^= 0x80 + if _, err := aead.Open(nil, nonce, ct, ad); err == nil { + t.Errorf("#%d: Open was successful after altering additional data", i) + } + ad[alterAdIdx] ^= 0x80 + } + + alterNonceIdx := mr.Intn(aead.NonceSize()) + nonce[alterNonceIdx] ^= 0x80 + if _, err := aead.Open(nil, nonce, ct, ad); err == nil { + t.Errorf("#%d: Open was successful after altering nonce", i) + } + nonce[alterNonceIdx] ^= 0x80 + + alterCtIdx := mr.Intn(len(ct)) + ct[alterCtIdx] ^= 0x80 + if _, err := aead.Open(nil, nonce, ct, ad); err == nil { + t.Errorf("#%d: Open was successful after altering ciphertext", i) + } + ct[alterCtIdx] ^= 0x80 + } +} + +func TestRandom(t *testing.T) { + // Some random tests to verify Open(Seal) == Plaintext + for i := 0; i < 256; i++ { + var nonce [12]byte + var key [32]byte + + al := mr.Intn(128) + pl := mr.Intn(16384) + ad := make([]byte, al) + plaintext := make([]byte, pl) + _, err := cr.Read(key[:]) + if err != nil { + t.Error(err) + } + _, err = cr.Read(nonce[:]) + if err != nil { + t.Error(err) + } + _, err = cr.Read(ad) + if err != nil { + t.Error(err) + } + _, err = cr.Read(plaintext) + if err != nil { + t.Error(err) + } + + aead, err := New(key[:]) + if err != nil { + t.Fatal(err) + } + + ct := aead.Seal(nil, nonce[:], plaintext, ad) + + plaintext2, err := aead.Open(nil, nonce[:], ct, ad) + if err != nil { + t.Errorf("Random #%d: Open failed", i) + continue + } + + if !bytes.Equal(plaintext, plaintext2) { + t.Errorf("Random #%d: plaintext's don't match: got %x vs %x", i, plaintext2, plaintext) + continue + } + + if len(ad) > 0 { + alterAdIdx := mr.Intn(len(ad)) + ad[alterAdIdx] ^= 0x80 + if _, err := aead.Open(nil, nonce[:], ct, ad); err == nil { + t.Errorf("Random #%d: Open was successful after altering additional data", i) + } + ad[alterAdIdx] ^= 0x80 + } + + alterNonceIdx := mr.Intn(aead.NonceSize()) + nonce[alterNonceIdx] ^= 0x80 + if _, err := aead.Open(nil, nonce[:], ct, ad); err == nil { + t.Errorf("Random #%d: Open was successful after altering nonce", i) + } + nonce[alterNonceIdx] ^= 0x80 + + alterCtIdx := mr.Intn(len(ct)) + ct[alterCtIdx] ^= 0x80 + if _, err := aead.Open(nil, nonce[:], ct, ad); err == nil { + t.Errorf("Random #%d: Open was successful after altering ciphertext", i) + } + ct[alterCtIdx] ^= 0x80 + } +} + +func benchamarkChaCha20Poly1305Seal(b *testing.B, buf []byte) { + b.SetBytes(int64(len(buf))) + + var key [32]byte + var nonce [12]byte + var ad [13]byte + var out []byte + + aead, err := New(key[:]) + if err != nil { + b.Fatal(err) + } + + b.ResetTimer() + for i := 0; i < b.N; i++ { + out = aead.Seal(out[:0], nonce[:], buf[:], ad[:]) + } +} + +func benchamarkChaCha20Poly1305Open(b *testing.B, buf []byte) { + b.SetBytes(int64(len(buf))) + + var key [32]byte + var nonce [12]byte + var ad [13]byte + var ct []byte + var out []byte + + aead, err := New(key[:]) + if err != nil { + b.Fatal(err) + } + + ct = aead.Seal(ct[:0], nonce[:], buf[:], ad[:]) + + b.ResetTimer() + for i := 0; i < b.N; i++ { + out, _ = aead.Open(out[:0], nonce[:], ct[:], ad[:]) //nolint:errcheck + } +} + +func BenchmarkChacha20Poly1305Open_64(b *testing.B) { + benchamarkChaCha20Poly1305Open(b, make([]byte, 64)) +} + +func BenchmarkChacha20Poly1305Seal_64(b *testing.B) { + benchamarkChaCha20Poly1305Seal(b, make([]byte, 64)) +} + +func BenchmarkChacha20Poly1305Open_1350(b *testing.B) { + benchamarkChaCha20Poly1305Open(b, make([]byte, 1350)) +} + +func BenchmarkChacha20Poly1305Seal_1350(b *testing.B) { + benchamarkChaCha20Poly1305Seal(b, make([]byte, 1350)) +} + +func BenchmarkChacha20Poly1305Open_8K(b *testing.B) { + benchamarkChaCha20Poly1305Open(b, make([]byte, 8*1024)) +} + +func BenchmarkChacha20Poly1305Seal_8K(b *testing.B) { + benchamarkChaCha20Poly1305Seal(b, make([]byte, 8*1024)) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_vectors_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_vectors_test.go new file mode 100644 index 00000000..49f0da6b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_vectors_test.go @@ -0,0 +1,332 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package chacha20poly1305 + +var chacha20Poly1305Tests = []struct { + plaintext, aad, key, nonce, out string +}{ + { + "4c616469657320616e642047656e746c656d656e206f662074686520636c617373206f66202739393a204966204920636f756c64206f6666657220796f75206f6e6c79206f6e652074697020666f7220746865206675747572652c2073756e73637265656e20776f756c642062652069742e", + "50515253c0c1c2c3c4c5c6c7", + "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f", + "070000004041424344454647", + "d31a8d34648e60db7b86afbc53ef7ec2a4aded51296e08fea9e2b5a736ee62d63dbea45e8ca9671282fafb69da92728b1a71de0a9e060b2905d6a5b67ecd3b3692ddbd7f2d778b8c9803aee328091b58fab324e4fad675945585808b4831d7bc3ff4def08e4b7a9de576d26586cec64b61161ae10b594f09e26a7e902ecbd0600691", + }, + { + "1400000cebccee3bf561b292340fec60", + "00000000000000001603030010", + "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e", + "129039b5572e8a7a8131f76a", + "2b487a2941bc07f3cc76d1a531662588ee7c2598e59778c24d5b27559a80d163", + }, + { + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000", + "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e", + "129039b5572e8a7a8131f76a", + "3f487a25aa70e9c8391763370569c9e83b7650dd1921c8b78869f241f25d2096c910b180930c5b8747fd90959fe8ca2dcadb4fa50fa1439f916b2301e1cc0810d6725775d3ab86721700f96e22709b0a7a8bef32627dd929b2dd3ba15772b669062bb558bc92e6c241a1d60d9f0035e80c335f854815fe1138ab8af653eab3e122135feeec7dfaba1cc24af82a2b7acccdd824899a7e03cc29c25be8a4f56a66673845b93bae1556f09dafc89a0d22af207718e2a6bb022e9d917597295992ea3b750cc0e7a7c3d33b23c5a8aeab45f5bb542f6c9e6c1747ae5a344aff483ba38577ad534b33b3abc7d284776ea33ed488c2a2475648a4fcda561745ea7787ed60f2368deb27c75adce6ff9b6cc6de1f5e72a741e2d59f64751b3ae482d714e0c90e83c671ff98ed611823afb39e6e5019a6ba548a2a72e829c7b7b4a101ac9deb90a25d3e0c50d22e1fc26c7c02296fa13c6d9c14767f68aaf46450a8d0fd5feb60d9d73c6e68623425b4984a79d619dd6bf896459aa77a681ec9c1a97f645e121f47779b051f8948a817f84d1f55da170d5bbbaf2f64e18b97ed3fd822db2819f523314f1e5ac72e8f69bbe6c87c22daddb0e1ac6790f8534071de2f258064b99789bfb165b065b8fe96f9127cd7dca9f7cb0368420f1e802faa3ca23792f2a5b93773dd405e71c320b211b54f7a26626b03c060e1ab87f32ac588abfa056ce090bd7c69913a700c80f325bfe824fa", + }, + { + "0967de57eefe1aaa999b9b746d88a1a248000d8734e0e938c6aa87", + "e4f0a3a4f90a8250f8806aa319053e8d73c62f150e2f239563037e9cc92823ad18c65111d0d462c954cc6c6ed2aafb45702a5a7e597d13bd8091594ab97cf7d1", + "f2db28620582e05f00f31c808475ca3df1c20e340bf14828352499466d79295f", + "4349e2131d44dc711148dfe3", + "bd06cc144fdc0d8b735fa4452eabbf78fd4ad2966ea41a84f68da40ca2da439777bc2ba6c4ec2de0d003eb", + }, + { + "c4c920fb52a56fe66eaa8aa3fa187c543e3db8e5c8094c4313dc4ed35dfc5821c5791d171e8cfe8d37883031a0ad", + "85deea3dc4", + "05ff881d1e151bab4ca3db7d44880222733fe62686f71ce1e4610f2ea19599a7", + "b34710f65aed442e4a40866b", + "b154452fb7e85d175dd0b0db08591565c5587a725cf22386922f5d27a01015aba778975510b38754b2182e24352f019b7ad493e1ed255906715644aec6e0", + }, + { + "c4b337df5e83823900c6c202e93541cf5bc8c677a9aad8b8d87a4d7221e294e595cbc4f34e462d4e0def50f62491c57f598cf60236cfba0f4908816aea154f80e013732e59a07c668fcc5cb35d2232b7ae29b9e4f874f3417c74ab6689fae6690d5a9766fa13cd8adf293d3d4b70f4f999adde9121d1d29d467d04cf77ea398444d0ea3fe4b7c9c3e106002c76f4260fa204a0c3d5", + "72611bef65eb664f24ea94f4d5d3d88c9c9c6da29c9a1991c02833c4c9f6993b57b5", + "dd0f2d4bb1c9e5ca5aa5f38d69bc8402f7dbb7229857b4a41b3044d481b7655e", + "2bbca0910cc47ca0b8517391", + "83aa28d6d98901e2981d21d3758ae4db8cce07fe08d82ca6f036a68daa88a7dda56eeb38040c942bdda0fd2d369eec44bd070e2c9314992f68dc16989a6ac0c3912c378cf3254f4bae74a66b075e828df6f855c0d8a827ffed3c03582c12a9112eeb7be43dfe8bd78beb2d1e56678b99a0372531727cb7f2b98d2f917ec10de93fe86267100c20356e80528c5066688c8b7acba76e591449952343f663993d5b642e59eb0f", + }, + { + "a9775b8e42b63335439cf1c79fe8a3560b3baebfdfc9ef239d70da02cea0947817f00659a63a8ee9d67fb1756854cc738f7a326e432191e1916be35f0b78d72268de7c0e180af7ee8aa864f2fc30658baa97f9edb88ace49f5b2a8002a8023925e9fa076a997643340c8253cf88ac8a221c190d94c5e224110cb423a4b65cca9046c1fad0483e1444c0680449148e7b20a778c56d5ae97e679d920c43eed6d42598cf05d10d1a15cd722a0686a871b74fea7cad45562bacf3bda937ac701bc218dac7e9d7d20f955429abdac21d821207febf4d54daea4898837035038bf71c66cef63e90f5d3e51f7fcfe18d41f38540a2c2958dacde16304e4b33da324030f1366f923c337", + "74ba3372d308910b5c9c3885f41252d57556", + "9cf77bd06a4ed8fb59349791b98ba40b6019611942f5768e8be2ee88477149e3", + "b928935c4c966c60fd6583c0", + "ec7fd64fd75b254961a2b7fc942470d8620f439258b871d0d00f58028b5e0bee5e139e8108ac439391465d6658f559b1df57aa21cf826ede1a28bc11af885e13eebfc009870928fae8abfdd943a60c54fca93f0502dc23d29c2fd5340f9bc0e6ef2a18b66ef627af95f796d5bbca50de22c8ec802da9397089b25c6ba5262468e3977b45dc112e51896c70731b0a52d7efec7c93b41995823436bf4b0c477ae79684407c9831b487928b2b8303caca752b3edf1f0598e15831155462706f94ef3fa3a9e5f937f37085afa9b4bbf939d275796a61b78f70597acfd25cd87f967021cd99328fc371b5eb5739869520657b30e4a5b0db7c8715cbe275dee78e719b357d3a9731f9eaba95986479bb2004a77822fc115a3d", + }, + { + "b3d3128bce6bbf66fd78f1a18352bae56bfcdae18b65c379ee0aeb37ee54fba1270d2df578ec5b75654d16e89fd1cd0acda7ec580dafd2fbbabd32a8112d49383a762db2638928c8d63eb0750f7e7fdd256b35321b072dd5c45f7dd58cc60dc63d3b79a0c4a1689adf180fef968eccbcfa01ee15091ceacd7b67a3082db0ce6aeb470aafe87249c88b58b721e783dde184ccf68de8e05b6347fe6b74ae3adf9a81e9496a5c9332e7ebe908d26ce6b3f0b2a97e9a89d9fdd0d7694585a3241f240d698e69fcc050e7a959ba153f6d06f117848ba05d887134f1b6b994dad9b9e74247513e08a125b1fadfc7394dcd2a6451b504ae3e75e22f2b9bc405747dedb6c43ef4ccdf1a7edaf9451346123eaa63f3af113124f361508e255503a242b96680ae3360c8b13ac1f64d08088bb26b7f617cb0866f11d6fd362b00d86eba3fee68724e302388f119d6f92161ac8ce00d08919377a26974d99575b1032ff0f1976240c785c8b89e9eb2bf005e4be06b5371ffca14683fedfdb49e00e38ff27af1324177faf91599abd5990920797574eb743effdc7decda318ada1419cc8e0bfecf82f9c99792746c2b", + "7e8da4f3018f673f8e43bd7a1dee05f8031ec49129c361abbc2a434e9eaf791c3c1d0f3dad767d3bba3ab6d728bbcf2bd994bd03571eae1348f161e6a1da03ddf7121ba4", + "7ee32dd501dce849cd492f6e23324c1a4567bfceff9f11d1352bcb8615f1b093", + "8998e043d2961afa51ea262a", + "ba85e72af18cb5ba85a4a0d6c28b4ac1e5509a3a2fdb0e3255cbc559df5e6a661fc560c756a0264dd99b72c61c51a4b7ad56ca4c8ccb7e8edfc48ff3cceac5d1e8ac5fc87096adc4d0e9a27492857b17604c3a694cfe0e70b22df106c8f3c61f840bcd634964cdb571840e125e381e7dd3a0d97972e965f16f775fa4ce555124318290bf508beb7bd77e633042deb0e863631478fc3dc9122862b3c31264471bcce54e0b74040c8bafd481cf798f332e8940f1134d3027d6f28e771d15e154fc89c6c25fe18a5d312807cc2e623bb1bbb4f0b6ec71d009407eb54bb0759f03682f65d0da8812f84d8e97483f6a8d76a8417efcd9526444abba24288647609791578887ef49780b0b89f51b072cae81c5b5014463da3633dda105b82add0f9c2f065dca46eedd2928be2570493c79a996fa78ea6aec0996497fe2dc444432ade4eaa662ee2255f0f4b92d593288a8e3ffe7a15a10e9d33b0203af23f4c9fd2cfcb6160db63b52810869ff1e65423dbe2c4415884b9f8dec3c968e14cd74f323c89053a96111bc9ce59ec483832c49c53a648e5f0f797f53642ac60170c94b473f1f2e7d8a38e46460b81219b52081263027f74cbf63a75af3a7", + }, + { + "68d5ba501e87994ef6bc8042d7c5a99693a835a4796ad044f0e536a0790a7ee1e03832fec0cb4cb688cdf85f92a1f526492acac2949a0684803c24f947a3da27db0c259bd87251603f49bfd1eab4f733dec2f5725cfcf6dc381ad57fbdb0a699bccc34943e86f47dcfb34eba6746ed4508e3b764dfad4117c8169785c63d1e8309531747d90cc4a8bf13622759506c613324c512d10629991dc01fe3fe3d6607907e4f698a1312492674707fc4dde0f701a609d2ac336cc9f38badf1c813f9599148c21b5bd4658249d5010db2e205b3880e863441f2fe357dab2645be1f9e5067616bc335d0457ea6468c5828910cb09f92e5e184e316018e3c464c5ce59cc34608867bd8cbfa7e1286d73a17e3ebb675d097f9b3adfa41ea408d46252a096b3290e70a5be1896d6760a87e439334b863ccb11679ab5763ebe4a9110eb37c4043634b9e44d40cab34b42977475e2faa2ae0c0a38b170776fbb0870a63044aa6679545ac6951579d0581144cdf43f60923b6acaecdb325c864acd2c7b01d6e18b2b3c41c041bb9099cce557b114b84350131e3cee4089648b5691065867e7d38314154355d0e3ef9dc9375eddef922df2a06ad0f0e4357c3ac672932e5a66b16e8bf4b45cd893ea91cb397faadb9d9d7bf86e6ceca3e9176a5baa98b6114a149d3ed8ea176cc4a9380e18d2d9b67045aedeb28b729ba2ece74d759d5ebfb1ebee8ac5f5e79aaf1f98b7f2626e62a81d315a98b3e", + "63b90dd89066ad7b61cc39497899a8f14399eace1810f5fe3b76d2501f5d8f83169c5ba602082164d45aad4df3553e36ef29050739fa067470d8c58f3554124bf06df1f27612564a6c04976059d69648ff9b50389556ad052e729563c6a7", + "7d5c4314a542aff57a454b274a7999dfdc5f878a159c29be27dabdfcf7c06975", + "aeb6159fa88bb1ffd51d036d", + "7597f7f44191e815a409754db7fea688e0105c987fa065e621823ea6dea617aed613092ad566c487cfa1a93f556615d2a575fb30ac34b11e19cd908d74545906f929dc9e59f6f1e1e6eaaabe182748ef87057ef7820ffcf254c40237d3ea9ff004472db783ed54b5a294a46cf90519bf89367b04fc01ce544c5bcdd3197eb1237923ce2c0c99921ca959c53b54176d292e97f6d9696ded6054711721aebda543e3e077c90e6f216cdc275b86d45603521c5aab24f08fd06833b0743c388382f941e19e0283ac7c4ef22383e1b9b08572882769c1382bab9ad127e7f3e09b5330b82d3e0c7d6f0df46edc93265999eef8e7afa0cb1db77df7accf5bff8631a320d146a5c751a637a80f627b0c9a41b44f09212f38c154226de02f4906ef34139bbeacc3f06739c8540e37334392d38ba1cbf4bc7debe77c09b35d2200216db15ed4389f43bfd8ae9bf76fd8243c3d869546e16b8e44a6cd1edbd2c58ef890b5a84cda889131e5cd9402ca4d8271052c6b4fe3f2dff54fb77bcb575c315b9109f90b14bc8e109919808a581c1809e2a188d29fd34ce639088a6683f641925f5b4b3529baa34e080bb47fb7ad9b43d0d67c9e6ae7cacb50527fa74e56d0c8b20149f5d332d686d48ebbe634c2b5d35fc84c69a5bcc93b93dedcf9fdf19a1fb9b75f6df9692d16f6c3490377a06294499e4b8ebeaa0cfd840bfa05fde21c0b5e94d13063b3f5da7b537caefe89069cfa9de9eb8f06e4d30125de64716f821bcc8279c0c7ea2e", + }, + { + "89c1ee38b6697d0190c87a2aa756892ee09fca095df1e31aeedbda5750f604d9b8f2116e5b8f70ec57ea16fe419f2d213ef72b9be90eb5d7e98f2e398632123e2524ac80b31c6c0a07820848223569602d94fc16a3b1ed8c411bc6c74ed80573fcb1f3afce60b9d5e2c21d04f78665241b613abe12274a5343101a91e91f04e5d1f7959f574e743a10913e0817a32c320467f0178e3b6ad14b856234a4661a755eaf14b5fd88ef0e192e1631d14263d6a954ed388f5709dadc6c0f81d229f630d80be6d593d5e3ad03f9ded53c41abe595981d24ef27ffcc930e4d653743960f4e7ce4e251c88f55c16d2afdaed5e3446d00685c276728ba757520acb9b6bb0732a0e9836878d829e5022794d70ad8440a40a132a8c9ec1d3f0ccaf8c285fff425e9788d6150b74753dedb2ae8b36ff2f310249bd911b9181d8310e00810d42ef94cbb5a9d72a1f0507c1a382f892b23994fbe7360778b7efa9c5e03ac3231a57fecff1c5fa10caf1d26e84db0137049622ebcc3a64841a0e49fa390d1d43550c1346c20d578cff39fb7404fcab0982dde55f0849d312581d0c811a19d46f25e7a5e7e50d74d43760583c5cf335dfc11b2ec964f1dbbd0ed83e18f2027817ea2dffcf2b64a352c4fb8f11eeb4f1bfc01079251254d2112d103a1f12a2270cc026cbeb8b6f3e505abd62496253f93274625786b73997e449c1f35c742a593441252fcc845e1cef1b8f287dd311a0477407ce3b31661f7b2802c79c2d20d06e45f03aca4e47a959c6c1d7a9d377e1577fbf82a115921c3d94e3d9c204aa204a9a5b04d8a2be3269700a035371f4aaf1a42d92b9bfbee74492b106975b36d1e581d6ce2484f09e04fa91586c85f35e2a10f0d3c0afcb05327c1bc9d7429bbcc4627af8f76b86fc561844c2ae3810c84901ac09a1670ed3d31a9daa5d296", + "7219bd21a834d917f93a9b45647ec77102578bc2f2a132dfde6489b9095b4f7b740c9c1c4075333ab0ce7f14", + "a7f849b054982cc8a4c8e5e53e181feee79e0233e58882839892134ad582da7c", + "4c46854e9e101090b1436f90", + "ab2e189baf60886bed88eb751bf3560a8bd3cdb6ee621d8c18b5fb3aa418f350048ecf359a7d542daf7090ec8688c3b0fe85914aa49d83be4ae3396f7bdc48051afae6a97fca7b42c0bf612a42d3c79ef6aadceb57f5cfe8d67f89d49add0ea1ffd423da058297239e72a85fa6cd1d82e243a503b1b0e12d7510a9ee98d7921dae2754d7581e52acb8ab9e7f9df3c73410789115cef6ce7c937a5441ad4edf2b7a8c0c6d152d5a5909c4ce839d59594a6163364038c4c71a1507389717f61e2bda1ea66a83ef477762e7834ebcfaa8f2ee61ced1605ba1380108236e1763bf40af5259da07dd3e3d0fb2801868c2e7c839e318678687cbe33384e2ef5750a0a0e2d2e19e869a4277e32a315ed4de79357f6a12a8a25d5b18291316d9bf40dad2d05d1b523ade76650669c700a1c2965f4e51337aa5d45ec7b4981072779401d6d30ed69034053334bccb18425ac68460becf2aeccc75aacd3d6709f07ee10366ed848c8a54904af4ea71fc2117de133f01e1cc031f2a4d0779b997b82682433ee615202d5dfffba6c916f11a00551d56ffde8c36b303263e14adaf45b6eab0bedf344e5214ce52f071d2f40154d788c6870020791a03d2fd4ec5879d9026241954ed45cfddef4937ea3d0d45647f252be31411237983a1be340fc65ebab9a5620abb0e8d475af4e89e842e895eda0cbd283bb5d0bf20236c62d956de733d60ebceb42fc0c9adbf9b69f8d66551b0aca0e260625ad41cad75d752a234af7caf7902c2c5b62f04b6a8e019a6179d44feeb2ad5859ef1c45371e66f1af1fe0de63997266c290e27f0dd62185c53f81e0a50c296a51ace7c90d9cf0dda8b2d7e72a347f64c44262e2a544d1acc7bb05734dc1783bbc1903279092fe7fe434610aa95fc2ce5fc5ee45858f5e8337d8fcb0a468464becb1cef6b7e5ea48ba383ad8a406df9c581f1cac057d8711fcb", + }, + { + "2dcfbb59975f217c445f95634d7c0250afe7d8316a70c47dba99ff94167ab74349729ce1d2bd5d161df27a6a6e7cba1e63924fcd03134abdad4952c3c409060d7ca2ee4e5f4c647c3edee7ad5aa1cbbd341a8a372ed4f4db1e469ee250a4efcc46de1aa52a7e22685d0915b7aae075defbff1529d40a04f250a2d4a046c36c8ca18631cb055334625c4919072a8ee5258efb4e6205525455f428f63aeb62c68de9f758ee4b8c50a7d669ae00f89425868f73e894c53ce9b964dff34f42b9dc2bb03519fbc169a397d25197cae5bc50742f3808f474f2add8d1a0281359043e0a395705fbc0a89293fa2a5ddfe6ae5416e65c0a5b4eb83320585b33b26072bc99c9c1948a6a271d64517a433728974d0ff4586a42109d6268f9961a5908d6f2d198875b02ae7866fff3a9361b41842a35dc9477ec32da542b706f8478457649ddfda5dfab1d45aa10efe12c3065566541ebdc2d1db6814826f0cc9e3642e813408df3ebaa3896bb2777e757dc3dbc1d28994a454fcb8d76bc5914f29cfc05dc89f8c734315def58d4d6b0b0136ccd3c05178155e30fcb9f68df9104dc96e0658fa899c0058818da5ec88a723558ae3a6f2f8f523e5af1a73a82ab16198c7ba8341568399d8013fc499e6e7ef61cb8654b48b88aa2a931dc2cdcf245686eed9c8355d620d5e91c1e878a9c7da655e3f29d9b7c3f44ad1c70890eb5f27ca28efff76420cd4e3cebd5c788536ddd365f7ad1dbb91588d58612e43b0460de9260d5f780a245bc8e1a83166df1f3a3506d742c268ab4fc10c6e04bca40295da0ff5420a199dd2fb36045215138c4a2a539ceccc382c8d349a81e13e848708947c4a9e85d861811e75d323896f6da3b2fa807f22bcfc57477e487602cf8e973bc925b1a19732b00d15d38675313a283bbaa75e6793b5af11fe2514bda3abe96cc19b0e58ddbe55e381ec58c31670fec1184d38bbf2d7cde0fcd29e907e780d30130b98e0c9eec44bcb1d0ed18dfda2a64adb523da3102eafe2bd3051353d8148491a290308ed4ec3fa5da5784b481e861360c3b670e256539f96a4c4c4360d0d40260049035f1cfdacb275e7fa847e0df531b466141ac9a3a16e7865947572e4ab732daec23aac6eed1256d796c4d58bf699f20aa4bbae461a16abbe9c1e9", + "33791b0d653fb72c2d88519b02bde85a7c51f99cfb4456dfa6f84a61e10b4a14846521", + "a0a7b73ca2fc9282a28acc036bd74d7f5cb2a146577a5c29dbc3963fe7ebfd87", + "eaa4d916d261676d632455be", + "c9a631de470fd04dcbf8ea9f4d8ac37c3988878b6381707ac2c91d3720edbb31576ba90731f433a5e13582aca2b3c76ae75ca8881a463ecfa789910d3a776a9ad4800521c6baa120b2f1afd10f32ef8da63f5b69f5e5fd88ee84bf66b0666b15d05c4050f5358a050b9d5cf1503719f56cd48ceba78f29efe2ae8092e37f5134df526831532f86ccb9339637e2c9e9b9036f83cc058fda23e826a188456e7fd3f4ee20f4e4a3221883fe3232b49db607b90a8956133ab95051c9ec33a908ea7e81a1bfa7bd06c09f0143d07bb23a3feeac7f0d7720269c93e2df19d03605828c8713b84d183c9a50954c12fe3b047511ad15ef03a63355520cbd224d06a34de67a671368e6a8f9feeefe48fc273764a8c69c00314e5d693f159cb5270544f3c4e1760b0529e3303ab308e9a6d03835a3a42aef2df5f7643696f707a574d1dcc676aeecdd9947ebe8c13bcf15d30b2d10d2cd95445a307c1d22d39450615ad38f9302c6eb9dc05764b0503d6a7eaff9feb94834853b47bc25660207be3e7c0e27cb3127b5402cb016396e5ff07ddc3df29861dd68a17f53bf660b23352b739d6da72381b8d19a9fc95da7efb79330a2b360dce4309860af429e3fd10cab235c4acc1d80d9e20d67019375bd161ab65648400f308815afe63cfc717f7d0eea150e687caac25b6603287d44dca4a7cc2f67c3bdd54450bd3170340253b03ba054ec003070eddf9c14fb9dc595e228e4968524900cb5d85af6d1e658a42d744e0e7eb6995023823a8dc33528c6715b2e1aa607782c8e1ddddad72026d657bf122ece8685f6e92236e809139325e4a3c069facf94c10b7896995bba01eb22c7b3a87ea2114a7649d7ed3e83d223e5e785c66a75119beab0968d3eaf0cbcc2d7ede95d024041e6db39a880ce3e19efea32fb89a40a2aae22f407e5fd615e51e48dbd50a8b4ec27ce95e2ba1928bf699d0418705482ed0ed7acc858dfbd690403c74667a88dd5221bb79940c6c4a268379c10343aaefb635982c14f33ad83d47ced9682961540bd4f75804d3d48ba8aa67fb2e3a1db83fbcbe57fec9e4ffb1b575e947f8bd8263c680357960e3a39382974774b5a013f2f8514b3c63c21dbfd314fd5d927d82ba616d76629ac018879f54ff84b5808e94af4fcfe1cf8845b65208ca5510b5b593ce6c109611652cd", + }, + { + "c335b055b752e083554b5aa2cbb6556cfcace658d5c11b6b000256fd89e9b24c1e62a2d5b582580acdb2ad9869020465aeeabe83acd9eeacdc44aa652d5cb24bbe542073d6787ea32b2b3c942d40f9db2bb75ed7914c836d902dd2be89840948d82abbaea23952cd648e6191ce5b6cf912cad0a3165410a781e3650b676e5340980eee3b484008acce6a3e9dc5aa96d775677b8bbb8b323c6e9747d6069a169ea904d9f145e29d134cdbb0118647e8fbae638669efb9a55d50ed33568749f5304ece2193b0bfa6fc9a570d209ef61b4c59a2b5485b5aa6ab47d902cf23f7ff71c5210476e0aa727a01809b9f76b6ebcf58a018b3fbbe5f42976111ba58112b1d322f9312da068cdb86277bfcde66cb3607e3ea02a1494439aa56f302671f1f994eb3ab28b937043f5f7f3b3de50673ecea5dee8ba633c45089b852f0d772892525344ede6b521dcad15807b65e7ba348d891d47fc498cf4d50223d2794c64db9fa9b9766edb430be0c38746ab317b38ba9870a6d1fdabb70fcf89790bfe449b97fe01f6c94502aa0889f0a3bb6bdc65f44d1cd64ab88d4a7806b373f5080f9cf60183cf4686694f0059e2bbc5cf21ba0c3e8046e70d815f1444c3094cc29632c429f20aa06b49b0b52c6c7aeb8e34f7bcb53e93c2cfe2d704a5d0416876742c90762730d160e1869d5e0178dc366098ebaf2cae6f1f7563b555a52dcc194a5c8f718d50d27ee76fcce8e8991f4921fae85ea9476e1eab1364403120698b7ce8fd0a49cf79213f360a17cf1950f104494fad80adcc3bb1207bf250d57dcdce6ac8082a312959672361363cc227310b66ee8c04aab7b5cb33a81c0915e9c770a1cfaae2e8f44a0c65703927977a22fe58aef2f366b8be9a50da9376b46ae7562a82391386831febf359039ac326891bc58c0f2c34bdb6858859fc3cb4e392df65cbe2ec4f02c8425bcbdd1ee2562ab7d229d406d79a9c6fe4889c996c2f68d1fb5bbe3a5e867caa4249b934afd3ec71fdb088c54b15252f9dc1b909e121dbdc7d8a16cc00836652dd1f877ce363eed11467966f7ccb8f1a8d48146e69e04ad76a51937ad4f9cda209451eeca90dbdbd65441ce20fabfc8ce400fb4de136154b87a8b65c92740e9bb91d78521b261f806a2c6279c85ef6ac5fe1ea3117ff7c9f9832fc2aa6fab660082eb22344c1a3befe0628b6551f62a5014cd6194c42b8d475a50f2c9fb58c97e43ebb29005ed7fe54f0a4aa10074f1154152a9067d364dd7863fa082976a00db55b26b5ba0ea40eff48b90", + "f5ff810a41d4b34751e9942970d4c9f26b33f24689a4b1e4449b243490afc485af468ff01a42376b2bcb949b9f5e8d0b917f511a", + "a74271c184a82cb074c14b131fd91eb05870cb7c73c9e511ec8140bfe2f34089", + "2403fe689e239c2ed261b381", + "af9be893d5fd23aab42e6a2e59a8e7cb13d4f543db02af87cb0802bc1af7c717cd0093cc8244994cf21189146922b69927ffd5745e57118bea07a6afe7c21d952c13ab636b3c2e461dc9ffb3ae701175360156338be94b1fa7115799831019455cfaf5114010fe45f8fb9c77ec50fe06f2c5a32423edccb3b2210ee1200a78e1a3130c567542377827586ca8cf0c14c19fa1449a2cce9c039bb441b04e9c0a3f9a743b31c828032174fcdb7c894349aa68f5adf97dfe9294d24e6b5fed95eb994397883f58487bf5c57b0aea5268be7cee9efeab370f89805ebe5373ab2e93658fc078955ccf68b554dd5605005751ee8531c35ca5336a5d0ce273370c0dc9307779b86e96d2d1daf2620d67d43e1fb7800ccf250ca3c02eb74047c1d2a2bc7f29fff8320301694b80d0fd975f834337d00d5f0e4215044d52aa4ca21e6a9d7e03f186d7cdd5c48e3765dc926fb0a46bb0f05c50d9f69c9c507527a60366b7dc251aae1d6bb0d9c73735dcfab959f6fd4382fe2a1f6ad07affb0601bb9040f81b55a48f6a6c5f8ac4a2acc2b0c9a6c439198f7926460695fa11e0b0b017e39de5cf0d5d5f84d972b5eee7b5d1e0343b5485cd84b92ad892e5b23f3e803f5b363f2398c11c15be9f13e59922b0d49902dc8483fb142850b4226da2fb84e9b434a34f6bb67f575a9e57fde3354bc3077a876e260311bb2481bb139aa9af55df5074749fe532d7b8a554218a90cc7e7ac69db280bae5d55a174dfc8d325b9909a8da1016d4e162fe5ba70cf8726cdf291f5e47083d9929cd5e32021cbfd982fd0975f6f9baf4322b553cb3174b11c007559879f308419ff9e4e18eee8d3640cec8aea082b90f69cf3c7676c28af0265c24c91cd58a06513198892ce6ce1ab3ee9ac0a2e937b973a9cac06a039a54f8d994c13d42c59187f677352e5feb32a417aebec4d852b2595e7e67450e06dbd183279e3b63022a3813b37257b085bf8454d6890875a2950d20210a8df4f9da746722f62687e92f0e9efc3e5d526d65ccfbcc042fcac7964dbe147932c73924bdcdf62f9eae58d29e8567ffed90048bcf0566b952e986efeae4c477944af18bd243c3eccf8d88c06d07279adad037450cb8547a8aa0a74223f4851747c803cb21a2dd027e7080aed75038cdcecbc4639d87763cdd41829a1b72cedf0d722b180d0d492a5740ea7607b95f3201df352fb1ab28149124d2df5d5ec106867897b537302c3431402348f94d28eebc701ae1b49d10adedea38f1654fbc48885e59e6e6dfd413c6b5a97d8c35dfb07a6cdefe317bf61cf91", + }, + { + "4aba5a776ace38b6e2578f0007e770d264e39c49f588ca3547ad2888365e3a811994f8836330394587c8458eb0b6611499fd5d8e8527c3cdd4ec550b4a8f8c632384e786b420cb3be911c999c72aad60270aefad31b27a069ecf11e95e9d4c81213308d554d3103de4d9d6ab04830c2b8dfbd8bead52c44c21d5357f72810193b5096809dc7846c1521c6c569f78812c735aea21acaf6dce84a24df7234e8ad857f3e1346b27f5bd436113e2da950e4deff96e9ba8db692c7db723a105ae795da15b910c8286cac6e7dda8c172b70f61b07dfd58596684d61da8772356f180f74c1103ce97cd947eab3d401df44f7fa4cc7cfc25e280fc002873237e64a375b0b4797f4b4613c9f150090f44588ee8250ae44aec6546ec8dba0f0c1eb281cf66fa4eb141617b32b28441f6ddcfdf02d9c34cc62893b2b64dc2c26b74433adb3e888c7fea07b19c8cf39269c2716b9c35b7625d4a141397d6d5034b193d2657c6b2d6b0ba874c467adeaf3d501ad985d13be21c4ff6b326cbb671e4f4973bba49116a0399b6491394f850e4122969e4644c00b442b3da0d6a4bf25ee22d182b3f822fd83878ebcc713cb183651a67ca66677ea81b58b685a3a8e385d5fbb0147ddfecb558d881c914324c794db443b31bc15c361912bbbcba9e418f99f2a416d190cb29684df27c7f3ff6ccf339800efbdc4514ee00d1a89f12373804db4fd66c1affd467f251e73147b3248033327b0f7790fd7861a51773dd4f78b89e4e24b94df9203f4a077091bb9411eec78dfe3e1dfbb67ea1cdf17e1d6936bbb75b74055495449e9cb52f5749404610cd444fea3f0568e0d35a5ef0c395ab7bf0208044b5c4e2517911a9c351efd31f33220972287253fbccb1eb8f46960a36b68a7a6b4f5cbdc86d668bbf555fde8881e7faa9594da425ff8fb54526bf7cdc4af64899530561c06bed7fc04c5d48cd4542779e901bc48fab79d4d13850ad8247f51b9afa7d5a656ada25b6376d837cb0fa1b4016dfcfc158a39290f43f133b352ed52fab2f951509bacb41284fbdd849d8185fb7e7200f8ab2a07ef2b3b927e18e568dbeeba2c7a66e08cebdc6a6069ebe6656a586652f3905ae2bb867529af6a827b494c97b3a378408f44aaefbe86c613e11e7a44020a9ee4b62569dfc4c462300daec7b1424ff1c1849ca1332367470475c14877cbe76c820cc651c18ab3f18852b93994f93b568dc7f7b0eb5f07ffc4c9384c851fa9071c6f68ddea1ccf627f889c0471c76aff9f52b07ab1b86a7671a2b2f6b25c0ddebb66ac95737bf7e2f493f7665b5265eaa5166556cecfdd3062802724ec24f3978b903d0f0c24e1f0b8d967142bccfed0d354279223f4c28684e9ab611e9ef89a3f25993b5a8b3c0354931780501651236a78b58e7d7814f251b053605f4c0a8e7193b9cc1ee5cf7378e6f3c8fd44ec57bd91e62b09fb1d6bab60cbfabcc6792e6a32ea7918a9ec9180d05a7e1546d5d2d8bbfde2a71b4e427c0a4d28d0b6473ae", + "921a401db90935c60edda8624a0590d5c46eff3522e35de2872f6f9394e24126fd8143b68a797c995624fba0298b75eef974", + "6a4d35ae03bf277f587da4541dcddf92bbd906dff45d5ff23c0f60ae53b062be", + "231b5780fedfb06d724450b3", + "ba40968282d98849b19d867f8b564ea5a81d657516099362926bca4cb6e9ae02719d10c8061f53008c727a0eeea5e1e36c9e55c117e9434e213316c96840231a1e356b254a9981d4a6ca3c66cfc61018bcaade1a4486506559e6aa3a86bac980d391d835fd5ded98d10f1394d84bf1bbf2cd3397890d704154802f7864ecc753db782fd3d19213ae65ace4770e1bacf32d61c6730aa5adcab4d7e2e437888c11c29abba4890a17a00f67a53b660becd94092df0598df5ac57326f6860593a519e28bd4a39f6481e1a4748881fd5f0456a3cd9f28d1d1e78dc64030cbd8fdb2c5abdab3f13d6ccccd187e71e989f8c486929efcdbf2a763effa95af62db5cef95e9081b818275c69267022fda4b7fdb8c650b491a785b03d4d0186625962b6326ec3f4e176373da4dc1f83a14815adf82c6bffa7c6967d77528d0249754bb4d17656bc4a89449b16152a4a1aea7eb0054a8892f271138971507d2f3b237ba5b620f444544e4a8c2b1ab4f9168762c27478c9f776c47ee2e9ff05bfa35ed127f0cabe7cc053640bb8aa01f8359b74bf89ef43ca94c48fcd201eae39d1835957eeccd6b3a852f4e1bbfef9a469f42c764481ff8408fe5871afeeae7676b58f4202199aad50a596626dff97c8e60d750cc59da9f595ce12ce9afdce14481cb1e39994de8fe4cce07845110d6703dc59d34734e93e9e57e1c52d61f44143a2d290220a4bad5098d098ee65ea4b6757d8a9bf5485aa3d697a7826d4a285186f5da10eff707566c23c6a15033365bcb498c44487c72d96402d1834753fdbf86770239761f03e0dc8963766441da99c0813e4f1df5a1d018c8799861a396562eb24ce305ca15f4022d83ea3c56b68d9a7ceac4742ec0ce50f4d36273df26005ec2b051fa071b319be2d8a5ed26eb75bc1ea83761b8454db234d15d84d6706cd178981c1f156e6d28f774aee3e9a4fade022e71b52b50aa532b8bc7fe464f22d6eb169c69671875d614e987658820c2f584a4fea3008afdcbb646dba3d69020fbf503f121be3480344db23efdda0d255aa058c3ff66abd3a5fe35db977521608bba7eddae72ae801f4fbb12a1de4133039e046ceb8db87e465e5ede1d79a08c857d59076d7ff858942c31e15cbbdae6fc15c3f9545a0825d6ff8583c0aba8a7d143d27b93f6caefb98c0d83bd8715abcab2a49087f55a9daf9090eacdf45be08ad80b5df5070e1719f68c4cc8f8711083f0f7823a09ec092f22df95fe9e95114fdf82a3f6eed0bfc9c0aa65222609442776154a474dbc9e662cd5dce66846572e52417ee5d7eb59287d07ef60a9537fe1f85c7fa74fe84dea0da235ac7574335e6649b54a6bd33397df4bf4a7976c4ab868aa702766d2bc8d2c82c2d1c2653fc8428b8d1e61852ac185a3a0b416dbcf8eb54c44967ff43c44f2b32c6d4a9dbf2c2f3a587b430aef50f0375cdb4c1b319ac9aca486d9bb321141b065f52f7b6decaf1985531ca7bbc3772a561eb1efb8a6297075920bc432131a5b211bf25e35fa31e12833bc77a9de14c7", + }, + { + "6c0056937faf1023032df1e2bfacbbc58bb022eba25ffa020d4eb26f0caf0678af5d0b2f0c1b520f4843f107f0adcc7b5dee66ff4d61025bafb4cabb64d133132e3e423a599549a1d83aa8c8e774444462aa44b00b460bbafad5755ea6a872d4e6b40e3f4957e0229288ea79fc2ebe5fd9020fe4481a9f42ef14a196bd136aa3c779e311d0c333624c1ddc484c9aa7259cb609e4d0a826c0bdc7567adac01da23900b30ac4e66c100348584fe200747eb67e6287268947e3509d5d2b5d7bcd977b80a13f660d4f6956a8b938a82db75eab19e5d2a22cb5f3c9131e278eebbe096b5f49d16c983ac240f3fbe821b247cccb2c9e6e59546122677f49f56a07fed56647a6d3e0e09520d49009f54250c10e7c607cd5b4ddf81b5c4110c6490e9baf56418236211856f5a85feaebafacf92c0c7501c052f9dbae3beb7484f90f334f50b68571cedc67763b5161ebfd5a1709cf18c92112a4cf4d8f43d1895204d8a2ba5e14883a7bff75cc6060cabb77d38a909daca2417befd1bfc05a11c432b47f90c807ca4306400f67a0d92218adaca84a584a8bd4395c93f9b6a4bde9583c79204444634a8473b1244cd33cf980e443d82ecfac672b3f60e2e41ecb3c5a445d9e88c0e90c339a31806e6d79ee52bdc6808c73e8b7b24899966664d3c1a9305f31f0483e24e36fa451dc1d3f2eda05af6678971e2bdfb7c1461c9407c5c466f6b5af34d992a37de3809a22ae75275ddba0f4f9cbd4b18c1acd212192e587889a36bd73c860f0abe08bcd8f00f5ecdb95e1d560b586eccf530df0e5f3776d8dae2a01768bf1226b7ceffa7ce4e75879c82dd97db3c64c06d33cebc6b35854618355d80e46fa79c3e9743fce5b974723c421a077e7ec7dba286881dbc1d53d442a1552700fcb33f83f73c69a0a0ebdcf2f5d461649c4d0712c514ded268a31509f83c1ae4ff4a68e676d29727be641aa4487c08d4b90ff78e24c6508d69759751a1a23690ec9f8763621e8b107295b4bb01bd9fcacd8748e24d996fa70ef6f8b0992f4185bec8e920d7643159f9f604fba394b6611bff435998b2f097a9e948430899c8c752a1e83a061983f00f88ebb32da214399167932a1a83c1b47d09f77593b03cf6521520583ea4483e2d33e14ad60584676d1791779b532c085d238df0d3bae735d0078e0eabd63cc90a2e13d023983780afc8f83b1c14437937c16a1b7c41414c48cf4ae49587ad9fa5b16fc949a749e96032248c4667f58e295f999590dae1d99a2cbe3fa45bcf4a1d3f0356d64d40367f64b2c5cca843e5f7dd7b88a85d52328a00622e6c317879607bc036c9006d38652ffe21c83207c00f8348a7d0aaea5aab4c89077df170de6d41052641726eb6925cd85a9ee01a9e636346340e209ea96d17b0eb0921b96662ce9cb430fb6ac348331dd7133875769bbbba99dc49333950e4145a15ddb0789c4d2ccd38878080ca9e57ddc6cd5452790eec45482f8e990392e319609391fce0beba19463a9a00d8f1de9fbf22f23821de7d69fdfbf3019ed61aff79acfc5a6ba663a1e10da2b9ff7149aea43bd6c61a543008402309df0924de72c1cacd2d6120cf422e61fc1de345cc8771934d8be77d9437a09e06a9b2d51c849fd9a200fa714328d34f36b684f33df6968b827df916a599a4bc3367814fec21198e2213ff653cd2a463892966c72ffd42a26b3bb91", + "0d55dcd08b54e58916f622f81761ef6a2e19b167ac47d3", + "e42e1d6d44138f3d2bf12c951f454686f18d590fd30057405b5a3dc2b317fa97", + "1e46a7486c5a03fd6758d938", + "fd3c1fac10cc82e49235fd57f5aea0ee7a7bd6d539b138d4b3fb623aee591615c1a61228ef9673113a3a90a3687a12d4c6367d5f7bc67d422fdc4106455084d79c2c42c5e86368dd164bcbce7925bfffe7d96c13a2f49aac8e9d1ada3554e3fdc21aab00455a0f33b0c1fdea91b3588e7ad301bfccf9940027332fbdf966463491f7a33c093e0a13831ea9d2183294f89f414cf7b5876af04fa68d594430194429df74fa5915394427259e832bc545c13400aef6cf16620d48280798a6e49773c9316d79fa1dc758e54cde2e2cdb856092d83f4e9b698385cb976fd6cc2538abe055273a5b34a784182ea5e7d3ac9019a05de5e5afe4308a7ed2d363cd50ed6a52df1c616e4a82f607ced768445d13ae4884f2ae1f9fd8313924e8a1a8a23905c92eb231f638dfa6f4cb27bbb9844e05afbbe2ca4d1a3b3a5b371bf33c9ab6f82a7387d61cf8bf662097624145a983839b0cb9f4bd07556800b4054fb3d0bac94f44bcc9b4ac49c39f5571fac4e02ff09f08b3ed5add4bf8bba934e9feb773c0590b45c45fa036382f3fe9782ad19107d4630321e414b7b442b64f18fdd5219039e5740f34b3ce8925d1afe8a39e35ce8db086060bab63b9720700499f82db19a62897c6d845389461260303f9cf2bc7235a898b4620c2191ef05604a5c8c783d58009533a86b27c12b0772635d34ac53993ccf174c9087073e5e69b26c0c3d9f768507ac4d4e2af847b65e3a6e1b7a6dafb0aefc190871cdae6c60f0b1d6137c351d4cb211870791cf4cb8af2ea446f6401eb9ec8a5bcebccce898d1dfb13454df6b35b81ed6d7637e6e261e004080c60944f3a08e8e5fc7e2e4939e7c2607c8cf07d1d10883ba3ad43e2611826f245df571857ae0a7a867df9659f2082c19f94ce400132e48c7f8de2b102c7f83ba5cd1e785597a0ba0d73bb81bba0c00300d4bcd6ec25fb73105a46122873bfa729c0979d8d314ab7ea52391aabab513dbfd1cf01c2990c0a3612f4511c2bcf0f5a07e659a881a7f99c3f1fc4a46e66904427fe26a4a80a904c047d090c861a075c0ae4e29bfbc18b9620aaa42237f4c6fa76ee7491ee638ab5f1cf0b440759828e1ec519679efc776eb1468999a00f667e87199ad6891e98b95fb682e02517b024a6bb803ed23c944010cb7bad0733eccc12d6ab6030c6e88d510ce92e2f98fdcfaa1e37e41fbfb4e99589c0e8efbefd40473db42b3a73b57b22a2f8c9bdaab16831f1b117dd83a77dd01ee8d0c2e92203adb670f4fd65e618823ad196220d70e014c1aafd8863797c61c16382c2600062683ed3a180c70891717c52da15191b02f25d1715ebf33a5e6037092421989c942082f4b836423cc3e976c9bcda185de36f06265dfc250a27d2de0bc48c73b3bff704f3b386f962522f572108458bdb283c6ab3fd33b3ac13a406268fd5d97e17db9c0f780b4b2a8f761d15a4d8b3a0cd73357ecf4d26a6492ee069f19325823ef50bcb2f73326719a57b67eeef506fe8915a1b1ba1a637592268257b91e9c7c5d33cdd947967efc1952005d82ccef9a3ad7ef8ffbb6b658983d64c51242ba53f8f8963245b87a25aa9324c527e53f8c11d55f30aab598401589acd13f090541b3b057b162190f27910718b02a6b8ddbb8ca6cf40bf0d2848f4b76341bd5e78f476862bcdbe2d1bac84c0566fb45b21388221ecd8483d99fe603646b1a9f38a49230cf4dbe5d7883d73eece01bf", + }, + { + "04892b94c65685f2eba438322b29bf8439938590d3e0eb10a29e279d356cb439f6dfcdbc3552af21f7e753221012a649a52bda780bc589ae63b04b981dffd113df9fcf14f17e35e865880a769bb1bf40dc99b9e85e4296c1f2e1590fe02b22bfcaf2d4bb7009a4d692ae4c2d5f0b6d3ca526240368bac55b9b1e6a7b498d3b137f0fcfef1873c5aa2111d7811d45bdc26be1c5d49b8a2f36a999b1f226ec06a5fbd59514485abe696c96ea89dba74b4688101a239b495944e30b3609f73caff3114407599ec5c30a5bad933655de7dddef97018ae15acec46504cd5d417c5052c057ac5f1c6f69781cfdae71db2b4fcac35054a4aa22681027356d68b2bdba721466d130d53ba8f23857631382b2de450232e9ad5551bd7c872ae439e79eabfb057d2bdab8d4ccf02b3003ade2e1f3e514dc92692e4fe5b579c9ee6067995b6c168647ce5a13be8543c23326a3260bb7029d2030ec05e565ced3c5366d20a283a6e95201fd108640d2b96676df712de20e4e12fa53f85f22cb24583844fabcebe40eece11e7221f12c88670bf994ed08e2000236f86258c386b0fccbaab8b68ec6a26fe41491d540193c4c12d1391ab3391de9317f41f505f1f1d09ca9862a6f289a533d2b297d4465c956360371ea3c8ed36e0d1563120654e3a2fd69cd6c9267bfcf92e84cd64e162c84199d6e552b42c33857264b5d7a2e007797cde32934a3f8c68b459cd95bc85e7466ccc9910e8dca65b315c32e43c3a5da908904c42cfc8ab74126919ceeef1054bbdae6ca67b02f1ac5f24808b5eee24577e609a3e3935a24b9ebc1a8dad1fc96abe26012928f2d5782755f3763427dda28867d0b1ad830d3c3f17b9ec278346e5a9480ed23ad44a523a4dd86e65a610ee0de1afab64ace7a3b4918fdc14c6b1ce0ec0903994da9bcf18643d7e0a4e6c08200bb394a89b385d2cb829417eeb0f7dab9fa7306a330f82973cf0917b5ca99b585d2ff0e8584e050077467f5245ecfdd5942e4fc72dc26e5ab2ffc61f996167e68168cee9a6d3ea1e1a696060465e35da8c75a1aa380004faffcb0a992c627fbdcb4e97721271802cdaf08d214ec2fbcb389d75709d7a6b9d35662661c8961f93d4a705e7188613f3769114c55400809cadf60d3b6068c8a5ceef078785171b59be1140c6a754ba1de5ced349df63d67d59d3a8ca3c716ffb506772d57e9e3f2caf7fe346c4ad64aa6c37e43b9bbaa8f58e51bfbac31fa6137728f8e5b728025697e5ad5c8301f6ff39eb2ad595d3cb24257adee88a84fbf1ade4d7550cd9ab94bf48e1424ae83184c35c5a5920157d45805c2e0ad129fc7f0ec3c41b9d6fa04cb8918ef379b0783d1cc2863cd80382585fa05320ca4f9fd90353e490b384ed6c166c6f802cd7bd39aa43667246e8da96992db7537d472c709b01114e95febaac5b1a3c77e1e9a18c2d180e63f0d8fa89f6a1ed63e909e4741af5c2a0e47d4d3f8779b7696358f58060f3f461cceeebb390c92779d30bfdedf1b08ed62dcc05a545bd0ea915f42976e81dd8a50cc4689d8d8007508bf53e7da5bd43c3894968cf0677681c6b818353af6bf8ac205139add1310e5d363ccadbfa0eaf735808325e7f9a6aeb1bee3ebb4a27576a88811859c216b6f84371c43d8063a0d87bd326eb6d81c6896ff534ba2c9c14a51d2cfedf33a5c787279bb4a7ff65706b389756a6191d2f791254233ee047d40d64c2dca878a42f903fd4382f39a89a723fe11848fe37b2008be53f7c2d037981d6462a4eea49df1a2e074957afd3c9dfb4d218a309cab395afe301ccf", + "67b5eccb1790babc2dab5e0d1ff3871c3024177d45a2ae", + "259603e1c3af3fd0ce3257eb627b02e0c0a48ea2f175de3d8c36570a445e5369", + "e14de73c4b17581a7e0d0649", + "33522e67ef932da5fa8abe628b51f3abd5049951dbc982ea95b7769652d4830c588fa45e3fcff094c8602b9008d7b2f9bf6c1c4a8cfb515401c7c44a7ec42ccb967722a710199e121a41160b1ec581507e9bd2e2e506b10c4b5a8d6977435aa08e27504957cd49e756e1574c4ccbbdde937de35128b7ee3455d2e665c596c2e97c253c94e405f85eb5de84874c099b4a97eb8f492d28f2e4bc64b228dd5984e76ca08376d7f1355ba8e0fa60fca96635075417d8b436278e0fb91e3bfc7d61ca8c7407086933c061b2d318f46f352099e1d317d6c44098539d1d2c1b7894db668e7a82ff991864fae236570cc420a4229883f1e2242d05aa07e175bc6abe11cc643cf1786a4456a2de8c066fb1a70fe387f149ffbe8cca7b110e256fd0c09b1d3bd7381cfa82fa700c8db1e79809ccf75ea52d0b349264557046e8703a191ddaace00ccfc513db5e78810eaac0a99d7bb1a5725e722d4e595216a0e12f3a7aab2e623ea9e1dad06169914bcd51b643016fea7dc3f2743b1e65877f1fd5581bee5ef206d86494a587ec8462a170746fcedb2c9f99090674ee687382711b4610ddac599732453dc063518aa36f5b4129098fb9fddc02eb8f8cfc2fdf0d904ef4d6d06014f977b29d0e9aab4044ce9c662a18b1a8db1ceea97854e90704430fe9b1046b221b27ac79054fcc68c3abd6fab7da66e255ff0cbd0506c852e961e619615c944cd9a05c25abb63742f5da7bd9939feb0f2f2208c8ce82f551a9d4d70e935dad018e3e4e6998e39670221601c3e34716ba75eb4e2fdf53c4d471c444330514986de45cf44d77f793c17e36a271fc65e6bf08943aef4c66547dc310c7a430e3fe7a54898de48f69f282f52bbdc4daabdb325cec7ab66fce1aea4e2fd932dc1a316c821f5220ea437447feae2fa478adade7cd515a27d8c132d0299b3ca1bc8516c9d9e7c65c38c238c69f03e104eb42a29cacc8d79b808ea6fb233a5056201e3697f81a2d49ccd8b8efd1ab0fd407c16a210767d1d3ca798ee53a4bbf1ce5090d321b1a64fc2c5f013c23829f5b0d2737936ca71595a1d02711c8a7b0e74654e5d76376ae26977dd49c68e3c0a7b36e047d44be42d732c31f681bd7b1b4b339f004ecd847960377acd005debfab13d0fb88355025877630aff753a7cfddf6851e8bcc8ec37b8f9149830f47e6b601098b2ba19a4c0808e31e8927b2525cb82bfddc9b4bcba2b46bbe768ee278fb89010243d16f9679f5ba4f13cfe76b5beb16c7b28daf99b0873098115c2233ee3402ac0f6c899a2cfcc83b2ccc06676999ad48017c4ace507080a26501993327ebdcbd1e2eaaaa99f4998b716cd9e36eb26b4573a03fd1d18047198fdf675ef4f979864ac85d230a011c69d8b6c45e9efbdc2a03f195c9731b4cefa60208ba845c0978e73d082bf6d6a513b93dc805a4f5973f4158f60a200167ca88704a15ac5ab1f38ed455a426f7c6a96b6bfea2ebc1ae1247cfe5ff29ee81bdbcb53b03b89568bae9a6f311d2b20e31c2d91bd18fd93a37be266d0de8015d52e325f78356dea0b77cc76f28e0f06e4ec705d1328340013a77b0b6196f44b7712fff4ae0ac7f6afab9456a95012b7c6d387285487476d189977e28f6c9d1a3f736320d61302c2d627d5a7ac8cde4988056b55eeba27efe7e640f94c115762ad5849423ae138c76f15b47bd2a2bde2c492489b7980aaf1c4e32a155f858d7be4fcd0f8a18e7b5d97c5a08d7885d6d56222ef49542c7f80498a14a8eed1c092543aac3439966d5b5d0cb9e602f4fd795c09d652b64f9ab67e38f48c88d18e30a9774f37e9c77b7a94cc7310d", + }, + { + "4ab8068988d4bbe0bf1e5bc2fe1c668cbe58019c958dd2ec97164aea7f3f41c9f747527f1c0e5fdb2cbb9d2ad704b6955cb731f14403dddb1a28c5996707635e4eb5dd6ac33d46eff8e319cfe7cf6443869534ca9812a5b23a6b4ca172afffc064dc2b28197117115431e03c00447f87d9b45172c6f724006270a1d41fa094847cbfac9630c3a785f488c1f5cc407ca6f4cd18bac43cba26ad5bfaccfb8f50784efc0e7fc0b504b43dc5a90a0525b0faf3c8b4b7046fdeb1cad87ec667ce3eb6cb4c358b01393f3ffee949030ef9fd01c1b2b9c5219777eb6ff5b1d7c3ef8d8e3bc2193dfb597cf942c5fc50befa527fac0b44cda2bbb811b06ae87459750295371cd232754e2bb7132807d1225950ce64949b0650531800bd0074177677acad937ee008cc0bbfdf33c6b0552000238494be8be412a3e5cfa359e619d092c76310a76bdcb22abbe6f16b3b116b5f95001d20e42fc3c9ff6723e580f378475788eec265a1ed2087de8cc2eff72184f73fa5dc6e68a56dcfc85350bccb97135386d5b827c2d9aea065708f5c921454d1b9303f21d5adf19e00415acbd86d1e5e42d78505b033a515a435713649c50702f54623cbf31469f355c3be2e30dd8c72b4127764451d79e952ea1f9bb0269da56dc07060d5d9542a9c1258ccefe53fa3f7b6073cd38026256b45c01b6c5dc0d91e3139f30a8d1da7a076738f5bb23352693a8e3cbbb46226fa22416680013f9e3278913d06aee4a62457357f0a68d173a360af5e1411840e34c574b4c6b352f92ce33632911ad8b6710d357b7607ee19679e777baffb8ae3c0fe9786b2e97fdeccb5105ecfe81441f549bc6b50ab84b749fb33f8f6bddcb6bb733d6d5dbc4b29725b8741439b8239e53fa435ea29ed3324202b1bdd07d1987b0e06d8cb51013dad897ef02401290940ce3f2af72c5d1b4c8836299008c10b16c7e3e119e41ec66d9db6929ee09bdeaeda08a50665c052edf77b7dff3d8815046bf71d5015e3bdb29a4f507aeb2e28c536cdcc9b8d1e89849a0683d78f99dbfa90f94aa5dc08587657a8f042d718080de5d4a973f232f78c387b63c7143fc2a4380c491414a18b6c4a7bae2194b62e798ad7ec7d09e409425f6d0973accb17e4d860f8ec0283584cff076d93bd9b0c4873f9c57cddcebe3c3bc8afe793c6cb6b26c4582847b07446b7e1d9757de6bdf0df826cbc502bf88cf3a773866d3ff293034abc4afa3091b2126a278f50e47f2f66ebebb616e342098ab690f7f5828bf8cc4742c677d378893e9f188e8397bee983a9a0998de2a31798330f8db59a8581e1c847589bc0e2d95ffa68e39226cc15cf6cae5c4f5174e7848375391dfabafec202565ec2383721339f04c5c5d1da953d88f18cda65745ee8e99805e35203a6545a0416923b38c5db3c8aa00d64354bed27d7c78c4b257534bd7a18107ebe64d8c27b6afdb330d8efba79fd1fae480cd51fd3626bf8d79fb651b7c6cf752aa737a5123558420d48fc86451b358d270aacfa6c17f343b7a9956e6f64e4990c1b3f1e5097605edf5ce4247819b19f245e9a90758dd42c36699ba5cd7f3ed99a7df7eb155749f4b42d192c47cacb6b2865fb9ef2cfca283865cd06e40cdf7f89d76a9e2eb393e2e0ac0e2776da929f3f8e3d325d075a966d289c51347bd0bd523a5c81edef63ce9b72f5114c88b08b16edbd73f518096240a5b37421843173be8df4ac7c587a17ca6f2916f7d9a10dc75f81bc778a1eb730d12b51555cc414eab9c066113a7edba9a7f1a18092ae47f12f0368ba211feaf34a3b48a7ff5c91b81cf7c95675a4001c95a19d284fe4197fe8823909a123fcec5e45935da12416be1bdf14918414ad19b54a41052f5b8417ddbd207ee01d6a3e62fd9b0321b1c13d91d6ce15ea7b2ea0c670a5f5cb290ca8e62c26c6499104ab8e9fafb05170ede246bbf7313625d1fc9576f1609ffd08852a2f4b73c04f1f4eeecefe3f3eeb2185a618b6dd3e87d9d3fdcb349cc83c21f26b6c662bbb857aa95378e991640a160a23cce76153c134508c68ec54a5", + "0d471079ad3c3432b6de852ec71692d12d9df4f984554d458a9dd1f28a2697976da8111ae4454c9a23d1c8eae75bbc14f8b00e7c065bc290f8938282b91a1a26c22b40a6708c40945d087e45633a595beb67d8f1c29a81", + "f3dac58738ce057d3140d68d2b3e651c00ff9dbb2ca0f913be50219dd36f23c6", + "bb2d033de71d570ddf824e85", + "238c4e6be84bfb151557327095c88f6dc2889bce2d6f0329e0c42a5cd7554ab16c8b5a4db26eab30f519c24766b1085e11d40823053ca77adfe2af387b4dcde12bc38502229510606ff086265f45b1087375dc4a022eb0b641101c74ad566ab6f230133b7aa61861aa8202b67beddc30dda506691a42032357010d45adc7ee633b536a2fefb3b2143837bb46db04f66a6e2bc628d6041b3d306ff78e96205ab66847036efa1fb6e6a387cf8d5a105738be7163df9da0db48e3d8fd6a786f0f887968e180ad6888e110fb3d7919c42a7f8c92491d795c813f30ea645fafcddf877f5035f133f864fd0ba1415b3d698f2349ebe03d9e76610355e7fc23221c5c72b1b2628a40b14badf93288fc4abeaff5306d274f21938650ab236a39496d3f8a6e9086eac058e365d4335b51eafac813f9175bb7bebb75605909ec3fde6515694e119f7b6e96aa1d6d6454c3a7dddeacc83bf0c1f5f6c2a9dd2f460f3e5b074a33b8d7904e6988ae43a22a87f0933f812e45c4c518bf83e606bad4c3c55422ab2207e9d3cfcbc5819049f55e35b9663273d9d3a6f8a897fa38b0dca77eb6c344290cc007b68d913187f2cd480a40262623a4e95d90d5701ac2b9d858d70a27f0672f919c2ded1fb89134ac9a8ba6ac62931c832372abb70e811dc50cce264ece65e87338231f18ac007c5f68f3b1c5904ffbb2e1dc361d53914917770d66afe28c547d8cd5896d892cbdadc34cd6af348c93bdb8b072f38b085361e62ded7a38b4368824c759ec7d2cf4caddb9191e5deedc8b8388bc4ba2c0672321bcda3a7343c9ea71ef03750912f35624d81da5fa8a6ee676c4efd99d0c7258b844ded7b35d8c8233a316b508d79c7c0b3edabad5db9543615179b1c111bfd78b79327ac5b4155336d670baa592d441c810cb1b7c07f3d35473a45b57e780b7d997782aeecfc0363976fb608d6967844ed00b63ba75996054d090aeb605c195b1ff86f9d9ab5892d27632cbb59c06b3ccd69d33ed5dea9398f00b7c6404fcfe2fcb5924e4cb75cbcae0a1b084ea8b15eaa5847431e9ab70e4afe15b4c82239f6165e243e3b76d6c91d23b16edecad8bcb16898641f8e323671452034a8ec9b42b29cec0db210bad0444f1c5bf3505cc41d514d5a270d556f0a34333bd06cd6509ba253a6ba7a6db8f1a60c99f0c3d566a038a72f1271a178cc3ff890b0df1e7438c0c1a12d9873643e2d7bfeb92379545de50834abe2a345faf7ca49beeab87ee516dd8598b71196b8cdb15e7200cb5bd814338babd74c565faaf33d9a8ed4209b417345a1ae611880ea22ab2e894d5d14a28fe3835d3b2718125f0e6daabd85327455646290ceab89e579ed5e1d72a0172e4a6d8da70290b5022c941f3866f96cc4218de5d2622d13af6dab15760a1ec5d10918267f9585284058aba611ba07b1d5711cef505869831699bedc2b190fe1d578814065c91d87a8c8dc9b0d4dae0c80cd241f0bda3a6d5e714c894b7a48b1e5eed4555f103eb03c9db30efcb855df422d7451a6d70f28174c7ebff536dd2cd2891f6c3f264d632ca924c4e0d84b37cf8e06e6f2e29efac6cf008cc27f062441278dbc9f09cf44987e0e9ca088a48437b0b89efb9cf00d3d0c5fb449fd4b64e21dc48cf300c2d80a502cb583219f1881e78e647783d91dd2f3b389a1594eefd8ea07d4786f983d13e33cf7a34e4c9a0ec4b791f1666a4eef4e63bde7a241f49b5cf615888bd8130743bc8a6d502bfc73ab64d1184ead9a611832b7e24483a1a0fc475d9ff6166b86a18a3dc96910ff182cf326456c4461ce8acb3467f801890eaf1ce0b24791da9c650876e718c0bf43c475174f9712dd4a228695e8f8b2b23fc4a06358b4a6a8e1afa87a0280c3e098f218f7a6d6bd716f8c105a7eb799ba0220837fa5a96c8a22a826a6f7ea9d7216a24acbc7b0133210cc17c8190507badb421bc54997ff9340cdc1ee415126ac46a4fec9fee12d40f06300f7e397b228250f36d6f0d2ddad5fe1898ea690e4c7cc3a116a70bfaf6d2dc996753fffae40ba5280b8356b7ab4ffbc914ec74eaa070581fdd1d9e5aa2", + }, + { + "4d81b652fee892d575bd13dad913d976cf0517c819d5183a72eba995b1f27efe743451721ce34791a15a6b7a6e44f13d4a080563dd1d9d4f0946e5ba3863b9ac970a1fb4ed66458ec1b1092ff5fa6c3f0271a2df8e3f2e97851352be760b6a0e1589c202f00791b1b89ae0ae944ced96bd90754bcfa3e355b735132d407d3b5507fd57f705e8a8bd82886b16d459ac91e921dcb8c5bf0d7cf420a9349ee589a5e2e19ce7c944a54ccc1062a0690f3152300d0bf5cd1871c1391bf6d7007f7ce26018ca2a5c6f76287fd8c8e9e7f93b1806460dd35f7f95989a8b6f9a0aeb7c6b0346955fb50b8735e34f1ecb4859e34ea0f022ff6fb797094206a34cf120b7f4664c531c57da513b296f0671c8e9bf68d9e1674998fe52da04f627f516dee97c2b3c988216e9bd3f58c3b021ac70898651f1cfeaef21c4f417ebe92dcad3aaf50f4277262c356584f816a5a5862f2bd720fac10f1b86033371ed603bc00a30cf4da8f579dd5bfdd571a37af7d2a5cef29f9001bb1605ee87f24ec3b259f381a69b771f78d21c4e43bfc83a916e08830d9885c8ae8ab6367c05f92e5eecaf0488262300f83f4e3bff177590857e149216995bc52311fb9f16f4cd74e07c7868a39b699bdbb7d7dace4c6a53ca7ee6e11741a63a52a1d96995a6dd752356dec6f14761ccfe38a6cd8511204f8f0630a747d6e19a77bb030c61e0828436604a28a7acf4a5e49b7269ac93b93b99e9e2e1c0c47b377f7e44e05ec6659526afbdcd5bb172404ce5a9f8786234114c16f20cda6d4359eb873a4a4d9fdf734e9c40aa4db3ea9a98939210f6c62142dd144eb78191116d194bb766ea96da38321ae27fcdcc196560ac75567297984fabe6072c771899906350f74de6d18518eb6898b934b11e945d94ead02b821fd6682602e03e9c70a1ec67eed33874eb24dc83dd1035fba5928f8f62ba1282907aa8935ae72fcb881b3277ee6bebda8fc75d6cd792677c25f70c87b11e094298b2d5f39904be211ff0980e5b83e8ea4a455622d8be9efdb5aa8466c88ea861407d54d98112faa10293af5e16974861dc9f83b45d21b112cc367894c421f5049e49dd205bd7c15e6a70bc810704e2e3a3659800864912527f8be743acdc474a26246a81fc2bdf669b9be7a2a0c986432e1e44b5675607e7e1ee2a8dcb72d8f1964272926e52f909ede0ac8daa32d1d850158db76b959e4d83c9da4e3bb23fd1f5b26463045d6cf13d187fe74a50c09a654d52d0e2f01d66b9f8b4f4aaf4c69fa62a02aa876f9bc4871aacd26a6c6ccfb9bea09cafbd0268b5b65d60aa23ff504d02fad4719698f8b044ca1bb037ea6af58a06a448080dfdbe6a5d698d5db9da5fb4aed04a46c8fa8b93153bca00a5bf8aab64d2b371d072db2ddb688a9442e948f0b99236828dc115a2fddfa2a29e2d4e02ff0173cf734efd4eb687e3f8712be82abe1fac4be0c1eddda090803fbdce41bccfb58c43038991ba1074b281a09bac5eba58a99a1a9678ba26f8f9e3c63ba095f02cd8f3b56aadc5de60477efbf3dcb54b854f651cc72042bf19268554c61b44f2f338a75de56c3c45b3ba40a697f5f21c4557380c777bcc91a151e5676c2a59606200bd476cf98d20b4cdc64bc3b8670810a014871be018bc32fe239e287cfe8a7cbcd1e8b55e08692ccfb4ef871cf797bc0b1fd7ec37931e35b6bc5d32bbe7ae77b9962c179f96436e4a32f566298d2235acf921e38c3f1942fb7674b65e222d17b95a2e58f072c63aa4bba1ce48c303f4bd24d84963f18c5e670015c52342dcdc9c0b348c7dfac721b568effe2bf2f2e816ca3279bbbed823beede8e12fc5bdccd0f1584deb1f6ea1875e9fb350919b675ccde0178bb83a4aa5232bd5e8e9a1b8daf905c6197367a0d106532297ef89f3bc690b48224592c768bd9c50a63d0881370d475081aef052b444744b33fd3fef674a37898fc950f887ed482d2a51ae615ef5b1dfa3a23257e6a6a319a4e2080b2c4094bb09e4b390d1fcbefc4d6c5dab620f8b05b1bd5d976300b007e2b8120ef8a6c9028b7d925c795058c6bdb6711fc5fc2476b9810d1d81bd24637537716edd3b7068b802c531531df710d3682f9865530e1ed51b3b56d860ba4e972bbc74662cdd1e2ea24f81bf469193afc02b14143a32e9556e3f2ecef97c65", + "2538d98b64b6aa9258f9141840a5abef66d6037a10356366a3a294719c10d6c148b04cac66f63ebff052d730f8821f5e5822d869573bcffbdd636c7973433abbf38767597da5186df8ef9df071bc4ecade2633366102313e659db8d8e0f293d379fa2df79f456497", + "a5049b0aa153e282457555bf6f82b60fc81aa6fd1c2ea3db031478ffb74b5b5d", + "350287a6bed5709dfba3d35c", + "849670914f5fe318eb01e8849e536374ec11e813acdbbe6a5e82a506f6aef4f916a3a7fb2e41db3adf990175e21f2386d1805af9bbc32a6ac156b13b1a9505958f68599019c4b7297314229c467114754277b10e9f49a4d12837ef24184629c8902ebe2a23f740dc826b01f8963d47100bf617b314835e436104eb207fa9a1079b8feba06d9369b9aa8222d38d87096b73678bc5db9a1add59394530e678b6ec93a80efc6e8320f2909e3e891306d69b016ade0d30cde64c2c903b401f9d01a29b5cb8619dc68ad6c21900b365a6b657f7d9ca4c145fe598a94eeea741e20a9329996b17aba5d7115c93623f2f5d6927068d0f190b49eb885429d771bbbb3980e9293e4d664a71c3cb629d869dc97e58fc3d328331b11df19a38d61e1705ec4c3d779168abe049e9d675337ff658e00d2d610c8f227d1341d1c41f1c01d8b5d83c4b1b30ae4318da9822f46402ee8cd5cfe9f3f22d90a5ec2d0aaa0baa85e10f5295cc6005c5a0887287b0c867a23da1a4c2196f91fe0bd4f0db1ab324c26fe6088d7583f3cd052b7f6fca38e8b21f98fd07fe78b7657da1f586f1fbd3d2b4079e20f21dccc0d269d53a29deb7c7fb63cc291d1d2c50ff163e08ce612310d3bd622f2416e193078ce4e1463f8a3490578af96ca98e665468281f1af9117a2ed23367df19b570885de9d6594f09aaba4090bdd1079720b08d54311793c97bbe14433b031c865b059cb4f75db74779b82c4f83eb4bd829c62eab995027b548063d7cab7d1a6f9642da6cf7181c0ac71594b97fc2c84b1768f81eb287091f63c76623c61e7ba90c922c74d46b9ae5d8094d9752bc1e8020a82601c356a201e0473d540053c707a88f4baad37826152dd245c4cee6b0019583c61e4327fdf6bdcae53584cdba8a503b835bfb5df9d649705fcc1f09376eec96c3da1e105accc1cbc21d90f527041a9beb85f8cbb1ee8db798838bb45374b741618f83b5d0801a3af2f640abdbe74ec3dc15d6711b4c1480aa8d6084defba82ed221ba359c9744705c4feee0955c27ef468cbb816694516f73fb541e0ad4ccf99ec8b67ef090505d1f7c4c3a8ed7e291c820261f12d92bbc6609da6c275349819848c9112826674f243acb9a29ab73f17c8f8af12c7437c11972c824f00db7ad284e51b9b508a925f0664bb259b4443d56463bffc9e5d845c9b9f79b24c1f457088fadd281f48238866e0b92d6253638eb188bbaa8bf6a81d2b1087904974752697cffb00b4ba05e5b7b842a3d2c0a743e4bd691625788fbe9df14600643b1d161bb2916176b6ee40aee38dbb594ec2735d41369ed3a0c6dd9073f1eb51d1b77eb9a967b53670a8ed755f3b2b73a6cb50a9e1ea7549346646dbe4b801c8aa642779d8761b6c2d2e1a9995e758ab92f07c4eb4a23c042171a4b354f434ced5f6d9ccd26cd6c2506e5023dc076ced15566fdabc7364f4a8594cd6ec404e1a9470f52a83052390e4f7789ade9179b069d9f84ca2c7ac9eea51035db817845aded7405bee90cbe92364c8c7cf8a366cbebd7a972438f2a9881395a8610a2cd0c06c46b60cdae5b1f473f4fd6ec48479cf35101656f05485198a470cd36af22838e7ba3e28863cd8ba7bbba7e3c2625c1106a6be44c9e3d9b9938679b26f0713c62c3757a2dc8b2d9eed5e652220a7711cd220bc91a9afd7c940dd8be71616ebb8b2cb0686dfa161c6ef56994a3cafaec5e79bd0a2531fd1c1a42771acb101a38988bcba51ad85bffcd8c67aebec5b37d526b29f7b9d31388e1e7ad7154f8e65516f0d80a30b88c2b868be2541d19ea1d2bcbadd30e2fbb1b4678bfef7f200e0f8309ac0701000c52ebbcd6fa00cb85c8d3ea9c5aceeb3adcf3773cfb3bfc9ac764d031d7c63ab888e9b03eb9fa74554dab4719d426d0875a508c8c86b22cabfeeb70b0f1461db4e5f639d2a2d28a089dbcc48e3f34394ff1acb887b89f75d3236c8143bb9b06273c3878744340ea1858a9f383f8bbdc259250e23a3c3992bf8b7ca7e1a66913547710402bb538a8866772d11cf4214060ed091d403e1c9ca3af75859259f88656a1cfecfdb49d57c193e60a2223627c681a2fbc7390140aeddc19df035a5207adde4f5736bc542bfdc943ae8b094f4a8701618688fadc2284fb423f602c41ad8ee11e5d9fdfa67fb7dc7d4dce7847d4875b3af667168ebb6082f6911c95", + }, + { + "67f0494a728fbfc84e2f4a043e121ee40f3b12b31616c78e157ed970db28674318b08d8b3f4c538d7b9d91b9b0b09ebfebb07201c6398fdbb8684c9390b3d6a8636333a3b086302b24c2e5d47283935d33065efa3fedd5f755218be5d4618d38c5c1db75470ba06bcd853f3f08d39c3cd9fa3618e70b103c2d9b2101fcaf39c1701436b720d723ed5c622d6535c9a10ec4d727abe237e80fd20911ceb84a90285fc6e07f9d036cfa65995f9b6300a927d7d0d2b907bac9d9c4daa87c2438a583fe85029c886f96ed08f5886bf53292cc0265850a1f4ee3e3288b604dc305d0c28ad35e1242f4ff4ae988b6deba48aabcad2fc6cd7eaab0a63510f3f915c4bb9f9719b1d90db123f639d9d4f3227eafcfad769c2b204dd2555dc54e738909122022c4f92f751d25aef6f9a1187750e825c68450e6d1223c2fe88aa27194b492b6788be6eda80b9b9f053cb77c8d9fa15324f23af5147624fc00c66e947b004bf38b31e1343c7cd341b98abe462a5f994e51d343664968624a2ed0dea9d0299d5c5a7e9097fa63d8b3ed96f917f693654766a9adb01110fa3fe0d8e9b102860d5c049df3fe00ccb2ed62ab05583e6aa0a5134d55245d4f643e274def29d3fc86d79979d599458786a8338b0071f6a01609ee6b2e4bba9289e2df780bb27491890d0b5ea650e62df819b8f98aae99a1b8870ce6d3c7785ca957d5b4094946925751f0fda1d62a9aefe3937a912c1b49b4272f87eea7e397feb84c0702929959e38a568460811e5064b1caf5dee53f920c6e19fb16fc9214b5de1cb770b510533f66d8a0e7f6f04ba8ba41869f8018abee31a6042d3919e217359988eaa9db2a10b3caf7aaba43527484d81304f0bef22165f74e9e1031b545ca3d2f74195984cc237b76ddbec85142a06446902339b1883000264031db85fb19b46f320ef3fe316f750f2d3d6070dec5b66ee8ef20701f20965f5171e44c8a99bcbca7afbbd81e30e74c6d48bc4b0d72baf562da6581fafbe14b6cc597f75e53b305036ede219ec56d0c0d29571a9c110ffeeb747fe56f6030dc26c8d3841b868a1ef56840932dad9f3bd7f75573086571f4d9f0d949510a2577d2f8fbed7e850c73ed4c071bf9a656d09dab43a610b49aeaa57333f67d586d4f50683dceee4942db9549f68eef4c5f8df8a2330857cdf2fc4025f2be7d5f0dcdc74a9cb593de91282787b716d416a3ccb8d6d40fa3c70be4ecfda26a5caf3724fad3d98db16ab6d8f26defc68392923b69664b0c2d56f01a549284b042bbd43c8faec940187f190aec08d06f9a62ab03c9f610f64c0010a0939451d5502511dfd3da1fec5a38f64640c7b6db2961def257eee9a3eff944828e9557deba68bd8e42dc7a9c1570e35537993061fa0f5351fd3cf4ec36386ec4cdc5a2882d5f16703b900c5000efa63888d69982e5ecd3e329c8cf5f003e23ce03c55631246ca15ffcadb0fc9d5634252ccda812ba7bf5e343c44244026512062a68374ed4d8add0855dcc22b30148e0cef0f2886be76bafabadf3ae1205b43c6deb8a41c338114895dd6b49deb329ada31b350e02a1bdad4eb05b61b50f9d22fa2863bd607406f552713e302467ddc78213d584b4933202438d63f99d011b97297f5589f35b7e45ccbd76f02453b7a7668c2b1a1f5d1d63eb805c8881771faaf67433eacfb22f9b6fa58b93f9423a5fcf667aeec39751ae17ad36992556431bca77059a29353598dac12bd3036633d2ccadc18f44123e5bc074f4e5ca380095af062fd83b647015259be929011cfbcdc9bc5d0dcf9b688f0f5d74da95746f447a9e1cb5028ccb2827b45129d04cf6990953a6d8ee0e67fe6bdbd8004f4744cae5607fe7ec4a0f14fe603dcead3367b6870d8e751cf57387d04b881f92cce9772d695f19b36e2db2cf6a807c9ee83225f5c09a11b50e99855921a4eced8e631af7c234aa31615c00ccdd7c6ac5ae8fba6e29cc233765a891864c7d73dae08ed1a3c27cd423d8d4efb550597afee8356c12018f496637daec83575f5e38ed2fdbafabafd38483c239d31cb4d104e93d16eacc6050033a3c86929be4ca8914a538bf540b43d7ce7daaea317bee1ab80504846554879f900d312bf2fbb406a0edc5f4f809cbc68675b0b7f09fd1a8a4d52c0929b3a8b9c1dae4b3d599b976867e6a7e8736450dabf5c49c949544386a71419324ea4ce5c4319899ca510f50d07ace57b013655b0929f79dbf3cd629ad17bdd10109b7c53a4f5f04a16e5471e823c898362df43f57ebdd1627b33fd4cafca6cc065d9140acf0454d5f99be47bc87e0f3b4d4320bbf0f21e7c261bb8d5d615963beeaa46bdbe9b83a8277813ffe6132b23564bef5", + "74dfdc364097c39ef91c01b707a522e28edb1c11529d5050ff820234e6c0295aa00591e09d547e9671804d7825705ab44b76c59d1315ed1297ef477db070d85076693013bdafa92e2ff6a654660008b176cd4e8ae23b9c792be3f7db54cf2bca385bddf50a8624397cca8ee3cb96944164e3cb461e68", + "b3b5ccd7ef49a27d2c6d13c0ae77a37abec2e27e0b2d3530cdbb7f36792a7d2c", + "c0494bb7249f864f69beab46", + "ed8d6e964bcde1df68e7f362243073941fd68ac77929c8e480c89f519f748b3dc337b1af6231632c975167a8425b174b42c2c60dfc0ec85a0a212bf5c9aada818a83f9664c8712d96de1036b5e5d8c8298786b753638de3a8da958549f16eb9c723355cdf7b999aac464ec39df7d6c1607e81b88b63043d1c847dab618f1b19336911b4b0145c2a694e61db71e021282006d48e37f10f3b6314dd012a07618228532c28ca84a936e0eff83723d117b2f2db857d14af5bbd5948a0e53018b31e57cc2a81f36aa013a844990753ccb347fe98fab294cbd252a8b8f7246276275d2780511fd3cb7baa2fd1548184f968c422230f7ad73ae9dde91295f79f6b799e7d234dfd6573fee6d6ae748b0a8cd7ed4862ebd957390826f276c2afb01fbb4b64b61a1bfc138508efd630e77580867bdc1e96a48a694cf0db6c2a11f05dd0bc8769e7200bb0749f5798b6f3559de55d0c281eb5df22b731fbbc109da9c68f209b888e61240c4c0ca006d105c0a7f43144021547d3316e5a99f6c429f9ea2f17d77dc68bc9d5125b6260f79bc8b3b8061972e6757d87b6544f21645c0b4debe5224f7c48142c09f35b8e144c0c1e6521f04c170519ff744d61abd59a56d25a26c5ed5972191b25e78e2140f3ce68fe17be9e59a79f6c69619a79b83614c670c7736d19c27fd22515fb5b896a6418cc0b4850e85c07b38b995cffafd9f69763cbbcfa9d1bbea6868244a66a5cc82e815fae09f5775d28437634926d571c2b0d200855e09cbdc67d10f85bd4cc334ded4c83aeea57f8e373a950f135997666b653e8de47a3bc0059525720045996bff500a47baeec97808fe971d7693dfde339e8beca3598fbc053121536c30d0af10f8f5d8e5eeaaaa9586d7abb563fd69e88351f93bcc46520f6d97c1a49ba9f8f6a25cdcfc11b2a722910aabe7435ac8f0dcda9f824fdde80850f21a2d4bcbfd2e9fcbd14dec05c117a9796db49e2f0dc55e74c7f0f615bd049fa7d0bfcf197dcda3ef3de90762e6f6f9f8a8936bd04fcf2a97cf18ecc8f2f118ffbf02b67f252097e4289d02f264161f6f90f79e1e1ef8414b01a9e1a77b88c039ad6eda6df1e28fcfe9370f0d574aa9e857dcebb19eb7ce8af9b19b4481c9fb3e1f0db3b02af483f737ce3ea824b2165e7c0fca8585383d4b0a16eab2c7e3ee5c038f939a97bc8e1c093cc5372ee45d81836c988f3ab3e6ee0e5f9549e4b7bc381a2afac2074cf75ed56b0e757e7966cb253d549fb0902da98294c6dd4de3c2e166b7e45098d2729b1393deb68471d4d3218dea3dfd0183b654ae4092a79357945eea4b28cfd06b40d30d1b4b8f19827895f6f908f0fe511f74ec84cbab2483ca4bdfc6ef50178eabad79b18b58529c9328c13c52c2869858cc20ec36ef7717e1c743d13f9607bbdb0b701d9df6aca7366814e883d23e51ee5b0f20ef70e2c4134ab037d213315fddc89009260981329a1872e541767adbd5ee9501e7df4ef0cdfae9769961f8716ee7dfbab0ec89b3f62e987387d5842e124a69b07245d359052ada50cfd67472d27ce2c4eacb5421b62dd7331da54ebf0989803797f4c8c781d0e2e6477b421c7d5cefc8146aacc0012af3f1f7cd71ce2b1045d86bf48c9a13fe469a1865294e160b4975023d0eb24ed26837afefc250a914f86f8b1f5d67d65e9737e841519148d4dd5dbf2b5a8b073861288ec9793d4b113d71c01727f67d791852fc3946dc912d60fc66bffccf4c45d859eed9f0bfc7f89086df5d5cd830ac919aa7cdb4504018052d67f6a3ca012ed69187cd5fbe91875cfade381bff1e804ba59cd59f0f75cb46dcfba234ab9832c3fb9aa8dde19fc1fb30677ac1793a38d94aefd9ffcd4e777e9e4f6d49e0cdac6c16a36bc2f3ed8e23b80350e3be6d866aaafbc8cbf7c69fe44c2aa80651164803150c23ebe262aa669c77ca94d215895d2ee9c3e325a0bf2c61e419a41e0f7b1ba8ee0508307d49301abccd5b74c054b6c7bd1aa67cffeafee033761d8226d9dbd7214b130a867764062cf4da685deefa23693b8549d5ef5e53df85c19bfb3c43c6bd073e7a836f849587a4747e1a9a3c7194f6d5472d2e3e4c81784a3061fc9bd3b94862c4784974d859134369486f2651f1db94f511c6f59f41da0d75307191602730b88e4e6101fc8d392c87687f3be454dd92fb8ec380715bcd88aadb63717cbce4db91a36821a572c363759d8d0a2ab007e5981b78731dfdea20d900b14f0c5ee6a4a9b532ed2134e6edb4dc267f001cb88dbe43aac4aad453b839d035697df7de98ca7a9ee7601228a79004b89796e9ab971aeb8e62c789bb21f38b77b492c57db402bf6a42ad0cee169e9251d865ea3e5f79b1801ef1e53797aa6c7060d6f9486081", + }, + { + "04cf92a64cbe135f7fc1d7223b95e41d13f04b482018039f4e7ccacba8aa15ac79a752c5666524e527fb076290ec80a3dccbebfce3ee9b316a65fd130f12bf88b9124d1f7772049e6d0c01fef881a1d44c8dd02f7b6b60e6d15df9e06fb86929cab64842284de09659e19451623525aec2f5dd3e603e24319b1d120bd57b34a0317ce25ac9c2f022a4847306b998b57c8d92baeed0de1f6cfb3177d0acab70de275238f1152813b9ac87bf651f74e1ad079b9bd779ba4374ecba459865b5768d08ae7e1dd691d6821895e8380ac9e5116580e8de3a2c5326e698bf4c4d35d955e45772bae8483d01de2539e8ee1ef9539ee132d80d85fff41dbe406af319c0d7703292587bcf5959f49241e2b03a364e1b682729ed261d0ae45d74d77634afe667413ee210983b042a7ce6dbb61c29d18450fa7176177b5a74f032ea24e1d08b220f6d32a7a836d1241cacda39d6acbd26a62f9dbeaaf7329a291dbf0aed4a2cfcb85ea360947585b1215feaf70ba71eb2d6bb7081b2a21bdcbfdae6ad2513a9dd714d3d06c2c2b7e322a1db2d48f9df1fb44fa066f2bb42b196295ebb3c0898ad55d5b317986afaba0bd5e754cec773821613e908ce2bba6454181f9020b73e758df18c255c87df675cc6bb2b8d2eada44196ac10c26674167f94a79f4be515d8d6a1fd3228dc9a85a355b030845dd4c5f481d5b6e74acc66de730629581b022fbcff61e5dcfb6a7f511aafd577849a6b057021ecbaee53986159c1ba74c3e930c34a159f467f1e9799cd6c1151067c56769e43308c96c8edef8aa7634d909310dba9af2128cdb8c29b24d3ec2a4f43a1ed86d1791c9a670b240e6e719f01827aaa319bd3ff53959a776886a1b7c942a54f141e6bae8576d294e44333e6c5ad90f74863f69bf890126016b318e0f6bd2f0adb9bb861118af5f6cd28dc93d56c8a1dd080b8c810ca29267d410673fe367dd9d1353ae2bf2fd88d57b4202c21aa49f12a01b93acbe260492367bc219d3afb6e6f35502f6529bcbcdddce9fe8632efb034a9eaff8b4a48afb105d04e3fcbbcae010ddd6636992213750b12fb3e01ab72aa957136e0bae591bfb5e0fe819cac82a98ae8df230af399160594540640c6b1d537e7b5f1cc47b08127ae02c35b846de56c4c08773fa18d4436e14b76a7fc4bdee301d0af4880306f2f33328ab79f6f24ec779b2b1928704f09bbc5b0b7108e9a115e4959df79c80eacfb98649a0788867e23b2974b22e654ddab0494bc922ecdf17727d0f0efde9dea7601857d890bfbacbd93f7df794bbc254f50e1e17eaed2f5d5a2e6c58083aff68434730d406fb9fd02b0dd7bfb99a04aea812b6830fe5e05a044ca21c77a174bae8b58eefa11ecfcc1c977bc6218064c9931b5c92f13cfd05799f11e130869c293c1b08dd29c899365014fc8195514b286c97cb6dc4b8633e47751f87fbaba137b6aa04d072ae06c2b2f34448449f60b1272c1efbd4722a2be749a3d2e5450aabef1f7c51bd8324607668a8caf8097c2f358b1b09fd3525d47ec9a7640eb20ffdc17c4f7eff63df75dc7830c471ace3a727feb11533d6e9a2a08106af33069cf482ec63724032e81cab18e12cb5c4c3ddc374e2f75bcc99fc5da09b80a738852a14e8ac552b8471c6ad52e35317b730db2c13c277e06c643e0d0fbea43833de4d2c7a9247ff040e9c56f1ff7ea92049c5341c4d1478a14275a10119d934e8165152b89951bca7ee1399dd8232fdcbf831d8354640e698b68799d060ceb877201b2fb96cec514affeb28721e163e1648164b9e5722271db9b0ee1a7f96819fa1b1590e9daa598d9571ffa3882db9d034056e9b2785a8d13686eba61d7d45cf2e9ecdbc391739ce89297211472be18b21401658c5bf29fc3615924382d802a166d05dafe7876e70a0d081e80c63632da379766928a0555eb5e7a238cfa4da267527c66caf34dd40055f2801b29b3f5604a5bf3d46048bfbec2e24abd2fed2481698a4b5cd71f5d2c12dd473b903c9bdb978eaff7d76fb69951005681ed7b0257054eb3dd6d10097fee51ba7e8d565925e4091cbb78d255c9d3ab4ac0264d172c9bcb0908db1288c9634248f198a1167daa323822058decd83936985f83b08b1e7b942756a7af200af168fb8a091107b4443fd649cdc22106f9b9657c69f19be485c23b2c715b3762c332eccc44f380883357d10019f20612ab6b8f155c2af9e2ec340e5d8f45bf5278ac1fbc9f9f44d2f615d21007d822b244b1c7a0dbc182c7f5912485d6e4d74e90f60a2f964e028c63d49c6aadbf1df170e4914ca514139ba538207b1cf7caaceed4db8423dd1086b2adf15f6c0e50dcf2e12898f53c339a745316904ae03c38b417bcd7f5cd5ea77a4f06e65d56c24f37ebe72d271ac79b6ddd2bb8bd67f0727ead49737aa71af4f620da53769ca3ae878adbaea5a249128074ca3ddbbbaf5a68f9cde2a0e8d69708b0ea7f4c8d2dd4180882bdaacccf2a409a681c551776bd10439fb12b7548342532b371c0e045d8e8c895929464bdd4fe25f0533c66104daaaffed52446094978bcbb389c", + "001084c8a5175c0ad43108f9215c35886c82321c800740c6118a3fcd45776a4588ee0e2d056a37d99b40d2bd9c0845088a77240b7e65d18fef105d3488c77910b5873dbbf275948db5", + "d614d2e671066e387f7eee07bca9f9313d86e6a4d1371360900d670e11ecf1e7", + "674a516f8f59f9067e0485e3", + "1ee376e9e3c89b2147bcf75480ff0dec1d0e8cd45ba812f34c84124871d484b4ca87bfc8cf99f85ad452c482933801426e2737a97468809fa36caebebe8eed07a626b3bc3614ef1ceb54f9221ecb16f413f0bd9ed4b3010c40632f05223484af7bf5948c2fb8a3d2ce04c53e3f2682494f3969a0f8eb738cf93c0141799c9e6b68924433f0326991e19626bb19e6fbb5dd46baf39f92e830f9b1ff465a007f031891fb1f1799cc122d3ae7a55624356b5297bd5d948d9ff2e414cd8adf00a53524df43f398938d33c93b2c06bcde2679566c0a7b0177b4a873f35874739d550712d5cfe3d25c19292ba97c01d84224738bb25546e5c252fe5e5f260ca881aaf176a271a6fca2edbb2cf23ae6d4c56c20daadadb8205c2e33881867cd67ae6e59132edccc3601f014b744ff8eb6aef5e09b358607695d3af42ab8fa30e9fdf99ce54427ba9da3699de19f7a8f9be368df47ff0607601a91e7a5fa6e72be50bb32b825427cdeda3972a18a23af290986cde14f5fb9cbddad336f5efcd2d7a0cf3d5b23e54b702352fd5ee52d7e3479441497d56e17d5868574c56cfc421ee47bb00e9c75b84262a1b9e2cbfcccfed9c4c386ef0d2c1be9a7b7556909b5d72a38b7258acdd624de2396c75386e077c34f005f92a2203c82d1072c8998f03b1df22de832ac733977705453b1d72336b8d371cf1ed3923f462ecd22075de5df68c83ab1e6648ede7fd5ee5794a744abcb32af73bcb182cf97d36f37c15535c4107b7c8f2321f9fe0e2b6ccbe74204df3d748c05bc1e0e2c55ae1aee2d4aa4a52e98ca7229d6d06576196ac8e4b14a9ce807075cdc876aaf904c9962741efa8c6caf41e6b87b2ecd6636e2e58f3ecf576e5d8b895162545e618960ff6e336ff17eacd5a1eb335001633fa78c41ed05466d904ef9b81b643a043298c0e291a085e4e67da72e329adfccc407f800709865147db49cbdf4232073b7bc7ad89b3dd901d927ee08ae6497e0f2f9d052ca8d7444d2e2ae2197f930a7b1c8af38d8739ad298464169823684612cb628c484f710cf9c552551b6837b575a43275100bf800b7a3d777adc44d07f67cee5000422b9049dcfbedfccded0f2aa4d189621579b01e3fdaedc4d772dcc593316ca85e7aa248d219dac21c561d318a4936ac0d3bd5c75311486c174e0e2182affdf69bdd6a086534e4a602efba2b9363beeb5346539b45336cbaf479da6b15b226a9ac026482216dedb84ae3443b306820d9f05f78dca7090d727c7481d82c6e5df80e189e24e46f5758e453e542bd91a58eb51a89e07c50afb543c6b998704432e863dc4c0d0236e0672835a7b0b64e14f5ced2904e54da4287597f920bb4d542c35d3b0271cf0eec055656d523d7d2cbd667445d3e8634854f8616b7d7a7f3e14fd32651e9df40e1daedfdff1371f16d5549ed5646adf2d417e4b3a4d145bbe0974ab388c2716861a08296b862e4fd035163281457877eff89dadb160eb2b780414435784804bf4fd36602699d8c2f6a8cbcb509198c38e2df2edaae7bd7c93313ca98a9c2d24419a12ce35b0b3d68c18840e3ff8739d70969927c7db9a6569787bdedf5c99948a9e79b2302a83a71159f4c789b3b3f05f1e574f8a24c899ae3457f8e73f9bd86976fbddd83b1af337eb8da4c0dbac3792921597e18a2fd3a0ac89a270794529d370d36bb6dc7452e754e903781cbf57c8646b92d5d02842e7df229b3d721f9b981f9d61a48f00e53948a5dbc4f739849609d94aba3e3f5f8163d40321576cb8eb8e89953b608a01184d41aafc13f40c47b12240e3ad49413473c26b6843f4514be221c2af632d1a54cba230457f23f00b2608485c381ae03b389ad0a1671fb416de4659cc7f7a9c4b6d9807789c307d061fcf613b96a2d79e5e3e20b863c8b1b75f35c982b40ac8dcb7d2712ef7df94901facef783e8015a9a48574aa6f0cfb0bf6c1a3409028f8d62137c347f5a35ad6a3cd60d71aeb29bae56bb4590f69226fb4e08fab7a9f41e58f4d5784540a70e7a97720c549c8440b089eabd0eb3e4d37a2e54b1160572ce568f4256dd244decec31fec555017ebf488e878945383750eff26a8a1cca73e7d6f52d8cb229d5603360a3bffec23029ee34145c4aade82d486758e0aea9e1b7bf0b4bfbd4fcc96aab66a27fb463b48c6a6c5c5a60253e2fbc5716ef55629277a5f3b89c300e21bf1226241ce0d587fe3f5b11e47f35614169dcfaa375ee1aa589be33a4363765368f5666d155cf72e851d426fa67b982aac4dbbc29356d71deb0715b34e00b9fd8876bbb09ca0701b15615f05cc45e128b3864b26003e6ffe801c4e27402f37b8997e0c29ebc273dc03358cd22fdb68d9cd3b56ff8248a727c2d4ac65acda4d0e0f511bc07ab06cefcf444f1002c151b953d7f7b19695668a86683497c2a2d2e69f19a4997148d2e8d158da859c8f44437d9ce9db92f84a88e89cbffc74c0ef4295088e2543a4f7c6ae9c908bd987bcfd7a074f83ffaf3888bd7f430dc5a5bb70d223c21b1bcd8bff2103408460df864dcc168486f6a66d67ded366c6e10f50bcddada93627cda711764a57ec36035ebc", + }, + { + "ce72c93caa49bb9850774149a87fcf8e23a0c53701554468645554553d54190bc6e247712b02097b794bc421ca94afed34742435ca689d2ebef183fb469c060c7f4d7daa508726c9d2eaeb9c7e9a89b30faee8d9168607d4778acfbd27d5caa623475073ce763ca061273cdfc2c692d1747baa8a01b15f783b2e36620400082747599a16cfd6b630fef310c0b9a2912d1d3bb71eec16972745cd8a49cd927014eb0a2abbe0e1ebded4fb9e8d9e2fbabb6a71da5688717ecd3e08160b9a861f86904a41702b2c4fff28ed8cc61d468187b75bde3fcc5c0c0a642215fea83584387fc5a9aaf2f8a91ae535e0027b618a32bd687289c47e9428a1a92649deab825d702b076223b07c08e55c0b60be95937bfd0504c18398e924420f6e20baf07e2b1b858d3e360a461b66517c24e60f9fe314a4a4973c8dbc7e9d2a9f571a1d8235a21073d81ab9f4800b70a5f17f44d593e8792a2507e6a3a41042fb2a5f7e5f028ed2daa88cce28973ecd88bd125d50fad77b1fde61c38272057d9c65fbfc6789ce41315a105af14e277a0c39d75c34aed7538c39160eab1c8c47818743e8111229426c399c5e88c4d894fdaff0315ec885ea019bf9acb785f3380c37201d494a60b583fc130bc0eb9fbe9b90eff95874e35910dc05c761f8006e2f208b786aeb2eeee841f9a82d9966c82956c181caa4dada81dfa2e2d7a25007c2dc7f2dc7ad1bafef14581cadbee4d614a557df4931b9ca105bade8fdfdefc0d96eeda11c08500b1ca827ca670ba07bb0f85af92914c43a6f71226d6e112d487f1ae99b2239a63ee2cd0849d8a9c488a11f82ca334604a2b7260f25373c6db75656527890f9b772c6bfbb9f687f27099ea9d4d1efd874a6ff83cc36c039ed1690408f20394692ff054d9e6eccc6776b6f4b3c5f24b0052334d159f40b470a9b8799bbc0df4dbfe59a5e536624cad193160ef23abef85df2c9b6e6d4fdf16f848a2a446a77044f1162a278866c491982570cbc16041908cdd0efa2cde011526a3c96d4b39a23c5fcc53d8232869cb4dea871f4ac8afc795aeb1b28cb2d7a3669100a1cab2ee1a7f31e2a25a5c6da836e4b771ad57393305faf582adcd26045e26b618d9943358c615fb206258c8993d700adac7440dcd3ef34fdcb065e10e9c9727662b5abee160aa01d2f2ca6c203a76fb01bb08cee9fc1eb6bc7497bb012ed2774a2d263b9dd03d60c307ccf33233ee33eee702c8e3118f9f86174a97462d0e804a24bbd7f4f938c7f105bb23399967288069e1637b60f2f1883d88ce5a874ea4bc0a7ca0f3b568e4bb1407e4bd6f0d3dc8fe91345f8435d7b1be961c45e4b0f1ef2d92d2d30bb78e1fbf72cd2e7ffae76e8c2bce005195c2003bde46108f37ffacdac28fd67a0de62970b347f0ae3f5f3a5b1d3aacb2fcaceecaf2ff4a2aeef6f5a176cc1b74b234f5658ce603bc353e075278a4056540e43033d37a6eb2615453d8206f5cd294423811283bcd5d79c4afe268a547b98977ed5cf24c0f53a0533bc0b2889356cacb67e2f7353060f9e04362859b1c1f02f96bf5457b58e5ce84a6810d39d7c7f53faaec64db5d6ebb90c1412bdd503ec6bc240c277ce1f5f18876feb24eb6a77e5193e33ce141e8720329add079dc9735f0a35d7d85436f1dba6dcff9147777760b5aa2ec9c8b5e9fb4fc602ec8f754c99ab2372ff5963dbff3fda91865108e606b214cf7acab875197e78060eed52a798751998ce7c73cebc4d5f429f6729a5193d7593072d0921ac8127ba6e796107ee7b9fbcf7128ab35fe9f6fe501fa4695c19fd64460685f287acacf5250efc13899bcf80ad5a340d432a0b9449affda5c8fa090f008e01873aae7d5fbc7972451542c5c29cf9cfdf23db736c8a7112536b1b626caa63f3e4117044cdeab612fff8d8c194d19174f56ce761f6587349c48fab30390f231d209461ee7e18007d10d83ea5aacf199f3b00003259747b1d03274d3c3670595604bb4482d345ffe31d3e88c70da16649a2677bfbdbf618de1d651a53d573aada2eee5c01335ce5519a6d18a70f7ff0b1e66bacc162c49f7f29b9d3fe2c7dd85b6b355c9f9141f02baf08d2be87c36f6d2e1b2e90dfcd100886e306b360df0ecb146a6aa5ac5ad05b63a219ea65885894a386248254348ada17908d776f9b438306ad28b208f80d6b9b265500aead945134b9d388ed5d6205edf07c5d8bbfe0916d0943750150e09c76359d24e3317517ea489fd8a501dd93f159f07d19d00e86d952fbdba2db771910143df346b30a30fba908a1abe5349c3f241958f428dece7ad9a91cb42035c43573b87b26c2ab216cb4c21799f6b3d81acd300ff50edd6fe7868b9ba6c160db3418565ada027b46b63e5d4f3411284fde585ed3673b424ec1cdea678e4a43c262991c3c9b988351d6e0a10af1c959cf21b7a288f2e4d7b3b2c11b400b5e036df71fa993b72ce48d0d8598fe4ef1ce70a970f89b55cf4f07906a479bc84a08bf6ab25221de37afebbc47ea0b38b87be128737d7d43cc84d336cc6ffe1677bd802910a2084751f30398dd0ed09589b2befd2f3b40fbc013318c822fa2faec2323fcc52b43161f47aefc557e92df3050dc5f8b1c5a4b2f8bd7b2ba7aaca79dcfa362fbe7781a2e261683a4a862d5f83e34845a8fcf8a1aa73cd521e87cbeb71f20b20698cc34bee3b8628b1a3784596c", + "08b3fbd73d157e79ea9f61665d19867dcb8c1598c1d37b793606936d8aecd992a0d46addeae857d488b83be5d1c1639d4d78350e4cb08782b61bef4107c9d3a79d3d85", + "a56f38b4bbe83b3d9e562cdf5ef5b30593f08a1a166676c4fb0d5861654e640b", + "8726dc5cae9497936658f603", + "88420357d1ad70e7c7bfd55b3cfd4bf06cd4e9b4ed5cba681045199a06985956d35fe86b28b9a4599964930d05d230a23c55a6a152f67082a453fc31f68489df05c553f9ae5cdb3f611445db384d79af865e52440a876fc4153d896b7a2318dbc2a4495ecdbb2e9dc68022326d35289e82aa55197aedc266dd91ba3018c7b474ba22b4e773773f3e9890ea84bc16a6b235e4bb69e785c40c1adc15b0e0ef03aa147b0d14e62341e27398b84a53f72c9199cc1c94cbcad2bd31aa69c96b06d01775b8c0f80278a43f526664bdd430164863c9c9140ad87798a5b8f38dfe90d37f54d1137709d5311136b728e6c799da244294daa4c8b44bfb0acc603a16c088a081129a0d2cff55ce1c4ccb486fa0ecc3098ef2196f47c49f9d253112bd5746fd99df5d2be577617dc2519c0ad04ee49ee1d7be3d50492017108fffc9a414ea227af39fe49fb2c895fcf00d927bf4a2d78c466fd44df4768e6775d39fa5c834b60979ca27ee9f00faf37a090838f56275a894ddadd265a8d2de74265e4d8d286639ce8f01eccd4f551cf6b4429eae3f08902b6ce6ef422cf91ce8946d9403fe8064784895b62a7f5df76ea294132c59da6b9f53d4195c1e9000bec499c14cf8bad460aebb024a76ac50616f0dcda71c0f56dd3239b11764f3ed6ed06c049b2ad673e4beea391dbb854fde1f01b1900858b9809259f3906b34f95a1c6ce8d24fdf0cf7c2ab7bde2202a7f1482baa6e51caaccef9f541c377da620bfbc63955cae0e6644ec8ed6878f704f1dea30d6b50d4291892bad19b0234582d50c6cc0b4165322cff24a9dc2ce1be35be0fdb3bb7abb777ff0b2f4cf16277388af5a89220d59f1f45ee9cc2a0fd7af9aa8e9e8d548fd65be4e47e7f8ef58f7701f93a42e7ff78f70e807fb63513157fcba96ad9731b2e8f80da85ef407d5c368ad16f0657620bfc122ba1b10d7ac2bf46d8133a9c6fec1fe04882f3d5765da8f825e1984a4313f72b67d806ed45c000dd3ddedd524d474b9b5788547d0712e8edb4c6c586d0cdf8f2384f1e093a7f6dffea6e79df9cb9398f5d0b9a7cbd63d489430fbfa397a0d03ef916b7702f33a54ebab84a7055b7ec6179b0ab7722f03e126ed343b1cdf2af3763df7e3a070162535514b01ad86c6cb051859aba1cc4766b12c8cd57b73fdd3c65af6961c45395aa7b885dd59e115db885f644e1c94bfa26b3804f767601c86e2c7dcecd4daa59955e6a40991a4b4701e63fc82b46dc0ccf59af40a8583171375551c868436ede535705f2e6380c5899cddfcaf9e94314794bab98846cd5ba9e9afbdbe1ea7fec5e22e7b2aae59fa598f4d6c0cc6f936a616e11bf01a2acc891cbfa2bc53c511a8a3a3da2e3aa5907d123ab2a4a3c0009fdb5235a3c33718fe4c504e1539abac6370e06150c402b5fc2f8c32608db4ce2eca9d1e4b96371ee195f6cd632f5b972385f9d5d357b87c78cb4e2c27aa9851534de14de923543f5fd9d55e34d6e8b7e1f3f2735df80046de01f79d0321066f9bbd76299c7386d285f7bf4ac15e033e89a040710c90f87aacc09fb8159f93c8b4860247eef079e32d05707e88aac734a2eadaa853f528d9986e0af3435b5c5f44ddfdab9b0c9ab3eea97676e920f80d1794740067f9b229fb018c804e595aa997533a5e967cb79ee58eea18995a90ac08333f1c69600b17ef4f454f540dbfa8b502457761bc4daa876d9053ae1f55001b6916ce559dc6268d01841255990e56614e6f4ee4ce04472dff0657360d75da4e83a71c852a2585110e53137e91bd89d64d99b5614ab2a5691c876f15d9931b092fc6729c0732db5cc40f966fe440ff99d7d05b24a872f552c27fb0cf2af443340b153214b407fb9ca3750d9c157aa75763b0b7600959663889d00f392d6ebc12835bd2f03ad802a21d0228f1d2e9731d0f0051eb2d5369ab790d1134c38e28d2bc2d5d57d6d897244742c176559961a1e40c84ee5c8225c8d72b92352a011e3785c262aac115cafccc2fe1b5e81a677a0220f207ebadd786b93f58e40eb6ade68ddda5b66c5f0f6b4b95cdb8241156110ba3303beb79acbd54423315768bb43b4fe8c4a465e50c4e63bce272c4d731ea4c797e14b2de31ce4264e2479179b906f67af4a23c56e817abafedc2c7a65aa45f0c89fcd0baba60561a8d013e2d5e0bdf9fbcc1346d3edb20e6e9f9c410982e1ac43039ad8fd0ebd453a6788376951fc20374b59946a6803498929d9fdf2e0f5e58c441329a79d1232e957b3a9ed17231c663b4819dcb6b4e33d205edaeb7d7ec466930bd84a064b40aa67fd76f6ca005408062b45b5aed6f8161836c7160a8c8313dc9aa1c6d42c2c16972a1065e41aea9c58db7916e1670cb42a8b54d85498561b4401761506860b19b446655f8988101fb4c45067e30edc3f00df8d88ee34111dd6626d605d993ff207be09704fd8dc242ce514bae77cecd20f10d4a38435a3f5e545882fdc224586a04ca6a162e118d23716240fa67892b78faf98a17916471f7f121fb9f85497a0b34bf5aaa4ee1ed8a4681bec55d1b4973d4368600115bea70f20a37c9e942b87f6cd1e2ab70fd401e703e3c8334c75fc338508e06d6370779578fbe737a75954b4701bfd92028ec32d3d7ae606caaf9f049d9774f70efa707c1c1174d9fcb5b0a0ae2a961c6f58e48ba82c2db14ebbbdc24288e42879f547b855c86dea9a3b9877e4b105515bd78cc43465", + }, + { + "bf7884fab52251e202afd7b5b46aa53f85bca5fb80a009d8016e276579e401385d853312a884f4aa33cc5fe7360426bbc0ccb7416cc0196e2e40d3a825d5e0825a1394029789acca550bb28b10d847d0a4fe1111be2b7fec6b5294902775128288a784203031ea853c9c104c75571d19552e2a1359a900c5fc9455230968a5920f2ab23f5b9cc49739d4e4ae2c01c7812ff295899b954e9729a3bb330b60c51a8a7759e5131d7d4cf261fa1e62c29f91b4341a4fc968e7f30ca2261702eb328d628b7275a9efc29b50bcb9b27e5844328d5e8256c76949d30b6fea0d5a1c9abca80d3251fcf4ec4db0a5ff2ffd43618aa2e3e1694c2a3c579a2665f443ffb1eb0ce33c09d7285687cd55b6ca9918553bfb36a44860e09ffa0604ef4904a034108370195a986fe165c598305eb08599abbb3df31b1d93162397056d9ba5a1ac2812c582aa356310fafb4058abc5f157802e4a9b4bddb16e75b6db105b7dbc838f820539b76949b1648909104efa67ce28b16a738f1be104d2bd142d3ad1b1c953b6020a1f4cbb84d5c49424befbf2e6ac5c593b783a3f4af75477312528fa78dffd82fe493d821e011642bf1135a5be91fef909383953308dcb61b2f35c2ad259acd1a2e953c0ea6a03a97b384e39c94c33d3846c26b4f9f116abe572d5b7cb81886d6adc2d544630fdc1684bfb32972e051b9a2bd0931de63e025813b923944290fe1ebd5264ee4f25569a2088314e8d4ce8b91c7bd602b9d85acc917d60d30d5ef1cbb055b9ff7b0f999b98caea2517d2de334eb436078c90d41e0e34f11b93e3e643389f43b3afdc4f47a7396cbe0b4bf159ff27618cb835aac6699be1fc7ec840b767836a165fb95d06f2cac4fe15b65714ddb8a095ed4a5b57e63d536405931b6c168683763fe07c32aa4130bff787d4d440746a2dbfc584a502d809076b257482abf7f8ead7741c82b54c41acd41581148aeb4149b0c6eeb39ef7ba091c2e8bc72583b2fdf8ce7fad1bc05aefd6db0360c644a9760a9729a88ee4b2ab123d7238c12435b9f3b4660e74c0fd4a9b00aa614453d84fea01f779e5a924f8e79630a8bb6561ae19c7bc8d88b9d823b98285fdd65d4cc05e443944ed5d3cd4f46c7cafd1dd5deaa519772dd24f508bd2d588a832d5689119a2d506ff11dbf37d57a24e35ff38da18af07eaff5775d12dfe795fd3e1f0ec83c5f283d6cd76532519a15a18d93431893b1b88929159bf8fd21f62b30f4e37d540baab0e30ff3349a08d627ac19303fcae8b8e3fe44eceb66d30697c7ea051bf5afdcd8bfc00d49c8d36164ec9194a78a4d8b78826863e93b6a810354861f4a35ec12e5ac102f74e390d9c0227e67acbbe3254e5b892786e3a88a383ea9726485854a319569a678fa70392cee90c9aa83eee8df6800565bb8e083e78a064c0f8b863120efd799ea57d3073663c0d0e7bfb9b717ca1d6372fdf75a77fd9677791cb899fc8033d6d806de1e6aaeef525ea909666316d9d604c1207cbeb6f427c3acc1b02cf59704fc65135703f2a9529bb2c8fec992c4de53e54b029c3f2a5fdbec1008d1a70dce0c11251003ce62af712b9e4abe631902485404e4933f346f1b4467fceb65baf776d0078aae6a2a1f95b85a441b635663c75b485a8a7cb9a5c12192ac874d940e2d9b88cc05a2db9b5b35df769925da508112ab0b8f64a1408633fd0d81810baf2c846b222736bd826c8cf905b2c35633d6013f5565e0a5ec1492e99613f53530799052a0d70023339d1c394fdf9f73a590a2faf68390d2a823bc3e47a173782b03dacbdadaef1e67fb47a7cad71b6067ce5b5e41fc20ea1fed28578e9bdfa99faa657a754488ed3fc084faa7a05b0f6eb66da0a28e9ab26bb319fa4ee993de840948f94dc1d68d926b783a0bd3396a89970b2c2595de8148e87b87c21f664618af4f567115d403715c3d7d2f66d7a90de2c5237893a4c18c20494e3faf94485ed39ecfe972c36acef0d7ee57bf8755924c790ad02dcc5c4e15aa7db53eb6040244c3ebb7874676782e54dfdddc256018ae6af8cc37450a4cef77f21e2e061062ca0c2a514290c960f5993ec1ce9eea6d09d3293118237e079b6015b966361c3032368174d74ae5cce4148ea2b3690fbd3c28ee544c5c5bd7bc618122979d52c9d3d44eab1f2467f338e695ec5f95998bbe77dffac42bc2809d43a324e0f5feb4ca3d5fd951b7dc8a9e6276ee080079b68849b14c7573cd02c76027a856165d1043acf99554c62fe32896d120974ae71f84986bfa0c28fcc399246bef3ab90f8e55f913aabf339dd7ca6f0861a9ef712e77dd28740615479f39a37e746c7df2b267066d1649fafe0459f665f3d5e7124db43ab1ba5ff94989acc7fe0935e0bbacf718b33103a1355d97ab416d8263ab369e6cf0ee563a77f2f265fc3856b7d54dc0887ed439a421c14f733ec1d6da086536f9539d23cb8026218c5e783423b5f4ac24c8d5d8faa7186dd5ea34afe299e6dbed73ffa8f415da706442a48808a9342d6209f65ca11eba76f8ef26db890da76671971f65bce9e6112c8aa92523dd5295d748e28857acff408c161c0513b37b855a8afb0764d118815bb1b68f8f09156641f7eea994ddea20f4062607b9919d041c880b71592402a4d5b92464b239caf431a99dc67787e76b8e1d7337af004bcb88473cd16b3f7640e8aaa59ad4609f060a2cdc71a4b3ed22c1506a7050a63bd8ed68aa58a8109980bb3f2b9f9fba9599d7620b8c25e8aee739095789af83529cfbfce5941d7f14c8ae30583deafdc7c25fc34e75bbed6ce4f6b47e9647c12333ce08c7db77dc94161cfc43f7ea0bba39def8bf8ae61c6fdcc0de6308af963c6d9ef43916d0cd2cedb970d5937c9fdd4b888cc66e99363b5a04ae62a4349f01c3933ada64080741b1781754e4a722303faef69e382cd9823177e4d5ac83e76017124a7b1a41bcdbb9c4209e7b42c", + "eaae1c53919e2029c137a80f91704d0871be2c1870d0333d8bcf7f94", + "4c434cddb399e52457113cc7e16f046c3f8301f5b6c296979f8a091a9ea557ea", + "b633c1a0e1ddf4727b149b3d", + "f1de487001a580cee6edadb1ef6b700c861a70c6ef16274447b8c61bb10d2d1efbf104d5f7d7172c6a5cf9c06d886165a2919ee9418e2e8f803d47832dae5ef232ee300d1f973a6298c22d777a1b16264353cc731a7a683cfe31e0abc704460788c555c0c24f281b81d7761235a955c736f17f213a896b40a034609ca8456ec3cf5906d01121b7580ce19d89347b6a59c81add318df487b2442a7a8b5e30df78467abbf46bcd5ee5b994a39ca5bd8846caba6f02f4f1335b73d4e20be0b6ad85966f86d1bb857713ebf947ae936782f1f4929498bbd66bdd5ad6fa252364a5a6b46180e93b54cc321b3cf63cf23d55392475c6b8c8c9dc707924b55544151c7c55ae0bf391f793e52bed70829fcd32b2926600f65be0943d6a9a96547675426b0dca9cc7b0f5dbc9d5439d0281014c6c159d055d6bd89d67828ba7fd2a0570ba82996037f7dcce297fe6518331270f6fd5ee63d406cc5081472bc5f2298a9208dba9398ccf807ce9af982885897715b3c5742456f756d79c70434a9baf7b4b6664c9d9f5696c5256b74099e593f97a2d4a469cb3430d0c3eb06083398cabd58af598945a85c9235a3fdd9ba7686e54d0de9afb594b1bb030be8e6bb839f6b45699dbcd2f771db64b0c62bbf6c8672fb412d60c00b3d87f82ffff6512e8308877573323c5a2d6a216ce3e2ce07c9763835ae59d44d7958fd873e3995b62b1b347e489ce86e023ae27a6cb03ddec27a38fb233499a714acd89232a91d38abce30299f38f437f7a46df647f2be862c1e7bcc1e4263c2147b13ee5b345b7fcb973f3ac71db8bc12309f67ddb62659bd73fbd20664eadcd23a79233386aeec1a6fcc8c592053954ee53826cb9b6bba22400648887311cdfa5414c96d5956fe193a3729be1434d923a3f9849f6c419f77ea05fb72f3c4f75ccec03b7f7aef8c8e55c8c5480ee505ae1a7594e6a911dfbc39dbb0ae8656f5972eb644c64203a920fe0078f3d050cc5666ed9747c23df7853d6913005d0156e741a5ead3bb1b22e5bd802c303a73a961f0b60d0fa698041c22577b44eba5d6071de4b545d9f5de24944c151de6a189bfdc223e0507c74ff929f06a2e7497e8c63073294b4aba110a006a6e9510a9617405d9ee711831e085940006761822672549d1d1c70e50002c2227f6f304b9a7f11dc05751be2dfd297087044d2e20ecfa0c091478d62c1bf5f0aacd25bb0384853762a51144b77d30418b633c4c10a6eda7b2eac46905641da0b685f85349749a91cdbaa4027fc50eb97a7dea9e8cbb5b5f386ace0363803ba579cd16ef80dc40ba1044b4ecd0e81e382635d7855e2341b18e0ca705ff46990282fe25093a248ca04a1fff64ebee25065350ea4b9e5990da4dd2e28688ab08b6d6fcb54d70f6d74fd7e5e05d21c12f5b140839aa966aea9ee094a923ee5ec704b5b709ff009c20ed89a75468c48b505d07c7a5ba1ad54ed610886c9d84468eaa598c71b017578404c909dbca431703e0cb1cfb975a696a1677bc015a75db007eccdcb21b9e5e119c48f148c2cffcf29e245e52156ba5ba0a8b0031570e4cbe7b3ac4646353594f0c4a9424c9d97845c5e1a4b4016df9be8df3013e5269484cf32258849afbdd733189ea11783f0f64d3aba9b4f48818011e868cc03ecaa44ff0ab83ed12981a6df445294ff672f3a16d6e0d19b90007d4646e967e0fb1763b3c879f548e1103a75c94f3a7f72be78555eafc086c1c58d1761aac60b843704f234c55b951a1303a12705f2120f784c2bc1494432a94c835d908f0edd5cbb169afd2d38087ca5bc5e5df9c3bd970dd2da4fb2a00933538148ebf669a20b5beef0402e53dbfc3a0f289b33b41ca27eb2f036a22f0d02e0617bd01e8c74be264515c9b46b9ab6fc67403a35837844580794088a9d3c14ad9309435daa0396f48017be524856ab6c191350529962ead64bab33171a01bb3c144b23bed406cb05102c693ce5df36eb541c47e871acf56f2b47de687eb9b3511ae83d06b1f69fbcef3225c3469c304741437fcd0ff4ae3484c117f51d24b6ae1363beb7d85d9b61e01e3dee901b90f2d3272eedb384ddb4d3b9594b9c0926595e500f8ce2e5cd407bd7a4e2c8e6f4315bf693e8c961ba5b8a6c7f5030c68a6b995e9d3f9eaee9eebc9d679eaf72a5f1cb6b2fc66edc7dffa2370dd778ea7ff446121999afba7bb35ceabf626c6269bc466d65f7f812c663bcb2fd87d3e09ab7d71e727f66d20ec48a5d2bf0aaf0aca05d1546d6e974f90df85c1393e3d45731f71ec7b5cb6cfb4e5c29976ead6944a99df2045056e198b19905362d4e9b765adb65eb089233a8b3777352665489c9456cceed593c6590d9f3cc4024d0bb92e1a0dc619bf8ae65be77456c18f8171e4d2d846073cf5c57ba93adbc0db9799e3d98934aa6899372acfa4d7d2ea32e20164b79c71d7bd33c94f9a781a25cbcafe563462eeacaec0e8d9d6c0199de85558a3a05d1ee3483351915d8a4e65ca0ab129a2386a9e26aff9b912c588babbcf25f8c467145061b9b8fbbff19d8c6ded8527d457be7c926c8f490bbcd627b3002044b7729a52e94147f95772591616f6074047e758597f410b3100f9efafaa4137dedfd0edfa85b0927804f0b4fcea1a174622116222004d42b36c2c73d04781f2f49d080f351e57154a3980005bcfb0ea34288e2fafec5bfd01e1f7901b3efc71ae58bf8df4cd7c045856103b77bd78073f0174aaaef4a3c0e8b5b46dc92db55478f012dc1b7d513e215e735573257f105d2390b5366f49b61809033c13ed4e1ebe19ab89313c947f2585f0788a0c5de90b41ad0dbbfc604a0d414d0e5390a0f3c9616cfce4097e38e05888b8bc6e55e40368bacdba7e5b76f4bd8fe619746155c30b38807a1ad325b00ecc3dbcf23014e79f1c39af7cdd0dc7ea58ce733e6611b7eae069deb047aeadfc21960e614db19d2e7e0905a9873268b9a24f856c28059321a742cd6cb3d1527", + }, + { + "c89c3cadc094bffd5ba06c600dabe30ea19ad037316fc13b895fe0e14ac8841264c1bf25557e22b01f8e102c3af43adb8e0a12bf79d3fa0232dae37ca3688e07294e2c7ecc4e2eebdd3f17173351f2c15b0480d4d77bd70955ba86f82214004b622cc92f7bf81a5837326f6a83612bdf65abb33c268a457c45cb7467e074b342a17c711c748c74abbee31541444020a9ecd4e5125e2a8ea3f6030bd677be18183a8a34af16a85ad48b7015cfb036789c0a5daf68883d0c7e401754b8d56cd00ff605be0cad19e03989f608392c81d636de859e66c2aae403c138bb96a58ba69b9064a83e7d8877067e7f40aa0016e0df9b7f455d292a60eb621b8107a727a3378c4b7509d3ec10526c50fc6c66dd4b015c915e85bbbf701ddaf2258119c8b9a5132eafe61bbf38870f35f375123f766ed0d4f38b9364a86e56cdef6f95a815a8d7c48ff283c77992fc6c070eab7d7c7b517006e5d4af532a7c429912ebaebac27249b4f5112d870d998e1c450b98c05d08c742dc769506f2d7a004c24ebf84c10838b619653e27ffcc4344d8db0435e4cb77c0410cc734e36738a6b5f72a7600632d19c86b40c737830b0f5f104443dbbb031dc7ca51ab318951e7817b5d81de8a9aa7f5db6e2d5e7a3cbd8a8100653c048204ced3af005d00e7de7b445f5acff901c4d46ff133e92ef073aff1d9ebf55befc32f9ec38c9eaa6a1aefc974bec2758297e474cacea2ba4151ab1a3ca0762c64a5ca273169d29b83c164f77f266c01bd5075871e17426068ed7aa58ef0d1f2959b19c604eb6187acc57e2becea2da93ba23159ba73b9226034c7ee2498e0ba34fa8038e5e2c092a73ebd9329ea3d648d6ebd47e1776941ab3130cfc91089fd0a0a36f0ecf68293343f275d2a64c1b7d27ffeb3f667f4a19824706235fa5f3f04952ff08bb183c0f1aa1d1b0edfd2e05ed093543788f5d0ac6532e15f912163275053b202d772f381900e906fe070cdb00421e78c16b7387be91adb7b3b3ea28b92548d69c780ea578e7ac66eeb931eefb4067bcabdb345a7cd2022085fc494f118215adfa2443630bffc9faa8fbd9943c3140d81c7532895734a9dd20e31c326531d06f5623c252139c4cbc882640c457819c63f6ceed4e03872b246a3766df69373ebf5af1116e8d5e1b15745bd9dbdd663fd4352d1238a43d5d1e74b3edddfb1c9d460daeb49afccfa0712b7a4cf8d07ccd0599ef3e4e1c9b5c814f3a6f3a46fc80449b34df87f47ff91fea3618cab2d5c04cb50e8ad199d752d901b21348ae939d39c86cc1bcecbadcc6f0e581a3bb51e070507b41ea4294b35456c69cf55a2a3f1296f0df73abac3a9c81cc303d1e20ad6e9bef48de83fc22dac2cfc01ce9ff3f70e00ee49bab2f282ceb6859f989075814e690e36a8d16354fd6056cbff49c30e49b1570363498531ff0ad0979a4518e9ae271f57f883abf5e301c0e24a83f09335479698911bca90269a28c0e040a98e67c9e55f4c91542f921511dd980270cd490766da22306b48ca9309aad3b2393b7b1e9ac7afeff64204081f9c0a8f6a5396d02eb9009901ca2c0a75ffbdae3a38ccd5007cc4f6bec8fedd64086cce5c039e8abc9e23bd694fc8de4e858c89bd585ebdd422b492eab26f4ebbdc1d17dfbba19b5ac458c31320a161a52dea638548205a6ad4ec54875ca34238c059177bfab2d5be0a98d12b3932d0661d33ec655446d0283224af8ec7f1c6874add03448fd8029a71d3c5aa06951123c9fd881d435845757df50444e6cacc31a8cf7537a778d1184b96c3512cd474f5d1fd1214555789d24c8d173358e36400b2d937595109729d9f35eecb0963c0da60d2eeb52a778876059fa95d820d5d34e7948d389dffd53d34c4083d27c917879b053cc57dc43c8263e5dfe5f33c19dad0a7126ea6e8abdbacb318d37c305a183596ddb25b1934beff13a4f24fbdcc2064de8e0bc639e672ecfe45692e9f8164365e1691784b4f775ef369aeb135ce15135c20da95064c810592ea33316b9767caaef842f948b9573b2205ec57d3026a2f2244c42991462e233061549cf9bc66a7b4a8a0fc61f73883fd24dad02644004989c4721a0aa03d3b0191d7fa4d3da102e541fe463936c9365ba30681e706ca70cb3c8ad5dcc710de59e7d8a6247aa809bba74ff4dd182a38bb31baa337841302c19ed89d65e87bbed05465f4ce0dfe89b44d7e9266a8ca21d984c41109d813ca76eb67dbd4e39aa437ff98050c968ec1e40c534ab51d6b8ea2309fab08b3757e9edc5972bff316f6f2affbff458ac0299613734b30dfdad20f797d172cf295cbcfee3d8ee25485d40380d3480a9372a1a6e5ecd7c4c6a9d34027ea6c197f37e86e757750c9fc24cc7cf814878b8628326c140930dbb2041bd9ee87f36ebfdbdc34522cfd4e50c9cb48dd52d4647a06d08e0f0069c104849bf30c8e61cb693dffbc69fc0ab9c5d502a227d606a1dcd630ebd799acdb1e47ce2ad52ff53f6cf4fbd5f0058fb5db915702675ea44334d42e0b6ddae78b22b5b5f7e5aa36519e31278e37b64312479b14aef9b8f12d8c1f39faf920851bd53b13bae5490c847b3312b2e956c430f1d8deea91cf171dee5017e7709d0346d81600bd5f0c41da3f548c28aa50589b293685ba059cd7f3edefdb5d8cdea364f4a42153b0632ef0b7ba18610b71fc34a781eead1dc5a00ab47b6840590ba44dafc6a16029cf50e089684194d93dc881beb62edb7ccee6304a4e71a35915f109db92690461b9e4ea21257ffb62477c20feaafc7a78e2aac2301b66893157920ce9fb114ab4f534d61bb3d17dfb4d9ef9f79a736f7c1d32ac3998356aefc876d8c38722787d564e980a1f15056cb3fe634d71d2c98e0475c79cab318b73a863362f85aeacdcfc44e61b5aeb870de9ea5b5abd24e8c19ab05e45e1e9b8894deeb9d29d65ae99aa94b5047f3c1168276cc2e491aba52b5b03703ced28c63a167f0cb3e4bb4d8e4f0292cf3ea4376510fa49a1a5efcc00f23c3cdf6402197b81262e66e17bf4307d87ffbc2b37213b316bddd65aa9d64ce6122c4a1545c5966bf4fc4c6ff17ded787ca9a3b3cadee435bbba8f6590dc4ba30895b84d5b4eb94f4b05be3c", + "82abb4ff5457b21f359754f151e456e2c0a185c8363d15918bcee0d6d49f12564ac655", + "b63b577e719494032062e3f63682098dcdcfe26cedea2a40893c847a331e4ce9", + "9f1d08be539f1244f0f69ad2", + "88dcdb0309f8c4a96ad5560f8210eda1f5afb31b85b7a8b15525777748967d4ed77c063f65d64ef19b31044f2adc690f5e457faa1abe2e127b38c626eaa94053c9ae1b6b4d0db1f02c8404b50f58210cc9fcc6fa4ecc615631da631031cd6253b4a13a3e88295ffdc775fd4bdf29655d9780dbe02b0a82aad4c4088e90b51f170909c0f98ff93ca3926067ec94be05841603db4f913b7025a9ee34b8d8bc629ed827a2a9857e0814d36b83cba21e670f8f94ceb4be5757e0b8782895b5d8605868e4f584b5bb6a5f3a94edd9b23fc2b6fa06914aec970c260fc370aa245ca68888c90c43eecb68474c9e45c53a7da055f5bfe39b56769fa56264dc8bf4c1616e30262bd501ff9fc5cd78f73ad89e093feba0393a11c6b2cbca765ba025c40dd0417dfa644fce96db5a0362235ad37a317145e7b5f3c7213c7fb3c393be57a1cb55035f06da1f0bf665653c5fe8a0f3ca67dbcbfc59852694d34819d0978cd09b508d103017168f6848258493be737cc24c2112f2afeabf41038bea1f74bc8656d9910b77d33cc691a0d9b12f7c518ecef93423cb4871949a518d2f06e5427823324275b97110f8f88b0d14788741e617f4b194e679a1627da50376a08d4f23b005c0446b46d4f534ed85e4692e7946ec818437089425ee30e47de995e8774b61003801de67939d9fed7bf0cdaf625798d0d0d04a61a2482217b890168e36f20cf1d6b81f9daf1a49a781567c4363ac2f3ebf0252d5adfbed17f98cc264ed2765aa279b7437410ee8b4cf42932e5055f4884deefd2a979ab1328f97cb750b3b7e4615b9c1c61659c90a5ff6d1c736e785587ec85040fb2c6decf789c2707974bfcbd0c7f699627b31e0762321d55bcc6acf1aabbd44abd7766d397bfbb68c424b311611d9eeb6598ca3126f569f688455da8d5ab86eb01f9c96186858c4b5e447aa2b9ca11aa5453f731beed4e09f95bb7376e200212e2f03551b8b09a19d6910f25898d692bc20bf6ed3ac9a0276db560de5c9e264f4db8fec6577042fbbd4510bb7070086508ac451a1fda26582c259412fbf1bd60cd5e921160c2604fde559b5ed4df52b805010b225f999450adadc6e108b70f169a3d8da6efbe1cce1c4908b004e928e3cdfdd0b4c5f742fd72a11c9585aa3517486201b6d9a98739b77970a88072750d29d005a291546f13b576b4249d71f04a9abf8f653ca206d98f738af2a1203bf0975f0a40138df054ee834ab73a3b1d7036567369a7ae15f808904e08adfc84b34a0e1356009d8a82e51c3e8f2170908179bfe47be8ad819cb12e85b6b76bba7c9b9398dfc00f550e32c171b4d5f2d9676063efee0b0b49660c10260ce052dd00addc3359e35c25dc33066d4b05bec7d93f71e0ad7d5ab83d844c7f33137894327f464260688ea4ce9847046e7dd0bfa48d4e15277a9586b4742daf0c5ecc59aceea6867068b03c20aad38d04a814472287d809a9285cd4dcdbf68f3f4ffb794701f4c265b2dff4aee55c9815938689162e08309df150538e60dccc03d495adcc560fb831444b922a6375845cef5dec56eff2910b5bde5f25f0e550ab5a13205de91d20896fe04a8ecc2c83d1371cf381424f8c43d2a5ced374878405f52bb92f4fa3c15d29ec151508488f9b4e42527921e245a8ee4b5d6ee95797f6ec4374d79acd7b467454a1d7eda05a8ae104534b23c46b27581abed6afc3ca555202dda94fc2b93501fe78867730a84f6f726dfd7364bc240b65d6c3022a04e09c89e36a809fbf244cc5522315110e9e33c8a4e1f1396e3e51fcdd53d9ae94fe7bf6c6ccef0ce02048a11441de3c25aa9787c577501977e486f8dfaa4c81e3183e648311148ce5cf3de56878847a9d14c0645777022c158670377dd9553eb63eb17e19ebb06202be8fd9bc2b24878cc86f9938e5996751ad9ca04b636497199f7f27dfa0f5ba2a01c3a491bec6dc5113d127f6aae38fa07ce7539a0c1817f7f0de0da538f4d85ffa394784a42eb50994e28530e3997e3345db28bafbb836fa463d34146d9f46d8d2b28b3954b9bc7f84046828e9b55e2fd663e562aa95caa97873f48f0a003d2251fb3ddbce0b6072fc17e0d3f99b655b8f41e8e6986ef7526544222e2d402489eabed4c219540605b9f5dd321ad902708601e85bc874c11efedd072aab7e10272c87b08b9457223de9fbc3abc2d1346656a524e9c67d79d4053c4257e886d6b430f5b7f57b2e5e92ae69273c1705a3074d5066def69fadea1af8fa9b3bf4890f9cda4b1833e5ed27f22bc4fe4cf452880c7b53320bc7cb748c0af6e7550ffa84e4714ec18d208131ae9e3edc6cd6fa2c60ab8ebc1ee56eafc01fbfba061e55014b9711eb58fdd01f8936d29dd081565de0b175b02989c5ff374e6f58c3383e9bc00d8a93903e6a221c7475e15aaef77594849af877f3807a76e03bdd54ff0b192bf34385d24d858d6f454810ee48141d73e3acf1aa3d19cd4c723a634cd8e25b4fb604c744e408dfd82961e46e8444f001d0991af24b3b6ec57ba41fb45122afc73ec6b25f501f1abd46181247945729337bf5083e5821968502a5a696043ee696c290095feac000957f968ac61ccb572ab2f37008830ab9a81d02456190af99873450b52df1888c3d8b6b13df65a9bb36a4b6d0538a0f179daebca2bed6f94b4670560fc5471c3770f2d004b6a138b8243068d754fd246e9881242638c6675f1611f237146f6e0f72ff2fba96f479fe0a662a81f40928f5400a0bbfb5ed07a87f457d5febdbdd6f323e2a59f749e6fc8a51d08b023734c762a91cc517401be57ffdf6a52b9174ea153abf2190ae2642955c3c02b4a15d72456c9d2f323de6fabbf56dfa3b566f1aa688c86b662bd34cf2511cc4a30621b6f1f1ac382bc1c4fa4c0d4d5a30ae90a5e54a9fb4afc1475e7c612eeb7f0e09e894c2004cd04126df9359d525d7f090e4b531916207c38c3512341c84218c86fc50061043ba1b89ddfb21cd756b391cb53e8c1cd55352be05efe562669e3986c022e30c79a97bdf087889a392e6da0d72cc7ea208aaf23408df23f3a9ea9bf9a935e49c9994a37a5dd0faf1267d5f7db47cf64ae1d3ec166466b2f882eb21698aa375cb50146c0e660e9bbb38d7bbc1c1c6d8333f7031d6a", + }, + { + "68ca38fccd585eb14f953358220027046c14ef965478d3d8f206f63fef4fe3571a1b53e774b298c347cc1b69cc426d39575ccfabd5a284c7a87a0698cae9efe40543cb79f5643c3c3057a5fc991235f06f059c44a7200b509a12e864fbd748001a14790f78b54ba80cf0a4a603da9672df32b68652c1d6edd3be51cf969acfb0ae49c026fe0bce0bfc72b1ff4c47712b7a27b2cce888b9bc470b8bdda55a8d53a34d79a25947ad55b95e5406a5c5311fece3ecd46ca590b3b01b9055761da8196b21bbc468681922c66d286c32598b1e3d77f2a91d835ccd9eec231409cb2e74ede9385552517718be9f84f0f9100e368701dfa4843b7222279537306065a54d4edda3a02f1ab9edba3ddeb34dece9d5edc8797103eb942a80cb5ae130ff2e7eddd11f0cecd8f9a615d75963c44238b10ab1230d9db7371d8291feb2912d306efe4f7aea2773903d4be9a00f2bd8c03589e342269a79441c0b42ce9c6fff0a6e4e845876f7e9b342d25351fe2b1233b4f576db90ef1facfa617b96d17aa03fc824973e1c80f15e5344b0516fc28424b7faff47ea1ef4e47f6f7b50e91b8fb14027f05ca7e1bafa266a4b952cd0b9e4cab82bb4d61f99568e14a6772f36296f5d19cb04fa86ff20f04ab61d1a6f01e5282c99fe4c3254da46fb5276317be58e94b1928e3791af27dc6544f6d445dbfc7275fbbea74f98ee4aea647b654909f9fa9c88312d3759099c9d0070e3db6d55506813f8b7abe602964a7dfb9387f58e237dbf50b4185a50b65ac099352dee8695017e4dac644f42aecc3e415333cf76b08fc764a721b45d7b74f6b0a2e43637e5b4849218d3d4c6a01208f345d76af56631590e520d6bcd82627d2446b45b2c68e0be81b3924753a54f47ea27b1e08de2399b34470701c9697eedaf3248db9b28991cdc2c632fd1b376bbda279b6709d5033d1c0a3ee573bdd222ef1afe8a4397a61fc30a4e94bdc55097ecebfef6c00133dc0b72c17e2f93a11eae9fa9f1364f10fa595e8e1623dead10caac068aad3967b9ab2837dabcd8f96a77a25baef16ba84bc93661ed150ffddfbb0369683cd021e8f959c2b531bb1fa95d7a574fe5ff9aae35fb9b4a0a9829c59b932ed8634fc05ca88211da3e30839baadaea8fd9843e0e80d9598a7282500d157ee579cda5d57628e7506617d301c2adec5186708f94f069ed7bdb70cbe88549cefe1673d48c9bbbdc01d2af03945cefe6e25f757750de64cbb9d496a25adf7058f5e32c827fe75e80ba0e834e6a72344dd2aac4228828ed42fd83e4576254af5737dcd9b6c338377d46baccb02d00fdffaac12133ea0e75e791593ef3aded4ae4c9249b8d5cd20aa28cd652b9d750b88111d9b4fbe729e27882206b2f0eb614d7daaf6436816fd80d452ac71c7a7f9e8c595287407c6ab9fe8a242e98da4270b4f1d4ea7243c27f89ed46a567c643f31f967b5f12e518106f3d3e08178078cc714cb6e39079631966a9becd6f02c18e983ceeaa2106ba9043f9985b791027eb5dddceed563106bcdbc48a4ac64bd95e87c708a8cdc33811bcd16c35e193203e70ef2bc7203183fbf60d46bc581f1bdfe62387b3e6c0c4a29130d872c3f8b134e7dcfb080e7e03048c49c0e468dbc44eff4b02e50bc6889cf7600fba58c0ee409ce948aa684baef4956fd8fd4a9c4c49e84e2ff314b7900b179fc66f5fb4affb9ef7a6064354fad8c3d2d50e6f2157576f864a843dda8f547955c4d80a73d4a86b7aaeaecea886927a5ba0e97df740ec7e8b70bb650010df55d4b75f478b07b205b560d45de666d84206c1bffd02ab7b8d1c37f21c47d1711b89d16214d8151a8e75eeeb5c54c39e5a855d578708d314240a064051d8b26c6183ce755be38fe9597dd5b5d198532b1db083a4b856b8dd60bf1db197cf1df852eb6daecffd97287a6cdd4c05307722e0fac798507f75b03e9361d5627ecdb56a3b633938fa61b2673efe6c6e768e4e7055e6c1d55c7113efd3e95151b606bbf169f4296455dccb93da370150c54fc11b3682f092f30381c6ecd218a3d9d39442c8bea61d9a71b174a8b2c56e028689380879cafb7c4bc2691dda0cf6ada039755edf93f851446df9f63267f8b8f030c069fabbe6457d4f63575b5905fb927a5a720d52c351bfbc48f12440a91471697e6b2564b1a2b314fa0e6dff090079637287b635d875f120671561102ad27aa83d9f0cee41bf023bcd703ad670b43ae23bf01713650834cc1e95dd486757f0a4f6fc9337bb95738805ad5e756198579c886eb0ee77e4ba957997dde0eecd84e4c9171c84ad8f0cb23c6a289e037f3a8beeea7965ce34fa47cbd727baa4ac9e6dc3baf17049fd2386674b246aca5ef6b8496f1d17a3175f6fee86299232c7fff682f066cbed895155d475bf9fd4b5571d257534c88c93377b1a600d4c280d42aafda975eb32c740073cffa610b5fd2dda7262a2fff5da7a0f3a875c62949e0c9247827d7a49bd8185bc27967124c34b9725ee961bc8102a029786652c2571be6cf33be63cf867c2b48e5826b31b714a415fe05c27f0862a870d8fb33200719ef4ac8530a4ecf2597b4a7f2e66f078a7505803774889a1cf963083c831f46725a1ec5545d8489e53921d81f80ef99f5e51a2d5992c7769c2a7ec8bd8e0f2fd81de53c7b69b650a2d838b269185c5efd668c470943bd956e3c5e1bba5d3b927b10cee68a75372d4d6fdfa6782c05659281bc9bc56a2123967f4f50cc7ae3379ba21e1617553354b5030b3d3f0092c1824f5d47b97e6b4fedaa90aa2573e1b115ffc72d44fa8209fd8d372c8dc9ee00193b47c2a9a302875da331731713243d02eb5a57d5dc51c35988ffd742ddd75c191f1eb2c2214a1fc47b82db8ea708818262d9583f2b1b98a40b6ff6e94742f25661a51882ef28475aab12d9422b6ac48e341cbd6f38460333b5fa1cfd4d0f43aeb46c21938468fe3f7bc771972246156652d2c58b18c8cecec2dbbc0feb0fae9f6bc022e029111f94e8913c0ad741612a1426b53cff73fbb24fb7b22ab750ba1310ecf339fe12ced6a3fae17b4c429550794a8d68be891b0e30cd28e81de2fb2ecfee58bdf11794951276005eb8a5af21e03c8aaeb595ace652c5ce60a8b98f6897d82698ffbb2e02213e50d9d3f00bb42c8652d22bffb87ec576ef6e206ed6c846fd5136a87f38c9ad899371799f35a6258878418830b04da79fabd80e7290456fe17c0850a4c20e2e657f97f4a53e1a3db65bb5e71bf38eab9f56aa11e6ef71c85b8a28f04c271", + "ea196b6a64be4b0799b1c2f72281300c3a2577db44e5d3606b8b02fa8fc46c7aded7e442", + "7c86a2c06b7520d60023d18fe73d09c514ed07a91d50d8fd5bff00e7550faed1", + "952f492fe00b26028c560fc6", + "b3f3294815ce461c8843172efe93f73a8254e58a0e71953e35c15aa89a7bd9dfee967853dcbfba73d3b87fa60449cbcabf13b1206d0cb27d2c3fedcfa695b6d41efda37bb6db35449bd470a23787619ee48f981d3f0b1c8e121725b2289b6d67858a4f9ab41683bdaec8a913ca2cc292a9640efe50fb85a1d1f7b286f45d4448f85b3242f45ab44e3281d759db24dfabbae4259f127d6546ecb914d7e93e2c19230c67fba8a6cba6069023ff7ea3d8a170289c2b4391bb97a7b899228d032b36186dfbb29ae8f0e6c06d753f4c6b21982d49ee682bef50a5c2c8434510c5fa2b9c0349592f33f8d7ad6f7243d42b292aee6d210c61e3f898875b91a17a89148275031b74cb34e628d7b701775dbfcf87c79ab279a73dad14d8eed365eb9f29a007b7d2ccc07ceb8cdcdaece67fa0166e135c9a4b939426882eeca98ab887ed2e4888bbebd5afc9f2da3e9162527262b0fa85903246bc8b80df3060c890ebaa516781a2b2a138b98001287e12a9c68471912dd297bc0beadccdc31a27b7c726baf31510cd355a28e4ef786b30084af66ef135909795aa73814cbbc6552270d5e11d46e9497ba30d6d8cecf343d16e7e3357bc9bbfbc7c1dcaa5fafd8a9b07056129da02e6228886463474c5af1d670bc14cf2868b816cc71578ad807a37477341c8192bfc2e8b1f7bfd58827e041f70384f92bb4c6acc415dde5099a1c2b27b709f9e53d1dab07c87a042ca4af7a2a6ee57b37bf2bb42259d372ecfeaf1dc55ac3a9f211f16fef3b2d5f11dc19fd1f425c14779580b2501ec6e0a84220e7e12baf9e0fee3e8cf499a7fba6721a746f598f04ee8ab4df31fb8fa5ce2d2419d5551155c009f2780cdd225ec2c19f94fb9c8b785ad4574b4da766eabfa696a1994e64a2518d1bcade6390cc683a6e80cf8b163c3e58cfa1134ee743079347f08a89c81478668df32ce9cdd7b853db5cf7af13436f3bbb11bcfa8f6b6d727a1df84f99fb3a5c248b8fd5baf669b68fd9af45298030f3251bf0351fa9b58b0b9fba53ecfd838300790ebd689744c1b7b333fbed76c8fb96fc669ecc6695ff5bf8379dd2a3c270af858cc60894be8922d69fb9707bd2a7825f2eec4a5056e5e91714f4dcfa86974259fcbfd5f20d55923a0a9936fb20e5ae9670e2019336e15f530c0be449fe355a7a02c0938d60720d5b8f4f59d2e4213ad5251c6058312b43d47c44ffc8946a98797f5ace279d3e126da63633c0eff1c412febdd47817aaee466c639e43637c1e179f606780ab490d3f0b3c2d79709f1262305fc87c02f68da2dc32f8c544e7b358c3a5d2c27986a19d13fe736c60a3524e94caa55e853eedeece985d16bfa6c487bed6583436cf82077fcdcf90a05f49db50588f46550f7a0c3a1cfca902d66d25dba8d2c53bb5557cc1d87c8a407898b3c30c4f0852df92d839859c191228d0a47324ea9ec2e0ae84513cbe4ff4aff85e77b8587f1044bcb9775099ebc2f28fbcd1cad58a8ce1f072f2228f559fbfdd8405d86f8262c27c3d95e01016b343c6a4e59dec81b59bb6e3c6109a4cffffa85e9752ed2149b5624417c0dfd1a27bd2630bf59814f15820c43bfa317be59ef6f433c95e8be154a8ae94765bcedadebb717f0d8c24e01e1952bd104ba9620f067554ae0faeb78f13c622c45d97b2b5774a3e30cb07f2cf0e8b19d1266d8a8861f3772305e24ec5c9cb714806c7d705a3bed6385f8be4e12562e17ec3df01afb4ef6f7427c48a1bc0e64fc65eb1c3d3ff2d6687e4c275a019f5ab5c63bbe47e3680fb1802d5835c4d494f0f394de1ae47f81eef005127d0971c4589c456ae6a69855f35635c28b590c1b93f155fabcab59b6c7cd8ea1c4ed1f67093aa782c54329cdcf9bf84a40400de707b894587d6e08cf7fd72fa45b6709a26e97ff5ec1269b8042358f872a79e8c2db1c7ebffac014d6b6f71b0c1c1945ddedaf5b6911668059b61b55eea4737aa307c829309c9ea548fba2bede023849bd61b5a467cd1ab1c61205ce64301e2531e5d58d03c74ecdafe1f5b74627be8716cad0d0a0be60984c9f9dfeae24a6c4949170ce2f589326e0a76c447a578ea3a5e4bd9f18884f18843eb1a78aa2fae06a7569a97551b227c34d429c8e1c8c5417ced93c30dcc607cb32a365d87328aaecb4ce57ab8e74f0d9099e267cfb747a3bca9f76b5f6dfb543bc4b5c06c3646062ec14f511058eb2939601913f8a0f1785249cb72b0bb1c12a9508b23caf490537eec53f614f3e06592eb61f75c1cecfa514cf7b500b0375095d5db74556220131390b77d0db72711c0c7229a5769b1d2b3f5105f3a4370beb1cacbd93ce32f89f1fc833c7949211dd204616c013a3399a22f5325f1a00008f4c8ee7dc5bd7476848721fef843123a6213cb0c0b6ae84233ed01a77a115d06e08990b8e60cfa4f41dbc9505cfae76463278b6c6b5ac7c3b83284caaba4a6a1d739c392528ff5b06bc3b82e98060e3001279a44aabaacc661fb14e7581d1235940cbe067c6b386da09454e0467c785ed0b65d41ff4cf36ba5f63d3ff2b45c11c6c22d3ea8ebbf1d52d770e0ebf2ba0c67c7d3641c145cab474a88119335990137fa82a340c2cc8c453752a3aa801127a47aeefe66d1af1a26ee1cd0e6d935bd548f6ce33a9c204be02ba08f9fa03c685665375db7c0c656ddf3e441ddd96b0d2018beff5086cc63339f26bc8332a5e6a1422bfedb69187a3443c23b630a28b02f8075faf3ff2fbeef6cdf02ba4af47a765003de2254b69f487bb5d038759a33ce6885611198b81b0b6fc5d7a531a7a90dbc3556aa758db1657698cb3698b8207b1c1b589efe5d52790667ac483dde9543953c6392d5eb8afdafa205d325e314f810e9c7722cbf5bb76fd6502733149bf21c60717ff5bc366b85ee9f206bb1f330ea72f61a9766090eabde747b1eb9c046cc8713d5a4f8d4b7dcd7c61f2496c5b467608cd9260382b8f11b04c318a5ebb6411a4c7fa060e08c295c6062ac644bd3d10bcbfcfe2e3748eba66f65d904ff21147faa8475f508f21238d42f62b697249b9fceb905127f7684c8130cb8663f09cd25ea038078e1980237389337d1446c3a77bce41b37b50b9c3a020526e7b7b3bef370cd7af71b225700627060eb65693899d277ed130ec5ed9eee75d4886f31aa93bbf302e0c69c9c4499396b43dceb67c02fafaff8b56698308393a03f60babde883f00de2c66831f024fafaf98b2fcf37a9ce01d4f34e95c9408395716dcf83fe86c7a0f5e3e6741c3b63b6ebe9964f1d5005eeb732ce66402007beb3e6a087053", + }, + { + "9100c5b2d7c5d5a854bce55e82f94b89a268da7b66357a661dcf75cba10a1b320ae0e4e1a5b989f9766e57f867a3810a0b5b857191ffd7aece4c796f5694a2617486421940cc12b63a6aaea20d2fac188b318a1c3061cafeae436e04d710654b96a864d674768caee03a50ed6afc06f52d90115df1db5c9f1ecaa4f5da094070b1a447251ad3d4fb0e24e87821ee6d4e7e7eac7059080f77d2b36cacbdac1c6e5063946a376865458c4ebdad3c2afcbba8a82b01b03a7882eee42eab904a19e0aead4ae515b02aa2fee74f3a114bf5b9f320baa35b3225491653f4a69e0d864cbbd031d0805b727e42c2b9530dae0c01cfc6a42af8ca730e1d67b4bb743a072f0a38008b937209d534c2284271344340fae76af2b1dd00cf44b48ab8ee92e8f9cae8845e5a8d338f505cd1c19014018bfb6b7dad487e7c8c32064421982c1a63149ec16f2bf4fe7b50cf3ce1e33d6cdea8e98bf067077c9a0ec1bba6edd5090273ca719ebf6f1a0f3e56f021945cff3c468b2dad92a947a06a024758d7505a4a1bcbe9da3a03e97859da99ed36982a7c23572ab60071566b749dc34bee1d9609e87fe32282cc9adba633c9ddcbf359ef4a83a54af5fbb5699978b487954a907dc9739f4b3f3927e66cf0c338e31c272da0cc7795c72dfe60a5b2e73bfd77b8c6ea58122a913910fe29d3360cef5d398f29b024f0dd225183d538bed2b076989aceaac460e3d45e0ca7941897f151261a024b0adf6d5b62429420144497adde6557a3c53b7723471fb760b6a8b1dcc2b327cd939528f5d7bc16ec00ad99df12f082d82bf9fb7318b3d3ce5b84ab1e38d2ebcb6713c03fd0d62bd083c4af96b4316ee02b6953431c261278aabd96e28f81adf7946e3664446135c825e45ed916ccb941350c84523296cadd5360bfe3e16dda75db10da1f710fe796f3456f0911294a4735cf9968656345b9c3049ca47176194c86f36cf702538df699fcffaa254af15b198ac37eed0837b00cd3547e496ecacf6136c6648a535a235059cd75a3bfd0bc49933b379b72e7a8463c268faaf05f0b27256fb179c9d4c923a13ec6600f83aaa2bee13e30c8e676040c06aefc65ba238a29d403f3a8cc164a0bdcaa1a5f54bc1d35fa4efee0c402eccab1e92f6b0cba94e1bd87898a9dd3957a7eafd9d26bf70866450646090833d4b91c032428bdb9097b409305de669a58e44931b7b428bf1a6dc56177cd944b87b04eabd80c64e287a5758c83db26dbc06f0c772335363ea2fb9f19c833644fe3b3fbbbbf5f9d460412d287eef862ae676f258aa45bc8465667601e9ac46e7d77693936c8d67ccde94e54d746b785ad26aa38ca0500105b6870790235e780ac50b9e3198f5fe678ae3a4ff4f1d4a2177edae183daf2de42625845973fc544907e27a90d868f8634c9d529bbaacbd228a5b4ac7fa68ac208e207a022cce4b24a0b5b5791eaddc6b3b3ef6e5dba41855ff531de9bbca0a39ea743c0732772bd32cd15c4b7f28a6ba579d902331a88920fb970aa75114e14b891d42cb947e9eb14feafccf1393796b21099e52b21773adae8e550f93364b1c438dd7d7fc76994c51860b652974d04a7e6ead207610de149f231422595f4e9ced1674d98d0e15ee841143ad8613f804729524e8a5f30d451611676f70a60c5dcc7127497f4d27f35e7ba0e48f98e9022e0deac400e809170970867a1682c7d2f3ef2c632c44568abff76f4f804841ae462c7247147b6e1debe48802674fd55b2ef1be5b4604d5f60c35358c7d773ab3a3ad0ab81868c6044d4e06a48ddbffacddadf813a2ce09aef34f3b60b666245a032f021b87c81fc506166983f25930cff728d399f6dd48ea1c745ad2da7f2cdd9e3ee915f708db0d1f3481018db1c174ea950ed17247bb8ebc065186758e5403bd4d19a445e4a15519326696e4280bcecd1a903f525bbe1e521f94d79df8db4b35f4ef7bd990c0f2c32789a75f95761ca0064bf251fa00b409a58b979e56d2c44bc2302552f118162891bd78272384c739c0c98bbaca3fc46fbb5bfe123eb25df0e27343e38b5a0c2d0774443af91b64b9d4e0649f20290edb84fcedb3bf4ba491bee8754a32716739e5ab64deb6c9888bb9fd2ada1629a59b16934ec5dee3678dcbdcc7fe5e2f3833da9d1281669b1d108837eaae5180396813883de26b957037623825b0675df431fb06b35191c06229f84cc849ccf1b1e079efc2e575331cd77b3297d2908c048b82b7dd14883f3e707bf6ca38f87c19625bec47c11f54988a97205d27ac51a32f19704391af72021b78cc4461386dc3844a1b45596fede3f70e311eba92b1d9ac221d3dc19f3fdd080c2169348f2cc8c9380e12a7ebf69efa37bda4ca6f7e66919b94532ac43022c0518c04d0a8cd99e0cbac88b7a317a1dac5469534b4fbc64080196b44498e149b0a196bb2d6f59392a21c4a4523ec1ff922a52de790e42810fd9355471169d22b734dde4a3361ecd57e271a92132a8b35cfa91d508d45618ad8c6c1ea209405a3d1d3ee1535caeaa3f20546052fc13aff7a584ff79db1726678344098d8563caa2a2abf6fe5aa03d7af49dccf1b17be85600e7cfdbfff54282394b0fbeafda615185574fdff78d59ec2a26dddba1c531a1ac007cabf5be2e2f0a3dedb9174e0a9da5597c9de6d68911fc66ec9d2b1e3fd71ebb83147ab14384ee303d067f47a324a01fc187f54a98f1b0848fdba2ceb3c18936d503e71887d548c4dbc70b7eecac9ead3393f8cb85a84f1484f2e237b36b6d886f54a0f629e8bb05b0c6839c722149a5b541703aeac04e6eb230a5659b12ed0a668d018f75bc94258218c1f5390b9aee4c0b2836cb76a47da649e2425bcf4cc15c4d51d109e5f78cfdb88137c31b2510264e46f1c4eb6e6b3450ad901ff9517b47a24d508844dc85fc5dbcc079e2d09f301691f401ff5f36500cc66f0617eb4dba389d427c7ac778d78438506608f0961f818a2080ea56d0f61c40fc342b49ee63e730df61f757387b9089e1987977b7fa02d87aec2e4be24b8bdf7fb6286d190f9df870944fa910df32f178ab692fa56b071f57366a3981f51800ab416dc4500abcc19e0c6aaeeb9ca063470993ec749a0bcbd07604516b1d51175ebedbaec8986f67a4d9158f75b5f3bcbe86a83220b4fdf12a0242951f94ac7d52882b1b209b82c4749753ea4d46a60bcc4f3eed033bde2d3d20c25cb46fd907f7052217a0a4db143b2efe8875a59441f4d22ef70d0c244b2de6a7e15581e84c860a6326ae3e3aea6d3972e2de0623d2d852c9e65eed318bd3d86d29595575df60d9050e1740f884796b6657718a294adcf2303adf61c6b23933db93885172e82a78f741b8efc6315a2c88ccb6b11692a346cd82a79334e0c610734e61e6378b5e2ecc161d924778bfcf4475805a0823a0d5a54768d9272ee99b7c4a81b3d5dfe1a2f5ff34", + "3c77f30bbb698b1571aeb54653fcae2c23dc16be58603f0c361eedd813ec0c4f63005a1e69e533da93e820e6e4ce1308aa29c60289060ebf24fc9738e8a4874ca4e26a0dc79ee75b8607416bd554737f", + "0223c0a6052bb3cdc99a284fa169ba76be2df53b677642a606090a9267a60769", + "7d3981073f90c6648c5e9c74", + "61ec5230306b70113f67b340575b77ef76d521ff75b754d551e4177591a02351ad382b2a4067f2b3af7e8e15431c7133e98be9d8293d17ef40161dbad9a4f1a4f30cdd557bb9a8b03b5f1b277c850e23ecfa0fc2ab1102e4b1d5e836a606883c3d43527fc3aa26955964b144a9a56cafa7b174d72a0635b80e7b4f871ead3838a955a14c4b8c5c3c66fd86a5e4ff10dfaa92105378bbc5f76ad29727e5bc4779ba3e6dc19bf45020f6ce4dfb3400df05cac51577d58eec21b22839b8f055226b204e641783bb3305b4461172f1c1d48eec56fe6f82aae564ac6688d7b0994747d9b23a24418e69f8a4fc548f854f86baacbdec78b7597b138c453349034c8cad2ff272781e0e6799ef2f8addaf18528736aef21ef8c2d213161e36b2c7815fcfc40747626e0165684e46a9a2275c533d548e52a9952a556168195d602ead86f6bd699e97ca59f4cb2050ff148f5bdfec358dc4542ff2f700db9861dfe5ba377ec7fdc0fcb2501e72fe6873c7cc76b95b4f300857f76e6e6e370119f403b556115b19fee7009f4f6675ad2d174f44002e35ddc360f309f20a3a1dbf39d90d7e5fa2106c53afb0bf445e4cede59cb50b8a7a2c0961d00b2c251f2d815309f74a46a424838ee87f1229273ff3b66dfb79e3b1ce11bd60e061e60e3f37bd7ac896b618cd78388590f44b1a276b965a4b95f2e3a7a175b30fb45dc7a71d4b3a1a33e98af30dbb46a217c50046ac21b8bbe9537c02f05a5780c8a5d796bd6424fd9e9f3ed5932069bc050bf4a1898a0ef0ca756aa2e2269b709cc92e0c5192ab49d692143388ede2bde4923c85eae8f59db5c7711dabeb33743c692be6dfebd815456958b5e1384a109f891f433e7b4a1031d4f30478b05766dd97eb964a28f2f7b55aa6c27c7f4ebf4d47ee8709bf99915426b3896412a855798e392e111789213af537cff7a976b4509e0eb6ffbb8e886a3596a242d16d95109b0ff562c624e06636a3611f804f9b2e252afe8a4e5e868b48e9e734f688f2da2012d7fdfe2d3aca75fd74730a85aae90353417fd52b92d28a5098b6af358a096b859859916bcd5a8f779676c6e04ea461fe62872050af92d08cdf1124bde1e889ace3c923457ecfe0a635ec757907a131ad7c2ca3f60e1317880f843c5e63f4ba59ab2882a492dd1e070b070af6f60e18cca29541206a7b267c3f75a5327fd9b8ffc9b36b57b73b36e586541d15c85253e17a2581e8f8a1518f275cc79afcf2b5c88a16e9bf553e757df089b5db90a9dcdc1867b788fe75abb5161dd7ee1cf37d3f0faa793ddb1bbf1eca13f4220ea63af8ef7c0e7144d999ba1c5a983e74d48cef708c1d28d3c0a168ab87d0ef70f381693f0d438ce013ffa2cba65a8cf6b498a7120209564535b7372690329cdbd74eaa76765962720f06aae58338a10064ad80f5a67395db2c31d36b1f5eb777306395f192599d2f737327afdcd9f14b3f24155a3f974915d3302427494fad756703b13afcd1764ef9735e7dbff920f1253cb668e9f40632aea1e0b4620db162138e4a97e6f0729b14be4a7c3256250d5e7423ba1238c704503c51cfc9cb68db7001b2f597a15e77138beea02e11e0bb98a72f2a77b7260e9172fe7e60483114ddd836addd966b69570db5eb26a0cfc4f8a8b80d26357ed51a70165bc0dd11ad7467688025bdb532e7222ea12f23c44d08d111b0ad4acb2f5b3d6b45c387d541ffc84466ed57acacefb1436ef00bcb5b6211dfd0650113ac369b9f3e4891acb2693c377467b1e9c949cc0ea6c4a72ef9292964275ed397cd2b1ed25fe1aa8f47e90cde362392da5e53893eef6e4f61decae1a75e3b726f0596f09c3cba62aa08bea89984b484d5768296a5afa8b0759dceba530a169d22b81979212b3343db35ce4e4766dd251ea6a47f5033cc090d6577efbed441bb4f8944937e812f12ef17ede76df621bd4cfa31567ade18b74583a2b783279150d584ca13c0d4784b70156afdf9be8ae96666b82def888465cd3df349de427d5f5b3572e4f963d33f968e6780e381ca196bc04a6664fe93fdc8558b21b84130dfa2a646950eb2e927885925af46d7a28d1507bcc3c02ba98318bfebe5b9eea1bd47935ad869eb701cbc35a9aef5efad88ff54eb350a34ccef2e159de8e16135b81105bf799fbd86aa11653b5ef93a1ab1c367231d61b42b8bdb4f04d8d05396d53247d51890be9b56c51cb19eec0fd1e6b8cdc98376b6c6b30963ac7ab02656ff94dec0e3a0eb3f3ffb8bebd99d5889df98e6c77093c370373dd5f17871fb334c7eb12c6ca22deb75bdac9eaf24281c965dffe03da9c940e13fb382fb6be332797813710a7cd2e7720f5b9e53fc0d98fcceeea4a8e9f787e670d60bfc4a849f34571e5d09b9e9c28cdf2b2d888eca9bb31ea8b9239bd19dca86880ad3e12b1583acc3a6d1f0a438ce3b5a337487279dc4ead1b214272d455e6a2c8cce4ae3bb29abfdbe77a67ababeaff5dd9c96b17f589cd4615c0209eba5e4b1c7167b4b739ca4b9957185961529d1082226f85068890c94aa1f1c244259ef7b120e40114926a49c4412b67b4caef1ff3ce6f3aea3c6107b830cd34df9f4d73d7d978b6b9d5c481e9d76e83d649e742b098334838fe50d80975fb567642d3b72c461ef3072ebb1d03c0099e97575bae6a12cd2352d9d296351df6965d736d7568c2911394a73d199743526ba54dd62c56c598f4e78495c0172739274c0b8c96755e489765723a24a8704093a94544f6c8764dcd1ce6b4bf2917cfad27d85e4442b4e5bd577ea1a88c2b79d61cc1be01ee9028235b36444483b4e45da1087bf6d45ca540620de5aacc644a0d5c4b807b582c7b058e140eebca539947502bf73c9abc81a0e3a618b39d3a38c4ff7f94767fd7e6b9eb61e629806bc3d183bdade7e369d180dd2f57fef677e22ce41be7224f11723a85a3f1d14d7b72dc98ccb2816b77e625ce3db3e2c5753af8b079e0d63939079a01910ee4699cb405d4d9c60e4ac86a7fda3a4c9c290662afbdb7678c3a84c87ff83470fa8a416511a06d3216a1445699d7ad7e6980491fd596d39762d576b08fcbf0825243c1fc01ec8300780857c429c607113160a8354f6699b368a87983464472a5754fd58943fca6f6779764fbe6cbb510d5280292df02c4a7ed9acec8c95ad67ebcda71d0f519ac18db9b43b28244cd34fe02c5d694df57410eb54c5e1ca0f8501e7776a811d7ee81eb9d8c80b2ca50a012b5eecd5428af965b217e7fdac80be88a01f76d473105b027eb557a523f13c55e1670ff34627667649573e0f19dda41c525a8c96c2866a88bd73e66c786767e1657960f6676d8a22be1c6024158a0f0e4ec761148b5a3d8ea481d8fed94855be82479ba23213190054f937838f0e35e00aa74c89b294c29ea25ad7e96b4b6fa952ea8f1cbe5397b7c86d0b74ccc25e22c88736b045fe86110bffa0679f28a1f27162b51410498cb7", + }, + { + "0fcff2c29cbb5cc40bfd2ec573ecf368275ade6a00e5730b77dab17e437b46524b3814e7f470acff6ddac4e0c6b748ed112657120bca1d83a4ce01e74a473995804d7c74bd28732a02370ac8ef52b600790d1284d82f077cfe096448509dddd0eb5944a882b7d384efdd4dde3003dea910f12de82035651e3ec9668e66435f519da3fa1f5bcda34aaaf028daf3068304f7b1ec18e65136241a9db281e011d27db5cc9c1099405a4430821e2488a228805314983966ce5d806b0f014c21d4c9d6a066e63aa6407ed6c29cfa4a3e22ca913762ca9d31271d9c371fe858f3b22e931814cdbe544b9416e88f6026b12bb8e88d8285beaaa35be1c24339b5f567480d7b16cbcf6160e549ef4570a0702889feaa0ebc54b11735735b6e2850d5715e5087291fe8890432784aa219bacaa2b874b075c9628cfed5e76dfe38426f9693f6bfb2de49b710c101b2dabb7c7c74f12de9ba8f75b8645d25629568d12bfbc7eaada63364b6f56569cf21e54c95d6797e9008f3496c506ecfe5d6a010d168fb7f0e2ee3c423492df36a133fffe9b87d7ac070c32cc131fba6089cb7d904b25812e03cd6048504f7ef1736ee00ee6b7aaedb3dda9c6fd6437772fa5076aca9888ce55e906a62875979bd477aabb2f4598d32342aa10a6d187c6768f213117a9ff6d830603bb7b9b475002e20b2237a4055ae6af6b8d70e343e76265188a0f07e7820dfb3d898684d99966d4bb9e78b0e95f5044dcc12810a89a75b11474c8fc06c6e734407db91a072ffeb2be6773a7c6c3ec939514b43daf29feb3aeb7afa57e96d9cf0492d90bb2c7be613f2208f5f5f5898b0a3db8a967a75d065efcabdd83759c88086583bb3d422c6c6425525a1adbd515199dbe71350b77940813618b88fe139153974c80d968ed4d9e3f97a91b7cce250a7c963f880dc38011250b9a131f2b76b677f78fd0e4cd6f1465182fd1d644dc42db0bcad8df4ae9f456841765af8e1c1775abf85a69577ece6f9e9035e36c88be784397479e713be4f5434aa4c166bc4702a4916c0c003a6baecaa182372a30af6dc7e6fc4912d13e662bd327829f6e85340fe130001babaee64d211d6761bcc52993c162a692a10cbe7434310392b64792a777a2b31341995072a6b7d4538cfde74e609dd1019a9f75cec0896186c0f42e3896d15be87aac5b11642f74e11d5c2f7de9f07f848ff543507ea4d73fa8f5683fc6b41831606352c482c7a5a013c51e0db59d824582c595f17a6d2113528943194d6b5aadcead62516507f178cd0f76729cf8b81fce4e0138ab224bfdbb8f16f8ea6196b90ef90a63f0fbdcbdfb5320984be8a80a26b932d1db7ecf870dd67fe838069136ff9b9ae087779e82cacf1b06a7b310ce6c439047c26fcec0364ea87e4549a544d540256cb7c3ef7282fa792aad89e919dd89519fe910501f5ef88da43232e917730e742ac2539d454e066feb9058f56dd246fdbb674dcab636585a788b338ffe41f4190447a65985acb9613d02669ad4ad888004c65acb0ca315752e58f51c9ae9259f20cbe8a668a207a5a46e30891bc909108f53db8bf6f0f11549e621d4cf4763e0035c867bfe9e1192fc421c080b25289a78f4167fe517852efdb6f3ccfe67ad01b4337da2c18f35bdc151c5dc76ee66efd27d5fc784e4e6829bea4f8a41ec8bf61ff998d178ce9f4a10551687337d7705eac6cd7fabb3f2379e31c1d01e4dc63e475f0fb01d9efa3de400b5177e2c2d68f2ead89e9ecad62cfc97fd0ad5b3391d0248dd2fd7c75dcbd802d3463ef0af21eb77b07a3286a72f1e9439f457630159abde7983a5c74f7dda12b40913632afedadb691d62003c70a46664fbd976457544cef8ea863858505b1c596e7f745d4a5fb657b1c694226afa9756c40d9c49425b323ce17a8531c5919b24010f715b5f27a300ee37334931ca9ff5c83c3f0a87713768ebccaaa15e35c56f3536ba945e5d954c94c885c68325bc4b51fb55d96c8d424849ece9a812af0747d5b1dc240f71609439f65acd1c17086e025e376eeb79a7255680cd692fc4b0f5768d1985fe8a1a387074f58c8bfdea8e5c11ed379b845ce2052a5b24ef0c1a658923eb87adf5b01e6aa59ae6937564ef97421722c67404cb9e5fe07d5bfad2e52ebe6cccb41ceb1eb2760545fb6a3582bc4ca572b0aa4e4f0a2ecc56299f3b485d980501a4e010576615ad518fd2d43c1f79aed013ed1f1e1bdb74357aaf7dc84772c9ec62da43c8ffe11a7fb3eeabc3584a936c37b28a438dfe78f89de6b0d5597ac1bc55057544e68fb49a6e505db69af122c2a3ad06219b7f2a2955db0ebf55c06baac5e0efac609436dee484857f75a8421945484ad0c7650a1d3008cc85c938208f19002b7994524878d6ddf85c763a65cb72a09c3a059657459f13cb584bfbd754fbf2de904517092be4f1786b2bde26ae8eb2d884592fc9e84395408f8117e47d1ab30d5fca167bbf07e41a33c230d240e3aac53cda9f251e24659da57d721288252fe7ff3653ae3e47b86209e9344accef0009b99f2ec7b3845558f1d77b89fc9b61ebc1b589fffd3261f71b9631e87541e22ed100e694854bed771358f10fe452fba61875a605b8080cc39e3eac13708e32518f28e60464c38b782c7c7800df63b6e7e95ced9154ea54e32900f6998f38eb1e51c112b6949e2eb11a96b1ea0a68c1e3b5af750a99c9fdb2cae44c5a1d37686ef87b158d19343e23daf00dd558cfb91e6f2e18f8e806abb2faf80d082f657717d08ca4e9c0d30d9bc30b612bcb1a3a3a3843231059dec344c6c04ce625b3fe064092e00175fd9d38f8fe54c4088efe30d211412be01460a6d4ad8d0a618b00a21de0a383de30ccd72f119b27a08958729a999e8aadff21829cbe8cfe398d90476e33db4c64981383a9aeab4a27f3bcb29d4b3d3b3a6ebdd71d3ac546b8658e269959630de176819b153cd53d2091efbddd2cf9178ba6ee98e1a3df9a095db0a2b713a0988a22239f5f08cc8f9abc3d67d9267f54dd5dedbf01bd490b0b09adb21d4e5aa7707e36cf77034f01bf8c7988a2e8dd7046bb2f486878436371f1258f3f7026afee6d7f6560be67103ad098edc9665e00118d4879f58bdd677cf2e6bc631d5c517acbb6db8a1debb4fe7492b7daf0b7ec7df056637c23caf926a1a589bef1db29cd81f547afd0fc9e459f46108ffdfcfdee43515a771c439dbde9177ceaf296a8749be0146cdca2b26be8c2ebd6cfd9b5032b1f7a375307f54c2f622711f8cf8684afaaf17c4da3e83666c40d26adc239c8d1a40024bbf560db5787ed404763d4e70ec6635c6a4b82c10f8ff7ad42217613c57648716ba94cb33129f3789dc86f9c8ec2e8e90e6bba0dfba1bb3dc3215188979a09f33346a6647099ed0e624c9ae10f83da0def840bdb25b718e8d86a616ff46b5327b1f99c22937920f5b5bbd6b53fa0b32f24befa4a7603234e6d94be51f00189a20b15c49e8ee58434a15ae9d10b9cf0204bfa7ab1fd9e006b22bebd22b036c4bb4c9949cb7ecdf01028d9f12466e144b2dbbf64d95d65347013e192d428678f64f0d9306f97208fb00a70d4615229143dd8890725ee3ba6021d38d6359055aa812edaf", + "0c5fb7075f5e15a6733737b614bf46871e29417e4b140bae6e10081623f5c52f557c36b4da4b5a4e82920497514b1e6f745fedbf73f86ee10976f82c6cbd5bc13a917514ddd062", + "e70954c812cac03e367e99f7b82a6dcc073d2f679f965d524872756ee58654cc", + "5f6267f6b3b21423267310e6", + "c53868c0fdc14e891ae1bc257fbb13be210a5d9cdbd9d18fe1b474f9a1929dbba3f25222d8fe8c1be3eef22352100064b922fd9642ad128a202b6382ae0a67c8affb0c5bfa1a80e55c1084cc372485243df872d677a80a3ef1ca3589908bca621f6f50133eb762cb9c05775d13db7dd3eb65ffd3eef96e8dd42928facc68390f6bbc50b17e1ef5ea6310d8756dd177be2cceb63a97bcceaa046794915589ca022d90756b02c22e8634c0ed44192abc3b8b1e2814c855ab27aaae3bdd801a73e6209fdd559ceb59a94fd98a66d12a31a643ca2f4b07ed910bc390f77ab89395d5cd1d783d8940dad4447f0452991b209cfcd998b0c814cebd08f9ff15052818bab0bf51c3b72ac1020d3b0974fbdf4ff941b1ab9c01f284fe82f2fd89c0aeb4b9fbb0a74ece08b3debc7b65e7263e2922fd4aba15ae3cba7885d04127c8e06a67f244e7aa4556f8694a5db6653f6e48d6de54f9e4024d25d3236d4f933205b6a358aa1506f832ef7d556c6a1bfe4aabfce51f3b5ac64bf6ab1e665bddb12fe13db9f07a55db3da3886df36ddb89f3a4939b1e9e5b701301570e3d01c0b947f498dcc6af438cc15e6038cb78a78986da0316cab67bca3e28c95e6b7e6b36cae9202cf4a77a0e15d3c3291d267aeee172dd587a944719b9fbe077603b4d39d4302b9a6415aa07af309a5e1cf7a9379552becdb4bc6a0b5c85d2e63bb141c405afc58a8b2b4188b3883a24eedf98dd50fc54725c440ccdb03514a6f37cab49296b6826b6bc7d7ad8cac0a3425eeb6866d94119acdad468cefe162a29e8831c77aa83321e8ae3e20e968cfe51dbf2b63f4e26c61536e6be4f63d61bbd06af38023b15f4fccb8ae0356d924dbf646bff69d1ac0d6e1c7f40b12d6d16e52d1c15958add5708bd38c514e47fe623a67c9ec211cd625b398fa7fd67a23e6e9f65d42dda2bae94524372fbc1a7e0ab3f1c451c126135536e73c573749aa60177dfb68843752b010e2cb9c1afaf51c94a48cf8ac7aab3fb200aaebcedefc6cccb581848da0121af92d9f4be002f0c2beffdfa65c36bec80e7f62d7009b1eb719d24b96e97059e6b50a52662c2c833738849f342391514349305228b29bfa9c7cf2a931558ca8e704c600148a28bd871465b23af499c11784aa45acd051f276d82789c58b14f12619372be4bc3a285f6cee21d65648d18e61752d6e7957736d3385f8ad36702c451c61ed475997d6d9f11c8be5257d8febce329aa701028aa2b5644b8515a95b5e866780e32754ac2e6f2e31b2c04a4ad35cbcbc25b23e9bf49cb1a5d877ca30880741757c29303af8676546760016f1538991b37cf0cd24ad3b1d877e5e1bd083e4b990af6ff5c0b28e530db3f463d21e76c928c8e1ffaa6c045937ea171a9071827a173e231f50e95430ae4895932c88ce048058ce6d0a50ca5c1842506158e98bb2912a61c7991a2256c97cb9050a4bb3ca32594622756291340561e9e584dd2e096263b6ff8eb898ae86f5f24500320d2d0ebb30d84cb4ef876a877dad23a611b39bf0cba5e22f2850e11c298fa23fed40691b83acc87136f8fa540b1dc40d1b0d0bd489ee9dad785c121955a094a2c6bd3353e142c04f7b88b2eb3305fd00d5eddb391b73fa2b16a6357aaa2abf2059ec979bd3ce06d5fff1c325bbe5c833a101615750613047d8155ac0c3a0734cc6aaeae7cb65d7501cb95f9d6d1161d09c961c0681547faf7983ed2efaf4e0fbb87a06169ecff1d0ee540a9223a73f75584441d4669cac09c2dbdb8aa2aed74eb9a2870f2021eb16e5f5c3e79a24d7110af4bece22a1086d27642550cadfa4f0e03f2c032a2745e1c9277a4f67fa4dc74ba056110fed3a63f643567d079c9430b8d5b3bf57a9b3f02d486d870229fee5462043b6bda8d265c745ddc1b8952bf91828d6db2edcfca7051e74df9dd456dca5e04ba469b9ff6a8130aab3903c05659b8f31cf4ba4c22511493a36541ff9d88c708dfb714d52a3c0356543e6efad37530b598bb63c3724772907abe4cad39c896c62daf5b30cd7d37eb36a7be2494353028c76e8d148b018c7bb755c45d2a33f61944071bae8316881e9aa37e4ec2374aac4f8436ed3c7db2092326538f07fc6644e0239899e3335f73c1e3c4602b12d19d7b639d4968974b6b2703ec1add8cd930cbafff4158f68f06aaac83bb4a2e31466e2ddc247ad71c5f4c49af7defd1394e21819cc24c78380caefb2ce87c0d1050680313037def12ca21cf67bb6692d6e4a9e90a9c9a0b7118ac300c6c6f636337aa25bc59cf1d9749dc183803cc0ccd1ff53210352795c6edb49ff1e5e8ebaee7b3eda6e3c0c340fa60594115e37fab60133b8a3b39d2e63db0bc6a03973e236fca801553912f93feafd8b96766049dd2066f3c5ac9222121ee9d36cbcd8f713adc8779949941f8a8dcc92ade62e46e9f1b292d5f7eced14c3bff50a811cb762ced1f103652773ef946e18569eb5892626627e085d4ffb3102c1586ddf88acbaeed903b22d3e7ccd8b8ddcdfddb872403240bc8e0e46a068f55bbddaf90fffb9a914187aac2ceedf21fefa1fe32fc7bdbb9fd76dcda1fca7b39107d308d11a118e47499dc4092ef0cd28d0d9af84440f095b4feb7adcba198894cd89a324c60ed0b996c520d4b33391bbbef1997256af7ba7ec1069244359066af81543ca23105742fee3480f890373d3205236bed566cd22a62bf69f8c0f27b714f84a203bca1605865e2cc2f9211389e0df7a4b3aab9d10826639357efe1f5fe64a1bd6d06d0b5605658c4d2d12e1bec77e70ea393b0a09043dd7d6684bd53f4c883f2f6928d99ba91873d063d43600f9105d503b11d8dc2b05e34b4fcf18e78b2b6c97d3b2c9249a2f6566ddab2a8a67fed6c9f8af2f4ef98dd579f2d4fb572e178489c503df5d5f03bee9920db347a6e734ed72ec7233387f1579c13725599a33a90915ddf03725dce20fd3806abc1029a20732380596057830ed63b6edcaa4d4418871bbfd58de1d1f2800588ed207f2016e11abd1baf1895f6096e2c75cc5916836a9ddc09cab4c28e53fadbd7d3080088131cc270095315b61011b0cea5b4d64b647bbcea54d20be1eec0992c72fc9c9771cae19191cf6a6f1840acec1deff605626d0a0d79ea8fe0af63ea75e80f8141fa8d7ca6f4c99dc7e78aeacc67762ed0134f1a0b053debfb9ccb145800b9818c2deb46f7124e8655f37c3291af107ed75384afcedb44518ca14cdea341c9657ec638531011cb957ed6b3434b736ae8c8199684cc58862638c5f6c07e1cbe8ae68c5582b1697ca9dbdd01e97023138a9173d6b1294cd99514a28102e6912b1c87ef22cdc611133bcc111e95c355a26b20a3d6f0ead66e932c5e1229b0fc17a7d6f78134c69beb362ca75017b1bf1105ac8970fad48acb8313cb3ff10e9d72c4ff11f95c2dab59575525c98653a9c7d31585a3742267c062d6ffc7a4303a3e81a45bf39e1ce2097623bba70f216aa612c64ba06ed6d596ad6abbdde69d56ab45e25ebcd4e485824449550232be26f987c14008f67c9db9d0f709f567fa44502b9e0839457e5f0aadec0395bf5c38ed8de7529708e58c0a895198fc8b2570fb6e68547630ca7f313526d392ac4776be973205f971854c300454d5", + }, + { + "95a17355dfa9d378a18ba20e58aa4b8711ea1d6e3c65e0b2d3c6382892c7d02768437d47ed50bf8edc619c340be7bb1cd1d88b0d3d6bbf1031f738c4be09eb264c686d39b92cc7958e63c9994a84b61b5c412999ace8a9dee0e2a29eeb8dc537f63271af5f3844ed9c0d86e6913c02ed7d2b862a132f08f311aa92fc3757342d89a5dce8dd20d5792d5c60be9862ab168d3140a061489472f2266f297da357064833ef2554c49f8120ff40b961ebcfee1d0f8e7e5722f049485f72c502c9cc4afdbb70517f0fd2a00e12596ffe285d1b37eb998e0e89d756e9491ceb13e83610a3a66122b533c2c3461b3244438f5f7a7af8088881dfdf6a29fb563ce38c4c8632ada8e7e06baa2686dc6aca6bc944e5c14d6e432c4dad554803912b8fddb1c18a59a86bc452914b2efc1599c5597f87a6edcad33a7728827bbaad0a975ecc22b7748d7cc71ec7f51adc8fe0350e67dcfb31af35a8d7b72391642e29c2fa4b796ed8f535f6bc2b1198baf1cec858aac38959f83130af55c21383ebd57d364eeb0e442104004c1599060667ce5e1191e76a89199a386e5c4bf147206e7d6e598bb27a90b3c6a54cccacb39a0ac42bf22eb40bc8ec7925376a6c57d8eac6317578ac052b72ab773f572ad961ee05531cb95ee5a6d70add4176351960fb4bd673f7db9f698616a8dd41823f2f87924c40f131e6c83bc40ab1f92312f46ee86765c306cf4a1d77275ef9668d80f9d9c1ea0aa7b2456bbcf764e009584ef1c0b4b4c683fee3fa2641f48ccf7485a8356fb3dd22f848deefadbef8050de9c5c19e8c449c6f3ec2b1324f80a7d428dc44dbb966d40244c3af03bcb410a57ad1430615e07553a22686f1a62dc6cf090aaac3707ec5b44274b7fe28c7a3a298e7a8adc71e016944875bebb421babd2b64809be3454f25b90723e2cec68467ad2d14744b15de8f9c397a505a340e85998e207cd46fa18d76c46f458af4ac3821c0ac6cd68afb72c376c31daad1a2435fc2bf333260c1a82430edaf2499e7455a93b1301eada2e12365ffcd36a1119664d0c996318a3e55bb2c04dfc5eb251f7fd64f9d83f27ea6577d748e1f85248355ed19867857dc3383e01249cc37684b0eb8e891aa663801e4ac8f0331b38686a19f0d19f6e94c7ac95ec395962be0a4e3c8358d2f6d8f13191e164ad29cd1733bde8c31c7d8ab90366e26cc9a06707dcfa60bfe139a112db827778ac348fdfe26892fed61db7e9849a464e3aad561797b6c778e0688bbbeaf3349727b4670a2d0a08f317b0dc9c4b12ea85c0309d57e754d0c7bd5c83985fb82f776c968189908a8ca83b5944767c2efc3c5f898436de54fe8bb17224012a437896d9fa106a749d12aff657266276129ec5ac12fc7a77eb06296d2a2a876d931e479d3ea201cbb4b1b20bd81471eaa33786c624013e1f07577c2171f38f0511c6924078a40c2d55ce392dd2ab0885e29f4c06907a1597c181b933853838970edad7777ed394c491cde27478eafa5b7a36520aa0779261f94b957e83ce058298dcfa07b08ecc425caeb6c599a11103d7631e77daa0d9d3fc6f42703d57f2c624ecddd56b9a27b848de7dd28f8ed656f1e4decc95a8908217e2f2453ae50b5fc1d9352d735ce5bc2b538eaae25501d449d090df793151811443c64f28d19eeaaac4081e10edca4c4148e723ade8f7e7b988b732ba08b3ce4c8a0d655bac4ff66048148135decd7727a49ac59d82ad470b5479c55d3d8399b790ff033d3ef99d770e1eacecdc140480aeca1e2167553cbbdef2090c7592b40681b733b0a0d127beefd49bcbe8904c975a5ab8b1afe56d7ed7667b5cf92f537ad6972b876843364817c20400524097ac9b405e4b35bbba0d12355a0b54bd763b4491b2acd4e8e4fcaaf8fcfd398499d4c4e81ffa93ca07a5ff51a1540f178f43a931e07e1ad56ab5ce57a2f7dc3ccca114dc9ba8a6934e95f4efe9f3f76947909b280ea5fd795bbbc0feb3ad2b704e305cd9d8f37d178961f77355eedc9d7f77c58e1db2f7797eb8682255939293c3ef7dacd2eab46c4cbbdf929aac301a13f59831a88fab173803399d96dc216abb9f079e79bbfab667ca590266891c8a7ea4bc1724573e5c5a67e9f1341b5bffaa538e240f78da7733237999ac86141b2ac0324f17609b71c885630c90befc3b027a5f01e33979165ce2a00968c414838446c2aba76e1d7fe3707c742f68af21d30e23b637accc848f6c8df820a27bb4e94e5090ac6e008fde7cf3fdd5931fa891335ec8d01b5d6f77db57a87dc35d6701adf7ae0bf82dda6511c83ab4d7d3460b221eeb3d6c4aa537924db5559b1c6739040534fc330f5144c78bf99f5f4faa715e85aebac043e2529197a82ca40f65a8149a9447a9e58c61618600b0c5ab221420c0cee114a133a648dbc2eceb2894ffc329376d1eb3ce7039cf30ff6a53038b23c26c38739fdebc7b919956ca2e468d577dea6621a8d66b78075ad26a6e6d8e20c9b694698540d516ea2bd108625e5fd038b5f1e19c5d5993b82bfe16897c375322dbbca81c81cef6ad900f0ffe5ed02714c208a12f5234d78e32ee07af155ad1e1077a0d8938f426d8f326c751f6ee66c8f707e8493cbfc76f9ddf1ea329e094315a91ba9385e16c890823db0f0231c7f939a042665009d5edd8e48102c515341fa6eea33cc00fb5d82380d735b29f2eec3f61428f7b186d43fcee46b2037ad1aa6974d729848cf1a80dc8ddb0580c9c876def06d8f7642cf45263a655ee77f047fcd76171546319622bf71283f3bf0b519e123a85765779c8bb201e99981ed184e642f63aa61f9cc206bf45fa6e514bfc637671d9cdfba2891bb112a3cff438a6372ee0dd3e7d9f352ce52f8b367b7799e1f963bfe50638f0c74b94873fcd3d66fc1e342a8bd36fb8b88f33eefabb78eca4dc9c89e2c57aaa010f2140dc5ea7c86cebe2f8bf42a167d1d546cc80bfa9258c35af6efb1a090c293a4cf588e4bdf5c090ee7fe38fd7b5551e71e5ce2b0b5a50bab95bc4c257edfc94d37579816b4a2249ba05c991bb2ea02d047e480fc8a8ba71f48f344c6d20d140a64ac20184e45b4eea14d0953370c237ef0a47a7a2f22997715dd3ee8ea52f24ffe12674d571b3bf968454ca051701e411499bc43bb55bbd033f9b81d4baa6c49bdd49614efd20d58175af868ca16a9deaf65216abbdc3beed5f30b209e786a5b4c006f3bd27d93e9d78b51a1a2fb7f5160a0bc1b7df70952ea1573888ddde3d9dd5314b0d0a899a733eb48d5e6c7274667e362e4da6b37c480aa4d0d8730e66483fb1453a3aefad69942ac7f09d3c571b6275590938c541336a121bdd20722550236a9a5e4a37c7de628fceffbc260b1e9b6417c4295907937b13609b8585ebb8f076073abdcf19104ed80ffafe1b09997f115d987a552be5689c70fe125ca702d2ae4d807d5690bc2e90b72cabb0b61ad203b34c68df21c16b92bf8def5680b204ce327214c32e4363d5600f96162a6819dda472acc6441858f396385a16fa5ee52cc0f9ffef3d53c49d535aa37db2cd4b573ff81d74006677969ec1ad891082b5d18ca5b0b9f975574ccffaca72b805c9f7fdd76bfe3dd384dc953255a5b50b7731a137fb9aad42e77d3da1eff5a7b9eda5814993cf2d289bb25ae1680ffcdf419e073d38b4701021adb2019359bb70ff4cca930be7bb979a0678f20665d14803d8753c8ce54cae92feb026486ba747a861daa449863bd38cb4d5831aa6db1e7f404b0c3587aac8765aeecec686066ee7d11321574f04d3f3da571e71222ce07277eca7ff97607", + "5e24f34a8d53b17bd0c2aee5369e3276dbd7e7c2ea0990f1300fbbb00831b76655aab1e2fd625ecd", + "c1d796f1e651a1ee825855d80206baff6818cc8c247ee6ce62b7531e6e9ac32f", + "240cb25aaae4d085bbb747a5", + "319e968ad291ea5d4a057c38f7afa4ddb9c9565962fa1a7b231e397a268ad8e0c5030a2df09dc4f99402ddf2e0d06e753bf55e1b318b3e5ff0108de2328d3b8d53e23e08bf7d84d59fededd60d47bbb52736b0491f82c616eb5f779c496abd6499555035e4513c8613e7204e6bff8d06dfecd9ce38c6b83efd8d0e41f84f7cfc9ae07113237987a4b2eaa87f7e0a310155e282e57858244e9071712fa026cb781e5a4bfe6fa1bc480e534096394459a3d1354e2d9a54aac6926a60b388410fd0b53f7a3a9116292f37406369c22ea674418c4deeead171e00f74f5cabae5d24a0686a4bcd8ba99aea613a23edd0a019a319daa3779c212fbdca9d772fc3fe612cf178c2aca2aeaf6bce2433494027a474eff699bba95fc7dcf79ca1d77b1e097439a9050a5cc78e0b78bf2e7f50f959ea2986a59be3880519cd84d0a673acb0432feb1945c603e70748445c74600ccfec60efcf9e4d02a7df5f967de4b473f63b0b0499ff4ba350ec1182f3a0ac17ef9ae28945fc9bc714c49909a7c1e2f311aa6ad7652e22e1f48bb51cf53814a2125152813752d86c7f9468a991d0ac84b1a2f3969b8081c228b7f5760718036e26a10e211ff04ea323acdaaddf9b06a08c92ed663d0fdf13fa601cda45c416c2d3803dd9b5ca29cba57e59cf4ad93176c65c64507b1995d638541c90b381ff758833a2ad67b0de44c280fdfd82b3c6d4353ae30b33768863cd3169a2032f26e37ddd57e7da1673cfc7375bf6e6792495a2b434155d684f2a6f2b919f944469d47be5aa7da74eed69d871e6f65c3ae08904a9ad042ba39905188f0b9158fd14094bd6a408fba6ef57566d69eccda86bb54cd3ca7381f51bffeaf8bcc1ae8df91d22c359888e21b70f640d6f3726a34e6100ee269124747f0ca05110f63deee07e3628bd6aacf926036ccec02c0b6bd7259db52ea8b7a686b36ba1d0296c85e43e25d72ce46c66a1e646301dafd2f4c502281e6f949011cea69459c026c65bd130d6ef06be17b23a9c9a84746e39d017b144135025ac527c1e653f233770cd68e9f232c3b623ceda836843b3e9ea313cc6a57d28ce71ccfb7265ce73b06bce1447220645e6f66caeb06b55129b97c8dd8db54c94d771504d24cedc86a8ec706a9f7dcbbcd7fc7cf38005b2913b1cfb77370bd23183ac7b5ca5135a2738cc91d05b2b22640469e3daeb6a7b0f14fc6652563663520f7754aba624a35e5d24529a6ee9f5ef0d019d83c04f5a93a38b68cbce0cecd42a11aae305475806326aebb4f673791f50c9f90894add51a0fd7c02807efd8c1bd21fa717a860e224bc9fa3f40975fd8d558e4844a09f8920256528450d77e546604e2ce2d38efadaf39a0ea3ea12156174aa8a20481e6c1190e448564675f9ca60bcef37cacec5aa218122e7bd25b571ff10f54979d62018b779a2a3d5d7d6cd56ae31efef2c844ba50ff9da88eba7a8e0d9fc5388a805ba4ad35eaa4798e395d2fe112083cce2f11cc850d25ca5c6e60a9996cee4789ca99d519daedb62f4fb1e535b742a35d71d7390117e93821ff18948a78c1fcdcb90a5f1211327d7ee0663ef16ff446e0e22d8cb7b2d3d05469b1c02864f4a87e2d9715f60c9e7be841e308d0a5f6c50161a4a0464aebafb88e0d2df8cefcead93c9623106d5518a9852f320235594be10c45bc0cf06c9daa007100ff97959357f9be8e49c870d0a11c884213e266c35e9131439fb3654fd5f1abd1e778ccb02b8c262753a22653a09272a0c33b6b2683c9045e8f967af756b98dc1797ff605c64ac5bda8252e9ebfe0e4d8d7ca754fcca5e3de3c4b63678da095281d76d60fa12ff4ca818825f346b9c4e426cee16db5818d78a527a901cd088bc2983f9b83430b50683018996996717a1738439680b68e3f61cbdcd0f0e1a6b436af8fa05d3ce2228054e319bad1dc6ac970c75313c552fc1136fabc302fcd1d09ef1b9138d18133a772cbd9cb197ff58c6e898f9e83e4e27206f3b15b6bf2778aaf9fb38e0d50152f8dbf5763816132a04b4b2e9639584b3dc8ea6d95ade024f9497944200ab0aeab206ef099859b9240aaa15f737c1e0fe6d015d04f47261ade4928e3c2ca21d1f5ab4a3f571f2ed92ebeeebf2493e6e39f0063ba931e165384ee1b5081f5f8d26ec24716757037f5158d35effbe67009080ad7b0381292a513f312eb28328cf5ff47a6599e36c14277c3eb5053c5aca530ff5954c21c03fb3fd5fc0facdac36dd819b0495fde421411e0440991da0cc4a20d294446115c0b79045037fbfacfeac574da3bf192fec4bf38c27cef71d03787430223b6069ba6d9273ec8679736a832277c657862ca791b559a5054ee8c7c07618083f75480c8aa01cb086c7317315911802e6cefb15bbe20494b14d97e3a885806db775c216dc15949e3b724f7cbb30bd2c46bd5a2fd6132352c2b21cc2b47891dd9794975f70a6fa7a0791ee761ccf4c263f27f64790826c1aa656c39483e029baef0855935e7e6c133a4035a3699925fbde131ca62948879373346af35bd7fa52b8d6c3338f213bbd9c79977c0d710028d1d386df614c5faf4a1f8fe5506a9af7059370893ff6d07d91383baba67a617b5d829e0e2eb20e541ed5c34be7ef0eaf6c6f6f52d7ca01933a2a4e8de46e422dc95161ba8ad354f6bc7c8e4cf8ab5e08607530147fcd7c9481afc621c5a3230a05e2c4db79db9e1e73f43556a8e8f0dff7ffe420282212f23d4c5f6f8d2febe129b9fe5ba7ddf27f72ae898a4eba270b5d2bb3b6b06e38c546ba80a9b2bc46097d0b47db5ae72485ef2c6419e856c33c2d66a861b9d474699e730eb8a8992e3ea9c1ed74316687d5d9fc611189eba2aa31af5ba8e81179866dc016bda977c59c595e40001c8ab3a4a44cec00ff84c6dbd9ad4be30bcc080e69b9398089d6ea464a70f536ace3b447693301c94850606d0de1299770b5f45e6d28f8ab83e3ffe52178522eb91fdaa9e4a696674ba0f52ee18e960b04415782f018d67479081b1bf9b4c9b90de026cbb66bf7d9d12cddccdd9b2c8ee2f010892571c6f0c0feac9555c71bf61f9cd69553cf7fc2be8d058e0c3430e134adb1ba28985fdc4f0cf71bd3cd09f5f82f303cded0de62f98404477bdd0a846c6c51e3e82ebf72f475afc8e6388aec57206018ba2528ede194345cc1ee95cb2023793f692f708aac3c9e8a682af36b078f5d6c7a3ed07475e9fe73b95d1eee048ab898edfee3fac4beda45f03eeb64b2128f6df9453ed77c6010e13c0270c068f704f49e62fb7410be90ffee47584ca2efc5287dae1f63bcc1819e7548eb9f0d8a3182f9ed00da3817255a2ff735876b75cd21cb25e86aa4b2893f9e5089dfac76194563f9a14335dd37ef06a501c89623caaf6feb4afb792092dfed515ba7518e278c341834a9dd17b50a0fc860b62ec621b69408cb3fbf7d4ab88a3e367fda84c82357376fa9b1161b739361c313b99dcbf4122f3870c8175093298cf432174217398928983ab6cea4759f18e7a21d71fe1b0f3cda05d241e12db0818b8763bd23d958d6e52981ce8d84cd6d82640d2000874a53c0bd14949ec99e48ce6c954ef0d08e6e319de5ebf7e142f25c0f50ff13f6acecde6a270c8d8de05ef4c310ce9e92f40f6f2b77d6e7aa3f056d4a20f7faa7cd0b93d82e3972343a50a26ff462caada10621bc953b73913944246d2a4da25fa52cc6ee1293c436ab9031ee2dc79cce39f139f44d473c236731257c6f65ca4d383e39cf8d33923afea3c80244021d36e0ed43230c44e7d1a1297d35464861f9149d869f26cc51879027169803e43c898d1b4a2a2480197500", + }, + { + "2158abc2472e1b9c061da2c01d0ad9e996fd687cccca331fe8a2baacd12c06f284b1b5cbdfd067e5ed09a60a137ff4a97c5c26482659680ffb22bbcd4ec1bfd272749e52440537320fdd3c225c30ccd98cf221b34b89c247ab7d14f93ed3ccb0486a028c6f3abe7e17fba1742b6d4db85f6e6baaf82df1a3aa059de8d9699821d39bad42d56cc1ec67626092cfad4a2e1cb5d814e2cab78ccf5474a8bd0dc990a877d37de394694af6cadcc57727f393dccba7bf955f4b65b3c00d71cdd701754ed4f231685b7b5e2557239d7e16305be2d81a773765dcea25ea5bf2c15d670f3159409ab5bbf8da121c779132a8ec1480068cb76b68a19152fd83135aeb228b446225f91d1ed4303a4bc16cf3ad8173b30d2a1e75ccafc8c933db231efeae6260d45c7ef230ae2c7b6f986f1c19e2cf260ded9cd99d64a2d03fc5ee3d73509e47ac1c39dcca655839fec75517a9243eb611da8fae3e317e7df66cbb6abd59b16975eb463f509e784e65cd660ef1a4c5027e54b1bc862f397c9cf4e6594d98c2c2830801d3a679220b46881a372cdf3aaa33eb66b91a9f36b6941c0fe1b4d2a437daa50b811f2d8c65b5a69de185d78bb9c2f172dc90a89324c5a2067974aab14f4fbcd06ee95cd49e03717f88480a410afbb4e68b5c79b0211cb69b90604cdfaf08af1ef10cf28f0f630e97ab18d9b5138d9b9ee9154e0b3104a6c164f2a114fa5032eb5c247a6b87880332a0dce7b36982515297a05dc8a4038a09f52b1def7b4fdad8735443fadc462c7c22132f8b9581de2d213bf5c53f7fce34aaeb24263afefead5341a72f88d3acaae6db367c5c14a97d4f9e438e1e11c3c8fde7ee37e5ece5382e8c68b660146046ef96c24caa6bc9fa0a0c88281e4bf01b32df5218cb3750f9c4b8af24cc106abca62d085198d14ba2ded3cafc1fbb17519a696965a1ba5f65720e893f1ef3fbc5200316b9d4615bb23426ae53e1c5a57b2f0ee0d0c83f353b4ebe7a6cb17531d278478b4ca8e6ffdd0cad30ed73d568a2e44972ac88a7e7d665614316d674e84ebc739b645a9a4166477254ba47bc5c2b05ced88e75bf64da21a7f1f71cd946d84de13ca77b7e0dc2f0617d371ed96323a83bb11dfa16f81bbde913d9c259b10f3aeeb6b56cc4775c25f49343cef667763118932c2e8b47ec745ac537b37746ed65fda2d1c11a2de60ec02adcb79152e8a9e614d8715cc4e6b6891d6a0063576560fa3621146308222432ffdbc351c36c37d844a934088fea92ac54920facf870a62e91ba9299dcb6cbdb918e2d54fb642c3f0d60489c4bda489f6c584b64c8f19359ab25f388dbbe636c4d90c048f5ed87024dcf9f98a9e738163f837a07750d61203254a80d120c795f9c3aa791272f9474fe330da81a45be5ac838613d46c25e781606862912ff88af393040605fd4d55d07e2052227c37ceffcdd2d42a08bbab69140dfa4406853799893daf768af546f915a91b81d0da719ebd45b8b5f1641f15621959689e810217bea18e3996c532ac6e4e2e4f289fddd5e5968bd6fa9aec5ca435c532b6c74a7568c8aeff9dd19bfc2fba3b484a191e2faf9a069a24e2e6d928ac0bdf635644cc1ef3bbacc547a8e4f1d42d4bed3b6b8cc56216fa550dc37da9cf4d1d1591d9348594d14adc7a3fde5e5d1a3b9875c85de7df483cdd0baa86dae793e0796d14fef1f649de6079acbec6b6fa5f2cb2bd0481f5316f00dbe5dbc379bc3cd6d13bd8c775a727ef43e6a5fad1051783b22c05a75d64a8394a73fcb430299b015563c8cb0ae0aa4ec750399855411c076d21aeca8656f3d0cae084fb0a1ffc6f73b52a7ea5d4bd6d24e7057a3811719533105fc967439a32241f2d3e3f299da2deb821748cdee1a1c5e71bfdf88d833bade2f505268f375a9e6488cd8e16705cce91d15b60b2fd269a19148296a7be348aa349a12270fbc0d5748e538afeb0598081a4f1349217ceab3c4141d40f765ea2bfffd530fb9606601469fb131a44939be984c07bac8f26d8c068accfdefb729eeb47cfd6ddc646e22031f53a7698c6501d86cbba05e282d64b2f962a1b08b9064078dd1e3f14006f45f599bc8e600cabe6d855fcbae8c3060859202361d929a241f6c0711ac0d050b67a1d44da19e0b0e236adad1f60a327c9c34b2b9c64cdde5b8e4f664f2fc70599d44a63ee2b14d051c27d71231098ecd3d4086038d63e84547dfaa39db1a92785e38b640ea0345062a1c185b25a72862e7ae6574114eba592d6492087e2580dc5d361c473a614d647e66c0a30de806f4976b69a8b92301e68794ee05b96ee116a5fd5edf5eab43dc1103801eec861383f17c2bab9f2d9126c1802b7aee0c909309ee72679ab644abb9c4caa54add283b5954e6f881781e42f849bce6554c7a5e3becc5d5a209805ccd4a0117272a53807e3978ffb19641a9dffd9034490a9284f658599961daf52f24f6464c2099cc9ed3459d84dbde2ebbdbbeef25c882a9beda03573bdd4c6a0143b14d634a1a021d5f9fa23a7ed0f5598ee57e56672814412b6c7c08b8e709fb98575fe2716100d000a20a7e7200d800e556564c7e6a8da9d609b18ff0bb8a8812e96b834a6b534b0d5dc97f5da17f42f8d58e763f1b201625d1a5158c2f9e9e190921637474ae81d278002f197f7211540088931ca8a941794e56067ef4a497fdc6fa713aa9f20c21f23c3a71ae4cc5aed459ca7c020bf55162fbcf56a066546660c5a009b8ad2aaae9651c97b1e145853a10013d1bf68e7df25dd492c328f823ed982da54557502ebc6cc56d4d0bf2881bf3c536ea53b4dcb0886e73b066969dfec343441b9372d7ff38454c4337d45e2b999415ec48f19cd05f0f80c5a61ec369610784f47a5cf3b2a13ff5d8145303ade7189a300936006846812dec9ff15500f8daf47236e724d72619af3a6cb3e854cb8284d5b8843dfe056beaa45c40a4541a98c7507feb27a605d6e07189c8c5554a492a03ce6701d3d2ec782e2c1c8346b54a963435bdda3a93bbac1d837172cebb9cd18903d25cd6bed404eaf18730a6d1c6da0783b5411770ed34f35fa6c11a4292a34565ff1b23d4200ec5a73e6b7905458088fac19f6aafd35e0e791f28bbb2cb0117ca1c3a9e3c4863e487ce5d8c14dd140e9eb4794d87d75b01f683bca84ebdbf19dafab716421bfac9e95755fd346a0cd31e8520a55c7ca652ff63fb4e20ba67fab41e11f7390bc02363162097802c6a9eb18b430d07ea60064d5b546d15bb68cada79c113848136e797577f1783e9b53574f9427be3a28230fdd69d139205dd6c7e9e7f031fb6eab70d69ce905384c5c77d084360aac590a89b2dbb2d339899b13619b455cf9f0cdc08db6c5b5f3223dc3a663ce42bcc8cc6f947f42cdf8dde15a6926b753177513a52be95b1f0b88d2a1ec90e49959b108fe204bbc29199d7382c42ad5dbaff970cbd2dbeade54bd70415e54daa805d396361f525f38efc2bba3fd818f9d7af0594dcc341c20f18c624fe13ce7e7108e1d2fd06c58b03f04642c95e3ba00d4035ea0476ac138f72378d85050bf60dedc90af38e96f67fdc38483a73e847b41d31b894ddcb234f02b0d507bbcb15a8941f9c23b592a291cbeacb3ed213f2f044aa842275a7717757467f121294bba6b357c969e96bfab455c6f328d9e5181d909c3f0543b17d9af7fcac099067b043be79aca8e5a75c3a6d4f6246357a63c516a3ca595447f34b43a055d3070517c67ec36e636aca9ed71a001d4f7b81149124deeb7826dec3697e183d861d544c9c17baff82849d599e9e77ed19f801aa1ce095940674576ff270ac788d00c429187e299a03c6f3a1646a8f7d6290287e70bd1276316ae624da929c67936191abdfba45e2803884e5a3136205a38a841448968a7900709dda033a42969bd3417a8d865d0dbee1f261f4556797dfebab278136a182a63e5ca9789e3f1371808efe06eb0cc5ccfe26c0538d573378035afa39fb7cdf3ad889b277c8c6e84954e74f3ff3140bf13bcb45c822784125d23b5eceb73e", + "088fc7ba068f80efd8d4d62813c93c1eba77e9ff400c7781314abc901873ce200295da09245bf8fd2fce254397616151d94b511957c89a881256182ac9e64acb7b25d4a080cc9daf9ac2f231235483fc9fd415f69caf7eaf0597", + "78d5f86b071bbf8a185e5e2d54faddd2a9e26983b1e7a74be0f0b979b9f4af31", + "d9ce7d249af9496e99c93b36", + "ad542824b49fc520f0b7ff8ce2bff8b3d47baacb4a1c95ed56a306483aac551fffba48e8a8f5e4cc536e9266182f6811d070fb9282f5c542cefb4993ccc7044b42cfd6fc71793dc8dd2de23c630f9ceaeddba45efed9d7fca25fcb07d193c000822478b19c2ee9fb31760cfe01475ba8a003db469d1130318a79345a29d054a9f9412dca1edf6d8f1498af5bb6fdbbd3d5f9a244ff176f62742c53779291ef6294df6540d841f4ee8c7c58fc8497ba74d9cf7947add5373427d81ae928305b93dd26cfc65e63b0ed0812ce759511bfbb10aca98f2abdbc9055c4e5ab82637f6a965bb74f592bdf11118b8eb79d50331e76cb4d10c6b4428cd4ec2ef4cb727bdba2b5375f5184d77772d0f9fd3a3c579a4a548b9c2dadc22c805ae959617af49a514b43f47af834313ed2e4d1fcec2c4b9ea87f328fa3d23129a36e6c54bcd08f7e30645de86e98ebb11bcaf99543503eb1e024bc9fd51fe6bd5e6d749033f2452cdf28b3d0f8a304111bdd26dbde641c02fcb15dc21b1a9baac5e86d35b4126ed1cc8a2c3c2a5b94c99fb9b2008daf1a0c090633bf9e31326428c75a50e821b1e72a6504c9d7bcfcaabecd929163d365832e8971f5efebff99ee3f5b95f957e8904d05b410936d8a81c60b4947f8605c58e5b727d491995c76fbe06e556c8ab5cc661a0c09ebc98d61010050f68b31fbe1f9de8f6481b2704204b0164d8433ba4dc1076908c782826e9b555e8d608463581099a466f92bfd6ac9796eacc0ab771a3f11d03806b0f33ec04c69cef6b87d58c11acb5d1374450ce61ba159456b915043c5c17cb03f0ba66d027105bb6fff41e6422f13e2a466f073358bf68149a3b577cfba7ea08b42f83fbc5a2aff17c5ee7dbdac3ff97389f5b8d1f3750e5c9be651209eeb9574127ea81bd7619da16d1cfab85754883543f6474c8c0cc9d5b80e34bf8262d2b4798f9917bcab4b880339397907a5bafe7d149247fd735523df3cbb17ae5e298846ad3bfb7d4f902aa549b7667d3ea945b002e7b209bc83842a7b120d6d27ce80631404371f31d1f61efc5423e1822032a1cbf4fa1a6b6fe79934a202d5add8c6e3595e49be3dd9553a569521c50e9653bc684ef2b73c3526ff7a0843fcac9cc9ecf46e63df5b9328a54c576bd299a366bbdc0f83a9de67b03f1da16244bd6d52e7e4b52c4ed693827735554b05b3a260cd01a41d7c944d0b7b58ae4b0eb052da34bc22b779d7ad46f90f3d4049c097e0adeaf71bbb30ed24b32ff5c7a65177db77492c2571e9cd99f15e613797e319ea7377038d53b28a4cd66a697e5e8f84cf16bd0f0430b34826114b4e1d1ebaaf2939dff7f9f4ce7c0861e51701c42d9cc9e871018b447ccaf4e402e3d63be164dcdf6799314a389ada8bf5e51a35148acf627e51481b9b0e4bec09c9e6d59229721b151fa9adf8323001fcf33afbc9a949643172f39b0d10ef57b37973683fdd9b9eb46e63054fd05ffbef889ff8fc8f251b0ab41fb00757ec1964ef373fceb8f6d148a7f7c89944b3cfc240d091601b23046188ba70a7cdf7b6f96eb93dcd3d24d4aebdc4a29a749bfe3cf5f6e1a025b62982ce188e6b57245d829c9fc1dcaaa5309a8b9557b8824a78eceef6e977721de4065b474ae008642b974001a5565ef5fe4250194e8b861cc45a8691c461817f10b646fb526bf0fe7790bb0db29d1356e8c7a197ec78df8310431d632a032b5490c2a458eb8d4327a9679d7e8ef8739797b0e820e2c567ce3562592e862a1dfcecd50bf77fcfcd00518db65ee0effb9eb3655d5d401a4a47808faa596d17b316f828cbbc14a7e018a0593da9320140a752f3824b5fcb66aa4c3cb94366ee8b821b09e7bea2c04ece15e8a7be1f58463b525e8cfcfc3fdd395ec5b0575094313557e632d0a65e3099e3c653111a5fb4f0eb2aa710229fc055a2bfd8a7147cbecc10823f1244fbb6894af1408ff9047d6483ef83573b5421b9798ee387dc38f166b11de6c33e9785e9b3d9d28bc24c37890e4f8f8ff24cca298b44d6fb1c6aad28cc634a67dd427205285521a172c2a4884ac5b038e261e38faf0086a02aa29195713cea335c47d03d67fa0dec7a8cb21db741519f5f0ba0143f14d71e33d82c75d6a19b3f7a42e6c16d762354daa2670ffa55bd400637de9cddf9e7964a03b4c8956f36bf54d89cf16de23e8c52957b52eb4572a11d1398be72bdb129e2c1abb58c65cc291bb7b0d2dc326c6125a441863a6c92de0f47a355222d58bf10af0d297a86a98b4e933a8f844fc7f1bbc8ba77919dfc50c41219e3db309b92ba056349faa758daf360b8ac05e43fc2069cd46e63fec399cd7764b111467fc65407ac06f5f84a3179930f6215ac5ec906146c19e0d3e162e77a2bca3582128284282b251cdcac03ecc204266ac3a9cfe8d8854008baf89c0ea0096a400d6a0d2f7c681c99462cf0105f7a3dde690ece0438fbb820b9c73c6cdf6208c336831101b904526cf8ac331d879d71615d8b1f750ac7f0ec692d97a5e21e17e194a98c10172b5c4bc1049a8743188ae7c4d70384a7e68c1353aab7882bb91aa383821046ed0ebabb4b2dd126ccb935f48646b299095cdb71ecd5cc402e4635a3f7a3c8a6f54f4076ba028dedb402bcc92f5668dec3d91dda7319f58382017e306237e42480ee2c1f5930564cf16fdf37a3434585336b8e4535bba87311cd47722b9da727250560624a5dde48a2090ee44592d2fc06edda634b600fad9f843c6b2eaa0697b42858afee8191dd2a31e5685bd104188e2ccb057dd0a8d4d1205d7c846f5b8ec0f06bff61c7f47ac4da30e1bc80a4e95af79b14a83e9af2e0f195cb92d14f752a5f12ff90a05765be453075d799694848fcddb07859336ec101c8052bdc273d4abc313cfb351b543fa340dcd01bf32fea59881ddb8f33c6023ccea70532814ce4a2d0c66c846347b86c29dfc34f6fa4db298911d4367c59939020a3d078194e6a3a3c5126c24ed182398468e77fd61a5b1271f5cb2a97868876954c3f7179d6a045f4bd770f681cd82216cd2b1ceeb4e724b3fddeb74481e662fbd7f5dd45bed6d4f89d21b8dd9c1009ad2b0b16954e97993ab8f3fdd9d61f8db102a945591b4552f419971a9e46a792dd8392c8d9502767c82d9b4f69e66071eb579859e9ca070cad5fe3b7fcb77b8474926ea991ce7ad201421f8a79c051b762a066027ab2b9595a1c97ad57f3149f5872ed4d8e99195d47bd3c03bbee590a50a99d8048e912aaeed797977b52f0240a6cf2c865b108456881adbfda60cf701454da17bae879cf098df808f34e50bccaada2d3edeb1aa73cfe3c512d814eb33897b6ff9d67d3d682517cc333c3c2552adc99860b1f0d1076390de9f84fcc9e802581f77e14f5254da01831c70cb8581630dadb44209377d90447a1a21cc8a2d6d897db62d8420afbcc6ed85ce42f3281255bd43e0afd3e86b27d3b957104ef54959282b0e1b381a26f16057246704c7888126055af5a1f494540f01897e8781e1a5c0193b7bef4b5588d0e9b9c8de74dcdb63f03f7b15cf48fbb71c7c3bbe9329e3d326988bad7d0cb85537c1e0b3cd88f37a3c7765f548f99e495ddc29daed8c7f15dadf2e5b79def91dbbea277c51a5da250e66c305604bcce4789ca2df9a10614d72824ba8e4f179f35ccae7119fd962cce13b282f0f970ca6c4776374c4bc438f0de98aa04fb3cf23d2c6800a4a666c15bd20c486e88e688ff9e5fce906b4ae96ec7c3388d7567ce6c8bc61f6d2373b93f9ddbb02b384084b3f28f54c9ddda232d3084daa5fac5ca356ac0059f2fd3fde5d6a9516d0954653b699aa986f70733538e19721daa41329abb95058450e602eb5726ad5a8b81aa474650659c6f7f6f53f8a6e635bf35f4b1191e0dbefad3be756c6141c7d55f007f4fd131e5d5eaa120ba31cc32b8d4c69d4fa784fe0af7dc272898789c774e7995cb252eb6c8e8053c9e7adb59c27f675952d161dba78bdfb15859fdfe4fe4a44c01efd394bf51d43c600aa9a527d9c490971e188e28b980e77a9c6ea0a4ef6bd38d11b47f5745ecdb", + }, + { + "9cd1c25b5bdab9b9080db3e5e05dc749e0783087c310777d89307138613bdffe0ca259677c13208420d4690031314a11a97a986d8b0fea143f5b4da0972c9ea3cef80b4b0b2bcf2bff392c306a764113f0d9807be86a9027c6ddc85d096600d85e0b236937f295362bc1679537a8a9278229a36a9433925a105ab719c0b7f11fc31488fa071d3032de97c81540713dc29ae02c2e13be8823183f3cd9f72ef8ba4280b4499ee47c7c7c4492bcb5cf7e4fafaa7ec26906e58146215a3d4f52f792d3abdb718f57ed0b9b7fc7504e45a0fdf01ebf5924a4da6ac635a715879ea75a4983cbd9dab9e47638acc687f16684e184443aa9e81513ae4abbc4d1596b2ca3eef77cc9b0603fe90c0570fe6cf4dff0381a99212fadcf7968934ac1ff7664ed6ee0b61e41f5074dfb774b676c2b57a445f1c5749e95ed062837c727ae2c151c0ccb3a4dc1429bbcb9e62325117aca566b8fca0924b70f4defd7749d0389b90f55f35d1635f8d2efdef514f06fde46db6e11e492c8f4dfb7cb5454cedd0ddd32013a4836321a25110f3a017f18475a86583e192132f8d8fd4c2dcb2a3aa95c3be3a57216bf9727cfd1284eea6fa870c8e689e91982c116ceeee2f8298b55646efad684b96eab883fd3d629437e9a0b6523f47ea5b59474a4766ccd01c13170bb08f47576a0fdb573d4dfb65279c1b79cb535426bcab60f4022dc42e40db29f15a6148b461241bae62070389932f035e7257752ef2d6130503d72344b24d360cae8ec11fa2dcbe04d3b18e66d081b552e93a71dc0094d1046bf4491e318f2ae00debffa0b8ada58c5f23e33fb598829ec2f46ad3894bd7f530210371a02e51ae0a414eb2eee43f3e08126dbdbae04c7de4b7416df32953234a6694ea84e6889f27c74206ab8144a393a2614e92adcc77550dd54827387b619f004c13f6c4a31e8bf525277669db0a0c3c589eda15063f12eb774a13e2aba2f2f7b6e9bc69f8485f1d6fc5773acf83671812412d28704003e78a17da25bacd1d61a6d9cb9f121abc71d023bcafa713b7c954e4e1c524e5bcaefd86c4a843e209eabbd579cde0263fc059ec6ff10017ba54fc9c2a1171d6b06f5d85079167117c12e6e5d0c71c008765fce756fd0f1141fbad6c1d2f32cd8e80429611a9a78dbc8e738d458f9ddce58ab43c77b34db9befb25cc1a588998e8dc2efa75c6883244fbbf9a7b4d6750c81b8d3fdedaf98dc61f49d067c369409f984b155ec347a3bef73e2a44957b0ca0f84c7fc335fd89453759ad0ac2fd9a5b38afa9fbe74daaee7bc52301302fb2286c21fb922f74d756de84519171fbecaa9b869682d431614ff6845126a4034f10253aa244bf89ab8e0dfd1f7fe8fc1a8472a10746d26896c8ece7ef80eb2e910069435518ccf096caeda63ad692455b04e6525bb8bae27197ca5118a57fb9a5d8fcfae1b9eb7874d91eafafa0e4fab5cb4d0173f7e3e58fae369843a641e98f3ee460e8cfe95d98f7fd38a8d2235e9d6050015833e6d7d21d7015c3b1ff42f0d3a3d9a38d373c8524752e06987c9408cca550f08c38c2a9a8d86d5ac7a04bab44254ed15c7b5670e0747788e11b81adb0d29e3d0b50d6a429340ee0d44a8c286fcaf9bc46403d26b4a4af95b021336103c1ae0f1274b33bb8b21c8cfca8a56c639f18a9df45d083fa7019aaa14d1ba50eb9a4112e574cd70969640602096265a87b1f77c0e00bbb501555f1626196611b4a824991cf10ab2874a12a8e0390267eaf9e3f8f99eadfbf40d111a26772cda1f50743c417eeec9c80171a83a730f246cf31c6691c96185d672a0fde9ccd7091c4b455dc93326913497396e0a4992773caeddcd783e534eb0f34b99bf23a2db6ee738381b5fc94ff603be014c507888ff55557793a8c5439b11dc5a347f35a2666eda81cda4d1c3a78fc4f3df3c7bde91d05524791b67142c446f60c3a4022912ddabdf817ca3280b671beaa496c935661e5adf39c1f4650563c5c807c8f21aa59df926199c4e2404690ea8ffd7dd65f637452ff93995fe9c5ac7a322b9bdc756b7ed6f533b9357a4a1ffa379dd096f144e9e0d87330c238ed3c6b08c8478e23b65518ea1e4e64585e5e9fec2f26dd7400ce4c73ff0eacdc3b07e4f34f6316f5b82fefc66e442ecc92bea8c1d58635d644724a3380e71fbbeef4bf3e57c6240ff603d65447f510eaa3c9ac794fd24f844489b7c560c7814fbc307e03f6a213eca5ea40fddf51d8731b74ec5b472bdf8ba59751065ed2461b02c41ef96622e60c0d26f9dc78c24f94372bef7e47cf09ed565ae3a52d39b02ffddf1953f1ff500f1659db9f1c2b23534702c19ec1cb7c18166fcd33997d53874c7cdb4e6c2b4d82751911913434e48b37a61a0971861187e5decb7f5c1ef6988bc1d6f7fd147a623d8bf361b0d7ece88df6e1ff8d037762d232e22e51d8c6ddaa9dc597b23ff9efbbfd416cc53e5543253732a23aba151cecf73b3ecff21c6a9fd1f24211fc21cde9633aae918ff1c6b72468f1de7e0ecb6539fa353c069fcbe8920dfa8e2fb86782e3062462f7eb2a2c441bfac21ab62744b05c70b6fc3c9f8e3a8a0c5a4263ed256a019861ecb28e20ce78e2d93f1a1def669e9652cb35d105bfdd5ff2313d27ab3eb00d1b628b4c20f42efa23390802af96a8f261ded3678ea0b780e1f4a88d23588a4ebb058adbf9a9c62ce2ce2f8264c874c697482e25f8d5a6daca4f57fd97d23c42d7b71ec150d4ee33931db5f7d63abe7d72dc936bb23a367c798e6a01509644284d52f9ae27d7d1bae597b2cbc26139354dcca0fff6d76c6065d661b66ca5eeb9f8d85810a029cb95b17e5173ef8ab92d475a1d3e21799e874ff04dbc962c668ef4be9f94d85b2a99d97c0db8f6b6d63e00e36c325cfab9aceaf7597113bff0086e8fad36eac7c0b443de6d3a8533789616d4c863df7200ba795a3b8d0a2b9568bb32af95fa604a3e3ea778c3dae159e1b612458584564ffda07b8aba9710134242b2d83d23127b51b9e41584c56f667b71bc01060240f3a2bc7e5d438e7095c1236e0e468079a83a5dbdcf132d258e9ed18f94d3c098867d06d3c09544565677b454be34ce567f1c143e2f3153bdc0353d65090dfd8f7af4633b89a781e01f4634dd7b0323ea1f38184e697bfc39a1299eaa278c39a2709cde0a346fea53a61f211112450b318d137fe68f6c102085aedabd2b045fab912da5c58d8019239f3a44b18f4fe30c5352e2e2bf030334a1dde1dcd23178636f1e38ec9e42102d8c54df0b94b207e804eacab3edddf89fabda6c8e1bd4e17ae31a57716c679ee8bc7de4412fec3934c6f3e8b4c1d1447dbba0fbc775dd3258f789ca53f1593cadc710fef6fd282bb41c0468ede5ad5b914e4758b4148b0d0c04c75ff6208ca3e79d92de8abafa4ec70ea7a4e454f0759337ce575c4954584e2bb8444c34e823d27b025d25fc9becfb4391df9882452bca0373164cd76e9af316df3f5bb7532e22557b485217254d5ab72ce349620f03758219b259784d4c9f1c7beac3cf08e624742e768b53b3d60ad0b94442c847b84a516a93d9b7d068c44c43980b4c7e2fb0ac964bf05a11fb2adb4f6d938715dde88061b238321afc7e5e84799b02a94baf3f879f89a98ab474ca12085137d639b837ebe069f6dcd8456141d063eb1c032aa392a44d1d58b1e77aba38a280625ab84e3b123507ea7a692c4acd1756c031fa52d637703ee957a993804c13e296cc20c1de55c9b8c032e50afffc51c02e5c12f48383237cdacd005b09243d9fe05e51cea42b77645e5c6f4e48c10e671d216b90a48f0d8f5c1dda553217f5126646d11a62587eb0a4ee0efdaf0d54bc2eb04cd34f5a529b682ce09a34d5acab2c8db58ed6244f7b024e68a14bcd5d7a7daa4dbcf490485cbd38e6f20e839d2b0142b9d766f9527937bb1a737877edf6122ba306bbfb5379243a6b22bdf85dcf3b079691f0e90b28a4259c1c9d8a02afa5b5a661a0f9dac52435e7d22e3591593d37eb2e10f646b51be2d1a96cd4490289ef642ad93eeffd64d7cf830d60dc4a98c768a9bdbf6ec9923062ff04abf19e8b65b95494a9420971018c7e6268b8fb2021a4ddd103976333fa52389643c711a980664e29a8479aa9c4091c2cc2074ce3ac1ab4afa217d39c6a1", + "c22add33457539a957d32dd07ec9110f8cdd2f00ab6ac256b4bc7732f63dd3b867b0ecac262555", + "e71f9a3dd457b4064df1d9055889f105af175a2d10dd7b8729da0d0116c2d9fd", + "7df9824e774c5f86d83cb5d8", + "689683c9e7aa9c48b9fda0cfffea0458ea0c3dedccd21efeb06126f1194780917c9f4f2f44b1daceec3f6b1f75506f4169bdacf12c1f65958784851056fe0b4b42a22aeb043ab35ca73747346ac58c550324c4b849a404c94b8860967b6fc58aff25dad0556f1952c045b91f56ec8eebf6f552c18b2a0641c037e6c6538b289601e1fd5a7bbe7b6e0b224124fec341bf77615183abafb52b3e30082a0abfc2cf224324338c132426011d9f800b382e6b834896ea48a8247f149d92ded7e69c7800096076cd2a729a1fe41c70dafb1f855ffa2ffc27b93e2f5f6827ade7118af60730033675d84de9cde6c260d3d615a945dfe0ed25f33b6cbd2c0e204ee919219d85c7536f4700f06fa61937f8dbbe9bda88db1f4ba8a8d195cd385eec62edd9ce673880800be9aa4430e5c10a5908f6dd349af70f32b32d8db38a7d73821af47b993b622bf168565082d07e88fc48231a440469adeca59263302438ece96d89de11cf8057454d1bfe8e4e36965a4d82618834a0847af39dd8776866d9558a5cff79a1cc9d1e3c22e050677e54ead68b3cf0094daa01330d41bb66708a8bbb8a196fae5c77dc6774629d38905e81d97c5b16d755182f687a8046e55d148419cf9c12139fee50c0533b0f04a805723ce1ea5595fca5b668e58f6b3b396f438308372489b640317cfa3a79392cf6d1afdd8c3359557a83790021a4eb418fa189ad15ba9be0f74182ac76076f102ec171117a3d16ca20b4d200e03e54f1f0ee6308e463a148c0c85aac3ccbe5781cf45b53a313f7c9975a45d1853ed9104a860c08634a8211b87500b5ffa3d8d9d56f22256d485b9b45b24d3873159adb8ae25966cc40f164f342519e88d1ead1e711e1b2bbd4be64c7e83f056f797c2d3a5cf7c5025f92be5637fa7738a1bbba55f761dcd1451ce4b1e85a6628b629a2f7917a86363b01516472c0f8614abe2ad1c9d5501b2a44a68e3eeeb34a64541125bf49138bcd15b7c82dfd40708414b85107d8b982c4f99783a03c707a37787a91a7198063f0e8a2d52dca61755105faaa09c063c7a0849570cba1aa7ddb3600eeba602c7e7c9b90ed00ec731d4d1d8e4bb42f9e9db21616c4aca48dc27b939428834404331288f03c2b5e887103c51748d0257519c3988f6492eb70cabbc2dd8a8a910d737a678d0970ec48bef3b81673bd10b687b37e11d49e7cf90c03c54826ecd833bfd9dbb8174274dd45b139d08371d5d248ee33298193194734c5863adf4bca92bc282bae2f47da5201fc240dd0710a22a8d922faf92c2071a7eede7ee17232d3b6ee5f3ebb1a8b230600b243c860968ab427a5f540912e5e7bfa0271201f288727f2bd5173539d5318e5c1c0a71cba4d9501b91c3bffa7bb61b3713f1751efe94a66e17d2b42da51d13c3df40f4db988dace42a6a1b9d138c4f590b7227990711afbf8f56fa63f2800cc019bbd4a7b3a0983c9b9e5f77562dcad6de96e3b2eb85cd99d28a021a10d6734400a91369236b48ed68528afc68f247d45c79318fc5d634ecb0f3ef8536d8ec2e877adc3308be906c5b96777d0e05970023e5c5dffed12310cc97249e4b95e32451c9acca8394fde699deda57e938bed7167e62e2cb62357f82fbe821ee73b4e09c6e2f512515412c2f27805762a8493e74a3d30bb409e499002a97354381318af28311ce484bdf7c39db53f08f73ca5793945e13fc8c66d503fa95506b37ce134ce2945d75b424ca6367ef4ed47b9cb8ba7de80e773279bf23ac888eb105385ea958b1b49b27c8db6b1e14a5c8ed5d28808a7d0b6bff1a58f24f9c57fd8b8f477a9d1365f89c698b8ba923896181299d474b93e05d3c915b10a69e61910761a6d8644933c593661b0828afeca590ca18e702322d9140d98fcf836c2f7a4f72b59eb529823a52ab05d919c3eee4db2cae1067213c5070450a160fd52fa44bc9bacc5c136701cd7adb1faf484da376477da08f6a4dcaa37af47c7b026c2da9d5fd0b30741357104cb2bc0d3cebd132b5fc7c873ebeceec5492aecab95ab393f35b93b923d2ca071e6bd8522c3ad8598a05e96646504f1620c045aa5734d665acbdda0ef73612be4ca4d95ba069041e042497f7b10445869989ce30f55206a1feb4e64890b7d1f7e9df2e88a352674a52ae4267c06592d425ed1d88101cf94588135892218ac11f3976ab2b47a27f02eb887696c94b13d48b4370eb11222274b5513a0fef905c66d0c1893832ffdb9b333178b65338fd8b81094d8f86f2e4e96a47e72032cd6fd47af87eec295c6e980f595b57f79abeb4654c4039fa03ade732b1e579551898b801ecd6e0fb1c5fd198335834b51673d074a8222640d2a969998f5b878bf897fdcf3426c4e24a7c599e5567643fa79ea5d20e7de581a873ee0181e3632a4e304f9dae09a81f882d4061ec17e588793b160c93a926874d5a8b78727f88de9bc125589a9562db5bb1c01012bbea1b2eeab68877871ce83455db43cc48455effbc71c436aebe362af22c6a319d134f65681c4d0d51f9aa42fb20f48ae3f7065664aeff5d8349624a5d79eb0bef3cbb2a1244ee445f560a6bf7a796b2c950a37dfb85ed5be11e8e305e835c9e077e676aa5ce23edb1f74806278548e3fa35059abc2f032289f9bd76043c8dd1352b6131cf34f66bcd0e7f1d13081f5b08ed0c69136f3b7ad8e05e9fe99a9b73624095f96740c1f40074e5d92ffeccdc0f15502082fdfcfc97a800be511c22b875f2832b2b891cb1aad2a17c7bd0be4427a4549404172f7c14d5e425e14498237c26a7813cd8612d048703cb180f1a6194f688b4644304950b078692faec7a2a5c5bbc482f3a7e8ef2825c4c19032a7a79a2908ca9774c6403e6b15625c485f2dd078902aff769dfee2dca9373704bf63ad981b51f61253910fd48c49ef10e3938f35ca8dd491a8e569baef675df30367b093f1088ebe8f876191dc32055481d074e5e47a4bd728efaea9fee3e83d8556255ffb2fa08194bdc66897d97d1557186d5f873169461494a83368ed8065b9a033fa4c2f07f7c60f945b60479e3c89233d58f674c0c6fa5918150bae0c6de2b65a09ccd490e2ad8571745bc37e70982411af667f3e8e9b9f7f75d863e5fef05c1f0d2acc7c86585a83ee32e0a64a9e67e75b80def5bfeb7cffe6e6822efa7a9cf049689b58336b081c039696e0fd3b2a2a6b0d177c9b3f8fe5cbb1c69ea93c1235b2c5b6934f603127eeafc4ed0728161612acdb2ba894a5ac376c4ef1fa8d49b4722379e5cb39752837395c413dd29a2a88c03849b6fb2221fd85ba6d5a50ba7ee9c09ecc5e6dc66afdaa1b021282cadc68f19529eadab809341187d57cfdfe01d0798ab8a94277b9b868612e575bd98f70de80ebe5f57637c511800373262eb5ac3836b03808ca5d5f732f286a5f18a7b7fb8cd8f60e4debe54731c9c524b84694c5469975443964ed28ccff2f4e8e0cf4c60c1c8a092e986cf12fa90a994e4f26ac89fabe8a0d1e27fdc00f1d3d3fdb73bb76809f93ea113e336cb0a5438147e454e262fbb7d656aa1be1288839bc342b48ba7d0e72c85a2e24be1a97dfb2db85b5d850481e62f3b11a28c6407686e73d550b9f1d0f010602e82af26813d2484a8db2da0814782c8404b2865abfbe3c98a07ffb37eea6de7992cad73a9b81ae96a9acb13ba213eb4111d868cc73b0432d2b6c2d7e0e0ca7ccbdce86d01576e1136871a07c76498eae53fb7ebf2e85fb8561d10dfba740400ef4495ece7eb33ce3bce26344eddd88cf1ed8028ec5fe8e71edda54dbdae08f50f8df6295f6d7ef1163f62262a200456a7777d0565d7f5832fcc7ac144b5c3e0ce3e5c9b7f880a54ed5e80662e96b356ff58f2e372b1dc0d73cb8b96c72caa9e5dd312841a8be23f838bc706d893e1a8a48b2c069874c293c41d00226f73f987aec8686046ac4c0c972c991c38b98cabce30e7255dbf16039b95dc7d103fde630b03441b15bd2c214763fece9d6778d1c6354d2c9478c226175c02cb006006715fffc879a6a2b4111f6234ee330d6c84d453c9ffac08efda1f380110a8ef8c2fe44e2ed644cc3e0146b4d02f76586fbb6d69b827be38b9add444e2bac4d7165007cdbf2ea8c4b967fc1bb70c68b229f19bc3f79cb13ee6265264885f04c09a96583f331ed46de3e5dcaf08313ba6053f3d0c1916a0f", + }, + { + "3ab6cbeebc18df951d371e0f3cce2697fb367476bd9d50ca9e668c77636eeb9d24b68be0ce6a75eca194fbde6221755d57e9d3148623de24896a9becd98789fd3d14de0c7e53f81fe7f3fd491472a66b5b797fe19c5d0525c7a111a0289a9e65ae7c712ccf694cb75c490070bca7db17205af9bdb7fee27f9ff41fc78ebd2d3d399e690908b5c064ffc0d5bb67b0d2880bcb45c2ca2741691b6131aa1e5ee758fc50610406216905e13ec049ee92d1f95e16bc283dfd91595ec2037d20ead51d3a362140578a4538c80581b79852b0f6686c1ea66aafffc872024592ec1aaf2650d167a75bace024b261db4ab48b401cf85ec2620dc12a7fc37012af8ac1d6db923d82eee962129bc4ede578782594708357d29118fd10dc6d228bf7e461d2769e556488b776237b6309f3dc2e884cb2df1f43f71c53d389765f805ac053d05fa835e75fab0adb0f13ceeb425637f43556372d728a00fb005f7c5a20cf2b7f776066d60b70b11a848005c6d63dba0c93f139067b39017c997dd6b94c0138c3619e9a6d0e4b8792cb8d58a2ca12ae5d03e7637f2065fbb9e2d1722fd3aaf234488ca157d829e9a3b642458054f3dd58da41d7fba6d2b488a327b776d1aaab1a364c710e755ab22b9cf7abf1eb8949c5ca20c070f275f8959cb00c6d5ab7879003f89f795351a4ef4850e033d929f9a349b9133b2e0bd1cabbdd381594bfa697b845100b96b5fade05db12de040b814ec49489f39f5abd5b37f570cbb516636d5b7378f12872d02d4de20b52ed8ca0b12029a4c084621bbb578b870ca2ea79fd5df1ef8664bfb3b1a1bf038e4ba33f6ccde42c5146470c9dd293aa747d2372db1561617920142ac1d32e4f1fd18e8b9e72b7efb8fefc56d08f00450d23b7e8381849b1385ddcf9310a4850dbd6db7a4992690190655760f557a5027b5ceab3743365ac9041a5c14bed1126c4eca00d7e0a0e0e6f666f64bd1466387150ece5835192149237d5dd25e703e9d3a4f652ae04601d6acf8228e4e86055394c3abc9dccd02f04a60c298d101260b408b2620c137f77e2019fc6eaff1b234c56dfe922b0192656254fe3356143e969f64b7609cbedebcc8cb2b68bcdd9d723b9c14669da6cbfffbca2351de51e87db6afde435ead0017682b8014f91d9734a9ab9b374257273e114a8fffac786d53183ba666d8a67e30c1fe45bb1bdcefb5787afcbad213f8e36e78d30ae1305df96bf450349ade655cccbb17d887f79e00728abb449ea427fd2d0af80e3b5607a74a57dbe5264131f2fc49cb74415974b3d43ff872d4106ff11b680f56be06fdf85ec9dd850b1f77f759337b9a9ce04e611036d3f45743e562abe4b959eba7424a712fcf7c3f3773886aef22f7cf6168efa83cd3ff70b9521cae1b6689b2b8c423d883a007bb138025f2a31db2147691bcb365ac242efe40cd09a746cc501ae0289e80205993b07f86538d486803da14b74fb0db6ebf1c2bb8c36275137d654c1be56c65891cd50f705247d85621fd0d61ade8c05cf4ec15b84e8adbcbe017d7d5743d5e91025e0154a5d9bac7c6b8297490e9c195c5d74e046219c042219817a5c56636c7c4382c6a01d721d88f4b4d20250eb5eae5f3ef481dbf8a3f47a1d51d080bd4cc33f12645c8481e57835b77a85a2d83301172782f22026e69a43376ac4f5b78734c9eb914e6c76c6a12d4127cf195ad030825322a279093cbc40a680355d086a27f3fb7560713b019e7c286d96833dc60590e9a709f2e3c632894668e74ed20e42cd83a23ebea3dc3bcc49d14f8697541780fb2072dee6a5672d0d4e7bdf5cbdacdf5fea9e03c6d9cf0faa1e954172acc26dcd344bb3d9b2e0e6015cc55d19713d795bdb7c21b44b305e69c69fdb7261483f9693f36f45d356462f1ba4498de1c2e8bc3e0a70893acef2006dcd73cf15b265a8a5d4ed792a34a846d8f1d3b9b3bb75f1c5e57a00b36c00203973ef4e2654f6cb29e4445318ed99f0de6ca992281e83ed03feedb66aeed6a461c6f2871ae95343cd9797e58430d5639d7ef5c59c78b29f76a055e18e2b85eff177770c60ca4f2d61e612e617e749b4653e7901b62ba02dcbf50e59219349120ac01e6b8a6e98eb54abd16b921a1ff85898f90fc49a3c8f8f4ae9b0dd32c3e7f2e1527c4feb67a496390f28532f20acc71abb8bb4f71b434104f41e36b705289858a4e8430b8cd9449b0198ca2244923cff1df0f63833373c275572de5a9a77b23e5ff54aebce8e86d02651f26ae32e69001e5f3951967579ebe8574682cef8c12dee0b18bc999f8cc0f07e2ad3ac94d3caf30c1c8a8295756aecbbecbbb4ade8a2b8015e52a0eb1290693c6316d036e0c443fc4ec591c32f7e7f1b3933c921d5812233d3c21ee5528822b59ef2ec7eb62f7b04f40cc8238a473ec37a07e54f8907825ccaa1421c2964d2c756be450dedc011e1cdd9045720421b9a4a00e9d3076c2fd10d71ee36d5c0fd2c7e42396b034a4cd0245027449242dfdc42c8af4a34df1b4150097726c9745247b78bb2bad5fe8af94eb13ee1f41dbd36e56d801a4c9c5b9ca5d3c26f4714b6fe9f69b87567426eb6f4ac97e8c9541eafc19fc90d3b24aae0f76c4f3f81063d206ff695d638048c2cb023147a78332939d2f2470d16f1ed0e5d3d4dde438affb2809488b99815e54938fac3b02deceaffde310cf422f9027f364f5e79da5d2b5af1b4138ac9f9d301f396b220829c1f60cd2b54ef24576e5ba6ccd4802900db1bb4eea57de7787eda0e30fa90cc19f099444488699bf7c442c398c2ed989d084c8cadc97325484e337848c34562b3dea6f7670f935ed3d5216c970e04351651c1c31a34e862821bdbcbde202d91fed38965e31cc3b6f1e52288f327bd0a787ecd92b3b6f535d1d000b0f02d41ee01ca54e4e6179ad7fcbd60f0e41dfa5c9cc7ee4f7de3844fb385ffa3b24092b30be697f1fd32c9faef29ead346e42fe2ab1d312901b678b43b7758edb7eaa1c2d038b4cd6a7dc759a6b12cec955bcf4179006a7ab6e22ef15986df107080d340b8870e2304d57caa87a9961c04655d7d66c7f71ca9260e02aced131d6de65d256d6b487141c51bc86eb1e4721742f07d09e799b30da7b5ba94c8d701ae34271ba06f8ce134a7a9a2598d1570cf05edd9ec868cfa2e41b4c20a8bc4b8bfebd45f5a60408f08e931617746d1464bbe1f3844ab3272ede635f771f9af30e483903ee4d0cdecbaff4d31451e7791dc97c92042fb932fe1c82652c1d682a55912e33de3b1299db076cef594458670dc4f911f4a244e2bec757dad4b0052a41235e2f5e60b929682608c16a61287826218a1ac3cf0d8286555d5b0552754685c365d4342f0d9c45065daf6786179da791a86b50a5edd6fb4b21f09d9747136aacf79ecbf52b00fb88b0630ec7f0a6699901ba4eff913a3ab33ac85a71ebb51ed343eac86eebb3e79c16e664078ccda09e77ef8e0919b8cc447116b65ccbd5200fbfe86e9bac5637b33c9bcac9596b57c14ad5da548e96a8ffad5f5c69247c68d464c770011da7b45a337f138cda6b4e15311879bfaf12af4c61fba596780e6adcd5dadde372823da6014122dbac70f0dd896a8d387d3c74df282a659028d06cfeab3ae22dcd1fc3ce60f69a0d678aeae0e5681952949e31ccb8975cd167c9d012f4b230b1c1f47022eb1a3042951b338a734cdd17db0ed483a621650deb3510efe74191a94611dc212c0c73b117a73b8ae41892cf176742bd98a7cb73dcdc53b42df56d640739852335f8d44d901fc884286b433fc285fd5b3db8df0a8522cea3182c071f559c328b8516c9252681a94eecec7ebf626c0a9014d9aaaa0c694d14855433dae06656657d1f8a939123d28e00513d72bd3802d211ad7c1e06b9228c0d5656edccad5339bcdddd5e01afdc01f10974be3187804324fc513ba583b7b2da1e9096bbe3d078c1adc6c34d92c54e9c49fccdc17d10e66962120ee5d9b1cfe852569436270cf7c4c3bb12568050e2ca4db08bbac16214238413195dd4d936272fca5d56d7551b9b002df1807ed44abc84c66746387b79bc9e830a635c308a7bfad7c2c22cee6d3d0c5ebd8b230837b7ceaefdf71a67a3a8eaae0c36de86b2d96e759b8b53f8b8604775eb7a7e13223cb21033dc87d775628581a954085c2d66c1c8f225b1aa86091061738e7495cb36a5ff032dc678904bfa39a00285cd6947865b6d4805e3411644b4a4c94a6fffe05ef31e156bae6165d801685dcec195552d029d22e5de393a82ddf3cd3de3ad8cd6bba2325a03982204f07fc3c21518ef17a601fd743b27f7191bb446ff61d3c61d7608777990997e911932532e5b3235f13423756f5b6c786720cf6682932c90092", + "50772c5a0e156ba13a9d86edc0e600021d56f7d31e7e452a74ad53a6775339c7ca6521d87a8c79b42900a1e9e6a1ec03f7e3d615611c3fd5c9927c40e5b508af1a298794b60148df01e9c9e78ab5ea8198c097fadcd6cfa6694be64e00eefe1a1885aece86f6ad87df766e692b58ebc41982bef5", + "93a2561a9904a1787a10e2a668cd6a814f2877a7b512698e94796805875c8d1a", + "588d9bc1d98210d9700ef488", + "165d8c9eabcd5e93e6eff7be122c8c242e1a7f284790c93324f924efabcec4a4ce48262011b7360c2833143d645ff295453853c92f0c48c6dfc2af7ec58d9bec0d13239c7e5593cdb39d49376c6341263df80c0ed2ed79fe9899d0c07de93f6ea95a5dfd307e49bdb5672b158a4df623ee86d54cd1a0fa9a60ce39d1f5f4b6b0ce9daf2a61a907cff3bdd3f29156ac439638e0910d728843ae17ea7368814ad7734732e7c023d4954e1cd5fd19fc9b76e9bb84b61dd4371478917757b14b366b4bfab4eab0d9de746088ad43d8742e2b9e58faff15c2eff084df5f4316111d5dd7d23cc0b1ee1000253f26cd260aa636f03f64a8342e531ca1515b3beecc3ee07a29184988325322d5c09754c278231f92c0d980adc919d4fccf4a1da1d37f1ddb58ca997d6d700946199fa007c43853b6caf5f8049233584087fb23c3952414ac487e452f0c3898486d04e5b008b843122501f9c8a294da9159a04119ad5c8e9f5c211411e34559d3a7bcf2ac10e0174f94f3f2968c80ebdf4498de172884dbdad0acc3a887f9bfe896a6004d54cc424567d53f1198ba33c56aa460edc6af0e437b34322c1144854bafb2434f00703c1992dbad0ceaa0616aec60a380676ca11558cece57a936959d6c2ffe0647eeffd37524fbafa9691f31499701b202d9dc9980e79ea517089eced779aa45b522c9ad193e63ea8b64e8a942f630d44370f23b7e9acfedac51dd9f139f8806b09a8fbbabc76fec3c3721fad5087a6d41f93973af8d787d8bc74a3122d99ea14e2f30a3c90be4b695c8b269784eefafa52d6a79e785eb47a23d72f037ca572b7029d2f37baabce57658119fb02c5b659e3aadfe0052f1cc3c0afc6fe4624533d9700388713945c20c1d175da53738fc73f48fe57fef8305e796b474b6f8d3fc5040042373a13384237d95bb045ce0c20934a964a8372acedfd6e559aa84180a86311a3996cc17bf7f73e5d85d4db2529989e5836edad490aaa5f56d17326825aa20608fd209903335de4b36b79f68b6a52194f6ea8ce42570533df650e65b50c367f69b9f08c32b3ce3e75318106b8b2c6b6d09369c781fbf2aaa35053af215b621f833814ec4778ac683de0dc22c418b077a917a6e405ccbde9f72ed523aa696be1a6f247b096b9235217bcf19b88d43178cce5a7d82335fccb4c079e00280bfd272b9f16ffefa7fea38d09dfb2e4874553b135052595812aed3fa15096abf1eebf9abd598289e0d156974de4c2654c60825d42b662ca7439816d9d3a0255f40a4965504f643f029da535d4b109e8658ec570e99859382ca0ede0b0495d508c63c7f1eff3f648c60e9b773590cc663a751178ba7603a11985ff519056661b9460c1aabc30e83bb0073a927682a06d1b8050c345f7920c1a37546d79587fae2a92c803a986248f90547f0b6c0ad0552d8260d2a0dc3cc76d092ab76b8c12f05dcf141167a6ea300bc23227933396ef6fe9d51a1ba5a754485950f06cfa6964db2d0fd1d4393cc36f0592fca25ac1a6aacda2a32f548ed20287e3d291661848a62d41504e4fcb1cd1785617fa5786712b3005f1a1041733df6cf838ea3ea0b93685889bc6b2857d80a9bc0e7a66f7fb3d805770402f049889311fc112dccc72a25bd127777fd87bf5ab56d39bfe6be2b45a8301c2f324dcc50b27540200d522c24941701f7293b8877ac84cf35638507c7d912a3a94e4384b68c507412df65d0c4ca8ec2da704bd4483eb2e0d13b68c0c2b68c106a55b9710ad0a1436d655a3cf3c419d5e6f027ddf5dcfc896a5b316a7dae9290a7bf81aed539a647c8c98e24e7ed6a4f7f00a11134ca715e5826625c250500f8f16b40de048b095b5dd08268407f58a91c86c36ca5a2bf4f8fc682adf1bf601da24414c74956e1a8fd2888b5260e980c32f6678a4dc4ff73220c22593d23144b84c2ff56920342248876d15ea54fc100c09a81b802dd15f030bda9aa08727ea49e34f0ca8693e0a06d0af06ea7ceddbf0584adfdebeb20510bbac683451d9f84cf0f4e85c34d979e550e07e7f414d6f1011cb3dc28d0df6d4aac113f2d5b04e4486ee2cdcd4157dafcbbd55e8330a7176d1b231d9f47a63da9ee30fec6cc2c5aba3a8c6154f79997af89d972743255355647235ee939f4f305ec655271e0cd562ff6f401b86dd5826c769298445108ad0d9e13c504551f74c507436911331db60ef0ea99dc259b13cfcb0596fa9b3c95cd7fc3b1611e3b012b6719afbcee7548939676dffc372276aecd08e6a14251407cf995266545427d49ae5ab245cd5d534c52542fc71b3973f0b766f3d234c8baaec8b74eaa8ba90abe160b4504769d02e08d7af4e7ecc167780c619cefa58865169b674b2b1e10d82f6560ba0be41a781f4afa46bd722566d941a8e6f87e4a5c03d89685a22a3470354f2922e2915f9d46288a5e8896ed13617dce694a595e379f25fe621dde8ba73d865976950954e5bd07db147a0fb74f87cb06aba49b073942b82fab33a878651df73df2721ef800b658bdc6c359d396f684598e93f38e79639b8736b02dfcc124fb9fc199c35f2fa1d0dc39939c57286e58a7deed7b6c76e02b99a14d9bbf11f65d8eb7fa096fe4baf0f78cb34736499a0ca550f10d7edc8909dc34b039e3abdf1aa67a51d37a2eaf4c07022897d4d8355d3325bcf392d91d02d462488ead90b366e9645b956c3802e4249d34b5b2b2484a1dec15a9477821df6bef5e1626ec5ee9832fc3bd0b63a3c4100d32fac3e9085f0b5ba43123f54beaa7ccbe6ba68231649f35a28acfcbbf97dea2d6cfd96025032b3950ec8437108d0f07baf1bc89e3afbc2cdbb5031d3cd9e20b19018adda466382059229e4c8c54b455eda4280bde43b36afa96e146e408c7104523d5f565d22ef86d4c7cbf9c6e0d0b30e37b37feb9332939c642eacfe19d0dae1259d3267635051ea5f9b518dd74786e45fb8bdf72cbe3753bd50bea2a961b49cc0e2d589e77fd25ebd962463fc728b1d288c38a79a182b124d345872afbcfe792d259e7e5334311244edc75d05f9a12eadb61fd3ff79fe8c097eb01a4ac1f0c339d3be74be3d96b0b6a15e8868d043a0f2007ee8aa51756d78b7a78ad90fd9a26afbcb51fdc20ed7a3947f715c833e363bb87504d8efc9f8b93a993e2e26430f79f3cce203b09093c9b456b1967212eb0db4f7688d4dccd4a523866f75c9d9e7ce07825ae34399c5607a60b771866a647b6d5e1e20795ca906e451f367d8c40ffe79a2cecfe7aa47a402f8d49be9084661c96ebb11f1b48e7e8abd2978ee626f962e98f99db4eb3c6a52aa2bb2e62194120ce1e773b9db784e8c9b5adcfb70e3bd5717293eebf014e9872c5c1bdf3fb296cb88eab5e97a5ac320092033b49f37d840dac23021c19ab2a89190f3c8dde927f6e6b41874bf71ba7747a616682bd5b3f17a1dad40f4993a1b186ce4f44afb4e36af7715450bac62cb1527eb8db1d87bbc4d9c99415d16660e48efd911e02f5777a77e72733af3c3f5315dd0c785d5212b79c46c3bccd74582c57cfac0d50fc0c85370476913f9d8e8e10d0f6602f2271994972de49ab1a91728713c3cfcedb0e61c270b5fb331a980965bcfe10b41251a0f7915d5943f49fb139626f1c424524f2fba3a407e77dd7513669894fd09fff4185fbb997b4e4677f6ea0b52892f013f1691bdb38eee9307a565e396bab484d91cea9268f49aed29e319b0add900b6a75f7461db5486aaf5366f98df05674361308931de753c70777de73337a996f6d4b0e06d63a69849ba7533bb0e446f062edbd6250e61a49f4120f84efc1cf74c1bd30cc61a2d719fa76991dab119fc814a7c56f48bd584c7935679c53bb0ac78905b5d961fcd89a4b567d17a5182651cb07146aa9a94972ce613e8ff9c878a8433c0244052f09980a52d800e97ba65e8ac186862def58c72b9feec91266e26aa5075b3337c7bb8716b3acafe666ffe2df32b78f9995661d3ba28f8a8780436aae1da2a3e6a0a16dc562b8d5df6f68391aab73a10508e0f55208f974a0505f0fc0d8a55049a7b631fc94fab91459ae1f199527362695b41972e50faee34c5cca9e35e8682099f5e9652f88cfe9fa990ff2154c89c1c2a4ed6bb8a889fecfdf048ee0aae7798c55d6cdfd062cbca97ca289578c832d658ceaf26faba54c9c3ee9eb5bac80698c1441b9cba287f749a5e30d5cc715a01c89353ceab0974ae77fecc1d2dfb31a5101783cbc002c73cd155dfd14685c2f9acc170dc437c649b6b4720b676848a7f9b56cc4787eabe72f6e3f2aed776f9bb1432fba93a63bfa44fbcfcb6eaa9ef4b79b32bdbd68cddbb9897cf5a02c6f99fc765790092edf0d5bca7c55cf232a03fbb6f3eae09b12e09a9b49a538e0589394700d16ebd3", + }, + { + "3497e8d61062e6f2084ebf72d00e9a47b550591edeee9746f31ea28039a1646d384c4348af293ab778f92a4807c48fbd14e8dbf3d67339c991dc4aca7dae38b5fb7bfeaaa538611d328b653950f4f664dcd257b345917cd66dc6a1ea75d99f70549d1af9d67b1608077b41576f38bb4c0a13ff4fa47b251142c6fbb79f9a27f43841ed0ebc0416c37f571aef8fd63b99e93ae88db50e9ef7d499ae7433d5686b165579d3598f96d9e7b1c876870310703df8fdf2069beadb34984f676eb7d3840c4c5766dcee3fc39f0739260a499647429339482e232362bc72c92a299cae36e9069cc5f4db8893e2c1b9ec0b4f334de26c951090b9724c2b3b7655d8248bc12a27861e020eb1e4cf6ad0dab903279b6fbdabff761d4ba159c1f631e681f210a8782faa86e08e554b5e30046157a0d1144bd08a691c2cc2dd22f3c3a4e5d44c5d03f7e3e385382ee4683345c0d316d41ee75f87038b49e0ad3ca45121789e7e7b95615e1a9a8dfe02c044c2935a97b141f639448182252ebfc980e0411e5fbcb3c01acd5aa7cc5d67101ffa6ab6acacace5f02d67155c26dedc071ffa66dbad26f67a819d46de0556fdffc1b4ab6d60905d8ef873ea1e51c62571c08b4c6db242e733e02e11e5840ee445c290b2232010b118839b37d4615c4521e8928e9ad475cdb4a3de9928ec7e6daf0e20d22e308347b31e7e877fdacda0c25f2e5c33a329e84707816ff4ffdca30dfc753c2cf883df16016795db34359e9363fac60624ae4d2b30bc1f2f99c23d953779c22ffca145fd08dad83c0f76cf727196799544c6c07483e0a41ca2e1b1da5a730956154f531d292b5a39a229ab13bf24a804eb68786e481c8aebfd3bc557afceadc41d00e1472c3b80ce652be1245089283bf1a1a93abd3325bb6eea121db8c0e1d6c0c31decfe9dba63c89b881824b0531651fc500f2f75ca9e5fdcbb179c9ded5d600a495ea704c2709f4a88c4fadcda4cd82a5b089f25a6fe0161159efe03fb5e0d44bdb5487f25e8c9adacc389860f62b06a6a4f8f104d9171622f70652ace736e8b28b70a4d9fd3fa4b9784d1a6e6811150d0a0601d31d17f6041e58a1058f99b80b0a6cd4f79c79a104b6bb731ecc881bc68e1d99ab358faf43d8504957ea0152e46e27dbfaa17d0f58287276e4fa82ab78a03513d5b4c3199d1362e4fd6447d1c26fadbd011abc69332ed0181952b391f2e8a5c89d68e22a7c451f69a9573b6bb6d918c7e3d52116f3f12f1d43d2af46bb450f58bde1732a268293cfd9cf2b90a844588c1979a30d6ac21aaea4b9e5500ef4a8bcd62bd70cae6acc8839f818d23c615e45daf14335c36dd46817c9b816be60c3848caa812b055da33f45bc01721d6fb7e850fb1e1458f27c70bc34876a955aef11f5703cfacde03a039c3b75b99b2d91fc18b00071a28ce25eb169b946b49858aa0885a4c665deca020a3fbba55d4d9175fd91e7901ec9eec0239806e8305f8238e5270f4af5c94d0008f8a5564636cc33c8a3d3e76db2a7915abe798b0dfbb3e322b33e188c7b188573bddbb9e4a7edbd4bb194b9743c4aceeab449f8affddbc2b109eb3d84f3b2f8b18ea2962680437241d82bb6146674ff1abee7baacc38d5dcd688b425c3e3b0dccdda3e36de755afcf7155d3d7cac2e279baad167e2a743b82ff8ddf3db8ecfa9680ddf468339427a4e9fb8ca4ce6f1e790c24e7269912a9989088c65965b0efe68ed44eb26876674261e3e72042f5995f1a7075b3932f4c23a8027d0db35ce4322122f489995bcc0b3fa32b7298c4c1b3354766c866a2fc0ea5690c58c5e08ae7037f70accb3ca7faefc37d78883f2bcd768285dd2571dbcaead813a0b8ae87cc1df868e93500d414c4418d5c80b919f73b9fd46111a02bfc884f9d30ee14fcfc1d55d54256b9572afad4777b8d8172c911472a22e7461f6f85aca063c19d6fdef3351149ee6864e93cdc54ca5dc7837f0ead91f5e3b155795df5dd1f933cee8671ffc05058353995019e5f6f55d2de6470605a5411afcd7fa5aa8f38d77dbf496d7fa9c5a4d35ab661aa15c77ce42bed44763166160ed5bba954e470c293ca301363f5b837406ea8ea746057588c34acf266030864d8c40e2da88ef04c49205fad1607d456767d30eadd884359bce04c12e35487bc1885d9b104c9fd4dea4ceaf054cf46cb3c77a619ffe963acc9bfcfad0447591ccd32cdd1fccb1fe7080ad75cca2e17f695ce0095a774327123f21e2839773506a9f2d896bde87dc5e35512ad733aa408f8a49e9018d1013cc32f550c968a03308cdbc73ab444f0a79a13450d4de906369da4c6a675d7e338f738358dc238be4f047579c8ba7a60448da541cb9e57f22bfcb8c26280a59b77edd0f5a009a3ef1e2958d6d3c3372840dc6a0c6ab1fe86aeb7590137feacbfdc7da57c77595b8572b45c4677836ec86fd8c4ca8ac351397aaa3aa298d752754507e1cc514d41c3f1ae0a692179218141f65bccb9acf6244730c6d00829455d21371972745b3665f930cf2aa9f0abebe6f7b89094aeb4dbdf7bbbe794f134b6284e289c995ef2929fc1bd39b259259950de29e57cdec15c4a7d33ef6e689596a6ce23301d25c2ace77fe699d90c2329da4d0f471bc093563dc735ac2fdb32c6995606a67bc953534939ed1236003c004d3b47590beabf39a1e4d5d1b00898496e9effda68433da17d1ab3a32aefa3681aeac116c5705077552649153ed15e9d704e67d8819579feb02d91db0d3533182ff43ee5648f5cc9a595ded4772d61e77bd9bffd6f29fc1f478dea44c32d5ce3118bc8860b254fb0bb1e85223bf709a7c0b9a52fd3914f1b1f295fd246bcb568388dee43a32df45e3c798068608a102143b5511746903255b98238003eed68776b46bb0e64af6c9118ecf9896709aaaabefbc1f58bf45b45768345b560ae2cdbe4d7da497736da8013c4098addb4258cafe7823bdbdd715250b707b155248d39fc6773639e4de3b201fd3cdfa1526c4149ee7d15bbee680c956fbdea844b1470a287d430c5c7e2d7b51fa756720397bbe214c19df3399a989958732d93979e361f7266e53a59bcef695435db67cd8749d258e7d582726e1bcad1395e68d7848849fb6d74451a53ae6e8989c64701102959f7fedc6a5cf8352e218396f9181f33037ca74886fae6e57460bbcb71cbe4cbb3d3a81e2090434eb1d6d5baeee4ede251952ad88001ce047279cfe435a4afe97847f798d84ad79a11bd44f09222d2f3b7fdcc47ff8a4c61f40c4629a0f603193e0aa2164579a05726e547c9081abcc0087907f8034469f740a020e19623fad42e9cea64068abb3d6ff2f6680da328061c200e1f646816a5083786ae5b71728a0e5cee14d7a942379c389fa9dbc7afe7e7ae075c061df11e4587bc90f92f1b077c091c43a25e7b3e870ad852c2883aba2632063c4ff74a857ef7267816317f823a8bc5dcda311b513be3a40e6bdeb89210bece50a608e624f00c9d063e0c8878884e45527f50a3ab4447a9a01652322700f087b6f96ddbe96a68ef98656800eda6563015a6d3c0eb1b6a9b21cccd58cdcdd074b73e40a098a980210ef831ec9e881cb42ee07519fbdfa52d9c62766a2046dee7752f880dc9082ed7f050b49ed8d14307b1b811bd87b6db2419418e49885d20fd7ca8fb45a11a1da17ac2304393734b552b5d02a303ddc72d1f456697a287851f207054c18a6262f5349348c806841d21e11fd4e4ed9c01fce1688483e009930079f7d2045a34f98ed83256dec66400a783d58c61619e6e42f6e2c6e6fc69e76651b96aabfe643ac69681955ce595f4696b80dadd1f3910061be6ed0840d47e928dd93e7c3d6932d3ead820d06e2539d9a604a6b53db6bb599da851de7cc060faa9af76d708a9aaf371dbc3eff0fdb99702504c3006f789a49feb730cabe40745837e2c8c17c77f999333798431231b337357637a5efd1eeed891fb7475f2c9f960e67578adf50241287bc5599ee08d0237f08c86ed9b75b62d612a9353e48cb4cb022d78f73fba1fab7f794a5ff64c97e6c91ec464847a81e5a5253989a1ee54a41bcd9b4b77bae6e72421471a7ddf0136edc59b72402d57e542916ee47fb3988b7123c6e8debddff2df171d4ce61e83c3d41f36143c9df97f2f68639f1bfc2a9d1fe175fe9f45e17e5cfebb330d3f06e15e3cf58acaff09ea576d896359a3f06985765824bc499319384e4c458d4326db801c564b0b503552bdbec60752b670d82cc8fce9028ff24ade3e805b81a72701b37d4ccedd72118b20d792739e035bbacc4893ded88619a6c499f246311947e48684a35406c4ef279c71ab2a74f6e5313f7900080f19aec3a39109d4aa41c930c66c84cd2163f4cdd59fe84a86cd8bb6468bce45a56d09490e032da844e6d90b436dd874c1cd32a75d1ae1d3e86d8a2ef948649eb56dd7b360f55ba5dc34a12f9279945436c6fb83d1ed57ba4ae1d9342a3dc2df9baa82fc9fee927c13439ba5bd2ff9f3e6f577b8d2df731db14c51db8a14bb15bf3e125f1ca4cb2fe856c5a576cf995db5010687d0799581c5e76d400c1855bb46680a631cc582f51c589a831", + "823d0cd34e7450550da9716c1f456ce0cbc79431483a6214939266581b0e899e4c95719a09c1ef166a618289a6ee6971b6fea3fe380512cb977823b387ac51d341c26d4a835c61eebde37764d2e1d588df7886177e98e3151106c898b3196bf4dbd83f5f", + "a4639c22fc7f370d8500a53819102df5e86c541c0ca10e8f6564e50b90c28f34", + "34a04df283c45655a52bdd84", + "cd8d1b2e5f65ddb3c0da8f12096134da22ad4d541444964077610aafc1f77f8da5ffc75bee807541cb6eb0526e78d57fd88fa9d9608914cf391ae7ccb8eedb0aa711889f9b6192601163b271c90df5d69fef487b6c05a24fc667469cf16cbd5afd58fc830119fc9f61b26dd50a96ed84c96825a615a3aee84ea4c950152323b20884346b25c9e2a6be3a93505ba059fbb114c224bed8f05f54eab76b2c9c23a0fd942eef9696ff67484b542c8347f1b1fd7df7242872b3528c9e45030447b2bc85eaf191963291e4223b75778335e5f1256618ff87bbd68b5a9e5cbd2ca1dc8aff4625c834edf8fb0d879b1f75ba9b85895a6bb4d7569a41bb3be6cdd020065bcc69b44a8fa335d9418ea2d090d8061e042e8e1a6ac03a6d5525079f14274079734ed42c5c9ab9986f0fee6bc9ee6c485e233e9b4d6de70664902529a135a5675ae129353eb2c00b73f226e84fe8c594272d6eceaca28b6da30492c92074250ec80beddb7208f9b5418944305b0864009b3bbb3dfbfb4cc2bba3313f8f7c6c19860f1dc0f5d7aa06e3b551adfc63dddac980a79d72bd2225d54a87a93717291c7b78bdfc5521f7f3239d5564fe9c9559dfefe76b77efc2e75991f31a0134529a6611ab9ef076491f2d2d81ffc5774ba8f8009dd7e5881e09ddf5116fcb5a44e576aef6cea91ebf52c56c742049639392cfb8b280dc2229252e04d8d394ffafa539290acdd8118656e7e1a4f7bfc0bb689448379e8cedff7590a09a3f5a29bf819fd87297b96ca07431a29a07ae126eb9d65e21824c16707db89868e127f17614a536de6ed268b1600a8b02aac2bca54a09b7cccf8e184448df334f95b9f0221187d56da7bd422f09b4d94228098b563df53414a5a86728962a2ea63023d8c3f03847b36db7cd189ccfef3e623b14842b8cccb18b4f80f01b32a4cec48f3009b98ffa25dbad76089c8700e90848da74aeca81d01f4dab2b7e844a3e48bef21f33c92734b821ab382bdf6d0b1048a9866e676b78ac9398678ff626d5c173a15a0a7514b2544405dd54eccaa2791605c87d7117bc9f8c0ad84623a9d3a2b1733304b492d4dec38f7981db9361b03a2837a95fe937976c7f4341a802dbf583366fbe368a3af3f92618046bb55696cf7af1f465a5a57ec5908621f431ffc762f35abe892f772a60a3f75ad8401321f67981e90083fdd1cce40903ce56a629120d6e13c8871523c4d848664331966298c8b31a5bc8174a8c14f61cbe98ae7ee3e90bc832b04318864d19a9b8b6d49a260f42bb120cef9afbe704faecf0f428d917ead9f020f5e9d772bc8f29600f8a7623d8971c1e3c5f1a3b094191e497bd70f85de124137cc4b9fe0617cb73cd44b89aada072625e25976e7aaa5a8fe9d9e3f32db47d1565aaef0e84d256bfce6aedfa1a2dce5a94976a2bb9a0da95941fb7ed444990b0e0e87627e35f3235a998019650a5e5cae804ecab8cf729a5c712f1e7d17486082dd50cbeb2ee1b0be6a7bf08a66ab3cf1fe9f49c7083f5b8ad183f32fb35fb8a41230e4041bcf0e5ef54bc3d21ecc1fceb08d95d745a997e8f2fc3c0f6b1b6c1c02e03ff02ae0d879d13eedd42d9f9949ca7ebb785764162ceb6c6f9944dcb3927b2f4eab23ab566b2b2bcc0c7d77b82579e88203602264064ce98b5b1ed992c1bb13edce579ae7f5e11697b493749f308b33e47512533350df5c07c3dadff656197884f359cdfcb736d29231aea1524b56e06c92f5a98ea663543f67e44003f5b41907a951dd792468c84c5e0e1b46149a5c9751295e153990b78c0cc712889a21b299b0315150dc50aa3b4f7fb0079ddd39d263a754b1dcc595c76ea9fea6c120384afb38d4bd40491c4689b1afc9dd096dd0327c84802bda6bb6b7a8830bc6c06b308ae9665a8666a5551ec954eb72adb827ef38f036c51698a28c92dc1c9e25c267532da2c04c1bf27f5b683ac750c3ef53a8460dc186331549bf82868f9327422c09afe1cd15e161bc41a70cab2f973efcfc8f01a380b86a432e1ae540e09d404d93d22a20dd5f685a52f0acb863dadea236288b1714700f23d1c19e40e219e8ed21f6a393e541abba850ffbbd4030e5f6567b7202fb66d86cc2a0beabd495814f6a50690e8d74cb8b093e4d43261fff80e7a67ca06dfe808899cbef84c09ece01414baac740cbe4c656b17991868e2a136f4785a0de311aeb18cc95ed33fbece22aaed8cc1e47f58cf6c09a6f92c96f37d2d2485b369093506f5e9f8534f8569655277d0399ddd3d33861bd40c71ac53a44d1981cd744d79202322d47a0228356c0e27efa2ff1009cf2a416fb6e8844eb76b8077a4a3961ff193e1c95b222e72688ba48be82ec5da498e58861ea613782ed1ab50a95b5cc236834af98e61528ab18453c20ff978551b81e1bcc0ff4b7092bdd9ab0b946b7324b7361ef05e1f7d7f6a336281b4bb2c671a95a6ab84be6bef1b9c8c3d2536edb8d79b40637e16d7281ec5243016232d7c9fc07ed9dfcf555055d8ae65f12ad150da81f62f2e1e82b3adacf6d623ee4759ad61a09038905bcf1dbbab671dd28fc1d10a0b7eaaef73a5862ab449bd84c8698d061e79fbe52a86739ba945a01353e0f3916667bd7b4356cc65451c7003927f2aa738d98245760550156dda529be741ce3ae1afdea0de35ada26ac241fcb5d518e6ee7f9930baf88bacf8bdaccbecfdb920f3b26285439912a8902ae029b07f28c1dbcfde780cd2bee6c6e5f4520c5c7ff3ab5448ec86cfb270c39586f80041f3764b5dc77dc5ced0695c89671cf90ed34c4067b4bd938b1493c7902dd94be824810a00bbde4915d138fcc7584790bb0b6682fc0799cd415441ac90c1caa008c7fde3ab4a3aae478c64991ebe07e6c4587d3046c9ebb8e125e795f0be9266bcee5a4e4355a2830c5b34e583b0355b34b89c08011db6f6b8371de003074704e8cdda37ce42c7e395b6a37bae3dfbe67bcfd1f125c9a262d56883ddc028773988270aa30c6dd326cbffee589f38286533e1d5c9486011170be591beab5e0ce98837cf91f0a58d69d872e364aa88daf9cfa71bad167129420282d99ed5884a1276dfffb2c4100c74a8b863b063c07937f2e9c12523deac4ea16178863d975e3a5be5efb5ffbea994d07f7ddc5326bed1f5c9415c1d4ee1667e3a581499bb573595158636ad94d84f7c6e4b8efc2b141f2bfab7932a050fd88a8c7b21877cddd488543db5b11138cc808e1248b6e2ef492faa8a32f9d93e3c060b5cec10f03794248f9662ed8c283a8e0eb493824e2750ec75b3b1292d80ce002083a3c64cc487afc31b20f84a778f386b012ef7bef46e638d0f1cd75487ea46e05621d608482637b3e642a9a2c5371bead4386eff968b3e007fc263086d8a930dc76a8431a4e6907ae35c7b3291075d1c723f02e4895714803c0e97d65b04c0f27d01d5d68001bdb3bbd44dfee1eff1754fe8c182cd9bc6ee273beb2a444ca1766f747d86f36cd8cef6eb1dafe0c38b9327a8cac6e83e076099188f02721cc4de3d940c3ef19d9b067be07b890c798a79ee8c44d96c5e05ee5d5202d941a674378386233a83bc85134dc8c46a7531b2b952fb277d8089cfb13e882bcf7545f0605271fe38bf4754f98dfa13fe6b635a62bcf962553882a8f28a9a5fc0b3f85509b702d4a7555d40c4f7d10fbe80d48b4826995fda7d15f14aa9b95fc6526101cf09c97fd74baca6bd26b4fce8a57b0726e0f68118969ec067e9ca39b2ba59fb0d78eb5cec5b872613b1b76763b3217d859bd6d991bbb5448bd4e49dd6597ddec9e46afb3f71d254aba828c91de51904139ab19138e36e6996a207da80323d96077c97a3e8994296376d4dcb602f1e77371efe8b020b7b6f6f7bd2bd733ad9c06c45b77a2893d73b4a8a57707969af74ba06b2fe7d4079bcad1cfeb3689ab95c8b1215fe0a855eb431f67df4ea589dadbf055086924e42cb142c9031e25b81e8e1167a54008ba1ad7fec6794f203b27f3092dd72bb766c9653a72b2e25c965f53487cf3baf74eb7742702380303af8c0a61cca3eec78d4b709e35e2cc5bd586263d9f56fc12454547bc6165e3f070ce7b2bcace5c8cbf52f987568dd90237cf190dabd4ee7a80494692a5379b013611f4eebeef8e1ab9a9c5ba61926095545e19c3dd61b7b404230729aff7d82b6bbbed6b4a926f6e49189e3bccb578fcb3537951fe9c78ac842350ddd80133275ac0bce3a669183776fee8288f874d29190b452d65bb7d8edfedc6fa0ae147102b92041af6dd8a566932e016763b60a5b9b1e3667f228cab075f966d1c525ac19d12046c6409345799adfd7154b6d8b51eeb1eab3a132ac6a2e08acd1a34bbbbdd019195af9f8a93c6ed5463765173e669cb0d42b6cffee1a4b45987853d43c02f920819f45a4fe0905d8c65aca182b4bf56fa0dc51cb53c642fef003d92c13ef4bc1bac571cbe2ba3673a49694f6311b7dfc17a4069759177930b179748d4403c7259e10a5d221cd0a6b745966e598f894e607b779dd5289fbdae0b4348141ad373a62c76aa454b35b39a7be875598bb30007fc300606ee2537cfcd7c22b6149880fb3cd8eb53054d698a0d20f26a5c3ce468255737a68706784", + }, + { + "5622aa8d2f308dd468a7e4959ccc01f0e80d91f79df65b8201eb44911f6abc758c6703bb97908fff377395d33f96c328a4541f414b7ac34c6607dd85729afbfe01feba988e4997c6bd2c99fcc35d2467b143a8fcbe6b49247226a9e4c0a4e3c1a29d5931e6f1f7a31d90a0e0edc4479f08ef9bc65ae4eacd0b93b1cb38948dda31e60b18d702bbf5935bd580201d1f280cbbee679fd834aa6be576a37a037eabe989c3c18c7fb61fda8b9ffaa8bf22b57a101c19e850c454353af7af3d755b26ff1ee78b9d9daa78294972d108958682a5a29c8ef260e2289ad9d7d74f32fd4e51e5d9ee828366abccd97dd56e035713a6f3a1985383c0ed5d98c4accac2fa1ba7d30a295670d5224952f7b7554fcbfb426c9496f054834dec48f9b70af3d2b1c6dcda1c4daf3e9601364e57851952c785e65d753be1c22729bbde33aeb1e4748dbe90da6ecf716f05bfc68ad819515dffafd33a909562b95140ecfff1d0747f8e0459fcd3ca6cd8893262614bb4bf4b639285f327e7ac782898781968ec98f6f0f2f3c4bc5f9c4691ffa7ddb3662816f8ad092095b598bd4d10d6b5fc6fabed619eb11dfd4d638f4c0b6cff7194156a411e8ad6d3229320336ad52fd9811c3a1fcd571d1bbbac67c6186737ac7ca1ed9b2bc46e4e578f81c164b09ae5cdd4059a2c22b5e7ce1dade684e49200867f9bb1430aff9b99805cfd31f7e3fecbe898f70a4eded86b8bbeef7050eff6cf8ba71395a7ae2e270a2b58010e56cdf6efc4003da3d8a82e96979ee68694b6113cc9a6e377d40a810063830eb95005a81405e5b7de8de67424845bab1911bc55da6338513742d237a555465fa54b07ba50ed712e7a57a39fdcfe4af50f064ae969823aa1c40cd86a621ec90769d0c1babd33e8388a8bd76689215b9827a5819127bb32ecc80a562a291f3192eff34cad2635e5b0c0bc174add72e2041864953f1fc72be7d28111fba0438d9036da3d5c0f220ccfde2319bb96fcbfae6055ed7f1c1967ee9a78e93bbb77cbf151084d602a5a2f087d49c3134582c1a5d7af24f4c88be26204cc9dbf4368b19470fef49a5823a2d66c65e9b1e8ab56bf5a7bb3220696840a6222caa58a7b39fb792d95d25038a8bd9d916e853cc5459640f8b8468e3d51f05f1b95e996cee40ffb7ae14cb289094f1b77d5573c1aee7c12a6c3a1e31491422f272cc5f510d4f18ab63d3c3f468c5abd61b2fa7ba0768d46392e2a4dc06c7ce79841dca916cd33cc0a700b50fc660e5d1808d8b87e65feb89428055495823b2dc317d6d9e50aa5ef7ab14076174ed32f56abe7d410e58ca40e92f8a31433d0d74ba7b130b1561f2b075fa11ead744d031f34d82f1a64d428f6cccb0a009be24b42937bf3e99a1ef1fabf0fa7335dab52918382abe756d3de229ee8223aca6d7c5de87047838e387d4e472481a4cfd4365256e13aacb518ce5300f18dcb5e0a28477a6fca08a74756ef6bd8933bacc98d02abc7ae60df7cb3e06d41abcc4bd313c543ddcdea2424d98ffc6dcaa83658aae11f5841ffd4f5df42368a0e815d2146a0fe138b223764b133d17cdb08d485e9f3dd2bf2b220d1f4565b02d7b9231d592130e4436849f49b1a70772244fc0c38da372a8c57fc80ad57828410a5a16ac6d14e093997fdd5b26e4cd4b248e0ea221715ae6e112e1b68b09f795540e31b1231244bc922207b906c4f42b5302dd7474286b653b4d1bb657134bab117d6c349fa0f121c2f8dac9cdcef510c1c28545eae0ab163db6cc84ca182feb858c10153d0136f00a01c9c7d0bed892715dd85c4e73627c3a2ef0f43710dfccacffd1d9f118c9fb1a83b2eb328b8da3e955f027d95294038184f7b895d77532c7570cb86fd6b37a5a66659cf1e330db3930f302838706050c0dcd91d532d49c89d144e9a7f864026ec99f50acc02bd5f11ee88495ee8991ec4723b189f84e03d992fd718b5173ea1b033ab7d3568dc4656648fb54d28d3119b0f293a930a772c394f45ee66838f17b73a94eca27033f9d5c2ae22eb813386905dc024673850a087958eed191d04d05798bcf909eff2deb2a0009d223323b290e3d6f71b2797a2bc2590d54294a5992d629336518514032614a04847c3fad8a7d1cfc2f86765b48cf58acf892f68b691fbece38100e6a71487ef5c4ae934f1ba03b4b26a1967f70ef1c697202e4eb22a3a95ab3b7b524f0241ab4d2adf3ee5e3f2974d0bfe4419ef0ab11039ffc26339570e74d260c4d5a16f22cb4f60b03253487f5e46c47836ce29460728086a615f78d631d89a06790928455889f58adc3d0a3a84ceb2ba9cdb00a403080e6567873b985fd59fd9dec71e375013c12c51cb67d599198f36f58fdaf897e85dfe6f9896cf6d35a84cfdc6834dd9447a2a10e1ffa9fa8edfef1db9e8b4a245b211de49e04b7e88977b4e1ac9285f43526f2452181ee0f80efeb1f6b2533b656519ae45652ccefca81c17714476b497e5d8e9fdf6c9f504c7a7fa7afa36df5f4f8da5b4b973b1618fc8d2d43e866b235e5420551d1659e5bd545fb78a3e17d9cbbc8e842f3fe6be07b892453ffd689d5188f26f9e4c545ba0b3132af12a03bce6914015d026d3d7df661c1e6384bbb50dae24abfa78079a2b1ac41c44c7d82a59183f293f12011e781d3cdca2f791afa5b55a9f2d6139587bfd74bfc54ce91e642847a33b48c1b366fd8f08f520b79ad5113a0273735aee71ceae361a97547fc09b22fbe4e4ae4ae13e52d65e0971341aab368d1e917c8f5f2ac57ac119f981b51b7c99ff2be3e16935b7c73e28fb58d332e6f2c36281228c479c4d6095cf15b14baeb0769191dfc649a70471a25d45d4433797a5b8ba31ff567e60ec4d759d99244d0fb5dfef7c2896809938ddde0d2015a4c5ce5ef6cdb5752da1c2a33e5bc78b6b7c6a5af892f0792c28560a357720da3cee3833bbeda8e98e6a8cccc6535831cfc28bc8557b4181a3978bd90eabb34b99eb7e55d9263e6790ca34561d8c87ec4e12b4a38df524318db00a9b5bbde6f5a8644a818a88e91b521d716fa9f95bf70b109b9905bfca926fd42ecb9114c039790abb0392a41ee4c190536a89ae6194befc2dc4bcf7562bcb84f65c99b69612c0511552f53436b6c489204d3881e1f67e0fba3a061165d2955c2e2e12c440d31556250a8a5cc04ee5e09b1d627c14e08bce1a92df7f6475db92a3ee57e4c16c3ae677c44237122818ad457a29595ab528744707f3ab7ccf3d20bd94047e013e647802a7af14cfc7c11441ea6e9b9f960fe69d03911ad2cf3a8f633e0d647c71dc7e188c92e75353fc953d6a30dd0040c39d4355b71524f1a4872fb1ecab22c8293b54bb22a80e1e3d4c886d2988adec26f041dd0565cfa9edfe5ad9aa7da1d3b8f68fda9e9df9dbe98148120af6ff30e6400deca6dc9593dbf06c856d0d582503e7ffa185f87c6e7ac58184bb80b4a1c0c18d669e23f9791365fe807356a5763ea418c39d94311759b29b14324fb6f3104359ae66532779b825f92b7c9ea2ba43ba7de04eaef7a86192bc93e17286f1b6e0a01c33c796ebed8f17692eb9237173a051c14e4869afda2643bb98c9ac4ea94c6bdc1401c80190df6abe988d2f0b2d80cc7bc8362ba25c6e5df4370a43e156aebd6aaf856b3f64d5fefc622d078faed40b760a361966a4765adb809dbcd74b7a41faffad3a64823860e5656874133c7f8a46b5a3ac591906359aa4f171ef6bb2ea6b5f24cfe25c2fc7c1973bd5d3bb5f197002c5ca1bccffb570f0265f5cd949c7386d961ac9c5e18b5d1d6030d8bf4a48c10f12dcdb11924b02b8ab5e91f425ca62bbe42b80c6b6dde3160ebbd55803966716734327058e29bd39874f2eac199067fdbbe8c372c5a688d3615e2b65f4937b67d6a26c64cc2a9e5379cc00925c678f174f538915f912e85b7014c064a73bcc7ddd38e1a9627ffddb4bfd6da764fdbfb45048c9495ab1a4cac5642f6c9ffbe97d33cb26964a23719620df3d85dcfc392c4502759fb31a6a797e99e51e94cf9bc79ac15de4e5cf7a05aeb88a8ab4c3b6f9c52b99794503f2c49cd7e230a67df7403e552523249f29d257b35c0c7712053c3d9eb583a1a7473d7f296d25a66566e4ba8b08de2a31b082e40c8e5b1e93985b324dded3f52511744e7e99f4e3ffd99d8ae17bb5122b37f637c5525558eab18a378f5e2cb56fa003ed3af8d139d16ec4b2ea79c415b0ba4d750ca2cdf653582ee3b65a9825fb9b123593e36e645232163cabda515b959ed0a1419e9894f6c677ac200fd11babe3503ec7bfa319f1b9559d94a6f82945c9ca8667621a5d28920949a1da644cbdb58b84742e9d65e7f2027b99fba4dec46f642bd17e88fa109143b26ba7fe285c89add0b74a369f3d381ad633bfb4f72e1822ff96aaf9a73b3c59a6e457cf40e17c1198c64737037f52d9b3118daa3fa5cd3e3c7738e3b3743c595893289974a4aa0d6bf1446e70964823a7d5cee67b9b25b7125d9ac5d1d61f2a6947c3deec6deb575e2fc5cec60df26de3c0545e5b79156dd6af33a78552d1ee9994cc8501b7dc5fe7a22eadaf201a92e06ef03be705a8bdb4db65392d3628c7cbf44cccac292c93cb5a407a7a5a0d5ac9fd95b0033d6eb719d3f14609190dd40d5aa1b983cd4c4e278cc8a1e7d5fbb0d39060d6cdce8de6a17e2dab973a7fa594205e17edab6514372eb51e03b0ced6402fac0efd3af49fb8214a505cc9f5f0ea5308d7fe6dec369ba154", + "9f522375925222a04f5c95ee14b6386412025903ecad0bc3ab78afe1145136b3a3592835ab4ad6faa66be9", + "d1ba82b3ced3e9817642aaacedf482e79bedd0560ef2754215ee792514bbf8e6", + "bb21211f342379370f2642d3", + "1a6683805d3f478ca1c1512b9846468378f83be27393db63956e151ec408368b47334afe610249182f54c4d0a01b704db2aa90a9755b8feb67ef9301f0715d7d6bdfa5cc4497cef1142a43eeb42f7c413e8f489af30d742a706d05a40a0c4a5991f9e2cc5d9fbca6ad3767682e20c146ac35aef38dfb2a77388b738fa022158d5c802e5f0761096bb45b50815ebf09172759521b5c5d459703ebe9ff669ee4d14a86e5d0650b597f4a082ba0aef366a924ea378b91c3262d99f48189eea19c76c0f644079f8415c11033cf24d30d6c149ab13ca5c29deafdc816e457257361c1af4b915da312d2e6c7fc712faa27be3e67c893f9005a0e2c28369991c1dab22d38961d1abd6d94c4d549cf491aa1f8d522be3ffa6d214825a5fde3c94c4e35c29b8d05b2627eb12c9d94f450a85eec6bc963a279a37c2344ca36eb604c4bd11c2bf2ecc0dc16c2c365bbbcad3541bd54f8d0bdbb3ca4a087b62fc19fcc1c13984eab807d2a6a1386643d90d412d027bcd0a638765498cdbb1f4cc1b91b69bd241eab3645f225ece85a56e5008d6094041f8cca6b9a0ae3b15585de6fe0695d79d348f8619431ece40e736957a7627224fe92bbe30df5124f476d97e36b5b08b3787e8e00f0c10013068eb156f82f3494a35d6edd5f7048d1e91954f1013ede22eca8b4ba41699ee08decedde87139180a567c6d169b672af0f12aa09ce20e9cac4e78b8067d31ba4f63606c00d1d787b868cf7643fbb170f8074667c9f7584d36af80b4e6557724013618c28d0dd40bfe9d4b25761b3c99558af528c2d290d04b09821bd7f992c044dd61dde9395bd0c9ddec6d0bf6e044ddf0b4b2d6753f5acf2e9c904caa4e9f310578527b85e6738803758da646919989f735b09c9a5744e63fed2c3982e59fd29d2baeb9771316bf8d29213a4956b66c78d5654436ffdd82d0d572530fd09507b988d13fd743f35333237681f8abbb301a8ea870159f802a57760659094d0e4902036c5a62c563f1fc86c4238e1ce89f5176ecaea194ca112fbdeefbef4fa7c203678cafd34486fe58b2af04f84a1cb620c6e123bfd96301e0a5e5e5abcc95d28b852d0cee2f51faa73e42f22fc335f50de4c3812ee14038633a195083f3944284c1086c34995832c3cceb7d385b4ce86af10685c16005495121105272d1d739c584a07ec7801c3667bb280987a8aa41f9537e9d1812a5dba5b385a0b71d2e9573c6f3e9ebf0bf7267528946a6aa6f43efce908d32525cdc3b825bb11c7239f1de412704d24c17455b9382fd6a873180f0d5d44dc449320973d5cd0d4e67e83946b6ef47e5fc3dabadd80751f1421404e56b1bce748b7bde63c6975ca81f3eaf52586a55242c9745dee3f7c796d4508e818eaa4fa50490c1a79624561b98d2e1139a328806414c905372356a22393ea0da51c83957029edd8c2dfcf46d9564264d74c1c0497034ec018b1dd4c14acebc34b6d2c1a616937c37b8b4a0ee5dcdf787a0de1173798ab929b72e0fa83a6c9b9a99d8024328d9c236a8f57550a4f83e8071eac76adb55939f85f5b5f514174b670a3e8dc2b54656f6201940a81fe4953d2680ae4ec58635ba74d15efab3e06dca6ac269711ef2d4dd49f731e24a92a3b935ebbb3fe8d001cd4062669ae4baa62c2947033afcfaca227d88a11769f87456d5cd1bb6606891e71d63aff9cd5a7d23263a78768ac2ac54ece1441fd37d096cd27e916e68891137fc3cca427febd1947cfb4d7ccfad75b2ec5e809c132111eadf25a73043d68333139bd2435de9941bbc61c5c509897cfc19a21645019eaaccb6d06371e3d0570c09c7556e41a727e44d9bd672fccd1f89cc7d58761c16df8fb75fb8a1dde2caaf088f02dad91b6489114398740e6798f3ea8c7b0cfd974e160a0106d703d9589ab09aae79108e3212f19cb950ea9c0798a1532bc2a065d5900a12054395c0545b0878ac0b1d461f553dccfc2a22bf254ced88dcb538e3889549960b77ba6237ab1458e158f4f46606372e797ec9d9ecc6534acaa1218e7540eef11030bb9c3e5a7816f3b33a590d970619bdd2dc04d5c6f4ec38b7cb4d525234b836eab57f65dd045e02367eede9049e219b8712b8d6fe178080c5f77b821f1a475259ae571a5578eb3b48863162d45486f71a28ecbcedb35b320e5b6401f9e7870aa5418449bf47502626e1f42abf481b48d5a6819c640bfdb64f873d583fc4e40187940a6c3373ea7b47195270a8657898f55568985018abcea9bce1c155d95b426f91a734b2a14ec2c7ca2011a4d30019fd9b3ef63a804e9c30c3de2651c4213e90285a4ba100b31ee402e8a7f23cf9d4dba003bbf982526bc63be5af102dca34e7d362d6fbf6f56046160d7af33b364f2a86074d1c0fdd54aae89b19480efde2a9caef9de7c0f9491e1cf43a48752cef405a0ff16b0fc67bbe433a3c1b9661406c3726092efdc076febd60c436476f24dab1b0b8f8893986d951ed72282990e8b1526f4dcf539b22c01c6a7eb5577cd540a16a81296ebeeb7ddda72e60fcf2840c5b42c5cba30eaea5402f267d1d04bc80da5ef0dd2bf3c7a2be986507617c9bdbc96c6273a0c9e586a0c48c98b4552113149c6f79557fc8ace0b1a512fec3aa09ef191f95c2163113ac5cdd940f0c2120509bc53c3ea493c54703effb902ef752c830c61e85636ca95429bf16937bf6786b3eae1b277bf08dcd69f521a0078d633beb33c9aa0cb33b238e1021ca67df122a403a3698452740bdcac81d22ccfe4ab5f835d1961708d1faf6d40f115f16c6094ea37a7ff15e0534f62c19a6f4ded0967be337cdbdd2a7c58ba16ba2e4c3686e9d075c6fa7d29b2a0335ab4940d2a95c4500295f4db84ae65e46c54b7300909cc5411c725a31fd962d239aa0e2007c285586b4c778e2ac7afec42cd8409a63d7cd9c677031f43f4aaf04258dcf1270c02a4764177aa66db2d8f860eeb1fd06d0b27587537410bcb641f90aaa7bfc6f12bd143f66e7c933a0f3ce6b5048913e1b2d79eaa6c19e7255d5eabd24d5f12426339541a22d600cdfd1781a1a3894740887840aa82e5a461fc324285b0223ac9b95c3eb88160353f168b3d4ae8a2e87b7715b5fd2671f66e6eaaf9365b3d9e3acd9a749faefba6009783771177aa4dc91f72fed7a5bf6b1b7738b84ac0a07b4a5a3f0a9134a39e1e7e3e2f9a92d5644295f31c5a356092bf07c709b4c34305ebf50e857a4f593dd1cce0439d3fd125c1ede1a48f583bbbe0eec7058345129ef78868a96f8a76ba7fbfd1c5eebf75f3e0eeeb9db87474b96f321b87fffc02433513fb467fb74e2fc8feb498d51530c753e9a173e95e0edc5ba9802641a45db281b2e2d87d409057b4fb1925e834e90fa5619ae3a9237d5b104e7ac67c2bdc31001eedb4ec7064b2f72e0379bf8780f67ec4b195db014a2d130e77b1778efe3dc703f1310a566a6d3b5c9b12b1d4e25815493ed1510a516a31ced3b64ca49a783ad63ea71a57290727fa31386d2fbfe41f12d36a618c6c28d8f10405eb3e0a33e8ac2e4133ba75c688c8c9a2bb33c8fa032eaf3ea0d2c27bf89269c4aec55f8232b292e7fa9fc24527184f19187d9d8a3f52335e2feb5dc6d997b9b773a79a31db832b752e5738963ee5d61a1b426414975693f986e165e52d46cb059fdd4f48f008e96d4c1a48306b7c002fd0c861721656074cf11173ca65cbdb694c79f58a3f3365e872b24670b691682c10261eb1ffb2b65da031d070e31542f49704b77970a78bcfb4c4ca517b4c966a4e8e27664704f633e90cb7d7917dc1d3a8b8b7fcf59ea3a8a81305761923cb182cebdd59255803a14ca8a75fd007670d79a25eacda1138d67a0fd1da981529dbf182fc4d7a700ba498e4476a1d415381c9e2ffa3bd46201cf2e454c4aaedbbe3893bb4121a6de02cbecc1f319155eb8c99d1030103bb6194bee51e74fa01f28dbe16092955b9599d5c1f1c3f356e26d48fcad7c4cdf0eef25c25273dd62171785c9d2c5a01b1f3da9b4786b1b399d890e2049b73c12de2fb7177f2bc3d9c645398111ebcfd83b73119897bb994f998f4a6fae1b3d6361e171059dba0bf9de9af7a5a1b21641790baf82a36278945d649cf5d310f3792fdefe8c58986a48118fd94647b786e47733ae703701e18992bc1b143b1da6110a98030bb9895c14d7b8eae1a155a550e219a5b6301b6d26d7956ecfe4c7023eec1ff62538b3606ebc7906a1243bf8357f593b6cfff32e3fc6b51f6a0ffaecb658d526f7a5e9faa6294e4808b779f4832318cc184e49e8957b72bea0d67366e040cf76a85889fc6b04e84afab0d02947d0d83e0de19f12966fa8372f6e82ff402bd7a69195eb1a7864a3375aa9e23736fa4d4b0224647e416474c01f72b7d4af240d7f43395b5b04c8fdef1165ce1d56ee8ba0e350e6ada893e0594facbfb5f0d8829ae203929525951584c21371b86deb0f76ef5daad5e847135a6488b35ea33e3a165fea502975d6421d4567a229bf3ce94605885453610eb9c82f9ea743bee9e14776bc3076a29af268cc72d9092a492d9ff08c345dc2eb2f8003b561d9912ae1198c58107f8b37a08b35075af9863110e6770425e9d59c2dfff9d9942c8bc3bf7904c2a952bcd573706caf1ee14420564ffc433c0f5871c4bda916f2530ac75819ade49fa1de21edacbbf6b7075dba21a84989411c566b7c356b81803c7215ab0f326a6b8910dbc62c1bee3af51f105fcdebc0dbc56a50b22cf81eda563bf8c2eff98b476e8", + }, + { + "99444e82c6c4c47070b164f298ffdf6955ee5bcb3070b9aa95ce658db4db084d2056cfe61a93568b44ba7ddcba5d450f4ba0da7b119425a6628b3416663c638692326cacc5c237097db5e537122b465dcb21d8dcb5fe831789b72deff3907685c2e23187a56990221e755930a09f8d6cc065487563cb8cec82b9dc754952fa0b342c92d99522fbb39854e338f470a4b4d5ed2a39b8b6253b7001b0b953abc588d757616c7a5d1f12b1024aa572ef5a47dc8480943aa6cfaaa78064fb2b29830280e46efa418d0cf38f57980146f2482276c9b6b16f865b1606bf1131e894336979a163ba2e70adbdc746be0d38062fafcfe5603e6bbb55717b66a263fbd5cc7476302ea4a0dc6167221f745a26a309f5886934f4258965a0ef0803eaddd05e54008df8a0695a078b797be59f1eef95a658c99a7d52001d4108212ce5f18a39f1173291808c980b0513f1a531e03ad7380372b65572d3967af4c25fe54d99d664cb67e557fff05c12e10143c13b1bfa3e8db093ff832a7978ecd85d3971349e3c9b83939b73f0ad55f1f1162d0c106b99c0ff98442911bc15e9194f5b4ded97e9702b84e31b31380c224f392e5fa5c720a45f64cd7020e25a3931b5871e4c708e77f4729225aa9f48f9d876597d3e79219dddee0efdd16836021dbd21692dafe121217347cc128fc5eb051e6843978ae17478ef714957a84c74656ddd931cbeb43e32fb0a448acf2f90ee98d38522b4fa9aa36be4fa13306e799d4c0cb90ac0f73cbc018146d1b0d6bf48aa446a5e3e0502aae9fcbd196b36b6b7426fc10367febf687f05392fdcf878863de2e47be7e625d0e3e3e94e199f055c0fc65f76c41ede43231873ff10eb854dcd6ac9b550ee8533d16f81eb0e86471d4da69311c47255e78ac8e79ab36ce880d6b135279fbb5a712adc5c3862a356af49e9c10d5b16f4e5dedb80914868111e194745b802a0292c7c8564de28ba8e71a44f7eff6573e5434e65d496cde5b5e62cfa9e2e9ac85a164dbff5767983e71dd2661d37d9027a27674ebe3433731a606db88e0880e91ecea8134421962b3f68915c9f6a5e1992c56750f99bc313fb30cb89384c72571a1a6a5e3c01897b691bd70985352217fa8a67f3252a06205bd1a9931d1cea3736559572561fedbf3ac4c8bff9ebd7f3753ee69a69ecbac4be6357db7f4213b697a828edc716ac01da75c1d46098c7d5d6ae6f3f9a2903588c5b340c9d47c234efea21b700cdb8db4279afa2117677e824e627bf0f2b179c864ba823926a57825478395545f130886bdf2a7c55a2647a888c3998b750343d9cdc602e46b7b09a2fe9ef74db1ffc46fe27c254c927ce51b307e96a571da7f3f907223fbed2daedbcc96197e95edde7859f3b4ec6099f791089e368a68a5ba0917ddf4f50b93c0c839ea36cfc8053811f8fcfe6986e5fa9f743119ecd6c3e5fea1dae3ad7eb465a89e9c68569190688a8d56e4143ceea3b11fbd9de67173d5134ec8b0bd7d16560ba2be52345ebacedc01a2e03e8183ef91317d87b2e15cc6301586ed829d438e4ff1d074408b332c8ce60ccb6790ab08c228807509dd4b39f2c227755f6b039f5cd413ad6f46c9ec2cc6a79457529d297b1d9e74ead9bedd9bd652fb31568a8e2a9e2b89e4e57601bc1d960360232cdb30cb502b950ef930d54c2c0692a684cd44b0472995bd2b41dac1553ae47216253d6640d2653a033a862f3118c5b5d60a662d240bda5f4da51092eff514f61a425c5b14b19517ec1b371d240cc30a0739273b34f18a72a69b1586802a7caa6cc8f5817a8a995695d063c9dd26c3d45feb0f84dc8a0773151cf9a537664f942f351599cfbee0558f441f5c7ad320cabe305f9aba570ddf6407749b6db42f9ce94526a8f4170e735b1dcfc5f0e090af10e039db3747aa9b4f1f26acc34639ac8b60557f7753e2c261a29852932901a4093b7f307319cbb228e26eec289898b3f8ee236032163293b8caf64be3f7ffed236f1da688d958a1bbb79dd45026884904bbb936c1ebca7aa6b0c68aa8b667dc1575729e4ecb4ffa82ddced2f4571bf902c52fc4a0ea3f47aaf5c243ac2a1fc19f825fde5d9fc8d06d97a351eebf4ae1846aa62554d57cffdb3f3377695338f8d598d723289ff3962796e8065632e7da9d8dffe2636cd23eac15a60568eefe3e77c561906555268cfc1e9342417b1cdf090cc16c79939b15a9311b0210094087dea22833f74eb0e35d44259ecf327dc84f3f24b8c2bfce7be0d97e00d2be88a150a0d557ff963b4cda60eb99935951d288768b4b2649b717133517f5e3909744417c9c3102c77ddd285976cba2c89e2b4f297665632d7c8652847c4625038a6670169772de0550066ec6c2018f503cce79a333ecc0a0632334df6959d2e3b052fa47c5c84d15ceabdc80bd6be0ea2a5a8d5e374e0e9a613369ca8d4cae3d9f98755560b27b2f6e47b01ba390f5ddeb732c22b12abd225e26ecdb639b08f3237e488430b3b39f0b63aaaef4907cd003a8f2b4c3bfd721d6c3fd3a5f062d72746606a529ba34251ddec4026f40d262e9d527ad84fecf5bb2cc8601c2a38437098aec2335104842ff1c455e5d17c136ece8d461d7a3bd9a60339c22d71059e09b3603c0565c0345684893b56054ec4d3db0bf15546cafb4a03bd7775c3157e7676bb7bdb7baf3100396c563eba1a12952503eb6ccde6b6d0a42d456743c4ddb97f5994fa08c5fa41315080eb6b928090956bfc6252b232f6e0785d233c3adcbb9370b59c35b0dd66005d516befd1fc843df8e68fab19858b91e2aecd1c8a88b0fa3d4c2fed2995ee87e65976b755fbf44ee183f9fa08848bea325807bce0b7b61e03e50b2c7af9b360532a17a8250cf6068fef0198738c82a5e58961c54017e343fcef7076e823d63b4deee472fada7989ca7a213d06a4e3eb2d44b16e5c94b1588321cf6c45a5a792938b058d667e1730f8386dfedc50ea0a959b78f12f2949b34b181f90bec622515227dfb8a5f6e89d2e559c0ba686153b218d2c50b67503018e22914ce9b49d3bdb7cf38172db1ea130baacd640c111614e3db204b3b50641d8978dc14b2afc27a7efa819cac6bafa8166d1c127e2237520d57ad38a80146217a12363cb1f8a720e328cd8f846d379ada43bd4865e4aa633c479bd448d205b2e43befa63486c717af84a733f1dececc127c047850aeeb8ce677612f5966e23d92c1d3c758aaeef82f862c1154fadd6766e1dfc780bb447732a5968c0c78b9af4a9d669338458b57cbb77910a24678092857c0b903152035bab6b1c73f7b667a08cd0d31128888de3ff1fed24866eb60beac19c1b139f77bf0b9332024999a2d56975e691fd7475fd93622119d0d725bb99c1d6ac604d6b6be09d6d29360fff9f84e5318259a67fec08a006d9772b9410ec6abd4cb828b898c625c2fc35c19cb9a6cd3b0073baec7b5af254d21de8e209539f560bc80ea38e33658a68262622cdf35dcd6618b9e272ac3644c91f27d372c6297d8e37201c6a86a7d3accdf579c15246276a0009ddac4021755f4848d10f714e9da86eba13f461e6a12edb1aef2d6117986120750d609682bfdfcb90ee3cde8be54d45f841a6dee2d5b9fdc4e65edb7ebffcf3cc5c8a4e1c6919ac57568be23bd8283319ce11fca3caf968b057432f163f22e29cac30b8154a646ca0ef4fdbc7770ee1451fdde9e9d651992d94c843d4eb2570975528ad9f8c193f7c681a43df28242547010e30d75fca04f39247c77d6c3715c25fc261ecdba16844bbab23e4d0482bd1565ca9b526ada9b8f5703661a84b23070d85f3e8265b2ce10750c5d798f1a8ef4d51a473ff4d2bf4be615566ac796db9fe61a224bcce05c31ecb9ab7bc43a609944a7c9398a7875609ddbcb556296f548a117847df7d0afe48a5b504e85b0d7ca589103d3197933a744fefca795e1e036f964a4f14554d5cfa0261e25d6e5e02f86e402906d3637a2352459cb1639f20faea6f0e3fbc6a39becb1b1b3a791e32e85e5bee31be685410adf0c11190e20b7a5119b90e83f2cc4f0de8898606bb6e64165c95d4c5eae472daa6836a888ee4d9a79de72b8fb47a9c9c0323a2be9106d4ee9ba8b3858c256032a9caba37af94df4c7b0adc2f8478cb879b6d452d73191b0fc1ce944df3f4809cbf3ad46eceb3ba4abd9679410f45c8aab20dd72626f235e7c0c934b4beb4507def24ebbdd7a507943c81d54bc69df578aacd9ed0bfd3b7809dec345ba084d88fa9c34d80685415a4d5eaef9b88e51432b2b2037186baf123a6257e47aa56d6531923d38178e8264dd315e95bfafd8dacaf901e354b0f58f135d638df2c0f32453205c7aaeeedf8c102e11cfddea9a98d3ac7c385d71b760cf2afeb1ebe1d64f0222b9b101893d11a74ed175297c1dfd188a2565fbecc6bb07b56ce3973322a965dc5a675587890cc65a71efc68fdcdf1a023505ef0bc0e6b12dca5860fcf1c6c94c2e2ec3a72b8a019d69c82d36a73738dc3d17d7fdfe992bc8e18cb5d3437f1f619dd318b95d1a56b6d273ed79ab2655d83e2dd63cb6f1f5987eab6bb21a7b13b84e2c619b36b842192c3f82c755d8af840675b0bd67a655d641b1886c3c9c147ac87615ff3e58085a879b21dd63c1616a3712279ec87d650a2eed665b797ad631f0ec312f343979cbc49b99385cfa92841cba12d52777df565545a1deb07800a15431c0987b4a543fd5ed6832e80ab6f4b4d9c9ec419932a6ded4759f5c7630a0b80139234b8d53117acb4452c60b477ad50157169a89bd796e2308baa9395b513a94747611c7978c82dbdf48d716c3ac181ac2b2a4702c02a324bd4c5e089d989d020ebec9963b5c721a95492158f54973b7fc1828181acb3cc8078ac095136d97221c60b847bd2a52427383ab68cd1f10b92738c13203fdfa0b78baa09c1837be2498667c459", + "0ce980442336d0f427db869a6799baa6785b5e030567c588e2a7d2680e96c11b7f415fa27730969e0b1c3973b5f3192d4e773153def6dcc09dae29ac44eac7c42c2666a356fd4262197bd5cf6eeefcbd662d104423ec05c19a2e6ddf1834a3445a09e8b1062a1320a5e8ef13d6ebd03c19e1813ccd86fd68b46a", + "1ac8a509db7bf4acb80d8d394a5abf47c273b2093f50f35049e749f3e16cb0fb", + "47cc9eea11f9f3f9aafa23bd", + "088888333340b3a057b05491fb2402301c8654948aa6d5ee1ec75eb045858c22056fef0873d6675f897126052923a47a30675b266ffb6181cbd29ce2da3720e36a227e4c6e53328d789913c0d9cd149a6e49293996b1be7d6c513b24d876445a950e723ade3efc36907c840b9b8cfdb1503811b4044d931a0009b381fd60a5bf1e73d16348cb57eea672709875fb9d56908dbc729d5d7d322a17a41d0f62c9af9a013ab1e19fb7b6c6e7fa0c0b18bec5e3d3e92546c77e3753193389e5fcdb6a6a1896cba461343e71ef7a156b136b27ae6f45be9368301cfade203e9b53824d70f07de9abfea1968b8ff8489b9804422ba05ac3c3adf23ba0848817fa51febab5e9b5500100310479e710b663f064c1ef101c9a5320367cd8bc6e52081a32f070e7d3fd6f4210cdffdb9fcab1de4af5b06a7c6d191dcc12b25b3053e58952bfd1f723afbf570796946c1df9579ad14ea9c8c30389c1de4d1e845c764fec5eb8faaf4c558c5eb5113018c6a21ef653ac7d7f5b6c7e1a8fd48c6f423e9913436202da176a86731287db7331db055508acc94168888040ee37b3c119c8a0d88360241d68745825fe480324a944d56e7cd0375d4d33a5fe7a3863c2aaa899b2d24f65b70bd804039116fe959c32442c9f0b5470463523eb4336985b71125fe5235cbca0c88a6f92416d038e144de5ff8ef6ca749a9e239f02db505bff8e16fad1cba8b1500445f067a674142b6413e9dc0f432242d8301879bfc11fa86d1ac9992ab12319fea8b703e10a13bfd4b017496222be26b56af3ef67610f904f0ca8a3e7cc249ca8122735a542b289f13922904ff23dd197f8883c7ac77150d7331316ef94e0cf13b6ad95070420513599100b0a6d117640b781c622ed7ef7ead29476b3c835bd9dbda2203930bcee7ac01c3b9c89da405ee436ee652ddcc3e96c7f1a94e200eec9a4a226f3cf7ae5725068916e73b61149497d11dd85157f895669f51978d1bea8fd2afabb18d082365daba2682ef623109988b7d0e27ae57bc14d86603f93b5ac040ae52d8db404ee27e6c34cd4246f40eccf9d3f8637a4615a4006918b01d34709bcbebd02ea72958d54db3e87d69e6d783de2f1841029d6975eb11f9b076c247108797d5368c656f888092b82aa81aa26e164e038b359bd68801c22fc107e4083a9d85fc254b002ece9d4545310b0cb22ec1af04a7ee31d210ede4b605dbdbcb70e4301989422ef46edf63f9c96de9cb3f70638b51df5c0abe79b7af8cd97148f2b7bf394bea0f7bbbf6925f83b901b87a6079f2c3b38a98fe1a86dc7f48bf97553701834f557451df4b41e7db984a34432823585380b45c1b84813d6aa21107cae252923fb4673cf660a541e65610ac0127d238285f53bf329b62169f3e42d5efe268dea62578e97da59a58a1314a1bd46cf7a7cae772814130b51411082e30062fdbda1c9e14d6b2bfff89d0379d32461f3b8e833b105f6a89532ae748b5fb43f283fc86450404e8befb8442b65e338aa0408303a70e9c27a1d923d9f2a06e7c6159c50bf2e3ba5b035420ecbd9d0b5fae478eb1ab72fa714f99d00188bb10e60380fa3a3a318c2d359ea3805c2fa0dde17ee52a504f70d6b466bd38d1dd4196be336a9ab4a9e573d1bc6404018a119f688c1dc2a8ed1433e8a8ebf455ce3808c245f0220f0c12d28c771757763bd111ab829294e2429a6f7a59858dfa1fe0b806e986d40aaff934589fefd75ab91097a979f26bc9352267efb2d82c4738e4e6c451b0d5adc398f546c646b9e6b8fc84e91651a1252d5b805a857c7798d102d1e6f90749252bc53588348ecec0897c79f514442fe3b27608c95d0cba999a7e0fbd7f601689b4dc63ecb9ff553ff12eca3e9b26e3eccbde28770bb6aff7c864ad6be77fc09f81f90df6efd0c4025d0916ab5197ab846dfe6121c462761d9cc87112ebbca197b0a222fd34a15b824b7eda06a56a6ffda760fae5f0b527e2798f01e205a3f47947a4bd190f6abfb1dab2e3a53131af95d593bb57e4f4af506440cf20636d9fccc449d9565bf43dec8b6877337ca5a43900c1dc600c877b290342914e909aad8c5f0755bc25652781535c057ed5ab2ff8ad4322a8edf3fc1b5311dae6361a7395919725f4cd87ce0ccba37c64eb3618f9c5a53644ada569b90cd07184fc048f1b589eb29852909e75e7116ef96a268ea85c2bd257cefdde9222d7eda875a2a3abcd3a02a1fb470ba967b20beb54914b8b0c6ed464ba978088d7f8b30d098966b0bde82a8f1210f5d0c3405c9bc73f703134d0b6ee13326f65fa0b8154f4e30808997d4afbd060285942ca1dededc3410a099881492b5730ab7bdc2a4cfd0068f67766d60b5d4945f121459d2083334ac878d067bef644b9ee427bbbd6c9351d7b019bfc051c05ac301ff3792a1c687546dbf6a07a0cf56717374bfa1191c22b7753f6ae02392f8aac9207d1ad0fcd57c5c8b35817574b7dd90a00cab75f508f8a234eabce6618305f94746cb6a8573389d336bb67e1b0d2b6e9bd3959ef344e1eb245b522c35222813b8c6e82df48987436b5592025e9786ca63b6d1a064223bfacf59ada713c2a3116611393aa8446ea79b3cb21e96d13b659ada2d6524686fd46ec66c1b4d8f5ae7831840c9e3db64d528f83a1cef1e0a586a783f8306cb261ed9c2905493e74d35883fcb39cfc5745c282104cc3ce804999231d13e1bc6f2c022f05999fb57575bbdaf00d7a990e17dd2f8b9dfe66a637b42f58ee49ba60f2dd9718d09d7025b6061b2087bc35f0a8c884f5b67a5e18c2b4e857d3b48b79dc7cab6b72f572d22987566238a7153ed6264578424f1ce091fd05b7f14563fe12c76104d3373367af3ed3aca694a21127b5912c0b7eb1ddf9d4a9f03f660d49f7a7f0fb42797fd112414c3eba2b75a04282dcb9645191fd3dbe376e7f60ab40bb7ca1e991053a1912854a68d7dcf854201d1f2c26c6cfaea32e29d80847e6288274713d2ca973b91dab97884326b280c6f06c65b8fd25d314be29139961051a1d8699467d02b67991baabc9b05629660c243ca3b0477362d5e6bf9eaa33beeb52cf399846c77fcae11a89cbfdb2058e443ddd44fe202a3ba5c2efce937d78b9639781b8b2b99077b433189cf3b0733ed73b59bb194c9a98c5aa0cba6e71d1c5522f193defb9e31fd2cd60f22bedaf7008c2fb0b55a8dd52731dfa2bc69b40f835ae95db040cda6a4a1588a5ba4769edfeb7369c1e9a3b1cda293255b4942881d94d771b7b82460004875e71be64c582f2830c5e80dd6de421a311c5852f4912bea1451b0328d01c7029867cf9af99284cdfc1e1f0aa0d8c19ba9bc035dc270b45724247137da5d3fc4daa09e7014fe1439889968eb23fe124f067825d5f7b304f17a983580e009e0e51630ea0006dbc74a30b512cd9eb4d0b315a0ffdbfb581609ea9661b0007cd234ce43c17c92269a7519bfe99c2ca94b5cd3e7654946e67b37d4270a369266db6804336a446022677a024d44cc02cb04108292dc12f790578a0d61cb6fada738902eed3afdf1850bafcb279f18b5798d7466752c6368a594533baff5dbd17974638ecc41753b184845206c79bbab84dfef148eb7f1390f8cb7346a14c88caf540c241cad11ce8869be3bec85d029ef490fc5edacf94fa962be39a33c8efefcbb6b43960d5bc35f8fb72038af3801466aed141b50e9ac7dcf1921f7a6abaf320ff02ac34bbfac265e05e27495e6e027e673a48a874e6f0c33827a050fa21c2efa789c1e3df2ecda95fc52ca7be35dbf17ff6c73f37cb236e5131542e002913d177ffb21ac450e2542e24b894650007c36c52d90f83731009a7c3239ccf11829cf0fb6510d9924e927f14d6a06f8dc772fc9b028a8bbd2d3388985f3e2609abbd08434c46642b97240c9380a831bbafdc5db77be63a1400cc9a4f7362a689b07a77162022c6ba7a1bb9f0446a0b6b460ebdd9111132694fa5f1b29da39be66c5179849ae9720b2da0a012d4bdfd1b18b8fbef0d5c32b92c351dcf2c599f069c3b53f622fc8e904f27584b2d97d43f779abcde6dc1413c0a677dd187b28cfbcf7fa6316f0967b53977432d45944ce8ebd2e265c0bf6b2870c75ae808fed52aa35421ef55667ecd6f9d279c9b91c9314bd9411bce267d6ad52b1d910b3e65147c3eb6021a0af98707408e66bb11ca5abf5e34b2bc85b144fd06ea56f5d7f8939fe0cfa4862e7f306de069cf85f4aa7aa97c6848594f5a6dbcc718d2af77497f4b9d5ffa217fc301127071e9bc9c2c9222ba90e286506e384f321e622f05d81c114953d0f7e9626b74f4a6bea8cfb86ceb4575e5cf4fb84e9efac8291d1f4153ad3cd9a34ce0ffcfbe30b6829c0f986a4f85d63b602ab99ff3934b1e0c46e55d56eb479b79ca0729beb59aed783e9a3ccd55db8d884733dbd93f9fd7a7209fb92fcc49826b2d4356ca676f01b0981637897b3d2f90f37bfd73b214a398a8e4e2f9e5abec01d8192ca690191255dd8304a2d95a69331288bce00385f462e942f4d694dc3560a263c8ac2b5cd1d2c63b90ec67c32eaf5bd947bd8ac730da9c09ebc6888b0b4f3bead157aa9d31c2802df8ff0e4d69b7abfed6f184bf35a16ffb5677ddfc4682322128932d57fe4c32f21e190e1147d8e673ae407b1dbbca31331310b299e9f3db08ebfd2dad3158562c2e47addcbcc831cef0194ac8ba9778d0103c2955c886d439967bf788eae688f2a7459b0ef3bd16808e8d768b8962a24588d918ceb2cd1cd611b504019f65216beca212f44600cb7fac77216b7645c49f18064a3acdc01399315084dc9ea151ee28534fb31628d190bc540ac6b6aba572ba51aee89544015e6fbca2b3c2330f2ac1f68849e99e1a1f7f523599eaee22720392ea52259e26f1101614d4edae481b3783af4e99082d75dcca549049290731bbadd1ec0a93789ad5c9afe8bae44e35b3e59e562362964", + }, + { + "0410d1f8bc890649c250a3819766f4496f339a6384e34acdd72b3a87266edd2a7eae223a372883f978277a108d6e59fca1f35f25d7a9f3aed42d35fa9b12241ac04754f76fd8f0e8ff6af88cd851887a45e89f1c9192ca66bfff605b128575d2ccc9ca3ba1ba23a0251b2cfd6db577b29d17ce2ea998946997f5c4a97a397c46024681a400a54425c071232d269adfc3b1adf15b4586c4dd7b8886f5c1023bc348bc674961ac6e221d914f432c2f06dddcf738227dfcfff88485ed45882809d0e57019461c88683919b87c45e78223c37a5be5f758e4f0dc6add22f2062bc2eb9bdc31b8649af17d526ec339f0e6fc6a41e26299c65276302f982235c3e5205ec1521625ec08a23e766577664b73d18d5533261c859c4cb4346feaf7540a56155c6c3a4874dc86ea42fd518d71221ac65541e2dadd2f8e129e7809f2835f07dfcc4128401dae2b5fac7ced1d9e07e3f348c6cd26f55b3893d4418557a18c366dcd5eadea0dd84ab95437d6f23eb9e5877fb2ad740ee507e2268c39c7186f34e5cee2d0dbba1a940f516a018f23e716a399c317a7a81f89cfabc296c432cba900ad79db67936f76e4d97874fc5f8a9ff84eb7a0f6d629c581ec5c451e27ef1ed468f93bfc68b2e0412a543d89dfdd812d9421236a4be9eb374531556c207340886c7b84d42d651557b952e0982f62c5c383e92dced21905174a5a836acdc3f2393e770d6cdc22c39575a42ea406f36889dc9558aeae5dc5f8b84862850b55bf4accccb6a8ef793d641d6b08235f70ad3b0605eab462afad1af80fa003645f4d302b03d81a7d167e9a8187bee0f76b1cfd7006b2d2b55fedad6e8db1d3ecfe031702dc327ff2b0197337d7542f42702cb276de852b3d72d9acff8a7feb8882028a5e340950e523c41cfa184b3d8878effe56742994e60240e58cbfd01541d39fa007a9f0ecccb409c6cc540354ccf35223677cb74e7ef7330bb60420f7d7bf97de6888cb343cd4fb0928fe5df5f1b018592ccfa7aac6dab57cded573b5950b94fd935f32cf332dd85b2b36501de6687612371dbcfdf77279d647ed8bdcf81fda8b7e0c5ab139330d64695d814fc6f761fd141dfb0c8f74e2d7616db3598d8de40b993fbdd272ca37db27b82aedb08bebc4a8e6d0385ab20fbc20c215ad50fab8e93975bcab3ff38667abb0545b3b3f20e325f01b80a32a3cc3ed51703d4b2826849ee22fddd5b544816599dca0d8fc84feed9f7e90caba53b70bc3f457eb1adb89fd0b67d2c0ab53264430c61d2c4a1b19ea99a9b453fc6b5ebf5fb5ab799134769c9b495c479c828bcc49a8f993c3127d5cbc31afb89c0e78fbc323755457ebf0f3344d3ad1cfc59d186e96ac31a9298e655b3d1df74b95f30fb868631053540388a13d597002f689708d35a2365e309bb96db8b1b94ea4c8060c2b165f7f19e72056409159371ac9c44f6bfaad9b9567094d18c29bbc8aa2c8b5b82735d20f55284fe68186004b4a4fb644fd52d9645b277c1dc238a764005c1d2791ef36e71786cd990ccee4571d9a9b1aec757e479cfa645e320bc33268e05af9cf90e0e616ae7f237c637a99fe15b4ea8a3232262d96855fa248920a28ec03f77ce4dd93925db60ec030a7be455ba9d08edbf6bb717b1a13c3ac1deb9821e21505c0a8971d5ea5dd8e4c9cd3a845a336209af191150ba5d9b8c2c450e3a765e8670d7f846b2461f971fdcd1942704f620a40f4204b99f9035bbd543f64b927cbc7a74f32cbb12c3caef955f169a45374e4479430e08d333c4a877baf41a27a0849ca3a157b6651295fa71ac94b6e3d30b5d160965e93d2a81b4d575cefd264399c9e4e17059f4064465b2d92c96ac27e3b221499b5e642d033992c236b905c072faa1e34495f9890bac6228330e4016c061605bbfc478c30e1b8534c49af54785972aca2d144328b0a540e3b3810a73e26acfa22f48652d53ea521875475ffade8ab50b9f08245fad753350f63dc4e898948ac7dcefe520ca47394f8e993a6d13ff68a2f78cf294f235f5f863bad10c4f5bc41c3ba93cf5e076357f0f7fdc136f34b656b1b8ebb3eed1ac429c7d4edbc902f7f4bc24ea9c9b200b9a9fd7adff0c6445ce1d2171fc031e3e9f8b8d6b448053393c8813d91333d4bdc3bc5bb2b8bff876cd29e8b92cf6f7bc727517b6f57ae031f3040b0637dfb40b8c1fbe44cfb6bb9cd0a445fd9b3daa1da2b1c4a82cb4da1fb8d525e0a4d9ec30e9aa75b951214621c58c1f60c9b97e6c6b330497e7dea790a3cd8158a76d898107ff3a5910707ae60c8a46c633b522aee83736d005de60b9abe202435f8bc4577b0eb08b7f2b617bb5a831e95d6488459bbf15919d764b39684d7cb7c9310f343fbfcfbeeb212a90d96c7a26c1026c5cb171ee4ef839785076e5084026077455c73404a2653f333e9bad555cafc1a9613387a02bb1287c380d7478238bec8943208de585bd18b448b6099565cb3ec70ec6672a778fa6af9d1b17b0970439da24c7bfaa74c85ecd8e5852e42391ab2258024ccf91e37f2f0e86df958b197fafd12f4a45f7990375f1665a14f7f5374ff7740f89677ea8660587fb80916b30629a7aa88213bbf80512421a0a37414a2eb549b81cc85072cdd87e4e69d97ecc63f974e60d20de0233101c3d475d777602b12e2f797e9237570085b0e9f48d4dedf233eb1301ed4621f9736946eadf599bfd79157c0b4cc31bc273f5c6f133a4e3679ff6797d3c9b76aff4bd8ad40726c1703c3d8b78f0974b748d0265b0a75928374f91b48c2d2b2c11d8b6e5efddb75009e4db72e562be59efb0bfa06808c89f585a43d4776ef08947a77f277526777f0b52f1e0b5a03aa560fa45c8f30e584b58ac1fc00b104942b7b86a3cdee1abea349dcaea4e058faeffc567e2c3b03e1c5c4ddc675e25aa15de1442bcf5ee972a8c5204ca5794694759c13a2d716839dda61635043bdf1a09e35cb6d93b4df3b7a00871f79cdb4ee69c79041dd14deb7754107b8fef8589d2d240ac1d8eafc52ea847263512651bbede2fccaf6da816b1b892319817bb6af9fc17078ab6cca95f03cf8426249fd4f2bf91921d39b8cee24af07a52bbe54ca7fc4422a310dbf2149b763ac0060fb2c59154d2cb0da1ad4892279b4e0ce7f5f92c189c3ce48e518ff48c4ffa9bf2b02d4792f84534958dc6bd2914ba010aa32d133f6a07bdbb87a237c7acc3ba5cf101efe947147ed4eb3bfdffe5fefa991c0dc8760586218d286944c52d0f221e0101f74826761d01a20af187f9ec1115e9e98bff6fbd7c8816c15d33c07f51c171490997bf269951218ae92b66fa3150d3bd40336abccb717e18b53e8806fff94009910f202a5041b5396d1c339e6d075bad4ab66a0637d81eed1696e4068024001123204b8371f0bcdf0ce07d79f7c917327f7138a75947846fde68665e9c767fbf96bb3308abffe7a8d05512c81e39fa8dab2334f46ab9543921ca97be31076dc7b2a0d05e90b7f7610d1a391b442398ef56cde3b18737faa8f282572389b4fb3c55cb8ae6737257708c808bc0a414bffae293bc69cba702ce2959e1a30edcdf64985a4b0bcc927c5912f819c71cc9b1ff5d6e5929055be72ea5c8c1a4a591093deb5449b7e6b60109be1ac0cae472ba31e1035ae65f3214f50ad699a077a2de52f7180addde0bd78c2698470b1af13cfbf497d243c9e738c4cdc265356543885c5b933a299f01a5b5a9ecb0b4ddfda0c28573064f6a3f142801795d66bcd5c31868fd3207fee7bd98c47e4da26bee64e1617b20cbaa34e3abbe31126b06d5737fc2b577b19d255a519397f3ff8668d0e7d401a37e368729e4b83c5fbf01c32ec478967605cbc0675f685b5eeeb42fc688216a0667e1204c995c9c485e6f7712d80d88edc9594528b1907790549756dcc8b0d32091f36d2b4009639e68daa130e83a1ea18353ca34f431c548d91c1591ccf8b25eec1f7a3c18ddca71b87bb290a5c13229250c5e193e1352072f6798ec504b3b4c6aa578737332f52baea7bc4468fe6d8dfabb9728cee93fee50c8caa113f5ed7e9b55e21e98d73a377ef68be7e4e965dfa50cf863e6285236f11ce80512c573ae2b55bcb43cf6ebabed6783c250f991f5f68a59dcb2ac13a3c8fba8dbb11c79dc6236809f2d7c4b0ad3cecd24b85f1aaed9748b8c109f2fd98ac8a53bd52f18475598d67305117de8e03b0d988a2847539cc2efad520f86dcd82c08ad4b10e490b9cb03bedc7197bcaca55526cd9c8a5a5f69f7a1697e7e31aa76eee597c386418e89f06b0b9817a83d6cdefaf9594548b33cea1cbb585e55df3d3b66f0b1a88f4b98ea4720f1ef5e6ebe4958078ea0bacb8ad776e325ccb252f81943b9b1c2f54aad3c7baf1bca0dda1355d191f69c5d8163c464898116dc89201032d1e3281c8054882f60522d3a65831bf779a854fb0c195f85aa66522386625658457e74d5c2fcf5234f226da4a579ac1f11f11a1e0a6993a4dfe5c856481ebe9d8d2363401058736f7ad104104aa03f5c91496aaba2fe4072d418d91c2787a9b4ab0cf4bb65681ad0392ef073cf2fc060692b0c0c194c8eed5558098cdfa3317ab02626159e40e5c76fd64b2ef60b8f5f368b6b4fd7ea3d2d3236aa01d9db7c8a01929f9fd38557335b926251ade1a0d47d0c1444e6416218781c1a51e786dbe9297b78fcf0d0304c62929e00744ed4e14af926313a9849b2a464048bead075044bee013cbe318920c4172138560629a0ff4fd229d81bdc7c7fd1086ab17d6efd5b603a1991b33a55ca5b9e2051b7c140f7937adfaf474c2f284489d9b1e8c71d58f126eaa451407eacde9f0e86504f7de3ba4d830199a229de2bf39014baad6dbbc448501588ceb2575db0ddae005b81ba9914bc22b6d600e2c990f7843e553ff29d8008265eba7dac7b5b5a7ba6dc263fe0e262a7b8638a81f4720622c7361554b61d7b04c7f8b133440baeead7d51ac8b77d606fd0eae1c55ce7e8141dfd68d40ae3d8d2dc8a061085b4fb6d8a06263183869154618329be6b01c2890f2b5d0a0f25dcdbbfe2ec3597d79311edb943613fd4b59157df4fc2e1024be03d98ea3cbec7186ea9f4a431dc3743b9f0871b205bc0c1b3a001768", + "113b261414b4b7dfa028668ac8b0cde5734120124991c54f4dd16a87d181efe2bc15f6d0caaeaf6ad615f59ec5c2833904a34b4d34109c82e10609b387f995430e8c13d83ac34310d838af9efa32d7fed6224c0a33", + "cd762390b93369f1e207eb15deeaeb0036f5331e82480d180f84a76c3e44550b", + "e88c14ef96c7768f5dba9de9", + "8d6aaa27892a76fb05a2e96cef9a9b4b7ae0670a12cff95f7b076372456889fbd3b9b4fb5fd98b3bd85b247f15009be2f4e7a0329dd118b6872199b314e159618ede0381dd97db28743461ace1a694c0383d8458150a501d6c45f4b50d5b1bd47e61a51f9ed4929bf2e564f201ed0e6825170027d93e482c1ce268459d2f81cab41f0e7ff281430c16b34a29b5c76630dba72ab9e751bae41122b26121d91f2af271a23e818263f46e05fdd52f319d58330bcabf66637a368c0a8aeeb20cad1916d966e5e0b0de74cc67ebe57e3d1fe01e9743d42a931cb4b98bb762ea43ab937d1e5c42eb08fd56e70e911bdcc1ca4ca0604a329c5364b262ce2de282b4732ea657b89300cc7b7127ba4a2d08c13f581f024fd093ac09c2bc245be60c80e102405597fa8082f4d28cc954a93217edffaba3d2a397bb59ee89c8cc0f33eded78f21183bd1acdce64a923dd609a0620d2911f61e81fb2c8ccad8ad9d81157223253a121ea2bc60d6a3670c563fe06bd75688572b3be83cd31dfeac6b17cf8455267b481219c42034b2252977f32b8e6588fb05166498fa37d17c2b002a655b5711bbc21175348225fdcca041b1f97fae48fb1e222c5bb46b5202191c00666b7e1b2d84aca3edbee7a97dc0f6d1330e929226f8a76c155e973c1ab62c867e1f87be37788754e51825ba31af9f4722b5782ef782fbb70c391a664f252d14e49a805e94790135ff6bd881a687f98b42da96fd34bf240eae4914488af739ec15f13f048a7eb5fa94af14e8b6ac5fae714cbef6268b114813ca2a3920a7a9d5eb506a2ca211758de292047eefdb5a97e18530dcd8410495fc42abed91b1204d9b8ba9d6aed11d2d0fa0d931d46f93f2c1a560ef9f5f7cee1497be770d3cb07c534215cec12c1458bb57aab4d95cf4a15a5e3a3bf8e650206d5cac4af3193d169f1a57638d9a50f6b7c6985d42f7138b9226451670d7359351c2affbca65680557693d03458341198b8e13d0ea6abb7496edea3cd4dee2eb93695e668c7c0901c6809b8ef434e88b85a8b22cab6508b9560fae62900056b7c5c29a8c899bed45a2b5159a1d4929476ef350101317f77f02d48a039cf4cf01c56319cbba16fe908c49ed6f3face88867c0ad3703452baa7b86fe58a00ab8f740b4e8055164b0385dd3fa44502ffbb99cdd843bc3287ea468aafe4cc298a3fc180f284dbf78aa09e0a2f7d8593356eab016ad8dc505420edd376b66598a3d0aaa848fd68c4e07419b8b50e40febe2b6b17ad07726fae1f87e86abd01490a0ce24fb57b533c765504ee0a9ca154187bcf5e6828e3addc7597532643cfd992558d63b1acd00e7aa41b9765094217480c08c43f4f0b3f0127120699b7f2a5ac07c655b6143e467777cdad4bc21d4b57da4d8f9b9a7e4523d8c6fba3614b7f7281e80ff0f9004577adcff1b79fe443c80ca9655ecc102d5df6aab2ff6c3401f344b77666c59ac7d5b92bf4f1e2322f74b75e6ef2bf43ad9e018f164ae76a91451e5221bdf5b65a4fbbaa8dc31e6063b451edbbf4965307f8e65bfae87b15f2453083bea8484017228a9cdc6edab1a28834eed8ce07430f776b916b3bdd2340798955ce9ffcf114c3f6a88bcc4c7b6f2e3842426488c340d00f2c4d2d6fd3b6263dcf7a57f5cea6c77efba7013297bd3320accf033acc0833aaa8e8f95cecba469704214f54a1ed581349878a591f9993371f1daf92e55b2a4faf8f952cf785c687a59b3c258daef1b6d7bf9f904123c7384a859933c3ac31e33edf648a1be4d6264ffade860915bd118f0b9aaec2eb8e16b2015fc25e68caac77a3accea53b9b178f6cf48d15029fac12963b4277df037b7a494cb29b1d9e6d2148531a1f7360519cba5657c080254f130a1cc3ccaadb4298d7ea0223897e63d798b4f4909577cf9b491a82de0275a246bb1211bc4144574c8ef176b382262c0e087975cbef33cc616d32e0131a9efdbe8ad3d9cb5f935d3f4f409852acca22ae2a6e7450e9a426ec3b9183f93b4b7f89d850e1c7053c661936e0cde23e831a261b319b430da45772f0fc0113679d06f025983bbf37ecfba35eeca28de5ff4815a490570491266e92faaf8d0ad4ac8df106faff8fe3c8d050ae9dfc03a01ad177c21d7b653509a80369a668a97eaa532dc9867c32aebaf89ed36586e1ebbe1045347766a354a86ec1e8b2f30c8fdfbb6c5d549e7a84db81b73fb828499c5c4be0d4b2b7ffb197133a0ee18abb5a4e371be0ec0a6535507029316f8decde30833ca47493ffcab781d028edfb91c138609baf1054ad52a5d8ccb98b3ca5b138f253d99bd556afd80f71b39f36e0d96fba4e0cbdb18926894968aa825392f12d98b6497ff85a0e4a91c97f37ba1dcad30fe688b54008b925805104a61dc22b712685202ecdb073fad9b10b5b9ee2ff781f23fd41ecdec87f85b369a304b85bd2af126d08f79d8a9e2bff0b18607a95c4efe35941c5493c94e3f2f3902e79f4cfe84c138b83c7f32d7c5a125b28c6107921e8ac92f1af7da015b46a2f9169369cede770292eee8a5f40d080ea1c267c33cb7d4187093d486dc3911bb2d6cae036cb508e81ca783ab5e95cec751e39f3038003081a252eefa7cd913baf136d4e27076251da9cbf0c7d2586fe02b62ec786790ef08fb3ff3d79bd06868eb1abd9875920e14fccf6dc144e898f578b7295fb5f4e84cbf683722ce3597aafe3195e194736fc317ed03ebbb00d956ce89f7a41a334020e1a88da355d3b47d5bd3965a290f6fbf5dfdc8c8e6347b4eb85151e53a960311582235f3b546ca80a670dcb628fef572dfae0c101bc08c80f78d5630a793bdfe402592c316227f2333b386839a67e6ee8d9396fabc9648ea656a407670efaf80966034958f4a70fe7b920c79dea3d5a0ff05f3ed0516537d51a686efcb258520936fdd415345251c9ac1143a41be295cf12da5d4319e78e1c57ce20507490e5213ca7be92afca8ec8b6a07b33571afe6940daa2afb0dd4dcc1c329474ff8e13d740488e5ced552074fff695a04fc1b70755245895a1e9c387fd9514261dbb0f600ae03f4896e795d1e72f421d8572543243d662f6811eb9402b6a3b8dbb0f32de95bb1ac01b1287663d3b6a3f52339a4f6b27789e15519b2b59f2f4fc8fd33ad1a6e4d02cf0ddf8499f45746da424ee78e72847e3cd3833551b6e6fd6b1aa98c688252b57a1d97660ff006ea1b970a0b8fc7d2e313ffd0b0b85299ded47b60cd2fe9bdd7ebace4b0c1072cdf67231a475045990b35ec761e1dc1dfbd0c402296566eb4b9462979d33c9d652a9295ae70943f38adb212b48bd8ebe82722b1712ab6a3be6060297e2aa54e7d0158e4aba6975237e7c7a1e22b29560b8d262125ff2a6e5c1332acd0f6b5ba15b4a82d3631891a01530321830aa8f2e8ab6b41bc5b5356957a4d0c3bc3eab04df7700305a95d0f9cd18d486c675c963876b25b1a0f78e245deb40dedd14dafdaa9d614fb06eb2538c5411e13be116c76fbd3377ff212eb07c5c035612e4cd7a1de2ceafe95832eff88a9bdb3595cc19287fa40b8d244afe9bd24dca40db49893602a59640d7a1b8e7475825b09cb0cee111864deba9d3d1beac03664279910accb9fac534ef099e398d7f6e3235cef7685fd1ae46e47da093135741894273c0c3486197c26057044b10faa57244721328b47e611633d16d3e4776d90309d68ce4a60d3ecda26c9f39c1c6da67ff79fde4977efc5653d79ad86c3b53090003bb72e78aeedcf4c8107185d9aa65221df4e2104640a1a083845c01000370371fea2a6bc8ae43fbe290949da4e559d3867c16df16b143fdc807616f51ebce8d05bb03c2b0bd587b95e3f6a15d907aa9a5b11622ddf4c81ff9fda4bb49d3e9577551bae649cf64ac0cfd646b02f6f16cdefde09a55e77afd16c74e8a3d777d80b7cc42c51f618a3c467968631119f11ca4385f0f5713e37ab1133b692de475db1d44fbfe9d274b9a09e673dac88aea74ba88cde8db3c831e9b5a0f1e40261281e5aea9d4dfd48c5d9e173f4d9cd56fe7fd610909c838bcbe1d6c729e151ecb4caef511a36a14b03cca7ec5d0feacb4647ea5212a11d18cbcbedf78443127680ac0b1bb65120b4197570288226830e2a92b380e32387bbcd3be2c77d6c7722054d849be9de459cc1832ec3ac8e7f60fba9c81cf5fbad37d228eba137a23227d56cd24970340f2b7599aada9d2424cdba8b50c2b97244dc83f7391e2ceba5bc0a11ba547c142126c791265b33a3db6238321a5f3273ffb01e42adee17b898153e41818b91413ec4f6386ab3dd48db875afe659db9eac94d16f850ac179d087d93784d607349e8711f5f96fd514e8d096de8b4a74122ba914520e93a11fa4adf006700e122e2531e1f39340cccbab4862708d69c117d3efbebabc14a0231916ae1ee8285727c9fc980051360346d53dfc76aa5a11fb1fc8f36f95f741e913bd2cd1031e508b320abd2d3a62baa400dc439969eb44e6abf8223b29d4025c3d1ca08d2dbdbbf9927c625270543e8c0cb5ac5bb5d504d224e66a1895719e4f975d819a95e54cecfa59ec8e385aaacbb023772fdddbe093afaf5a75e63a62d51926254e5b47da1e9b05851196644b9180734d05810dcf3502747c4ece652b67674c02aae74f20d07de2ad5993b3a68d10207eab6be5be34e52ada655aa96c1d82df9b24c2acec35e8f0bec9131c20d0ad8936880af87215611b80d07d7a741a12d8145bd05066c6ac171afd8684b92f72237bb0e4ca4aec1ec280e39f36928852d5d8d02fe463acbad8ecefc103083fd4298f399bb254e7bfa166638460b760ccf2b0f5fec0e3875206bdc8ce096274643824acfad71ba06441c74788356caebdd2208f6f077b056fa9d85aa4357e93bf064a776f5f3b0f288d0afdc51558c8f25cbee17247364c2bb24637dd69017f92bbb43024d9c773439626a02bd0cd44136a642c9c5ae593f32eada790c31a6704030f2e07f1173cbc0dabc410bf9864214c298a6283b3631acbf94b8371681ba81eed1aa81ccf258252d7f90fe733ac770b9744d0170cb554b39e6c72e05919cc237f8f4d7f3545f4d2732f4c9473c77401dcba04c0fd33efc73219f31c08dfab26abee9a7cd4ad3584730768fae899fc", + }, + { + "9c73ac05648e0c50a3ea3a8eea70841e8e06669c1e7520c5e25e093769c4b005375c0a9cea16ec8e00261ceb96a00924a66fc0c4e4e089c63e93fea857aead8e0ab82af4ce1682cf3c9fbad23fc3f7e632b7aa169834ddd6c7db7e1e892cac93e4d787b2ed0a812aa93bfce8fef3ce30ab794743ad241974ff989288c43e1ba815a25a03acdc2d5517293e161d0c46c8858d0b32b124a6b0bc3838807753288cf6838fa25fbcf876e6368c0342d3cbc860d6fa12faa1c2b7d9fb37504e60dd44e36ce74229dfb80f1545125718dd1f78b31a8aadbb4d6494489ce596fcc2dbdf2ec22157a1d966b61e780d36552daf084739b602861a96ceb67b65b23d40916c02b2c3a38c2a59aaa266e1f8939000dac9b6dc50d1731e87ee833a2cc3cb98c57e5b680a85c1b428289520bb252096efd7723fa8e55d2fd4e16900a435986ab3f3d2bd799471a1bc07c1772ce10d1bb8805a6065b8903999f9393d2ed1a7e1c57a9e3e0e10dfca17a04143814f5f3acfb99a34712a6e0a24a7485279ef343e69d27c77e25b41f9fb833d7cd29cb6a15551d5c77b43d19feb19f2640926a272f81eeadb792bd474ae11f080ada72103f8f7ca733a9b1325b50589be2b2b3023491afec246d336f4e4277592ce9695c68d5f39c8fa4cedaf51776d7ca29ea0ecb89eaefe71e5f3560c68e8dafe7da08cdcd954d626418677b8f3f45b9194474a32f548a4da3bfae6a3e2c0a25f602e3b3a821160c397d77c8bcbd71c5f1e669213af36eeea30d48e12953071f55eac2fe0bd8fa355671fe032f6fc9214632428125a16fc8aea8a9c7fba0d7518b9a4f876349ccb9bbbabcdb2a85fc60b83ee1ddd041967efa4036e5e10e377c9886f40bc0b0b57c7b724795f843f6a072e87e532a04c21445090a360731a2afb896ab795750e5c2c33d58bb714f5be427ca3751df09661402604a09a1eca95a8344d3daa5b99d68e6e6245825704c5d4a73af197d052d7f75778917542261d77735a21cff3f75d6159a3e4b1a7a9854ee376e6b3c8bdaa1f353b957862b2efd50d10a40007026261a546124cef979ad20d8085d53e30f5736b8aebcd3cdaa349ea474af249ac53eef2653ae1fcd5b3095538de9368d307d45df2a19acd44e3b78c2da9d5d9fcc4cb61feac5dd35f66299845bc0018c3d476b6761083baf33a4621e41cfae0e0c642de729fb2d206db6a4b976a635b3fd911b5e9946fddceb6feb2d2f893b2bed590317442037a1d6dc5b5d72910160221cbecb53bc983f1c736c3bfc9757e9e05af1248b28d651f521af67b2a0d7e4bd86a0013338404fabac7b9833c372142e6338a98c0efb7130aae8e34bb0c80937680a7a904aba3be735d41af9462f17b967b13566bcb697579f8a9340429c77baa6e24ae1ac86d8d25ae3cb9112e34a7a948fd141367898c5f33c0635c87de06f603b510cb229df0d0d9a9e107de88b12686c539ed4fc54c8285afde0c8ee502919a125cbcaf4c8c89f56e90d3f641f97c07326956f7b5d87c65b689f39b8b84359ee0f14d2c7ed621ec67f5e2a8ee5faf21c805187edd95e3941ed62fa95a65473a569566d46b87c0d27ca37b6b022a8cca30a4480d392ba15701d1015b3648958cddfb614983211bffc4966ac6c1f691f19bd9fed405a02c06712d62a775f73353f3949c76b6b7757a4ee0410fd6d20071abfe46b09e72b70f9f19b61410ea67037e037934bbefaf09cff018a5c218176d165d1eb5cfd5c46eee7b82fe65ea02e3ed7b18a86ac7b139b7c9df79e1f6e6f85304ad22d97190c7ec12c651fcc835ea434d92ae1444e7cb0dc644efbc2ae70f2f94310805c1d0f2d49643d05e78baa1c54d4fd99137a49efde88dba1374c94208fb4a0ebc1a0090b043610ebc1bb08168ff5bf936ff9834e825eefb9ab73da2b287b06fa2b0ff52f46061b07c1131e4108cde478c767b749b696f3520acd8d3338842d53941282da289dd1e9a0e02aa9be0f127566c9bf2d50a27f6b6ffc9e9880bbfc14ce7eeee70cb0c0ad90fb474efa69b46123638e8405fdef65fa7e0e7b29fa8fe8696edf661f9003a08b4aff85a4a3e6d817655c1d533b834da981b8c37c38abd5977b3ba71b3f57967a471c2eeaf2f6f258431fbb7e92f91814b1db80ea775681f282290db170942bb7b04aa2a331950b74a4b6e337affb4c51c6cd4c4e13ce3095e73e4767c2731f72bdb225ff572163fbd8573378427fda194d165750d487f6bbb63e1378a132fb6ee5115e3c32b2380b096b735bdb4d651853bc7928346fe3ea9df7534f2a4eae1f5ffc4b82ae738db7df0103ba4e68c2a2153bca499bae2439a57778cfc616df16032aa8a19e26597d275d2775b5ea17cb25d204b18028eb25a053e5666ac47c6def151f7d4b68ea62c601d87bfbe04711c24bc34274be6815024d7b7d01e7dae10cea6e485348ab195a83854663cc5826181b688cc9c091dc1e0d491fe51400e20e6f2a51a7d56af258e038bcbc80e2c4ac4b41661bd33229d07b39b59f3aa79d99c1ef41974a33e02a7cacd6fd8f9b99cadd0fd6a031f070bd3a364c64ddda0e9fb94036f374171de0b3f4ee3380780e6d77d50db9d58e670fb4a364827d631226a3491a27602808141ce657ad6e560ad62b088ff086e6f03b8a64bdf7c7d01e7b19289279509a9d6d80e50aef3b05b5561e4556952c46d0b6ab8eae735eccee77e570e1360b7ea38c53ae6b8eb420e4c2663b57827228392db6e79105a47f7d89e06ecfebdd63783101d3bfb5f494785acfdfed41f8166faefdf0b49260222c4080ec2c6e4f949f41784f076ce37fc7a34fa4e547bb44e6b9359b4b95cd67d64e4402ac83973bd50f8adc7c6e4c34019bd8f6d3843bba3d7155890712e0ed5134e00db877398d86b459f312a6272431f01b057446bfb1b8053acf181bac79408c7708f3a0867a64e06d7786849bb874a6bdf8fd6daaa572d5648ae100f4318d6b3a811bb0fb709168e817ed83c0622a7e5b17ebf5cd5ecb21d9ac32ddddb039083144c93cb55a95ad72732132d54bb120639d1620ebd142b58d75835b35cc6367012c93c6772963e9ac852c71c0dda2246ab845469997fc170d8f62334bc5aa4ce23e036967674303ec6f75bd3d17d197d026de69beda70bc59d2ff95a899d28ac7e5e42f4d37233996a8e6d3b0b86b80df49ea8e145b4a6e3e39f3d6c3c6518bac45baf97cde23037709d737b242b8918ca31f90fe59ff2c83e2f347a954d3559a8e4f075c620ad36be20b1e24b3afa156cf3255192171ad0474e4adc9b7f35436325b92945665f038611e5d14bdfe7b7d20c09642323346a717f460dfe7b5062a0098be66febe9f5fccfc747aeaeff81ba08e5dd2b1a489c998ea9970afaf9aa03859073707a686c492fb3f7ddb27897ba5e75e578bd82114b2ba85525a2002927909c970a04035334b64b1169c3a923211e0999db8baa26b6537cdcf57c051c0ca1b317a5b66ad96cb5ebd57994f99ab202348d8ddeb343312f1f26ab2442b8c5f5cf6bab394418ef2fed68c3e60275e836027515b6b946e5d86d91fdaf49c2a5182d5051726840a156a8653cabda25e1dd9af693533d782caa09295952ebfe6a194fbc8bb7fc2c0da5914a506c6f31490928dc5d6554890f5eb268b09d671bb6b6d7416dd36e7b78ffc5c86b34fab43d22909a87e5239643d5fef373650e291be56b89b9d90431d8c9fa44fdf4f83a1689d59d6ef833b1ce31a44197b36ab298d53b51ae3f8387087dcb0571c340874c1524ba0d576bdb88101c1fc387d25b5c0dad0b4d309255ad5d5b1e209ba56db0c927bd209399a8a3b5c8663c9ac199a76ea4f49e364a4b93a569b3400e20f0d748adf7db46a07efc68e43802a5d1a914759eb2abe8fe3e8d67f2cd7612bd4d5a6a4535b1e5b3ad4d97e54f3db7f8512c9603d87e01160b6908d8df1b952c750071abb1565e5ea3f643f233faeb84278187ff0089150bf21ee4d13979fdae796f592ac5b88869aecc5be1c64665edc8ececc87502d36720b73859313607aaa561d56a195dd3c7292fa8f0750ddd3df9ca056fccd9d6ec900f45c1454c6ceaad4154c69e288dc85735b8cc42950a3c5f0fab2be8811779905c3ad5a9a6bf56e7141d863caa4e93e0065f229b695efb790926618b3eda1b9a15f143bbb09aa3c4b72900617793417df364185cc213d5cc3a375778117212266356e214f085d8a7aed908256c4aa25faebabc70ce913c08c89380da06920069e8e27dd867567f152f883a9bd2dcfb8097b7f065482d6d11c0edebc67feb3068cead403503c04b324885ce1a62c99af9808a5ec8b7cbd978b8c43e37b06e9f7e1ce0b31fa0fe52e8842002e6e99cdf69263d31de080b56c0cf94f77f0397fd1f77b13e17af90ff33b00119999df802c33534a13d3ff7fd0e8cf58e8f8c8bae033cec1aec7d191f2d1a39c7b731c97a67fd1ca43c13a24b9f97d92e2364dc26a1c9408d4659ac7373e53a2a1704a47e01c0223ed4c489735b62a27ec67ea46747e4f48d3da101b0863bda9d3f7f1b413f3e7f130208875e6a29dc30a78198ef658c7ca32d7d53b4b92e51f8ad6d39ecabb800adc0870b2ab0e85b5769f346ce7fc371ad40c561f9f3b2f2a01f2b8ccae48c78a41383cfc36b2a1bd41d61a39c24144965d9aa5ecc5d506c7c7cf9476085bf049942d35caefd77821ad925b7fd3a006213abc1e008114c848d45cbedcb8af264cdc5c07bc338fddd1123940e5d95717040325048439dccd1e298bead22b011ef76d26a390a68161b8bab29e8409a5880cca9c8104694e1282c9fd64f50e73ec6b9a9ffc31115de9cc0088400a2dc806f85487fcbdd60f409ffca584fb197156b40142e512a0dedea1571ebb74d6b26d3b4a59e9105929a055cf3540e8a6a79ca7ea71ba8b40893c9797e81c6e9a7999d4d382e52cac95727bcac354616ae1094552b3d0a33d0d3ac4e547237fc0cd54944039b0eccf335889f6aceb518de496e0986783c564be8a4a05bdc9c67b1e5abb480b98173ef091259d8c772b611e0c09758fceea3e59243406edfa71fc452d4450b55b8fa5ecb543692c6eda3a6ad3bfea929a18ebbe5ce2ac4754989c71dced37286cdd1512107e4e7f4878da1c28b4beb2dd9a712a8d1d61d1a5fe5382db8aab4857b05a783e98e77711c1933a7641fd43dc6e6e597bd03b11ce8e94aa094fe250f03cc92ed5b0a5e7723911e87b0f3c476d9aa0d96adbfb395a8fd353cfb5a4cfe27deeb82e849f90bdb17928b0a5702e4010f7aaece2d43772a78b325d2ff24f9de0f7bc65974d2348c64", + "bf96bbc17abcd1f56a9f22ad164d25ca72f8c996f1a7a66d6effe140336da4f20460b47e1c8573872496343be35a055552ceec437692b0e4919224c4ffc8b603286a8245eff5cc148b004f6e5a54c4ac22b0f09842a07cd332a09732694d3591b8b7d6a7ada2bb38a30aa7fd5e6baa811b9a195d3a96306d", + "aa2f714d3a184a9883f4199e8e33fbc9c92b36fff2d59f07a9d0d335d7476e81", + "36c79f9f14d431cc8c077439", + "873d0617c986dc9d83e9cdfc50b1f916626a9d9e1c595dc7ccd99d1e993d25d89b04a893c89e205952eef8f1733054bbb55fa5e1b07135787d4fcfae226737b50cafa2c11276e8708451be9b4d7f662e98ef6b705c5c4fc64588728eab1dfee22a0a92bae61828a7394977b0ae8a3b6d0126a23583fec025becf0a72a28891391ac1495732a7a4a1d43a63ed8eb37b280b6d886096fbc4f77aadbc5e441e996334d0e10cd7f3dbba9bb7efb147297986509a07735385c681e0543186dc166291edc3b4664f5c8ffb0965c85bc30ff5e7769a69609c69ebb68f35d104bafe3dbd3e2a40e13865f19bca3612e48592aa930eaee29440b4ebc1c0a59f1c54519857c929709b086bfddd6d4a30940b592be48e0067976099efe71f45f956182dbb300e8076e1207baa32d59c1afef7f34171bd66099d2d7f07b39d16d0f8b085185bf2554c6ad66bcd656f07979e8f19575a116f5c4fb9700ec3b46a3254f28afa1ed51348c1af6dba26fd398098a76d7bfa2ff195eebab41330ef290bf75205a2ee570a2fa46bbaa74aa6ba68a0e63e2731dc1974eb44794f3c89ba58cf96f7a070fcca678185711d97cd9d7d8202351ed589e0b05a7a190e60ae4aa109254a7bcf7013f8addd07a64145e21226795ff7c7b1c225f40ed7c3552da8eb18b9bc9bc70c2e7ecb10c8b20c54f04b6e27b5044a7a67b558407eb330f2083444375c022565c45fe817dc00c7d24c23db320d15949b0b64fbbaedd310e73e423fcebe6e1e98a5cd232d97e6466642e5e3b23f06525ac1cdf8688650cd366b1b7ba2a9033e62d836b14bb73717757b76b9673671bd3d3b2a56628f5a309f3b86ad32abac0590c50f7c5a22e0a920d88dc9fbcb3add08b900a2a2fae4178aa100a0e645ab428e0e79bd90baf4af2755e48262b64838a6fbc21226e323c0a1ba5703e30738fc7b5a7df9eabec6199df5ff6ad58f9df5a734ccd6509e53ecb3de1c881732e26e52ab848a0335b04b25f2254aaf8c130c78b0c9a40b60d402673ac7ec7311d0b00c45bd176bc73ad81c2478611804f59e3c145110aacce922e473ef346f8acaabdbb9f313dd3f8d0a937d0c048e5af789e2e09a816146f9ea28170909caf2572a2f6e2d0d511242909de2815e9ec586b2d12183ddbeb7dd70f32424097e2ec28b4ba62cf78f547e2057a4c050cccdf6b582172343742ec8c85e2847efb1595bccf89ece3b3ebba824d2f097b1987ec26c6e5710544739d54a714060fa91b7995cff0161415eaf55758078772c0271d9d282354e47a25b673eb11497a6ed8db82267d65ad47412300ed525af96f943c5336b1de88676dc346e7339230032463d305b0442f934018bdf0242768511d20474c6ecc82fd752c0c0ca5cee1f3e06e679fa5835540f97870d47ccc6bab233290be7a3bbd4a73f1dc7682049bf7b3cbfb6687479c18d246e3c07161df5c889ee95d39cccd989625a8c9e80f951f8b1832f6378e05daa8566477d7fe547e49ae6e822a68de4df9fc4d6500d5219c3d3bd8887bd7f695151ba378da17c2e750399f7482973510a386721c59683a86003edb9f0ce1ea89bd7bb8a25c222df7ebedcc1b56c8ce18f367b2cae720e0591b477f6ffb498c3d7ce59cabb1b01d7cba84d7180b4b2a165d4b889a6ac361720e768f2913aa50b0b5c88e55c35bb4df4fbc4460338809605f1fd445a2bcd97ec1d2f269b5e779a18c8f215bbc5555c745424484ee5436119eb8754f5e9e91f51fe715353596baa1fbb0a690e99691636e6027cbd4b7be752bc278661e2677070ddc12dccc262d3dd47160345de51359ee8dcf2f61044f95dfdaf323881b2bbff68af6572348f786f6e52d1309cff871ad58148307d7eaedc93ef037922b6092ac62171433adc4934884efdee3052ebd60ee115f76f9dbd0eab7c4c0a77b4ce8078209d23d81d957335f331965b556ebd54732327b5aacc899f9ed0edacad9eb98cb845867f249efb0e1a5fa2483227f78decbf7f1f32d060ab0c01eb985d83920b2cc24b5f9a0d5d869e980129d3b78277fb87e5cda61e340a729d86b6617b8828dffc7c37d4c38080ef3515c2784935973dd184e0a8160f84bb78bcd8a5e691760be4a4d41ed6512ee436ce24650c0e17e7d74b5e01cc39b21e21514a84db262d673f24a82cfd5dfe2a162976171c538b24af16429bf8ed5fa8e37f89ec6e7d63ea1d83ac1087cf89e8f43161f225108889e922493d973e36b510074533cb1cb22174d21c4076959e4191a5df880a8b868b95a9cb5151a7ad47375fcd87725660cc0b59c88ceb86984941268493c49b8aa2baa8c531ecf497853ffc3d26b926a379e72188e246d42073041fbca453bd558f328881c8f8d9e099e898a912530c4be499f2b32229c359ea10e0befe6d94cba5ddafe51d164898166e890b22fd1eebd5724451511dce1f8f7431d712a3f1e50fa5f609da686253311af255b84b2106b09b803e94b51729cfa0826869945d46b9606547e7e33fd9961cf15b400d0f5e01d8fd4d92a83ae526934059d4514b9e0005317a70466aa0b6086d5fcfed201d958a0de55fd23f0919ea29b8aa02440031a9fc206b9feef362a73430a4204869354ec81b6fff92eca97e7f1bb12d25228eae466b8137b4806895ce34b57dc14bdcd107fe160776b0e5daab150ba06976eb884eaa574da393af4de355381c7caa4f611a2ee70a0c78df93a4276f55e6281997b4aeb36888a6d9638cc95444047e5202f41f8bdd787f1ff44a648cc7d39f05e49e5d6989fedb194c526780709763da81a780db0d1534a466cce57e11dd3a4c0e273d9873af1040d52a90e20101e1f80ef296d45769d204cd5417a84e022b6b336675d36d9cbdb16b0cbb08f5e240012967c8067c92f97f981cd19d449084400d76adfb7c610abb73bf21e161db04debe6665fca79d71c8cc50adc3ecf0e52d07773478ca97b8e9821a5704dc58acc647a5bc618d2b681f17942c46c266c73ec211ca403a7d47e42e12c775b370cd500d70a4aac7124f5f6d2d4ca78e1c17a96426c326bb60379ceb0c84a86200f3b450e5e9aaa11f45440f5260eee7675a8b9c47fbc58cf18a651a1dc7b39a911442504f12c103054bb50f15381e512dc6e3af7b414b3db26fe767d83a2a53d7181fec8f6b196c7874befd6628b31797ee3c9260c7b7853b137893e36696e2a47277add98462ea9a0edeb7d2d3c0f2805fd7db64c2c7eff353ff2b36f4de862a42779ffd4dbe77b6a79bc9f4ea3e909474ead915fa3fa990bc82b83a670b163e79300b627fb91c4502e96bb9dde00f716ae6ad14dac647c9f7c2e5b2e505708b5fee996b8e9113a8f4f2caaf414061ee72e76b8bf47ec4f781bd7c589adebc2c267448247e30d659998d8037783494a1fdadcc819d7ad7ea2674f75e10639c3d3055046a00814ddda0e463185454a4455d60b9780250183d591c3db6f27373cd2ce4f02f206ae10a8c32d71226e7cb8d5b05909445977164983c0073434d6c0f2bb62bda66a16792d6e53a49ccb5ac3e285a6baba935f30e9d1ddb812a018ce04f29e2009ad678ba72b6a7112d6e7cfcd3ee7b058ec954a6fd7fd01018a6eba6209687c3130de58147b07bcfa02ec1caf30b59daf87db4618b4a5fad34cbc8014a7529b9458e05eccb9a77ef1621aa95513c6fa4003b0877ffa6d48805e7867dcf53447caf348228ce926233f65d553146584d6ff3dc3ed3296db9bfe69dec6a07add13037b3aade118b2ac3c52350b9691a6cb32356ad93377059fb8ceab68de38d96876d6d383db01f3cf620e47cbfd471bf6dd1f601210482f7c3bdd4c3bd37dd0a7507e1f0fe515151634813dd4ecefe97b52eda28e7a7129993b0af311abd3a07bc463f3cbbcb4fb0eb265a5835663fdbab0d8b8b5a73837ac98ced6582348fdeb41ac8ea9e36f9818ab9c0a41bac1389a6b518ea17df043dd50550f32471645791bf59855ed695b84919aa5cb688e569122786660f06e3a919ef9cf18c355bb397b86710c367362cddb0239aa1d32d489328e4bf92b3abdc3d0dacd76ef1a1efa28fdb848e708aed6780e2d8efb19a2e26fea56b4440dc3eafd796896d73fd150bbd967871f5e6ee5db58995f2f85cc2a15077d7d472bec2e30430af6891193ef03dfc7761e2b3b3b54a72d4f1084a8fc541526fdeb0633dcba14e9485b43065aee8750397ea88d9ff13417149e0fa145be666e6f4afdabe7ad8e4864e777c20ee7a2842db44dedee22f3ce2f97d72919b9ff6059352083be816a7515c48c5140a99af8e81b9e18b10074dc73dab55fae66261421629c8e323d8134f08beefbda555660a51e4b55a9ba4573bdf0396cc413145a941c4175aa672586f7676027f9fe211db87fe07a23962f5b1ad8f566f0d5b13c5146457276f307a02e1e13d00c5032a06d225248215e4bc4be1b672f1eaff16ca95da42513fc4315c7a6663f9101aba80224acbf0c87fd3a2ee9dedd1808c1247c5bebf3cb8d77377a508ddb484ed91203a438ef5ed3ca14e087102bc5f3828d8c3437ecf5c92eeec0331ed93ae33520740abae9b7bfc45f097da70adbb9b9b879e46a7d655dbf75d89773f737b66fd8a8c13506cff7b44bd85dee279ea7053f3ed8447fe79c400cf23726fae800449d27af5e342ecf776378e2eb449a3af27a40fe4a9806487b81c942bfe1a4b0fc146c971a13f83669e0189e337cc9fa2024864436189a9165ade6b864698ecb797ea05fed0d60f0ab4b92cbae36c72ccb5aa45337cc02dd086afed9e5522ecdb75ccf389fcd63c5a4abbf60908e39cb3268c76a08687588be67a856a841eeaaee8ed016f6640ef0f5acce12ab8bb58dda380696e3fb22d0bae0788c4fb79d00cfa5ae3e479dcf7d08b45f4592c2d2a7f8081d5a9398659613ba4932ebfd7382d516b2648ec4ff4477648069b9b2e4decc89547c16ab82a0ad9cf293fee5adb17cea4c95ab7b8e386dcae6acac63ad0d1d13656dfd97d5623dbe45230de597751321bbe5a03c879c303fd7a0d837d48141decb6df4f0865717628c85dbfda29df9a8a69b2c956c75fc66e45c08960c23bbbc706e48395057f989dfe675305067b3ed8d046db339e504d5b2bc978ab4dc261d8afb325c5e794ec79d63d8db53f9dd24b623fbcc202679fae8f7d39f7f7e0667b142c714b6a723996e5254ad2ebafd63c3577f8909981ce6b3eb1a6ad67a4e93c45ac3b34587d153ec5ab67a2697a9741610d5a176cb9b5856bdccb98f69421061c84811dd6660495d9f30548efaa69e36ead246d997c95bad0ca3fdc1a08b4be31b12daf211d3e29d585cdac48af8f2268ec304bb35d", + }, + { + "ceb1f819497c0d631a9c9616655f419b5e3470fd3b19cd0e4fa556bd26cd9df57e960ec7121b2a2cb7c0421c1f84b77eb8277bf341490190ee574d1424eb09a281176a933394bfea5502077486bef23ee66e3127b732b7a58a04b9aeefc35170dabb030d4fc3f8a4c5ff194bbd0b89a379baca30ec81d576868f25755276e62c31e93a80ac322571313ebcee494592c3ff5cf3ecdec962645887d9aafdbfd62ea910af5542d4c7731283625bc9f41ec85012b42edb1792339e6cdd9c2bb3cad4c4792a064df17a5f74dcbb3dd0d90620ebba4fc6d1e1f9704dd60c798ad64d4e5077549d68cefdddaab81a7a91209b7ddbea43accb3d1c191328929dffdfeb4f5740ecbf0ee99cb9a1b73333d7ceb0b2b8f35f84307b9d44a42fe1a30ecdf2650dde251bc8c1d46978089c50d64c028f40611370ddb0b481df9624ed63165370f4788bbc396026b268c2023e0f04cd4f66e0bf439074c46f0ae85d6dfeb0ddf22868af61c8d5133097156fa61a3cf5801db5c3ad29871d336f7aa06d2a7d5f52e50eb3aee3c7de7bdc4d21f68a1776a7cc3954f5c071282febc89c1545fc672a0a1bd8eee2b769be048ab58ea12b356d658a6225fb8a55e752f1fc97ed64c2f87f9ae661514f1f56d9d4e47b001ae865a44b8a9fd5df8628d183bfbee781b6661c9cc76debe6c3c5bba840bbc228206673aa05498a8c715b0f3019f6b2d05cce6c233b5809ff1dc4a75d7f69859fcff94ad442d460b32f6fe348659518c16385e49fddee9efab2455732aedcd17dd51b5117efb2ca1e21ae6787437f48a7042d46e11be4dbcd2932ffd70fd154e4eca5fcdc57c6fa79746100b8e1485fe575a5c79089a25eb2d55d89e42eddc81b82c4f7da8bf153ff5353b7349b161911bbe0a14483fff6585d7f3c8b5c04a6dfc99db9548f0c53e25f0b16fa212f0bdd10ad2193ac18eb09972795f42b3bd3f4d98c4868989c4af7a760f1c88ffda59faac73256df1d607644f56a70303d6409c9ad716149bb58f01b4ab8ab475e4af1257d47049aa77adf9ce54fcd22b3d6ec60484da903a6991ff052ca37b01428d5916fd92c17530bb3385a805b0d57476e9f9417a23ab1c12a038b61b3a0898831f9615d10b468c3edc24448d09b8f3e3a2355dc5e069e880929eabcc97344fb6ca5587c5ac1404783848f531f1e915941e7359fedd328f7fd12b3c685f8c1f29d1a6ef7dbae3e5e32cdb251eb43aa2d2ae0cc18b3f40fb006c2778cba387e5852ec4f2d9b8e8ccd5b3e1f4781c974aca940c45d35d30d3b9584c750bd45a80f32f73dcd85c99ae107b92888839c342cdcf88911cb974d611b14b1d85a59e88c502559d6eef3b7f5addf7d307bb25c57aae669767db6d798ca887124e159b0317e09076cfdbe61aa9ddeda189036703b1cd9b1998f88325910a37ef1fc2e227a382ae635e847df8625b99eb6ef0ef10ce7a2a5762ad7d03a7a4e2b767c4df0b477d6e9601dc8e6438184f97193ea7d7a8c22f1b6fac1f0740f1beb8b68db40e0b22940cff2261273aa0be43df561b88184a9377e6a27f27942dd04abb9448b6b6ecb3a60f14dd39b58b8d94e1991cf9d3a071ba42e0e1d71eb211ca466a70fd4724a34639707feefbfd73dd9680d76a214924642a063b38b85cf30eb763fbfe889f34b20fa4a10ba214d938a5a092c6e9b73b13bd664c75b34f746aa360593c0f8dee0f328f0ad4a3e40d498490007e573b8204a1ce7a550deecfb15f18ed5ea6cb5dd95a68adfe4cab37c13b383f8273b1971580016a8df02a3f4f431c9de9e7ebb33244512080fc5852278081b9f4434109c3427441329e8071d19d0fbb74fb6ea73fbfc7c0ac1012d3a0948d94d7ceae9b0112ec43a16cb582f9c53e7eb0ad15e05ceda108fdb3dc9e585a332018d1cb19e4a75d86041308fdd8476c88e4826931601a3a5dce06fc16512f4669f10183d5a8d15bace4649abcac07358089aeb1e9b8fc3776f3239d5442d3be33d532097e13651af7c9a5b465ace9e626889800318447b8876b45dbbe1989e1eecbfb5cdf5067c71a0d7b7fba6555d0edede12f7228d7f9841dc532274f24060b1f52da6fbaa179b81ce962723f43601d248f8f4d5778c1653e038c8d27828836d562968004003810e9aa9318edf3260272b54fca2e012f6c04abe92c2e6152f3c3e973c7e9abe8c3467bdc246f0226d1b7669bd577bb317c571aa8758bfb694fe4dd17ce78f091cf6c6de3cb601a9d177128fce8d42e652b490d90c4f8fa04ddc71cac300d3dff699be3250bfdb2136edb0057af3ebcca77ba5b3ca34531810c5e2d4c5b5b3bc4e71ee9e30cac067b7706c326357fe0ad2a4bd9cd811b4e9d696bd9b4b70579ae246381210f879c769e5f9cc3cf8d70e9c94ab74a55f5d7bf61a17418b6edb6db4147fc40cf98c75de85421b7d192919add48e5334ebce2a06e56b915447fe085b7dcd677659dd55de1f705c389975e56e0338a2ef07ccf5ec3786407e8449d9011641786f1ecd4d3d3da975d61f5a442293e6119ab20686ea8cc7681010421226838a95a157e2de948c536aabadafcd4095dfda48e5613272289a8238dc945e5f1ef30075d5de096131740cdf23da1fb8b9fa009e5b321083cd93bba9271909460c09bbe1e8c54319394ff85c291814e21215816d4791f01424abbe4cc4c792d0d04db1b812f4d24b44caa76de2bc50f4d1d1611862512d87fcebd3c0b2659082b2423bc5360d107ad7b8e8ba7438ae4509105d6b618af25e75c51e272aafaaddf1e5a227f2b2a2c96a8a83dec23223cb428136a30b290181ee20a819cf52f6c03798e7294a89f3b5137693d5a8b7a0ea38d78e43008fc4eeaf6d077ebffd3ef7952620e0af1395c38a289832df391d1710ab5b103a1ffeea8c06684c03a74399cd63797c770e3f0136d8331611502d21fb883136a82f2034358880392fc3d2fc274b799e59b89f8f90d2a5a123d3c21e5bf3540323743858fdb8912c7c6329a3aea241075ae097ebb23c8cd50f4ff46b42486e65bda6beba5f4fe6dbb30f7e61b1bf690c9f00f7513c83274cd21bb71563257a20cc38da2b88c1063bd0849c8243058ee205853342085a8edb7545f0d96a6af936a3d4612b95676665eb02e72e0875100dfa444f039eddde1422ceed8d38e6c3dbba25064f8c6cb5786f9ca67712b7840cfbd40f99b1edadd4bb9a61f48124cf3b49d68bd642404eb1dcf428eeabadfba6810a4032f8ed06b38867a7098c7744d54dcfab8f0ff941ecee69da9916d54097e080cad86dd08bf53833fec4aa4399f7124586223ec70e2c31e8c647be06df9e86a976f37901e9b134e775de2a0fd53d545c5f92236dbf5455859c138b7bb1112427049d29ed4f5dd5c43cffd3113c276d9bba910879e55efe817189fc239a204a9ebe738c0dd161d10d60a51e9dcc8c38861d41ff029ffd841086803320a17ebf5ff14b6cc2ac3dcf0ce2eea9af7ae23597233599c2321dd2b99e06d93f84989e75e30a388f47079c2af545d96f270e064a43a00c76bddf2f5be5089a69a138de844216148a1eb0b413f58d831d9b8967df297455e7538442388cdda12d157fb25896c6e2b47696c76b234a88bed4f09dfd64f2e4b77627ef03049030190fe271a5a853591ee9218a0c6b12cb3f02683d665b211dd1480cd44c9c0566ace7d751902babae14cc3821374bec774d54b4b4afd5d1811ede556a7a5ad02642a878d2d32380e7efb9082604f49d51495105f827d77945b5cfaf2f2980566b28ce3dfbf1bee2e077eb067bdfa4cc28f5d2211ca99a615e69118d9391e3feb9b13cb4a2fa9682718189ec612db889228aaa3f3345a091aeb11f41420240fbb47caf567646d9e7c762d3288f8bb2b1165cf049a191db5042fa9185fcd180b04d3007c376e0aa3d427d66d10918821f74736816044366463df7cb3ac94cea167cf1daf2d1842f130295e40bad672a22da9238ded69e241395f04d5e3c3875b8294faafbd3d90ed56ff3e01c5a0a3e349d761273143686aa26d408620c7d1a35ccc430a09e3f750d3256298c6068c0fdded270f308f79d2fcba591d723ac0cef703d8f0e7c051bae5b453abbadfab98bcc297ed4201b03ebc195c2e441cfd3b10c63c08868db36c320707ecd6a37593661d70a81f30e6db4a32f98e4fe6b950ace55923631c8f95138781fa2af78d8104fe39242f1fff6942e8e782dfa0d37c863caff9492f8e5cb70046d207c4630cc29c20e1ac105aef093261d8d335456961e552ab14d107cbe14e9de912f0e5d58d16b729270208204469f917af4e710123c3bc38a4b3f485f2926f058344db105b9239829441a2d8ababf04aea615c0e350846d9bc3b5faecdbeb450f38f615f119ad1b5dc748e88107ec2fae01f0915174feec37b3e7248ed2699d0a5fb2fc785f17d6275fbea867aad815acc8a6fd3ca4ea7357d197e5a30082ad5f35a9d894c0aebb206c6487163c9cc20442c040e6aab33d7b4b221e4ba4cbabd975836e353129559d8ddcb3c97876cdba360da0e0c1dd5b0cff7957a444027db985ebefb6154453a221076c997d3954b347f49308d2ee14d1676b75ab6ef365f3de54aaf398fd96b9040253813ba734829bc78a6db59e3f1c0ab4c878a72d6b8681157919130fd3171126994dcdcdcf68955ad64af8156702c92f7a715ce6f7ddfb70f60e80c92691efbfdebc8cae252108fb6c0010d303d9027d4a5e63413b5fb2316d32fb93c3ea52a2a7df50cc0058c76c58d73f5bb041d9fb9f3c3cda9bee0c0920079ce4f1ef8698ced664ce2e2b3b86027ae2b3bcbbae5bf7ea3693d9429cf94938dd3a2763d3f53937c46763ffee6579d018358bc69182b1c7158a09b18352ea618c11c45f07fe97cb65faca535f43237879ae3e0a31efd14679daf8fd2ce25eb8f32218fa20afc586a98fd908d3fd804cabbf56dcae272328011b252dfd83e5f0a5fdebc6acb04c5540255e1322de5fce9db5aa4cdccd74dde8990ae51cefd6c1edc1879971d3efb1f94dc41b2b23e9c9d89415b46189914a229b2f3e8b05ff78c68711385a00e9534dae6f79d15842aaec575e4ee0f098028bc74016cd3f8e93c6a0cb21a0b574ee63e367343ca9de28003d76e02d0ee2b8d622cfa3615d3628fd02499eb7bd8c1aa1f34edd9c2d059c6a7c7c978a5e4f60801e03e17c3a09793c5217f310a30db1965b8e328893cef20f4a899aa8d9fa28f7fe0a733813ed7466046776a874273ecfb57158483f4a588ad4f232adec5ba4ea651822780596de09fd54b1717bf04130619979a0e3d12ab7c35d64afb8099a1d21bc952653742f50c8e1c244d10374329cedd27fbefd37815a9b3112a4cb2fc587c4ebda381b2b01fced45cdf0b9ff8ca7d10b65ce42e728de183a82e369486a2e3345664e70674a5dac174d6616d90de8e472b62759df057119875483cfbfb103041751747f9cd12bb31e91caf79eb2db1168026a4707dc618f30", + "e45eef9561f3acb3672b4f38570256e8cc4d877e2998e72b022e33de8fc20f7320fe0882f2b53559e084923786e8205336a7d15f3fb88a41e7bd20767f2feaa02df2221fa7577988db0bbf61f3dfb429868688c53e130725d0279c505686f083", + "475a44cde0cc931edf9a44b0c1e0001766f09ade023dfe6b59a6af800e549b55", + "7812a320691ca8442767a51a", + "eaa577bd67fe79ce4586f43355c94528e306c1678946e4f7a907d2a8ee7f4281270502522119a8b09b6f05d864921cb515fddf6a1000fc2f67b52d0627998591e2acf5b6faf71c278e5754b2703662ce670dd049da8d6e280c2b84d6a9b29ce28980563c40e03381a49c54608b72faec9b272ef05cfa41957d9eaf3e944b22610c725d8efea90aaac6e782848d368ffc08784d7fe37ea1effbbbb34952def29fc511fb10a1282bb0b6334328e4d00529a44de3259b522553a07d524dc75f431cc9670127c15670c0df419826617cfb5ebdd8788d5f528a9eb1e61324eac5c1746f339aae2e2e2fae598642a389da671482128acf2d69814258d83de98f186468136868b729aa5f0874fef2ff2575a1f87439d64e049e4d0637e9c99ecb7275417af654541306615f30b75a6caaa563e4790dfb28fe9f0e7881ea2d885eefdba99efa7f878925ce7d33e86d888154a1b03189429fe20af8fa3a68d65ced9b690a709031121425cfcd7e1890ed9614f9dc3ecbd0e38c6c84e453e3204978ddc1ef8d7fc6cae28c61a472d8e089e23209f0c36e80c994af771e6505e72ba90e5543f6bad6dcd31fdd468b13533a0254e44797825764ac1f63747d8d6ca019ff16fa732068ee94be382c46b168050ba725379df31a98ab81ec8eb266a3c3f2e1cd95e5f12b3bc79b8b435e4d94098c6184631cec57e9d8913458889223a2a4541f34d2f9df380f34c3e541fc587f0a6cf08c82e99476060eb84709a292f4c7a8551bda3a9eb6735787dbb9d7f1e83937c2e0e49f2cf6e0ab0ad84c40fbafc3c7e61886a8629bea816972fa0afd0f617b6340b1af19e341875e97565c8eb0b25fcf68696ee674d2abdc29396bfd0f282543d2b72a239c6470f76d3b5bff6d1d064e6e2d06f9deef2aae8a259c034373efc820f9a2fdbce36cc27f35dd6386de3b49509d0c305757257f8674d958c580a09e768c0f6ef237416fd53c31511badb2e7cdfee636508482f01899e72052b46b5d844799cf94708520178cfec2b61c8980fa7dfaad8915b0b75ce6eb57ed4a01edcb4a35c1dfcdf8d60f3191bbcdfd522a0e321ea41c2cd87a303522d0f98b82dcbe53232ecbf0e2528de7e1be75569584bf2ec574687fde67ffe9827ebbe78f2e5bc4fb368f3c9b0f588c97f7a139bd82fe86eb605b8e29cee75d07b510da1b24fd62cd2fb366f1621e7dbf268b15937f7f7ea4acf6e615775a32c90733769996dd2c5aebe08ecba73e0bc4781d33971992b2764c1b08aa972859cb61b003406479423254a01ea85a348ef249d408157cc0962d1e24cd9c426e6e6a3784dec6fe935be1f6730b01e8683d97e21d8774b2e2655f85db7149e930a44524d4f86004cd687d8a528b6ceadd890707458cab62809110ee28f61a7277ed79dc41e573fd4a59fabf15393ed4c21bf4d5138ac843e80bbf5e1c39ac2d7f2147f35996eb51a9e835db63faaa196b8aef1823ad72523fbfcb35b5560582a48a25ab770e7528e4b3ef291e6f62f5fac916e2162b3b56304287e46839858daf322b0de083d1691d6bda44d66d085ef0d0ad364eebacdd0a43a4456035e58910d0b2dacce45b1c0beabc784f3620a3e4390c345df6117b86d4fc386523b7ceeaecc21233a2865ec6b63bffba6689fb3323402119db8f0665a4730b2e26ca6411db04f1bcc78ce6272159ed2665a286f1ad7758d6d90090a6fd320e697dafbdfef575077e282b825bd64a4dbcf92d1fc0c6f795154e8466ee4b318f2d44b6f81c52523ab68ff8367e01090c2623e00b4008e784049df873a35c29e0abcfae7acbf27236adba0b913d19a15b4af4996669aba4c656c317084347ca962ac8df15cd2f849f522016eb92de4de62944b917d88200ef9aa2def0d13e5f4ae09d2eb4a2d0800af1d704cb01975f6d59768a2b50e39e78116147fd6dcdfbc08354c1b4033bf6772fa127856a4072556a9f07bd7516d01ef41bcb519005c0a3b2a04400427ec033f1b52fe5fdc1aed8e2521fd0fff663e203defc39d7546281a98a502b8a470af16cc62a6581c9985d7ca516864b799fcc55a803ce80711484f6b81591d2402bb1499c95dfb1dee9846679c22853be87c84b4547138dc4fd46b4e79ad12773a5392540a595954112f0cb1d9be4d4eb3aaa4286b6c01520558d58587d9d7f0df3a0282011ce01c9c17111d10ad61b3675b1826c1ad37fc562bdde951b43f890555d6f74ac4fbdb9abbe8bc1e80bb6d52c13de8960a3ff8f65201265e82981dbe39e0d65cf3f1fb6c56e11f9786210383d0150a5e0cbbdb52ca8b2bc45c12fb572657380df369082685b3de9847d5014beaeef815d63e203cc911061eb53d89a312d187f9f02760bfa71083fb643f5d8c324c410070b7ebde250a185e7359837899bb1568a43fa3418f39c12feb03b148b924bfb98b99352b1fbad3f07ac8e4302f85d1fe9ee4bf7507972670ff8beca105cdeb037f1cc4f944d6ca869d0281653de5ee93a7362420fdba8b01a375ff08fe27873655953ec1c00f53613c6ab8b244e2fc1b6babdca5311428d06f57aa4882dc870165deff75ba877dd2a04d1799f26ebfac97a1be53a83ab77dbc2cd4aa45bd779f61b1283eae1a1866ec8a9c150dd0a4deceb2ddea1bc0f4206cd435600a8f190b999b952337d9eb2bdeb3aba2cb2e7000319056629dc1f00901f0880278509417223a3ea0919fcdcf12bff0771c7cc725bdca292068478ccb2e1f35ae8964e0601789a73e7e7c1769ba53f865910fc3d0085c922d7f7849d27b6e7503d521371351f9d7dfd5afc5df0effdf6ac49617fa228501ad72154a73e07781dc4b07765dbfa721d95cf1dc41e161cbd34fc7883a25e3ba6b03e504b2c3b98c8b12ff629b965c2aefc26d74faff7f784baf09c3fc38c487a9d1f5818261162f97e9dff70cf42eb5dbcd7bebb66d68f26d917ddf2a3efc0db1e3372b170b4cd18da507e44c467943f73648dba74db1053b53f989e481c3054bac22c6342fca2c26d30a859a1312e9c353bf921f68136de2b1589747bc765153927c31ebe749dcdff98b5da84c4b66085451b4c87fe1ba2142f98636bcb268c33f7b8c2b96a6525298814578377aa189dd73d5bb27ec5cd2110d8751c18a3110273df2595d4c3a00809bdeda70d86c4a8169b7010c9cdeabfbc3dd3266518226d0ade9bcc4825f18198c854de329fb8fe456dd3bf35d89bd9d2384f3f3282f6872351a18a2f852bf173ea4426de6d01b3ef4b4685aa82df7dc45b99617a8b8c8a0c65a2237b3eaae8267e1f6c453f485432529d973924a080f6a1cc2cc18f804f53209383ce3601ad9361afc331707be1c88b4370404cb7fe0bc538df04adc5c8d9ced94b4c474b19619a53dca3fddb434cac09ce10c0293fea04e8e1b19fd3ff3d174baa988d91cb604fadc59ac0b61f4f87bfd07eee20f7f3ffd96766dd6f3555cd48da7ecd71d2fef34ab082678bfc4dd007669b3fc7a937a5a46269baa7e4e4e43eff1b2b847ea70b6c6c23905d6fb2fbccd944251087ac00c35c2eedba30641797d36ef9d3cb1afc0e3e8930f5b605a847ee77106995bd44047294d04350194369c5a7bf246d1108e1d18d9a638be0c051f695ce86579db613cd8922e86c683c91800b9a34fe6339e0dd79472daa662f78f04f0151a3acd18f11faa4e1216222843b521fb998c8490ab8bab27fde36395b456501307d07b484b453b189fa339282a634af30fea99c9af8f877e61871fe743238b2cee6cb69dbd17d574b5106ebe4b0fde4ef42fab469a5ba7d62c23b67d857f1af6ac981c320db70cdbb6be41bbca60bb7a159ee1c85cb82e0a220064359c06c660b75de6b49839eea68c80283b75d9d627aa4500c0c0f21edafe4a2cf7ee079d5310479da06ba58b142614fe69cb236c51447d63db31cdff91485b46325c26d40dc6d608d46a5e2fb01df06064a022ddf6d5cce0147d5b2a5aba5f9fadc5e778010a924e00a13e21daeea2cd330f45536ef4f42c2e77be00bb53b3f9a93d3eb327dbf30baccee5d26849cfad654ff3ef2b035b78dd3ef42de3302e5514551a968a205b823dffb040ac9452ae3efb43219b02436d0761ca11470405510e534d56caeaacc40eaf9c47a39475adad266f5ddc813e71223800dd46fa7c02b078353f870049806ed7ba57b40b7c3c6272296667500c4b97dd2d7026698b6bc4985bc01be99e0097013a2632c71740888ffaf902a02bf644b38cf9a42528880d9dd142de967cc2ad3e1f1737f0cb8dc5c59c252496e8cfe4e53c82f4a28d9ba2bfa62b6415ba3e5e09040d7f3e3abfeba53e46575e8817ac5eca806ec8a84c7cf77c9fa86c9dd2940f5b96b25a92d4a8f894d4717c8f80a62a35a51d8511f1e822fd79e6fc27cc3f3097d9e3272447de6f223971657ded9e660ee4f8836359742ce7616fd0ca2de6656c71b212b34b8edc71ff36bc84ac4af58eb1adcba4b2c0cb31468dbd2c2b7ee6752981ee1d152c4e4a9b25b2ce87796820def34b662381806d2e4fc77f0b69d7a87de43d94d62a6a6526a7f8c588392890e96f9c51bb58b4f438eb5d197477ce9b160d1c898c89ab408b3c1d648be93b531a5bb4988592c5a8999ae3acbe586d947fe6dd507cddb92dff4974ae17ab99aad5aec9d07b96bd29489876f51afa67570e86b69321d9e565d86001514638403f86666dbf93f18e0a62bf65db333bb85a3ae12d8411aa3c2a423a29bacbbfeebb8a5bafd90436bfded16f992232360211086a3084d9fd1980dd96631820a2cf25c3ac5c19d164cf5ab9a852399491962100ca4fd640146b7ea5460b4fb9e46bf8d23d508a4eeb8a3e9fad8249ece3648c2ec7705a7414eb8e8d602549204cb437f589161fe40de1447d14efa4d738b775d0333526c845cef5ffcbaf5c957df1d8022176b56eeb198e7ad2dfc3d7ea46b125ed432cd04c77efc011a2dad8573345080d7c3cdf5cc160fbc86c4ee1959ee1b8258056b0f3d9343c22dbb2f7858c5f162f08cffdca1acc866aa68e5f1c00b74f66544e8a61e429335adf6f73e32fa87e48e1adf15bb6c7aeacc93713dbc31cdccc9b0e52f922842679494039c395cc1d95eb97ae4df3bb8aba9a2584d97a236f87cb22f00c0a078b045044a5c456e22b2b94a76a559de2672c880660f9785b76bcc2aaed780e05212415c6e73880ca110654ed155a1004af45d5f15ae8e5bfd4817440c5d3d5589eea2c6c344ca0d85d91460638b37f877ea4cbbed35ea75678ef2335a5922cc8541987cc256c8f58045028d33a1c4899cc32265c619ac782ff998a478996be6a0c5b102a664831b395a884f18e77885d860d6b236c52a8066d2ced25432bce79a31b23117f405ef4ebdf3517de98d288f8c3baf04b63b6817c46c14b646308e9f97170b7dbbf9d1a36480338d8eb7466df56feb6baef42cba75512954fd7e33961d247b7393726e46c6e94e156d5776a89ad3e288554470ca0bc4cf4d2d2b0c01ae4fcafcb65ccd6ead03df1d4d6577bb", + }, + { + "228eabb5ad8b4ff13b10d13b27372bc2152dff149859ba47d9c89b741d4a5340d8fff5858a4576c55547007d7e2b3f94583ea8f0976237712bd2e5481c3988f5387e7ac2c3f18718388795b7b2d44b0a13f3faaa55311b800301c9203a511572cf8f349280bbabb9424070f415bbfe28aef8d20329ee842cef4d4c299e619b6ef1cf00718aab2accec9ac00155be2903b6fb07dfe98b0bd8d8580176b99ce4aa6be51cf59046c17ce1817d363fa63af5a241d48bcce064a438651af102ff9c6de4b86374fe24f1dfa66e16e51550dbb791af425d8fa601c70c1bb90e1a557bfe0dde730b0364eba9d2018ee751699ee219e13fa8874070935b29a1767e1d748bfbe796fe4b81a71e823605d39fa4b5b885f4610c34d1a090fa4106785e7a035a629958ad1b00cb9d36d171d575268efa1bef064fc0a6dfbae8e532466035a0c2cef96fe9f93b872f0cf804811e927b39818189412868fb104e2d56ae62f77031f0df1ae91aa11826991ca7b8af22f130a47a72cce36ddc319b32dffd294f2e192e490249ea1a6f8437173ce6392d16dda888a98bf685bc91b89b8ee1eabdfb1806fd61f018d1744fe8b03521de4bff86d4a811ca2ecd5be668e9c752a6c26aacc0cc9dd89d112785c25ca6a0a7a5267b4e37457c04a0626c8a29be30ec28ddacf47a84918bab164d07bdedae62132ab04a6f2c4e108eba9ab878caa4a1a7509521d427ad7f3dfa86fae8345dfb5e0d46ce3a94dec84f7880c7422468ea74fe0b4825b8c762b34d5d9b82ba96e0c7dcae01718ccac0044a87476ff031e3ee3c2c13f5f375a841d243c38cd9a354b6525527de1fe7e36a6e2ad95e5bbc4c97e85f8cdcd5341da777e03451838807d5dd2eb4fd15976783c140e21cfc2eb3e58e40c16374de0aecbe3e3d41c64417a472cba18762080a2348ec3f441bf229a932ea0ca7c816938655d0c81b14dfbf86aa600d0c68172fb0046ef51f601ec89309d43ad1eacd583f9d205bb1ff1a37a97b44b5e35be4945f52897eb2a74645b01a7f82054cda44e9fa9f9af9bad1a235155718713bacd08d354f3fdd95858db0040fb551e9f93ae399d5dc53a67e88bcd5a02d104dfd9d824cdd5fe262ed9266fc47b7e640f2c9d9c7a62c6d24b429fa55560aa254a824a0858482e771144d6d5b05539cf71d75bec3a22be75655e1ababec4dff9472a019f6220067374dd49252282e4945a407084633ef9c88d14833bd95335107d36afdf56a642cb739bf0a61ed53a6915baed78e9d74166ebc492b517c7c594fe6564550bb7108f43012551e65fbafc0a9874e46fb64b5b7aee0082a5d617a43b8bf9473309c6761aebc7f13b72ed460b522a6b0875b67353c705f99d1d9dc899870fcc90c632aba1fa9ced6d7a2368dc4dd3d4b38a5807415e00de6b9ea70525a6c1b67d04521efeeefc6c591fc5256d990a1123522864a029430bb7ea00dd80d283fdd6d61cc5b509221e28f73386803d97a38fb0182fd95b3b91353c6eb60ef2b3d5c8c0ab8dc9cd9be2b4cf69450d00e88cb0f0bc9a4be82b71148a37237ceaf945ab94c365625f58171eb15c1bb244a87335550d813d28f241a3296520046e65aff3291555786d7c871ec8a2d10d4b44429041c3cd6ab60f0def742de3d28393c5aca92b150697ac15504ee66d8a2aa01a6c63d7c719d6d4f94af2ed1d8670e3231a0e481095e425e6231c43ad36e3b7a3478f6a61563f5aa13237beb8a891dbb29013c325f7f91c1b055fb83c436fdf8aef49ec457946e6ab7e955427373fd9c743acfd4b9609569b591ec79c7ea7276de103a35a4a8a05c91f59e04689ba1ddd570b18ed046f785d7e4ff9fce7115ac814fe126f781828877208ddfbb2ebc919e6d1f6eb417f38bfbf22ac9633f75e58e560b85d88d0e4fad9b2e68c9ebf9675819d50c30c8982bbbc2f41e02690390bf0e16979b24e648bf15b18800aaef58c3c465f38cfd1e47bf1266c17b69523b7868d2138cb95c4bce0dd3ceb7c2267b868b6e12888d5a489fc0091b295b56a1c328b54fe1119aaf1e6d7dd52fa450b52fbfc8b84c2200ebe209060b655cad288562786673121691809366af37b76567762d1fc24f1fad3128b43c8d10e9b6954b2efcbe40124fc0a5b670dd6dd544e30263a551825282aa06be3817a8eeacf31ca8b25cba011d60b78d3d2462810764e4acb566ff371005f5481c9d36c991527143af2c44cc8cfc59c920bb4a281f2ed4d494d30ba4d900edf59e23be2f763072255cb6f1e8b24ab1d305fbfb2429cff8bda303617c034e71a17230d0e860420dbcf9fea4ab48557e4d50797179496936ec6c97686fe6d9115809e14069244d251d4bc9c8931e47e06ec051e709ba1df526b55d959b37a6f3408833aaac80cfc9cb99915eb7d83e26998f0da2492b986fe0f5047b2cab6e6d33a117df21e6a8ec7f394a3712885dab176a4d6095e5cf75dbd3f0077e5e74b1ff8b902072380cf172562884de852ff5f07c55856224fb3df8eb44764ab9284944b86ab6f176a863cdd0e7ab5616a14692f6cbf41bc63113b27689fc2fb145736aaf2a5b26d2bef3a2a59ef8bb3f3e4d360a4251d0736482e9ed7e189fc48c0973b6649988228c2ac72b23826a61cfa06b11f13c8555be6e433d87e20113eb74c94f0e51719a7b38c59eba300089d06b9bc2a72017668e5aa3153ca4282718f1762642e7c1be1f865cd9b65c6387c8fe496f1e60d5acbb78c2f71cea1f35dc955b1e7d1cdc9ca339765995d9e05dd729cdf58aa2a1451b633c374e5b6c2af1c8486ee4250a875e80e1f359c15130eb1e2575c0c7badb2af61378527fa24347ebb12c10bbb36e3c94619556b2c641d0ebb691b2706cdd667f55b8fff8fb46e3ac72f3682661a4bac2391075ff5145eb07d69d77437adec2d096c1c89208ab3e7a9ea6a0ff4a5bc1846b3683bd7c6ec4520c3c95861a5856b0191e4221c9819c67273c66729728f6035e79c0dae8842df4c0c27ada1ad18b34efcd55b94ef120762e87e8c5afdec80d5788e83f0d1533cdd7aea8f27f33266e007b274f6d48c59bcfad607e8b298be2b17322be88558c60033452826778f167f318b660607bfb2f285cadb385399636acb8f5350d819511b5e7931c5f8483529d3ab3fdb5ae2dde0ada918f1327c6c0dfbbf5ed3c8afef171910dd0169022b3cad5b08084dd5e8eb8ef1ecb17e48bf69f80e3db0ae1cc7b73d94b89696e3c3443ecb4c7ca12568201744d1858d90ff759f2d264d49edf47772bd0e0990c14dcf8c8a4c2dafa44dc6e92f4c66b03bdc4f68f28ca2d0811a433e184cced99a8e5614ca83c46ec18b47e0c7ae91037ae06c6d6d0f3dee19711c21cddafb5869416d23c5219296acda7774891877f3f8d46155d39f43ed10500ede3afa26943b83b800b54a9752250ec6ae173e920002f365d692a9b3a2f9b27124ac97b8e81b70e8c0bb7022d07ee97e962810962b03fc019695b5399f77aab414327cfc5dedd51e99453179c42ae85a42f8e06e0cec6f937224dd019c77c5a0ba32ad08107216a9c758138b730bd5b5f4b613f192839514a8621634d9dbd5840e728c1ef4a2c8bbfadc376dd80d13dcb327ce55ab536a43b570789f5c5e135ac0af79b54232613d0e989ae695aeb358c671ae71d508b58a793e19c58c3d204cdc9a021ecc634bcb0bd6a1917554ea3bd688adab8163260a914fc01d7ce05a497a5c5836cf9401cb6aa35cd008470bdecfb97a511c905badd01bbb4d0c05867661debd2162beeccd52399d5a70a929405293916f33ed0d03f8b850f4bdd77b1fb6283118d71de629577383c81cad086f4099ce7476cb787f73c96431a0df4156f7826fce9045f7e7c97bbfd618b845595203cdc8df4638430fac74a07bc5f773486731d8ad29c06695704cbe2882077a85d543551b7ba81b181ccb93d2b3071b1a38f3c762b42df8246aa64cecbdc772830ac79e766fa99e8c65225f28297a32526df9b51227bd368253737f013ae18435a912bc18cc4a95216ce449865e8bd8bc759dce9d4af52f9e789eafa37023e91946952202dfb7243cab7db2f9f98bb66f19750c547a2bf2e2ba92862ab66f33fcf465ffc41d23f0b891a3b28b3f68ea48dde6ad4802902abd22b0d7d9101bd61471c5d88ee9d9477b7cf9f6ac52e0f520c79278da22938745446f1e647ae478ecba416b941aa31f979d0633efe72910bebb8988de1d0013616f31c5da163eb6c07022649ac57422627a5642618f53103adc9918f9992c5b085e10d2744f9934bfbb994a710d6cd387c325e94278f97d5582864f1bb29a1400aaf674ea8fb99a3b42e4ac50418fd804a5b1471eaac4642d4aa338fd3d5d0dd84372b2c32c5cfe7f319acf731a9787b048cedee3833300dde639cb1386c8fbca4bae8d67fb7bd72d1696a0212e27e166e6b04a79e34b47c98502ed0bdbd8d61777537f72df569fe5ed30071b57e8724e98ccb88c07f0458cf32298cefb6ed672b255e581ac756789b57e950d57174bffd3f47bdbe4b168e7e3f1a6df508d4202d327947facfbf9526a9e5fc1a5abb179902d4584deae6cb2900391e080d3f3540b87c3a873ccfaee5b4aaff0e6516a867ea00b4d5e680fee6b91defc65c240614a1409bdd0f49c2c4f3c1d258d77abfc17a749660f49547adb236730e5a7a22fbbabdd8ca079a8efa5b605332db12f455868ab67a1ffd27d1339bdf8d150189cfbf6199c6fc27c05788138a63267eb8ac086e27286b4ef99ee9d92cfedab5ce9916675f128f206a1733f47a597232067aa12da20c7b9cab6575d7634f8c31e9a29948b528681f3f9c13b9f585ebfbff8c28a299a43e4409b31b6c02a79eeb493734fe5f9c1d9e3830572eb54229b5cf525768f695acff48c76b4a6e0936b7406ab69f06d33d3f04946db9d7966ea6e8c50ede5abadda28149edef5223a6938d5c32933070d234043feddbd65c81be218f9d7c497a1ecac30bb9162e60a9bbbcdb4fec4b212050610e2b376aadf58b3c9207860d2650d0310ae6606a8f1b266b6a13b68c3306ed413224abdf19371bac3ea1b964f28996fc70f666ff118c6a7c9f2108d327f5145919c03832f754de35f5979ae72130e39126499037d6fbb3751cbb4843b05d9dc91dd5fc1429da491f72e3069313ea243933b47109af247fcbe0c70f9024ac5a41815655ab309fcaa282d03596ba59cfee0e40f7bd657689453e98d562442fa4c585f970b6983a581b0b8eb1c5e780b3f5c1abb326213c6b5fd440c2187066ddf55f4eabf88804139392c45979440c6f05b7222bd95e963832d7fa4a4760273cc075e8b8feeccb917e8feaf7d3f766d9ae880487e69bc01872ba62b91b8af5dbffdd93fdc95e8f47ed793fc070a5991f2e9ea61439662dab218f643c1959171937aa160008a548f51f87b58f2c4fae5aed556f26bb9cd1dc2b3518458e2f5ec5d974c6e11a0ed639958cc8c1db771cc8cc8bee8727bf6452f47c9782acf548856a0e67841c3dbdb1c98572a4fc8e6cc8195a504019b4930d302a90dc20d8628ae6c90e0206cbb3d05025744db4e115cd3b650e5519a1624acbf226ebca8875b05183b2584e65289f8b9cec3f7d010cb9671a0e80bb70ca8763f1722d79e8decb6b9023baf64b5981e745c06546cc1e", + "ade72c2ea29cf829ffe99c2d63840b2eef9b51a9919c02128347d2e88e9f063b86326928cf6252ce4beefbae7206dc61a22d0b33c90d464d551835e3b73c1e3d6e88663deab80c35a607e4180ec079b0ee84e3b7922904e7423acaf976e837", + "43348cf32211d7daa300de8a4218543c8e3c7373ad10950765c39760f80b733c", + "e4709d225a552e90fb357413", + "562050bfb40451f27b1181c389508550a0f46b53d14ca73143da9dae3d3d2b466e9618db39e3219675d2b6eadded7dd9c741d7c9bf3c5619a521189607acbcf6b3964d469d966fa134444aa06d80749c873f0f976e0c5efc5be8d00a2729f03eda6a7b8630575df8b3a19388ff88daf0d00bb3e7c35a525ded90a4511ce815fe6c8904406cf72d7bfa14ca533566f7b54268835285c5402e22a63f98b5d90c86dae0a76d65eacc1ba85b3f5a1499d5f3432dd5455fab9e8bfbd266e99283c2bddf9b556410956b2f061603d1fc91194766f90da841699ba7da3d53ed5abdd8e98034f8fe734446d92b458a731aa4c578552ec1ac5d1baaccc4153a67b48a290602d5f955d61a08436b27cfb0786a80afef76e1266310a42d90feeb3bcc40ae5c4506432dcc92f7e5758ceaf277255401f5c5f4b10df93a249e38edd9effe7bacdf7fecc451d3b2cea77c9bab0403450c41929775b8c0ace46f6928f4d9cf3adf86832d298ea32b236d3201464e2ff506ef01da0e1e389e26e2b3ddc553b369b48d1aa5dd43edd5cab065e276aeff72a4c43206063fc7eea3bcc783ba2221f5b615a7a43a75cecda6bca5aa159e9208bf66af61e2e465c2daee630c4c62077ea6ef0e8b4b4e272d4e93a5f5284f9da463e1a60f815a8a31698ecdc09dff2b62f00e37aea5fd4b07a110cef27e12466c1814d3b10017cb9b8e12f2f38f10cbe31296de2570d5662b16639fcdc05db81e0d48178d055ef873501148d00903ec771400fa4873c5579dc3265028f531538f6dab1e5607a15c8b90cbfa4835107cba6f453bbdc71d08c7e423f58b44be38a9c8a610469f2551ee6177edf639cde35fe8e02f76b7ed106d691a876a4fda3b42d8ace3e0d3d4e026206c5d7d4d56fdda9dcd30fd7b74217fab3c617903f1aeffb8363443ed128af94c391810e327704d6f655e57dece97658d41e074029823850ddf7c5937af41c64465046d8544bba65c691ac69121bd272107f7eef8cfdb6a25da5da16d1033cede09129d51f6abfe63905a6fba9a64d7832fa35825447150595a60163af848eea878fb31a5fb97b1859efbfcc8586eebce8cfe64386461a9b88aa5efc1db43c64dfd5d4a45aa74803fd178f9e16a3f59acfb6e13a564d645cedd73890d0a82fb6dffeef527694a7cf2a89aed9750c3675a67505bff77de8d046087bd39a85c90aedb085e99baf04c7e3bf92e350b332da1b8af85550a00d68904ca426da61add864496d6ff442bb0b848e9aa463bb0c2085cff1a83a47d6f702bd184cfb5c139752754c8978d27b58d364bd88722b9097ee3a6ae28eabb14ca7c31e40461101e92448dbbc63b55cfe56efd078d0058c5e6146c73bcd949c4b3ec9f881b9a5f7b41ca83301261e0c674f2d35d96761baa00ce0675c082bf73dc52dc726a3e605067569a372d2bb47fc8fe1e74f00078ce6f352a6d9d97fd2834670ba3a45aa6751eafc7ed6694e1e07542860c8ea516f296ee901a3ee16b00b40419c74bf6db12c7230325e85a918f412bc2f6469c1a13a5aa77f028e327749efd05b91053f49d9f1edf49aa552c58c68257233a168db60ac55b4086ddaea275b078869cda7b69493c4b371b4e9c8361357a7ac7d3d3bbb464c960addfa8df2b208b21b090d540c440241598212d33273203d484e0930e22469c2a8e866579a4a2b3db8f8344dbf8baa1b97be0c4d976f6aaf14cc09ec52630139b894b2b6f4dad3a205a7b286253f1522b1d6e43bfa37beaf06f831c6f0945cefb2593b9b298da13b0d910582086c5d7e256ed4067bfb476dbe01bcddb437d46ba716d6ace2ff9912c8e460ad33ab3d8f97b7b08dd4ba9e01968d1949ff85b4b9d5b8da291fc0f90ab1eab1d246f67d76092b7a37528ceb388dd76f8a8f0aabb7490f02a2c8bc6498cb26350d859c466dd611bf0ceb81a8b7899c67742c22697ccee21c4963acb003d15c1a2078112bab05595917584e417db3872a0ff0a29138bbca7314449b19827525340370d7e48fdf9f7c6b4a280e78d00775a291081a5e78e7a00ff915015dd5af5f0a45690baba8b1b503bf85f326c23136f4424be4a559aed03fbc81400ac27a33dadb2155d1704950d98043dcd86df1eee78f3f266c4d14deb8126708f74b59aa15e8b497c6a52924a473f999aaf0abd3d148fee8503a1568efec7bfb0bd463402f563e4019cc9c9e1eb498aa54dcb659f43b86df0a34de4e51ec558bbbade3d69511d3fea2baf44f67e85ada7398d7f72ecadcd9e981f82b0743ed74bd33088ba4cbc85b0c99dc5382c599706dd2d51aa9f470c25a98e7e8248dec216a155495630662bf6ba0b7a4baa2cdad30e9ce3e1a65e3c23d69d5f946606ee8504dd70830aa5a8ddd84f10e064695469727d2efeb46186c9d3b7a170057636f05b9ec4c2de7d935fba504a1e7eddf7a5a95226b253b0b9eccec976ca3c57599850db40c27a51ae755c1f30d392467cb74e5c8235861d11d0f8461b0e1d84f5718d64ea92da62f4de184a6499dba473e82b3d197305de0e494f118a263237c7b4c0652327977edb427ccded35552c00a5804b9557ccf2bca2484d9da2c33f6c1bbf2c666ea10b4644a21e3905e5c4eb417ac3572e783428d23dd7222e75c356b99e8183d033034e29e618c90e66ec2f1e9fca47d82c1cffda8ad14c96045159d9437e91ecef41d24cff89009ff57e18c1a422860aa9cd31dd2a85b07422c72a5decc614a9742e62a4988f394421b6918e51c2412d749bb53b1e8fed7b2ef0873ffe14fa77bc366bbd5fa1432be465f5e25266c6c12b55df1f19b1a491acfc5c9019f122c422243d751d8eaa8ff721397915171556e999b34425f7d3ad6f6c3323b8133b4618c65ac16cb5941edc979472734bdccafc73c08939c0b1e306ae3015faa9cfa09ed6560269a1dc54c2c046a12a178144f4381f7b6fd3fd2d28f778d444d9f7a0dae00ea96c6969b78ef326a962d23275f1518f0e6a2469440612f3710b53538fe99a6179471be8c5b2d682ab3e9a5126e41ed6de000cd9e92fec3974e0f4cb2d2245d03d6ee80d6a793b16efa829d75c796f34d4e918250f457703559bb48ff78f0896be1bda403b7f1fd6a319d68478ff70d88238f2b8afc7d20e51757bb9db3bffb35a8040fc0db913c4f03d48619af7fd24cb8986b3e139058be3cc253b3de9b3bb3f8dab7b8818638279b2e6a0c29cfe16fa7250d3c74362ffa07e2977cf562140fe28afba8f61d81f7c73bdd4a2faddb00752bb049d0a57d05c6475c7387e6716ee31974169930c9fd830cef138659cf56f2212de185186c3d683fc6b7fd36e7821f69d0de041a569765066dc4a1934870a7b80f174e8f9e484942e62404a42b21658467873865ef94fc262c231527f39e82dfec91215947b99567daf75c6a28073ee4e67d4307e4b35b46f85433abd9812f35438b34598ff3b6dbd60b60747ad64565391df45ac80b272d0141702ab807fa27c6a6ba2f42c3facfae0c773940cb2943bb1353b41298258bc0d07542b69483e17ab9ce709e4160b80a0968dae9af8fc7c0324c753ca4a11a6df32dfa79a87b445c988154bb3c503e6884cf6d8f5e062a16b4ff230fbda109a6127d35e3bf2b29bfd3b18ba275af773b1981d603300035e046ef023d51874aa105d136bfcc9c7323bd0513a6b2b397ffea71afb7a8d4695411d86164917099eef504f6cff3c5cefb88f23f56c4ae3e2b09a3f353fa55630f45f06c29e8912e8c3c4f493f25eda781680585580595bba43dca9cfd400d9eaf5081d2c6697da59e012dfd0b875336b88fe16609c2e9876737b9afb868ed52417ed0c6b359d582d585ff82d98edd4e63c6b65cf43d4f69eee2af4819157b8a433966953862d1ff2c6d0cba382644a1b0033ddb7be3d1fa9a204042d7b821b293bd659dca980c108ad1db740800b9bd2fc1a163f9b4066f7604f160a7910bd947cb48ce6c81e680fc6571ff0cd12a3ded9c8cd560970ca5cb480a70a8322d5072edcd257604eba8dcf55f9ec97ea2b14fdcc72fbf615131836fb14e42b8d7171d0a06d2fb3caec2e0759e86b0d8f21e312d9211ed7fe0b48669934ffb892baf1db9aa457c07820723e5446420334bf6479f2099e01ef8adf273adfdd9ed0b741931284515d69c211cc2efead8339e450b13be71b35c36c1f00c2b8ed0cfa9792e422912e14b5b1455ef6abdbbec0035480c6cb69d21321d12ee19d528dd48f43b142cf0502eae5304ce52b7fb827552db9ab885b93e83d56a33346135aef11b7e48efca7cd52e2499a7edab0bd0562862187ff4599b2446bff11c37181092fbb05d0e05220ca6bc37f529d6599e8c29acb9f25616c27df291d4fb07430188e6470df7002f73cfe5fe6907dab0b4f90bb58130fe90241c29c6063a22c9f45d032b282eb92c93736692bd5cbde2a17552e942b595b08e6ba0c91a03b9079e9117fbba8f26ce6c5d0500c69bb6e22e3562a50baece49109c2d42b6714250665afd0f0a7e951182012f21aef4b917cd434d9ca22661437608e32666497516be34652500def6c28ef8f56f2273de5416142ce9606faf7df92ab779ed6aa74cb99bb1bfe758ffd344e1d31f479807326d1a7b98f6811e275545d69198707b0fbf027dc6a5e4815d62ef191535569a452c27c4e25ecf139df949d70dd5935bddc04f33b2f0bcf5073c51fc51c15067963a20569b5659f0e7413b347d6d5ee38a92b7e6e656c199149f07ebafe5281db6b1b2ecd9e0384b6f5a8e27ecea9a0249c61b16564964054f5f9621471a98de132e102f518c1419829e2ae2c8c5fffd1270f0a0b33a383437b0034783d50bce8bd7420c059d16364eecbd55b6ac8df8a70382734d8127f4f5895cc9e508b13c000ea053ab59b87ee639745418ffc566ceebad37a17b842d24d3423ac3f086142c622eceaadc4106f8c90c5dae1f52f407fa0bf1e6bf9385cbcbf3b61006ea3b1e66b693ce704577ca9598587f41e05d36d1de424e0e51290a5f2e2f99f1960c0253a046a49b19eef249ca2dda2af1e8dd78411088eff1e9c23c31bd20abd4fc9e7eab19500827d202f76270fe9f90e95309516343e0fca48e5a12182e91c78ebf2cdd4644629afdc90bbccb77546cd765135910ba1cd8a3e3c00fa77e585865e898bfecd06c01a0a4d7be483801099c61941c4967154af5620b171b426cf229df59d2944ba50754140c3f305c16956953be376fe6e7cf31a2e9c276bb09cc24c4b86b2b26f039b0d8511853adcb7feb8502e7641a34e3242bf2c538006bb1983345ec3cacbf219ef10efc1681d52e6e1b1c60bb556b6b8a63d1d1f6869077841d1b816f3165a35833e33d39a8c6e62a2f7c482c395768fc6a0e3cbfc7a1a6d64da53adad66c8016f76eaa73df1b8ef83012ecbe75c92a8e39b48169433f951a539b28a034d5fdd00639a5e3e17ef14dafe869064d130c90c68be4d5ceddabed1bc94e97e2cdf7313f780cd6e175a9e3eba3eaed896fe464073fcf07ae7b5bd41d58c3160f66ac95a76fdaa7a8cbaebb304fe3c8f03cef927a1182ac2281c3b32378813b24bb99e42cb0774331ad78b74d46b8ce48bbf4ef8431a82d4240edfd61b910c38570ba0bfbd4a41665117e6d5f5a97908462e62d0b76160d06aa56cc6e17aaf4607ba8263648f2a0077e306c25486f5f39a75", + }, + { + "2f6210063cb3071b3d49339185c2cef8357b08ca826d8d1acd852540c16540f1c850f70404fe1f414853d3cd15a1c64a1cce149e3ca1b80926de4ae8438ad90bdad010decf2f201782f3e49794aae1b079f54eb59607bebde508a528927e346d4e444b1d736b34f65e198df2c36fa23c64f1f1fbf8b0b8ddb85d054bdb39b8297d0347f16f7be7cd9474c058e36294485386434b36fb28ee582e393367f15ce5f5a3d6641fbd31b331f10b1554a05da726a0f35c9b1b4af3498426b17582966a266cce452900f85af1046f45a4ccedca6ce02607fb70fa45f420f66aa38cd4c9f8a30e21a3067b940aebdaaeb7c77824a79e2ba20f26e70346dd6de96942b261e5c08288c7fe1cd1e9f680a0bdf8c46497f007a616eea95ccc17463559f8973eb919c68017e25100d9d1a196ca65fb615502076bf0b0c8bcc70ef22006895ebfa2243fba0791bae0625b762cc1718d1673948264454a200c58122d5e9b8b1e3eb05df8b7eeb297510e0d7dcf7f0be5f29f6756e4b177f109891e6825a9866359e35b10d20da7231bb5a0ea34abd0264b377d2fe9f420f27d3e5aa2e8e00541c46052966ef9b989ae5974e2054409507b867f647aa057f7deb19ac6929f0856005aec6e53a5f702fe6be403afed532b73d38fed73e6e551987f182a1e20801e7a6c8ccd1184cf0fefb4139fa166ca15395902ac40e7fed8661602853682a3b0ee307dffb44d0ea3012142a2880cb7c166ba6ea6a16c7e0882808db8023068f060e5ef1432fdb8331ffad6a7078d686d47d613e94291f1c4117e7c13aee4030fcaf223fcefdb300ed606b5dd931e4adbf45dc437eeb5fbff337812e15c15f026071423f6ef5305c559baa2ecd8ecc7cd498b043740ff3673774855d45d45fa64591d5b4970600ec91ab1b6f39d7dc0e709c41e49c355bd3b9d120ffb57095fb127bafa971a086135b917285794e83e9dac5ce76fb1a4aa4fb6b94a0dc3a9beea64b8817ec1e2b37af9dbd18ec30f2b6f6c12df1db6896c6c43b67a066038f0c4f17142b254f62c4dd1fedb950d07047919e397d06d033cb0bab6b61aefa6dee01720926b16beb9e8bc947dca9b8143b565da85d2dec182987838b267de9047f5b0d961c7971aaf54ae2c1e4aad61ff123c84e41a4566b2bd9e64247cf46b72a444d36bdced1a309b464ee5f4afe406eb68eb05ae51b76bf01b906c0ffbdeb440b11f1c9e3a4c3a809a1f7449047b356c663a1ab7f286a70d16141d11f2d151a4f06d422ab97cab539c1f9da09ad20c000c27b8fead5f0cc37329d466fa260aea934c154dc9c0a065df3d057a0f117a1c38321ae59226a8054f7d6b49a3753436c249838b0924f0e861f5627106dd8d3f0fa724a1cecda71d4a1267ed889b234ae4a7d5edcbc5d52cba389dc0152aff24d224c6a0f16dbd3b7f242807bf4b51a3f22690bdeb66eaa59e8766b3b265d784899d247a0ae1b58a06dd91c529e3691b09f9d9f55fc39afd4a00b0fc668880ef25a46a30861fba8cfd4b51262eba4138b41a2d13ddc71128c8c1242e49a51d6f49879fcfa7595ba4a4adcad3670b0b1b26382f03ff402bc70150f54bf513ba3e9a590e41b269e55616af297ebb3499e16cc8e46c0810330a602955553c0f93d668a1181a0bfd7021ad9a9f68ce39493b012da70a3dda149d0369f23f788616e0272efa322b6a54d804f340d32c890e2eb7b538f48f4c9293b584d22d0ae80d321607644271b81a76ac5b49d8e457069b0c3e909b8a222e3fa6016cb1e979e300804742f2005c68acb7b1849c088b3714c9c7af54e9de9390df0041c87924c8fa6b0aec6b6754171e059cba0d27f221f0b9d044a3aed8338dd8745651981e4b0329376f908b86ae9022699d495bbe3a148f7eb73d56eacb2e5e2180f63fcbfa680369f88eefa71f1210bc5b6b7b957f0a1437476a2112998033197673e470dbe7d9d476c97b95db8b5136f6cccc75d6e0ac1e4ace30e34e64fcc4d7e135b2c80e863ed701d3b28c25e982f1b5f8c895a4e6df7216c3c07abf8551a0ba0469c88aa7a08c7b5218a03b9b91f0935985373f65aa56286ad0e7ef2288a926f172b098123c136455b3a0f04590839e16bade7b6434a3cf048abe2612684c03dafd9cec39af508e63f07ea881014697bc24122058b5ef5d3fae835216d055f0cdf1dc06a12c95041d13ac9e15f235d11747f16ffce1cc3b8f508da520e395edd471f3759d8879ba9c2558b1188d822fd4739ed0546b0ce3bb9988db7c1dc8518ebbc62c4440e6e0653f917dcc13aca1864b71dbb67dbe7117474c936414e4f3cfab1f13eb05f3504484ce11977ab21ec523f97ba1b7ecb8fe384b634c30561cdb752fc67a2316bfa7e4d03f5f825d24a556a0460d8cfe0cc54a6f117ac52d553a5d1bb48031732716436675c5c3996b1939b127c6b0338bfaa29c7467cac9a127e455a715c9ce2b0c35a0d2f83a3d1273ee39399e6cc4980e610c752bd51652b96bf9cf34c7fa41fc9b13f5d55007483e4082ddac4675baa7822fd257452411b01de0e5e5da26e17539d64a89dd93c71d15a4c95b1a83039cb2d5f3f7fa04a817e48dfcbfb3de34ecb47f7592123caf27e17982fbfc8597af5b8aa6558f4e6c73db69328e47677afbe6ef8df82c3d1f0db6a108b2279f61822908d7b856432c32ac5ec0f3c53befab2a7ca356b9c2636f646b228b0a830d348be4ece2271814d477d4c73c0fb6e83a338b90ec4ef45cb25f7e3d6a014a9e8d2e8a6f55a383291a57f15667a73ea1daca31c7182523ca85a107efa2518d2f7f179ed4ba21fed479ef2be09669817133b2384bd85b155dfc1c4c9e6dd9ceecf06cc1ab8ebf7f07aeaae7441468b5471aed93f248a84f44c59be33274b11f651de010ab9f8fb24d3a99914e0147951c34280e7dd15ec196f9a4c86e55e7d373c7e31e6672d1b3ac6a45fa6c8c9088c0b8963d89f4ff1feea3e85cf9cf2f6c97128afd845bb131c6f62b3282bbba42745080fd457f1d3322058f1bd4be876bd01269546d1a853310b165926c1fd4e07054deb5d3fbe8f6007711d435994005aba95918c3df4cd390b165fcd139dd418ebbf661b6de57b655698a8a02ca8fad73e8c536c7110957c36e5494a831d536eccb97a2a9ef58fe58e2885aad170720ffcc57c7de601ea1cf723577a30aad8fd544317e33897c8b6c04e5191bec391ab990e197f10038c0726d371677e4a54c28d7ca5c6046e7cc4acde565b91f7f72af6109a0614160d3ae97e9257b8f71a4663b00c681e793cbb478306e97b0e04711eae7722b4845dadf2fff5bbe71ff24acffea2ee67df99bf62a098ddae9d4ebd3bc5dff04a2d9e3d1d83e8f493db3f63c9e24231b1dbe1147c79f21b0730c842f6983330c5c17dd34556d7e932074cfbe98f2dab5b0ebfd778a1e28fe2bac2d942f61a08b787ebfcdeb3d600bb130ca4922a4ffd38ffc4a1a1a7218451e45da4da67ad81ef898ece3d54cef877cb9d09f5dcf72eccbbc06e62f1e2b4d64059b0a807329780b155ce1614b68de04387d6108ef4dd3ab54b9da72e528d6eac3e16a360ae3421f3f23808a8b5e8ec3dbefcbca3c9f76905850033d78d9283bba9272c475b4e3b4d7643e62c2cc259ebbf168f890de88e82f8b26a7654ee31fe055e45609c70ae02b4942ee15678cd158f4c9e8d351d102ddf7a942458c6125e1457bea0d86ca38cf0c26e474b2b5cca77eb57ad0867cad7d25efc2b250e79396637ea3e948dbb855029cc9b452955bd04ad5a0d0514d4d773c0f298df7bc235a3ac64383a1fbd8a397a158e936b3ba81895a51daa89f51e4ae7a71a53794ff715a42f4fc3dcc9fd56df7bea4ab782534d3760e7b15605fc4dad16911656983c0ab77bce9445bbeb1537c55fef57a32c8f1404306a0a2ca7b73348cd99d0f9948875531cbb0ef7c036cd201614c33293d746c44140e0e8f82421c5bdf2bf428b249597df949fafdb5ccfe1618323f56a6ab9abab9a84a3beb6696ca918af244d34cc1cd95bbca4a87c860a0fa9ff6a04a905b0338a53f230bd5ee9c60e0e0332ca200c15dca0be5936b858d0a7b2e540b8958432e9767396c55d5cc35b60062580023b5cb2f9a5e9a1feba59a19f9a5a251e9d0e8500955a5df21da95213ced2260a2ed8f3d4b295c36cef750c89cf21985c302d5cc577aab7855409a912dbcf1d0a9800df4aa692a78607a40fd6d5a82305c58fcb3d2a82b27e8c5b91681aae62a2bf31ed55c494dbdc38eba30e83c6044945df76705228eede8470369f2e9941ddcb2f239fb3ff6bfcdb0efb5ec50f981adf0e8b213769ffbbea364b08cf8cd69abbfa2a6fe9865cc48558134a57bb5526b9d047e14a379d246de82d3d64f3c810ede280c768dd8bee25af287d5a8d94045ddbf5981382bc716ad9aedfcd66e0ab496172a24efe80649db8e1e83675fc8451e22c6564d8d6dfb285af7fec802b35f19dd8308c68952a11770247fcfecc4ed0e8a445c17b1573f0b4e3ed350f13269ceb572943fc435563459d5044699f1542335b03be6077af156b8c5a6a9f71078ad820cec4642427a9b187ee1b17036d5a5e6108cee8a7d444342eaec3afa64e77c71d3c2b3153d4e2dbb30df2b66b4d14cc45d3a4eda7e911d697e5763e23ee05311a20626df55549b8533c6ebe79737abf472f9cff08bec590943bdeb819d3f923f45b81f9a0cba1f3f800a261842d10cb4cbdba456c7fe5f0abb4a8b58891d97cfd6b669e2708922f1934809d51a1589e5f12e3bb82c9ac3e7e44e3f6e6cd63d428da624fd2f46eec38ff798a90d228efe50c9b67c63796347c8a2b53478f27605999a03c8e1f18b70e92419f646a7f49670aa12d324751aec17d0208fc296955b3098241189af8172d39a6819415cafb107c1842b369f174d6f37dd31cd728dfd0ab10f93609006342b6e4d6ccbfd1ed2bea2fdf5411442b04b1fe218916f159b20242f80b535b4e0a3024c6eff6a40bd0d3db24e51f5ff9c14e1b4a650ca4170ee70f0a3a5a58349a7d0b7a63af86347351696870b95231f76d8c5c6a20736907726341dcbb76672871d18c2157c094b929fd29d34f5bcaacd82706f89a60000cd341d98eb830b73a12335b69f3e0131ded3ce12c98bbd960d2d0696d40696a13ab43925374498d868cd8f070c9039ea6407fc2d92b9c39fe7c935bbcfcc5c0980952fb7dac79042951f49a1af828b138a87401c4104bc28cdf1e39dbd3fa63dd4d5f5ae9d85f032a43ad353bc5e6746e5a76326ab1f4e79103116ce70bc0b459200f32f85e461291e347dda92e421778b849e37a3ecb0b31ec6818e828dd3148dc74313aba43cc9d8b9a36a9dc4e229488060eb6c109f8ad6201958adec6d3bb3b04e5e558a272d44cb98e18f7a0ad8fa6ac3667a62f150830aa930f6166baac6b9081b44304988fbe1698a5b746255de26bb5988aca90bb6523cad68a7572f615f4aa58f932d8a749615cf0a7724e99de042268ceb31433e6df0a61547d576a6201b36b348c028ded5f7e94d1cd2eafc141088ff42cb3dafbbe4c402b93aa9d955df8d9d9fb57c75ac65c2c837acc44bbd4d4aff1888aed46c73d625ad7fff035e8ca0fe411c73ed8135b6b8e17a039ec74e9de0d64cb442bf8a676c0a666f68f21066332cd921ae0ed766f0516a8e19b82cf98e78add0373737a3419e13aa902310c44feae5fdf8bc64e80dce772686a31f141bcce452041bf545b908ef4a2b000e7beaf378e2afdccbbcaa42e330e5024400cf2852d3444718", + "fd5008477b0855f6f2486fd4f74b9fb4f6e19726c6996bc66893183bd76054d5b05c1c2b64722256ba912ab2dcca66d2abfdf972966438fff7513acfb18ea461eac08c4e32aea4ed3fcf9f1c9905ee4402e7b6984bef974340d212f160b6524b76de99a98d3e96cc0d35e8a63ad7ea3cbea1d40a906c4dd03e5fc19e1513e9", + "390a5e75c9ff4ad38fb6205ff47f209294337c1f25ff54a3c01eee8e1e220257", + "8bf183347ec1ca4bceff3374", + "19fa2641519e21293094e9d767ee1237f9e0715dc57172794867c3bbe2cb647f9b28a8d3f85c0ff557b91bad66f5ea16e0107757b0277fdd3ca05bf47c19bcb92a958a57e8c142a51af29bddb20af84377b6db65f77494e0dc4d2634a776b3a5d777319873bc0dacbbd4b9ebccfae849fa7e9769cdf54660ecca0d5cf4fa5190713726d54d02b3a3f21857125b8a808c0ca2f99d11dc430ed5113ee49ff8f00bcc08f0370dd510e8100e1285659a7b2c7457a6049f2af7786c4db1471ce5bd164e11c7a2165e83e03a135ae2b3429f82f677de044a067e99e0bda2d65a7270d629c00e1d528212d3aeb2896e58ee5145a93ed06a9c00705ad5c5988d3a192304c1d17661d45257c5d16799ef70771964435b12e3b2ee9d5b467c3b1992f45b7a59871b40d8daa1c280747ecb3d170257b91df1f549ce6d66455b5b6f60b7c6e95c92a67e20cffe8599ceb183de53f1dedfe19bae836447af8e053ba419660e0912cad064d6125b9e978e8d0d5f28f8a4e43ca3cdf2d4c0e9a11221d8184e9eb6c90761b0beac82d0d22793279aedb1c7db3632adbee323bc3bbde4801152694831abf5676979af26af7dcbadfba1cad1306b635840cbca76c558b37db0803b4c12befa27d16f21506b07ade4a838d6beba1816eb29ed5e3c4f132a752fc747bd9ba879156e87e6c1584e911da9f796e1fa4a055e427272559e4bd6d0f54b8257100f8a55d84c27b702bb1fe2f995425c85fd48b0a0610db5b39f7a5031407a12dae9f508b21b1378f14952d1beb2dea81d016b2d9b7f1a67b814569b69c0e619adea02a8683242d63a11d3317d060e5b4d85df5ad73127541ba5314715d187990735aa81f438f8b94070ec506ba536274d98b766c1694e54367891a602b99e370425b47a70b819277a249fa429c5bbd0530267f987e6022f25030c30f3baeedc0d13c95f3d5e4b2b87465d179a3a23b9f9e76a42ceea55226ce072f9488392f40621289124d786109d2498e74fb37e2ef466fe8bf3016d96e34204c32978775765aa80461cac48518157f86d59f6187bad4ee62fba1ddbe166b29452f4a59af1e057300c353440644a8e40ae8171ea028be2fa315804abf518847c7945e8228b7766cfdb08d3a3116b59aab8e94b6d8c8c9ef442c2dc7f923bc2cd3e5c663baca7dded976bf191fe36da16948c89c385fe71434f4aa5dd15fe0e925d2459e3b068b9d82a9cc8b8f9786bd9f5fef9baaaf2d67027d9bfd58bb2c58ec7c746b747ab62f9242e4b53ed14d6fc75f5280eca0de23717c97a2293826e19cc8eb47f946421516c349dc4ba49225b91e4e868874bdebd373700df1f3792aaa140597e58b88f90e163397dbad3941705b53d754e3e0c9003df836a7fb8d23f40362fcb5f3947a4281b24240be4ee89aa8e917b194f94345eeca224df0adc15f22a617b6427f29410bc48ea3f92216163785723efc36301d23ed52780c6fd7924bcfaa03269b13582b7c7ea9c0e4a451f38a469fbdb585dcb7c81452da77945ebe27eb26ff6e8c7b2decea289aac5af74746dc257c9bea44a0847f02c4f586e1d76f39d5bf952355a0875f177a666d1d354ad86ce5ec0aba2c2b20cab050eaffd31095395132f5af80a2d2d53b77bda49f948bbb37bdf31c8a690476488e14e542ff6841e7fbfc2eb84795696562d079dc1612274b6dff362567084f793f0bc2dd8de23392d05aeeeeac6991c9f74387153a4b7da94790375e336a00c8293bad0fcef2dd1880e7094e2e53f738247c860780ebe308410ca02ae409ae720e841f48c9677acc6e7d4ccd18c219c400f8b7e1257f692e09eaef96802b17a1cb7d93eb81d3bfcbc7af4cdf05b98e22556b3d1a8b56d6d83bb5f5724696f8f329839dbe477483ec3c09fa2e0628faeba1bf285c224bea3f6cdc7bbd768133c6ef1da14f248cc3b819b196588811b073a7291817bd1e89c65760435d8d17cbf9423744a92143e0f956e2977b39c54fdead5a57f3a04a0facca01bbf44d3b1fb9c4fa83ae1046985e3f26aa0a437999004dd8adc04c5111759849f919b93558dbc559173a23b069b59f800096d9fcf077c7640f59170bb9a6fffe64778bac272365d27ea62aa956559e90edd3f6393cc8775597bcf7d91990ab9511973d948324a27261059e93f4b5dd2f70caf12e1a08e0493cb05588618764391f355379578cf94dd33e616136eea997ec11c0d4ff064ff51a767e5558433a2e3a9a74c232d8e187f47b8cca010709eb9fea0dac8f1ea53bf18822e154ecd929c83b0eac366e30fffbd5ba6a46d734f58d26e7f5df538e18b3d827884aa857a680823131bcf30a76f1a555bcabb17b02b53aefad96fe76f7312da69719434c580d3ff1bcdcd594e6375935003d5d732cc577e11ea2abb1d04259f50aed4c3af9866e8c4a52a09809046ee330f05c4403acbc297a9416c5208fadb31ed4eb7a3b01b87bf08c75cf44c2b0df84df30872d021d6567ea649859268e5e1b5b6405e1b41e350a32c1af13722959c17c01b52c42241313b26b25995a1c89a53e248488724d280647226195746901929501df36d1e94815d7fe6c4ca2731f3181293217f71b9d7f59c2474856972013924ae4796db4cbd22d8905a6043c959941ca6b556c53d1688c439036c715d33a47a7dfc2fe40e53424c5093020d2e85e4b04aa4c704ea5bfe5a2384878da38319c59d41d66b6add2a443d9ea11edd8d18fa41004251653857733b388b453943eb33df93dcd5d549757fa2967ef0f9a5105836c48826c47fcccb2d9bc349032b286962136b848632bdcf186a08cbeaa52d195efcfc3a440bac154971d11ff4994f293b14fb8c3214ebe7ab8b3d0f2fe0b03ed7b145fafd7730a173e3cc1847f0cdf2cf629f5ea81a07bef716b1a67dd9e3b7a52fea1aaa7a393f53b5bdb5988df78a57a9dad19a8253316835acab8a6b9a9fb42d97bf29b2443322f46de386fd82bd3453ed68e2370c6eac4497b1bde7b42d569c452f377bd38bd50fa5a6792ef5c9ec6c647001149b86fedb3e2f18d4271e9cc4801aa16ecddb31b6a795fecabc613bfbc8e4f5636d71e74595c841fd11b6a6bc7f169317c1added56b82a71fc36d774bb4d661685363e9da5fd2e1f357006dc5b5bbf8b42ee3f869e75a541586fba558a8f490d641b78c27368b9b4c2db046354e9358ae9140e91cd95ebeffc6c0d2676a3ff4ab10d463bf32bed97023a80a79df191ab9858c43537a03072a17c30b1bd99efbd361590ed6b7d5b0ec4e2326fa35904ab9a48596f44491cbbc0112890f9386ed04dec30126be359a05e99b2b77fa2c8f6b7460a6cd590d71c73b2a1b23312ff89306b6e41c76ddc0a099bfa79498e36ae5cf0c560b8854dff32d2b690ce0ac4aabfa723ac6f2e97ad1083235196b464ad67fdd649aec01695d55c8b4bb198f30630ca635aa5a1915f3718341bcfd8b522f764015fa5479004d28eceea7fe67df7ee24a97a9708d528b89589f1899f13242a0d00f7464c3cdfce213699340e754533b934f4a8410224e111f31cf8e54d7b5e90cd8c68bf96edbc8d183894deefdf4fcc1a83162a3f6341dcd9a9aecf171c0df28257a68b1af1b67c54c43c3cff27fed89cc64bc46e23a49ec74a9efbab7981d9f0a018247441e4f0f5b5f68ba9325582f92de4cca4a5f878a0c5c387581e64324e3246d8f3205c838a29f1abeea24446e496421f0e742d411adb55f70272ae4a992e825a3d327e44b8b3762b25aa451d07eb4eac0322b431fa676462632daba2aba7bdeee1b438f051d21d4b1897e2ac2f95ee7c23f9996a805de8fffb3b30b855cd6c5b84c011accf4bf94d304d944079f04b5cadf8fcd6751c22a0f9165ab98998b2d89e6514641f1f3b91b8c0bf057d69c3d893fc4e041e06a2229e2ee58082ffb58cb920972ede58483287d0ace94c1becef26a410b93e4ff402e61dcc574b790d49679f18f4e2004f8b7cc357faba34a80e56821bb5b883d1a8b49c6605002152f270bbc36bc79095644e29ab08cc988deda765d67e4fff12b726d5de135ff9d0cbd9d5f9d440e548836633b93a38330d638468b59a32642da3375cdf70b062d14b46a78569c24a706e179baa2058dcae5c61fb6cadd9e015b017f26e9dbe3e6366cf5f1ec839aa3bbb21dd6c9b8e910245fa95b09b7d6cbf08a4c6c84bef257a70389be962dad14d97a893c128b73bf6580689e540d004f21edf8403f36b1ad7c9a2e83ffceb141af59700c316c8c1e3347187f24819c2ff0c9f9a2360dce354f3374374eab1643d2d8831310a8e3ca6768200ea7759822b82f7027cd450479fcc7f6d04802b15735a137ad489f1e1ee78434a253a9dd16684ad58fc91960cde6754f82e8b38edd5e798fdbbbf8fc2e2380a4e21dd94f8c1c063b18f29d8cd8d89f65deac5640799d4ca2caa29c1e72ad8bc417490d11e4051d94956fbc74289857e5f8e9e87b9a2d83074a994de0b10bc7782f6650cfbdb8c835c81cd88bdce5f04ca939b3c5cd010d4dc5d51224fcacbca9851694b8bf55b22dead859d023eee5a7ad3436a912c3fc0284456d5d72ea5f1afa8545c856676ac2dd9a057028bd3ca0f50e7070fa74152f13997c95c1834c3e67504f1a4165d2b49a96919b88f72caed60f56ca7ab5a3204fb12ad3592c725fdebb048732fc189c7dfed185c6c184a626e07d7356860d00389862d5b9701eaa4e5f7889e6db0f54633369b8d26805c08471de8fc3f8fa1fb0b0711d9e015add5373f7f8b64abaddbac3399c756244b1b07c579d33e4967e5e0cf16de29cb8a7efad07ff9039ca305772a6e45c76bd9b77e24949556766a8b8425c5e595efb431bde4ee222f9eb3fc2d002a1e2d14db2b23135266c942eea33bffd30eb0218405373240e0cd3040436ca895093bf056fd001c00ba59d90502042e6e6c0167105051628895c8164c9ab959400898309cabafdef12be53604fa57df44e0a90a81bd63c331291a93bffefe809e80db0679568f6e94e0d8e2edec0087c35bcb3c4f4725e6013bcf197156cd9d90612423348123383e45c14d27d8833f56ddb04083c069fd6e282fe69c940840f5f747dfb72ad72fd8cf9f3ded15c9e2f4727fd60b4f40e95dbe77a89b47dde7d5326942600554905d9dade9d145ab6da802643f2081678392609c2fdd1b79dd8caec137cbed315374c6f05c0758070f3bb17e23d81ccc39c6aa89913897e487fde889c5aacd422278f8571641cc4f0a93d9768aef9e45d6bd187d1ba637ce0fbd3c573d6778cf7bf5188c00dcdf13be3fd599143952b376220283e34e014e83b214bd5f64eb0ecb098ae8bef883949907cc36e22ece60b893b963cfa73d120513e285aaf70ce5add34edbdac60b3aa7b385b90e339058fb9b3cf984b06f79788016035c5ce490f2de7995b98a8c1c9c80f29603ae2b7fc41886663163e604275cb085f8453b27f4d795b9bad19ade2f98a1c99b43a7581bd991e5d0e5e1a6e713acc522ba9fe8302658a9782558e35436e714ac6bc85ad1d3cd008f24106901fa954f5fefb61210d6f8dc9ff35c480f1d14e59c0e501917a31ee9d00c6bdb06a00af5a8b08c3928cc5f37476248223627cb77eaf0e96213cb0a13e97d3fe9b9814d462690e8d68d02655a32fc271ee73db4f88a33386ea88a5857e15a28d9b3e3a96f00c7cd85aa53f9282ab8c8ca6d6a8afed43aa87fe7fc1ad59b0f0db2dd25c20af96e8c282c19fc883ef01a4060398926a1c82f07bcd3bc314580d7636b623b7bad8ddba05850291a6344df0f346fa4a321a85ee3e9c", + }, + { + "67c6697351ff4aec29cdbaabf2fbe3467cc254f81be8e78d765a2e63339fc99a66320db73158a35a255d051758e95ed4abb2cdc69bb454110e827441213ddc8770e93ea141e1fc673e017e97eadc6b968f385c2aecb03bfb32af3c54ec18db5c021afe43fbfaaa3afb29d1e6053c7c9475d8be6189f95cbba8990f95b1ebf1b305eff700e9a13ae5ca0bcbd0484764bd1f231ea81c7b64c514735ac55e4b79633b706424119e09dcaad4acf21b10af3b33cde3504847155cbb6f2219ba9b7df50be11a1c7f23f829f8a41b13b5ca4ee8983238e0794d3d34bc5f4e77facb6c05ac86212baa1a55a2be70b5733b045cd33694b3afe2f0e49e4f321549fd824ea90870d4b28a2954489a0abcd50e18a844ac5bf38e4cd72d9b", + "0942e506c433afcda3847f2dad", + "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e", + "129039b5572e8a7a8131f76a", + "588e1356fb8fa32410dad99cf7922aae47b4042502c92f3afe33dc22c1c2e90caf22bc37a254f8dd62a09582c70194f9616982639415178e9fe95740c0f1d497a69b69d4924a7a15290187f9c8acf09cf5b3b3188ecde2d2807207f5bb6a6d3504314b1b47684cf8ba8807eb9a3c497c79ebe1e4c1eca2aa90328563e201425227fca8ee05dcc05fd6c98128626c1e71d2fb3a21860567093db1012dfabe13055c48219d2a301c8a5a49033a811d8d9413bafbb2eefc177226fe578e93c2ef1f309416dc98843bfac387debb1b610b1d2366178ce7212a7312057a3d058357a629f18c78e129e60979a2310455a76207be5611e8b4b840629564020c17f5c9446882e23f610e931246ec434e62de765bf22954cfae02b2ff4b4086fbbd1b6cec23e45481eac5a25d", + }, + { + "67c6697351ff4aec29cdbaabf2fbe3467cc254f81be8e78d765a2e63339fc99a66320db73158a35a255d051758e95ed4abb2cdc69bb454110e827441213ddc8770e93ea141e1fc673e017e97eadc6b968f385c2aecb03bfb32af3c54ec18db5c021afe43fbfaaa3afb29d1e6053c7c9475d8be6189f95cbba8990f95b1ebf1b305eff700e9a13ae5ca0bcbd0484764bd1f231ea81c7b64c514735ac55e4b79633b706424119e09dcaad4acf21b10af3b33cde3504847155cbb6f2219ba9b7df50be11a1c7f23f829f8a41b13b5ca4ee8983238e0794d3d34bc5f4e77facb6c05ac86212baa1a55a2be70b5733b045cd33694b3afe2f0e49e4f321549fd824ea90870d4b28a2954489a0abcd50e18a844ac5bf38e4cd72d9b0942e506c433afcda3847f2dadd47647de321cec4ac430f62023856cfbb20704f4ec0bb920ba86c33e05f1ecd96733b79950a3e314", + "d3d934f75ea0f210a8f6059401", + "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e", + "129039b5572e8a7a8131f76a", + "588e1356fb8fa32410dad99cf7922aae47b4042502c92f3afe33dc22c1c2e90caf22bc37a254f8dd62a09582c70194f9616982639415178e9fe95740c0f1d497a69b69d4924a7a15290187f9c8acf09cf5b3b3188ecde2d2807207f5bb6a6d3504314b1b47684cf8ba8807eb9a3c497c79ebe1e4c1eca2aa90328563e201425227fca8ee05dcc05fd6c98128626c1e71d2fb3a21860567093db1012dfabe13055c48219d2a301c8a5a49033a811d8d9413bafbb2eefc177226fe578e93c2ef1f309416dc98843bfac387debb1b610b1d2366178ce7212a7312057a3d058357a629f18c78e129e60979a2310455a76207be5611e8b4b840629564020c17f5c9446882e23f610e931246ec434e62de765bf22954cfae02b2ff7c59dfe246e4bb2d6a8afcebdc2beeaabf2a3f43f95a5ea639853f38719875ecdd2bbc0d81bb2a5ed59553b1e76b6365b74f618f685eb7731024bbf6794c3f4c7c5a1cf925", + }, + { + "67c6697351ff4aec29cdbaabf2fbe3467cc254f81be8e78d765a2e63339fc99a66320db73158a35a255d051758e95ed4abb2cdc69bb454110e827441213ddc8770e93ea141e1fc673e017e97eadc6b968f385c2aecb03bfb32af3c54ec18db5c021afe43fbfaaa3afb29d1e6053c7c9475d8be6189f95cbba8990f95b1ebf1b305eff700e9a13ae5ca0bcbd0484764bd1f231ea81c7b64c514735ac55e4b79633b706424119e09dcaad4acf21b10af3b33cde3504847155cbb6f2219ba9b7df50be11a1c7f23f829f8a41b13b5ca4ee8983238e0794d3d34bc5f4e77facb6c05ac86212baa1a55a2be70b5733b045cd33694b3afe2f0e49e4f321549fd824ea90870d4b28a2954489a0abcd50e18a844ac5bf38e4cd72d9b0942e506c433afcda3847f2dadd47647de321cec4ac430f62023856cfbb20704f4ec0bb920ba86c33e05f1ecd96733b79950a3e314", + "d3d934f75ea0f210a8f6059401beb4bc4478fa4969e623d01ada696a7e4c7e5125b34884533a94fb319990325744ee9bbce9e525cf08f5e9e25e5360aad2b2d085fa54d835e8d466826498d9a8877565705a8a3f62802944de7ca5894e5759d351adac869580ec17e485f18c0c66f17cc07cbb", + "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e", + "129039b5572e8a7a8131f76a", + "588e1356fb8fa32410dad99cf7922aae47b4042502c92f3afe33dc22c1c2e90caf22bc37a254f8dd62a09582c70194f9616982639415178e9fe95740c0f1d497a69b69d4924a7a15290187f9c8acf09cf5b3b3188ecde2d2807207f5bb6a6d3504314b1b47684cf8ba8807eb9a3c497c79ebe1e4c1eca2aa90328563e201425227fca8ee05dcc05fd6c98128626c1e71d2fb3a21860567093db1012dfabe13055c48219d2a301c8a5a49033a811d8d9413bafbb2eefc177226fe578e93c2ef1f309416dc98843bfac387debb1b610b1d2366178ce7212a7312057a3d058357a629f18c78e129e60979a2310455a76207be5611e8b4b840629564020c17f5c9446882e23f610e931246ec434e62de765bf22954cfae02b2ff7c59dfe246e4bb2d6a8afcebdc2beeaabf2a3f43f95a5ea639853f38719875ecdd2bbc0d81bb2a5ed59553b1e76b6365b74f618f68a12d0f1cc99e132db9014100d9668c91", + }, + { + "67c6697351ff4aec29cdbaabf2fbe3467cc254f81be8e78d765a2e63339fc99a66320db73158a35a255d051758e95ed4abb2cdc69bb454110e827441213ddc8770e93ea141e1fc673e017e97eadc6b968f385c2aecb03bfb32af3c54ec18db5c021afe43fbfaaa3afb29d1e6053c7c9475d8be6189f95cbba8990f95b1ebf1b305eff700e9a13ae5ca0bcbd0484764bd1f231ea81c7b64c514735ac55e4b79633b706424119e09dcaad4acf21b10af3b33cde3504847155cbb6f2219ba9b7df50be11a1c7f23f829f8a41b13b5ca4ee8983238e0794d3d34bc5f4e77facb6c05ac86212baa1a55a2be70b5733b045cd33694b3afe2f0e49e4f321549fd824ea90870d4b28a2954489a0abcd50e18a844ac5bf38e4cd72d9b0942e506c433afcda3847f2dadd47647de321cec4ac430f62023856cfbb20704f4ec0bb920ba86c33e05f1ecd96733b79950a3e314d3d934f75ea0f210a8f6059401beb4bc4478fa4969e623d01ada696a7e4c7e5125b34884533a94fb319990325744ee9b", + "bc", + "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e", + "129039b5572e8a7a8131f76a", + "588e1356fb8fa32410dad99cf7922aae47b4042502c92f3afe33dc22c1c2e90caf22bc37a254f8dd62a09582c70194f9616982639415178e9fe95740c0f1d497a69b69d4924a7a15290187f9c8acf09cf5b3b3188ecde2d2807207f5bb6a6d3504314b1b47684cf8ba8807eb9a3c497c79ebe1e4c1eca2aa90328563e201425227fca8ee05dcc05fd6c98128626c1e71d2fb3a21860567093db1012dfabe13055c48219d2a301c8a5a49033a811d8d9413bafbb2eefc177226fe578e93c2ef1f309416dc98843bfac387debb1b610b1d2366178ce7212a7312057a3d058357a629f18c78e129e60979a2310455a76207be5611e8b4b840629564020c17f5c9446882e23f610e931246ec434e62de765bf22954cfae02b2ff7c59dfe246e4bb2d6a8afcebdc2beeaabf2a3f43f95a5ea639853f38719875ecdd2bbc0d81bb2a5ed59553b1e76b6365b74f618f68d1f05b5662cd6e04de896d3ef5dae4149485a5a2093ff4ec74b20b5e5bf8e61b5c65515938c202beab3eea5a498d2f32d4d00a24b826b6efb16013ef54cbe170", + }, + { + "67c6697351ff4aec29cdbaabf2fbe3467cc254f81be8e78d765a2e63339fc99a66320db73158a35a255d051758e95ed4abb2cdc69bb454110e827441213ddc8770e93ea141e1fc673e017e97eadc6b968f385c2aecb03bfb32af3c54ec18db5c021afe43fbfaaa3afb29d1e6053c7c9475d8be6189f95cbba8990f95b1ebf1b305eff700e9a13ae5ca0bcbd0484764bd1f231ea81c7b64c514735ac55e4b79633b706424119e09dcaad4acf21b10af3b33cde3504847155cbb6f2219ba9b7df50be11a1c7f23f829f8a41b13b5ca4ee8983238e0794d3d34bc5f4e77facb6c05ac86212baa1a55a2be70b5733b045cd33694b3afe2f0e49e4f321549fd824ea90870d4b28a2954489a0abcd50e18a844ac5bf38e4cd72d9b0942e506c433afcda3847f2dadd47647de321cec4ac430f62023856cfbb20704f4ec0bb920ba86c33e05f1ecd96733b79950a3e314d3d934f75ea0f210a8f6059401beb4bc4478fa4969e623d01ada696a7e4c7e5125b34884533a94fb319990325744ee9bbce9e525cf08f5e9e25e5360aad2b2d085fa54d835e8d466826498d9a8877565705a8a3f62802944de7ca5894e5759d351adac869580ec17e485f18c0c66f17cc0", + "7cbb22fce466da610b63af62bc83b4692f3affaf271693ac071fb86d11342d", + "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e", + "129039b5572e8a7a8131f76a", + "588e1356fb8fa32410dad99cf7922aae47b4042502c92f3afe33dc22c1c2e90caf22bc37a254f8dd62a09582c70194f9616982639415178e9fe95740c0f1d497a69b69d4924a7a15290187f9c8acf09cf5b3b3188ecde2d2807207f5bb6a6d3504314b1b47684cf8ba8807eb9a3c497c79ebe1e4c1eca2aa90328563e201425227fca8ee05dcc05fd6c98128626c1e71d2fb3a21860567093db1012dfabe13055c48219d2a301c8a5a49033a811d8d9413bafbb2eefc177226fe578e93c2ef1f309416dc98843bfac387debb1b610b1d2366178ce7212a7312057a3d058357a629f18c78e129e60979a2310455a76207be5611e8b4b840629564020c17f5c9446882e23f610e931246ec434e62de765bf22954cfae02b2ff7c59dfe246e4bb2d6a8afcebdc2beeaabf2a3f43f95a5ea639853f38719875ecdd2bbc0d81bb2a5ed59553b1e76b6365b74f618f68d1f05b5662cd6e04de896d3ef5dae4149485a5a2093ff4ec74b20b5e5bf8e61b5c65515938c202beab3eea5a498d2f32c38dbb37d04f8272e741da2802c54a9d9aaf8ecf38b36fc9ad0079523f6a4abd5281a22697a3180bc02662a7c13ee23599d18e5c48300dbb831509df4c172f53e524b3c15124a87ac73e5028cde6c94d8d", + }, + { + "67c6697351ff4aec29cdbaabf2fbe3467cc254f81be8e78d765a2e63339fc99a66320db73158a35a255d051758e95ed4abb2cdc69bb454110e827441213ddc8770e93ea141e1fc673e017e97eadc6b968f385c2aecb03bfb32af3c54ec18db5c021afe43fbfaaa3afb29d1e6053c7c9475d8be6189f95cbba8990f95b1ebf1b305eff700e9a13ae5ca0bcbd0484764bd1f231ea81c7b64c514735ac55e4b79633b706424119e09dcaad4acf21b10af3b33cde3504847155cbb6f2219ba9b7df50be11a1c7f23f829f8a41b13b5ca4ee8983238e0794d3d34bc5f4e77facb6c05ac86212baa1a55a2be70b5733b045cd33694b3afe2f0e49e4f321549fd824ea90870d4b28a2954489a0abcd50e18a844ac5bf38e4cd72d9b0942e506c433afcda3847f2dadd47647de321cec4ac430f62023856cfbb20704f4ec0bb920ba86c33e05f1ecd96733b79950a3e314d3d934f75ea0f210a8f6059401beb4bc4478fa4969e623d01ada696a7e4c7e5125b34884533a94fb319990325744ee9bbce9e525", + "", + "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e", + "129039b5572e8a7a8131f76a", + "588e1356fb8fa32410dad99cf7922aae47b4042502c92f3afe33dc22c1c2e90caf22bc37a254f8dd62a09582c70194f9616982639415178e9fe95740c0f1d497a69b69d4924a7a15290187f9c8acf09cf5b3b3188ecde2d2807207f5bb6a6d3504314b1b47684cf8ba8807eb9a3c497c79ebe1e4c1eca2aa90328563e201425227fca8ee05dcc05fd6c98128626c1e71d2fb3a21860567093db1012dfabe13055c48219d2a301c8a5a49033a811d8d9413bafbb2eefc177226fe578e93c2ef1f309416dc98843bfac387debb1b610b1d2366178ce7212a7312057a3d058357a629f18c78e129e60979a2310455a76207be5611e8b4b840629564020c17f5c9446882e23f610e931246ec434e62de765bf22954cfae02b2ff7c59dfe246e4bb2d6a8afcebdc2beeaabf2a3f43f95a5ea639853f38719875ecdd2bbc0d81bb2a5ed59553b1e76b6365b74f618f68d1f05b5662cd6e04de896d3ef5dae4149485a5a2093ff4ec74b20b5e5bf8e61b5c65515938c202beab3eea5a498d2f32c38dbb370a9bbc3187cc260ddac991f94ce4f0d5", + }, + { + "0fb826ddb2eb5e708de203d0438be12cf708d635ebdbae56278be09077009586b9bc646ba7c2db35a5de05e86ae71461efea96dac64430edcf117d461113cccacf303576f310ab98efb180599894ba877e50614494923163a3afa9b4c2757f91a6b40799c5b331b464b10dfc45c783c317e408ab76390e19e8b7ceaa2c4d3bd201436bc6f69c7a5a4d8756924ed95665bd5e1034971e4d80d51b2a", + "026866d46aa940309fdcabf92a324fbc", + "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e", + "129039b5572e8a7a8131f76a", + "30f05cf8189bb7b8b4f560e746e228c4cc7e86e8f2fa66e1afe212d1855db51070acd5eb34ce80b2e223957df50fde4c2531d97fc9e573725e7a5e47f0dfc4da1942620320bb2deaf8b17937bae4218d04db8e76f6efe84a117292159507c9f8a09fb2c17921d7762510dbf1dac7b62b1bd7572e3e2cf008d01c445c7fa78833235034281ae180e051451c6a64f22ca9708634bd0d604e4cfcd971b13742efa5b6363e662a875daccb2b00", + }, + { + "c7d4f8790e4c47d4daecbddf5939973521ddbf3b832e564afc66f03b5583c41c58bd956609dc3ae3c8f7c2213059575236168dba44e3044049f47c9e7840bbd0fd5036062d70e9f567ac1797056ee93c8476f6c959fa09a3ee854166c6fc36c34d6cca7adcb36f435f86db65f4c4a1793b974294914b377fd179e697751c5ac289243c65d8aca93732849c27483da083d4e218652d4fe5fec8cb953ee7f00070143dd6ece97f241b03c0424bfee2cfd2c4e738f2361df0ffe8863dcf763d408a7a167763959b7f985bc1e359a4b22c6899645ad0814bcf69d10c38474978d1c48e482723e3a6bb3f689f980c51c474eb28cfbba91a8a12eb964b32dfc303a3524ccb752f71316ed9d007e521cb5a0cf429c79d4351b02ee7fb60c7be636a10af3586dfa7b74d80875466a820c0b514e97cb12cce615ab55cba7c1b1de72bcd1cb1acc368f944ef4eaa986e6a4d8253c9337f9795d94df193c90cb0b0387dcde929905223d441717ed9dfe826613bf094ba872993d41b269e27d74e5f541b497eac9ba180dc12ffb6f1e7dc5223cce6dd541071282b97c6526e15b2c330fb41dc96e25d72f45c28e543053766d11d44252db54e584c14abbb295d7e5a58bf36eea1936095ef897a338eb1995fcedd85fc92d354dfe7ff9a115c186bb4d7a1a27835030d248c87571a38f17906cefe0261d15740b9", + "56", + "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e", + "129039b5572e8a7a8131f76a", + "f89c825ca43cae1ce3fbdee85c505edd1aabefe69a0f9efd740f027aa7dee48a91ad24e69ad061648f0a52b4afb19d7ffccdc21f4b4247dfd89f5f9f998cb3c02b226173fedb6f8770aceef9271e7236fefd19fb3b87d08a5c587ac7918e80aa4b477f22602189811e270d686bc4949137a41d11d95ec96ee9d26c6126f6e923ab37638b34d1538d2e46d6df6216da4f193a3cecb731e632e109ced643056a1673059355d2d1314df35ded8364efed7de490201090a6f2d1751748585f64d26041637ba3723cbc4b60e226f10a19699d223075bc1f27d82e7f560c0db630ea670b3f8a70a8950894af4d1c7b3f674a3fa00d19ee4cc2b6174c1d259a297424bf2c3943a29a16a9830ce11abaa79cd2eb77b53a02b365b1838e7bfd5ae1bd044ffc885c61c6b2186a357e8b8f732b7ab96517969aeb70c7b493bbaca9462a61815a3c6135c748bf9c8487ac0631807aa69243fa09cd3b8efb63f8d4e090ad30b6c2f08bf4e82f191cedfa5cbe2b42268d67ecd105918181e44fc9879efd642d20be84e6f74717e03fb94fcbaa6ed3b307431d2a9384b8a2b3e5825ffce8d99af48f177e43bb4272226d8a5edd37d53807f768feb9e0733b437a1d0f84779ab68a1804e92a5eecca56364f0fa6dca152203b249fdc8fbd950fdc37c1887596308a90ba3a5751c7096bfbd1cb177bb17847b33c4379b43938a67674459cd9a06e3017ccac5b", + }, + { + "135a28170fe89066da7bcff3a9ccc1b27dfe942a6f47b23835ef746aaea63dc10066d90f4e697528e5451b8e11dd408fdbd4b94a1c6c82515bf7bc099df9cb9d5fa4acad0d22d5f267f18078cec107a995c1f3b12d7603886dbf910ab85ca7180053c50e759b00dc8c81555a425c03d71df6894a6c8cd2d94b64e303c08a1bc1dee1cf537ccf300850856292e1656aff5bf349c87f1ca1ca8085cd400fe901edcad04146a0714ef0f6b083d715edd670e020385f3cda29bc5ff6fc6edffe5ca9ce9def6e0e3d5f04ede2db02cfb2", + "73afd2ab0e0e8537cae42dc6530dc4afb6934ca6", + "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e", + "129039b5572e8a7a8131f76a", + "2c125232a59879aee36cacc4aca5085a4688c4f776667a8fbd86862b5cfb1d57c976688fdd652eafa2b88b1b8e358aa2110ff6ef13cdc1ceca9c9f087c35c38d89d6fbd8de89538070f17916ecb19ca3ef4a1c834f0bdaa1df62aaabef2e117106787056c909e61ecd208357dd5c363f11c5d6cf24992cc873cf69f59360a820fcf290bd90b2cab24c47286acb4e1033962b6d41e562a206a94796a8ab1c6b8bade804ff9bdf5ba6062d2c1f8fe0f4dfc05720bd9a612b92c26789f9f6a7ce43f5e8e3aee99a9cd7d6c11eaa611983c36935b0dda57d898a60a0ab7c4b54", + }, +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/chacha20poly1305/internal/chacha20/chacha_generic.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/chacha20poly1305/internal/chacha20/chacha_generic.go new file mode 100644 index 00000000..b017a731 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/chacha20poly1305/internal/chacha20/chacha_generic.go @@ -0,0 +1,199 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package chacha20 implements the core ChaCha20 function as specified in https://tools.ietf.org/html/rfc7539#section-2.3. +package chacha20 + +import "encoding/binary" + +const rounds = 20 + +// core applies the ChaCha20 core function to 16-byte input in, 32-byte key k, +// and 16-byte constant c, and puts the result into 64-byte array out. +func core(out *[64]byte, in *[16]byte, k *[32]byte) { + j0 := uint32(0x61707865) + j1 := uint32(0x3320646e) + j2 := uint32(0x79622d32) + j3 := uint32(0x6b206574) + j4 := binary.LittleEndian.Uint32(k[0:4]) + j5 := binary.LittleEndian.Uint32(k[4:8]) + j6 := binary.LittleEndian.Uint32(k[8:12]) + j7 := binary.LittleEndian.Uint32(k[12:16]) + j8 := binary.LittleEndian.Uint32(k[16:20]) + j9 := binary.LittleEndian.Uint32(k[20:24]) + j10 := binary.LittleEndian.Uint32(k[24:28]) + j11 := binary.LittleEndian.Uint32(k[28:32]) + j12 := binary.LittleEndian.Uint32(in[0:4]) + j13 := binary.LittleEndian.Uint32(in[4:8]) + j14 := binary.LittleEndian.Uint32(in[8:12]) + j15 := binary.LittleEndian.Uint32(in[12:16]) + + x0, x1, x2, x3, x4, x5, x6, x7 := j0, j1, j2, j3, j4, j5, j6, j7 + x8, x9, x10, x11, x12, x13, x14, x15 := j8, j9, j10, j11, j12, j13, j14, j15 + + for i := 0; i < rounds; i += 2 { + x0 += x4 + x12 ^= x0 + x12 = (x12 << 16) | (x12 >> (16)) + x8 += x12 + x4 ^= x8 + x4 = (x4 << 12) | (x4 >> (20)) + x0 += x4 + x12 ^= x0 + x12 = (x12 << 8) | (x12 >> (24)) + x8 += x12 + x4 ^= x8 + x4 = (x4 << 7) | (x4 >> (25)) + x1 += x5 + x13 ^= x1 + x13 = (x13 << 16) | (x13 >> 16) + x9 += x13 + x5 ^= x9 + x5 = (x5 << 12) | (x5 >> 20) + x1 += x5 + x13 ^= x1 + x13 = (x13 << 8) | (x13 >> 24) + x9 += x13 + x5 ^= x9 + x5 = (x5 << 7) | (x5 >> 25) + x2 += x6 + x14 ^= x2 + x14 = (x14 << 16) | (x14 >> 16) + x10 += x14 + x6 ^= x10 + x6 = (x6 << 12) | (x6 >> 20) + x2 += x6 + x14 ^= x2 + x14 = (x14 << 8) | (x14 >> 24) + x10 += x14 + x6 ^= x10 + x6 = (x6 << 7) | (x6 >> 25) + x3 += x7 + x15 ^= x3 + x15 = (x15 << 16) | (x15 >> 16) + x11 += x15 + x7 ^= x11 + x7 = (x7 << 12) | (x7 >> 20) + x3 += x7 + x15 ^= x3 + x15 = (x15 << 8) | (x15 >> 24) + x11 += x15 + x7 ^= x11 + x7 = (x7 << 7) | (x7 >> 25) + x0 += x5 + x15 ^= x0 + x15 = (x15 << 16) | (x15 >> 16) + x10 += x15 + x5 ^= x10 + x5 = (x5 << 12) | (x5 >> 20) + x0 += x5 + x15 ^= x0 + x15 = (x15 << 8) | (x15 >> 24) + x10 += x15 + x5 ^= x10 + x5 = (x5 << 7) | (x5 >> 25) + x1 += x6 + x12 ^= x1 + x12 = (x12 << 16) | (x12 >> 16) + x11 += x12 + x6 ^= x11 + x6 = (x6 << 12) | (x6 >> 20) + x1 += x6 + x12 ^= x1 + x12 = (x12 << 8) | (x12 >> 24) + x11 += x12 + x6 ^= x11 + x6 = (x6 << 7) | (x6 >> 25) + x2 += x7 + x13 ^= x2 + x13 = (x13 << 16) | (x13 >> 16) + x8 += x13 + x7 ^= x8 + x7 = (x7 << 12) | (x7 >> 20) + x2 += x7 + x13 ^= x2 + x13 = (x13 << 8) | (x13 >> 24) + x8 += x13 + x7 ^= x8 + x7 = (x7 << 7) | (x7 >> 25) + x3 += x4 + x14 ^= x3 + x14 = (x14 << 16) | (x14 >> 16) + x9 += x14 + x4 ^= x9 + x4 = (x4 << 12) | (x4 >> 20) + x3 += x4 + x14 ^= x3 + x14 = (x14 << 8) | (x14 >> 24) + x9 += x14 + x4 ^= x9 + x4 = (x4 << 7) | (x4 >> 25) + } + + x0 += j0 + x1 += j1 + x2 += j2 + x3 += j3 + x4 += j4 + x5 += j5 + x6 += j6 + x7 += j7 + x8 += j8 + x9 += j9 + x10 += j10 + x11 += j11 + x12 += j12 + x13 += j13 + x14 += j14 + x15 += j15 + + binary.LittleEndian.PutUint32(out[0:4], x0) + binary.LittleEndian.PutUint32(out[4:8], x1) + binary.LittleEndian.PutUint32(out[8:12], x2) + binary.LittleEndian.PutUint32(out[12:16], x3) + binary.LittleEndian.PutUint32(out[16:20], x4) + binary.LittleEndian.PutUint32(out[20:24], x5) + binary.LittleEndian.PutUint32(out[24:28], x6) + binary.LittleEndian.PutUint32(out[28:32], x7) + binary.LittleEndian.PutUint32(out[32:36], x8) + binary.LittleEndian.PutUint32(out[36:40], x9) + binary.LittleEndian.PutUint32(out[40:44], x10) + binary.LittleEndian.PutUint32(out[44:48], x11) + binary.LittleEndian.PutUint32(out[48:52], x12) + binary.LittleEndian.PutUint32(out[52:56], x13) + binary.LittleEndian.PutUint32(out[56:60], x14) + binary.LittleEndian.PutUint32(out[60:64], x15) +} + +// XORKeyStream crypts bytes from in to out using the given key and counters. +// In and out may be the same slice but otherwise should not overlap. Counter +// contains the raw ChaCha20 counter bytes (i.e. block counter followed by +// nonce). +func XORKeyStream(out, in []byte, counter *[16]byte, key *[32]byte) { + var block [64]byte + var counterCopy [16]byte + copy(counterCopy[:], counter[:]) + + for len(in) >= 64 { + core(&block, &counterCopy, key) + for i, x := range block { + out[i] = in[i] ^ x + } + u := uint32(1) + for i := 0; i < 4; i++ { + u += uint32(counterCopy[i]) + counterCopy[i] = byte(u) + u >>= 8 + } + in = in[64:] + out = out[64:] + } + + if len(in) > 0 { + core(&block, &counterCopy, key) + for i, v := range in { + out[i] = v ^ block[i] + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/chacha20poly1305/internal/chacha20/chacha_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/chacha20poly1305/internal/chacha20/chacha_test.go new file mode 100644 index 00000000..b80d34cd --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/chacha20poly1305/internal/chacha20/chacha_test.go @@ -0,0 +1,33 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package chacha20 + +import ( + "encoding/hex" + "testing" +) + +func TestCore(t *testing.T) { + // This is just a smoke test that checks the example from + // https://tools.ietf.org/html/rfc7539#section-2.3.2. The + // chacha20poly1305 package contains much more extensive tests of this + // code. + var key [32]byte + for i := range key { + key[i] = byte(i) + } + + var input [16]byte + input[0] = 1 + input[7] = 9 + input[11] = 0x4a + + var out [64]byte + XORKeyStream(out[:], out[:], &input, &key) + const expected = "10f1e7e4d13b5915500fdd1fa32071c4c7d1f4c733c068030422aa9ac3d46c4ed2826446079faa0914c2d705d98b02a2b5129cd1de164eb9cbd083e8a2503c4e" + if result := hex.EncodeToString(out[:]); result != expected { + t.Errorf("wanted %x but got %x", expected, result) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/crypto.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/crypto.go new file mode 100644 index 00000000..f1f51902 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/crypto.go @@ -0,0 +1,713 @@ +/* +Package cipher implements cryptographic methods. + +These methods include: + +* Public and private key generation +* Address generation +* Signing + +Private keys are secp256k1 keys. Addresses are base58 encoded. + +All dependencies are either from the go stdlib, or are manually vendored +below this package. This manual vendoring ensures that the exact same dependencies +are used by any user of this package, regardless of their gopath. +*/ +package cipher + +import ( + "crypto/sha256" + "encoding/hex" + "errors" + "fmt" + "hash" + "log" + "time" + + "github.com/SkycoinProject/skycoin/src/cipher/ripemd160" + secp256k1 "github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go" +) + +var ( + // DebugLevel1 debug level one + DebugLevel1 = true //checks for extremely unlikely conditions (10e-40) + // DebugLevel2 debug level two + DebugLevel2 = true //enable checks for impossible conditions + + // ErrInvalidLengthPubKey Invalid public key length + ErrInvalidLengthPubKey = errors.New("Invalid public key length") + // ErrPubKeyFromNullSecKey Attempt to load null seckey, unsafe + ErrPubKeyFromNullSecKey = errors.New("Attempt to load null seckey, unsafe") + // ErrPubKeyFromBadSecKey PubKeyFromSecKey, pubkey recovery failed. Function + ErrPubKeyFromBadSecKey = errors.New("PubKeyFromSecKey, pubkey recovery failed. Function assumes seckey is valid. Check seckey") + // ErrInvalidLengthSecKey Invalid secret key length + ErrInvalidLengthSecKey = errors.New("Invalid secret key length") + // ErrECHDInvalidPubKey ECDH invalid pubkey input + ErrECHDInvalidPubKey = errors.New("ECDH invalid pubkey input") + // ErrECHDInvalidSecKey ECDH invalid seckey input + ErrECHDInvalidSecKey = errors.New("ECDH invalid seckey input") + // ErrInvalidLengthSig Invalid signature length + ErrInvalidLengthSig = errors.New("Invalid signature length") + // ErrInvalidPubKey Invalid public key + ErrInvalidPubKey = errors.New("Invalid public key") + // ErrInvalidSecKey Invalid secret key + ErrInvalidSecKey = errors.New("Invalid secret key") + // ErrNullSignHash Attempted to sign null hash digest + ErrNullSignHash = errors.New("Cannot sign null hash digest") + // ErrInvalidSig Invalid signature + ErrInvalidSig = errors.New("Invalid signature") + // ErrInvalidSigPubKeyRecovery could not recover pubkey from sig + ErrInvalidSigPubKeyRecovery = errors.New("Failed to recover pubkey from signature") + // ErrInvalidAddressForSig the address derived from the pubkey recovered from the signature does not match a provided address + ErrInvalidAddressForSig = errors.New("Address does not match recovered signing address") + // ErrInvalidHashForSig Signature invalid for hash + ErrInvalidHashForSig = errors.New("Signature not valid for hash") + // ErrPubKeyRecoverMismatch Recovered pubkey does not match pubkey + ErrPubKeyRecoverMismatch = errors.New("Recovered pubkey does not match pubkey") + // ErrInvalidSigInvalidPubKey VerifySignatureRecoverPubKey, secp256k1.VerifyPubkey failed + ErrInvalidSigInvalidPubKey = errors.New("VerifySignatureRecoverPubKey, secp256k1.VerifyPubkey failed") + // ErrInvalidSigValidity VerifySignatureRecoverPubKey, VerifySignatureValidity failed + ErrInvalidSigValidity = errors.New("VerifySignatureRecoverPubKey, VerifySignatureValidity failed") + // ErrInvalidSigForMessage Invalid signature for this message + ErrInvalidSigForMessage = errors.New("Invalid signature for this message") + // ErrInvalidSecKyVerification Seckey secp256k1 verification failed + ErrInvalidSecKyVerification = errors.New("Seckey verification failed") + // ErrNullPubKeyFromSecKey Impossible error, TestSecKey, nil pubkey recovered + ErrNullPubKeyFromSecKey = errors.New("impossible error, TestSecKey, nil pubkey recovered") + // ErrInvalidDerivedPubKeyFromSecKey impossible error, TestSecKey, Derived Pubkey verification failed + ErrInvalidDerivedPubKeyFromSecKey = errors.New("impossible error, TestSecKey, Derived Pubkey verification failed") + // ErrInvalidPubKeyFromHash Recovered pubkey does not match signed hash + ErrInvalidPubKeyFromHash = errors.New("Recovered pubkey does not match signed hash") + // ErrPubKeyFromSecKeyMismatch impossible error TestSecKey, pubkey does not match recovered pubkey + ErrPubKeyFromSecKeyMismatch = errors.New("impossible error TestSecKey, pubkey does not match recovered pubkey") + // ErrEmptySeed Seed input is empty + ErrEmptySeed = errors.New("Seed input is empty") +) + +// PubKey public key +type PubKey [33]byte + +// RandByte returns rand N bytes +func RandByte(n int) []byte { + return secp256k1.RandByte(n) +} + +// NewPubKey converts []byte to a PubKey +func NewPubKey(b []byte) (PubKey, error) { + p := PubKey{} + if len(b) != len(p) { + return PubKey{}, ErrInvalidLengthPubKey + } + copy(p[:], b[:]) + + if err := p.Verify(); err != nil { + return PubKey{}, err + } + + return p, nil +} + +// MustNewPubKey converts []byte to a PubKey, panics on error +func MustNewPubKey(b []byte) PubKey { + p, err := NewPubKey(b) + if err != nil { + log.Panic(err) + } + return p +} + +// PubKeyFromHex generates PubKey from hex string +func PubKeyFromHex(s string) (PubKey, error) { + b, err := hex.DecodeString(s) + if err != nil { + return PubKey{}, ErrInvalidPubKey + } + return NewPubKey(b) +} + +// MustPubKeyFromHex decodes a hex encoded PubKey, panics on error +func MustPubKeyFromHex(s string) PubKey { + b, err := hex.DecodeString(s) + if err != nil { + log.Panic(err) + } + return MustNewPubKey(b) +} + +// PubKeyFromSecKey recovers the public key for a secret key +func PubKeyFromSecKey(seckey SecKey) (PubKey, error) { + if seckey.Null() { + return PubKey{}, ErrPubKeyFromNullSecKey + } + + b := secp256k1.PubkeyFromSeckey(seckey[:]) + if b == nil { + return PubKey{}, ErrPubKeyFromBadSecKey + } + + return NewPubKey(b) +} + +// MustPubKeyFromSecKey recovers the public key for a secret key. Panics on error. +func MustPubKeyFromSecKey(seckey SecKey) PubKey { + pk, err := PubKeyFromSecKey(seckey) + if err != nil { + log.Panic(err) + } + return pk +} + +// PubKeyFromSig recovers the public key from a signed hash +func PubKeyFromSig(sig Sig, hash SHA256) (PubKey, error) { + rawPubKey := secp256k1.RecoverPubkey(hash[:], sig[:]) + if rawPubKey == nil { + return PubKey{}, ErrInvalidSigPubKeyRecovery + } + return NewPubKey(rawPubKey) +} + +// MustPubKeyFromSig recovers the public key from a signed hash, panics on error +func MustPubKeyFromSig(sig Sig, hash SHA256) PubKey { + pk, err := PubKeyFromSig(sig, hash) + if err != nil { + log.Panic(err) + } + return pk +} + +// Verify attempts to determine if pubkey is valid. Returns nil on success +func (pk PubKey) Verify() error { + if secp256k1.VerifyPubkey(pk[:]) != 1 { + return ErrInvalidPubKey + } + return nil +} + +// Hex returns a hex encoded PubKey string +func (pk PubKey) Hex() string { + return hex.EncodeToString(pk[:]) +} + +// Null returns true if PubKey is the null PubKey +func (pk PubKey) Null() bool { + return pk == PubKey{} +} + +// SecKey secret key +type SecKey [32]byte + +// NewSecKey converts []byte to a SecKey +func NewSecKey(b []byte) (SecKey, error) { + p := SecKey{} + if len(b) != len(p) { + return SecKey{}, ErrInvalidLengthSecKey + } + copy(p[:], b[:]) + + // Disable the DebugLevel2 check here because it is too slow. + // If desired, perform the full Verify() check after using this method + if err := p.verify(false); err != nil { + return SecKey{}, err + } + + return p, nil +} + +// MustNewSecKey converts []byte to a SecKey. Panics is []byte is not the exact size +func MustNewSecKey(b []byte) SecKey { + p, err := NewSecKey(b) + if err != nil { + log.Panic(err) + } + return p +} + +// MustSecKeyFromHex decodes a hex encoded SecKey, or panics +func MustSecKeyFromHex(s string) SecKey { + b, err := hex.DecodeString(s) + if err != nil { + log.Panic(err) + } + return MustNewSecKey(b) +} + +// SecKeyFromHex decodes a hex encoded SecKey, or panics +func SecKeyFromHex(s string) (SecKey, error) { + b, err := hex.DecodeString(s) + if err != nil { + return SecKey{}, ErrInvalidSecKey + } + return NewSecKey(b) +} + +// Verify attempts to determine if SecKey is valid. Returns nil on success. +// If DebugLevel2, will do additional sanity checking +func (sk SecKey) Verify() error { + return sk.verify(DebugLevel2) +} + +func (sk SecKey) verify(debugLevel2Check bool) error { + if secp256k1.VerifySeckey(sk[:]) != 1 { + return ErrInvalidSecKey + } + + if debugLevel2Check { + if err := CheckSecKey(sk); err != nil { + log.Panicf("DebugLevel2, WARNING CRYPTO ARMAGEDDON: %v", err) + } + } + + return nil +} + +// Hex returns a hex encoded SecKey string +func (sk SecKey) Hex() string { + return hex.EncodeToString(sk[:]) +} + +// Null returns true if SecKey is the null SecKey +func (sk SecKey) Null() bool { + return sk == SecKey{} +} + +//ECDH generates a shared secret +// A: pub1,sec1 +// B: pub2,sec2 +// person A sends their public key pub1 +// person B sends an emphameral pubkey pub2 +// person A computes cipher.ECDH(pub2, sec1) +// person B computes cipher.ECDH(pub1, sec2) +// cipher.ECDH(pub2, sec1) equals cipher.ECDH(pub1, sec2) +// This is their shared secret +func ECDH(pub PubKey, sec SecKey) ([]byte, error) { + if err := pub.Verify(); err != nil { + return nil, ErrECHDInvalidPubKey + } + + // Don't perform the DebugLevel2 verification check for the secret key, + // it is too slow to use in an ECDH context and is not important for that use case + if err := sec.verify(false); err != nil { + return nil, ErrECHDInvalidSecKey + } + + buff := secp256k1.ECDH(pub[:], sec[:]) + ret := SumSHA256(buff) // hash this so they cant screw up + return ret[:], nil +} + +// MustECDH calls ECDH and panics on error +func MustECDH(pub PubKey, sec SecKey) []byte { + r, err := ECDH(pub, sec) + if err != nil { + log.Panic(err) + } + return r +} + +// Sig signature +type Sig [64 + 1]byte //64 byte signature with 1 byte for key recovery + +// NewSig converts []byte to a Sig +func NewSig(b []byte) (Sig, error) { + s := Sig{} + if len(b) != len(s) { + return Sig{}, ErrInvalidLengthSig + } + copy(s[:], b[:]) + return s, nil +} + +// MustNewSig converts []byte to a Sig. Panics is []byte is not the exact size +func MustNewSig(b []byte) Sig { + s := Sig{} + if len(b) != len(s) { + log.Panic("Invalid signature length") + } + copy(s[:], b[:]) + return s +} + +// SigFromHex converts a hex string to a signature +func SigFromHex(s string) (Sig, error) { + b, err := hex.DecodeString(s) + if err != nil { + return Sig{}, ErrInvalidSig + } + return NewSig(b) +} + +// MustSigFromHex converts a hex string to a signature, panics on error +func MustSigFromHex(s string) Sig { + sig, err := SigFromHex(s) + if err != nil { + log.Panic(err) + } + return sig +} + +func (s Sig) String() string { + return s.Hex() +} + +// Null returns true if the Sig is a null Sig +func (s Sig) Null() bool { + return s == Sig{} +} + +// Hex converts signature to hex string +func (s Sig) Hex() string { + return hex.EncodeToString(s[:]) +} + +// SignHash sign hash +func SignHash(hash SHA256, sec SecKey) (Sig, error) { + if secp256k1.VerifySeckey(sec[:]) != 1 { + // Can't use sec.Verify() because that calls SignHash again, with DebugLevel2 set + return Sig{}, ErrInvalidSecKey + } + + // Null hashes can't be signed + if hash.Null() { + return Sig{}, ErrNullSignHash + } + + s := secp256k1.Sign(hash[:], sec[:]) + + sig, err := NewSig(s) + if err != nil { + return Sig{}, err + } + + if DebugLevel2 || DebugLevel1 { + // Guard against coin loss; + // if the generated signature is somehow invalid, coins would be lost, + // make sure that the signature is valid + pubkey, err := PubKeyFromSig(sig, hash) + if err != nil { + log.Panic("SignHash error: pubkey from sig recovery failure") + } + if VerifyPubKeySignedHash(pubkey, sig, hash) != nil { + log.Panic("SignHash error: secp256k1.Sign returned non-null invalid non-null signature") + } + if VerifyAddressSignedHash(AddressFromPubKey(pubkey), sig, hash) != nil { + log.Panic("SignHash error: VerifyAddressSignedHash failed for signature") + } + } + + return sig, nil +} + +// MustSignHash sign hash, panics on error +func MustSignHash(hash SHA256, sec SecKey) Sig { + sig, err := SignHash(hash, sec) + if err != nil { + log.Panic(err) + } + return sig +} + +// VerifyAddressSignedHash checks whether PubKey corresponding to address hash signed hash +// - recovers the PubKey from sig and hash +// - fail if PubKey cannot be be recovered +// - computes the address from the PubKey +// - fail if recovered address does not match PubKey hash +// - verify that signature is valid for hash for PubKey +func VerifyAddressSignedHash(address Address, sig Sig, hash SHA256) error { + rawPubKey := secp256k1.RecoverPubkey(hash[:], sig[:]) + if rawPubKey == nil { + return ErrInvalidSigPubKeyRecovery + } + + pubKey, err := NewPubKey(rawPubKey) + if err != nil { + return err + } + + if address != AddressFromPubKey(pubKey) { + return ErrInvalidAddressForSig + } + + if secp256k1.VerifySignature(hash[:], sig[:], rawPubKey[:]) != 1 { + return ErrInvalidHashForSig + } + + return nil +} + +// VerifyPubKeySignedHash verifies that hash was signed by PubKey +func VerifyPubKeySignedHash(pubkey PubKey, sig Sig, hash SHA256) error { + pubkeyRec, err := PubKeyFromSig(sig, hash) // recovered pubkey + if err != nil { + return ErrInvalidSigPubKeyRecovery + } + if pubkeyRec != pubkey { + return ErrPubKeyRecoverMismatch + } + if secp256k1.VerifyPubkey(pubkey[:]) != 1 { + if DebugLevel2 { + if secp256k1.VerifySignature(hash[:], sig[:], pubkey[:]) == 1 { + log.Panic("VerifyPubKeySignedHash warning, invalid pubkey is valid for signature") + } + } + return ErrInvalidSigInvalidPubKey + } + if secp256k1.VerifySignatureValidity(sig[:]) != 1 { + return ErrInvalidSigValidity + } + if secp256k1.VerifySignature(hash[:], sig[:], pubkey[:]) != 1 { + return ErrInvalidSigForMessage + } + return nil +} + +// VerifySignatureRecoverPubKey this only checks that the signature can be converted to a public key. +// It does not check that the signature signed the hash. +// The original public key or address is required to verify that the signature signed the hash. +func VerifySignatureRecoverPubKey(sig Sig, hash SHA256) error { + rawPubKey := secp256k1.RecoverPubkey(hash[:], sig[:]) + if rawPubKey == nil { + return ErrInvalidSigPubKeyRecovery + } + if secp256k1.VerifySignature(hash[:], sig[:], rawPubKey) != 1 { + // This should always pass; the recovered pubkey should always be valid + return ErrInvalidHashForSig + } + return nil +} + +// GenerateKeyPair creates key pair +func GenerateKeyPair() (PubKey, SecKey) { + public, secret := secp256k1.GenerateKeyPair() + + secKey, err := NewSecKey(secret) + if err != nil { + log.Panicf("GenerateKeyPair: secp256k1.GenerateKeyPair returned invalid secKey: %v", err) + } + + pubKey, err := NewPubKey(public) + if err != nil { + log.Panicf("GenerateKeyPair: secp256k1.GenerateKeyPair returned invalid pubKey: %v", err) + } + + if DebugLevel1 { + if err := CheckSecKey(secKey); err != nil { + log.Panicf("DebugLevel1, GenerateKeyPair, generated private key failed CheckSecKey: %v", err) + } + + if MustPubKeyFromSecKey(secKey) != pubKey { + log.Panic("DebugLevel1, GenerateKeyPair, public key does not match private key") + } + } + + return pubKey, secKey +} + +// GenerateDeterministicKeyPair generates deterministic key pair +func GenerateDeterministicKeyPair(seed []byte) (PubKey, SecKey, error) { + if len(seed) == 0 { + return PubKey{}, SecKey{}, ErrEmptySeed + } + + public, secret := secp256k1.GenerateDeterministicKeyPair(seed) + + secKey, err := NewSecKey(secret) + if err != nil { + log.Panicf("GenerateDeterministicKeyPair: secp256k1.GenerateDeterministicKeyPair returned invalid secKey: %v", err) + } + + pubKey, err := NewPubKey(public) + if err != nil { + log.Panicf("GenerateDeterministicKeyPair: secp256k1.GenerateDeterministicKeyPair returned invalid pubKey: %v", err) + } + + if DebugLevel1 { + if err := CheckSecKey(secKey); err != nil { + log.Panicf("DebugLevel1, GenerateDeterministicKeyPair, CheckSecKey failed: %v", err) + } + + if MustPubKeyFromSecKey(secKey) != pubKey { + log.Panic("DebugLevel1, GenerateDeterministicKeyPair, public key does not match private key") + } + } + + return pubKey, secKey, nil +} + +// MustGenerateDeterministicKeyPair generates deterministic key pair, panics on error +func MustGenerateDeterministicKeyPair(seed []byte) (PubKey, SecKey) { + p, s, err := GenerateDeterministicKeyPair(seed) + if err != nil { + log.Panic(err) + } + return p, s +} + +// DeterministicKeyPairIterator takes SHA256 value, returns a new +// SHA256 value and publickey and private key. Apply multiple times +// feeding the SHA256 value back into generate sequence of keys +func DeterministicKeyPairIterator(seed []byte) ([]byte, PubKey, SecKey, error) { + if len(seed) == 0 { + return nil, PubKey{}, SecKey{}, ErrEmptySeed + } + + hash, public, secret := secp256k1.DeterministicKeyPairIterator(seed) + + secKey := MustNewSecKey(secret) + pubKey := MustNewPubKey(public) + + if DebugLevel1 { + if err := CheckSecKey(secKey); err != nil { + log.Panicf("DebugLevel1, DeterministicKeyPairIterator, CheckSecKey failed: %v", err) + } + + if MustPubKeyFromSecKey(secKey) != pubKey { + log.Panic("DebugLevel1, DeterministicKeyPairIterator, public key does not match private key") + } + } + + return hash, pubKey, secKey, nil +} + +// MustDeterministicKeyPairIterator takes SHA256 value, returns a new +// SHA256 value and publickey and private key. Apply multiple times +// feeding the SHA256 value back into generate sequence of keys, panics on error +func MustDeterministicKeyPairIterator(seed []byte) ([]byte, PubKey, SecKey) { + hash, p, s, err := DeterministicKeyPairIterator(seed) + if err != nil { + log.Panic(err) + } + return hash, p, s +} + +// GenerateDeterministicKeyPairs returns sequence of n private keys from initial seed +func GenerateDeterministicKeyPairs(seed []byte, n int) ([]SecKey, error) { + _, keys, err := GenerateDeterministicKeyPairsSeed(seed, n) + return keys, err +} + +// MustGenerateDeterministicKeyPairs returns sequence of n private keys from initial seed, panics on error +func MustGenerateDeterministicKeyPairs(seed []byte, n int) []SecKey { + keys, err := GenerateDeterministicKeyPairs(seed, n) + if err != nil { + log.Panic(err) + } + return keys +} + +// GenerateDeterministicKeyPairsSeed returns sequence of n private keys from initial seed, and return the new seed +func GenerateDeterministicKeyPairsSeed(seed []byte, n int) ([]byte, []SecKey, error) { + var keys []SecKey + var seckey SecKey + for i := 0; i < n; i++ { + var err error + seed, _, seckey, err = DeterministicKeyPairIterator(seed) + if err != nil { + return nil, nil, err + } + keys = append(keys, seckey) + } + return seed, keys, nil +} + +// MustGenerateDeterministicKeyPairsSeed returns sequence of n private keys from initial seed, and return the new seed +func MustGenerateDeterministicKeyPairsSeed(seed []byte, n int) ([]byte, []SecKey) { + newSeed, keys, err := GenerateDeterministicKeyPairsSeed(seed, n) + if err != nil { + log.Panic(err) + } + return newSeed, keys +} + +// CheckSecKey test seckey hash +func CheckSecKey(seckey SecKey) error { + hash := SumSHA256([]byte(time.Now().String())) + return CheckSecKeyHash(seckey, hash) +} + +// CheckSecKeyHash performs a series of tests to determine if a seckey is valid. +// All generated keys and keys loaded from disc must pass the CheckSecKey suite. +// TestPrivKey returns error if a key fails any test in the test suite. +func CheckSecKeyHash(seckey SecKey, hash SHA256) error { + // check seckey with verify + if secp256k1.VerifySeckey(seckey[:]) != 1 { + return ErrInvalidSecKyVerification + } + + // check pubkey recovery + pubkey, err := PubKeyFromSecKey(seckey) + if err != nil { + return fmt.Errorf("PubKeyFromSecKey failed: %v", err) + } + if pubkey == (PubKey{}) { + return ErrNullPubKeyFromSecKey + } + // verify recovered pubkey + if secp256k1.VerifyPubkey(pubkey[:]) != 1 { + return ErrInvalidDerivedPubKeyFromSecKey + } + + // check signature production + sig, err := SignHash(hash, seckey) + if err != nil { + return fmt.Errorf("SignHash failed: %v", err) + } + + pubkey2, err := PubKeyFromSig(sig, hash) + if err != nil { + return fmt.Errorf("PubKeyFromSig failed: %v", err) + } + if pubkey != pubkey2 { + return ErrInvalidPubKeyFromHash + } + + // check pubkey recovered from sig + recoveredPubkey, err := PubKeyFromSig(sig, hash) + if err != nil { + return fmt.Errorf("impossible error, CheckSecKeyHash, pubkey recovery from signature failed: %v", err) + } + if pubkey != recoveredPubkey { + return ErrPubKeyFromSecKeyMismatch + } + + // verify produced signature + err = VerifyPubKeySignedHash(pubkey, sig, hash) + if err != nil { + return fmt.Errorf("impossible error, CheckSecKeyHash, VerifyPubKeySignedHash failed for sig: %v", err) + } + + // verify VerifyAddressSignedHash + addr := AddressFromPubKey(pubkey) + err = VerifyAddressSignedHash(addr, sig, hash) + if err != nil { + return fmt.Errorf("impossible error CheckSecKeyHash, VerifyAddressSignedHash Failed, should not get this far: %v", err) + } + + // verify VerifySignatureRecoverPubKey + err = VerifySignatureRecoverPubKey(sig, hash) + if err != nil { + return fmt.Errorf("VerifySignatureRecoverPubKey failed: %v", err) + } + + return nil +} + +func init() { + ripemd160HashPool = make(chan hash.Hash, ripemd160HashPoolSize) + for i := 0; i < ripemd160HashPoolSize; i++ { + ripemd160HashPool <- ripemd160.New() + } + + sha256HashPool = make(chan hash.Hash, sha256HashPoolSize) + for i := 0; i < sha256HashPoolSize; i++ { + sha256HashPool <- sha256.New() + } + + // Do not allow program to start if crypto tests fail + pubkey, seckey := GenerateKeyPair() + if err := CheckSecKey(seckey); err != nil { + log.Panicf("CRYPTOGRAPHIC INTEGRITY CHECK FAILED: TERMINATING PROGRAM TO PROTECT COINS: %v", err) + } + if MustPubKeyFromSecKey(seckey) != pubkey { + log.Panic("DebugLevel1, GenerateKeyPair, public key does not match private key") + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/crypto_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/crypto_test.go new file mode 100644 index 00000000..8d895d14 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/crypto_test.go @@ -0,0 +1,753 @@ +package cipher + +import ( + "bytes" + "crypto/sha256" + "encoding/hex" + "errors" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher/ripemd160" +) + +func TestNewPubKey(t *testing.T) { + _, err := NewPubKey(randBytes(t, 31)) + require.Equal(t, errors.New("Invalid public key length"), err) + _, err = NewPubKey(randBytes(t, 32)) + require.Equal(t, errors.New("Invalid public key length"), err) + _, err = NewPubKey(randBytes(t, 34)) + require.Equal(t, errors.New("Invalid public key length"), err) + _, err = NewPubKey(randBytes(t, 0)) + require.Equal(t, errors.New("Invalid public key length"), err) + _, err = NewPubKey(randBytes(t, 100)) + require.Equal(t, errors.New("Invalid public key length"), err) + + _, err = NewPubKey(make([]byte, len(PubKey{}))) + require.Equal(t, errors.New("Invalid public key"), err) + + p, _ := GenerateKeyPair() + p2, err := NewPubKey(p[:]) + require.NoError(t, err) + require.Equal(t, p, p2) +} + +func TestMustNewPubKey(t *testing.T) { + require.Panics(t, func() { MustNewPubKey(randBytes(t, 31)) }) + require.Panics(t, func() { MustNewPubKey(randBytes(t, 32)) }) + require.Panics(t, func() { MustNewPubKey(randBytes(t, 34)) }) + require.Panics(t, func() { MustNewPubKey(randBytes(t, 0)) }) + require.Panics(t, func() { MustNewPubKey(randBytes(t, 100)) }) + require.Panics(t, func() { MustNewPubKey(make([]byte, len(PubKey{}))) }) + + p, _ := GenerateKeyPair() + p2 := MustNewPubKey(p[:]) + require.Equal(t, p, p2) +} + +func TestPubKeyFromHex(t *testing.T) { + // Invalid hex + _, err := PubKeyFromHex("") + require.Equal(t, errors.New("Invalid public key length"), err) + + _, err = PubKeyFromHex("cascs") + require.Equal(t, errors.New("Invalid public key"), err) + + // Empty key + empty := PubKey{} + h := hex.EncodeToString(empty[:]) + _, err = PubKeyFromHex(h) + require.Equal(t, errors.New("Invalid public key"), err) + + // Invalid hex length + p, _ := GenerateKeyPair() + s := hex.EncodeToString(p[:len(p)/2]) + _, err = PubKeyFromHex(s) + require.Equal(t, errors.New("Invalid public key length"), err) + + // Valid + s = hex.EncodeToString(p[:]) + p2, err := PubKeyFromHex(s) + require.NoError(t, err) + require.Equal(t, p, p2) +} + +func TestMustPubKeyFromHex(t *testing.T) { + // Invalid hex + require.Panics(t, func() { MustPubKeyFromHex("") }) + require.Panics(t, func() { MustPubKeyFromHex("cascs") }) + + // Empty key + empty := PubKey{} + h := hex.EncodeToString(empty[:]) + require.Panics(t, func() { MustPubKeyFromHex(h) }) + + // Invalid hex length + p, _ := GenerateKeyPair() + s := hex.EncodeToString(p[:len(p)/2]) + require.Panics(t, func() { MustPubKeyFromHex(s) }) + + // Valid + s = hex.EncodeToString(p[:]) + require.NotPanics(t, func() { MustPubKeyFromHex(s) }) + require.Equal(t, p, MustPubKeyFromHex(s)) +} + +func TestPubKeyHex(t *testing.T) { + p, _ := GenerateKeyPair() + h := p.Hex() + p2, err := PubKeyFromHex(h) + require.NoError(t, err) + require.Equal(t, p2, p) + require.Equal(t, p2.Hex(), h) +} + +func TestNewPubKeyRandom(t *testing.T) { + // Random bytes should not be valid, most of the time + failed := false + for i := 0; i < 10; i++ { + b := randBytes(t, 33) + if _, err := NewPubKey(b); err != nil { + failed = true + break + } + } + require.True(t, failed) +} + +func TestPubKeyVerify(t *testing.T) { + // Random bytes should not be valid, most of the time + failed := false + for i := 0; i < 10; i++ { + b := randBytes(t, 33) + p := PubKey{} + copy(p[:], b[:]) + if p.Verify() != nil { + failed = true + break + } + } + require.True(t, failed) +} + +func TestPubKeyNullVerifyFails(t *testing.T) { + // Empty public key should not be valid + p := PubKey{} + require.Error(t, p.Verify()) +} + +func TestPubKeyVerifyDefault1(t *testing.T) { + // Generated pub key should be valid + p, _ := GenerateKeyPair() + require.NoError(t, p.Verify()) +} + +func TestPubKeyVerifyDefault2(t *testing.T) { + for i := 0; i < 1024; i++ { + p, _ := GenerateKeyPair() + require.NoError(t, p.Verify()) + } +} + +func TestPubKeyRipemd160(t *testing.T) { + p, _ := GenerateKeyPair() + h := PubKeyRipemd160(p) + // Should be Ripemd160(SHA256(SHA256())) + x := sha256.Sum256(p[:]) + x = sha256.Sum256(x[:]) + rh := ripemd160.New() + _, err := rh.Write(x[:]) + require.NoError(t, err) + y := rh.Sum(nil) + require.True(t, bytes.Equal(h[:], y)) +} + +func TestPubKeyToAddress(t *testing.T) { + p, _ := GenerateKeyPair() + addr := AddressFromPubKey(p) + //func (self Address) Verify(key PubKey) error { + err := addr.Verify(p) + require.NoError(t, err) + addrStr := addr.String() + _, err = DecodeBase58Address(addrStr) + //func DecodeBase58Address(addr string) (Address, error) { + require.NoError(t, err) +} + +func TestPubKeyToAddress2(t *testing.T) { + for i := 0; i < 1024; i++ { + p, _ := GenerateKeyPair() + addr := AddressFromPubKey(p) + //func (self Address) Verify(key PubKey) error { + err := addr.Verify(p) + require.NoError(t, err) + addrStr := addr.String() + _, err = DecodeBase58Address(addrStr) + //func DecodeBase58Address(addr string) (Address, error) { + require.NoError(t, err) + } +} + +func TestNewSecKey(t *testing.T) { + _, err := NewSecKey(randBytes(t, 31)) + require.Equal(t, errors.New("Invalid secret key length"), err) + _, err = NewSecKey(randBytes(t, 33)) + require.Equal(t, errors.New("Invalid secret key length"), err) + _, err = NewSecKey(randBytes(t, 34)) + require.Equal(t, errors.New("Invalid secret key length"), err) + _, err = NewSecKey(randBytes(t, 0)) + require.Equal(t, errors.New("Invalid secret key length"), err) + _, err = NewSecKey(randBytes(t, 100)) + require.Equal(t, errors.New("Invalid secret key length"), err) + + b := randBytes(t, 32) + p, err := NewSecKey(b) + require.NoError(t, err) + require.True(t, bytes.Equal(p[:], b)) +} + +func TestMustNewSecKey(t *testing.T) { + require.Panics(t, func() { MustNewSecKey(randBytes(t, 31)) }) + require.Panics(t, func() { MustNewSecKey(randBytes(t, 33)) }) + require.Panics(t, func() { MustNewSecKey(randBytes(t, 34)) }) + require.Panics(t, func() { MustNewSecKey(randBytes(t, 0)) }) + require.Panics(t, func() { MustNewSecKey(randBytes(t, 100)) }) + require.NotPanics(t, func() { MustNewSecKey(randBytes(t, 32)) }) + b := randBytes(t, 32) + p := MustNewSecKey(b) + require.True(t, bytes.Equal(p[:], b)) +} + +func TestSecKeyFromHex(t *testing.T) { + // Invalid hex + _, err := SecKeyFromHex("") + require.Equal(t, errors.New("Invalid secret key length"), err) + + _, err = SecKeyFromHex("cascs") + require.Equal(t, errors.New("Invalid secret key"), err) + + // Invalid hex length + p := MustNewSecKey(randBytes(t, 32)) + s := hex.EncodeToString(p[:len(p)/2]) + _, err = SecKeyFromHex(s) + require.Equal(t, errors.New("Invalid secret key length"), err) + + // Valid + s = hex.EncodeToString(p[:]) + p2, err := SecKeyFromHex(s) + require.NoError(t, err) + require.Equal(t, p2, p) +} + +func TestMustSecKeyFromHex(t *testing.T) { + // Invalid hex + require.Panics(t, func() { MustSecKeyFromHex("") }) + require.Panics(t, func() { MustSecKeyFromHex("cascs") }) + // Invalid hex length + p := MustNewSecKey(randBytes(t, 32)) + s := hex.EncodeToString(p[:len(p)/2]) + require.Panics(t, func() { MustSecKeyFromHex(s) }) + // Valid + s = hex.EncodeToString(p[:]) + require.NotPanics(t, func() { MustSecKeyFromHex(s) }) + require.Equal(t, p, MustSecKeyFromHex(s)) +} + +func TestSecKeyHex(t *testing.T) { + b := randBytes(t, 32) + p := MustNewSecKey(b) + h := p.Hex() + p2 := MustSecKeyFromHex(h) + require.Equal(t, p2, p) + require.Equal(t, p2.Hex(), h) +} + +func TestSecKeyVerify(t *testing.T) { + // Empty secret key should not be valid + p := SecKey{} + require.Error(t, p.Verify()) + + // Generated sec key should be valid + _, p = GenerateKeyPair() + require.NoError(t, p.Verify()) + + // Random bytes are usually valid +} + +func TestECDH(t *testing.T) { + pub1, sec1 := GenerateKeyPair() + pub2, sec2 := GenerateKeyPair() + + buf1, err := ECDH(pub2, sec1) + require.NoError(t, err) + buf2, err := ECDH(pub1, sec2) + require.NoError(t, err) + + require.True(t, bytes.Equal(buf1, buf2)) + + goodPub, goodSec := GenerateKeyPair() + var badPub PubKey + var badSec SecKey + + _, err = ECDH(badPub, goodSec) + require.Equal(t, errors.New("ECDH invalid pubkey input"), err) + _, err = ECDH(goodPub, badSec) + require.Equal(t, errors.New("ECDH invalid seckey input"), err) + + for i := 0; i < 128; i++ { + pub1, sec1 := GenerateKeyPair() + pub2, sec2 := GenerateKeyPair() + buf1, err := ECDH(pub2, sec1) + require.NoError(t, err) + buf2, err := ECDH(pub1, sec2) + require.NoError(t, err) + require.True(t, bytes.Equal(buf1, buf2)) + } +} + +func TestMustECDH(t *testing.T) { + goodPub, goodSec := GenerateKeyPair() + var badPub PubKey + var badSec SecKey + + require.Panics(t, func() { + MustECDH(badPub, goodSec) + }) + require.Panics(t, func() { + MustECDH(goodPub, badSec) + }) + + pub1, sec1 := GenerateKeyPair() + pub2, sec2 := GenerateKeyPair() + + buf1 := MustECDH(pub2, sec1) + buf2 := MustECDH(pub1, sec2) + + require.True(t, bytes.Equal(buf1, buf2)) +} + +func TestNewSig(t *testing.T) { + _, err := NewSig(randBytes(t, 64)) + require.Equal(t, errors.New("Invalid signature length"), err) + _, err = NewSig(randBytes(t, 66)) + require.Equal(t, errors.New("Invalid signature length"), err) + _, err = NewSig(randBytes(t, 67)) + require.Equal(t, errors.New("Invalid signature length"), err) + _, err = NewSig(randBytes(t, 0)) + require.Equal(t, errors.New("Invalid signature length"), err) + _, err = NewSig(randBytes(t, 100)) + require.Equal(t, errors.New("Invalid signature length"), err) + + b := randBytes(t, 65) + p, err := NewSig(b) + require.NoError(t, err) + require.True(t, bytes.Equal(p[:], b)) +} + +func TestMustNewSig(t *testing.T) { + require.Panics(t, func() { MustNewSig(randBytes(t, 64)) }) + require.Panics(t, func() { MustNewSig(randBytes(t, 66)) }) + require.Panics(t, func() { MustNewSig(randBytes(t, 67)) }) + require.Panics(t, func() { MustNewSig(randBytes(t, 0)) }) + require.Panics(t, func() { MustNewSig(randBytes(t, 100)) }) + + require.NotPanics(t, func() { MustNewSig(randBytes(t, 65)) }) + + b := randBytes(t, 65) + p := MustNewSig(b) + require.True(t, bytes.Equal(p[:], b)) +} + +func TestSigFromHex(t *testing.T) { + // Invalid hex + _, err := SigFromHex("") + require.Equal(t, errors.New("Invalid signature length"), err) + + _, err = SigFromHex("cascs") + require.Equal(t, errors.New("Invalid signature"), err) + + // Invalid hex length + p := MustNewSig(randBytes(t, 65)) + s := hex.EncodeToString(p[:len(p)/2]) + _, err = SigFromHex(s) + require.Equal(t, errors.New("Invalid signature length"), err) + + // Valid + s = hex.EncodeToString(p[:]) + s2, err := SigFromHex(s) + require.NoError(t, err) + require.Equal(t, p, s2) +} + +func TestMustSigFromHex(t *testing.T) { + // Invalid hex + require.Panics(t, func() { MustSigFromHex("") }) + require.Panics(t, func() { MustSigFromHex("cascs") }) + // Invalid hex length + p := MustNewSig(randBytes(t, 65)) + s := hex.EncodeToString(p[:len(p)/2]) + require.Panics(t, func() { MustSigFromHex(s) }) + // Valid + s = hex.EncodeToString(p[:]) + require.NotPanics(t, func() { MustSigFromHex(s) }) + require.Equal(t, p, MustSigFromHex(s)) +} + +func TestSigHex(t *testing.T) { + b := randBytes(t, 65) + p := MustNewSig(b) + h := p.Hex() + p2 := MustSigFromHex(h) + require.Equal(t, p2, p) + require.Equal(t, p2.Hex(), h) +} + +func TestVerifyAddressSignedHash(t *testing.T) { + p, s := GenerateKeyPair() + require.NoError(t, p.Verify()) + require.NoError(t, s.Verify()) + a := AddressFromPubKey(p) + require.NoError(t, a.Verify(p)) + b := randBytes(t, 256) + h := SumSHA256(b) + sig := MustSignHash(h, s) + require.NoError(t, VerifyAddressSignedHash(a, sig, h)) + // Empty sig should be invalid + require.Error(t, VerifyAddressSignedHash(a, Sig{}, h)) + // Random sigs should not pass + for i := 0; i < 100; i++ { + require.Error(t, VerifyAddressSignedHash(a, MustNewSig(randBytes(t, 65)), h)) + } + // Sig for one hash does not work for another hash + h2 := SumSHA256(randBytes(t, 256)) + sig2 := MustSignHash(h2, s) + require.NoError(t, VerifyAddressSignedHash(a, sig2, h2)) + require.Error(t, VerifyAddressSignedHash(a, sig2, h)) + require.Error(t, VerifyAddressSignedHash(a, sig, h2)) + + // Different secret keys should not create same sig + p2, s2 := GenerateKeyPair() + a2 := AddressFromPubKey(p2) + h = SumSHA256(randBytes(t, 256)) + sig = MustSignHash(h, s) + sig2 = MustSignHash(h, s2) + require.NoError(t, VerifyAddressSignedHash(a, sig, h)) + require.NoError(t, VerifyAddressSignedHash(a2, sig2, h)) + require.NotEqual(t, sig, sig2) + h = SumSHA256(randBytes(t, 256)) + sig = MustSignHash(h, s) + sig2 = MustSignHash(h, s2) + require.NoError(t, VerifyAddressSignedHash(a, sig, h)) + require.NoError(t, VerifyAddressSignedHash(a2, sig2, h)) + require.NotEqual(t, sig, sig2) + + // Bad address should be invalid + require.Error(t, VerifyAddressSignedHash(a, sig2, h)) + require.Error(t, VerifyAddressSignedHash(a2, sig, h)) + + // Empty hash should panic + require.Panics(t, func() { + MustSignHash(SHA256{}, s) + }) +} + +func TestSignHash(t *testing.T) { + p, s := GenerateKeyPair() + a := AddressFromPubKey(p) + h := SumSHA256(randBytes(t, 256)) + sig, err := SignHash(h, s) + require.NoError(t, err) + require.NotEqual(t, sig, Sig{}) + require.NoError(t, VerifyAddressSignedHash(a, sig, h)) + require.NoError(t, VerifyPubKeySignedHash(p, sig, h)) + + p2, err := PubKeyFromSig(sig, h) + require.NoError(t, err) + require.Equal(t, p, p2) + + _, err = SignHash(h, SecKey{}) + require.Equal(t, ErrInvalidSecKey, err) + + _, err = SignHash(SHA256{}, s) + require.Equal(t, ErrNullSignHash, err) +} + +func TestMustSignHash(t *testing.T) { + p, s := GenerateKeyPair() + a := AddressFromPubKey(p) + h := SumSHA256(randBytes(t, 256)) + sig := MustSignHash(h, s) + require.NotEqual(t, sig, Sig{}) + require.NoError(t, VerifyAddressSignedHash(a, sig, h)) + + require.Panics(t, func() { + MustSignHash(h, SecKey{}) + }) +} + +func TestPubKeyFromSecKey(t *testing.T) { + p, s := GenerateKeyPair() + p2, err := PubKeyFromSecKey(s) + require.NoError(t, err) + require.Equal(t, p2, p) + + _, err = PubKeyFromSecKey(SecKey{}) + require.Equal(t, errors.New("Attempt to load null seckey, unsafe"), err) +} + +func TestMustPubKeyFromSecKey(t *testing.T) { + p, s := GenerateKeyPair() + require.Equal(t, MustPubKeyFromSecKey(s), p) + require.Panics(t, func() { MustPubKeyFromSecKey(SecKey{}) }) +} + +func TestPubKeyFromSig(t *testing.T) { + p, s := GenerateKeyPair() + h := SumSHA256(randBytes(t, 256)) + sig := MustSignHash(h, s) + p2, err := PubKeyFromSig(sig, h) + require.Equal(t, p, p2) + require.NoError(t, err) + _, err = PubKeyFromSig(Sig{}, h) + require.Error(t, err) +} + +func TestMustPubKeyFromSig(t *testing.T) { + p, s := GenerateKeyPair() + h := SumSHA256(randBytes(t, 256)) + sig := MustSignHash(h, s) + p2 := MustPubKeyFromSig(sig, h) + require.Equal(t, p, p2) + + require.Panics(t, func() { + _ = MustPubKeyFromSig(Sig{}, h) + }) +} + +func TestVerifyPubKeySignedHash(t *testing.T) { + p, s := GenerateKeyPair() + h := SumSHA256(randBytes(t, 256)) + h2 := SumSHA256(randBytes(t, 256)) + sig := MustSignHash(h, s) + require.NoError(t, VerifyPubKeySignedHash(p, sig, h)) + require.Error(t, VerifyPubKeySignedHash(p, Sig{}, h)) + require.Error(t, VerifyPubKeySignedHash(p, sig, h2)) + p2, _ := GenerateKeyPair() + require.Error(t, VerifyPubKeySignedHash(p2, sig, h)) + require.Error(t, VerifyPubKeySignedHash(PubKey{}, sig, h)) +} + +func TestGenerateKeyPair(t *testing.T) { + for i := 0; i < 10; i++ { + p, s := GenerateKeyPair() + require.NoError(t, p.Verify()) + require.NoError(t, s.Verify()) + err := CheckSecKey(s) + require.NoError(t, err) + } +} + +func TestGenerateDeterministicKeyPair(t *testing.T) { + // TODO -- deterministic key pairs are useless as is because we can't + // generate pair n+1, only pair 0 + seed := randBytes(t, 32) + p, s := MustGenerateDeterministicKeyPair(seed) + require.NoError(t, p.Verify()) + require.NoError(t, s.Verify()) + p, s = MustGenerateDeterministicKeyPair(seed) + require.NoError(t, p.Verify()) + require.NoError(t, s.Verify()) + + _, _, err := GenerateDeterministicKeyPair(nil) + require.Equal(t, errors.New("Seed input is empty"), err) + + require.Panics(t, func() { + MustGenerateDeterministicKeyPair(nil) + }) +} + +func TestGenerateDeterministicKeyPairs(t *testing.T) { + seed := randBytes(t, 32) + keys, err := GenerateDeterministicKeyPairs(seed, 4) + require.NoError(t, err) + require.Len(t, keys, 4) + for _, s := range keys { + require.NoError(t, s.Verify()) + } + + keys2 := MustGenerateDeterministicKeyPairs(seed, 4) + require.Equal(t, keys, keys2) + + _, err = GenerateDeterministicKeyPairs(nil, 1) + require.Equal(t, errors.New("Seed input is empty"), err) + + require.Panics(t, func() { + MustGenerateDeterministicKeyPairs(nil, 1) + }) +} + +func TestGenerateDeterministicKeyPairsSeed(t *testing.T) { + seed := randBytes(t, 32) + newSeed, keys, err := GenerateDeterministicKeyPairsSeed(seed, 4) + require.NoError(t, err) + require.Len(t, newSeed, 32) + require.NotEqual(t, seed, newSeed) + require.Len(t, keys, 4) + for _, s := range keys { + require.NoError(t, s.Verify()) + } + + newSeed2, keys2 := MustGenerateDeterministicKeyPairsSeed(seed, 4) + require.Equal(t, newSeed, newSeed2) + require.Equal(t, keys, keys2) + + _, _, err = GenerateDeterministicKeyPairsSeed(nil, 4) + require.Equal(t, errors.New("Seed input is empty"), err) + + require.Panics(t, func() { + MustGenerateDeterministicKeyPairsSeed(nil, 4) + }) +} + +func TestDeterministicKeyPairIterator(t *testing.T) { + seed := randBytes(t, 32) + newSeed, p, s, err := DeterministicKeyPairIterator(seed) + require.NoError(t, err) + require.NoError(t, p.Verify()) + require.NoError(t, s.Verify()) + require.NotEqual(t, seed, newSeed) + require.Len(t, newSeed, 32) + + newSeed2, p2, s2 := MustDeterministicKeyPairIterator(seed) + require.Equal(t, newSeed, newSeed2) + require.Equal(t, p, p2) + require.Equal(t, s, s2) + + _, _, _, err = DeterministicKeyPairIterator(nil) + require.Equal(t, errors.New("Seed input is empty"), err) + + require.Panics(t, func() { + MustDeterministicKeyPairIterator(nil) + }) +} + +func TestCheckSecKey(t *testing.T) { + _, s := GenerateKeyPair() + require.NoError(t, CheckSecKey(s)) + require.Error(t, CheckSecKey(SecKey{})) +} + +func TestCheckSecKeyHash(t *testing.T) { + _, s := GenerateKeyPair() + h := SumSHA256(randBytes(t, 256)) + require.NoError(t, CheckSecKeyHash(s, h)) + require.Error(t, CheckSecKeyHash(SecKey{}, h)) +} + +func TestGenerateDeterministicKeyPairsUsesAllBytes(t *testing.T) { + // Tests that if a seed >128 bits is used, the generator does not ignore bits >128 + seed := "property diet little foster provide disagree witness mountain alley weekend kitten general" + seckeys := MustGenerateDeterministicKeyPairs([]byte(seed), 3) + seckeys2 := MustGenerateDeterministicKeyPairs([]byte(seed[:16]), 3) + require.NotEqual(t, seckeys, seckeys2) +} + +func TestPubkey1(t *testing.T) { + // This was migrated from coin/coin_test.go + a := "02fa939957e9fc52140e180264e621c2576a1bfe781f88792fb315ca3d1786afb8" + b, err := hex.DecodeString(a) + require.NoError(t, err) + + p, err := NewPubKey(b) + require.NoError(t, err) + require.NoError(t, p.Verify()) + + addr := AddressFromPubKey(p) + require.NoError(t, addr.Verify(p)) +} + +func TestSecKey1(t *testing.T) { + // This was migrated from coin/coin_test.go + a := "5a42c0643bdb465d90bf673b99c14f5fa02db71513249d904573d2b8b63d353d" + b, err := hex.DecodeString(a) + require.NoError(t, err) + require.Len(t, b, 32) + + seckey, err := NewSecKey(b) + require.NoError(t, err) + require.NoError(t, seckey.Verify()) + + pubkey, err := PubKeyFromSecKey(seckey) + require.NoError(t, err) + require.NoError(t, pubkey.Verify()) + + addr := AddressFromPubKey(pubkey) + require.NoError(t, addr.Verify(pubkey)) + + test := []byte("test message") + hash := SumSHA256(test) + err = CheckSecKeyHash(seckey, hash) + require.NoError(t, err) +} + +func TestSecKeyPubKeyNull(t *testing.T) { + var pk PubKey + require.True(t, pk.Null()) + pk[0] = 1 + require.False(t, pk.Null()) + + var sk SecKey + require.True(t, sk.Null()) + sk[0] = 1 + require.False(t, sk.Null()) + + sk, err := NewSecKey(randBytes(t, 32)) + require.NoError(t, err) + pk = MustPubKeyFromSecKey(sk) + + require.False(t, sk.Null()) + require.False(t, pk.Null()) +} + +func TestVerifySignatureRecoverPubKey(t *testing.T) { + h := MustSHA256FromHex("127e9b0d6b71cecd0363b366413f0f19fcd924ae033513498e7486570ff2a1c8") + sig := MustSigFromHex("63c035b0c95d0c5744fc1c0bdf38af02cef2d2f65a8f923732ab44e436f8a491216d9ab5ff795e3144f4daee37077b8b9db54d2ba3a3df8d4992f06bb21f724401") + + err := VerifySignatureRecoverPubKey(sig, h) + require.NoError(t, err) + + // Fails with ErrInvalidHashForSig + badSigHex := "71f2c01516fe696328e79bcf464eb0db374b63d494f7a307d1e77114f18581d7a81eed5275a9e04a336292dd2fd16977d9bef2a54ea3161d0876603d00c53bc9dd" + badSig := MustSigFromHex(badSigHex) + err = VerifySignatureRecoverPubKey(badSig, h) + require.Equal(t, ErrInvalidHashForSig, err) + + // Fails with ErrInvalidSigPubKeyRecovery + badSig = MustSigFromHex("63c035b0c95d0c5744fc1c0bdf39af02cef2d2f65a8f923732ab44e436f8a491216d9ab5ff795e3144f4daee37077b8b9db54d2ba3a3df8d4992f06bb21f724401") + err = VerifySignatureRecoverPubKey(badSig, h) + require.Equal(t, ErrInvalidSigPubKeyRecovery, err) +} + +func TestHighSPointSigInvalid(t *testing.T) { + // Verify that signatures that were generated with forceLowS=false + // are not accepted as valid, to avoid a signature malleability case. + // Refer to secp256k1go's TestSigForceLowS for the reference test inputs + + h := MustSHA256FromHex("DD72CBF2203C1A55A411EEC4404AF2AFB2FE942C434B23EFE46E9F04DA8433CA") + + // This signature has a high S point (the S point is above the half-order of the curve) + sigHexHighS := "8c20a668be1b5a910205de46095023fe4823a3757f4417114168925f28193bffadf317cc256cec28d90d5b2b7e1ce6a45cd5f3b10880ab5f99c389c66177d39a01" + s := MustSigFromHex(sigHexHighS) + err := VerifySignatureRecoverPubKey(s, h) + + require.Error(t, err) + require.Equal(t, "Signature not valid for hash", err.Error()) + + // This signature has a low S point (the S point is below the half-order of the curve). + // It is equal to forceLowS(sigHighS). + sigHexLowS := "8c20a668be1b5a910205de46095023fe4823a3757f4417114168925f28193bff520ce833da9313d726f2a4d481e3195a5dd8e935a6c7f4dc260ed4c66ebe6da700" + s2 := MustSigFromHex(sigHexLowS) + err = VerifySignatureRecoverPubKey(s2, h) + require.NoError(t, err) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/README.md b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/README.md new file mode 100644 index 00000000..20c62e92 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/README.md @@ -0,0 +1,8 @@ +encoder +======= + +[![GoDoc](http://godoc.org/github.com//SkycoinProject/skycoin/src/cipher/encoder?status.png)](http://godoc.org/github.com/SkycoinProject/skycoin/src/cipher/encoder) + +[Godoc generated documentation](https://godoc.org/github.com/SkycoinProject/skycoin/src/cipher/encoder) + +Binary struct encoder for Go. Fork of go's pkg encoding/binary. diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/benchmark_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/benchmark_test.go new file mode 100644 index 00000000..76a20e8f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/benchmark_test.go @@ -0,0 +1,33 @@ +package encoder + +import "testing" + +// benchmarkExample is the same struct used in https://github.com/gz-c/gosercomp benchmarks +type benchmarkExample struct { + ID int32 + Name string + Colors []string +} + +var benchmarkExampleObj = benchmarkExample{ + ID: 1, + Name: "Reds", + Colors: []string{"Crimson", "Red", "Ruby", "Maroon"}, +} + +func BenchmarkDeserializeRaw(b *testing.B) { + byt := Serialize(benchmarkExampleObj) + result := &benchmarkExample{} + + b.ResetTimer() + for i := 0; i < b.N; i++ { + DeserializeRaw(byt, result) //nolint:errcheck + } +} + +func BenchmarkSerialize(b *testing.B) { + b.ResetTimer() + for i := 0; i < b.N; i++ { + Serialize(&benchmarkExampleObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/encoder.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/encoder.go new file mode 100644 index 00000000..da17043b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/encoder.go @@ -0,0 +1,1027 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package encoder binary implements translation between struct data and byte sequences +// +// Fields can be ignored with the struct tag `enc:"-"` . +// Unexported struct fields are ignored by default . +// +// Fields can be skipped if empty with the struct tag `enc:",omitempty"` +// Note the comma, which follows package json's conventions. +// Only Slice, Map and String types recognize the omitempty tag. +// When omitempty is set, the no data will be written if the value is empty. +// If the value is empty and omitempty is not set, then a length prefix with value 0 would be written. +// omitempty can only be used for the last field in the struct +// +// Encoding of maps is supported, but note that the use of them results in non-deterministic output. +// If determinism is required, do not use map. +// +// A length restriction to certain fields can be applied when decoding. +// Use the tag `,maxlen=` on a struct field to apply this restriction. +// `maxlen` works for string and slice types. The length is interpreted as the length +// of the string or the number of elements in the slice. +// Note that maxlen does not affect serialization; it may serialize objects which could fail deserialization. +// Callers should check their length restricted values manually prior to serialization. +package encoder + +import ( + "errors" + "fmt" + "log" + "math" + "reflect" + "strconv" + "strings" +) + +var ( + // ErrBufferUnderflow bytes in input buffer not enough to deserialize expected type + ErrBufferUnderflow = errors.New("Not enough buffer data to deserialize") + // ErrBufferOverflow bytes in output buffer not enough to serialize expected type + ErrBufferOverflow = errors.New("Not enough buffer data to serialize") + // ErrInvalidOmitEmpty field tagged with omitempty and it's not last one in struct + ErrInvalidOmitEmpty = errors.New("omitempty only supported for the final field in the struct") + // ErrRemainingBytes bytes remain in buffer after deserializing object + ErrRemainingBytes = errors.New("Bytes remain in buffer after deserializing object") + // ErrMaxLenExceeded a specified maximum length was exceeded when serializing or deserializing a variable length field + ErrMaxLenExceeded = errors.New("Maximum length exceeded for variable length field") + // ErrMapDuplicateKeys encountered duplicate map keys while decoding a map + ErrMapDuplicateKeys = errors.New("Duplicate keys encountered while decoding a map") + // ErrInvalidBool is returned if the decoder encounters a value other than 0 or 1 for a bool type field + ErrInvalidBool = errors.New("Invalid value for bool type") +) + +// SerializeUint32 serializes a uint32 +func SerializeUint32(x uint32) []byte { + var b [4]byte + lePutUint32(b[:], x) + return b[:] +} + +// DeserializeUint32 serializes a uint32 +func DeserializeUint32(buf []byte) (uint32, uint64, error) { + if len(buf) < 4 { + return 0, 0, ErrBufferUnderflow + } + return leUint32(buf[:4]), 4, nil +} + +// SerializeAtomic encodes an integer or boolean contained in `data` to bytes. +// Panics if `data` is not an integer or boolean type. +func SerializeAtomic(data interface{}) []byte { + var b [8]byte + + switch v := data.(type) { + case bool: + if v { + b[0] = 1 + } else { + b[0] = 0 + } + return b[:1] + case int8: + b[0] = byte(v) + return b[:1] + case uint8: + b[0] = v + return b[:1] + case int16: + lePutUint16(b[:2], uint16(v)) + return b[:2] + case uint16: + lePutUint16(b[:2], v) + return b[:2] + case int32: + lePutUint32(b[:4], uint32(v)) + return b[:4] + case uint32: + lePutUint32(b[:4], v) + return b[:4] + case int64: + lePutUint64(b[:8], uint64(v)) + return b[:8] + case uint64: + lePutUint64(b[:8], v) + return b[:8] + default: + log.Panic("SerializeAtomic unhandled type") + return nil + } +} + +// DeserializeAtomic deserializes `in` buffer into `data` +// parameter. Panics if `data` is not an integer or boolean type. +// Returns the number of bytes read. +func DeserializeAtomic(in []byte, data interface{}) (uint64, error) { + switch v := data.(type) { + case *bool: + if len(in) < 1 { + return 0, ErrBufferUnderflow + } + if in[0] == 0 { + *v = false + } else { + *v = true + } + return 1, nil + case *int8: + if len(in) < 1 { + return 0, ErrBufferUnderflow + } + *v = int8(in[0]) + return 1, nil + case *uint8: + if len(in) < 1 { + return 0, ErrBufferUnderflow + } + *v = in[0] + return 1, nil + case *int16: + if len(in) < 2 { + return 0, ErrBufferUnderflow + } + *v = int16(leUint16(in[:2])) + return 2, nil + case *uint16: + if len(in) < 2 { + return 0, ErrBufferUnderflow + } + *v = leUint16(in[:2]) + return 2, nil + case *int32: + if len(in) < 4 { + return 0, ErrBufferUnderflow + } + *v = int32(leUint32(in[:4])) + return 4, nil + case *uint32: + if len(in) < 4 { + return 0, ErrBufferUnderflow + } + *v = leUint32(in[:4]) + return 4, nil + case *int64: + if len(in) < 8 { + return 0, ErrBufferUnderflow + } + *v = int64(leUint64(in[:8])) + return 8, nil + case *uint64: + if len(in) < 8 { + return 0, ErrBufferUnderflow + } + *v = leUint64(in[:8]) + return 8, nil + default: + log.Panic("DeserializeAtomic unhandled type") + return 0, nil + } +} + +// SerializeString serializes a string to []byte +func SerializeString(s string) []byte { + v := reflect.ValueOf(s) + size := datasizeWrite(v) + buf := make([]byte, size) + e := &Encoder{ + Buffer: buf, + } + e.value(v) + return buf +} + +// DeserializeString deserializes a string from []byte, returning the string and the number of bytes read +func DeserializeString(in []byte, maxlen int) (string, uint64, error) { + var s string + v := reflect.ValueOf(&s) + v = v.Elem() + + inlen := len(in) + d1 := &Decoder{ + Buffer: make([]byte, inlen), + } + copy(d1.Buffer, in) + + err := d1.value(v, maxlen) + if err != nil { + return "", 0, err + } + + return s, uint64(inlen - len(d1.Buffer)), nil +} + +// DeserializeRaw deserializes `in` buffer into return +// parameter. If `data` is not a Pointer or Map type an error +// is returned. If `in` buffer can't be deserialized, +// an error message is returned. +// Returns number of bytes read if no error. +func DeserializeRaw(in []byte, data interface{}) (uint64, error) { + v := reflect.ValueOf(data) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + case reflect.Map: + default: + return 0, fmt.Errorf("DeserializeRaw value must be a ptr, is %s", v.Kind().String()) + } + + inlen := len(in) + d1 := &Decoder{ + Buffer: make([]byte, inlen), + } + copy(d1.Buffer, in) + + if err := d1.value(v, 0); err != nil { + return 0, err + } + + return uint64(inlen - len(d1.Buffer)), nil +} + +// DeserializeRawExact deserializes `in` buffer into return +// parameter. If `data` is not a Pointer or Map type an error +// is returned. If `in` buffer can't be deserialized, +// an error message is returned. +// Returns number of bytes read if no error. +// If the number of bytes read does not equal the length of the input buffer, +// ErrRemainingBytes is returned. +func DeserializeRawExact(in []byte, data interface{}) error { + n, err := DeserializeRaw(in, data) + if err != nil { + return err + } + if n != uint64(len(in)) { + return ErrRemainingBytes + } + return nil +} + +// DeserializeRawToValue deserializes `in` buffer into +// `dst`'s type and returns the number of bytes used and +// the value of the buffer. If `data` is not either a +// Pointer type an error is returned. +// If `in` buffer can't be deserialized, the number of bytes read and an error message are returned. +func DeserializeRawToValue(in []byte, v reflect.Value) (uint64, error) { + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + case reflect.Map: + default: + return 0, fmt.Errorf("DeserializeRawToValue value must be a ptr, is %s", v.Kind().String()) + } + + inlen := len(in) + d1 := &Decoder{ + Buffer: make([]byte, inlen), + } + copy(d1.Buffer, in) + + err := d1.value(v, 0) + if err != nil { + return 0, err + } + + return uint64(inlen - len(d1.Buffer)), nil +} + +// Serialize returns serialized basic type-based `data` +// parameter. Encoding is reflect-based. Panics if `data` is not serializable. +func Serialize(data interface{}) []byte { + v := reflect.Indirect(reflect.ValueOf(data)) + size := datasizeWrite(v) + buf := make([]byte, size) + e := &Encoder{ + Buffer: buf, + } + e.value(v) + return buf +} + +// Size returns how many bytes would it take to encode the +// value v, which must be a fixed-size value (struct) or a +// slice of fixed-size values, or a pointer to such data. +// Reflect-based encoding is used. +func Size(v interface{}) uint64 { + return datasizeWrite(reflect.Indirect(reflect.ValueOf(v))) +} + +// isEmpty returns true if a value is "empty". +// Only supports Slice, Map and String. +// All other values are never considered empty. +func isEmpty(v reflect.Value) bool { + t := v.Type() + switch t.Kind() { + case reflect.String: + return v.Len() == 0 + case reflect.Map: + return v.IsNil() || v.Len() == 0 + case reflect.Slice: + return v.IsNil() || v.Len() == 0 + default: + return false + } +} + +// datasizeWrite returns the number of bytes the actual data represented by v occupies in memory. +// For compound structures, it sums the sizes of the elements. Thus, for instance, for a slice +// it returns the length of the slice times the element size and does not count the memory +// occupied by the header. +func datasizeWrite(v reflect.Value) uint64 { + t := v.Type() + switch t.Kind() { + case reflect.Interface: + return datasizeWrite(v.Elem()) + + case reflect.Array: + // Arrays are a fixed size, so the length is not written + t := v.Type() + elem := t.Elem() + switch elem.Kind() { + case reflect.Uint8, reflect.Int8: + return uint64(v.Len()) + case reflect.Uint16, reflect.Int16: + return uint64(v.Len()) * 2 + case reflect.Uint32, reflect.Int32, reflect.Float32: + return uint64(v.Len()) * 4 + case reflect.Uint64, reflect.Int64, reflect.Float64: + return uint64(v.Len()) * 8 + default: + size := uint64(0) + for i := 0; i < v.Len(); i++ { + elem := v.Index(i) + s := datasizeWrite(elem) + size += s + } + return size + } + + case reflect.Slice: + t := v.Type() + elem := t.Elem() + switch elem.Kind() { + case reflect.Uint8, reflect.Int8: + return 4 + uint64(v.Len()) + case reflect.Uint16, reflect.Int16: + return 4 + uint64(v.Len())*2 + case reflect.Uint32, reflect.Int32, reflect.Float32: + return 4 + uint64(v.Len())*4 + case reflect.Uint64, reflect.Int64, reflect.Float64: + return 4 + uint64(v.Len())*8 + default: + size := uint64(0) + for i := 0; i < v.Len(); i++ { + elem := v.Index(i) + s := datasizeWrite(elem) + size += s + } + return 4 + size + } + + case reflect.Map: + // length prefix + size := uint64(4) + for _, key := range v.MapKeys() { + s := datasizeWrite(key) + size += s + elem := v.MapIndex(key) + s = datasizeWrite(elem) + size += s + } + return size + + case reflect.Struct: + sum := uint64(0) + nFields := t.NumField() + for i, n := 0, nFields; i < n; i++ { + ff := t.Field(i) + // Skip unexported fields + if ff.PkgPath != "" { + continue + } + + tag := ff.Tag.Get("enc") + omitempty := TagOmitempty(tag) + + if omitempty && i != nFields-1 { + log.Panic(ErrInvalidOmitEmpty) + } + + if len(tag) > 0 && tag[0] == '-' { + continue + } + + fv := v.Field(i) + if !omitempty || !isEmpty(fv) { + s := datasizeWrite(fv) + sum += s + } + } + return sum + + case reflect.Bool: + return 1 + + case reflect.String: + return 4 + uint64(v.Len()) + + case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, + reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, + reflect.Float32, reflect.Float64: + return uint64(t.Size()) + + default: + log.Panicf("invalid type %s", t.String()) + return 0 + } +} + +// TagOmitempty returns true if the tag specifies omitempty +func TagOmitempty(tag string) bool { + return strings.Contains(tag, ",omitempty") +} + +func tagName(tag string) string { //nolint:deadcode,megacheck + commaIndex := strings.Index(tag, ",") + if commaIndex == -1 { + return tag + } + + return tag[:commaIndex] +} + +// TagMaxLen returns the maxlen value tagged on a struct. Returns 0 if no tag is present. +func TagMaxLen(tag string) int { + maxlenIndex := strings.Index(tag, ",maxlen=") + if maxlenIndex == -1 { + return 0 + } + + maxlenRem := tag[maxlenIndex+len(",maxlen="):] + commaIndex := strings.Index(maxlenRem, ",") + if commaIndex != -1 { + maxlenRem = maxlenRem[:commaIndex] + } + + maxlen, err := strconv.Atoi(maxlenRem) + if err != nil { + panic("maxlen must be a number") + } + + return maxlen +} + +/* + Internals +*/ + +func leUint16(b []byte) uint16 { return uint16(b[0]) | uint16(b[1])<<8 } + +func lePutUint16(b []byte, v uint16) { + b[0] = byte(v) + b[1] = byte(v >> 8) +} + +func leUint32(b []byte) uint32 { + return uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 +} + +func lePutUint32(b []byte, v uint32) { + b[0] = byte(v) + b[1] = byte(v >> 8) + b[2] = byte(v >> 16) + b[3] = byte(v >> 24) +} + +func leUint64(b []byte) uint64 { + return uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | + uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 +} + +func lePutUint64(b []byte, v uint64) { + b[0] = byte(v) + b[1] = byte(v >> 8) + b[2] = byte(v >> 16) + b[3] = byte(v >> 24) + b[4] = byte(v >> 32) + b[5] = byte(v >> 40) + b[6] = byte(v >> 48) + b[7] = byte(v >> 56) +} + +// Decoder decodes an object from the skycoin binary encoding format +type Decoder struct { + Buffer []byte +} + +// Encoder encodes an object to the skycoin binary encoding format +type Encoder struct { + Buffer []byte +} + +// Bool decodes bool +func (d *Decoder) Bool() (bool, error) { + if len(d.Buffer) < 1 { + return false, ErrBufferUnderflow + } + x := d.Buffer[0] + d.Buffer = d.Buffer[1:] // advance slice + + switch x { + case 0: + return false, nil + case 1: + return true, nil + default: + return false, ErrInvalidBool + } +} + +// Bool encodes bool +func (e *Encoder) Bool(x bool) { + if x { + e.Buffer[0] = 1 + } else { + e.Buffer[0] = 0 + } + e.Buffer = e.Buffer[1:] +} + +// Uint8 decodes uint8 +func (d *Decoder) Uint8() (uint8, error) { + if len(d.Buffer) < 1 { + return 0, ErrBufferUnderflow + } + + x := d.Buffer[0] + d.Buffer = d.Buffer[1:] // advance slice + return x, nil +} + +// Uint8 encodes uint8 +func (e *Encoder) Uint8(x uint8) { + e.Buffer[0] = x + e.Buffer = e.Buffer[1:] +} + +// Uint16 decodes uint16 +func (d *Decoder) Uint16() (uint16, error) { + if len(d.Buffer) < 2 { + return 0, ErrBufferUnderflow + } + + x := leUint16(d.Buffer[0:2]) + d.Buffer = d.Buffer[2:] + return x, nil +} + +// Uint16 encodes uint16 +func (e *Encoder) Uint16(x uint16) { + lePutUint16(e.Buffer[0:2], x) + e.Buffer = e.Buffer[2:] +} + +// Uint32 decodes a Uint32 +func (d *Decoder) Uint32() (uint32, error) { + if len(d.Buffer) < 4 { + return 0, ErrBufferUnderflow + } + + x := leUint32(d.Buffer[0:4]) + d.Buffer = d.Buffer[4:] + return x, nil +} + +// Uint32 encodes a Uint32 +func (e *Encoder) Uint32(x uint32) { + lePutUint32(e.Buffer[0:4], x) + e.Buffer = e.Buffer[4:] +} + +// Uint64 decodes uint64 +func (d *Decoder) Uint64() (uint64, error) { + if len(d.Buffer) < 8 { + return 0, ErrBufferUnderflow + } + + x := leUint64(d.Buffer[0:8]) + d.Buffer = d.Buffer[8:] + return x, nil +} + +// Uint64 encodes uint64 +func (e *Encoder) Uint64(x uint64) { + lePutUint64(e.Buffer[0:8], x) + e.Buffer = e.Buffer[8:] +} + +// ByteSlice encodes []byte +func (e *Encoder) ByteSlice(x []byte) { + e.Uint32(uint32(len(x))) + e.CopyBytes(x) +} + +// CopyBytes copies bytes to the buffer, without a length prefix +func (e *Encoder) CopyBytes(x []byte) { + if len(x) == 0 { + return + } + copy(e.Buffer, x) + e.Buffer = e.Buffer[len(x):] +} + +// Int8 decodes int8 +func (d *Decoder) Int8() (int8, error) { + u, err := d.Uint8() + if err != nil { + return 0, err + } + + return int8(u), nil +} + +// Int8 encodes int8 +func (e *Encoder) Int8(x int8) { + e.Uint8(uint8(x)) +} + +// Int16 decodes int16 +func (d *Decoder) Int16() (int16, error) { + u, err := d.Uint16() + if err != nil { + return 0, err + } + + return int16(u), nil +} + +// Int16 encodes int16 +func (e *Encoder) Int16(x int16) { + e.Uint16(uint16(x)) +} + +// Int32 decodes int32 +func (d *Decoder) Int32() (int32, error) { + u, err := d.Uint32() + if err != nil { + return 0, err + } + + return int32(u), nil +} + +// Int32 encodes int32 +func (e *Encoder) Int32(x int32) { + e.Uint32(uint32(x)) +} + +// Int64 decodes int64 +func (d *Decoder) Int64() (int64, error) { + u, err := d.Uint64() + if err != nil { + return 0, err + } + + return int64(u), nil +} + +// Int64 encodes int64 +func (e *Encoder) Int64(x int64) { + e.Uint64(uint64(x)) +} + +func (d *Decoder) value(v reflect.Value, maxlen int) error { + kind := v.Kind() + switch kind { + case reflect.Array: + + t := v.Type() + elem := t.Elem() + + // Arrays are a fixed size, so the length is not written + length := v.Len() + + switch elem.Kind() { + case reflect.Uint8: + if length > len(d.Buffer) { + return ErrBufferUnderflow + } + + reflect.Copy(v, reflect.ValueOf(d.Buffer[:length])) + d.Buffer = d.Buffer[length:] + default: + for i := 0; i < length; i++ { + if err := d.value(v.Index(i), 0); err != nil { + return err + } + } + } + + case reflect.Map: + ul, err := d.Uint32() + if err != nil { + return err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return ErrBufferUnderflow + } + + if length == 0 { + return nil + } + + t := v.Type() + key := t.Key() + elem := t.Elem() + + if v.IsNil() { + v.Set(reflect.Indirect(reflect.MakeMap(t))) + } + + for i := 0; i < length; i++ { + keyv := reflect.Indirect(reflect.New(key)) + elemv := reflect.Indirect(reflect.New(elem)) + if err := d.value(keyv, 0); err != nil { + return err + } + if err := d.value(elemv, 0); err != nil { + return err + } + v.SetMapIndex(keyv, elemv) + } + + if v.Len() != length { + return ErrMapDuplicateKeys + } + + case reflect.Slice: + ul, err := d.Uint32() + if err != nil { + return err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return ErrBufferUnderflow + } + + if length == 0 { + return nil + } + + if maxlen > 0 && length > maxlen { + return ErrMaxLenExceeded + } + + t := v.Type() + elem := t.Elem() + + switch elem.Kind() { + case reflect.Uint8: + v.SetBytes(d.Buffer[:length]) + d.Buffer = d.Buffer[length:] + default: + elemvs := reflect.MakeSlice(t, length, length) + for i := 0; i < length; i++ { + elemv := reflect.Indirect(elemvs.Index(i)) + if err := d.value(elemv, 0); err != nil { + return err + } + } + v.Set(elemvs) + } + + case reflect.Struct: + t := v.Type() + nFields := v.NumField() + for i := 0; i < nFields; i++ { + ff := t.Field(i) + // Skip unexported fields + if ff.PkgPath != "" { + continue + } + + tag := ff.Tag.Get("enc") + omitempty := TagOmitempty(tag) + + if omitempty && i != nFields-1 { + log.Panic(ErrInvalidOmitEmpty) + } + + if len(tag) > 0 && tag[0] == '-' { + continue + } + + fv := v.Field(i) + if fv.CanSet() && ff.Name != "_" { + maxlen := TagMaxLen(tag) + + if err := d.value(fv, maxlen); err != nil { + if err == ErrMaxLenExceeded { + return err + } + + // omitempty fields at the end of the buffer are ignored if missing + if !omitempty || len(d.Buffer) != 0 { + return err + } + } + } + } + + case reflect.String: + ul, err := d.Uint32() + if err != nil { + return err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return ErrBufferUnderflow + } + + if maxlen > 0 && length > maxlen { + return ErrMaxLenExceeded + } + + v.SetString(string(d.Buffer[:length])) + d.Buffer = d.Buffer[length:] + + case reflect.Bool: + b, err := d.Bool() + if err != nil { + return err + } + v.SetBool(b) + case reflect.Int8: + i, err := d.Int8() + if err != nil { + return err + } + v.SetInt(int64(i)) + case reflect.Int16: + i, err := d.Int16() + if err != nil { + return err + } + v.SetInt(int64(i)) + case reflect.Int32: + i, err := d.Int32() + if err != nil { + return err + } + v.SetInt(int64(i)) + case reflect.Int64: + i, err := d.Int64() + if err != nil { + return err + } + v.SetInt(i) + + case reflect.Uint8: + u, err := d.Uint8() + if err != nil { + return err + } + v.SetUint(uint64(u)) + case reflect.Uint16: + u, err := d.Uint16() + if err != nil { + return err + } + v.SetUint(uint64(u)) + case reflect.Uint32: + u, err := d.Uint32() + if err != nil { + return err + } + v.SetUint(uint64(u)) + case reflect.Uint64: + u, err := d.Uint64() + if err != nil { + return err + } + v.SetUint(u) + + case reflect.Float32: + u, err := d.Uint32() + if err != nil { + return err + } + v.SetFloat(float64(math.Float32frombits(u))) + case reflect.Float64: + u, err := d.Uint64() + if err != nil { + return err + } + v.SetFloat(math.Float64frombits(u)) + + default: + log.Panicf("Decode error: kind %s not handled", v.Kind().String()) + } + + return nil +} + +func (e *Encoder) value(v reflect.Value) { + switch v.Kind() { + case reflect.Interface: + e.value(v.Elem()) + + case reflect.Array: + // Arrays are a fixed size, so the length is not written + t := v.Type() + elem := t.Elem() + switch elem.Kind() { + case reflect.Uint8: + reflect.Copy(reflect.ValueOf(e.Buffer), v) + e.Buffer = e.Buffer[v.Len():] + default: + for i := 0; i < v.Len(); i++ { + e.value(v.Index(i)) + } + } + + case reflect.Slice: + t := v.Type() + elem := t.Elem() + switch elem.Kind() { + case reflect.Uint8: + e.ByteSlice(v.Bytes()) + default: + e.Uint32(uint32(v.Len())) + for i := 0; i < v.Len(); i++ { + e.value(v.Index(i)) + } + } + + case reflect.Map: + e.Uint32(uint32(v.Len())) + for _, key := range v.MapKeys() { + e.value(key) + e.value(v.MapIndex(key)) + } + + case reflect.Struct: + t := v.Type() + nFields := v.NumField() + for i := 0; i < nFields; i++ { + // see comment for corresponding code in Decoder.value() + ff := t.Field(i) + // Skip unexported fields + if ff.PkgPath != "" { + continue + } + + tag := ff.Tag.Get("enc") + omitempty := TagOmitempty(tag) + + if omitempty && i != nFields-1 { + log.Panic(ErrInvalidOmitEmpty) + } + + if len(tag) > 0 && tag[0] == '-' { + continue + } + + fv := v.Field(i) + if !(omitempty && isEmpty(fv)) && (fv.CanSet() || ff.Name != "_") { + e.value(fv) + } + } + + case reflect.Bool: + e.Bool(v.Bool()) + + case reflect.String: + e.ByteSlice([]byte(v.String())) + + case reflect.Int8: + e.Int8(int8(v.Int())) + case reflect.Int16: + e.Int16(int16(v.Int())) + case reflect.Int32: + e.Int32(int32(v.Int())) + case reflect.Int64: + e.Int64(v.Int()) + + case reflect.Uint8: + e.Uint8(uint8(v.Uint())) + case reflect.Uint16: + e.Uint16(uint16(v.Uint())) + case reflect.Uint32: + e.Uint32(uint32(v.Uint())) + case reflect.Uint64: + e.Uint64(v.Uint()) + + case reflect.Float32: + e.Uint32(math.Float32bits(float32(v.Float()))) + case reflect.Float64: + e.Uint64(math.Float64bits(v.Float())) + + default: + log.Panicf("Encoding unhandled type %s", v.Type().Name()) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/encoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/encoder_test.go new file mode 100644 index 00000000..10c44694 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/encoder_test.go @@ -0,0 +1,1463 @@ +package encoder + +import ( + "bytes" + "crypto/rand" + "encoding/hex" + "errors" + "fmt" + "io/ioutil" + "math" + "os" + "reflect" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" +) + +func randBytes(t *testing.T, n uint64) []byte { //nolint:unparam + const alphanum = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + var bytes = make([]byte, n) + _, err := rand.Read(bytes) + require.NoError(t, err) + for i, b := range bytes { + bytes[i] = alphanum[b%byte(len(alphanum))] + } + return bytes +} + +//Size of= 13 +type TestStruct struct { + X int32 + Y int64 + Z uint8 + K []byte + W bool + T string + U cipher.PubKey +} + +type TestStruct2 struct { + X int32 + Y int64 + Z uint8 + K [8]byte + W bool +} + +type TestStructIgnore struct { + X int32 + Y int64 + Z uint8 `enc:"-"` + K []byte +} + +type TestStructWithoutIgnore struct { + X int32 + Y int64 + K []byte +} + +func Test_Encode_1(t *testing.T) { + var ts TestStruct + ts.X = 345535 + ts.Y = 23432435443 + ts.Z = 255 + ts.K = []byte("TEST6") + ts.W = true + ts.T = "hello" + ts.U = cipher.PubKey{1, 2, 3, 0, 5, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} + + b := Serialize(ts) + + var ts2 TestStruct + n, err := DeserializeRaw(b, &ts2) + require.NoError(t, err) + require.Equal(t, uint64(len(b)), n) + + b2 := Serialize(ts2) + + c := bytes.Compare(b, b2) + require.Equal(t, c, 0) +} + +func Test_Encode_2a(t *testing.T) { + var ts TestStruct2 + ts.X = 345535 + ts.Y = 23432435443 + ts.Z = 255 + ts.W = false + _tt := []byte("ASDSADFSDFASDFSD") + copy(ts.K[:], _tt) + + b := Serialize(ts) + + var ts2 TestStruct2 + n, err := DeserializeRaw(b, &ts2) + require.NoError(t, err) + require.Equal(t, uint64(len(b)), n) + + b2 := Serialize(ts2) + + c := bytes.Compare(b, b2) + require.Equal(t, c, 0) +} + +func Test_Encode_2b(t *testing.T) { + var ts TestStruct2 + ts.X = 345535 + ts.Y = 23432435443 + ts.Z = 255 + _tt := []byte("ASDSADFSDFASDFSD") + copy(ts.K[:], _tt) + + b := Serialize(ts) + + var ts2 TestStruct2 + n, err := DeserializeRaw(b, &ts2) + require.NoError(t, err) + require.Equal(t, uint64(len(b)), n) + + b2 := Serialize(ts2) + + c := bytes.Compare(b, b2) + require.Equal(t, c, 0) +} + +type TestStruct3 struct { + X int32 + K []byte +} + +func Test_Encode_3a(t *testing.T) { + var t1 TestStruct3 + t1.X = 345535 + t1.K = randBytes(t, 32) + + b := Serialize(t1) + + var t2 TestStruct3 + n, err := DeserializeRaw(b, &t2) + require.NoError(t, err) + require.Equal(t, uint64(len(b)), n) + + require.False(t, t1.X != t2.X || len(t1.K) != len(t2.K) || !bytes.Equal(t1.K, t2.K)) + + b2 := Serialize(t2) + + c := bytes.Compare(b, b2) + require.Equal(t, c, 0) +} + +func Test_Encode_3b(t *testing.T) { + var t1 TestStruct3 + t1.X = 345535 + t1.K = randBytes(t, 32) + + b := Serialize(t1) + + var t2 TestStruct3 + n, err := DeserializeRaw(b, &t2) + require.NoError(t, err) + require.Equal(t, uint64(len(b)), n) + + require.False(t, t1.X != t2.X || len(t1.K) != len(t2.K) || !bytes.Equal(t1.K, t2.K)) + + b2 := Serialize(t2) + + c := bytes.Compare(b, b2) + require.Equal(t, c, 0) +} + +type TestStruct4 struct { + X int32 + Y int32 +} + +type TestStruct5 struct { + X int32 + A []TestStruct4 +} + +func Test_Encode_4(t *testing.T) { + var t1 TestStruct5 + t1.X = 345535 + + t1.A = make([]TestStruct4, 8) + + b := Serialize(t1) + + var t2 TestStruct5 + n, err := DeserializeRaw(b, &t2) + require.NoError(t, err) + require.Equal(t, uint64(len(b)), n) + + require.Equal(t, t1.X, t2.X, "TestStruct5.X not equal") + + require.Equal(t, len(t1.A), len(t2.A), "Slice lengths not equal: %d != %d", len(t1.A), len(t2.A)) + + for i, ts := range t1.A { + require.Equal(t, ts, t2.A[i], "Slice values not equal") + } + + b2 := Serialize(t2) + + require.True(t, bytes.Equal(b, b2)) +} + +func TestDeserializeRawToValue(t *testing.T) { + var ts TestStruct2 + ts.X = 345535 + ts.Y = 23432435443 + ts.Z = 255 + + b1 := Serialize(ts) + + var tts = reflect.TypeOf(ts) + var v = reflect.New(tts) // pointer to type tts + + n, err := DeserializeRawToValue(b1, v) + require.NoError(t, err) + require.Equal(t, uint64(len(b1)), n) + + v = reflect.Indirect(v) + require.Equal(t, int64(ts.X), v.FieldByName("X").Int()) + require.Equal(t, ts.Y, v.FieldByName("Y").Int()) + require.Equal(t, uint64(ts.Z), v.FieldByName("Z").Uint()) + + ss := []string{"foo", "bar", "baz"} + expectedLen := (4+3)*3 + 4 + extraLen := 4 + b := Serialize(ss) + require.Equal(t, expectedLen, len(b)) + + // Pad extra bytes onto the array to test that it does not change the decoding + b = append(b, make([]byte, extraLen)...) + + var ssd []string + n, err = DeserializeRawToValue(b, reflect.ValueOf(&ssd)) + require.Equal(t, uint64(expectedLen), n) + require.NoError(t, err) + + // Not a pointer + _, err = DeserializeRawToValue(b, reflect.ValueOf(ts)) + require.Equal(t, errors.New("DeserializeRawToValue value must be a ptr, is struct"), err) + + // Map is ok + m := map[string]int64{"foo": 32, "bar": 64} + b = Serialize(m) + require.NotEmpty(t, b) + + mm := map[string]int64{} + _, err = DeserializeRawToValue(b, reflect.ValueOf(mm)) + require.NoError(t, err) + require.Equal(t, m, mm) + + // Map pointer is ok + mm = map[string]int64{} + _, err = DeserializeRawToValue(b, reflect.ValueOf(&mm)) + require.NoError(t, err) + require.Equal(t, m, mm) +} + +func Test_Encode_IgnoreTagSerialize(t *testing.T) { + var ts TestStructIgnore + ts.X = 345535 + ts.Y = 23432435443 + ts.Z = 255 + ts.K = []byte("TEST6") + + b := Serialize(ts) + + var ts2 TestStructIgnore + ts.X = 0 + ts.Y = 0 + ts.Z = 0 + ts.K = []byte("") + n, err := DeserializeRaw(b, &ts2) + require.NoError(t, err) + require.Equal(t, uint64(len(b)), n) + + require.Equal(t, uint8(0), ts2.Z, "Z should not deserialize. It is %d", ts2.Z) + + var ts3 TestStructWithoutIgnore + n, err = DeserializeRaw(b, &ts3) + require.NoError(t, err) + require.Equal(t, uint64(len(b)), n) + + b2 := Serialize(ts2) + c := bytes.Compare(b, b2) + require.Equal(t, c, 0) +} + +type Contained struct { + X uint32 + Y uint64 + Bytes []uint8 + Ints []uint16 +} + +type Container struct { + Elements []Contained +} + +func TestEncodeNestedSlice(t *testing.T) { + size := uint64(0) + elems := make([]Contained, 4) + for i := range elems { + elems[i].X = uint32(i) + size += 4 + elems[i].Y = uint64(i) + size += 8 + elems[i].Bytes = make([]uint8, i) + for j := range elems[i].Bytes { + elems[i].Bytes[j] = uint8(j) + } + size += 4 + uint64(i*1) + elems[i].Ints = make([]uint16, i) + for j := range elems[i].Ints { + elems[i].Ints[j] = uint16(j) + } + size += 4 + uint64(i*2) + } + c := Container{elems} + n := datasizeWrite(reflect.ValueOf(c)) + require.False(t, n != size+4, "Wrong data size") + + b := Serialize(c) + d := Container{} + n, err := DeserializeRaw(b, &d) + require.NoError(t, err) + require.Equal(t, uint64(len(b)), n) + + for i, e := range d.Elements { + require.Equal(t, c.Elements[i].X, e.X) + require.Equal(t, c.Elements[i].Y, e.Y) + require.Equal(t, len(c.Elements[i].Bytes), len(e.Bytes)) + for j, b := range c.Elements[i].Bytes { + require.Equal(t, c.Elements[i].Bytes[j], b) + } + require.Equal(t, len(c.Elements[i].Ints), len(e.Ints)) + for j, b := range c.Elements[i].Ints { + require.Equal(t, c.Elements[i].Ints[j], b) + } + } +} + +type Array struct { + Arr []int +} + +func TestDecodeNotEnoughLength(t *testing.T) { + b := make([]byte, 2) + var d Array + _, err := DeserializeRaw(b, &d) + require.Error(t, err) + require.Equal(t, ErrBufferUnderflow, err) + + // Test with slice + thing := make([]int, 3) + _, err = DeserializeRaw(b, &thing) + require.Error(t, err) + require.Equal(t, ErrBufferUnderflow, err) +} + +func TestFlattenMultidimensionalBytes(t *testing.T) { + var data [16][16]byte + for i := 0; i < 16; i++ { + for j := 0; j < 16; j++ { + data[i][j] = byte(i * j) + } + } + + b := Serialize(data) + require.Equal(t, 16*16, len(b)) +} + +func TestMultiArrays(t *testing.T) { + var data [16][16]byte + for i := 0; i < 16; i++ { + for j := 0; j < 16; j++ { + data[i][j] = byte(i * j) + } + } + + b := Serialize(data) + + var data2 [16][16]byte + + n, err := DeserializeRaw(b, &data2) + require.NoError(t, err) + require.Equal(t, uint64(len(b)), n) + + for i := 0; i < 16; i++ { + for j := 0; j < 16; j++ { + require.Equal(t, data[i][j], data2[i][j]) + } + } + + b2 := Serialize(data2) + require.True(t, bytes.Equal(b, b2)) + + require.Equal(t, 256, len(b)) +} + +func TestDeserializeAtomic(t *testing.T) { + var sp uint64 = 0x000C8A9E1809F720 + b := SerializeAtomic(sp) + + var i uint64 + n, err := DeserializeAtomic(b, &i) + require.Equal(t, uint64(len(b)), n) + require.NoError(t, err) + require.Equal(t, sp, i) +} + +func TestSerializeDeserializeAtomic(t *testing.T) { + var di64 int64 + n, err := DeserializeAtomic(nil, &di64) + require.Equal(t, uint64(0), n) + require.Equal(t, ErrBufferUnderflow, err) + + b := false + d := SerializeAtomic(b) + var bb bool + n, err = DeserializeAtomic(d, &bb) + require.NoError(t, err) + require.Equal(t, uint64(1), n) + require.Equal(t, b, bb) + + b = true + bb = false + d = SerializeAtomic(b) + n, err = DeserializeAtomic(d, &bb) + require.NoError(t, err) + require.Equal(t, uint64(1), n) + require.Equal(t, b, bb) + + var byt byte = 0xE4 + d = SerializeAtomic(byt) + var bytb byte + n, err = DeserializeAtomic(d, &bytb) + require.NoError(t, err) + require.Equal(t, uint64(1), n) + require.Equal(t, byt, bytb) + + var u8 uint8 = 0xF7 + d = SerializeAtomic(u8) + var u8b uint8 + n, err = DeserializeAtomic(d, &u8b) + require.NoError(t, err) + require.Equal(t, uint64(1), n) + require.Equal(t, u8, u8b) + + var u16 uint16 = 0xF720 + d = SerializeAtomic(u16) + var u16b uint16 + n, err = DeserializeAtomic(d, &u16b) + require.NoError(t, err) + require.Equal(t, uint64(2), n) + require.Equal(t, u16, u16b) + + var u32 uint32 = 0x1809F720 + d = SerializeAtomic(u32) + var u32b uint32 + n, err = DeserializeAtomic(d, &u32b) + require.NoError(t, err) + require.Equal(t, uint64(4), n) + require.Equal(t, u32, u32b) + + var u64 uint64 = 0x000C8A9E1809F720 + d = SerializeAtomic(u64) + var u64b uint64 + n, err = DeserializeAtomic(d, &u64b) + require.NoError(t, err) + require.Equal(t, uint64(8), n) + require.Equal(t, u64, u64b) + + var i8 int8 = 0x69 + d = SerializeAtomic(i8) + var i8b int8 + n, err = DeserializeAtomic(d, &i8b) + require.NoError(t, err) + require.Equal(t, uint64(1), n) + require.Equal(t, i8, i8b) + + var i16 int16 = 0x6920 + d = SerializeAtomic(i16) + var i16b int16 + n, err = DeserializeAtomic(d, &i16b) + require.NoError(t, err) + require.Equal(t, uint64(2), n) + require.Equal(t, i16, i16b) + + var i32 int32 = 0x1809F720 + d = SerializeAtomic(i32) + var i32b int32 + n, err = DeserializeAtomic(d, &i32b) + require.NoError(t, err) + require.Equal(t, uint64(4), n) + require.Equal(t, i32, i32b) + + var i64 int64 = 0x000C8A9E1809F720 + d = SerializeAtomic(i64) + var i64b int64 + n, err = DeserializeAtomic(d, &i64b) + require.NoError(t, err) + require.Equal(t, uint64(8), n) + require.Equal(t, i64, i64b) +} + +type TestStruct5a struct { + Test uint64 +} + +func TestSerializeAtomicPanics(t *testing.T) { + var x float32 + require.PanicsWithValue(t, "SerializeAtomic unhandled type", func() { + SerializeAtomic(x) + }) + + var tst TestStruct5a + require.PanicsWithValue(t, "SerializeAtomic unhandled type", func() { + SerializeAtomic(&tst) + }) + require.PanicsWithValue(t, "SerializeAtomic unhandled type", func() { + SerializeAtomic(tst) + }) +} + +func TestDeserializeAtomicPanics(t *testing.T) { + var y int8 + require.PanicsWithValue(t, "DeserializeAtomic unhandled type", func() { + _, _ = DeserializeAtomic(nil, y) //nolint:errcheck + }) + + var x float32 + require.PanicsWithValue(t, "DeserializeAtomic unhandled type", func() { + _, _ = DeserializeAtomic(nil, &x) //nolint:errcheck + }) + + var tst TestStruct5a + d := make([]byte, 8) + require.PanicsWithValue(t, "DeserializeAtomic unhandled type", func() { + _, _ = DeserializeAtomic(d, &tst) //nolint:errcheck + }) +} + +func TestByteArray(t *testing.T) { + tstr := "7105a46cb4c2810f0c916e0bb4b4e4ef834ad42040c471b42c96d356a9fd1b21" + + d, err := hex.DecodeString(tstr) + require.NoError(t, err) + + buf := Serialize(d) + var buff2 [32]byte + copy(buff2[0:32], buf[0:32]) + + require.Equal(t, 32, len(buff2), "incorrect serialization length for fixed sized arrays: %d byte fixed sized array serialized to %d bytes", len(d), len(buff2)) +} + +func TestEncodeDictInt2Int(t *testing.T) { + m1 := map[uint8]uint64{0: 0, 1: 1, 2: 2} + buf := Serialize(m1) + require.Equal(t, len(buf), 4+(1+8)*len(m1)) + m2 := make(map[uint8]uint64) + n, err := DeserializeRaw(buf, m2) + require.NoError(t, err) + require.Equal(t, uint64(len(buf)), n) + + require.Equal(t, len(m1), len(m2), "Expected length %d but got %d", len(m1), len(m2)) + + for key := range m1 { + require.Equal(t, m1[key], m2[key], "Expected value %d for key %d but got %d", m1[key], key, m2[key]) + } +} + +type TestStructWithDict struct { + X int32 + Y int64 + M map[uint8]TestStruct + K []byte +} + +func TestEncodeDictNested(t *testing.T) { + s1 := TestStructWithDict{ + X: 0x01234567, + Y: 0x0123456789ABCDEF, + M: map[uint8]TestStruct{ + 0x01: TestStruct{ + X: 0x01234567, + Y: 0x0123456789ABCDEF, + Z: 0x01, + K: []byte{0, 1, 2}, + W: true, + T: "ab", + U: cipher.PubKey{ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + }, + }, + 0x23: TestStruct{ + X: 0x01234567, + Y: 0x0123456789ABCDEF, + Z: 0x01, + K: []byte{0, 1, 2}, + W: true, + T: "cd", + U: cipher.PubKey{ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + }, + }, + }, + K: []byte{0, 1, 2, 3, 4}, + } + buf := Serialize(s1) + require.NotEmpty(t, buf) + + s2 := TestStructWithDict{} + n, err := DeserializeRaw(buf, &s2) + require.NoError(t, err) + require.Equal(t, uint64(len(buf)), n) + + require.True(t, reflect.DeepEqual(s1, s2), "Expected %v but got %v", s1, s2) +} + +func TestEncodeDictString2Int64(t *testing.T) { + v := map[string]int64{ + "foo": 1, + "bar": 2, + } + + b := Serialize(v) + + v2 := make(map[string]int64) + n, err := DeserializeRaw(b, &v2) + require.NoError(t, err) + require.Equal(t, uint64(len(b)), n) + + require.Equal(t, v, v2) +} + +func TestOmitEmptyString(t *testing.T) { + + type omitString struct { + A string `enc:"a,omitempty"` + } + + cases := []struct { + name string + input omitString + outputShouldBeEmpty bool + }{ + { + name: "string not empty", + input: omitString{ + A: "foo", + }, + }, + + { + name: "string empty", + input: omitString{}, + outputShouldBeEmpty: true, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + b := Serialize(tc.input) + + if tc.outputShouldBeEmpty { + require.Empty(t, b) + } else { + require.NotEmpty(t, b) + } + + var y omitString + n, err := DeserializeRaw(b, &y) + require.NoError(t, err) + require.Equal(t, uint64(len(b)), n) + + require.Equal(t, tc.input, y) + }) + } + +} + +func TestOmitEmptySlice(t *testing.T) { + type omitSlice struct { + B []byte `enc:"b,omitempty"` + } + + cases := []struct { + name string + input omitSlice + expect *omitSlice + outputShouldBeEmpty bool + }{ + { + name: "slice not empty", + input: omitSlice{ + B: []byte("foo"), + }, + }, + + { + name: "slice nil", + input: omitSlice{}, + outputShouldBeEmpty: true, + }, + + { + name: "slice empty but not nil", + input: omitSlice{ + B: []byte{}, + }, + expect: &omitSlice{}, + outputShouldBeEmpty: true, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + b := Serialize(tc.input) + + if tc.outputShouldBeEmpty { + require.Empty(t, b) + } else { + require.NotEmpty(t, b) + } + + var y omitSlice + n, err := DeserializeRaw(b, &y) + require.NoError(t, err) + require.Equal(t, uint64(len(b)), n) + + expect := tc.expect + if expect == nil { + expect = &tc.input + } + + require.Equal(t, *expect, y) + }) + } +} + +func TestOmitEmptyMap(t *testing.T) { + + type omitMap struct { + C map[string]int64 `enc:"d,omitempty"` + } + + cases := []struct { + name string + input omitMap + expect *omitMap + outputShouldBeEmpty bool + }{ + { + name: "map not empty", + input: omitMap{ + C: map[string]int64{"foo": 1}, + }, + }, + + { + name: "map nil", + input: omitMap{}, + outputShouldBeEmpty: true, + }, + + { + name: "map empty but not nil", + input: omitMap{ + C: map[string]int64{}, + }, + expect: &omitMap{}, + outputShouldBeEmpty: true, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + b := Serialize(tc.input) + + if tc.outputShouldBeEmpty { + require.Empty(t, b) + } else { + require.NotEmpty(t, b) + } + + var y omitMap + n, err := DeserializeRaw(b, &y) + require.NoError(t, err) + require.Equal(t, uint64(len(b)), n) + + expect := tc.expect + if expect == nil { + expect = &tc.input + } + + require.Equal(t, *expect, y) + }) + } +} + +func TestOmitEmptyMixedFinalByte(t *testing.T) { + type omitMixed struct { + A string + B []byte `enc:",omitempty"` + } + + cases := []struct { + name string + input omitMixed + expect omitMixed + }{ + { + name: "none empty", + input: omitMixed{ + A: "foo", + B: []byte("foo"), + }, + expect: omitMixed{ + A: "foo", + B: []byte("foo"), + }, + }, + + { + name: "byte nil", + input: omitMixed{ + A: "foo", + }, + expect: omitMixed{ + A: "foo", + }, + }, + + { + name: "byte empty but not nil", + input: omitMixed{ + A: "foo", + B: []byte{}, + }, + expect: omitMixed{ + A: "foo", + }, + }, + + { + name: "first string empty but not omitted", + input: omitMixed{ + B: []byte("foo"), + }, + expect: omitMixed{ + B: []byte("foo"), + }, + }, + + { + name: "all empty", + input: omitMixed{}, + expect: omitMixed{}, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + b := Serialize(tc.input) + require.NotEmpty(t, b) + + var y omitMixed + n, err := DeserializeRaw(b, &y) + require.NoError(t, err) + require.Equal(t, uint64(len(b)), n) + + require.Equal(t, tc.expect, y) + }) + } +} + +func TestOmitEmptyFinalFieldOnly(t *testing.T) { + type bad struct { + A string + B string `enc:",omitempty"` + C string + } + + require.Panics(t, func() { + var b bad + Serialize(b) + }) +} + +func TestTagOmitempty(t *testing.T) { + cases := []struct { + tag string + omitempty bool + }{ + { + tag: "foo,omitempty", + omitempty: true, + }, + { + tag: "omitempty", + omitempty: false, + }, + { + tag: ",omitempty", + omitempty: true, + }, + { + tag: "", + omitempty: false, + }, + { + tag: "-", + omitempty: false, + }, + } + + for _, tc := range cases { + t.Run(tc.tag, func(t *testing.T) { + omitempty := TagOmitempty(tc.tag) + require.Equal(t, tc.omitempty, omitempty) + }) + } +} + +type primitiveInts struct { + A int8 + B uint8 + C int16 + D uint16 + E int32 + F uint32 + G int64 + H uint64 +} + +func TestPrimitiveInts(t *testing.T) { + cases := []struct { + name string + c primitiveInts + }{ + { + name: "all maximums", + c: primitiveInts{ + A: math.MaxInt8, + B: math.MaxUint8, + C: math.MaxInt16, + D: math.MaxUint16, + E: math.MaxInt32, + F: math.MaxUint32, + G: math.MaxInt64, + H: math.MaxUint64, + }, + }, + { + name: "negative integers", + c: primitiveInts{ + A: -99, + C: -99, + E: -99, + G: -99, + }, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + bytes := Serialize(tc.c) + require.NotEmpty(t, bytes) + + var obj primitiveInts + n, err := DeserializeRaw(bytes, &obj) + require.NoError(t, err) + require.Equal(t, uint64(len(bytes)), n) + require.Equal(t, tc.c, obj) + }) + } +} + +type hasEveryType struct { + A int8 + B int16 + C int32 + D int64 + E uint8 + F uint16 + G uint32 + H uint64 + I bool + J byte + K string + L []byte // slice, byte type + M []int64 // slice, non-byte type + N [3]byte // array, byte type + O [3]int64 // array, non-byte type + P struct { + A int8 + B uint16 + } // struct + Q map[string]string // map + R float32 + S float64 +} + +func TestEncodeStable(t *testing.T) { + // Tests encoding against previously encoded data on disk to verify + // that encoding results have not changed + update := false + + x := hasEveryType{ + A: -127, + B: math.MaxInt16, + C: math.MaxInt32, + D: math.MaxInt64, + E: math.MaxInt8 + 1, + F: math.MaxInt16 + 1, + G: math.MaxInt32 + 1, + H: math.MaxInt64 + 1, + I: true, + J: byte(128), + K: "foo", + L: []byte("bar"), + M: []int64{math.MaxInt64, math.MaxInt64 / 2, -10000}, + N: [3]byte{'b', 'a', 'z'}, + O: [3]int64{math.MaxInt64, math.MaxInt64 / 2, -10000}, + P: struct { + A int8 + B uint16 + }{ + A: -127, + B: math.MaxUint16, + }, + Q: map[string]string{"foo": "bar"}, + R: float32(123.45), + S: float64(123.45), + } + + goldenFile := "testdata/encode-every-type.golden" + + if update { + f, err := os.Create(goldenFile) + require.NoError(t, err) + defer f.Close() + + b := Serialize(x) + _, err = f.Write(b) + require.NoError(t, err) + return + } + + f, err := os.Open(goldenFile) + require.NoError(t, err) + defer f.Close() + + d, err := ioutil.ReadAll(f) + require.NoError(t, err) + + var y hasEveryType + n, err := DeserializeRaw(d, &y) + require.NoError(t, err) + require.Equal(t, uint64(len(d)), n) + require.Equal(t, x, y) + + b := Serialize(x) + require.Equal(t, len(d), len(b)) + require.Equal(t, d, b) +} + +func TestEncodeByteSlice(t *testing.T) { + type foo struct { + W int8 + X []byte + Y int8 // these are added to make sure extra fields don't interact with the byte encoding + } + + f := foo{ + W: 1, + X: []byte("abc"), + Y: 2, + } + + expect := []byte{1, 3, 0, 0, 0, 97, 98, 99, 2} + + b := Serialize(f) + require.Equal(t, expect, b) +} + +func TestEncodeByteArray(t *testing.T) { + type foo struct { + W int8 + X [3]byte + Y int8 // these are added to make sure extra fields don't interact with the byte encoding + } + + f := foo{ + W: 1, + X: [3]byte{'a', 'b', 'c'}, + Y: 2, + } + + expect := []byte{1, 97, 98, 99, 2} + + b := Serialize(f) + require.Equal(t, expect, b) +} + +func TestEncodeEmptySlice(t *testing.T) { + // Decoding an empty slice should not allocate + type foo struct { + X []byte + Y []int64 + } + + f := &foo{} + b := Serialize(f) + + var g foo + n, err := DeserializeRaw(b, &g) + require.NoError(t, err) + require.Equal(t, uint64(len(b)), n) + require.Nil(t, g.X) + require.Nil(t, g.Y) +} + +func TestRandomGarbage(t *testing.T) { + // Basic fuzz test to check for panics, deserializes random data + + // initialize the struct with data in the variable sized fields + x := hasEveryType{ + K: "string", + L: []byte("bar"), + M: []int64{math.MaxInt64, math.MaxInt64 / 2, -10000}, + Q: map[string]string{"foo": "bar", "cat": "dog"}, + } + + size := datasizeWrite(reflect.ValueOf(x)) + + var y hasEveryType + for j := 0; j < 100; j++ { + for i := uint64(0); i < size*2; i++ { + b := randBytes(t, i) + _, _ = DeserializeRaw(b, &y) //nolint:errcheck + } + } + + for i := 0; i < 10000; i++ { + b := randBytes(t, size) + _, _ = DeserializeRaw(b, &y) //nolint:errcheck + } +} + +func TestDeserializeRawBufferRemains(t *testing.T) { + x := hasEveryType{} + b := Serialize(x) + require.NotEmpty(t, b) + + b = append(b, make([]byte, 3)...) + var y hasEveryType + n, err := DeserializeRaw(b, &y) + require.NoError(t, err) + require.NotEmpty(t, n) + require.True(t, uint64(len(b)) > n) +} + +func TestDeserializeRawNotPointer(t *testing.T) { + x := hasEveryType{ + E: math.MaxInt8 + 1, + F: math.MaxInt16 + 1, + G: math.MaxInt32 + 1, + H: math.MaxInt64 + 1, + } + b := Serialize(x) + require.NotEmpty(t, b) + + var y hasEveryType + n, err := DeserializeRaw(b, y) + require.Equal(t, errors.New("DeserializeRaw value must be a ptr, is struct"), err) + require.Empty(t, n) + + a := []string{"foo", "bar", "baz"} + b = Serialize(a) + require.NotEmpty(t, b) + + aa := make([]string, 0) + n, err = DeserializeRaw(b, aa) + require.Equal(t, errors.New("DeserializeRaw value must be a ptr, is slice"), err) + require.Empty(t, n) + + m := map[string]int64{"foo": 32, "bar": 64} + b = Serialize(m) + require.NotEmpty(t, b) +} + +func TestDeserializeMaxLenExceeded(t *testing.T) { + // maxlen for strings + type Foo struct { + X string `enc:",maxlen=2"` + } + + b := Serialize(Foo{X: "foo"}) + require.NotEmpty(t, b) + + var f Foo + n, err := DeserializeRaw(b, &f) + require.Equal(t, ErrMaxLenExceeded, err) + require.Empty(t, n) + + g := Foo{X: "fo"} + b = Serialize(g) + require.NotEmpty(t, b) + + f = Foo{} + n, err = DeserializeRaw(b, &f) + require.NoError(t, err) + require.Equal(t, uint64(len(b)), n) + require.Equal(t, g, f) + + // maxlen for slices + type Bar struct { + X []string `enc:",maxlen=2"` + } + + b = Serialize(Bar{X: []string{"f", "o", "o"}}) + require.NotEmpty(t, b) + + var k Bar + n, err = DeserializeRaw(b, &k) + require.Equal(t, ErrMaxLenExceeded, err) + require.Empty(t, n) + + c := Bar{X: []string{"f", "o"}} + b = Serialize(c) + require.NotEmpty(t, b) + + k = Bar{} + n, err = DeserializeRaw(b, &k) + require.NoError(t, err) + require.Equal(t, uint64(len(b)), n) + require.Equal(t, c, k) + + // Invalid maxlen value panics + type Baz struct { + X string `enc:",maxlen=foo"` + } + + b = Serialize(Baz{X: "foo"}) + require.NotEmpty(t, b) + + var z Baz + require.Panics(t, func() { + _, _ = DeserializeRaw(b, &z) //nolint:errcheck + }) + + // maxlen for final omitempty byte array + type Car struct { + X string + Y []byte `enc:",omitempty,maxlen=2"` + } + + car := Car{ + X: "foo", + Y: []byte("foo"), + } + b = Serialize(car) + require.NotEmpty(t, b) + + var w Car + n, err = DeserializeRaw(b, &w) + require.Equal(t, ErrMaxLenExceeded, err) + require.Empty(t, n) + + v := Car{ + X: "foo", + Y: []byte("fo"), + } + b = Serialize(v) + require.NotEmpty(t, b) + + w = Car{} + n, err = DeserializeRaw(b, &w) + require.NoError(t, err) + require.Equal(t, uint64(len(b)), n) + require.Equal(t, v, w) +} + +func TestSerializeString(t *testing.T) { + cases := []struct { + s string + x []byte + }{ + { + s: "", + x: []byte{0, 0, 0, 0}, + }, + { + s: "foo", + x: []byte{3, 0, 0, 0, 'f', 'o', 'o'}, + }, + } + + for _, tc := range cases { + t.Run(tc.s, func(t *testing.T) { + require.Equal(t, tc.x, SerializeString(tc.s)) + }) + } +} + +func TestDeserializeString(t *testing.T) { + cases := []struct { + s string + x []byte + n uint64 + maxLen int + err error + }{ + { + s: "", + x: []byte{0, 0, 0, 0}, + n: 4, + }, + { + s: "foo", + x: []byte{3, 0, 0, 0, 'f', 'o', 'o'}, + n: 7, + }, + { + x: []byte{3, 0, 0}, + err: ErrBufferUnderflow, + }, + { + x: nil, + err: ErrBufferUnderflow, + }, + { + x: []byte{3, 0, 0, 0, 'f'}, + err: ErrBufferUnderflow, + }, + { + s: "foo", + x: []byte{3, 0, 0, 0, 'f', 'o', 'o', 'x'}, + n: 7, + }, + { + s: "foo", + x: []byte{3, 0, 0, 0, 'f', 'o', 'o', 'x'}, + maxLen: 2, + err: ErrMaxLenExceeded, + }, + { + s: "foo", + x: []byte{3, 0, 0, 0, 'f', 'o', 'o', 'x'}, + maxLen: 3, + n: 7, + }, + } + + for _, tc := range cases { + t.Run(fmt.Sprintf("s=%s err=%v", tc.s, tc.err), func(t *testing.T) { + s, n, err := DeserializeString(tc.x, tc.maxLen) + if tc.err != nil { + require.Equal(t, tc.err, err) + require.Equal(t, tc.n, n) + return + } + + require.NoError(t, err) + require.Equal(t, tc.s, s) + require.Equal(t, tc.n, n) + }) + } +} + +func TestSerializeUint32(t *testing.T) { + cases := []struct { + x uint32 + }{ + { + x: 0, + }, + { + x: 1, + }, + { + x: 0xFF, + }, + { + x: 0xFFFF, + }, + { + x: 0xFFFFFF, + }, + { + x: 0xFFFFFFFF, + }, + { + x: math.MaxUint32, + }, + } + + for _, tc := range cases { + t.Run(fmt.Sprint(tc.x), func(t *testing.T) { + b := SerializeUint32(tc.x) + y, n, err := DeserializeUint32(b) + require.NoError(t, err) + require.Equal(t, uint64(4), n) + require.Equal(t, tc.x, y) + }) + } + + _, _, err := DeserializeUint32(make([]byte, 3)) + require.Equal(t, ErrBufferUnderflow, err) + + y, n, err := DeserializeUint32([]byte{1, 0, 0, 0, 0}) + require.NoError(t, err) + require.Equal(t, uint64(4), n) + require.Equal(t, uint32(1), y) +} + +type BoolStruct struct { + B bool +} + +func TestEncodeBool(t *testing.T) { + bt := BoolStruct{ + B: true, + } + bf := BoolStruct{ + B: false, + } + + buf := Serialize(bt) + require.Equal(t, 1, len(buf)) + require.Equal(t, byte(1), buf[0]) + + var bb BoolStruct + n, err := DeserializeRaw(buf, &bb) + require.NoError(t, err) + require.Equal(t, uint64(len(buf)), n) + require.True(t, bb.B) + + buf = Serialize(bf) + require.Equal(t, 1, len(buf)) + require.Equal(t, byte(0), buf[0]) + + require.True(t, bb.B) + n, err = DeserializeRaw(buf, &bb) + require.NoError(t, err) + require.Equal(t, uint64(len(buf)), n) + require.False(t, bb.B) + + buf = []byte{2} + n, err = DeserializeRaw(buf, &bb) + require.Equal(t, ErrInvalidBool, err) + require.Empty(t, n) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/041b1e464b2ba38e33a5351a0a1e44224d8009c3-6 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/041b1e464b2ba38e33a5351a0a1e44224d8009c3-6 new file mode 100644 index 00000000..e8f784e4 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/041b1e464b2ba38e33a5351a0a1e44224d8009c3-6 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/077dc23e8eb7e862e73b328d31933197c811c649-15 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/077dc23e8eb7e862e73b328d31933197c811c649-15 new file mode 100644 index 00000000..9a318316 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/077dc23e8eb7e862e73b328d31933197c811c649-15 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/089fa205b8b7238fa0c53ff2ee37eea31cc96cf0-5 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/089fa205b8b7238fa0c53ff2ee37eea31cc96cf0-5 new file mode 100644 index 00000000..eef4e6b5 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/089fa205b8b7238fa0c53ff2ee37eea31cc96cf0-5 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/0bcb8572beb6f78163173d22d05d0b829eeb8536-9 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/0bcb8572beb6f78163173d22d05d0b829eeb8536-9 new file mode 100644 index 00000000..911a6ea2 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/0bcb8572beb6f78163173d22d05d0b829eeb8536-9 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/0ce250a330a226ac76e02b62fe67b2a5d4453768-9 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/0ce250a330a226ac76e02b62fe67b2a5d4453768-9 new file mode 100644 index 00000000..35b02107 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/0ce250a330a226ac76e02b62fe67b2a5d4453768-9 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/0e2c5892a020afbfb4c69e6b3fbf62611894cbd3-5 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/0e2c5892a020afbfb4c69e6b3fbf62611894cbd3-5 new file mode 100644 index 00000000..e29da459 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/0e2c5892a020afbfb4c69e6b3fbf62611894cbd3-5 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/136480971168a1f51c8771dca4f98ec33b45ebed-19 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/136480971168a1f51c8771dca4f98ec33b45ebed-19 new file mode 100644 index 00000000..0f911d18 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/136480971168a1f51c8771dca4f98ec33b45ebed-19 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/1872c242562f8c741cb523f7a8c67d1a6cbf6114-14 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/1872c242562f8c741cb523f7a8c67d1a6cbf6114-14 new file mode 100644 index 00000000..2a0e9ea6 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/1872c242562f8c741cb523f7a8c67d1a6cbf6114-14 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/1ccc50005fac8ad75770f8c59bd85ba9f732f4f9-2 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/1ccc50005fac8ad75770f8c59bd85ba9f732f4f9-2 new file mode 100644 index 00000000..0f7697e9 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/1ccc50005fac8ad75770f8c59bd85ba9f732f4f9-2 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/2531e551ac6da0b5a8aa9a7be236f6c28f10fc86-8 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/2531e551ac6da0b5a8aa9a7be236f6c28f10fc86-8 new file mode 100644 index 00000000..fabd306c Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/2531e551ac6da0b5a8aa9a7be236f6c28f10fc86-8 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/26f7b389dbc8fa0cba8e06dfec8119ab38b7169e-7 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/26f7b389dbc8fa0cba8e06dfec8119ab38b7169e-7 new file mode 100644 index 00000000..8e048ff1 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/26f7b389dbc8fa0cba8e06dfec8119ab38b7169e-7 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/2749b52ac05c6a17cff3b18309e67797a6e4eb23-8 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/2749b52ac05c6a17cff3b18309e67797a6e4eb23-8 new file mode 100644 index 00000000..4c4f3c47 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/2749b52ac05c6a17cff3b18309e67797a6e4eb23-8 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/29506ec6042c7ad6d573cc04fa6f5326d72393b1-4 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/29506ec6042c7ad6d573cc04fa6f5326d72393b1-4 new file mode 100644 index 00000000..7a94c9af Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/29506ec6042c7ad6d573cc04fa6f5326d72393b1-4 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/2970bf40d22e53690825af48f0c5a2d207d6dc35-10 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/2970bf40d22e53690825af48f0c5a2d207d6dc35-10 new file mode 100644 index 00000000..d7ba7eeb Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/2970bf40d22e53690825af48f0c5a2d207d6dc35-10 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/2ccb8d1be0035433d872c000bbc2939790bda364-8 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/2ccb8d1be0035433d872c000bbc2939790bda364-8 new file mode 100644 index 00000000..09738943 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/2ccb8d1be0035433d872c000bbc2939790bda364-8 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/32fb84cb7eaa06c2e2df5fadc878538d31fbee4d-8 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/32fb84cb7eaa06c2e2df5fadc878538d31fbee4d-8 new file mode 100644 index 00000000..33907755 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/32fb84cb7eaa06c2e2df5fadc878538d31fbee4d-8 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/3336f9e174fe5c484c9db9c7e9886f42f88161c0-6 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/3336f9e174fe5c484c9db9c7e9886f42f88161c0-6 new file mode 100644 index 00000000..684750d9 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/3336f9e174fe5c484c9db9c7e9886f42f88161c0-6 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/33af649be84c4dae0f2f55db97dd4de0a73d655e-15 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/33af649be84c4dae0f2f55db97dd4de0a73d655e-15 new file mode 100644 index 00000000..b039f374 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/33af649be84c4dae0f2f55db97dd4de0a73d655e-15 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/33c24c3476c3f9c874372c21a171b8fbacf3bcea-2 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/33c24c3476c3f9c874372c21a171b8fbacf3bcea-2 new file mode 100644 index 00000000..d5ec52aa Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/33c24c3476c3f9c874372c21a171b8fbacf3bcea-2 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/35539f3efc6318e51ba224be44807d0efbb7059b-7 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/35539f3efc6318e51ba224be44807d0efbb7059b-7 new file mode 100644 index 00000000..dc802438 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/35539f3efc6318e51ba224be44807d0efbb7059b-7 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/37338dc621d742a5c9d05865df851c9e39913bba-6 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/37338dc621d742a5c9d05865df851c9e39913bba-6 new file mode 100644 index 00000000..7ff6b438 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/37338dc621d742a5c9d05865df851c9e39913bba-6 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/3a51db55e30887d6f3fe57ae7e762b99f3b904d2-9 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/3a51db55e30887d6f3fe57ae7e762b99f3b904d2-9 new file mode 100644 index 00000000..4481e38f Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/3a51db55e30887d6f3fe57ae7e762b99f3b904d2-9 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/3b8fee13e7d43ef5ee563571f37558527352cc2f-9 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/3b8fee13e7d43ef5ee563571f37558527352cc2f-9 new file mode 100644 index 00000000..38d11be2 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/3b8fee13e7d43ef5ee563571f37558527352cc2f-9 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/420b9123c6f5e27a4b70457d2896711648f32587-9 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/420b9123c6f5e27a4b70457d2896711648f32587-9 new file mode 100644 index 00000000..d4120772 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/420b9123c6f5e27a4b70457d2896711648f32587-9 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/4687701f52eb1ebf05ba1c5e511f0e3d3e9ec85a-13 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/4687701f52eb1ebf05ba1c5e511f0e3d3e9ec85a-13 new file mode 100644 index 00000000..cc08cc84 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/4687701f52eb1ebf05ba1c5e511f0e3d3e9ec85a-13 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/4e29838ae6ef4fe445ac868b22e9110a55a5e45d-4 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/4e29838ae6ef4fe445ac868b22e9110a55a5e45d-4 new file mode 100644 index 00000000..0375ef41 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/4e29838ae6ef4fe445ac868b22e9110a55a5e45d-4 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/4f7355e86769b5de8a676a0d6eb689cff5c86a73-8 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/4f7355e86769b5de8a676a0d6eb689cff5c86a73-8 new file mode 100644 index 00000000..320c142e Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/4f7355e86769b5de8a676a0d6eb689cff5c86a73-8 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/503360a5973eb6690b249de0dcae67234dec5ebc-18 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/503360a5973eb6690b249de0dcae67234dec5ebc-18 new file mode 100644 index 00000000..d5cdc3ee Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/503360a5973eb6690b249de0dcae67234dec5ebc-18 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/549736bf7e173f6fce9fdbd4541f9edfff6946e7-11 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/549736bf7e173f6fce9fdbd4541f9edfff6946e7-11 new file mode 100644 index 00000000..694e8774 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/549736bf7e173f6fce9fdbd4541f9edfff6946e7-11 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/56f670c79df3276598ffdf7bb96f19790f0ca91a-16 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/56f670c79df3276598ffdf7bb96f19790f0ca91a-16 new file mode 100644 index 00000000..93d3a0d2 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/56f670c79df3276598ffdf7bb96f19790f0ca91a-16 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/5be6cccdfa04fc4b82c64c7645ee6a674d7c4e92-5 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/5be6cccdfa04fc4b82c64c7645ee6a674d7c4e92-5 new file mode 100644 index 00000000..a0900da0 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/5be6cccdfa04fc4b82c64c7645ee6a674d7c4e92-5 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/5fac2f16b26878136ec3590108d5037e25d0670b-4 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/5fac2f16b26878136ec3590108d5037e25d0670b-4 new file mode 100644 index 00000000..7d8558f2 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/5fac2f16b26878136ec3590108d5037e25d0670b-4 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/6187cd16bd7e898a241ab9da57c48d47a9cc0c51-10 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/6187cd16bd7e898a241ab9da57c48d47a9cc0c51-10 new file mode 100644 index 00000000..c5a80e39 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/6187cd16bd7e898a241ab9da57c48d47a9cc0c51-10 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/64321c57e11b3301c331fb0944ce5da1b2a6da30-7 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/64321c57e11b3301c331fb0944ce5da1b2a6da30-7 new file mode 100644 index 00000000..27ebe25e Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/64321c57e11b3301c331fb0944ce5da1b2a6da30-7 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/66bc94bc50bd9e1e0154f3f9159b51c3afc65a6d-17 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/66bc94bc50bd9e1e0154f3f9159b51c3afc65a6d-17 new file mode 100644 index 00000000..049a3ce6 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/66bc94bc50bd9e1e0154f3f9159b51c3afc65a6d-17 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/68ae7e24181f8835ab699edb50a469edb5a7e639-1 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/68ae7e24181f8835ab699edb50a469edb5a7e639-1 new file mode 100644 index 00000000..a49515a5 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/68ae7e24181f8835ab699edb50a469edb5a7e639-1 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/69a32273a7f7947656fc987a6ed63ea2f840eccc-1 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/69a32273a7f7947656fc987a6ed63ea2f840eccc-1 new file mode 100644 index 00000000..0221d7a2 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/69a32273a7f7947656fc987a6ed63ea2f840eccc-1 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/6c509c4d239263ccb5763cfadea9a623cc7fba78-3 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/6c509c4d239263ccb5763cfadea9a623cc7fba78-3 new file mode 100644 index 00000000..783ddfbe Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/6c509c4d239263ccb5763cfadea9a623cc7fba78-3 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/6ef7698bc2ff390365fdd219ff89238427d880b0-4 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/6ef7698bc2ff390365fdd219ff89238427d880b0-4 new file mode 100644 index 00000000..fb1ecfec Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/6ef7698bc2ff390365fdd219ff89238427d880b0-4 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/758131515c424fa182cf4c5a3913daffeff757f9-15 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/758131515c424fa182cf4c5a3913daffeff757f9-15 new file mode 100644 index 00000000..eef3cc0b Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/758131515c424fa182cf4c5a3913daffeff757f9-15 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/7a9ce113e3f8e9a032f51e42b73febfa0c88102e-7 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/7a9ce113e3f8e9a032f51e42b73febfa0c88102e-7 new file mode 100644 index 00000000..b8535fb6 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/7a9ce113e3f8e9a032f51e42b73febfa0c88102e-7 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/7e084c67224f01361d2ebbe58842ec7c0374e687-11 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/7e084c67224f01361d2ebbe58842ec7c0374e687-11 new file mode 100644 index 00000000..094ed574 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/7e084c67224f01361d2ebbe58842ec7c0374e687-11 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/80264feff826888953082aa7e15c0ac885f9e599-14 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/80264feff826888953082aa7e15c0ac885f9e599-14 new file mode 100644 index 00000000..958026c0 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/80264feff826888953082aa7e15c0ac885f9e599-14 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/860ce68c0e8febf9c801982f06471d4382198983-20 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/860ce68c0e8febf9c801982f06471d4382198983-20 new file mode 100644 index 00000000..7034a9ca Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/860ce68c0e8febf9c801982f06471d4382198983-20 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/8a68666cb26cbc69b5e00716d6ff155b340c058c-4 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/8a68666cb26cbc69b5e00716d6ff155b340c058c-4 new file mode 100644 index 00000000..7f1f07c2 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/8a68666cb26cbc69b5e00716d6ff155b340c058c-4 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/8caf69f543d97113462f8b4c5f036e06bb9b672f-17 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/8caf69f543d97113462f8b4c5f036e06bb9b672f-17 new file mode 100644 index 00000000..c4f92a6a Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/8caf69f543d97113462f8b4c5f036e06bb9b672f-17 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/9069ca78e7450a285173431b3e52c5c25299e473 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/9069ca78e7450a285173431b3e52c5c25299e473 new file mode 100644 index 00000000..593f4708 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/9069ca78e7450a285173431b3e52c5c25299e473 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/9449700da8e8e406ff4c6c4db21ed97e251db2a5-2 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/9449700da8e8e406ff4c6c4db21ed97e251db2a5-2 new file mode 100644 index 00000000..9f9b6705 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/9449700da8e8e406ff4c6c4db21ed97e251db2a5-2 @@ -0,0 +1 @@ +^A¡é \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/95514c598a7891b09f368766d1533d7e66113639-9 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/95514c598a7891b09f368766d1533d7e66113639-9 new file mode 100644 index 00000000..4523681b Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/95514c598a7891b09f368766d1533d7e66113639-9 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/9904b7300bd20f370a99fb47411a7aa0a4fc0745-7 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/9904b7300bd20f370a99fb47411a7aa0a4fc0745-7 new file mode 100644 index 00000000..6d4c904f Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/9904b7300bd20f370a99fb47411a7aa0a4fc0745-7 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/9d4cf58e90324733edca6e1b934e35f73d1ebea6-15 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/9d4cf58e90324733edca6e1b934e35f73d1ebea6-15 new file mode 100644 index 00000000..c19b60f1 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/9d4cf58e90324733edca6e1b934e35f73d1ebea6-15 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/9de6f2bbd4635419b74ed98081097765b68982fe-1 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/9de6f2bbd4635419b74ed98081097765b68982fe-1 new file mode 100644 index 00000000..0073e64b Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/9de6f2bbd4635419b74ed98081097765b68982fe-1 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/a06c8725aa396d2dee53394f1f1a07cfae073a56-7 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/a06c8725aa396d2dee53394f1f1a07cfae073a56-7 new file mode 100644 index 00000000..f63b214b Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/a06c8725aa396d2dee53394f1f1a07cfae073a56-7 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/a1133dacbc19a4b3f59434944387897107e5ab09-17 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/a1133dacbc19a4b3f59434944387897107e5ab09-17 new file mode 100644 index 00000000..2dbdcf14 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/a1133dacbc19a4b3f59434944387897107e5ab09-17 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/a14e6c14df85b1a05934e56f9dbb8adc194cf726-3 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/a14e6c14df85b1a05934e56f9dbb8adc194cf726-3 new file mode 100644 index 00000000..6953a7d0 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/a14e6c14df85b1a05934e56f9dbb8adc194cf726-3 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/a1c39fcf65469e76790a0e15bf52ae8b44567f5c-12 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/a1c39fcf65469e76790a0e15bf52ae8b44567f5c-12 new file mode 100644 index 00000000..7ed6e302 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/a1c39fcf65469e76790a0e15bf52ae8b44567f5c-12 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/a2accc510a183328ff269a3487e16ce54714ed9f-6 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/a2accc510a183328ff269a3487e16ce54714ed9f-6 new file mode 100644 index 00000000..6aedc9df Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/a2accc510a183328ff269a3487e16ce54714ed9f-6 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/a9935fff6d379203b62e011d39c85c69ab90bc25-13 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/a9935fff6d379203b62e011d39c85c69ab90bc25-13 new file mode 100644 index 00000000..684cc050 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/a9935fff6d379203b62e011d39c85c69ab90bc25-13 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/abe8937a39c3413fda2387eb5356a0b9eaf4ea7b-13 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/abe8937a39c3413fda2387eb5356a0b9eaf4ea7b-13 new file mode 100644 index 00000000..b45e6627 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/abe8937a39c3413fda2387eb5356a0b9eaf4ea7b-13 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/aef89a58363b964551a5f544be9c804e3fd53bd5-6 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/aef89a58363b964551a5f544be9c804e3fd53bd5-6 new file mode 100644 index 00000000..bb5c4597 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/aef89a58363b964551a5f544be9c804e3fd53bd5-6 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/b041a0b90d9bc8c74a1cd879d336bb8204d10efc-14 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/b041a0b90d9bc8c74a1cd879d336bb8204d10efc-14 new file mode 100644 index 00000000..80e75820 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/b041a0b90d9bc8c74a1cd879d336bb8204d10efc-14 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/b1b97c4860bd6b45e2a168e27018032a6327126f-13 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/b1b97c4860bd6b45e2a168e27018032a6327126f-13 new file mode 100644 index 00000000..85ef4c70 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/b1b97c4860bd6b45e2a168e27018032a6327126f-13 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/bf4b7e1d763d79835646d84b3e06b09be39fd40e-4 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/bf4b7e1d763d79835646d84b3e06b09be39fd40e-4 new file mode 100644 index 00000000..4726ba6a Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/bf4b7e1d763d79835646d84b3e06b09be39fd40e-4 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/c03f33b370fee562858b596818280c41f03fbe9a-1 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/c03f33b370fee562858b596818280c41f03fbe9a-1 new file mode 100644 index 00000000..fd52921f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/c03f33b370fee562858b596818280c41f03fbe9a-1 @@ -0,0 +1 @@ +^A¡éw»‘õª[q \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/c52fe64291e1edc6709766b184bc55b4ae5c3bf5-1 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/c52fe64291e1edc6709766b184bc55b4ae5c3bf5-1 new file mode 100644 index 00000000..92c09b6f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/c52fe64291e1edc6709766b184bc55b4ae5c3bf5-1 @@ -0,0 +1 @@ +J:;© \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/caf902d1a7d48dc4474b888739e8ebf6bb4e4d21-8 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/caf902d1a7d48dc4474b888739e8ebf6bb4e4d21-8 new file mode 100644 index 00000000..d50f2cd0 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/caf902d1a7d48dc4474b888739e8ebf6bb4e4d21-8 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/cf886c5afb98cd7ca1a40b2abdc7875aa84b231d-9 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/cf886c5afb98cd7ca1a40b2abdc7875aa84b231d-9 new file mode 100644 index 00000000..821d7d75 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/cf886c5afb98cd7ca1a40b2abdc7875aa84b231d-9 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/d1d44dee03fb91be62e28827941afc04cb268057-8 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/d1d44dee03fb91be62e28827941afc04cb268057-8 new file mode 100644 index 00000000..23bf7043 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/d1d44dee03fb91be62e28827941afc04cb268057-8 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/d71a8731a29c71e5ef7bcd09c0731cfcea3b0195-9 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/d71a8731a29c71e5ef7bcd09c0731cfcea3b0195-9 new file mode 100644 index 00000000..c3be57c8 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/d71a8731a29c71e5ef7bcd09c0731cfcea3b0195-9 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/d7bd05d8b31190fb1beea885eb5766671cb5189a-2 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/d7bd05d8b31190fb1beea885eb5766671cb5189a-2 new file mode 100644 index 00000000..f3acdb76 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/d7bd05d8b31190fb1beea885eb5766671cb5189a-2 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/da39a3ee5e6b4b0d3255bfef95601890afd80709 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/da39a3ee5e6b4b0d3255bfef95601890afd80709 new file mode 100644 index 00000000..e69de29b diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/da6d6d7bd15a8a5eb93bdc25d79239aed62c2a89-14 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/da6d6d7bd15a8a5eb93bdc25d79239aed62c2a89-14 new file mode 100644 index 00000000..afb52fff Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/da6d6d7bd15a8a5eb93bdc25d79239aed62c2a89-14 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/e1023efdabed24a21bbee19f16d38b849462102d-14 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/e1023efdabed24a21bbee19f16d38b849462102d-14 new file mode 100644 index 00000000..7611e555 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/e1023efdabed24a21bbee19f16d38b849462102d-14 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/e3e1ce0d82369c7c4d77b97bbb36adb219301aaa-11 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/e3e1ce0d82369c7c4d77b97bbb36adb219301aaa-11 new file mode 100644 index 00000000..d90bee4a Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/e3e1ce0d82369c7c4d77b97bbb36adb219301aaa-11 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/e8a40e28e25690d4a7845adb423069822d20d9bf-11 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/e8a40e28e25690d4a7845adb423069822d20d9bf-11 new file mode 100644 index 00000000..9bdb13b1 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/e8a40e28e25690d4a7845adb423069822d20d9bf-11 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/ead0c77c531dc48ef7cb0e40ed5994b44bdd8351-18 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/ead0c77c531dc48ef7cb0e40ed5994b44bdd8351-18 new file mode 100644 index 00000000..4e396484 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/ead0c77c531dc48ef7cb0e40ed5994b44bdd8351-18 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/ebfcdfbcdaa26064949184656376fb0e677dcece-6 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/ebfcdfbcdaa26064949184656376fb0e677dcece-6 new file mode 100644 index 00000000..60d6f231 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/ebfcdfbcdaa26064949184656376fb0e677dcece-6 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/f3fb81782fdc71e47477802945ee2b84e0faaa20-12 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/f3fb81782fdc71e47477802945ee2b84e0faaa20-12 new file mode 100644 index 00000000..a672d01a Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/f3fb81782fdc71e47477802945ee2b84e0faaa20-12 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/f68374cd8433a09a006c2d80655691171a5141c9-15 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/f68374cd8433a09a006c2d80655691171a5141c9-15 new file mode 100644 index 00000000..09a899cc Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/f68374cd8433a09a006c2d80655691171a5141c9-15 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/f793d6352b6d0d92c21660b6ff5c39bd628abad8-5 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/f793d6352b6d0d92c21660b6ff5c39bd628abad8-5 new file mode 100644 index 00000000..a691c22c Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/f793d6352b6d0d92c21660b6ff5c39bd628abad8-5 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/f7e04d0cfa0a3d927efc18ae1e7a1f73abb337cc-7 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/f7e04d0cfa0a3d927efc18ae1e7a1f73abb337cc-7 new file mode 100644 index 00000000..e5658522 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/f7e04d0cfa0a3d927efc18ae1e7a1f73abb337cc-7 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/f82afcaf7653e5248862ce80ca989b2b2bceafe6-16 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/f82afcaf7653e5248862ce80ca989b2b2bceafe6-16 new file mode 100644 index 00000000..f657eaed Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/f82afcaf7653e5248862ce80ca989b2b2bceafe6-16 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/fa57b5d7162c57a67c550c57e8d7ff4d2502f9ad-15 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/fa57b5d7162c57a67c550c57e8d7ff4d2502f9ad-15 new file mode 100644 index 00000000..a141224c Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/fa57b5d7162c57a67c550c57e8d7ff4d2502f9ad-15 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/fb348445b6108e2ae34d45d161e19de632a3ef8a-9 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/fb348445b6108e2ae34d45d161e19de632a3ef8a-9 new file mode 100644 index 00000000..7156c278 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/fb348445b6108e2ae34d45d161e19de632a3ef8a-9 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/fcf3b78f943921415f4dfa801a1ac48d7a0b896f-12 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/fcf3b78f943921415f4dfa801a1ac48d7a0b896f-12 new file mode 100644 index 00000000..29f88bd4 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/fcf3b78f943921415f4dfa801a1ac48d7a0b896f-12 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/fe4236573e1ab50aa1ce65ac96905533eb03e0d2-5 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/fe4236573e1ab50aa1ce65ac96905533eb03e0d2-5 new file mode 100644 index 00000000..bdb7574a Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/fe4236573e1ab50aa1ce65ac96905533eb03e0d2-5 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/ffc89ebf75eda9a93566a2227bded8b2c23971b0-4 b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/ffc89ebf75eda9a93566a2227bded8b2c23971b0-4 new file mode 100644 index 00000000..eed51ae8 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/ffc89ebf75eda9a93566a2227bded8b2c23971b0-4 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/thing.serialized b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/thing.serialized new file mode 100644 index 00000000..967da0b5 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/thing.serialized differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/thing2.serialized b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/thing2.serialized new file mode 100644 index 00000000..28a052e6 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/thing2.serialized differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/thing3.serialized b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/thing3.serialized new file mode 100644 index 00000000..f6ea45fd Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/corpus/thing3.serialized differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/encoderfuzz.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/encoderfuzz.go new file mode 100644 index 00000000..3bd6c7c5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/internal/encoderfuzz.go @@ -0,0 +1,94 @@ +package encoderfuzz + +import ( + "fmt" + + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +// To use the fuzzer: +// Follow the install instructions from https://github.com/dvyukov/go-fuzz +// Then, from the repo root, +// $ go-fuzz-build github.com/SkycoinProject/skycoin/src/cipher/encoder/internal +// This creates a file encoderfuzz-fuzz.zip +// Then, +// $ go-fuzz -bin=encoderfuzz-fuzz.zip -workdir=src/cipher/encoder/internal +// New corpus and crash objects will be put in src/cipher/encoder/internal + +type thing struct { + X uint8 `enc:"-"` + A int8 + B uint32 + T innerThing + M map[uint64]int64 + F uint16 + G int16 + H []innerThing + Z []byte `enc:",omitempty"` +} + +type innerThing struct { + A [2]byte + C string `enc:",maxlen=128"` +} + +// Fuzz is the entrypoint for go-fuzz +func Fuzz(b []byte) int { + buf := encoder.SerializeString(string(b)) + if buf == nil { + panic("SerializeString buf == nil") + } + + s, x, errA := encoder.DeserializeString(b, 8) + if errA == nil { + if x != uint64(len(s)+4) { + panic(fmt.Sprintf("DeserializeString x != len(s) + 4 (%d = %d, %q)", x, len(s)+4, s)) + } + } + + var v uint32 + n, errB := encoder.DeserializeAtomic(b, &v) + if errB == nil { + if n != 4 { + panic("DeserializeAtomic uint32 n bytes read is not 4") + } + } + + var t thing + errC := encoder.DeserializeRawExact(b, &t) + + if errA == nil || errB == nil || errC == nil { + return 1 + } + + return 0 +} + +// Uncomment and change package name to "main", then "go run" this to write a serialized "thing" +// func main() { +// x := thing{ +// A: 12, +// B: 0xFF33AA01, +// T: innerThing{ +// A: [2]byte{0x40, 0xF7}, +// C: "foo", +// }, +// // M: map[uint64]int64{0x00FF134444: -1234567}, +// F: 0xAA11, +// G: -1000, +// H: []innerThing{{ +// A: [2]byte{0x01, 0x02}, +// C: "", +// }}, +// } + +// byt := encoder.Serialize(x) + +// f, err := os.Create("thing3.serialized") +// if err != nil { +// panic(err) +// } +// defer f.Close() + +// f.Write(byt) +// } diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/testdata/encode-every-type.golden b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/testdata/encode-every-type.golden new file mode 100644 index 00000000..46f83bdb Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encoder/testdata/encode-every-type.golden differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encrypt/scrypt_chacha20poly1305.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encrypt/scrypt_chacha20poly1305.go new file mode 100644 index 00000000..d594d899 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encrypt/scrypt_chacha20poly1305.go @@ -0,0 +1,171 @@ +/* +Package encrypt provides encryption methods. + +Encryption methods provided: + +* chacha20-poly1305 with scrypt key derivation +* sha256xor with sha256 key derivation + +The latter is insecure due to the insecure key derivation so should not be used. +The keys are easily brute forced. + +These methods are design for long-term (3-5 years) encryption of disk-persisted data. +They are not designed for network traffic encryption. +*/ +package encrypt + +import ( + "encoding/base64" + "encoding/binary" + "encoding/json" + "errors" + "math" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/chacha20poly1305" + "github.com/SkycoinProject/skycoin/src/cipher/scrypt" +) + +const ( + scryptChacha20MetaLengthSize = 2 // meta data length field size in bytes + scryptChacha20SaltSize = 32 // salt bytes number +) + +// Default scrypt paramenters +const ( + // ScryptN: scrypt N paramenter. 1<<20 is the recommended value for file encryption, it takes about 3 seconds in 2.9 GHz Intel core i7. + ScryptN = 1 << 20 + // ScryptR: scrypt r paramenter. Cache line size have not significantly increased since 2009, 8 should still be optimal for r. + ScryptR = 8 + // ScryptP: scrypt p paramenter. The parallel difficulty, 1 is still optimal. + ScryptP = 1 + // ScryptKeyLen: The length of returned byte slice that can be used as cryptographic key. + ScryptKeyLen = 32 +) + +// DefaultScryptChacha20poly1305 default ScryptChacha20poly1305 encryptor +var DefaultScryptChacha20poly1305 = ScryptChacha20poly1305{ + N: ScryptN, + R: ScryptR, + P: ScryptP, + KeyLen: ScryptKeyLen, +} + +// ScryptChacha20poly1305 provides methods for encryption/decryption with scrypt and chacha20poly1305 +type ScryptChacha20poly1305 struct { + N int + R int + P int + KeyLen int +} + +type meta struct { + N int `json:"n"` + R int `json:"r"` + P int `json:"p"` + KeyLen int `json:"keyLen"` + Salt []byte `json:"salt"` + Nonce []byte `json:"nonce"` +} + +// Encrypt encrypts data with password, +// 1. Scrypt derives the key from password +// 2. Chacha20poly1305 generates AEAD from the derived key +// 4. Puts scrypt paramenters, salt and nonce into metadata, json serialize it and get the serialized metadata length +// 5. AEAD.Seal encrypts the data, and use [length][metadata] as additional data +// 6. Final format: base64([[length][metadata]][ciphertext]), length is 2 bytes. +func (s ScryptChacha20poly1305) Encrypt(data, password []byte) ([]byte, error) { + if len(password) == 0 { + return nil, errors.New("missing password") + } + + // Scyrpt derives key from password + salt := cipher.RandByte(scryptChacha20SaltSize) + dk, err := scrypt.Key(password, salt, s.N, s.R, s.P, s.KeyLen) + if err != nil { + return nil, err + } + + // Prepare metadata + m := meta{ + N: s.N, + R: s.R, + P: s.P, + KeyLen: s.KeyLen, + Salt: salt, + Nonce: cipher.RandByte(chacha20poly1305.NonceSize), + } + // json serialize the metadata + ms, err := json.Marshal(m) + if err != nil { + return nil, err + } + + if len(ms) > math.MaxUint16 { + return nil, errors.New("metadata length beyond the math.MaxUint16") + } + + length := make([]byte, scryptChacha20MetaLengthSize) + binary.LittleEndian.PutUint16(length, uint16(len(ms))) + + // Additional data for AEAD + ad := append(length, ms...) + aead, err := chacha20poly1305.New(dk) + if err != nil { + return nil, err + } + + ciphertext := aead.Seal(nil, m.Nonce, data, ad) + + // Base64 encode the [[length][metadata]][ciphertext] + rawData := append(ad, ciphertext...) + enc := base64.StdEncoding + buf := make([]byte, enc.EncodedLen(len(rawData))) + enc.Encode(buf, rawData) + return buf, nil +} + +// Decrypt decrypts the data with password +// 1. Base64 decodes the data +// 2. Reads the first [metaLengthSize] bytes data to get the metadata length, and reads out the metadata. +// 3. Scrypt derives key from password and paramenters in metadata +// 4. Chacha20poly1305 geneates AEAD +// 5. AEAD decrypts ciphertext with nonce in metadata and [length][metadata] as additional data. +func (s ScryptChacha20poly1305) Decrypt(data, password []byte) ([]byte, error) { + if len(password) == 0 { + return nil, errors.New("missing password") + } + + enc := base64.StdEncoding + encData := make([]byte, enc.DecodedLen(len(data))) + n, err := enc.Decode(encData, data) + if err != nil { + return nil, err + } + encData = encData[:n] + + length := binary.LittleEndian.Uint16(encData[:scryptChacha20MetaLengthSize]) + if int(scryptChacha20MetaLengthSize+length) > len(encData) { + return nil, errors.New("invalid metadata length") + } + + var m meta + if err := json.Unmarshal(encData[scryptChacha20MetaLengthSize:scryptChacha20MetaLengthSize+length], &m); err != nil { + return nil, err + } + + ad := encData[:scryptChacha20MetaLengthSize+length] + // Scrypt derives key + dk, err := scrypt.Key(password, m.Salt, m.N, m.R, m.P, m.KeyLen) + if err != nil { + return nil, err + } + + // Geneates AEAD + aead, err := chacha20poly1305.New(dk) + if err != nil { + return nil, err + } + + return aead.Open(nil, m.Nonce, encData[scryptChacha20MetaLengthSize+length:], ad) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encrypt/scrypt_chacha20poly1305_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encrypt/scrypt_chacha20poly1305_test.go new file mode 100644 index 00000000..8737da2f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encrypt/scrypt_chacha20poly1305_test.go @@ -0,0 +1,85 @@ +package encrypt + +import ( + "encoding/base64" + "encoding/binary" + "encoding/json" + "errors" + "fmt" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestScryptChacha20poly1305Encrypt(t *testing.T) { + for i := uint(1); i < 20; i++ { + name := fmt.Sprintf("N=1<<%v r=%v p=%v keyLen=%v", i, 8, 1, 32) + t.Run(name, func(t *testing.T) { + crypto := ScryptChacha20poly1305{N: 1 << i, R: 8, P: 1, KeyLen: 32} + encData, err := crypto.Encrypt([]byte("plaintext"), []byte("password")) + require.NoError(t, err) + + data, err := base64.StdEncoding.DecodeString(string(encData)) + require.NoError(t, err) + // Checks the prefix + ml := binary.LittleEndian.Uint16(data[:scryptChacha20MetaLengthSize]) + require.True(t, int(scryptChacha20MetaLengthSize+ml) <= len(data)) + var m meta + require.NoError(t, json.Unmarshal(data[scryptChacha20MetaLengthSize:scryptChacha20MetaLengthSize+ml], &m)) + require.Equal(t, m.N, 1< Add 32 bits length prefix to indicate the length of data. +// 2> Pad the length + data to 32 bytes with nulls at end +// 2> SHA256() and prefix the hash. +// 3> Split the whole data(hash+length+data+padding) into 256 bits(32 bytes) blocks +// 4> Each block is encrypted by XORing the unencrypted block with SHA256(SHA256(password), SHA256(index, SHA256(nonce)) +// - index is 0 for the first block of 32 bytes, 1 for the second block of 32 bytes, 2 for third block +// 5> Prefix nonce and SHA256 the nonce with blocks to get checksum, and prefix the checksum +// 6> Finally, the data format is: base64() +func (s Sha256Xor) Encrypt(data []byte, password []byte) ([]byte, error) { + if len(password) == 0 { + return nil, ErrMissingPassword + } + + if uint(len(data)) > math.MaxUint32 { + return nil, ErrDataTooLarge + } + + // Sets data length prefix + dataLenBytes := make([]byte, sha256XorDataLengthSize) + binary.LittleEndian.PutUint32(dataLenBytes, uint32(len(data))) + + // Prefixes data with length + ldata := append(dataLenBytes, data...) + + // Pads length + data with null to 32 bytes + l := len(ldata) // hash + length + data + n := l / sha256XorBlockSize + m := l % sha256XorBlockSize + if m > 0 { + paddingNull := make([]byte, sha256XorBlockSize-m) + ldata = append(ldata, paddingNull...) + n++ + } + + // Hash(length+data+padding) + dataHash := cipher.SumSHA256(ldata) + + // Initialize blocks with data hash + blocks := []cipher.SHA256{dataHash} + for i := 0; i < n; i++ { + var b cipher.SHA256 + copy(b[:], ldata[i*sha256XorBlockSize:(i+1)*sha256XorBlockSize]) + blocks = append(blocks, b) + } + + // Generates a nonce + nonce := cipher.RandByte(sha256XorNonceSize) + // Hash the nonce + hashNonce := cipher.SumSHA256(nonce) + // Derives key by secp256k1 hashing password + key := secp256k1.Secp256k1Hash(password) + + var encryptedData []byte + // Encodes the blocks + for i := range blocks { + // Hash(password, hash(index, hash(nonce))) + h := hashKeyIndexNonce(key, int64(i), hashNonce) + encryptedHash := blocks[i].Xor(h) + encryptedData = append(encryptedData, encryptedHash[:]...) + } + + // Prefix the nonce + nonceAndDataBytes := append(nonce, encryptedData...) + // Calculates the checksum + checkSum := cipher.SumSHA256(nonceAndDataBytes) + + finalData := append(checkSum[:], nonceAndDataBytes...) + + // Base64 encodes the data + enc := base64.StdEncoding + buf := make([]byte, enc.EncodedLen(len(finalData))) + enc.Encode(buf, finalData) + return buf, nil +} + +// Decrypt decrypts the data +func (s Sha256Xor) Decrypt(data []byte, password []byte) ([]byte, error) { + if len(password) == 0 { + return nil, ErrMissingPassword + } + + // Base64 decodes data + enc := base64.StdEncoding + encData := make([]byte, enc.DecodedLen(len(data))) + n, err := enc.Decode(encData, data) + if err != nil { + return nil, err + } + + encData = encData[:n] + + // Derives key by secp256k1 hashing password + key := secp256k1.Secp256k1Hash(password) + + buf := bytes.NewBuffer(encData) + + // Gets checksum + var checkSum cipher.SHA256 + n, err = buf.Read(checkSum[:]) + if err != nil { + return nil, err + } + + if n != sha256XorChecksumSize { + return nil, ErrInvalidChecksumLength + } + + // Checks the checksum + csh := cipher.SumSHA256(buf.Bytes()) + if csh != checkSum { + return nil, ErrInvalidChecksum + } + + // Gets the nonce + nonce := make([]byte, sha256XorNonceSize) + n, err = buf.Read(nonce) + if err != nil { + return nil, err + } + + if n != sha256XorNonceSize { + return nil, ErrInvalidNonceLength + } + + var decodeData []byte + hashNonce := cipher.SumSHA256(nonce) + i := 0 + for { + var block cipher.SHA256 + n, err := buf.Read(block[:]) + if err == io.EOF { + break + } + + if n != sha256XorBlockSize { + return nil, ErrInvalidBlockSize + } + + // Decodes the block + dataHash := block.Xor(hashKeyIndexNonce(key, int64(i), hashNonce)) + decodeData = append(decodeData, dataHash[:]...) + i++ + } + + buf = bytes.NewBuffer(decodeData) + + // Gets the hash + var dataHash cipher.SHA256 + n, err = buf.Read(dataHash[:]) + if err != nil { + return nil, fmt.Errorf("read data hash failed: %v", err) + } + + if n != 32 { + return nil, ErrReadDataHashFailed + } + + // Checks the hash + if dataHash != cipher.SumSHA256(buf.Bytes()) { + return nil, ErrInvalidPassword + } + + // Reads out the data length + dataLenBytes := make([]byte, sha256XorDataLengthSize) + n, err = buf.Read(dataLenBytes) + if err != nil { + return nil, err + } + + if n != sha256XorDataLengthSize { + return nil, ErrReadDataLengthFailed + } + + l := binary.LittleEndian.Uint32(dataLenBytes) + + if uint64(buf.Len()) > math.MaxUint32 { + return nil, ErrDataTooLarge + } + + if l > uint32(buf.Len()) { + return nil, ErrInvalidDataLength + } + + // Reads out the raw data + rawData := make([]byte, l) + n, err = buf.Read(rawData) + if err != nil { + return nil, err + } + + if uint32(n) != l { + return nil, fmt.Errorf("read data failed, expect %d bytes, but get %d bytes", l, n) + } + + return rawData, nil +} + +// hash(password, hash(index, hash(nonce))) +func hashKeyIndexNonce(key []byte, index int64, nonceHash cipher.SHA256) cipher.SHA256 { + // convert index to 256bit number + indexBytes := make([]byte, 32) + binary.PutVarint(indexBytes, index) + + // hash(index, nonceHash) + indexNonceHash := cipher.SumSHA256(append(indexBytes, nonceHash[:]...)) + + // hash(hash(password), indexNonceHash) + var keyHash cipher.SHA256 + copy(keyHash[:], key[:]) + return cipher.AddSHA256(keyHash, indexNonceHash) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/encrypt/sha256xor_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encrypt/sha256xor_test.go new file mode 100644 index 00000000..12efa05c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/encrypt/sha256xor_test.go @@ -0,0 +1,248 @@ +package encrypt + +import ( + "encoding/base64" + "encoding/binary" + "errors" + "fmt" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + secp256k1 "github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go" + "github.com/SkycoinProject/skycoin/src/testutil" +) + +func TestEncrypt(t *testing.T) { + tt := []struct { + name string + data []byte + password []byte + err error + }{ + { + "data length=1 password is empty=true", + testutil.RandBytes(t, 1), + nil, + errors.New("missing password"), + }, + { + "data length=1 password is empty=false", + testutil.RandBytes(t, 1), + []byte("key"), + nil, + }, + { + "data length<32 password is empty=false", + testutil.RandBytes(t, 2), + []byte("pwd"), + nil, + }, + { + "data length=32 password is empty=false", + testutil.RandBytes(t, 32), + []byte("pwd"), + nil, + }, + { + "data length=2*32 password is empty=false", + testutil.RandBytes(t, 64), + []byte("9JMkCPphe73NQvGhmab"), + nil, + }, + { + "data length>2*32 password is empty=false", + testutil.RandBytes(t, 65), + []byte("9JMkCPphe73NQvGhmab"), + nil, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + edata, err := Sha256Xor{}.Encrypt(tc.data, tc.password) + require.Equal(t, tc.err, err) + if err != nil { + return + } + + n := (sha256XorDataLengthSize + len(tc.data)) / sha256XorBlockSize + m := (sha256XorDataLengthSize + len(tc.data)) % sha256XorBlockSize + if m > 0 { + n++ + } + + rdata, err := base64.StdEncoding.DecodeString(string(edata)) + require.NoError(t, err) + + totalEncryptedDataLen := sha256XorChecksumSize + sha256XorNonceSize + 32 + n*sha256XorBlockSize // 32 is the hash data length + require.Equal(t, totalEncryptedDataLen, len(rdata)) + var checksum cipher.SHA256 + copy(checksum[:], rdata[:sha256XorChecksumSize]) + require.Equal(t, checksum, cipher.SumSHA256(rdata[sha256XorChecksumSize:])) + }) + } + + // test data of length range in 32 to 64, for testing the 32 bytes padding. + pwd := []byte("pwd") + for i := 33; i <= 64; i++ { + name := fmt.Sprintf("data length=%d password is empty=false", i) + t.Run(name, func(t *testing.T) { + data := testutil.RandBytes(t, i) + edata, err := Sha256Xor{}.Encrypt(data, pwd) + require.NoError(t, err) + + n := (sha256XorDataLengthSize + len(data)) / sha256XorBlockSize + m := (sha256XorDataLengthSize + len(data)) % sha256XorBlockSize + if m > 0 { + n++ + } + + rdata, err := base64.StdEncoding.DecodeString(string(edata)) + require.NoError(t, err) + + totalEncryptedDataLen := sha256XorChecksumSize + sha256XorNonceSize + 32 + n*sha256XorBlockSize // 32 is the hash data length + require.Equal(t, totalEncryptedDataLen, len(rdata)) + var checksum cipher.SHA256 + copy(checksum[:], rdata[:sha256XorChecksumSize]) + require.Equal(t, checksum, cipher.SumSHA256(rdata[sha256XorChecksumSize:])) + }) + } +} + +func TestDecrypt(t *testing.T) { + data := testutil.RandBytes(t, 32) + tt := []struct { + name string + encryptedData func() []byte // encrypted data + password []byte + err error + }{ + { + "invalid data length", + func() []byte { + return makeEncryptedData(t, data, 65, []byte("pwd")) + }, + []byte("pwd"), + errors.New("invalid data length"), + }, + { + "invalid checksum", + func() []byte { + edata := makeEncryptedData(t, data, 32, []byte("pwd")) + // Changes the encrypted data, so that the checksum could not match + rd, err := base64.StdEncoding.DecodeString(string(edata)) + require.NoError(t, err) + rd[len(rd)-1]++ + return []byte(base64.StdEncoding.EncodeToString(rd)) + }, + []byte("pwd"), + errors.New("invalid data, checksum is not matched"), + }, + { + "empty password", + func() []byte { + return makeEncryptedData(t, data, 32, []byte("pwd")) + }, + []byte(""), + errors.New("missing password"), + }, + { + "nil password", + func() []byte { + return makeEncryptedData(t, data, 32, []byte("pwd")) + }, + nil, + errors.New("missing password"), + }, + { + "invalid password", + func() []byte { + return makeEncryptedData(t, data, 32, []byte("pwd")) + }, + []byte("wrong password"), + errors.New("invalid password"), + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + edata := tc.encryptedData() + d, err := Sha256Xor{}.Decrypt(edata, tc.password) + require.Equal(t, tc.err, err) + if err != nil { + return + } + + require.Equal(t, d, data) + }) + } + + // test data of length in range of 0 to 64 + for i := 0; i <= 64; i++ { + name := fmt.Sprintf("data length=%d", i) + t.Run(name, func(t *testing.T) { + data := testutil.RandBytes(t, i) + edata := makeEncryptedData(t, data, uint32(len(data)), []byte("pwd")) + d, err := Sha256Xor{}.Decrypt(edata, []byte("pwd")) + require.NoError(t, err) + require.Equal(t, data, d) + }) + } +} + +// encrypts data, manually set the data length, so we could test invalid data length cases. +func makeEncryptedData(t *testing.T, data []byte, dataLength uint32, password []byte) []byte { + dataLenBytes := make([]byte, sha256XorDataLengthSize) + binary.LittleEndian.PutUint32(dataLenBytes, dataLength) + + ldata := append(dataLenBytes, data...) + + // Pads length + data with null to 32 bytes + l := len(ldata) // hash + length + data + n := l / sha256XorBlockSize + m := l % sha256XorBlockSize + if m > 0 { + paddingNull := make([]byte, sha256XorBlockSize-m) + ldata = append(ldata, paddingNull...) + n++ + } + + // Hash(length+data+padding) + dataHash := cipher.SumSHA256(ldata) + + // Initialize blocks with data hash + blocks := []cipher.SHA256{dataHash} + for i := 0; i < n; i++ { + var b cipher.SHA256 + copy(b[:], ldata[i*sha256XorBlockSize:(i+1)*sha256XorBlockSize]) + blocks = append(blocks, b) + } + + // Generates a nonce + nonce := testutil.RandBytes(t, int(sha256XorNonceSize)) + // Hash the nonce + hashNonce := cipher.SumSHA256(nonce) + // Hash the password + key := secp256k1.Secp256k1Hash(password) + + var encryptedData []byte + // Encodes the blocks + for i := range blocks { + // Hash(password, hash(index, hash(nonce))) + h := hashKeyIndexNonce(key, int64(i), hashNonce) + encryptedHash := blocks[i].Xor(h) + encryptedData = append(encryptedData, encryptedHash[:]...) + } + + // Prefix the nonce + nonceAndDataBytes := append(nonce, encryptedData...) + // Calculates the checksum + checkSum := cipher.SumSHA256(nonceAndDataBytes) + rd := append(checkSum[:], nonceAndDataBytes...) + enc := base64.StdEncoding + buf := make([]byte, enc.EncodedLen(len(rd))) + enc.Encode(buf, rd) + return buf +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/hash.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/hash.go new file mode 100644 index 00000000..039cf6a4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/hash.go @@ -0,0 +1,208 @@ +package cipher + +import ( + "encoding/hex" + "errors" + "hash" + "log" +) + +var ( + // Memory pool for hashes + sha256HashPoolSize = 30 + sha256HashPool chan hash.Hash + ripemd160HashPoolSize = 30 + ripemd160HashPool chan hash.Hash +) + +var ( + // ErrInvalidLengthRipemd160 Invalid ripemd160 length + ErrInvalidLengthRipemd160 = errors.New("Invalid ripemd160 length") + // ErrInvalidLengthSHA256 Invalid sha256 length + ErrInvalidLengthSHA256 = errors.New("Invalid sha256 length") + // ErrInvalidHexLength Invalid hex length + ErrInvalidHexLength = errors.New("Invalid hex length") + // ErrInvalidBytesLength Invalid bytes length + ErrInvalidBytesLength = errors.New("Invalid bytes length") +) + +// Ripemd160 ripemd160 +type Ripemd160 [20]byte + +// MustSet sets value, panics on error +func (rd *Ripemd160) MustSet(b []byte) { + if len(b) != 20 { + log.Panic(ErrInvalidLengthRipemd160) + } + copy(rd[:], b[:]) +} + +// Set sets value +func (rd *Ripemd160) Set(b []byte) error { + if len(b) != 20 { + return ErrInvalidLengthRipemd160 + } + copy(rd[:], b[:]) + return nil +} + +// Ripemd160FromBytes converts []byte to Ripemd160 +func Ripemd160FromBytes(b []byte) (Ripemd160, error) { + h := Ripemd160{} + err := h.Set(b) + return h, err +} + +// MustRipemd160FromBytes converts []byte to Ripemd160, panics on error +func MustRipemd160FromBytes(b []byte) Ripemd160 { + h := Ripemd160{} + h.MustSet(b) + return h +} + +// HashRipemd160 hash data to Ripemd160 +func HashRipemd160(data []byte) Ripemd160 { + ripemd160Hash := <-ripemd160HashPool + ripemd160Hash.Reset() + // ripemd160.Write never returns an error + ripemd160Hash.Write(data) //nolint:errcheck + sum := ripemd160Hash.Sum(nil) + ripemd160HashPool <- ripemd160Hash + + h := Ripemd160{} + h.MustSet(sum) + return h +} + +// SHA256 32 bytes +type SHA256 [32]byte + +// MustSet sets value, panics on error +func (g *SHA256) MustSet(b []byte) { + if len(b) != 32 { + panic(ErrInvalidLengthSHA256) + } + copy(g[:], b[:]) +} + +// Set sets value +func (g *SHA256) Set(b []byte) error { + if len(b) != 32 { + return ErrInvalidLengthSHA256 + } + copy(g[:], b[:]) + return nil +} + +func (g SHA256) String() string { + return g.Hex() +} + +// Hex encode SHA256 to hex string +func (g SHA256) Hex() string { + return hex.EncodeToString(g[:]) +} + +// Null returns true if the hash is null (0x0000..) +func (g SHA256) Null() bool { + return g == SHA256{} +} + +// Xor xor +func (g *SHA256) Xor(b SHA256) SHA256 { + c := SHA256{} + for i := 0; i < 32; i++ { + c[i] = g[i] ^ b[i] + } + return c +} + +// SHA256FromHex decodes a hex encoded SHA256 hash to bytes +func SHA256FromHex(hs string) (SHA256, error) { + h := SHA256{} + b, err := hex.DecodeString(hs) + if err != nil { + return h, err + } + if len(b) != len(h) { + return h, ErrInvalidHexLength + } + h.MustSet(b) + return h, nil +} + +// MustSHA256FromHex decodes a hex encoded SHA256 hash to bytes, panics on error +func MustSHA256FromHex(hs string) SHA256 { + h, err := SHA256FromHex(hs) + if err != nil { + log.Panic(err) + } + return h +} + +// SHA256FromBytes converts []byte to SHA256 +func SHA256FromBytes(b []byte) (SHA256, error) { + h := SHA256{} + err := h.Set(b) + return h, err +} + +// MustSHA256FromBytes converts []byte to SHA256, panics on error +func MustSHA256FromBytes(b []byte) SHA256 { + h := SHA256{} + h.MustSet(b) + return h +} + +// SumSHA256 sum sha256 +func SumSHA256(b []byte) SHA256 { + sha256Hash := <-sha256HashPool + sha256Hash.Reset() + // sha256.Write never returns an error + sha256Hash.Write(b) //nolint:errcheck + sum := sha256Hash.Sum(nil) + sha256HashPool <- sha256Hash + + h := SHA256{} + h.MustSet(sum) + return h +} + +// DoubleSHA256 double SHA256 +func DoubleSHA256(b []byte) SHA256 { + h1 := SumSHA256(b) + h2 := SumSHA256(h1[:]) + return h2 +} + +// AddSHA256 returns the SHA256 hash of to two concatenated hashes +func AddSHA256(a SHA256, b SHA256) SHA256 { + c := append(a[:], b[:]...) + return SumSHA256(c) +} + +// Returns the next highest power of 2 above n, if n is not already a +// power of 2 +func nextPowerOfTwo(n uint64) uint64 { + var k uint64 = 1 + for k < n { + k *= 2 + } + return k +} + +// Merkle computes the merkle root of a hash array +// Array of hashes is padded with 0 hashes until next power of 2 +func Merkle(h0 []SHA256) SHA256 { + lh := uint64(len(h0)) + np := nextPowerOfTwo(lh) + h1 := append(h0, make([]SHA256, np-lh)...) + for len(h1) != 1 { + h2 := make([]SHA256, len(h1)/2) + for i := 0; i < len(h2); i++ { + h2[i] = AddSHA256(h1[2*i], h1[2*i+1]) + } + h1 = h2 + } + return h1[0] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/hash_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/hash_test.go new file mode 100644 index 00000000..87baa288 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/hash_test.go @@ -0,0 +1,373 @@ +package cipher + +import ( + "bytes" + "crypto/rand" + "crypto/sha256" + "encoding/hex" + "errors" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher/ripemd160" +) + +func freshSumRipemd160(t *testing.T, b []byte) Ripemd160 { + sh := ripemd160.New() + _, err := sh.Write(b) + require.NoError(t, err) + h := Ripemd160{} + h.MustSet(sh.Sum(nil)) + return h +} + +func freshSumSHA256(t *testing.T, b []byte) SHA256 { + sh := sha256.New() + _, err := sh.Write(b) + require.NoError(t, err) + h := SHA256{} + h.MustSet(sh.Sum(nil)) + return h +} + +func randBytes(t *testing.T, n int) []byte { + b := make([]byte, n) + x, err := rand.Read(b) + require.Equal(t, n, x) + require.Nil(t, err) + return b +} + +func TestHashRipemd160(t *testing.T) { + require.NotPanics(t, func() { HashRipemd160(randBytes(t, 128)) }) + r := HashRipemd160(randBytes(t, 160)) + require.NotEqual(t, r, Ripemd160{}) + // 2nd hash should not be affected by previous + b := randBytes(t, 256) + r2 := HashRipemd160(b) + require.NotEqual(t, r2, Ripemd160{}) + require.Equal(t, r2, freshSumRipemd160(t, b)) +} + +func TestRipemd160MustSet(t *testing.T) { + h := Ripemd160{} + require.Panics(t, func() { + h.MustSet(randBytes(t, 21)) + }) + require.Panics(t, func() { + h.MustSet(randBytes(t, 100)) + }) + require.Panics(t, func() { + h.MustSet(randBytes(t, 19)) + }) + require.Panics(t, func() { + h.MustSet(randBytes(t, 0)) + }) + require.NotPanics(t, func() { + h.MustSet(randBytes(t, 20)) + }) + b := randBytes(t, 20) + h.MustSet(b) + require.True(t, bytes.Equal(h[:], b)) +} + +func TestRipemd160Set(t *testing.T) { + h := Ripemd160{} + err := h.Set(randBytes(t, 21)) + require.Equal(t, errors.New("Invalid ripemd160 length"), err) + err = h.Set(randBytes(t, 100)) + require.Equal(t, errors.New("Invalid ripemd160 length"), err) + err = h.Set(randBytes(t, 19)) + require.Equal(t, errors.New("Invalid ripemd160 length"), err) + err = h.Set(randBytes(t, 0)) + require.Equal(t, errors.New("Invalid ripemd160 length"), err) + + b := randBytes(t, 20) + err = h.Set(b) + require.NoError(t, err) + require.True(t, bytes.Equal(h[:], b)) +} + +func TestSHA256MustSet(t *testing.T) { + h := SHA256{} + require.Panics(t, func() { + h.MustSet(randBytes(t, 33)) + }) + require.Panics(t, func() { + h.MustSet(randBytes(t, 100)) + }) + require.Panics(t, func() { + h.MustSet(randBytes(t, 31)) + }) + require.Panics(t, func() { + h.MustSet(randBytes(t, 0)) + }) + require.NotPanics(t, func() { + h.MustSet(randBytes(t, 32)) + }) + b := randBytes(t, 32) + h.MustSet(b) + require.True(t, bytes.Equal(h[:], b)) +} + +func TestRipemd160FromBytes(t *testing.T) { + b := randBytes(t, 20) + h, err := Ripemd160FromBytes(b) + require.NoError(t, err) + require.True(t, bytes.Equal(b[:], h[:])) + + b = randBytes(t, 19) + _, err = Ripemd160FromBytes(b) + require.Equal(t, errors.New("Invalid ripemd160 length"), err) + + b = randBytes(t, 21) + _, err = Ripemd160FromBytes(b) + require.Equal(t, errors.New("Invalid ripemd160 length"), err) + + _, err = Ripemd160FromBytes(nil) + require.Equal(t, errors.New("Invalid ripemd160 length"), err) +} + +func TestMustRipemd160FromBytes(t *testing.T) { + b := randBytes(t, 20) + h := MustRipemd160FromBytes(b) + require.True(t, bytes.Equal(b[:], h[:])) + + b = randBytes(t, 19) + require.Panics(t, func() { + MustRipemd160FromBytes(b) + }) + + b = randBytes(t, 21) + require.Panics(t, func() { + MustRipemd160FromBytes(b) + }) + + require.Panics(t, func() { + MustRipemd160FromBytes(nil) + }) +} + +func TestSHA256Set(t *testing.T) { + h := SHA256{} + err := h.Set(randBytes(t, 33)) + require.Equal(t, errors.New("Invalid sha256 length"), err) + err = h.Set(randBytes(t, 100)) + require.Equal(t, errors.New("Invalid sha256 length"), err) + err = h.Set(randBytes(t, 31)) + require.Equal(t, errors.New("Invalid sha256 length"), err) + err = h.Set(randBytes(t, 0)) + require.Equal(t, errors.New("Invalid sha256 length"), err) + + b := randBytes(t, 32) + err = h.Set(b) + require.NoError(t, err) + require.True(t, bytes.Equal(h[:], b)) +} + +func TestSHA256Hex(t *testing.T) { + h := SHA256{} + h.MustSet(randBytes(t, 32)) + s := h.Hex() + h2, err := SHA256FromHex(s) + require.Nil(t, err) + require.Equal(t, h, h2) + require.Equal(t, h2.Hex(), s) +} + +func TestSHA256KnownValue(t *testing.T) { + vals := []struct { + input string + output string + }{ + // These values are generated by + // echo -n input | sha256sum + { + "skycoin", + "5a42c0643bdb465d90bf673b99c14f5fa02db71513249d904573d2b8b63d353d", + }, + { + "hello world", + "b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9", + }, + { + "hello world asd awd awd awdapodawpokawpod ", + "99d71f95cafe05ea2dddebc35b6083bd5af0e44850c9dc5139b4476c99950be4", + }, + } + for _, io := range vals { + require.Equal(t, io.output, SumSHA256([]byte(io.input)).Hex()) + } +} + +func TestSumSHA256(t *testing.T) { + b := randBytes(t, 256) + h1 := SumSHA256(b) + require.NotEqual(t, h1, SHA256{}) + // A second call to Sum should not be influenced by the original + c := randBytes(t, 256) + h2 := SumSHA256(c) + require.NotEqual(t, h2, SHA256{}) + require.Equal(t, h2, freshSumSHA256(t, c)) +} + +func TestSHA256FromHex(t *testing.T) { + // Invalid hex hash + _, err := SHA256FromHex("cawcd") + require.NotNil(t, err) + + // Truncated hex hash + h := SumSHA256(randBytes(t, 128)) + _, err = SHA256FromHex(hex.EncodeToString(h[:len(h)/2])) + require.NotNil(t, err) + + // Valid hex hash + h2, err := SHA256FromHex(hex.EncodeToString(h[:])) + require.Equal(t, h, h2) + require.Nil(t, err) +} + +func TestMustSHA256FromHex(t *testing.T) { + // Invalid hex hash + require.Panics(t, func() { MustSHA256FromHex("cawcd") }) + + // Truncated hex hash + h := SumSHA256(randBytes(t, 128)) + require.Panics(t, func() { + MustSHA256FromHex(hex.EncodeToString(h[:len(h)/2])) + }) + + // Valid hex hash + h2 := MustSHA256FromHex(hex.EncodeToString(h[:])) + require.Equal(t, h, h2) +} + +func TestSHA256FromBytes(t *testing.T) { + b := randBytes(t, 32) + h, err := SHA256FromBytes(b) + require.NoError(t, err) + require.True(t, bytes.Equal(b[:], h[:])) + + b = randBytes(t, 31) + _, err = SHA256FromBytes(b) + require.Equal(t, errors.New("Invalid sha256 length"), err) + + b = randBytes(t, 33) + _, err = SHA256FromBytes(b) + require.Equal(t, errors.New("Invalid sha256 length"), err) + + _, err = SHA256FromBytes(nil) + require.Equal(t, errors.New("Invalid sha256 length"), err) +} + +func TestMustSHA256FromBytes(t *testing.T) { + b := randBytes(t, 32) + h := MustSHA256FromBytes(b) + require.True(t, bytes.Equal(b[:], h[:])) + + b = randBytes(t, 31) + require.Panics(t, func() { + MustSHA256FromBytes(b) + }) + + b = randBytes(t, 33) + require.Panics(t, func() { + MustSHA256FromBytes(b) + }) + + require.Panics(t, func() { + MustSHA256FromBytes(nil) + }) +} + +func TestDoubleSHA256(t *testing.T) { + b := randBytes(t, 128) + h := DoubleSHA256(b) + require.NotEqual(t, h, SHA256{}) + require.NotEqual(t, h, freshSumSHA256(t, b)) +} + +func TestAddSHA256(t *testing.T) { + b := randBytes(t, 128) + h := SumSHA256(b) + c := randBytes(t, 64) + i := SumSHA256(c) + add := AddSHA256(h, i) + require.NotEqual(t, add, SHA256{}) + require.NotEqual(t, add, h) + require.NotEqual(t, add, i) + require.Equal(t, add, SumSHA256(append(h[:], i[:]...))) +} + +func TestXorSHA256(t *testing.T) { + b := randBytes(t, 128) + c := randBytes(t, 128) + h := SumSHA256(b) + i := SumSHA256(c) + require.NotEqual(t, h.Xor(i), h) + require.NotEqual(t, h.Xor(i), i) + require.NotEqual(t, h.Xor(i), SHA256{}) + require.Equal(t, h.Xor(i), i.Xor(h)) +} + +func TestSHA256Null(t *testing.T) { + var x SHA256 + require.True(t, x.Null()) + + b := randBytes(t, 128) + x = SumSHA256(b) + + require.False(t, x.Null()) +} + +func TestNextPowerOfTwo(t *testing.T) { + inputs := [][]uint64{ + {0, 1}, + {1, 1}, + {2, 2}, + {3, 4}, + {4, 4}, + {5, 8}, + {8, 8}, + {14, 16}, + {16, 16}, + {17, 32}, + {43345, 65536}, + {65535, 65536}, + {35657, 65536}, + {65536, 65536}, + {65537, 131072}, + } + for _, i := range inputs { + require.Equal(t, nextPowerOfTwo(i[0]), i[1]) + } + for i := uint64(2); i < 10000; i++ { + p := nextPowerOfTwo(i) + require.Equal(t, p%2, uint64(0)) + require.True(t, p >= i) + } +} + +func TestMerkle(t *testing.T) { + h := SumSHA256(randBytes(t, 128)) + // Single hash input returns hash + require.Equal(t, Merkle([]SHA256{h}), h) + h2 := SumSHA256(randBytes(t, 128)) + // 2 hashes should be AddSHA256 of them + require.Equal(t, Merkle([]SHA256{h, h2}), AddSHA256(h, h2)) + // 3 hashes should be Add(Add()) + h3 := SumSHA256(randBytes(t, 128)) + out := AddSHA256(AddSHA256(h, h2), AddSHA256(h3, SHA256{})) + require.Equal(t, Merkle([]SHA256{h, h2, h3}), out) + // 4 hashes should be Add(Add()) + h4 := SumSHA256(randBytes(t, 128)) + out = AddSHA256(AddSHA256(h, h2), AddSHA256(h3, h4)) + require.Equal(t, Merkle([]SHA256{h, h2, h3, h4}), out) + // 5 hashes + h5 := SumSHA256(randBytes(t, 128)) + out = AddSHA256(AddSHA256(h, h2), AddSHA256(h3, h4)) + out = AddSHA256(out, AddSHA256(AddSHA256(h5, SHA256{}), + AddSHA256(SHA256{}, SHA256{}))) + require.Equal(t, Merkle([]SHA256{h, h2, h3, h4, h5}), out) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/pbkdf2/pbkdf2.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/pbkdf2/pbkdf2.go new file mode 100644 index 00000000..4408a9eb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/pbkdf2/pbkdf2.go @@ -0,0 +1,77 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +/* +Package pbkdf2 implements the key derivation function PBKDF2 as defined in RFC +2898 / PKCS #5 v2.0. + +A key derivation function is useful when encrypting data based on a password +or any other not-fully-random data. It uses a pseudorandom function to derive +a secure encryption key based on the password. + +While v2.0 of the standard defines only one pseudorandom function to use, +HMAC-SHA1, the drafted v2.1 specification allows use of all five FIPS Approved +Hash Functions SHA-1, SHA-224, SHA-256, SHA-384 and SHA-512 for HMAC. To +choose, you can pass the `New` functions from the different SHA packages to +pbkdf2.Key. +*/ +package pbkdf2 // import "github.com/SkycoinProject/skycoin/src/cipher/pbkdf2" + +import ( + "crypto/hmac" + "hash" +) + +// Key derives a key from the password, salt and iteration count, returning a +// []byte of length keylen that can be used as cryptographic key. The key is +// derived based on the method described as PBKDF2 with the HMAC variant using +// the supplied hash function. +// +// For example, to use a HMAC-SHA-1 based PBKDF2 key derivation function, you +// can get a derived key for e.g. AES-256 (which needs a 32-byte key) by +// doing: +// +// dk := pbkdf2.Key([]byte("some password"), salt, 4096, 32, sha1.New) +// +// Remember to get a good random salt. At least 8 bytes is recommended by the +// RFC. +// +// Using a higher iteration count will increase the cost of an exhaustive +// search but will also make derivation proportionally slower. +func Key(password, salt []byte, iter, keyLen int, h func() hash.Hash) []byte { + prf := hmac.New(h, password) + hashLen := prf.Size() + numBlocks := (keyLen + hashLen - 1) / hashLen + + var buf [4]byte + dk := make([]byte, 0, numBlocks*hashLen) + U := make([]byte, hashLen) + for block := 1; block <= numBlocks; block++ { + // N.B.: || means concatenation, ^ means XOR + // for each block T_i = U_1 ^ U_2 ^ ... ^ U_iter + // U_1 = PRF(password, salt || uint(i)) + prf.Reset() + prf.Write(salt) //nolint:errcheck,gosec + buf[0] = byte(block >> 24) + buf[1] = byte(block >> 16) + buf[2] = byte(block >> 8) + buf[3] = byte(block) + prf.Write(buf[:4]) //nolint:errcheck,gosec + dk = prf.Sum(dk) + T := dk[len(dk)-hashLen:] + copy(U, T) + + // U_n = PRF(password, U_(n-1)) + for n := 2; n <= iter; n++ { + prf.Reset() + prf.Write(U) //nolint:errcheck,gosec + U = U[:0] + U = prf.Sum(U) + for x := range U { + T[x] ^= U[x] + } + } + } + return dk[:keyLen] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/pbkdf2/pbkdf2_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/pbkdf2/pbkdf2_test.go new file mode 100644 index 00000000..1fc814fb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/pbkdf2/pbkdf2_test.go @@ -0,0 +1,157 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package pbkdf2 + +import ( + "bytes" + "crypto/sha1" //nolint:gosec + "crypto/sha256" + "hash" + "testing" +) + +type testVector struct { + password string + salt string + iter int + output []byte +} + +// Test vectors from RFC 6070, http://tools.ietf.org/html/rfc6070 +var sha1TestVectors = []testVector{ + { + "password", + "salt", + 1, + []byte{ + 0x0c, 0x60, 0xc8, 0x0f, 0x96, 0x1f, 0x0e, 0x71, + 0xf3, 0xa9, 0xb5, 0x24, 0xaf, 0x60, 0x12, 0x06, + 0x2f, 0xe0, 0x37, 0xa6, + }, + }, + { + "password", + "salt", + 2, + []byte{ + 0xea, 0x6c, 0x01, 0x4d, 0xc7, 0x2d, 0x6f, 0x8c, + 0xcd, 0x1e, 0xd9, 0x2a, 0xce, 0x1d, 0x41, 0xf0, + 0xd8, 0xde, 0x89, 0x57, + }, + }, + { + "password", + "salt", + 4096, + []byte{ + 0x4b, 0x00, 0x79, 0x01, 0xb7, 0x65, 0x48, 0x9a, + 0xbe, 0xad, 0x49, 0xd9, 0x26, 0xf7, 0x21, 0xd0, + 0x65, 0xa4, 0x29, 0xc1, + }, + }, + // // This one takes too long + // { + // "password", + // "salt", + // 16777216, + // []byte{ + // 0xee, 0xfe, 0x3d, 0x61, 0xcd, 0x4d, 0xa4, 0xe4, + // 0xe9, 0x94, 0x5b, 0x3d, 0x6b, 0xa2, 0x15, 0x8c, + // 0x26, 0x34, 0xe9, 0x84, + // }, + // }, + { + "passwordPASSWORDpassword", + "saltSALTsaltSALTsaltSALTsaltSALTsalt", + 4096, + []byte{ + 0x3d, 0x2e, 0xec, 0x4f, 0xe4, 0x1c, 0x84, 0x9b, + 0x80, 0xc8, 0xd8, 0x36, 0x62, 0xc0, 0xe4, 0x4a, + 0x8b, 0x29, 0x1a, 0x96, 0x4c, 0xf2, 0xf0, 0x70, + 0x38, + }, + }, + { + "pass\000word", + "sa\000lt", + 4096, + []byte{ + 0x56, 0xfa, 0x6a, 0xa7, 0x55, 0x48, 0x09, 0x9d, + 0xcc, 0x37, 0xd7, 0xf0, 0x34, 0x25, 0xe0, 0xc3, + }, + }, +} + +// Test vectors from +// http://stackoverflow.com/questions/5130513/pbkdf2-hmac-sha2-test-vectors +var sha256TestVectors = []testVector{ + { + "password", + "salt", + 1, + []byte{ + 0x12, 0x0f, 0xb6, 0xcf, 0xfc, 0xf8, 0xb3, 0x2c, + 0x43, 0xe7, 0x22, 0x52, 0x56, 0xc4, 0xf8, 0x37, + 0xa8, 0x65, 0x48, 0xc9, + }, + }, + { + "password", + "salt", + 2, + []byte{ + 0xae, 0x4d, 0x0c, 0x95, 0xaf, 0x6b, 0x46, 0xd3, + 0x2d, 0x0a, 0xdf, 0xf9, 0x28, 0xf0, 0x6d, 0xd0, + 0x2a, 0x30, 0x3f, 0x8e, + }, + }, + { + "password", + "salt", + 4096, + []byte{ + 0xc5, 0xe4, 0x78, 0xd5, 0x92, 0x88, 0xc8, 0x41, + 0xaa, 0x53, 0x0d, 0xb6, 0x84, 0x5c, 0x4c, 0x8d, + 0x96, 0x28, 0x93, 0xa0, + }, + }, + { + "passwordPASSWORDpassword", + "saltSALTsaltSALTsaltSALTsaltSALTsalt", + 4096, + []byte{ + 0x34, 0x8c, 0x89, 0xdb, 0xcb, 0xd3, 0x2b, 0x2f, + 0x32, 0xd8, 0x14, 0xb8, 0x11, 0x6e, 0x84, 0xcf, + 0x2b, 0x17, 0x34, 0x7e, 0xbc, 0x18, 0x00, 0x18, + 0x1c, + }, + }, + { + "pass\000word", + "sa\000lt", + 4096, + []byte{ + 0x89, 0xb6, 0x9d, 0x05, 0x16, 0xf8, 0x29, 0x89, + 0x3c, 0x69, 0x62, 0x26, 0x65, 0x0a, 0x86, 0x87, + }, + }, +} + +func testHash(t *testing.T, h func() hash.Hash, hashName string, vectors []testVector) { + for i, v := range vectors { + o := Key([]byte(v.password), []byte(v.salt), v.iter, len(v.output), h) + if !bytes.Equal(o, v.output) { + t.Errorf("%s %d: expected %x, got %x", hashName, i, v.output, o) + } + } +} + +func TestWithHMACSHA1(t *testing.T) { + testHash(t, sha1.New, "SHA1", sha1TestVectors) +} + +func TestWithHMACSHA256(t *testing.T) { + testHash(t, sha256.New, "SHA256", sha256TestVectors) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/poly1305/poly1305.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/poly1305/poly1305.go new file mode 100644 index 00000000..eb911984 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/poly1305/poly1305.go @@ -0,0 +1,32 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +/* +Package poly1305 implements Poly1305 one-time message authentication code as specified in http://cr.yp.to/mac/poly1305-20050329.pdf. + +Poly1305 is a fast, one-time authentication function. It is infeasible for an +attacker to generate an authenticator for a message without the key. However, a +key must only be used for a single message. Authenticating two different +messages with the same key allows an attacker to forge authenticators for other +messages with the same key. + +Poly1305 was originally coupled with AES in order to make Poly1305-AES. AES was +used with a fixed key in order to generate one-time keys from an nonce. +However, in this package AES isn't used and the one-time key is specified +directly. +*/ +package poly1305 // import "github.com/SkycoinProject/skycoin/src/cipher/poly1305" + +import "crypto/subtle" + +// TagSize is the size, in bytes, of a poly1305 authenticator. +const TagSize = 16 + +// Verify returns true if mac is a valid authenticator for m with the given +// key. +func Verify(mac *[16]byte, m []byte, key *[32]byte) bool { + var tmp [16]byte + Sum(&tmp, m, key) + return subtle.ConstantTimeCompare(tmp[:], mac[:]) == 1 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/poly1305/poly1305_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/poly1305/poly1305_test.go new file mode 100644 index 00000000..03b0e32d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/poly1305/poly1305_test.go @@ -0,0 +1,159 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package poly1305 + +import ( + "bytes" + "encoding/hex" + "flag" + "testing" + "unsafe" +) + +var stressFlag = flag.Bool("stress", false, "run slow stress tests") + +var testData = []struct { + in, k, correct []byte +}{ + { + []byte("Hello world!"), + []byte("this is 32-byte key for Poly1305"), + []byte{0xa6, 0xf7, 0x45, 0x00, 0x8f, 0x81, 0xc9, 0x16, 0xa2, 0x0d, 0xcc, 0x74, 0xee, 0xf2, 0xb2, 0xf0}, + }, + { + make([]byte, 32), + []byte("this is 32-byte key for Poly1305"), + []byte{0x49, 0xec, 0x78, 0x09, 0x0e, 0x48, 0x1e, 0xc6, 0xc2, 0x6b, 0x33, 0xb9, 0x1c, 0xcc, 0x03, 0x07}, + }, + { + make([]byte, 2007), + []byte("this is 32-byte key for Poly1305"), + []byte{0xda, 0x84, 0xbc, 0xab, 0x02, 0x67, 0x6c, 0x38, 0xcd, 0xb0, 0x15, 0x60, 0x42, 0x74, 0xc2, 0xaa}, + }, + { + make([]byte, 2007), + make([]byte, 32), + make([]byte, 16), + }, + { + // This test triggers an edge-case. See https://go-review.googlesource.com/#/c/30101/. + []byte{0x81, 0xd8, 0xb2, 0xe4, 0x6a, 0x25, 0x21, 0x3b, 0x58, 0xfe, 0xe4, 0x21, 0x3a, 0x2a, 0x28, 0xe9, 0x21, 0xc1, 0x2a, 0x96, 0x32, 0x51, 0x6d, 0x3b, 0x73, 0x27, 0x27, 0x27, 0xbe, 0xcf, 0x21, 0x29}, + []byte{0x3b, 0x3a, 0x29, 0xe9, 0x3b, 0x21, 0x3a, 0x5c, 0x5c, 0x3b, 0x3b, 0x05, 0x3a, 0x3a, 0x8c, 0x0d}, + []byte{0x6d, 0xc1, 0x8b, 0x8c, 0x34, 0x4c, 0xd7, 0x99, 0x27, 0x11, 0x8b, 0xbe, 0x84, 0xb7, 0xf3, 0x14}, + }, + { + // This test generates a result of (2^130-1) % (2^130-5). + []byte{ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }, + []byte{1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + []byte{4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + }, + { + // This test generates a result of (2^130-6) % (2^130-5). + []byte{ + 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }, + []byte{1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + []byte{0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, + }, + { + // This test generates a result of (2^130-5) % (2^130-5). + []byte{ + 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }, + []byte{1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + }, +} + +func testSum(t *testing.T, unaligned bool) { + var out [16]byte + var key [32]byte + + for i, v := range testData { + in := v.in + if unaligned { + in = unalignBytes(in) + } + copy(key[:], v.k) + Sum(&out, in, &key) + if !bytes.Equal(out[:], v.correct) { + t.Errorf("%d: expected %x, got %x", i, v.correct, out[:]) + } + } +} + +func TestBurnin(t *testing.T) { + // This test can be used to sanity-check significant changes. It can + // take about many minutes to run, even on fast machines. It's disabled + // by default. + if !*stressFlag { + t.Skip("skipping without -stress") + } + + var key [32]byte + var input [25]byte + var output [16]byte + + for i := range key { + key[i] = 1 + } + for i := range input { + input[i] = 2 + } + + for i := uint64(0); i < 1e10; i++ { + Sum(&output, input[:], &key) + copy(key[0:], output[:]) + copy(key[16:], output[:]) + copy(input[:], output[:]) + copy(input[16:], output[:]) + } + + const expected = "5e3b866aea0b636d240c83c428f84bfa" + if got := hex.EncodeToString(output[:]); got != expected { + t.Errorf("expected %s, got %s", expected, got) + } +} + +func TestSum(t *testing.T) { testSum(t, false) } +func TestSumUnaligned(t *testing.T) { testSum(t, true) } + +func benchmark(b *testing.B, size int, unaligned bool) { + var out [16]byte + var key [32]byte + in := make([]byte, size) + if unaligned { + in = unalignBytes(in) + } + b.SetBytes(int64(len(in))) + b.ResetTimer() + for i := 0; i < b.N; i++ { + Sum(&out, in, &key) + } +} + +func Benchmark64(b *testing.B) { benchmark(b, 64, false) } +func Benchmark1K(b *testing.B) { benchmark(b, 1024, false) } +func Benchmark64Unaligned(b *testing.B) { benchmark(b, 64, true) } +func Benchmark1KUnaligned(b *testing.B) { benchmark(b, 1024, true) } + +func unalignBytes(in []byte) []byte { + out := make([]byte, len(in)+1) + if uintptr(unsafe.Pointer(&out[0]))&(unsafe.Alignof(uint32(0))-1) == 0 { //nolint:gosec + out = out[1:] + } else { + out = out[:len(in)] + } + copy(out, in) + return out +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/poly1305/sum_amd64.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/poly1305/sum_amd64.go new file mode 100644 index 00000000..4dd72fe7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/poly1305/sum_amd64.go @@ -0,0 +1,22 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build amd64,!gccgo,!appengine + +package poly1305 + +// This function is implemented in sum_amd64.s +//go:noescape +func poly1305(out *[16]byte, m *byte, mlen uint64, key *[32]byte) + +// Sum generates an authenticator for m using a one-time key and puts the +// 16-byte result into out. Authenticating two different messages with the same +// key allows an attacker to forge messages at will. +func Sum(out *[16]byte, m []byte, key *[32]byte) { + var mPtr *byte + if len(m) > 0 { + mPtr = &m[0] + } + poly1305(out, mPtr, uint64(len(m)), key) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/poly1305/sum_amd64.s b/vendor/github.com/SkycoinProject/skycoin/src/cipher/poly1305/sum_amd64.s new file mode 100644 index 00000000..2edae638 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/poly1305/sum_amd64.s @@ -0,0 +1,125 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build amd64,!gccgo,!appengine + +#include "textflag.h" + +#define POLY1305_ADD(msg, h0, h1, h2) \ + ADDQ 0(msg), h0; \ + ADCQ 8(msg), h1; \ + ADCQ $1, h2; \ + LEAQ 16(msg), msg + +#define POLY1305_MUL(h0, h1, h2, r0, r1, t0, t1, t2, t3) \ + MOVQ r0, AX; \ + MULQ h0; \ + MOVQ AX, t0; \ + MOVQ DX, t1; \ + MOVQ r0, AX; \ + MULQ h1; \ + ADDQ AX, t1; \ + ADCQ $0, DX; \ + MOVQ r0, t2; \ + IMULQ h2, t2; \ + ADDQ DX, t2; \ + \ + MOVQ r1, AX; \ + MULQ h0; \ + ADDQ AX, t1; \ + ADCQ $0, DX; \ + MOVQ DX, h0; \ + MOVQ r1, t3; \ + IMULQ h2, t3; \ + MOVQ r1, AX; \ + MULQ h1; \ + ADDQ AX, t2; \ + ADCQ DX, t3; \ + ADDQ h0, t2; \ + ADCQ $0, t3; \ + \ + MOVQ t0, h0; \ + MOVQ t1, h1; \ + MOVQ t2, h2; \ + ANDQ $3, h2; \ + MOVQ t2, t0; \ + ANDQ $0xFFFFFFFFFFFFFFFC, t0; \ + ADDQ t0, h0; \ + ADCQ t3, h1; \ + ADCQ $0, h2; \ + SHRQ $2, t3, t2; \ + SHRQ $2, t3; \ + ADDQ t2, h0; \ + ADCQ t3, h1; \ + ADCQ $0, h2 + +DATA ·poly1305Mask<>+0x00(SB)/8, $0x0FFFFFFC0FFFFFFF +DATA ·poly1305Mask<>+0x08(SB)/8, $0x0FFFFFFC0FFFFFFC +GLOBL ·poly1305Mask<>(SB), RODATA, $16 + +// func poly1305(out *[16]byte, m *byte, mlen uint64, key *[32]key) +TEXT ·poly1305(SB), $0-32 + MOVQ out+0(FP), DI + MOVQ m+8(FP), SI + MOVQ mlen+16(FP), R15 + MOVQ key+24(FP), AX + + MOVQ 0(AX), R11 + MOVQ 8(AX), R12 + ANDQ ·poly1305Mask<>(SB), R11 // r0 + ANDQ ·poly1305Mask<>+8(SB), R12 // r1 + XORQ R8, R8 // h0 + XORQ R9, R9 // h1 + XORQ R10, R10 // h2 + + CMPQ R15, $16 + JB bytes_between_0_and_15 + +loop: + POLY1305_ADD(SI, R8, R9, R10) + +multiply: + POLY1305_MUL(R8, R9, R10, R11, R12, BX, CX, R13, R14) + SUBQ $16, R15 + CMPQ R15, $16 + JAE loop + +bytes_between_0_and_15: + TESTQ R15, R15 + JZ done + MOVQ $1, BX + XORQ CX, CX + XORQ R13, R13 + ADDQ R15, SI + +flush_buffer: + SHLQ $8, BX, CX + SHLQ $8, BX + MOVB -1(SI), R13 + XORQ R13, BX + DECQ SI + DECQ R15 + JNZ flush_buffer + + ADDQ BX, R8 + ADCQ CX, R9 + ADCQ $0, R10 + MOVQ $16, R15 + JMP multiply + +done: + MOVQ R8, AX + MOVQ R9, BX + SUBQ $0xFFFFFFFFFFFFFFFB, AX + SBBQ $0xFFFFFFFFFFFFFFFF, BX + SBBQ $3, R10 + CMOVQCS R8, AX + CMOVQCS R9, BX + MOVQ key+24(FP), R8 + ADDQ 16(R8), AX + ADCQ 24(R8), BX + + MOVQ AX, 0(DI) + MOVQ BX, 8(DI) + RET diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/poly1305/sum_arm.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/poly1305/sum_arm.go new file mode 100644 index 00000000..5dc321c2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/poly1305/sum_arm.go @@ -0,0 +1,22 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build arm,!gccgo,!appengine,!nacl + +package poly1305 + +// This function is implemented in sum_arm.s +//go:noescape +func poly1305_auth_armv6(out *[16]byte, m *byte, mlen uint32, key *[32]byte) + +// Sum generates an authenticator for m using a one-time key and puts the +// 16-byte result into out. Authenticating two different messages with the same +// key allows an attacker to forge messages at will. +func Sum(out *[16]byte, m []byte, key *[32]byte) { + var mPtr *byte + if len(m) > 0 { + mPtr = &m[0] + } + poly1305_auth_armv6(out, mPtr, uint32(len(m)), key) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/poly1305/sum_arm.s b/vendor/github.com/SkycoinProject/skycoin/src/cipher/poly1305/sum_arm.s new file mode 100644 index 00000000..f70b4ac4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/poly1305/sum_arm.s @@ -0,0 +1,427 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build arm,!gccgo,!appengine,!nacl + +#include "textflag.h" + +// This code was translated into a form compatible with 5a from the public +// domain source by Andrew Moon: github.com/floodyberry/poly1305-opt/blob/master/app/extensions/poly1305. + +DATA ·poly1305_init_constants_armv6<>+0x00(SB)/4, $0x3ffffff +DATA ·poly1305_init_constants_armv6<>+0x04(SB)/4, $0x3ffff03 +DATA ·poly1305_init_constants_armv6<>+0x08(SB)/4, $0x3ffc0ff +DATA ·poly1305_init_constants_armv6<>+0x0c(SB)/4, $0x3f03fff +DATA ·poly1305_init_constants_armv6<>+0x10(SB)/4, $0x00fffff +GLOBL ·poly1305_init_constants_armv6<>(SB), 8, $20 + +// Warning: the linker may use R11 to synthesize certain instructions. Please +// take care and verify that no synthetic instructions use it. + +TEXT poly1305_init_ext_armv6<>(SB), NOSPLIT, $0 + // Needs 16 bytes of stack and 64 bytes of space pointed to by R0. (It + // might look like it's only 60 bytes of space but the final four bytes + // will be written by another function.) We need to skip over four + // bytes of stack because that's saving the value of 'g'. + ADD $4, R13, R8 + MOVM.IB [R4-R7], (R8) + MOVM.IA.W (R1), [R2-R5] + MOVW $·poly1305_init_constants_armv6<>(SB), R7 + MOVW R2, R8 + MOVW R2>>26, R9 + MOVW R3>>20, g + MOVW R4>>14, R11 + MOVW R5>>8, R12 + ORR R3<<6, R9, R9 + ORR R4<<12, g, g + ORR R5<<18, R11, R11 + MOVM.IA (R7), [R2-R6] + AND R8, R2, R2 + AND R9, R3, R3 + AND g, R4, R4 + AND R11, R5, R5 + AND R12, R6, R6 + MOVM.IA.W [R2-R6], (R0) + EOR R2, R2, R2 + EOR R3, R3, R3 + EOR R4, R4, R4 + EOR R5, R5, R5 + EOR R6, R6, R6 + MOVM.IA.W [R2-R6], (R0) + MOVM.IA.W (R1), [R2-R5] + MOVM.IA [R2-R6], (R0) + ADD $20, R13, R0 + MOVM.DA (R0), [R4-R7] + RET + +#define MOVW_UNALIGNED(Rsrc, Rdst, Rtmp, offset) \ + MOVBU (offset+0)(Rsrc), Rtmp; \ + MOVBU Rtmp, (offset+0)(Rdst); \ + MOVBU (offset+1)(Rsrc), Rtmp; \ + MOVBU Rtmp, (offset+1)(Rdst); \ + MOVBU (offset+2)(Rsrc), Rtmp; \ + MOVBU Rtmp, (offset+2)(Rdst); \ + MOVBU (offset+3)(Rsrc), Rtmp; \ + MOVBU Rtmp, (offset+3)(Rdst) + +TEXT poly1305_blocks_armv6<>(SB), NOSPLIT, $0 + // Needs 24 bytes of stack for saved registers and then 88 bytes of + // scratch space after that. We assume that 24 bytes at (R13) have + // already been used: four bytes for the link register saved in the + // prelude of poly1305_auth_armv6, four bytes for saving the value of g + // in that function and 16 bytes of scratch space used around + // poly1305_finish_ext_armv6_skip1. + ADD $24, R13, R12 + MOVM.IB [R4-R8, R14], (R12) + MOVW R0, 88(R13) + MOVW R1, 92(R13) + MOVW R2, 96(R13) + MOVW R1, R14 + MOVW R2, R12 + MOVW 56(R0), R8 + WORD $0xe1180008 // TST R8, R8 not working see issue 5921 + EOR R6, R6, R6 + MOVW.EQ $(1<<24), R6 + MOVW R6, 84(R13) + ADD $116, R13, g + MOVM.IA (R0), [R0-R9] + MOVM.IA [R0-R4], (g) + CMP $16, R12 + BLO poly1305_blocks_armv6_done + +poly1305_blocks_armv6_mainloop: + WORD $0xe31e0003 // TST R14, #3 not working see issue 5921 + BEQ poly1305_blocks_armv6_mainloop_aligned + ADD $100, R13, g + MOVW_UNALIGNED(R14, g, R0, 0) + MOVW_UNALIGNED(R14, g, R0, 4) + MOVW_UNALIGNED(R14, g, R0, 8) + MOVW_UNALIGNED(R14, g, R0, 12) + MOVM.IA (g), [R0-R3] + ADD $16, R14 + B poly1305_blocks_armv6_mainloop_loaded + +poly1305_blocks_armv6_mainloop_aligned: + MOVM.IA.W (R14), [R0-R3] + +poly1305_blocks_armv6_mainloop_loaded: + MOVW R0>>26, g + MOVW R1>>20, R11 + MOVW R2>>14, R12 + MOVW R14, 92(R13) + MOVW R3>>8, R4 + ORR R1<<6, g, g + ORR R2<<12, R11, R11 + ORR R3<<18, R12, R12 + BIC $0xfc000000, R0, R0 + BIC $0xfc000000, g, g + MOVW 84(R13), R3 + BIC $0xfc000000, R11, R11 + BIC $0xfc000000, R12, R12 + ADD R0, R5, R5 + ADD g, R6, R6 + ORR R3, R4, R4 + ADD R11, R7, R7 + ADD $116, R13, R14 + ADD R12, R8, R8 + ADD R4, R9, R9 + MOVM.IA (R14), [R0-R4] + MULLU R4, R5, (R11, g) + MULLU R3, R5, (R14, R12) + MULALU R3, R6, (R11, g) + MULALU R2, R6, (R14, R12) + MULALU R2, R7, (R11, g) + MULALU R1, R7, (R14, R12) + ADD R4<<2, R4, R4 + ADD R3<<2, R3, R3 + MULALU R1, R8, (R11, g) + MULALU R0, R8, (R14, R12) + MULALU R0, R9, (R11, g) + MULALU R4, R9, (R14, R12) + MOVW g, 76(R13) + MOVW R11, 80(R13) + MOVW R12, 68(R13) + MOVW R14, 72(R13) + MULLU R2, R5, (R11, g) + MULLU R1, R5, (R14, R12) + MULALU R1, R6, (R11, g) + MULALU R0, R6, (R14, R12) + MULALU R0, R7, (R11, g) + MULALU R4, R7, (R14, R12) + ADD R2<<2, R2, R2 + ADD R1<<2, R1, R1 + MULALU R4, R8, (R11, g) + MULALU R3, R8, (R14, R12) + MULALU R3, R9, (R11, g) + MULALU R2, R9, (R14, R12) + MOVW g, 60(R13) + MOVW R11, 64(R13) + MOVW R12, 52(R13) + MOVW R14, 56(R13) + MULLU R0, R5, (R11, g) + MULALU R4, R6, (R11, g) + MULALU R3, R7, (R11, g) + MULALU R2, R8, (R11, g) + MULALU R1, R9, (R11, g) + ADD $52, R13, R0 + MOVM.IA (R0), [R0-R7] + MOVW g>>26, R12 + MOVW R4>>26, R14 + ORR R11<<6, R12, R12 + ORR R5<<6, R14, R14 + BIC $0xfc000000, g, g + BIC $0xfc000000, R4, R4 + ADD.S R12, R0, R0 + ADC $0, R1, R1 + ADD.S R14, R6, R6 + ADC $0, R7, R7 + MOVW R0>>26, R12 + MOVW R6>>26, R14 + ORR R1<<6, R12, R12 + ORR R7<<6, R14, R14 + BIC $0xfc000000, R0, R0 + BIC $0xfc000000, R6, R6 + ADD R14<<2, R14, R14 + ADD.S R12, R2, R2 + ADC $0, R3, R3 + ADD R14, g, g + MOVW R2>>26, R12 + MOVW g>>26, R14 + ORR R3<<6, R12, R12 + BIC $0xfc000000, g, R5 + BIC $0xfc000000, R2, R7 + ADD R12, R4, R4 + ADD R14, R0, R0 + MOVW R4>>26, R12 + BIC $0xfc000000, R4, R8 + ADD R12, R6, R9 + MOVW 96(R13), R12 + MOVW 92(R13), R14 + MOVW R0, R6 + CMP $32, R12 + SUB $16, R12, R12 + MOVW R12, 96(R13) + BHS poly1305_blocks_armv6_mainloop + +poly1305_blocks_armv6_done: + MOVW 88(R13), R12 + MOVW R5, 20(R12) + MOVW R6, 24(R12) + MOVW R7, 28(R12) + MOVW R8, 32(R12) + MOVW R9, 36(R12) + ADD $48, R13, R0 + MOVM.DA (R0), [R4-R8, R14] + RET + +#define MOVHUP_UNALIGNED(Rsrc, Rdst, Rtmp) \ + MOVBU.P 1(Rsrc), Rtmp; \ + MOVBU.P Rtmp, 1(Rdst); \ + MOVBU.P 1(Rsrc), Rtmp; \ + MOVBU.P Rtmp, 1(Rdst) + +#define MOVWP_UNALIGNED(Rsrc, Rdst, Rtmp) \ + MOVHUP_UNALIGNED(Rsrc, Rdst, Rtmp); \ + MOVHUP_UNALIGNED(Rsrc, Rdst, Rtmp) + +// func poly1305_auth_armv6(out *[16]byte, m *byte, mlen uint32, key *[32]key) +TEXT ·poly1305_auth_armv6(SB), $196-16 + // The value 196, just above, is the sum of 64 (the size of the context + // structure) and 132 (the amount of stack needed). + // + // At this point, the stack pointer (R13) has been moved down. It + // points to the saved link register and there's 196 bytes of free + // space above it. + // + // The stack for this function looks like: + // + // +--------------------- + // | + // | 64 bytes of context structure + // | + // +--------------------- + // | + // | 112 bytes for poly1305_blocks_armv6 + // | + // +--------------------- + // | 16 bytes of final block, constructed at + // | poly1305_finish_ext_armv6_skip8 + // +--------------------- + // | four bytes of saved 'g' + // +--------------------- + // | lr, saved by prelude <- R13 points here + // +--------------------- + MOVW g, 4(R13) + + MOVW out+0(FP), R4 + MOVW m+4(FP), R5 + MOVW mlen+8(FP), R6 + MOVW key+12(FP), R7 + + ADD $136, R13, R0 // 136 = 4 + 4 + 16 + 112 + MOVW R7, R1 + + // poly1305_init_ext_armv6 will write to the stack from R13+4, but + // that's ok because none of the other values have been written yet. + BL poly1305_init_ext_armv6<>(SB) + BIC.S $15, R6, R2 + BEQ poly1305_auth_armv6_noblocks + ADD $136, R13, R0 + MOVW R5, R1 + ADD R2, R5, R5 + SUB R2, R6, R6 + BL poly1305_blocks_armv6<>(SB) + +poly1305_auth_armv6_noblocks: + ADD $136, R13, R0 + MOVW R5, R1 + MOVW R6, R2 + MOVW R4, R3 + + MOVW R0, R5 + MOVW R1, R6 + MOVW R2, R7 + MOVW R3, R8 + AND.S R2, R2, R2 + BEQ poly1305_finish_ext_armv6_noremaining + EOR R0, R0 + ADD $8, R13, R9 // 8 = offset to 16 byte scratch space + MOVW R0, (R9) + MOVW R0, 4(R9) + MOVW R0, 8(R9) + MOVW R0, 12(R9) + WORD $0xe3110003 // TST R1, #3 not working see issue 5921 + BEQ poly1305_finish_ext_armv6_aligned + WORD $0xe3120008 // TST R2, #8 not working see issue 5921 + BEQ poly1305_finish_ext_armv6_skip8 + MOVWP_UNALIGNED(R1, R9, g) + MOVWP_UNALIGNED(R1, R9, g) + +poly1305_finish_ext_armv6_skip8: + WORD $0xe3120004 // TST $4, R2 not working see issue 5921 + BEQ poly1305_finish_ext_armv6_skip4 + MOVWP_UNALIGNED(R1, R9, g) + +poly1305_finish_ext_armv6_skip4: + WORD $0xe3120002 // TST $2, R2 not working see issue 5921 + BEQ poly1305_finish_ext_armv6_skip2 + MOVHUP_UNALIGNED(R1, R9, g) + B poly1305_finish_ext_armv6_skip2 + +poly1305_finish_ext_armv6_aligned: + WORD $0xe3120008 // TST R2, #8 not working see issue 5921 + BEQ poly1305_finish_ext_armv6_skip8_aligned + MOVM.IA.W (R1), [g-R11] + MOVM.IA.W [g-R11], (R9) + +poly1305_finish_ext_armv6_skip8_aligned: + WORD $0xe3120004 // TST $4, R2 not working see issue 5921 + BEQ poly1305_finish_ext_armv6_skip4_aligned + MOVW.P 4(R1), g + MOVW.P g, 4(R9) + +poly1305_finish_ext_armv6_skip4_aligned: + WORD $0xe3120002 // TST $2, R2 not working see issue 5921 + BEQ poly1305_finish_ext_armv6_skip2 + MOVHU.P 2(R1), g + MOVH.P g, 2(R9) + +poly1305_finish_ext_armv6_skip2: + WORD $0xe3120001 // TST $1, R2 not working see issue 5921 + BEQ poly1305_finish_ext_armv6_skip1 + MOVBU.P 1(R1), g + MOVBU.P g, 1(R9) + +poly1305_finish_ext_armv6_skip1: + MOVW $1, R11 + MOVBU R11, 0(R9) + MOVW R11, 56(R5) + MOVW R5, R0 + ADD $8, R13, R1 + MOVW $16, R2 + BL poly1305_blocks_armv6<>(SB) + +poly1305_finish_ext_armv6_noremaining: + MOVW 20(R5), R0 + MOVW 24(R5), R1 + MOVW 28(R5), R2 + MOVW 32(R5), R3 + MOVW 36(R5), R4 + MOVW R4>>26, R12 + BIC $0xfc000000, R4, R4 + ADD R12<<2, R12, R12 + ADD R12, R0, R0 + MOVW R0>>26, R12 + BIC $0xfc000000, R0, R0 + ADD R12, R1, R1 + MOVW R1>>26, R12 + BIC $0xfc000000, R1, R1 + ADD R12, R2, R2 + MOVW R2>>26, R12 + BIC $0xfc000000, R2, R2 + ADD R12, R3, R3 + MOVW R3>>26, R12 + BIC $0xfc000000, R3, R3 + ADD R12, R4, R4 + ADD $5, R0, R6 + MOVW R6>>26, R12 + BIC $0xfc000000, R6, R6 + ADD R12, R1, R7 + MOVW R7>>26, R12 + BIC $0xfc000000, R7, R7 + ADD R12, R2, g + MOVW g>>26, R12 + BIC $0xfc000000, g, g + ADD R12, R3, R11 + MOVW $-(1<<26), R12 + ADD R11>>26, R12, R12 + BIC $0xfc000000, R11, R11 + ADD R12, R4, R9 + MOVW R9>>31, R12 + SUB $1, R12 + AND R12, R6, R6 + AND R12, R7, R7 + AND R12, g, g + AND R12, R11, R11 + AND R12, R9, R9 + MVN R12, R12 + AND R12, R0, R0 + AND R12, R1, R1 + AND R12, R2, R2 + AND R12, R3, R3 + AND R12, R4, R4 + ORR R6, R0, R0 + ORR R7, R1, R1 + ORR g, R2, R2 + ORR R11, R3, R3 + ORR R9, R4, R4 + ORR R1<<26, R0, R0 + MOVW R1>>6, R1 + ORR R2<<20, R1, R1 + MOVW R2>>12, R2 + ORR R3<<14, R2, R2 + MOVW R3>>18, R3 + ORR R4<<8, R3, R3 + MOVW 40(R5), R6 + MOVW 44(R5), R7 + MOVW 48(R5), g + MOVW 52(R5), R11 + ADD.S R6, R0, R0 + ADC.S R7, R1, R1 + ADC.S g, R2, R2 + ADC.S R11, R3, R3 + MOVM.IA [R0-R3], (R8) + MOVW R5, R12 + EOR R0, R0, R0 + EOR R1, R1, R1 + EOR R2, R2, R2 + EOR R3, R3, R3 + EOR R4, R4, R4 + EOR R5, R5, R5 + EOR R6, R6, R6 + EOR R7, R7, R7 + MOVM.IA.W [R0-R7], (R12) + MOVM.IA [R0-R7], (R12) + MOVW 4(R13), g + RET diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/poly1305/sum_ref.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/poly1305/sum_ref.go new file mode 100644 index 00000000..b2805a5c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/poly1305/sum_ref.go @@ -0,0 +1,141 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !amd64,!arm gccgo appengine nacl + +package poly1305 + +import "encoding/binary" + +// Sum generates an authenticator for msg using a one-time key and puts the +// 16-byte result into out. Authenticating two different messages with the same +// key allows an attacker to forge messages at will. +func Sum(out *[TagSize]byte, msg []byte, key *[32]byte) { + var ( + h0, h1, h2, h3, h4 uint32 // the hash accumulators + r0, r1, r2, r3, r4 uint64 // the r part of the key + ) + + r0 = uint64(binary.LittleEndian.Uint32(key[0:]) & 0x3ffffff) + r1 = uint64((binary.LittleEndian.Uint32(key[3:]) >> 2) & 0x3ffff03) + r2 = uint64((binary.LittleEndian.Uint32(key[6:]) >> 4) & 0x3ffc0ff) + r3 = uint64((binary.LittleEndian.Uint32(key[9:]) >> 6) & 0x3f03fff) + r4 = uint64((binary.LittleEndian.Uint32(key[12:]) >> 8) & 0x00fffff) + + R1, R2, R3, R4 := r1*5, r2*5, r3*5, r4*5 + + for len(msg) >= TagSize { + // h += msg + h0 += binary.LittleEndian.Uint32(msg[0:]) & 0x3ffffff + h1 += (binary.LittleEndian.Uint32(msg[3:]) >> 2) & 0x3ffffff + h2 += (binary.LittleEndian.Uint32(msg[6:]) >> 4) & 0x3ffffff + h3 += (binary.LittleEndian.Uint32(msg[9:]) >> 6) & 0x3ffffff + h4 += (binary.LittleEndian.Uint32(msg[12:]) >> 8) | (1 << 24) + + // h *= r + d0 := (uint64(h0) * r0) + (uint64(h1) * R4) + (uint64(h2) * R3) + (uint64(h3) * R2) + (uint64(h4) * R1) + d1 := (d0 >> 26) + (uint64(h0) * r1) + (uint64(h1) * r0) + (uint64(h2) * R4) + (uint64(h3) * R3) + (uint64(h4) * R2) + d2 := (d1 >> 26) + (uint64(h0) * r2) + (uint64(h1) * r1) + (uint64(h2) * r0) + (uint64(h3) * R4) + (uint64(h4) * R3) + d3 := (d2 >> 26) + (uint64(h0) * r3) + (uint64(h1) * r2) + (uint64(h2) * r1) + (uint64(h3) * r0) + (uint64(h4) * R4) + d4 := (d3 >> 26) + (uint64(h0) * r4) + (uint64(h1) * r3) + (uint64(h2) * r2) + (uint64(h3) * r1) + (uint64(h4) * r0) + + // h %= p + h0 = uint32(d0) & 0x3ffffff + h1 = uint32(d1) & 0x3ffffff + h2 = uint32(d2) & 0x3ffffff + h3 = uint32(d3) & 0x3ffffff + h4 = uint32(d4) & 0x3ffffff + + h0 += uint32(d4>>26) * 5 + h1 += h0 >> 26 + h0 = h0 & 0x3ffffff + + msg = msg[TagSize:] + } + + if len(msg) > 0 { + var block [TagSize]byte + off := copy(block[:], msg) + block[off] = 0x01 + + // h += msg + h0 += binary.LittleEndian.Uint32(block[0:]) & 0x3ffffff + h1 += (binary.LittleEndian.Uint32(block[3:]) >> 2) & 0x3ffffff + h2 += (binary.LittleEndian.Uint32(block[6:]) >> 4) & 0x3ffffff + h3 += (binary.LittleEndian.Uint32(block[9:]) >> 6) & 0x3ffffff + h4 += (binary.LittleEndian.Uint32(block[12:]) >> 8) + + // h *= r + d0 := (uint64(h0) * r0) + (uint64(h1) * R4) + (uint64(h2) * R3) + (uint64(h3) * R2) + (uint64(h4) * R1) + d1 := (d0 >> 26) + (uint64(h0) * r1) + (uint64(h1) * r0) + (uint64(h2) * R4) + (uint64(h3) * R3) + (uint64(h4) * R2) + d2 := (d1 >> 26) + (uint64(h0) * r2) + (uint64(h1) * r1) + (uint64(h2) * r0) + (uint64(h3) * R4) + (uint64(h4) * R3) + d3 := (d2 >> 26) + (uint64(h0) * r3) + (uint64(h1) * r2) + (uint64(h2) * r1) + (uint64(h3) * r0) + (uint64(h4) * R4) + d4 := (d3 >> 26) + (uint64(h0) * r4) + (uint64(h1) * r3) + (uint64(h2) * r2) + (uint64(h3) * r1) + (uint64(h4) * r0) + + // h %= p + h0 = uint32(d0) & 0x3ffffff + h1 = uint32(d1) & 0x3ffffff + h2 = uint32(d2) & 0x3ffffff + h3 = uint32(d3) & 0x3ffffff + h4 = uint32(d4) & 0x3ffffff + + h0 += uint32(d4>>26) * 5 + h1 += h0 >> 26 + h0 = h0 & 0x3ffffff + } + + // h %= p reduction + h2 += h1 >> 26 + h1 &= 0x3ffffff + h3 += h2 >> 26 + h2 &= 0x3ffffff + h4 += h3 >> 26 + h3 &= 0x3ffffff + h0 += 5 * (h4 >> 26) + h4 &= 0x3ffffff + h1 += h0 >> 26 + h0 &= 0x3ffffff + + // h - p + t0 := h0 + 5 + t1 := h1 + (t0 >> 26) + t2 := h2 + (t1 >> 26) + t3 := h3 + (t2 >> 26) + t4 := h4 + (t3 >> 26) - (1 << 26) + t0 &= 0x3ffffff + t1 &= 0x3ffffff + t2 &= 0x3ffffff + t3 &= 0x3ffffff + + // select h if h < p else h - p + t_mask := (t4 >> 31) - 1 + h_mask := ^t_mask + h0 = (h0 & h_mask) | (t0 & t_mask) + h1 = (h1 & h_mask) | (t1 & t_mask) + h2 = (h2 & h_mask) | (t2 & t_mask) + h3 = (h3 & h_mask) | (t3 & t_mask) + h4 = (h4 & h_mask) | (t4 & t_mask) + + // h %= 2^128 + h0 |= h1 << 26 + h1 = ((h1 >> 6) | (h2 << 20)) + h2 = ((h2 >> 12) | (h3 << 14)) + h3 = ((h3 >> 18) | (h4 << 8)) + + // s: the s part of the key + // tag = (h + s) % (2^128) + t := uint64(h0) + uint64(binary.LittleEndian.Uint32(key[16:])) + h0 = uint32(t) + t = uint64(h1) + uint64(binary.LittleEndian.Uint32(key[20:])) + (t >> 32) + h1 = uint32(t) + t = uint64(h2) + uint64(binary.LittleEndian.Uint32(key[24:])) + (t >> 32) + h2 = uint32(t) + t = uint64(h3) + uint64(binary.LittleEndian.Uint32(key[28:])) + (t >> 32) + h3 = uint32(t) + + binary.LittleEndian.PutUint32(out[0:], h0) + binary.LittleEndian.PutUint32(out[4:], h1) + binary.LittleEndian.PutUint32(out[8:], h2) + binary.LittleEndian.PutUint32(out[12:], h3) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/ripemd160/ripemd160block.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/ripemd160/ripemd160block.go new file mode 100644 index 00000000..2f45a532 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/ripemd160/ripemd160block.go @@ -0,0 +1,161 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// RIPEMD-160 block step. +// In its own file so that a faster assembly or C version +// can be substituted easily. + +package ripemd160 + +// work buffer indices and roll amounts for one line +var _n = [80]uint{ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, + 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, + 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, + 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13, +} + +var _r = [80]uint{ + 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, + 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, + 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, + 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, + 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6, +} + +// same for the other parallel one +var n_ = [80]uint{ //nolint:golint + 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, + 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, + 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, + 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, + 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11, +} + +var r_ = [80]uint{ //nolint:golint + 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, + 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, + 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, + 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, + 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11, +} + +func _Block(md *digest, p []byte) int { + n := 0 + var x [16]uint32 + var alpha, beta uint32 + for len(p) >= BlockSize { + a, b, c, d, e := md.s[0], md.s[1], md.s[2], md.s[3], md.s[4] + aa, bb, cc, dd, ee := a, b, c, d, e + j := 0 + for i := 0; i < 16; i++ { + x[i] = uint32(p[j]) | uint32(p[j+1])<<8 | uint32(p[j+2])<<16 | uint32(p[j+3])<<24 + j += 4 + } + + // round 1 + i := 0 + for i < 16 { + alpha = a + (b ^ c ^ d) + x[_n[i]] + s := _r[i] + alpha = (alpha<>(32-s)) + e + beta = c<<10 | c>>22 + a, b, c, d, e = e, alpha, b, beta, d + + // parallel line + alpha = aa + (bb ^ (cc | ^dd)) + x[n_[i]] + 0x50a28be6 + s = r_[i] + alpha = (alpha<>(32-s)) + ee + beta = cc<<10 | cc>>22 + aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd + + i++ + } + + // round 2 + for i < 32 { + alpha = a + (b&c | ^b&d) + x[_n[i]] + 0x5a827999 + s := _r[i] + alpha = (alpha<>(32-s)) + e + beta = c<<10 | c>>22 + a, b, c, d, e = e, alpha, b, beta, d + + // parallel line + alpha = aa + (bb&dd | cc&^dd) + x[n_[i]] + 0x5c4dd124 + s = r_[i] + alpha = (alpha<>(32-s)) + ee + beta = cc<<10 | cc>>22 + aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd + + i++ + } + + // round 3 + for i < 48 { + alpha = a + (b | ^c ^ d) + x[_n[i]] + 0x6ed9eba1 + s := _r[i] + alpha = (alpha<>(32-s)) + e + beta = c<<10 | c>>22 + a, b, c, d, e = e, alpha, b, beta, d + + // parallel line + alpha = aa + (bb | ^cc ^ dd) + x[n_[i]] + 0x6d703ef3 + s = r_[i] + alpha = (alpha<>(32-s)) + ee + beta = cc<<10 | cc>>22 + aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd + + i++ + } + + // round 4 + for i < 64 { + alpha = a + (b&d | c&^d) + x[_n[i]] + 0x8f1bbcdc + s := _r[i] + alpha = (alpha<>(32-s)) + e + beta = c<<10 | c>>22 + a, b, c, d, e = e, alpha, b, beta, d + + // parallel line + alpha = aa + (bb&cc | ^bb&dd) + x[n_[i]] + 0x7a6d76e9 + s = r_[i] + alpha = (alpha<>(32-s)) + ee + beta = cc<<10 | cc>>22 + aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd + + i++ + } + + // round 5 + for i < 80 { + alpha = a + (b ^ (c | ^d)) + x[_n[i]] + 0xa953fd4e + s := _r[i] + alpha = (alpha<>(32-s)) + e + beta = c<<10 | c>>22 + a, b, c, d, e = e, alpha, b, beta, d + + // parallel line + alpha = aa + (bb ^ cc ^ dd) + x[n_[i]] + s = r_[i] + alpha = (alpha<>(32-s)) + ee + beta = cc<<10 | cc>>22 + aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd + + i++ + } + + // combine results + dd += c + md.s[1] + md.s[1] = md.s[2] + d + ee + md.s[2] = md.s[3] + e + aa + md.s[3] = md.s[4] + a + bb + md.s[4] = md.s[0] + b + cc + md.s[0] = dd + + p = p[BlockSize:] + n += BlockSize + } + return n +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/ripemd160/ripmd_160.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/ripemd160/ripmd_160.go new file mode 100644 index 00000000..d406bbfe --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/ripemd160/ripmd_160.go @@ -0,0 +1,121 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package ripemd160 implements the RIPEMD-160 hash algorithm. +package ripemd160 + +// RIPEMD-160 is designed by by Hans Dobbertin, Antoon Bosselaers, and Bart +// Preneel with specifications available at: +// http://homes.esat.kuleuven.be/~cosicart/pdf/AB-9601/AB-9601.pdf. + +import ( + "crypto" + "hash" +) + +func init() { + crypto.RegisterHash(crypto.RIPEMD160, New) +} + +// Size is the size of the checksum in bytes. +const Size = 20 + +// BlockSize is the block size of the hash algorithm in bytes. +const BlockSize = 64 + +const ( + _s0 = 0x67452301 + _s1 = 0xefcdab89 + _s2 = 0x98badcfe + _s3 = 0x10325476 + _s4 = 0xc3d2e1f0 +) + +// digest represents the partial evaluation of a checksum. +type digest struct { + s [5]uint32 // running context + x [BlockSize]byte // temporary buffer + nx int // index into x + tc uint64 // total count of bytes processed +} + +func (d *digest) Reset() { + d.s[0], d.s[1], d.s[2], d.s[3], d.s[4] = _s0, _s1, _s2, _s3, _s4 + d.nx = 0 + d.tc = 0 +} + +// New returns a new hash.Hash computing the checksum. +func New() hash.Hash { + result := new(digest) + result.Reset() + return result +} + +func (d *digest) Size() int { return Size } + +func (d *digest) BlockSize() int { return BlockSize } + +func (d *digest) Write(p []byte) (nn int, err error) { + nn = len(p) + d.tc += uint64(nn) + if d.nx > 0 { + n := len(p) + if n > BlockSize-d.nx { + n = BlockSize - d.nx + } + for i := 0; i < n; i++ { + d.x[d.nx+i] = p[i] + } + d.nx += n + if d.nx == BlockSize { + _Block(d, d.x[0:]) + d.nx = 0 + } + p = p[n:] + } + n := _Block(d, p) + p = p[n:] + if len(p) > 0 { + d.nx = copy(d.x[:], p) + } + return +} + +func (d0 *digest) Sum(in []byte) []byte { //nolint:golint + // Make a copy of d0 so that caller can keep writing and summing. + d := *d0 + + // Padding. Add a 1 bit and 0 bits until 56 bytes mod 64. + tc := d.tc + var tmp [64]byte + tmp[0] = 0x80 + if tc%64 < 56 { + + d.Write(tmp[0 : 56-tc%64]) //nolint:errcheck,gosec + } else { + d.Write(tmp[0 : 64+56-tc%64]) //nolint:errcheck,gosec + } + + // Length in bits. + tc <<= 3 + for i := uint(0); i < 8; i++ { + tmp[i] = byte(tc >> (8 * i)) + } + d.Write(tmp[0:8]) //nolint:errcheck,gosec + + if d.nx != 0 { + panic("d.nx != 0") + } + + var digest [Size]byte + for i, s := range d.s { + digest[i*4] = byte(s) + digest[i*4+1] = byte(s >> 8) + digest[i*4+2] = byte(s >> 16) + digest[i*4+3] = byte(s >> 24) + } + + return append(in, digest[:]...) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/scrypt/scrypt.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/scrypt/scrypt.go new file mode 100644 index 00000000..57e6ace8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/scrypt/scrypt.go @@ -0,0 +1,243 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package scrypt implements the scrypt key derivation function as defined in +// Colin Percival's paper "Stronger Key Derivation via Sequential Memory-Hard +// Functions" (http://www.tarsnap.com/scrypt/scrypt.pdf). +package scrypt // import "github.com/SkycoinProject/skycoin/src/cipher/scrypt" + +import ( + "crypto/sha256" + "errors" + + "github.com/SkycoinProject/skycoin/src/cipher/pbkdf2" +) + +const maxInt = int(^uint(0) >> 1) + +// blockCopy copies n numbers from src into dst. +func blockCopy(dst, src []uint32, n int) { + copy(dst, src[:n]) +} + +// blockXOR XORs numbers from dst with n numbers from src. +func blockXOR(dst, src []uint32, n int) { + for i, v := range src[:n] { + dst[i] ^= v + } +} + +// salsaXOR applies Salsa20/8 to the XOR of 16 numbers from tmp and in, +// and puts the result into both both tmp and out. +func salsaXOR(tmp *[16]uint32, in, out []uint32) { + w0 := tmp[0] ^ in[0] + w1 := tmp[1] ^ in[1] + w2 := tmp[2] ^ in[2] + w3 := tmp[3] ^ in[3] + w4 := tmp[4] ^ in[4] + w5 := tmp[5] ^ in[5] + w6 := tmp[6] ^ in[6] + w7 := tmp[7] ^ in[7] + w8 := tmp[8] ^ in[8] + w9 := tmp[9] ^ in[9] + w10 := tmp[10] ^ in[10] + w11 := tmp[11] ^ in[11] + w12 := tmp[12] ^ in[12] + w13 := tmp[13] ^ in[13] + w14 := tmp[14] ^ in[14] + w15 := tmp[15] ^ in[15] + + x0, x1, x2, x3, x4, x5, x6, x7, x8 := w0, w1, w2, w3, w4, w5, w6, w7, w8 + x9, x10, x11, x12, x13, x14, x15 := w9, w10, w11, w12, w13, w14, w15 + + for i := 0; i < 8; i += 2 { + u := x0 + x12 + x4 ^= u<<7 | u>>(32-7) + u = x4 + x0 + x8 ^= u<<9 | u>>(32-9) + u = x8 + x4 + x12 ^= u<<13 | u>>(32-13) + u = x12 + x8 + x0 ^= u<<18 | u>>(32-18) + + u = x5 + x1 + x9 ^= u<<7 | u>>(32-7) + u = x9 + x5 + x13 ^= u<<9 | u>>(32-9) + u = x13 + x9 + x1 ^= u<<13 | u>>(32-13) + u = x1 + x13 + x5 ^= u<<18 | u>>(32-18) + + u = x10 + x6 + x14 ^= u<<7 | u>>(32-7) + u = x14 + x10 + x2 ^= u<<9 | u>>(32-9) + u = x2 + x14 + x6 ^= u<<13 | u>>(32-13) + u = x6 + x2 + x10 ^= u<<18 | u>>(32-18) + + u = x15 + x11 + x3 ^= u<<7 | u>>(32-7) + u = x3 + x15 + x7 ^= u<<9 | u>>(32-9) + u = x7 + x3 + x11 ^= u<<13 | u>>(32-13) + u = x11 + x7 + x15 ^= u<<18 | u>>(32-18) + + u = x0 + x3 + x1 ^= u<<7 | u>>(32-7) + u = x1 + x0 + x2 ^= u<<9 | u>>(32-9) + u = x2 + x1 + x3 ^= u<<13 | u>>(32-13) + u = x3 + x2 + x0 ^= u<<18 | u>>(32-18) + + u = x5 + x4 + x6 ^= u<<7 | u>>(32-7) + u = x6 + x5 + x7 ^= u<<9 | u>>(32-9) + u = x7 + x6 + x4 ^= u<<13 | u>>(32-13) + u = x4 + x7 + x5 ^= u<<18 | u>>(32-18) + + u = x10 + x9 + x11 ^= u<<7 | u>>(32-7) + u = x11 + x10 + x8 ^= u<<9 | u>>(32-9) + u = x8 + x11 + x9 ^= u<<13 | u>>(32-13) + u = x9 + x8 + x10 ^= u<<18 | u>>(32-18) + + u = x15 + x14 + x12 ^= u<<7 | u>>(32-7) + u = x12 + x15 + x13 ^= u<<9 | u>>(32-9) + u = x13 + x12 + x14 ^= u<<13 | u>>(32-13) + u = x14 + x13 + x15 ^= u<<18 | u>>(32-18) + } + x0 += w0 + x1 += w1 + x2 += w2 + x3 += w3 + x4 += w4 + x5 += w5 + x6 += w6 + x7 += w7 + x8 += w8 + x9 += w9 + x10 += w10 + x11 += w11 + x12 += w12 + x13 += w13 + x14 += w14 + x15 += w15 + + out[0], tmp[0] = x0, x0 + out[1], tmp[1] = x1, x1 + out[2], tmp[2] = x2, x2 + out[3], tmp[3] = x3, x3 + out[4], tmp[4] = x4, x4 + out[5], tmp[5] = x5, x5 + out[6], tmp[6] = x6, x6 + out[7], tmp[7] = x7, x7 + out[8], tmp[8] = x8, x8 + out[9], tmp[9] = x9, x9 + out[10], tmp[10] = x10, x10 + out[11], tmp[11] = x11, x11 + out[12], tmp[12] = x12, x12 + out[13], tmp[13] = x13, x13 + out[14], tmp[14] = x14, x14 + out[15], tmp[15] = x15, x15 +} + +func blockMix(tmp *[16]uint32, in, out []uint32, r int) { + blockCopy(tmp[:], in[(2*r-1)*16:], 16) + for i := 0; i < 2*r; i += 2 { + salsaXOR(tmp, in[i*16:], out[i*8:]) + salsaXOR(tmp, in[i*16+16:], out[i*8+r*16:]) + } +} + +func integer(b []uint32, r int) uint64 { + j := (2*r - 1) * 16 + return uint64(b[j]) | uint64(b[j+1])<<32 +} + +func smix(b []byte, r, N int, v, xy []uint32) { + var tmp [16]uint32 + x := xy + y := xy[32*r:] + + j := 0 + for i := 0; i < 32*r; i++ { + x[i] = uint32(b[j]) | uint32(b[j+1])<<8 | uint32(b[j+2])<<16 | uint32(b[j+3])<<24 + j += 4 + } + for i := 0; i < N; i += 2 { + blockCopy(v[i*(32*r):], x, 32*r) + blockMix(&tmp, x, y, r) + + blockCopy(v[(i+1)*(32*r):], y, 32*r) + blockMix(&tmp, y, x, r) + } + for i := 0; i < N; i += 2 { + j := int(integer(x, r) & uint64(N-1)) + blockXOR(x, v[j*(32*r):], 32*r) + blockMix(&tmp, x, y, r) + + j = int(integer(y, r) & uint64(N-1)) + blockXOR(y, v[j*(32*r):], 32*r) + blockMix(&tmp, y, x, r) + } + j = 0 + for _, v := range x[:32*r] { + b[j+0] = byte(v >> 0) + b[j+1] = byte(v >> 8) + b[j+2] = byte(v >> 16) + b[j+3] = byte(v >> 24) + j += 4 + } +} + +// Key derives a key from the password, salt, and cost parameters, returning +// a byte slice of length keyLen that can be used as cryptographic key. +// +// N is a CPU/memory cost parameter, which must be a power of two greater than 1. +// r and p must satisfy r * p < 2³â°. If the parameters do not satisfy the +// limits, the function returns a nil byte slice and an error. +// +// For example, you can get a derived key for e.g. AES-256 (which needs a +// 32-byte key) by doing: +// +// dk, err := scrypt.Key([]byte("some password"), salt, 16384, 8, 1, 32) +// +// The recommended parameters for interactive logins as of 2009 are N=16384, +// r=8, p=1. They should be increased as memory latency and CPU parallelism +// increases. Remember to get a good random salt. +func Key(password, salt []byte, N, r, p, keyLen int) ([]byte, error) { + if N <= 1 || N&(N-1) != 0 { + return nil, errors.New("scrypt: N must be > 1 and a power of 2") + } + if uint64(r)*uint64(p) >= 1<<30 || r > maxInt/128/p || r > maxInt/256 || N > maxInt/128/r { + return nil, errors.New("scrypt: parameters are too large") + } + + xy := make([]uint32, 64*r) + v := make([]uint32, 32*N*r) + b := pbkdf2.Key(password, salt, 1, p*128*r, sha256.New) + + for i := 0; i < p; i++ { + smix(b[i*128*r:], r, N, v, xy) + } + + return pbkdf2.Key(password, b, 1, keyLen, sha256.New), nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/scrypt/scrypt_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/scrypt/scrypt_test.go new file mode 100644 index 00000000..127596c6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/scrypt/scrypt_test.go @@ -0,0 +1,163 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package scrypt + +import ( + "bytes" + "testing" +) + +type testVector struct { + password string + salt string + N, r, p int + output []byte +} + +var good = []testVector{ + { + "password", + "salt", + 2, 10, 10, + []byte{ + 0x48, 0x2c, 0x85, 0x8e, 0x22, 0x90, 0x55, 0xe6, 0x2f, + 0x41, 0xe0, 0xec, 0x81, 0x9a, 0x5e, 0xe1, 0x8b, 0xdb, + 0x87, 0x25, 0x1a, 0x53, 0x4f, 0x75, 0xac, 0xd9, 0x5a, + 0xc5, 0xe5, 0xa, 0xa1, 0x5f, + }, + }, + { + "password", + "salt", + 16, 100, 100, + []byte{ + 0x88, 0xbd, 0x5e, 0xdb, 0x52, 0xd1, 0xdd, 0x0, 0x18, + 0x87, 0x72, 0xad, 0x36, 0x17, 0x12, 0x90, 0x22, 0x4e, + 0x74, 0x82, 0x95, 0x25, 0xb1, 0x8d, 0x73, 0x23, 0xa5, + 0x7f, 0x91, 0x96, 0x3c, 0x37, + }, + }, + { + "this is a long \000 password", + "and this is a long \000 salt", + 16384, 8, 1, + []byte{ + 0xc3, 0xf1, 0x82, 0xee, 0x2d, 0xec, 0x84, 0x6e, 0x70, + 0xa6, 0x94, 0x2f, 0xb5, 0x29, 0x98, 0x5a, 0x3a, 0x09, + 0x76, 0x5e, 0xf0, 0x4c, 0x61, 0x29, 0x23, 0xb1, 0x7f, + 0x18, 0x55, 0x5a, 0x37, 0x07, 0x6d, 0xeb, 0x2b, 0x98, + 0x30, 0xd6, 0x9d, 0xe5, 0x49, 0x26, 0x51, 0xe4, 0x50, + 0x6a, 0xe5, 0x77, 0x6d, 0x96, 0xd4, 0x0f, 0x67, 0xaa, + 0xee, 0x37, 0xe1, 0x77, 0x7b, 0x8a, 0xd5, 0xc3, 0x11, + 0x14, 0x32, 0xbb, 0x3b, 0x6f, 0x7e, 0x12, 0x64, 0x40, + 0x18, 0x79, 0xe6, 0x41, 0xae, + }, + }, + { + "p", + "s", + 2, 1, 1, + []byte{ + 0x48, 0xb0, 0xd2, 0xa8, 0xa3, 0x27, 0x26, 0x11, 0x98, + 0x4c, 0x50, 0xeb, 0xd6, 0x30, 0xaf, 0x52, + }, + }, + + { + "", + "", + 16, 1, 1, + []byte{ + 0x77, 0xd6, 0x57, 0x62, 0x38, 0x65, 0x7b, 0x20, 0x3b, + 0x19, 0xca, 0x42, 0xc1, 0x8a, 0x04, 0x97, 0xf1, 0x6b, + 0x48, 0x44, 0xe3, 0x07, 0x4a, 0xe8, 0xdf, 0xdf, 0xfa, + 0x3f, 0xed, 0xe2, 0x14, 0x42, 0xfc, 0xd0, 0x06, 0x9d, + 0xed, 0x09, 0x48, 0xf8, 0x32, 0x6a, 0x75, 0x3a, 0x0f, + 0xc8, 0x1f, 0x17, 0xe8, 0xd3, 0xe0, 0xfb, 0x2e, 0x0d, + 0x36, 0x28, 0xcf, 0x35, 0xe2, 0x0c, 0x38, 0xd1, 0x89, + 0x06, + }, + }, + { + "password", + "NaCl", + 1024, 8, 16, + []byte{ + 0xfd, 0xba, 0xbe, 0x1c, 0x9d, 0x34, 0x72, 0x00, 0x78, + 0x56, 0xe7, 0x19, 0x0d, 0x01, 0xe9, 0xfe, 0x7c, 0x6a, + 0xd7, 0xcb, 0xc8, 0x23, 0x78, 0x30, 0xe7, 0x73, 0x76, + 0x63, 0x4b, 0x37, 0x31, 0x62, 0x2e, 0xaf, 0x30, 0xd9, + 0x2e, 0x22, 0xa3, 0x88, 0x6f, 0xf1, 0x09, 0x27, 0x9d, + 0x98, 0x30, 0xda, 0xc7, 0x27, 0xaf, 0xb9, 0x4a, 0x83, + 0xee, 0x6d, 0x83, 0x60, 0xcb, 0xdf, 0xa2, 0xcc, 0x06, + 0x40, + }, + }, + { + "pleaseletmein", "SodiumChloride", + 16384, 8, 1, + []byte{ + 0x70, 0x23, 0xbd, 0xcb, 0x3a, 0xfd, 0x73, 0x48, 0x46, + 0x1c, 0x06, 0xcd, 0x81, 0xfd, 0x38, 0xeb, 0xfd, 0xa8, + 0xfb, 0xba, 0x90, 0x4f, 0x8e, 0x3e, 0xa9, 0xb5, 0x43, + 0xf6, 0x54, 0x5d, 0xa1, 0xf2, 0xd5, 0x43, 0x29, 0x55, + 0x61, 0x3f, 0x0f, 0xcf, 0x62, 0xd4, 0x97, 0x05, 0x24, + 0x2a, 0x9a, 0xf9, 0xe6, 0x1e, 0x85, 0xdc, 0x0d, 0x65, + 0x1e, 0x40, 0xdf, 0xcf, 0x01, 0x7b, 0x45, 0x57, 0x58, + 0x87, + }, + }, + /* + // Disabled: needs 1 GiB RAM and takes too long for a simple test. + { + "pleaseletmein", "SodiumChloride", + 1048576, 8, 1, + []byte{ + 0x21, 0x01, 0xcb, 0x9b, 0x6a, 0x51, 0x1a, 0xae, 0xad, + 0xdb, 0xbe, 0x09, 0xcf, 0x70, 0xf8, 0x81, 0xec, 0x56, + 0x8d, 0x57, 0x4a, 0x2f, 0xfd, 0x4d, 0xab, 0xe5, 0xee, + 0x98, 0x20, 0xad, 0xaa, 0x47, 0x8e, 0x56, 0xfd, 0x8f, + 0x4b, 0xa5, 0xd0, 0x9f, 0xfa, 0x1c, 0x6d, 0x92, 0x7c, + 0x40, 0xf4, 0xc3, 0x37, 0x30, 0x40, 0x49, 0xe8, 0xa9, + 0x52, 0xfb, 0xcb, 0xf4, 0x5c, 0x6f, 0xa7, 0x7a, 0x41, + 0xa4, + }, + }, + */ +} + +var bad = []testVector{ + {"p", "s", 0, 1, 1, nil}, // N == 0 + {"p", "s", 1, 1, 1, nil}, // N == 1 + {"p", "s", 7, 8, 1, nil}, // N is not power of 2 + {"p", "s", 16, maxInt / 2, maxInt / 2, nil}, // p * r too large +} + +func TestKey(t *testing.T) { + for i, v := range good { + k, err := Key([]byte(v.password), []byte(v.salt), v.N, v.r, v.p, len(v.output)) + if err != nil { + t.Errorf("%d: got unexpected error: %s", i, err) + } + if !bytes.Equal(k, v.output) { + t.Errorf("%d: expected %x, got %x", i, v.output, k) + } + } + for i, v := range bad { + _, err := Key([]byte(v.password), []byte(v.salt), v.N, v.r, v.p, 32) + if err == nil { + t.Errorf("%d: expected error, got nil", i) + } + } +} + +func BenchmarkKey(b *testing.B) { + for i := 0; i < b.N; i++ { + _, err := Key([]byte("password"), []byte("salt"), 16384, 8, 1, 64) + if err != nil { + b.Error(err) + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/README.md b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/README.md new file mode 100644 index 00000000..6bbf7f4f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/README.md @@ -0,0 +1,5 @@ +# secp256k1-go + +golang secp256k1 library + +Implements cryptographic operations for the secp256k1 ECDSA curve used by Bitcoin. diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256_rand.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256_rand.go new file mode 100644 index 00000000..3a785a9e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256_rand.go @@ -0,0 +1,151 @@ +package secp256k1 + +import ( + crand "crypto/rand" // secure, system random number generator + "crypto/sha256" + "hash" + "io" + "log" + "os" + "strconv" + "strings" + "sync" + "time" +) + +var ( + // Memory pool for SHA256 hashes + sha256HashPoolSize = 30 + sha256HashPool chan hash.Hash +) + +// SumSHA256 sum sha256 +func SumSHA256(b []byte) []byte { + sha256Hash := <-sha256HashPool + sha256Hash.Reset() + // sha256.Write never returns an error + sha256Hash.Write(b) //nolint:errcheck + sum := sha256Hash.Sum(nil) + sha256HashPool <- sha256Hash + return sum[:] +} + +/* +Entropy pool needs +- state (an array of bytes) +- a compression function (two 256 bit blocks to single block) +- a mixing function across the pool + +- Xor is safe, as it cannot make value less random +-- apply compression function, then xor with current value +-- + +*/ + +// EntropyPool entropy pool +type EntropyPool struct { + Ent [32]byte // 256 bit accumulator + lock sync.Mutex +} + +// Mix256 mixes in 256 bits, outputs 256 bits +func (ep *EntropyPool) Mix256(in []byte) (out []byte) { + // hash input + val1 := SumSHA256(in) + // return value + ep.lock.Lock() + val2 := SumSHA256(append(val1, ep.Ent[:]...)) + // next ent value + val3 := SumSHA256(append(val1, val2...)) + + for i := 0; i < 32; i++ { + ep.Ent[i] = val3[i] + val3[i] = 0x00 + } + ep.lock.Unlock() + + return val2 +} + +// Mix take in N bytes, salts, return N +func (ep *EntropyPool) Mix(in []byte) []byte { + length := len(in) - len(in)%32 + 32 + buff := make([]byte, length) + for i := 0; i < len(in); i++ { + buff[i] = in[i] + } + iterations := (len(in) / 32) + 1 + for i := 0; i < iterations; i++ { + tmp := ep.Mix256(buff[32*i : 32+32*i]) //32 byte slice + for j := 0; j < 32; j++ { + buff[i*32+j] = tmp[j] + } + } + return buff[:len(in)] +} + +/* +Note: + +- On windows cryto/rand uses CrytoGenRandom which uses RC4 which is insecure +- Android random number generator is known to be insecure. +- Linux uses /dev/urandom , which is thought to be secure and uses entropy pool + +Therefore the output is salted. +*/ + +/* +Note: + +Should allow pseudo-random mode for repeatability for certain types of tests +*/ + +var _ent EntropyPool + +// seed pseudo random number generator with +// - hash of system time in nano seconds +// - hash of system environmental variables +// - hash of process id +func init() { + // init the hash reuse pool + sha256HashPool = make(chan hash.Hash, sha256HashPoolSize) + for i := 0; i < sha256HashPoolSize; i++ { + sha256HashPool <- sha256.New() + } + + seed1 := []byte(strconv.FormatUint(uint64(time.Now().UnixNano()), 16)) + seed2 := []byte(strings.Join(os.Environ(), "")) + seed3 := []byte(strconv.FormatUint(uint64(os.Getpid()), 16)) + + seed4 := make([]byte, 256) + _, err := io.ReadFull(crand.Reader, seed4) // system secure random number generator + if err != nil { + log.Panic(err) + } + + // seed entropy pool + _ent.Mix256(seed1) + _ent.Mix256(seed2) + _ent.Mix256(seed3) + _ent.Mix256(seed4) +} + +// RandByte Secure Random number generator for forwards security +// On Unix-like systems, Reader reads from /dev/urandom. +// On Windows systems, Reader uses the CryptGenRandom API. +// Pseudo-random sequence, seeded from program start time, environmental variables, +// and process id is mixed in for forward security. Future version should use entropy pool +func RandByte(n int) []byte { + buff := make([]byte, n) + _, err := io.ReadFull(crand.Reader, buff) // system secure random number generator + if err != nil { + log.Panic(err) + } + + // XORing in sequence, cannot reduce security (even if sequence is bad/known/non-random) + buff2 := _ent.Mix(buff) + for i := 0; i < n; i++ { + buff[i] ^= buff2[i] + } + return buff +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256_test.go new file mode 100644 index 00000000..87afb3fd --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256_test.go @@ -0,0 +1,993 @@ +package secp256k1 + +import ( + "bytes" + "encoding/hex" + "log" + "testing" +) + +const TESTS = 10000 // number of tests to use for random tests + +func TestRandByte(t *testing.T) { + nonce := RandByte(32) + if len(nonce) != 32 { + t.Fatal() + } +} + +func TestBitTwiddle(t *testing.T) { + // test agreement for highest bit test + var b byte + for i := 0; i < 512; i++ { + bool1 := ((b >> 7) == 1) + bool2 := ((b & 0x80) == 0x80) + if bool1 != bool2 { + t.Fatal() + } + b++ + } +} + +// assertSigCompact tests for signature malleability +// highest bit of S must be 0; 32nd byte +func assertSigCompact(sig []byte) { + b := int(sig[32]) + if b < 0 { + log.Panic() + } + if ((b >> 7) == 1) != ((b & 0x80) == 0x80) { + log.Panicf("b=%v b2=%v", b, b>>7) + } + if (b & 0x80) == 0x80 { + log.Panicf("b=%v b2=%v", b, b&0x80) + } +} + +func TestGenerateKeyPairValidKeys(t *testing.T) { + pubkey, seckey := GenerateKeyPair() + if VerifySeckey(seckey) != 1 { + t.Fatal() + } + if VerifyPubkey(pubkey) != 1 { + t.Fatal() + } +} + +func TestPubkeyFromSeckey(t *testing.T) { + // test compressed pubkey from private key + // http://www.righto.com/2014/02/bitcoins-hard-way-using-raw-bitcoin.html + privkey, err := hex.DecodeString(`f19c523315891e6e15ae0608a35eec2e00ebd6d1984cf167f46336dabd9b2de4`) + if err != nil { + t.Fatal() + } + + desiredPubKey, err := hex.DecodeString(`03fe43d0c2c3daab30f9472beb5b767be020b81c7cc940ed7a7e910f0c1d9feef1`) + if err != nil { + t.Fatal() + } + + if pubkey := PubkeyFromSeckey(privkey); pubkey == nil { + t.Fatal() + } else if !bytes.Equal(pubkey, desiredPubKey) { + t.Fatal() + } +} + +func TestUncompressedPubkeyFromSeckey(t *testing.T) { + // test uncompressed pubkey from private key + // http://www.righto.com/2014/02/bitcoins-hard-way-using-raw-bitcoin.html + privkey, err := hex.DecodeString(`f19c523315891e6e15ae0608a35eec2e00ebd6d1984cf167f46336dabd9b2de4`) + if err != nil { + t.Fatal() + } + + desiredPubKey, err := hex.DecodeString(`04fe43d0c2c3daab30f9472beb5b767be020b81c7cc940ed7a7e910f0c1d9feef10fe85eb3ce193405c2dd8453b7aeb6c1752361efdbf4f52ea8bf8f304aab37ab`) + if err != nil { + t.Fatal() + } + + if pubkey := UncompressedPubkeyFromSeckey(privkey); pubkey == nil { + t.Fatal() + } else if !bytes.Equal(pubkey, desiredPubKey) { + t.Fatal() + } +} + +// returns random pubkey, seckey, hash and signature +func randX() ([]byte, []byte, []byte, []byte) { + pubkey, seckey := GenerateKeyPair() + msg := RandByte(32) + sig := Sign(msg, seckey) + return pubkey, seckey, msg, sig +} + +func TestSignatureVerifyPubkey(t *testing.T) { + pubkey1, seckey := GenerateKeyPair() + msg := RandByte(32) + sig := Sign(msg, seckey) + if VerifyPubkey(pubkey1) == 0 { + t.Fail() + } + pubkey2 := RecoverPubkey(msg, sig) + if !bytes.Equal(pubkey1, pubkey2) { + t.Fatal("Recovered pubkey does not match") + } +} + +func TestVerifyFunctions(t *testing.T) { + pubkey, seckey, hash, sig := randX() + if VerifySeckey(seckey) == 0 { + t.Fail() + } + if VerifyPubkey(pubkey) == 0 { + t.Fail() + } + if VerifySignature(hash, sig, pubkey) == 0 { + t.Fail() + } +} + +func TestSignOutputSizes(t *testing.T) { + // test size of messages + pubkey, seckey := GenerateKeyPair() + msg := RandByte(32) + sig := Sign(msg, seckey) + assertSigCompact(sig) + if sig == nil { + t.Fatal("Signature nil") + } + if len(pubkey) != 33 { + t.Fail() + } + if len(seckey) != 32 { + t.Fail() + } + if len(sig) != 64+1 { + t.Fail() + } + if int(sig[64]) > 4 { + t.Fail() + } // recovery ID, should be 0 to 4 +} + +func TestRecoverVerifySignature1(t *testing.T) { + // test signing message + pubkey1, seckey := GenerateKeyPair() + msg := RandByte(32) + sig := Sign(msg, seckey) + if sig == nil { + t.Fatal("Signature nil") + } + + pubkey2 := RecoverPubkey(msg, sig) + if pubkey2 == nil { + t.Fatal("Recovered pubkey invalid") + } + if !bytes.Equal(pubkey1, pubkey2) { + t.Fatal("Recovered pubkey does not match") + } + + ret := VerifySignature(msg, sig, pubkey1) + if ret != 1 { + t.Fatal("Signature invalid") + } +} + +func TestVerifySignatureFailure(t *testing.T) { + p, s := GenerateKeyPair() + msg := RandByte(32) + sig := Sign(msg, s) + if sig == nil { + t.Fatal("Signature nil") + } + + p2, _ := GenerateKeyPair() + + if bytes.Equal(p, p2) { + t.Fatal("GenerateKeyPair returned the same keys twice") + } + + // Signature has different pubkey + ret := VerifySignature(msg, sig, p2) + if ret == 1 { + t.Fatal("Signature unexpectedly valid") + } + + msg2 := RandByte(32) + sig2 := Sign(msg2, s) + + // Signature is for a different message + ret = VerifySignature(msg, sig2, p) + if ret == 1 { + t.Fatal("Signature unexpectedly valid") + } + + // Signature is for a different message + ret = VerifySignature(msg2, sig, p) + if ret == 1 { + t.Fatal("Signature unexpectedly valid") + } + + // Signature is for a different message + msg3 := RandByte(32) + ret = VerifySignature(msg3, sig, p) + if ret == 1 { + t.Fatal("Signature unexpectedly valid") + } +} + +func TestRecoverVerifySignature2(t *testing.T) { + // test pubkey recovery + pubkey1, seckey1 := GenerateKeyPair() + msg := RandByte(32) + sig := Sign(msg, seckey1) + + if sig == nil { + t.Fatal("Signature nil") + } + ret := VerifySignature(msg, sig, pubkey1) + if ret != 1 { + t.Fatal("Signature invalid") + } + + pubkey2 := RecoverPubkey(msg, sig) + if len(pubkey1) != len(pubkey2) { + t.Fatal() + } + for i := range pubkey1 { + if pubkey1[i] != pubkey2[i] { + t.Fatal() + } + } + if !bytes.Equal(pubkey1, pubkey2) { + t.Fatal() + } +} + +func TestRecoverPubkey1(t *testing.T) { + // test random messages for the same pub/private key + _, seckey := GenerateKeyPair() + for i := 0; i < TESTS; i++ { + msg := RandByte(32) + sig := Sign(msg, seckey) + assertSigCompact(sig) + + sig[len(sig)-1] %= 4 + pubkey2 := RecoverPubkey(msg, sig) + if pubkey2 == nil { + t.Fail() + } + } +} + +func TestRecoverPubkey2(t *testing.T) { + // test random messages for different pub/private keys + for i := 0; i < TESTS; i++ { + pubkey1, seckey := GenerateKeyPair() + msg := RandByte(32) + sig := Sign(msg, seckey) + assertSigCompact(sig) + + if sig[len(sig)-1] >= 4 { + t.Fail() + } + pubkey2 := RecoverPubkey(msg, sig) + if pubkey2 == nil { + t.Fail() + } + if !bytes.Equal(pubkey1, pubkey2) { + t.Fail() + } + } +} + +func randSig() []byte { + sig := RandByte(65) + sig[32] &= 0x70 + sig[64] %= 4 + return sig +} + +func TestRecoverVerifySignature3(t *testing.T) { + pubkey1, seckey := GenerateKeyPair() + msg := RandByte(32) + sig := Sign(msg, seckey) + + if sig == nil { + t.Fail() + } + if len(sig) != 65 { + t.Fail() + } + for i := 0; i < TESTS; i++ { + sig = randSig() + pubkey2 := RecoverPubkey(msg, sig) + + if bytes.Equal(pubkey1, pubkey2) { + t.Fail() + } + + if pubkey2 != nil && VerifySignature(msg, sig, pubkey2) != 1 { + t.Fail() + } + + if VerifySignature(msg, sig, pubkey1) == 1 { + t.Fail() + } + } +} + +func TestRecoverVerifySignature4(t *testing.T) { + // test random messages against valid signature: should fail + pubkey1, seckey := GenerateKeyPair() + msg := RandByte(32) + sig := Sign(msg, seckey) + + failCount := 0 + for i := 0; i < TESTS; i++ { + msg = RandByte(32) + pubkey2 := RecoverPubkey(msg, sig) + if bytes.Equal(pubkey1, pubkey2) { + t.Fail() + } + + if pubkey2 != nil && VerifySignature(msg, sig, pubkey2) != 1 { + t.Fail() + } + + if VerifySignature(msg, sig, pubkey1) == 1 { + t.Fail() + } + } + if failCount != 0 { + t.Errorf("ERROR: Accepted signature for %v of %v random messages", failCount, TESTS) + } +} + +/* + Deterministic Keypair Tests +*/ + +func TestDeterministicKeypairs00(t *testing.T) { + for i := 0; i < 64; i++ { + seed := RandByte(64) + _, pub1, sec1 := DeterministicKeyPairIterator(seed) + pub2, sec2 := GenerateDeterministicKeyPair(seed) + + if !bytes.Equal(pub1, pub2) { + t.Fail() + } + if !bytes.Equal(sec1, sec2) { + t.Fail() + } + } +} + +func TestDeterministicKeypairs01(t *testing.T) { + for i := 0; i < 64; i++ { + seed := RandByte(32) + _, pub1, sec1 := DeterministicKeyPairIterator(seed) + pub2, sec2 := GenerateDeterministicKeyPair(seed) + + if !bytes.Equal(pub1, pub2) { + t.Fail() + } + if !bytes.Equal(sec1, sec2) { + t.Fail() + } + } +} + +func TestDeterministicKeypairs02(t *testing.T) { + for i := 0; i < 64; i++ { + seed := RandByte(32) + _, pub1, sec1 := DeterministicKeyPairIterator(seed) + pub2, sec2 := GenerateDeterministicKeyPair(seed) + + if !bytes.Equal(pub1, pub2) { + t.Fail() + } + if !bytes.Equal(sec1, sec2) { + t.Fail() + } + } +} + +func MustDecodeHex(str string) []byte { + b, err := hex.DecodeString(str) + if err != nil { + panic(err) + } + return b +} + +func TestDeterministicKeypairs03(t *testing.T) { + cases := []struct { + seed string + seckey string + pubkey string + }{ + { + seed: "tQ93w5Aqcunm9SGUfnmF4fJv", + seckey: "9b8c3e36adce64dedc80d6dfe51ff1742cc1d755bbad457ac01177c5a18a789f", + pubkey: "03996e65d79e957ce1eafb57453e55b55906e04c8de556e54961eb06a4836c06df", + }, + { + seed: "DC7qdQQtbWSSaekXnFmvQgse", + seckey: "d2deaf4a9ff7a5111fe1d429d6976cbde78811fdd075371a2a4449bb0f4d8bf9", + pubkey: "0283a86efb1b8d82147c336c83d991f8124f0c4ca62c1019d6af1db46ae34594be", + }, + { + seed: "X8EkuUZC7Td7PAXeS7Duc7vR", + seckey: "cad79b6dcf7bd21891cbe20a51c57d59689ae6e3dc482cd6ec22898ac00cd86b", + pubkey: "03f1fbd857b8a19de3ae35d616d41f179c0f3de94231e3caabf34eabf4674a1643", + }, + { + seed: "tVqPYHHNVPRWyEed62v7f23u", + seckey: "2a386e94e9ffaa409517cbed81b9b2d4e1c5fb4afe3cbd67ce8aba11af0b02fa", + pubkey: "03ebde2c29e3beadab6f324ceb82a71c23655678e47d97f1d92159c3d7e4b59be4", + }, + { + seed: "kCy4R57HDfLqF3pVhBWxuMcg", + seckey: "26a7c6d8809c476a56f7455209f58b5ff3f16435fcf208ff2931ece60067f305", + pubkey: "03b27bd3ae6b9034a4ffb2173381448c724f649fd0ec14ee0288758aa7812a7338", + }, + { + seed: "j8bjv86ZNjKqzafR6mtSUVCE", + seckey: "ea5c0f8c9f091a70bf38327adb9b2428a9293e7a7a75119920d759ecfa03a995", + pubkey: "0236b5d52711f8a11da664c57da4378690751016ecf3089eed4ed1833c610046b6", + }, + { + seed: "qShryAzVY8EtsuD3dsAc7qnG", + seckey: "331206176509bcae31c881dc51e90a4e82ec33cd7208a5fb4171ed56602017fa", + pubkey: "02da2aab09ec94e8a40d7381f72ff6585bf7d87e4a599d1408d2686ce5514692b1", + }, + { + seed: "5FGG7ZBa8wVMBJkmzpXj5ESX", + seckey: "4ea2ad82e7730d30c0c21d01a328485a0cf5543e095139ba613929be7739b52c", + pubkey: "02b7d159de0d705c99e24d609b1591b1fac86d46c2c99e2ce6cc20b7402e32215c", + }, + { + seed: "f46TZG4xJHXUGWx8ekbNqa9F", + seckey: "dcddd403d3534c4ef5703cc07a771c107ed49b7e0643c6a2985a96149db26108", + pubkey: "03e709fbdaf4f3b913b8c4ea887d1fea61ed356fcf0178ee7c2b556ce308cfc001", + }, + { + seed: "XkZdQJ5LT96wshN8JBH8rvEt", + seckey: "3e276219081f072dff5400ca29a9346421eaaf3c419ff1474ac1c81ad8a9d6e1", + pubkey: "03a34782043386f068780cc82d0deffcea1703e4e4bbe67537a89bda0fbd3240e0", + }, + { + seed: "GFDqXU4zYymhJJ9UGqRgS8ty", + seckey: "95be4163085b571e725edeffa83fff8e7a7db3c1ccab19d0f3c6e105859b5e10", + pubkey: "03ad4b4525c6031c2fa3c43722ca6dbde64b30d646b8914b0391096d8964e5d4da", + }, + { + seed: "tmwZksH2XyvuamnddYxyJ5Lp", + seckey: "2666dd54e469df56c02e82dffb4d3ea067daafe72c54dc2b4f08c4fb3a7b7e42", + pubkey: "03f127118872ac5cb83b9167e561a28d82f4691d06297051dc71fb97d00b42aa20", + }, + { + seed: "EuqZFsbAV5amTzkhgAMgjr7W", + seckey: "40c325c01f2e4087fcc97fcdbea6c35c88a12259ebf1bce0b14a4d77f075abbf", + pubkey: "03df10131650e63894e6c43427fc9ad0119a956ef1821c68f0e09e7d90411e6c39", + }, + { + seed: "TW6j8rMffZfmhyDEt2JUCrLB", + seckey: "e676e0685c5d1afd43ad823b83db5c6100135c35485146276ee0b0004bd6689e", + pubkey: "03f9ead3620dfcfcf731d42b0752a2e1549b0190070eed686002e02f58da955731", + }, + { + seed: "8rvkBnygfhWP8kjX9aXq68CY", + seckey: "21450a646eed0d4aa50a1736e6c9bf99fff006a470aab813a2eff3ee4d460ae4", + pubkey: "026ace328af3200b4abe13a29125545bd9d82cc32eed13b782371ef54fb6301d6c", + }, + { + seed: "phyRfPDuf9JMRFaWdGh7NXPX", + seckey: "ca7bc04196c504d0e815e125f7f1e086c8ae8c10d5e9df984aeab4b41bf9e398", + pubkey: "03fc05f68ef56235b777168c45d46dfb8f665d12e4f92265305b2e66aafe000351", + }, + } + + for _, tc := range cases { + t.Run(tc.seed, func(t *testing.T) { + seed := []byte(tc.seed) + sec1 := MustDecodeHex(tc.seckey) + pub1 := MustDecodeHex(tc.pubkey) + + pub2, sec2 := GenerateDeterministicKeyPair(seed) + if !bytes.Equal(sec1, sec2) { + t.Error("seckeys don't match") + } + + if !bytes.Equal(pub1, pub2) { + t.Errorf("pubkeys don't match: %s != %s", tc.pubkey, hex.EncodeToString(pub2)) + } + }) + } +} + +func TestDeterministicKeyPairIterator1(t *testing.T) { + cases := []struct { + seed string + seckey string + pubkey string + nextSeed string + }{ + { + seed: "90c56f5b8d78a46fb4cddf6fd9c6d88d6d2d7b0ec35917c7dac12c03b04e444e", + seckey: "94dd1a9de9ffd57b5516b8a7f090da67f142f7d22356fa5d1b894ee4d4fba95b", + pubkey: "03eb71274ba23438f4ce6ac125e20bb78cd8123dc9483b5f34ace67cb6972e4ca8", + nextSeed: "a70c36286be722d8111e69e910ce4490005bbf9135b0ce8e7a59f84eee24b88b", + }, + { + seed: "a3b08ccf8cbae4955c02f223be1f97d2bb41d92b7f0c516eb8467a17da1e6057", + seckey: "82fba4cc2bc29eef122f116f45d01d82ff488d7ee713f8a95c162a64097239e0", + pubkey: "02be1c44351c2e4295e4e9257667b164e2a0e471ecf499084357c13e1b5119b4c2", + nextSeed: "e9db072fe5817325504174253a056be7b53b512f1e588f576f1f5a82cdcad302", + }, + { + seed: "7048eb8fa93cec992b93dc8e93c5543be34aad05239d4c036cf9e587bbcf7654", + seckey: "44c059496aac871ac168bb6889b9dd3decdb9e1fa082442a95fcbca982643425", + pubkey: "028868f984547f2febcdd9087a1cc3528929598b1afc9feec0fa62233052bff401", + nextSeed: "5e9133e83c4add2b0420d485e1dcda5c00e283c6509388ab8ceb583b0485c13b", + }, + { + seed: "6d25375591bbfce7f601fc5eb40e4f3dde2e453dc4bf31595d8ec29e4370cd80", + seckey: "d709ceb1a6fb906de506ea091c844ca37c65e52778b8d257d1dd3a942ab367fb", + pubkey: "035f0b2cd081f6dd45178d87be62c88b020599292cf77834d8a4dab7a7aad6b1be", + nextSeed: "8d5579cd702c06c40fb98e1d55121ea0d29f3a6c42f5582b902ac243f29b571a", + }, + { + seed: "7214b4c09f584c5ddff971d469df130b9a3c03e0277e92be159279de39462120", + seckey: "5fe4986fa964773041e119d2b6549acb392b2277a72232af75cbfb62c357c1a7", + pubkey: "032e039b5885d2d6001b2b5eb4b0af473befa04d2d9fbc4c12ef78f30fe186e487", + nextSeed: "3a4e8c72921099a0e6a4e7f979df4c8bced63063097835cdfd5ee94548c9c41a", + }, + { + seed: "b13e78392d5446ae304b5fc9d45b85f26996982b2c0c86138afdac8d2ea9016e", + seckey: "f784abc2e7f11ee84b4adb72ea4730a6aabe27b09604c8e2b792d8a1a31881ac", + pubkey: "02f32b1960c1e61ccc58bb458b8e6fc74a2c37fcb1deb0708251b35e55ba11795e", + nextSeed: "462efa1bf4f639ffaedb170d6fb8ba363efcb1bdf0c5aef0c75afb59806b8053", + }, + { + seed: "9403bff4240a5999e17e0ab4a645d6942c3a7147c7834e092e461a4580249e6e", + seckey: "d495174b8d3f875226b9b939121ec53f9383bd560d34aa5ca3ac6b257512adf4", + pubkey: "03f60cefd9bcc6f38487ae082d475c86ee086f0dfed25ff8758c1a9b06862dd0b8", + nextSeed: "68dd702ea7c7352632876e9dc2333142fce857a542726e402bb480cad364f260", + }, + { + seed: "2665312a3e3628f4df0b9bc6334f530608a9bcdd4d1eef174ecda99f51a6db94", + seckey: "1fdc9fbfc6991b9416b3a8385c9942e2db59009aeb2d8de349b73d9f1d389374", + pubkey: "029a3b04c75549c8a509fb42a2fa4e8d8361bbe543ee93ccecea90411924f5ab5b", + nextSeed: "5db72c31d575c332e60f890c7e68d59bd3d0ac53a832e06e821d819476e1f010", + }, + { + seed: "6cb37532c80765b7c07698502a49d69351036f57a45a5143e33c57c236d841ca", + seckey: "c87c85a6f482964db7f8c31720981925b1e357a9fdfcc585bc2164fdef1f54d0", + pubkey: "02b0f062bdf46066a9a7adb9337a6741ffe95ec26c5652d178dfff88ad302c962d", + nextSeed: "0deb20ec503b4c678213979fd98018c56f24e9c1ec99af3cd84b43c161a9bb5c", + }, + { + seed: "8654a32fa120bfdb7ca02c487469070eba4b5a81b03763a2185fdf5afd756f3c", + seckey: "e2767d788d1c5620f3ef21d57f2d64559ab203c044f0a5f0730b21984e77019c", + pubkey: "03251fa5b85a9ada12787234e0ceb3dcc5bd58a49c15ac0749a4238f3bca6d9a1d", + nextSeed: "36f3ede761aa683813013ffa84e3738b870ce7605e0a958ed4ffb540cd3ea504", + }, + { + seed: "66d1945ceb6ef8014b1b6703cb624f058913e722f15d03225be27cb9d8aabe4a", + seckey: "3fcb80eb1d5b91c491408447ac4e221fcb2254c861adbb5a178337c2750b0846", + pubkey: "03975043476a76b72b093d684b8a0979d8b246c2f99f16f95760d6d3490c2e37a1", + nextSeed: "6bcb4819a96508efa7e32ee52b0227ccf5fbe5539687aae931677b24f6d0bbbd", + }, + { + seed: "22c7623bf0e850538329e3e6d9a6f9b1235350824a3feaad2580b7a853550deb", + seckey: "5577d4be25f1b44487140a626c8aeca2a77507a1fc4fd466dd3a82234abb6785", + pubkey: "0262e2054c89ad173f741e413d12f511a2cf98783c43f18f8dbb6274bdd584a3dc", + nextSeed: "8bb257a1a17fd2233935b33441d216551d5ff1553d02e4013e03f14962615c16", + }, + { + seed: "a5eebe3469d68c8922a1a8b5a0a2b55293b7ff424240c16feb9f51727f734516", + seckey: "c07275582d0681eb07c7b51f0bca0c48c056d571b7b83d84980ab40ac7d7d720", + pubkey: "03d80474b8e6002793374a99d884605cf022d216573459b7deb19b6ccb110d286a", + nextSeed: "d6b780983a63a3e4bcf643ee68b686421079c835a99eeba6962fe41bb355f8da", + }, + { + seed: "479ec3b589b14aa7290b48c2e64072e4e5b15ce395d2072a5a18b0a2cf35f3fd", + seckey: "f10e2b7675dfa557d9e3188469f12d3e953c2d46dce006cd177b6ae7f465cfc0", + pubkey: "0219d5b487ebdf719a994dcde094072e0227fc23e4cdbc4cce3b9d3e4a4ffe0668", + nextSeed: "39c5f108e7017e085fe90acfd719420740e57768ac14c94cb020d87e36d06752", + }, + { + seed: "63952334b731ec91d88c54614925576f82e3610d009657368fc866e7b1efbe73", + seckey: "0bcbebb39d8fe1cb3eab952c6f701656c234e462b945e2f7d4be2c80b8f2d974", + pubkey: "02b58d9eb9595c24438a6ae4a4be4a408c0cd7a3017c3780cba253171cc9e62627", + nextSeed: "79f654976732106c0e4a97ab3b6d16f343a05ebfcc2e1d679d69d396e6162a77", + }, + { + seed: "256472ee754ef6af096340ab1e161f58e85fb0cc7ae6e6866b9359a1657fa6c1", + seckey: "88ba6f6c66fc0ef01c938569c2dd1f05475cb56444f4582d06828e77d54ffbe6", + pubkey: "02dac6b246a06ac7c38a63f4f10b1344a8cd6f920a8fd74523bd2f5d4a9a3055b2", + nextSeed: "387883b86e2acc153aa334518cea48c0c481b573ccaacf17c575623c392f78b2", + }, + } + + for _, tc := range cases { + t.Run(tc.seed, func(t *testing.T) { + seed := MustDecodeHex(tc.seed) + seckey1 := MustDecodeHex(tc.seckey) + pubkey1 := MustDecodeHex(tc.pubkey) + nextSeed1 := MustDecodeHex(tc.nextSeed) + nextSeed2, pubkey2, seckey2 := DeterministicKeyPairIterator(seed) + if !bytes.Equal(seckey1, seckey2) { + t.Error("seckeys don't match") + } + if !bytes.Equal(pubkey1, pubkey2) { + t.Errorf("pubkeys don't match: %s != %s", tc.pubkey, hex.EncodeToString(pubkey2)) + } + if !bytes.Equal(nextSeed1, nextSeed2) { + t.Errorf("nextSeeds don't match: %s != %s", tc.nextSeed, hex.EncodeToString(nextSeed2)) + } + }) + } +} + +func TestSecp256k1Hash(t *testing.T) { + cases := []struct { + seed string + hash string + }{ + { + seed: "90c56f5b8d78a46fb4cddf6fd9c6d88d6d2d7b0ec35917c7dac12c03b04e444e", + hash: "a70c36286be722d8111e69e910ce4490005bbf9135b0ce8e7a59f84eee24b88b", + }, + { + seed: "a3b08ccf8cbae4955c02f223be1f97d2bb41d92b7f0c516eb8467a17da1e6057", + hash: "e9db072fe5817325504174253a056be7b53b512f1e588f576f1f5a82cdcad302", + }, + { + seed: "7048eb8fa93cec992b93dc8e93c5543be34aad05239d4c036cf9e587bbcf7654", + hash: "5e9133e83c4add2b0420d485e1dcda5c00e283c6509388ab8ceb583b0485c13b", + }, + { + seed: "6d25375591bbfce7f601fc5eb40e4f3dde2e453dc4bf31595d8ec29e4370cd80", + hash: "8d5579cd702c06c40fb98e1d55121ea0d29f3a6c42f5582b902ac243f29b571a", + }, + { + seed: "7214b4c09f584c5ddff971d469df130b9a3c03e0277e92be159279de39462120", + hash: "3a4e8c72921099a0e6a4e7f979df4c8bced63063097835cdfd5ee94548c9c41a", + }, + { + seed: "b13e78392d5446ae304b5fc9d45b85f26996982b2c0c86138afdac8d2ea9016e", + hash: "462efa1bf4f639ffaedb170d6fb8ba363efcb1bdf0c5aef0c75afb59806b8053", + }, + { + seed: "9403bff4240a5999e17e0ab4a645d6942c3a7147c7834e092e461a4580249e6e", + hash: "68dd702ea7c7352632876e9dc2333142fce857a542726e402bb480cad364f260", + }, + { + seed: "2665312a3e3628f4df0b9bc6334f530608a9bcdd4d1eef174ecda99f51a6db94", + hash: "5db72c31d575c332e60f890c7e68d59bd3d0ac53a832e06e821d819476e1f010", + }, + { + seed: "6cb37532c80765b7c07698502a49d69351036f57a45a5143e33c57c236d841ca", + hash: "0deb20ec503b4c678213979fd98018c56f24e9c1ec99af3cd84b43c161a9bb5c", + }, + { + seed: "8654a32fa120bfdb7ca02c487469070eba4b5a81b03763a2185fdf5afd756f3c", + hash: "36f3ede761aa683813013ffa84e3738b870ce7605e0a958ed4ffb540cd3ea504", + }, + { + seed: "66d1945ceb6ef8014b1b6703cb624f058913e722f15d03225be27cb9d8aabe4a", + hash: "6bcb4819a96508efa7e32ee52b0227ccf5fbe5539687aae931677b24f6d0bbbd", + }, + { + seed: "22c7623bf0e850538329e3e6d9a6f9b1235350824a3feaad2580b7a853550deb", + hash: "8bb257a1a17fd2233935b33441d216551d5ff1553d02e4013e03f14962615c16", + }, + { + seed: "a5eebe3469d68c8922a1a8b5a0a2b55293b7ff424240c16feb9f51727f734516", + hash: "d6b780983a63a3e4bcf643ee68b686421079c835a99eeba6962fe41bb355f8da", + }, + { + seed: "479ec3b589b14aa7290b48c2e64072e4e5b15ce395d2072a5a18b0a2cf35f3fd", + hash: "39c5f108e7017e085fe90acfd719420740e57768ac14c94cb020d87e36d06752", + }, + { + seed: "63952334b731ec91d88c54614925576f82e3610d009657368fc866e7b1efbe73", + hash: "79f654976732106c0e4a97ab3b6d16f343a05ebfcc2e1d679d69d396e6162a77", + }, + { + seed: "256472ee754ef6af096340ab1e161f58e85fb0cc7ae6e6866b9359a1657fa6c1", + hash: "387883b86e2acc153aa334518cea48c0c481b573ccaacf17c575623c392f78b2", + }, + } + + for _, tc := range cases { + t.Run(tc.seed, func(t *testing.T) { + seed := MustDecodeHex(tc.seed) + if len(seed) != 32 { + t.Fatal("expected seed to be 32 bytes") + } + hash := Secp256k1Hash(seed) + if len(hash) != 32 { + t.Fatal("expected hash to be 32 bytes") + } + if !bytes.Equal(MustDecodeHex(tc.hash), hash) { + t.Fatal("secp256k1Hash does not match") + } + }) + } +} + +func TestSecp256k1Equal(t *testing.T) { + for i := 0; i < 64; i++ { + seed := RandByte(128) + + hash1 := Secp256k1Hash(seed) + hash2, _, _ := DeterministicKeyPairIterator(seed) + + if !bytes.Equal(hash1, hash2) { + t.Fail() + } + } +} + +func TestECDH(t *testing.T) { + pubkey1, seckey1 := GenerateKeyPair() + pubkey2, seckey2 := GenerateKeyPair() + + puba := ECDH(pubkey1, seckey2) + pubb := ECDH(pubkey2, seckey1) + + if puba == nil { + t.Fail() + } + + if pubb == nil { + t.Fail() + } + + if !bytes.Equal(puba, pubb) { + t.Fail() + } +} + +func TestECDH2(t *testing.T) { + for i := 0; i < 16*1024; i++ { + + pubkey1, seckey1 := GenerateKeyPair() + pubkey2, seckey2 := GenerateKeyPair() + + puba := ECDH(pubkey1, seckey2) + pubb := ECDH(pubkey2, seckey1) + + if puba == nil { + t.Fail() + } + + if pubb == nil { + t.Fail() + } + + if !bytes.Equal(puba, pubb) { + t.Fail() + } + } +} + +func TestDeterministicKeyPairIteratorStepRandom(t *testing.T) { + n := 32 * 1024 + for i := 0; i < n; i++ { + seed := RandByte(32) + + pubkey1, seckey1 := deterministicKeyPairIteratorStep(seed) + + if seckey1 == nil { + t.Fail() + } + + if pubkey1 == nil { + t.Fail() + } + + if VerifyPubkey(pubkey1) != 1 { + seedHex := hex.EncodeToString(seed) + seckeyHex := hex.EncodeToString(seckey1) + t.Logf("seed=%s", seedHex) + t.Logf("seckey=%s", seckeyHex) + t.Errorf("GenerateKeyPair, generates key that fails validation, run=%d", i) + } + } +} + +// problematic seckeys +// See: https://github.com/piotrnar/gocoin/issues/15 +// For additional information on the origin of these test vectors +var abnormalSecKeys = []struct { + sec string + pub string + ecdh []string +}{ + { + sec: "08efb79385c9a8b0d1c6f5f6511be0c6f6c2902963d874a3a4bacc18802528d3", + pub: "03c74332d6094b1f603d4902fc6b1aa09fb3ef81f3015a4000cc0077ff70543c16", + ecdh: []string{ + "", + "02e72655a3adf8308a078ee6fe948cf6baf95ef626b1e1fe6e434c737c7c2fef4e", + "03222fe59be5a69c38364dd313bd077b8b1c2216804a4a727e0078b3c77778bc45", + "021096aa98231eaa949542be029a1f3a93815e05e243c69e73d7449d719ff5d76d", + }, + }, + { + sec: "78298d9ecdc0640c9ae6883201a53f4518055442642024d23c45858f45d0c3e6", + pub: "02fa3e6e0b1fb76e26dffe7b1e01fd02677fedfed23a59000092c706b04214bee3", + ecdh: []string{ + "02e72655a3adf8308a078ee6fe948cf6baf95ef626b1e1fe6e434c737c7c2fef4e", + "", + "025617125b44ded369deed72f833535d56a3ed035afc44ff64fb7c65986f6ea2a5", + "03849b3f906180cf27c161045e9da551a44476b0d4f7f29d668ba17569953d0a11", + }, + }, + { + sec: "04e04fe65bfa6ded50a12769a3bd83d7351b2dbff08c9bac14662b23a3294b9e", + pub: "034f25c9400dd0f87a9c420b35b5a157d21caa086ef8fa00015bc3c8ab73a1cc4c", + ecdh: []string{ + "03222fe59be5a69c38364dd313bd077b8b1c2216804a4a727e0078b3c77778bc45", + "025617125b44ded369deed72f833535d56a3ed035afc44ff64fb7c65986f6ea2a5", + "", + "03fd41f8d279e2df640f17aef31c258a0a9aa6ddcaf4c4bc80f71dccff576b630c", + }, + }, + { + sec: "2f5141f1b75747996c5de77c911dae062d16ae48799052c04ead20ccd5afa113", + pub: "03fe58baefc491a9dcf0939ab6252f81f6d9515105bd89c000bb7f2a694e8a8b72", + ecdh: []string{ + "021096aa98231eaa949542be029a1f3a93815e05e243c69e73d7449d719ff5d76d", + "03849b3f906180cf27c161045e9da551a44476b0d4f7f29d668ba17569953d0a11", + "03fd41f8d279e2df640f17aef31c258a0a9aa6ddcaf4c4bc80f71dccff576b630c", + "", + }, + }, +} + +func TestAbnormalKeys2(t *testing.T) { + for _, tc := range abnormalSecKeys { + seckey1, err := hex.DecodeString(tc.sec) + if err != nil { + t.Error(err) + } + + pubkey1 := PubkeyFromSeckey(seckey1) + if pubkey1 == nil { + t.Fail() + } + + if seckey1 == nil { + t.Fail() + } + + if pubkey1 == nil { + t.Fail() + } + + if VerifyPubkey(pubkey1) != 1 { + t.Error("generates key that fails validation") + } + + hpubkey1 := hex.EncodeToString(pubkey1) + if hpubkey1 != tc.pub { + t.Errorf("pubkey does not match %s != %s", hpubkey1, tc.pub) + } + } +} + +func TestAbnormalKeys3(t *testing.T) { + // ECDH test + for i, tc := range abnormalSecKeys { + seckey1, err := hex.DecodeString(tc.sec) + if err != nil { + t.Error(err) + } + + pubkey1 := PubkeyFromSeckey(seckey1) + + if pubkey1 == nil { + t.Error("pubkey1 nil") + } + + if hex.EncodeToString(pubkey1) != tc.pub { + t.Error("pubkey1 does not match") + } + + for j, tc2 := range abnormalSecKeys { + if i == j { + continue + } + + seckey2, err := hex.DecodeString(tc2.sec) + if err != nil { + t.Error(err) + } + pubkey2 := PubkeyFromSeckey(seckey2) + + if pubkey2 == nil { + t.Error("pubkey2 nil") + } + + if hex.EncodeToString(pubkey2) != tc2.pub { + t.Error("pubkey2 does not match") + } + + puba := ECDH(pubkey1, seckey2) + pubb := ECDH(pubkey2, seckey1) + + if puba == nil { + t.Fail() + } + + if pubb == nil { + t.Fail() + } + + if !bytes.Equal(puba, pubb) { + t.Error("recovered ecdh keys do not match") + } + + hpuba := hex.EncodeToString(puba) + if hpuba != tc.ecdh[j] { + t.Errorf("ecdh does not match %d,%d %s != %s", i, j, hpuba, tc.ecdh[j]) + } + } + + } +} + +func TestDeterministicKeyPairIterator2(t *testing.T) { + cases := []struct { + seed string + sec string + pub string + n int + }{ + { + seed: "67c53b28b8c7b06be53b490c28c0a3b77724b5c31c4bf12b71cd44c6bb4586f3", + sec: "68c751a58f48d656e4d3ec31f6c1016e6e36583ac2f63129f576b29e764469b5", + pub: "02c32556c48bfe944e4b8f6ecb6c884112c71a468247d338cbbdc9c561ab7c6d3d", + n: 1, + }, + { + seed: "38363534613332666131323062666462376361303263343837343639303730656261346235613831623033373633613231383566646635616664373536663363", + sec: "10ba0325f1b8633ca463542950b5cd5f97753a9829ba23477c584e7aee9cfbd5", + pub: "0249964ac7e3fe1b2c182a2f10abe031784e374cc0c665a63bc76cc009a05bc7c6", + n: 1024, + }, + } + + for _, tc := range cases { + t.Run(tc.seed, func(t *testing.T) { + seed, err := hex.DecodeString(tc.seed) + if err != nil { + t.Fatalf("hex.DecodeString(%s) failed: %v", tc.seed, err) + return + } + + var pub []byte + var sec []byte + for i := 0; i < tc.n; i++ { + seed, pub, sec = DeterministicKeyPairIterator(seed) + } + + hsec := hex.EncodeToString(sec) + if hsec != tc.sec { + t.Fatalf("secret key does not match %s != %s", hsec, tc.sec) + } + + hpub := hex.EncodeToString(pub) + if hpub != tc.pub { + t.Fatalf("public key does not match %s != %s", hpub, tc.pub) + } + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/COPYING b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/COPYING new file mode 100644 index 00000000..a7fd60bb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/COPYING @@ -0,0 +1,4 @@ +This single package (secp256k1) is distributed with the same license as +the original C implementation by sipa: + + * https://github.com/bitcoin/secp256k1/blob/master/COPYING diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/README.md b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/README.md new file mode 100644 index 00000000..f0466f40 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/README.md @@ -0,0 +1,5 @@ +Implementation of this package has been based on source code created by Pieter Wuille. + + * https://github.com/bitcoin/secp256k1 + +Modified by HaltingState \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/ec.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/ec.go new file mode 100644 index 00000000..0ade1604 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/ec.go @@ -0,0 +1,202 @@ +package secp256k1go + +import ( + "bytes" + "log" +) + +// DecompressPoint decompresses point +func DecompressPoint(X []byte, off bool, Y []byte) { + var rx, ry, c, x2, x3 Field + rx.SetB32(X) + rx.Sqr(&x2) + rx.Mul(&x3, &x2) + c.SetInt(7) + c.SetAdd(&x3) + c.Sqrt(&ry) + ry.Normalize() + if ry.IsOdd() != off { + ry.Negate(&ry, 1) + } + ry.Normalize() + ry.GetB32(Y) +} + +// RecoverPublicKey recovers a public key from a signature and the message it signed. +// Returns nil on error with an int error code. Returns 1 on success. +func RecoverPublicKey(sigBytes, msgBytes []byte, recid int) ([]byte, int) { + if len(sigBytes) != 64 { + log.Panic("must pass in 64 byte pubkey") + } + + var pubkey XY + var sig Signature + var msg Number + + sig.ParseBytes(sigBytes[0:64]) + + if sig.R.Sign() <= 0 || sig.R.Cmp(&TheCurve.Order.Int) >= 0 { + if sig.R.Sign() == 0 { + return nil, -1 + } + if sig.R.Sign() <= 0 { + return nil, -2 + } + if sig.R.Cmp(&TheCurve.Order.Int) >= 0 { + return nil, -3 + } + return nil, -4 + } + if sig.S.Sign() <= 0 || sig.S.Cmp(&TheCurve.Order.Int) >= 0 { + return nil, -5 + } + + msg.SetBytes(msgBytes) + if !sig.Recover(&pubkey, &msg, recid) { + return nil, -6 + } + + return pubkey.Bytes(), 1 +} + +// Multiply standard EC multiplication k(xy) +// xy is the compressed public key format (33 bytes long) +func Multiply(xy, k []byte) []byte { + var pk XY + var xyz XYZ + var na, nzero Number + if err := pk.ParsePubkey(xy); err != nil { + return nil + } + xyz.SetXY(&pk) + na.SetBytes(k) + xyz.ECmult(&xyz, &na, &nzero) + pk.SetXYZ(&xyz) + + if !pk.IsValid() { + log.Panic("Multiply pk is invalid") + } + return pk.Bytes() +} + +// pubkeyTest panics if assumptions about pubkey are violated +func pubkeyTest(pk XY) { + if !pk.IsValid() { + log.Panic("IMPOSSIBLE3: pubkey invalid") + } + var pk2 XY + if err := pk2.ParsePubkey(pk.Bytes()); err != nil { + log.Panicf("IMPOSSIBLE2: parse failed: %v", err) + } + if !pk2.IsValid() { + log.Panic("IMPOSSIBLE3: parse failed non valid key") + } + if PubkeyIsValid(pk2.Bytes()) != 1 { + log.Panic("IMPOSSIBLE4: pubkey failed") + } +} + +// BaseMultiply base multiply +func BaseMultiply(k []byte) []byte { + var n Number + var pk XY + n.SetBytes(k) + r := ECmultGen(n) + pk.SetXYZ(&r) + if !pk.IsValid() { + log.Panic("BaseMultiply pk is invalid") + } + + pubkeyTest(pk) + + return pk.Bytes() +} + +// BaseMultiplyAdd computes G*k + xy +// Returns 33 bytes out (compressed pubkey). +func BaseMultiplyAdd(xy, k []byte) []byte { + var n Number + var pk XY + if err := pk.ParsePubkey(xy); err != nil { + return nil + } + n.SetBytes(k) + r := ECmultGen(n) + r.AddXY(&r, &pk) + pk.SetXYZ(&r) + + pubkeyTest(pk) + return pk.Bytes() +} + +// GeneratePublicKey generates a public key from secret key bytes. +// The secret key must 32 bytes. +func GeneratePublicKey(k []byte) []byte { + if len(k) != 32 { + log.Panic("secret key length must be 32 bytes") + } + var n Number + var pk XY + + // must not be zero + // must not be negative + // must be less than order of curve + n.SetBytes(k) + if n.Sign() <= 0 || n.Cmp(&TheCurve.Order.Int) >= 0 { + log.Panic("only call for valid seckey, check that seckey is valid first") + return nil + } + r := ECmultGen(n) + pk.SetXYZ(&r) + if !pk.IsValid() { + log.Panic("public key derived from secret key is unexpectedly valid") + } + pubkeyTest(pk) + return pk.Bytes() +} + +// SeckeyIsValid 1 on success +// Must be 32 bytes +// Must not be zero +// Must not be negative +// Must be less than order of curve +// The probability of any 32 bytes being an invalid secret key is ~2^-128 +func SeckeyIsValid(seckey []byte) int { + if len(seckey) != 32 { + log.Panic("SeckeyIsValid seckey must be 32 bytes") + } + var n Number + n.SetBytes(seckey) + // must not be zero + // must not be negative + // must be less than order of curve + if n.Sign() <= 0 { + return -1 + } + if n.Cmp(&TheCurve.Order.Int) >= 0 { + return -2 + } + return 1 +} + +// PubkeyIsValid returns 1 on success +func PubkeyIsValid(pubkey []byte) int { + if len(pubkey) != 33 { + log.Panic("public key length must be 33 bytes") + return -2 + } + var pubkey1 XY + if err := pubkey1.ParsePubkey(pubkey); err != nil { + return -1 + } + + if !bytes.Equal(pubkey1.Bytes(), pubkey) { + log.Panic("pubkey parses but serialize/deserialize roundtrip fails") + } + + if !pubkey1.IsValid() { + return -3 // invalid, point is infinity or some other problem + } + + return 1 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/ec_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/ec_test.go new file mode 100644 index 00000000..bef40af0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/ec_test.go @@ -0,0 +1,224 @@ +package secp256k1go + +import ( + "testing" +) + +//var ta = [][3]string{ +// // [0]-pubScr, [1]-sigScript, [2]-unsignedTx +// { +// "040eaebcd1df2df853d66ce0e1b0fda07f67d1cabefde98514aad795b86a6ea66dbeb26b67d7a00e2447baeccc8a4cef7cd3cad67376ac1c5785aeebb4f6441c16", +// "3045022100fe00e013c244062847045ae7eb73b03fca583e9aa5dbd030a8fd1c6dfcf11b1002207d0d04fed8fa1e93007468d5a9e134b0a7023b6d31db4e50942d43a250f4d07c01", +// "3382219555ddbb5b00e0090f469e590ba1eae03c7f28ab937de330aa60294ed6", +// }, +// { +// "020eaebcd1df2df853d66ce0e1b0fda07f67d1cabefde98514aad795b86a6ea66d", +// "3045022100fe00e013c244062847045ae7eb73b03fca583e9aa5dbd030a8fd1c6dfcf11b1002207d0d04fed8fa1e93007468d5a9e134b0a7023b6d31db4e50942d43a250f4d07c01", +// "3382219555ddbb5b00e0090f469e590ba1eae03c7f28ab937de330aa60294ed6", +// }, +// { +// "0411db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5cb2e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b412a3", +// "304402204e45e16932b8af514961a1d3a1a25fdf3f4f7732e9d624c6c61548ab5fb8cd410220181522ec8eca07de4860a4acdd12909d831cc56cbbac4622082221a8768d1d0901", +// "7a05c6145f10101e9d6325494245adf1297d80f8f38d4d576d57cdba220bcb19", +// }, +// { +// "0311db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5c", +// "304402204e45e16932b8af514961a1d3a1a25fdf3f4f7732e9d624c6c61548ab5fb8cd410220181522ec8eca07de4860a4acdd12909d831cc56cbbac4622082221a8768d1d0901", +// "7a05c6145f10101e9d6325494245adf1297d80f8f38d4d576d57cdba220bcb19", +// }, +// { +// "0428f42723f81c70664e200088437282d0e11ae0d4ae139f88bdeef1550471271692970342db8e3f9c6f0123fab9414f7865d2db90c24824da775f00e228b791fd", +// "3045022100d557da5d9bf886e0c3f98fd6d5d337487cd01d5b887498679a57e3d32bd5d0af0220153217b63a75c3145b14f58c64901675fe28dba2352c2fa9f2a1579c74a2de1701", +// "c22de395adbb0720941e009e8a4e488791b2e428af775432ed94d2c7ec8e421a", +// }, +// { +// "0328f42723f81c70664e200088437282d0e11ae0d4ae139f88bdeef15504712716", +// "3045022100d557da5d9bf886e0c3f98fd6d5d337487cd01d5b887498679a57e3d32bd5d0af0220153217b63a75c3145b14f58c64901675fe28dba2352c2fa9f2a1579c74a2de1701", +// "c22de395adbb0720941e009e8a4e488791b2e428af775432ed94d2c7ec8e421a", +// }, +// { +// "041f2a00036b3cbd1abe71dca54d406a1e9dd5d376bf125bb109726ff8f2662edcd848bd2c44a86a7772442095c7003248cc619bfec3ddb65130b0937f8311c787", +// "3045022100ec6eb6b2aa0580c8e75e8e316a78942c70f46dd175b23b704c0330ab34a86a34022067a73509df89072095a16dbf350cc5f1ca5906404a9275ebed8a4ba219627d6701", +// "7c8e7c2cb887682ed04dc82c9121e16f6d669ea3d57a2756785c5863d05d2e6a", +// }, +// { +// "031f2a00036b3cbd1abe71dca54d406a1e9dd5d376bf125bb109726ff8f2662edc", +// "3045022100ec6eb6b2aa0580c8e75e8e316a78942c70f46dd175b23b704c0330ab34a86a34022067a73509df89072095a16dbf350cc5f1ca5906404a9275ebed8a4ba219627d6701", +// "7c8e7c2cb887682ed04dc82c9121e16f6d669ea3d57a2756785c5863d05d2e6a", +// }, +// { +// "04ee90bfdd4e07eb1cfe9c6342479ca26c0827f84bfe1ab39e32fc3e94a0fe00e6f7d8cd895704e974978766dd0f9fad3c97b1a0f23684e93b400cc9022b7ae532", +// "3045022100fe1f6e2c2c2cbc916f9f9d16497df2f66a4834e5582d6da0ee0474731c4a27580220682bad9359cd946dc97bb07ea8fad48a36f9b61186d47c6798ccce7ba20cc22701", +// "baff983e6dfb1052918f982090aa932f56d9301d1de9a726d2e85d5f6bb75464", +// }, +//} + +// func TestVerify1(t *testing.T) { +// for i := range ta { +// pkey, _ := hex.DecodeString(ta[i][0]) +// sign, _ := hex.DecodeString(ta[i][1]) +// hasz, _ := hex.DecodeString(ta[i][2]) + +// res := ecdsaVerify(pkey, sign, hasz) +// if res != 1 { +// log.Println("error code", res) +// t.Fatal("Verify failed at", i) +// } + +// hasz[0]++ +// res = ecdsaVerify(pkey, sign, hasz) +// if res != 0 { +// t.Error("Verify not failed while it should", i) +// } +// res = ecdsaVerify(pkey[:1], sign, hasz) +// if res >= 0 { +// t.Error("Negative result expected", res, i) +// } +// res = ecdsaVerify(pkey, sign[:1], hasz) +// if res >= 0 { +// t.Error("Yet negative result expected", res, i) +// } +// res = ecdsaVerify(pkey, sign, hasz[:1]) +// if res != 0 { +// t.Error("Zero expected", res, i) +// } +// } +// } + +// func BenchmarkVerifyUncompressed(b *testing.B) { +// key, _ := hex.DecodeString("040eaebcd1df2df853d66ce0e1b0fda07f67d1cabefde98514aad795b86a6ea66dbeb26b67d7a00e2447baeccc8a4cef7cd3cad67376ac1c5785aeebb4f6441c16") +// sig, _ := hex.DecodeString("3045022100fe00e013c244062847045ae7eb73b03fca583e9aa5dbd030a8fd1c6dfcf11b1002207d0d04fed8fa1e93007468d5a9e134b0a7023b6d31db4e50942d43a250f4d07c01") +// msg, _ := hex.DecodeString("3382219555ddbb5b00e0090f469e590ba1eae03c7f28ab937de330aa60294ed6") +// b.ResetTimer() +// for i := 0; i < b.N; i++ { +// ecdsaVerify(key, sig, msg) +// } +// } + +// func BenchmarkVerifyCompressed(b *testing.B) { +// keyCompr, _ := hex.DecodeString("020eaebcd1df2df853d66ce0e1b0fda07f67d1cabefde98514aad795b86a6ea66d") +// sig, _ := hex.DecodeString("3045022100fe00e013c244062847045ae7eb73b03fca583e9aa5dbd030a8fd1c6dfcf11b1002207d0d04fed8fa1e93007468d5a9e134b0a7023b6d31db4e50942d43a250f4d07c01") +// msg, _ := hex.DecodeString("3382219555ddbb5b00e0090f469e590ba1eae03c7f28ab937de330aa60294ed6") +// b.ResetTimer() +// for i := 0; i < b.N; i++ { +// ecdsaVerify(keyCompr, sig, msg) +// } +// } + +func TestECmult(t *testing.T) { + var u1, u2 Number + var pubkeyj, expres, pr XYZ + + pubkeyj.X.SetHex("0EAEBCD1DF2DF853D66CE0E1B0FDA07F67D1CABEFDE98514AAD795B86A6EA66D") + pubkeyj.Y.SetHex("BEB26B67D7A00E2447BAECCC8A4CEF7CD3CAD67376AC1C5785AEEBB4F6441C16") + pubkeyj.Z.SetHex("0000000000000000000000000000000000000000000000000000000000000001") + + u1.SetHex("B618EBA71EC03638693405C75FC1C9ABB1A74471BAAF1A3A8B9005821491C4B4") + u2.SetHex("8554470195DE4678B06EDE9F9286545B51FF2D9AA756CE35A39011783563EA60") + + expres.X.SetHex("EB6752420B6BDB40A760AC26ADD7E7BBD080BF1DF6C0B009A0D310E4511BDF49") + expres.Y.SetHex("8E8CEB84E1502FC536FFE67967BC44314270A0B38C79865FFED5A85D138DCA6B") + expres.Z.SetHex("813925AF112AAB8243F8CCBADE4CC7F63DF387263028DE6E679232A73A7F3C31") + + pubkeyj.ECmult(&pr, &u2, &u1) + if !pr.Equals(&expres) { + t.Error("ECmult failed") + t.Logf("Got: %s", pr) + t.Logf("Exp: %s", expres) + } +} + +type wnafvec struct { + inp string + w uint + exp []int +} + +func TestWNAF(t *testing.T) { + var wnaf [129]int + var testvcs = []wnafvec{ + { + "3271156f58b59bd7aa542ca6972c1910", winA, + []int{0, 0, 0, 0, -15, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, -9, 0, 0, 0, 0, -11, 0, 0, 0, 0, 0, -11, 0, 0, 0, 0, 13, 0, 0, 0, 0, 1, 0, 0, 0, 0, -11, 0, 0, 0, 0, -11, 0, 0, 0, 0, -5, 0, 0, 0, 0, 0, 0, -5, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 11, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 15, 0, 0, 0, 0, 11, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, -15, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 3}, + }, + { + "0a8a5afcb465a43b8277801311860430", winA, + []int{0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, -15, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 7, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, -9, 0, 0, 0, 0, 0, 0, -15, 0, 0, 0, 0, -11, 0, 0, 0, 0, 0, -13, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -5, 0, 0, 0, 0, -13, 0, 0, 0, 0, 3, 0, 0, 0, 0, -11, 0, 0, 0, 0, 1}, + }, + { + "b1a74471baaf1a3a8b9005821491c4b4", winG, + []int{0, 0, -3795, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2633, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 705, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5959, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1679, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1361, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4551, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1693, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11}, + }, + { + "b618eba71ec03638693405c75fc1c9ab", winG, + []int{2475, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4549, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6527, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -8165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6369, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -7249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1457}, + }, + } + for idx := range testvcs { + var xxx Number + xxx.SetHex(testvcs[idx].inp) + bits := ecmultWnaf(wnaf[:], &xxx, testvcs[idx].w) + if bits != len(testvcs[idx].exp) { + t.Error("Bad bits at idx", idx) + } + for i := range testvcs[idx].exp { + if wnaf[i] != testvcs[idx].exp[i] { + t.Error("Bad val at idx", idx, i) + } + } + } +} + +func TestPrecompileGej(t *testing.T) { + var exp, a XYZ + + a.X.SetHex("0eaebcd1df2df853d66ce0e1b0fda07f67d1cabefde98514aad795b86a6ea66d") + a.Y.SetHex("beb26b67d7a00e2447baeccc8a4cef7cd3cad67376ac1c5785aeebb4f6441c16") + a.Z.SetHex("01") + exp.X.SetHex("ce5dcac5e26ab63868ead1440f359aff29d7ffade62abe801bca97b471bcd416") + exp.Y.SetHex("0cc6f63793a207751d507aa4be629f0776441e4873548095bd6d39d34ce8a9d7") + exp.Z.SetHex("122927e4908740d51df1f03dc921c00fef68c542e7f28aa270862619cf971815") + pre := a.precomp(winA) + if len(pre) != 8 { + t.Error("Bad result length") + } + if !pre[7].Equals(&exp) { + t.Error("Unexpcted value") + } + + a.X.SetHex("a45720c272cfa1f77f64be8a404a7d3149bd5410f9a173353f6eb75a5085ba98") + a.Y.SetHex("beb26b67d7a00e2447baeccc8a4cef7cd3cad67376ac1c5785aeebb4f6441c16") + a.Z.SetHex("01") + exp.X.SetHex("ce5dcac5e26ab63868ead1440f359aff29d7ffade62abe801bca97b471bcd416") + exp.Y.SetHex("0cc6f63793a207751d507aa4be629f0776441e4873548095bd6d39d34ce8a9d7") + exp.Z.SetHex("49f0fb9f1840e7a58d485c6cc394e597e521bf7d4598be2b367c27326949e507") + pre = a.precomp(winA) + if len(pre) != 8 { + t.Error("Bad result length") + } + if !pre[7].Equals(&exp) { + t.Error("Unexpcted value") + } +} + +func TestMultGen(t *testing.T) { + var nonce Number + var ex, ey, ez Field + nonce.SetHex("9E3CD9AB0F32911BFDE39AD155F527192CE5ED1F51447D63C4F154C118DA598E") + r := ECmultGen(nonce) + ex.SetHex("02D1BF36D37ACD68E4DD00DB3A707FD176A37E42F81AEF9386924032D3428FF0") + ey.SetHex("FD52E285D33EC835230EA69F89D9C38673BD5B995716A4063C893AF02F938454") + ez.SetHex("4C6ACE7C8C062A1E046F66FD8E3981DC4E8E844ED856B5415C62047129268C1B") + r.X.Normalize() + r.Y.Normalize() + r.Z.Normalize() + if !ex.Equals(&r.X) { + t.Error("Bad X") + } + if !ey.Equals(&r.Y) { + t.Error("Bad Y") + } + if !ez.Equals(&r.Z) { + t.Error("Bad Y") + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/field.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/field.go new file mode 100644 index 00000000..1be6c817 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/field.go @@ -0,0 +1,738 @@ +package secp256k1go + +import ( + "encoding/hex" + "math/big" +) + +// Field represents the signature field +type Field struct { + n [10]uint32 +} + +// String returns the hex string of the field +func (fd *Field) String() string { + var tmp [32]byte + b := *fd + b.Normalize() + b.GetB32(tmp[:]) + return hex.EncodeToString(tmp[:]) +} + +// GetBig returns big int +func (fd *Field) GetBig() (r *big.Int) { + fd.Normalize() + r = new(big.Int) + var tmp [32]byte + fd.GetB32(tmp[:]) + r.SetBytes(tmp[:]) + return +} + +// SetB32 sets +func (fd *Field) SetB32(a []byte) { + fd.n[0] = 0 + fd.n[1] = 0 + fd.n[2] = 0 + fd.n[3] = 0 + fd.n[4] = 0 + fd.n[5] = 0 + fd.n[6] = 0 + fd.n[7] = 0 + fd.n[8] = 0 + fd.n[9] = 0 + var v uint32 + for i := uint(0); i < 32; i++ { + for j := uint(0); j < 4; j++ { + limb := (8*i + 2*j) / 26 + shift := (8*i + 2*j) % 26 + v = (uint32)((a[31-i]>>(2*j))&0x3) << shift + fd.n[limb] |= v + } + } +} + +// SetBytes sets bytes +func (fd *Field) SetBytes(a []byte) { + if len(a) > 32 { + panic("too many bytes to set") + } + if len(a) == 32 { + fd.SetB32(a) + } else { + var buf [32]byte + copy(buf[32-len(a):], a) + fd.SetB32(buf[:]) + } +} + +// SetHex sets field in hex string +func (fd *Field) SetHex(s string) { + d, err := hex.DecodeString(s) + if err != nil { + panic(err) + } + fd.SetBytes(d) +} + +// IsOdd check if odd +func (fd *Field) IsOdd() bool { + return (fd.n[0] & 1) != 0 +} + +// IsZero check if field is zero +func (fd *Field) IsZero() bool { + return (fd.n[0] == 0 && fd.n[1] == 0 && fd.n[2] == 0 && fd.n[3] == 0 && fd.n[4] == 0 && fd.n[5] == 0 && fd.n[6] == 0 && fd.n[7] == 0 && fd.n[8] == 0 && fd.n[9] == 0) +} + +// SetInt set fields with an int value +func (fd *Field) SetInt(a uint32) { + fd.n[0] = a + fd.n[1] = 0 + fd.n[2] = 0 + fd.n[3] = 0 + fd.n[4] = 0 + fd.n[5] = 0 + fd.n[6] = 0 + fd.n[7] = 0 + fd.n[8] = 0 + fd.n[9] = 0 +} + +// Normalize normalize the field +func (fd *Field) Normalize() { + c := fd.n[0] + t0 := c & 0x3FFFFFF + c = (c >> 26) + fd.n[1] + t1 := c & 0x3FFFFFF + c = (c >> 26) + fd.n[2] + t2 := c & 0x3FFFFFF + c = (c >> 26) + fd.n[3] + t3 := c & 0x3FFFFFF + c = (c >> 26) + fd.n[4] + t4 := c & 0x3FFFFFF + c = (c >> 26) + fd.n[5] + t5 := c & 0x3FFFFFF + c = (c >> 26) + fd.n[6] + t6 := c & 0x3FFFFFF + c = (c >> 26) + fd.n[7] + t7 := c & 0x3FFFFFF + c = (c >> 26) + fd.n[8] + t8 := c & 0x3FFFFFF + c = (c >> 26) + fd.n[9] + t9 := c & 0x03FFFFF + c >>= 22 + + // The following code will not modify the t's if c is initially 0. + d := c*0x3D1 + t0 + t0 = d & 0x3FFFFFF + d = (d >> 26) + t1 + c*0x40 + t1 = d & 0x3FFFFFF + d = (d >> 26) + t2 + t2 = d & 0x3FFFFFF + d = (d >> 26) + t3 + t3 = d & 0x3FFFFFF + d = (d >> 26) + t4 + t4 = d & 0x3FFFFFF + d = (d >> 26) + t5 + t5 = d & 0x3FFFFFF + d = (d >> 26) + t6 + t6 = d & 0x3FFFFFF + d = (d >> 26) + t7 + t7 = d & 0x3FFFFFF + d = (d >> 26) + t8 + t8 = d & 0x3FFFFFF + d = (d >> 26) + t9 + t9 = d & 0x03FFFFF + + // Subtract p if result >= p + low := (uint64(t1) << 26) | uint64(t0) + //mask := uint64(-(int64)((t9 < 0x03FFFFF) | (t8 < 0x3FFFFFF) | (t7 < 0x3FFFFFF) | (t6 < 0x3FFFFFF) | (t5 < 0x3FFFFFF) | (t4 < 0x3FFFFFF) | (t3 < 0x3FFFFFF) | (t2 < 0x3FFFFFF) | (low < 0xFFFFEFFFFFC2F))) + var mask uint64 + if (t9 < 0x03FFFFF) || + (t8 < 0x3FFFFFF) || + (t7 < 0x3FFFFFF) || + (t6 < 0x3FFFFFF) || + (t5 < 0x3FFFFFF) || + (t4 < 0x3FFFFFF) || + (t3 < 0x3FFFFFF) || + (t2 < 0x3FFFFFF) || + (low < 0xFFFFEFFFFFC2F) { + mask = 0xFFFFFFFFFFFFFFFF + } + t9 &= uint32(mask) + t8 &= uint32(mask) + t7 &= uint32(mask) + t6 &= uint32(mask) + t5 &= uint32(mask) + t4 &= uint32(mask) + t3 &= uint32(mask) + t2 &= uint32(mask) + low -= ((mask ^ 0xFFFFFFFFFFFFFFFF) & 0xFFFFEFFFFFC2F) + + // push internal variables back + fd.n[0] = uint32(low) & 0x3FFFFFF + fd.n[1] = uint32(low>>26) & 0x3FFFFFF + fd.n[2] = t2 + fd.n[3] = t3 + fd.n[4] = t4 + fd.n[5] = t5 + fd.n[6] = t6 + fd.n[7] = t7 + fd.n[8] = t8 + fd.n[9] = t9 +} + +// GetB32 get B32, TODO: need further explanation +func (fd *Field) GetB32(r []byte) { + var i, j, c, limb, shift uint32 + for i = 0; i < 32; i++ { + c = 0 + for j = 0; j < 4; j++ { + limb = (8*i + 2*j) / 26 + shift = (8*i + 2*j) % 26 + c |= ((fd.n[limb] >> shift) & 0x3) << (2 * j) + } + r[31-i] = byte(c) + } +} + +// Equals check if field is the same as the given one +func (fd *Field) Equals(b *Field) bool { + return (fd.n[0] == b.n[0] && fd.n[1] == b.n[1] && fd.n[2] == b.n[2] && fd.n[3] == b.n[3] && fd.n[4] == b.n[4] && + fd.n[5] == b.n[5] && fd.n[6] == b.n[6] && fd.n[7] == b.n[7] && fd.n[8] == b.n[8] && fd.n[9] == b.n[9]) +} + +// SetAdd adds value to corresponding fields +func (fd *Field) SetAdd(a *Field) { + fd.n[0] += a.n[0] + fd.n[1] += a.n[1] + fd.n[2] += a.n[2] + fd.n[3] += a.n[3] + fd.n[4] += a.n[4] + fd.n[5] += a.n[5] + fd.n[6] += a.n[6] + fd.n[7] += a.n[7] + fd.n[8] += a.n[8] + fd.n[9] += a.n[9] +} + +// MulInt multiples the fields +func (fd *Field) MulInt(a uint32) { + fd.n[0] *= a + fd.n[1] *= a + fd.n[2] *= a + fd.n[3] *= a + fd.n[4] *= a + fd.n[5] *= a + fd.n[6] *= a + fd.n[7] *= a + fd.n[8] *= a + fd.n[9] *= a +} + +// Negate caculate the negate +func (fd *Field) Negate(r *Field, m uint32) { + r.n[0] = 0x3FFFC2F*(m+1) - fd.n[0] + r.n[1] = 0x3FFFFBF*(m+1) - fd.n[1] + r.n[2] = 0x3FFFFFF*(m+1) - fd.n[2] + r.n[3] = 0x3FFFFFF*(m+1) - fd.n[3] + r.n[4] = 0x3FFFFFF*(m+1) - fd.n[4] + r.n[5] = 0x3FFFFFF*(m+1) - fd.n[5] + r.n[6] = 0x3FFFFFF*(m+1) - fd.n[6] + r.n[7] = 0x3FFFFFF*(m+1) - fd.n[7] + r.n[8] = 0x3FFFFFF*(m+1) - fd.n[8] + r.n[9] = 0x03FFFFF*(m+1) - fd.n[9] +} + +// Inv new algo by peterdettman - https://github.com/sipa/TheCurve/pull/19 +func (fd *Field) Inv(r *Field) { + var x2, x3, x6, x9, x11, x22, x44, x88, x176, x220, x223, t1 Field + var j int + + fd.Sqr(&x2) + x2.Mul(&x2, fd) + + x2.Sqr(&x3) + x3.Mul(&x3, fd) + + x3.Sqr(&x6) + x6.Sqr(&x6) + x6.Sqr(&x6) + x6.Mul(&x6, &x3) + + x6.Sqr(&x9) + x9.Sqr(&x9) + x9.Sqr(&x9) + x9.Mul(&x9, &x3) + + x9.Sqr(&x11) + x11.Sqr(&x11) + x11.Mul(&x11, &x2) + + x11.Sqr(&x22) + for j = 1; j < 11; j++ { + x22.Sqr(&x22) + } + x22.Mul(&x22, &x11) + + x22.Sqr(&x44) + for j = 1; j < 22; j++ { + x44.Sqr(&x44) + } + x44.Mul(&x44, &x22) + + x44.Sqr(&x88) + for j = 1; j < 44; j++ { + x88.Sqr(&x88) + } + x88.Mul(&x88, &x44) + + x88.Sqr(&x176) + for j = 1; j < 88; j++ { + x176.Sqr(&x176) + } + x176.Mul(&x176, &x88) + + x176.Sqr(&x220) + for j = 1; j < 44; j++ { + x220.Sqr(&x220) + } + x220.Mul(&x220, &x44) + + x220.Sqr(&x223) + x223.Sqr(&x223) + x223.Sqr(&x223) + x223.Mul(&x223, &x3) + + x223.Sqr(&t1) + for j = 1; j < 23; j++ { + t1.Sqr(&t1) + } + t1.Mul(&t1, &x22) + t1.Sqr(&t1) + t1.Sqr(&t1) + t1.Sqr(&t1) + t1.Sqr(&t1) + t1.Sqr(&t1) + t1.Mul(&t1, fd) + t1.Sqr(&t1) + t1.Sqr(&t1) + t1.Sqr(&t1) + t1.Mul(&t1, &x2) + t1.Sqr(&t1) + t1.Sqr(&t1) + t1.Mul(r, fd) +} + +// Sqrt new algo by peterdettman - https://github.com/sipa/TheCurve/pull/19 +func (fd *Field) Sqrt(r *Field) { + var x2, x3, x6, x9, x11, x22, x44, x88, x176, x220, x223, t1 Field + var j int + + fd.Sqr(&x2) + x2.Mul(&x2, fd) + + x2.Sqr(&x3) + x3.Mul(&x3, fd) + + x3.Sqr(&x6) + x6.Sqr(&x6) + x6.Sqr(&x6) + x6.Mul(&x6, &x3) + + x6.Sqr(&x9) + x9.Sqr(&x9) + x9.Sqr(&x9) + x9.Mul(&x9, &x3) + + x9.Sqr(&x11) + x11.Sqr(&x11) + x11.Mul(&x11, &x2) + + x11.Sqr(&x22) + for j = 1; j < 11; j++ { + x22.Sqr(&x22) + } + x22.Mul(&x22, &x11) + + x22.Sqr(&x44) + for j = 1; j < 22; j++ { + x44.Sqr(&x44) + } + x44.Mul(&x44, &x22) + + x44.Sqr(&x88) + for j = 1; j < 44; j++ { + x88.Sqr(&x88) + } + x88.Mul(&x88, &x44) + + x88.Sqr(&x176) + for j = 1; j < 88; j++ { + x176.Sqr(&x176) + } + x176.Mul(&x176, &x88) + + x176.Sqr(&x220) + for j = 1; j < 44; j++ { + x220.Sqr(&x220) + } + x220.Mul(&x220, &x44) + + x220.Sqr(&x223) + x223.Sqr(&x223) + x223.Sqr(&x223) + x223.Mul(&x223, &x3) + + x223.Sqr(&t1) + for j = 1; j < 23; j++ { + t1.Sqr(&t1) + } + t1.Mul(&t1, &x22) + for j = 0; j < 6; j++ { + t1.Sqr(&t1) + } + t1.Mul(&t1, &x2) + t1.Sqr(&t1) + t1.Sqr(r) +} + +// InvVar ... +func (fd *Field) InvVar(r *Field) { + var b [32]byte + c := *fd + c.Normalize() + c.GetB32(b[:]) + var n Number + n.SetBytes(b[:]) + n.modInv(&n, &TheCurve.p) + r.SetBytes(n.Bytes()) +} + +// Mul ... +func (fd *Field) Mul(r, b *Field) { + var c, d uint64 + var t0, t1, t2, t3, t4, t5, t6 uint64 + var t7, t8, t9, t10, t11, t12, t13 uint64 + var t14, t15, t16, t17, t18, t19 uint64 + + c = uint64(fd.n[0]) * uint64(b.n[0]) + t0 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[0])*uint64(b.n[1]) + + uint64(fd.n[1])*uint64(b.n[0]) + t1 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[0])*uint64(b.n[2]) + + uint64(fd.n[1])*uint64(b.n[1]) + + uint64(fd.n[2])*uint64(b.n[0]) + t2 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[0])*uint64(b.n[3]) + + uint64(fd.n[1])*uint64(b.n[2]) + + uint64(fd.n[2])*uint64(b.n[1]) + + uint64(fd.n[3])*uint64(b.n[0]) + t3 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[0])*uint64(b.n[4]) + + uint64(fd.n[1])*uint64(b.n[3]) + + uint64(fd.n[2])*uint64(b.n[2]) + + uint64(fd.n[3])*uint64(b.n[1]) + + uint64(fd.n[4])*uint64(b.n[0]) + t4 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[0])*uint64(b.n[5]) + + uint64(fd.n[1])*uint64(b.n[4]) + + uint64(fd.n[2])*uint64(b.n[3]) + + uint64(fd.n[3])*uint64(b.n[2]) + + uint64(fd.n[4])*uint64(b.n[1]) + + uint64(fd.n[5])*uint64(b.n[0]) + t5 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[0])*uint64(b.n[6]) + + uint64(fd.n[1])*uint64(b.n[5]) + + uint64(fd.n[2])*uint64(b.n[4]) + + uint64(fd.n[3])*uint64(b.n[3]) + + uint64(fd.n[4])*uint64(b.n[2]) + + uint64(fd.n[5])*uint64(b.n[1]) + + uint64(fd.n[6])*uint64(b.n[0]) + t6 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[0])*uint64(b.n[7]) + + uint64(fd.n[1])*uint64(b.n[6]) + + uint64(fd.n[2])*uint64(b.n[5]) + + uint64(fd.n[3])*uint64(b.n[4]) + + uint64(fd.n[4])*uint64(b.n[3]) + + uint64(fd.n[5])*uint64(b.n[2]) + + uint64(fd.n[6])*uint64(b.n[1]) + + uint64(fd.n[7])*uint64(b.n[0]) + t7 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[0])*uint64(b.n[8]) + + uint64(fd.n[1])*uint64(b.n[7]) + + uint64(fd.n[2])*uint64(b.n[6]) + + uint64(fd.n[3])*uint64(b.n[5]) + + uint64(fd.n[4])*uint64(b.n[4]) + + uint64(fd.n[5])*uint64(b.n[3]) + + uint64(fd.n[6])*uint64(b.n[2]) + + uint64(fd.n[7])*uint64(b.n[1]) + + uint64(fd.n[8])*uint64(b.n[0]) + t8 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[0])*uint64(b.n[9]) + + uint64(fd.n[1])*uint64(b.n[8]) + + uint64(fd.n[2])*uint64(b.n[7]) + + uint64(fd.n[3])*uint64(b.n[6]) + + uint64(fd.n[4])*uint64(b.n[5]) + + uint64(fd.n[5])*uint64(b.n[4]) + + uint64(fd.n[6])*uint64(b.n[3]) + + uint64(fd.n[7])*uint64(b.n[2]) + + uint64(fd.n[8])*uint64(b.n[1]) + + uint64(fd.n[9])*uint64(b.n[0]) + t9 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[1])*uint64(b.n[9]) + + uint64(fd.n[2])*uint64(b.n[8]) + + uint64(fd.n[3])*uint64(b.n[7]) + + uint64(fd.n[4])*uint64(b.n[6]) + + uint64(fd.n[5])*uint64(b.n[5]) + + uint64(fd.n[6])*uint64(b.n[4]) + + uint64(fd.n[7])*uint64(b.n[3]) + + uint64(fd.n[8])*uint64(b.n[2]) + + uint64(fd.n[9])*uint64(b.n[1]) + t10 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[2])*uint64(b.n[9]) + + uint64(fd.n[3])*uint64(b.n[8]) + + uint64(fd.n[4])*uint64(b.n[7]) + + uint64(fd.n[5])*uint64(b.n[6]) + + uint64(fd.n[6])*uint64(b.n[5]) + + uint64(fd.n[7])*uint64(b.n[4]) + + uint64(fd.n[8])*uint64(b.n[3]) + + uint64(fd.n[9])*uint64(b.n[2]) + t11 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[3])*uint64(b.n[9]) + + uint64(fd.n[4])*uint64(b.n[8]) + + uint64(fd.n[5])*uint64(b.n[7]) + + uint64(fd.n[6])*uint64(b.n[6]) + + uint64(fd.n[7])*uint64(b.n[5]) + + uint64(fd.n[8])*uint64(b.n[4]) + + uint64(fd.n[9])*uint64(b.n[3]) + t12 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[4])*uint64(b.n[9]) + + uint64(fd.n[5])*uint64(b.n[8]) + + uint64(fd.n[6])*uint64(b.n[7]) + + uint64(fd.n[7])*uint64(b.n[6]) + + uint64(fd.n[8])*uint64(b.n[5]) + + uint64(fd.n[9])*uint64(b.n[4]) + t13 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[5])*uint64(b.n[9]) + + uint64(fd.n[6])*uint64(b.n[8]) + + uint64(fd.n[7])*uint64(b.n[7]) + + uint64(fd.n[8])*uint64(b.n[6]) + + uint64(fd.n[9])*uint64(b.n[5]) + t14 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[6])*uint64(b.n[9]) + + uint64(fd.n[7])*uint64(b.n[8]) + + uint64(fd.n[8])*uint64(b.n[7]) + + uint64(fd.n[9])*uint64(b.n[6]) + t15 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[7])*uint64(b.n[9]) + + uint64(fd.n[8])*uint64(b.n[8]) + + uint64(fd.n[9])*uint64(b.n[7]) + t16 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[8])*uint64(b.n[9]) + + uint64(fd.n[9])*uint64(b.n[8]) + t17 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[9])*uint64(b.n[9]) + t18 = c & 0x3FFFFFF + c = c >> 26 + t19 = c + + c = t0 + t10*0x3D10 + t0 = c & 0x3FFFFFF + c = c >> 26 + c = c + t1 + t10*0x400 + t11*0x3D10 + t1 = c & 0x3FFFFFF + c = c >> 26 + c = c + t2 + t11*0x400 + t12*0x3D10 + t2 = c & 0x3FFFFFF + c = c >> 26 + c = c + t3 + t12*0x400 + t13*0x3D10 + r.n[3] = uint32(c) & 0x3FFFFFF + c = c >> 26 + c = c + t4 + t13*0x400 + t14*0x3D10 + r.n[4] = uint32(c) & 0x3FFFFFF + c = c >> 26 + c = c + t5 + t14*0x400 + t15*0x3D10 + r.n[5] = uint32(c) & 0x3FFFFFF + c = c >> 26 + c = c + t6 + t15*0x400 + t16*0x3D10 + r.n[6] = uint32(c) & 0x3FFFFFF + c = c >> 26 + c = c + t7 + t16*0x400 + t17*0x3D10 + r.n[7] = uint32(c) & 0x3FFFFFF + c = c >> 26 + c = c + t8 + t17*0x400 + t18*0x3D10 + r.n[8] = uint32(c) & 0x3FFFFFF + c = c >> 26 + c = c + t9 + t18*0x400 + t19*0x1000003D10 + r.n[9] = uint32(c) & 0x03FFFFF + c = c >> 22 + d = t0 + c*0x3D1 + r.n[0] = uint32(d) & 0x3FFFFFF + d = d >> 26 + d = d + t1 + c*0x40 + r.n[1] = uint32(d) & 0x3FFFFFF + d = d >> 26 + r.n[2] = uint32(t2 + d) +} + +// Sqr ... +func (fd *Field) Sqr(r *Field) { + var c, d uint64 + var t0, t1, t2, t3, t4, t5, t6 uint64 + var t7, t8, t9, t10, t11, t12, t13 uint64 + var t14, t15, t16, t17, t18, t19 uint64 + + c = uint64(fd.n[0]) * uint64(fd.n[0]) + t0 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[0])*2)*uint64(fd.n[1]) + t1 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[0])*2)*uint64(fd.n[2]) + + uint64(fd.n[1])*uint64(fd.n[1]) + t2 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[0])*2)*uint64(fd.n[3]) + + (uint64(fd.n[1])*2)*uint64(fd.n[2]) + t3 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[0])*2)*uint64(fd.n[4]) + + (uint64(fd.n[1])*2)*uint64(fd.n[3]) + + uint64(fd.n[2])*uint64(fd.n[2]) + t4 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[0])*2)*uint64(fd.n[5]) + + (uint64(fd.n[1])*2)*uint64(fd.n[4]) + + (uint64(fd.n[2])*2)*uint64(fd.n[3]) + t5 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[0])*2)*uint64(fd.n[6]) + + (uint64(fd.n[1])*2)*uint64(fd.n[5]) + + (uint64(fd.n[2])*2)*uint64(fd.n[4]) + + uint64(fd.n[3])*uint64(fd.n[3]) + t6 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[0])*2)*uint64(fd.n[7]) + + (uint64(fd.n[1])*2)*uint64(fd.n[6]) + + (uint64(fd.n[2])*2)*uint64(fd.n[5]) + + (uint64(fd.n[3])*2)*uint64(fd.n[4]) + t7 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[0])*2)*uint64(fd.n[8]) + + (uint64(fd.n[1])*2)*uint64(fd.n[7]) + + (uint64(fd.n[2])*2)*uint64(fd.n[6]) + + (uint64(fd.n[3])*2)*uint64(fd.n[5]) + + uint64(fd.n[4])*uint64(fd.n[4]) + t8 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[0])*2)*uint64(fd.n[9]) + + (uint64(fd.n[1])*2)*uint64(fd.n[8]) + + (uint64(fd.n[2])*2)*uint64(fd.n[7]) + + (uint64(fd.n[3])*2)*uint64(fd.n[6]) + + (uint64(fd.n[4])*2)*uint64(fd.n[5]) + t9 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[1])*2)*uint64(fd.n[9]) + + (uint64(fd.n[2])*2)*uint64(fd.n[8]) + + (uint64(fd.n[3])*2)*uint64(fd.n[7]) + + (uint64(fd.n[4])*2)*uint64(fd.n[6]) + + uint64(fd.n[5])*uint64(fd.n[5]) + t10 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[2])*2)*uint64(fd.n[9]) + + (uint64(fd.n[3])*2)*uint64(fd.n[8]) + + (uint64(fd.n[4])*2)*uint64(fd.n[7]) + + (uint64(fd.n[5])*2)*uint64(fd.n[6]) + t11 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[3])*2)*uint64(fd.n[9]) + + (uint64(fd.n[4])*2)*uint64(fd.n[8]) + + (uint64(fd.n[5])*2)*uint64(fd.n[7]) + + uint64(fd.n[6])*uint64(fd.n[6]) + t12 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[4])*2)*uint64(fd.n[9]) + + (uint64(fd.n[5])*2)*uint64(fd.n[8]) + + (uint64(fd.n[6])*2)*uint64(fd.n[7]) + t13 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[5])*2)*uint64(fd.n[9]) + + (uint64(fd.n[6])*2)*uint64(fd.n[8]) + + uint64(fd.n[7])*uint64(fd.n[7]) + t14 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[6])*2)*uint64(fd.n[9]) + + (uint64(fd.n[7])*2)*uint64(fd.n[8]) + t15 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[7])*2)*uint64(fd.n[9]) + + uint64(fd.n[8])*uint64(fd.n[8]) + t16 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[8])*2)*uint64(fd.n[9]) + t17 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[9])*uint64(fd.n[9]) + t18 = c & 0x3FFFFFF + c = c >> 26 + t19 = c + + c = t0 + t10*0x3D10 + t0 = c & 0x3FFFFFF + c = c >> 26 + c = c + t1 + t10*0x400 + t11*0x3D10 + t1 = c & 0x3FFFFFF + c = c >> 26 + c = c + t2 + t11*0x400 + t12*0x3D10 + t2 = c & 0x3FFFFFF + c = c >> 26 + c = c + t3 + t12*0x400 + t13*0x3D10 + r.n[3] = uint32(c) & 0x3FFFFFF + c = c >> 26 + c = c + t4 + t13*0x400 + t14*0x3D10 + r.n[4] = uint32(c) & 0x3FFFFFF + c = c >> 26 + c = c + t5 + t14*0x400 + t15*0x3D10 + r.n[5] = uint32(c) & 0x3FFFFFF + c = c >> 26 + c = c + t6 + t15*0x400 + t16*0x3D10 + r.n[6] = uint32(c) & 0x3FFFFFF + c = c >> 26 + c = c + t7 + t16*0x400 + t17*0x3D10 + r.n[7] = uint32(c) & 0x3FFFFFF + c = c >> 26 + c = c + t8 + t17*0x400 + t18*0x3D10 + r.n[8] = uint32(c) & 0x3FFFFFF + c = c >> 26 + c = c + t9 + t18*0x400 + t19*0x1000003D10 + r.n[9] = uint32(c) & 0x03FFFFF + c = c >> 22 + d = t0 + c*0x3D1 + r.n[0] = uint32(d) & 0x3FFFFFF + d = d >> 26 + d = d + t1 + c*0x40 + r.n[1] = uint32(d) & 0x3FFFFFF + d = d >> 26 + r.n[2] = uint32(t2 + d) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/field_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/field_test.go new file mode 100644 index 00000000..0a978645 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/field_test.go @@ -0,0 +1,42 @@ +package secp256k1go + +import ( + "crypto/rand" + "testing" +) + +func TestFeInv(t *testing.T) { + var in, out, exp Field + in.SetHex("813925AF112AAB8243F8CCBADE4CC7F63DF387263028DE6E679232A73A7F3C31") + exp.SetHex("7F586430EA30F914965770F6098E492699C62EE1DF6CAFFA77681C179FDF3117") + in.Inv(&out) + if !out.Equals(&exp) { + t.Error("fe.Inv() failed") + } +} + +func BenchmarkFieldSqrt(b *testing.B) { + var dat [32]byte + var f, tmp Field + _, err := rand.Read(dat[:]) + if err != nil { + b.Error(err) + } + f.SetB32(dat[:]) + for i := 0; i < b.N; i++ { + f.Sqrt(&tmp) + } +} + +func BenchmarkFieldInv(b *testing.B) { + var dat [32]byte + var f, tmp Field + _, err := rand.Read(dat[:]) + if err != nil { + b.Error(err) + } + f.SetB32(dat[:]) + for i := 0; i < b.N; i++ { + f.Inv(&tmp) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/num.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/num.go new file mode 100644 index 00000000..07527d85 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/num.go @@ -0,0 +1,100 @@ +package secp256k1go + +import ( + "math/big" +) + +var ( + // BigInt1 represents big int with value 1 + BigInt1 = new(big.Int).SetInt64(1) +) + +// Number wraps the big.Int +type Number struct { + big.Int +} + +func (num *Number) modMul(a, b, m *Number) { + num.Mul(&a.Int, &b.Int) + num.Mod(&num.Int, &m.Int) +} + +func (num *Number) modInv(a, b *Number) { + num.ModInverse(&a.Int, &b.Int) +} + +func (num *Number) mod(a *Number) { + num.Mod(&num.Int, &a.Int) +} + +// SetHex sets number from string +func (num *Number) SetHex(s string) { + if _, ok := num.SetString(s, 16); !ok { + panic("Number.SetHex failed") + } +} + +func (num *Number) maskBits(bits uint) { + mask := new(big.Int).Lsh(BigInt1, bits) + mask.Sub(mask, BigInt1) + num.Int.And(&num.Int, mask) +} + +func (num *Number) splitExp(r1, r2 *Number) { + var bnc1, bnc2, bnn2, bnt1, bnt2 Number + + bnn2.Int.Rsh(&TheCurve.Order.Int, 1) + + bnc1.Mul(&num.Int, &TheCurve.a1b2.Int) + bnc1.Add(&bnc1.Int, &bnn2.Int) + bnc1.Div(&bnc1.Int, &TheCurve.Order.Int) + + bnc2.Mul(&num.Int, &TheCurve.b1.Int) + bnc2.Add(&bnc2.Int, &bnn2.Int) + bnc2.Div(&bnc2.Int, &TheCurve.Order.Int) + + bnt1.Mul(&bnc1.Int, &TheCurve.a1b2.Int) + bnt2.Mul(&bnc2.Int, &TheCurve.a2.Int) + bnt1.Add(&bnt1.Int, &bnt2.Int) + r1.Sub(&num.Int, &bnt1.Int) + + bnt1.Mul(&bnc1.Int, &TheCurve.b1.Int) + bnt2.Mul(&bnc2.Int, &TheCurve.a1b2.Int) + r2.Sub(&bnt1.Int, &bnt2.Int) +} + +func (num *Number) split(rl, rh *Number, bits uint) { //nolint:unparam + rl.Int.Set(&num.Int) + rh.Int.Rsh(&rl.Int, bits) + rl.maskBits(bits) +} + +func (num *Number) rsh(bits uint) { //nolint:unparam + num.Rsh(&num.Int, bits) +} + +func (num *Number) inc() { + num.Add(&num.Int, BigInt1) +} + +func (num *Number) rshX(bits uint) (res int) { + res = int(new(big.Int).And(&num.Int, new(big.Int).SetUint64((1< length { + panic("buffer too small") + } + if len(b) == length { + return b + } + return append(make([]byte, length-len(b)), b...) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/secp256k1.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/secp256k1.go new file mode 100644 index 00000000..1cbb4ae3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/secp256k1.go @@ -0,0 +1,64 @@ +/* +Package secp256k1go implements the underlying secp256k1 primitives +*/ +package secp256k1go + +const winA = 5 +const winG = 14 + +// TheCurve is the secp256k1 curve +var TheCurve struct { + Order Number // the order of the base point (stdlib crypto/elliptic.CurveParams.N) + halfOrder Number // half of the Order value + G XY // (x, y) of the base point (stdlib crypto/elliptic.CurveParams.Gx, Gy) + beta Field // endomorphism optimization parameter (derived from Hal Finney's post https://bitcointalk.org/index.php?topic=3238.msg45565#msg45565) + lambda, a1b2, b1, a2 Number // endomorphism optimization parameters (derived from Hal Finney's post https://bitcointalk.org/index.php?topic=3238.msg45565#msg45565) + p Number // // the order of the underlying field (stdlib crypto/elliptic.CurveParams.P) +} + +func initConstants() { + TheCurve.Order.SetBytes([]byte{ + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, + 0xBA, 0xAE, 0xDC, 0xE6, 0xAF, 0x48, 0xA0, 0x3B, 0xBF, 0xD2, 0x5E, 0x8C, 0xD0, 0x36, 0x41, 0x41}) + + TheCurve.halfOrder.SetBytes([]byte{ + 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0X5D, 0X57, 0X6E, 0X73, 0X57, 0XA4, 0X50, 0X1D, 0XDF, 0XE9, 0X2F, 0X46, 0X68, 0X1B, 0X20, 0XA0}) + + TheCurve.p.SetBytes([]byte{ + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFC, 0x2F}) + + TheCurve.G.X.SetB32([]byte{ + 0x79, 0xBE, 0x66, 0x7E, 0xF9, 0xDC, 0xBB, 0xAC, 0x55, 0xA0, 0x62, 0x95, 0xCE, 0x87, 0x0B, 0x07, + 0x02, 0x9B, 0xFC, 0xDB, 0x2D, 0xCE, 0x28, 0xD9, 0x59, 0xF2, 0x81, 0x5B, 0x16, 0xF8, 0x17, 0x98}) + + TheCurve.G.Y.SetB32([]byte{ + 0x48, 0x3A, 0xDA, 0x77, 0x26, 0xA3, 0xC4, 0x65, 0x5D, 0xA4, 0xFB, 0xFC, 0x0E, 0x11, 0x08, 0xA8, + 0xFD, 0x17, 0xB4, 0x48, 0xA6, 0x85, 0x54, 0x19, 0x9C, 0x47, 0xD0, 0x8F, 0xFB, 0x10, 0xD4, 0xB8}) + + // See Hal Finney's post https://bitcointalk.org/index.php?topic=3238.msg45565#msg45565 + // Backup archive: https://gist.github.com/gz-c/bf70ce96b2488e5ccca65900086c75f5 + // for explanation of the following constants: + + TheCurve.lambda.SetBytes([]byte{ + 0x53, 0x63, 0xad, 0x4c, 0xc0, 0x5c, 0x30, 0xe0, 0xa5, 0x26, 0x1c, 0x02, 0x88, 0x12, 0x64, 0x5a, + 0x12, 0x2e, 0x22, 0xea, 0x20, 0x81, 0x66, 0x78, 0xdf, 0x02, 0x96, 0x7c, 0x1b, 0x23, 0xbd, 0x72}) + + TheCurve.beta.SetB32([]byte{ + 0x7a, 0xe9, 0x6a, 0x2b, 0x65, 0x7c, 0x07, 0x10, 0x6e, 0x64, 0x47, 0x9e, 0xac, 0x34, 0x34, 0xe9, + 0x9c, 0xf0, 0x49, 0x75, 0x12, 0xf5, 0x89, 0x95, 0xc1, 0x39, 0x6c, 0x28, 0x71, 0x95, 0x01, 0xee}) + + TheCurve.a1b2.SetBytes([]byte{ + 0x30, 0x86, 0xd2, 0x21, 0xa7, 0xd4, 0x6b, 0xcd, 0xe8, 0x6c, 0x90, 0xe4, 0x92, 0x84, 0xeb, 0x15}) + + TheCurve.b1.SetBytes([]byte{ + 0xe4, 0x43, 0x7e, 0xd6, 0x01, 0x0e, 0x88, 0x28, 0x6f, 0x54, 0x7f, 0xa9, 0x0a, 0xbf, 0xe4, 0xc3}) + + TheCurve.a2.SetBytes([]byte{ + 0x01, 0x14, 0xca, 0x50, 0xf7, 0xa8, 0xe2, 0xf3, 0xf6, 0x57, 0xc1, 0x10, 0x8d, 0x9d, 0x44, 0xcf, 0xd8}) +} + +func init() { + initConstants() +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/sig.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/sig.go new file mode 100644 index 00000000..2ea702c3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/sig.go @@ -0,0 +1,280 @@ +package secp256k1go + +import ( + "bytes" + "log" +) + +// Signature represents the signature +type Signature struct { + R, S Number +} + +// Verify verify the signature +func (sig *Signature) Verify(pubkey *XY, message *Number) bool { + var r2 Number + return sig.recompute(&r2, pubkey, message) && sig.R.Cmp(&r2.Int) == 0 +} + +func (sig *Signature) recompute(r2 *Number, pubkey *XY, message *Number) bool { + var sn, u1, u2 Number + + sn.modInv(&sig.S, &TheCurve.Order) + u1.modMul(&sn, message, &TheCurve.Order) + u2.modMul(&sn, &sig.R, &TheCurve.Order) + + var pr, pubkeyj XYZ + pubkeyj.SetXY(pubkey) + + pubkeyj.ECmult(&pr, &u2, &u1) + if pr.IsInfinity() { + return false + } + + var xr Field + pr.getX(&xr) + xr.Normalize() + var xrb [32]byte + xr.GetB32(xrb[:]) + r2.SetBytes(xrb[:]) + r2.Mod(&r2.Int, &TheCurve.Order.Int) + + return true +} + +/* +Reference code for Signature.Recover + +https://github.com/bitcoin-core/secp256k1/blob/e541a90ef6461007d9c6a74b9f9a7fb8aa34aaa8/src/modules/recovery/main_impl.h + +static int secp256k1_ecdsa_sig_recover(const secp256k1_ecmult_context *ctx, const secp256k1_scalar *sigr, const secp256k1_scalar* sigs, secp256k1_ge *pubkey, const secp256k1_scalar *message, int recid) { + unsigned char brx[32]; + secp256k1_fe fx; + secp256k1_ge x; + secp256k1_gej xj; + secp256k1_scalar rn, u1, u2; + secp256k1_gej qj; + int r; + + if (secp256k1_scalar_is_zero(sigr) || secp256k1_scalar_is_zero(sigs)) { + return 0; + } + + secp256k1_scalar_get_b32(brx, sigr); + r = secp256k1_fe_set_b32(&fx, brx); + (void)r; + VERIFY_CHECK(r); // brx comes from a scalar, so is less than the order; certainly less than p + if (recid & 2) { + if (secp256k1_fe_cmp_var(&fx, &secp256k1_ecdsa_const_p_minus_order) >= 0) { + return 0; + } + secp256k1_fe_add(&fx, &secp256k1_ecdsa_const_order_as_fe); + } + if (!secp256k1_ge_set_xo_var(&x, &fx, recid & 1)) { + return 0; + } + secp256k1_gej_set_ge(&xj, &x); + secp256k1_scalar_inverse_var(&rn, sigr); + secp256k1_scalar_mul(&u1, &rn, message); + secp256k1_scalar_negate(&u1, &u1); + secp256k1_scalar_mul(&u2, &rn, sigs); + secp256k1_ecmult(ctx, &qj, &xj, &u2, &u1); + secp256k1_ge_set_gej_var(pubkey, &qj); + return !secp256k1_gej_is_infinity(&qj); +} +*/ + +// Recover recovers a pubkey XY point given the message that was signed to create +// this signature. +func (sig *Signature) Recover(pubkey *XY, msg *Number, recid int) bool { + var rx, rn, u1, u2 Number + var fx Field + var x XY + var xj, qj XYZ + + if sig.R.Sign() == 0 || sig.S.Sign() == 0 { + return false + } + + rx.Set(&sig.R.Int) + if (recid & 2) != 0 { + rx.Add(&rx.Int, &TheCurve.Order.Int) + if rx.Cmp(&TheCurve.p.Int) >= 0 { + return false + } + } + + fx.SetB32(LeftPadBytes(rx.Bytes(), 32)) + + x.SetXO(&fx, (recid&1) != 0) + if !x.IsValid() { + return false + } + + xj.SetXY(&x) + rn.modInv(&sig.R, &TheCurve.Order) + u1.modMul(&rn, msg, &TheCurve.Order) + u1.Sub(&TheCurve.Order.Int, &u1.Int) + u2.modMul(&rn, &sig.S, &TheCurve.Order) + xj.ECmult(&qj, &u2, &u1) + pubkey.SetXYZ(&qj) + return !qj.IsInfinity() +} + +/* +Reference code for Signature.Sign + +https://github.com/bitcoin-core/secp256k1/blob/master/src/ecdsa_impl.h + +static int secp256k1_ecdsa_sig_sign(const secp256k1_ecmult_gen_context *ctx, secp256k1_scalar *sigr, secp256k1_scalar *sigs, const secp256k1_scalar *seckey, const secp256k1_scalar *message, const secp256k1_scalar *nonce, int *recid) { + unsigned char b[32]; + secp256k1_gej rp; + secp256k1_ge r; + secp256k1_scalar n; + int overflow = 0; + + secp256k1_ecmult_gen(ctx, &rp, nonce); + secp256k1_ge_set_gej(&r, &rp); + secp256k1_fe_normalize(&r.x); + secp256k1_fe_normalize(&r.y); + secp256k1_fe_get_b32(b, &r.x); + secp256k1_scalar_set_b32(sigr, b, &overflow); + // These two conditions should be checked before calling + VERIFY_CHECK(!secp256k1_scalar_is_zero(sigr)); + VERIFY_CHECK(overflow == 0); + + if (recid) { + // The overflow condition is cryptographically unreachable as hitting it requires finding the discrete log + // of some P where P.x >= order, and only 1 in about 2^127 points meet this criteria. + *recid = (overflow ? 2 : 0) | (secp256k1_fe_is_odd(&r.y) ? 1 : 0); + } + secp256k1_scalar_mul(&n, sigr, seckey); + secp256k1_scalar_add(&n, &n, message); + secp256k1_scalar_inverse(sigs, nonce); + secp256k1_scalar_mul(sigs, sigs, &n); + secp256k1_scalar_clear(&n); + secp256k1_gej_clear(&rp); + secp256k1_ge_clear(&r); + if (secp256k1_scalar_is_zero(sigs)) { + return 0; + } + if (secp256k1_scalar_is_high(sigs)) { + secp256k1_scalar_negate(sigs, sigs); + if (recid) { + *recid ^= 1; + } + } + return 1; +} +*/ + +// Sign signs the signature. Returns 1 on success, 0 on failure +func (sig *Signature) Sign(seckey, message, nonce *Number, recid *int) int { + var r XY + var n Number + var b [32]byte + + // r = nonce*G + rp := ECmultGen(*nonce) + r.SetXYZ(&rp) + r.X.Normalize() + r.Y.Normalize() + r.X.GetB32(b[:]) + sig.R.SetBytes(b[:]) + + if sig.R.Sign() == 0 { + log.Panic("sig R value should not be 0") + } + + if recid != nil { + *recid = 0 + // The overflow condition is cryptographically unreachable as hitting + // it requires finding the discrete log of some P where P.x >= order, + // and only 1 in about 2^127 points meet this criteria. + if sig.R.Cmp(&TheCurve.Order.Int) >= 0 { + *recid |= 2 + } + if r.Y.IsOdd() { + *recid |= 1 + } + } + + sig.R.mod(&TheCurve.Order) + n.modMul(&sig.R, seckey, &TheCurve.Order) + n.Add(&n.Int, &message.Int) + n.mod(&TheCurve.Order) + sig.S.modInv(nonce, &TheCurve.Order) + sig.S.modMul(&sig.S, &n, &TheCurve.Order) + + if sig.S.Sign() == 0 { + return 0 + } + + // Break signature malleability + if sig.S.Cmp(&TheCurve.halfOrder.Int) == 1 { + sig.S.Sub(&TheCurve.Order.Int, &sig.S.Int) + if recid != nil { + *recid ^= 1 + } + } + + return 1 +} + +// ParseBytes parses a serialized R||S pair to Signature. +// R and S should be in big-endian encoding. +func (sig *Signature) ParseBytes(v []byte) { + if len(v) != 64 { + log.Panic("Signature.ParseBytes requires 64 bytes") + } + sig.R.SetBytes(v[0:32]) + sig.S.SetBytes(v[32:64]) +} + +//secp256k1_num_get_bin(sig64, 32, &sig.r); +//secp256k1_num_get_bin(sig64 + 32, 32, &sig.s); + +// Bytes serializes compressed signatures as bytes. +// The serialization format is R||S. R and S bytes are big-endian. +// R and S are left-padded with the NUL byte to ensure their length is 32 bytes. +func (sig *Signature) Bytes() []byte { + r := sig.R.Bytes() // big-endian + s := sig.S.Bytes() // big-endian + + for len(r) < 32 { + r = append([]byte{0}, r...) + } + for len(s) < 32 { + s = append([]byte{0}, s...) + } + + if len(r) != 32 || len(s) != 32 { + log.Panicf("signature size invalid: %d, %d", len(r), len(s)) + } + + res := new(bytes.Buffer) + if _, err := res.Write(r); err != nil { + log.Panic(err) + } + if _, err := res.Write(s); err != nil { + log.Panic(err) + } + + //test + if true { + ret := res.Bytes() + var sig2 Signature + sig2.ParseBytes(ret) + if !bytes.Equal(sig.R.Bytes(), sig2.R.Bytes()) { + log.Panic("serialization failed 1") + } + if !bytes.Equal(sig.S.Bytes(), sig2.S.Bytes()) { + log.Panic("serialization failed 2") + } + } + + if len(res.Bytes()) != 64 { + log.Panic("Signature.Bytes result bytes must be 64 bytes long") + } + return res.Bytes() +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/sig_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/sig_test.go new file mode 100644 index 00000000..15641a74 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/sig_test.go @@ -0,0 +1,351 @@ +package secp256k1go + +import ( + "encoding/hex" + "fmt" + "testing" +) + +func TestSigForceLowS(t *testing.T) { + // forceLowS was a hardcoded parameter that forced the Signature's S point + // to be "low", i.e. below the half-order of the curve. + // This is necessary to break signature malleability and should always be on, + // so the forceLowS parameter was removed, and the current code is equivalent + // to forceLowS=true. + + // Check that forceLowS forces the S point to the lower half of the curve + var sec, msg, non Number + sec.SetHex("7A642C99F7719F57D8F4BEB11A303AFCD190243A51CED8782CA6D3DBE014D146") + msg.SetHex("DD72CBF2203C1A55A411EEC4404AF2AFB2FE942C434B23EFE46E9F04DA8433CA") + non.SetHex("9F3CD9AB0F32911BFDE39AD155F527192CE5ED1F51447D63C4F154C118DA598E") + + // The signature when forceLowS is true (not malleable) + sigHexLowS := "8c20a668be1b5a910205de46095023fe4823a3757f4417114168925f28193bff520ce833da9313d726f2a4d481e3195a5dd8e935a6c7f4dc260ed4c66ebe6da7" + // The signature when forceLowS is false (malleable) + // "8c20a668be1b5a910205de46095023fe4823a3757f4417114168925f28193bffadf317cc256cec28d90d5b2b7e1ce6a45cd5f3b10880ab5f99c389c66177d39a" + + var sig Signature + var recid int + res := sig.Sign(&sec, &msg, &non, &recid) + if res != 1 { + t.Error("res failed", res) + return + } + + if recid != 0 { + t.Error("recid should be 0 because of forceLowS") + } + if sigHexLowS != hex.EncodeToString(sig.Bytes()) { + t.Error("forceLowS did not modify the S point as expected") + } +} + +func TestSigRecover(t *testing.T) { + cases := []struct { + r string + s string + msg string + recid int + x string + y string + }{ + { + r: "6028b9e3a31c9e725fcbd7d5d16736aaaafcc9bf157dfb4be62bcbcf0969d488", + s: "036d4a36fa235b8f9f815aa6f5457a607f956a71a035bf0970d8578bf218bb5a", + msg: "9cff3da1a4f86caf3683f865232c64992b5ed002af42b321b8d8a48420680487", + recid: 0, + x: "56dc5df245955302893d8dda0677cc9865d8011bc678c7803a18b5f6faafec08", + y: "54b5fbdcd8fac6468dac2de88fadce6414f5f3afbb103753e25161bef77705a6", + }, + { + r: "b470e02f834a3aaafa27bd2b49e07269e962a51410f364e9e195c31351a05e50", + s: "560978aed76de9d5d781f87ed2068832ed545f2b21bf040654a2daff694c8b09", + msg: "9ce428d58e8e4caf619dc6fc7b2c2c28f0561654d1f80f322c038ad5e67ff8a6", + recid: 1, + x: "15b7e7d00f024bffcd2e47524bb7b7d3a6b251e23a3a43191ed7f0a418d9a578", + y: "bf29a25e2d1f32c5afb18b41ae60112723278a8af31275965a6ec1d95334e840", + }, + } + + for _, tc := range cases { + t.Run(fmt.Sprintf("%s,%s", tc.r, tc.s), func(t *testing.T) { + var sig Signature + var pubkey, expectedPubkey XY + var msg Number + + sig.R.SetHex(tc.r) + sig.S.SetHex(tc.s) + msg.SetHex(tc.msg) + + expectedPubkey.X.SetHex(tc.x) + expectedPubkey.Y.SetHex(tc.y) + + if sig.Recover(&pubkey, &msg, tc.recid) { + if !expectedPubkey.X.Equals(&pubkey.X) { + t.Error("X mismatch") + } + if !expectedPubkey.Y.Equals(&pubkey.Y) { + t.Error("Y mismatch") + } + } else { + t.Error("sig.Recover failed") + } + }) + } +} + +func TestSigRecover2(t *testing.T) { + cases := []struct { + msg string + sig string + pubkey string + recoverFails bool + }{ + { + msg: "016b81623cf98f45879f3a48fa34af77dde44b2ffa0ddd2bf9edb386f76ec0ef", + sig: "d2a8ec2b29ce3cf3e6048296188adff4b5dfcb337c1d1157f28654e445bb940b4e47d6b0c7ba43d072bf8618775f123a435e8d1a150cb39bbb1aa80da8c57ea100", + pubkey: "03c0b0e24d55255f7aefe3da7a947a63028b573f45356a9c22e9a3c103fd00c3d1", + }, + + { + msg: "176b81623cf98f45879f3a48fa34af77dde44b2ffa0ddd2bf9edb386f76ec0ef", + sig: "d2a8ec2b20ce3cf3e6048296188adff4b5dfcb337c1d1157f28654e445bb940b4e47d6b0c7ba43d072bf8618775f123a435e8d1a150cb39bbb1aa80da8c57ea100", + pubkey: "03cee91b6d329e00c344ad5d67cfd00d885ec36e8975b5d9097738939cb8c08b31", + }, + { + msg: "176b81623cf98f45879f3a48fa34af77dde44b2ffa0ddd2bf9edb386f76ec0ef", + sig: "d201ec2b29ce3cf3e6048296188adff4b5dfcb337c1d1157f28654e445bb940b4e47d6b0c7ba43d072bf8618775f123a435e8d1a150cb39bbb1aa80da8c57ea100", + recoverFails: true, + }, + } + + for _, tc := range cases { + t.Run(fmt.Sprintf("%s-%s", tc.msg, tc.sig), func(t *testing.T) { + var sig Signature + var pubkey XY + var msg Number + + sigBytes, err := hex.DecodeString(tc.sig) + if err != nil { + t.Error("invalid sig hex") + } + recid := int(sigBytes[64]) + sig.R.SetBytes(sigBytes[:32]) + sig.S.SetBytes(sigBytes[32:64]) + msg.SetHex(tc.msg) + + if sig.Recover(&pubkey, &msg, recid) { + if tc.recoverFails { + t.Error("sig.Recover expected to fail") + } + + pubkeyHex := hex.EncodeToString(pubkey.Bytes()) + if tc.pubkey != pubkeyHex { + t.Errorf("pubkey does not match %s != %s", tc.pubkey, pubkeyHex) + } + } else { + if !tc.recoverFails { + t.Error("sig.Recover failed") + } + } + }) + } +} + +func TestSigVerify(t *testing.T) { + var msg Number + var sig Signature + var key XY + + //// len(65) keys are rejected now, this test case is invalid: + // msg.SetHex("3382219555ddbb5b00e0090f469e590ba1eae03c7f28ab937de330aa60294ed6") + // sig.R.SetHex("fe00e013c244062847045ae7eb73b03fca583e9aa5dbd030a8fd1c6dfcf11b10") + // sig.S.SetHex("7d0d04fed8fa1e93007468d5a9e134b0a7023b6d31db4e50942d43a250f4d07c") + // xy, _ := hex.DecodeString("040eaebcd1df2df853d66ce0e1b0fda07f67d1cabefde98514aad795b86a6ea66dbeb26b67d7a00e2447baeccc8a4cef7cd3cad67376ac1c5785aeebb4f6441c16") + // key.ParsePubkey(xy) + // if !sig.Verify(&key, &msg) { + // t.Error("sig.Verify 0") + // } + + msg.SetHex("D474CBF2203C1A55A411EEC4404AF2AFB2FE942C434B23EFE46E9F04DA8433CA") + sig.R.SetHex("98F9D784BA6C5C77BB7323D044C0FC9F2B27BAA0A5B0718FE88596CC56681980") + sig.S.SetHex("E3599D551029336A745B9FB01566624D870780F363356CEE1425ED67D1294480") + key.X.SetHex("7d709f85a331813f9ae6046c56b3a42737abf4eb918b2e7afee285070e968b93") + key.Y.SetHex("26150d1a63b342986c373977b00131950cb5fc194643cad6ea36b5157eba4602") + if !sig.Verify(&key, &msg) { + t.Error("sig.Verify 1") + } + + msg.SetHex("2c43a883f4edc2b66c67a7a355b9312a565bb3d33bb854af36a06669e2028377") + sig.R.SetHex("6b2fa9344462c958d4a674c2a42fbedf7d6159a5276eb658887e2e1b3915329b") + sig.S.SetHex("eddc6ea7f190c14a0aa74e41519d88d2681314f011d253665f301425caf86b86") + xy, err := hex.DecodeString("02a60d70cfba37177d8239d018185d864b2bdd0caf5e175fd4454cc006fd2d75ac") + if err != nil { + t.Fail() + } + + if err := key.ParsePubkey(xy); err != nil { + t.Errorf("ParsePubkey failed: %v", err) + } + if !sig.Verify(&key, &msg) { + t.Error("sig.Verify 2") + } +} + +func TestSigSign(t *testing.T) { + var sec, msg, non Number + var sig Signature + var recid int + sec.SetHex("73641C99F7719F57D8F4BEB11A303AFCD190243A51CED8782CA6D3DBE014D146") + msg.SetHex("D474CBF2203C1A55A411EEC4404AF2AFB2FE942C434B23EFE46E9F04DA8433CA") + non.SetHex("9E3CD9AB0F32911BFDE39AD155F527192CE5ED1F51447D63C4F154C118DA598E") + res := sig.Sign(&sec, &msg, &non, &recid) + if res != 1 { + t.Error("res failed", res) + } + if recid != 0 { + t.Error("recid failed", recid) + } + non.SetHex("98f9d784ba6c5c77bb7323d044c0fc9f2b27baa0a5b0718fe88596cc56681980") + if sig.R.Cmp(&non.Int) != 0 { + t.Error("R failed", sig.R.String()) + } + non.SetHex("1ca662aaefd6cc958ba4604fea999db133a75bf34c13334dabac7124ff0cfcc1") + if sig.S.Cmp(&non.Int) != 0 { + t.Error("S failed", sig.S.String()) + } + expectSig := "98f9d784ba6c5c77bb7323d044c0fc9f2b27baa0a5b0718fe88596cc566819801ca662aaefd6cc958ba4604fea999db133a75bf34c13334dabac7124ff0cfcc1" + if expectSig != hex.EncodeToString(sig.Bytes()) { + t.Error("signature doesnt match") + } +} + +func TestSigSignRecover(t *testing.T) { + cases := []struct { + // inputs + seckey string + digest string + nonce string + + // outputs + sig string + recid int + pubkey string + }{ + { + seckey: "597e27368656cab3c82bfcf2fb074cefd8b6101781a27709ba1b326b738d2c5a", + digest: "001aa9e416aff5f3a3c7f9ae0811757cf54f393d50df861f5c33747954341aa7", + nonce: "01", + sig: "79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179804641a7472bb90647fa60b4d30aef8c7279e4b68226f7b2713dab712ef122f8b", + recid: 1, + pubkey: "02df09821cff4874198a1dbdc462d224bd99728eeed024185879225762376132c7", + }, + + { + seckey: "597e27368656cab3c82bfcf2fb074cefd8b6101781a27709ba1b326b738d2c5a", + digest: "001aa9e416aff5f3a3c7f9ae0811757cf54f393d50df861f5c33747954341aa7", + nonce: "fe25", + sig: "ee38f27be5f3c4b8db875c0ffbc0232e93f622d16ede888508a4920ab51c3c9906ea7426c5e251e4bea76f06f554fa7798a49b7968b400fa981c51531a5748d8", + recid: 1, + pubkey: "02df09821cff4874198a1dbdc462d224bd99728eeed024185879225762376132c7", + }, + + { + seckey: "597e27368656cab3c82bfcf2fb074cefd8b6101781a27709ba1b326b738d2c5a", + digest: "001aa9e416aff5f3a3c7f9ae0811757cf54f393d50df861f5c33747954341aa7", + nonce: "fe250100", + sig: "d4d869ad39cb3a64fa1980b47d1f19bd568430d3f929e01c00f1e5b7c6840ba85e08d5781986ee72d1e8ebd4dd050386a64eee0256005626d2acbe3aefee9e25", + recid: 0, + pubkey: "02df09821cff4874198a1dbdc462d224bd99728eeed024185879225762376132c7", + }, + + { + seckey: "67a331669081d22624f16512ea61e1d44cb3f26af3333973d17e0e8d03733b78", + digest: "001aa9e416aff5f3a3c7f9ae0811757cf54f393d50df861f5c33747954341aa7", + nonce: "1e2501ac", + sig: "eeee743d79b40aaa52d9eeb48791b0ae81a2f425bf99cdbc84180e8ed429300d457e8d669dbff1716b123552baf6f6f0ef67f16c1d9ccd44e6785d4240022126", + recid: 1, + pubkey: "0270b763664593c5f84dfb20d23ef79530fc317e5ee2ece0d9c50f432f62426ff9", + }, + } + + for _, tc := range cases { + t.Run(fmt.Sprintf("%s-%s-%s", tc.seckey, tc.digest, tc.nonce), func(t *testing.T) { + var sec, msg, non Number + var sig Signature + sec.SetHex(tc.seckey) + msg.SetHex(tc.digest) + non.SetHex(tc.nonce) + + recid := 0 + res := sig.Sign(&sec, &msg, &non, &recid) + if res != 1 { + t.Error("sig.Sign failed") + } + + if recid != tc.recid { + t.Error("recid doesn't match") + } + + sigHex := hex.EncodeToString(sig.Bytes()) + if tc.sig != sigHex { + t.Errorf("signature doesn't match %s != %s", tc.sig, sigHex) + } + + skb, err := hex.DecodeString(tc.seckey) + if err != nil { + t.Error(err) + } + + derivedPk := GeneratePublicKey(skb) + if derivedPk == nil { + t.Error("failed to derive pubkey from seckey") + } + derivedPkHex := hex.EncodeToString(derivedPk) + if tc.pubkey != derivedPkHex { + t.Errorf("derived pubkey doesn't match %s != %s", tc.pubkey, derivedPkHex) + } + + var pk XY + ret := sig.Recover(&pk, &msg, recid) + if !ret { + t.Error("sig.Recover failed") + } + + pkHex := hex.EncodeToString(pk.Bytes()) + if tc.pubkey != pkHex { + t.Errorf("recovered pubkey doesn't match %s != %s", tc.pubkey, pkHex) + } + }) + } +} + +func BenchmarkVerify(b *testing.B) { + var msg Number + var sig Signature + var key XY + msg.SetHex("D474CBF2203C1A55A411EEC4404AF2AFB2FE942C434B23EFE46E9F04DA8433CA") + sig.R.SetHex("98F9D784BA6C5C77BB7323D044C0FC9F2B27BAA0A5B0718FE88596CC56681980") + sig.S.SetHex("E3599D551029336A745B9FB01566624D870780F363356CEE1425ED67D1294480") + key.X.SetHex("7d709f85a331813f9ae6046c56b3a42737abf4eb918b2e7afee285070e968b93") + key.Y.SetHex("26150d1a63b342986c373977b00131950cb5fc194643cad6ea36b5157eba4602") + b.ResetTimer() + for i := 0; i < b.N; i++ { + if !sig.Verify(&key, &msg) { + b.Fatal("sig_verify failed") + } + } +} + +func BenchmarkSign(b *testing.B) { + var sec, msg, non Number + var sig Signature + var recid int + sec.SetHex("73641C99F7719F57D8F4BEB11A303AFCD190243A51CED8782CA6D3DBE014D146") + msg.SetHex("D474CBF2203C1A55A411EEC4404AF2AFB2FE942C434B23EFE46E9F04DA8433CA") + non.SetHex("9E3CD9AB0F32911BFDE39AD155F527192CE5ED1F51447D63C4F154C118DA598E") + b.ResetTimer() + for i := 0; i < b.N; i++ { + sig.Sign(&sec, &msg, &non, &recid) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/xy.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/xy.go new file mode 100644 index 00000000..a6f9d6c8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/xy.go @@ -0,0 +1,244 @@ +package secp256k1go + +import ( + "errors" + "log" +) + +// XY is a point on the secp256k1 curve +type XY struct { + X, Y Field + Infinity bool +} + +func (xy *XY) String() string { + if xy.Infinity { + return "Infinity" + } + return xy.X.String() + "," + xy.Y.String() +} + +//edited + +/* + if (size == 33 && (pub[0] == 0x02 || pub[0] == 0x03)) { + secp256k1_fe_t x; + secp256k1_fe_set_b32(&x, pub+1); + return secp256k1_ge_set_xo(elem, &x, pub[0] == 0x03); + } else if (size == 65 && (pub[0] == 0x04 || pub[0] == 0x06 || pub[0] == 0x07)) { + secp256k1_fe_t x, y; + secp256k1_fe_set_b32(&x, pub+1); + secp256k1_fe_set_b32(&y, pub+33); + secp256k1_ge_set_xy(elem, &x, &y); + if ((pub[0] == 0x06 || pub[0] == 0x07) && secp256k1_fe_is_odd(&y) != (pub[0] == 0x07)) + return 0; + return secp256k1_ge_is_valid(elem); + } +*/ +//All compact keys appear to be valid by construction, but may fail +//is valid check + +// ParsePubkey parses a compressed pubkey to a point on the curve +func (xy *XY) ParsePubkey(pub []byte) error { + // ParsePubkey WARNING: for compact signatures, will succeed unconditionally + //however, elem.IsValid will fail + if len(pub) != 33 { + log.Panic("pubkey len must be 33 bytes") // do not permit invalid length inputs + return errors.New("pubkey len must be 33 bytes") + } + if len(pub) == 33 && (pub[0] == 0x02 || pub[0] == 0x03) { + xy.X.SetB32(pub[1:33]) + xy.SetXO(&xy.X, pub[0] == 0x03) + } else { + return errors.New("pubkey y-coordinate parity byte is invalid") // the leading bytes indicates if Y is odd or not + } + //THIS FAILS + //reenable later + //if !elem.IsValid() { + // return false + //} + + /* + else if len(pub) == 65 && (pub[0] == 0x04 || pub[0] == 0x06 || pub[0] == 0x07) { + elem.X.SetB32(pub[1:33]) + elem.Y.SetB32(pub[33:65]) + if (pub[0] == 0x06 || pub[0] == 0x07) && elem.Y.IsOdd() != (pub[0] == 0x07) { + return false + } + } + */ + return nil +} + +// Bytes returns the compressed public key (33 bytes) in the format +// "<0x03> " or <0x02> ". The leading byte is 0x03 if the Y point is odd. +func (xy XY) Bytes() []byte { + xy.X.Normalize() // See https://github.com/piotrnar/gocoin/issues/15 + + raw := make([]byte, 33) + if xy.Y.IsOdd() { + raw[0] = 0x03 + } else { + raw[0] = 0x02 + } + xy.X.GetB32(raw[1:]) + return raw +} + +// BytesUncompressed returns serialized key in uncompressed format "<04> " +//65 bytes +func (xy *XY) BytesUncompressed() (raw []byte) { + xy.X.Normalize() // See https://github.com/piotrnar/gocoin/issues/15 + xy.Y.Normalize() // See https://github.com/piotrnar/gocoin/issues/15 + + raw = make([]byte, 65) + raw[0] = 0x04 + xy.X.GetB32(raw[1:33]) + xy.Y.GetB32(raw[33:65]) + return +} + +// SetXY sets x y fields +func (xy *XY) SetXY(X, Y *Field) { + xy.Infinity = false + xy.X = *X + xy.Y = *Y +} + +/* +int static secp256k1_ecdsa_pubkey_parse(secp256k1_ge_t *elem, const unsigned char *pub, int size) { + if (size == 33 && (pub[0] == 0x02 || pub[0] == 0x03)) { + secp256k1_fe_t x; + secp256k1_fe_set_b32(&x, pub+1); + return secp256k1_ge_set_xo(elem, &x, pub[0] == 0x03); + } else if (size == 65 && (pub[0] == 0x04 || pub[0] == 0x06 || pub[0] == 0x07)) { + secp256k1_fe_t x, y; + secp256k1_fe_set_b32(&x, pub+1); + secp256k1_fe_set_b32(&y, pub+33); + secp256k1_ge_set_xy(elem, &x, &y); + if ((pub[0] == 0x06 || pub[0] == 0x07) && secp256k1_fe_is_odd(&y) != (pub[0] == 0x07)) + return 0; + return secp256k1_ge_is_valid(elem); + } else { + return 0; + } +} +*/ + +// if (size == 33 && (pub[0] == 0x02 || pub[0] == 0x03)) { +// secp256k1_fe_t x; +// secp256k1_fe_set_b32(&x, pub+1); +// return secp256k1_ge_set_xo(elem, &x, pub[0] == 0x03); + +// IsValid checks that the point is not infinity and is on the secp256k1 curve +func (xy *XY) IsValid() bool { + // Adopted from libsecp256k1: + // https://github.com/bitcoin-core/secp256k1/blob/2ebdad772af770b4587af0856de27c63de1b03be/src/group_impl.h#L292-L304 + /* + static int secp256k1_ge_is_valid_var(const secp256k1_ge *a) { + secp256k1_fe y2, x3, c; + if (a->infinity) { + return 0; + } + // y^2 = x^3 + 7 // + secp256k1_fe_sqr(&y2, &a->y); + secp256k1_fe_sqr(&x3, &a->x); secp256k1_fe_mul(&x3, &x3, &a->x); + secp256k1_fe_set_int(&c, CURVE_B); + secp256k1_fe_add(&x3, &c); + secp256k1_fe_normalize_weak(&x3); + return secp256k1_fe_equal_var(&y2, &x3); + } + */ + if xy.Infinity { + return false + } + var y2, x3, c Field + xy.Y.Sqr(&y2) + xy.X.Sqr(&x3) + x3.Mul(&x3, &xy.X) + c.SetInt(7) + x3.SetAdd(&c) + y2.Normalize() + x3.Normalize() + return y2.Equals(&x3) +} + +// SetXYZ sets X Y Z fields +func (xy *XY) SetXYZ(a *XYZ) { + var z2, z3 Field + a.Z.InvVar(&a.Z) + a.Z.Sqr(&z2) + a.Z.Mul(&z3, &z2) + a.X.Mul(&a.X, &z2) + a.Y.Mul(&a.Y, &z3) + a.Z.SetInt(1) + xy.Infinity = a.Infinity + xy.X = a.X + xy.Y = a.Y +} + +func (xy *XY) precomp(w int) []XY { //nolint:unused,megacheck + pre := make([]XY, (1 << (uint(w) - 2))) + pre[0] = *xy + var X, d, tmp XYZ + X.SetXY(xy) + X.Double(&d) + for i := 1; i < len(pre); i++ { + d.AddXY(&tmp, &pre[i-1]) + pre[i].SetXYZ(&tmp) + } + return pre +} + +// Neg caculates negate +func (xy *XY) Neg(r *XY) { + r.Infinity = xy.Infinity + r.X = xy.X + r.Y = xy.Y + r.Y.Normalize() + r.Y.Negate(&r.Y, 1) +} + +/* +int static secp256k1_ge_set_xo(secp256k1_ge_t *r, const secp256k1_fe_t *x, int odd) { + r->x = *x; + secp256k1_fe_t x2; secp256k1_fe_sqr(&x2, x); + secp256k1_fe_t x3; secp256k1_fe_mul(&x3, x, &x2); + r->infinity = 0; + secp256k1_fe_t c; secp256k1_fe_set_int(&c, 7); + secp256k1_fe_add(&c, &x3); + if (!secp256k1_fe_sqrt(&r->y, &c)) + return 0; + secp256k1_fe_normalize(&r->y); + if (secp256k1_fe_is_odd(&r->y) != odd) + secp256k1_fe_negate(&r->y, &r->y, 1); + return 1; +} +*/ + +// SetXO sets the X and Y field from an X value and flag indicating whether or +// not Y is odd. +func (xy *XY) SetXO(X *Field, odd bool) { + var c, x2, x3 Field + xy.X = *X + X.Sqr(&x2) + X.Mul(&x3, &x2) + xy.Infinity = false + c.SetInt(7) + c.SetAdd(&x3) + c.Sqrt(&xy.Y) //does not return, can fail + if xy.Y.IsOdd() != odd { + xy.Y.Negate(&xy.Y, 1) + } + + //r.X.Normalize() // See https://github.com/piotrnar/gocoin/issues/15 + xy.Y.Normalize() +} + +// AddXY adds xy +func (xy *XY) AddXY(a *XY) { + var xyz XYZ + xyz.SetXY(xy) + xyz.AddXY(&xyz, a) + xy.SetXYZ(&xyz) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/xyz.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/xyz.go new file mode 100644 index 00000000..88a0a1ce --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/xyz.go @@ -0,0 +1,378 @@ +package secp256k1go + +// XYZ contains xyz fields +type XYZ struct { + X, Y, Z Field + Infinity bool +} + +func (xyz XYZ) String() string { + if xyz.Infinity { + return "INFINITY" + } + return xyz.X.String() + "," + xyz.Y.String() + "," + xyz.Z.String() +} + +// SetXY sets xy +func (xyz *XYZ) SetXY(a *XY) { + xyz.Infinity = a.Infinity + xyz.X = a.X + xyz.Y = a.Y + xyz.Z.SetInt(1) +} + +// IsInfinity check if xyz is infinity +func (xyz *XYZ) IsInfinity() bool { + return xyz.Infinity +} + +// IsValid check if xyz is valid +func (xyz *XYZ) IsValid() bool { + if xyz.Infinity { + return false + } + var y2, x3, z2, z6 Field + xyz.Y.Sqr(&y2) + xyz.X.Sqr(&x3) + x3.Mul(&x3, &xyz.X) + xyz.Z.Sqr(&z2) + z2.Sqr(&z6) + z6.Mul(&z6, &z2) + z6.MulInt(7) + x3.SetAdd(&z6) + y2.Normalize() + x3.Normalize() + return y2.Equals(&x3) +} + +func (xyz *XYZ) getX(r *Field) { + var zi2 Field + xyz.Z.InvVar(&zi2) + zi2.Sqr(&zi2) + xyz.X.Mul(r, &zi2) +} + +// Normalize normalize all fields +func (xyz *XYZ) Normalize() { + xyz.X.Normalize() + xyz.Y.Normalize() + xyz.Z.Normalize() +} + +// Equals checks if equal +func (xyz *XYZ) Equals(b *XYZ) bool { + if xyz.Infinity != b.Infinity { + return false + } + // TODO: is the normalize really needed here? + xyz.Normalize() + b.Normalize() + return xyz.X.Equals(&b.X) && xyz.Y.Equals(&b.Y) && xyz.Z.Equals(&b.Z) +} + +func (xyz *XYZ) precomp(w int) (pre []XYZ) { //nolint:unparam + var d XYZ + pre = make([]XYZ, (1 << (uint(w) - 2))) + pre[0] = *xyz + pre[0].Double(&d) + for i := 1; i < len(pre); i++ { + d.Add(&pre[i], &pre[i-1]) + } + return +} + +func ecmultWnaf(wnaf []int, a *Number, w uint) (ret int) { + var zeroes uint + var X Number + X.Set(&a.Int) + + for X.Sign() != 0 { + for X.Bit(0) == 0 { + zeroes++ + X.rsh(1) + } + word := X.rshX(w) + for zeroes > 0 { + wnaf[ret] = 0 + ret++ + zeroes-- + } + if (word & (1 << (w - 1))) != 0 { + X.inc() + wnaf[ret] = (word - (1 << w)) + } else { + wnaf[ret] = word + } + zeroes = w - 1 + ret++ + } + return +} + +// ECmult r = na*a + ng*G +func (xyz *XYZ) ECmult(r *XYZ, na, ng *Number) { + var na1, naLam, ng1, ng128 Number + + // split na into na_1 and na_lam (where na = na_1 + na_lam*lambda, and na_1 and na_lam are ~128 bit) + na.splitExp(&na1, &naLam) + + // split ng into ng_1 and ng_128 (where gn = gn_1 + gn_128*2^128, and gn_1 and gn_128 are ~128 bit) + ng.split(&ng1, &ng128, 128) + + // build wnaf representation for na_1, na_lam, ng_1, ng_128 + var wnafNa1, wnafNaLam, wnafNg1, wnafNg128 [129]int + bitsNa1 := ecmultWnaf(wnafNa1[:], &na1, winA) + bitsNaLam := ecmultWnaf(wnafNaLam[:], &naLam, winA) + bitsNg1 := ecmultWnaf(wnafNg1[:], &ng1, winG) + bitsNg128 := ecmultWnaf(wnafNg128[:], &ng128, winG) + + // calculate a_lam = a*lambda + var aLam XYZ + xyz.mulLambda(&aLam) + + // calculate odd multiples of a and a_lam + preA1 := xyz.precomp(winA) + preALam := aLam.precomp(winA) + + bits := bitsNa1 + if bitsNaLam > bits { + bits = bitsNaLam + } + if bitsNg1 > bits { + bits = bitsNg1 + } + if bitsNg128 > bits { + bits = bitsNg128 + } + + r.Infinity = true + + var tmpj XYZ + var tmpa XY + var n int + + for i := bits - 1; i >= 0; i-- { + r.Double(r) + + if i < bitsNa1 { + n = wnafNa1[i] + if n > 0 { + r.Add(r, &preA1[((n)-1)/2]) + } else if n != 0 { + preA1[(-(n)-1)/2].Neg(&tmpj) + r.Add(r, &tmpj) + } + } + + if i < bitsNaLam { + n = wnafNaLam[i] + if n > 0 { + r.Add(r, &preALam[((n)-1)/2]) + } else if n != 0 { + preALam[(-(n)-1)/2].Neg(&tmpj) + r.Add(r, &tmpj) + } + } + + if i < bitsNg1 { + n = wnafNg1[i] + if n > 0 { + r.AddXY(r, &preG[((n)-1)/2]) + } else if n != 0 { + preG[(-(n)-1)/2].Neg(&tmpa) + r.AddXY(r, &tmpa) + } + } + + if i < bitsNg128 { + n = wnafNg128[i] + if n > 0 { + r.AddXY(r, &preG128[((n)-1)/2]) + } else if n != 0 { + preG128[(-(n)-1)/2].Neg(&tmpa) + r.AddXY(r, &tmpa) + } + } + } +} + +// Neg caculate neg +func (xyz *XYZ) Neg(r *XYZ) { + r.Infinity = xyz.Infinity + r.X = xyz.X + r.Y = xyz.Y + r.Z = xyz.Z + r.Y.Normalize() + r.Y.Negate(&r.Y, 1) +} + +func (xyz *XYZ) mulLambda(r *XYZ) { + *r = *xyz + r.X.Mul(&r.X, &TheCurve.beta) +} + +// Double cacule double +func (xyz *XYZ) Double(r *XYZ) { + var t1, t2, t3, t4, t5 Field + + t5 = xyz.Y + t5.Normalize() + if xyz.Infinity || t5.IsZero() { + r.Infinity = true + return + } + + t5.Mul(&r.Z, &xyz.Z) + r.Z.MulInt(2) + xyz.X.Sqr(&t1) + t1.MulInt(3) + t1.Sqr(&t2) + t5.Sqr(&t3) + t3.MulInt(2) + t3.Sqr(&t4) + t4.MulInt(2) + xyz.X.Mul(&t3, &t3) + r.X = t3 + r.X.MulInt(4) + r.X.Negate(&r.X, 4) + r.X.SetAdd(&t2) + t2.Negate(&t2, 1) + t3.MulInt(6) + t3.SetAdd(&t2) + t1.Mul(&r.Y, &t3) + t4.Negate(&t2, 2) + r.Y.SetAdd(&t2) + r.Infinity = false +} + +// AddXY adds XY +func (xyz *XYZ) AddXY(r *XYZ, b *XY) { + if xyz.Infinity { + r.Infinity = b.Infinity + r.X = b.X + r.Y = b.Y + r.Z.SetInt(1) + return + } + if b.Infinity { + *r = *xyz + return + } + r.Infinity = false + var z12, u1, u2, s1, s2 Field + xyz.Z.Sqr(&z12) + u1 = xyz.X + u1.Normalize() + b.X.Mul(&u2, &z12) + s1 = xyz.Y + s1.Normalize() + b.Y.Mul(&s2, &z12) + s2.Mul(&s2, &xyz.Z) + u1.Normalize() + u2.Normalize() + + if u1.Equals(&u2) { + s1.Normalize() + s2.Normalize() + if s1.Equals(&s2) { + xyz.Double(r) + } else { + r.Infinity = true + } + return + } + + var h, i, i2, h2, h3, t Field + u1.Negate(&h, 1) + h.SetAdd(&u2) + s1.Negate(&i, 1) + i.SetAdd(&s2) + i.Sqr(&i2) + h.Sqr(&h2) + h.Mul(&h3, &h2) + r.Z = xyz.Z + r.Z.Mul(&r.Z, &h) + u1.Mul(&t, &h2) + r.X = t + r.X.MulInt(2) + r.X.SetAdd(&h3) + r.X.Negate(&r.X, 3) + r.X.SetAdd(&i2) + r.X.Negate(&r.Y, 5) + r.Y.SetAdd(&t) + r.Y.Mul(&r.Y, &i) + h3.Mul(&h3, &s1) + h3.Negate(&h3, 1) + r.Y.SetAdd(&h3) +} + +// Add adds value +func (xyz *XYZ) Add(r, b *XYZ) { + if xyz.Infinity { + *r = *b + return + } + if b.Infinity { + *r = *xyz + return + } + r.Infinity = false + var z22, z12, u1, u2, s1, s2 Field + + b.Z.Sqr(&z22) + xyz.Z.Sqr(&z12) + xyz.X.Mul(&u1, &z22) + b.X.Mul(&u2, &z12) + xyz.Y.Mul(&s1, &z22) + s1.Mul(&s1, &b.Z) + b.Y.Mul(&s2, &z12) + s2.Mul(&s2, &xyz.Z) + u1.Normalize() + u2.Normalize() + if u1.Equals(&u2) { + s1.Normalize() + s2.Normalize() + if s1.Equals(&s2) { + xyz.Double(r) + } else { + r.Infinity = true + } + return + } + var h, i, i2, h2, h3, t Field + + u1.Negate(&h, 1) + h.SetAdd(&u2) + s1.Negate(&i, 1) + i.SetAdd(&s2) + i.Sqr(&i2) + h.Sqr(&h2) + h.Mul(&h3, &h2) + xyz.Z.Mul(&r.Z, &b.Z) + r.Z.Mul(&r.Z, &h) + u1.Mul(&t, &h2) + r.X = t + r.X.MulInt(2) + r.X.SetAdd(&h3) + r.X.Negate(&r.X, 3) + r.X.SetAdd(&i2) + r.X.Negate(&r.Y, 5) + r.Y.SetAdd(&t) + r.Y.Mul(&r.Y, &i) + h3.Mul(&h3, &s1) + h3.Negate(&h3, 1) + r.Y.SetAdd(&h3) +} + +// ECmultGen r = a*G +func ECmultGen(a Number) XYZ { + var n Number + var r XYZ + n.Set(&a.Int) + r.SetXY(&prec[0][n.rshX(4)]) + for j := 1; j < 64; j++ { + r.AddXY(&r, &prec[j][n.rshX(4)]) + } + r.AddXY(&r, &fin) + return r +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/xyz_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/xyz_test.go new file mode 100644 index 00000000..0be6affb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/xyz_test.go @@ -0,0 +1,49 @@ +package secp256k1go + +import ( + "testing" +) + +func TestGejDouble(t *testing.T) { + var a, aExp, r XYZ + a.X.SetHex("79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798") + a.Y.SetHex("483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8") + a.Z.SetHex("01") + aExp.X.SetHex("7D152C041EA8E1DC2191843D1FA9DB55B68F88FEF695E2C791D40444B365AFC2") + aExp.Y.SetHex("56915849F52CC8F76F5FD7E4BF60DB4A43BF633E1B1383F85FE89164BFADCBDB") + aExp.Z.SetHex("9075B4EE4D4788CABB49F7F81C221151FA2F68914D0AA833388FA11FF621A970") + + a.Double(&r) + if !r.Equals(&aExp) { + t.Error("gej.Double failed") + } +} + +func TestGejMulLambda(t *testing.T) { + var a, aExp XYZ + a.X.SetHex("0eaebcd1df2df853d66ce0e1b0fda07f67d1cabefde98514aad795b86a6ea66d") + a.Y.SetHex("beb26b67d7a00e2447baeccc8a4cef7cd3cad67376ac1c5785aeebb4f6441c16") + a.Z.SetHex("01") + aExp.X.SetHex("a45720c272cfa1f77f64be8a404a7d3149bd5410f9a173353f6eb75a5085ba98") + aExp.Y.SetHex("beb26b67d7a00e2447baeccc8a4cef7cd3cad67376ac1c5785aeebb4f6441c16") + aExp.Z.SetHex("01") + aLam := a + aLam.mulLambda(&aLam) + if !aLam.Equals(&aExp) { + t.Error("mul_lambda failed") + } +} + +func TestGejGetX(t *testing.T) { + var a XYZ + var X, exp Field + a.X.SetHex("EB6752420B6BDB40A760AC26ADD7E7BBD080BF1DF6C0B009A0D310E4511BDF49") + a.Y.SetHex("8E8CEB84E1502FC536FFE67967BC44314270A0B38C79865FFED5A85D138DCA6B") + a.Z.SetHex("813925AF112AAB8243F8CCBADE4CC7F63DF387263028DE6E679232A73A7F3C31") + + exp.SetHex("fe00e013c244062847045ae7eb73b03fca583e9aa5dbd030a8fd1c6dfcf11b10") + a.getX(&X) + if !X.Equals(&exp) { + t.Error("get.get_x() fail") + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/z_consts.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/z_consts.go new file mode 100644 index 00000000..4b6c0f76 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/z_consts.go @@ -0,0 +1,9356 @@ +package secp256k1go + +var fin = XY{X: Field{[10]uint32{0x035871aa, 0x002dc101, 0x0059ab0f, 0x02cb297e, 0x00684bb5, 0x02585764, 0x02f3cceb, 0x002bdca3, 0x03dcb7cc, 0x0013cd56}}, Y: Field{[10]uint32{0x044d069d, 0x0603c088, 0x07541d4e, 0x04a4074d, 0x045fcba8, 0x05f00c34, 0x04bab268, 0x05fd8d65, 0x04e47151, 0x0071e924}}} + +var preG = []XY{ + {X: Field{[10]uint32{0x02f81798, 0x00a056c5, 0x028d959f, 0x036cb738, 0x03029bfc, 0x03a1c2c1, 0x0206295c, 0x02eeb156, 0x027ef9dc, 0x001e6f99}}, Y: Field{[10]uint32{0x0310d4b8, 0x01f423fe, 0x014199c4, 0x01229a15, 0x00fd17b4, 0x0384422a, 0x024fbfc0, 0x03119576, 0x027726a3, 0x00120eb6}}}, + {X: Field{[10]uint32{0x00e036f9, 0x007c44ef, 0x019b0860, 0x01160dbe, 0x01b531c8, 0x0227548a, 0x0344f85f, 0x030c4124, 0x02019258, 0x003e4c22}}, Y: Field{[10]uint32{0x00b8e672, 0x027f5d61, 0x0231b6cb, 0x0264d308, 0x026500a9, 0x028dfcd5, 0x02337e62, 0x03a0503f, 0x030f632d, 0x000e23de}}}, + {X: Field{[10]uint32{0x0240efe4, 0x02355a6c, 0x01ab7cba, 0x02f77186, 0x00e88b84, 0x0297144a, 0x034a7250, 0x00824d56, 0x024d1a07, 0x000be2f7}}, Y: Field{[10]uint32{0x02ac62d6, 0x021f4ea9, 0x02840dca, 0x006eac35, 0x02f78827, 0x01b27109, 0x01ba9dda, 0x038f5b53, 0x022636e5, 0x00362b08}}}, + {X: Field{[10]uint32{0x02c4f9bc, 0x02f77b72, 0x0239ce92, 0x01f80cc3, 0x023d419b, 0x00ba9e83, 0x018f365f, 0x02d3aa8e, 0x00646e5d, 0x00172f7c}}, Y: Field{[10]uint32{0x007264da, 0x02098a02, 0x027b5a50, 0x02e04ff7, 0x03a813d0, 0x01869536, 0x0178d6d8, 0x0165828c, 0x0240ba25, 0x001abaf2}}}, + {X: Field{[10]uint32{0x0027ccbe, 0x03c4437f, 0x02714c35, 0x025d315f, 0x01e09796, 0x03d566af, 0x02d178a9, 0x03d94c26, 0x00e2f0c7, 0x002b3521}}, Y: Field{[10]uint32{0x024f9c37, 0x03098ab1, 0x00e0f05c, 0x0290dd7e, 0x01add888, 0x018ed87a, 0x03809717, 0x0367f590, 0x0121b0a7, 0x00330ce2}}}, + {X: Field{[10]uint32{0x01a008cb, 0x0305e257, 0x03891bbe, 0x002f9705, 0x00564998, 0x003196ab, 0x034246b7, 0x0104797b, 0x03f858a9, 0x001dd2b9}}, Y: Field{[10]uint32{0x0153c61b, 0x035d3272, 0x016a8301, 0x038b7fe7, 0x01372db1, 0x01edecd9, 0x003dd56d, 0x01786409, 0x0032eb6b, 0x00366128}}}, + {X: Field{[10]uint32{0x01405aa8, 0x0377e3c6, 0x018cddee, 0x03198439, 0x01b075fb, 0x00dd2194, 0x011d205c, 0x00a22f1f, 0x03c2d975, 0x003ca1dc}}, Y: Field{[10]uint32{0x0303ed81, 0x0172d4b6, 0x0291f29b, 0x0369487e, 0x033a1a06, 0x01736bd1, 0x00212eb6, 0x002a25d6, 0x002e8d88, 0x0002ac24}}}, + {X: Field{[10]uint32{0x027e080e, 0x036f3e38, 0x0379e44a, 0x01bcf217, 0x0131e594, 0x0257fd04, 0x0065ae30, 0x03aa5969, 0x014f7d43, 0x0035e493}}, Y: Field{[10]uint32{0x02a26b58, 0x013727fd, 0x013a5c50, 0x00af625b, 0x03ea40af, 0x02331b7b, 0x0042ec22, 0x01ca9a0e, 0x0072a86c, 0x0016078a}}}, + {X: Field{[10]uint32{0x022d4a34, 0x013ea812, 0x0368766e, 0x02b9e6e5, 0x01eb9898, 0x01fab3c8, 0x020fee80, 0x01dd4290, 0x024cdb67, 0x0037bf7a}}, Y: Field{[10]uint32{0x0256eb77, 0x00667da7, 0x000f6cfb, 0x02812a57, 0x02ced1f4, 0x00aa4f6b, 0x017b0ead, 0x0145a3a6, 0x03069463, 0x0010846a}}}, + {X: Field{[10]uint32{0x00385b6c, 0x0159584e, 0x02d27747, 0x03af5fa1, 0x01f06acf, 0x0113d25e, 0x02f5cff4, 0x010f4a4f, 0x00a797a4, 0x000ad3a8}}, Y: Field{[10]uint32{0x01c09b7a, 0x00321539, 0x01763b57, 0x0031409a, 0x031a01f6, 0x02872184, 0x003083b5, 0x01764ecd, 0x03c03794, 0x00217a26}}}, + {X: Field{[10]uint32{0x01be59d5, 0x0102bbc9, 0x01071813, 0x0009c7e0, 0x001d9ad4, 0x0338cccc, 0x013fa332, 0x0049593e, 0x034a4cdd, 0x000d4aef}}, Y: Field{[10]uint32{0x0381998c, 0x034f62f3, 0x0039c67b, 0x00b9c6c4, 0x034a1b3b, 0x03768f87, 0x01c18259, 0x03d4d356, 0x00075348, 0x000c87ad}}}, + {X: Field{[10]uint32{0x02cacc3f, 0x0336b753, 0x03f29dc9, 0x037fbfd7, 0x00e42ab8, 0x0261e449, 0x03001055, 0x03446c08, 0x004d6b38, 0x000be884}}, Y: Field{[10]uint32{0x032b7d67, 0x02e9dad4, 0x02648423, 0x03b3f220, 0x00181d70, 0x02f57760, 0x00569335, 0x036196d9, 0x0068295d, 0x0000b784}}}, + {X: Field{[10]uint32{0x01453714, 0x028335fd, 0x032e269c, 0x02138255, 0x03263c3d, 0x01bb76a0, 0x021a9b06, 0x035a36ac, 0x039b09b4, 0x00249209}}, Y: Field{[10]uint32{0x03cb3402, 0x028cb3a5, 0x012ffe54, 0x00aa21e4, 0x033fc0de, 0x03a8ac7f, 0x01aa71bd, 0x02ab7974, 0x037bf234, 0x001cc05b}}}, + {X: Field{[10]uint32{0x01ee8729, 0x025b510f, 0x015c07e9, 0x00512fd8, 0x022f570e, 0x002fadd4, 0x030132fb, 0x02fc9e39, 0x032be3a8, 0x0036bb53}}, Y: Field{[10]uint32{0x00be1c55, 0x003948a4, 0x02726ab4, 0x00c3cebe, 0x003f83c2, 0x03be35c0, 0x021aca87, 0x0263a352, 0x024a7d6c, 0x0029a773}}}, + {X: Field{[10]uint32{0x0122e7db, 0x00ed7a1f, 0x001b0e6a, 0x03a7f7ca, 0x0011ecd9, 0x02ec67e4, 0x00f28d7c, 0x0204ba2b, 0x02c7065d, 0x00311344}}, Y: Field{[10]uint32{0x020e6482, 0x02418fc3, 0x021c5a03, 0x02187b7d, 0x000e106e, 0x0260bf6b, 0x0045926c, 0x01b371db, 0x0060ce32, 0x00084669}}}, + {X: Field{[10]uint32{0x0269e6b4, 0x031972f4, 0x00063b61, 0x014cdb0a, 0x03152b69, 0x03b58214, 0x01a20cfd, 0x02141322, 0x03f6dc69, 0x001a8916}}, Y: Field{[10]uint32{0x000d8a82, 0x0398d204, 0x03b6efd5, 0x01234108, 0x018b33ba, 0x005a892b, 0x03f5126f, 0x0129c22c, 0x0342c2bd, 0x003808b3}}}, + {X: Field{[10]uint32{0x010bd6a5, 0x02b95fc3, 0x01146f95, 0x002c2fb0, 0x00ce1330, 0x03950421, 0x037e3d2f, 0x03989f01, 0x03a6fd9d, 0x0005a5ff}}, Y: Field{[10]uint32{0x001b2396, 0x03a758f4, 0x00ae7ade, 0x00027926, 0x03a2cf15, 0x01155d0c, 0x0161506e, 0x01bd749d, 0x00f18680, 0x002e70e6}}}, + {X: Field{[10]uint32{0x027a7479, 0x008d17bc, 0x0361df98, 0x0183fedf, 0x019deb83, 0x020d32c3, 0x02d0f07e, 0x01c62e61, 0x03019981, 0x001816f6}}, Y: Field{[10]uint32{0x016b8c49, 0x00787a41, 0x00db43b0, 0x03a13ec5, 0x03c26bfa, 0x0325bf88, 0x0278d93e, 0x03481a06, 0x012de4f8, 0x0000a5cb}}}, + {X: Field{[10]uint32{0x007ff33d, 0x0071fa76, 0x0310cfe3, 0x00d52566, 0x00dcb01c, 0x02885784, 0x002fdc45, 0x02fd25d0, 0x01ab4150, 0x0018b453}}, Y: Field{[10]uint32{0x03b25eaf, 0x01590920, 0x0072235f, 0x00a59ead, 0x0301aa13, 0x003bb436, 0x0088a195, 0x02c04260, 0x02bd8cc5, 0x00203f01}}}, + {X: Field{[10]uint32{0x02308b6f, 0x01570be1, 0x00b425e5, 0x03d5ae6e, 0x032c50e9, 0x0102395a, 0x01b4b06c, 0x009f6b79, 0x02d0040f, 0x00203182}}, Y: Field{[10]uint32{0x030bd57a, 0x0007d590, 0x024eb1aa, 0x0132f9c0, 0x00a65eed, 0x03f9cbdc, 0x0266bad7, 0x030c3c9b, 0x003f1cc5, 0x00070e0c}}}, + {X: Field{[10]uint32{0x0203c8fb, 0x03aaec3e, 0x007049d5, 0x02521f61, 0x004cc5dc, 0x0331534d, 0x034c6348, 0x02b552a9, 0x01ad6167, 0x001ea4dd}}, Y: Field{[10]uint32{0x024dc7f7, 0x01267b08, 0x00e2b02d, 0x028431c3, 0x02bdc59e, 0x0249a411, 0x0159e0d7, 0x01c9a425, 0x03a9eca8, 0x0003438f}}}, + {X: Field{[10]uint32{0x03c3ffc9, 0x0147d166, 0x01f504bb, 0x030e6da3, 0x01bb408e, 0x01511e9e, 0x03a9ed04, 0x02d53241, 0x00d9b696, 0x00354a3b}}, Y: Field{[10]uint32{0x01409933, 0x01196d48, 0x00dbc063, 0x01017148, 0x02bc4345, 0x007f595b, 0x026f2188, 0x0397e665, 0x01253136, 0x003bb3d0}}}, + {X: Field{[10]uint32{0x00b45963, 0x00c6023e, 0x00b13872, 0x017929fb, 0x00526611, 0x023b36b4, 0x025f514e, 0x00d04ba8, 0x00a4b5f4, 0x000124dc}}, Y: Field{[10]uint32{0x02949c9a, 0x00c14a84, 0x02764b65, 0x02beed6d, 0x0254c3f3, 0x004bf58a, 0x03081b05, 0x03b50a2c, 0x0341afd6, 0x001d63cf}}}, + {X: Field{[10]uint32{0x00345d74, 0x004fac7f, 0x018e2f1c, 0x00783852, 0x03881d81, 0x0191c0bb, 0x03df930d, 0x0232ef5c, 0x00936ee8, 0x001dfc8c}}, Y: Field{[10]uint32{0x031c60d6, 0x03acf1d9, 0x037cbbe8, 0x00c365c1, 0x0096c953, 0x02e86cde, 0x008266e9, 0x02d90028, 0x002a7886, 0x002563bd}}}, + {X: Field{[10]uint32{0x0339f530, 0x0214c6dd, 0x00dbaeb2, 0x01d2ae75, 0x0258c800, 0x031f02f3, 0x004887e5, 0x0392e7a9, 0x0191cc4c, 0x003cb6b2}}, Y: Field{[10]uint32{0x003a3c37, 0x005f6e9c, 0x024fd1a1, 0x03ac1663, 0x039eb5fb, 0x03094c77, 0x021f32de, 0x0236b536, 0x009b3b2f, 0x003837b7}}}, + {X: Field{[10]uint32{0x0290d45b, 0x02921431, 0x023debcb, 0x037f276b, 0x025a216c, 0x03894804, 0x00be8fbb, 0x0087ec6d, 0x019f6626, 0x00118ecf}}, Y: Field{[10]uint32{0x02f7307e, 0x00ddec06, 0x01de31cb, 0x01f25c28, 0x03c622e2, 0x036188b5, 0x0114306d, 0x01b0d50c, 0x00d78c29, 0x0017b50c}}}, + {X: Field{[10]uint32{0x0198f247, 0x0125ad26, 0x022d1a32, 0x03050ca2, 0x036b98fa, 0x03ced665, 0x0232d4af, 0x01b8a824, 0x004244e4, 0x003c5be0}}, Y: Field{[10]uint32{0x00e31df6, 0x01e658b1, 0x00e26d65, 0x0309b973, 0x012a6c53, 0x03d38cf6, 0x01206fcd, 0x00fdf84f, 0x019b8220, 0x0033b6af}}}, + {X: Field{[10]uint32{0x011d41d1, 0x03857dc5, 0x03c65369, 0x0056b389, 0x015d2453, 0x010c46bd, 0x0352b7a1, 0x01158ec0, 0x00272dc8, 0x0032bdd5}}, Y: Field{[10]uint32{0x00a04476, 0x03e420c6, 0x032a5c32, 0x02de5888, 0x035f4fa9, 0x01791815, 0x01b643fa, 0x03d7ca90, 0x0260ef35, 0x0032d1d1}}}, + {X: Field{[10]uint32{0x03082120, 0x025ef21b, 0x017c1244, 0x001f2e1b, 0x0344a09c, 0x0265e762, 0x01d0f170, 0x02e61be1, 0x024b282c, 0x00098032}}, Y: Field{[10]uint32{0x027e4b40, 0x02fa51d6, 0x00ef44b0, 0x01d2ad7c, 0x015ac6be, 0x0376ed17, 0x013b03fc, 0x016f5a9a, 0x008753c1, 0x0010466e}}}, + {X: Field{[10]uint32{0x0198e435, 0x00a9dd1a, 0x03dc8c60, 0x0217893d, 0x0001c486, 0x0048882f, 0x00ec53cd, 0x010cb0ce, 0x0272d7e8, 0x001d8d72}}, Y: Field{[10]uint32{0x005b9c61, 0x01dbcc0b, 0x008bad9e, 0x018755c1, 0x034ecfc0, 0x03de39b5, 0x01d5e590, 0x027584f4, 0x00960948, 0x000246d9}}}, + {X: Field{[10]uint32{0x0356cc18, 0x0141d0ef, 0x028fbc1a, 0x00d1e751, 0x02b7f2b3, 0x03bba299, 0x03f4a87d, 0x015c336e, 0x0239f325, 0x001d538c}}, Y: Field{[10]uint32{0x00536683, 0x0366024f, 0x0295d0c5, 0x034065e9, 0x0023ee33, 0x013a9268, 0x00d0ed30, 0x028c3ecf, 0x0386e5bd, 0x00019cfe}}}, + {X: Field{[10]uint32{0x01d9b9e8, 0x009a51a4, 0x0152f9fe, 0x01987472, 0x00330800, 0x00b55c3c, 0x017859c8, 0x03a5abfd, 0x011071a1, 0x0038f9af}}, Y: Field{[10]uint32{0x020e37f5, 0x000abd24, 0x00c41670, 0x00e64fa4, 0x02a5a228, 0x01e68f2d, 0x000aa583, 0x039dbd03, 0x00bba394, 0x00167278}}}, + {X: Field{[10]uint32{0x004aa6eb, 0x011ff73c, 0x01f4b4cc, 0x03ccae8d, 0x01c4ccb1, 0x03dcca61, 0x02e73d88, 0x000ce09a, 0x003d056a, 0x00061ad2}}, Y: Field{[10]uint32{0x0280888b, 0x01e5fe1b, 0x038b4a4a, 0x02422544, 0x0321fb80, 0x0010602a, 0x017446e2, 0x03ddf8b8, 0x0132c67c, 0x000ee54b}}}, + {X: Field{[10]uint32{0x00e0963f, 0x00c85c93, 0x019c91a8, 0x034adcdf, 0x025442e6, 0x012f93dc, 0x0098561f, 0x01b39513, 0x00a6b987, 0x0037e75c}}, Y: Field{[10]uint32{0x02ba2417, 0x0231173c, 0x01da217b, 0x009c83be, 0x02b15722, 0x0370e752, 0x0062b785, 0x01b3357e, 0x01afd84d, 0x00157acb}}}, + {X: Field{[10]uint32{0x00ce7143, 0x019317cd, 0x018995de, 0x013e127b, 0x00ab5255, 0x0177383e, 0x03ca815d, 0x03a1e925, 0x00c23c51, 0x0017b757}}, Y: Field{[10]uint32{0x0399a868, 0x01c1aadc, 0x02905cdc, 0x030345e8, 0x00c13c66, 0x003226b4, 0x028cec03, 0x004c1987, 0x008dbc14, 0x003beba7}}}, + {X: Field{[10]uint32{0x00614fba, 0x034d8be1, 0x0317a722, 0x02870d56, 0x037aa3fb, 0x021fa79d, 0x012fe022, 0x01a0c368, 0x00c2b647, 0x000a41e6}}, Y: Field{[10]uint32{0x01943e7a, 0x000ebf50, 0x023146d0, 0x02536ca8, 0x015b29c0, 0x01e6bc97, 0x00d00bcf, 0x00188662, 0x036dcd44, 0x0038e369}}}, + {X: Field{[10]uint32{0x00053b45, 0x03f7b3bd, 0x0257362d, 0x00bf8d80, 0x01cd2955, 0x00542b0e, 0x00754efa, 0x03d6cc15, 0x023a95d9, 0x002bcf10}}, Y: Field{[10]uint32{0x018fd9c6, 0x03fb7b52, 0x01581bc2, 0x02999e85, 0x00c8cd5a, 0x00d73ed0, 0x013b0e6f, 0x00add26a, 0x03d831eb, 0x003e628f}}}, + {X: Field{[10]uint32{0x0084249a, 0x03fb5436, 0x018df8d2, 0x02c9b73e, 0x0106bb66, 0x026fc9d2, 0x00aa28c9, 0x039d1733, 0x0324d134, 0x001d9b6e}}, Y: Field{[10]uint32{0x03ac5996, 0x0093e5f2, 0x00edd2c9, 0x0197e81b, 0x0097584a, 0x00368e2e, 0x00c88798, 0x03978e37, 0x0152eacb, 0x001d12c4}}}, + {X: Field{[10]uint32{0x011abe3e, 0x00b99986, 0x02a58ce9, 0x013db165, 0x0245f7b4, 0x01e13d05, 0x01277c33, 0x01d66e88, 0x006f8c94, 0x001676fd}}, Y: Field{[10]uint32{0x02307f6e, 0x03885b12, 0x0398cd85, 0x0269e465, 0x0042ce73, 0x0120c268, 0x00ea6ce6, 0x02f0c03d, 0x0144175f, 0x00314d2b}}}, + {X: Field{[10]uint32{0x00fd87b8, 0x03718063, 0x0273cb62, 0x01c46a57, 0x00dd647e, 0x013a692a, 0x01e691e7, 0x0114dcc1, 0x0295103c, 0x003c4eb6}}, Y: Field{[10]uint32{0x02f5733d, 0x021066f6, 0x00257077, 0x0069a9d7, 0x026949e2, 0x020d07cc, 0x03f4bc80, 0x0137998e, 0x03b44ee1, 0x00384e05}}}, + {X: Field{[10]uint32{0x0288522c, 0x01540056, 0x01fb6488, 0x0301baeb, 0x00da1869, 0x01673293, 0x00167a2c, 0x033b41b5, 0x00fa0e8a, 0x001dd52d}}, Y: Field{[10]uint32{0x001163a2, 0x0122d5e1, 0x03cc537a, 0x00d42db2, 0x028d1e4e, 0x00082e3e, 0x00b967c3, 0x02760889, 0x02864e66, 0x000c3a4f}}}, + {X: Field{[10]uint32{0x02262519, 0x00a32678, 0x001d2a68, 0x02577a01, 0x0301858f, 0x02afbe75, 0x03874d46, 0x038122a8, 0x02df5990, 0x00252372}}, Y: Field{[10]uint32{0x0347d57e, 0x028b2b94, 0x031d2cbb, 0x03bef4bb, 0x01df9154, 0x012c6f09, 0x0128a322, 0x03965f57, 0x002537f6, 0x00392469}}}, + {X: Field{[10]uint32{0x017c77ab, 0x00a2a28f, 0x03a15703, 0x03d6b02f, 0x03fb224c, 0x0080bb0d, 0x007b48f8, 0x01b05a27, 0x014450c7, 0x001e5890}}, Y: Field{[10]uint32{0x01b83437, 0x03e96ca7, 0x02c5760a, 0x00147c12, 0x0312507a, 0x00fbdbda, 0x01c1fc13, 0x02d1d835, 0x010ec4ff, 0x000402d8}}}, + {X: Field{[10]uint32{0x03ec47ca, 0x0342144d, 0x0047bb0d, 0x01c896e2, 0x005a1697, 0x01364552, 0x01b16064, 0x012d52c5, 0x00783496, 0x000d4502}}, Y: Field{[10]uint32{0x02293311, 0x03456837, 0x0378b7e7, 0x01f05708, 0x006039e7, 0x03a049ff, 0x01652c48, 0x00151238, 0x03b20562, 0x003bc2be}}}, + {X: Field{[10]uint32{0x03527eaf, 0x010f4fde, 0x007b4429, 0x03ae37de, 0x0193e947, 0x0362f152, 0x01ce2c9d, 0x00f92f1e, 0x00ad6b48, 0x0034f30c}}, Y: Field{[10]uint32{0x02ede0a4, 0x00d36c13, 0x00630afb, 0x018a40d6, 0x023c2ad4, 0x03e5422b, 0x005e9be8, 0x009e3627, 0x0222d827, 0x0022cde2}}}, + {X: Field{[10]uint32{0x00847610, 0x016e83fd, 0x03649397, 0x00f6e44f, 0x032b2982, 0x03fbf822, 0x01c78fcb, 0x00a18338, 0x00478073, 0x00058936}}, Y: Field{[10]uint32{0x00078575, 0x01b8a901, 0x024c8cc0, 0x03d4a0af, 0x02896878, 0x03367532, 0x014448c6, 0x0240f824, 0x00f9b6da, 0x001a1947}}}, + {X: Field{[10]uint32{0x03c61cd4, 0x01ed3f57, 0x007da6df, 0x012d6bc8, 0x00519247, 0x00f98aa6, 0x002c9563, 0x02a289a4, 0x000da955, 0x001ccf3a}}, Y: Field{[10]uint32{0x01c5ea1d, 0x019cef07, 0x00578c54, 0x03808079, 0x023e1ef8, 0x036e7f33, 0x01a4d8b8, 0x037df521, 0x022bd2ba, 0x003d50d6}}}, + {X: Field{[10]uint32{0x001c045c, 0x01637eae, 0x02699ef2, 0x002485c7, 0x038966c5, 0x02f4ed27, 0x01a1c33b, 0x0141933c, 0x00125494, 0x00057651}}, Y: Field{[10]uint32{0x03e4070d, 0x01eefa7b, 0x00685fc3, 0x02eb3aff, 0x03434800, 0x00ee105d, 0x035137b7, 0x00f9c8d3, 0x030b6946, 0x00355bac}}}, + {X: Field{[10]uint32{0x00717940, 0x00e16674, 0x00aaaac1, 0x01f274ae, 0x031c2141, 0x0339c349, 0x012136e5, 0x0399d6d8, 0x00f2ec9d, 0x0028743f}}, Y: Field{[10]uint32{0x0197a629, 0x004b4e70, 0x033d5192, 0x029501c3, 0x02641462, 0x002599fc, 0x02907373, 0x028f2acb, 0x0350bcb5, 0x003b75df}}}, + {X: Field{[10]uint32{0x00b36980, 0x028dccc7, 0x01c06c7c, 0x037ba091, 0x01a790ba, 0x03e136fa, 0x000c0735, 0x0233315e, 0x0215c0af, 0x00388bef}}, Y: Field{[10]uint32{0x0131da06, 0x0341b5df, 0x0399be43, 0x00552591, 0x03a38289, 0x03d4e869, 0x03430a69, 0x03583222, 0x03abad5c, 0x0002a156}}}, + {X: Field{[10]uint32{0x02cfa9b3, 0x02514891, 0x02aa7400, 0x00e51c13, 0x0369635e, 0x004557d7, 0x0213473c, 0x03a3883b, 0x01dd9860, 0x000c4424}}, Y: Field{[10]uint32{0x006d8374, 0x003c2c4a, 0x02685bd8, 0x02993fbb, 0x00871ec5, 0x02301a0c, 0x011f0478, 0x03c13fff, 0x016f87d1, 0x0019b6d9}}}, + {X: Field{[10]uint32{0x02c2dbdf, 0x01f508cb, 0x00078186, 0x02d16a4d, 0x00883928, 0x00f9ab09, 0x01c0442d, 0x02fa26cc, 0x0104d301, 0x000d307f}}, Y: Field{[10]uint32{0x0273abee, 0x008615ee, 0x0043dc53, 0x03bad21d, 0x02d57f1c, 0x0005d04d, 0x03d46f73, 0x006d6552, 0x0285e97b, 0x00025051}}}, + {X: Field{[10]uint32{0x009b8d63, 0x02979ac1, 0x00affcc2, 0x02aef342, 0x028d13f3, 0x015fad0a, 0x014de5b5, 0x01c07070, 0x025d6b54, 0x003c867a}}, Y: Field{[10]uint32{0x000766d1, 0x00a58a90, 0x03fb8d8c, 0x00f01ec9, 0x01f4b08d, 0x03333dac, 0x03af4544, 0x0102c3dc, 0x0157e83d, 0x00132e56}}}, + {X: Field{[10]uint32{0x01a0b448, 0x01a4491a, 0x02708723, 0x0242f298, 0x02543a54, 0x03d17789, 0x03683db8, 0x03eeaac7, 0x000f74a8, 0x0035ee1d}}, Y: Field{[10]uint32{0x02a4593b, 0x0380c57a, 0x009b3411, 0x017b4f01, 0x02ff15db, 0x02b51c5f, 0x0010f337, 0x0324bb84, 0x028128d9, 0x003e9de5}}}, + {X: Field{[10]uint32{0x02a824bf, 0x0134c246, 0x014289fe, 0x00caaf76, 0x02ad5bcd, 0x00e8ccd7, 0x02f7c98d, 0x01bc3be1, 0x00222f8f, 0x000cb4c7}}, Y: Field{[10]uint32{0x022e1661, 0x03452e11, 0x02961118, 0x0279bc9b, 0x022e6dac, 0x016e7876, 0x00d3d791, 0x015b8e73, 0x02f58921, 0x0017cc0c}}}, + {X: Field{[10]uint32{0x018347b5, 0x03e1b2f0, 0x012c4340, 0x01f35656, 0x028793d7, 0x03660c7a, 0x0045a155, 0x02cc99c4, 0x0371914a, 0x001d187c}}, Y: Field{[10]uint32{0x00092ff6, 0x0211ecf3, 0x02ea6b39, 0x03d43261, 0x002eee1f, 0x02a91095, 0x01ddcae0, 0x02fb032f, 0x02238b96, 0x0023b02e}}}, + {X: Field{[10]uint32{0x03b2b2d6, 0x01a62eb5, 0x0053d287, 0x00b0f99d, 0x026d716b, 0x028e081a, 0x0356a25a, 0x021801d0, 0x02db1df1, 0x003b81e6}}, Y: Field{[10]uint32{0x001c8c1e, 0x02b11e7b, 0x00e25eba, 0x026bc131, 0x02a44698, 0x03317e7d, 0x01f37e0e, 0x02f97131, 0x012aafe3, 0x00237090}}}, + {X: Field{[10]uint32{0x029da6b5, 0x036185ae, 0x01dc72bf, 0x00c61d32, 0x03e65de3, 0x03b9883d, 0x03b18302, 0x020fc119, 0x03e447ec, 0x0005bb24}}, Y: Field{[10]uint32{0x01b0674d, 0x019de389, 0x01713962, 0x01a94392, 0x039d5818, 0x02960128, 0x028c2a7c, 0x03ed0343, 0x01150e62, 0x0017918c}}}, + {X: Field{[10]uint32{0x0137bd99, 0x02581975, 0x02aa485b, 0x025fe62d, 0x03d88558, 0x03e9c2da, 0x0178290a, 0x03dbc0e2, 0x0180c245, 0x003aa97e}}, Y: Field{[10]uint32{0x02dc07dc, 0x00104093, 0x0267fb18, 0x0275f9ba, 0x00d78486, 0x03265189, 0x02528391, 0x00b82066, 0x013e292c, 0x003d97d7}}}, + {X: Field{[10]uint32{0x01a49f51, 0x0312dacd, 0x0342ea96, 0x021dc544, 0x0158ae04, 0x028090e6, 0x02ee1910, 0x0304c9a4, 0x0007544a, 0x0001e325}}, Y: Field{[10]uint32{0x00a3ddb4, 0x019d7c65, 0x00d2462b, 0x0160f019, 0x00fa1fbd, 0x00e6979a, 0x00047955, 0x026e1755, 0x019169eb, 0x003cf80c}}}, + {X: Field{[10]uint32{0x002857a5, 0x015e365c, 0x00688726, 0x02b9e9bf, 0x0001cdc8, 0x00c6ba80, 0x01cd8384, 0x029dc05b, 0x03e219a1, 0x001253d2}}, Y: Field{[10]uint32{0x000d562c, 0x012c0c62, 0x02d6e55f, 0x00c35d9f, 0x02f925ce, 0x038dae8a, 0x03a7f075, 0x0297cce6, 0x02969283, 0x0010890a}}}, + {X: Field{[10]uint32{0x001fe9b5, 0x03079997, 0x0270ebf4, 0x03a963ea, 0x01d28211, 0x0113a952, 0x007f2f51, 0x0361b1af, 0x00030da6, 0x0029662a}}, Y: Field{[10]uint32{0x01864e6b, 0x009b6f4b, 0x0386a100, 0x02d96cd7, 0x0023fc63, 0x001cdebb, 0x00b4a714, 0x00b0c1f9, 0x016f8482, 0x000812d7}}}, + {X: Field{[10]uint32{0x00595997, 0x02b70f96, 0x00a184db, 0x003c495c, 0x00208f02, 0x036fabfb, 0x0192f5f2, 0x00ad7424, 0x02365abb, 0x00310645}}, Y: Field{[10]uint32{0x00fa9913, 0x01ba5ad6, 0x03fc0ed1, 0x01143cd2, 0x01d5caf9, 0x02261262, 0x01245b32, 0x01fbe927, 0x0351d008, 0x00013c50}}}, + {X: Field{[10]uint32{0x00742881, 0x01ce9545, 0x02acfe4c, 0x034b828d, 0x0392a2e0, 0x0280ef16, 0x0324604d, 0x03e91d69, 0x0063a586, 0x00210758}}, Y: Field{[10]uint32{0x028d6154, 0x00db7806, 0x0169ce7a, 0x0359d130, 0x00e62562, 0x01d50da6, 0x004f9a1c, 0x0167a064, 0x03f59c06, 0x0001ce19}}}, + {X: Field{[10]uint32{0x030e20d5, 0x004ab135, 0x03e4ded1, 0x020424a2, 0x03282b33, 0x0226f78b, 0x0026947f, 0x01c74dd8, 0x03399a69, 0x0017a56e}}, Y: Field{[10]uint32{0x02012865, 0x00e131d1, 0x0238b161, 0x03b5f62e, 0x01a99c9a, 0x004c4ddd, 0x03fc7118, 0x00216fba, 0x03366809, 0x000e7c8f}}}, + {X: Field{[10]uint32{0x00ef2f66, 0x011c6f28, 0x01d8bf99, 0x0192d4c5, 0x025ec075, 0x027f65d3, 0x0039f8a9, 0x023f51db, 0x001a5394, 0x000db919}}, Y: Field{[10]uint32{0x014c78fc, 0x01473d5a, 0x023e06fd, 0x0124ff55, 0x0056ea13, 0x01726aa5, 0x00227b08, 0x013ae059, 0x031b1abe, 0x00349092}}}, + {X: Field{[10]uint32{0x0179f726, 0x02c9f0b1, 0x0114faea, 0x01085c3a, 0x00f56438, 0x0141e907, 0x00191a2f, 0x02eeca43, 0x001ea7bf, 0x0000cd96}}, Y: Field{[10]uint32{0x02fda224, 0x03372af4, 0x01e0ef3d, 0x00504334, 0x0391f7ab, 0x01b95acc, 0x0252129b, 0x0386fa64, 0x0168595f, 0x003ab448}}}, + {X: Field{[10]uint32{0x03d43ede, 0x01d09c1a, 0x010c4849, 0x0097b5a2, 0x00037810, 0x03c03b21, 0x032634fc, 0x035ada87, 0x0016dadf, 0x0022ae26}}, Y: Field{[10]uint32{0x01cdd24e, 0x011ea44a, 0x0045858a, 0x0270fa26, 0x03503d45, 0x018904db, 0x02654aef, 0x03428113, 0x0309f2f6, 0x001bf73b}}}, + {X: Field{[10]uint32{0x00c5fb94, 0x0100a12e, 0x032544bb, 0x023a2b3f, 0x0220b093, 0x00a67f2a, 0x033344d9, 0x0315de04, 0x01a746c9, 0x00078cfc}}, Y: Field{[10]uint32{0x03f3b3b6, 0x029f4815, 0x03010e33, 0x0083c740, 0x032306d3, 0x03493b7f, 0x008ed618, 0x006ceaa7, 0x00257dd1, 0x00018198}}}, + {X: Field{[10]uint32{0x00f08f31, 0x000d87f6, 0x00fcfa41, 0x0330632f, 0x020ed1f4, 0x01e77482, 0x03f30ded, 0x0306dfb9, 0x01dcb3ce, 0x00216df0}}, Y: Field{[10]uint32{0x02999511, 0x03b4f0d7, 0x02633c6f, 0x0062575e, 0x00fcafad, 0x02a211fd, 0x01048f25, 0x03750fce, 0x01cdd026, 0x000f662a}}}, + {X: Field{[10]uint32{0x01ac5f51, 0x00a00198, 0x03af872a, 0x00ee1e29, 0x017fbe9a, 0x0175b517, 0x035f4b12, 0x01194249, 0x03bd8d9e, 0x000a77e7}}, Y: Field{[10]uint32{0x0227d84b, 0x021dbaca, 0x01e55cd2, 0x02187006, 0x03da61dc, 0x01e44e7f, 0x02d88621, 0x016981b8, 0x03e99c77, 0x0002d313}}}, + {X: Field{[10]uint32{0x01fce252, 0x00acb912, 0x0105c808, 0x028bdda0, 0x03dfe58c, 0x02abe2b7, 0x02a6e671, 0x0211e8ff, 0x02e06b0a, 0x00282c72}}, Y: Field{[10]uint32{0x02296cf2, 0x0012540e, 0x030e650f, 0x0060d2bf, 0x026b72da, 0x01e9a8a3, 0x00b19d91, 0x002563b1, 0x0102edde, 0x002b90d0}}}, + {X: Field{[10]uint32{0x00e121e5, 0x00fcb930, 0x03e4ba11, 0x02cec84c, 0x01b499df, 0x03a100a5, 0x01c7ff67, 0x03a684db, 0x02afb9b3, 0x00013a33}}, Y: Field{[10]uint32{0x0326683c, 0x01f398a8, 0x00502b82, 0x01a98d18, 0x01422c08, 0x0133971e, 0x008f6d53, 0x01b5e92d, 0x00118c8b, 0x0033c85d}}}, + {X: Field{[10]uint32{0x0389a33b, 0x01c970ad, 0x00919f42, 0x01a26804, 0x000a5076, 0x028bda42, 0x03b81c7c, 0x026dbd6b, 0x00e047e1, 0x00349291}}, Y: Field{[10]uint32{0x03ea8fa3, 0x03b105eb, 0x0244d2cd, 0x01a21ee0, 0x01013f99, 0x0303c71a, 0x03db50f1, 0x01be3f18, 0x01591b46, 0x001bee35}}}, + {X: Field{[10]uint32{0x023b35d4, 0x013a63a3, 0x0377b510, 0x00a2aeea, 0x00001edd, 0x032e6561, 0x01fdfcfa, 0x02737492, 0x006a7a6c, 0x003a8058}}, Y: Field{[10]uint32{0x023ea98d, 0x01948622, 0x03700cfd, 0x012f0a08, 0x01b7d449, 0x01e9ecf3, 0x03fe369f, 0x004ac33e, 0x00908c73, 0x000c8abd}}}, + {X: Field{[10]uint32{0x00e2131f, 0x0065b7a3, 0x031be4ad, 0x036317a8, 0x01252007, 0x03ae5994, 0x02328655, 0x007229b1, 0x01bf2b66, 0x002be2b7}}, Y: Field{[10]uint32{0x01749700, 0x03ef36dc, 0x02ac8f3d, 0x021a0389, 0x03252081, 0x0025a0da, 0x0034eafd, 0x0217d4a8, 0x027c029b, 0x0019d279}}}, + {X: Field{[10]uint32{0x00f45889, 0x03c38d14, 0x0215e722, 0x036af3f2, 0x01a674a3, 0x0383ec59, 0x00516d47, 0x01b281b3, 0x02197456, 0x000038eb}}, Y: Field{[10]uint32{0x030bd6a4, 0x0029cbba, 0x01f53342, 0x0121d3e0, 0x000de97e, 0x03d341cc, 0x0217f07b, 0x01440458, 0x027e4531, 0x000abaaf}}}, + {X: Field{[10]uint32{0x0397e246, 0x03aa33b4, 0x00802075, 0x03cfb496, 0x0301993f, 0x03b478f8, 0x036993ff, 0x0265c873, 0x0355313d, 0x001647b8}}, Y: Field{[10]uint32{0x03e5d196, 0x0263c692, 0x022bdeee, 0x014f4972, 0x001ff0b0, 0x011831e4, 0x00fc4775, 0x00c2fa98, 0x018a113c, 0x002c3a95}}}, + {X: Field{[10]uint32{0x01b52984, 0x033c0c95, 0x00945077, 0x0391ec21, 0x01fa8584, 0x02363698, 0x01aa9731, 0x013127c6, 0x0155fda5, 0x00044e5b}}, Y: Field{[10]uint32{0x03ea57a4, 0x019efaa4, 0x03be4c57, 0x02c06c95, 0x004ff536, 0x01efad1d, 0x01d5833a, 0x02b004a2, 0x00a8cd45, 0x0026631d}}}, + {X: Field{[10]uint32{0x0017aa7a, 0x010055f8, 0x00b64055, 0x0151a1d5, 0x038dcdfd, 0x02783102, 0x0000738c, 0x01685e40, 0x021ba39c, 0x000f174a}}, Y: Field{[10]uint32{0x001bd257, 0x01e72932, 0x00f6661f, 0x027f749c, 0x000f9b8b, 0x01bf062e, 0x014de739, 0x00d38be7, 0x0279995a, 0x002c8a10}}}, + {X: Field{[10]uint32{0x013cc030, 0x03be285e, 0x00078425, 0x02bec12b, 0x03fbc395, 0x027cba70, 0x0299a729, 0x0037be8e, 0x00b8a60a, 0x003321c1}}, Y: Field{[10]uint32{0x001f1b13, 0x02dd38eb, 0x01c4e940, 0x013f12f3, 0x00f395b7, 0x02cd1fe3, 0x01e0862d, 0x005e2074, 0x0039feed, 0x002f7518}}}, + {X: Field{[10]uint32{0x0089b197, 0x010466ca, 0x02e7ea20, 0x03f3314f, 0x017dd4de, 0x032b4a6e, 0x01777ac5, 0x0156ab36, 0x00f7ea85, 0x00314cf9}}, Y: Field{[10]uint32{0x03596096, 0x0383d17a, 0x03a26bb8, 0x02ed292c, 0x02d9b925, 0x03c690e8, 0x02fb6242, 0x037d0a68, 0x016bc5ef, 0x001bc289}}}, + {X: Field{[10]uint32{0x03da6593, 0x01b5238c, 0x03bbcf56, 0x00d3bb01, 0x0269ba8c, 0x000f325a, 0x01f6d08d, 0x01f5bc42, 0x00f2ccb2, 0x0003053e}}, Y: Field{[10]uint32{0x03dc3a38, 0x02192444, 0x035e6c0e, 0x03742601, 0x0075b740, 0x03f870a1, 0x00473e16, 0x0263dff5, 0x02923bb3, 0x0030d675}}}, + {X: Field{[10]uint32{0x0390e6ef, 0x007dcb82, 0x0321ce44, 0x03b5d7e3, 0x024c9739, 0x0285c456, 0x0024789f, 0x029142eb, 0x03046bc6, 0x0029b2f0}}, Y: Field{[10]uint32{0x03fa9b9f, 0x00abf585, 0x00313986, 0x01cf1c18, 0x0360ceb5, 0x0303e568, 0x030619e2, 0x02226ec4, 0x03f4680e, 0x000086b9}}}, + {X: Field{[10]uint32{0x0143cc38, 0x02ce7e67, 0x01ce6344, 0x00099f44, 0x03130a3c, 0x0166c72b, 0x03b86c13, 0x02249faf, 0x019a02c4, 0x000d1f5b}}, Y: Field{[10]uint32{0x01c74448, 0x027fc78c, 0x00cb1268, 0x02da1e1c, 0x006d565a, 0x03b24bc2, 0x0187f6ec, 0x01493472, 0x0361a353, 0x00183a9f}}}, + {X: Field{[10]uint32{0x0372656a, 0x03bdd0de, 0x008cf855, 0x02c6fcc7, 0x02d47c67, 0x017bd619, 0x037dcb37, 0x02e3660f, 0x01d2181d, 0x00369951}}, Y: Field{[10]uint32{0x03dc208a, 0x02a092dd, 0x03d897fe, 0x006d24d6, 0x01667305, 0x015a0317, 0x038f07ce, 0x01e29e79, 0x0315ab68, 0x00126e59}}}, + {X: Field{[10]uint32{0x03eb1111, 0x016652e3, 0x03146b9d, 0x02517595, 0x03ec25d6, 0x00271b79, 0x03b81483, 0x00b2c684, 0x03cc9d01, 0x003101d1}}, Y: Field{[10]uint32{0x020fa2d4, 0x03a0c0df, 0x014e1bb5, 0x0055ae54, 0x025db936, 0x032d2255, 0x01e6caf2, 0x0284bf1b, 0x00753be2, 0x00172958}}}, + {X: Field{[10]uint32{0x037f3502, 0x000fbd00, 0x03d34c82, 0x01c4cd22, 0x00338c7f, 0x03a1c39e, 0x033a610b, 0x025e6333, 0x00ec82c9, 0x001390b2}}, Y: Field{[10]uint32{0x03606437, 0x0111cda4, 0x03cc40a9, 0x01133152, 0x01a54921, 0x01de0cd0, 0x028b33a0, 0x03ee4a9e, 0x034ee5e0, 0x001d5c75}}}, + {X: Field{[10]uint32{0x030dedea, 0x008a86ce, 0x03432875, 0x036c3219, 0x02d251ca, 0x03dc2c8d, 0x02ba2e1a, 0x01abe08e, 0x037089bc, 0x000ddd6a}}, Y: Field{[10]uint32{0x01018cf7, 0x03658502, 0x02a2c42a, 0x01efde9d, 0x03ac8db1, 0x00a33e9f, 0x039736a8, 0x002762f2, 0x0107bcfa, 0x002f94b4}}}, + {X: Field{[10]uint32{0x02f74e26, 0x01678fa0, 0x03a88469, 0x01744c52, 0x02d95459, 0x034f5dd6, 0x014fb814, 0x03b0de76, 0x00bf7e34, 0x0033b8c7}}, Y: Field{[10]uint32{0x003b1c6d, 0x01228071, 0x014d80f4, 0x002f853b, 0x020149ef, 0x02f3dafe, 0x03947ae2, 0x0162709a, 0x0214c06b, 0x0023f592}}}, + {X: Field{[10]uint32{0x00b47986, 0x00680742, 0x02befcdc, 0x03f516c7, 0x02fddb58, 0x03ad5193, 0x036ea6a4, 0x0245d867, 0x02ea09b6, 0x002d3e7a}}, Y: Field{[10]uint32{0x0200682a, 0x02a2b01c, 0x0142eb24, 0x03004b29, 0x038bb131, 0x03185c9b, 0x033a4f18, 0x0152c1d0, 0x01925b5a, 0x000e7972}}}, + {X: Field{[10]uint32{0x02bcc60e, 0x0241de4b, 0x00cc1b77, 0x016bf0f7, 0x0284e251, 0x019b4c33, 0x0179a489, 0x03e48e80, 0x01fc3d2d, 0x0035098f}}, Y: Field{[10]uint32{0x02208d54, 0x0193848a, 0x00f7fae1, 0x01d82b5b, 0x0189e127, 0x01614f38, 0x0230d629, 0x023facc3, 0x0307a0f7, 0x0018b7eb}}}, + {X: Field{[10]uint32{0x017612c4, 0x00fbb6a2, 0x01e42223, 0x0302928b, 0x000032ac, 0x024c215f, 0x00d35eb6, 0x0299693e, 0x0124820f, 0x0012115d}}, Y: Field{[10]uint32{0x01bd0f77, 0x01daaa92, 0x00a9ae7a, 0x01f6cb58, 0x03dc6cc0, 0x03e870b9, 0x033c38a1, 0x01e7661c, 0x00ab3679, 0x000969d2}}}, + {X: Field{[10]uint32{0x011cceda, 0x0285d9f0, 0x0123f367, 0x0246454a, 0x02045e19, 0x00abf7f0, 0x01644f3a, 0x007cb2c4, 0x03188110, 0x0037fbbb}}, Y: Field{[10]uint32{0x029a7517, 0x020eb826, 0x03dff16a, 0x039d2d2e, 0x00c390bd, 0x0259e4f0, 0x0020bab3, 0x03810be5, 0x0056cf1d, 0x003b3edc}}}, + {X: Field{[10]uint32{0x00fae859, 0x00b7e0ee, 0x00ed36c8, 0x02f1818b, 0x035d89bc, 0x007ce260, 0x0173f44e, 0x03e0dcf1, 0x02b17543, 0x001b5fbd}}, Y: Field{[10]uint32{0x02712d10, 0x02c64372, 0x000bbf74, 0x02566cb6, 0x00c521a0, 0x01ffaa6f, 0x02fa10c5, 0x02261b7f, 0x02c33543, 0x00335143}}}, + {X: Field{[10]uint32{0x0204541f, 0x0096bd9b, 0x007035af, 0x024c8955, 0x03f3c88b, 0x02647cb8, 0x00500d3b, 0x029689a1, 0x01d59102, 0x0039d581}}, Y: Field{[10]uint32{0x03fad125, 0x0026438a, 0x00693836, 0x0314c22c, 0x014f729a, 0x0211cf8c, 0x039b4872, 0x007b9502, 0x0354a8f7, 0x003d7151}}}, + {X: Field{[10]uint32{0x01ed620c, 0x010ffbec, 0x008457dd, 0x0182af8e, 0x019a0c2e, 0x014082f2, 0x02be453d, 0x03ea81a8, 0x020f4c4d, 0x003ae619}}, Y: Field{[10]uint32{0x0099223e, 0x03d10400, 0x0131ce85, 0x022a5044, 0x00a0a7cd, 0x0349b348, 0x009af3ad, 0x02e14818, 0x00876d9c, 0x001b2e6a}}}, + {X: Field{[10]uint32{0x00dba942, 0x0158f8ee, 0x00336dc3, 0x01a50622, 0x02215459, 0x024ac664, 0x039f2e68, 0x00534d64, 0x03027d85, 0x0004fa1e}}, Y: Field{[10]uint32{0x02b8adf1, 0x00355591, 0x02beb257, 0x0295a35a, 0x02ac2b9d, 0x02fc7a46, 0x01624114, 0x029b7b17, 0x03c68059, 0x003fbd68}}}, + {X: Field{[10]uint32{0x01e5764a, 0x011245a4, 0x0308e7bf, 0x00dc7389, 0x0125424b, 0x016f9bf0, 0x0038f06a, 0x01bf805f, 0x0026e9fd, 0x003b858c}}, Y: Field{[10]uint32{0x016c62b2, 0x00c3682b, 0x02623e54, 0x03e856e5, 0x00f49ae3, 0x01c343d6, 0x0194ccc6, 0x0358710f, 0x010f255d, 0x0006b2c9}}}, + {X: Field{[10]uint32{0x03af3d80, 0x00b976cc, 0x02799993, 0x010d4161, 0x031e626d, 0x030b7226, 0x01e3a750, 0x007935e3, 0x01ef9ad5, 0x002c9a3d}}, Y: Field{[10]uint32{0x0216e423, 0x03a51684, 0x01614003, 0x013f5064, 0x018cf0d3, 0x03077b80, 0x01f77d41, 0x02e7aec6, 0x014b3c99, 0x0017cc43}}}, + {X: Field{[10]uint32{0x03c4750d, 0x03ff6ea4, 0x02ea3bf7, 0x0072a673, 0x002b02f0, 0x01b1eff9, 0x03ad85eb, 0x03c0d7a7, 0x03118a9d, 0x003fc1fc}}, Y: Field{[10]uint32{0x02d1f0d8, 0x00342633, 0x02ddd474, 0x0084538b, 0x01c1d294, 0x03b32eb7, 0x00440c38, 0x01628e97, 0x02d603e8, 0x0010e04d}}}, + {X: Field{[10]uint32{0x02b526a1, 0x03a30f38, 0x01ebec16, 0x02783609, 0x02a4b9f6, 0x03ed962f, 0x006fd20f, 0x014a8d05, 0x0055c7c0, 0x002362e6}}, Y: Field{[10]uint32{0x03036758, 0x00b9fd18, 0x03ceb30e, 0x03fb9475, 0x004bcf50, 0x0213a935, 0x03af44fb, 0x01e7e49a, 0x01eedc2d, 0x00336d56}}}, + {X: Field{[10]uint32{0x01a32b63, 0x0098c603, 0x031eba54, 0x033b2a46, 0x03e4b851, 0x01eb89b7, 0x029d472d, 0x02fc16fe, 0x035384df, 0x0014b6c2}}, Y: Field{[10]uint32{0x00a7b375, 0x012da761, 0x0279de92, 0x0240a1d5, 0x03b3180c, 0x01b6e7d5, 0x02baf66a, 0x0397508f, 0x017d050e, 0x00030ee6}}}, + {X: Field{[10]uint32{0x03d43352, 0x0150efb2, 0x008c6fff, 0x030fcfe9, 0x007d0f29, 0x02024673, 0x01efd24e, 0x007698e5, 0x0090d3d5, 0x00398be5}}, Y: Field{[10]uint32{0x00cafa7d, 0x001eff67, 0x02f5170e, 0x01647c76, 0x02f342c8, 0x031a0a18, 0x002ca280, 0x01ac2c8b, 0x017ba487, 0x001b626b}}}, + {X: Field{[10]uint32{0x02ab1193, 0x039f596a, 0x014fd6d8, 0x03d72dec, 0x011afa2f, 0x03ddf406, 0x03509c88, 0x0266d255, 0x022476b3, 0x001fcc3a}}, Y: Field{[10]uint32{0x037acaec, 0x03d2ffd8, 0x03e9880e, 0x02d9ec40, 0x01daff7b, 0x03d8c47a, 0x015389a5, 0x032530ec, 0x03d4b231, 0x003297bd}}}, + {X: Field{[10]uint32{0x000b7a00, 0x0280d860, 0x01d9ac60, 0x02d28774, 0x03ef0fb7, 0x029b240f, 0x02210fad, 0x0053ed1a, 0x031e1d9f, 0x0014263f}}, Y: Field{[10]uint32{0x0117ddc0, 0x016c4cbf, 0x03e5362a, 0x01035837, 0x02b3ee1b, 0x01d50801, 0x00d37c6e, 0x0323e021, 0x0141d81f, 0x00025cc4}}}, + {X: Field{[10]uint32{0x0378ad58, 0x00b20789, 0x01c96b9f, 0x03333911, 0x02e2f3c4, 0x0272fbe9, 0x0095be6b, 0x0144a9ca, 0x007de9ee, 0x000cade3}}, Y: Field{[10]uint32{0x00c8753c, 0x01c8dde5, 0x0275ba49, 0x0151eb88, 0x0073bb80, 0x038a0983, 0x03c3896e, 0x01c78cbb, 0x01f513df, 0x003b8612}}}, + {X: Field{[10]uint32{0x0147a4f7, 0x01605541, 0x01fc074b, 0x03c209a7, 0x00e37d50, 0x01f1cac3, 0x036eef2a, 0x027ef341, 0x00fddc8e, 0x0038b2dd}}, Y: Field{[10]uint32{0x005cc4a4, 0x006af2c0, 0x012be864, 0x038d848b, 0x03addea9, 0x01cdbac2, 0x022df062, 0x034891e9, 0x02d71c9d, 0x0034ea8b}}}, + {X: Field{[10]uint32{0x010ae3a8, 0x00366734, 0x00b141be, 0x00d7c8d7, 0x0026009a, 0x01aacd5d, 0x01c29949, 0x035efb6b, 0x007566d4, 0x00210e11}}, Y: Field{[10]uint32{0x02dd791f, 0x00109acb, 0x01c4f239, 0x01e4198c, 0x0334ef0d, 0x01ab4cc1, 0x0101ac5e, 0x00293697, 0x02091698, 0x00313840}}}, + {X: Field{[10]uint32{0x0311d67e, 0x019720b1, 0x00b878ab, 0x0311bd98, 0x030587d9, 0x01b0c221, 0x0184c6fc, 0x00080e6d, 0x0088b894, 0x001058b5}}, Y: Field{[10]uint32{0x00852649, 0x011eb968, 0x0295dbda, 0x00ae12d3, 0x03c1732f, 0x03ee28eb, 0x02f22c25, 0x00a27ddd, 0x02903236, 0x0019c58f}}}, + {X: Field{[10]uint32{0x035f683d, 0x02e9292f, 0x010684f3, 0x01ebb0f9, 0x00175d76, 0x0373d53f, 0x0389bfd2, 0x003cd3c3, 0x03a84caf, 0x000feb4f}}, Y: Field{[10]uint32{0x03e61826, 0x0083bf37, 0x012a53fa, 0x01cb9f43, 0x030cf718, 0x031c629c, 0x030ca647, 0x0101eecb, 0x007cb6cc, 0x0003346f}}}, + {X: Field{[10]uint32{0x02b1a86b, 0x0254cbeb, 0x0398f1c6, 0x02fc4dc1, 0x02c1fb84, 0x00174205, 0x00c1a7ce, 0x01e8015a, 0x0200a300, 0x0019d3c9}}, Y: Field{[10]uint32{0x020d38a5, 0x03bb31a7, 0x02259e09, 0x03682c60, 0x0370db57, 0x00011602, 0x0343b257, 0x00cecfb7, 0x01f9413f, 0x000a6748}}}, + {X: Field{[10]uint32{0x02e9f08f, 0x034a6f57, 0x00bcff87, 0x031a49c5, 0x023d82d6, 0x007ecec9, 0x01b815ad, 0x01d2aee0, 0x01a54ade, 0x0034cbd3}}, Y: Field{[10]uint32{0x033eea87, 0x0105a442, 0x01d582fc, 0x0114d4d6, 0x0382e14f, 0x00165c1d, 0x0299016c, 0x014ee5a3, 0x02738b8e, 0x003e50a7}}}, + {X: Field{[10]uint32{0x03ce3ff6, 0x02553c78, 0x008cb1ed, 0x00c7dcac, 0x036fbb69, 0x00d61174, 0x01936571, 0x021555b9, 0x02704353, 0x000c3939}}, Y: Field{[10]uint32{0x0388db7b, 0x0169567a, 0x0340dc69, 0x00d769c1, 0x010a878d, 0x00eef26c, 0x01935011, 0x02618e12, 0x03ce6198, 0x00118be6}}}, + {X: Field{[10]uint32{0x00cad297, 0x01c6c135, 0x0180bf19, 0x0042c079, 0x027f3dcd, 0x00c3937b, 0x02829043, 0x0330c011, 0x02003c51, 0x002f8818}}, Y: Field{[10]uint32{0x01ccb9bc, 0x0163b5cb, 0x002a0d55, 0x0242415a, 0x01b1c610, 0x01387195, 0x033d48a7, 0x03950a15, 0x03c49d61, 0x00188622}}}, + {X: Field{[10]uint32{0x035df04a, 0x026167ff, 0x01993c41, 0x0298077d, 0x01cb6e84, 0x030abc84, 0x01e0fb9a, 0x01147b4a, 0x0023ace3, 0x0024c511}}, Y: Field{[10]uint32{0x0037b47c, 0x00a9b44c, 0x039d1d90, 0x0093dcae, 0x00f10652, 0x01e6480e, 0x031a3f9d, 0x01097d71, 0x03b164c3, 0x001f0437}}}, + {X: Field{[10]uint32{0x017b112c, 0x01906305, 0x012a7cb6, 0x00171edf, 0x01978292, 0x030d3ee0, 0x01ca26d6, 0x032f73c8, 0x00044f5f, 0x002c057e}}, Y: Field{[10]uint32{0x023a1d5f, 0x03a85153, 0x008c1d3a, 0x01bea8c2, 0x003b3cdc, 0x037e357e, 0x00a655b2, 0x03a04dd1, 0x02086d04, 0x002ae307}}}, + {X: Field{[10]uint32{0x01a21b52, 0x03cabcd0, 0x000d36b3, 0x03795e85, 0x024f8a18, 0x0291968e, 0x00868117, 0x025f6279, 0x01da649d, 0x00357a78}}, Y: Field{[10]uint32{0x0327447a, 0x017a164b, 0x0080d895, 0x01708901, 0x03169346, 0x03537436, 0x01a13cc1, 0x03b5cc44, 0x0037f391, 0x00132c11}}}, + {X: Field{[10]uint32{0x036966bb, 0x0294c5b4, 0x02d6f996, 0x0335cb85, 0x01983005, 0x02e6490e, 0x03f8ed77, 0x03281976, 0x01047dd7, 0x0034eb90}}, Y: Field{[10]uint32{0x0125ac46, 0x00370534, 0x00a614b1, 0x035f7c2b, 0x0164f8cd, 0x0105f1b6, 0x010f0303, 0x03aec8a8, 0x0321ad22, 0x002f46ba}}}, + {X: Field{[10]uint32{0x0097b065, 0x002be1f2, 0x037b49f8, 0x002a0b8d, 0x0087197d, 0x02003c29, 0x026cdd22, 0x03e563f1, 0x0363d885, 0x00118f89}}, Y: Field{[10]uint32{0x02f7ca7f, 0x026499c7, 0x03508b79, 0x0187ef25, 0x0326b80c, 0x0137818a, 0x03a311a9, 0x003f5f7c, 0x00db0e5d, 0x002ffbeb}}}, + {X: Field{[10]uint32{0x00641917, 0x0377f244, 0x0347c83c, 0x03102ff9, 0x0158e597, 0x02d8fb0c, 0x0353ec1b, 0x00159f1b, 0x01fd127c, 0x001e617f}}, Y: Field{[10]uint32{0x0332ed03, 0x016f559f, 0x0308703a, 0x00783b19, 0x0124ed29, 0x038a26bb, 0x0325fe1d, 0x0218bbca, 0x02daf3d9, 0x00180f04}}}, + {X: Field{[10]uint32{0x027703e9, 0x03c550f6, 0x02d0ed5f, 0x0272e0f4, 0x019e74c5, 0x003ab1fe, 0x01d24941, 0x038e76cb, 0x016b5f76, 0x001d286b}}, Y: Field{[10]uint32{0x00e0db08, 0x00dff5e4, 0x00c33d57, 0x01a250ba, 0x00093e09, 0x00c6efa8, 0x0193d836, 0x0318f358, 0x03ef18c9, 0x00331855}}}, + {X: Field{[10]uint32{0x022f6da3, 0x034225ac, 0x03463a71, 0x00b1c9d1, 0x03c9bab4, 0x02e866df, 0x01416664, 0x01d7d80b, 0x02507033, 0x000c1a0a}}, Y: Field{[10]uint32{0x03a22ff8, 0x0053665d, 0x0273f177, 0x0383c672, 0x036290d0, 0x00c474c5, 0x00f39e7f, 0x02d3e9b2, 0x00f6b018, 0x00154f81}}}, + {X: Field{[10]uint32{0x0369ef57, 0x01b04d1d, 0x0352b1ee, 0x00ac9193, 0x03654e7a, 0x03e9e565, 0x03791efe, 0x0357c9b0, 0x00f0d7c0, 0x00278856}}, Y: Field{[10]uint32{0x01008373, 0x03efc98a, 0x038509e2, 0x023bcd68, 0x029ffd7c, 0x03e9dd8b, 0x003a3481, 0x014fc240, 0x00dd1b90, 0x0001c4bf}}}, + {X: Field{[10]uint32{0x02327d66, 0x0215fcef, 0x03ce7322, 0x019b8f13, 0x028172e5, 0x00094e30, 0x024029c2, 0x03273fae, 0x02989a43, 0x0005db89}}, Y: Field{[10]uint32{0x03a4b1c3, 0x01e0d307, 0x009ee7b4, 0x007d3bb8, 0x019aefd3, 0x023710f0, 0x0270b487, 0x03ae1df4, 0x01d04b29, 0x003b6332}}}, + {X: Field{[10]uint32{0x00374da8, 0x011e2314, 0x00f1b700, 0x00e4f7f1, 0x02cf1892, 0x00eb5d1f, 0x02bb89a1, 0x0079b9a2, 0x02fea377, 0x001d751b}}, Y: Field{[10]uint32{0x02a6bed8, 0x011c9961, 0x02e1a3ca, 0x008544d1, 0x00d7efc2, 0x02ce6a1a, 0x00b86fd2, 0x01d9e7f4, 0x010a9950, 0x0026148e}}}, + {X: Field{[10]uint32{0x01605721, 0x00c67d91, 0x029345b7, 0x00114721, 0x032310fb, 0x0097db57, 0x0298c4c8, 0x02403fed, 0x00c67d64, 0x00202688}}, Y: Field{[10]uint32{0x00e286c1, 0x03e97cfe, 0x03e6a5eb, 0x03315258, 0x003d096c, 0x01fe8105, 0x02b06192, 0x01f88add, 0x0180d991, 0x0027a652}}}, + {X: Field{[10]uint32{0x0172c180, 0x018d11be, 0x023528d5, 0x0073ca71, 0x03defece, 0x02b1c20f, 0x00500b4e, 0x03c453b5, 0x003a43f7, 0x0006ce24}}, Y: Field{[10]uint32{0x02f408f9, 0x02504676, 0x0272ad33, 0x01adbd76, 0x022708b2, 0x0354f792, 0x0353f77f, 0x002ba224, 0x01c931a6, 0x00100dbb}}}, + {X: Field{[10]uint32{0x00feef23, 0x01b1621a, 0x0166df4e, 0x0338b41d, 0x03263458, 0x03e8fbf9, 0x00b4e8dd, 0x012e7aac, 0x01b6eb29, 0x00242a03}}, Y: Field{[10]uint32{0x03cf91e6, 0x031dba4b, 0x01681442, 0x02c9eef6, 0x035ee050, 0x0278a4da, 0x0321145d, 0x03c6361f, 0x039f9754, 0x001d4f22}}}, + {X: Field{[10]uint32{0x036bea9b, 0x009751cd, 0x0146e6dc, 0x00152851, 0x023e6f36, 0x03d80d03, 0x01625460, 0x0166604b, 0x03844b70, 0x0030b203}}, Y: Field{[10]uint32{0x02a79c64, 0x02f5120e, 0x00f6123a, 0x029c0ad3, 0x0173b871, 0x0074ec6d, 0x03495b89, 0x03539c62, 0x020d68f4, 0x0021b285}}}, + {X: Field{[10]uint32{0x028e7553, 0x00f38468, 0x01692a32, 0x038757f3, 0x012d00cf, 0x0067ec99, 0x03989d3f, 0x02d7cff7, 0x02744cf4, 0x00273d81}}, Y: Field{[10]uint32{0x0247759d, 0x003144f0, 0x0385dc30, 0x0038f116, 0x03edd0f3, 0x03eb5a18, 0x017b6a3c, 0x03f3056d, 0x03f7b973, 0x002051f2}}}, + {X: Field{[10]uint32{0x02d82208, 0x023d6156, 0x005abce9, 0x0031d080, 0x02a6280b, 0x018364db, 0x0093fd60, 0x031ac969, 0x03a28742, 0x0015d223}}, Y: Field{[10]uint32{0x01a29574, 0x021e113c, 0x03921dc2, 0x03994084, 0x03af949a, 0x009ed1c2, 0x02dbe56c, 0x02fa9562, 0x02455073, 0x000c6cf2}}}, + {X: Field{[10]uint32{0x0099447d, 0x02f17ad2, 0x00dc84ed, 0x005b1d63, 0x02d40ed6, 0x01d658f0, 0x00df2b8d, 0x02ef2372, 0x00be6be8, 0x003c44cf}}, Y: Field{[10]uint32{0x0252f50f, 0x02ee24fd, 0x016870cb, 0x018375e8, 0x0110bd3a, 0x0359f558, 0x014626d8, 0x02c8fd5c, 0x00472225, 0x0015ff09}}}, + {X: Field{[10]uint32{0x03be89c0, 0x038105d6, 0x025050f4, 0x02ffcf90, 0x013f3d69, 0x00196ee0, 0x00989c79, 0x02f5e1fe, 0x02753301, 0x0025420f}}, Y: Field{[10]uint32{0x00b33482, 0x024fe925, 0x03c70cc5, 0x038055ac, 0x00ee4e92, 0x01dc1039, 0x017c73ca, 0x0037a518, 0x035ce7d1, 0x002112b6}}}, + {X: Field{[10]uint32{0x005c75c6, 0x000110ef, 0x01973621, 0x02cd8f23, 0x038668c7, 0x03266bd8, 0x0176ed29, 0x0159d579, 0x0355cbb7, 0x0006a420}}, Y: Field{[10]uint32{0x032454a2, 0x02b48b8b, 0x03f27057, 0x001d2d13, 0x00a73538, 0x01589f60, 0x03787222, 0x01b8d4bd, 0x026c6e55, 0x0035d951}}}, + {X: Field{[10]uint32{0x0349b648, 0x037cefbc, 0x01db4f04, 0x018f17cc, 0x038a2d1f, 0x02b65fe7, 0x0067308f, 0x010f56aa, 0x03740bd3, 0x0031648b}}, Y: Field{[10]uint32{0x027bd648, 0x014f251b, 0x00c4377f, 0x01108da9, 0x00da8118, 0x0362dd4b, 0x02605e50, 0x036fa204, 0x00687cfc, 0x001dec7c}}}, + {X: Field{[10]uint32{0x02c95dc9, 0x00d10839, 0x017d9964, 0x00c458e2, 0x02055dcf, 0x006c2d9c, 0x011a4043, 0x000a5dda, 0x01969f91, 0x0019386c}}, Y: Field{[10]uint32{0x0222550c, 0x02538ca4, 0x0371ddce, 0x034873bc, 0x029bfb77, 0x0240d6d9, 0x027fa26a, 0x030f27ac, 0x00c7c11f, 0x00305bd8}}}, + {X: Field{[10]uint32{0x03ce08de, 0x03edfa81, 0x01ce7808, 0x029d527a, 0x03c602f8, 0x00ccf74d, 0x0121bad3, 0x0113b5b1, 0x02766877, 0x0000cecb}}, Y: Field{[10]uint32{0x02988efd, 0x01444aa1, 0x038114c2, 0x032a9b79, 0x03d742e8, 0x03f7652f, 0x036c2437, 0x022ba573, 0x027fc8ed, 0x00386f3f}}}, + {X: Field{[10]uint32{0x01e4f294, 0x011cef91, 0x0275c951, 0x003fca52, 0x0189fbf3, 0x01ed2b0c, 0x02310331, 0x0228730a, 0x034c866d, 0x00083c63}}, Y: Field{[10]uint32{0x02d0ea0e, 0x032ba074, 0x0358943f, 0x027dc5cf, 0x030fe852, 0x034defb9, 0x00883363, 0x03ded3f6, 0x03c9d08e, 0x00235a15}}}, + {X: Field{[10]uint32{0x03b69a8b, 0x01105db5, 0x03befd14, 0x014d5190, 0x012df346, 0x038aa2e7, 0x02b4c685, 0x031c5a83, 0x03c944c9, 0x00134588}}, Y: Field{[10]uint32{0x0117be80, 0x0160e222, 0x02f7854f, 0x0357b654, 0x022b601b, 0x01bb0d25, 0x016bf6b9, 0x02b40fe6, 0x01fe8744, 0x00377c6e}}}, + {X: Field{[10]uint32{0x01b079e0, 0x0343fd4f, 0x027e2d4a, 0x02937436, 0x014faad0, 0x016251e1, 0x00d6b368, 0x00a4b4a0, 0x00dbe8ab, 0x002a406c}}, Y: Field{[10]uint32{0x03298a9d, 0x00398391, 0x023b301d, 0x03829ac1, 0x00716bc5, 0x0079eb99, 0x02f04dc6, 0x006986bd, 0x03e1834f, 0x000fc9f9}}}, + {X: Field{[10]uint32{0x03fc9a70, 0x007269ba, 0x0089b303, 0x013df202, 0x012f42a2, 0x0211916c, 0x03d66f44, 0x023ff542, 0x00713021, 0x001f82bc}}, Y: Field{[10]uint32{0x02aedb3f, 0x01b6de16, 0x003ab241, 0x005fd6f7, 0x010d5795, 0x017ac7a2, 0x013fbb23, 0x0343127d, 0x03f3926c, 0x00142f08}}}, + {X: Field{[10]uint32{0x02ebf20d, 0x00aaac16, 0x01da4ef8, 0x00a151ba, 0x00b47f05, 0x0102a40e, 0x005d3354, 0x00968b06, 0x007e1a7b, 0x001eea06}}, Y: Field{[10]uint32{0x02185187, 0x00924c26, 0x033a39ab, 0x02f39f62, 0x000527ef, 0x0329775e, 0x026c25c7, 0x00dc2be1, 0x026c9625, 0x001b9abb}}}, + {X: Field{[10]uint32{0x013a6807, 0x02128e76, 0x0277255b, 0x02583a49, 0x009767b7, 0x0063f28e, 0x0000816e, 0x02c9e6d8, 0x03c34d83, 0x00230143}}, Y: Field{[10]uint32{0x01174870, 0x026f104d, 0x023ce701, 0x0336073c, 0x015d699f, 0x0106604e, 0x03c29650, 0x023eca09, 0x00ef75b6, 0x002618c5}}}, + {X: Field{[10]uint32{0x019c2ec9, 0x02e2c6f2, 0x006202a7, 0x028b2fd4, 0x009d7201, 0x01492652, 0x0060583a, 0x037e1896, 0x009a78e4, 0x0014ede1}}, Y: Field{[10]uint32{0x03e469c0, 0x00b77e78, 0x012c544d, 0x00951ca3, 0x02e0a44d, 0x006f8b14, 0x024b22de, 0x01f41d77, 0x0212ac60, 0x00138c7a}}}, + {X: Field{[10]uint32{0x03313b33, 0x03149f94, 0x0278efeb, 0x0010c77b, 0x02b63350, 0x03f9d8af, 0x0075a010, 0x032655a8, 0x0267a5d0, 0x0026f7e7}}, Y: Field{[10]uint32{0x029d2bb0, 0x0252bf63, 0x00d5a17e, 0x00d9d8ba, 0x02907f26, 0x03c5b2b4, 0x00c27926, 0x00383b89, 0x0221a596, 0x00250991}}}, + {X: Field{[10]uint32{0x02381f34, 0x03f66412, 0x012fb429, 0x00b1bb0b, 0x0117d9f4, 0x01d81be2, 0x02c031a4, 0x02cef42e, 0x02b37a8a, 0x001f2a9c}}, Y: Field{[10]uint32{0x017303c9, 0x01f77597, 0x037f1ef8, 0x00781a0b, 0x03ff8fbd, 0x00804253, 0x023d6beb, 0x037a34d3, 0x03ab7ee5, 0x0016d614}}}, + {X: Field{[10]uint32{0x0193d81a, 0x01ae5f8e, 0x0093dde1, 0x031d54c9, 0x03925d62, 0x00fd236d, 0x000295fc, 0x01e5d5e7, 0x039f0982, 0x000bbca6}}, Y: Field{[10]uint32{0x03110753, 0x008cde8c, 0x015e89b4, 0x0090e1f6, 0x00a0afff, 0x02fd31c5, 0x0137ef96, 0x016e9829, 0x004dd987, 0x00125b25}}}, + {X: Field{[10]uint32{0x03317ff8, 0x030d2fa5, 0x00e6a9e5, 0x014bb0d5, 0x024029e9, 0x039740b1, 0x03c1860a, 0x01e1d55c, 0x00ad95b0, 0x0037c55f}}, Y: Field{[10]uint32{0x0284c162, 0x01bb8e04, 0x03ba470f, 0x00ba15a4, 0x00b629e6, 0x00acf30c, 0x01c979a0, 0x00ad4226, 0x02c77592, 0x003cbb32}}}, + {X: Field{[10]uint32{0x02454b1d, 0x02a61c05, 0x020e7b15, 0x00dadc64, 0x00e651d2, 0x02e7ad51, 0x0182e643, 0x02949ad8, 0x0150a29c, 0x00375570}}, Y: Field{[10]uint32{0x002e9368, 0x01788fd3, 0x00f5c4d9, 0x02af5dea, 0x00ac685a, 0x01a30944, 0x01605d42, 0x03a8bace, 0x03a542f4, 0x001131d5}}}, + {X: Field{[10]uint32{0x00227f27, 0x02792e26, 0x0172325b, 0x024e1fc0, 0x02c4d5d3, 0x018f4c95, 0x01477630, 0x00b1e464, 0x00f46ed4, 0x0005a21b}}, Y: Field{[10]uint32{0x0217fffb, 0x00e0c5c2, 0x00367ec5, 0x02378bd2, 0x02c824ed, 0x00f280f7, 0x02192fc9, 0x00ca6751, 0x02207ee7, 0x001d0868}}}, + {X: Field{[10]uint32{0x0360732f, 0x03aa9eca, 0x0345e56a, 0x0089213f, 0x0327968c, 0x01bc2b3f, 0x028b306d, 0x00186023, 0x00fcdaa3, 0x001bfc60}}, Y: Field{[10]uint32{0x029961a9, 0x00fa87bd, 0x038cc22f, 0x008baa16, 0x026c8d40, 0x018dd868, 0x0254dad0, 0x02bfc3f0, 0x0254f0c2, 0x001f45b5}}}, + {X: Field{[10]uint32{0x00395e36, 0x03323ab7, 0x005c4f8b, 0x0154e7da, 0x00aa912b, 0x003b99df, 0x034f51f4, 0x030a80fa, 0x0111a00d, 0x0000fa91}}, Y: Field{[10]uint32{0x03c9259d, 0x000d719c, 0x0049824b, 0x00d94a43, 0x030a2f2e, 0x010376d4, 0x02398393, 0x0008564e, 0x01f1528b, 0x001b27b4}}}, + {X: Field{[10]uint32{0x0253081d, 0x0332883c, 0x014b63c7, 0x002a0d79, 0x0153e415, 0x00cb7ee3, 0x00742d8f, 0x03a7aace, 0x0170dc3d, 0x0002e0b3}}, Y: Field{[10]uint32{0x01d0e24d, 0x012f02ab, 0x0326860d, 0x015aa48b, 0x0302effc, 0x00ca5d97, 0x02e20499, 0x01b9d74c, 0x03fe1f7f, 0x0003a2f2}}}, + {X: Field{[10]uint32{0x0196c77f, 0x00e2d5e8, 0x03d49b7b, 0x03c05cc9, 0x0206d056, 0x00169a69, 0x02e23bf1, 0x021d1613, 0x03e00074, 0x003f8bf0}}, Y: Field{[10]uint32{0x01bf3916, 0x02ef6dba, 0x0271d4f9, 0x007793f7, 0x007da856, 0x01601ec7, 0x01a32f69, 0x034a5f32, 0x001cc3c6, 0x000f8625}}}, + {X: Field{[10]uint32{0x03b7858b, 0x036fd5d2, 0x035ec845, 0x00511ba8, 0x02e8b001, 0x00b6e75b, 0x028778b1, 0x00da4d1f, 0x0176cdaa, 0x00012e40}}, Y: Field{[10]uint32{0x0173c154, 0x032abb2e, 0x03155295, 0x03f0bdea, 0x021fdad0, 0x02162031, 0x026e349b, 0x017f4fb2, 0x03ab6e9c, 0x003d8151}}}, + {X: Field{[10]uint32{0x0144c6d2, 0x03b04296, 0x028a0cd3, 0x01cbd654, 0x01defc42, 0x0036f27b, 0x00c86a9f, 0x01802d2e, 0x02511d34, 0x000d7ce0}}, Y: Field{[10]uint32{0x00b5ccd5, 0x00c8d2f4, 0x00daeae8, 0x02c6c4a8, 0x0043762b, 0x03e5b2a6, 0x0337a80c, 0x028797db, 0x01f6ef7f, 0x000a6a0d}}}, + {X: Field{[10]uint32{0x022cb94a, 0x0308dc5c, 0x011cdf3c, 0x02b0fc04, 0x03e1d0e9, 0x021f4fd6, 0x0027e265, 0x02dffe84, 0x02970311, 0x00075d2c}}, Y: Field{[10]uint32{0x00c2071e, 0x03307dca, 0x030e2606, 0x02ba771f, 0x0135dc99, 0x003d7183, 0x03bcfb81, 0x005382dc, 0x038b57f1, 0x00171ef3}}}, + {X: Field{[10]uint32{0x00450428, 0x0129a2a6, 0x013e6f93, 0x02df1056, 0x024f75d1, 0x027b1c8b, 0x0020737b, 0x03e5582c, 0x00f309c6, 0x00142825}}, Y: Field{[10]uint32{0x03778eee, 0x0243c7a0, 0x021b554a, 0x02da1a6a, 0x0089c86d, 0x02a07c11, 0x009eaba6, 0x0033f65a, 0x0222dfe1, 0x0028a1b8}}}, + {X: Field{[10]uint32{0x03c63db7, 0x0029b589, 0x0010599b, 0x036452d2, 0x00282dbc, 0x01d7b0e3, 0x02cf12e2, 0x0055f37f, 0x03812129, 0x0026d96e}}, Y: Field{[10]uint32{0x00223188, 0x0164ef06, 0x03d65528, 0x0102b423, 0x00660b4c, 0x007a629e, 0x013b2e95, 0x00890864, 0x031a3f0f, 0x003160b6}}}, + {X: Field{[10]uint32{0x02a4bc6b, 0x00200b4d, 0x02ca51c2, 0x03179883, 0x0085e7f1, 0x007720c7, 0x02c1115a, 0x0281b915, 0x00fc1fdf, 0x0022d151}}, Y: Field{[10]uint32{0x0220350d, 0x022c67de, 0x003b06ea, 0x02e6556c, 0x01e4116f, 0x02dc3993, 0x022af7f4, 0x00980b9c, 0x0041288f, 0x0038f9df}}}, + {X: Field{[10]uint32{0x020ab4aa, 0x02076577, 0x01e29d5f, 0x004f773b, 0x006cb2ae, 0x0155e3f7, 0x039b29cc, 0x03adf145, 0x0080b959, 0x001b1c26}}, Y: Field{[10]uint32{0x027c4bdc, 0x033144e7, 0x03b43c2d, 0x0314254f, 0x02ee2b59, 0x03cf7aae, 0x036c0c76, 0x02e9099c, 0x03aebd8e, 0x003278cf}}}, + {X: Field{[10]uint32{0x01537806, 0x02d59dcf, 0x001e7085, 0x019e00ae, 0x0076fc9d, 0x012821e8, 0x01891f79, 0x01a9c657, 0x035137ba, 0x001ddd82}}, Y: Field{[10]uint32{0x018e3a25, 0x0206af85, 0x037f0d7e, 0x037b9a39, 0x021b87ff, 0x03d105ef, 0x0358c7ed, 0x02962fd3, 0x00f5aaee, 0x003d480b}}}, + {X: Field{[10]uint32{0x02163102, 0x03109b9f, 0x025d0df4, 0x03e3bf58, 0x03e23cd4, 0x02324699, 0x02904a8a, 0x00320ba6, 0x03836a0b, 0x0006a2f5}}, Y: Field{[10]uint32{0x02285844, 0x0317f304, 0x01f2e4e9, 0x005adc02, 0x01c2a963, 0x03dd2a1f, 0x0174f282, 0x00b2b8f1, 0x00cab095, 0x00187f99}}}, + {X: Field{[10]uint32{0x024abc30, 0x02d4e421, 0x031d753d, 0x02679a51, 0x02a3fb30, 0x00936475, 0x01e453ed, 0x02644fec, 0x01b65907, 0x003f885f}}, Y: Field{[10]uint32{0x01730b58, 0x03dac0d3, 0x012538cd, 0x00714e5a, 0x0193a0c6, 0x007c11f5, 0x030f20fb, 0x017b5a02, 0x02bba962, 0x001773e6}}}, + {X: Field{[10]uint32{0x01b33b91, 0x02bb527d, 0x02c5f212, 0x035d232d, 0x0107e3ab, 0x03ab5a5b, 0x00f58b65, 0x0357af0e, 0x023754af, 0x00094135}}, Y: Field{[10]uint32{0x035d75d4, 0x0004eb5e, 0x03437b5e, 0x004159d7, 0x00ba7cec, 0x01cbeefd, 0x01321c6c, 0x011a713d, 0x034375f1, 0x001e69af}}}, + {X: Field{[10]uint32{0x03197b5c, 0x03772bf6, 0x0176b7fb, 0x02fd7322, 0x036160ab, 0x021c4170, 0x029bd3f6, 0x008b5e26, 0x0302f47b, 0x0002c1bd}}, Y: Field{[10]uint32{0x0332f63d, 0x017e4635, 0x007781cd, 0x01ff45e7, 0x005bd2fe, 0x02a8f7f9, 0x012a35b6, 0x035247d6, 0x03d419a4, 0x001d9a6e}}}, + {X: Field{[10]uint32{0x01044e23, 0x004a2983, 0x010acbc2, 0x027af48f, 0x00a6f3f9, 0x006d5120, 0x034eeb93, 0x0273e500, 0x003bb31f, 0x00200ec8}}, Y: Field{[10]uint32{0x0328d1c7, 0x014e0705, 0x006a954e, 0x02fd26e5, 0x03bfc9cc, 0x03e98aeb, 0x0320c5c7, 0x03dd6566, 0x008df271, 0x000c22af}}}, + {X: Field{[10]uint32{0x0302749a, 0x00a27f80, 0x028dcd57, 0x037a3a56, 0x02e52de1, 0x000e9cc4, 0x010e5bda, 0x033ab6ed, 0x00b4c5f5, 0x00099aa7}}, Y: Field{[10]uint32{0x02e0ae7e, 0x021bff11, 0x03baa8b3, 0x02e879f0, 0x033dc0ef, 0x03213b53, 0x0282877c, 0x02cbea8f, 0x030ba856, 0x0027baa5}}}, + {X: Field{[10]uint32{0x004eba94, 0x00d82f3e, 0x02a355d7, 0x0107a6af, 0x0364c4c1, 0x02058f7c, 0x019a7ab9, 0x01eb5496, 0x0195d80c, 0x003f62a7}}, Y: Field{[10]uint32{0x03b1030c, 0x035f5cf7, 0x01a713e2, 0x03691eff, 0x03a30377, 0x02b9ff4c, 0x032e2688, 0x014ecd66, 0x03021009, 0x002a7ec5}}}, + {X: Field{[10]uint32{0x01db0a7d, 0x02dbc9be, 0x038f8f2c, 0x0316dec2, 0x026e84ac, 0x02cb202f, 0x03c339a8, 0x023c8d67, 0x01f309f2, 0x0029cc8b}}, Y: Field{[10]uint32{0x02db6be6, 0x028ba85b, 0x00885c12, 0x0384c5c5, 0x03095f40, 0x03c4be95, 0x01b7f5b2, 0x025405ff, 0x029d2174, 0x0008bdbf}}}, + {X: Field{[10]uint32{0x03052d36, 0x00f1f932, 0x01ffc82c, 0x006ba95a, 0x00bd4c46, 0x03dfc3c6, 0x02104ddb, 0x0199258e, 0x010f336a, 0x0020aa30}}, Y: Field{[10]uint32{0x01f1dd0c, 0x0384a1e5, 0x038c118f, 0x03533411, 0x015e5c31, 0x02dc6d9c, 0x010501cc, 0x01c89e2e, 0x00a2c0ef, 0x001cdf3b}}}, + {X: Field{[10]uint32{0x0315d6df, 0x01e12a53, 0x00516c54, 0x02dd6e97, 0x026c4ef2, 0x01698309, 0x03cd12f0, 0x03de5401, 0x01b68e3b, 0x0026d434}}, Y: Field{[10]uint32{0x03ddd8fd, 0x01bfadf2, 0x02778737, 0x009cb51f, 0x02403fff, 0x03c63549, 0x003fd2a4, 0x01db6340, 0x0109b791, 0x000abf23}}}, + {X: Field{[10]uint32{0x02e08d32, 0x021657ee, 0x00b80671, 0x035fba0b, 0x02b8dcb9, 0x0074c15a, 0x023a8228, 0x008ff9f7, 0x03ddc8b4, 0x000fe420}}, Y: Field{[10]uint32{0x028fa758, 0x0257ff3c, 0x01376e21, 0x01b48330, 0x0081f77f, 0x03e80868, 0x020ed90a, 0x007646a7, 0x0152fd51, 0x0032c4f0}}}, + {X: Field{[10]uint32{0x02167faf, 0x0041d3bc, 0x00bfadbd, 0x00196754, 0x03c92317, 0x024999b2, 0x02ff6bd5, 0x0306895b, 0x01c1ee17, 0x0031d721}}, Y: Field{[10]uint32{0x00023a52, 0x02bc5a50, 0x00c8596d, 0x005b53df, 0x01bd698a, 0x0191fd23, 0x00ca8922, 0x010275d7, 0x02be5e09, 0x0006ad3a}}}, + {X: Field{[10]uint32{0x00656045, 0x02355da6, 0x03fb95c6, 0x00acf52d, 0x0060ea8e, 0x03deab5f, 0x010cf0d2, 0x03d74ed3, 0x03eaf8a0, 0x00314d07}}, Y: Field{[10]uint32{0x00e88915, 0x034eae5d, 0x023986e6, 0x035535c4, 0x02dc48a4, 0x009aae60, 0x00fa422a, 0x016e7e92, 0x00e9007e, 0x00257e7d}}}, + {X: Field{[10]uint32{0x00c2d89b, 0x01e80c98, 0x027fd896, 0x02ddd4b5, 0x02220852, 0x01c17748, 0x02bd4c68, 0x025f8354, 0x023e2a89, 0x0020eb36}}, Y: Field{[10]uint32{0x03c31df0, 0x03a5de46, 0x00e8e330, 0x00ef752e, 0x030a77cd, 0x025c45d5, 0x01b55809, 0x02e945fd, 0x02e1d655, 0x0037386e}}}, + {X: Field{[10]uint32{0x0025237b, 0x009e6cc0, 0x039625bd, 0x01c5b174, 0x00f1c0d5, 0x00a75653, 0x01c4164e, 0x0241d16e, 0x01468b29, 0x0016e064}}, Y: Field{[10]uint32{0x03625d8e, 0x0227d2bd, 0x034fcf69, 0x0329c6e8, 0x011c48d2, 0x00207cd6, 0x0188daab, 0x0377eafb, 0x02a03fdd, 0x00330d8d}}}, + {X: Field{[10]uint32{0x003b0e6c, 0x0241178b, 0x037219b8, 0x01934e35, 0x0332f5f6, 0x01984139, 0x00417961, 0x00e3bfe0, 0x0122214e, 0x00191de0}}, Y: Field{[10]uint32{0x0211a32d, 0x033e6111, 0x02f81974, 0x000e352b, 0x00d8b632, 0x02e29f47, 0x02afc4a0, 0x03bb1ee3, 0x00497e15, 0x000ca73c}}}, + {X: Field{[10]uint32{0x02f12323, 0x0032e7c6, 0x0017c43d, 0x0275b684, 0x002b475a, 0x02bba199, 0x01099099, 0x018bd1e5, 0x026afe57, 0x003b5360}}, Y: Field{[10]uint32{0x03e48e78, 0x00c6defd, 0x02274d05, 0x02696510, 0x01c4d88c, 0x02b1e467, 0x0296f928, 0x0297bb20, 0x01be3faf, 0x00231be0}}}, + {X: Field{[10]uint32{0x01109c4a, 0x01bad033, 0x02fe97a0, 0x00ad57de, 0x024d82ac, 0x011bf586, 0x016f5513, 0x03b30eb3, 0x0124419a, 0x000e2d0a}}, Y: Field{[10]uint32{0x03e05583, 0x032e4adc, 0x02b07b5a, 0x01a28b39, 0x02de49d7, 0x03cd669a, 0x030965a1, 0x00bdceca, 0x00962feb, 0x001fd0b0}}}, + {X: Field{[10]uint32{0x02138911, 0x02b0ba60, 0x016e3446, 0x018893c8, 0x01bb2a8f, 0x020fa185, 0x034cf701, 0x02529ed0, 0x00a8d8bb, 0x0030f2b5}}, Y: Field{[10]uint32{0x0282765e, 0x023b4e1c, 0x01b2759a, 0x00bbc6c9, 0x01420e37, 0x00b738e8, 0x0342ce38, 0x025d9081, 0x02278cad, 0x003d926f}}}, + {X: Field{[10]uint32{0x00bd6538, 0x02239295, 0x01a9e555, 0x015cd964, 0x00d9212e, 0x038faa7b, 0x03ae40dc, 0x00dbf553, 0x03f4d3d2, 0x000b5023}}, Y: Field{[10]uint32{0x00e815b7, 0x02816d43, 0x021324b9, 0x01c5616a, 0x0285e2a1, 0x00a66fbd, 0x02284bf0, 0x00a81af1, 0x01f0e869, 0x003565ab}}}, + {X: Field{[10]uint32{0x0233c854, 0x02dfaa9e, 0x03daebaf, 0x028e8f1b, 0x03d67423, 0x00fe223a, 0x0290cf81, 0x0097eddb, 0x036d247f, 0x003b9eb7}}, Y: Field{[10]uint32{0x027a8fb4, 0x03bf0754, 0x01801dea, 0x01c5e278, 0x01143f68, 0x01505a27, 0x010dd9ef, 0x03dc15b0, 0x004b4ae8, 0x00381dc6}}}, + {X: Field{[10]uint32{0x01144b34, 0x0047cf80, 0x0064b7c8, 0x028df26a, 0x01dd5d37, 0x01317a27, 0x011151dc, 0x02b284f6, 0x03c8a9ff, 0x000be515}}, Y: Field{[10]uint32{0x035e221d, 0x018d3839, 0x01cfbb40, 0x033acf4f, 0x02787120, 0x035bf122, 0x015407e1, 0x0355ce8a, 0x00489093, 0x003ad326}}}, + {X: Field{[10]uint32{0x03fec294, 0x00311bad, 0x01c277b3, 0x020fbd4c, 0x03601204, 0x03f86378, 0x023478ce, 0x00560873, 0x02b8a0f1, 0x0034fccc}}, Y: Field{[10]uint32{0x030b2155, 0x0085786e, 0x00f9f323, 0x0243bc4d, 0x01c8968b, 0x030dca50, 0x02f1c019, 0x01e18746, 0x01b25d71, 0x003a9d6e}}}, + {X: Field{[10]uint32{0x02152b91, 0x0337c7e3, 0x02f7e9a4, 0x02199ad4, 0x035f3ddb, 0x03bcdb75, 0x021fcd86, 0x016ab4d4, 0x00d338b0, 0x00060d02}}, Y: Field{[10]uint32{0x0241218c, 0x00d54dc5, 0x018095de, 0x01339126, 0x00210e20, 0x00326209, 0x01be21f2, 0x012b1bce, 0x01206edf, 0x0019a661}}}, + {X: Field{[10]uint32{0x0340374e, 0x02558257, 0x006863d3, 0x035b094d, 0x0321faff, 0x0273e269, 0x00f1f0ff, 0x01794eea, 0x005db114, 0x000a0ffb}}, Y: Field{[10]uint32{0x0032fefe, 0x006fa0af, 0x02f77851, 0x000f3ce6, 0x0008846e, 0x01729ba6, 0x0268e5f6, 0x015439a3, 0x023774af, 0x001c2c04}}}, + {X: Field{[10]uint32{0x0152fa62, 0x02837ef7, 0x016daf54, 0x01e5dc3f, 0x00ebc735, 0x0239f6ff, 0x03bd249d, 0x00f3e904, 0x030a4f94, 0x000339d5}}, Y: Field{[10]uint32{0x0375d41d, 0x01be73a2, 0x013907c3, 0x02260f81, 0x00bd5e5b, 0x02e8e617, 0x005bdf98, 0x02573fee, 0x014bef46, 0x0038456c}}}, + {X: Field{[10]uint32{0x038fd470, 0x02529320, 0x02b15377, 0x0055d32f, 0x01df7903, 0x03646549, 0x029f648c, 0x03b0fc49, 0x0319c8f4, 0x001fa713}}, Y: Field{[10]uint32{0x00fa5270, 0x037d73ac, 0x013e9c86, 0x0236b5af, 0x0060fafa, 0x03447d20, 0x015d6ccb, 0x03d732a1, 0x03fe8cf5, 0x003a7676}}}, + {X: Field{[10]uint32{0x00cb001b, 0x01146d19, 0x03ec23bf, 0x0131c8a8, 0x010ba04f, 0x03c8c27e, 0x007f919d, 0x016ffa9f, 0x03e60d5d, 0x0038aa6e}}, Y: Field{[10]uint32{0x02393fb0, 0x004691e1, 0x03f16984, 0x024741a9, 0x03d1925b, 0x039cb2dd, 0x0125bd67, 0x01ab1de2, 0x00e1c3cd, 0x003905df}}}, + {X: Field{[10]uint32{0x01271012, 0x0264009d, 0x00265e70, 0x006c5563, 0x00f55e64, 0x00aa5264, 0x03bf37d4, 0x03bd4390, 0x02a43e17, 0x00141144}}, Y: Field{[10]uint32{0x021ed18b, 0x029274b9, 0x0381b742, 0x02e5a265, 0x011f21c4, 0x02387cb3, 0x00b1f41e, 0x00eb3cb5, 0x03d857ba, 0x00255297}}}, + {X: Field{[10]uint32{0x005f850d, 0x032fa1ca, 0x03411cd5, 0x036285ec, 0x01859945, 0x029cb1c8, 0x02d1d51b, 0x00c97d2c, 0x0013a6bb, 0x0020747c}}, Y: Field{[10]uint32{0x00937193, 0x012f3177, 0x0071adce, 0x0127535c, 0x01259d3d, 0x0262c816, 0x01fe2492, 0x002154ec, 0x03b1f0c3, 0x000b574b}}}, + {X: Field{[10]uint32{0x01895022, 0x00ce0f47, 0x0387ca73, 0x0050528e, 0x01d90dd5, 0x0399b0cf, 0x02872767, 0x02099862, 0x02dfc1d2, 0x0016d9b0}}, Y: Field{[10]uint32{0x0154e0ff, 0x02d51cb5, 0x00f5449e, 0x03684b63, 0x0327fcae, 0x0101fa61, 0x017267b7, 0x0255a488, 0x038e3818, 0x0026f405}}}, + {X: Field{[10]uint32{0x00381186, 0x03e1a208, 0x00597afa, 0x0366bd63, 0x0399b583, 0x036ffe2a, 0x012d544b, 0x0178e36f, 0x030e98ec, 0x002bad7d}}, Y: Field{[10]uint32{0x0184427b, 0x02b705cd, 0x01a052e7, 0x01cc3cbd, 0x01691b09, 0x00cdb908, 0x00b76929, 0x029c37c2, 0x02b0d25c, 0x001862f5}}}, + {X: Field{[10]uint32{0x0105052e, 0x02a60849, 0x0353a707, 0x0329dab5, 0x02557679, 0x01ea700a, 0x0361e3c6, 0x0250ee11, 0x02ffe841, 0x0002ca27}}, Y: Field{[10]uint32{0x0079992c, 0x02e743fa, 0x01e330cf, 0x00e17974, 0x00530ed7, 0x0318920b, 0x034f895d, 0x018aa14e, 0x01f0c218, 0x0001ea60}}}, + {X: Field{[10]uint32{0x0219291c, 0x02f4d5bd, 0x01200f81, 0x005f9138, 0x003f5859, 0x03f4a0a2, 0x00c8360c, 0x006679ac, 0x01458b12, 0x002aeb8e}}, Y: Field{[10]uint32{0x01753f28, 0x02dd7bed, 0x02934233, 0x02ded99f, 0x000b2a81, 0x011a6c1a, 0x03be30b2, 0x01a717a0, 0x03cdb3d0, 0x002b6c8e}}}, + {X: Field{[10]uint32{0x01fbacaa, 0x02720255, 0x03013941, 0x02323646, 0x011e0f65, 0x0063aca7, 0x02c224a5, 0x01696a06, 0x03a6485b, 0x0012a560}}, Y: Field{[10]uint32{0x00e8dbca, 0x00558c6d, 0x037decea, 0x00466dec, 0x00803ecf, 0x01dda36d, 0x02375a8a, 0x010bd7b7, 0x009ee3c8, 0x0036000f}}}, + {X: Field{[10]uint32{0x00ebc169, 0x00404084, 0x017ae3a2, 0x0305183c, 0x02ea236a, 0x012ac367, 0x03cf4654, 0x03df2d97, 0x030edba6, 0x00354bd8}}, Y: Field{[10]uint32{0x030d26d0, 0x0304f84d, 0x003d9145, 0x003106f2, 0x0368e21a, 0x02801714, 0x01bea50d, 0x00ee20f9, 0x03489fa9, 0x00084555}}}, + {X: Field{[10]uint32{0x02dd6a4d, 0x00384826, 0x029bf8d1, 0x018cd6f2, 0x01c74a2a, 0x00b9307a, 0x0050fc05, 0x016163d7, 0x023782c7, 0x0002f714}}, Y: Field{[10]uint32{0x0034f189, 0x01010d9a, 0x0323e585, 0x00ef0755, 0x0312ff02, 0x02fd4a74, 0x014efbaf, 0x01d9a388, 0x01f87463, 0x002aec76}}}, + {X: Field{[10]uint32{0x019ad087, 0x038244b9, 0x00e8626e, 0x005a3c4f, 0x0288156d, 0x03ad859e, 0x0364e476, 0x02aae0ee, 0x02338bf0, 0x00111dc2}}, Y: Field{[10]uint32{0x0360a55c, 0x0170cf7b, 0x01b99c96, 0x008edca4, 0x036a3abd, 0x030b5915, 0x0393a895, 0x0102f2cc, 0x00f12e9c, 0x0016d64c}}}, + {X: Field{[10]uint32{0x015e1679, 0x00b64914, 0x021c83e3, 0x02363ba3, 0x02650310, 0x00f8d99c, 0x01ac2032, 0x012bb8c6, 0x03322e40, 0x002c579e}}, Y: Field{[10]uint32{0x01997e7a, 0x00f3abcf, 0x03d57a87, 0x00961cd1, 0x005ced5c, 0x001e5bd4, 0x002ed565, 0x02ca457e, 0x00190bbf, 0x001491aa}}}, + {X: Field{[10]uint32{0x01b00f22, 0x02f66bb7, 0x0019027b, 0x00235781, 0x01665ae1, 0x0287077e, 0x0050f758, 0x017343cb, 0x01570522, 0x00287b5d}}, Y: Field{[10]uint32{0x02791ee2, 0x0049dd9a, 0x001a13d2, 0x001024ca, 0x02d71dbd, 0x02143b40, 0x017e7464, 0x021d21ee, 0x005dad9f, 0x000f20c5}}}, + {X: Field{[10]uint32{0x01918af5, 0x022becc7, 0x037a23cf, 0x032708e8, 0x03479e9e, 0x03181603, 0x03fc43c2, 0x03183f66, 0x03616a1b, 0x003a2abc}}, Y: Field{[10]uint32{0x0279827c, 0x02dbc9e7, 0x03d3ec89, 0x000e96b0, 0x009ab9c3, 0x02e68356, 0x0141041a, 0x0319c9f8, 0x03b64a37, 0x001b39a4}}}, + {X: Field{[10]uint32{0x014c20a3, 0x00ea8dc1, 0x01b76c5a, 0x010ce28f, 0x020759c0, 0x0061e9b5, 0x024a4ef6, 0x01798d4a, 0x00cd2c85, 0x001771be}}, Y: Field{[10]uint32{0x026f4838, 0x01c05193, 0x03f0fbb8, 0x03d4b9a9, 0x000fe9f5, 0x0307620d, 0x031d1bc7, 0x02a6a359, 0x03428593, 0x003d80b0}}}, + {X: Field{[10]uint32{0x0342f3a6, 0x0281f2da, 0x0326a5f1, 0x0081186b, 0x00f65636, 0x00aa9227, 0x02063ef2, 0x0362bda2, 0x031167be, 0x0018cc9c}}, Y: Field{[10]uint32{0x034424a6, 0x0032e06d, 0x01f1a3ea, 0x00026a46, 0x02bf94a7, 0x01874f95, 0x00ca0367, 0x004c83c8, 0x03b22070, 0x002e3df0}}}, + {X: Field{[10]uint32{0x00080263, 0x008c3e52, 0x020d3535, 0x002b5e62, 0x03ad66e5, 0x03a19536, 0x005c2017, 0x00ece08c, 0x01259a39, 0x00229036}}, Y: Field{[10]uint32{0x019fcaff, 0x02d747e7, 0x01d6f6a7, 0x03326a69, 0x0143f9cb, 0x031985b4, 0x03f703a5, 0x01153b75, 0x034d9849, 0x002beda9}}}, + {X: Field{[10]uint32{0x0078645a, 0x037abe08, 0x0317dcdf, 0x022f3082, 0x02a6a02c, 0x02816df7, 0x017fd3f9, 0x01082bd4, 0x010727c7, 0x0039c51c}}, Y: Field{[10]uint32{0x0217daca, 0x00513ad0, 0x03055eaa, 0x02809606, 0x01a3561b, 0x025ac13e, 0x01d5dcdc, 0x03a753fb, 0x03cbc1ed, 0x00369f59}}}, + {X: Field{[10]uint32{0x0261c82d, 0x007da725, 0x026c0cae, 0x03a24700, 0x029922bc, 0x014e54b0, 0x0242a685, 0x02e1e007, 0x011cd95f, 0x00184c4a}}, Y: Field{[10]uint32{0x0130bf01, 0x03f0410b, 0x03b89384, 0x01e44dcc, 0x0042b894, 0x02b98cae, 0x014f9898, 0x00bf5167, 0x001c1334, 0x00058387}}}, + {X: Field{[10]uint32{0x01ca4951, 0x00af3c74, 0x003bfb78, 0x02a76940, 0x02fc5e2a, 0x01e22027, 0x029bfa81, 0x011a4b42, 0x0045b676, 0x0012f13e}}, Y: Field{[10]uint32{0x00b751f0, 0x03103f04, 0x0383cefd, 0x0315fec5, 0x0164c4a7, 0x029dbb01, 0x03055ff3, 0x0349538e, 0x01cbb9c3, 0x0021c24b}}}, + {X: Field{[10]uint32{0x02be67df, 0x039bb2a8, 0x0201f698, 0x017560a8, 0x0052865b, 0x02617cd9, 0x039bff5c, 0x03a77ca7, 0x00a27bbe, 0x00116a20}}, Y: Field{[10]uint32{0x0055fabb, 0x00cae8de, 0x00eb6131, 0x01ae3ba5, 0x02a831d4, 0x02af5643, 0x0279714d, 0x01afc7bd, 0x02a8b5e4, 0x003f9269}}}, + {X: Field{[10]uint32{0x02f4f2a4, 0x03c68352, 0x000d3f21, 0x0256c854, 0x01877e54, 0x00805174, 0x016847a2, 0x00321993, 0x0238317c, 0x001aa09a}}, Y: Field{[10]uint32{0x005f4513, 0x0117e1f8, 0x0322c154, 0x002ef081, 0x02f6b83f, 0x01b9ad1e, 0x02f14e0e, 0x02098f7c, 0x014efcc9, 0x00114865}}}, + {X: Field{[10]uint32{0x026a23a9, 0x03a28d0d, 0x0075f613, 0x0379f1b3, 0x028bd860, 0x0277395c, 0x008aa1b0, 0x03dfa5b3, 0x0106f255, 0x00054d59}}, Y: Field{[10]uint32{0x00110bf3, 0x014ec700, 0x034cee3e, 0x02d38d8a, 0x03122f37, 0x03e26977, 0x01e401f1, 0x03521435, 0x03bcd744, 0x0033456a}}}, + {X: Field{[10]uint32{0x02b89b91, 0x0387283c, 0x0043a2b5, 0x02973299, 0x00cacff3, 0x00b6b0bb, 0x00651780, 0x027d7dae, 0x02aef53d, 0x003cef04}}, Y: Field{[10]uint32{0x00e00957, 0x03294246, 0x03131368, 0x017fc91f, 0x01303e91, 0x0281cdeb, 0x03d0f367, 0x0047c907, 0x036beb2e, 0x0033f534}}}, + {X: Field{[10]uint32{0x035c0fd4, 0x00a0a5cc, 0x033736f7, 0x03bd6114, 0x0122320b, 0x02ce1d92, 0x0226ef18, 0x0294dbde, 0x006dfa04, 0x001f8f23}}, Y: Field{[10]uint32{0x01f7c189, 0x01c4a134, 0x03fe9155, 0x01362339, 0x02b6a129, 0x000f008d, 0x032400b3, 0x00cdb4cc, 0x02b532a7, 0x001cba85}}}, + {X: Field{[10]uint32{0x010369d8, 0x0111822b, 0x03223d88, 0x026f5b85, 0x026943ab, 0x0214557f, 0x021c696d, 0x017f0b05, 0x03cfa057, 0x0006632f}}, Y: Field{[10]uint32{0x013cf7ae, 0x01cac985, 0x006c2f29, 0x025209e9, 0x03032159, 0x039ee8b9, 0x019fe0ef, 0x00908af9, 0x028b3095, 0x00357989}}}, + {X: Field{[10]uint32{0x03b0e5e8, 0x02c4d42b, 0x01fd63ae, 0x02a9e02c, 0x015a147c, 0x00226e43, 0x0183c089, 0x03cd6888, 0x0289b68c, 0x0007815b}}, Y: Field{[10]uint32{0x003f32b9, 0x0011cae5, 0x008379f8, 0x00e431be, 0x003e258a, 0x01b505bd, 0x02d6ff38, 0x01315f76, 0x0053abc4, 0x002e0905}}}, + {X: Field{[10]uint32{0x02faaa21, 0x031ca79c, 0x018fb3fa, 0x011339fe, 0x03d81081, 0x02991b51, 0x0173b2f1, 0x01f9fa98, 0x01748d82, 0x00371ffe}}, Y: Field{[10]uint32{0x030c4914, 0x00b9ffb9, 0x02a1aaaf, 0x001c51b6, 0x013e3d5f, 0x01105f1c, 0x038e1c5c, 0x01bc3ff2, 0x005aef4c, 0x00307f6b}}}, + {X: Field{[10]uint32{0x03d28e79, 0x027686cb, 0x00ec29a9, 0x03c2fe3e, 0x0036b2ef, 0x0337ef12, 0x0354bc11, 0x00781c14, 0x02fcc498, 0x001c6e57}}, Y: Field{[10]uint32{0x03d684cc, 0x010b31bb, 0x03fa30af, 0x02c269cd, 0x011f3695, 0x00faef14, 0x004752cc, 0x01abbb0c, 0x01976fad, 0x003f568c}}}, + {X: Field{[10]uint32{0x02542b3a, 0x01a20eb7, 0x004ae687, 0x008625c1, 0x03f6b961, 0x0096eea0, 0x033e8ffa, 0x00af5b27, 0x00af29dc, 0x0010e153}}, Y: Field{[10]uint32{0x009c6c81, 0x02d1200f, 0x03f36fd8, 0x02957072, 0x0034c5c9, 0x02893d56, 0x01e31677, 0x018cbe37, 0x01760897, 0x00158d94}}}, + {X: Field{[10]uint32{0x0027b222, 0x00bb3cb5, 0x0396145c, 0x0243ee1d, 0x00b6eff9, 0x0357f421, 0x00c9b730, 0x027e71c2, 0x0217090e, 0x0000ab7f}}, Y: Field{[10]uint32{0x03abd7ed, 0x01b66d14, 0x010cd4c8, 0x008301a5, 0x02c44398, 0x0334a244, 0x00ae425c, 0x0367188b, 0x01605d6d, 0x002d738c}}}, + {X: Field{[10]uint32{0x03a9d6f9, 0x038fa089, 0x00620471, 0x0152b8cf, 0x0209f70c, 0x02cffcc6, 0x033a5343, 0x02bcc456, 0x012c2b7e, 0x002848d1}}, Y: Field{[10]uint32{0x01e3b4eb, 0x0053337b, 0x0396e8fa, 0x029bdde7, 0x03f53e37, 0x03f15179, 0x008194aa, 0x007d10de, 0x008378a7, 0x0024cf4d}}}, + {X: Field{[10]uint32{0x02c0a6ab, 0x01b8cb33, 0x00a603d0, 0x02b9f7b3, 0x03aab166, 0x004d21cd, 0x00152176, 0x016a061b, 0x03c2ca99, 0x0026e268}}, Y: Field{[10]uint32{0x03731232, 0x02a322b9, 0x0141480b, 0x034150ed, 0x03cbea83, 0x0092b020, 0x03c48302, 0x012c4af5, 0x0301a872, 0x000a9f4d}}}, + {X: Field{[10]uint32{0x01e9e9b2, 0x01e59184, 0x032edc90, 0x00ce7b62, 0x03384b04, 0x031149ca, 0x022b9a0d, 0x035ce423, 0x0057e7d9, 0x0019375d}}, Y: Field{[10]uint32{0x023c470e, 0x00a430e0, 0x03885b29, 0x031de03b, 0x014e311d, 0x019a6626, 0x0208a723, 0x03b85bb5, 0x00aae214, 0x003aa43e}}}, + {X: Field{[10]uint32{0x03a2176c, 0x015d9f5b, 0x0150a6b3, 0x010871fd, 0x0320abba, 0x03adc721, 0x027fd714, 0x01f1af4c, 0x0031be60, 0x0016489d}}, Y: Field{[10]uint32{0x0061d598, 0x01449712, 0x03d0b870, 0x02c4b254, 0x00796da2, 0x00f3cfce, 0x03d289ea, 0x01549d96, 0x01c4071c, 0x0032dd5c}}}, + {X: Field{[10]uint32{0x015fe2c2, 0x0041bbde, 0x03bdc8c5, 0x00229c8d, 0x03843b7d, 0x024dd0d8, 0x000ddf19, 0x01ba7872, 0x01cdadb2, 0x0014f5d9}}, Y: Field{[10]uint32{0x017c287b, 0x0269016b, 0x000bec98, 0x00ec4a29, 0x00a66d4f, 0x01351454, 0x0187f819, 0x025ceddb, 0x0198eb39, 0x001eeeec}}}, + {X: Field{[10]uint32{0x03bb66af, 0x02d46695, 0x03fc16d7, 0x02426d9b, 0x010452ee, 0x03d7fdb0, 0x03a989c0, 0x00efcd48, 0x029ec16b, 0x003941f7}}, Y: Field{[10]uint32{0x03f7892a, 0x014078a3, 0x0195259a, 0x03401320, 0x0251b6d3, 0x022566b4, 0x008b3950, 0x0379b8f7, 0x002a8272, 0x0028bcbc}}}, + {X: Field{[10]uint32{0x01b4a6f2, 0x027260ce, 0x03983556, 0x01db8a95, 0x0265601d, 0x027d82de, 0x0103b8cb, 0x013eca06, 0x00c60eb8, 0x00005bd2}}, Y: Field{[10]uint32{0x0132b289, 0x023d40f7, 0x016a441d, 0x00a43d25, 0x03d827b6, 0x02dbbd13, 0x031e75d5, 0x01a0759b, 0x03848398, 0x002184ee}}}, + {X: Field{[10]uint32{0x01446056, 0x02d8ce78, 0x03af90ca, 0x00e0a8ec, 0x010bb98e, 0x00f44b61, 0x00b51323, 0x01978c9c, 0x01ae7742, 0x0019411c}}, Y: Field{[10]uint32{0x01a50306, 0x009c92a9, 0x03cda4e6, 0x00c85765, 0x01187b40, 0x00d670ce, 0x0290a62d, 0x01bf9b2b, 0x039334aa, 0x0020e39d}}}, + {X: Field{[10]uint32{0x0021dda8, 0x02ab0aaf, 0x00821559, 0x0287f5eb, 0x02348d1b, 0x026097eb, 0x010e19d6, 0x01613f32, 0x0016fa34, 0x000577a9}}, Y: Field{[10]uint32{0x00433047, 0x01c090ea, 0x01c15d40, 0x03d7517e, 0x00010fa5, 0x012f44c1, 0x012a3d28, 0x0339a3b8, 0x03f21e19, 0x00007f2a}}}, + {X: Field{[10]uint32{0x005b46e2, 0x032e81ec, 0x00751dc5, 0x001ed3df, 0x02ee9d6a, 0x00d5ee91, 0x03900878, 0x01c3b4f6, 0x00954f1f, 0x002d0ac9}}, Y: Field{[10]uint32{0x0169ed71, 0x0065a802, 0x03ec69f9, 0x02d31546, 0x034851f5, 0x00110f18, 0x0328d6da, 0x036f9b5b, 0x03eb0e0b, 0x003855c8}}}, + {X: Field{[10]uint32{0x00230f83, 0x03f15ff0, 0x00960a17, 0x01fa3894, 0x006ab10b, 0x03b26d18, 0x02b1125d, 0x02b0c476, 0x00f5c6ae, 0x00023a79}}, Y: Field{[10]uint32{0x03959ab2, 0x01db4c6a, 0x03dee645, 0x00d358a1, 0x03f1e32c, 0x0016899f, 0x03d4e53a, 0x02ede5e2, 0x0211c79f, 0x003fec38}}}, + {X: Field{[10]uint32{0x03e1ac2e, 0x0127fa4f, 0x03528295, 0x0207e012, 0x03d6f2bb, 0x0353542f, 0x027fb63b, 0x012dce18, 0x032373bd, 0x0021ef9c}}, Y: Field{[10]uint32{0x0294e1a4, 0x01087e1f, 0x00288ce8, 0x01f5d589, 0x021ae553, 0x03038956, 0x00844b2e, 0x02e6d7ff, 0x006ff147, 0x003daa46}}}, + {X: Field{[10]uint32{0x019d60f7, 0x01c9f859, 0x02c95002, 0x019abcd2, 0x01d2cfd4, 0x01722493, 0x029514ab, 0x00e1d217, 0x0161c836, 0x0010d807}}, Y: Field{[10]uint32{0x03bc2c2a, 0x039d6d60, 0x02b099a5, 0x00d999e7, 0x00113335, 0x02316eef, 0x028034b8, 0x032536cc, 0x00007c09, 0x0021e470}}}, + {X: Field{[10]uint32{0x02b49d0d, 0x02abe8ca, 0x020aca0d, 0x0250a895, 0x026902e3, 0x0299abe5, 0x01f0bcbb, 0x01c714d9, 0x0180f830, 0x000d06c5}}, Y: Field{[10]uint32{0x00877b20, 0x00d38519, 0x01d941c0, 0x0386e840, 0x037e8fdb, 0x0119271b, 0x03564d2d, 0x024099ff, 0x0313c549, 0x0012e616}}}, + {X: Field{[10]uint32{0x014dad95, 0x009c5c7c, 0x012eb576, 0x02a39592, 0x0033ac1a, 0x01e7ec55, 0x03181e2c, 0x00e90df1, 0x00b3ce4a, 0x0005d79f}}, Y: Field{[10]uint32{0x01135b0d, 0x0363f0a0, 0x01d9ce92, 0x01558f29, 0x02581301, 0x00da5bd0, 0x038703f9, 0x03d4bbf3, 0x01a87834, 0x000c7398}}}, + {X: Field{[10]uint32{0x007165ad, 0x0391704c, 0x03a98249, 0x02553202, 0x0089c1e4, 0x0328fb2b, 0x033c8482, 0x0071878e, 0x00cc64e6, 0x0016b50c}}, Y: Field{[10]uint32{0x0251c791, 0x033b3aa4, 0x03fbeac7, 0x01b86b08, 0x009ead5f, 0x016a2e17, 0x03ca083c, 0x004ef0c5, 0x0060505c, 0x002fa8a8}}}, + {X: Field{[10]uint32{0x01b8b837, 0x03fbe983, 0x009f28ae, 0x038f75f4, 0x01080f0c, 0x01fea130, 0x00602df0, 0x038c6262, 0x00d96dac, 0x00107738}}, Y: Field{[10]uint32{0x02827928, 0x03fe3434, 0x02e333cd, 0x0247e137, 0x02088500, 0x0154c8ed, 0x02635ea8, 0x01ba7225, 0x003fed9a, 0x001d258b}}}, + {X: Field{[10]uint32{0x01961bcc, 0x0330508e, 0x03e5ba23, 0x017810cb, 0x039aed2d, 0x00819d90, 0x03c1dc25, 0x01376840, 0x00988710, 0x00297bd1}}, Y: Field{[10]uint32{0x0122db3a, 0x02c3587c, 0x009f0696, 0x0099d96c, 0x02a165c5, 0x0194ee9e, 0x02ecc328, 0x038364f9, 0x003ea363, 0x00072f3e}}}, + {X: Field{[10]uint32{0x033a9d45, 0x015c8d7e, 0x01e626db, 0x00b8b5b5, 0x0218225f, 0x014a8b2f, 0x03df68b8, 0x01800ce2, 0x02ce9ad4, 0x0013689b}}, Y: Field{[10]uint32{0x01fae659, 0x037a427a, 0x029c73d3, 0x001b9ee8, 0x0061b0a8, 0x030f587d, 0x0210e2d1, 0x011aff31, 0x02637ab5, 0x003442d6}}}, + {X: Field{[10]uint32{0x018f4763, 0x03b71a7e, 0x0111129d, 0x0214479a, 0x03e9d955, 0x0286693d, 0x00d8eb16, 0x01023922, 0x026f53d2, 0x001b9887}}, Y: Field{[10]uint32{0x00ea1a19, 0x017f540f, 0x0048e4bb, 0x00b2d4b1, 0x007b945a, 0x00d0b1ef, 0x01ad4779, 0x02c4c4d0, 0x02f273e1, 0x001ec523}}}, + {X: Field{[10]uint32{0x038be83b, 0x01553549, 0x02ab6da4, 0x002a3c20, 0x0066bae2, 0x028e56a4, 0x017ea758, 0x01d1a66d, 0x03645bed, 0x003aebd5}}, Y: Field{[10]uint32{0x03cfbba7, 0x02ae782f, 0x02028650, 0x01298049, 0x02d91631, 0x0227b8f9, 0x029ea943, 0x00c0cd78, 0x00e06c65, 0x001611fd}}}, + {X: Field{[10]uint32{0x0310182f, 0x03fd8d4c, 0x0017a6a6, 0x028450e3, 0x02faa38c, 0x014ac574, 0x0355dbf0, 0x018cb492, 0x0271711b, 0x00303e22}}, Y: Field{[10]uint32{0x010676ff, 0x027913b3, 0x012481c5, 0x02605069, 0x03fb2e98, 0x002020be, 0x0211eec4, 0x01c08619, 0x014d16c0, 0x000b2feb}}}, + {X: Field{[10]uint32{0x035c6350, 0x00a1ec16, 0x00ae01b5, 0x02dcf3dc, 0x02dc1cdd, 0x018a48b1, 0x0244fbf2, 0x02526318, 0x001884b7, 0x001766db}}, Y: Field{[10]uint32{0x017fdf1d, 0x0144431f, 0x0297e5e8, 0x02316dab, 0x0118db17, 0x02d53321, 0x03e1644b, 0x0058b12a, 0x031d2f2b, 0x000ca3a0}}}, + {X: Field{[10]uint32{0x0202e21c, 0x03127c13, 0x00016654, 0x02555641, 0x03e57d75, 0x008e94ed, 0x03214c63, 0x01b9a753, 0x020f37ed, 0x0034744d}}, Y: Field{[10]uint32{0x01d15e4e, 0x007ce51b, 0x02b6a152, 0x0351b248, 0x006eba68, 0x002a2c40, 0x01594144, 0x02d4fe51, 0x0293c6c9, 0x00189fba}}}, + {X: Field{[10]uint32{0x02411731, 0x01a732fb, 0x00703e49, 0x020d959d, 0x02ace29a, 0x01ec6cac, 0x02cfa189, 0x00ebd562, 0x03cbf102, 0x003bf261}}, Y: Field{[10]uint32{0x01740c69, 0x026f10bd, 0x01dbbe15, 0x03f27d59, 0x02e38242, 0x02f3bd0c, 0x02429863, 0x002fb1c5, 0x0265d379, 0x0006569a}}}, + {X: Field{[10]uint32{0x00284ff0, 0x0243ea86, 0x02b01310, 0x01ee0fbd, 0x00968d1d, 0x00e19120, 0x0388b787, 0x03cef586, 0x0397163d, 0x003cc09a}}, Y: Field{[10]uint32{0x0211509b, 0x015ab06d, 0x030e9a6c, 0x01321359, 0x035f8764, 0x0167c1bf, 0x0281615d, 0x018eaefc, 0x02616823, 0x0005df0e}}}, + {X: Field{[10]uint32{0x002c5873, 0x0082435a, 0x0030b562, 0x03e5a3fe, 0x020deeec, 0x03273fd1, 0x02c92c68, 0x016da64a, 0x035f123b, 0x00174d3f}}, Y: Field{[10]uint32{0x01955ac8, 0x02d989b1, 0x02ff3d49, 0x03ea03e2, 0x0025443e, 0x023ac586, 0x0204df14, 0x0281950c, 0x039c8eab, 0x000b4682}}}, + {X: Field{[10]uint32{0x028447f4, 0x019ca011, 0x030bbdac, 0x0074c6a6, 0x00e0ee59, 0x010c2332, 0x01da0658, 0x01491f0e, 0x021794a9, 0x0032fe6e}}, Y: Field{[10]uint32{0x00461736, 0x009e5ab4, 0x005381b8, 0x0075d3c0, 0x03405810, 0x00d044b4, 0x025fade9, 0x02ba8408, 0x00c310fe, 0x001526c6}}}, + {X: Field{[10]uint32{0x03dcd31f, 0x032b3531, 0x03a5379a, 0x02e0da35, 0x008e7747, 0x015e9cd1, 0x01982a6b, 0x00986efd, 0x01ba09e2, 0x0024825d}}, Y: Field{[10]uint32{0x00b46dbd, 0x039d8e2b, 0x03dcb434, 0x012f5516, 0x016367d2, 0x0255040c, 0x0221f5ae, 0x01543424, 0x010881af, 0x003a5781}}}, + {X: Field{[10]uint32{0x03eeca64, 0x033c4c81, 0x000ff33f, 0x0048ef06, 0x00391323, 0x02d3c974, 0x02cdce82, 0x02d57649, 0x02e46fdc, 0x002056ca}}, Y: Field{[10]uint32{0x01b8c971, 0x022d3f92, 0x01512c96, 0x021d57c9, 0x0199285b, 0x0194462e, 0x01e2e268, 0x018dd23c, 0x03c67d88, 0x0018bd8d}}}, + {X: Field{[10]uint32{0x03e0b16e, 0x00f1153d, 0x019260de, 0x0097688c, 0x0227ca80, 0x02934e1f, 0x02a86397, 0x0352e8c3, 0x02c28e28, 0x0006ee69}}, Y: Field{[10]uint32{0x00d7ab93, 0x03bf1277, 0x01a94f56, 0x0355040d, 0x03206349, 0x031f8051, 0x004265ea, 0x005c7206, 0x00165e32, 0x002832f0}}}, + {X: Field{[10]uint32{0x0268bc22, 0x00cdf1b6, 0x00c3d34d, 0x02e9e3ad, 0x019c05a4, 0x03789e3c, 0x019d29dd, 0x020faac2, 0x03fedffd, 0x001bc054}}, Y: Field{[10]uint32{0x03f0c626, 0x00147e79, 0x02f824d5, 0x019c3838, 0x039fc499, 0x0288c7ca, 0x00041d3a, 0x00fe167d, 0x000d3501, 0x00294cb4}}}, + {X: Field{[10]uint32{0x0320258a, 0x032dea46, 0x028552e9, 0x039b1b6b, 0x02ed23e5, 0x006fd556, 0x000d3847, 0x01de9034, 0x033b3bee, 0x000d153d}}, Y: Field{[10]uint32{0x00d18dde, 0x023e54b6, 0x0128f23a, 0x00e8fd03, 0x03992683, 0x01af7b70, 0x025bcaa0, 0x007a3cff, 0x0046cfdf, 0x0024b082}}}, + {X: Field{[10]uint32{0x030e9a86, 0x024c5f08, 0x01f02fc5, 0x021903b7, 0x001dfcf6, 0x0354a00c, 0x00c2616a, 0x01ad386e, 0x03c9a360, 0x000d9e01}}, Y: Field{[10]uint32{0x016ecae6, 0x012904b0, 0x01a14830, 0x00bc00a0, 0x03fdc4f9, 0x00902572, 0x01ba14c1, 0x03b39c0f, 0x032fa2bb, 0x0007c08f}}}, + {X: Field{[10]uint32{0x001af62b, 0x02965048, 0x00909acb, 0x0105d7f1, 0x0101b825, 0x03112e05, 0x034e06f0, 0x03dabc4d, 0x01c39891, 0x0023b13f}}, Y: Field{[10]uint32{0x034e5f1b, 0x015b3dfb, 0x01751137, 0x033d7f0a, 0x00fe067b, 0x00f1e63e, 0x01ca0e50, 0x03621e0f, 0x02e5cac2, 0x000b71b2}}}, + {X: Field{[10]uint32{0x0178a263, 0x026c1aa4, 0x03842872, 0x014546e2, 0x03ffa085, 0x017ea4df, 0x0142f91e, 0x0093e451, 0x026d4c5b, 0x00173092}}, Y: Field{[10]uint32{0x037da472, 0x027573fe, 0x00b98da1, 0x02a0f76f, 0x02ca8d55, 0x0067e87f, 0x0338a4e4, 0x00687efe, 0x02358153, 0x002c76a1}}}, + {X: Field{[10]uint32{0x03599e9f, 0x013f1378, 0x02a21913, 0x01414314, 0x0292602a, 0x02a04374, 0x0244a6cd, 0x00170ea5, 0x0126c039, 0x0020e416}}, Y: Field{[10]uint32{0x0246089a, 0x0038315e, 0x01e16cf2, 0x022c8767, 0x00909429, 0x02a0dd8e, 0x00b115ea, 0x019e4a88, 0x020fe8af, 0x0010a4c9}}}, + {X: Field{[10]uint32{0x0189b6c7, 0x02ca6159, 0x00822481, 0x0050d2b9, 0x02e8fa6c, 0x034e1e3e, 0x0204ac30, 0x03a777e0, 0x017e4721, 0x002512c2}}, Y: Field{[10]uint32{0x03d6ddf6, 0x03d2e5a6, 0x00e8ee8a, 0x013011d9, 0x011525bd, 0x039d16e6, 0x03796431, 0x02c257e2, 0x016530e9, 0x0017f11d}}}, + {X: Field{[10]uint32{0x0023b73d, 0x017aefcd, 0x0030107b, 0x00797ea4, 0x0117327a, 0x018e9ccc, 0x00aaf04a, 0x0304d387, 0x023fcfb7, 0x002ac2d2}}, Y: Field{[10]uint32{0x0296c9da, 0x00efc6b3, 0x00781376, 0x034de170, 0x02b84944, 0x02bb334e, 0x038c92cf, 0x02ea2b35, 0x0263a5bb, 0x003879e4}}}, + {X: Field{[10]uint32{0x03e8b85f, 0x00f7fb83, 0x010bcf80, 0x0361efc2, 0x031aa2c3, 0x0168b939, 0x03f7fbf0, 0x00ac3bde, 0x00b5220f, 0x0015e8d1}}, Y: Field{[10]uint32{0x01a7d04e, 0x0398e6ec, 0x00f10576, 0x00f059e3, 0x01a9e11a, 0x00e9caa5, 0x00c9f135, 0x02588392, 0x010e08ef, 0x003e0adf}}}, + {X: Field{[10]uint32{0x00d81ac5, 0x02498ff2, 0x0188da1a, 0x025bb118, 0x033608e3, 0x033c3d3f, 0x038c4c95, 0x01f13147, 0x021a800b, 0x001b814f}}, Y: Field{[10]uint32{0x015e7473, 0x0363124e, 0x03dbadc3, 0x01e5c80b, 0x0362e365, 0x03390a30, 0x035384ff, 0x008f2786, 0x0298e3c8, 0x00218e27}}}, + {X: Field{[10]uint32{0x02485cb7, 0x03ab8973, 0x03f1c59d, 0x03b1fc20, 0x0148a289, 0x0159ed51, 0x00d4a7c7, 0x01c5fecc, 0x00061804, 0x0018b5d9}}, Y: Field{[10]uint32{0x0268be84, 0x03f2506d, 0x020fc4ca, 0x00b6989a, 0x03d1509b, 0x011c3ed4, 0x031d57b9, 0x007e3614, 0x014b661d, 0x003c758c}}}, + {X: Field{[10]uint32{0x0129250f, 0x011fcc77, 0x006589e3, 0x00020b4d, 0x025c4d08, 0x02f49126, 0x00cf1080, 0x02caaa0c, 0x00f2219f, 0x003976ca}}, Y: Field{[10]uint32{0x008bd453, 0x023f9a22, 0x00b248e5, 0x034bcd7e, 0x03324fcf, 0x02b512db, 0x03b7012e, 0x01f756e8, 0x024632f9, 0x0030a5b9}}}, + {X: Field{[10]uint32{0x01b32729, 0x02057c42, 0x00ab23fe, 0x026f0a65, 0x03733ec8, 0x03ffe0c7, 0x013177c9, 0x00379229, 0x03e9a3d0, 0x0011c96c}}, Y: Field{[10]uint32{0x01f8e778, 0x0279a26e, 0x02e12d4a, 0x0334a5e7, 0x02324127, 0x0120aed4, 0x01fdb741, 0x03003c51, 0x0347de38, 0x002b0edd}}}, + {X: Field{[10]uint32{0x01d72b3e, 0x0278d190, 0x00569bbe, 0x017a9db8, 0x03b036b6, 0x0004f8d1, 0x00ed9187, 0x01cb9ce5, 0x03b6492c, 0x003434eb}}, Y: Field{[10]uint32{0x0202fef3, 0x010bede3, 0x03f1396f, 0x002c0bd8, 0x00bd952b, 0x0028a158, 0x0061caa0, 0x03f81d4c, 0x005b94aa, 0x000b74e9}}}, + {X: Field{[10]uint32{0x0304632c, 0x0241a3f0, 0x00b4c786, 0x03b73d2d, 0x03104143, 0x0092b3fc, 0x0385654a, 0x03215e5e, 0x0335d717, 0x001e14f9}}, Y: Field{[10]uint32{0x021efadd, 0x00d4d577, 0x00e69cb5, 0x0068524e, 0x02bae3a3, 0x01680a48, 0x0377a8fb, 0x03452b09, 0x03d9e70f, 0x00002a1c}}}, + {X: Field{[10]uint32{0x02e904a4, 0x02778ce3, 0x032ca778, 0x0325fe75, 0x02ee44e2, 0x013248d5, 0x021a01a1, 0x0371644e, 0x02b37d4f, 0x0001b6c9}}, Y: Field{[10]uint32{0x031941fb, 0x00a2ba58, 0x01b6854a, 0x02498e1a, 0x02d8adf7, 0x02612712, 0x001c409e, 0x028330a3, 0x0225bf2b, 0x00053f88}}}, + {X: Field{[10]uint32{0x032848df, 0x028bbe3a, 0x00ce699a, 0x003d8ea7, 0x02538e40, 0x01a7e90f, 0x02f7f5c6, 0x02bcf02c, 0x0069bb98, 0x002d4bc2}}, Y: Field{[10]uint32{0x0107be5a, 0x005b85e2, 0x03858bb6, 0x02329dbe, 0x028b821c, 0x00395eda, 0x03378cca, 0x01152b9e, 0x032455bc, 0x0009159a}}}, + {X: Field{[10]uint32{0x0197b448, 0x007e4e80, 0x037e4c1e, 0x03004e13, 0x03234152, 0x01c3e9f0, 0x034a9e99, 0x02bc0fac, 0x01e11ee6, 0x00218537}}, Y: Field{[10]uint32{0x0372f3cc, 0x0134f31e, 0x02ba15e5, 0x015762e9, 0x024e5c7e, 0x008c3103, 0x0222b5ad, 0x01a1c0ae, 0x01a2ac99, 0x000a8449}}}, + {X: Field{[10]uint32{0x038c1cfa, 0x00824de4, 0x00ab2dbc, 0x03ad6743, 0x008b3308, 0x03c82f74, 0x0271c180, 0x01b96de3, 0x03ae625f, 0x00260a8d}}, Y: Field{[10]uint32{0x02a40d0c, 0x014c26ad, 0x017dc18e, 0x00af75b1, 0x032a689e, 0x02d41c2f, 0x01249e20, 0x0144a164, 0x016f00a6, 0x0019c7f8}}}, + {X: Field{[10]uint32{0x003e703a, 0x0068bf53, 0x01d9b408, 0x02bc8b2a, 0x00627a09, 0x0248c700, 0x019742fc, 0x020a73b2, 0x030526b4, 0x001afaa4}}, Y: Field{[10]uint32{0x019a6cc1, 0x00ac1652, 0x014832b0, 0x0043116f, 0x01d7541f, 0x00650f9a, 0x0344d14b, 0x01ed307c, 0x002a5451, 0x002bb150}}}, + {X: Field{[10]uint32{0x02583edb, 0x01ef4a65, 0x019200ba, 0x026481cc, 0x0054016a, 0x01b445ac, 0x00188b33, 0x0121f9f3, 0x03818694, 0x002d5c91}}, Y: Field{[10]uint32{0x03845cdc, 0x03d8a19d, 0x03ec6208, 0x02ced35f, 0x011d278f, 0x02f163ff, 0x018262de, 0x0292f4f5, 0x01861f80, 0x00172ef4}}}, + {X: Field{[10]uint32{0x017c5412, 0x03a78b66, 0x01bb62e0, 0x00d1c13b, 0x024df5a5, 0x022b14e4, 0x02f4f531, 0x003a45e1, 0x02627ba0, 0x003786b7}}, Y: Field{[10]uint32{0x022021e0, 0x03fba76b, 0x01a8e4bf, 0x039b8742, 0x03a9d003, 0x007019cf, 0x02dc15a4, 0x00efeff1, 0x02c50bf2, 0x001fbd21}}}, + {X: Field{[10]uint32{0x0398c0a0, 0x01b4dbcc, 0x0166dd47, 0x0262f004, 0x03337203, 0x02e03875, 0x01e465df, 0x0071067e, 0x017cb172, 0x000dce29}}, Y: Field{[10]uint32{0x030c22f5, 0x01529e2d, 0x00bfd118, 0x01b14a49, 0x0243df56, 0x03610e16, 0x028a629a, 0x02c5b5b4, 0x03b21662, 0x00387c96}}}, + {X: Field{[10]uint32{0x0281885d, 0x00001b9e, 0x02e37694, 0x02e2dd40, 0x021955fe, 0x0377db6a, 0x01575f12, 0x0048e6a1, 0x01c16b2a, 0x00132b88}}, Y: Field{[10]uint32{0x00dc99c3, 0x03d5972d, 0x019e237a, 0x026ca755, 0x0225fa2c, 0x020a0cac, 0x0271e89c, 0x0183609d, 0x00553886, 0x000abffa}}}, + {X: Field{[10]uint32{0x00c2bd7b, 0x00bebe37, 0x02039573, 0x03b86ea9, 0x0397bfa7, 0x016f30e9, 0x037cf558, 0x002f8db8, 0x021fba8a, 0x00131446}}, Y: Field{[10]uint32{0x025651af, 0x029172ac, 0x0372d8a6, 0x01a621f0, 0x03abb272, 0x02575a0c, 0x0000fd4a, 0x02affc8d, 0x03945c6b, 0x003a9a7d}}}, + {X: Field{[10]uint32{0x005a7e29, 0x0145e79d, 0x01f8320c, 0x012cae94, 0x02c2e4a4, 0x03a4db02, 0x007c25ad, 0x010dc098, 0x00c4323b, 0x00360476}}, Y: Field{[10]uint32{0x03c05345, 0x037652b9, 0x0293c3c4, 0x00fda7e7, 0x0346c6df, 0x02d2438e, 0x020aeabc, 0x011fe036, 0x00a217bf, 0x001bfe5c}}}, + {X: Field{[10]uint32{0x02c43eee, 0x03897985, 0x01b0b1ca, 0x02b87ec2, 0x0233db68, 0x004ed7fe, 0x01bbafdf, 0x02abff8e, 0x01d3b5e5, 0x000407ad}}, Y: Field{[10]uint32{0x02c5ddb3, 0x00698eae, 0x00f4a163, 0x00e4d383, 0x00a49709, 0x02c0c483, 0x03a1c96e, 0x01c96981, 0x01149867, 0x00275a95}}}, + {X: Field{[10]uint32{0x02480519, 0x0073e2dc, 0x03968de2, 0x01c3bfe3, 0x01ecdc7f, 0x018bfab4, 0x001f21f0, 0x03917f85, 0x0152b8dd, 0x00227ac4}}, Y: Field{[10]uint32{0x0297b447, 0x036c1f2d, 0x0195b41f, 0x02a18fef, 0x00cb6703, 0x00af11dc, 0x02c99d7f, 0x038f55a7, 0x03c43181, 0x003e28cd}}}, + {X: Field{[10]uint32{0x02d0dc16, 0x03a59366, 0x030cdbd1, 0x03ada379, 0x0149d95e, 0x0154066a, 0x03d8f1e4, 0x0291349c, 0x03f3f48e, 0x0014f58c}}, Y: Field{[10]uint32{0x011645fe, 0x03f4cef3, 0x023af48f, 0x03b923f9, 0x028e8ff4, 0x039b6df9, 0x03fe6f32, 0x033c6cfd, 0x0176964d, 0x0006c9bb}}}, + {X: Field{[10]uint32{0x00d9be6a, 0x023e57f6, 0x02d1a92f, 0x012e0e62, 0x006ce3db, 0x0273b6d9, 0x0294d26b, 0x00441966, 0x01104989, 0x0037841a}}, Y: Field{[10]uint32{0x02b43d32, 0x03644cd7, 0x03e7b5b9, 0x039b73e0, 0x008768a4, 0x008f5022, 0x00a3d06d, 0x0274595e, 0x0341dbd9, 0x0021d902}}}, + {X: Field{[10]uint32{0x02f5bea2, 0x005dcf1a, 0x023caf76, 0x01ed0685, 0x00cc6daa, 0x02027684, 0x0189a9a7, 0x038916b0, 0x026f0b9e, 0x00103b47}}, Y: Field{[10]uint32{0x00217b2e, 0x0330787f, 0x03adb50b, 0x00ba9c65, 0x0082bae8, 0x010c2b01, 0x02b7bdf1, 0x03ee69e3, 0x01017298, 0x003ffb45}}}, + {X: Field{[10]uint32{0x03ba15c1, 0x0046f599, 0x02dfaa3b, 0x028ca7c9, 0x001b7ab3, 0x03a94a73, 0x004d1719, 0x002e68de, 0x02ee59a2, 0x00157eaa}}, Y: Field{[10]uint32{0x002f4a65, 0x014f77c6, 0x0075c373, 0x00169f95, 0x000d7f28, 0x0391c197, 0x014771d8, 0x014f8d7b, 0x039b52ac, 0x002a7e24}}}, + {X: Field{[10]uint32{0x028af3fb, 0x02f40afe, 0x03ccba53, 0x001fc0d3, 0x00a95ac6, 0x01255b44, 0x000ca172, 0x0222bc86, 0x024e21cf, 0x002d4779}}, Y: Field{[10]uint32{0x03b7f81e, 0x02ce1b00, 0x01ac4878, 0x0066922c, 0x029b8400, 0x0399b129, 0x0399f1f6, 0x00bafd1a, 0x03701c65, 0x0005d766}}}, + {X: Field{[10]uint32{0x0307b143, 0x03e65ede, 0x00171556, 0x03a3361d, 0x007b8927, 0x00d9f3d0, 0x03235be9, 0x007a092e, 0x00dcbcd9, 0x001455ac}}, Y: Field{[10]uint32{0x00cc91dc, 0x03d2fe08, 0x018dec2a, 0x02432ec3, 0x01d40ada, 0x0049c05b, 0x01ded191, 0x0130ff99, 0x000fa29d, 0x0007515f}}}, + {X: Field{[10]uint32{0x016dd63d, 0x00476382, 0x02bcd00e, 0x0019e46d, 0x03f1993c, 0x02391069, 0x01fac558, 0x0125cc58, 0x0172060b, 0x000efd47}}, Y: Field{[10]uint32{0x00722d49, 0x02ba293d, 0x0312663e, 0x038abdd3, 0x0173e1e4, 0x03da6126, 0x023905dd, 0x02bf6ff1, 0x007090a7, 0x001ef1ad}}}, + {X: Field{[10]uint32{0x02d61fe5, 0x036dec26, 0x0205ad76, 0x03193eab, 0x0122fa74, 0x029bcb68, 0x014f4d3b, 0x02040845, 0x00912008, 0x0034a5c4}}, Y: Field{[10]uint32{0x028e3fc8, 0x0123dad8, 0x00156926, 0x01cd954a, 0x02bc33cb, 0x014708f0, 0x000cc141, 0x03cf23e5, 0x03aaf2cc, 0x001cd43a}}}, + {X: Field{[10]uint32{0x0368013d, 0x02d82a71, 0x0126c559, 0x01f88d05, 0x036d7a3b, 0x007ff4c2, 0x015a5202, 0x0044be89, 0x03ca8e17, 0x0030bb91}}, Y: Field{[10]uint32{0x03ece448, 0x0014058a, 0x0031a453, 0x002080a6, 0x0280d9ff, 0x036cec8e, 0x008e83be, 0x01fd6c77, 0x036bd83b, 0x000b9ba2}}}, + {X: Field{[10]uint32{0x0270b6cf, 0x016b6f4f, 0x03aaae47, 0x012d5876, 0x00c5ef44, 0x01b31300, 0x00da39e9, 0x03383678, 0x00d69ddc, 0x00156666}}, Y: Field{[10]uint32{0x00ffb328, 0x014d308d, 0x03ac525c, 0x01cc6bcb, 0x00cf0f31, 0x02d34879, 0x02b5e8cd, 0x03b96e37, 0x020095ae, 0x0031270a}}}, + {X: Field{[10]uint32{0x03baf363, 0x0152405a, 0x032f9e9d, 0x03764372, 0x017c1955, 0x01c86a63, 0x01305c39, 0x02eb7791, 0x02c3e4c8, 0x0012d2c0}}, Y: Field{[10]uint32{0x00d43468, 0x01a178c6, 0x00fb925b, 0x0191856f, 0x01d22a6a, 0x00f70c13, 0x01d546e0, 0x0166cf09, 0x037ebe8f, 0x00282d9e}}}, + {X: Field{[10]uint32{0x02c549c5, 0x01f74b2a, 0x0101fe0d, 0x03a3b87b, 0x007650ad, 0x0350a25f, 0x00f897c5, 0x02d09d47, 0x03fd7836, 0x003eebf9}}, Y: Field{[10]uint32{0x02668436, 0x00044384, 0x03aeb5e7, 0x00a26914, 0x01229a7e, 0x03b69489, 0x03841f58, 0x01f945ed, 0x014352d0, 0x000bd446}}}, + {X: Field{[10]uint32{0x0076c06c, 0x03786d9c, 0x0219f954, 0x0340a92c, 0x0281b21b, 0x01ceb139, 0x004e620b, 0x02e281e2, 0x02f90c65, 0x003334c1}}, Y: Field{[10]uint32{0x0257510b, 0x017d6c55, 0x005668ab, 0x029d6932, 0x00003f68, 0x00f8115d, 0x03056dc7, 0x02d43241, 0x007fa7b0, 0x00208fe9}}}, + {X: Field{[10]uint32{0x00195a3b, 0x02e35586, 0x01980820, 0x0177626a, 0x01912415, 0x0211d14b, 0x01a870a7, 0x01a474ed, 0x0038995a, 0x002ebef6}}, Y: Field{[10]uint32{0x00ad92a3, 0x024f9f42, 0x006874e8, 0x03560e72, 0x004f05f4, 0x00082d6c, 0x00e7f521, 0x00a7bbec, 0x01fac948, 0x00237d32}}}, + {X: Field{[10]uint32{0x024f458f, 0x0330e008, 0x019fb157, 0x00dee1a4, 0x00713d8f, 0x03e50299, 0x0166af8f, 0x0055b828, 0x003a8073, 0x00344973}}, Y: Field{[10]uint32{0x0035abde, 0x013b2f2f, 0x012a3a03, 0x00bbc981, 0x021bb7a2, 0x0288e9e3, 0x001054ae, 0x00de9f7c, 0x00b6ac4e, 0x00280c3a}}}, + {X: Field{[10]uint32{0x038187c2, 0x03c9e3b2, 0x008668cb, 0x03f629fa, 0x01f2d1bb, 0x0388b90b, 0x02c6433b, 0x036aebbc, 0x03281b5d, 0x001f5247}}, Y: Field{[10]uint32{0x00dfe8ed, 0x009ee9bd, 0x02af9bea, 0x031faf20, 0x0228b040, 0x01d82cbf, 0x0381ea3f, 0x00259b28, 0x021d7036, 0x00328605}}}, + {X: Field{[10]uint32{0x01f8c39e, 0x017c1ef3, 0x03961601, 0x025541e6, 0x016d70a5, 0x02a7d25e, 0x002995c6, 0x0048ea1b, 0x02339f29, 0x000c7336}}, Y: Field{[10]uint32{0x00b49f65, 0x030b93fa, 0x03a19561, 0x02c2f201, 0x02376626, 0x0018347c, 0x0128a9ff, 0x007eb265, 0x010bedf6, 0x002bac9f}}}, + {X: Field{[10]uint32{0x017807ba, 0x00e7d28a, 0x01ba7d74, 0x00bc3784, 0x01e5ec91, 0x006ddbec, 0x012073e7, 0x024625b2, 0x00c7f45f, 0x0001e799}}, Y: Field{[10]uint32{0x0023c921, 0x0177b5d6, 0x02e7efe8, 0x02f3258c, 0x00d17685, 0x0097626d, 0x011abe38, 0x0258f162, 0x0036b354, 0x0015f64d}}}, + {X: Field{[10]uint32{0x0042274e, 0x00c7daa3, 0x0206c78a, 0x034b7af3, 0x0369f422, 0x002f690f, 0x02f057b6, 0x00e1a1c7, 0x02dffccb, 0x003588cb}}, Y: Field{[10]uint32{0x000ef826, 0x0331f5fb, 0x004d6d62, 0x018eb0f7, 0x0158a18f, 0x026d7df4, 0x03472f22, 0x038274db, 0x03a0b2e2, 0x0004f6bb}}}, + {X: Field{[10]uint32{0x006e368e, 0x02ed99d1, 0x03ea6a7e, 0x0349228c, 0x00722d78, 0x020a2516, 0x038fc00c, 0x038e94dc, 0x0298b2d6, 0x0008703c}}, Y: Field{[10]uint32{0x03062383, 0x019837f7, 0x034a2b20, 0x016b97cc, 0x02cbb3f2, 0x017695a7, 0x015eede1, 0x03f656e2, 0x03ec17d2, 0x00219d54}}}, + {X: Field{[10]uint32{0x003196c8, 0x00b2bb93, 0x031d0f4f, 0x0070ff66, 0x00eaa231, 0x013dd1c8, 0x011621c5, 0x03de6755, 0x01010dcb, 0x0007468f}}, Y: Field{[10]uint32{0x039734eb, 0x03ebab90, 0x0233d6f8, 0x00701f97, 0x005453bf, 0x00e51763, 0x01b1a301, 0x03e4321e, 0x01159900, 0x003569e8}}}, + {X: Field{[10]uint32{0x00e76735, 0x02ec770a, 0x025614f4, 0x0171dd4e, 0x0162e26d, 0x0160a854, 0x00a97d18, 0x027b7803, 0x02808fa9, 0x0015d221}}, Y: Field{[10]uint32{0x03c17c6f, 0x02876e4b, 0x02b1eeba, 0x00d2576c, 0x00b3bbee, 0x03b06925, 0x000ecc54, 0x03b78373, 0x00597117, 0x0037af6a}}}, + {X: Field{[10]uint32{0x0391715a, 0x03eb7225, 0x0207c9f6, 0x034c7073, 0x03607194, 0x0322f7a7, 0x01e820c4, 0x037fe938, 0x00d34ce1, 0x002db74d}}, Y: Field{[10]uint32{0x0239cc9d, 0x02194862, 0x03200717, 0x0150e810, 0x031487e5, 0x0126f1f3, 0x01c0ec90, 0x0354ccab, 0x0068e405, 0x0022fd22}}}, + {X: Field{[10]uint32{0x0291d0de, 0x01412f52, 0x031600f3, 0x01b27882, 0x035821df, 0x0148b7e6, 0x02bc8871, 0x021dcb28, 0x02d56908, 0x00243e77}}, Y: Field{[10]uint32{0x02f902ac, 0x03ae9dba, 0x017f9a2b, 0x006c498e, 0x01f76b3c, 0x011250ce, 0x010af26b, 0x0129bbf7, 0x024add53, 0x000345f9}}}, + {X: Field{[10]uint32{0x032cfa59, 0x02b3195a, 0x0299d260, 0x00e66c40, 0x03db07b2, 0x00c00a1c, 0x006e4a0c, 0x024d4e44, 0x00e858d1, 0x003157cd}}, Y: Field{[10]uint32{0x00e50f5b, 0x0058b78c, 0x00dda11f, 0x03ef05ae, 0x009a8fe1, 0x00b3becd, 0x0149f7fe, 0x0288b9ca, 0x00d474b5, 0x001f67ce}}}, + {X: Field{[10]uint32{0x02b8ecad, 0x03c5c895, 0x025750c5, 0x034adbd4, 0x03f39c16, 0x0128ad89, 0x03f8452c, 0x0207166c, 0x0192d389, 0x001ab910}}, Y: Field{[10]uint32{0x030b099d, 0x0365c55f, 0x02d61603, 0x0073b69a, 0x03fa61de, 0x00e3925c, 0x01c4b91e, 0x00812a7b, 0x00dd7c49, 0x0026eeea}}}, + {X: Field{[10]uint32{0x03dcffbc, 0x0113bbdb, 0x0379ae03, 0x007db362, 0x00bd0c25, 0x02ad9113, 0x013ad99e, 0x006cd9aa, 0x0239423e, 0x000ce9f5}}, Y: Field{[10]uint32{0x0011c61e, 0x021b8ee5, 0x002c02bb, 0x024756eb, 0x032f0678, 0x027b48b4, 0x012684fc, 0x0328abe9, 0x02cc006d, 0x00309844}}}, + {X: Field{[10]uint32{0x0159af0a, 0x010351fc, 0x024b2ea6, 0x03643d4a, 0x013380c1, 0x01db29b1, 0x03a6642a, 0x0219c0a3, 0x0331eac4, 0x001211c4}}, Y: Field{[10]uint32{0x00142704, 0x021b51e8, 0x0314d5b5, 0x0251c169, 0x01c5047b, 0x022ed87d, 0x0103a311, 0x038073ee, 0x014693fd, 0x002d3aa1}}}, + {X: Field{[10]uint32{0x02587917, 0x0004a970, 0x00e86d46, 0x01e6fae3, 0x0172defd, 0x00f492dc, 0x03faab74, 0x00c70133, 0x00399ae7, 0x0001596b}}, Y: Field{[10]uint32{0x00bbab48, 0x000a6066, 0x000d779c, 0x0227f53d, 0x02146649, 0x0026a591, 0x0011fece, 0x00c7abf1, 0x02a5d450, 0x0037ad5a}}}, + {X: Field{[10]uint32{0x00314c0b, 0x01c21726, 0x03773eaa, 0x0251b72f, 0x00995490, 0x03168cbf, 0x00d017d0, 0x00adf5aa, 0x00b53b6c, 0x0025920e}}, Y: Field{[10]uint32{0x01130b97, 0x03e717bf, 0x02a2f6ca, 0x027be810, 0x03ac6fdc, 0x039daf5d, 0x0271ee0e, 0x000d3f22, 0x033cec44, 0x000b6be7}}}, + {X: Field{[10]uint32{0x00eb88d5, 0x038bc7b1, 0x0087c4aa, 0x00340bbe, 0x006f9bff, 0x039522c5, 0x003522da, 0x001e2e76, 0x02907b8d, 0x002f0036}}, Y: Field{[10]uint32{0x00ddb152, 0x03856908, 0x02befeaf, 0x01fed066, 0x020fef4d, 0x0132ca7d, 0x0321dd13, 0x036dcd97, 0x0111f9e2, 0x001af43f}}}, + {X: Field{[10]uint32{0x03a7bea4, 0x01156af6, 0x0111d075, 0x02cc9fec, 0x00a2082b, 0x03d79543, 0x03dd8ae9, 0x027c33c4, 0x005500f8, 0x0006967e}}, Y: Field{[10]uint32{0x0200c823, 0x0321c29d, 0x035c2150, 0x01db8b90, 0x00e77e6e, 0x02997142, 0x0225c530, 0x02b7ff27, 0x0340d460, 0x001fa8be}}}, + {X: Field{[10]uint32{0x02ccc764, 0x01662953, 0x02fdad88, 0x028c9e69, 0x00452706, 0x015a5409, 0x01081624, 0x03f1ab51, 0x011bd3bf, 0x001e8ed8}}, Y: Field{[10]uint32{0x02233145, 0x0286b48c, 0x030d368a, 0x035a875c, 0x0283d30b, 0x015274ea, 0x033d6efe, 0x01b94b21, 0x01896806, 0x0005b825}}}, + {X: Field{[10]uint32{0x015d6d91, 0x01786dc0, 0x02bef4cd, 0x00a14444, 0x02a0a1cc, 0x0315b89e, 0x02fa95b5, 0x002969e1, 0x01779cbe, 0x000bfb55}}, Y: Field{[10]uint32{0x014bddfa, 0x02751b8b, 0x02637995, 0x0399bf97, 0x02f66fd3, 0x01b71942, 0x01691fa3, 0x01fed58f, 0x0027b229, 0x001fbab3}}}, + {X: Field{[10]uint32{0x034a9558, 0x0152835d, 0x02d02f01, 0x0377c6cd, 0x03018326, 0x02faed12, 0x03efaea6, 0x037d959c, 0x0217952e, 0x00099eb4}}, Y: Field{[10]uint32{0x01a13fef, 0x01456ec4, 0x01e6d907, 0x02de8121, 0x01703cc9, 0x02fd5280, 0x00a7b330, 0x017979a2, 0x00c07e9d, 0x001dd64f}}}, + {X: Field{[10]uint32{0x036687e8, 0x0017b85f, 0x02b106fa, 0x006f29fa, 0x010e0d34, 0x017cc851, 0x038cceca, 0x026721a5, 0x022c239b, 0x003adbb5}}, Y: Field{[10]uint32{0x02c0a241, 0x027eff14, 0x0133b662, 0x02e24187, 0x012a6e6a, 0x00eb61d5, 0x029b2258, 0x02a3a338, 0x022250f6, 0x002b6267}}}, + {X: Field{[10]uint32{0x030a9e5b, 0x00425350, 0x027b1089, 0x026fe232, 0x035087a5, 0x005a1b13, 0x00ef33c4, 0x00853c2d, 0x017ce03d, 0x0032973c}}, Y: Field{[10]uint32{0x00989ce9, 0x018eb4f4, 0x0003ef99, 0x0201c95e, 0x01e19351, 0x023a80a6, 0x03ae683c, 0x01d6eb3f, 0x02eb473f, 0x0005f913}}}, + {X: Field{[10]uint32{0x01e82f7c, 0x01c85794, 0x03a2fe4c, 0x033d1988, 0x00c82f21, 0x024f9adb, 0x03035eca, 0x0190b98f, 0x029cacf0, 0x00131ef0}}, Y: Field{[10]uint32{0x02776875, 0x034af8a0, 0x01322e59, 0x03903c7d, 0x03eb537b, 0x0102900a, 0x03f64e7e, 0x01e5b050, 0x036e8756, 0x001f1579}}}, + {X: Field{[10]uint32{0x031058e3, 0x0186f0d9, 0x03d2080b, 0x02108e27, 0x03797831, 0x02b3d375, 0x03e50130, 0x0227c140, 0x00e9b422, 0x0015f2ae}}, Y: Field{[10]uint32{0x03d9e2bc, 0x0262aaa7, 0x012ca7c3, 0x011650c3, 0x022b048c, 0x01cba6fb, 0x030b884e, 0x009cf69e, 0x03186671, 0x001e0894}}}, + {X: Field{[10]uint32{0x03c4823e, 0x03d8c426, 0x02c2753f, 0x01cbb4b9, 0x01abf3d2, 0x015a10fd, 0x0013a82a, 0x0030d37a, 0x023df112, 0x000f0afc}}, Y: Field{[10]uint32{0x013f1990, 0x03add64b, 0x029d0d08, 0x00a384bf, 0x00767409, 0x032772e2, 0x00c5b47e, 0x0348cf38, 0x036388ae, 0x0005d676}}}, + {X: Field{[10]uint32{0x02ab38d2, 0x0206c683, 0x02856d85, 0x0288a34d, 0x0234170a, 0x0373f774, 0x03348dc3, 0x01d0a834, 0x01ac83e0, 0x0030042a}}, Y: Field{[10]uint32{0x0076aafd, 0x009da10f, 0x038ea9cd, 0x004111ad, 0x002b2dc8, 0x02433e48, 0x031da1f1, 0x029a3f87, 0x03ed0644, 0x0018d325}}}, + {X: Field{[10]uint32{0x02071994, 0x01164ea4, 0x01660550, 0x00fee8ea, 0x014f1b77, 0x00f6722a, 0x00cb632b, 0x0291a039, 0x01ee548b, 0x00292af6}}, Y: Field{[10]uint32{0x00f87182, 0x017a3bf2, 0x00b6111b, 0x0123afff, 0x01c9390b, 0x0100d597, 0x02ab00a8, 0x00ca5ff1, 0x026aba26, 0x000e8509}}}, + {X: Field{[10]uint32{0x00dda172, 0x028ccf7a, 0x007115a7, 0x039666de, 0x01d68b82, 0x03b3bff9, 0x0008540d, 0x0057c717, 0x0052efc1, 0x003700b2}}, Y: Field{[10]uint32{0x036c29c6, 0x01febd57, 0x009ba236, 0x03732e15, 0x028a35f8, 0x023332a8, 0x03f4eaed, 0x03a10b29, 0x013a8e1a, 0x00393996}}}, + {X: Field{[10]uint32{0x01ec57c8, 0x036d68a4, 0x01cac1b6, 0x0205c85d, 0x000a54fc, 0x03ca7f5f, 0x00a5a4b5, 0x008bff0a, 0x01e82238, 0x003b91da}}, Y: Field{[10]uint32{0x0020385f, 0x004ff9b0, 0x00619384, 0x0050a025, 0x00338905, 0x02c05631, 0x0178b9a2, 0x0323ae82, 0x02bc4076, 0x003f28b1}}}, + {X: Field{[10]uint32{0x013ef066, 0x0349c9f6, 0x032abb11, 0x033cc493, 0x002cf990, 0x03c2230e, 0x035a6dec, 0x00303f50, 0x001d3491, 0x003cc01b}}, Y: Field{[10]uint32{0x0149eae2, 0x00da4132, 0x00d9b82d, 0x01b2237f, 0x03f8016a, 0x00d73c99, 0x01ebaf12, 0x01fd468a, 0x01f5aa36, 0x00001d8a}}}, + {X: Field{[10]uint32{0x027313b7, 0x02e4d5c7, 0x030f3794, 0x001124cb, 0x02b1b9c8, 0x00970ff5, 0x01f0a3e3, 0x0159a44a, 0x003d07bf, 0x001f3ec8}}, Y: Field{[10]uint32{0x002bc60f, 0x0116ed3a, 0x02d3982a, 0x03f99c60, 0x01e4ae08, 0x021ec05b, 0x00c42173, 0x0270e322, 0x01fd2433, 0x0013ddae}}}, + {X: Field{[10]uint32{0x02312c0a, 0x01343acc, 0x03206a32, 0x01c60eba, 0x01efeabe, 0x01c1156b, 0x0130be8e, 0x00264c27, 0x00e036e0, 0x0003328f}}, Y: Field{[10]uint32{0x0215b9e5, 0x035fa345, 0x018b20ef, 0x03766369, 0x0091b437, 0x00163223, 0x00637252, 0x01f1b4d3, 0x0258fe94, 0x00259d2b}}}, + {X: Field{[10]uint32{0x02b0d9c8, 0x02b39982, 0x01212c66, 0x03488e27, 0x01d9815f, 0x007e635c, 0x01a071c0, 0x01709e0b, 0x014881cd, 0x0027ed90}}, Y: Field{[10]uint32{0x01813251, 0x00f04fb4, 0x0309bce2, 0x011e71da, 0x03d11d50, 0x0013c71c, 0x035e515c, 0x00dd097d, 0x00541a51, 0x00013095}}}, + {X: Field{[10]uint32{0x01558b25, 0x001c2d94, 0x01542c2c, 0x03601aa8, 0x01eb5d2a, 0x009582d3, 0x0139de23, 0x03516443, 0x02bf03e3, 0x000076ef}}, Y: Field{[10]uint32{0x010b9db1, 0x02e739cb, 0x01876877, 0x0145a60c, 0x01940eae, 0x01d21328, 0x014753fd, 0x03924106, 0x031c2e94, 0x003b1a39}}}, + {X: Field{[10]uint32{0x006bb5f7, 0x00428fe9, 0x01e215a2, 0x03a49061, 0x015a890e, 0x01321350, 0x002856b0, 0x01d085dd, 0x021992f4, 0x001dd474}}, Y: Field{[10]uint32{0x03237fef, 0x00f19206, 0x01a2273a, 0x028532b1, 0x036371f6, 0x03da6305, 0x01327493, 0x0321b3b7, 0x01c5b770, 0x000a456a}}}, + {X: Field{[10]uint32{0x00f36a2d, 0x025ff2bb, 0x01737707, 0x02593847, 0x01e7b89c, 0x033d992c, 0x0382983e, 0x0270f881, 0x01a05b18, 0x000e6a12}}, Y: Field{[10]uint32{0x013690c5, 0x02d7b440, 0x01114f43, 0x014d53d0, 0x0148e692, 0x019a1625, 0x02274d15, 0x036c1af8, 0x00f16191, 0x0034f9be}}}, + {X: Field{[10]uint32{0x039b25bb, 0x0045f2f9, 0x01dea768, 0x00a2e2ff, 0x0080e3d6, 0x0104b59f, 0x0395522d, 0x03b483e7, 0x0125b29c, 0x0019f958}}, Y: Field{[10]uint32{0x0103da21, 0x01edc4a3, 0x0257f916, 0x033c19ba, 0x033c83ed, 0x0340b4a4, 0x020fd883, 0x008fd12a, 0x00157e3c, 0x0018237f}}}, + {X: Field{[10]uint32{0x038f1525, 0x008a6ded, 0x027bb5cb, 0x03bd4a4c, 0x02ecdd01, 0x02560e7d, 0x01eec20e, 0x0356774c, 0x02da02f7, 0x0002946b}}, Y: Field{[10]uint32{0x03847903, 0x0024b035, 0x02cdd1f0, 0x03420364, 0x036621c7, 0x031a062a, 0x038b18f4, 0x0218acf4, 0x03df93fb, 0x001c1259}}}, + {X: Field{[10]uint32{0x02c1745d, 0x019308da, 0x01e7aaae, 0x01bfed22, 0x01f8bcb3, 0x00ec00e2, 0x02b71b77, 0x032d1bd7, 0x013e73a1, 0x0032601a}}, Y: Field{[10]uint32{0x02fae474, 0x0330162d, 0x02bd4274, 0x03bc01c1, 0x00b3b21f, 0x03eee9ba, 0x01853e56, 0x01fbeddc, 0x008efe6b, 0x002fcee0}}}, + {X: Field{[10]uint32{0x021391a9, 0x01e8dd02, 0x007136b1, 0x034a5235, 0x0394167b, 0x025d7a7c, 0x0227aab2, 0x013070a3, 0x0130bcf5, 0x0031e37e}}, Y: Field{[10]uint32{0x004d9ae7, 0x023c378c, 0x01e5e031, 0x00886f19, 0x00163bfe, 0x020ef878, 0x03b5e9a2, 0x01e6f956, 0x03366d3a, 0x00269093}}}, + {X: Field{[10]uint32{0x01284089, 0x010bf11b, 0x016e5fb2, 0x039399cc, 0x00a998b1, 0x03dfc794, 0x0168ebc8, 0x03cea798, 0x03bcc6d2, 0x00269d7d}}, Y: Field{[10]uint32{0x03169e01, 0x03cc566f, 0x037bfd40, 0x030de1e5, 0x0239bf6e, 0x03f1f8d6, 0x0106c6e8, 0x02e6a8eb, 0x00e6dff8, 0x00032d1e}}}, + {X: Field{[10]uint32{0x036e6224, 0x02dc68e2, 0x001c0d20, 0x01f2dbe0, 0x007eba1e, 0x01739cf9, 0x008277d9, 0x02cf9f6d, 0x031adb0b, 0x001dac84}}, Y: Field{[10]uint32{0x0179263a, 0x034924a6, 0x007b2f79, 0x03e04831, 0x03196c5a, 0x034a1dcd, 0x01e36e6c, 0x03956c2a, 0x00daef60, 0x0000cb8f}}}, + {X: Field{[10]uint32{0x001384e1, 0x0290acd7, 0x01e68f32, 0x011b7ae3, 0x03cdcc4c, 0x036a2520, 0x01f96c93, 0x025c77d5, 0x03614ec5, 0x00086260}}, Y: Field{[10]uint32{0x026dac3e, 0x021ad7c4, 0x02c97d64, 0x012b6726, 0x01c5eda5, 0x01dda5d0, 0x02a2d224, 0x0254eac8, 0x005044a4, 0x000b0e5b}}}, + {X: Field{[10]uint32{0x03db8adc, 0x013e1d78, 0x002a9aa1, 0x029b3d76, 0x03a08449, 0x014a3fb2, 0x01dbe1ca, 0x00603440, 0x02494e9d, 0x002b02c2}}, Y: Field{[10]uint32{0x00412554, 0x03bf8f9c, 0x02dd9b2a, 0x027cc518, 0x00371dd1, 0x01a9aa3a, 0x0153b9c5, 0x02d60cb7, 0x001225a1, 0x0009b475}}}, + {X: Field{[10]uint32{0x00e04625, 0x029b09cc, 0x00a1b6dc, 0x0336efc1, 0x029d1a78, 0x017d65a8, 0x02d33297, 0x02997ef5, 0x018c0851, 0x003e1a6d}}, Y: Field{[10]uint32{0x02a5bff0, 0x02eaec31, 0x01b09c3c, 0x006ee2e4, 0x00a0cfb3, 0x00526527, 0x00b1603e, 0x0171cb06, 0x0344fc6f, 0x001037b8}}}, + {X: Field{[10]uint32{0x01544c3a, 0x01e35bae, 0x032aaecf, 0x00ea39f5, 0x01a640a4, 0x01cf18fb, 0x004a5f22, 0x00943e26, 0x02db2406, 0x003dd3c0}}, Y: Field{[10]uint32{0x0386185b, 0x02bd64f3, 0x02aea1c0, 0x01e87bba, 0x015e364f, 0x017caf3c, 0x03c1a618, 0x007a4a28, 0x026dcacc, 0x00220b8e}}}, + {X: Field{[10]uint32{0x027ea65d, 0x0250ea81, 0x0069ff3d, 0x01412dfa, 0x0288c390, 0x002a9a74, 0x03c9284a, 0x0157acba, 0x02b61d67, 0x0030184f}}, Y: Field{[10]uint32{0x03848cba, 0x0084f149, 0x02c09fe4, 0x006fc34d, 0x0129931c, 0x01764a27, 0x03a89665, 0x0320b92b, 0x02e527b5, 0x001cbd86}}}, + {X: Field{[10]uint32{0x031285db, 0x00e7c23c, 0x007a7eb7, 0x018d490c, 0x00ae0dbf, 0x0045ebac, 0x00fd8c47, 0x002298f0, 0x039860ba, 0x003ad9bf}}, Y: Field{[10]uint32{0x03ddc5d5, 0x01d456a1, 0x0261655c, 0x03cc1dd3, 0x027d3662, 0x03903d2e, 0x005dfb94, 0x03caba2c, 0x02ca54bc, 0x00030c50}}}, + {X: Field{[10]uint32{0x004a861d, 0x0145bc3b, 0x015b871a, 0x005455b0, 0x02e41c6b, 0x0294d180, 0x025d58bc, 0x018187f0, 0x00e6a125, 0x000e9c42}}, Y: Field{[10]uint32{0x004393a6, 0x00c1938f, 0x01226a18, 0x035d9b7c, 0x00957bfc, 0x005f9fa2, 0x011b5bec, 0x02aec806, 0x0102041c, 0x0036ab8b}}}, + {X: Field{[10]uint32{0x00f89d5f, 0x03a500ee, 0x00958949, 0x03cd39d1, 0x00ea1a2f, 0x02c817cb, 0x02e73717, 0x01a744cf, 0x0258c831, 0x00345f8e}}, Y: Field{[10]uint32{0x018b1a20, 0x01ffcc98, 0x010225ac, 0x02e60729, 0x012d75fc, 0x034574d2, 0x00ffafa6, 0x03662e48, 0x037d69e5, 0x002630d7}}}, + {X: Field{[10]uint32{0x03f6541c, 0x00daeac2, 0x01385fff, 0x0353dd9e, 0x0298caf6, 0x018638bf, 0x0350cbf2, 0x02e3b450, 0x0092cefb, 0x0035b8ca}}, Y: Field{[10]uint32{0x02636298, 0x0207af6c, 0x0021e080, 0x02f3b6f8, 0x00976196, 0x015bc926, 0x0072b553, 0x017b001e, 0x022ebe0f, 0x001c5d51}}}, + {X: Field{[10]uint32{0x02ffef75, 0x01777e02, 0x0229186d, 0x02ba4ea9, 0x0282ddc8, 0x00e3b001, 0x00e2182f, 0x0002b9ba, 0x01ff60e9, 0x000c6352}}, Y: Field{[10]uint32{0x026333b2, 0x02205981, 0x00831a98, 0x03aef8a2, 0x0008dcc3, 0x037daa9c, 0x02d4fd8f, 0x01853707, 0x0027dd7d, 0x001ba5fb}}}, + {X: Field{[10]uint32{0x00cf6346, 0x03e05126, 0x0367c5a2, 0x00ada35b, 0x01c075e7, 0x01616aef, 0x00ea5aeb, 0x036e2e9a, 0x02301772, 0x003f5be7}}, Y: Field{[10]uint32{0x0128d2c0, 0x03aace07, 0x001254d4, 0x00c2abfd, 0x02d76082, 0x01610d55, 0x01c5f513, 0x016f5729, 0x02e76477, 0x0036b745}}}, + {X: Field{[10]uint32{0x002ddd36, 0x02b90e86, 0x00d31566, 0x00aba558, 0x00f07428, 0x02f39da3, 0x00ed08d4, 0x011d86a4, 0x0338a2c7, 0x0023f896}}, Y: Field{[10]uint32{0x024c23a2, 0x0386a087, 0x015c73f8, 0x010c9c74, 0x0251d668, 0x03ef7f8b, 0x00da1b32, 0x02ade28b, 0x004a77c6, 0x001bb87a}}}, + {X: Field{[10]uint32{0x0393bef8, 0x03fae665, 0x03e5d2e6, 0x02ca91b5, 0x013e12ba, 0x01afee05, 0x0217bcff, 0x023fbd2b, 0x02d288ed, 0x000df3c3}}, Y: Field{[10]uint32{0x03e3e0d3, 0x02851b6e, 0x03339119, 0x01ec85e4, 0x00e17a41, 0x036d709e, 0x01254f4d, 0x001d4726, 0x025718eb, 0x00024b9e}}}, + {X: Field{[10]uint32{0x03bf403c, 0x01611081, 0x011e0091, 0x013d4c7b, 0x00eca0e0, 0x0180003a, 0x01eb812b, 0x034321db, 0x006106b9, 0x001a2308}}, Y: Field{[10]uint32{0x00cc01fe, 0x01fac517, 0x035bda8b, 0x020fcb3a, 0x00011d85, 0x008802f7, 0x0112e763, 0x01354f7d, 0x02ba41ba, 0x002ead2c}}}, + {X: Field{[10]uint32{0x00b3d804, 0x020e569c, 0x004e9d86, 0x0213626a, 0x02d1b535, 0x00e59485, 0x022371d6, 0x0254d760, 0x02aaf539, 0x0012d32a}}, Y: Field{[10]uint32{0x01ee73d2, 0x01ef5014, 0x0070ae4c, 0x02444571, 0x02652fbd, 0x01d8793a, 0x001d0437, 0x001268ec, 0x03afcd18, 0x000f7749}}}, + {X: Field{[10]uint32{0x02fa1d2e, 0x013754b8, 0x00e56144, 0x02609388, 0x0347cca3, 0x022ce6d7, 0x00ed9a51, 0x036981d6, 0x03c44135, 0x001bd6b2}}, Y: Field{[10]uint32{0x02cd58c4, 0x0134df12, 0x02569052, 0x035ccd7e, 0x02f729f1, 0x00bc65e8, 0x02f2efc0, 0x03653522, 0x0146e5f6, 0x00017727}}}, + {X: Field{[10]uint32{0x0267fc42, 0x010c4f70, 0x008c6ce9, 0x008dce0a, 0x02661d6f, 0x022dad88, 0x01a527bf, 0x032e45bf, 0x00493dff, 0x001e74b5}}, Y: Field{[10]uint32{0x020c08db, 0x0017cdc2, 0x01de1d28, 0x0247575b, 0x038d9027, 0x03ef2454, 0x0302823d, 0x03dff2f8, 0x03f13fa8, 0x002c9a0e}}}, + {X: Field{[10]uint32{0x01f95524, 0x0002ccfe, 0x00118c08, 0x02f00860, 0x01f3915d, 0x03319f50, 0x037a6b07, 0x01ee7271, 0x007e246b, 0x000cea3a}}, Y: Field{[10]uint32{0x0116ff8f, 0x00d0cce7, 0x0229470b, 0x03bf736c, 0x01207d30, 0x00b97116, 0x015e36be, 0x03417c99, 0x004c584f, 0x002eaa09}}}, + {X: Field{[10]uint32{0x01868e95, 0x036aae9e, 0x03a193f4, 0x02c83ee9, 0x013235dd, 0x012f5518, 0x0161a7ae, 0x01f7e081, 0x0132f388, 0x002685a4}}, Y: Field{[10]uint32{0x00630bcd, 0x02408a51, 0x03bc0719, 0x000397e2, 0x02a233b1, 0x02a59656, 0x01452161, 0x011b110a, 0x03179954, 0x001a1bf0}}}, + {X: Field{[10]uint32{0x0383ac42, 0x01184121, 0x026fc290, 0x0278b297, 0x01c85998, 0x010e7cbd, 0x03dc7e90, 0x0338fe6a, 0x00f48405, 0x001e42dd}}, Y: Field{[10]uint32{0x0224a701, 0x02cc12e2, 0x028a66eb, 0x00aec6a4, 0x011dc676, 0x01c44697, 0x00593a37, 0x02172a64, 0x01135623, 0x00225872}}}, + {X: Field{[10]uint32{0x02f9e49c, 0x021ea8dc, 0x02438b54, 0x0217d493, 0x02954717, 0x03ccbf35, 0x00aaeb69, 0x030b661f, 0x00cfae1f, 0x0038a8f4}}, Y: Field{[10]uint32{0x00c93046, 0x00b4cdc5, 0x008db498, 0x000e63ed, 0x0211f7dc, 0x00233914, 0x03edb543, 0x01c230d5, 0x0205ecf2, 0x00273090}}}, + {X: Field{[10]uint32{0x020bcbea, 0x03087b25, 0x03a7a2b3, 0x00f98f8e, 0x00cfd265, 0x01bcab9a, 0x01372b19, 0x030655db, 0x00435992, 0x00032cc3}}, Y: Field{[10]uint32{0x01ccd0b4, 0x01f374e2, 0x0083d498, 0x016099a9, 0x02fb6830, 0x02d246e2, 0x009cba14, 0x00e326b3, 0x01b97083, 0x003d95cd}}}, + {X: Field{[10]uint32{0x00e8b46a, 0x0090e044, 0x01d2dfe9, 0x01adf265, 0x03296ca6, 0x03ecf9a8, 0x018ffb16, 0x002fb98a, 0x0095d631, 0x0007ebb7}}, Y: Field{[10]uint32{0x00725089, 0x02f493ee, 0x012cee7b, 0x03391097, 0x0226d9f0, 0x02f62dd9, 0x0378d032, 0x03a41394, 0x023f8201, 0x000d40e7}}}, + {X: Field{[10]uint32{0x02b3e8f9, 0x031d42d4, 0x03f318f6, 0x014c78a2, 0x018e93ea, 0x03546cfd, 0x005410ce, 0x030744fc, 0x035a2be8, 0x002991b3}}, Y: Field{[10]uint32{0x00c102bb, 0x03d19429, 0x029bda01, 0x03911950, 0x01e427d7, 0x00794744, 0x03a7e78e, 0x02a482d1, 0x02cb7727, 0x00163163}}}, + {X: Field{[10]uint32{0x02be2205, 0x02f00837, 0x02d39dce, 0x031857b7, 0x011c77c0, 0x01730c8b, 0x038c397a, 0x01f4e3a6, 0x03271853, 0x000c9cd1}}, Y: Field{[10]uint32{0x01a42d65, 0x00092402, 0x032bb72c, 0x012f0f94, 0x01c1ea78, 0x011d69f5, 0x007b072d, 0x03d82f53, 0x008958c3, 0x0030b7af}}}, + {X: Field{[10]uint32{0x0172827e, 0x00bce4f5, 0x03f4d4ce, 0x008b9f6c, 0x009906dd, 0x024c289c, 0x028c095d, 0x02884b01, 0x03180855, 0x0005a869}}, Y: Field{[10]uint32{0x0115605c, 0x01adc934, 0x00660219, 0x005aa2dd, 0x01b1ef30, 0x02fa3df7, 0x0280335c, 0x02a7adb3, 0x024bb30b, 0x0034e275}}}, + {X: Field{[10]uint32{0x03687596, 0x02bd33c8, 0x002e9a61, 0x03e129d0, 0x00eeb1eb, 0x01859ba4, 0x0294b867, 0x0155c4cd, 0x01145de2, 0x002d2fd3}}, Y: Field{[10]uint32{0x03d11242, 0x00bf046e, 0x023dbfac, 0x0186962b, 0x0237d389, 0x02d817a5, 0x018640a6, 0x025f958c, 0x00a4d823, 0x001276c8}}}, + {X: Field{[10]uint32{0x03892630, 0x019ee6c2, 0x0164bbf3, 0x004fa42a, 0x03fc3114, 0x0364e032, 0x00a0de08, 0x01997906, 0x03a9ccf4, 0x00353b59}}, Y: Field{[10]uint32{0x011df131, 0x0017462d, 0x015fa371, 0x01dd86c1, 0x0007472b, 0x00924dd9, 0x028a9729, 0x00220c7f, 0x017ce79a, 0x0023fdf9}}}, + {X: Field{[10]uint32{0x014fe70d, 0x03c7d1fd, 0x01366b32, 0x0373e45b, 0x0044d5df, 0x03070b29, 0x02e906f0, 0x00fbc83a, 0x02f19f41, 0x0022b495}}, Y: Field{[10]uint32{0x02d34da7, 0x0090fb69, 0x02ff494e, 0x01783497, 0x0134778f, 0x00725c86, 0x0147f659, 0x01371609, 0x03418d2c, 0x002f7bba}}}, + {X: Field{[10]uint32{0x01f17f8e, 0x018a854c, 0x0362f07f, 0x03b887c7, 0x01c67d22, 0x029561ee, 0x03723e01, 0x02d7c7c4, 0x02fafe55, 0x002374f8}}, Y: Field{[10]uint32{0x03c88cb0, 0x02fe4fd7, 0x0160b4b4, 0x0072e99a, 0x028f2db4, 0x036711b1, 0x017c6b65, 0x01c5f957, 0x02a47d6b, 0x002a88f4}}}, + {X: Field{[10]uint32{0x00b3d0f6, 0x01de9741, 0x01a678e5, 0x005d5536, 0x0103c139, 0x01ec3a4e, 0x034db01a, 0x00c2beb0, 0x02282a8e, 0x00113f67}}, Y: Field{[10]uint32{0x011a61d0, 0x003305a4, 0x0290e484, 0x001b32c4, 0x0218927d, 0x0256f6f8, 0x0269d592, 0x0066ce85, 0x00613533, 0x0032c1e4}}}, + {X: Field{[10]uint32{0x00b7aa42, 0x02c69c62, 0x02477746, 0x03d39691, 0x022db7c9, 0x025917d1, 0x01d2aa9c, 0x03b5960c, 0x02024464, 0x00174926}}, Y: Field{[10]uint32{0x037281d0, 0x03e2c501, 0x01a12b54, 0x03efca53, 0x0023bb8d, 0x0022d348, 0x0195f80e, 0x01ad70b1, 0x0386527d, 0x000affdc}}}, + {X: Field{[10]uint32{0x0210fb23, 0x0311f203, 0x008ca85a, 0x01502e50, 0x01ddd18b, 0x02247120, 0x01e123cd, 0x03547519, 0x00581edc, 0x003663ad}}, Y: Field{[10]uint32{0x00b4dcf2, 0x033086de, 0x010816a2, 0x005c6c99, 0x032b1537, 0x03c95326, 0x031f9e60, 0x01ab1bcb, 0x03bed375, 0x00056ff4}}}, + {X: Field{[10]uint32{0x00db6082, 0x02013591, 0x02eb5876, 0x01ba759c, 0x036edb48, 0x03a14543, 0x032134d2, 0x02bad884, 0x036919a2, 0x000bc4b0}}, Y: Field{[10]uint32{0x038cf73b, 0x004cf15f, 0x02dd0827, 0x031ef6a0, 0x0320834d, 0x030af438, 0x01264b8d, 0x00a313b7, 0x02dd3b4d, 0x00300447}}}, + {X: Field{[10]uint32{0x004b4624, 0x0005f0c5, 0x023e6f03, 0x00d23c1f, 0x02713260, 0x02f395ea, 0x01d35dfe, 0x0327e108, 0x02847099, 0x00136525}}, Y: Field{[10]uint32{0x01b673da, 0x02c7fff7, 0x02adb126, 0x0136c60b, 0x00b91f95, 0x022c1f68, 0x01b308fb, 0x01a71ca3, 0x0257d713, 0x0026bed6}}}, + {X: Field{[10]uint32{0x02af2466, 0x01a1c038, 0x008b2a97, 0x00936777, 0x020fca8f, 0x014aac5f, 0x020b39a7, 0x03c7238d, 0x01105e95, 0x0033c76e}}, Y: Field{[10]uint32{0x0247ca5f, 0x02371cfd, 0x020040ad, 0x029ecf4b, 0x015e645c, 0x02e59006, 0x001b94b4, 0x0219d29b, 0x0366c49c, 0x0039f267}}}, + {X: Field{[10]uint32{0x02a62b85, 0x0390a11a, 0x03f22a9e, 0x01fc16c9, 0x01d4b174, 0x00b19d61, 0x01d63a24, 0x03ea2ade, 0x00257d2f, 0x0039c7ad}}, Y: Field{[10]uint32{0x022c8865, 0x03d9099a, 0x033c3d10, 0x01e61c38, 0x023bc0a7, 0x0294f8d0, 0x0321f45d, 0x028dd9f5, 0x02ecf901, 0x002a41ab}}}, + {X: Field{[10]uint32{0x00559887, 0x0220aacc, 0x03b218f9, 0x01b289fa, 0x0321c58b, 0x0128a66f, 0x005c3e1b, 0x01d7d0ef, 0x03d30b25, 0x002f3661}}, Y: Field{[10]uint32{0x01483f65, 0x03a6ce87, 0x01b00761, 0x01324a27, 0x00690c1b, 0x018e93ad, 0x02fd894e, 0x02b89cae, 0x00c94339, 0x00100e01}}}, + {X: Field{[10]uint32{0x01f8cab0, 0x031f8d2c, 0x00042ea9, 0x02e9a559, 0x007a2beb, 0x029a7dd0, 0x01d2d5e8, 0x01c588e5, 0x00f748af, 0x002dd357}}, Y: Field{[10]uint32{0x0049b336, 0x015f7afa, 0x00a3ea3c, 0x02a9f73f, 0x035728df, 0x02be9150, 0x01e9a234, 0x03ed660d, 0x01db332b, 0x002d717f}}}, + {X: Field{[10]uint32{0x0160837d, 0x0146dc8d, 0x03edc572, 0x03b98cec, 0x01e9bc12, 0x02482faa, 0x03b3b13a, 0x0326b869, 0x02f59835, 0x0011bcf7}}, Y: Field{[10]uint32{0x010ce67b, 0x014f9a05, 0x02eca91d, 0x007040d7, 0x00818fb7, 0x01c0853b, 0x02a69778, 0x02e72cde, 0x021f2e8e, 0x00161ecb}}}, + {X: Field{[10]uint32{0x0267d572, 0x0133eddd, 0x018b6577, 0x02906457, 0x01a50ceb, 0x02ed80a6, 0x011f4d7c, 0x0025a379, 0x00fdeb3f, 0x00234d06}}, Y: Field{[10]uint32{0x00661db8, 0x014456ab, 0x022039d0, 0x00e03d2c, 0x03e8b3dd, 0x03d9ed31, 0x01da7c00, 0x02118aaa, 0x011016a2, 0x0033b9e6}}}, + {X: Field{[10]uint32{0x016f7c10, 0x033c84ab, 0x03bcf529, 0x01ede193, 0x0230f432, 0x02d9c94e, 0x020a672e, 0x01a575e2, 0x03094510, 0x002632c3}}, Y: Field{[10]uint32{0x020ab333, 0x0355abca, 0x0132f09f, 0x01d69af5, 0x03300fde, 0x00a14b47, 0x007e9b55, 0x0140d66d, 0x01ac4e1b, 0x0009654b}}}, + {X: Field{[10]uint32{0x0339a3cf, 0x02e6384a, 0x00effb58, 0x0132c0c3, 0x01a34c7c, 0x000f7841, 0x01383f3f, 0x01d7f129, 0x024c0ca0, 0x00258117}}, Y: Field{[10]uint32{0x0201bafe, 0x03548c5c, 0x00c6e8f2, 0x038e9412, 0x016ebd03, 0x02f577fb, 0x011f24f7, 0x010546e8, 0x00fd9223, 0x003d49ee}}}, + {X: Field{[10]uint32{0x01cc6030, 0x02fd5aa6, 0x0293e703, 0x03956642, 0x01c3f4b3, 0x035de5d8, 0x0226a9ca, 0x037be32e, 0x009142ad, 0x003c98ba}}, Y: Field{[10]uint32{0x030b594b, 0x00c8635b, 0x01ca1d1f, 0x02dcce4e, 0x035382c7, 0x0024bb3f, 0x0197dd67, 0x01aa403d, 0x036486c8, 0x0009d731}}}, + {X: Field{[10]uint32{0x016d17fe, 0x01c5f6c5, 0x016347cc, 0x0204f1b1, 0x03ad75ef, 0x03946eca, 0x01f7900b, 0x014cd97e, 0x0002ee17, 0x000335e7}}, Y: Field{[10]uint32{0x007a985d, 0x00000c65, 0x0394ac45, 0x023ad245, 0x014ff919, 0x01aaeeb8, 0x03260441, 0x0396f694, 0x00ffb30d, 0x002d7afa}}}, + {X: Field{[10]uint32{0x00f858f4, 0x00897e52, 0x009d280a, 0x00a73147, 0x02d9ba46, 0x018c20c2, 0x0122e03e, 0x01037780, 0x03225b1d, 0x000a2d2f}}, Y: Field{[10]uint32{0x00f3cac0, 0x00db894b, 0x027954ea, 0x03f2c439, 0x03aadf4f, 0x00c00a5e, 0x0134c6be, 0x01053529, 0x018998bb, 0x00091d58}}}, + {X: Field{[10]uint32{0x02ed2ff7, 0x02119731, 0x03ea016c, 0x00db1ec2, 0x03cc765c, 0x0184a297, 0x013344bc, 0x0177ce71, 0x02067dd5, 0x003c063c}}, Y: Field{[10]uint32{0x00aa7e66, 0x02803e39, 0x0261a960, 0x01da1b15, 0x00cda34a, 0x01454133, 0x02c1cd22, 0x02752b19, 0x02b2cd61, 0x00367f16}}}, + {X: Field{[10]uint32{0x024a7a13, 0x03621b10, 0x0394218e, 0x03c5222c, 0x027f661e, 0x03d1f2f6, 0x01dd5c74, 0x01b40a69, 0x00cf0808, 0x00125a5a}}, Y: Field{[10]uint32{0x021874e7, 0x012de1c7, 0x022dfc8d, 0x00909dd3, 0x00360b51, 0x01e71980, 0x017a3635, 0x0183803c, 0x03984420, 0x0035f637}}}, + {X: Field{[10]uint32{0x02efedab, 0x00405ac8, 0x03949892, 0x01728741, 0x03b98435, 0x00d80369, 0x02485749, 0x00eddda3, 0x0059e911, 0x00090b53}}, Y: Field{[10]uint32{0x020f42b1, 0x022de59e, 0x0257727a, 0x0081ac2b, 0x0342f509, 0x014155ce, 0x0228074a, 0x030bb58e, 0x03d7b0c8, 0x0011c373}}}, + {X: Field{[10]uint32{0x0385e8c7, 0x003d3744, 0x015861d2, 0x02f356ac, 0x03466280, 0x01794143, 0x004afacc, 0x01674e13, 0x00cc1a1a, 0x002dae01}}, Y: Field{[10]uint32{0x0121d439, 0x01e62ed9, 0x02d0c898, 0x019c2ec9, 0x0139b579, 0x00a0a7d0, 0x022a1d23, 0x00daa66e, 0x034602a6, 0x000bde24}}}, + {X: Field{[10]uint32{0x01918a4e, 0x02d26dc7, 0x011ca0d1, 0x00b4a931, 0x0346904b, 0x00a04092, 0x038048af, 0x017f74e2, 0x03d07ecc, 0x00370c28}}, Y: Field{[10]uint32{0x018cc917, 0x014469b0, 0x0110febb, 0x02d9e29f, 0x02b701f7, 0x024da952, 0x03536987, 0x003a5d63, 0x01b07055, 0x000c9902}}}, + {X: Field{[10]uint32{0x03d3fab8, 0x0057cad0, 0x013c20c0, 0x00d25de0, 0x005fb229, 0x03d3d12b, 0x02bb6280, 0x03ccc20e, 0x034d345b, 0x00387f90}}, Y: Field{[10]uint32{0x034c4d83, 0x0256c1dd, 0x03f7a59a, 0x00b0b735, 0x03d3b31b, 0x038f4581, 0x008df48c, 0x025eb130, 0x00a52af8, 0x0006c947}}}, + {X: Field{[10]uint32{0x02fb8d08, 0x03f5745d, 0x02060bd1, 0x004f3f5c, 0x0182c2f5, 0x039dd591, 0x03e4a40e, 0x03178abe, 0x00dae08a, 0x002a3b62}}, Y: Field{[10]uint32{0x00175729, 0x007e7ce1, 0x0081b77b, 0x023c74a5, 0x035cc2d9, 0x005eca9b, 0x02f5b537, 0x0258c3ee, 0x00b07441, 0x003d3ed8}}}, + {X: Field{[10]uint32{0x007c6481, 0x0295e40b, 0x0143f76f, 0x004e8389, 0x008e7707, 0x0314348a, 0x01c083ee, 0x02735f25, 0x0028de1e, 0x002d4b3e}}, Y: Field{[10]uint32{0x0375790f, 0x017abdc6, 0x02d833c9, 0x0314dd23, 0x0343eebd, 0x00f8ed4a, 0x03dc729d, 0x03eefe40, 0x01530046, 0x0018d68e}}}, + {X: Field{[10]uint32{0x021d5e83, 0x01e0a485, 0x0178e4dc, 0x015358d2, 0x00b1297c, 0x02ab64ff, 0x03957a94, 0x026ff732, 0x01aef76d, 0x001c081e}}, Y: Field{[10]uint32{0x02783b52, 0x00419096, 0x01f82c8c, 0x011712e5, 0x0132a43a, 0x0031b76e, 0x033a202e, 0x00714b4e, 0x008bf2d8, 0x001260f0}}}, + {X: Field{[10]uint32{0x0257bbf5, 0x00fb8baf, 0x009a0dd7, 0x02e544f3, 0x023ed3dc, 0x02d0de38, 0x00fe8cbd, 0x03873bbd, 0x00d18e9d, 0x00118e35}}, Y: Field{[10]uint32{0x0327e110, 0x01fbc832, 0x01e87cf7, 0x01029654, 0x020cb507, 0x007e8daf, 0x00853f75, 0x00c19a5a, 0x003245cc, 0x001587b8}}}, + {X: Field{[10]uint32{0x03386bfc, 0x02c8b64e, 0x039cbecf, 0x02024410, 0x01d98e48, 0x00f4280e, 0x021dc5ee, 0x02b77b55, 0x02b75fac, 0x003bacd3}}, Y: Field{[10]uint32{0x02e57c4c, 0x0308d269, 0x00af4c21, 0x00eb473d, 0x00e9d8f6, 0x030c46a5, 0x018db8c1, 0x03723015, 0x00ff05eb, 0x003cac8f}}}, + {X: Field{[10]uint32{0x012c45ca, 0x01a167b1, 0x0175e5c5, 0x0190f7dd, 0x01f70a8c, 0x03efa38e, 0x0107df0c, 0x00c84f07, 0x02e5becf, 0x0001fcb1}}, Y: Field{[10]uint32{0x02b6c89d, 0x03903788, 0x0189a77b, 0x03bac847, 0x02cf9d66, 0x03614794, 0x01a04248, 0x0276b83f, 0x01c01971, 0x00254126}}}, + {X: Field{[10]uint32{0x03e53647, 0x008cc0c8, 0x00f81856, 0x003daa54, 0x023cea09, 0x013e2c05, 0x0211064d, 0x0349f3df, 0x03221ec5, 0x001bb1d9}}, Y: Field{[10]uint32{0x0269a3d6, 0x02c5c0eb, 0x01254984, 0x02816b5d, 0x01d0aa7b, 0x0018f13f, 0x02ec7d0f, 0x03a0e723, 0x03579704, 0x0026c0f1}}}, + {X: Field{[10]uint32{0x024dea7e, 0x027e2914, 0x02f5499e, 0x01eb16ca, 0x01b44a70, 0x01e3d9f3, 0x03184b03, 0x017b2807, 0x029d320d, 0x00263dbd}}, Y: Field{[10]uint32{0x02b69a02, 0x03d509bc, 0x0244d79e, 0x0375e324, 0x02ca54a3, 0x015af0ce, 0x01333fe0, 0x01d98e5e, 0x033d7b03, 0x0009bbda}}}, + {X: Field{[10]uint32{0x0347e390, 0x0073c156, 0x017af296, 0x01a0b67b, 0x012d3086, 0x03005c32, 0x037ac998, 0x00b1d975, 0x004558b8, 0x0033c7bd}}, Y: Field{[10]uint32{0x018511c3, 0x037d1192, 0x03d23bef, 0x0360d8e5, 0x00f4345b, 0x016bfbfa, 0x022d8f3f, 0x003b1e1d, 0x0105fb88, 0x0022f307}}}, + {X: Field{[10]uint32{0x006f07e8, 0x00a02863, 0x035aa37c, 0x02096821, 0x009ab62b, 0x01653cde, 0x00cc5c10, 0x01bcbbe2, 0x0251efa2, 0x00043805}}, Y: Field{[10]uint32{0x01779df2, 0x03540fae, 0x00c0a8fa, 0x028c1f8a, 0x0083105d, 0x0222aaa6, 0x03b2cdb7, 0x018cd4c3, 0x01e11f77, 0x000b9a85}}}, + {X: Field{[10]uint32{0x013eee4a, 0x009e59ba, 0x01a58054, 0x0114482e, 0x000af909, 0x01260c4c, 0x03d77d74, 0x00826dbb, 0x03e041ce, 0x002e538b}}, Y: Field{[10]uint32{0x01bca443, 0x01c50b72, 0x020f01d0, 0x02349dda, 0x01a86bfb, 0x011b7c43, 0x00b1dde7, 0x024bd577, 0x03f1103e, 0x00023dea}}}, + {X: Field{[10]uint32{0x02d41154, 0x0174acc5, 0x02ccc122, 0x00d385fc, 0x026d71cc, 0x011362bd, 0x01d233e2, 0x02a7a851, 0x0102c671, 0x0033e79f}}, Y: Field{[10]uint32{0x012d2ca7, 0x03bfe143, 0x00c4ee13, 0x02ef86d8, 0x01a853e2, 0x021e3e5a, 0x003858a3, 0x0259beef, 0x00a10f0b, 0x0020bbae}}}, + {X: Field{[10]uint32{0x03d48bb2, 0x00e6bfd2, 0x034366d5, 0x00af814b, 0x00df8e4f, 0x033d2e4d, 0x01d18ebd, 0x00ee44c6, 0x002994ad, 0x00368e8f}}, Y: Field{[10]uint32{0x01dc0193, 0x01a6a474, 0x00f54256, 0x03b7db6d, 0x035e0d32, 0x03b21998, 0x01ccfe7b, 0x0091e20c, 0x0253c404, 0x000a3e75}}}, + {X: Field{[10]uint32{0x01eec101, 0x0289ec3c, 0x02450d4b, 0x03274394, 0x00a0a095, 0x00a0c7cc, 0x014c9fcd, 0x00de2f64, 0x00182b80, 0x002ae04a}}, Y: Field{[10]uint32{0x026666b3, 0x01351780, 0x0078f142, 0x00ab7030, 0x022286dc, 0x02ec7602, 0x00e366af, 0x01db58f7, 0x01822748, 0x00016af1}}}, + {X: Field{[10]uint32{0x01c4977a, 0x01023df9, 0x014ab831, 0x019fe37e, 0x03f0edd9, 0x00259714, 0x0164391c, 0x032a9757, 0x02a2bf02, 0x003a96e0}}, Y: Field{[10]uint32{0x033d9339, 0x022f3a3f, 0x02cac5d2, 0x00fa25f6, 0x022518d5, 0x01ee2239, 0x01dd5040, 0x0020deb3, 0x02990f32, 0x00207fa0}}}, + {X: Field{[10]uint32{0x03e70fa2, 0x02e3ef3e, 0x00d2ca95, 0x0305f7d6, 0x01318aea, 0x00f68b4a, 0x01d618be, 0x0075f40f, 0x000bab20, 0x00141817}}, Y: Field{[10]uint32{0x02a60383, 0x03ce5f5c, 0x028afc03, 0x03f1b0a9, 0x02d4c978, 0x024a335b, 0x02cc160d, 0x015a4f13, 0x031e007b, 0x00003942}}}, + {X: Field{[10]uint32{0x021191dd, 0x0162c97a, 0x0316831b, 0x0184422d, 0x02513566, 0x0153de6d, 0x01409d88, 0x032b3bd1, 0x00b66d7d, 0x003ddb14}}, Y: Field{[10]uint32{0x01f3cc72, 0x0346041b, 0x01f86d3b, 0x0121dc83, 0x03a30401, 0x025fc1ec, 0x00e2e93a, 0x014502f0, 0x0374b019, 0x001f4156}}}, + {X: Field{[10]uint32{0x03260e7d, 0x00f65664, 0x01b32f6d, 0x0240af5e, 0x01413126, 0x01cb9384, 0x02367db2, 0x0011f330, 0x03bad716, 0x00379414}}, Y: Field{[10]uint32{0x017cc7e2, 0x00e37872, 0x03bf3d3f, 0x02041444, 0x03b1e4c5, 0x017d180c, 0x02b61b5b, 0x02c36c37, 0x02d39c34, 0x00071528}}}, + {X: Field{[10]uint32{0x0206499d, 0x03df237e, 0x017121af, 0x00902527, 0x00437f1a, 0x03786395, 0x018a332b, 0x0251ac6e, 0x019f180e, 0x002b4f9c}}, Y: Field{[10]uint32{0x02f1b554, 0x032b4f80, 0x032c882b, 0x037df28b, 0x03ef310a, 0x02fb7018, 0x0073863a, 0x02935f49, 0x03f1390f, 0x002d1635}}}, + {X: Field{[10]uint32{0x036bae4b, 0x03210330, 0x026ecb46, 0x039db899, 0x01839a3a, 0x00cbe2de, 0x010c8673, 0x02bdad8c, 0x02345560, 0x0009c280}}, Y: Field{[10]uint32{0x02bedeaf, 0x005a8653, 0x01bc689d, 0x01c86f6d, 0x01ef7ef0, 0x02661de8, 0x020f1600, 0x01f45832, 0x004b9215, 0x00236aae}}}, + {X: Field{[10]uint32{0x00624621, 0x00cd3b9a, 0x02d30f98, 0x016cafdc, 0x0325ba2b, 0x012a13fd, 0x03ffdb29, 0x03271321, 0x017e3027, 0x003ad7b4}}, Y: Field{[10]uint32{0x0060a942, 0x012d3b02, 0x003ae3b5, 0x02ff5667, 0x03df4a91, 0x013186b4, 0x028d1a21, 0x0351c66f, 0x00b38f74, 0x000e7fff}}}, + {X: Field{[10]uint32{0x00e0a5dd, 0x0304d70b, 0x02d6a7ba, 0x00869d5c, 0x01fb1f66, 0x016b351a, 0x03f4e807, 0x02633188, 0x01f28a0b, 0x002e7047}}, Y: Field{[10]uint32{0x00a76278, 0x03b15150, 0x00a1e391, 0x028938bf, 0x015eb506, 0x024aceea, 0x03eb0c36, 0x0257bcc9, 0x0278d42b, 0x0016fea2}}}, + {X: Field{[10]uint32{0x03e74b5c, 0x018c433a, 0x0221ca8a, 0x0264f126, 0x00f60f13, 0x03b68102, 0x02611066, 0x038967f9, 0x004380ab, 0x003bb45c}}, Y: Field{[10]uint32{0x02a0d750, 0x03576dc8, 0x0324a567, 0x018594b0, 0x028cc2c6, 0x01ebf366, 0x02a243f5, 0x01ee4458, 0x0276cbe3, 0x001b72d8}}}, + {X: Field{[10]uint32{0x03aa97a7, 0x01400314, 0x034c2526, 0x00417b8d, 0x028c68e3, 0x02b7d8ad, 0x025524a4, 0x0273d1a3, 0x036f5f5b, 0x002392c3}}, Y: Field{[10]uint32{0x01b7f74a, 0x004dfb30, 0x00d56e25, 0x00b455f0, 0x02c7e59f, 0x0341063d, 0x00578c16, 0x000646dd, 0x00aec18d, 0x00347e20}}}, + {X: Field{[10]uint32{0x02a5ebbe, 0x03d67232, 0x0176e90c, 0x036848e3, 0x01a7f393, 0x00c44ac7, 0x005ce9c9, 0x025ae6ba, 0x01bdfc65, 0x001deb88}}, Y: Field{[10]uint32{0x034a21d1, 0x01b151ff, 0x02f9b910, 0x005cc81b, 0x03516947, 0x01ca4553, 0x0225390e, 0x019b37d1, 0x01811e32, 0x003d1211}}}, + {X: Field{[10]uint32{0x03d2346f, 0x035ac1f6, 0x03999e16, 0x00cfc140, 0x01929225, 0x01419899, 0x028bd35f, 0x00bbd166, 0x00a871c0, 0x00074de7}}, Y: Field{[10]uint32{0x0140cad0, 0x002ddc90, 0x011c10d5, 0x01785e36, 0x00a6333d, 0x006571c1, 0x0197cfed, 0x0269ed08, 0x039a7289, 0x00301542}}}, + {X: Field{[10]uint32{0x03ef1ccc, 0x0359c30f, 0x00296cba, 0x0085f51f, 0x025c7ea7, 0x03c09dca, 0x03671995, 0x005aba64, 0x03f328fc, 0x00189405}}, Y: Field{[10]uint32{0x00450603, 0x0269d359, 0x02bf3618, 0x001985f0, 0x02d7056d, 0x0004437d, 0x03eb4ac5, 0x00853fb6, 0x0253af3b, 0x0006d138}}}, + {X: Field{[10]uint32{0x0238412d, 0x029cae01, 0x01eb78ea, 0x0059d029, 0x00d1019d, 0x010e1dfa, 0x023f508d, 0x00d424eb, 0x02496bdc, 0x0031e93f}}, Y: Field{[10]uint32{0x020febef, 0x02a5d125, 0x016fba30, 0x022d9d66, 0x01673093, 0x012e3dcd, 0x03924067, 0x01c4c3a1, 0x02a895fb, 0x0006d6c4}}}, + {X: Field{[10]uint32{0x02441d3f, 0x00a0d22c, 0x0052fa56, 0x019add3c, 0x01b65c61, 0x03123102, 0x000102cb, 0x0313bcfa, 0x003ce8f9, 0x0033fe7e}}, Y: Field{[10]uint32{0x0352ee6f, 0x038cb378, 0x0252e338, 0x001ea2f4, 0x02814ceb, 0x035a5cfc, 0x0046a41e, 0x0081fbf2, 0x00f82180, 0x00133106}}}, + {X: Field{[10]uint32{0x02700541, 0x0011c859, 0x02ef82c6, 0x0395eb79, 0x002fd23a, 0x027a8477, 0x038ae98a, 0x030a5724, 0x031045b8, 0x0021009d}}, Y: Field{[10]uint32{0x001e4f99, 0x0381c8e1, 0x01da5f56, 0x033502c5, 0x03f3f80d, 0x02ea0753, 0x01b972ce, 0x00501220, 0x0192d3c1, 0x001ca519}}}, + {X: Field{[10]uint32{0x012e0d2c, 0x01c18503, 0x004afb5c, 0x013aa53e, 0x015e304a, 0x023d548b, 0x01a346bd, 0x02e7b018, 0x0330e00c, 0x003deac4}}, Y: Field{[10]uint32{0x035e6144, 0x004406f7, 0x02f866bb, 0x028e7753, 0x012ef0f6, 0x03cfcf5a, 0x018def46, 0x002952bd, 0x00518935, 0x001752b2}}}, + {X: Field{[10]uint32{0x03d4e618, 0x0062131b, 0x0292c785, 0x037304fd, 0x01d0da4d, 0x021b260a, 0x01a4d5b7, 0x02dde230, 0x02192303, 0x0029f213}}, Y: Field{[10]uint32{0x031774fe, 0x02e915ae, 0x01744939, 0x00cea0a7, 0x01659285, 0x0178fc45, 0x0164bad3, 0x036cbc87, 0x025b8fc2, 0x0015b8cb}}}, + {X: Field{[10]uint32{0x0098c43a, 0x0276036b, 0x00dccf19, 0x00e41fd7, 0x02c65f41, 0x0299de9c, 0x03bc55af, 0x036b00d8, 0x0084a680, 0x002e2c32}}, Y: Field{[10]uint32{0x016b8127, 0x0239c794, 0x03932d0f, 0x01e98976, 0x016569f8, 0x013b6c11, 0x02bec5ba, 0x001b0735, 0x008ac926, 0x0010f906}}}, + {X: Field{[10]uint32{0x025e0df6, 0x014120a9, 0x038ddac2, 0x023a50eb, 0x01c5bef9, 0x036d285e, 0x03bc33c1, 0x0184d568, 0x0043d057, 0x00205bb1}}, Y: Field{[10]uint32{0x01f0b360, 0x021f1215, 0x022a9c9b, 0x00c04862, 0x02054f9a, 0x01b8d9ad, 0x00f6fa19, 0x01623664, 0x02c9e9f3, 0x002269ec}}}, + {X: Field{[10]uint32{0x011e28a0, 0x027526aa, 0x03fd2af3, 0x003cedc5, 0x00b10196, 0x03f3311f, 0x03ba24f7, 0x001f54cf, 0x0103823d, 0x00237b48}}, Y: Field{[10]uint32{0x00011728, 0x02549b30, 0x02ad4fb1, 0x0244a9a0, 0x01e3e1a3, 0x01d4faab, 0x03ef9f7d, 0x01987bd0, 0x011fbe1a, 0x000fc0fb}}}, + {X: Field{[10]uint32{0x00d6260b, 0x026baab4, 0x00c87484, 0x0312fb88, 0x010ff4f7, 0x03a30c59, 0x03df9e3c, 0x0351e2fe, 0x039ce874, 0x002c712c}}, Y: Field{[10]uint32{0x004b4fde, 0x02f48db0, 0x00dbda54, 0x02137ef1, 0x0132c25b, 0x00e5ab72, 0x03fe7245, 0x006207ee, 0x03613070, 0x000e2be2}}}, + {X: Field{[10]uint32{0x02b2c971, 0x0176b67e, 0x0390d0e7, 0x03c9f842, 0x01f011bc, 0x02af2082, 0x03f657cf, 0x00face85, 0x023be595, 0x001f56f3}}, Y: Field{[10]uint32{0x00f84787, 0x03b78aac, 0x0167cbbc, 0x029d0198, 0x01864b2b, 0x00b0e792, 0x0308b3b6, 0x035e0ac1, 0x02865f5f, 0x001ce035}}}, + {X: Field{[10]uint32{0x0000f285, 0x034ae1d3, 0x01497a54, 0x01e22c8a, 0x00096af1, 0x031c5c71, 0x027717fb, 0x03cb3453, 0x011a422a, 0x000abd44}}, Y: Field{[10]uint32{0x03771f41, 0x012fabae, 0x0259f753, 0x031722b2, 0x032f3445, 0x01ecec90, 0x0000b68b, 0x03c401fa, 0x031bee43, 0x00111a2f}}}, + {X: Field{[10]uint32{0x037af766, 0x029ed258, 0x0155dc81, 0x02ba8b42, 0x01fe010d, 0x01010ed8, 0x03dfb65f, 0x0377bfe2, 0x01c06dc8, 0x002d1b8a}}, Y: Field{[10]uint32{0x017b59f5, 0x03b27767, 0x016459c1, 0x026c2714, 0x03748c5c, 0x01289ea7, 0x010cef82, 0x00c53f5f, 0x0095ae16, 0x00189ddd}}}, + {X: Field{[10]uint32{0x03a6b1ea, 0x02c8673e, 0x034a5089, 0x03e9648e, 0x00aef6d8, 0x00e73545, 0x02b3bd53, 0x02903dc7, 0x02d3f44e, 0x000415e1}}, Y: Field{[10]uint32{0x0343d0bc, 0x0001736d, 0x00f151ba, 0x00927f0b, 0x0139fad0, 0x03a1b42e, 0x012c4508, 0x008b2df6, 0x03dac875, 0x000a93a9}}}, + {X: Field{[10]uint32{0x02adb23f, 0x0093d205, 0x038575c6, 0x03bfc22d, 0x02d2d2d8, 0x024b3ac8, 0x01345738, 0x01b8c062, 0x0081be85, 0x0007cf03}}, Y: Field{[10]uint32{0x03f6072b, 0x03a959e2, 0x031c9faa, 0x014b4c9c, 0x0011158d, 0x027135ed, 0x02f48408, 0x012673d4, 0x0290de24, 0x0001cc85}}}, + {X: Field{[10]uint32{0x028bd2b3, 0x03d1aa91, 0x01c9f5ab, 0x01afc5be, 0x02e43787, 0x020cee83, 0x012484ff, 0x0257e824, 0x02e3a95a, 0x0005b72e}}, Y: Field{[10]uint32{0x01ffa44d, 0x027c9056, 0x00034344, 0x00ab3785, 0x0030e558, 0x031a45c0, 0x02de4733, 0x004b5b06, 0x0007247b, 0x00159c9f}}}, + {X: Field{[10]uint32{0x02e70726, 0x02510e36, 0x03fff1c7, 0x029927b6, 0x02e42314, 0x017b6af1, 0x00ff3c0f, 0x00f23e49, 0x016cd672, 0x000452f9}}, Y: Field{[10]uint32{0x028ac521, 0x03641949, 0x035e1d5f, 0x01d6511c, 0x0245b61b, 0x00cb3e9e, 0x0180046b, 0x037ab9f1, 0x0172855c, 0x00026137}}}, + {X: Field{[10]uint32{0x0103fdaf, 0x02dfab36, 0x0217d747, 0x00ea35d3, 0x0351766b, 0x03d6eaff, 0x029dbac7, 0x0211cb85, 0x02e601f9, 0x0023432c}}, Y: Field{[10]uint32{0x00bc9b92, 0x03dcdaa0, 0x0160a0f1, 0x02ae2678, 0x01f06b36, 0x033aaec4, 0x00ea3682, 0x024fdc97, 0x03f5b9e7, 0x0034564e}}}, + {X: Field{[10]uint32{0x01714db3, 0x01c9fd4c, 0x005caab4, 0x00f9212d, 0x0134e3b4, 0x020125a4, 0x032f3a2c, 0x020b936d, 0x0354188c, 0x0016d081}}, Y: Field{[10]uint32{0x00723d9f, 0x01b304e9, 0x008838bf, 0x0171dd66, 0x001c7eed, 0x0066f852, 0x00d16437, 0x03cd81eb, 0x007d27d7, 0x0012a24c}}}, + {X: Field{[10]uint32{0x00cbf74b, 0x006d63e2, 0x006ed18c, 0x00b87311, 0x019f01c6, 0x0003f82d, 0x0056a728, 0x00765a36, 0x021d9576, 0x002478dd}}, Y: Field{[10]uint32{0x0396c772, 0x00494c0a, 0x02bc7258, 0x03034cf7, 0x01b73a58, 0x02667bd5, 0x033389e9, 0x020dd8a3, 0x01e396f8, 0x002d6ad8}}}, + {X: Field{[10]uint32{0x001a4655, 0x0174a717, 0x02ad35b0, 0x007c0b62, 0x02016e0f, 0x02af814a, 0x02f55480, 0x0397ca70, 0x0383dc77, 0x000c4e02}}, Y: Field{[10]uint32{0x0193403d, 0x00ff8999, 0x01b20107, 0x02f06a87, 0x02b42173, 0x020e7342, 0x0034342b, 0x03a9c8f1, 0x03aecc84, 0x0008f32b}}}, + {X: Field{[10]uint32{0x021edd27, 0x0336a02c, 0x0239a764, 0x009e8325, 0x038f3f37, 0x02406554, 0x00b44c7c, 0x01099241, 0x018cbcd5, 0x002b9006}}, Y: Field{[10]uint32{0x00eeba8f, 0x02b988cd, 0x012005cf, 0x0269b0e7, 0x02ffceea, 0x009f6628, 0x01a0e7c8, 0x0333f336, 0x0308ffec, 0x0000e95f}}}, + {X: Field{[10]uint32{0x00a981c8, 0x0093222a, 0x0015f73e, 0x0151c9ed, 0x015764a8, 0x0066ec09, 0x01b1d3ac, 0x0303c492, 0x0387abea, 0x003d1ca5}}, Y: Field{[10]uint32{0x0265d172, 0x02d3a7ab, 0x0319d00a, 0x00542ff9, 0x03b51aae, 0x03851b41, 0x039783fd, 0x004ca31f, 0x01a568d8, 0x0038c458}}}, + {X: Field{[10]uint32{0x02d5884a, 0x03205d5f, 0x03b69ce4, 0x023029f5, 0x02f52d3b, 0x03a13429, 0x0059b617, 0x0224d3dc, 0x02b83414, 0x003e4bc0}}, Y: Field{[10]uint32{0x00864080, 0x00f3d06a, 0x026b706f, 0x023c3eed, 0x03cacd20, 0x031b7a92, 0x00eb5305, 0x00c08222, 0x02f88273, 0x003ebb5f}}}, + {X: Field{[10]uint32{0x00c93363, 0x00f385df, 0x01ec49ed, 0x008acac3, 0x029efe40, 0x007e13f0, 0x028cc4dd, 0x035a082f, 0x00aae93b, 0x0028afb6}}, Y: Field{[10]uint32{0x018ada1d, 0x003277c6, 0x00213d63, 0x02cecfc2, 0x027bf235, 0x03b7ae27, 0x0340f299, 0x01bedf80, 0x01c96212, 0x000a1eae}}}, + {X: Field{[10]uint32{0x03af4724, 0x01063e6d, 0x0198e899, 0x038b80a5, 0x00cf6219, 0x024c204d, 0x0309dc80, 0x00474666, 0x03cd3d18, 0x001690b3}}, Y: Field{[10]uint32{0x013f8423, 0x03ba3c16, 0x007172e0, 0x00f583ee, 0x02e30141, 0x002fc970, 0x02a83b18, 0x0275dac3, 0x021c3992, 0x0025739c}}}, + {X: Field{[10]uint32{0x030e530f, 0x028ae516, 0x0278940b, 0x01ae850d, 0x012e768a, 0x0105d421, 0x03f1eca4, 0x02fc64c8, 0x030567e8, 0x000749ea}}, Y: Field{[10]uint32{0x01e1afa8, 0x00cf9a84, 0x01b07c6c, 0x03775468, 0x02a23e3d, 0x01ac124c, 0x02532be7, 0x00a68562, 0x0139496d, 0x000610e6}}}, + {X: Field{[10]uint32{0x02ab4326, 0x01d2451b, 0x03d319bc, 0x0222dc98, 0x01bbbf80, 0x01337cff, 0x002fcf6e, 0x016fd12d, 0x005922c0, 0x00164afe}}, Y: Field{[10]uint32{0x004c7f65, 0x016f1d00, 0x0201e7d9, 0x01da3dfd, 0x013aaab9, 0x028bab09, 0x03946f3b, 0x03c3bf78, 0x00c38dcc, 0x002132f6}}}, + {X: Field{[10]uint32{0x009359d5, 0x02785bc0, 0x00fcf1dd, 0x015b40f1, 0x010d4df1, 0x03bab710, 0x0001f4ad, 0x036ae2ff, 0x02705ae3, 0x00199cc2}}, Y: Field{[10]uint32{0x038273ee, 0x03d5e81d, 0x03718582, 0x00b1218f, 0x036e8f42, 0x026e7bec, 0x03b91701, 0x0362c89c, 0x00c44ea1, 0x0030131f}}}, + {X: Field{[10]uint32{0x03b7fe83, 0x016453b6, 0x011ae07c, 0x01ee5e52, 0x001ce689, 0x01392158, 0x03b246d8, 0x0082b027, 0x02005324, 0x000f4009}}, Y: Field{[10]uint32{0x00c7d98e, 0x010775e5, 0x0152a532, 0x0074c871, 0x03c221fa, 0x00925148, 0x00c48557, 0x03539def, 0x02642f16, 0x0016f5cc}}}, + {X: Field{[10]uint32{0x03a24487, 0x03509d50, 0x021c061e, 0x02b5c42a, 0x02750395, 0x008b8b0a, 0x0089d37d, 0x0348bf48, 0x02362b5d, 0x000350ab}}, Y: Field{[10]uint32{0x0339ada7, 0x01863fb2, 0x02fc9c2a, 0x0126ca84, 0x00ded0a6, 0x0046dbdf, 0x03cc24ba, 0x0387a94e, 0x02001571, 0x002110e7}}}, + {X: Field{[10]uint32{0x02253743, 0x03c494ea, 0x01670ede, 0x00796f74, 0x00409e10, 0x0063a41d, 0x00b306dc, 0x02aff400, 0x01ca486f, 0x000df1d8}}, Y: Field{[10]uint32{0x010cad12, 0x01fd99ee, 0x033d0627, 0x02a5701f, 0x0129669d, 0x01ecb2e2, 0x02c241ae, 0x0036c627, 0x00e30111, 0x00394e10}}}, + {X: Field{[10]uint32{0x03b0e788, 0x027b42bc, 0x0345b288, 0x0206865c, 0x002afa97, 0x016b035b, 0x0019f371, 0x02f23bae, 0x02f8bbaf, 0x001399cb}}, Y: Field{[10]uint32{0x00814061, 0x03f3d30e, 0x0385204a, 0x02e5464d, 0x03130cb0, 0x018b83aa, 0x000133fe, 0x03601d1a, 0x00dbbb16, 0x0027043c}}}, + {X: Field{[10]uint32{0x03d51fec, 0x01e475a3, 0x03a68ed8, 0x004bcd6a, 0x0108e1df, 0x01bd8a52, 0x00635ae6, 0x01e4a7a7, 0x003b23c0, 0x00307ca5}}, Y: Field{[10]uint32{0x0264ae75, 0x0352ffba, 0x005fdfc4, 0x0319a001, 0x012f2262, 0x029ac441, 0x01f7ef96, 0x017b1664, 0x02c893ad, 0x000cddad}}}, + {X: Field{[10]uint32{0x00370be6, 0x0180abb0, 0x00ffce17, 0x01b5ebf7, 0x01351e82, 0x0198f994, 0x00f10cdf, 0x036611cb, 0x021e739c, 0x000f7c91}}, Y: Field{[10]uint32{0x0292cb06, 0x000340b1, 0x0301fc9f, 0x0295fbab, 0x02bd5ec5, 0x0206b6aa, 0x014eeb00, 0x0303b0d6, 0x00b33ed9, 0x0017923f}}}, + {X: Field{[10]uint32{0x022a82b7, 0x02307cf5, 0x033fd551, 0x009d6d8e, 0x0150f123, 0x02d83f61, 0x004ecfba, 0x024b57d3, 0x0128f98b, 0x003534f5}}, Y: Field{[10]uint32{0x027d5b76, 0x0034b3b6, 0x01a2e049, 0x00ed52c1, 0x01255405, 0x02612f02, 0x01a838ed, 0x01779a64, 0x01508543, 0x0019125b}}}, + {X: Field{[10]uint32{0x0209236b, 0x039f4084, 0x01108b3e, 0x011c3889, 0x03ad6448, 0x00ffc0e9, 0x03a41136, 0x00da3c69, 0x019b4aa3, 0x003b360e}}, Y: Field{[10]uint32{0x01355213, 0x00dc48dd, 0x011af30f, 0x023c1329, 0x01c629d8, 0x00f00b2d, 0x0351e617, 0x0070a438, 0x01fba792, 0x000b8482}}}, + {X: Field{[10]uint32{0x01f78722, 0x00cb8273, 0x01ae38c3, 0x01c1e173, 0x01416d1a, 0x02cd1356, 0x033354af, 0x0036a40c, 0x03e57e6a, 0x00356642}}, Y: Field{[10]uint32{0x03a17814, 0x0316445e, 0x01eceeef, 0x03224e5e, 0x00278f73, 0x01110402, 0x039198d3, 0x01bcf441, 0x018b73f7, 0x002ca8b3}}}, + {X: Field{[10]uint32{0x00374b1b, 0x03c10aa4, 0x0174f85e, 0x0224a1ef, 0x02b57e90, 0x01876007, 0x03d59786, 0x03b402bc, 0x03651d8c, 0x001d662a}}, Y: Field{[10]uint32{0x0028f04f, 0x036d835b, 0x00240b60, 0x021e3d33, 0x027edaae, 0x0008ba7b, 0x000cbd4b, 0x02c7fee7, 0x00269466, 0x001627f1}}}, + {X: Field{[10]uint32{0x01f694e7, 0x0248b3d0, 0x00e7d7e0, 0x03f663af, 0x03be088c, 0x00714c06, 0x02048b76, 0x00b4c614, 0x0017b12d, 0x003f41c5}}, Y: Field{[10]uint32{0x0232c363, 0x013688ef, 0x00b45966, 0x01d163be, 0x00d47d8f, 0x01ad5236, 0x01f679d9, 0x00ee4cab, 0x03f10ee6, 0x000b6714}}}, + {X: Field{[10]uint32{0x0372ca0e, 0x01b3804a, 0x038d15e5, 0x02ff2f0a, 0x02b1e513, 0x03a4d1fc, 0x01571ac8, 0x021a2b47, 0x0190e290, 0x001696d2}}, Y: Field{[10]uint32{0x03ebf968, 0x0186663b, 0x005d5e51, 0x039fa0c5, 0x01424285, 0x0313271f, 0x01569f63, 0x02549150, 0x02f50715, 0x0031da14}}}, + {X: Field{[10]uint32{0x01e7f2bd, 0x023015bf, 0x020f5972, 0x02057cf4, 0x0225c900, 0x01ba9bcd, 0x035a415f, 0x03c5190b, 0x00243cd4, 0x0024f7bb}}, Y: Field{[10]uint32{0x032dc7cb, 0x0217c96f, 0x0336dd5e, 0x0164641d, 0x006abfa8, 0x0150527d, 0x0378145f, 0x00e85987, 0x01beb999, 0x00223e46}}}, + {X: Field{[10]uint32{0x02df82b6, 0x02645f91, 0x02602f5c, 0x01f9d84e, 0x019c9bec, 0x001a350e, 0x01104c93, 0x03659e5a, 0x017ba65a, 0x00248934}}, Y: Field{[10]uint32{0x00a32f65, 0x03bef3c6, 0x0071055c, 0x03ef3d69, 0x001b5691, 0x03ac4193, 0x0289e54e, 0x0293a31d, 0x00e32bc2, 0x000d1b26}}}, + {X: Field{[10]uint32{0x0379c38e, 0x015450ce, 0x011890f0, 0x00ddb956, 0x01cfc916, 0x01cd1e9c, 0x00f054b8, 0x03fe7053, 0x009124dd, 0x002146b3}}, Y: Field{[10]uint32{0x02116f35, 0x031a7307, 0x0213a55c, 0x03c4c3c3, 0x022dd20b, 0x03127715, 0x00527e8c, 0x00730d0c, 0x01f058d2, 0x0036566f}}}, + {X: Field{[10]uint32{0x00ea4d96, 0x0041d7cb, 0x012122b7, 0x004a4c7e, 0x00eff0a6, 0x0120a544, 0x03e01ef4, 0x00471421, 0x0303b7c1, 0x003fdb04}}, Y: Field{[10]uint32{0x034841f6, 0x003ba85e, 0x01574537, 0x03fd6a56, 0x027e99d0, 0x02495417, 0x02239beb, 0x0142a832, 0x03bf7bcf, 0x00093c26}}}, + {X: Field{[10]uint32{0x035fdac0, 0x02f18d90, 0x029d06a4, 0x013d3d32, 0x020fd501, 0x022dbb2d, 0x03fb51ec, 0x02f4750c, 0x01f055e7, 0x003c8ef6}}, Y: Field{[10]uint32{0x016d7b60, 0x00653ba9, 0x03da69d2, 0x01f7c482, 0x0325ba91, 0x03b91d11, 0x02e7012a, 0x026b65a3, 0x00589d26, 0x002594ad}}}, + {X: Field{[10]uint32{0x01f46ff7, 0x01549e92, 0x035642a0, 0x03e4e46e, 0x001fe070, 0x02ef52bc, 0x0023e601, 0x017465ee, 0x0056ea6d, 0x0027588b}}, Y: Field{[10]uint32{0x015c609e, 0x00ea473f, 0x01494e6c, 0x0310b809, 0x02c648c7, 0x01b6cf72, 0x03bd5576, 0x0217fb67, 0x03940d64, 0x0020186e}}}, + {X: Field{[10]uint32{0x03020c13, 0x0342b7cb, 0x03b80370, 0x03795a4c, 0x012915af, 0x001ee658, 0x014b67c4, 0x03579d8e, 0x03e4cff5, 0x0025253b}}, Y: Field{[10]uint32{0x00a7e4ea, 0x016bce16, 0x00a8184f, 0x02e3f4fc, 0x03fd86ec, 0x03908dcb, 0x03964b2d, 0x03873009, 0x0238c85e, 0x002ac31f}}}, + {X: Field{[10]uint32{0x012e1a86, 0x005802a5, 0x03268dbe, 0x01665d00, 0x00e028c2, 0x024e2807, 0x028cb6c2, 0x014bf002, 0x03baffbc, 0x002a3935}}, Y: Field{[10]uint32{0x011a0bed, 0x019f0a4d, 0x0096fc9f, 0x02e72591, 0x02cc7eee, 0x01bc59c8, 0x0379723c, 0x0008b013, 0x003d0dc3, 0x0002356e}}}, + {X: Field{[10]uint32{0x00927ac5, 0x030eed79, 0x00df1f17, 0x02bc5467, 0x01203c01, 0x035cb5e9, 0x03191ad4, 0x01183fbf, 0x0364938e, 0x0020e107}}, Y: Field{[10]uint32{0x03536800, 0x00075e7a, 0x03e4180e, 0x0036c813, 0x02ecb1f3, 0x00105712, 0x03733974, 0x01c92484, 0x00f2c2e8, 0x0003d61a}}}, + {X: Field{[10]uint32{0x020612f6, 0x00f220c0, 0x02acbd62, 0x03da542b, 0x02af2a2d, 0x02d65fec, 0x00dcba67, 0x00fe2a18, 0x00d95ef0, 0x003ba25d}}, Y: Field{[10]uint32{0x00f141ac, 0x0381fe29, 0x0321634e, 0x03ebadf3, 0x016596ab, 0x03e7dd8f, 0x02951453, 0x01775f31, 0x01740308, 0x00173c43}}}, + {X: Field{[10]uint32{0x02579606, 0x0006982d, 0x01857b2d, 0x01ac9a47, 0x01a92dde, 0x0109d8a3, 0x036e5fa3, 0x01b28ec4, 0x018c2361, 0x001a3a23}}, Y: Field{[10]uint32{0x00fd5450, 0x01345e68, 0x03c41257, 0x01ce1a85, 0x01e5ec7b, 0x02da959d, 0x00c5d609, 0x035baf16, 0x00903766, 0x000016a4}}}, + {X: Field{[10]uint32{0x0122345b, 0x031626a5, 0x02e7c50a, 0x016b38ec, 0x00cfe6ab, 0x01333290, 0x01bea794, 0x0322d883, 0x018ac62e, 0x003f8d37}}, Y: Field{[10]uint32{0x03d6c8c0, 0x02ee6fda, 0x025bff0a, 0x03562634, 0x0330c9ed, 0x034f8029, 0x01611d7b, 0x0384894d, 0x0055adf1, 0x002233c0}}}, + {X: Field{[10]uint32{0x0251bc1f, 0x017c8d60, 0x03ff7f6a, 0x019bf462, 0x00099893, 0x004c5cda, 0x0262479c, 0x005226aa, 0x029cc0f8, 0x00108e9e}}, Y: Field{[10]uint32{0x01c678ee, 0x00986f4a, 0x0271fde4, 0x02591cb3, 0x01259ce8, 0x01844b90, 0x02776ea1, 0x0090740b, 0x03dd0519, 0x003249ac}}}, + {X: Field{[10]uint32{0x010b98f4, 0x013c55eb, 0x00e730ed, 0x02d1c9f0, 0x010ffb0e, 0x00b82364, 0x01bb840b, 0x0153ff98, 0x03f97cbf, 0x001fe982}}, Y: Field{[10]uint32{0x0294d733, 0x02cec243, 0x0281f6e7, 0x03b5e5e3, 0x027e296f, 0x01fdcda9, 0x01c7b26a, 0x021ee3f7, 0x02df84d3, 0x00356c6a}}}, + {X: Field{[10]uint32{0x00153a66, 0x01dd0cd8, 0x0098cf1e, 0x01743bbe, 0x01829481, 0x0245fe45, 0x02df8a66, 0x037af1df, 0x030ef1ed, 0x002794f2}}, Y: Field{[10]uint32{0x02b41ccf, 0x03e05fd1, 0x037a2ed8, 0x0273f955, 0x01498349, 0x022faf82, 0x024c6f1b, 0x028a86e6, 0x02f260fe, 0x0014d636}}}, + {X: Field{[10]uint32{0x02d6f119, 0x01a5548e, 0x01e9631e, 0x023a3b24, 0x00140471, 0x0150ccb0, 0x0344ad53, 0x0319de66, 0x0241c616, 0x002b7e4d}}, Y: Field{[10]uint32{0x0242ff9e, 0x00a84edf, 0x00619dfe, 0x01056b4e, 0x028dc172, 0x031ab10a, 0x01f67615, 0x02cf7fd5, 0x02afe4cf, 0x00368f19}}}, + {X: Field{[10]uint32{0x034e4ca8, 0x01bb2d91, 0x02f0c972, 0x0310e5bd, 0x035b6242, 0x02f857d2, 0x0287ddb2, 0x02cd9ec1, 0x03ec485d, 0x0001c078}}, Y: Field{[10]uint32{0x013b9e83, 0x0360644b, 0x00f946f2, 0x033cf44f, 0x03691aa3, 0x001d00dd, 0x01f7fea3, 0x0387140a, 0x027613dc, 0x0004263e}}}, + {X: Field{[10]uint32{0x00ccfefc, 0x0036443e, 0x01e84aac, 0x01781852, 0x02d51364, 0x03149402, 0x01a7e042, 0x02a8167a, 0x03a5d3ec, 0x00363f16}}, Y: Field{[10]uint32{0x034b3d8a, 0x025c225e, 0x01920c25, 0x020f95e3, 0x02df96ee, 0x00e8b7c1, 0x014b4d98, 0x025369d2, 0x034d0eec, 0x001c9c92}}}, + {X: Field{[10]uint32{0x0371398e, 0x03aa0fbf, 0x038dcc9e, 0x027528ce, 0x00c900cb, 0x02aa97c3, 0x018a186f, 0x03fedc19, 0x039a8279, 0x001ef223}}, Y: Field{[10]uint32{0x03a14a7c, 0x01581983, 0x001b0aa9, 0x027c7d56, 0x034939d3, 0x0022ddbd, 0x02d8c77e, 0x02054468, 0x01dfe5ed, 0x00337348}}}, + {X: Field{[10]uint32{0x035ef0e5, 0x01ba845b, 0x019190f4, 0x0297befe, 0x03e5fb92, 0x03c85ca8, 0x0219bc77, 0x02787db8, 0x01310bc7, 0x00215e35}}, Y: Field{[10]uint32{0x03b7d550, 0x01d67344, 0x00290768, 0x0137b45f, 0x00cac2d0, 0x008ce3e7, 0x02ef5e05, 0x018b1a53, 0x02ac39c2, 0x003f346c}}}, + {X: Field{[10]uint32{0x00020a62, 0x0379d62a, 0x010935cd, 0x008112ee, 0x02d41240, 0x01f87302, 0x01eb5f43, 0x01986d51, 0x02d73ea2, 0x00262f08}}, Y: Field{[10]uint32{0x02232226, 0x038530a0, 0x032d9f32, 0x03ca86a8, 0x002607bf, 0x03118be5, 0x02c8d83c, 0x02e96f0a, 0x01de0d33, 0x00050f1f}}}, + {X: Field{[10]uint32{0x01e8ee10, 0x0112c2b5, 0x0001aaca, 0x0197a8f1, 0x019980f2, 0x016fc215, 0x008106ca, 0x005db742, 0x021e95d2, 0x001ff3e0}}, Y: Field{[10]uint32{0x02400284, 0x03b274bf, 0x01cfb266, 0x01506ce2, 0x03c127b0, 0x02389f2a, 0x02f4598e, 0x02bfbbe2, 0x01ae87e7, 0x0009f0d0}}}, + {X: Field{[10]uint32{0x0216a5f1, 0x00a4ba80, 0x02ca8316, 0x01e87f1d, 0x0367acd6, 0x028cd3e4, 0x03e195b6, 0x03bc17e1, 0x01b9d440, 0x0022628e}}, Y: Field{[10]uint32{0x00ce52ef, 0x03290ec6, 0x037c3fc2, 0x0398af53, 0x02c0db80, 0x0113eafe, 0x011cae97, 0x01d394bf, 0x03bbfe32, 0x003ad90b}}}, + {X: Field{[10]uint32{0x032192a4, 0x00e2fd0f, 0x03e3cbf1, 0x009e0cc8, 0x0287d6a6, 0x03c62fe6, 0x01624801, 0x0308582a, 0x00a28918, 0x000fba5d}}, Y: Field{[10]uint32{0x01660d9c, 0x002d56f3, 0x01c63dc5, 0x03f04375, 0x020fde39, 0x0183f483, 0x01d5b2a9, 0x03acd526, 0x02dfac71, 0x003d6ce1}}}, + {X: Field{[10]uint32{0x0047c14a, 0x030fcd90, 0x010a57dd, 0x03d0bed8, 0x019766bb, 0x001b0494, 0x03753eed, 0x037cd26a, 0x012fde76, 0x002f7443}}, Y: Field{[10]uint32{0x02923dec, 0x01d0cc05, 0x03bbd6bc, 0x03da7100, 0x022b8b47, 0x02d1000c, 0x0327664a, 0x01fae6e2, 0x02ed34f9, 0x0014114c}}}, + {X: Field{[10]uint32{0x03edd63d, 0x0028738e, 0x02b23c00, 0x0123105d, 0x02477a51, 0x02e7fca4, 0x039a4a0e, 0x0104913f, 0x00373978, 0x000b05e5}}, Y: Field{[10]uint32{0x032fcfb6, 0x039803c3, 0x00173e37, 0x03dcf98c, 0x002c1ca5, 0x02684aa3, 0x02fcccab, 0x01ecaea0, 0x01844f9b, 0x0028d9ed}}}, + {X: Field{[10]uint32{0x03e71580, 0x0225e62c, 0x01841362, 0x028cb4f3, 0x01a83036, 0x03ba5faf, 0x031e6df6, 0x00744dbd, 0x030ef2d6, 0x000a0bbc}}, Y: Field{[10]uint32{0x03d0f43a, 0x02097738, 0x0286fc47, 0x030c7d63, 0x035b4f9d, 0x028ff247, 0x00252647, 0x03a8b953, 0x0133c350, 0x00242c33}}}, + {X: Field{[10]uint32{0x019eff23, 0x00e31ce2, 0x00ef71ea, 0x03ab6c4e, 0x01085bf6, 0x03b82faf, 0x00ab3d50, 0x03e9f2d5, 0x015542ac, 0x00290ad3}}, Y: Field{[10]uint32{0x03566bb7, 0x03cf3287, 0x030bdb1f, 0x00e83f4b, 0x0363d0e0, 0x009ac2e7, 0x00c49973, 0x02649dd9, 0x0080f10b, 0x0005f8e2}}}, + {X: Field{[10]uint32{0x037ef00e, 0x008947bf, 0x0138b1a0, 0x0295d7cf, 0x01a06fce, 0x02562556, 0x0180d474, 0x00323d2d, 0x0064c5b0, 0x002c8eb3}}, Y: Field{[10]uint32{0x00b6464f, 0x01502a87, 0x007293bc, 0x02b3fe42, 0x03073964, 0x0115fd79, 0x03e6a17d, 0x0193612f, 0x000a7eaa, 0x0019aec6}}}, + {X: Field{[10]uint32{0x01885ea7, 0x0298a3dd, 0x03023411, 0x0273b31d, 0x0189df02, 0x001d45ba, 0x001ce7a4, 0x02c18d1a, 0x00e696ae, 0x000250b7}}, Y: Field{[10]uint32{0x007caf14, 0x00fe02dc, 0x02784ba1, 0x02eb545e, 0x01c439f0, 0x00eabed1, 0x02b06cea, 0x01ecfdad, 0x028a88be, 0x0038822f}}}, + {X: Field{[10]uint32{0x00392d16, 0x01196ae2, 0x020e1610, 0x0253843a, 0x0023e64a, 0x01c7ae52, 0x038e4dbe, 0x013b0208, 0x02b95219, 0x002e29a8}}, Y: Field{[10]uint32{0x03a5fec1, 0x018f5472, 0x015c74cb, 0x03d306d5, 0x0034c7be, 0x010ef896, 0x02758ae3, 0x03b8fdde, 0x0331b8e5, 0x003e00a7}}}, + {X: Field{[10]uint32{0x0068fc20, 0x020ff082, 0x016d90cc, 0x03105e90, 0x02f15fea, 0x0298532d, 0x03db083e, 0x0017dec7, 0x0369a1ee, 0x0028db4c}}, Y: Field{[10]uint32{0x02f0af52, 0x00c9f8dd, 0x01f10e94, 0x03817c28, 0x00aacd2a, 0x02a7f5c5, 0x03b76516, 0x03c9f56d, 0x03f9fe40, 0x00392af5}}}, + {X: Field{[10]uint32{0x008dda1d, 0x03d790c2, 0x00cc0ebe, 0x01a3d142, 0x016f03bd, 0x035bf535, 0x00cc89b9, 0x006b9bff, 0x01083d71, 0x0013a8c0}}, Y: Field{[10]uint32{0x00a3e513, 0x01e4f557, 0x02c83eed, 0x017f3957, 0x0340f9ea, 0x015059b4, 0x0154bcf1, 0x01652419, 0x017a8b1c, 0x00207a66}}}, + {X: Field{[10]uint32{0x02ffdc55, 0x03d0938a, 0x0175ece2, 0x023d01a8, 0x020fee11, 0x0109edc4, 0x0342e62e, 0x02271d91, 0x03161c1c, 0x000808a1}}, Y: Field{[10]uint32{0x03fa35b1, 0x005dd999, 0x02c28bc8, 0x00317b34, 0x0291eaff, 0x00787426, 0x00d28644, 0x029fcd0a, 0x025ecf26, 0x001e0de5}}}, + {X: Field{[10]uint32{0x0070d20c, 0x036dfa18, 0x0384cf5a, 0x024bc599, 0x0395be90, 0x00481848, 0x010d4296, 0x03c5815e, 0x02fc8e4b, 0x0034f01c}}, Y: Field{[10]uint32{0x00daf31a, 0x032ae0b6, 0x01c0cf5b, 0x03ac2bf4, 0x00f412e0, 0x03de6472, 0x015c0faa, 0x01d6eeed, 0x0262594c, 0x001c9a20}}}, + {X: Field{[10]uint32{0x0130ec82, 0x037d8381, 0x03dad3e6, 0x02f729d8, 0x0294003d, 0x0228d534, 0x00e8f342, 0x03e9f33c, 0x007ce307, 0x000a536b}}, Y: Field{[10]uint32{0x0384673d, 0x026d17f3, 0x01ecc0fb, 0x020ebf52, 0x02cfbcc7, 0x0298c279, 0x02807c4b, 0x02a98abb, 0x0222a7bc, 0x0011e7f0}}}, + {X: Field{[10]uint32{0x02732fae, 0x01766b13, 0x0175c707, 0x0027a891, 0x02225de6, 0x01ec9dbf, 0x0042a8d6, 0x03a36790, 0x025cc09f, 0x000e55b2}}, Y: Field{[10]uint32{0x02eaa23e, 0x01e89a8b, 0x00302e28, 0x0075ef5e, 0x03719643, 0x007f58bc, 0x025ee0ce, 0x02414a74, 0x03e7a821, 0x00072597}}}, + {X: Field{[10]uint32{0x01fb3def, 0x03a0afe4, 0x029e697e, 0x0359b61e, 0x014f4109, 0x0125005d, 0x036eb068, 0x012d239c, 0x0396da14, 0x000934b8}}, Y: Field{[10]uint32{0x0372236e, 0x01f43668, 0x0081e76d, 0x01d47f9f, 0x02ea875c, 0x036eb484, 0x01e3c9ce, 0x00bf3f74, 0x037224b0, 0x002ede79}}}, + {X: Field{[10]uint32{0x01a2aa5e, 0x038ae6e6, 0x00d3ab49, 0x0224f84b, 0x01188528, 0x03670be4, 0x03f9619d, 0x01701ff2, 0x0042f16e, 0x0018e350}}, Y: Field{[10]uint32{0x032b3d92, 0x0392acac, 0x024db222, 0x010dd2e2, 0x03f618da, 0x03976051, 0x039eb8b8, 0x00429037, 0x00424f00, 0x0034365e}}}, + {X: Field{[10]uint32{0x030d866c, 0x019e0a23, 0x00c5cd7d, 0x02218da0, 0x0194202d, 0x00c0cb87, 0x0323a1fd, 0x01caeaec, 0x015ba999, 0x0003e46b}}, Y: Field{[10]uint32{0x0052bdc0, 0x02853565, 0x03571e24, 0x0386c344, 0x001cb558, 0x03eccb6b, 0x038bb4fe, 0x005d68e8, 0x0145a693, 0x00182d9b}}}, + {X: Field{[10]uint32{0x02a69b7c, 0x005c9cba, 0x03c39c64, 0x0236239f, 0x039e6af4, 0x01b40dc2, 0x031fb88a, 0x0097c53f, 0x037d779c, 0x000c5504}}, Y: Field{[10]uint32{0x02295f7a, 0x034e7ee4, 0x03b13560, 0x0066c664, 0x02c1980c, 0x00991213, 0x00e112a9, 0x005e28e6, 0x011e9c09, 0x003acef6}}}, + {X: Field{[10]uint32{0x01549597, 0x0072e4d8, 0x01355072, 0x00b65286, 0x01f710be, 0x03475e99, 0x03acb3c1, 0x027f2078, 0x021fdfdf, 0x003e2087}}, Y: Field{[10]uint32{0x018993ec, 0x013116df, 0x002a3f4b, 0x00171ebf, 0x02c5770c, 0x033ca396, 0x03635b9d, 0x014a0946, 0x0068c1e0, 0x002ed41e}}}, + {X: Field{[10]uint32{0x0354a655, 0x013d8fa0, 0x033b06dd, 0x02be1c0c, 0x00ec5d6f, 0x01438eb6, 0x018aa900, 0x0012968b, 0x023a5214, 0x00210251}}, Y: Field{[10]uint32{0x01db3bd4, 0x0215efb8, 0x01ecf91b, 0x00949a68, 0x031b8a65, 0x00edeacd, 0x00c1b668, 0x00b294e7, 0x012b8509, 0x00332651}}}, + {X: Field{[10]uint32{0x003bc471, 0x01041980, 0x01e09f72, 0x0395a08a, 0x02314380, 0x015d1767, 0x0222eb53, 0x01c2d5b6, 0x001112d3, 0x0025a009}}, Y: Field{[10]uint32{0x005d8f38, 0x017e518a, 0x0092ff49, 0x000c4eed, 0x0327d6c7, 0x0165b440, 0x020419d6, 0x030807fe, 0x01377f03, 0x00376b0b}}}, + {X: Field{[10]uint32{0x023a69c8, 0x027f0fe8, 0x01393d3f, 0x01fda329, 0x020f85e8, 0x005c2547, 0x03628244, 0x00568571, 0x02ec9f57, 0x002746ae}}, Y: Field{[10]uint32{0x0328cadf, 0x02b4a2cf, 0x03bdd149, 0x039e6219, 0x0071b010, 0x02508d4e, 0x00c89e62, 0x02d8708e, 0x030050db, 0x003c87b9}}}, + {X: Field{[10]uint32{0x001f7ae6, 0x01d0b585, 0x03a32f72, 0x02816166, 0x019886d6, 0x012c10dc, 0x03234b6a, 0x02bd1b0d, 0x02918db3, 0x0007ee59}}, Y: Field{[10]uint32{0x001f7379, 0x035560b5, 0x00ecab09, 0x01e08101, 0x02a17b55, 0x03a69096, 0x034c4426, 0x03f647df, 0x02cc207e, 0x0022f04f}}}, + {X: Field{[10]uint32{0x021ec7b8, 0x00876da7, 0x01281ee2, 0x03c169e0, 0x02416d54, 0x0010a3a2, 0x00bcb23e, 0x0136ac26, 0x0364b927, 0x0008b678}}, Y: Field{[10]uint32{0x02d8407d, 0x01219780, 0x024c1c1e, 0x0244a3e4, 0x014c300a, 0x01d3a546, 0x0399195b, 0x01f6d795, 0x0258f93d, 0x0017708c}}}, + {X: Field{[10]uint32{0x0073e45d, 0x01ca5efe, 0x03ff8398, 0x030091f2, 0x01adb168, 0x0161d04c, 0x0166766d, 0x020fecc0, 0x0050aed0, 0x001897e9}}, Y: Field{[10]uint32{0x0376bb7b, 0x007d9121, 0x011175a2, 0x02196e39, 0x00fbb5a2, 0x0280913c, 0x0185ed21, 0x03241195, 0x0104473d, 0x001c82a0}}}, + {X: Field{[10]uint32{0x02a2147f, 0x020bcde9, 0x028ff01f, 0x003fc86b, 0x002deacc, 0x009a06ba, 0x03b01c2e, 0x03f0977b, 0x01c19b6d, 0x00092b2c}}, Y: Field{[10]uint32{0x03ca5d4b, 0x02647774, 0x03d52783, 0x036b7ebd, 0x0193f50a, 0x01c6aaf8, 0x00abdcdb, 0x0201862a, 0x0335210e, 0x003dca74}}}, + {X: Field{[10]uint32{0x035ab555, 0x004c0b3d, 0x0339f33c, 0x025ae96c, 0x036c6d18, 0x02fdf6ce, 0x02328e3b, 0x00c353ce, 0x0003a99d, 0x0034a15a}}, Y: Field{[10]uint32{0x0292d6ff, 0x02727681, 0x00fdf568, 0x0224f9e0, 0x012b814a, 0x02d06dc9, 0x0098bbf1, 0x016e1d8b, 0x014d6470, 0x00259266}}}, + {X: Field{[10]uint32{0x00b5fe0a, 0x002f2613, 0x0031b50a, 0x023cef1e, 0x008fb529, 0x01c797f6, 0x01e95ef8, 0x01a212c5, 0x02659d19, 0x002014a7}}, Y: Field{[10]uint32{0x00b3b778, 0x0391dbc4, 0x02de6e9a, 0x02a1d3a1, 0x000b74b4, 0x01696c9a, 0x01e50bfc, 0x02faa3bf, 0x024f9ae4, 0x0021a2cf}}}, + {X: Field{[10]uint32{0x0328e183, 0x01d35fa1, 0x01dded06, 0x005a54fc, 0x030e0bb3, 0x02710c9d, 0x0288e494, 0x0007b574, 0x01aa3b82, 0x001fe466}}, Y: Field{[10]uint32{0x025288b9, 0x0387e7c6, 0x01e2ffcb, 0x0107765f, 0x00ee9d7e, 0x029c89a3, 0x02c174a3, 0x0080a551, 0x0273d037, 0x00006ae9}}}, + {X: Field{[10]uint32{0x0029ecbc, 0x0322598b, 0x02fb76d0, 0x01b59134, 0x0129b456, 0x03332c64, 0x004674cd, 0x0167d923, 0x008508e9, 0x001f4cb2}}, Y: Field{[10]uint32{0x02d39698, 0x0000d081, 0x013e866e, 0x0278c7d5, 0x02875ea9, 0x01971ce1, 0x011afb8e, 0x03fba325, 0x00ecb50b, 0x003643a5}}}, + {X: Field{[10]uint32{0x011abfbf, 0x020678cb, 0x0374cbf8, 0x03feb67a, 0x011f1727, 0x02f46fc0, 0x02ce67eb, 0x03b3215d, 0x01c09291, 0x003cae58}}, Y: Field{[10]uint32{0x0126f795, 0x001c408c, 0x00524017, 0x002b5030, 0x00ed0aec, 0x0195bd8e, 0x00382208, 0x01a8d91b, 0x00495a1e, 0x003aff96}}}, + {X: Field{[10]uint32{0x01be876e, 0x02efefe0, 0x02676f75, 0x005d3a62, 0x026b4ae3, 0x025c606c, 0x02d6a728, 0x00ca465c, 0x02899528, 0x00366831}}, Y: Field{[10]uint32{0x02bfa042, 0x03e31eb1, 0x00d922b7, 0x024eecd4, 0x01e9039b, 0x034fc0c2, 0x0164d974, 0x02f26b45, 0x0086a0ac, 0x0034daba}}}, + {X: Field{[10]uint32{0x007c3e0a, 0x0375205f, 0x0269fbe2, 0x0048c2ce, 0x00fff299, 0x002af7d7, 0x01b2aa71, 0x01f23264, 0x03246aeb, 0x0031e8d8}}, Y: Field{[10]uint32{0x01c9e21f, 0x016c3001, 0x025f815f, 0x01235b47, 0x0102b321, 0x02d2cb52, 0x01863026, 0x0234b5e6, 0x01d70e44, 0x0004a63f}}}, + {X: Field{[10]uint32{0x00985a86, 0x010853f9, 0x00ac4830, 0x01931ff8, 0x02640d24, 0x036fd58e, 0x02535a04, 0x034ef019, 0x03a05064, 0x0018d735}}, Y: Field{[10]uint32{0x01e3ae1f, 0x014f89fa, 0x01a4ce04, 0x011fcca0, 0x00e8d5f0, 0x03e78bcc, 0x0335cfca, 0x01dfd919, 0x0265913e, 0x00003900}}}, + {X: Field{[10]uint32{0x009ee5f5, 0x02478426, 0x00adcc5b, 0x02dc85a7, 0x02eca54b, 0x0256d206, 0x035b6326, 0x03a894df, 0x024f38ed, 0x00017698}}, Y: Field{[10]uint32{0x02721779, 0x0035dc72, 0x02505a22, 0x0088dec5, 0x0248c288, 0x00e9495b, 0x03aeeb24, 0x000c03ff, 0x01baa108, 0x0034fa9b}}}, + {X: Field{[10]uint32{0x007d4d5e, 0x024a13fa, 0x0080efe1, 0x0230a5db, 0x01ce0527, 0x03f92db5, 0x001f6871, 0x01d7b24b, 0x00a2b197, 0x002a93d9}}, Y: Field{[10]uint32{0x02d4f240, 0x01e4f70f, 0x0118e293, 0x00a20e59, 0x00224ea0, 0x0160e99b, 0x036e9499, 0x0383eda5, 0x017e95fc, 0x003ce7c4}}}, + {X: Field{[10]uint32{0x027e0641, 0x02d70d90, 0x038c1477, 0x03b3af8d, 0x01d60969, 0x00b81554, 0x0293f266, 0x006d088a, 0x00ea99ff, 0x0026d946}}, Y: Field{[10]uint32{0x0393165a, 0x01d21f63, 0x0165627b, 0x03147508, 0x01bebdf7, 0x0014cbfe, 0x02ea9dd3, 0x03eced0e, 0x02558650, 0x000ba7c5}}}, + {X: Field{[10]uint32{0x0297b562, 0x024f402b, 0x011594b1, 0x01ffec40, 0x006547f4, 0x03772fae, 0x02011381, 0x00b83e87, 0x02a2b597, 0x001b26e6}}, Y: Field{[10]uint32{0x0275e27d, 0x01280e18, 0x02d3b162, 0x02c99d1d, 0x02a6e78e, 0x034816f6, 0x0123d0f9, 0x01c74af9, 0x011c8d4c, 0x002bc276}}}, + {X: Field{[10]uint32{0x03467cbe, 0x019984b6, 0x01f71f53, 0x031a8df9, 0x00cf80ae, 0x031c44a8, 0x02365410, 0x02571579, 0x00803cdc, 0x0028a872}}, Y: Field{[10]uint32{0x0223fc09, 0x02e6cb53, 0x02fc273e, 0x00683108, 0x01802e2e, 0x00352c5d, 0x025410d5, 0x03c103ff, 0x030f3638, 0x003133d5}}}, + {X: Field{[10]uint32{0x03650427, 0x010df96a, 0x008a9ca8, 0x02b883cb, 0x0213102b, 0x02225cd9, 0x025af104, 0x033358d2, 0x0350c961, 0x00018f4d}}, Y: Field{[10]uint32{0x02339248, 0x01c01163, 0x03fa06d6, 0x03c1c4e4, 0x01f21125, 0x0261d0a8, 0x01e90dc6, 0x0269d9cb, 0x033274b3, 0x0021d054}}}, + {X: Field{[10]uint32{0x02bdd04a, 0x00582c94, 0x0130e1f5, 0x02fc66da, 0x00bcc97d, 0x02117453, 0x013e8fb5, 0x02095429, 0x0266e442, 0x002341c3}}, Y: Field{[10]uint32{0x01487ecd, 0x036a3766, 0x00bb2497, 0x02433bbd, 0x0248cdef, 0x005cf348, 0x0084099f, 0x013c1326, 0x00824f2b, 0x0012f263}}}, + {X: Field{[10]uint32{0x0291c8bd, 0x02ff4ad2, 0x01456175, 0x037decd8, 0x03e3f3d4, 0x03305963, 0x00143950, 0x00022ed4, 0x02a72e5f, 0x003c7f95}}, Y: Field{[10]uint32{0x01f275f2, 0x03219bbd, 0x017b2be2, 0x017ffa29, 0x03a19caa, 0x00da2159, 0x01e302ad, 0x01f69740, 0x02bee57a, 0x002f97ff}}}, + {X: Field{[10]uint32{0x03554b21, 0x01a87f9c, 0x01635747, 0x02756bb3, 0x03b41239, 0x019d6f31, 0x0271a950, 0x025a7a6e, 0x02dbd2eb, 0x00200b26}}, Y: Field{[10]uint32{0x0372bc5e, 0x008b84d9, 0x007efb74, 0x0326f841, 0x02cc3344, 0x01c3e703, 0x026527d3, 0x0339a59b, 0x0026f547, 0x001084c8}}}, + {X: Field{[10]uint32{0x0093db56, 0x020812c5, 0x02745c71, 0x0293c5e2, 0x009d24cd, 0x02f1e965, 0x030a5cda, 0x03b48803, 0x02c09d6c, 0x00256c6d}}, Y: Field{[10]uint32{0x02adb01d, 0x0002752d, 0x023ddf69, 0x0074db2c, 0x0127b233, 0x01b3c903, 0x00ce5e9a, 0x00f45ab2, 0x02815303, 0x002f050d}}}, + {X: Field{[10]uint32{0x02ede35d, 0x0120e9a9, 0x0169d2d6, 0x01bb5dac, 0x017b79a0, 0x005c08bc, 0x03b2aa4e, 0x013ab860, 0x012901f9, 0x0003abb5}}, Y: Field{[10]uint32{0x01d559b3, 0x009fee57, 0x03f8f9cb, 0x01f266b1, 0x00bc6e37, 0x02b5aebc, 0x02c1efa3, 0x02267376, 0x027691c5, 0x0014f56c}}}, + {X: Field{[10]uint32{0x0027d770, 0x02dcd667, 0x02abeac7, 0x0038d9ef, 0x03906d69, 0x03bcfdfc, 0x02b485b6, 0x011231cb, 0x03e59f6f, 0x001df113}}, Y: Field{[10]uint32{0x031102fd, 0x008bbafe, 0x009d3833, 0x027feb31, 0x00e6629c, 0x038f5ace, 0x00f03604, 0x003e00b3, 0x00226c44, 0x002f35d4}}}, + {X: Field{[10]uint32{0x000a0306, 0x02b97ef9, 0x0144efad, 0x01e55046, 0x00011b62, 0x0364daa2, 0x0352002c, 0x00291ad9, 0x02e2f00f, 0x003a18ec}}, Y: Field{[10]uint32{0x03243a5f, 0x03f81119, 0x00358b36, 0x01f59802, 0x01c2ed93, 0x00c7a3ab, 0x039caff6, 0x027c5c16, 0x03a36da2, 0x002d71e6}}}, + {X: Field{[10]uint32{0x02f8f191, 0x0079cbbb, 0x02dec272, 0x02d3cf73, 0x003883ad, 0x02b68c26, 0x03eedda4, 0x01c742cb, 0x03ef93df, 0x00089bd6}}, Y: Field{[10]uint32{0x001707c3, 0x008cf39d, 0x00fbcc13, 0x022f5d73, 0x00f96607, 0x02116186, 0x00a08fbe, 0x02f05228, 0x00b52bce, 0x00282481}}}, + {X: Field{[10]uint32{0x03467184, 0x03a40da0, 0x0046e3a4, 0x0292bfdf, 0x02c33bed, 0x031bc237, 0x03a82b39, 0x01f14e7c, 0x03b08c1e, 0x002a888b}}, Y: Field{[10]uint32{0x001c3765, 0x03590c5f, 0x01d4ac5d, 0x00a641ad, 0x01c1653d, 0x01b7fe4c, 0x01a7c3aa, 0x03f4e608, 0x01cf21ca, 0x00010441}}}, + {X: Field{[10]uint32{0x01fec96a, 0x01d53c78, 0x01a82239, 0x033048db, 0x01f94482, 0x025ec540, 0x01220bb3, 0x013b4f71, 0x02cd26ef, 0x00061e70}}, Y: Field{[10]uint32{0x01f0d67d, 0x01c96ddc, 0x01351464, 0x01472dcf, 0x024fc689, 0x00758c10, 0x03b16092, 0x03785247, 0x033575ea, 0x00244b57}}}, + {X: Field{[10]uint32{0x009902e0, 0x01fb2c6b, 0x03b76765, 0x007af70a, 0x026df621, 0x01c352df, 0x024cfc59, 0x03622fd2, 0x00a4e7ee, 0x002f8e79}}, Y: Field{[10]uint32{0x0227cb4e, 0x03311d9f, 0x00899f94, 0x02915857, 0x0132ae54, 0x0133d692, 0x006d9a2b, 0x029edd8c, 0x00f113fc, 0x00362c79}}}, + {X: Field{[10]uint32{0x012d5786, 0x02f70bdd, 0x00631d3f, 0x0391f3d1, 0x001c2912, 0x01b0fe2a, 0x03028368, 0x0230f740, 0x03ce3337, 0x0007a9cb}}, Y: Field{[10]uint32{0x0348906e, 0x002e220d, 0x007c9aed, 0x02c201ff, 0x000cb6e2, 0x03941ade, 0x03f261af, 0x03745333, 0x0158fe1c, 0x003883d1}}}, + {X: Field{[10]uint32{0x02036806, 0x0198beb6, 0x032423ac, 0x0046dd36, 0x022d0ca0, 0x00caf0e5, 0x00638e6f, 0x03d5f7a3, 0x03dd67bf, 0x00015b8c}}, Y: Field{[10]uint32{0x0393f461, 0x00ee4ff0, 0x02e2efbb, 0x033cf853, 0x0350d78e, 0x007795ef, 0x0317d4e4, 0x01c4c024, 0x00cc165e, 0x00100e70}}}, + {X: Field{[10]uint32{0x000f37ad, 0x01c330ba, 0x034470c4, 0x0153c429, 0x02d036ce, 0x00e2e78f, 0x02fb95a7, 0x03637c72, 0x0291a5f1, 0x00146605}}, Y: Field{[10]uint32{0x01972261, 0x02a998b1, 0x03664d31, 0x03711c7b, 0x01d03fab, 0x03a5fc11, 0x026e3c26, 0x00aa641d, 0x004767cf, 0x00027ee4}}}, + {X: Field{[10]uint32{0x00869dbd, 0x03165e66, 0x03f3016e, 0x02e6f355, 0x02b90db9, 0x03e49e65, 0x00be7f95, 0x025e0dac, 0x028577a5, 0x003bce95}}, Y: Field{[10]uint32{0x037c5e07, 0x030f6306, 0x024d372a, 0x00d92ed4, 0x03fabe11, 0x0387d1e0, 0x01782c6a, 0x01d27a52, 0x0057ff22, 0x001473f9}}}, + {X: Field{[10]uint32{0x03196415, 0x0301836b, 0x00a22523, 0x020814c1, 0x0379a668, 0x038f190c, 0x029e0b16, 0x0216e9fb, 0x02a18c3a, 0x003bf194}}, Y: Field{[10]uint32{0x00f7b2a5, 0x0111ecd5, 0x01d49737, 0x00726302, 0x038fcee7, 0x01661c20, 0x01b2498f, 0x006bcc07, 0x0014cef9, 0x0022995b}}}, + {X: Field{[10]uint32{0x004bbf82, 0x00dc2862, 0x015def07, 0x018b012a, 0x018adc79, 0x0226203c, 0x00021983, 0x0338b366, 0x03eff4d5, 0x00337687}}, Y: Field{[10]uint32{0x01e31d6c, 0x01726c12, 0x0235a0e5, 0x02ae14d8, 0x024417f9, 0x0291e058, 0x019174b4, 0x0370175e, 0x03fcb0c9, 0x0022f09b}}}, + {X: Field{[10]uint32{0x016cf0d4, 0x021a11ee, 0x03a3f938, 0x02b370e8, 0x00d46bb6, 0x01f7b750, 0x00b76d77, 0x02a84c4d, 0x01853454, 0x001bcfce}}, Y: Field{[10]uint32{0x00adba81, 0x03b1724b, 0x01637e4e, 0x02479592, 0x00b6e324, 0x029020d1, 0x03e5192e, 0x0286d6b9, 0x019c4f7c, 0x002a2e92}}}, + {X: Field{[10]uint32{0x014b13e4, 0x033577f9, 0x01ee8061, 0x01f61452, 0x03a2a362, 0x03636013, 0x0042065e, 0x03ee0faa, 0x01af91ab, 0x00394b44}}, Y: Field{[10]uint32{0x01cfff97, 0x00e384aa, 0x01069468, 0x00f438fb, 0x012e132a, 0x039cca17, 0x021f6ed4, 0x0159cb2c, 0x006d619e, 0x00167cc4}}}, + {X: Field{[10]uint32{0x027256ff, 0x0033e8e7, 0x02ac066c, 0x01a70c38, 0x038fb918, 0x00cacf2a, 0x0254d13b, 0x0072d915, 0x0336f0de, 0x00227fb1}}, Y: Field{[10]uint32{0x03e44274, 0x01156b81, 0x01ded46b, 0x036ed63d, 0x0173e708, 0x037f798b, 0x02b938d9, 0x0069b6da, 0x02e84d3e, 0x003e505e}}}, + {X: Field{[10]uint32{0x02b70b29, 0x036b0248, 0x03f7531b, 0x0082a240, 0x03522615, 0x000a1d27, 0x006ce733, 0x00154f3a, 0x035691b1, 0x00014503}}, Y: Field{[10]uint32{0x022dc024, 0x019f5caa, 0x00afd0dd, 0x002fe894, 0x00ad0acf, 0x007033a4, 0x021f4ce2, 0x0308f401, 0x022b9e02, 0x00246865}}}, + {X: Field{[10]uint32{0x01267b5c, 0x0243f21f, 0x00d09c0f, 0x03ae1548, 0x030579d0, 0x034cbe52, 0x035e199e, 0x02645c41, 0x01309310, 0x0000f058}}, Y: Field{[10]uint32{0x00ac64c3, 0x01f4dade, 0x00e51a5f, 0x03297a00, 0x01e9f156, 0x01a4eb00, 0x02a00107, 0x0036e40e, 0x00dfe404, 0x00354341}}}, + {X: Field{[10]uint32{0x03e8bac9, 0x00fbae26, 0x01fa8be1, 0x014a4474, 0x02a2d0b9, 0x00090154, 0x00b8a58f, 0x0008dc96, 0x010e63a5, 0x003f61da}}, Y: Field{[10]uint32{0x021b9225, 0x013fa922, 0x0247458e, 0x038eb144, 0x03b40f04, 0x011ff19a, 0x023ee352, 0x01a3d5be, 0x01acccb9, 0x00101b70}}}, + {X: Field{[10]uint32{0x01a12a81, 0x01d0d2f5, 0x01347ebc, 0x0381aa36, 0x0299005c, 0x01cecca3, 0x028ad599, 0x01e3ccb3, 0x01de017e, 0x00023934}}, Y: Field{[10]uint32{0x01a2a8ae, 0x0065006c, 0x036da429, 0x02a230c6, 0x02992baf, 0x02efc362, 0x00c843b4, 0x029975d1, 0x033e744c, 0x00318d23}}}, + {X: Field{[10]uint32{0x007743c2, 0x00e6831b, 0x03ff6ea7, 0x001059de, 0x02f49881, 0x029632aa, 0x03b6eebb, 0x0319e05c, 0x03cfea62, 0x000e0b1e}}, Y: Field{[10]uint32{0x01c5eb7d, 0x0154e69a, 0x035237cf, 0x0372bf34, 0x0267e9ad, 0x000703da, 0x01f7f27e, 0x01090d4f, 0x01da77e6, 0x00006429}}}, + {X: Field{[10]uint32{0x0114ed0f, 0x0364357e, 0x01d29e87, 0x03254efd, 0x0125b0da, 0x03a941e5, 0x01fa471b, 0x01201d4e, 0x034e74b8, 0x003d5aa2}}, Y: Field{[10]uint32{0x0096db8b, 0x00547ef0, 0x01a48c50, 0x00704e45, 0x008f9f20, 0x01a9ba89, 0x03881c65, 0x039848ea, 0x0108da57, 0x001515b6}}}, + {X: Field{[10]uint32{0x03965b80, 0x03f6c185, 0x02a044ec, 0x00b157c4, 0x003af365, 0x005ae031, 0x02f8ea2b, 0x0155e87f, 0x03fb6a5e, 0x002423a7}}, Y: Field{[10]uint32{0x038bc2ce, 0x0379d6a1, 0x02043562, 0x0253b5ad, 0x03b9c010, 0x03af0c4d, 0x0182ca07, 0x0133c3e0, 0x00c9d1b1, 0x002fab8a}}}, + {X: Field{[10]uint32{0x02c86ef4, 0x00b9ba6f, 0x01e787ef, 0x012e6750, 0x033fad25, 0x014a4d3a, 0x03225330, 0x0207f45a, 0x03184333, 0x0029b0c1}}, Y: Field{[10]uint32{0x023fb818, 0x024015d8, 0x026f44bf, 0x020817b8, 0x029e266f, 0x000c271c, 0x01129e4e, 0x01440813, 0x0286a60d, 0x0011ea68}}}, + {X: Field{[10]uint32{0x00b3e903, 0x019bade6, 0x01361047, 0x038d28a6, 0x0230a652, 0x00af882b, 0x01461635, 0x00b0980b, 0x01866c3e, 0x002522eb}}, Y: Field{[10]uint32{0x01c35164, 0x01312136, 0x00d3395b, 0x0129da86, 0x004321da, 0x02457783, 0x0043b0f0, 0x0228ae67, 0x0222ad47, 0x000c34c1}}}, + {X: Field{[10]uint32{0x00f6a3f2, 0x03a13487, 0x02c9f0c9, 0x0373e5b4, 0x029d536e, 0x021e0b4d, 0x03881251, 0x005eb9dd, 0x039dcb8a, 0x0035b24a}}, Y: Field{[10]uint32{0x02de09b9, 0x00412bca, 0x0207b9e0, 0x00923b08, 0x030ed686, 0x02bb1752, 0x030ae881, 0x020dde5e, 0x03a09351, 0x003764d9}}}, + {X: Field{[10]uint32{0x01566abd, 0x03bc3f59, 0x0232854c, 0x00269d6b, 0x037b0822, 0x0137e00b, 0x00641ca6, 0x004f591b, 0x017b7d8b, 0x003e7fcf}}, Y: Field{[10]uint32{0x02deec98, 0x0396580c, 0x011c8c84, 0x00a2861c, 0x01b9269d, 0x00f60474, 0x02230224, 0x008257dc, 0x019e1f19, 0x002b1618}}}, + {X: Field{[10]uint32{0x02c8d5e0, 0x00a3dba4, 0x014e1c35, 0x01fe0d34, 0x017f4e76, 0x00a0dfb5, 0x009a9204, 0x0383dc08, 0x01ba3a70, 0x000f6b87}}, Y: Field{[10]uint32{0x000f797f, 0x0134154a, 0x0332e08b, 0x0367aa64, 0x015c7816, 0x03ffa1f2, 0x03cdfad3, 0x03cb3f87, 0x028d6ea1, 0x001eb891}}}, + {X: Field{[10]uint32{0x01b49937, 0x012c0746, 0x007cad0b, 0x01f836ef, 0x008ffd22, 0x03caabac, 0x03ffe130, 0x024df272, 0x01056fcc, 0x0009c114}}, Y: Field{[10]uint32{0x03fa4397, 0x029a63c7, 0x02ad4d08, 0x03d710a1, 0x01bbd801, 0x01875b1d, 0x00d37246, 0x03f7f888, 0x02546c24, 0x00045d9a}}}, + {X: Field{[10]uint32{0x00defd22, 0x00359788, 0x00865bb9, 0x01599271, 0x012024c5, 0x018beea0, 0x00340752, 0x0183bb35, 0x03f96c32, 0x003e7657}}, Y: Field{[10]uint32{0x03a13c2d, 0x0009af05, 0x01dda24b, 0x0128696c, 0x030a89d5, 0x00c11cc2, 0x02632ba8, 0x00504602, 0x03fd8f74, 0x000df2fd}}}, + {X: Field{[10]uint32{0x01a7021f, 0x02d5f171, 0x0021448a, 0x02ef6e64, 0x02ff0a86, 0x019b3ef9, 0x018c6d5b, 0x019fa7fb, 0x0318f90f, 0x00013a37}}, Y: Field{[10]uint32{0x02a621f5, 0x024ff6bc, 0x0329ea22, 0x03f4ea0d, 0x000e9bad, 0x02cd210f, 0x03a2b1b3, 0x01904d14, 0x00c5ccf5, 0x001f9a7e}}}, + {X: Field{[10]uint32{0x02ffef9f, 0x016dde74, 0x01821c8a, 0x02f4ef8d, 0x00ab3d32, 0x00f19916, 0x02783836, 0x01fec86e, 0x012a710a, 0x00230a93}}, Y: Field{[10]uint32{0x025511d6, 0x016ab18d, 0x01205caa, 0x0247fce7, 0x03f82d8f, 0x006f595d, 0x01715157, 0x00960d18, 0x007d27e4, 0x00354c91}}}, + {X: Field{[10]uint32{0x03654b75, 0x010f3be1, 0x00e19631, 0x007b52c1, 0x02c10e81, 0x023eb9cb, 0x00677afa, 0x027339bf, 0x03a01974, 0x000a2dfc}}, Y: Field{[10]uint32{0x005ec782, 0x035698e1, 0x03e392ce, 0x00c699e3, 0x01e241ba, 0x01c7d287, 0x017c881e, 0x02ace456, 0x01eb3245, 0x0000c11c}}}, + {X: Field{[10]uint32{0x01be416b, 0x01b5f6d6, 0x0300808f, 0x025033d2, 0x02d89f64, 0x02667b23, 0x03b5acb0, 0x039cb095, 0x010ffcb8, 0x0032d1d3}}, Y: Field{[10]uint32{0x016622fd, 0x00c146a8, 0x000c7e3a, 0x02cfbff0, 0x029a0e59, 0x01d67e15, 0x039a9508, 0x00f2ee2a, 0x00cefc29, 0x003fdf34}}}, + {X: Field{[10]uint32{0x0055b36c, 0x01ecd7d0, 0x023f5bd5, 0x00d0ba65, 0x011a1800, 0x0378a929, 0x01567fbe, 0x02f10099, 0x01825dbe, 0x0030cf9a}}, Y: Field{[10]uint32{0x0146be18, 0x023b0b31, 0x01e0db79, 0x02d64694, 0x02082c0c, 0x0266ac19, 0x03b50615, 0x01973894, 0x03f57ce2, 0x0008bfcf}}}, + {X: Field{[10]uint32{0x01bd2237, 0x01060e06, 0x00a0eee3, 0x0116cf43, 0x03257e07, 0x01112a6a, 0x02441a84, 0x01c48dc6, 0x010644d3, 0x00212ff0}}, Y: Field{[10]uint32{0x009ef6f1, 0x00861eca, 0x0235ae1c, 0x00847b38, 0x03afd7f4, 0x00f9065e, 0x03d13ffb, 0x03dc1b0c, 0x02d57b7a, 0x001f2f95}}}, + {X: Field{[10]uint32{0x017b713a, 0x026594fe, 0x008dc735, 0x02296c12, 0x03606302, 0x01f820d7, 0x000f003f, 0x00913bf5, 0x02ecd53b, 0x000270c4}}, Y: Field{[10]uint32{0x02b76d14, 0x01126c53, 0x01fe6165, 0x0297fb90, 0x0059698b, 0x00622d3a, 0x00d0b160, 0x01dfbe15, 0x010f58fc, 0x00046f2f}}}, + {X: Field{[10]uint32{0x0315cefc, 0x02a0b72b, 0x004332d0, 0x006b8074, 0x01d474f6, 0x00eef3c8, 0x0183bf4e, 0x01bcb433, 0x0359a22d, 0x001701ab}}, Y: Field{[10]uint32{0x0322aae8, 0x02059690, 0x02be2904, 0x02c50978, 0x0341fbef, 0x0319a6ab, 0x006d70d6, 0x0197f6a3, 0x03e9f1c2, 0x0011dad2}}}, + {X: Field{[10]uint32{0x01b6bdcf, 0x03516cfc, 0x002bf2d6, 0x01c72118, 0x03f44f0d, 0x02bce7ae, 0x000eb547, 0x03b50ed3, 0x01c681a3, 0x001ddc96}}, Y: Field{[10]uint32{0x033bf754, 0x037861fe, 0x02bba22f, 0x0273d58f, 0x03d6742b, 0x0320d199, 0x00448514, 0x02162bbb, 0x03535481, 0x0022a74d}}}, + {X: Field{[10]uint32{0x01266842, 0x00831410, 0x0283ce38, 0x03101d98, 0x020174b8, 0x03409137, 0x024328b4, 0x03074c53, 0x001eae1f, 0x002cdc18}}, Y: Field{[10]uint32{0x00125ac0, 0x00da0d2f, 0x029323e1, 0x02a9010a, 0x03eda7b5, 0x036603b8, 0x02a9abc8, 0x030ec1d4, 0x00792174, 0x0023bc14}}}, + {X: Field{[10]uint32{0x02fe6584, 0x022b23b6, 0x028bf824, 0x015ac054, 0x02780868, 0x01c25c81, 0x032ad406, 0x01924a91, 0x02c07f8d, 0x0016be52}}, Y: Field{[10]uint32{0x022daf1a, 0x030e59b9, 0x016552a9, 0x035e33f9, 0x00b40dff, 0x03bd7d5b, 0x01f32efc, 0x03794475, 0x03ce57ea, 0x00229531}}}, + {X: Field{[10]uint32{0x030586c6, 0x032e39d6, 0x0194581a, 0x007cfe51, 0x034f84b4, 0x0160cbcd, 0x01d4f23c, 0x01c154e1, 0x019ce2e8, 0x0023f8f0}}, Y: Field{[10]uint32{0x01728c28, 0x013d6b24, 0x03860067, 0x005c055b, 0x012f5e20, 0x02bc64f2, 0x0314d491, 0x01130e90, 0x019fd16f, 0x003e48c2}}}, + {X: Field{[10]uint32{0x03ac9a71, 0x00a23f04, 0x02fc3b5f, 0x01fe8dee, 0x01e531d1, 0x026d97ad, 0x01211b30, 0x02f4797e, 0x021d2642, 0x00356025}}, Y: Field{[10]uint32{0x034185cb, 0x0225fa46, 0x03650e4f, 0x03716ce3, 0x02d9678c, 0x02c4bea1, 0x0250a6e0, 0x022d0cdb, 0x0154337e, 0x00140301}}}, + {X: Field{[10]uint32{0x0295e82b, 0x033efc50, 0x01405256, 0x019d6a71, 0x02234e79, 0x019e430c, 0x02460338, 0x02988d27, 0x00ed529f, 0x00009577}}, Y: Field{[10]uint32{0x01799815, 0x03d2d29f, 0x00b100c8, 0x033653db, 0x035dfba7, 0x02a918c5, 0x03253d3f, 0x0071eff0, 0x01c47f3e, 0x001fbb6a}}}, + {X: Field{[10]uint32{0x00891557, 0x02f908bb, 0x004580bd, 0x00e2a376, 0x031a27c3, 0x03923957, 0x00476a4a, 0x01147eae, 0x03a79240, 0x0012dfaf}}, Y: Field{[10]uint32{0x01b59085, 0x00f60fa1, 0x012848c6, 0x035f90a1, 0x02c12622, 0x035fb604, 0x00a23cfa, 0x00d7d83f, 0x00e9f891, 0x0037ec98}}}, + {X: Field{[10]uint32{0x032fbf28, 0x01fd5547, 0x00c7d8f4, 0x0274ef45, 0x01311956, 0x0319dc67, 0x035819e0, 0x024aa68e, 0x03809e60, 0x00246741}}, Y: Field{[10]uint32{0x003d8094, 0x02bca0e1, 0x024fdcbc, 0x03528c38, 0x00c204d3, 0x02635846, 0x03b2fa50, 0x003cb3b2, 0x02f876d7, 0x003282da}}}, + {X: Field{[10]uint32{0x0070ee78, 0x03754da3, 0x03f42393, 0x01ad67ba, 0x009b8c89, 0x02b8d0a9, 0x02d73bd5, 0x02a5116f, 0x03a9de89, 0x00119a19}}, Y: Field{[10]uint32{0x02e042e1, 0x03559e2a, 0x02029385, 0x024d3ba5, 0x019cbb9f, 0x022dfb42, 0x01bd6cae, 0x01608c1e, 0x0307b3e1, 0x000a9765}}}, + {X: Field{[10]uint32{0x01db3f7b, 0x0172e8b0, 0x01f3cd98, 0x016ef995, 0x01fc740d, 0x03dc4963, 0x021526fc, 0x01145e24, 0x0108c878, 0x001c49d3}}, Y: Field{[10]uint32{0x034b25e0, 0x01237bfe, 0x03f560d8, 0x0299aaf9, 0x033cdd2c, 0x010185de, 0x01652bc4, 0x0050d3e3, 0x0130a5be, 0x00382bc0}}}, + {X: Field{[10]uint32{0x02be2bcd, 0x03838ddf, 0x0111fa0a, 0x01b47ecc, 0x03b6e825, 0x013981a3, 0x00693c1f, 0x0090744f, 0x00482d25, 0x00291ba4}}, Y: Field{[10]uint32{0x00474eda, 0x02486fa5, 0x0111140f, 0x02ff56b9, 0x01fdd708, 0x0185c9ab, 0x026e7ac9, 0x02ada604, 0x000cf22a, 0x001d59dc}}}, + {X: Field{[10]uint32{0x01e84abd, 0x000afea9, 0x03b5baec, 0x022e89b4, 0x0110ea91, 0x01ef9a14, 0x0073b0f7, 0x00449a16, 0x0391f243, 0x003dd642}}, Y: Field{[10]uint32{0x02708999, 0x024d6918, 0x00e2eded, 0x02357a8a, 0x002d2512, 0x016372f2, 0x035d6cc8, 0x02534326, 0x00f8594c, 0x00120612}}}, + {X: Field{[10]uint32{0x028c2edf, 0x00bb7790, 0x023bc9a2, 0x037ebfd7, 0x004f966e, 0x0263c1e4, 0x0139d643, 0x03876b6b, 0x00e51282, 0x000b5eaa}}, Y: Field{[10]uint32{0x035d9d79, 0x016d868c, 0x01fb5763, 0x0285c233, 0x01a30b4d, 0x005d57e7, 0x033ea24f, 0x008267ac, 0x033c4203, 0x0004ac84}}}, + {X: Field{[10]uint32{0x0236d0e3, 0x0143ea5c, 0x00607995, 0x009d7d96, 0x00822809, 0x0207c4d7, 0x03113a55, 0x0311ff67, 0x03403302, 0x00244c4f}}, Y: Field{[10]uint32{0x00838a77, 0x00fd89e4, 0x03f27c32, 0x0308b833, 0x03aa9e96, 0x03c84a16, 0x01daee91, 0x0012fd18, 0x00075e78, 0x003e2dbb}}}, + {X: Field{[10]uint32{0x006743cb, 0x0128755b, 0x010de2f4, 0x0070e867, 0x01e0be03, 0x02c51bef, 0x028e86e1, 0x02169e11, 0x011909d3, 0x00368920}}, Y: Field{[10]uint32{0x00348cbf, 0x027bd9d0, 0x01a666d3, 0x02d874b3, 0x0305d418, 0x026cdf11, 0x00625111, 0x03dbbbcb, 0x017b5f76, 0x00301f22}}}, + {X: Field{[10]uint32{0x01e82220, 0x00809a37, 0x01bd62e8, 0x03e5bc07, 0x02760ec3, 0x03a7b50c, 0x01e6082d, 0x030b8fed, 0x02240b1b, 0x002578da}}, Y: Field{[10]uint32{0x00e1cb63, 0x017a7447, 0x03d01766, 0x021c7878, 0x0352a74a, 0x032d080a, 0x003b209d, 0x0128ea3c, 0x00d73abc, 0x002f9a64}}}, + {X: Field{[10]uint32{0x02bc6e8b, 0x020ccfcf, 0x01cdf488, 0x021c5411, 0x01afe54a, 0x007e0478, 0x03489e45, 0x01d6c315, 0x00603abd, 0x0022c16c}}, Y: Field{[10]uint32{0x0340fb39, 0x003d3f9f, 0x0179dbb3, 0x0056b358, 0x0027f5b6, 0x0206f69f, 0x01e2ddce, 0x0103ee22, 0x008145db, 0x0007443e}}}, + {X: Field{[10]uint32{0x03020f54, 0x0274c33c, 0x0372855a, 0x02df7363, 0x01d43ec0, 0x0072e0ca, 0x00bbb2ba, 0x00c9e9d4, 0x023b764a, 0x003feaf2}}, Y: Field{[10]uint32{0x01d0f05a, 0x021510db, 0x01302cf5, 0x0172d828, 0x00c79196, 0x013a652d, 0x02fb393a, 0x0289816c, 0x0265c90b, 0x0024e5c2}}}, + {X: Field{[10]uint32{0x03866c72, 0x03ec14c2, 0x027c0a18, 0x01a2c4cf, 0x02d35148, 0x01d4a662, 0x00f05fa9, 0x0392a63c, 0x02efef35, 0x002cea16}}, Y: Field{[10]uint32{0x036005e2, 0x011b47d6, 0x0275238f, 0x031fa228, 0x0009ee78, 0x0139c03a, 0x016b36c5, 0x016e780f, 0x02e1c21e, 0x000c0457}}}, + {X: Field{[10]uint32{0x015b7ab5, 0x01494332, 0x012d5d15, 0x00cbaf2d, 0x015b78fc, 0x03d99b54, 0x01c56590, 0x00f3c82e, 0x015f4c23, 0x00293c7f}}, Y: Field{[10]uint32{0x01faa0da, 0x00f58720, 0x02d52c36, 0x00962764, 0x03337543, 0x03148671, 0x00419fe0, 0x00496111, 0x0385726a, 0x00247467}}}, + {X: Field{[10]uint32{0x015bbb0a, 0x00f98900, 0x03c98bec, 0x00df4a6c, 0x019eb146, 0x02d62d7b, 0x03f39232, 0x033c4e52, 0x034b7bae, 0x0025ee12}}, Y: Field{[10]uint32{0x01162435, 0x01bd254b, 0x03bf48b8, 0x00c361b6, 0x025eac7f, 0x02a4ad2d, 0x0093d73c, 0x01ece84d, 0x00afbe8e, 0x00125f6d}}}, + {X: Field{[10]uint32{0x006312b3, 0x01d34665, 0x0169a1c2, 0x0208f321, 0x03a9de5f, 0x006d6d5e, 0x0278e965, 0x00d999d7, 0x00d9203e, 0x000b3ae8}}, Y: Field{[10]uint32{0x02d2b437, 0x029d70e3, 0x0040a488, 0x02db1aad, 0x00b7805d, 0x035df062, 0x030a88a6, 0x033f7907, 0x0286f042, 0x003530bf}}}, + {X: Field{[10]uint32{0x032b7009, 0x02e1a88f, 0x01e10e91, 0x032f1a90, 0x00912391, 0x0120da66, 0x0257b78b, 0x02b28a2f, 0x01306cdd, 0x002ae2c6}}, Y: Field{[10]uint32{0x034172cf, 0x00a1940d, 0x02a03351, 0x0144da24, 0x027abed6, 0x02992081, 0x00472a17, 0x0286ba76, 0x03dc79fb, 0x003f6eea}}}, + {X: Field{[10]uint32{0x0215b394, 0x0034c146, 0x01acd6bb, 0x01742a8b, 0x03c14970, 0x024e3c9a, 0x02ac2b59, 0x0102c55f, 0x00291ff1, 0x00009d8c}}, Y: Field{[10]uint32{0x01374ee6, 0x01412b12, 0x01875a91, 0x01e61bb3, 0x00553594, 0x014bd728, 0x0240838c, 0x02e78bd1, 0x032a38dc, 0x0030adac}}}, + {X: Field{[10]uint32{0x02fc78c5, 0x01e7ad72, 0x02d8e6cc, 0x03423197, 0x009e703f, 0x03a77449, 0x011d7933, 0x014531fe, 0x01bd1cc1, 0x0008b47b}}, Y: Field{[10]uint32{0x00a85efe, 0x01959e30, 0x03f7a05e, 0x03048de3, 0x02a93942, 0x00228e05, 0x0024fca2, 0x039d044c, 0x03eea53a, 0x001d14f9}}}, + {X: Field{[10]uint32{0x00ffe222, 0x01f26f6b, 0x01b7cc8e, 0x009d7b3b, 0x00b61465, 0x02f6cfee, 0x00fa5590, 0x027a509c, 0x01c0c572, 0x001c361a}}, Y: Field{[10]uint32{0x02ec30c5, 0x0372ee3d, 0x01657115, 0x01d2704c, 0x00f8d414, 0x0230b0ea, 0x03baec84, 0x023ed185, 0x01328ce7, 0x0012ff2b}}}, + {X: Field{[10]uint32{0x011b1647, 0x0093ae1e, 0x0097dd4a, 0x0301aedf, 0x00ed9039, 0x02a5ef4a, 0x0360dccd, 0x015e0993, 0x01deda8d, 0x002896d1}}, Y: Field{[10]uint32{0x0243db8f, 0x031a362a, 0x00c7dfe1, 0x0078bc0c, 0x00f306f1, 0x0310e999, 0x03765554, 0x036558c8, 0x0183fd2a, 0x0023f612}}}, + {X: Field{[10]uint32{0x031024b8, 0x02a29d0e, 0x025cf39c, 0x0052e5d6, 0x033e77fa, 0x01cdc19b, 0x02383366, 0x01f0356a, 0x016c9b23, 0x00208ff3}}, Y: Field{[10]uint32{0x0024dde0, 0x03c5ad51, 0x01d72198, 0x012f4719, 0x01d1433e, 0x02db50d1, 0x01c2ba3b, 0x03cb77a6, 0x004d29a4, 0x0039a469}}}, + {X: Field{[10]uint32{0x02158d0c, 0x01b13396, 0x0033a3a9, 0x0349bb49, 0x01ee594b, 0x00e534c1, 0x02b1247d, 0x02bbd90c, 0x02638244, 0x0000e696}}, Y: Field{[10]uint32{0x026a8023, 0x03e2c9d8, 0x016cd32d, 0x010d4315, 0x00ee4b9f, 0x00932c42, 0x03ff37ea, 0x02125355, 0x0139dd8b, 0x00051f3b}}}, + {X: Field{[10]uint32{0x03206487, 0x012a95ac, 0x035f8de9, 0x02ed21e7, 0x022a18f6, 0x006c9de5, 0x00aaf7b8, 0x02cb701d, 0x03b5b85b, 0x0023e7fa}}, Y: Field{[10]uint32{0x0210c2a2, 0x021ab2fd, 0x0093c32a, 0x03caada8, 0x01dc7474, 0x00ad5ecf, 0x037dbdec, 0x01680038, 0x03d6d417, 0x001236ba}}}, + {X: Field{[10]uint32{0x0143f60c, 0x01e80f64, 0x013f804f, 0x014cdba7, 0x016a08db, 0x03dad38d, 0x009158a5, 0x00215914, 0x03142f50, 0x003f05be}}, Y: Field{[10]uint32{0x001f7a36, 0x033e0137, 0x02eaf58b, 0x0139acca, 0x03402758, 0x036e17f9, 0x034ada59, 0x02dce843, 0x02f27e02, 0x0023a4c9}}}, + {X: Field{[10]uint32{0x01c5a281, 0x024921a1, 0x01d788e2, 0x0007d080, 0x03eaecae, 0x021faea0, 0x015d8f09, 0x01bdba44, 0x02a71744, 0x001f6c27}}, Y: Field{[10]uint32{0x0215742b, 0x00f8c9f0, 0x03864273, 0x019f169b, 0x0279fd21, 0x004bf45f, 0x036b2adc, 0x011577dc, 0x00ee426d, 0x002d11a7}}}, + {X: Field{[10]uint32{0x00d9a57e, 0x03ef2529, 0x030b8564, 0x03d71fb2, 0x023df7ca, 0x007e34f1, 0x0256fdab, 0x03bc70fa, 0x03f528ba, 0x00351746}}, Y: Field{[10]uint32{0x02aeccc1, 0x005cb845, 0x02191c1a, 0x0344f016, 0x00ad0c84, 0x006b5c00, 0x0121d3d8, 0x003a2473, 0x01846483, 0x0024789a}}}, + {X: Field{[10]uint32{0x01f03901, 0x0286a45d, 0x0278ad43, 0x0266ba5d, 0x016a4d9c, 0x01e89aec, 0x00a9ffaa, 0x02176154, 0x03751b6f, 0x000febc2}}, Y: Field{[10]uint32{0x0044328f, 0x01710d86, 0x01368b55, 0x0050ee36, 0x00be775d, 0x00e18c47, 0x02aa39f6, 0x00f3d972, 0x022aa4e4, 0x00229741}}}, + {X: Field{[10]uint32{0x02efd121, 0x01ac1b1d, 0x03107492, 0x028cec49, 0x001eefdb, 0x019787b0, 0x00c5e39c, 0x0291c9e7, 0x00be8e08, 0x00151823}}, Y: Field{[10]uint32{0x0140f038, 0x02278831, 0x01afdcb7, 0x01d9c741, 0x039bdc27, 0x03263f0a, 0x02c5f91c, 0x03e07923, 0x01bc40de, 0x00029da5}}}, + {X: Field{[10]uint32{0x009823ec, 0x03560364, 0x02d4664d, 0x03693865, 0x02e8a201, 0x00ed5a5c, 0x00e69552, 0x03f350d9, 0x0189050d, 0x00156683}}, Y: Field{[10]uint32{0x00dc71c3, 0x03a014ba, 0x027b4c46, 0x00ac1a9a, 0x035641e3, 0x021fd654, 0x01b8d5c0, 0x022e433b, 0x01add652, 0x001efe38}}}, + {X: Field{[10]uint32{0x00f467a8, 0x025ae52b, 0x039c31a9, 0x02a42c19, 0x00bb305e, 0x00797f0a, 0x0248c344, 0x02e7cac5, 0x0058b5e2, 0x00059ba2}}, Y: Field{[10]uint32{0x02e5bdb2, 0x008168e4, 0x01d2af64, 0x00df7432, 0x00dc1b7c, 0x0023e665, 0x018a6b91, 0x03ed0ab3, 0x006dff82, 0x002726cc}}}, + {X: Field{[10]uint32{0x00fe1941, 0x0369ce0e, 0x025a8d41, 0x025317bf, 0x02e5284f, 0x02b90e3b, 0x00ec5fc3, 0x020eeaa5, 0x028ce66e, 0x001038a7}}, Y: Field{[10]uint32{0x01acb2dc, 0x0062134e, 0x009c3955, 0x013ec39c, 0x0384ae68, 0x00e88f42, 0x03154e27, 0x01e1a073, 0x031cc01e, 0x001f1c7d}}}, + {X: Field{[10]uint32{0x02d4ee7e, 0x0110e01c, 0x004081a8, 0x00f6fd9d, 0x006aeb8b, 0x01986d00, 0x007fc764, 0x027399fe, 0x00f9eb65, 0x001a0a72}}, Y: Field{[10]uint32{0x0222913b, 0x001a5172, 0x01908ea5, 0x02ccc13f, 0x036647fc, 0x03a7fcc2, 0x02825225, 0x03701553, 0x030a8332, 0x00074d54}}}, + {X: Field{[10]uint32{0x03658196, 0x00d75044, 0x00e7adbb, 0x01010b44, 0x03e25a25, 0x038abc8d, 0x0393b136, 0x027f4e4c, 0x005a322e, 0x00128ff8}}, Y: Field{[10]uint32{0x0101574c, 0x01c0631e, 0x02ea1f14, 0x0115fb7a, 0x0178dbdc, 0x03c2ac5d, 0x03c40d9e, 0x01d906a4, 0x01f8d452, 0x00216690}}}, + {X: Field{[10]uint32{0x02a44f94, 0x01784066, 0x0338225a, 0x030805df, 0x029e9dde, 0x01919f30, 0x0167ad5a, 0x03acbb05, 0x03c9a675, 0x00379605}}, Y: Field{[10]uint32{0x00f723a4, 0x01959eb3, 0x00af5ec3, 0x005d323f, 0x0271b45e, 0x0352fc40, 0x017e6256, 0x00c4737c, 0x03d05413, 0x0010143a}}}, + {X: Field{[10]uint32{0x0262a108, 0x03697ad5, 0x03e7a155, 0x02cc6d47, 0x00daa7b9, 0x03cf63ce, 0x03df1a26, 0x03d0442a, 0x02454f07, 0x003f78a4}}, Y: Field{[10]uint32{0x0327808a, 0x037f722d, 0x0371ed98, 0x015b901c, 0x03f09d17, 0x031b1c67, 0x03347a3a, 0x03a4a733, 0x02d37b39, 0x003ca939}}}, + {X: Field{[10]uint32{0x03f42436, 0x02a43b7b, 0x022e8a43, 0x00574230, 0x01b09174, 0x029dca18, 0x03c536d6, 0x022e85db, 0x00fb6eb9, 0x003ca34f}}, Y: Field{[10]uint32{0x0279d1bf, 0x0009cd44, 0x00b61e9d, 0x02310b9b, 0x001971fe, 0x022252a9, 0x003dc82d, 0x00943781, 0x022bb328, 0x0011422f}}}, + {X: Field{[10]uint32{0x0316e3ee, 0x01ee545f, 0x038c7011, 0x0259083d, 0x037bb654, 0x00669b7d, 0x0192afb1, 0x02d6df42, 0x00304d1c, 0x0031d957}}, Y: Field{[10]uint32{0x031dfdfd, 0x009f8b79, 0x0070d2e4, 0x02f946e4, 0x01a348b0, 0x00379e70, 0x0186b1cb, 0x00c3712e, 0x02c2cdb7, 0x00226058}}}, + {X: Field{[10]uint32{0x03b4b147, 0x00fb2801, 0x00d0d7ae, 0x01d3c856, 0x0053ffba, 0x02d8bd36, 0x0167936e, 0x03b999c7, 0x03c72fa3, 0x00395f65}}, Y: Field{[10]uint32{0x01fecd64, 0x031c83f8, 0x00958c07, 0x01811f0d, 0x031ed426, 0x019a3284, 0x02b80b9a, 0x00a5d646, 0x012ca3d9, 0x002c78c0}}}, + {X: Field{[10]uint32{0x022b0c01, 0x037e3078, 0x02a44bcc, 0x01edd9a1, 0x036cd3d3, 0x03805332, 0x0244f92f, 0x0096ff01, 0x02421550, 0x003ab6a1}}, Y: Field{[10]uint32{0x01dfeeed, 0x03b5f482, 0x03e9106a, 0x02b2bde7, 0x0107152a, 0x0103e0a9, 0x03c37c55, 0x006ec045, 0x017d71d7, 0x002240d7}}}, + {X: Field{[10]uint32{0x020d0e25, 0x01fb2139, 0x03e27556, 0x03e5dd40, 0x0362dbf8, 0x0047e8ff, 0x01d7e8e0, 0x0086627e, 0x027e3f17, 0x000f9d89}}, Y: Field{[10]uint32{0x021160b6, 0x02288d9b, 0x0087182d, 0x031f8bf8, 0x02416f8b, 0x01f8e5ce, 0x013001ec, 0x031b6e91, 0x03909631, 0x002860d5}}}, + {X: Field{[10]uint32{0x01a3df70, 0x00b49424, 0x0350c697, 0x00d46399, 0x0205de72, 0x0359af9f, 0x0279e692, 0x00bcd408, 0x03d89c26, 0x00284765}}, Y: Field{[10]uint32{0x012a69dd, 0x0071b6f5, 0x00b71fd3, 0x01dfa522, 0x0144768d, 0x02e22459, 0x02e48fea, 0x02c05b7c, 0x00a3dd6f, 0x0034637e}}}, + {X: Field{[10]uint32{0x01f20651, 0x03d0887d, 0x01787922, 0x0023f563, 0x01a5ab52, 0x02b9f30a, 0x0154bf8d, 0x0301bbb7, 0x0375cefe, 0x002c5b8f}}, Y: Field{[10]uint32{0x02d0eb2d, 0x021d86a9, 0x0381da75, 0x024314e6, 0x010233ae, 0x01a42624, 0x03c19891, 0x00cbb5d3, 0x02b45a6e, 0x0015feff}}}, + {X: Field{[10]uint32{0x034628b2, 0x0095e131, 0x03d9fbeb, 0x02cd128c, 0x00837339, 0x02bc51e9, 0x03564c2f, 0x03a9ba7a, 0x000a3f73, 0x000df7a0}}, Y: Field{[10]uint32{0x02254050, 0x007b04f9, 0x020a02f4, 0x01b3e8ab, 0x03e33fc9, 0x0165aab5, 0x016b7e53, 0x01600c06, 0x02599da5, 0x00164ce4}}}, + {X: Field{[10]uint32{0x03d68055, 0x03b10e32, 0x021f19be, 0x02c24c96, 0x024ae57f, 0x02db9aea, 0x00b781d8, 0x02aebdbf, 0x012d65b3, 0x001bda10}}, Y: Field{[10]uint32{0x038d3bcc, 0x00c550cb, 0x02f08ec0, 0x00cfbd26, 0x0127dc14, 0x0086aed7, 0x03310420, 0x01c6f002, 0x019d4061, 0x002213f5}}}, + {X: Field{[10]uint32{0x036e4366, 0x0240b5b2, 0x00a79572, 0x026bd82f, 0x03980f1f, 0x014bc1c3, 0x00f0ce2b, 0x03898493, 0x029e6bc5, 0x002451e6}}, Y: Field{[10]uint32{0x002f5288, 0x00d746a7, 0x0364aef9, 0x0090044b, 0x03479325, 0x02c4ef89, 0x036025d4, 0x0110d667, 0x030a22de, 0x0008c13d}}}, + {X: Field{[10]uint32{0x0119bd8a, 0x02306513, 0x03701835, 0x031d29b1, 0x014cceab, 0x005df732, 0x01e7c1e4, 0x021c2230, 0x00df36ac, 0x0022e9ac}}, Y: Field{[10]uint32{0x02ab9ed4, 0x01fe1658, 0x005baad1, 0x006de26a, 0x01989dff, 0x01deb1d5, 0x02abe8a1, 0x00578a48, 0x020ee9d5, 0x003a5adc}}}, + {X: Field{[10]uint32{0x01d567cc, 0x02b2deca, 0x02c9ef4a, 0x01a55393, 0x00f11b8a, 0x00d5453c, 0x0359a8ca, 0x00ff3163, 0x0195871f, 0x002ac548}}, Y: Field{[10]uint32{0x03267fb4, 0x03a80dc3, 0x0019c3c8, 0x0329946d, 0x01965ec1, 0x017e23fc, 0x0099ad17, 0x02f6850a, 0x0148623e, 0x0030776b}}}, + {X: Field{[10]uint32{0x011600c5, 0x00b39f55, 0x00756e55, 0x011b5357, 0x026ca45c, 0x0066b708, 0x00e6448e, 0x00af4070, 0x03485eb9, 0x001fac8f}}, Y: Field{[10]uint32{0x03c57ac5, 0x0309ec69, 0x03328b3d, 0x025ea161, 0x01a300ef, 0x00f8c315, 0x033de076, 0x02e4e41e, 0x03124278, 0x00254fa6}}}, + {X: Field{[10]uint32{0x0221ee17, 0x00924153, 0x01f0a2f6, 0x02dc3bac, 0x01e0212f, 0x01624124, 0x0120a922, 0x01c0371d, 0x002ba4b2, 0x002c8fd3}}, Y: Field{[10]uint32{0x03598530, 0x02b83762, 0x03811457, 0x01f98d27, 0x028a2c28, 0x0040e1b0, 0x007d5a5c, 0x02cebcb3, 0x03729e95, 0x0028e2d9}}}, + {X: Field{[10]uint32{0x0369c2a4, 0x002addc9, 0x024a90a1, 0x00badd50, 0x0067a6c1, 0x01b3eb59, 0x001a02b9, 0x0156da8b, 0x0323387e, 0x002174b9}}, Y: Field{[10]uint32{0x00e4d303, 0x01145432, 0x031d0db8, 0x033c8684, 0x00ded380, 0x0352050d, 0x03077fb7, 0x0262bc06, 0x01ac2238, 0x001c9eaf}}}, + {X: Field{[10]uint32{0x0309273d, 0x02369b26, 0x014be9fd, 0x0006229e, 0x0254ae69, 0x019a7d9a, 0x0383d59e, 0x02933104, 0x015e08db, 0x0009f05c}}, Y: Field{[10]uint32{0x01b1a266, 0x0357352d, 0x03f9d998, 0x03173cae, 0x03e16e22, 0x039fcc3c, 0x017d8841, 0x01b288d4, 0x0254306e, 0x0009d9f2}}}, + {X: Field{[10]uint32{0x015eed89, 0x0173e2c2, 0x0350f446, 0x01090200, 0x0342cf40, 0x03e169aa, 0x00c4fb56, 0x017a3a78, 0x00d37f9a, 0x0039c2e3}}, Y: Field{[10]uint32{0x030cb31a, 0x012c3f9a, 0x014fe5ec, 0x0018c661, 0x01faacdf, 0x01d4232b, 0x034e93c0, 0x02346e5c, 0x00589478, 0x000b8f63}}}, + {X: Field{[10]uint32{0x01e956b9, 0x00804f37, 0x0365ee2c, 0x0187439f, 0x0293932c, 0x00fc1dab, 0x0081a39f, 0x020e5a63, 0x00552405, 0x00388f75}}, Y: Field{[10]uint32{0x00cf77c9, 0x036da2de, 0x0315b1dc, 0x01e72d4c, 0x0052b57e, 0x022a82d9, 0x01cef85a, 0x022ae2fd, 0x03d000cd, 0x001b14f2}}}, + {X: Field{[10]uint32{0x01919c9f, 0x001ce653, 0x003b7d7a, 0x00c8431a, 0x039aaf08, 0x01d9df2e, 0x0209f2c4, 0x02604c46, 0x0381ccc4, 0x0017a48f}}, Y: Field{[10]uint32{0x00306873, 0x02e5fd0e, 0x019f7738, 0x01f3ed45, 0x02705966, 0x03dc153f, 0x00e64a8a, 0x02b41bf8, 0x0112e64c, 0x0018135c}}}, + {X: Field{[10]uint32{0x00142507, 0x00deaddc, 0x006a5600, 0x010d8cca, 0x031380e5, 0x004ff79a, 0x02b71d71, 0x0289e380, 0x02531a9f, 0x0008f67c}}, Y: Field{[10]uint32{0x0244a9ac, 0x00cdcaff, 0x0256442d, 0x00053da5, 0x030a9fd2, 0x02d3a178, 0x02f49f6b, 0x0184669b, 0x0247b6eb, 0x00157720}}}, + {X: Field{[10]uint32{0x033b8f24, 0x03d76275, 0x0318a050, 0x03bc4b1c, 0x02886c79, 0x03bdb494, 0x01bb2815, 0x0147bc57, 0x0095ad25, 0x003bac8c}}, Y: Field{[10]uint32{0x01ba1ddb, 0x026166c4, 0x00eac67d, 0x020a74e1, 0x0056a80f, 0x039f3ee4, 0x00c38963, 0x0033a3ac, 0x0394b981, 0x003469c6}}}, + {X: Field{[10]uint32{0x00b7c21b, 0x009a0ad5, 0x023c0e7a, 0x00db9087, 0x03899a84, 0x03bfbaa6, 0x03eee536, 0x03df8952, 0x027b57bd, 0x001929b7}}, Y: Field{[10]uint32{0x03b4755b, 0x00325bc9, 0x01537cf4, 0x02438fc3, 0x03181ad1, 0x0240bf1b, 0x0002e2d2, 0x013f2831, 0x036e2e34, 0x001909e4}}}, + {X: Field{[10]uint32{0x00270073, 0x03c0b0b3, 0x0046d779, 0x0114f3b2, 0x008207fd, 0x0079c02e, 0x01aad5e5, 0x02bcfc70, 0x02ced76d, 0x0027919d}}, Y: Field{[10]uint32{0x03dc9e42, 0x01d3d2f2, 0x00c38d9d, 0x0333ad16, 0x036ffc4a, 0x0362a112, 0x02550195, 0x0042b411, 0x03811d76, 0x0015a171}}}, + {X: Field{[10]uint32{0x01645473, 0x012cd663, 0x003e5d13, 0x00d5bb21, 0x031d83c6, 0x0110a31e, 0x020ee231, 0x01ae85db, 0x02288061, 0x00257b84}}, Y: Field{[10]uint32{0x03bf4054, 0x00b8a7a8, 0x023a37d1, 0x004c31bb, 0x0149a60d, 0x02c9531c, 0x00812789, 0x01301d60, 0x00644191, 0x001ef8d3}}}, + {X: Field{[10]uint32{0x006516ad, 0x039300ff, 0x00da994f, 0x02683166, 0x03d0b108, 0x0114f2f7, 0x01df5066, 0x02068be4, 0x02efd920, 0x00394fff}}, Y: Field{[10]uint32{0x00c59c2f, 0x00762479, 0x01929ecc, 0x019eb01c, 0x035dcd1b, 0x00591863, 0x0270b285, 0x00340a8b, 0x02c14a60, 0x001583c0}}}, + {X: Field{[10]uint32{0x022a7b68, 0x0330fa81, 0x03a83faf, 0x00418ebe, 0x0090d4eb, 0x028f665d, 0x014f1adf, 0x01223168, 0x03447c75, 0x00270cc9}}, Y: Field{[10]uint32{0x01791c63, 0x026dbb86, 0x02b8ad68, 0x023d5643, 0x00cacfb7, 0x01343315, 0x00ff7d22, 0x03f0ed34, 0x01fb09a7, 0x002731d6}}}, + {X: Field{[10]uint32{0x033d3c45, 0x00e50c25, 0x0058e4ea, 0x01fa078f, 0x02f1d103, 0x022dd050, 0x02b22b0c, 0x0057fddf, 0x01002f43, 0x003a09b5}}, Y: Field{[10]uint32{0x008b65de, 0x0346666f, 0x010455d8, 0x0380ab9d, 0x00e8ab16, 0x031f54e9, 0x039316df, 0x01c7d0ea, 0x025882f9, 0x000e919b}}}, + {X: Field{[10]uint32{0x015e13c7, 0x01ece204, 0x03512d38, 0x01ecff59, 0x00dd38a8, 0x03a6c5af, 0x00f196c6, 0x02d71237, 0x030eaf93, 0x0033b537}}, Y: Field{[10]uint32{0x028b74cc, 0x0118b1b5, 0x0197e910, 0x01c73b75, 0x018c7542, 0x02734478, 0x032c9309, 0x02772ad3, 0x023bdd14, 0x003f8229}}}, + {X: Field{[10]uint32{0x037eb33d, 0x031505b6, 0x00b27ee8, 0x01b78086, 0x038065e3, 0x03ce3d53, 0x0220182d, 0x01437cac, 0x012788ea, 0x002c15bb}}, Y: Field{[10]uint32{0x02cf6409, 0x02a0f6f6, 0x00a6b0a1, 0x027ff0c0, 0x018d514d, 0x023a687a, 0x0243aa82, 0x015fe7af, 0x0375cef4, 0x0025cce0}}}, + {X: Field{[10]uint32{0x037830df, 0x03b8a216, 0x011561c9, 0x03010187, 0x03eba030, 0x00d07da8, 0x0260b667, 0x03e529ff, 0x007402fe, 0x0000d77b}}, Y: Field{[10]uint32{0x009b933e, 0x007c161e, 0x0045caba, 0x01b9363c, 0x013eb8be, 0x02dba488, 0x0302fe6e, 0x0043f79f, 0x012139c8, 0x00009664}}}, + {X: Field{[10]uint32{0x024e020b, 0x02b77ecc, 0x02f1f081, 0x025cdf16, 0x03d7981e, 0x010abd13, 0x0215cb99, 0x0084ff4b, 0x00c87733, 0x0000fc8f}}, Y: Field{[10]uint32{0x016e8f83, 0x03f0145d, 0x0065ac8a, 0x0184ed7e, 0x007ffc0c, 0x0337b040, 0x0392455d, 0x03378d38, 0x00c0d43c, 0x00093a33}}}, + {X: Field{[10]uint32{0x03babbdb, 0x014dfbca, 0x01bc1e06, 0x03322f3a, 0x03c8471d, 0x02e8361b, 0x02cfa43d, 0x0173ab5f, 0x0076c080, 0x0026ea5b}}, Y: Field{[10]uint32{0x0143def3, 0x00ef0dfe, 0x023ae0e9, 0x008181fb, 0x01622d98, 0x03d3c1ec, 0x02f8e3a8, 0x038136f8, 0x00331c2a, 0x003068f1}}}, + {X: Field{[10]uint32{0x016a3815, 0x0221f5f4, 0x02ac5c2e, 0x01058438, 0x021d414f, 0x037b3273, 0x01103965, 0x014e5635, 0x039a3147, 0x0020f051}}, Y: Field{[10]uint32{0x009b5b7a, 0x0215d00a, 0x0292c7f0, 0x01c341f0, 0x02c123d4, 0x027ffeee, 0x0339bbff, 0x03351b97, 0x00181354, 0x00213534}}}, + {X: Field{[10]uint32{0x03e0a32d, 0x017af1fb, 0x01ab1fcb, 0x0035ecd2, 0x00a8d701, 0x00a15f6e, 0x026714a0, 0x007621db, 0x027a2db1, 0x002eb3d8}}, Y: Field{[10]uint32{0x00c83129, 0x02b8c0fa, 0x02f5ed57, 0x021aeadf, 0x0214b3e5, 0x01ab3882, 0x03777b73, 0x011239a2, 0x000da44c, 0x0028a1f7}}}, + {X: Field{[10]uint32{0x0376ebd7, 0x03173fc9, 0x024d4619, 0x03475934, 0x034ca888, 0x00051c59, 0x03fd2d3a, 0x027de442, 0x00553012, 0x001cc18f}}, Y: Field{[10]uint32{0x00159489, 0x0312ec8b, 0x004ea368, 0x01b34a16, 0x019d7190, 0x005261b1, 0x02b0362b, 0x03e320be, 0x01d944cc, 0x00355e50}}}, + {X: Field{[10]uint32{0x035d6637, 0x022802ce, 0x020114d0, 0x004b5116, 0x02a3f51a, 0x0376d00f, 0x03a4ce34, 0x02b4544a, 0x0232df55, 0x00013ba1}}, Y: Field{[10]uint32{0x02b14820, 0x039b1164, 0x03d8188a, 0x0006585b, 0x01916879, 0x025c8f46, 0x03f01a31, 0x009d68e7, 0x0199dc30, 0x0030a7dc}}}, + {X: Field{[10]uint32{0x03e7ef28, 0x00abf9f5, 0x0386ccd4, 0x03bed59d, 0x028f5345, 0x008fbeb2, 0x0318a16a, 0x03507e62, 0x026d68bb, 0x003f11b9}}, Y: Field{[10]uint32{0x0243c18a, 0x0009c569, 0x029d50d7, 0x00c7b23d, 0x01a02382, 0x02930a2e, 0x01af38a4, 0x0212754f, 0x02dfabf8, 0x0022d0a8}}}, + {X: Field{[10]uint32{0x03a7dc13, 0x0379862c, 0x039638a9, 0x0262bbf1, 0x013f9b6b, 0x028e41ec, 0x02ece5e2, 0x01e5e01f, 0x01b0158d, 0x0029c6b4}}, Y: Field{[10]uint32{0x0308bf90, 0x0179a87b, 0x026ea437, 0x0113a029, 0x02ccfc5c, 0x006e6df4, 0x038a8644, 0x03119394, 0x006da956, 0x001bf5fa}}}, + {X: Field{[10]uint32{0x01860a3a, 0x00ddda3c, 0x0028d0ed, 0x014f5476, 0x0161a7c5, 0x0031abd6, 0x03b99576, 0x0299ff5e, 0x01f36075, 0x00180861}}, Y: Field{[10]uint32{0x0110b2e7, 0x030caf53, 0x02802165, 0x0353754b, 0x0102265c, 0x01ea274e, 0x03a027ce, 0x020d7991, 0x02db706b, 0x002434c4}}}, + {X: Field{[10]uint32{0x007a77ca, 0x01edf7d8, 0x006b598e, 0x01fe50dc, 0x0336b443, 0x01f718b0, 0x019976d3, 0x024646e7, 0x02837672, 0x0036c3f2}}, Y: Field{[10]uint32{0x02efc29d, 0x01210760, 0x03dd9c4f, 0x01a26541, 0x0278699a, 0x028600be, 0x009f0b32, 0x01faff83, 0x016e8eba, 0x0008f7b7}}}, + {X: Field{[10]uint32{0x00a54939, 0x023c95e9, 0x01884761, 0x03b00ce7, 0x02237d0a, 0x03fe37a0, 0x0159909f, 0x013c24a8, 0x0061598d, 0x001a466e}}, Y: Field{[10]uint32{0x0334b90c, 0x0072f6db, 0x03ff2f3e, 0x0050e4b0, 0x0127a1a2, 0x02693864, 0x01c07845, 0x00ea8ee1, 0x02fe1fa5, 0x002ae7e0}}}, + {X: Field{[10]uint32{0x0074bd59, 0x03becba0, 0x01e39299, 0x0063df8e, 0x02877ec1, 0x0354e803, 0x00f0a5d5, 0x006e9f0f, 0x02e9f1f5, 0x003d29f4}}, Y: Field{[10]uint32{0x005bd257, 0x01f8640b, 0x01be0ef1, 0x027665d0, 0x030c9bea, 0x02f39e60, 0x00e6380c, 0x02b38b69, 0x01006aa6, 0x0027c142}}}, + {X: Field{[10]uint32{0x01453da3, 0x02cb8d73, 0x03656366, 0x01f95065, 0x02392731, 0x03ffef65, 0x011ae232, 0x03784c42, 0x0210d4f1, 0x0022975c}}, Y: Field{[10]uint32{0x00580a54, 0x0345912c, 0x02a98abc, 0x001394ca, 0x034cae10, 0x024c1ab6, 0x0158a05a, 0x03683a99, 0x021b5b71, 0x0026bfe2}}}, + {X: Field{[10]uint32{0x00e86f16, 0x020063ae, 0x039f3f93, 0x0308abf5, 0x022c9195, 0x02812e1e, 0x020406be, 0x01c566c2, 0x03dce40d, 0x00267ac8}}, Y: Field{[10]uint32{0x00ecff66, 0x011f5059, 0x01b3782b, 0x037a7a03, 0x03b1f17f, 0x01e7f2af, 0x036cddaa, 0x03f7b1ff, 0x0138a66e, 0x000bbc86}}}, + {X: Field{[10]uint32{0x00d37472, 0x02e996ad, 0x02904a99, 0x0391eb2f, 0x01611ad0, 0x02aef9e0, 0x03f0d0b9, 0x011062b1, 0x02841a87, 0x000efc5b}}, Y: Field{[10]uint32{0x03e714ad, 0x00d44868, 0x003551fb, 0x02ca2bbd, 0x007d1138, 0x009dd0df, 0x008c0f19, 0x0232cbf2, 0x01f4e194, 0x00074f2e}}}, + {X: Field{[10]uint32{0x03f01f3e, 0x027f93f9, 0x0095af45, 0x03395126, 0x02561811, 0x018e22a1, 0x007c1333, 0x00e5382e, 0x03ff19eb, 0x0028fbe0}}, Y: Field{[10]uint32{0x0178cbab, 0x0344e920, 0x024a1045, 0x03374cd6, 0x019d687c, 0x00474238, 0x007ddb47, 0x02b32f37, 0x01398bdc, 0x00065577}}}, + {X: Field{[10]uint32{0x00b1af90, 0x03bc5f9c, 0x02552063, 0x0047d6b7, 0x005a344d, 0x008f75ad, 0x01c024c2, 0x013a04fb, 0x0351da9b, 0x0009a05b}}, Y: Field{[10]uint32{0x014aabd6, 0x001e980a, 0x03d30220, 0x01feef33, 0x0365611b, 0x01813a25, 0x02809676, 0x019e8d5c, 0x021d1d6b, 0x001189e3}}}, + {X: Field{[10]uint32{0x03dea823, 0x03a1112b, 0x0125a909, 0x0325239d, 0x031d47dc, 0x01e502c3, 0x03b14f69, 0x03c523b2, 0x03c0d640, 0x00178594}}, Y: Field{[10]uint32{0x00b092c7, 0x017333d3, 0x01c86cd4, 0x0325bfbb, 0x008e499c, 0x00af714a, 0x03aef229, 0x020d43b3, 0x01ede7cb, 0x0026e2e0}}}, + {X: Field{[10]uint32{0x0028de9e, 0x03a76f7a, 0x008f247f, 0x01beb770, 0x02b7725d, 0x0096c4ad, 0x0348c231, 0x00da5158, 0x02450b0d, 0x0006f623}}, Y: Field{[10]uint32{0x00a95db0, 0x036e8bee, 0x00fe2098, 0x01a1a602, 0x009f6faf, 0x00750059, 0x03dae7ca, 0x0377695d, 0x01e32d8b, 0x00060a4e}}}, + {X: Field{[10]uint32{0x01b73c02, 0x004b17f6, 0x01fbd31b, 0x005b5080, 0x02b80ab7, 0x03aede00, 0x01e754fb, 0x013900c5, 0x02063adc, 0x0012c0ff}}, Y: Field{[10]uint32{0x0080fb06, 0x0233d507, 0x0030e73e, 0x00c7a929, 0x03a5623c, 0x000fe638, 0x00ed537e, 0x03946403, 0x00a8e2c5, 0x002a1934}}}, + {X: Field{[10]uint32{0x01d35f61, 0x013c7a11, 0x0268c588, 0x003f4217, 0x01214686, 0x0311bced, 0x01927f13, 0x023ccc7b, 0x01150781, 0x00038829}}, Y: Field{[10]uint32{0x02bcf328, 0x021d79a5, 0x00db0484, 0x02828f48, 0x02a924e9, 0x03f523d9, 0x02466c43, 0x035b1627, 0x00021a79, 0x00287048}}}, + {X: Field{[10]uint32{0x001e37be, 0x024971fe, 0x03a732db, 0x0287200a, 0x034aaece, 0x0221787a, 0x0224d874, 0x0387362f, 0x024e74a1, 0x0038f446}}, Y: Field{[10]uint32{0x021645f5, 0x00a8eda1, 0x03c7f73d, 0x0271ed12, 0x03022b0a, 0x0220c752, 0x0006787b, 0x03c07d8e, 0x001e0a1e, 0x0023c7b0}}}, + {X: Field{[10]uint32{0x0237f6e5, 0x00a8204f, 0x00617d1e, 0x00c83d00, 0x03da71fa, 0x01ca6c58, 0x0292b584, 0x0036fba3, 0x021557fe, 0x002288cc}}, Y: Field{[10]uint32{0x02cce950, 0x022415ab, 0x01f5e938, 0x00a5870d, 0x03267dbd, 0x035de632, 0x021ed74b, 0x01d416ba, 0x031abb8c, 0x002bd791}}}, + {X: Field{[10]uint32{0x0051d20d, 0x0269db5a, 0x01cbe99f, 0x03ea65a1, 0x02997e8d, 0x01c05735, 0x01070e00, 0x011a0c54, 0x022cb43f, 0x000eef02}}, Y: Field{[10]uint32{0x00b4f97d, 0x038d46df, 0x00278bb0, 0x010e5bea, 0x01fd1408, 0x01820c44, 0x0168e88b, 0x013102e6, 0x038ea5f1, 0x0026877e}}}, + {X: Field{[10]uint32{0x011d1deb, 0x0384cf24, 0x01184811, 0x00e0e50c, 0x0165380f, 0x0101ed2e, 0x0059dac9, 0x020eafa3, 0x0381082d, 0x00230135}}, Y: Field{[10]uint32{0x000a3db4, 0x014982d3, 0x00eab4a6, 0x0261c663, 0x00c0a3e0, 0x0200e54d, 0x03213408, 0x008c5bf3, 0x0093fdb2, 0x00135d39}}}, + {X: Field{[10]uint32{0x02a0291f, 0x002935b5, 0x028c8577, 0x0057279f, 0x001ed9f9, 0x00b80d91, 0x00aa7c46, 0x00b37b7c, 0x010e7231, 0x00119f53}}, Y: Field{[10]uint32{0x00a1ce32, 0x0376875c, 0x001fc0d4, 0x010060ea, 0x02f117e2, 0x00475596, 0x00624ddf, 0x025528c3, 0x00a9d7c2, 0x0020f6d0}}}, + {X: Field{[10]uint32{0x01a3dc8c, 0x03d26311, 0x00195d55, 0x00b7866b, 0x02ce73ae, 0x01072f54, 0x00601869, 0x028406ac, 0x00cd8e55, 0x002d8bd8}}, Y: Field{[10]uint32{0x0314ef41, 0x0330c06c, 0x03cef428, 0x02e3efdb, 0x034a5108, 0x01633482, 0x030ed091, 0x00958bba, 0x00b07c6d, 0x00167692}}}, + {X: Field{[10]uint32{0x039e681f, 0x03746d72, 0x02183379, 0x03301924, 0x01166e88, 0x0151bbfa, 0x036d7f19, 0x03b9877c, 0x0210f98a, 0x001ad758}}, Y: Field{[10]uint32{0x018a0d76, 0x011b9bda, 0x028e77f2, 0x01eb11c8, 0x027c6de8, 0x00c01170, 0x008afca8, 0x0229adcb, 0x034859c8, 0x0036fec5}}}, + {X: Field{[10]uint32{0x02300c97, 0x03b34288, 0x00286049, 0x036d234f, 0x00548768, 0x01625df3, 0x012cc9ef, 0x0210ada3, 0x0104e8c7, 0x00221d13}}, Y: Field{[10]uint32{0x03b9c38c, 0x03d628a3, 0x01bc0393, 0x024e4421, 0x02149d29, 0x031f242d, 0x00b0e425, 0x03147968, 0x02a51ea3, 0x002115ce}}}, + {X: Field{[10]uint32{0x032e37c8, 0x02038cb0, 0x03d4bada, 0x0296f934, 0x00d0218b, 0x005ab64e, 0x03065712, 0x02b16066, 0x002440f2, 0x003f7cb2}}, Y: Field{[10]uint32{0x01538f74, 0x01b56a97, 0x028b5587, 0x0069d019, 0x01917203, 0x02180b7f, 0x00c6f205, 0x007fef92, 0x00b59e96, 0x0030aaf1}}}, + {X: Field{[10]uint32{0x03777559, 0x012255fb, 0x028a9366, 0x03826d33, 0x0115178c, 0x011d5501, 0x02273bd2, 0x0220ecc8, 0x03641f5a, 0x00134bf7}}, Y: Field{[10]uint32{0x02a41b11, 0x002ce152, 0x029fabed, 0x00070d12, 0x02b2837f, 0x02cc85eb, 0x021b89b9, 0x03cc7190, 0x0101210b, 0x0008ae87}}}, + {X: Field{[10]uint32{0x00ddc633, 0x0185648d, 0x022699c4, 0x0330abf2, 0x035a54dc, 0x017192a3, 0x02f3faea, 0x02ff7e06, 0x00a1e743, 0x003b1f2f}}, Y: Field{[10]uint32{0x02ab0917, 0x01e05b93, 0x02e295f5, 0x039263f3, 0x03dc5263, 0x01684041, 0x0128c05e, 0x028141ed, 0x01a9ea76, 0x0027c64f}}}, + {X: Field{[10]uint32{0x00b44fdf, 0x02aef011, 0x01943c7f, 0x037e74dc, 0x00da9cd6, 0x00f2e013, 0x001e7790, 0x0262e2e0, 0x01137719, 0x003fcbe8}}, Y: Field{[10]uint32{0x01f6093c, 0x011af2cb, 0x02c54237, 0x009008b2, 0x022aec68, 0x02335bc2, 0x01d966db, 0x01d9c31e, 0x03f21ac5, 0x00258849}}}, + {X: Field{[10]uint32{0x00a57580, 0x0179de82, 0x035ee647, 0x0324a7c5, 0x034fd418, 0x010db5ab, 0x02c21bec, 0x000b48d3, 0x006b2dfb, 0x001b46d0}}, Y: Field{[10]uint32{0x00e895eb, 0x03a88f6f, 0x02f07b2d, 0x0394e2e7, 0x02f157ef, 0x00f9ed80, 0x00693d6d, 0x0238be3c, 0x02689dba, 0x002e2515}}}, + {X: Field{[10]uint32{0x004d7963, 0x03bd4e59, 0x01df587b, 0x03ddd308, 0x020317bf, 0x00371ae5, 0x00767270, 0x00033919, 0x01fb449e, 0x0012aee7}}, Y: Field{[10]uint32{0x006e6407, 0x03162f7e, 0x018e49c2, 0x02a1d517, 0x004d6dbb, 0x026bc726, 0x01807868, 0x031a6cab, 0x02b7c016, 0x001821bc}}}, + {X: Field{[10]uint32{0x010fcee6, 0x036d8e99, 0x022361f8, 0x0293f43b, 0x022fb3be, 0x016128f2, 0x00b0b895, 0x010258dd, 0x01cc634a, 0x0036c314}}, Y: Field{[10]uint32{0x01b6e6a0, 0x03f8cf31, 0x02486367, 0x01fe160d, 0x015d2825, 0x01ec3993, 0x0116fd39, 0x02b8612f, 0x012baea1, 0x001fb02f}}}, + {X: Field{[10]uint32{0x03fdb287, 0x01348b0d, 0x00e74495, 0x020886aa, 0x006996a3, 0x011b79c1, 0x01e02ed6, 0x01246699, 0x01bcd066, 0x002b9bdb}}, Y: Field{[10]uint32{0x03f2f201, 0x03eda870, 0x03d1bb76, 0x03d7d7fb, 0x02c5bbb2, 0x027e440b, 0x01313791, 0x01d01046, 0x02aef8ae, 0x002af9c3}}}, + {X: Field{[10]uint32{0x035f6227, 0x034eb234, 0x01fda63d, 0x018beb14, 0x00f4079a, 0x01ff25dc, 0x00771a91, 0x007cc2f4, 0x0397cb32, 0x002ba8fa}}, Y: Field{[10]uint32{0x02bf39b6, 0x006b919a, 0x0352506f, 0x0285105a, 0x03878145, 0x00a1f7f7, 0x0133704a, 0x005717a4, 0x00163985, 0x002da94d}}}, + {X: Field{[10]uint32{0x012233be, 0x02f28721, 0x01ded051, 0x0018fa24, 0x0039355c, 0x01b04ebe, 0x037234ef, 0x01437a07, 0x00cf711d, 0x0024327e}}, Y: Field{[10]uint32{0x0021bff5, 0x0388720d, 0x0151ed7f, 0x00baa805, 0x0317d2c3, 0x004d61e0, 0x013d4528, 0x025927cb, 0x037818f1, 0x00023655}}}, + {X: Field{[10]uint32{0x02d976e0, 0x017b6321, 0x020e2149, 0x02ae4809, 0x02fd954a, 0x012d23bf, 0x028dcde3, 0x000d1154, 0x00e5ab1d, 0x0016b5fb}}, Y: Field{[10]uint32{0x038569b0, 0x0052c0fd, 0x003d8700, 0x0112c5e1, 0x0062ac94, 0x0311adb8, 0x03274e93, 0x018eaefb, 0x023b2c3c, 0x000b7c85}}}, + {X: Field{[10]uint32{0x03d28d9a, 0x0113a38e, 0x0031cb78, 0x01f5622a, 0x001d80ae, 0x00eac32b, 0x026d3ee1, 0x00bbc05b, 0x022c8e94, 0x002dae8b}}, Y: Field{[10]uint32{0x03ef7fb4, 0x01776dc6, 0x0101d085, 0x014f402d, 0x00a2ebf4, 0x03490458, 0x01b6b067, 0x037f7d40, 0x0235f923, 0x00104602}}}, + {X: Field{[10]uint32{0x03f5f37d, 0x01319d1f, 0x01cc413a, 0x02a71a02, 0x00799555, 0x03211627, 0x03dd450b, 0x01b1f7ea, 0x03c9bba2, 0x001f9026}}, Y: Field{[10]uint32{0x01c9e6b1, 0x00f7b9de, 0x0030ce42, 0x00d067f8, 0x036066b0, 0x020763f7, 0x01c42604, 0x02bf8b90, 0x01619cc5, 0x00031462}}}, + {X: Field{[10]uint32{0x024f602c, 0x02145bb7, 0x024e0300, 0x01aa942d, 0x022c7263, 0x031f1308, 0x01010606, 0x03cbb8a3, 0x011470b2, 0x002521b3}}, Y: Field{[10]uint32{0x02b467af, 0x03edd2f7, 0x012ceaac, 0x028d27d1, 0x02c062e9, 0x01cc8d9f, 0x0131785f, 0x0001bf7e, 0x038cfc5b, 0x00221b32}}}, + {X: Field{[10]uint32{0x01338d2a, 0x027b62c8, 0x0183b1af, 0x0271520b, 0x0294b1ee, 0x0116e817, 0x01af6d87, 0x01c81478, 0x017bc8b0, 0x0039f047}}, Y: Field{[10]uint32{0x035c8e50, 0x0214b7b5, 0x00f79c74, 0x00f5e5ff, 0x016ad468, 0x024bcd6a, 0x01062aa1, 0x02ac7bf2, 0x0293828c, 0x003f7134}}}, + {X: Field{[10]uint32{0x03d50bcd, 0x00003c24, 0x02217c98, 0x01763a00, 0x0119b1a8, 0x01db7b4d, 0x01b67b27, 0x0172c06c, 0x027bff31, 0x00037f98}}, Y: Field{[10]uint32{0x01f9e773, 0x00aa3b95, 0x03c285f3, 0x0346e57b, 0x03ea0f69, 0x0275a39a, 0x01d2480c, 0x0021edbf, 0x01ebbb65, 0x00264f15}}}, + {X: Field{[10]uint32{0x0046f516, 0x03ab1969, 0x01dde189, 0x01b55210, 0x03eb31c2, 0x0183c0bc, 0x007c9818, 0x028b2d7f, 0x0017fd00, 0x00283c33}}, Y: Field{[10]uint32{0x033b8969, 0x030a5792, 0x03a74ff5, 0x03aaf4c3, 0x0214bbe4, 0x00fb74df, 0x01077a7d, 0x0228efc4, 0x004c31d5, 0x002feba2}}}, + {X: Field{[10]uint32{0x03e37338, 0x02dcaea8, 0x01dd9dd7, 0x014e47f8, 0x03d37e7f, 0x0251ad4a, 0x02ef926c, 0x00a1bb5b, 0x02bcbc14, 0x003076ed}}, Y: Field{[10]uint32{0x02df7bf0, 0x00f9a984, 0x01bd0e79, 0x00d44e78, 0x03aa5e27, 0x028ea235, 0x036fdc81, 0x01a20bd2, 0x0187bd33, 0x0019ec0b}}}, + {X: Field{[10]uint32{0x034bebb2, 0x01416f2e, 0x03eebe82, 0x004440d0, 0x03070255, 0x03bb7d7b, 0x02cb1f06, 0x02571324, 0x025bc7d4, 0x00082e41}}, Y: Field{[10]uint32{0x00756835, 0x01449184, 0x00fbd55d, 0x029c12c9, 0x014fec71, 0x018090b6, 0x021a4f90, 0x00764af4, 0x03165c23, 0x0029a61c}}}, + {X: Field{[10]uint32{0x01a69190, 0x0152043b, 0x03f2e03c, 0x01993e36, 0x0255ab9a, 0x023f21e1, 0x029544d3, 0x0230e376, 0x01d00c4d, 0x001efb7f}}, Y: Field{[10]uint32{0x00af77a1, 0x01c569be, 0x00591690, 0x0394f275, 0x01365556, 0x01cbfb81, 0x02d00491, 0x014b79ba, 0x00b00d4f, 0x0026653c}}}, + {X: Field{[10]uint32{0x035918e0, 0x034e179a, 0x01368df4, 0x03481067, 0x035adcad, 0x0083a5f2, 0x023815b7, 0x020fdab1, 0x02af9979, 0x00099d8b}}, Y: Field{[10]uint32{0x0227e6be, 0x00862356, 0x02549279, 0x0359daab, 0x0125f0c0, 0x0395883f, 0x00be2e9b, 0x0136f009, 0x008ce11b, 0x00207d51}}}, + {X: Field{[10]uint32{0x0387bb79, 0x013d337c, 0x013d9a94, 0x01d64b43, 0x03ea14f1, 0x036a1b84, 0x0354ff5d, 0x03854b0c, 0x02e7ee18, 0x001c5232}}, Y: Field{[10]uint32{0x0310b18d, 0x032d3788, 0x0336593d, 0x002fbba0, 0x02ffd42a, 0x02b1af03, 0x0065efed, 0x01ba4105, 0x01faf6f8, 0x0002f6cd}}}, + {X: Field{[10]uint32{0x03bdbc90, 0x023385e1, 0x02723503, 0x001964f0, 0x01bb4d8f, 0x015a116d, 0x01ae00b1, 0x00b0ce9a, 0x01d933ae, 0x0009f917}}, Y: Field{[10]uint32{0x01801ac9, 0x02aff594, 0x02db1f7c, 0x0281643c, 0x017dfe36, 0x009c68ac, 0x019c75c9, 0x01e68fe3, 0x033fa935, 0x0028af38}}}, + {X: Field{[10]uint32{0x03d6b7d7, 0x02fcacb5, 0x02a98fa2, 0x0047fb4a, 0x00d0539c, 0x0207980f, 0x02d79c7d, 0x02ba30a8, 0x02155b28, 0x002bc31c}}, Y: Field{[10]uint32{0x03ac41f9, 0x00b1a6a9, 0x0085640d, 0x038793cb, 0x023b5b26, 0x0073eb0f, 0x0380bfc7, 0x00270002, 0x03cfa251, 0x002b9af7}}}, + {X: Field{[10]uint32{0x03cbabf4, 0x03f80a98, 0x02bec7ec, 0x00646b32, 0x02de0f5a, 0x007a38dc, 0x00e609b2, 0x034d3cc5, 0x0008d4f8, 0x001ed8f1}}, Y: Field{[10]uint32{0x00f16327, 0x02ca6fa5, 0x03a7ce0d, 0x03402f32, 0x02236925, 0x0222166d, 0x02b6f65e, 0x025af633, 0x009a78fa, 0x002a8200}}}, + {X: Field{[10]uint32{0x01c6890c, 0x0163e6e1, 0x03f9394d, 0x000506bb, 0x024f4b48, 0x03d3cc8c, 0x03cffb68, 0x03a22f58, 0x005314f3, 0x002adda2}}, Y: Field{[10]uint32{0x037f192c, 0x0280dbf3, 0x019e05d3, 0x010455f1, 0x01c9ff98, 0x01ffc520, 0x033610ed, 0x01af0430, 0x0033d6d9, 0x00069c72}}}, + {X: Field{[10]uint32{0x023bd32e, 0x038d4727, 0x025a9953, 0x03692c97, 0x01ccd308, 0x0303b616, 0x0375487c, 0x01444be0, 0x03f07ad7, 0x0019050d}}, Y: Field{[10]uint32{0x01a9b131, 0x00e8e220, 0x026b0ccc, 0x0142130c, 0x027d2ec9, 0x03c02198, 0x00f1ba83, 0x00d1abd4, 0x03e6b255, 0x000f163d}}}, + {X: Field{[10]uint32{0x03a082cb, 0x029d9259, 0x0180b9b4, 0x0321dce5, 0x0360f7ec, 0x03406ba1, 0x01cceaff, 0x0351e307, 0x012d600e, 0x003d4cbf}}, Y: Field{[10]uint32{0x0285fa96, 0x02f3e844, 0x0145e440, 0x02b5a5f2, 0x03221847, 0x0200f27c, 0x01bb4d6c, 0x01f5fdf3, 0x014c7111, 0x001ce4d4}}}, + {X: Field{[10]uint32{0x031c7631, 0x02f41d42, 0x01c3ee1f, 0x0351d7c3, 0x00db73db, 0x03e20a4e, 0x01e6f608, 0x02ad1362, 0x01592c4b, 0x000cd9e6}}, Y: Field{[10]uint32{0x01694fbc, 0x01c058d2, 0x035aa1fd, 0x018973d9, 0x0217125d, 0x03fd5f37, 0x00782515, 0x0273cdb4, 0x00046fe8, 0x001307e0}}}, + {X: Field{[10]uint32{0x0256c9cb, 0x008681ef, 0x00a5be22, 0x0380ca5c, 0x016f18b7, 0x0232b0a1, 0x02b53962, 0x03295ec1, 0x016d2a34, 0x00386130}}, Y: Field{[10]uint32{0x02c5bf73, 0x01780f78, 0x009c77f8, 0x00d11ad4, 0x03d646cd, 0x0319b7d5, 0x02ab0688, 0x027137c5, 0x017b51ef, 0x001f7ff0}}}, + {X: Field{[10]uint32{0x0015d419, 0x01b22119, 0x0068f0e2, 0x035bbee3, 0x034f6ce6, 0x02883078, 0x00de9909, 0x027556ee, 0x01162fb4, 0x003e2a5f}}, Y: Field{[10]uint32{0x02061146, 0x0130b910, 0x034a7ded, 0x00ea19a1, 0x005f20a8, 0x007cba1b, 0x012e1616, 0x03280652, 0x00534dbf, 0x000f34f3}}}, + {X: Field{[10]uint32{0x02475781, 0x03783a84, 0x0164eb32, 0x001ab5c6, 0x0328cfc4, 0x0234f714, 0x02dd6123, 0x03608751, 0x022f6c6a, 0x0027adaa}}, Y: Field{[10]uint32{0x0045c299, 0x00f8d1db, 0x004afcb3, 0x03a3ef08, 0x0053dfe3, 0x029066ca, 0x024ce341, 0x00b824d9, 0x028379d3, 0x00051406}}}, + {X: Field{[10]uint32{0x0202668a, 0x021e8f0d, 0x036425f8, 0x017f3ae9, 0x017c4031, 0x008ff500, 0x02427403, 0x02255787, 0x026a68e6, 0x003af095}}, Y: Field{[10]uint32{0x00c7ea39, 0x024c7935, 0x0063aa06, 0x03050bbc, 0x01fab3bd, 0x03a7b269, 0x01f9f85a, 0x015b8995, 0x010996ff, 0x0001d7a0}}}, + {X: Field{[10]uint32{0x012bc392, 0x02dfacbd, 0x029fd674, 0x012d01d2, 0x03ab9c5e, 0x02921032, 0x025b29db, 0x033970be, 0x0038a966, 0x00155919}}, Y: Field{[10]uint32{0x001c8d66, 0x01c083e6, 0x0228f0a3, 0x0033a6a3, 0x022987d8, 0x017354b9, 0x003f68a4, 0x012a273f, 0x02867603, 0x000d18c6}}}, + {X: Field{[10]uint32{0x0316575e, 0x02c0cdde, 0x032e7ece, 0x01759ca7, 0x00082eff, 0x01f76453, 0x03257b8c, 0x0207ccc4, 0x0309befb, 0x002e1fe0}}, Y: Field{[10]uint32{0x016ea298, 0x036dff6a, 0x00630dee, 0x030b3157, 0x03eda5e1, 0x0202fb06, 0x03df03fb, 0x0000b5be, 0x003259e4, 0x002fa99a}}}, + {X: Field{[10]uint32{0x00a0a93e, 0x011c77dc, 0x008d7953, 0x0054a24b, 0x0224b6cf, 0x005b90d7, 0x03598b20, 0x0358fab3, 0x0185b440, 0x0011655d}}, Y: Field{[10]uint32{0x00b71427, 0x03aabab1, 0x013a00b3, 0x03f08cd2, 0x03b29739, 0x019419fe, 0x02c366a5, 0x013d3c8e, 0x0260776a, 0x003d32d8}}}, + {X: Field{[10]uint32{0x0248ca87, 0x01eef925, 0x02e11148, 0x0122e583, 0x033fe8d6, 0x03e73015, 0x024c8218, 0x010aec60, 0x024c8d9c, 0x000b243d}}, Y: Field{[10]uint32{0x03c25a8a, 0x006f9074, 0x00ab4da2, 0x01f5ac76, 0x0369bebf, 0x008bf3d5, 0x03000a9f, 0x00f2d827, 0x0157ac64, 0x0020a6f3}}}, + {X: Field{[10]uint32{0x004b5efe, 0x02c15205, 0x037be36d, 0x0048aea7, 0x012e7539, 0x01dcc5ca, 0x006a3fcc, 0x026af655, 0x02c7779c, 0x003acc9e}}, Y: Field{[10]uint32{0x018c9435, 0x00e46414, 0x025a08c4, 0x01948e15, 0x032cbbf3, 0x01b9d200, 0x032c594d, 0x0334e230, 0x00858d2f, 0x00086b0b}}}, + {X: Field{[10]uint32{0x006d007d, 0x0032c74b, 0x00e6adba, 0x00606b8c, 0x00daa354, 0x00df43c2, 0x02b07fdd, 0x03329ea8, 0x03e2272c, 0x000257b1}}, Y: Field{[10]uint32{0x03a12b5f, 0x01e3f14a, 0x00f3375f, 0x01f93dd0, 0x002d589e, 0x0042e224, 0x02ac913c, 0x01814154, 0x02ef59df, 0x001ccde1}}}, + {X: Field{[10]uint32{0x000cbbd1, 0x019f1a7f, 0x015f5fc3, 0x00a4b186, 0x0191104a, 0x03fc5cdc, 0x03c845d7, 0x028203c9, 0x02988b4f, 0x0012de99}}, Y: Field{[10]uint32{0x03a85b8f, 0x011606d8, 0x0207c928, 0x01360904, 0x008e5249, 0x0266ca79, 0x0338fd4d, 0x01584a1e, 0x03d0a360, 0x0022c10e}}}, + {X: Field{[10]uint32{0x0342e6b2, 0x02af4c68, 0x025e747d, 0x024bf194, 0x00a92337, 0x006409f0, 0x02ab28a6, 0x02077cd4, 0x018b6df5, 0x00226cb1}}, Y: Field{[10]uint32{0x03f53a2b, 0x01168435, 0x001f4100, 0x03ae223a, 0x009b053f, 0x000edd2f, 0x025edea2, 0x03996f89, 0x0334d459, 0x000c02c6}}}, + {X: Field{[10]uint32{0x03c43cf1, 0x02a04526, 0x008007ad, 0x009e27c3, 0x031c9263, 0x01d7b121, 0x027ff0db, 0x00a34392, 0x035d9f6a, 0x00104266}}, Y: Field{[10]uint32{0x0262cae5, 0x03056dde, 0x00b26995, 0x02680d65, 0x013e0791, 0x00196234, 0x009253be, 0x024adba5, 0x02962e2b, 0x000a82ae}}}, + {X: Field{[10]uint32{0x03229be4, 0x03f58581, 0x00817af7, 0x02704e27, 0x018825ea, 0x02998d55, 0x03396b29, 0x00230d41, 0x00649ec5, 0x002f2c3f}}, Y: Field{[10]uint32{0x0207d606, 0x011a4cce, 0x03e5c2c7, 0x02e4b5ef, 0x0313664d, 0x0248b991, 0x03a12ae0, 0x03d6adb0, 0x0192cf3b, 0x0005a31e}}}, + {X: Field{[10]uint32{0x018b762e, 0x01c6737b, 0x009a50ec, 0x035bdc0d, 0x029cd3b3, 0x0156a025, 0x0314ca70, 0x015abe78, 0x01585a62, 0x001e8ff2}}, Y: Field{[10]uint32{0x03df1346, 0x011172f4, 0x00f2217d, 0x01e0e44a, 0x00dadecd, 0x01c5e764, 0x0288526b, 0x001c58d4, 0x000c29cd, 0x003fa2ca}}}, + {X: Field{[10]uint32{0x01a8176a, 0x038fc198, 0x02fe1c89, 0x03980341, 0x027583c1, 0x0195b6a6, 0x03229e1e, 0x028d7b83, 0x03e1b968, 0x000ddc24}}, Y: Field{[10]uint32{0x02c601d9, 0x003e2830, 0x02b82e6e, 0x0220082b, 0x006aba8e, 0x02303600, 0x02a4dd0b, 0x03d185f9, 0x020df6c9, 0x0039f021}}}, + {X: Field{[10]uint32{0x02afecd8, 0x018fc512, 0x02a375ba, 0x03496a63, 0x01919b1d, 0x0184c068, 0x0327a933, 0x033333c7, 0x03daf4a5, 0x00317bfc}}, Y: Field{[10]uint32{0x00b97a1c, 0x01259337, 0x01d67f42, 0x027d38fc, 0x010a9412, 0x0088b0bf, 0x008a02c2, 0x020f7063, 0x023426f9, 0x000d3845}}}, + {X: Field{[10]uint32{0x023ffb27, 0x02a732f9, 0x014e984e, 0x03c54bb1, 0x033c0fa6, 0x00da2bf2, 0x0230f728, 0x0034cd10, 0x0119eb56, 0x00003f1e}}, Y: Field{[10]uint32{0x0059a6b3, 0x00a10aa6, 0x03fa9413, 0x033ab6b4, 0x00a04bc4, 0x03929f74, 0x01cb8388, 0x01bfe6f0, 0x0382af76, 0x00071f4d}}}, + {X: Field{[10]uint32{0x021ca5bd, 0x0362c921, 0x001c6287, 0x00890f4e, 0x03b31183, 0x0371bd1b, 0x0034cd6e, 0x01b5c951, 0x03fb4938, 0x0009e0f5}}, Y: Field{[10]uint32{0x03fa5c70, 0x005b8e31, 0x00111a93, 0x01d205c4, 0x01e4c685, 0x023e271e, 0x00450262, 0x01ab038f, 0x02710b80, 0x0028eabc}}}, + {X: Field{[10]uint32{0x018a02f3, 0x012cc3cb, 0x012298ad, 0x01bff4d7, 0x0188f54a, 0x0396efe5, 0x03f89495, 0x038343dd, 0x007868d4, 0x001d01e9}}, Y: Field{[10]uint32{0x03fdec9c, 0x03046d61, 0x001ce24c, 0x0250166b, 0x02debf3d, 0x024cca5f, 0x01b393ea, 0x0232c2a9, 0x016296e1, 0x00049435}}}, + {X: Field{[10]uint32{0x0061a321, 0x0137486a, 0x01df6cc5, 0x0293e118, 0x01c5899f, 0x0055101e, 0x02c108e7, 0x03b369de, 0x00e32940, 0x0030b4b3}}, Y: Field{[10]uint32{0x005a1909, 0x037a16fc, 0x01b729e6, 0x02aba0c3, 0x030a919e, 0x03321516, 0x00b05e3e, 0x0201c64a, 0x01fa40bb, 0x003c2fac}}}, + {X: Field{[10]uint32{0x01e8a56f, 0x03eb0fab, 0x013eb349, 0x00d4132c, 0x00d459a9, 0x02d7a54c, 0x014e1f5a, 0x006559aa, 0x0189c505, 0x00233dac}}, Y: Field{[10]uint32{0x03cf9c96, 0x018152f3, 0x0338c160, 0x02205884, 0x00327aa7, 0x008b51ea, 0x02d06d3b, 0x00a21b39, 0x017032e5, 0x002fdaa7}}}, + {X: Field{[10]uint32{0x01a94968, 0x019d9b4a, 0x01d51ece, 0x00adff42, 0x022deeaa, 0x00c9df47, 0x016ac5f5, 0x0211c43e, 0x0186ed9f, 0x0035ac1d}}, Y: Field{[10]uint32{0x009c5326, 0x03a0fd7c, 0x03c9c75b, 0x007b4b88, 0x022f7904, 0x038fe8a4, 0x02f0d0d5, 0x01573d2b, 0x00b4ce56, 0x0036ad35}}}, + {X: Field{[10]uint32{0x02f4d647, 0x01c89ec3, 0x0000fb85, 0x00cd136a, 0x009e661d, 0x001e560d, 0x03a09219, 0x00fb7fcc, 0x033360a0, 0x0029c82d}}, Y: Field{[10]uint32{0x0084ea63, 0x01702d52, 0x035b11bb, 0x03fef513, 0x0313d79d, 0x003d219f, 0x037e3a5a, 0x00b60980, 0x006a721c, 0x0007c84f}}}, + {X: Field{[10]uint32{0x033a5ff7, 0x01a73b07, 0x030ac95a, 0x028b2806, 0x01b39f9b, 0x0167741d, 0x03db862e, 0x031b19c5, 0x02983b03, 0x00156295}}, Y: Field{[10]uint32{0x00ffb1a4, 0x0331b1f5, 0x0155792e, 0x01a621ff, 0x00fe3ae8, 0x00117f18, 0x0338458a, 0x02da2c85, 0x0352db21, 0x001f81f1}}}, + {X: Field{[10]uint32{0x00e14ca4, 0x02d55404, 0x002639ca, 0x035fe35b, 0x02a7c2d9, 0x00474382, 0x0329941f, 0x01a2a314, 0x03c32786, 0x002e49f7}}, Y: Field{[10]uint32{0x0323388c, 0x01e570ad, 0x035524b8, 0x0152666b, 0x0172f4d8, 0x01dc1489, 0x020e35f7, 0x0089eed0, 0x03259954, 0x000f3a0d}}}, + {X: Field{[10]uint32{0x030e6da8, 0x0263b313, 0x0016513f, 0x00719470, 0x003c35f7, 0x02d568dd, 0x0223ed5a, 0x02bfd623, 0x00991085, 0x000adc35}}, Y: Field{[10]uint32{0x006a8b06, 0x013c0a94, 0x025cd1a9, 0x004c72b8, 0x030a7014, 0x03609d8b, 0x03984697, 0x01727288, 0x034daa1e, 0x0037d04e}}}, + {X: Field{[10]uint32{0x01aefe56, 0x007cbbcb, 0x01144142, 0x015298b8, 0x01e1368e, 0x012e9dfa, 0x029181d9, 0x01b80266, 0x00dcf72f, 0x002e20db}}, Y: Field{[10]uint32{0x010427ce, 0x01488279, 0x00359afa, 0x02a94e53, 0x0201beec, 0x0233abad, 0x017014b6, 0x03c9b72b, 0x012f0e31, 0x00026b51}}}, + {X: Field{[10]uint32{0x00af93a7, 0x02daa031, 0x01b004dc, 0x01173643, 0x02ec66b4, 0x03cce026, 0x0388b480, 0x0388e825, 0x017b65f0, 0x00094aca}}, Y: Field{[10]uint32{0x00916838, 0x02c37898, 0x010e806c, 0x034314cd, 0x039f77c7, 0x0092962f, 0x02a3bcfc, 0x018845cd, 0x00c43c34, 0x00233138}}}, + {X: Field{[10]uint32{0x02be6330, 0x0245c737, 0x01892aad, 0x001335ca, 0x03d34f27, 0x035adef6, 0x03d5fa03, 0x03319a3b, 0x00ca1c15, 0x0027cf4c}}, Y: Field{[10]uint32{0x023211b0, 0x0188c9ec, 0x0057b386, 0x02613888, 0x01353d9b, 0x0051d85c, 0x0056974f, 0x03b9eaf0, 0x00340f95, 0x001122d9}}}, + {X: Field{[10]uint32{0x03d35e49, 0x034a614b, 0x039e66e2, 0x01793952, 0x01653b54, 0x02f1ef38, 0x00a771b5, 0x02b767fe, 0x016e5bc9, 0x00208978}}, Y: Field{[10]uint32{0x010570fa, 0x012a9d5f, 0x0212c717, 0x02774401, 0x00df836b, 0x01fc2765, 0x024e1de8, 0x028b05b2, 0x01e3aaef, 0x00189531}}}, + {X: Field{[10]uint32{0x02d02ebe, 0x01a729aa, 0x01799046, 0x019d34f1, 0x01074f47, 0x0378956c, 0x02a80b74, 0x0266c6dc, 0x02484d6e, 0x0029f73b}}, Y: Field{[10]uint32{0x01c170a7, 0x0160ee80, 0x002a42db, 0x01e231f1, 0x00785861, 0x03bdea52, 0x021f541b, 0x02407d21, 0x00fa76a2, 0x00075bc3}}}, + {X: Field{[10]uint32{0x009976b4, 0x038c57a0, 0x03d1e210, 0x00ae8e5b, 0x009a6baa, 0x00b1992e, 0x013372fd, 0x03a43a63, 0x01a85d4c, 0x002a4511}}, Y: Field{[10]uint32{0x00b1d100, 0x020e1d9e, 0x01449f1d, 0x03e539f1, 0x0072deac, 0x0365001f, 0x01d1512c, 0x01cac6d4, 0x028b99b0, 0x002b7131}}}, + {X: Field{[10]uint32{0x027ce1f1, 0x0217b88a, 0x01c79ed6, 0x02b621b3, 0x036f6ea6, 0x01443803, 0x00410963, 0x025955d7, 0x01ce907c, 0x001d18b2}}, Y: Field{[10]uint32{0x0371c7df, 0x03fe882e, 0x00f2ae67, 0x03a0ccbe, 0x0047a854, 0x02731050, 0x02df5ac7, 0x008a6710, 0x01c5f02c, 0x0013fe90}}}, + {X: Field{[10]uint32{0x00cd4f40, 0x0232a18a, 0x005065d3, 0x0112596a, 0x00dfd855, 0x029e7c8d, 0x00e36bb6, 0x0256f6be, 0x01f3dea4, 0x00350a25}}, Y: Field{[10]uint32{0x010d9cf5, 0x024ab82d, 0x01bbd59c, 0x003ea036, 0x00982171, 0x02ee121b, 0x0069b207, 0x00710b9e, 0x031813a1, 0x000bfb7a}}}, + {X: Field{[10]uint32{0x01388adc, 0x03666853, 0x01669c29, 0x01b5da99, 0x02e8291e, 0x03bd4f44, 0x03434b27, 0x01622bc4, 0x0362ce85, 0x003be6da}}, Y: Field{[10]uint32{0x03bf912f, 0x022bb826, 0x0138adb1, 0x015516da, 0x02802612, 0x024501f2, 0x0107955e, 0x03258bb6, 0x03cf9af0, 0x000567d7}}}, + {X: Field{[10]uint32{0x01bc9f32, 0x02c1b23f, 0x03f392af, 0x01f8a9a4, 0x0392877c, 0x0325abff, 0x01fb7bdb, 0x0276bf7d, 0x01a0bc65, 0x001000fc}}, Y: Field{[10]uint32{0x0161fef9, 0x0217ad5e, 0x03cc9ea6, 0x029b09c1, 0x017faeaf, 0x012fa197, 0x03f1dcb7, 0x03c2c0a3, 0x02a17458, 0x003afff2}}}, + {X: Field{[10]uint32{0x02c09a8b, 0x01c0da9a, 0x027debed, 0x03640121, 0x01aa9ae1, 0x0121bd73, 0x00786f07, 0x03614592, 0x008b6b03, 0x0010e412}}, Y: Field{[10]uint32{0x0282f07a, 0x01da98e1, 0x03d6e5dd, 0x0304a682, 0x03452001, 0x00777ce4, 0x035b88a2, 0x02d5ac70, 0x01e5a10d, 0x001e0ca7}}}, + {X: Field{[10]uint32{0x03fadea1, 0x01d019ea, 0x006b9605, 0x005be7fe, 0x016074ee, 0x037fe2d0, 0x0006c565, 0x03ed9ad8, 0x00d29ea3, 0x002b9b68}}, Y: Field{[10]uint32{0x011cdac7, 0x00cc8d30, 0x009c05ca, 0x007ae22d, 0x0229e3f0, 0x00dc1853, 0x02f0916f, 0x00a98f9d, 0x0263dd01, 0x001d32aa}}}, + {X: Field{[10]uint32{0x03cfc72a, 0x0362a1ae, 0x014fb2fa, 0x03825414, 0x02035942, 0x013a01bd, 0x00656520, 0x011c86df, 0x01df9861, 0x001e3e1e}}, Y: Field{[10]uint32{0x00281ac6, 0x014a5b4e, 0x01c68a75, 0x034e2358, 0x032318aa, 0x03ee1731, 0x03661b7f, 0x03a02fea, 0x018c478a, 0x00106539}}}, + {X: Field{[10]uint32{0x03c97e01, 0x00be5b97, 0x01d1dedd, 0x00a1ec70, 0x000352e0, 0x00e0d577, 0x00d51cc8, 0x02c31b5b, 0x03654f41, 0x00201a10}}, Y: Field{[10]uint32{0x02b62461, 0x000cfae4, 0x01c45262, 0x01f8ec79, 0x037546bc, 0x00d7ca69, 0x0141a0d0, 0x006d3878, 0x023f13c6, 0x0022c308}}}, + {X: Field{[10]uint32{0x0387466c, 0x02ce4212, 0x0301005c, 0x00d271e5, 0x02f83b59, 0x0365f42a, 0x03d11691, 0x01d7d1bb, 0x019f4fd9, 0x000a5427}}, Y: Field{[10]uint32{0x02d0da81, 0x03ae9a81, 0x038da8a0, 0x0214bab4, 0x02a33de5, 0x00d78f21, 0x00fccbe1, 0x02be5b27, 0x037569a0, 0x00051dfa}}}, + {X: Field{[10]uint32{0x031dfa4a, 0x03ffabb7, 0x0399c2d8, 0x0105bafd, 0x004e3d57, 0x00f18ea7, 0x01532fe3, 0x01c8bc30, 0x00433d9c, 0x00064745}}, Y: Field{[10]uint32{0x003a2cd8, 0x012d375c, 0x01706eae, 0x02d997b2, 0x01a5e3c7, 0x006213bb, 0x01ecf839, 0x01c6b5d1, 0x0009b6b5, 0x0016f401}}}, + {X: Field{[10]uint32{0x030155a8, 0x022c5646, 0x001e1ebf, 0x0078f6c8, 0x02a50f0e, 0x03aa0afc, 0x02d65afe, 0x0205a17b, 0x002ed273, 0x000a10f5}}, Y: Field{[10]uint32{0x03c63ee8, 0x01f4246e, 0x02f98ff8, 0x02e02669, 0x0177edaf, 0x00cb2c89, 0x03e6e2c2, 0x027d4ed1, 0x0266c0fa, 0x00201f3a}}}, + {X: Field{[10]uint32{0x03c8f644, 0x014ef44a, 0x000184d6, 0x00b5145b, 0x00e96ed0, 0x03a084be, 0x007514b8, 0x034dbd4d, 0x03b09656, 0x00155a2d}}, Y: Field{[10]uint32{0x00e60d87, 0x03618e14, 0x009118b2, 0x026e904a, 0x02496045, 0x03a8d901, 0x03da30d7, 0x01b710fe, 0x03a65483, 0x0016d13a}}}, + {X: Field{[10]uint32{0x0145e803, 0x023b17ac, 0x03d6e5f3, 0x008701cf, 0x004a7dd4, 0x0256ccbe, 0x00d81ab5, 0x01129a7a, 0x00e0809e, 0x0016e138}}, Y: Field{[10]uint32{0x0113d398, 0x00f4fbeb, 0x00243cb4, 0x0303fa4d, 0x017e6109, 0x0390c455, 0x03a1522a, 0x0073b5cb, 0x02d0fa79, 0x00069968}}}, + {X: Field{[10]uint32{0x02dfa672, 0x02993aaf, 0x00ede900, 0x010a4b32, 0x00675ba8, 0x0234ca44, 0x021519a1, 0x0041c51f, 0x016bdd24, 0x003bd0b1}}, Y: Field{[10]uint32{0x03ff75ac, 0x01ef34e2, 0x00e3cc9e, 0x0288c51d, 0x0326a618, 0x02b76fda, 0x01e0c254, 0x0265dd84, 0x03473335, 0x001c0545}}}, + {X: Field{[10]uint32{0x0256eb63, 0x01f04a55, 0x0294c92b, 0x03b21fab, 0x00adc653, 0x02c5056d, 0x026ed003, 0x0129592f, 0x02dcb50d, 0x001237fc}}, Y: Field{[10]uint32{0x01643928, 0x01982063, 0x036b5f0f, 0x00f7dc07, 0x02fa29e6, 0x02feb550, 0x03c59e98, 0x03b3dbc2, 0x03fb53af, 0x002a6fa5}}}, + {X: Field{[10]uint32{0x02e938d4, 0x00793ed2, 0x00337f88, 0x035067f7, 0x00d1923b, 0x008ac263, 0x009a2dfc, 0x0345d043, 0x00f5246a, 0x0019cba4}}, Y: Field{[10]uint32{0x01781f19, 0x028a2e68, 0x02c9e97a, 0x0091585f, 0x02f331b6, 0x00797c27, 0x03e678b3, 0x01b6da20, 0x03801fda, 0x001cff4c}}}, + {X: Field{[10]uint32{0x03315cde, 0x032dd852, 0x03723ee7, 0x008529f2, 0x02dbfe55, 0x01770577, 0x01e094a9, 0x02067242, 0x01b171fb, 0x0016736e}}, Y: Field{[10]uint32{0x008351a2, 0x036c06fa, 0x00a187a6, 0x03679243, 0x017f2d38, 0x00208027, 0x033f8e73, 0x01298fb3, 0x0212670b, 0x000156b0}}}, + {X: Field{[10]uint32{0x012ddb18, 0x004237ab, 0x028f0043, 0x020a3873, 0x006b827f, 0x02666531, 0x00db879b, 0x0162ac4d, 0x010a357a, 0x001738e3}}, Y: Field{[10]uint32{0x0397f716, 0x0285364e, 0x009c1745, 0x019c4227, 0x0394748c, 0x036f3146, 0x0384b33d, 0x0361bb0b, 0x0202d9c1, 0x0017a058}}}, + {X: Field{[10]uint32{0x0398afda, 0x012846d4, 0x028c8282, 0x016b41c4, 0x02c1a74d, 0x02dabe49, 0x0227a940, 0x03eeeec3, 0x016a7466, 0x00326086}}, Y: Field{[10]uint32{0x00901f55, 0x0058df54, 0x006b6f00, 0x00953915, 0x032d8fb9, 0x00704cf6, 0x00e6448a, 0x00e2bee7, 0x01eae644, 0x001ea47e}}}, + {X: Field{[10]uint32{0x039ec818, 0x03d4ca60, 0x03d31725, 0x030a0f20, 0x0360bfbc, 0x01e5b403, 0x0281d297, 0x006fb372, 0x008479e6, 0x000e0f2c}}, Y: Field{[10]uint32{0x01dec91e, 0x028643de, 0x004ffdb1, 0x009ab619, 0x010bbc34, 0x0057cd36, 0x01e04980, 0x0224ce2f, 0x03a24900, 0x0009b89b}}}, + {X: Field{[10]uint32{0x002f612b, 0x03293f44, 0x00550248, 0x026dab21, 0x0328b88c, 0x01200477, 0x0117b524, 0x03c529c6, 0x03312ad4, 0x0039a515}}, Y: Field{[10]uint32{0x0176f53d, 0x030ce193, 0x0089c1b1, 0x01be5c1a, 0x00c81cc8, 0x027ac2d1, 0x03edddac, 0x01c0797a, 0x008251fc, 0x000c3b48}}}, + {X: Field{[10]uint32{0x039976f7, 0x00f131ae, 0x018a7f28, 0x03c893e9, 0x01250809, 0x0098a9ca, 0x02168d21, 0x024d4884, 0x01ba8f79, 0x000b401c}}, Y: Field{[10]uint32{0x031dfd8b, 0x00ac05d7, 0x01b03c87, 0x03c695c2, 0x01ccc118, 0x020001e7, 0x01455440, 0x01cfc45a, 0x01014e48, 0x0033729a}}}, + {X: Field{[10]uint32{0x001e927e, 0x0123c880, 0x017898d7, 0x02c210df, 0x01da35c2, 0x01e61dee, 0x00f35f06, 0x013efe47, 0x005765b7, 0x00320ae5}}, Y: Field{[10]uint32{0x005fd6a2, 0x00f67c81, 0x0133d931, 0x00a8e6c5, 0x03b57a0f, 0x02ab23c1, 0x0057dae9, 0x01aff1f8, 0x01d10bb0, 0x000b9413}}}, + {X: Field{[10]uint32{0x01bbf0a6, 0x02d8ca1d, 0x0022763c, 0x028bece9, 0x012654ed, 0x01cdf746, 0x01135ede, 0x0086a7fb, 0x002e7eac, 0x00270693}}, Y: Field{[10]uint32{0x00e9197f, 0x0023bf84, 0x02e60200, 0x011ba768, 0x0280eb66, 0x02ded681, 0x02c91289, 0x00716089, 0x036c12f7, 0x003cc4d2}}}, + {X: Field{[10]uint32{0x016c9b28, 0x02b09fa3, 0x0353b6a2, 0x00d8b55d, 0x019b170a, 0x0202df3e, 0x00bd645e, 0x00c88bb6, 0x019bbc69, 0x0025c74f}}, Y: Field{[10]uint32{0x01d22e2e, 0x00dbdfe4, 0x0098080a, 0x00cfce16, 0x01e20394, 0x03f17a1b, 0x00a73af7, 0x0370b1b1, 0x009ae296, 0x000358f5}}}, + {X: Field{[10]uint32{0x03917d2b, 0x0200bea2, 0x0023fa67, 0x01eafd6b, 0x01660a31, 0x00186781, 0x0329f2ae, 0x0045448f, 0x027386bc, 0x003d524e}}, Y: Field{[10]uint32{0x01e0f1d7, 0x008c1b99, 0x03e23964, 0x000a004c, 0x0138455e, 0x0109ee2d, 0x0305157b, 0x0014c0ac, 0x00cb8b78, 0x0039ab6f}}}, + {X: Field{[10]uint32{0x01b6e014, 0x00154de6, 0x006dadde, 0x03f502ce, 0x01763244, 0x03af78ab, 0x017a3215, 0x00282b92, 0x023e500e, 0x0020c7c4}}, Y: Field{[10]uint32{0x03221d6c, 0x01c67232, 0x03950f44, 0x002a76da, 0x01ac04af, 0x03bbd7be, 0x02fa508c, 0x0222b154, 0x00622ff5, 0x000d585a}}}, + {X: Field{[10]uint32{0x017cfb35, 0x00a321e2, 0x02975f17, 0x008a63a4, 0x027a338c, 0x03bce175, 0x014c3342, 0x011d30ce, 0x006d0018, 0x0026e338}}, Y: Field{[10]uint32{0x02a40d72, 0x033a8150, 0x0331d712, 0x015e928d, 0x0307ce87, 0x007d4dd1, 0x01a50c4c, 0x00f811f3, 0x0220b8dc, 0x001da500}}}, + {X: Field{[10]uint32{0x03c5b855, 0x004de9cf, 0x027cb1e8, 0x02b437fe, 0x0014f06c, 0x00afcf85, 0x01724104, 0x00af2580, 0x016ba98d, 0x003dc2a4}}, Y: Field{[10]uint32{0x000275a2, 0x023ffeca, 0x0023fff9, 0x02110f10, 0x03b5426d, 0x025ea23c, 0x01a3fbe9, 0x0225bfce, 0x01f470d7, 0x003c6e30}}}, + {X: Field{[10]uint32{0x00763d56, 0x014abeb0, 0x0259992d, 0x0027f653, 0x01a64d69, 0x03d88741, 0x02836612, 0x01ff92ac, 0x03bbc44e, 0x000b4aad}}, Y: Field{[10]uint32{0x015328e8, 0x034cb331, 0x0328ae57, 0x02bcd815, 0x03c5fec8, 0x02d870b4, 0x03e044e8, 0x024721a3, 0x02002a69, 0x0014d143}}}, + {X: Field{[10]uint32{0x00d10005, 0x02e751bd, 0x018f3dc9, 0x03157601, 0x03321ff7, 0x02a44c55, 0x025423f3, 0x025e33a8, 0x02b8c516, 0x00205e37}}, Y: Field{[10]uint32{0x016ff4bc, 0x00efeda3, 0x02bfb598, 0x011a89ad, 0x01f9c001, 0x00d4926f, 0x02e6a282, 0x034c0fd2, 0x032b46c9, 0x0005a9c6}}}, + {X: Field{[10]uint32{0x02b56a64, 0x01a9a48d, 0x0301126e, 0x03285800, 0x0001f700, 0x03756650, 0x02f9c32a, 0x02e9f99f, 0x0376d012, 0x002d1c2e}}, Y: Field{[10]uint32{0x014fd95c, 0x03089c98, 0x03a6927c, 0x020a8bef, 0x031775f0, 0x02349a61, 0x01f36f15, 0x0261861c, 0x03e07d17, 0x003df424}}}, + {X: Field{[10]uint32{0x02de29ce, 0x01c4cff8, 0x03f78fe1, 0x0084736c, 0x01d3a899, 0x003c0850, 0x0348eb33, 0x02b04866, 0x02ba837c, 0x000593ca}}, Y: Field{[10]uint32{0x031d28dc, 0x01d8dd21, 0x011972c0, 0x01419a49, 0x02c2837c, 0x02e08701, 0x01ec79e0, 0x0340d12a, 0x020895f7, 0x000ef015}}}, + {X: Field{[10]uint32{0x02e725f4, 0x027fb144, 0x02283ec5, 0x03aa20f8, 0x01e6a210, 0x0172ee27, 0x012268b3, 0x01b4bbd4, 0x020402a8, 0x0031de8e}}, Y: Field{[10]uint32{0x031cfba2, 0x027bb704, 0x029148dc, 0x03896d27, 0x036d1db4, 0x03b580ac, 0x007e5928, 0x0281ff96, 0x016bedf1, 0x000baf35}}}, + {X: Field{[10]uint32{0x03b11349, 0x02b4cd40, 0x00e9f060, 0x0010368e, 0x0011df55, 0x0071aafa, 0x03a3f1d7, 0x033dc555, 0x03a1f714, 0x00038b7b}}, Y: Field{[10]uint32{0x0045f229, 0x02d516b8, 0x0354bd88, 0x0368ee6a, 0x000c5107, 0x0195f651, 0x001912ea, 0x02ef1cbd, 0x03037a53, 0x0017b590}}}, + {X: Field{[10]uint32{0x02313e3c, 0x004910ed, 0x017b2d21, 0x03a73075, 0x0335280c, 0x0290cc2b, 0x03fca1e5, 0x02793058, 0x02cbb4cd, 0x003b8b44}}, Y: Field{[10]uint32{0x02153262, 0x02488ebb, 0x02f0849f, 0x01bf752e, 0x024057fb, 0x03ffeda5, 0x00ecafab, 0x01f1960e, 0x01c1a437, 0x0038a2c7}}}, + {X: Field{[10]uint32{0x019e28bd, 0x0095b59f, 0x0067c78f, 0x011489c5, 0x01a2109b, 0x016f9f0f, 0x0039c34f, 0x037b2bcf, 0x009673e6, 0x00010e4b}}, Y: Field{[10]uint32{0x00110c50, 0x00aa2180, 0x006fd590, 0x035f43d0, 0x00747d63, 0x010e9aed, 0x009edd53, 0x0094cec1, 0x0183ae35, 0x001ff930}}}, + {X: Field{[10]uint32{0x020d6960, 0x03fcc702, 0x017a6712, 0x02cbe046, 0x020f5586, 0x00023d26, 0x02655f16, 0x01d2b64e, 0x02ee1673, 0x00165cb8}}, Y: Field{[10]uint32{0x037c71d6, 0x037b069b, 0x00847bc3, 0x03f1f024, 0x02779343, 0x0240ef5c, 0x02e485ad, 0x01f1d228, 0x0055d0a5, 0x001b5c3f}}}, + {X: Field{[10]uint32{0x002c78aa, 0x0226bc0c, 0x03c19855, 0x00690038, 0x02a180f3, 0x02795d9a, 0x01f1faa2, 0x000c5622, 0x000afc2c, 0x002a1760}}, Y: Field{[10]uint32{0x017ec85e, 0x022c036e, 0x032a508f, 0x01e94b74, 0x02ff5aca, 0x00a196de, 0x0037b419, 0x01da8291, 0x03f4903c, 0x001d0a75}}}, + {X: Field{[10]uint32{0x01f1c245, 0x0215a7e9, 0x01cdc954, 0x00e1c9d6, 0x02ccee3f, 0x035418e1, 0x009e85d7, 0x013f326a, 0x030f0d59, 0x003260da}}, Y: Field{[10]uint32{0x0094fac0, 0x02dc20b4, 0x031ed943, 0x03166ed0, 0x03bed1c2, 0x035c59c9, 0x01a7d06f, 0x03fb58bc, 0x012693b7, 0x0027c2c6}}}, + {X: Field{[10]uint32{0x0202bd3b, 0x032b9ff4, 0x0222b588, 0x0106b991, 0x0375f2c4, 0x03658c64, 0x0348e5f6, 0x01195340, 0x00fdb2b8, 0x00328861}}, Y: Field{[10]uint32{0x026a4de9, 0x013c3f5c, 0x0162683c, 0x03207d9c, 0x01e2563c, 0x03a5ca6e, 0x013dbb2f, 0x01eab012, 0x00203d65, 0x0034488a}}}, + {X: Field{[10]uint32{0x02941fd8, 0x00b9814d, 0x0066b44a, 0x03331e93, 0x02b5dea0, 0x00181755, 0x03627048, 0x02599021, 0x01c63c9b, 0x00278145}}, Y: Field{[10]uint32{0x00be831a, 0x02c87255, 0x01e506d4, 0x018845fb, 0x0295f0b7, 0x036e8187, 0x02f789e2, 0x00b61abf, 0x0224a2eb, 0x000a778c}}}, + {X: Field{[10]uint32{0x035dc1cc, 0x023c002b, 0x02f6053a, 0x03694759, 0x018a3447, 0x0297cf5e, 0x022cf7af, 0x00e9fc30, 0x00253320, 0x0010810b}}, Y: Field{[10]uint32{0x01e6c05a, 0x022369fd, 0x03d9dff6, 0x007587dc, 0x03c54f3c, 0x02f04f44, 0x01420d50, 0x00e1c8c5, 0x027a6d6c, 0x003c1d69}}}, + {X: Field{[10]uint32{0x02295b96, 0x0259f1c4, 0x031bccd3, 0x032a6b90, 0x023f5a68, 0x0222557f, 0x0084ffd2, 0x000af916, 0x01bd4eab, 0x00199168}}, Y: Field{[10]uint32{0x0384cfad, 0x033344ae, 0x00b6730c, 0x01949014, 0x00bf9028, 0x003a4b13, 0x02d4b30f, 0x013b50a3, 0x01f91d26, 0x0008c7de}}}, + {X: Field{[10]uint32{0x00b32f9f, 0x0347ba35, 0x0075f30b, 0x02a21c3d, 0x036898f3, 0x0161f78d, 0x01482ab1, 0x01ba208c, 0x026d2c31, 0x00138a07}}, Y: Field{[10]uint32{0x0065602c, 0x03dd6070, 0x0091011e, 0x0357cdf9, 0x02c3f708, 0x03770d05, 0x0378062c, 0x027b7797, 0x01c81c11, 0x003d232b}}}, + {X: Field{[10]uint32{0x02af5136, 0x0153bc12, 0x00e02fcd, 0x034f90cb, 0x034fbaf7, 0x01e99880, 0x03c7ffbc, 0x007a7fc4, 0x001496e4, 0x001dc8d9}}, Y: Field{[10]uint32{0x002dd218, 0x020c1d09, 0x0328c800, 0x028195fc, 0x0398bec7, 0x00003da5, 0x00b4bf29, 0x03007bed, 0x01740d6c, 0x00088b80}}}, + {X: Field{[10]uint32{0x01d45860, 0x00765dc3, 0x02bddaf3, 0x027fded7, 0x0018ab00, 0x00488610, 0x026070cb, 0x01e166b6, 0x004c8d46, 0x000fcadc}}, Y: Field{[10]uint32{0x034dd88a, 0x03ebaa0e, 0x02a9fb59, 0x022ff417, 0x03e2b6ab, 0x035868b7, 0x038dd215, 0x03ad7a30, 0x03a5146a, 0x00291c59}}}, + {X: Field{[10]uint32{0x00ad4146, 0x02e7a4bb, 0x01b51640, 0x0342b931, 0x0384b3ac, 0x017e60f6, 0x03b70f03, 0x036044ba, 0x0130d243, 0x001e53b0}}, Y: Field{[10]uint32{0x007be84d, 0x01ddeab4, 0x01e71c80, 0x03576303, 0x00658f2d, 0x00debbd7, 0x00a537f9, 0x0171f3bb, 0x00be95c2, 0x00127b7b}}}, + {X: Field{[10]uint32{0x01a96aa3, 0x03258525, 0x023ba808, 0x0335ba7f, 0x0149c554, 0x01ec702c, 0x0304cf4a, 0x0384ade6, 0x01ece363, 0x001d43fe}}, Y: Field{[10]uint32{0x021d59a9, 0x00540bde, 0x02dfb2de, 0x02fc7931, 0x022d4474, 0x028182d0, 0x0270f149, 0x028fb7d3, 0x029dd1c5, 0x00168a09}}}, + {X: Field{[10]uint32{0x026272cf, 0x017ecaad, 0x00169633, 0x00b26dfd, 0x02263b08, 0x0344a518, 0x02c9ec1f, 0x01a3b2e5, 0x01d7df66, 0x00359701}}, Y: Field{[10]uint32{0x02188839, 0x02e93c37, 0x03c37891, 0x0019acbd, 0x017e48be, 0x031dff6b, 0x02cc5b7f, 0x0350b490, 0x00c51c10, 0x00035dca}}}, + {X: Field{[10]uint32{0x015190c3, 0x016fbd56, 0x012f6122, 0x00e5ca8f, 0x02aecffe, 0x036e685c, 0x039d2700, 0x03a7a6d6, 0x00b68cb2, 0x0034e013}}, Y: Field{[10]uint32{0x01e30d5e, 0x03091c6d, 0x01613482, 0x00f9bfc3, 0x00287902, 0x01814d0a, 0x02f41314, 0x01922cc2, 0x010c9568, 0x00047ecd}}}, + {X: Field{[10]uint32{0x00351bf6, 0x03a7a11c, 0x01b3db34, 0x0104441b, 0x036a9382, 0x03b3e34d, 0x0095c619, 0x00d27db3, 0x022635c6, 0x003dd8b7}}, Y: Field{[10]uint32{0x009fd814, 0x03702eaf, 0x0010b1ca, 0x00b4fa21, 0x000ccfe2, 0x026444b9, 0x013352da, 0x003e7b9d, 0x01e0c8a5, 0x003719fe}}}, + {X: Field{[10]uint32{0x03b87a71, 0x0395d9d4, 0x00e7dac5, 0x03baea1f, 0x03d7dcec, 0x005f8e49, 0x02e163ed, 0x03fd2c5f, 0x00bfa827, 0x002ac62d}}, Y: Field{[10]uint32{0x030da919, 0x03aa6e4a, 0x01ed5b57, 0x00734ac7, 0x0229706d, 0x01341fdc, 0x002bc09c, 0x00249b22, 0x03d573e4, 0x001b6e0e}}}, + {X: Field{[10]uint32{0x0198c95e, 0x0199a540, 0x02d8bf5c, 0x02b63d8e, 0x02b12478, 0x0116588a, 0x0343a870, 0x006ba368, 0x0248fec2, 0x003dd530}}, Y: Field{[10]uint32{0x0052b1bd, 0x009e6498, 0x02e5293b, 0x01e8caee, 0x00e056ca, 0x03d511dd, 0x008d8e67, 0x021ddae1, 0x02a25f9c, 0x000b3edd}}}, + {X: Field{[10]uint32{0x0246c51c, 0x018b53e6, 0x008e2c24, 0x030c4d07, 0x02103516, 0x005af285, 0x013ecdb7, 0x001e63e2, 0x033e3c3f, 0x003e3651}}, Y: Field{[10]uint32{0x03924e02, 0x016fa4b5, 0x006869e0, 0x00ef846d, 0x015c53bd, 0x01d51e0d, 0x03314dac, 0x03f8e89a, 0x025fa422, 0x00157c01}}}, + {X: Field{[10]uint32{0x014eb741, 0x0341435d, 0x00395352, 0x02d2fef1, 0x012f7c5a, 0x02ca7f6a, 0x035fa225, 0x032f2269, 0x0142d294, 0x000218e6}}, Y: Field{[10]uint32{0x03d11e4d, 0x02762a79, 0x01c29677, 0x020d32e0, 0x03741da8, 0x02cfb5f3, 0x0179abdd, 0x038d68db, 0x022a445d, 0x000e44fa}}}, + {X: Field{[10]uint32{0x0395d5c2, 0x03469e2e, 0x02c61794, 0x020820eb, 0x02068572, 0x0169c6d2, 0x0319230b, 0x00e22fc5, 0x006c706a, 0x000a9623}}, Y: Field{[10]uint32{0x00c47592, 0x010b12db, 0x01b00968, 0x02bafeec, 0x0361f458, 0x01f847e5, 0x007f07ea, 0x03db6590, 0x01771a56, 0x002bc97b}}}, + {X: Field{[10]uint32{0x020a0cb6, 0x03a35500, 0x01fe337e, 0x005c08b8, 0x00a54597, 0x02697b6c, 0x02dba4ad, 0x02e6a2c9, 0x01ee8931, 0x0004def4}}, Y: Field{[10]uint32{0x03ceea62, 0x01228c05, 0x00b7ff58, 0x01788455, 0x01eaea10, 0x021f5da8, 0x03e9f0ee, 0x031df49c, 0x037b8197, 0x00337a7e}}}, + {X: Field{[10]uint32{0x02de2bbf, 0x02ef8cb4, 0x03b48d21, 0x03aa8782, 0x020f9b5f, 0x00ebcb0a, 0x01523711, 0x00c4f25c, 0x0345c686, 0x00119600}}, Y: Field{[10]uint32{0x0092ef64, 0x02a3ba7b, 0x030510a3, 0x023a85ae, 0x027edade, 0x019bd30a, 0x03bc79db, 0x027fecaf, 0x017bb632, 0x001d6f17}}}, + {X: Field{[10]uint32{0x011bd233, 0x017bd90e, 0x02a8556d, 0x03586ca0, 0x0102ef93, 0x009abd51, 0x02fc491c, 0x016b3660, 0x0252afaf, 0x00128524}}, Y: Field{[10]uint32{0x00cfe285, 0x00f5e3d8, 0x0259a3b5, 0x03f16897, 0x03bb9e83, 0x018fd752, 0x0256ea38, 0x016d8259, 0x00bc10b5, 0x003ef040}}}, + {X: Field{[10]uint32{0x01a01f18, 0x03e4bc85, 0x013faad0, 0x0225f65d, 0x0395bdf0, 0x011d7592, 0x00251313, 0x033e3c38, 0x01a6fc0b, 0x002253af}}, Y: Field{[10]uint32{0x035ec056, 0x0389b3d7, 0x003779fa, 0x000b8a65, 0x001e4ede, 0x01f4deb8, 0x01d02519, 0x01cb3f1a, 0x01501557, 0x002c97cc}}}, + {X: Field{[10]uint32{0x01eb032e, 0x029bab91, 0x0285a3c2, 0x029be796, 0x002deedc, 0x03f5c82b, 0x01ef1b2b, 0x02e244c3, 0x02930a91, 0x0039c362}}, Y: Field{[10]uint32{0x00d9f9cc, 0x03f7c453, 0x01b0a693, 0x02061e28, 0x02fe1026, 0x024472c0, 0x03b96ea4, 0x03fdad17, 0x0253a3b0, 0x002f4ebb}}}, + {X: Field{[10]uint32{0x02b36852, 0x0117eed3, 0x0047eeb2, 0x00fc4d75, 0x02118988, 0x02551ada, 0x016765bf, 0x02c77528, 0x01c3e5cc, 0x001f2c7f}}, Y: Field{[10]uint32{0x03ca582d, 0x0238b2a3, 0x014e0196, 0x0022a3fb, 0x00d18890, 0x0176fc96, 0x00edbe17, 0x017fdee0, 0x00d6becf, 0x000243b8}}}, + {X: Field{[10]uint32{0x03b9bfc1, 0x02fef0a1, 0x00685bf9, 0x0340c484, 0x00b39f57, 0x00cae416, 0x0090a214, 0x03685e3f, 0x02d80331, 0x001449e2}}, Y: Field{[10]uint32{0x03a66b6f, 0x03773a74, 0x00040536, 0x0387dd6f, 0x017bc1f9, 0x00976cf9, 0x03ad759b, 0x0399e230, 0x0147f39c, 0x00016abd}}}, + {X: Field{[10]uint32{0x00f59cdd, 0x03a64115, 0x036cee9f, 0x00215389, 0x030fee50, 0x00bf3c3c, 0x03563082, 0x00c1a122, 0x021fc52b, 0x003c3baa}}, Y: Field{[10]uint32{0x02124f02, 0x02ecb27c, 0x02e63ab3, 0x03ea0460, 0x00d51cf7, 0x02befacc, 0x01e5e016, 0x01c2f7ad, 0x009b944d, 0x000243fe}}}, + {X: Field{[10]uint32{0x03aeea71, 0x0376dac0, 0x01df6648, 0x02bc94ad, 0x00df5b4c, 0x01ed4700, 0x03670c22, 0x003f4984, 0x03f28bf9, 0x000dbf26}}, Y: Field{[10]uint32{0x03836683, 0x0038e8f9, 0x0075e13d, 0x031a7f64, 0x03d975ec, 0x0376eef9, 0x02c81614, 0x01b0a181, 0x0076f1ac, 0x00221f0e}}}, + {X: Field{[10]uint32{0x0391b68b, 0x037caa26, 0x03acdba4, 0x02757996, 0x02135c54, 0x030a7d8b, 0x00d2d041, 0x010db385, 0x026b0cf9, 0x001b8c78}}, Y: Field{[10]uint32{0x00d0e7ae, 0x0258622b, 0x01a85858, 0x021f426a, 0x0194c1af, 0x029de2cc, 0x037d9f77, 0x02f6aad7, 0x02849e63, 0x00008e25}}}, + {X: Field{[10]uint32{0x0198e864, 0x02499c87, 0x02eac357, 0x03613dd0, 0x003da9fa, 0x02b4cea8, 0x02a8a1ce, 0x030afeb1, 0x0249a4b1, 0x00314111}}, Y: Field{[10]uint32{0x03a1027b, 0x02c80769, 0x000af537, 0x0136e350, 0x0345fdc8, 0x0330450e, 0x03d13270, 0x025aedc5, 0x02d283e6, 0x001b4980}}}, + {X: Field{[10]uint32{0x0299ca28, 0x02013b1a, 0x011e6eca, 0x01331148, 0x03b9b2e8, 0x016801ee, 0x028e963b, 0x011356f6, 0x0271f13c, 0x0002a4cf}}, Y: Field{[10]uint32{0x02200faa, 0x003d967d, 0x014f5c1c, 0x01e55084, 0x00c3ce02, 0x00750bf7, 0x01712073, 0x038bdb99, 0x03bcec45, 0x0024c6fc}}}, + {X: Field{[10]uint32{0x00e4a58b, 0x037d977e, 0x021aa83a, 0x0342c4ca, 0x030b8559, 0x0045c0e2, 0x0298884e, 0x00b5886e, 0x021d840c, 0x002400fd}}, Y: Field{[10]uint32{0x00d30895, 0x03d5b73a, 0x01532b67, 0x02b1cd8c, 0x001388a1, 0x02e89a15, 0x02b7ecec, 0x00e54a7f, 0x0124f72b, 0x001431d4}}}, + {X: Field{[10]uint32{0x02a0a886, 0x02df0df2, 0x022c533f, 0x02a7a7cf, 0x02914e21, 0x005ca069, 0x038abdfc, 0x01c33218, 0x00183cb3, 0x003f201f}}, Y: Field{[10]uint32{0x00af00ba, 0x009286fa, 0x02cdee9d, 0x0341ae34, 0x021ccf6f, 0x03559095, 0x02f72639, 0x00756ea6, 0x013e75ac, 0x000eb1e7}}}, + {X: Field{[10]uint32{0x03ee9cbd, 0x024f33b7, 0x033c1862, 0x02b9f901, 0x03cd780d, 0x0142f352, 0x03b608f1, 0x02b08ed0, 0x02e4aca4, 0x000f41ca}}, Y: Field{[10]uint32{0x0265d9b6, 0x0355749f, 0x0385792f, 0x00519f68, 0x03f9c604, 0x00235d89, 0x00fc5630, 0x0327e2a6, 0x0043f721, 0x0001b679}}}, + {X: Field{[10]uint32{0x03f80dc0, 0x02aaf669, 0x01d3d106, 0x02f1eb2c, 0x03ba6e26, 0x008bebe2, 0x03c5eed5, 0x02d29f4a, 0x01947061, 0x003432e1}}, Y: Field{[10]uint32{0x03012e0a, 0x00e791de, 0x0092c9b7, 0x03c507c2, 0x038d7562, 0x006a61da, 0x0107b82d, 0x03730680, 0x0326e9d0, 0x003eff43}}}, + {X: Field{[10]uint32{0x035bc9fd, 0x01b496d8, 0x02e3241a, 0x02b090b3, 0x00267aad, 0x01c88730, 0x019f46cc, 0x03191079, 0x00ab6416, 0x00393b70}}, Y: Field{[10]uint32{0x03cdc71e, 0x0307f0d3, 0x02964b84, 0x01382ec1, 0x01c496fd, 0x020201f4, 0x00344829, 0x02d31012, 0x02e9cea7, 0x003d070e}}}, + {X: Field{[10]uint32{0x017eb4b2, 0x034caaf7, 0x01271557, 0x01046c2d, 0x02ffb806, 0x012f83d7, 0x01a83c88, 0x0244063d, 0x010b2d3d, 0x00188ced}}, Y: Field{[10]uint32{0x015dbcc5, 0x007bc661, 0x00399791, 0x00af7690, 0x01034a3a, 0x00a1622c, 0x030f21e3, 0x00ab095d, 0x0124ffdd, 0x00237eab}}}, + {X: Field{[10]uint32{0x02a19ab5, 0x012df714, 0x015df943, 0x017af78a, 0x03c427e6, 0x03a607da, 0x034e5447, 0x0197889e, 0x0162e272, 0x001b2800}}, Y: Field{[10]uint32{0x0154cce1, 0x015f9944, 0x03a5ce0f, 0x00583854, 0x03223e89, 0x02aece81, 0x03fe297b, 0x009f8290, 0x0363a8f2, 0x0034cfd7}}}, + {X: Field{[10]uint32{0x02fefcfc, 0x02199b8d, 0x005b3cd6, 0x024a2d84, 0x02d6c9d9, 0x0339f2c5, 0x01328ae7, 0x02357703, 0x01aa5d2a, 0x00300481}}, Y: Field{[10]uint32{0x02831d3e, 0x00061643, 0x03b453ad, 0x02affea6, 0x02cf2988, 0x02be2e9f, 0x03d6f6f6, 0x02025786, 0x0399c4f4, 0x002d9797}}}, + {X: Field{[10]uint32{0x02e0e155, 0x02de34b6, 0x00abb4e0, 0x025d29b1, 0x0107b8a5, 0x020143ce, 0x016fb195, 0x01a32d87, 0x03930e62, 0x0038e594}}, Y: Field{[10]uint32{0x00731737, 0x00a26fe0, 0x00828a2f, 0x02973683, 0x003f971f, 0x014e0ecb, 0x00048928, 0x03876460, 0x01462ed6, 0x0007de2b}}}, + {X: Field{[10]uint32{0x00b099ce, 0x0120889b, 0x004f8012, 0x03e142f6, 0x013dc03a, 0x03f6643f, 0x010c1a69, 0x02750c01, 0x00f3702a, 0x0009eff4}}, Y: Field{[10]uint32{0x00643de8, 0x0306c72f, 0x00f390fe, 0x03c36425, 0x00c49fd3, 0x0102f9f0, 0x030c0bce, 0x02baf466, 0x0360e8ca, 0x0008b85a}}}, + {X: Field{[10]uint32{0x0396a2f0, 0x0020281b, 0x023c6cbf, 0x00b1bdd7, 0x012a3717, 0x00a65ea2, 0x02c17771, 0x0255967b, 0x03c02331, 0x0020843e}}, Y: Field{[10]uint32{0x02afee8d, 0x03aa4791, 0x0109716d, 0x0095b469, 0x03bfacbb, 0x01787bac, 0x011d5528, 0x019b2eec, 0x03921011, 0x0007775d}}}, + {X: Field{[10]uint32{0x02347b5e, 0x034869d3, 0x03ab089c, 0x0197e2fb, 0x00ae4d50, 0x0178bfe0, 0x015298a2, 0x02f6037c, 0x02b65fcb, 0x00057319}}, Y: Field{[10]uint32{0x03937c97, 0x02b34c81, 0x0334b6dd, 0x00d1223e, 0x007b225b, 0x01585b4a, 0x03324c9f, 0x020a5b7a, 0x03e93574, 0x002512d1}}}, + {X: Field{[10]uint32{0x00c97976, 0x0006b825, 0x02c4bff8, 0x03f1c9b0, 0x02c7bb08, 0x0279b0d7, 0x021a482a, 0x0005a47a, 0x02a24596, 0x003adede}}, Y: Field{[10]uint32{0x02d1b1f6, 0x008fe08b, 0x003f227c, 0x01380413, 0x02f5596f, 0x00fc195a, 0x03d20e90, 0x01de47f2, 0x0170cc18, 0x00134ba5}}}, + {X: Field{[10]uint32{0x029ba12c, 0x0039f7d7, 0x01ea15fb, 0x001ad029, 0x0118e7c1, 0x025aa11a, 0x02436e09, 0x03a11308, 0x02fced29, 0x0011663e}}, Y: Field{[10]uint32{0x035e6093, 0x0388a3fc, 0x016297dc, 0x015796c2, 0x01978a85, 0x03dc5982, 0x0379dfe7, 0x03a8b0e5, 0x02b6d292, 0x0039cf65}}}, + {X: Field{[10]uint32{0x028600f7, 0x01fbacc6, 0x007058e3, 0x03f06443, 0x00e57d4d, 0x01be4386, 0x02a25917, 0x0396515c, 0x02863612, 0x001260d6}}, Y: Field{[10]uint32{0x03cfa531, 0x003b4df7, 0x017b9825, 0x028b9223, 0x02464c08, 0x003a034d, 0x023b147e, 0x00b30730, 0x013a0fbd, 0x0000edd8}}}, + {X: Field{[10]uint32{0x02335351, 0x0245bdf3, 0x005b9965, 0x02df464c, 0x033cbfe0, 0x0136f70c, 0x023177b0, 0x02019cca, 0x03ed1fcc, 0x000e9b5b}}, Y: Field{[10]uint32{0x026624ea, 0x021a4956, 0x01d0df29, 0x01586f47, 0x0111eb2b, 0x01fc4190, 0x00a6706d, 0x0185fc52, 0x018a314d, 0x00330fcf}}}, + {X: Field{[10]uint32{0x02d7a9f5, 0x035b1ece, 0x02a78fb0, 0x0093b9ee, 0x00f672a0, 0x0080d6dd, 0x012d2efb, 0x03f8c33a, 0x01866860, 0x00084821}}, Y: Field{[10]uint32{0x00bebbb7, 0x01d2825e, 0x01d7ce10, 0x038d07c9, 0x0396ff0c, 0x03dba75c, 0x02e8be11, 0x02c7b0ff, 0x01be0051, 0x002abc51}}}, + {X: Field{[10]uint32{0x026e4e06, 0x03681349, 0x03cc867c, 0x0209b3bf, 0x01833ac0, 0x0072c46e, 0x03d609c5, 0x00bc2598, 0x032ac9bb, 0x003e0644}}, Y: Field{[10]uint32{0x00891de5, 0x009c8e53, 0x02bb37e2, 0x03bdd91a, 0x00c52f48, 0x01012bbb, 0x03fd1a06, 0x00c172ab, 0x0238ec6a, 0x002c7f79}}}, + {X: Field{[10]uint32{0x02ec009d, 0x02a50df0, 0x00428423, 0x028484f1, 0x01168385, 0x02bb58b6, 0x0334d720, 0x0190310d, 0x01d88786, 0x0014db01}}, Y: Field{[10]uint32{0x036df0d5, 0x0224c976, 0x02f134b4, 0x03b87ea7, 0x01fd84dd, 0x020e8231, 0x03c2b43c, 0x037861a2, 0x0100d827, 0x001fd2f8}}}, + {X: Field{[10]uint32{0x01df722b, 0x02dceea8, 0x024bd650, 0x02c68e68, 0x0109de2f, 0x00b22a16, 0x02e3ed34, 0x036dd8df, 0x023ec4c6, 0x0010ca04}}, Y: Field{[10]uint32{0x03a40857, 0x0275fa58, 0x01b1594c, 0x00403d75, 0x014ee11f, 0x02d3e1bd, 0x0222fa71, 0x01dd4f9a, 0x02ea0127, 0x00207000}}}, + {X: Field{[10]uint32{0x012a5f17, 0x00369a04, 0x01a08155, 0x00cb543a, 0x016a85fc, 0x003e6170, 0x029e5360, 0x0265461a, 0x02fef852, 0x003cf855}}, Y: Field{[10]uint32{0x008892d2, 0x037426ad, 0x010915d5, 0x0339d063, 0x03a2f441, 0x00d8ae14, 0x0167e83c, 0x0039bd97, 0x026b56ff, 0x00247ff5}}}, + {X: Field{[10]uint32{0x03456cc9, 0x00aa3622, 0x030e6824, 0x02bfabc0, 0x006645a1, 0x0153102b, 0x028a716a, 0x00fd0b4b, 0x035984e1, 0x000cae9c}}, Y: Field{[10]uint32{0x00b4c6f5, 0x022c60ef, 0x02200f86, 0x017279f9, 0x03f05576, 0x03bc9324, 0x02ab3178, 0x02c542a0, 0x031e1c32, 0x0019fff3}}}, + {X: Field{[10]uint32{0x01829311, 0x02f02b16, 0x03dddcca, 0x024c62ae, 0x029c868b, 0x01362d2a, 0x00674cf6, 0x00417946, 0x033a043d, 0x0032e70a}}, Y: Field{[10]uint32{0x002b691f, 0x0181fba1, 0x015db242, 0x017ef4af, 0x01834bea, 0x02721674, 0x013ac479, 0x001daf7b, 0x02f2233f, 0x0007f19f}}}, + {X: Field{[10]uint32{0x029234f0, 0x028c6f4b, 0x01e856ef, 0x015eaf06, 0x035effa9, 0x0026f34e, 0x0349695e, 0x01c1c0c8, 0x0058b7bf, 0x003853ca}}, Y: Field{[10]uint32{0x00e08bdb, 0x03457937, 0x01761f3c, 0x00352a25, 0x02cf8cbf, 0x00357fc1, 0x03cbc258, 0x03f4e620, 0x009dd3f3, 0x000f8139}}}, + {X: Field{[10]uint32{0x03550d82, 0x02dce221, 0x01e010d7, 0x03b16102, 0x0274810d, 0x025ffc09, 0x0078113c, 0x02e38c33, 0x037b1c27, 0x00055afa}}, Y: Field{[10]uint32{0x00bc5371, 0x009ea464, 0x0017b16e, 0x0318305b, 0x013a8e92, 0x0164e664, 0x02adf2fd, 0x01bb20d4, 0x030a8021, 0x0031c45c}}}, + {X: Field{[10]uint32{0x0055d600, 0x0262d6cb, 0x013557b7, 0x0267e00e, 0x01a24a33, 0x028b76a8, 0x000e4959, 0x01a1912e, 0x03e6b9b4, 0x003797a9}}, Y: Field{[10]uint32{0x00d48ee8, 0x00f18563, 0x037d53a0, 0x019c8adf, 0x02b9b1de, 0x0060b354, 0x00a9d24e, 0x008f4b70, 0x0027e6a8, 0x00224068}}}, + {X: Field{[10]uint32{0x0017c3c7, 0x02e78ffb, 0x01adeb79, 0x005284a0, 0x00aea074, 0x02cafc3b, 0x037312e7, 0x03b51896, 0x03688bfa, 0x0023b774}}, Y: Field{[10]uint32{0x0155da7b, 0x03b6db1e, 0x032316d8, 0x02c5713d, 0x0359b885, 0x0088f95e, 0x00a48a89, 0x0074d357, 0x02f92617, 0x000b6d0e}}}, + {X: Field{[10]uint32{0x00b1d4e3, 0x02b4f5fc, 0x02b85fb2, 0x003fbe57, 0x0187872e, 0x0088dfb6, 0x02489ae2, 0x03477a3e, 0x036a665a, 0x001725c6}}, Y: Field{[10]uint32{0x038b1f66, 0x031a4e97, 0x039a6c4f, 0x01ecc0b4, 0x01aa8d4d, 0x00ae8076, 0x0332ff74, 0x02bdbc2b, 0x019837c2, 0x00135c7d}}}, + {X: Field{[10]uint32{0x02b9e228, 0x03edc291, 0x0076885c, 0x03bcd095, 0x01bd3586, 0x00aa3c73, 0x0366589a, 0x00adab56, 0x013c2821, 0x003b7ec9}}, Y: Field{[10]uint32{0x02616c00, 0x02ca892c, 0x00c1d7f7, 0x0380944d, 0x02594e42, 0x03cc18a4, 0x00b26b84, 0x007da6e3, 0x0208b7e8, 0x000f96d9}}}, + {X: Field{[10]uint32{0x01525c13, 0x0315adf7, 0x03384737, 0x031acb19, 0x03d2373c, 0x00895d2e, 0x0163dd4e, 0x01dcb36c, 0x024ae127, 0x0010e57c}}, Y: Field{[10]uint32{0x00103526, 0x02f99304, 0x0047a819, 0x037006d1, 0x00676581, 0x03dce55d, 0x0096913d, 0x0030b192, 0x03254c80, 0x002eb1b9}}}, + {X: Field{[10]uint32{0x006866f5, 0x03c3fc65, 0x023eb182, 0x014d7d8a, 0x038c7823, 0x017d6a1f, 0x0113b64b, 0x019adfe2, 0x02d573a7, 0x00204402}}, Y: Field{[10]uint32{0x01a00c73, 0x02d05c3a, 0x029c9d28, 0x02ea61c2, 0x01c6afb8, 0x01477675, 0x0068f7d0, 0x00226674, 0x016e325b, 0x0014b2b0}}}, + {X: Field{[10]uint32{0x0395120f, 0x008d1efa, 0x02e407f7, 0x017b9777, 0x01dee3a0, 0x0285085b, 0x02358c3a, 0x020519ab, 0x01514116, 0x003f4e81}}, Y: Field{[10]uint32{0x028ee5b7, 0x01ef34f6, 0x03250e4c, 0x001d6339, 0x0011a3c6, 0x01f812c8, 0x01b7b88b, 0x02c4aae2, 0x030d45ce, 0x000abcbc}}}, + {X: Field{[10]uint32{0x02435ff9, 0x03f0fbf9, 0x018fa4e3, 0x00caaf46, 0x0276d1a0, 0x0285f5b0, 0x0305b6df, 0x03bbe8ff, 0x0358a7ec, 0x0005e956}}, Y: Field{[10]uint32{0x01574d4f, 0x026fdc6e, 0x02240bc9, 0x02915f81, 0x02418f35, 0x01c7c14d, 0x01cee72e, 0x019f043f, 0x0158a3ad, 0x0035c9ce}}}, + {X: Field{[10]uint32{0x03789b6d, 0x02d0224e, 0x0003bc49, 0x00157b5c, 0x02793fd0, 0x0057a2c8, 0x01c73aee, 0x017a8231, 0x03b8e2ca, 0x0021c32d}}, Y: Field{[10]uint32{0x03e67aa3, 0x003b8106, 0x01cc6a7b, 0x03b2b542, 0x0104badb, 0x0089912a, 0x017a9bce, 0x0072bc9b, 0x03407b70, 0x0030cf22}}}, + {X: Field{[10]uint32{0x0271f8a7, 0x00b306d3, 0x00897545, 0x00db6039, 0x03ffbf7c, 0x01432829, 0x0053c89a, 0x03bc02b7, 0x01fcdc46, 0x003e5471}}, Y: Field{[10]uint32{0x0392c95f, 0x0081ce31, 0x02648751, 0x02495e4b, 0x01c1705b, 0x0137e796, 0x0064d7d2, 0x033090c2, 0x00217849, 0x001ab8be}}}, + {X: Field{[10]uint32{0x02a0caf1, 0x01240b25, 0x02d6131e, 0x00a858df, 0x036cbd83, 0x0062b68f, 0x011bb06a, 0x0319dab8, 0x037f3b92, 0x002bae01}}, Y: Field{[10]uint32{0x03cc1e35, 0x00cb87ab, 0x00cfde02, 0x01f42cdf, 0x036c8a6d, 0x02fcc5ff, 0x0275fb98, 0x0290c253, 0x011df5d4, 0x000a7d07}}}, + {X: Field{[10]uint32{0x013b78f9, 0x0080d7cc, 0x0260cb9d, 0x022d6577, 0x038482b7, 0x036161f0, 0x0118a7e5, 0x00b9601b, 0x01975d2f, 0x00351bd3}}, Y: Field{[10]uint32{0x006392f0, 0x00d246ba, 0x0233c105, 0x02650c5b, 0x02f704e1, 0x00c7fb90, 0x02154ef0, 0x0045d8e5, 0x01aa3bdc, 0x002575e0}}}, + {X: Field{[10]uint32{0x0229b201, 0x0297c71e, 0x02eaf4f3, 0x025dcf1d, 0x03af810b, 0x0126e7b0, 0x021b54ac, 0x03627cb8, 0x03444b4b, 0x00001abe}}, Y: Field{[10]uint32{0x02bf932f, 0x0186089b, 0x0334eaf0, 0x00342fb4, 0x0364db46, 0x00e22acd, 0x00ed90d1, 0x02d3384d, 0x001fd7d3, 0x000d40a4}}}, + {X: Field{[10]uint32{0x03d86976, 0x00bdfb7a, 0x00394093, 0x01533ebe, 0x01e66349, 0x0161ebd7, 0x03f60869, 0x005c0e9e, 0x0182a38b, 0x0017c0b9}}, Y: Field{[10]uint32{0x017afec2, 0x01a8014b, 0x00a7def4, 0x00328ada, 0x02ccfa5d, 0x0102e3f8, 0x00b06bf7, 0x029e5ac9, 0x00de92f3, 0x0028121f}}}, + {X: Field{[10]uint32{0x020599fe, 0x014b4e82, 0x02e33c66, 0x01d67155, 0x03ad70eb, 0x00d5199f, 0x007b885f, 0x00b3b568, 0x00826043, 0x0009909d}}, Y: Field{[10]uint32{0x0028ce85, 0x03e163ae, 0x00c62949, 0x033db811, 0x03a63867, 0x00d0114e, 0x02ea7379, 0x00e0bf5d, 0x00fe2560, 0x0004648e}}}, + {X: Field{[10]uint32{0x029f91dc, 0x01999811, 0x037ff2cd, 0x029f8796, 0x014f03a5, 0x017a0dfb, 0x0319a7dd, 0x02b7694a, 0x025ad327, 0x001aca8f}}, Y: Field{[10]uint32{0x0254c6d9, 0x0012f3a2, 0x0257a22f, 0x0197a35f, 0x01354ed2, 0x036a7a51, 0x03365601, 0x020be83c, 0x012606b4, 0x000be7d1}}}, + {X: Field{[10]uint32{0x035daa79, 0x000d1710, 0x03dc4fcc, 0x01df5d25, 0x02e5fbaf, 0x03bc4fa2, 0x010934dd, 0x013eeaac, 0x008b7e21, 0x0009622e}}, Y: Field{[10]uint32{0x01435bbf, 0x02f04531, 0x035e151e, 0x013eb2e8, 0x0261ca64, 0x03c69476, 0x03f142ce, 0x01b53235, 0x010bd3ba, 0x000f973e}}}, + {X: Field{[10]uint32{0x02551a93, 0x0173fe77, 0x03fcbcff, 0x011b0830, 0x02e4e3d8, 0x02805012, 0x00178b40, 0x00bbbfea, 0x01469285, 0x00365210}}, Y: Field{[10]uint32{0x02a6d5a4, 0x020962e5, 0x024ccdbb, 0x02f65a61, 0x0213ea0a, 0x02b66618, 0x00a12196, 0x03109d0d, 0x017fe628, 0x00356c3f}}}, + {X: Field{[10]uint32{0x030de2ff, 0x02713a8e, 0x025eb9fe, 0x01e19f3b, 0x005ccc1e, 0x02dbd1d5, 0x0364b1c9, 0x00821c32, 0x03dc3a2f, 0x00173e07}}, Y: Field{[10]uint32{0x01bc0d7d, 0x023ee305, 0x031131b7, 0x0094036b, 0x01e7ff31, 0x03b1cd1c, 0x01dc7005, 0x023977df, 0x031cf6bb, 0x00382c2a}}}, + {X: Field{[10]uint32{0x03e879a7, 0x01999836, 0x023203b8, 0x01c459de, 0x00f8ed24, 0x004cb1a5, 0x00b3f174, 0x03f6d5c1, 0x037eb719, 0x00106d3b}}, Y: Field{[10]uint32{0x0221c85f, 0x0024ee0d, 0x0081ae12, 0x02a8722a, 0x009f44c2, 0x03ab0669, 0x028b459e, 0x0088d736, 0x01b1cbae, 0x0029bf99}}}, + {X: Field{[10]uint32{0x03117af7, 0x01c26a6e, 0x03bdc5c2, 0x00fd01bc, 0x007a4c0a, 0x019013b2, 0x01d16918, 0x02478aa3, 0x032c41f6, 0x0010fb55}}, Y: Field{[10]uint32{0x02481da3, 0x03481cfe, 0x03ac3fd4, 0x024c36be, 0x0390a2b0, 0x02f9351d, 0x02cbbab7, 0x000cd1ae, 0x01b890b4, 0x002dee78}}}, + {X: Field{[10]uint32{0x03397de3, 0x00e39186, 0x02e421c3, 0x0107a17e, 0x0281722b, 0x00bc6557, 0x00bb5260, 0x021a98c5, 0x02192230, 0x00138042}}, Y: Field{[10]uint32{0x03a65fa2, 0x016689fa, 0x02ec4a61, 0x038dc311, 0x00283b44, 0x02f42ee3, 0x0076e7b3, 0x017b6112, 0x011c0347, 0x003c34fc}}}, + {X: Field{[10]uint32{0x0211f36b, 0x03510bfb, 0x01e2241d, 0x00a9f4d5, 0x0045e15d, 0x007b7361, 0x03c385e8, 0x01af3136, 0x00bb7fc8, 0x002cd827}}, Y: Field{[10]uint32{0x009c5f68, 0x00643237, 0x018e20e6, 0x006aa85a, 0x00c30891, 0x01deeea2, 0x00017dc9, 0x00d3fe01, 0x01aca3df, 0x002181f9}}}, + {X: Field{[10]uint32{0x03965b4e, 0x01b90fb7, 0x009d1df9, 0x02dac9c9, 0x02d1bdd6, 0x036c4497, 0x0168cdf6, 0x03ef4def, 0x00b20543, 0x00111798}}, Y: Field{[10]uint32{0x03715fd1, 0x0373c2f1, 0x025b00b5, 0x0148a1e9, 0x03c65f8b, 0x0248b9c4, 0x03fdc7cf, 0x02d1eafa, 0x018a8c4a, 0x00297e91}}}, + {X: Field{[10]uint32{0x00f50fc9, 0x02ed90c4, 0x0364cf9d, 0x01278032, 0x01be875b, 0x03c53062, 0x0359a7be, 0x03267e1a, 0x02279264, 0x001c27e0}}, Y: Field{[10]uint32{0x00960d10, 0x00540c56, 0x0362883f, 0x03ffeaab, 0x013d4903, 0x01a39379, 0x029064b4, 0x034afa29, 0x03f0cd28, 0x0005a009}}}, + {X: Field{[10]uint32{0x01fb4ba3, 0x019ffe4a, 0x00cdbe15, 0x017befc6, 0x008a2e9d, 0x00ccfc87, 0x012e725a, 0x00902e89, 0x000dcbd1, 0x0018aa88}}, Y: Field{[10]uint32{0x020a1347, 0x038fca27, 0x021b7b18, 0x00ac4b7b, 0x001ec328, 0x010f906b, 0x0106b468, 0x02f6f12e, 0x016c7017, 0x00066abf}}}, + {X: Field{[10]uint32{0x0082c09e, 0x03c42b2e, 0x02e11f38, 0x01ff2206, 0x01e12398, 0x000b8aae, 0x01f23898, 0x01191bea, 0x01588ed5, 0x000ae9ce}}, Y: Field{[10]uint32{0x035a25a6, 0x03cf848d, 0x00423721, 0x024ddd46, 0x03d8f8a1, 0x012004d4, 0x02cc45d3, 0x0262bbe1, 0x021c9c0a, 0x003cdf6a}}}, + {X: Field{[10]uint32{0x01005de8, 0x00539bde, 0x02397073, 0x0380d64a, 0x01e266e9, 0x02d677f8, 0x01c0f549, 0x02da6ab9, 0x01cce8fb, 0x00219cae}}, Y: Field{[10]uint32{0x0305af65, 0x025ea1a6, 0x01aa399a, 0x01d699ad, 0x02c411e8, 0x03efe7ab, 0x00aac680, 0x0071e6b7, 0x036aefb6, 0x00083611}}}, + {X: Field{[10]uint32{0x01ab6ab5, 0x015c7a2f, 0x000eda26, 0x03984ccc, 0x031f32be, 0x017b9705, 0x03dbac10, 0x00a665e7, 0x00028420, 0x000cd32c}}, Y: Field{[10]uint32{0x02a574d4, 0x01686216, 0x0038d96e, 0x02d92759, 0x00e4e972, 0x01e7172e, 0x0345bfd5, 0x021e3d1a, 0x019f3da7, 0x002209f6}}}, + {X: Field{[10]uint32{0x01ac6d4d, 0x03c8a68d, 0x01afe602, 0x01391efc, 0x00e9f25f, 0x03d93e07, 0x00cad6a2, 0x03b01cd5, 0x0207d260, 0x000cacc3}}, Y: Field{[10]uint32{0x003c0427, 0x01821d0f, 0x03941856, 0x0223cc18, 0x025c5e36, 0x0049b113, 0x02904181, 0x0241e1bc, 0x030d64ee, 0x001c7ff3}}}, + {X: Field{[10]uint32{0x039a8451, 0x00798028, 0x03a05076, 0x000970e3, 0x033b5ce4, 0x0267a6fe, 0x02401ff2, 0x01398d0f, 0x02587a4b, 0x00394265}}, Y: Field{[10]uint32{0x03bb2ece, 0x00b1196c, 0x03241f13, 0x0059c3f1, 0x00683a39, 0x031acce0, 0x02acccf5, 0x026a1a53, 0x02a86542, 0x001ec0e0}}}, + {X: Field{[10]uint32{0x01d6477d, 0x01ba4c39, 0x026abd31, 0x0084a76d, 0x01ca6841, 0x02cf5e1b, 0x02ea0353, 0x00e6f382, 0x004c2bf5, 0x002ce1cb}}, Y: Field{[10]uint32{0x0101e285, 0x01342402, 0x034f9242, 0x01c48b43, 0x0159391c, 0x02775058, 0x037ed1fa, 0x0321bcec, 0x00afe4c8, 0x0001f381}}}, + {X: Field{[10]uint32{0x0135d07b, 0x0101b7a6, 0x00908f3b, 0x01d28b7e, 0x0006095e, 0x027d3106, 0x0014d964, 0x038eacb9, 0x03df9156, 0x0034ad5b}}, Y: Field{[10]uint32{0x03e3b23f, 0x00ed403b, 0x012aaadc, 0x02bcdc55, 0x03b06a33, 0x011aa397, 0x00b49259, 0x02315aa1, 0x001b6766, 0x00110f0b}}}, + {X: Field{[10]uint32{0x037fbacb, 0x02c56a7c, 0x0208115d, 0x03f58ac2, 0x034e8288, 0x0327d06c, 0x03f32e1e, 0x031d9648, 0x027e1074, 0x0003da61}}, Y: Field{[10]uint32{0x013fca16, 0x01417190, 0x00e58cd0, 0x039dbf74, 0x0368709b, 0x01c6708a, 0x0204c6ed, 0x02945a73, 0x02252a11, 0x003f5b1b}}}, + {X: Field{[10]uint32{0x01e64988, 0x01c362ae, 0x02579626, 0x0261556d, 0x00cae238, 0x0223f33b, 0x00778c86, 0x004706b6, 0x00b4a9ab, 0x002f060c}}, Y: Field{[10]uint32{0x022e3c81, 0x0256b130, 0x01ea5b6d, 0x032c4b6e, 0x028e95cd, 0x00f4323c, 0x039a0faf, 0x0184cc65, 0x0089f3c4, 0x002d8910}}}, + {X: Field{[10]uint32{0x038dbafc, 0x0392d1fc, 0x003b7445, 0x007a887d, 0x02126cfa, 0x03357ee4, 0x004bbe83, 0x027f6a63, 0x0221dc72, 0x003eaeab}}, Y: Field{[10]uint32{0x002d8cdc, 0x00cd8016, 0x01fbcc4c, 0x02eacb02, 0x03177ce1, 0x035abb67, 0x03513b3e, 0x0160cb1c, 0x03756446, 0x0006d5a5}}}, + {X: Field{[10]uint32{0x011f8bd4, 0x00f65b5e, 0x0157b547, 0x000c85b7, 0x03bcd3fc, 0x00923638, 0x012497ea, 0x0130f7e4, 0x01014d5d, 0x0024ce18}}, Y: Field{[10]uint32{0x00936725, 0x00c3e8db, 0x02d951d6, 0x00ae3a01, 0x019e57f2, 0x0129ab5c, 0x033add54, 0x0058f13f, 0x016ac141, 0x000f63f2}}}, + {X: Field{[10]uint32{0x02fd07f8, 0x02a0ffa9, 0x007f2094, 0x00934c05, 0x02da0a43, 0x031ac61b, 0x0146b8ee, 0x00a08165, 0x015f85c4, 0x00314c4b}}, Y: Field{[10]uint32{0x01d2992f, 0x03e01b11, 0x0251beda, 0x03a2cd6d, 0x00332898, 0x035511cd, 0x03be12c8, 0x001d5948, 0x022a79ba, 0x003e2b9b}}}, + {X: Field{[10]uint32{0x0203b057, 0x01202d7c, 0x03388558, 0x00a046a9, 0x01b73b11, 0x02808bd0, 0x0375c4dd, 0x00bd01b6, 0x009652c5, 0x002823c9}}, Y: Field{[10]uint32{0x033eb2e5, 0x0371d14b, 0x00ccc845, 0x0094df13, 0x02191d7a, 0x03b3f8f2, 0x01aa9251, 0x0387657a, 0x03de9ab5, 0x0028e5b1}}}, + {X: Field{[10]uint32{0x00f634df, 0x01792f50, 0x0205bc52, 0x02d626e2, 0x02a036e0, 0x00289469, 0x034b34f0, 0x01be9829, 0x030fe8df, 0x0024f54c}}, Y: Field{[10]uint32{0x01838756, 0x031582dc, 0x03a08f5a, 0x019df454, 0x000c4df5, 0x0321f68a, 0x02774f77, 0x00939575, 0x02ea10f4, 0x0032857e}}}, + {X: Field{[10]uint32{0x02b51fa2, 0x0157e4aa, 0x024f6170, 0x004c3c16, 0x005c35b8, 0x03d94844, 0x010a9941, 0x02dcafa1, 0x03ccdfca, 0x0001188a}}, Y: Field{[10]uint32{0x03ca2d4f, 0x02d07a75, 0x01a8cd29, 0x02918259, 0x00e883d2, 0x0256d4f2, 0x01cd2456, 0x02c95b49, 0x002d31ee, 0x0036581c}}}, + {X: Field{[10]uint32{0x00ef9fe5, 0x03b821b8, 0x00d8807a, 0x00fb45f2, 0x010fb6c8, 0x004e30c3, 0x03a58728, 0x02176652, 0x036c7dd8, 0x0028c980}}, Y: Field{[10]uint32{0x02cb9bf7, 0x00f359cc, 0x01a53489, 0x03871d79, 0x03456a6c, 0x01da2685, 0x00aafcde, 0x028554c7, 0x02693719, 0x002d1973}}}, + {X: Field{[10]uint32{0x02ef77a5, 0x0082d69f, 0x00946b1d, 0x02a6129b, 0x03f3d5e7, 0x03e97154, 0x030c887b, 0x01f9e5c6, 0x017e1963, 0x0008d510}}, Y: Field{[10]uint32{0x01f4bd4b, 0x027d22ca, 0x02d4d216, 0x014cf3d3, 0x01ea7400, 0x03cd3d02, 0x014fbf99, 0x034f2ec9, 0x0321b6ea, 0x002056a5}}}, + {X: Field{[10]uint32{0x03ce6fca, 0x01f322ed, 0x01f9f2b0, 0x00677757, 0x033a4078, 0x008e0435, 0x01a746b0, 0x005d3d73, 0x016dfc53, 0x00274d1b}}, Y: Field{[10]uint32{0x0376c806, 0x00acd5e5, 0x029b9851, 0x000f7c23, 0x014a199b, 0x007a4154, 0x01a8ff9f, 0x00f97295, 0x006b6429, 0x0026db30}}}, + {X: Field{[10]uint32{0x0148dd01, 0x028ccc3f, 0x00564bb5, 0x02d01542, 0x03bba638, 0x03af8843, 0x01f000ad, 0x029edfe5, 0x038ec643, 0x001cf20a}}, Y: Field{[10]uint32{0x0005b614, 0x03c4da42, 0x02f075ff, 0x01737c35, 0x027d2acf, 0x0132caf6, 0x035f61b8, 0x017187f8, 0x0299a088, 0x003ffc55}}}, + {X: Field{[10]uint32{0x00798ac8, 0x00e72fff, 0x011afc9b, 0x02fdb28a, 0x010f2d29, 0x02141ae5, 0x01316728, 0x0357473e, 0x01d5a0b2, 0x0024091a}}, Y: Field{[10]uint32{0x03c3ade4, 0x00f7a247, 0x030d4fa6, 0x036eafa2, 0x03cd78ad, 0x032bf93f, 0x02378bff, 0x01da74d0, 0x0011d71c, 0x0000d5b4}}}, + {X: Field{[10]uint32{0x03110637, 0x03f88f87, 0x00371b1e, 0x03a7f540, 0x00dc4013, 0x0066e251, 0x0123afb8, 0x021bc14d, 0x00fb3a0c, 0x00399c28}}, Y: Field{[10]uint32{0x020b31b8, 0x019677c9, 0x0250a9bf, 0x0382772c, 0x03272557, 0x001f967b, 0x03db5a3d, 0x0372c855, 0x036bcd13, 0x00021a44}}}, + {X: Field{[10]uint32{0x0205c395, 0x034f56e2, 0x005fcb9a, 0x03961255, 0x01b57f11, 0x033ee732, 0x0368e270, 0x02079ac3, 0x006d5265, 0x003cffbc}}, Y: Field{[10]uint32{0x01b8f553, 0x01d55106, 0x012f4ff3, 0x034412c2, 0x01570752, 0x03e97eef, 0x0045176e, 0x0083b313, 0x01971444, 0x000cacba}}}, + {X: Field{[10]uint32{0x016a05bd, 0x02974e4e, 0x02cac70c, 0x02711c74, 0x00f942c0, 0x03306762, 0x00fc28a8, 0x03611158, 0x02633958, 0x001ca8dd}}, Y: Field{[10]uint32{0x035ee1ad, 0x03d1521c, 0x03ba8503, 0x011834bd, 0x01729ce8, 0x000ba363, 0x004b3b84, 0x0041c3da, 0x030e6e12, 0x0037a6c6}}}, + {X: Field{[10]uint32{0x005300b0, 0x00def620, 0x01ae22b6, 0x013ea133, 0x00417289, 0x0243379a, 0x019c3a81, 0x01f7bd04, 0x02d9c43b, 0x000e2de2}}, Y: Field{[10]uint32{0x03d01e6f, 0x039d2a2c, 0x01c8423d, 0x01a77214, 0x010de7cc, 0x02ffccba, 0x0204f175, 0x017d461c, 0x01676c4f, 0x00028605}}}, + {X: Field{[10]uint32{0x0334752e, 0x00563fca, 0x013af68e, 0x0224232f, 0x03540e2e, 0x00653ec8, 0x026fac9e, 0x01f14db1, 0x02c81d2e, 0x0036e5a2}}, Y: Field{[10]uint32{0x02b48a0a, 0x03969cea, 0x00769a24, 0x023bf453, 0x0104179e, 0x018d1c9c, 0x02b4af0a, 0x025caeb1, 0x03ab79d9, 0x00135715}}}, + {X: Field{[10]uint32{0x00aad318, 0x0174d9ea, 0x02435a14, 0x03e65f1c, 0x02505dd4, 0x007b4d6c, 0x0114f28c, 0x01360dc4, 0x02792d3a, 0x000ab385}}, Y: Field{[10]uint32{0x0226f625, 0x0239cfcd, 0x03539cc8, 0x03be86b8, 0x010405b0, 0x01a17db4, 0x0063b87f, 0x01d3933b, 0x012a2468, 0x0014c50c}}}, + {X: Field{[10]uint32{0x01bae108, 0x03e4ebcf, 0x0277e852, 0x0060958c, 0x00bb1fda, 0x0189c9f1, 0x00a46008, 0x0037b76e, 0x02690c39, 0x000cb603}}, Y: Field{[10]uint32{0x00dc7c07, 0x0155ea58, 0x01d08cbd, 0x0048f67c, 0x03bc1c3e, 0x0207df36, 0x03cb3f81, 0x0341a9b4, 0x016fea89, 0x0000f1f6}}}, + {X: Field{[10]uint32{0x02ee3908, 0x0229021d, 0x01521d8e, 0x00379497, 0x03f1bf05, 0x01176cf2, 0x00e61a29, 0x01ad018a, 0x028ae7fe, 0x000fbd27}}, Y: Field{[10]uint32{0x01a123f2, 0x00778200, 0x0092bd3d, 0x009d630f, 0x033ff72d, 0x018c456b, 0x0031b54d, 0x017ec935, 0x035c62f4, 0x0010e071}}}, + {X: Field{[10]uint32{0x009722da, 0x009d508f, 0x006405aa, 0x03996797, 0x000e280e, 0x032235ec, 0x03517d41, 0x00b340e6, 0x00d5cdb8, 0x00214e02}}, Y: Field{[10]uint32{0x037e8f5e, 0x0308a7d7, 0x0200fb4d, 0x000e4b50, 0x023ed18d, 0x005c8890, 0x00a652f8, 0x025899a6, 0x00449b2a, 0x003059df}}}, + {X: Field{[10]uint32{0x03c8584f, 0x0076de07, 0x02f4958c, 0x03cca6b7, 0x03306ee4, 0x02187f32, 0x03520bd8, 0x0017fa15, 0x0083490c, 0x0015cbf5}}, Y: Field{[10]uint32{0x0013f4a5, 0x00000d8d, 0x03ca0be3, 0x0156cc7a, 0x00d38e91, 0x02ced865, 0x00107c06, 0x008c0b3c, 0x01061039, 0x0020ab32}}}, + {X: Field{[10]uint32{0x036e1386, 0x024d60cd, 0x0248138c, 0x01135164, 0x00fa7713, 0x013655b9, 0x02a9a2dd, 0x0328c5d6, 0x03b29aa8, 0x002c72ea}}, Y: Field{[10]uint32{0x02292ec9, 0x0234b759, 0x015fcbc5, 0x03d80300, 0x01265cb2, 0x01050270, 0x021de030, 0x03f7c1ae, 0x00f17f9a, 0x00222330}}}, + {X: Field{[10]uint32{0x036bab20, 0x02eee60b, 0x001a16dd, 0x00359c1c, 0x012c5c96, 0x01269ba0, 0x000a65a1, 0x00c4d1d6, 0x03924239, 0x003e15b2}}, Y: Field{[10]uint32{0x00536674, 0x02540452, 0x03869c55, 0x030b5758, 0x0377d9d6, 0x01704477, 0x01f580f6, 0x0003a664, 0x01ba192c, 0x0030cd44}}}, + {X: Field{[10]uint32{0x0273920e, 0x03f0e9fb, 0x00e230ff, 0x03edb04a, 0x039eed92, 0x015aeece, 0x0042887b, 0x004a78b0, 0x00d4773e, 0x00385807}}, Y: Field{[10]uint32{0x001054ca, 0x02805bcc, 0x00ec96f4, 0x02328142, 0x000a7864, 0x026e87f3, 0x0247c714, 0x01de5bb8, 0x00c8a38c, 0x000601d2}}}, + {X: Field{[10]uint32{0x027c7e72, 0x024a38cd, 0x01534a98, 0x02ae5d22, 0x00e8b37c, 0x0032fc76, 0x02206a5b, 0x0185dd72, 0x00d45ffb, 0x00263b88}}, Y: Field{[10]uint32{0x0273c610, 0x02391958, 0x03c30697, 0x03811486, 0x01854b70, 0x023f1017, 0x02b5e6e8, 0x036d45a2, 0x00e1ea42, 0x000b7d2b}}}, + {X: Field{[10]uint32{0x01fe179f, 0x02b53bb7, 0x00246ec0, 0x0107d6b3, 0x035417bc, 0x03b74784, 0x01cfe95b, 0x024168c7, 0x0257acde, 0x0011e5b2}}, Y: Field{[10]uint32{0x00a367a8, 0x0258a87c, 0x0015f8ff, 0x028d18fe, 0x015bc565, 0x0159308e, 0x03637e59, 0x00e00acd, 0x0122395a, 0x001d04fd}}}, + {X: Field{[10]uint32{0x02341200, 0x01a2f746, 0x01d4006c, 0x00da6aef, 0x03cfd555, 0x01b1f7e7, 0x03627fd5, 0x02c2e356, 0x006438ad, 0x002cd9f2}}, Y: Field{[10]uint32{0x028fba51, 0x0092678b, 0x0349dfd2, 0x03d72715, 0x02b4986c, 0x0089a1c0, 0x002f3657, 0x03a059e6, 0x03440b99, 0x00300d91}}}, + {X: Field{[10]uint32{0x00914d29, 0x01fd29e2, 0x01386a74, 0x00293c9f, 0x00e74076, 0x00837a11, 0x02244c00, 0x037b3df8, 0x004b723d, 0x0036cda2}}, Y: Field{[10]uint32{0x0179e023, 0x03ccccdf, 0x023b40e5, 0x0093f683, 0x03fef90e, 0x037bc3ca, 0x01e07507, 0x00e8f0a8, 0x03cc2a74, 0x0022b921}}}, + {X: Field{[10]uint32{0x01a316c4, 0x0171a826, 0x03123ccf, 0x00b9b1b0, 0x0176b473, 0x007bbd3e, 0x02458213, 0x0084aea3, 0x0018f71c, 0x001965c6}}, Y: Field{[10]uint32{0x013604db, 0x001dd538, 0x035db4cd, 0x00c71c0d, 0x01526a28, 0x00dd8446, 0x0087f391, 0x01434cec, 0x03913533, 0x001057d9}}}, + {X: Field{[10]uint32{0x00ebd65a, 0x0332b1d8, 0x01338fcb, 0x00fe5868, 0x01905390, 0x01fadb36, 0x0182a639, 0x03d2c908, 0x033a13a8, 0x003cbd3a}}, Y: Field{[10]uint32{0x00ef9ca8, 0x0032bf82, 0x00b6e795, 0x00fce8ef, 0x0018811b, 0x03aae3af, 0x02dc8b74, 0x02535c82, 0x027b667e, 0x00295d75}}}, + {X: Field{[10]uint32{0x01113a49, 0x01ad34c7, 0x00a47e8c, 0x01df301a, 0x03884b3f, 0x034f249f, 0x028fa51f, 0x03c318cc, 0x020da058, 0x0028939e}}, Y: Field{[10]uint32{0x010ef78b, 0x01c84bd1, 0x00c81a9a, 0x00559179, 0x010bcee6, 0x00a5c675, 0x032fe3f8, 0x0295a67a, 0x003079ac, 0x002fa36e}}}, + {X: Field{[10]uint32{0x01efad5a, 0x0076dc90, 0x024b8098, 0x029d23c2, 0x0142212d, 0x03af5660, 0x036cc325, 0x005e5df6, 0x00cb77e1, 0x0039668f}}, Y: Field{[10]uint32{0x00a800d9, 0x030b5381, 0x012999d4, 0x005a9281, 0x00d69034, 0x00e268b6, 0x00a10a22, 0x0099a330, 0x0145fdda, 0x002a381d}}}, + {X: Field{[10]uint32{0x024b8f32, 0x03d8183f, 0x00e9f0da, 0x01d6aaa5, 0x01fc6c1a, 0x036afa72, 0x00721f93, 0x002f96fb, 0x0263a3c7, 0x000c646c}}, Y: Field{[10]uint32{0x01f38a96, 0x02c7e657, 0x00491717, 0x009d4f9d, 0x00c7af7b, 0x028f2eac, 0x01a87c4e, 0x026f1caa, 0x02cc1c7a, 0x000ce464}}}, + {X: Field{[10]uint32{0x0187023a, 0x01e1d3e4, 0x014638b9, 0x0394f04e, 0x0012f408, 0x03a0e6c8, 0x0147e275, 0x0376c23f, 0x03c604f9, 0x0018f757}}, Y: Field{[10]uint32{0x0104bd9a, 0x00d72f21, 0x0239b84f, 0x00410588, 0x03067e09, 0x004bbdfb, 0x016cccfd, 0x02df9b51, 0x00b402e8, 0x0006bc12}}}, + {X: Field{[10]uint32{0x031bcf13, 0x036fd2d9, 0x025c12d3, 0x01030ae3, 0x032e1d86, 0x03dd4712, 0x007229b7, 0x004bb32e, 0x0057cd83, 0x0002a4b9}}, Y: Field{[10]uint32{0x03fba768, 0x03ca4b97, 0x00b3f551, 0x013cf56d, 0x02be46ab, 0x0281f59c, 0x00492413, 0x03ad7461, 0x03565447, 0x0035ebb6}}}, + {X: Field{[10]uint32{0x01b10495, 0x0375be0e, 0x035ba6c0, 0x0179617c, 0x004789f5, 0x013c02ed, 0x0320f021, 0x0274880a, 0x0170b9e0, 0x0007b9ae}}, Y: Field{[10]uint32{0x009e9462, 0x03443837, 0x032be3f8, 0x02ef5282, 0x019dcf73, 0x01894a21, 0x023c8a04, 0x03bbd746, 0x03eceff9, 0x001f2443}}}, + {X: Field{[10]uint32{0x0306a76a, 0x03459663, 0x01cebe4f, 0x025cc0a1, 0x001abe9e, 0x00f4121c, 0x0328d7c4, 0x00655c14, 0x03b9c2ac, 0x002c6708}}, Y: Field{[10]uint32{0x03a38398, 0x016ca0cd, 0x00a49274, 0x01f34232, 0x01c60560, 0x038da791, 0x0380f8cf, 0x022dc1bc, 0x01bec07c, 0x001e6a04}}}, + {X: Field{[10]uint32{0x014f49a5, 0x026bbcc0, 0x02016b1e, 0x0262e2ca, 0x014f3fbf, 0x0099a915, 0x00888f5e, 0x017f09f0, 0x039f9ed3, 0x000f0836}}, Y: Field{[10]uint32{0x03fbc4d5, 0x025438d6, 0x009ea7d8, 0x02d733d2, 0x029327c1, 0x02879684, 0x010815a4, 0x0398ebd8, 0x02943f29, 0x002eceb0}}}, + {X: Field{[10]uint32{0x02ea4389, 0x0248b14b, 0x00014f6b, 0x03f0233a, 0x00efa29f, 0x034ce091, 0x02b59040, 0x01ba7913, 0x01bab474, 0x003f4733}}, Y: Field{[10]uint32{0x028df06e, 0x02080ca6, 0x0004097a, 0x014843db, 0x0373961a, 0x010f393a, 0x012439fc, 0x01be43e9, 0x01465214, 0x00384195}}}, + {X: Field{[10]uint32{0x0364020c, 0x03682666, 0x03ab51e2, 0x00a636cd, 0x0183641a, 0x030ac35d, 0x0252dc73, 0x02e29bbc, 0x018eabde, 0x0038c3f4}}, Y: Field{[10]uint32{0x00dce88b, 0x0309304a, 0x01704cfb, 0x00a5abfa, 0x018e195d, 0x01c5bad0, 0x02bcab86, 0x03d20658, 0x02721824, 0x0012598d}}}, + {X: Field{[10]uint32{0x015bda37, 0x0085f9d4, 0x00548e6e, 0x00001550, 0x015cd723, 0x00ea7702, 0x02ea7848, 0x03e4c386, 0x038926dd, 0x0012f07d}}, Y: Field{[10]uint32{0x0200ca69, 0x0133f374, 0x0047163a, 0x01b0a94b, 0x0336d8a2, 0x00d2f66a, 0x00bfa2e7, 0x006c0237, 0x02b695dc, 0x00259acc}}}, + {X: Field{[10]uint32{0x00f036d4, 0x03ffa855, 0x0139aaff, 0x023b51ad, 0x009004f9, 0x03b3a6f1, 0x030f7d26, 0x012e2d03, 0x027b9c86, 0x0008f4f8}}, Y: Field{[10]uint32{0x02c0b05d, 0x01b1e522, 0x026c71b3, 0x02eca24a, 0x01b3dfef, 0x03054354, 0x00143d6a, 0x0289f331, 0x03ebf680, 0x002f9185}}}, + {X: Field{[10]uint32{0x026009c0, 0x0392250f, 0x01aab56d, 0x02472db0, 0x004a5130, 0x01ded730, 0x02e0a894, 0x00edc3d1, 0x03d014cd, 0x000a2b72}}, Y: Field{[10]uint32{0x00e31601, 0x024b33bf, 0x00fdaf4a, 0x031cf7b5, 0x0025040d, 0x00233f93, 0x03250b46, 0x013328e3, 0x00387520, 0x001f126a}}}, + {X: Field{[10]uint32{0x00a29d08, 0x03c867c7, 0x02a0cc86, 0x01ee9517, 0x00ea52ec, 0x003613d8, 0x0044ab87, 0x00208e94, 0x00b8a86f, 0x001dd821}}, Y: Field{[10]uint32{0x001c60db, 0x00d14c96, 0x00b2cd08, 0x01c9615c, 0x03def172, 0x027959f6, 0x010bc384, 0x034942d0, 0x02cb1048, 0x00182eef}}}, + {X: Field{[10]uint32{0x028f2350, 0x03879f48, 0x035fbd4f, 0x02e7b5ab, 0x01e3db94, 0x01811254, 0x019667bc, 0x03bd2257, 0x020ffd32, 0x001177cb}}, Y: Field{[10]uint32{0x03eaf095, 0x035e4618, 0x0399473f, 0x032da2ec, 0x004de155, 0x010592e6, 0x024076ed, 0x03f819a7, 0x024b1a8c, 0x0029cc91}}}, + {X: Field{[10]uint32{0x027dd7ea, 0x027c386f, 0x03ebe7f6, 0x03a1e0f3, 0x008ae9bb, 0x0124e8bf, 0x00bff80c, 0x03f47e9d, 0x036b46a5, 0x001a4125}}, Y: Field{[10]uint32{0x022c3e64, 0x01886bb2, 0x03cfd5ad, 0x0115799b, 0x0030f1df, 0x02802cd0, 0x0241a221, 0x0050d818, 0x01b8df9d, 0x0006741c}}}, + {X: Field{[10]uint32{0x01aef659, 0x00a3a14a, 0x00f0bef5, 0x00d47ba0, 0x03e01def, 0x03a02603, 0x01e805c8, 0x0341d6a3, 0x0328f977, 0x00212761}}, Y: Field{[10]uint32{0x025bf428, 0x00c5652b, 0x006ffedf, 0x026bb1c9, 0x018042dd, 0x0301a743, 0x017adadb, 0x018a0ee7, 0x01c46c88, 0x00361255}}}, + {X: Field{[10]uint32{0x032d58eb, 0x0319d191, 0x01281e27, 0x031fa9a1, 0x0054588d, 0x035d4d2b, 0x03facec8, 0x001b9839, 0x034c2345, 0x0038f592}}, Y: Field{[10]uint32{0x025a36eb, 0x007cd8eb, 0x030efbc6, 0x00e53265, 0x0011a9c8, 0x022ba966, 0x0047baf6, 0x00aa11d1, 0x013ccf82, 0x00128cab}}}, + {X: Field{[10]uint32{0x0063bbaa, 0x021f54d5, 0x03ece0c7, 0x02aba484, 0x02889877, 0x02d9d8e6, 0x036f1323, 0x0168c466, 0x012857d1, 0x003d071e}}, Y: Field{[10]uint32{0x014d9328, 0x018140de, 0x016d07cc, 0x0239fa91, 0x00630c45, 0x014b6777, 0x00075941, 0x01315534, 0x010e00c8, 0x001cf3f3}}}, + {X: Field{[10]uint32{0x01186079, 0x014bf5de, 0x0321d67f, 0x0071079e, 0x030e0cba, 0x02bb64e7, 0x03a4a02c, 0x02e13391, 0x0347047a, 0x00387485}}, Y: Field{[10]uint32{0x01b2b668, 0x006abf9f, 0x02f63af8, 0x019a6b24, 0x01fb26da, 0x0092a040, 0x01728a3e, 0x03028fb6, 0x0228aa4b, 0x0005ec2d}}}, + {X: Field{[10]uint32{0x006ef1d8, 0x0239f736, 0x00c8095a, 0x012e34a4, 0x005d7ddb, 0x014ad36c, 0x009da2dd, 0x019e54c6, 0x018af8f8, 0x002a2800}}, Y: Field{[10]uint32{0x0026518b, 0x02ae9f5a, 0x00c17fc8, 0x035e72ad, 0x0225b927, 0x00d8208f, 0x0180c7e9, 0x02287b7e, 0x006c84b8, 0x0022ee58}}}, + {X: Field{[10]uint32{0x036fffed, 0x03589fdc, 0x038f4cd8, 0x0384f7cc, 0x00e4e0c0, 0x003af698, 0x03a57c05, 0x0179136a, 0x02716ee0, 0x001ce0f1}}, Y: Field{[10]uint32{0x0289f0e0, 0x03625b23, 0x00ba004a, 0x01225487, 0x0338eafd, 0x031df6ab, 0x00cb973f, 0x0129d18e, 0x01465f16, 0x000ef72e}}}, + {X: Field{[10]uint32{0x01372dfd, 0x023e42eb, 0x00c1e085, 0x03d01483, 0x031ca36a, 0x00216018, 0x03e64312, 0x02b25e5a, 0x021c8bc8, 0x00187e9f}}, Y: Field{[10]uint32{0x03eba33d, 0x00d121b0, 0x002078d6, 0x02c252c3, 0x00a5f646, 0x02210778, 0x0287909c, 0x039a50c8, 0x036836c3, 0x000fc359}}}, + {X: Field{[10]uint32{0x02c4a740, 0x00c428ec, 0x0116d3cb, 0x01250efc, 0x00b4f143, 0x03d220aa, 0x0092defc, 0x03180664, 0x022bca0a, 0x002180a7}}, Y: Field{[10]uint32{0x001c2f7c, 0x018edf49, 0x00480154, 0x014f75c2, 0x00ef5f15, 0x004885b2, 0x0261cffd, 0x015bc3cc, 0x006ecd90, 0x002e2fa4}}}, + {X: Field{[10]uint32{0x03ad95cc, 0x011d3013, 0x0390e2f6, 0x02c17f17, 0x0348c4a6, 0x0035ae6a, 0x01d6c4cd, 0x02921d62, 0x03e5912a, 0x00385cbd}}, Y: Field{[10]uint32{0x00acc401, 0x019cf702, 0x00290ea0, 0x01e54027, 0x010d7bfd, 0x022d935f, 0x019920ce, 0x003b4ee2, 0x03c12b0a, 0x003b6f48}}}, + {X: Field{[10]uint32{0x02873494, 0x00df6f8c, 0x00616d1f, 0x01e335aa, 0x032d931c, 0x020e37a4, 0x03b22abf, 0x03f0922d, 0x028d322e, 0x001e61ae}}, Y: Field{[10]uint32{0x02a13634, 0x02f25a04, 0x0201ee6e, 0x034f4edf, 0x002420a5, 0x034a7f83, 0x01b75440, 0x001648c6, 0x03224c75, 0x001a4faa}}}, + {X: Field{[10]uint32{0x01e00383, 0x02319738, 0x01d4603e, 0x034daa2a, 0x03400bb5, 0x034dac4c, 0x000a6d88, 0x01d9cdd8, 0x01384a72, 0x002e9650}}, Y: Field{[10]uint32{0x002ce557, 0x02676fcf, 0x019bd867, 0x0114bd88, 0x03d9c685, 0x00c4162f, 0x03fc9535, 0x0204ac89, 0x0228bc1b, 0x001d1bd3}}}, + {X: Field{[10]uint32{0x00476c8f, 0x02be1a48, 0x006b9802, 0x035cb3c3, 0x036bf96c, 0x02c5de27, 0x02eeb77b, 0x02c45f21, 0x01c992d6, 0x00117fd0}}, Y: Field{[10]uint32{0x0002b59f, 0x035a5c88, 0x015cbec3, 0x021a1ff2, 0x004f522e, 0x009c59f6, 0x010c9e10, 0x038eb880, 0x01bf6422, 0x0024c93d}}}, + {X: Field{[10]uint32{0x016ed68f, 0x00fb30f0, 0x02a7d9a9, 0x0293655d, 0x00d00bad, 0x02199bb5, 0x031c282e, 0x013681c5, 0x0235487a, 0x002eb5e7}}, Y: Field{[10]uint32{0x007b57d2, 0x0354371e, 0x029207a6, 0x005e40e2, 0x005b1535, 0x0076c335, 0x0202e129, 0x021290c6, 0x022eefb1, 0x00064e5e}}}, + {X: Field{[10]uint32{0x023c8a41, 0x0100ef27, 0x01b79cfa, 0x00374d99, 0x0022cf89, 0x025d56ff, 0x004d5835, 0x01d7b183, 0x01072d88, 0x00377f88}}, Y: Field{[10]uint32{0x033f62e7, 0x00ad8211, 0x00d90ce2, 0x00fe1f04, 0x028dbe0d, 0x0230a21c, 0x015674c2, 0x002a2a48, 0x0117491d, 0x00318af6}}}, + {X: Field{[10]uint32{0x027eb299, 0x0203b6d9, 0x03a64b11, 0x01a68f67, 0x00d75942, 0x03be7657, 0x00ccadfb, 0x0248fe5a, 0x0253c07f, 0x002497da}}, Y: Field{[10]uint32{0x01e7809c, 0x00e6582c, 0x010b7b29, 0x00e2e329, 0x0058f000, 0x03e73b92, 0x008b26b7, 0x006399bc, 0x00ff01f9, 0x0004203a}}}, + {X: Field{[10]uint32{0x0320dd80, 0x01e2ea09, 0x00d0d878, 0x0341ac38, 0x0012768b, 0x007c0ebc, 0x025d2c7d, 0x000a0ce3, 0x01dda75f, 0x0030a392}}, Y: Field{[10]uint32{0x010db12b, 0x02116ad7, 0x00a98331, 0x02d35fda, 0x03ec5ae6, 0x0261f859, 0x0112c5b4, 0x02926f31, 0x0189c941, 0x0019c3e2}}}, + {X: Field{[10]uint32{0x00837cbb, 0x03e1b28b, 0x006f37b9, 0x01235650, 0x02b21dae, 0x017a3816, 0x008c196d, 0x016fa206, 0x013e9503, 0x0001ea41}}, Y: Field{[10]uint32{0x003a7e1c, 0x00af43d1, 0x02352e7f, 0x03dbdfef, 0x026de026, 0x03425f5d, 0x00774e79, 0x0252de65, 0x008e8e76, 0x00103b82}}}, + {X: Field{[10]uint32{0x02036aa2, 0x029e7f43, 0x01b956c6, 0x021686d8, 0x02e0b32c, 0x025986c5, 0x008ef81e, 0x00031536, 0x00eabfbb, 0x000cebde}}, Y: Field{[10]uint32{0x03cfd3c0, 0x01231a74, 0x00629d80, 0x022017bd, 0x03153319, 0x03215742, 0x01796440, 0x029e5b13, 0x02af0537, 0x001c4f9e}}}, + {X: Field{[10]uint32{0x01583bd0, 0x0031c812, 0x0163df9a, 0x02901e5f, 0x031326df, 0x01b59d30, 0x02955739, 0x00f4cca5, 0x00145a3f, 0x00316234}}, Y: Field{[10]uint32{0x0053cdfa, 0x00c719ab, 0x020d7375, 0x009232bd, 0x027f7470, 0x03f4b35d, 0x02baa8fc, 0x0336b6ae, 0x03d16c67, 0x002d7033}}}, + {X: Field{[10]uint32{0x0038d29e, 0x02ad48e0, 0x01d5a2f2, 0x00887c3b, 0x0397223f, 0x01924d06, 0x008ef12c, 0x010b19f1, 0x01edb937, 0x0025acf5}}, Y: Field{[10]uint32{0x00e44c4e, 0x007b032c, 0x016aa996, 0x015d2ca3, 0x01bf25fe, 0x0339ed3b, 0x019a2e64, 0x028174dc, 0x00aa38a3, 0x0036d1d7}}}, + {X: Field{[10]uint32{0x0244f0c7, 0x0369dfd5, 0x02782a62, 0x010968a1, 0x001eea3a, 0x01198aa7, 0x00cb00b1, 0x013b9bec, 0x036e3d89, 0x00104bd2}}, Y: Field{[10]uint32{0x02a676fe, 0x026be1bd, 0x031d6f13, 0x0226300f, 0x01a8503e, 0x00e1d10a, 0x03de8139, 0x032016ff, 0x0236ab9b, 0x002a13bd}}}, + {X: Field{[10]uint32{0x00563252, 0x01387eb9, 0x01049379, 0x0312270e, 0x0132fdfd, 0x00cb1063, 0x031421da, 0x00c0a14b, 0x0385c7b4, 0x00097c29}}, Y: Field{[10]uint32{0x0004e4bc, 0x009a20d8, 0x02334a02, 0x03d4771b, 0x02da716a, 0x03afbd01, 0x00953a3a, 0x0242d627, 0x010d4571, 0x003bfac2}}}, + {X: Field{[10]uint32{0x01741c6f, 0x0356293b, 0x02cfde0b, 0x01610c9e, 0x03f02fed, 0x027a8f9f, 0x034403a4, 0x03ebd2b2, 0x02b7f367, 0x00143f52}}, Y: Field{[10]uint32{0x0146dd5f, 0x00c1f18f, 0x0207ea56, 0x033e81e5, 0x022d08ab, 0x02b6c70e, 0x020cb520, 0x03352194, 0x01a73c9d, 0x001e2af0}}}, + {X: Field{[10]uint32{0x006a477a, 0x03efb441, 0x03313bbc, 0x007d2e53, 0x02c35762, 0x00c3c41f, 0x038fa664, 0x01fde4ce, 0x03d4cfaf, 0x00055d60}}, Y: Field{[10]uint32{0x017e8db5, 0x02737a8a, 0x02aaffc0, 0x02359674, 0x01fe35ed, 0x011b5216, 0x00d4355c, 0x0347f983, 0x0235ce8c, 0x0026a9ac}}}, + {X: Field{[10]uint32{0x033300be, 0x00ef1296, 0x03494f4b, 0x037e2f9a, 0x02f2edce, 0x016cd65d, 0x00affc16, 0x00980f91, 0x03625d26, 0x000f112e}}, Y: Field{[10]uint32{0x00bc2535, 0x03b0afcf, 0x007b9079, 0x031c7fdc, 0x021ef0e8, 0x00166054, 0x00d45949, 0x00eae17b, 0x01616797, 0x00222c71}}}, + {X: Field{[10]uint32{0x02298958, 0x0096e3ee, 0x01d935ee, 0x031b821f, 0x008fc5d9, 0x00fc8f31, 0x0371d193, 0x01ae5fcb, 0x024de160, 0x000c7509}}, Y: Field{[10]uint32{0x018251cb, 0x0004641c, 0x032c44ae, 0x02d8b98a, 0x00c8e41d, 0x021556e6, 0x025180c9, 0x007498a1, 0x01c0a3aa, 0x00118182}}}, + {X: Field{[10]uint32{0x0103ad2f, 0x0091eb97, 0x03b78a87, 0x007602a3, 0x03352d1d, 0x037060d2, 0x02b206d3, 0x011c9182, 0x030a8ff1, 0x0007d547}}, Y: Field{[10]uint32{0x0116a6e3, 0x03a8cfb0, 0x03b32ecc, 0x02d94255, 0x00fcb97a, 0x000afb8d, 0x0144f818, 0x02c5236e, 0x0006a4c8, 0x0009094f}}}, + {X: Field{[10]uint32{0x01cf333e, 0x02daed70, 0x003a87aa, 0x01ccaabb, 0x00206a1f, 0x03fd6a31, 0x03343119, 0x02101cc4, 0x021d27f0, 0x00378b13}}, Y: Field{[10]uint32{0x0195170d, 0x0173f8a0, 0x01a71c5a, 0x00ab2cb5, 0x019226ca, 0x007e9263, 0x03f4a8e4, 0x0334e8c7, 0x03a140fe, 0x0037204e}}}, + {X: Field{[10]uint32{0x00a95612, 0x02f13046, 0x01620a54, 0x03462bb5, 0x00c1f54b, 0x00e0b0bc, 0x02c4a22c, 0x012b204c, 0x01b2adf5, 0x001bf717}}, Y: Field{[10]uint32{0x030e221e, 0x03a24565, 0x00d26944, 0x032a9b71, 0x03cf60b0, 0x00748590, 0x00110536, 0x03a53703, 0x00e5f318, 0x0036cfe9}}}, + {X: Field{[10]uint32{0x03680603, 0x01dedcd4, 0x030fc7fd, 0x00342177, 0x00bb7665, 0x035fae84, 0x02ea6f4d, 0x0071468e, 0x02c6ea0e, 0x0031fadd}}, Y: Field{[10]uint32{0x035bf655, 0x011dc4b7, 0x013e0e6f, 0x00e6a0ad, 0x020a4f4a, 0x02f0cbbc, 0x0041c3d7, 0x0024a80f, 0x01d7b788, 0x0016b870}}}, + {X: Field{[10]uint32{0x00aa89ed, 0x004ea632, 0x01857b48, 0x02de0867, 0x021a52c7, 0x00c4afee, 0x00e048e6, 0x022d6d93, 0x01a2b7e7, 0x00320541}}, Y: Field{[10]uint32{0x03096806, 0x0177f037, 0x007fa87d, 0x01fe5ac9, 0x01c222be, 0x0167c0cf, 0x01e49be4, 0x03884578, 0x00426d6c, 0x0011b6ca}}}, + {X: Field{[10]uint32{0x00503bf8, 0x01fae79e, 0x031c90a1, 0x00482f71, 0x00f7dec3, 0x00eb0d42, 0x005ff0d8, 0x030f561c, 0x025515f9, 0x0032b5d4}}, Y: Field{[10]uint32{0x026bd719, 0x02704b1b, 0x034c52d1, 0x039496da, 0x0106231b, 0x00e39358, 0x012ddc76, 0x036e5fb3, 0x020276cf, 0x000cacda}}}, + {X: Field{[10]uint32{0x024cdd25, 0x03a4036f, 0x03fabc70, 0x0196094c, 0x00f17f3c, 0x035ac576, 0x02ca8a47, 0x01f8c15b, 0x0144e22b, 0x00253488}}, Y: Field{[10]uint32{0x03d93bf9, 0x006a1351, 0x02e5f612, 0x00b5e6d2, 0x03828bf7, 0x03404932, 0x01dfbbdb, 0x00be1762, 0x020d5fef, 0x0004b01d}}}, + {X: Field{[10]uint32{0x016731a3, 0x004ae2e4, 0x022253b1, 0x027f03cb, 0x0213cba1, 0x01c86f78, 0x03520407, 0x01807f77, 0x0023ef00, 0x000c9717}}, Y: Field{[10]uint32{0x022498e0, 0x02397bb5, 0x0370e962, 0x02c91763, 0x015cb38c, 0x01931f4a, 0x03f3dd30, 0x00590e64, 0x0398c09c, 0x001674f2}}}, + {X: Field{[10]uint32{0x01ee2318, 0x01b61864, 0x00a7cda9, 0x00e0f9fd, 0x027d1874, 0x006f7f69, 0x02515168, 0x020c5928, 0x0089544b, 0x0027241c}}, Y: Field{[10]uint32{0x0372d20d, 0x00639be0, 0x00911d97, 0x037a7ef9, 0x01547117, 0x03089416, 0x00539eb5, 0x0018c0d9, 0x02e7e701, 0x003d8e77}}}, + {X: Field{[10]uint32{0x002b7a82, 0x03e60d4c, 0x03fc0f32, 0x0373ab06, 0x01ec5544, 0x01e93ee0, 0x032a1d89, 0x0301b132, 0x0007ede9, 0x000d3c52}}, Y: Field{[10]uint32{0x016d9c57, 0x007ca902, 0x024828d0, 0x019d75af, 0x003c54c3, 0x01a2f79a, 0x0318813a, 0x0288a3d7, 0x028cec6a, 0x001e10de}}}, + {X: Field{[10]uint32{0x0239788b, 0x01ed8005, 0x00d75388, 0x03fc30d1, 0x01490b47, 0x032e07f7, 0x03d459af, 0x0020a380, 0x030b3f08, 0x00252634}}, Y: Field{[10]uint32{0x002522f7, 0x00da14b9, 0x03d2ece1, 0x02cd59f3, 0x00677865, 0x01461ea7, 0x001627dc, 0x02f8fac9, 0x0305b97a, 0x001e9720}}}, + {X: Field{[10]uint32{0x0354f226, 0x0114bd5d, 0x038c876d, 0x03ffaee5, 0x025d4f36, 0x00f3be23, 0x013ec32d, 0x01b8dea9, 0x036fefd3, 0x003ae823}}, Y: Field{[10]uint32{0x012015c1, 0x031f8e2f, 0x01470608, 0x01e1340a, 0x0339e171, 0x00e32f82, 0x03eade9b, 0x015329eb, 0x02b543aa, 0x003f8399}}}, + {X: Field{[10]uint32{0x0240091b, 0x0251211c, 0x01e504c7, 0x02f664b3, 0x02c8ef49, 0x03a326f3, 0x0119b77a, 0x005ca7d8, 0x03c20bd2, 0x00155752}}, Y: Field{[10]uint32{0x03437b54, 0x0046731f, 0x00315d30, 0x03fe953e, 0x036c9052, 0x024fad29, 0x02869415, 0x0078ccb2, 0x01b86952, 0x003333af}}}, + {X: Field{[10]uint32{0x03fe8872, 0x03c21ec3, 0x01823679, 0x03b31a4b, 0x013f3060, 0x005c8f51, 0x0333833d, 0x00d1d10b, 0x039c19da, 0x000cdca6}}, Y: Field{[10]uint32{0x0034fc30, 0x02f59317, 0x00800b4a, 0x001f5faf, 0x00fac2f0, 0x02fee011, 0x00854056, 0x03d813ae, 0x024f283a, 0x002a52da}}}, + {X: Field{[10]uint32{0x01f1dc11, 0x03857803, 0x03c32d8a, 0x03835131, 0x0378124e, 0x00eae4b3, 0x03b060a7, 0x0119e191, 0x009fafe6, 0x000a86a2}}, Y: Field{[10]uint32{0x008b75d8, 0x0017fcff, 0x01218986, 0x0341fbe4, 0x0275aba0, 0x01b6efc3, 0x02ba46be, 0x007e39a1, 0x023d3bf1, 0x00189be5}}}, + {X: Field{[10]uint32{0x00197d6f, 0x02f2c2df, 0x027fff2d, 0x02cd38e4, 0x01639148, 0x0162ecbd, 0x0062f702, 0x039bf3ff, 0x014ca303, 0x0011c0a1}}, Y: Field{[10]uint32{0x031e1156, 0x011111f5, 0x02c5195c, 0x02cc3cec, 0x022da76e, 0x00164dcb, 0x0075c2de, 0x0095f345, 0x01b28513, 0x001f6898}}}, + {X: Field{[10]uint32{0x01319c5b, 0x01f165b3, 0x00e03485, 0x03f5f681, 0x0351d90c, 0x01b9279e, 0x0015cae0, 0x008e8194, 0x01c5a0cc, 0x001c00bb}}, Y: Field{[10]uint32{0x03db73bb, 0x00f88c30, 0x02975db6, 0x015a13f1, 0x0178c47b, 0x027f5845, 0x012d2ae1, 0x02a961eb, 0x01bd06b7, 0x001bca11}}}, + {X: Field{[10]uint32{0x0348d485, 0x02b7c2db, 0x00ae67c1, 0x0321c976, 0x03f4cc5b, 0x00755143, 0x0169f057, 0x018436c8, 0x00d4483d, 0x0009cca5}}, Y: Field{[10]uint32{0x03d942b1, 0x0221d2d9, 0x036d3726, 0x030473ee, 0x02a71e3c, 0x0208e6a8, 0x039a0031, 0x03278280, 0x01a20ffe, 0x00266c90}}}, + {X: Field{[10]uint32{0x018c9a69, 0x00d7a3fa, 0x00e83b03, 0x00ab134a, 0x010710c7, 0x02a14a97, 0x0126a535, 0x02d103eb, 0x03823055, 0x0006fb33}}, Y: Field{[10]uint32{0x038aecfc, 0x03780fde, 0x03489e2f, 0x00597892, 0x002c5db7, 0x0351c7ab, 0x00ce0a40, 0x03b881f2, 0x0166ac0e, 0x0003cead}}}, + {X: Field{[10]uint32{0x03128160, 0x02386494, 0x02197fae, 0x008dde24, 0x00a19023, 0x023f99cb, 0x0149caec, 0x00f54d76, 0x02cf4f03, 0x0036f93b}}, Y: Field{[10]uint32{0x01aa566f, 0x00f51f35, 0x00a1f5fd, 0x0018702a, 0x01896fc8, 0x012583f1, 0x0241c722, 0x00396d58, 0x03c7927f, 0x002cfd42}}}, + {X: Field{[10]uint32{0x01bd1e20, 0x03b3d28e, 0x02631133, 0x0212c2b8, 0x03caf7f4, 0x03715cff, 0x011887a5, 0x0031a516, 0x0075bed8, 0x001990ff}}, Y: Field{[10]uint32{0x038d58e5, 0x02d717e1, 0x03b7a1f8, 0x0270a4f0, 0x038ec1e6, 0x031289b8, 0x001875fd, 0x01f24eeb, 0x0285f7ac, 0x00011c04}}}, + {X: Field{[10]uint32{0x01422a21, 0x00d0bf81, 0x03f14516, 0x00daf298, 0x03ef19d9, 0x00fe0839, 0x01582805, 0x0335781c, 0x03decf1d, 0x00267e42}}, Y: Field{[10]uint32{0x019cd4fd, 0x034b5e6e, 0x01e2a180, 0x0064cfe4, 0x025cfd77, 0x02fafab5, 0x0390a868, 0x01856c14, 0x01306dfc, 0x0028137f}}}, + {X: Field{[10]uint32{0x02e33433, 0x00774ca1, 0x0033eaad, 0x01f81270, 0x00bcf71f, 0x024ad59e, 0x03b4e351, 0x02dff917, 0x02483184, 0x001539f3}}, Y: Field{[10]uint32{0x00c0e8ef, 0x033b2205, 0x02c3c4de, 0x0118f1a8, 0x024d4f85, 0x01fd3938, 0x028b85cb, 0x0272de0e, 0x033b65ba, 0x0032b0a0}}}, + {X: Field{[10]uint32{0x03f02e08, 0x01a1ae12, 0x027d31f7, 0x0058a558, 0x034705aa, 0x03d2a65c, 0x00f4e7b8, 0x0264f911, 0x024ffb60, 0x0033e192}}, Y: Field{[10]uint32{0x036f1bde, 0x01db1f36, 0x02a51af2, 0x0145dd12, 0x016b8a19, 0x03a62f7c, 0x01db874c, 0x03ad3519, 0x020fb736, 0x001ea634}}}, + {X: Field{[10]uint32{0x0159d1ae, 0x001c849b, 0x03f26c9e, 0x01141829, 0x02a25693, 0x02a62bf8, 0x022cd457, 0x03fe456b, 0x00d6516f, 0x001bfc58}}, Y: Field{[10]uint32{0x00eedc4a, 0x017065ed, 0x034deaff, 0x03b4007c, 0x017db5d5, 0x0143e71d, 0x038b4153, 0x0042b393, 0x0355bf14, 0x001747c4}}}, + {X: Field{[10]uint32{0x035dfcc9, 0x007f9327, 0x01a46f23, 0x016cdc0b, 0x01a56fe3, 0x018a1f6a, 0x037f2a2c, 0x009a4075, 0x0262aefd, 0x00026b6e}}, Y: Field{[10]uint32{0x03b04161, 0x017c54ea, 0x02e7e482, 0x010d0765, 0x012e708d, 0x034b12f7, 0x03126aff, 0x00d66c01, 0x0045cb4a, 0x002e963b}}}, + {X: Field{[10]uint32{0x00a2402d, 0x0038aa85, 0x035d652c, 0x0183a773, 0x02b5d900, 0x00b0437f, 0x00ea9457, 0x03712335, 0x001ebbdc, 0x000813a9}}, Y: Field{[10]uint32{0x0036ae38, 0x03de02eb, 0x01809789, 0x00c8fb02, 0x02fb0b9e, 0x024929be, 0x005db8a9, 0x00bcf2cb, 0x01aca195, 0x001eca22}}}, + {X: Field{[10]uint32{0x03c8ba22, 0x02b3a5d7, 0x0296a82a, 0x0243a109, 0x02a4b4f1, 0x008349ae, 0x01a6826c, 0x00c45089, 0x0269364d, 0x003df5b1}}, Y: Field{[10]uint32{0x039d3470, 0x019e9721, 0x03d1636f, 0x03d12c32, 0x031ff47c, 0x02cf1d86, 0x027d160c, 0x00e31401, 0x0177b425, 0x00056aec}}}, + {X: Field{[10]uint32{0x01352587, 0x019bc9df, 0x03f0dcb4, 0x019116d5, 0x01e50a7e, 0x000af488, 0x0066e00c, 0x00a31e2c, 0x030a87dd, 0x001ef134}}, Y: Field{[10]uint32{0x00c294d4, 0x032ae5b4, 0x0152ec68, 0x030481ad, 0x026efbc9, 0x032c1287, 0x026e0c9f, 0x00059369, 0x00542e7e, 0x003d3b52}}}, + {X: Field{[10]uint32{0x02316ef1, 0x01250ec7, 0x009d7856, 0x0086d094, 0x01c200eb, 0x027c818a, 0x005dfb95, 0x02fb9b09, 0x0184b046, 0x00155109}}, Y: Field{[10]uint32{0x00580d82, 0x000c6a52, 0x02280905, 0x018b4676, 0x02a29c41, 0x000fcb93, 0x026353a1, 0x007b6599, 0x0171c811, 0x000b8aaa}}}, + {X: Field{[10]uint32{0x01dce1eb, 0x01a7992c, 0x02dccbcd, 0x01ca107c, 0x020923f8, 0x02a32996, 0x0224c973, 0x0240f9c4, 0x00c0de88, 0x00239f7e}}, Y: Field{[10]uint32{0x01d2a0cc, 0x0390f049, 0x0066252a, 0x0388d325, 0x03c31205, 0x007eea36, 0x0147873f, 0x01b5479c, 0x00839ae8, 0x0039054c}}}, + {X: Field{[10]uint32{0x0251de8f, 0x011bd471, 0x024915d5, 0x0324d6f6, 0x01b84a9b, 0x017eb81e, 0x0169d066, 0x02a86095, 0x01dc69d8, 0x0019c8c8}}, Y: Field{[10]uint32{0x03ef005f, 0x00f5bdb9, 0x00188d33, 0x03c5acd3, 0x02f977b1, 0x000e9bbb, 0x0009ab18, 0x0225f6fa, 0x030b8708, 0x0022b590}}}, + {X: Field{[10]uint32{0x01ac3abc, 0x003d1ca2, 0x01bfc2d2, 0x026bda4f, 0x001b8beb, 0x02175da6, 0x00327182, 0x026c0148, 0x03c143e9, 0x003d38ae}}, Y: Field{[10]uint32{0x01651a2a, 0x02fc2c57, 0x03a897ea, 0x00f8817a, 0x036d80e9, 0x0033509b, 0x0322b7f7, 0x003aacb9, 0x00f5dc33, 0x00395264}}}, + {X: Field{[10]uint32{0x0139ffff, 0x004d3c43, 0x01ad8009, 0x0119ad7f, 0x0272694f, 0x00170582, 0x03c72758, 0x00963241, 0x025fc6d2, 0x0016a8ea}}, Y: Field{[10]uint32{0x00ea9531, 0x03018012, 0x0244a7f4, 0x02632c1d, 0x023146aa, 0x03d9c330, 0x003e82b5, 0x02be96e1, 0x0170617e, 0x0008b5c8}}}, + {X: Field{[10]uint32{0x03e2e7ef, 0x03ac021e, 0x00383be3, 0x03a9170d, 0x009e9a31, 0x02de18cf, 0x033acbd1, 0x01266b1a, 0x03f9d2bf, 0x000d1d4b}}, Y: Field{[10]uint32{0x001104f8, 0x01b6d1cb, 0x03edd91a, 0x02a60c1a, 0x0339d73c, 0x03d9f22e, 0x037d0763, 0x03621947, 0x03742cf3, 0x002d4fa8}}}, + {X: Field{[10]uint32{0x03047327, 0x00d4d989, 0x02d6b517, 0x018b6cae, 0x01889770, 0x001a7871, 0x01b4c9b5, 0x0113dc36, 0x022402ea, 0x00359409}}, Y: Field{[10]uint32{0x02b16f2d, 0x00547f12, 0x02c288c7, 0x00861b6c, 0x02d80143, 0x015cdd5f, 0x034db3fb, 0x02a2fb00, 0x019af2f2, 0x0014bd72}}}, + {X: Field{[10]uint32{0x011f4cc9, 0x024f0c00, 0x032acb45, 0x02a7b576, 0x010915d4, 0x007ce6af, 0x024a0e0b, 0x00097f45, 0x02c6553d, 0x0014aceb}}, Y: Field{[10]uint32{0x00e2f8c9, 0x029dc5fd, 0x03ba2432, 0x02f3839e, 0x0377af18, 0x00c6c975, 0x00016839, 0x02caee75, 0x00021c17, 0x0014551d}}}, + {X: Field{[10]uint32{0x027ef9ca, 0x02551fa0, 0x01b174d9, 0x01bae93e, 0x02eaa0ec, 0x022de704, 0x03284186, 0x02489049, 0x037ef797, 0x00232ed9}}, Y: Field{[10]uint32{0x000183f2, 0x0243e601, 0x00e19ae5, 0x0262ffb7, 0x0292974f, 0x0046d82f, 0x0240ec64, 0x004c4ada, 0x01b8b07e, 0x0028ca02}}}, + {X: Field{[10]uint32{0x0131d47b, 0x01c938f5, 0x022487f1, 0x035b0c5e, 0x013f89f2, 0x01d1cd2e, 0x00b1564d, 0x03c5f7a5, 0x01e0e2ee, 0x00363d57}}, Y: Field{[10]uint32{0x02b7d770, 0x00fa4b26, 0x02930052, 0x01317821, 0x00fa7dc6, 0x009c7993, 0x0016f71f, 0x018dc381, 0x02f5da57, 0x003a7f51}}}, + {X: Field{[10]uint32{0x016b6fdb, 0x0133d88d, 0x02b79d0f, 0x03b7b52e, 0x03a4ddb8, 0x01ddc5a7, 0x01573014, 0x02cc7fe7, 0x01bbfaa2, 0x003e9bf2}}, Y: Field{[10]uint32{0x0357d494, 0x01083803, 0x01b331b4, 0x033e7de0, 0x0043a2ad, 0x012c4476, 0x02fd1e4d, 0x01e431eb, 0x03cddfdd, 0x002dbfd5}}}, + {X: Field{[10]uint32{0x01b58e9a, 0x00fc2758, 0x02ae6bb9, 0x005d94f9, 0x00f93590, 0x02eb4126, 0x03752d9a, 0x03b765a7, 0x028ce748, 0x0008e7c0}}, Y: Field{[10]uint32{0x00f8b516, 0x013a3b05, 0x02f7c064, 0x028a46f6, 0x01d55c8a, 0x02dec50b, 0x02463b7b, 0x03dae9ee, 0x02b78831, 0x0005f7ff}}}, + {X: Field{[10]uint32{0x025e4f3b, 0x03e3dd25, 0x017bd99a, 0x00523c96, 0x00ecad3c, 0x00e26ee9, 0x0071db05, 0x025dbe67, 0x03fb728d, 0x000bbdb2}}, Y: Field{[10]uint32{0x01b0fd00, 0x006d83de, 0x00273b41, 0x010b3c5d, 0x03deeef5, 0x0364e8de, 0x01ebe8c1, 0x001e30fc, 0x03a7a382, 0x0006689e}}}, + {X: Field{[10]uint32{0x03064a0e, 0x025d764c, 0x0343698b, 0x011f614d, 0x021a4292, 0x00dde1c7, 0x03042f13, 0x00c57a23, 0x032b9af8, 0x0025cb5c}}, Y: Field{[10]uint32{0x024fd28b, 0x02bd36ea, 0x021d4f40, 0x00fc97f7, 0x02a5c2ae, 0x012f2ee8, 0x02380fee, 0x00ee1d02, 0x03baba4c, 0x000c2054}}}, + {X: Field{[10]uint32{0x02062a4c, 0x03c9d1db, 0x02ed33c4, 0x03b6bd08, 0x02e788bc, 0x0215052f, 0x03aa2951, 0x0263c60c, 0x0334ba49, 0x000f4de2}}, Y: Field{[10]uint32{0x02c4c8a3, 0x03686a3c, 0x0017093e, 0x00e34dd6, 0x013c3d52, 0x027dd700, 0x0087b502, 0x03e46602, 0x019c9217, 0x0011a915}}}, + {X: Field{[10]uint32{0x015c3087, 0x03e20b4e, 0x011e376b, 0x03c9f591, 0x02b13d70, 0x02f8ecd8, 0x032b289a, 0x02ceabf4, 0x003b1fc1, 0x003eec80}}, Y: Field{[10]uint32{0x00dfdabd, 0x028c5701, 0x00a81653, 0x00753906, 0x03f28e5b, 0x0305f6c0, 0x02b96bb9, 0x00d8a933, 0x02a5c462, 0x0025f219}}}, + {X: Field{[10]uint32{0x037a0471, 0x0137a3e1, 0x0247e6e1, 0x02debed6, 0x00295efd, 0x016389b1, 0x03d27a92, 0x02c7e802, 0x014e8eea, 0x0000a3ea}}, Y: Field{[10]uint32{0x01d23276, 0x016a4242, 0x022a5514, 0x0065345d, 0x03622219, 0x0233a743, 0x007b5e20, 0x03a3cf03, 0x010af2ee, 0x003dd867}}}, + {X: Field{[10]uint32{0x01308ae9, 0x033283be, 0x00f25c12, 0x00cc21e6, 0x014be272, 0x03ea3f8a, 0x0227ede6, 0x030455c5, 0x02857eb9, 0x0011c228}}, Y: Field{[10]uint32{0x024fa449, 0x00dae472, 0x00c3550e, 0x019821ea, 0x02854034, 0x02a4b3d5, 0x020ab601, 0x00e642cb, 0x01642e77, 0x003cd7e6}}}, + {X: Field{[10]uint32{0x0048a62f, 0x013cbe26, 0x02c6a636, 0x032cdad8, 0x02a82427, 0x00f3bb5b, 0x00903dcb, 0x02e1d362, 0x00976ff4, 0x0024d020}}, Y: Field{[10]uint32{0x015f3c6f, 0x033ed8fa, 0x020aeff3, 0x012262f1, 0x03daf64d, 0x0282eafd, 0x032d4fe0, 0x019d926a, 0x0162d4e2, 0x0038969a}}}, + {X: Field{[10]uint32{0x020ddf9a, 0x01676f1c, 0x03cac039, 0x037495b2, 0x039e0d24, 0x02959988, 0x0195da93, 0x00072b8c, 0x03a08182, 0x003d290a}}, Y: Field{[10]uint32{0x02000f86, 0x0349f802, 0x0396a60f, 0x0239c8c3, 0x0110bd4c, 0x01ce44a1, 0x01194afe, 0x03bfc1d7, 0x03cc0be3, 0x0023f49b}}}, + {X: Field{[10]uint32{0x03a6240c, 0x006c59b8, 0x009919c5, 0x03bed06c, 0x03791cac, 0x025f82a5, 0x0339ef61, 0x03350033, 0x0216e65b, 0x00316b69}}, Y: Field{[10]uint32{0x016eb8c3, 0x000229fe, 0x011a04a7, 0x01e9834d, 0x01cc2678, 0x02441aba, 0x01b0b323, 0x0318b721, 0x0168fe41, 0x00393197}}}, + {X: Field{[10]uint32{0x00c640e7, 0x02b84020, 0x002baca2, 0x01215844, 0x01e8b1fa, 0x00186969, 0x017c62e5, 0x03646f2f, 0x02c3d3f1, 0x001f064f}}, Y: Field{[10]uint32{0x03873ccd, 0x01672b65, 0x0333a26b, 0x01a0752c, 0x0103b8e0, 0x02294da1, 0x000ff310, 0x0023cf90, 0x00955114, 0x00331f3e}}}, + {X: Field{[10]uint32{0x011bd3c3, 0x0000ac2b, 0x016f1d96, 0x01547b1c, 0x0122b763, 0x039a8706, 0x01656293, 0x03c4a0c8, 0x01438e7c, 0x001dd509}}, Y: Field{[10]uint32{0x03d2137f, 0x02fe0022, 0x007c4deb, 0x00c80306, 0x01edf7d9, 0x022182be, 0x006eec20, 0x00def864, 0x029d212c, 0x000dd1c5}}}, + {X: Field{[10]uint32{0x03d90992, 0x02643d89, 0x02c5a3b9, 0x010f9536, 0x00bb48ff, 0x002af46a, 0x01c0f7f9, 0x039e1be9, 0x0399fa75, 0x0024b754}}, Y: Field{[10]uint32{0x0311b7ba, 0x0152484f, 0x029a406e, 0x00c664cb, 0x00ee4932, 0x031b14d2, 0x025c824a, 0x020f830b, 0x028ef937, 0x00172c6f}}}, + {X: Field{[10]uint32{0x0293157d, 0x01b77bf5, 0x00b376eb, 0x029ede87, 0x004f66e7, 0x0294cbf8, 0x03550532, 0x03ae4042, 0x0028468e, 0x00305dc2}}, Y: Field{[10]uint32{0x019a2e11, 0x01f492a0, 0x02bc2d2e, 0x0269de9d, 0x02070e5e, 0x0186b928, 0x029e262f, 0x01f51ff4, 0x003da014, 0x00036959}}}, + {X: Field{[10]uint32{0x036378c8, 0x03f7732b, 0x00ad533c, 0x0396fa2a, 0x01a8baab, 0x0044e4bf, 0x009a5341, 0x03948919, 0x0116e90a, 0x0004dcb8}}, Y: Field{[10]uint32{0x00346af9, 0x00adb972, 0x004d6e9b, 0x03ccaf16, 0x011d0a1c, 0x02369bd1, 0x038c2aaf, 0x01d6ef70, 0x00a26957, 0x0017bef5}}}, + {X: Field{[10]uint32{0x01dda936, 0x00b61a99, 0x00c008f3, 0x03eb840e, 0x0105e2b7, 0x03cc24a7, 0x01520097, 0x028acaf3, 0x021e9fa1, 0x000aef7c}}, Y: Field{[10]uint32{0x039d45ec, 0x0280b24c, 0x0364cb0b, 0x0331610e, 0x011806eb, 0x02a20cd8, 0x02c0dcd2, 0x02f77185, 0x01986008, 0x00146de2}}}, + {X: Field{[10]uint32{0x013005e1, 0x010e2f5d, 0x03f7f6a7, 0x01f09bb8, 0x039b63cc, 0x01bc8485, 0x0230d49e, 0x017b5de0, 0x00a4d049, 0x000d9a53}}, Y: Field{[10]uint32{0x00bc0af8, 0x02a8345c, 0x039075f5, 0x02da56d7, 0x03a87f48, 0x00635499, 0x031e17db, 0x02c4ccff, 0x03f3bbdc, 0x000b9278}}}, + {X: Field{[10]uint32{0x032013b8, 0x01225600, 0x027e85e6, 0x01cdaee2, 0x036fbc13, 0x004f12ab, 0x0113bf8d, 0x03850e9a, 0x00b1dc9c, 0x00090f61}}, Y: Field{[10]uint32{0x027f28bf, 0x02af56db, 0x02b91108, 0x020cb7ff, 0x0021a3dd, 0x037b1784, 0x023c2dc6, 0x031c77ff, 0x03adb6be, 0x0000e4c5}}}, + {X: Field{[10]uint32{0x0191ec92, 0x02550acb, 0x0185de03, 0x037bc641, 0x020ba6df, 0x0284aa3f, 0x00eab821, 0x03cfda0e, 0x03875255, 0x00076220}}, Y: Field{[10]uint32{0x0324b489, 0x0080dfcc, 0x012bc46c, 0x02b76f64, 0x039ccabd, 0x00bc2bbc, 0x0233538d, 0x03e05575, 0x03e2e919, 0x002a74e2}}}, + {X: Field{[10]uint32{0x01be3765, 0x01be6b2c, 0x00955645, 0x00a1e920, 0x015512d6, 0x01d0dd47, 0x0160e2aa, 0x00cddbdd, 0x03754c0d, 0x000e6887}}, Y: Field{[10]uint32{0x0035e005, 0x00baa750, 0x031bde0b, 0x02c4e914, 0x01ef4950, 0x0156ed12, 0x00188c4d, 0x035e78ef, 0x00a52a7f, 0x000f3cc9}}}, + {X: Field{[10]uint32{0x002e21c8, 0x0249e3ad, 0x029e948d, 0x007e9595, 0x0118ab0a, 0x00b19fdb, 0x01394a95, 0x0177ca87, 0x020cd8e2, 0x002843fd}}, Y: Field{[10]uint32{0x01f9e991, 0x013d4083, 0x03237bfd, 0x00d7c0b2, 0x0389fd2b, 0x03e2451c, 0x000c0bd4, 0x00bbe077, 0x01633ce8, 0x002d17cb}}}, + {X: Field{[10]uint32{0x03bcbcb1, 0x031167ad, 0x022b25bb, 0x03377092, 0x01bb801a, 0x01ae5c7e, 0x011f7a64, 0x010bdc41, 0x03920d50, 0x002f09a5}}, Y: Field{[10]uint32{0x01235665, 0x00d6f5dc, 0x031f478b, 0x0378760f, 0x02c7fab6, 0x0248175f, 0x0301530c, 0x00818586, 0x01fc1c03, 0x002dc111}}}, + {X: Field{[10]uint32{0x0037cb95, 0x00709024, 0x00da99a6, 0x0123daf3, 0x025f0ef4, 0x0076d110, 0x02a7f95d, 0x00da0aa0, 0x01fefd5a, 0x000f5c9e}}, Y: Field{[10]uint32{0x00159740, 0x01980bdc, 0x021622de, 0x024c3364, 0x019a2ea1, 0x02e89253, 0x0342cca2, 0x016df88a, 0x02cae636, 0x0037d489}}}, + {X: Field{[10]uint32{0x00dbe588, 0x00b0b57a, 0x02e2fd55, 0x03439085, 0x01bc439a, 0x0146cf54, 0x036c2bd9, 0x02bc02e4, 0x0130ef92, 0x0038315b}}, Y: Field{[10]uint32{0x00555fee, 0x0212ceda, 0x03e0f064, 0x031e921c, 0x03f35189, 0x01d9a683, 0x01bd1862, 0x01711103, 0x037d02a7, 0x0030af45}}}, + {X: Field{[10]uint32{0x0073315b, 0x0266b89e, 0x03c15d99, 0x00c909ca, 0x00f0d6e3, 0x00d2ebc7, 0x00398306, 0x02fd4bf6, 0x00e52b7b, 0x0026fe58}}, Y: Field{[10]uint32{0x018d0405, 0x0188e1c7, 0x001c9066, 0x03df6732, 0x01551862, 0x02914dce, 0x0016cb16, 0x007732c0, 0x019d20e0, 0x0002ca1c}}}, + {X: Field{[10]uint32{0x00351198, 0x0120280d, 0x019dc0d5, 0x0117511f, 0x0287fffb, 0x011d5f83, 0x017a6b14, 0x029c6b98, 0x016be60b, 0x000837c6}}, Y: Field{[10]uint32{0x02eb07d8, 0x003387c9, 0x020ae996, 0x01610bfb, 0x02f12ba3, 0x02b42aea, 0x03d49539, 0x001c6e81, 0x01430c0d, 0x00271c8b}}}, + {X: Field{[10]uint32{0x029bac17, 0x01998772, 0x036330a2, 0x01c48ed7, 0x00455a5f, 0x02055260, 0x019693d0, 0x02d02e51, 0x01360208, 0x000210f0}}, Y: Field{[10]uint32{0x02f12078, 0x0137d1bc, 0x00edec9b, 0x008e19dc, 0x02d0c74f, 0x0076e950, 0x011820d3, 0x03f1034b, 0x018d9095, 0x00356d6f}}}, + {X: Field{[10]uint32{0x008d11a0, 0x02f1c890, 0x01c03e05, 0x032dcbe7, 0x03708a3f, 0x02d1b5bb, 0x024ee0ca, 0x007a837a, 0x00df702c, 0x0024426d}}, Y: Field{[10]uint32{0x02dc507a, 0x03b322e5, 0x03242cf4, 0x031e44ee, 0x007348e9, 0x030b0c09, 0x03151954, 0x020072d4, 0x02c18be5, 0x001d6ea8}}}, + {X: Field{[10]uint32{0x0191113c, 0x03bbcf16, 0x02db2329, 0x00b8dc9f, 0x018e5155, 0x0080f167, 0x02dff03c, 0x02a6ec4a, 0x01f5c960, 0x003c4334}}, Y: Field{[10]uint32{0x028c465a, 0x03c2fc57, 0x0151b8f3, 0x03191e58, 0x009d2e03, 0x03fb998b, 0x01746898, 0x036a9859, 0x00e16f65, 0x002a12b2}}}, + {X: Field{[10]uint32{0x00e747a8, 0x03f9ab44, 0x03a071ea, 0x03437d62, 0x010ae0d6, 0x02297d4e, 0x0077b69a, 0x0180beb4, 0x013cffd3, 0x0027c1dc}}, Y: Field{[10]uint32{0x03ee867b, 0x03579723, 0x00afe58c, 0x00e95e5c, 0x01cbb4ea, 0x020be3b0, 0x003d7357, 0x02420f37, 0x007342b5, 0x002b7f32}}}, + {X: Field{[10]uint32{0x0195801a, 0x018cd0b3, 0x019f3640, 0x01b2c483, 0x005ce9ec, 0x03fe25e3, 0x032b870f, 0x015cd04e, 0x010e3290, 0x001b4767}}, Y: Field{[10]uint32{0x0031018f, 0x0153e31a, 0x010efba1, 0x025e48b9, 0x0325a3f5, 0x00eef738, 0x0345f7c2, 0x02d80935, 0x00a895d3, 0x001942f9}}}, + {X: Field{[10]uint32{0x00dcbd82, 0x0083319b, 0x03fa7128, 0x026771d9, 0x015c649f, 0x0387ec52, 0x027791c7, 0x033251e8, 0x01a56b3a, 0x00125c61}}, Y: Field{[10]uint32{0x03e6568c, 0x01aa5443, 0x01c3df5b, 0x02fdd060, 0x00f33ce5, 0x039d5968, 0x00078b2f, 0x0386c5f9, 0x037c11da, 0x001f5446}}}, + {X: Field{[10]uint32{0x000a743f, 0x0153fcc4, 0x030a2c31, 0x02f85291, 0x019a35f7, 0x00b361f0, 0x01b8bc75, 0x03ae7137, 0x00f9848e, 0x003ffdce}}, Y: Field{[10]uint32{0x032c38ec, 0x03fcdccb, 0x01df57bd, 0x02685c21, 0x00211b97, 0x01171628, 0x0037cdcf, 0x00f25dda, 0x0255cd91, 0x00041ae2}}}, + {X: Field{[10]uint32{0x001b4830, 0x024086e6, 0x00e38ccb, 0x03d177f2, 0x0141899e, 0x01f58005, 0x026876a3, 0x011b2d11, 0x01a48d35, 0x000c80e4}}, Y: Field{[10]uint32{0x0251b102, 0x01c48159, 0x0000f09c, 0x01f798ce, 0x0323fa2d, 0x015c1ed2, 0x002f3032, 0x0250479d, 0x0030b455, 0x0011bd8c}}}, + {X: Field{[10]uint32{0x0185fe9e, 0x005b8017, 0x013f9adf, 0x001848a0, 0x00558791, 0x01d8c7c6, 0x0137f7fb, 0x03a2349a, 0x0240a925, 0x002f9133}}, Y: Field{[10]uint32{0x036e1dc4, 0x02c0998a, 0x0089324d, 0x032a6906, 0x02ca6948, 0x03d12db8, 0x02806d4b, 0x01b719f9, 0x01e7d22e, 0x0005d56b}}}, + {X: Field{[10]uint32{0x0333ddae, 0x00810d73, 0x012ddeeb, 0x002d0cea, 0x03da6aa8, 0x019bf0a8, 0x03b05314, 0x035827e0, 0x02b158dd, 0x00234fc1}}, Y: Field{[10]uint32{0x0337af63, 0x011c1752, 0x01f2c4c7, 0x0106630f, 0x02f1d0a6, 0x02f4ba50, 0x036e5f4d, 0x0144eee2, 0x0299efde, 0x000b5552}}}, + {X: Field{[10]uint32{0x01596729, 0x03aa11a4, 0x02627210, 0x01d1d0ad, 0x00d0c71d, 0x00153f30, 0x01c1cb3a, 0x03d54c95, 0x039cf258, 0x003e0529}}, Y: Field{[10]uint32{0x032d867d, 0x004fdd68, 0x002dc318, 0x022bb7ae, 0x010271ce, 0x0347cf51, 0x0080c42f, 0x02d2c88f, 0x0095be48, 0x0000467f}}}, + {X: Field{[10]uint32{0x0142fb60, 0x0399097a, 0x03ec8109, 0x03efbe45, 0x01d77e57, 0x038ab4c1, 0x0262bfbe, 0x03c76d76, 0x01461c37, 0x00257a3f}}, Y: Field{[10]uint32{0x00e2db93, 0x000c0a82, 0x00d09a03, 0x03f8c1ad, 0x01d3d5b1, 0x002d162e, 0x01ace316, 0x033686a9, 0x031edfdb, 0x003770a2}}}, + {X: Field{[10]uint32{0x03981e77, 0x02ac3a29, 0x02149e2d, 0x0303d0db, 0x026f4e5c, 0x03f08209, 0x0320604c, 0x02205af1, 0x03fc47e1, 0x00301950}}, Y: Field{[10]uint32{0x03021441, 0x00d20c65, 0x0234ee66, 0x00c45fb1, 0x01281854, 0x00653327, 0x034819ac, 0x029f0844, 0x0065f3a4, 0x000881c1}}}, + {X: Field{[10]uint32{0x00d5c68e, 0x025c21ad, 0x001caa2b, 0x0142f580, 0x010fd5b0, 0x037b6138, 0x014d116b, 0x02bbe928, 0x015b3716, 0x001260f6}}, Y: Field{[10]uint32{0x03f0a279, 0x036b8b01, 0x01b0280c, 0x0299beb0, 0x00f5e609, 0x02f4efbf, 0x03d47bce, 0x033450cc, 0x026da2ef, 0x0004dcd0}}}, + {X: Field{[10]uint32{0x02afe6ab, 0x0332560f, 0x03ef61fd, 0x03b79adc, 0x03ad8054, 0x01782143, 0x022cd092, 0x012e5cee, 0x00c692e8, 0x0028af57}}, Y: Field{[10]uint32{0x02a5ce2b, 0x02c9d9f9, 0x02a4e4f0, 0x025e5e56, 0x0133d8d7, 0x027e0093, 0x019011b9, 0x006c7985, 0x038af914, 0x003329b9}}}, + {X: Field{[10]uint32{0x036d741a, 0x026353da, 0x02b60bf6, 0x0098c45e, 0x00b8f852, 0x00d9f421, 0x0076281b, 0x0139ce54, 0x0231a18f, 0x00187264}}, Y: Field{[10]uint32{0x026cbfe5, 0x0102051b, 0x019299d3, 0x02c19f52, 0x01af886d, 0x02823006, 0x00616090, 0x0074c192, 0x03979e7f, 0x00208c52}}}, + {X: Field{[10]uint32{0x02b34304, 0x0182ff5a, 0x00db73ed, 0x00bdb1af, 0x02d4072a, 0x0244cc86, 0x03114fc7, 0x014a64e9, 0x03ef32c5, 0x001296b3}}, Y: Field{[10]uint32{0x020c03c9, 0x006c15a6, 0x024da9f6, 0x02252bfe, 0x0301323e, 0x012c9b6f, 0x03f9f296, 0x0166c9a6, 0x0229c068, 0x0001ca56}}}, + {X: Field{[10]uint32{0x037f4023, 0x03d6da2e, 0x02d487d4, 0x004d085a, 0x02604e50, 0x0197b2b1, 0x036dcb6c, 0x012530ac, 0x0355866f, 0x0038119d}}, Y: Field{[10]uint32{0x00b336b3, 0x01690b0c, 0x02029d9e, 0x01d4a3b3, 0x01ae9459, 0x0098626b, 0x032f9558, 0x03e86fd4, 0x03c5974d, 0x0037ab40}}}, + {X: Field{[10]uint32{0x03215ea7, 0x03034aee, 0x0059640d, 0x01808211, 0x01c4e8be, 0x016c788c, 0x014ca74b, 0x017f7d6d, 0x0305c926, 0x001a1bf7}}, Y: Field{[10]uint32{0x017ea7da, 0x018794f5, 0x01710b65, 0x03cb1640, 0x03c93723, 0x03fcd9de, 0x02f950eb, 0x02e5d02b, 0x021cedf9, 0x003d350f}}}, + {X: Field{[10]uint32{0x03d21253, 0x017b2ee2, 0x01cb9fce, 0x009347c5, 0x03e2bcd9, 0x00365b4b, 0x022b7d7b, 0x02c833a9, 0x018500f9, 0x000491da}}, Y: Field{[10]uint32{0x03522004, 0x03785b4a, 0x03842e32, 0x03c90f75, 0x033f1950, 0x010e2702, 0x027b356b, 0x013f190e, 0x00b39e90, 0x0034d0df}}}, + {X: Field{[10]uint32{0x02d17b1b, 0x0220098a, 0x0324e453, 0x007b4be9, 0x03b5eb1e, 0x0027d95e, 0x03322910, 0x0326cb96, 0x00ec9a87, 0x00195af7}}, Y: Field{[10]uint32{0x012fa64d, 0x00f738be, 0x01d116aa, 0x00c345f0, 0x030cdfc8, 0x03f7023f, 0x03f704b3, 0x0393dfd8, 0x010c47b6, 0x0031dd23}}}, + {X: Field{[10]uint32{0x0083e4b5, 0x02fae5ad, 0x0004c3ae, 0x00f983af, 0x027a3d40, 0x020f3b44, 0x0279b244, 0x00584832, 0x010e0f72, 0x0016dfdc}}, Y: Field{[10]uint32{0x03b08080, 0x03dca12f, 0x0386b698, 0x01caf65a, 0x0011db4b, 0x0396a7bb, 0x00196e8d, 0x022bb98d, 0x03a7f068, 0x0006d455}}}, + {X: Field{[10]uint32{0x01e6b4da, 0x034f4128, 0x00deabc8, 0x00f6074b, 0x01254521, 0x003e4361, 0x015bf184, 0x029bd55e, 0x02d0552b, 0x002ff299}}, Y: Field{[10]uint32{0x01754e75, 0x01b746bc, 0x0069084b, 0x0282f776, 0x00223043, 0x0032ce84, 0x00c46383, 0x01095f01, 0x00cc290d, 0x0012442c}}}, + {X: Field{[10]uint32{0x00496f16, 0x01980ca2, 0x009247f5, 0x006f3b1c, 0x001447c1, 0x0015ef45, 0x018f8ef2, 0x032ef91e, 0x028fb79d, 0x00198fe9}}, Y: Field{[10]uint32{0x03c41786, 0x009ea9a0, 0x03951f2b, 0x028aacc3, 0x00a42597, 0x00747d08, 0x005598a9, 0x02f48f62, 0x02fa1f3b, 0x000eb38b}}}, + {X: Field{[10]uint32{0x015c4321, 0x017c7792, 0x03004608, 0x02b82033, 0x017c1675, 0x0379a289, 0x02f2f86e, 0x02e3c87f, 0x03338a3d, 0x0009f338}}, Y: Field{[10]uint32{0x00d373ae, 0x01aa0ac9, 0x01c294b1, 0x027f68aa, 0x037aefa6, 0x018f53f7, 0x0144a002, 0x0391cbac, 0x018c8bab, 0x001c55af}}}, + {X: Field{[10]uint32{0x00bd9560, 0x016f1359, 0x00ce35aa, 0x012c703a, 0x03b727be, 0x00f15d7b, 0x027940e1, 0x017026f8, 0x02c452ec, 0x00352701}}, Y: Field{[10]uint32{0x038d18b0, 0x01d48e39, 0x033c2f51, 0x022551b7, 0x015d7ad7, 0x02680d8d, 0x0266469f, 0x004029ca, 0x0118b298, 0x000b194d}}}, + {X: Field{[10]uint32{0x004ad08a, 0x0005fdd5, 0x01129cfa, 0x03f442bf, 0x023d7bf4, 0x01034ef5, 0x00ecd251, 0x02009b4f, 0x007ebd02, 0x001a5820}}, Y: Field{[10]uint32{0x020e7c7c, 0x02bab024, 0x03f4cf7b, 0x020eaa6a, 0x036f9a63, 0x02f69af7, 0x03cb5465, 0x03eb9cad, 0x004f28be, 0x0029e141}}}, + {X: Field{[10]uint32{0x01f8faa1, 0x02d4c94f, 0x03aa1ede, 0x03156953, 0x02fc9263, 0x0295f6eb, 0x0375abeb, 0x00e9c68e, 0x033654b6, 0x0020e0af}}, Y: Field{[10]uint32{0x0049b011, 0x003f3c42, 0x026dcb6d, 0x00f6515d, 0x02dc9bef, 0x0189d987, 0x021da269, 0x032d4d11, 0x01dcc319, 0x003817ae}}}, + {X: Field{[10]uint32{0x02b0bffb, 0x0168f452, 0x0379acc4, 0x026bd814, 0x02b7e705, 0x02a4cbc8, 0x008cca9f, 0x021db9e3, 0x037930ec, 0x00200ee4}}, Y: Field{[10]uint32{0x01e5790f, 0x02bc1195, 0x01152b52, 0x03745f34, 0x01cb90d1, 0x01e1a51c, 0x03ec7d0b, 0x03470b1b, 0x001c5202, 0x001f6c8d}}}, + {X: Field{[10]uint32{0x02c5292c, 0x022e8474, 0x03e08f99, 0x003a2591, 0x02cb78fb, 0x01cfeac0, 0x0165ff4f, 0x02ba7c44, 0x01290ab6, 0x0032d36c}}, Y: Field{[10]uint32{0x03d1c9c2, 0x01506235, 0x02e9ef61, 0x00235d53, 0x02745c24, 0x02ecd9bf, 0x0280ad65, 0x00e12ed6, 0x039a1776, 0x000332bb}}}, + {X: Field{[10]uint32{0x00d115a2, 0x014ab37b, 0x0179aa81, 0x01ee1325, 0x038fd6af, 0x0301c3f1, 0x038be8af, 0x03d9c8e0, 0x035750e9, 0x003eaca1}}, Y: Field{[10]uint32{0x00b3f065, 0x00452430, 0x024956c3, 0x00c7671b, 0x03764ee9, 0x02ba14c0, 0x017d3b83, 0x0158b54e, 0x002889cd, 0x003567f8}}}, + {X: Field{[10]uint32{0x0249bbc1, 0x00092159, 0x0376c198, 0x01335a96, 0x02fbdf84, 0x0020cf84, 0x02e3f036, 0x03b8f43d, 0x02baf870, 0x003761e7}}, Y: Field{[10]uint32{0x0143c55a, 0x011c5b26, 0x038f7309, 0x00ab1a94, 0x00b041a1, 0x0355a5b2, 0x03a324c1, 0x01704775, 0x00c3a99a, 0x0039eec1}}}, + {X: Field{[10]uint32{0x00f8016e, 0x03330120, 0x00d8ed00, 0x01d06d7e, 0x031df68f, 0x0095cac4, 0x01319d57, 0x01a87b6a, 0x03be29b0, 0x001ea92b}}, Y: Field{[10]uint32{0x03fe7130, 0x0252c5d4, 0x00d2dc9d, 0x00364df0, 0x02423fd0, 0x0080ae5c, 0x002e3c13, 0x02161dfc, 0x029fb77b, 0x00057de6}}}, + {X: Field{[10]uint32{0x0039f890, 0x03933163, 0x0168ba19, 0x03a455c7, 0x00c34354, 0x00b5b998, 0x03fee64f, 0x00c99575, 0x03f5876a, 0x0024517c}}, Y: Field{[10]uint32{0x0285d8ff, 0x03368a2c, 0x036c998e, 0x00755d9a, 0x0337650c, 0x0284235b, 0x009ba7fd, 0x027f416f, 0x015dcf36, 0x0011782a}}}, + {X: Field{[10]uint32{0x0111ac9e, 0x03dd03d1, 0x0131713d, 0x03224688, 0x00a5a7f6, 0x001dfcf7, 0x0337afa2, 0x0004347b, 0x035236fb, 0x0015142d}}, Y: Field{[10]uint32{0x026ba175, 0x03c0603f, 0x01ef08b6, 0x00e99c42, 0x0313ff56, 0x037b4b5e, 0x021084d3, 0x03e1b537, 0x015762be, 0x0029f1fb}}}, + {X: Field{[10]uint32{0x00666a0f, 0x00b3e230, 0x001b84c3, 0x01bf44d4, 0x01bbf276, 0x0105f41d, 0x00256d67, 0x0378b32e, 0x01725e48, 0x002e9b03}}, Y: Field{[10]uint32{0x0125e442, 0x0061bcf9, 0x006405ed, 0x012e46f3, 0x02bdecd6, 0x0296640c, 0x02da6693, 0x00a67d43, 0x01327137, 0x00334aa4}}}, + {X: Field{[10]uint32{0x0205c921, 0x036dece5, 0x00b0553a, 0x0276ab56, 0x01d25a64, 0x0263ef7d, 0x011006b7, 0x03aed1bf, 0x01ff1fee, 0x002e5208}}, Y: Field{[10]uint32{0x01077c05, 0x03162afe, 0x0365a72d, 0x02bbbb10, 0x01f45ccf, 0x015d2bf3, 0x003d950c, 0x024a8b1f, 0x03a079bb, 0x00085626}}}, + {X: Field{[10]uint32{0x01a0681d, 0x0221e7c3, 0x01f8198f, 0x037a4f58, 0x00432f14, 0x02a58f32, 0x00e0d7a5, 0x01f1dadc, 0x0046497f, 0x001190d9}}, Y: Field{[10]uint32{0x01c83a5f, 0x03982352, 0x012398a3, 0x0396cfb2, 0x0348c367, 0x03a89797, 0x01a8aab5, 0x03604043, 0x024e90c4, 0x000a4d12}}}, + {X: Field{[10]uint32{0x00c1ae1d, 0x02c2ce39, 0x00d0802b, 0x005d6ea8, 0x01bd3be9, 0x02f2c33c, 0x019185b7, 0x0042f925, 0x02c6a2e2, 0x002f6396}}, Y: Field{[10]uint32{0x01b1fa19, 0x03c22a8b, 0x000a94ed, 0x0069f0fb, 0x0269c6f7, 0x03b22229, 0x03773a5e, 0x025d5769, 0x03e46dcc, 0x001ace06}}}, + {X: Field{[10]uint32{0x01f22493, 0x03463fe6, 0x0231974c, 0x024ece50, 0x017fb645, 0x022b39db, 0x00c34055, 0x029e943d, 0x021ac428, 0x00309f07}}, Y: Field{[10]uint32{0x019cf57c, 0x013e4671, 0x004a4954, 0x03cf0178, 0x0025108a, 0x02a7d665, 0x031884cf, 0x01ece872, 0x0261c12f, 0x003f2575}}}, + {X: Field{[10]uint32{0x03eb30d5, 0x00ebc89d, 0x03c029e5, 0x00050103, 0x0044c17c, 0x0364119b, 0x028168ee, 0x01329549, 0x0161837e, 0x00285d95}}, Y: Field{[10]uint32{0x02c28eb5, 0x022d9b2d, 0x015aecfc, 0x01d743e8, 0x033032c7, 0x0039b8bd, 0x0255d0b3, 0x0222ff35, 0x01e2b8d4, 0x00228b7b}}}, + {X: Field{[10]uint32{0x01ddbea9, 0x03a63060, 0x02f93b03, 0x00de0c03, 0x00e9eea7, 0x01e2e8da, 0x029279f6, 0x0332461f, 0x030d35ca, 0x000afda4}}, Y: Field{[10]uint32{0x0225209d, 0x03e81a79, 0x00db46e2, 0x00c30d74, 0x02d0f3f9, 0x0232a385, 0x03ee5383, 0x022ec0ff, 0x01433aaa, 0x00228b53}}}, + {X: Field{[10]uint32{0x0077c8d7, 0x019a9c1a, 0x0056a6a0, 0x01680e96, 0x00a36d08, 0x019d5649, 0x03005f4d, 0x02bbf643, 0x03259cc5, 0x001d9a9d}}, Y: Field{[10]uint32{0x00049190, 0x03078cd2, 0x03dc4171, 0x0012fd02, 0x0090b46d, 0x03a4e3bc, 0x01bfad15, 0x038b9fc1, 0x00974fd9, 0x0036cfeb}}}, + {X: Field{[10]uint32{0x00461268, 0x024bfe46, 0x03242887, 0x038e6a44, 0x02134196, 0x025cca76, 0x00c333c0, 0x0087517f, 0x00cd953f, 0x00349698}}, Y: Field{[10]uint32{0x010c7863, 0x03c9339e, 0x0270f397, 0x026240d4, 0x00a07ad5, 0x008d4a60, 0x03874e71, 0x020d7f6e, 0x03e8bd04, 0x00226fca}}}, + {X: Field{[10]uint32{0x02d95d68, 0x03f90a72, 0x000b360d, 0x021a3286, 0x019bf569, 0x01997abf, 0x021f467b, 0x0096c99c, 0x029e8b71, 0x0031eca3}}, Y: Field{[10]uint32{0x0295c398, 0x030ea9e7, 0x02167b37, 0x00d1d91a, 0x009ec7bf, 0x02f291da, 0x03947ed8, 0x02d869c7, 0x0158b3a7, 0x0002b0a3}}}, + {X: Field{[10]uint32{0x0059bc24, 0x02cd375f, 0x03a97ce8, 0x01803c7d, 0x0120c291, 0x033f3a61, 0x022d7a74, 0x0230a6b6, 0x008ac61f, 0x0038a948}}, Y: Field{[10]uint32{0x01c70830, 0x0367d6cf, 0x00e4a880, 0x009dddff, 0x03a152ce, 0x03a438e0, 0x034483b4, 0x02281332, 0x02144970, 0x00037a2e}}}, + {X: Field{[10]uint32{0x02e205b1, 0x0112b7c4, 0x03ca53e8, 0x000620a1, 0x016976e0, 0x0150259f, 0x032b152a, 0x037e574e, 0x00cd02e8, 0x00387a39}}, Y: Field{[10]uint32{0x03bfc9e2, 0x03633bd0, 0x02491a77, 0x025fd51a, 0x020d34aa, 0x008cdc8f, 0x03f00918, 0x0151ef2c, 0x02f9cdc7, 0x002976f1}}}, + {X: Field{[10]uint32{0x012b6512, 0x0152fc27, 0x0375bea4, 0x02cee257, 0x023c3143, 0x03cec70a, 0x02284803, 0x013954ac, 0x02514a68, 0x002c83c2}}, Y: Field{[10]uint32{0x000d02c9, 0x0376a5ba, 0x02c31e0e, 0x02173513, 0x00f7c955, 0x0250681f, 0x000b0c31, 0x00345027, 0x0380676d, 0x002f0f6c}}}, + {X: Field{[10]uint32{0x0029d3ec, 0x029a5a83, 0x009499cf, 0x0326e5d2, 0x039582cb, 0x001eb25b, 0x00d9d8d4, 0x02fdde53, 0x0123b1ad, 0x002dc69a}}, Y: Field{[10]uint32{0x00b4f151, 0x03f38699, 0x03b1c89b, 0x03b9d9e7, 0x027b6d75, 0x00e31cb4, 0x03113c8d, 0x01563ee4, 0x03899d59, 0x001d4608}}}, + {X: Field{[10]uint32{0x03d3bb3f, 0x013571a9, 0x01a65200, 0x017c3677, 0x00a82f41, 0x01d595e2, 0x00ef76c0, 0x00e34633, 0x01ac68ba, 0x003291eb}}, Y: Field{[10]uint32{0x028701df, 0x02b41412, 0x0137842f, 0x0130e5a7, 0x02ccd845, 0x00597f56, 0x0035385e, 0x00ce0910, 0x00ab1b78, 0x0002f566}}}, + {X: Field{[10]uint32{0x0140e441, 0x03e6740b, 0x025eea45, 0x0313667d, 0x014fb989, 0x03757932, 0x034eeece, 0x03a7ba7e, 0x0148acee, 0x0017eb78}}, Y: Field{[10]uint32{0x033831f0, 0x00775335, 0x031cb5e6, 0x032ce50f, 0x0015afd1, 0x02374b00, 0x01104cac, 0x015606b1, 0x023ae82e, 0x002e9bf2}}}, + {X: Field{[10]uint32{0x025f84e9, 0x02b698ff, 0x0049e8ad, 0x014798ce, 0x02e834c8, 0x0073cc3e, 0x000ba01a, 0x033c0024, 0x01d214fc, 0x001d9f72}}, Y: Field{[10]uint32{0x00404639, 0x00c85799, 0x017d69ee, 0x03466b86, 0x0101a5bc, 0x03f5f2ff, 0x02b97a52, 0x003958b5, 0x0111aca3, 0x00231942}}}, + {X: Field{[10]uint32{0x024f06d9, 0x01c5e2df, 0x0286b91d, 0x035d1df9, 0x01523544, 0x030f01b6, 0x02a7648f, 0x00a88176, 0x0161445e, 0x0009fe3e}}, Y: Field{[10]uint32{0x02a73a60, 0x01f37f60, 0x00172042, 0x010886fa, 0x02379332, 0x02de7977, 0x0196bce6, 0x01efa5d5, 0x032782cd, 0x000e4442}}}, + {X: Field{[10]uint32{0x033de668, 0x000c594f, 0x035bc6a4, 0x02260e5c, 0x008a1b28, 0x01e77792, 0x024070bf, 0x01792eb6, 0x005b343b, 0x00237812}}, Y: Field{[10]uint32{0x02d5729d, 0x033eb883, 0x021431c2, 0x01ca0c0b, 0x0212fbba, 0x03164492, 0x011c1a44, 0x0383df5f, 0x03676f43, 0x00240c15}}}, + {X: Field{[10]uint32{0x012df0ff, 0x03973165, 0x01fe1b68, 0x0287bb25, 0x005b6af8, 0x039c030a, 0x038d3188, 0x03a2ba2a, 0x036c8770, 0x001790f6}}, Y: Field{[10]uint32{0x006c7aa6, 0x00a90e54, 0x01f90ae0, 0x00f4dc1d, 0x009aeebb, 0x0179671e, 0x02a10911, 0x02f3f8e8, 0x028dd85f, 0x001a2098}}}, + {X: Field{[10]uint32{0x01a4ed54, 0x0047d096, 0x037a0893, 0x00f3b7fa, 0x03610286, 0x00b7c508, 0x00af4e35, 0x00c0379f, 0x02ab4bf4, 0x001f6cae}}, Y: Field{[10]uint32{0x038e8a84, 0x0009bf85, 0x000cbd33, 0x01328f53, 0x01e553a8, 0x02164273, 0x03fbbcd6, 0x0112f8c0, 0x01a2fbbb, 0x000e1d58}}}, + {X: Field{[10]uint32{0x0196c6f1, 0x0134436e, 0x00bbefc0, 0x0332aee4, 0x00cdbefd, 0x00cb6cf9, 0x03df9e82, 0x01a21f47, 0x01253910, 0x0025b6a1}}, Y: Field{[10]uint32{0x03f9edcc, 0x00f4c026, 0x00509402, 0x024adff3, 0x0345948c, 0x0370cca1, 0x035d6513, 0x01cd067e, 0x02314912, 0x001949c6}}}, + {X: Field{[10]uint32{0x01d50613, 0x029e122b, 0x03b0081b, 0x003eb2e5, 0x0264cd4c, 0x00e2d217, 0x03a51fa8, 0x004a13d6, 0x01cb14eb, 0x00213bfc}}, Y: Field{[10]uint32{0x02febd9e, 0x01e314a9, 0x004fc7f5, 0x0044cbca, 0x03609f45, 0x033a0631, 0x01e602b6, 0x002a35ec, 0x01c8a654, 0x000249b2}}}, + {X: Field{[10]uint32{0x02adfbbe, 0x00665078, 0x017057fe, 0x02489756, 0x00416e6a, 0x02fe5280, 0x02e60007, 0x00a83fd7, 0x03718e2a, 0x0007ae58}}, Y: Field{[10]uint32{0x0005b855, 0x027da84c, 0x01bb009c, 0x008f3fc3, 0x02d3cf05, 0x00018e6a, 0x03d40115, 0x0377eb70, 0x02d89635, 0x00121c2a}}}, + {X: Field{[10]uint32{0x03bdc098, 0x01372e1d, 0x03fd8d45, 0x0287dda0, 0x03c75fd4, 0x02bc64f7, 0x01a8696b, 0x03cc1c6f, 0x036a6ea3, 0x000a6528}}, Y: Field{[10]uint32{0x03856766, 0x00b1312f, 0x02eb3fc8, 0x000c6dda, 0x009969bf, 0x025bf4fa, 0x006bd0be, 0x00f5335e, 0x00eea727, 0x0039197a}}}, + {X: Field{[10]uint32{0x0126c414, 0x01d63567, 0x03c00237, 0x032edfcb, 0x01d2b68f, 0x038b65f6, 0x01b115b5, 0x015e8b0a, 0x0370f3d3, 0x000979fe}}, Y: Field{[10]uint32{0x0356c4f2, 0x0099dcfc, 0x02631fed, 0x00c3beb2, 0x00206b73, 0x00ea1aae, 0x0130fa01, 0x02257afd, 0x0370a3bb, 0x00125668}}}, + {X: Field{[10]uint32{0x007c0623, 0x035624cd, 0x020ea0df, 0x01496221, 0x03c3945c, 0x0359af16, 0x030481a2, 0x01aef867, 0x039880bf, 0x003f0e1f}}, Y: Field{[10]uint32{0x009d67c4, 0x0198faed, 0x001ff16e, 0x01d03042, 0x027ba332, 0x00d1812a, 0x01d07af7, 0x03c0ca72, 0x000e83ca, 0x002275ee}}}, + {X: Field{[10]uint32{0x0201e1d4, 0x000ca53f, 0x03a99e2f, 0x02d00217, 0x00ef5c00, 0x03c5ddc8, 0x0220fa82, 0x0327f840, 0x0368c25f, 0x003142bc}}, Y: Field{[10]uint32{0x017579fb, 0x02532dae, 0x0131ba42, 0x003e5e32, 0x0327d9f1, 0x03a52bde, 0x012b80d9, 0x00c25024, 0x03264198, 0x0030ddde}}}, + {X: Field{[10]uint32{0x00041f94, 0x01d85f84, 0x01bea7c9, 0x0121553d, 0x00d7015c, 0x010697c8, 0x02003629, 0x0366ea8b, 0x0109d524, 0x00283e74}}, Y: Field{[10]uint32{0x010e9ad0, 0x00f18a9c, 0x019f1daf, 0x00e80e9a, 0x012eae92, 0x01915838, 0x0277ff2c, 0x0384200f, 0x0002daa5, 0x000a3147}}}, + {X: Field{[10]uint32{0x00316de1, 0x0218a8d2, 0x03a285da, 0x008f2f37, 0x032138bc, 0x0020012c, 0x03271389, 0x02dc2161, 0x02270058, 0x00107449}}, Y: Field{[10]uint32{0x001b9673, 0x037d3c1f, 0x02999d29, 0x029243ac, 0x00341d90, 0x03545764, 0x015f4513, 0x033b2572, 0x0029153b, 0x000189dc}}}, + {X: Field{[10]uint32{0x0299ca87, 0x003e159b, 0x0221cfb8, 0x02335875, 0x02577444, 0x00ceb6ce, 0x03afb77e, 0x03d50f64, 0x00cefe6c, 0x00251316}}, Y: Field{[10]uint32{0x004d66b5, 0x01cc5c0a, 0x03056e74, 0x022adf5e, 0x02329495, 0x01af2c88, 0x011c5576, 0x031c5f2a, 0x001c9b7f, 0x00301c7b}}}, + {X: Field{[10]uint32{0x02437145, 0x02afafef, 0x00635f2b, 0x01645ca4, 0x009a27be, 0x023baed6, 0x0029bf18, 0x01c73a70, 0x0312e06d, 0x000cc1ea}}, Y: Field{[10]uint32{0x0061d213, 0x01aa5272, 0x014c3c6b, 0x03425f61, 0x014a6966, 0x0227a602, 0x008dd9bf, 0x0242451d, 0x00b928cf, 0x0022270f}}}, + {X: Field{[10]uint32{0x01cb9ae6, 0x006dfcd1, 0x028acdee, 0x01c8b6da, 0x0272b745, 0x0090c1ed, 0x0203abd0, 0x00893932, 0x00111eb2, 0x0010aebc}}, Y: Field{[10]uint32{0x0212ee06, 0x0257ea8b, 0x00b11256, 0x0349cde7, 0x02879515, 0x02348b17, 0x0164bec3, 0x037a892d, 0x0128d608, 0x002fccb8}}}, + {X: Field{[10]uint32{0x0002c621, 0x01321531, 0x006bfe73, 0x03028af2, 0x01166c69, 0x0043445d, 0x03be8981, 0x012f4127, 0x02bbbe7b, 0x00215aea}}, Y: Field{[10]uint32{0x0112ac0c, 0x035d0612, 0x0321b943, 0x025e7b51, 0x011f8251, 0x0388a7a2, 0x0024161b, 0x007f4f35, 0x03c9b6d3, 0x000928c8}}}, + {X: Field{[10]uint32{0x024a9cd4, 0x01b60c34, 0x02c1c321, 0x03720172, 0x0195aeea, 0x03a0e0d3, 0x00c224ed, 0x0050f61d, 0x018ed998, 0x000e36f0}}, Y: Field{[10]uint32{0x027eae4a, 0x02247945, 0x00a03570, 0x03b9fe4d, 0x01271c6e, 0x0242ad71, 0x038e2eaa, 0x015de3a8, 0x0126f7e8, 0x0009cfb0}}}, + {X: Field{[10]uint32{0x0188dc59, 0x007ae052, 0x00d92c98, 0x019697d2, 0x015e24c0, 0x020dd2bc, 0x026bb20c, 0x008ca4c5, 0x005bffcd, 0x000d6772}}, Y: Field{[10]uint32{0x03bf39c6, 0x0058beaf, 0x0184ae58, 0x000fdded, 0x02c4a057, 0x010def7f, 0x0237d06e, 0x01622e40, 0x01f7deef, 0x0037977b}}}, + {X: Field{[10]uint32{0x023666ea, 0x028d6df1, 0x0283bb1c, 0x01d275fc, 0x031d872a, 0x0297cf69, 0x022f73a6, 0x007220f7, 0x0065e2e9, 0x003841a0}}, Y: Field{[10]uint32{0x03752cd9, 0x0347c05c, 0x00523c5e, 0x03eb2375, 0x01a7e155, 0x01da140d, 0x0128afaa, 0x0021461e, 0x0252b5df, 0x0020430e}}}, + {X: Field{[10]uint32{0x03b19d83, 0x02141b76, 0x033c70fd, 0x01b72f57, 0x00b56495, 0x03377f7f, 0x03171830, 0x032699b8, 0x037137e7, 0x00141d9f}}, Y: Field{[10]uint32{0x00d4fff8, 0x00e19928, 0x039fa5e3, 0x019d58f6, 0x02393b61, 0x03cb82b8, 0x03d24dd3, 0x017fb601, 0x015f5e9d, 0x003870b7}}}, + {X: Field{[10]uint32{0x02e65864, 0x02d66039, 0x00a725a0, 0x017fd4f6, 0x035e0127, 0x03f3a84d, 0x0216d0de, 0x020d57c4, 0x03f0cdf8, 0x001133b2}}, Y: Field{[10]uint32{0x011cd40e, 0x030eb5bd, 0x00d2e025, 0x008bc572, 0x02e8e3f0, 0x019ef18d, 0x0290550e, 0x03a6e7b8, 0x028e5094, 0x00011a55}}}, + {X: Field{[10]uint32{0x02aa18b3, 0x038d11e5, 0x005e886c, 0x024980b8, 0x0387ed8a, 0x02bf28ae, 0x02fe5976, 0x02c1fbe8, 0x00ea43cb, 0x00060c32}}, Y: Field{[10]uint32{0x031da49d, 0x0077610b, 0x01d658bf, 0x03ead511, 0x013c8ce2, 0x03e8c704, 0x03562037, 0x02bb9d9f, 0x0328e064, 0x0037d544}}}, + {X: Field{[10]uint32{0x019326c6, 0x0242a92f, 0x02b799bf, 0x03ab13e3, 0x00708245, 0x0107d3b9, 0x0033417a, 0x01eac947, 0x037a473a, 0x00163552}}, Y: Field{[10]uint32{0x009b2a85, 0x01168bb1, 0x027891ce, 0x024febd7, 0x02a16920, 0x02c72cb2, 0x00c331bf, 0x0381f329, 0x033815e2, 0x0028647c}}}, + {X: Field{[10]uint32{0x02c6792c, 0x024ad544, 0x01af7ba1, 0x01b913a0, 0x0170a18b, 0x00bf2618, 0x03af1044, 0x0204b980, 0x02049507, 0x003c3739}}, Y: Field{[10]uint32{0x03b966e4, 0x029ec26e, 0x015ce3ad, 0x02d31536, 0x004cc60e, 0x033c3d58, 0x0248df55, 0x01bb588f, 0x0221b5e8, 0x00308868}}}, + {X: Field{[10]uint32{0x01dd2ab5, 0x02e94156, 0x013d40d7, 0x033eb94a, 0x02e4b958, 0x0112c9ab, 0x02aaa046, 0x00c0aca1, 0x01e572c0, 0x0010bec2}}, Y: Field{[10]uint32{0x01f2299f, 0x0206f546, 0x00099437, 0x02a09d25, 0x03f46e1b, 0x020f9f45, 0x007ec769, 0x01a223ef, 0x0173a00e, 0x001e7041}}}, + {X: Field{[10]uint32{0x03502ecb, 0x034104bc, 0x005deea2, 0x02f222c0, 0x00935465, 0x0036b443, 0x028db25e, 0x00326a18, 0x0151ddae, 0x001eb7c5}}, Y: Field{[10]uint32{0x01acfd20, 0x01621bca, 0x01a9bb3c, 0x019e7651, 0x012e031e, 0x02744428, 0x01ef5c36, 0x03aa4832, 0x03a2143c, 0x00195f02}}}, + {X: Field{[10]uint32{0x002c7a5a, 0x03f6470a, 0x013454df, 0x0324a049, 0x013a7bfd, 0x03f0bd6f, 0x0271310a, 0x03da9b58, 0x00b956fd, 0x00375692}}, Y: Field{[10]uint32{0x00a52657, 0x03df305f, 0x021e385d, 0x03364685, 0x002ac6b0, 0x02564119, 0x03521072, 0x01fcdbea, 0x00372e06, 0x001ce434}}}, + {X: Field{[10]uint32{0x021466fe, 0x01b0b622, 0x0301d293, 0x00ec74d8, 0x0013ac76, 0x00134b38, 0x01c783b1, 0x011652f8, 0x00b51537, 0x0018c614}}, Y: Field{[10]uint32{0x0190882e, 0x03cc8a31, 0x03a8578b, 0x000addfb, 0x022016d2, 0x015ca6b3, 0x0241416c, 0x01f912a4, 0x021ea9b6, 0x00092433}}}, + {X: Field{[10]uint32{0x03a0bca5, 0x02c381bc, 0x028e0741, 0x01a6f71a, 0x00244668, 0x00e8f331, 0x0185cd58, 0x0088a6bb, 0x01e4d673, 0x000ccb8e}}, Y: Field{[10]uint32{0x017578e7, 0x01135217, 0x025aa602, 0x0037d351, 0x00b66ac3, 0x01d2b597, 0x018b1b40, 0x014ab829, 0x030360db, 0x00242103}}}, + {X: Field{[10]uint32{0x022f0c97, 0x0144e90d, 0x00980de7, 0x02ca479c, 0x01d72c0e, 0x00994cbc, 0x027224e8, 0x03870595, 0x0156f0c7, 0x00378065}}, Y: Field{[10]uint32{0x00411ea3, 0x002bb61a, 0x03e479af, 0x02f5925d, 0x01d75fa5, 0x018e094a, 0x022227a6, 0x02210105, 0x039d1cc9, 0x000e68f5}}}, + {X: Field{[10]uint32{0x00ed859f, 0x0128b2c9, 0x002a6809, 0x01b28fe4, 0x024f81b7, 0x006e0b91, 0x02ffbf26, 0x036a0031, 0x00c8e675, 0x00131130}}, Y: Field{[10]uint32{0x0245ac34, 0x00ad64c3, 0x0224663b, 0x025c68e8, 0x00c54978, 0x010eae2b, 0x03f28002, 0x01177b63, 0x02881ecc, 0x0016787b}}}, + {X: Field{[10]uint32{0x009286a2, 0x00d953cc, 0x03d28279, 0x02f844f9, 0x02a4e0dc, 0x017773b1, 0x01f4d1a8, 0x03867970, 0x01b80481, 0x003980ce}}, Y: Field{[10]uint32{0x009d9d59, 0x0229c1a9, 0x0372d1b0, 0x03e51cdf, 0x00bc58e3, 0x034a96a6, 0x01c7998e, 0x02507ed4, 0x02cca607, 0x002687ba}}}, + {X: Field{[10]uint32{0x00a25e66, 0x0340b0f6, 0x01be0d44, 0x015714a1, 0x010c6ad9, 0x0023ffb1, 0x00bc4727, 0x024bce7d, 0x02e30e72, 0x00043d0b}}, Y: Field{[10]uint32{0x00916a25, 0x02a5d73b, 0x01106034, 0x0037c069, 0x00183e13, 0x0259f3c5, 0x01d5f2bc, 0x038a3f6e, 0x01f053eb, 0x0001bcd9}}}, + {X: Field{[10]uint32{0x0329c445, 0x014f6199, 0x01548b6d, 0x02b964ea, 0x03703af3, 0x031635d2, 0x02fb0f31, 0x019a1df4, 0x01cad128, 0x001f824c}}, Y: Field{[10]uint32{0x036b0b0b, 0x00485d07, 0x03ffbf5a, 0x03e489dc, 0x00a9c34a, 0x0015bd32, 0x03caf7e8, 0x02d07598, 0x01fc75ea, 0x0001792e}}}, + {X: Field{[10]uint32{0x03963f22, 0x00450d55, 0x00f1c6a0, 0x03036c9e, 0x01b7f1ac, 0x020d8bdf, 0x014cd1a7, 0x00f1b3fc, 0x037ef961, 0x000d8c4f}}, Y: Field{[10]uint32{0x03d7edc2, 0x006ead10, 0x03a69864, 0x0246e998, 0x0033960a, 0x01250817, 0x006627f5, 0x0108c52b, 0x02ab02a9, 0x00079a51}}}, + {X: Field{[10]uint32{0x0069fe01, 0x03b15d0a, 0x033bb55c, 0x0164bf23, 0x0283f9ba, 0x03aa8ba7, 0x0218a63c, 0x030996cb, 0x02d88eed, 0x00088fbb}}, Y: Field{[10]uint32{0x01bbd71c, 0x00842570, 0x025ffeff, 0x02e35a1f, 0x005593f7, 0x00b5cb44, 0x0232cc89, 0x026ff3cd, 0x01734ae2, 0x001c8488}}}, + {X: Field{[10]uint32{0x00b3ec20, 0x01e9698a, 0x035fc31b, 0x02f3e6a6, 0x0160dbb2, 0x021e5684, 0x03b9b321, 0x00b1780f, 0x02c93330, 0x002daf57}}, Y: Field{[10]uint32{0x019dd495, 0x0074b672, 0x0242cd0f, 0x03ce6d0a, 0x0034f373, 0x00ed22eb, 0x01f051d6, 0x0397fac5, 0x03f298a8, 0x003ee7e1}}}, + {X: Field{[10]uint32{0x00e24668, 0x02a2c053, 0x012c98f0, 0x02fcee3e, 0x025a802d, 0x023f55eb, 0x03f69ce0, 0x0093ec55, 0x03603b1c, 0x0028d969}}, Y: Field{[10]uint32{0x000a89f9, 0x02fb0fd7, 0x037606f2, 0x02d06c34, 0x02578005, 0x02606039, 0x0238cc72, 0x02af680a, 0x022b7746, 0x001cf990}}}, + {X: Field{[10]uint32{0x03cebe6e, 0x017287b5, 0x0213aa23, 0x007b4de7, 0x03e24bac, 0x03511a81, 0x02dba309, 0x00dbdbd2, 0x03ac43e4, 0x003a1be3}}, Y: Field{[10]uint32{0x00a166af, 0x00f5b6fd, 0x01cd4a91, 0x0009df30, 0x00930b74, 0x00a8044d, 0x03a592c4, 0x02a6f5c4, 0x00efaa75, 0x00079eed}}}, + {X: Field{[10]uint32{0x039bd5ac, 0x00fa1a3a, 0x015cc993, 0x038ba162, 0x0205cab3, 0x03f78768, 0x0109304c, 0x0155c76b, 0x01fad2b2, 0x003d695f}}, Y: Field{[10]uint32{0x037c1ff6, 0x02317a61, 0x029b0c76, 0x001afb2e, 0x008eb909, 0x02265e89, 0x018dad26, 0x00390754, 0x025e8fc9, 0x00349977}}}, + {X: Field{[10]uint32{0x01f76c7b, 0x011651dd, 0x010f145c, 0x01f28afc, 0x01665660, 0x009192a7, 0x02fd8cab, 0x024dd1f9, 0x017a0725, 0x00387734}}, Y: Field{[10]uint32{0x02f9a20e, 0x03799012, 0x0278a130, 0x0339ae55, 0x00dff819, 0x008caf51, 0x009feb61, 0x021b4992, 0x0310023f, 0x003be8b0}}}, + {X: Field{[10]uint32{0x03a801ff, 0x00e1b373, 0x00c3bafd, 0x03f73290, 0x03cb3774, 0x00176a6a, 0x0274b80a, 0x025ab46f, 0x03dd0849, 0x0020fe2a}}, Y: Field{[10]uint32{0x03c3f63d, 0x01f18e92, 0x002873d3, 0x00ddaa89, 0x001c85ff, 0x019a1a36, 0x02e792d9, 0x02c4395b, 0x0164329f, 0x00099faf}}}, + {X: Field{[10]uint32{0x03259fae, 0x02e952d3, 0x02454ea9, 0x006bcd3f, 0x03ca324b, 0x01445216, 0x0087c716, 0x016a409d, 0x01796ca8, 0x00153327}}, Y: Field{[10]uint32{0x02b2da2a, 0x007682fe, 0x020f2e20, 0x030545f3, 0x023c6ce8, 0x03adba0e, 0x0016e9ed, 0x021875f4, 0x0071ef0b, 0x000630e4}}}, + {X: Field{[10]uint32{0x01402ba4, 0x0070864c, 0x02a51635, 0x02b25039, 0x001c3f65, 0x0047e1d1, 0x0075ac1b, 0x0059538a, 0x012ae009, 0x002744a9}}, Y: Field{[10]uint32{0x00e81d2e, 0x038bc04e, 0x02e52bbe, 0x00b754fd, 0x03c6d7e4, 0x03d7eb58, 0x00d17f39, 0x0066bd06, 0x03342762, 0x0017feec}}}, + {X: Field{[10]uint32{0x02496998, 0x00ed9979, 0x038244f2, 0x03c2dfbc, 0x00488007, 0x03c86ba9, 0x0030917f, 0x006a4734, 0x01b76682, 0x001966ff}}, Y: Field{[10]uint32{0x014784e0, 0x0139f289, 0x039db844, 0x023af087, 0x03d7321a, 0x022f091f, 0x01ef96b7, 0x03a168d0, 0x00bc4506, 0x000ab5c2}}}, + {X: Field{[10]uint32{0x02b4670b, 0x004a5b97, 0x02413d60, 0x013d5cc4, 0x0276ba1b, 0x0055269a, 0x026a2538, 0x020dd121, 0x0233d4a0, 0x0038b313}}, Y: Field{[10]uint32{0x00672476, 0x00502269, 0x00e18797, 0x002e8eca, 0x0080497f, 0x01930dc6, 0x039780ea, 0x01fcd1ed, 0x0325347e, 0x0014a2ca}}}, + {X: Field{[10]uint32{0x02edec68, 0x023840f9, 0x00131e24, 0x03133f2b, 0x01e8dbba, 0x02941580, 0x02164c0f, 0x030db26c, 0x039c9e21, 0x0014a702}}, Y: Field{[10]uint32{0x027125f4, 0x01c04a55, 0x037e4967, 0x017c272e, 0x026cb74f, 0x034b80e1, 0x0269e6ab, 0x032804cd, 0x002172a0, 0x001fe912}}}, + {X: Field{[10]uint32{0x003b63a1, 0x034d54da, 0x01dda654, 0x01efacbc, 0x033d89e5, 0x0203ed96, 0x00d6532a, 0x01f47055, 0x03afbe6a, 0x000a275a}}, Y: Field{[10]uint32{0x01005400, 0x024c5a1f, 0x03b53388, 0x03c30f36, 0x03db149f, 0x01499e1d, 0x022c62c5, 0x02358583, 0x0063d3ce, 0x002007d2}}}, + {X: Field{[10]uint32{0x010f14a1, 0x00bb3c1e, 0x0099e51f, 0x01616346, 0x022eab9b, 0x0096ad0c, 0x0005bb34, 0x019981f0, 0x00c9e3b3, 0x00345aa1}}, Y: Field{[10]uint32{0x0156dd07, 0x02d46614, 0x0231379b, 0x033c672c, 0x0146ec79, 0x02b5b83c, 0x03fc5ea4, 0x014ca3e7, 0x01ab1071, 0x000b1bd7}}}, + {X: Field{[10]uint32{0x036348f1, 0x01c0ec5a, 0x01affd30, 0x03cfb2f8, 0x02a7062d, 0x010436ac, 0x00a6893e, 0x02fefd10, 0x00394fda, 0x00340f2b}}, Y: Field{[10]uint32{0x009d19f9, 0x006e8d11, 0x0040ae5d, 0x01b4e390, 0x035dc4a8, 0x037a56c6, 0x0185c087, 0x02cc5dc3, 0x03cef530, 0x000548c4}}}, + {X: Field{[10]uint32{0x0063379b, 0x0081ed6a, 0x03101c89, 0x0012f125, 0x00d4c4b6, 0x03e5a616, 0x00a7d851, 0x0312a5df, 0x006ca673, 0x002d9acf}}, Y: Field{[10]uint32{0x01624da4, 0x01c2c18c, 0x005609a4, 0x03fc61fc, 0x004b00fa, 0x0055a587, 0x02c63cb7, 0x01aab120, 0x0163771c, 0x00152e89}}}, + {X: Field{[10]uint32{0x018c8c45, 0x039145aa, 0x01e86236, 0x01a01e71, 0x002a43fb, 0x039f5cc2, 0x013127f4, 0x01f35f7f, 0x024411c4, 0x002f9a11}}, Y: Field{[10]uint32{0x026733da, 0x03eba160, 0x01f19a15, 0x030bf7ba, 0x017d78dd, 0x0273143a, 0x0395aaeb, 0x00da30b8, 0x0383c61d, 0x001e4a43}}}, + {X: Field{[10]uint32{0x03cbde9b, 0x00afedeb, 0x00e0c5c6, 0x007e4748, 0x0004ca42, 0x03b8061e, 0x021de709, 0x03d18d35, 0x03a09f34, 0x0011e2b0}}, Y: Field{[10]uint32{0x030988bf, 0x00dd955e, 0x01c34f6e, 0x012fddfb, 0x02e4bc7d, 0x015d2d7d, 0x027526f5, 0x0042586b, 0x03b2ccbc, 0x003dd4bc}}}, + {X: Field{[10]uint32{0x033dcfc8, 0x01905e63, 0x00796e70, 0x028301df, 0x037271a2, 0x026f5284, 0x00d7de9c, 0x01c6a675, 0x015af2ed, 0x001d17cd}}, Y: Field{[10]uint32{0x02e288b9, 0x010818e1, 0x01f6e672, 0x00998c31, 0x02d4fe88, 0x00c78664, 0x0105816c, 0x021fc27b, 0x01f46b0c, 0x00063a98}}}, + {X: Field{[10]uint32{0x02760ce0, 0x02d483a1, 0x014b218d, 0x0238e2ae, 0x00a3157a, 0x00a1909f, 0x01aede59, 0x02a2c242, 0x016f9878, 0x001539ef}}, Y: Field{[10]uint32{0x01fb8e49, 0x03493cc3, 0x03f2ddc1, 0x0294d034, 0x00e04bdb, 0x01d7702d, 0x033c6386, 0x02d12347, 0x000dc1ea, 0x0035edf6}}}, + {X: Field{[10]uint32{0x007d510e, 0x012807e8, 0x0120827e, 0x02b8f725, 0x0399b018, 0x0331bfaf, 0x006f5c7f, 0x010c7bcf, 0x03b655eb, 0x003fd5ab}}, Y: Field{[10]uint32{0x0191e371, 0x03a6d109, 0x03509655, 0x00403a89, 0x02ec7232, 0x01268a35, 0x00388b40, 0x02c71e7d, 0x01b842d7, 0x0026feaf}}}, + {X: Field{[10]uint32{0x029cda72, 0x00e7487f, 0x02be382d, 0x01057fcf, 0x00ea511b, 0x0363a9e4, 0x01d02506, 0x023f219e, 0x0099ed29, 0x0030af30}}, Y: Field{[10]uint32{0x030f971f, 0x03b2d614, 0x03070aa1, 0x03c163be, 0x00825de4, 0x00bf4e31, 0x02c31a58, 0x03ddcd6d, 0x02c435ec, 0x001b1efc}}}, + {X: Field{[10]uint32{0x00e2ec4e, 0x020061c2, 0x000f599a, 0x00da242e, 0x02c8549e, 0x0271a07f, 0x014b9a11, 0x00cc79b1, 0x01449811, 0x0008e0fc}}, Y: Field{[10]uint32{0x0133a1f9, 0x0182838d, 0x01cb1448, 0x00fa774d, 0x00d8fff0, 0x00111c3c, 0x00a999a7, 0x02dad64e, 0x011fd846, 0x0004ead0}}}, + {X: Field{[10]uint32{0x02096048, 0x01afc31b, 0x016b817d, 0x01ca2778, 0x0209953f, 0x0293d499, 0x0244584b, 0x00762fe2, 0x01c0d4fa, 0x000bc89c}}, Y: Field{[10]uint32{0x03b42fc4, 0x0182d80b, 0x00ab57cd, 0x00f69bc5, 0x03a95717, 0x00fbd54f, 0x0332c226, 0x0143a2db, 0x005db40e, 0x00191bbc}}}, + {X: Field{[10]uint32{0x01e951c7, 0x007c9a89, 0x01d089bf, 0x03682b69, 0x03809e7a, 0x02c047ba, 0x01be55cb, 0x01e89fbb, 0x031b0f06, 0x002ded26}}, Y: Field{[10]uint32{0x037c33ed, 0x037b8b1f, 0x033315b2, 0x00811641, 0x014a9b7f, 0x01f2c0ca, 0x02ec95c0, 0x001496b5, 0x00aca816, 0x003fb1d8}}}, + {X: Field{[10]uint32{0x01409223, 0x0206a979, 0x03557941, 0x032e7c2b, 0x027765d4, 0x00b6be07, 0x01866eb1, 0x00f9725c, 0x01cad993, 0x000db238}}, Y: Field{[10]uint32{0x008b8fdf, 0x0064cab7, 0x00853e29, 0x017d4926, 0x0122f2e3, 0x0045baa5, 0x01cc7309, 0x008a0b5c, 0x02d0a025, 0x002257ad}}}, + {X: Field{[10]uint32{0x001ed523, 0x01ef78ef, 0x00d6a6ee, 0x00455a13, 0x00fa5b8a, 0x0330ac38, 0x0173e018, 0x00d6484c, 0x01276328, 0x000f2fa4}}, Y: Field{[10]uint32{0x0244dc81, 0x03cc33f3, 0x03055e4d, 0x02cf4264, 0x01c5149a, 0x01d7c785, 0x030aa9dc, 0x01b26e65, 0x01c922f9, 0x001ecb4f}}}, + {X: Field{[10]uint32{0x0247213c, 0x01fa5ed8, 0x02d164e6, 0x02640c53, 0x02fe0aec, 0x022c8e79, 0x0048d380, 0x0250648d, 0x0141c463, 0x001dba53}}, Y: Field{[10]uint32{0x01fa1278, 0x03061ac8, 0x03cb5a3b, 0x0392fca0, 0x03f9efe4, 0x01d7e8e3, 0x03460bfd, 0x001d2440, 0x02c32f01, 0x0023b929}}}, + {X: Field{[10]uint32{0x031851ec, 0x03cd0cd2, 0x00c08506, 0x009e3bb0, 0x025b265d, 0x01ffa76e, 0x01749e00, 0x039f9e85, 0x01cb12c0, 0x00124e49}}, Y: Field{[10]uint32{0x0062b193, 0x02c5af13, 0x01a9a1f5, 0x003b6067, 0x02e4a240, 0x03dcc299, 0x02b318f9, 0x029195b2, 0x006b3960, 0x001c2403}}}, + {X: Field{[10]uint32{0x003cdcbf, 0x01cebb71, 0x026b7511, 0x01aaa7d7, 0x00387330, 0x01208f4e, 0x0020eb4a, 0x00e4f5e6, 0x02bad1a1, 0x002cdff6}}, Y: Field{[10]uint32{0x0327030a, 0x03b18203, 0x0252f28f, 0x03ca78d5, 0x03dfd325, 0x00c29d69, 0x00df67be, 0x0344e788, 0x00de57fa, 0x002141bc}}}, + {X: Field{[10]uint32{0x00a5e8c1, 0x027d296c, 0x007033c2, 0x008c271b, 0x008f2b70, 0x027e41c9, 0x030c90e0, 0x017124ca, 0x020c48e9, 0x00111465}}, Y: Field{[10]uint32{0x00d7490c, 0x006da1f5, 0x024de53b, 0x013efbd4, 0x0228bc40, 0x01dd9a93, 0x01c9e1a4, 0x027d9a58, 0x0218d9ce, 0x0020d54e}}}, + {X: Field{[10]uint32{0x03ea3449, 0x018ee037, 0x00704caf, 0x006f21a7, 0x00785772, 0x00fe61c6, 0x00ab20eb, 0x01a6e603, 0x01a8697c, 0x0026c2b0}}, Y: Field{[10]uint32{0x027e60e9, 0x0159877e, 0x0045d65b, 0x008c1cba, 0x0361b617, 0x00a02614, 0x0232a582, 0x02fcfdc7, 0x0053bf1b, 0x00084393}}}, + {X: Field{[10]uint32{0x001e0851, 0x01a12d1e, 0x01cebe92, 0x03e9f6f4, 0x0132eca4, 0x03003731, 0x02d62de1, 0x013df848, 0x0355ccae, 0x00399a5c}}, Y: Field{[10]uint32{0x01bdc3cb, 0x02e88dba, 0x01da1736, 0x024509ef, 0x029d3ded, 0x02201aa0, 0x00353f71, 0x03bcf251, 0x00ffdbe5, 0x0007c48b}}}, + {X: Field{[10]uint32{0x0167201e, 0x027c983c, 0x03f2afe3, 0x01387311, 0x03ad480a, 0x00a22eb1, 0x0326f861, 0x02932807, 0x00f11a1a, 0x003fea24}}, Y: Field{[10]uint32{0x01439cb4, 0x011272a1, 0x02b5d69d, 0x03682c06, 0x00ac569c, 0x01f43ba3, 0x03c41497, 0x03f0f51c, 0x03c41716, 0x0005a237}}}, + {X: Field{[10]uint32{0x00b6bf47, 0x02c6d3d5, 0x02c14cd3, 0x015e51b1, 0x00c41fcc, 0x03012813, 0x02b09b15, 0x00e33d8f, 0x00f26ce2, 0x00242235}}, Y: Field{[10]uint32{0x00d2c2b9, 0x00997579, 0x02909bfe, 0x0204adc3, 0x032ae4ec, 0x00f4d676, 0x01c9943b, 0x000138f5, 0x0017bc61, 0x00278e01}}}, + {X: Field{[10]uint32{0x01576a91, 0x0023ff36, 0x0070767c, 0x0288b00d, 0x0299949c, 0x00ca5af0, 0x03f7e5fe, 0x018383f9, 0x01dac1e7, 0x0028ce57}}, Y: Field{[10]uint32{0x012393d3, 0x025039d1, 0x038706ee, 0x00337800, 0x02314185, 0x00f7f3ee, 0x03070162, 0x01b45c5b, 0x039a5403, 0x0013e2a1}}}, + {X: Field{[10]uint32{0x038ad651, 0x0219e2ca, 0x00ecbd20, 0x0035d4cc, 0x011a7730, 0x007da1aa, 0x00ef2345, 0x03078163, 0x016454aa, 0x00047953}}, Y: Field{[10]uint32{0x01c020f2, 0x022ce5b2, 0x026796e0, 0x01164234, 0x01aaa53f, 0x0154a893, 0x0121dfef, 0x0067e715, 0x01605a84, 0x001d26ca}}}, + {X: Field{[10]uint32{0x00327f30, 0x02023f19, 0x0174675e, 0x036a3932, 0x0198f5f0, 0x031c074a, 0x02d5a707, 0x03a08aad, 0x00df7b41, 0x00323c4f}}, Y: Field{[10]uint32{0x03199404, 0x01a251f0, 0x0194d441, 0x02b75827, 0x00445d7a, 0x007cd3d8, 0x00329d6a, 0x0270737b, 0x01df17c0, 0x0012269a}}}, + {X: Field{[10]uint32{0x02d84442, 0x00f3dba4, 0x0250cd46, 0x02522897, 0x029487f3, 0x0386a770, 0x00c628c3, 0x0120e2a5, 0x02dccf67, 0x00245d79}}, Y: Field{[10]uint32{0x03de1c22, 0x002061a3, 0x007298cb, 0x00ec6e0f, 0x03c13e19, 0x01e329e9, 0x0237e510, 0x01c49547, 0x013fed37, 0x0021c15c}}}, + {X: Field{[10]uint32{0x0220099b, 0x018efd0d, 0x0209d228, 0x03b36c5e, 0x005df8b9, 0x014eb028, 0x038f6b89, 0x03c3a7b9, 0x012fb6d5, 0x0023bb52}}, Y: Field{[10]uint32{0x020ff1bf, 0x03a22747, 0x039d99ec, 0x03f41036, 0x0082e1ac, 0x0090e7b2, 0x00f8b946, 0x00ba6367, 0x03421767, 0x0008e915}}}, + {X: Field{[10]uint32{0x015c2dd9, 0x03e8d9c3, 0x03756beb, 0x02f1946d, 0x035cde90, 0x00417d75, 0x0393f543, 0x001bbde5, 0x0223dbac, 0x0032e573}}, Y: Field{[10]uint32{0x024a9a48, 0x022f9785, 0x02a4fc61, 0x01d3dfb3, 0x0057d22d, 0x01c777ad, 0x035ed992, 0x02c301ce, 0x02bac023, 0x002584a9}}}, + {X: Field{[10]uint32{0x03a3c980, 0x02b24199, 0x007c915d, 0x024e7391, 0x01d8fdd4, 0x02d69de4, 0x02a8ebf8, 0x03fcdf50, 0x00c8bbd3, 0x00199c86}}, Y: Field{[10]uint32{0x00ec26c0, 0x02020f23, 0x00f2ace9, 0x039c19d4, 0x00452a21, 0x00156d55, 0x0344aab1, 0x02bf751a, 0x01799e19, 0x00375004}}}, + {X: Field{[10]uint32{0x02f76e5f, 0x0166be0c, 0x0385219b, 0x02d683b4, 0x000c7627, 0x0310a5a6, 0x013e855d, 0x01214739, 0x01c60ded, 0x002211e6}}, Y: Field{[10]uint32{0x021c4a6b, 0x036998b0, 0x005ac3af, 0x01dff33c, 0x0022e343, 0x014b379e, 0x00d2d371, 0x010231e7, 0x01ed84e6, 0x0008e35d}}}, + {X: Field{[10]uint32{0x0111d143, 0x03bbab5a, 0x0396a256, 0x0240e9af, 0x022cc8bb, 0x0093a9b4, 0x03a05bae, 0x0020b165, 0x036b5fc0, 0x0023663c}}, Y: Field{[10]uint32{0x00ab3cd3, 0x035ece38, 0x01516f2a, 0x00c6c770, 0x03de7df9, 0x0005a05d, 0x01b2fcf8, 0x00a9b541, 0x011afc90, 0x0009ba2b}}}, + {X: Field{[10]uint32{0x03d70ad2, 0x00fd2e0f, 0x001ae740, 0x0223219d, 0x03d1db23, 0x034bbec7, 0x032cbc28, 0x031b4c9f, 0x02cac0dd, 0x002ea418}}, Y: Field{[10]uint32{0x028b38c2, 0x012ec299, 0x019f78f2, 0x03f5edcf, 0x01674539, 0x00e05115, 0x0171ccd5, 0x039d5367, 0x035b3036, 0x0011cecc}}}, + {X: Field{[10]uint32{0x02cdca29, 0x007700c2, 0x008f01ff, 0x014c478a, 0x017453ca, 0x01588414, 0x029be675, 0x039825e9, 0x02d73bf0, 0x00128b4d}}, Y: Field{[10]uint32{0x02ca8f83, 0x0290e1ac, 0x001d8595, 0x0205236c, 0x029d694a, 0x00a63d7e, 0x0283ac6c, 0x00c73513, 0x01e7a903, 0x0003fda4}}}, + {X: Field{[10]uint32{0x0337d0c4, 0x018b8773, 0x01c4fcd3, 0x00db8015, 0x006b3651, 0x00b0c972, 0x00fb0d93, 0x012c5ad9, 0x028fd99c, 0x003a1a3c}}, Y: Field{[10]uint32{0x00d4a9eb, 0x00ab7b13, 0x00bca274, 0x0044df65, 0x0240e5fa, 0x02224426, 0x00e0440e, 0x0040d23a, 0x02c18340, 0x002b4cd1}}}, + {X: Field{[10]uint32{0x03abbf3b, 0x028d464a, 0x03eea99d, 0x025b6903, 0x03ea77e6, 0x0088e60c, 0x0177e566, 0x01b2944b, 0x0289830a, 0x001b17a1}}, Y: Field{[10]uint32{0x01779540, 0x03a5196b, 0x017c12be, 0x00351a96, 0x0356b983, 0x01d4d91f, 0x01c333dd, 0x002d81ef, 0x01f15fd0, 0x0030a781}}}, + {X: Field{[10]uint32{0x00046344, 0x0096fb07, 0x02210e1a, 0x0318942b, 0x01c317ad, 0x02e756a4, 0x0391cc86, 0x00b7feba, 0x02a56ebf, 0x002ce85c}}, Y: Field{[10]uint32{0x034ac3d5, 0x017ebe0e, 0x01d119fc, 0x030379e9, 0x02f06401, 0x026930be, 0x031fff90, 0x0035b6f4, 0x01799ae4, 0x000a3db7}}}, + {X: Field{[10]uint32{0x000d8f47, 0x02a53884, 0x02b80091, 0x03b1c68e, 0x00ac4a22, 0x0251a2a3, 0x00aed673, 0x035de694, 0x01d2e2f9, 0x000663c1}}, Y: Field{[10]uint32{0x03cd0414, 0x0226782d, 0x002b3cbf, 0x01a0d830, 0x03397089, 0x00ff2c88, 0x02e3baaf, 0x00c5cf2b, 0x003fc981, 0x00331a86}}}, + {X: Field{[10]uint32{0x0077f48e, 0x03d42aac, 0x039d89f0, 0x036de7f0, 0x0341ae77, 0x02142c1e, 0x007703ae, 0x029e452f, 0x038fa943, 0x001e2c85}}, Y: Field{[10]uint32{0x025274e7, 0x0272c558, 0x02beb11b, 0x03b30a7a, 0x01d78fce, 0x006006f8, 0x0389004e, 0x02c24a2e, 0x0234f2cb, 0x00217f4f}}}, + {X: Field{[10]uint32{0x01943f3e, 0x010fee36, 0x02dcccec, 0x03e757dc, 0x0023828e, 0x01c38a29, 0x017a7951, 0x0145d7e6, 0x03001d4c, 0x001bdc37}}, Y: Field{[10]uint32{0x028315ce, 0x007bb733, 0x03ee5f0f, 0x030aa37e, 0x02956a66, 0x01cc38a9, 0x039c34be, 0x020f9165, 0x0213b771, 0x00098c54}}}, + {X: Field{[10]uint32{0x01a9dccc, 0x030d676d, 0x03bd09cf, 0x00b47343, 0x02e3964b, 0x0116d649, 0x01509e3b, 0x01b4a741, 0x01443c94, 0x002ae04c}}, Y: Field{[10]uint32{0x00f5c5ac, 0x00db2a41, 0x01062063, 0x002cfd41, 0x0216b771, 0x031b184c, 0x005e5876, 0x01cebe83, 0x03150c12, 0x002baf7c}}}, + {X: Field{[10]uint32{0x01473ad3, 0x03a20f81, 0x021a20a3, 0x027ae8cc, 0x016b9456, 0x01f979bb, 0x0323e627, 0x00449c8d, 0x0391dd75, 0x0039cacd}}, Y: Field{[10]uint32{0x0328a3d8, 0x03d320a6, 0x0319fd4d, 0x02b220c2, 0x039c2091, 0x038e8a11, 0x03109ab5, 0x02aa83f4, 0x00742dbc, 0x0004c6cc}}}, + {X: Field{[10]uint32{0x023ded63, 0x00a10cb3, 0x00c74619, 0x01f15ad4, 0x02bb525d, 0x033141f6, 0x03df77af, 0x017940e3, 0x0296ecdd, 0x0032968c}}, Y: Field{[10]uint32{0x03c4ab9e, 0x0197f1bf, 0x0254b3f8, 0x0274af73, 0x005a1420, 0x00acd96f, 0x027258e4, 0x01deea40, 0x0394b7e1, 0x0022f6d9}}}, + {X: Field{[10]uint32{0x031a9222, 0x0069c038, 0x01819c88, 0x00569c9a, 0x02e7d2e8, 0x0300ec80, 0x01be59dc, 0x0233ff3b, 0x029f26ae, 0x003aa8ef}}, Y: Field{[10]uint32{0x0124ec1c, 0x03917065, 0x02acc735, 0x0059f35f, 0x0336ac28, 0x0077cb4e, 0x02f80265, 0x034d3183, 0x00d7a367, 0x0006d68b}}}, + {X: Field{[10]uint32{0x00e97728, 0x02c0f7ba, 0x02206582, 0x0399d21c, 0x0035a011, 0x019e4555, 0x022076d5, 0x03fdab85, 0x002d3ab4, 0x003aeea2}}, Y: Field{[10]uint32{0x01be16ac, 0x02f91d19, 0x010ed355, 0x0161ef7f, 0x018a004c, 0x027b6319, 0x02f2ac76, 0x034b3736, 0x02053d8d, 0x0025088a}}}, + {X: Field{[10]uint32{0x013aba86, 0x0248f20d, 0x01f446d8, 0x0345a3a3, 0x01ba88e0, 0x03688180, 0x03cb784e, 0x01774451, 0x03ea537a, 0x00328365}}, Y: Field{[10]uint32{0x028fba1f, 0x01f2a67d, 0x01b68016, 0x024a1d2d, 0x0196c978, 0x01124399, 0x02bb979a, 0x021bc623, 0x005889eb, 0x0021d2b2}}}, + {X: Field{[10]uint32{0x03b797e1, 0x0233ecfa, 0x01a24771, 0x002c3877, 0x0184a90a, 0x017f0671, 0x0398f98c, 0x01d151f9, 0x01653480, 0x0014778a}}, Y: Field{[10]uint32{0x03f7c54d, 0x03bfd600, 0x007bf87c, 0x012e6792, 0x03ace0ee, 0x03f37e69, 0x001952b0, 0x039ae557, 0x023aad04, 0x00204dd3}}}, + {X: Field{[10]uint32{0x01387509, 0x031bb230, 0x00df5151, 0x00d4d96e, 0x0287b521, 0x007523ed, 0x00e39bda, 0x01af8833, 0x011f0313, 0x0001a758}}, Y: Field{[10]uint32{0x0195bde0, 0x028b088c, 0x01fa7e9d, 0x02a9ac9c, 0x00fb84c0, 0x0170a5c8, 0x01127e1a, 0x01932b13, 0x0020563b, 0x001d78b6}}}, + {X: Field{[10]uint32{0x028aa135, 0x015f784e, 0x00a9cb2f, 0x03037914, 0x006fa4a4, 0x03737886, 0x02204561, 0x01983c8c, 0x00830558, 0x000c458c}}, Y: Field{[10]uint32{0x0346eae2, 0x0376fdbf, 0x03817539, 0x001f97ee, 0x0229e142, 0x038762dd, 0x008c636a, 0x005a20c0, 0x0096b134, 0x000975b5}}}, + {X: Field{[10]uint32{0x007ac334, 0x0335584b, 0x00274cc3, 0x00f61a13, 0x0111f462, 0x0342b66a, 0x002e5b44, 0x03353536, 0x02aaefa9, 0x002138d0}}, Y: Field{[10]uint32{0x0292a70e, 0x023d980a, 0x016540fb, 0x03ed42bb, 0x02f552af, 0x03f974bd, 0x00f0a324, 0x02665f21, 0x03ff260f, 0x003ee436}}}, + {X: Field{[10]uint32{0x03bf6562, 0x0199a499, 0x025bc64d, 0x02b2219e, 0x00fa812a, 0x03538ea8, 0x00468143, 0x02c45489, 0x0002969d, 0x00257bf1}}, Y: Field{[10]uint32{0x03371883, 0x0304d667, 0x034b3e82, 0x027f5dea, 0x02e4567d, 0x0114957e, 0x033f00d4, 0x0094b15b, 0x00316149, 0x000c56f3}}}, + {X: Field{[10]uint32{0x038d07fe, 0x01727a35, 0x01507e3d, 0x0126ed40, 0x0255b401, 0x0156ee6f, 0x0289993a, 0x027682f4, 0x023cf87e, 0x001488d8}}, Y: Field{[10]uint32{0x00613b56, 0x02023f2b, 0x03deffa5, 0x00876cf2, 0x000832e9, 0x0001dbe2, 0x01b1c16b, 0x03d0dc02, 0x0221dd2d, 0x001aff42}}}, + {X: Field{[10]uint32{0x00cb0a4f, 0x0132e5f0, 0x0255df5f, 0x00659ac2, 0x00ea180f, 0x0027845e, 0x0187ab31, 0x01c1f987, 0x01990a6b, 0x003c84b4}}, Y: Field{[10]uint32{0x00f7c84b, 0x01ac1a68, 0x0382412f, 0x008867b0, 0x037f5114, 0x0303a844, 0x03c31427, 0x02d93b91, 0x006c7edb, 0x000ca011}}}, + {X: Field{[10]uint32{0x01cfe8c9, 0x033d630c, 0x01b50835, 0x03888438, 0x02e1e19c, 0x000163e5, 0x014431b2, 0x01dbe085, 0x023ff25d, 0x001ad541}}, Y: Field{[10]uint32{0x0069f8bf, 0x002236a4, 0x031c6492, 0x028f75f8, 0x01558a82, 0x03d83ffb, 0x02997076, 0x001d891b, 0x01623645, 0x001509f7}}}, + {X: Field{[10]uint32{0x01b23045, 0x006755c2, 0x01e96472, 0x0106a0b8, 0x03c9388d, 0x039be2c9, 0x02e0c129, 0x0243004a, 0x01cfa096, 0x00094e79}}, Y: Field{[10]uint32{0x01021ac3, 0x0115eb76, 0x0224a77c, 0x02d28967, 0x0331d804, 0x01444cd1, 0x0393000e, 0x02937346, 0x03f61e26, 0x002532e0}}}, + {X: Field{[10]uint32{0x0247d51d, 0x03eb9502, 0x03fb6297, 0x007bc394, 0x03910642, 0x03ca30fd, 0x02ed31e8, 0x0070c1c6, 0x02d34aaf, 0x002aa6da}}, Y: Field{[10]uint32{0x03544c47, 0x02779de0, 0x03d3ed1c, 0x01fb2910, 0x0158cbd8, 0x002ad366, 0x034e7db1, 0x02b80262, 0x00e49fe4, 0x00370256}}}, + {X: Field{[10]uint32{0x013487ad, 0x014cbd80, 0x0262f780, 0x0397a728, 0x03e08964, 0x028fdac3, 0x02d6e635, 0x0093efd7, 0x0313aad2, 0x002a1428}}, Y: Field{[10]uint32{0x014ccbe7, 0x020cd8fb, 0x01a4c43b, 0x01c09bc5, 0x01d9a5e5, 0x03bbcd1e, 0x01708ca0, 0x015708ee, 0x02d54cbc, 0x001f91da}}}, + {X: Field{[10]uint32{0x03a09c1a, 0x02352b97, 0x0328c741, 0x00c991de, 0x025da441, 0x00638a74, 0x00889fab, 0x00325b41, 0x0033f4fd, 0x000c53fb}}, Y: Field{[10]uint32{0x03d25f42, 0x01ee53fa, 0x024a976b, 0x034c6a9a, 0x00d9b4b8, 0x0254d3f7, 0x01dd4f54, 0x03fede6d, 0x01130a98, 0x00028b25}}}, + {X: Field{[10]uint32{0x033d0963, 0x02be8d53, 0x01c85329, 0x02e33d4b, 0x03183998, 0x02bef73b, 0x01581ae1, 0x01f9e6b8, 0x03c89ec5, 0x001b9f70}}, Y: Field{[10]uint32{0x019f87d8, 0x01457e27, 0x00964a83, 0x00c3f32b, 0x038f0578, 0x01662ac6, 0x011e3a82, 0x023a7e59, 0x00056d5a, 0x001ad8da}}}, + {X: Field{[10]uint32{0x033337c5, 0x01f50015, 0x034ad955, 0x03016309, 0x0038b6cf, 0x03461071, 0x0097a507, 0x028b5481, 0x0293fc4b, 0x00165b7d}}, Y: Field{[10]uint32{0x037f4ff5, 0x00ff412c, 0x033c6bd0, 0x00cf5732, 0x0274b75c, 0x027b173f, 0x0171723e, 0x02c26ce8, 0x01e91c97, 0x0019827b}}}, + {X: Field{[10]uint32{0x00e8afb7, 0x03c28485, 0x034ee13c, 0x01665ef2, 0x00ee3ba2, 0x01ef50b5, 0x0150e8e7, 0x01e00161, 0x01d410de, 0x0008d7e3}}, Y: Field{[10]uint32{0x00fa6712, 0x038562db, 0x031bd189, 0x00ce092d, 0x0153b72c, 0x00429115, 0x00f8d595, 0x0384da00, 0x00cdb8e8, 0x002fdb83}}}, + {X: Field{[10]uint32{0x03db8b47, 0x027308c4, 0x0227904c, 0x01abbda4, 0x003f0390, 0x0203a07c, 0x01fbb28c, 0x03a47c49, 0x0297b259, 0x002a762e}}, Y: Field{[10]uint32{0x00048656, 0x01d52b3b, 0x0337bf14, 0x03d916e9, 0x015e6ce6, 0x0087d625, 0x0072afe2, 0x0203c99d, 0x015419b5, 0x00399a2e}}}, + {X: Field{[10]uint32{0x02288e5c, 0x02c1fa12, 0x027f4827, 0x00d6df66, 0x00c4e2cc, 0x004d26e2, 0x02bc6295, 0x0305c050, 0x01c64f74, 0x0014ed13}}, Y: Field{[10]uint32{0x017075d4, 0x01b855c2, 0x02c7e589, 0x021f6325, 0x02322161, 0x03fb9ed6, 0x03006ead, 0x018b1363, 0x03e14045, 0x0012bfc4}}}, + {X: Field{[10]uint32{0x000af1a0, 0x02d68096, 0x0362f947, 0x01e4121b, 0x02a91872, 0x0125121a, 0x00b56ca1, 0x03e7dc6b, 0x0038a6ba, 0x001db9b8}}, Y: Field{[10]uint32{0x01f0f0fa, 0x039ad378, 0x03fd4465, 0x035c899b, 0x003b57e0, 0x03811644, 0x0018348b, 0x0101d913, 0x01106688, 0x00146974}}}, + {X: Field{[10]uint32{0x03c1e6b5, 0x03d4efe6, 0x038702bc, 0x031c6fb1, 0x001c45b4, 0x037a192f, 0x02da284d, 0x0004a443, 0x03192fc7, 0x001dd87f}}, Y: Field{[10]uint32{0x016e11b2, 0x01f6b10a, 0x007c1d94, 0x032ec6ad, 0x03e0bb75, 0x030f9f4d, 0x037e1fdf, 0x01c65987, 0x0370a82f, 0x00202603}}}, + {X: Field{[10]uint32{0x009aadf9, 0x034a012a, 0x02d7f8fe, 0x02388434, 0x0095c0bd, 0x021a7618, 0x01cdc333, 0x03d47f9b, 0x01d61224, 0x00206672}}, Y: Field{[10]uint32{0x031ec89b, 0x038c15d2, 0x0292ddaa, 0x01f4aa74, 0x00a158ee, 0x000c371d, 0x01bbd73f, 0x008e12ba, 0x024f5cbd, 0x002fa25c}}}, + {X: Field{[10]uint32{0x01c55c0e, 0x009d0164, 0x033b799d, 0x032f9422, 0x0008bd4d, 0x02f5de76, 0x01626803, 0x00955aef, 0x01fc760a, 0x0005709e}}, Y: Field{[10]uint32{0x03390c39, 0x00f934d4, 0x01dee337, 0x02c19c85, 0x010ea0b9, 0x0328103f, 0x015d352b, 0x03258d24, 0x00bfed80, 0x003f540e}}}, + {X: Field{[10]uint32{0x00a39b46, 0x0045857e, 0x031a83c1, 0x03900520, 0x019724ac, 0x0330b9fb, 0x03b46a3e, 0x01011dbd, 0x0106b280, 0x003ecfe3}}, Y: Field{[10]uint32{0x03d2154e, 0x03ecf3da, 0x011854fb, 0x0142b264, 0x023177ed, 0x00f06f5c, 0x03fd70c6, 0x006d84ec, 0x00b6ff85, 0x003e4943}}}, + {X: Field{[10]uint32{0x02012edb, 0x03269bae, 0x0389b5ea, 0x00576c2c, 0x02f9faf4, 0x025f0ff7, 0x02723e30, 0x01049768, 0x01473c96, 0x000e6cad}}, Y: Field{[10]uint32{0x03fb7547, 0x0220bc86, 0x01564002, 0x02b8377e, 0x016bce7b, 0x03d97c8c, 0x028aedf1, 0x03d04ef5, 0x02a5a586, 0x0022b070}}}, + {X: Field{[10]uint32{0x03f1552b, 0x03fd1291, 0x0284820c, 0x00fab21f, 0x01bf72d7, 0x02c93a33, 0x03f6d0bb, 0x00546874, 0x03fae476, 0x0010b577}}, Y: Field{[10]uint32{0x00847ee4, 0x03eb6d2e, 0x02ee2922, 0x01185f61, 0x02663f6e, 0x0100ef3d, 0x03ebe3af, 0x03000589, 0x0245d941, 0x0018c765}}}, + {X: Field{[10]uint32{0x02e0bd8f, 0x007edeb9, 0x02158e31, 0x0349b671, 0x02630a0b, 0x03a48b66, 0x02dd0711, 0x02afc297, 0x02c624ec, 0x00213725}}, Y: Field{[10]uint32{0x038703c6, 0x023ab8fb, 0x025a82cc, 0x01c4302a, 0x01c795cc, 0x02f4bf09, 0x00ff10a8, 0x00c934ab, 0x018a16b7, 0x00102bcc}}}, + {X: Field{[10]uint32{0x03bf505e, 0x01ce60d2, 0x013bf018, 0x000b0db6, 0x034663ba, 0x01efdf2e, 0x03812af3, 0x033bb846, 0x020a797b, 0x0018db9d}}, Y: Field{[10]uint32{0x01f724d2, 0x03dc0e99, 0x012ffd74, 0x010015f6, 0x0069924f, 0x0012e516, 0x02dab981, 0x033dd90d, 0x024b6cc8, 0x003b5717}}}, + {X: Field{[10]uint32{0x00d06ae4, 0x03dd6026, 0x01090d4f, 0x003fd85d, 0x007d32bc, 0x0389e019, 0x01ca6f4a, 0x03b9e19a, 0x00254bb5, 0x0004dff4}}, Y: Field{[10]uint32{0x028d0fd4, 0x02dfc24c, 0x00bc808f, 0x00f7a739, 0x03e07ec2, 0x00dba4b9, 0x03186a30, 0x02aa83a6, 0x02a225ea, 0x000a0b5a}}}, + {X: Field{[10]uint32{0x02459e92, 0x01cd3484, 0x00b611b6, 0x01805eaf, 0x00df781f, 0x02c943f0, 0x01bc7a5c, 0x02495ad5, 0x004839e4, 0x000862ae}}, Y: Field{[10]uint32{0x010e1599, 0x012cf393, 0x02444c99, 0x03f1c072, 0x001a7212, 0x00cbce7c, 0x00c49c8d, 0x02c3710c, 0x0356b53f, 0x001fac53}}}, + {X: Field{[10]uint32{0x038eda65, 0x00552557, 0x034fb619, 0x0267aed3, 0x011b2f0a, 0x03c4dd81, 0x029e3a78, 0x008be37d, 0x03a0106f, 0x001acfde}}, Y: Field{[10]uint32{0x0330d299, 0x03ededc8, 0x013b7aaa, 0x000174db, 0x036c8310, 0x0207a21c, 0x019a4ab4, 0x01afbe1b, 0x00c44c94, 0x000315e2}}}, + {X: Field{[10]uint32{0x01e8ceca, 0x038c7f76, 0x03d08c5d, 0x032bdffb, 0x02131ad1, 0x00bad6e1, 0x02fdf196, 0x00465465, 0x02cba2de, 0x0026d053}}, Y: Field{[10]uint32{0x0325a637, 0x024897a9, 0x00797063, 0x0216579d, 0x0251e94e, 0x036a7d39, 0x01b06269, 0x037d0203, 0x031f9550, 0x000e39bc}}}, + {X: Field{[10]uint32{0x02940653, 0x03d986c9, 0x01f8ecba, 0x023bcfcb, 0x02156a4a, 0x00751135, 0x0133af0d, 0x0097861a, 0x03a18574, 0x0010dac1}}, Y: Field{[10]uint32{0x003f2d44, 0x0156cc51, 0x0053ace1, 0x0346f393, 0x03c6822d, 0x0093f318, 0x02427137, 0x03af7b29, 0x0335f124, 0x0025294b}}}, + {X: Field{[10]uint32{0x028fbc6b, 0x00cb3544, 0x034d1fff, 0x00a08266, 0x00b8d76f, 0x01ed78a4, 0x0019bd18, 0x017e08cd, 0x033809b2, 0x003302a4}}, Y: Field{[10]uint32{0x023f458e, 0x02ffa1db, 0x029ec220, 0x01e90c3b, 0x00e713ad, 0x01d54038, 0x00cb6278, 0x031ea512, 0x006dec7a, 0x000331fa}}}, + {X: Field{[10]uint32{0x03a19858, 0x007fa0f0, 0x038888f2, 0x03a9cbef, 0x037ea684, 0x02be372a, 0x03b1907e, 0x01debf31, 0x016eaaf8, 0x001686cc}}, Y: Field{[10]uint32{0x0181e7e1, 0x010933b3, 0x00450cf7, 0x02508b6f, 0x02744110, 0x029a504b, 0x02b3466d, 0x0211a9ad, 0x039ada08, 0x0012bc0c}}}, + {X: Field{[10]uint32{0x016c53ee, 0x01f5025b, 0x0327400e, 0x0094be7f, 0x01ac4a57, 0x000e62c9, 0x021e4114, 0x012ec87f, 0x01657444, 0x003ebe24}}, Y: Field{[10]uint32{0x01a43100, 0x0053db26, 0x03cb3997, 0x02b20420, 0x01d87984, 0x02c5b271, 0x00b64263, 0x0151fd77, 0x015faf75, 0x0033e9de}}}, + {X: Field{[10]uint32{0x0174f248, 0x03937ab4, 0x01e33aa9, 0x00b52586, 0x00c94cd2, 0x031b2c0a, 0x000c68c6, 0x00588c61, 0x018aca14, 0x000e797f}}, Y: Field{[10]uint32{0x003c1ff1, 0x00429be3, 0x0210561d, 0x02194a2a, 0x020a8d36, 0x023d989d, 0x0013e788, 0x036995d0, 0x03657083, 0x003e0487}}}, + {X: Field{[10]uint32{0x0325cbc1, 0x010c2600, 0x000e9257, 0x0350866f, 0x02a64b8e, 0x03ef84d5, 0x013cddf6, 0x0033cb33, 0x01ec147d, 0x0008284d}}, Y: Field{[10]uint32{0x0282c013, 0x008ab9bb, 0x006a7156, 0x002a047c, 0x01fa1d17, 0x01d74c2a, 0x0101fd26, 0x00dc9530, 0x00abea1a, 0x002c5d45}}}, + {X: Field{[10]uint32{0x0072320a, 0x0070ad0b, 0x011fab46, 0x00462a21, 0x039903ca, 0x031d6c4e, 0x03d69e2a, 0x03dcfe84, 0x01b8af48, 0x00286068}}, Y: Field{[10]uint32{0x03a6df20, 0x03212ca5, 0x02a5a219, 0x00e8310e, 0x00a66fbd, 0x035621e8, 0x032c432a, 0x01f988f5, 0x00673f48, 0x00325b21}}}, + {X: Field{[10]uint32{0x01b3ee4f, 0x0118b1df, 0x03fc2752, 0x02557ae1, 0x01eb4626, 0x0145b7a3, 0x035d76a9, 0x01768beb, 0x0031720a, 0x000e57f0}}, Y: Field{[10]uint32{0x0359ad6a, 0x022fd071, 0x00523128, 0x01a66cd0, 0x00962ac8, 0x00fb1127, 0x00e14e7c, 0x00e256ad, 0x006b5378, 0x0012baf2}}}, + {X: Field{[10]uint32{0x0364fa6f, 0x01accf46, 0x03d17424, 0x0395c6e7, 0x0103fffc, 0x02ed8cdf, 0x01632a61, 0x00ae5a1f, 0x01ecf6df, 0x0028db7a}}, Y: Field{[10]uint32{0x011999f4, 0x03721899, 0x01ea9cdb, 0x027f43c1, 0x01620fe2, 0x01f7ad03, 0x0212e147, 0x0345006c, 0x004fa133, 0x001e1393}}}, + {X: Field{[10]uint32{0x0040ba8c, 0x01d1b8a6, 0x00359d04, 0x02e0f6f7, 0x03e55a3a, 0x0114d7d5, 0x03818200, 0x0110c3dc, 0x0099ecee, 0x00232d6a}}, Y: Field{[10]uint32{0x017ff59a, 0x03697780, 0x00b2cb92, 0x02c7bc0b, 0x01731ded, 0x00f4a2d3, 0x01df0ecc, 0x028f04b0, 0x002ae9c3, 0x0004a9ca}}}, + {X: Field{[10]uint32{0x00b60985, 0x0142d998, 0x01f299c4, 0x0362c9ac, 0x004cee72, 0x00bf47ef, 0x02372012, 0x026e8643, 0x01e14d9c, 0x00037910}}, Y: Field{[10]uint32{0x0271b63e, 0x03884500, 0x02110508, 0x0319d40c, 0x022927b3, 0x009fefad, 0x03740d44, 0x0374cf53, 0x030ed12d, 0x002b7468}}}, + {X: Field{[10]uint32{0x039fbab7, 0x02081ea6, 0x01067407, 0x030e5ca5, 0x00520646, 0x004a3446, 0x02f3c1b7, 0x0151283c, 0x0356b5e5, 0x002238e2}}, Y: Field{[10]uint32{0x0000e5e3, 0x00763984, 0x034b7810, 0x00828b63, 0x00dc8ea0, 0x02f6bc61, 0x03ac529c, 0x02595b96, 0x008ed44e, 0x00220cc8}}}, + {X: Field{[10]uint32{0x034640a7, 0x03ccdd03, 0x0266c6c5, 0x032583d4, 0x013ee217, 0x0234b5ca, 0x03fa3d15, 0x019082e7, 0x0192f561, 0x00293c3e}}, Y: Field{[10]uint32{0x002e6ddb, 0x0038807e, 0x01e713d8, 0x023a04a2, 0x010b131a, 0x006bd0bf, 0x02c9188a, 0x021af103, 0x01a8437a, 0x003699d0}}}, + {X: Field{[10]uint32{0x005c945b, 0x014901c7, 0x02ad7efe, 0x02fcdfe5, 0x0286899f, 0x01147634, 0x00a40bee, 0x02aab981, 0x00cff2d1, 0x0017c02a}}, Y: Field{[10]uint32{0x019deb12, 0x02d8f4ad, 0x0262a424, 0x034eb9b1, 0x030b48ea, 0x011a4b56, 0x011549fb, 0x01b5b8e7, 0x00b69ea7, 0x0004d7f2}}}, + {X: Field{[10]uint32{0x00f99218, 0x01b38c62, 0x00da0b41, 0x019ea79b, 0x039d1689, 0x00e376e3, 0x004c7998, 0x03f28bb8, 0x020ebfd6, 0x00164d46}}, Y: Field{[10]uint32{0x010fdb34, 0x00f53a75, 0x025b64fe, 0x0275ce91, 0x000fc415, 0x00a479f2, 0x0227b6d4, 0x03d2a0a3, 0x02673184, 0x001b8068}}}, + {X: Field{[10]uint32{0x00b1aecf, 0x025be44b, 0x039f72c7, 0x01cf9dfc, 0x006705ef, 0x03c98f43, 0x007387a5, 0x00cecf7a, 0x0235f5c5, 0x00005d7b}}, Y: Field{[10]uint32{0x01d9513f, 0x0340a02e, 0x03506a80, 0x018cf35e, 0x005fca3b, 0x0317ef58, 0x00d40fc4, 0x03909878, 0x03154540, 0x0028de49}}}, + {X: Field{[10]uint32{0x0347b8fe, 0x01f7eefc, 0x033b0204, 0x0077eb40, 0x00565595, 0x01e416b5, 0x036362fa, 0x0062b26a, 0x0341597b, 0x001d4626}}, Y: Field{[10]uint32{0x01b2527e, 0x01deddc8, 0x03ed5b01, 0x010a116b, 0x01aa2468, 0x015a967b, 0x00023de2, 0x0043a95f, 0x01210ffa, 0x003d4dbf}}}, + {X: Field{[10]uint32{0x019bd4ae, 0x02690528, 0x01c72004, 0x01cdad68, 0x02438855, 0x01fbf48e, 0x03d2a315, 0x035971c2, 0x02c32522, 0x00246be7}}, Y: Field{[10]uint32{0x001a32de, 0x01aec21d, 0x02d6e643, 0x00668b29, 0x0331c9cc, 0x002d1066, 0x004898ed, 0x02e161ad, 0x03c38462, 0x000c4801}}}, + {X: Field{[10]uint32{0x00565c27, 0x02876129, 0x01b04712, 0x02906853, 0x00732273, 0x03ca0f17, 0x01094432, 0x03574174, 0x008d41fa, 0x00376cbf}}, Y: Field{[10]uint32{0x029c1d0a, 0x02e8beb5, 0x01a38d63, 0x02db5fcb, 0x028f6ac9, 0x0224f424, 0x01673a09, 0x031bd080, 0x00c502ce, 0x0013df8c}}}, + {X: Field{[10]uint32{0x023641a6, 0x037077fd, 0x00f96f7d, 0x001fcac1, 0x01ad40a9, 0x0290494e, 0x0144936e, 0x00370d40, 0x0122d724, 0x00273997}}, Y: Field{[10]uint32{0x01d97c8c, 0x009d825e, 0x02340cf9, 0x010e0150, 0x00c3037e, 0x01818bd5, 0x020b4257, 0x02f19091, 0x01877f25, 0x002be4f9}}}, + {X: Field{[10]uint32{0x036e9a2b, 0x01b5dbdd, 0x015f5493, 0x02c079fe, 0x015489f1, 0x002fd24b, 0x003932eb, 0x03b16247, 0x00d41fed, 0x001f7034}}, Y: Field{[10]uint32{0x0107c47a, 0x01a6656c, 0x0134fa52, 0x03d694d6, 0x001e9bbc, 0x00e0c685, 0x021c7a49, 0x00f04efe, 0x039e760c, 0x00355689}}}, + {X: Field{[10]uint32{0x000e5ead, 0x000ea553, 0x008c163d, 0x003cca07, 0x02f190d4, 0x00f92a9f, 0x018d351f, 0x035ca277, 0x015cb6b4, 0x00034048}}, Y: Field{[10]uint32{0x00fdc662, 0x00b2206c, 0x02a2548b, 0x0318267b, 0x01c68be6, 0x01906153, 0x03ce7fe0, 0x01fbb9c8, 0x004bccbd, 0x003be60d}}}, + {X: Field{[10]uint32{0x017cb92f, 0x0019d9e3, 0x02af3e1d, 0x0318a4cf, 0x00bb6498, 0x02f7fcf5, 0x011b0d29, 0x03be3d66, 0x0031a9fa, 0x00035347}}, Y: Field{[10]uint32{0x026a4831, 0x017e18ab, 0x0190a4df, 0x036e93d9, 0x02715fae, 0x00861791, 0x03ccd42f, 0x0247ea16, 0x0048ac6b, 0x00263cea}}}, + {X: Field{[10]uint32{0x02080839, 0x034bc931, 0x035a49fa, 0x00310686, 0x023d718f, 0x0212c78c, 0x022d83c0, 0x03c930f6, 0x02cf42ab, 0x00331967}}, Y: Field{[10]uint32{0x001f963c, 0x009d86b2, 0x00cbbf0f, 0x0250fe13, 0x00c7aef0, 0x039e55d6, 0x02df249a, 0x00ce66db, 0x01554d84, 0x001eef7f}}}, + {X: Field{[10]uint32{0x01ea4b04, 0x0345905c, 0x0104e594, 0x01d59c23, 0x00f0eb47, 0x01e2fbcd, 0x0074e944, 0x03ce1674, 0x0167d5cf, 0x00066e85}}, Y: Field{[10]uint32{0x02820f9a, 0x014d2152, 0x00ed5d4f, 0x024722e4, 0x0030555c, 0x03967044, 0x00583114, 0x02c0bb6a, 0x001bd536, 0x000d3a8a}}}, + {X: Field{[10]uint32{0x03bbc30f, 0x01e63d75, 0x006a5437, 0x039d4a56, 0x02e825d8, 0x0354b4b6, 0x01960e5f, 0x01641d8c, 0x02e31a6e, 0x000fc3c0}}, Y: Field{[10]uint32{0x03e63c3b, 0x00241878, 0x0119a035, 0x00a5ed01, 0x0162a3bf, 0x038b35a9, 0x0079ddcb, 0x03536964, 0x03c33aec, 0x002e4f89}}}, + {X: Field{[10]uint32{0x0149ab12, 0x001e4900, 0x0323e0df, 0x025b97ea, 0x008d0fb0, 0x003ce0ad, 0x01dd895b, 0x00ff656a, 0x008f35f6, 0x00262131}}, Y: Field{[10]uint32{0x0180eb44, 0x00907ed0, 0x02aa013f, 0x017a627f, 0x03e01154, 0x022dbd06, 0x01e321f5, 0x010df0f5, 0x02667070, 0x0015a230}}}, + {X: Field{[10]uint32{0x006c7b4d, 0x026edf31, 0x00b47448, 0x0380ac8f, 0x02bb4a6f, 0x00be0f96, 0x002e85ac, 0x027154c2, 0x029379bc, 0x002503ca}}, Y: Field{[10]uint32{0x0321fd9d, 0x03038b1f, 0x02284700, 0x0274b2b8, 0x002aa742, 0x02f1a9e1, 0x027c735c, 0x02763d47, 0x038077ba, 0x002d2e08}}}, + {X: Field{[10]uint32{0x00b782f0, 0x01d0bad6, 0x0001c0e0, 0x000d0be4, 0x005f4beb, 0x014d0fa9, 0x02feccbb, 0x00f67d06, 0x019ce535, 0x002a69da}}, Y: Field{[10]uint32{0x0187c994, 0x02a565e5, 0x018b4c7c, 0x02f17ed2, 0x01b0536f, 0x029806b2, 0x0341f778, 0x0233c690, 0x02aab3e1, 0x000f1d67}}}, + {X: Field{[10]uint32{0x03218913, 0x008898c2, 0x034afb15, 0x00748fc9, 0x0293f4da, 0x00b4044a, 0x0236cc28, 0x036c015b, 0x008a009c, 0x0028878d}}, Y: Field{[10]uint32{0x02be89ed, 0x0307d31f, 0x038da588, 0x01cec79d, 0x03c70b18, 0x01c07998, 0x00b8e28a, 0x025419bb, 0x03fa652f, 0x00050550}}}, + {X: Field{[10]uint32{0x025fd383, 0x0123ecd6, 0x01ca41f0, 0x0018c1a9, 0x00e81429, 0x006339ce, 0x03298d60, 0x0384614a, 0x01951121, 0x0035b553}}, Y: Field{[10]uint32{0x028a7a83, 0x014d1160, 0x02912412, 0x03cd4d68, 0x028f76c8, 0x02363bb4, 0x00fe9d03, 0x007f88c1, 0x00b8de89, 0x00225f73}}}, + {X: Field{[10]uint32{0x031e6cda, 0x0303c770, 0x03ebe21c, 0x01928e91, 0x026232b4, 0x03bec4be, 0x00c7f7b5, 0x03abed22, 0x035dc937, 0x001f8298}}, Y: Field{[10]uint32{0x01e921e2, 0x00eb18e3, 0x01e822d6, 0x021b3b58, 0x0274489c, 0x02b72fcd, 0x025b34e3, 0x017874b3, 0x014a7552, 0x00034b47}}}, + {X: Field{[10]uint32{0x0051a659, 0x02802e35, 0x000d3afe, 0x0053eb08, 0x0155bafa, 0x01acfeba, 0x00870e83, 0x0071a10a, 0x000f66a2, 0x00133882}}, Y: Field{[10]uint32{0x007da4c4, 0x03c157db, 0x01b1d891, 0x0249cf8c, 0x02f0ca1b, 0x0037e4eb, 0x00d0f3ef, 0x000bf4c6, 0x0226565b, 0x000a787e}}}, + {X: Field{[10]uint32{0x012bad2e, 0x007d509c, 0x00f7fc09, 0x02d363d6, 0x01e6d4b7, 0x02e27a05, 0x00d5caf1, 0x02fd9567, 0x0387b633, 0x0036ae1a}}, Y: Field{[10]uint32{0x03c85b5e, 0x0057acd4, 0x03bdf8fd, 0x00d1f95e, 0x004506a6, 0x0156f64c, 0x00159d7f, 0x0157ce36, 0x0109d79a, 0x0023926c}}}, + {X: Field{[10]uint32{0x0365aca9, 0x00a4006c, 0x017a56ae, 0x012854a2, 0x01ba1622, 0x01d9cb4e, 0x035386ea, 0x00cb93a2, 0x02c290fa, 0x0031a852}}, Y: Field{[10]uint32{0x035dbc67, 0x003ab1dc, 0x00164b2c, 0x00b7e896, 0x0245cd5f, 0x00bfd857, 0x021967a4, 0x0223f890, 0x00d6dcc5, 0x0010aab7}}}, + {X: Field{[10]uint32{0x02450a27, 0x0138853a, 0x0041de69, 0x02b32284, 0x0263510b, 0x03cd163d, 0x03244004, 0x00423ca3, 0x0240880b, 0x0009667e}}, Y: Field{[10]uint32{0x03a57a01, 0x0365321e, 0x013e6951, 0x01b95230, 0x02a424c4, 0x0280aff4, 0x03a973a1, 0x0337d1a9, 0x02ad4ae1, 0x000151e4}}}, + {X: Field{[10]uint32{0x02d9f9ff, 0x035d1da3, 0x0153bbf3, 0x00cdbe91, 0x01312655, 0x01e7b10f, 0x02d8fe9e, 0x02a3deab, 0x00b4a6af, 0x003daac3}}, Y: Field{[10]uint32{0x005026ef, 0x0365d1a1, 0x013f973f, 0x02f15ebc, 0x0282e913, 0x0241ff35, 0x001a4761, 0x00024123, 0x0189c4ba, 0x0013a849}}}, + {X: Field{[10]uint32{0x007f1dfc, 0x03522c9c, 0x01bebdfd, 0x03caf1c7, 0x0372738f, 0x00ffd369, 0x017ecdbd, 0x000838b6, 0x008bab8f, 0x003d46f5}}, Y: Field{[10]uint32{0x02697c40, 0x024fcfd2, 0x01e4308c, 0x0148922f, 0x01b361c7, 0x01fbe43e, 0x03fe7bce, 0x011fea29, 0x03a0947f, 0x001ac5a2}}}, + {X: Field{[10]uint32{0x022a3443, 0x0263c292, 0x013625c8, 0x02194d48, 0x020a50b2, 0x0342fdf4, 0x0398f2b1, 0x02a432bd, 0x01146c9c, 0x002d807c}}, Y: Field{[10]uint32{0x021f87dd, 0x03c8e471, 0x027edf0c, 0x0343f305, 0x006877fe, 0x027c3c44, 0x0317a115, 0x02d9d57c, 0x004136b6, 0x0029b28c}}}, + {X: Field{[10]uint32{0x005f974b, 0x0241947e, 0x01ccb37e, 0x0163ca1c, 0x015be6a1, 0x0316dc64, 0x030511f0, 0x01f011db, 0x027ae595, 0x001e4b75}}, Y: Field{[10]uint32{0x031dd44b, 0x01d60252, 0x03bcb941, 0x017212b0, 0x011a4c1c, 0x00bd18f8, 0x004774dd, 0x027da4e9, 0x00b9bec5, 0x0026dfd7}}}, + {X: Field{[10]uint32{0x03b093f9, 0x0004c0a2, 0x00377931, 0x0080cf0d, 0x004c29c4, 0x0009452b, 0x0300eb4f, 0x03d2b6cd, 0x026933b6, 0x001f6211}}, Y: Field{[10]uint32{0x01e2cb3b, 0x025187ed, 0x00885a2f, 0x03e2944d, 0x022ebeb5, 0x0391b0c1, 0x007ead35, 0x00036d4a, 0x035e6745, 0x000bf230}}}, + {X: Field{[10]uint32{0x012a5351, 0x03b6e01a, 0x00249010, 0x01077e0b, 0x01ead4bc, 0x01c2250d, 0x03820387, 0x02182c86, 0x03916d0f, 0x00271dba}}, Y: Field{[10]uint32{0x01c88b62, 0x0260a43d, 0x006b0d99, 0x03835b78, 0x030e51d1, 0x0231dda7, 0x0235a6da, 0x00055878, 0x03f33880, 0x001caeb6}}}, + {X: Field{[10]uint32{0x03d807f9, 0x02ec3cc7, 0x0024ecf5, 0x0360b6bf, 0x038fef18, 0x00791f0c, 0x0252a2aa, 0x024f8557, 0x02383d8a, 0x002926d5}}, Y: Field{[10]uint32{0x001d3ae0, 0x0163a364, 0x0176dbee, 0x03987f3a, 0x029dc392, 0x0324d191, 0x00b0760b, 0x013133b9, 0x01b39bf3, 0x0006f09c}}}, + {X: Field{[10]uint32{0x00634460, 0x01891f37, 0x029e0a4d, 0x03f9deba, 0x02a704c9, 0x023c71cb, 0x01d5cc96, 0x02c2c32a, 0x035a675b, 0x000134c4}}, Y: Field{[10]uint32{0x000cfc4e, 0x029dbb8a, 0x02d38395, 0x03bda333, 0x02cb74bc, 0x03c0ac4e, 0x031ffeac, 0x03d2f3cb, 0x00be72f5, 0x002b975f}}}, + {X: Field{[10]uint32{0x0253f588, 0x00cc2267, 0x00e3711f, 0x020ea481, 0x00eff955, 0x010bc64b, 0x00421b9b, 0x01b8e3f0, 0x03be17dd, 0x001655cb}}, Y: Field{[10]uint32{0x021c7c24, 0x01150877, 0x0382a39c, 0x00be6dc9, 0x03a01c8f, 0x03582811, 0x01ab8051, 0x00fe79a8, 0x0240a8cb, 0x0015c4d1}}}, + {X: Field{[10]uint32{0x012d9511, 0x03a8799c, 0x005a5cb5, 0x00203d58, 0x020a5fff, 0x00a34ba6, 0x02a1c612, 0x01e03b2a, 0x006d49b4, 0x001cf333}}, Y: Field{[10]uint32{0x03752cf4, 0x00b353f8, 0x0308edbb, 0x01b5aa16, 0x036a52c0, 0x026c5634, 0x012ea8b5, 0x0323c470, 0x0174f986, 0x00118ea3}}}, + {X: Field{[10]uint32{0x004c1e46, 0x00f0a8e3, 0x03d1ee50, 0x03c61da0, 0x02ae3885, 0x023f73db, 0x02f7280e, 0x002aa51d, 0x03fddb62, 0x002db23a}}, Y: Field{[10]uint32{0x03d39802, 0x02441839, 0x01ddeb40, 0x0157cc85, 0x0276a25d, 0x02065297, 0x0175c2ac, 0x000122f9, 0x02d9f021, 0x00269beb}}}, + {X: Field{[10]uint32{0x005e392e, 0x01ff2713, 0x01f7eb50, 0x02353087, 0x03b9cc4a, 0x00c19f78, 0x0196c539, 0x01524f6a, 0x020f92de, 0x002d058b}}, Y: Field{[10]uint32{0x023b385b, 0x0149585a, 0x01120a40, 0x005dee3b, 0x02eecf22, 0x00183660, 0x03978733, 0x0074d918, 0x00d0c921, 0x00333384}}}, + {X: Field{[10]uint32{0x012b33a2, 0x011a75e3, 0x019b7a2a, 0x02359513, 0x00a58100, 0x0282e350, 0x02919552, 0x00d75eaf, 0x0166ca42, 0x0011afc9}}, Y: Field{[10]uint32{0x02785040, 0x01f21ff1, 0x01ef10b7, 0x03c0085c, 0x01285b5c, 0x0342f275, 0x0182e39c, 0x0221064b, 0x016bb827, 0x001bd9bf}}}, + {X: Field{[10]uint32{0x0159ab2f, 0x02a4538f, 0x036b7419, 0x01a0aa7b, 0x01b5422a, 0x022704d7, 0x02dfcd1b, 0x02a73e2e, 0x01a4e869, 0x001e111b}}, Y: Field{[10]uint32{0x028c9ce3, 0x00ad6196, 0x0098327d, 0x02fcb50a, 0x023f5f31, 0x00cefaf7, 0x003c051f, 0x011b0678, 0x0131db7e, 0x0010856c}}}, + {X: Field{[10]uint32{0x0205f3b7, 0x02fc0055, 0x01d1f4be, 0x032972f4, 0x03fa2b01, 0x017ae3b6, 0x03dc7629, 0x0203350a, 0x02055110, 0x0021a21a}}, Y: Field{[10]uint32{0x03914466, 0x001f9dfd, 0x037d7675, 0x03b565e9, 0x00f9b753, 0x00eb7501, 0x038854a8, 0x030371c1, 0x01f35579, 0x0031c6da}}}, + {X: Field{[10]uint32{0x03713388, 0x03652f20, 0x03371e16, 0x03f2ca29, 0x0036d5fa, 0x011101b8, 0x038675a7, 0x03f10ff4, 0x035e37f8, 0x00280b99}}, Y: Field{[10]uint32{0x0041239e, 0x005cf7bf, 0x01c36de3, 0x03568626, 0x004ee66b, 0x01dfa7ab, 0x02162512, 0x020353ab, 0x0141835c, 0x0035be69}}}, + {X: Field{[10]uint32{0x0092bf26, 0x03322261, 0x03f14ea4, 0x01dfb8a1, 0x009b2997, 0x025ef013, 0x01100966, 0x01b3b734, 0x02a8432c, 0x00285ada}}, Y: Field{[10]uint32{0x020db298, 0x035c9053, 0x01aced2f, 0x028627bc, 0x021e734d, 0x03a9f853, 0x00ed6446, 0x010ab034, 0x0270ef9e, 0x00017046}}}, + {X: Field{[10]uint32{0x00f45b5a, 0x0052e638, 0x01c5c971, 0x00afe1a1, 0x0212d7fc, 0x01ee07f2, 0x03a1205f, 0x03979742, 0x02fe775f, 0x0019a8fc}}, Y: Field{[10]uint32{0x025e3eaf, 0x008c1417, 0x001c8c18, 0x038a57b4, 0x0100e626, 0x002d3ac8, 0x00daad03, 0x03527554, 0x0114a49a, 0x0014166f}}}, + {X: Field{[10]uint32{0x0314b3a1, 0x004de114, 0x01785962, 0x0183aa15, 0x02a1f094, 0x0184542e, 0x01c63210, 0x001319d5, 0x03cebf9a, 0x002691e8}}, Y: Field{[10]uint32{0x0040a80a, 0x03bf03bb, 0x02acbc6c, 0x03c8ae57, 0x03efd3a3, 0x024a5a49, 0x03c7045b, 0x01f9abcd, 0x02ce8f38, 0x0008b697}}}, + {X: Field{[10]uint32{0x036628c5, 0x03d89cd6, 0x02c6f97a, 0x014d27e6, 0x0312b25a, 0x03c63ea1, 0x00e3c288, 0x02e6878f, 0x00149027, 0x00070050}}, Y: Field{[10]uint32{0x02448a4f, 0x015b2583, 0x03d353a4, 0x00d15d4e, 0x0087b499, 0x00583e5e, 0x00bc34ff, 0x034f5ade, 0x00fcd048, 0x0019c864}}}, + {X: Field{[10]uint32{0x028d84cc, 0x03bff94b, 0x0231d057, 0x0002793a, 0x018d1374, 0x025f81d9, 0x00965cd4, 0x03a1d96b, 0x030a1de5, 0x0030b659}}, Y: Field{[10]uint32{0x013ccdf1, 0x029c9c7c, 0x02379cc7, 0x02303e14, 0x00b97a2e, 0x00a55b42, 0x0356b585, 0x03eec4ea, 0x0247a6dd, 0x003fe061}}}, + {X: Field{[10]uint32{0x0196ec1d, 0x006c7972, 0x026910e0, 0x03954e5a, 0x03d21339, 0x005075a3, 0x00e094c4, 0x01a9a5c3, 0x004716fd, 0x0006a7fb}}, Y: Field{[10]uint32{0x03f8557e, 0x001b62e4, 0x0140c240, 0x00e047d7, 0x01d29b87, 0x025778a4, 0x037639b5, 0x01cffa53, 0x02eb6c83, 0x0038e3ac}}}, + {X: Field{[10]uint32{0x01d8c464, 0x015abec0, 0x03bae778, 0x019a6358, 0x0053a514, 0x02c6ac9b, 0x029e5006, 0x0069b503, 0x02ed15e9, 0x002df7d4}}, Y: Field{[10]uint32{0x02e21254, 0x03b14c2d, 0x01ac1162, 0x0034297f, 0x01705c36, 0x03c60354, 0x010706ff, 0x03f63e67, 0x01bfd915, 0x003a983c}}}, + {X: Field{[10]uint32{0x03db6b5f, 0x03e65675, 0x039d1295, 0x03e21222, 0x00918ba7, 0x000d4cd4, 0x0086a534, 0x00b8bef7, 0x00cabd09, 0x0000be57}}, Y: Field{[10]uint32{0x01693ad2, 0x01192368, 0x02a7b523, 0x024e36c7, 0x01d5b0f8, 0x0026fce3, 0x02a9c3df, 0x03b61967, 0x0014fe6c, 0x000c515a}}}, + {X: Field{[10]uint32{0x018a7c1c, 0x029984af, 0x03fea883, 0x028df7bc, 0x023b6ae1, 0x00df9008, 0x01a432ca, 0x03936da8, 0x02c864df, 0x001d8e49}}, Y: Field{[10]uint32{0x0361bd1f, 0x00fc2970, 0x03a410bd, 0x0396e793, 0x00a3e741, 0x0203c7e6, 0x00b3e63d, 0x03443aed, 0x03724378, 0x003cd356}}}, + {X: Field{[10]uint32{0x00a31b0d, 0x0201f272, 0x00ebf72a, 0x03746371, 0x03708ce2, 0x032db262, 0x012a513f, 0x01b3dbcc, 0x027a1291, 0x000b90ef}}, Y: Field{[10]uint32{0x0024acfa, 0x03a67437, 0x019c5971, 0x0024232d, 0x00a3a9dc, 0x03545334, 0x0257b6ce, 0x01f95c5b, 0x0224ce1b, 0x0036e464}}}, + {X: Field{[10]uint32{0x014a5561, 0x02583073, 0x02df9a56, 0x03ec4e96, 0x002d1acd, 0x03f1a1cf, 0x0331984a, 0x01f4a1d9, 0x008f1a86, 0x001f5979}}, Y: Field{[10]uint32{0x0183ebfc, 0x01f32fb6, 0x029da7b9, 0x00daf9f9, 0x00bc9924, 0x02bde576, 0x00e2d4bc, 0x01eb4bfc, 0x0155f095, 0x00271cee}}}, + {X: Field{[10]uint32{0x0019d725, 0x02529c5e, 0x02b7c10b, 0x021f171d, 0x006b132c, 0x035c54e4, 0x02166f04, 0x02ddcb2b, 0x00c03131, 0x00071afb}}, Y: Field{[10]uint32{0x023280ad, 0x0313492c, 0x0106e318, 0x008b3ed2, 0x0041b84a, 0x02bf7d82, 0x03dd26cd, 0x0214cc25, 0x00ff9499, 0x000b0f19}}}, + {X: Field{[10]uint32{0x03347675, 0x02ca9904, 0x020f8198, 0x02c1fa74, 0x01aff339, 0x01fb7c1e, 0x02c83c7d, 0x020408ca, 0x025d5d11, 0x003d410a}}, Y: Field{[10]uint32{0x01a3e4c8, 0x01f7ff5e, 0x01d20b59, 0x015d6a2f, 0x02b2723f, 0x02811414, 0x02388020, 0x03f1b4bc, 0x03bce644, 0x00067043}}}, + {X: Field{[10]uint32{0x014be300, 0x00cd622f, 0x02539b48, 0x03c0b784, 0x030e0ee9, 0x01038213, 0x000c8872, 0x00d4f9b8, 0x0066c2c0, 0x001f0e1e}}, Y: Field{[10]uint32{0x032b8f79, 0x00ded0fb, 0x00ab400c, 0x0155b2bd, 0x0356f088, 0x001d2003, 0x03c49c6d, 0x0316350b, 0x0394587f, 0x0033319b}}}, + {X: Field{[10]uint32{0x02b3c140, 0x0081b93a, 0x034e0b7b, 0x03445a47, 0x02104b35, 0x022e8bb7, 0x02381945, 0x0370adb3, 0x0123d33a, 0x003b3a2b}}, Y: Field{[10]uint32{0x000c0a88, 0x029023df, 0x01e7c5c6, 0x00bd4d99, 0x031c7e67, 0x0326dca3, 0x00245a12, 0x034fd7cf, 0x02c07fa1, 0x003bb25d}}}, + {X: Field{[10]uint32{0x01d12b9d, 0x02bd63c6, 0x03c56a1b, 0x0064f8b2, 0x00b951cf, 0x034085dd, 0x02efecc7, 0x0370e327, 0x0126a274, 0x00208ac2}}, Y: Field{[10]uint32{0x00118313, 0x0030b791, 0x0263f1be, 0x0021443f, 0x023638f0, 0x03f3c144, 0x014d2c49, 0x030dd60c, 0x010af9ca, 0x00122f2c}}}, + {X: Field{[10]uint32{0x0385b8c3, 0x00b9dec3, 0x028a85cd, 0x011e0311, 0x03401dfe, 0x03398bf8, 0x0058d257, 0x03d0a3e8, 0x02036ef5, 0x00349a8e}}, Y: Field{[10]uint32{0x026a6fa7, 0x02c45d44, 0x00ba010f, 0x033e6eb9, 0x0362f1bb, 0x00c230b6, 0x01c6759a, 0x010ca5f5, 0x03623a64, 0x002630e5}}}, + {X: Field{[10]uint32{0x03019090, 0x00f0d1a4, 0x024beb5b, 0x037eec59, 0x0124c8fc, 0x02891f47, 0x0002ab6c, 0x032ef40c, 0x001d8aa0, 0x001ffaee}}, Y: Field{[10]uint32{0x02c3ec26, 0x02918129, 0x03b446cf, 0x008f62c8, 0x03966dc9, 0x02a12e6f, 0x00ca6c02, 0x01b69d51, 0x03cb12ca, 0x003b9896}}}, + {X: Field{[10]uint32{0x01d3473c, 0x03cac394, 0x0008733d, 0x00a9b78b, 0x02b7aa00, 0x030d912e, 0x0363a75c, 0x02daef9b, 0x00e72d43, 0x0020e791}}, Y: Field{[10]uint32{0x000fb9a9, 0x02478c4d, 0x03da43e5, 0x026150ac, 0x002d876d, 0x01dd6fda, 0x0163806d, 0x00508829, 0x023526f4, 0x0020da3d}}}, + {X: Field{[10]uint32{0x030d7afe, 0x0163ab36, 0x01135ea9, 0x025e1b48, 0x017e049b, 0x00fcbbb6, 0x02c84f32, 0x0381f278, 0x03da1c96, 0x0014ba51}}, Y: Field{[10]uint32{0x0073a831, 0x019c39b5, 0x0097d9fa, 0x003b7112, 0x02bdbbe5, 0x027e9cae, 0x01e19a90, 0x0034f4e7, 0x02c9e0c7, 0x001af3f7}}}, + {X: Field{[10]uint32{0x027f3603, 0x0231ad31, 0x000cedb1, 0x01d33f2c, 0x00c8b220, 0x0323a793, 0x03f6dd71, 0x029d0c75, 0x002605e4, 0x001cbb15}}, Y: Field{[10]uint32{0x006b5ee5, 0x01b53e9e, 0x01023615, 0x03e056f2, 0x0249455c, 0x007bb52e, 0x02a6d715, 0x03be53d7, 0x020b7f9d, 0x00376e4d}}}, + {X: Field{[10]uint32{0x0006c849, 0x026b74c5, 0x00f36af3, 0x03a75aa4, 0x012ac051, 0x00a18f44, 0x02bf9baf, 0x015a2405, 0x031559a5, 0x000dc28f}}, Y: Field{[10]uint32{0x03005840, 0x0283b187, 0x01ddaba3, 0x024c8d74, 0x03ee80d9, 0x002c419e, 0x01ab5d32, 0x033b9825, 0x01a68517, 0x0021532f}}}, + {X: Field{[10]uint32{0x03ef5dc2, 0x03e68e66, 0x02c6a714, 0x0033dc66, 0x0141d1cf, 0x01dfbda8, 0x03af5275, 0x03ef6f2c, 0x008860d2, 0x0004b95e}}, Y: Field{[10]uint32{0x02bd9ea2, 0x01b17061, 0x00821ab4, 0x027192b7, 0x01a09496, 0x01692d1d, 0x03b79ead, 0x0049bdf6, 0x02ca5dd8, 0x003d6bde}}}, + {X: Field{[10]uint32{0x00a2b722, 0x02b630cc, 0x025bdfe2, 0x0322b282, 0x028b7905, 0x015efe74, 0x031abad7, 0x0297785e, 0x03cd0b2f, 0x002d252a}}, Y: Field{[10]uint32{0x0294cb87, 0x02475ca4, 0x01adfbf9, 0x00431902, 0x00cbacf7, 0x0100693e, 0x038d8aee, 0x0186767f, 0x03d6dad8, 0x0030e5ff}}}, + {X: Field{[10]uint32{0x02b9d89c, 0x011817a2, 0x02a83106, 0x03912677, 0x03118ea6, 0x03dc6f72, 0x008245c0, 0x002e52c8, 0x012d900d, 0x000a55da}}, Y: Field{[10]uint32{0x00444a7b, 0x03595690, 0x02a91857, 0x00adfaee, 0x00f12934, 0x03f09354, 0x0037e940, 0x02bfa800, 0x00479284, 0x0028f155}}}, + {X: Field{[10]uint32{0x01bd20eb, 0x02fdc8e8, 0x00cda39c, 0x034cb927, 0x031969ae, 0x03052979, 0x0213642d, 0x0381caf2, 0x0079f325, 0x00184406}}, Y: Field{[10]uint32{0x00e443b3, 0x016611c0, 0x017a9c1d, 0x00fb599d, 0x03e5c248, 0x02763ac2, 0x0367269e, 0x0392ef56, 0x00824816, 0x00138667}}}, + {X: Field{[10]uint32{0x0255ab18, 0x027106ae, 0x034e429a, 0x0352642a, 0x02c65f6a, 0x009c87ef, 0x028c648c, 0x011d3e2a, 0x00b299f3, 0x0027ba92}}, Y: Field{[10]uint32{0x03234443, 0x01f62707, 0x00654c1d, 0x024befb8, 0x03b68028, 0x03cad687, 0x00570497, 0x0346f1fa, 0x029735ce, 0x0004e551}}}, + {X: Field{[10]uint32{0x018bd97a, 0x03d00ed4, 0x03c5cc9d, 0x02d8c7c6, 0x013fff42, 0x028da023, 0x00759826, 0x02dc1f29, 0x00d78ba7, 0x0036ec15}}, Y: Field{[10]uint32{0x011b923a, 0x021e5d58, 0x01d4a89d, 0x03e06ae5, 0x030a55a1, 0x009f9e07, 0x00048854, 0x00e95775, 0x02c09634, 0x000e5bbd}}}, + {X: Field{[10]uint32{0x021bbcf1, 0x03cf2aad, 0x0275cd70, 0x01056c23, 0x01b2f625, 0x01705372, 0x03cc0ea3, 0x00bbd276, 0x03d57fdd, 0x0036ea56}}, Y: Field{[10]uint32{0x00d20a3d, 0x02438c80, 0x004cc64a, 0x02b2ba4e, 0x020b8f76, 0x0054566e, 0x036dba84, 0x01f91862, 0x025eb7a1, 0x000abc25}}}, + {X: Field{[10]uint32{0x02d0e5be, 0x02fabee2, 0x02ef5297, 0x00c9c8bd, 0x030bf1a1, 0x00f1d576, 0x02d8febc, 0x02ec3f9c, 0x02c97979, 0x0001b0c4}}, Y: Field{[10]uint32{0x0202c6ea, 0x0001c620, 0x006438be, 0x0185c7de, 0x006c4359, 0x0363ead5, 0x038d5ea3, 0x01ce777d, 0x0388db74, 0x000d8d98}}}, + {X: Field{[10]uint32{0x008825cd, 0x038c6db7, 0x021e5b9f, 0x00c2a8c5, 0x03ad9870, 0x006335c5, 0x01b8638e, 0x02f23d52, 0x0057a494, 0x00197adc}}, Y: Field{[10]uint32{0x03a80312, 0x019a530b, 0x03c92765, 0x01088256, 0x02160b7b, 0x021c1a38, 0x016b4acf, 0x02178246, 0x02a167f2, 0x00116080}}}, + {X: Field{[10]uint32{0x02ffa7f6, 0x01f8ae53, 0x000d6b56, 0x009b610b, 0x02c11174, 0x00abaf47, 0x01db7cbd, 0x01a36bb5, 0x0117b0e8, 0x00281a5a}}, Y: Field{[10]uint32{0x01ecba78, 0x0159d710, 0x030f5ba5, 0x00f8dffa, 0x03c797ec, 0x03a2f6a2, 0x01cb828b, 0x013723c0, 0x020da1bb, 0x00321d34}}}, + {X: Field{[10]uint32{0x002cced2, 0x009f195e, 0x0387903b, 0x01e474ed, 0x01108744, 0x0021ad93, 0x01378301, 0x00a84cb7, 0x03821937, 0x0010646e}}, Y: Field{[10]uint32{0x03dc3f2c, 0x024bf299, 0x03b4a348, 0x01e40925, 0x00493352, 0x00b84c2f, 0x02e52bf8, 0x03486347, 0x03c98ce4, 0x0031d241}}}, + {X: Field{[10]uint32{0x01b218c3, 0x039fd71e, 0x0038f3c3, 0x03c82427, 0x030945e3, 0x02572563, 0x023b9b2b, 0x024fb964, 0x01337212, 0x001d7cdf}}, Y: Field{[10]uint32{0x01928be7, 0x037ab3a9, 0x02a339af, 0x02847d00, 0x02a7d2fd, 0x033c46a8, 0x0328e181, 0x008a9e8b, 0x038ec6b2, 0x002b0107}}}, + {X: Field{[10]uint32{0x02fb154e, 0x01c6bee5, 0x02c65785, 0x03dc0775, 0x026004d1, 0x03c62a12, 0x00b3bef6, 0x00bca408, 0x033ab58b, 0x0032f0c5}}, Y: Field{[10]uint32{0x01fd5c37, 0x0393783e, 0x0089226d, 0x0325863a, 0x01b8f36e, 0x0255dfb8, 0x03c166de, 0x011050b4, 0x00b76f26, 0x003104e8}}}, + {X: Field{[10]uint32{0x02e226cc, 0x0390dc36, 0x00dd92a5, 0x03d16fd3, 0x0164f212, 0x0067346f, 0x02888324, 0x03e965a5, 0x0309a139, 0x0019395a}}, Y: Field{[10]uint32{0x010fbbbe, 0x02f06781, 0x02fa7671, 0x02a18a80, 0x01d10915, 0x02d0a505, 0x001eb3d0, 0x0240592d, 0x02eef242, 0x002a4653}}}, + {X: Field{[10]uint32{0x015285a6, 0x033ed24d, 0x0014f73b, 0x0140273f, 0x0334e133, 0x0380be44, 0x022c2fb8, 0x01b3ca68, 0x01c5e288, 0x0038cde5}}, Y: Field{[10]uint32{0x01afb304, 0x035908c0, 0x035e15c2, 0x03431b37, 0x01f7c575, 0x02d2ec19, 0x02580cb7, 0x01231c93, 0x0121f33d, 0x001e243f}}}, + {X: Field{[10]uint32{0x02b0b6dc, 0x01739d69, 0x036998f2, 0x0250d7ad, 0x036e6a09, 0x01b1e48c, 0x0143d2c7, 0x03428345, 0x026b7a73, 0x0001e5d7}}, Y: Field{[10]uint32{0x023eb06f, 0x00738bfd, 0x03115012, 0x004289fd, 0x008f16eb, 0x0158af09, 0x0248d5f7, 0x024fb757, 0x00aec689, 0x00042c58}}}, + {X: Field{[10]uint32{0x01580f6f, 0x01c73774, 0x03ce02ad, 0x02124b38, 0x03c1ca44, 0x0007d106, 0x02093d08, 0x00e59e4b, 0x03cbf9c1, 0x001b4344}}, Y: Field{[10]uint32{0x03b45746, 0x012fcb3a, 0x016f1bae, 0x0351c769, 0x014bdb25, 0x01e910c2, 0x01dcfe33, 0x03c08aef, 0x023884ca, 0x0005eb90}}}, + {X: Field{[10]uint32{0x03df0154, 0x01d28806, 0x008560a9, 0x019cfef4, 0x0360d398, 0x0098200d, 0x03d3f904, 0x00ad6727, 0x014a23af, 0x0008657c}}, Y: Field{[10]uint32{0x00136a8d, 0x00fb853e, 0x02111da5, 0x01621bfd, 0x025ff1aa, 0x014028dc, 0x01b3a10b, 0x03bc07d3, 0x038c9a44, 0x003f016c}}}, + {X: Field{[10]uint32{0x03713628, 0x029ff7e2, 0x03c4dac2, 0x0220e113, 0x021f5582, 0x03477468, 0x0354e167, 0x03e2e746, 0x007360ac, 0x0011d9e7}}, Y: Field{[10]uint32{0x03803ea7, 0x00fdb285, 0x007510a9, 0x002bfce9, 0x037ca018, 0x013df365, 0x014bbde9, 0x03a07793, 0x0225f3b8, 0x0020a808}}}, + {X: Field{[10]uint32{0x0230831a, 0x02a9f277, 0x00655ac9, 0x00b8bdf2, 0x038cb4ff, 0x030859af, 0x03fe514c, 0x029a6c8f, 0x02f51636, 0x002c2f40}}, Y: Field{[10]uint32{0x03d5f518, 0x03743423, 0x0081448a, 0x00fee9b2, 0x00f4843b, 0x02fae8f6, 0x03ffc51f, 0x032f14a9, 0x016248ba, 0x0001cfeb}}}, + {X: Field{[10]uint32{0x03660158, 0x0226c068, 0x034520c6, 0x00548f2d, 0x000aab5f, 0x036fb16e, 0x03f81afa, 0x03e07fb4, 0x03d6bfe9, 0x0037ebbf}}, Y: Field{[10]uint32{0x01240583, 0x017cf6b2, 0x0324df3b, 0x0200435e, 0x0330c4bf, 0x032d6d53, 0x00a4bf9c, 0x0120539b, 0x0105c3ef, 0x000fd534}}}, + {X: Field{[10]uint32{0x000d42ed, 0x02b81afd, 0x00ba7046, 0x038fadf9, 0x0080dffa, 0x01bf5af9, 0x013d2e79, 0x0079263d, 0x02bbda66, 0x003ac05a}}, Y: Field{[10]uint32{0x02f895be, 0x03e0e89e, 0x011f518b, 0x03b5b4a7, 0x0110f005, 0x030b97a1, 0x014d50ad, 0x0166a5b3, 0x01bbaa76, 0x000c435b}}}, + {X: Field{[10]uint32{0x019fb2ed, 0x01ebec32, 0x01173e51, 0x01334bcd, 0x01726378, 0x00dfe398, 0x035b5eb1, 0x0202cdb4, 0x03c43c08, 0x00262786}}, Y: Field{[10]uint32{0x01faa1d8, 0x02dd1da7, 0x012feb53, 0x02d30b36, 0x00999b3b, 0x0077ddf6, 0x035963d1, 0x033314e8, 0x035f110c, 0x0013133a}}}, + {X: Field{[10]uint32{0x02033811, 0x03846630, 0x010bbfbe, 0x01be4249, 0x00dd801d, 0x01db57bf, 0x025bd407, 0x01eefc7d, 0x0170be4a, 0x0002fac0}}, Y: Field{[10]uint32{0x0086461f, 0x037304e1, 0x01644ff4, 0x0277f316, 0x000f5234, 0x01b4f39b, 0x02998202, 0x0268e15e, 0x018a1d32, 0x0004d5ae}}}, + {X: Field{[10]uint32{0x03c0b145, 0x032d0abf, 0x0112e337, 0x01756d83, 0x02ea9bc5, 0x01b10a5a, 0x035e5969, 0x026935bd, 0x03c1986f, 0x0000b642}}, Y: Field{[10]uint32{0x031a0c4c, 0x0327c1bd, 0x03b5b48d, 0x02fb4bbc, 0x02b377cc, 0x019fabed, 0x004b721e, 0x00665efe, 0x0364734d, 0x001f55f3}}}, + {X: Field{[10]uint32{0x009f51bf, 0x02729dde, 0x02481e82, 0x03cffb9c, 0x0159fd53, 0x030d9cef, 0x0196848d, 0x02018b78, 0x0254c960, 0x001ade9a}}, Y: Field{[10]uint32{0x0009af23, 0x0148939b, 0x0321a579, 0x00ad0f2f, 0x03dd4dc4, 0x0162bef8, 0x0079f30c, 0x0229a7c2, 0x0208157b, 0x001aa7b8}}}, + {X: Field{[10]uint32{0x028e8393, 0x02f2da0d, 0x03a8bf4a, 0x03a221c3, 0x0316faf0, 0x02df9fba, 0x01f8fa87, 0x037f9da3, 0x00c732cb, 0x00326491}}, Y: Field{[10]uint32{0x035620ae, 0x0303f0a1, 0x01951bc0, 0x02331a92, 0x0058cc9b, 0x00b6b8ba, 0x0163453b, 0x00ab4901, 0x035553ba, 0x00082b46}}}, + {X: Field{[10]uint32{0x00f01b6b, 0x01c7e51c, 0x013f6d28, 0x009a707e, 0x01350fef, 0x0026807f, 0x01cf4fc6, 0x0237157c, 0x007b402a, 0x00154ff0}}, Y: Field{[10]uint32{0x00e5a824, 0x02644dcd, 0x002909c1, 0x005df91c, 0x039b3102, 0x035f54ea, 0x03cd0dc7, 0x01b7bfe9, 0x00753961, 0x000ed463}}}, + {X: Field{[10]uint32{0x00fe2f69, 0x012fb030, 0x02369a4e, 0x009e524b, 0x03721fa9, 0x00d3216e, 0x00dfc80a, 0x0229f2cf, 0x037806ed, 0x003164c0}}, Y: Field{[10]uint32{0x0317c149, 0x031e94cd, 0x023001e1, 0x019e7d11, 0x02d7580e, 0x004ff5c0, 0x016dea62, 0x0244a4de, 0x00698a3e, 0x000da679}}}, + {X: Field{[10]uint32{0x011e7eb5, 0x02fb3224, 0x01c6a79d, 0x01ffc744, 0x008cda0e, 0x030d275d, 0x034613d8, 0x026592e3, 0x0118f4d5, 0x0032dbc4}}, Y: Field{[10]uint32{0x01de20ee, 0x020d723f, 0x036f4cf4, 0x00f5f799, 0x030ca0fe, 0x02095f11, 0x03cc88f4, 0x03573dc8, 0x028898b0, 0x0018ac2b}}}, + {X: Field{[10]uint32{0x01a26db9, 0x03148a8c, 0x009a946f, 0x023259a2, 0x0078b5d4, 0x037b2e67, 0x0322ae61, 0x019a3765, 0x038f8c26, 0x00368b2a}}, Y: Field{[10]uint32{0x010c7e98, 0x007869db, 0x01ad8fc2, 0x01ac4921, 0x01180849, 0x0324ec4c, 0x0214cb70, 0x03e52529, 0x037e0234, 0x001a80cd}}}, + {X: Field{[10]uint32{0x003b7d86, 0x023579ad, 0x00a82b22, 0x020e69bb, 0x03fa595b, 0x003c0fbb, 0x03374110, 0x038f1ff8, 0x01423f9b, 0x003f1a93}}, Y: Field{[10]uint32{0x0298beff, 0x01da1968, 0x016f5bb4, 0x01b89a46, 0x0027dfbd, 0x03094fea, 0x0078fdda, 0x02f868f7, 0x0144eb8f, 0x001b0225}}}, + {X: Field{[10]uint32{0x03dee882, 0x00dd5b78, 0x03e09db7, 0x0126509b, 0x003d09fb, 0x032a5183, 0x03258e83, 0x038341dc, 0x011ab9c6, 0x001cf26a}}, Y: Field{[10]uint32{0x0171d2b3, 0x0358d7f9, 0x0222478c, 0x00411741, 0x0352040a, 0x027b61da, 0x0290259c, 0x01422b56, 0x0327efc0, 0x0022cc50}}}, + {X: Field{[10]uint32{0x034516d3, 0x01d1328e, 0x02762933, 0x0122ba5d, 0x022bc028, 0x012e0265, 0x03e61271, 0x033470d0, 0x006145b8, 0x00029a7c}}, Y: Field{[10]uint32{0x030ebe3d, 0x03688275, 0x009aea86, 0x006d1fd9, 0x0396b6d9, 0x02185789, 0x016caf01, 0x00dd07b0, 0x0190b450, 0x0021d463}}}, + {X: Field{[10]uint32{0x00ed9691, 0x0148d7ca, 0x02572fc9, 0x003d11a8, 0x01376a43, 0x0056e910, 0x01dfb2ac, 0x0102dc73, 0x022570df, 0x00072f92}}, Y: Field{[10]uint32{0x0213de85, 0x01748095, 0x0380b6ef, 0x03ce6714, 0x02c8ac69, 0x02ce54fb, 0x02a2d10a, 0x0386ab3c, 0x02ccf262, 0x00049553}}}, + {X: Field{[10]uint32{0x0388e27d, 0x0320df6d, 0x0052fd13, 0x006a209e, 0x014ee2f1, 0x02822c64, 0x005ac85b, 0x0333ed0c, 0x01c7406d, 0x00237a92}}, Y: Field{[10]uint32{0x03e9d9b0, 0x00a55ef3, 0x00056d90, 0x0395a5ed, 0x002b6071, 0x01e8141b, 0x038b15ab, 0x01f0faea, 0x01a83b51, 0x0031cf58}}}, + {X: Field{[10]uint32{0x02d0ade5, 0x0310e921, 0x0094f6e4, 0x01f4156f, 0x025e4b71, 0x0074e35a, 0x00ab5af8, 0x0330ec7b, 0x0377b175, 0x0037a498}}, Y: Field{[10]uint32{0x03d0e11f, 0x00e1f545, 0x01cb973c, 0x02b39834, 0x016be387, 0x02352e2c, 0x0289115d, 0x0365d350, 0x03e79169, 0x000a757c}}}, + {X: Field{[10]uint32{0x03b41497, 0x02896c34, 0x00fa38a9, 0x03317ac6, 0x00f6e8a9, 0x03549450, 0x0055a2f3, 0x01ead2ad, 0x02a7aeb3, 0x001b9dba}}, Y: Field{[10]uint32{0x01e066fa, 0x0064f925, 0x0108a89f, 0x00f35a42, 0x0144c40a, 0x011eaaf6, 0x03fb936a, 0x027456ef, 0x005a7890, 0x0001f8f3}}}, + {X: Field{[10]uint32{0x00607574, 0x03b43e2f, 0x03f8f09e, 0x0274dfd7, 0x01467853, 0x026247e6, 0x022b03fc, 0x01fc3699, 0x02cf22d5, 0x000dc4c7}}, Y: Field{[10]uint32{0x0249f3b3, 0x01e87244, 0x026acc17, 0x02a9aaeb, 0x01281323, 0x005cf52e, 0x011d596e, 0x00a5a3d8, 0x012169d4, 0x00300ecb}}}, + {X: Field{[10]uint32{0x025d8152, 0x004fcdd2, 0x024e7667, 0x023d25e6, 0x0365155c, 0x0337c3ae, 0x0276633b, 0x02655ca3, 0x001482c8, 0x001c8222}}, Y: Field{[10]uint32{0x0174eedc, 0x01d8b972, 0x02e92d2a, 0x01d2d22b, 0x00588a79, 0x02642803, 0x00e26f81, 0x03722f6a, 0x019f8c0a, 0x0019e0f1}}}, + {X: Field{[10]uint32{0x03241864, 0x0048d974, 0x01e8adb7, 0x03345136, 0x02d4567f, 0x02fe74f3, 0x03a7a7ad, 0x0112ca9f, 0x03dfbaca, 0x0006e098}}, Y: Field{[10]uint32{0x0388606d, 0x02906fb5, 0x02785783, 0x02020065, 0x02edf366, 0x00b6b00d, 0x004b98db, 0x00450c65, 0x023e24f0, 0x00007f1f}}}, + {X: Field{[10]uint32{0x02f5fd43, 0x02309833, 0x013dff1a, 0x0381684c, 0x03ea41ba, 0x03560fb7, 0x019714db, 0x01fcae06, 0x02de27ca, 0x0001e8dc}}, Y: Field{[10]uint32{0x02281142, 0x01bc6e6d, 0x032e2091, 0x0192e83a, 0x01a5d3ab, 0x03d793b5, 0x0060f220, 0x015e16d7, 0x016bb32c, 0x002838c8}}}, + {X: Field{[10]uint32{0x00d02300, 0x03b03aa3, 0x0232a72b, 0x03f5e750, 0x00c30f22, 0x0156b07c, 0x03b94327, 0x01124722, 0x01aa5525, 0x001c6057}}, Y: Field{[10]uint32{0x036471b4, 0x03c58031, 0x03804876, 0x00613118, 0x003ade09, 0x013af8f0, 0x02fcc688, 0x0170597e, 0x03928de1, 0x0022cd04}}}, + {X: Field{[10]uint32{0x03654d2b, 0x031714ff, 0x01c785d1, 0x01304b22, 0x0205535d, 0x027c815b, 0x02d866a0, 0x033192d8, 0x037ad3cf, 0x00006952}}, Y: Field{[10]uint32{0x03a12f19, 0x020e42d1, 0x012e841d, 0x03e774a2, 0x03e9f5ae, 0x0247b0c1, 0x0077395a, 0x021ef48b, 0x02e39f4b, 0x002df1de}}}, + {X: Field{[10]uint32{0x019c44a6, 0x00adfb66, 0x01987726, 0x0081d00e, 0x0022cd28, 0x035d68bb, 0x030b6953, 0x01cf9772, 0x00571fc9, 0x002172d1}}, Y: Field{[10]uint32{0x010f6aa5, 0x034cc627, 0x02d53280, 0x01eaf41b, 0x0358037a, 0x03850824, 0x014ef028, 0x03f99b03, 0x01f3bd13, 0x003bf747}}}, + {X: Field{[10]uint32{0x00fd4e4e, 0x02f7dd7f, 0x03962c35, 0x02384e37, 0x02cd72df, 0x0101e8da, 0x00b305a2, 0x00432509, 0x009c64a0, 0x00263a19}}, Y: Field{[10]uint32{0x01a6c60b, 0x02a921b5, 0x008efcd3, 0x03dbf338, 0x01624a8c, 0x030febb4, 0x01f77704, 0x0175f152, 0x01693439, 0x002a0131}}}, + {X: Field{[10]uint32{0x00a5a72b, 0x0002e51d, 0x028817e5, 0x0191a71a, 0x035019a1, 0x01d3eb22, 0x00338958, 0x0396a23d, 0x03e6a297, 0x0007ab11}}, Y: Field{[10]uint32{0x01a11105, 0x02792b83, 0x00325f51, 0x028a570c, 0x01043a10, 0x03992e7b, 0x000bb1ff, 0x037abbce, 0x026b784d, 0x0022df6a}}}, + {X: Field{[10]uint32{0x004f42f5, 0x012b9a01, 0x026bc96c, 0x031e80a9, 0x01e29950, 0x029c8f89, 0x029e0ab6, 0x01cd8c5f, 0x006591f2, 0x003c1e6b}}, Y: Field{[10]uint32{0x0032dfc5, 0x02051a71, 0x00562249, 0x0340f649, 0x03490186, 0x005287bd, 0x00c3ca02, 0x010dd12b, 0x01bfc99f, 0x003aa1f4}}}, + {X: Field{[10]uint32{0x02539643, 0x01c72a8c, 0x0186eba4, 0x03a21a0c, 0x00fa0d94, 0x001dec76, 0x011c3ada, 0x00c383c0, 0x0179bf1f, 0x0035b427}}, Y: Field{[10]uint32{0x00aa8adf, 0x03d7325f, 0x00049876, 0x00dd19af, 0x00ef5100, 0x036b4b52, 0x030494dc, 0x03d507dc, 0x0064fac8, 0x0021dc2f}}}, + {X: Field{[10]uint32{0x00351f65, 0x03cee82e, 0x0291e3af, 0x029ac793, 0x01d6416c, 0x020c4fe2, 0x00595656, 0x00cda01c, 0x03d9f896, 0x000ddb92}}, Y: Field{[10]uint32{0x025f13f1, 0x014de379, 0x0295b78a, 0x03a91feb, 0x000497de, 0x0111f2ca, 0x019e8b96, 0x023c757a, 0x01e56724, 0x002e90db}}}, + {X: Field{[10]uint32{0x039f20d7, 0x0231d042, 0x0210c657, 0x014eee85, 0x000b17cb, 0x025be0d3, 0x0193daec, 0x031e6688, 0x02184b42, 0x0009c3ce}}, Y: Field{[10]uint32{0x03e7e5bc, 0x019cca15, 0x0300021b, 0x02a7d28e, 0x023a7054, 0x019ccddf, 0x00fb0d01, 0x022eec28, 0x012b9ab9, 0x003333ac}}}, + {X: Field{[10]uint32{0x02c1a599, 0x00169743, 0x02de20f5, 0x02dfea62, 0x00b055d2, 0x00ed25b4, 0x0247a8a9, 0x014d20a7, 0x03641a1e, 0x002b89c6}}, Y: Field{[10]uint32{0x03c2bdd3, 0x03ec911f, 0x0181e45d, 0x02294f05, 0x01584790, 0x021ebea7, 0x02a9a23f, 0x0207c948, 0x012f39b4, 0x00053a55}}}, + {X: Field{[10]uint32{0x03f28c8c, 0x021a6d69, 0x016a25ec, 0x00ea50ff, 0x02db36a9, 0x03b94e43, 0x0288ad64, 0x0229d2a4, 0x00fb177d, 0x0015a7ab}}, Y: Field{[10]uint32{0x03732f7c, 0x0271c6d7, 0x028440cb, 0x03d517d4, 0x02bfda9a, 0x01bd3c4d, 0x027508aa, 0x0190ae66, 0x00329127, 0x00073d8b}}}, + {X: Field{[10]uint32{0x0315b558, 0x01f3e057, 0x01e46f27, 0x03b5b4d9, 0x0041bfb5, 0x025e43e3, 0x026a2468, 0x039eea8c, 0x027ffdc4, 0x001df1fc}}, Y: Field{[10]uint32{0x021c3007, 0x03e4cee0, 0x01a4325a, 0x03ac1140, 0x00e0f970, 0x014b0bb0, 0x02a68288, 0x03976559, 0x00dc138b, 0x00134d10}}}, + {X: Field{[10]uint32{0x00adbb25, 0x03b5f625, 0x001ed132, 0x0079ee0c, 0x017d4676, 0x00113fbe, 0x03f67e9b, 0x000c1aa1, 0x02dbf173, 0x003598a4}}, Y: Field{[10]uint32{0x008b83c5, 0x03963d8b, 0x00209cb0, 0x0051bf14, 0x033d36db, 0x02ff2cca, 0x0145f238, 0x0293b648, 0x03558cec, 0x0033bbdd}}}, + {X: Field{[10]uint32{0x037ed0d6, 0x021597a9, 0x03a4925e, 0x02efd541, 0x038769e3, 0x01faec7c, 0x03927ef0, 0x01bd12dd, 0x032e12ea, 0x000710a0}}, Y: Field{[10]uint32{0x0029d5ee, 0x0394e2a7, 0x0211e280, 0x028cc9ef, 0x02786a62, 0x03879076, 0x017917d9, 0x013d769c, 0x03a4b31b, 0x0022e4e0}}}, + {X: Field{[10]uint32{0x021f7968, 0x02afddec, 0x014cc5d6, 0x00d4f34e, 0x00608324, 0x02e633cc, 0x0362911f, 0x018aa330, 0x02ff9422, 0x0018f95f}}, Y: Field{[10]uint32{0x01b009be, 0x00ba8d56, 0x036b0450, 0x038a897e, 0x00146062, 0x008ba94c, 0x0344e7d3, 0x020fc930, 0x022dfb90, 0x00278f07}}}, + {X: Field{[10]uint32{0x03b83c90, 0x01452265, 0x03f9b02a, 0x02a6d3a8, 0x00cf3ed3, 0x024253aa, 0x0088e591, 0x022971cb, 0x03a186f3, 0x002f88cf}}, Y: Field{[10]uint32{0x01dba564, 0x0067437b, 0x0156fefd, 0x03a98a5a, 0x0140bd48, 0x03714def, 0x0389ef9e, 0x02b6c9b8, 0x02b3362f, 0x00100bac}}}, + {X: Field{[10]uint32{0x01844b78, 0x0030fc58, 0x03579aaa, 0x01592892, 0x02f2cc69, 0x029cc3f3, 0x01f4d065, 0x01d3ea71, 0x03804e7c, 0x0018db76}}, Y: Field{[10]uint32{0x02a2496c, 0x03d1faf9, 0x022e7dee, 0x03ee4589, 0x026aa31f, 0x025fab22, 0x02feb598, 0x004b1808, 0x01695832, 0x001a928d}}}, + {X: Field{[10]uint32{0x02e1c5e7, 0x035b0b37, 0x01e605bd, 0x030adb9a, 0x02215ae7, 0x038bc959, 0x035af1ee, 0x0361ffde, 0x01d17250, 0x00349470}}, Y: Field{[10]uint32{0x03b4ae78, 0x012d461f, 0x004cbf55, 0x001b2116, 0x005de60d, 0x02e59963, 0x035c9862, 0x00bea32a, 0x00f57df5, 0x000916b3}}}, + {X: Field{[10]uint32{0x018ed407, 0x0371d106, 0x0248cc3b, 0x005ceea0, 0x029055f9, 0x012c1bd0, 0x011cbe05, 0x004cedc1, 0x00b8c62f, 0x00101753}}, Y: Field{[10]uint32{0x005deb54, 0x02aee9cc, 0x027201a9, 0x03f181d1, 0x01523553, 0x034af0fb, 0x00e8031b, 0x00f2d0a6, 0x0310a896, 0x002118f7}}}, + {X: Field{[10]uint32{0x03e983b8, 0x03b638e6, 0x03003546, 0x025073a3, 0x00ab3293, 0x03f696f9, 0x00a03144, 0x00e81f85, 0x02ee9ab3, 0x0025fc16}}, Y: Field{[10]uint32{0x03849261, 0x012b56fa, 0x01a7c3be, 0x008078f4, 0x03d321f1, 0x00cde0b2, 0x0070b155, 0x004e2f13, 0x02267fd9, 0x0016798a}}}, + {X: Field{[10]uint32{0x02b91ac8, 0x0181d243, 0x0153dea1, 0x02350c25, 0x01c99fdf, 0x02e6b5a4, 0x01060f26, 0x009701aa, 0x016118e1, 0x0000ce20}}, Y: Field{[10]uint32{0x0004384b, 0x005d9f65, 0x00c88728, 0x023f6f70, 0x02a57178, 0x0116a640, 0x013af0d2, 0x0069a301, 0x018b5b8e, 0x00160fa4}}}, + {X: Field{[10]uint32{0x0117a9f9, 0x03dff4cf, 0x03c31dc8, 0x0198cda7, 0x038cf653, 0x0370ed81, 0x0306b1ad, 0x01a8967d, 0x00466bbe, 0x00377483}}, Y: Field{[10]uint32{0x01de5a99, 0x01e3a270, 0x03daa7cf, 0x0166b2d0, 0x017833e1, 0x0188733c, 0x02adcf46, 0x0261a2ee, 0x0329b4ea, 0x002cb7de}}}, + {X: Field{[10]uint32{0x03dfc9f7, 0x00005c8e, 0x011cfdfe, 0x004ba37e, 0x00eecd07, 0x004e272f, 0x02c26bc3, 0x003b9565, 0x012f71ae, 0x00248f1b}}, Y: Field{[10]uint32{0x034be948, 0x0290dc00, 0x03082414, 0x021cc81f, 0x005ff2ed, 0x02680f50, 0x001ae969, 0x00490da9, 0x00ad27c4, 0x001bf6ca}}}, + {X: Field{[10]uint32{0x00a09e65, 0x0277c637, 0x031a7fde, 0x01b05241, 0x01a44887, 0x0229f444, 0x0212461b, 0x01fa1d9a, 0x02bd28d5, 0x001b50a9}}, Y: Field{[10]uint32{0x01fd28bf, 0x02fb5ae5, 0x02775640, 0x0099d1fc, 0x00dcdd28, 0x0008988d, 0x005554df, 0x03a5f0d6, 0x02b801db, 0x00137c1e}}}, + {X: Field{[10]uint32{0x01d761ae, 0x018c3b08, 0x023f04b9, 0x0010c726, 0x0170efe1, 0x014e7b38, 0x003610d8, 0x03c9674f, 0x016159f9, 0x001ff50a}}, Y: Field{[10]uint32{0x01d7e280, 0x03c77c49, 0x026dc787, 0x0005b574, 0x00e85b60, 0x03543990, 0x037d00c4, 0x00afd440, 0x0041b8ce, 0x003f5a55}}}, + {X: Field{[10]uint32{0x026770b5, 0x026ec97a, 0x018a75b5, 0x0377d023, 0x00944045, 0x00156664, 0x0100a017, 0x025f7f9e, 0x010b128d, 0x00123041}}, Y: Field{[10]uint32{0x00f66559, 0x0005f05b, 0x0061ef9b, 0x027e218c, 0x01d450e4, 0x00d4e282, 0x0061b315, 0x00c67073, 0x01a04b6e, 0x0023df3b}}}, + {X: Field{[10]uint32{0x02e2a686, 0x01963df7, 0x00a09689, 0x01037969, 0x00b3214c, 0x0220f19f, 0x02baa1b4, 0x018b725a, 0x019da12d, 0x0015118b}}, Y: Field{[10]uint32{0x01ccd957, 0x03fb0b96, 0x02e370bc, 0x00583546, 0x026a3f00, 0x03bba067, 0x0133bb50, 0x00475c3f, 0x016f9160, 0x001d9ceb}}}, + {X: Field{[10]uint32{0x026435e8, 0x01ce6087, 0x02261443, 0x011d535e, 0x0095c5fe, 0x012ddc7c, 0x025a46e4, 0x0076260a, 0x00c4e4e1, 0x001a614d}}, Y: Field{[10]uint32{0x01cbba18, 0x03d07538, 0x011376a8, 0x0267dc70, 0x039faba0, 0x039f5a1c, 0x0219a8a5, 0x0031c635, 0x02acb272, 0x000db580}}}, + {X: Field{[10]uint32{0x03e77ecc, 0x0120ca82, 0x0341ad8c, 0x00849bf4, 0x01d0bc2a, 0x03223b36, 0x0376b0d7, 0x02070eec, 0x035951c6, 0x001124fd}}, Y: Field{[10]uint32{0x0120351e, 0x002624b0, 0x0012a391, 0x03d3a0a7, 0x02df7143, 0x02ff552f, 0x03158574, 0x026ab65f, 0x021dd4d9, 0x003954f8}}}, + {X: Field{[10]uint32{0x00f8313b, 0x02f89233, 0x02ec8cf8, 0x0179a1f9, 0x006c0632, 0x0245f009, 0x0384cf5f, 0x02038625, 0x02a93300, 0x002c1536}}, Y: Field{[10]uint32{0x0367d866, 0x0222c76d, 0x01a83b06, 0x016877ba, 0x014ed52a, 0x01809083, 0x015f2a40, 0x03956b1d, 0x03155c9c, 0x00147c11}}}, + {X: Field{[10]uint32{0x0029583e, 0x000dc4f0, 0x03c571fe, 0x032581be, 0x02c1f8cf, 0x0194676c, 0x03e6796e, 0x01ac7e7f, 0x02a4fa99, 0x0012d09c}}, Y: Field{[10]uint32{0x030edb83, 0x032029bf, 0x0110cf5f, 0x00cd0e13, 0x03cecde8, 0x032f145e, 0x0336f8cf, 0x0314f572, 0x02d0dce7, 0x002549bc}}}, + {X: Field{[10]uint32{0x03e29604, 0x0012a8d8, 0x00bff46a, 0x020fc7c1, 0x006cf63f, 0x03468e52, 0x02d8e647, 0x03a0bb2b, 0x0281c69d, 0x003587ad}}, Y: Field{[10]uint32{0x021f08b8, 0x0218965c, 0x001dfaa3, 0x01756fd1, 0x03f62fdf, 0x002b8a3a, 0x006d9a43, 0x01ee3cdf, 0x02fb156d, 0x0026d6a4}}}, + {X: Field{[10]uint32{0x02bf507f, 0x00f93830, 0x0157d576, 0x0103bf63, 0x008349e3, 0x037057ae, 0x0173c8f3, 0x01e7027e, 0x000257f9, 0x0002fe3c}}, Y: Field{[10]uint32{0x020614fe, 0x01052820, 0x037d9f66, 0x00e7d3c5, 0x03433467, 0x01b4d8e8, 0x00265a83, 0x0399c3f7, 0x022f1041, 0x00158761}}}, + {X: Field{[10]uint32{0x034cb498, 0x00f8a25d, 0x032d5eb0, 0x011547b1, 0x03b471fd, 0x00a4ea1b, 0x01ca03f7, 0x03eb5936, 0x00e2a7a6, 0x0018ec95}}, Y: Field{[10]uint32{0x01948c8b, 0x01eef9d4, 0x01880083, 0x014dafbf, 0x01f5be7d, 0x00b79273, 0x03b3819a, 0x03a48b71, 0x01113a4c, 0x003d0514}}}, + {X: Field{[10]uint32{0x03968725, 0x00628a74, 0x0009ae04, 0x0021ae4f, 0x0350fdd9, 0x01327bf9, 0x0091f33c, 0x01bb618d, 0x02cde1da, 0x002eb9be}}, Y: Field{[10]uint32{0x02a30533, 0x0198241b, 0x0349bb4d, 0x03149498, 0x02e4ca46, 0x019539a8, 0x03df74c6, 0x00c5dbda, 0x01550e48, 0x001f1f72}}}, + {X: Field{[10]uint32{0x00eb34af, 0x021188eb, 0x0029b595, 0x005d4e01, 0x00d30a63, 0x0271982c, 0x02d81395, 0x02a823cf, 0x01f8ea15, 0x003d58a1}}, Y: Field{[10]uint32{0x015a9eb9, 0x02c73a41, 0x038ee31e, 0x0369ee66, 0x02d9a0f6, 0x028b72e6, 0x0303c9de, 0x00652901, 0x03c1a202, 0x0004400c}}}, + {X: Field{[10]uint32{0x0151d87a, 0x01c98ce0, 0x006a540d, 0x0348663b, 0x020eafba, 0x003a38da, 0x039191c6, 0x035147b6, 0x00953de3, 0x0021db1f}}, Y: Field{[10]uint32{0x032279b8, 0x013897a5, 0x03d27df5, 0x00744016, 0x01cf5501, 0x0394aa16, 0x0010d177, 0x0031b010, 0x037472ce, 0x00257bff}}}, + {X: Field{[10]uint32{0x000a6d30, 0x0360eb25, 0x030e3fbf, 0x01b6e8fc, 0x00a024d8, 0x02ac71d6, 0x00969024, 0x01ef55a0, 0x03ed077c, 0x003a55b1}}, Y: Field{[10]uint32{0x03aad9da, 0x01c5dc41, 0x0026b45c, 0x0164339a, 0x0205aa57, 0x01669592, 0x017a9da2, 0x026adde9, 0x00a6f0d1, 0x0006d77f}}}, + {X: Field{[10]uint32{0x01dd3f16, 0x00bfeaa6, 0x028bd8fe, 0x016a0691, 0x03ab743b, 0x01412335, 0x016e9c06, 0x01150c51, 0x0261abdb, 0x003d4ff7}}, Y: Field{[10]uint32{0x0390222f, 0x01ad93b5, 0x026bc1a2, 0x023b838a, 0x01a65ac7, 0x02cd586f, 0x038e86ba, 0x008ad405, 0x013947ea, 0x00074a2d}}}, + {X: Field{[10]uint32{0x00043ad9, 0x00d91272, 0x003b5f5d, 0x02d3def3, 0x025e49b0, 0x00da9f18, 0x01b91039, 0x010d751d, 0x028152eb, 0x002e46a1}}, Y: Field{[10]uint32{0x013aaa75, 0x00c018a8, 0x0288bb34, 0x00347a2f, 0x01722dc9, 0x007746f5, 0x0296f3d1, 0x026f0185, 0x01175693, 0x00031d63}}}, + {X: Field{[10]uint32{0x018f8cc7, 0x03c233e3, 0x02897b16, 0x032ec930, 0x0261f5ad, 0x02f25d4d, 0x00c55d0a, 0x00a49f6d, 0x007023e3, 0x0016a1ef}}, Y: Field{[10]uint32{0x03731e54, 0x02a9b81b, 0x01b2c3d2, 0x00b622a2, 0x009d1ac3, 0x02ffdd2d, 0x02d2120f, 0x00357011, 0x024baa6a, 0x00273aab}}}, + {X: Field{[10]uint32{0x01ceb034, 0x01e7de5c, 0x02e80de9, 0x02a19ad9, 0x01215622, 0x03f1736c, 0x00a80b9e, 0x02cd50ef, 0x0343e54e, 0x002b02c6}}, Y: Field{[10]uint32{0x00638d8d, 0x0344fcfd, 0x007f609b, 0x03ef4afc, 0x01439477, 0x025f6a6d, 0x03c2b871, 0x0385485e, 0x035e5731, 0x002a2455}}}, + {X: Field{[10]uint32{0x005ca915, 0x01cd19fa, 0x03dc1450, 0x01277cea, 0x00e84f19, 0x01ae88dc, 0x034d6f3f, 0x033609db, 0x02bc2017, 0x0034f107}}, Y: Field{[10]uint32{0x00dcf7b7, 0x02979363, 0x02ce609d, 0x01d8ee8f, 0x01bc1e95, 0x0043f3cd, 0x02b1e916, 0x0165147d, 0x01528be5, 0x0014aac7}}}, + {X: Field{[10]uint32{0x03923b02, 0x03afa551, 0x010634d1, 0x013d27ba, 0x02ab842e, 0x0386c3cd, 0x0100d00f, 0x00b31bde, 0x0057f4c8, 0x001a33ff}}, Y: Field{[10]uint32{0x02b1d8e2, 0x01a92166, 0x026b26fe, 0x0012ebb4, 0x03367ba9, 0x00628c1a, 0x03da281c, 0x001d070f, 0x01bfaac1, 0x001ca655}}}, + {X: Field{[10]uint32{0x00177d9c, 0x03c954e3, 0x0074cd30, 0x0194d0fe, 0x02579dc7, 0x014c9299, 0x00566b33, 0x0267bb82, 0x00e12462, 0x001f83d6}}, Y: Field{[10]uint32{0x0021447c, 0x010065a2, 0x0128dcd3, 0x0055a816, 0x00086b90, 0x034d99d0, 0x009af7b5, 0x024fc020, 0x01835872, 0x000e5949}}}, + {X: Field{[10]uint32{0x00c9b542, 0x0057ae39, 0x03bbb97a, 0x0219cc95, 0x025dc450, 0x02cc97f5, 0x013d4bf1, 0x019263ad, 0x03dbd181, 0x0031caae}}, Y: Field{[10]uint32{0x0325a7b9, 0x01debeca, 0x0378288e, 0x0232da06, 0x00841a06, 0x011b34c6, 0x0041ed3e, 0x03cf4a21, 0x03a55df5, 0x000f23eb}}}, + {X: Field{[10]uint32{0x02363d0d, 0x002aed74, 0x015a1b72, 0x0329cff8, 0x00943654, 0x03da40de, 0x024d76ce, 0x0245107d, 0x035d3eb0, 0x001d1d1f}}, Y: Field{[10]uint32{0x00443649, 0x03eb5f07, 0x019b9746, 0x029907e5, 0x03bf54c1, 0x032bc151, 0x01f993a5, 0x03a3dcc8, 0x03240bc7, 0x00004b19}}}, + {X: Field{[10]uint32{0x01b67067, 0x03ff23e4, 0x006e1212, 0x00b347ec, 0x0129db86, 0x02b5a26a, 0x00b5d71d, 0x039f10d3, 0x02d1ab1d, 0x003ca9c0}}, Y: Field{[10]uint32{0x03afd854, 0x01ef458d, 0x0242962c, 0x006af451, 0x031d5ec1, 0x03ed373e, 0x03452bc7, 0x02b26b2d, 0x022cc730, 0x00016e47}}}, + {X: Field{[10]uint32{0x000d9340, 0x02d58d34, 0x01e1b530, 0x00f52fa4, 0x00c2535b, 0x000711ba, 0x01a87b62, 0x01ad197f, 0x030814e7, 0x002a4b53}}, Y: Field{[10]uint32{0x01cd0277, 0x02e81941, 0x030be6f4, 0x02f08d43, 0x0038d96d, 0x01d536b6, 0x01fd9bfe, 0x03ed015a, 0x028f3c02, 0x001360a6}}}, + {X: Field{[10]uint32{0x02f205a1, 0x03e45e89, 0x017462aa, 0x010a1285, 0x02df5ea1, 0x002a03ee, 0x00ea3206, 0x030ecfe4, 0x00b1ac06, 0x001e78c3}}, Y: Field{[10]uint32{0x00d5c82f, 0x007c9db2, 0x028d5352, 0x012a7d85, 0x007f1736, 0x0032ea5d, 0x008a79ed, 0x0252556b, 0x020a8145, 0x002b4882}}}, + {X: Field{[10]uint32{0x009401d1, 0x008c6da3, 0x02ff3020, 0x028eeaf5, 0x0288c8d6, 0x00903e8c, 0x023252be, 0x015dfc11, 0x0053d412, 0x001b5577}}, Y: Field{[10]uint32{0x03006eb3, 0x00cbf4de, 0x021540d7, 0x03228297, 0x02c98e17, 0x019e7c15, 0x01553452, 0x00cb0164, 0x0096aa3b, 0x0020e907}}}, + {X: Field{[10]uint32{0x01b3f20a, 0x00ed5a92, 0x02f487c8, 0x038834f8, 0x0211ef14, 0x032e2830, 0x03ea5eb4, 0x02e426cd, 0x031f604e, 0x0033e727}}, Y: Field{[10]uint32{0x0247dff8, 0x034722e8, 0x03f93dd3, 0x03e77d5b, 0x02da24ea, 0x032d1077, 0x0260b5be, 0x026621dc, 0x01f64e64, 0x000ae42e}}}, + {X: Field{[10]uint32{0x006b35dd, 0x03649786, 0x00346a2f, 0x016eea6a, 0x00e30f43, 0x03bdbf2b, 0x03677809, 0x02652acc, 0x019f29ed, 0x0018350a}}, Y: Field{[10]uint32{0x0360331e, 0x008da551, 0x0143737b, 0x02927462, 0x03040d51, 0x03639092, 0x0386ddd2, 0x02d3163f, 0x0388b8aa, 0x00037da6}}}, + {X: Field{[10]uint32{0x01493540, 0x0314ddb6, 0x02122887, 0x01660b34, 0x037de3be, 0x004528ef, 0x02bbb854, 0x012981ad, 0x02dd1b67, 0x00364e9b}}, Y: Field{[10]uint32{0x01e5f7ff, 0x03146ffe, 0x01230423, 0x023111fb, 0x03acfdb0, 0x03e486b9, 0x01590064, 0x0065ef00, 0x03d7dc79, 0x0021f68d}}}, + {X: Field{[10]uint32{0x01652962, 0x024646af, 0x03c6025d, 0x0368681b, 0x01fd5869, 0x032ded7d, 0x02bb6b31, 0x023662dc, 0x01377e10, 0x0033e30f}}, Y: Field{[10]uint32{0x00128fbb, 0x02722c4d, 0x01c93afc, 0x006a1e7b, 0x02fc5427, 0x0086cf2b, 0x002b0343, 0x02b40b6d, 0x0102bb96, 0x0001bd73}}}, + {X: Field{[10]uint32{0x00df29eb, 0x011f9a23, 0x002a6908, 0x0123c931, 0x00715b90, 0x01ee7283, 0x03ab65ac, 0x03b3e609, 0x02474637, 0x001b2a64}}, Y: Field{[10]uint32{0x02b55439, 0x0260f93f, 0x001f6d93, 0x00374057, 0x028bb616, 0x02ad5f0f, 0x02a446ed, 0x01153b65, 0x01a5fefa, 0x00144de3}}}, + {X: Field{[10]uint32{0x00d17afd, 0x035a1b4a, 0x008c558e, 0x0135ee7c, 0x033cc306, 0x02b3cb8f, 0x0267758c, 0x004f577a, 0x00043cb8, 0x001bdf4b}}, Y: Field{[10]uint32{0x0233bc6f, 0x029b3194, 0x013c8c65, 0x03c82b0a, 0x01b590a5, 0x01f17858, 0x039106c1, 0x03b120cf, 0x027813ec, 0x0011e538}}}, + {X: Field{[10]uint32{0x0124f3e1, 0x02a2893a, 0x03475d2c, 0x0069f667, 0x01e818d0, 0x0213a466, 0x02a82b01, 0x0220fead, 0x00d00bc9, 0x003e2bb8}}, Y: Field{[10]uint32{0x039442b5, 0x01bcd2a0, 0x01b8ab52, 0x01797348, 0x0244f105, 0x01ac6cf7, 0x0026bfac, 0x0177c025, 0x032b6913, 0x002b3e72}}}, + {X: Field{[10]uint32{0x00ce781c, 0x010ad180, 0x03f9d222, 0x03aba461, 0x010a85c8, 0x03d32470, 0x03123fc7, 0x000fd12f, 0x00bfc1a2, 0x0022c03f}}, Y: Field{[10]uint32{0x01d35bc9, 0x02617322, 0x03cac478, 0x02676b7e, 0x020a8de6, 0x03b9510a, 0x00264280, 0x039a43b0, 0x018a3e81, 0x00187a79}}}, + {X: Field{[10]uint32{0x01d6dd4d, 0x02dfe84e, 0x03c1ab0e, 0x008fa612, 0x00a72785, 0x0330c84b, 0x001ebbc1, 0x028acb08, 0x03078e84, 0x003eeb2e}}, Y: Field{[10]uint32{0x003a0f52, 0x02129f93, 0x020833aa, 0x017f45b1, 0x014e557d, 0x032eea89, 0x03df675c, 0x002265e5, 0x01d6f5eb, 0x000b1b27}}}, + {X: Field{[10]uint32{0x005c0611, 0x00cf6b2b, 0x02175bfa, 0x02ecf7e2, 0x005ba601, 0x00ee8a01, 0x028f9935, 0x03c14e34, 0x035c2f32, 0x000555a1}}, Y: Field{[10]uint32{0x00e240b7, 0x02bfa129, 0x01cf8eba, 0x00e84391, 0x03d2eb78, 0x022238e1, 0x01fb5405, 0x0251923a, 0x0050c3da, 0x0014d88c}}}, + {X: Field{[10]uint32{0x02d93d77, 0x01caec00, 0x0379e2e9, 0x03416617, 0x0349a8ce, 0x01a0fe00, 0x03e690ec, 0x017a6338, 0x00957f5b, 0x002d80ac}}, Y: Field{[10]uint32{0x01435227, 0x00e6d3a1, 0x009d960d, 0x00e2bd6e, 0x01ff3588, 0x006edecc, 0x00046acb, 0x02e0878c, 0x0390ddd6, 0x001e21a0}}}, + {X: Field{[10]uint32{0x022dd17a, 0x01454076, 0x0037724f, 0x0059d7f9, 0x037a8462, 0x001bc154, 0x01d66f8a, 0x00913822, 0x016523a5, 0x000a8440}}, Y: Field{[10]uint32{0x00825159, 0x0314e86e, 0x02bff938, 0x01e1f4b0, 0x02b881d0, 0x001cdfce, 0x02de4983, 0x018ba6c0, 0x0125e1ca, 0x000934ed}}}, + {X: Field{[10]uint32{0x017efce0, 0x00d76991, 0x01d3835a, 0x02495bf2, 0x01a13edb, 0x03d0f4b6, 0x0326a8e4, 0x03e6a738, 0x03591148, 0x0001cc51}}, Y: Field{[10]uint32{0x03b2d8b3, 0x02c3fddd, 0x03790c7f, 0x03c0c182, 0x021ad5ad, 0x015d991c, 0x02c7cfa4, 0x02a8134e, 0x009480d0, 0x002c6573}}}, + {X: Field{[10]uint32{0x036206fc, 0x0117b76c, 0x02e3db2f, 0x0190df65, 0x000525d8, 0x016a7638, 0x0362979c, 0x008f5c58, 0x03e40c7e, 0x0028db93}}, Y: Field{[10]uint32{0x02844751, 0x0158d799, 0x02707c74, 0x027da5e9, 0x00034669, 0x0020ce69, 0x0270de87, 0x0236d2a2, 0x03850a42, 0x0015ab39}}}, + {X: Field{[10]uint32{0x003cac9a, 0x0135de3d, 0x00402344, 0x035fa219, 0x0085b877, 0x0289253d, 0x021b61d5, 0x01046175, 0x03e7a2c5, 0x0025e192}}, Y: Field{[10]uint32{0x01f2ff69, 0x023b68ae, 0x000ab013, 0x00a1c6e6, 0x003a6c54, 0x03a4f9c7, 0x01dcd900, 0x020e4554, 0x0278a85b, 0x0010ccca}}}, + {X: Field{[10]uint32{0x0119893e, 0x03ae65a1, 0x02458b74, 0x01057fc0, 0x03daa7ca, 0x0177351f, 0x02c92c84, 0x03ba9b68, 0x01bf2449, 0x000d294b}}, Y: Field{[10]uint32{0x0303ece4, 0x00151ff8, 0x001b9427, 0x00d5a675, 0x03b3545a, 0x007ceec8, 0x03a8d552, 0x009b27de, 0x0029900f, 0x002b7506}}}, + {X: Field{[10]uint32{0x03f3d629, 0x037a298b, 0x02fcf5af, 0x02ede67d, 0x030d8bdb, 0x018c7d6e, 0x037b2b48, 0x02985d7e, 0x03a994ee, 0x0038942a}}, Y: Field{[10]uint32{0x0143b0ea, 0x02f60da0, 0x01757409, 0x03b02ffc, 0x022e92c4, 0x02254c3e, 0x00b6fae6, 0x03ea182f, 0x00f59db0, 0x00200fcd}}}, + {X: Field{[10]uint32{0x0071ae00, 0x026b8a6e, 0x02372086, 0x00bb8eca, 0x02795304, 0x01563845, 0x009347a4, 0x011b8845, 0x026d0b59, 0x00060d5a}}, Y: Field{[10]uint32{0x015385cb, 0x03a6aee6, 0x01f08f19, 0x008eea30, 0x000ba6de, 0x032849f1, 0x0398ec8d, 0x01be0787, 0x01716b17, 0x0015bbc2}}}, + {X: Field{[10]uint32{0x00205533, 0x033caa44, 0x0288eed3, 0x035bdcf5, 0x02ca5932, 0x0030a795, 0x025ef3f3, 0x0182100d, 0x03f5e530, 0x000d6a3a}}, Y: Field{[10]uint32{0x03259958, 0x0061481f, 0x018c453a, 0x03570b41, 0x0220d30f, 0x02b69d67, 0x01410325, 0x0153788f, 0x01950429, 0x0027ab97}}}, + {X: Field{[10]uint32{0x02a4e1b9, 0x014107f9, 0x007bda70, 0x02427292, 0x037b3dbe, 0x014ea597, 0x0062b920, 0x023fa7aa, 0x02f525ea, 0x0000df81}}, Y: Field{[10]uint32{0x03ceb97c, 0x015fed87, 0x020d703f, 0x01a3f73d, 0x003f2f65, 0x00686650, 0x0313b604, 0x026fa88f, 0x03d35e48, 0x0020e467}}}, + {X: Field{[10]uint32{0x02131c27, 0x037b0657, 0x007131a4, 0x0119c636, 0x01483166, 0x03929bff, 0x00629476, 0x0000bc44, 0x0297ac6c, 0x002aeef9}}, Y: Field{[10]uint32{0x012f9dcb, 0x01c55cac, 0x00300929, 0x01126a92, 0x02fd7049, 0x0083abd3, 0x00d8a24a, 0x008bfdfe, 0x02cb9d51, 0x002cb249}}}, + {X: Field{[10]uint32{0x01b05878, 0x0161691a, 0x0204368a, 0x00dabab2, 0x015a1a36, 0x022454c5, 0x0029c8b7, 0x03730fdf, 0x02cb1484, 0x00137cda}}, Y: Field{[10]uint32{0x0241c41d, 0x0308379a, 0x02d09d4f, 0x012edff3, 0x00aa059f, 0x0255914d, 0x00417fb1, 0x03c098ff, 0x026fc08a, 0x003f85bf}}}, + {X: Field{[10]uint32{0x0399d0d7, 0x01f4a6f9, 0x0073123a, 0x018371f1, 0x03c8f49c, 0x02f6bdab, 0x01570e5e, 0x01a82a22, 0x02e31025, 0x0017fc53}}, Y: Field{[10]uint32{0x03e65d7b, 0x0074af3d, 0x010d8989, 0x01b15b3f, 0x0295382d, 0x02b66146, 0x02a923ee, 0x00beb23c, 0x013855eb, 0x0025bfc5}}}, + {X: Field{[10]uint32{0x015d119a, 0x00b7a8a1, 0x028104f6, 0x0320dabd, 0x02a24dba, 0x01eadc61, 0x01281a1b, 0x008bd1e4, 0x0052c1d4, 0x0005a84b}}, Y: Field{[10]uint32{0x00c17478, 0x0205c8c9, 0x03b2ab3a, 0x03d01838, 0x01d36a4b, 0x02eeaaea, 0x0196cb38, 0x015b791a, 0x0272f673, 0x001e9bbc}}}, + {X: Field{[10]uint32{0x01489ef5, 0x0003fea8, 0x00eda606, 0x02b2fa91, 0x0005fcdb, 0x03f559f9, 0x00b3d154, 0x02248292, 0x00338368, 0x0023d327}}, Y: Field{[10]uint32{0x03885717, 0x015932b6, 0x01b4e37d, 0x035232ee, 0x01a4b0ab, 0x018a78b9, 0x03c0082d, 0x01131eca, 0x004de064, 0x000aed6f}}}, + {X: Field{[10]uint32{0x02b83310, 0x035b4aaa, 0x017776ab, 0x00bf417d, 0x0219236d, 0x0140e672, 0x00ca399e, 0x01c04215, 0x039b0754, 0x001262fc}}, Y: Field{[10]uint32{0x02fd691c, 0x0394699a, 0x01d0c4dd, 0x0118b0d5, 0x02b5edcd, 0x0291752e, 0x007beb58, 0x0238daf3, 0x03ff0cb5, 0x00238b7a}}}, + {X: Field{[10]uint32{0x02fb5996, 0x01b84dbb, 0x01c1171e, 0x024047a2, 0x022ba51d, 0x012560cd, 0x02247d17, 0x034e5ac8, 0x020a2978, 0x001e051f}}, Y: Field{[10]uint32{0x03f85989, 0x00c349c3, 0x01fd41d8, 0x03d6e2c1, 0x004c75bf, 0x03ad1043, 0x01bf0fb2, 0x01986f9c, 0x030ca73b, 0x00299ade}}}, + {X: Field{[10]uint32{0x028d4927, 0x035df760, 0x01f663f4, 0x028b85ab, 0x0047e112, 0x00b7c012, 0x037aea1d, 0x01b1f951, 0x00d9fb23, 0x000d44a6}}, Y: Field{[10]uint32{0x00fe00f9, 0x00ab2077, 0x03f2067f, 0x035161e3, 0x01241094, 0x01862b94, 0x01c3884e, 0x008ea745, 0x01af8b6f, 0x001b2724}}}, + {X: Field{[10]uint32{0x02399d10, 0x00af2f85, 0x00a67a34, 0x01a2797e, 0x01c18146, 0x0121526b, 0x00ffc148, 0x01827093, 0x000c88fb, 0x003ed7ff}}, Y: Field{[10]uint32{0x00229ab3, 0x011b97ee, 0x00a0946f, 0x02472217, 0x0088cf57, 0x03a4ba5e, 0x03eff328, 0x02532e43, 0x013f9ced, 0x002a6578}}}, + {X: Field{[10]uint32{0x0032097b, 0x0293e812, 0x036b36c7, 0x0251df35, 0x0089565e, 0x00372aa8, 0x03bd1974, 0x027175c5, 0x03c44cc0, 0x0020d4ad}}, Y: Field{[10]uint32{0x010fe6bc, 0x02bdb1df, 0x01e236f8, 0x02ada531, 0x00f91c8f, 0x01dd2b9a, 0x018ca786, 0x0097641d, 0x019800fa, 0x002541f2}}}, + {X: Field{[10]uint32{0x01919f4a, 0x00104561, 0x0140bd82, 0x036d8ab6, 0x015d5ed1, 0x02ec7165, 0x01014d76, 0x009d1b5b, 0x000f273a, 0x0006f997}}, Y: Field{[10]uint32{0x0009a3f2, 0x0368d657, 0x03552da3, 0x00f202c8, 0x00f044e9, 0x03be0eba, 0x01470a83, 0x03e0e68f, 0x03302a38, 0x0036b263}}}, + {X: Field{[10]uint32{0x0358418e, 0x017e6302, 0x003a7ed6, 0x0227afdd, 0x008de14d, 0x03a003d9, 0x0365037a, 0x03889fba, 0x03a52f4b, 0x001c41fc}}, Y: Field{[10]uint32{0x01fca7a4, 0x01a9d29a, 0x00e6069f, 0x03caa857, 0x01927b2d, 0x023bab91, 0x00e429d1, 0x03cc9f45, 0x0009bd1a, 0x002ff3c7}}}, + {X: Field{[10]uint32{0x03312e3e, 0x00125ce5, 0x00cff9dd, 0x03300293, 0x00983389, 0x02c7e766, 0x0254a133, 0x02b96c73, 0x004be8ed, 0x000045ca}}, Y: Field{[10]uint32{0x0212b03d, 0x02d170e0, 0x01539638, 0x01de1b98, 0x0084e3af, 0x0321342e, 0x03519994, 0x03b5262f, 0x001e724f, 0x00247923}}}, + {X: Field{[10]uint32{0x000de54e, 0x02d129ec, 0x015ded31, 0x02db1f99, 0x0041c243, 0x0226d9c5, 0x01f1cd0d, 0x026ad194, 0x02deb1ff, 0x00282361}}, Y: Field{[10]uint32{0x030f0d2f, 0x0098a720, 0x0012c0ec, 0x03530b6f, 0x01a72ed8, 0x01d33252, 0x0364feef, 0x00e7455d, 0x03f6344d, 0x001343f9}}}, + {X: Field{[10]uint32{0x00e8c25f, 0x023b2d69, 0x015503f7, 0x00cf79c4, 0x0098cfc6, 0x02352282, 0x032cbf36, 0x01062bbb, 0x01cedf67, 0x00271130}}, Y: Field{[10]uint32{0x01e743fa, 0x01936f8c, 0x0335f81f, 0x01b79306, 0x03de3d3c, 0x03e61c30, 0x01a959b9, 0x03c258c7, 0x002086d3, 0x000f3688}}}, + {X: Field{[10]uint32{0x0339f149, 0x00ce2c88, 0x02319250, 0x012694ab, 0x00f85979, 0x03c935c5, 0x03118da6, 0x030196ea, 0x00755215, 0x00364cf9}}, Y: Field{[10]uint32{0x00baec45, 0x01f5bf22, 0x01dcb054, 0x00e74bc6, 0x030e277e, 0x012604a1, 0x03abfa60, 0x03c13778, 0x028e313a, 0x0017ec3c}}}, + {X: Field{[10]uint32{0x008a42cb, 0x003c74c6, 0x015ff63c, 0x014d96ab, 0x024c2f9e, 0x03c90ef1, 0x00105289, 0x014cb288, 0x0197ddd0, 0x001ff87c}}, Y: Field{[10]uint32{0x02472af7, 0x0159e3ff, 0x02c7cd3f, 0x02b1ae8a, 0x01a9ec6b, 0x015879d7, 0x03618286, 0x024863b8, 0x033fa186, 0x00204ec4}}}, + {X: Field{[10]uint32{0x0107f79c, 0x02ae54b1, 0x0151a96a, 0x02bacf5d, 0x037ba412, 0x00b71b55, 0x010789c7, 0x008409eb, 0x01218961, 0x0038d5a1}}, Y: Field{[10]uint32{0x023e3a30, 0x01919690, 0x029a8496, 0x00533579, 0x017d8201, 0x0377d351, 0x01fe225e, 0x02a2b2b9, 0x01058e2c, 0x001d9171}}}, + {X: Field{[10]uint32{0x02ebece4, 0x03b3e0ad, 0x0380d146, 0x020ee089, 0x00c667a1, 0x02daa768, 0x02bcefc3, 0x01128aaf, 0x01468a56, 0x00315abf}}, Y: Field{[10]uint32{0x00f1a8d4, 0x018d7e55, 0x01e750cc, 0x005071a4, 0x022915ba, 0x01a19526, 0x03c587cb, 0x00a11227, 0x0255a80e, 0x00279071}}}, + {X: Field{[10]uint32{0x01589345, 0x0347c9a8, 0x02d5600a, 0x023f46af, 0x01440f9f, 0x00257c38, 0x036042e1, 0x02a3c1ce, 0x033960e6, 0x002c90ba}}, Y: Field{[10]uint32{0x036dfde0, 0x00107961, 0x01ca4bb5, 0x02b7a11a, 0x00378579, 0x025bca8d, 0x002decb6, 0x03c280d8, 0x036df063, 0x00251369}}}, + {X: Field{[10]uint32{0x023bb827, 0x01ec41cc, 0x03d42af5, 0x029ad70e, 0x0378f835, 0x0339a1c0, 0x00a43f2f, 0x00b8ba22, 0x01666d2e, 0x000e94bf}}, Y: Field{[10]uint32{0x03af91c7, 0x0136a669, 0x034cc487, 0x035b4390, 0x020096c7, 0x023d3ca7, 0x015cea01, 0x01e9189d, 0x0177a7b3, 0x0004b944}}}, + {X: Field{[10]uint32{0x00d28f53, 0x01deba89, 0x026cf708, 0x03f8259e, 0x034a71c0, 0x0262a31a, 0x03072d25, 0x006b4451, 0x0215c883, 0x002ddf55}}, Y: Field{[10]uint32{0x02bf3132, 0x02318d27, 0x011760d1, 0x030cdaa3, 0x01f5cff2, 0x03de4d81, 0x02df83d5, 0x0299977a, 0x03cfa068, 0x0009756d}}}, + {X: Field{[10]uint32{0x008530dc, 0x0260da70, 0x0214d798, 0x013d3fde, 0x03f23d22, 0x0109aa89, 0x03847288, 0x00d6a14d, 0x003b61e4, 0x00391083}}, Y: Field{[10]uint32{0x00ca8572, 0x034b213b, 0x019a7f7c, 0x02a626c4, 0x029b3c67, 0x01622b65, 0x02bd74e1, 0x0212e66f, 0x00b48579, 0x00108ac1}}}, + {X: Field{[10]uint32{0x030aaaea, 0x00204158, 0x007cecae, 0x011262b4, 0x01236e3c, 0x01853ec0, 0x020fadda, 0x00a678ee, 0x01bfc6ab, 0x002222ff}}, Y: Field{[10]uint32{0x0370eb3c, 0x03d1dccd, 0x03453f06, 0x032761c4, 0x037ada97, 0x006a3d02, 0x00fb94aa, 0x0396018a, 0x013d58cf, 0x0021b9c9}}}, + {X: Field{[10]uint32{0x00ef419c, 0x01310d84, 0x02cce8ef, 0x00b52185, 0x000d850f, 0x004e6059, 0x03de398a, 0x022cc376, 0x018bf7d7, 0x003dd349}}, Y: Field{[10]uint32{0x03029204, 0x029ffc94, 0x02c9dfca, 0x02db5233, 0x0205d60e, 0x02ec4b4c, 0x0332213c, 0x02b7f250, 0x01af1e6d, 0x00344f52}}}, + {X: Field{[10]uint32{0x00da6df0, 0x00504417, 0x00ae0679, 0x0352deb0, 0x0365cea0, 0x006e4895, 0x00097861, 0x00120e9c, 0x029098d6, 0x002a2ccf}}, Y: Field{[10]uint32{0x0121c553, 0x03ced44d, 0x01ddc650, 0x030194b2, 0x021182b6, 0x01bfd1d8, 0x032598e9, 0x0255ec45, 0x038cc08d, 0x00163308}}}, + {X: Field{[10]uint32{0x023ef1ff, 0x0251c286, 0x03cb8969, 0x02d96b84, 0x027a4a6c, 0x01286857, 0x01dbbe3d, 0x03eb6639, 0x01547477, 0x0016be2c}}, Y: Field{[10]uint32{0x016f25bf, 0x012c68df, 0x03672cc8, 0x0056dbbd, 0x033c0a8c, 0x019ba05c, 0x008fac13, 0x0060c8db, 0x0201d0c6, 0x001497b4}}}, + {X: Field{[10]uint32{0x03bec21c, 0x027ca780, 0x030bc811, 0x0196adff, 0x02fa71e6, 0x037e198a, 0x01143833, 0x01712887, 0x00546d4c, 0x00005571}}, Y: Field{[10]uint32{0x00411aae, 0x0259afd4, 0x036d0378, 0x020bb7bf, 0x03638422, 0x03f5c91f, 0x00eaefe8, 0x00461737, 0x03672f64, 0x00083a67}}}, + {X: Field{[10]uint32{0x0025a56e, 0x0019831d, 0x01473101, 0x00319ce3, 0x00c8fd7f, 0x02998ddc, 0x0022aea5, 0x00b59b9f, 0x0186ee18, 0x0014e461}}, Y: Field{[10]uint32{0x0056152e, 0x01636746, 0x0052fabc, 0x01e9c848, 0x00cdbf72, 0x01c2e249, 0x02564a1e, 0x03b075f8, 0x00923052, 0x0031ffa8}}}, + {X: Field{[10]uint32{0x03ad6414, 0x0262ee8e, 0x00d4f679, 0x03ca356b, 0x01cc52d7, 0x01dd03d3, 0x0004abba, 0x02dc59d2, 0x01d9a0fa, 0x003de593}}, Y: Field{[10]uint32{0x01f62c59, 0x02b20d22, 0x03ccb31c, 0x008bc6ef, 0x02d469a1, 0x03b04779, 0x03dc5c2a, 0x03d8339e, 0x0364aba0, 0x001aa627}}}, + {X: Field{[10]uint32{0x01663183, 0x0167b6f3, 0x0258e720, 0x038ad6c5, 0x02ffd72e, 0x00c9f1bb, 0x000a909b, 0x03cb79e2, 0x008af514, 0x001d0723}}, Y: Field{[10]uint32{0x0087b2ae, 0x00915129, 0x01b49012, 0x00c7edbf, 0x02e40b6b, 0x022bf9cd, 0x013532d4, 0x00518371, 0x036de5de, 0x003cd749}}}, + {X: Field{[10]uint32{0x0347945a, 0x03e20d62, 0x037e9b2e, 0x03c4c485, 0x02606e55, 0x01bbd3c8, 0x02ea9f12, 0x028a2bf1, 0x01bf6cc2, 0x0037a31a}}, Y: Field{[10]uint32{0x00a48a02, 0x017292d0, 0x0052c8b8, 0x0108ec72, 0x0270d847, 0x013fdc19, 0x00e2fecb, 0x035851e0, 0x00536900, 0x0023798a}}}, + {X: Field{[10]uint32{0x0357c537, 0x0163a8db, 0x006afcd0, 0x03f66a11, 0x01d6a8d5, 0x00f7404d, 0x02523b2d, 0x02d07362, 0x0339619b, 0x0020785b}}, Y: Field{[10]uint32{0x03f4b31e, 0x0170996e, 0x0032f239, 0x0135f6eb, 0x00375c43, 0x01477bb1, 0x006de9b9, 0x03b32b45, 0x00737cd2, 0x0019e1bf}}}, + {X: Field{[10]uint32{0x026f988d, 0x008eab9e, 0x01a20f01, 0x00122ac8, 0x02e70f7f, 0x01c96cc2, 0x01625b8a, 0x02c8ba31, 0x0189d079, 0x001167a5}}, Y: Field{[10]uint32{0x03f38e08, 0x01fa310c, 0x0112ee76, 0x0069155d, 0x00915de2, 0x030d41b3, 0x02d26acc, 0x028a4b12, 0x02935b71, 0x00295bb7}}}, + {X: Field{[10]uint32{0x028ebddd, 0x013ce161, 0x03758228, 0x014746ae, 0x01f2e5bb, 0x01c2d3ab, 0x0018806a, 0x029ffc82, 0x03554fab, 0x002c1e75}}, Y: Field{[10]uint32{0x0274dffe, 0x016dc07f, 0x001dcfcf, 0x03115d18, 0x0120b6c0, 0x0390d3ea, 0x00f65773, 0x005d2c84, 0x002d552f, 0x00125777}}}, + {X: Field{[10]uint32{0x034f288b, 0x02af4b19, 0x00100569, 0x005cfc17, 0x00bb30af, 0x0356c42d, 0x0180de1d, 0x03ec8505, 0x03bb5983, 0x001d4e46}}, Y: Field{[10]uint32{0x02958d67, 0x0292bdf7, 0x0080db58, 0x00d347c7, 0x02b319f5, 0x004d694a, 0x026032f2, 0x012ae7ad, 0x02bac915, 0x0015f1e9}}}, + {X: Field{[10]uint32{0x01524db4, 0x02784d90, 0x03e7d5a8, 0x03dccbf2, 0x035bda94, 0x013f1a47, 0x0061069e, 0x023dd7f1, 0x0157f284, 0x001c50da}}, Y: Field{[10]uint32{0x033f0007, 0x014476f7, 0x0224fe92, 0x016973bc, 0x0195658a, 0x006e4f20, 0x022813c5, 0x02b75596, 0x0052ef4f, 0x0004a1fe}}}, + {X: Field{[10]uint32{0x01543f9c, 0x03263c50, 0x037853b7, 0x01adc9e7, 0x0094ad07, 0x00965c3b, 0x00c74c9e, 0x03425c37, 0x0333fa75, 0x002e40e2}}, Y: Field{[10]uint32{0x03cf838e, 0x01c2ac36, 0x02660734, 0x03cf5bd9, 0x02af59ce, 0x038e7235, 0x03c1bf48, 0x017b40fe, 0x01696929, 0x0028a30c}}}, + {X: Field{[10]uint32{0x01f86196, 0x022bc5e9, 0x034b083b, 0x02e759f0, 0x03f259bd, 0x01b6f832, 0x00664e63, 0x036403ef, 0x0028a9fb, 0x002cb18f}}, Y: Field{[10]uint32{0x0149ebdd, 0x0040fbb3, 0x012b0ee7, 0x008dbd70, 0x01b79207, 0x02544329, 0x03084218, 0x018f119c, 0x00fc069c, 0x002a3c14}}}, + {X: Field{[10]uint32{0x0017f39c, 0x00b31e89, 0x0128a5c9, 0x011bce3a, 0x01d06bf3, 0x03edf1e1, 0x027edfad, 0x008657d2, 0x01bea32b, 0x003374a9}}, Y: Field{[10]uint32{0x03fa621b, 0x02b775ad, 0x01f04d2d, 0x01320e0a, 0x02213386, 0x00ace02b, 0x0203ee72, 0x0070d80c, 0x0278ac42, 0x0002ad9b}}}, + {X: Field{[10]uint32{0x033db80f, 0x033e9867, 0x01c39780, 0x0031c93e, 0x01a27d74, 0x0220e3b1, 0x02f03a82, 0x029cdeb3, 0x0064b079, 0x00209742}}, Y: Field{[10]uint32{0x021071d3, 0x01c866d1, 0x02b43a87, 0x02b6f0b8, 0x01c2154f, 0x03817ae9, 0x027e427f, 0x011299fc, 0x00b7749e, 0x002fcfba}}}, + {X: Field{[10]uint32{0x035e24c7, 0x02e243ef, 0x02218608, 0x01dfc2c3, 0x01d0c364, 0x027d338f, 0x02930a87, 0x03d00b25, 0x023cbf6b, 0x000dede7}}, Y: Field{[10]uint32{0x00f66f1d, 0x016b40c4, 0x02e29204, 0x02cbdec3, 0x00c32a5b, 0x0084f0bc, 0x010ff4c9, 0x018c2e82, 0x02c7cec5, 0x00365c50}}}, + {X: Field{[10]uint32{0x012b6135, 0x008b0cd5, 0x039d8aed, 0x003beec1, 0x0389560b, 0x02d14baf, 0x01105bf5, 0x029d7502, 0x02d0678e, 0x003ee992}}, Y: Field{[10]uint32{0x011f938c, 0x00f02c83, 0x03e3bdf6, 0x0065f5b6, 0x035c628f, 0x02a01ab5, 0x01dd8441, 0x00dea2a1, 0x022de4e6, 0x0039994d}}}, + {X: Field{[10]uint32{0x00d9cf72, 0x028fe5fb, 0x027a859e, 0x0034610c, 0x03d3bd49, 0x021311db, 0x004897de, 0x034dbe76, 0x038e077e, 0x001d9e1e}}, Y: Field{[10]uint32{0x0180a9b3, 0x0336508e, 0x00158210, 0x022ccf59, 0x00e3ba22, 0x0075e37f, 0x0126011d, 0x00e30f30, 0x03141a3f, 0x00033de7}}}, + {X: Field{[10]uint32{0x00157b31, 0x00694340, 0x03e8a369, 0x02790be7, 0x01f16a12, 0x01986954, 0x026ba1c5, 0x028cd217, 0x01d0ffb3, 0x0009aeaf}}, Y: Field{[10]uint32{0x002c530d, 0x0101cb63, 0x008eee4c, 0x01c49fb7, 0x02e66a6c, 0x0080dc2c, 0x0266e33a, 0x00691bed, 0x02e2b1cf, 0x0006ce92}}}, + {X: Field{[10]uint32{0x0376307a, 0x000c75a7, 0x02008c1b, 0x03c8d811, 0x007ca4d3, 0x01dca7ca, 0x02aa8640, 0x0287a5e9, 0x03b77a2f, 0x00056bb6}}, Y: Field{[10]uint32{0x03073649, 0x033f65bf, 0x00788a6d, 0x01e14d53, 0x03f94088, 0x03017cda, 0x01746439, 0x008d81a9, 0x0142bf8b, 0x000cd0a8}}}, + {X: Field{[10]uint32{0x026fe467, 0x0003d5d1, 0x01fb3de1, 0x02837f79, 0x01c2b072, 0x01bbd330, 0x00d5767c, 0x03353f7d, 0x00a39bb7, 0x00263b38}}, Y: Field{[10]uint32{0x03227e28, 0x03d18faa, 0x02bba6f4, 0x00a5a829, 0x021e679d, 0x00e555b1, 0x0029d0f8, 0x024f9fae, 0x00a8218c, 0x00313a49}}}, + {X: Field{[10]uint32{0x03f373a9, 0x026daa0f, 0x03304198, 0x028becc8, 0x018a48cd, 0x0019eedc, 0x01ffafab, 0x00fbb533, 0x0105fc21, 0x001f619d}}, Y: Field{[10]uint32{0x0097d47c, 0x027bdd5f, 0x00c1b919, 0x03e233a8, 0x0096e167, 0x01290053, 0x03c417ef, 0x0081e065, 0x03f03c21, 0x00177d47}}}, + {X: Field{[10]uint32{0x01b3001f, 0x02dce8a5, 0x0117f410, 0x012275db, 0x02bf269a, 0x02c03578, 0x03ece8b7, 0x02387ef8, 0x01d74357, 0x003c93c6}}, Y: Field{[10]uint32{0x0223631f, 0x014d89c1, 0x0020d53e, 0x011d4520, 0x0116d2b5, 0x00d3d31e, 0x0048bbbb, 0x022d99ec, 0x03ff5544, 0x00191290}}}, + {X: Field{[10]uint32{0x000efd59, 0x0374ef20, 0x0227b923, 0x007480e6, 0x021fd106, 0x0352fa88, 0x0111281e, 0x00a5b87a, 0x03045c22, 0x0024e14c}}, Y: Field{[10]uint32{0x03eb7040, 0x03f9a662, 0x011628c2, 0x0087a7eb, 0x022607da, 0x01332417, 0x0399bbfe, 0x00b4543d, 0x00f600cd, 0x0008a623}}}, + {X: Field{[10]uint32{0x02319743, 0x014c7251, 0x01f0daf1, 0x03b2625f, 0x01b91ff4, 0x039349a1, 0x03b14ee8, 0x013c5894, 0x03053983, 0x003c2431}}, Y: Field{[10]uint32{0x000bd522, 0x0160d04a, 0x02d2abf1, 0x02326bce, 0x0228c59c, 0x014e80ad, 0x0208391f, 0x009c76a2, 0x00851d30, 0x003045c6}}}, + {X: Field{[10]uint32{0x02a78c6e, 0x01b34fbf, 0x038e67fb, 0x0022a401, 0x000df9bb, 0x00aa3abf, 0x00234aeb, 0x03cedd28, 0x00ecab5b, 0x0003a3f2}}, Y: Field{[10]uint32{0x02ddabe5, 0x001eca09, 0x035c29b0, 0x002d2439, 0x01a8397c, 0x018b829d, 0x02fcd713, 0x026edd1b, 0x016534ce, 0x00002c20}}}, + {X: Field{[10]uint32{0x03126785, 0x02835c67, 0x03aa09b0, 0x02eb200c, 0x03c7426d, 0x012bcdf8, 0x003cef69, 0x010f9cc0, 0x00d187cb, 0x00118963}}, Y: Field{[10]uint32{0x01ad4fc4, 0x02b48dd5, 0x006d4601, 0x02fdc20b, 0x0175576e, 0x030da608, 0x00dd82e2, 0x002089d9, 0x01a75f06, 0x00211850}}}, + {X: Field{[10]uint32{0x00a3e430, 0x02fb9ab3, 0x037a1e65, 0x03cd17e6, 0x0394109b, 0x010cd042, 0x01d27c3f, 0x021fbd4a, 0x033bdb38, 0x0039fce2}}, Y: Field{[10]uint32{0x02cd589f, 0x02b0d24a, 0x00f8109f, 0x02deb6f2, 0x00ab1faf, 0x02c1fa2b, 0x02dec0c0, 0x031c0a42, 0x00f15eae, 0x003d4910}}}, + {X: Field{[10]uint32{0x03537aec, 0x02c0e94b, 0x0062eda5, 0x019fdcff, 0x02fa9a01, 0x007d5a76, 0x03d5b750, 0x01e635d7, 0x00331472, 0x000b4a7a}}, Y: Field{[10]uint32{0x012d2be6, 0x025dba5e, 0x00001d18, 0x017d688c, 0x03d9e2f5, 0x00164d80, 0x03c58cfc, 0x02e7ea85, 0x011ab117, 0x0014b4f7}}}, + {X: Field{[10]uint32{0x0091ffb6, 0x025f470e, 0x03c7c8ac, 0x0291be50, 0x00f47609, 0x01d54b76, 0x03b44c9c, 0x029edddf, 0x009cabf7, 0x0028ecbb}}, Y: Field{[10]uint32{0x00fc19de, 0x0272efcf, 0x03417d55, 0x01856c06, 0x024d5280, 0x00a96b59, 0x00933852, 0x00e07d4c, 0x0070f091, 0x001b38e3}}}, + {X: Field{[10]uint32{0x0100f473, 0x03d974cc, 0x03015a21, 0x01896150, 0x026cefe7, 0x02cf46a3, 0x02504dda, 0x0295b039, 0x001e7582, 0x002bf2cf}}, Y: Field{[10]uint32{0x03171af8, 0x029db1a2, 0x004a38e5, 0x021d5ecb, 0x0367edbd, 0x03864c40, 0x02afc618, 0x02126629, 0x039dfbeb, 0x001aebc7}}}, + {X: Field{[10]uint32{0x010e2ac8, 0x00d58976, 0x006eccdd, 0x0129242e, 0x026650f7, 0x0119aa30, 0x022bbea9, 0x02559efd, 0x0212dc89, 0x00222cbc}}, Y: Field{[10]uint32{0x018c30a5, 0x01629934, 0x0208e7e4, 0x010b6652, 0x026ecd6c, 0x0285c8f8, 0x036d4f5d, 0x0054ff5f, 0x017bdef6, 0x001cff5d}}}, + {X: Field{[10]uint32{0x01adef3c, 0x02646f87, 0x000d493d, 0x01157125, 0x03395c59, 0x0369a8a9, 0x01c971d7, 0x00a45994, 0x029f4ca3, 0x0002ff7a}}, Y: Field{[10]uint32{0x01bc20d8, 0x02d93608, 0x00a17578, 0x01947db5, 0x004166bc, 0x02e01df3, 0x000adea5, 0x03da1108, 0x00447ef3, 0x00209d1c}}}, + {X: Field{[10]uint32{0x00973ae5, 0x00d91fb9, 0x0265b521, 0x0298f593, 0x00e8fdf6, 0x01247b3c, 0x012e3869, 0x0175a729, 0x0381aa76, 0x00175172}}, Y: Field{[10]uint32{0x03d019db, 0x03e0ac4b, 0x022bdb17, 0x03f8f2be, 0x00fdab36, 0x0040e9f7, 0x03517e7c, 0x01b5dddc, 0x032b51a7, 0x00292928}}}, + {X: Field{[10]uint32{0x02e7109d, 0x0019d4de, 0x033ae87d, 0x0249174b, 0x036d6fe0, 0x0310f976, 0x034fa531, 0x026652a8, 0x03cee14e, 0x003ce940}}, Y: Field{[10]uint32{0x03ec49e8, 0x0157957c, 0x01785ac5, 0x02e81cc9, 0x03568aa5, 0x006546d8, 0x0322daad, 0x0142d081, 0x00c0a24d, 0x000ac5c5}}}, + {X: Field{[10]uint32{0x00cbeeb5, 0x01ab78e2, 0x012d9b66, 0x014cdf47, 0x02042619, 0x02e39ae2, 0x00c225ea, 0x00bb4915, 0x036d6f81, 0x002530e9}}, Y: Field{[10]uint32{0x03a953e3, 0x0358e87b, 0x0104cbc8, 0x03eb59b8, 0x023d1351, 0x02fc6062, 0x00893b95, 0x019d1b75, 0x02e6aa40, 0x002ee273}}}, + {X: Field{[10]uint32{0x00f4c050, 0x0242323c, 0x02a3cc0c, 0x03446077, 0x01b9a2d3, 0x007f696f, 0x015a6625, 0x00900ce7, 0x02810523, 0x0008f6ff}}, Y: Field{[10]uint32{0x01eae6b2, 0x016e12d3, 0x036794e4, 0x0267502a, 0x00b5c168, 0x01e7b439, 0x00f8385c, 0x0043bd22, 0x0271229f, 0x0032bbce}}}, + {X: Field{[10]uint32{0x00bbf1d2, 0x00a7b1ab, 0x03b88e46, 0x03286d2e, 0x01d2dcbe, 0x015e4d7d, 0x01dc69dc, 0x02186704, 0x03d120ef, 0x000e41f8}}, Y: Field{[10]uint32{0x0015e853, 0x02611185, 0x00055ba2, 0x02f16288, 0x00e6aad1, 0x0324da11, 0x017b0a60, 0x00ae7730, 0x02b7d74e, 0x0010e3e5}}}, + {X: Field{[10]uint32{0x032b7d9c, 0x03c17859, 0x00b710e6, 0x012ccde2, 0x01651c94, 0x0101fd64, 0x02a6a373, 0x0013f602, 0x03193eeb, 0x00030502}}, Y: Field{[10]uint32{0x01e44072, 0x001dee4a, 0x02e641f7, 0x03bd0c34, 0x03899450, 0x001d8ed8, 0x01fef6b7, 0x01150e75, 0x011559e2, 0x002526ff}}}, + {X: Field{[10]uint32{0x032ea56c, 0x02951f83, 0x028d1740, 0x02dac1b8, 0x002563c3, 0x00c3dd79, 0x012fe269, 0x00e72077, 0x005bc96a, 0x0025df3c}}, Y: Field{[10]uint32{0x02a10d52, 0x03039ae6, 0x02dc0e70, 0x01e0daa7, 0x0307e158, 0x01b291a2, 0x0295e234, 0x005930db, 0x023a8508, 0x0000e00b}}}, + {X: Field{[10]uint32{0x00a034e3, 0x009ec836, 0x003761e8, 0x02ce7b8f, 0x02795a7b, 0x039395fd, 0x0151e5a9, 0x0383532b, 0x00d63995, 0x00041a70}}, Y: Field{[10]uint32{0x027fe33b, 0x03065316, 0x028041d2, 0x02b1e23f, 0x0047963a, 0x02aed792, 0x01d89c47, 0x01319560, 0x00879c0e, 0x00386a85}}}, + {X: Field{[10]uint32{0x013e3682, 0x02096cf2, 0x0245bba3, 0x03d4d49e, 0x0142419a, 0x0138a9d5, 0x03ab10c7, 0x010607fc, 0x0280c341, 0x003fde31}}, Y: Field{[10]uint32{0x00d3615e, 0x0128dd89, 0x0256e1fc, 0x01d37cbc, 0x0186c8c5, 0x002cb6fb, 0x032382e2, 0x0243cdda, 0x02dbf053, 0x003badc2}}}, + {X: Field{[10]uint32{0x02bcddc7, 0x01abf661, 0x03d05905, 0x01af570d, 0x002b0cb2, 0x020e29a8, 0x004c3ff5, 0x00f5aa70, 0x03033acd, 0x0017b27a}}, Y: Field{[10]uint32{0x032aff03, 0x0099d25c, 0x01c8b9ae, 0x02d230ea, 0x03e39d92, 0x03651170, 0x000bed1e, 0x0037c05f, 0x03f60eed, 0x0024a8a1}}}, + {X: Field{[10]uint32{0x031b37d1, 0x0363b211, 0x03ee9339, 0x01369f71, 0x00bef0a5, 0x0236f1fa, 0x0267e14d, 0x034d2dfb, 0x02ba792d, 0x003aa881}}, Y: Field{[10]uint32{0x011ee92e, 0x0041f1a3, 0x025e2695, 0x008475e3, 0x0355e00d, 0x01030585, 0x02f2530c, 0x027281ff, 0x025ebe71, 0x00155df9}}}, + {X: Field{[10]uint32{0x00eb3ed7, 0x014abf43, 0x03f54af9, 0x023b4f61, 0x02689ef0, 0x01573be8, 0x036789d4, 0x0004a8f5, 0x02f56034, 0x0009b418}}, Y: Field{[10]uint32{0x01323424, 0x02d60db4, 0x011094e7, 0x02896b3a, 0x01dbe6fa, 0x00347db7, 0x00340c5f, 0x0161de67, 0x01acef6f, 0x0017bfc7}}}, + {X: Field{[10]uint32{0x02602d48, 0x03c89c47, 0x03bd1492, 0x03e70d06, 0x021a2413, 0x0047b6a3, 0x009e449d, 0x02d8a93d, 0x015ae50d, 0x00200350}}, Y: Field{[10]uint32{0x0002eb50, 0x0255fd5f, 0x036fbdc5, 0x0039d580, 0x03d5c8cb, 0x0344b67c, 0x019ec5cf, 0x026d748a, 0x016d05d1, 0x0015a72b}}}, + {X: Field{[10]uint32{0x009a1c90, 0x00f189e7, 0x006bb985, 0x02f83e16, 0x02e1531f, 0x0068859d, 0x03aaca5f, 0x0370665c, 0x0352bc16, 0x001b0068}}, Y: Field{[10]uint32{0x00cc04e7, 0x01cec63e, 0x027654c0, 0x034b5935, 0x01a39a17, 0x0095204e, 0x027226ab, 0x01a83c9d, 0x0342c959, 0x0020cf75}}}, + {X: Field{[10]uint32{0x03742c26, 0x01390c4d, 0x038e80a5, 0x02e3423b, 0x01f0b914, 0x01ce346b, 0x00e7c4d4, 0x03fc3141, 0x0122f1b3, 0x000eb332}}, Y: Field{[10]uint32{0x03cb0ad7, 0x0026b2c0, 0x00b1786a, 0x00620b84, 0x0152a2d1, 0x014aca5e, 0x00dee26c, 0x002cd0c1, 0x008327d6, 0x002aa735}}}, + {X: Field{[10]uint32{0x00f8ec72, 0x01c3fc74, 0x03edf2ec, 0x0307b9ba, 0x02f8d978, 0x03e398d4, 0x0380f753, 0x01cfc828, 0x0072828b, 0x002837d7}}, Y: Field{[10]uint32{0x00ac6670, 0x01ea27e9, 0x0230680d, 0x02dbac3b, 0x02b1327d, 0x01e79c8c, 0x02226893, 0x02f44c79, 0x01bef1e0, 0x002c8c2b}}}, + {X: Field{[10]uint32{0x03b52c73, 0x015ee5cc, 0x005a449d, 0x01c34ffe, 0x02d4bbc9, 0x01521971, 0x03a8dbbd, 0x03b26181, 0x01949776, 0x002757c3}}, Y: Field{[10]uint32{0x00afc1a8, 0x03a83c80, 0x02cf202c, 0x0055f446, 0x01ad7faf, 0x03d834d1, 0x038a056f, 0x00eb7552, 0x03baf489, 0x003fc23b}}}, + {X: Field{[10]uint32{0x01d3d84e, 0x03c8421b, 0x00917fb7, 0x02d699ce, 0x00228f54, 0x022947b2, 0x025b2935, 0x0208bb7a, 0x012d9ea1, 0x0037bd76}}, Y: Field{[10]uint32{0x008b3129, 0x01667b80, 0x0307a479, 0x002b5f00, 0x039d5bc2, 0x000affcd, 0x00d3ad02, 0x03af0c4e, 0x000db94a, 0x0002db1d}}}, + {X: Field{[10]uint32{0x00df33de, 0x010b9961, 0x03832736, 0x03c6e9ba, 0x03643fb0, 0x03d341d7, 0x007136c0, 0x035d38fe, 0x0105cdc8, 0x003ea42c}}, Y: Field{[10]uint32{0x00bba36d, 0x01e77a94, 0x00c273c0, 0x02494989, 0x003a180d, 0x003c3891, 0x029e852f, 0x023ae927, 0x00c373f5, 0x000f9aca}}}, + {X: Field{[10]uint32{0x03d0eb52, 0x02e33468, 0x02349575, 0x02ca5c1a, 0x01ce077c, 0x0353677e, 0x01c84613, 0x01ee4300, 0x0021ff2f, 0x002084ba}}, Y: Field{[10]uint32{0x003185f0, 0x0390ffdc, 0x02b5b8f8, 0x03b4b22b, 0x01d24bb5, 0x00d5018e, 0x0256e8f3, 0x039d5bf6, 0x01db2fa3, 0x00356701}}}, + {X: Field{[10]uint32{0x0061220d, 0x0362c83b, 0x00e49f9c, 0x02dcabed, 0x0124f155, 0x00074579, 0x01a641e1, 0x01c75d2c, 0x00c81d1f, 0x003b8d03}}, Y: Field{[10]uint32{0x02286f37, 0x020ce0ab, 0x01438f00, 0x007bd604, 0x0086f814, 0x02a3a2c1, 0x02fa7964, 0x017f5fc7, 0x033f2535, 0x00245760}}}, + {X: Field{[10]uint32{0x002afee1, 0x009bd951, 0x026b50aa, 0x0025fe0d, 0x02302b50, 0x02dc88f8, 0x00b257fb, 0x00f60dd0, 0x0125dd2e, 0x000b14d5}}, Y: Field{[10]uint32{0x021cf765, 0x01c9c4ed, 0x03947672, 0x01e5fdcf, 0x0292d43a, 0x03ced500, 0x038f9662, 0x02d9a13c, 0x014ef945, 0x00073514}}}, + {X: Field{[10]uint32{0x0267d94d, 0x026b517e, 0x00f2baae, 0x0075ba05, 0x03404b9e, 0x00a97e5d, 0x00a9083a, 0x028a233d, 0x03cf8b57, 0x0037ddd8}}, Y: Field{[10]uint32{0x01580ce2, 0x030ceb2c, 0x0309cb4f, 0x01706a49, 0x01bf0529, 0x00e23ba7, 0x02276bdd, 0x02d23184, 0x033631fd, 0x0013df70}}}, + {X: Field{[10]uint32{0x00dcee60, 0x0049a83b, 0x00da18fd, 0x023d3579, 0x038ff99b, 0x0335b418, 0x0374b928, 0x03c86044, 0x0240d6d0, 0x000d4530}}, Y: Field{[10]uint32{0x0197fca2, 0x00297190, 0x035cee53, 0x02c9c825, 0x02ac17ab, 0x01ddfb46, 0x018421c7, 0x02be00f2, 0x034a1a1b, 0x000a8347}}}, + {X: Field{[10]uint32{0x02e40a27, 0x012f4f1a, 0x0360a0b5, 0x016364d7, 0x00237a1b, 0x02d50755, 0x01de551a, 0x032e0653, 0x01d9e58b, 0x0000f79d}}, Y: Field{[10]uint32{0x01d97c75, 0x02cae349, 0x03ddc455, 0x036bf756, 0x033ec422, 0x01bc940d, 0x03ad8c48, 0x02c1631a, 0x00dbbe2d, 0x0026b685}}}, + {X: Field{[10]uint32{0x01e0420f, 0x0228229b, 0x005ddae2, 0x014bd40b, 0x0290ad3d, 0x0357ac70, 0x00144f81, 0x00d56f17, 0x020b1804, 0x0029ca33}}, Y: Field{[10]uint32{0x03ddad3d, 0x00f40051, 0x004f7ac9, 0x02e7b0cd, 0x0142cce3, 0x0215247f, 0x034893fa, 0x0146833e, 0x00a8f72b, 0x0010e1f3}}}, + {X: Field{[10]uint32{0x0151c39b, 0x00761d15, 0x0032e16c, 0x02aeaa50, 0x011d8234, 0x0140ea05, 0x03b22e02, 0x01130251, 0x028a05b8, 0x003b0f26}}, Y: Field{[10]uint32{0x02bd7fa6, 0x01790423, 0x03043382, 0x033ba0da, 0x00c8ac51, 0x013b7eba, 0x00845ca4, 0x03ea4d98, 0x00ef45f0, 0x001ec22f}}}, + {X: Field{[10]uint32{0x024761db, 0x023b1568, 0x02e9326a, 0x0333a61c, 0x03e619e7, 0x005d4cb3, 0x02b7e6c6, 0x016b2cee, 0x01562494, 0x002c05cf}}, Y: Field{[10]uint32{0x01f1b381, 0x0246b8c1, 0x0310d445, 0x03cc4c83, 0x0172a81d, 0x026372c4, 0x03eff121, 0x001d8743, 0x035f3e9a, 0x001e349e}}}, + {X: Field{[10]uint32{0x00cd73f6, 0x03658010, 0x023a7970, 0x0047e565, 0x034e04bd, 0x034e92e3, 0x03c3890e, 0x03722e5d, 0x03f3cd43, 0x00367ace}}, Y: Field{[10]uint32{0x03b23044, 0x016cbf58, 0x01c41e7f, 0x039326da, 0x000510b9, 0x02314012, 0x01db7189, 0x020228fc, 0x035cc42e, 0x0026065a}}}, + {X: Field{[10]uint32{0x01a84e74, 0x01530219, 0x03f107ca, 0x02c07009, 0x0029bbf1, 0x007e4ace, 0x02026062, 0x008c2b1d, 0x01af8a40, 0x003ef694}}, Y: Field{[10]uint32{0x00d6ccf5, 0x00944eff, 0x03c71e81, 0x02e8eef9, 0x038fd427, 0x024043f2, 0x00729e4e, 0x00ef5532, 0x0194aa45, 0x001920ce}}}, + {X: Field{[10]uint32{0x02583f9d, 0x03e1cbee, 0x02cf808a, 0x0317c14c, 0x03472b14, 0x00498beb, 0x01646616, 0x0065983d, 0x01a751be, 0x0002b92e}}, Y: Field{[10]uint32{0x0295ee5e, 0x019cb925, 0x02281f4b, 0x01e3693e, 0x03e2bd40, 0x02b4ead7, 0x00c6eed9, 0x01f969bc, 0x008baa9d, 0x0022cb09}}}, + {X: Field{[10]uint32{0x00cf6ff5, 0x02db8313, 0x036dda40, 0x0380c7b7, 0x00f29764, 0x0118a117, 0x028c6a2e, 0x02009859, 0x01520608, 0x00160100}}, Y: Field{[10]uint32{0x03329485, 0x0069c076, 0x030cd5fb, 0x023ffb41, 0x00a2e5f8, 0x00e65db6, 0x032f9a4e, 0x03013681, 0x02e64a83, 0x0034be5a}}}, + {X: Field{[10]uint32{0x007e029e, 0x029cc993, 0x0203b57c, 0x0098711a, 0x03cf477e, 0x02bf3d1f, 0x01abbd9f, 0x003e058e, 0x02865738, 0x00130a35}}, Y: Field{[10]uint32{0x00ed8a70, 0x02c09383, 0x0202259f, 0x01045436, 0x023122a9, 0x02b3eb05, 0x02a67e80, 0x01785015, 0x029c4fa7, 0x001a52e2}}}, + {X: Field{[10]uint32{0x0325c9a4, 0x016a4b3f, 0x026b9046, 0x01ddc5e6, 0x016984fc, 0x03601be0, 0x03b51a73, 0x01561fc8, 0x02b39e00, 0x00378816}}, Y: Field{[10]uint32{0x01273d83, 0x0170c9f1, 0x011355af, 0x010a6bb2, 0x0048f68e, 0x03ab304b, 0x002cf1f0, 0x03070b6d, 0x025e12ef, 0x003b610c}}}, + {X: Field{[10]uint32{0x014273f4, 0x031ada56, 0x025f1b3e, 0x0225b48a, 0x01b968f5, 0x0087995c, 0x0258dd57, 0x02c29d2d, 0x00680c2c, 0x0017aa0a}}, Y: Field{[10]uint32{0x004a9499, 0x008df48e, 0x038ad6e2, 0x00e40794, 0x00e18285, 0x00dbdb16, 0x02decce6, 0x0193e04e, 0x02b08db2, 0x00223443}}}, + {X: Field{[10]uint32{0x024998ba, 0x00b40d8c, 0x03c9c37f, 0x011b5ee6, 0x03c3b0dd, 0x038f6d39, 0x00bd98a3, 0x01d05908, 0x03c86449, 0x0006273d}}, Y: Field{[10]uint32{0x02daa083, 0x00960087, 0x03da204d, 0x0235c8fd, 0x01742211, 0x01f7581b, 0x0201b1cf, 0x03fca0d9, 0x01ced46d, 0x002ecd02}}}, + {X: Field{[10]uint32{0x0082789f, 0x014dbe6f, 0x0214d3cf, 0x035e3b97, 0x013c3c41, 0x02040091, 0x00680265, 0x00350c22, 0x018738f5, 0x001c285c}}, Y: Field{[10]uint32{0x0027c1d6, 0x0118b5ef, 0x022962b9, 0x0116a7cd, 0x02101dc4, 0x023c2747, 0x03338701, 0x014df907, 0x0120e112, 0x00057254}}}, + {X: Field{[10]uint32{0x03b3a368, 0x011ae6c3, 0x03865cff, 0x02a91a0c, 0x018e4271, 0x00c04421, 0x0020eedf, 0x036db823, 0x00ff622a, 0x0015e2b0}}, Y: Field{[10]uint32{0x03d7f851, 0x007296ee, 0x0215f1f0, 0x03d4759f, 0x026b0cea, 0x03542062, 0x01b2f7d9, 0x005cb4ae, 0x01ddf5f3, 0x003dc468}}}, + {X: Field{[10]uint32{0x01840071, 0x02c178a3, 0x01aea3e3, 0x01dfe9b3, 0x035887f1, 0x0373a296, 0x00738bad, 0x029d1f59, 0x0003476a, 0x003727ef}}, Y: Field{[10]uint32{0x01eee1b4, 0x03c293a2, 0x03ab9515, 0x01d33d39, 0x008bd267, 0x00a53954, 0x0194a19d, 0x037497e3, 0x012c8087, 0x00303d9d}}}, + {X: Field{[10]uint32{0x03b0294d, 0x02548551, 0x0178fe02, 0x0371165b, 0x014bb817, 0x00f5cc54, 0x004dec0b, 0x03357cba, 0x00ffa348, 0x0025d26b}}, Y: Field{[10]uint32{0x0381a1c6, 0x03a13815, 0x0116723d, 0x03265140, 0x03d89856, 0x0039f480, 0x02ec20be, 0x0120436b, 0x01ea35e5, 0x0037d99f}}}, + {X: Field{[10]uint32{0x02657d85, 0x034d0f8c, 0x032e8e92, 0x02635ac4, 0x00ae8e7a, 0x02a0551e, 0x0359f21f, 0x01cc370c, 0x01cf2fd2, 0x0038e7ef}}, Y: Field{[10]uint32{0x01b5e01c, 0x001ac2f9, 0x0028320a, 0x01e230c7, 0x02624415, 0x01922168, 0x026ae3e3, 0x021659da, 0x008170a7, 0x002ebfa6}}}, + {X: Field{[10]uint32{0x01402c09, 0x02ae2fe4, 0x02b89e0f, 0x00a83a8c, 0x02e04b69, 0x03244d45, 0x000bda4d, 0x00dc4830, 0x014e27f1, 0x00180240}}, Y: Field{[10]uint32{0x02359f6b, 0x01826750, 0x032e5708, 0x02a1b3b0, 0x01eb4006, 0x0376e998, 0x0396f588, 0x00734b2d, 0x0094f6bd, 0x000d2442}}}, + {X: Field{[10]uint32{0x03f2f773, 0x025223a1, 0x02162d41, 0x00b50d88, 0x03b644c9, 0x01dacfbb, 0x039bec4f, 0x011b60be, 0x0247d02e, 0x002fc13c}}, Y: Field{[10]uint32{0x002172f6, 0x0073af1f, 0x0284d32b, 0x016f07b5, 0x00302e12, 0x019d38d5, 0x019ab004, 0x00b9303c, 0x00e8bb3c, 0x003591bd}}}, + {X: Field{[10]uint32{0x01e5e3c3, 0x0137ea8c, 0x01acff5b, 0x02af0c3a, 0x013e5468, 0x00571b66, 0x0071efd9, 0x02cd4e16, 0x03ecb122, 0x0025827d}}, Y: Field{[10]uint32{0x008f9a27, 0x02d43766, 0x015925d6, 0x03e7bae5, 0x01ebb4d9, 0x0138ab62, 0x0178ac77, 0x03c2e1c5, 0x012eb933, 0x00041af1}}}, + {X: Field{[10]uint32{0x03ab9abe, 0x00ab5882, 0x033668da, 0x007537b1, 0x03f5ae58, 0x032f7d5b, 0x03440fb5, 0x02f89681, 0x003a0e1e, 0x002da433}}, Y: Field{[10]uint32{0x0049dbd1, 0x019aa5f8, 0x0135fb96, 0x03d89269, 0x0335e5f9, 0x02db0595, 0x01a96032, 0x00f76cb3, 0x0023fd3a, 0x0020f340}}}, + {X: Field{[10]uint32{0x01d326d4, 0x00025de4, 0x0338d6cd, 0x0120e56f, 0x002c9479, 0x02a42636, 0x022bc114, 0x01dd106a, 0x008ced50, 0x001cb694}}, Y: Field{[10]uint32{0x03668457, 0x03ed19cf, 0x03e095ea, 0x036ee045, 0x02e5d743, 0x03fb248b, 0x01780364, 0x03a8ac3a, 0x02933433, 0x000596ea}}}, + {X: Field{[10]uint32{0x01851c37, 0x00726dea, 0x0101729b, 0x006e6174, 0x01113320, 0x004969cb, 0x014322f5, 0x00c024a5, 0x016e540a, 0x00383f44}}, Y: Field{[10]uint32{0x01b88a92, 0x024117b9, 0x017ac850, 0x01addde6, 0x01a516a0, 0x00c34c55, 0x01e899d6, 0x01c1f952, 0x027648aa, 0x0031af1c}}}, + {X: Field{[10]uint32{0x00c10af1, 0x00ada0a5, 0x01c13abe, 0x007341a5, 0x030297f0, 0x0220fe76, 0x00d6389e, 0x03904bb8, 0x03ea85d4, 0x002752e2}}, Y: Field{[10]uint32{0x03556181, 0x014962a5, 0x038d38a9, 0x02ef9a28, 0x035bb66e, 0x02a2125c, 0x02e62fd6, 0x0020cb66, 0x00d73f7c, 0x001788a0}}}, + {X: Field{[10]uint32{0x008e08ff, 0x01e8b50e, 0x02d25505, 0x01547085, 0x01069f12, 0x0357acc7, 0x0056123c, 0x01b81377, 0x0395aa4b, 0x003bbe10}}, Y: Field{[10]uint32{0x022d2376, 0x035ad875, 0x039280b1, 0x01b56658, 0x0087797e, 0x00c5e712, 0x018b26c7, 0x010d9103, 0x02a434e1, 0x00114262}}}, + {X: Field{[10]uint32{0x010d7654, 0x02845972, 0x00de739a, 0x02bdb983, 0x03b4652d, 0x01dbbd09, 0x034371e0, 0x02392184, 0x007d56e3, 0x0019bf97}}, Y: Field{[10]uint32{0x011a2fba, 0x022a1370, 0x02582a10, 0x021259b2, 0x0196d4c3, 0x032edb13, 0x000ad433, 0x0324edf9, 0x026bb6ed, 0x000b5ca4}}}, + {X: Field{[10]uint32{0x008ea2ed, 0x031b7cb0, 0x027afdc2, 0x030a4e7c, 0x0082f9e1, 0x02a60f26, 0x015a304a, 0x032bb331, 0x01cc1818, 0x00144d7e}}, Y: Field{[10]uint32{0x003f22d6, 0x028d8878, 0x0295427c, 0x03851e61, 0x002619b5, 0x0056b86d, 0x00baf4e1, 0x005d413e, 0x01d27dfe, 0x0016949b}}}, + {X: Field{[10]uint32{0x026487ca, 0x03e6d88f, 0x0229c3fd, 0x022b386b, 0x0182e331, 0x008a8f8a, 0x03fa2bcc, 0x012a700b, 0x0089af7f, 0x00068df0}}, Y: Field{[10]uint32{0x012464a5, 0x0157fc0f, 0x02c183c9, 0x0048d74b, 0x03509b03, 0x01cd9cb3, 0x02b33d23, 0x008c2ea5, 0x00338522, 0x0034e270}}}, + {X: Field{[10]uint32{0x03a248a0, 0x00461211, 0x01576e4a, 0x00888bec, 0x01ed1edb, 0x02405be5, 0x03c68dfc, 0x02bd0244, 0x01ff15da, 0x00127de9}}, Y: Field{[10]uint32{0x01abd8fd, 0x0231e9ee, 0x03f611a1, 0x02086975, 0x00d5ebec, 0x029aefbd, 0x0394246f, 0x01ef27a5, 0x03013d63, 0x003e6d56}}}, + {X: Field{[10]uint32{0x02641ed7, 0x02abe207, 0x03130253, 0x00d6b0eb, 0x003b87f8, 0x01bac11c, 0x03f0f1e2, 0x03e0e481, 0x005e5d9e, 0x002091e1}}, Y: Field{[10]uint32{0x013c5f1e, 0x01102a79, 0x011de3e2, 0x023c8fce, 0x03b4409c, 0x032d0ab5, 0x01b19474, 0x026139fc, 0x010c1a23, 0x0015df5e}}}, + {X: Field{[10]uint32{0x010e0749, 0x006164f6, 0x024fb8f1, 0x00f897ba, 0x0257b782, 0x00214fa3, 0x0292ef61, 0x000906b3, 0x004ecd16, 0x0020a566}}, Y: Field{[10]uint32{0x00ac8353, 0x0236f230, 0x003c14c3, 0x0259e032, 0x022c5dac, 0x01ec70e2, 0x02450e76, 0x0357dce6, 0x01a66798, 0x0018d4c8}}}, + {X: Field{[10]uint32{0x01d75461, 0x03a7200f, 0x015377b2, 0x004ac4d0, 0x01fb5db4, 0x01c31a2d, 0x00ba34e7, 0x03d7fef8, 0x03f6d8fc, 0x003530ca}}, Y: Field{[10]uint32{0x0085f93d, 0x014fd991, 0x03353741, 0x01459b44, 0x01a1a71e, 0x03b69c2e, 0x004272b4, 0x0116ccb1, 0x0202e238, 0x002cf1cd}}}, + {X: Field{[10]uint32{0x00c897ff, 0x00fdda5b, 0x00d849fd, 0x0329a20b, 0x023babe7, 0x02d49a8c, 0x00703af6, 0x01a39a91, 0x032d04a9, 0x00068238}}, Y: Field{[10]uint32{0x03ad4141, 0x02caa3ab, 0x00b399a6, 0x0025c0d1, 0x013fdc82, 0x00ac52a3, 0x002e19be, 0x03b52897, 0x00bdb77b, 0x0011bb66}}}, + {X: Field{[10]uint32{0x014f4af7, 0x03f70d0d, 0x01e82e7c, 0x03bb3927, 0x036b40e1, 0x02a325dd, 0x0305965d, 0x00fc1012, 0x020e9672, 0x0021566f}}, Y: Field{[10]uint32{0x01333ef6, 0x000f7524, 0x02dc05af, 0x037aae90, 0x02ba4db6, 0x0374241a, 0x03f049b2, 0x008344b0, 0x0388854e, 0x0018f892}}}, + {X: Field{[10]uint32{0x01e211e8, 0x022f7181, 0x008c55e2, 0x0237a333, 0x02edd0f0, 0x03cbbca9, 0x01c0ee30, 0x011e2a12, 0x0223fc7a, 0x0038382c}}, Y: Field{[10]uint32{0x03ca60fc, 0x03580de7, 0x00d1a511, 0x017b44a2, 0x0206609a, 0x016e211e, 0x02d38e12, 0x03eb0481, 0x032c3aaf, 0x00328e20}}}, + {X: Field{[10]uint32{0x00e40a19, 0x014e739a, 0x034e2034, 0x009159e6, 0x00265c34, 0x0245d60b, 0x0001eaa5, 0x034941d6, 0x02982d8e, 0x00288def}}, Y: Field{[10]uint32{0x02231318, 0x0260a956, 0x0087cf48, 0x00ca400f, 0x00dc1bfc, 0x0009b59a, 0x00d5de47, 0x00de0115, 0x0227976a, 0x0003d334}}}, + {X: Field{[10]uint32{0x0205ccf2, 0x03e6d804, 0x03ef2474, 0x035ad0d9, 0x005edbd0, 0x0285bcaf, 0x03fe7705, 0x02341fc0, 0x00821eb0, 0x000a2a12}}, Y: Field{[10]uint32{0x0056a17c, 0x02d7f0fe, 0x02301eec, 0x02f7c03e, 0x01162551, 0x00748f6a, 0x00526b17, 0x01d8a2e8, 0x03e9e7d7, 0x002419f4}}}, + {X: Field{[10]uint32{0x00c1d5e8, 0x01a6b726, 0x01d16f4c, 0x03b84f56, 0x03cc83e2, 0x02083796, 0x01b8fdc3, 0x01ad74c9, 0x00d542bd, 0x00050bfa}}, Y: Field{[10]uint32{0x0075b150, 0x00c42877, 0x004539c8, 0x00186fe7, 0x001b66d1, 0x0235fe98, 0x01d14213, 0x00cee556, 0x02780325, 0x000a5cfc}}}, + {X: Field{[10]uint32{0x00ad87d2, 0x01ec04a6, 0x036b99c9, 0x03edc03e, 0x008f3d5f, 0x006d2e4a, 0x01bb00a1, 0x01927406, 0x011c5d20, 0x0016ced8}}, Y: Field{[10]uint32{0x02519182, 0x032d62bc, 0x0058f8eb, 0x021d688b, 0x00192ead, 0x03b5c2ed, 0x03a76219, 0x00384b37, 0x01c80cde, 0x00212416}}}, + {X: Field{[10]uint32{0x00beb8af, 0x00b1f394, 0x00f6b019, 0x018e5153, 0x012edbdc, 0x03cd7dbd, 0x01f74c35, 0x00168fd8, 0x02495d49, 0x00092288}}, Y: Field{[10]uint32{0x03fd4c83, 0x00dab1ee, 0x035c3b11, 0x00fa6e26, 0x0161eaf7, 0x02219e87, 0x0197b243, 0x03042073, 0x03ffb707, 0x002d69bc}}}, + {X: Field{[10]uint32{0x03ff075c, 0x00e134f6, 0x025d2875, 0x024c0b4e, 0x0231ea20, 0x008a408f, 0x011fa99a, 0x0143a753, 0x022a292b, 0x002291d2}}, Y: Field{[10]uint32{0x03804dd9, 0x035ad97b, 0x01dc8721, 0x01174c35, 0x0245b5f0, 0x01b3e3f4, 0x00392891, 0x0106c797, 0x005c7d53, 0x001dd14a}}}, + {X: Field{[10]uint32{0x0015ffec, 0x023444d4, 0x03b228ca, 0x03492356, 0x03826d10, 0x0198dcc4, 0x00be4ea8, 0x010ba99f, 0x02557fc0, 0x000fe804}}, Y: Field{[10]uint32{0x02a937b3, 0x01d7c9c9, 0x00b25e3f, 0x01b28c8a, 0x00162d43, 0x02312386, 0x03dca5a5, 0x012e3bb2, 0x0325f59b, 0x00042e74}}}, + {X: Field{[10]uint32{0x03d65648, 0x03086567, 0x028c046a, 0x017f22a0, 0x036b778d, 0x02bc126c, 0x008f0071, 0x03c69376, 0x000e7b94, 0x002dded7}}, Y: Field{[10]uint32{0x02aeccc5, 0x032c55fe, 0x0021ad54, 0x00ba77db, 0x01e2b65d, 0x01bb7582, 0x01d57222, 0x02efaa32, 0x03c06722, 0x000c491a}}}, + {X: Field{[10]uint32{0x0135b44a, 0x03107fe1, 0x018e08f2, 0x01bb5747, 0x00567184, 0x026f52ed, 0x02ccad78, 0x00ae5db0, 0x008267e8, 0x00098d7d}}, Y: Field{[10]uint32{0x032b8def, 0x01b569e9, 0x0234dafb, 0x02702d4c, 0x010d2ce3, 0x01edcd4f, 0x03f9e4d4, 0x0247ed99, 0x004e9560, 0x001fb720}}}, + {X: Field{[10]uint32{0x021b474d, 0x0382198d, 0x032384a4, 0x0368635d, 0x03ed0012, 0x0347a8da, 0x036f39b6, 0x014b271a, 0x012dae09, 0x0008c1ad}}, Y: Field{[10]uint32{0x025486c0, 0x02d5b3cc, 0x01221582, 0x01caf348, 0x00bd7674, 0x00b3bf3d, 0x023688bb, 0x023dae69, 0x00b88d7b, 0x0010e094}}}, + {X: Field{[10]uint32{0x01f74b4c, 0x03625eea, 0x0016e248, 0x03baa300, 0x03aa5604, 0x03568747, 0x0186f9ee, 0x020a123d, 0x02b80dde, 0x0032aa19}}, Y: Field{[10]uint32{0x0009c341, 0x012957f7, 0x038f2995, 0x029f563e, 0x00e33746, 0x02016909, 0x02834ceb, 0x01e3115c, 0x0140349f, 0x000a063c}}}, + {X: Field{[10]uint32{0x00bb1641, 0x031c3fa2, 0x037cbb74, 0x01eec949, 0x03fb5e57, 0x027007b4, 0x01e9cc42, 0x00f5417d, 0x035aa079, 0x0020637b}}, Y: Field{[10]uint32{0x024f276d, 0x02cfb8bb, 0x0045fbdd, 0x02d24e85, 0x01f48ea2, 0x0258d9f4, 0x022d54d7, 0x0040c603, 0x0280f762, 0x0036a7bb}}}, + {X: Field{[10]uint32{0x007bf736, 0x00b7e491, 0x01bf08b1, 0x030d68a5, 0x03c36e11, 0x02f2b16e, 0x0364ed01, 0x0104bf35, 0x01fa568d, 0x000b18b3}}, Y: Field{[10]uint32{0x02c31979, 0x0301468f, 0x025a8f82, 0x02fc654c, 0x00ee73ea, 0x02ae9906, 0x01ef9859, 0x01c189c1, 0x00255811, 0x003a2e38}}}, + {X: Field{[10]uint32{0x01f04adb, 0x033a01f8, 0x0341659b, 0x006adbac, 0x014e477f, 0x0145f412, 0x022f7cd0, 0x01ba3352, 0x00d99db0, 0x000a2ad5}}, Y: Field{[10]uint32{0x0094541c, 0x028a799d, 0x03b0872a, 0x00107b2f, 0x004fb003, 0x03cf9f61, 0x0256276b, 0x02580af9, 0x0319a5cb, 0x00264ed4}}}, + {X: Field{[10]uint32{0x012b6061, 0x01205314, 0x03bb63ea, 0x03d7c57a, 0x01d6c2ab, 0x008ea090, 0x034eca42, 0x02903152, 0x00162254, 0x00124f9f}}, Y: Field{[10]uint32{0x00eed628, 0x03e02e8f, 0x02c897de, 0x01efc25f, 0x025fcf81, 0x02ba3c87, 0x0236b597, 0x027533fb, 0x037b588d, 0x00158e1f}}}, + {X: Field{[10]uint32{0x01c51d4f, 0x034818ae, 0x01bce902, 0x023888b2, 0x018922a6, 0x00b174e2, 0x02118dda, 0x0245953f, 0x01bee743, 0x0019cb84}}, Y: Field{[10]uint32{0x03dc36e1, 0x000b70c8, 0x03c5fc51, 0x03eaff39, 0x030db6bb, 0x017a758a, 0x03cfbca4, 0x00aa76d2, 0x034a0238, 0x000d5544}}}, + {X: Field{[10]uint32{0x02da550a, 0x022cb0e3, 0x02701003, 0x00b0a567, 0x0027524b, 0x0167e397, 0x0286c06b, 0x01a22637, 0x036ee3b8, 0x0023e343}}, Y: Field{[10]uint32{0x01212f34, 0x005c40d2, 0x01fd45d4, 0x01b09afc, 0x03f36429, 0x021ef2ce, 0x000fed66, 0x02af1665, 0x02819e27, 0x0039f7bc}}}, + {X: Field{[10]uint32{0x00b293e3, 0x004fed5e, 0x01495e82, 0x00084817, 0x03118f28, 0x005e7cc2, 0x03cf4c79, 0x03c295e5, 0x03834a11, 0x0036a315}}, Y: Field{[10]uint32{0x01c35f91, 0x00077ce2, 0x00d28a2c, 0x0386d8ce, 0x007c7a0c, 0x02d77146, 0x02bb1c3a, 0x00e5d421, 0x035c6f66, 0x001bb3f8}}}, + {X: Field{[10]uint32{0x01681955, 0x01fea852, 0x00ef4265, 0x02ce0f88, 0x00fbce09, 0x02a66e83, 0x03ec2d6f, 0x0197fcfb, 0x00f53b19, 0x001254f8}}, Y: Field{[10]uint32{0x035541c6, 0x026d5065, 0x00a39fc0, 0x025c6343, 0x023c28fa, 0x01e601d9, 0x00683240, 0x00d6c8f9, 0x038d9d16, 0x00308431}}}, + {X: Field{[10]uint32{0x0375f293, 0x0108108d, 0x038db6c7, 0x03205b68, 0x025cd3e0, 0x03a442f5, 0x021f7fdb, 0x038786f8, 0x01af48a0, 0x0015247f}}, Y: Field{[10]uint32{0x007ffae7, 0x013b34bf, 0x0243e3d3, 0x02580c61, 0x039c82de, 0x02d47d3c, 0x03e9b299, 0x014ce28e, 0x02885d1c, 0x001949cd}}}, + {X: Field{[10]uint32{0x03c168d1, 0x03b26d6a, 0x007f0af3, 0x00a50f24, 0x020b0a85, 0x03c5f46d, 0x01838858, 0x018ee7ed, 0x03a80423, 0x002e712b}}, Y: Field{[10]uint32{0x03550d9a, 0x03f85592, 0x0178e514, 0x006c1b50, 0x01e24d51, 0x0329f635, 0x0013aa1e, 0x03afb574, 0x006b1b75, 0x003af4c4}}}, + {X: Field{[10]uint32{0x02d2bd62, 0x00dda0e4, 0x02386242, 0x01cceaf2, 0x01d6802e, 0x02ae0275, 0x039826de, 0x011e86d7, 0x036c4448, 0x00246368}}, Y: Field{[10]uint32{0x0253e218, 0x03c77722, 0x02eca0ab, 0x01b9859b, 0x02889d5e, 0x02ce2627, 0x0214113a, 0x021f9857, 0x03afd7cc, 0x001b988d}}}, + {X: Field{[10]uint32{0x01d3392a, 0x010b8dc0, 0x02c93a2e, 0x00bd15ca, 0x00748eb4, 0x026dd0f3, 0x000240e5, 0x01452820, 0x0194da1f, 0x001ddf4a}}, Y: Field{[10]uint32{0x029680c6, 0x0374e8e2, 0x038645e6, 0x016a7487, 0x039d9250, 0x01387493, 0x02b96f41, 0x00c654b2, 0x03d7e9eb, 0x00001864}}}, + {X: Field{[10]uint32{0x0323bf3d, 0x01fc8c95, 0x0154c4d1, 0x0140d3be, 0x013988c6, 0x03c93bd5, 0x03b8b3ea, 0x03171789, 0x02a09a08, 0x0004239b}}, Y: Field{[10]uint32{0x0013b2eb, 0x03786fff, 0x01be288f, 0x01dba093, 0x02b8a0dd, 0x020464de, 0x0314ebff, 0x01aed1f0, 0x034b86db, 0x0006a2e5}}}, + {X: Field{[10]uint32{0x016bf185, 0x02b15291, 0x02839b5d, 0x03d129a0, 0x013c2dce, 0x037ab87f, 0x018a4868, 0x01352446, 0x02db65a5, 0x000db676}}, Y: Field{[10]uint32{0x0147bbf7, 0x014092c8, 0x00d8d078, 0x03e0d1f7, 0x011edd9b, 0x0196fbc6, 0x02ec3065, 0x01761897, 0x0356d93b, 0x00097a10}}}, + {X: Field{[10]uint32{0x02531fa7, 0x039c74d9, 0x02fe3ab2, 0x01508ca4, 0x02aab896, 0x0009c9b3, 0x01d8a9e3, 0x039dd9ca, 0x02b143ec, 0x000f83ae}}, Y: Field{[10]uint32{0x018d41cd, 0x00e0f665, 0x03d5c691, 0x0384f66a, 0x008e38ea, 0x03ec12cd, 0x008f32b2, 0x0188da25, 0x0208556d, 0x001b9ec9}}}, + {X: Field{[10]uint32{0x00fa3728, 0x02f6d706, 0x034832ba, 0x0108055f, 0x03ab08ab, 0x004fba6a, 0x01e9521a, 0x03cc6a87, 0x036af315, 0x00248f71}}, Y: Field{[10]uint32{0x02d3ae47, 0x03b81f03, 0x0003ef6b, 0x02158cc4, 0x017facf6, 0x03627992, 0x001bfca6, 0x0215ecc5, 0x03b67439, 0x001ea3c5}}}, + {X: Field{[10]uint32{0x016a6618, 0x0313a80f, 0x02c6de85, 0x02a4deea, 0x036bee02, 0x00738b85, 0x029cb815, 0x03ab8d33, 0x033202df, 0x003e1fff}}, Y: Field{[10]uint32{0x005a03e0, 0x01d84856, 0x00e13c71, 0x0330b879, 0x027c14a4, 0x000f36ff, 0x03ace256, 0x01b828d5, 0x0037aa72, 0x001d3924}}}, + {X: Field{[10]uint32{0x018881ed, 0x00fe7040, 0x008200e3, 0x03fc1d5a, 0x01e00b5a, 0x014e7dfa, 0x01ec106b, 0x01a68047, 0x025ddd7f, 0x0004e201}}, Y: Field{[10]uint32{0x0113408e, 0x00c8c5d3, 0x0332c92b, 0x00c88ff9, 0x0065d1a9, 0x02ad090b, 0x02f72a55, 0x01877508, 0x018f1406, 0x002b2ac7}}}, + {X: Field{[10]uint32{0x004b6941, 0x026d88eb, 0x0201e59e, 0x00d2b314, 0x003d685b, 0x028dd46e, 0x03315427, 0x01a8220d, 0x031ea99b, 0x003951da}}, Y: Field{[10]uint32{0x033b4e21, 0x022cba57, 0x0177bb41, 0x019cf321, 0x00bc86dd, 0x02a3e9d5, 0x03c794ca, 0x01e568c8, 0x02f1c4dd, 0x0015f56c}}}, + {X: Field{[10]uint32{0x01cd1f15, 0x011f2c05, 0x0109c3dd, 0x02053b5e, 0x0290c149, 0x03261063, 0x0229d894, 0x03afa930, 0x0360f1e8, 0x003e4e3f}}, Y: Field{[10]uint32{0x02bb13e1, 0x0140c63b, 0x028214da, 0x0316dbb5, 0x02037fe2, 0x01cafef5, 0x0176e293, 0x03191a81, 0x02121a0c, 0x0035c5c8}}}, + {X: Field{[10]uint32{0x00a30aa3, 0x0168ef66, 0x038ad8ad, 0x013e8221, 0x01180b49, 0x02153e6f, 0x015544d5, 0x0144205e, 0x00107c4a, 0x002cc6f5}}, Y: Field{[10]uint32{0x00519e82, 0x01bd7014, 0x031c18fb, 0x03c384ac, 0x03d33828, 0x0001faac, 0x0141affa, 0x0225897a, 0x00976bd5, 0x00250984}}}, + {X: Field{[10]uint32{0x00c1cb2f, 0x011f40fd, 0x03af7b44, 0x02495768, 0x0333abd6, 0x0269b1b4, 0x02df141b, 0x00340468, 0x03ba8321, 0x002cfb61}}, Y: Field{[10]uint32{0x01d632b3, 0x02452a93, 0x0347abe0, 0x006cd1f9, 0x02b90be7, 0x018d0799, 0x030273cb, 0x015f86a5, 0x037929c7, 0x00252774}}}, + {X: Field{[10]uint32{0x01221e17, 0x03b85b4c, 0x03f46668, 0x0038e2e1, 0x0089a57c, 0x00c6f282, 0x0395e787, 0x0243612e, 0x02401ea7, 0x001839b0}}, Y: Field{[10]uint32{0x029465c2, 0x02f451b2, 0x0198cc03, 0x00110143, 0x00367387, 0x015c7abc, 0x01c800a0, 0x00263ca9, 0x0335c722, 0x003c91ef}}}, + {X: Field{[10]uint32{0x03750a80, 0x02bebc70, 0x03b87994, 0x01abdd30, 0x01eaf3e1, 0x01c4f35c, 0x01d8d370, 0x03411f9f, 0x02b04cc8, 0x000aba01}}, Y: Field{[10]uint32{0x02e2e954, 0x03793aec, 0x0135ae38, 0x028906a8, 0x026facf6, 0x0017283b, 0x007fafe6, 0x01c6d46a, 0x00acb297, 0x002a365e}}}, + {X: Field{[10]uint32{0x01bb5c47, 0x0109308a, 0x0343958a, 0x0218dde7, 0x01d23843, 0x007dbcea, 0x020bb155, 0x00b4a79e, 0x00a4bbba, 0x0026bc5e}}, Y: Field{[10]uint32{0x0279abd3, 0x0006886b, 0x03259781, 0x02eab737, 0x014052a4, 0x00beecf4, 0x007ac857, 0x02215e92, 0x03baa023, 0x003040c7}}}, + {X: Field{[10]uint32{0x0008f523, 0x005b6658, 0x00b2c3a1, 0x00c4cc3b, 0x00fd78a5, 0x027a2894, 0x03da097c, 0x009ebcb9, 0x0321e9cb, 0x002775a9}}, Y: Field{[10]uint32{0x03f36080, 0x03274ff9, 0x0217357d, 0x0177d3a0, 0x03fc4e97, 0x02f195e1, 0x012adb14, 0x0027251c, 0x037d6473, 0x0039a0de}}}, + {X: Field{[10]uint32{0x01e91c52, 0x006876a9, 0x03f0f0e3, 0x02da68a2, 0x03fcb717, 0x0113beed, 0x03e3f1de, 0x028794ec, 0x02bed7a1, 0x0033d7c5}}, Y: Field{[10]uint32{0x00487497, 0x00a0d2b1, 0x014b1485, 0x003629a7, 0x00b0c80a, 0x0264833d, 0x03912c99, 0x0081ef18, 0x03d54d87, 0x0025527a}}}, + {X: Field{[10]uint32{0x03a64722, 0x03a417b7, 0x001afd45, 0x03ece880, 0x01de577c, 0x014a8052, 0x02466a3c, 0x015341e0, 0x00908109, 0x00319e52}}, Y: Field{[10]uint32{0x035ca468, 0x0091837d, 0x01187fcc, 0x00946f9a, 0x018621b6, 0x03209e0a, 0x00a5fbd5, 0x0100c6ff, 0x0351deb6, 0x001293f7}}}, + {X: Field{[10]uint32{0x00599713, 0x0354904c, 0x023e4442, 0x0083f869, 0x02b03b49, 0x010501aa, 0x019c1ea0, 0x0383fc59, 0x03cbbee9, 0x002897ff}}, Y: Field{[10]uint32{0x0341486a, 0x01bc912f, 0x007e2123, 0x024537a6, 0x0240fab7, 0x02dca86e, 0x03fc28af, 0x004626b0, 0x02065a82, 0x0005dae7}}}, + {X: Field{[10]uint32{0x00c5bf71, 0x0125dd38, 0x025ecdca, 0x01ab2ba7, 0x01128cab, 0x009238ca, 0x02cfafc7, 0x0248ec5a, 0x0322fd5d, 0x00181e69}}, Y: Field{[10]uint32{0x018c4bcc, 0x03debaf4, 0x00c45df0, 0x024af57b, 0x02023f52, 0x000cdfbf, 0x036f1d91, 0x01691713, 0x02de99ca, 0x0030265c}}}, + {X: Field{[10]uint32{0x0366b403, 0x02772e4a, 0x0182c813, 0x003f2add, 0x02f64b95, 0x02c59c8f, 0x03ffc428, 0x01e39c63, 0x003d9d40, 0x0006232d}}, Y: Field{[10]uint32{0x03af5404, 0x03dfc688, 0x0314c140, 0x03ccd62a, 0x01fcc8c2, 0x0155a45b, 0x01a28799, 0x02890002, 0x0237ec9e, 0x00280e3e}}}, + {X: Field{[10]uint32{0x0019bb30, 0x006c9fbe, 0x0102cd78, 0x00d1a33f, 0x00c445ca, 0x01559fb2, 0x03925066, 0x0171a3d5, 0x0040cb57, 0x0038c43f}}, Y: Field{[10]uint32{0x02be625e, 0x01ae278a, 0x0384ddf6, 0x00da83c5, 0x02e0c183, 0x01b9ee51, 0x0101def6, 0x004bb97a, 0x02655ba3, 0x000c4ca2}}}, + {X: Field{[10]uint32{0x03dea4ac, 0x015d2fdd, 0x03c8e52b, 0x037c91b0, 0x00f15693, 0x03d18b32, 0x000bdeb1, 0x01177765, 0x005d1c82, 0x00376192}}, Y: Field{[10]uint32{0x01966ce2, 0x03027182, 0x03b4833f, 0x02d1f9d0, 0x018963a8, 0x028a6282, 0x0290175b, 0x0289c131, 0x03c256c9, 0x00335aed}}}, + {X: Field{[10]uint32{0x03019aef, 0x01740a81, 0x0097bde8, 0x02666cd8, 0x03dba773, 0x02da7865, 0x03dc67ca, 0x019ee1bd, 0x020cf815, 0x0006dfb4}}, Y: Field{[10]uint32{0x00e3d1bb, 0x03f0d7bc, 0x01531be6, 0x01534c53, 0x00df428d, 0x0292f0de, 0x00d89b59, 0x010e1954, 0x012ad1cb, 0x003e053a}}}, + {X: Field{[10]uint32{0x01ded284, 0x01c669ed, 0x01897a0f, 0x00328191, 0x019b41cd, 0x01c2cfc7, 0x0146a036, 0x020ce3b4, 0x007b2d52, 0x00028556}}, Y: Field{[10]uint32{0x022e925d, 0x03a9c9c4, 0x0052bfe6, 0x008ab5ad, 0x0312fc15, 0x01008fb9, 0x00d225cc, 0x00693b8c, 0x034b5aba, 0x000abbf8}}}, + {X: Field{[10]uint32{0x036a5484, 0x01254fa4, 0x01054048, 0x018e7934, 0x0208d194, 0x02825033, 0x00fcf209, 0x029a4663, 0x01f9c99d, 0x00015eee}}, Y: Field{[10]uint32{0x031660e4, 0x0291f20c, 0x0079e9a6, 0x01ef634c, 0x03700dc5, 0x035defc3, 0x03be5e41, 0x009ba0b1, 0x03a8d902, 0x0018f43e}}}, + {X: Field{[10]uint32{0x03bd262c, 0x02497564, 0x03746bab, 0x03ee3e92, 0x01291f84, 0x00844ec8, 0x017f7a10, 0x02d2835f, 0x01b37fa1, 0x000890a5}}, Y: Field{[10]uint32{0x00195796, 0x0258ae4e, 0x03ddcea2, 0x023b1145, 0x0246ed38, 0x00889982, 0x023eb74c, 0x02c369d5, 0x0040b1e4, 0x0003582b}}}, + {X: Field{[10]uint32{0x0053b0e3, 0x00e69ad5, 0x0055e53b, 0x0283c8a0, 0x02d6101c, 0x039d0d53, 0x00031b29, 0x0314f81f, 0x02e6a34e, 0x00090d3a}}, Y: Field{[10]uint32{0x003ce23d, 0x01e8e09d, 0x010ed6ce, 0x01d591db, 0x008b04f7, 0x00e88398, 0x00f39563, 0x0012ec4e, 0x0161d57a, 0x000bfd7b}}}, + {X: Field{[10]uint32{0x01885ce9, 0x02961c62, 0x0203b700, 0x02d8db42, 0x01ef2e6a, 0x03ec8ac1, 0x0304c649, 0x00444ef6, 0x0192907c, 0x00112379}}, Y: Field{[10]uint32{0x0079eabc, 0x0108732a, 0x028803d0, 0x00435164, 0x0063af8b, 0x016c0a4c, 0x03e6dea2, 0x0141a37a, 0x03fd6ab3, 0x0035eab3}}}, + {X: Field{[10]uint32{0x0393dd76, 0x028dc618, 0x0298f7c2, 0x00730769, 0x00defc0a, 0x006a8ee8, 0x02b92e70, 0x01d9d1ff, 0x03735aef, 0x00210173}}, Y: Field{[10]uint32{0x02c407f2, 0x01549639, 0x0053fc79, 0x00beea1a, 0x0189c9ef, 0x03d2a1c4, 0x0261c783, 0x00428129, 0x000649cd, 0x0015e574}}}, + {X: Field{[10]uint32{0x0208efc9, 0x0084735b, 0x026d5581, 0x03341cb1, 0x029318ac, 0x00dc7ae1, 0x01349aa0, 0x0121f7fa, 0x00c1e5c1, 0x001a625d}}, Y: Field{[10]uint32{0x0384509c, 0x030703fb, 0x00e1590b, 0x00aaee13, 0x01bcec87, 0x02ae6bd8, 0x036536c2, 0x012fd47d, 0x038cdc8f, 0x000df088}}}, + {X: Field{[10]uint32{0x003fee05, 0x0395cc99, 0x02d8dce2, 0x01846e11, 0x03e6548c, 0x00c57de2, 0x017781df, 0x02af19c6, 0x017abe3c, 0x00228de1}}, Y: Field{[10]uint32{0x00f674ed, 0x01da62d3, 0x020b78b8, 0x026c8777, 0x005e28e9, 0x038e19b5, 0x0055e4d9, 0x013341f9, 0x03680915, 0x000a620b}}}, + {X: Field{[10]uint32{0x0397eaef, 0x02f380c8, 0x00846793, 0x037c3e98, 0x0325ec8c, 0x01ea29c5, 0x0104c968, 0x00e7f84c, 0x034f5cdd, 0x002a1c6c}}, Y: Field{[10]uint32{0x0387cb28, 0x03f5e8b0, 0x00c5df3f, 0x037a379b, 0x00642312, 0x01b2484f, 0x03e2dc68, 0x000f027d, 0x00179de1, 0x00213e59}}}, + {X: Field{[10]uint32{0x0286f44a, 0x019339a0, 0x00fb4fd9, 0x031ebaae, 0x009ec66e, 0x02679d2b, 0x0057905e, 0x029fd6a2, 0x03b89f78, 0x00126f2b}}, Y: Field{[10]uint32{0x019eff6f, 0x03901f3b, 0x0194f4ea, 0x01849c5b, 0x0271124a, 0x02f464fa, 0x011d2ca7, 0x02add29e, 0x00cb5641, 0x0039f6e3}}}, + {X: Field{[10]uint32{0x028b6df6, 0x01c4c03d, 0x03686c3f, 0x012de7fa, 0x0140d9b8, 0x03ffa126, 0x0186289d, 0x0327963d, 0x012f2f05, 0x003571f6}}, Y: Field{[10]uint32{0x0151c08e, 0x0200abc7, 0x020434f1, 0x00aff38d, 0x036fcb2b, 0x0073d0ae, 0x00b272ce, 0x028e3a81, 0x025c219e, 0x0029a2ca}}}, + {X: Field{[10]uint32{0x03286696, 0x02a36d4e, 0x0056cfe4, 0x02f8a09b, 0x006a825c, 0x02c323b4, 0x034a249c, 0x0335ee71, 0x023cfea4, 0x000ab0bf}}, Y: Field{[10]uint32{0x0360f43f, 0x039e0102, 0x03834a67, 0x01b3c028, 0x00505bb4, 0x01b2981e, 0x02f6031c, 0x02947b28, 0x0259b008, 0x001f6429}}}, + {X: Field{[10]uint32{0x00a39234, 0x00716a84, 0x011d92f6, 0x03bec0ed, 0x025b0069, 0x0283b69e, 0x023a85f5, 0x01fb3d3d, 0x00bc6282, 0x001f026b}}, Y: Field{[10]uint32{0x01624836, 0x01b1a21a, 0x030015a9, 0x03c8258a, 0x00854b56, 0x017f70c6, 0x01f86414, 0x00a315a1, 0x0139c291, 0x00381f49}}}, + {X: Field{[10]uint32{0x03fbf9f0, 0x025aefdb, 0x03a7f2c4, 0x0008d289, 0x033bb4ff, 0x00ecbeb4, 0x0141ae71, 0x010b9da6, 0x01567e1b, 0x003a21b7}}, Y: Field{[10]uint32{0x0267a877, 0x0045cb71, 0x0301081d, 0x03cf18c2, 0x025a4666, 0x037d3977, 0x01c097f0, 0x03e03cdc, 0x037babee, 0x00352c89}}}, + {X: Field{[10]uint32{0x0059c2dc, 0x02866740, 0x00464073, 0x039614d1, 0x038ca8a6, 0x03d82ec6, 0x02178f0f, 0x00e60f16, 0x00c800e8, 0x003b7d97}}, Y: Field{[10]uint32{0x01ab2d5e, 0x01d89122, 0x0123a92c, 0x036c41c3, 0x030118a4, 0x0378737e, 0x024710a2, 0x00c27e12, 0x0313f0c5, 0x00289099}}}, + {X: Field{[10]uint32{0x026d17f8, 0x01abdbb4, 0x01036a74, 0x02ee8f4b, 0x03435ad7, 0x02c548c8, 0x016dbbe5, 0x01baee4d, 0x0304b78a, 0x000a704b}}, Y: Field{[10]uint32{0x016eae4a, 0x03f3b388, 0x019358b7, 0x009fe816, 0x02b3336d, 0x027b1146, 0x02a211f3, 0x0046a9e3, 0x0275bf62, 0x00020e64}}}, + {X: Field{[10]uint32{0x0263c3e2, 0x03e29e59, 0x00789994, 0x01192986, 0x03169f20, 0x0383e7f3, 0x02034ac3, 0x026453c2, 0x038c280e, 0x003576e2}}, Y: Field{[10]uint32{0x0263412b, 0x00355df0, 0x02cbbeb6, 0x01e2a997, 0x0398f270, 0x0066507d, 0x025635a8, 0x0000e7d7, 0x003a085a, 0x0010458f}}}, + {X: Field{[10]uint32{0x01135f8d, 0x00285f36, 0x01165700, 0x016b151f, 0x0210e105, 0x02ed3dff, 0x00e57ac8, 0x02c03656, 0x03a5630e, 0x00264293}}, Y: Field{[10]uint32{0x03c9653b, 0x02c8f5d2, 0x032912ec, 0x0053e3f3, 0x03eb2524, 0x0231c485, 0x02a03646, 0x028a2511, 0x0025491f, 0x003c97b8}}}, + {X: Field{[10]uint32{0x029c0935, 0x00ded5e7, 0x031b7416, 0x03b31a35, 0x034e3049, 0x00c573d4, 0x0101c3b3, 0x012773b2, 0x00f01c78, 0x0035e13b}}, Y: Field{[10]uint32{0x034205ce, 0x03593eda, 0x03dde6b2, 0x00202159, 0x02306720, 0x03b1bf51, 0x0082a841, 0x00abb763, 0x0122cc38, 0x00177a63}}}, + {X: Field{[10]uint32{0x00e38193, 0x01334d5b, 0x01338320, 0x03946726, 0x019b4d38, 0x037cf067, 0x0353b67b, 0x0032eeab, 0x00d05885, 0x000195db}}, Y: Field{[10]uint32{0x0310eaca, 0x03dd3195, 0x03420658, 0x0038c2fc, 0x03d98496, 0x01d923f8, 0x001fbeb2, 0x0395b8c7, 0x013e92d1, 0x0028ca66}}}, + {X: Field{[10]uint32{0x0035efce, 0x012113af, 0x024d8bb9, 0x01dcf49b, 0x0320ccb1, 0x0311527f, 0x009a8081, 0x03031919, 0x00e5f675, 0x00255de2}}, Y: Field{[10]uint32{0x021d9b5b, 0x016a8394, 0x00a8c051, 0x001a6f04, 0x0301d329, 0x005785f3, 0x01c39486, 0x03b8df65, 0x031cdc4b, 0x001fa910}}}, + {X: Field{[10]uint32{0x039e4a2e, 0x014b0178, 0x0096b014, 0x03cec114, 0x00da5549, 0x02304ffc, 0x0101abd7, 0x02d4dfb1, 0x02805053, 0x0022bdf2}}, Y: Field{[10]uint32{0x017e8402, 0x0160da8b, 0x03fb8e1b, 0x001ba759, 0x036a4362, 0x03690150, 0x03235e60, 0x010b933e, 0x0225aac0, 0x00097a18}}}, + {X: Field{[10]uint32{0x0215236c, 0x024df438, 0x02ba2623, 0x01598dec, 0x01e6eb74, 0x035e705e, 0x02ff642a, 0x018d3880, 0x0393e16e, 0x00126fc0}}, Y: Field{[10]uint32{0x0031a85d, 0x00f9a5e9, 0x00722d60, 0x00305e6b, 0x0141e5f8, 0x02684d10, 0x000ce1ee, 0x03835073, 0x013f401d, 0x00216418}}}, + {X: Field{[10]uint32{0x00192063, 0x03af4675, 0x035afdc5, 0x03b68992, 0x01df3653, 0x02326db7, 0x03b68581, 0x00a18d49, 0x02250257, 0x00320b8a}}, Y: Field{[10]uint32{0x01a6de8c, 0x01d78f8e, 0x011c7b26, 0x03dcddbe, 0x01c2717f, 0x01fe7a4e, 0x030af044, 0x0306f4f5, 0x0000cd87, 0x000ee1be}}}, + {X: Field{[10]uint32{0x00eedbf3, 0x004b7f76, 0x02041a37, 0x0154562c, 0x0142ec13, 0x0393489f, 0x02fc9c3f, 0x023df0eb, 0x01202b9a, 0x0027390e}}, Y: Field{[10]uint32{0x035b52f6, 0x0288327f, 0x026e26d5, 0x02cf70bb, 0x0153a54b, 0x02a4e7fe, 0x02f15d59, 0x03b74feb, 0x0305859a, 0x0036eed6}}}, + {X: Field{[10]uint32{0x02fe6227, 0x02f6dac5, 0x0324a168, 0x02b425bb, 0x00baa707, 0x03b2ad2e, 0x01202213, 0x0017294b, 0x009e49de, 0x000381c0}}, Y: Field{[10]uint32{0x00bc33c9, 0x023e739b, 0x03b2e417, 0x00f28548, 0x03258383, 0x037a353a, 0x03865b0a, 0x02e89a06, 0x00bfe752, 0x001a8d6c}}}, + {X: Field{[10]uint32{0x021da888, 0x00056f60, 0x03fab065, 0x017fd308, 0x01d58861, 0x025849c5, 0x02948147, 0x02bd8791, 0x01b47e09, 0x003ad373}}, Y: Field{[10]uint32{0x01661b8f, 0x017454fa, 0x000834a5, 0x01710410, 0x00008630, 0x01320457, 0x006536ad, 0x000be878, 0x01685846, 0x0018f8e0}}}, + {X: Field{[10]uint32{0x00e49db6, 0x013cce44, 0x00f7bf86, 0x001c981e, 0x03a2c659, 0x034a76b3, 0x0257015d, 0x00044c74, 0x02812bf2, 0x002f97e1}}, Y: Field{[10]uint32{0x016d9da7, 0x01004765, 0x01f308f0, 0x02e3103a, 0x0143c4f1, 0x01cfe944, 0x015a92da, 0x012bfd66, 0x00e45617, 0x00343d08}}}, + {X: Field{[10]uint32{0x015b99a8, 0x007e204d, 0x01ed74a6, 0x0172cc75, 0x03db214a, 0x0375fa3b, 0x03a1318e, 0x017e7663, 0x003910e7, 0x000eccb7}}, Y: Field{[10]uint32{0x03a18bc5, 0x02bc68a8, 0x03c4218b, 0x02b15cbe, 0x036e4e0a, 0x01d4b952, 0x01df756e, 0x03a7967f, 0x028619c2, 0x000684b7}}}, + {X: Field{[10]uint32{0x02e04db1, 0x00f9e921, 0x029d0a3c, 0x00d45a5c, 0x03dde107, 0x00fce1ad, 0x012922ea, 0x03a21597, 0x01ce5c06, 0x00256b17}}, Y: Field{[10]uint32{0x02f39838, 0x02d6c9cf, 0x029fde77, 0x01dc9465, 0x01680edb, 0x005aded2, 0x0049e856, 0x0060878f, 0x0187ab1b, 0x000688b3}}}, + {X: Field{[10]uint32{0x00e708eb, 0x0060db5f, 0x005ccd30, 0x00782a37, 0x027dad59, 0x017b4a57, 0x01d1b74a, 0x03c4f8cd, 0x00fba4b0, 0x001b93b4}}, Y: Field{[10]uint32{0x0234b931, 0x01fc5482, 0x01a54ac3, 0x0267a670, 0x0016a2ef, 0x027366ac, 0x0188e6e5, 0x013827b6, 0x026ac61c, 0x00241585}}}, + {X: Field{[10]uint32{0x03a42e10, 0x03ae8b08, 0x01859898, 0x01e6474b, 0x01ea8d9a, 0x0209f612, 0x00925e17, 0x003b84dd, 0x0394208e, 0x0022df0c}}, Y: Field{[10]uint32{0x0043d193, 0x02afac9c, 0x02d0d003, 0x03d8bc86, 0x032c8beb, 0x01d7bcff, 0x00e64400, 0x002f3244, 0x02379672, 0x002daae4}}}, + {X: Field{[10]uint32{0x00f871c6, 0x001612ec, 0x02dcc8e2, 0x01363e5b, 0x02dd48ab, 0x02dbd772, 0x00965b98, 0x0035ce21, 0x0347f669, 0x0003f69e}}, Y: Field{[10]uint32{0x02926c5d, 0x02e39af2, 0x03560e18, 0x00895791, 0x00309292, 0x0152d1cf, 0x03487e8b, 0x0331b4a2, 0x0035a272, 0x0026d009}}}, + {X: Field{[10]uint32{0x01bcb217, 0x0041a8cf, 0x0255dad6, 0x022f3246, 0x036e6301, 0x0303a6a8, 0x00beb534, 0x01686bbe, 0x00f5395a, 0x003c5768}}, Y: Field{[10]uint32{0x038a8f1c, 0x03afdd95, 0x00f6ddb6, 0x00bef3e6, 0x0380be25, 0x021825c8, 0x03571ac4, 0x00054645, 0x01eabb3b, 0x000a33da}}}, + {X: Field{[10]uint32{0x00af9253, 0x036206ef, 0x032f4abf, 0x02e1fea0, 0x03d9a208, 0x021c26a5, 0x02378e63, 0x005f8324, 0x02dd2c78, 0x0031b899}}, Y: Field{[10]uint32{0x03769626, 0x0247b9f2, 0x02082842, 0x03724c8c, 0x005ffa7a, 0x0342fbd6, 0x00e95e35, 0x02ce8c32, 0x00c1fa9b, 0x000abc40}}}, + {X: Field{[10]uint32{0x02e28753, 0x00cf422d, 0x0313f0d1, 0x01e93f6a, 0x037f5a72, 0x00e495a1, 0x00c21a83, 0x00807922, 0x02020fdd, 0x0012fe2a}}, Y: Field{[10]uint32{0x015fc8b8, 0x02fa74f3, 0x01d88f39, 0x0016572f, 0x02d8fe5f, 0x0279b188, 0x01c6bd70, 0x01356685, 0x0258ad9c, 0x00162049}}}, + {X: Field{[10]uint32{0x00d0a6d3, 0x03f04a5f, 0x0248b972, 0x01cf6d87, 0x0105cda6, 0x029dfee5, 0x009fc39d, 0x01216956, 0x032806dd, 0x002aa617}}, Y: Field{[10]uint32{0x024b75b2, 0x017d8347, 0x00a04e1e, 0x00404389, 0x007c2777, 0x007fc0b8, 0x025a92da, 0x018ecca6, 0x00972f11, 0x002aec3e}}}, + {X: Field{[10]uint32{0x01c41c9d, 0x01ccbb18, 0x0197c8e1, 0x012c33b4, 0x016c2fa0, 0x02305048, 0x039f88d8, 0x02873d3a, 0x0101ec13, 0x00205d34}}, Y: Field{[10]uint32{0x03d79aa7, 0x01a9d623, 0x01bbb46f, 0x012c69e4, 0x00c6e5d9, 0x0298e6c0, 0x037a6625, 0x00b9ffab, 0x01c231b0, 0x00319d97}}}, + {X: Field{[10]uint32{0x01f3d876, 0x00bc13db, 0x02cbb870, 0x02b3f6f9, 0x0292573a, 0x016a68e8, 0x028fe098, 0x024a5edc, 0x02a9d603, 0x003e7d93}}, Y: Field{[10]uint32{0x024ca01a, 0x01f4b266, 0x02f9b1a6, 0x03ef61fb, 0x01188069, 0x005cba1e, 0x00950f21, 0x019f4058, 0x03c14060, 0x001051b1}}}, + {X: Field{[10]uint32{0x00f1b3b4, 0x0197b32a, 0x02951d88, 0x02f072a4, 0x01f8067c, 0x02977a49, 0x034454a2, 0x0217acf4, 0x02705a68, 0x000f990e}}, Y: Field{[10]uint32{0x02fb0355, 0x03822df8, 0x02f11b0f, 0x0209c58b, 0x028b5e58, 0x01ddea65, 0x01d54d1d, 0x014d3b7a, 0x03045525, 0x000b7b29}}}, + {X: Field{[10]uint32{0x036c63c5, 0x0259bccd, 0x0082e4c0, 0x034ae1ea, 0x03caae45, 0x01bddb40, 0x015d200d, 0x02b01dfa, 0x0011fcc3, 0x0011137d}}, Y: Field{[10]uint32{0x0016cc23, 0x0142a955, 0x032bc643, 0x024eb1b8, 0x01ec520c, 0x00b7b3cf, 0x00d1a4df, 0x02592a9f, 0x0198643d, 0x002d1599}}}, + {X: Field{[10]uint32{0x006946a0, 0x01ea1e99, 0x01465bbb, 0x01aa1093, 0x0019cdaa, 0x029a0429, 0x00a7beb1, 0x00d7f8c5, 0x021f58be, 0x0004a8bd}}, Y: Field{[10]uint32{0x010ba47d, 0x0354d74a, 0x010698df, 0x00c6575e, 0x0248410b, 0x029a7ef2, 0x01539461, 0x03323fc6, 0x034494c2, 0x00269ef7}}}, + {X: Field{[10]uint32{0x0264cb9f, 0x00acadf8, 0x007933d5, 0x01ea4fd2, 0x02511b2b, 0x01a1ef48, 0x008af94b, 0x01cf1cf5, 0x02924625, 0x002f75c9}}, Y: Field{[10]uint32{0x02123874, 0x03037de8, 0x034ed955, 0x03df7103, 0x02858e6d, 0x03dd1a6a, 0x01ac9923, 0x03eac2f5, 0x004eb794, 0x00015b9b}}}, + {X: Field{[10]uint32{0x00066bdd, 0x01ff95a9, 0x003d60ec, 0x00a75f41, 0x03c974bd, 0x02936a7b, 0x034f156e, 0x03d5744a, 0x015877c3, 0x00386f55}}, Y: Field{[10]uint32{0x03233170, 0x02541d70, 0x0033ff5a, 0x006c7111, 0x03789cbf, 0x03168cbd, 0x002bea56, 0x010da88e, 0x0399fbe7, 0x00237366}}}, + {X: Field{[10]uint32{0x00132ad9, 0x00d47498, 0x0185d804, 0x02e2c1c6, 0x00fc064e, 0x01287d54, 0x0246609f, 0x020a52fa, 0x01e4781c, 0x0029f1a3}}, Y: Field{[10]uint32{0x01b42c32, 0x02218aeb, 0x00766842, 0x026fafe8, 0x026f6bbf, 0x0116626e, 0x022b240d, 0x03fad441, 0x00b63d9e, 0x0028209e}}}, + {X: Field{[10]uint32{0x029aa855, 0x00f1c34a, 0x0279a56b, 0x0198f632, 0x0205fa0d, 0x004df41e, 0x01eb90f5, 0x038da72f, 0x0369b4c6, 0x0013cea1}}, Y: Field{[10]uint32{0x026ea169, 0x01921bba, 0x0393e35b, 0x00b2d8af, 0x00b9d6db, 0x011c1d61, 0x00ed9f2c, 0x007854d2, 0x011c5f70, 0x0003db01}}}, + {X: Field{[10]uint32{0x0044f232, 0x018f77bd, 0x01a8d744, 0x01ff2d0d, 0x0036fd04, 0x0229aed6, 0x01cac66d, 0x03aff610, 0x001c8089, 0x0037aaaf}}, Y: Field{[10]uint32{0x0228e8a1, 0x0030a4f0, 0x014f90f5, 0x01258a9b, 0x00ccd14a, 0x03229b59, 0x026e6547, 0x01b9eaa0, 0x00ba49c2, 0x003edf31}}}, + {X: Field{[10]uint32{0x019c0695, 0x02e3e4cc, 0x023788b5, 0x02adf3f3, 0x02fd7f33, 0x03bcaccb, 0x0151e1f4, 0x006ce049, 0x0361547b, 0x0031046b}}, Y: Field{[10]uint32{0x018cb66b, 0x02efe215, 0x02ab4797, 0x013bd888, 0x02294ace, 0x03f3eedd, 0x0266d212, 0x03e0aba4, 0x03d73d50, 0x0034afb9}}}, + {X: Field{[10]uint32{0x009ec5e7, 0x002f7aa4, 0x01637821, 0x000742a2, 0x004a35f1, 0x02e77771, 0x00284945, 0x0376a343, 0x0294485b, 0x00343fda}}, Y: Field{[10]uint32{0x024f620f, 0x0087c88d, 0x02a65e21, 0x03fe0ea4, 0x00cb1910, 0x023e54f1, 0x02b7e83d, 0x02a3cb40, 0x00fd2923, 0x002acfd8}}}, + {X: Field{[10]uint32{0x0308c0f1, 0x00d6a9c7, 0x02424982, 0x01102cff, 0x01006f27, 0x016b5b2c, 0x011baea3, 0x03b648a1, 0x01cc9555, 0x00028341}}, Y: Field{[10]uint32{0x02339948, 0x0131f275, 0x037dc471, 0x02b4c601, 0x0150afe2, 0x0082c9c1, 0x017e67ca, 0x01629c2f, 0x01052371, 0x00210ec4}}}, + {X: Field{[10]uint32{0x023f5d32, 0x03964807, 0x039d0568, 0x010a24fe, 0x007d5996, 0x0364265e, 0x0083ef67, 0x017ee817, 0x0045eb29, 0x002fa821}}, Y: Field{[10]uint32{0x00ce10e3, 0x03cc8a9b, 0x01cc7908, 0x035af53d, 0x01e26594, 0x00744bb4, 0x00bb2bb4, 0x03d14f5e, 0x03ffb3f7, 0x000aa069}}}, + {X: Field{[10]uint32{0x02f0d5f0, 0x00b1f7b9, 0x02ce3e82, 0x026316b3, 0x00551c30, 0x01aae5c0, 0x035aea6f, 0x039a267a, 0x004c431b, 0x003a3af3}}, Y: Field{[10]uint32{0x01fa902e, 0x03428ecc, 0x0161e097, 0x0193aa83, 0x016d65db, 0x0268ab9e, 0x03d511f5, 0x0393d63e, 0x0061760a, 0x003be669}}}, + {X: Field{[10]uint32{0x026e8fd2, 0x00c2f3a5, 0x03cd1d96, 0x02d6161d, 0x020806ba, 0x01e5b62d, 0x031db77c, 0x037113b3, 0x006cdd73, 0x00125218}}, Y: Field{[10]uint32{0x02b95f80, 0x012e496f, 0x01123bc6, 0x03b7cf6e, 0x00cb8c13, 0x00e511aa, 0x01630aa6, 0x02319e10, 0x033f786c, 0x000f19cc}}}, + {X: Field{[10]uint32{0x02a778c2, 0x021e4ba7, 0x00a165c1, 0x02996d72, 0x00fb5a19, 0x019b3525, 0x03e40cca, 0x03bee938, 0x033240d9, 0x0013c966}}, Y: Field{[10]uint32{0x0117446d, 0x023aab93, 0x00efb1b6, 0x01fd1d23, 0x00b1590f, 0x027d3a8b, 0x02006054, 0x01a66712, 0x008778c2, 0x003f7620}}}, + {X: Field{[10]uint32{0x02dfcc29, 0x0143e91e, 0x03f337e3, 0x02379ea9, 0x031e7e91, 0x038463ba, 0x036e2b43, 0x01fd4bc9, 0x0093e14d, 0x003cc0e9}}, Y: Field{[10]uint32{0x01141b57, 0x006f52da, 0x00163cfa, 0x01df17f9, 0x01453f79, 0x029ab499, 0x01bc49da, 0x0394fd7d, 0x006d0bef, 0x003127e9}}}, + {X: Field{[10]uint32{0x01df595d, 0x02cbd4f0, 0x01a41ea4, 0x03f0a77d, 0x0158b9fd, 0x01029583, 0x0311859c, 0x02003b06, 0x0317f4c0, 0x00380312}}, Y: Field{[10]uint32{0x0363b99d, 0x007edd65, 0x032fb8c8, 0x000f4d20, 0x00a72a10, 0x02d33346, 0x00d0d957, 0x0134a746, 0x0266c3ec, 0x00189106}}}, + {X: Field{[10]uint32{0x0372ce70, 0x02c8c076, 0x011714cf, 0x03c88560, 0x03ca16be, 0x02dd52f9, 0x03603bd2, 0x02bd4a91, 0x00861af6, 0x001212e1}}, Y: Field{[10]uint32{0x0132fbc7, 0x01f9cb13, 0x02359d47, 0x0314231d, 0x01cf72e5, 0x028299d6, 0x02968652, 0x01e68ff9, 0x03f5a0ac, 0x000dbe13}}}, + {X: Field{[10]uint32{0x00d93f14, 0x0119ee13, 0x02dab210, 0x0338469e, 0x03ca07fe, 0x032f0526, 0x03e6a8a7, 0x007d1286, 0x00ead8b5, 0x00222f96}}, Y: Field{[10]uint32{0x02687fdc, 0x01baf2a4, 0x0067d4d4, 0x03d27c03, 0x018ebbeb, 0x001a5ec6, 0x00d6cd6a, 0x03ef05c7, 0x00af7037, 0x00253043}}}, + {X: Field{[10]uint32{0x03da781b, 0x037a5111, 0x03b77384, 0x0351f058, 0x037372a3, 0x0040466d, 0x0275e11b, 0x035fbd12, 0x02af9fdd, 0x002afdb3}}, Y: Field{[10]uint32{0x0395d290, 0x003b3319, 0x0259a796, 0x024a0712, 0x01417183, 0x026ed3bd, 0x01fe2f3b, 0x0319eba7, 0x030c6320, 0x00172b6c}}}, + {X: Field{[10]uint32{0x009d173a, 0x020e13ae, 0x03deb74f, 0x00365598, 0x014e221e, 0x01f1b0f3, 0x03cf10a1, 0x0196c99f, 0x01229ef6, 0x003a3099}}, Y: Field{[10]uint32{0x022aeeb3, 0x02b847f2, 0x00934035, 0x009a7f34, 0x02bec7ba, 0x00364591, 0x031965b3, 0x0143bf48, 0x03adf9b0, 0x00269a7e}}}, + {X: Field{[10]uint32{0x01c6c23e, 0x03e93ff6, 0x0358df60, 0x03aa47ff, 0x01e031f3, 0x021a0c55, 0x0270a24e, 0x03b2e579, 0x03d8bf72, 0x0019994a}}, Y: Field{[10]uint32{0x00be994e, 0x0168ea4c, 0x03b3b4b6, 0x00054b73, 0x0205fa69, 0x03d98c29, 0x002fbb66, 0x00adcc8b, 0x00083f18, 0x0012113b}}}, + {X: Field{[10]uint32{0x002c0964, 0x0094b753, 0x02f0badf, 0x01054caa, 0x0075cac8, 0x016fdb56, 0x00202c44, 0x00410372, 0x00c2d842, 0x00081e20}}, Y: Field{[10]uint32{0x01860cfd, 0x01b47c30, 0x01c54e91, 0x024c203f, 0x010a562d, 0x0324a9ec, 0x00ef3167, 0x013786b9, 0x01d73eb2, 0x000ac606}}}, + {X: Field{[10]uint32{0x0013f581, 0x03f65648, 0x030cc763, 0x00b1f649, 0x007e8f26, 0x03437fda, 0x0133485e, 0x01a4bbb2, 0x01e453d0, 0x0011ae6f}}, Y: Field{[10]uint32{0x014f9bf7, 0x02af4b28, 0x022256ec, 0x021a7cbf, 0x01394cc7, 0x00216df5, 0x019b0d63, 0x026703d2, 0x03e63ae5, 0x00162be6}}}, + {X: Field{[10]uint32{0x01ea3e11, 0x00759e5d, 0x0278b82b, 0x015758a6, 0x02a2fa25, 0x00a6bcea, 0x0356e2f0, 0x03974025, 0x0174dbeb, 0x001766c9}}, Y: Field{[10]uint32{0x02e59263, 0x01ed9143, 0x030f02b8, 0x02405963, 0x03f3a641, 0x018a5d63, 0x023dd507, 0x031a3f3b, 0x00acaa6a, 0x003b67d0}}}, + {X: Field{[10]uint32{0x02590e4f, 0x01b05c9b, 0x02c52d08, 0x035ddf3f, 0x03dc598f, 0x01dd0ce2, 0x036a6491, 0x01909669, 0x01828b98, 0x003b2d6b}}, Y: Field{[10]uint32{0x01887886, 0x02637cb2, 0x034e301d, 0x029f3312, 0x0365d33e, 0x00be084b, 0x014b5bf5, 0x0361faa5, 0x013673c6, 0x0000ade2}}}, + {X: Field{[10]uint32{0x0124ea67, 0x03294c8e, 0x0296e8f3, 0x0267f243, 0x00ddd62e, 0x00037957, 0x01747250, 0x006e2874, 0x00c15e71, 0x002ccad9}}, Y: Field{[10]uint32{0x02ac2083, 0x02c30929, 0x016a5403, 0x013783f8, 0x024d81b8, 0x01f92f86, 0x027a94de, 0x02b7c8d2, 0x01d36dce, 0x002bd758}}}, + {X: Field{[10]uint32{0x020cd364, 0x0023f160, 0x034ab1c3, 0x010aa002, 0x008b7f68, 0x033daacf, 0x0157aa15, 0x008cd29b, 0x031b7158, 0x00144dfd}}, Y: Field{[10]uint32{0x01f1eab4, 0x0194a913, 0x00381efa, 0x00e25596, 0x010e4a3b, 0x025d5dc4, 0x02a248d4, 0x01f6ac31, 0x03ecc9b1, 0x003dfa97}}}, + {X: Field{[10]uint32{0x029ea866, 0x0158a5f3, 0x01539e7c, 0x01958c58, 0x0025f94e, 0x00070fd7, 0x0113a898, 0x016224f8, 0x021a390b, 0x002e6ec3}}, Y: Field{[10]uint32{0x00324a11, 0x01a547c2, 0x0080e6b6, 0x02a094e6, 0x01247f60, 0x0207938c, 0x00e14ece, 0x00d7eeb9, 0x00903c3d, 0x003636cf}}}, + {X: Field{[10]uint32{0x024fe9af, 0x03ad1a24, 0x027d317b, 0x024bb060, 0x0388cc11, 0x0310bd1e, 0x0291c211, 0x003b0811, 0x01676da4, 0x000fc246}}, Y: Field{[10]uint32{0x02bb8de9, 0x0177d705, 0x01395877, 0x02f74ff3, 0x00ba4c04, 0x00e341c9, 0x02e6a812, 0x00b07c62, 0x00263e88, 0x003c6d12}}}, + {X: Field{[10]uint32{0x0093b4fe, 0x016b2236, 0x00ed80d5, 0x011f5897, 0x003767da, 0x01c286cb, 0x015e7afc, 0x01803a35, 0x01f1dad4, 0x002d7e89}}, Y: Field{[10]uint32{0x02d22347, 0x024e6ca2, 0x0270e1d6, 0x000ee85e, 0x0183e495, 0x02927426, 0x013a1908, 0x00a5b1fb, 0x0261f2ba, 0x001d5d7d}}}, + {X: Field{[10]uint32{0x000d17b0, 0x031bdf5a, 0x000183d4, 0x03a9ac73, 0x01e4ca06, 0x000dcc1a, 0x01b797e9, 0x00096de3, 0x00e2dc6a, 0x00280dc7}}, Y: Field{[10]uint32{0x0059919d, 0x01f10cba, 0x036bc693, 0x01d1712b, 0x0024f0ff, 0x01666ddd, 0x011c5214, 0x00173ba1, 0x00a89a50, 0x0024ad6a}}}, + {X: Field{[10]uint32{0x02e2f210, 0x02650a87, 0x02c8c7b1, 0x00a36896, 0x00cd0a98, 0x01f50808, 0x0063967d, 0x02441de2, 0x029000a4, 0x0016ab9b}}, Y: Field{[10]uint32{0x03ee8fd7, 0x00393ded, 0x03957576, 0x031335e0, 0x017e82fd, 0x01e7b0e6, 0x03218f7b, 0x013cfff5, 0x002082a5, 0x0003b673}}}, + {X: Field{[10]uint32{0x020841a0, 0x034a8a06, 0x03b053fe, 0x02cb9b39, 0x0164efdd, 0x01437ad9, 0x000f9648, 0x02dbd2c4, 0x02ecf4a9, 0x001539f6}}, Y: Field{[10]uint32{0x03c9c63d, 0x00f7b2a5, 0x03daecc8, 0x0215c250, 0x0270d467, 0x022cd365, 0x02857ad0, 0x00ea0756, 0x032a5477, 0x00366b68}}}, + {X: Field{[10]uint32{0x03bf44e8, 0x01153223, 0x00d7abdb, 0x0148e47b, 0x00383ed7, 0x01d926e1, 0x00d8be0c, 0x03bd1ad2, 0x0110d8bc, 0x003a6ca6}}, Y: Field{[10]uint32{0x021d6b69, 0x031c0f09, 0x033deb84, 0x024a6a37, 0x03d7a267, 0x00393102, 0x01739655, 0x03a47e94, 0x0094f669, 0x003ac9a0}}}, + {X: Field{[10]uint32{0x02546a97, 0x0385de76, 0x00ef6384, 0x00727f85, 0x013f537a, 0x01df4767, 0x037c5895, 0x02944c65, 0x0222f254, 0x0010fe54}}, Y: Field{[10]uint32{0x01cb18cc, 0x03b3ad5c, 0x035e14b0, 0x02ce5ecf, 0x030eef80, 0x0198a8b7, 0x005b305b, 0x01711fc9, 0x02534334, 0x0035f4f1}}}, + {X: Field{[10]uint32{0x02c3b103, 0x004a52e9, 0x00b1dcc9, 0x01701c89, 0x01672338, 0x005ab921, 0x00bc0902, 0x03ee4a0c, 0x03d53999, 0x0027ed17}}, Y: Field{[10]uint32{0x02bdf451, 0x03deb27f, 0x0213a277, 0x001ae09c, 0x036731b5, 0x0269252e, 0x017bf7f3, 0x020b4e43, 0x001bdbfd, 0x0016d1c2}}}, + {X: Field{[10]uint32{0x031dcce9, 0x032092ed, 0x007f23cb, 0x003882b6, 0x0109ca84, 0x03ad19bd, 0x015919b2, 0x00a734ca, 0x002b8355, 0x0037648a}}, Y: Field{[10]uint32{0x03726371, 0x02a78717, 0x03b7ad58, 0x01a0ed63, 0x01f37962, 0x00788ef3, 0x02f4a29d, 0x0359a2c7, 0x02e7bc59, 0x003b117d}}}, + {X: Field{[10]uint32{0x0016348d, 0x030176b7, 0x01c38686, 0x01bf06b5, 0x01fe2903, 0x00f788f1, 0x019def4f, 0x02f75efe, 0x0012009f, 0x001d20bc}}, Y: Field{[10]uint32{0x0040abd1, 0x0198e9ae, 0x025f8db1, 0x02eb0939, 0x0173fc0d, 0x0196eb44, 0x02b2a20b, 0x03dbc2fc, 0x020d5497, 0x00290f12}}}, + {X: Field{[10]uint32{0x00ebd9a5, 0x029a1a5c, 0x02377a69, 0x00c3dea6, 0x01537fca, 0x016c0c65, 0x012f587a, 0x0189e077, 0x019597fd, 0x003e933f}}, Y: Field{[10]uint32{0x03ae823a, 0x03af8771, 0x0105c1b8, 0x00c428c1, 0x01e2a350, 0x03862a3f, 0x031d269b, 0x03dde2f4, 0x02c99ddb, 0x00115a2d}}}, + {X: Field{[10]uint32{0x03a60b9e, 0x01f4440f, 0x00c53d9b, 0x034c9e51, 0x022f1078, 0x03c7ffaf, 0x0105e1b4, 0x00fa3a06, 0x03dae776, 0x00147834}}, Y: Field{[10]uint32{0x02da6740, 0x00bfca8d, 0x033f7bfa, 0x02948e57, 0x001da673, 0x008423b4, 0x01f20b90, 0x00beb33e, 0x00c4ab57, 0x00046368}}}, + {X: Field{[10]uint32{0x01bc9530, 0x00a99a03, 0x03f86c48, 0x01d3d03a, 0x00502fc6, 0x0227a5bd, 0x003b8572, 0x008cd4e3, 0x027cc055, 0x001f6395}}, Y: Field{[10]uint32{0x02b37571, 0x030ba9a3, 0x00ad7600, 0x00716172, 0x00748458, 0x02a2c985, 0x01fe552b, 0x0111a92e, 0x004600c6, 0x001db0ff}}}, + {X: Field{[10]uint32{0x011dfb1f, 0x00ae52b3, 0x000ed8d1, 0x019e7bd3, 0x011c316d, 0x03e8631e, 0x01f216fd, 0x0065bf74, 0x02d3b400, 0x00364931}}, Y: Field{[10]uint32{0x03ebcea8, 0x00aaa013, 0x012e59d8, 0x00649b1a, 0x0290b9d1, 0x023766e4, 0x01eb3f28, 0x0012e2c4, 0x00ee881c, 0x0003b0cf}}}, + {X: Field{[10]uint32{0x0293c0db, 0x01d115d7, 0x03b8f330, 0x006afe54, 0x033965cb, 0x02a6760a, 0x00d28b97, 0x00a72346, 0x030b06f6, 0x002372cc}}, Y: Field{[10]uint32{0x006857a3, 0x01d3cde9, 0x0097ab6d, 0x0103dbdf, 0x00b58b73, 0x004fe06a, 0x0129b573, 0x0240b46c, 0x01198323, 0x000f628b}}}, + {X: Field{[10]uint32{0x02a5d2b5, 0x01d27daf, 0x02e80d3f, 0x0074d68c, 0x0157910f, 0x036bad9c, 0x0386797d, 0x018de233, 0x023b94b0, 0x00374712}}, Y: Field{[10]uint32{0x03230777, 0x026fb7ac, 0x0064c086, 0x02f1cf5f, 0x003d2afe, 0x02de32de, 0x03e5be9a, 0x0160f590, 0x00c75a69, 0x003befb0}}}, + {X: Field{[10]uint32{0x03f5e772, 0x022a214d, 0x02dab765, 0x03caf1d8, 0x01ec0275, 0x0134a4b0, 0x01f6ec48, 0x035fdce5, 0x02341dfa, 0x000ac0f7}}, Y: Field{[10]uint32{0x03c0d0e3, 0x019a9db0, 0x03bdf971, 0x0346b926, 0x020803d7, 0x027de397, 0x03d48bb4, 0x0160b156, 0x00fb3818, 0x000c8d7a}}}, + {X: Field{[10]uint32{0x0028dde2, 0x01e320c5, 0x03f39479, 0x02f530f9, 0x02677f06, 0x01addc4c, 0x03a80efa, 0x016f25f9, 0x030fba14, 0x000e9e56}}, Y: Field{[10]uint32{0x00914691, 0x037d5e51, 0x0352b526, 0x013a8fc4, 0x0081af64, 0x03b502bb, 0x00bc9e1e, 0x022898df, 0x039ddf03, 0x003d0496}}}, + {X: Field{[10]uint32{0x004fcbbf, 0x0301621a, 0x01e59ef8, 0x0085e234, 0x03121f5c, 0x002a1476, 0x006c081b, 0x035b2e71, 0x013ba133, 0x0003b3e0}}, Y: Field{[10]uint32{0x03e53560, 0x035dce04, 0x020930ec, 0x0057af84, 0x02597e39, 0x02254a70, 0x02becd07, 0x02d1cdfc, 0x02f2a7b7, 0x001a7836}}}, + {X: Field{[10]uint32{0x02217d5a, 0x01a461b5, 0x00c33576, 0x01154da3, 0x03743832, 0x0138274f, 0x037191dd, 0x018f9040, 0x0182c141, 0x0018df12}}, Y: Field{[10]uint32{0x02ecb410, 0x03695cf7, 0x00b77a74, 0x011d6b19, 0x00f6fb37, 0x028de0c6, 0x03aaa5c0, 0x034b8c96, 0x02b8fd83, 0x0036968a}}}, + {X: Field{[10]uint32{0x01b90e87, 0x022cf8dc, 0x037c6b19, 0x01604947, 0x00542556, 0x0014c368, 0x03f5fac2, 0x016d5f73, 0x03a2d887, 0x00067f9c}}, Y: Field{[10]uint32{0x00151ca0, 0x027de836, 0x01ad35a3, 0x0204a3f0, 0x01a32646, 0x03f97a2e, 0x027a77a1, 0x0094630d, 0x00182ccc, 0x000ec0eb}}}, + {X: Field{[10]uint32{0x03b7ebb2, 0x0156dfce, 0x0023471d, 0x02f7c513, 0x00c68b4c, 0x02d9a02c, 0x01151b30, 0x03700027, 0x022a0d4c, 0x00005ba9}}, Y: Field{[10]uint32{0x013fa629, 0x03f3a779, 0x01f6a8ff, 0x0180b8ee, 0x0135f020, 0x02566030, 0x00612a89, 0x00b964ce, 0x021c5367, 0x00232b12}}}, + {X: Field{[10]uint32{0x02a40970, 0x00d4e508, 0x012e849f, 0x0217efd4, 0x00e1eed4, 0x01e7e68a, 0x00e54132, 0x01b4859e, 0x00b5454c, 0x001ae75a}}, Y: Field{[10]uint32{0x02365482, 0x02c6c9eb, 0x01472fa4, 0x01952c17, 0x03907f85, 0x02a223ad, 0x01e6969d, 0x038df6be, 0x004498eb, 0x002d8fd4}}}, + {X: Field{[10]uint32{0x035ed3e6, 0x037449c2, 0x01d05868, 0x01f48c59, 0x0232c3c2, 0x03edfb24, 0x03dc948a, 0x0204b0b9, 0x008c08f0, 0x0007e883}}, Y: Field{[10]uint32{0x01838076, 0x0137ad8a, 0x020cfed8, 0x015ca029, 0x026cd168, 0x0308a7fa, 0x03686062, 0x00d909f7, 0x034d8213, 0x0031495f}}}, + {X: Field{[10]uint32{0x036acc86, 0x0229a86f, 0x02263e8e, 0x00e2f941, 0x02af15bb, 0x00763d4d, 0x031df6b3, 0x02d37873, 0x00927dae, 0x001cea0f}}, Y: Field{[10]uint32{0x02eb8adc, 0x01eb5aa0, 0x000ab2fb, 0x02af937d, 0x0126a21d, 0x02326e24, 0x034e24de, 0x030c2e0a, 0x03e40cd6, 0x002822b2}}}, + {X: Field{[10]uint32{0x0188bdbe, 0x01d87b9d, 0x015a48e1, 0x033bf4a9, 0x0285ba90, 0x03389978, 0x0278cf93, 0x00b7bb28, 0x0264924e, 0x000ea655}}, Y: Field{[10]uint32{0x00cbbb0e, 0x02351711, 0x00f39dd4, 0x02f40edf, 0x02d011a1, 0x0072bc63, 0x0065d939, 0x00cf4d49, 0x02dc99eb, 0x003cc886}}}, + {X: Field{[10]uint32{0x01429c26, 0x01fc9a4f, 0x005965e0, 0x03ead3e2, 0x025ca516, 0x030583a1, 0x005cd9b9, 0x03d73075, 0x0219b032, 0x001f197b}}, Y: Field{[10]uint32{0x023704c5, 0x015ca900, 0x02287ff9, 0x0178dd0f, 0x018cc54a, 0x02f88893, 0x01076ae4, 0x03c9df4c, 0x02f90e3d, 0x0011f1fe}}}, + {X: Field{[10]uint32{0x00d397dc, 0x0002c8b9, 0x00fb03dc, 0x0365976e, 0x032f05e6, 0x0332e340, 0x0153118d, 0x036ef6f6, 0x014c6750, 0x0030041a}}, Y: Field{[10]uint32{0x008e730c, 0x020ee01b, 0x01be2395, 0x00054b50, 0x025a5e61, 0x0065bc4c, 0x01fde10a, 0x01510567, 0x00c6dd6c, 0x000ed245}}}, + {X: Field{[10]uint32{0x02519d57, 0x005f3d98, 0x03ae75e3, 0x00b29c8f, 0x01a33dcb, 0x0084d84c, 0x015a12b9, 0x022db5be, 0x008ed28d, 0x00389561}}, Y: Field{[10]uint32{0x03cfb7b6, 0x0364990f, 0x02fe4d36, 0x03007841, 0x00377c9a, 0x02060ec9, 0x0207dcd1, 0x036b5e60, 0x01aa1757, 0x0018bdf5}}}, + {X: Field{[10]uint32{0x00236ed9, 0x0295b40b, 0x03c45bd1, 0x029ddbbf, 0x01a9669d, 0x00778c34, 0x0078dfbf, 0x00a648ea, 0x00e57323, 0x003cc506}}, Y: Field{[10]uint32{0x0256b84c, 0x008d2e2b, 0x01552af7, 0x03d87e22, 0x0316a1ef, 0x00c2d6bb, 0x0234c8a6, 0x03651957, 0x0084dce0, 0x00398aae}}}, + {X: Field{[10]uint32{0x01703181, 0x004b0aef, 0x03770615, 0x026ba319, 0x021f3f3c, 0x01f079aa, 0x01c290d4, 0x00c4eeb2, 0x0145b876, 0x00026b6e}}, Y: Field{[10]uint32{0x030908fd, 0x01d347a7, 0x00f8650f, 0x003b7c3c, 0x0251531d, 0x03777cac, 0x020b82be, 0x00985920, 0x0142b463, 0x002c87f0}}}, + {X: Field{[10]uint32{0x008da322, 0x01b0f160, 0x03f36172, 0x01182e0e, 0x03ca04b8, 0x00d6ce42, 0x01132e9b, 0x018e8615, 0x032b9d4a, 0x00311a0a}}, Y: Field{[10]uint32{0x035f6972, 0x02d740f4, 0x025a26ee, 0x016a0d73, 0x0014e907, 0x00f8dbc1, 0x02597622, 0x02e8c86d, 0x006a7100, 0x003c96a4}}}, + {X: Field{[10]uint32{0x0280d63a, 0x028419ba, 0x0003da99, 0x03ceb810, 0x02559159, 0x025f1d97, 0x027c4055, 0x02711e05, 0x016d60f4, 0x003aec3f}}, Y: Field{[10]uint32{0x02a0b0f7, 0x0321a39a, 0x00350afd, 0x019dc1bd, 0x00c4202f, 0x022d0c72, 0x022ffcf2, 0x03218876, 0x0160667a, 0x003acdf4}}}, + {X: Field{[10]uint32{0x01a5597a, 0x006f2f02, 0x0334e355, 0x026257d5, 0x0165ffb0, 0x03fd8dfc, 0x0267cbbb, 0x02f2d000, 0x012070d8, 0x001e3c4b}}, Y: Field{[10]uint32{0x03bb78f8, 0x005c240a, 0x037407de, 0x038ce65c, 0x037419a3, 0x021f6672, 0x03574d2c, 0x005d586e, 0x02b33662, 0x0010a5da}}}, + {X: Field{[10]uint32{0x01919f69, 0x022befa1, 0x01eee579, 0x02ef9d9e, 0x0235ae41, 0x02525886, 0x039fbc2b, 0x012d8e60, 0x004af621, 0x0000f7ff}}, Y: Field{[10]uint32{0x03f2c456, 0x03fab615, 0x020e9036, 0x03fa40a1, 0x02a13480, 0x02765d40, 0x01d15a42, 0x0086b88b, 0x036b1b40, 0x001605d2}}}, + {X: Field{[10]uint32{0x015a15cc, 0x0175d16d, 0x028bf55d, 0x0034c914, 0x00bd16bf, 0x036ddbae, 0x015198f4, 0x010b2884, 0x0393a4ed, 0x00104324}}, Y: Field{[10]uint32{0x02d58306, 0x03ea8297, 0x003d7059, 0x0069cc7f, 0x0283c298, 0x0328945d, 0x00c2cf9b, 0x02e26f05, 0x00b1df71, 0x001013fd}}}, + {X: Field{[10]uint32{0x024e3649, 0x01b1256f, 0x031966c1, 0x01a599e5, 0x00b93e65, 0x03f9a5df, 0x03366326, 0x02c1e4f7, 0x015687d6, 0x001ad354}}, Y: Field{[10]uint32{0x0169f4e3, 0x0304697a, 0x01c815d6, 0x002a5544, 0x001a2556, 0x036c5d83, 0x02a03152, 0x0081fd74, 0x0094bbac, 0x00191e92}}}, + {X: Field{[10]uint32{0x01f34247, 0x01c716e9, 0x01fd94a7, 0x0091af93, 0x016f0d87, 0x00017670, 0x03ccfd85, 0x01661bc2, 0x017ae87d, 0x00163feb}}, Y: Field{[10]uint32{0x00069817, 0x0173c03c, 0x02ce5e50, 0x01afb8da, 0x03b33fba, 0x03218a70, 0x00d6f93e, 0x0057ebd4, 0x02d8f9ab, 0x002b62de}}}, + {X: Field{[10]uint32{0x02a757fd, 0x003ab3e9, 0x02c72b31, 0x01a5ca24, 0x00adb956, 0x00fa20ed, 0x03277382, 0x03eb782b, 0x001d1835, 0x0039b4f9}}, Y: Field{[10]uint32{0x01359c15, 0x0283bc08, 0x02e61045, 0x02aed09e, 0x03d6395c, 0x036f6e3b, 0x0303e425, 0x03b39f3b, 0x008cb580, 0x00284db2}}}, + {X: Field{[10]uint32{0x01953b35, 0x02ba51c3, 0x032a5573, 0x010828b4, 0x023b561b, 0x006f0409, 0x01044792, 0x0280c2b0, 0x022b43aa, 0x003f11f1}}, Y: Field{[10]uint32{0x006224f0, 0x00c18009, 0x03b29502, 0x00982ce4, 0x01627236, 0x00287d44, 0x02b58104, 0x01e019cc, 0x011d65fc, 0x00174c63}}}, + {X: Field{[10]uint32{0x03db251b, 0x02b2df1b, 0x031ca36b, 0x028a4cf2, 0x02d0a1b8, 0x00d54e19, 0x0278da90, 0x00deec23, 0x0067cbcb, 0x0033ab8a}}, Y: Field{[10]uint32{0x02bb3dfd, 0x00b47742, 0x00c16d4c, 0x00a4e862, 0x03956cc6, 0x010dc9ed, 0x0017b373, 0x02aa55e5, 0x007ec163, 0x00122fcb}}}, + {X: Field{[10]uint32{0x03efeab0, 0x02090f86, 0x02d78daa, 0x01d3225c, 0x039195fb, 0x0145b621, 0x03408d82, 0x00d6d708, 0x0378c847, 0x002aec48}}, Y: Field{[10]uint32{0x0366698e, 0x01646ccf, 0x01a02abb, 0x00d99c10, 0x01ce901c, 0x032295b6, 0x010be913, 0x02919767, 0x024b0da5, 0x001682fd}}}, + {X: Field{[10]uint32{0x0159eeaf, 0x03a9c00c, 0x0024f274, 0x03a50e92, 0x021a576c, 0x038458c5, 0x005302b0, 0x031f2486, 0x02398330, 0x0035de07}}, Y: Field{[10]uint32{0x0106651a, 0x01192bc3, 0x03310fbb, 0x02665bdb, 0x01261aed, 0x006f8f5f, 0x027398dd, 0x03171cfb, 0x00324e07, 0x0018d069}}}, + {X: Field{[10]uint32{0x024c760c, 0x02dda11f, 0x01a6dbe5, 0x00cf7f50, 0x016f3ad1, 0x00a8877c, 0x0171646d, 0x008115cb, 0x01cd46ec, 0x0029a463}}, Y: Field{[10]uint32{0x0132fa9c, 0x015b9f42, 0x034e51f0, 0x03ecbd98, 0x001d6c7c, 0x01484e5f, 0x030e4b53, 0x01263669, 0x02ba378d, 0x00303946}}}, + {X: Field{[10]uint32{0x03d1a204, 0x001132a0, 0x027706ef, 0x03809234, 0x027785e2, 0x017f65c1, 0x02b340a6, 0x037980e4, 0x02e4fbb5, 0x00104e93}}, Y: Field{[10]uint32{0x023dd197, 0x03c5cbe2, 0x027c343a, 0x01d1476c, 0x016595a6, 0x006c23f4, 0x02bc668d, 0x023cd0ef, 0x0106c18a, 0x00280d89}}}, + {X: Field{[10]uint32{0x0204001c, 0x00560717, 0x011a8968, 0x01988dcc, 0x0287fd87, 0x03ef4449, 0x004aa082, 0x002483db, 0x0024de8b, 0x003869ef}}, Y: Field{[10]uint32{0x026bed16, 0x02ac4006, 0x0249b29b, 0x02c7bea3, 0x013a3d90, 0x00695719, 0x01aeea26, 0x021cf452, 0x01fdd0a2, 0x000f8eea}}}, + {X: Field{[10]uint32{0x01333a75, 0x0283f0f7, 0x0142d8a9, 0x026c5e56, 0x01ab1dde, 0x028cdf81, 0x02e077f8, 0x033312d6, 0x02a0a147, 0x003fe4a4}}, Y: Field{[10]uint32{0x0223a166, 0x03d6de1e, 0x007a43b6, 0x00ae0c17, 0x02b555ea, 0x016b577f, 0x014b4122, 0x00d18dd9, 0x027c5f7a, 0x003943c0}}}, + {X: Field{[10]uint32{0x00cb9c0c, 0x000e7513, 0x0140d900, 0x03186600, 0x03afe849, 0x001170b4, 0x007a36b0, 0x02774e77, 0x0223437c, 0x003ab959}}, Y: Field{[10]uint32{0x0132e043, 0x01a25d37, 0x037be39f, 0x0100dcb5, 0x0055e62e, 0x00bf9f9e, 0x02b5a9b2, 0x01d0db72, 0x01e99284, 0x003c6e32}}}, + {X: Field{[10]uint32{0x00bd5282, 0x000b2d55, 0x012273d0, 0x0012f322, 0x017f9c60, 0x01230e79, 0x02da0f30, 0x028f7f87, 0x00be3467, 0x001f7483}}, Y: Field{[10]uint32{0x001485d0, 0x01a9a25f, 0x014c64eb, 0x020a377f, 0x02ee9225, 0x005dca91, 0x034c3f83, 0x034b5533, 0x0323f035, 0x003b134b}}}, + {X: Field{[10]uint32{0x02a877eb, 0x00b68fc4, 0x03fc73a0, 0x03af6c36, 0x03e4e245, 0x00ef68f0, 0x03b88703, 0x004a4551, 0x01cc5acf, 0x000d6604}}, Y: Field{[10]uint32{0x0108a792, 0x02b3663a, 0x03a59bb6, 0x02f8ada0, 0x037702d1, 0x00470e89, 0x03f916f5, 0x028f781b, 0x00878b97, 0x003b4bd4}}}, + {X: Field{[10]uint32{0x01a71c24, 0x00440b92, 0x005a2c03, 0x03282f18, 0x035a6c76, 0x00689346, 0x02d57ea0, 0x0329393a, 0x009cf2bc, 0x003eccfa}}, Y: Field{[10]uint32{0x031c9f45, 0x00a1874b, 0x0180e019, 0x010309ba, 0x03d7fca9, 0x00aa49cb, 0x035b9584, 0x009c15ea, 0x02f5ca60, 0x0031d780}}}, + {X: Field{[10]uint32{0x01f687aa, 0x03aed5b9, 0x036069d1, 0x003bca4e, 0x01b7b297, 0x0016944a, 0x034f836b, 0x01d28054, 0x033e5eed, 0x00028734}}, Y: Field{[10]uint32{0x02c4a6b0, 0x01e34207, 0x01abcc99, 0x01ea25a8, 0x01bdefc3, 0x0390e03a, 0x02b60cc1, 0x030d14ec, 0x02b90ccf, 0x003e4346}}}, + {X: Field{[10]uint32{0x00213614, 0x014d4131, 0x00999b85, 0x027876cc, 0x025d9f16, 0x03b62b24, 0x03383cfc, 0x00edeafe, 0x02b90364, 0x001185a5}}, Y: Field{[10]uint32{0x0033bc72, 0x0035668c, 0x018d60de, 0x0339a566, 0x03ee91c4, 0x02bafff4, 0x0340a859, 0x003e8323, 0x00775f30, 0x0019d3d7}}}, + {X: Field{[10]uint32{0x014ab025, 0x00356f78, 0x01727f39, 0x03c89d1c, 0x021fd5cd, 0x00fdfa2a, 0x00885ae9, 0x027daf33, 0x02221b58, 0x001b1aaa}}, Y: Field{[10]uint32{0x02077538, 0x034b2eea, 0x0015c9f8, 0x005e2329, 0x02aeb844, 0x02d43e9d, 0x0164483f, 0x02e4346b, 0x020340e1, 0x0029df17}}}, + {X: Field{[10]uint32{0x0261c38b, 0x013f35d3, 0x00268387, 0x0069cab3, 0x01792eff, 0x039ca79b, 0x032c7ee6, 0x00cc4340, 0x0391927f, 0x00324634}}, Y: Field{[10]uint32{0x000dfb5b, 0x010f201e, 0x03965742, 0x01c9b89f, 0x00fce24a, 0x016db2d6, 0x021bed0e, 0x0123e3b6, 0x006c3460, 0x00163f5d}}}, + {X: Field{[10]uint32{0x01ea5918, 0x03b1625b, 0x022c2142, 0x03c0cfef, 0x019240c3, 0x004f1253, 0x02c26542, 0x028fd792, 0x02161ca0, 0x001219e7}}, Y: Field{[10]uint32{0x021d1a41, 0x0347c78f, 0x004a9a30, 0x039e73c8, 0x03b2a19f, 0x019e1038, 0x03a29667, 0x02bf8fa4, 0x03fe300c, 0x00155be4}}}, + {X: Field{[10]uint32{0x02e7b858, 0x01a28c31, 0x02584699, 0x0166b11a, 0x025e9456, 0x02ab0216, 0x02d6eede, 0x0191029c, 0x01a9e46b, 0x0031a301}}, Y: Field{[10]uint32{0x01de450d, 0x00991805, 0x032b61b1, 0x01a934af, 0x03c76874, 0x000da845, 0x03d64a1d, 0x03fe02f8, 0x01dc35d4, 0x002e2d2d}}}, + {X: Field{[10]uint32{0x01444e6a, 0x00e1d5e7, 0x02dc9f05, 0x038dbcc9, 0x0121e3df, 0x01b151a6, 0x0176dc4b, 0x01227e3e, 0x03106358, 0x00344cfb}}, Y: Field{[10]uint32{0x02f968cb, 0x00f140ae, 0x005becbf, 0x03af8cad, 0x02327ec3, 0x03f59a9b, 0x02b0f57a, 0x0034b09c, 0x03c4db69, 0x000b19aa}}}, + {X: Field{[10]uint32{0x01f976ae, 0x02b416cf, 0x0119392d, 0x01828807, 0x0261ca0a, 0x0229f8b6, 0x00766dc4, 0x0277aac4, 0x03598d75, 0x0014d513}}, Y: Field{[10]uint32{0x0069cd47, 0x010aff8a, 0x017e879a, 0x00454df8, 0x030993d7, 0x028666b5, 0x004e3f03, 0x01ebbc08, 0x005e61cb, 0x00112688}}}, + {X: Field{[10]uint32{0x03b8b331, 0x00d2b2e0, 0x00a622fe, 0x0177b8dd, 0x009254c6, 0x012dadf0, 0x02263851, 0x0144cce7, 0x00740fda, 0x000c4228}}, Y: Field{[10]uint32{0x028b6243, 0x00c04c89, 0x0115b5d9, 0x0347d678, 0x00d6fc05, 0x030bc891, 0x01a473da, 0x00ffaa2c, 0x010d5426, 0x0010bb72}}}, + {X: Field{[10]uint32{0x00b4b23c, 0x0336329f, 0x03962154, 0x0301ac8b, 0x012ee58a, 0x03ad5618, 0x0295099a, 0x00701367, 0x000d052c, 0x000599b1}}, Y: Field{[10]uint32{0x03a82fb9, 0x01112c64, 0x0284fb6c, 0x011f4807, 0x00abafc2, 0x001d4a55, 0x0355923e, 0x0198e2aa, 0x0341ae04, 0x0014196e}}}, + {X: Field{[10]uint32{0x0247722e, 0x01c915fb, 0x02ad53a5, 0x0242ef57, 0x02ed80fa, 0x01dacb60, 0x001290df, 0x039aa3c0, 0x03ebd3ee, 0x00325b41}}, Y: Field{[10]uint32{0x0220baf3, 0x0370b31f, 0x032c8d00, 0x0391e290, 0x0113ba06, 0x0262dd27, 0x0016af17, 0x02dfa68d, 0x0004447f, 0x0034f5a7}}}, + {X: Field{[10]uint32{0x0181b49d, 0x02136447, 0x03479fce, 0x02f5ecb0, 0x00647fa7, 0x0339d50b, 0x0369a9e8, 0x016c15e1, 0x0039b11b, 0x0002a7ff}}, Y: Field{[10]uint32{0x00bcbee7, 0x0348489a, 0x03747375, 0x0124e394, 0x0280a644, 0x016101c4, 0x00894dc2, 0x00a3dfa6, 0x024882e9, 0x002fb084}}}, + {X: Field{[10]uint32{0x03af0632, 0x0317eefd, 0x00f2737f, 0x01fc6980, 0x03e82578, 0x024c83f4, 0x015d3f52, 0x024e0239, 0x028ccd4c, 0x0014b284}}, Y: Field{[10]uint32{0x0135f7c4, 0x010b378c, 0x02ec370f, 0x024e0d9d, 0x0137ffa4, 0x03676fee, 0x02bab014, 0x0232ded3, 0x028095a9, 0x00211ba2}}}, + {X: Field{[10]uint32{0x01407c20, 0x03e8d3aa, 0x039ae8e0, 0x00948ca6, 0x00006985, 0x0127df25, 0x00abc41e, 0x02649dee, 0x02c177fd, 0x003fe4aa}}, Y: Field{[10]uint32{0x03fdcfb5, 0x01e7d163, 0x03331a33, 0x024d0a91, 0x03dafd9a, 0x01c8c0dc, 0x03bf2a9b, 0x0149cfae, 0x00dd5aaf, 0x002bc363}}}, + {X: Field{[10]uint32{0x03991e0c, 0x007406c9, 0x03f09a54, 0x02c75ca7, 0x025fb653, 0x005340be, 0x0163c973, 0x0028f0e0, 0x033ed3c1, 0x0029a4a9}}, Y: Field{[10]uint32{0x0068b905, 0x026f9a79, 0x03809cff, 0x0126694d, 0x02aa05c9, 0x02e09056, 0x0063d006, 0x034fa036, 0x015a3e5b, 0x0001c8bd}}}, + {X: Field{[10]uint32{0x0120aefd, 0x031ffb50, 0x024e2e2f, 0x0298c573, 0x006b813b, 0x03263520, 0x02fc4cd2, 0x026a4f8c, 0x003f7a62, 0x00367967}}, Y: Field{[10]uint32{0x030214bb, 0x023853eb, 0x00d30eb0, 0x00e44eaa, 0x013234be, 0x002691ff, 0x01bf6589, 0x00c4653d, 0x01942307, 0x00093389}}}, + {X: Field{[10]uint32{0x00a0f6ff, 0x02394d01, 0x0358714b, 0x0169816a, 0x034dde8d, 0x02af3c16, 0x0191ef79, 0x02c42592, 0x030f7771, 0x001d3949}}, Y: Field{[10]uint32{0x03b1670f, 0x02c1186c, 0x0088714b, 0x0199a455, 0x0371ced0, 0x00d5ac78, 0x03a285f1, 0x00fc25a1, 0x01a3a4a8, 0x000ab618}}}, + {X: Field{[10]uint32{0x01d4420c, 0x0007d64c, 0x03f587a2, 0x0292161f, 0x02744668, 0x0255f0e8, 0x02856157, 0x03df9d86, 0x02301c43, 0x002e45a4}}, Y: Field{[10]uint32{0x0019536f, 0x007dd396, 0x03e5bebe, 0x008fd6c8, 0x03659ea4, 0x01945696, 0x01818e0c, 0x020a0133, 0x025bc126, 0x002f4d81}}}, + {X: Field{[10]uint32{0x024d51ee, 0x00e7640d, 0x03cd8792, 0x0325654e, 0x02cd01fd, 0x0016dfec, 0x02d72115, 0x01a36a5c, 0x02538645, 0x000dfebc}}, Y: Field{[10]uint32{0x03c15f85, 0x0127ab4e, 0x02823657, 0x008dbdef, 0x01d8c125, 0x028ef258, 0x02ea7360, 0x02cf9f9a, 0x02ce749d, 0x002da6b8}}}, + {X: Field{[10]uint32{0x020cf8d2, 0x0021eee8, 0x0214b43b, 0x02630661, 0x011c379f, 0x00373419, 0x0082477f, 0x004e2cd2, 0x014c4a1c, 0x00386504}}, Y: Field{[10]uint32{0x0098a93b, 0x00dd62ba, 0x00d6789e, 0x034f5c75, 0x00889f2a, 0x01452a66, 0x0182cf06, 0x0388b8ec, 0x034bb90a, 0x001e8ebe}}}, + {X: Field{[10]uint32{0x0217ddaa, 0x0150de7e, 0x0333cca0, 0x03bc245c, 0x011c8b13, 0x02056234, 0x008e4b3c, 0x02d145ce, 0x03010d3f, 0x000b38b6}}, Y: Field{[10]uint32{0x027bbbc0, 0x00c35dcd, 0x00922e2c, 0x02ce0043, 0x0074285c, 0x0346955a, 0x021529ae, 0x01daa617, 0x029daf0e, 0x00248cb6}}}, + {X: Field{[10]uint32{0x016f051f, 0x0063e7cf, 0x01f49986, 0x01b9658d, 0x000bd66c, 0x03fa9da2, 0x00e2e821, 0x01c114f7, 0x00484bdb, 0x0030a4bb}}, Y: Field{[10]uint32{0x03b57d6d, 0x0067b225, 0x008872b1, 0x00d849bd, 0x0312b777, 0x03454c91, 0x00af49bf, 0x039a7134, 0x00f06b81, 0x0008429d}}}, + {X: Field{[10]uint32{0x01acfeee, 0x00c80da9, 0x002ad3e1, 0x020f5ded, 0x020933db, 0x0360eb4f, 0x03b423cc, 0x022bbda5, 0x01c09761, 0x00056f32}}, Y: Field{[10]uint32{0x008a7a33, 0x00ea01ae, 0x0211c1a8, 0x02a403a5, 0x01a1bb98, 0x01244b28, 0x033c4901, 0x025bf6fe, 0x02f11bb9, 0x003a7f1f}}}, + {X: Field{[10]uint32{0x021e7785, 0x0132c91b, 0x03113fd2, 0x031a6756, 0x00848639, 0x017cb4a6, 0x03e45fe5, 0x00ef5e5e, 0x00af50f1, 0x00118467}}, Y: Field{[10]uint32{0x0042ea3b, 0x009ea4c2, 0x01215b13, 0x00056bac, 0x00ba3015, 0x03be4cad, 0x022cf8f9, 0x01bae5dd, 0x0391f4c5, 0x001a880f}}}, + {X: Field{[10]uint32{0x02f9ecf4, 0x037e216d, 0x03a649d9, 0x025179ac, 0x01cf1410, 0x03687e7f, 0x0149a3d2, 0x03c60aa5, 0x03943e4d, 0x003ce85d}}, Y: Field{[10]uint32{0x02cf7e8f, 0x033b041b, 0x02115c80, 0x03ff20bb, 0x00444a1d, 0x0167e0ca, 0x02b66198, 0x02b4e7f0, 0x03cc5e82, 0x002cd3ad}}}, + {X: Field{[10]uint32{0x03913fe4, 0x001d71ad, 0x03d67536, 0x03e940a5, 0x01fa98bd, 0x016e6831, 0x01cbd45f, 0x03d1a36e, 0x027484a7, 0x0033be42}}, Y: Field{[10]uint32{0x02301815, 0x0290289a, 0x0173730f, 0x01579715, 0x01fb79a5, 0x00941e1d, 0x03029465, 0x03ef0a19, 0x02ad2a43, 0x0034243b}}}, + {X: Field{[10]uint32{0x035702ce, 0x031bb4a8, 0x00b06833, 0x02dae418, 0x0126c528, 0x02fe9598, 0x00b88b24, 0x02a4e3b1, 0x0214987a, 0x00087628}}, Y: Field{[10]uint32{0x004579e4, 0x019bc9b6, 0x03c8e94b, 0x03a69407, 0x00f736df, 0x00228a0c, 0x028167c0, 0x0288ef18, 0x000d5b65, 0x0030d50d}}}, + {X: Field{[10]uint32{0x021ca53e, 0x00e5460e, 0x0361d5d1, 0x03e91b81, 0x00e19196, 0x020b6f49, 0x0204f6cf, 0x02f9298a, 0x03279049, 0x001ac63f}}, Y: Field{[10]uint32{0x01ffa3b7, 0x033f6cb1, 0x038d86ca, 0x035c948b, 0x026343f0, 0x01a63e8c, 0x001e9b26, 0x004d9e3e, 0x030c52c0, 0x003be01b}}}, + {X: Field{[10]uint32{0x03466e6f, 0x02b8c772, 0x020ee850, 0x00db0206, 0x00bab07c, 0x028f99cf, 0x0332afbe, 0x03301354, 0x00f20452, 0x001f63bd}}, Y: Field{[10]uint32{0x00fa0c0d, 0x0298910b, 0x017bc137, 0x011fc644, 0x01d224da, 0x03c43db2, 0x03367d0d, 0x033bbc9c, 0x026755a2, 0x000c9185}}}, + {X: Field{[10]uint32{0x00d12cab, 0x012d2208, 0x01afd699, 0x0182c74c, 0x02034135, 0x016b1d28, 0x03b63276, 0x015927d6, 0x002155d1, 0x0031f786}}, Y: Field{[10]uint32{0x02eaa23a, 0x014b39e5, 0x02844482, 0x00d8475f, 0x007fbe01, 0x030c9036, 0x03b86595, 0x00b03f24, 0x0056c5fb, 0x00366596}}}, + {X: Field{[10]uint32{0x0381b294, 0x0224ef50, 0x005c600f, 0x0025ca65, 0x03eddeff, 0x017e93ac, 0x01eb6ee4, 0x00b0ec62, 0x033a915e, 0x00133b2c}}, Y: Field{[10]uint32{0x02a3aeb1, 0x02ef6387, 0x036ffd1b, 0x0384cc42, 0x033534d6, 0x02dc0335, 0x02250357, 0x0072e111, 0x0112b5e6, 0x0033c5fc}}}, + {X: Field{[10]uint32{0x02255749, 0x02a99619, 0x00c10204, 0x00aca172, 0x001c9bc7, 0x033c03f9, 0x003ab5d4, 0x0181aed3, 0x0064bfce, 0x00209b3d}}, Y: Field{[10]uint32{0x036849c4, 0x02388d5e, 0x011cbb87, 0x0192c600, 0x036d7ca5, 0x00542a8b, 0x016fabfb, 0x00a16d45, 0x0031527d, 0x001ae8ed}}}, + {X: Field{[10]uint32{0x008f8f62, 0x0061f9d9, 0x0028e0b2, 0x002360ba, 0x01de51d6, 0x035bf043, 0x012ba922, 0x03491546, 0x02c6f497, 0x003204b6}}, Y: Field{[10]uint32{0x008b317e, 0x01ad2aec, 0x028f61ba, 0x0361ddcf, 0x002be94d, 0x03ebd4ff, 0x026ee1ae, 0x001a0204, 0x00c77363, 0x000340ba}}}, + {X: Field{[10]uint32{0x00ff8851, 0x03574ff8, 0x00d1e3c6, 0x01adb8e3, 0x03aa4592, 0x027c53ae, 0x01eaa8bc, 0x01fd1f91, 0x010ebd96, 0x00149a55}}, Y: Field{[10]uint32{0x01a7455b, 0x021987e6, 0x0295a38b, 0x0340c21a, 0x01b45963, 0x0346cff4, 0x03422ffc, 0x03b3b510, 0x012026e3, 0x0028565f}}}, + {X: Field{[10]uint32{0x004d7676, 0x02bfb9fa, 0x01e9baf1, 0x01b55294, 0x00c7c2ae, 0x037102ea, 0x002721fc, 0x014b3ef1, 0x032980e6, 0x001ff3f2}}, Y: Field{[10]uint32{0x002cfcdd, 0x037afe22, 0x00ce9f95, 0x03d59aa7, 0x02a4d044, 0x0323c675, 0x02bcbaaa, 0x0238d3b1, 0x01904a40, 0x002afdcb}}}, + {X: Field{[10]uint32{0x00a9f451, 0x03712d99, 0x0057c079, 0x03ae2eaa, 0x033d5f25, 0x00ca9a81, 0x00e18a21, 0x03841212, 0x02a04597, 0x00217c06}}, Y: Field{[10]uint32{0x01f081af, 0x013b11f9, 0x0013204b, 0x03072d38, 0x025398ce, 0x016f3d15, 0x03b71ab3, 0x02061dee, 0x00eb8a05, 0x003dd18f}}}, + {X: Field{[10]uint32{0x02885628, 0x03e37fe4, 0x035fda01, 0x02f08900, 0x00dc1a5f, 0x003fafbb, 0x03fee1d1, 0x02183eb0, 0x021a7dcd, 0x000256d2}}, Y: Field{[10]uint32{0x02f7f772, 0x0101bb2f, 0x00d97f70, 0x03b48dce, 0x021f80bc, 0x0131bb8f, 0x029dfa69, 0x01119fbe, 0x039c5bd9, 0x000a8337}}}, + {X: Field{[10]uint32{0x036c51c5, 0x0243b35f, 0x009f049b, 0x02b3b11c, 0x008cd95c, 0x00ddd4f6, 0x014b38ce, 0x03742ec9, 0x00a624dd, 0x00013d89}}, Y: Field{[10]uint32{0x037a4fa5, 0x039612f1, 0x02bd070c, 0x03ac6e5d, 0x00668de4, 0x0333f515, 0x0220dcd8, 0x03b3640a, 0x028302ef, 0x0021d2a6}}}, + {X: Field{[10]uint32{0x0106b48d, 0x03759b5d, 0x00043437, 0x0215a635, 0x02a2914d, 0x0117a71b, 0x0040f585, 0x014def39, 0x0112e18b, 0x000e781a}}, Y: Field{[10]uint32{0x02f352e0, 0x01e859c1, 0x03ef18db, 0x01b51a56, 0x0200f06c, 0x004a2a84, 0x0080153c, 0x00c25aaf, 0x020a16e9, 0x003bfc83}}}, + {X: Field{[10]uint32{0x00f1ace9, 0x005ed19e, 0x013107a7, 0x02d97bee, 0x014c1d41, 0x032b6e5e, 0x03f4f590, 0x01e0c5d3, 0x013266d6, 0x0014bb70}}, Y: Field{[10]uint32{0x00d402d1, 0x01aef071, 0x0127c3af, 0x01563d1a, 0x03cb07cf, 0x01a135f4, 0x02c0bf49, 0x0078ff8c, 0x0202c678, 0x00395a78}}}, + {X: Field{[10]uint32{0x0328465f, 0x0290fcd0, 0x00d3a1df, 0x0235bcaa, 0x01e4e945, 0x02457f23, 0x0287f07c, 0x02041cf8, 0x0348964b, 0x0038dd92}}, Y: Field{[10]uint32{0x00fdb023, 0x01723cd3, 0x01b6c3ad, 0x02a94e9e, 0x005b7261, 0x03435d5d, 0x01b460f6, 0x0382e8d4, 0x024bfb13, 0x002f78a9}}}, + {X: Field{[10]uint32{0x00f513e6, 0x009fbfef, 0x00ebe756, 0x02b6710b, 0x03e1c81a, 0x03e05cca, 0x0038768e, 0x01a638fb, 0x01077c77, 0x00203bf9}}, Y: Field{[10]uint32{0x0388b709, 0x03c41280, 0x00bc3483, 0x005d6bb5, 0x02a9df2e, 0x014f4f67, 0x01e60599, 0x0247a5a5, 0x031bc543, 0x001a4319}}}, + {X: Field{[10]uint32{0x0108b641, 0x00fdc3f2, 0x02728517, 0x01fa4fe3, 0x0319b0bf, 0x01f348fb, 0x032bcac8, 0x03125e8b, 0x03d50ebc, 0x001212b1}}, Y: Field{[10]uint32{0x00ef371e, 0x013a97a4, 0x02eb61b4, 0x0254530a, 0x015bc8c9, 0x014fcc9c, 0x02b85516, 0x01c8da7c, 0x00e6f3b1, 0x0007655c}}}, + {X: Field{[10]uint32{0x03e3d124, 0x023ed7dd, 0x03f6536b, 0x0098e007, 0x02adf26c, 0x0105737e, 0x03ca53e4, 0x02f76137, 0x023fbf1f, 0x00272627}}, Y: Field{[10]uint32{0x00212a38, 0x02aac322, 0x02dd4c79, 0x010b5fc5, 0x002993c4, 0x023fb8eb, 0x00b3b802, 0x0058ee59, 0x021f5755, 0x0028d2b9}}}, + {X: Field{[10]uint32{0x01a5066b, 0x02315f5d, 0x018e0930, 0x034a5ec3, 0x0032846d, 0x0278dfe0, 0x016570f1, 0x03f9fd91, 0x030f601a, 0x00022e3e}}, Y: Field{[10]uint32{0x0048c9e7, 0x02ca783a, 0x03b3c240, 0x01c89bc0, 0x01d6166c, 0x003f59e8, 0x0232f100, 0x039b26cb, 0x02feffc4, 0x0001e162}}}, + {X: Field{[10]uint32{0x02e78177, 0x0367581f, 0x000ef451, 0x00e88470, 0x03bce095, 0x00297601, 0x01baa79e, 0x035e6a60, 0x02740ee1, 0x0038df43}}, Y: Field{[10]uint32{0x009f8f9c, 0x008fafec, 0x02e6f4bd, 0x024eaad3, 0x01a07d05, 0x03f9661d, 0x01b5625b, 0x0097d37c, 0x028502ad, 0x0034a284}}}, + {X: Field{[10]uint32{0x0325c147, 0x02a79c04, 0x00e194b2, 0x03555334, 0x03281052, 0x01d95ec7, 0x0258e754, 0x00da0eb5, 0x037e9a00, 0x00203215}}, Y: Field{[10]uint32{0x024d945c, 0x018d1bd5, 0x03fe432a, 0x0266f3ee, 0x03fe2baf, 0x01ca5cd1, 0x03ba8a0d, 0x028babb1, 0x00cd7ca3, 0x0002cff4}}}, + {X: Field{[10]uint32{0x02a8c6a1, 0x02ce0ccf, 0x0349adde, 0x0234b414, 0x0150f6ba, 0x01eb806a, 0x02f79026, 0x0087954d, 0x016d0341, 0x0039c117}}, Y: Field{[10]uint32{0x02181fba, 0x0222ae22, 0x019e4e7d, 0x00bfa5d5, 0x0060b37c, 0x00a97749, 0x01571d9c, 0x02537f85, 0x00db3269, 0x001cc1aa}}}, + {X: Field{[10]uint32{0x012e0d71, 0x025e3219, 0x029804f2, 0x03df2cd1, 0x02d87554, 0x0300e226, 0x03af0b13, 0x011fedac, 0x024b850a, 0x001574b6}}, Y: Field{[10]uint32{0x03e16e7c, 0x01879e77, 0x02780723, 0x01b57311, 0x010189a5, 0x008bbb97, 0x020b7b4f, 0x0343db34, 0x0182c861, 0x001ab03e}}}, + {X: Field{[10]uint32{0x01a38d2f, 0x00736c2c, 0x019f55bd, 0x00710100, 0x03a1e86d, 0x00540300, 0x03a5ff21, 0x00bdff20, 0x020955a2, 0x0033958b}}, Y: Field{[10]uint32{0x021bb865, 0x01b65ad4, 0x02d314bd, 0x00c9bc73, 0x02474070, 0x03717e0b, 0x030a165e, 0x0311ef1a, 0x004db4aa, 0x00247780}}}, + {X: Field{[10]uint32{0x0054773b, 0x0164b8de, 0x036fecc7, 0x02e1ae4e, 0x0100cd0e, 0x00c41fc7, 0x011bd645, 0x02bc15fe, 0x021f0596, 0x001d3803}}, Y: Field{[10]uint32{0x00e1d217, 0x03edd276, 0x01374e13, 0x005445e4, 0x016fa9f0, 0x0042851b, 0x0311867b, 0x00a94fac, 0x00a338e5, 0x000472a2}}}, + {X: Field{[10]uint32{0x0104eb48, 0x0267e788, 0x00530a2e, 0x00e6561a, 0x0368214d, 0x0324bb65, 0x003e400a, 0x03db2476, 0x036bc194, 0x002ba3c2}}, Y: Field{[10]uint32{0x03ce4cf2, 0x0173bb35, 0x02362c85, 0x01cc5191, 0x00d4aa8f, 0x02d5f2fe, 0x0127de9e, 0x02a4c0d8, 0x00420dc0, 0x003a5cff}}}, + {X: Field{[10]uint32{0x03891ae7, 0x00bf737b, 0x03674158, 0x0089bdda, 0x037854e7, 0x0197ccf4, 0x008e0c05, 0x00d9d784, 0x006c8df8, 0x00102a30}}, Y: Field{[10]uint32{0x007bf7ed, 0x00155762, 0x0224ea10, 0x00260ebd, 0x01b8ff9c, 0x003eaafb, 0x029e0b04, 0x01abf4f4, 0x0050b511, 0x0005ae9e}}}, + {X: Field{[10]uint32{0x01f83b33, 0x037c6f1b, 0x00e487f6, 0x02c13490, 0x03926795, 0x0187c7ff, 0x02b410f8, 0x03dbea8a, 0x02545c57, 0x00187aa7}}, Y: Field{[10]uint32{0x0279ed15, 0x01c56076, 0x0003c490, 0x019ce2a3, 0x02b9063e, 0x03514a7c, 0x021791f7, 0x005f0dcb, 0x012ae0b2, 0x0031a7b0}}}, + {X: Field{[10]uint32{0x01d37632, 0x0032d7b0, 0x031cc30a, 0x03b09920, 0x03d73e25, 0x00517f05, 0x01f55f72, 0x02aa93f3, 0x00d4440c, 0x00072227}}, Y: Field{[10]uint32{0x02d72fdf, 0x016f2508, 0x00166ee5, 0x02184558, 0x00574f5b, 0x036d792c, 0x014a2237, 0x0299f1cc, 0x0246131f, 0x000106d4}}}, + {X: Field{[10]uint32{0x0249525d, 0x0059a863, 0x02abb4ab, 0x001894e4, 0x01c58e0d, 0x02d42fe9, 0x02a99d3a, 0x021f9e60, 0x0090791d, 0x003fca56}}, Y: Field{[10]uint32{0x01454570, 0x02680686, 0x00a58e61, 0x027fbef9, 0x02c37087, 0x02201bef, 0x0249baf8, 0x004d9065, 0x00de1995, 0x00282599}}}, + {X: Field{[10]uint32{0x00e95f99, 0x02a1d9e1, 0x037857bc, 0x02bb66f7, 0x0174e399, 0x023e2433, 0x00939e5b, 0x007f401f, 0x02bfcfca, 0x0017acba}}, Y: Field{[10]uint32{0x032c9871, 0x03ee3efd, 0x00f63031, 0x0097f844, 0x0001f46f, 0x00589976, 0x01aff120, 0x01e0f080, 0x01701c9a, 0x001310ba}}}, + {X: Field{[10]uint32{0x02cbaf91, 0x01edad3d, 0x0361fcfc, 0x0136054f, 0x033b17bf, 0x0281c706, 0x03f8ce17, 0x0324ed6c, 0x008cdbcc, 0x0010f954}}, Y: Field{[10]uint32{0x03dfdcfc, 0x001cd0e6, 0x0063815a, 0x01cf6c90, 0x03c853bb, 0x002694c1, 0x01ec388d, 0x029c7942, 0x0378438b, 0x002d7b63}}}, + {X: Field{[10]uint32{0x01b56f53, 0x0303dd7f, 0x02c995b0, 0x021dfdb8, 0x00eb513f, 0x02bf94cf, 0x0207261c, 0x00837f21, 0x013023cb, 0x003d745a}}, Y: Field{[10]uint32{0x026ece68, 0x03837084, 0x008f492c, 0x0101bacb, 0x002557dd, 0x00f8a597, 0x03c4bf87, 0x020ccbdf, 0x01680152, 0x00394e6c}}}, + {X: Field{[10]uint32{0x00aba2a1, 0x038303de, 0x01eb6c7f, 0x01bee944, 0x0372313c, 0x0198a8ba, 0x0180a62d, 0x02a46118, 0x02d15dc5, 0x0036e759}}, Y: Field{[10]uint32{0x01517227, 0x02883ca8, 0x030b1f89, 0x02d6070f, 0x003cfb46, 0x0095e15f, 0x02762d92, 0x03716a78, 0x00a361f0, 0x00325b7a}}}, + {X: Field{[10]uint32{0x028ecdf2, 0x02992e21, 0x01ab6833, 0x00209ee6, 0x0356ffce, 0x02fd44ce, 0x0165bfe7, 0x018ef13d, 0x03d846fd, 0x0039d834}}, Y: Field{[10]uint32{0x02f102ce, 0x00397504, 0x003810e6, 0x0048a172, 0x012c1c1e, 0x01018b80, 0x021cc825, 0x00bad060, 0x028508be, 0x00183b99}}}, + {X: Field{[10]uint32{0x0033e026, 0x0075e417, 0x00d99135, 0x02c0c769, 0x00e3a956, 0x00b8dc01, 0x02533e71, 0x029eaf48, 0x02990cac, 0x000af6c8}}, Y: Field{[10]uint32{0x02e44731, 0x011c4fed, 0x03f82a78, 0x0218932e, 0x03801932, 0x009f4039, 0x003e877e, 0x0204176b, 0x00dfc273, 0x001919d7}}}, + {X: Field{[10]uint32{0x0166bee4, 0x021ee6a0, 0x03bbfc3c, 0x00838006, 0x007be48d, 0x03f5b211, 0x00137739, 0x0084d2de, 0x03fd0599, 0x00073382}}, Y: Field{[10]uint32{0x02d37057, 0x0222ef72, 0x034cc427, 0x00fb059b, 0x02b5eeb7, 0x03367a0f, 0x021253c4, 0x03f8c30e, 0x02e51ed7, 0x000b52a3}}}, + {X: Field{[10]uint32{0x03641075, 0x03e2695d, 0x035bd6eb, 0x0316ed95, 0x01ec8405, 0x031ae319, 0x01b5bd8e, 0x02b9effd, 0x03c37f5d, 0x001b5af8}}, Y: Field{[10]uint32{0x009c2c7f, 0x011b33eb, 0x01b80392, 0x0234d456, 0x0324d193, 0x0313abd2, 0x011507f7, 0x034ef180, 0x001f5c6f, 0x0013f4f3}}}, + {X: Field{[10]uint32{0x01b22351, 0x001f62ef, 0x0036cc60, 0x00bc50fa, 0x01b3c67f, 0x01d63e87, 0x03fb1ca8, 0x01e075e0, 0x0180d96e, 0x000360b0}}, Y: Field{[10]uint32{0x02d0c7d9, 0x01ee389e, 0x031e151a, 0x03d9e592, 0x0037415a, 0x01290c86, 0x033e9a97, 0x02b6a24e, 0x0269952a, 0x000e00bd}}}, + {X: Field{[10]uint32{0x01b3cd71, 0x0233860f, 0x02343b22, 0x03ba31cf, 0x00fbf9fc, 0x0151bc6e, 0x01dfed1b, 0x03f4d3e4, 0x02dd7e03, 0x0013b187}}, Y: Field{[10]uint32{0x003ba9a9, 0x021215ac, 0x01cffb19, 0x023eaa50, 0x02db7d94, 0x03a7b0f1, 0x0390340d, 0x038bb22b, 0x0309b5b2, 0x00384665}}}, + {X: Field{[10]uint32{0x017a034b, 0x01e07a78, 0x01643add, 0x023e39cd, 0x02a8df7a, 0x03ab44fb, 0x00744d7b, 0x02846e95, 0x006973ae, 0x000c6ab5}}, Y: Field{[10]uint32{0x00b37adb, 0x02d9d3e1, 0x02913f13, 0x03e39838, 0x02a94680, 0x033b5d21, 0x028bdf57, 0x03d818fd, 0x03413e49, 0x001919db}}}, + {X: Field{[10]uint32{0x01173e02, 0x00739353, 0x0131a5eb, 0x02f65f8a, 0x0201f946, 0x01627a98, 0x0115903b, 0x036e3bd9, 0x01892fcc, 0x002a6108}}, Y: Field{[10]uint32{0x01a3908b, 0x01222922, 0x02049abe, 0x01b42959, 0x0307ea26, 0x0335becd, 0x0370e133, 0x035e8e8c, 0x02ac3b2d, 0x00142f9d}}}, + {X: Field{[10]uint32{0x03bef099, 0x0383b3ad, 0x015e3f8f, 0x0022941a, 0x02fee79b, 0x01dd5033, 0x02cfa092, 0x0010cde9, 0x00f33ec0, 0x00208ad5}}, Y: Field{[10]uint32{0x036bf7f6, 0x01121448, 0x007128d0, 0x00dbf6a3, 0x007405d3, 0x022016fc, 0x003ddced, 0x03d811cd, 0x03c620d3, 0x000e4d88}}}, + {X: Field{[10]uint32{0x01065e0b, 0x037c9705, 0x02a3d33a, 0x0043a677, 0x0215793d, 0x02ff175f, 0x038de14e, 0x01c00317, 0x0355fe3d, 0x000403da}}, Y: Field{[10]uint32{0x02ecb4c2, 0x0335d293, 0x00e519b2, 0x034373b2, 0x00a352ff, 0x035b0445, 0x01282676, 0x037789f2, 0x00f758c4, 0x00346ed1}}}, + {X: Field{[10]uint32{0x02142f7f, 0x03a20db5, 0x031bb2d4, 0x01f16b6d, 0x006a5425, 0x00657425, 0x01aa6ecd, 0x03089d20, 0x03186a09, 0x00329760}}, Y: Field{[10]uint32{0x0277b42d, 0x013d3649, 0x0133de01, 0x00c7f1ce, 0x03878d8d, 0x012b815f, 0x03a0c388, 0x01e82bce, 0x007fb974, 0x00362421}}}, + {X: Field{[10]uint32{0x00bfbf14, 0x03684b89, 0x016cafa5, 0x00fc406d, 0x00e8ffe5, 0x0263fd84, 0x031a352f, 0x034838a4, 0x01f42234, 0x003a4709}}, Y: Field{[10]uint32{0x024dbb86, 0x02d288a5, 0x02b41872, 0x03d450f3, 0x037a26bc, 0x0183a669, 0x01740f6d, 0x0314af1c, 0x01e5441e, 0x002c7b05}}}, + {X: Field{[10]uint32{0x02e34445, 0x02750b06, 0x0306509e, 0x011cb33d, 0x03acb545, 0x00ba66b9, 0x029b2902, 0x000b6215, 0x00dc3109, 0x0015ea32}}, Y: Field{[10]uint32{0x00ab1fb7, 0x0185878c, 0x00accb9c, 0x00fee308, 0x0250e7cc, 0x01219abb, 0x0292db56, 0x038277d3, 0x01410442, 0x00214891}}}, + {X: Field{[10]uint32{0x0104500f, 0x00116c1c, 0x007d9581, 0x00769bfa, 0x0355a853, 0x02300adb, 0x01d0d412, 0x0345b6eb, 0x00672502, 0x0008cae3}}, Y: Field{[10]uint32{0x01f93fb9, 0x02903d61, 0x00f399a7, 0x03679863, 0x034f5255, 0x0152524b, 0x03c476f6, 0x02161c89, 0x020e9e7d, 0x000e0442}}}, + {X: Field{[10]uint32{0x03004fec, 0x0189ff9d, 0x00876187, 0x031c38f7, 0x020750d5, 0x0067df9e, 0x01d48763, 0x01a6cd3d, 0x028ad71f, 0x001f42f9}}, Y: Field{[10]uint32{0x01124633, 0x027bf351, 0x01e67ca0, 0x0060b291, 0x02a12b1d, 0x0296e5c7, 0x02f54028, 0x03cf9875, 0x00507d0a, 0x000f9ca8}}}, + {X: Field{[10]uint32{0x02f93292, 0x01e8b49e, 0x00d836ba, 0x0312691b, 0x01b70b02, 0x00310d21, 0x01fa4369, 0x0289c725, 0x030b77c2, 0x00137617}}, Y: Field{[10]uint32{0x0011d597, 0x038efd47, 0x0178e8c9, 0x01348206, 0x00f139e6, 0x036b69e8, 0x02b6ff85, 0x01366122, 0x02e5c955, 0x00210d90}}}, + {X: Field{[10]uint32{0x012e52f8, 0x01938bdc, 0x032149e2, 0x0307add9, 0x023eb2e5, 0x012ea69e, 0x03531a17, 0x008011c2, 0x03f588f0, 0x0014dea4}}, Y: Field{[10]uint32{0x000e161f, 0x00e6d84d, 0x03ebb3f8, 0x03e5e095, 0x0394efa1, 0x006256bc, 0x0225f067, 0x02499823, 0x03a0dc00, 0x002c366c}}}, + {X: Field{[10]uint32{0x02e48684, 0x00accc67, 0x00ae8b97, 0x02420962, 0x01ab3465, 0x03e0aff4, 0x00e60a46, 0x00795e63, 0x0071325b, 0x0004febd}}, Y: Field{[10]uint32{0x0234f743, 0x0086b79d, 0x00bfa49a, 0x0062116e, 0x02dce7ba, 0x026c8806, 0x02f25857, 0x02d4a788, 0x0384e84e, 0x00299c80}}}, + {X: Field{[10]uint32{0x03e8acb8, 0x03910173, 0x0206be1b, 0x02088b67, 0x03ca17c4, 0x00277b79, 0x015dbea8, 0x02cd1380, 0x00ed5861, 0x001a4789}}, Y: Field{[10]uint32{0x01c529ab, 0x026ddae4, 0x03f966f4, 0x0250f43c, 0x035ad002, 0x036718d1, 0x0120d909, 0x01ec3f31, 0x02dc0c19, 0x0038d592}}}, + {X: Field{[10]uint32{0x013d7ea2, 0x0305771f, 0x0373f423, 0x03e2411f, 0x03b754b3, 0x02ccd248, 0x02a394ff, 0x02a14056, 0x0391aaae, 0x000d950e}}, Y: Field{[10]uint32{0x03be5799, 0x0228bc6e, 0x02fd52d6, 0x03f9687e, 0x039dff44, 0x00860252, 0x008c8389, 0x02003a39, 0x0293b79b, 0x0001ced1}}}, + {X: Field{[10]uint32{0x0033f05b, 0x0082c1e1, 0x008a224f, 0x02c3f8ef, 0x000e007b, 0x00c83aa0, 0x00450455, 0x02032c78, 0x03e03941, 0x003fc96a}}, Y: Field{[10]uint32{0x030b7e51, 0x00d8c794, 0x026c2f90, 0x038022bb, 0x02938f69, 0x03676d04, 0x01bd678a, 0x0399439b, 0x010926df, 0x002944ac}}}, + {X: Field{[10]uint32{0x0187e443, 0x00e2685f, 0x0322272d, 0x0305c314, 0x00cc607b, 0x034091eb, 0x0051f57c, 0x03f6bd44, 0x007b5faa, 0x000077b0}}, Y: Field{[10]uint32{0x03a9a325, 0x014252e7, 0x038d3bb3, 0x019f4384, 0x00d870ce, 0x016636b5, 0x02207a92, 0x00af0168, 0x0137382b, 0x001f9dfa}}}, + {X: Field{[10]uint32{0x03413c32, 0x030a6527, 0x02236029, 0x0237f18d, 0x01485ab7, 0x00538246, 0x020147ed, 0x0218cba8, 0x0376f62f, 0x000bc43d}}, Y: Field{[10]uint32{0x00d2184a, 0x009a7b1a, 0x02f5ad25, 0x01a0cf9f, 0x0235c236, 0x02a9ac7d, 0x01d8c8b5, 0x0118b82e, 0x03c6e760, 0x000ecb17}}}, + {X: Field{[10]uint32{0x02bd73ca, 0x018008b6, 0x00188311, 0x010f3060, 0x02ade319, 0x02f2bed2, 0x03096814, 0x00b36eb3, 0x0394e61c, 0x001e5d3c}}, Y: Field{[10]uint32{0x01e98309, 0x020d8022, 0x0005673c, 0x03a0c439, 0x012be4cd, 0x004ee914, 0x01f854e8, 0x02a99a1f, 0x01a03bc1, 0x00386cd3}}}, + {X: Field{[10]uint32{0x0301c332, 0x01d233c5, 0x01b14436, 0x03780e94, 0x0132af1e, 0x012a8da5, 0x01774698, 0x03105959, 0x03393c5c, 0x00015317}}, Y: Field{[10]uint32{0x01043e4e, 0x0306da81, 0x020cd800, 0x02b3bde2, 0x02ddbde8, 0x03baadae, 0x030626a0, 0x0273148a, 0x03494976, 0x000f719e}}}, + {X: Field{[10]uint32{0x025f3783, 0x03068ed0, 0x0115d081, 0x00179556, 0x028092e9, 0x0061616b, 0x00a972a3, 0x031fac76, 0x0296f047, 0x000666a8}}, Y: Field{[10]uint32{0x0346c262, 0x03a3f1fa, 0x002e2b87, 0x038433b8, 0x02585154, 0x03f4e899, 0x00a7946d, 0x01ea5ad3, 0x027964d1, 0x003d608d}}}, + {X: Field{[10]uint32{0x03b7f299, 0x03c222a6, 0x03e879a7, 0x02f9e5da, 0x03cbcdf0, 0x007f1639, 0x0292a3ba, 0x01b7e9b0, 0x01d6fb61, 0x0034574e}}, Y: Field{[10]uint32{0x03d7a900, 0x016e980a, 0x01061f70, 0x00602d5f, 0x01679dd4, 0x010eff1e, 0x03d4912f, 0x03e0def6, 0x017c4e37, 0x001322ba}}}, + {X: Field{[10]uint32{0x024ef58b, 0x019a0fcd, 0x02df5a6f, 0x032a696b, 0x01bff26e, 0x0012e0af, 0x02332c6a, 0x01f7f206, 0x0134880e, 0x001db594}}, Y: Field{[10]uint32{0x001507e7, 0x01101ad0, 0x0246a646, 0x02f16fc4, 0x027b4aa5, 0x025d6e68, 0x02c90486, 0x00b60e87, 0x0308bbd2, 0x002dc6b9}}}, + {X: Field{[10]uint32{0x00ae51b7, 0x002050f7, 0x02a02a03, 0x03865301, 0x03452ef0, 0x024bfea6, 0x02e9ead7, 0x03f8d8c2, 0x02a5d4df, 0x0007ad34}}, Y: Field{[10]uint32{0x03f47b0b, 0x01736f5b, 0x0144c9a5, 0x019d626c, 0x027cc94b, 0x0232cfb6, 0x0286af45, 0x0239e668, 0x00c1e6ab, 0x0022365e}}}, + {X: Field{[10]uint32{0x01df571d, 0x004bc337, 0x0162f955, 0x0349144d, 0x01e474bd, 0x01c4188f, 0x01c34516, 0x021e40d8, 0x02513570, 0x0037b80c}}, Y: Field{[10]uint32{0x0290f565, 0x03121e85, 0x027c307f, 0x008ec819, 0x00496d96, 0x00463ffb, 0x028a28dc, 0x036024b1, 0x00fdcbf6, 0x00348b6f}}}, + {X: Field{[10]uint32{0x02d4760a, 0x008d5b95, 0x005aeef0, 0x0277cd8e, 0x01bf1dbd, 0x03c4fd42, 0x028f0d55, 0x031af7fd, 0x032dc98a, 0x000bac09}}, Y: Field{[10]uint32{0x02a04277, 0x03280ac9, 0x03746111, 0x0111c847, 0x035c69ad, 0x0015cda1, 0x02a18329, 0x013ae89e, 0x03554aaf, 0x003e0350}}}, + {X: Field{[10]uint32{0x030eabf3, 0x02c0c86a, 0x036b5c39, 0x03a809d8, 0x02b75853, 0x01de2208, 0x036ff7fc, 0x019cb63f, 0x02697509, 0x003abd8b}}, Y: Field{[10]uint32{0x020a3b7c, 0x03f7b6cb, 0x000956ef, 0x0180d41c, 0x008614e1, 0x001ccfc7, 0x0388b969, 0x0388b5c6, 0x02aa1c8f, 0x00110b95}}}, + {X: Field{[10]uint32{0x00592858, 0x03dcab81, 0x01d3b15e, 0x0216e1e6, 0x03cbc701, 0x00dbbd18, 0x01c442c2, 0x01bf65af, 0x030a13d9, 0x00081641}}, Y: Field{[10]uint32{0x00961ec8, 0x028d2f45, 0x014a280d, 0x03fa406e, 0x00f426fb, 0x01ab95b6, 0x0221d7f4, 0x026ba3d8, 0x02e83f25, 0x002f2410}}}, + {X: Field{[10]uint32{0x012f52fe, 0x009749eb, 0x0062a0f9, 0x01108231, 0x014b8b4a, 0x0113b0a0, 0x03b4ceea, 0x00f9f9bd, 0x03fd9e7f, 0x003fcbbd}}, Y: Field{[10]uint32{0x030a5e24, 0x03393cf7, 0x03e3b233, 0x011dada7, 0x030956a4, 0x019fd44d, 0x016cb52a, 0x01cad205, 0x00fbfa6f, 0x001ab39d}}}, + {X: Field{[10]uint32{0x01d14d83, 0x01fe7602, 0x03bf620f, 0x039937c5, 0x01d8fd0d, 0x00d5ffc7, 0x037a7b04, 0x014fef4c, 0x02f6fc45, 0x0038f973}}, Y: Field{[10]uint32{0x038f0460, 0x013d1348, 0x033651b8, 0x03fa2811, 0x03e667b6, 0x01a691d7, 0x011863f7, 0x02d83f43, 0x01a1baa7, 0x002b377f}}}, + {X: Field{[10]uint32{0x0357a6c3, 0x0046736f, 0x0054ec11, 0x01def78f, 0x01a0c645, 0x019ae708, 0x0142341a, 0x00a203a6, 0x026a41c0, 0x0025ea1c}}, Y: Field{[10]uint32{0x0367b4e8, 0x0330e362, 0x01164681, 0x03fcd167, 0x01fe160a, 0x01b61178, 0x00cc5c72, 0x00f41c1e, 0x00ae2702, 0x002d7cdf}}}, + {X: Field{[10]uint32{0x01cc81e6, 0x00811427, 0x001c41b0, 0x000875de, 0x0012fd90, 0x0067ab6d, 0x039484a1, 0x03e50e18, 0x02e94862, 0x002ac079}}, Y: Field{[10]uint32{0x0083b14b, 0x007b815d, 0x000436b1, 0x03d0568c, 0x0148853c, 0x00bb5e79, 0x01fab050, 0x0170e814, 0x0032101b, 0x001ab943}}}, + {X: Field{[10]uint32{0x0273668f, 0x03a857dd, 0x02b0d5a2, 0x01302a30, 0x0258ed9a, 0x023611e7, 0x026ba5ac, 0x033dac0b, 0x0010da2d, 0x00031191}}, Y: Field{[10]uint32{0x03499945, 0x02f0e182, 0x01361adb, 0x01114827, 0x03eadee9, 0x034f3916, 0x017f333c, 0x00b1f796, 0x01906239, 0x000da631}}}, + {X: Field{[10]uint32{0x03867534, 0x00263d05, 0x03d8648f, 0x00909bb6, 0x01ee49d5, 0x01b041e5, 0x013b0e67, 0x007cf880, 0x00685f72, 0x0005fab3}}, Y: Field{[10]uint32{0x009ef300, 0x018fb386, 0x0201bd6b, 0x015ba652, 0x03fec0f8, 0x00eaddbe, 0x037214bb, 0x027d26ef, 0x02e90cb1, 0x00330c45}}}, + {X: Field{[10]uint32{0x00c00d73, 0x00537ab5, 0x0208f2b1, 0x02f35f4d, 0x013ed2e8, 0x02fbf54f, 0x01b77bd5, 0x03bc5d4e, 0x01402908, 0x00301037}}, Y: Field{[10]uint32{0x01279c00, 0x020d6d05, 0x013d7427, 0x032db383, 0x02b2053e, 0x01444f73, 0x01403d84, 0x00960134, 0x00ae55ec, 0x001e98e1}}}, + {X: Field{[10]uint32{0x02bddb42, 0x000f8e4b, 0x01b9341b, 0x028aea4b, 0x0041bf2b, 0x019668a4, 0x0025fed6, 0x03dc30bb, 0x00983658, 0x0029658d}}, Y: Field{[10]uint32{0x039f4872, 0x002b7935, 0x01600a95, 0x034a08d6, 0x011ce7c2, 0x01a55e17, 0x00e8bf41, 0x03129c2a, 0x00af260e, 0x00370453}}}, + {X: Field{[10]uint32{0x0329aa0d, 0x01f3a846, 0x02279989, 0x01c8ce77, 0x03663823, 0x00ce0db1, 0x0233d095, 0x03d8ff1f, 0x02d451dc, 0x00113f88}}, Y: Field{[10]uint32{0x004279b3, 0x015df313, 0x01a9e53b, 0x003eba01, 0x014f3bf8, 0x00925bde, 0x01e9ffae, 0x0350d24a, 0x00e73d4b, 0x0005c631}}}, + {X: Field{[10]uint32{0x0071647b, 0x019a844b, 0x0091cff4, 0x03cfb57b, 0x004fc6b5, 0x00912ff6, 0x03b246de, 0x03057be8, 0x00aa1358, 0x0022f5c6}}, Y: Field{[10]uint32{0x03d737fa, 0x01b7fa12, 0x02fa5f40, 0x032110ec, 0x0365a0a3, 0x010009e4, 0x03deb8de, 0x0047c06d, 0x0288ba6c, 0x0005cbc6}}}, + {X: Field{[10]uint32{0x038680d1, 0x03e3385c, 0x03cfcd9f, 0x0355773c, 0x01d7ad4c, 0x03fce9e9, 0x01aa53c3, 0x02a88e02, 0x0025bbe6, 0x0023af73}}, Y: Field{[10]uint32{0x01e5641a, 0x02621d51, 0x01872cd7, 0x0199e2b1, 0x005be647, 0x0221b60f, 0x003728cf, 0x02b7e803, 0x0326af86, 0x0017158e}}}, + {X: Field{[10]uint32{0x011713d2, 0x0319f83a, 0x02f4e9db, 0x034bfadc, 0x02b469e5, 0x03a25b3e, 0x0342fb8b, 0x02aaf265, 0x021f688f, 0x00173d53}}, Y: Field{[10]uint32{0x00fd09c5, 0x011e1af9, 0x00b18569, 0x02a218c9, 0x034920e8, 0x0240556c, 0x006393e1, 0x00c360be, 0x0190d063, 0x00360b59}}}, + {X: Field{[10]uint32{0x01845f1a, 0x03061ea1, 0x02f8cdb4, 0x03053228, 0x01387185, 0x00115c7b, 0x0016ff4e, 0x02869cbb, 0x02e43f01, 0x001b0365}}, Y: Field{[10]uint32{0x00798c08, 0x02a5a9ac, 0x01dd6e55, 0x00e8c45f, 0x00abcf01, 0x026edbdc, 0x0015c1bb, 0x030bb3cd, 0x014b763e, 0x003ce668}}}, + {X: Field{[10]uint32{0x02b74046, 0x00cb70e4, 0x02ad690d, 0x002fa9c5, 0x039a15ef, 0x01c9a84c, 0x01f15155, 0x00bf7341, 0x00fefb6a, 0x003aba4a}}, Y: Field{[10]uint32{0x014c76bc, 0x03315dc0, 0x01b0984e, 0x0099835b, 0x02f6fd46, 0x035bb503, 0x03da7978, 0x00ce772f, 0x02d9f086, 0x002f7e1e}}}, + {X: Field{[10]uint32{0x007b3a21, 0x00802391, 0x008f0d57, 0x02cc6a9a, 0x02b61d5c, 0x00382376, 0x030dbbd0, 0x00bf7b67, 0x030cbbe7, 0x00397978}}, Y: Field{[10]uint32{0x01b248ae, 0x000196a1, 0x0035c561, 0x020a8415, 0x005de656, 0x0145c73a, 0x006ec03d, 0x01b99d1f, 0x01b8f80b, 0x0027ed2b}}}, + {X: Field{[10]uint32{0x038223ee, 0x036f3284, 0x00b79007, 0x00329e68, 0x0078df6b, 0x01acc02f, 0x02ce1762, 0x01aedf16, 0x02acc9e2, 0x001c4484}}, Y: Field{[10]uint32{0x03027757, 0x02a9cabb, 0x01cbbdc3, 0x00e46384, 0x036b8732, 0x0131cff8, 0x02b343bc, 0x01377679, 0x00584ef4, 0x000371a2}}}, + {X: Field{[10]uint32{0x01c5e22c, 0x00d03c08, 0x03d506b6, 0x02ca9319, 0x00c4cf11, 0x02d795e1, 0x03b9ea3f, 0x0293db76, 0x03b3531a, 0x000ed4ba}}, Y: Field{[10]uint32{0x0190938a, 0x02665aec, 0x039de55a, 0x0298f17e, 0x00b698c8, 0x01a06190, 0x02cf02e4, 0x011a84fe, 0x02bddc00, 0x000f68fb}}}, + {X: Field{[10]uint32{0x0356b78b, 0x01daf733, 0x02df91eb, 0x005fa5b2, 0x0245294a, 0x03871e95, 0x02e7292f, 0x011789f7, 0x00811103, 0x000c3ca1}}, Y: Field{[10]uint32{0x03abb049, 0x035c0add, 0x02b088e6, 0x01902877, 0x003c1491, 0x01445beb, 0x007864d2, 0x038d2fc1, 0x00fc26ec, 0x001c3184}}}, + {X: Field{[10]uint32{0x0130ff58, 0x0055937a, 0x01ab5edf, 0x009da675, 0x015cfef5, 0x0329287c, 0x00d37b61, 0x0156d939, 0x00a8012c, 0x00012a11}}, Y: Field{[10]uint32{0x003dfa3c, 0x0227565a, 0x00cd3f31, 0x03018c9d, 0x025826f9, 0x0342a7fd, 0x03e6bd38, 0x039b936e, 0x0148508d, 0x001261d1}}}, + {X: Field{[10]uint32{0x0068b06f, 0x0279b19e, 0x01026451, 0x0177b714, 0x0005ce2b, 0x02667853, 0x02e0fd9a, 0x01212990, 0x021ea7c8, 0x00297295}}, Y: Field{[10]uint32{0x01afa7ed, 0x0310e8e1, 0x025a47a7, 0x01a89077, 0x037abe38, 0x03fe9fda, 0x009b00ea, 0x03bbaab0, 0x0142a5e2, 0x0033245e}}}, + {X: Field{[10]uint32{0x03d6e72c, 0x03e3b937, 0x017ef3c1, 0x031915b9, 0x021fa547, 0x0043d852, 0x0051a68e, 0x03115b0e, 0x02d31e16, 0x003d86df}}, Y: Field{[10]uint32{0x03622f2b, 0x028ca017, 0x01a54734, 0x00453426, 0x02a0c5a8, 0x0345efe9, 0x035fbdb4, 0x00619647, 0x00b7fc40, 0x0032c9b4}}}, + {X: Field{[10]uint32{0x01f678b2, 0x01586145, 0x007fcaee, 0x019a8888, 0x02559768, 0x01d9bef9, 0x02859f9e, 0x000312d4, 0x00628897, 0x003e3935}}, Y: Field{[10]uint32{0x02c77554, 0x006a93ae, 0x011ae6f0, 0x02542775, 0x0106791e, 0x03eeddac, 0x009c271b, 0x01bec2a8, 0x039fc1b1, 0x000c2ec0}}}, + {X: Field{[10]uint32{0x032ab653, 0x00a4274c, 0x0291ca39, 0x001a9c5e, 0x03d5d97a, 0x0060528b, 0x02f6f717, 0x0164542c, 0x001a05d2, 0x002272bf}}, Y: Field{[10]uint32{0x017ab76e, 0x00bc5109, 0x03ce16fe, 0x036983a1, 0x015eac02, 0x0053cd38, 0x01c00557, 0x0121634a, 0x00ab0b4e, 0x00068928}}}, + {X: Field{[10]uint32{0x037c4f20, 0x02365f51, 0x020bb4a4, 0x0155aba9, 0x0033c5b5, 0x028ab544, 0x0201dca7, 0x01773f2a, 0x030bd04f, 0x0034a14d}}, Y: Field{[10]uint32{0x0293b9d4, 0x01348091, 0x01b416c4, 0x02cb1a60, 0x01c61386, 0x031c1451, 0x022adf8e, 0x0217404e, 0x03b732e8, 0x00352d09}}}, + {X: Field{[10]uint32{0x01f217c0, 0x01bd9a93, 0x00974902, 0x019b87f5, 0x01fd3350, 0x01eae89a, 0x01dc90d1, 0x02fecc86, 0x02f2d9bd, 0x0000f14c}}, Y: Field{[10]uint32{0x02ac5d59, 0x00f8c199, 0x0057675b, 0x03e7e320, 0x032791a6, 0x02104e5d, 0x033c7b42, 0x01ff40b0, 0x027ca6c9, 0x0021bf57}}}, + {X: Field{[10]uint32{0x008ac1ee, 0x000c5333, 0x02924b73, 0x00f8df89, 0x02298445, 0x00c0dc89, 0x0317a165, 0x01c1a886, 0x010bfc35, 0x00093465}}, Y: Field{[10]uint32{0x01f918ac, 0x0307aa72, 0x01ed84b9, 0x03822d5f, 0x01b05bb9, 0x026ba69d, 0x0247c685, 0x006a42ec, 0x005d06a3, 0x001348a9}}}, + {X: Field{[10]uint32{0x027615a9, 0x020acd93, 0x03d44595, 0x01042ad9, 0x02d85053, 0x0280dbf0, 0x01f8acee, 0x02c6ac52, 0x00f36227, 0x00331aac}}, Y: Field{[10]uint32{0x03761cb8, 0x01a028e0, 0x037d7107, 0x02bd5283, 0x01bac918, 0x003e9bc8, 0x00806b12, 0x0049619f, 0x03cc040b, 0x003e6b64}}}, + {X: Field{[10]uint32{0x025318cf, 0x03fdc6c0, 0x01cdef08, 0x00366c50, 0x016320f2, 0x01cc2e67, 0x0016bcff, 0x0252db2a, 0x0154f36e, 0x0037892a}}, Y: Field{[10]uint32{0x03899933, 0x00129076, 0x014d9679, 0x017a920e, 0x038475c3, 0x012bf58b, 0x002d2354, 0x012926e6, 0x01d91ac2, 0x000f8d2c}}}, + {X: Field{[10]uint32{0x021ffec7, 0x03fc9496, 0x03618f83, 0x036d23ea, 0x015f8243, 0x0254f3ef, 0x003a12c7, 0x02aea436, 0x00c34900, 0x001deac1}}, Y: Field{[10]uint32{0x00ac2f00, 0x01cfbfaf, 0x032bdae8, 0x00680c28, 0x01231c87, 0x016a36cc, 0x02265af7, 0x01dffd25, 0x00273bcd, 0x0018996b}}}, + {X: Field{[10]uint32{0x02e78209, 0x012b5445, 0x0341ece8, 0x03b876ad, 0x0251ff8d, 0x00656028, 0x0079885d, 0x02679780, 0x03065f46, 0x00291ebd}}, Y: Field{[10]uint32{0x02257440, 0x03cd2e5e, 0x03abfbb8, 0x0220f6bf, 0x035b7860, 0x01196ae5, 0x023f7cb3, 0x03de2e95, 0x03fdf1b1, 0x000e4f2e}}}, + {X: Field{[10]uint32{0x00d7016d, 0x0117a7a7, 0x037ea8a5, 0x038754a8, 0x0293d709, 0x000c8809, 0x01170fbd, 0x031edd37, 0x01fd0c55, 0x002a7d7e}}, Y: Field{[10]uint32{0x01d5e0e1, 0x012c417c, 0x0162b873, 0x009fdad8, 0x0254f0d3, 0x027a02ac, 0x01847b2e, 0x03c8ba3f, 0x01254bad, 0x00261c5e}}}, + {X: Field{[10]uint32{0x0218ec38, 0x01f358d3, 0x03b716cc, 0x01902a51, 0x01ba8668, 0x0161b9f8, 0x02200c4e, 0x00e28a3e, 0x02bc96b9, 0x00355fa7}}, Y: Field{[10]uint32{0x01b6bd36, 0x029aab34, 0x016a3062, 0x03abca16, 0x0325de16, 0x0104b7e1, 0x00c8b7cb, 0x0244416d, 0x02ef6823, 0x0026a834}}}, + {X: Field{[10]uint32{0x03aa58e9, 0x001a0a43, 0x006119f5, 0x0072ae08, 0x02e27ccc, 0x02a175ce, 0x018e66ca, 0x03053558, 0x00d8fb4d, 0x001d18ea}}, Y: Field{[10]uint32{0x00d4829f, 0x026ab41a, 0x0389f056, 0x03102d30, 0x02ae7990, 0x010e36e1, 0x00645a28, 0x03d412a8, 0x02b2275a, 0x0020bf5a}}}, + {X: Field{[10]uint32{0x013bf412, 0x01b9f3f5, 0x032fca3c, 0x01914d36, 0x013927ae, 0x03accc6c, 0x002d03e4, 0x0120c668, 0x008a29c4, 0x000b9e9c}}, Y: Field{[10]uint32{0x031e11d1, 0x038ecf52, 0x00160fd2, 0x0093b006, 0x03ebdf68, 0x00e6ceca, 0x02e0073f, 0x003372ba, 0x01997350, 0x00213cfc}}}, + {X: Field{[10]uint32{0x01dd5e03, 0x034c3136, 0x00dda414, 0x012edfea, 0x02180d09, 0x022e8c13, 0x032f3c2e, 0x030163eb, 0x00bf540b, 0x0021c1ec}}, Y: Field{[10]uint32{0x0100b915, 0x0127083c, 0x0025dfbb, 0x03a6599f, 0x0318db5e, 0x02816535, 0x006bd25a, 0x0040cd43, 0x0175fb79, 0x001c2d84}}}, + {X: Field{[10]uint32{0x03ca842d, 0x02a8b594, 0x008b9613, 0x03386db0, 0x0122f67d, 0x023999d2, 0x02070a72, 0x03340a21, 0x030c3ce6, 0x000ff6cd}}, Y: Field{[10]uint32{0x00e0dafc, 0x0121ac32, 0x0006317a, 0x03e65004, 0x035d3a5e, 0x002c7bfb, 0x004c5ec1, 0x000d1297, 0x00f2474a, 0x00058d46}}}, + {X: Field{[10]uint32{0x00472f62, 0x020f6252, 0x031af2a2, 0x0180252c, 0x03330779, 0x01bd6352, 0x01411e70, 0x03552680, 0x0302412c, 0x0030df68}}, Y: Field{[10]uint32{0x0221f92a, 0x031bf84e, 0x01d26801, 0x0002e2b4, 0x01ca8490, 0x0282a0af, 0x002d1daa, 0x010bd21c, 0x028716c6, 0x002a823c}}}, + {X: Field{[10]uint32{0x01e08a1c, 0x009bf1e9, 0x007cf257, 0x03b0ac2d, 0x0160ade9, 0x0171e8ce, 0x01f923b0, 0x02c3e494, 0x0150381a, 0x000fae81}}, Y: Field{[10]uint32{0x030fa7d9, 0x010697f3, 0x02396557, 0x03668316, 0x00492a1a, 0x02bf1380, 0x02396525, 0x0374ea21, 0x00ebb681, 0x000509ec}}}, + {X: Field{[10]uint32{0x0350cee8, 0x02be39ae, 0x02e0194e, 0x029e14d5, 0x02e43f20, 0x01d53e83, 0x024628f7, 0x035752fd, 0x02a18ce5, 0x00259c8f}}, Y: Field{[10]uint32{0x01f49bdd, 0x0019a960, 0x00e8a713, 0x016eca32, 0x016cf51b, 0x035122bb, 0x02eef512, 0x02fc43a1, 0x03bbb9bb, 0x0016b427}}}, + {X: Field{[10]uint32{0x03663748, 0x02358128, 0x00f1329f, 0x02499e44, 0x00ab8228, 0x01575716, 0x009d3460, 0x02db34e8, 0x02117ecf, 0x0035d914}}, Y: Field{[10]uint32{0x028540f7, 0x02e00c70, 0x01a46eeb, 0x00430897, 0x03bf2c9b, 0x02eaaa73, 0x0089dbe2, 0x037820b2, 0x0104d20f, 0x002adf30}}}, + {X: Field{[10]uint32{0x00ada5e6, 0x02a241b4, 0x03e434dc, 0x0196d2b1, 0x008c8660, 0x0352f251, 0x01907afa, 0x02c4d883, 0x03dc7e0a, 0x0007dac8}}, Y: Field{[10]uint32{0x023e247c, 0x03b0959d, 0x02602398, 0x0103923d, 0x01560414, 0x036aa7ac, 0x00920405, 0x00e76ab4, 0x025d6bc6, 0x00230dec}}}, + {X: Field{[10]uint32{0x01459945, 0x0203541d, 0x01f9d9bd, 0x004a2bf4, 0x036abb5a, 0x0303a3b5, 0x0079e64b, 0x0285a1e5, 0x00bbaa06, 0x0011bfc1}}, Y: Field{[10]uint32{0x011bcd4a, 0x03e7693d, 0x0176491e, 0x00a5075c, 0x03e7e9d2, 0x011e986a, 0x0133bb9e, 0x02e838e4, 0x02c26af2, 0x002c4413}}}, + {X: Field{[10]uint32{0x02597ce2, 0x012a20ca, 0x02f86f3f, 0x02cf6092, 0x013bcdff, 0x022ec114, 0x0076e545, 0x0201a4ec, 0x00253888, 0x003286cf}}, Y: Field{[10]uint32{0x01e0285a, 0x006ff8a8, 0x03622005, 0x03d5e611, 0x01dfc9d6, 0x0367a07b, 0x0109d11b, 0x01b711d8, 0x02fbdd1b, 0x003c0a45}}}, + {X: Field{[10]uint32{0x01ece6b4, 0x011e8426, 0x01763ee7, 0x01dcae00, 0x005fad12, 0x0336f7ec, 0x03ec7fed, 0x027b123b, 0x029aadb6, 0x00032587}}, Y: Field{[10]uint32{0x018fb6e4, 0x00bc9a67, 0x022a984e, 0x00f0d7c2, 0x0056bb9b, 0x005b12dc, 0x00bb70ad, 0x014f949c, 0x0033e0b2, 0x0011a69b}}}, + {X: Field{[10]uint32{0x039d99dc, 0x03ca2fe4, 0x03393ea4, 0x03d6e6d9, 0x037b3132, 0x035139dd, 0x03817089, 0x0332534f, 0x02791418, 0x000e8ba8}}, Y: Field{[10]uint32{0x03f164be, 0x025b195a, 0x01f8831a, 0x02381949, 0x02b981bf, 0x02344f8b, 0x0217dc71, 0x036486f8, 0x0143c035, 0x00056014}}}, + {X: Field{[10]uint32{0x025a7a4a, 0x03b7a9ad, 0x01189e7d, 0x02333cd3, 0x034e24d4, 0x00bec700, 0x03fd6ad5, 0x03c2f868, 0x00dfb3a1, 0x000105b7}}, Y: Field{[10]uint32{0x00c204c3, 0x037444d8, 0x0235beba, 0x0028f1b2, 0x0147e90a, 0x004cb6cc, 0x01777812, 0x00cd66b0, 0x02c2bbc9, 0x001da427}}}, + {X: Field{[10]uint32{0x03c63eb3, 0x021516e4, 0x022b1731, 0x0312174a, 0x032ed9d1, 0x0352cfb4, 0x03a51772, 0x0305d422, 0x02459aef, 0x002ce5f0}}, Y: Field{[10]uint32{0x01e71748, 0x00732dbd, 0x03a7e447, 0x01d38c45, 0x02228135, 0x024810fb, 0x0018ffc6, 0x00d9daad, 0x03603076, 0x002841a8}}}, + {X: Field{[10]uint32{0x000637df, 0x03ce4275, 0x0306532e, 0x03034a68, 0x02c1bdb8, 0x03a026ca, 0x01dbb755, 0x005918ca, 0x009befd6, 0x001d7156}}, Y: Field{[10]uint32{0x03e6f631, 0x009eb7e8, 0x0347dcba, 0x025687f8, 0x0395e602, 0x007f39ae, 0x02a19dd8, 0x00417243, 0x01e51492, 0x0009bcf8}}}, + {X: Field{[10]uint32{0x029135a5, 0x039bc225, 0x018b6620, 0x02004679, 0x02e4b0dc, 0x00e6a411, 0x015158c4, 0x01d0c85f, 0x0112a351, 0x000bbbb3}}, Y: Field{[10]uint32{0x01aaba4c, 0x03d2474b, 0x03707806, 0x019c5051, 0x01136064, 0x031315e4, 0x013d7539, 0x023b4c6d, 0x03d048c5, 0x003877ba}}}, + {X: Field{[10]uint32{0x00be65d1, 0x000164e7, 0x00124aa1, 0x002b1d6b, 0x038cab86, 0x02b77699, 0x031d52e5, 0x0359419a, 0x00915d39, 0x002a607c}}, Y: Field{[10]uint32{0x013ed069, 0x0180101f, 0x00e7b66c, 0x01253ccd, 0x0188d4f1, 0x025b9442, 0x018b23c0, 0x000a4cb6, 0x03cb7ab6, 0x00132c27}}}, + {X: Field{[10]uint32{0x03d4ef62, 0x01302826, 0x0331a9aa, 0x01a4999a, 0x02545cd8, 0x01d679e7, 0x01260c9a, 0x00740828, 0x02e3a7e8, 0x0006867e}}, Y: Field{[10]uint32{0x00937902, 0x016dcaac, 0x0070789c, 0x03c1a2b8, 0x0379714d, 0x021df71e, 0x01bf7bfd, 0x0171a78a, 0x02578af2, 0x000a01f5}}}, + {X: Field{[10]uint32{0x0020c61a, 0x00a04f49, 0x00567195, 0x0052674c, 0x029b0f43, 0x0198b9dd, 0x036f1392, 0x03465835, 0x016c1ee7, 0x0033fe1a}}, Y: Field{[10]uint32{0x02d16df8, 0x0314b179, 0x030c147f, 0x008ad8ad, 0x023581f1, 0x00daee05, 0x0004b1a1, 0x025a4097, 0x00138a39, 0x002125f8}}}, + {X: Field{[10]uint32{0x0227ce8c, 0x02417887, 0x01cd66cc, 0x016a7969, 0x00966911, 0x03523ac1, 0x02a95824, 0x00d1e72a, 0x00204a8b, 0x001a05e9}}, Y: Field{[10]uint32{0x033052ad, 0x01ca4dde, 0x026fd95e, 0x0309d8c8, 0x028182a0, 0x01720e17, 0x03254653, 0x01e97261, 0x028bc337, 0x00256151}}}, + {X: Field{[10]uint32{0x01d9d58e, 0x00cf5b23, 0x03233bcd, 0x00656494, 0x037d114b, 0x01e51e3c, 0x013eb995, 0x03309abc, 0x00846e0e, 0x00273bff}}, Y: Field{[10]uint32{0x025d2582, 0x0342aa3e, 0x00426856, 0x00d0fa99, 0x00510602, 0x03bc71fb, 0x03c4d4af, 0x03e86c19, 0x021a5cf8, 0x003806b2}}}, + {X: Field{[10]uint32{0x03456c49, 0x03c3b734, 0x00543835, 0x00c63104, 0x03995a37, 0x00c0797e, 0x03965892, 0x03dff765, 0x01c6f203, 0x001a9b87}}, Y: Field{[10]uint32{0x0384496b, 0x02eb284d, 0x03482f93, 0x02fdbbf4, 0x0183b579, 0x02a5d51b, 0x01f9ad86, 0x00fa7ac1, 0x039898b9, 0x000a81ca}}}, + {X: Field{[10]uint32{0x02a9129b, 0x00c75f34, 0x036d24dd, 0x008626b0, 0x008ba3a5, 0x02e461ba, 0x018b4f0f, 0x01d86d45, 0x021a588d, 0x001f9eeb}}, Y: Field{[10]uint32{0x033dbdd6, 0x0215beaa, 0x0129dcc4, 0x02f03503, 0x0017e6bb, 0x0343e1ce, 0x01e60e57, 0x01731ca2, 0x023b3799, 0x0014663d}}}, + {X: Field{[10]uint32{0x006bd253, 0x0316cd40, 0x039f805d, 0x018fb84b, 0x03ffa158, 0x02a17954, 0x014966ff, 0x02acafb5, 0x03a863de, 0x00004ff0}}, Y: Field{[10]uint32{0x03821459, 0x016d5ddc, 0x01d58b3b, 0x0209c0b9, 0x03a8b77c, 0x039daa55, 0x00a59e76, 0x01415bff, 0x02459127, 0x0038c70c}}}, + {X: Field{[10]uint32{0x02e9c167, 0x02f1b445, 0x00ccbbec, 0x00983452, 0x03e56503, 0x03a27a92, 0x036dbeda, 0x03645fda, 0x01eb3f39, 0x003ff8a3}}, Y: Field{[10]uint32{0x01bb988a, 0x02abb5a7, 0x01b2c262, 0x03844a31, 0x01383c4b, 0x0380acff, 0x03857604, 0x01113794, 0x02b3b878, 0x00236294}}}, + {X: Field{[10]uint32{0x01cc57be, 0x020ec3c1, 0x003cd444, 0x0150772f, 0x00481c43, 0x003e83b3, 0x0379a883, 0x01b79f40, 0x00239bf2, 0x0000a3b5}}, Y: Field{[10]uint32{0x00ce126e, 0x001016c4, 0x00ac37bc, 0x01c866f4, 0x012d5608, 0x012e3616, 0x020d860b, 0x02399d14, 0x02e2ea01, 0x00064848}}}, + {X: Field{[10]uint32{0x03f8a708, 0x01cb22c2, 0x02d7276c, 0x00e0be01, 0x025aa4ca, 0x03b9da76, 0x02acc00e, 0x03121014, 0x027c7be8, 0x001efce0}}, Y: Field{[10]uint32{0x0159eebe, 0x0090fa29, 0x011726bb, 0x001c6b4a, 0x0224a75d, 0x035c75c1, 0x00601fa1, 0x014a6d17, 0x02eee505, 0x002497cf}}}, + {X: Field{[10]uint32{0x03ce7000, 0x0384e01b, 0x017a4a7b, 0x02accc28, 0x012acb5a, 0x007dedaf, 0x02de8627, 0x00070fe3, 0x0299021a, 0x0033c69f}}, Y: Field{[10]uint32{0x01d3d673, 0x02855756, 0x0078a7c3, 0x028fce2a, 0x035f1e70, 0x00ce8d18, 0x023e7400, 0x0298445a, 0x02837b3b, 0x00084d96}}}, + {X: Field{[10]uint32{0x01bb29c7, 0x02f2ba44, 0x02944afc, 0x019d4989, 0x02af3bdd, 0x02f42a61, 0x036c8121, 0x01f31038, 0x0237d151, 0x0039de7a}}, Y: Field{[10]uint32{0x038a8a2f, 0x03200575, 0x03f81e8a, 0x01b51706, 0x026472bb, 0x00a71bd0, 0x00e2c6c0, 0x01dd6a81, 0x01ac4b19, 0x000cb18d}}}, + {X: Field{[10]uint32{0x026c2a92, 0x02dfda3c, 0x002a1638, 0x00a23806, 0x02f96977, 0x030e0754, 0x019785d6, 0x01084056, 0x012b76b5, 0x00040c27}}, Y: Field{[10]uint32{0x018265a9, 0x02340819, 0x02a1a043, 0x02b3066d, 0x02f3abce, 0x03e4c4c5, 0x03b9b377, 0x0261c03b, 0x03834c85, 0x000087b7}}}, + {X: Field{[10]uint32{0x033a27f9, 0x039c8694, 0x00701813, 0x00469c50, 0x02f2b6b3, 0x0244c80d, 0x032240de, 0x011b50ba, 0x0309701e, 0x001e649e}}, Y: Field{[10]uint32{0x0358920f, 0x03613b4e, 0x039053b3, 0x03bae34a, 0x008a0f47, 0x0184d841, 0x00756403, 0x021b0693, 0x0113a818, 0x003edf19}}}, + {X: Field{[10]uint32{0x0128849e, 0x03631cc5, 0x0137e0fd, 0x038128f7, 0x03085b1d, 0x0338938f, 0x0193e683, 0x00d0a67d, 0x023377da, 0x001d0ed3}}, Y: Field{[10]uint32{0x002f3216, 0x0135ad9d, 0x014f1816, 0x039a1278, 0x01fbba7d, 0x02b9cca0, 0x03f178ca, 0x018fb1ec, 0x0069b5ee, 0x000de400}}}, + {X: Field{[10]uint32{0x004f04da, 0x01a18143, 0x02cbf498, 0x03ec29ce, 0x02e46064, 0x02547f9a, 0x02cd9b49, 0x02edfc6a, 0x02e10ce1, 0x0035cf34}}, Y: Field{[10]uint32{0x0253dde8, 0x01fd2b6c, 0x0209614b, 0x0138bc8a, 0x00cae7f8, 0x028cffc7, 0x0087fcd6, 0x039c7fd6, 0x02e44cc6, 0x0039a9d8}}}, + {X: Field{[10]uint32{0x01f6fa68, 0x00b5a5e5, 0x033e8ed3, 0x02051f01, 0x01ba6324, 0x01ecfafc, 0x03318a17, 0x0091acff, 0x00d3f563, 0x000f8700}}, Y: Field{[10]uint32{0x010776d3, 0x01cbc34b, 0x00ef6b4a, 0x000308ff, 0x0118ce2e, 0x02038e07, 0x036aecb0, 0x0304a440, 0x00cf87d5, 0x0037cad8}}}, + {X: Field{[10]uint32{0x0168053c, 0x03f71b36, 0x03221a32, 0x039318a6, 0x00ed90c2, 0x01d49b6d, 0x00f10e68, 0x00594f97, 0x039092da, 0x0025b81f}}, Y: Field{[10]uint32{0x01c2bd66, 0x0081e1d3, 0x036164ab, 0x03f8b978, 0x021f8517, 0x03eb4ee6, 0x0220ea5b, 0x03a9ae7b, 0x003bb8a2, 0x00359707}}}, + {X: Field{[10]uint32{0x03e1debb, 0x005deaab, 0x02854d8e, 0x0148ce18, 0x02d27a76, 0x00b81e5a, 0x01cc124b, 0x03b8094c, 0x004026b1, 0x001b48c1}}, Y: Field{[10]uint32{0x0179bbd3, 0x00ef027b, 0x012c2598, 0x00a2a33f, 0x00e3dc62, 0x0393b002, 0x03bde471, 0x011a2543, 0x0195faa1, 0x003cea3e}}}, + {X: Field{[10]uint32{0x01707781, 0x03f3bc79, 0x02d9dc76, 0x004692c1, 0x00ad7d45, 0x039c584e, 0x00e43c49, 0x027700c5, 0x035c1f94, 0x002376a7}}, Y: Field{[10]uint32{0x0001310d, 0x0229609a, 0x03a775c7, 0x03bc2b96, 0x01ad9d9b, 0x02dcdd0d, 0x03674f5d, 0x02c2944a, 0x03aa7585, 0x0034158f}}}, + {X: Field{[10]uint32{0x03de97cd, 0x028d5eee, 0x036c4e5a, 0x03ead309, 0x03b4bf17, 0x03ff6905, 0x02da369f, 0x01cd8fd7, 0x013f9866, 0x00141c18}}, Y: Field{[10]uint32{0x0034ebc2, 0x033c26f7, 0x008178a0, 0x01f921a9, 0x02eb40e4, 0x02c5b6e1, 0x005751f9, 0x01fa8d06, 0x02ff4fe7, 0x00002c83}}}, + {X: Field{[10]uint32{0x0316bce7, 0x024bac2b, 0x03a8efc7, 0x01d1aa6c, 0x0004986d, 0x0306a862, 0x038838ea, 0x00515ae6, 0x00f0bfab, 0x000e929c}}, Y: Field{[10]uint32{0x01c4f3e5, 0x03d68f2b, 0x01e248bd, 0x022608e0, 0x03843b3e, 0x0013a108, 0x0032980c, 0x023b6a86, 0x02931916, 0x00391492}}}, + {X: Field{[10]uint32{0x02b33532, 0x02448c2a, 0x01a38b52, 0x0264ef37, 0x02db5fba, 0x018c1dcf, 0x01a82f54, 0x0166a76a, 0x00921831, 0x000b373e}}, Y: Field{[10]uint32{0x017677b9, 0x00d61c1d, 0x02044e0a, 0x0248c8a4, 0x010fd956, 0x00aaf3a3, 0x02299e74, 0x00fcca17, 0x02eac911, 0x003223a9}}}, + {X: Field{[10]uint32{0x00955c99, 0x028b778a, 0x0203d781, 0x00082630, 0x022b7fed, 0x00cc667a, 0x02e0cd6f, 0x017d8404, 0x028df8f1, 0x0006a164}}, Y: Field{[10]uint32{0x00db4299, 0x00b38e5d, 0x02945568, 0x009147af, 0x010534a1, 0x001c970a, 0x013a6b03, 0x01da8ff8, 0x02b2821c, 0x0006ce61}}}, + {X: Field{[10]uint32{0x01a1d388, 0x01ae13c7, 0x02c1a6b6, 0x0198f988, 0x00dde019, 0x006e7c04, 0x01206634, 0x00c19685, 0x01a1d6b0, 0x0021b453}}, Y: Field{[10]uint32{0x0399b2de, 0x00e030a0, 0x01055fd1, 0x00f87db9, 0x01cfe568, 0x00e010b3, 0x004a6f9f, 0x017327a2, 0x00ec764f, 0x0019e545}}}, + {X: Field{[10]uint32{0x02201cc2, 0x0340d5c5, 0x01441565, 0x0265f091, 0x03300459, 0x02941e38, 0x03343415, 0x0321e50c, 0x014f0bdf, 0x003907dd}}, Y: Field{[10]uint32{0x010e8e8e, 0x02c3f75e, 0x02e47dcb, 0x0382ecf3, 0x000743f5, 0x024bba6d, 0x02f119f4, 0x00647b7f, 0x0241c21d, 0x00374165}}}, + {X: Field{[10]uint32{0x0075cae4, 0x0265b4d1, 0x022fc756, 0x01ea0ce3, 0x032946e1, 0x03911190, 0x0268d8f4, 0x02fb11e5, 0x026845b5, 0x002dfb24}}, Y: Field{[10]uint32{0x03dda53b, 0x018b9c53, 0x002cb7cc, 0x01425e3b, 0x00d945e3, 0x01e51dad, 0x02210f57, 0x027a4043, 0x018bb753, 0x0002ad28}}}, + {X: Field{[10]uint32{0x03518912, 0x01da752d, 0x009d456b, 0x02f020c9, 0x03bf3ecf, 0x02896142, 0x022554a0, 0x03786459, 0x01dcf1ea, 0x000903f6}}, Y: Field{[10]uint32{0x0104515b, 0x001ac234, 0x0220776a, 0x025cc4d4, 0x005318a8, 0x02a9aa01, 0x03a3a62e, 0x00e42214, 0x025ee0ba, 0x002bc0fe}}}, + {X: Field{[10]uint32{0x035bb769, 0x015c8de1, 0x00129a5c, 0x037e3c73, 0x022b88aa, 0x02330fea, 0x01e39d28, 0x00c4525e, 0x00ecee7d, 0x0000d4f1}}, Y: Field{[10]uint32{0x012d147e, 0x03693f34, 0x03cf02a0, 0x02e16b8c, 0x0228e607, 0x035c2ae3, 0x000118ba, 0x01384ba5, 0x004090af, 0x0027e9fb}}}, + {X: Field{[10]uint32{0x03d933de, 0x0200dd8a, 0x0082d39e, 0x02232f81, 0x03893409, 0x018a3f46, 0x0206ae11, 0x019a2045, 0x018aa855, 0x003d3bb5}}, Y: Field{[10]uint32{0x033b3d44, 0x01bc3e37, 0x03eb9160, 0x03e94b5f, 0x0118b40b, 0x0233ad03, 0x031969ca, 0x0381c341, 0x0364fe74, 0x00109e33}}}, + {X: Field{[10]uint32{0x026ef1ce, 0x004a4389, 0x000fa01a, 0x0029cdaf, 0x000b284f, 0x02d554b5, 0x00c17d50, 0x0099810d, 0x02e2e2d0, 0x001a63fe}}, Y: Field{[10]uint32{0x01ffc970, 0x00206638, 0x0143fab6, 0x03fec2f4, 0x038bd50c, 0x025bf04b, 0x027e53a4, 0x016dd076, 0x008d0784, 0x000659b3}}}, + {X: Field{[10]uint32{0x01314098, 0x01c48699, 0x0196b595, 0x028013ed, 0x0122d884, 0x005f2251, 0x020587d4, 0x0305035b, 0x016d5c88, 0x002d4ed6}}, Y: Field{[10]uint32{0x032c745a, 0x025eba23, 0x01a56771, 0x01c13306, 0x0025deeb, 0x01b0cbbb, 0x03de4857, 0x03f9db21, 0x00b909be, 0x00377fd8}}}, + {X: Field{[10]uint32{0x0213066a, 0x004bedc6, 0x02d65527, 0x01967d89, 0x00791518, 0x03a7c9da, 0x024cba67, 0x00efe75b, 0x0321d439, 0x0025d812}}, Y: Field{[10]uint32{0x028d17f8, 0x018988d2, 0x03616360, 0x0153e809, 0x027d871c, 0x00d5fc99, 0x005b0d17, 0x01fdf197, 0x0384e1cf, 0x0039ebbc}}}, + {X: Field{[10]uint32{0x01bb8623, 0x01213a54, 0x007edb63, 0x003b6875, 0x013b3876, 0x0018bdef, 0x02b234c1, 0x03b980c4, 0x01ba6eda, 0x001e8d72}}, Y: Field{[10]uint32{0x0184a5b1, 0x035a9093, 0x002457eb, 0x015e1bbe, 0x00769f3a, 0x03bdc128, 0x0292b586, 0x019d85ab, 0x027ba454, 0x000ce25e}}}, + {X: Field{[10]uint32{0x011e2804, 0x00836543, 0x03e01b6a, 0x005e19c1, 0x02c9638b, 0x0098c043, 0x026e0cc9, 0x00457728, 0x0075f989, 0x0021b503}}, Y: Field{[10]uint32{0x00315ca3, 0x00e1d0bb, 0x00410c0f, 0x010b105c, 0x01dddf28, 0x0211ad72, 0x031dcc8a, 0x02307839, 0x03624ffd, 0x001d66f5}}}, + {X: Field{[10]uint32{0x009badb7, 0x037acc58, 0x001ce3e8, 0x03a6ca90, 0x01fc77f6, 0x00ee4397, 0x03ddea49, 0x02de7d98, 0x03479a4b, 0x00180eff}}, Y: Field{[10]uint32{0x01a4f4b4, 0x008e6627, 0x0320ee1e, 0x0377700d, 0x03358c86, 0x034ce80b, 0x02eefffc, 0x006aa9ab, 0x01fc6528, 0x00018a1e}}}, + {X: Field{[10]uint32{0x032203ed, 0x039a2c40, 0x03d7b5de, 0x03705261, 0x00fa13eb, 0x029d68db, 0x01e0bbf8, 0x01e9f5c8, 0x00f3c7dc, 0x0001722e}}, Y: Field{[10]uint32{0x0208e7d3, 0x0124d033, 0x0190ce77, 0x0328506f, 0x013faa43, 0x023f35b9, 0x01d304d8, 0x031af5f6, 0x03382bc4, 0x001ad807}}}, + {X: Field{[10]uint32{0x0144fb05, 0x018f3a1d, 0x00505a79, 0x01fa4024, 0x0025a6f2, 0x020edcde, 0x027a55ff, 0x02530907, 0x02c5a916, 0x000c4f07}}, Y: Field{[10]uint32{0x003c6384, 0x01980dc4, 0x02e59825, 0x023891d4, 0x0101ed85, 0x031118b1, 0x0244699b, 0x0197ebed, 0x03ff9a43, 0x00270c54}}}, + {X: Field{[10]uint32{0x01d923bd, 0x000550ea, 0x006bf98b, 0x03569e5d, 0x00150b4b, 0x01a383e8, 0x0268cb29, 0x02bbecc0, 0x02514616, 0x000146b2}}, Y: Field{[10]uint32{0x02e028b4, 0x0115e9d3, 0x001cc203, 0x0310c77d, 0x01a0a66e, 0x0138acd8, 0x0163ca4f, 0x01dd1eff, 0x01b4073a, 0x001f147e}}}, + {X: Field{[10]uint32{0x0219677d, 0x01edb0c9, 0x00a122ab, 0x0359dd0f, 0x01353071, 0x02efa5ea, 0x036d3f92, 0x00192124, 0x039927ea, 0x0012ba34}}, Y: Field{[10]uint32{0x008a47a3, 0x019df50f, 0x027c919e, 0x01790d4b, 0x000f350f, 0x0244414e, 0x02a332b0, 0x02f3a0e3, 0x019bc251, 0x003e7714}}}, + {X: Field{[10]uint32{0x0256dcca, 0x01e137a8, 0x0257baa0, 0x022712bc, 0x03b100c2, 0x021352ef, 0x01a054a8, 0x02d68230, 0x015d3f9c, 0x001af472}}, Y: Field{[10]uint32{0x03803b5b, 0x0153be1a, 0x03e71396, 0x015ea221, 0x00801923, 0x02c1f79e, 0x031fc401, 0x02c4bdbd, 0x003bde39, 0x001e4d8a}}}, + {X: Field{[10]uint32{0x0249480e, 0x0374a0ea, 0x028ce19b, 0x00027be7, 0x035737f7, 0x001feef2, 0x0370a62e, 0x032ab6b8, 0x02294642, 0x003889e2}}, Y: Field{[10]uint32{0x0037dd01, 0x03c50ed2, 0x00f77b36, 0x02d60f59, 0x01087bc8, 0x0360bd87, 0x03570b7e, 0x00f39cd6, 0x03cdf394, 0x0010c48b}}}, + {X: Field{[10]uint32{0x0296c644, 0x03d2b13f, 0x0071ffee, 0x00b02c89, 0x008d24fb, 0x00ccd60c, 0x004bb019, 0x01a7f744, 0x00d59f94, 0x001a14df}}, Y: Field{[10]uint32{0x0000050e, 0x018f2061, 0x024a7320, 0x01165e77, 0x004003ab, 0x01b8ec67, 0x0399ff32, 0x01e9476f, 0x00ef4110, 0x001d94d8}}}, + {X: Field{[10]uint32{0x025af330, 0x024281dd, 0x03b54b12, 0x03bcfe06, 0x0070be08, 0x03022209, 0x00a0735f, 0x027e7e3e, 0x03c669c9, 0x0017b27f}}, Y: Field{[10]uint32{0x0163b222, 0x0084e5c4, 0x03b381a4, 0x03737472, 0x001f4f1c, 0x015ad1f0, 0x00c32290, 0x021c581e, 0x0008e76f, 0x002aed50}}}, + {X: Field{[10]uint32{0x004dfae9, 0x02661d1c, 0x0231db23, 0x03d8572b, 0x0101a330, 0x01945528, 0x0071aba4, 0x00c3eea5, 0x008e5d49, 0x00138006}}, Y: Field{[10]uint32{0x01317868, 0x02ee0753, 0x02bba57f, 0x00a74821, 0x015ed3fe, 0x016d0082, 0x03656dd3, 0x00daa9cf, 0x03302824, 0x0001f9db}}}, + {X: Field{[10]uint32{0x015ed984, 0x0377f57c, 0x02e3c8aa, 0x0392f4ed, 0x03a2659c, 0x0130bcfe, 0x0139edeb, 0x0054bbff, 0x03a4d480, 0x0012b8d1}}, Y: Field{[10]uint32{0x02d4e523, 0x00b170d8, 0x033070ca, 0x0307cd71, 0x0165bb6a, 0x029cb18d, 0x02b8ba7b, 0x033f7d3e, 0x03460d44, 0x000e0f8b}}}, + {X: Field{[10]uint32{0x006665ef, 0x03386e27, 0x0319c603, 0x031363dd, 0x0235fd09, 0x01942697, 0x02d90fc8, 0x02b03be5, 0x0224a8d3, 0x000cb2b7}}, Y: Field{[10]uint32{0x038bea36, 0x004342be, 0x036af55c, 0x03cb8324, 0x02266939, 0x032a27e6, 0x023c5aa6, 0x02c4dd6d, 0x00735c63, 0x0021c9ce}}}, + {X: Field{[10]uint32{0x01cfcbee, 0x00891114, 0x0204f5f4, 0x030f53dc, 0x0320c703, 0x03e1f08b, 0x00e68910, 0x01d5d9ab, 0x01956014, 0x002393bc}}, Y: Field{[10]uint32{0x02ed47af, 0x025c1b81, 0x00666045, 0x00332527, 0x02cd5b9d, 0x0003ef3f, 0x02da0afc, 0x01f06de7, 0x02e389d9, 0x0000be9c}}}, + {X: Field{[10]uint32{0x00a2c30a, 0x01f9ffe9, 0x02509aae, 0x005a7bf0, 0x01559d73, 0x02181e80, 0x01549911, 0x000fdb13, 0x035c4adc, 0x000d7f55}}, Y: Field{[10]uint32{0x0248e000, 0x012b7472, 0x00aa1347, 0x03367252, 0x03dbf3ee, 0x033442b1, 0x0300926d, 0x02079f2d, 0x039d2748, 0x003e695d}}}, + {X: Field{[10]uint32{0x010a9cf6, 0x00d7fb72, 0x032873c6, 0x017d7d76, 0x03efc12f, 0x031049b1, 0x00929a52, 0x00965452, 0x00507fd0, 0x0024cb93}}, Y: Field{[10]uint32{0x028ba783, 0x0187be6e, 0x01f2875f, 0x03ef36fc, 0x009e84ef, 0x034660b0, 0x036b1b24, 0x028670a7, 0x0221bbac, 0x00339af2}}}, + {X: Field{[10]uint32{0x01fbea11, 0x01175cd2, 0x03fb211a, 0x02b4d77a, 0x0355d3e2, 0x03d165c1, 0x036a37f2, 0x014706f8, 0x024422a0, 0x0032b637}}, Y: Field{[10]uint32{0x001c347a, 0x008e99bc, 0x013e0533, 0x035e2a7f, 0x01308eeb, 0x013e1bc4, 0x0241c903, 0x01a7ca02, 0x031d4f66, 0x00122c37}}}, + {X: Field{[10]uint32{0x009594d6, 0x03efa41b, 0x0357b462, 0x0323f3ad, 0x031919ff, 0x032cd8e0, 0x016aa646, 0x03eb9f40, 0x0304c847, 0x0027f1f4}}, Y: Field{[10]uint32{0x019860ff, 0x038e9143, 0x03c9e516, 0x01b39352, 0x00196367, 0x01ebf729, 0x029dd38a, 0x02861f36, 0x00e13bc6, 0x003745f0}}}, + {X: Field{[10]uint32{0x008b5849, 0x00d5d866, 0x000b4c89, 0x03dd305f, 0x008300e4, 0x02537aee, 0x00654538, 0x0281771a, 0x00df10d4, 0x00106e9b}}, Y: Field{[10]uint32{0x007ad4c5, 0x026107f9, 0x03ac5930, 0x02133c54, 0x01ece57e, 0x00a0ccc8, 0x031e278b, 0x00259795, 0x03158c3f, 0x001fad8a}}}, + {X: Field{[10]uint32{0x01c7377b, 0x01ee9104, 0x02884b22, 0x0037c15f, 0x03d5bbf3, 0x03bee1a4, 0x0174248c, 0x01ab9a8b, 0x025aaef3, 0x0007fe7f}}, Y: Field{[10]uint32{0x01e74278, 0x00815d7c, 0x00692165, 0x01416f99, 0x01506908, 0x032d57c2, 0x009cf41f, 0x0000e127, 0x036c585c, 0x001ae892}}}, + {X: Field{[10]uint32{0x03f5d660, 0x03ce31b2, 0x03ebd893, 0x00507e3d, 0x026d1348, 0x0215b09c, 0x019d0704, 0x01b4a79b, 0x00440d70, 0x000a675f}}, Y: Field{[10]uint32{0x0103ff32, 0x0217ba8b, 0x000400fc, 0x03fe6d25, 0x0062f7d1, 0x01b7a6b3, 0x01b48877, 0x01d3832a, 0x00f34d03, 0x0003929d}}}, + {X: Field{[10]uint32{0x02e3a67d, 0x02caff5c, 0x012d69f7, 0x00b73a94, 0x020b607c, 0x00f5ba4e, 0x0318ceb8, 0x03261db8, 0x02d90ec1, 0x00280ccf}}, Y: Field{[10]uint32{0x03a0539e, 0x0216467e, 0x0141e0d6, 0x00eedae2, 0x0019f83e, 0x007f9ed4, 0x03373932, 0x01da74d6, 0x03655f51, 0x00369f74}}}, + {X: Field{[10]uint32{0x004251e0, 0x02e13e90, 0x020d2e75, 0x0005593a, 0x032821cf, 0x02a5a197, 0x00093d0b, 0x028cc14d, 0x02a22e52, 0x00169104}}, Y: Field{[10]uint32{0x030e4313, 0x0101e363, 0x0300c7cd, 0x009d53ad, 0x033675ab, 0x001b4a4e, 0x010bc0ab, 0x015c3a0e, 0x00e07e6c, 0x001a91e2}}}, + {X: Field{[10]uint32{0x02b7b0b5, 0x008f3d8c, 0x03cdc3e8, 0x00770bf9, 0x01078335, 0x01a7e6d9, 0x0134ea6a, 0x00771839, 0x004c3b14, 0x0035dcbb}}, Y: Field{[10]uint32{0x009ac0df, 0x00a6f99a, 0x03cfdda9, 0x00bf6e26, 0x01c9ccd9, 0x036ace08, 0x010979dd, 0x0121f9c2, 0x000d1036, 0x002f64d0}}}, + {X: Field{[10]uint32{0x01f89336, 0x0288d9db, 0x0321cd04, 0x0293b284, 0x03d4452f, 0x03903e01, 0x033e1cd6, 0x0130effe, 0x02d2c769, 0x002525e0}}, Y: Field{[10]uint32{0x02d436dc, 0x0351672e, 0x00930b68, 0x005325ef, 0x019f4e2c, 0x03358f15, 0x032e5dbb, 0x008ad50d, 0x027fb8ba, 0x0039f179}}}, + {X: Field{[10]uint32{0x0057e6de, 0x013d85a9, 0x0070e233, 0x032185dd, 0x036d9ca0, 0x031271c7, 0x00a9e4d4, 0x03d67cf8, 0x01f575e6, 0x001fb9f5}}, Y: Field{[10]uint32{0x03d9f3ee, 0x01ccbbb5, 0x03d0197e, 0x000b5a81, 0x029cbbbe, 0x01be8c42, 0x0074add7, 0x00f99b24, 0x029c7612, 0x001118b6}}}, + {X: Field{[10]uint32{0x013f843e, 0x02baedec, 0x0320b50f, 0x011c2ee0, 0x018a5548, 0x01505e54, 0x005ba7c1, 0x011ed6de, 0x030ae08d, 0x001e92d8}}, Y: Field{[10]uint32{0x01937c00, 0x035c1da7, 0x025dc6b5, 0x00641fe7, 0x0269a3b2, 0x02d26037, 0x023a524d, 0x0007a5c5, 0x004fb868, 0x00328939}}}, + {X: Field{[10]uint32{0x02a82b96, 0x0071b2c6, 0x037939c3, 0x03cca653, 0x013a18ee, 0x02ed88f0, 0x02a55032, 0x03102902, 0x0242428a, 0x0034b642}}, Y: Field{[10]uint32{0x0234972a, 0x013568fc, 0x03b66746, 0x01b960b7, 0x01394a3b, 0x002c7838, 0x0039e064, 0x03567cc0, 0x02332367, 0x001d614b}}}, + {X: Field{[10]uint32{0x015d13e0, 0x0382c5ba, 0x01b91340, 0x017120d2, 0x03a4809b, 0x00bb53cb, 0x01b56066, 0x037ecf68, 0x01ab6206, 0x00364926}}, Y: Field{[10]uint32{0x0271be38, 0x00a6caac, 0x0294111f, 0x0192f800, 0x00fa4dfc, 0x024eae98, 0x01400749, 0x03f86a3e, 0x00ed26a4, 0x00108d51}}}, + {X: Field{[10]uint32{0x01d09a23, 0x020c3d71, 0x034dc8d5, 0x02f9b1af, 0x02bba6f2, 0x02dffe1e, 0x00e2d315, 0x01799b49, 0x02c25887, 0x003b0307}}, Y: Field{[10]uint32{0x00591421, 0x02e9058a, 0x00d7aee8, 0x0261d601, 0x018b798c, 0x01822fde, 0x009a237e, 0x02f46071, 0x03f1648a, 0x003949a9}}}, + {X: Field{[10]uint32{0x03ba8863, 0x0384025a, 0x00c2ef30, 0x00205de6, 0x003a6ae5, 0x0243a814, 0x01b48052, 0x01662621, 0x0168835b, 0x001a4e02}}, Y: Field{[10]uint32{0x0311e5f4, 0x01c3d78b, 0x03345a61, 0x01d6064b, 0x037522df, 0x005341f1, 0x0297137a, 0x02e98d14, 0x039d80f0, 0x001c6fa8}}}, + {X: Field{[10]uint32{0x00a9ab23, 0x02b7237f, 0x0062bebb, 0x0177d65b, 0x0115a40a, 0x007fcbfb, 0x00fe8d2e, 0x018df913, 0x01a19fd1, 0x00359ac7}}, Y: Field{[10]uint32{0x006b9946, 0x01a51d96, 0x03b6878a, 0x00749960, 0x015cc5d9, 0x001eccc5, 0x0217c4e6, 0x012edc72, 0x00ebbd2b, 0x001a33d9}}}, + {X: Field{[10]uint32{0x0298c95f, 0x0037220c, 0x01695a51, 0x01729ad6, 0x01503647, 0x0264c590, 0x0350d70c, 0x018b2e49, 0x00a2c6fa, 0x00277663}}, Y: Field{[10]uint32{0x00fbe821, 0x00381f6b, 0x03c8187a, 0x0017663f, 0x03407509, 0x018ecc76, 0x01278b7e, 0x02735be3, 0x03b853b9, 0x00156a22}}}, + {X: Field{[10]uint32{0x0141bfa2, 0x02a6b7b4, 0x01b925b9, 0x02336dea, 0x014efd84, 0x03078b5c, 0x00ecccd0, 0x03c6efa9, 0x002c842c, 0x0006d9af}}, Y: Field{[10]uint32{0x03673bea, 0x02e69c20, 0x00a890dd, 0x000620c7, 0x02402b35, 0x02108f2d, 0x003d88b6, 0x020ae2bd, 0x030155fe, 0x003f82d1}}}, + {X: Field{[10]uint32{0x00eb688a, 0x001d72b2, 0x00312c1c, 0x03243c3a, 0x03c7d2d5, 0x0248b800, 0x016a61c2, 0x00c77b4e, 0x01c48a92, 0x0002ca03}}, Y: Field{[10]uint32{0x02738a74, 0x0338c1b4, 0x03ff7da9, 0x01854c73, 0x00498c82, 0x00aeaebc, 0x02cb3ad6, 0x02f99acc, 0x01a6a2f8, 0x00206dd1}}}, + {X: Field{[10]uint32{0x018a6b5d, 0x0073717c, 0x0280f8cf, 0x01b3c055, 0x02413e90, 0x00438ba4, 0x00125ad5, 0x02e8720a, 0x011c9eb3, 0x001ef165}}, Y: Field{[10]uint32{0x00352a07, 0x02bd69a6, 0x01a1cd43, 0x03c3b88a, 0x000fbda2, 0x026b71b5, 0x026fc7f4, 0x02a2f6e2, 0x01d8480b, 0x00106e41}}}, + {X: Field{[10]uint32{0x02eabfc1, 0x00b14efd, 0x02ea34ed, 0x0023713c, 0x01116479, 0x0172a1a5, 0x02530952, 0x015235da, 0x00d12318, 0x001a7fdd}}, Y: Field{[10]uint32{0x03de2419, 0x02f9dd6b, 0x01bde0d4, 0x025f7325, 0x011d6173, 0x00eb7d7f, 0x02aca1eb, 0x027de04b, 0x02288eb9, 0x003ce8f9}}}, + {X: Field{[10]uint32{0x004af209, 0x014b86b2, 0x003b92c5, 0x0262a83c, 0x02ffa460, 0x039fda26, 0x028f8cdd, 0x034e967e, 0x013f01f6, 0x0017f9b7}}, Y: Field{[10]uint32{0x00dbfb55, 0x02f1d3d8, 0x01aacd6d, 0x00589d28, 0x03f356cc, 0x015443ab, 0x01197a91, 0x0340893b, 0x0101acb8, 0x0027baba}}}, + {X: Field{[10]uint32{0x0105f5f0, 0x008b9671, 0x023b121d, 0x031e3338, 0x01d3b52b, 0x0314fe44, 0x029fafe9, 0x01d76dd1, 0x0122cb04, 0x0011a7a4}}, Y: Field{[10]uint32{0x0058d812, 0x0138bf04, 0x0237ecb8, 0x0200276d, 0x0280d8a5, 0x01348b09, 0x025825fa, 0x02e9afd6, 0x03a838b2, 0x003f9d21}}}, + {X: Field{[10]uint32{0x0160e6ab, 0x018ed364, 0x00c1c06d, 0x0061c307, 0x0072a5e7, 0x02cc3e39, 0x01f816e8, 0x00a48ecb, 0x02bf06b6, 0x0007d28f}}, Y: Field{[10]uint32{0x01c89e2f, 0x031a9853, 0x02d39b77, 0x037a21c1, 0x011ebeeb, 0x00a6299f, 0x0138bd40, 0x02b86626, 0x02957602, 0x00263684}}}, + {X: Field{[10]uint32{0x03b86b0f, 0x01e3af54, 0x00773c2f, 0x00b743e9, 0x00411722, 0x01bd4428, 0x00226ac2, 0x03fc333b, 0x01fe1c12, 0x00363aa5}}, Y: Field{[10]uint32{0x006288d9, 0x03bd1ca3, 0x03f5b25f, 0x026e8075, 0x01f154b5, 0x03a4b092, 0x00bebb3c, 0x03ca4ee2, 0x039edde6, 0x000556fb}}}, + {X: Field{[10]uint32{0x0227cac6, 0x01ef53c4, 0x02527179, 0x017771fc, 0x002bb36f, 0x01c114c0, 0x014b2cf8, 0x0201c488, 0x03c797b3, 0x0006b628}}, Y: Field{[10]uint32{0x0057814c, 0x00f017d2, 0x02a1ccfa, 0x01741355, 0x0158398c, 0x03f3d47b, 0x00189576, 0x008dfc55, 0x03aa3755, 0x001a029d}}}, + {X: Field{[10]uint32{0x00fa7d66, 0x03b0c609, 0x0292a3fd, 0x02cb0caa, 0x00355540, 0x03c2c3e2, 0x01426469, 0x0349b836, 0x010405d1, 0x003ffa9c}}, Y: Field{[10]uint32{0x0034eac8, 0x03413089, 0x00ed4cb5, 0x02bcb299, 0x00081f67, 0x01c0bb75, 0x02c8db75, 0x0281b113, 0x00e22d8d, 0x003b2891}}}, + {X: Field{[10]uint32{0x0159d8ab, 0x0192b22e, 0x00f3fc17, 0x02e95764, 0x01d3abe9, 0x03f5bd9d, 0x02141c8c, 0x02226152, 0x03a3f7fc, 0x0012b156}}, Y: Field{[10]uint32{0x00be2bd2, 0x02f24efe, 0x039ce15b, 0x02d06f61, 0x03714821, 0x0062c412, 0x0252d141, 0x03edeff4, 0x0391f135, 0x00271eca}}}, + {X: Field{[10]uint32{0x03718ac4, 0x01ebd42e, 0x01536fe2, 0x02a72949, 0x02bc7061, 0x0196e280, 0x01de0eb8, 0x02933bca, 0x00677aa9, 0x0017e051}}, Y: Field{[10]uint32{0x00d9c042, 0x033c4064, 0x01b3669a, 0x0251cf8e, 0x022b8cb8, 0x00c07ec0, 0x00340716, 0x02c9bf99, 0x01dc4062, 0x002f6a59}}}, + {X: Field{[10]uint32{0x01dd88bb, 0x03ac551d, 0x0390388b, 0x029346b2, 0x02da5f96, 0x016607cc, 0x029f2130, 0x01d2612c, 0x03043791, 0x003cdcb2}}, Y: Field{[10]uint32{0x02367d89, 0x002ad186, 0x00efcb2a, 0x03b38cb1, 0x007ceda2, 0x01a50653, 0x00a0ea07, 0x03540068, 0x035c1e62, 0x0020b5a3}}}, + {X: Field{[10]uint32{0x0359b128, 0x0314c82e, 0x026927a3, 0x03c890f8, 0x02878ec6, 0x03efe92c, 0x03133753, 0x0011e0d8, 0x03c54576, 0x0003ec4a}}, Y: Field{[10]uint32{0x0153aef5, 0x01af9712, 0x03e17a92, 0x01dff5ef, 0x01961930, 0x009329a0, 0x01ac0cba, 0x0386d6ed, 0x011867da, 0x000fe080}}}, + {X: Field{[10]uint32{0x00c0ea07, 0x03fe0658, 0x02447316, 0x0286c2a4, 0x034adafe, 0x01ea5d1f, 0x03075601, 0x0128d3d0, 0x01ac918a, 0x000f65d6}}, Y: Field{[10]uint32{0x02018aaa, 0x02956695, 0x03ecc6fc, 0x0299defa, 0x00caa317, 0x02a5925f, 0x031d5dda, 0x00cc2ad9, 0x03cf6d6a, 0x00033676}}}, + {X: Field{[10]uint32{0x023e00ce, 0x015720bf, 0x02909844, 0x037d6390, 0x019f476f, 0x01a6f1f7, 0x0349be46, 0x014870fe, 0x02b3699c, 0x003ab82a}}, Y: Field{[10]uint32{0x0317259e, 0x01feb853, 0x00bdd977, 0x0078478c, 0x0362c7ef, 0x017a0228, 0x0377b562, 0x039f0a66, 0x00dd450e, 0x002eb73a}}}, + {X: Field{[10]uint32{0x011eb851, 0x002afb51, 0x0338455e, 0x01f49328, 0x0343718a, 0x0097b974, 0x0225d0e9, 0x033aa95d, 0x02eec2c0, 0x003fb494}}, Y: Field{[10]uint32{0x002c648f, 0x0296a2ba, 0x03b4c457, 0x007173c2, 0x00dd0721, 0x001d5bd9, 0x0166b277, 0x03bf3087, 0x02ae56ce, 0x0019aeed}}}, + {X: Field{[10]uint32{0x017f9dbd, 0x021e4e8b, 0x013c9bc0, 0x00be74c0, 0x022362af, 0x02eac2c8, 0x03fb04d3, 0x030f0505, 0x02bd022a, 0x003698e7}}, Y: Field{[10]uint32{0x022466d5, 0x029ed3a0, 0x0031c10a, 0x03a8f9e8, 0x003627aa, 0x00daef95, 0x034ed0d5, 0x03a7cbe9, 0x022055f1, 0x0020fc9d}}}, + {X: Field{[10]uint32{0x02ab90dd, 0x01f3f09f, 0x0282ce09, 0x029ab2b9, 0x0132ced2, 0x031c77e4, 0x00d3ac67, 0x0116bd35, 0x00ded773, 0x00149349}}, Y: Field{[10]uint32{0x02b7f5c2, 0x01e81d3e, 0x03b01b2f, 0x000221ec, 0x032d010a, 0x003f9f3f, 0x036f55c9, 0x01f170c6, 0x00f7c692, 0x003933d7}}}, + {X: Field{[10]uint32{0x00ae4f94, 0x03149a15, 0x021c4b24, 0x02917ef0, 0x0028672d, 0x00a185ed, 0x007cde0c, 0x02d830d7, 0x02d5fb52, 0x001f6b0b}}, Y: Field{[10]uint32{0x03794038, 0x023b83f9, 0x0309ea57, 0x02db4a0a, 0x02f6cc11, 0x034919b0, 0x035c4a2b, 0x022199c2, 0x007ae916, 0x00331ab3}}}, + {X: Field{[10]uint32{0x016083ae, 0x01472fb9, 0x03ea6f7c, 0x02728e24, 0x02887e5d, 0x003a4a46, 0x019d10d0, 0x03d67dae, 0x024dda61, 0x0017d1ad}}, Y: Field{[10]uint32{0x0283a8ae, 0x007cf678, 0x0182e5ee, 0x02e9f86d, 0x0109bfa6, 0x0155ca4a, 0x02dcfb9c, 0x00995541, 0x0055da25, 0x001810f4}}}, + {X: Field{[10]uint32{0x01e14aa3, 0x0258685f, 0x03635175, 0x0308e29f, 0x0348ef0f, 0x023177c3, 0x0241ec2b, 0x017c85b9, 0x0033b6a2, 0x002218fb}}, Y: Field{[10]uint32{0x02b42541, 0x032c4ac3, 0x037a117d, 0x020f683f, 0x0345b2a5, 0x01241956, 0x00292777, 0x016070be, 0x00f31e52, 0x00275986}}}, + {X: Field{[10]uint32{0x03a2f9f4, 0x035a9a0c, 0x02a03a1b, 0x03dcfa4b, 0x03b377f3, 0x03c9be47, 0x00184c7e, 0x016739b6, 0x00463ac4, 0x0021500d}}, Y: Field{[10]uint32{0x01b399cb, 0x03dc9e31, 0x01430438, 0x03c8ec32, 0x018f7719, 0x00c4ff8d, 0x012a5b18, 0x019266c9, 0x02968ac5, 0x000b47c4}}}, + {X: Field{[10]uint32{0x02223c7f, 0x032b7597, 0x03201379, 0x009d7adf, 0x006a325d, 0x018899ad, 0x0251dbc3, 0x0104aff9, 0x03f6217e, 0x0002fdac}}, Y: Field{[10]uint32{0x03ba748b, 0x02c6bbe5, 0x03eaf0a9, 0x0035abc6, 0x01ebfad9, 0x03bb8f7b, 0x0041e7dc, 0x029157ec, 0x0154c14a, 0x00284582}}}, + {X: Field{[10]uint32{0x02d9e59d, 0x009396af, 0x03ffc771, 0x00662e86, 0x03860ca2, 0x0026a933, 0x02079ea4, 0x0184d52a, 0x002d3c18, 0x0012c808}}, Y: Field{[10]uint32{0x035b8873, 0x017a2a43, 0x002bab55, 0x01154418, 0x007703eb, 0x03c47641, 0x01d858f2, 0x0302c2e9, 0x0103c107, 0x0027da11}}}, + {X: Field{[10]uint32{0x02421dd2, 0x01a96a81, 0x03e28268, 0x03c989f2, 0x0199c050, 0x009ed64c, 0x024f5331, 0x02692ce8, 0x00806d67, 0x001021fe}}, Y: Field{[10]uint32{0x0188e8b9, 0x01c1f4af, 0x0121b5a5, 0x0105627e, 0x01698800, 0x0263d696, 0x008c8836, 0x035220cf, 0x0184b3d9, 0x00120e2b}}}, + {X: Field{[10]uint32{0x0297b79c, 0x0244c6bf, 0x02ac766d, 0x00131e43, 0x00538775, 0x01693f0d, 0x01b91e00, 0x01d01a8b, 0x0287cb2e, 0x000569e4}}, Y: Field{[10]uint32{0x014a238a, 0x029069ae, 0x003fadf2, 0x033ee5aa, 0x031bd597, 0x00b18583, 0x03ce497c, 0x01cb8f4f, 0x03220765, 0x0027d3bc}}}, + {X: Field{[10]uint32{0x03bcecbe, 0x026cd0f8, 0x02812273, 0x0029f888, 0x02404fb1, 0x032cf502, 0x0233d61b, 0x012f13fc, 0x0063c052, 0x000713e8}}, Y: Field{[10]uint32{0x02d48bd6, 0x0231cf58, 0x003533aa, 0x02cafd34, 0x03d39c90, 0x035cc2ca, 0x0209e9eb, 0x00bbae5c, 0x01eca2d8, 0x000aa158}}}, + {X: Field{[10]uint32{0x01f2a636, 0x0058ed6b, 0x02c2656d, 0x029b5221, 0x02bb50b8, 0x014c4bca, 0x03936c18, 0x02cb1499, 0x03a743c1, 0x00281c22}}, Y: Field{[10]uint32{0x031a20ea, 0x017a534d, 0x00324584, 0x0188d669, 0x007dc66a, 0x004b874b, 0x01b81550, 0x022331b2, 0x01f19169, 0x002563d1}}}, + {X: Field{[10]uint32{0x00acad7d, 0x00de4f3a, 0x02858c21, 0x0152c4a6, 0x0109b797, 0x00b8cfff, 0x009d71f0, 0x010b9b84, 0x034df01a, 0x0035e582}}, Y: Field{[10]uint32{0x03deb920, 0x03078676, 0x00707d81, 0x024d8c46, 0x02335661, 0x03195cc2, 0x003d0e1d, 0x0074ad87, 0x01aa5a84, 0x00232bc6}}}, + {X: Field{[10]uint32{0x038ba611, 0x030c902f, 0x03789daa, 0x01b9ba28, 0x02a7c450, 0x03f286cc, 0x0225ba38, 0x01c3565b, 0x006bf8ba, 0x001e80f7}}, Y: Field{[10]uint32{0x037d9028, 0x021293df, 0x03881fcb, 0x0207425a, 0x00048a36, 0x01dcf85c, 0x023e378b, 0x01a15969, 0x0222292d, 0x001c3c67}}}, + {X: Field{[10]uint32{0x03443b97, 0x00e3c971, 0x01dbac2f, 0x0281c9bf, 0x01da516c, 0x01b20ea9, 0x0189850c, 0x00d0470e, 0x0262a8fa, 0x0014ea69}}, Y: Field{[10]uint32{0x03945e25, 0x03fd6780, 0x0036e140, 0x0316e00c, 0x022adcfd, 0x01134797, 0x013279e8, 0x030c6fcc, 0x02506179, 0x00177ab0}}}, + {X: Field{[10]uint32{0x02b2cdf7, 0x0143673f, 0x036f20a4, 0x02ca1da0, 0x01b7ee99, 0x0306eeaa, 0x0269af63, 0x00361bff, 0x02b63dbb, 0x0021ae51}}, Y: Field{[10]uint32{0x0374b1fa, 0x012d6603, 0x03a62ed7, 0x03006665, 0x037cbc39, 0x00793c4c, 0x018ea1ba, 0x038a9b2c, 0x0383d3d0, 0x0011101d}}}, + {X: Field{[10]uint32{0x03752d8e, 0x0054b9bb, 0x019babef, 0x03fee9c7, 0x036b28c8, 0x0034908f, 0x01567262, 0x012d1bda, 0x00f5cb88, 0x00033a07}}, Y: Field{[10]uint32{0x02a9248c, 0x02d50117, 0x009262d0, 0x03fca243, 0x02979177, 0x001306aa, 0x01bf924c, 0x019130d2, 0x01738120, 0x001d6bf6}}}, + {X: Field{[10]uint32{0x01172ed9, 0x033a4b78, 0x02b8fbc6, 0x010c4ce8, 0x037b791d, 0x01f55f51, 0x006cb9e4, 0x0134b67e, 0x02413a46, 0x0010441b}}, Y: Field{[10]uint32{0x036741c6, 0x031be87d, 0x03374d2e, 0x00a9cde6, 0x002ce4e4, 0x01ce83e2, 0x01601a27, 0x0082e001, 0x00c230e9, 0x0038b291}}}, + {X: Field{[10]uint32{0x00b49777, 0x0106d288, 0x001524e1, 0x0328814b, 0x03bca3f1, 0x01eb1bda, 0x006541ec, 0x00284b95, 0x02a04e83, 0x003a707c}}, Y: Field{[10]uint32{0x02a58124, 0x0247e6cc, 0x0030886b, 0x0087d754, 0x005ca737, 0x0059c4b2, 0x0173fcd5, 0x004b08a6, 0x004308dd, 0x001477ce}}}, + {X: Field{[10]uint32{0x033bbf2c, 0x0173c579, 0x01511fce, 0x009d0943, 0x039be21f, 0x00554b8e, 0x0225775f, 0x03fcf92e, 0x012dc5e8, 0x0022ee78}}, Y: Field{[10]uint32{0x000d1152, 0x03c46a34, 0x0162f91e, 0x022af08e, 0x02b4d096, 0x03067137, 0x024fcf50, 0x00dcc070, 0x037a273c, 0x0022a08a}}}, + {X: Field{[10]uint32{0x00b6bd0f, 0x0165e9eb, 0x011399ad, 0x00f80a5f, 0x01697f3f, 0x03d9b80c, 0x0294c3ee, 0x01de4791, 0x02f1da22, 0x002c0163}}, Y: Field{[10]uint32{0x02205a2a, 0x016cbc2f, 0x02978c80, 0x0111f4ae, 0x01e5deb6, 0x03ffa009, 0x000bee68, 0x00e05363, 0x034a0579, 0x001fd6ea}}}, + {X: Field{[10]uint32{0x002522a5, 0x014da32b, 0x025c8db9, 0x015d2e1c, 0x006dfc35, 0x0137f2ac, 0x0202b780, 0x03f7594b, 0x002d8df5, 0x00077b75}}, Y: Field{[10]uint32{0x02bca540, 0x019567ad, 0x0254f5b4, 0x037bcd5d, 0x0024b918, 0x020ed86e, 0x03f4a8f9, 0x00349463, 0x00492373, 0x000c1569}}}, + {X: Field{[10]uint32{0x000ea544, 0x03cbbd0e, 0x01f7da46, 0x00f67571, 0x03e47181, 0x00af0e76, 0x005b0b51, 0x012ea4fd, 0x0248c679, 0x001d8694}}, Y: Field{[10]uint32{0x032c1292, 0x03442c20, 0x01fc5c60, 0x00217eb4, 0x029f7034, 0x016ea3b5, 0x018d0a39, 0x033ab178, 0x0130c4f5, 0x0006177b}}}, + {X: Field{[10]uint32{0x03aa5caf, 0x02ae2638, 0x00f2ffef, 0x021d4069, 0x03a17496, 0x004f06d6, 0x0020982a, 0x03433237, 0x0360e515, 0x0003c756}}, Y: Field{[10]uint32{0x00a0d91d, 0x03b673de, 0x00708e42, 0x02dd5265, 0x03ee6f9a, 0x03ad8fc1, 0x033a9e48, 0x03630805, 0x026c395f, 0x00157f5d}}}, + {X: Field{[10]uint32{0x0337425f, 0x0264ff6e, 0x002d7fba, 0x012f0c09, 0x02fb09ff, 0x00711156, 0x02ba0bf6, 0x0002a95d, 0x004c9b79, 0x0015a72d}}, Y: Field{[10]uint32{0x00c350b1, 0x01009c83, 0x026d0d33, 0x03a03895, 0x01c1131d, 0x031f768f, 0x038f646a, 0x038f5079, 0x00d2ff1a, 0x0037f7ae}}}, + {X: Field{[10]uint32{0x021851eb, 0x031e1f2e, 0x00776d22, 0x0045f734, 0x039c2dda, 0x0363e142, 0x0147a787, 0x00e7a146, 0x029ad998, 0x000f966d}}, Y: Field{[10]uint32{0x012e20b3, 0x03620d16, 0x036d434c, 0x017acb27, 0x03705074, 0x01fb13c9, 0x01d93583, 0x02c0c1af, 0x02a48bfe, 0x001ccb34}}}, + {X: Field{[10]uint32{0x01296967, 0x03a93125, 0x0087b0e6, 0x015ccb0c, 0x0181acec, 0x03f0221b, 0x02502403, 0x015a0a60, 0x022107b4, 0x00291b59}}, Y: Field{[10]uint32{0x01763d33, 0x006b3bee, 0x03464005, 0x02139849, 0x01461478, 0x026a0823, 0x0097a73f, 0x02c18890, 0x00f429a5, 0x00050333}}}, + {X: Field{[10]uint32{0x0079ab1c, 0x005b1194, 0x0392774d, 0x03fb6bad, 0x004ad70e, 0x0055d727, 0x000c427d, 0x014ee9f0, 0x019cf25c, 0x002e4839}}, Y: Field{[10]uint32{0x0045b67f, 0x0065f07c, 0x005c9d43, 0x017cdfd6, 0x039201ec, 0x0195ae4d, 0x01435a61, 0x02223475, 0x00f1d4ba, 0x00181858}}}, + {X: Field{[10]uint32{0x00bfa8c5, 0x0381adfe, 0x00713896, 0x03663417, 0x023b88b6, 0x02c9c36d, 0x03da1efd, 0x00dee7ab, 0x02e1e7d8, 0x0004b3c6}}, Y: Field{[10]uint32{0x01c99c0f, 0x03329a4e, 0x035d91e8, 0x01b52141, 0x03c4c1d6, 0x0273f62c, 0x0323d7be, 0x024d2c27, 0x0213181b, 0x00383599}}}, + {X: Field{[10]uint32{0x01c0ec1f, 0x03ce74e3, 0x0230287f, 0x0002f84e, 0x02eb93a9, 0x00ca0553, 0x00620e5a, 0x02b28b98, 0x03ae0a4e, 0x001aab49}}, Y: Field{[10]uint32{0x00a1f46a, 0x0189aee5, 0x008112fe, 0x01d0d0b0, 0x02d46814, 0x0315ff5e, 0x03e8cd2d, 0x0054e789, 0x01c5caa2, 0x0024c855}}}, + {X: Field{[10]uint32{0x00f870a0, 0x00d0fb2b, 0x01c36ce9, 0x03e487dd, 0x008d168b, 0x0301b06e, 0x03489166, 0x019afa0a, 0x014e7cb1, 0x0004d336}}, Y: Field{[10]uint32{0x01453236, 0x02230ec2, 0x014c0fab, 0x039f9cf4, 0x012f7c8f, 0x03c268e6, 0x02a51cff, 0x03f517a0, 0x03c5e956, 0x0010a99c}}}, + {X: Field{[10]uint32{0x023989ee, 0x027d6d56, 0x00e2c56d, 0x0063729a, 0x02429b1d, 0x0072173b, 0x002971fa, 0x031e1a31, 0x018c7b7c, 0x00357735}}, Y: Field{[10]uint32{0x01208100, 0x01989388, 0x035c5e31, 0x002bc2ed, 0x0345bedd, 0x028ce2f1, 0x01a05297, 0x032b93b3, 0x0130ef1b, 0x00383290}}}, + {X: Field{[10]uint32{0x020d8c8e, 0x02b27403, 0x02861f66, 0x02f454e2, 0x033e3567, 0x01a47cce, 0x01fa4cdb, 0x02422e41, 0x0134c344, 0x00254759}}, Y: Field{[10]uint32{0x017046f1, 0x017cc1bb, 0x039f9d57, 0x024669f5, 0x0295a5f6, 0x0114957d, 0x001a9903, 0x01e4a19a, 0x0122eb84, 0x003bbcd6}}}, + {X: Field{[10]uint32{0x01cdd0fc, 0x019973f0, 0x01e27b33, 0x02ea59bb, 0x02690af0, 0x02d48455, 0x0184c9c9, 0x025935db, 0x004b25f7, 0x0033b6e9}}, Y: Field{[10]uint32{0x03c79e7e, 0x006de6a1, 0x037d94c2, 0x009246a3, 0x02187e71, 0x024cc5ad, 0x007b6b64, 0x026bc746, 0x0049cb8e, 0x00201aa4}}}, + {X: Field{[10]uint32{0x00a10b54, 0x01bd2ab6, 0x02a2049c, 0x03445124, 0x01d1c7d2, 0x00afb285, 0x02bd39d3, 0x01afb8a6, 0x0260d130, 0x0013fc0d}}, Y: Field{[10]uint32{0x02d1e574, 0x0389dcc1, 0x01893d99, 0x01774bfc, 0x014990f2, 0x039c7da2, 0x02e8bc8b, 0x0265478d, 0x02698fd8, 0x0030b1d7}}}, + {X: Field{[10]uint32{0x022e0ca7, 0x0010b3b3, 0x01824389, 0x0289a0ee, 0x00c78061, 0x037edc80, 0x03b77020, 0x019197a1, 0x01088dbd, 0x003022f5}}, Y: Field{[10]uint32{0x008d7307, 0x024c957e, 0x03e78417, 0x02d82318, 0x011db329, 0x00ea7c5c, 0x02408842, 0x0125eac5, 0x01d61343, 0x00158806}}}, + {X: Field{[10]uint32{0x03f9857d, 0x03f576d2, 0x01e3a07a, 0x02a09d28, 0x00955bdd, 0x022eb0c6, 0x005cdd22, 0x033ac8ee, 0x00aa6fd2, 0x001237f7}}, Y: Field{[10]uint32{0x020287ce, 0x017fe8ba, 0x011710d5, 0x02d450c7, 0x00af60f4, 0x0390a555, 0x014e76fc, 0x019ee945, 0x022e8961, 0x000a9198}}}, + {X: Field{[10]uint32{0x02a1f236, 0x02b3fcc5, 0x03ceebbf, 0x01e68ce8, 0x02802c14, 0x01c094e0, 0x0376b471, 0x03e20f2f, 0x0100d81a, 0x00101082}}, Y: Field{[10]uint32{0x0385e3f7, 0x01a346de, 0x01b4be41, 0x01bbc678, 0x007831e9, 0x02d50957, 0x00f50fa2, 0x02d4ecc2, 0x00e0dbbc, 0x00219811}}}, + {X: Field{[10]uint32{0x022bdc42, 0x00bcdf8c, 0x0156f8b1, 0x01080ec4, 0x02ec1e31, 0x03a64823, 0x02c20184, 0x019f1dc3, 0x007b23b6, 0x0025a8dd}}, Y: Field{[10]uint32{0x00f22ab2, 0x01f3618f, 0x03af798c, 0x03d29281, 0x03dc7545, 0x034c975b, 0x010b04ba, 0x01191ccc, 0x03c8df8c, 0x0019ec2c}}}, + {X: Field{[10]uint32{0x00460182, 0x0244caf2, 0x02784503, 0x0246a345, 0x03f1db3e, 0x00545212, 0x0361f0cb, 0x01e5a490, 0x017de403, 0x0033c1c0}}, Y: Field{[10]uint32{0x0397939d, 0x006ece4d, 0x0106799b, 0x0327996b, 0x00e2eb60, 0x01a5018e, 0x036e762f, 0x0278c343, 0x010762f2, 0x002de86c}}}, + {X: Field{[10]uint32{0x018beb15, 0x0173d688, 0x036dc080, 0x028f75c9, 0x0393507a, 0x01d7f756, 0x01b90ded, 0x02dbdeb4, 0x00b25b0b, 0x0004ad6e}}, Y: Field{[10]uint32{0x038933da, 0x02d5bb6d, 0x009aee89, 0x01942cd8, 0x015a5bc1, 0x01032866, 0x02d6368d, 0x02866e03, 0x03678cef, 0x00174f51}}}, + {X: Field{[10]uint32{0x03a46765, 0x0270de84, 0x0327dcd9, 0x0266f66d, 0x0177ecd2, 0x0062dbc6, 0x018b9ace, 0x039b64e6, 0x009ce866, 0x0021e6d1}}, Y: Field{[10]uint32{0x03781c63, 0x004ea0d8, 0x02baec6c, 0x0057c0f9, 0x01f0c452, 0x006a3679, 0x0350c4e9, 0x03ec4ab3, 0x00eb758c, 0x002c3120}}}, + {X: Field{[10]uint32{0x00c7dead, 0x01ee4283, 0x0121dd2b, 0x00332cdb, 0x01e50228, 0x00ffbc92, 0x03a401dd, 0x02807747, 0x0383e9d3, 0x000bb121}}, Y: Field{[10]uint32{0x01a67fce, 0x03c31fa1, 0x00703ca2, 0x020419e6, 0x0283fd8f, 0x03ad1a68, 0x01e61505, 0x038b2869, 0x012478f9, 0x003ec0a4}}}, + {X: Field{[10]uint32{0x037c3ce7, 0x008824d0, 0x03a83aee, 0x03eef61c, 0x025b7878, 0x0051655a, 0x03e8fcd2, 0x036c1ce7, 0x025827be, 0x001e7328}}, Y: Field{[10]uint32{0x00ac467e, 0x02073aa7, 0x015a8d33, 0x02c8b064, 0x00bee990, 0x03add2cc, 0x00b7c483, 0x021d4053, 0x0293d82e, 0x003fd222}}}, + {X: Field{[10]uint32{0x02dbd207, 0x00f37556, 0x01cd93e9, 0x0203526a, 0x028e146a, 0x00185aa9, 0x02b9eed4, 0x022dea09, 0x00ca3d2b, 0x00311129}}, Y: Field{[10]uint32{0x012d0f18, 0x03f09cc2, 0x032319d1, 0x003ee3f0, 0x00ac00ad, 0x037b41a1, 0x01ae3381, 0x00130950, 0x00a963d5, 0x001344da}}}, + {X: Field{[10]uint32{0x03f3e7a8, 0x0154a6f3, 0x03c267ee, 0x02298124, 0x02dbed32, 0x020d7a35, 0x024e2050, 0x0112c961, 0x0050cc0e, 0x000fb91f}}, Y: Field{[10]uint32{0x00a5f095, 0x0072a7a4, 0x0391f84e, 0x00c00f46, 0x00b6229a, 0x0117890f, 0x02496401, 0x02a1ef0c, 0x0339056e, 0x003e9554}}}, + {X: Field{[10]uint32{0x0009980c, 0x004b5f72, 0x020a81c0, 0x0364b464, 0x038e69e2, 0x03e6c3d1, 0x02251a29, 0x02edfd08, 0x01873036, 0x003a58f2}}, Y: Field{[10]uint32{0x01c52fd6, 0x009e8f15, 0x025e6180, 0x035b1fe3, 0x02140f92, 0x0202c5cf, 0x002bfa48, 0x02fcbc49, 0x03b0779b, 0x0003fe56}}}, + {X: Field{[10]uint32{0x008fc07d, 0x00473195, 0x008bd3f7, 0x01439a1b, 0x0023738e, 0x011be8e5, 0x024b747a, 0x02e2e6bf, 0x035bb6a1, 0x002abd81}}, Y: Field{[10]uint32{0x02f2b0cb, 0x0354866a, 0x0098b1bb, 0x01baef7e, 0x0253ab32, 0x03ad047a, 0x005bd162, 0x0328707a, 0x02ec6d11, 0x001336c2}}}, + {X: Field{[10]uint32{0x0157ac0f, 0x031d6150, 0x012986e4, 0x0357aa48, 0x02842b44, 0x0175c22a, 0x0174a18d, 0x01d5b638, 0x0017d8e9, 0x001a4792}}, Y: Field{[10]uint32{0x00c0c222, 0x03d01da8, 0x008c2d1f, 0x037ca7d4, 0x034bb9a8, 0x00be4a1c, 0x010eb157, 0x01eb5e03, 0x020b3bfa, 0x0027abae}}}, + {X: Field{[10]uint32{0x0344996a, 0x03821ff9, 0x03fd81d9, 0x02cc72bc, 0x00c77dbf, 0x020f6b63, 0x01c9d4c5, 0x01292250, 0x01bb45af, 0x0030f9bf}}, Y: Field{[10]uint32{0x008366f2, 0x010af258, 0x00a730e6, 0x01d2d526, 0x010b8694, 0x02b13a5e, 0x0207bfd1, 0x00a6e3fb, 0x011e65ab, 0x0032a663}}}, + {X: Field{[10]uint32{0x0140701f, 0x03002cc2, 0x013868ce, 0x03e00ccf, 0x02923ead, 0x01f17265, 0x032630be, 0x00973c87, 0x0320a55d, 0x003b6f58}}, Y: Field{[10]uint32{0x01e4889e, 0x005090d3, 0x003e3f7a, 0x0143dacb, 0x025e3d3d, 0x038a3e52, 0x00cd12bf, 0x03d79322, 0x02e7afce, 0x00359464}}}, + {X: Field{[10]uint32{0x0295d336, 0x02d30d3a, 0x005dad7c, 0x03b67536, 0x02b29684, 0x00f0dd04, 0x02fd2494, 0x0382e2b0, 0x0183a80a, 0x0032567b}}, Y: Field{[10]uint32{0x032b168b, 0x0268b869, 0x03e5f8b5, 0x023804bd, 0x014de5f5, 0x00965c30, 0x00b0e970, 0x03c94ab6, 0x02bb8dcc, 0x00203076}}}, + {X: Field{[10]uint32{0x02ed9237, 0x00f7e0cf, 0x0231274e, 0x03b76992, 0x022c5bc6, 0x034b573e, 0x00c90224, 0x0013a762, 0x01744710, 0x001de331}}, Y: Field{[10]uint32{0x02916c17, 0x00b724e4, 0x0360946b, 0x03f94730, 0x01675720, 0x02e48767, 0x012e502d, 0x007009ee, 0x01316b2a, 0x003ba88f}}}, + {X: Field{[10]uint32{0x03b42055, 0x02bf2598, 0x02d9a5c2, 0x011b4fef, 0x00173e7e, 0x036634b0, 0x03299f81, 0x015abd0f, 0x00388c36, 0x00287e1d}}, Y: Field{[10]uint32{0x016f4afc, 0x0261e9f5, 0x0284eabb, 0x03fb71ca, 0x015d874a, 0x0264d9e1, 0x0150e79b, 0x035b16cc, 0x00430820, 0x00042f21}}}, + {X: Field{[10]uint32{0x00224a5d, 0x008247da, 0x036a3d00, 0x020dd503, 0x028f7fa5, 0x00f410fb, 0x01a1839c, 0x022e2b36, 0x030b2d5f, 0x00322b5f}}, Y: Field{[10]uint32{0x03aebf8b, 0x017c6471, 0x01ec38e6, 0x02d4455f, 0x022a1cd4, 0x0229ff92, 0x01507cf1, 0x016e68b4, 0x0180eebe, 0x000c062d}}}, + {X: Field{[10]uint32{0x0020055f, 0x020436d2, 0x02d20bea, 0x01028a9e, 0x031ecf38, 0x02b9d9fd, 0x024e4261, 0x03f5eedf, 0x02640b93, 0x00309754}}, Y: Field{[10]uint32{0x025ad684, 0x027a3891, 0x03524c34, 0x03b0e851, 0x02bf331a, 0x02d23b4c, 0x01fffbce, 0x00ac3e8a, 0x00c76e3f, 0x003e8572}}}, + {X: Field{[10]uint32{0x0178f92b, 0x018afd7a, 0x032f2ccc, 0x01de22d7, 0x03283168, 0x02cb61ce, 0x03224dcc, 0x02feb6eb, 0x02eb7e4c, 0x00342e5c}}, Y: Field{[10]uint32{0x03ab8e3b, 0x0390837d, 0x03f56e94, 0x00c61082, 0x0275610b, 0x008f9e1e, 0x03bcb4cf, 0x01614aab, 0x00a1606a, 0x003bd74f}}}, + {X: Field{[10]uint32{0x030a2d07, 0x02010ac6, 0x014ab56c, 0x0146ef0a, 0x02d393e8, 0x02604cad, 0x008791ab, 0x0111e591, 0x00835856, 0x003e2d13}}, Y: Field{[10]uint32{0x0070a27c, 0x007b7fba, 0x00ed0b8e, 0x000756ec, 0x022dbe0c, 0x03239d93, 0x0051362f, 0x0102fba6, 0x02bf0420, 0x0030a090}}}, + {X: Field{[10]uint32{0x025666b7, 0x02df20f6, 0x02d368ac, 0x00641469, 0x005d9424, 0x00bf448d, 0x0010adc1, 0x02ab78e5, 0x01016f72, 0x0039f2e2}}, Y: Field{[10]uint32{0x02b21697, 0x01070d75, 0x00f63953, 0x02032c3e, 0x03f0c87e, 0x00e8595b, 0x014ee6c5, 0x03675fbf, 0x012246b6, 0x00378d9d}}}, + {X: Field{[10]uint32{0x0279d87f, 0x031d0930, 0x02167fb2, 0x03925733, 0x01f40f93, 0x01317abd, 0x02894786, 0x03d2aa4b, 0x028f14e3, 0x00022c84}}, Y: Field{[10]uint32{0x00f5d246, 0x02c39243, 0x00c11cbe, 0x0356e0c1, 0x02699926, 0x020c0c0f, 0x0012068a, 0x02d2c406, 0x004af469, 0x0039fb4e}}}, + {X: Field{[10]uint32{0x013b4afb, 0x01023d42, 0x00317658, 0x0075e17a, 0x001f3f63, 0x02d6cc7d, 0x036a5f3a, 0x035618e2, 0x01db3cbc, 0x003cd36d}}, Y: Field{[10]uint32{0x003dd3d9, 0x00c3f543, 0x02f2d56e, 0x018d3263, 0x005bf112, 0x03ff06b1, 0x031a1c74, 0x02119be8, 0x0372bb2c, 0x0037f39c}}}, + {X: Field{[10]uint32{0x00aabdb8, 0x017570bb, 0x01c86a96, 0x03937494, 0x0110b4fe, 0x03294cee, 0x00a48eab, 0x035a176b, 0x0209a445, 0x0030da27}}, Y: Field{[10]uint32{0x0279e3f4, 0x007c8bc5, 0x017a155c, 0x01f8e964, 0x03d62e18, 0x0101d747, 0x03efbe4f, 0x00feef0c, 0x005a6a26, 0x001e0134}}}, + {X: Field{[10]uint32{0x03005cbc, 0x022832cf, 0x00a78d70, 0x0128ad1f, 0x03f1e47d, 0x0025624b, 0x0266d626, 0x0284341e, 0x01ecf776, 0x001ffe65}}, Y: Field{[10]uint32{0x026ea90d, 0x0317ab32, 0x019f5cd5, 0x0343a4a6, 0x000e3911, 0x01b420a2, 0x00a4d115, 0x0390c337, 0x03745f17, 0x003b7371}}}, + {X: Field{[10]uint32{0x027d4d27, 0x0094fb10, 0x028e41c0, 0x035873f2, 0x010db78b, 0x0108faed, 0x03183512, 0x012fe5a6, 0x02626223, 0x000d98a8}}, Y: Field{[10]uint32{0x002e1b09, 0x032aeb07, 0x0199fc41, 0x026de6d2, 0x03d550ef, 0x032b28da, 0x000f671c, 0x039a703d, 0x00420f07, 0x00222988}}}, + {X: Field{[10]uint32{0x0354e8d1, 0x00ed050f, 0x03951176, 0x03a45852, 0x00b6b4eb, 0x01281ce2, 0x00e66ee2, 0x0310ba5c, 0x002e06d9, 0x000b049f}}, Y: Field{[10]uint32{0x03dd6629, 0x01672743, 0x0193aaae, 0x008d808b, 0x00856be0, 0x012b6b8c, 0x0226c8ff, 0x02b7eabe, 0x02b8dacb, 0x00291dcf}}}, + {X: Field{[10]uint32{0x02c17802, 0x03594552, 0x02cb37f6, 0x002e33e6, 0x02b7dfcb, 0x03f8c2df, 0x014863a9, 0x00587ff6, 0x03a6116f, 0x0031083f}}, Y: Field{[10]uint32{0x010a028c, 0x02c50ef9, 0x03bc0079, 0x025cbba3, 0x017fd76d, 0x017b6a30, 0x019e9cf9, 0x023db212, 0x029c25c6, 0x0039b311}}}, + {X: Field{[10]uint32{0x02e3de0d, 0x01de11fa, 0x0169b50c, 0x029f9ff2, 0x0034d386, 0x00c85d1a, 0x002f06fd, 0x010f7563, 0x03432203, 0x001de259}}, Y: Field{[10]uint32{0x01fd9369, 0x01529348, 0x021f8570, 0x016589e4, 0x00cd9067, 0x00a7a4aa, 0x00bcd7d6, 0x037365c4, 0x019e4408, 0x0010d435}}}, + {X: Field{[10]uint32{0x009f5827, 0x009c4e4d, 0x03c83dc1, 0x023c644c, 0x03714768, 0x00dbfc3d, 0x0334f9b6, 0x0372d00c, 0x002c1a14, 0x0033dfa9}}, Y: Field{[10]uint32{0x019e6d9d, 0x02547776, 0x00a29f8e, 0x02259918, 0x020ad1a6, 0x025792a9, 0x01c28468, 0x03e7744e, 0x0080166b, 0x002e700b}}}, + {X: Field{[10]uint32{0x0273a91f, 0x0057e969, 0x036309d8, 0x0211fdd4, 0x02417b1c, 0x00f27e5b, 0x028ab1b3, 0x02af76b6, 0x0039ab1f, 0x00345e4d}}, Y: Field{[10]uint32{0x02d3b3e0, 0x003473f3, 0x0105f9bc, 0x03496903, 0x03b429ad, 0x02699f43, 0x019f6f7f, 0x0106c8ec, 0x02593b59, 0x002b04f5}}}, + {X: Field{[10]uint32{0x0292b420, 0x0193c0a7, 0x0026be98, 0x01dd29d0, 0x02547225, 0x004cf727, 0x02f58630, 0x0379c314, 0x00d6727d, 0x002ec55a}}, Y: Field{[10]uint32{0x02af3992, 0x01c32548, 0x02fe70b1, 0x00af856a, 0x009e137d, 0x03bb8a70, 0x02adf80c, 0x01d31b31, 0x0356268d, 0x002d5951}}}, + {X: Field{[10]uint32{0x03877dcc, 0x037a9eb6, 0x0020535c, 0x00b5de37, 0x03ce07c4, 0x00c6ea4f, 0x00681772, 0x02968e9d, 0x02d783e8, 0x001cca44}}, Y: Field{[10]uint32{0x03df80a2, 0x01e3239d, 0x01bab06f, 0x034ffb4f, 0x011664f5, 0x0271ea51, 0x00ffd7c2, 0x02348f9a, 0x03881b12, 0x0034d2e0}}}, + {X: Field{[10]uint32{0x0297074c, 0x011a231c, 0x00afa908, 0x03748941, 0x034927b6, 0x01a134ed, 0x03e18651, 0x00cba0b0, 0x0371fb85, 0x0031d3c3}}, Y: Field{[10]uint32{0x01006ac1, 0x027c69ef, 0x0006a53a, 0x0350440a, 0x0235984b, 0x0341031b, 0x03e5a92d, 0x005e3a2f, 0x0261c0bd, 0x0027697a}}}, + {X: Field{[10]uint32{0x023283b0, 0x032f1a27, 0x00aac91f, 0x004cf25c, 0x031785a6, 0x00c18366, 0x00e9e494, 0x01683169, 0x01398bda, 0x002f53ea}}, Y: Field{[10]uint32{0x030e433a, 0x02973680, 0x0295c5d2, 0x02efc537, 0x02e79cfd, 0x032eb035, 0x01be1cac, 0x012d2516, 0x03edb661, 0x0018c753}}}, + {X: Field{[10]uint32{0x0341cc8f, 0x01971928, 0x03a72f24, 0x01e5ee26, 0x03e9bc2d, 0x0172daf4, 0x003e0c81, 0x004f4c92, 0x0062733f, 0x0027e995}}, Y: Field{[10]uint32{0x0212db04, 0x0280b89a, 0x0313010f, 0x03f0bc53, 0x01443505, 0x01289c54, 0x00ada32c, 0x02c635d2, 0x005bafc5, 0x001c147f}}}, + {X: Field{[10]uint32{0x035e31aa, 0x0101d130, 0x03d4a6cd, 0x03f8b07a, 0x03715168, 0x036f94ef, 0x02434a9d, 0x02fc7a05, 0x037dab3d, 0x003aba9b}}, Y: Field{[10]uint32{0x0384d61d, 0x0069eae5, 0x01e6a76a, 0x02c07dc2, 0x01a594b9, 0x03d2ea41, 0x0080619f, 0x00ae5b08, 0x02c24f20, 0x002e5a58}}}, + {X: Field{[10]uint32{0x0317a2fc, 0x01eff14e, 0x007516b9, 0x022925fe, 0x039a117c, 0x02e38954, 0x03e6d5b7, 0x01d413cc, 0x02b63b94, 0x002cf7de}}, Y: Field{[10]uint32{0x01758b9b, 0x006ef127, 0x025b5ec5, 0x03aa454a, 0x01f11f00, 0x0069d677, 0x03a62650, 0x039b3b5b, 0x0100a35a, 0x001cb7dd}}}, + {X: Field{[10]uint32{0x03281bbf, 0x0346b1b0, 0x017fa3a8, 0x0025c990, 0x034341df, 0x01438a53, 0x0219be99, 0x0122b915, 0x02cc46da, 0x003be1d7}}, Y: Field{[10]uint32{0x031c72f5, 0x010aecdf, 0x01bc28a6, 0x030ae7a3, 0x0351ced2, 0x00c1b261, 0x010eb6e8, 0x0016db5b, 0x0204af4c, 0x001eae78}}}, + {X: Field{[10]uint32{0x00024fdc, 0x01bcdb1c, 0x014e7fc2, 0x015d32fc, 0x033d7487, 0x03f29422, 0x002f234a, 0x0228e942, 0x0046576a, 0x001d30f1}}, Y: Field{[10]uint32{0x00136506, 0x03fa3877, 0x02ae88c4, 0x02725293, 0x03b6ccac, 0x027628c1, 0x01d2afbf, 0x01bea1cb, 0x01164ddb, 0x001cf55e}}}, + {X: Field{[10]uint32{0x00f39274, 0x00e11b43, 0x00e1acf3, 0x02096999, 0x00c06b71, 0x00ee8bc6, 0x00204933, 0x00b8f9b0, 0x032c409f, 0x00256712}}, Y: Field{[10]uint32{0x009aad47, 0x010bda0b, 0x015d945f, 0x027c68e6, 0x01d31991, 0x03716fb7, 0x03cd3980, 0x018a7edc, 0x035c7401, 0x0005f2ac}}}, + {X: Field{[10]uint32{0x009175fb, 0x01e6a6db, 0x00d69a94, 0x02f24bed, 0x03f67c24, 0x01ff7ead, 0x013b53c6, 0x014c4c65, 0x01d69419, 0x001013c3}}, Y: Field{[10]uint32{0x024d87b3, 0x0245ef7c, 0x01570147, 0x01e61bbf, 0x037e7d3e, 0x0350ac0d, 0x01560851, 0x01234eac, 0x01e7f40a, 0x00215f1d}}}, + {X: Field{[10]uint32{0x00e82075, 0x031248db, 0x03566807, 0x03bc05c2, 0x032db4ec, 0x0021504d, 0x01f4d5ab, 0x003d694f, 0x0111233b, 0x000f8101}}, Y: Field{[10]uint32{0x000df3d3, 0x000e09d8, 0x00e02b96, 0x03806de4, 0x021fda08, 0x019d4ec8, 0x0235ebf5, 0x00e10dde, 0x0271dd44, 0x003e4cdc}}}, + {X: Field{[10]uint32{0x00d77e6e, 0x01337c8b, 0x03bd3e04, 0x00ae5211, 0x00ecc869, 0x01ef6b01, 0x03993e74, 0x0370f87d, 0x005310df, 0x00250baa}}, Y: Field{[10]uint32{0x02a155e5, 0x039892e7, 0x00e51e02, 0x03e950a3, 0x01f33e9a, 0x023106c7, 0x0110bbe5, 0x02dba6d1, 0x03c8e688, 0x002efcbd}}}, + {X: Field{[10]uint32{0x0103b532, 0x01b3a873, 0x02c0a3fe, 0x0247842c, 0x01dce217, 0x03406028, 0x01938097, 0x0297ee15, 0x02749883, 0x000795de}}, Y: Field{[10]uint32{0x0041c003, 0x005fb0eb, 0x01790194, 0x004b5773, 0x007b5756, 0x009e3a1e, 0x02530007, 0x0178576e, 0x022f856f, 0x002851d9}}}, + {X: Field{[10]uint32{0x03feaa5a, 0x01cb13db, 0x014c8ae4, 0x03f9f156, 0x037a05fb, 0x001ff928, 0x02e9dfa6, 0x01ed9084, 0x015a8a23, 0x003af276}}, Y: Field{[10]uint32{0x03f1162a, 0x011e55f9, 0x03c05b17, 0x0361ad2b, 0x038fec2f, 0x03e2d234, 0x015fb458, 0x0291f33c, 0x01c0e311, 0x000e501b}}}, + {X: Field{[10]uint32{0x03cac063, 0x00febc18, 0x00475277, 0x00dc7ecb, 0x01b90816, 0x02125862, 0x023d2280, 0x03f08084, 0x03601afd, 0x0031e3ab}}, Y: Field{[10]uint32{0x02b42de7, 0x020ecfcf, 0x029c76df, 0x033db07f, 0x01bacb42, 0x01b4e5be, 0x02e84c51, 0x00b7177d, 0x01b1e0c2, 0x000254c9}}}, + {X: Field{[10]uint32{0x036d34a0, 0x01a173f7, 0x01db8752, 0x01a80d5c, 0x004f2e53, 0x005f09e6, 0x00a3d0e1, 0x00134ad1, 0x0319a1d5, 0x002d6461}}, Y: Field{[10]uint32{0x00184abe, 0x013a6986, 0x02a356d5, 0x02c9798b, 0x0016beac, 0x03226414, 0x029828aa, 0x02df23e8, 0x00cb585c, 0x0026c07a}}}, + {X: Field{[10]uint32{0x020042cd, 0x0325e3a3, 0x01584bda, 0x0115297a, 0x02454f10, 0x031bdd6d, 0x0107dfdc, 0x0327464a, 0x033eb59f, 0x0021c1a9}}, Y: Field{[10]uint32{0x03dc3a49, 0x024a1b56, 0x001ce710, 0x037478d3, 0x004265e2, 0x02daa1fa, 0x028405a2, 0x01e35bd4, 0x03566f1f, 0x0022c6d7}}}, + {X: Field{[10]uint32{0x0312d6ca, 0x0154a741, 0x0230ae64, 0x0108e888, 0x00793e56, 0x01b8ab41, 0x00a92890, 0x012fedbd, 0x016e4ddb, 0x0024fa49}}, Y: Field{[10]uint32{0x02afdcea, 0x01aa3b5b, 0x01cd6975, 0x011e429d, 0x03d874f2, 0x0038e626, 0x000ea62f, 0x037fb0d9, 0x02dbd9b3, 0x0020ec90}}}, + {X: Field{[10]uint32{0x022ac295, 0x031bfe7a, 0x0127fe9a, 0x02fd62ad, 0x03a24fff, 0x00755806, 0x0353956a, 0x03ce6f2c, 0x01af8702, 0x000b6b52}}, Y: Field{[10]uint32{0x03e4675b, 0x00e98949, 0x002fe277, 0x00450370, 0x00ed4036, 0x032b3a30, 0x000704e2, 0x001d8957, 0x00b8e604, 0x002d6bda}}}, + {X: Field{[10]uint32{0x036950a0, 0x00431513, 0x014f7597, 0x0193d0ec, 0x0086a2c3, 0x03af8ccb, 0x01627195, 0x00be9152, 0x00994da4, 0x0017ff06}}, Y: Field{[10]uint32{0x02c9bb88, 0x00c6b570, 0x0363f043, 0x00be6ea7, 0x014542ad, 0x036c14f3, 0x00e61419, 0x017ea888, 0x00a87981, 0x0008bab0}}}, + {X: Field{[10]uint32{0x001c51ba, 0x02982ff5, 0x02b6e69f, 0x02739b98, 0x00324c63, 0x00aed6b4, 0x0221bb8a, 0x029e6713, 0x01bb1832, 0x001c6f82}}, Y: Field{[10]uint32{0x00dda472, 0x03c8e355, 0x01656e4f, 0x03730578, 0x01950588, 0x0153ac92, 0x0040767b, 0x016e3ca3, 0x03c5719a, 0x0031489f}}}, + {X: Field{[10]uint32{0x02587212, 0x0303b59a, 0x002770ba, 0x0359115a, 0x0056d661, 0x037caeb1, 0x00a3cb37, 0x0267c299, 0x0305f927, 0x00013e50}}, Y: Field{[10]uint32{0x03c054ab, 0x007f04c4, 0x03344051, 0x01b5b403, 0x026baf79, 0x0363475f, 0x00ddc7ca, 0x020f5ae5, 0x011fbd86, 0x0013121a}}}, + {X: Field{[10]uint32{0x00f0ab81, 0x021ace98, 0x033bc54b, 0x02338b1a, 0x02b3aeb3, 0x017d8614, 0x024fc096, 0x0248fb98, 0x028b6fc2, 0x00157be1}}, Y: Field{[10]uint32{0x0222efab, 0x039b9e45, 0x01a0e72c, 0x037c8b70, 0x0376cff6, 0x0198147e, 0x014d0adc, 0x02d3314d, 0x02eaab16, 0x003b0662}}}, + {X: Field{[10]uint32{0x00fdab68, 0x0330d55d, 0x022790cb, 0x02f08d90, 0x00a357f6, 0x01028e56, 0x020953ed, 0x0276fc39, 0x019046e1, 0x0009ab55}}, Y: Field{[10]uint32{0x02795508, 0x03ecfc3e, 0x025e2184, 0x039d36f0, 0x00e5bb77, 0x002f1a25, 0x03c6a746, 0x00870154, 0x01ef9067, 0x002bdbf1}}}, + {X: Field{[10]uint32{0x0037312a, 0x03307c3b, 0x0150384f, 0x01a63ba3, 0x02bc051a, 0x00e406fc, 0x000b0ae4, 0x01c554e7, 0x003ab1b0, 0x001ce7ed}}, Y: Field{[10]uint32{0x006b7e28, 0x00f9d8db, 0x019e7a19, 0x02e1302d, 0x01ff90d6, 0x0379aad3, 0x00abe331, 0x008898b5, 0x03043c88, 0x0030488d}}}, + {X: Field{[10]uint32{0x0216771d, 0x026eb519, 0x02c6cc29, 0x0196a74c, 0x03d5a109, 0x00ba4497, 0x03422f82, 0x03d76a9e, 0x009d508c, 0x00085119}}, Y: Field{[10]uint32{0x001ca76e, 0x03348a74, 0x03a1a74a, 0x032b6776, 0x0376ddea, 0x01419f3a, 0x03ef96b3, 0x031117c0, 0x038c0e33, 0x000454c5}}}, + {X: Field{[10]uint32{0x03b97072, 0x036438ee, 0x03580ec8, 0x038d55b4, 0x014d5577, 0x014209e3, 0x02a85175, 0x023a3c5b, 0x023c16ee, 0x0018b311}}, Y: Field{[10]uint32{0x026a891e, 0x0218ffa2, 0x033fcb81, 0x03e8be6a, 0x0356b48e, 0x0244ce56, 0x02a6c91c, 0x03140211, 0x0043e299, 0x00334a52}}}, + {X: Field{[10]uint32{0x03ef9c21, 0x03ab0cd4, 0x031c9707, 0x0376e77f, 0x004317e1, 0x0103dd33, 0x00fdb006, 0x03c64345, 0x030133ed, 0x00004658}}, Y: Field{[10]uint32{0x0020494c, 0x00db4855, 0x020c8031, 0x0065841a, 0x00caa4f5, 0x03681c0d, 0x03851876, 0x03b9b5d0, 0x00e5e3a3, 0x003c5aad}}}, + {X: Field{[10]uint32{0x0289adcd, 0x0298c648, 0x03c162b4, 0x00d0099c, 0x03777d4e, 0x025554a1, 0x0315baed, 0x03e4fca3, 0x03863fda, 0x002c942f}}, Y: Field{[10]uint32{0x01b3d2c1, 0x0356b04e, 0x016f828a, 0x03bce7eb, 0x01da1e06, 0x02d0357e, 0x013543f6, 0x00f4a21f, 0x01bede34, 0x000a5701}}}, + {X: Field{[10]uint32{0x003e7c6c, 0x03d1bd92, 0x03e696f4, 0x002053a1, 0x01027ef0, 0x00b0666c, 0x010945a7, 0x011ce67c, 0x03bcae58, 0x0024e902}}, Y: Field{[10]uint32{0x02858a09, 0x03a32f2a, 0x0217389f, 0x03802bd9, 0x03f088e2, 0x0249a192, 0x03289a45, 0x0259d3d7, 0x00c02980, 0x00207b5c}}}, + {X: Field{[10]uint32{0x020978cc, 0x0230303d, 0x01f90eff, 0x03753eaa, 0x0019ff7d, 0x03a60978, 0x03e76b34, 0x0275d6c5, 0x021b4e90, 0x002e799d}}, Y: Field{[10]uint32{0x035aa117, 0x01e4241e, 0x0211b762, 0x00ef2634, 0x0165c75e, 0x03cb215d, 0x001b70fb, 0x0049c222, 0x01035fb9, 0x00190305}}}, + {X: Field{[10]uint32{0x00cfec24, 0x010d8344, 0x039beebf, 0x0146c08a, 0x00ae4547, 0x016cb702, 0x03e260cf, 0x026e91a1, 0x0012fe3d, 0x0013708a}}, Y: Field{[10]uint32{0x039a90d1, 0x00b7d7df, 0x01c4305b, 0x00b90c0c, 0x0227f082, 0x0135a015, 0x02e986da, 0x0204d554, 0x034a5685, 0x00270d7b}}}, + {X: Field{[10]uint32{0x009deadf, 0x020a1b13, 0x03540934, 0x00948d98, 0x03e198e2, 0x020f4b4e, 0x02b94ba6, 0x03e70901, 0x02b31127, 0x0010c49d}}, Y: Field{[10]uint32{0x001efb3e, 0x00e312b8, 0x03743139, 0x03237756, 0x02c26d39, 0x037232fb, 0x006280dd, 0x037e192d, 0x0184c7f1, 0x0008997b}}}, + {X: Field{[10]uint32{0x0283632a, 0x0042b2cd, 0x00360aa8, 0x00dae1e2, 0x03328f17, 0x033eaa45, 0x00b81d76, 0x0163d0ad, 0x02c3c990, 0x001d716d}}, Y: Field{[10]uint32{0x028f719d, 0x036d7142, 0x00464aff, 0x006ea03c, 0x014a5aaa, 0x026a243c, 0x02309ef4, 0x01edfdc2, 0x009fdef1, 0x001527c0}}}, + {X: Field{[10]uint32{0x02a827d7, 0x03be6773, 0x0357c815, 0x03a44ba9, 0x0326d4d4, 0x02920077, 0x02b1a377, 0x03dd0a5d, 0x0027205a, 0x000f2400}}, Y: Field{[10]uint32{0x00649cc0, 0x015e2c42, 0x0184c83c, 0x01183f9c, 0x02007a24, 0x00ce76ac, 0x007fa7c0, 0x029f788e, 0x03f337ec, 0x00038a33}}}, + {X: Field{[10]uint32{0x0310d9ff, 0x01ebaacc, 0x0297f3a8, 0x02f4ea3a, 0x00c89637, 0x01708fcc, 0x03a8ab0d, 0x02e57c27, 0x031a3676, 0x0015983c}}, Y: Field{[10]uint32{0x011c568b, 0x035e1b2c, 0x03839efb, 0x01b0ae8f, 0x03955bb7, 0x01366bfc, 0x0092ff3e, 0x032829f6, 0x00d66bc4, 0x003581a7}}}, + {X: Field{[10]uint32{0x033babe9, 0x01e1bfd7, 0x02f618cd, 0x0351e6bd, 0x00e6733c, 0x02dc75de, 0x03979ce5, 0x037219fd, 0x00a41b45, 0x000ae2da}}, Y: Field{[10]uint32{0x01e4097a, 0x0314b163, 0x021ab40a, 0x0311b050, 0x03840f89, 0x02b66824, 0x00923f63, 0x006ccf08, 0x0244d544, 0x001f20c4}}}, + {X: Field{[10]uint32{0x01c18610, 0x00a73aa2, 0x01290442, 0x012cc0fa, 0x001d369d, 0x01acff28, 0x03578869, 0x02f3712c, 0x004db817, 0x00218d40}}, Y: Field{[10]uint32{0x02b909e2, 0x03b0ca5b, 0x0300c4c3, 0x00487f12, 0x007e9f35, 0x00563687, 0x0384cc05, 0x01b9af8b, 0x02402bd4, 0x00091cb6}}}, + {X: Field{[10]uint32{0x00cb28d0, 0x01a88d22, 0x03b693a5, 0x000f7193, 0x01b0d39d, 0x01b87b33, 0x03afbde4, 0x013e5e6d, 0x026b6eeb, 0x001b2646}}, Y: Field{[10]uint32{0x01c95620, 0x00467bd9, 0x013722bc, 0x00f93350, 0x030e0b75, 0x00fad11c, 0x0277188d, 0x018d4140, 0x034fc2cd, 0x0007977d}}}, + {X: Field{[10]uint32{0x0341570c, 0x02865fa7, 0x03a0ca52, 0x029258bf, 0x00554569, 0x0248a22e, 0x0298ed7e, 0x033246e5, 0x019d4283, 0x002b36b0}}, Y: Field{[10]uint32{0x02d7b66e, 0x00e94831, 0x01afeea0, 0x029be5f6, 0x02451d41, 0x01c5d0ae, 0x030c6bfe, 0x021507d4, 0x0187523c, 0x003e94db}}}, + {X: Field{[10]uint32{0x025fc6c0, 0x00a96591, 0x00abba3e, 0x03c2bad4, 0x0385bba7, 0x034a29f2, 0x00b107c3, 0x032ee552, 0x03a3f696, 0x002c525a}}, Y: Field{[10]uint32{0x006318ad, 0x00bbcf72, 0x0057a857, 0x02effd73, 0x03487740, 0x03a01e09, 0x03c8f8ea, 0x0129bb83, 0x00d5727a, 0x001dfedb}}}, + {X: Field{[10]uint32{0x01b09126, 0x01500d36, 0x03ec94d8, 0x01e2b6c1, 0x02c2c9f8, 0x01b44a39, 0x00cab31d, 0x03a7283f, 0x01b56098, 0x000ff65f}}, Y: Field{[10]uint32{0x022b4578, 0x01007cc8, 0x014a22c0, 0x012c09f8, 0x0324e37d, 0x022c91bd, 0x00451273, 0x038dd03f, 0x00361494, 0x0006f5df}}}, + {X: Field{[10]uint32{0x02aefce9, 0x00ab8bb0, 0x03338898, 0x03feb5e4, 0x02eb174c, 0x00271f3e, 0x036d5c44, 0x01a3b551, 0x0055f2a4, 0x0017a37e}}, Y: Field{[10]uint32{0x02a6845f, 0x02e32c4d, 0x0357a17e, 0x03b311bc, 0x01d50da8, 0x021c0610, 0x01771843, 0x032a2282, 0x02823bb8, 0x0014b9ce}}}, + {X: Field{[10]uint32{0x024672bd, 0x005021b1, 0x006613f8, 0x0076e503, 0x0062021a, 0x003ee4cb, 0x01e6fb0a, 0x032da7a5, 0x02eb1417, 0x00267c41}}, Y: Field{[10]uint32{0x03a6501d, 0x02097ffd, 0x015337e9, 0x010f4613, 0x01e484d8, 0x00709ff9, 0x02926e6a, 0x0000441a, 0x0038e1e7, 0x00279fec}}}, + {X: Field{[10]uint32{0x0251ef8c, 0x00c18e9f, 0x031f7ac4, 0x03f52971, 0x0068bb14, 0x03fc3882, 0x011d6864, 0x0361fff4, 0x00985526, 0x001a1bf1}}, Y: Field{[10]uint32{0x00588e5b, 0x01824651, 0x0224422f, 0x017d6cf5, 0x024137dc, 0x0383c8ff, 0x016dd6b2, 0x02be16f2, 0x0132d793, 0x00074a3d}}}, + {X: Field{[10]uint32{0x03f6b83d, 0x03e5af2f, 0x03b2093d, 0x0001582f, 0x00e4c836, 0x00dc3e19, 0x00f3a85b, 0x002f2a45, 0x0356cc45, 0x0033e977}}, Y: Field{[10]uint32{0x0137604b, 0x0017cee3, 0x0203f78b, 0x03c09938, 0x0261cf56, 0x023e05c1, 0x01d96c74, 0x03ff246c, 0x0246bab7, 0x0033bee6}}}, + {X: Field{[10]uint32{0x013e404e, 0x0022791c, 0x003e8b39, 0x01aa58aa, 0x02893760, 0x00d39f2f, 0x0241eed5, 0x025a4fdd, 0x034c3fbb, 0x002646da}}, Y: Field{[10]uint32{0x023f8d3e, 0x02d83baf, 0x03c7113b, 0x01e75611, 0x02098dab, 0x012e4ae2, 0x038a0a2f, 0x019a234e, 0x026bbe55, 0x000fffae}}}, + {X: Field{[10]uint32{0x03c8c0d7, 0x006ee484, 0x00bcd689, 0x038d5a4e, 0x032955c4, 0x0089b144, 0x021fa14f, 0x00487162, 0x01d3b9b0, 0x00344131}}, Y: Field{[10]uint32{0x00caa6e9, 0x003415ac, 0x0196a3d9, 0x00028244, 0x00091ddb, 0x0171ddce, 0x02cea218, 0x01f3f40c, 0x019a814d, 0x0002320e}}}, + {X: Field{[10]uint32{0x0355dfce, 0x00c652f8, 0x031bcad9, 0x03df1d2c, 0x03415a06, 0x0065093a, 0x01c9a407, 0x00d921d2, 0x0053a45c, 0x001d864a}}, Y: Field{[10]uint32{0x024ad2fc, 0x03cdd14c, 0x01ecf84e, 0x00de451d, 0x02b5517b, 0x00984f18, 0x02bc9345, 0x01404b5f, 0x02873cbb, 0x000c44e4}}}, + {X: Field{[10]uint32{0x01070725, 0x027ec6b9, 0x016c8805, 0x02e6069f, 0x0210c7f9, 0x014424ec, 0x01b1de5c, 0x0307d301, 0x00a80509, 0x0005ccc1}}, Y: Field{[10]uint32{0x001d353e, 0x0087e24d, 0x013d5f9e, 0x022ce630, 0x02800cdc, 0x01a48a5e, 0x03db2e9c, 0x020e5150, 0x0198c8e0, 0x0010efef}}}, + {X: Field{[10]uint32{0x03da104a, 0x02b94542, 0x014c46b7, 0x02a02c53, 0x019eacca, 0x0391bf25, 0x03f5b6a9, 0x01545041, 0x03e1d28c, 0x002b2815}}, Y: Field{[10]uint32{0x02bf6ce8, 0x02e90cf9, 0x017024dc, 0x03348fdb, 0x00cb00e6, 0x012dcae3, 0x0095be9a, 0x01dbfc60, 0x031770bd, 0x00385fc5}}}, + {X: Field{[10]uint32{0x0076dbaa, 0x0212274d, 0x02b04b7e, 0x017d839b, 0x0385b294, 0x00029f70, 0x00a73859, 0x023ec70c, 0x0150e009, 0x003ec809}}, Y: Field{[10]uint32{0x039a0f28, 0x013d597b, 0x0099645e, 0x008b7f0f, 0x03cedda9, 0x01fd1cf3, 0x03bc98c7, 0x031a36f4, 0x00203f72, 0x0006abe1}}}, + {X: Field{[10]uint32{0x011ae7ac, 0x021e6f38, 0x0101c08f, 0x026108b1, 0x03af1aa2, 0x00a562f8, 0x0366c66c, 0x01eae396, 0x010ca022, 0x003a56dc}}, Y: Field{[10]uint32{0x0397cf19, 0x00975427, 0x030a2c55, 0x01a36728, 0x00c745a9, 0x03b7407e, 0x0109022c, 0x03d2df6a, 0x00e1ab5c, 0x0039917d}}}, + {X: Field{[10]uint32{0x0044770a, 0x019bcf7a, 0x02a15147, 0x01b339df, 0x03ab136c, 0x033b517f, 0x01cf203c, 0x02ffe581, 0x025c3589, 0x001b6d14}}, Y: Field{[10]uint32{0x02658c81, 0x035a121c, 0x00903eb5, 0x02ecf167, 0x03799cd7, 0x00b01a62, 0x031d2958, 0x01612c8c, 0x0003f5f7, 0x0039adfd}}}, + {X: Field{[10]uint32{0x01085eb3, 0x01cc4ccd, 0x022c8fbe, 0x0229a592, 0x01169043, 0x0136e711, 0x03c2959e, 0x03ab9c57, 0x029e49da, 0x002224ea}}, Y: Field{[10]uint32{0x01987cdd, 0x031c2539, 0x00c10d01, 0x0316ebb2, 0x01bd15ce, 0x0197d8b2, 0x037a4b02, 0x00fced8d, 0x003eae80, 0x001c3ef6}}}, + {X: Field{[10]uint32{0x020207a0, 0x02505363, 0x01fd56e3, 0x03123ceb, 0x012cd9e2, 0x02a9e2f2, 0x01e3ece8, 0x02336a1c, 0x02cfac6e, 0x002f95fd}}, Y: Field{[10]uint32{0x0293d5f2, 0x0083cafb, 0x03aa1581, 0x0374daec, 0x028893ee, 0x0266a9ee, 0x00d141d8, 0x03e273f7, 0x007299ab, 0x001e05c2}}}, + {X: Field{[10]uint32{0x00b34925, 0x0232d508, 0x03562671, 0x03d16a79, 0x00a2f69b, 0x0340ad75, 0x0205ddd8, 0x0044a717, 0x02d285a0, 0x0001dfe9}}, Y: Field{[10]uint32{0x026455cc, 0x0136d14c, 0x03b97ce0, 0x02643805, 0x0337a2da, 0x0303b7fa, 0x0086288e, 0x0348633a, 0x023c13a3, 0x000c56ec}}}, + {X: Field{[10]uint32{0x01f4dc03, 0x02826e34, 0x01d00b2e, 0x02b65e37, 0x02061094, 0x019ffec3, 0x00834ca7, 0x0370cd8b, 0x03fe8414, 0x000bfb5e}}, Y: Field{[10]uint32{0x00117e01, 0x0378b166, 0x00ff20a6, 0x0182db13, 0x0363332a, 0x00047186, 0x01e434f0, 0x00f4c559, 0x00f7aa0b, 0x0005397a}}}, + {X: Field{[10]uint32{0x034d66c6, 0x03ab2242, 0x026a101a, 0x010b3a3b, 0x037f8af2, 0x03c0fb8f, 0x0343df2b, 0x006e87f2, 0x00d05a87, 0x0027d30b}}, Y: Field{[10]uint32{0x02922920, 0x0316502f, 0x01acf83b, 0x03d7f0d0, 0x03d0fd7d, 0x030e1388, 0x038a2abd, 0x01e21e3f, 0x0352f242, 0x003ad087}}}, + {X: Field{[10]uint32{0x01bea647, 0x03e9f297, 0x013ce7c8, 0x022eef07, 0x0015f0a4, 0x00dce0fc, 0x0203ef6e, 0x001332dc, 0x00b6824a, 0x0014f038}}, Y: Field{[10]uint32{0x01618cf9, 0x03f4e853, 0x00e91836, 0x0178416a, 0x0313c59d, 0x03a024e5, 0x01729f9b, 0x0328694e, 0x018d9246, 0x001aa6d6}}}, + {X: Field{[10]uint32{0x0117d714, 0x00eb62ab, 0x02fd5c0a, 0x02fded3b, 0x03bb20fd, 0x00cf5a3a, 0x037bba54, 0x01ae12da, 0x0082d790, 0x0036f033}}, Y: Field{[10]uint32{0x01cd7211, 0x031d9d8b, 0x02e37a4f, 0x038a14c1, 0x008aee42, 0x039798ce, 0x001b0904, 0x00b0e9be, 0x038623ff, 0x0017af07}}}, + {X: Field{[10]uint32{0x008f5f0b, 0x002a9b49, 0x02165af2, 0x01e10314, 0x02ca93a4, 0x004c7557, 0x01a8cbb8, 0x023811ec, 0x0332a3c0, 0x001e18ab}}, Y: Field{[10]uint32{0x03fc15d8, 0x03f70ce2, 0x02684f1e, 0x00ba36a4, 0x017e8c27, 0x021ecefe, 0x0367a645, 0x00d4f228, 0x02076b10, 0x002ed7d9}}}, + {X: Field{[10]uint32{0x031049ee, 0x013032a4, 0x037524e4, 0x0326e1d4, 0x01f8238f, 0x005724ec, 0x012bad80, 0x0162ddbb, 0x01fc8001, 0x00034d5c}}, Y: Field{[10]uint32{0x02a44bc3, 0x01af1d20, 0x0315f4d2, 0x03e549af, 0x0170a9e6, 0x0056bd12, 0x00872fa9, 0x00c2aa74, 0x01e83e66, 0x00058b72}}}, + {X: Field{[10]uint32{0x00589d9b, 0x022c2de2, 0x02a26e90, 0x036a23eb, 0x03b9f531, 0x037cd613, 0x02b98e55, 0x031d6190, 0x0094cebb, 0x002a1472}}, Y: Field{[10]uint32{0x0375b422, 0x009638ec, 0x020e1151, 0x03e6d7eb, 0x011e1af1, 0x02b90ceb, 0x01f38983, 0x0307bdc7, 0x015cadfa, 0x001d1c0b}}}, + {X: Field{[10]uint32{0x0258012d, 0x0005b3b6, 0x0131e972, 0x03e407c2, 0x012d9af1, 0x036cba21, 0x0178a08c, 0x03feab82, 0x03f4012e, 0x002a4b90}}, Y: Field{[10]uint32{0x002fb668, 0x000ee574, 0x013c6bb9, 0x01ec8ef0, 0x02535c68, 0x02094825, 0x01d7bd12, 0x005c3acd, 0x009d5560, 0x00363d68}}}, + {X: Field{[10]uint32{0x03cff6bb, 0x001fed7c, 0x0024c090, 0x00a74a0f, 0x02bb29e1, 0x01d83b36, 0x02658c64, 0x01a7210b, 0x02448b43, 0x001d72bf}}, Y: Field{[10]uint32{0x0355dc39, 0x011dec42, 0x015f53c9, 0x028bee88, 0x02db1ea5, 0x00751ce2, 0x02affab5, 0x00d54c78, 0x02e243c7, 0x00328384}}}, + {X: Field{[10]uint32{0x0041d006, 0x012114e3, 0x02b56a21, 0x01ddedb9, 0x02c48c41, 0x02008ed6, 0x017a2337, 0x0167b0bc, 0x00664db9, 0x00002ac0}}, Y: Field{[10]uint32{0x035d8b31, 0x00dc5d67, 0x029b7b5d, 0x01f7adcb, 0x01e3d338, 0x0101d62b, 0x02762fb9, 0x0145a7d1, 0x02fc3554, 0x00233e78}}}, + {X: Field{[10]uint32{0x01b7ecb7, 0x02fa9427, 0x027814a1, 0x03f55cfc, 0x00f89b9a, 0x011a747c, 0x00855bf0, 0x0084d060, 0x02f82e4b, 0x0009d443}}, Y: Field{[10]uint32{0x00fb87e1, 0x01570d2b, 0x00aeb900, 0x00337b1a, 0x03b0a1b2, 0x02fa67f4, 0x02073555, 0x0130187f, 0x00e886b5, 0x00083f80}}}, + {X: Field{[10]uint32{0x01b16d3a, 0x00b23293, 0x02c1d745, 0x03b8ed66, 0x03f4a6c2, 0x02727081, 0x021405c9, 0x009dede4, 0x01a8d388, 0x001dcffd}}, Y: Field{[10]uint32{0x00a52f8e, 0x010d6fbe, 0x002848d7, 0x02bcf9cd, 0x0200f75c, 0x01cc638e, 0x00806bd8, 0x03196ebf, 0x0231f51c, 0x0033d179}}}, + {X: Field{[10]uint32{0x02f45746, 0x03311547, 0x0386fe14, 0x00dcb890, 0x034293fc, 0x03686a3b, 0x0277e359, 0x02ff0edc, 0x0098e69e, 0x000be3cb}}, Y: Field{[10]uint32{0x0168ec06, 0x032b5026, 0x02c3642c, 0x0323fba8, 0x008150a6, 0x0012aaba, 0x003e4066, 0x02ae808f, 0x03ecc4dc, 0x003e1748}}}, + {X: Field{[10]uint32{0x0277f67f, 0x020f7a58, 0x001c061a, 0x01e19369, 0x01745756, 0x018d5b39, 0x00849522, 0x03438a82, 0x00daab8d, 0x00061e2b}}, Y: Field{[10]uint32{0x01477020, 0x011596b5, 0x009bb968, 0x00a039b4, 0x03ecbcc1, 0x03e922bc, 0x0296f05b, 0x0024b2b7, 0x028d064e, 0x00104b21}}}, + {X: Field{[10]uint32{0x035618c1, 0x02312f13, 0x029c4cad, 0x003d273d, 0x02c5a17b, 0x004dcfd8, 0x004f3cdd, 0x039389fb, 0x001aeac4, 0x000233ca}}, Y: Field{[10]uint32{0x01ed5973, 0x03f61bca, 0x02625cd9, 0x036d93fe, 0x027dbf09, 0x038cc0a6, 0x023911ed, 0x03a89f36, 0x019529c9, 0x000bc5fe}}}, + {X: Field{[10]uint32{0x008939f9, 0x0081a634, 0x01ec39ea, 0x00d9c5fc, 0x02a09579, 0x0370abbf, 0x010d1913, 0x00da7976, 0x009ff165, 0x000e965f}}, Y: Field{[10]uint32{0x000a14d4, 0x018ad3ac, 0x01926da4, 0x021bd624, 0x03a7b48c, 0x00262381, 0x03464b00, 0x028b7816, 0x03b290c9, 0x00230880}}}, + {X: Field{[10]uint32{0x010ca15e, 0x013eb2e5, 0x028ac505, 0x0242eeb1, 0x03b9ceec, 0x014a40e4, 0x029c8615, 0x0043fd77, 0x0205096f, 0x00032f8c}}, Y: Field{[10]uint32{0x03ee27f4, 0x00ae51d3, 0x02bd0547, 0x00b2b785, 0x039bf7c7, 0x00580072, 0x02b48557, 0x02e84b0c, 0x006ab76a, 0x00111b2c}}}, + {X: Field{[10]uint32{0x02fed594, 0x036c1055, 0x00bd53a8, 0x00017b98, 0x011cde71, 0x019511cc, 0x0013b09e, 0x0139c061, 0x01cf0822, 0x0010c4f2}}, Y: Field{[10]uint32{0x03329a96, 0x0275cd46, 0x023317ab, 0x0352af12, 0x000e80bb, 0x02809482, 0x001021f9, 0x016a32c6, 0x019dd304, 0x0037ebcd}}}, + {X: Field{[10]uint32{0x0373c60e, 0x03c3eaaf, 0x036882bd, 0x02ac67ed, 0x011f5cbf, 0x03697fe9, 0x009651b2, 0x02b7b0b6, 0x0351f8d8, 0x0033ab4a}}, Y: Field{[10]uint32{0x02a25897, 0x01472915, 0x0221bf84, 0x029fb4b4, 0x026dd3bd, 0x02fc512b, 0x03e79322, 0x03c3a31c, 0x00806992, 0x002aca89}}}, + {X: Field{[10]uint32{0x027b79a0, 0x03c9eb92, 0x020e52d8, 0x02b67e2f, 0x0298e34d, 0x017b9bbb, 0x01164b84, 0x01d8bd91, 0x008d0848, 0x002739d7}}, Y: Field{[10]uint32{0x02a30a05, 0x00a76f26, 0x03571d0a, 0x0166e458, 0x029f6275, 0x02dd0a89, 0x017c04c8, 0x02a419ae, 0x014fe11b, 0x0038155b}}}, + {X: Field{[10]uint32{0x026741d7, 0x0002224c, 0x013a96ba, 0x020c0759, 0x0310214b, 0x0308e11e, 0x02106bf8, 0x038957e4, 0x009c621d, 0x00180912}}, Y: Field{[10]uint32{0x004ea858, 0x03638b84, 0x03aa9b1f, 0x0021989b, 0x02abf63e, 0x01ae0b97, 0x01326210, 0x000803b2, 0x032480a9, 0x0002543a}}}, + {X: Field{[10]uint32{0x0308e51d, 0x0348bb57, 0x01e11546, 0x028f1a11, 0x011f55e1, 0x001c957f, 0x02c2638c, 0x01af3501, 0x02f0108f, 0x0034f1d1}}, Y: Field{[10]uint32{0x038dfab6, 0x002f3390, 0x0165e25d, 0x0069bff0, 0x0335ed4e, 0x015fbcf6, 0x001a776c, 0x031ce799, 0x03e5d349, 0x00344936}}}, + {X: Field{[10]uint32{0x036514b8, 0x03c9c5c4, 0x00c6352c, 0x03e6f3e9, 0x01a69c69, 0x00216537, 0x03b9e11e, 0x03088be5, 0x035cd85d, 0x00287ad7}}, Y: Field{[10]uint32{0x00a15fff, 0x01429f3e, 0x03b68007, 0x01d8c094, 0x00ff5e3f, 0x03768ee8, 0x0247ddd7, 0x03805dd8, 0x0135a393, 0x0011bb4f}}}, + {X: Field{[10]uint32{0x005a8736, 0x03dd5852, 0x03639721, 0x015ae0b1, 0x00e44065, 0x0305051f, 0x025f1c61, 0x030b2fea, 0x0357fa3a, 0x000ac928}}, Y: Field{[10]uint32{0x03d73ade, 0x00cc3346, 0x0243c018, 0x017d742d, 0x01ad192a, 0x015c8751, 0x00fd7aed, 0x02b5546a, 0x01bd707a, 0x00359c86}}}, + {X: Field{[10]uint32{0x0187b2ec, 0x0293db3f, 0x03306126, 0x00f98ba7, 0x02ab6a62, 0x00bb2d06, 0x00c9cfb4, 0x0005658f, 0x01ab9dc6, 0x00264068}}, Y: Field{[10]uint32{0x00339317, 0x033363fc, 0x01730633, 0x0307b899, 0x03eb5950, 0x032d0539, 0x037a3df6, 0x035fcbff, 0x0194017c, 0x0023dd99}}}, + {X: Field{[10]uint32{0x0077e8da, 0x02e65961, 0x037634ae, 0x0386c870, 0x0328a2a4, 0x01f56320, 0x018e6003, 0x038bc787, 0x00455890, 0x000c47a1}}, Y: Field{[10]uint32{0x00ce030c, 0x016415bb, 0x00829a04, 0x009c7987, 0x01e017e9, 0x019c0ef0, 0x030dd00f, 0x015d8a86, 0x03676cc7, 0x0033d64f}}}, + {X: Field{[10]uint32{0x0283bb77, 0x023b31e7, 0x008b367a, 0x0391bfba, 0x03122d27, 0x023ebd9b, 0x00ad8b8c, 0x003db8a6, 0x02e39714, 0x002417dc}}, Y: Field{[10]uint32{0x01b65257, 0x01c529bc, 0x019b4698, 0x022a84b8, 0x022d9852, 0x02d6c94e, 0x00b94fc1, 0x03099764, 0x015dbde9, 0x00300fc5}}}, + {X: Field{[10]uint32{0x0339350c, 0x00fd56e8, 0x0085e04a, 0x00cc09f7, 0x0039eafd, 0x02672ed3, 0x00c2f021, 0x000004bf, 0x03a5d594, 0x001877dd}}, Y: Field{[10]uint32{0x01049161, 0x0189a8b6, 0x0005f684, 0x008235b7, 0x01f36640, 0x035b903d, 0x030603f2, 0x026cfdce, 0x037d00de, 0x0009f222}}}, + {X: Field{[10]uint32{0x01f18c28, 0x010aeb17, 0x021295bc, 0x0353bc09, 0x030de36d, 0x03bb01b1, 0x016af906, 0x012c7577, 0x0199886d, 0x00387e38}}, Y: Field{[10]uint32{0x01ca45a8, 0x03e2add4, 0x025e29ec, 0x02d53196, 0x0056a98d, 0x039f98d2, 0x025bc4ba, 0x03abc4a1, 0x02e9b956, 0x00140b04}}}, + {X: Field{[10]uint32{0x03b8565a, 0x02181dbe, 0x02ac19b6, 0x0151e692, 0x029180e1, 0x001133e5, 0x01fe6a77, 0x0288701f, 0x01b83804, 0x002b78bd}}, Y: Field{[10]uint32{0x03066aca, 0x006f09bb, 0x01eee375, 0x03d915c5, 0x0198a9e6, 0x017499f9, 0x00985d6f, 0x005a30c2, 0x021d07c8, 0x00343597}}}, + {X: Field{[10]uint32{0x03268187, 0x0208779b, 0x01b88ea5, 0x021685d5, 0x009f7f6b, 0x018a202e, 0x0345dd5c, 0x03e5cab0, 0x00bb0154, 0x00315608}}, Y: Field{[10]uint32{0x00613086, 0x00795af3, 0x027a2124, 0x016b605f, 0x014dc35f, 0x0285d223, 0x03b698c8, 0x02996498, 0x03ea1e6c, 0x002446c3}}}, + {X: Field{[10]uint32{0x007778b5, 0x000e719b, 0x01d089f7, 0x023054b7, 0x02128588, 0x023330b4, 0x0164352b, 0x0083d14e, 0x026e3210, 0x003a8825}}, Y: Field{[10]uint32{0x034fc18c, 0x00a7c9a7, 0x00d3959e, 0x01b37786, 0x0166f547, 0x010d0a70, 0x03dc9bd6, 0x007949aa, 0x0191cdc8, 0x003250bd}}}, + {X: Field{[10]uint32{0x007e2bf5, 0x03d37d18, 0x007079f9, 0x022a3a03, 0x02220c90, 0x0387be12, 0x0301bbd3, 0x03f9699c, 0x012d9c2d, 0x000f15d5}}, Y: Field{[10]uint32{0x031f39e3, 0x000802f9, 0x00522b9f, 0x0153b542, 0x016fd347, 0x00997fd9, 0x031a0a17, 0x018e5cf9, 0x00ffbc4a, 0x003527e8}}}, + {X: Field{[10]uint32{0x03d4e1c3, 0x02825466, 0x0071feb5, 0x002f3dfc, 0x01a3fd5c, 0x012b6859, 0x028e1339, 0x00fb0167, 0x00c6e104, 0x003c6233}}, Y: Field{[10]uint32{0x03bfdbe4, 0x021814c1, 0x021cf944, 0x010428bf, 0x03db045c, 0x0081d926, 0x02fb1908, 0x01e740b5, 0x031fe53e, 0x0017c7cd}}}, + {X: Field{[10]uint32{0x011c8c6a, 0x00d790b0, 0x013cad48, 0x028b4729, 0x01447112, 0x029efed2, 0x015a146a, 0x008cba01, 0x03d27e72, 0x00280517}}, Y: Field{[10]uint32{0x01e679cc, 0x00f9270f, 0x02cc5024, 0x02fc8b1f, 0x00ceb874, 0x001c272c, 0x00bb675f, 0x00333031, 0x00a0e5e7, 0x001ef006}}}, + {X: Field{[10]uint32{0x016ff48e, 0x00f7e03c, 0x016bd9c9, 0x0362c5d0, 0x01c17b7b, 0x02d56061, 0x03857060, 0x00454c7e, 0x01e80c22, 0x0014d003}}, Y: Field{[10]uint32{0x01a6cc6f, 0x034cf690, 0x0244c89c, 0x0082299a, 0x002df873, 0x00dbaa5c, 0x00840b6a, 0x0197c794, 0x02473ba5, 0x003848a3}}}, + {X: Field{[10]uint32{0x0264b1ac, 0x03199d33, 0x019048c6, 0x02d14ae6, 0x01cc8960, 0x03566be1, 0x00e34821, 0x00df8d43, 0x012d009d, 0x00208457}}, Y: Field{[10]uint32{0x021eb048, 0x03ee7bed, 0x02f05e75, 0x00f7a489, 0x01bffc1b, 0x02e74620, 0x02adab03, 0x00309012, 0x0209659a, 0x002637aa}}}, + {X: Field{[10]uint32{0x01fe7c3c, 0x005e2516, 0x039681fc, 0x01f00c20, 0x028669cb, 0x01437389, 0x01e6e9d4, 0x01bc7312, 0x001853d8, 0x0009cf63}}, Y: Field{[10]uint32{0x00c2ea00, 0x01b44040, 0x008af2e1, 0x007dfdfe, 0x0314974e, 0x007beeb6, 0x00c25a25, 0x009b205d, 0x01aa8ad0, 0x001b154c}}}, + {X: Field{[10]uint32{0x025ee319, 0x019d46ee, 0x01bfe403, 0x032d6c16, 0x0041e68c, 0x03d0a3f3, 0x0233f4fb, 0x020645c3, 0x0216a7e3, 0x0000185b}}, Y: Field{[10]uint32{0x0106748a, 0x012c393d, 0x032eaba8, 0x031cfa2b, 0x007c7dc3, 0x032a64dd, 0x01173f5c, 0x00fbf6e6, 0x0121182a, 0x001f6f2b}}}, + {X: Field{[10]uint32{0x00b82812, 0x00df0058, 0x0277452c, 0x00409d7d, 0x00dc5666, 0x000cfc84, 0x0373402d, 0x0260487d, 0x016a76a3, 0x0019d862}}, Y: Field{[10]uint32{0x03302c9b, 0x001e0b99, 0x007ebe76, 0x03c688d8, 0x0111848d, 0x038b2339, 0x011184c8, 0x024e7e02, 0x01cf1b40, 0x001ff740}}}, + {X: Field{[10]uint32{0x01e508b9, 0x029b53e2, 0x01fe6dd4, 0x008248d1, 0x00bd6eb0, 0x005dedac, 0x0135bd9e, 0x00176849, 0x03aae976, 0x001dfdea}}, Y: Field{[10]uint32{0x007f0b9e, 0x0392d973, 0x01231889, 0x03e84358, 0x020dbf20, 0x02df24cc, 0x035fd19b, 0x020c37f3, 0x016ccc7b, 0x003ec126}}}, + {X: Field{[10]uint32{0x00bce311, 0x0232a8e6, 0x005a4a0d, 0x02299ec3, 0x01bc4b4a, 0x0007e73c, 0x02973785, 0x00aee8f6, 0x03173a2e, 0x00304bd9}}, Y: Field{[10]uint32{0x039a47a8, 0x000c67dd, 0x03853a33, 0x00cdb960, 0x01097cd1, 0x02db2d50, 0x00012aa3, 0x00500544, 0x018644d3, 0x0037a4c2}}}, + {X: Field{[10]uint32{0x018e66aa, 0x01fbe570, 0x03304ee7, 0x03ea9dae, 0x004afe8f, 0x037ce80d, 0x039d268d, 0x0154b236, 0x02de19c7, 0x001954e8}}, Y: Field{[10]uint32{0x00edb93c, 0x01dc181c, 0x037f5373, 0x033b26ee, 0x0169f95b, 0x014b4dd3, 0x034dbb77, 0x002edcab, 0x00107c18, 0x002469c8}}}, + {X: Field{[10]uint32{0x03b834e3, 0x031411ad, 0x013eec1f, 0x008f9a8f, 0x01bba980, 0x010032aa, 0x022e9363, 0x0106148b, 0x00be353f, 0x0003d52d}}, Y: Field{[10]uint32{0x0296f17e, 0x0190df23, 0x013a5124, 0x02d015df, 0x03ab6f78, 0x0065d16a, 0x035afde2, 0x03c7c2a0, 0x006cbdd5, 0x0025af9e}}}, + {X: Field{[10]uint32{0x02adbb2a, 0x016d2d03, 0x03c64c0d, 0x01f12d9d, 0x03f86be3, 0x016d3722, 0x03c806e4, 0x0194882e, 0x03c2a0fa, 0x0030b4c5}}, Y: Field{[10]uint32{0x0313ab6a, 0x03acd7b4, 0x02af58e8, 0x023528eb, 0x03100f07, 0x03266529, 0x00cb16df, 0x032aedc6, 0x0169bd68, 0x00315c42}}}, + {X: Field{[10]uint32{0x0389f384, 0x03fcc4c6, 0x03ccefe1, 0x010d04db, 0x02cc43e1, 0x01fd751c, 0x034b9c95, 0x02993f71, 0x03c6a5b8, 0x0014a959}}, Y: Field{[10]uint32{0x009e8f53, 0x01bde8a7, 0x01d485c1, 0x03a5f60d, 0x02d7de27, 0x02064a55, 0x005f7d6b, 0x00a62b75, 0x01bfa314, 0x000cc98c}}}, + {X: Field{[10]uint32{0x01ba4e20, 0x012881c7, 0x005e98d2, 0x03c666d3, 0x013530f0, 0x00c491ef, 0x01435278, 0x01104a21, 0x006c891a, 0x003df702}}, Y: Field{[10]uint32{0x034444aa, 0x0378d16d, 0x027e7b82, 0x000ffc41, 0x00da0550, 0x00121618, 0x02f5f751, 0x0166bac3, 0x0312452e, 0x001cd3b5}}}, + {X: Field{[10]uint32{0x02ec06c6, 0x008362c8, 0x00d3e905, 0x0147944b, 0x01b3f2ae, 0x039be3dd, 0x02d8d8cd, 0x036f032f, 0x03a97bb6, 0x002553e7}}, Y: Field{[10]uint32{0x005dd9bb, 0x030e76c6, 0x0378bf65, 0x00523c10, 0x005426f6, 0x02d3e085, 0x01b3017b, 0x01983d2f, 0x03bb8bd9, 0x002d96d0}}}, + {X: Field{[10]uint32{0x0204e87e, 0x0236c509, 0x0145e818, 0x02f905ad, 0x026def2d, 0x01dd7365, 0x0366947f, 0x01962082, 0x03984141, 0x000839a6}}, Y: Field{[10]uint32{0x00632539, 0x019fe24a, 0x01f51caa, 0x01361f7c, 0x030dcce0, 0x010fd808, 0x02e45a3d, 0x00ae6cd6, 0x02590bd1, 0x00399451}}}, + {X: Field{[10]uint32{0x0072ed1c, 0x039f15c3, 0x01dc3709, 0x0210aace, 0x0371bed4, 0x00c0a55d, 0x0187fb53, 0x00bc1110, 0x03822dc4, 0x00173796}}, Y: Field{[10]uint32{0x01a0ea9f, 0x00a4a66a, 0x03e41b49, 0x02f9d897, 0x03cea3dc, 0x00ff584d, 0x00416e75, 0x0016d425, 0x02d864e4, 0x00283dee}}}, + {X: Field{[10]uint32{0x0326421f, 0x00ec4c7e, 0x01c346e7, 0x0181779c, 0x0045b204, 0x027535ba, 0x02fd03f4, 0x02c370aa, 0x034c6ba6, 0x002d61b2}}, Y: Field{[10]uint32{0x00948744, 0x02b26ad6, 0x0116d2b4, 0x01a662ec, 0x026767b4, 0x001abee1, 0x01de6235, 0x028eca8c, 0x03e7c26e, 0x0033b584}}}, + {X: Field{[10]uint32{0x00ba6ede, 0x029779a4, 0x00a8b2a2, 0x0150ddf9, 0x014e192a, 0x02358071, 0x0213dbfa, 0x00ea0b23, 0x01703580, 0x001f4fd8}}, Y: Field{[10]uint32{0x02c6cb15, 0x027d354b, 0x0100f196, 0x012f9e3a, 0x0177eaf8, 0x00302f2f, 0x03564778, 0x004f083e, 0x010e62f4, 0x0004e3a0}}}, + {X: Field{[10]uint32{0x037eb925, 0x01dfb0a3, 0x01b41d85, 0x037603ea, 0x01c9fa32, 0x00c12ae0, 0x03e67135, 0x03e18f9f, 0x00befc4a, 0x0039e8c5}}, Y: Field{[10]uint32{0x00f3eb1f, 0x02913d20, 0x008fb091, 0x033b1420, 0x0113ec94, 0x036a5c30, 0x019b6d07, 0x012b3fea, 0x0200f0e0, 0x003365e1}}}, + {X: Field{[10]uint32{0x03c6a577, 0x024098f4, 0x00231ec0, 0x02b67915, 0x00ba5fc0, 0x003c37f2, 0x01cd8e81, 0x0240bb88, 0x03e49f41, 0x0005e70e}}, Y: Field{[10]uint32{0x009cf184, 0x03fc32d3, 0x009dc5b9, 0x022693a2, 0x02640216, 0x0142df93, 0x02b03f5a, 0x026a80a7, 0x020efb9b, 0x001d7e7d}}}, + {X: Field{[10]uint32{0x01e6401f, 0x01842c24, 0x00c6fe50, 0x01a4173e, 0x0108d762, 0x015d53e9, 0x017808e2, 0x03060ae5, 0x0071464b, 0x00042956}}, Y: Field{[10]uint32{0x01b56ff4, 0x0145a8d0, 0x038b3029, 0x03caaa32, 0x0299a787, 0x0241aea7, 0x005c679f, 0x0368b38c, 0x03b96d2b, 0x0034d924}}}, + {X: Field{[10]uint32{0x008e555e, 0x03cfa6ba, 0x0099f96a, 0x028bcea7, 0x02585827, 0x00c7b1fd, 0x0108d45b, 0x02321055, 0x03225e85, 0x0012a40d}}, Y: Field{[10]uint32{0x0247d145, 0x01f44c8c, 0x0064c70c, 0x01df40b1, 0x0031c9a4, 0x003f3785, 0x012463f2, 0x01134331, 0x01a7fb9e, 0x00369351}}}, + {X: Field{[10]uint32{0x016acb3e, 0x00a5dcea, 0x02b621cd, 0x02ef80bc, 0x00c68373, 0x005c3b20, 0x00052d6b, 0x02023ded, 0x018c2505, 0x001b4427}}, Y: Field{[10]uint32{0x02dc9a57, 0x00e2ca3a, 0x012adc50, 0x002e72e5, 0x03200c87, 0x02c08eff, 0x001088ec, 0x01b90145, 0x00de511f, 0x003237a8}}}, + {X: Field{[10]uint32{0x02e1af88, 0x03c30e59, 0x01bf28f7, 0x00f8a1d3, 0x0106105b, 0x00d55d41, 0x015c7347, 0x00919f01, 0x00986d20, 0x00270866}}, Y: Field{[10]uint32{0x01d0914a, 0x027ecb63, 0x004550ec, 0x03354b52, 0x03efddf5, 0x01959783, 0x01d41463, 0x03fc4be7, 0x016c8edd, 0x00218dd2}}}, + {X: Field{[10]uint32{0x0292b03a, 0x023b71b0, 0x032e74de, 0x02d772e3, 0x03dcd104, 0x00aee5ce, 0x036dd750, 0x003d8040, 0x00390e66, 0x0008b294}}, Y: Field{[10]uint32{0x006b11e8, 0x03a457d9, 0x0258eda5, 0x02eb100f, 0x01cb6731, 0x0023e832, 0x016449a7, 0x02e07910, 0x00711ef6, 0x0021bf51}}}, + {X: Field{[10]uint32{0x02b6f938, 0x037a10b9, 0x0227c80b, 0x00977dd7, 0x022e39be, 0x03db2880, 0x0116fdd1, 0x011903c8, 0x0302cc00, 0x0033f063}}, Y: Field{[10]uint32{0x0290df7d, 0x0075a118, 0x01398645, 0x02936740, 0x01c09236, 0x01c232f9, 0x03a2923f, 0x0343965e, 0x00df4f79, 0x00358ad6}}}, + {X: Field{[10]uint32{0x0280a087, 0x03053e66, 0x02f259d3, 0x015afb2e, 0x02574905, 0x008d7142, 0x01f46ca6, 0x01163a64, 0x00c23425, 0x000ce22f}}, Y: Field{[10]uint32{0x0245c016, 0x00b84fa9, 0x0013b310, 0x029752b1, 0x0306c3dc, 0x02563efc, 0x00223166, 0x015e0c07, 0x02f806f6, 0x001f52a8}}}, + {X: Field{[10]uint32{0x00b46a19, 0x02a507bc, 0x03aa802b, 0x00f532f2, 0x0144ac96, 0x00db67e5, 0x018fefc1, 0x004b78f7, 0x00131b8c, 0x00349af4}}, Y: Field{[10]uint32{0x028d3a99, 0x002b096d, 0x00653cb1, 0x01f699e0, 0x020d045a, 0x032ad24a, 0x02948724, 0x01e571ad, 0x02a331b6, 0x0019be27}}}, + {X: Field{[10]uint32{0x03d1fdb9, 0x0274a795, 0x035ca1d9, 0x0353511f, 0x03465a03, 0x03bd7d9a, 0x03960edf, 0x03a3c858, 0x030cdb67, 0x003734cd}}, Y: Field{[10]uint32{0x007084ef, 0x0185a9cd, 0x01ed9922, 0x02f66d93, 0x028a9eb4, 0x024efdcc, 0x038d4483, 0x02fe1cb3, 0x007a320a, 0x0022e4dd}}}, + {X: Field{[10]uint32{0x038d8e7a, 0x0227cfd3, 0x0006f805, 0x02ecff82, 0x0121d449, 0x02718e06, 0x03105af5, 0x02b558cd, 0x0105e602, 0x001d01d3}}, Y: Field{[10]uint32{0x003d574d, 0x02e1052c, 0x002cfe19, 0x03db111e, 0x02bf0dd8, 0x0077548d, 0x00fd515a, 0x0202b411, 0x03d4adee, 0x00069352}}}, + {X: Field{[10]uint32{0x0305c174, 0x00dcea0b, 0x034dd732, 0x025035ae, 0x01971203, 0x01e024aa, 0x00df438a, 0x00faedaa, 0x0081f3a2, 0x0002a273}}, Y: Field{[10]uint32{0x03c4fda4, 0x02a59128, 0x03d77873, 0x039d5c1f, 0x00326a9c, 0x02e5e77b, 0x01ddc9fd, 0x03c18d39, 0x03dd676d, 0x0012dbe0}}}, + {X: Field{[10]uint32{0x0216424c, 0x028e03d9, 0x00e037dd, 0x0102d82b, 0x026443c5, 0x001fe592, 0x002ae36b, 0x00fc3864, 0x00bafa91, 0x0023c684}}, Y: Field{[10]uint32{0x01e5525f, 0x02615557, 0x0326e869, 0x018b5680, 0x0114e3a4, 0x01d03cc7, 0x0016ad4e, 0x01df0c91, 0x024445c1, 0x00040a35}}}, + {X: Field{[10]uint32{0x01e27b51, 0x01d01222, 0x026d6f4c, 0x03e11e3e, 0x019154a2, 0x0369266b, 0x0157268a, 0x0288da9e, 0x027914f9, 0x002b63f6}}, Y: Field{[10]uint32{0x020e82ae, 0x01392f8c, 0x03834617, 0x03c09818, 0x03703b74, 0x0170f24c, 0x02deffc0, 0x029b1bdd, 0x02ab1f7d, 0x00272874}}}, + {X: Field{[10]uint32{0x0167fbe7, 0x0178cb3f, 0x03c874d1, 0x003f93ec, 0x03219270, 0x03c8e38b, 0x008cc246, 0x00a5c110, 0x010a797b, 0x001b1ba6}}, Y: Field{[10]uint32{0x0391dac1, 0x00c1868f, 0x019e1be8, 0x021e4f53, 0x0139811b, 0x0010368c, 0x025b32cc, 0x0159667e, 0x03980f35, 0x0007ff05}}}, + {X: Field{[10]uint32{0x01118969, 0x007e68c9, 0x0247cedc, 0x01728d02, 0x039f86f7, 0x0027c8de, 0x035351de, 0x00aaf658, 0x03ea31ad, 0x00080ac4}}, Y: Field{[10]uint32{0x001bcba0, 0x03314d46, 0x004c0fe3, 0x0085c000, 0x03868a45, 0x02f2061c, 0x0111184e, 0x00dfd354, 0x0105a14e, 0x00314bed}}}, + {X: Field{[10]uint32{0x03b748a5, 0x0210a475, 0x02f5fd22, 0x031848c9, 0x03034053, 0x02615654, 0x01c7c7cf, 0x010beac3, 0x00a10251, 0x0014d57c}}, Y: Field{[10]uint32{0x02281949, 0x0333c5df, 0x0118f4b1, 0x01a9e071, 0x039cddd3, 0x0183b8fb, 0x008ff9de, 0x0007db07, 0x036a5535, 0x001d6ef8}}}, + {X: Field{[10]uint32{0x029829d7, 0x00ebab30, 0x02235f91, 0x02c4d1c1, 0x0279a39a, 0x02a0ebb0, 0x00f16644, 0x037b2747, 0x0178eacb, 0x002e214b}}, Y: Field{[10]uint32{0x03183156, 0x00c584f7, 0x020faeb4, 0x0343dca7, 0x038d51ee, 0x03a27b0e, 0x002735d2, 0x03187eb9, 0x035052b3, 0x001d8eea}}}, + {X: Field{[10]uint32{0x03057ae2, 0x033b56c1, 0x0188beec, 0x03a02c3c, 0x01696d18, 0x0027b343, 0x017d4d6a, 0x03de3870, 0x004b294d, 0x0032acb9}}, Y: Field{[10]uint32{0x01ff2f43, 0x02681a06, 0x00ed5405, 0x02b416c8, 0x02de28bf, 0x0156d41b, 0x0149607c, 0x01266b3b, 0x009a501a, 0x003cd46c}}}, + {X: Field{[10]uint32{0x03056b31, 0x01a14f15, 0x026589d4, 0x00dae6e1, 0x03b16f9f, 0x0152dd5a, 0x012355eb, 0x015568af, 0x01c99c6d, 0x0005002e}}, Y: Field{[10]uint32{0x03a077a8, 0x0270cab7, 0x00436e56, 0x007e5bc9, 0x035709b9, 0x03508477, 0x026993b3, 0x00459e82, 0x001662f4, 0x0022ca42}}}, + {X: Field{[10]uint32{0x03d9141e, 0x03b1b9af, 0x018a50fb, 0x00655623, 0x03b3d31b, 0x0044511a, 0x03ae7a9a, 0x027071a1, 0x032e973e, 0x0014ab8d}}, Y: Field{[10]uint32{0x02351ccb, 0x02ff8360, 0x0256b71e, 0x033363b3, 0x001f87cf, 0x0116436d, 0x0238721a, 0x0390b6e5, 0x000de6d0, 0x003e60ad}}}, + {X: Field{[10]uint32{0x01899c24, 0x03d976d8, 0x032e0fe5, 0x0022e4df, 0x001139b7, 0x0143700c, 0x0241e148, 0x011896f8, 0x03bd4082, 0x000f453f}}, Y: Field{[10]uint32{0x00a1dfb7, 0x03f1d862, 0x02872981, 0x03bf4dd9, 0x02799882, 0x034884e8, 0x01cf16b8, 0x03811d36, 0x00fa477e, 0x002c4299}}}, + {X: Field{[10]uint32{0x02a48930, 0x0057b36e, 0x0246e824, 0x0346a57f, 0x03e7ab3f, 0x0353261e, 0x03bc2700, 0x03065ea2, 0x02df54e0, 0x0031bd4a}}, Y: Field{[10]uint32{0x0056811d, 0x016bf64e, 0x03a8f77e, 0x024cab7a, 0x03b9ef91, 0x0267e912, 0x010281c0, 0x01ced241, 0x006fb538, 0x001d4930}}}, + {X: Field{[10]uint32{0x0144c1aa, 0x01828fb2, 0x00f559fe, 0x03601b46, 0x005f2d1d, 0x031e7070, 0x03c838a4, 0x01f2d9e8, 0x0264bdc4, 0x00240224}}, Y: Field{[10]uint32{0x02ee04de, 0x003ece74, 0x03064eea, 0x032e4779, 0x02ca140b, 0x010c392d, 0x01d582cc, 0x00c899aa, 0x0046d70b, 0x0006258e}}}, + {X: Field{[10]uint32{0x03da0662, 0x03dc247b, 0x006ebc1b, 0x019a5bcf, 0x012db741, 0x03a084a9, 0x035b2d4c, 0x00df0589, 0x00ea478b, 0x00389f09}}, Y: Field{[10]uint32{0x02783de3, 0x01f3c244, 0x03b7d853, 0x036bf0ed, 0x03bb99f4, 0x000c5e46, 0x01532bb5, 0x019f2feb, 0x0279c3a2, 0x0009fb14}}}, + {X: Field{[10]uint32{0x000a3eb2, 0x03bfe131, 0x0092b917, 0x03b98190, 0x032549b8, 0x025574ef, 0x0025d857, 0x035badc0, 0x02129cf1, 0x0032976a}}, Y: Field{[10]uint32{0x027a9811, 0x02109677, 0x01e9ef6a, 0x03c9dee2, 0x037c4aa5, 0x035082d2, 0x027c7c27, 0x01bdf4cf, 0x0105500f, 0x001a0b52}}}, + {X: Field{[10]uint32{0x00877f55, 0x005a67bf, 0x00170487, 0x016d0943, 0x006c98ac, 0x02274509, 0x0223fb5c, 0x031a2119, 0x000f2b2a, 0x00241a7b}}, Y: Field{[10]uint32{0x031fb05e, 0x034e95b9, 0x00266975, 0x02a322e0, 0x02a6c3c3, 0x00901f7f, 0x000617ee, 0x00dc485b, 0x02c4eff8, 0x00331403}}}, + {X: Field{[10]uint32{0x03bda16c, 0x02c4e470, 0x0250fb8c, 0x00f01649, 0x00053639, 0x017a2ae8, 0x02742d3c, 0x03b86dae, 0x02eb0bd5, 0x0017f87f}}, Y: Field{[10]uint32{0x0065a34b, 0x0250ade6, 0x01af53bf, 0x01a90dd7, 0x03ea02ae, 0x001cbddb, 0x025ba068, 0x0193b4d0, 0x032701ac, 0x0036c46c}}}, + {X: Field{[10]uint32{0x001b2c34, 0x019b12ab, 0x00cb8318, 0x00aa1783, 0x026bf260, 0x02439382, 0x0035b6cf, 0x03e20d24, 0x01a5f168, 0x000292a4}}, Y: Field{[10]uint32{0x03837596, 0x02080c1f, 0x00857ce0, 0x02a7023d, 0x02ff7265, 0x00ae262a, 0x02f2ff8e, 0x03b47462, 0x02a8fe36, 0x00016ffb}}}, + {X: Field{[10]uint32{0x02884849, 0x01bdd1be, 0x019e35f0, 0x01bb4f1f, 0x0143f536, 0x03aaaf93, 0x00705054, 0x016d492a, 0x0336f0c3, 0x003d04d7}}, Y: Field{[10]uint32{0x010c526b, 0x03f12c99, 0x0052dd55, 0x00c30ea7, 0x01ba1a5d, 0x00c1d75d, 0x019d0ea4, 0x0301e2d3, 0x03f1b8b6, 0x000719c1}}}, + {X: Field{[10]uint32{0x00380203, 0x00ea7ce5, 0x01e0fdcc, 0x01364ad0, 0x00014a50, 0x020fa12e, 0x03449928, 0x03eebb4a, 0x018a9363, 0x00356a26}}, Y: Field{[10]uint32{0x0260e9fb, 0x026cf6ba, 0x03d4b0bf, 0x02be98aa, 0x032f20c5, 0x0351b35f, 0x038ae7c6, 0x0320162e, 0x03036fdd, 0x0025805a}}}, + {X: Field{[10]uint32{0x03f3d176, 0x022e6f92, 0x01fa8cc3, 0x039e6443, 0x00d50297, 0x0043064e, 0x007fb622, 0x0036f428, 0x023404b3, 0x00220132}}, Y: Field{[10]uint32{0x03d37b0d, 0x02bb79d5, 0x02c9124c, 0x0142c472, 0x01eb65db, 0x00e1c58c, 0x008c55ff, 0x01f18dde, 0x02e57992, 0x0016d92f}}}, + {X: Field{[10]uint32{0x03811021, 0x0176fd8a, 0x00e740ac, 0x01d1f426, 0x010c947c, 0x022f6969, 0x008e78e7, 0x0086daf1, 0x01fc440c, 0x0021a470}}, Y: Field{[10]uint32{0x03b1787e, 0x0122f2b5, 0x01c0903d, 0x00e7d9b0, 0x00682f45, 0x000a9c44, 0x02c330af, 0x00460555, 0x01c535f5, 0x003f63b0}}}, + {X: Field{[10]uint32{0x03093229, 0x01018dfb, 0x001eb58a, 0x02aec3b4, 0x03c3ee5f, 0x0253a4a4, 0x02bfe3f8, 0x038b87f7, 0x01f6343b, 0x001117f0}}, Y: Field{[10]uint32{0x0185b605, 0x001ef6df, 0x010af329, 0x03cd236a, 0x03c3c087, 0x03b7b44e, 0x00aa1b73, 0x03e14f41, 0x03fe6737, 0x00215fc5}}}, + {X: Field{[10]uint32{0x036493b4, 0x03140069, 0x039667d1, 0x01568773, 0x02af1a55, 0x02e23135, 0x023aaf95, 0x0346c2cb, 0x03dea657, 0x00170e5f}}, Y: Field{[10]uint32{0x030aff0a, 0x02681bf7, 0x03d32de7, 0x00b3d21f, 0x03ce5cb5, 0x02a7f153, 0x0336aee6, 0x00f1d4b5, 0x00207b6f, 0x002739d2}}}, + {X: Field{[10]uint32{0x03fc1b7e, 0x00dbe931, 0x030c1d7e, 0x0210dcb4, 0x02d9f535, 0x037f8644, 0x01d2bc5b, 0x0380a0d8, 0x01cb28d7, 0x0026d559}}, Y: Field{[10]uint32{0x03879eea, 0x0266c458, 0x0062d827, 0x01d7662c, 0x01a23af0, 0x038fdb1b, 0x0257f054, 0x02a0c962, 0x028d2de2, 0x001f573e}}}, + {X: Field{[10]uint32{0x01194f1d, 0x015368f2, 0x03b4b896, 0x027c404a, 0x02a5229a, 0x006ec656, 0x031b1657, 0x021c34e5, 0x00631bbf, 0x002bef7b}}, Y: Field{[10]uint32{0x0327e296, 0x030914e3, 0x0316a773, 0x00507d50, 0x0383fe57, 0x02ec2899, 0x0074ad1b, 0x009497e6, 0x0349b949, 0x0033f2e9}}}, + {X: Field{[10]uint32{0x00ad916b, 0x0075a22b, 0x03f4d0e0, 0x0318b12c, 0x03a7cc11, 0x03a7a7b1, 0x03c61605, 0x014d1d72, 0x03cbca3a, 0x001dc4aa}}, Y: Field{[10]uint32{0x024b82fb, 0x023c289a, 0x03ead0c6, 0x03f47ffb, 0x02b57cbb, 0x030ef4cc, 0x02b43af8, 0x009556b4, 0x01bc0eb1, 0x001ee472}}}, + {X: Field{[10]uint32{0x00a2b7e2, 0x00b4e2c7, 0x01c9f07a, 0x00459b9d, 0x0311b43a, 0x037d419a, 0x01fe506f, 0x017904b9, 0x0346f293, 0x000f1148}}, Y: Field{[10]uint32{0x019cd800, 0x00231ffd, 0x026962c6, 0x0228d4ad, 0x010e0203, 0x012047f6, 0x03532f8d, 0x01a0a4eb, 0x01e127f9, 0x003f4fdb}}}, + {X: Field{[10]uint32{0x0248b7be, 0x020b6c2a, 0x030547d1, 0x011377c2, 0x00e04eda, 0x0032652e, 0x01a53d67, 0x0368ff1f, 0x002fb4db, 0x0002f616}}, Y: Field{[10]uint32{0x01285c68, 0x03a318d1, 0x0033ad6d, 0x02de5d9c, 0x00ef0dc4, 0x039f420a, 0x016b282e, 0x01a2ee30, 0x0369c182, 0x001e6789}}}, + {X: Field{[10]uint32{0x02c84112, 0x0339b3ec, 0x0371974d, 0x03ab667a, 0x03befe03, 0x01a44ce3, 0x03fb71c1, 0x0375018a, 0x00a78dd9, 0x00310404}}, Y: Field{[10]uint32{0x02a2ff83, 0x0058b690, 0x0208d29b, 0x001cc50f, 0x00f270f8, 0x0209298f, 0x01c5dbcf, 0x02f088ec, 0x039de71e, 0x00140230}}}, + {X: Field{[10]uint32{0x0121d311, 0x0094f309, 0x01f4a1b6, 0x01777b6d, 0x03f786bc, 0x01426f23, 0x02586a6a, 0x02e89c01, 0x007e6cf4, 0x003a27a0}}, Y: Field{[10]uint32{0x02fea2cc, 0x0366527c, 0x0117aad6, 0x03070264, 0x012228f9, 0x0301000a, 0x039fcfc4, 0x01237a4d, 0x03797c49, 0x002ab7b2}}}, + {X: Field{[10]uint32{0x00b08577, 0x006e43f7, 0x03fdbdca, 0x01ce19bc, 0x0084091f, 0x0048630d, 0x01379195, 0x02fe4190, 0x01b3be2d, 0x000d8f7c}}, Y: Field{[10]uint32{0x01848bae, 0x02f7c3dd, 0x026057e3, 0x01918c26, 0x00f9ea5b, 0x01f9dbc8, 0x0221493f, 0x038db125, 0x004e5634, 0x0002bbf4}}}, + {X: Field{[10]uint32{0x038ea16e, 0x028f22f1, 0x003becd4, 0x00e8d357, 0x03ca8fe3, 0x0173112e, 0x01213228, 0x02093920, 0x023883d2, 0x00172345}}, Y: Field{[10]uint32{0x02c0456f, 0x02baeb86, 0x02685872, 0x037e3cc6, 0x02355347, 0x027dd496, 0x01005914, 0x019b0225, 0x01d9c7ce, 0x003d9be4}}}, + {X: Field{[10]uint32{0x02cbe126, 0x0217a1fa, 0x01ff4080, 0x0162f9d7, 0x024181dd, 0x03649536, 0x037789ee, 0x020fb760, 0x02760835, 0x00042b19}}, Y: Field{[10]uint32{0x0317d22d, 0x015fafae, 0x02a1a01f, 0x02806057, 0x0372e0db, 0x031ac96b, 0x0065acb0, 0x039eec1d, 0x02de23f3, 0x001b4faa}}}, + {X: Field{[10]uint32{0x00153048, 0x029a5ea3, 0x037da8db, 0x003e6d87, 0x02974c4c, 0x00823a8f, 0x01677962, 0x01550111, 0x01ea7bb6, 0x00079e68}}, Y: Field{[10]uint32{0x00787fc4, 0x03bca97c, 0x015dd394, 0x02f8ce81, 0x03e07d35, 0x02a0023a, 0x01874064, 0x012221a2, 0x017920a3, 0x002d8f8f}}}, + {X: Field{[10]uint32{0x03fa9a5b, 0x02f34254, 0x0076a7be, 0x00604759, 0x02116991, 0x0003fc4f, 0x00df2abb, 0x0288fd42, 0x007397b0, 0x0036c347}}, Y: Field{[10]uint32{0x0100dfe8, 0x0278ca12, 0x00dc9d0b, 0x010598a7, 0x032f85fd, 0x02d723bb, 0x01724312, 0x013c7b46, 0x00773ca7, 0x00072742}}}, + {X: Field{[10]uint32{0x03385f27, 0x0280fb72, 0x03622003, 0x008f9883, 0x03969042, 0x00b9dd6f, 0x02bdc229, 0x033a3499, 0x03b3481e, 0x00387f75}}, Y: Field{[10]uint32{0x030a4c77, 0x01019aa5, 0x03e6d09e, 0x024f8840, 0x03d9b31f, 0x00ff71a9, 0x02dee658, 0x00ffdc35, 0x039f2895, 0x000f3eac}}}, + {X: Field{[10]uint32{0x0223ffd3, 0x037c46a8, 0x018803b2, 0x0396fc62, 0x039ed85f, 0x0084c323, 0x02701c92, 0x02ee3cf5, 0x01342b69, 0x00259e5c}}, Y: Field{[10]uint32{0x02631d31, 0x025f91c3, 0x0394e059, 0x031b0255, 0x02632c0d, 0x034a68f9, 0x00b6d93c, 0x01be7df1, 0x003f630b, 0x000b50cd}}}, + {X: Field{[10]uint32{0x01c33efc, 0x020505f6, 0x03ba8cba, 0x01b66a67, 0x00ec0a77, 0x02677520, 0x01d2a0f3, 0x0352531a, 0x02186e27, 0x0037ed00}}, Y: Field{[10]uint32{0x0137796e, 0x01ec4ad7, 0x00f4861f, 0x00705e08, 0x009bd850, 0x02580c14, 0x0245bcb7, 0x00c9cc57, 0x01dce9f9, 0x000ccb64}}}, + {X: Field{[10]uint32{0x027681ec, 0x02e11a30, 0x035e5189, 0x0011fef8, 0x01171de0, 0x017068cc, 0x0208da7b, 0x03729145, 0x01ebed13, 0x001ad971}}, Y: Field{[10]uint32{0x01a34f62, 0x01e723a2, 0x01f43e26, 0x0137d6ee, 0x013e71fc, 0x01bf53e1, 0x0246b51f, 0x02f02cbc, 0x02e8e0ae, 0x0002bf43}}}, + {X: Field{[10]uint32{0x00c4b619, 0x00e43d4a, 0x0100480a, 0x008bf7f3, 0x03021e5c, 0x03509b7c, 0x02396aa5, 0x00e59789, 0x01a160b0, 0x002f070f}}, Y: Field{[10]uint32{0x00a31640, 0x03b5192b, 0x03bc8076, 0x0334d6b2, 0x0386ad94, 0x0108b046, 0x017862c0, 0x03faa42b, 0x017465e4, 0x003f595c}}}, + {X: Field{[10]uint32{0x0005913a, 0x004f7ea3, 0x038e2de6, 0x001b0b1b, 0x01090264, 0x02f161f8, 0x038a6a8c, 0x0328d54f, 0x011796d6, 0x001626c7}}, Y: Field{[10]uint32{0x003fb3e0, 0x00b2eb94, 0x02c87974, 0x01a76917, 0x003c7b64, 0x00eee8a9, 0x039365de, 0x013d1b89, 0x01ecac25, 0x00399575}}}, + {X: Field{[10]uint32{0x00ae4ed5, 0x016fe61e, 0x01677612, 0x033f3a9d, 0x016ada63, 0x024b652f, 0x01c2ef5c, 0x01b0aa53, 0x03856d1e, 0x00279c98}}, Y: Field{[10]uint32{0x00e304dd, 0x03d4d058, 0x01896069, 0x01010f24, 0x030a83bc, 0x0371ea8a, 0x028a48e0, 0x00e3e2d8, 0x01f51e5b, 0x002308e3}}}, + {X: Field{[10]uint32{0x02764263, 0x02d76f71, 0x018d57ea, 0x02bc9548, 0x004f9bd3, 0x00820380, 0x000c551b, 0x03dd3ee9, 0x017814e0, 0x000489a7}}, Y: Field{[10]uint32{0x0385b3d6, 0x017e1938, 0x01a704a9, 0x031f08b7, 0x00daee58, 0x02f45a48, 0x02febcdb, 0x025d7041, 0x00bd6584, 0x0003c3dc}}}, + {X: Field{[10]uint32{0x033088a6, 0x0245ced5, 0x03aa315e, 0x02fc59db, 0x005c73fd, 0x009cfbff, 0x0048cdd6, 0x02405383, 0x032fcc50, 0x0034c84b}}, Y: Field{[10]uint32{0x0032df82, 0x01902112, 0x02fc09db, 0x03aa14fe, 0x00ff59b6, 0x0271a4d3, 0x02618c84, 0x03d47cd8, 0x01f10673, 0x000e6bce}}}, + {X: Field{[10]uint32{0x00250052, 0x01168821, 0x02dccdae, 0x03f67d0a, 0x034ef288, 0x03d92588, 0x0014e724, 0x002eb510, 0x032b9bcc, 0x00314d7d}}, Y: Field{[10]uint32{0x02271022, 0x0171fb92, 0x000a7465, 0x0008a4c0, 0x02884473, 0x01f3a0a6, 0x0014a17f, 0x018c6d8a, 0x005b6fb7, 0x000fde66}}}, + {X: Field{[10]uint32{0x03399605, 0x003eb4e4, 0x03c121c8, 0x004bb035, 0x03271e39, 0x003b437d, 0x002bb186, 0x027e9618, 0x01269b16, 0x0013d6dc}}, Y: Field{[10]uint32{0x01cfd0a7, 0x0104d8f3, 0x00fb5dbe, 0x03c81881, 0x02576f63, 0x025f24ca, 0x002c6cdb, 0x0163aa44, 0x01047f2a, 0x002d83f0}}}, + {X: Field{[10]uint32{0x03d5d065, 0x0323c6ed, 0x03851de9, 0x01f5cde9, 0x000ec70e, 0x0000a705, 0x02c2863e, 0x00e2c6bc, 0x033b244c, 0x0032d166}}, Y: Field{[10]uint32{0x0157fbd0, 0x01d293c6, 0x010ea53a, 0x0055a4b2, 0x02a888bd, 0x03a242ce, 0x02462411, 0x01db20bd, 0x015d3c03, 0x001ed9ec}}}, + {X: Field{[10]uint32{0x0219054e, 0x00a87e93, 0x02597ea7, 0x018f4691, 0x02d389f5, 0x03d0d065, 0x03121bb7, 0x03831463, 0x01c70ebd, 0x001e1f58}}, Y: Field{[10]uint32{0x0272a658, 0x00ef2fab, 0x014ba4b9, 0x02ef5cad, 0x03f42e9e, 0x02cf4542, 0x031cf396, 0x0232e309, 0x02f25fcf, 0x0016ebd5}}}, + {X: Field{[10]uint32{0x01f6115c, 0x00edbaf1, 0x012bacc9, 0x0229808d, 0x02337353, 0x0358e420, 0x037d97cb, 0x02c3252d, 0x002a31d0, 0x0030e2bf}}, Y: Field{[10]uint32{0x03ee529f, 0x0109a210, 0x004690d8, 0x022f4b96, 0x01875e09, 0x01917e35, 0x01a26a4c, 0x03f3092e, 0x03cab138, 0x002e4977}}}, + {X: Field{[10]uint32{0x03406d0a, 0x0321e6bf, 0x0282ad6e, 0x002e2ade, 0x0339a5dd, 0x016e6c97, 0x01c6ad5e, 0x01ba56e7, 0x023b8e60, 0x000dd987}}, Y: Field{[10]uint32{0x03e9b977, 0x02c58e29, 0x002a4df1, 0x00e44c8e, 0x0160d8bc, 0x01b3e510, 0x017e07bd, 0x023f384c, 0x025d430d, 0x002adcd7}}}, + {X: Field{[10]uint32{0x01e256ba, 0x01a28594, 0x02062abd, 0x0367d939, 0x0388ea5a, 0x0370319d, 0x018e9348, 0x00ad1f0f, 0x0051b8c2, 0x0039449e}}, Y: Field{[10]uint32{0x030405c6, 0x01fce1c9, 0x004b3f94, 0x0136e1c1, 0x025b1e7d, 0x0154dffe, 0x034b7dc0, 0x027ade42, 0x037e0034, 0x001611fd}}}, + {X: Field{[10]uint32{0x017382e9, 0x0191ee6b, 0x03b41955, 0x02601482, 0x02127a36, 0x00e03f81, 0x013e7cb7, 0x02a284dc, 0x005da6b8, 0x003cf1fd}}, Y: Field{[10]uint32{0x023e7c87, 0x0397ef7d, 0x00a51ddf, 0x0005c675, 0x034b4693, 0x00024d9d, 0x01decd09, 0x0274c7dc, 0x0211eb1b, 0x000ab3e6}}}, + {X: Field{[10]uint32{0x00d745ba, 0x012cbc21, 0x024de0ff, 0x0254eec3, 0x0279125f, 0x0122a642, 0x03733a18, 0x02c94948, 0x0047e8d5, 0x0021b790}}, Y: Field{[10]uint32{0x01bc969a, 0x0269d19c, 0x02007427, 0x00146a7b, 0x03569211, 0x0177a4b4, 0x0284cf7d, 0x000174ac, 0x00720dac, 0x001c79a9}}}, + {X: Field{[10]uint32{0x03f57504, 0x021d70bc, 0x02c635e2, 0x032b0317, 0x023029d9, 0x03cea85a, 0x020cd963, 0x02759b65, 0x00307225, 0x00318457}}, Y: Field{[10]uint32{0x037a712f, 0x004a1427, 0x0077050d, 0x0004d10f, 0x01ced024, 0x00f20868, 0x017f56c2, 0x0375e35e, 0x00d0b33f, 0x000635a4}}}, + {X: Field{[10]uint32{0x02f53c5b, 0x034d9d10, 0x03c6ac61, 0x03c78afe, 0x018bfae0, 0x01a4a6c1, 0x0038cbd7, 0x011cee46, 0x00998b43, 0x0032d514}}, Y: Field{[10]uint32{0x01572bbf, 0x0236de24, 0x00ddfde3, 0x02e9efed, 0x01c00ba8, 0x026e77d5, 0x03684b4f, 0x013c2335, 0x034d79e3, 0x00104675}}}, + {X: Field{[10]uint32{0x02922d2a, 0x014bca14, 0x013725a7, 0x01cf1b42, 0x020a333b, 0x0182a628, 0x01771e26, 0x00aed3ec, 0x0304b936, 0x00343739}}, Y: Field{[10]uint32{0x02e37e47, 0x028e4565, 0x018ffde5, 0x01529314, 0x02124d3f, 0x016730bb, 0x033891a2, 0x033837c7, 0x03707947, 0x003e4b0e}}}, + {X: Field{[10]uint32{0x016b20a4, 0x02866fc8, 0x03a96249, 0x01679f5c, 0x03d42702, 0x01957314, 0x02ab8570, 0x016618e3, 0x0238e5aa, 0x0036e4f8}}, Y: Field{[10]uint32{0x03bcc7c5, 0x035fad7e, 0x0094c815, 0x025718bf, 0x033ab178, 0x009bbd95, 0x034f60cd, 0x023ad942, 0x008b670e, 0x00234677}}}, + {X: Field{[10]uint32{0x00c3f486, 0x01753bda, 0x01835ba8, 0x03f2efc4, 0x014d6c6c, 0x001e584a, 0x0207e54b, 0x02fbe0a7, 0x037fd8ce, 0x0030e1f0}}, Y: Field{[10]uint32{0x01ddeda9, 0x03f9e384, 0x00897994, 0x0036d896, 0x03c8e3ae, 0x004b5ff9, 0x020f7d7f, 0x02cc01b2, 0x00d9ae7e, 0x00214960}}}, + {X: Field{[10]uint32{0x0206c232, 0x00dd271d, 0x01092f94, 0x03748eb6, 0x024d3b22, 0x024aed2d, 0x0001b5b1, 0x039544df, 0x0134f04d, 0x003aed63}}, Y: Field{[10]uint32{0x01d1ae16, 0x01223f37, 0x0112bc59, 0x00b14272, 0x03d92ae7, 0x0016af26, 0x01d3e829, 0x03e7536c, 0x01059c99, 0x0006e5e7}}}, + {X: Field{[10]uint32{0x02e38e6b, 0x017390a5, 0x038d8252, 0x022befc8, 0x032f1317, 0x00c32b44, 0x01810b17, 0x028a6dd9, 0x0066acfd, 0x001e2473}}, Y: Field{[10]uint32{0x027caaf1, 0x02b3d94d, 0x02db972f, 0x039f6c02, 0x03a21ff6, 0x01fb2bb0, 0x02987ad0, 0x0231b118, 0x03292018, 0x0008864d}}}, + {X: Field{[10]uint32{0x0014d081, 0x014378d6, 0x011f472c, 0x0003028c, 0x000acec8, 0x01e4ff63, 0x02578a53, 0x007a34b0, 0x0142e4bc, 0x00302c09}}, Y: Field{[10]uint32{0x017f8371, 0x0262f06d, 0x01673136, 0x0213afff, 0x0376b1a8, 0x00702465, 0x02e6bb57, 0x005f0006, 0x00710f59, 0x000092f7}}}, + {X: Field{[10]uint32{0x0026d2dd, 0x028dad71, 0x014b2f07, 0x03d13acf, 0x03c2000c, 0x0103a980, 0x02fd9a3e, 0x01141fc4, 0x0174b870, 0x003a8575}}, Y: Field{[10]uint32{0x0230944e, 0x00969462, 0x0124b6ca, 0x01b16269, 0x00c5cdc1, 0x02df8e25, 0x00faf58a, 0x028e7d38, 0x014f4d8c, 0x002d965b}}}, + {X: Field{[10]uint32{0x039604de, 0x006dde73, 0x006726e5, 0x02604d63, 0x02708776, 0x009274d3, 0x00d5726a, 0x01abdee2, 0x03dfc35a, 0x001df4e1}}, Y: Field{[10]uint32{0x008b4a87, 0x0336693c, 0x0324993f, 0x001b7805, 0x01459165, 0x013e8ac7, 0x013c2351, 0x02a58b4b, 0x02cd2d70, 0x003976bb}}}, + {X: Field{[10]uint32{0x01ccd7ec, 0x01aa7727, 0x02db8329, 0x03530c54, 0x031064f9, 0x035bfbee, 0x024dc2f9, 0x0093ef06, 0x02cb7d1a, 0x002a49d0}}, Y: Field{[10]uint32{0x01679f76, 0x0063908c, 0x0225ad9d, 0x018ecf9c, 0x0266d4f1, 0x0208fcf1, 0x0346df60, 0x03c293b0, 0x00f98cda, 0x001996a7}}}, + {X: Field{[10]uint32{0x02316a46, 0x02c417e9, 0x02b6f36c, 0x0368a783, 0x00f62de9, 0x01ed54c1, 0x034053d3, 0x00e4f574, 0x00f79f0c, 0x00094f95}}, Y: Field{[10]uint32{0x027155e0, 0x038cfaf3, 0x03fd7b2a, 0x01fe3f82, 0x0067c857, 0x016c9fbc, 0x029417ac, 0x03b030ca, 0x00cded78, 0x0015385a}}}, + {X: Field{[10]uint32{0x0003fbf2, 0x01173000, 0x004434ee, 0x031eccf6, 0x0255fc01, 0x038e00a6, 0x039586f9, 0x021c8185, 0x00e0e9c3, 0x00344c12}}, Y: Field{[10]uint32{0x00743f37, 0x01d42021, 0x021e3640, 0x0102e6f1, 0x01af2578, 0x02c9470e, 0x00906897, 0x0091de15, 0x02db9450, 0x001f1119}}}, + {X: Field{[10]uint32{0x00a284a2, 0x001194dc, 0x032c88e6, 0x00dca958, 0x02a632b2, 0x02f6f26a, 0x007d0797, 0x008488a2, 0x0110387c, 0x003a48d0}}, Y: Field{[10]uint32{0x036523c4, 0x02c33edb, 0x0363ae80, 0x0147dd03, 0x01839a26, 0x01be63b6, 0x03b3afe6, 0x01486d3f, 0x008c4ca3, 0x000ae62c}}}, + {X: Field{[10]uint32{0x03a29be5, 0x02a76b60, 0x0271332b, 0x007253e2, 0x00742834, 0x02ec95d9, 0x0091a5a7, 0x01e3bdce, 0x03a7ab69, 0x000c0b80}}, Y: Field{[10]uint32{0x0310120b, 0x028be0d5, 0x002eea98, 0x036d9102, 0x030e8430, 0x0395aecf, 0x02e850d2, 0x00d6facb, 0x02db210c, 0x0012af82}}}, + {X: Field{[10]uint32{0x01665368, 0x03345584, 0x008598d7, 0x0370c75a, 0x024fea8b, 0x02c3e31e, 0x020571ee, 0x003cc372, 0x03894440, 0x0014dc04}}, Y: Field{[10]uint32{0x02a97cbe, 0x0069d3fa, 0x02d1971b, 0x036fc5a9, 0x01a712e2, 0x02a68db8, 0x0331bbe5, 0x03c88695, 0x026439c1, 0x00328d15}}}, + {X: Field{[10]uint32{0x028383cd, 0x0254a6bc, 0x00ff4957, 0x0375508f, 0x01656aaa, 0x0168b4e6, 0x012b6f7a, 0x01f2e3eb, 0x0186645d, 0x002303a0}}, Y: Field{[10]uint32{0x0048d27f, 0x035dd5d3, 0x018ffcdc, 0x013b2538, 0x0263c6d2, 0x023eed20, 0x007319d1, 0x0126064c, 0x01ea14c4, 0x000bbc9d}}}, + {X: Field{[10]uint32{0x03ad8af5, 0x010f5e97, 0x0101dafc, 0x004b1a5e, 0x01adddc5, 0x03fe32a6, 0x01615c45, 0x028f2684, 0x003126ba, 0x001929c2}}, Y: Field{[10]uint32{0x02fe29d5, 0x014f9c2a, 0x0342c432, 0x0128a23d, 0x00148efe, 0x02ec5e5a, 0x0245c354, 0x017dab0e, 0x008b59a6, 0x002e90f1}}}, + {X: Field{[10]uint32{0x01438e06, 0x02d1ea97, 0x0268051d, 0x033ed3d5, 0x0363559a, 0x00598917, 0x03785e2e, 0x023892cb, 0x026e82ff, 0x003f6f41}}, Y: Field{[10]uint32{0x02973d63, 0x038aa104, 0x03def144, 0x0356c905, 0x02875731, 0x022e5267, 0x02a5d382, 0x036308dd, 0x01cfa19e, 0x0001836b}}}, + {X: Field{[10]uint32{0x02ad174f, 0x009bd07b, 0x03e0af1b, 0x033cb72c, 0x0282cf15, 0x02518544, 0x01dba01d, 0x001cc467, 0x00b81ff9, 0x002ca1f3}}, Y: Field{[10]uint32{0x0374e090, 0x02f7027e, 0x01bd1acf, 0x02af000e, 0x0236d1be, 0x036d9bb4, 0x038a4635, 0x002fb92c, 0x03397a9a, 0x001bfc54}}}, + {X: Field{[10]uint32{0x01068116, 0x035735ff, 0x02c3c962, 0x015c06f7, 0x033b3f84, 0x02cc0cbe, 0x01f21888, 0x00d293e9, 0x0248b652, 0x0006011e}}, Y: Field{[10]uint32{0x0224574b, 0x01385681, 0x0117b1f3, 0x00244068, 0x01801342, 0x033a95a0, 0x02c54446, 0x0220c8c1, 0x02691819, 0x0004d89d}}}, + {X: Field{[10]uint32{0x0235f914, 0x01f9ea00, 0x02aae0ce, 0x03a56f52, 0x026b74ff, 0x0290784d, 0x022dd328, 0x00b39622, 0x014fbe4e, 0x003c74ed}}, Y: Field{[10]uint32{0x00a3981a, 0x03589dea, 0x0233be86, 0x01965fbf, 0x02c0c211, 0x0212188c, 0x02e1471e, 0x0205fad2, 0x0141300e, 0x000df097}}}, + {X: Field{[10]uint32{0x013bec4a, 0x00e8db61, 0x02a839ce, 0x00db1788, 0x019770da, 0x0042b55b, 0x03509a60, 0x037eadff, 0x01e95046, 0x0026c36a}}, Y: Field{[10]uint32{0x00135faa, 0x01dd40ce, 0x024d96da, 0x006468a4, 0x03df757c, 0x010e0a73, 0x00bbc3ff, 0x0168dba0, 0x034530c2, 0x0009f580}}}, + {X: Field{[10]uint32{0x0099c5cc, 0x03635976, 0x025f9f13, 0x0093cbad, 0x022d3e4d, 0x01c5d5a3, 0x0255d403, 0x03462c2f, 0x03d95155, 0x003420ce}}, Y: Field{[10]uint32{0x024741e8, 0x01cef265, 0x01de13c4, 0x020bb13a, 0x02ffeefb, 0x01b6dc51, 0x03b1e4c5, 0x012ad447, 0x02c3b504, 0x0039426b}}}, + {X: Field{[10]uint32{0x03c37117, 0x00ca788b, 0x038a626c, 0x01885f27, 0x03ed62ad, 0x01e6039a, 0x0201b402, 0x005f90a2, 0x027c185f, 0x00231058}}, Y: Field{[10]uint32{0x023662f7, 0x016dee4e, 0x01ca77d9, 0x01071ccb, 0x02a36da4, 0x020fdcfb, 0x028a1e74, 0x029548df, 0x026c3316, 0x001d7288}}}, + {X: Field{[10]uint32{0x03728d27, 0x018a0ec9, 0x0311e7cc, 0x01b96d42, 0x002d75c2, 0x0284ee5f, 0x007099e9, 0x02a8c173, 0x0105e43a, 0x000dc7c0}}, Y: Field{[10]uint32{0x02b3ce99, 0x00ee031a, 0x0149b029, 0x009b3b7c, 0x01b11944, 0x0114e3ab, 0x00643120, 0x01b5a233, 0x03e7d097, 0x00325a76}}}, + {X: Field{[10]uint32{0x00cb1710, 0x03fef70b, 0x03e03541, 0x020dea3c, 0x02d94aeb, 0x01761930, 0x034d3a18, 0x028d63e2, 0x019a4238, 0x001440bd}}, Y: Field{[10]uint32{0x01ef1445, 0x008824e1, 0x016ce915, 0x030e27a6, 0x010bbffd, 0x035072af, 0x0130606c, 0x00f0fd33, 0x00f9adb6, 0x00278531}}}, + {X: Field{[10]uint32{0x03f08beb, 0x00aea9c7, 0x00cc26df, 0x02bef52a, 0x00a7f57e, 0x00d858bc, 0x00353c78, 0x0100f01e, 0x036cfd40, 0x00032886}}, Y: Field{[10]uint32{0x037f12f9, 0x038f9607, 0x03ffee6a, 0x02085092, 0x03d6b684, 0x0147b6c3, 0x019f2ef7, 0x02956cff, 0x004647eb, 0x0004228f}}}, + {X: Field{[10]uint32{0x01d775d9, 0x0139a28c, 0x007697c9, 0x00b2b310, 0x017ec364, 0x00038f72, 0x0368bc82, 0x034673a0, 0x00b3ff40, 0x00367351}}, Y: Field{[10]uint32{0x005f0901, 0x03257ad2, 0x033cb085, 0x006d6eaf, 0x03fd7c4a, 0x01e7792b, 0x00f71010, 0x03dc0753, 0x036c683e, 0x002dadbe}}}, + {X: Field{[10]uint32{0x01a10360, 0x02f7d105, 0x021e104f, 0x0020ff31, 0x00510da5, 0x006f5241, 0x01644267, 0x01a222ed, 0x00b2cbcb, 0x002684d5}}, Y: Field{[10]uint32{0x034f953a, 0x03a2e0a1, 0x01b9b710, 0x03ce0776, 0x03bc4927, 0x00f8900d, 0x023a2a89, 0x0122d136, 0x0291707c, 0x000fd7d4}}}, + {X: Field{[10]uint32{0x010fdf79, 0x002ae76b, 0x02941bd5, 0x0314e1a4, 0x0220fc60, 0x03ac3f6f, 0x03deb0bc, 0x020712b9, 0x020f271a, 0x00317957}}, Y: Field{[10]uint32{0x01c83a63, 0x001ddbff, 0x000aecb1, 0x01f5c228, 0x0285ed9e, 0x018aba4e, 0x0253e7cc, 0x024c041e, 0x0335eab4, 0x0004e283}}}, + {X: Field{[10]uint32{0x0060f919, 0x0012bb64, 0x012c69a0, 0x01c81667, 0x027c67ea, 0x03317d98, 0x010e4dc6, 0x02f4f48a, 0x03647f66, 0x0017af0b}}, Y: Field{[10]uint32{0x0054659c, 0x0265b582, 0x00f1e56e, 0x0182c432, 0x033ec1e8, 0x014da58d, 0x00f79206, 0x0217889f, 0x03cedf20, 0x001a3df6}}}, + {X: Field{[10]uint32{0x03966e03, 0x0041d733, 0x00b2da42, 0x02074e96, 0x00161d70, 0x029e7258, 0x011a5a79, 0x00374141, 0x039c7d06, 0x0013ca3a}}, Y: Field{[10]uint32{0x0267fafc, 0x03cf8174, 0x02a6c2ef, 0x00f4b3c4, 0x0044849f, 0x028abf9e, 0x02aeb8e4, 0x011d06ec, 0x00610543, 0x003b0de2}}}, + {X: Field{[10]uint32{0x0283fe8f, 0x0056d286, 0x005c0efe, 0x03b95fb2, 0x019fa039, 0x002cd1f2, 0x00c7a9a1, 0x00f82614, 0x00d1ce11, 0x003d4388}}, Y: Field{[10]uint32{0x02e975be, 0x026ff0fe, 0x00aa94db, 0x01e09f55, 0x00cee464, 0x00501fc8, 0x018595f6, 0x01068a08, 0x023190df, 0x00136df0}}}, + {X: Field{[10]uint32{0x03eff5ef, 0x021068ea, 0x01e76ab2, 0x01735092, 0x0079de94, 0x015620af, 0x038cdf2b, 0x02ae5775, 0x02d01ade, 0x003339ac}}, Y: Field{[10]uint32{0x00626e52, 0x0109f94d, 0x02bd5604, 0x02be7e89, 0x01bab1db, 0x0182c6f5, 0x03764bb5, 0x00502bf7, 0x02741312, 0x00075a41}}}, + {X: Field{[10]uint32{0x032d8475, 0x003b5ba7, 0x03bbfbc8, 0x0394b4d2, 0x01e4830b, 0x016bf3b0, 0x00c73121, 0x0155f4bb, 0x0174fb10, 0x00156994}}, Y: Field{[10]uint32{0x038012c0, 0x032245c9, 0x03eec611, 0x03539cd4, 0x023f0623, 0x01524e01, 0x00dd4126, 0x014dea5c, 0x01f1de1e, 0x0031a5e5}}}, + {X: Field{[10]uint32{0x0127f290, 0x03b4a298, 0x00ab0267, 0x0065d965, 0x02d0c1d8, 0x01eb2351, 0x022779e9, 0x02cf71f8, 0x00fa7b4d, 0x001e0887}}, Y: Field{[10]uint32{0x03c46a54, 0x014fa432, 0x00b663ad, 0x0030b8d6, 0x02ace066, 0x03aad594, 0x003a1582, 0x02318922, 0x01edfd8e, 0x00237735}}}, + {X: Field{[10]uint32{0x006ed178, 0x00b5bea6, 0x03f9602b, 0x038a3e4b, 0x009006cc, 0x00041e0b, 0x00da39d6, 0x0390d3b5, 0x0039441e, 0x0026e614}}, Y: Field{[10]uint32{0x02c6cfa4, 0x0397e704, 0x003bb85f, 0x0385cfc0, 0x028a50da, 0x0364e230, 0x03f67d22, 0x01ecade2, 0x01c87b53, 0x003873e1}}}, + {X: Field{[10]uint32{0x037edf20, 0x027c8103, 0x004f38ae, 0x02c0a477, 0x026c27e7, 0x026d9d5e, 0x01b9d78d, 0x0123795f, 0x03b14a9e, 0x0026a8bf}}, Y: Field{[10]uint32{0x037d1040, 0x022dfd8d, 0x00a115ff, 0x03549dcb, 0x018f80d7, 0x0164a54b, 0x00066ef8, 0x03de53f8, 0x03e378e0, 0x001dc71e}}}, + {X: Field{[10]uint32{0x02937e1f, 0x0166a271, 0x02c021e3, 0x0145b603, 0x00949de2, 0x00248a83, 0x00510cb4, 0x02d18c5f, 0x008366a0, 0x00344164}}, Y: Field{[10]uint32{0x02c8630e, 0x0105517e, 0x000ac99c, 0x00bebb1e, 0x020e5e6f, 0x03117836, 0x017155c0, 0x011052a2, 0x0225c9ea, 0x0021014e}}}, + {X: Field{[10]uint32{0x01c5d066, 0x028bfc7e, 0x027c23e7, 0x03671c2e, 0x031ac58a, 0x00aa07df, 0x01c2d810, 0x02612bfb, 0x02cf7456, 0x0007cfb2}}, Y: Field{[10]uint32{0x01a23e54, 0x00d7601c, 0x00d94cd4, 0x018b83e6, 0x0015f1f3, 0x0085a07e, 0x034539ef, 0x0093c5cf, 0x00fa2bfd, 0x0031ab76}}}, + {X: Field{[10]uint32{0x022c4371, 0x03372836, 0x024fe569, 0x001bacd4, 0x035e504d, 0x01b23e51, 0x0151ece8, 0x0032b495, 0x0309a16d, 0x0028c4b1}}, Y: Field{[10]uint32{0x03ae7b03, 0x01e00e6c, 0x039690c7, 0x00a6b1ef, 0x0008c1fc, 0x01ad6ee1, 0x009ea2c6, 0x03176882, 0x002aea04, 0x002197b3}}}, + {X: Field{[10]uint32{0x004197af, 0x03ccbd9d, 0x0169d953, 0x036c405f, 0x008c3493, 0x030bbb4e, 0x00f64109, 0x02e9e3ef, 0x0275e829, 0x003c8711}}, Y: Field{[10]uint32{0x018b2f57, 0x03dd2b42, 0x03ef2b37, 0x01cd20b4, 0x01043d93, 0x028dec0f, 0x030ee061, 0x01f2bd76, 0x033e4337, 0x003f4b19}}}, + {X: Field{[10]uint32{0x00865692, 0x03b5f006, 0x014268fe, 0x00ce9cef, 0x01f48369, 0x02146acc, 0x00b2eb61, 0x02680bef, 0x00ea2a02, 0x0004585d}}, Y: Field{[10]uint32{0x030aaefd, 0x01cb5375, 0x00352ee7, 0x015512d9, 0x0125cf38, 0x01bd7475, 0x03ca2a2d, 0x02b676d7, 0x0027e1ce, 0x000848f4}}}, + {X: Field{[10]uint32{0x03f9d663, 0x00cd7e9c, 0x0260a962, 0x0343d79f, 0x022334fc, 0x015f9cb5, 0x00a21173, 0x0131b3d9, 0x03d0919e, 0x000d639d}}, Y: Field{[10]uint32{0x0037bc08, 0x02dbad9e, 0x020cb8b5, 0x02be821a, 0x03dcf5cd, 0x0222b1f3, 0x03819859, 0x03d00c41, 0x02206f99, 0x001fbe35}}}, + {X: Field{[10]uint32{0x02a33fa9, 0x031b6aae, 0x0060db86, 0x02cea04d, 0x008056de, 0x00597eab, 0x0157e203, 0x03c518e4, 0x020d9e81, 0x001427df}}, Y: Field{[10]uint32{0x00db6ea9, 0x016e34a8, 0x03090a09, 0x017f0eff, 0x03fd1216, 0x00fc6b4e, 0x028645f9, 0x02db139a, 0x021a340e, 0x00154523}}}, + {X: Field{[10]uint32{0x02a4ed09, 0x031f9ab4, 0x020b9ad9, 0x02f50e00, 0x00a15c95, 0x00d1bc87, 0x01e30c49, 0x0038987a, 0x025c185f, 0x000d638c}}, Y: Field{[10]uint32{0x0118c4b8, 0x026d97cb, 0x01b3d97f, 0x02f4d1e2, 0x0154aa11, 0x02cf5861, 0x02ef6903, 0x0056ca04, 0x0074c977, 0x00017f30}}}, + {X: Field{[10]uint32{0x01a2fc4c, 0x00daf8f7, 0x00d2608d, 0x00411e24, 0x02e314c3, 0x00962780, 0x0337e4ea, 0x02bcb4df, 0x012dbc00, 0x0007871c}}, Y: Field{[10]uint32{0x010655dc, 0x02c7da92, 0x00c145bf, 0x01d410b5, 0x03974e7e, 0x034c2ce2, 0x0398cf5a, 0x01aef8d9, 0x039ae313, 0x00012263}}}, + {X: Field{[10]uint32{0x03ffcd1d, 0x025ed5c8, 0x03918bd7, 0x0081cd86, 0x0064e317, 0x0202a564, 0x03b794dc, 0x01e6c3fc, 0x039aaa3f, 0x0029945b}}, Y: Field{[10]uint32{0x0254f5d4, 0x0140c00e, 0x00f9bed5, 0x0373af6f, 0x02812373, 0x01f1f0c4, 0x0377b074, 0x02e0c14f, 0x006b59f3, 0x003164d3}}}, + {X: Field{[10]uint32{0x01098155, 0x00046e2c, 0x01b79295, 0x00cf6966, 0x0150cb56, 0x00c1111a, 0x03ab8240, 0x006e12e7, 0x00d88b1e, 0x00391ad2}}, Y: Field{[10]uint32{0x00c94f51, 0x01e4d96c, 0x00a80a5d, 0x02033654, 0x003e7c8a, 0x0165d0d4, 0x002e5512, 0x0265db8d, 0x02244a33, 0x0010fa6e}}}, + {X: Field{[10]uint32{0x0365aa0b, 0x00cdc34f, 0x03400e58, 0x01000489, 0x00e1cc2d, 0x037e79c5, 0x025105b1, 0x030b8018, 0x009997a9, 0x00329e94}}, Y: Field{[10]uint32{0x02e1f071, 0x007abf99, 0x02039b7a, 0x011334b3, 0x0319c618, 0x03df2c3b, 0x01994fce, 0x03346883, 0x00e4d2ee, 0x00376329}}}, + {X: Field{[10]uint32{0x02313f08, 0x003561a5, 0x02d0da39, 0x027bb007, 0x00848659, 0x01de1b10, 0x01352d4b, 0x015dbc44, 0x02c0d29b, 0x000c9ad7}}, Y: Field{[10]uint32{0x0011d384, 0x020a2a04, 0x0126495e, 0x0280f693, 0x01c2d5d3, 0x0356ca83, 0x02a60633, 0x01952f9e, 0x0171a4ac, 0x003d28fc}}}, + {X: Field{[10]uint32{0x030d306d, 0x024c8a39, 0x03e2b392, 0x03bb944b, 0x017c5bf8, 0x03fa6eb6, 0x017038db, 0x031d6a95, 0x018254f5, 0x0002dd8a}}, Y: Field{[10]uint32{0x003606c5, 0x036cf6c5, 0x016fbf92, 0x01d4e612, 0x020cc85c, 0x035f7a2f, 0x035bb2d0, 0x00fa18b1, 0x039fb36e, 0x0022e023}}}, + {X: Field{[10]uint32{0x032286ca, 0x026886e1, 0x014f5ef7, 0x0295e419, 0x03ae66f1, 0x03c6a046, 0x0250a096, 0x00dbff77, 0x00e12b1d, 0x0022f589}}, Y: Field{[10]uint32{0x011f02df, 0x02e015eb, 0x004d0fe9, 0x02885c15, 0x038bf6a2, 0x01108d2b, 0x0331c747, 0x022586d9, 0x022ef453, 0x0019a1fa}}}, + {X: Field{[10]uint32{0x01de48a9, 0x02349741, 0x03da42d7, 0x00cf555c, 0x01509d1c, 0x03e11b19, 0x01414ccc, 0x024a402f, 0x02c72a9f, 0x003b497a}}, Y: Field{[10]uint32{0x00d89eaa, 0x0287ad40, 0x028b98f3, 0x03407dce, 0x018705a9, 0x020b35ef, 0x011583c6, 0x03f40edb, 0x01ed2710, 0x00155bea}}}, + {X: Field{[10]uint32{0x00bc02bf, 0x012e79c2, 0x000600df, 0x030778a0, 0x000e8fac, 0x01d57ecc, 0x027bc94c, 0x01aa1271, 0x036c9ed7, 0x003c650e}}, Y: Field{[10]uint32{0x002a40a7, 0x023295a2, 0x004b0481, 0x00cb7c7e, 0x03a31562, 0x00b2e1db, 0x00bb6464, 0x01383dab, 0x020885dc, 0x002631ee}}}, + {X: Field{[10]uint32{0x01e9e5d3, 0x01460ca9, 0x02f391d3, 0x0085ab23, 0x03834228, 0x033b6b9e, 0x0024276d, 0x02ae3ec3, 0x03142de3, 0x00316d82}}, Y: Field{[10]uint32{0x02b5cd69, 0x00ab37e7, 0x01260e91, 0x01e381f0, 0x02332595, 0x00535297, 0x01e10d90, 0x039827d5, 0x00da1174, 0x0033a1b9}}}, + {X: Field{[10]uint32{0x013755ab, 0x00b10252, 0x014f592e, 0x000305a3, 0x01c77782, 0x014fe678, 0x019647b2, 0x03f98ccd, 0x038e706c, 0x0002c198}}, Y: Field{[10]uint32{0x0344bbd5, 0x0228e0f2, 0x0369d3e8, 0x01ee1f9f, 0x03e16dd3, 0x027e54d5, 0x02e24933, 0x0148a44d, 0x03ab1b4d, 0x00399007}}}, + {X: Field{[10]uint32{0x024b14cf, 0x00e6df49, 0x03cd89f5, 0x0391a052, 0x03f0ec5f, 0x00cbe958, 0x0250ea54, 0x02b3f4a5, 0x01b5486d, 0x0033be30}}, Y: Field{[10]uint32{0x025a2fcf, 0x01aab046, 0x0166c931, 0x00aac94b, 0x015ed4fd, 0x01875ca0, 0x00939ea7, 0x002f8c00, 0x02c18d0b, 0x00020330}}}, + {X: Field{[10]uint32{0x0385d7ce, 0x011b6892, 0x014f38e5, 0x01009a5d, 0x0162defb, 0x00662c70, 0x00dccac4, 0x03ca857f, 0x004df868, 0x003d85a4}}, Y: Field{[10]uint32{0x038255b3, 0x0098ce9e, 0x023e47f6, 0x00deabab, 0x03de8b4d, 0x01cecc73, 0x03b93e0b, 0x009327c2, 0x00123440, 0x003ee5c4}}}, + {X: Field{[10]uint32{0x018632e3, 0x03d8b0fe, 0x02599a59, 0x0397b602, 0x011613d8, 0x000bfbd3, 0x02516979, 0x0129ecce, 0x0144bc7e, 0x0025ce18}}, Y: Field{[10]uint32{0x00fc16b4, 0x001b4d83, 0x03b6a5a8, 0x0196e9e6, 0x0308e560, 0x010c6bc9, 0x01834a95, 0x0264e4b7, 0x01845842, 0x002f44b5}}}, + {X: Field{[10]uint32{0x030200c8, 0x03390dee, 0x0311b551, 0x03701584, 0x011eb08d, 0x0195ac9e, 0x003a56f6, 0x03e803d0, 0x030c7a70, 0x00251bc4}}, Y: Field{[10]uint32{0x01945b8d, 0x019a5278, 0x0310507a, 0x02529efd, 0x00186d97, 0x02bc15e1, 0x01a923f3, 0x01f981fd, 0x00f6a503, 0x002b35a6}}}, + {X: Field{[10]uint32{0x03929230, 0x0102f730, 0x0287d917, 0x030cd08d, 0x01d5f1af, 0x03034962, 0x038c064f, 0x014ec030, 0x018472c4, 0x003b833c}}, Y: Field{[10]uint32{0x03ff8dc8, 0x01e09927, 0x0191f79c, 0x00a2cdba, 0x008c773c, 0x03289264, 0x014db12f, 0x034e5fa5, 0x035a7fec, 0x003605dd}}}, + {X: Field{[10]uint32{0x01535d7b, 0x018e9ddf, 0x03c21234, 0x0225364e, 0x03ef0072, 0x02ac4a1f, 0x0148b4f4, 0x02961c27, 0x03fe9542, 0x003ccd7d}}, Y: Field{[10]uint32{0x03350283, 0x006140b8, 0x01bf7455, 0x03a69ac6, 0x017639da, 0x023abed3, 0x0389c06d, 0x0174a4d4, 0x01a30246, 0x000cdb92}}}, + {X: Field{[10]uint32{0x017e7739, 0x02c383f2, 0x03f06f0e, 0x01b15675, 0x00b1326d, 0x01daa410, 0x00200d7b, 0x01fe3773, 0x01794fb3, 0x00156fe0}}, Y: Field{[10]uint32{0x03e69bfc, 0x024c28ab, 0x0086632e, 0x0293d274, 0x013053f6, 0x01f5c0fb, 0x002ade6f, 0x017307a4, 0x03007915, 0x00328cf3}}}, + {X: Field{[10]uint32{0x01de29b0, 0x01f5bd8a, 0x0062349b, 0x0004bf83, 0x031033b9, 0x02edb650, 0x022195fa, 0x0369197b, 0x03816143, 0x0037ff33}}, Y: Field{[10]uint32{0x00f0aff7, 0x01d6e71d, 0x0190bbfe, 0x02757f7b, 0x00c04bc3, 0x02178562, 0x029fc06f, 0x012b9f70, 0x03f6e1dc, 0x0026ff7c}}}, + {X: Field{[10]uint32{0x0139dec3, 0x039f608d, 0x0177f3c5, 0x0044ba3d, 0x02c435bc, 0x0155aec4, 0x01c1395b, 0x01be8bf9, 0x009425fc, 0x002e5d23}}, Y: Field{[10]uint32{0x014007a2, 0x032a2a32, 0x016e3dfa, 0x02f18eaa, 0x00f76d31, 0x0354507b, 0x016b2336, 0x0348ed7a, 0x03b2b995, 0x003d48e2}}}, + {X: Field{[10]uint32{0x0297f7ca, 0x00561e2b, 0x039a3fb6, 0x0397e9a8, 0x022c5349, 0x03d4ab66, 0x0329e335, 0x02c55ce3, 0x0054e951, 0x0024b10f}}, Y: Field{[10]uint32{0x012b4a17, 0x02c06558, 0x022bf71b, 0x01e75a29, 0x02bdc4ae, 0x00d92d8a, 0x00924fc6, 0x006f28c2, 0x0373dedd, 0x001f1e9a}}}, + {X: Field{[10]uint32{0x021eb272, 0x02d9ac34, 0x02d96040, 0x03a7d1c9, 0x035677af, 0x01e96248, 0x01ef139d, 0x017957b8, 0x03ea2599, 0x0002c64d}}, Y: Field{[10]uint32{0x03043dd6, 0x024c6033, 0x019195a9, 0x000ea3aa, 0x005585c5, 0x03911253, 0x003e0ca5, 0x031f3f9b, 0x0257544a, 0x00343e56}}}, + {X: Field{[10]uint32{0x0133f457, 0x01b601f0, 0x01fc94a4, 0x01ea3443, 0x00e2a504, 0x00026de2, 0x005a6b72, 0x03892caf, 0x024dbd7e, 0x000b0735}}, Y: Field{[10]uint32{0x020aabe3, 0x01a12dd9, 0x0230cfd8, 0x03ea7a73, 0x027a9449, 0x0179a209, 0x0031a1f0, 0x01e92f9f, 0x03dfce7d, 0x003fa298}}}, + {X: Field{[10]uint32{0x01004834, 0x03d4ff11, 0x014ed447, 0x01a1b321, 0x026d5443, 0x002900f5, 0x0030649b, 0x02a28ada, 0x0278be6e, 0x0013fc42}}, Y: Field{[10]uint32{0x018765d8, 0x00b4a1f9, 0x018bdb36, 0x035ca3d7, 0x01e43384, 0x0138b6c3, 0x001cf5bf, 0x001658ba, 0x00c356d5, 0x002cf2cc}}}, + {X: Field{[10]uint32{0x003d28de, 0x000d563d, 0x0344d9da, 0x0320145c, 0x01f877e8, 0x031c5164, 0x00a7c2a0, 0x01996ad8, 0x03666c90, 0x000cfd56}}, Y: Field{[10]uint32{0x015163f6, 0x0293d90b, 0x01ce08c2, 0x0150e17b, 0x02af1467, 0x024e4c68, 0x020ea80c, 0x017b562b, 0x00ab6aa9, 0x000e6612}}}, + {X: Field{[10]uint32{0x000d3e04, 0x0221eacd, 0x02636020, 0x01b56216, 0x02408da6, 0x03fcb5af, 0x037cc150, 0x00dfac62, 0x03595a72, 0x002e5c48}}, Y: Field{[10]uint32{0x0272363a, 0x01e22cef, 0x00ead817, 0x0223ea1f, 0x02dd125f, 0x031a4c51, 0x03f0ab8f, 0x0316906c, 0x03bd643a, 0x0028a0e8}}}, + {X: Field{[10]uint32{0x00a1035b, 0x0297f058, 0x00dccf0b, 0x02953661, 0x035a4204, 0x03fdcce3, 0x002c1e9f, 0x0250d7d8, 0x00676efa, 0x003483e4}}, Y: Field{[10]uint32{0x03404139, 0x02b9dee3, 0x0086f3fa, 0x01bd9915, 0x01ca1af2, 0x028c545d, 0x004406ce, 0x000fe1c9, 0x007a4520, 0x002b0e8f}}}, + {X: Field{[10]uint32{0x02f41f2d, 0x0252d4ff, 0x02ef54e2, 0x03800fb8, 0x0281d8b3, 0x001cb864, 0x00b2d0bd, 0x027c3511, 0x02a3157c, 0x000c8b5b}}, Y: Field{[10]uint32{0x012936b3, 0x0166d37e, 0x03a97ec3, 0x03dba98a, 0x026e096d, 0x0298e310, 0x02a9e676, 0x00b7799d, 0x03f19dc1, 0x0020e051}}}, + {X: Field{[10]uint32{0x020c26d5, 0x027b67be, 0x024cf8f2, 0x032e52ab, 0x011d2bfa, 0x02b802c3, 0x0164ea7b, 0x0106dadd, 0x00080683, 0x00256497}}, Y: Field{[10]uint32{0x02b92130, 0x01bdfe1d, 0x006d02b4, 0x03f2f749, 0x00edf14c, 0x0081f0bb, 0x015557b2, 0x0088cb09, 0x01b91315, 0x000318fb}}}, + {X: Field{[10]uint32{0x011f70af, 0x03b86f4f, 0x01664c06, 0x00b4f692, 0x03517a71, 0x00e64f35, 0x03fba71e, 0x00637684, 0x02b5d436, 0x001d64aa}}, Y: Field{[10]uint32{0x02eaa410, 0x0274e185, 0x01b457d7, 0x02ba5de8, 0x027a9222, 0x033ea2ac, 0x000aef1c, 0x00a1356b, 0x0077af74, 0x001553ba}}}, + {X: Field{[10]uint32{0x0209e0eb, 0x03669644, 0x03503671, 0x0129814f, 0x00806257, 0x02ce45a0, 0x031ad311, 0x02dc7e18, 0x018be13e, 0x003b674a}}, Y: Field{[10]uint32{0x0185c3cb, 0x02e86e27, 0x02b6fe54, 0x03f35403, 0x017b479e, 0x03d0361f, 0x007caa30, 0x0221b668, 0x03c0dab8, 0x0025ea6a}}}, + {X: Field{[10]uint32{0x02355fad, 0x039250be, 0x01fcb9f8, 0x028bff0e, 0x0378ae69, 0x002351a6, 0x028daf33, 0x002f0ef4, 0x0236a590, 0x00337fbd}}, Y: Field{[10]uint32{0x020db6d7, 0x02039194, 0x02d5179f, 0x0314de3c, 0x02f4f6c7, 0x024581ea, 0x02a1c255, 0x03bd3a91, 0x03cc54c0, 0x003e0ce3}}}, + {X: Field{[10]uint32{0x0149db49, 0x014b9a9e, 0x035848ca, 0x00f5a961, 0x03dbc094, 0x01b67d76, 0x03a8fc42, 0x02f5ab29, 0x03220ca3, 0x003d8e33}}, Y: Field{[10]uint32{0x01675295, 0x02478290, 0x03732f36, 0x009a7f47, 0x01653a79, 0x03565450, 0x03490039, 0x03aade42, 0x03dd8309, 0x0015a899}}}, + {X: Field{[10]uint32{0x0314bd1c, 0x01e8ac63, 0x02e1e638, 0x00eaf250, 0x037a6616, 0x018e482c, 0x0076cab1, 0x010fd40f, 0x02f29b1e, 0x0010d03f}}, Y: Field{[10]uint32{0x032210a0, 0x00af0ae0, 0x01eb6ad6, 0x00562eee, 0x0159ff2f, 0x01bdea77, 0x00908f0b, 0x034d4f1b, 0x002d6889, 0x000b569e}}}, + {X: Field{[10]uint32{0x01b80991, 0x0208bc6a, 0x01a30bf2, 0x025b1bb4, 0x001aa832, 0x03bae09b, 0x012c01fb, 0x036c4c33, 0x028005e3, 0x001e2be1}}, Y: Field{[10]uint32{0x008c3725, 0x0106bd89, 0x02a2a49d, 0x03761881, 0x01ec458c, 0x02e53e0d, 0x000d95b6, 0x033a449a, 0x023637a6, 0x000671f2}}}, + {X: Field{[10]uint32{0x01c41ef4, 0x00ab8472, 0x02d4958a, 0x01e4e2e5, 0x01720642, 0x00ecf558, 0x02831c01, 0x02fbdd52, 0x010fe6a4, 0x00361f96}}, Y: Field{[10]uint32{0x021d1dc6, 0x02d02e6f, 0x016b3e30, 0x0286d422, 0x0353b97a, 0x023b53af, 0x03ff97ff, 0x00d227c7, 0x013ac9b4, 0x000e4a2a}}}, + {X: Field{[10]uint32{0x01c54c32, 0x02a111b7, 0x00a7f630, 0x01a4656e, 0x0285ea85, 0x002e41db, 0x015cfd0a, 0x011fa505, 0x01f369c5, 0x002d6746}}, Y: Field{[10]uint32{0x02661865, 0x03fc2176, 0x00357f81, 0x01fb1129, 0x032d5082, 0x02058b17, 0x0383d552, 0x02af838a, 0x008affe7, 0x002e3d56}}}, + {X: Field{[10]uint32{0x00f3ee78, 0x00f4c318, 0x0143a6d8, 0x02f57abd, 0x03662726, 0x007050ea, 0x02a64cd8, 0x026c000e, 0x03da7cd5, 0x000d3d90}}, Y: Field{[10]uint32{0x00501ee8, 0x001111bd, 0x03b22d52, 0x0078fe91, 0x0291906c, 0x00fb968d, 0x00bd29b0, 0x03d5cd68, 0x00f291a7, 0x001055d3}}}, + {X: Field{[10]uint32{0x033dbbf3, 0x00e57588, 0x01b4ecac, 0x03d5ac17, 0x00fd007b, 0x030c725a, 0x0378757d, 0x027790cf, 0x03d0583e, 0x0015bbcd}}, Y: Field{[10]uint32{0x035c9286, 0x0052e6b7, 0x0229a92c, 0x037ee7a5, 0x02ba8cb5, 0x00ee853a, 0x02e28075, 0x0263e442, 0x001ab5c8, 0x00285038}}}, + {X: Field{[10]uint32{0x01c957d7, 0x037402bb, 0x00fc87e3, 0x01d9e115, 0x02fc54dd, 0x00e97750, 0x039ca5cb, 0x015a2c44, 0x0334815b, 0x0000790f}}, Y: Field{[10]uint32{0x02334cc8, 0x01c93ddf, 0x0302c85d, 0x03eb410c, 0x008e947a, 0x01370af7, 0x0282d9e6, 0x03b881e2, 0x0274ac96, 0x001730e0}}}, + {X: Field{[10]uint32{0x0339a952, 0x00c18bf0, 0x00eabad9, 0x020a63de, 0x01f8b06c, 0x03606df7, 0x029046d3, 0x036df366, 0x024935d2, 0x000339e7}}, Y: Field{[10]uint32{0x004f9686, 0x0282286e, 0x01dc7fff, 0x03d7f701, 0x038765c8, 0x02f0f3d6, 0x018c4943, 0x0189a96b, 0x02ee1b90, 0x003f0bdb}}}, + {X: Field{[10]uint32{0x02fe4fd9, 0x01030c61, 0x00e2c76c, 0x030d2cf7, 0x00f6766c, 0x0068033e, 0x00c3365e, 0x00b099c3, 0x0004ca86, 0x002d0512}}, Y: Field{[10]uint32{0x01b2219c, 0x016e6b54, 0x004b8717, 0x02ad78a8, 0x0029cbda, 0x00e803f5, 0x03752f00, 0x01b8028f, 0x021fca9b, 0x00390da2}}}, + {X: Field{[10]uint32{0x034fd39f, 0x00750887, 0x006a70b7, 0x007b06f1, 0x01541634, 0x03b5274e, 0x039cf65c, 0x03e09239, 0x03247406, 0x003aa8a5}}, Y: Field{[10]uint32{0x017c14a6, 0x0374a2ea, 0x01d46248, 0x033c0e28, 0x02d0d4b6, 0x01788610, 0x00d99328, 0x01730f79, 0x001be3b7, 0x001a39fe}}}, + {X: Field{[10]uint32{0x00f5b6a5, 0x00bb140c, 0x02999e7a, 0x0327d0b1, 0x02eb7371, 0x0372ff1c, 0x00c6caa3, 0x0222f0ee, 0x00ff1f72, 0x00138b44}}, Y: Field{[10]uint32{0x025a8774, 0x020803c2, 0x00f82be8, 0x03d7ad9e, 0x006ba793, 0x03905f40, 0x03515ca3, 0x013ec2a4, 0x005cdf2a, 0x001a368f}}}, + {X: Field{[10]uint32{0x030659f1, 0x02776888, 0x01adce00, 0x025115f0, 0x007d073b, 0x019f0a25, 0x00a4b45c, 0x03b258aa, 0x01e1114d, 0x0020d3c8}}, Y: Field{[10]uint32{0x01adc89c, 0x02b1fec9, 0x00a6ef78, 0x036d8c83, 0x0339263a, 0x001299f0, 0x03acb27d, 0x028280bd, 0x01b6edb5, 0x003a7e98}}}, + {X: Field{[10]uint32{0x00c7d0c7, 0x01c4e78c, 0x00381ece, 0x0367e6f7, 0x01c43cae, 0x034f5a3f, 0x03268d7c, 0x011156a5, 0x00aca0a6, 0x002a12d1}}, Y: Field{[10]uint32{0x03bf6b74, 0x02bc9642, 0x00d6da05, 0x01e4e20b, 0x03d12678, 0x02466bde, 0x03bde43f, 0x000aef4b, 0x033b74e7, 0x000be40f}}}, + {X: Field{[10]uint32{0x001d6789, 0x00d207c9, 0x02cbdd41, 0x01f2ed0c, 0x02600cbe, 0x02783e9b, 0x031df66f, 0x02e5dd1e, 0x020698bc, 0x00084867}}, Y: Field{[10]uint32{0x00954055, 0x0346249c, 0x03736aef, 0x02f8c92e, 0x022e6970, 0x02d74c99, 0x017d9688, 0x0061d2a2, 0x00d3c896, 0x001e90e2}}}, + {X: Field{[10]uint32{0x03aeafd4, 0x01ec8be6, 0x03562686, 0x01260a89, 0x017b9465, 0x013d261e, 0x034bbdbe, 0x0333da22, 0x021f93bf, 0x003e9453}}, Y: Field{[10]uint32{0x00f91b74, 0x03c95f69, 0x0330a478, 0x015b09a9, 0x012c2f61, 0x0324c382, 0x0087b518, 0x00ad2a78, 0x02155257, 0x00333520}}}, + {X: Field{[10]uint32{0x01451ffb, 0x03e80b1e, 0x01ffa4ca, 0x03d4fcbf, 0x012204d4, 0x026f630b, 0x0133a4a9, 0x0267c301, 0x03f16430, 0x002d82be}}, Y: Field{[10]uint32{0x0321294b, 0x03bbe2d2, 0x03f43886, 0x0018fbbc, 0x01d321e0, 0x01af69ba, 0x00b3bd27, 0x02649b35, 0x03901a02, 0x0003fb63}}}, + {X: Field{[10]uint32{0x03ed76cd, 0x02143a29, 0x00defc74, 0x0194e71b, 0x0017c2b7, 0x0151a53a, 0x02fcca65, 0x038d2a1b, 0x01a3196c, 0x003ca73e}}, Y: Field{[10]uint32{0x00c9c5f7, 0x0044a7e2, 0x028f6247, 0x01de6547, 0x00994b29, 0x036d6eb3, 0x03f1bf62, 0x00cf3ecd, 0x023af7c3, 0x00144c21}}}, + {X: Field{[10]uint32{0x01084e4d, 0x02e49d71, 0x014ed563, 0x0128c889, 0x01d8fe31, 0x00f88fc7, 0x03af34b0, 0x02ff1468, 0x023acb00, 0x00273678}}, Y: Field{[10]uint32{0x0298e1d5, 0x01bf1384, 0x0277d4d3, 0x0133e34a, 0x014f31bd, 0x01ecc5c1, 0x01d6c1a1, 0x029c4054, 0x035cc66e, 0x003b3c08}}}, + {X: Field{[10]uint32{0x02e5d65c, 0x00edbd7d, 0x025bff3d, 0x0246acac, 0x0218ed66, 0x0395a8a0, 0x02d99a6b, 0x00122be5, 0x01b02cfa, 0x0015be22}}, Y: Field{[10]uint32{0x001fe4bc, 0x03a81ec9, 0x00d921b7, 0x00a7a832, 0x01bb8ecc, 0x03723f28, 0x034f8248, 0x01cabfd9, 0x00ea4a23, 0x000d4ac8}}}, + {X: Field{[10]uint32{0x01ff2a08, 0x024daad7, 0x03dea16c, 0x039491af, 0x028e2366, 0x00f7bd55, 0x0169a7dd, 0x0363f05b, 0x02b7f8fa, 0x00378caf}}, Y: Field{[10]uint32{0x009e145f, 0x00013509, 0x01acba7c, 0x0332c378, 0x03eaa216, 0x038997ea, 0x002bd06f, 0x0070891b, 0x011c93a7, 0x0035cc7c}}}, + {X: Field{[10]uint32{0x026ba256, 0x0222578a, 0x02693096, 0x00ebe612, 0x037d12dc, 0x03beab36, 0x03dfa58f, 0x00a76300, 0x01c1dc17, 0x00217b1f}}, Y: Field{[10]uint32{0x024a747c, 0x02c2d166, 0x0041b194, 0x03cae86a, 0x0189e4b9, 0x03ee8c77, 0x00c73b5a, 0x02af2fe6, 0x00af8e9a, 0x00148c0e}}}, + {X: Field{[10]uint32{0x01e2e141, 0x02972bd0, 0x014abe23, 0x0038ac9b, 0x02e22328, 0x00b6e2fd, 0x03f5efe4, 0x023b07b5, 0x01956052, 0x003de522}}, Y: Field{[10]uint32{0x00c6ff98, 0x03f2dee0, 0x012fcdd6, 0x01585b37, 0x0258871e, 0x02a35b67, 0x0037e9fd, 0x007e621a, 0x00e296ed, 0x0027dd65}}}, + {X: Field{[10]uint32{0x03454f10, 0x0267383c, 0x00137621, 0x00eb88a3, 0x02866bd5, 0x0006a4ef, 0x036e8eef, 0x022094f5, 0x03d3b420, 0x0016235b}}, Y: Field{[10]uint32{0x002af573, 0x008a92ed, 0x02d2c6d9, 0x0206b437, 0x0206320b, 0x00c6df8c, 0x03f29ade, 0x00822ee8, 0x02533e41, 0x00297f25}}}, + {X: Field{[10]uint32{0x00cc7443, 0x0108f787, 0x0259c0bf, 0x0253a0d1, 0x03b01db2, 0x025d9dde, 0x0387d4e8, 0x03229d5b, 0x008dbbe5, 0x00061bf8}}, Y: Field{[10]uint32{0x03dfbdc0, 0x01be67a6, 0x01bdca25, 0x009a9912, 0x0229f12e, 0x00d7f432, 0x037a93a4, 0x01e080d0, 0x0139a46f, 0x0036677b}}}, + {X: Field{[10]uint32{0x01bd3d25, 0x01b57796, 0x036bb5a0, 0x02600bd5, 0x022af22e, 0x03b84ccd, 0x03eac38c, 0x02afcced, 0x03083055, 0x00395272}}, Y: Field{[10]uint32{0x01332381, 0x000c971f, 0x005fd4fe, 0x0390d2a5, 0x015ababd, 0x03f0d6b9, 0x001c7f7a, 0x00520d99, 0x0320e7b5, 0x00337cdf}}}, + {X: Field{[10]uint32{0x0224422b, 0x024ce240, 0x006e18ac, 0x01e7d4ea, 0x00b930df, 0x03fa12d6, 0x006108fc, 0x01456172, 0x02fbfd7f, 0x0029390a}}, Y: Field{[10]uint32{0x00ce1e30, 0x011e5800, 0x03e2f1ea, 0x0072efa8, 0x00541e55, 0x024575eb, 0x00d6177f, 0x00c40ad6, 0x021b0396, 0x0003a7e3}}}, + {X: Field{[10]uint32{0x0003dadb, 0x03bf72b6, 0x03d4ed09, 0x02a5c667, 0x004755fb, 0x01dd43e9, 0x009e9cfb, 0x00bd09ac, 0x00444202, 0x0017dfb6}}, Y: Field{[10]uint32{0x0376ffad, 0x0386f74a, 0x01addccb, 0x030e6ff3, 0x00e852d9, 0x02425bc7, 0x01592fcc, 0x023ac272, 0x01edd06a, 0x00024757}}}, + {X: Field{[10]uint32{0x02938d66, 0x038603b0, 0x038f1868, 0x03e42be8, 0x0191dcf7, 0x03d9ef45, 0x033fa223, 0x0193842c, 0x034332f0, 0x000feb11}}, Y: Field{[10]uint32{0x02aabe5c, 0x00f69878, 0x019206f9, 0x003e7a99, 0x03eebf27, 0x0045cc2e, 0x006d10ab, 0x00de64ce, 0x02676b20, 0x00115d13}}}, + {X: Field{[10]uint32{0x037a7aa9, 0x0192f7fe, 0x006b190e, 0x003da863, 0x00d4b10e, 0x01f639e1, 0x00d13df9, 0x034850b9, 0x03fff058, 0x0017ee60}}, Y: Field{[10]uint32{0x01dabd6f, 0x003c69a3, 0x018e8346, 0x020629b5, 0x00ec5811, 0x025ccf5d, 0x0373f73a, 0x0103343a, 0x02018dc5, 0x000cce51}}}, + {X: Field{[10]uint32{0x0341f88a, 0x003d79b7, 0x020e043e, 0x0078674f, 0x009c6e94, 0x02c20d99, 0x015eec1a, 0x00e68b6c, 0x01c30fa9, 0x0002ebcd}}, Y: Field{[10]uint32{0x028e9201, 0x004234bd, 0x01966214, 0x011553fb, 0x019de414, 0x00ee2c1a, 0x02bdc3fe, 0x0286f13b, 0x00d3e53f, 0x0010960f}}}, + {X: Field{[10]uint32{0x009a8602, 0x00128160, 0x01f9a0c7, 0x0366b36e, 0x004266c4, 0x00fecf58, 0x0186183a, 0x01ffc3c7, 0x035aa51e, 0x0025d907}}, Y: Field{[10]uint32{0x019517dd, 0x034ca1eb, 0x0239b5b0, 0x03f51676, 0x031ab169, 0x0073e9e3, 0x0182fc90, 0x02f6fb63, 0x0232aa9f, 0x0004d3fe}}}, + {X: Field{[10]uint32{0x0327292e, 0x031ad549, 0x02a5ee23, 0x03286a1d, 0x03f59feb, 0x02f8170d, 0x01aa8fb4, 0x03db716b, 0x011eacda, 0x0025a8dc}}, Y: Field{[10]uint32{0x01da4392, 0x03b34fe9, 0x00e96b82, 0x008d5840, 0x0134be91, 0x01eb5760, 0x01fce0e6, 0x02eded78, 0x03b9681e, 0x0023ec33}}}, + {X: Field{[10]uint32{0x03154b0a, 0x02ab7bd3, 0x01e2a14f, 0x02c0fa75, 0x029f9f16, 0x004d8c82, 0x01388926, 0x0031b4a3, 0x028b8e54, 0x002b9910}}, Y: Field{[10]uint32{0x00118aeb, 0x01e524ff, 0x002e4d5b, 0x03b5bf9b, 0x03cc68ad, 0x003fd679, 0x02d5193b, 0x01cf36e7, 0x025eb9bf, 0x0036c80b}}}, + {X: Field{[10]uint32{0x00c984fb, 0x00a41d5b, 0x0038d422, 0x03feea1d, 0x03e16424, 0x016d210c, 0x03532cf1, 0x030b0452, 0x02df65c0, 0x000b164c}}, Y: Field{[10]uint32{0x03d29130, 0x028b0931, 0x01e47f59, 0x00a0b3ac, 0x011c6436, 0x022e7fd3, 0x015deec3, 0x02815b4e, 0x00c4b908, 0x000587be}}}, + {X: Field{[10]uint32{0x02ecca3e, 0x0123d55e, 0x02071f9c, 0x0276f1a4, 0x02241538, 0x03aff2ff, 0x0252d563, 0x02e9a460, 0x00786937, 0x001db887}}, Y: Field{[10]uint32{0x0133c8e6, 0x0293bf51, 0x02a77a3f, 0x00a235c6, 0x01ca634d, 0x024c27fa, 0x0361d0d4, 0x01f5878e, 0x02fe9db4, 0x00379de1}}}, + {X: Field{[10]uint32{0x0267900f, 0x01c2016c, 0x00a36eaa, 0x018ff259, 0x02099df3, 0x02bf1a91, 0x020b3466, 0x004e3474, 0x00efca8a, 0x001c5c37}}, Y: Field{[10]uint32{0x00c0bb8d, 0x00db5776, 0x0320303b, 0x039188fe, 0x00440562, 0x021c3e3e, 0x0389f7bf, 0x00515663, 0x0139476f, 0x00065aff}}}, + {X: Field{[10]uint32{0x011b6ccd, 0x001f16da, 0x036f2e69, 0x018b8d60, 0x0361a956, 0x0347a27d, 0x01fb466e, 0x034916a8, 0x02b075bd, 0x00263b77}}, Y: Field{[10]uint32{0x030c91be, 0x02a107d5, 0x02814731, 0x0266aca5, 0x00bdbcdc, 0x00228e8b, 0x002ddc21, 0x0092e327, 0x01f6b591, 0x002bcfed}}}, + {X: Field{[10]uint32{0x028e8849, 0x03db6a2e, 0x00e6768b, 0x01383ea6, 0x018dd1c3, 0x0160de70, 0x0236fc5c, 0x0181be97, 0x000659ae, 0x002fd0be}}, Y: Field{[10]uint32{0x0155b8af, 0x039a3e1d, 0x0298f26b, 0x0344873b, 0x00ca74a0, 0x01aeba31, 0x03495782, 0x036e511b, 0x03706e4a, 0x0034d0fe}}}, + {X: Field{[10]uint32{0x0262e1cd, 0x037e5551, 0x038a0d82, 0x0170230c, 0x02c42fd6, 0x018927f0, 0x0075c365, 0x023718a4, 0x00a5891e, 0x00103071}}, Y: Field{[10]uint32{0x00689ec3, 0x02843a73, 0x0303ae5a, 0x009ce815, 0x03f20253, 0x02f304ac, 0x015d8192, 0x03db0dc6, 0x03d0e68e, 0x00199c88}}}, + {X: Field{[10]uint32{0x03883dc1, 0x0044cfa3, 0x03c92b92, 0x00f1524b, 0x03bfd3ef, 0x02828b5b, 0x004cf1b1, 0x00ff920e, 0x03100c8e, 0x00058b74}}, Y: Field{[10]uint32{0x01b5cff0, 0x00f23803, 0x00e21a65, 0x013a1ba8, 0x003d0ebf, 0x03d24387, 0x0197685c, 0x000ae7dc, 0x01d5c82f, 0x0007c8c4}}}, + {X: Field{[10]uint32{0x006331cb, 0x031f9033, 0x03b3dbdf, 0x03f5455e, 0x005d63c4, 0x00227b16, 0x03302e51, 0x02b8f3cf, 0x014689ea, 0x003fc3e0}}, Y: Field{[10]uint32{0x0151bf2e, 0x02d591c1, 0x00c2dac2, 0x037d68ec, 0x02f8814c, 0x01e3476a, 0x02549737, 0x00a78eeb, 0x01b94eb5, 0x0013707f}}}, + {X: Field{[10]uint32{0x0207b78e, 0x028e45d1, 0x02033c3e, 0x010553d2, 0x0314b3e6, 0x0131b66a, 0x0072b224, 0x02d55cbd, 0x0274b011, 0x00050eb9}}, Y: Field{[10]uint32{0x0201c35c, 0x032d084d, 0x0099fdb9, 0x022b8667, 0x03ca2029, 0x0280f7f5, 0x018820c0, 0x03ee8980, 0x01820fae, 0x00054a35}}}, + {X: Field{[10]uint32{0x019009a3, 0x01ec05e3, 0x006f35e1, 0x003b35ae, 0x004115a8, 0x00a5d366, 0x03a0efd3, 0x03517e5b, 0x02288fff, 0x003ceb73}}, Y: Field{[10]uint32{0x0116a20e, 0x001996d2, 0x00ba72d2, 0x0293aaf5, 0x03805580, 0x0252961a, 0x020915e4, 0x026ec1a6, 0x03009632, 0x0008080b}}}, + {X: Field{[10]uint32{0x00d8cccf, 0x001d5631, 0x032f85ad, 0x008bd13e, 0x034904ad, 0x02930891, 0x00e6bc6f, 0x003438b2, 0x0029e273, 0x003489c2}}, Y: Field{[10]uint32{0x0079a3bc, 0x000bd7a2, 0x03a93c63, 0x01eab819, 0x0227c66c, 0x0098b904, 0x009741df, 0x03d9a566, 0x00ac9d5b, 0x003569ad}}}, + {X: Field{[10]uint32{0x012964a6, 0x032b7d0d, 0x0356756e, 0x02299727, 0x01834753, 0x00aecbcf, 0x0057a948, 0x03caa117, 0x02b67d9b, 0x0009b45f}}, Y: Field{[10]uint32{0x02068fb2, 0x01c67078, 0x01c6b7f7, 0x006bf348, 0x00b8703d, 0x02926a9c, 0x03c4a520, 0x030d16f3, 0x03d47d67, 0x002552bc}}}, + {X: Field{[10]uint32{0x03fac74b, 0x01a3c879, 0x024760bf, 0x0264c4d1, 0x0036a52d, 0x017b9f44, 0x011618ce, 0x03226573, 0x038be104, 0x003910df}}, Y: Field{[10]uint32{0x0195cb81, 0x01c36e36, 0x0356e27b, 0x02f6e071, 0x00f9b015, 0x02d5bf23, 0x0020dbe3, 0x01b9b06a, 0x02d5b825, 0x0035b055}}}, + {X: Field{[10]uint32{0x02d3c1d4, 0x011d3be8, 0x02c70851, 0x00700347, 0x01ac5bb5, 0x026d68e7, 0x02b63ed2, 0x0181e598, 0x004e96db, 0x00224cb8}}, Y: Field{[10]uint32{0x03e58541, 0x021d511d, 0x0336ec05, 0x00368ef4, 0x01fc912a, 0x030d5472, 0x03f51668, 0x00897414, 0x037fe030, 0x00150df9}}}, + {X: Field{[10]uint32{0x02617b26, 0x020945c5, 0x01fd0c7c, 0x0390171b, 0x00933ed0, 0x01b20507, 0x02003c73, 0x021b016c, 0x0176465b, 0x003f9dda}}, Y: Field{[10]uint32{0x012aac39, 0x039b6731, 0x002aa472, 0x00f89544, 0x0094364d, 0x01677754, 0x002b0af3, 0x03541b4c, 0x005fd576, 0x002c9e77}}}, + {X: Field{[10]uint32{0x035b45f1, 0x03f24714, 0x0372cb86, 0x00f29ae7, 0x01f69eb7, 0x018ce05f, 0x004ecbe1, 0x02489172, 0x00ffb2a2, 0x001b1829}}, Y: Field{[10]uint32{0x022a0a2c, 0x01734a4a, 0x022231b5, 0x00af48f5, 0x036489af, 0x03e71e14, 0x0301a510, 0x033071c0, 0x026f814b, 0x0009e37b}}}, + {X: Field{[10]uint32{0x009af04d, 0x00791ce7, 0x02a81e12, 0x02d1ba70, 0x03a955be, 0x0327a185, 0x01556c5e, 0x0240aa63, 0x018f625f, 0x000c4cb9}}, Y: Field{[10]uint32{0x01a9e461, 0x02361a51, 0x01006943, 0x01f25171, 0x01cf0a95, 0x011a4131, 0x01b92204, 0x00f17853, 0x0164a244, 0x00296202}}}, + {X: Field{[10]uint32{0x00903f6f, 0x01404b8d, 0x022dc57e, 0x002a77a0, 0x03640e18, 0x0234e161, 0x01003fdc, 0x026fdbae, 0x0236361a, 0x002c173b}}, Y: Field{[10]uint32{0x005c9a5a, 0x0363a095, 0x018c5305, 0x0288c35e, 0x0126fe21, 0x01897617, 0x005ce16d, 0x0268a2dd, 0x00862951, 0x003ed1ce}}}, + {X: Field{[10]uint32{0x02005e83, 0x0017c584, 0x0273903a, 0x01b2af61, 0x0023cd2f, 0x00eab5f3, 0x014e68de, 0x039601e8, 0x020f5659, 0x00388084}}, Y: Field{[10]uint32{0x03ada136, 0x02755783, 0x01544084, 0x02b1f020, 0x02a70e8f, 0x0017eebc, 0x037cb4dc, 0x03e64b64, 0x0305b66a, 0x001264a2}}}, + {X: Field{[10]uint32{0x007a796b, 0x02618cc3, 0x034592f1, 0x0336316c, 0x039a9bf0, 0x01418532, 0x03e68f04, 0x002782c1, 0x01892e54, 0x0015ea47}}, Y: Field{[10]uint32{0x0098e7fc, 0x0307a7e1, 0x0116bbd5, 0x001b1763, 0x021dbf77, 0x0092c464, 0x02612c31, 0x023ea2ea, 0x00ce5901, 0x0011e417}}}, + {X: Field{[10]uint32{0x01a7e8da, 0x014ed929, 0x00ee1dd1, 0x02359d0a, 0x0291c046, 0x00997777, 0x019e7c58, 0x01970835, 0x000a3ba4, 0x003824b1}}, Y: Field{[10]uint32{0x03ffd39b, 0x009bdc56, 0x03042feb, 0x00444d3a, 0x03baa514, 0x00ec25fd, 0x00ab1d31, 0x010920b5, 0x02b4bdfc, 0x0020fd38}}}, + {X: Field{[10]uint32{0x01e0ab38, 0x02980247, 0x02554f78, 0x013fd691, 0x037c1ee8, 0x00cd74f7, 0x001a9c2c, 0x013f1282, 0x006e7baa, 0x001ce8cc}}, Y: Field{[10]uint32{0x01a1f938, 0x03a24f7b, 0x022350bc, 0x0210ebc2, 0x023d93f6, 0x01548646, 0x03a70439, 0x030c9b8d, 0x00f92022, 0x0007da32}}}, + {X: Field{[10]uint32{0x033a4434, 0x03aaef97, 0x0093a6a6, 0x03168e79, 0x03e99883, 0x02850076, 0x0152caf4, 0x012585cd, 0x01f86e90, 0x001f1e9e}}, Y: Field{[10]uint32{0x02e869bb, 0x005fe389, 0x0355415e, 0x0204b0a4, 0x00a26709, 0x002d65b3, 0x008ce8ac, 0x00e4c65b, 0x0252e488, 0x002173ac}}}, + {X: Field{[10]uint32{0x00a37788, 0x028711e1, 0x03918623, 0x021bb6a4, 0x0319f030, 0x0144d95f, 0x03054fae, 0x03ddcacd, 0x0161ce4f, 0x001aa77d}}, Y: Field{[10]uint32{0x01b65280, 0x016d88ff, 0x02db42b2, 0x019c41ba, 0x01fe7198, 0x019847fb, 0x01ba398a, 0x02fd60cc, 0x034ad9b3, 0x002f3c09}}}, + {X: Field{[10]uint32{0x0391c950, 0x02314eff, 0x019eef3f, 0x02d6fc8a, 0x0381934c, 0x034b1abf, 0x0145d2da, 0x02b7fc71, 0x024d47b3, 0x003f9eec}}, Y: Field{[10]uint32{0x02574e7f, 0x03971022, 0x00c5befd, 0x022c12bc, 0x03a88173, 0x0028a4b3, 0x00c27d6f, 0x0188f24c, 0x038609d2, 0x001ff997}}}, + {X: Field{[10]uint32{0x00407d3d, 0x010a41cc, 0x014531da, 0x0192ba05, 0x0382ce2b, 0x01f414d1, 0x00ba60e1, 0x02ddf0a4, 0x02f27944, 0x0009b474}}, Y: Field{[10]uint32{0x00f0f495, 0x00156d2d, 0x0206f4d1, 0x034756a8, 0x0051b768, 0x00d604e1, 0x00b23725, 0x00002c34, 0x00243106, 0x003b0f14}}}, + {X: Field{[10]uint32{0x0273e2b8, 0x03025b63, 0x008060e6, 0x01363c0d, 0x03fb85cf, 0x03a91378, 0x00563ff8, 0x0055cd2b, 0x01f938f9, 0x003c0394}}, Y: Field{[10]uint32{0x022c727b, 0x0259dc68, 0x00c703c5, 0x007484e0, 0x02585408, 0x03f62382, 0x02b6a136, 0x0292474e, 0x03ed3a39, 0x001edeff}}}, + {X: Field{[10]uint32{0x03cfc4d8, 0x004789cd, 0x03b309e0, 0x034538f8, 0x008bd179, 0x01352f2a, 0x02be811a, 0x021d424e, 0x0072f42f, 0x001cf855}}, Y: Field{[10]uint32{0x005b9231, 0x0341827e, 0x01a340b5, 0x01ae12f3, 0x01c53c82, 0x02c02d2a, 0x006426c9, 0x005da044, 0x00ae5832, 0x000e4bbd}}}, + {X: Field{[10]uint32{0x01568092, 0x02bd582a, 0x00333a7f, 0x0123b6be, 0x00d29d23, 0x01e77e39, 0x011d86e4, 0x00119321, 0x03a9aff3, 0x003b5199}}, Y: Field{[10]uint32{0x0149bb0c, 0x0371f98f, 0x002e43da, 0x03699e62, 0x006d9f4f, 0x03fd5df8, 0x01a9ab50, 0x0350b51a, 0x00756892, 0x001dcd9e}}}, + {X: Field{[10]uint32{0x001dde26, 0x02c3bc95, 0x00d74af5, 0x00b1e40d, 0x0351066f, 0x0136ff83, 0x00346a26, 0x0072f773, 0x02ab1081, 0x0035bb05}}, Y: Field{[10]uint32{0x02d0527e, 0x015fa792, 0x0315ef48, 0x0079286d, 0x034763b0, 0x0302e26f, 0x011b7336, 0x02f88a6a, 0x00ab7ac7, 0x002607c7}}}, + {X: Field{[10]uint32{0x034c593f, 0x0292d4ea, 0x008e68dc, 0x03caf47d, 0x033f762e, 0x03b96dc5, 0x001d92d2, 0x00c6b209, 0x007e6919, 0x000a13bd}}, Y: Field{[10]uint32{0x03cf5e82, 0x03150546, 0x013e1c7a, 0x00b8efeb, 0x03b53a4d, 0x03ff86da, 0x03e12887, 0x02f91c20, 0x02e1e6a7, 0x002adce7}}}, + {X: Field{[10]uint32{0x00d505c3, 0x030fe1c2, 0x034f6c6c, 0x02f20d5d, 0x0344b490, 0x0124063b, 0x03ba53ac, 0x01f42bf0, 0x01e75a26, 0x00014c3e}}, Y: Field{[10]uint32{0x0285e3f1, 0x02cef0d3, 0x028d36e2, 0x01c12e22, 0x00bee9fa, 0x03dff7b5, 0x02d7fba8, 0x03a72f3d, 0x001e44e5, 0x0018c312}}}, + {X: Field{[10]uint32{0x02a905f8, 0x0135673a, 0x022bc1ba, 0x0080f126, 0x02ef9c4d, 0x000974b6, 0x037a4b38, 0x00596d9c, 0x00fd81d0, 0x0019aa6d}}, Y: Field{[10]uint32{0x02525e8c, 0x01ec7353, 0x015f121b, 0x032895e5, 0x0112c86b, 0x02574c14, 0x017311c1, 0x03ab65f7, 0x004e6a4d, 0x0009dc31}}}, + {X: Field{[10]uint32{0x03a289be, 0x02484d48, 0x0394f601, 0x02625b76, 0x0139bb78, 0x011d3789, 0x018d7397, 0x01ed926c, 0x027edca4, 0x0009604b}}, Y: Field{[10]uint32{0x0317e2da, 0x031884db, 0x00e5c795, 0x02e2d634, 0x00788d3a, 0x0232e191, 0x0276f7f1, 0x029db9ae, 0x0183072a, 0x0012ee8f}}}, + {X: Field{[10]uint32{0x03b29608, 0x032e9df7, 0x00fd724a, 0x0228d5db, 0x02df1a0e, 0x03efd61f, 0x00f88b58, 0x0091205c, 0x0270af16, 0x000f206f}}, Y: Field{[10]uint32{0x02ee13d4, 0x0357fd0a, 0x0070027b, 0x03eb837a, 0x02ed9dc9, 0x0040ba6e, 0x00b52507, 0x03d201e8, 0x008eda59, 0x002ac5b9}}}, + {X: Field{[10]uint32{0x00d6e39d, 0x0093ddb8, 0x035252fb, 0x02421715, 0x0039626e, 0x0096ab6a, 0x0282c8d1, 0x00a4cfb3, 0x01cda514, 0x002ad89b}}, Y: Field{[10]uint32{0x024abff6, 0x03b7005d, 0x033cfe7e, 0x00f436ad, 0x02bb7be7, 0x0363aff0, 0x031f2a34, 0x012c6f55, 0x034b34fa, 0x0022b75d}}}, + {X: Field{[10]uint32{0x036bd85d, 0x033f82fc, 0x0133de1c, 0x015e638e, 0x03aaaaed, 0x028f8a1c, 0x02d65321, 0x0083fe32, 0x01061207, 0x0011fc94}}, Y: Field{[10]uint32{0x00585b60, 0x02c5be48, 0x03c60c38, 0x004fb342, 0x00cb44e0, 0x025960eb, 0x0374ea3f, 0x004b93b2, 0x032e7295, 0x0003db51}}}, + {X: Field{[10]uint32{0x03c26b1b, 0x0122e7c8, 0x00842361, 0x0099d4b4, 0x00e16409, 0x01c6e2ec, 0x0138d590, 0x023c6cf1, 0x0299f739, 0x001bf4c0}}, Y: Field{[10]uint32{0x026799da, 0x03816eee, 0x03d33372, 0x03c09dfc, 0x017810be, 0x017227fd, 0x02e9c4dc, 0x0388d468, 0x0166a79c, 0x000ee358}}}, + {X: Field{[10]uint32{0x0202e040, 0x026f5992, 0x031e3f44, 0x021f75e1, 0x0149db12, 0x01712827, 0x0051ab74, 0x00735963, 0x007c784e, 0x0003756c}}, Y: Field{[10]uint32{0x028d8659, 0x00c41e35, 0x03857a47, 0x01f36283, 0x036a0459, 0x003fbb66, 0x00ed2a7c, 0x0246e373, 0x018a62a4, 0x002c9b6b}}}, + {X: Field{[10]uint32{0x027fcdad, 0x00ab7c85, 0x016b7dff, 0x0229c02d, 0x0215b61a, 0x01ae12f2, 0x0275e5f1, 0x01089ea8, 0x0036104b, 0x0000f3d6}}, Y: Field{[10]uint32{0x0200c9fb, 0x012792b3, 0x03b5ce9e, 0x0098b6d0, 0x01445af7, 0x02006372, 0x00123408, 0x01e7f7da, 0x025a2cb5, 0x000731bd}}}, + {X: Field{[10]uint32{0x0119bb58, 0x0074a352, 0x03f413e0, 0x01348e15, 0x01d4cd80, 0x01d3010f, 0x02ea163d, 0x0108730e, 0x005508b9, 0x001a0ed5}}, Y: Field{[10]uint32{0x01a11f0a, 0x03f76f9e, 0x022da17c, 0x01a41540, 0x01691e23, 0x004473fb, 0x01d69438, 0x03015a2b, 0x01762cd5, 0x0006ef91}}}, + {X: Field{[10]uint32{0x003b724c, 0x000c9e79, 0x027d2195, 0x03835cf3, 0x03e83ff0, 0x0080ab94, 0x002f7ec4, 0x0103717d, 0x01b7897a, 0x0035e198}}, Y: Field{[10]uint32{0x02d20b21, 0x00aca772, 0x00a02665, 0x03fb43b1, 0x00aeead2, 0x00757ca4, 0x03db82a6, 0x01e3b3f0, 0x01b0e3f4, 0x001194a6}}}, + {X: Field{[10]uint32{0x01e15a21, 0x02954186, 0x0114a1af, 0x01f543b0, 0x0332e89e, 0x013bafc6, 0x00dbb87b, 0x039e5399, 0x0264fc15, 0x00049631}}, Y: Field{[10]uint32{0x001be0b1, 0x00148685, 0x0157194b, 0x025eef08, 0x03028c59, 0x00a83971, 0x011a7dec, 0x00e201c3, 0x029281a7, 0x000c9f12}}}, + {X: Field{[10]uint32{0x02e8be00, 0x033589e1, 0x03bb1a6c, 0x03492fdf, 0x01387f4d, 0x039cc531, 0x0243cdfa, 0x038af71b, 0x03b51cff, 0x003cb413}}, Y: Field{[10]uint32{0x03061c9e, 0x0142a309, 0x02b37932, 0x036b09f3, 0x0178d3a7, 0x021a8ab8, 0x032ee47a, 0x00854a34, 0x038d435f, 0x00226bcf}}}, + {X: Field{[10]uint32{0x030dfb08, 0x0152078f, 0x01f6bb33, 0x02864aa7, 0x03d21551, 0x03bc020e, 0x02cc402d, 0x00eb6394, 0x02c14ab2, 0x002d9eef}}, Y: Field{[10]uint32{0x00a64a23, 0x02cc3e04, 0x01fe6698, 0x004ffb80, 0x003757cc, 0x01961d55, 0x02845285, 0x02264c14, 0x03d19383, 0x0035b29a}}}, + {X: Field{[10]uint32{0x0379235e, 0x0120c48a, 0x0089d90d, 0x02120ea1, 0x008a4665, 0x00b5986e, 0x013ce90f, 0x007f5a81, 0x01b9fa40, 0x0006ebbc}}, Y: Field{[10]uint32{0x031699d7, 0x01492528, 0x01ee8033, 0x031b02d9, 0x01bc1a69, 0x02e9562b, 0x02b3872c, 0x0205f648, 0x0214a2f7, 0x000a2866}}}, + {X: Field{[10]uint32{0x0051aa8e, 0x0043fc6e, 0x03c79c3c, 0x01b394a1, 0x01f58de5, 0x0006eaa1, 0x036a7468, 0x00e922ca, 0x026b2362, 0x001b03c1}}, Y: Field{[10]uint32{0x01ff0868, 0x036ee4c5, 0x033574cc, 0x01e48167, 0x032347a4, 0x007218c9, 0x028bd94e, 0x02c3e394, 0x0256084c, 0x003b20dc}}}, + {X: Field{[10]uint32{0x023619d7, 0x004f767d, 0x01c0d949, 0x035862de, 0x00a0c815, 0x02baf3ca, 0x026d6cb7, 0x02748afa, 0x030965bb, 0x003ef56e}}, Y: Field{[10]uint32{0x0300b924, 0x00b7f28f, 0x01c7e661, 0x018cde8a, 0x0060ccc0, 0x0083cfdb, 0x0298f77e, 0x01796ff8, 0x034d5e60, 0x000cc0d5}}}, + {X: Field{[10]uint32{0x035b1739, 0x01a3e82c, 0x008fe7e5, 0x03ca36b6, 0x020f8bd5, 0x0041af46, 0x02c81ac8, 0x008cd2bd, 0x002ac4b2, 0x00089181}}, Y: Field{[10]uint32{0x02ff6e7c, 0x02af1c16, 0x00f797cd, 0x0208d169, 0x029e5382, 0x007e4b8d, 0x0229bd96, 0x0045bc33, 0x00eb9c10, 0x00076836}}}, + {X: Field{[10]uint32{0x0182bc4a, 0x00b67cd0, 0x00c51563, 0x01b7f4a5, 0x039606cf, 0x010b3d42, 0x01b3caf5, 0x00b4de0d, 0x014f2fff, 0x0011c2a4}}, Y: Field{[10]uint32{0x001d426e, 0x01619800, 0x012dbb3a, 0x001a0738, 0x034398c6, 0x0271aa3a, 0x03e3cc9e, 0x01215a96, 0x01a8d2c7, 0x001ace01}}}, + {X: Field{[10]uint32{0x021b4be0, 0x0009ec0c, 0x00c1ecc8, 0x004540c0, 0x0044bb7a, 0x00fe4274, 0x002153ba, 0x0364cd0a, 0x010bffb6, 0x001380fd}}, Y: Field{[10]uint32{0x008c504c, 0x03db96ac, 0x003e0095, 0x00940c7a, 0x009149b1, 0x0137a32f, 0x03e8f9cb, 0x01c7b3c7, 0x00ae963e, 0x00165b16}}}, + {X: Field{[10]uint32{0x0057455e, 0x02649e3f, 0x003b70d9, 0x02d02860, 0x00188a26, 0x00e7778a, 0x01567e91, 0x02edd864, 0x03eab806, 0x00169b13}}, Y: Field{[10]uint32{0x02e6ce49, 0x0269f5e0, 0x014590d5, 0x0310bd54, 0x03353d73, 0x01c6397d, 0x00ea476a, 0x00d9af0a, 0x007c6505, 0x001ba074}}}, + {X: Field{[10]uint32{0x0329bd5f, 0x01b70de6, 0x016c3a24, 0x027406f9, 0x0174f4e0, 0x03d8f753, 0x000bb1be, 0x014b884a, 0x01b29adf, 0x003b5cf2}}, Y: Field{[10]uint32{0x0113828b, 0x0321ecfe, 0x0216159d, 0x027cb7d8, 0x02e272ad, 0x0312df14, 0x011fa5b7, 0x0382b31f, 0x03b619eb, 0x0003a645}}}, + {X: Field{[10]uint32{0x001c04bd, 0x024eda70, 0x03a99bdf, 0x01308e1b, 0x03710dd3, 0x000f284f, 0x03106085, 0x03e7b52b, 0x005b38cb, 0x001a3185}}, Y: Field{[10]uint32{0x03edc73a, 0x0235f28f, 0x01e9de92, 0x0348b830, 0x02e7cb74, 0x03d4d6a7, 0x016f884d, 0x027ab140, 0x005e607d, 0x003258d6}}}, + {X: Field{[10]uint32{0x00454126, 0x00e69dec, 0x039b6a84, 0x00481661, 0x0092269a, 0x03d72473, 0x006094c3, 0x005ef077, 0x00639273, 0x0006d946}}, Y: Field{[10]uint32{0x00f5009f, 0x0077007a, 0x03cf9137, 0x00579c51, 0x03c42b19, 0x030c6fc4, 0x001fe920, 0x03426f63, 0x025f8ac3, 0x000c7184}}}, + {X: Field{[10]uint32{0x0209c52c, 0x019b539a, 0x01f0d381, 0x00824283, 0x027229ff, 0x00edc177, 0x02b74f7a, 0x0378f515, 0x00ccdadb, 0x0011564f}}, Y: Field{[10]uint32{0x000bd737, 0x0293aa6f, 0x01866a43, 0x03748361, 0x01e14634, 0x03ba5933, 0x02b9a311, 0x000814f0, 0x017d89fd, 0x0004f599}}}, + {X: Field{[10]uint32{0x03927da5, 0x034fad0d, 0x03960566, 0x0069339d, 0x01e4dd7c, 0x00a30842, 0x0132983d, 0x03e8bf35, 0x006ed6f2, 0x00050270}}, Y: Field{[10]uint32{0x020984e4, 0x0372b451, 0x0062390e, 0x00114def, 0x02fbeda3, 0x01a52dc7, 0x0369836e, 0x03f6eb8e, 0x018d4206, 0x0037017e}}}, + {X: Field{[10]uint32{0x005f4580, 0x03c0373a, 0x037074e2, 0x03213adc, 0x025d6e5c, 0x0109bfaf, 0x03239215, 0x02c15b50, 0x006bc307, 0x00367823}}, Y: Field{[10]uint32{0x012c632d, 0x01692d8a, 0x034f915d, 0x03908060, 0x01172f4d, 0x028c9817, 0x02b52add, 0x01e90e8e, 0x0247c6b4, 0x00288f05}}}, + {X: Field{[10]uint32{0x0162fb32, 0x00576eaf, 0x028ee1aa, 0x022eef57, 0x025ac0f1, 0x01357e89, 0x033a9166, 0x02dadcd4, 0x01f3d3c2, 0x001f7cc6}}, Y: Field{[10]uint32{0x03c9f8c0, 0x036d634a, 0x030b79c3, 0x026ea46b, 0x00a9bd16, 0x00778205, 0x02d8d963, 0x02ee6075, 0x02afe023, 0x0024483d}}}, + {X: Field{[10]uint32{0x0186d7a5, 0x01cd115a, 0x037110a3, 0x01126eb4, 0x0011d742, 0x008595e6, 0x0146232e, 0x03f47e4c, 0x018738b9, 0x0006a539}}, Y: Field{[10]uint32{0x03e4352e, 0x00810a2a, 0x0365a748, 0x0126b619, 0x020fc325, 0x025fcb6c, 0x034604b1, 0x039eb83e, 0x03b317ee, 0x000cca89}}}, + {X: Field{[10]uint32{0x03619a47, 0x01e07e46, 0x03691fa0, 0x0106257f, 0x014aefff, 0x03033e1c, 0x002ef8df, 0x019b6caa, 0x034d6db2, 0x0037e8b2}}, Y: Field{[10]uint32{0x01ad8b19, 0x033f9312, 0x0056e45a, 0x03ddba9c, 0x01d2a1a0, 0x032e98be, 0x0320fef4, 0x029b0633, 0x03ab3a28, 0x00317976}}}, + {X: Field{[10]uint32{0x02876730, 0x03931e4e, 0x0017bf35, 0x03af0429, 0x03acf4e2, 0x029b814e, 0x002c1352, 0x03ddad7a, 0x0007be6b, 0x00308804}}, Y: Field{[10]uint32{0x03efa581, 0x0345377e, 0x02be70c8, 0x03a24346, 0x039a735d, 0x030e1cd0, 0x0397c159, 0x0135d0eb, 0x02ecb9ae, 0x00249022}}}, + {X: Field{[10]uint32{0x03d7edc3, 0x020a1686, 0x0015e33e, 0x0253be8e, 0x022f25c7, 0x019cc1d0, 0x00d4d852, 0x01fc3e74, 0x02d2ab08, 0x0035158c}}, Y: Field{[10]uint32{0x015ff44f, 0x00f5bbe3, 0x02569554, 0x016369ee, 0x01814e72, 0x032792c7, 0x039e99f9, 0x013ea091, 0x0297c499, 0x002df38d}}}, + {X: Field{[10]uint32{0x035df93f, 0x000edc73, 0x00dedc90, 0x02e3dadf, 0x02df6c25, 0x008e85c6, 0x01f34ca9, 0x024ad221, 0x022bcdc2, 0x00233bcd}}, Y: Field{[10]uint32{0x009aaf5e, 0x02061b74, 0x02bdf260, 0x00ed76ad, 0x02d702e1, 0x03507666, 0x024f1c19, 0x01fe8afe, 0x0334ed8b, 0x002ce443}}}, + {X: Field{[10]uint32{0x00bf9838, 0x01d60ecf, 0x01bfc7f1, 0x03956565, 0x013a415a, 0x006121e3, 0x01604318, 0x00a0c45f, 0x03e1874c, 0x00091fde}}, Y: Field{[10]uint32{0x01f30eb8, 0x029f323c, 0x004642f8, 0x03a37cce, 0x01efd513, 0x017d9424, 0x01521da6, 0x02d3f03e, 0x01e6a779, 0x0024388d}}}, + {X: Field{[10]uint32{0x001cf568, 0x0122b626, 0x02c56b01, 0x01238daa, 0x02f26093, 0x032a8ae0, 0x01dd0b0a, 0x00eb7d04, 0x02f1c870, 0x002e3033}}, Y: Field{[10]uint32{0x01275f14, 0x011cab80, 0x03916a33, 0x02915303, 0x0345e7aa, 0x03526a5e, 0x00e74a81, 0x026a852e, 0x00114701, 0x00281065}}}, + {X: Field{[10]uint32{0x0208cf09, 0x006f61a0, 0x012c0ab5, 0x0036ab5e, 0x030a35ab, 0x03746f45, 0x026b43a4, 0x031e44aa, 0x036e06e1, 0x0023955d}}, Y: Field{[10]uint32{0x00822d56, 0x029eb61c, 0x01c012c8, 0x01fdb6aa, 0x02cec730, 0x03518b9a, 0x02d12bc6, 0x02aefc30, 0x00c3a025, 0x0037f933}}}, + {X: Field{[10]uint32{0x003ad1ad, 0x01611a83, 0x0267c5f0, 0x01c3122d, 0x01db813b, 0x038e4090, 0x0122790d, 0x02609138, 0x02d3fc9d, 0x0003c73d}}, Y: Field{[10]uint32{0x03984799, 0x025a6bf0, 0x026f6c8b, 0x024ec5ce, 0x01750069, 0x02b9ea13, 0x02f1ec77, 0x0346c8d7, 0x02ab3952, 0x00124971}}}, + {X: Field{[10]uint32{0x01b9ea31, 0x0199c2bb, 0x0000a9e5, 0x011f2b2f, 0x03811641, 0x036dd8b0, 0x00495ab9, 0x03b924ad, 0x0388dce5, 0x002d276f}}, Y: Field{[10]uint32{0x03a9ef2a, 0x01eb3ebf, 0x023feb8b, 0x030b7a24, 0x028971f7, 0x034a2291, 0x00d703ef, 0x025f1dd6, 0x0317ab57, 0x00303e4b}}}, + {X: Field{[10]uint32{0x018ca362, 0x0327dd43, 0x02cab9a8, 0x010e7992, 0x00399e26, 0x0097df73, 0x0173c50a, 0x015fb455, 0x02ad257b, 0x0035abf8}}, Y: Field{[10]uint32{0x0135749d, 0x02b1bce3, 0x01b42b47, 0x028d5871, 0x0138d355, 0x018a0ac4, 0x01402491, 0x02d5ac5c, 0x02b86919, 0x00177c8d}}}, + {X: Field{[10]uint32{0x02e8e89f, 0x00480106, 0x0244b53e, 0x0279a112, 0x0345b48a, 0x033b92d2, 0x032a439f, 0x0197e965, 0x00c5f233, 0x002ec0a1}}, Y: Field{[10]uint32{0x02265300, 0x01d8266e, 0x034936ae, 0x0329bc53, 0x0153221d, 0x03b554ca, 0x0018fb2a, 0x0164c9e4, 0x000de09e, 0x001a12f3}}}, + {X: Field{[10]uint32{0x024467ec, 0x00b611f9, 0x037e46e8, 0x009ead69, 0x03c47796, 0x0228105d, 0x00be6219, 0x025a5c6e, 0x03148a40, 0x0015fa55}}, Y: Field{[10]uint32{0x01443f13, 0x01467cb3, 0x00c126bb, 0x03497a15, 0x01fd8e7c, 0x004a94dd, 0x006d3a8f, 0x0096001f, 0x01b114ce, 0x001c52f4}}}, + {X: Field{[10]uint32{0x02713094, 0x0149b647, 0x03757d17, 0x01e3ad8d, 0x01a1e144, 0x03a01148, 0x03ef2a3d, 0x00ed1d48, 0x0360b33c, 0x002c320b}}, Y: Field{[10]uint32{0x02cea63c, 0x02be6528, 0x032eeac1, 0x03596a0a, 0x0123d163, 0x024fdff6, 0x022f70ac, 0x03d4b994, 0x01b9d763, 0x0033f234}}}, + {X: Field{[10]uint32{0x013e1ee3, 0x01292f55, 0x005a35c2, 0x0093fdfe, 0x00667d83, 0x01b663b4, 0x032c185c, 0x0216f564, 0x01704047, 0x000ae9d8}}, Y: Field{[10]uint32{0x02ea35b9, 0x035580fb, 0x03307205, 0x0067cf8b, 0x01e56aef, 0x01545934, 0x03167d6b, 0x00abd581, 0x03907426, 0x00006041}}}, + {X: Field{[10]uint32{0x02d3e88c, 0x0248d71b, 0x00895b5c, 0x02169c8a, 0x0103eb1c, 0x01f83296, 0x01d15c82, 0x02e483ec, 0x0213d508, 0x0016f553}}, Y: Field{[10]uint32{0x020cf0c9, 0x024cebd9, 0x016fc2b1, 0x02b3bcef, 0x02878017, 0x02b1f608, 0x030ab1e4, 0x03864fa9, 0x01fd5607, 0x0035974d}}}, + {X: Field{[10]uint32{0x02a8d09a, 0x037e5dcf, 0x026947cc, 0x017d5993, 0x00a590d6, 0x01b3c84b, 0x03f1664e, 0x03626aca, 0x02d2753b, 0x002c2ef0}}, Y: Field{[10]uint32{0x03993c23, 0x0026f723, 0x0147e47f, 0x01047cd3, 0x02072257, 0x03319c14, 0x00190654, 0x022eae85, 0x02c1a107, 0x002415ed}}}, + {X: Field{[10]uint32{0x013133a8, 0x03a771b3, 0x00459224, 0x00c083a3, 0x01b38b46, 0x0151484a, 0x000fe419, 0x00e2b377, 0x02033cca, 0x00305c04}}, Y: Field{[10]uint32{0x01557e9a, 0x02d8dabd, 0x03b14fb6, 0x02d7afd3, 0x02624f78, 0x01b02185, 0x00071888, 0x01bd9d1b, 0x007b1cfb, 0x00312576}}}, + {X: Field{[10]uint32{0x03a21bda, 0x00c28917, 0x032ea749, 0x037764d4, 0x007c9fa4, 0x03ef0a31, 0x02879617, 0x0127fcc8, 0x020e5f1e, 0x000782f4}}, Y: Field{[10]uint32{0x03dd6177, 0x02385810, 0x01cd5703, 0x02719af8, 0x01b2a586, 0x011cbe84, 0x01a681b2, 0x03c57797, 0x00000e98, 0x000b501d}}}, + {X: Field{[10]uint32{0x017ec15f, 0x006c560c, 0x0388b03a, 0x028ef017, 0x00f39def, 0x0214ce9c, 0x012a9740, 0x019863fc, 0x023fec4c, 0x00173f08}}, Y: Field{[10]uint32{0x03f21411, 0x00cd512b, 0x00cf93da, 0x03ded9c6, 0x01eb4468, 0x031ce2c2, 0x006ec226, 0x01c6798e, 0x03d489e3, 0x001f64a2}}}, + {X: Field{[10]uint32{0x01efa67d, 0x03330b20, 0x00e8801c, 0x033942b0, 0x005da345, 0x02b51ea1, 0x03e514eb, 0x019a3815, 0x020abebd, 0x003d4195}}, Y: Field{[10]uint32{0x020fc7e9, 0x029f4eb2, 0x00d639d9, 0x036056f7, 0x0263111f, 0x01fd9289, 0x03580ad1, 0x02a66af0, 0x03f7c9c2, 0x0038bfc2}}}, + {X: Field{[10]uint32{0x02c54f45, 0x039ef609, 0x02ef8306, 0x02b96fe5, 0x001d00dc, 0x0127405a, 0x0246e4c4, 0x01d21516, 0x0298ec88, 0x0021123f}}, Y: Field{[10]uint32{0x026f0407, 0x03bb6afa, 0x0256a66a, 0x0117da75, 0x0285b200, 0x00d204dd, 0x01a82713, 0x000c88b7, 0x02291750, 0x00343c1c}}}, + {X: Field{[10]uint32{0x03cffc55, 0x01156ea5, 0x004f56bc, 0x00a2a619, 0x002480cf, 0x00a50bcd, 0x015ca713, 0x01f0b8db, 0x017fdb03, 0x003269a1}}, Y: Field{[10]uint32{0x03aa149f, 0x0238d9e3, 0x011c6b79, 0x01d2da33, 0x01f742d9, 0x03b5be5f, 0x00b8326c, 0x023985b0, 0x00b98f67, 0x0029a782}}}, + {X: Field{[10]uint32{0x02c4011d, 0x0319936e, 0x019d503d, 0x01b6391a, 0x03b8fc28, 0x0226ac67, 0x02f7db2d, 0x03acef20, 0x03f5c611, 0x0002d744}}, Y: Field{[10]uint32{0x024b7adc, 0x02022c4c, 0x02bb6259, 0x036271c0, 0x02ef2692, 0x00921f42, 0x012493ff, 0x003f7d6e, 0x02507cdc, 0x0009fac5}}}, + {X: Field{[10]uint32{0x0235ce44, 0x02ecd3b6, 0x02fad75a, 0x01c75fc6, 0x02902184, 0x0230a71b, 0x001b8871, 0x0352b300, 0x01f32e0e, 0x002fe7b1}}, Y: Field{[10]uint32{0x027ef2d1, 0x00dea011, 0x0146bdd8, 0x01a1ce19, 0x00a1734f, 0x01a311e9, 0x01224ed3, 0x010196de, 0x0088892b, 0x0004e119}}}, + {X: Field{[10]uint32{0x02526e19, 0x024ab04e, 0x00f2ed6d, 0x021eb5aa, 0x00893c5a, 0x0329bd6e, 0x011f6bd1, 0x00704ebb, 0x02be4d3b, 0x000b0e04}}, Y: Field{[10]uint32{0x0033aece, 0x02533bcd, 0x03af324a, 0x02b4519a, 0x031b11ed, 0x02cd02f2, 0x03cf877d, 0x014782de, 0x02f145d5, 0x000d9ae0}}}, + {X: Field{[10]uint32{0x0233f572, 0x031721b2, 0x013a6f21, 0x014e362f, 0x019fd172, 0x002289b9, 0x00d0a13c, 0x03db21ff, 0x0328dc8e, 0x001def7b}}, Y: Field{[10]uint32{0x023c3a1b, 0x019fda7a, 0x017ef081, 0x022a0fe5, 0x016977ba, 0x02960294, 0x02c1feca, 0x03526c03, 0x00c7bf3b, 0x003699ac}}}, + {X: Field{[10]uint32{0x0371afe5, 0x03f445a2, 0x02b154ef, 0x0301953b, 0x028693ba, 0x03cd3181, 0x006503e3, 0x021def36, 0x019d3185, 0x002f129e}}, Y: Field{[10]uint32{0x0255569e, 0x03ddd5dc, 0x03e664f7, 0x01af4cc6, 0x03f59abf, 0x00985496, 0x0159c99e, 0x00643a9c, 0x03f899a8, 0x0014ff35}}}, + {X: Field{[10]uint32{0x02fcd040, 0x0170620b, 0x039dce27, 0x01bcb84f, 0x006fccdb, 0x000dd41e, 0x010e4c7d, 0x03381586, 0x0084733d, 0x000c07f6}}, Y: Field{[10]uint32{0x01e25cb6, 0x00b22294, 0x00b735de, 0x00303897, 0x00312c91, 0x012f981f, 0x0035cef6, 0x027d47f6, 0x01d5185b, 0x001e793e}}}, + {X: Field{[10]uint32{0x014adb70, 0x018062a0, 0x032f387b, 0x01df9436, 0x02133f83, 0x00dc6710, 0x00d0bda1, 0x01f95085, 0x029bbe5e, 0x000906d2}}, Y: Field{[10]uint32{0x0010bdb0, 0x019211ed, 0x039593c1, 0x0000922c, 0x03a8ce21, 0x03f30032, 0x036bca27, 0x0348b87d, 0x0008fa4f, 0x00319bb7}}}, + {X: Field{[10]uint32{0x00c79585, 0x028580b6, 0x0098156e, 0x005bcca5, 0x01dcd28c, 0x018cf547, 0x01c1351d, 0x004a24f1, 0x02396819, 0x002f9bc5}}, Y: Field{[10]uint32{0x03afff21, 0x029c797e, 0x0335a5f7, 0x0282950c, 0x021ade5d, 0x03d7f979, 0x038a9668, 0x014e7a9f, 0x027e1a65, 0x001bd9d2}}}, + {X: Field{[10]uint32{0x01d3a283, 0x01f2cc4f, 0x03285e23, 0x02eadff2, 0x01b3f7bf, 0x028b452e, 0x0209ef60, 0x0278a9f8, 0x008f79c6, 0x00322d40}}, Y: Field{[10]uint32{0x03b54bb9, 0x00fb029a, 0x008f52d8, 0x032a98c0, 0x023cea15, 0x01bbf2cd, 0x0036dd74, 0x03df802f, 0x03486c3c, 0x000771e4}}}, + {X: Field{[10]uint32{0x006c0998, 0x029ffd30, 0x027d4eed, 0x02b1df3c, 0x02b038ed, 0x01e5ab47, 0x0197ec3a, 0x03b5893a, 0x039eaad5, 0x0014052b}}, Y: Field{[10]uint32{0x0189dd7d, 0x0221808c, 0x031511a4, 0x014cd25d, 0x01911439, 0x021ed2db, 0x004a77a9, 0x028714b5, 0x006fb8fa, 0x0038075e}}}, + {X: Field{[10]uint32{0x03bb989a, 0x02b76329, 0x02d2b45d, 0x03023620, 0x01b0845e, 0x03ca3f37, 0x02d4f284, 0x0190fb68, 0x01e62c40, 0x001bffbf}}, Y: Field{[10]uint32{0x0011cc0e, 0x01bf9721, 0x004717fb, 0x0201a9bd, 0x01ff0a54, 0x028afb2f, 0x029e4bd9, 0x00ea7888, 0x003c782d, 0x00238ac6}}}, + {X: Field{[10]uint32{0x007d463f, 0x03fc7c52, 0x022904aa, 0x003f07a4, 0x020ad014, 0x02d3030d, 0x02a7e5d0, 0x004dd34c, 0x03bf190e, 0x002b1d8a}}, Y: Field{[10]uint32{0x033adefe, 0x02944f97, 0x02a7e435, 0x0143b606, 0x03bc34d8, 0x036dac4b, 0x001bfec5, 0x01ad028e, 0x03183101, 0x003335e7}}}, + {X: Field{[10]uint32{0x0011cb24, 0x023ab83a, 0x03342796, 0x0337a0a3, 0x03d791a5, 0x01cdec76, 0x03244e7b, 0x0171d424, 0x02d63ec0, 0x0025cd25}}, Y: Field{[10]uint32{0x01647533, 0x01cf99c9, 0x03b7abf5, 0x0194bd5e, 0x03d7420b, 0x030fcd3c, 0x037ff525, 0x00cd47d8, 0x03c0044e, 0x0012cb26}}}, + {X: Field{[10]uint32{0x00a15d32, 0x0266cd21, 0x034291a7, 0x0001be80, 0x02c39ce3, 0x03a8e78d, 0x03577539, 0x02f0c1d0, 0x01665f77, 0x002a7624}}, Y: Field{[10]uint32{0x0380e213, 0x0204ee12, 0x0296b8d0, 0x013f33ea, 0x0056dd88, 0x0018d694, 0x039ce982, 0x02e3f3d3, 0x0217fded, 0x0034270e}}}, + {X: Field{[10]uint32{0x00c5710b, 0x02a68828, 0x02f769ec, 0x01bd835b, 0x02cbab63, 0x009086eb, 0x00a7419f, 0x0151362e, 0x03fdaa2b, 0x000422a3}}, Y: Field{[10]uint32{0x00e0249d, 0x01599735, 0x028d7b12, 0x01ce77cc, 0x01cebbb2, 0x017c38e2, 0x025776a7, 0x02b56289, 0x01fcab04, 0x0002b4fa}}}, + {X: Field{[10]uint32{0x027c5fb5, 0x0316fb5c, 0x00a36de8, 0x02365448, 0x03954387, 0x01791257, 0x000ac6df, 0x00f15eff, 0x017bc884, 0x003be5a7}}, Y: Field{[10]uint32{0x021f16fb, 0x033e170d, 0x0302afc1, 0x014dee02, 0x01d1d4d6, 0x037aab69, 0x005d81a1, 0x0200dac5, 0x03b22673, 0x0016ae06}}}, + {X: Field{[10]uint32{0x03c39b62, 0x028c2590, 0x01162b0b, 0x03c9043d, 0x01d74200, 0x03dc2c91, 0x02dafb28, 0x01514fc4, 0x03c24d50, 0x002ae096}}, Y: Field{[10]uint32{0x01281a1d, 0x032c196c, 0x0194c6f9, 0x02e35155, 0x01708098, 0x01dea072, 0x03e31da2, 0x01105769, 0x01f22377, 0x001e279f}}}, + {X: Field{[10]uint32{0x00bf2622, 0x015aec12, 0x03ac0598, 0x00e664ce, 0x02eeed4e, 0x02125a5c, 0x039198cf, 0x00f00bb1, 0x00e52c17, 0x00126129}}, Y: Field{[10]uint32{0x00c5df3f, 0x033e25eb, 0x034348e7, 0x0090e647, 0x02f199e9, 0x0330f33d, 0x0087a9c2, 0x00b98682, 0x027b79be, 0x001165ad}}}, + {X: Field{[10]uint32{0x025f7272, 0x01284c98, 0x02fbccfa, 0x01a88fcf, 0x004bf0f7, 0x02a9f2c9, 0x0360d0d8, 0x02f84fd3, 0x03f493c1, 0x000a171b}}, Y: Field{[10]uint32{0x03ed49d3, 0x01ecf674, 0x03c1212d, 0x0397a289, 0x03c4caac, 0x0276e6c8, 0x00fd9984, 0x03bca357, 0x01a5cf9c, 0x000e77fa}}}, + {X: Field{[10]uint32{0x003db340, 0x02dc23e1, 0x02c7b348, 0x001b09e2, 0x019bc6e5, 0x00c402aa, 0x02667171, 0x0065c7a4, 0x01d17e72, 0x0007852c}}, Y: Field{[10]uint32{0x00e41cee, 0x0017c113, 0x02a1164d, 0x03f17de7, 0x00394d7d, 0x0135050f, 0x03fe464c, 0x03d89cd1, 0x039dd705, 0x00018e88}}}, + {X: Field{[10]uint32{0x0217c8aa, 0x0102ed6f, 0x018fc101, 0x030133cc, 0x033b1394, 0x03352161, 0x01dcf309, 0x03347bd8, 0x03b9ed71, 0x0002e3dc}}, Y: Field{[10]uint32{0x036f665c, 0x0041f99d, 0x02ec5827, 0x01a96b10, 0x01074567, 0x006f997b, 0x034823aa, 0x03b214bf, 0x02e0bd66, 0x0022bd76}}}, + {X: Field{[10]uint32{0x0314540a, 0x012fdba1, 0x01d15e62, 0x034c7352, 0x0049c995, 0x03456bf4, 0x02367760, 0x03f3db2d, 0x0297e878, 0x001f831c}}, Y: Field{[10]uint32{0x02ddd658, 0x02bc3f6b, 0x000e58aa, 0x00c0280a, 0x00ffd595, 0x02c9c680, 0x00b7568b, 0x00810fd2, 0x01f74c51, 0x0037d5e5}}}, + {X: Field{[10]uint32{0x03798545, 0x03f409da, 0x02cbade5, 0x0046dd52, 0x00109990, 0x03377f92, 0x0351133f, 0x03b67e8a, 0x011d465b, 0x00027c3b}}, Y: Field{[10]uint32{0x00a8459f, 0x02666405, 0x016e9217, 0x00e398c9, 0x01d85b6c, 0x00aaa676, 0x03adde01, 0x00380192, 0x009c73bb, 0x001c017b}}}, + {X: Field{[10]uint32{0x008e12bf, 0x02946aa7, 0x01b125a0, 0x0002c78d, 0x03cc8e40, 0x00388f3b, 0x020608d8, 0x016bc005, 0x035e0b5c, 0x000b555b}}, Y: Field{[10]uint32{0x01f12000, 0x0108b285, 0x038a94e4, 0x0223e02a, 0x01d24d44, 0x03f61bd0, 0x007f6fc1, 0x00eebc77, 0x014425bc, 0x0001d800}}}, + {X: Field{[10]uint32{0x035ed3f2, 0x0206f320, 0x0128ee8d, 0x03950526, 0x012cc14c, 0x0271f730, 0x0079524d, 0x0380b02d, 0x027d7637, 0x000985d9}}, Y: Field{[10]uint32{0x0380884b, 0x02b90651, 0x019babc6, 0x005806ca, 0x017a2c4e, 0x01e3298e, 0x01496be4, 0x0027ae3d, 0x03ba2cd8, 0x0014855c}}}, + {X: Field{[10]uint32{0x019aac10, 0x02c187c3, 0x02492ba1, 0x033fb416, 0x034cae40, 0x020428fc, 0x036e10f8, 0x026991ed, 0x016c5b51, 0x001891e4}}, Y: Field{[10]uint32{0x02e7f098, 0x00cc09bb, 0x034caf2d, 0x01a70fa7, 0x00602b09, 0x00036875, 0x02a193c5, 0x02a5e241, 0x0170535b, 0x003ff409}}}, + {X: Field{[10]uint32{0x023c52af, 0x017533e6, 0x03db4fa5, 0x012a544d, 0x01ea14c6, 0x03b3b3ee, 0x0017e780, 0x002a2180, 0x03e08ed5, 0x003102c9}}, Y: Field{[10]uint32{0x007b6493, 0x03c6b378, 0x0001ba86, 0x02e0c3aa, 0x00c4149f, 0x00416a95, 0x01d1e977, 0x016e13f6, 0x038c7d02, 0x00090572}}}, + {X: Field{[10]uint32{0x03e0de12, 0x0195e340, 0x029748b6, 0x02afc199, 0x03ad7103, 0x03aea713, 0x01bf17bc, 0x0295bf34, 0x008a54a3, 0x002e96bb}}, Y: Field{[10]uint32{0x0157ffbd, 0x03562c1b, 0x0370dc49, 0x0180e7e6, 0x00a705de, 0x03a96e98, 0x03474d28, 0x0312fcf1, 0x0311abec, 0x000d236a}}}, + {X: Field{[10]uint32{0x00076268, 0x00089225, 0x03f675c0, 0x00139571, 0x02c1e9e5, 0x03ecfcc6, 0x031262cf, 0x00a5384c, 0x0258f8dd, 0x002e8539}}, Y: Field{[10]uint32{0x001aa1dd, 0x01b792b2, 0x023659b9, 0x038e8c9b, 0x00c221b0, 0x01b76684, 0x00cb36c6, 0x03957b1c, 0x0105fc43, 0x0033b5d2}}}, + {X: Field{[10]uint32{0x03f4aff4, 0x037e85a9, 0x022d4cfb, 0x00382870, 0x00f9c1d0, 0x004e6acc, 0x02718cb4, 0x031fe8a7, 0x03698880, 0x000cdd6b}}, Y: Field{[10]uint32{0x02295a27, 0x0399fbb3, 0x01726ddd, 0x01e73957, 0x028d27db, 0x0389b1a3, 0x02fa0b85, 0x0396c6d9, 0x0091a83b, 0x0033ea2d}}}, + {X: Field{[10]uint32{0x019f01fe, 0x0252a92f, 0x002d5efc, 0x038bdf54, 0x035b9a8e, 0x0312c9db, 0x03a109a2, 0x03f7eba7, 0x014b306c, 0x001a3498}}, Y: Field{[10]uint32{0x0348550e, 0x00e1b217, 0x008f3661, 0x01221023, 0x01ef9e1d, 0x03503ed6, 0x01f54e84, 0x0197b5f7, 0x02bcf043, 0x0005230d}}}, + {X: Field{[10]uint32{0x00533edd, 0x011edfc7, 0x0277b7fc, 0x01ac1b0d, 0x03900ece, 0x0358ce1e, 0x02990d71, 0x000ec2b4, 0x02a55977, 0x0024feb3}}, Y: Field{[10]uint32{0x002ad5f4, 0x011e5f25, 0x03179745, 0x011363b9, 0x01c20bbe, 0x02687db0, 0x00199853, 0x0053a2d7, 0x03fa8fa1, 0x000f2006}}}, + {X: Field{[10]uint32{0x01054277, 0x01b09d5d, 0x005d6eef, 0x03c5b288, 0x025a0a61, 0x01b242ca, 0x0375ae17, 0x00c46255, 0x00a672f7, 0x003c4775}}, Y: Field{[10]uint32{0x01556ef6, 0x026d5a2e, 0x020e83f5, 0x01154782, 0x006c307d, 0x03063434, 0x022083ca, 0x02b03dfa, 0x016d2ef2, 0x002f01a8}}}, + {X: Field{[10]uint32{0x024204f7, 0x0328e721, 0x00010f10, 0x02165c97, 0x000b71fe, 0x020f2001, 0x029a94ef, 0x029153f4, 0x005d710b, 0x0010baf3}}, Y: Field{[10]uint32{0x025f223b, 0x001934b5, 0x00e40279, 0x01f371a6, 0x00e633c1, 0x01c7419f, 0x03d5cdb2, 0x0007b531, 0x00eb6431, 0x003e2aa1}}}, + {X: Field{[10]uint32{0x01c80e52, 0x0278f861, 0x03b2e67e, 0x03684fc7, 0x00549e96, 0x02274668, 0x03b6fbce, 0x016a5021, 0x03dcd96d, 0x0035021d}}, Y: Field{[10]uint32{0x02789444, 0x0388d317, 0x0087c837, 0x001bd764, 0x02c0be83, 0x03f00510, 0x017b59af, 0x003f2e39, 0x01b385f2, 0x002fa6ee}}}, + {X: Field{[10]uint32{0x0162931f, 0x01d0d609, 0x03e398fa, 0x02eeae35, 0x03aa40c1, 0x00e49029, 0x00ec9342, 0x0042ae22, 0x0098cd21, 0x003062cb}}, Y: Field{[10]uint32{0x015773f8, 0x00b3a5c5, 0x001cb24c, 0x02724df0, 0x03b83f18, 0x0019b102, 0x01f18cd1, 0x035d31d7, 0x00349147, 0x00365884}}}, + {X: Field{[10]uint32{0x005c0bd1, 0x03e238f8, 0x039e4d14, 0x01631923, 0x036fe946, 0x02ed37af, 0x034fa0c4, 0x03e10473, 0x03221a44, 0x0005535a}}, Y: Field{[10]uint32{0x0075559a, 0x014a9656, 0x01976de5, 0x03cfaf15, 0x037c1074, 0x0365398f, 0x00bbb6ad, 0x00ccbcca, 0x0307c705, 0x0037c2f0}}}, + {X: Field{[10]uint32{0x01a26f15, 0x009a8d78, 0x006e0a93, 0x01670eae, 0x0024485d, 0x02610b6f, 0x017d2285, 0x024ec68e, 0x01e5629f, 0x0028e096}}, Y: Field{[10]uint32{0x01f783fb, 0x02ee7aa4, 0x01892367, 0x013fd0d7, 0x00171327, 0x0229e6e3, 0x0074932e, 0x00a98ece, 0x00cc2fe5, 0x001a6d6b}}}, + {X: Field{[10]uint32{0x023fcd19, 0x02ca8f1d, 0x02013d4d, 0x00a5be08, 0x00148270, 0x03bb7b46, 0x025a7d52, 0x00d24e64, 0x02eee91e, 0x00275ca7}}, Y: Field{[10]uint32{0x03e89a1f, 0x02a8bc38, 0x00339657, 0x027938cc, 0x009cadc0, 0x0361d3ec, 0x02f731f2, 0x02188459, 0x015403cc, 0x001b60c8}}}, + {X: Field{[10]uint32{0x03751e3a, 0x01c06cd9, 0x00b39b25, 0x024e283e, 0x0346398c, 0x0112a7e6, 0x02cede79, 0x01f1f95d, 0x00088630, 0x00099d3c}}, Y: Field{[10]uint32{0x013f83cf, 0x0199ae06, 0x02fa212a, 0x031ea748, 0x02e31bde, 0x02c3c7d3, 0x03638d07, 0x0347be0d, 0x03426ac9, 0x0000fa7a}}}, + {X: Field{[10]uint32{0x02237f41, 0x03cd1453, 0x002c2743, 0x00b1bdc3, 0x03b7c164, 0x02d89b03, 0x028e9fdb, 0x02e15b74, 0x015eadb1, 0x002ca81b}}, Y: Field{[10]uint32{0x03f664d3, 0x033ab58e, 0x01f5ff3b, 0x02613401, 0x03de579a, 0x0206b582, 0x03baed44, 0x02c9a089, 0x038b8673, 0x0017532b}}}, + {X: Field{[10]uint32{0x022d713d, 0x03c8f848, 0x03a60f0b, 0x003c5056, 0x012b278c, 0x00103c17, 0x03e4ec92, 0x03af73b0, 0x0164d61d, 0x00082c9f}}, Y: Field{[10]uint32{0x00e516a3, 0x0111ede9, 0x03ffb41e, 0x0026eceb, 0x02c8c5c8, 0x00159d43, 0x01264886, 0x00b7cd73, 0x01e7ff5c, 0x00120761}}}, + {X: Field{[10]uint32{0x00e3f2e5, 0x0335714f, 0x0051bfc7, 0x003d169f, 0x03527093, 0x0031547d, 0x00d7c152, 0x02a897d8, 0x010c450e, 0x0013d298}}, Y: Field{[10]uint32{0x0247f328, 0x00bf640e, 0x0239c2b3, 0x013bf5f7, 0x01e82423, 0x03e75a3b, 0x02d8d8e0, 0x0188a19c, 0x0211db41, 0x0037c7a3}}}, + {X: Field{[10]uint32{0x00aceaa9, 0x03ee8daa, 0x01e9e776, 0x02245196, 0x03bc06c9, 0x00d66f01, 0x0170b4be, 0x010d6095, 0x02d80050, 0x0026cdd7}}, Y: Field{[10]uint32{0x01e90927, 0x01ab888d, 0x01f26d1e, 0x01021b73, 0x03226834, 0x01670d20, 0x01de5b1f, 0x0001a645, 0x0193385c, 0x000f4159}}}, + {X: Field{[10]uint32{0x02c9d1be, 0x0300648b, 0x03ba4060, 0x021cdff3, 0x03c13aff, 0x00e42dff, 0x03865e72, 0x00b21cc7, 0x00045d43, 0x0010d902}}, Y: Field{[10]uint32{0x0070cbeb, 0x01ac8818, 0x016eb234, 0x02496e2c, 0x025aff2a, 0x012ed3ef, 0x01f2aac5, 0x00ff878f, 0x02af6fc7, 0x00388ce3}}}, + {X: Field{[10]uint32{0x001e0b66, 0x01d849fd, 0x02a394c4, 0x00bbcae7, 0x0259287f, 0x02fa2353, 0x021f35cf, 0x0045c905, 0x004f2446, 0x0029b967}}, Y: Field{[10]uint32{0x019f334d, 0x03b17f9f, 0x032775f5, 0x00acb9ea, 0x0257a8ae, 0x0133dc62, 0x00fa470c, 0x01d7e507, 0x0347f5dd, 0x001d71c1}}}, + {X: Field{[10]uint32{0x01322d51, 0x02801ec9, 0x016ed7c9, 0x0165d2ca, 0x025293a9, 0x01a9b4ce, 0x03bf1e84, 0x0147f65d, 0x0217ae73, 0x003fd8e5}}, Y: Field{[10]uint32{0x03dac457, 0x01cc4594, 0x0239f79d, 0x01c7bd01, 0x03e21dca, 0x039e60d4, 0x03f81ffe, 0x0157dd94, 0x01abfa23, 0x0039848f}}}, + {X: Field{[10]uint32{0x02f4faf3, 0x0376fa53, 0x030435f8, 0x03b80722, 0x00c254df, 0x02b578a1, 0x0237cbc5, 0x03639822, 0x00401710, 0x001de452}}, Y: Field{[10]uint32{0x00611414, 0x02e3b638, 0x00ecaa54, 0x0118cb26, 0x02623be4, 0x02534a9a, 0x0075dc38, 0x03531c10, 0x00e99ef3, 0x00365fd1}}}, + {X: Field{[10]uint32{0x01484aad, 0x015e7ede, 0x00ee5d42, 0x03f01b76, 0x00947cf1, 0x03704d71, 0x0151c00a, 0x0152a841, 0x00aa0292, 0x003da244}}, Y: Field{[10]uint32{0x0052c1fc, 0x02d67930, 0x03c941b9, 0x0310fd71, 0x0269f9f5, 0x0325e137, 0x01587eaf, 0x01b58c2b, 0x03db33a5, 0x00102f7e}}}, + {X: Field{[10]uint32{0x036e0fd3, 0x01891906, 0x0169629f, 0x034b7bc7, 0x00f2d4d8, 0x03558361, 0x01c75011, 0x0133bdc6, 0x0381473d, 0x00056fa3}}, Y: Field{[10]uint32{0x00fd9a2a, 0x023bbb9c, 0x007bb1d2, 0x02a21241, 0x0364b85e, 0x01b64c99, 0x011ead00, 0x006d0711, 0x0126fc99, 0x001f99be}}}, + {X: Field{[10]uint32{0x0284e9ca, 0x006af762, 0x019db909, 0x01be682f, 0x03d0c5c2, 0x01f10722, 0x03272970, 0x00c0bbd0, 0x015a2e22, 0x0003844f}}, Y: Field{[10]uint32{0x01574dc0, 0x0095f2bd, 0x0353026a, 0x03472e00, 0x03b54941, 0x03c6cb16, 0x026b70b2, 0x0371145e, 0x02d834c6, 0x000b9218}}}, + {X: Field{[10]uint32{0x03bea688, 0x0237f9d1, 0x01595aa7, 0x02c15f5b, 0x022c94da, 0x030346f8, 0x0220d9de, 0x02e99dfd, 0x0370485b, 0x0025ac41}}, Y: Field{[10]uint32{0x03dbf30b, 0x027a7c6e, 0x016a5225, 0x03092926, 0x02ff854a, 0x031de766, 0x021bd58f, 0x01c9ab06, 0x02ae0222, 0x0038182a}}}, + {X: Field{[10]uint32{0x0005545d, 0x01e24d09, 0x02183de8, 0x031d68e3, 0x0057f6f7, 0x034b3f63, 0x025e8990, 0x0255385f, 0x03005555, 0x00205d0b}}, Y: Field{[10]uint32{0x02d2fc0e, 0x03b80f4b, 0x0236edf1, 0x031a3e48, 0x00a8d742, 0x00d5e3ec, 0x032fbb07, 0x0017cb9b, 0x03c2e5f7, 0x00285d8f}}}, + {X: Field{[10]uint32{0x0378a480, 0x01207fee, 0x01c17fcc, 0x002f85b0, 0x0386bc7a, 0x02434dee, 0x00b72eaf, 0x023d89df, 0x03139698, 0x0005f067}}, Y: Field{[10]uint32{0x03c78833, 0x030eed94, 0x01fd9c5e, 0x0181c63e, 0x013f430e, 0x038f946e, 0x01c2642a, 0x0193ad88, 0x00d52101, 0x0032c4a4}}}, + {X: Field{[10]uint32{0x02497a3c, 0x0066fae8, 0x01c3f403, 0x001d8f00, 0x00bfeee5, 0x02e18552, 0x0248b2bb, 0x01bb2719, 0x0306e874, 0x00001ec3}}, Y: Field{[10]uint32{0x02a70020, 0x02dde3b5, 0x00c6a2fd, 0x016275ba, 0x031634b7, 0x032a831e, 0x00b318f1, 0x01f638c2, 0x03788429, 0x0031a524}}}, + {X: Field{[10]uint32{0x02c5e8b3, 0x015ba444, 0x0013405f, 0x005f2c6e, 0x0055a805, 0x02a26dd5, 0x027d8c28, 0x0060fe69, 0x03062414, 0x001c570a}}, Y: Field{[10]uint32{0x0120370b, 0x015dcfc9, 0x03b33920, 0x000e5de1, 0x0123167f, 0x03e12d35, 0x02d4cca7, 0x01771c78, 0x01c89a79, 0x003e26e2}}}, + {X: Field{[10]uint32{0x0374d3b6, 0x03d03723, 0x024c78f1, 0x00277626, 0x01057aed, 0x03f976fd, 0x0377662e, 0x03f1e1d9, 0x0200f974, 0x00383433}}, Y: Field{[10]uint32{0x03e3eb56, 0x01c138b8, 0x000d3e85, 0x03f9f2cf, 0x03c253be, 0x01315447, 0x03c7f05c, 0x01211e52, 0x0265ed70, 0x002b316f}}}, + {X: Field{[10]uint32{0x026432a2, 0x002ac7f4, 0x02222e77, 0x021d6eb5, 0x01bdba9a, 0x033674a8, 0x01aaf75e, 0x02e2de69, 0x028976fb, 0x000dd54c}}, Y: Field{[10]uint32{0x02ced92d, 0x00584230, 0x01d77eb0, 0x01f0b170, 0x0001087e, 0x00aca822, 0x00bc7d01, 0x00192f60, 0x02331b7e, 0x001b6ef8}}}, + {X: Field{[10]uint32{0x03e3d3ff, 0x02ace81b, 0x00699446, 0x0144aaf7, 0x00f46ca6, 0x02cabec1, 0x003f6b08, 0x0240da1a, 0x03ef51ea, 0x000ba570}}, Y: Field{[10]uint32{0x019b554a, 0x02d030ca, 0x0349839c, 0x019802ca, 0x0201556c, 0x01876f18, 0x0063b94c, 0x037f8121, 0x0287b1d8, 0x0002417a}}}, + {X: Field{[10]uint32{0x00ff8eb5, 0x01f5d6b1, 0x02cf40fe, 0x0036d645, 0x02646758, 0x01cd54fd, 0x035c67fb, 0x00c915fc, 0x021e721f, 0x00094c43}}, Y: Field{[10]uint32{0x006b4ace, 0x02d50c1e, 0x03041016, 0x018b05fa, 0x0146ecd6, 0x01f72ac7, 0x01a359b8, 0x03bad509, 0x02f9be42, 0x00271794}}}, + {X: Field{[10]uint32{0x03830b7b, 0x001fd46d, 0x013b0cf7, 0x01f5febd, 0x0227a23b, 0x035f2d41, 0x00779117, 0x03f0b75e, 0x031b2b24, 0x000964ca}}, Y: Field{[10]uint32{0x03536765, 0x00cb6477, 0x00f3e04e, 0x00180427, 0x022215e2, 0x037ce8ab, 0x03969a6d, 0x009ac075, 0x03b4acdb, 0x001fa388}}}, + {X: Field{[10]uint32{0x03c5ed3e, 0x005a911c, 0x0284e22b, 0x017ac26d, 0x02892e13, 0x025fd6e2, 0x029ba443, 0x01d99ee9, 0x02f6251f, 0x001f48ca}}, Y: Field{[10]uint32{0x02d8356e, 0x00995c69, 0x0392c1cd, 0x01165426, 0x00131b90, 0x026093c7, 0x03dea61d, 0x0226d633, 0x0238c8a5, 0x0028fa3d}}}, + {X: Field{[10]uint32{0x00c720f9, 0x03a5d572, 0x03633cb9, 0x01141211, 0x026afc86, 0x01125581, 0x03e05b0a, 0x03aa1ee8, 0x02a01b65, 0x001355b2}}, Y: Field{[10]uint32{0x03537330, 0x0105dc5d, 0x0208f50f, 0x03865deb, 0x007c1eae, 0x00dbc0d2, 0x03f1ada9, 0x01465f28, 0x027836e6, 0x000530d1}}}, + {X: Field{[10]uint32{0x0100a88b, 0x03bef671, 0x01c2c122, 0x000cdc9f, 0x032615b5, 0x031c8bb5, 0x01c81f42, 0x03e2eddd, 0x0165ca6f, 0x001c6af4}}, Y: Field{[10]uint32{0x012620f1, 0x02ae2112, 0x00eb9c39, 0x01499089, 0x01a59693, 0x0046b12e, 0x031c46ae, 0x013e18be, 0x00670728, 0x001e6e89}}}, + {X: Field{[10]uint32{0x02a48965, 0x00ba4195, 0x039f4200, 0x01d31045, 0x0230215e, 0x03176795, 0x00496345, 0x00146731, 0x00ccc381, 0x002118bf}}, Y: Field{[10]uint32{0x03787d4b, 0x00241229, 0x005cb64d, 0x029d70f0, 0x00f0eb75, 0x027f1190, 0x0148a7e2, 0x02e662f1, 0x0166cd7f, 0x00014d6a}}}, + {X: Field{[10]uint32{0x02c09826, 0x03a4d44d, 0x01ae3286, 0x0011bf91, 0x00b9c2b1, 0x0195a12a, 0x0178b5c6, 0x0147402d, 0x0093fed7, 0x003da3ab}}, Y: Field{[10]uint32{0x0148bff5, 0x013f117f, 0x01831733, 0x0355cca8, 0x0366f7d8, 0x02943952, 0x0119ff2f, 0x02a28a3c, 0x032b98b0, 0x00263830}}}, + {X: Field{[10]uint32{0x01f72041, 0x0110acb6, 0x00b1615f, 0x031f9250, 0x0243467d, 0x01bfd5a6, 0x00e4014f, 0x0364d670, 0x025009a8, 0x0018511c}}, Y: Field{[10]uint32{0x02c8f807, 0x00cc505e, 0x02d2eb2f, 0x0024abac, 0x00fa58f2, 0x03efaa22, 0x02a7108d, 0x01fb9f7b, 0x037fc7f5, 0x0003edc5}}}, + {X: Field{[10]uint32{0x0315614f, 0x023b3152, 0x01497fc2, 0x0324de68, 0x01c9846a, 0x00b6233c, 0x0259a26e, 0x006f4b88, 0x02114ffa, 0x003a9a7b}}, Y: Field{[10]uint32{0x00e4e2de, 0x02dda317, 0x022c9b17, 0x006e026d, 0x0163183d, 0x0375b3cf, 0x00141083, 0x035d4244, 0x01b51dd6, 0x001626e0}}}, + {X: Field{[10]uint32{0x025d5263, 0x01319813, 0x02b78146, 0x0057147e, 0x0338e6aa, 0x01ffc542, 0x01a1ce0d, 0x037a5990, 0x03243404, 0x000d1c9e}}, Y: Field{[10]uint32{0x0027d4f2, 0x00a27536, 0x03804435, 0x03cb56ef, 0x031920bf, 0x03001a74, 0x039baadd, 0x0329dcd6, 0x026bcf56, 0x0024660c}}}, + {X: Field{[10]uint32{0x02217461, 0x02343667, 0x02ad952f, 0x036549b3, 0x00eeebf4, 0x03a62d3c, 0x022d2756, 0x01e370a7, 0x02ae6137, 0x00254914}}, Y: Field{[10]uint32{0x02d486a8, 0x01c5d6ca, 0x035ff079, 0x020b7052, 0x03c17f65, 0x006c5046, 0x0250eb10, 0x03ed6be6, 0x0228c195, 0x003022ce}}}, + {X: Field{[10]uint32{0x038e49ff, 0x02855ab9, 0x01bfd2d4, 0x010af78b, 0x02401b83, 0x019840c1, 0x01afeba6, 0x022f1dfa, 0x0318dc4a, 0x003ef28f}}, Y: Field{[10]uint32{0x014129c9, 0x01f910fe, 0x029b6c7b, 0x01ceee4c, 0x034cf755, 0x01dae493, 0x020db7bc, 0x02cb7bb6, 0x016d6027, 0x000ae0a7}}}, + {X: Field{[10]uint32{0x03d8c141, 0x03130556, 0x0082b57b, 0x03fee502, 0x005302bf, 0x0022929c, 0x03dff64a, 0x0190ea55, 0x011d7ddc, 0x0031f77c}}, Y: Field{[10]uint32{0x02708e20, 0x01559a5b, 0x02a8889d, 0x038628f6, 0x03b3711e, 0x00e6f9e6, 0x03e81468, 0x02c0600f, 0x01f1ac93, 0x003a7284}}}, + {X: Field{[10]uint32{0x00ce31b8, 0x03b9299c, 0x02fa2cd0, 0x014e72db, 0x011b3f23, 0x039a0860, 0x031f7e44, 0x0018fae0, 0x023086e3, 0x001c410e}}, Y: Field{[10]uint32{0x01322c9d, 0x02df2d22, 0x03411ebc, 0x01914c82, 0x019334c1, 0x0178a613, 0x029cc925, 0x0349cd2a, 0x0338ef9f, 0x00136cfc}}}, + {X: Field{[10]uint32{0x00602585, 0x01a9dd92, 0x034c3dbb, 0x0111e644, 0x005d70f0, 0x003e8dd7, 0x0349d368, 0x01f2ef64, 0x02401534, 0x001b793a}}, Y: Field{[10]uint32{0x03960418, 0x01df7c9f, 0x03d70f1d, 0x010ce31c, 0x02458a32, 0x01c0973c, 0x028d8394, 0x014b6fba, 0x018865ab, 0x0000edd9}}}, + {X: Field{[10]uint32{0x024fecbe, 0x0095a5ae, 0x02215bc4, 0x030387e9, 0x01db9a0c, 0x03dee80f, 0x017e23b6, 0x03b2dfa8, 0x039f467c, 0x000a7ea9}}, Y: Field{[10]uint32{0x00f34838, 0x03fe86d2, 0x01154e50, 0x017b4bfc, 0x0264a224, 0x01af7c41, 0x03027d04, 0x02f0a707, 0x011fc42f, 0x00396a9a}}}, + {X: Field{[10]uint32{0x02aafc99, 0x010be4c5, 0x00f79c8c, 0x02e1d244, 0x03d750f8, 0x00afe3d6, 0x025f15a0, 0x016c89e3, 0x03fc25ae, 0x003fe202}}, Y: Field{[10]uint32{0x025747df, 0x03bba08e, 0x00b105ee, 0x019af228, 0x0360e7a1, 0x02ed40b6, 0x0025bd81, 0x023de4de, 0x030a0072, 0x00254d7d}}}, + {X: Field{[10]uint32{0x00a2a378, 0x01af4be9, 0x00eeef6a, 0x02c90949, 0x0160eff0, 0x014ba302, 0x020c5663, 0x03dbd614, 0x02a03837, 0x002de06d}}, Y: Field{[10]uint32{0x00dbbb62, 0x03ffefd3, 0x01e4fc44, 0x027989d5, 0x01cbf838, 0x0304ada7, 0x0322ee73, 0x00f7650d, 0x03d46c68, 0x002b35ed}}}, + {X: Field{[10]uint32{0x027406db, 0x01028ed1, 0x01990ee5, 0x01896411, 0x03b3f190, 0x00b92b0a, 0x0332c648, 0x03174369, 0x0193e8ba, 0x001b65d9}}, Y: Field{[10]uint32{0x032a8b6b, 0x01fa704b, 0x016583bd, 0x00966a2e, 0x016cbc18, 0x00a92abb, 0x00bb9c0f, 0x020585b0, 0x03e4af6d, 0x000c30d4}}}, + {X: Field{[10]uint32{0x00dc3032, 0x0219af5b, 0x014015d0, 0x0208a9b6, 0x03683ec7, 0x03eb4784, 0x02121129, 0x03836d18, 0x036a4dd3, 0x00063b59}}, Y: Field{[10]uint32{0x00a51bd5, 0x009ac580, 0x019bb8ef, 0x039dfb8c, 0x0006f9a6, 0x01780d9c, 0x03b97626, 0x02a0a97d, 0x02e15dbf, 0x00321ac1}}}, + {X: Field{[10]uint32{0x035ce2a1, 0x015032b6, 0x0118ceb3, 0x034ee547, 0x01d1e859, 0x03bf52e3, 0x00bce4da, 0x003ff30b, 0x0238e944, 0x0000c4e3}}, Y: Field{[10]uint32{0x0095c241, 0x038a325a, 0x029a3430, 0x010253be, 0x03fef4bc, 0x02431b9b, 0x0260a134, 0x02199f75, 0x01b2a11a, 0x0037e2ac}}}, + {X: Field{[10]uint32{0x00b00c95, 0x015c73fa, 0x03c3a091, 0x0023d240, 0x02163ce6, 0x0126a5d8, 0x02b1e761, 0x0326aae2, 0x00ac2025, 0x001d5f7d}}, Y: Field{[10]uint32{0x03a03430, 0x0353b337, 0x018c4a37, 0x032d343f, 0x01c56bd7, 0x014001d9, 0x0115ab76, 0x0317611f, 0x01feab36, 0x003fc2bd}}}, + {X: Field{[10]uint32{0x004c27e1, 0x01c10262, 0x015cc9aa, 0x03a1142e, 0x020ce09d, 0x0078ecbc, 0x03319a08, 0x01626f44, 0x02527156, 0x00229a5e}}, Y: Field{[10]uint32{0x0151f39d, 0x0027e1ab, 0x03ca13df, 0x039aefc0, 0x015a5edd, 0x00ccb576, 0x032815ad, 0x027a78df, 0x013cb602, 0x00027bae}}}, + {X: Field{[10]uint32{0x018c721b, 0x035838f9, 0x000b1650, 0x026f53d3, 0x01d35eb8, 0x00dea135, 0x03c2198e, 0x0382c5b3, 0x018736f9, 0x002c2eda}}, Y: Field{[10]uint32{0x016e00dc, 0x018d8efb, 0x001ebb3b, 0x0054bd23, 0x010b8556, 0x02ce3a0b, 0x009808f0, 0x02d405bc, 0x0200ce25, 0x000cf56c}}}, + {X: Field{[10]uint32{0x0037efed, 0x006d5172, 0x022d8d9f, 0x017a41ab, 0x03ef6d6f, 0x034be3fd, 0x037882a0, 0x0118d098, 0x01de5dde, 0x0007283b}}, Y: Field{[10]uint32{0x002863bc, 0x027af6aa, 0x02e41acb, 0x013eb163, 0x024c4d3a, 0x017ae7cf, 0x015d4c0f, 0x01a0f69f, 0x01ae4cff, 0x00067bed}}}, + {X: Field{[10]uint32{0x01474aa7, 0x03f10893, 0x0121ed90, 0x006b793a, 0x01d59ad1, 0x00786dd9, 0x02849310, 0x0395f59a, 0x030eb9a4, 0x001e0396}}, Y: Field{[10]uint32{0x033ab811, 0x024c8304, 0x016a3d33, 0x03fd0614, 0x001d8f34, 0x01e6a8e9, 0x02579f4c, 0x017c84b6, 0x00cc58cc, 0x0017af67}}}, + {X: Field{[10]uint32{0x00eb4c9d, 0x01a1b68d, 0x01468edf, 0x026952fc, 0x0330ec07, 0x037c8429, 0x02af620c, 0x021414b4, 0x00e93980, 0x003dfa4b}}, Y: Field{[10]uint32{0x00f93666, 0x03deae5e, 0x035857b1, 0x0259ea22, 0x0257c234, 0x00bc52b6, 0x03d54c03, 0x02a58563, 0x01cfe113, 0x000b1567}}}, + {X: Field{[10]uint32{0x0289f938, 0x01f69712, 0x036f54bc, 0x02909a4c, 0x013a5688, 0x00360358, 0x01ff8092, 0x00829e3e, 0x022075bb, 0x000f0ebe}}, Y: Field{[10]uint32{0x03888c8d, 0x03cfe71e, 0x0132b978, 0x0364fc74, 0x023bd836, 0x0190d7c8, 0x023a9f54, 0x00d75b95, 0x03081dd2, 0x001fbce0}}}, + {X: Field{[10]uint32{0x022097ee, 0x03ec557c, 0x01115af4, 0x03700c06, 0x0389fb9e, 0x01f95848, 0x01ec59e0, 0x03e6d5d7, 0x001dee60, 0x001c75bc}}, Y: Field{[10]uint32{0x0080bfee, 0x0011c387, 0x016802ef, 0x03483abc, 0x0138da4f, 0x02d050c8, 0x0054091f, 0x028d714a, 0x02454a31, 0x00387330}}}, + {X: Field{[10]uint32{0x00c4fa2d, 0x03dd6e4e, 0x036ea1f5, 0x00c7162a, 0x02b107fc, 0x039895f7, 0x00a77b28, 0x03b20242, 0x020f5705, 0x0025c999}}, Y: Field{[10]uint32{0x008cd4c1, 0x021a526d, 0x000c690c, 0x039c23a9, 0x01d3636f, 0x01b6c319, 0x018c213b, 0x0347a584, 0x03ae3102, 0x00253301}}}, + {X: Field{[10]uint32{0x02802719, 0x000ab0ac, 0x004b87fd, 0x004bb07f, 0x02297fad, 0x01fa2d8c, 0x011a1a29, 0x0286bc1a, 0x00c754b2, 0x002b3974}}, Y: Field{[10]uint32{0x039f85eb, 0x03252162, 0x008581f4, 0x032b4934, 0x027fc843, 0x03c6235a, 0x02491f05, 0x01c973ae, 0x03248d3e, 0x002493e7}}}, + {X: Field{[10]uint32{0x01943f64, 0x0159ace1, 0x018b88fa, 0x03f588ba, 0x028200ea, 0x00e2928a, 0x01778f28, 0x003fc333, 0x006b3480, 0x003e944c}}, Y: Field{[10]uint32{0x0296e293, 0x01721c50, 0x015c85f0, 0x015eb4d3, 0x0104b677, 0x0324ad43, 0x00ee030f, 0x0121ce87, 0x02166b14, 0x002d83b9}}}, + {X: Field{[10]uint32{0x01bea60a, 0x0275610b, 0x030f17c1, 0x0165845c, 0x000b716a, 0x0163abf3, 0x00097ee4, 0x009699e7, 0x0018329d, 0x002177e4}}, Y: Field{[10]uint32{0x017ab0fa, 0x03a24462, 0x0180ae62, 0x031bcbda, 0x00b7bc64, 0x039e1ddd, 0x01ad7c09, 0x008473a6, 0x01b6046d, 0x00315575}}}, + {X: Field{[10]uint32{0x00af5e3a, 0x02627389, 0x037f3efb, 0x03d1e018, 0x01337ff5, 0x0398d2a6, 0x0061b52a, 0x01119ead, 0x000dc202, 0x000bddf0}}, Y: Field{[10]uint32{0x005e3e39, 0x0039fea4, 0x0325303f, 0x039ebbca, 0x020c5d28, 0x039fbee9, 0x00c52b0b, 0x03eaf61c, 0x0278ebcb, 0x0031fd29}}}, + {X: Field{[10]uint32{0x028bb34e, 0x03123088, 0x0200158f, 0x03d6c3bd, 0x011f238d, 0x02e00afd, 0x036a4997, 0x0143583f, 0x023a7200, 0x0014b628}}, Y: Field{[10]uint32{0x003d9136, 0x00c0b6e0, 0x000f2ccd, 0x004b245e, 0x02cebb18, 0x030c31e1, 0x02d29b51, 0x02386858, 0x01a7861b, 0x00262ba0}}}, + {X: Field{[10]uint32{0x0212b211, 0x003b6c5c, 0x022fd37b, 0x008901d1, 0x00701daf, 0x01d556d7, 0x03b83204, 0x0001248b, 0x0079eaca, 0x0029fcf9}}, Y: Field{[10]uint32{0x03bdaada, 0x019402e7, 0x03ae8e92, 0x01f311db, 0x013e3376, 0x006eb00e, 0x0268498d, 0x029f05ee, 0x010c8c4c, 0x00203d86}}}, + {X: Field{[10]uint32{0x02356103, 0x01181f28, 0x00880ea0, 0x0264023d, 0x0373db57, 0x0108e0ab, 0x03bf4d79, 0x034c9986, 0x0150e67b, 0x000c7bcc}}, Y: Field{[10]uint32{0x00a9a8ee, 0x020d2c6a, 0x00954631, 0x01ab8f4b, 0x01bc03c4, 0x012c5bb5, 0x0350bb51, 0x00a3464e, 0x01d6655d, 0x001f6e3d}}}, + {X: Field{[10]uint32{0x038b058d, 0x03b8914e, 0x031fceab, 0x034e1a04, 0x00599b0c, 0x00bb7a8c, 0x02d1ee35, 0x000a64e6, 0x0155469c, 0x003ba0bc}}, Y: Field{[10]uint32{0x0092b10c, 0x00bfcc14, 0x00400eed, 0x0263c0e5, 0x0032de93, 0x02b6e263, 0x01d9ed6c, 0x030b10ab, 0x014e2d77, 0x003f4303}}}, + {X: Field{[10]uint32{0x016b4586, 0x0347df95, 0x0073e206, 0x0242d15a, 0x01273549, 0x0281c55d, 0x01f7d458, 0x0375bc2a, 0x007abfce, 0x00037b1f}}, Y: Field{[10]uint32{0x007200c4, 0x0060041d, 0x0327673c, 0x031ee172, 0x002c7626, 0x01e7f8c8, 0x02f0912b, 0x025fd061, 0x02b4cad5, 0x002be106}}}, + {X: Field{[10]uint32{0x00d2369d, 0x02cd347d, 0x0362e526, 0x004bb921, 0x002bf34f, 0x01466f60, 0x011ba405, 0x01bfa5d6, 0x037048cd, 0x0030a38c}}, Y: Field{[10]uint32{0x00636e8b, 0x003ac5fc, 0x01a647d5, 0x0148e4c9, 0x03b8640f, 0x025dae84, 0x0086dba6, 0x019cc5fd, 0x03ddda45, 0x0003802a}}}, + {X: Field{[10]uint32{0x03222195, 0x011448f7, 0x01a93071, 0x00c473c1, 0x01370277, 0x003c8d4c, 0x0029e9db, 0x017d9403, 0x00a92c27, 0x0011c55f}}, Y: Field{[10]uint32{0x01cbef6e, 0x003833a2, 0x00dc4f43, 0x01cacd3e, 0x009fefeb, 0x0107321d, 0x007e9ed4, 0x03f496be, 0x03fac911, 0x001922c5}}}, + {X: Field{[10]uint32{0x00a73241, 0x01c6991b, 0x03868f54, 0x014e9eac, 0x039a0a92, 0x027fc651, 0x01b55037, 0x014f3b60, 0x0302745c, 0x00213445}}, Y: Field{[10]uint32{0x01f858c5, 0x0382f089, 0x016b62c0, 0x03076359, 0x01fc593e, 0x01139933, 0x03b13536, 0x0021e93b, 0x02a20c3c, 0x0013c5ad}}}, + {X: Field{[10]uint32{0x03d63fc9, 0x02f8b5e5, 0x02dccb7f, 0x00a23a46, 0x03c74e81, 0x02a20471, 0x02b2f28e, 0x0182e1ac, 0x00221960, 0x000eee8c}}, Y: Field{[10]uint32{0x0334e286, 0x00f4a8a9, 0x02f3a9d7, 0x0262db9f, 0x00879d3f, 0x03a93d53, 0x03c5aa12, 0x014dce9d, 0x014af094, 0x001fcd01}}}, + {X: Field{[10]uint32{0x00651c6b, 0x03a281a6, 0x038f4425, 0x001aaa14, 0x00b9f746, 0x00f5039c, 0x037485ab, 0x01850c90, 0x03f47a2c, 0x0002158d}}, Y: Field{[10]uint32{0x03396054, 0x0002b664, 0x00096c35, 0x00c68c34, 0x02f76e85, 0x020e940d, 0x03075760, 0x00ac799e, 0x01d56fb4, 0x002f1aa5}}}, + {X: Field{[10]uint32{0x01bbd123, 0x01bb4c53, 0x0167d8ea, 0x010a902a, 0x02e8021a, 0x034f150f, 0x02d1605d, 0x00066887, 0x02985e75, 0x00094c0b}}, Y: Field{[10]uint32{0x02797a83, 0x02936399, 0x010f3267, 0x00e447f7, 0x01c02206, 0x004dc4fe, 0x02f9b4ba, 0x01d64751, 0x03e02309, 0x00212732}}}, + {X: Field{[10]uint32{0x003bea40, 0x01fd793d, 0x01f8e411, 0x003edae1, 0x03485fde, 0x029c82b8, 0x00d73dab, 0x024f8f02, 0x00bf88e3, 0x0039668c}}, Y: Field{[10]uint32{0x0197dfd5, 0x02112618, 0x02fb4422, 0x01921e1c, 0x0383ebbb, 0x00f92fe0, 0x00fa6bd3, 0x032cdc68, 0x024fe222, 0x001bf5e0}}}, + {X: Field{[10]uint32{0x02247e4e, 0x03e060fd, 0x025bda83, 0x0074b04d, 0x02de0533, 0x024d778b, 0x01e9bc3b, 0x00698162, 0x01f69798, 0x0031640b}}, Y: Field{[10]uint32{0x0175fe3c, 0x016b1f4b, 0x02c91f86, 0x01bae4f6, 0x0121d073, 0x03fadf38, 0x035ecb58, 0x0147bc6a, 0x014f5af5, 0x00319fac}}}, + {X: Field{[10]uint32{0x015e66ad, 0x02ad3983, 0x00c1b277, 0x0270b9b1, 0x01b8b640, 0x0138f202, 0x039a9b47, 0x0049fb19, 0x02c7fe27, 0x0037e2f6}}, Y: Field{[10]uint32{0x017d43e1, 0x02c409dc, 0x02dc7645, 0x01bf0099, 0x00273825, 0x00bad1c2, 0x01802ed7, 0x00e25953, 0x03e49f0b, 0x000ffc9b}}}, + {X: Field{[10]uint32{0x0065a82c, 0x0233dd8b, 0x02cf3f1e, 0x00942459, 0x009eff91, 0x0204357c, 0x01c7c02b, 0x02e32b0e, 0x004e9c7c, 0x00075550}}, Y: Field{[10]uint32{0x02a7632f, 0x02ee6f6c, 0x00707c24, 0x03a82681, 0x03e5a760, 0x00bf1348, 0x0099f64a, 0x03228d71, 0x0023f6a1, 0x00305e1c}}}, + {X: Field{[10]uint32{0x01f43b44, 0x03b82203, 0x034ef804, 0x02599e86, 0x002d040e, 0x01617914, 0x0106073d, 0x03f7eda1, 0x00c9b035, 0x000d7ce4}}, Y: Field{[10]uint32{0x03f512a2, 0x01768e2f, 0x010383c5, 0x00ab690f, 0x004c3cad, 0x003ae5d5, 0x0036fec5, 0x0362ddf7, 0x018886aa, 0x001aa173}}}, + {X: Field{[10]uint32{0x01e059b0, 0x01d13131, 0x006d588f, 0x01bb50f4, 0x011d2278, 0x0091273f, 0x02d7005b, 0x023e9bc9, 0x000dee88, 0x003eec21}}, Y: Field{[10]uint32{0x01b8d3bf, 0x034ac973, 0x005a6508, 0x03d2f4f5, 0x02203b05, 0x03d946eb, 0x00ffa219, 0x01c3c8e9, 0x014fd89a, 0x00191814}}}, + {X: Field{[10]uint32{0x034d78d7, 0x02049c68, 0x00ac9ce4, 0x0384cd4f, 0x0161fa0a, 0x01a4c7a4, 0x0208ac46, 0x01d77111, 0x00f01c22, 0x0009015b}}, Y: Field{[10]uint32{0x03c7751f, 0x0286d8f2, 0x011bf7dd, 0x028361a9, 0x01965a3f, 0x00d2949d, 0x003088f4, 0x020746fc, 0x03c67e73, 0x0010faf4}}}, + {X: Field{[10]uint32{0x00f9cd78, 0x02465c9c, 0x01297e77, 0x01175f9c, 0x0354f9f7, 0x035cbdac, 0x007c938c, 0x01f1e238, 0x03dfe844, 0x000ec410}}, Y: Field{[10]uint32{0x0240d6fc, 0x03c4a697, 0x0050c34a, 0x0184385b, 0x03b67ba3, 0x00ac6171, 0x02c29d4b, 0x03544449, 0x00c4abf0, 0x000a380a}}}, + {X: Field{[10]uint32{0x01a040e6, 0x03b7481a, 0x03a81a5b, 0x023d715d, 0x008088b0, 0x018d6017, 0x0175b236, 0x00d8e203, 0x01d14179, 0x002bbe42}}, Y: Field{[10]uint32{0x0200dc51, 0x006edf21, 0x03382d8a, 0x03007125, 0x0293350c, 0x03d028fe, 0x00c2b43d, 0x01adb174, 0x006f0de2, 0x00032ed3}}}, + {X: Field{[10]uint32{0x02833f28, 0x027e74f2, 0x007ac02c, 0x02e043d0, 0x03913367, 0x03c8a6f1, 0x0359aef5, 0x00c72dbf, 0x00f73863, 0x00323525}}, Y: Field{[10]uint32{0x010de4d2, 0x02a9d2ec, 0x01a67e70, 0x009e358b, 0x00c7b850, 0x034fbc45, 0x01afdacb, 0x0217534e, 0x02f94b62, 0x0032cb1d}}}, + {X: Field{[10]uint32{0x00f75b28, 0x00e44e4d, 0x033f5f4f, 0x005dbf97, 0x03c1b52e, 0x00779ed7, 0x00744437, 0x0328c8f7, 0x03f7af14, 0x00096bf3}}, Y: Field{[10]uint32{0x0142b789, 0x01c5c89a, 0x03781752, 0x03ed2bd2, 0x025010cd, 0x03541699, 0x031f57f8, 0x01fa5db2, 0x00a47f9d, 0x003619e9}}}, + {X: Field{[10]uint32{0x0132e2c7, 0x03658c8f, 0x022f819a, 0x00b5dc23, 0x01d40768, 0x022f5cb9, 0x02c220dc, 0x024c361c, 0x0086f773, 0x000090db}}, Y: Field{[10]uint32{0x00ab67a5, 0x02737aa2, 0x01662bc8, 0x021cdfc0, 0x0320a958, 0x0138501f, 0x00de6902, 0x0198f311, 0x01ea92af, 0x001b8e5b}}}, + {X: Field{[10]uint32{0x007f349d, 0x03d34945, 0x0056b0d0, 0x02e1fcf3, 0x0257638b, 0x0064567b, 0x00bcb86e, 0x00cf1e44, 0x03d59e57, 0x001873ba}}, Y: Field{[10]uint32{0x02fadb9e, 0x012c573c, 0x02aef3e7, 0x023e18a0, 0x027d8521, 0x01068c3a, 0x023082e7, 0x03b423ed, 0x0145e9b0, 0x000aa141}}}, + {X: Field{[10]uint32{0x00b6c187, 0x03a05fad, 0x0116dd77, 0x039b840b, 0x030dcbfe, 0x0278a91b, 0x0391a737, 0x0001c50a, 0x03b5d45d, 0x0016844c}}, Y: Field{[10]uint32{0x00d492e1, 0x03c0c14a, 0x0381f0f6, 0x03a3ce63, 0x0134c1c2, 0x00ce92df, 0x01c05171, 0x036710f2, 0x02aeafd6, 0x000bff65}}}, + {X: Field{[10]uint32{0x0163c8ac, 0x00e343d1, 0x0129309c, 0x0244c537, 0x01fff0f1, 0x0372c4ee, 0x02b5abe8, 0x006d04a7, 0x00498b70, 0x002dd28e}}, Y: Field{[10]uint32{0x00b9014f, 0x02599e67, 0x01186ffa, 0x00a3e10c, 0x01689be5, 0x0299de15, 0x00d6f7c5, 0x0083f619, 0x0257e50a, 0x00276113}}}, + {X: Field{[10]uint32{0x0389d26c, 0x032c8117, 0x024b752f, 0x01b2992a, 0x008e9a80, 0x02a54ab5, 0x011c3375, 0x0082d0ff, 0x00d04afb, 0x0030d727}}, Y: Field{[10]uint32{0x01a9c65a, 0x021de49e, 0x015a4b7e, 0x030fc1a7, 0x0248c765, 0x0278656c, 0x0279d841, 0x03bf2f7b, 0x02aa4a83, 0x002c1071}}}, + {X: Field{[10]uint32{0x00b82b96, 0x022b4df4, 0x025e8fea, 0x037b96db, 0x0311703d, 0x01e45075, 0x00b2af44, 0x01a2cfc1, 0x02587538, 0x0026a16a}}, Y: Field{[10]uint32{0x03d75d27, 0x0366549e, 0x005f2551, 0x0104efd2, 0x024e0620, 0x00cfb189, 0x00b80752, 0x03c0ef49, 0x00abaa16, 0x0011971c}}}, + {X: Field{[10]uint32{0x0086fe14, 0x03ac15d7, 0x0061bd12, 0x028f3e93, 0x01b3e825, 0x02f48fd2, 0x0183c14c, 0x03cf944b, 0x03cce051, 0x000fb1c6}}, Y: Field{[10]uint32{0x01915bdc, 0x017c17ba, 0x00007db3, 0x00ea6a54, 0x0245caba, 0x000cfc6a, 0x0294c5ab, 0x0295a954, 0x021de2da, 0x003c6630}}}, + {X: Field{[10]uint32{0x0359ae63, 0x0123c02c, 0x01b45aea, 0x01e4dcdf, 0x036b09e5, 0x00d6fccf, 0x0010e235, 0x007b7824, 0x0222939e, 0x003b872f}}, Y: Field{[10]uint32{0x021b90a5, 0x01e005e4, 0x0228d471, 0x0367794c, 0x01acecb6, 0x036adaa4, 0x037d2971, 0x0137d89f, 0x0026d444, 0x002fd810}}}, + {X: Field{[10]uint32{0x0346073e, 0x03c32659, 0x01ee78dc, 0x00aef222, 0x035a8cd9, 0x03fd3409, 0x007677d1, 0x00e98bbd, 0x03e171de, 0x003af2fc}}, Y: Field{[10]uint32{0x02f6ebe8, 0x00fd5d27, 0x03f9805c, 0x02428e08, 0x0195c6d8, 0x00b6b7ae, 0x014a3f30, 0x01c89024, 0x03c7bc9c, 0x0021e358}}}, + {X: Field{[10]uint32{0x039db797, 0x006cbf6a, 0x01ae56e8, 0x00c30243, 0x01b60664, 0x01654836, 0x03c57d52, 0x03bc56e1, 0x02e4ce72, 0x00393a4b}}, Y: Field{[10]uint32{0x015f944c, 0x03da5959, 0x00217ebe, 0x0232707e, 0x026d2183, 0x0161dd14, 0x01f47dbf, 0x029d4d56, 0x00654a03, 0x000feab1}}}, + {X: Field{[10]uint32{0x02ac1cc1, 0x010b7437, 0x03d635bc, 0x0319f078, 0x03cf275f, 0x00bac7d9, 0x00ef7431, 0x00ac0ded, 0x03588e29, 0x003f0739}}, Y: Field{[10]uint32{0x025186d7, 0x01e58f79, 0x019b42fe, 0x024b08e2, 0x02495bc3, 0x032bf2de, 0x03c791e8, 0x0366bdfd, 0x01bf44f7, 0x0005dade}}}, + {X: Field{[10]uint32{0x0294fc56, 0x031c15ae, 0x0091f9e9, 0x00eae5e9, 0x0149482b, 0x03257be1, 0x02a86b21, 0x01a9b1a4, 0x03ff179e, 0x003c7d6f}}, Y: Field{[10]uint32{0x0239e143, 0x009613e2, 0x0209313a, 0x00484318, 0x00670415, 0x030aab9c, 0x00f06205, 0x00ef0fed, 0x03a8a2cd, 0x000e2495}}}, + {X: Field{[10]uint32{0x03793eb9, 0x0113f5aa, 0x03323ac7, 0x00b9d230, 0x012c7aaa, 0x005d6850, 0x02bfef8d, 0x038006e9, 0x001461c3, 0x0026039d}}, Y: Field{[10]uint32{0x0331826c, 0x029d8946, 0x00259c7f, 0x00e98db1, 0x0134cbb3, 0x010a1801, 0x00dde28d, 0x017a0ecf, 0x01ae29e0, 0x001b8df7}}}, + {X: Field{[10]uint32{0x01b1c179, 0x0095fb68, 0x0207f66a, 0x029a9bde, 0x01adb7fa, 0x039b0655, 0x01986dc7, 0x01495c1c, 0x03f7686a, 0x003d4673}}, Y: Field{[10]uint32{0x0255a807, 0x03ae3c82, 0x0297f09e, 0x03b470c7, 0x03174ed4, 0x024ee140, 0x001d008a, 0x017261e5, 0x02b08c76, 0x000fa00f}}}, + {X: Field{[10]uint32{0x028f8061, 0x0389d56e, 0x00eee144, 0x00e443b7, 0x009011d9, 0x02f31730, 0x029bafd0, 0x03faa46e, 0x01ea3851, 0x000b7636}}, Y: Field{[10]uint32{0x01a52ae3, 0x03f81347, 0x00dc1365, 0x02a73a5c, 0x007adfde, 0x03bd4986, 0x00d058b4, 0x011a24df, 0x01afd422, 0x001851fc}}}, + {X: Field{[10]uint32{0x0054a4ae, 0x03f5e005, 0x01b35ede, 0x02335f42, 0x032854f8, 0x02a803d8, 0x02c0c415, 0x00d4dd1e, 0x02620948, 0x00218310}}, Y: Field{[10]uint32{0x033392f4, 0x039b8bb5, 0x01cef95c, 0x028a014d, 0x01d15378, 0x03bbc361, 0x03dfc561, 0x01b49639, 0x022a7d82, 0x0028a9e8}}}, + {X: Field{[10]uint32{0x02d732a6, 0x01eb42eb, 0x00b28ae9, 0x0240b259, 0x01e0697f, 0x0014d482, 0x007d4ea2, 0x00b0f426, 0x00ec17d8, 0x0039dac8}}, Y: Field{[10]uint32{0x03f54bf0, 0x02092499, 0x038f4ad1, 0x00df665f, 0x0132bc11, 0x0311fdc0, 0x037cec9c, 0x0184eff6, 0x00b685f6, 0x00325e11}}}, + {X: Field{[10]uint32{0x0110ab88, 0x0157bf42, 0x007a6504, 0x03378f41, 0x03718ec9, 0x00a905ed, 0x02862b16, 0x0296098d, 0x010d12fb, 0x00099cc7}}, Y: Field{[10]uint32{0x03542192, 0x029c7f26, 0x017143b1, 0x00251ee9, 0x028d2986, 0x001cdb5b, 0x022023bb, 0x0129841b, 0x03b30b46, 0x000f043b}}}, + {X: Field{[10]uint32{0x0224dcde, 0x0177e768, 0x00ea8986, 0x003a2cb6, 0x003fc457, 0x0340536c, 0x03e46f5e, 0x02046a1f, 0x007852db, 0x001432d2}}, Y: Field{[10]uint32{0x0339621d, 0x012f60e2, 0x006f95d5, 0x0234c0f4, 0x00c69db4, 0x00403914, 0x03572a0c, 0x02ba2623, 0x00a87937, 0x002ee122}}}, + {X: Field{[10]uint32{0x03b02a60, 0x03bac87f, 0x03a0e7eb, 0x01372ca2, 0x03064b0c, 0x02cfeb97, 0x00f9fb92, 0x03ff6d9c, 0x013b1d67, 0x003eda51}}, Y: Field{[10]uint32{0x00fd2c39, 0x00c0fba9, 0x024ca41e, 0x02bd1dcd, 0x00d1ba17, 0x0210483e, 0x03b13879, 0x0206d8fa, 0x033692d8, 0x002c3f7b}}}, + {X: Field{[10]uint32{0x03b249b4, 0x01dc1b62, 0x03b9938c, 0x00695b6e, 0x0103f406, 0x028fde13, 0x03aec4fe, 0x00089867, 0x000b4b72, 0x002a3c4a}}, Y: Field{[10]uint32{0x0239b8cc, 0x01c0fd1b, 0x019d4484, 0x02e6f07f, 0x03a97e12, 0x02f9ef8c, 0x032e5014, 0x01644d15, 0x0171ac50, 0x003aeced}}}, + {X: Field{[10]uint32{0x02acaa98, 0x012409db, 0x02bb878b, 0x0306f066, 0x02420f83, 0x00265805, 0x03cb3be3, 0x015e43c5, 0x0209df30, 0x0010a4b3}}, Y: Field{[10]uint32{0x00745d36, 0x02a89207, 0x022f9aa2, 0x016d9d1b, 0x00f32c8d, 0x01186ddb, 0x00f18733, 0x0074760b, 0x014cbf2b, 0x0006c536}}}, + {X: Field{[10]uint32{0x00c9464f, 0x029561e9, 0x0305b8c5, 0x00b25e5a, 0x038e1a06, 0x02720fe3, 0x03967504, 0x01d1fc2d, 0x0177f16f, 0x002b0904}}, Y: Field{[10]uint32{0x0176cf58, 0x028ed764, 0x0341d1cb, 0x0173bd72, 0x03266b69, 0x00c195a1, 0x004eb037, 0x034113b2, 0x01038261, 0x0037415d}}}, + {X: Field{[10]uint32{0x011823d3, 0x0349515d, 0x00e7dd7f, 0x026e1ac6, 0x0278e75c, 0x033dfe11, 0x019d640a, 0x00b695ff, 0x027326bf, 0x001a4bb2}}, Y: Field{[10]uint32{0x01c8e97f, 0x01ff74dc, 0x033478f1, 0x01413fc0, 0x02014c38, 0x02275876, 0x01573202, 0x029e2861, 0x0062548e, 0x0005f5b5}}}, + {X: Field{[10]uint32{0x0310e216, 0x00f316db, 0x01889e82, 0x03534bd6, 0x01d0e129, 0x0300b9bd, 0x02cf946e, 0x01404793, 0x024455ef, 0x003406c6}}, Y: Field{[10]uint32{0x03f91a0f, 0x015ab995, 0x03988345, 0x038ce237, 0x01807879, 0x01927d7f, 0x00f38f21, 0x00fb7755, 0x009e55e3, 0x00212936}}}, + {X: Field{[10]uint32{0x03fc1e9b, 0x0242f1e6, 0x030f12f8, 0x0308e4cc, 0x03fb0798, 0x023ca833, 0x0273a671, 0x02236024, 0x01f296a7, 0x0007ae98}}, Y: Field{[10]uint32{0x01dc9661, 0x01f3574b, 0x03266bc4, 0x03027b84, 0x03505da2, 0x01b12dab, 0x030a6a6b, 0x004118b7, 0x00cbe847, 0x00227ca6}}}, + {X: Field{[10]uint32{0x015980ea, 0x02da35d0, 0x015489c9, 0x032ac69b, 0x010a2300, 0x0087b730, 0x009fe1f7, 0x00c48519, 0x00da9460, 0x0009b7fe}}, Y: Field{[10]uint32{0x00004e60, 0x03685724, 0x037139d3, 0x017e5fd6, 0x033c4a0a, 0x03ee5523, 0x0365862e, 0x02ef7f0e, 0x022155e1, 0x00360992}}}, + {X: Field{[10]uint32{0x023fe676, 0x00ef03cc, 0x01047cee, 0x03729b89, 0x01a3116a, 0x020fa7ac, 0x035f64f2, 0x00608849, 0x0351425e, 0x0013990a}}, Y: Field{[10]uint32{0x01eafbb2, 0x01a288e2, 0x0174247a, 0x0283b49f, 0x0165b9c5, 0x030d7537, 0x011db0ab, 0x011a3125, 0x01659125, 0x003ca2df}}}, + {X: Field{[10]uint32{0x00f448a2, 0x034b869e, 0x02b21e94, 0x0033a709, 0x03b4f370, 0x033a91da, 0x027c97b4, 0x009f6cdf, 0x035cee9a, 0x000d52bf}}, Y: Field{[10]uint32{0x0130fcdb, 0x0027218a, 0x00dd5977, 0x0345b29e, 0x0299b4c4, 0x03da9e53, 0x012d0082, 0x01e7958e, 0x03d1624b, 0x00235a41}}}, + {X: Field{[10]uint32{0x03fbdc3d, 0x002e55a3, 0x039dcd57, 0x03b97d26, 0x01e76995, 0x002d97dd, 0x029f020c, 0x01a7fa3d, 0x00749493, 0x0014a1b4}}, Y: Field{[10]uint32{0x039703ab, 0x020779a1, 0x005e2027, 0x00fac5ac, 0x00e0a23d, 0x01f9bb80, 0x0062a452, 0x03103079, 0x02e53dd2, 0x000957bc}}}, + {X: Field{[10]uint32{0x0268add7, 0x0357d80c, 0x0121c266, 0x02e1bf78, 0x026bddee, 0x02a24d64, 0x00c8ff91, 0x008a666b, 0x0346c86e, 0x002e12a0}}, Y: Field{[10]uint32{0x0320789f, 0x02d00efb, 0x020a3f65, 0x034f62fa, 0x0329f5c8, 0x00791965, 0x0380c878, 0x0008e386, 0x028c79f4, 0x000c45e6}}}, + {X: Field{[10]uint32{0x0112bb94, 0x039e1cb7, 0x0067e0fd, 0x009e408b, 0x031b9dfc, 0x013f1470, 0x018b9f11, 0x02694089, 0x01e663fc, 0x00079ef5}}, Y: Field{[10]uint32{0x002c1b84, 0x01847c83, 0x00b6b927, 0x03f9b647, 0x0107acce, 0x01dfba2d, 0x0250f11e, 0x02c519f4, 0x01b40555, 0x0018a1ea}}}, + {X: Field{[10]uint32{0x03d2bc81, 0x01acab4d, 0x038da9c9, 0x0311535a, 0x029d28ac, 0x0399cb29, 0x01cfde6b, 0x027af9e9, 0x02213728, 0x001fb9a2}}, Y: Field{[10]uint32{0x0170c83e, 0x00f6e131, 0x01dcc8a5, 0x02fadeb3, 0x0303d7dc, 0x02c93808, 0x028aeee9, 0x030f2bca, 0x006400a6, 0x000fb0d0}}}, + {X: Field{[10]uint32{0x00ce570e, 0x0364533e, 0x0033f8d4, 0x01d59f0f, 0x02f3adef, 0x029ae9eb, 0x0107fddd, 0x00efeaa7, 0x010cf4be, 0x000a752c}}, Y: Field{[10]uint32{0x0058bf4c, 0x00e4b384, 0x031f2422, 0x00236fbd, 0x022ec79e, 0x031c1c36, 0x0103c252, 0x03d02903, 0x038596a4, 0x002da9d0}}}, + {X: Field{[10]uint32{0x028c359e, 0x0145b5cc, 0x039c9895, 0x00436989, 0x0350218f, 0x00b0fc14, 0x012a43b4, 0x03591f8c, 0x01d95c5c, 0x001e41f1}}, Y: Field{[10]uint32{0x00d6a625, 0x007261d9, 0x005d4c8f, 0x01e163e6, 0x00268883, 0x037bab06, 0x02bca52f, 0x00a86fca, 0x01e1ec06, 0x001b196a}}}, + {X: Field{[10]uint32{0x019d31b1, 0x0252e365, 0x030adfc9, 0x015714d0, 0x02e5bc2c, 0x031a3f3e, 0x0014fe7b, 0x02ef0cd8, 0x02aece11, 0x003310db}}, Y: Field{[10]uint32{0x029706a2, 0x032492fe, 0x02db3a50, 0x00e59b5f, 0x016b2bd5, 0x01814a61, 0x004e6089, 0x02fd9359, 0x01e7d6ff, 0x00058583}}}, + {X: Field{[10]uint32{0x010ec1f0, 0x006d8805, 0x01bea735, 0x002c052b, 0x021b5fb3, 0x008e77e8, 0x0259d556, 0x010806b9, 0x015d278d, 0x0033c08f}}, Y: Field{[10]uint32{0x00990741, 0x00553935, 0x005749e5, 0x02dc15f5, 0x0034c473, 0x015d736d, 0x031c26e7, 0x0301e9b9, 0x0395ffce, 0x0035801c}}}, + {X: Field{[10]uint32{0x03746a21, 0x00104979, 0x0238d71b, 0x015fa01e, 0x0112b6a2, 0x03151ed8, 0x0135b732, 0x03166f53, 0x0093f718, 0x000068a8}}, Y: Field{[10]uint32{0x00fd4c95, 0x024d51e6, 0x03919f8b, 0x02c1760f, 0x0216c0f8, 0x02491e5b, 0x02cadcc3, 0x028e6868, 0x0142652f, 0x00099d2d}}}, + {X: Field{[10]uint32{0x02b799d7, 0x02496dfb, 0x00215fac, 0x031c1aa1, 0x02f712e4, 0x00893feb, 0x018fdff0, 0x02b145d4, 0x002004b8, 0x0014d3b5}}, Y: Field{[10]uint32{0x03d82155, 0x00204636, 0x01439c07, 0x00bf4933, 0x00fa3078, 0x01db7eba, 0x03e497f5, 0x00667ee7, 0x00523ea6, 0x0000d796}}}, + {X: Field{[10]uint32{0x0200d08e, 0x03613052, 0x0138cf11, 0x01ace898, 0x03e9ba64, 0x03d2c115, 0x038ff188, 0x00c2b9b1, 0x00ad9e6f, 0x00234c79}}, Y: Field{[10]uint32{0x01d5feb2, 0x00e6f353, 0x02996478, 0x03352cc3, 0x03e4b0b1, 0x0112caa1, 0x01e36a48, 0x025b04e8, 0x03c19093, 0x003c36fb}}}, + {X: Field{[10]uint32{0x012b3412, 0x0057f48b, 0x0315954c, 0x027e1adc, 0x03c41843, 0x01bfdfdc, 0x02643791, 0x01016afd, 0x00520267, 0x00205d21}}, Y: Field{[10]uint32{0x00f19bbc, 0x03cfd768, 0x02ba7cb3, 0x03f4a02f, 0x029f6f95, 0x02587d6b, 0x00093899, 0x02d42c05, 0x009b0435, 0x0004f448}}}, + {X: Field{[10]uint32{0x0258aaa3, 0x008e11c1, 0x0212a6cc, 0x01c15fbf, 0x02458422, 0x037ce032, 0x024552be, 0x03a21401, 0x0372e604, 0x002f2a1f}}, Y: Field{[10]uint32{0x039e3d0e, 0x03a0aeb7, 0x0184b54e, 0x02355d4b, 0x03af2653, 0x01dae88f, 0x00123c62, 0x01c495cb, 0x02f528b7, 0x003b9422}}}, + {X: Field{[10]uint32{0x03cd3fb2, 0x016460df, 0x03c52e8c, 0x01184903, 0x01d527e5, 0x01b9e32e, 0x000365cd, 0x014bdb03, 0x02a9a196, 0x000378ae}}, Y: Field{[10]uint32{0x02d38905, 0x01deb287, 0x039bd733, 0x01042a73, 0x01865739, 0x01c59cb7, 0x035f2be5, 0x00cbf532, 0x00ef466c, 0x002bad06}}}, + {X: Field{[10]uint32{0x02acca9e, 0x0010e408, 0x01e5ac00, 0x02af1d99, 0x02556f6c, 0x001dc4d7, 0x00a0591c, 0x01e466d5, 0x01e914df, 0x001ee338}}, Y: Field{[10]uint32{0x00b40628, 0x02b96630, 0x007c2fb8, 0x02a7cff7, 0x00d06a96, 0x010ce295, 0x0100b720, 0x02b52430, 0x03f39cd8, 0x0029828f}}}, + {X: Field{[10]uint32{0x00a50e75, 0x0089e6fb, 0x03d1b040, 0x03f69ab0, 0x034d6d44, 0x00175d85, 0x03c80f82, 0x01d10c66, 0x017913fe, 0x00335c70}}, Y: Field{[10]uint32{0x01419064, 0x02fce31c, 0x01211967, 0x00494a2b, 0x01ae3858, 0x03d8ce4a, 0x001d1a93, 0x00e3407c, 0x03bfcf34, 0x0027c79c}}}, + {X: Field{[10]uint32{0x03ca8fe4, 0x0079151c, 0x02444f4f, 0x003845f6, 0x010619b7, 0x00205abc, 0x0236161d, 0x02370d2e, 0x002e32dc, 0x0010b2b4}}, Y: Field{[10]uint32{0x02e75568, 0x00a2a30d, 0x013c6651, 0x01fb7496, 0x0279e59d, 0x038440c6, 0x030823df, 0x0273fe21, 0x01345a25, 0x0025f2c8}}}, + {X: Field{[10]uint32{0x018ff8c7, 0x00f00f2e, 0x021f6d47, 0x015b22e7, 0x03483317, 0x00a877ea, 0x006644a6, 0x014b18a6, 0x01304f06, 0x00262a24}}, Y: Field{[10]uint32{0x01a824e8, 0x0190003a, 0x00733988, 0x02b5ecaa, 0x00b277e0, 0x00d2b521, 0x0249b3e5, 0x01a40e72, 0x02cecc50, 0x00304c3c}}}, + {X: Field{[10]uint32{0x038a4328, 0x00274bb7, 0x0345522c, 0x00a1af5e, 0x00d7a4a1, 0x021100ec, 0x03d39ff2, 0x018aa9ef, 0x00760847, 0x0008f117}}, Y: Field{[10]uint32{0x03303cde, 0x01e5522e, 0x0350af0d, 0x01d3fc30, 0x02d57cb2, 0x02c350f7, 0x0146dc7c, 0x01bd1f0f, 0x031795c4, 0x003d2adc}}}, + {X: Field{[10]uint32{0x0221d856, 0x0313431a, 0x02d343a6, 0x020c4236, 0x019e6a7b, 0x02f4df0d, 0x01416f2d, 0x0313cbd9, 0x0037d584, 0x0022dc00}}, Y: Field{[10]uint32{0x0365ca35, 0x03f1dab0, 0x00c2becd, 0x03d830c9, 0x025a172c, 0x0245a7e6, 0x00e7d866, 0x0019b53a, 0x00039ed0, 0x0020dc7b}}}, + {X: Field{[10]uint32{0x030f8a7b, 0x025f66a8, 0x00596cdb, 0x03a142ba, 0x00004f4a, 0x020fa060, 0x01d78f20, 0x01044728, 0x00a8d0fb, 0x00369859}}, Y: Field{[10]uint32{0x029a342d, 0x02e9208a, 0x0307fc7a, 0x02871e20, 0x011cc0b5, 0x00304440, 0x03caf4e1, 0x013c5e9d, 0x0063717e, 0x0003e6a1}}}, + {X: Field{[10]uint32{0x035fd6b7, 0x00b51f7a, 0x010fa220, 0x038a7980, 0x02c45924, 0x01b6df5f, 0x029b9c20, 0x02953464, 0x0165a9d1, 0x00127cdf}}, Y: Field{[10]uint32{0x006aa51e, 0x01df79da, 0x03a94ca6, 0x0256c6fb, 0x0201e648, 0x00d03050, 0x010dbba9, 0x0098a5ef, 0x038528f6, 0x003e6e6d}}}, + {X: Field{[10]uint32{0x036efa10, 0x03a714f8, 0x037ccb38, 0x00dcc219, 0x0312d808, 0x0286262a, 0x0256b78b, 0x01668006, 0x0088e268, 0x0021d57c}}, Y: Field{[10]uint32{0x02f7e478, 0x037dd7db, 0x029a9de5, 0x02a7cbda, 0x02434906, 0x0157e0fd, 0x01b4768f, 0x01ea2085, 0x013d1eec, 0x001759c0}}}, + {X: Field{[10]uint32{0x0209045c, 0x03fdddf1, 0x00534069, 0x00d2849f, 0x01a4e6d1, 0x028d7820, 0x03550fc5, 0x029b761c, 0x0396b7ab, 0x000d4c85}}, Y: Field{[10]uint32{0x00a1e832, 0x004059fc, 0x028ba6fe, 0x0072d277, 0x03c5c830, 0x03c7844c, 0x017a6804, 0x00fd3bc6, 0x0343efa9, 0x0011ffc3}}}, + {X: Field{[10]uint32{0x012559b3, 0x03a6b398, 0x0342156f, 0x03b37cac, 0x0283479f, 0x00a08ed0, 0x03ab5ea0, 0x034aef9d, 0x012b644b, 0x000eafb7}}, Y: Field{[10]uint32{0x01e32b06, 0x0216c879, 0x0008f179, 0x03e8cc39, 0x0287bbcc, 0x0078cda6, 0x01824ba1, 0x02e0604c, 0x008e6c13, 0x00109a6c}}}, + {X: Field{[10]uint32{0x00956de8, 0x0263ff1f, 0x03f775be, 0x033249e1, 0x03c14b62, 0x038c9df5, 0x003dc530, 0x0118aaa0, 0x02a22c23, 0x0038c044}}, Y: Field{[10]uint32{0x0098da40, 0x02b4da52, 0x0368a8d2, 0x01b761a4, 0x0199d90f, 0x024f9d60, 0x01f4e0ff, 0x003a2dea, 0x03d0dbb1, 0x003431f8}}}, + {X: Field{[10]uint32{0x033cd06b, 0x01cfd6e5, 0x03762f10, 0x01efc274, 0x03bcdf49, 0x02496440, 0x0147f6cb, 0x012d3cc3, 0x0058439c, 0x00018942}}, Y: Field{[10]uint32{0x0075328e, 0x01adc854, 0x0102ecd2, 0x00c0bf32, 0x0387e4c9, 0x02c390e0, 0x004407af, 0x01096156, 0x01e484ce, 0x000d0dfd}}}, + {X: Field{[10]uint32{0x00f826ea, 0x00e6b5a2, 0x0209bdcb, 0x0143ec5b, 0x0366838d, 0x003a4f8f, 0x0104bc39, 0x0133e93a, 0x0085b8c9, 0x001deb51}}, Y: Field{[10]uint32{0x006001d4, 0x02e6efe0, 0x02b736b0, 0x02d5216e, 0x0334c2ec, 0x0143b0f0, 0x03c84447, 0x021e784d, 0x005a9798, 0x00136f14}}}, + {X: Field{[10]uint32{0x02c0b7db, 0x01e4664e, 0x0066cad5, 0x033eb104, 0x003852b8, 0x02a399f9, 0x01ce3377, 0x018076e7, 0x0292e413, 0x0017734f}}, Y: Field{[10]uint32{0x00e997c9, 0x01d532e9, 0x03f85417, 0x034358d9, 0x0336996e, 0x0309e3df, 0x02760ede, 0x02d0e8c1, 0x008135ef, 0x002b3334}}}, + {X: Field{[10]uint32{0x02ff788d, 0x0309fd72, 0x01737fc8, 0x021457d6, 0x01e65ca3, 0x02e4c614, 0x01d2e6b9, 0x00147f10, 0x023badce, 0x000e8999}}, Y: Field{[10]uint32{0x00abc2bb, 0x017e26e4, 0x00113bab, 0x02e0222a, 0x009b9db0, 0x01c9cb2d, 0x030110e0, 0x03611801, 0x02abaf01, 0x000b591f}}}, + {X: Field{[10]uint32{0x00b1aec0, 0x02c025b9, 0x03ac4b8b, 0x00081419, 0x034e3b0f, 0x000900c7, 0x02fe9c2c, 0x0263f1c4, 0x02b951dc, 0x003d5f33}}, Y: Field{[10]uint32{0x03a1ea25, 0x037cc06d, 0x03bca9c4, 0x01b50e29, 0x03ddb2c6, 0x020be67e, 0x03514557, 0x03afb429, 0x03eb7a8a, 0x001a5824}}}, + {X: Field{[10]uint32{0x029b4a0c, 0x022501af, 0x029b0935, 0x00e8b6ee, 0x02df47c8, 0x0123334d, 0x01bd46c9, 0x01b8502f, 0x0378bca0, 0x002a2691}}, Y: Field{[10]uint32{0x02f366cf, 0x03e7a85b, 0x030d1d23, 0x03b7567c, 0x02939d69, 0x039e079b, 0x0398e2e4, 0x0098b48a, 0x01d69d08, 0x003d0893}}}, + {X: Field{[10]uint32{0x00b962a9, 0x00196e04, 0x01d72adf, 0x00bee8a5, 0x036a3be9, 0x03fc129b, 0x0063f4c7, 0x02091cad, 0x038184fe, 0x00191ce0}}, Y: Field{[10]uint32{0x02ce32de, 0x00dc2680, 0x010bbc97, 0x03e8c900, 0x009ba164, 0x01600134, 0x029d58dd, 0x01ba4d3f, 0x00c0d09f, 0x002f3440}}}, + {X: Field{[10]uint32{0x02dc7774, 0x033fea8e, 0x026866c7, 0x0132bf57, 0x02f7bcaa, 0x027e1c9e, 0x00196bad, 0x0078a0b8, 0x02382126, 0x00129a0e}}, Y: Field{[10]uint32{0x014ff3b0, 0x024cde25, 0x00f202cc, 0x01c6c6e5, 0x01913af3, 0x017d03fb, 0x0337f0b1, 0x026a90e6, 0x00d0ec3d, 0x002d6ae9}}}, + {X: Field{[10]uint32{0x035cb3c7, 0x030b96ae, 0x0296f53c, 0x011b9080, 0x0053fee0, 0x023b8585, 0x02cfd9eb, 0x0333510d, 0x016efdae, 0x00040978}}, Y: Field{[10]uint32{0x00c48f3b, 0x0051003c, 0x011c2253, 0x0360ef58, 0x030704e4, 0x023ce3dc, 0x019b8075, 0x024a8f85, 0x016b67ce, 0x003e01ae}}}, + {X: Field{[10]uint32{0x036650d2, 0x038ab1b6, 0x000e4552, 0x02cd6821, 0x0360039c, 0x03d9ddf1, 0x022217b7, 0x014d4dbf, 0x0009675a, 0x00185276}}, Y: Field{[10]uint32{0x01a96ca9, 0x0151416c, 0x03a11681, 0x03ca78e5, 0x02c72f07, 0x0344bde1, 0x009b03fb, 0x0022a93d, 0x036c9a98, 0x00392b98}}}, + {X: Field{[10]uint32{0x03fec47f, 0x00507530, 0x03047d8c, 0x036d3581, 0x032fff3e, 0x02ec0f74, 0x02e83274, 0x020d0953, 0x01124388, 0x0002e890}}, Y: Field{[10]uint32{0x02d5c35e, 0x0190376e, 0x0366d0aa, 0x025e7430, 0x013717e9, 0x034a3228, 0x026a18de, 0x03f374e3, 0x012329c3, 0x00229afc}}}, + {X: Field{[10]uint32{0x0056a961, 0x001a239e, 0x00993219, 0x014252b5, 0x0035c005, 0x00e2bd54, 0x03aa2595, 0x02b1fa76, 0x00963c7c, 0x0030837c}}, Y: Field{[10]uint32{0x0245d40a, 0x0120d7ec, 0x0033bad8, 0x010aba9f, 0x00fb4f2c, 0x0296242e, 0x038dd8d6, 0x01eba616, 0x015d16cf, 0x001247a6}}}, + {X: Field{[10]uint32{0x03af0c50, 0x01912753, 0x032a50c7, 0x022c6d32, 0x01aac9f3, 0x00f74bb0, 0x02f3dcb9, 0x0135cb67, 0x00ca4dbb, 0x001bd4f6}}, Y: Field{[10]uint32{0x027ae24a, 0x0221a1d3, 0x02e12f78, 0x030c9f2b, 0x0077bbec, 0x0219d4f0, 0x0156de24, 0x02fadc90, 0x002df449, 0x0019e128}}}, + {X: Field{[10]uint32{0x037bdda3, 0x005dc49c, 0x006b3513, 0x003e3b2a, 0x036364ae, 0x0211d5fa, 0x008a0461, 0x023d8147, 0x00bd71a0, 0x00395f9e}}, Y: Field{[10]uint32{0x00385342, 0x025db43d, 0x00e8f116, 0x018ca3b0, 0x0231a1d2, 0x029dd553, 0x0116c82d, 0x017d995c, 0x007e8a53, 0x0028188f}}}, + {X: Field{[10]uint32{0x03ab099a, 0x03a5f13d, 0x03fff285, 0x03869b97, 0x037853e8, 0x01f2d4e9, 0x00abd0ea, 0x025aae78, 0x0329aad4, 0x003d4bdb}}, Y: Field{[10]uint32{0x019d55a3, 0x02588115, 0x028e0b71, 0x00706629, 0x01c36151, 0x01bca657, 0x01de4b76, 0x017a062d, 0x01fc6d5c, 0x000f7df0}}}, + {X: Field{[10]uint32{0x02fb0dc3, 0x020da9cf, 0x01fe259f, 0x02362f59, 0x02ec5cf0, 0x00cf6721, 0x0326268b, 0x01b425be, 0x01fb5c0a, 0x00369d3d}}, Y: Field{[10]uint32{0x00a62c47, 0x0281ea52, 0x03f3effe, 0x00c4d508, 0x018d0ea0, 0x00a947b7, 0x031c8164, 0x00a11df8, 0x0189de5e, 0x001f943a}}}, + {X: Field{[10]uint32{0x0051f4ff, 0x00de9938, 0x02ed8a23, 0x00533f4f, 0x0035d144, 0x02a74b7a, 0x0341d359, 0x01485c3c, 0x02a87bd4, 0x000a8b26}}, Y: Field{[10]uint32{0x0248a1ce, 0x01b1bbe5, 0x00bf8a46, 0x00856746, 0x01496882, 0x022bb27e, 0x01fd7e5d, 0x017da280, 0x01eb9933, 0x002fe7bf}}}, + {X: Field{[10]uint32{0x02022266, 0x02b58ca4, 0x0123b492, 0x03bc7aff, 0x037d13bc, 0x001f8b3c, 0x010da7db, 0x014c531b, 0x00b191dc, 0x000a8d10}}, Y: Field{[10]uint32{0x02ae2b40, 0x0398b4f8, 0x02fc6dd1, 0x03c8b0d3, 0x03e4c1e9, 0x021c1e51, 0x02fda24e, 0x028080bc, 0x00f5c993, 0x002f7b09}}}, + {X: Field{[10]uint32{0x010942a2, 0x01004278, 0x0081c287, 0x03ab54f4, 0x000e0acc, 0x01551140, 0x0136e8bd, 0x00dab7eb, 0x01743d1d, 0x0028ea6f}}, Y: Field{[10]uint32{0x00794ca0, 0x02ccd3fb, 0x0016b66d, 0x0013fdd7, 0x022cb711, 0x0286d305, 0x01ab1fce, 0x039f637b, 0x02cff8ca, 0x00330cf7}}}, + {X: Field{[10]uint32{0x00804950, 0x0254f462, 0x0170d308, 0x02b0ac23, 0x0380db7e, 0x01fd361f, 0x03dc7247, 0x03c84824, 0x008f70a2, 0x0016e0f5}}, Y: Field{[10]uint32{0x0248b545, 0x0352c510, 0x039c3030, 0x02d1fb54, 0x01982ecd, 0x0243f313, 0x01368d76, 0x019b0b84, 0x0088a10c, 0x003de301}}}, + {X: Field{[10]uint32{0x03e9736a, 0x0035dec2, 0x02c29414, 0x0258f1bf, 0x02d901ab, 0x021c76e3, 0x039e210a, 0x01288800, 0x02a56e3e, 0x003756d1}}, Y: Field{[10]uint32{0x0021d46b, 0x011f04f5, 0x008ceae6, 0x03be1e61, 0x009e7136, 0x0334d77e, 0x0052268c, 0x0116b0d7, 0x02baebdd, 0x00366ddb}}}, + {X: Field{[10]uint32{0x0361a6d3, 0x031b72cf, 0x00f6462c, 0x007c0de6, 0x03d1ff78, 0x00885025, 0x036bc5b2, 0x01849d88, 0x035a2548, 0x000bdd36}}, Y: Field{[10]uint32{0x03149c1c, 0x020f0254, 0x0248eca9, 0x011eb224, 0x03646471, 0x00c0536c, 0x01b868ea, 0x01b4bea4, 0x01ed256f, 0x002db58d}}}, + {X: Field{[10]uint32{0x03ab2e09, 0x016377c8, 0x030bec50, 0x009b7f92, 0x02119bff, 0x0378722e, 0x0240b8bf, 0x024e6961, 0x00c41f7c, 0x000cab70}}, Y: Field{[10]uint32{0x0146ae3f, 0x02ec374e, 0x0229366b, 0x020ce8d6, 0x0340beed, 0x02807645, 0x017772d2, 0x02ca5f5f, 0x02487f0b, 0x0033cc5c}}}, + {X: Field{[10]uint32{0x03c6cdce, 0x027cc061, 0x02ae936f, 0x02d6172c, 0x014e336c, 0x01d301fb, 0x02a152ed, 0x00b6a09c, 0x00a70017, 0x0013f94f}}, Y: Field{[10]uint32{0x01e3a8ce, 0x011ba620, 0x0084327e, 0x01c162e1, 0x02baf428, 0x00595e31, 0x00c29869, 0x00705887, 0x01c4bd71, 0x00207db4}}}, + {X: Field{[10]uint32{0x03b2569f, 0x02152367, 0x018ae63f, 0x001974f9, 0x023b08dc, 0x0137fb66, 0x02f316eb, 0x028a99c0, 0x00f5577f, 0x0018064d}}, Y: Field{[10]uint32{0x00f714cc, 0x001d340c, 0x03954362, 0x0243dab3, 0x0255e196, 0x00ec7c77, 0x0396f689, 0x03f5fed7, 0x00824360, 0x001b7df6}}}, + {X: Field{[10]uint32{0x0279d321, 0x00f03dea, 0x03129817, 0x0319e7e8, 0x03e1bec3, 0x03a7768b, 0x0092ee52, 0x0201b191, 0x03088ff4, 0x0001e769}}, Y: Field{[10]uint32{0x017f9a47, 0x02afa2c0, 0x0047ff90, 0x012ec382, 0x0344be73, 0x0348156b, 0x0167e8ab, 0x022128d4, 0x022976f2, 0x000ac7b2}}}, + {X: Field{[10]uint32{0x01262974, 0x0227739e, 0x011867e5, 0x032360e6, 0x015b8d4f, 0x02a2fda4, 0x0208b51c, 0x00a672f0, 0x0209c39f, 0x00180ae0}}, Y: Field{[10]uint32{0x027f5555, 0x03367695, 0x035f2267, 0x0016be43, 0x00a5ed1f, 0x01e46976, 0x02c43f94, 0x032a0daa, 0x00da05d7, 0x0003e2db}}}, + {X: Field{[10]uint32{0x020e53d1, 0x0144547f, 0x00232752, 0x001703e8, 0x010ff14c, 0x01399920, 0x02991e48, 0x0229b55c, 0x0368868a, 0x0015e93c}}, Y: Field{[10]uint32{0x023a0c6d, 0x03e95e04, 0x01a9efa1, 0x028ea8f9, 0x0353d52e, 0x03a593cb, 0x00e17869, 0x026e0cda, 0x007c5bc2, 0x00035b32}}}, + {X: Field{[10]uint32{0x0206db2a, 0x0122de1a, 0x02b54435, 0x00f96f4c, 0x02459906, 0x02c04b35, 0x004c5ae2, 0x03c441c3, 0x00f0ae9d, 0x0013e6d2}}, Y: Field{[10]uint32{0x015ea016, 0x03b7b5f7, 0x02a157bd, 0x0086fc62, 0x02980cd6, 0x01bf90ab, 0x03563ebf, 0x031e3d9b, 0x00fe3caf, 0x003569e8}}}, + {X: Field{[10]uint32{0x005e7375, 0x014ed7db, 0x007085a0, 0x02b4d778, 0x01e1910a, 0x022ed98f, 0x02615893, 0x00d27d11, 0x03084b11, 0x00391a94}}, Y: Field{[10]uint32{0x01183ce9, 0x029f4cb8, 0x03c479e1, 0x00afe9af, 0x02cb8c3d, 0x03c1eb38, 0x03923be9, 0x018cb7ef, 0x02889583, 0x003691b6}}}, + {X: Field{[10]uint32{0x01c071ea, 0x022e5880, 0x0267415c, 0x0358ad82, 0x00d62f2a, 0x03249410, 0x03e64de3, 0x005878c8, 0x0366b94b, 0x000d90f5}}, Y: Field{[10]uint32{0x0316fa98, 0x03c6d6e7, 0x01a967af, 0x013e0f4d, 0x0080835d, 0x00083db5, 0x029dcffa, 0x0278176c, 0x02f11f2b, 0x003ebda6}}}, + {X: Field{[10]uint32{0x03497dca, 0x03c6c6ef, 0x01478f6f, 0x01edfe8c, 0x00e6bea5, 0x01138177, 0x03e1b485, 0x0185486e, 0x02940c02, 0x00259da5}}, Y: Field{[10]uint32{0x03e30b03, 0x0209c0ac, 0x0293c407, 0x004b1d64, 0x038210fd, 0x0365f023, 0x033b033b, 0x02b85259, 0x02fd7d0d, 0x0013ad69}}}, + {X: Field{[10]uint32{0x01a24d07, 0x019f9996, 0x00ef65c8, 0x029bd04d, 0x007f80fd, 0x0104438a, 0x03e0ff4b, 0x0264c626, 0x01ef2c47, 0x0000b907}}, Y: Field{[10]uint32{0x0074c313, 0x0214c772, 0x01f52015, 0x03045d10, 0x0269bde3, 0x015bfece, 0x03a1f50e, 0x022c4a8e, 0x017bb838, 0x0009a853}}}, + {X: Field{[10]uint32{0x0003c29b, 0x00a1316b, 0x0037db7f, 0x03c2152a, 0x00db94cb, 0x007ad8f9, 0x004fbf77, 0x03f83a69, 0x001af6ea, 0x003ce765}}, Y: Field{[10]uint32{0x00bd7b73, 0x018b9ce3, 0x00183d8b, 0x00d300ec, 0x0072cd59, 0x001f812c, 0x001f8b55, 0x01344889, 0x03700dac, 0x0007ffb5}}}, + {X: Field{[10]uint32{0x00136419, 0x01d91254, 0x03d1c595, 0x0114a005, 0x011cdac0, 0x00b64189, 0x011f8dcc, 0x02fba824, 0x01344576, 0x00242403}}, Y: Field{[10]uint32{0x00161ad6, 0x00255a92, 0x01666b0c, 0x039bacd3, 0x001457ce, 0x028acb17, 0x00444980, 0x02040b68, 0x03bb2a33, 0x001834e2}}}, + {X: Field{[10]uint32{0x00ac2e06, 0x006944f6, 0x0109ee3e, 0x038e5ed9, 0x0244a523, 0x0074ade0, 0x0344226f, 0x03d298b9, 0x02271007, 0x000e9791}}, Y: Field{[10]uint32{0x00202449, 0x0089aeba, 0x01d90f75, 0x03f95ede, 0x010bcdfc, 0x029057cd, 0x016dee2f, 0x03f0fc09, 0x03c1074c, 0x00143c07}}}, + {X: Field{[10]uint32{0x03e24355, 0x02db0fc4, 0x02b87a06, 0x0162a3c3, 0x02b13ac2, 0x01bdb91a, 0x025492ef, 0x0047907a, 0x0256f6d7, 0x003d9ba8}}, Y: Field{[10]uint32{0x02243841, 0x0000c1c9, 0x010b57fa, 0x0281bcff, 0x028f32a2, 0x0303db4a, 0x02c24014, 0x03a9b21f, 0x00470980, 0x003ee287}}}, + {X: Field{[10]uint32{0x03038fa0, 0x009602f4, 0x022a85c6, 0x0216accd, 0x00c946a4, 0x031d0db4, 0x036d4ed6, 0x01b333ee, 0x012019a1, 0x0032b681}}, Y: Field{[10]uint32{0x03d32ae6, 0x03cb4841, 0x032032b5, 0x01c42bc3, 0x03421de9, 0x006b9ce4, 0x03069639, 0x010c92b1, 0x000a3480, 0x00389265}}}, + {X: Field{[10]uint32{0x03759cf1, 0x039d7eb2, 0x037122c4, 0x004d70b6, 0x02ce2084, 0x03760c2c, 0x03d51929, 0x01ca565a, 0x035e820b, 0x00345bd6}}, Y: Field{[10]uint32{0x02448ed8, 0x038de11a, 0x0349ce61, 0x021788a1, 0x036ecdd5, 0x01781451, 0x01363807, 0x02f35f77, 0x0084cfbe, 0x001c3b6c}}}, + {X: Field{[10]uint32{0x01f71535, 0x01444d35, 0x009a4847, 0x03275365, 0x013dc31a, 0x03199bcc, 0x02e51498, 0x02b8372d, 0x028ddc6b, 0x002ef333}}, Y: Field{[10]uint32{0x03f91eed, 0x03396b48, 0x03a6ea23, 0x01a02627, 0x01c8941f, 0x0239eefd, 0x031b4796, 0x024af949, 0x02fc63ff, 0x001369dc}}}, + {X: Field{[10]uint32{0x014243fe, 0x001854bb, 0x032915f6, 0x03e3a0da, 0x02e7d5d2, 0x01a087ae, 0x01e940d0, 0x01d710c9, 0x00f5cd8b, 0x001457ca}}, Y: Field{[10]uint32{0x03668b47, 0x00bc7118, 0x032a24ba, 0x0209bdf6, 0x00e1855a, 0x0208a496, 0x0209f466, 0x02e3f852, 0x03ccf5d2, 0x00284c50}}}, + {X: Field{[10]uint32{0x01233837, 0x03b61148, 0x03f79df6, 0x02d6e3f5, 0x0068d356, 0x034e049e, 0x011ed6f9, 0x0118b61a, 0x02aea78c, 0x002f4bd1}}, Y: Field{[10]uint32{0x01c4af11, 0x02f5f21e, 0x00324b92, 0x02b98aae, 0x0284ddd9, 0x035f5bf8, 0x0332f70e, 0x0200fdfa, 0x02d3f3cc, 0x0023d917}}}, + {X: Field{[10]uint32{0x01e37dfa, 0x01f5977e, 0x0313347d, 0x034e4b83, 0x0004f8d7, 0x00046914, 0x0210b512, 0x008489a7, 0x013cc3d3, 0x00215dbc}}, Y: Field{[10]uint32{0x028b1a4f, 0x027640fd, 0x021958d1, 0x00a116d9, 0x0386ff90, 0x027bb7a2, 0x009eb8c1, 0x0384c48c, 0x00483fa0, 0x003eefc8}}}, + {X: Field{[10]uint32{0x0309db4a, 0x02327ce0, 0x0341a23b, 0x03cb4c73, 0x01763a83, 0x03c8d87f, 0x03f262ab, 0x01391f5c, 0x02918fdf, 0x001c2f87}}, Y: Field{[10]uint32{0x028bc573, 0x00fdc210, 0x0318829f, 0x032770fb, 0x03a1897a, 0x0224a50e, 0x013fa488, 0x01bbd030, 0x0175e424, 0x0020be01}}}, + {X: Field{[10]uint32{0x0341180f, 0x0193a452, 0x02361c80, 0x026848c4, 0x01017352, 0x028d4ebe, 0x0354a461, 0x01ad4e6f, 0x013d1d58, 0x002ee282}}, Y: Field{[10]uint32{0x03478269, 0x00d3616b, 0x0165e723, 0x01034887, 0x02287075, 0x033d779f, 0x028d66bc, 0x02894735, 0x02d78456, 0x00118383}}}, + {X: Field{[10]uint32{0x005c2e69, 0x0128492f, 0x018606dc, 0x0211d530, 0x027b976a, 0x001c7e87, 0x03306287, 0x006533d2, 0x024f34d9, 0x001e05eb}}, Y: Field{[10]uint32{0x00d55cbc, 0x02f9774b, 0x02d7b481, 0x00303e12, 0x006afe1c, 0x013e2cd0, 0x02ed346e, 0x02c6d6f1, 0x0056c4e3, 0x00097d3b}}}, + {X: Field{[10]uint32{0x0366abcc, 0x03fb446f, 0x009a5bcc, 0x03c49cd3, 0x03e72af5, 0x00396ed7, 0x02ed8e2a, 0x0167e9bf, 0x00dc411f, 0x002171d8}}, Y: Field{[10]uint32{0x03cb8cc4, 0x019ac9b2, 0x028ad106, 0x00399403, 0x0389a891, 0x00e99f96, 0x00f12482, 0x0271c6fc, 0x01b0b57c, 0x0024960f}}}, + {X: Field{[10]uint32{0x015086c3, 0x0206af17, 0x0179ad4c, 0x008d1faa, 0x03d9ee71, 0x0079cdde, 0x00739e3b, 0x01d8bfcb, 0x01354d9d, 0x00083603}}, Y: Field{[10]uint32{0x02f0efe5, 0x01077dd8, 0x01cf7489, 0x01ac6c89, 0x010ef6ed, 0x03c4d46d, 0x0123b7f1, 0x0299d7a0, 0x017b8017, 0x001b8647}}}, + {X: Field{[10]uint32{0x01ba5657, 0x0370f83f, 0x00fde086, 0x03f25c24, 0x00ec26ce, 0x004a2601, 0x036d9c8d, 0x0312c197, 0x022d43f2, 0x000cc1a4}}, Y: Field{[10]uint32{0x03c7efc4, 0x01970c04, 0x00d881b8, 0x01067e1f, 0x0186f0e9, 0x02871019, 0x039f76ef, 0x035eb1c1, 0x009fc93d, 0x00262a33}}}, + {X: Field{[10]uint32{0x032fb001, 0x0379b1ce, 0x01fc18ac, 0x02b02c21, 0x018a1b9a, 0x02488da0, 0x00f77033, 0x01fc4910, 0x019754d3, 0x002cd71d}}, Y: Field{[10]uint32{0x03cd649d, 0x03dadd44, 0x01660a7a, 0x02d1be4f, 0x022ea789, 0x037d65a3, 0x0058ffb0, 0x02121657, 0x039069b0, 0x00001212}}}, + {X: Field{[10]uint32{0x034e1f33, 0x03c25d51, 0x0158786e, 0x03e3a43f, 0x0205c647, 0x01648ac6, 0x009d0104, 0x030c0db3, 0x03537f8b, 0x0026f506}}, Y: Field{[10]uint32{0x030274ac, 0x0340ef2f, 0x013aec25, 0x01da3480, 0x018b8667, 0x03fce269, 0x0086bfe1, 0x03849769, 0x03f655ec, 0x001642be}}}, + {X: Field{[10]uint32{0x001ded42, 0x023c5815, 0x0020e527, 0x00e9cd65, 0x036950d9, 0x00e38372, 0x0289703a, 0x02bbc2f3, 0x032ca9b3, 0x000a8e99}}, Y: Field{[10]uint32{0x02693d8e, 0x03cee270, 0x02a5fc6a, 0x0033e22b, 0x02c95f85, 0x02d8aeac, 0x008ebef6, 0x00e0f6e4, 0x00b613f3, 0x00130ea5}}}, + {X: Field{[10]uint32{0x00f74d3d, 0x0250e096, 0x01bf6937, 0x017c5b71, 0x00c8db94, 0x014e01b7, 0x01f38003, 0x0253e353, 0x02f20a2d, 0x000c6e9a}}, Y: Field{[10]uint32{0x0329df5a, 0x008e3308, 0x03f4a236, 0x020b1509, 0x01fc1e6a, 0x0180d131, 0x01d915ef, 0x03ac72e9, 0x0102b290, 0x002b4677}}}, + {X: Field{[10]uint32{0x00869720, 0x004a54af, 0x01bb05bb, 0x0147a712, 0x00587c02, 0x02fd12a6, 0x030f9b8e, 0x0053c177, 0x01bd74b0, 0x003e8866}}, Y: Field{[10]uint32{0x0163f45e, 0x00b484ec, 0x0231a66d, 0x03bac7d5, 0x03041ab6, 0x018387a6, 0x035c4838, 0x03d7d2c3, 0x017d6efd, 0x0010ca24}}}, + {X: Field{[10]uint32{0x03e22d52, 0x011a6a62, 0x0199f30a, 0x000b8eff, 0x0108aaac, 0x024aad8f, 0x00f28476, 0x00f03d73, 0x0046c7f5, 0x00105ee4}}, Y: Field{[10]uint32{0x023b82c0, 0x0175a921, 0x008e0d49, 0x02a0ef6c, 0x007aede9, 0x005c1b80, 0x036eae69, 0x025e237f, 0x02655f30, 0x001e3057}}}, + {X: Field{[10]uint32{0x0318bc2a, 0x0390f55b, 0x00964f33, 0x026005c5, 0x026158f4, 0x01e9a7fe, 0x00e6eca6, 0x007f6228, 0x01f247d5, 0x0015ab24}}, Y: Field{[10]uint32{0x010680c7, 0x02c699b7, 0x02740c54, 0x02b89b9e, 0x00429bee, 0x01ee0719, 0x03c518b3, 0x00692dc5, 0x015c9e1b, 0x000d46df}}}, + {X: Field{[10]uint32{0x03215f8a, 0x001f594d, 0x00250685, 0x01c04324, 0x01e164ae, 0x002eafb2, 0x02d835aa, 0x01fbcc54, 0x02f88330, 0x002bae8c}}, Y: Field{[10]uint32{0x002c4e21, 0x038aba16, 0x0040fdcd, 0x031a9073, 0x037ce7e3, 0x0333be10, 0x03165577, 0x017cb9bf, 0x013935cf, 0x00235d1f}}}, + {X: Field{[10]uint32{0x01db5813, 0x035a0748, 0x03e63d47, 0x03ac3936, 0x0379ee10, 0x015bb411, 0x03d6bcc2, 0x00325da4, 0x02199af0, 0x0010b1ec}}, Y: Field{[10]uint32{0x0219378f, 0x012196ec, 0x03c75c3c, 0x01747f3d, 0x02a5fd87, 0x0225610c, 0x0244a4df, 0x031f2cb3, 0x03081fb1, 0x002857ed}}}, + {X: Field{[10]uint32{0x024e5d98, 0x02845b68, 0x01e2c36c, 0x0288270e, 0x0225e0db, 0x006f357f, 0x03fe19d0, 0x0196a222, 0x0297ecf3, 0x0010cdec}}, Y: Field{[10]uint32{0x0242b7ad, 0x01056ec8, 0x01722915, 0x022f2736, 0x0328d1ef, 0x0381b6dc, 0x00833485, 0x007b6f2f, 0x03abc654, 0x001271c8}}}, + {X: Field{[10]uint32{0x03f857bf, 0x0066876d, 0x02f84a25, 0x00949f93, 0x00aeefbf, 0x02e12c94, 0x028af0ce, 0x024cb3a5, 0x00761481, 0x00062663}}, Y: Field{[10]uint32{0x02c97fa2, 0x03204a09, 0x01ba39b7, 0x015342fe, 0x00911330, 0x03cca274, 0x02c9ae77, 0x02110d72, 0x00856451, 0x001157af}}}, + {X: Field{[10]uint32{0x02a49b2b, 0x02e256c1, 0x0188e69c, 0x01907995, 0x0387767b, 0x02ff62d3, 0x010516f1, 0x015ca816, 0x0320fa24, 0x001931d8}}, Y: Field{[10]uint32{0x00b9603f, 0x03fa33dd, 0x01395d39, 0x022a1e67, 0x0178366c, 0x01a097b0, 0x03ae76f8, 0x01425680, 0x02a5c479, 0x00028e68}}}, + {X: Field{[10]uint32{0x012b0ad7, 0x034efd20, 0x004e1ebb, 0x028ceced, 0x02dea917, 0x031bc4a9, 0x03a5f2d3, 0x02e1f296, 0x0005e35e, 0x0010595d}}, Y: Field{[10]uint32{0x01ff815d, 0x02375be5, 0x034916b6, 0x0170825a, 0x034d0ed7, 0x02b732d4, 0x037fe787, 0x0114ad15, 0x01ae36f1, 0x0023885a}}}, + {X: Field{[10]uint32{0x00391f6e, 0x01b8c370, 0x00cb68b7, 0x00440b04, 0x017bfd4a, 0x03d298c5, 0x02110c80, 0x012e245b, 0x03a3768a, 0x002a8803}}, Y: Field{[10]uint32{0x0184695b, 0x00d4d3a9, 0x02fde7fb, 0x0351a416, 0x00c49b79, 0x01f4662a, 0x02c898bd, 0x0055577f, 0x015928b2, 0x00159ef6}}}, + {X: Field{[10]uint32{0x03131599, 0x03e6ee9d, 0x00966555, 0x035a7961, 0x03eb529b, 0x02327188, 0x003ba48c, 0x00bd52e1, 0x0328841d, 0x001ea9e0}}, Y: Field{[10]uint32{0x01f698ed, 0x0112bcda, 0x003ba1bb, 0x0118a696, 0x01327112, 0x0138bdbc, 0x01a7e7a6, 0x011e2c93, 0x0315e4b8, 0x001ad289}}}, + {X: Field{[10]uint32{0x016969a1, 0x00d11d4e, 0x01fdfdae, 0x013d92ef, 0x0248446b, 0x01e3eeef, 0x019234fc, 0x019ffc11, 0x03bd6a27, 0x00252c69}}, Y: Field{[10]uint32{0x011cc33d, 0x03a233e6, 0x0054fdf1, 0x01e3a2e2, 0x02e77e21, 0x02e6a907, 0x029320a8, 0x02a1c774, 0x01ef2273, 0x0023cc19}}}, + {X: Field{[10]uint32{0x0126573a, 0x036633b5, 0x0071035f, 0x01c4de8d, 0x005407df, 0x01a07830, 0x00c8cb27, 0x03afd4a5, 0x03a71bfe, 0x001ae55e}}, Y: Field{[10]uint32{0x022724a0, 0x03f6e21e, 0x037f4583, 0x003b0297, 0x0235c6df, 0x03bed424, 0x01cd4ff6, 0x0214f179, 0x008d3fc1, 0x0019f920}}}, + {X: Field{[10]uint32{0x03717f7f, 0x029a4590, 0x01cb2b8a, 0x02da02f6, 0x03f9a6df, 0x02c7f2ca, 0x0293892a, 0x010400ef, 0x03300ea3, 0x0022c9d0}}, Y: Field{[10]uint32{0x0198db90, 0x02bebc5e, 0x00da3c99, 0x02a82727, 0x014ed141, 0x0271c4e2, 0x027f8284, 0x01620f98, 0x02bb7785, 0x00153e8a}}}, + {X: Field{[10]uint32{0x0358db05, 0x0117899e, 0x012e75d1, 0x01c92668, 0x033b6863, 0x01eb1997, 0x01274de7, 0x008ce524, 0x039b6736, 0x0034fd93}}, Y: Field{[10]uint32{0x01a52449, 0x00a81432, 0x0310e5c8, 0x01410060, 0x009bea58, 0x02267eaa, 0x01284f43, 0x0057d051, 0x02c852bd, 0x00301845}}}, + {X: Field{[10]uint32{0x0237ba79, 0x03ad557c, 0x00d4bc4a, 0x007a006d, 0x02870d07, 0x0243de57, 0x03b92803, 0x010ca406, 0x02f8ce0e, 0x00066249}}, Y: Field{[10]uint32{0x02b3d34e, 0x00fc81b4, 0x01d76a83, 0x03411523, 0x035d6c10, 0x00373c43, 0x027658fa, 0x001f9d78, 0x03d95b8d, 0x001d8496}}}, + {X: Field{[10]uint32{0x0301a13f, 0x032962f3, 0x003099ad, 0x03f1be1e, 0x00ee4358, 0x03770961, 0x0346cfb6, 0x014be0e5, 0x014d5951, 0x000006ef}}, Y: Field{[10]uint32{0x038d7733, 0x01fa7f37, 0x016e0b58, 0x03f13c21, 0x03ebdc70, 0x03797af7, 0x003cdfe3, 0x0317a9c2, 0x00deccea, 0x00063d4d}}}, + {X: Field{[10]uint32{0x01a3132a, 0x00b89d7d, 0x0398c131, 0x01fc876c, 0x03005245, 0x008089a4, 0x00b551f5, 0x0249c8df, 0x0345b263, 0x00221cdf}}, Y: Field{[10]uint32{0x00c496ed, 0x0285e778, 0x020290b2, 0x03fb256a, 0x02e3e61c, 0x006e8317, 0x01a7b222, 0x0387a12c, 0x032c2895, 0x001e6959}}}, + {X: Field{[10]uint32{0x00cb1e83, 0x03852ff3, 0x02252004, 0x01f91b9e, 0x012d6849, 0x03f873ea, 0x00ca35e8, 0x01ddccd3, 0x018b1f27, 0x0032fcf8}}, Y: Field{[10]uint32{0x02bc3f99, 0x03d72521, 0x029a401f, 0x01c249ae, 0x007b91f7, 0x03c91d23, 0x01d242a5, 0x0115b0f2, 0x039565bd, 0x0036c030}}}, + {X: Field{[10]uint32{0x03022f70, 0x00699071, 0x0093c40b, 0x00809c82, 0x008ab65b, 0x00aa4ea6, 0x01c88467, 0x03beb97e, 0x030cf186, 0x00201c3b}}, Y: Field{[10]uint32{0x027bd9e5, 0x02762044, 0x018caa24, 0x014e9d17, 0x00cc85c8, 0x021ff60e, 0x0024cf5a, 0x01a8151a, 0x01b04694, 0x0036a601}}}, + {X: Field{[10]uint32{0x03f71eab, 0x021a6030, 0x03e21902, 0x02d88490, 0x035c57dc, 0x022dbf88, 0x00c50640, 0x0176efa1, 0x004b8fa4, 0x002b2be6}}, Y: Field{[10]uint32{0x00eb278e, 0x02cef44b, 0x010b5d1d, 0x0077c5f7, 0x03801b8c, 0x02eb8a41, 0x004dfb0b, 0x03e8bbc5, 0x00168259, 0x0011bd3b}}}, + {X: Field{[10]uint32{0x03fdc965, 0x036a5c7e, 0x000994ee, 0x01494a91, 0x01e89162, 0x015f8f49, 0x01e8a32a, 0x03b3a9cd, 0x020591f9, 0x0000a24e}}, Y: Field{[10]uint32{0x03cfbb6a, 0x02c5681e, 0x012a18c3, 0x03082abc, 0x01372aa6, 0x03edf495, 0x02b5186e, 0x02c48c04, 0x014191e4, 0x001ba8a6}}}, + {X: Field{[10]uint32{0x02be951d, 0x016d9130, 0x01b39dc0, 0x002963c4, 0x00cfccab, 0x03b44b7c, 0x0126e285, 0x032d8272, 0x023168f0, 0x001925d1}}, Y: Field{[10]uint32{0x01eafb7c, 0x0012268c, 0x03406016, 0x02a705e2, 0x03d432b5, 0x03c94271, 0x004bb219, 0x0217890d, 0x001b2fa8, 0x003a9d06}}}, + {X: Field{[10]uint32{0x021faeef, 0x03c3a22e, 0x006e2d1b, 0x007174ea, 0x01091862, 0x0260440e, 0x014f7c20, 0x025322cb, 0x003e5133, 0x002e4e11}}, Y: Field{[10]uint32{0x0353fc85, 0x021f6bf0, 0x01be0963, 0x03226d9a, 0x00c52473, 0x017fe505, 0x0384f384, 0x02190941, 0x02a8c7d9, 0x002bd1fc}}}, + {X: Field{[10]uint32{0x012a5320, 0x01b6b167, 0x03b8d42f, 0x02333da6, 0x0124f475, 0x01d8d1ae, 0x00fd4a78, 0x03d43a7e, 0x0245ad10, 0x002f47b8}}, Y: Field{[10]uint32{0x00039605, 0x021cd238, 0x01518af7, 0x010d92ce, 0x00134ce4, 0x013ffa4b, 0x02477ac7, 0x02235709, 0x023e069d, 0x001ddb8b}}}, + {X: Field{[10]uint32{0x0260650f, 0x0277d0f1, 0x006a97d4, 0x00819e92, 0x036d8e13, 0x009e763e, 0x027dc054, 0x02157c5f, 0x0068805e, 0x00032dfb}}, Y: Field{[10]uint32{0x029e903c, 0x0393f608, 0x01b5a91c, 0x00e5b496, 0x01b12d73, 0x01c5497f, 0x03302eb0, 0x01040c47, 0x00b284c0, 0x003d41e4}}}, + {X: Field{[10]uint32{0x0330cf83, 0x004846ea, 0x02a15e1c, 0x0057ef78, 0x031968c6, 0x03213369, 0x0222a1c7, 0x02ed68a7, 0x037e0aff, 0x003bc1f3}}, Y: Field{[10]uint32{0x00ef574f, 0x0310971c, 0x01979815, 0x01789616, 0x002ca556, 0x013203cb, 0x03fc2fee, 0x00c35040, 0x02c94226, 0x00263d29}}}, + {X: Field{[10]uint32{0x027b8fc6, 0x0309ab4f, 0x027814ee, 0x01902189, 0x0113dc50, 0x0045003c, 0x00e4ca0d, 0x03316733, 0x01484d7f, 0x0013ff06}}, Y: Field{[10]uint32{0x03b75aa9, 0x013961df, 0x0266961b, 0x038e4dfb, 0x02d94b65, 0x03721fc4, 0x01ac1075, 0x00f60f2d, 0x020798ff, 0x002fa7af}}}, + {X: Field{[10]uint32{0x01d18396, 0x035a2f18, 0x01b63b4e, 0x01acb693, 0x00fad1ad, 0x0318dc6c, 0x00df0efa, 0x03524ee3, 0x0373339e, 0x0032f754}}, Y: Field{[10]uint32{0x02bdb13f, 0x02fe86b5, 0x025fac77, 0x035f200f, 0x003784a7, 0x01c2704c, 0x0138b6ff, 0x00b51c7d, 0x0087c321, 0x00149f79}}}, + {X: Field{[10]uint32{0x027cb5d2, 0x01efd6f1, 0x01fed65e, 0x02838c0d, 0x014e650a, 0x03800fe6, 0x03f6b065, 0x035fa76d, 0x032bd8a1, 0x003a80d6}}, Y: Field{[10]uint32{0x003761c4, 0x01918223, 0x00edddbc, 0x0258a8ec, 0x032cd57e, 0x03fa071a, 0x0372e91a, 0x03d22219, 0x03702219, 0x002bb2d0}}}, + {X: Field{[10]uint32{0x01f8db89, 0x02a3bd66, 0x010cd99b, 0x03da407b, 0x02911648, 0x00b50ff6, 0x029dda6b, 0x00902b5b, 0x03d6c1d6, 0x00378693}}, Y: Field{[10]uint32{0x004da03e, 0x0088faa2, 0x012cd3a4, 0x02c4150b, 0x02f85f90, 0x01c78b98, 0x00a60853, 0x03fd0747, 0x00d161c0, 0x003bff25}}}, + {X: Field{[10]uint32{0x02a076ed, 0x033d6df9, 0x037f0e58, 0x022bc03e, 0x00d75e11, 0x02f3ffaf, 0x02157878, 0x01fb5b84, 0x0141e8d8, 0x000b9910}}, Y: Field{[10]uint32{0x0334b8d2, 0x03a03ff2, 0x005b7320, 0x0037d97e, 0x02b45c24, 0x009b48b0, 0x00a70110, 0x018b61ae, 0x00ddf2ba, 0x0012aa16}}}, + {X: Field{[10]uint32{0x01b73a33, 0x0220ecdc, 0x01c3e956, 0x01e4b49d, 0x0247ff88, 0x023cb4a3, 0x03b78ad0, 0x02e1e243, 0x006a90d6, 0x000e110e}}, Y: Field{[10]uint32{0x0365cd18, 0x03f51d2c, 0x0157c714, 0x015fc5f3, 0x01ff2845, 0x032a3ba2, 0x036bde12, 0x012701d7, 0x03121a81, 0x003dfd77}}}, + {X: Field{[10]uint32{0x00358e42, 0x03a5bc1d, 0x03ae8ff7, 0x0382eacb, 0x01bde185, 0x02ba080f, 0x0218cd89, 0x034d88ad, 0x03321b91, 0x00387fa6}}, Y: Field{[10]uint32{0x01f3e1c4, 0x00ded2b7, 0x021d5f85, 0x0192b2ae, 0x02cef4f0, 0x00afca9d, 0x01eff10f, 0x004cba89, 0x02901797, 0x0031643f}}}, + {X: Field{[10]uint32{0x027a3c0b, 0x01c9f12c, 0x00a499cc, 0x03b68782, 0x00aefbbd, 0x016262bc, 0x020144d4, 0x036086da, 0x00da2f57, 0x00158280}}, Y: Field{[10]uint32{0x0395e208, 0x00044ab9, 0x02eaaa8b, 0x018d36ef, 0x025db86d, 0x020ec54b, 0x00b79ff9, 0x004ddcef, 0x024e39db, 0x001921d3}}}, + {X: Field{[10]uint32{0x0379094d, 0x02ecbcbc, 0x011dce5c, 0x0076f433, 0x001afe9b, 0x015b8a05, 0x03164248, 0x0378ab06, 0x03a77ec8, 0x0027ccfe}}, Y: Field{[10]uint32{0x02fe94b0, 0x02c2a709, 0x0384892f, 0x0366fff8, 0x01d972ab, 0x0177b358, 0x0034f19b, 0x038a9c98, 0x00d81838, 0x0025f2e3}}}, + {X: Field{[10]uint32{0x02d7a1b9, 0x01411f9c, 0x01226da7, 0x014f81a8, 0x01e46ee2, 0x02833ec5, 0x039da042, 0x01d44923, 0x03a82405, 0x0026208b}}, Y: Field{[10]uint32{0x02b19285, 0x00f7c53f, 0x00cc2a55, 0x013339f1, 0x03db975d, 0x03e5643c, 0x01475611, 0x0152b369, 0x023507bc, 0x000fa7ba}}}, + {X: Field{[10]uint32{0x001dbd88, 0x021a81ab, 0x0307cc40, 0x0179f885, 0x03bc7287, 0x00bc3e12, 0x01883273, 0x01c9a1ab, 0x01ac4b75, 0x002e0534}}, Y: Field{[10]uint32{0x00f18a98, 0x0114a640, 0x01c36cf1, 0x03fc635a, 0x00c03462, 0x0129ee2a, 0x01b8ab3c, 0x02848900, 0x00883749, 0x002d8d91}}}, + {X: Field{[10]uint32{0x01043e97, 0x00f068af, 0x00cd8623, 0x010a170a, 0x03b39cf8, 0x03b677f3, 0x039f7b7e, 0x0044f334, 0x00c41e42, 0x00091921}}, Y: Field{[10]uint32{0x039552d3, 0x01fd743a, 0x00502387, 0x03ad1294, 0x0280f431, 0x0342dd79, 0x01d36f79, 0x02f76010, 0x01b02e31, 0x003cd409}}}, + {X: Field{[10]uint32{0x0351db91, 0x02bee63f, 0x0358e847, 0x00902474, 0x03bbe8c5, 0x00a13930, 0x03fff0e4, 0x02cbb361, 0x03657b41, 0x0027ccc0}}, Y: Field{[10]uint32{0x02d5e70d, 0x03d0cddc, 0x03dad317, 0x0305d584, 0x01adf519, 0x013df339, 0x0176a43d, 0x0221c378, 0x03cb221c, 0x0012e69e}}}, + {X: Field{[10]uint32{0x01529d25, 0x02e6f2a7, 0x0161c225, 0x01452c58, 0x02b0e719, 0x03d69370, 0x035623a8, 0x010cf017, 0x029b3c75, 0x0030b9e3}}, Y: Field{[10]uint32{0x039079bb, 0x02228f2a, 0x001b9505, 0x00ab5891, 0x03e79436, 0x02c928b8, 0x0387b209, 0x01db2b18, 0x00f19383, 0x00079d72}}}, + {X: Field{[10]uint32{0x03695391, 0x0179aea9, 0x03f867ce, 0x00340a41, 0x022125c4, 0x01522bab, 0x01c9636b, 0x006df215, 0x02c4b6e8, 0x00224d03}}, Y: Field{[10]uint32{0x012c72c6, 0x030fa8de, 0x00671575, 0x02755492, 0x002b2a9c, 0x00f8af04, 0x01cc2c10, 0x01e5b77c, 0x014e263e, 0x003dce6a}}}, + {X: Field{[10]uint32{0x02629d22, 0x00aef8b5, 0x022daa7e, 0x00f63f63, 0x035d66a9, 0x034e29b0, 0x00facd48, 0x00f3081e, 0x0315f144, 0x0024813f}}, Y: Field{[10]uint32{0x0159c019, 0x00098e9d, 0x03253be1, 0x015609c9, 0x00131205, 0x00a4ffcf, 0x005020ec, 0x0143a588, 0x0075456b, 0x000ae77a}}}, + {X: Field{[10]uint32{0x03ff04d6, 0x031257ba, 0x0284d7ab, 0x03929ef5, 0x0261fad9, 0x00c97d77, 0x02b518dc, 0x00bf5f39, 0x02104112, 0x003c55b6}}, Y: Field{[10]uint32{0x01b631d4, 0x011a8380, 0x0170376e, 0x0135ce7d, 0x017f2c40, 0x000c6976, 0x03aa78d2, 0x02b7fb72, 0x00abf4f2, 0x0031cca5}}}, + {X: Field{[10]uint32{0x0280fa75, 0x01f6808c, 0x022659fa, 0x01549941, 0x022c379a, 0x001430d8, 0x00998616, 0x0104e84c, 0x017837d6, 0x001dc68b}}, Y: Field{[10]uint32{0x014c9aca, 0x0002c997, 0x030f66b6, 0x001356f1, 0x03e42703, 0x01b23746, 0x03ef0b0f, 0x007d6e0a, 0x039f5cfe, 0x0022daf0}}}, + {X: Field{[10]uint32{0x01a18f69, 0x0048d9a1, 0x004018e5, 0x003ac730, 0x01aec29f, 0x01039473, 0x03b52b1f, 0x00b167d8, 0x00e036bb, 0x00053356}}, Y: Field{[10]uint32{0x005e2006, 0x00323667, 0x0372ef27, 0x0279d1ac, 0x03ea15b1, 0x027a93a3, 0x00c72623, 0x011905d1, 0x00fded35, 0x001e7095}}}, + {X: Field{[10]uint32{0x028633f1, 0x03fc9ec6, 0x0343c22b, 0x03254ada, 0x02cd539c, 0x024299f7, 0x000bff13, 0x0001c960, 0x00770106, 0x00397d50}}, Y: Field{[10]uint32{0x01666367, 0x02c80a23, 0x00b5f4c3, 0x02a6c3d5, 0x0280274d, 0x026be281, 0x038e691f, 0x021b1d60, 0x02c39baa, 0x0035b871}}}, + {X: Field{[10]uint32{0x03429197, 0x03abe2b9, 0x003d75b8, 0x012cf4df, 0x03679134, 0x025a4f64, 0x03d14ba7, 0x0080dfef, 0x03429c07, 0x002c3aab}}, Y: Field{[10]uint32{0x037af26d, 0x0145c5a6, 0x00341510, 0x0209a8bc, 0x00bc2373, 0x000805c4, 0x0124d9bd, 0x006d953c, 0x021e4a17, 0x00035c99}}}, + {X: Field{[10]uint32{0x004d67c2, 0x03847998, 0x00e883c2, 0x00bb3d8b, 0x005380f9, 0x021393a8, 0x01573832, 0x036bb4d6, 0x030b044e, 0x003808b5}}, Y: Field{[10]uint32{0x01ab4143, 0x00ac4724, 0x01c7152d, 0x026cb0f7, 0x0207aed8, 0x0054fa70, 0x015228a3, 0x03b43451, 0x01d43ba0, 0x00108f15}}}, + {X: Field{[10]uint32{0x03c5ab5f, 0x02999692, 0x00651349, 0x036a7976, 0x03af1a3e, 0x02525446, 0x0270f07b, 0x02abc996, 0x033eb2ea, 0x0024a8b5}}, Y: Field{[10]uint32{0x000fa973, 0x01a04878, 0x0004992d, 0x00f16b0d, 0x0105f170, 0x00e8c98c, 0x0089fff5, 0x03495268, 0x00194794, 0x001124b5}}}, + {X: Field{[10]uint32{0x01b9cb30, 0x008d6a63, 0x0003ec96, 0x00b8fb98, 0x03b12f10, 0x01ea73ba, 0x035ac444, 0x002a733c, 0x02860de5, 0x0010d025}}, Y: Field{[10]uint32{0x0210bba9, 0x00b37713, 0x02cb037d, 0x0261fcc5, 0x03c8e1e8, 0x03671b22, 0x00e38adb, 0x00405e39, 0x0040952e, 0x000bde04}}}, + {X: Field{[10]uint32{0x0394cd12, 0x0282b788, 0x024e1aaa, 0x010ce222, 0x02945426, 0x01cd7713, 0x003aa5ad, 0x03e3506e, 0x011b0643, 0x0034d277}}, Y: Field{[10]uint32{0x033249a5, 0x02b7b390, 0x01bc6072, 0x015fb38d, 0x01cf0822, 0x02803bfa, 0x01c71c9e, 0x02dab0a5, 0x00571da2, 0x0019fcbc}}}, + {X: Field{[10]uint32{0x02dd10e6, 0x004de059, 0x023d9c68, 0x02763e0c, 0x03babad3, 0x01cb6339, 0x036834d2, 0x01faecd7, 0x02957fb8, 0x0026a426}}, Y: Field{[10]uint32{0x02ddbca1, 0x02195ca8, 0x03cec863, 0x0367dc24, 0x01c12f16, 0x028bd800, 0x02248352, 0x0068a1fd, 0x011a3277, 0x00338fab}}}, + {X: Field{[10]uint32{0x0007fa0b, 0x02f33c2b, 0x01452a67, 0x01c44853, 0x031d77f9, 0x01a1ad7e, 0x03be25d3, 0x00a99268, 0x0218df2a, 0x003ce2c7}}, Y: Field{[10]uint32{0x01e65ea6, 0x019c7bdc, 0x039d4591, 0x03631223, 0x03419a20, 0x03029188, 0x011ced59, 0x02c806e8, 0x029a7f71, 0x00001727}}}, + {X: Field{[10]uint32{0x01535a67, 0x0381b20c, 0x039a6a86, 0x021304ad, 0x027b9097, 0x009d8bb4, 0x012738bc, 0x0342577d, 0x03ca26b8, 0x00108d83}}, Y: Field{[10]uint32{0x028345e4, 0x03064491, 0x02f665de, 0x030595fd, 0x03db93ae, 0x02f77114, 0x008bc432, 0x03000efa, 0x00e5e43e, 0x001adbd3}}}, + {X: Field{[10]uint32{0x003f4a1e, 0x00130d8c, 0x02a94534, 0x03016800, 0x01b87325, 0x00c8ddec, 0x03993eaa, 0x038ee665, 0x018da7c5, 0x0038f5c6}}, Y: Field{[10]uint32{0x0053ef4d, 0x004de048, 0x0265f5c8, 0x033cc817, 0x00a05f19, 0x017eaff9, 0x0342be83, 0x0052337d, 0x0218ece6, 0x001c90dc}}}, + {X: Field{[10]uint32{0x007cb59b, 0x02f1b65a, 0x01b480d6, 0x02d6f5a3, 0x0202f93d, 0x006454a7, 0x014f6258, 0x004441ad, 0x0145a830, 0x000e504a}}, Y: Field{[10]uint32{0x0250f08d, 0x009941bc, 0x01d9fd28, 0x02028405, 0x00e08b0a, 0x002a562d, 0x03057844, 0x030c6462, 0x022c60f5, 0x002e36e0}}}, + {X: Field{[10]uint32{0x01241fc2, 0x00b025f3, 0x014f421d, 0x0053552b, 0x02d93dc9, 0x0364da33, 0x03857c7e, 0x03a639da, 0x01f77e0e, 0x0001349d}}, Y: Field{[10]uint32{0x039d7473, 0x03922ae8, 0x02f05277, 0x03a24330, 0x03935448, 0x0254aac4, 0x019d361f, 0x00a447d8, 0x03d49b50, 0x003b2e00}}}, + {X: Field{[10]uint32{0x029556ce, 0x00fe01e1, 0x01e03c01, 0x0114f22a, 0x010160b1, 0x01667b56, 0x02fcd5b6, 0x0272f68f, 0x0076c1db, 0x000a4d92}}, Y: Field{[10]uint32{0x023f6ede, 0x00c6443c, 0x0186c2dc, 0x01a9df7c, 0x0243ffb5, 0x016507df, 0x03562379, 0x02543213, 0x02f4cc44, 0x000af6d2}}}, + {X: Field{[10]uint32{0x00878034, 0x003b9b79, 0x01e55d38, 0x0107d2c8, 0x036febcf, 0x00ee84cc, 0x003ef10d, 0x0337deae, 0x00a963dc, 0x001d4c7d}}, Y: Field{[10]uint32{0x03a36ae8, 0x0100d286, 0x0055e9c4, 0x02ec021f, 0x01e1dcb1, 0x03589a6c, 0x01628ca2, 0x01af087a, 0x029f91d5, 0x0011d4f6}}}, + {X: Field{[10]uint32{0x00286e08, 0x02514317, 0x02777a3d, 0x00a16f05, 0x016050ca, 0x02f7e2b0, 0x00dce7a4, 0x03fb2910, 0x02263d12, 0x002099b5}}, Y: Field{[10]uint32{0x03e2328b, 0x0177cb2b, 0x00877545, 0x03897369, 0x0096d908, 0x0267d8cf, 0x01e7e363, 0x013ad9a9, 0x02bffb8a, 0x0009403c}}}, + {X: Field{[10]uint32{0x03c589e9, 0x02a1b452, 0x023d69ea, 0x02a9672d, 0x036d5e62, 0x010e27e1, 0x039b26e8, 0x027c5630, 0x00014f33, 0x00199200}}, Y: Field{[10]uint32{0x02d92e2a, 0x01c05b12, 0x002f596c, 0x03076a29, 0x01f145ff, 0x01d6b0c6, 0x00785263, 0x0168de7c, 0x033fe3eb, 0x00281a66}}}, + {X: Field{[10]uint32{0x00c70d49, 0x01dead93, 0x0113486b, 0x02e387d1, 0x03f641e2, 0x01b224d0, 0x01921b5e, 0x003ee981, 0x00858b9c, 0x003e3bf3}}, Y: Field{[10]uint32{0x00a9d607, 0x00761d54, 0x00834f8b, 0x0389e49e, 0x005f4de2, 0x00d7668f, 0x01a0ae30, 0x03c366bd, 0x002f7086, 0x002ea5c8}}}, + {X: Field{[10]uint32{0x00992540, 0x010b8267, 0x02e736c5, 0x02c07638, 0x016f2485, 0x00eafecf, 0x02c627c9, 0x00928ec7, 0x027d2543, 0x00297048}}, Y: Field{[10]uint32{0x02ecc7cc, 0x005b6f21, 0x03da5a1d, 0x01173e5d, 0x0264cfef, 0x00e29fde, 0x019bed7f, 0x00eed5b6, 0x01b48a16, 0x00324627}}}, + {X: Field{[10]uint32{0x038bbaf3, 0x01418182, 0x018938e0, 0x00024983, 0x016c85bb, 0x01c0b7b1, 0x03b655d7, 0x014f7c3e, 0x0219a5b2, 0x0009c6c9}}, Y: Field{[10]uint32{0x02cd2ce5, 0x0326924f, 0x03bd8d86, 0x039756bc, 0x0172bca7, 0x02af9564, 0x01bd1746, 0x023c9f73, 0x03fc22cb, 0x0016333c}}}, + {X: Field{[10]uint32{0x0170ae16, 0x03077f41, 0x0036ad90, 0x00c24b2b, 0x021202ba, 0x01c8753c, 0x001800ce, 0x025d0436, 0x002b20c7, 0x0032784e}}, Y: Field{[10]uint32{0x0231e5b2, 0x0084ee04, 0x003f690d, 0x03ec3e69, 0x016f7a0d, 0x035e65d2, 0x012f7070, 0x033a80ea, 0x00ab2a47, 0x001fac7f}}}, + {X: Field{[10]uint32{0x000309f2, 0x00250780, 0x03decb1e, 0x01aa2f51, 0x0145897e, 0x00ad2251, 0x018cb751, 0x00a81075, 0x03256523, 0x000015d2}}, Y: Field{[10]uint32{0x024615a9, 0x02cebe3f, 0x03b72038, 0x03eb0ad7, 0x03474db8, 0x02a72774, 0x03bf2cc6, 0x01d2fe4f, 0x02a9567d, 0x002efee1}}}, + {X: Field{[10]uint32{0x03046c38, 0x02354218, 0x012b4a98, 0x03b1a54f, 0x021135e7, 0x037fdb15, 0x0120e004, 0x017b692d, 0x02aca630, 0x0027bfa1}}, Y: Field{[10]uint32{0x02e9af70, 0x02b60c6a, 0x02e42551, 0x01e646a6, 0x027afa4f, 0x030ed362, 0x03cbe67e, 0x002062bd, 0x029132cb, 0x0013e4a8}}}, + {X: Field{[10]uint32{0x0013f254, 0x028b72f6, 0x0328413a, 0x03e8cf61, 0x02df26ca, 0x0024639a, 0x00bf4c3d, 0x03e85cdd, 0x00a0ff76, 0x0020ba92}}, Y: Field{[10]uint32{0x032ac9f2, 0x021ac76f, 0x038e4a70, 0x03589b77, 0x0049b4c2, 0x005ea254, 0x01e1ca14, 0x0156a8e7, 0x01399bb5, 0x001a80a5}}}, + {X: Field{[10]uint32{0x01d2baaa, 0x0379d56f, 0x01f4f5fb, 0x03af78ca, 0x03e3af2f, 0x02982b7e, 0x0352a24b, 0x02c1b0c4, 0x003e817b, 0x0030a252}}, Y: Field{[10]uint32{0x00780a53, 0x00e87387, 0x005c04b1, 0x017b065a, 0x039c4994, 0x03fad657, 0x036854a1, 0x03b3bd8a, 0x010d8b4a, 0x000edfba}}}, + {X: Field{[10]uint32{0x02e12cc4, 0x01d02d25, 0x0030001c, 0x01835e2a, 0x02016986, 0x02c161ed, 0x028deb31, 0x003563a9, 0x02cbb558, 0x001af791}}, Y: Field{[10]uint32{0x01293292, 0x01baccba, 0x02d91e09, 0x0173450b, 0x020a41cc, 0x031e741d, 0x014ce750, 0x0059a922, 0x02a7c1cd, 0x000c6229}}}, + {X: Field{[10]uint32{0x01827cf4, 0x026b07d9, 0x00bdf451, 0x023e819b, 0x01017673, 0x01bf5d5c, 0x030a11d6, 0x0185795f, 0x03ae2844, 0x003474a8}}, Y: Field{[10]uint32{0x03f603db, 0x018c4899, 0x02ee70f9, 0x00d971f6, 0x038271f9, 0x014558ba, 0x03697d7c, 0x03065a2d, 0x03f70c01, 0x001f033f}}}, + {X: Field{[10]uint32{0x0227370a, 0x0057b5ee, 0x00be8f65, 0x02233ea8, 0x00e276b0, 0x02afe697, 0x0151c852, 0x01555ced, 0x00874d19, 0x002dd303}}, Y: Field{[10]uint32{0x01a662ab, 0x003c7dd1, 0x031b551e, 0x01784535, 0x026f0c32, 0x0313b630, 0x01e307be, 0x015c7bf9, 0x030e380c, 0x00003c32}}}, + {X: Field{[10]uint32{0x01015874, 0x0109827e, 0x0298f47d, 0x01deebb8, 0x00849500, 0x00c5f846, 0x03c30412, 0x01b0fe85, 0x039a9f12, 0x002a69c6}}, Y: Field{[10]uint32{0x002e0586, 0x0130a9a9, 0x020f08f3, 0x01fd5448, 0x03f1b113, 0x018d33b3, 0x024be1df, 0x03c32dfe, 0x03fdb31b, 0x003017cf}}}, + {X: Field{[10]uint32{0x00dbc68c, 0x0089d2a0, 0x01c259b0, 0x03e8fe88, 0x032b1b99, 0x02cfe08e, 0x03514162, 0x007c9f76, 0x01530a16, 0x0035b784}}, Y: Field{[10]uint32{0x0059764a, 0x03202f6f, 0x02215348, 0x018539d9, 0x00714fab, 0x02b2f7bf, 0x0015d259, 0x021697bb, 0x00636597, 0x001b1882}}}, + {X: Field{[10]uint32{0x036b73f1, 0x024a9d1d, 0x016df112, 0x00d80a9e, 0x0273a7dc, 0x016521fe, 0x038c22f3, 0x03297147, 0x01bc3acd, 0x00372a87}}, Y: Field{[10]uint32{0x00c85159, 0x0312a3c3, 0x035147c8, 0x026a5631, 0x01b4b4d4, 0x005c545e, 0x033719b0, 0x0181ed20, 0x01fcc22c, 0x0037104c}}}, + {X: Field{[10]uint32{0x0005ab6c, 0x01a89100, 0x01d21220, 0x00025526, 0x015f3a13, 0x01dc2535, 0x03aa93c6, 0x02f84c70, 0x03a000c4, 0x0004d54d}}, Y: Field{[10]uint32{0x00fb0f69, 0x00bc1159, 0x0333048c, 0x033f8d20, 0x0308f3eb, 0x03548dc2, 0x01f0d1dd, 0x037d9ccd, 0x031fd2d3, 0x001fbda7}}}, + {X: Field{[10]uint32{0x01de93ac, 0x03fa760e, 0x0004afb3, 0x03957a7a, 0x02751dd6, 0x00ff666b, 0x01572bbe, 0x018b9933, 0x0017c232, 0x000a3c76}}, Y: Field{[10]uint32{0x01e2cb7e, 0x00a6d20e, 0x01cb0970, 0x022f5079, 0x008f5dfe, 0x01f20d6b, 0x02e0e896, 0x00f690b6, 0x0061987e, 0x000093d6}}}, + {X: Field{[10]uint32{0x00294289, 0x03384d51, 0x001e25f8, 0x021e6b59, 0x03e0779b, 0x002040b7, 0x0331155c, 0x02dfee3a, 0x03836e8f, 0x003df13b}}, Y: Field{[10]uint32{0x036bce2c, 0x026593c7, 0x020d1362, 0x008da55e, 0x0216470d, 0x01bae5a0, 0x0150f091, 0x02588758, 0x0381db33, 0x0001fe69}}}, + {X: Field{[10]uint32{0x0228b3e6, 0x02a3d986, 0x03aeda8d, 0x0061444b, 0x00ddc8d0, 0x0169cd75, 0x0366f7e2, 0x026cd462, 0x025e1ddc, 0x003c7d6b}}, Y: Field{[10]uint32{0x01ad4288, 0x036777ee, 0x03cb41c6, 0x0218fb6d, 0x035c5c34, 0x013f9ea3, 0x024a8df2, 0x01360142, 0x012c9792, 0x00276ffc}}}, + {X: Field{[10]uint32{0x008b654f, 0x03ef5cc0, 0x0027dc2a, 0x0287ad96, 0x01257c10, 0x015e2d8e, 0x020dbc74, 0x033a7072, 0x0173d170, 0x00257e0c}}, Y: Field{[10]uint32{0x03412487, 0x03472f00, 0x035b8b75, 0x00edefb8, 0x017d5ab8, 0x01a4628c, 0x03c3c91c, 0x012a2104, 0x02bc0829, 0x0018ea0f}}}, + {X: Field{[10]uint32{0x023ff750, 0x020f025a, 0x03a7df8c, 0x00d646f8, 0x03964749, 0x01f58154, 0x008c8e37, 0x017847ae, 0x025c9f09, 0x003d2b69}}, Y: Field{[10]uint32{0x01861ed3, 0x0146972b, 0x0178d3ac, 0x01d86c37, 0x012ede16, 0x036f3129, 0x00bc87c3, 0x0116cb9b, 0x0328a385, 0x0039da0f}}}, + {X: Field{[10]uint32{0x019e5fd2, 0x039eb90a, 0x00fd03af, 0x015b64e5, 0x0040b827, 0x0371ef09, 0x03bcd591, 0x036cec6d, 0x0096f714, 0x00106beb}}, Y: Field{[10]uint32{0x0099fedc, 0x03a691c1, 0x02f20474, 0x0001769e, 0x0061c52d, 0x03195291, 0x02e98aea, 0x03fc4909, 0x006a3292, 0x00270ba7}}}, + {X: Field{[10]uint32{0x00487405, 0x02a85bba, 0x03ffd0cc, 0x03f710bc, 0x01e1b8df, 0x0328d7c3, 0x0141fe9c, 0x00726d86, 0x031b2cb8, 0x000dfcc2}}, Y: Field{[10]uint32{0x00b88a0f, 0x00755363, 0x022bb61b, 0x00f29326, 0x018086bb, 0x0021ad92, 0x03dd08e1, 0x00754767, 0x0285e340, 0x0024afde}}}, + {X: Field{[10]uint32{0x004fb3ce, 0x0181c596, 0x0205b9d7, 0x02651530, 0x03605a21, 0x0338323a, 0x01312022, 0x01faa885, 0x0166646e, 0x000bd5dc}}, Y: Field{[10]uint32{0x03d5f446, 0x019f7fc0, 0x00ee0985, 0x036bb589, 0x01af32e8, 0x03412e5a, 0x020dc684, 0x033ab56b, 0x026fe43d, 0x003c35cc}}}, + {X: Field{[10]uint32{0x00b5150a, 0x01f96e99, 0x03e7dfd5, 0x03fc2fe7, 0x003c2e24, 0x02bff6fe, 0x03a0af94, 0x0144ad7a, 0x038092c5, 0x0022aef1}}, Y: Field{[10]uint32{0x02896b75, 0x0059f5fd, 0x0232791a, 0x03b12454, 0x010bb87d, 0x03fb33db, 0x015b974f, 0x03066a92, 0x018f0c2e, 0x00163d66}}}, + {X: Field{[10]uint32{0x0147571c, 0x03741970, 0x00aed219, 0x03d70a04, 0x00f6da7c, 0x01f95f3f, 0x0073fe40, 0x01dacc9f, 0x028fa013, 0x003906b3}}, Y: Field{[10]uint32{0x036844a2, 0x02a52fdd, 0x027a37d8, 0x01146584, 0x01715d45, 0x01cbe639, 0x02d04592, 0x01c530c8, 0x02da3c2a, 0x002d642a}}}, + {X: Field{[10]uint32{0x010f1d88, 0x00533662, 0x03b5abe7, 0x03f2767a, 0x017c0c84, 0x00491e27, 0x0180f7f4, 0x0157bb77, 0x00778b63, 0x000c0326}}, Y: Field{[10]uint32{0x039c9002, 0x017a4ef8, 0x0138520f, 0x01b20d37, 0x0068c507, 0x03869ee0, 0x00f5c7a4, 0x021cc432, 0x0262c571, 0x0036b0ae}}}, + {X: Field{[10]uint32{0x02e24c61, 0x0205c1c4, 0x01b5c876, 0x008c9b28, 0x03dcdb66, 0x01e1db0f, 0x02072c1f, 0x003e1096, 0x01d219d4, 0x001a78ce}}, Y: Field{[10]uint32{0x00babc50, 0x002e1b4e, 0x005a1bad, 0x02024dd0, 0x014cd472, 0x02d4d648, 0x017e8499, 0x011c0085, 0x015059a4, 0x002350e4}}}, + {X: Field{[10]uint32{0x03bdb909, 0x03752132, 0x0346da2f, 0x027d47f1, 0x00cddd77, 0x007eaded, 0x033ccf64, 0x02a67e2a, 0x03df8e47, 0x00395924}}, Y: Field{[10]uint32{0x03f5ee59, 0x012728f8, 0x01145b6e, 0x0275d630, 0x01974531, 0x0107062d, 0x0006036d, 0x0053fb42, 0x020a559e, 0x001a36e8}}}, + {X: Field{[10]uint32{0x03f50587, 0x0134e379, 0x01c611a3, 0x03795d36, 0x00f76532, 0x01b803ac, 0x01c11e58, 0x0144734e, 0x00578998, 0x000dea47}}, Y: Field{[10]uint32{0x03145f18, 0x007710ec, 0x0381ee5d, 0x0042ae74, 0x01feac27, 0x00276a25, 0x01975dc0, 0x022891cd, 0x00af0d2d, 0x0038e862}}}, + {X: Field{[10]uint32{0x02e88c1f, 0x0149d0b7, 0x0124a86c, 0x01bd9793, 0x02622401, 0x02535e0e, 0x00629c71, 0x018b844b, 0x01fb5cc2, 0x00317c16}}, Y: Field{[10]uint32{0x038c890a, 0x0155e3ec, 0x00623ab1, 0x00147be8, 0x018c0907, 0x0242d1b5, 0x037792d5, 0x02a56945, 0x03521a96, 0x0007216f}}}, + {X: Field{[10]uint32{0x038716a1, 0x01e24926, 0x01827626, 0x018fca11, 0x03c6323c, 0x021006b3, 0x018c59d7, 0x033ac68a, 0x02ccd605, 0x00159bb7}}, Y: Field{[10]uint32{0x0244cc90, 0x0018b516, 0x010a15ad, 0x02bf0080, 0x038c40b3, 0x00b4ccbf, 0x01f85b93, 0x01bc81e2, 0x03735adf, 0x003b8344}}}, + {X: Field{[10]uint32{0x032c7c7b, 0x027337b6, 0x034c8db6, 0x038b0fae, 0x023e6cf4, 0x0332d190, 0x012e33db, 0x013e1c01, 0x0033c6ef, 0x000c9f9c}}, Y: Field{[10]uint32{0x03e8db36, 0x0385ba54, 0x012634aa, 0x00e7def6, 0x00122662, 0x0026bac7, 0x023e2667, 0x03ca6d2a, 0x012b2be0, 0x003f1242}}}, + {X: Field{[10]uint32{0x03778024, 0x039c0265, 0x01e1a1ea, 0x038a317d, 0x0284ef5a, 0x029b2bfd, 0x0329704e, 0x02b21957, 0x03693ac0, 0x0026269f}}, Y: Field{[10]uint32{0x00dadfd0, 0x01ed90a0, 0x0292bd1b, 0x035cec2c, 0x00e8eb1f, 0x02b3fa99, 0x03b5bd44, 0x011639d2, 0x027b3396, 0x0015cf44}}}, + {X: Field{[10]uint32{0x0330fc94, 0x00b31842, 0x019769c2, 0x03e92999, 0x037ce313, 0x013d2695, 0x01cec4b7, 0x01fd53b4, 0x032f14f2, 0x002729d9}}, Y: Field{[10]uint32{0x0104e4a1, 0x01b283ce, 0x011dcd2d, 0x0013bbb0, 0x006ab141, 0x00b7e34c, 0x0003f818, 0x00a928c2, 0x00d731d5, 0x003e4831}}}, + {X: Field{[10]uint32{0x0047f5f5, 0x0155579e, 0x030cde1d, 0x0143b4bb, 0x02060978, 0x01f89c86, 0x00316871, 0x03a38656, 0x0245654f, 0x0036c401}}, Y: Field{[10]uint32{0x01056567, 0x02064a0c, 0x0014c962, 0x033b9d14, 0x02619287, 0x03ddb22d, 0x03cdf895, 0x003b3cd3, 0x02cea9c9, 0x000acb0f}}}, + {X: Field{[10]uint32{0x013295a9, 0x01340335, 0x01c07bb9, 0x03e9949a, 0x02418a34, 0x00effc53, 0x02110a8f, 0x00ed0979, 0x009e8274, 0x00138a83}}, Y: Field{[10]uint32{0x00ccca7a, 0x02cb138f, 0x014b3d98, 0x03b237e8, 0x008a34e5, 0x028eb1a7, 0x00b90590, 0x02c12dad, 0x02e3e00b, 0x00144ab0}}}, + {X: Field{[10]uint32{0x02ac77f6, 0x010d4bd9, 0x0368d733, 0x01dca50e, 0x0060c71a, 0x0217ec73, 0x0136f981, 0x022b2c14, 0x037024ea, 0x00304acf}}, Y: Field{[10]uint32{0x02544803, 0x01ef77c0, 0x033239c0, 0x02560cc9, 0x020d67a1, 0x03ef8949, 0x009f5a7b, 0x01dbc07c, 0x019b6f4b, 0x002de67e}}}, + {X: Field{[10]uint32{0x03fd7e58, 0x01551923, 0x003feaa7, 0x020afe9e, 0x03d6c09b, 0x005904ff, 0x017c0cf6, 0x013877af, 0x022edaf3, 0x00019396}}, Y: Field{[10]uint32{0x002f4a50, 0x0147cd0f, 0x004ff726, 0x0292d461, 0x027509a2, 0x037c249b, 0x005d611a, 0x00cb8ba4, 0x020966f0, 0x00038083}}}, + {X: Field{[10]uint32{0x030a838a, 0x0102254f, 0x03b9fef0, 0x015cb3ec, 0x013d66ec, 0x000fc0b7, 0x02d1857e, 0x010e03da, 0x0355fa73, 0x000ac2e2}}, Y: Field{[10]uint32{0x0273a61a, 0x02404f67, 0x024765bd, 0x0070d023, 0x00147ce0, 0x00722029, 0x00b45bae, 0x01965e38, 0x0251a914, 0x002b225c}}}, + {X: Field{[10]uint32{0x0288525e, 0x01e24c0a, 0x00c5bd67, 0x02d07bf5, 0x016523e8, 0x0196a59e, 0x02545299, 0x0184cf4e, 0x0130a202, 0x002b838f}}, Y: Field{[10]uint32{0x00f80552, 0x0177ed4e, 0x03ee97ec, 0x01f7687b, 0x00c80c08, 0x00e6ac98, 0x00be67b3, 0x00b49094, 0x00ff8563, 0x003eda46}}}, + {X: Field{[10]uint32{0x03e00dd9, 0x037a18a3, 0x03454a83, 0x00c3b7c8, 0x033bfa15, 0x0007d130, 0x02e46cb0, 0x02859bfe, 0x03114dfe, 0x000bfe71}}, Y: Field{[10]uint32{0x03318783, 0x03a0b11b, 0x027599b5, 0x001ef483, 0x01acb0d7, 0x02065717, 0x02383517, 0x00605e8f, 0x027a0444, 0x00014fd9}}}, + {X: Field{[10]uint32{0x027bf695, 0x02c45a93, 0x017263ed, 0x0393067d, 0x019e2614, 0x010ac512, 0x003f60cc, 0x01671b01, 0x001488b9, 0x0033009c}}, Y: Field{[10]uint32{0x03b6007a, 0x00b99296, 0x01fe2e57, 0x017080db, 0x0307b532, 0x012697c1, 0x02ce6551, 0x03d9dd99, 0x01909b22, 0x003aacfd}}}, + {X: Field{[10]uint32{0x00a945d5, 0x01a2fa0a, 0x0145584d, 0x016bc067, 0x03f9dbf4, 0x02125749, 0x03e3b476, 0x00d6997b, 0x03d13c80, 0x0006007b}}, Y: Field{[10]uint32{0x0259c4fe, 0x02f686fe, 0x005681ac, 0x02f382da, 0x03f44a5a, 0x026a0be2, 0x02f49d50, 0x025a3bd3, 0x019efcb5, 0x0037fcb4}}}, + {X: Field{[10]uint32{0x00dd7cbf, 0x02de3f0f, 0x03f8be6a, 0x038db9d1, 0x015b698f, 0x031eaeaf, 0x03c09de4, 0x002588d5, 0x01d507b6, 0x001b68aa}}, Y: Field{[10]uint32{0x0275060c, 0x016f7338, 0x00378d50, 0x020a66b3, 0x0171310b, 0x00df02bc, 0x01ac9f9b, 0x022b88a5, 0x02704aeb, 0x000789d3}}}, + {X: Field{[10]uint32{0x02fc82e4, 0x02846b6e, 0x0344c832, 0x00e86a67, 0x00c7dfe2, 0x02a513fc, 0x039e8a6e, 0x005774ef, 0x016f6a92, 0x001fa3f2}}, Y: Field{[10]uint32{0x01342bff, 0x021cb8ec, 0x02d51ddc, 0x000ea023, 0x0257d095, 0x018fce21, 0x039ed00c, 0x01b29fdc, 0x03e1e0c2, 0x003a693e}}}, + {X: Field{[10]uint32{0x020caf64, 0x02ed121f, 0x00f27559, 0x00cdc633, 0x019f53e1, 0x021c1d90, 0x0266ab37, 0x035bdff8, 0x033a77d6, 0x00298d8b}}, Y: Field{[10]uint32{0x02cc787e, 0x02135874, 0x00d70087, 0x00e7d1cf, 0x03e29d85, 0x019bdd46, 0x025cd860, 0x00e17182, 0x02da3fc2, 0x00300588}}}, + {X: Field{[10]uint32{0x0337d2b3, 0x01c01d66, 0x01557449, 0x0154df09, 0x018582bd, 0x001db06a, 0x01a19b47, 0x01d24e8f, 0x022228b4, 0x00146194}}, Y: Field{[10]uint32{0x00287be1, 0x02bef411, 0x01ad17d0, 0x02e14914, 0x02826558, 0x01032e33, 0x03ca65bf, 0x0236764f, 0x01796863, 0x003c3c2e}}}, + {X: Field{[10]uint32{0x01d472ce, 0x02f0f460, 0x028e67e8, 0x004a7a3b, 0x0304d802, 0x01c6656a, 0x0314ff4f, 0x02e70e31, 0x009ba9f1, 0x0028a824}}, Y: Field{[10]uint32{0x0040068d, 0x03d717bb, 0x01a6a1e8, 0x007b3649, 0x028b364d, 0x03114ce4, 0x03fdf98e, 0x031efdc6, 0x000bd45e, 0x001048e4}}}, + {X: Field{[10]uint32{0x003aef2d, 0x00c7e1ee, 0x009212b0, 0x03abe7c3, 0x02f1357b, 0x006fe5e7, 0x03f5ac2a, 0x01fcda98, 0x0122454e, 0x00369460}}, Y: Field{[10]uint32{0x006da722, 0x0363cdda, 0x00b32b6b, 0x03e2e683, 0x016cb7f3, 0x02e7762e, 0x0028c5e1, 0x017a0032, 0x02fd0d41, 0x002fe1df}}}, + {X: Field{[10]uint32{0x0147a87d, 0x035d418e, 0x0382e6cb, 0x001b520f, 0x008a6983, 0x004316a9, 0x01aa5729, 0x00c49796, 0x00541a98, 0x00107103}}, Y: Field{[10]uint32{0x03bfc57f, 0x01bc4068, 0x00c814e8, 0x00cf0c3d, 0x03ef8400, 0x03ef7d79, 0x029f129f, 0x02442aee, 0x03656b89, 0x001db6ae}}}, + {X: Field{[10]uint32{0x02addbfd, 0x00267326, 0x01318709, 0x01322290, 0x0028745e, 0x03314362, 0x007c980a, 0x039191a1, 0x028387f2, 0x003127f7}}, Y: Field{[10]uint32{0x027227e1, 0x01231fab, 0x03a94bbb, 0x03b99847, 0x00c7ddb4, 0x00a2f9fe, 0x00baf9e6, 0x01ef4de7, 0x0112dfd0, 0x002996f1}}}, + {X: Field{[10]uint32{0x020fceae, 0x03c060c3, 0x010717a1, 0x0223a314, 0x023a6c6b, 0x035edd09, 0x03219406, 0x01d0f537, 0x0161b6ee, 0x00216c5f}}, Y: Field{[10]uint32{0x01868fef, 0x00c24b95, 0x02be892d, 0x00f9c13d, 0x03ebddc5, 0x03d2ffee, 0x006ce022, 0x007fad41, 0x00a274c7, 0x0008ae7a}}}, + {X: Field{[10]uint32{0x0117964f, 0x03d7153c, 0x0243e883, 0x030b2353, 0x023914af, 0x00158e7b, 0x03521895, 0x01dfc4f9, 0x037fe6d6, 0x00323874}}, Y: Field{[10]uint32{0x01bfc21e, 0x02b56ace, 0x008e4f88, 0x02d0daad, 0x03ee4a7a, 0x007e6525, 0x006ba559, 0x016a46bd, 0x0118d08f, 0x002c32b3}}}, + {X: Field{[10]uint32{0x0083836b, 0x001e29f9, 0x02dd9866, 0x02802e5e, 0x011a30ba, 0x00c44a65, 0x03d6f833, 0x02223169, 0x00307d25, 0x0037fb00}}, Y: Field{[10]uint32{0x02faa00d, 0x004ea42e, 0x0380956e, 0x002dbee5, 0x00f407ca, 0x00abe391, 0x00664168, 0x02511fbd, 0x0206bf2e, 0x001396a2}}}, + {X: Field{[10]uint32{0x030be9d6, 0x02535fdf, 0x00b20925, 0x01b97d35, 0x02c842ff, 0x0274c1db, 0x017618dc, 0x03631bbb, 0x00387c18, 0x003ab1b1}}, Y: Field{[10]uint32{0x0265b8d1, 0x008e9ac8, 0x021634e8, 0x019f5cd2, 0x0177a86a, 0x003fbaef, 0x031802ac, 0x006e0ae9, 0x03bffc0c, 0x000675a6}}}, + {X: Field{[10]uint32{0x03424cde, 0x0108046c, 0x019b74d6, 0x005672f2, 0x0069432c, 0x01fdab20, 0x0024db79, 0x0377b292, 0x004e04dc, 0x0027fce3}}, Y: Field{[10]uint32{0x01619ebc, 0x018886d4, 0x014f91d2, 0x0106e53d, 0x01266bd0, 0x033212e0, 0x005b0c93, 0x02effb7d, 0x0260b7c1, 0x003dcbe9}}}, + {X: Field{[10]uint32{0x01313f36, 0x03f19129, 0x02c1c146, 0x0277512c, 0x019153f6, 0x03f8a155, 0x01e4f8c4, 0x00ca4d7e, 0x013f3a5a, 0x00179e16}}, Y: Field{[10]uint32{0x02fd9c47, 0x02a6e6a2, 0x0114b89d, 0x02986cb4, 0x0358cbc5, 0x01758f25, 0x0195b700, 0x02f746cb, 0x0044dc63, 0x00276756}}}, + {X: Field{[10]uint32{0x01009ae4, 0x0321511c, 0x01b32d22, 0x0121debe, 0x020ad31a, 0x00f88870, 0x01ba38b0, 0x012dbec0, 0x03a48928, 0x002841f1}}, Y: Field{[10]uint32{0x03d9f6b5, 0x030da689, 0x014c4a0f, 0x002f1457, 0x03653b58, 0x0303e7ca, 0x0386cd5b, 0x019647b8, 0x02d46be4, 0x0001981c}}}, + {X: Field{[10]uint32{0x01b02af1, 0x03397e90, 0x028f4190, 0x023b308e, 0x02ff98e8, 0x01e4a65d, 0x02445ba6, 0x026117f8, 0x01d0308d, 0x0000907c}}, Y: Field{[10]uint32{0x03e194a9, 0x02dfaa29, 0x01c74366, 0x03bb16b2, 0x0209c881, 0x02be474c, 0x015723ad, 0x02a237e8, 0x03ecd413, 0x002219a5}}}, + {X: Field{[10]uint32{0x008a72fa, 0x02431af9, 0x01283c87, 0x005a2e6a, 0x02341860, 0x03ab0ed0, 0x015c6d26, 0x0241ba0f, 0x00d2627f, 0x000c67ba}}, Y: Field{[10]uint32{0x029eaa57, 0x033109cf, 0x032819d0, 0x014c197e, 0x01760344, 0x032d1631, 0x009f8491, 0x005b80d0, 0x02eda678, 0x00167925}}}, + {X: Field{[10]uint32{0x03ca4822, 0x0051896f, 0x038e1a26, 0x019864a1, 0x01e01008, 0x01a615d6, 0x03f4f7e9, 0x03e6f64d, 0x011a00fd, 0x000619a0}}, Y: Field{[10]uint32{0x01b7ae19, 0x01449a75, 0x0250172e, 0x00646990, 0x00585f03, 0x02d97e9f, 0x003a1316, 0x0272209e, 0x0065e85f, 0x00085781}}}, + {X: Field{[10]uint32{0x03992f26, 0x00bdda54, 0x00ce69ff, 0x016bdce5, 0x01398967, 0x033d9026, 0x03429fb8, 0x02400176, 0x02d70b94, 0x001fbfef}}, Y: Field{[10]uint32{0x00c7c749, 0x0026b210, 0x02aa7a1d, 0x01ab1b34, 0x03616d8b, 0x02fcb702, 0x016affac, 0x01b52d49, 0x01ba28f2, 0x001bbeed}}}, + {X: Field{[10]uint32{0x03168867, 0x0293494a, 0x00bf0957, 0x0199c3c5, 0x02665c8d, 0x00de54ac, 0x02e45c19, 0x0057c87f, 0x03d0e593, 0x003631ca}}, Y: Field{[10]uint32{0x0256fbcd, 0x011b186f, 0x02e6e5a9, 0x006cb266, 0x028a2da3, 0x01cff182, 0x01e2cc3a, 0x0029bf44, 0x0162fdd4, 0x0019300b}}}, + {X: Field{[10]uint32{0x00d0db4b, 0x0060c206, 0x0147abcf, 0x0147ead3, 0x0187bbfd, 0x002c35a4, 0x0396bbcb, 0x03ce050e, 0x0222ce64, 0x001c43b1}}, Y: Field{[10]uint32{0x0134d994, 0x00cc5391, 0x030c5496, 0x00dafaae, 0x013d275c, 0x0243d4c7, 0x029b9618, 0x00ebc30b, 0x0086526c, 0x003b7f44}}}, + {X: Field{[10]uint32{0x00d51ca6, 0x0131654c, 0x0334868e, 0x009e7930, 0x0370574f, 0x02021b76, 0x0168e763, 0x03b75270, 0x024b9aea, 0x002509e5}}, Y: Field{[10]uint32{0x004e2dd8, 0x00298457, 0x017af730, 0x03a9a131, 0x01e0026b, 0x00a160f6, 0x03b312e9, 0x00019fac, 0x01cf2a6b, 0x000442d0}}}, + {X: Field{[10]uint32{0x0355565f, 0x0166ce63, 0x00a5c46a, 0x00597aa9, 0x01c5a2e8, 0x036d8859, 0x03515c06, 0x03b6727a, 0x0035a8b3, 0x002bbde5}}, Y: Field{[10]uint32{0x0184b91d, 0x02c5e915, 0x012a0118, 0x0044f0d5, 0x03036535, 0x0250aaac, 0x00cb93d8, 0x03109714, 0x00f21274, 0x001985ba}}}, + {X: Field{[10]uint32{0x0074b5a3, 0x0319fccc, 0x03994a4a, 0x0339296b, 0x020f49f0, 0x0275cbc9, 0x03401935, 0x0018e9a3, 0x00323546, 0x000faf76}}, Y: Field{[10]uint32{0x00460238, 0x0254019e, 0x019beed8, 0x03cb238b, 0x02db7962, 0x00e575c4, 0x02ba318f, 0x0127bb43, 0x03d4b295, 0x000048d9}}}, + {X: Field{[10]uint32{0x026aeff2, 0x02d01790, 0x020dd729, 0x03894d35, 0x0019af86, 0x019cf212, 0x03c6bc3b, 0x0021c742, 0x025ec52b, 0x0028e367}}, Y: Field{[10]uint32{0x032cad02, 0x031d7a7c, 0x02a1cb01, 0x00a22b0d, 0x01f6d134, 0x03237935, 0x00955383, 0x01b1744e, 0x0371d9ae, 0x003af919}}}, + {X: Field{[10]uint32{0x00a7d624, 0x03b0d092, 0x01b0f9f4, 0x02845a40, 0x02334369, 0x0114b2e3, 0x00407f7b, 0x02ec6643, 0x0382619c, 0x0039f4a7}}, Y: Field{[10]uint32{0x03c4e614, 0x03b16d67, 0x02e0742b, 0x0052aa3b, 0x0315b6ce, 0x0175d85b, 0x00ce2304, 0x014581ae, 0x02d4618b, 0x001d6573}}}, + {X: Field{[10]uint32{0x0043ceae, 0x033bf3d0, 0x004edf81, 0x01738fa3, 0x007523de, 0x00063c03, 0x02333e26, 0x009ee52b, 0x02b02792, 0x003b21a7}}, Y: Field{[10]uint32{0x011ac92b, 0x02e9f71c, 0x01556ec6, 0x01dd9040, 0x03ca3fe5, 0x0399f60a, 0x00bdd264, 0x03210692, 0x02552c89, 0x0029086a}}}, + {X: Field{[10]uint32{0x02ec5e71, 0x003fcd71, 0x03ae7c07, 0x00f3809b, 0x026f0752, 0x01128d4a, 0x005c0571, 0x02322dbf, 0x0108e44a, 0x00115276}}, Y: Field{[10]uint32{0x02b5dd7a, 0x0044e2de, 0x0240f44c, 0x000069b5, 0x0164b486, 0x00b2371e, 0x0208c19e, 0x01f81040, 0x03200770, 0x001c7638}}}, + {X: Field{[10]uint32{0x01b070b2, 0x00512c29, 0x0385ff98, 0x00f4596c, 0x032cc7a5, 0x038501ac, 0x024f3813, 0x02e326c2, 0x029efef7, 0x00146edb}}, Y: Field{[10]uint32{0x0067044e, 0x0255ad69, 0x03befde5, 0x0372ab7c, 0x015268ee, 0x011b7df3, 0x031de11d, 0x013f4228, 0x03e9dd79, 0x00194a0a}}}, + {X: Field{[10]uint32{0x016d001f, 0x00fae81a, 0x013e45a8, 0x03536458, 0x02aa2027, 0x01239897, 0x0203afcd, 0x02aa0910, 0x02974c7c, 0x001f370c}}, Y: Field{[10]uint32{0x03519565, 0x014d2420, 0x00a36192, 0x0045b0b3, 0x026060a4, 0x00a27968, 0x00027a7a, 0x0156cede, 0x01433b1a, 0x002e4ae6}}}, + {X: Field{[10]uint32{0x009c9314, 0x02655d58, 0x02fc9030, 0x02e84051, 0x02aa478f, 0x0205e9af, 0x03722f6d, 0x0226da99, 0x02beb8e9, 0x000f2a71}}, Y: Field{[10]uint32{0x02ca2c0f, 0x01fc25b3, 0x00e4d6bb, 0x036af452, 0x0074c6e0, 0x0049328c, 0x006bba34, 0x006f0e0e, 0x017ff4b8, 0x001540bb}}}, + {X: Field{[10]uint32{0x01354d0c, 0x00447a2b, 0x00436864, 0x00a73248, 0x0390e1a2, 0x023b5798, 0x01bc1c83, 0x032b6bc0, 0x026c45ed, 0x002a8aaf}}, Y: Field{[10]uint32{0x0024f6cd, 0x03727cbe, 0x00d47c44, 0x02a21c55, 0x0295bb3d, 0x006e8ac9, 0x0061251f, 0x00c12893, 0x01c66f91, 0x0006e08a}}}, + {X: Field{[10]uint32{0x023bc7ee, 0x01a4db63, 0x0375a2ab, 0x02b7ef9b, 0x0375466a, 0x03dced83, 0x01f226de, 0x027564c6, 0x023df28c, 0x002d4b2b}}, Y: Field{[10]uint32{0x03cfe220, 0x00b6e222, 0x03a3a446, 0x0164b85f, 0x02421e07, 0x029f2562, 0x00738488, 0x00247732, 0x035e022c, 0x003afb9c}}}, + {X: Field{[10]uint32{0x0021ef54, 0x036414ce, 0x01661838, 0x030d1ed9, 0x01635469, 0x00d2585a, 0x01a62832, 0x0372d84f, 0x030362a6, 0x00304215}}, Y: Field{[10]uint32{0x00eaf517, 0x033e6cd3, 0x01cdec38, 0x03760ade, 0x0044511c, 0x002b531f, 0x002cac14, 0x02a3acb7, 0x02c8c1e6, 0x003f9910}}}, + {X: Field{[10]uint32{0x0308c11d, 0x00e5976b, 0x00768d5a, 0x0334be9b, 0x0383477f, 0x01908a41, 0x01454765, 0x0049fd67, 0x011cfcaf, 0x003c27a7}}, Y: Field{[10]uint32{0x03c15d10, 0x03e593a2, 0x009a27e8, 0x018f3fb3, 0x01a5b2e6, 0x0175fbf6, 0x0028fc9c, 0x03ec56fd, 0x03221f44, 0x0003c069}}}, + {X: Field{[10]uint32{0x015c4527, 0x0309dfd2, 0x0341a036, 0x017f80f4, 0x03fd3e80, 0x035c6d65, 0x00b3b179, 0x00fafb62, 0x02ef1e47, 0x00180918}}, Y: Field{[10]uint32{0x03a079c3, 0x0387db58, 0x02ce2844, 0x02c7ae74, 0x02fed2a9, 0x00fc8567, 0x02d9f235, 0x00773aaa, 0x00617141, 0x003e476d}}}, + {X: Field{[10]uint32{0x01bb582d, 0x0065ff82, 0x03c70720, 0x004c25ae, 0x016b828d, 0x0049a883, 0x00ae3558, 0x0267e841, 0x001e8e0d, 0x0009cea2}}, Y: Field{[10]uint32{0x004b0d5d, 0x00d2869a, 0x003da295, 0x01d5e68b, 0x00d1b407, 0x03ddadb0, 0x03b2f727, 0x02e45334, 0x005814a7, 0x0016ec9b}}}, + {X: Field{[10]uint32{0x000cd54d, 0x03237cba, 0x03d9f566, 0x00107691, 0x01e8cd05, 0x01bf263e, 0x02f41723, 0x032dcad0, 0x03460616, 0x001f077c}}, Y: Field{[10]uint32{0x03c41dd7, 0x02b58c13, 0x033b9390, 0x00bb059d, 0x0073153c, 0x02f04956, 0x03a8d456, 0x02e6f916, 0x020dd602, 0x002b4f9f}}}, + {X: Field{[10]uint32{0x01942f94, 0x0319544f, 0x006d3c62, 0x02c14e5e, 0x039ad644, 0x033a002d, 0x014551f3, 0x03c451ce, 0x0234657f, 0x001e5b89}}, Y: Field{[10]uint32{0x014f1c60, 0x0331f0a8, 0x01b11bb1, 0x01aa1003, 0x001e8ec6, 0x00c02069, 0x0080eb9c, 0x01c44431, 0x0238ed58, 0x002d96ef}}}, + {X: Field{[10]uint32{0x02302bd1, 0x02f7b586, 0x00206193, 0x016d80bf, 0x0062b056, 0x029990b2, 0x029953a2, 0x03da2a91, 0x01fa9985, 0x001789d8}}, Y: Field{[10]uint32{0x0253e274, 0x036eb15c, 0x030b4713, 0x036adf50, 0x003715c9, 0x0144d9f4, 0x0347c070, 0x013d740b, 0x03709db2, 0x0016e826}}}, + {X: Field{[10]uint32{0x03abe794, 0x0049b153, 0x010e6164, 0x008a636e, 0x005c004c, 0x02891ad0, 0x01ab0385, 0x00683fac, 0x0092fd34, 0x00119163}}, Y: Field{[10]uint32{0x03446725, 0x028f7635, 0x033eaf02, 0x02bbbb3c, 0x029d018f, 0x018fc729, 0x02fc3242, 0x0106e162, 0x028b3453, 0x00021675}}}, + {X: Field{[10]uint32{0x01153265, 0x00de6960, 0x0152c5c7, 0x00d32fee, 0x00a410e1, 0x01bd3989, 0x009ddc3d, 0x01f073ff, 0x0030bf81, 0x003f1206}}, Y: Field{[10]uint32{0x01322551, 0x0289e1d6, 0x02169a43, 0x017eb3a3, 0x038dfe38, 0x03676d2a, 0x0248e89f, 0x01f68512, 0x0228bd3d, 0x0028622c}}}, + {X: Field{[10]uint32{0x02ed03e6, 0x00984357, 0x01901779, 0x019a012b, 0x033a7804, 0x038abb6f, 0x0302742c, 0x029540f1, 0x027d9771, 0x0010b65d}}, Y: Field{[10]uint32{0x02d50417, 0x03a87096, 0x003ece89, 0x01a34376, 0x03d2e0f5, 0x000b490c, 0x02c782be, 0x03ccdce8, 0x032e9764, 0x0037da50}}}, + {X: Field{[10]uint32{0x01477148, 0x00bd386e, 0x004dcdc7, 0x03f74a38, 0x02462dee, 0x0057b644, 0x02602226, 0x02ca5dcb, 0x0049993a, 0x000dc48b}}, Y: Field{[10]uint32{0x0196e39d, 0x00e08316, 0x0008ef1d, 0x037a9549, 0x02410b3e, 0x01900ae3, 0x00422cc3, 0x03ef0ea8, 0x00f0924c, 0x00189ffd}}}, + {X: Field{[10]uint32{0x006896c3, 0x003a8697, 0x00bb7314, 0x015e972e, 0x013619a5, 0x01db87ab, 0x03e52cca, 0x03f2f9d0, 0x018294ba, 0x00271520}}, Y: Field{[10]uint32{0x038f7fcc, 0x00efc16c, 0x014c50b5, 0x02cc8252, 0x02ec0478, 0x01c14130, 0x031dafbf, 0x0214a3b1, 0x032eb88e, 0x0017f311}}}, + {X: Field{[10]uint32{0x025a2db9, 0x01a6e03d, 0x02a077ae, 0x01ff58fc, 0x000a5927, 0x01c48d82, 0x004e0251, 0x007da5d7, 0x02d7aa5b, 0x001ee75e}}, Y: Field{[10]uint32{0x017d1bf8, 0x03587f43, 0x0012fabf, 0x01729d5a, 0x02c4a7f1, 0x01453b2b, 0x01c14d6f, 0x0288a740, 0x02e8714a, 0x001b3787}}}, + {X: Field{[10]uint32{0x00a9a102, 0x00737a96, 0x0153e017, 0x0141b1df, 0x026990e9, 0x0107820b, 0x016d948e, 0x01582b59, 0x02f2c985, 0x002bd776}}, Y: Field{[10]uint32{0x00a5b505, 0x01607e7b, 0x003f5fd4, 0x0123bfe5, 0x011f6853, 0x03385ad6, 0x0039ff76, 0x01bfcf12, 0x011b7289, 0x0038d211}}}, + {X: Field{[10]uint32{0x0111293d, 0x03b2da48, 0x029a395b, 0x02d0538a, 0x01d26394, 0x03834559, 0x03ab3662, 0x02f46417, 0x0318e957, 0x0010999f}}, Y: Field{[10]uint32{0x02bbc7a5, 0x00083559, 0x022a2e57, 0x02c6bb2a, 0x033c0076, 0x03f895e5, 0x03fb16c1, 0x02ed8d39, 0x02b269e9, 0x000a2374}}}, + {X: Field{[10]uint32{0x00b276d7, 0x01506dd0, 0x03618587, 0x01857966, 0x029be971, 0x00c99973, 0x002a5a6f, 0x020c99d3, 0x021d50ab, 0x0017a71e}}, Y: Field{[10]uint32{0x03a11f17, 0x02115b57, 0x035b1a29, 0x0063b822, 0x02ec4664, 0x031c1d12, 0x0292c612, 0x02bd08d0, 0x00611f39, 0x00248a0d}}}, + {X: Field{[10]uint32{0x03ed8b2a, 0x0293ca37, 0x03c489a2, 0x001a2d1a, 0x038b52b5, 0x02cc82e5, 0x00d9ac97, 0x02d608ad, 0x03faf486, 0x00263183}}, Y: Field{[10]uint32{0x005280f9, 0x01eca6dd, 0x0132b580, 0x0212bb70, 0x0170416d, 0x001bb6f9, 0x02f42fa3, 0x01255604, 0x0113c253, 0x00287098}}}, + {X: Field{[10]uint32{0x0385babc, 0x01d66770, 0x0116cf0a, 0x007f6199, 0x03f30948, 0x00d43969, 0x0286e71f, 0x00b364f0, 0x01821ed5, 0x0024afea}}, Y: Field{[10]uint32{0x02c1ddb4, 0x02ba7b6c, 0x03cb802f, 0x024a545a, 0x036f5276, 0x037f893d, 0x0254e738, 0x02d2c6de, 0x0396c71a, 0x0028ff25}}}, + {X: Field{[10]uint32{0x025b865f, 0x025ce0be, 0x018c4ec1, 0x02e40eec, 0x037b7798, 0x000ac30d, 0x02413e84, 0x02d67eb3, 0x0008bd8e, 0x0026f89d}}, Y: Field{[10]uint32{0x027a2f61, 0x03a2ff69, 0x00027f54, 0x00a54093, 0x02def3ec, 0x02ee4b77, 0x02ed2c81, 0x01a8e5a3, 0x01801964, 0x00044215}}}, + {X: Field{[10]uint32{0x036350bc, 0x02e711a5, 0x018275b1, 0x01676e79, 0x037751bc, 0x0302462f, 0x0391ce38, 0x02c165ad, 0x026cb7ba, 0x0009f35a}}, Y: Field{[10]uint32{0x03faeda8, 0x03e03ba0, 0x00011a16, 0x01353fad, 0x032f41d0, 0x01a19479, 0x03761df0, 0x00ab17c4, 0x01678fce, 0x00224354}}}, + {X: Field{[10]uint32{0x0068f2eb, 0x022073bd, 0x00e1f5d8, 0x00f25bcc, 0x035f22be, 0x00319918, 0x00f6597a, 0x0184e532, 0x014daaf9, 0x003a25b8}}, Y: Field{[10]uint32{0x0196030b, 0x027cacec, 0x027260bb, 0x02136b74, 0x02efea7e, 0x03622eb2, 0x00d971af, 0x006ac771, 0x00b0512c, 0x002fac01}}}, + {X: Field{[10]uint32{0x013f8ec0, 0x030359f9, 0x033da54e, 0x0226142e, 0x03a9dd23, 0x03eacb03, 0x00b3779e, 0x0150058d, 0x0269ac48, 0x000938b4}}, Y: Field{[10]uint32{0x0219e525, 0x026a9600, 0x02460892, 0x016f907e, 0x03f5beda, 0x018e8168, 0x03ca2ca6, 0x0353080e, 0x02c2642b, 0x00379c0b}}}, + {X: Field{[10]uint32{0x001d1676, 0x0367025a, 0x03db95a9, 0x00077829, 0x009b5c4d, 0x02c48694, 0x010159b4, 0x03279175, 0x03c948c1, 0x0025e989}}, Y: Field{[10]uint32{0x033203d9, 0x01fba49b, 0x00b9ffef, 0x03e69f24, 0x018d5f3c, 0x03d75708, 0x02d43037, 0x0270a7f2, 0x015b5539, 0x00066f42}}}, + {X: Field{[10]uint32{0x0195b08f, 0x0354dc1c, 0x0014b40b, 0x01807e82, 0x0033ed67, 0x0274f214, 0x03234c7f, 0x03b17ddd, 0x0251e604, 0x0029c360}}, Y: Field{[10]uint32{0x00bccc4f, 0x009b542b, 0x01f4e0e1, 0x0225aa16, 0x0385325a, 0x031c4350, 0x012c016a, 0x00f78fc5, 0x010774e2, 0x0037ca36}}}, + {X: Field{[10]uint32{0x0242f42b, 0x023056be, 0x0012ea7c, 0x025cdbcd, 0x0327743a, 0x00f5e2c5, 0x001a0071, 0x0191cb38, 0x00434b27, 0x000b59db}}, Y: Field{[10]uint32{0x01fa7312, 0x03023ff2, 0x018ea024, 0x00f0ce52, 0x0052fa70, 0x0020ada1, 0x03b8f941, 0x0174c900, 0x01e406ef, 0x002f8a33}}}, + {X: Field{[10]uint32{0x00b29cf5, 0x0350ad00, 0x0172928f, 0x00a6d283, 0x0246c89d, 0x03c9f00d, 0x03857cfc, 0x01c9d576, 0x01e17516, 0x003d9b09}}, Y: Field{[10]uint32{0x03193201, 0x009b7a71, 0x01b6e059, 0x00c6eb5a, 0x028d2a02, 0x03670632, 0x0049150c, 0x02a21130, 0x02d422c4, 0x000fb88e}}}, + {X: Field{[10]uint32{0x02427060, 0x024f5f40, 0x01c6c293, 0x02b6393f, 0x01ce6e77, 0x013a3801, 0x004f81d2, 0x0361fbbd, 0x004b9d39, 0x0036e91f}}, Y: Field{[10]uint32{0x018d7622, 0x03b6eecf, 0x03597338, 0x022e7f3e, 0x015240f2, 0x0370ed71, 0x037eedd4, 0x00003c25, 0x0092e53d, 0x000b5719}}}, + {X: Field{[10]uint32{0x03e10f0f, 0x03e20549, 0x0301bbfd, 0x0197c20e, 0x0294788f, 0x024768ed, 0x015aedae, 0x01f71562, 0x01d94f62, 0x00285d80}}, Y: Field{[10]uint32{0x020a1183, 0x036100cd, 0x00890fa3, 0x016d178c, 0x020baded, 0x026416ce, 0x03025bd9, 0x006c56be, 0x03c8cfea, 0x001d0227}}}, + {X: Field{[10]uint32{0x0180e141, 0x03ce84d3, 0x003d5188, 0x030d53ae, 0x011c24c6, 0x03edeb23, 0x0261a125, 0x03fa41f8, 0x009fb84a, 0x00375c0c}}, Y: Field{[10]uint32{0x00bed563, 0x00d94d51, 0x018682a8, 0x019bd955, 0x024bdfd5, 0x03223777, 0x035b7862, 0x029dfe74, 0x02c0ac93, 0x000c8052}}}, + {X: Field{[10]uint32{0x03037afd, 0x015dda21, 0x003f783b, 0x024e4832, 0x03cadefb, 0x0131a8bc, 0x01253f00, 0x02ebe5c0, 0x003de746, 0x001e7f54}}, Y: Field{[10]uint32{0x00a61b93, 0x035a437b, 0x0317f1e0, 0x000023a2, 0x0286a4e6, 0x011e948f, 0x0220c266, 0x0024c4fe, 0x02586318, 0x000f172d}}}, + {X: Field{[10]uint32{0x020ff6a0, 0x00b048ae, 0x009566b9, 0x022a4d58, 0x021e7265, 0x01a8a692, 0x00eb8961, 0x0358ec7d, 0x037d77c7, 0x00346abc}}, Y: Field{[10]uint32{0x00a93bec, 0x004e514f, 0x0232ecfd, 0x0276766b, 0x00c7cac3, 0x03d0d6f7, 0x01f0e0bb, 0x02e81caf, 0x03ae5cfb, 0x00394d6d}}}, + {X: Field{[10]uint32{0x02d93c4f, 0x0149d5ea, 0x016445c7, 0x01635966, 0x01fe525d, 0x033690d1, 0x02b74fc2, 0x03652e6d, 0x0382b351, 0x001a3fc6}}, Y: Field{[10]uint32{0x0065a13c, 0x0063cead, 0x0192b798, 0x01d21460, 0x019186e3, 0x01764ef7, 0x02194aac, 0x02b02341, 0x02f1c422, 0x002aeec3}}}, + {X: Field{[10]uint32{0x0210552d, 0x00701665, 0x0224a5c4, 0x02898bb3, 0x0314393e, 0x01329921, 0x01b73bcf, 0x00f97417, 0x00971806, 0x00089e17}}, Y: Field{[10]uint32{0x021d8774, 0x00606aab, 0x018c4157, 0x0128972e, 0x021933e6, 0x029d735b, 0x005e75c8, 0x02a03093, 0x026ad7a7, 0x00270200}}}, + {X: Field{[10]uint32{0x035ffebf, 0x007c9113, 0x00580889, 0x018e9df6, 0x02e26780, 0x03f085d8, 0x00662583, 0x02dd5d7c, 0x01e7563f, 0x00189b2d}}, Y: Field{[10]uint32{0x028498b4, 0x01c32f19, 0x0211cce1, 0x0289598b, 0x01953a6d, 0x02a61470, 0x01161845, 0x030fc90d, 0x03f672c3, 0x00020da7}}}, + {X: Field{[10]uint32{0x00d12d2a, 0x01a3d6a0, 0x01ac55e6, 0x0392dbeb, 0x0061c8c4, 0x022293ca, 0x03fa430b, 0x01841603, 0x02f4d6f4, 0x002a67c3}}, Y: Field{[10]uint32{0x01053d06, 0x03fccfac, 0x00d3e28f, 0x012be0c1, 0x024e2f06, 0x02b8abbd, 0x0002c406, 0x00020dde, 0x032939db, 0x0025cab7}}}, + {X: Field{[10]uint32{0x03f02645, 0x00c77a71, 0x03e61019, 0x00f32acf, 0x03784afe, 0x03efa52a, 0x000a3fbd, 0x02cb6f2e, 0x02272ff0, 0x002c90f3}}, Y: Field{[10]uint32{0x020b7559, 0x0011238d, 0x03e9f41a, 0x0161188a, 0x023e85b8, 0x03a9460d, 0x0233df8f, 0x0320831c, 0x0119fbb8, 0x0036cbab}}}, + {X: Field{[10]uint32{0x0363deb3, 0x037d5c10, 0x022f3f8b, 0x019150c8, 0x0143efb2, 0x002877fd, 0x031b21a0, 0x02d8b1a9, 0x009d685c, 0x0031d38f}}, Y: Field{[10]uint32{0x01c4b2ec, 0x00d121bb, 0x03ed4387, 0x02d87a0c, 0x025cd550, 0x013bed86, 0x00358efc, 0x00f4168e, 0x0261fbf2, 0x00261f60}}}, + {X: Field{[10]uint32{0x01f71c47, 0x01bbc377, 0x03047888, 0x03090f70, 0x01d34710, 0x03025ba7, 0x00885f34, 0x01352f47, 0x00a7fc98, 0x003fcbd9}}, Y: Field{[10]uint32{0x006e906d, 0x006a16a8, 0x0249765e, 0x0035e17c, 0x0309eac6, 0x01a43035, 0x02c91257, 0x00bf7c7b, 0x0258fd5e, 0x00053018}}}, + {X: Field{[10]uint32{0x03712085, 0x0188506e, 0x01badec1, 0x0053da86, 0x026819b5, 0x0103dd0e, 0x02e8a8b1, 0x02ac934d, 0x00e13f4c, 0x001f64b1}}, Y: Field{[10]uint32{0x01b698c8, 0x01bd05a0, 0x033d1b72, 0x00839af8, 0x003e0dc9, 0x0369a1ae, 0x03193309, 0x035f4aa6, 0x03622ec7, 0x00181ad5}}}, + {X: Field{[10]uint32{0x03e13b6c, 0x03495183, 0x01518a0b, 0x0083fef3, 0x024ce0cc, 0x01e54580, 0x009487c7, 0x014a2627, 0x014d9ef4, 0x0000e90f}}, Y: Field{[10]uint32{0x01deb36e, 0x028ff036, 0x01912dfb, 0x02854d26, 0x00eedad2, 0x01ac49aa, 0x0228d61e, 0x024179ae, 0x03255768, 0x0017c934}}}, + {X: Field{[10]uint32{0x02a25f8f, 0x010a9b3b, 0x02308673, 0x0016cf19, 0x026e59fd, 0x01c74317, 0x00c67e73, 0x01793457, 0x03028010, 0x000239cb}}, Y: Field{[10]uint32{0x016b368e, 0x00767782, 0x015099ea, 0x02b66ef7, 0x031eada5, 0x01ede6c0, 0x01870da4, 0x02e1b7c2, 0x005158fd, 0x00025377}}}, + {X: Field{[10]uint32{0x00ef54dd, 0x03404f33, 0x02d6bfd9, 0x02c3961c, 0x02ab8789, 0x00d0fc4b, 0x037f9d18, 0x009d8b29, 0x00236dc0, 0x002e273f}}, Y: Field{[10]uint32{0x011141cd, 0x01ee4110, 0x0037d2ba, 0x0173c7dd, 0x01c3ad13, 0x03e18344, 0x02ce6f9d, 0x0265ad29, 0x028545a5, 0x0027269c}}}, + {X: Field{[10]uint32{0x01ccb59b, 0x03924410, 0x03ebbc64, 0x00f8b11c, 0x016744a4, 0x01892ced, 0x0190b535, 0x01a2d2ec, 0x00089798, 0x003a17b8}}, Y: Field{[10]uint32{0x02cbd6a2, 0x01d69484, 0x01723a80, 0x022fe10b, 0x010e1c9a, 0x01fb7747, 0x03e3b3d0, 0x03143089, 0x030f9ede, 0x0034ebf9}}}, + {X: Field{[10]uint32{0x02cb97b5, 0x035764ed, 0x01b3bfb0, 0x0144e645, 0x02f7f906, 0x0144d019, 0x00c8e16d, 0x01b4564f, 0x03f2774d, 0x0036375a}}, Y: Field{[10]uint32{0x035e26f4, 0x015bd294, 0x02b2c6d2, 0x03464544, 0x0325f7e6, 0x0217a7e2, 0x0031862b, 0x013cfc45, 0x00945f73, 0x0016880c}}}, + {X: Field{[10]uint32{0x02aa94e8, 0x00e1689d, 0x02aec3e6, 0x03be634d, 0x00033968, 0x0344cf61, 0x03bd5545, 0x02f7ad17, 0x01c5328f, 0x001df820}}, Y: Field{[10]uint32{0x00c2959a, 0x02daf845, 0x01669c0c, 0x02de4688, 0x00ba597f, 0x03820141, 0x026291a3, 0x03cbe116, 0x03f7ca25, 0x000b3a14}}}, + {X: Field{[10]uint32{0x03c904ab, 0x0311e7d9, 0x018c4fb9, 0x00f6c6b4, 0x02b5b920, 0x0127c1e8, 0x020b82f5, 0x025a09a0, 0x02eae8a4, 0x001441e1}}, Y: Field{[10]uint32{0x039cd96b, 0x025a19eb, 0x018a8fbd, 0x0307aac7, 0x00b39382, 0x0077219d, 0x03e21ae7, 0x031a7fd8, 0x03854e4d, 0x003704c0}}}, + {X: Field{[10]uint32{0x0242639d, 0x0109e268, 0x00ddabb6, 0x00cceaf0, 0x021169e4, 0x00203430, 0x0121056e, 0x0356d930, 0x02b3fbda, 0x000beebf}}, Y: Field{[10]uint32{0x00405cd3, 0x03e29f05, 0x031c92f3, 0x03257a97, 0x015ff199, 0x0074face, 0x019ef0a1, 0x02853796, 0x002fd9e6, 0x0002a176}}}, + {X: Field{[10]uint32{0x0312ae0a, 0x00ad791e, 0x02ae673b, 0x002478a3, 0x02aec808, 0x02d7c031, 0x03fbbc26, 0x0118f07c, 0x03eb6e6e, 0x0008036f}}, Y: Field{[10]uint32{0x03a95ecf, 0x0370072e, 0x0344ac59, 0x01dbf346, 0x03832127, 0x01524609, 0x021f0711, 0x00f65e0f, 0x0219bdaa, 0x001214a8}}}, + {X: Field{[10]uint32{0x00b8a3d9, 0x03fcaf89, 0x00ab41ac, 0x01c95086, 0x013ec225, 0x014b36e1, 0x03d46b6e, 0x03df7024, 0x00f60259, 0x0009ec50}}, Y: Field{[10]uint32{0x00583387, 0x02a9fff0, 0x00f7bc85, 0x018dc69d, 0x0228bb5d, 0x004c38c4, 0x00054c4f, 0x02b6eb50, 0x009f70cb, 0x000f3bb4}}}, + {X: Field{[10]uint32{0x015b7e71, 0x03592afa, 0x00a0fcd1, 0x032b5ca3, 0x000e175c, 0x0130ac0b, 0x022ec351, 0x014c4608, 0x01ee535c, 0x003f9250}}, Y: Field{[10]uint32{0x011f56f6, 0x01c013b9, 0x0370ed35, 0x03796172, 0x03748e0a, 0x02992b68, 0x01cb4422, 0x01946f62, 0x01ae286d, 0x003a7372}}}, + {X: Field{[10]uint32{0x01ff1cdf, 0x00e4979d, 0x01d885a0, 0x03b5664d, 0x030ce47c, 0x016f8bc5, 0x03443d76, 0x0252f4db, 0x009b4cae, 0x000c5f48}}, Y: Field{[10]uint32{0x02262d72, 0x01297ae2, 0x02864543, 0x037de298, 0x02c942a5, 0x02daa007, 0x03945af4, 0x015c703f, 0x009568fe, 0x00030645}}}, + {X: Field{[10]uint32{0x0093f9ea, 0x026850f3, 0x02cead9f, 0x002d64f3, 0x03df32e8, 0x00543a6a, 0x005f8ab0, 0x00c391dc, 0x0377764e, 0x003e5469}}, Y: Field{[10]uint32{0x03afd925, 0x01c3c548, 0x03052655, 0x00ec46b8, 0x026ac261, 0x004b3777, 0x00cc6b8b, 0x0088fb9b, 0x01d625f2, 0x003bee54}}}, + {X: Field{[10]uint32{0x0389c8ef, 0x007cd10c, 0x0284d309, 0x03d9b968, 0x024f251a, 0x03f925aa, 0x03229a9f, 0x023a2fc3, 0x00ebf5fd, 0x001c6b7c}}, Y: Field{[10]uint32{0x036969f4, 0x039957da, 0x0242539c, 0x01cb9d9d, 0x0198ed56, 0x0371ceb7, 0x00dfdf72, 0x0154d99d, 0x0063293a, 0x0004fd1d}}}, + {X: Field{[10]uint32{0x0236be75, 0x00471140, 0x02ea5009, 0x007a07db, 0x02c3fbab, 0x03518d04, 0x01cff39a, 0x03a03526, 0x000658c0, 0x0000ba81}}, Y: Field{[10]uint32{0x014f923f, 0x018ef225, 0x02234291, 0x03b7fbb8, 0x03d82c08, 0x02682938, 0x01743d20, 0x00dc87c2, 0x00740607, 0x0002f94b}}}, + {X: Field{[10]uint32{0x02182aea, 0x02df946d, 0x009350d9, 0x00b6589e, 0x03a37344, 0x00fc2c7c, 0x00c42223, 0x020309d4, 0x03904b3e, 0x00108d48}}, Y: Field{[10]uint32{0x01221d91, 0x03fb59f6, 0x02966395, 0x023e053e, 0x000fe09e, 0x02580c89, 0x008e48ba, 0x014598c3, 0x0349b27b, 0x001fd608}}}, + {X: Field{[10]uint32{0x027dda91, 0x03eae7be, 0x00e53771, 0x027b7023, 0x017702a2, 0x026af82d, 0x0064bf8e, 0x00a16e58, 0x0082a92b, 0x0014934f}}, Y: Field{[10]uint32{0x00f29c3a, 0x011c903c, 0x01894ec7, 0x01dc34fb, 0x00366a84, 0x00c6ff57, 0x0368e053, 0x02cb7352, 0x0217fdc6, 0x00291e80}}}, + {X: Field{[10]uint32{0x0056f7e8, 0x02eb85b0, 0x00c48776, 0x02bf45af, 0x000fc83c, 0x008c8ca7, 0x02eb5f5f, 0x013799aa, 0x02085ce0, 0x003dbb87}}, Y: Field{[10]uint32{0x00cea4d9, 0x01ab1b6f, 0x03c75c2f, 0x017462c9, 0x00ccbc95, 0x0251f5ed, 0x01939774, 0x03526aa8, 0x026a7e2b, 0x000cca2c}}}, + {X: Field{[10]uint32{0x03273978, 0x01345ac5, 0x03dae313, 0x01be6f64, 0x002ea84e, 0x0141df48, 0x02b5d119, 0x00505dc8, 0x012bb88f, 0x00270bdf}}, Y: Field{[10]uint32{0x01ab2a3a, 0x006f8f0b, 0x007daa57, 0x032bb94c, 0x01d338a4, 0x031795af, 0x033c5927, 0x02d0d739, 0x000366c8, 0x0004227c}}}, + {X: Field{[10]uint32{0x0299cc3c, 0x0204f1b2, 0x0228f9b9, 0x01ed23bf, 0x0305897b, 0x014eb879, 0x0124f152, 0x02db947f, 0x02b6730f, 0x00164e87}}, Y: Field{[10]uint32{0x0344f079, 0x00cc005d, 0x00ace404, 0x006a8ec7, 0x0109e35c, 0x03dd3946, 0x003a6300, 0x00b646f0, 0x0020fbd2, 0x003f3ede}}}, + {X: Field{[10]uint32{0x01f957e3, 0x00d4ac54, 0x039f40ef, 0x03ff7968, 0x028ec0ea, 0x01fe1e97, 0x004bc603, 0x02eb32f3, 0x00c383a7, 0x0018ae84}}, Y: Field{[10]uint32{0x007bdd45, 0x01fa7f33, 0x020bec2a, 0x003b5e99, 0x019fd01e, 0x02828940, 0x025fa19a, 0x02858695, 0x01b0dc84, 0x003099e8}}}, + {X: Field{[10]uint32{0x03731f64, 0x00f18657, 0x03c6a6d7, 0x0240529d, 0x0239e123, 0x00e92a76, 0x03641fe0, 0x018a858f, 0x0010deae, 0x000778ab}}, Y: Field{[10]uint32{0x03c8d2b2, 0x0106a276, 0x00006d71, 0x017e9bd4, 0x00a512b7, 0x0208853f, 0x027b5ad7, 0x025a7410, 0x0095b6d7, 0x00183d0f}}}, + {X: Field{[10]uint32{0x03d4e1d3, 0x0105b083, 0x02a6da43, 0x01c5ab2e, 0x00c48e92, 0x005dcbc6, 0x01086123, 0x020f220f, 0x01527090, 0x003c4695}}, Y: Field{[10]uint32{0x02d742f4, 0x024d4528, 0x03f4cdf5, 0x015368bc, 0x002be515, 0x02356cec, 0x00e397b3, 0x023106db, 0x01647cf4, 0x0029b42b}}}, + {X: Field{[10]uint32{0x00dc33fc, 0x02ba5b5f, 0x0243d2ae, 0x00fc45b0, 0x013dbad4, 0x032971fd, 0x015cc01f, 0x025f9487, 0x0240d756, 0x003d1151}}, Y: Field{[10]uint32{0x02549102, 0x0213de59, 0x026cfb37, 0x01af133d, 0x036b2599, 0x029d3b21, 0x02d70531, 0x01dc1175, 0x00ef46fe, 0x0010a5cb}}}, + {X: Field{[10]uint32{0x01b8780a, 0x00bb2368, 0x01ad4cad, 0x023423b3, 0x0110905b, 0x02cc67eb, 0x03c20fa3, 0x0019f06d, 0x007397be, 0x000afebc}}, Y: Field{[10]uint32{0x02590285, 0x03314993, 0x03cd5775, 0x02c57e08, 0x039077de, 0x025c3d3e, 0x028bdee9, 0x03259cf4, 0x0099ea97, 0x003b5499}}}, + {X: Field{[10]uint32{0x00f5f73b, 0x03153dd3, 0x01222cfe, 0x01623b5a, 0x026df6e0, 0x0108bdce, 0x023ca163, 0x03b642f7, 0x00812b5f, 0x003f06af}}, Y: Field{[10]uint32{0x032b975f, 0x03444da5, 0x01d8faf0, 0x01bd3fa7, 0x007ac68f, 0x02c73471, 0x00481dc4, 0x03f2f91a, 0x02db471c, 0x0036c71b}}}, + {X: Field{[10]uint32{0x00506a8d, 0x01db9bd3, 0x00c76124, 0x017ef8c7, 0x01b717d6, 0x024f00ab, 0x036f92d2, 0x00be6e8d, 0x02ac82e0, 0x00360e30}}, Y: Field{[10]uint32{0x01189377, 0x01ecc68d, 0x02ae251d, 0x032cf83d, 0x03532dd1, 0x01faac48, 0x0176f6ca, 0x03e380f0, 0x00670388, 0x00361e8c}}}, + {X: Field{[10]uint32{0x013ee38c, 0x025f81ac, 0x004b92f6, 0x03c4ce87, 0x0132c53f, 0x0269794e, 0x019d54ca, 0x015d2689, 0x02ff0729, 0x0012cea0}}, Y: Field{[10]uint32{0x028d6265, 0x02cc1d6e, 0x0229032d, 0x012f95c2, 0x00bf6073, 0x03205484, 0x026a0c46, 0x0115b4fd, 0x0341a788, 0x00110dca}}}, + {X: Field{[10]uint32{0x00e411aa, 0x035ab4ff, 0x002f20b8, 0x02438de7, 0x008e79d2, 0x02f54bdc, 0x01eaf6a9, 0x02b538c9, 0x03f36731, 0x0035df2e}}, Y: Field{[10]uint32{0x038372f0, 0x026fe13f, 0x01b50525, 0x019928e1, 0x02051f42, 0x0122f6a6, 0x02812377, 0x004f1e46, 0x0125f078, 0x003b919b}}}, + {X: Field{[10]uint32{0x02ea1483, 0x03f1b4bb, 0x006ec84e, 0x00b303c7, 0x03bed187, 0x014eb0c1, 0x00a75dc9, 0x002e09bb, 0x02b25892, 0x000e19fd}}, Y: Field{[10]uint32{0x0388aee3, 0x019c4d6b, 0x01cf4b82, 0x03d1a2b0, 0x01254d70, 0x032a7172, 0x013ff18d, 0x02025e80, 0x02dce607, 0x00331a9a}}}, + {X: Field{[10]uint32{0x001b0a9a, 0x02d4bbf3, 0x01279930, 0x026301ed, 0x032123fe, 0x0083dfc5, 0x00ea7dff, 0x03213d86, 0x0075e85f, 0x001ec022}}, Y: Field{[10]uint32{0x03075f90, 0x0159802f, 0x03904a8c, 0x00d2d42e, 0x02331f78, 0x00541dcb, 0x0055a1c4, 0x0245a697, 0x00bb8dbc, 0x000fcecc}}}, + {X: Field{[10]uint32{0x0234ef3a, 0x02875de3, 0x009a5ba7, 0x01e81369, 0x02907e9b, 0x01352de5, 0x01795600, 0x0129261d, 0x00d91630, 0x002e96d1}}, Y: Field{[10]uint32{0x03333661, 0x0131d6f3, 0x01e13f87, 0x01d8fb4e, 0x024d47ea, 0x00373537, 0x02e124f0, 0x0278ee6e, 0x03aa4821, 0x0005ad26}}}, + {X: Field{[10]uint32{0x02b8d9df, 0x0358a738, 0x03594342, 0x0084d568, 0x02910fe5, 0x016fe991, 0x02b3a23b, 0x00483614, 0x03e27fe4, 0x001a47ab}}, Y: Field{[10]uint32{0x02c71d85, 0x01fe7e2d, 0x02878188, 0x007712f2, 0x01bd71ea, 0x01489f6f, 0x0294fd6a, 0x013729f0, 0x00974218, 0x0010e818}}}, + {X: Field{[10]uint32{0x00a54123, 0x001b9215, 0x002d8440, 0x035f0dd5, 0x01551377, 0x01177299, 0x0173e38a, 0x02a1bcd4, 0x00bbc9f5, 0x00004e9b}}, Y: Field{[10]uint32{0x00488620, 0x00625202, 0x004b884d, 0x023cc08f, 0x028a43d3, 0x03a3ebe7, 0x01cc2e62, 0x01367bff, 0x009c9a96, 0x003b3ce0}}}, + {X: Field{[10]uint32{0x02f10e45, 0x00ba3579, 0x036ceb71, 0x0080b730, 0x02da6654, 0x02d3c396, 0x01731e91, 0x01734a4f, 0x02f3fb59, 0x000cff4a}}, Y: Field{[10]uint32{0x018ed2cf, 0x00c79802, 0x00c31f63, 0x00c6cea5, 0x0280ca53, 0x00233e8e, 0x0181bf98, 0x0376912e, 0x007a0a8b, 0x00389a8c}}}, + {X: Field{[10]uint32{0x00b774f6, 0x02f962cd, 0x0244c15c, 0x02608bd3, 0x03b00332, 0x029d6124, 0x033ba575, 0x01fde1da, 0x003359e4, 0x001d6550}}, Y: Field{[10]uint32{0x020458a9, 0x01c0f797, 0x01253f8e, 0x00729eb4, 0x00b6e665, 0x0110b000, 0x02998553, 0x015a36c2, 0x004070b8, 0x001fba68}}}, + {X: Field{[10]uint32{0x035b9480, 0x0176965b, 0x032f3650, 0x01944340, 0x00b3dd36, 0x01052fbd, 0x0015e7e8, 0x01f9a13a, 0x03b0c3b1, 0x001e4667}}, Y: Field{[10]uint32{0x03d9a0ab, 0x02b0fb94, 0x021b5054, 0x020d0646, 0x00abaab3, 0x0128156e, 0x03aacba5, 0x03273fbc, 0x0173f358, 0x00256f2a}}}, + {X: Field{[10]uint32{0x011aa352, 0x01c00029, 0x017b5d6d, 0x0306b226, 0x006edd0b, 0x028cff50, 0x03ed64e0, 0x03382cb9, 0x00e7962e, 0x0025c17d}}, Y: Field{[10]uint32{0x019ff347, 0x0375ca12, 0x0399db2b, 0x0157dc6a, 0x0058f408, 0x024875b6, 0x026193d8, 0x011ea284, 0x0357ad45, 0x00135339}}}, + {X: Field{[10]uint32{0x012fd777, 0x0368f38c, 0x02e12df7, 0x01d6e2c5, 0x01cadeeb, 0x00dd99d3, 0x0160b983, 0x02ad7cc1, 0x0067b841, 0x002206bc}}, Y: Field{[10]uint32{0x0083b84f, 0x0337b24d, 0x037019ac, 0x00f468e8, 0x017588be, 0x02c512c7, 0x010f62d8, 0x03c175f0, 0x03d4512e, 0x0033304f}}}, + {X: Field{[10]uint32{0x00e99621, 0x0357d704, 0x012fb1f6, 0x02dcbf50, 0x0041bfc3, 0x01eb41e5, 0x02e14cd9, 0x032763d0, 0x024433c2, 0x003fa3de}}, Y: Field{[10]uint32{0x02b3b2a9, 0x00ff752d, 0x026572a9, 0x03cf311a, 0x034c8bab, 0x0211b1e6, 0x01c4ee3a, 0x010dd25b, 0x02ee0cf3, 0x00396d5d}}}, + {X: Field{[10]uint32{0x004d798f, 0x024eaf17, 0x006cb918, 0x01927814, 0x0384f400, 0x00f0d3a0, 0x012f8320, 0x022ce0fe, 0x00da18e0, 0x003fd0f2}}, Y: Field{[10]uint32{0x01df2e7f, 0x01f6c05f, 0x02fd5242, 0x00ce92ec, 0x02f5a754, 0x02076f61, 0x009dde19, 0x03680b03, 0x005923a9, 0x00295d68}}}, + {X: Field{[10]uint32{0x00db276b, 0x031bf54a, 0x00a42ed3, 0x0105cd9e, 0x03d8f9d8, 0x012ec6cc, 0x00852427, 0x0138844d, 0x0056b97f, 0x00011c54}}, Y: Field{[10]uint32{0x014302b2, 0x03e88061, 0x0212fcab, 0x03b99beb, 0x0073a18b, 0x02e62a8a, 0x00cd71ef, 0x03c767fa, 0x01463521, 0x002d3034}}}, + {X: Field{[10]uint32{0x031fff51, 0x0121c709, 0x00814974, 0x03acc6a2, 0x02acd85e, 0x02e0f9fb, 0x0251394c, 0x00756b0a, 0x0008c5f5, 0x00217276}}, Y: Field{[10]uint32{0x03666a7d, 0x024aef96, 0x01eb8b49, 0x0034660b, 0x02018505, 0x01bb1fd7, 0x0191454d, 0x026e219a, 0x03bf2382, 0x0000a9f0}}}, + {X: Field{[10]uint32{0x0170dac9, 0x0265fe5f, 0x02f24529, 0x031db5b4, 0x03f46b60, 0x000d1173, 0x00b4b259, 0x00da380f, 0x00ef8b1e, 0x00300ae5}}, Y: Field{[10]uint32{0x0325f3a0, 0x00d0f079, 0x021d680a, 0x028ab3e5, 0x0310fadb, 0x037874a2, 0x0017825a, 0x02079235, 0x0129bcff, 0x002eee5f}}}, + {X: Field{[10]uint32{0x00241df6, 0x011caa0e, 0x02db3e29, 0x018ffb9e, 0x020fcb8b, 0x034d4e87, 0x01ac4393, 0x01bdf90c, 0x03bd28e2, 0x0012c564}}, Y: Field{[10]uint32{0x02fdcc56, 0x0138d3bc, 0x00ef0d6e, 0x022cf332, 0x003f184f, 0x02b27616, 0x0225b113, 0x01a15498, 0x0328f496, 0x002299e9}}}, + {X: Field{[10]uint32{0x02a64dd4, 0x007353c9, 0x00dd231d, 0x01b92e77, 0x037a8e7f, 0x0354a1a6, 0x02505559, 0x037b8eb5, 0x015bba51, 0x003d901d}}, Y: Field{[10]uint32{0x0287e1c8, 0x03414e5b, 0x00882a48, 0x03215745, 0x0391e0e3, 0x03092b01, 0x0029f6ee, 0x00a42f53, 0x0000a53e, 0x001ce1fe}}}, + {X: Field{[10]uint32{0x0389515b, 0x01da5e5d, 0x0206e022, 0x008a4529, 0x0016d0a5, 0x01c233be, 0x036f42cd, 0x00db18f7, 0x02a94368, 0x002524d1}}, Y: Field{[10]uint32{0x00e2b356, 0x00e0ee6a, 0x00073031, 0x034fb797, 0x0031dd41, 0x021d505d, 0x025c847b, 0x000807bd, 0x032d952a, 0x002a40e4}}}, + {X: Field{[10]uint32{0x03f91a60, 0x01802299, 0x0245cde4, 0x020f172f, 0x02cdcc97, 0x026308bc, 0x010b1f66, 0x03b7f08e, 0x019ec769, 0x00060902}}, Y: Field{[10]uint32{0x011bd1e2, 0x0109d9cc, 0x02ae0adf, 0x0200de24, 0x02804a87, 0x03e82238, 0x02051f3b, 0x013755b3, 0x01fa81e0, 0x0003e101}}}, + {X: Field{[10]uint32{0x0201d341, 0x022b3475, 0x022f92ec, 0x02484e71, 0x00683aa7, 0x03a57cf7, 0x005f34cc, 0x00f64a20, 0x03d8e463, 0x0039ad1b}}, Y: Field{[10]uint32{0x001d824a, 0x0074c033, 0x011d1639, 0x02930a0e, 0x00d6c0be, 0x032fd636, 0x00faf4a7, 0x0298e94a, 0x0013f3fe, 0x0014cf6e}}}, + {X: Field{[10]uint32{0x03992b93, 0x010db3ff, 0x0015d60a, 0x014bc5d8, 0x03a04c62, 0x03504e74, 0x00d150d3, 0x02c63752, 0x0330dc19, 0x0018de66}}, Y: Field{[10]uint32{0x02dcc41b, 0x0336c345, 0x015073c3, 0x032cae8d, 0x0007f485, 0x03c1905e, 0x00e72f5f, 0x0137bb40, 0x01125ebf, 0x00098814}}}, + {X: Field{[10]uint32{0x02ad7338, 0x028a7c4b, 0x01676670, 0x00927c7f, 0x037fac53, 0x038dc2c3, 0x01b88d3a, 0x0280b7a1, 0x035ab1d5, 0x0023340b}}, Y: Field{[10]uint32{0x00c0d8e4, 0x03c2586f, 0x006278e2, 0x03bb10e4, 0x03511d56, 0x02f26ee9, 0x02cb70f0, 0x02275984, 0x02acceb6, 0x000d62d0}}}, + {X: Field{[10]uint32{0x01f82fab, 0x0286a7b7, 0x00991d3e, 0x0199282a, 0x01f76127, 0x03ccec19, 0x01aba41b, 0x034777a5, 0x03e6d48b, 0x00357859}}, Y: Field{[10]uint32{0x0271d1f7, 0x0309a1ab, 0x03d70849, 0x0188e095, 0x02aaf45f, 0x03361ab8, 0x00ec9cb3, 0x0337d3f1, 0x0182d653, 0x001b308e}}}, + {X: Field{[10]uint32{0x009bfdba, 0x006773df, 0x030cf4ff, 0x01096192, 0x01d72b19, 0x01fc0306, 0x034f09d9, 0x03cb7c4c, 0x01006987, 0x003101cd}}, Y: Field{[10]uint32{0x037ff262, 0x003274ff, 0x00ca82bf, 0x002b295a, 0x02b760ff, 0x000de3e0, 0x03366bf3, 0x004c9aa6, 0x00466b46, 0x003d959a}}}, + {X: Field{[10]uint32{0x00c4fde2, 0x0031eabc, 0x02b91184, 0x0303ecb7, 0x0229a7c2, 0x020e0c63, 0x0221db2a, 0x006fec22, 0x02719c50, 0x000277c7}}, Y: Field{[10]uint32{0x02d00fc0, 0x014c973e, 0x03ea580a, 0x016d0f7b, 0x03e977c7, 0x024079c0, 0x0315ae54, 0x00300ac0, 0x00ae6d0e, 0x003358a3}}}, + {X: Field{[10]uint32{0x024c696c, 0x022e134a, 0x0165b7d0, 0x01242b5c, 0x031c91c2, 0x0248b165, 0x03108ee6, 0x030c2408, 0x0029df73, 0x002545d9}}, Y: Field{[10]uint32{0x01c0fbe4, 0x0021b2fa, 0x000cbdd8, 0x02dc901d, 0x011994fb, 0x00dd724a, 0x02084700, 0x036f3208, 0x00493b62, 0x000fb3ff}}}, + {X: Field{[10]uint32{0x01628c6e, 0x023d8031, 0x0156da31, 0x021cd3d5, 0x02f57fe1, 0x012fa3ed, 0x03a7e0e9, 0x0034d784, 0x00e8692b, 0x001c2312}}, Y: Field{[10]uint32{0x0105a664, 0x0378c828, 0x029bfe1c, 0x0004fdf6, 0x005af7e6, 0x03da8bc0, 0x020432e9, 0x00747c9f, 0x0302deee, 0x00254d38}}}, + {X: Field{[10]uint32{0x025b4c09, 0x00732853, 0x0222b299, 0x030274c9, 0x0146275e, 0x02c9af85, 0x01620794, 0x031ce6d7, 0x017ab82d, 0x0009dd78}}, Y: Field{[10]uint32{0x031ccddc, 0x02de4206, 0x0152e8a9, 0x00a21d13, 0x03338ab2, 0x03684ca3, 0x02b52c28, 0x00d67f7b, 0x027c80e8, 0x000ea9bb}}}, + {X: Field{[10]uint32{0x030192da, 0x0248a700, 0x03270be1, 0x00d0f0e0, 0x0044da6b, 0x023ed228, 0x0334959b, 0x013cc73c, 0x02c2039c, 0x0011f06a}}, Y: Field{[10]uint32{0x000d7cc0, 0x038562d8, 0x003551fd, 0x0168848a, 0x00e5813f, 0x02681471, 0x01cd4025, 0x03087611, 0x011c5ba6, 0x00176b59}}}, + {X: Field{[10]uint32{0x00bad15e, 0x036a86ee, 0x02c70d77, 0x0353e8a2, 0x01eef459, 0x033e897c, 0x03b2bf59, 0x01325806, 0x005a4b86, 0x003e03d1}}, Y: Field{[10]uint32{0x0374ff16, 0x01ffdc2c, 0x02c8863f, 0x03d297c4, 0x0183cd57, 0x03a7e239, 0x00b9da6c, 0x01a659b4, 0x02046b8c, 0x0028e0f7}}}, + {X: Field{[10]uint32{0x014d2f66, 0x02e40faf, 0x01bf6f9c, 0x00967cb5, 0x02b22081, 0x01e2dc5c, 0x01f436d5, 0x00d866a3, 0x03b91ad3, 0x000a4939}}, Y: Field{[10]uint32{0x00841875, 0x022f6e12, 0x00effa76, 0x0156b58b, 0x02afa412, 0x005747c1, 0x00e4f3fe, 0x027d50d2, 0x0169e231, 0x002e1908}}}, + {X: Field{[10]uint32{0x02dc4d83, 0x01017cdd, 0x02e2af13, 0x0179df8c, 0x00431078, 0x028ae6b1, 0x001854e3, 0x013b4a0d, 0x007b91a6, 0x000df582}}, Y: Field{[10]uint32{0x01f25003, 0x02e65c4f, 0x01b1f9bd, 0x0024b094, 0x01a3ac9f, 0x00b9bf37, 0x023092f3, 0x02f32ea0, 0x0117e068, 0x000d688e}}}, + {X: Field{[10]uint32{0x00f4fab2, 0x0372e484, 0x00fd8391, 0x033a0a53, 0x03e000d2, 0x033e12d3, 0x003691cb, 0x006f81ad, 0x016dc79f, 0x0035d22a}}, Y: Field{[10]uint32{0x005bf51c, 0x031369bc, 0x036c8223, 0x009eabed, 0x00975c09, 0x02e05c8a, 0x017e5c04, 0x0240bb39, 0x01e065da, 0x001d6d2b}}}, + {X: Field{[10]uint32{0x002cc30c, 0x00cf41b9, 0x03a8fa02, 0x013b0957, 0x03949241, 0x00edbee5, 0x02361ea3, 0x0213fc98, 0x0225eb50, 0x0034174a}}, Y: Field{[10]uint32{0x01a6f2d2, 0x03ead81a, 0x00f4e75e, 0x02616ea6, 0x01ba57a1, 0x022a80f6, 0x03514290, 0x0323ce16, 0x02eececd, 0x00052eef}}}, + {X: Field{[10]uint32{0x003ff793, 0x022765d2, 0x0030278c, 0x03d7a2a3, 0x00b4684b, 0x0193b2a7, 0x03f39067, 0x03b6f96b, 0x015bd137, 0x001a6ea6}}, Y: Field{[10]uint32{0x03b63e32, 0x03864d96, 0x000b246d, 0x01b1c056, 0x01a79ad9, 0x007176e5, 0x033e8649, 0x01965a60, 0x0051b622, 0x000ac73d}}}, + {X: Field{[10]uint32{0x00419461, 0x00bfdc55, 0x0197d9a8, 0x03cbc7b2, 0x033a50af, 0x01418412, 0x020342ff, 0x033ca3f7, 0x01a15d0e, 0x001fc07a}}, Y: Field{[10]uint32{0x0112dc68, 0x037310eb, 0x030e5e03, 0x0196a0d1, 0x03d27040, 0x03b72ad8, 0x01e25d1f, 0x034dd4d8, 0x0194a6b8, 0x00070f25}}}, + {X: Field{[10]uint32{0x02e48cc6, 0x02902795, 0x0219d813, 0x000fc3e1, 0x00f2413d, 0x00613933, 0x0201bc47, 0x024107f4, 0x02fd193b, 0x001c648c}}, Y: Field{[10]uint32{0x0229a953, 0x00674f2b, 0x02d1e68b, 0x028197e0, 0x0312fb55, 0x03ab816a, 0x037ff609, 0x02c14d4c, 0x03187dcc, 0x000587f1}}}, + {X: Field{[10]uint32{0x02e78c27, 0x00f7219d, 0x03d082f5, 0x03e91b22, 0x039a63bc, 0x01ef4a2f, 0x006009a5, 0x01cc40ce, 0x0120155f, 0x00056e10}}, Y: Field{[10]uint32{0x01737816, 0x00b140cc, 0x03605140, 0x0283aa7e, 0x03188171, 0x0102b293, 0x0004e0c8, 0x01f8bfa6, 0x037ec901, 0x0011f758}}}, + {X: Field{[10]uint32{0x03fec567, 0x01301d2e, 0x01a2c007, 0x0389d053, 0x0004a95c, 0x02e9a645, 0x0352ed4e, 0x00011df6, 0x0197bd38, 0x003fd0a7}}, Y: Field{[10]uint32{0x017b3048, 0x016a8075, 0x00f2569a, 0x002b2f2e, 0x036708c0, 0x037ddf00, 0x0173f624, 0x016eacd2, 0x03bd6e63, 0x001ece9b}}}, + {X: Field{[10]uint32{0x010a6ee3, 0x02c79575, 0x01ed8858, 0x0012c984, 0x01379174, 0x00b1dfa0, 0x01f476d1, 0x039d333c, 0x005b016b, 0x0003335c}}, Y: Field{[10]uint32{0x00e87c01, 0x02bff0d0, 0x01f1f737, 0x0130c6b6, 0x020946cb, 0x025fde35, 0x0155e178, 0x02c94937, 0x01e75cc7, 0x0021d06b}}}, + {X: Field{[10]uint32{0x03b65b27, 0x030df542, 0x01534d54, 0x001a3526, 0x0294e4b4, 0x00c03b2a, 0x0278e818, 0x0315fe45, 0x025e24b3, 0x00196d86}}, Y: Field{[10]uint32{0x01ed0c40, 0x005a9d9d, 0x024fd79c, 0x031e9719, 0x02f65ac4, 0x02b82147, 0x0386fda2, 0x01ee0bc6, 0x0228aab9, 0x002435d7}}}, + {X: Field{[10]uint32{0x03a06ef0, 0x005067de, 0x00cf173c, 0x021f068e, 0x014ffe04, 0x0163ee39, 0x0382bdd7, 0x01cf650f, 0x01df8f40, 0x0019c54a}}, Y: Field{[10]uint32{0x00fede59, 0x01533f45, 0x029504d8, 0x01071c1d, 0x00454fd1, 0x03547af9, 0x01121e10, 0x00d26b74, 0x032d1f23, 0x00311b67}}}, + {X: Field{[10]uint32{0x001b0440, 0x008f3fe4, 0x035b68e8, 0x0375319c, 0x0073da3f, 0x002ef4b0, 0x02f8e703, 0x005a5c1e, 0x02760e7a, 0x0000abe2}}, Y: Field{[10]uint32{0x02c3c1cb, 0x03f40989, 0x0143f72f, 0x02b7597d, 0x017c34f5, 0x007b8cf3, 0x01659769, 0x01c54f1c, 0x03e79ada, 0x00155596}}}, + {X: Field{[10]uint32{0x03575707, 0x0251ca9b, 0x01fc42fb, 0x03543bd6, 0x024def3f, 0x01f31cc2, 0x00b3b1fb, 0x02ee1d3f, 0x016fc5ff, 0x002b3607}}, Y: Field{[10]uint32{0x01d181a3, 0x00a59180, 0x011cce09, 0x03258fa1, 0x02b87c0e, 0x001c6da5, 0x02f47eb5, 0x03aa7847, 0x028ec8b8, 0x00238c66}}}, + {X: Field{[10]uint32{0x00ffb912, 0x033a36e0, 0x0041bd60, 0x02a66e45, 0x02ae062c, 0x0182a9fc, 0x012d0bb3, 0x03a2f081, 0x03d53ab9, 0x002addf9}}, Y: Field{[10]uint32{0x01f96b5a, 0x0131d48b, 0x02d8fdfa, 0x0262d75b, 0x02aca909, 0x0075c104, 0x03992e5e, 0x02e56e7a, 0x02d9cb0a, 0x0017e4ad}}}, + {X: Field{[10]uint32{0x00124046, 0x0222acde, 0x03265e01, 0x03cded98, 0x031d7efa, 0x001a88c0, 0x03eda09b, 0x0231fbe2, 0x01951a6a, 0x001e62e0}}, Y: Field{[10]uint32{0x002b1bf6, 0x03e75138, 0x01de7a1b, 0x02d7c460, 0x03d91382, 0x0399d1db, 0x004a7e54, 0x0290c0d9, 0x021b0bae, 0x002564b6}}}, + {X: Field{[10]uint32{0x0377b096, 0x0354a2e5, 0x02f29ed6, 0x00e893fd, 0x009dbff9, 0x0222bad3, 0x01dea224, 0x039df637, 0x02ae0c3b, 0x003c921a}}, Y: Field{[10]uint32{0x0029126b, 0x0096aa12, 0x028cc413, 0x018a360e, 0x03d8409b, 0x00dabec2, 0x010327fe, 0x03211df1, 0x0150fe75, 0x00238acb}}}, + {X: Field{[10]uint32{0x006d2d54, 0x025d2205, 0x00333f93, 0x0220993d, 0x02d16ca0, 0x02bbbb9c, 0x0364ee33, 0x03aa2f83, 0x01093b8a, 0x00088b8f}}, Y: Field{[10]uint32{0x02cdcaa9, 0x02d4e772, 0x018a4351, 0x01e332c2, 0x0137ba1f, 0x0283af5e, 0x02dd16e8, 0x02ef1070, 0x000fbfe6, 0x0003bfd4}}}, + {X: Field{[10]uint32{0x0121c1c9, 0x02df4130, 0x01bd0165, 0x007670c8, 0x024f9924, 0x02d4f800, 0x01a18eea, 0x00d1d891, 0x03fe7ca9, 0x0019da34}}, Y: Field{[10]uint32{0x00272877, 0x02bba2e4, 0x00a43823, 0x0094340c, 0x000c4dc8, 0x027871de, 0x019ff1d0, 0x025c888c, 0x0173c9b9, 0x00100b27}}}, + {X: Field{[10]uint32{0x022dda79, 0x01fc263c, 0x00ef2513, 0x02133e32, 0x01b0b628, 0x03f5e057, 0x0325697b, 0x022033bf, 0x000fb2f0, 0x001bad9d}}, Y: Field{[10]uint32{0x0085c86f, 0x027c0fc5, 0x01b68520, 0x02579163, 0x0079c4b6, 0x03d0b9ab, 0x002061c1, 0x015c4f0c, 0x0131c12f, 0x0033dfa1}}}, + {X: Field{[10]uint32{0x025fe51b, 0x0001aaa5, 0x01ac2950, 0x0165c5ca, 0x025ede89, 0x019eda9f, 0x00f385f3, 0x0169faa8, 0x03484eb0, 0x001c407c}}, Y: Field{[10]uint32{0x00d5c3f3, 0x013e24c4, 0x0144be26, 0x01687912, 0x00260559, 0x01c6bf0b, 0x00fff9fc, 0x03edd5de, 0x0113a040, 0x002347ee}}}, + {X: Field{[10]uint32{0x02886579, 0x0239b4c3, 0x0287a11c, 0x03ab3bee, 0x02a0de03, 0x0080c0d8, 0x024b25f1, 0x028978ff, 0x005cacc6, 0x001d6a79}}, Y: Field{[10]uint32{0x03f69c6e, 0x01f00af3, 0x03f7adbe, 0x03e555a0, 0x02854c49, 0x00007f60, 0x0202cf31, 0x021b649a, 0x0195e919, 0x0014aa16}}}, + {X: Field{[10]uint32{0x0337dcbc, 0x0359cc0d, 0x001b2954, 0x03de0c2b, 0x02ceac14, 0x01fe66b7, 0x03ffc542, 0x0195ca62, 0x0192bad7, 0x000c4653}}, Y: Field{[10]uint32{0x03dd2832, 0x007fcfd7, 0x02f19a2d, 0x02f36b0b, 0x028c556e, 0x00f316f1, 0x02449fa3, 0x023bba74, 0x0045f531, 0x00267a07}}}, + {X: Field{[10]uint32{0x03d505af, 0x02562b02, 0x0123c522, 0x030e115f, 0x03c1d743, 0x002d3338, 0x02c61387, 0x01bd0e1a, 0x03fe76fd, 0x002413e8}}, Y: Field{[10]uint32{0x03c1763b, 0x02ab9069, 0x023045c8, 0x03ece55e, 0x018dae9b, 0x0131c165, 0x02929e45, 0x0118cde7, 0x02621adf, 0x002509cc}}}, + {X: Field{[10]uint32{0x00a8e0fd, 0x02a4ffe9, 0x01f26b5f, 0x0109e29f, 0x03040de1, 0x00fe8996, 0x019aedef, 0x022cc8da, 0x01f31a82, 0x00074618}}, Y: Field{[10]uint32{0x0099f7dc, 0x017d1376, 0x01f61199, 0x03098e99, 0x013ffc30, 0x0212ee59, 0x01306e3b, 0x03faca38, 0x0381f13f, 0x002e595d}}}, + {X: Field{[10]uint32{0x0019ad64, 0x0395179a, 0x0009b73c, 0x008a110f, 0x02aac959, 0x02159773, 0x02f0289e, 0x02975797, 0x01ef6de1, 0x000ef4cf}}, Y: Field{[10]uint32{0x00f9c810, 0x00d7b575, 0x001c2975, 0x0077d491, 0x038bc985, 0x029c3a6f, 0x00366279, 0x002f525d, 0x0109eb56, 0x00264fc0}}}, + {X: Field{[10]uint32{0x00958634, 0x031fdb16, 0x0261c7be, 0x03adc543, 0x03e4c257, 0x039681f1, 0x0327b248, 0x02bb4a9f, 0x01452a39, 0x003286df}}, Y: Field{[10]uint32{0x004afcff, 0x03eb368f, 0x032c7298, 0x03dd10ab, 0x010179c0, 0x027ed520, 0x01a98043, 0x01f0dedf, 0x021bc035, 0x002ac47f}}}, + {X: Field{[10]uint32{0x0271aa58, 0x0355f461, 0x00f61da6, 0x01f57e4a, 0x00df145f, 0x0339f66b, 0x03f29a36, 0x00e1ad4f, 0x01cadee8, 0x0009cea5}}, Y: Field{[10]uint32{0x025bbe2b, 0x0053e546, 0x03ac2adb, 0x0071cf14, 0x00315a03, 0x010194a1, 0x02c6d832, 0x014df469, 0x019dbb06, 0x0022298d}}}, + {X: Field{[10]uint32{0x005561e6, 0x02443e6b, 0x02279d0f, 0x03d4a511, 0x01c06923, 0x00e48700, 0x03ad79cd, 0x02eeb154, 0x00fca139, 0x001fa930}}, Y: Field{[10]uint32{0x016dec96, 0x03e82eca, 0x0193a54d, 0x00ddc6bb, 0x002eb71c, 0x018e7c66, 0x01e79822, 0x00c38bcc, 0x01470458, 0x002f4127}}}, + {X: Field{[10]uint32{0x0207d336, 0x012581e5, 0x02ce80bc, 0x01a3f344, 0x00d3823f, 0x017331a1, 0x03932401, 0x02af9751, 0x001c0a2b, 0x001c7c60}}, Y: Field{[10]uint32{0x03f1b4b1, 0x039b76c7, 0x00a6cf5a, 0x00390e77, 0x0214430c, 0x03a3f9e9, 0x01b7de37, 0x01395082, 0x03d00838, 0x00107b41}}}, + {X: Field{[10]uint32{0x01cd8828, 0x00160b48, 0x00f2a1c9, 0x036589e7, 0x017000ff, 0x0155068f, 0x00aec515, 0x0287baba, 0x0073652b, 0x002ca0e2}}, Y: Field{[10]uint32{0x027dce5e, 0x02d20474, 0x0079d2a0, 0x03ca87bf, 0x01ee4d19, 0x01abf30c, 0x01faf658, 0x038e9491, 0x015573f5, 0x00011ffc}}}, + {X: Field{[10]uint32{0x015a3e21, 0x036263ad, 0x02cb5b68, 0x0129afc2, 0x03d9f816, 0x00224892, 0x033fbdcc, 0x012f05a1, 0x01a72263, 0x000d32a3}}, Y: Field{[10]uint32{0x01c5d986, 0x02440339, 0x01f4b73f, 0x0241464b, 0x031f041a, 0x02168ffd, 0x0369055d, 0x0324701d, 0x036036a9, 0x00362bed}}}, + {X: Field{[10]uint32{0x0319cc8f, 0x01c8cdd2, 0x0115aa0e, 0x021e270e, 0x034b76eb, 0x03db5e5a, 0x00cf5b2e, 0x0106bf28, 0x0397d973, 0x00084b2c}}, Y: Field{[10]uint32{0x02f170a1, 0x030d7590, 0x01e64875, 0x01ccbde3, 0x01ff17e2, 0x0049b143, 0x0285f501, 0x03c1be5d, 0x00ec5f29, 0x003c1b8b}}}, + {X: Field{[10]uint32{0x00a6228a, 0x0202471b, 0x002e9ffa, 0x00bf392d, 0x01d5f29d, 0x01e24fda, 0x0182dfde, 0x004f70c9, 0x03f643bd, 0x002f00d9}}, Y: Field{[10]uint32{0x00556e78, 0x03fd0a5d, 0x0373f527, 0x01e5ee5b, 0x02c17641, 0x02d66b0c, 0x03f3e44a, 0x007c192b, 0x0089d125, 0x0026fb1b}}}, + {X: Field{[10]uint32{0x01bd5672, 0x00403c6a, 0x029d8dec, 0x00cf37ad, 0x025e489e, 0x03466392, 0x03169bb4, 0x0222516a, 0x00235d8e, 0x0023f2c5}}, Y: Field{[10]uint32{0x03fc057c, 0x036de439, 0x01f5fe52, 0x00816c74, 0x03c45ae3, 0x01102109, 0x0302a46b, 0x0242c980, 0x0396bab3, 0x003e872c}}}, + {X: Field{[10]uint32{0x011e64ae, 0x0170beb9, 0x010440e1, 0x02133289, 0x00d4917e, 0x0077d83d, 0x0043e801, 0x03b0832f, 0x01056675, 0x001c2b61}}, Y: Field{[10]uint32{0x015a800d, 0x013e9847, 0x004e8c00, 0x03832fbd, 0x02b63d68, 0x03d6dc4e, 0x0262475d, 0x029f2697, 0x0356af9f, 0x003d2944}}}, + {X: Field{[10]uint32{0x01695842, 0x0387db2e, 0x028803ed, 0x036611be, 0x02bcf6e6, 0x025c6301, 0x026df81f, 0x0105a21b, 0x03474807, 0x002b69eb}}, Y: Field{[10]uint32{0x008a582f, 0x02ddb6e6, 0x001dd575, 0x02440031, 0x0298369c, 0x01dc7654, 0x0348bbe0, 0x009f5371, 0x011f50f4, 0x0003d9b5}}}, + {X: Field{[10]uint32{0x0102eeee, 0x011762c4, 0x0052c7f0, 0x01ee949f, 0x01bf1e97, 0x034d3e3a, 0x038108f9, 0x03aec46e, 0x018d7323, 0x003c6e1f}}, Y: Field{[10]uint32{0x00346556, 0x037dda2d, 0x000b79bd, 0x039c1f8e, 0x037e2aa0, 0x01edd56c, 0x01e58424, 0x039e827b, 0x030351eb, 0x0002f655}}}, + {X: Field{[10]uint32{0x012a0553, 0x0244d592, 0x00833cc5, 0x0145d9b3, 0x031fbf7c, 0x03fb5ee0, 0x000c301c, 0x0193ab24, 0x015ad552, 0x0024d967}}, Y: Field{[10]uint32{0x00154beb, 0x01b78170, 0x0089ccf4, 0x0176215b, 0x03519ff6, 0x030740a8, 0x02137df1, 0x000596be, 0x01e9646d, 0x002da4e2}}}, + {X: Field{[10]uint32{0x02d4ffe2, 0x00e3df63, 0x01f48b17, 0x039745e0, 0x00409a62, 0x0056fbbb, 0x002f54a4, 0x013ff712, 0x00492a9b, 0x003a74af}}, Y: Field{[10]uint32{0x00305df5, 0x00c10211, 0x00631608, 0x0020d854, 0x038d6392, 0x013c94e0, 0x01de313f, 0x02fe0037, 0x02522dcc, 0x00224f91}}}, + {X: Field{[10]uint32{0x006cb210, 0x038abde4, 0x00744229, 0x0306a1d8, 0x01825e0b, 0x01cb69a9, 0x0103eea3, 0x02b64460, 0x020a7bf1, 0x00050905}}, Y: Field{[10]uint32{0x0196af23, 0x03be284e, 0x0343f209, 0x03a47d8d, 0x024f1519, 0x002c8fa5, 0x02f1d0e1, 0x0175c479, 0x022696a7, 0x00325368}}}, + {X: Field{[10]uint32{0x009efd87, 0x0233ba27, 0x02300c45, 0x01639bc9, 0x018686d0, 0x02d7e9fa, 0x03e434ae, 0x012f52aa, 0x0312402e, 0x001fe409}}, Y: Field{[10]uint32{0x02f95fb5, 0x00622b18, 0x01602669, 0x02305498, 0x031b8b01, 0x022111a9, 0x02cdcddc, 0x02d062c5, 0x020b2aef, 0x002f0011}}}, + {X: Field{[10]uint32{0x0372745c, 0x03187d5b, 0x03c01255, 0x01a8e051, 0x022a133f, 0x02370a4d, 0x02e5f16c, 0x003d4fa1, 0x027c66cb, 0x0034c9f3}}, Y: Field{[10]uint32{0x02bea436, 0x01d628e1, 0x015f8353, 0x035071be, 0x02618cc6, 0x02314b72, 0x0108b85b, 0x00e7041a, 0x018ac3cb, 0x00137052}}}, + {X: Field{[10]uint32{0x032db3b3, 0x00e5ab78, 0x03d1a0d5, 0x033951ef, 0x01137dff, 0x022eff0c, 0x013803be, 0x00441800, 0x0319c9d8, 0x003c113a}}, Y: Field{[10]uint32{0x02526f2a, 0x00ae77df, 0x03af7c10, 0x037bff33, 0x028128a8, 0x02ca0b3f, 0x00551cea, 0x00f999fe, 0x028d9c4c, 0x0016b510}}}, + {X: Field{[10]uint32{0x0218daf4, 0x03172f03, 0x03d55f67, 0x02dfcf00, 0x03d135bb, 0x03755100, 0x006a81eb, 0x0066fabd, 0x0237b95d, 0x001e9b14}}, Y: Field{[10]uint32{0x0204385b, 0x038a48a8, 0x001d70cc, 0x019a29c3, 0x01bd492c, 0x03fda3fb, 0x00fc6e74, 0x03ad7121, 0x00b847fc, 0x0018a8ba}}}, + {X: Field{[10]uint32{0x019f82f0, 0x0256f06d, 0x01bb5804, 0x026d1d62, 0x02ffae94, 0x01708211, 0x0372afaf, 0x0302deed, 0x00dcb069, 0x001671ff}}, Y: Field{[10]uint32{0x026c38ad, 0x023bae84, 0x006ec335, 0x014bc935, 0x02c09b36, 0x03238b1e, 0x03a4d79a, 0x0159adc6, 0x008c6657, 0x0020bb16}}}, + {X: Field{[10]uint32{0x036543d7, 0x0006f51a, 0x03ae00ea, 0x036f37c9, 0x0081d99f, 0x02ee1795, 0x00d3dc6d, 0x01563310, 0x00211ed4, 0x003e33cf}}, Y: Field{[10]uint32{0x03a9778b, 0x037a7721, 0x03b20054, 0x030f82a2, 0x035506a5, 0x03338c10, 0x011f5dbd, 0x03d8c225, 0x01d01c3d, 0x002f6012}}}, + {X: Field{[10]uint32{0x024504bc, 0x00b39c54, 0x03764278, 0x00ff3f44, 0x024d2dd2, 0x00eb2a0a, 0x03471893, 0x02753c7f, 0x0364b238, 0x000e1575}}, Y: Field{[10]uint32{0x019ef72d, 0x01b02f1d, 0x01f95944, 0x03bb7c4f, 0x03b14a71, 0x02ab8ea8, 0x024ec346, 0x02af409c, 0x02254af2, 0x0020b13a}}}, + {X: Field{[10]uint32{0x02de5431, 0x03774694, 0x02ffa48c, 0x01b6bdf9, 0x036d3e0e, 0x01554f6a, 0x00b1d733, 0x03c3634c, 0x03311de4, 0x001dd912}}, Y: Field{[10]uint32{0x005916b4, 0x03d4853d, 0x029b4cdb, 0x00c1a560, 0x017581c9, 0x00aedd0c, 0x03730f99, 0x001cd5cd, 0x03ce0c0a, 0x00191785}}}, + {X: Field{[10]uint32{0x01ca138d, 0x00c198f6, 0x01d34565, 0x033dd996, 0x0156bfc0, 0x0194deaf, 0x02511daa, 0x02bef2ca, 0x0343afd6, 0x0029352b}}, Y: Field{[10]uint32{0x03bb09dd, 0x028afadc, 0x03747a25, 0x017cf57f, 0x0088b5db, 0x0358f7cd, 0x007f0737, 0x03cc6ee4, 0x03d0dd2d, 0x002f9b27}}}, + {X: Field{[10]uint32{0x00a75be5, 0x03f0181d, 0x011aaaa8, 0x032bed9b, 0x012da352, 0x03992f18, 0x02c3d645, 0x028207dc, 0x023fe673, 0x00105ffe}}, Y: Field{[10]uint32{0x00c50151, 0x0024f81a, 0x00be10de, 0x0129fdce, 0x02cfd9ca, 0x0169d243, 0x01472afd, 0x0251d202, 0x022f9084, 0x0026ae2f}}}, + {X: Field{[10]uint32{0x02ef73cd, 0x03ba0e32, 0x00622f75, 0x001257a2, 0x004f19eb, 0x01d084b1, 0x03d772cc, 0x014105b2, 0x01549311, 0x001e05d4}}, Y: Field{[10]uint32{0x00d0d3e6, 0x02fdff4d, 0x00ac2dd7, 0x02c29765, 0x02fdaf2c, 0x01f2c637, 0x0381b91d, 0x00d94098, 0x01c8ffec, 0x000df535}}}, + {X: Field{[10]uint32{0x031b5121, 0x0094fe82, 0x02f0f736, 0x02923d8b, 0x023c2ee7, 0x039d9896, 0x020c66c7, 0x00a3abd5, 0x020c3acc, 0x000d9715}}, Y: Field{[10]uint32{0x0374868f, 0x01f4df16, 0x018d6451, 0x005773b1, 0x016990aa, 0x00e3e374, 0x0303f883, 0x03c578e2, 0x02fa96c0, 0x000972f1}}}, + {X: Field{[10]uint32{0x035bac7c, 0x03e860a3, 0x03808a94, 0x03f76233, 0x016c6757, 0x02866a49, 0x026b6cb3, 0x0008fa44, 0x01251010, 0x0032516b}}, Y: Field{[10]uint32{0x0254e2bb, 0x037e4ab5, 0x01e5b174, 0x02ec99e7, 0x0399df4a, 0x0319bdb6, 0x008ae3df, 0x010ef3bc, 0x010cb4ac, 0x00326a3a}}}, + {X: Field{[10]uint32{0x002e0213, 0x0303878b, 0x03eec629, 0x02dedf4e, 0x02ac8c3f, 0x00ca18f7, 0x00223876, 0x0355f5ce, 0x01ac45e6, 0x0012ab61}}, Y: Field{[10]uint32{0x016a2708, 0x002d8f3f, 0x02595213, 0x0224ddbd, 0x0129c036, 0x0394e81c, 0x001c192d, 0x02fd9259, 0x00e19e81, 0x000e3bba}}}, + {X: Field{[10]uint32{0x02a291df, 0x027da689, 0x0367f24b, 0x03a9f4d4, 0x01907e37, 0x03d89118, 0x00f9f663, 0x01965ab7, 0x02480b0f, 0x000af040}}, Y: Field{[10]uint32{0x00311c79, 0x01509bc1, 0x02b2f4f3, 0x00c14204, 0x0324ad0c, 0x0242ddd0, 0x02780f6b, 0x02cdea46, 0x02d33016, 0x00382b0f}}}, + {X: Field{[10]uint32{0x03ddfde2, 0x007234e4, 0x03cffeb9, 0x000207f3, 0x02eca894, 0x0281387e, 0x001a2c09, 0x023e4c3a, 0x0191abd2, 0x00337016}}, Y: Field{[10]uint32{0x000193a5, 0x02686dd6, 0x02b32afc, 0x013af1e6, 0x038bf90a, 0x006a208b, 0x02b9852d, 0x038ac0ff, 0x02c44458, 0x0037f692}}}, + {X: Field{[10]uint32{0x0346a047, 0x00efe776, 0x02b7d079, 0x02ba722f, 0x0031d285, 0x03e2aac4, 0x00ea8570, 0x0310a7fd, 0x03f0af2d, 0x0016893b}}, Y: Field{[10]uint32{0x004c8f9a, 0x02d80167, 0x03327b53, 0x0185abbd, 0x00a98b6f, 0x02debc2e, 0x03f40dd0, 0x02458225, 0x01145973, 0x0005e76e}}}, + {X: Field{[10]uint32{0x0038183a, 0x03f8ab1e, 0x01467636, 0x02c2c151, 0x03e7c1d2, 0x01f457f6, 0x00aae6b5, 0x00f2a4dd, 0x013f5160, 0x0005b079}}, Y: Field{[10]uint32{0x03a183e3, 0x01a25d98, 0x0194ba53, 0x006815c1, 0x008d1f6c, 0x0383f724, 0x00af50c7, 0x026efd76, 0x02f056e0, 0x002fe163}}}, + {X: Field{[10]uint32{0x0301ccf4, 0x0299567a, 0x006eb0c3, 0x016c71a1, 0x01a2f240, 0x0305de00, 0x013a116a, 0x00be6b62, 0x02ea71b9, 0x001e4bc7}}, Y: Field{[10]uint32{0x0032a79d, 0x0342de8a, 0x001293cc, 0x002ef878, 0x0052c0df, 0x01e19ae7, 0x01ecf87a, 0x03bce4c4, 0x030cc610, 0x002f018b}}}, + {X: Field{[10]uint32{0x017378e1, 0x02e99769, 0x00dd7335, 0x02b3c201, 0x03917dab, 0x0044dff8, 0x004dc515, 0x01c673d5, 0x0040f057, 0x0006ce67}}, Y: Field{[10]uint32{0x000b425f, 0x029dd718, 0x02f6d380, 0x004aaa11, 0x02bfdd07, 0x0374cce8, 0x01e872c1, 0x02821507, 0x00d3b6e8, 0x001359e5}}}, + {X: Field{[10]uint32{0x02238e4f, 0x002ffeae, 0x02edec21, 0x01e2af85, 0x039f8cd2, 0x02223147, 0x00d8219b, 0x0173b783, 0x013eb9c4, 0x0004e2cc}}, Y: Field{[10]uint32{0x02ac56d6, 0x021c8f39, 0x03f7fd9e, 0x01b735b6, 0x0213f0f7, 0x03c2b349, 0x02d49512, 0x0010bd2d, 0x0357cbc8, 0x00286668}}}, + {X: Field{[10]uint32{0x03542338, 0x03f0937a, 0x0312284f, 0x00445f24, 0x008f4018, 0x03d2b869, 0x0068b24c, 0x01599340, 0x03119c76, 0x000f81b0}}, Y: Field{[10]uint32{0x0273624f, 0x039d55c1, 0x03696498, 0x02cca01e, 0x0293b08a, 0x026a4341, 0x01c45963, 0x01fc6daa, 0x0196e560, 0x0018e995}}}, + {X: Field{[10]uint32{0x03f8bd2e, 0x037a2d2e, 0x0125f8a3, 0x037bb47b, 0x0280f0f6, 0x005e7a77, 0x00e5455c, 0x0224c95d, 0x039b49c8, 0x0000fccb}}, Y: Field{[10]uint32{0x02589f17, 0x007e9ada, 0x02472855, 0x033b8ae1, 0x00091f49, 0x03d0aa77, 0x0090257b, 0x01be27bd, 0x031a5fc9, 0x0028b4ae}}}, + {X: Field{[10]uint32{0x02414ec5, 0x01dca651, 0x02b041fe, 0x03ef8ce0, 0x022c4f5e, 0x016c6e0a, 0x029602bf, 0x03143e84, 0x0017ffcc, 0x00226b71}}, Y: Field{[10]uint32{0x00253215, 0x01fbd523, 0x00bc8e2c, 0x00a0976a, 0x036c3daa, 0x02a9867b, 0x015c2915, 0x01d47405, 0x035c291b, 0x001339f9}}}, + {X: Field{[10]uint32{0x00e4e9b5, 0x03faab97, 0x01619a13, 0x03e81f07, 0x01e9f208, 0x00bd53d9, 0x017d4860, 0x02327d96, 0x01626bec, 0x003ccfef}}, Y: Field{[10]uint32{0x01593774, 0x00ad0914, 0x0025edf0, 0x022ddc9a, 0x02a6f43c, 0x00142c0c, 0x03e2eda3, 0x03c54a1f, 0x002bebb9, 0x00323c18}}}, + {X: Field{[10]uint32{0x00a7d6b8, 0x038f9929, 0x0071d568, 0x013d1448, 0x02117fa0, 0x003a5d01, 0x01f7703a, 0x038bdf91, 0x00ab7b90, 0x0003b332}}, Y: Field{[10]uint32{0x00a1b6f4, 0x005a6696, 0x0056048e, 0x01143c7f, 0x03fcc8a6, 0x0322ecd9, 0x033c2333, 0x028363cb, 0x0305a9c4, 0x002115bd}}}, + {X: Field{[10]uint32{0x017de915, 0x00fa5685, 0x03dfca4e, 0x035537c7, 0x000e6e31, 0x009d0fb4, 0x0181c754, 0x0218b960, 0x0333a7ad, 0x003da58a}}, Y: Field{[10]uint32{0x029e6605, 0x038c80ba, 0x01cf209e, 0x016a0cd6, 0x02055c15, 0x0280566a, 0x037e8ad2, 0x0173afe7, 0x03fb4851, 0x002bcf51}}}, + {X: Field{[10]uint32{0x02ace24d, 0x02748d36, 0x019e842b, 0x03c8e3fd, 0x025c45d2, 0x0025649a, 0x02d5df02, 0x03ec4197, 0x03c67996, 0x0000fc7c}}, Y: Field{[10]uint32{0x010ea28e, 0x012f529b, 0x0011f110, 0x00195a42, 0x03737507, 0x0088a36a, 0x023c30b2, 0x027c28a3, 0x01e4f0a2, 0x00356172}}}, + {X: Field{[10]uint32{0x026e589c, 0x0375145b, 0x030e34ae, 0x00b50206, 0x02dc3359, 0x02b4b357, 0x03f93c16, 0x00390f62, 0x00193629, 0x0003f2b8}}, Y: Field{[10]uint32{0x031165cc, 0x001ee851, 0x02c243a2, 0x0162e5c0, 0x02c8acb9, 0x03342665, 0x00710d88, 0x029110b7, 0x039ecc42, 0x0023a615}}}, + {X: Field{[10]uint32{0x011f522c, 0x015c2ac5, 0x012c6d89, 0x01f6ea8c, 0x01abc424, 0x03f23beb, 0x037922b5, 0x008a748e, 0x03ba0355, 0x001523c9}}, Y: Field{[10]uint32{0x02ab6fa9, 0x01fc6e21, 0x0200acb7, 0x018ce6e5, 0x02b7b63c, 0x03cdf207, 0x00ba774f, 0x01f35f23, 0x03d8bbb4, 0x00039565}}}, + {X: Field{[10]uint32{0x00146fa0, 0x00e6ef57, 0x003ab6e4, 0x02e18460, 0x0249797d, 0x0021adef, 0x025cf1ef, 0x00d1fb51, 0x0114e8bf, 0x0038bd92}}, Y: Field{[10]uint32{0x006ae76e, 0x035d18ff, 0x025d1d2e, 0x0251cb55, 0x0388b27a, 0x01debbe6, 0x02482570, 0x00793c54, 0x036f7c64, 0x00239a79}}}, + {X: Field{[10]uint32{0x0013db1d, 0x02faae8b, 0x011222cd, 0x0323ce33, 0x01c7d362, 0x00a62d03, 0x00f97622, 0x00303c76, 0x02a02d97, 0x0002314c}}, Y: Field{[10]uint32{0x0062bd0e, 0x01bfea1c, 0x0276801b, 0x02d8b7b0, 0x03568251, 0x032dd81b, 0x00ffc9fb, 0x0359b67a, 0x02e90428, 0x00243e28}}}, + {X: Field{[10]uint32{0x02291a23, 0x008c8618, 0x02f6d3c3, 0x025ebd59, 0x006fc0ed, 0x0014abb1, 0x02f7e0c8, 0x0065cbda, 0x02fee3c5, 0x0019191b}}, Y: Field{[10]uint32{0x007a69fe, 0x023d3dca, 0x03c50d6c, 0x022a61bf, 0x03a10eb8, 0x01c7cb76, 0x0276ee71, 0x00dc2cda, 0x0150f6ca, 0x00278a78}}}, + {X: Field{[10]uint32{0x033be659, 0x00787cd1, 0x011b51eb, 0x02fe699f, 0x01329199, 0x01bbd972, 0x03ff69a0, 0x037fdc32, 0x00da1df8, 0x001ba2e9}}, Y: Field{[10]uint32{0x015d852a, 0x01d19e60, 0x00a060f6, 0x0289f851, 0x03eb5a34, 0x0394def5, 0x03f21883, 0x01069cd7, 0x02c89594, 0x002b9d58}}}, + {X: Field{[10]uint32{0x036bcaef, 0x0307ccca, 0x029cae76, 0x007356e3, 0x02c94c87, 0x02b6fc7d, 0x020d7e1c, 0x00b03db7, 0x03c8f781, 0x0023086a}}, Y: Field{[10]uint32{0x007ed53e, 0x02832a5d, 0x006b2663, 0x03f9a3fd, 0x015a36d6, 0x03833bfa, 0x010ed037, 0x000f8950, 0x00c313be, 0x00169f27}}}, + {X: Field{[10]uint32{0x039f6353, 0x01ac9a4b, 0x01fea342, 0x00087ae2, 0x0010ce51, 0x015e8a3c, 0x0236ff76, 0x01f85099, 0x003a7c48, 0x0033838e}}, Y: Field{[10]uint32{0x0232e03a, 0x03030358, 0x02280532, 0x03dbf6b3, 0x0097fcb9, 0x031cf23b, 0x004e9da4, 0x01e010a0, 0x0065d43f, 0x000fe569}}}, + {X: Field{[10]uint32{0x01698eb8, 0x028dfb87, 0x03700080, 0x031f0072, 0x028078b6, 0x0119cff0, 0x00598483, 0x01f13fd1, 0x017f5147, 0x001f8cc2}}, Y: Field{[10]uint32{0x022d75a7, 0x03072972, 0x025ad141, 0x039a5c01, 0x02e282b7, 0x01241968, 0x001d274e, 0x0319e762, 0x03c07317, 0x003049d6}}}, + {X: Field{[10]uint32{0x016837a6, 0x01ec3904, 0x03867931, 0x019b3ecf, 0x01d686eb, 0x03bfc9cc, 0x031cf429, 0x01f987ec, 0x00d6b148, 0x003bd367}}, Y: Field{[10]uint32{0x0163be1f, 0x022dda8f, 0x012ecd11, 0x0161ffd8, 0x023bd2ff, 0x03a87ae8, 0x036461a6, 0x03756893, 0x02b4280d, 0x00313daf}}}, + {X: Field{[10]uint32{0x03716290, 0x015cecbc, 0x014b992c, 0x028b7c32, 0x03ce53f4, 0x0297e2e8, 0x0090bcb9, 0x024c93de, 0x01452ee4, 0x003cfb70}}, Y: Field{[10]uint32{0x03fb2f2d, 0x02a60834, 0x00dbf552, 0x01952470, 0x035c3905, 0x01f0aba4, 0x03301f08, 0x02c9ea36, 0x02abfbc9, 0x00265511}}}, + {X: Field{[10]uint32{0x03caa975, 0x01c32a0a, 0x02c92bd1, 0x009caf18, 0x0287d174, 0x00634831, 0x01341603, 0x03a45358, 0x02517398, 0x00307d88}}, Y: Field{[10]uint32{0x03769e99, 0x0019c821, 0x01cabfcb, 0x0148071d, 0x00f6d6da, 0x00a4bdc6, 0x0328d593, 0x016ddb54, 0x02273673, 0x0007216b}}}, + {X: Field{[10]uint32{0x023dea8e, 0x004c8791, 0x03889714, 0x00066956, 0x01b206c6, 0x038c41c5, 0x00561533, 0x00220752, 0x01f9605f, 0x0029fa07}}, Y: Field{[10]uint32{0x00ae8a4f, 0x01bfbe5f, 0x000adaa1, 0x03ad7151, 0x020eb23d, 0x01f7de5a, 0x0370dbba, 0x006f83c2, 0x00fd1f36, 0x000eb888}}}, + {X: Field{[10]uint32{0x006a536b, 0x01ca0af9, 0x033262fe, 0x02b16a33, 0x02f46af5, 0x01f52b97, 0x03ac0288, 0x03ca59e8, 0x03298f5d, 0x0006da6f}}, Y: Field{[10]uint32{0x0046a91f, 0x0093cbaa, 0x01c6028c, 0x03f62203, 0x02d7e9d7, 0x0066ce28, 0x0375c684, 0x0269c7a8, 0x00aa02d9, 0x00327189}}}, + {X: Field{[10]uint32{0x03bb44bb, 0x0048bb76, 0x0251db56, 0x021ff45c, 0x03b31c99, 0x02cecc49, 0x0315cb96, 0x018ee637, 0x03740317, 0x003377fb}}, Y: Field{[10]uint32{0x024869f5, 0x011679fc, 0x00b65854, 0x019e3de0, 0x00225f08, 0x028ca8e3, 0x0279ce26, 0x016a8d31, 0x02f42e93, 0x00025cbf}}}, + {X: Field{[10]uint32{0x00e957ff, 0x01c3ffd8, 0x0129cfcb, 0x00d79f00, 0x00ee07f2, 0x03bc0788, 0x0347d309, 0x01458d9a, 0x00ef2c8a, 0x000cbf87}}, Y: Field{[10]uint32{0x03b4588e, 0x013b7c93, 0x0036fe75, 0x031f116d, 0x023d13b2, 0x0030d53a, 0x033babe0, 0x0184922c, 0x0331bd37, 0x0027a185}}}, + {X: Field{[10]uint32{0x01c24b0d, 0x00896e1e, 0x02908505, 0x015c9955, 0x024a7596, 0x02bed87f, 0x01d0ccf6, 0x0104674c, 0x03e9f491, 0x0028e0be}}, Y: Field{[10]uint32{0x02111857, 0x01b36a34, 0x00a55513, 0x0063260e, 0x02cdde63, 0x01f088bf, 0x03e0287c, 0x02ff709c, 0x036039a1, 0x002a8c00}}}, + {X: Field{[10]uint32{0x0280ef88, 0x02453b06, 0x028bc6d6, 0x029e5a88, 0x0159e305, 0x01f00d13, 0x03e24670, 0x00c3ab84, 0x00399ae3, 0x002d4ed5}}, Y: Field{[10]uint32{0x01fadc7a, 0x003b8c35, 0x01a368f3, 0x00711d54, 0x02969d8d, 0x02ea2a38, 0x00f43cc8, 0x01b175d2, 0x00538dfc, 0x00266024}}}, + {X: Field{[10]uint32{0x0364169a, 0x007436be, 0x01b8df52, 0x02bc1abb, 0x00710fe2, 0x022c2b67, 0x00bbfed9, 0x03fb0fed, 0x0253f11c, 0x001886d4}}, Y: Field{[10]uint32{0x020378aa, 0x0036fa49, 0x00bb3abe, 0x01704d85, 0x033b9300, 0x00f81717, 0x01d025b6, 0x01abd88b, 0x01c48b71, 0x000a88d3}}}, + {X: Field{[10]uint32{0x01435b04, 0x00c5783e, 0x000bed5b, 0x03eae694, 0x001e5979, 0x003d5d63, 0x023f4428, 0x00f1fcc5, 0x036ccc9c, 0x0020ccca}}, Y: Field{[10]uint32{0x00d30ea0, 0x0285abf7, 0x012d416a, 0x03da1d8b, 0x0060c77d, 0x0100b761, 0x0241025c, 0x007c72f6, 0x0212258c, 0x00214d81}}}, + {X: Field{[10]uint32{0x03f6538a, 0x02a1a3f6, 0x006b668a, 0x0069e91d, 0x02fd54e2, 0x02806c43, 0x032d926d, 0x009888bd, 0x00e39120, 0x0009f236}}, Y: Field{[10]uint32{0x02d6eb91, 0x034ad088, 0x00090e90, 0x020484eb, 0x034d0c0a, 0x03783ffd, 0x009fe83f, 0x0121355b, 0x023fb8f2, 0x00221da3}}}, + {X: Field{[10]uint32{0x020067e5, 0x007aff81, 0x03a9155d, 0x0353c22d, 0x036ee768, 0x010955bb, 0x012e05ac, 0x008014bf, 0x030bbcd8, 0x003cd271}}, Y: Field{[10]uint32{0x010c6604, 0x0086939d, 0x009fb9f6, 0x02c1c75b, 0x0293fdc5, 0x01ebaa42, 0x003c4e9e, 0x0341431f, 0x00194011, 0x001b5657}}}, + {X: Field{[10]uint32{0x03b24f90, 0x0209e9c4, 0x03156edb, 0x00805ce9, 0x01a0183b, 0x030fe278, 0x031368ba, 0x0265998a, 0x027ab202, 0x00125995}}, Y: Field{[10]uint32{0x037e21ab, 0x01670cc0, 0x0094701f, 0x01645996, 0x01a097b8, 0x03020f8d, 0x0110ee76, 0x00eec252, 0x0036c2bb, 0x001bbe25}}}, + {X: Field{[10]uint32{0x013e0886, 0x01052fe4, 0x02eb69a7, 0x01d817fd, 0x0275611b, 0x02f18ffa, 0x0245b849, 0x0284fde1, 0x001b491d, 0x00124254}}, Y: Field{[10]uint32{0x01014df8, 0x02d96aa0, 0x03f17c54, 0x03dd7824, 0x0038b1ac, 0x0208ab17, 0x01d4c956, 0x001c3707, 0x02b6f2ee, 0x000b0831}}}, + {X: Field{[10]uint32{0x00cddb76, 0x0138d584, 0x01a72bf8, 0x023bb8f7, 0x03bd5f89, 0x03d058fd, 0x00d3ee40, 0x03450063, 0x0267f5a2, 0x0007b4b9}}, Y: Field{[10]uint32{0x02db8e7d, 0x024678c9, 0x027940f9, 0x03bda288, 0x02934810, 0x021a78db, 0x004babdd, 0x0133ab88, 0x00c564fa, 0x002ed25c}}}, + {X: Field{[10]uint32{0x0212f17b, 0x00758351, 0x03d5702a, 0x00361495, 0x00c15d1a, 0x037a1b5a, 0x01f9c8c7, 0x030dfeb7, 0x03410a0b, 0x00311eea}}, Y: Field{[10]uint32{0x02db09e3, 0x03baa068, 0x015cbb09, 0x019f3e0e, 0x00e84ce7, 0x028f30f8, 0x028091a1, 0x01f78444, 0x00b136f4, 0x000394ab}}}, + {X: Field{[10]uint32{0x027a7394, 0x03b1a831, 0x038c18f5, 0x03cf7484, 0x03f70825, 0x03b39d95, 0x0090b525, 0x033f10d5, 0x00c14993, 0x0038841a}}, Y: Field{[10]uint32{0x00c732da, 0x009c20c0, 0x00a12430, 0x03f276c1, 0x03065360, 0x017eadbe, 0x03997553, 0x02366caf, 0x0137d48f, 0x00335840}}}, + {X: Field{[10]uint32{0x03faf917, 0x01f93d0f, 0x03b87da0, 0x01bc47bb, 0x0200bd6a, 0x01942291, 0x029e1440, 0x00bd7ac1, 0x007d47a7, 0x0018d7d5}}, Y: Field{[10]uint32{0x03e64128, 0x00da48ca, 0x02642217, 0x015d53aa, 0x0021fecb, 0x0072c2fc, 0x024c8ed8, 0x01ced3cc, 0x01f23da2, 0x0023a82a}}}, + {X: Field{[10]uint32{0x01bdb47b, 0x0197c091, 0x02aa8485, 0x02ba4ca7, 0x013837b6, 0x00fe3993, 0x032f79ab, 0x02d2c7ff, 0x000a8648, 0x000918cb}}, Y: Field{[10]uint32{0x026e0426, 0x01b910bd, 0x03179814, 0x01d68e08, 0x02177ff8, 0x018aac8d, 0x02603608, 0x01574cf0, 0x0388c9e1, 0x00271b41}}}, + {X: Field{[10]uint32{0x037bf503, 0x03efde9a, 0x03b5ed59, 0x038574b0, 0x03146541, 0x032f2c06, 0x009cc56e, 0x00a75215, 0x01c3cfb2, 0x0010dd23}}, Y: Field{[10]uint32{0x01fb9c5c, 0x03cd3051, 0x019a9265, 0x01f86b7b, 0x000b2060, 0x0333623f, 0x007ea7f2, 0x026418ee, 0x01ed23a0, 0x00265d68}}}, + {X: Field{[10]uint32{0x03ae3ac0, 0x03ff72b0, 0x03a5804b, 0x03404549, 0x02bb8750, 0x026f8776, 0x0203b406, 0x0075a0c5, 0x0323b8c4, 0x0023e120}}, Y: Field{[10]uint32{0x02d1b37f, 0x020a22b0, 0x01c6e2c8, 0x00e8a95d, 0x01be81f8, 0x005f9691, 0x035805ab, 0x01830a1b, 0x00871282, 0x001dea2b}}}, + {X: Field{[10]uint32{0x0148422c, 0x0254ae8a, 0x012cc6e2, 0x036f1510, 0x002d8907, 0x00706720, 0x01e8be48, 0x0211b6ed, 0x0368b54d, 0x000a7af0}}, Y: Field{[10]uint32{0x03c7e845, 0x00bf898d, 0x0310aec7, 0x0285a180, 0x02426f79, 0x01e72f46, 0x02eb2d6f, 0x0276414e, 0x03a281d5, 0x0039ade4}}}, + {X: Field{[10]uint32{0x023ed345, 0x01e659c0, 0x008105ba, 0x000a7e39, 0x03d84bc6, 0x02dc5254, 0x00cbe21e, 0x0004b230, 0x03c4ccf4, 0x00250532}}, Y: Field{[10]uint32{0x017fdeee, 0x027ae035, 0x0272b39b, 0x0192edab, 0x01da45bb, 0x0338d72f, 0x0132790e, 0x028424b4, 0x039289e4, 0x002b47ba}}}, + {X: Field{[10]uint32{0x008f756e, 0x030f71ca, 0x035d411e, 0x02976c79, 0x000bea90, 0x003c8532, 0x03ab8149, 0x00009184, 0x025b769d, 0x0006f615}}, Y: Field{[10]uint32{0x01d375d8, 0x0085d770, 0x02b131df, 0x035f7315, 0x00b69c2c, 0x02af6b94, 0x01cfcb02, 0x007a46de, 0x006cfc78, 0x00301429}}}, + {X: Field{[10]uint32{0x0229cb01, 0x03b242c1, 0x013f276c, 0x038ca216, 0x0314ed0a, 0x02e37b59, 0x0009154e, 0x019af8f5, 0x004c35ad, 0x00013dd6}}, Y: Field{[10]uint32{0x03712bb0, 0x007acf05, 0x02048fb0, 0x03863c76, 0x021520fe, 0x0271685f, 0x00cf1b3e, 0x00483847, 0x0248232a, 0x003d2fa4}}}, + {X: Field{[10]uint32{0x01d9f13b, 0x031e0f87, 0x02b352b9, 0x021311dc, 0x01cffd16, 0x034bcf3b, 0x0127401f, 0x02cc5eac, 0x01de7e85, 0x0016c002}}, Y: Field{[10]uint32{0x0173ba64, 0x0048ca2e, 0x0048dbb4, 0x02fbb3f8, 0x01cb8839, 0x019cb1e3, 0x037cb7ce, 0x030d38cd, 0x0304f531, 0x003d1615}}}, + {X: Field{[10]uint32{0x03b32815, 0x00ef2b18, 0x019c3ad1, 0x014cfcfb, 0x0037f853, 0x0088b7ce, 0x025fdbc4, 0x01bc04ba, 0x01c37939, 0x00319bcc}}, Y: Field{[10]uint32{0x02b22668, 0x0334f69b, 0x01ca3ea1, 0x0212eeb1, 0x024113ee, 0x02d41490, 0x023ca861, 0x03a72f04, 0x00084ae5, 0x0001f5ee}}}, + {X: Field{[10]uint32{0x0263abd6, 0x03217997, 0x03af1a57, 0x0157a469, 0x023d7ba4, 0x03a679a5, 0x03a51b3e, 0x0264d09a, 0x035dc8b0, 0x000cc25f}}, Y: Field{[10]uint32{0x0270d7c4, 0x00d648b0, 0x02d80638, 0x03b59b93, 0x02987401, 0x0061a5d9, 0x039e1206, 0x00627722, 0x033b200c, 0x003ef49a}}}, + {X: Field{[10]uint32{0x005ffff4, 0x0374aa72, 0x015f8c37, 0x002e138e, 0x01aa71cf, 0x03eef90f, 0x02922d5f, 0x03b182e6, 0x0245a3b7, 0x0006b394}}, Y: Field{[10]uint32{0x0325084f, 0x0113686e, 0x029871c4, 0x01344358, 0x0006ad3f, 0x01b2eda7, 0x01c51cbb, 0x023e6fca, 0x01679470, 0x001cb03b}}}, + {X: Field{[10]uint32{0x030c4471, 0x0296bcda, 0x03512692, 0x00cb354b, 0x006ed54e, 0x00fe480b, 0x03225249, 0x0130b2fe, 0x039e4cce, 0x002f065e}}, Y: Field{[10]uint32{0x01673f70, 0x00213ef7, 0x017dfadb, 0x02553574, 0x013cad9b, 0x03b14222, 0x016be56c, 0x00197693, 0x02635182, 0x003544dd}}}, + {X: Field{[10]uint32{0x00c7df70, 0x0342f237, 0x03fab76a, 0x0002de69, 0x0213c6f5, 0x03b2b625, 0x00cfa733, 0x036fb45d, 0x0131334b, 0x0019a65e}}, Y: Field{[10]uint32{0x0199435a, 0x026f4b19, 0x003310d4, 0x037c9a50, 0x00ab00af, 0x0012b158, 0x03e7d3a5, 0x00663bb8, 0x0301948e, 0x003f6f4c}}}, + {X: Field{[10]uint32{0x026eb4bf, 0x020f30c6, 0x008b3890, 0x00bcdc2c, 0x02563742, 0x0040fde6, 0x020b9620, 0x020be5f0, 0x00dfb38d, 0x000eea1b}}, Y: Field{[10]uint32{0x0258dfc8, 0x035ab48c, 0x02fee33d, 0x00aaf7b2, 0x035377e3, 0x02d1db86, 0x017f9819, 0x02ec4e6f, 0x001176de, 0x002b3b26}}}, + {X: Field{[10]uint32{0x031603cd, 0x024c36fb, 0x01243fed, 0x027ddba0, 0x02639519, 0x00b64575, 0x03acdbdc, 0x01c76130, 0x032f9db9, 0x0003d890}}, Y: Field{[10]uint32{0x027b5f28, 0x0031e5d2, 0x02444c2e, 0x013bac46, 0x0282269f, 0x037a1d5f, 0x0056acd5, 0x01331b96, 0x033d177b, 0x003ba273}}}, + {X: Field{[10]uint32{0x0067bbaf, 0x02bbaa70, 0x00b1d688, 0x0141e538, 0x01b6d812, 0x016ca028, 0x016e6500, 0x03a9182b, 0x03dc6a6d, 0x00212d06}}, Y: Field{[10]uint32{0x03c00e7c, 0x03090e67, 0x032b2ab8, 0x01b97343, 0x03e452fe, 0x017c3c32, 0x008cdf7b, 0x02d2ecae, 0x003cb535, 0x0027de1c}}}, + {X: Field{[10]uint32{0x009d4c67, 0x010b06b2, 0x01f8828a, 0x02b294e6, 0x01048c52, 0x022e3515, 0x00f48839, 0x0128538a, 0x02a93ea6, 0x00238b7f}}, Y: Field{[10]uint32{0x02781271, 0x0169267c, 0x02ff7593, 0x01d3da77, 0x03e09d74, 0x023b413a, 0x01df10dd, 0x00d814cd, 0x0149cda5, 0x003fb005}}}, + {X: Field{[10]uint32{0x03105e0b, 0x009dd666, 0x012f118b, 0x028903a4, 0x01dbd2f6, 0x032f0be8, 0x0175e364, 0x02b074ff, 0x01ae5401, 0x0030ef1b}}, Y: Field{[10]uint32{0x0363d6b4, 0x01430fce, 0x00c340a6, 0x0122dbc3, 0x019c5dba, 0x000dc02c, 0x02345063, 0x024c9bf4, 0x00f55b73, 0x0005c3f7}}}, + {X: Field{[10]uint32{0x03c14691, 0x03b32268, 0x0395da10, 0x03b7a4d5, 0x00c2defc, 0x009ffe04, 0x01a289e0, 0x014b9eb1, 0x02931b1e, 0x000cc24f}}, Y: Field{[10]uint32{0x00deec38, 0x021e9fdc, 0x0047a7ee, 0x002f5a2f, 0x0102114f, 0x02b843ee, 0x03dc8421, 0x017af699, 0x01845bd5, 0x001feee9}}}, + {X: Field{[10]uint32{0x00141ef9, 0x03f9cd36, 0x00208a36, 0x00cbb2f3, 0x013f1211, 0x031e3762, 0x02c765ed, 0x028f3801, 0x0038b6d1, 0x00086cd5}}, Y: Field{[10]uint32{0x02e300d0, 0x01afc1ba, 0x02a7f256, 0x02f8ec59, 0x01e2d516, 0x01bed423, 0x01a82b36, 0x01f723d8, 0x01a5ed23, 0x0003d845}}}, + {X: Field{[10]uint32{0x03892df3, 0x020bf1b4, 0x008de037, 0x008470b9, 0x03ade708, 0x023a793e, 0x0248edf2, 0x03b45cc0, 0x0183aa1b, 0x0033b599}}, Y: Field{[10]uint32{0x00fdec96, 0x0239ce06, 0x031b6cb3, 0x00d4901f, 0x02c3a818, 0x03110710, 0x03e634e3, 0x0280efc3, 0x0136f29d, 0x0013d0eb}}}, + {X: Field{[10]uint32{0x026f71f8, 0x0215cefb, 0x03ec023a, 0x01f333ca, 0x0337f6eb, 0x027ef32b, 0x02731222, 0x02a2bac1, 0x0020f541, 0x003169d1}}, Y: Field{[10]uint32{0x00adb259, 0x01921958, 0x017096c8, 0x00d524d3, 0x021612a5, 0x0097e964, 0x00a6e25d, 0x00f4db00, 0x00024426, 0x002b98d3}}}, + {X: Field{[10]uint32{0x00b9de9e, 0x012eb052, 0x0212ef0a, 0x007f1334, 0x008311c5, 0x016c57a9, 0x03255211, 0x01ad2ca9, 0x008bf30f, 0x000c1281}}, Y: Field{[10]uint32{0x023bb3cd, 0x02c19781, 0x03fec154, 0x0216c848, 0x0311ceeb, 0x02a54fea, 0x01cb5dc8, 0x02fc344a, 0x01003d6e, 0x0023e4d6}}}, + {X: Field{[10]uint32{0x039c2048, 0x02fef356, 0x0251972e, 0x03c4eec1, 0x016ecb66, 0x01e047a4, 0x009875e9, 0x002bd42b, 0x01ae7eba, 0x003fe5ad}}, Y: Field{[10]uint32{0x0352a887, 0x00678bd8, 0x00e3c319, 0x0321c3f5, 0x033de89c, 0x015abb46, 0x00a0b1db, 0x0073ab96, 0x0186bca7, 0x00092bc8}}}, + {X: Field{[10]uint32{0x01b701a3, 0x037389ec, 0x035d050b, 0x02e5282c, 0x028b6d38, 0x01bf6cf3, 0x01472437, 0x00bbb410, 0x021cdf73, 0x00164273}}, Y: Field{[10]uint32{0x0224dfdf, 0x0301782c, 0x012b037f, 0x02eefdde, 0x037d3731, 0x000e0e8f, 0x01cf2239, 0x039d8609, 0x01440665, 0x0000b912}}}, + {X: Field{[10]uint32{0x03d1d527, 0x01acc3aa, 0x01ad7cfb, 0x01d32bc1, 0x0008ef99, 0x00a11152, 0x02032b79, 0x019841be, 0x031f86d6, 0x003fdadd}}, Y: Field{[10]uint32{0x008ba4b3, 0x03c109e4, 0x03f50b25, 0x02b8d512, 0x029fcd0b, 0x03a7daa1, 0x037e0557, 0x03a473fd, 0x029c9393, 0x001aaf4a}}}, + {X: Field{[10]uint32{0x021aa8d9, 0x035f48ce, 0x005f4bef, 0x0215f9ff, 0x03be9196, 0x00b66b39, 0x03da48a1, 0x007eb47b, 0x030494dd, 0x00250f33}}, Y: Field{[10]uint32{0x020a7bd6, 0x0044d306, 0x01c523d0, 0x007161e4, 0x006014e0, 0x029f93c4, 0x011a23fc, 0x00fe2cdd, 0x00cc2dd9, 0x0013c22d}}}, + {X: Field{[10]uint32{0x005f172c, 0x03127dd0, 0x035b3ee6, 0x022c7672, 0x0147a463, 0x03c9b0d0, 0x00e0968b, 0x00737242, 0x03a7a89e, 0x00029e69}}, Y: Field{[10]uint32{0x03bb8ceb, 0x03ba43fc, 0x00cd1b3c, 0x01dae60e, 0x03ebadcb, 0x0300c96c, 0x0097f34e, 0x02f8eb95, 0x016714b5, 0x0032d4f6}}}, + {X: Field{[10]uint32{0x007b89dd, 0x03014547, 0x01b2fa50, 0x00daa8cf, 0x024f548b, 0x005cfde2, 0x021667cd, 0x01bbeaa1, 0x02fc7117, 0x000a3fcb}}, Y: Field{[10]uint32{0x02fe4941, 0x03889275, 0x01988dc6, 0x02ccdf5e, 0x038e67cd, 0x0235f6f7, 0x005e1656, 0x02857c52, 0x0307db4b, 0x0011d6cd}}}, + {X: Field{[10]uint32{0x01012968, 0x021facec, 0x03557f86, 0x01ebc2b9, 0x00223e89, 0x016d3280, 0x0304fa25, 0x01a21701, 0x033216a8, 0x00216cb0}}, Y: Field{[10]uint32{0x0257ea11, 0x0175cd75, 0x015c5704, 0x039e6341, 0x021f2bcb, 0x003bd1e7, 0x03cbe7af, 0x01015bbe, 0x0145ba66, 0x00287d63}}}, + {X: Field{[10]uint32{0x00bb8778, 0x01c32697, 0x01d47c2a, 0x03834d53, 0x027a02b3, 0x01ef4da4, 0x028e2add, 0x00cb7901, 0x0109eefb, 0x003a7f0b}}, Y: Field{[10]uint32{0x0365c312, 0x003b1696, 0x01cdf80d, 0x03b2f632, 0x00f249d7, 0x03d4f33d, 0x02e219bb, 0x0341a00f, 0x02a51216, 0x003b8026}}}, + {X: Field{[10]uint32{0x00005d9e, 0x0010be68, 0x02d65763, 0x0341883f, 0x02a1cc88, 0x0288a142, 0x0238af95, 0x00434c9b, 0x0350afd5, 0x00368b72}}, Y: Field{[10]uint32{0x033eaeab, 0x0007af84, 0x014436d5, 0x026ac5b2, 0x01ae0eab, 0x004c237a, 0x016af23f, 0x00258d78, 0x03b1c370, 0x0007bbd1}}}, + {X: Field{[10]uint32{0x02b352e0, 0x01f68f07, 0x02f08b9b, 0x034ffded, 0x02327891, 0x0021cd59, 0x03174027, 0x019baf39, 0x029cc6b1, 0x000836a8}}, Y: Field{[10]uint32{0x02e8a3fb, 0x0374fdde, 0x027a4299, 0x00981370, 0x02a30cb5, 0x00b0e8c9, 0x01d66929, 0x03e937b0, 0x002cecd6, 0x000bfda6}}}, + {X: Field{[10]uint32{0x03674d9b, 0x00bafdd4, 0x00bdd71b, 0x0101b30d, 0x023aab84, 0x025be7d3, 0x0147a534, 0x02f84d9d, 0x00dd2ae5, 0x00385ac2}}, Y: Field{[10]uint32{0x03a06846, 0x01e87646, 0x02c1d931, 0x0322dc4d, 0x0248a1af, 0x00d5ed6e, 0x003d60d6, 0x00ac7239, 0x024bd952, 0x002dc3dc}}}, + {X: Field{[10]uint32{0x016b93d3, 0x014d59f9, 0x00475807, 0x03b00f1a, 0x00c59670, 0x002c1b51, 0x039485e0, 0x036cd03f, 0x01af2d69, 0x0022228b}}, Y: Field{[10]uint32{0x01d4e3f5, 0x01e7ed8c, 0x01a9e9ba, 0x0212de52, 0x028e8043, 0x02c9c6ae, 0x00753f05, 0x002e0ab1, 0x03a7792e, 0x00376f93}}}, + {X: Field{[10]uint32{0x016abd12, 0x035831d8, 0x01704d50, 0x0032fd0f, 0x02ee6d8e, 0x00c7e5ec, 0x022e3081, 0x03f754b0, 0x00e29090, 0x001d1dda}}, Y: Field{[10]uint32{0x00b61058, 0x02eb1827, 0x0384099d, 0x01172338, 0x0227b266, 0x03b9ffcd, 0x012879e5, 0x0382d2ed, 0x03408d1c, 0x003aa9d7}}}, + {X: Field{[10]uint32{0x018d6eda, 0x01f5e73f, 0x011435a1, 0x0163e44c, 0x0380897a, 0x01f00307, 0x0337cc88, 0x004c6a34, 0x02ac1c7d, 0x00215a7c}}, Y: Field{[10]uint32{0x03eacf71, 0x01fb5b60, 0x01a8edda, 0x02aa9397, 0x0385e43b, 0x011a8ce4, 0x00e700a7, 0x001ba0be, 0x0344252d, 0x001413c2}}}, + {X: Field{[10]uint32{0x011860c9, 0x035a1078, 0x00591e57, 0x03e2f920, 0x00c4418d, 0x010a6e1d, 0x00a1d680, 0x0087713f, 0x03f9a672, 0x0013c57c}}, Y: Field{[10]uint32{0x0096b7ed, 0x02571529, 0x02a820b7, 0x02f13318, 0x013f1154, 0x01f4a418, 0x02bda108, 0x02a70685, 0x01561783, 0x00260b03}}}, + {X: Field{[10]uint32{0x004a92ce, 0x02fdf005, 0x019439e1, 0x036ea909, 0x0204e4f9, 0x03dc9635, 0x03d56ce6, 0x01b878fa, 0x02201f22, 0x00087946}}, Y: Field{[10]uint32{0x01aac869, 0x011c1e5d, 0x0235918d, 0x019d144d, 0x02428f31, 0x0326f42a, 0x001486fe, 0x0292b497, 0x0001b6a5, 0x001311ea}}}, + {X: Field{[10]uint32{0x000211a0, 0x00a84627, 0x01f2ed5e, 0x00d8e56f, 0x03e0f283, 0x03fdafe2, 0x034c4f9d, 0x03b03342, 0x002e8865, 0x003eb1f9}}, Y: Field{[10]uint32{0x00dd695e, 0x01aee8b1, 0x025c641e, 0x02dceeb5, 0x02ce656f, 0x0265cc1e, 0x01fece11, 0x00667bec, 0x019c8337, 0x000da04b}}}, + {X: Field{[10]uint32{0x0226d225, 0x01915246, 0x03469910, 0x00b5ee72, 0x0257f0f4, 0x010b4a7b, 0x01686714, 0x031dfb31, 0x039ec91b, 0x002851e0}}, Y: Field{[10]uint32{0x005bc5a4, 0x001dc2b2, 0x02edab73, 0x0138bc53, 0x02fc0d06, 0x028a7f06, 0x0120257f, 0x019fc618, 0x010ebf72, 0x003d010d}}}, + {X: Field{[10]uint32{0x00636b8c, 0x02790706, 0x01e2bdf1, 0x003dc5ab, 0x0344a790, 0x00563cf8, 0x0083c1f4, 0x01a01112, 0x00f9e508, 0x0034484b}}, Y: Field{[10]uint32{0x03fc0964, 0x00eb2c09, 0x02ec0555, 0x03203a31, 0x022f9c21, 0x00c8d71a, 0x00183a0f, 0x0059944a, 0x005107b9, 0x0001c82e}}}, + {X: Field{[10]uint32{0x03948975, 0x027fa422, 0x03ce72dd, 0x03282249, 0x022e4852, 0x00681f5e, 0x037c1250, 0x0095e025, 0x0334a7ab, 0x0004f57c}}, Y: Field{[10]uint32{0x018773ca, 0x01edbade, 0x0282a7d8, 0x014d1e7f, 0x02ff9987, 0x03a30e05, 0x0231db1a, 0x02aed473, 0x01e2d1d0, 0x0025ce1a}}}, + {X: Field{[10]uint32{0x0063507d, 0x02f7ec39, 0x007e6b9a, 0x0294d31e, 0x025ec754, 0x01af084d, 0x029bec32, 0x027a39da, 0x01616dae, 0x0007c19a}}, Y: Field{[10]uint32{0x035b262d, 0x03473471, 0x013ceb5b, 0x01d02ccd, 0x03c6f999, 0x0264ea6f, 0x01f9fc12, 0x00447e20, 0x030eb4ea, 0x00369201}}}, + {X: Field{[10]uint32{0x01150269, 0x02ab57da, 0x020298d4, 0x03400453, 0x01907b15, 0x027e5d7d, 0x02d9a495, 0x00770f12, 0x01873868, 0x0001ca78}}, Y: Field{[10]uint32{0x01455442, 0x001967e3, 0x003f2456, 0x020a7a36, 0x02c1901c, 0x02c0d69f, 0x020022c8, 0x02806db7, 0x018ec60e, 0x0036fcbb}}}, + {X: Field{[10]uint32{0x01fda12a, 0x0085a1c7, 0x02fa02ee, 0x03bb0810, 0x028e3692, 0x03864309, 0x002435fd, 0x00d1dd35, 0x03e96135, 0x003a4bf2}}, Y: Field{[10]uint32{0x0164f2ff, 0x014b320b, 0x01a84fb8, 0x01447c07, 0x03585b14, 0x039bb173, 0x02369575, 0x02035907, 0x000e3f52, 0x0029d6d7}}}, + {X: Field{[10]uint32{0x00da36df, 0x0204b532, 0x01c1c789, 0x0335fcad, 0x001ad35b, 0x00fdae41, 0x004dfbf9, 0x0234e7a7, 0x021ac69f, 0x002170b9}}, Y: Field{[10]uint32{0x00b53f45, 0x03eaecf0, 0x03752f38, 0x036efca5, 0x02575264, 0x00caac46, 0x00a50b33, 0x00a78697, 0x01876944, 0x00329b64}}}, + {X: Field{[10]uint32{0x011bc05c, 0x0051f86f, 0x0024f10f, 0x016021e7, 0x003adf99, 0x016b93c0, 0x01c2791b, 0x031ad03d, 0x0232c33c, 0x0004345d}}, Y: Field{[10]uint32{0x039a687d, 0x00b24a64, 0x01718a8b, 0x013cc481, 0x000be846, 0x02393170, 0x01bae008, 0x03b1bd17, 0x0334f1dd, 0x003857b9}}}, + {X: Field{[10]uint32{0x025d609a, 0x03b21af8, 0x036f028f, 0x035a09d1, 0x0092511d, 0x01fa82ef, 0x01820bd2, 0x0225cbce, 0x03452593, 0x0029a508}}, Y: Field{[10]uint32{0x0311d6e9, 0x01cc20d3, 0x016bd0ea, 0x01b02d4a, 0x00af49ee, 0x0095b2d2, 0x036d1b66, 0x01cfd24f, 0x0216870f, 0x00381acd}}}, + {X: Field{[10]uint32{0x0394d8ac, 0x019b6237, 0x0190604f, 0x01d5aec3, 0x03c401a6, 0x016db131, 0x02ba0524, 0x02b8fd0f, 0x00ed2b3d, 0x002d29f6}}, Y: Field{[10]uint32{0x00963456, 0x00291b64, 0x01ecfd2b, 0x00138429, 0x01074dcb, 0x0341ebcd, 0x03def119, 0x036d6bf5, 0x00631a2c, 0x003ff207}}}, + {X: Field{[10]uint32{0x01a6fd17, 0x0078aaf7, 0x01266303, 0x03fd613c, 0x03f84fb2, 0x026a9574, 0x01cb660d, 0x00f15ca1, 0x021daebd, 0x0016baf8}}, Y: Field{[10]uint32{0x02f1abe8, 0x03366676, 0x00ff6d9d, 0x03bdecd7, 0x038f5994, 0x03572114, 0x0178c40c, 0x02d4c834, 0x01136a51, 0x00008ba9}}}, + {X: Field{[10]uint32{0x008c7f87, 0x00c5b9cb, 0x01c51278, 0x00360e18, 0x0269388d, 0x01158ea9, 0x016d64cb, 0x022356de, 0x02641943, 0x002b1a11}}, Y: Field{[10]uint32{0x02f41ac1, 0x004eace7, 0x02e5ff89, 0x02209961, 0x034d7109, 0x03da4fa4, 0x03bf1143, 0x002c0425, 0x02d82dc9, 0x0032e509}}}, + {X: Field{[10]uint32{0x00955250, 0x00855f09, 0x028356b8, 0x0190589f, 0x0176ad27, 0x009f3a2a, 0x00c58c2f, 0x0398861d, 0x01490f89, 0x001be52f}}, Y: Field{[10]uint32{0x007c5614, 0x037cfe6f, 0x012ec0d8, 0x02163b03, 0x01e3633a, 0x03e188bd, 0x03d9cf68, 0x0371f171, 0x00ce4a54, 0x003490cc}}}, + {X: Field{[10]uint32{0x0008f137, 0x01024168, 0x02fa9d09, 0x0229e168, 0x00775e06, 0x02b17fd1, 0x019ec5c9, 0x0251e81b, 0x008ce149, 0x0000fe5b}}, Y: Field{[10]uint32{0x005f3f40, 0x003ab320, 0x00ce2b12, 0x0100c380, 0x009b7d9e, 0x00d8327f, 0x03613d4e, 0x029418f3, 0x03af7111, 0x002a4773}}}, + {X: Field{[10]uint32{0x039c707d, 0x01c2565d, 0x033c8f34, 0x01866ca9, 0x00405a5b, 0x0124265d, 0x022a4c17, 0x01d74ee1, 0x005cdfd6, 0x0036016c}}, Y: Field{[10]uint32{0x003b6865, 0x0233b20f, 0x03a66b6d, 0x03c40f30, 0x0184366e, 0x02edff2c, 0x022abdbf, 0x027cb78e, 0x004cc727, 0x0029a2d5}}}, + {X: Field{[10]uint32{0x039df0e4, 0x02f8d381, 0x031d4808, 0x00cdbcbd, 0x03591422, 0x01d2afa6, 0x020efa78, 0x0272d9af, 0x000bd418, 0x00348a4f}}, Y: Field{[10]uint32{0x012682b1, 0x0301a3c8, 0x0131318c, 0x0268ff83, 0x017f24f7, 0x033a8e1c, 0x03fe70a5, 0x012582e6, 0x024887c5, 0x0017ef0c}}}, + {X: Field{[10]uint32{0x03209d5f, 0x032b6716, 0x016570fa, 0x03ed55be, 0x01e3f107, 0x01dacf17, 0x0149d26e, 0x008ff9eb, 0x010be226, 0x0024c7c2}}, Y: Field{[10]uint32{0x031cc087, 0x034685d2, 0x00144d5a, 0x03006143, 0x01848f57, 0x006ba8e5, 0x01daf748, 0x02626619, 0x0279d2a8, 0x00330957}}}, + {X: Field{[10]uint32{0x01e5ddc9, 0x0165cc8e, 0x00987a03, 0x002b6cd0, 0x006e4e69, 0x021500e9, 0x02a72f62, 0x03fdaf23, 0x02836707, 0x00046298}}, Y: Field{[10]uint32{0x03ff818b, 0x0086603d, 0x027ad722, 0x02361704, 0x00b6f5a1, 0x0365abe1, 0x039d4470, 0x024160db, 0x03e5e65a, 0x00247c03}}}, + {X: Field{[10]uint32{0x036a985a, 0x0071a907, 0x014be189, 0x00b4b998, 0x01b811ca, 0x03475278, 0x014ba420, 0x02d26b40, 0x00eb5b6c, 0x0020425b}}, Y: Field{[10]uint32{0x03607e5d, 0x03fa5c2d, 0x038f5b4d, 0x0181ac12, 0x003f4948, 0x00d52d9d, 0x0050a3c1, 0x03cf95e0, 0x01c5f8f9, 0x00036814}}}, + {X: Field{[10]uint32{0x000cae06, 0x0042624c, 0x0068b9f4, 0x010db771, 0x00351b7e, 0x020fad1f, 0x013559e7, 0x017b58b7, 0x00385ff4, 0x0026a029}}, Y: Field{[10]uint32{0x0004b6d0, 0x015efe2e, 0x01cad30e, 0x01678f90, 0x00bee656, 0x003154e6, 0x028aee8b, 0x02716d18, 0x039921b6, 0x00211747}}}, + {X: Field{[10]uint32{0x02747906, 0x009023d1, 0x0209081c, 0x0137eeed, 0x02214395, 0x007a57fa, 0x02c1d596, 0x0156e5fe, 0x00f3b899, 0x001a8c5a}}, Y: Field{[10]uint32{0x00ccc005, 0x00f15ca3, 0x01403c48, 0x007a0475, 0x02012c74, 0x00b2406d, 0x0244a3f8, 0x03c420eb, 0x03886778, 0x0016d7c7}}}, + {X: Field{[10]uint32{0x01214af8, 0x002a43f8, 0x018a73db, 0x03fbd3e3, 0x03797710, 0x022f23b5, 0x03d42985, 0x0196e88e, 0x031178d1, 0x002680ea}}, Y: Field{[10]uint32{0x01e85665, 0x00ad6f22, 0x0265ca65, 0x00287542, 0x0159a555, 0x02955bd4, 0x0112f2bf, 0x012fd245, 0x00e7e61e, 0x001c2223}}}, + {X: Field{[10]uint32{0x00ea2f5d, 0x01e3bdbd, 0x00e25e78, 0x01066477, 0x01296c8c, 0x0230525c, 0x02615754, 0x03678566, 0x018d78b8, 0x00232430}}, Y: Field{[10]uint32{0x031ca074, 0x005220b2, 0x01a68028, 0x03e6da42, 0x032b97c0, 0x036edc89, 0x0244a5e5, 0x02394685, 0x00cfde62, 0x000a950a}}}, + {X: Field{[10]uint32{0x008a8957, 0x035b74d4, 0x01d43b68, 0x008cce7f, 0x00933279, 0x000b27b4, 0x037a5daa, 0x00093613, 0x037f3062, 0x000ba6ea}}, Y: Field{[10]uint32{0x02a43345, 0x011d4c34, 0x02aca4a1, 0x023268dd, 0x03ea7e4f, 0x0148ecb7, 0x01e21f19, 0x000f27c8, 0x00b73f38, 0x00326be0}}}, + {X: Field{[10]uint32{0x02466322, 0x005d9c66, 0x0384db5c, 0x0260d0eb, 0x03e21298, 0x03ef9a8d, 0x0295e7c1, 0x033fbd92, 0x032e718e, 0x0009cd2f}}, Y: Field{[10]uint32{0x0284216e, 0x018d8c79, 0x03ca8f0a, 0x012f7e28, 0x007d0a1e, 0x01a5cc4b, 0x02a0ce34, 0x017c338d, 0x018a9f11, 0x003d4c02}}}, + {X: Field{[10]uint32{0x016aab58, 0x030a9475, 0x000d5e21, 0x01ee323d, 0x004af325, 0x01e6d485, 0x001b9975, 0x012939ba, 0x02f9500e, 0x002ae7b2}}, Y: Field{[10]uint32{0x01e0f047, 0x0035470f, 0x01bc3ff3, 0x039d5d0f, 0x01d0aaed, 0x00e2a216, 0x015e9d19, 0x0061126f, 0x03468e08, 0x003df4e1}}}, + {X: Field{[10]uint32{0x031af368, 0x0190d6b2, 0x000c0169, 0x01353a11, 0x00292b4d, 0x016eaa20, 0x029cd3e8, 0x027bcb96, 0x0146a4c0, 0x002b897d}}, Y: Field{[10]uint32{0x03f3da84, 0x004157bd, 0x03d59e05, 0x03c84404, 0x0080bd59, 0x0254f1b1, 0x039a9f22, 0x02103edc, 0x03b37373, 0x0011a8ac}}}, + {X: Field{[10]uint32{0x012e6142, 0x020f7070, 0x00ace54a, 0x02cafb01, 0x034e35ab, 0x0213f003, 0x017efaa8, 0x00736bd6, 0x01a64ef2, 0x00150a17}}, Y: Field{[10]uint32{0x00cdbc3d, 0x002db0c8, 0x03f6e522, 0x0124351b, 0x00b962a8, 0x00897757, 0x03c2dc29, 0x01ed6e91, 0x02b2144d, 0x000120ef}}}, + {X: Field{[10]uint32{0x03dca65e, 0x03ad984d, 0x00874c8d, 0x03ba8a45, 0x0035a627, 0x01a9e15f, 0x02d542ed, 0x008c7d82, 0x003404bc, 0x002fb3a1}}, Y: Field{[10]uint32{0x022f6a95, 0x00bd3acf, 0x034f8e9c, 0x02b6934e, 0x00fe1c93, 0x03820495, 0x0077fb8d, 0x039cbe39, 0x038002f9, 0x00288a7e}}}, + {X: Field{[10]uint32{0x035e81d1, 0x03672d3e, 0x0326b26f, 0x00b6b9b0, 0x0389994a, 0x03a082ef, 0x02fe5af1, 0x02e15d1c, 0x0347b148, 0x0000f555}}, Y: Field{[10]uint32{0x01e465df, 0x000073ef, 0x0052db90, 0x03efbf56, 0x03c9ea7d, 0x02cac58b, 0x035bc4f1, 0x00a293d8, 0x025ae867, 0x0037b7b2}}}, + {X: Field{[10]uint32{0x01cde5d4, 0x025f73dd, 0x01715fbc, 0x0080cd1d, 0x021846b5, 0x022fda9c, 0x036361a8, 0x00f1cd67, 0x0219d163, 0x0004f1a0}}, Y: Field{[10]uint32{0x03f83af4, 0x0104fe4d, 0x02e55935, 0x038aacad, 0x03bddf0c, 0x00b5e7a7, 0x02bfe7c5, 0x01fc825a, 0x00c239fc, 0x0033a28f}}}, + {X: Field{[10]uint32{0x01b0a6ac, 0x014049b5, 0x03433436, 0x00a6fa0d, 0x0036690a, 0x02ad4bc6, 0x00c481ad, 0x00691c9d, 0x02e1a804, 0x003a7902}}, Y: Field{[10]uint32{0x00c6bb7f, 0x0191bc8e, 0x029a9577, 0x008a9576, 0x019a22fa, 0x012451f3, 0x031f3147, 0x00e6e04d, 0x00b79c98, 0x00306656}}}, + {X: Field{[10]uint32{0x01493068, 0x006d3228, 0x00eea632, 0x01c6689a, 0x0113af43, 0x0236d872, 0x0353a537, 0x028697dc, 0x01537460, 0x000b8ed1}}, Y: Field{[10]uint32{0x03a54dcf, 0x014b1772, 0x01bb6e04, 0x03cadbed, 0x015ccf5c, 0x02439540, 0x019d3e22, 0x019b2125, 0x02561049, 0x003dee97}}}, + {X: Field{[10]uint32{0x034c62b8, 0x03c3d202, 0x0091edb1, 0x03713329, 0x026a59f3, 0x03d9c373, 0x02aa40eb, 0x012c019f, 0x0082b921, 0x0026156f}}, Y: Field{[10]uint32{0x00fcf435, 0x03072033, 0x000098d4, 0x0084e11e, 0x0387184e, 0x02c1c580, 0x0237d6b5, 0x031cf3a7, 0x036e3be6, 0x0029f64f}}}, + {X: Field{[10]uint32{0x01253979, 0x03e11d85, 0x00866982, 0x03148cee, 0x0367486b, 0x0273c9f7, 0x004bee26, 0x00a44db5, 0x00a9b934, 0x000dfe08}}, Y: Field{[10]uint32{0x0070ca15, 0x01a28a1e, 0x0288b2a5, 0x00ee75ee, 0x0150dd89, 0x01f159a9, 0x0345a5a3, 0x0274ddfc, 0x029daa62, 0x003f72ba}}}, + {X: Field{[10]uint32{0x02d41a98, 0x02a747f7, 0x013b03cb, 0x028a8e13, 0x023e0cd0, 0x001c3167, 0x00f6ba28, 0x00ec31a4, 0x0098a92a, 0x003a0b4b}}, Y: Field{[10]uint32{0x00501460, 0x021af832, 0x0306095c, 0x03341852, 0x01d09d7e, 0x031f540b, 0x0033d344, 0x016cd852, 0x023232d8, 0x000c79ce}}}, + {X: Field{[10]uint32{0x02923419, 0x024de666, 0x03f3a24b, 0x007ad002, 0x03ad4690, 0x03abb38e, 0x00711827, 0x032419a8, 0x03c36dd4, 0x002f524b}}, Y: Field{[10]uint32{0x01dd7798, 0x01a83240, 0x01af5fdc, 0x024ef349, 0x018b93da, 0x01ff5012, 0x036dbd0a, 0x03569199, 0x03c51e1f, 0x0032ab68}}}, + {X: Field{[10]uint32{0x0229577a, 0x03b4cae1, 0x039641cd, 0x0265ef7c, 0x00cd8f0d, 0x0169a720, 0x022c4dc1, 0x03b13cf2, 0x02da42d1, 0x001b22d1}}, Y: Field{[10]uint32{0x0318c956, 0x00900131, 0x030a97f1, 0x023b98ac, 0x01cbeb98, 0x02f2f08e, 0x02ef5965, 0x010b83dc, 0x0362729e, 0x0034eb53}}}, + {X: Field{[10]uint32{0x00f5dd62, 0x03af303e, 0x00f05ea9, 0x006ab432, 0x03effee7, 0x034d5ad3, 0x00a25d34, 0x034f7615, 0x01e6799b, 0x001e2c7a}}, Y: Field{[10]uint32{0x0131145d, 0x017e248e, 0x025c1dd2, 0x00adc0b9, 0x01d726ce, 0x028c0199, 0x03d70057, 0x02237301, 0x02d6a267, 0x000c540f}}}, + {X: Field{[10]uint32{0x02ebdccf, 0x01d3ba96, 0x00375c89, 0x0170057c, 0x03cb53fa, 0x03e92ada, 0x028cda6b, 0x0148f8f1, 0x02a663c5, 0x003cbb40}}, Y: Field{[10]uint32{0x00f36382, 0x039c968f, 0x03b67773, 0x02a3451d, 0x02937720, 0x00882b4c, 0x03922413, 0x000c838e, 0x01c3afdc, 0x0000ef79}}}, + {X: Field{[10]uint32{0x02caffd3, 0x00259f50, 0x02a60cde, 0x0005746a, 0x00f67ab1, 0x03fdae88, 0x0254d835, 0x0002fc1f, 0x0243a458, 0x001f90fd}}, Y: Field{[10]uint32{0x0398d68a, 0x00851655, 0x0079a76e, 0x004ad55a, 0x0158600d, 0x001ed49a, 0x03fbb378, 0x00ce66d5, 0x02da0f47, 0x0007d15b}}}, + {X: Field{[10]uint32{0x01319be8, 0x002d9598, 0x01d07643, 0x03299955, 0x017ccde2, 0x02d34b3a, 0x00c0a624, 0x00da5ea9, 0x01775eb7, 0x0037c578}}, Y: Field{[10]uint32{0x027311ad, 0x001e73ec, 0x00e53b35, 0x032ac5b9, 0x0108397c, 0x02983b8b, 0x0173dfb8, 0x00e06308, 0x00dcf154, 0x0000125b}}}, + {X: Field{[10]uint32{0x0382e2ae, 0x01fd9a71, 0x00fceef3, 0x03ee4685, 0x036707a3, 0x02503a12, 0x01c16487, 0x02ec804b, 0x03060295, 0x003b7c75}}, Y: Field{[10]uint32{0x02019a2e, 0x02a2593f, 0x00d7d239, 0x0263c239, 0x039ed8f5, 0x03a223ab, 0x00b2dd68, 0x01b25ec8, 0x02f6fcd7, 0x0038e83c}}}, + {X: Field{[10]uint32{0x02f8f6c0, 0x023ed705, 0x03c2d9b1, 0x0335aea1, 0x01fd92ce, 0x00f41193, 0x023c3137, 0x02087cef, 0x02b26b15, 0x00305408}}, Y: Field{[10]uint32{0x02136c2e, 0x01606f73, 0x02da9327, 0x0096a03f, 0x0065d57f, 0x00ba7e81, 0x03961e69, 0x00a10b81, 0x0370d94e, 0x001e3348}}}, + {X: Field{[10]uint32{0x036001d9, 0x01f69fb1, 0x01105e27, 0x032ed4b7, 0x00c6cc2b, 0x02a3e324, 0x01886a28, 0x00578042, 0x036bb6ae, 0x0002f537}}, Y: Field{[10]uint32{0x02f1446f, 0x021c9f63, 0x0387572f, 0x03736806, 0x03a6f6fa, 0x01b3b4b8, 0x00e50299, 0x032e596e, 0x01b2b0b4, 0x00126596}}}, + {X: Field{[10]uint32{0x03bc0b76, 0x0025c023, 0x03ed4b21, 0x02d3211a, 0x021e2d6e, 0x018bc603, 0x01f9b4f1, 0x02533949, 0x02328738, 0x0037f3b0}}, Y: Field{[10]uint32{0x01b4f92e, 0x03bc019a, 0x03b953f8, 0x0314cc90, 0x005a477e, 0x02842acf, 0x0318f059, 0x0239c670, 0x021bf4c8, 0x002bef1d}}}, + {X: Field{[10]uint32{0x01c94e54, 0x02c7fbfd, 0x008e1a9e, 0x00d5d939, 0x00b84739, 0x02e2d07f, 0x0259b005, 0x013eb88d, 0x004de3c9, 0x002c01db}}, Y: Field{[10]uint32{0x039c7d4f, 0x0288c203, 0x00551f3e, 0x0286e13a, 0x01fe17fd, 0x0120c282, 0x002ee5e4, 0x029a1dbd, 0x02553c55, 0x00387acc}}}, + {X: Field{[10]uint32{0x022d0c11, 0x0130fc36, 0x008be94b, 0x02c266fa, 0x020fe9eb, 0x03599e1e, 0x01e9fe33, 0x00957304, 0x029c17c4, 0x0002687f}}, Y: Field{[10]uint32{0x008e8379, 0x03d5a37a, 0x002b096a, 0x01b98b7c, 0x0325f6fd, 0x01eb472a, 0x023e1aac, 0x039ce5b8, 0x030999a8, 0x0039abbd}}}, + {X: Field{[10]uint32{0x01212899, 0x01ba7905, 0x030f2257, 0x01b9e658, 0x02e1d8b1, 0x01b19441, 0x0399b88b, 0x02f05766, 0x0134126b, 0x0007626a}}, Y: Field{[10]uint32{0x02f8f4eb, 0x02035669, 0x00fd7567, 0x0113b4db, 0x0137d646, 0x03657142, 0x01a79ef7, 0x001c883a, 0x025692db, 0x002df8c8}}}, + {X: Field{[10]uint32{0x000c7fa4, 0x02f90cdc, 0x000a6ac2, 0x015886f2, 0x02345469, 0x014c3b7e, 0x0062d4f7, 0x00de58f1, 0x0068b67b, 0x003183d7}}, Y: Field{[10]uint32{0x038a7e08, 0x01d6982f, 0x002c653f, 0x014d73b0, 0x03b5507b, 0x003724b4, 0x01b5a676, 0x03c38e86, 0x007197ff, 0x00223e2c}}}, + {X: Field{[10]uint32{0x02d9d949, 0x01f5b094, 0x02ec9e6b, 0x0073dda3, 0x03620576, 0x00c06f90, 0x036499ad, 0x009a646d, 0x036f0d9b, 0x0014b34a}}, Y: Field{[10]uint32{0x030ec835, 0x00084e00, 0x024aa138, 0x020bd51f, 0x02263563, 0x031e0ac9, 0x0111a3ea, 0x00d42283, 0x00661fa3, 0x003449f3}}}, + {X: Field{[10]uint32{0x0105dda9, 0x00d0091b, 0x03be920a, 0x02973d38, 0x01c21fbe, 0x0345aec6, 0x004f107f, 0x020d7fce, 0x019ea639, 0x00079112}}, Y: Field{[10]uint32{0x032d1f53, 0x0104b083, 0x0088d027, 0x008fa585, 0x018f8adf, 0x013f43c8, 0x00d12db7, 0x010be654, 0x00e90a90, 0x001071aa}}}, + {X: Field{[10]uint32{0x006861de, 0x009d50ff, 0x01cb1c67, 0x01595a81, 0x03984ecc, 0x01804dba, 0x0253bae3, 0x0252eb47, 0x00f0a563, 0x0004e451}}, Y: Field{[10]uint32{0x02d0742a, 0x03b4ed0b, 0x02dc1025, 0x0005ba87, 0x00964f3d, 0x03010aee, 0x03174ab6, 0x03a6c86f, 0x0337ff37, 0x001c0e51}}}, + {X: Field{[10]uint32{0x014a2280, 0x029d3e19, 0x02eb75a2, 0x0322db6d, 0x0134fe75, 0x018d39a1, 0x03cb9546, 0x037c6187, 0x002a2454, 0x0024d328}}, Y: Field{[10]uint32{0x03195761, 0x03e85736, 0x00be4375, 0x00e9af9e, 0x016865ce, 0x013f493c, 0x003caee7, 0x03f2802e, 0x0384266c, 0x001de7a5}}}, + {X: Field{[10]uint32{0x006a3be6, 0x034c9b62, 0x0279a7ac, 0x02a8b52d, 0x00af913b, 0x034d7b35, 0x01a8c329, 0x009165df, 0x007d9e1c, 0x002993c1}}, Y: Field{[10]uint32{0x01112b2b, 0x0052061e, 0x03581e60, 0x00263b15, 0x023210f3, 0x0091d677, 0x02145e3b, 0x03b5b440, 0x030ff3b4, 0x003847a0}}}, + {X: Field{[10]uint32{0x018757e1, 0x0150a3a0, 0x0034e2a1, 0x0312e2f5, 0x03cfcf45, 0x03c57fa3, 0x00820ccd, 0x02422236, 0x00bdcd62, 0x003871a2}}, Y: Field{[10]uint32{0x00c77f7d, 0x003dbc86, 0x03600d13, 0x00685499, 0x01a34e7d, 0x01deedd1, 0x03b8e00e, 0x03238004, 0x02e171e7, 0x002f0431}}}, + {X: Field{[10]uint32{0x00137358, 0x03baab1a, 0x01354c6d, 0x03b43655, 0x010ba2bd, 0x009ebf32, 0x0056de68, 0x01c3cb65, 0x00951231, 0x002c68c3}}, Y: Field{[10]uint32{0x004071f5, 0x01f5042c, 0x032985a1, 0x01fb7e86, 0x02a67879, 0x00100dcf, 0x00443469, 0x0072bf4e, 0x00abc16c, 0x00271da8}}}, + {X: Field{[10]uint32{0x02166e85, 0x024afab9, 0x034d0d68, 0x027da66b, 0x034c7cf9, 0x023d7894, 0x028ba235, 0x00a470d1, 0x03b5fbb0, 0x00093309}}, Y: Field{[10]uint32{0x039f71d5, 0x0287b633, 0x038ddd7a, 0x03388c4a, 0x02d51aab, 0x03c1da3f, 0x03c52e3f, 0x02e9099c, 0x01af2516, 0x003abcda}}}, + {X: Field{[10]uint32{0x008f6a57, 0x02aacb65, 0x00a92217, 0x01de136a, 0x02bacab5, 0x02f4c73b, 0x03e8921c, 0x03478bdf, 0x017a6166, 0x0022ed00}}, Y: Field{[10]uint32{0x008dc331, 0x00355ac2, 0x00c8a5c3, 0x01ca4f5e, 0x01a09cad, 0x0060a65b, 0x02e34fc7, 0x01a618d5, 0x000e6c47, 0x0032265d}}}, + {X: Field{[10]uint32{0x00497f6f, 0x02668cd8, 0x0368b0ec, 0x03d6949c, 0x01e6dafe, 0x002cc0ff, 0x02c17dc2, 0x03765b83, 0x03ddd82f, 0x0015762d}}, Y: Field{[10]uint32{0x03b8beca, 0x0211d8ad, 0x03657bbf, 0x00c347ff, 0x03f4f292, 0x0139cba7, 0x021709e4, 0x0359bd0d, 0x0111078b, 0x003f5891}}}, + {X: Field{[10]uint32{0x00c94df3, 0x038a148d, 0x028455db, 0x009bb11e, 0x03109d46, 0x00176f78, 0x01cbfe61, 0x00c6bd46, 0x01ef5a55, 0x0020aa8b}}, Y: Field{[10]uint32{0x01811511, 0x003b8e33, 0x007c4ebc, 0x03e81a85, 0x018d1e60, 0x0097eec9, 0x002df919, 0x028b9423, 0x03ea9f83, 0x00184582}}}, + {X: Field{[10]uint32{0x00f6f7f4, 0x010e33cb, 0x01636ad3, 0x02c30a38, 0x00804b03, 0x033ea466, 0x002cfbf3, 0x01ffe11f, 0x037cc6df, 0x000db049}}, Y: Field{[10]uint32{0x02fe4833, 0x0168a945, 0x03020aee, 0x018038cb, 0x03a7bb3b, 0x02963811, 0x015d821e, 0x0071d151, 0x03a274f8, 0x0008c13e}}}, + {X: Field{[10]uint32{0x00cd9119, 0x02215ab8, 0x0318c0eb, 0x0097e926, 0x02d57b89, 0x03002cd9, 0x02c9e860, 0x032b5f85, 0x01cc5b44, 0x003cddbf}}, Y: Field{[10]uint32{0x00a028cb, 0x039ea814, 0x006ac74f, 0x02b2f7d7, 0x01c3d0e7, 0x006b3f23, 0x009e3ef1, 0x03a07c12, 0x0132e4de, 0x000b5ab3}}}, + {X: Field{[10]uint32{0x01c5030b, 0x02ab3297, 0x03d1cc7a, 0x01b0e7b3, 0x0197150b, 0x001f4ea2, 0x02e8ecb9, 0x03a7d765, 0x00dc5372, 0x003a9384}}, Y: Field{[10]uint32{0x02d96ff5, 0x01999b0d, 0x003f9520, 0x0180513f, 0x0336d6be, 0x03f7ae25, 0x03486d29, 0x009aff0b, 0x02a393b6, 0x002c225b}}}, + {X: Field{[10]uint32{0x02fdeb08, 0x020728e9, 0x0191a0d1, 0x0067c6a7, 0x00a376ea, 0x006c512e, 0x03f0a2c7, 0x01285e74, 0x02b4b266, 0x001d3ce4}}, Y: Field{[10]uint32{0x009e1fc0, 0x03b820f8, 0x02636c6e, 0x00d901b4, 0x01c95230, 0x026d19cd, 0x02cef679, 0x01623d93, 0x0321428d, 0x0026f536}}}, + {X: Field{[10]uint32{0x014855eb, 0x0258bbf3, 0x02774ca6, 0x01ad62e0, 0x0111c13a, 0x00393208, 0x01a17daf, 0x01ddd290, 0x004259ba, 0x000e8db2}}, Y: Field{[10]uint32{0x00fa5e3c, 0x02574af8, 0x03f482f0, 0x02e91763, 0x01f35e46, 0x017bce79, 0x01720c71, 0x024a3359, 0x01ad9ede, 0x001b76b4}}}, + {X: Field{[10]uint32{0x0098c019, 0x01434a97, 0x0364deae, 0x00623cc9, 0x017635ef, 0x01ac5faa, 0x02739814, 0x02913c5b, 0x02ad5636, 0x00275dec}}, Y: Field{[10]uint32{0x02ee3eef, 0x030dc688, 0x03234f30, 0x033674bd, 0x03eb5936, 0x02cb6c25, 0x0392b8ac, 0x02186ae4, 0x0027a775, 0x0014cb74}}}, + {X: Field{[10]uint32{0x02a3c4ab, 0x02b9f9ef, 0x02c1b39a, 0x005fb91a, 0x000deb61, 0x00317c6f, 0x01168a0f, 0x00be0381, 0x02e9450e, 0x000b9d00}}, Y: Field{[10]uint32{0x0182fc3b, 0x020abeb3, 0x02b6034b, 0x0073c90b, 0x03cf8572, 0x02208404, 0x016b3fef, 0x03f8ae3b, 0x036b5606, 0x00107a3c}}}, + {X: Field{[10]uint32{0x033ebe6f, 0x030ddb94, 0x03320de0, 0x03c54c52, 0x006a6806, 0x023c0297, 0x0333d35e, 0x02d6f606, 0x03254ed0, 0x002bacb2}}, Y: Field{[10]uint32{0x01b9d59c, 0x03135a8a, 0x03d0b142, 0x003dda0c, 0x035d761c, 0x0320fcc5, 0x0028249f, 0x03e8b2cc, 0x02f52d7b, 0x001ae045}}}, + {X: Field{[10]uint32{0x00ca7895, 0x0330fd17, 0x03655fbb, 0x00eae8e8, 0x014cca66, 0x029e5e4a, 0x00adabe3, 0x00b25e80, 0x00bd55d6, 0x00321889}}, Y: Field{[10]uint32{0x011cc214, 0x00c8eef3, 0x00c21844, 0x014fea54, 0x001d8573, 0x0180276d, 0x0293adfa, 0x01e4d4d9, 0x03b7104f, 0x0028c668}}}, + {X: Field{[10]uint32{0x02efe561, 0x033eee8f, 0x03a66aac, 0x03814d2c, 0x00d53ddd, 0x03f739bd, 0x035a28bc, 0x01a8375e, 0x00cc2c57, 0x00074459}}, Y: Field{[10]uint32{0x004995a7, 0x0119c2ad, 0x0291c000, 0x022490fa, 0x01ec6009, 0x0311c391, 0x00ba6947, 0x03625ff3, 0x00deaa25, 0x002e1624}}}, + {X: Field{[10]uint32{0x0040e3c8, 0x00984629, 0x0393b92f, 0x01062f35, 0x035e7f0f, 0x03124f33, 0x036620a5, 0x0056d739, 0x02b413b9, 0x000ad53e}}, Y: Field{[10]uint32{0x039bf5d1, 0x03400593, 0x03cdb30a, 0x012c0bbf, 0x037a61ce, 0x037777cd, 0x01bdfefb, 0x02b635fa, 0x012556fe, 0x0022bfe3}}}, + {X: Field{[10]uint32{0x0329b340, 0x00ea9815, 0x0188709a, 0x0097cb7e, 0x03a9718c, 0x014f91b5, 0x01428ac8, 0x00a87d82, 0x0224a4e7, 0x0007c7ca}}, Y: Field{[10]uint32{0x00421cbd, 0x037c858b, 0x03170991, 0x00812c85, 0x020b6311, 0x01a1c40c, 0x0394f392, 0x002eeaf3, 0x00a4f492, 0x00011437}}}, + {X: Field{[10]uint32{0x00ebd4e5, 0x017b94b2, 0x03200f18, 0x0167c8bc, 0x0383fbc5, 0x0001f815, 0x025682c5, 0x01f93493, 0x018ee677, 0x00104bd9}}, Y: Field{[10]uint32{0x0171c8f4, 0x02de26d9, 0x00e32887, 0x038c9da4, 0x010c8399, 0x03e9932c, 0x030b3d7a, 0x0253fae4, 0x024a9d93, 0x0030b82d}}}, + {X: Field{[10]uint32{0x00f4912b, 0x007e1513, 0x011fbf56, 0x03e7e4b0, 0x0195102e, 0x019f8943, 0x02fec9a3, 0x02477a5d, 0x00b55677, 0x00212577}}, Y: Field{[10]uint32{0x02152443, 0x0270ca8a, 0x011c5e2a, 0x007d1938, 0x03542e51, 0x014ef693, 0x0263f191, 0x02093bd7, 0x01c57d3d, 0x00197e02}}}, + {X: Field{[10]uint32{0x0156cfde, 0x013fc216, 0x006ee1bb, 0x02a5e959, 0x030b4a18, 0x02172931, 0x0145b8bc, 0x032578ea, 0x01c0d841, 0x003e39ef}}, Y: Field{[10]uint32{0x00ed6d42, 0x03b7577c, 0x010111b4, 0x0358577d, 0x006d6660, 0x012e7f02, 0x009d28c2, 0x00d9e4df, 0x0083f93a, 0x0003342b}}}, + {X: Field{[10]uint32{0x02854c94, 0x00bdcc18, 0x0213164f, 0x0121db92, 0x008c8c56, 0x037ca2b5, 0x00767517, 0x0041c492, 0x025a4e4c, 0x0020c918}}, Y: Field{[10]uint32{0x039bfaeb, 0x03308c07, 0x003561f5, 0x032c902e, 0x01de65e2, 0x00189809, 0x01c7ec37, 0x00a09582, 0x01604992, 0x001d86c6}}}, + {X: Field{[10]uint32{0x03ca04d4, 0x03b61644, 0x032cf213, 0x0180c08f, 0x0216a8e1, 0x00d4f7c7, 0x00b6befd, 0x01f88abd, 0x01ff99f8, 0x0022c712}}, Y: Field{[10]uint32{0x03ad6c23, 0x006f78c8, 0x034c02ca, 0x01d5f89d, 0x006abbf9, 0x008b7894, 0x01cff728, 0x022194b4, 0x03d10e17, 0x00335144}}}, + {X: Field{[10]uint32{0x02f4f138, 0x02b2e0a5, 0x03790bca, 0x03ca1eba, 0x0259deac, 0x018c2d19, 0x0030e89d, 0x01360232, 0x01a120d2, 0x0038ab58}}, Y: Field{[10]uint32{0x02186291, 0x036f1bec, 0x0321abf5, 0x01a5800c, 0x02918497, 0x02b371f2, 0x02d29405, 0x01219f6a, 0x01dcfc1c, 0x00147346}}}, + {X: Field{[10]uint32{0x00c197a4, 0x038eb40d, 0x013ba9ea, 0x0339fd1e, 0x01e10356, 0x00c41580, 0x026aa915, 0x029bcc5a, 0x017ea9a9, 0x0003a373}}, Y: Field{[10]uint32{0x00ea6b5e, 0x0072a14e, 0x0295c2e6, 0x0249a9a1, 0x0195f698, 0x01c712b7, 0x02e2a99e, 0x02abd74c, 0x02d791f3, 0x00320d6e}}}, + {X: Field{[10]uint32{0x00f81233, 0x02423a6f, 0x03556e46, 0x02566c81, 0x00d8643f, 0x033ec171, 0x01bba690, 0x02e3bcd8, 0x00e35875, 0x003c2dd2}}, Y: Field{[10]uint32{0x01d6e908, 0x025006cb, 0x0023e91e, 0x02aea7fd, 0x01c1c0ae, 0x030a7298, 0x00765f60, 0x00e9ed9e, 0x02515d16, 0x001a8993}}}, + {X: Field{[10]uint32{0x01af3a87, 0x025f54ce, 0x017962ce, 0x02ba4faf, 0x03e6eef8, 0x03ff8908, 0x02dd305b, 0x016859d9, 0x016f0997, 0x0024037a}}, Y: Field{[10]uint32{0x01164478, 0x02a9c013, 0x01439650, 0x026c4848, 0x01f33f8e, 0x02f9a692, 0x031bf65d, 0x01628e8c, 0x02ecd9c0, 0x002252ac}}}, + {X: Field{[10]uint32{0x0188aa53, 0x0085283b, 0x00645a6e, 0x02879b4d, 0x01ce7fbd, 0x03a7b3e5, 0x030e3067, 0x008d081c, 0x0130d2ea, 0x00232f9e}}, Y: Field{[10]uint32{0x00186b83, 0x0377615c, 0x01ac9919, 0x01c3b01c, 0x0085092c, 0x008cb24d, 0x027f2c8e, 0x0299f6b8, 0x016bf875, 0x00219ec5}}}, + {X: Field{[10]uint32{0x0225e68d, 0x024bfb26, 0x003e69a2, 0x037f04d6, 0x00e79237, 0x0315c1b5, 0x01a65c0f, 0x03490e51, 0x01c95b35, 0x002832ec}}, Y: Field{[10]uint32{0x02047e4f, 0x0293ac60, 0x00a4055b, 0x00917a14, 0x013c6d70, 0x003701b8, 0x01c8a554, 0x006917e0, 0x01d13cd6, 0x002db5fa}}}, + {X: Field{[10]uint32{0x022463cf, 0x02912209, 0x03f4c832, 0x00f58ed1, 0x00d8050c, 0x017a61ff, 0x02d3bbe0, 0x0232d6a9, 0x0072a3fa, 0x000522ab}}, Y: Field{[10]uint32{0x037e4a61, 0x00ccc899, 0x000b292a, 0x02460963, 0x0372749f, 0x01bcb8ae, 0x0245f6d3, 0x0112156a, 0x0249a6e2, 0x001fca77}}}, + {X: Field{[10]uint32{0x02f3977f, 0x01f3ccd9, 0x018cefb0, 0x03e89688, 0x02c28616, 0x028838b9, 0x02caf7ef, 0x03f5b79b, 0x01073a1a, 0x000ee7fb}}, Y: Field{[10]uint32{0x02c65fc9, 0x01c00f04, 0x010fe0ac, 0x0284d23b, 0x034fa9e7, 0x025ab4f8, 0x030c936e, 0x03259287, 0x033c5084, 0x003c2a16}}}, + {X: Field{[10]uint32{0x023537aa, 0x0196b1f3, 0x020fecc5, 0x03ab7eff, 0x027c9cbc, 0x003e90c6, 0x03b443c3, 0x02ff6555, 0x00ed5228, 0x001f7917}}, Y: Field{[10]uint32{0x022686f0, 0x027377be, 0x00fc1199, 0x02298326, 0x0178e011, 0x0315418b, 0x03794f3a, 0x01c0cef2, 0x01376910, 0x00145777}}}, + {X: Field{[10]uint32{0x01913dd2, 0x03986c95, 0x015aa251, 0x0273ae87, 0x03c17cf9, 0x013cea15, 0x00102747, 0x03d58a60, 0x035a0534, 0x00273068}}, Y: Field{[10]uint32{0x02433ae5, 0x005a130f, 0x007ccc69, 0x010ebcaf, 0x03c653e2, 0x02fe384b, 0x0115da37, 0x0293e658, 0x01a8f30f, 0x003024b3}}}, + {X: Field{[10]uint32{0x02b52ec6, 0x002da41e, 0x00562092, 0x03ec8896, 0x0310fc71, 0x00a29ca0, 0x02ad7298, 0x00ee731d, 0x0168759b, 0x00360bc6}}, Y: Field{[10]uint32{0x0018c607, 0x002bd422, 0x03306c47, 0x020b72b0, 0x011b3720, 0x03872760, 0x0008f8ca, 0x00ec31ce, 0x02052698, 0x00153342}}}, + {X: Field{[10]uint32{0x007b7586, 0x0257ab6e, 0x02498241, 0x01221796, 0x0101f9c5, 0x00a46d83, 0x031bffcc, 0x016a5430, 0x014703d9, 0x0005b9aa}}, Y: Field{[10]uint32{0x03d8aafd, 0x00b15636, 0x03276f88, 0x02393b5c, 0x0080ff4c, 0x02a55f01, 0x010d3655, 0x01ae30b9, 0x0138581b, 0x000678a6}}}, + {X: Field{[10]uint32{0x035cd237, 0x0263948e, 0x03197ff0, 0x01395e85, 0x03ad57a7, 0x01df0d18, 0x02b46704, 0x013c9391, 0x02f300ee, 0x00341f9e}}, Y: Field{[10]uint32{0x035d0e20, 0x01bc9304, 0x00b1bc69, 0x037adbc8, 0x00d4d175, 0x03d86222, 0x031019be, 0x005959a6, 0x020f43c9, 0x003ffcd3}}}, + {X: Field{[10]uint32{0x01665380, 0x007d3679, 0x0301450a, 0x02e43260, 0x018ffe42, 0x00fea93a, 0x02118a34, 0x009ff18e, 0x00e56dc0, 0x000afd91}}, Y: Field{[10]uint32{0x02262ec5, 0x013e4956, 0x00477c92, 0x017d9ba9, 0x03eb84ca, 0x001ad57d, 0x0366fb7a, 0x007f17e3, 0x017577be, 0x002fbd70}}}, + {X: Field{[10]uint32{0x005cb045, 0x03b5493f, 0x03a3ab97, 0x01f97897, 0x027a8810, 0x010965f1, 0x00801014, 0x036e4d23, 0x01370db1, 0x001463c3}}, Y: Field{[10]uint32{0x014d7294, 0x0280e5da, 0x037418db, 0x03d37e2a, 0x006eb9f3, 0x0125d094, 0x03113a14, 0x03b4059b, 0x010ea4e9, 0x00372a1d}}}, + {X: Field{[10]uint32{0x030554c7, 0x031c975b, 0x0128e9a9, 0x02ea1e66, 0x0057bf54, 0x03087d89, 0x029893f8, 0x01d284af, 0x02b6c507, 0x0002f523}}, Y: Field{[10]uint32{0x0170f6e1, 0x03e9e1fd, 0x002d2e2c, 0x01418c9d, 0x00dd58f3, 0x01da7dce, 0x034bad90, 0x000c019d, 0x01a8cd8f, 0x0008029b}}}, + {X: Field{[10]uint32{0x031517e2, 0x02678d36, 0x031302aa, 0x01178f02, 0x00800c5b, 0x0193e870, 0x0336622b, 0x01a78da4, 0x013a8711, 0x00333236}}, Y: Field{[10]uint32{0x0101d845, 0x03f5b0db, 0x0305611e, 0x00252027, 0x00888373, 0x0115219a, 0x0211f1bc, 0x0191e3be, 0x03e4d45e, 0x000103b9}}}, + {X: Field{[10]uint32{0x03f6bd1a, 0x0149fc76, 0x03dab8f4, 0x00703f09, 0x0327e8d0, 0x01efa7a9, 0x01d2e9a2, 0x01e648c4, 0x012c7587, 0x0021bd8e}}, Y: Field{[10]uint32{0x010f7922, 0x02bcd340, 0x02dd3e7c, 0x0063f51a, 0x00571505, 0x0127b9a4, 0x02b1304c, 0x02a8a8f4, 0x0211b647, 0x001fb8a5}}}, + {X: Field{[10]uint32{0x03d7fdfd, 0x010760ed, 0x01c1bbfc, 0x0205b687, 0x019bb5a3, 0x00e1d47e, 0x03941053, 0x003e9b0d, 0x00e5927b, 0x00380d3d}}, Y: Field{[10]uint32{0x01a5f89d, 0x01239d50, 0x03b6ff22, 0x01eec9e7, 0x01e90256, 0x02fb72ae, 0x0282b05c, 0x010b904c, 0x02cb8382, 0x003727c0}}}, + {X: Field{[10]uint32{0x02b51045, 0x02d2731a, 0x01062837, 0x03bee1b8, 0x0075eadf, 0x02e09544, 0x023a66a0, 0x02fc017b, 0x02160a9d, 0x0023f0da}}, Y: Field{[10]uint32{0x03d200a6, 0x02526648, 0x0374a705, 0x009e7b27, 0x0266a885, 0x0001292f, 0x03d9957a, 0x02607485, 0x00409605, 0x0031fb8b}}}, + {X: Field{[10]uint32{0x033278e0, 0x002b7239, 0x0112d9c1, 0x037ad45f, 0x03997130, 0x019773f8, 0x0089b71e, 0x01f65b59, 0x00bc5407, 0x0035eed0}}, Y: Field{[10]uint32{0x028b0a4b, 0x0241d2a9, 0x01b468ce, 0x02f8ea2a, 0x025897c0, 0x025ad72d, 0x020706bd, 0x02eb916a, 0x03662f64, 0x00388258}}}, + {X: Field{[10]uint32{0x03bd2ac5, 0x0382a218, 0x007e0b8b, 0x020455ec, 0x003c8826, 0x00997390, 0x007d2d6c, 0x031c5045, 0x02858054, 0x0035cd5d}}, Y: Field{[10]uint32{0x01a9932b, 0x00baf961, 0x019c24f4, 0x0294e031, 0x01d2ce03, 0x03356013, 0x014099e9, 0x0108e709, 0x014b2fc9, 0x00253e1d}}}, + {X: Field{[10]uint32{0x018f8392, 0x02b836a1, 0x002b6669, 0x03f595f7, 0x013e720f, 0x034ff859, 0x01a7e99b, 0x00ffe9c7, 0x02aed935, 0x0016dbe2}}, Y: Field{[10]uint32{0x018f9089, 0x013d1cd0, 0x03c106e7, 0x0100c094, 0x03e49668, 0x0138917c, 0x02f85ec3, 0x01bbb7e9, 0x0105369c, 0x0013babf}}}, + {X: Field{[10]uint32{0x02222000, 0x01cb1390, 0x03b39f7b, 0x02806683, 0x02ab4076, 0x0313d221, 0x004b4f49, 0x00a7900e, 0x011267cc, 0x000e5113}}, Y: Field{[10]uint32{0x0283d771, 0x02806872, 0x010ba50e, 0x015c6ddf, 0x01329f30, 0x014e23ae, 0x0248adf3, 0x03b8b637, 0x002aaf90, 0x00197094}}}, + {X: Field{[10]uint32{0x030752c7, 0x021222c6, 0x010030a1, 0x02573b0b, 0x0216ebad, 0x02f26223, 0x019c4a7d, 0x02c28f05, 0x00dbf1ef, 0x0014f780}}, Y: Field{[10]uint32{0x01e2fbda, 0x0158c881, 0x026d33a5, 0x01993452, 0x0287dc61, 0x039ef146, 0x02d62285, 0x0177e9d4, 0x03d99947, 0x000ca3b2}}}, + {X: Field{[10]uint32{0x015ead39, 0x0052932f, 0x019e3d48, 0x033bad23, 0x03194d1b, 0x017ed80c, 0x000eef0d, 0x01c84f8a, 0x03af9b4f, 0x0001228e}}, Y: Field{[10]uint32{0x00334186, 0x026a2eca, 0x029ce709, 0x03b512a6, 0x037e749e, 0x03252c83, 0x006f7fbc, 0x00e14aef, 0x01c9e04a, 0x000ed2b2}}}, + {X: Field{[10]uint32{0x033ac541, 0x011c1f96, 0x02b6eb52, 0x001be85b, 0x03acccf4, 0x009f88b5, 0x00182370, 0x0073b4f1, 0x0230503c, 0x003c035d}}, Y: Field{[10]uint32{0x01ca95b5, 0x015c6dcc, 0x00404f47, 0x03ff6df4, 0x03c9e2bc, 0x03e3b564, 0x0254605d, 0x01d89ac4, 0x013fec17, 0x00268777}}}, + {X: Field{[10]uint32{0x0141eaac, 0x02099622, 0x01ee89a4, 0x03210205, 0x00c4f8ee, 0x03a30868, 0x01708582, 0x03ad6439, 0x01943ce7, 0x00387fc6}}, Y: Field{[10]uint32{0x03353b7e, 0x02d25cb5, 0x003dd003, 0x00faf0db, 0x01dbf27e, 0x022a95fa, 0x021b53d7, 0x01cb9b39, 0x0172746e, 0x0014a395}}}, + {X: Field{[10]uint32{0x0059bd49, 0x00afbc1d, 0x02c55256, 0x00116456, 0x0223b3aa, 0x01d709ef, 0x015a6652, 0x01d43838, 0x0020c48e, 0x00393c4f}}, Y: Field{[10]uint32{0x0287ca30, 0x008731db, 0x01ebca2d, 0x014cd8aa, 0x03639010, 0x01ec6eec, 0x026b9d6a, 0x007e668b, 0x02cec6e5, 0x002faf1f}}}, + {X: Field{[10]uint32{0x006f5f20, 0x035720e2, 0x03ea4d2d, 0x0012b1a4, 0x01598c6c, 0x0033c9c6, 0x003d3716, 0x019ba1c2, 0x00f3824b, 0x0038dba3}}, Y: Field{[10]uint32{0x0086c60b, 0x03432f68, 0x009f6c88, 0x03a193c9, 0x00f5be9f, 0x02069537, 0x03749104, 0x015f7cf6, 0x01938afe, 0x0013a838}}}, + {X: Field{[10]uint32{0x0246365f, 0x03478349, 0x0172a63d, 0x0373f7a5, 0x03797ff5, 0x0135f151, 0x00b4a068, 0x034beca7, 0x03193286, 0x0014787c}}, Y: Field{[10]uint32{0x02370e3a, 0x00b321d4, 0x01cb2ace, 0x03b6e519, 0x03b8640c, 0x03130f50, 0x0290d7e6, 0x03b318c6, 0x023c6f30, 0x002b11c3}}}, + {X: Field{[10]uint32{0x01a5fae0, 0x033de735, 0x0224829b, 0x01055b4a, 0x0022277f, 0x016f09b7, 0x01dadd64, 0x0139c981, 0x02a9c40d, 0x0023a0b6}}, Y: Field{[10]uint32{0x027c53ee, 0x03666e05, 0x024d733a, 0x0078ca84, 0x03b01b96, 0x00cf8a46, 0x0191dd72, 0x015ec8ac, 0x01fdbe90, 0x001fe055}}}, + {X: Field{[10]uint32{0x022c41e3, 0x006cd64f, 0x02595988, 0x01d1938a, 0x0038bea6, 0x0097e9e2, 0x03fd5e95, 0x01ea90d3, 0x0344273c, 0x001e7959}}, Y: Field{[10]uint32{0x0385ecab, 0x01b9f2fc, 0x03c33e80, 0x0083c9e2, 0x03eb786a, 0x011c48b5, 0x00ec764b, 0x03bee7c0, 0x01a3c50d, 0x00189422}}}, + {X: Field{[10]uint32{0x02743f79, 0x03b4fd98, 0x0206879d, 0x015bcbc7, 0x02af7fe1, 0x01389288, 0x01eb8918, 0x00655d47, 0x00e2d19c, 0x002a5f80}}, Y: Field{[10]uint32{0x018284a0, 0x029425f3, 0x03282944, 0x0177a9ce, 0x02f3f583, 0x0113fe47, 0x00726bbc, 0x00b124d5, 0x02bd8bcb, 0x0022075f}}}, + {X: Field{[10]uint32{0x03338542, 0x01c1c9c2, 0x00aa8f4a, 0x02fa3ece, 0x009bc52f, 0x001508de, 0x021c3fb4, 0x03d70c53, 0x014607bb, 0x000efc41}}, Y: Field{[10]uint32{0x024f6367, 0x010b1900, 0x022b6390, 0x01479611, 0x019a87ba, 0x03e10381, 0x0068e5fe, 0x02dffdb7, 0x006cfad5, 0x0039e256}}}, + {X: Field{[10]uint32{0x01d9cc5d, 0x012202d5, 0x03b2e01f, 0x033e10df, 0x0249cce0, 0x033cd01a, 0x034ee87e, 0x0077fce6, 0x00775879, 0x00200a5b}}, Y: Field{[10]uint32{0x00152dcb, 0x031376e4, 0x01284846, 0x00d2f6c2, 0x00902e48, 0x0022f145, 0x028753b7, 0x01e07f38, 0x02113c7f, 0x000ec1af}}}, + {X: Field{[10]uint32{0x00ba52fe, 0x02594188, 0x03023598, 0x013a1f95, 0x01b7b0fe, 0x016713fc, 0x029cc123, 0x036ff7da, 0x037aa3ee, 0x001238b2}}, Y: Field{[10]uint32{0x02e8ed1b, 0x01592c27, 0x00aac7ad, 0x00c4f3fd, 0x00a0a456, 0x01fdcbb8, 0x00411ba8, 0x026ef165, 0x017afa90, 0x00371e10}}}, + {X: Field{[10]uint32{0x03403d46, 0x02016a5c, 0x00b6b7b4, 0x00ba65cc, 0x0031a3db, 0x0061f5e7, 0x02b482aa, 0x015220a1, 0x011fcb77, 0x0037244d}}, Y: Field{[10]uint32{0x03adb1a3, 0x00ffe5bd, 0x01b2ffa9, 0x01713942, 0x03fc52e3, 0x03827e97, 0x0180ecd5, 0x0064ba30, 0x020d2d13, 0x003b5c83}}}, + {X: Field{[10]uint32{0x0190a670, 0x025cc67a, 0x02b9f017, 0x014d6c14, 0x013a2b26, 0x03ecd13a, 0x0105b151, 0x02d3ea73, 0x013948ce, 0x00174df0}}, Y: Field{[10]uint32{0x0174cb01, 0x01b54e86, 0x0348a185, 0x0349f279, 0x00b62e16, 0x02e5018d, 0x02832ad6, 0x02e9201e, 0x033c2590, 0x003de424}}}, + {X: Field{[10]uint32{0x03070aa2, 0x03b285dd, 0x00157708, 0x0096b67a, 0x0015c8e3, 0x02a123fd, 0x017eece0, 0x026c89bf, 0x02b0f8d6, 0x00262f2e}}, Y: Field{[10]uint32{0x02150212, 0x0379637a, 0x002060e2, 0x01266ec4, 0x03a08aa9, 0x008629fb, 0x02ffd615, 0x01521f9a, 0x03b3db71, 0x001d9c78}}}, + {X: Field{[10]uint32{0x0335b1c5, 0x0170448f, 0x03a188fa, 0x02340891, 0x0012ce30, 0x01640cd0, 0x0194384d, 0x0121bbe9, 0x01cb3de9, 0x001838b0}}, Y: Field{[10]uint32{0x0369d1bb, 0x010bcbe4, 0x008fa639, 0x021ada38, 0x024d58d0, 0x014efdc8, 0x03c11a38, 0x0319bd70, 0x031b9767, 0x001b79c0}}}, + {X: Field{[10]uint32{0x004885c7, 0x00fa9c8c, 0x03467d87, 0x02ecca7a, 0x01aaf513, 0x038be6f3, 0x03f2f702, 0x015add42, 0x02c5aa82, 0x002051c5}}, Y: Field{[10]uint32{0x03d297ee, 0x00290b71, 0x00b58630, 0x0324283f, 0x01eb7efa, 0x00d4cf7a, 0x03ba31e2, 0x0186244f, 0x00ee8fa9, 0x003b2991}}}, + {X: Field{[10]uint32{0x02f8de77, 0x024d3edc, 0x00e3be6d, 0x0218803a, 0x019fb715, 0x00d9a1b5, 0x0360f7b6, 0x004bbc2b, 0x033f1db4, 0x00095e27}}, Y: Field{[10]uint32{0x007de0ac, 0x0320c08b, 0x00ce9633, 0x00ee3163, 0x02863bc0, 0x022069a1, 0x034a6f77, 0x03886d5c, 0x039899d1, 0x00394889}}}, + {X: Field{[10]uint32{0x00f1bdcd, 0x02337ca8, 0x01527ef1, 0x0079e028, 0x0227f2a9, 0x00ff2da9, 0x02a87fdf, 0x03e39591, 0x000c98bf, 0x0014e0bd}}, Y: Field{[10]uint32{0x0232b502, 0x03a17192, 0x0079d9a1, 0x0360e31e, 0x0239c027, 0x02765e85, 0x0068ce13, 0x028e8768, 0x01dee41c, 0x0008c740}}}, + {X: Field{[10]uint32{0x011d1f2b, 0x00c8e2e8, 0x01dc6e57, 0x02cfc63a, 0x0167d9ec, 0x03d5f740, 0x02ab14d8, 0x03eb7ff2, 0x01209db2, 0x0011233f}}, Y: Field{[10]uint32{0x0166fea6, 0x0070c564, 0x005875a1, 0x019c2548, 0x032ba1bb, 0x0134a092, 0x01e8d181, 0x015b090d, 0x02e55a4f, 0x002eb638}}}, + {X: Field{[10]uint32{0x02e5653d, 0x02befa00, 0x02ab5667, 0x00f7ad84, 0x01f6c489, 0x01112efe, 0x012b69d5, 0x00cd7d40, 0x024b0fe6, 0x003645f2}}, Y: Field{[10]uint32{0x032bad17, 0x0216ebbc, 0x0033a4bb, 0x0154c40b, 0x00aeabc0, 0x005f397c, 0x0150f1ff, 0x025d589e, 0x024be6a4, 0x000ff7a6}}}, + {X: Field{[10]uint32{0x01ba8f72, 0x017c93a4, 0x00570db3, 0x0398293a, 0x031dd974, 0x038fbd60, 0x03de053b, 0x020eb5cc, 0x01f517a8, 0x00031fba}}, Y: Field{[10]uint32{0x039bba44, 0x03f41881, 0x01f3a2bf, 0x0134b7ce, 0x02e06a7e, 0x01a82338, 0x03d2a31c, 0x019efd95, 0x038d26d3, 0x00236ddc}}}, + {X: Field{[10]uint32{0x00d9a30b, 0x00217825, 0x00aed0b7, 0x02e28cab, 0x00819a77, 0x01f210ef, 0x022b1737, 0x035b781e, 0x019d983e, 0x0020fc28}}, Y: Field{[10]uint32{0x00afe6a7, 0x03d21d4b, 0x00e00c37, 0x011db55d, 0x00880acd, 0x0044ef98, 0x0348b636, 0x0111cf61, 0x029667be, 0x0034aacf}}}, + {X: Field{[10]uint32{0x0313989d, 0x02649dc8, 0x02f2e2b2, 0x01e41f14, 0x01596740, 0x01d360f7, 0x03b56bde, 0x01f10263, 0x026a6168, 0x003cfe2a}}, Y: Field{[10]uint32{0x01a109fb, 0x00e653d0, 0x03a21ad6, 0x0130da15, 0x00caa1b5, 0x02258d97, 0x0201ff9a, 0x000e8cb4, 0x009d0985, 0x000e9a43}}}, + {X: Field{[10]uint32{0x0032249e, 0x03b87fd4, 0x0316a283, 0x01010e11, 0x03914fdd, 0x03af2d39, 0x01d6e8b3, 0x035b1f65, 0x01caa30b, 0x00130684}}, Y: Field{[10]uint32{0x01424da0, 0x0394856e, 0x028809b7, 0x01f0dfe0, 0x006598f1, 0x0194ce74, 0x014c604e, 0x03bd0348, 0x00c94653, 0x0039f9c6}}}, + {X: Field{[10]uint32{0x02e5477d, 0x008b064f, 0x00f6c1d9, 0x03216872, 0x02529ebb, 0x0083cc60, 0x033bdb04, 0x0280614f, 0x01523419, 0x000a506e}}, Y: Field{[10]uint32{0x02628413, 0x00e4b74f, 0x02763864, 0x01442260, 0x0280482b, 0x03db07b7, 0x0205baa7, 0x019a82aa, 0x026c29ca, 0x000ddfc8}}}, + {X: Field{[10]uint32{0x0191a6a1, 0x00858761, 0x032c3384, 0x03bf8615, 0x004b5f25, 0x031c1e2b, 0x03b3eb18, 0x026be196, 0x0107aad4, 0x00027413}}, Y: Field{[10]uint32{0x0083cd34, 0x004ae88b, 0x03724f85, 0x03287523, 0x02779eb0, 0x0065912d, 0x01ae02d1, 0x02a27ed1, 0x028dec2c, 0x003d5ca5}}}, + {X: Field{[10]uint32{0x03d26e20, 0x011ac190, 0x03ef4a26, 0x01405def, 0x000d660c, 0x02988a09, 0x01a983c9, 0x028406e6, 0x0367c3c3, 0x0011007d}}, Y: Field{[10]uint32{0x02d4e342, 0x019a77a1, 0x00c0bb7d, 0x037bba60, 0x02999f8b, 0x03419a79, 0x00293091, 0x00453859, 0x02f78e1b, 0x001e54be}}}, + {X: Field{[10]uint32{0x03bba31f, 0x02dfc306, 0x03fa68d7, 0x0311eca0, 0x000ab8a1, 0x033218ea, 0x028665ba, 0x005f4ecc, 0x0027fc40, 0x00252dbd}}, Y: Field{[10]uint32{0x0340d85a, 0x028085f7, 0x01868e09, 0x0096a660, 0x019cbe77, 0x027741ea, 0x008199e9, 0x034b51bb, 0x027d35f0, 0x0004cd81}}}, + {X: Field{[10]uint32{0x01e7288f, 0x026d2893, 0x01445738, 0x027e4809, 0x03f2fba5, 0x039d55d2, 0x03b87cdd, 0x026ef518, 0x03a292c7, 0x00105886}}, Y: Field{[10]uint32{0x02cd3188, 0x0328b868, 0x0111b717, 0x001eca53, 0x033bc70a, 0x0399ee50, 0x0389951f, 0x002de204, 0x03d5b6f3, 0x000d54cd}}}, + {X: Field{[10]uint32{0x01a3594e, 0x030e67bf, 0x0173fc33, 0x02eaac53, 0x038a9b27, 0x0049a062, 0x0100dde6, 0x03074d56, 0x00156256, 0x002c20e1}}, Y: Field{[10]uint32{0x01a954a5, 0x01a11d71, 0x02c7dc5d, 0x034541a7, 0x03843ef8, 0x01a90a17, 0x00c5371b, 0x018b8a47, 0x019055b1, 0x000aabe4}}}, + {X: Field{[10]uint32{0x000dc9bd, 0x0249d19b, 0x008fb8ba, 0x004c3a11, 0x027d910f, 0x03330509, 0x029f4377, 0x023fa977, 0x014fef41, 0x00332668}}, Y: Field{[10]uint32{0x00536f28, 0x02baedc6, 0x017f5c77, 0x0364b3ff, 0x0222f7b3, 0x030326fc, 0x02f164ba, 0x0304b750, 0x03647c01, 0x0000b8c2}}}, + {X: Field{[10]uint32{0x01764e37, 0x01083741, 0x01d50a2f, 0x02d6e59f, 0x027b21d6, 0x03601763, 0x025d59c1, 0x00616355, 0x024adbec, 0x00234aec}}, Y: Field{[10]uint32{0x019f712f, 0x0052fe26, 0x005efe70, 0x0035a959, 0x02fc371d, 0x022824c8, 0x02537c70, 0x02bae9c4, 0x0330e78d, 0x003371b5}}}, + {X: Field{[10]uint32{0x010f7c9b, 0x008ce8f9, 0x0219203b, 0x01bc9d08, 0x00dbb94c, 0x01d438ca, 0x00a18717, 0x033d2b9b, 0x02de0f18, 0x0018f3b9}}, Y: Field{[10]uint32{0x02fdfeb8, 0x00d05cc7, 0x014367ca, 0x00c784d9, 0x00ce0050, 0x02a2160a, 0x0231b8f7, 0x008ce86d, 0x01adad2d, 0x002048c3}}}, + {X: Field{[10]uint32{0x02755a0c, 0x029679a4, 0x02114926, 0x01fee3d1, 0x02b2e4d0, 0x02e86776, 0x028d5cbf, 0x03740e69, 0x029c1dc6, 0x00188213}}, Y: Field{[10]uint32{0x01061a26, 0x03662dc1, 0x0302cc4b, 0x006bef37, 0x02cc9c7f, 0x02a09f82, 0x01c273aa, 0x006bc003, 0x00f462fb, 0x001b6fad}}}, + {X: Field{[10]uint32{0x018dd827, 0x01cd8957, 0x01238c27, 0x00ddf7de, 0x003f34a9, 0x01c1cab3, 0x02368ec1, 0x018a0053, 0x02baf65b, 0x00044303}}, Y: Field{[10]uint32{0x02e75c6d, 0x03fe16ca, 0x02ba9649, 0x01d0b6be, 0x030c3c3e, 0x00082e0e, 0x01d5865b, 0x01896258, 0x03166f23, 0x000692e9}}}, + {X: Field{[10]uint32{0x01c87e00, 0x01f279bc, 0x012b6892, 0x01748f34, 0x01baa50a, 0x02ae5d01, 0x007306cf, 0x008d2ea0, 0x011e50fb, 0x00361229}}, Y: Field{[10]uint32{0x016a4fd8, 0x01cadbea, 0x02adc16a, 0x027cf2de, 0x0151fdb4, 0x0265127b, 0x02e4b1cc, 0x00032132, 0x026288fb, 0x00276e6f}}}, + {X: Field{[10]uint32{0x014c2b5a, 0x03269f38, 0x0002396b, 0x0181606c, 0x02a8cf26, 0x02406e7b, 0x0147f3b3, 0x01aad149, 0x0093a270, 0x00108c46}}, Y: Field{[10]uint32{0x024165bc, 0x034f4b2b, 0x00d70daa, 0x0073a7bd, 0x03d6129a, 0x01d82691, 0x01c2a9f7, 0x0088b066, 0x02db9ba6, 0x001d43e1}}}, + {X: Field{[10]uint32{0x0034d37f, 0x02bb038e, 0x037419fd, 0x00797c5f, 0x026b252f, 0x01f2878c, 0x03454967, 0x037104cb, 0x00ee471a, 0x00110e71}}, Y: Field{[10]uint32{0x01897e87, 0x0003b95d, 0x0119581a, 0x0196ce16, 0x03617c95, 0x03e1be4e, 0x0316ab66, 0x030f798b, 0x032c22c5, 0x002f5d70}}}, + {X: Field{[10]uint32{0x0113b053, 0x02b2bfb0, 0x03bbf36b, 0x01e6601b, 0x02e02e9e, 0x0314bf6d, 0x00b0bbd8, 0x00c76992, 0x03dab192, 0x00137f38}}, Y: Field{[10]uint32{0x03042c3a, 0x01168a84, 0x0342f69d, 0x01650bfa, 0x029d647c, 0x011f3068, 0x00a1c3e1, 0x01fee910, 0x031f4b72, 0x0037a317}}}, + {X: Field{[10]uint32{0x0117dc9d, 0x03bfe6e0, 0x009efcdd, 0x03cfb1b6, 0x009d0ba6, 0x0207db05, 0x00f91582, 0x009cdbd5, 0x032ee8e7, 0x000eee8a}}, Y: Field{[10]uint32{0x0216ab24, 0x02428c36, 0x00d2baf6, 0x021a9a98, 0x036f9a21, 0x02bdb283, 0x0293f947, 0x01f95b97, 0x02747789, 0x003fc21c}}}, + {X: Field{[10]uint32{0x0317deae, 0x01f59f60, 0x0059527f, 0x003d3eec, 0x00e239a0, 0x03d56ac3, 0x02d92ff0, 0x031ac920, 0x0243037b, 0x0028bfb7}}, Y: Field{[10]uint32{0x01869ed4, 0x00d8e351, 0x012da98c, 0x0058bc61, 0x000f7801, 0x0033808b, 0x008e195d, 0x03ff5fbc, 0x010843be, 0x000a9e45}}}, + {X: Field{[10]uint32{0x004bc0a3, 0x00730f8c, 0x021852cb, 0x002610c2, 0x01b3d64d, 0x01cdc021, 0x01aa8e67, 0x03ad3128, 0x022ff503, 0x00088713}}, Y: Field{[10]uint32{0x01b7ae41, 0x00477465, 0x02de199e, 0x00a52898, 0x01a70a79, 0x034fe1d9, 0x024fd70a, 0x0139e704, 0x031b0f95, 0x0030f0de}}}, + {X: Field{[10]uint32{0x00740ed0, 0x03bcf145, 0x00bfca58, 0x02f55679, 0x02f909c8, 0x026e44c1, 0x02f945b4, 0x02e81432, 0x0380f7e4, 0x002830cb}}, Y: Field{[10]uint32{0x02f9562a, 0x0286244d, 0x02c9041b, 0x0318e290, 0x01966aa1, 0x033b5172, 0x01e4cfbd, 0x011c0107, 0x030146ab, 0x0034fae3}}}, + {X: Field{[10]uint32{0x00da85c6, 0x01e6f906, 0x02aa1dff, 0x02573258, 0x010bf333, 0x01dd0204, 0x01e1ca75, 0x0189fc00, 0x0218b4fe, 0x001d8b9e}}, Y: Field{[10]uint32{0x00f51ec5, 0x024c8d31, 0x02b93dce, 0x02552bd5, 0x025875f7, 0x01156e10, 0x00a743c3, 0x00703d3e, 0x03465046, 0x002837c3}}}, + {X: Field{[10]uint32{0x013a29f0, 0x018cb12e, 0x03561b8d, 0x00d0451b, 0x0378389f, 0x010cdec7, 0x02cfbe40, 0x032bcf55, 0x0135cd95, 0x000bc0b6}}, Y: Field{[10]uint32{0x00f44569, 0x013a49c6, 0x0287b0e7, 0x010704bf, 0x0209c454, 0x008fc68c, 0x0008872b, 0x0242d3e0, 0x00d823f1, 0x0005cd1c}}}, + {X: Field{[10]uint32{0x03eab212, 0x0398e4b9, 0x01612314, 0x01b893bc, 0x01c5877d, 0x03f2628e, 0x01adbd59, 0x005b7c71, 0x03d72eb8, 0x00327e1d}}, Y: Field{[10]uint32{0x02067c4c, 0x0216391a, 0x03ad10b0, 0x0149d52c, 0x0188bb00, 0x03f2aa7d, 0x01a52b58, 0x01fbb169, 0x011788cf, 0x000533a6}}}, + {X: Field{[10]uint32{0x00baa172, 0x03485e68, 0x005df239, 0x008eb9db, 0x02d6dd1c, 0x032fd743, 0x03296df6, 0x0172de9b, 0x036918a0, 0x0033137f}}, Y: Field{[10]uint32{0x014a4dc6, 0x01a51219, 0x00cd5b78, 0x02ead4e4, 0x02e4dda0, 0x018ed295, 0x01b06506, 0x005d4098, 0x00b1b847, 0x0007350e}}}, + {X: Field{[10]uint32{0x03cbfaa1, 0x03b20a3b, 0x02a5bccc, 0x02299591, 0x01ca015a, 0x01e2b354, 0x0010219a, 0x01c4e8a7, 0x034b3ed2, 0x003eaab1}}, Y: Field{[10]uint32{0x0130d934, 0x03d9869f, 0x00ecbf8b, 0x03244fef, 0x01b2e74c, 0x03f9e552, 0x025c46b7, 0x03b036f5, 0x003bdcc2, 0x002b72b5}}}, + {X: Field{[10]uint32{0x00fdbf46, 0x02bbf111, 0x02480dd0, 0x03c8f468, 0x028a0025, 0x016f9b03, 0x01444b73, 0x026f4368, 0x02c930fa, 0x0005c4d5}}, Y: Field{[10]uint32{0x009bce3f, 0x00526ee7, 0x0214eb2e, 0x0134bb8a, 0x0062e246, 0x008e6395, 0x004361ed, 0x03ee76ad, 0x02dc991e, 0x001dc3a7}}}, + {X: Field{[10]uint32{0x01680214, 0x00401ef9, 0x01b43b64, 0x01e81ea0, 0x01c05501, 0x017e7ec6, 0x01491af5, 0x00dd8f4b, 0x016ae047, 0x00024cfd}}, Y: Field{[10]uint32{0x00ea76ad, 0x02a72ae8, 0x02ba9f85, 0x03fe4ec7, 0x01ad1d70, 0x01253950, 0x01ea647f, 0x036d8d20, 0x0047481c, 0x00198167}}}, + {X: Field{[10]uint32{0x03bb6b34, 0x0307f816, 0x02cf664a, 0x01d87b06, 0x018a397f, 0x02f27272, 0x02446910, 0x02b4df5f, 0x0322b182, 0x00028c03}}, Y: Field{[10]uint32{0x0033593d, 0x00aead15, 0x035007b4, 0x011188a2, 0x01684abe, 0x01c8bc85, 0x00de2694, 0x01d2e518, 0x03fca909, 0x002f5bcb}}}, + {X: Field{[10]uint32{0x038fe1ea, 0x01b8fb2b, 0x03fd685d, 0x02d54a38, 0x00878b79, 0x03b9358c, 0x03c1d62d, 0x004d57e5, 0x03ed6e90, 0x003f1795}}, Y: Field{[10]uint32{0x035bab01, 0x02a6cacb, 0x01d498c4, 0x0124d172, 0x02bc7c85, 0x02141efb, 0x018b1b56, 0x032ee796, 0x027a6c21, 0x00044884}}}, + {X: Field{[10]uint32{0x0231ef3d, 0x0114bed4, 0x00bfff3f, 0x015ba8d0, 0x030899e9, 0x02406548, 0x00721c19, 0x02047ef5, 0x00e27a64, 0x00168bd0}}, Y: Field{[10]uint32{0x0093d547, 0x0048b4c8, 0x0086c20a, 0x00e989e6, 0x01d8c4a5, 0x0275c70c, 0x0206d263, 0x0231e5d2, 0x015d1257, 0x001acafe}}}, + {X: Field{[10]uint32{0x00f2084f, 0x005e6d59, 0x033106f9, 0x01f63747, 0x02fb1575, 0x01f5fbd8, 0x036610d6, 0x026716f9, 0x0333df0b, 0x00165e0c}}, Y: Field{[10]uint32{0x025b7f5a, 0x01d9a51f, 0x00c4fa76, 0x025f0d3d, 0x037d309d, 0x029d60fa, 0x03f4623b, 0x005c3204, 0x0280dd3d, 0x003caa7a}}}, + {X: Field{[10]uint32{0x03672d95, 0x01b6c7cd, 0x00a08154, 0x035d329f, 0x01a1c8be, 0x01e8a70b, 0x0372bb38, 0x00ff21cf, 0x01246b51, 0x00033d84}}, Y: Field{[10]uint32{0x038c70ee, 0x03deaf0b, 0x007873ef, 0x03d0b81f, 0x021e182c, 0x0187ec3f, 0x011d1a56, 0x00110e7b, 0x0076697f, 0x00348f0f}}}, + {X: Field{[10]uint32{0x03fe7d52, 0x012c5ccb, 0x017baac1, 0x032581a5, 0x031cb871, 0x0018fe3a, 0x02eb7eb8, 0x00520389, 0x0305133a, 0x003b7453}}, Y: Field{[10]uint32{0x00b1b70a, 0x017e358d, 0x0392a61b, 0x00203291, 0x02ee6033, 0x011709d3, 0x01b3aa84, 0x0354a130, 0x0280d295, 0x0035a0bc}}}, + {X: Field{[10]uint32{0x001a1713, 0x036571ff, 0x000d175f, 0x00c2977a, 0x0033cb8d, 0x0325649b, 0x026e7902, 0x022bce2c, 0x00e90cdc, 0x003e6c3f}}, Y: Field{[10]uint32{0x02a3e6ac, 0x0148903c, 0x022b5d47, 0x022f5bf3, 0x01df958b, 0x0233d2a2, 0x01083cdc, 0x018f5c60, 0x01f6f3d1, 0x003b1fa3}}}, + {X: Field{[10]uint32{0x0346a3b7, 0x02ff4905, 0x014e4e46, 0x0057c1c2, 0x02d9ea43, 0x0105f159, 0x03069817, 0x01fd5e24, 0x01995418, 0x002ba419}}, Y: Field{[10]uint32{0x031a129b, 0x01515fc8, 0x01b10677, 0x01cc16f9, 0x01173355, 0x02811c27, 0x01006ff2, 0x00cc4fa7, 0x01adc09d, 0x0008906f}}}, + {X: Field{[10]uint32{0x03d956e9, 0x02cd4391, 0x03540c54, 0x03cd1041, 0x03f68fe9, 0x01606b8e, 0x02134cde, 0x00bdefd7, 0x00007649, 0x00157c3e}}, Y: Field{[10]uint32{0x033956ff, 0x029232f0, 0x00b982c8, 0x02d71c33, 0x01e258dc, 0x017fa60d, 0x03b4b8a3, 0x0222877e, 0x011de684, 0x0008a822}}}, + {X: Field{[10]uint32{0x01663bbb, 0x00665306, 0x010c1b87, 0x03131147, 0x006cb7e3, 0x03e1991f, 0x0123bb1d, 0x010388c6, 0x030686fb, 0x0024322a}}, Y: Field{[10]uint32{0x00c80ab4, 0x01ef8fff, 0x02463e3b, 0x00625323, 0x01cb30d7, 0x03105e5e, 0x03bb2c50, 0x03acb71b, 0x00d9570e, 0x00371d23}}}, + {X: Field{[10]uint32{0x00a4c694, 0x00b89f21, 0x02b604bb, 0x01aeb027, 0x013e476d, 0x01baa127, 0x0268e735, 0x03aee7ec, 0x002d6b21, 0x0032fd1f}}, Y: Field{[10]uint32{0x02bb2873, 0x021bee9e, 0x001cf16e, 0x037f6ac2, 0x01416ed9, 0x01658908, 0x02bf8bbe, 0x022528e6, 0x03e68042, 0x003c0a23}}}, + {X: Field{[10]uint32{0x0111fe80, 0x027f3a5f, 0x03b1637e, 0x02c91950, 0x00d8f1bf, 0x005235ce, 0x03ff7582, 0x01a2c823, 0x005fc18b, 0x001f0c22}}, Y: Field{[10]uint32{0x00013f2f, 0x01471d8f, 0x0221c7ea, 0x006298f9, 0x0052c067, 0x03221b84, 0x02c6d378, 0x007056c9, 0x00b931a1, 0x000f8b47}}}, + {X: Field{[10]uint32{0x026d7753, 0x0050cefd, 0x033e64f1, 0x01c8dfcc, 0x03e137c7, 0x03a481f6, 0x02a9da9d, 0x032e8374, 0x01190d1b, 0x002b5852}}, Y: Field{[10]uint32{0x0239753d, 0x027807b4, 0x03d0baad, 0x035c3b14, 0x00190b72, 0x02e9d66d, 0x02046192, 0x02862275, 0x018b3512, 0x003f2ba8}}}, + {X: Field{[10]uint32{0x025e29a2, 0x01729f13, 0x01715a29, 0x01c68e4e, 0x00a7bc41, 0x03b4cd6d, 0x02b50a81, 0x027055c2, 0x001baf8c, 0x00237dc1}}, Y: Field{[10]uint32{0x01ce02e7, 0x0192e92f, 0x01a1399b, 0x030e1286, 0x00e12eab, 0x01f771b7, 0x0166b24c, 0x01ef77cd, 0x02438267, 0x0003a24b}}}, + {X: Field{[10]uint32{0x00fdadd6, 0x009e010b, 0x00fbf2a1, 0x01ddf762, 0x02217f4e, 0x0306ed7d, 0x0351891a, 0x01483a69, 0x025761c8, 0x0027d307}}, Y: Field{[10]uint32{0x027d0f50, 0x02e583d3, 0x008609d9, 0x018e7cf5, 0x02ed4b69, 0x00f84b1e, 0x035831eb, 0x03a22430, 0x00adc6ce, 0x003f6884}}}, + {X: Field{[10]uint32{0x0115acbf, 0x02332ae9, 0x0147c2ee, 0x0061d496, 0x03174de6, 0x00778c24, 0x013bacf9, 0x01c28b02, 0x00dd23ac, 0x00290dbd}}, Y: Field{[10]uint32{0x0219afb9, 0x015fbfdf, 0x020ec9fe, 0x02cc1f51, 0x005879e8, 0x009ef04a, 0x039a4509, 0x016e6a50, 0x01d92a61, 0x00303a76}}}, + {X: Field{[10]uint32{0x006f1930, 0x037e882e, 0x007d567b, 0x019f1655, 0x0037497c, 0x000e5a57, 0x018627c5, 0x010f645b, 0x01166997, 0x0028e3bb}}, Y: Field{[10]uint32{0x01d9d7fd, 0x03951512, 0x00c18bb0, 0x02c52105, 0x013be89b, 0x03c9b247, 0x035b5fe3, 0x00ed6b26, 0x02d6effc, 0x001b8f8f}}}, + {X: Field{[10]uint32{0x02fbf3d6, 0x0187aeb8, 0x02586833, 0x039623a4, 0x000b6f1d, 0x01ac3c93, 0x03659e33, 0x010e87eb, 0x00d20d40, 0x0017d164}}, Y: Field{[10]uint32{0x015197db, 0x0242f801, 0x00466158, 0x02dc0090, 0x02ccc833, 0x01939ffd, 0x001af117, 0x03bb00fb, 0x0273042c, 0x00094302}}}, + {X: Field{[10]uint32{0x00cf56c0, 0x0147d10d, 0x03c551be, 0x031dcf3a, 0x03d52bea, 0x03dca0a8, 0x02d16ff8, 0x02e401a3, 0x020dc6eb, 0x001d5961}}, Y: Field{[10]uint32{0x02e24c26, 0x01187c2e, 0x01346c32, 0x01ff8078, 0x039b8468, 0x0275fcfa, 0x028ad7de, 0x03516150, 0x00be526e, 0x0012d5bb}}}, + {X: Field{[10]uint32{0x01a9320c, 0x01ed43e5, 0x035dec53, 0x010afa02, 0x02772927, 0x00800e96, 0x03ad50f0, 0x03bc072a, 0x03ce3a56, 0x000f9f1f}}, Y: Field{[10]uint32{0x03dbfaf1, 0x0349c8a4, 0x03914a32, 0x00b31256, 0x01d5dc34, 0x0267ea76, 0x03789045, 0x01c447cd, 0x00b7926e, 0x00263365}}}, + {X: Field{[10]uint32{0x03cda208, 0x001c9d2d, 0x035522eb, 0x003dabd5, 0x032ac91a, 0x031318aa, 0x031aaf5e, 0x033e12af, 0x005714ce, 0x0004c7ad}}, Y: Field{[10]uint32{0x0320839e, 0x03f625f8, 0x0303127b, 0x004d8344, 0x029b017a, 0x02bb156a, 0x0061393f, 0x0098111b, 0x014ff051, 0x002a4ebb}}}, + {X: Field{[10]uint32{0x02a11ec8, 0x037493a8, 0x026f1637, 0x0380b6cf, 0x02a98e68, 0x0312d7d0, 0x008bff69, 0x018f5c0e, 0x0201e469, 0x000dc6f1}}, Y: Field{[10]uint32{0x01f84622, 0x02765292, 0x03dd37b3, 0x03c4ea9a, 0x0121bbc7, 0x006e249a, 0x0385238c, 0x028906a5, 0x02f1932f, 0x0038befb}}}, + {X: Field{[10]uint32{0x02e47d6d, 0x03d41172, 0x002371bc, 0x00d3910c, 0x01b4d459, 0x00b11461, 0x0136bc20, 0x01cfa280, 0x030492ca, 0x0011dc36}}, Y: Field{[10]uint32{0x0141ec22, 0x03bbcd8b, 0x0390af1a, 0x01ed2c75, 0x0399a92f, 0x00877d2f, 0x037e080d, 0x03641aad, 0x008c25b1, 0x00386bdd}}}, + {X: Field{[10]uint32{0x0194bfff, 0x00a04b25, 0x02fe0da8, 0x00d081e1, 0x01e8e2ae, 0x01f38ebd, 0x01dbae16, 0x036d5dd6, 0x02435af5, 0x002cc6a1}}, Y: Field{[10]uint32{0x009aa4a2, 0x010ef8f0, 0x020cf3c7, 0x0341547f, 0x00f5aaab, 0x0216c1a9, 0x02a85a25, 0x03266aa5, 0x025e860d, 0x000de4d0}}}, + {X: Field{[10]uint32{0x013631f4, 0x00b9996f, 0x019bf09b, 0x02f5f472, 0x00a94121, 0x018670dd, 0x01fe6dd1, 0x009407f7, 0x0052084a, 0x003817bb}}, Y: Field{[10]uint32{0x03b8e622, 0x031589bf, 0x01ed4f6c, 0x01ddb49a, 0x014d883d, 0x035d0909, 0x0224ea4b, 0x03e01a66, 0x03172122, 0x00300457}}}, + {X: Field{[10]uint32{0x0173d5c8, 0x0228c94a, 0x0335ce4d, 0x03beffce, 0x03e57810, 0x025f4fd5, 0x0384305d, 0x001f4d16, 0x00840ee4, 0x00395777}}, Y: Field{[10]uint32{0x027ee677, 0x03a24d90, 0x011a1026, 0x01abe833, 0x00abb87a, 0x023aec4f, 0x003e4257, 0x018505f9, 0x03b5b0fa, 0x001c7dde}}}, + {X: Field{[10]uint32{0x02cd788f, 0x03748fb7, 0x01f0ed46, 0x01dbc9aa, 0x021aabbe, 0x014074cf, 0x00bf3ea5, 0x02a6a8a1, 0x02b1a5c8, 0x003b5eda}}, Y: Field{[10]uint32{0x010db63e, 0x00cf8047, 0x030d3772, 0x0363145d, 0x03824027, 0x037f60be, 0x0054a4bc, 0x02988061, 0x035419d1, 0x0008a02e}}}, + {X: Field{[10]uint32{0x0090e79a, 0x0019c520, 0x02001f96, 0x0078893c, 0x01ce5cb7, 0x03353b9a, 0x03a3329a, 0x0362bb84, 0x01fc3da4, 0x003538cc}}, Y: Field{[10]uint32{0x015e10d6, 0x02385619, 0x00c521ae, 0x01441b42, 0x0277821e, 0x01aa2044, 0x00a6b42d, 0x0334c27d, 0x01aa2f63, 0x00225450}}}, + {X: Field{[10]uint32{0x016d4417, 0x022d21e2, 0x03d54d64, 0x02384834, 0x03265471, 0x036054b1, 0x002545ab, 0x007ff99a, 0x020ea8ec, 0x0013c2b6}}, Y: Field{[10]uint32{0x035aa591, 0x03b1fd64, 0x00cd4dc5, 0x01515b22, 0x0320aaff, 0x02a7eebd, 0x035acf55, 0x02ad191f, 0x01ac6026, 0x002980ee}}}, + {X: Field{[10]uint32{0x00fdca84, 0x03ab8f80, 0x031b7543, 0x0015041a, 0x00a884cc, 0x0037dd4a, 0x0086a9d2, 0x03bb893c, 0x0141b08e, 0x0028b44d}}, Y: Field{[10]uint32{0x00803a45, 0x000edfd7, 0x002d1745, 0x00d61780, 0x024bb67c, 0x03f58172, 0x03a52497, 0x01ae4549, 0x0166294d, 0x0016b02c}}}, + {X: Field{[10]uint32{0x01b6c8a4, 0x03a048ed, 0x0008f64f, 0x00880b38, 0x03cbfc47, 0x03ea517f, 0x00887fda, 0x001164ae, 0x0120014a, 0x00013075}}, Y: Field{[10]uint32{0x00ed738d, 0x00f8cd14, 0x026083bb, 0x03d0e542, 0x00ebcebf, 0x00d23bf5, 0x0106597f, 0x0246395f, 0x028017b7, 0x00090f10}}}, + {X: Field{[10]uint32{0x03c54390, 0x025c2a4a, 0x02c551a5, 0x01f7fcca, 0x00fc2f5b, 0x008c172c, 0x035b8e6b, 0x03a6d330, 0x01a67d13, 0x00017e79}}, Y: Field{[10]uint32{0x0395ff6f, 0x02550edc, 0x0276b30d, 0x02dc9bcc, 0x0085eb0c, 0x022fb7c0, 0x005833ce, 0x017df6f1, 0x02379696, 0x001d2021}}}, + {X: Field{[10]uint32{0x00954575, 0x00d2f282, 0x01286985, 0x025cd293, 0x004447c2, 0x0038a6ad, 0x02d28a88, 0x006c5e02, 0x03809538, 0x0035db1b}}, Y: Field{[10]uint32{0x0161b27b, 0x021cc029, 0x0049859c, 0x03c49def, 0x02aa8273, 0x00390a77, 0x02051789, 0x03806984, 0x03f86b30, 0x00112db0}}}, + {X: Field{[10]uint32{0x01df3344, 0x022816f6, 0x00658e7a, 0x0074036b, 0x006ad19f, 0x01619286, 0x03a9eaeb, 0x01d6bdc0, 0x029ff787, 0x001d5ddc}}, Y: Field{[10]uint32{0x030afec9, 0x030fe64b, 0x0134532e, 0x02c4b9c1, 0x033fa7c5, 0x0239fb3c, 0x012f8229, 0x02a94e4b, 0x0116ccea, 0x001ad466}}}, + {X: Field{[10]uint32{0x02dc17db, 0x0245b163, 0x03a67fca, 0x022c0dae, 0x0278700c, 0x01ab6a64, 0x03194258, 0x0012eb42, 0x032b457f, 0x00140de3}}, Y: Field{[10]uint32{0x02273fc1, 0x028f0bdd, 0x00ad05fe, 0x0193e0bf, 0x03269573, 0x0314ce33, 0x01bf40ba, 0x0335246b, 0x011c26bd, 0x0032f451}}}, + {X: Field{[10]uint32{0x009ba86c, 0x00e2fa33, 0x02b50b91, 0x01138f58, 0x027606eb, 0x0301e3fc, 0x0384ba0e, 0x01458098, 0x00686436, 0x000dd237}}, Y: Field{[10]uint32{0x0211d709, 0x020f2659, 0x01271965, 0x02074d43, 0x016e7bfb, 0x038060a3, 0x01005a04, 0x02ba7377, 0x0014f624, 0x001b0139}}}, + {X: Field{[10]uint32{0x03eea53b, 0x03174715, 0x014047f9, 0x010b417f, 0x013402f3, 0x027ab1ca, 0x01eaea44, 0x035587ef, 0x01be8ea8, 0x002c8e96}}, Y: Field{[10]uint32{0x006dfb9b, 0x03c3a110, 0x019c42fe, 0x03fdc0bb, 0x0295d40e, 0x00fd7e86, 0x03c359c8, 0x016e0b38, 0x0068f2d3, 0x002fa91f}}}, + {X: Field{[10]uint32{0x02a64770, 0x035c7045, 0x00b49ebf, 0x001a4973, 0x039538fc, 0x01c074ae, 0x005f4435, 0x0296f817, 0x01e87b42, 0x00392d14}}, Y: Field{[10]uint32{0x03156da4, 0x019eddcb, 0x001e9e14, 0x029a2a42, 0x014cb261, 0x02de6e61, 0x02fa86b2, 0x001d2523, 0x02699a79, 0x000abe11}}}, + {X: Field{[10]uint32{0x02dff165, 0x03dd5225, 0x01a1242f, 0x005593cf, 0x01de74a2, 0x0194777e, 0x02e671e8, 0x02c218d1, 0x02ec65b8, 0x002192b1}}, Y: Field{[10]uint32{0x031a8730, 0x03ad8009, 0x03188d68, 0x000b7ea4, 0x01b2cbf9, 0x0234afaf, 0x00a5103c, 0x02155647, 0x00a77ab4, 0x003cd5ce}}}, + {X: Field{[10]uint32{0x002ecab0, 0x009c95fc, 0x02ac4ecb, 0x035e6815, 0x00fd36c5, 0x01990e19, 0x00090225, 0x018f66de, 0x023da6a8, 0x002df412}}, Y: Field{[10]uint32{0x0383b0c1, 0x01fbdc1b, 0x031a15ec, 0x02f9d4c3, 0x001519ab, 0x039a81f0, 0x01e4e3bf, 0x03708f96, 0x034c6ba5, 0x00331018}}}, + {X: Field{[10]uint32{0x014c1a0e, 0x023f289c, 0x0044c7ca, 0x00c43af2, 0x03bd6e25, 0x02a0ddf3, 0x020de0c4, 0x03776080, 0x02f9b51e, 0x00377f06}}, Y: Field{[10]uint32{0x03fe3951, 0x0259838f, 0x01ad957b, 0x03d368f8, 0x01c30f23, 0x00976aae, 0x02d9f54a, 0x0313a2c8, 0x008c1742, 0x00033ddf}}}, + {X: Field{[10]uint32{0x011fcbe3, 0x016d1f35, 0x03c30ea7, 0x023e21a3, 0x01e00c82, 0x0053611e, 0x03de26a6, 0x02478e84, 0x0269d5bb, 0x001e3f3f}}, Y: Field{[10]uint32{0x03f2d47d, 0x029b9c91, 0x0306066d, 0x01210d03, 0x0298021b, 0x030a050e, 0x00b231aa, 0x014eeac3, 0x01636b70, 0x0027b19e}}}, + {X: Field{[10]uint32{0x0115863f, 0x00137684, 0x028fcd42, 0x0211e0ce, 0x03138c98, 0x0279dbb2, 0x022b4f81, 0x0075c608, 0x00de1696, 0x00373646}}, Y: Field{[10]uint32{0x0323bb04, 0x014aaeb2, 0x01ed2f5e, 0x003604e9, 0x023ff7fb, 0x004f0a4c, 0x012318dd, 0x00233f28, 0x00bac8d8, 0x002af0f6}}}, + {X: Field{[10]uint32{0x02c3177e, 0x00201b31, 0x012b294a, 0x028a5b33, 0x02e6f64f, 0x00def084, 0x0294eef5, 0x02041a4c, 0x02f05de0, 0x000e738b}}, Y: Field{[10]uint32{0x00730556, 0x034a76de, 0x0349239f, 0x0369e250, 0x020bbb5d, 0x03ce899a, 0x020ca926, 0x025e8e5e, 0x00cb0b76, 0x00097abd}}}, + {X: Field{[10]uint32{0x03157a04, 0x01a94f40, 0x02b5abae, 0x013f4e91, 0x02146451, 0x025eb12e, 0x010e937e, 0x03a27b7d, 0x01b643d4, 0x00125793}}, Y: Field{[10]uint32{0x02ec1701, 0x02c715f9, 0x026d46e6, 0x006e8833, 0x00f84bb8, 0x023105ad, 0x024251cf, 0x0035a7af, 0x0218b296, 0x001f4c9f}}}, + {X: Field{[10]uint32{0x037c33c1, 0x03d6e598, 0x03dbefca, 0x025fd6d9, 0x03a6cb6e, 0x027e79bd, 0x036dde52, 0x01f03070, 0x028cb635, 0x0024705f}}, Y: Field{[10]uint32{0x014c39ba, 0x017b06e9, 0x00e85c96, 0x0383da17, 0x03f07b76, 0x003d61ab, 0x01e26922, 0x022b0bbf, 0x0097fedb, 0x000bf948}}}, + {X: Field{[10]uint32{0x01ecfdbc, 0x01c48875, 0x018d4c03, 0x026f5ab8, 0x001c2874, 0x03172564, 0x011f11ec, 0x03b5118a, 0x00803dff, 0x0038f13d}}, Y: Field{[10]uint32{0x03dc62d8, 0x00afa4b2, 0x0240c65b, 0x009d514f, 0x004e7fb8, 0x033be2ca, 0x00ad71da, 0x009f3a5d, 0x0102571e, 0x00168b9c}}}, + {X: Field{[10]uint32{0x01c25073, 0x01763b5d, 0x0333acc1, 0x03a95a03, 0x0059ae7b, 0x03e772ee, 0x0014377a, 0x0079ed22, 0x03f5a0e8, 0x002cfb85}}, Y: Field{[10]uint32{0x00bfe86d, 0x024b9f5b, 0x01ecb6d0, 0x035415ce, 0x03b46332, 0x00e7b788, 0x0035afe1, 0x00a09698, 0x000c9a6d, 0x0004d68f}}}, + {X: Field{[10]uint32{0x02e76b75, 0x019819ba, 0x01732298, 0x0365796d, 0x017ca6e8, 0x019248cd, 0x02628e1f, 0x006fb4d0, 0x00442bc9, 0x0039332a}}, Y: Field{[10]uint32{0x016f76b9, 0x02364394, 0x01cececc, 0x03880c76, 0x02409f74, 0x00c66b1c, 0x00b42b0f, 0x019c3fdc, 0x015539b5, 0x00375569}}}, + {X: Field{[10]uint32{0x02223b2c, 0x02fefdf6, 0x02359b5e, 0x03aa58ad, 0x02e517e4, 0x013ab9eb, 0x00c02a46, 0x01822666, 0x03c181c9, 0x002ace73}}, Y: Field{[10]uint32{0x037d2fc4, 0x0393aa41, 0x02096a22, 0x01403e65, 0x0172ba3b, 0x00a06862, 0x01cfec18, 0x02ef8b9b, 0x0057b4dc, 0x0037bdb7}}}, + {X: Field{[10]uint32{0x03ab402a, 0x01172137, 0x02e01f8e, 0x034652ce, 0x02677572, 0x0193c206, 0x00cad409, 0x0011a7f9, 0x02639e6e, 0x0008a8c9}}, Y: Field{[10]uint32{0x00d2b437, 0x0157e610, 0x02f261b8, 0x0141750a, 0x00db44cf, 0x013263f3, 0x00f61484, 0x003bc16b, 0x0195bd4e, 0x00072727}}}, + {X: Field{[10]uint32{0x01f9cae9, 0x03f30908, 0x029037c2, 0x0285de42, 0x02db269d, 0x03ef137a, 0x03c5ead4, 0x012fc0c1, 0x00cceff9, 0x000af1e2}}, Y: Field{[10]uint32{0x00bc4b41, 0x000f9389, 0x01384aa7, 0x01227583, 0x00ccecb2, 0x0231e30f, 0x0081c43a, 0x01548110, 0x0061648c, 0x0005cbcd}}}, + {X: Field{[10]uint32{0x02052729, 0x00a8c000, 0x00fe4c62, 0x00d827ef, 0x003872c6, 0x02ef9a7a, 0x0275bb88, 0x001804d6, 0x03d2a672, 0x002e4c36}}, Y: Field{[10]uint32{0x0206f366, 0x0103fd6b, 0x01ebd839, 0x00d8ccd3, 0x01ff3f68, 0x01d0e2ce, 0x030e7f9a, 0x03a2e0a0, 0x0303a872, 0x0002660f}}}, + {X: Field{[10]uint32{0x0114e3d3, 0x02cb8e5d, 0x03466f33, 0x00fa1ca8, 0x0329bcd0, 0x029bc61b, 0x02db448d, 0x03a901c0, 0x038a2aa9, 0x002d0d5c}}, Y: Field{[10]uint32{0x0098636b, 0x01511ce4, 0x0074e92c, 0x02383d87, 0x011678cb, 0x0330d241, 0x0217e55b, 0x019c7e15, 0x02462d3c, 0x00160a34}}}, + {X: Field{[10]uint32{0x0072bd25, 0x037fee4c, 0x0223b532, 0x01fe76d8, 0x02ee1fe6, 0x01060375, 0x012df27d, 0x026ebcb1, 0x02813acc, 0x003247cb}}, Y: Field{[10]uint32{0x01b73c0c, 0x0057c1e1, 0x0345569c, 0x003ef493, 0x02b02735, 0x00ddf878, 0x02fa0c2b, 0x00bc4c4e, 0x03d696c1, 0x00072715}}}, + {X: Field{[10]uint32{0x008d36c8, 0x0257c017, 0x0131d2b9, 0x001be31f, 0x030bad0d, 0x005b6400, 0x028068f4, 0x02ea4e3c, 0x02c28099, 0x002ec251}}, Y: Field{[10]uint32{0x0176da4a, 0x00e41afb, 0x00164867, 0x007dde0b, 0x00156042, 0x03a5e3ca, 0x03e1a621, 0x017fa5e3, 0x00d93b57, 0x00238e1e}}}, + {X: Field{[10]uint32{0x03085c8d, 0x0281a923, 0x03398c31, 0x03df2d13, 0x035298db, 0x01c1fcd9, 0x0106521a, 0x00cdd335, 0x02a12e82, 0x0012178e}}, Y: Field{[10]uint32{0x02ca9a61, 0x018005e1, 0x03878a4b, 0x03837ed3, 0x02af0153, 0x000bf098, 0x0339d4c3, 0x02cac568, 0x02f57079, 0x00284b22}}}, + {X: Field{[10]uint32{0x013e844d, 0x027ee69c, 0x03db3e8a, 0x00a9e219, 0x020f21d0, 0x022a5baa, 0x00da03fe, 0x00895a50, 0x0048d328, 0x002143e5}}, Y: Field{[10]uint32{0x03fccb7b, 0x02c9108e, 0x00d8259a, 0x00d8296a, 0x0103a678, 0x0162a083, 0x034df3af, 0x02e8b029, 0x00fe3201, 0x00115479}}}, + {X: Field{[10]uint32{0x03e39884, 0x03214ec2, 0x01c43682, 0x030152db, 0x01449cd4, 0x03abd476, 0x00e51b18, 0x007f927e, 0x02b3f66c, 0x0029d205}}, Y: Field{[10]uint32{0x0372f7fc, 0x033bdfac, 0x0004f15e, 0x039203b2, 0x01396626, 0x01330416, 0x02f0cfdc, 0x01fa8516, 0x03b247ed, 0x00139f57}}}, + {X: Field{[10]uint32{0x0320136d, 0x02b5adde, 0x02f7785e, 0x00b5ae62, 0x02e1eb70, 0x00d04805, 0x01abcc17, 0x02885c1e, 0x016fc71d, 0x000abd71}}, Y: Field{[10]uint32{0x02b706bd, 0x01455061, 0x029321b6, 0x03642d4c, 0x02783911, 0x00c69ae3, 0x0049e95a, 0x00988ecb, 0x00a2c6a8, 0x001fcc44}}}, + {X: Field{[10]uint32{0x039b5834, 0x013fb90c, 0x00903968, 0x00525c98, 0x031a3137, 0x02b983b6, 0x0163135f, 0x037c7a43, 0x0091a61a, 0x0024a47b}}, Y: Field{[10]uint32{0x01d03884, 0x007745ef, 0x01e09bac, 0x02f2b78b, 0x03feef42, 0x020cb7a4, 0x009649f1, 0x036ecff0, 0x006be8b0, 0x00354c14}}}, + {X: Field{[10]uint32{0x00605b54, 0x0110a4b3, 0x028e1144, 0x034608f3, 0x03a8581f, 0x03863fda, 0x029cb474, 0x01e05813, 0x03c3659a, 0x000582b4}}, Y: Field{[10]uint32{0x00d141fe, 0x007d09a9, 0x03b58b6e, 0x03060636, 0x010a59f2, 0x007ae476, 0x01f939eb, 0x035c6698, 0x024d5f28, 0x00058611}}}, + {X: Field{[10]uint32{0x00ba9d58, 0x01c64d18, 0x02572b40, 0x03e18d62, 0x01ea4280, 0x01cf6b63, 0x005a5d76, 0x024830b6, 0x01bb8640, 0x000d4966}}, Y: Field{[10]uint32{0x03538d0c, 0x01f470a2, 0x0164a50f, 0x03618e35, 0x00aa2ac3, 0x00f2572b, 0x017707ad, 0x013cac8b, 0x011be806, 0x0029e296}}}, + {X: Field{[10]uint32{0x036ba527, 0x00b13ede, 0x03f334d1, 0x038488da, 0x01adb37c, 0x03a78575, 0x037a7281, 0x018d364b, 0x03bd9a8c, 0x003b083b}}, Y: Field{[10]uint32{0x0151b70d, 0x015ecec3, 0x021e2a9a, 0x024bf550, 0x02e8c547, 0x01ebe762, 0x019315e2, 0x00c454e4, 0x01bc2a5a, 0x002b36ca}}}, + {X: Field{[10]uint32{0x02dbebc3, 0x02b51838, 0x0064c5cf, 0x0214618f, 0x01bbd387, 0x0165e07a, 0x02e847dc, 0x031bb157, 0x00da8bda, 0x00103479}}, Y: Field{[10]uint32{0x016e9ab0, 0x0099568c, 0x013acd3a, 0x03fc9fed, 0x004e3755, 0x02e8fb06, 0x03c7d5bd, 0x00b9a299, 0x001cb7c9, 0x00318c16}}}, + {X: Field{[10]uint32{0x027d08c7, 0x02e91103, 0x035127db, 0x00b7c3fe, 0x0081674c, 0x022d9b7d, 0x01ac1c39, 0x037cb8ac, 0x03402faa, 0x003ef849}}, Y: Field{[10]uint32{0x03f412d6, 0x00bdee2d, 0x0187c52f, 0x00d39ba1, 0x00f3dfee, 0x011245a6, 0x00871821, 0x005340eb, 0x00d7f979, 0x003403b7}}}, + {X: Field{[10]uint32{0x0191eb03, 0x0364c370, 0x0008bb0c, 0x0358990c, 0x034070d9, 0x03ec7848, 0x010fbd80, 0x0247ee21, 0x01a747d1, 0x0035e06d}}, Y: Field{[10]uint32{0x006afa11, 0x01ac63cd, 0x03792d90, 0x00c09236, 0x019762ef, 0x0066ca44, 0x01f29245, 0x02ad57e5, 0x01a25c74, 0x00292aa5}}}, + {X: Field{[10]uint32{0x00cf02cd, 0x0111bc27, 0x0052944a, 0x00e7b948, 0x0122790c, 0x00e56d7a, 0x01045d00, 0x02f1f045, 0x0042d926, 0x00191cbf}}, Y: Field{[10]uint32{0x0205a99d, 0x02de2511, 0x0106863d, 0x02d438ab, 0x03045d1a, 0x00cf210a, 0x0264e376, 0x024f7b88, 0x0014a925, 0x00001448}}}, + {X: Field{[10]uint32{0x015e0c21, 0x0057b58e, 0x03fd2c57, 0x00993203, 0x005fa6cf, 0x01181e8b, 0x0117a935, 0x0007a1a9, 0x00c2e096, 0x003bb860}}, Y: Field{[10]uint32{0x0083e7ea, 0x01259a5d, 0x01711e06, 0x03c6b995, 0x0349490a, 0x03de1728, 0x03daff70, 0x01bf16d3, 0x0398221d, 0x003232e9}}}, + {X: Field{[10]uint32{0x01ada2d6, 0x012dd411, 0x00ab4fad, 0x03536d40, 0x039103be, 0x015d8c1d, 0x03ec071c, 0x02b50456, 0x022da172, 0x002402c9}}, Y: Field{[10]uint32{0x01e2cbaf, 0x0108f814, 0x015aa371, 0x0361459d, 0x0082c4c1, 0x00fe8d35, 0x0018e7fb, 0x03fa44fd, 0x03f2bbad, 0x000c5915}}}, + {X: Field{[10]uint32{0x03a34c9e, 0x02006884, 0x00e20420, 0x02c799af, 0x015d5e03, 0x027bca74, 0x02d3371b, 0x0141c1dc, 0x03874e1e, 0x001fa4f6}}, Y: Field{[10]uint32{0x038465a8, 0x0308ce78, 0x0356abc2, 0x011ed6fe, 0x0063f3ec, 0x00033704, 0x03aa0fee, 0x00ca9bd7, 0x02247500, 0x00337aa9}}}, + {X: Field{[10]uint32{0x01a379ca, 0x02320be2, 0x031f5da9, 0x01e80fb6, 0x02d17287, 0x012aff8e, 0x02761b84, 0x02957799, 0x002465f3, 0x001187ed}}, Y: Field{[10]uint32{0x00e815d9, 0x014a16c6, 0x0332b7f1, 0x0299ae39, 0x011f584a, 0x00179070, 0x0101dadc, 0x009c63d5, 0x01fdba03, 0x001da098}}}, + {X: Field{[10]uint32{0x0019e09f, 0x0379de25, 0x0059e997, 0x02997cd4, 0x036de28a, 0x006e93e4, 0x010f0cc9, 0x00683f97, 0x001af0f6, 0x000767d6}}, Y: Field{[10]uint32{0x011bf6cd, 0x00da6d22, 0x011f8adf, 0x00758889, 0x003f02db, 0x0259dbd5, 0x00302e18, 0x03715858, 0x018c7d59, 0x001ffa72}}}, + {X: Field{[10]uint32{0x027542c6, 0x010e085d, 0x0362be23, 0x03fcf337, 0x0166386d, 0x013bf8de, 0x00f7a70e, 0x00aa9c90, 0x0352904b, 0x002335c2}}, Y: Field{[10]uint32{0x01ddc2f2, 0x01afb26d, 0x001f1ff8, 0x00f62195, 0x020e9e29, 0x01caf1ae, 0x0308bb2f, 0x002c7c03, 0x003f4c7e, 0x002cf0f4}}}, + {X: Field{[10]uint32{0x034a5261, 0x02a98a3a, 0x02a2e819, 0x008d3910, 0x0199097b, 0x00036bbf, 0x025b8b38, 0x02196e66, 0x03ea9c08, 0x00282d51}}, Y: Field{[10]uint32{0x02ca2952, 0x0377627c, 0x03a2280c, 0x0063cb48, 0x00fd9d1e, 0x0289fad8, 0x003cb4e1, 0x00403700, 0x0115e585, 0x00181fbc}}}, + {X: Field{[10]uint32{0x0344d289, 0x0358d810, 0x0177578d, 0x03d57f6f, 0x00192406, 0x01fa06ad, 0x03a649c2, 0x00e38da0, 0x00f65470, 0x003aa298}}, Y: Field{[10]uint32{0x01822fb0, 0x003dd19e, 0x00691ac1, 0x033d4183, 0x02881b5f, 0x02f08bc5, 0x00b9f3e3, 0x0357aa3f, 0x02c0b05a, 0x00262bf2}}}, + {X: Field{[10]uint32{0x00b0a711, 0x02335285, 0x0075501a, 0x001a44d4, 0x0148bce5, 0x016ede0a, 0x01488fe5, 0x03e7bddf, 0x029d0882, 0x00398146}}, Y: Field{[10]uint32{0x02920fce, 0x02853d8b, 0x03498ffa, 0x0209364c, 0x00c1ec0c, 0x0182bdd7, 0x01257b8a, 0x02d5572e, 0x02be9d9e, 0x00072736}}}, + {X: Field{[10]uint32{0x00765674, 0x01497a62, 0x02a4b39a, 0x03153e3a, 0x03165338, 0x001f8396, 0x00e5efbc, 0x034cdc1b, 0x02c9c50f, 0x0018021d}}, Y: Field{[10]uint32{0x03ea4189, 0x01e5b936, 0x0346a213, 0x00b981a9, 0x03b04420, 0x0282c856, 0x01f5da0a, 0x0087ce0f, 0x031ef52b, 0x00100699}}}, + {X: Field{[10]uint32{0x02b2ff40, 0x03c7a5fd, 0x00185274, 0x01596df8, 0x003c0eca, 0x01a78105, 0x03efe121, 0x03f7426c, 0x039c5ef6, 0x000ec116}}, Y: Field{[10]uint32{0x02780a28, 0x039a04d8, 0x02dfad20, 0x01ef2c4d, 0x03a135a4, 0x035a4530, 0x00085d05, 0x001f10aa, 0x03acb211, 0x002a95dc}}}, + {X: Field{[10]uint32{0x01f0f1b6, 0x03b9fd2c, 0x022dc643, 0x0077954a, 0x01f9504b, 0x03b673bd, 0x027807fd, 0x01578135, 0x0132ee0b, 0x00373a63}}, Y: Field{[10]uint32{0x033fb086, 0x01687787, 0x031b8d43, 0x038a0077, 0x03aba058, 0x02b3d509, 0x03746d67, 0x00925f2e, 0x027c9e99, 0x00340eb0}}}, + {X: Field{[10]uint32{0x0378fd76, 0x03a61338, 0x0144958b, 0x01fc8be8, 0x03dd5aea, 0x00da19e1, 0x011c07a9, 0x0183fa2a, 0x01486e8a, 0x000d96c4}}, Y: Field{[10]uint32{0x0301c9c0, 0x00add87b, 0x005c3f85, 0x019d53d0, 0x01b36e27, 0x036ee3b0, 0x01ecbbcb, 0x01754131, 0x0217319e, 0x000b1fd4}}}, + {X: Field{[10]uint32{0x036b5806, 0x01cecbaa, 0x006cbb9c, 0x03a15f26, 0x023c3720, 0x013b78d5, 0x00dc3cad, 0x0197b7ba, 0x035a4dc4, 0x000b8de4}}, Y: Field{[10]uint32{0x03ce346b, 0x00e51752, 0x01522c0e, 0x0240431b, 0x02839cb6, 0x01fe0692, 0x02dc7f9d, 0x03d1b600, 0x03f15278, 0x002f421c}}}, + {X: Field{[10]uint32{0x01647568, 0x02eba53c, 0x030bb00f, 0x0215b91e, 0x0081cd85, 0x0035c656, 0x00ddf927, 0x016b5ed8, 0x00e19374, 0x000126da}}, Y: Field{[10]uint32{0x02819dc1, 0x01a4f01c, 0x03795755, 0x00c43d29, 0x021dc82d, 0x03d2e16f, 0x03cb2d05, 0x010fbd4e, 0x03f0013e, 0x00328752}}}, + {X: Field{[10]uint32{0x02744564, 0x00c3f33e, 0x0220cb81, 0x02e8f981, 0x016c8cc6, 0x027b781d, 0x02b6f66e, 0x016a20b0, 0x016cc79c, 0x001b7d4f}}, Y: Field{[10]uint32{0x02431344, 0x02013449, 0x036e1729, 0x01f2bed5, 0x014597f7, 0x00698525, 0x032f2914, 0x01f16491, 0x02ed3b2b, 0x001230f5}}}, + {X: Field{[10]uint32{0x034865a1, 0x0385c36f, 0x02b8bd28, 0x0307238c, 0x022f9467, 0x019c5168, 0x01636727, 0x038ee498, 0x03069104, 0x003667e3}}, Y: Field{[10]uint32{0x02543d7f, 0x02ff9414, 0x01479fd1, 0x00cf9044, 0x00c2b433, 0x0301b2c6, 0x0267c4e2, 0x01764d93, 0x02b055aa, 0x00333f11}}}, + {X: Field{[10]uint32{0x019930d1, 0x03ab64f9, 0x0342a538, 0x03f71a30, 0x01e23af7, 0x01562816, 0x00075728, 0x020ce2ea, 0x0017ebbf, 0x001ddc9f}}, Y: Field{[10]uint32{0x00c629ea, 0x0380ce10, 0x0308366d, 0x02504cf9, 0x00ede751, 0x017d4329, 0x023bc657, 0x0060083f, 0x007e2cde, 0x00280df7}}}, + {X: Field{[10]uint32{0x03e22604, 0x00328bda, 0x0266377e, 0x022667b0, 0x0036ae37, 0x0344ce6b, 0x00c84cfa, 0x013fdf05, 0x02d8563a, 0x0007503a}}, Y: Field{[10]uint32{0x00d1face, 0x007b0488, 0x01713a71, 0x00b6a5a3, 0x033a6b0c, 0x03137ee1, 0x025a5ac1, 0x0245ffb9, 0x0043b093, 0x002125ed}}}, + {X: Field{[10]uint32{0x006bfae0, 0x0241c410, 0x010ef405, 0x02645e8f, 0x03e32269, 0x0061034d, 0x0227c205, 0x02accdc6, 0x0341adf5, 0x0000a8e7}}, Y: Field{[10]uint32{0x005c27c5, 0x03cab1a4, 0x008ed155, 0x027b1c12, 0x008dd1a4, 0x03a11306, 0x0236b048, 0x027ee08e, 0x03a858e9, 0x000336bd}}}, + {X: Field{[10]uint32{0x01c684e0, 0x00dc2206, 0x0215e281, 0x024adb38, 0x0166f5ea, 0x0365d288, 0x031cc92f, 0x02331225, 0x00b1d8b0, 0x0002aab9}}, Y: Field{[10]uint32{0x03cd8f0c, 0x035e3a78, 0x01bdea34, 0x0344e909, 0x03c63739, 0x0145478c, 0x03d5cd50, 0x00d22a13, 0x0195c10a, 0x000248de}}}, + {X: Field{[10]uint32{0x02477d40, 0x03f6bf39, 0x03440965, 0x01520c7b, 0x0211315a, 0x02b0b278, 0x00939d29, 0x014ed8cd, 0x0042591a, 0x00296c30}}, Y: Field{[10]uint32{0x00a62ca6, 0x01e97301, 0x016d7e11, 0x03234a90, 0x00bc9904, 0x00f1f758, 0x022b206b, 0x000922cd, 0x00fd5d1f, 0x002b0f9f}}}, + {X: Field{[10]uint32{0x03c63f0b, 0x00b907c9, 0x035a1278, 0x02d40faf, 0x003c16e3, 0x03c252f9, 0x03643b47, 0x01aa5aa3, 0x0164e616, 0x000306dc}}, Y: Field{[10]uint32{0x01663a98, 0x003c079d, 0x01207fcc, 0x02fdcfb4, 0x01e34810, 0x0378eb1e, 0x010ba811, 0x03c7fd6d, 0x021a4ffa, 0x00211a45}}}, + {X: Field{[10]uint32{0x01ca63bc, 0x0263852b, 0x028b457b, 0x01763f7c, 0x00342e60, 0x03ac9b74, 0x00e0f2c8, 0x018fc136, 0x00254b79, 0x000263f6}}, Y: Field{[10]uint32{0x01a192d6, 0x0184456c, 0x0098f220, 0x0096f848, 0x012dc143, 0x032f2e67, 0x039dba65, 0x019991df, 0x000d213f, 0x0038a5ea}}}, + {X: Field{[10]uint32{0x014c3281, 0x02ceab56, 0x00dc163e, 0x033605ab, 0x0148c464, 0x030b9bc6, 0x034127d8, 0x03b524b4, 0x024971b6, 0x003c7c21}}, Y: Field{[10]uint32{0x00f31f5c, 0x00ce2ac0, 0x0031a346, 0x0394bf7b, 0x03506a0d, 0x01580b9b, 0x038954d8, 0x013ea44e, 0x02a0f9e0, 0x00009ab8}}}, + {X: Field{[10]uint32{0x030dd197, 0x010388e4, 0x03a91172, 0x00e98688, 0x01b63af8, 0x00141bed, 0x03441eac, 0x034ab298, 0x00cdc324, 0x0003fd1c}}, Y: Field{[10]uint32{0x0227788f, 0x00983495, 0x01eba5a5, 0x012e3f4c, 0x0330734b, 0x007be9ce, 0x007a772a, 0x01dfa118, 0x026bb18e, 0x0039807d}}}, + {X: Field{[10]uint32{0x006c63a6, 0x0110b7ef, 0x016dcd04, 0x02e4ccbb, 0x00ad0f82, 0x02aaeeaa, 0x0008127b, 0x02865ad6, 0x006d968a, 0x00243aaf}}, Y: Field{[10]uint32{0x035038f1, 0x03e93bae, 0x030f94c1, 0x038f7370, 0x032faed3, 0x0111daca, 0x03fc4be4, 0x00f35cb7, 0x0367ffb2, 0x0035b7c3}}}, + {X: Field{[10]uint32{0x007e11af, 0x012e2ef3, 0x03866ecd, 0x02dbfabc, 0x02bc0a43, 0x00c00d8f, 0x01e0826b, 0x001e86d0, 0x0126acc5, 0x003885ec}}, Y: Field{[10]uint32{0x01e98f30, 0x007f1b92, 0x01ecda8d, 0x017ec0c8, 0x02921e3a, 0x02c9e8e1, 0x00eb7332, 0x00cf562e, 0x01ef83db, 0x001faca3}}}, + {X: Field{[10]uint32{0x00e1d184, 0x039a2a7f, 0x0228d20d, 0x03bb1e55, 0x02b5d008, 0x01362ab4, 0x032bc218, 0x0175785d, 0x03d582b8, 0x000a865b}}, Y: Field{[10]uint32{0x02201303, 0x00e67d98, 0x022300c3, 0x019e2760, 0x0368526c, 0x02b4bfc7, 0x038dc8cc, 0x038f53f7, 0x0257ee9e, 0x002652d1}}}, + {X: Field{[10]uint32{0x02de4342, 0x0074099e, 0x002e6132, 0x02f5f99b, 0x02ca770c, 0x00463def, 0x01897c81, 0x0329fa2a, 0x03c83a6e, 0x002f278e}}, Y: Field{[10]uint32{0x014f3f4b, 0x01950b5c, 0x030a3f34, 0x0184be12, 0x00e2b076, 0x017cd749, 0x00992917, 0x029586ae, 0x03e2d544, 0x00275fbd}}}, + {X: Field{[10]uint32{0x02f198b3, 0x0144aaac, 0x00cdf6f6, 0x03b79a47, 0x017e76b8, 0x03c4bc82, 0x029e3676, 0x027e13fa, 0x03f3842a, 0x003fca04}}, Y: Field{[10]uint32{0x03fe1949, 0x012128b0, 0x03f7618a, 0x00abd00a, 0x01b8b668, 0x02027d21, 0x02de4380, 0x030586b1, 0x03d666d0, 0x00081b8e}}}, + {X: Field{[10]uint32{0x01af05f7, 0x011e6e34, 0x01baf6c7, 0x02f9382b, 0x0234a50b, 0x01da75f2, 0x01423210, 0x0358faf8, 0x01df2d38, 0x001b9d66}}, Y: Field{[10]uint32{0x03654c8d, 0x01bea978, 0x002cd555, 0x0117b346, 0x03256143, 0x01ad251a, 0x01ed56eb, 0x0136212a, 0x031d4b0e, 0x0008cf73}}}, + {X: Field{[10]uint32{0x03666146, 0x0141c64c, 0x039f9ba2, 0x00bad5db, 0x03839766, 0x02797059, 0x01844d1a, 0x03aca053, 0x00d56c82, 0x0007b767}}, Y: Field{[10]uint32{0x01f43f4c, 0x00946f8f, 0x0165fe24, 0x03725776, 0x0239d48d, 0x0345a083, 0x01b5cb04, 0x03a0fa52, 0x02850b2e, 0x002803d2}}}, + {X: Field{[10]uint32{0x007324af, 0x01e7ed90, 0x02b0718d, 0x01ce4b5e, 0x02818a2f, 0x00e2a07a, 0x024a0907, 0x01335dda, 0x02061f79, 0x0009c8f7}}, Y: Field{[10]uint32{0x02bbf41f, 0x00707fb1, 0x00e783db, 0x01c9df34, 0x0038daad, 0x0112ae22, 0x013429e3, 0x003140f1, 0x01bef981, 0x000d71ea}}}, + {X: Field{[10]uint32{0x039a213d, 0x027289aa, 0x0353af46, 0x00ae9f1a, 0x023874ec, 0x010f04f0, 0x01659eeb, 0x0137bdb6, 0x02444cb5, 0x001313ec}}, Y: Field{[10]uint32{0x038efa3d, 0x01d47956, 0x02472082, 0x036168d5, 0x03d4a1ae, 0x0126cce3, 0x039ad153, 0x01ea7ffa, 0x02fe5644, 0x002ef4ba}}}, + {X: Field{[10]uint32{0x027593e3, 0x0255c819, 0x0212f250, 0x034a3939, 0x0112847e, 0x03ecfef3, 0x03069771, 0x0256a238, 0x01f73479, 0x001cd8d6}}, Y: Field{[10]uint32{0x02bd3741, 0x0256fe44, 0x015f972c, 0x02920359, 0x00e303fd, 0x02e3e61a, 0x02215ca6, 0x001448d6, 0x03ed4bce, 0x0008eecd}}}, + {X: Field{[10]uint32{0x01f595be, 0x01e53661, 0x03293825, 0x03df0332, 0x026f33b0, 0x0021e6fb, 0x01813946, 0x01af452e, 0x0194ee93, 0x000572e5}}, Y: Field{[10]uint32{0x031bb152, 0x00950a7e, 0x0149ac7f, 0x03997962, 0x03e2e133, 0x036c9d3b, 0x03775e9e, 0x006ad804, 0x032a2ec8, 0x002aab5d}}}, + {X: Field{[10]uint32{0x03e78fa4, 0x01b159da, 0x00a9b41e, 0x01de987c, 0x02df5747, 0x002e1dca, 0x0290eb82, 0x033c7a12, 0x01ab97e5, 0x000ed522}}, Y: Field{[10]uint32{0x022219be, 0x00d33d95, 0x00cf9e71, 0x03aeeec4, 0x020d59a1, 0x0044f592, 0x02cad63f, 0x01285f33, 0x03c8e967, 0x00051744}}}, + {X: Field{[10]uint32{0x029dd2f5, 0x005d65e8, 0x01c56684, 0x0130e896, 0x0323323e, 0x0167389a, 0x01bec7bb, 0x034e16c2, 0x019aa6f9, 0x001e346e}}, Y: Field{[10]uint32{0x0216a122, 0x0220dedf, 0x020ef3cd, 0x033856d2, 0x00a6b890, 0x027da8a0, 0x014369ce, 0x02c8433d, 0x01f8e883, 0x00072344}}}, + {X: Field{[10]uint32{0x01661e85, 0x03457ece, 0x0121070c, 0x0060afa0, 0x02d2fd2d, 0x024e244b, 0x0013e3f0, 0x03eef4ea, 0x028c5cef, 0x000e1793}}, Y: Field{[10]uint32{0x0368069c, 0x00b6b2ea, 0x02c7036e, 0x03896337, 0x02c9b168, 0x00730232, 0x03ceb21c, 0x03ef1484, 0x00149f5c, 0x003d2871}}}, + {X: Field{[10]uint32{0x011aec6a, 0x0365c465, 0x02b1fc28, 0x00c0a4b5, 0x02a7c872, 0x014fa4a4, 0x0130df3c, 0x01b1b922, 0x0070d8e4, 0x000c43e3}}, Y: Field{[10]uint32{0x0017146f, 0x021bd70d, 0x01efdb03, 0x017db73b, 0x0359d92d, 0x0175c11b, 0x0315154d, 0x001ec959, 0x01d3c92c, 0x001bf8c6}}}, + {X: Field{[10]uint32{0x03c70bbb, 0x01996175, 0x00912940, 0x02590884, 0x03c1f91a, 0x02356248, 0x030b80d4, 0x03542b85, 0x003023d1, 0x001d93cf}}, Y: Field{[10]uint32{0x03dca724, 0x01f2d038, 0x038e4b54, 0x02e323ca, 0x03c3ee9e, 0x01e32673, 0x01411468, 0x02d283b6, 0x031abecd, 0x002f64be}}}, + {X: Field{[10]uint32{0x03e68126, 0x01fbdca8, 0x031ab36f, 0x01d4f11e, 0x02b37a80, 0x010042e2, 0x013c86f8, 0x028dfc6f, 0x03bab357, 0x000f5748}}, Y: Field{[10]uint32{0x0334255b, 0x0056575a, 0x028e0821, 0x018424c1, 0x017ccbb4, 0x017e7037, 0x00893c5f, 0x0009960e, 0x0041bdcf, 0x000aef46}}}, + {X: Field{[10]uint32{0x027f8a1e, 0x0095ae0a, 0x00dc087e, 0x01f543d4, 0x006d4ddd, 0x019d67a5, 0x03d2affd, 0x01ee2ffa, 0x01adcdfc, 0x0029c10c}}, Y: Field{[10]uint32{0x0147f593, 0x0091fd64, 0x01f20384, 0x00861bfd, 0x00231639, 0x03bfb32e, 0x03d77e8b, 0x02cbab0c, 0x022b9362, 0x000f290d}}}, + {X: Field{[10]uint32{0x000e8a7d, 0x0358f98c, 0x00697bf7, 0x03689177, 0x032263e9, 0x03177500, 0x00004327, 0x00bb3cf2, 0x02122c1b, 0x000a8e20}}, Y: Field{[10]uint32{0x02f6ff78, 0x00b20884, 0x01175fd7, 0x03669c91, 0x01a339c0, 0x02a6dcea, 0x005f2faf, 0x01efc0f7, 0x018853b8, 0x002b25b4}}}, + {X: Field{[10]uint32{0x024b5451, 0x005f0290, 0x01a9ab4d, 0x03fccc1a, 0x0356b49b, 0x015f8c04, 0x00bc545f, 0x0008bad4, 0x01a40ae3, 0x003a6716}}, Y: Field{[10]uint32{0x029bada0, 0x0111758b, 0x03349baf, 0x0260820d, 0x02b4fe1a, 0x00541645, 0x03737b56, 0x03eaddb0, 0x0379fe55, 0x000a6c92}}}, + {X: Field{[10]uint32{0x003306d4, 0x0300d382, 0x0384bf19, 0x035ac368, 0x03c0be26, 0x030ff8b4, 0x03f1a3c3, 0x0317b7d8, 0x02d1bd5a, 0x0028290b}}, Y: Field{[10]uint32{0x00a0bbc3, 0x033d8457, 0x039e4e5b, 0x01e59c99, 0x008aad08, 0x030c83ba, 0x0293e288, 0x008dd1e8, 0x03d2d444, 0x0030e7fc}}}, + {X: Field{[10]uint32{0x009e0053, 0x021baef0, 0x00b01c0b, 0x021c2dbc, 0x035cc17e, 0x01065cc3, 0x011670e1, 0x03c18fc7, 0x01d69ba9, 0x002e54b9}}, Y: Field{[10]uint32{0x01c46ae0, 0x023c31cb, 0x010ca0fe, 0x026bd4f3, 0x02273a4f, 0x02fc942b, 0x031c9b5b, 0x02e369b9, 0x019fa230, 0x00307a02}}}, + {X: Field{[10]uint32{0x01a4e904, 0x03e0ffa5, 0x01a2e620, 0x02319575, 0x01be83c1, 0x00498872, 0x03892b45, 0x017d3918, 0x033a130f, 0x000ebb89}}, Y: Field{[10]uint32{0x030af7e7, 0x03bac3ef, 0x01131eb7, 0x00d67a32, 0x009237b0, 0x024fe51c, 0x003c6a0b, 0x02db73cb, 0x01c6921f, 0x003b7d1d}}}, + {X: Field{[10]uint32{0x0266ceac, 0x0389576e, 0x0044965c, 0x01974a34, 0x00aa2f9e, 0x021e09ff, 0x0310d91b, 0x02bc1ab2, 0x00dcdc65, 0x00025b77}}, Y: Field{[10]uint32{0x0100ab39, 0x03e14bb4, 0x03584215, 0x01f98080, 0x039e2bf3, 0x0042ef08, 0x030d4fe3, 0x01009320, 0x036817fd, 0x000b9b40}}}, + {X: Field{[10]uint32{0x030334a3, 0x017eb934, 0x004d5af4, 0x039e78d6, 0x01e0d07a, 0x00a507e8, 0x00e111c3, 0x03b276c4, 0x0006c757, 0x003f543d}}, Y: Field{[10]uint32{0x013fde6f, 0x03d2f3f5, 0x03348324, 0x003b184d, 0x00ed9ccb, 0x03e36ca2, 0x01b1d364, 0x001a3f1f, 0x0094d49c, 0x001c6ddd}}}, + {X: Field{[10]uint32{0x03a097d1, 0x0193e45a, 0x03a77d3c, 0x004af28e, 0x03bd0611, 0x015a2ae6, 0x014915c9, 0x01148c18, 0x02681195, 0x001bcb60}}, Y: Field{[10]uint32{0x00787a87, 0x003bde0d, 0x035afe88, 0x01a34097, 0x0297261d, 0x029591e8, 0x017fe722, 0x029f134c, 0x0199849c, 0x002af904}}}, + {X: Field{[10]uint32{0x01cc1400, 0x019091c8, 0x03c9d3f0, 0x036f8988, 0x029c5099, 0x020ca8c4, 0x0283d2ce, 0x02d8a89d, 0x01b76dff, 0x00362303}}, Y: Field{[10]uint32{0x01cec51f, 0x0398d4a3, 0x034ea542, 0x02250c6e, 0x02ba5aa2, 0x0021ccad, 0x001726df, 0x01fa4976, 0x015adf6d, 0x00144d3c}}}, + {X: Field{[10]uint32{0x007105fe, 0x03d55f9d, 0x01562d95, 0x012a9c75, 0x00b6c0fd, 0x0080bf93, 0x01013632, 0x00fca3ab, 0x02e4ddde, 0x002a37a6}}, Y: Field{[10]uint32{0x03be8803, 0x00f8f6a8, 0x0107e038, 0x010dbbea, 0x02536820, 0x01f71d4a, 0x03c39a51, 0x02d85242, 0x006b5a71, 0x0005e7a5}}}, + {X: Field{[10]uint32{0x03cd45ac, 0x00942aa3, 0x037ae6eb, 0x03bf9201, 0x01799c94, 0x003996c3, 0x02a48118, 0x00f50276, 0x0027f7dc, 0x00189b1a}}, Y: Field{[10]uint32{0x01bf2f32, 0x031758cc, 0x01c00fce, 0x02841e06, 0x02b30b7e, 0x036e2397, 0x024a2db8, 0x01eca0cb, 0x01db87cf, 0x0000f596}}}, + {X: Field{[10]uint32{0x00a77d02, 0x01213d0b, 0x004955b5, 0x03bed488, 0x021666eb, 0x03d5b3c0, 0x00b2ef69, 0x03e91f6d, 0x022cf00e, 0x0000a28e}}, Y: Field{[10]uint32{0x0393c82b, 0x0266c5a0, 0x01b01f77, 0x00de5e53, 0x030fc168, 0x009c21b1, 0x00e90fb9, 0x01c3b667, 0x00edfc98, 0x00023740}}}, + {X: Field{[10]uint32{0x01545786, 0x00a4dc30, 0x02bd5dbb, 0x01d5fee4, 0x02c3b672, 0x005e2923, 0x01d0dc2f, 0x01901491, 0x029f27c4, 0x0037c2c0}}, Y: Field{[10]uint32{0x02a1099a, 0x03462900, 0x0279c6cc, 0x012ffa85, 0x01757b47, 0x004067c5, 0x00a5ad4e, 0x0166a204, 0x0105c7e1, 0x003c4cfb}}}, + {X: Field{[10]uint32{0x001a49ef, 0x02ef17f7, 0x02c8b421, 0x020d31f0, 0x020c5497, 0x0229ad8e, 0x02162a4e, 0x002f94b4, 0x03af9c1e, 0x00371bd5}}, Y: Field{[10]uint32{0x00f1a0c4, 0x01f84104, 0x0379e9e9, 0x01287064, 0x0366fca4, 0x02ce26ea, 0x02ee20d9, 0x03f97258, 0x02afe610, 0x001bd61a}}}, + {X: Field{[10]uint32{0x0255cd15, 0x00ece62c, 0x02ac4bf1, 0x00ba838f, 0x03816247, 0x02070764, 0x02dcc0fa, 0x031a4066, 0x02a2e0d2, 0x0036de5b}}, Y: Field{[10]uint32{0x0105ac88, 0x010c4f1f, 0x033e2947, 0x00810ef6, 0x02793754, 0x006478a3, 0x01e07662, 0x03ed1190, 0x02a732e1, 0x000b9831}}}, + {X: Field{[10]uint32{0x01633a2d, 0x03f8da4d, 0x023ca059, 0x01a4c2c1, 0x02881fe2, 0x01d3e233, 0x03a3efce, 0x0263f696, 0x029e72ea, 0x0015a6d9}}, Y: Field{[10]uint32{0x00ca0c8c, 0x02ddd57e, 0x00ca2f76, 0x01bffd3e, 0x02220b6a, 0x03ad78dd, 0x033f7406, 0x03e1c976, 0x02af2551, 0x002eb763}}}, + {X: Field{[10]uint32{0x00468ae4, 0x02b0ccde, 0x02451421, 0x004617f4, 0x02ec7951, 0x00b45d71, 0x036b6f0e, 0x00ceef52, 0x00201f9a, 0x000d84c9}}, Y: Field{[10]uint32{0x033c4314, 0x005863fe, 0x01dee282, 0x005c3655, 0x0262a58e, 0x011d5921, 0x02ba1351, 0x01cd99bb, 0x02cef7bc, 0x003d1ed5}}}, + {X: Field{[10]uint32{0x014a469c, 0x013b4cd2, 0x015b1b60, 0x020f24bf, 0x03855a07, 0x020b6c3f, 0x00fa2431, 0x00805246, 0x00371e4d, 0x00337ac8}}, Y: Field{[10]uint32{0x00dfa7d8, 0x031bde76, 0x03393a83, 0x03555462, 0x02970a7e, 0x0213b941, 0x010098bc, 0x00e074bf, 0x03186829, 0x001f4f1d}}}, + {X: Field{[10]uint32{0x031598ef, 0x005f3f05, 0x03755c87, 0x01d3e36d, 0x03ff6c4d, 0x037a23ff, 0x013b721a, 0x0317b003, 0x03a9d750, 0x00180d73}}, Y: Field{[10]uint32{0x03dd675a, 0x027f6d81, 0x01cb749f, 0x035f5632, 0x029bb129, 0x0120b480, 0x02dcde65, 0x0090d904, 0x00da160b, 0x003f85e6}}}, + {X: Field{[10]uint32{0x0379c0f7, 0x0279068e, 0x02ac18dc, 0x01765f64, 0x00bb250b, 0x011c5e3d, 0x0275b0c0, 0x02639383, 0x0297e499, 0x002c7d4b}}, Y: Field{[10]uint32{0x03df795f, 0x01e942b4, 0x0333d808, 0x03e04093, 0x03de484c, 0x00994717, 0x024370ca, 0x03f6317c, 0x01654e4c, 0x00360fcf}}}, + {X: Field{[10]uint32{0x01f1b641, 0x018ac85b, 0x02477d78, 0x0159094d, 0x03f1a5e0, 0x0357dc26, 0x0011395d, 0x00f6827c, 0x035304c7, 0x002a9e66}}, Y: Field{[10]uint32{0x03248646, 0x00f4b4cc, 0x03338a00, 0x001f2ef9, 0x02dd5920, 0x03ce2aa1, 0x03f68879, 0x016d9164, 0x0047b5e9, 0x000e8c9c}}}, + {X: Field{[10]uint32{0x0045aa03, 0x017a6ee9, 0x023c18d3, 0x026f7631, 0x01262d62, 0x034ce691, 0x01e56b66, 0x03d3f11e, 0x016445bd, 0x00369286}}, Y: Field{[10]uint32{0x029cb70d, 0x00fe4b2d, 0x006d563f, 0x039c9b0b, 0x02353376, 0x00d357b2, 0x02cff296, 0x018e9019, 0x02da25cc, 0x001ece97}}}, + {X: Field{[10]uint32{0x01b8d656, 0x039ccfe8, 0x0384c231, 0x011a81ec, 0x017e620d, 0x003bbc1c, 0x03eba80f, 0x01b4350c, 0x00adc234, 0x0030c02d}}, Y: Field{[10]uint32{0x03cdba42, 0x02a1dc78, 0x023566f4, 0x03691537, 0x02f73448, 0x00402e56, 0x02aa439a, 0x01eb1fcd, 0x03b948d2, 0x000c820e}}}, + {X: Field{[10]uint32{0x00359f04, 0x0162cae5, 0x02be76a3, 0x001f8833, 0x02ed64a9, 0x02437cac, 0x039bf7b0, 0x01c91358, 0x01286793, 0x00315669}}, Y: Field{[10]uint32{0x01bf5977, 0x011c3352, 0x004740d2, 0x03685659, 0x02806d78, 0x00fd10d2, 0x01671b56, 0x03260c83, 0x01aa5c08, 0x0027f2b0}}}, + {X: Field{[10]uint32{0x03e83540, 0x018ccef7, 0x015fa9b9, 0x03af4f9e, 0x01b0911c, 0x020f042c, 0x034bca9a, 0x036fd3c1, 0x01470a46, 0x000e6c40}}, Y: Field{[10]uint32{0x01308278, 0x0250658b, 0x0055e642, 0x005f458a, 0x00168da4, 0x0358cd38, 0x02aa313c, 0x009d0d36, 0x00c8c3b2, 0x002b4d77}}}, + {X: Field{[10]uint32{0x037d6d42, 0x01d2810b, 0x01d6b347, 0x00ba89de, 0x014129ab, 0x00666532, 0x00405970, 0x031805fe, 0x02b7d2de, 0x000e7272}}, Y: Field{[10]uint32{0x03781845, 0x0373a790, 0x013623af, 0x02d32012, 0x0272ca72, 0x01f77ecf, 0x00cdd453, 0x02284cd5, 0x016b835a, 0x0031cfaf}}}, + {X: Field{[10]uint32{0x02c679ed, 0x02d7bbbb, 0x01466fc7, 0x0135104c, 0x03f8f81c, 0x038863b0, 0x02c60972, 0x02d18ab7, 0x01988a30, 0x00069896}}, Y: Field{[10]uint32{0x034114ab, 0x03e3374c, 0x02037bf5, 0x0276e810, 0x033651a3, 0x03884ef5, 0x02776e62, 0x01f26efd, 0x02bb01a9, 0x001ce6fa}}}, + {X: Field{[10]uint32{0x024c4308, 0x008b7eba, 0x003bf3f4, 0x0330fbd9, 0x0085f33e, 0x03ca0ea6, 0x012761eb, 0x030c2350, 0x0110cd35, 0x000e5bb6}}, Y: Field{[10]uint32{0x004dfe57, 0x03467845, 0x01b7f556, 0x01620d9c, 0x013945e1, 0x010a91ac, 0x0048cf84, 0x01852937, 0x01a6a08a, 0x001c8737}}}, + {X: Field{[10]uint32{0x03299a47, 0x02debce6, 0x02becaf7, 0x0100978e, 0x0083e153, 0x002f60c7, 0x02ee96ab, 0x0333f652, 0x02e8a2e8, 0x00294381}}, Y: Field{[10]uint32{0x03beba52, 0x03593f8a, 0x0214f3fc, 0x0068ead7, 0x014521fc, 0x02382178, 0x01a4575e, 0x02018ff9, 0x01b259a1, 0x00164c81}}}, + {X: Field{[10]uint32{0x01c3e1de, 0x03c9adc4, 0x034a3dc3, 0x03591ba3, 0x00dbe15c, 0x00e4fe8d, 0x02c8bcf7, 0x03470398, 0x002317b0, 0x0012a7e0}}, Y: Field{[10]uint32{0x03c6bb71, 0x012faa7d, 0x015ac289, 0x030e5899, 0x00239867, 0x00d3a24a, 0x0330c244, 0x017fff36, 0x036d0091, 0x000103bf}}}, + {X: Field{[10]uint32{0x01608b73, 0x0368bf23, 0x01f055d2, 0x018957b6, 0x007f3232, 0x00bfeee2, 0x0318562e, 0x02df9842, 0x020d9dec, 0x00233978}}, Y: Field{[10]uint32{0x02c720de, 0x03da6386, 0x011b54f1, 0x02caa9c0, 0x0263f024, 0x01649c9e, 0x0292371b, 0x03859003, 0x036cf363, 0x0003ada6}}}, + {X: Field{[10]uint32{0x0083f24b, 0x009be6ed, 0x03e0a367, 0x0358dc02, 0x0184143e, 0x0295503b, 0x02525e28, 0x03a7947c, 0x01d79b53, 0x003cc9a5}}, Y: Field{[10]uint32{0x008471c8, 0x038641f0, 0x0123ef1e, 0x00587185, 0x031d81bd, 0x03f88d24, 0x012ca1f6, 0x00157d96, 0x0088eea2, 0x003a34d9}}}, + {X: Field{[10]uint32{0x02c34d07, 0x01b78775, 0x01959485, 0x02049749, 0x01d92748, 0x01b80822, 0x011ad140, 0x0164b96d, 0x01863bf6, 0x000e09bf}}, Y: Field{[10]uint32{0x03e4cc83, 0x020ec73f, 0x01e97265, 0x0006a240, 0x02020da0, 0x01ffe7e0, 0x0282058a, 0x00d71d0f, 0x01e6a290, 0x003aa1bc}}}, + {X: Field{[10]uint32{0x00ccd551, 0x01904290, 0x03ddd0dc, 0x02a263a1, 0x02ae8611, 0x03b1c9d8, 0x02098684, 0x02c3d46e, 0x00d32e32, 0x001ec6bf}}, Y: Field{[10]uint32{0x02e37884, 0x020a34f4, 0x020efc70, 0x02c2f158, 0x00a3ce0e, 0x02edb42a, 0x0036ee39, 0x0024c420, 0x02f779e1, 0x0037ae9b}}}, + {X: Field{[10]uint32{0x01a91bd4, 0x0118304d, 0x03b63348, 0x0331fdfd, 0x018deddd, 0x019a8db4, 0x00d39b1b, 0x01d61d50, 0x01fed2c2, 0x000fac7f}}, Y: Field{[10]uint32{0x026b36cb, 0x0263e5b4, 0x037b9eb8, 0x011633f3, 0x02642c53, 0x0204a99e, 0x01506cca, 0x039e5186, 0x02ca536a, 0x002e2baa}}}, + {X: Field{[10]uint32{0x0356da8f, 0x012fad66, 0x03c45c21, 0x027a406d, 0x02b71b4d, 0x020fba8b, 0x02290cb6, 0x03f17d4c, 0x02c8aae9, 0x00275876}}, Y: Field{[10]uint32{0x02446036, 0x021d8ace, 0x02271793, 0x0079e28a, 0x01280a8f, 0x0099f3a6, 0x024fc3ee, 0x02c8b9c0, 0x00a42ea1, 0x000b9f2b}}}, + {X: Field{[10]uint32{0x0211c7d8, 0x0343ab8f, 0x0239be38, 0x03bff76e, 0x02e91a43, 0x017b5551, 0x021e37a8, 0x03eaa3a3, 0x02dc3167, 0x000b6cdc}}, Y: Field{[10]uint32{0x01707ffe, 0x01b842d6, 0x023809b0, 0x00d2dc65, 0x0084f005, 0x02d67c3a, 0x0279697f, 0x02f5a85b, 0x0361bc1a, 0x0005aadb}}}, + {X: Field{[10]uint32{0x0005dc80, 0x0008f4a2, 0x000302ff, 0x019fdff1, 0x025b03dd, 0x02b4c4ca, 0x00e83cc9, 0x02d4e14e, 0x02f9f7a2, 0x00263df3}}, Y: Field{[10]uint32{0x02b98943, 0x020417eb, 0x00dd8d65, 0x034fe546, 0x01468bed, 0x03a5a85d, 0x016df891, 0x039b1af5, 0x00232813, 0x000ed03e}}}, + {X: Field{[10]uint32{0x01b62548, 0x0334657b, 0x00c7a363, 0x01853522, 0x02c48f08, 0x02a276d0, 0x01f58528, 0x00349357, 0x026cc8ab, 0x003baacb}}, Y: Field{[10]uint32{0x002649da, 0x002649f2, 0x022cc017, 0x01d100a0, 0x00523a7f, 0x03d7b7c5, 0x03e25030, 0x00ca35ca, 0x01ed65d3, 0x00181f10}}}, + {X: Field{[10]uint32{0x03db942a, 0x00d5c16c, 0x035376d9, 0x0346b69a, 0x03b7cb5e, 0x017ecc6d, 0x029a9d6c, 0x0071c0d1, 0x02ffb216, 0x002557fb}}, Y: Field{[10]uint32{0x01c0864b, 0x0123b905, 0x035a3fdf, 0x0029a0b2, 0x01283fcd, 0x029c4016, 0x039c9846, 0x030d081d, 0x0248a561, 0x002a4656}}}, + {X: Field{[10]uint32{0x00cd85a7, 0x03396b37, 0x025c9d44, 0x0376a606, 0x034db23b, 0x0336b0db, 0x008f5411, 0x03ba7b4f, 0x012d70d2, 0x00086693}}, Y: Field{[10]uint32{0x00ef53b4, 0x01593d71, 0x008e470a, 0x02a4171b, 0x013dbfdd, 0x03193df7, 0x0284aef2, 0x023b05c4, 0x01684300, 0x0019d106}}}, + {X: Field{[10]uint32{0x011ddb23, 0x010a5cbe, 0x028a5ed5, 0x01c5c8b8, 0x020d5945, 0x020b040d, 0x02f5cbd2, 0x02c584b8, 0x010d7794, 0x00125d8a}}, Y: Field{[10]uint32{0x0217ebc4, 0x001185b3, 0x03aec790, 0x00915bd5, 0x0023571c, 0x011b7144, 0x008354b4, 0x015954bf, 0x01f160fc, 0x00133f65}}}, + {X: Field{[10]uint32{0x0072b1c1, 0x0135c8ac, 0x00a4b5c4, 0x02cf0535, 0x021866e0, 0x0267d59d, 0x03b99ed5, 0x02b476ee, 0x03e0268e, 0x0011cb54}}, Y: Field{[10]uint32{0x02831232, 0x01a4fb30, 0x02db8e31, 0x00afb190, 0x01e4dfe8, 0x03659ee2, 0x02d42e31, 0x035352a3, 0x00096115, 0x003a6e70}}}, + {X: Field{[10]uint32{0x00ab18ef, 0x00c9ed1c, 0x01d50da3, 0x03ef0375, 0x003f3462, 0x0169b86c, 0x0075d617, 0x02e572be, 0x037e7a4d, 0x000a9bd6}}, Y: Field{[10]uint32{0x0259d506, 0x039f80e1, 0x033479ad, 0x013a8bcd, 0x02c9f372, 0x002c04f3, 0x01f5b78f, 0x037065f6, 0x03a392aa, 0x00246c91}}}, + {X: Field{[10]uint32{0x03146c19, 0x03e71148, 0x025ba17d, 0x00ae7441, 0x007431a6, 0x0383230f, 0x025e654f, 0x03606ed7, 0x01a3bf48, 0x00370605}}, Y: Field{[10]uint32{0x0194be8f, 0x02f7cbf5, 0x00f36d0f, 0x03dec232, 0x02d837c5, 0x01d1fbfe, 0x03e2af74, 0x0143c391, 0x029a3115, 0x003f881c}}}, + {X: Field{[10]uint32{0x00397776, 0x002db9a6, 0x03c4f1df, 0x033cf9a2, 0x00a8b47e, 0x000ffee6, 0x0295db4f, 0x03bae25e, 0x03ecad8f, 0x00239e54}}, Y: Field{[10]uint32{0x0141ac5d, 0x02c58df0, 0x01157893, 0x03f36aed, 0x0212f7c6, 0x007cc518, 0x0040a395, 0x0073109b, 0x02ef81b2, 0x00176b7c}}}, + {X: Field{[10]uint32{0x019b41a5, 0x03913304, 0x02a7472e, 0x0015b999, 0x01faf96a, 0x019a1b22, 0x0099fe1c, 0x01c92e7a, 0x026b49d5, 0x00293647}}, Y: Field{[10]uint32{0x020a4893, 0x03a77865, 0x0247414a, 0x00aae9cb, 0x02fef10b, 0x02f73f09, 0x02bb820c, 0x019263d6, 0x02150e29, 0x002af5a1}}}, + {X: Field{[10]uint32{0x0300eee9, 0x025210da, 0x0141dd02, 0x008ab2b8, 0x02754c49, 0x02383910, 0x0266dd60, 0x009ae74e, 0x01a4f3e4, 0x002e5c20}}, Y: Field{[10]uint32{0x00f153da, 0x007b5b2e, 0x024f1ea6, 0x01de38a2, 0x022c8c2f, 0x005542c4, 0x029cb641, 0x012ed2ea, 0x00839921, 0x001563db}}}, + {X: Field{[10]uint32{0x03825848, 0x00d0843e, 0x0225ea8c, 0x029ad8d2, 0x00b873a5, 0x01904b15, 0x0273c6ef, 0x026f39c2, 0x02ed8227, 0x001a20ad}}, Y: Field{[10]uint32{0x03f21b3b, 0x027852e7, 0x035aed6b, 0x002487ca, 0x031e3a3b, 0x01a27a28, 0x0279c616, 0x00f8e4ba, 0x02e9c823, 0x0031bf7b}}}, + {X: Field{[10]uint32{0x00717fe8, 0x01fb8691, 0x011a462c, 0x0202b543, 0x011a0dba, 0x013f7acf, 0x03bf11fa, 0x015c272a, 0x03311c71, 0x00271509}}, Y: Field{[10]uint32{0x01f2b045, 0x010a5d74, 0x0058d7ea, 0x01c713c8, 0x00ef4b64, 0x029dfdd8, 0x006bd40c, 0x00d16311, 0x03107816, 0x002a8106}}}, + {X: Field{[10]uint32{0x000cd32c, 0x01ccc31e, 0x015d9357, 0x005c0ec6, 0x024a5ed9, 0x00ef9637, 0x038779de, 0x01704ba0, 0x01a6776b, 0x001ce853}}, Y: Field{[10]uint32{0x02d2c49c, 0x03929c1e, 0x03a78b0c, 0x01d3332c, 0x01ceb585, 0x022fcb22, 0x0067bb7e, 0x0313569d, 0x03fde98e, 0x003101a3}}}, + {X: Field{[10]uint32{0x02af91b5, 0x01b15dad, 0x038ebfdc, 0x00d7677b, 0x028748d8, 0x039b76df, 0x01e9d261, 0x01b136eb, 0x028627d2, 0x00192228}}, Y: Field{[10]uint32{0x016d8ff3, 0x01806f4f, 0x02697b5c, 0x025416b6, 0x033c7f06, 0x0116ec1f, 0x030916a9, 0x0046462b, 0x01f0b050, 0x0009fe2c}}}, + {X: Field{[10]uint32{0x0151046c, 0x02753414, 0x0371bd8c, 0x023865e3, 0x02cca1d3, 0x01f73ef3, 0x01ee2ef4, 0x0132636e, 0x027a5b54, 0x0025951b}}, Y: Field{[10]uint32{0x01f4309d, 0x018329c1, 0x0189e841, 0x01cac984, 0x023b10f7, 0x00257260, 0x00f07d22, 0x03b3fc88, 0x032f8fe9, 0x003413f8}}}, + {X: Field{[10]uint32{0x00fecdf8, 0x0118fb63, 0x00066761, 0x01b20b4a, 0x01e76998, 0x01c808bb, 0x02cdb909, 0x02c50e80, 0x03564598, 0x002e811b}}, Y: Field{[10]uint32{0x0227250f, 0x000c8c8f, 0x01d68536, 0x00341de3, 0x023e57bc, 0x034f676a, 0x007d37c0, 0x015f0550, 0x03abd424, 0x003f1b88}}}, + {X: Field{[10]uint32{0x02d0e4ec, 0x02e02bd6, 0x027df310, 0x01fec4f2, 0x005e7655, 0x021aa081, 0x02d82ed0, 0x0329f77d, 0x0351e633, 0x000e5551}}, Y: Field{[10]uint32{0x006d3b1c, 0x021ac0a8, 0x03b4f894, 0x00f0bee6, 0x03cdb2ba, 0x03ea8fd9, 0x03df5e95, 0x03c83a5d, 0x0284f040, 0x002915ae}}}, + {X: Field{[10]uint32{0x009c22aa, 0x029a2926, 0x0317cd46, 0x035c0386, 0x01ba56b8, 0x00411b0f, 0x016c9241, 0x027f5c36, 0x00e75fef, 0x00317d54}}, Y: Field{[10]uint32{0x03ac3fa9, 0x030d8d89, 0x02cc2173, 0x010b723c, 0x038d65ea, 0x03b9f43e, 0x02a987ac, 0x02d85d55, 0x02e03aea, 0x00152160}}}, + {X: Field{[10]uint32{0x025fa050, 0x026ab35b, 0x0327eb99, 0x01d5e6c9, 0x0326d4ba, 0x03818e90, 0x000b2a0e, 0x0236ce6a, 0x0210a48d, 0x000b3305}}, Y: Field{[10]uint32{0x00348c84, 0x00fe5ffe, 0x02b70a07, 0x01a524a3, 0x03fa205d, 0x01e79610, 0x01cb17b1, 0x0000b023, 0x03db2114, 0x00379b75}}}, + {X: Field{[10]uint32{0x03084b3f, 0x0227843d, 0x012c5add, 0x03e3f9ba, 0x003ae59c, 0x03639919, 0x00089ff2, 0x00721079, 0x00e73e94, 0x0024ec1f}}, Y: Field{[10]uint32{0x0018fa63, 0x02a03910, 0x03634cb5, 0x03fb8634, 0x02533efc, 0x018a686b, 0x02c362d3, 0x0099f953, 0x0076c5a7, 0x00029b01}}}, + {X: Field{[10]uint32{0x0291e7e9, 0x03015996, 0x03a3e438, 0x001d872e, 0x02b0ec27, 0x01a166c5, 0x03aeec82, 0x0119e578, 0x01f055c1, 0x00114f00}}, Y: Field{[10]uint32{0x016766b2, 0x016f1269, 0x033d9874, 0x026794b9, 0x030e14ac, 0x00221096, 0x03738436, 0x032288bb, 0x02c9b9d3, 0x003ca3ab}}}, + {X: Field{[10]uint32{0x000f12f1, 0x0359197a, 0x027946f8, 0x013012a5, 0x00c1d09a, 0x0055656e, 0x02148fad, 0x0230a282, 0x01fdac07, 0x000f1b7c}}, Y: Field{[10]uint32{0x02a5b58d, 0x033c99e0, 0x0354f6df, 0x01700542, 0x02d443db, 0x039fb4a4, 0x02a68212, 0x004d2e81, 0x004d4eaa, 0x0011866a}}}, + {X: Field{[10]uint32{0x01b98630, 0x033160c4, 0x02fd600d, 0x03e49c17, 0x03f12054, 0x0240836f, 0x01429895, 0x025e14c1, 0x01683995, 0x0006dfda}}, Y: Field{[10]uint32{0x00645c25, 0x03670803, 0x00a37372, 0x00574305, 0x0067ee9e, 0x0223b1bc, 0x01731c9b, 0x03ea33ef, 0x023ee3e8, 0x0009e771}}}, + {X: Field{[10]uint32{0x03fccc19, 0x03610bef, 0x0300697a, 0x03da7340, 0x006256f2, 0x013489db, 0x010a6427, 0x0342e66e, 0x01539d49, 0x00386dee}}, Y: Field{[10]uint32{0x01f9500f, 0x03763435, 0x03316fd0, 0x036c9fe4, 0x00f2acfe, 0x027a054d, 0x004628b1, 0x0195a614, 0x016f51dc, 0x000ac8ee}}}, + {X: Field{[10]uint32{0x0354f911, 0x0205f22b, 0x012bf4bc, 0x017e9588, 0x039ce552, 0x02a5d193, 0x015f79bb, 0x0108cd2f, 0x00c56fbf, 0x0010133c}}, Y: Field{[10]uint32{0x031ef662, 0x00b29907, 0x03c0f2e2, 0x02d5e625, 0x02023c04, 0x0178d95e, 0x021a6e07, 0x00162171, 0x02098830, 0x002d6481}}}, + {X: Field{[10]uint32{0x00aae0c1, 0x038bb243, 0x0171f43f, 0x03b05faa, 0x00e7819a, 0x00268d10, 0x02e817fa, 0x01af63bf, 0x0186da62, 0x0010fc76}}, Y: Field{[10]uint32{0x0274f9ad, 0x028802ca, 0x03583e51, 0x00e0acea, 0x033e93f4, 0x005d45e7, 0x0011f518, 0x0246ab4a, 0x02ce0ce8, 0x00317e96}}}, + {X: Field{[10]uint32{0x005b9c1f, 0x03b2bd83, 0x028fcd23, 0x03a2d9fb, 0x027bbcaa, 0x02dd8844, 0x02183b81, 0x0265445a, 0x01c6b320, 0x00286211}}, Y: Field{[10]uint32{0x03ef1f44, 0x030a546e, 0x03b02dfc, 0x03c573ae, 0x038f54e7, 0x020619c6, 0x03c5350e, 0x01f9acb3, 0x01d9d7e0, 0x002603b5}}}, + {X: Field{[10]uint32{0x03ac01ed, 0x00124839, 0x015aa2a3, 0x02b7009b, 0x00254c38, 0x000f24a7, 0x01cc17be, 0x02609181, 0x03eb0af9, 0x00013671}}, Y: Field{[10]uint32{0x03e781d3, 0x01070654, 0x031c970d, 0x02e67ea6, 0x0097065b, 0x00cd83dd, 0x033cf00f, 0x03394c89, 0x0335bb0d, 0x00319316}}}, + {X: Field{[10]uint32{0x03e7c25d, 0x03ab7225, 0x00814eda, 0x03dc1319, 0x0155953e, 0x03a2a981, 0x01317833, 0x036c26f3, 0x02f2fbc3, 0x00386348}}, Y: Field{[10]uint32{0x03c7e07e, 0x03ca88bb, 0x00b5953e, 0x02ca15c0, 0x000f15b8, 0x032aa1c0, 0x037989df, 0x0081c893, 0x02817115, 0x00330962}}}, + {X: Field{[10]uint32{0x0247879d, 0x02f6f94a, 0x03d5a3c8, 0x029e6f0d, 0x0035083a, 0x030505fa, 0x02ec9a60, 0x02413e34, 0x01f9f220, 0x0005815d}}, Y: Field{[10]uint32{0x0279a5e5, 0x0157e4d4, 0x034ce0d6, 0x012cc274, 0x012c3870, 0x0350e7fb, 0x0191c60a, 0x025e3504, 0x00a6127e, 0x000795ad}}}, + {X: Field{[10]uint32{0x0192d514, 0x0280dc94, 0x03e53f9a, 0x01aa850d, 0x034c3c9f, 0x00f14d56, 0x02b7ebdd, 0x03589935, 0x03c757b1, 0x000ed946}}, Y: Field{[10]uint32{0x00231c3f, 0x015861a0, 0x022e419e, 0x01682287, 0x025feb28, 0x03722927, 0x031d8ec5, 0x000c483f, 0x03749599, 0x0025dea1}}}, + {X: Field{[10]uint32{0x02ba532a, 0x01e6a3c5, 0x03b0cd95, 0x02587f5a, 0x02a9660e, 0x0262aca1, 0x00250154, 0x033009d8, 0x01ef56fa, 0x0024216f}}, Y: Field{[10]uint32{0x02e9fe89, 0x01443c5e, 0x013b8c55, 0x005a3dae, 0x0368364c, 0x003a039e, 0x03f791d9, 0x01567179, 0x0108a557, 0x003f4174}}}, + {X: Field{[10]uint32{0x000569ec, 0x01151239, 0x00c21fef, 0x0095db87, 0x0067cf1b, 0x007c2b3a, 0x033aab8c, 0x00e18bf4, 0x006df64a, 0x0010890c}}, Y: Field{[10]uint32{0x020661bc, 0x004f563d, 0x032498bd, 0x0257fe59, 0x0063e723, 0x016790b9, 0x0087c2dc, 0x02f0773a, 0x02675279, 0x0021d02d}}}, + {X: Field{[10]uint32{0x0022935c, 0x00f28d77, 0x009182f8, 0x0303fd68, 0x02e0e2b2, 0x02f157b9, 0x03806b35, 0x00b8c69b, 0x02974a51, 0x002dcdd9}}, Y: Field{[10]uint32{0x01420103, 0x00a820a1, 0x0046251c, 0x000e75a2, 0x01890b3e, 0x023f572f, 0x00152a24, 0x03eb7bb9, 0x00202676, 0x0034d432}}}, + {X: Field{[10]uint32{0x010eb97a, 0x01093693, 0x01574557, 0x01a32ea0, 0x02bb82e0, 0x03069d21, 0x00505ab1, 0x0353429f, 0x038ed3b5, 0x001cee93}}, Y: Field{[10]uint32{0x02188271, 0x0292ff89, 0x01215adc, 0x026dc950, 0x013a58ba, 0x0218f4fe, 0x01b4a2d0, 0x030d8152, 0x0114552d, 0x0024ebce}}}, + {X: Field{[10]uint32{0x03d3d8ea, 0x012f80db, 0x01bef052, 0x0101af38, 0x020ae935, 0x01a52c14, 0x00576c45, 0x0093663c, 0x014e1747, 0x000a1680}}, Y: Field{[10]uint32{0x029af7dc, 0x00f9f21a, 0x028cab39, 0x01965a33, 0x039d4067, 0x0247536d, 0x03f5213f, 0x01dd5f9b, 0x01d8d2ce, 0x001bf6b4}}}, + {X: Field{[10]uint32{0x028e768f, 0x021a77b0, 0x01180963, 0x01e3b283, 0x0384c2fd, 0x01be302a, 0x025cea7c, 0x02d52e8a, 0x01d727bf, 0x002c24d3}}, Y: Field{[10]uint32{0x00b982c6, 0x01c2763c, 0x031bf2bc, 0x03df4535, 0x03484c94, 0x036c2644, 0x02bbb26e, 0x027cc52f, 0x01115602, 0x00372bc3}}}, + {X: Field{[10]uint32{0x03681561, 0x032303d6, 0x0365ec45, 0x033cd5ee, 0x02ffcb49, 0x03bc5742, 0x011c8bcc, 0x02a772dd, 0x02dd8b69, 0x000ed89e}}, Y: Field{[10]uint32{0x0046d19d, 0x00a5bf37, 0x015e1536, 0x02ee9dc8, 0x03693cd2, 0x0349f3fd, 0x02133649, 0x0202dcb6, 0x018009e3, 0x0002f686}}}, + {X: Field{[10]uint32{0x02cb5ac2, 0x00a8da54, 0x027c90a6, 0x01d9722a, 0x02e45938, 0x011d9b6a, 0x012e3f9a, 0x02277e81, 0x01ec1f22, 0x001f923f}}, Y: Field{[10]uint32{0x018cb5f2, 0x00e12e6f, 0x039ac61e, 0x023984a4, 0x0168449b, 0x02fb6d27, 0x021e10c5, 0x01a2159b, 0x007aac11, 0x003a1ebe}}}, + {X: Field{[10]uint32{0x023ffd9d, 0x03390f89, 0x0008b181, 0x02432a84, 0x00d094d8, 0x03bb0b90, 0x022c267f, 0x00eeeada, 0x008a5de3, 0x00100c7c}}, Y: Field{[10]uint32{0x01b0be07, 0x026dfc14, 0x006b58a7, 0x038c46e5, 0x01a8f23b, 0x0077fbd1, 0x0389beb9, 0x0297c269, 0x03d99737, 0x0033f713}}}, + {X: Field{[10]uint32{0x031ed764, 0x001fafe4, 0x00b1dd54, 0x00b1ee40, 0x00ec00a2, 0x03510730, 0x02e656f4, 0x036ed6fd, 0x037c61dd, 0x002e994a}}, Y: Field{[10]uint32{0x00029556, 0x011341c0, 0x00088a3b, 0x02566964, 0x001d2070, 0x00f19f80, 0x030b5d8d, 0x02055a8c, 0x0392d122, 0x0021ff2c}}}, + {X: Field{[10]uint32{0x0190e72d, 0x0307b419, 0x03b1bffd, 0x02e6e834, 0x0362c967, 0x03630c3c, 0x03dd95d2, 0x01d94eb1, 0x0172d101, 0x003ee4d9}}, Y: Field{[10]uint32{0x0036d8ed, 0x01e62092, 0x00587b08, 0x0119ad29, 0x02940382, 0x02562f8b, 0x03799659, 0x01a8c429, 0x03afdb6b, 0x002b7e8d}}}, + {X: Field{[10]uint32{0x003bae7b, 0x02621c2c, 0x01148991, 0x00a065a1, 0x01b97ff3, 0x021844a7, 0x006fdb78, 0x00214bdf, 0x03cb5e7c, 0x000a511c}}, Y: Field{[10]uint32{0x0190c86a, 0x03bb0e1f, 0x03617246, 0x0169b1d9, 0x0078463e, 0x02f56d28, 0x0209f951, 0x0219e9e2, 0x0136f991, 0x002f6415}}}, + {X: Field{[10]uint32{0x01bc574e, 0x01b21cf1, 0x00c0944a, 0x0231b4e9, 0x007687dc, 0x01a0edd3, 0x0337ced1, 0x00cff645, 0x004f73a6, 0x000bf03d}}, Y: Field{[10]uint32{0x0122ad1f, 0x001cd507, 0x0118415e, 0x01426914, 0x03ac572f, 0x02b8dcfa, 0x01499912, 0x018fe53a, 0x00eeffa0, 0x000a645f}}}, + {X: Field{[10]uint32{0x016d569e, 0x03009444, 0x00c40b9a, 0x03720eee, 0x018da210, 0x023b628c, 0x01d34f2c, 0x0169fbd6, 0x0251882c, 0x002047ec}}, Y: Field{[10]uint32{0x00a0c55d, 0x02464636, 0x00c00ad2, 0x001c170f, 0x02d480e4, 0x0250379a, 0x0204ad3f, 0x016be93b, 0x01472cb5, 0x001d37d9}}}, + {X: Field{[10]uint32{0x03fc5d07, 0x01f9852d, 0x0057ba9e, 0x03160bf7, 0x03c47996, 0x03539f94, 0x0051894a, 0x033c247d, 0x017cc1d6, 0x00116a78}}, Y: Field{[10]uint32{0x03069be1, 0x0072ab5e, 0x01bbb16d, 0x01b70dff, 0x034e1919, 0x02260cad, 0x02d19200, 0x0187d7ec, 0x004f0026, 0x00145a77}}}, + {X: Field{[10]uint32{0x01588e67, 0x03426bad, 0x00102645, 0x00e2de30, 0x00abd065, 0x02d71ef5, 0x003d96aa, 0x029eb51d, 0x03fc45cd, 0x00355dfd}}, Y: Field{[10]uint32{0x003be07a, 0x001c4a0c, 0x0125e521, 0x00b0c2ff, 0x02765e2c, 0x0231e33a, 0x011db618, 0x015f7f3b, 0x03717ea2, 0x001545ca}}}, + {X: Field{[10]uint32{0x0306e44f, 0x03846c66, 0x019c0650, 0x022ddde9, 0x024fb22d, 0x012c33bf, 0x0371e08d, 0x02a9b8e6, 0x02958098, 0x002990a6}}, Y: Field{[10]uint32{0x007dd2ed, 0x02992c65, 0x027dcf6a, 0x0097cb0e, 0x0336ab18, 0x0218902a, 0x00440f57, 0x0015772b, 0x02625587, 0x002bd253}}}, + {X: Field{[10]uint32{0x039a743d, 0x025a59e8, 0x00679073, 0x01e98f88, 0x0050bca3, 0x03d1e3ba, 0x00b1c80c, 0x0052d096, 0x0304b893, 0x0003ddf0}}, Y: Field{[10]uint32{0x01c1c7ee, 0x0218dfe3, 0x02c727e7, 0x00515638, 0x011c32f4, 0x003d03c6, 0x00452136, 0x0052f982, 0x017629d9, 0x003121e8}}}, + {X: Field{[10]uint32{0x02d1c988, 0x01985965, 0x01f5def7, 0x00bfecbe, 0x02cd76ea, 0x007b7b7a, 0x03f0a82e, 0x00491dc7, 0x02f61598, 0x001071bc}}, Y: Field{[10]uint32{0x01accb68, 0x02d4aa41, 0x031d3407, 0x0039176f, 0x02364277, 0x026da1f1, 0x039ed4ff, 0x00681d7f, 0x0144146c, 0x0016283d}}}, + {X: Field{[10]uint32{0x02b968d0, 0x019bb4cb, 0x01916cdf, 0x035c7f6d, 0x037ac2d2, 0x015d978f, 0x02aaacb3, 0x00debc27, 0x02c8c13d, 0x00321c93}}, Y: Field{[10]uint32{0x00d81221, 0x03495791, 0x029895ec, 0x03b69e18, 0x026ade66, 0x00af669b, 0x014bbf24, 0x00f9b79f, 0x03214210, 0x001c3b3d}}}, + {X: Field{[10]uint32{0x031fbbf2, 0x02ea7cff, 0x00650653, 0x012b81c3, 0x023b139e, 0x01d7ead9, 0x02204a2b, 0x0238daf8, 0x00460dd5, 0x0038a223}}, Y: Field{[10]uint32{0x0342509e, 0x00acd4c8, 0x0108c331, 0x02625488, 0x01bc1584, 0x0082f580, 0x01888797, 0x00ee2adf, 0x00dae139, 0x001c5644}}}, + {X: Field{[10]uint32{0x02d834dd, 0x02b0dbd9, 0x01ec1c14, 0x00d847aa, 0x01f56cf7, 0x02a99be6, 0x01999c9a, 0x0202e1ad, 0x0384d72d, 0x003c7d30}}, Y: Field{[10]uint32{0x00cc7e3f, 0x039cdd49, 0x03c44835, 0x0229a5ac, 0x02219838, 0x0326a9e1, 0x038527a3, 0x010b23ae, 0x03c24801, 0x002d550e}}}, + {X: Field{[10]uint32{0x01940a5b, 0x0204ad0c, 0x01e73f61, 0x0298d067, 0x0217aec3, 0x03b75fd6, 0x028d4126, 0x02df6c1d, 0x03f5832f, 0x00121d1d}}, Y: Field{[10]uint32{0x032608a7, 0x01e35786, 0x03c54c5f, 0x0158db6d, 0x020284f5, 0x00a9b55a, 0x004e3dc3, 0x03ea62f1, 0x01de4203, 0x00240c8b}}}, + {X: Field{[10]uint32{0x00ca75af, 0x02bc0dc5, 0x0229bff8, 0x000a7f84, 0x010c55df, 0x02cfba7d, 0x00f957e0, 0x019f892e, 0x023a5831, 0x0029c9a5}}, Y: Field{[10]uint32{0x008f7449, 0x01945b70, 0x0232d99f, 0x00954e96, 0x034a6369, 0x02d9507f, 0x0154d156, 0x00a70204, 0x0184d689, 0x0023f5ea}}}, + {X: Field{[10]uint32{0x0399e97c, 0x00ab16e2, 0x03033876, 0x030b8804, 0x00baa763, 0x01a669a3, 0x013a231e, 0x03ac7276, 0x01b4cf80, 0x00353083}}, Y: Field{[10]uint32{0x00eca01f, 0x031be7db, 0x0287a426, 0x00381624, 0x01f5abc5, 0x0246428d, 0x02a20713, 0x02943212, 0x03ba2555, 0x002e871d}}}, + {X: Field{[10]uint32{0x02748168, 0x027bf88e, 0x03afafa5, 0x0076b15b, 0x025159ba, 0x036343cd, 0x01b5a55a, 0x01c0aefb, 0x005389ae, 0x0001f3e7}}, Y: Field{[10]uint32{0x032336b8, 0x00e140ad, 0x0296f6ec, 0x0029ba90, 0x03489bee, 0x00c4d23b, 0x00ec347c, 0x01eef28b, 0x0324338c, 0x003b38ec}}}, + {X: Field{[10]uint32{0x00b73e55, 0x009506d1, 0x02f49699, 0x00ced36e, 0x03eec928, 0x00c9a01b, 0x039f9c30, 0x0352bce5, 0x00e3c1eb, 0x00248042}}, Y: Field{[10]uint32{0x01f466fc, 0x00b88025, 0x01395ba9, 0x01e1493d, 0x016cf8f4, 0x02e92399, 0x003f348e, 0x03120d3c, 0x0133d8ad, 0x000f88ac}}}, + {X: Field{[10]uint32{0x02479e90, 0x02da7109, 0x02a8a4fe, 0x00e12559, 0x03fc7605, 0x02b4ca94, 0x03613372, 0x021d8a6c, 0x038a98c4, 0x000559ab}}, Y: Field{[10]uint32{0x02997796, 0x02a145b6, 0x03926dab, 0x02ebacfd, 0x030da5d3, 0x00bf871e, 0x017db986, 0x00af931e, 0x01664bd7, 0x000a1231}}}, + {X: Field{[10]uint32{0x0361723c, 0x01daaf2b, 0x03044c0f, 0x02f89c7b, 0x01d2f6d9, 0x00ac2a2c, 0x017a7041, 0x0233af1f, 0x027102eb, 0x002936d7}}, Y: Field{[10]uint32{0x002e8ca4, 0x023232b1, 0x036a5695, 0x00abcae7, 0x03272f5f, 0x01ea501e, 0x004bc0a2, 0x00f777d8, 0x02e075a7, 0x00198f85}}}, + {X: Field{[10]uint32{0x0153e5fb, 0x00ef29e3, 0x00c13849, 0x01dd81de, 0x0333d90e, 0x031e73c6, 0x025d1106, 0x02e3e418, 0x03538bbd, 0x00343273}}, Y: Field{[10]uint32{0x021d9a60, 0x01e418e2, 0x01bd9683, 0x02201f70, 0x009975ad, 0x02e2f4c3, 0x00a21250, 0x03501f30, 0x020e8b9f, 0x002dbb33}}}, + {X: Field{[10]uint32{0x03d8391f, 0x01f39e3f, 0x0204ce65, 0x0051538e, 0x014a58d5, 0x033ce8e2, 0x0196d67b, 0x015ef5c1, 0x0292480f, 0x001d97ee}}, Y: Field{[10]uint32{0x0218302f, 0x03b24087, 0x023dbaf6, 0x02f57ceb, 0x0050879b, 0x03d06ad3, 0x03b552e3, 0x00d43968, 0x03ba1035, 0x00172c76}}}, + {X: Field{[10]uint32{0x03fb4a5e, 0x007b9be2, 0x025032c5, 0x02396bd2, 0x009bd3f8, 0x022d94be, 0x02a7b9b6, 0x01c0ad2a, 0x01e8e846, 0x0027e76a}}, Y: Field{[10]uint32{0x0296a0f6, 0x028b5fd5, 0x0284dedf, 0x02374b01, 0x021d8da0, 0x001a22b2, 0x017320ca, 0x005ec3ac, 0x019d7ecf, 0x00176f52}}}, + {X: Field{[10]uint32{0x03fdd3f4, 0x02480884, 0x025bfb11, 0x0272d196, 0x00ad949c, 0x006bbd7c, 0x03b1a166, 0x02252dcb, 0x003bdb95, 0x002be1b2}}, Y: Field{[10]uint32{0x0399e117, 0x03cf04b5, 0x00e55123, 0x02e6c6e2, 0x03004a7b, 0x0310709b, 0x03d2b25c, 0x00046580, 0x027d5541, 0x003b01a0}}}, + {X: Field{[10]uint32{0x01587e77, 0x03e8d43f, 0x0309cd94, 0x02c8b32e, 0x0364c8e3, 0x0202f8ce, 0x032b3fcc, 0x02f2341d, 0x01932fcc, 0x003eed22}}, Y: Field{[10]uint32{0x00c0b858, 0x0046db36, 0x03e04811, 0x035095ee, 0x0258598a, 0x00d01d69, 0x0051abd6, 0x00cf6acd, 0x01242793, 0x0003e737}}}, + {X: Field{[10]uint32{0x02d60684, 0x03b7079f, 0x0269bae6, 0x03e242a4, 0x00621f36, 0x00ab7270, 0x0315ecae, 0x030abd8a, 0x01a3ad97, 0x00103b2c}}, Y: Field{[10]uint32{0x0158b32e, 0x02a8014d, 0x005f288d, 0x02cfb661, 0x019a41f4, 0x008c07ee, 0x00e3e2b3, 0x0185f648, 0x0194fa3a, 0x003fe7b0}}}, + {X: Field{[10]uint32{0x00878f52, 0x01802706, 0x03691973, 0x00c31f4e, 0x0339873c, 0x03f808e3, 0x03d9014b, 0x00ad0bf2, 0x02f10c76, 0x000c7e24}}, Y: Field{[10]uint32{0x01718c95, 0x00d9cd25, 0x03ff7be5, 0x02e3df53, 0x015cd610, 0x03dae4b0, 0x0131066e, 0x01cd154c, 0x0005f31f, 0x00366f54}}}, + {X: Field{[10]uint32{0x00886c5c, 0x025bf209, 0x028f31c6, 0x024e32ad, 0x03921f81, 0x0175dce7, 0x014d150c, 0x001478b6, 0x0129e9f6, 0x002e8489}}, Y: Field{[10]uint32{0x016b1ed1, 0x01c926a1, 0x03c20d9c, 0x02730e5a, 0x007c0285, 0x01eb2708, 0x00577d33, 0x0354e46c, 0x031f7e9b, 0x0030cf01}}}, + {X: Field{[10]uint32{0x0124cf03, 0x030857ca, 0x018c5030, 0x024f5605, 0x03ef45d9, 0x02e68098, 0x013ecbc5, 0x034c4726, 0x00129a26, 0x000d4c59}}, Y: Field{[10]uint32{0x023a9742, 0x031b4d5e, 0x00e3f6a9, 0x01be460d, 0x03f92ef0, 0x016d8e16, 0x023e2d9c, 0x008eee73, 0x00d95216, 0x0021a988}}}, + {X: Field{[10]uint32{0x02c8e462, 0x00628854, 0x033ebf97, 0x02b1e146, 0x004a4aa7, 0x013b1fe7, 0x02ce92ca, 0x012a98d7, 0x030be413, 0x000c091d}}, Y: Field{[10]uint32{0x03c8c8ee, 0x03ac143f, 0x01225bbc, 0x02abe063, 0x00ab3f8f, 0x039ce139, 0x01c1579c, 0x01ebf85b, 0x03bd7214, 0x0007f3eb}}}, + {X: Field{[10]uint32{0x03da6564, 0x0340721a, 0x0071a672, 0x02993742, 0x02533c1b, 0x02507638, 0x02dbf169, 0x03a1b16d, 0x013da40e, 0x003d6e8c}}, Y: Field{[10]uint32{0x0000647d, 0x012eeb6e, 0x018c7294, 0x02090dfd, 0x018f9652, 0x01555d92, 0x02e95ec1, 0x01e41f25, 0x010db969, 0x000042a4}}}, + {X: Field{[10]uint32{0x0264e2f1, 0x02d6715c, 0x018ebb33, 0x00f84cb0, 0x00e485a2, 0x00632546, 0x037f426b, 0x033414d3, 0x03e2972c, 0x001a1785}}, Y: Field{[10]uint32{0x01f291c6, 0x000513ae, 0x03a0cb93, 0x00b77a83, 0x03470fd4, 0x00455b6b, 0x03a3f475, 0x02ab069d, 0x0338be84, 0x00259516}}}, + {X: Field{[10]uint32{0x03f119eb, 0x03d97466, 0x028e0504, 0x03718749, 0x01fdd481, 0x03a4701f, 0x01e1bca7, 0x02608a96, 0x01fdfacc, 0x003804a1}}, Y: Field{[10]uint32{0x01c39909, 0x01f5b967, 0x010630f7, 0x01790719, 0x0140bf5b, 0x01c80ae6, 0x003615ba, 0x036aebbe, 0x013a2479, 0x002ba085}}}, + {X: Field{[10]uint32{0x01839601, 0x00872c15, 0x03220b54, 0x024dd8d7, 0x0093798a, 0x024c8079, 0x00d67200, 0x0043b1e1, 0x01863277, 0x00318791}}, Y: Field{[10]uint32{0x006c04ea, 0x02e32c9d, 0x0026dcde, 0x03c5d0cf, 0x025d42fc, 0x02e95572, 0x023e0163, 0x01939e87, 0x03f5aa5b, 0x0039187e}}}, + {X: Field{[10]uint32{0x03d192d4, 0x01f597c7, 0x01af3be8, 0x00d2400a, 0x013106fc, 0x004ed876, 0x00d8ca25, 0x0242db89, 0x02cb4e58, 0x0007109e}}, Y: Field{[10]uint32{0x02cf29d0, 0x03b0310d, 0x023e9c9c, 0x0357ba2b, 0x0184935a, 0x030d0c28, 0x0304fa6e, 0x014a2e6e, 0x00251518, 0x000765b8}}}, + {X: Field{[10]uint32{0x012fd8e7, 0x037dbc7c, 0x02f54431, 0x0066d660, 0x005a9326, 0x01f51c2e, 0x02ddb3ba, 0x0225ed2d, 0x03fd6d51, 0x001795de}}, Y: Field{[10]uint32{0x011c6eb4, 0x03535e48, 0x01ff9203, 0x01131eb4, 0x00123cb0, 0x02969ff4, 0x0036e908, 0x030674ea, 0x02929734, 0x0030685c}}}, + {X: Field{[10]uint32{0x00237b30, 0x00ed028a, 0x028a6817, 0x01d9b4fa, 0x02adc6ae, 0x03ef2b7c, 0x03aefc8d, 0x022902eb, 0x03331f96, 0x00331e2c}}, Y: Field{[10]uint32{0x01857d42, 0x02c29011, 0x038aa14e, 0x01f250db, 0x00dfc2ce, 0x0048e32d, 0x01ef04b4, 0x0301a3fc, 0x01b20a5b, 0x0016dda4}}}, + {X: Field{[10]uint32{0x00919fb6, 0x020c293b, 0x0016a0b1, 0x00aa56b7, 0x02c44537, 0x02bcfb3a, 0x01dc288f, 0x0113ca79, 0x0037487b, 0x000e1571}}, Y: Field{[10]uint32{0x009359d2, 0x00a1f20a, 0x0151911c, 0x03d7868e, 0x01ed1949, 0x0022f6f5, 0x03bcd5b3, 0x03e8a153, 0x029a48cb, 0x0037cb87}}}, + {X: Field{[10]uint32{0x01d16b19, 0x016119ae, 0x03c928f1, 0x0086df79, 0x00dc62cb, 0x01f6cf5b, 0x03fcf6b9, 0x00d5bf17, 0x03b40a83, 0x0030148c}}, Y: Field{[10]uint32{0x0254f500, 0x038efde7, 0x0327525e, 0x03d4588c, 0x00956616, 0x007a3795, 0x020eac65, 0x02211cfe, 0x02390ce7, 0x0002c6f6}}}, + {X: Field{[10]uint32{0x019dfffb, 0x039f7b02, 0x0010b455, 0x00799586, 0x010b736c, 0x02407cd5, 0x02000245, 0x009a9f66, 0x013cf342, 0x001b0193}}, Y: Field{[10]uint32{0x009eb9a7, 0x02093358, 0x002e9925, 0x01dca349, 0x02aa5444, 0x0071710b, 0x00f8fd2a, 0x030687e0, 0x0042d25e, 0x00058365}}}, + {X: Field{[10]uint32{0x03714cf2, 0x01eea762, 0x01009bf3, 0x01c91e27, 0x01b3e207, 0x00379a9f, 0x021a93a0, 0x006a946d, 0x038970bb, 0x0025963a}}, Y: Field{[10]uint32{0x02c51cc2, 0x00c07aa4, 0x01ff7a58, 0x012665f5, 0x0096be89, 0x01036278, 0x021a903f, 0x023e2de0, 0x00aff7da, 0x003352e9}}}, + {X: Field{[10]uint32{0x03b4f0c8, 0x039fa992, 0x031b87a3, 0x01a69c70, 0x035cf1f9, 0x00fe65bd, 0x032b0c4c, 0x01bdc247, 0x0110a554, 0x001b808e}}, Y: Field{[10]uint32{0x00c459c5, 0x026b76cd, 0x0358999b, 0x00d99470, 0x007faa9b, 0x0362486e, 0x02d8cfc7, 0x01cd3767, 0x01d790ec, 0x003dbb59}}}, + {X: Field{[10]uint32{0x00c7ff6e, 0x023e2655, 0x03a141e6, 0x006f5831, 0x03926290, 0x00cc14df, 0x003528e0, 0x001267e4, 0x0098e970, 0x000e8d6b}}, Y: Field{[10]uint32{0x032069ed, 0x00e36865, 0x00eb6c4d, 0x03e29d91, 0x001f247f, 0x03b68e09, 0x014ac0c9, 0x0070c14e, 0x0116da63, 0x00244f65}}}, + {X: Field{[10]uint32{0x036af212, 0x014395c1, 0x023db073, 0x01bc925d, 0x022317c6, 0x02c6522f, 0x036def30, 0x02a916a2, 0x025115df, 0x0034227e}}, Y: Field{[10]uint32{0x00a6da9c, 0x03f720c6, 0x00f6ab12, 0x02b12864, 0x03a18e5d, 0x00ffe844, 0x025120cf, 0x03eb11de, 0x0173f326, 0x00139aba}}}, + {X: Field{[10]uint32{0x018cf2ef, 0x02ecb083, 0x036ab045, 0x0357de42, 0x005b9cd9, 0x00f654c7, 0x00ea0f23, 0x00aad1d2, 0x012f2aa6, 0x0039ccf1}}, Y: Field{[10]uint32{0x0182a291, 0x00377c75, 0x02d89fb8, 0x0215c314, 0x0336ac48, 0x035ffdd4, 0x0323ab28, 0x01ca4eb2, 0x01c93c67, 0x001c0455}}}, + {X: Field{[10]uint32{0x03f14c7a, 0x02bdd8f9, 0x01b9be8c, 0x002ee065, 0x021eb477, 0x00aeafe1, 0x00aa6f24, 0x01a13f99, 0x037dc006, 0x0012dbde}}, Y: Field{[10]uint32{0x0194e00d, 0x01917ac8, 0x01d5a2b0, 0x001763c8, 0x017bfaea, 0x014e8132, 0x01805d8a, 0x01eccc30, 0x0380ac75, 0x001b162d}}}, + {X: Field{[10]uint32{0x0267f79d, 0x009b97f8, 0x038b4811, 0x0308ed1d, 0x0344ff51, 0x03154b9c, 0x00d7aeb8, 0x02b02831, 0x0002cd1f, 0x0006d481}}, Y: Field{[10]uint32{0x03db1a39, 0x03b0dd4d, 0x013c19e8, 0x03c424f6, 0x0030b252, 0x026b7536, 0x004ee943, 0x024c1283, 0x01005664, 0x00023b83}}}, + {X: Field{[10]uint32{0x017139b1, 0x02bcafae, 0x024f5bf9, 0x00fd0f61, 0x023400cc, 0x022a2179, 0x02da4c63, 0x03b617f0, 0x02d5d7f1, 0x00224db9}}, Y: Field{[10]uint32{0x029b402b, 0x00ac1060, 0x03c4778d, 0x005e96f5, 0x018879f2, 0x03f4c989, 0x00cdc8a6, 0x00ca8ddc, 0x0220b4b9, 0x000a604a}}}, + {X: Field{[10]uint32{0x016b518f, 0x00441172, 0x021eec4f, 0x01bd6e86, 0x01aebd39, 0x0157645c, 0x036c043a, 0x015536a8, 0x027f4813, 0x001a022b}}, Y: Field{[10]uint32{0x00425810, 0x0264e967, 0x01c2231b, 0x020df1d2, 0x00f581b9, 0x03d055d7, 0x00e85fd5, 0x0237715e, 0x026e8872, 0x001abf2b}}}, + {X: Field{[10]uint32{0x01a2cd1c, 0x01e4928d, 0x0310f236, 0x024d56a6, 0x0193e232, 0x00076002, 0x011bba76, 0x00fd9848, 0x029444c7, 0x00161b19}}, Y: Field{[10]uint32{0x025416c7, 0x0004ab3f, 0x031c8862, 0x0377bc19, 0x03873537, 0x00df2df1, 0x00f5507d, 0x028f2d02, 0x001ff6eb, 0x001d2c24}}}, + {X: Field{[10]uint32{0x03f89e11, 0x025efa07, 0x0066b078, 0x02966733, 0x020b183a, 0x02461507, 0x0388453e, 0x03c78131, 0x025ddead, 0x001e2720}}, Y: Field{[10]uint32{0x006cb5ab, 0x01e24e39, 0x0103cb8f, 0x015fffa6, 0x03e40cc3, 0x027e62a6, 0x027480b8, 0x02c4f1af, 0x026f641b, 0x002041aa}}}, + {X: Field{[10]uint32{0x01419797, 0x01f3efaa, 0x02076acd, 0x01bb8763, 0x02e52042, 0x01fd92f2, 0x00d0ddf9, 0x03ea9988, 0x00bbfd26, 0x0035eae0}}, Y: Field{[10]uint32{0x00c5a823, 0x02114de4, 0x02efbc71, 0x022e7ccb, 0x026e50a5, 0x004e7453, 0x034a85f5, 0x02c40ebb, 0x0372a6d1, 0x0009abe7}}}, + {X: Field{[10]uint32{0x02f67f7f, 0x015b4bcd, 0x033154c2, 0x00cf280a, 0x00bddf0f, 0x007af106, 0x012b311b, 0x006ae118, 0x02d44daf, 0x00063dc4}}, Y: Field{[10]uint32{0x037d25bc, 0x026f6981, 0x03ee9f2d, 0x034c8574, 0x006b06d8, 0x013fdefe, 0x033c3f43, 0x03533bb6, 0x0150f92f, 0x003102c6}}}, + {X: Field{[10]uint32{0x03e5a06e, 0x039ba9b1, 0x005b3eb9, 0x00c8877a, 0x02fc399d, 0x02662f31, 0x022a7cbf, 0x00623de3, 0x036d9f6d, 0x00221cc9}}, Y: Field{[10]uint32{0x03c9e1a6, 0x029c2079, 0x02b4e054, 0x010f012d, 0x00dac977, 0x0395985e, 0x0020a3a7, 0x02e7a3ba, 0x01378ee9, 0x000a5fa0}}}, + {X: Field{[10]uint32{0x0288e0ad, 0x00b299b1, 0x01157145, 0x019937de, 0x0030fadd, 0x037d0c73, 0x00f57cdf, 0x005faf02, 0x01015bd2, 0x000406e0}}, Y: Field{[10]uint32{0x01179e6a, 0x01cdc617, 0x01ab339b, 0x02d1b253, 0x014c7542, 0x02a3e372, 0x01816d40, 0x00e0c461, 0x032fad20, 0x003e9b06}}}, + {X: Field{[10]uint32{0x0342dd57, 0x035314df, 0x03b6cd81, 0x0328a612, 0x03abe3b3, 0x02c81c7e, 0x02520a8c, 0x00518047, 0x015776c3, 0x001decf0}}, Y: Field{[10]uint32{0x004a645a, 0x0226417f, 0x00244925, 0x017453c3, 0x00040cce, 0x010fbd6b, 0x0084c9b4, 0x0006dc70, 0x02b1dab6, 0x002342f3}}}, + {X: Field{[10]uint32{0x01daec7a, 0x01a9a83f, 0x005d3ecf, 0x0224cf20, 0x02fbe2c1, 0x02e99bc4, 0x03aca338, 0x0182dbfd, 0x015256ac, 0x000547cb}}, Y: Field{[10]uint32{0x024f62d6, 0x033a7c1d, 0x03ea674e, 0x02227355, 0x01c4833c, 0x027a508d, 0x03038d64, 0x012fe645, 0x017710cd, 0x0034aab3}}}, + {X: Field{[10]uint32{0x031d32c7, 0x028e0245, 0x011a2029, 0x0070446f, 0x00950881, 0x012d1b7e, 0x0338dbe2, 0x0105ed18, 0x0327f41e, 0x00375d73}}, Y: Field{[10]uint32{0x01b67be5, 0x00c88906, 0x013dd46c, 0x003363ed, 0x00ee2217, 0x0324761b, 0x0303c33c, 0x026e012a, 0x0055a338, 0x0038ca2e}}}, + {X: Field{[10]uint32{0x011d7a83, 0x035fbb9e, 0x0028a494, 0x01d8cd6d, 0x026a3f6b, 0x03d986c7, 0x02366ab3, 0x03671277, 0x03ebbdd1, 0x0003ea87}}, Y: Field{[10]uint32{0x0025d572, 0x015c4f6e, 0x029c413b, 0x02760695, 0x01948bb2, 0x00791955, 0x0248ee56, 0x000aae30, 0x014f8fce, 0x0037cd87}}}, + {X: Field{[10]uint32{0x018f8be5, 0x036bfb53, 0x03545671, 0x037e31a9, 0x00a4cada, 0x019e2565, 0x01ee65b6, 0x02ecc7f7, 0x01be5bc2, 0x000f3043}}, Y: Field{[10]uint32{0x0039c2df, 0x023995dc, 0x0110dbc0, 0x002ba909, 0x00710112, 0x0350b25d, 0x0292a3a9, 0x02b5bc39, 0x01ef8c66, 0x00200b51}}}, + {X: Field{[10]uint32{0x03b93ba2, 0x01dafb29, 0x03a1eaf5, 0x02140d78, 0x01856cc4, 0x014a00b8, 0x00dee7f7, 0x03b07245, 0x0325325d, 0x00255139}}, Y: Field{[10]uint32{0x02eeeb49, 0x020c4577, 0x03686aad, 0x03779421, 0x00aaf137, 0x005cce33, 0x0339b037, 0x00f013af, 0x03a68151, 0x0033b1f6}}}, + {X: Field{[10]uint32{0x0383a964, 0x02f8df27, 0x01eac038, 0x01b89de7, 0x0154eec6, 0x03737db0, 0x017ff8b4, 0x0188d9ec, 0x03dcd5d0, 0x0025283e}}, Y: Field{[10]uint32{0x03efe82a, 0x00a7bd33, 0x030e576f, 0x004d68a8, 0x03fea742, 0x0290b8b8, 0x0223e169, 0x01b206dc, 0x00fd5ef0, 0x003c97cd}}}, + {X: Field{[10]uint32{0x02b579c7, 0x03a12cf1, 0x03633100, 0x00ec27dd, 0x0314f67c, 0x0085ee90, 0x01fbd4bf, 0x01f8bda5, 0x01b2c3fc, 0x0026278a}}, Y: Field{[10]uint32{0x0221c888, 0x0143bf6d, 0x02771172, 0x010c0708, 0x01ed003a, 0x005f6abe, 0x034f3e99, 0x000a5c0a, 0x01280cd0, 0x0018229b}}}, + {X: Field{[10]uint32{0x033494a5, 0x00192fc1, 0x017f1c81, 0x0173a502, 0x0249b4bd, 0x0164d2b0, 0x00e979b0, 0x029674ec, 0x03c44295, 0x0030e317}}, Y: Field{[10]uint32{0x01d1e2fb, 0x00118b58, 0x02ecb760, 0x01c5f2fb, 0x031d1dbc, 0x003af059, 0x00e471ae, 0x02cda992, 0x03f6d354, 0x00058902}}}, + {X: Field{[10]uint32{0x03a7a63b, 0x0304e3c3, 0x037e1546, 0x01adeb61, 0x0207dc65, 0x031963be, 0x0341d8c5, 0x0011b162, 0x026735c4, 0x0037a73d}}, Y: Field{[10]uint32{0x006639ac, 0x021b78d4, 0x00cb7575, 0x039f66e5, 0x03ecc19d, 0x01120042, 0x03729275, 0x018b8f88, 0x024fba91, 0x000bf0a0}}}, + {X: Field{[10]uint32{0x02c06522, 0x0110303d, 0x023c4c8c, 0x002119d6, 0x03f1dd9e, 0x0230cf27, 0x01d84b38, 0x0022d41e, 0x0137e567, 0x0000933f}}, Y: Field{[10]uint32{0x002af897, 0x00eb1e71, 0x01f00738, 0x01ab36df, 0x021aee67, 0x016b219c, 0x034d2895, 0x00055ed2, 0x00ea0982, 0x00072f32}}}, + {X: Field{[10]uint32{0x007cc121, 0x00858e7a, 0x01ed7264, 0x023d8990, 0x012b275d, 0x038247a7, 0x00414a95, 0x02e6d8bd, 0x01086ad8, 0x00275b8c}}, Y: Field{[10]uint32{0x02d3abe0, 0x025e6dba, 0x01bca757, 0x02d379d4, 0x0043c46a, 0x029d0f3c, 0x02b59ad5, 0x0299f536, 0x000a6792, 0x002e491c}}}, + {X: Field{[10]uint32{0x0209354d, 0x02f82021, 0x01d38673, 0x00b749d9, 0x0374aea2, 0x023b4e37, 0x01c21e53, 0x020e55ce, 0x01ae28b2, 0x00014aa2}}, Y: Field{[10]uint32{0x00334e51, 0x0316c7b6, 0x01708089, 0x035661ed, 0x01469b06, 0x01dacbd8, 0x03cccd20, 0x020c2f4d, 0x01579b65, 0x003060fb}}}, + {X: Field{[10]uint32{0x0227571d, 0x034d0836, 0x0255046b, 0x0230b05c, 0x01cda3bf, 0x01c9f2bd, 0x03f5d31d, 0x00601c90, 0x0272491d, 0x000bff4c}}, Y: Field{[10]uint32{0x035b6ad5, 0x03326994, 0x01d52131, 0x02d74d06, 0x00599934, 0x037abbd6, 0x01e48be6, 0x02ccd28c, 0x03bd6f38, 0x00204ba3}}}, + {X: Field{[10]uint32{0x00973fca, 0x02567167, 0x022f2eba, 0x02709c19, 0x0265df68, 0x02c64ec5, 0x0251b66d, 0x0290e8d7, 0x02094269, 0x00175831}}, Y: Field{[10]uint32{0x010efadc, 0x03c7d221, 0x0048a3af, 0x02165a71, 0x006d3b92, 0x03d03350, 0x031bb7e3, 0x035864ac, 0x024fd1af, 0x003d644c}}}, + {X: Field{[10]uint32{0x0112ff75, 0x029ad2cf, 0x00d0ae6d, 0x03e615e1, 0x004c86da, 0x00706d58, 0x0026340e, 0x00cd4fd1, 0x000abfe5, 0x0008f831}}, Y: Field{[10]uint32{0x00191d9d, 0x0085444a, 0x03827f99, 0x01e66eb3, 0x00f19d5a, 0x02032851, 0x01baf682, 0x0024a824, 0x00b5fc86, 0x003a4211}}}, + {X: Field{[10]uint32{0x006094f6, 0x0221739f, 0x02bb1155, 0x01e4c2f4, 0x0050e67d, 0x03cdf6a0, 0x02f20d77, 0x00704b29, 0x00ab5d4a, 0x00251606}}, Y: Field{[10]uint32{0x02695e03, 0x00735592, 0x03b6f9a1, 0x018febf2, 0x0032ca81, 0x03b7b6d8, 0x0269c969, 0x02b9b6a9, 0x01d0e2f9, 0x002d7cb0}}}, + {X: Field{[10]uint32{0x00724c8c, 0x03b363f6, 0x0124bc41, 0x0175881b, 0x015043be, 0x00335ef3, 0x03a469ca, 0x02fda861, 0x037d2586, 0x00347d36}}, Y: Field{[10]uint32{0x02206839, 0x0296b384, 0x03365a1c, 0x02ac071b, 0x02b1525e, 0x00a4a719, 0x0080ce9b, 0x01dd2ef5, 0x038277c4, 0x00190153}}}, + {X: Field{[10]uint32{0x0014a18d, 0x01fd3b3b, 0x01e1860f, 0x00a973dd, 0x01158b4f, 0x010a8f44, 0x005f2d5b, 0x01ba706a, 0x014f2458, 0x0013d713}}, Y: Field{[10]uint32{0x00efdbe5, 0x02d28c6c, 0x03350986, 0x027a5c3e, 0x021e48bb, 0x01ffefb0, 0x013be2be, 0x01e581a5, 0x02716d54, 0x0015d5db}}}, + {X: Field{[10]uint32{0x0198150a, 0x01032e52, 0x02118c38, 0x031407a6, 0x013f8edf, 0x0393e40f, 0x023cf5c5, 0x00510f62, 0x005bdcb3, 0x00304ed8}}, Y: Field{[10]uint32{0x02cb8435, 0x000f2c85, 0x022b52f6, 0x0127d064, 0x006c368e, 0x0122c070, 0x022a8ea9, 0x03efd4b9, 0x02af99f1, 0x0023738b}}}, + {X: Field{[10]uint32{0x0029cbb6, 0x01d33409, 0x01753391, 0x019b899a, 0x03a3df24, 0x0073bad6, 0x024a5b5a, 0x00953925, 0x032ab66f, 0x00064dec}}, Y: Field{[10]uint32{0x02f2e385, 0x0005ce03, 0x0022bb57, 0x01e604f8, 0x030181e0, 0x00fffec6, 0x00eabb05, 0x001d72ef, 0x00a06f1b, 0x0025c4ac}}}, + {X: Field{[10]uint32{0x019ba2e4, 0x0186c1d0, 0x004d747e, 0x036deb4b, 0x00d757bb, 0x00ef87d6, 0x00ef386c, 0x01cbcc21, 0x033f2f17, 0x0039294c}}, Y: Field{[10]uint32{0x036b6f56, 0x00529eb2, 0x00c7c5af, 0x03326f05, 0x02132571, 0x02f05590, 0x009b7178, 0x0392e40e, 0x01a72ec2, 0x003a13df}}}, + {X: Field{[10]uint32{0x0206cca6, 0x03f6d2d5, 0x00dcffc7, 0x0106b855, 0x01d57a83, 0x03304217, 0x000a0cf5, 0x00aa3142, 0x00b0a3f4, 0x000be28e}}, Y: Field{[10]uint32{0x024681c1, 0x03ce31a3, 0x024f1134, 0x00b86c49, 0x002fa2a7, 0x03bb58a5, 0x0008d9c4, 0x0076d959, 0x02a52c30, 0x0021d931}}}, + {X: Field{[10]uint32{0x01a55ff7, 0x015c4aa0, 0x0070b873, 0x0266e106, 0x02acd145, 0x033aad7f, 0x00585b63, 0x00b5dedb, 0x01c2c51c, 0x0000f4af}}, Y: Field{[10]uint32{0x02d3e9e0, 0x02e3736d, 0x035e9496, 0x00da8fa2, 0x00922460, 0x0011db91, 0x01a808ff, 0x018f7ea6, 0x01adbbe2, 0x000cfdd2}}}, + {X: Field{[10]uint32{0x03ab7d3a, 0x03cf307b, 0x01b3e6e5, 0x00548b6f, 0x021ecec2, 0x00afe8f8, 0x02b9acf6, 0x01338cdd, 0x0008d676, 0x003f21fe}}, Y: Field{[10]uint32{0x0035176a, 0x032e5c4a, 0x00581717, 0x0093386f, 0x01c03430, 0x014292b0, 0x0015dd87, 0x03e4ddc2, 0x0303c1f4, 0x00339d7a}}}, + {X: Field{[10]uint32{0x031e68d5, 0x009c2fd6, 0x02cb4374, 0x014871f9, 0x01323549, 0x03326121, 0x00885dc0, 0x03847afa, 0x005c62de, 0x001fe06e}}, Y: Field{[10]uint32{0x029c4558, 0x0034a9da, 0x017f3ad7, 0x012bb572, 0x011750aa, 0x025b3dce, 0x01ba062d, 0x036d8705, 0x037d6a84, 0x002deb7b}}}, + {X: Field{[10]uint32{0x01fd5557, 0x022e40f8, 0x0288c826, 0x0224f085, 0x0233cc8f, 0x018bbe47, 0x01d8f47f, 0x00eb97a3, 0x003f7afd, 0x00358635}}, Y: Field{[10]uint32{0x00cd34b8, 0x02f2a9b8, 0x03fb4fc5, 0x0237f230, 0x0042ce9e, 0x024031f9, 0x03212679, 0x02e6c20a, 0x017b0c8a, 0x00186020}}}, + {X: Field{[10]uint32{0x016e4940, 0x03e532e2, 0x009310cc, 0x02f37ddb, 0x03694430, 0x020e0ee6, 0x03f540fc, 0x026c1b6b, 0x004ff237, 0x002e9693}}, Y: Field{[10]uint32{0x0107b1f2, 0x001d6a3f, 0x0128db91, 0x03954d29, 0x0325299d, 0x03cba4cc, 0x01309b24, 0x0239bd3b, 0x011a0b13, 0x000e8887}}}, + {X: Field{[10]uint32{0x00cfdf56, 0x00a7e8c6, 0x018abcec, 0x025720c2, 0x03801363, 0x02cd6eb0, 0x03591415, 0x00dd1a20, 0x01b60bee, 0x0031a462}}, Y: Field{[10]uint32{0x0339268c, 0x022f5275, 0x0279c582, 0x0078a6de, 0x019795e6, 0x038d01ec, 0x00232fa7, 0x0368eb37, 0x03c2b862, 0x00286176}}}, + {X: Field{[10]uint32{0x00efae12, 0x00dccb07, 0x02d71bcd, 0x021a1f96, 0x0270dffd, 0x0267500e, 0x0063423b, 0x02d006ae, 0x0144032f, 0x00147d9f}}, Y: Field{[10]uint32{0x01e10e59, 0x02cb6518, 0x01f5ca8e, 0x00fe2993, 0x020403e2, 0x032fc859, 0x00ae68a3, 0x00128caf, 0x0085a2c4, 0x00222c5d}}}, + {X: Field{[10]uint32{0x037c4bd5, 0x02fb9b7a, 0x00a36fa8, 0x005fb4f3, 0x016001e1, 0x0252e2d9, 0x006fb69a, 0x017e350d, 0x0209e558, 0x00336b3f}}, Y: Field{[10]uint32{0x02028542, 0x0211249b, 0x01ecefdb, 0x000d6515, 0x03af5fc4, 0x0019a675, 0x00121762, 0x00c74056, 0x005a9931, 0x00377c6f}}}, + {X: Field{[10]uint32{0x03f0e769, 0x00cf24e2, 0x01be319f, 0x02874598, 0x00481eaa, 0x033a4222, 0x0301d70c, 0x0391da71, 0x0371e1fc, 0x00204a79}}, Y: Field{[10]uint32{0x0045c6e2, 0x002a05bc, 0x02d700d4, 0x0226d511, 0x038a4db1, 0x01d259ab, 0x02d8b6f9, 0x02f158e7, 0x013da864, 0x000fad5c}}}, + {X: Field{[10]uint32{0x02bce3ab, 0x004cafd6, 0x009ada68, 0x02abe0a2, 0x00f39c14, 0x02a9cc35, 0x002fc0f8, 0x016f03cc, 0x02ef6d41, 0x002e5c18}}, Y: Field{[10]uint32{0x013db3a6, 0x003cc4f5, 0x02829049, 0x03954445, 0x006644c9, 0x0148891f, 0x00dfdd38, 0x0324f3f6, 0x0288cd76, 0x0022b5c1}}}, + {X: Field{[10]uint32{0x030bd913, 0x01a853d3, 0x03ca422a, 0x03b14552, 0x0250de67, 0x013a1af9, 0x01d6af8c, 0x006d7fa9, 0x018b4e81, 0x000670f2}}, Y: Field{[10]uint32{0x0190a109, 0x01d1bea8, 0x027bdd5d, 0x017a491d, 0x03c18b9d, 0x021425f2, 0x021b5c73, 0x03264cc3, 0x039648bd, 0x002f148f}}}, + {X: Field{[10]uint32{0x01b42b9c, 0x026cf0ad, 0x0355967a, 0x01efbf98, 0x020ad769, 0x02244638, 0x02be43f8, 0x03b9d2c7, 0x00c73616, 0x002e7bcd}}, Y: Field{[10]uint32{0x03661bea, 0x003a9a16, 0x022543b7, 0x02a8d5c3, 0x02e8dc05, 0x03988e54, 0x01be2715, 0x006b06e2, 0x01ddd55b, 0x0004bc73}}}, + {X: Field{[10]uint32{0x0103c34a, 0x03b6e5fd, 0x02ca86e8, 0x00faf7ae, 0x0359dd2a, 0x01b61371, 0x039c39a9, 0x0336d603, 0x034f58e2, 0x001dc638}}, Y: Field{[10]uint32{0x03e96df7, 0x019ec400, 0x03093135, 0x00a23838, 0x01cf5e37, 0x0312f45f, 0x01cd8f96, 0x0106e04b, 0x01fbdc08, 0x0029b441}}}, + {X: Field{[10]uint32{0x037e8dba, 0x03321c71, 0x02ed621f, 0x02c62bed, 0x01e259c1, 0x034d68da, 0x03ba89b8, 0x039cdd8e, 0x004b8e6d, 0x0036ace2}}, Y: Field{[10]uint32{0x00a11577, 0x00e89e05, 0x0153ee50, 0x0024abbe, 0x01c9316e, 0x036d2802, 0x02bd4b5e, 0x00b508ae, 0x0329c59a, 0x003d12db}}}, + {X: Field{[10]uint32{0x027f4366, 0x03b6ac79, 0x00a1876a, 0x0147a11f, 0x03a67367, 0x02d6f9b7, 0x026a8978, 0x01e0b797, 0x02101139, 0x0032cf43}}, Y: Field{[10]uint32{0x0157d3ea, 0x03e5c26f, 0x010cf189, 0x019da705, 0x01572aff, 0x03923c76, 0x0169b33b, 0x0250f99e, 0x008dd227, 0x0009ffa2}}}, + {X: Field{[10]uint32{0x00c3c6a0, 0x01fecefa, 0x0279fcca, 0x0191ba8b, 0x03656ea5, 0x03d8ad2d, 0x01193dbb, 0x02750423, 0x03f85561, 0x003ac6c7}}, Y: Field{[10]uint32{0x02282ea4, 0x0340f258, 0x027a5ced, 0x00e926cc, 0x01d36ae9, 0x000e1159, 0x01137414, 0x0357075c, 0x00c75b73, 0x00309fe8}}}, + {X: Field{[10]uint32{0x0039c5dd, 0x0025e187, 0x03aeb587, 0x03cf4b95, 0x00bee8f9, 0x00eadaf7, 0x01a11170, 0x003c47dd, 0x01e60bc4, 0x0017541e}}, Y: Field{[10]uint32{0x006e46d0, 0x02048851, 0x02bab805, 0x0378061c, 0x014d8435, 0x02f9ef7e, 0x025829b4, 0x02e75775, 0x012ba40d, 0x00052b84}}}, + {X: Field{[10]uint32{0x01a7b38e, 0x03f302a8, 0x00502384, 0x023780c0, 0x01b70809, 0x02c852ec, 0x028acd26, 0x01abc1b4, 0x02f76beb, 0x00004183}}, Y: Field{[10]uint32{0x03bdf9a3, 0x003b1230, 0x022e275d, 0x0015481f, 0x0334252c, 0x028860f5, 0x005464da, 0x03190a56, 0x039ff6c6, 0x0033903c}}}, + {X: Field{[10]uint32{0x02170695, 0x008e1cea, 0x03e1afd7, 0x0251c358, 0x01e7bcc8, 0x0309d14a, 0x007c271a, 0x03dcc625, 0x0063c001, 0x00259471}}, Y: Field{[10]uint32{0x0254eaf7, 0x00dfec39, 0x0154d218, 0x01e96a6c, 0x013b16ba, 0x022d8f26, 0x016d17fe, 0x001b69cf, 0x027fe8ff, 0x00138d8b}}}, + {X: Field{[10]uint32{0x03363dcc, 0x00a3c9c7, 0x0000ee09, 0x01334891, 0x01895cda, 0x02d0a2c6, 0x02822cdc, 0x0086d0bd, 0x03765928, 0x0017108a}}, Y: Field{[10]uint32{0x012b9400, 0x017f3d92, 0x0148444e, 0x036054a0, 0x014cb6b4, 0x03db01fd, 0x008258f0, 0x01df28d1, 0x034f9e4c, 0x000bf6d3}}}, + {X: Field{[10]uint32{0x01faba2c, 0x009364ea, 0x003d2b72, 0x029b353d, 0x02ab3868, 0x0114b312, 0x023ce519, 0x009435ce, 0x012b5d98, 0x0036c51f}}, Y: Field{[10]uint32{0x010ed0de, 0x02469e81, 0x009258a3, 0x03f81931, 0x009fdebf, 0x01ca65a1, 0x0343227a, 0x01ab37e8, 0x0380ad3c, 0x001cc950}}}, + {X: Field{[10]uint32{0x01454b4c, 0x0345b2f9, 0x01384a41, 0x009bb613, 0x01e1beca, 0x02207a26, 0x02237678, 0x02ff4594, 0x03a0f97a, 0x002699d8}}, Y: Field{[10]uint32{0x0090306a, 0x028074ce, 0x03cb2737, 0x01d64b22, 0x00e7952f, 0x00420a42, 0x031a3d55, 0x01605ccb, 0x007db6aa, 0x002ed450}}}, + {X: Field{[10]uint32{0x025daea8, 0x02da8003, 0x0400007d, 0x027a3147, 0x0007b45a, 0x03e53d61, 0x025c889e, 0x022bd3d3, 0x0133e910, 0x000dbf9e}}, Y: Field{[10]uint32{0x01227ee5, 0x0216ed09, 0x019e27fc, 0x02ed9ad1, 0x031943c7, 0x01c78570, 0x003a0f4a, 0x01688723, 0x01baecdd, 0x00340929}}}, + {X: Field{[10]uint32{0x03c784e7, 0x0155a28e, 0x006afc44, 0x03a96dce, 0x0144c749, 0x01d4a5a0, 0x02782fb8, 0x01f9a033, 0x0263f04f, 0x001036b9}}, Y: Field{[10]uint32{0x0355050b, 0x00445d95, 0x02bb9478, 0x011d12c5, 0x02cea2ab, 0x008f3c94, 0x0058c854, 0x03374009, 0x03fdac6b, 0x00126918}}}, + {X: Field{[10]uint32{0x01c5b8d1, 0x017272eb, 0x00a7542c, 0x02e9e7ea, 0x01da55fa, 0x0056bf67, 0x00c6d10b, 0x03cec23a, 0x016dc8ff, 0x0002e858}}, Y: Field{[10]uint32{0x00a786ff, 0x006ac96c, 0x01019764, 0x01797c38, 0x02771045, 0x0328256c, 0x025a3ace, 0x00f19865, 0x0042a623, 0x003bc25b}}}, + {X: Field{[10]uint32{0x019c4a66, 0x00b409d8, 0x01e7da70, 0x001417ee, 0x03d69b4a, 0x02f1c49c, 0x028c948d, 0x01254935, 0x036723a5, 0x000c121b}}, Y: Field{[10]uint32{0x02444c76, 0x00fb2eb0, 0x01ab6574, 0x01b66812, 0x01fd6acc, 0x011c292e, 0x02a63695, 0x03270217, 0x014d279e, 0x000e3293}}}, + {X: Field{[10]uint32{0x01e6932a, 0x0096f236, 0x0197090f, 0x024e6a27, 0x02d6accd, 0x03b0a809, 0x0367174d, 0x03475603, 0x029495ea, 0x0006e0fb}}, Y: Field{[10]uint32{0x02e20196, 0x0212f075, 0x03e0e345, 0x00d270ac, 0x033d2630, 0x00b9f43a, 0x0373d6da, 0x01214786, 0x0048fb5e, 0x000065b5}}}, + {X: Field{[10]uint32{0x03517396, 0x003c432d, 0x0264f2e3, 0x00c8053b, 0x01328b61, 0x03055e76, 0x02766715, 0x016844be, 0x002eedfa, 0x0013aa77}}, Y: Field{[10]uint32{0x006e50c2, 0x023c3d6c, 0x02c9c21e, 0x036741b2, 0x00d4a192, 0x00066d07, 0x003f0b14, 0x00f8a562, 0x03c96ef8, 0x001d053b}}}, + {X: Field{[10]uint32{0x02b033da, 0x025ff34b, 0x01b311a0, 0x024b572e, 0x02876777, 0x02d95d0d, 0x03217aa3, 0x02b4220e, 0x019dbee9, 0x001059b0}}, Y: Field{[10]uint32{0x02ed541c, 0x008dbadf, 0x001f8abc, 0x00ff4e36, 0x02b80e11, 0x02cdd6b1, 0x02b4d29a, 0x01aa9a4c, 0x025c5fae, 0x0018b141}}}, + {X: Field{[10]uint32{0x01a74899, 0x02ef82a1, 0x03f310a2, 0x021abe38, 0x02bbbc66, 0x034f4be5, 0x00511a87, 0x03d529a7, 0x03ebb112, 0x002c5d59}}, Y: Field{[10]uint32{0x009f52c2, 0x03f5cb53, 0x00bb1bdb, 0x008719c7, 0x03a69367, 0x02e24db7, 0x03fc6934, 0x02f952b8, 0x03413788, 0x003d99d8}}}, + {X: Field{[10]uint32{0x028095a5, 0x00ae2a6f, 0x0210212c, 0x02141408, 0x01a6df06, 0x00d44c4c, 0x01d81fdf, 0x01fcd022, 0x01152ab9, 0x00334ad9}}, Y: Field{[10]uint32{0x038f6a53, 0x024b8c79, 0x00bb45f4, 0x0212e1c0, 0x0322afff, 0x03513408, 0x02e40c72, 0x0064d457, 0x012f9ca4, 0x0033f9e5}}}, + {X: Field{[10]uint32{0x0218229f, 0x00c825cd, 0x0374a447, 0x01e4ebab, 0x032086c9, 0x001eb031, 0x0241a729, 0x0050280c, 0x03c49f33, 0x000dd580}}, Y: Field{[10]uint32{0x0385e837, 0x0058defa, 0x00699668, 0x004e1120, 0x03de08ba, 0x00025d76, 0x01ddb463, 0x029dcf84, 0x00f66322, 0x001eedd0}}}, + {X: Field{[10]uint32{0x03bb7432, 0x03c80bbb, 0x01632978, 0x0174b800, 0x017e1095, 0x00d0777a, 0x003c176f, 0x00f765b6, 0x03d4390a, 0x00040819}}, Y: Field{[10]uint32{0x039ba83e, 0x02068be0, 0x0322dafa, 0x03bdf9c1, 0x021d8b7e, 0x01aea77d, 0x0019f11b, 0x03330e9c, 0x03d54d28, 0x001f3db3}}}, + {X: Field{[10]uint32{0x0263081d, 0x01d89737, 0x01d544fb, 0x00bfa30b, 0x01374ef4, 0x022d23eb, 0x003042cf, 0x0314ee9c, 0x0273e3fb, 0x0011d85f}}, Y: Field{[10]uint32{0x01d439e8, 0x020bce70, 0x022a0e47, 0x019e1f0f, 0x0350cbae, 0x010f2abf, 0x0040f07f, 0x02a56ecb, 0x00230c92, 0x0007e93d}}}, + {X: Field{[10]uint32{0x03880f84, 0x0045d383, 0x034ca82e, 0x02f4c635, 0x0046b814, 0x038a2818, 0x017aac08, 0x01418a7d, 0x03af57f7, 0x000b10c6}}, Y: Field{[10]uint32{0x0209de50, 0x039631bc, 0x03adbb8e, 0x014ab162, 0x0262755a, 0x0214fd07, 0x00041089, 0x012ccb04, 0x03bc6857, 0x00376e79}}}, + {X: Field{[10]uint32{0x0343d599, 0x015c3760, 0x00b41338, 0x012c35dd, 0x033f4df4, 0x026dc22a, 0x0386b1f7, 0x02db9066, 0x02438143, 0x0024658d}}, Y: Field{[10]uint32{0x02312f0d, 0x008aa2dd, 0x00049696, 0x00d243d1, 0x00021be3, 0x01ae1eef, 0x0391d682, 0x02834a7e, 0x02177171, 0x00240d3b}}}, + {X: Field{[10]uint32{0x00b7754e, 0x013dfdf1, 0x02ddda4a, 0x0164ac05, 0x02028718, 0x015a0ec1, 0x00d42db9, 0x01b1ee0e, 0x0201af65, 0x002fca30}}, Y: Field{[10]uint32{0x0345d109, 0x02db7ce8, 0x00e20c50, 0x016ab0c8, 0x01ce6ffb, 0x01aac1a0, 0x0266c2f4, 0x00434aa2, 0x0304dda5, 0x0002ef53}}}, + {X: Field{[10]uint32{0x0118b137, 0x02d3cd65, 0x035a1bab, 0x00b296ba, 0x031aa426, 0x01663902, 0x01d531bf, 0x0097d138, 0x03860218, 0x003f2b1c}}, Y: Field{[10]uint32{0x02e67b64, 0x03fda154, 0x005936ff, 0x03fa1f9f, 0x037dcca7, 0x02e8dfbb, 0x032d1e41, 0x02fa87cf, 0x037a957b, 0x000ec65a}}}, + {X: Field{[10]uint32{0x026e9331, 0x0270775c, 0x01982302, 0x0326d1fb, 0x018ad89c, 0x0119fe02, 0x01f0278e, 0x03864850, 0x01dfcaae, 0x00273fa8}}, Y: Field{[10]uint32{0x00db211d, 0x00051ac6, 0x01f470b1, 0x03056dd7, 0x0096a071, 0x01421b8c, 0x010b6469, 0x03b8163f, 0x024e7f30, 0x001cb607}}}, + {X: Field{[10]uint32{0x021334da, 0x019bcd1a, 0x00e201e9, 0x014666e6, 0x00455c51, 0x00a00b0c, 0x01c7f21f, 0x014f1e59, 0x03421235, 0x0015234f}}, Y: Field{[10]uint32{0x016418ae, 0x025283a5, 0x0278a426, 0x02c40c44, 0x0208c0af, 0x016e51a1, 0x0138eeb1, 0x000f4a25, 0x0225cebb, 0x000184ba}}}, + {X: Field{[10]uint32{0x00295bc0, 0x022f759d, 0x01e22a6c, 0x015b18a3, 0x02ebd467, 0x02312643, 0x035c545e, 0x01309826, 0x019accf8, 0x00396f98}}, Y: Field{[10]uint32{0x01b08bf3, 0x00b8a81c, 0x01837a74, 0x033e6cd8, 0x0189e246, 0x02a162e4, 0x003aa74f, 0x006bdeb6, 0x00a57d84, 0x00190219}}}, + {X: Field{[10]uint32{0x01ac668f, 0x013a6ba8, 0x02209e19, 0x0037dcd3, 0x03a26046, 0x008da323, 0x028f733d, 0x03b52bba, 0x033e3400, 0x002d5824}}, Y: Field{[10]uint32{0x005f9da3, 0x0303008b, 0x028861b1, 0x03d378a6, 0x00ac0975, 0x033c5eef, 0x02ab1826, 0x01e14e7f, 0x013d3133, 0x00150e3e}}}, + {X: Field{[10]uint32{0x00cf60b1, 0x014aa887, 0x013c02c6, 0x025a30c5, 0x01dedf2d, 0x01d10cff, 0x03ecf7dd, 0x00f9e41d, 0x0297baca, 0x00087766}}, Y: Field{[10]uint32{0x0284797e, 0x001f3409, 0x038d917c, 0x0334d3d2, 0x01b851c4, 0x03683032, 0x019bbd7c, 0x02c2deda, 0x00e0e048, 0x00379b98}}}, + {X: Field{[10]uint32{0x01934bbd, 0x03ca403f, 0x03f37bca, 0x01d12327, 0x012f1478, 0x026f68c0, 0x01b0a52f, 0x010e6d32, 0x020c6d39, 0x00173e95}}, Y: Field{[10]uint32{0x01b11b06, 0x03feae69, 0x01a3235a, 0x034cfc37, 0x0129d5a5, 0x03a4dbca, 0x0156998c, 0x02566fcd, 0x02630cc1, 0x0031e49e}}}, + {X: Field{[10]uint32{0x026d4fc6, 0x00712da1, 0x02f49046, 0x039ed240, 0x016377af, 0x0253f325, 0x036204b3, 0x03350540, 0x01bb05ad, 0x00128ee5}}, Y: Field{[10]uint32{0x00e84f2f, 0x03402bea, 0x000232a0, 0x01ef7dc2, 0x018d6be4, 0x036e4e1f, 0x009179a4, 0x00793302, 0x02e2f1bd, 0x0035678f}}}, + {X: Field{[10]uint32{0x01f4671f, 0x012dd94d, 0x03d4a81c, 0x002b736c, 0x03404edb, 0x03741bc5, 0x0006b7ba, 0x01a7244f, 0x03130b4c, 0x00331268}}, Y: Field{[10]uint32{0x007bc278, 0x015ea25a, 0x011b24dd, 0x0054b1ea, 0x02ba4837, 0x034dd564, 0x036c1943, 0x01497abc, 0x02ecc35e, 0x0012f5c8}}}, + {X: Field{[10]uint32{0x00146d98, 0x00993335, 0x03d3740b, 0x0300637c, 0x00e07fda, 0x0362d3b8, 0x00f4f900, 0x029a7673, 0x005a7426, 0x00275d42}}, Y: Field{[10]uint32{0x00c4b0a9, 0x01b8f08b, 0x01ae6a4f, 0x03a4fe50, 0x01ce174a, 0x0392519f, 0x0372f44d, 0x02ccb411, 0x0253de04, 0x00016644}}}, + {X: Field{[10]uint32{0x03210fb8, 0x02c341a0, 0x00d18b95, 0x003beb48, 0x02caa87c, 0x027c7864, 0x0312cf5d, 0x036b74ba, 0x00df737b, 0x0037f419}}, Y: Field{[10]uint32{0x0103805a, 0x0206e4a4, 0x0122613d, 0x0264fab8, 0x019f3172, 0x02404bf5, 0x00b1d2b8, 0x0234cc14, 0x003da5bf, 0x001467e2}}}, + {X: Field{[10]uint32{0x007eaf9a, 0x006040a0, 0x012e3bf6, 0x0209a170, 0x001cf205, 0x0198c62f, 0x009013ea, 0x01b0d758, 0x035cd235, 0x000ad428}}, Y: Field{[10]uint32{0x01c76335, 0x012aeac7, 0x000f6ce7, 0x00790d4e, 0x02fdf424, 0x026d60a7, 0x01f5a77d, 0x03bbfae0, 0x011d303a, 0x0001f42d}}}, + {X: Field{[10]uint32{0x005abbc7, 0x0207ea1a, 0x030c3704, 0x03ccc09f, 0x020f3202, 0x01673517, 0x02e2a594, 0x01d79f1d, 0x034b2cf1, 0x00389ba3}}, Y: Field{[10]uint32{0x02c2013a, 0x03dcbf0e, 0x02c0f194, 0x0389183a, 0x01716e5f, 0x025f0d37, 0x00767029, 0x0145854c, 0x03baaa0d, 0x001320b9}}}, + {X: Field{[10]uint32{0x010f87fb, 0x034d20d7, 0x00959b46, 0x0147e097, 0x031fd90e, 0x039e3701, 0x0184057c, 0x03615da9, 0x037d54f4, 0x001640f6}}, Y: Field{[10]uint32{0x029e99c8, 0x00200447, 0x020f3816, 0x01028637, 0x03febf94, 0x034635bd, 0x00003329, 0x0046791f, 0x03d3e9ce, 0x0031578b}}}, + {X: Field{[10]uint32{0x0125e9c1, 0x0254f513, 0x00204fde, 0x03b8a2e6, 0x021040e6, 0x00d4906d, 0x03881e96, 0x02a0b722, 0x02cd0342, 0x0012eec3}}, Y: Field{[10]uint32{0x00b0ef04, 0x006a320b, 0x02335821, 0x03a6d134, 0x00082e97, 0x0013a1e1, 0x02bee8d6, 0x0116dd4a, 0x00900f34, 0x00004bac}}}, + {X: Field{[10]uint32{0x03c4e8d2, 0x01543e52, 0x0175b647, 0x01f506e5, 0x02702996, 0x034c9e78, 0x026eb38f, 0x02fe5f1b, 0x015aae87, 0x00012891}}, Y: Field{[10]uint32{0x03936074, 0x0255541c, 0x01c474a5, 0x008be718, 0x0309af34, 0x009d85e3, 0x012bea1e, 0x02fb98b5, 0x02c4ffe3, 0x00168d02}}}, + {X: Field{[10]uint32{0x03477623, 0x032be1d4, 0x004ad1de, 0x02f77389, 0x0394470a, 0x001ed4c3, 0x00329c4c, 0x0066a953, 0x028dc8ca, 0x003c21b5}}, Y: Field{[10]uint32{0x00bdbd08, 0x00c25c6d, 0x03d8020d, 0x028a022b, 0x034d9e8b, 0x03121a6a, 0x03e4161c, 0x01abc596, 0x01d384a1, 0x00244712}}}, + {X: Field{[10]uint32{0x03ba856c, 0x027e486d, 0x00cb4c98, 0x03dca5e2, 0x01d4b7cd, 0x00257c6d, 0x0253f912, 0x01b13892, 0x037e83b7, 0x0013c6c5}}, Y: Field{[10]uint32{0x0180eaf2, 0x0111c15f, 0x03811e10, 0x01a43702, 0x0399debb, 0x02ee54d2, 0x03dc2ff5, 0x02426bf0, 0x004eb060, 0x002955a3}}}, + {X: Field{[10]uint32{0x03db5823, 0x00d0c0e5, 0x0154c765, 0x039fe99e, 0x01c4fb5a, 0x02211de3, 0x012fcbc0, 0x0391688f, 0x009929a7, 0x003aea1e}}, Y: Field{[10]uint32{0x01cbf68f, 0x00085e8b, 0x02afee73, 0x02985c92, 0x02801b26, 0x03c0ebe7, 0x03c46b47, 0x00245c27, 0x0329b357, 0x0039be31}}}, + {X: Field{[10]uint32{0x002282c2, 0x008ed8ea, 0x02e7d877, 0x00e62731, 0x03130ee5, 0x01111567, 0x01580844, 0x02969e4b, 0x031334c9, 0x0037c45e}}, Y: Field{[10]uint32{0x016f7120, 0x03959054, 0x035a8c9b, 0x0175388c, 0x001a2fc5, 0x02954447, 0x02c5492e, 0x00f144ab, 0x02578eea, 0x003761f2}}}, + {X: Field{[10]uint32{0x02ee82c5, 0x00c871b9, 0x01a68621, 0x0392ea80, 0x021f5768, 0x03d7da81, 0x02eaa1bd, 0x02ae200d, 0x003b3e68, 0x0035dd55}}, Y: Field{[10]uint32{0x0081436e, 0x00ea7b86, 0x02e18049, 0x01184141, 0x0027a2bf, 0x01065fe7, 0x02e7a26c, 0x01ce60f3, 0x030547c9, 0x001c0886}}}, + {X: Field{[10]uint32{0x0178515d, 0x00bfafd1, 0x024c7148, 0x01fff7c1, 0x025e006f, 0x02335632, 0x005c6116, 0x006b96af, 0x01d55a23, 0x0029fc43}}, Y: Field{[10]uint32{0x003c13b0, 0x025ea79c, 0x0031eb47, 0x03c835a7, 0x01b2c24a, 0x007664e6, 0x025eb38d, 0x025a5388, 0x03a7b66b, 0x00124a8c}}}, + {X: Field{[10]uint32{0x020120ec, 0x00dba718, 0x0205b05d, 0x02ce04b6, 0x020801c6, 0x01add211, 0x0336c86c, 0x02af6444, 0x01ef3119, 0x0031e551}}, Y: Field{[10]uint32{0x03c28718, 0x00813774, 0x00382bd7, 0x0313c485, 0x00738a33, 0x01f7a81b, 0x0073f8ef, 0x03ab9145, 0x00db95b6, 0x0009323f}}}, + {X: Field{[10]uint32{0x02c2cb11, 0x020f8314, 0x006ec8e7, 0x0359a888, 0x03afa14d, 0x03884128, 0x0043ba29, 0x02223d7e, 0x035e744f, 0x000262ea}}, Y: Field{[10]uint32{0x00b94df6, 0x030c34af, 0x03cbe0b2, 0x03518dab, 0x02a7abae, 0x0051af35, 0x01d929b8, 0x01fb6314, 0x019fe5e8, 0x0020ed5a}}}, + {X: Field{[10]uint32{0x00ac586e, 0x01d4bbf7, 0x00110547, 0x0212b099, 0x0160d84a, 0x00e77ffd, 0x0213053d, 0x02912b20, 0x00287b6f, 0x001b738a}}, Y: Field{[10]uint32{0x0237ed66, 0x03f18a78, 0x00a5cadc, 0x02654d5e, 0x00c79be3, 0x00197469, 0x032fa8dd, 0x0033116a, 0x022ab9d6, 0x000787ad}}}, + {X: Field{[10]uint32{0x023dfa83, 0x02c2b398, 0x030c1b7f, 0x037423db, 0x03db06a9, 0x02c92b63, 0x02b091b5, 0x01cf24c1, 0x0259287a, 0x00038e1a}}, Y: Field{[10]uint32{0x005b34e6, 0x02582a74, 0x00ed6852, 0x008508a1, 0x01c0d3b2, 0x0385bf35, 0x024ce899, 0x01929798, 0x03da663b, 0x00129f9c}}}, + {X: Field{[10]uint32{0x024fe4d5, 0x03aa89fa, 0x0118004b, 0x0060989b, 0x00cea0a3, 0x02e550eb, 0x00283fc9, 0x02f8c663, 0x0382e62f, 0x0023f7fd}}, Y: Field{[10]uint32{0x00086675, 0x008b4aab, 0x00708c52, 0x007d0c5f, 0x03a4f530, 0x0041fa21, 0x03ed6508, 0x03656d9c, 0x00719fe0, 0x003fbe3d}}}, + {X: Field{[10]uint32{0x012eaa37, 0x0381108a, 0x01089a10, 0x0310d722, 0x0136ed1c, 0x03a9593a, 0x03bb8b84, 0x02c52006, 0x03ae7842, 0x00132424}}, Y: Field{[10]uint32{0x025298dd, 0x02542829, 0x03426ea2, 0x00afe169, 0x03864236, 0x03a4d5bd, 0x02c0903f, 0x0117eb96, 0x033493d2, 0x000b5a0c}}}, + {X: Field{[10]uint32{0x03103a1b, 0x01b56e8c, 0x00f2fe86, 0x031bf5db, 0x01056318, 0x0381ca8d, 0x02b80f9b, 0x014aa764, 0x00c55c5c, 0x0033018d}}, Y: Field{[10]uint32{0x007f0b32, 0x03c2c234, 0x01e887e8, 0x01dc6da6, 0x004004aa, 0x01ff2180, 0x0236eb08, 0x02da79b4, 0x0141b13c, 0x001d42df}}}, + {X: Field{[10]uint32{0x03918255, 0x01bdc78e, 0x026569a5, 0x03b33fdd, 0x011d53c7, 0x033292b6, 0x0133f5f9, 0x01eb162f, 0x027341fa, 0x0025d269}}, Y: Field{[10]uint32{0x00916068, 0x01b3b61a, 0x00d870ec, 0x01a73e96, 0x025e68fd, 0x038df676, 0x012a2aaf, 0x031f59da, 0x01c1009d, 0x002da17c}}}, + {X: Field{[10]uint32{0x017d8e75, 0x00dded1a, 0x011bc9e0, 0x014dcaf6, 0x03a25bd2, 0x01f682c6, 0x0257fdcb, 0x018bc816, 0x00efb578, 0x002c12af}}, Y: Field{[10]uint32{0x01e168f6, 0x01405286, 0x03d4278b, 0x02bf6a39, 0x0262dcb8, 0x0362e6ef, 0x01b58690, 0x012f8d22, 0x026466ad, 0x001411e6}}}, + {X: Field{[10]uint32{0x01c78902, 0x0093a151, 0x01768226, 0x02df2012, 0x02295059, 0x0217c035, 0x023b3957, 0x03efb7c6, 0x01e85481, 0x003447df}}, Y: Field{[10]uint32{0x035c3416, 0x00cd961b, 0x039c3173, 0x032d1200, 0x02b48928, 0x00499a60, 0x03369d81, 0x004a4069, 0x0368be0c, 0x0007458c}}}, + {X: Field{[10]uint32{0x0356fd4b, 0x02e202d5, 0x02b90970, 0x0182ca6c, 0x02fd6151, 0x00ed8f2c, 0x03225af7, 0x031e9024, 0x01f465c4, 0x00288719}}, Y: Field{[10]uint32{0x0345ecfe, 0x01aa8c24, 0x0186c766, 0x03897de9, 0x0157f1e3, 0x001228a5, 0x01e34767, 0x039839f7, 0x0389394d, 0x001a689a}}}, + {X: Field{[10]uint32{0x02497a1f, 0x03bfb85a, 0x036a4fde, 0x022c61b1, 0x0036ccda, 0x029633b4, 0x003d3999, 0x00d83a49, 0x02fbb080, 0x0014f189}}, Y: Field{[10]uint32{0x002ac9b7, 0x01f86ddd, 0x036bbeda, 0x01eb1011, 0x0008264d, 0x00cd85aa, 0x01106fb9, 0x03fc7946, 0x000862a7, 0x002b6498}}}, + {X: Field{[10]uint32{0x00e6ff0e, 0x005b139d, 0x02870601, 0x00cc46dc, 0x0211d969, 0x01d07c42, 0x0364fcc8, 0x00eb6340, 0x01871b2a, 0x0033d9ed}}, Y: Field{[10]uint32{0x02b68422, 0x01b4a748, 0x03cae6d3, 0x01fc966a, 0x027be653, 0x033878c2, 0x00ac068c, 0x035d3bda, 0x037c10cc, 0x000b258e}}}, + {X: Field{[10]uint32{0x010b4bc7, 0x0335a9b2, 0x018d731e, 0x00a77a7d, 0x01364288, 0x00d33783, 0x01a89a4b, 0x021c00a7, 0x02d808cc, 0x00014085}}, Y: Field{[10]uint32{0x01e38b21, 0x0367e9d2, 0x01e0c123, 0x01f99549, 0x0236f65d, 0x02944b56, 0x02fce322, 0x01224637, 0x01f096bc, 0x00248307}}}, + {X: Field{[10]uint32{0x03d1aef3, 0x019b0f64, 0x001a2677, 0x02f789bb, 0x033d6000, 0x03de42bf, 0x00cc62da, 0x01beedec, 0x0194f468, 0x00076115}}, Y: Field{[10]uint32{0x0134d260, 0x0027e7cc, 0x0173425c, 0x00db35aa, 0x0092450b, 0x0211f71b, 0x01340351, 0x03680bbc, 0x03a6bd9d, 0x003ab846}}}, + {X: Field{[10]uint32{0x024785e1, 0x014aede7, 0x030c3d5c, 0x0295bdf9, 0x012e7750, 0x01678aad, 0x027d5908, 0x02e5f41d, 0x0350b6c5, 0x00046b53}}, Y: Field{[10]uint32{0x00023b94, 0x018f6d6a, 0x027ac4e2, 0x011befdf, 0x011826e8, 0x00533e9c, 0x0152496f, 0x03671408, 0x02368725, 0x000b0aee}}}, + {X: Field{[10]uint32{0x0149388c, 0x0090ac2f, 0x02e3d12b, 0x00965a75, 0x03f76ee4, 0x01820a87, 0x024a5198, 0x01cf84a6, 0x027cd723, 0x000d5a34}}, Y: Field{[10]uint32{0x0354fdb3, 0x031db561, 0x033daf04, 0x02360e73, 0x038eff10, 0x0042a395, 0x02356680, 0x01011c5b, 0x03a96d09, 0x00038db7}}}, + {X: Field{[10]uint32{0x017801d7, 0x028b05fc, 0x038abafa, 0x01caf702, 0x0246310f, 0x01c01dd0, 0x02abb919, 0x02743174, 0x033545e0, 0x000ddcaa}}, Y: Field{[10]uint32{0x0278884e, 0x01001082, 0x03260053, 0x02be3b6d, 0x00775693, 0x022c04b8, 0x03a50cda, 0x031d18b5, 0x028ceae0, 0x000948a6}}}, + {X: Field{[10]uint32{0x029274f2, 0x00153970, 0x0131fa13, 0x026747b8, 0x0244f3b2, 0x022e4eb4, 0x0224779c, 0x01c06b91, 0x024f72c4, 0x0020546c}}, Y: Field{[10]uint32{0x00bb6429, 0x035544ae, 0x00c9986e, 0x009134b9, 0x03734207, 0x0030a35d, 0x033fca05, 0x03586779, 0x030725ff, 0x001624e0}}}, + {X: Field{[10]uint32{0x01539c9a, 0x00d25197, 0x034c8692, 0x0076489f, 0x001b57a8, 0x0394dc20, 0x00597050, 0x007e3183, 0x015ad410, 0x0011a921}}, Y: Field{[10]uint32{0x01e36b59, 0x034f9a22, 0x00864bee, 0x00917faa, 0x039517ad, 0x038bc82e, 0x00117ae0, 0x01c6578b, 0x01cf2111, 0x0023e99b}}}, + {X: Field{[10]uint32{0x01803d16, 0x0224f185, 0x02d4f0fd, 0x017d3b38, 0x00efa7c4, 0x00e2f4a9, 0x0015001c, 0x013cf7bb, 0x01543e65, 0x0002e06f}}, Y: Field{[10]uint32{0x029d3e75, 0x00ae8053, 0x00c4a75d, 0x03f96a25, 0x032b3947, 0x03e4eda8, 0x00316228, 0x0269d8d1, 0x03aa3129, 0x000570fd}}}, + {X: Field{[10]uint32{0x012e7706, 0x03572b40, 0x01faba5c, 0x03c933f2, 0x01423f10, 0x01356200, 0x038c0549, 0x00c93491, 0x021cf2a0, 0x000f85a6}}, Y: Field{[10]uint32{0x01389135, 0x008d5886, 0x020f9869, 0x012ff2a4, 0x03004d45, 0x01c02d2f, 0x0069075a, 0x02b1f14d, 0x03ddd814, 0x00081016}}}, + {X: Field{[10]uint32{0x01a65956, 0x02f74b53, 0x02fdf534, 0x02e1510f, 0x03557f39, 0x0379866f, 0x027a1b8c, 0x02ccfc3d, 0x024ab161, 0x001d0a0f}}, Y: Field{[10]uint32{0x00b3df3a, 0x038da274, 0x03159bfe, 0x005c71de, 0x01380c17, 0x02205d13, 0x033ad2bc, 0x0170119d, 0x03e28978, 0x00088a5a}}}, + {X: Field{[10]uint32{0x026b756e, 0x00f68e7a, 0x00092bde, 0x02d37a0a, 0x021a617f, 0x02de5539, 0x01da0a23, 0x02f27ed9, 0x0386cb76, 0x00189c55}}, Y: Field{[10]uint32{0x02c2db32, 0x017f6414, 0x0317d34a, 0x01608787, 0x00eec54d, 0x03e65444, 0x0163337b, 0x028540ed, 0x03e38829, 0x000f09ee}}}, + {X: Field{[10]uint32{0x037c8aae, 0x0168001b, 0x01f739c5, 0x038b28d7, 0x002c93ae, 0x015659d0, 0x0336bc9d, 0x02e24e10, 0x0105db23, 0x00258800}}, Y: Field{[10]uint32{0x00a6ba26, 0x037e85e1, 0x03b19a2b, 0x03638ff4, 0x01ea41cd, 0x026197d2, 0x00307c5d, 0x00981320, 0x028d400a, 0x000c64a5}}}, + {X: Field{[10]uint32{0x031d13fb, 0x0365a5ad, 0x01c313aa, 0x00d5506d, 0x01317875, 0x02fe2cb1, 0x0052fb5c, 0x0246c233, 0x0398bd26, 0x002f51dd}}, Y: Field{[10]uint32{0x03ddfc3b, 0x01f8502a, 0x0150b6be, 0x00e5299b, 0x0351978b, 0x03139eca, 0x01dae500, 0x0000cf08, 0x01c9a4ab, 0x002f8ad4}}}, + {X: Field{[10]uint32{0x035289e7, 0x0270c151, 0x02b05903, 0x006bd4b6, 0x0070da10, 0x02ab19e2, 0x01490e83, 0x03e126ed, 0x0388e46f, 0x003e8524}}, Y: Field{[10]uint32{0x0067b2a7, 0x0080c2e2, 0x015e37f2, 0x03470613, 0x02c75af3, 0x03349a87, 0x032080ad, 0x0159d0ec, 0x037fa8d8, 0x00211555}}}, + {X: Field{[10]uint32{0x0391ba90, 0x00dab80c, 0x00e86ff4, 0x00f11c80, 0x028ab50d, 0x01e069c2, 0x03bfae73, 0x03fec752, 0x03830af1, 0x00108a36}}, Y: Field{[10]uint32{0x03a270a7, 0x01c7632d, 0x01637d40, 0x03252d2b, 0x032413dd, 0x0066f4b8, 0x01560b64, 0x03c28600, 0x010ab0e6, 0x001176c7}}}, + {X: Field{[10]uint32{0x0017c85c, 0x0187fcc2, 0x03d49f41, 0x026bf28a, 0x021dc3a3, 0x02da71a1, 0x0094c02e, 0x03d680f5, 0x0279fe0d, 0x002a5eac}}, Y: Field{[10]uint32{0x019bec7d, 0x00d72371, 0x022900e5, 0x0105ac72, 0x005d4b74, 0x0335b7bb, 0x032f99f7, 0x03785cf5, 0x00bff128, 0x001401b2}}}, + {X: Field{[10]uint32{0x004c668f, 0x011199a4, 0x02b63f8d, 0x011544d7, 0x039f27dc, 0x0067ee8d, 0x01a3a1cc, 0x03198538, 0x00576bdc, 0x0030351b}}, Y: Field{[10]uint32{0x03215f58, 0x0024db72, 0x03a71f19, 0x00bd1fff, 0x013d1917, 0x024f1d82, 0x017d7ccf, 0x02c940b2, 0x00a30b28, 0x000e5ad8}}}, + {X: Field{[10]uint32{0x01a8dbbd, 0x00cd8fec, 0x00e636de, 0x031b86e2, 0x020b7ae4, 0x01716f28, 0x01b8c2c2, 0x03e9f782, 0x03e04599, 0x001cf175}}, Y: Field{[10]uint32{0x007bc617, 0x005f689d, 0x01ea3faf, 0x037dbea3, 0x0309229a, 0x0310c759, 0x02986b00, 0x03590827, 0x008d558b, 0x000767b4}}}, + {X: Field{[10]uint32{0x024827a7, 0x00f227b8, 0x03ab7bbf, 0x01958ab4, 0x00b4788c, 0x006805d4, 0x0097c6ef, 0x01210e36, 0x001da2ef, 0x0000dc12}}, Y: Field{[10]uint32{0x020fa7b1, 0x0390d71d, 0x02aaa190, 0x02d14e16, 0x01ccf794, 0x00003c3c, 0x004acc33, 0x00640476, 0x0076c205, 0x002a22ce}}}, + {X: Field{[10]uint32{0x037807ec, 0x02206758, 0x01d54eda, 0x02fd926e, 0x02f2b68c, 0x00d1e42f, 0x01bb7d8d, 0x03c29267, 0x03033006, 0x000b72f8}}, Y: Field{[10]uint32{0x0290c1e1, 0x03d63dc6, 0x01bda5d6, 0x00f5613e, 0x02092cf4, 0x00fe8a35, 0x015de2df, 0x00ca7ae4, 0x02e3c7ab, 0x002e0ad1}}}, + {X: Field{[10]uint32{0x017bb4b7, 0x0110bd80, 0x023c908a, 0x0193e3d0, 0x0144052b, 0x0093de96, 0x035d957c, 0x01171778, 0x00a916db, 0x003d17cf}}, Y: Field{[10]uint32{0x029b5a96, 0x01a39808, 0x03fc1dad, 0x03de042e, 0x015b4a0f, 0x03193798, 0x01d6a795, 0x0135b368, 0x002fb315, 0x001e777c}}}, + {X: Field{[10]uint32{0x0387605e, 0x01fa5779, 0x02e934fe, 0x01af8ea6, 0x03ee1734, 0x01200954, 0x01c99bcc, 0x0159e919, 0x028bcad0, 0x0014032a}}, Y: Field{[10]uint32{0x0238370a, 0x01c318bc, 0x02a58f05, 0x0291fe08, 0x024e1bee, 0x00f77495, 0x019dccf7, 0x03235ab8, 0x02d075df, 0x0010211f}}}, + {X: Field{[10]uint32{0x024c3aff, 0x017bb135, 0x01557c52, 0x021dbea1, 0x037bcd8b, 0x008ee24e, 0x0346191e, 0x018b156d, 0x0186a239, 0x000c158a}}, Y: Field{[10]uint32{0x00577a53, 0x00dd41e0, 0x01fe9373, 0x02622975, 0x00e19d8d, 0x02ed5519, 0x020c0347, 0x014e0c6d, 0x02be41c4, 0x00000b56}}}, + {X: Field{[10]uint32{0x008e422e, 0x006383ad, 0x0078f63a, 0x00ada8c1, 0x01ec7238, 0x03879881, 0x013f690b, 0x01adca7b, 0x011a3252, 0x003da1f5}}, Y: Field{[10]uint32{0x01515704, 0x0384aadf, 0x01680211, 0x033a830b, 0x00f197e2, 0x00dac56f, 0x014da2ed, 0x013debf1, 0x033519c9, 0x003bf386}}}, + {X: Field{[10]uint32{0x01ca505d, 0x022133e8, 0x01018472, 0x029f7a99, 0x0322199e, 0x0002b9fa, 0x00e207e5, 0x00d47327, 0x03f0d385, 0x00041298}}, Y: Field{[10]uint32{0x00239cc5, 0x02b12a0c, 0x0267ce05, 0x03a4cf4b, 0x00a6de0b, 0x028a8bb7, 0x031600a0, 0x002cf16b, 0x008750b2, 0x001a7086}}}, + {X: Field{[10]uint32{0x0280fc6e, 0x02b268fa, 0x01c035e6, 0x02f50c0a, 0x02eb3d59, 0x03d34a56, 0x03963e2f, 0x023286af, 0x00994b7b, 0x00142598}}, Y: Field{[10]uint32{0x027287b1, 0x018eb7cc, 0x02519729, 0x029ef22b, 0x0256be56, 0x0152ba8f, 0x02116748, 0x0066c604, 0x01cd40d0, 0x00352162}}}, + {X: Field{[10]uint32{0x00513c95, 0x033e23d5, 0x02a0dd22, 0x027f4721, 0x007ac22e, 0x02c3cb1f, 0x0388e85e, 0x0384d475, 0x02e794e5, 0x000c41b5}}, Y: Field{[10]uint32{0x03a2bca0, 0x02612f4b, 0x00dfadbf, 0x02320b3a, 0x004ad288, 0x0001ab86, 0x02849d84, 0x02330a64, 0x013c0456, 0x00301796}}}, + {X: Field{[10]uint32{0x0059fdce, 0x0053db88, 0x01235e79, 0x010f79a0, 0x03d1081b, 0x00ee7973, 0x0376ac71, 0x02f73a13, 0x011c9977, 0x0013259f}}, Y: Field{[10]uint32{0x008968cd, 0x02f9457a, 0x010ee206, 0x000a8a3a, 0x00fcc10d, 0x00e971f7, 0x002cb098, 0x026dd057, 0x00b2a3e9, 0x0021991c}}}, + {X: Field{[10]uint32{0x02781a52, 0x03fe440e, 0x032b2e4a, 0x000bfd78, 0x01b4027b, 0x03d63d8b, 0x00bbb7fb, 0x01dd0476, 0x0099ae8d, 0x00258c64}}, Y: Field{[10]uint32{0x03947389, 0x03717d59, 0x00ed422e, 0x0136de1f, 0x03d776eb, 0x02ee8bc2, 0x03148f8d, 0x00a1268e, 0x00740daf, 0x001b0440}}}, + {X: Field{[10]uint32{0x00247ee7, 0x00c3e8d6, 0x028b3bdf, 0x00add65c, 0x02b97224, 0x016bd5bc, 0x017406d9, 0x01b3aa77, 0x032387a3, 0x001f24ee}}, Y: Field{[10]uint32{0x02989942, 0x03136667, 0x00e018f7, 0x03db8f59, 0x0017cb34, 0x02568389, 0x0201e168, 0x01f219b6, 0x02983348, 0x00087937}}}, + {X: Field{[10]uint32{0x03f1e074, 0x02a46541, 0x01cddc3b, 0x02edf1b7, 0x01c764da, 0x021e8c8a, 0x01db1433, 0x005861b6, 0x020388de, 0x00319792}}, Y: Field{[10]uint32{0x03ca658b, 0x01266ef3, 0x0017bdaa, 0x030bf5e1, 0x0202137b, 0x0311707e, 0x0225a457, 0x016ca33a, 0x01430800, 0x003561b4}}}, + {X: Field{[10]uint32{0x00d674d5, 0x0285f619, 0x00f354d9, 0x02c6a042, 0x00381b1f, 0x0076346e, 0x01a380c7, 0x021a4af3, 0x012490c2, 0x0036256a}}, Y: Field{[10]uint32{0x03de17f5, 0x013dd61f, 0x0373d980, 0x028ac02b, 0x01c7cf2b, 0x02ef3496, 0x02f5728d, 0x0004fde7, 0x02250a63, 0x0034c2f6}}}, + {X: Field{[10]uint32{0x03def988, 0x03fc7857, 0x0113227b, 0x00e8f1fc, 0x00c892e2, 0x018f47dc, 0x03fa1640, 0x02e6efeb, 0x003a5b36, 0x0024119f}}, Y: Field{[10]uint32{0x029b15a7, 0x0320207a, 0x01568946, 0x01dc78cf, 0x02205225, 0x0288ab5d, 0x03ccb41b, 0x01f66cf3, 0x01914024, 0x0013b1c0}}}, + {X: Field{[10]uint32{0x02294c7e, 0x032b5d0f, 0x019810ab, 0x01756369, 0x03b4d38e, 0x03d4fbf1, 0x03268f78, 0x000969eb, 0x01630d0e, 0x0017340f}}, Y: Field{[10]uint32{0x002dfb3e, 0x002dc3ed, 0x007811a1, 0x010cd376, 0x00f168e0, 0x03938392, 0x01510cfe, 0x035072ac, 0x036e5517, 0x0030dca7}}}, + {X: Field{[10]uint32{0x007e964b, 0x00028943, 0x02988fc7, 0x000be601, 0x008bf69c, 0x03cd88a5, 0x01d7629b, 0x03173a8f, 0x009c652b, 0x00144c31}}, Y: Field{[10]uint32{0x032cf563, 0x0070855b, 0x0336b738, 0x008c6af8, 0x03a027ef, 0x01e910c4, 0x01f98c7b, 0x036f4c26, 0x02194bc9, 0x001f91b8}}}, + {X: Field{[10]uint32{0x02dd34da, 0x011de5a3, 0x01dbcc54, 0x0157969f, 0x02261a31, 0x02e49204, 0x01473066, 0x0353a44e, 0x002a33b8, 0x00256267}}, Y: Field{[10]uint32{0x026b7cb3, 0x03166476, 0x00a41d4d, 0x02d24e82, 0x01bac79f, 0x02f83411, 0x027277b5, 0x000a4a7a, 0x02998424, 0x002259ef}}}, + {X: Field{[10]uint32{0x0089745f, 0x01b903bd, 0x026049dd, 0x00e0b9d7, 0x036e55d2, 0x006137f3, 0x00650c88, 0x03a4fdf1, 0x00138cb3, 0x0000e4a0}}, Y: Field{[10]uint32{0x00006a52, 0x00251c7e, 0x03799587, 0x0011bed0, 0x02056bdf, 0x00bc9556, 0x01bd6d47, 0x03ce8722, 0x0298b897, 0x001c2c97}}}, + {X: Field{[10]uint32{0x0380b451, 0x0223f0cb, 0x03997fa3, 0x0034f3f1, 0x01ba7207, 0x03fc4223, 0x010497cb, 0x02fb7392, 0x0331b5fd, 0x00291f84}}, Y: Field{[10]uint32{0x01576b19, 0x00999baa, 0x024ecec2, 0x01194884, 0x00062447, 0x028f32e7, 0x006c75bd, 0x00119502, 0x00befff0, 0x0032952e}}}, + {X: Field{[10]uint32{0x00cfb96a, 0x002fb478, 0x036c82d5, 0x032ed237, 0x03f1b325, 0x0020f3f4, 0x03bb1344, 0x01d4a0f2, 0x008e16c5, 0x00330698}}, Y: Field{[10]uint32{0x00cc6734, 0x0082a0ce, 0x03ab5551, 0x021ec092, 0x03591b8f, 0x02382484, 0x03b0c987, 0x02c89104, 0x024467d9, 0x0016e2b2}}}, + {X: Field{[10]uint32{0x03fc3cea, 0x003db0b0, 0x0191a5d7, 0x0075a6d6, 0x03b7438d, 0x036cef78, 0x024d1df2, 0x02ebadeb, 0x03c7591e, 0x00360d52}}, Y: Field{[10]uint32{0x02ab5ad3, 0x019bc227, 0x03a31fe2, 0x031ca601, 0x017d95af, 0x01d646fb, 0x00227039, 0x03c0fca5, 0x02936765, 0x003bf225}}}, + {X: Field{[10]uint32{0x01def8aa, 0x038f68a3, 0x01d6ff2a, 0x007138ff, 0x03481ee2, 0x03681d91, 0x02ef42e6, 0x01d02c84, 0x0163ceb2, 0x001ab072}}, Y: Field{[10]uint32{0x01164281, 0x02fcfa39, 0x00d9fb1b, 0x035c2844, 0x00c52140, 0x017c80c7, 0x0053c94f, 0x016b8915, 0x00171b6d, 0x00013f22}}}, + {X: Field{[10]uint32{0x0318b42d, 0x034b91db, 0x035c4ddd, 0x00f42803, 0x0274d4da, 0x01e3ecdb, 0x00474697, 0x010523e7, 0x0359b52e, 0x002f84c3}}, Y: Field{[10]uint32{0x03c47069, 0x0263707e, 0x01516093, 0x02e51912, 0x01c5b9f8, 0x030737d8, 0x02a7d761, 0x02962808, 0x01e2f739, 0x0005b736}}}, + {X: Field{[10]uint32{0x0063bd2f, 0x031e79b0, 0x00f3ffc3, 0x03e47e7d, 0x0124ee71, 0x018996ec, 0x0356e599, 0x012955a2, 0x00cc3986, 0x001a176e}}, Y: Field{[10]uint32{0x02b50f29, 0x02eb9721, 0x03493037, 0x02fe69d7, 0x0122b396, 0x016f8c08, 0x0333b8e0, 0x00bdf0b4, 0x01418e5b, 0x001cc29c}}}, + {X: Field{[10]uint32{0x01d743ae, 0x019bb995, 0x024eaaad, 0x02bf3c3b, 0x030f31f9, 0x026f0626, 0x025e564b, 0x01306838, 0x03f389f7, 0x000e7d07}}, Y: Field{[10]uint32{0x026c8622, 0x03948375, 0x018d88e1, 0x02cbb7e7, 0x0126fdae, 0x00ce3dce, 0x030aad09, 0x013fb94f, 0x036de25d, 0x003efa83}}}, + {X: Field{[10]uint32{0x0020ed1f, 0x02c82313, 0x01f28b12, 0x018b2fd6, 0x03c29b1b, 0x0120ef03, 0x00737b3d, 0x0258e665, 0x017441bc, 0x0035e9a5}}, Y: Field{[10]uint32{0x025ba8cb, 0x0358c6c1, 0x024ceef2, 0x027d07e0, 0x0291eea2, 0x02e68f41, 0x007ca251, 0x00563a70, 0x02dacdf8, 0x00339138}}}, + {X: Field{[10]uint32{0x01eaec9a, 0x010e57b0, 0x030ba491, 0x00717f7c, 0x0022f598, 0x00acde21, 0x02867934, 0x032edcaf, 0x01609139, 0x00216eb4}}, Y: Field{[10]uint32{0x0314dfec, 0x01a92173, 0x038db419, 0x031e10e0, 0x02362055, 0x038ff8fa, 0x01c57e88, 0x01dacac9, 0x006129e5, 0x00267f35}}}, + {X: Field{[10]uint32{0x03ea49e5, 0x007ae008, 0x0372d51a, 0x03f90842, 0x0174d986, 0x03c5f682, 0x002ffbe8, 0x0285648f, 0x02c4d428, 0x0008e02e}}, Y: Field{[10]uint32{0x02d6f54b, 0x02ac1d17, 0x0065e5a6, 0x016f4824, 0x033ca101, 0x013512ee, 0x01e38bfc, 0x031fd791, 0x0313fde4, 0x003d2bdc}}}, + {X: Field{[10]uint32{0x024f9cf2, 0x030a7f4d, 0x00e9e46f, 0x03ee253d, 0x0397c1ac, 0x0088480a, 0x019108df, 0x0077438d, 0x0359b7d6, 0x00301584}}, Y: Field{[10]uint32{0x027d83dd, 0x0004c9f4, 0x0092e029, 0x000f3b3d, 0x0275b161, 0x01433acc, 0x03ea5ff3, 0x02a7d8b3, 0x01801c72, 0x000f0ddf}}}, + {X: Field{[10]uint32{0x020c2a06, 0x010e3124, 0x00fc64ed, 0x00102962, 0x0276481c, 0x026ee96c, 0x01181d30, 0x013cabae, 0x01c10b8f, 0x001cb126}}, Y: Field{[10]uint32{0x02b1ce53, 0x000490ec, 0x01e7a72d, 0x03fecc11, 0x02f05ff8, 0x03e0af06, 0x034867b1, 0x014c50a8, 0x008e6082, 0x001b2653}}}, + {X: Field{[10]uint32{0x03cf477d, 0x0081153f, 0x026f884e, 0x0272d77c, 0x0166e02c, 0x001bfad1, 0x038e2f3f, 0x018827e3, 0x00be02b6, 0x00237a13}}, Y: Field{[10]uint32{0x002a34a6, 0x002e64dd, 0x03379641, 0x010a8067, 0x02ac9e85, 0x028edeb0, 0x0348e986, 0x01f621a4, 0x0280c4d0, 0x0031fcbd}}}, + {X: Field{[10]uint32{0x001710f2, 0x00b44b90, 0x034427d0, 0x03b98f17, 0x029a2d02, 0x021ae74b, 0x02c80488, 0x035d8b96, 0x01d86581, 0x0036ffb2}}, Y: Field{[10]uint32{0x00daafea, 0x0221a370, 0x03c90004, 0x02a26284, 0x01b46496, 0x00199236, 0x005acb59, 0x02c6b2a2, 0x03f9827b, 0x001b9847}}}, + {X: Field{[10]uint32{0x01d0453d, 0x015bc8f4, 0x037f9f24, 0x00a8a455, 0x039588dc, 0x00aab9ac, 0x010ade78, 0x03b746cf, 0x01f86099, 0x00277594}}, Y: Field{[10]uint32{0x02715ebd, 0x0282c17b, 0x018455f5, 0x017e6184, 0x03cd3f90, 0x03edb5dc, 0x00be81ad, 0x02183806, 0x0217f0d7, 0x0013db6d}}}, + {X: Field{[10]uint32{0x03d66a15, 0x00982fe6, 0x033d1926, 0x03cbe8bc, 0x02356445, 0x039823e5, 0x037a885e, 0x0378d79d, 0x021ac869, 0x000bf605}}, Y: Field{[10]uint32{0x01307f25, 0x02d3203f, 0x03daa7c6, 0x028825e1, 0x0398c6e7, 0x00b798d1, 0x00163eb1, 0x00b64ad9, 0x01e9674c, 0x00074b08}}}, + {X: Field{[10]uint32{0x029dc391, 0x03a2a128, 0x038a8495, 0x0197e21d, 0x008b6d87, 0x02503b7d, 0x01538ce4, 0x0016c8fc, 0x038924f5, 0x000fc96f}}, Y: Field{[10]uint32{0x008164f2, 0x011ca5cb, 0x03c30afd, 0x01527715, 0x00344382, 0x00b184ee, 0x02b02525, 0x001e0862, 0x01830e7e, 0x001c094d}}}, + {X: Field{[10]uint32{0x00773f0b, 0x0387b89b, 0x02b47ff2, 0x01c2d57a, 0x00467dc7, 0x021163cc, 0x033d2fe2, 0x008d13e3, 0x0359d5f7, 0x000f03c0}}, Y: Field{[10]uint32{0x02db33c7, 0x00a72a07, 0x02c7b127, 0x00c3917c, 0x00b9c250, 0x01189949, 0x0050d787, 0x0067116b, 0x0239459f, 0x0012560e}}}, + {X: Field{[10]uint32{0x02b73a15, 0x0170c20d, 0x00dd73be, 0x01c3ec5c, 0x0087e38d, 0x0283764f, 0x0045855f, 0x0177c8d8, 0x0266ec1b, 0x00158e01}}, Y: Field{[10]uint32{0x019921a7, 0x0387c29d, 0x03b117bc, 0x024e0a47, 0x00b5cbbf, 0x022be3d8, 0x0291252c, 0x02b1aa6a, 0x00f0b210, 0x001c01a4}}}, + {X: Field{[10]uint32{0x009298bd, 0x01b4bea7, 0x006738bc, 0x0007ef8f, 0x0225f902, 0x03cff11f, 0x02b228aa, 0x017dffb1, 0x010b0b9a, 0x001c729c}}, Y: Field{[10]uint32{0x039abc89, 0x027bf8cb, 0x003f8fcc, 0x028d4789, 0x02c759bc, 0x01c0566b, 0x00912871, 0x002266c6, 0x028dc075, 0x001f7494}}}, + {X: Field{[10]uint32{0x01264575, 0x00b42cd7, 0x01102511, 0x02ba09f2, 0x006ed87f, 0x02386f8f, 0x02ec20f9, 0x021439f0, 0x003cc938, 0x001e377b}}, Y: Field{[10]uint32{0x01680321, 0x01b7b6cf, 0x01ddfd48, 0x018fc5e6, 0x0022b9c1, 0x01bc6798, 0x0185048d, 0x01014321, 0x0151766a, 0x000641ca}}}, + {X: Field{[10]uint32{0x034ed70b, 0x01aacf1e, 0x0267f322, 0x0127b40f, 0x02058132, 0x00f6b0a6, 0x02709509, 0x0215fa31, 0x02fd8852, 0x0026abae}}, Y: Field{[10]uint32{0x0305fffb, 0x033b34d1, 0x0271c7b9, 0x033101ae, 0x032457bd, 0x00f134bc, 0x01e13bca, 0x02f54419, 0x02ccb541, 0x00231a8a}}}, + {X: Field{[10]uint32{0x032f79e2, 0x00af96f6, 0x01bcc6d1, 0x01a882ae, 0x01a3096a, 0x02e6fc4e, 0x016c7b28, 0x0203f768, 0x02749411, 0x00161bb2}}, Y: Field{[10]uint32{0x03488d71, 0x039be4e8, 0x02ad5bfd, 0x03795805, 0x020ac4bf, 0x009a887a, 0x005a7f80, 0x002796bf, 0x01123616, 0x0002cec7}}}, + {X: Field{[10]uint32{0x0150ddf8, 0x00e060e3, 0x0397ee36, 0x02c4dab3, 0x03c0e0b6, 0x0330fb98, 0x03ed7d40, 0x0378b21b, 0x003edbe4, 0x000615ef}}, Y: Field{[10]uint32{0x00275363, 0x0293d923, 0x01835119, 0x02df3168, 0x028a7fbd, 0x016119d6, 0x0359c673, 0x022337b1, 0x007be7a5, 0x003a97a0}}}, + {X: Field{[10]uint32{0x00e5b01a, 0x0361599e, 0x037ba863, 0x02589fd7, 0x03642067, 0x032e204e, 0x022a6cdb, 0x00b18800, 0x03440757, 0x002a9331}}, Y: Field{[10]uint32{0x03a2f836, 0x03c267e3, 0x008bff39, 0x0236bdf8, 0x01a4a97b, 0x00e08698, 0x03b7f9bb, 0x00912a68, 0x02c9d259, 0x002ea5a6}}}, + {X: Field{[10]uint32{0x004f36aa, 0x01368d48, 0x02179e79, 0x01af2c9d, 0x030d6f73, 0x010f6173, 0x005fad0a, 0x010d9da2, 0x00095917, 0x0011623b}}, Y: Field{[10]uint32{0x00c7c62e, 0x021bd2c3, 0x01c3702f, 0x024a9532, 0x03a95116, 0x0372eb8e, 0x01c89d10, 0x02071bb8, 0x027ecdc6, 0x003ee0d7}}}, + {X: Field{[10]uint32{0x0080653c, 0x02cc447a, 0x00a4eca3, 0x00881408, 0x0025ce66, 0x00bdec7f, 0x0233f227, 0x017e1a67, 0x01037a3e, 0x00219eb3}}, Y: Field{[10]uint32{0x01764646, 0x01fceb49, 0x03946d8d, 0x013975b3, 0x02639cd9, 0x03d91903, 0x009ba3cf, 0x03e414c9, 0x02c757d3, 0x003a444a}}}, + {X: Field{[10]uint32{0x02df370b, 0x03f576c9, 0x03c13318, 0x013d185b, 0x00b52781, 0x026b8ef5, 0x02e46630, 0x007708a2, 0x0169e4f8, 0x00178290}}, Y: Field{[10]uint32{0x0140d001, 0x03e2b74c, 0x00ca9e58, 0x009232cd, 0x00c38cd6, 0x02eb2b53, 0x022e32c3, 0x024d3afb, 0x01a8fc23, 0x0016f4cd}}}, + {X: Field{[10]uint32{0x0101c0f6, 0x02d3ffec, 0x00263663, 0x028eb7fa, 0x01542a55, 0x00aa0bc5, 0x01b2e578, 0x0090606d, 0x006939df, 0x0024014d}}, Y: Field{[10]uint32{0x03e3d991, 0x007a944d, 0x01476e3f, 0x01e0e86c, 0x01744607, 0x0270e978, 0x00f38378, 0x0217da16, 0x01899739, 0x0013fc35}}}, + {X: Field{[10]uint32{0x03cec63f, 0x030ec358, 0x035618f4, 0x01dc8a9c, 0x004e2db0, 0x0242c540, 0x0232f33d, 0x00cee81a, 0x01a553df, 0x002a650e}}, Y: Field{[10]uint32{0x01656cd4, 0x0108f6ce, 0x00e7e7e6, 0x0317dc0f, 0x026f9c1f, 0x0139a61f, 0x01cd8a2e, 0x031ddfaa, 0x0129f11f, 0x00066382}}}, + {X: Field{[10]uint32{0x03085282, 0x00bf7c57, 0x00355a0e, 0x02c42de3, 0x031c7789, 0x020aa8b9, 0x03ab71df, 0x02e85323, 0x01361381, 0x00147ca8}}, Y: Field{[10]uint32{0x032d16a2, 0x0065f3fa, 0x00ea5a97, 0x009a124d, 0x026e2b7b, 0x00c65e8f, 0x0323bbe4, 0x03fa935b, 0x029fca15, 0x003f57c4}}}, + {X: Field{[10]uint32{0x02a91d3a, 0x014c560b, 0x0368e820, 0x02e3d507, 0x03bed208, 0x019316d3, 0x01097778, 0x012cb265, 0x001c8b06, 0x000ea47e}}, Y: Field{[10]uint32{0x03a513c9, 0x01ce8048, 0x00404085, 0x0252d804, 0x00a542b5, 0x01616a3a, 0x0077329e, 0x00e78654, 0x003ad4ae, 0x00275640}}}, + {X: Field{[10]uint32{0x0336c5c8, 0x01abc665, 0x03462105, 0x02138502, 0x005e491e, 0x01ca3045, 0x0026deee, 0x03e85cfc, 0x0150aa22, 0x001c7a67}}, Y: Field{[10]uint32{0x036a4995, 0x019fb105, 0x03b2653f, 0x038e6ec2, 0x03699806, 0x03651f9d, 0x02627291, 0x022119f1, 0x03776858, 0x003fcf93}}}, + {X: Field{[10]uint32{0x008aaa39, 0x0248005f, 0x0180e6d3, 0x003ba166, 0x0046f745, 0x0338bcf3, 0x0353286a, 0x0113dcfe, 0x02933a03, 0x002b4527}}, Y: Field{[10]uint32{0x009e81bd, 0x03dbeba4, 0x03e3f2a4, 0x00ffc455, 0x0165a5ab, 0x026a0de2, 0x03140603, 0x03cd52d3, 0x039885a4, 0x001f6fd1}}}, + {X: Field{[10]uint32{0x011ccb01, 0x011fe45d, 0x00c321a2, 0x035dfaef, 0x0286e79e, 0x025a4417, 0x000ca207, 0x023db129, 0x037f5ad7, 0x00113c28}}, Y: Field{[10]uint32{0x0353044a, 0x01255570, 0x01905af6, 0x02684a24, 0x0070836d, 0x019ad44a, 0x031e5590, 0x02cfefbe, 0x0067911e, 0x003d0136}}}, + {X: Field{[10]uint32{0x0330ad5d, 0x00e29842, 0x02c1dc0d, 0x038ec9c7, 0x0050f5c0, 0x025c5e1a, 0x00a4a8b2, 0x03823130, 0x00c3de8d, 0x0013ddf7}}, Y: Field{[10]uint32{0x01f57c69, 0x00da8e53, 0x032fa558, 0x000201bb, 0x0358dc73, 0x002a996c, 0x018aa5ab, 0x003ba484, 0x024f8ae8, 0x001cf1d0}}}, + {X: Field{[10]uint32{0x02005555, 0x01c4dc79, 0x01c0d38d, 0x0093978b, 0x016d6d5c, 0x03bd9630, 0x026efd38, 0x00248d8d, 0x008b102a, 0x001e5284}}, Y: Field{[10]uint32{0x0246ba2c, 0x03d9cdf3, 0x03f751a6, 0x012d7f72, 0x007c9e30, 0x007e11e6, 0x02cf0fdc, 0x024141a6, 0x01efefd7, 0x0021c659}}}, + {X: Field{[10]uint32{0x00e8e594, 0x029235c5, 0x003a822d, 0x01f3a8c2, 0x02a72e29, 0x0282c494, 0x01bd49f5, 0x0218eb7d, 0x0161234b, 0x003c6621}}, Y: Field{[10]uint32{0x003fc418, 0x03acd86a, 0x0203fca6, 0x01cf4c6a, 0x03abd2f5, 0x03f68fe3, 0x0036612d, 0x01468630, 0x0107d0ab, 0x001eb6e9}}}, + {X: Field{[10]uint32{0x003f4a80, 0x02862f73, 0x01c75491, 0x036fe0b4, 0x02f3fd27, 0x01e42abb, 0x0249b8f7, 0x026781c4, 0x0156c07c, 0x00122fb5}}, Y: Field{[10]uint32{0x02316e94, 0x00795559, 0x03543856, 0x008b5250, 0x0046cf01, 0x03976f2a, 0x00dd08cb, 0x0106346d, 0x028021be, 0x00276b94}}}, + {X: Field{[10]uint32{0x003ab9c1, 0x032ccfe5, 0x00a1f3bf, 0x02ff0b72, 0x00ec8449, 0x01d2eb1d, 0x0376fef9, 0x01e74e3c, 0x03fbe537, 0x002effbc}}, Y: Field{[10]uint32{0x0312551b, 0x01b1b378, 0x030b0800, 0x018e1200, 0x00ed4625, 0x02f83aa3, 0x010e8495, 0x022bff18, 0x0372ee79, 0x002fa96d}}}, + {X: Field{[10]uint32{0x015b7f06, 0x01d2f582, 0x0212e00b, 0x02bfbaf0, 0x00156839, 0x03305d71, 0x006b04be, 0x033548e0, 0x001527b3, 0x0010abcd}}, Y: Field{[10]uint32{0x01dcef4f, 0x02d1b7d6, 0x021370e7, 0x006096fe, 0x00f91a55, 0x02237a60, 0x036d0961, 0x01bfd88d, 0x03e5ebf1, 0x001a1b97}}}, + {X: Field{[10]uint32{0x01ce10e6, 0x037849dc, 0x00d6938a, 0x00990309, 0x02307497, 0x0162df57, 0x03ea376d, 0x021f11bb, 0x038b74ae, 0x000f15b5}}, Y: Field{[10]uint32{0x00d54a41, 0x00c9d492, 0x03883507, 0x002d446f, 0x0039fed0, 0x0328af1b, 0x023b36b6, 0x0388574d, 0x02ccf9d1, 0x0033a5f7}}}, + {X: Field{[10]uint32{0x0389b61a, 0x03f6c26d, 0x0291d33a, 0x0073693c, 0x0267b52a, 0x0123da73, 0x02404a9e, 0x03bc2ab9, 0x01991944, 0x0012c489}}, Y: Field{[10]uint32{0x02089571, 0x02ef99ad, 0x0211bf3e, 0x0201e391, 0x0062b1bc, 0x01b64af0, 0x037932cb, 0x03e6494d, 0x035027a3, 0x001722f8}}}, + {X: Field{[10]uint32{0x00d49db5, 0x01cd4346, 0x03e9acd3, 0x0154ac02, 0x01716749, 0x01363167, 0x0258f181, 0x024c528d, 0x0067c02c, 0x0002790a}}, Y: Field{[10]uint32{0x03a8c761, 0x025df1c5, 0x01d0d831, 0x0079b635, 0x0039f65b, 0x03f8833c, 0x003155da, 0x0035cf5e, 0x00351ff9, 0x001749b4}}}, + {X: Field{[10]uint32{0x035359ae, 0x036e5cc9, 0x00b94402, 0x007976f6, 0x00306ab3, 0x01efdbea, 0x0027d0d4, 0x014d14a8, 0x010c05a9, 0x002590ce}}, Y: Field{[10]uint32{0x027a3933, 0x025c86ac, 0x000cea69, 0x00b7d657, 0x03abbf49, 0x003ef52e, 0x03560d05, 0x03a70748, 0x03f71019, 0x002cd535}}}, + {X: Field{[10]uint32{0x02126b69, 0x03d5881f, 0x01f77bac, 0x0213faba, 0x021b6f78, 0x007c55e0, 0x01374f90, 0x01f7ad41, 0x02fb86f7, 0x0022d245}}, Y: Field{[10]uint32{0x00be1fd4, 0x032cc98a, 0x00213816, 0x03cd93e7, 0x02ce6d2a, 0x02f21feb, 0x01c3d59c, 0x036c4c15, 0x03c06d86, 0x000026a0}}}, + {X: Field{[10]uint32{0x00054b9f, 0x00f3c334, 0x02ff37ba, 0x03fa554b, 0x0011de8e, 0x021223df, 0x01ee9abb, 0x020b107d, 0x034b1097, 0x00034a77}}, Y: Field{[10]uint32{0x00ca07a8, 0x01826050, 0x03d1c98a, 0x01106627, 0x00d1a5a4, 0x01e6da02, 0x03e08f6a, 0x00b13c2e, 0x0237ea24, 0x0006fc18}}}, + {X: Field{[10]uint32{0x01dbd41d, 0x02e3a9c8, 0x01ede203, 0x019481b7, 0x03d4a202, 0x01444eb2, 0x01167d05, 0x0141114e, 0x017ba540, 0x000aabce}}, Y: Field{[10]uint32{0x02f73081, 0x022087a7, 0x03c6663d, 0x03093dec, 0x00013a81, 0x028cbcc2, 0x024b4a8a, 0x02eeb247, 0x02c71132, 0x000dd38c}}}, + {X: Field{[10]uint32{0x0357ef48, 0x004cfe73, 0x03b817b1, 0x0251762d, 0x001ca58a, 0x02da8e63, 0x03d287c8, 0x0339ae3a, 0x03d223ea, 0x00088e6c}}, Y: Field{[10]uint32{0x02b4cd46, 0x032f50f8, 0x03bda94c, 0x03ecf93a, 0x00f01d70, 0x02380fca, 0x02f4b267, 0x02a2c822, 0x00b74b54, 0x003f6a20}}}, + {X: Field{[10]uint32{0x03c7e365, 0x03b18929, 0x00f62e86, 0x00ce7c95, 0x01b88ee2, 0x007b6c51, 0x01c91785, 0x01cb7dfb, 0x03bcf47e, 0x0022cca1}}, Y: Field{[10]uint32{0x01fecabb, 0x03c3c802, 0x005be321, 0x01a47ad8, 0x00db6d99, 0x0030f4df, 0x0100868c, 0x0355397e, 0x03c09f60, 0x0015281a}}}, + {X: Field{[10]uint32{0x004f7993, 0x026072a6, 0x0136dd8d, 0x031c935b, 0x01ace742, 0x03a1d4e7, 0x017e1ff3, 0x03fba443, 0x02a33e3c, 0x00366b33}}, Y: Field{[10]uint32{0x027dc88b, 0x018e2a10, 0x02690565, 0x02055097, 0x0162947f, 0x0082f40b, 0x00f5a05a, 0x03974b63, 0x034aa901, 0x001ab725}}}, + {X: Field{[10]uint32{0x00b3206d, 0x03cab96a, 0x036b308d, 0x036902e3, 0x004af245, 0x01d3b80e, 0x0292b504, 0x0122f799, 0x03f834c3, 0x0035ff15}}, Y: Field{[10]uint32{0x004e2d19, 0x034acc09, 0x03406e38, 0x02c47e6b, 0x000231ed, 0x01b6c0c9, 0x028e04ba, 0x027faa6c, 0x024b41fd, 0x0002c94f}}}, + {X: Field{[10]uint32{0x00d9588a, 0x016d70c5, 0x015059ad, 0x0181e88f, 0x02b815f6, 0x02540878, 0x0334e165, 0x005024da, 0x03e0ec4a, 0x00096023}}, Y: Field{[10]uint32{0x018e7b96, 0x01e63df1, 0x00ec66f4, 0x01b3a2ef, 0x03a75bc1, 0x02e77c7f, 0x00a1eefb, 0x01bbe232, 0x02d5b1d4, 0x00341992}}}, + {X: Field{[10]uint32{0x01927914, 0x01ba84e6, 0x01ecc322, 0x01d8a68e, 0x0359e67a, 0x00368d69, 0x0152fa57, 0x015759c8, 0x03801139, 0x003911d1}}, Y: Field{[10]uint32{0x03793bee, 0x037cfe50, 0x035eac1a, 0x034a0dfb, 0x02ad4eb3, 0x0159b1e3, 0x02834d33, 0x00121b69, 0x0170aa2f, 0x00124f30}}}, + {X: Field{[10]uint32{0x026311ad, 0x000ae444, 0x02f11476, 0x02160b51, 0x0244e2b9, 0x0003c411, 0x01dd900d, 0x035c19db, 0x01be2af9, 0x00314103}}, Y: Field{[10]uint32{0x024ddb15, 0x0234a00c, 0x0186b91a, 0x006c41dd, 0x01a7cabc, 0x01e2a739, 0x01b64667, 0x0185c732, 0x0311a231, 0x002102aa}}}, + {X: Field{[10]uint32{0x037d9f14, 0x008a3ad0, 0x023a812a, 0x013e4ef6, 0x008116cd, 0x0311f539, 0x03ca1236, 0x00cface9, 0x03aa316d, 0x0008ce46}}, Y: Field{[10]uint32{0x037efd4d, 0x02d53d72, 0x00b7f1eb, 0x01e71f2e, 0x010bc97c, 0x01b63446, 0x00a69aff, 0x01dbf007, 0x001d9e6d, 0x0007604d}}}, + {X: Field{[10]uint32{0x0039ac38, 0x02acd3ef, 0x01eb945e, 0x036302e5, 0x008aeb8f, 0x03ace525, 0x006682cb, 0x02e9c8bf, 0x03563de3, 0x0004c845}}, Y: Field{[10]uint32{0x0174f006, 0x02e6b623, 0x013df89e, 0x001506dd, 0x01aa5279, 0x009b2fee, 0x0161431e, 0x00208df2, 0x03218a4b, 0x0026ddc9}}}, + {X: Field{[10]uint32{0x02789708, 0x01dea56e, 0x0096d2ff, 0x00eebfba, 0x01708b94, 0x02d735f8, 0x00f896bb, 0x00bf1e87, 0x0098b27a, 0x000ee2ee}}, Y: Field{[10]uint32{0x0136c1cb, 0x00403227, 0x028c9248, 0x01e70d01, 0x027fdcbf, 0x02858d77, 0x01e13e96, 0x000f9568, 0x001c6680, 0x00360795}}}, + {X: Field{[10]uint32{0x00217b4d, 0x03a267f8, 0x02e21c7c, 0x00b20568, 0x03d94f16, 0x0300103f, 0x005e4f55, 0x0312eb14, 0x022c9af5, 0x003875c2}}, Y: Field{[10]uint32{0x03a4532e, 0x00f3fb25, 0x0212c2fd, 0x02679e70, 0x01eb063b, 0x00ac794f, 0x006d66de, 0x00392cda, 0x00d6d20e, 0x002c958c}}}, + {X: Field{[10]uint32{0x0112de1c, 0x02aa9ef6, 0x001b5ff1, 0x0320c3ed, 0x03a7e681, 0x00acdb7f, 0x00f0c56e, 0x01e3eb4e, 0x0023a517, 0x0006c78e}}, Y: Field{[10]uint32{0x0184d4c1, 0x00ffcc89, 0x0116cd59, 0x009a0ca0, 0x03bebe16, 0x02fdff49, 0x03258556, 0x00807739, 0x0290a951, 0x003cba66}}}, + {X: Field{[10]uint32{0x01bda7a1, 0x03dca088, 0x03102e48, 0x00703640, 0x018745a9, 0x017919f8, 0x01348175, 0x018644b0, 0x003894f5, 0x00078c76}}, Y: Field{[10]uint32{0x00d610ce, 0x0232531f, 0x03aee504, 0x009d0480, 0x02477a7b, 0x03e0225b, 0x002c6d97, 0x03863cf0, 0x038835da, 0x0004773b}}}, + {X: Field{[10]uint32{0x02b7100e, 0x02c0c062, 0x0028c422, 0x01e946d4, 0x03311f68, 0x02f0ed25, 0x027a7ff2, 0x02f266fd, 0x0034795c, 0x00032e6b}}, Y: Field{[10]uint32{0x00d0db1d, 0x01120d8f, 0x0332074e, 0x03762913, 0x03e5ff32, 0x023704fd, 0x01e95e9a, 0x02cd7380, 0x0221c804, 0x001797c1}}}, + {X: Field{[10]uint32{0x00e11c1b, 0x01ce0d6d, 0x020ce56c, 0x0213c028, 0x0024dcb8, 0x02995b12, 0x02326fa1, 0x02b4e283, 0x02c4067d, 0x002bf0d2}}, Y: Field{[10]uint32{0x00bdcb96, 0x00204d8a, 0x01de1d75, 0x02baff1b, 0x0377a033, 0x000b0432, 0x02ef031a, 0x0191e8e0, 0x00043f6d, 0x00322c71}}}, + {X: Field{[10]uint32{0x0270aa81, 0x03e17ef8, 0x0273e603, 0x00d9e9e0, 0x023330f6, 0x02e85384, 0x01430bc0, 0x02ae8586, 0x0160ca85, 0x000e9bf0}}, Y: Field{[10]uint32{0x0222bc0a, 0x01d36e80, 0x001bb617, 0x03246709, 0x02cb72cf, 0x01c1ef0c, 0x01a7a483, 0x02ce4251, 0x037286db, 0x0016528a}}}, + {X: Field{[10]uint32{0x033ce7d4, 0x00658050, 0x02e4346b, 0x02a38fab, 0x01bdc1e4, 0x03c637af, 0x024f56ea, 0x0270e8fd, 0x0295657c, 0x002a103d}}, Y: Field{[10]uint32{0x02126fbc, 0x007d27fa, 0x0269d7a4, 0x0091c9cc, 0x031a77b8, 0x030004c6, 0x01eae96b, 0x038b7d18, 0x02c0ca41, 0x0022a29e}}}, + {X: Field{[10]uint32{0x000a39d6, 0x027602ba, 0x033e55f6, 0x018b5b83, 0x0065cd77, 0x028a4c9a, 0x01d08c34, 0x01a4530e, 0x020170ec, 0x00030113}}, Y: Field{[10]uint32{0x020b4657, 0x02fe488e, 0x0052a92d, 0x01ee4816, 0x036dd5fd, 0x00be5ecd, 0x02e0b5ec, 0x00545897, 0x00827ae5, 0x001ef58c}}}, + {X: Field{[10]uint32{0x02a00b3a, 0x0377a53a, 0x00b2aa89, 0x00690769, 0x002bf927, 0x033f74a2, 0x01eb5c67, 0x025a6c11, 0x035b352b, 0x0032e404}}, Y: Field{[10]uint32{0x0179be93, 0x012d858b, 0x00b492a8, 0x00b1498d, 0x03b4dac8, 0x009dea3d, 0x00b6d267, 0x026c47f9, 0x00a0762d, 0x000532fb}}}, + {X: Field{[10]uint32{0x03182a0e, 0x03213402, 0x02963c58, 0x01d9d7a9, 0x03c82166, 0x02a92a3f, 0x007c0633, 0x02ac3c87, 0x0037a24d, 0x003e9ef1}}, Y: Field{[10]uint32{0x01a5aa35, 0x03bb9534, 0x0244b383, 0x0051007c, 0x00fdf721, 0x0124d678, 0x0109326c, 0x0031adb7, 0x03c6d730, 0x00389099}}}, + {X: Field{[10]uint32{0x03b3299a, 0x00701795, 0x02fcdd0c, 0x015cef22, 0x0035e956, 0x0054ceb6, 0x032bef99, 0x00f494de, 0x00dd3f50, 0x00398d53}}, Y: Field{[10]uint32{0x019ead7f, 0x0342e1a1, 0x01a0a3c4, 0x03cfd72b, 0x03cdc2b6, 0x03a7be71, 0x01955b9a, 0x03228662, 0x03706291, 0x0035b05e}}}, + {X: Field{[10]uint32{0x0345cce8, 0x00ebc7ee, 0x0053b048, 0x00f4afc1, 0x02132ec2, 0x0035f604, 0x00dce9d5, 0x00578f7c, 0x013007e8, 0x002768d9}}, Y: Field{[10]uint32{0x0067a8dc, 0x02639474, 0x0109ebd2, 0x008c8bd3, 0x013bbc4b, 0x02426ba4, 0x02a1b102, 0x022b3aa1, 0x016698a2, 0x002ecdd1}}}, + {X: Field{[10]uint32{0x00c9d4db, 0x0066e28e, 0x011ba763, 0x02208b5a, 0x0213b257, 0x0105aa21, 0x02d1c3ba, 0x03371c1b, 0x021e1a19, 0x0037115e}}, Y: Field{[10]uint32{0x03dc3b58, 0x03a04fee, 0x01776dfc, 0x0363e0a1, 0x0385e25b, 0x02518e29, 0x01919fa2, 0x01943752, 0x0366de5a, 0x000e7e4f}}}, + {X: Field{[10]uint32{0x00f0374d, 0x02760ab3, 0x009a962b, 0x01badece, 0x03ec216c, 0x0132915b, 0x0357bc66, 0x003a617f, 0x031f1b1a, 0x002c8dde}}, Y: Field{[10]uint32{0x03578c1a, 0x00666b1d, 0x02db5dac, 0x030188ca, 0x027a040f, 0x00fae5d1, 0x0114e74b, 0x014272fc, 0x0180d723, 0x000e0e95}}}, + {X: Field{[10]uint32{0x00fc7e50, 0x0144492b, 0x01f65780, 0x03381797, 0x002a5a86, 0x02570936, 0x011fabeb, 0x00ea14e1, 0x0046755d, 0x0022c699}}, Y: Field{[10]uint32{0x0255cf75, 0x03ccd1a5, 0x036231ca, 0x01850e32, 0x01ed1cd4, 0x024a96ff, 0x0288aef1, 0x00a99d46, 0x01d4cb63, 0x0010ae21}}}, + {X: Field{[10]uint32{0x0103f5b1, 0x029bfc94, 0x01b3e7d5, 0x0288c285, 0x03c3a7ef, 0x00ea41e9, 0x01f14162, 0x00683279, 0x019cbacf, 0x00250220}}, Y: Field{[10]uint32{0x00506f98, 0x031a32c3, 0x0056b0d6, 0x00c32ec9, 0x021df08c, 0x002ade68, 0x0107451f, 0x013dcff4, 0x02c9d6f8, 0x002a5d63}}}, + {X: Field{[10]uint32{0x006ce25c, 0x00661c2c, 0x013ee9c3, 0x01cf090f, 0x029ce6d4, 0x02213693, 0x017c933a, 0x03e32e67, 0x004707b3, 0x0022ffbc}}, Y: Field{[10]uint32{0x03e5c498, 0x00f04b3d, 0x03e37ca7, 0x0213a281, 0x00627f1d, 0x00c05f16, 0x00d17ee8, 0x02bc5d54, 0x01870d06, 0x0022ef2f}}}, + {X: Field{[10]uint32{0x014bdb61, 0x034a52d0, 0x03cc0dc1, 0x01ff0e00, 0x018eff64, 0x037d60be, 0x00b84b8a, 0x000b8477, 0x03f0c122, 0x0000aa15}}, Y: Field{[10]uint32{0x02db6548, 0x003bfb11, 0x029afe43, 0x0076bdfe, 0x0262c8ae, 0x023a88ea, 0x00af8c64, 0x024c6091, 0x016da7fd, 0x0026eb11}}}, + {X: Field{[10]uint32{0x015cb5ec, 0x00eb2d97, 0x0083525e, 0x039a924f, 0x03b94b1e, 0x03fd4f9a, 0x006b2242, 0x017b4c34, 0x005a9048, 0x0024dee3}}, Y: Field{[10]uint32{0x03ccd808, 0x02c9d9a9, 0x02788da3, 0x019fa6df, 0x02c9c3d8, 0x038d9b29, 0x035a311a, 0x00dd2943, 0x036ff9fb, 0x0034dec4}}}, + {X: Field{[10]uint32{0x0243c77a, 0x0038280e, 0x001a065a, 0x00cd2248, 0x0122b249, 0x01a87971, 0x0150ff30, 0x035afb64, 0x0153e2bf, 0x0017d513}}, Y: Field{[10]uint32{0x02990f51, 0x00df82c4, 0x01562c31, 0x01f88059, 0x028f4c84, 0x01c33b4c, 0x012c4130, 0x0336605d, 0x00e28c47, 0x002ea708}}}, + {X: Field{[10]uint32{0x03c807b9, 0x025f9ea9, 0x01cbd9c2, 0x03ea0695, 0x01e3249c, 0x02e7e932, 0x0364fa7e, 0x022ebe96, 0x038890bf, 0x0019ed8c}}, Y: Field{[10]uint32{0x027625e6, 0x01876fab, 0x02567620, 0x0305b22e, 0x010d871e, 0x037e0229, 0x0354577e, 0x02e0450a, 0x02752d94, 0x00370615}}}, + {X: Field{[10]uint32{0x00439442, 0x00918a26, 0x02e2fbd3, 0x0360e1a8, 0x02b76604, 0x018ca00c, 0x012ffa3d, 0x01123e7e, 0x01d599cb, 0x00161ea7}}, Y: Field{[10]uint32{0x03ae9870, 0x035b7376, 0x03dee6b6, 0x021d47fe, 0x03488aa6, 0x036efd4c, 0x01e73ca2, 0x03ea9e92, 0x00e9a893, 0x00125a66}}}, + {X: Field{[10]uint32{0x03c29b38, 0x000a5298, 0x02a568f8, 0x00696190, 0x0218dfe5, 0x01746184, 0x00773123, 0x03fe7e04, 0x031ec576, 0x000dbede}}, Y: Field{[10]uint32{0x0166c4aa, 0x00055c85, 0x038e8a2f, 0x022586eb, 0x035c1a15, 0x01f7a298, 0x016fc1a6, 0x02c6fcb2, 0x02c9b82c, 0x000d2916}}}, + {X: Field{[10]uint32{0x01f4ba95, 0x0158931c, 0x03caef77, 0x00f5393b, 0x00ab8a27, 0x0027fd0d, 0x00f49c51, 0x03b34b76, 0x008ca0af, 0x0021edc7}}, Y: Field{[10]uint32{0x025676f9, 0x00e0b314, 0x010b81bc, 0x0286f5ab, 0x005b3626, 0x0079b672, 0x0127c56e, 0x009621d9, 0x011f5112, 0x00214645}}}, + {X: Field{[10]uint32{0x0063e040, 0x00e839e9, 0x0296cf43, 0x0262e069, 0x0000056c, 0x00ee8ec3, 0x03ed962c, 0x00dc2e8e, 0x00f2805c, 0x002b3d97}}, Y: Field{[10]uint32{0x01692d5b, 0x00ed0085, 0x023d663b, 0x008f35a3, 0x02dc7b0e, 0x00bd5fbc, 0x022762b5, 0x0385abe5, 0x029bf45b, 0x003c24e4}}}, + {X: Field{[10]uint32{0x0147acf1, 0x0011d7c8, 0x03f44899, 0x02ea04a5, 0x01e3e045, 0x00737ec7, 0x01f16740, 0x003216e4, 0x03ed8b01, 0x003824af}}, Y: Field{[10]uint32{0x03902c37, 0x01c2a61d, 0x0291b657, 0x02be2f76, 0x018c4d18, 0x0181c36a, 0x00160728, 0x01a0f790, 0x0042ecc8, 0x00382ee6}}}, + {X: Field{[10]uint32{0x010a52ae, 0x021c7298, 0x0269197c, 0x01fca3b3, 0x03ba386b, 0x01c14076, 0x0012735c, 0x02f2fc5e, 0x03b98260, 0x0026f7f5}}, Y: Field{[10]uint32{0x02371eeb, 0x033f7ad7, 0x00d9affb, 0x01e10188, 0x00887d9a, 0x017d427d, 0x01e01baa, 0x013339cc, 0x03983f8c, 0x0026f194}}}, + {X: Field{[10]uint32{0x0243545f, 0x028be0a1, 0x0240e9a4, 0x00361a90, 0x00afc8a8, 0x00255087, 0x005587a9, 0x00562572, 0x0321d931, 0x000f6c88}}, Y: Field{[10]uint32{0x03b78eae, 0x03dcd263, 0x028bfddb, 0x01153bf1, 0x02fdd6bb, 0x02c6651f, 0x0323c9af, 0x021a3783, 0x00b82c57, 0x0010abcc}}}, + {X: Field{[10]uint32{0x022b3e5f, 0x009e5858, 0x03da6256, 0x01908b4d, 0x03c3757a, 0x01790fe8, 0x02decbdc, 0x01fff3e1, 0x0314a6a7, 0x0003a74f}}, Y: Field{[10]uint32{0x00e67de7, 0x003e060c, 0x027f02f9, 0x0210db59, 0x03fd18ee, 0x02a4b305, 0x02d0764d, 0x01c5331b, 0x03ed1e2a, 0x0020eb02}}}, + {X: Field{[10]uint32{0x0042f2a4, 0x007547a6, 0x0180f089, 0x02161a09, 0x01b31b90, 0x02b56566, 0x01448af0, 0x01221c38, 0x02e4f29b, 0x00104921}}, Y: Field{[10]uint32{0x01e7ee3d, 0x034e5fc3, 0x01a8f080, 0x01ed4c58, 0x000bc557, 0x030b9d87, 0x03bbb039, 0x019e430b, 0x01318c0d, 0x0030c716}}}, + {X: Field{[10]uint32{0x02b4ddaa, 0x00a7648d, 0x01a267c5, 0x008a92cb, 0x01609f84, 0x026add7e, 0x01afbe0c, 0x0141bf8b, 0x007141ed, 0x003a77bb}}, Y: Field{[10]uint32{0x0194a21d, 0x0251e3db, 0x039eb220, 0x01fe6b6d, 0x008dfb76, 0x034a8290, 0x006029e5, 0x00ef0b61, 0x0144d846, 0x00021ca1}}}, + {X: Field{[10]uint32{0x0264218a, 0x03f5bfec, 0x031735f0, 0x00b16f2d, 0x01bbf01c, 0x02e24978, 0x03a17612, 0x011a8208, 0x0292553c, 0x00168288}}, Y: Field{[10]uint32{0x015dbae2, 0x03455d79, 0x0009ce90, 0x025a3c14, 0x00012de6, 0x0111ffe7, 0x021f8976, 0x003c4289, 0x01f0adda, 0x000c25f3}}}, + {X: Field{[10]uint32{0x00928d1f, 0x03784681, 0x03d005ba, 0x03e7383f, 0x02563a40, 0x0344bc61, 0x01dc23d8, 0x006b46e8, 0x02378b68, 0x001272ca}}, Y: Field{[10]uint32{0x016732d6, 0x001a564f, 0x03bd632a, 0x02db89da, 0x00fbecc5, 0x0360128f, 0x015a938a, 0x017e83fc, 0x02afc0f6, 0x003c8d78}}}, + {X: Field{[10]uint32{0x0215feb3, 0x02af6e45, 0x037ccf99, 0x03521345, 0x003dd1af, 0x01887351, 0x01ad510a, 0x0045dec1, 0x00b63688, 0x003535c7}}, Y: Field{[10]uint32{0x0162645b, 0x03c4bc1d, 0x02c02ac7, 0x018fec1d, 0x035316c3, 0x0254354c, 0x02f385fa, 0x02e6c581, 0x0378de3e, 0x000eb594}}}, + {X: Field{[10]uint32{0x01bfab2f, 0x00f9908d, 0x01148b7e, 0x02e0fd1f, 0x01529c99, 0x013a1b31, 0x03798c31, 0x01b80193, 0x02e14bdd, 0x0001646c}}, Y: Field{[10]uint32{0x00fa59b0, 0x01a95a2a, 0x03aeca98, 0x022575e0, 0x0112a517, 0x028da356, 0x02bbaf12, 0x01319935, 0x0266fd2a, 0x0013da18}}}, + {X: Field{[10]uint32{0x03356876, 0x02f88d91, 0x00086970, 0x0003d262, 0x02be2534, 0x00bab277, 0x03b63c29, 0x02f124f5, 0x0085c984, 0x003b940f}}, Y: Field{[10]uint32{0x03daa47e, 0x0315cf12, 0x01ccb976, 0x02ce9faf, 0x0139449b, 0x005359c4, 0x01704e96, 0x022731d0, 0x02bb6f9e, 0x002f60a2}}}, + {X: Field{[10]uint32{0x00b3f89e, 0x03256cc5, 0x01697758, 0x0325dff5, 0x03756e78, 0x0261f0eb, 0x036a3f98, 0x0287f328, 0x03a702e5, 0x000be6d3}}, Y: Field{[10]uint32{0x00a4a15d, 0x03a85407, 0x03cf33f0, 0x03c86997, 0x03956657, 0x02427670, 0x022e1cee, 0x00f1d13a, 0x015b3d5b, 0x00259a18}}}, + {X: Field{[10]uint32{0x02fd46c3, 0x02c7249e, 0x03a6234e, 0x02f01b84, 0x02a1f4ae, 0x00a8042a, 0x012b204e, 0x0093e17e, 0x006aa341, 0x00062db4}}, Y: Field{[10]uint32{0x034bef4e, 0x00120747, 0x0264fb46, 0x029550dc, 0x03258b0b, 0x00f81e7c, 0x02624bfa, 0x0002c01f, 0x01b9bdf6, 0x0019b30c}}}, + {X: Field{[10]uint32{0x01b44ba0, 0x00c0d037, 0x016881cc, 0x013594e5, 0x0367662a, 0x00c36dba, 0x0337d0f0, 0x023763ff, 0x0163bf75, 0x000ef01e}}, Y: Field{[10]uint32{0x01057e5d, 0x01dc306b, 0x008a357d, 0x03b2dd15, 0x008e6dc1, 0x01db6dbe, 0x039a3c22, 0x026870b7, 0x02f26820, 0x00183847}}}, + {X: Field{[10]uint32{0x013a46a8, 0x026ca201, 0x01e3dd08, 0x016bc3ba, 0x0291498b, 0x0327e9a2, 0x0149af30, 0x01508ebf, 0x01d65b32, 0x0002fd61}}, Y: Field{[10]uint32{0x038e66a6, 0x033dab78, 0x00c0594b, 0x0304d147, 0x0204c000, 0x02a794e5, 0x0256e2cf, 0x012e6944, 0x00e9ea48, 0x000be251}}}, + {X: Field{[10]uint32{0x03b69294, 0x02704cf3, 0x01a7f64e, 0x00e35fc1, 0x00f0cf14, 0x007d03be, 0x01b59a91, 0x00095d75, 0x022ebe7a, 0x00221f02}}, Y: Field{[10]uint32{0x00aec5c9, 0x01c79c58, 0x02a58402, 0x0037483d, 0x019c37c3, 0x0105d524, 0x03de5949, 0x0319bd43, 0x00c84f9b, 0x00117ccd}}}, + {X: Field{[10]uint32{0x022f7d4f, 0x03e68d98, 0x0211601b, 0x027e0128, 0x003718e7, 0x030f71af, 0x0217700f, 0x00c97166, 0x02f90a73, 0x00276b5e}}, Y: Field{[10]uint32{0x02159525, 0x00a616b9, 0x03136644, 0x02b40624, 0x0140644b, 0x0227ae37, 0x02326ecb, 0x01aa531f, 0x025e099c, 0x000adf08}}}, + {X: Field{[10]uint32{0x03dd551b, 0x02116529, 0x006947cb, 0x007272be, 0x0363bcb6, 0x01cf37f3, 0x03e9a2ed, 0x00a7dd3c, 0x039572bd, 0x00211f93}}, Y: Field{[10]uint32{0x0393ee16, 0x0226856c, 0x004b81ea, 0x020a8407, 0x000f6f11, 0x01c32cd1, 0x006286d3, 0x00b18bea, 0x0282e0a9, 0x002e9bb4}}}, + {X: Field{[10]uint32{0x0047a593, 0x012bd1fc, 0x01580268, 0x00b3374f, 0x00b5d8c6, 0x02495b1c, 0x033c4b44, 0x00d80119, 0x0205df1c, 0x0009484c}}, Y: Field{[10]uint32{0x03096837, 0x018f59fb, 0x01f3c547, 0x03b10a9e, 0x0395aabf, 0x02881591, 0x022a47a8, 0x011c27eb, 0x01de05af, 0x000db720}}}, + {X: Field{[10]uint32{0x0058e87a, 0x0032f384, 0x0229ab17, 0x01c175cc, 0x0095ebfd, 0x00beca7f, 0x013a25ef, 0x037de91c, 0x00d84866, 0x001d48a3}}, Y: Field{[10]uint32{0x0012fe6d, 0x02ecc2f0, 0x03812a7d, 0x01564a6e, 0x0168a473, 0x00215105, 0x025f056c, 0x034fd3f4, 0x039bcc02, 0x003ee921}}}, + {X: Field{[10]uint32{0x01b68568, 0x036b6ed6, 0x03fe4b6a, 0x00dd0b18, 0x00981a13, 0x00109224, 0x002fb07c, 0x01f021b4, 0x01392286, 0x001d2515}}, Y: Field{[10]uint32{0x011af3e2, 0x03aed507, 0x01180341, 0x00111919, 0x013e3b8d, 0x0091f9d4, 0x030bf0b5, 0x02c6722b, 0x01178df8, 0x001f5dd2}}}, + {X: Field{[10]uint32{0x03c9b04f, 0x0383f2ff, 0x03f7a609, 0x038d5fd1, 0x0271d28c, 0x00a651bc, 0x00cbadfc, 0x038e73e8, 0x03532899, 0x001a76df}}, Y: Field{[10]uint32{0x019feabc, 0x0252d8c6, 0x011f0a66, 0x0375d928, 0x0326da7c, 0x007543e7, 0x0023ffee, 0x01576ab5, 0x03bb1032, 0x0032c090}}}, + {X: Field{[10]uint32{0x0129f8c7, 0x01cf0a4a, 0x022251d1, 0x03d54f6b, 0x02ec4aed, 0x0240be48, 0x012fc378, 0x0036f83f, 0x01c1fb4a, 0x001c9fb3}}, Y: Field{[10]uint32{0x011f453b, 0x03525799, 0x0035c224, 0x030592f0, 0x02bfc4f7, 0x015d536c, 0x0046ee5e, 0x02358199, 0x02ed1377, 0x002b96ec}}}, + {X: Field{[10]uint32{0x02f25b72, 0x0278cd1f, 0x00382b12, 0x01cd7baf, 0x01912138, 0x00b1fcaf, 0x007f5c9e, 0x01512f88, 0x018f0ec2, 0x00240f3b}}, Y: Field{[10]uint32{0x003190a6, 0x01073565, 0x00c8bb2e, 0x0255af90, 0x03ff75c7, 0x03ea2df6, 0x009bf33a, 0x00f4c57a, 0x02290ee1, 0x000845f2}}}, + {X: Field{[10]uint32{0x0203f33b, 0x02eee646, 0x02ca33a6, 0x03c200cd, 0x031c8906, 0x03f4d8dc, 0x038a5ad6, 0x03845cd8, 0x03ef5149, 0x00313519}}, Y: Field{[10]uint32{0x0229b5c7, 0x026058c1, 0x01b63bf3, 0x0033fe5d, 0x00431ad8, 0x02fcbf3b, 0x03d437ea, 0x01af3f38, 0x03244c53, 0x003a96d6}}}, + {X: Field{[10]uint32{0x0237326f, 0x0178df3a, 0x03cf9d32, 0x029b0daf, 0x01cff7a8, 0x036028bc, 0x03b2b7ad, 0x0027dec8, 0x03a65f6d, 0x0005ad5d}}, Y: Field{[10]uint32{0x009f15c1, 0x01ce4d34, 0x02dcbe90, 0x03876c68, 0x0184d98b, 0x0294a9e4, 0x00a65760, 0x0139788a, 0x00e21467, 0x00019aea}}}, + {X: Field{[10]uint32{0x0363412f, 0x0214c766, 0x01f5a676, 0x036f4afc, 0x0367fcee, 0x02f5f77d, 0x02453846, 0x02b7f387, 0x02f2e480, 0x002b52f2}}, Y: Field{[10]uint32{0x01e741ac, 0x0068e03a, 0x03f4a0a6, 0x02dd59cd, 0x00c4c891, 0x0097b9cb, 0x031b3a45, 0x003d6446, 0x03604781, 0x00147e80}}}, + {X: Field{[10]uint32{0x033b571a, 0x01ccd8b0, 0x01dd587d, 0x037b767a, 0x0151ca65, 0x006f2ce6, 0x012d776d, 0x039e1d29, 0x033852d2, 0x002c927a}}, Y: Field{[10]uint32{0x03a66258, 0x000c8c94, 0x031d9b11, 0x001a9e70, 0x0062dd77, 0x005dc25b, 0x03cd84eb, 0x03b3a020, 0x002414e4, 0x000f8982}}}, + {X: Field{[10]uint32{0x01e14a65, 0x0347b12f, 0x029dbccf, 0x0181f8ef, 0x0374dd05, 0x0274b14e, 0x0310d3a5, 0x0006ba04, 0x02c7696a, 0x0018d064}}, Y: Field{[10]uint32{0x03b0e00f, 0x03948895, 0x0154adcb, 0x03912e4a, 0x004fd4cc, 0x031e1ec6, 0x02dcd709, 0x0381df61, 0x0050e366, 0x001156d2}}}, + {X: Field{[10]uint32{0x022f5099, 0x02577312, 0x02ce6fd2, 0x03b7eec6, 0x02acc3c5, 0x0052c662, 0x02159ccc, 0x00fe0127, 0x03f50d43, 0x003fefb2}}, Y: Field{[10]uint32{0x000be3c0, 0x00779491, 0x0285caaa, 0x01a22921, 0x03dd68d3, 0x0300ee8c, 0x0089acf9, 0x01b3d0d9, 0x02ba1ec6, 0x00108b9e}}}, + {X: Field{[10]uint32{0x001868af, 0x00cf7457, 0x035ad8c1, 0x00ed4269, 0x02b6a8c8, 0x03418cb6, 0x034f1a90, 0x03a08e73, 0x00dc1067, 0x00196d31}}, Y: Field{[10]uint32{0x014d260e, 0x02b0797e, 0x026d840d, 0x005e7548, 0x0320c678, 0x01fd0a80, 0x003f8ae0, 0x01186146, 0x019dd765, 0x003df3d7}}}, + {X: Field{[10]uint32{0x03f9c67e, 0x00695826, 0x0355924c, 0x02ecd756, 0x008de48d, 0x0016e343, 0x018dbed4, 0x00d40b54, 0x00ce9d60, 0x0034e03b}}, Y: Field{[10]uint32{0x0364c128, 0x00d7e3f6, 0x013ae50c, 0x0136a02c, 0x038b241b, 0x01971827, 0x030ac152, 0x02ac427a, 0x0080fd18, 0x0006ba11}}}, + {X: Field{[10]uint32{0x0244511c, 0x0213fd33, 0x002df634, 0x03dc6741, 0x003fce43, 0x01774694, 0x00a1d961, 0x006efb5e, 0x0128b5ce, 0x0005c627}}, Y: Field{[10]uint32{0x0382350d, 0x01a91ce9, 0x03bb5759, 0x026236cb, 0x0185c532, 0x029584a2, 0x021b948b, 0x00f8e504, 0x00f47c7b, 0x003ef28a}}}, + {X: Field{[10]uint32{0x00c2e84d, 0x0160e0a0, 0x01ee73f5, 0x0393ebf3, 0x010be685, 0x02496fcf, 0x01ae4e61, 0x02c1f6a1, 0x02c2e2a8, 0x003ef8cc}}, Y: Field{[10]uint32{0x024e29ca, 0x0295e5fa, 0x00eb30e1, 0x0381ad65, 0x02b11c43, 0x026d0b2f, 0x038c6d77, 0x01f6838f, 0x03425e18, 0x002aa45c}}}, + {X: Field{[10]uint32{0x00bc834f, 0x01e58ee8, 0x0321002d, 0x03d736ab, 0x012100d1, 0x00ba7348, 0x00bd5182, 0x01c97e2d, 0x02878b5e, 0x0022e7a2}}, Y: Field{[10]uint32{0x003ed659, 0x01de8233, 0x00563bed, 0x0371154b, 0x02b2e873, 0x002d95c0, 0x031d6ad8, 0x015af57f, 0x031cc28f, 0x000cc7ec}}}, + {X: Field{[10]uint32{0x01e111ca, 0x003323a3, 0x02a3bd73, 0x022ad9a2, 0x0234e1a6, 0x032986b0, 0x02798ace, 0x02f2b45e, 0x0011a3c0, 0x0025fa49}}, Y: Field{[10]uint32{0x0147f48f, 0x0312fc5a, 0x007eb7cd, 0x01d82ebf, 0x01047949, 0x00f08690, 0x035fb759, 0x01785cb9, 0x00a4bac1, 0x002c3c5c}}}, + {X: Field{[10]uint32{0x0044eea8, 0x008ec974, 0x016919cd, 0x007f5354, 0x0349aa3c, 0x0309e55d, 0x00c76f82, 0x00f1bb32, 0x001333a1, 0x00080d62}}, Y: Field{[10]uint32{0x000c7f29, 0x00f2245e, 0x025c0ee7, 0x03c41366, 0x00259fc4, 0x037c3cd1, 0x022f9517, 0x02bc2bb3, 0x02a48c86, 0x001202be}}}, + {X: Field{[10]uint32{0x027dbcff, 0x016fade9, 0x00343a66, 0x03988adf, 0x02617579, 0x02126fbf, 0x01551039, 0x01d02a40, 0x00cb1575, 0x0032a87b}}, Y: Field{[10]uint32{0x00e0a20b, 0x0354b829, 0x02577e0b, 0x004e707a, 0x011aee51, 0x02fc10b6, 0x03d34511, 0x01cbfedb, 0x03f9f1c9, 0x002a9a56}}}, + {X: Field{[10]uint32{0x02620719, 0x028eb6f0, 0x02bbd138, 0x0279ba3c, 0x03f33104, 0x03f5ae20, 0x02a212a7, 0x01ea3bf6, 0x03a2036f, 0x00239f0a}}, Y: Field{[10]uint32{0x02ec105c, 0x01863e0b, 0x02d0220a, 0x00c47fb3, 0x00d9b6e0, 0x01de7e30, 0x006c4e2e, 0x03ecfd61, 0x002f1434, 0x002f40dc}}}, + {X: Field{[10]uint32{0x02ace975, 0x018df1ee, 0x033b24dd, 0x0046393a, 0x0388fbad, 0x00301de0, 0x03ebf094, 0x001307f3, 0x00336dcd, 0x00381f70}}, Y: Field{[10]uint32{0x032a2c2c, 0x01985aac, 0x0019510d, 0x01a14011, 0x02ef6f92, 0x02f54c55, 0x02ccf311, 0x03b2c1d8, 0x00a00e5e, 0x002c4ef4}}}, + {X: Field{[10]uint32{0x038ce0cb, 0x03e8b7ee, 0x0307297a, 0x0247470c, 0x0095aba7, 0x036c2ca3, 0x018a9044, 0x02bc0427, 0x00252679, 0x001981b2}}, Y: Field{[10]uint32{0x00e1d3cc, 0x01f2b202, 0x02054647, 0x015cdae8, 0x0310fe6c, 0x011e1a3e, 0x010de777, 0x01e64d5c, 0x019ca980, 0x001d4179}}}, + {X: Field{[10]uint32{0x01e6f061, 0x02e64d47, 0x020b522a, 0x00d4ae67, 0x022b31f9, 0x0037976b, 0x005450fb, 0x0089b02d, 0x00dcec48, 0x0027efd3}}, Y: Field{[10]uint32{0x02f850dd, 0x03e98047, 0x02c91a7d, 0x0119c0d3, 0x00e9c5b6, 0x00d8adf7, 0x020d58a2, 0x0083a182, 0x00a23da0, 0x003cb934}}}, + {X: Field{[10]uint32{0x006916bc, 0x03d8618a, 0x01b1b976, 0x019fa003, 0x00b7cc81, 0x025df4cb, 0x00b0403e, 0x03ff0a62, 0x02975195, 0x000381b5}}, Y: Field{[10]uint32{0x030bb8bb, 0x011302f0, 0x01c83632, 0x02ec3069, 0x02068302, 0x012400fa, 0x0380e04a, 0x034885eb, 0x030a27d3, 0x0020054d}}}, + {X: Field{[10]uint32{0x0293a6e2, 0x028fc2a4, 0x01a6bcf4, 0x01dfa5e1, 0x03ff7925, 0x01b85b35, 0x0112fd4e, 0x00aab194, 0x03ab021d, 0x002b7359}}, Y: Field{[10]uint32{0x03fd7fb8, 0x02970ad5, 0x0293d0fa, 0x03526d6f, 0x018e4f40, 0x01730eeb, 0x0058608f, 0x00aaa814, 0x02202906, 0x001949ed}}}, + {X: Field{[10]uint32{0x01f2bd38, 0x02fde8b8, 0x00e133e0, 0x005da244, 0x035a4473, 0x025a026c, 0x007e963d, 0x01932c46, 0x01eab43a, 0x0007641a}}, Y: Field{[10]uint32{0x01e29108, 0x037cc6a4, 0x033bbf15, 0x023e93b0, 0x00fc78c2, 0x03bd5057, 0x012f9a68, 0x023fa52b, 0x02de854b, 0x002ac0f7}}}, + {X: Field{[10]uint32{0x0220a768, 0x008b99c2, 0x0140e3a4, 0x03dca8e0, 0x03603206, 0x033a0fd2, 0x00168ae8, 0x0224bc52, 0x0376b8ec, 0x003c7dad}}, Y: Field{[10]uint32{0x01bff25a, 0x02ff2cae, 0x0345d14a, 0x01f60a9f, 0x01e7136a, 0x02ec9736, 0x019b11a7, 0x0368845f, 0x00363413, 0x00224ae8}}}, + {X: Field{[10]uint32{0x02fab379, 0x007177c7, 0x03fb0040, 0x008d0ce9, 0x03c21d1c, 0x0228b70e, 0x03a8d1bf, 0x03d3343c, 0x014ace79, 0x002a213e}}, Y: Field{[10]uint32{0x02a05c96, 0x00c3e037, 0x03082dd6, 0x03e97434, 0x03c611af, 0x03c0f77d, 0x0282fbee, 0x009233b0, 0x016c6e45, 0x0017d4cd}}}, + {X: Field{[10]uint32{0x021da9ff, 0x0203c439, 0x02fe981a, 0x0020d7a7, 0x031fb2be, 0x02d2353d, 0x00165640, 0x02200384, 0x0030197a, 0x002c6621}}, Y: Field{[10]uint32{0x01d849b9, 0x01a36393, 0x00bdf44a, 0x01057b1c, 0x000e515a, 0x01b85068, 0x027ace58, 0x004b496f, 0x024dea7d, 0x003571e1}}}, + {X: Field{[10]uint32{0x0127fedb, 0x0110d383, 0x02d4d109, 0x02ba50bd, 0x0246985a, 0x02db24ea, 0x01c1db82, 0x016e12f5, 0x02a7529d, 0x00056dce}}, Y: Field{[10]uint32{0x02721f89, 0x036af23b, 0x02262075, 0x037bcbf2, 0x00632ac6, 0x00728f50, 0x0011259b, 0x0344f108, 0x02a2bc8a, 0x000a5f8c}}}, + {X: Field{[10]uint32{0x0197d40f, 0x01de0b1f, 0x00f3f57f, 0x01e85b34, 0x038e35cc, 0x005b948f, 0x01926301, 0x007ec596, 0x02e0443c, 0x000ce69d}}, Y: Field{[10]uint32{0x01fe9659, 0x02f5dcf3, 0x02a229e5, 0x01af104e, 0x03914f0f, 0x00ed4b9b, 0x02756201, 0x01e130cf, 0x012efecd, 0x00226419}}}, + {X: Field{[10]uint32{0x027adfef, 0x02d460ed, 0x0251bf64, 0x038613d3, 0x03b1c535, 0x02c24112, 0x018312e9, 0x0376ae51, 0x00fffb80, 0x002fbc9b}}, Y: Field{[10]uint32{0x0137490b, 0x02f79167, 0x03bb5ba1, 0x03c859d6, 0x012c6943, 0x016cc43d, 0x0320518c, 0x01aa0d63, 0x029aef07, 0x000e0624}}}, + {X: Field{[10]uint32{0x00b2427e, 0x036490c2, 0x01894c71, 0x02188c49, 0x003dd40d, 0x013e46c2, 0x00dae108, 0x0309cd3d, 0x00818daf, 0x0033715b}}, Y: Field{[10]uint32{0x03503cca, 0x0041fc07, 0x02c71f07, 0x00d4fd61, 0x01b43769, 0x0155e7e4, 0x01425694, 0x00a2d511, 0x009de9c8, 0x0003d2cc}}}, + {X: Field{[10]uint32{0x0175bc6d, 0x0148039f, 0x01911cd6, 0x0298a9dd, 0x03a09312, 0x0258717e, 0x01be80a1, 0x0211e7b2, 0x0281b1f3, 0x000f77bf}}, Y: Field{[10]uint32{0x02df055d, 0x0160d615, 0x015d3a1e, 0x01442a7a, 0x027c7e2d, 0x02a001f4, 0x03fae4eb, 0x02d1e53b, 0x02dd1eb9, 0x001d760f}}}, + {X: Field{[10]uint32{0x00576826, 0x00e41044, 0x0399e763, 0x03498eab, 0x02a18879, 0x02484b3c, 0x02bae125, 0x00b2f130, 0x03769903, 0x00369f19}}, Y: Field{[10]uint32{0x00553f08, 0x02ba7cce, 0x031d0c07, 0x00f0fc72, 0x024314cc, 0x03a01a63, 0x031f7799, 0x03116e61, 0x0188360a, 0x000b9e9b}}}, + {X: Field{[10]uint32{0x0280d927, 0x02aa446a, 0x003859df, 0x0312b870, 0x02b8aba4, 0x01fd1556, 0x00faa801, 0x00831623, 0x0035e0bc, 0x0009846d}}, Y: Field{[10]uint32{0x014508d4, 0x0032b4df, 0x01b417ce, 0x03490a79, 0x00e47549, 0x0014a7eb, 0x01ff8c1c, 0x03141119, 0x001ae51d, 0x003ad63e}}}, + {X: Field{[10]uint32{0x03962961, 0x03fb1ed9, 0x027bc3de, 0x0025a516, 0x020b8f4c, 0x001adc75, 0x015aa088, 0x01f12a9c, 0x014836f0, 0x002c3ef9}}, Y: Field{[10]uint32{0x03e5abe0, 0x020694e0, 0x010de2a8, 0x02c117b9, 0x021c1749, 0x0378c328, 0x018668fe, 0x01d13431, 0x022466e7, 0x00331828}}}, + {X: Field{[10]uint32{0x01020581, 0x02ed27b2, 0x01a9eb50, 0x03ad7b7b, 0x0277d371, 0x01180f21, 0x00b7688b, 0x03b9d7eb, 0x036fdc51, 0x000680cc}}, Y: Field{[10]uint32{0x00daa7d7, 0x01c57926, 0x0218ce9f, 0x01166f9f, 0x03bd5071, 0x02b3f6f1, 0x0055fc36, 0x03b7e266, 0x030309c0, 0x000ff3c6}}}, + {X: Field{[10]uint32{0x00c159ed, 0x03b9cbde, 0x013c3810, 0x02492793, 0x020cf728, 0x00bda28d, 0x0049b20f, 0x024556aa, 0x0215c834, 0x001d8e84}}, Y: Field{[10]uint32{0x00482684, 0x03797996, 0x0390bd7d, 0x031a7ff4, 0x037b68d5, 0x007cbc89, 0x0395fbad, 0x0387b685, 0x021ccf30, 0x000de09a}}}, + {X: Field{[10]uint32{0x02da4edd, 0x00b09f72, 0x01eff63f, 0x03617e81, 0x00f7e664, 0x01bc0623, 0x020a586a, 0x00f8df73, 0x00c23018, 0x001ff1ed}}, Y: Field{[10]uint32{0x03ed6a8f, 0x0057244a, 0x03f50ac4, 0x03ebf915, 0x036338d2, 0x02af9ef3, 0x02493430, 0x02681bc1, 0x000e6ea8, 0x003f5e9e}}}, + {X: Field{[10]uint32{0x0065ddd8, 0x00984d77, 0x008d7747, 0x03f3c05b, 0x03dc543b, 0x01049623, 0x01eb7d70, 0x01bd5436, 0x03c9b068, 0x00088a01}}, Y: Field{[10]uint32{0x016cc2ab, 0x0255ec29, 0x0098b43d, 0x02d0c072, 0x029a34b2, 0x0064e4f6, 0x036d1553, 0x008bbf2c, 0x0102456c, 0x002e59c2}}}, + {X: Field{[10]uint32{0x005fda77, 0x00627c3f, 0x01603ed0, 0x01182aff, 0x02db6363, 0x028134f1, 0x0233f69c, 0x0341b9b2, 0x033698d8, 0x001e763a}}, Y: Field{[10]uint32{0x03d955f1, 0x009945c8, 0x02b28f13, 0x02789b5e, 0x02931fd4, 0x00676d48, 0x011d460e, 0x00d2a637, 0x03e11b02, 0x002fff25}}}, + {X: Field{[10]uint32{0x03add34b, 0x013449fa, 0x01dc5d46, 0x01aab223, 0x031f801a, 0x037b3db8, 0x02b77130, 0x0386db56, 0x02188e72, 0x00288d99}}, Y: Field{[10]uint32{0x03d60ed1, 0x00daaf9d, 0x03aebb17, 0x0321464f, 0x0070e99a, 0x00543fec, 0x034cd1cd, 0x00644c9d, 0x0236f3e7, 0x003bc8f6}}}, + {X: Field{[10]uint32{0x01dd9612, 0x03f06ed2, 0x013be480, 0x02cfe87c, 0x01b1fcbd, 0x00fe91a9, 0x023e8e74, 0x0205b644, 0x004ddde6, 0x002daeb4}}, Y: Field{[10]uint32{0x02a4e511, 0x02c0402d, 0x035467f1, 0x001f6566, 0x01850c65, 0x0116e02c, 0x00b7f346, 0x02c9ce9a, 0x0209a290, 0x001617eb}}}, + {X: Field{[10]uint32{0x00c3dfbd, 0x007874bd, 0x03aceb49, 0x0163cf5b, 0x0133fcbd, 0x02ed4063, 0x03113db8, 0x039c54a0, 0x00253353, 0x000afc87}}, Y: Field{[10]uint32{0x038d896e, 0x03113273, 0x033ef569, 0x03628356, 0x03b9fec4, 0x00e91ec1, 0x00491214, 0x01356f23, 0x03a74e8a, 0x0038e80c}}}, + {X: Field{[10]uint32{0x01842744, 0x03777497, 0x02dda358, 0x0099a817, 0x0041e9ad, 0x01c4247d, 0x03f3a90e, 0x038d7418, 0x0241e978, 0x0019309e}}, Y: Field{[10]uint32{0x01ae32d1, 0x0304ce4f, 0x03d27521, 0x0008ed49, 0x02bed768, 0x03f99f05, 0x00aac9ec, 0x029a5662, 0x025e08fd, 0x003f2ed8}}}, + {X: Field{[10]uint32{0x0081a58d, 0x010b4ad9, 0x03399b75, 0x02b680be, 0x00af62ac, 0x018f35f2, 0x00ef4350, 0x016d7a69, 0x02f6fdfe, 0x00188287}}, Y: Field{[10]uint32{0x01b8054f, 0x030c16b7, 0x01ae57be, 0x0317b209, 0x03a45fa7, 0x0151f880, 0x007f105c, 0x024e9be8, 0x023c5503, 0x002c2de7}}}, + {X: Field{[10]uint32{0x007b95cd, 0x01d19d4c, 0x038a1ecd, 0x014681af, 0x0215e712, 0x0093b831, 0x03ef68b4, 0x01c550d1, 0x01317cef, 0x000548fc}}, Y: Field{[10]uint32{0x00743b1d, 0x0145bffc, 0x02612bf5, 0x03154f70, 0x00a55806, 0x03c4796d, 0x01fe67a3, 0x03599370, 0x00cc1d8a, 0x0031c955}}}, + {X: Field{[10]uint32{0x02ea0cfd, 0x035ca513, 0x03700f66, 0x00f02dd4, 0x01b43f76, 0x0335cff3, 0x00d4d8c2, 0x021e5300, 0x003c0a9c, 0x0035d94c}}, Y: Field{[10]uint32{0x03bc267b, 0x0180f495, 0x02623781, 0x008ab806, 0x0035b4cd, 0x028c1937, 0x0217b73d, 0x035dea8e, 0x00a5204d, 0x002ebf2b}}}, + {X: Field{[10]uint32{0x00c468b6, 0x03c12b59, 0x01a8ea17, 0x01ed860e, 0x01ffbbf8, 0x00972f10, 0x0198759c, 0x03a59594, 0x021afafc, 0x0029d7ad}}, Y: Field{[10]uint32{0x01869873, 0x0125f659, 0x007b8041, 0x00859356, 0x03a8eba3, 0x029b5439, 0x0049b181, 0x0122a94f, 0x0093240f, 0x0026600a}}}, + {X: Field{[10]uint32{0x00e59f2a, 0x01381aef, 0x03cfa408, 0x01f6fac2, 0x01e7053f, 0x009079a4, 0x01813c71, 0x0246db09, 0x034cd0bb, 0x001fe906}}, Y: Field{[10]uint32{0x0184aec7, 0x020ec738, 0x0209f7e5, 0x00b0012a, 0x039431e2, 0x03da8b15, 0x017e7e20, 0x01a57e0c, 0x0379755a, 0x00282505}}}, + {X: Field{[10]uint32{0x02e4dbf5, 0x0333fd85, 0x03d6fcc5, 0x03ef6082, 0x033bfa1b, 0x02b889db, 0x01eb4408, 0x03c4ab63, 0x01b72240, 0x00205b03}}, Y: Field{[10]uint32{0x037e52d0, 0x0059810f, 0x02c9f67c, 0x0342a606, 0x02e57acb, 0x03dc0957, 0x009dd4bb, 0x03996251, 0x013dd91e, 0x000a94b2}}}, + {X: Field{[10]uint32{0x023414f8, 0x03725430, 0x0380fbb7, 0x021ec305, 0x00ddbb3d, 0x011a4178, 0x0390ac73, 0x00509544, 0x01f1317f, 0x000cfd8d}}, Y: Field{[10]uint32{0x014bfbcb, 0x01a950f9, 0x013bdb62, 0x02000afe, 0x01151235, 0x02f0acb0, 0x034d570b, 0x006622e5, 0x015584eb, 0x001d0d68}}}, + {X: Field{[10]uint32{0x0251999c, 0x02fb11a8, 0x00eb3e94, 0x0079ed78, 0x030bdfe1, 0x02f10e29, 0x0307185f, 0x02ec0cd4, 0x02d704b0, 0x0034a50e}}, Y: Field{[10]uint32{0x036d577e, 0x02925059, 0x0006f19a, 0x01aceffb, 0x00b6097d, 0x03fdba7f, 0x01e41def, 0x028c53af, 0x03cf19aa, 0x000b72a3}}}, + {X: Field{[10]uint32{0x01fb1da6, 0x00494967, 0x01516b01, 0x01970434, 0x00fb524b, 0x01791283, 0x0054390b, 0x01d69bfb, 0x03bfc543, 0x0009aa87}}, Y: Field{[10]uint32{0x01a91b02, 0x009380e6, 0x03a2fd4b, 0x01bc02af, 0x0083973c, 0x039fa066, 0x037d0b6e, 0x01d7380c, 0x02a604c5, 0x00127b3a}}}, + {X: Field{[10]uint32{0x03d28d20, 0x02d633e9, 0x000cd65e, 0x01f7a08c, 0x02ab1871, 0x02523cbd, 0x026d7da1, 0x0280c172, 0x001af866, 0x001e02bb}}, Y: Field{[10]uint32{0x0008b91a, 0x03ca5e2f, 0x0392992c, 0x000862ab, 0x02414b3a, 0x001edbde, 0x0075b6d1, 0x00387aa4, 0x0041e45a, 0x00369940}}}, + {X: Field{[10]uint32{0x00b88b67, 0x035b540b, 0x03b3d5ee, 0x00fca7fd, 0x01ef9811, 0x00f31079, 0x0115853b, 0x037528f9, 0x02598e59, 0x000773fc}}, Y: Field{[10]uint32{0x02b77271, 0x02005c86, 0x012f28c6, 0x02faa6ae, 0x03aed86c, 0x00e0db81, 0x014307ae, 0x01c79159, 0x02307c68, 0x0035e5e1}}}, + {X: Field{[10]uint32{0x033ff70d, 0x0223b90d, 0x00b01e24, 0x00ea736d, 0x038f336f, 0x03b38718, 0x02367eb5, 0x0064de4f, 0x00a27732, 0x002c66bd}}, Y: Field{[10]uint32{0x00821dec, 0x01357de7, 0x0241dc21, 0x0337553d, 0x03b9e73f, 0x01aa3b9c, 0x037f27a2, 0x0168b509, 0x0039a510, 0x0028faa2}}}, + {X: Field{[10]uint32{0x00f6755e, 0x01e0bdad, 0x02066acf, 0x00b69223, 0x0235f24e, 0x024c925c, 0x00b6126b, 0x0277dbca, 0x0329548a, 0x00072307}}, Y: Field{[10]uint32{0x01ff432d, 0x017be584, 0x030c9179, 0x008ea198, 0x0278108b, 0x0065a81f, 0x00c7e2a3, 0x006bb173, 0x03526a1e, 0x00069e6a}}}, + {X: Field{[10]uint32{0x015716ce, 0x00454faf, 0x021d4f0b, 0x01d44b10, 0x00e4d700, 0x010c4e5a, 0x00a10b7b, 0x030f08f2, 0x01da1ad6, 0x002dbfe3}}, Y: Field{[10]uint32{0x01ce61b8, 0x00c1be69, 0x0232d7c9, 0x030aaa1e, 0x00af8dbe, 0x036cf807, 0x00d21e4e, 0x01059f28, 0x01c6b7b7, 0x00134e1a}}}, + {X: Field{[10]uint32{0x00f47b5c, 0x012233b4, 0x02ccb375, 0x02760c39, 0x00ec08cf, 0x03e82b58, 0x00219329, 0x02a12a06, 0x00acf61b, 0x00373bfd}}, Y: Field{[10]uint32{0x0137d6f9, 0x029bad70, 0x013b1736, 0x02c0e158, 0x00fb1b8d, 0x029292aa, 0x03d5508a, 0x0186d220, 0x00e192bc, 0x002526bb}}}, + {X: Field{[10]uint32{0x00a5ebef, 0x03bacdf7, 0x01c8b131, 0x0262fa14, 0x01843ccf, 0x028f3a10, 0x004aa189, 0x01a2725f, 0x03a7b709, 0x00155879}}, Y: Field{[10]uint32{0x019a14da, 0x007c56ea, 0x015a709a, 0x029b9977, 0x0233b924, 0x01ad0528, 0x00e6b7f2, 0x02f8d90c, 0x0017f298, 0x0012c423}}}, + {X: Field{[10]uint32{0x0395a257, 0x003265e8, 0x008027ca, 0x01516cf2, 0x019c56a2, 0x038193a7, 0x025d5bb2, 0x00565423, 0x017789b0, 0x00136625}}, Y: Field{[10]uint32{0x00b6e0d0, 0x007c8850, 0x02675795, 0x03396dc1, 0x00506964, 0x016c0271, 0x03200c9f, 0x001d5b16, 0x0333ac95, 0x002abaeb}}}, + {X: Field{[10]uint32{0x033bfc8e, 0x01a84bf8, 0x03668124, 0x00befd2b, 0x00e9da51, 0x019b3201, 0x02d55a9d, 0x00f12cc2, 0x026e0637, 0x0020ad63}}, Y: Field{[10]uint32{0x025ffb38, 0x03011e06, 0x013d387c, 0x01f4bfcd, 0x01d6d757, 0x03fd310a, 0x033b5c21, 0x0078dcb0, 0x022d98dc, 0x0020de04}}}, + {X: Field{[10]uint32{0x02c6cdf3, 0x0266fa00, 0x0063ad11, 0x01d4d9a5, 0x03714c3d, 0x03beb113, 0x017d8809, 0x01e12ff9, 0x008aa773, 0x003d27ea}}, Y: Field{[10]uint32{0x0218b3f4, 0x02a8e7e6, 0x00772b96, 0x02c12608, 0x02aa9855, 0x024d20ef, 0x03e72814, 0x02904722, 0x02c02164, 0x00106bfd}}}, + {X: Field{[10]uint32{0x00efd78c, 0x031633b0, 0x03073969, 0x03c035e2, 0x010ce910, 0x030614a9, 0x01b97a78, 0x01168630, 0x01dbac84, 0x0019f521}}, Y: Field{[10]uint32{0x00981e97, 0x01bcc821, 0x034be44e, 0x02e73c67, 0x01596f49, 0x022fc1f6, 0x00aa5a82, 0x00acc57f, 0x012a24ff, 0x001c776a}}}, + {X: Field{[10]uint32{0x0304d4cd, 0x02a58411, 0x0350adb2, 0x01fa2d74, 0x0030a46f, 0x0169c5d8, 0x0399883b, 0x00e30f3f, 0x02f2c190, 0x0024517d}}, Y: Field{[10]uint32{0x0222b0bc, 0x00036f9a, 0x00add567, 0x00aedb9e, 0x036c8e42, 0x035de2ce, 0x00664d54, 0x0317f875, 0x01e7852a, 0x0027645e}}}, + {X: Field{[10]uint32{0x02b2631b, 0x00f88fd1, 0x024b3550, 0x02260237, 0x01536740, 0x001c66af, 0x033848ce, 0x03d7c473, 0x0247efc2, 0x00124b54}}, Y: Field{[10]uint32{0x008fd750, 0x02e31020, 0x00863d50, 0x002ca49c, 0x009f021d, 0x02656935, 0x0168877c, 0x032261fb, 0x03627812, 0x000dd2c1}}}, + {X: Field{[10]uint32{0x03dd1dec, 0x02072985, 0x035490a3, 0x002d1861, 0x0125c661, 0x00af6e71, 0x018d2317, 0x0059e24a, 0x03b8bb81, 0x0016e377}}, Y: Field{[10]uint32{0x031f7568, 0x028d4c5e, 0x031cea92, 0x0030fa20, 0x03c7ae17, 0x00cf53ce, 0x010dee01, 0x0086345f, 0x0364fce3, 0x002d1f4d}}}, + {X: Field{[10]uint32{0x02406c65, 0x0174c3c3, 0x02c5c6a3, 0x03af6847, 0x00063c6f, 0x035531b5, 0x01e603cc, 0x005906bd, 0x03ba25a6, 0x002236dc}}, Y: Field{[10]uint32{0x0000a753, 0x01efc6d2, 0x0056b402, 0x03843051, 0x009b8b5b, 0x00a57e30, 0x004c67ae, 0x035edc22, 0x037b1c1d, 0x000e6c1b}}}, + {X: Field{[10]uint32{0x00382451, 0x020246a7, 0x03721fb3, 0x02f78cc3, 0x032a7037, 0x02c25558, 0x0185070b, 0x007ad0b3, 0x009aa23c, 0x000d2573}}, Y: Field{[10]uint32{0x029799ef, 0x00f843ed, 0x0064dd9b, 0x013d18bf, 0x030b82ff, 0x031d55ef, 0x00299573, 0x020b7dd1, 0x03216f39, 0x001ffaae}}}, + {X: Field{[10]uint32{0x0045d7a2, 0x026994b1, 0x034f1cd6, 0x014b0676, 0x010a4f7b, 0x0348c26c, 0x03756669, 0x00431e4f, 0x02a6970e, 0x003a2973}}, Y: Field{[10]uint32{0x02402b96, 0x007c3a8c, 0x01982b96, 0x0090a536, 0x02fab476, 0x01a3a305, 0x012dbf36, 0x0166ee5b, 0x02bfbd52, 0x0036ab36}}}, + {X: Field{[10]uint32{0x03931f9a, 0x0002d0d9, 0x02e32b57, 0x03cacacb, 0x0051af33, 0x0367bf94, 0x009c4837, 0x01eb78e6, 0x038ae81a, 0x0001ba31}}, Y: Field{[10]uint32{0x00291d35, 0x038a5d4b, 0x029ca47b, 0x024cc375, 0x027d1d51, 0x038429e0, 0x035412cb, 0x01068516, 0x0104751b, 0x00395991}}}, + {X: Field{[10]uint32{0x010a539e, 0x0345c24c, 0x01208ab4, 0x02ddd137, 0x00b9551d, 0x038ea4bb, 0x011722b1, 0x016cbe0a, 0x00a3010c, 0x002e3d48}}, Y: Field{[10]uint32{0x030f3d75, 0x02474025, 0x007909e2, 0x007b641d, 0x03a96d3d, 0x0245444f, 0x026451e1, 0x00b7b63d, 0x003ab671, 0x00196407}}}, + {X: Field{[10]uint32{0x02d8005a, 0x037b02ec, 0x00adfe49, 0x029f2e01, 0x00ae0dea, 0x028b05bf, 0x00bd9173, 0x02605622, 0x00586445, 0x002814e1}}, Y: Field{[10]uint32{0x020d7a67, 0x02329b77, 0x029c8ca5, 0x022cf581, 0x03e71260, 0x02624974, 0x00dab73f, 0x0327ee24, 0x030023dc, 0x0009e20b}}}, + {X: Field{[10]uint32{0x01222144, 0x03e28145, 0x036001fa, 0x000e704b, 0x022117cf, 0x030a566f, 0x018b631f, 0x0024907b, 0x0016aa7f, 0x00104a01}}, Y: Field{[10]uint32{0x037f58e4, 0x0205ec6b, 0x038e1808, 0x0138cabb, 0x02613f35, 0x010fdf81, 0x015c363c, 0x0210cfb9, 0x000dfd8e, 0x0030bfbe}}}, + {X: Field{[10]uint32{0x00c7a1ee, 0x023e2a86, 0x0241a7dd, 0x003ac142, 0x028b536f, 0x00f584ec, 0x01130b7e, 0x00f44147, 0x0336cbf8, 0x00312e3f}}, Y: Field{[10]uint32{0x027b4d47, 0x0359fb17, 0x037fc276, 0x0052b525, 0x01f6cf6c, 0x01d448e6, 0x02ba76b4, 0x00cded19, 0x004c8867, 0x0021f4f1}}}, + {X: Field{[10]uint32{0x00a51ac1, 0x029fd6a8, 0x002a93b7, 0x02e61b68, 0x031de630, 0x02df3495, 0x03850106, 0x00e38e9a, 0x013a7cb9, 0x00103ada}}, Y: Field{[10]uint32{0x036d8d18, 0x038db0eb, 0x0389fa51, 0x0293bea7, 0x01c7ede7, 0x0132e201, 0x003b770c, 0x0105f72f, 0x01e014d3, 0x0009ee1d}}}, + {X: Field{[10]uint32{0x0381dad4, 0x012a6f5f, 0x01fb86e9, 0x02137cdc, 0x00ac0c9d, 0x03cb77c9, 0x0365d675, 0x000601d4, 0x010254e3, 0x003dd246}}, Y: Field{[10]uint32{0x005a6e46, 0x03093357, 0x00c7c17a, 0x031cbb1a, 0x0268af0c, 0x0349d758, 0x01bf1b5a, 0x00203f72, 0x0336c549, 0x001a89c6}}}, + {X: Field{[10]uint32{0x009f287e, 0x014c9521, 0x032e36a0, 0x02b30d93, 0x02f16388, 0x01e88fe3, 0x026996c9, 0x00676853, 0x021de4ce, 0x0033c4c9}}, Y: Field{[10]uint32{0x03adac10, 0x002a5a1c, 0x02b7c04a, 0x020f1dc6, 0x008218c4, 0x02e1ca9e, 0x024ab51b, 0x01d11fdf, 0x018dbe1a, 0x00155a21}}}, + {X: Field{[10]uint32{0x013e8cb3, 0x00f1d86b, 0x02a81726, 0x005dcb1c, 0x0394cfd5, 0x00889a11, 0x01166066, 0x021f7f55, 0x02629dd0, 0x00271af6}}, Y: Field{[10]uint32{0x010c0eb3, 0x006d9e80, 0x030be05b, 0x0317896e, 0x019e5fbc, 0x018bff1e, 0x035628ed, 0x0329faec, 0x007b9c7f, 0x000b1df7}}}, + {X: Field{[10]uint32{0x01d26bf3, 0x02adf96e, 0x01922bb7, 0x01ef456c, 0x01c1526d, 0x02cc5256, 0x02cc9a55, 0x0277b083, 0x035f6443, 0x00363440}}, Y: Field{[10]uint32{0x00dbbe30, 0x006e5233, 0x003143eb, 0x00dae72d, 0x03b922a4, 0x02506efd, 0x007f697b, 0x03fa8fd8, 0x00d6ccfd, 0x002adf8d}}}, + {X: Field{[10]uint32{0x01c1d424, 0x02f08a34, 0x022a939c, 0x0296c028, 0x037d53ae, 0x00203c21, 0x032e1047, 0x01e98378, 0x0223b822, 0x0031bd02}}, Y: Field{[10]uint32{0x01d80345, 0x01af42f0, 0x0064d7fe, 0x01af96a3, 0x0263a313, 0x022c8dd2, 0x006f1f4b, 0x02317244, 0x018fcf4b, 0x00385af1}}}, + {X: Field{[10]uint32{0x03a43536, 0x0002e3d8, 0x02509494, 0x03358748, 0x01d1e007, 0x03388b78, 0x007c2dec, 0x034e95c5, 0x02229477, 0x000e9a76}}, Y: Field{[10]uint32{0x01a0e284, 0x030bef92, 0x03c3925c, 0x035ce272, 0x0246b98c, 0x026de73e, 0x00c95e1c, 0x01818b1f, 0x03d5c4ba, 0x0031e713}}}, + {X: Field{[10]uint32{0x0325fc9d, 0x01ede500, 0x0339b7bc, 0x020a42a8, 0x00814c3d, 0x01963c86, 0x037f6fca, 0x0312291a, 0x00e5492f, 0x0006d7ee}}, Y: Field{[10]uint32{0x007fff39, 0x01bef9f7, 0x02982164, 0x00d63bfa, 0x01d2ca42, 0x0124d6c0, 0x02f49f4c, 0x002064ad, 0x03124c9e, 0x00298a42}}}, + {X: Field{[10]uint32{0x009a3845, 0x02fa3b0d, 0x014c747b, 0x0088c7c1, 0x028a7559, 0x0069fe9f, 0x01e1c37d, 0x02d3ab72, 0x0302b004, 0x003f6e83}}, Y: Field{[10]uint32{0x011646fe, 0x0208088e, 0x0262ae2b, 0x02775cb5, 0x0106c3c0, 0x00c310f2, 0x02defd7e, 0x01c709bf, 0x01c9e964, 0x0010b698}}}, + {X: Field{[10]uint32{0x035140df, 0x03c32ce8, 0x01760f38, 0x010cbebc, 0x007c1663, 0x018ce262, 0x03279f70, 0x02598af9, 0x01bfcb7b, 0x0030e4e4}}, Y: Field{[10]uint32{0x02f556e1, 0x02d58f26, 0x02d664c5, 0x02075e94, 0x03449f9f, 0x03de7606, 0x00b8b3ff, 0x020b3121, 0x003453dc, 0x003a8538}}}, + {X: Field{[10]uint32{0x0059cbcb, 0x0385d102, 0x01321675, 0x00280886, 0x0019aedd, 0x01b2c831, 0x000e36cc, 0x032ca86b, 0x013dc716, 0x000953fc}}, Y: Field{[10]uint32{0x02e35921, 0x002b4ae4, 0x03701c40, 0x033e0fac, 0x00896e02, 0x011fd6fa, 0x036bfe32, 0x009abe78, 0x00f3916d, 0x00009913}}}, + {X: Field{[10]uint32{0x00930474, 0x0327d5ca, 0x00c5b071, 0x0176a9f2, 0x021769d3, 0x0215a009, 0x008974e9, 0x0192b68b, 0x0260e9b4, 0x0009392a}}, Y: Field{[10]uint32{0x00479f8e, 0x01cd4e3a, 0x02af78d9, 0x00e3672e, 0x036ed37c, 0x0332501b, 0x022244bc, 0x013f8202, 0x02d182a9, 0x00277df0}}}, + {X: Field{[10]uint32{0x017543a6, 0x00b13db4, 0x01ef8070, 0x03062ffc, 0x02fb19a4, 0x01667f00, 0x03d81b38, 0x01a170fb, 0x03adf906, 0x001eb66e}}, Y: Field{[10]uint32{0x01246f95, 0x02ab5931, 0x02df0133, 0x010d1249, 0x00da45e2, 0x02294cf7, 0x013ac8fd, 0x006293dc, 0x01709c40, 0x00261e2e}}}, + {X: Field{[10]uint32{0x02d8ae53, 0x00495958, 0x022b501d, 0x00e6f97e, 0x00c6e083, 0x01f7eeaa, 0x009eb2df, 0x021c5f83, 0x00d9383a, 0x0025f63f}}, Y: Field{[10]uint32{0x03c6a777, 0x0300a3c1, 0x0074c4a2, 0x0329fe3d, 0x03b1f114, 0x03616be9, 0x00363e15, 0x013e19fe, 0x024cf578, 0x00061e72}}}, + {X: Field{[10]uint32{0x02fe7572, 0x01c77762, 0x0172cb87, 0x03bd417b, 0x002af1ac, 0x0315bfeb, 0x014d1a92, 0x030cb878, 0x03855a08, 0x000f83f1}}, Y: Field{[10]uint32{0x02149390, 0x0396c25b, 0x020b5884, 0x03cf7c56, 0x01bb1768, 0x028c2d55, 0x0044fc9d, 0x022253c2, 0x03fcfd1e, 0x001b5e6d}}}, + {X: Field{[10]uint32{0x01602562, 0x01fb3ed9, 0x037ec55b, 0x039ff1d5, 0x02fda483, 0x02275bd7, 0x023a9b53, 0x03619076, 0x03dbb132, 0x00367685}}, Y: Field{[10]uint32{0x0223b70b, 0x03e318f1, 0x001a7b67, 0x017a2821, 0x0033a4f3, 0x03e3c8ec, 0x027f9e63, 0x0035c0bb, 0x01e45feb, 0x0020391c}}}, + {X: Field{[10]uint32{0x03ca18f3, 0x026026db, 0x039eca3d, 0x014e75be, 0x03f38e28, 0x02dc484a, 0x0135daa7, 0x0078d20a, 0x0366afcd, 0x0006123d}}, Y: Field{[10]uint32{0x036f5884, 0x003d1342, 0x00b7dee7, 0x03d2a4f5, 0x005f9196, 0x01d23b65, 0x0135df63, 0x0153c927, 0x0082645d, 0x0032a69e}}}, + {X: Field{[10]uint32{0x017a9f2f, 0x02728112, 0x02be0a84, 0x011fdcb1, 0x031a9d00, 0x03f0b457, 0x0165b2d4, 0x02b1d96b, 0x00ae9a7d, 0x003b4dd1}}, Y: Field{[10]uint32{0x02b5fb5b, 0x00d113da, 0x02f36b76, 0x0121c19b, 0x032fdc52, 0x00f11dfb, 0x0323d032, 0x031bdf92, 0x012ed4e5, 0x000f3ddb}}}, + {X: Field{[10]uint32{0x033676d7, 0x033fbf97, 0x026b7b1c, 0x0332a188, 0x0391212a, 0x000c49c1, 0x00a3a65e, 0x01516ac4, 0x0373edf3, 0x0031181e}}, Y: Field{[10]uint32{0x017eb3ec, 0x010824cf, 0x02d7728c, 0x02711771, 0x012628ac, 0x008c38f7, 0x000cd036, 0x03de0f57, 0x025b8595, 0x000c6b51}}}, + {X: Field{[10]uint32{0x000e96f0, 0x0392c2af, 0x00699641, 0x006d93ac, 0x00bfb9ad, 0x00e8fe94, 0x020af049, 0x01a75e2c, 0x02ed2aaf, 0x00070258}}, Y: Field{[10]uint32{0x01aede44, 0x015a92ab, 0x0012302d, 0x01828e5f, 0x02591b5a, 0x021e9fda, 0x029c5b0a, 0x038e8a90, 0x02f6e088, 0x00127c46}}}, + {X: Field{[10]uint32{0x01c19454, 0x02682637, 0x0045b1f0, 0x006ab989, 0x0182250e, 0x02ded0e0, 0x00dc6caf, 0x02567826, 0x036c9a41, 0x0001a811}}, Y: Field{[10]uint32{0x0111c7e1, 0x014bb1bd, 0x0233fbe5, 0x02e7331f, 0x00ab4288, 0x03238d45, 0x0266cd37, 0x031324b0, 0x00978ae3, 0x0015a10b}}}, + {X: Field{[10]uint32{0x00191f1c, 0x019e0c28, 0x028f6b93, 0x0203a729, 0x02cdb59a, 0x00a7c0f1, 0x03149993, 0x002a829a, 0x00f653a3, 0x00009368}}, Y: Field{[10]uint32{0x00138235, 0x00b1d5cb, 0x00b53d1a, 0x01a67880, 0x00cdbd3b, 0x00187185, 0x010683af, 0x02f3d6e0, 0x0080aa78, 0x0020f9e4}}}, + {X: Field{[10]uint32{0x021a7764, 0x00dd0fe6, 0x0075f6f3, 0x023c089f, 0x02a07872, 0x00c99100, 0x00719010, 0x02741fd6, 0x00832247, 0x00001b0d}}, Y: Field{[10]uint32{0x00dcc4c6, 0x024b02e8, 0x01bffeb1, 0x0043c361, 0x00be7792, 0x016f6916, 0x03128d84, 0x015021af, 0x03744a12, 0x0028ddeb}}}, + {X: Field{[10]uint32{0x01c43baf, 0x01e3e675, 0x00905154, 0x03d28525, 0x011cdc26, 0x020acdb8, 0x02cf2498, 0x032c9ac9, 0x03bb4d14, 0x00084aaa}}, Y: Field{[10]uint32{0x0047e281, 0x0358140e, 0x01148ca1, 0x028ff099, 0x0011c22e, 0x02ea3961, 0x02ed57d7, 0x0160ae63, 0x020a81d1, 0x003a4502}}}, + {X: Field{[10]uint32{0x0343b10e, 0x005096ac, 0x011edf37, 0x031092a5, 0x02f26ee0, 0x02c2e89c, 0x006824e5, 0x02882a35, 0x00f12afc, 0x00289d1e}}, Y: Field{[10]uint32{0x004036a3, 0x020292ef, 0x017598ec, 0x028df1f3, 0x0270ad0b, 0x01e0635e, 0x03bdecb6, 0x025ea968, 0x0386a7fc, 0x001479d2}}}, + {X: Field{[10]uint32{0x0172e293, 0x03dc4681, 0x03fe5716, 0x001fa336, 0x02b9b8a5, 0x03d57838, 0x022fa7e8, 0x03e7ae8b, 0x029a7171, 0x00387049}}, Y: Field{[10]uint32{0x02afba46, 0x024cd70c, 0x00848e63, 0x029db40d, 0x005562c4, 0x03a09da1, 0x00d8e242, 0x00c90be6, 0x01700895, 0x001073e8}}}, + {X: Field{[10]uint32{0x01e09efb, 0x0209f03d, 0x007804d5, 0x022c9082, 0x0062f0f7, 0x03303ef6, 0x03328e1e, 0x0238642e, 0x004c1941, 0x00081355}}, Y: Field{[10]uint32{0x03d52fb7, 0x015c1664, 0x009f06d0, 0x03514d39, 0x0018cf4e, 0x013e6030, 0x023799cb, 0x00561c42, 0x00e31f5d, 0x00319826}}}, + {X: Field{[10]uint32{0x025172ad, 0x0121b15e, 0x016ee361, 0x02c8eac6, 0x00980138, 0x01e2d33c, 0x0230de2f, 0x03cbcb7c, 0x030a11a6, 0x0005bb77}}, Y: Field{[10]uint32{0x01992684, 0x028338ad, 0x0318bb39, 0x02d3ee05, 0x001327bd, 0x0040b108, 0x004a7926, 0x02cf0648, 0x018fed8a, 0x0038f6cd}}}, + {X: Field{[10]uint32{0x038995f1, 0x020a74ca, 0x0080eaf6, 0x0069e72c, 0x013df700, 0x008c54de, 0x026b7c10, 0x0365ad97, 0x00312298, 0x001f27de}}, Y: Field{[10]uint32{0x01f51e5c, 0x006551bb, 0x000e4a60, 0x0346eedc, 0x02b2481d, 0x014f2ccb, 0x002018fc, 0x0283c6c9, 0x003c90e3, 0x00080df3}}}, + {X: Field{[10]uint32{0x0198fb1c, 0x01a2c598, 0x02dee211, 0x03a54c31, 0x0263aee7, 0x00b5a580, 0x03913a5b, 0x02e3db06, 0x01461dbe, 0x0004a70b}}, Y: Field{[10]uint32{0x01137964, 0x02b097d5, 0x00dc1747, 0x02fdf3a8, 0x027bbd80, 0x00a1f559, 0x0214b72a, 0x009fe68a, 0x02b961c0, 0x000a7ffb}}}, + {X: Field{[10]uint32{0x036175aa, 0x02812707, 0x03b12570, 0x009f818c, 0x02de2049, 0x00c896d4, 0x011f9daa, 0x024cbbdb, 0x016530d4, 0x0022f8b9}}, Y: Field{[10]uint32{0x005510c8, 0x03060014, 0x0340423c, 0x02f5a9a1, 0x03fabfe4, 0x00f02547, 0x0007056e, 0x00334500, 0x02871a13, 0x000d92d3}}}, + {X: Field{[10]uint32{0x0252fa6c, 0x024265d8, 0x00c5e27c, 0x00b97e20, 0x0142a6e1, 0x014ed310, 0x00ceb624, 0x02719eac, 0x030842ae, 0x00102d0f}}, Y: Field{[10]uint32{0x02a2068f, 0x00a812f3, 0x02cca443, 0x03fb448f, 0x00248f11, 0x03168b4b, 0x025e46f2, 0x00b96ec8, 0x02c5de1b, 0x001b46b1}}}, + {X: Field{[10]uint32{0x02c669df, 0x011ce816, 0x00f17087, 0x026f8dc9, 0x014c2cba, 0x00f1276d, 0x01caa559, 0x0137cf3c, 0x038a02f3, 0x0011f888}}, Y: Field{[10]uint32{0x00f31f3a, 0x026fa0a7, 0x01908939, 0x009d8237, 0x00acfc61, 0x00294bdf, 0x02104a36, 0x00957fb2, 0x03a203ee, 0x00134133}}}, + {X: Field{[10]uint32{0x01cfc35a, 0x029727b8, 0x02d607c7, 0x012d77e3, 0x03b3de47, 0x01315975, 0x00433238, 0x031b6ad2, 0x00553a45, 0x0005ca1b}}, Y: Field{[10]uint32{0x0320007f, 0x01c8f258, 0x000cf6d8, 0x0091e4cd, 0x035b194d, 0x02550c41, 0x03104b27, 0x01454582, 0x034775a4, 0x00185cb4}}}, + {X: Field{[10]uint32{0x01d7bb31, 0x02c810a3, 0x01258b7f, 0x0325367b, 0x010a3e96, 0x0158cab1, 0x010bd344, 0x024b2b42, 0x039d3c14, 0x000d146b}}, Y: Field{[10]uint32{0x014974d6, 0x03e2d06c, 0x0079acc5, 0x004e49f3, 0x007687c5, 0x013068ec, 0x0284fd78, 0x01b81b9c, 0x03832123, 0x0037524c}}}, + {X: Field{[10]uint32{0x014e5ce2, 0x03409480, 0x01619d23, 0x00e96caa, 0x00ed9afa, 0x01b82b11, 0x01bee2da, 0x0179ff2d, 0x0081eccc, 0x002c02a9}}, Y: Field{[10]uint32{0x008866a1, 0x032a3efa, 0x022424a2, 0x02a79f9d, 0x0210d732, 0x0107e07e, 0x002ceb74, 0x00cb383d, 0x00861f00, 0x0001a1ed}}}, + {X: Field{[10]uint32{0x00b23311, 0x01571fa8, 0x01e2fa8a, 0x035301d8, 0x020ef706, 0x0135cd6c, 0x008a2393, 0x03247fc9, 0x029cc75b, 0x0014fb23}}, Y: Field{[10]uint32{0x01d45919, 0x00413d91, 0x027688b5, 0x012e7f60, 0x00c352f5, 0x0175716a, 0x01104e01, 0x02c7b46d, 0x03c063c4, 0x0006c477}}}, + {X: Field{[10]uint32{0x01efab66, 0x02461b29, 0x030a4cdc, 0x01e1eaed, 0x032fc80d, 0x01c78ce0, 0x03eddd8d, 0x00b268ec, 0x01b39c07, 0x0007b378}}, Y: Field{[10]uint32{0x026dd626, 0x02b82f2b, 0x025f30da, 0x00c25228, 0x00239f0c, 0x00812734, 0x00cecb18, 0x025d8adc, 0x02c75a79, 0x00013d6b}}}, + {X: Field{[10]uint32{0x03b1394e, 0x0321d526, 0x012e65af, 0x02759dc1, 0x011e9023, 0x02823be9, 0x039b479f, 0x015631ea, 0x03c3702b, 0x00007f8b}}, Y: Field{[10]uint32{0x02845c2c, 0x02f5c831, 0x0326d30f, 0x003229f6, 0x0211a64c, 0x01b523f9, 0x016df2b6, 0x0174eb08, 0x02ae3a39, 0x003dad61}}}, + {X: Field{[10]uint32{0x006d5dec, 0x01c62c78, 0x039ba872, 0x0314a296, 0x0376e64c, 0x03c0c71e, 0x02ba0c20, 0x00ab5560, 0x032fb8ac, 0x002d4f42}}, Y: Field{[10]uint32{0x02e3a289, 0x03c0d3a4, 0x0087b351, 0x01de51da, 0x02041015, 0x01f48c94, 0x03b034c1, 0x021ea992, 0x018951ab, 0x00226139}}}, + {X: Field{[10]uint32{0x0337cf95, 0x02b784a3, 0x02ea7bc0, 0x00428845, 0x01a06ca3, 0x03ccd760, 0x03fe5d81, 0x008d999c, 0x011603bc, 0x00001539}}, Y: Field{[10]uint32{0x0312bd4a, 0x00e9e05c, 0x030b4c5b, 0x01e92e64, 0x01923660, 0x03a05cd5, 0x037206d6, 0x00b0afc6, 0x00269deb, 0x003d1c72}}}, + {X: Field{[10]uint32{0x03b29a7b, 0x036ca0d9, 0x01f598c4, 0x02b19754, 0x013b8087, 0x0322eae4, 0x01e22244, 0x008e8b4e, 0x0372a1d4, 0x0039fbed}}, Y: Field{[10]uint32{0x03a9b6e7, 0x039171e4, 0x023bd587, 0x0282854b, 0x03704a39, 0x01fda863, 0x02b47f41, 0x0022c2fc, 0x0186031d, 0x003cb7ed}}}, + {X: Field{[10]uint32{0x00b519fe, 0x011ae634, 0x03e67034, 0x00ab7020, 0x010b163f, 0x027bc0c8, 0x03b43097, 0x018ea0ab, 0x01aae8a2, 0x0017b167}}, Y: Field{[10]uint32{0x01ef82b9, 0x0057aa1e, 0x0304e842, 0x01bd7016, 0x03a8a531, 0x01395613, 0x01c6aab9, 0x03ab94c3, 0x00c36a3d, 0x000baad3}}}, + {X: Field{[10]uint32{0x00bb62f5, 0x032e40f5, 0x0121658c, 0x01a71034, 0x0001119f, 0x03f07c26, 0x02975c8e, 0x0277ef6b, 0x00d92058, 0x00109ed7}}, Y: Field{[10]uint32{0x02d1213d, 0x011a1995, 0x01b18d98, 0x028c1a1c, 0x006500b5, 0x017f2a1e, 0x022803c3, 0x01210905, 0x02e3b879, 0x00341579}}}, + {X: Field{[10]uint32{0x0105bcad, 0x02113be7, 0x00736554, 0x03630344, 0x002cc30d, 0x03750b2e, 0x03422c79, 0x013cf423, 0x0315fc59, 0x00152552}}, Y: Field{[10]uint32{0x0335373a, 0x011cd33d, 0x0397564b, 0x03d7af30, 0x029c6b88, 0x00680392, 0x03f8e042, 0x027080ab, 0x00657356, 0x0021a9f3}}}, + {X: Field{[10]uint32{0x01f32559, 0x016879ac, 0x021f01b5, 0x02019e8a, 0x03573eb4, 0x0255a194, 0x01aa7b33, 0x003efca8, 0x038d2367, 0x003fdbe3}}, Y: Field{[10]uint32{0x02c7e218, 0x02b07706, 0x017cd2d4, 0x03d0fe3d, 0x0336cd33, 0x027f6511, 0x031552f0, 0x02f15f5c, 0x01a6c7ca, 0x001e94fc}}}, + {X: Field{[10]uint32{0x018a2381, 0x00309965, 0x0152b842, 0x03ee2805, 0x023bba8e, 0x007832e2, 0x02d852f4, 0x030843a0, 0x01e99021, 0x001d35c9}}, Y: Field{[10]uint32{0x01bb2bb0, 0x02d6153d, 0x0227c0ae, 0x039809b2, 0x0192f18d, 0x00405b76, 0x03d6ca4e, 0x01c2ee20, 0x0246aa9f, 0x0013b9a5}}}, + {X: Field{[10]uint32{0x009c845b, 0x030c9479, 0x008d76d3, 0x01c35dd1, 0x01feca05, 0x01636176, 0x0168fbbc, 0x010b270b, 0x037efc03, 0x003a50e7}}, Y: Field{[10]uint32{0x02233916, 0x006f808f, 0x03592203, 0x039ea4a1, 0x01566667, 0x03435c19, 0x0290b459, 0x0095ebbb, 0x01981b7e, 0x0009f683}}}, + {X: Field{[10]uint32{0x01c0b911, 0x01572c29, 0x00f1e2c0, 0x00ca7cb1, 0x0305facb, 0x00fff44c, 0x0126622b, 0x002159b7, 0x008d81a6, 0x0025a129}}, Y: Field{[10]uint32{0x024e68b2, 0x00d4cafc, 0x018161be, 0x00979ebc, 0x03294bbd, 0x0179ed39, 0x0187c31f, 0x03eea975, 0x02d250ad, 0x002480e2}}}, + {X: Field{[10]uint32{0x020e7609, 0x01df25c6, 0x019b4162, 0x00dd7e74, 0x009e4cf8, 0x037161ca, 0x030f1214, 0x0389bb1f, 0x02f90469, 0x0007400e}}, Y: Field{[10]uint32{0x031e5123, 0x02bfa7bd, 0x02139c84, 0x0069f0df, 0x00ed795f, 0x011b4981, 0x031dad81, 0x00b1c82c, 0x03a53082, 0x002671f0}}}, + {X: Field{[10]uint32{0x0197a149, 0x019272b8, 0x0242d01c, 0x02ff1805, 0x010d680a, 0x027dcb02, 0x0032fa58, 0x02aadddb, 0x00f873cf, 0x003e591a}}, Y: Field{[10]uint32{0x02083b1d, 0x00f9353e, 0x036e9979, 0x021b0624, 0x03b67081, 0x014e15f8, 0x00a7ff33, 0x0174c6c9, 0x03c40849, 0x0007fed2}}}, + {X: Field{[10]uint32{0x03f89d32, 0x001104ac, 0x025f5329, 0x03d947b1, 0x03d93c14, 0x00c4542f, 0x02c86a21, 0x02534af2, 0x0106e302, 0x002dab50}}, Y: Field{[10]uint32{0x00d228ce, 0x00a9398e, 0x003ee5db, 0x024a4307, 0x034fa407, 0x01310ad0, 0x015201cc, 0x02590741, 0x02a67427, 0x000668d9}}}, + {X: Field{[10]uint32{0x005b9b9a, 0x01f9f3f9, 0x00108a97, 0x00a1b2c7, 0x0202d478, 0x02eda7ec, 0x020fec3e, 0x03cc1644, 0x02f7190b, 0x0021d51c}}, Y: Field{[10]uint32{0x01a97c21, 0x029e2615, 0x00562050, 0x0238c151, 0x030a172d, 0x017e0127, 0x01d163a9, 0x0166b785, 0x03c5f5dc, 0x0006b7bf}}}, + {X: Field{[10]uint32{0x0227a670, 0x03bac166, 0x034074d9, 0x0356bd29, 0x0354bb6f, 0x0072c6c7, 0x00f7ae2a, 0x01505399, 0x01faf424, 0x0015116a}}, Y: Field{[10]uint32{0x01418018, 0x01d0713a, 0x0294ce87, 0x03a987f7, 0x013bdf07, 0x00fede87, 0x008978ca, 0x038208f9, 0x02077da2, 0x00125b14}}}, + {X: Field{[10]uint32{0x0014d138, 0x01330f5e, 0x0262bf4c, 0x03e5f07d, 0x0374d3a8, 0x0215a0c3, 0x03350267, 0x02b22147, 0x0225704b, 0x0036b861}}, Y: Field{[10]uint32{0x03be6f87, 0x02f6a440, 0x02bff373, 0x03ef1a38, 0x03c20f62, 0x017b20d7, 0x0188ee63, 0x0018660e, 0x01fd7ba9, 0x002af016}}}, + {X: Field{[10]uint32{0x019845c9, 0x032a24e7, 0x00d02dee, 0x02047fa5, 0x013d009b, 0x001f864a, 0x00e659c1, 0x00f7971f, 0x0312e852, 0x00228223}}, Y: Field{[10]uint32{0x0229114a, 0x02c3dd9f, 0x004baef7, 0x011ff179, 0x0041f8df, 0x03062c82, 0x02d703cb, 0x02edd974, 0x012afb8e, 0x00109448}}}, + {X: Field{[10]uint32{0x03af6d01, 0x02d4b935, 0x02f6ec25, 0x033caf3a, 0x00716755, 0x023d5e44, 0x00ed25c7, 0x002344cd, 0x02a88f3b, 0x0035e3d1}}, Y: Field{[10]uint32{0x0306f44d, 0x0149bbd6, 0x006ee5c9, 0x034c9091, 0x01929046, 0x032fc6cb, 0x00b3f019, 0x008043c8, 0x01f229cb, 0x003ac615}}}, + {X: Field{[10]uint32{0x019b034b, 0x0035717e, 0x02fa83ec, 0x0271beab, 0x02f58980, 0x03fbf375, 0x015c4cac, 0x00389d79, 0x031278ae, 0x000782d0}}, Y: Field{[10]uint32{0x004918a7, 0x028a2064, 0x036578bb, 0x02b8275c, 0x03fb523f, 0x020d2140, 0x03d74edb, 0x00ead0ba, 0x03c5544d, 0x003ce314}}}, + {X: Field{[10]uint32{0x017cbbd1, 0x00d1197b, 0x01638cd5, 0x03dc3105, 0x00ab02d7, 0x029623cd, 0x0011f144, 0x0046703d, 0x01b29edb, 0x003c0c55}}, Y: Field{[10]uint32{0x00e85813, 0x034fc1ae, 0x02495599, 0x0125fe71, 0x01317367, 0x00658159, 0x01d07cd3, 0x03fc52d0, 0x03e3ff4f, 0x001cb454}}}, + {X: Field{[10]uint32{0x01de4c8e, 0x025b8e79, 0x02b4153a, 0x01e1b42e, 0x038df665, 0x01059952, 0x00c84fe3, 0x01fed345, 0x01683edc, 0x0003d87f}}, Y: Field{[10]uint32{0x002e5f92, 0x011cb8f5, 0x0212fd38, 0x00e7d636, 0x02e11fc1, 0x00983f93, 0x01d6884d, 0x004ec621, 0x0167cf09, 0x00254b6d}}}, + {X: Field{[10]uint32{0x0017dd77, 0x0271fdf8, 0x0344d7ee, 0x03612c7c, 0x0201ede6, 0x00e9361b, 0x0300e3b1, 0x00dec972, 0x027a29e4, 0x001e0c43}}, Y: Field{[10]uint32{0x0182f2d2, 0x00406db8, 0x00a51a7d, 0x00fd0c4d, 0x007030bd, 0x01f080b5, 0x020f7009, 0x00a78130, 0x018a4d56, 0x0009bfcd}}}, + {X: Field{[10]uint32{0x03781a3a, 0x0009f847, 0x016b97a4, 0x012f2282, 0x034e6ac9, 0x002d87af, 0x01509c2d, 0x00a72e98, 0x004d6b73, 0x0018eba3}}, Y: Field{[10]uint32{0x00d14f88, 0x020fa577, 0x016ce2e4, 0x00a7be2e, 0x01af16c9, 0x00e2a4e8, 0x01629cb3, 0x01e15f46, 0x00cfbf40, 0x002a3a55}}}, + {X: Field{[10]uint32{0x03cca739, 0x01e5c941, 0x02fa9165, 0x009bfde6, 0x00ae662f, 0x00ce15d3, 0x01039616, 0x00d53b8b, 0x012a594b, 0x00252356}}, Y: Field{[10]uint32{0x02f1876c, 0x03219ec0, 0x015570ed, 0x02293b89, 0x01ce0275, 0x01cef5b5, 0x013992f7, 0x00e5ba27, 0x00e25ea0, 0x000dffe6}}}, + {X: Field{[10]uint32{0x02100f45, 0x038b4d11, 0x03a55398, 0x01853719, 0x00660a41, 0x02ffba20, 0x0304de18, 0x000da142, 0x016fa314, 0x00194f3c}}, Y: Field{[10]uint32{0x025a9202, 0x0076cd44, 0x01c3649c, 0x0064f985, 0x03ea4d34, 0x0390c416, 0x026741ae, 0x0395499d, 0x02de5ff1, 0x002b2aab}}}, + {X: Field{[10]uint32{0x028cc782, 0x01447fe3, 0x00d2af3c, 0x02219142, 0x01141e18, 0x039a9de2, 0x00fd1ee0, 0x03722fc9, 0x00828a5e, 0x0011beda}}, Y: Field{[10]uint32{0x03fd8887, 0x020f804d, 0x010cfef3, 0x02611fb2, 0x02f4d266, 0x020b0b8d, 0x009ff4ae, 0x03a6f5ab, 0x013fd52c, 0x002752b9}}}, + {X: Field{[10]uint32{0x0138c0ed, 0x0308015c, 0x020eae24, 0x0021e8ab, 0x024ca442, 0x012c3ca2, 0x01face2b, 0x00a9c5f0, 0x00c723ea, 0x0017c468}}, Y: Field{[10]uint32{0x000c8452, 0x01ccc5ae, 0x011d5bb2, 0x033c1be6, 0x023906ea, 0x0049b939, 0x03925ddf, 0x0184bee9, 0x0084ad97, 0x0017b2bb}}}, + {X: Field{[10]uint32{0x02a9039f, 0x02f72130, 0x022c0320, 0x00ecfae9, 0x00dbf2ba, 0x03ac4224, 0x02b6b3bd, 0x03bde9b5, 0x021c929b, 0x002e7d27}}, Y: Field{[10]uint32{0x0101e558, 0x01a0832d, 0x0115c2bf, 0x0131bd0b, 0x006e1b68, 0x00d2a80c, 0x00ecc1c5, 0x022deef4, 0x02767e4f, 0x00261ca7}}}, + {X: Field{[10]uint32{0x01ade2c3, 0x00e39c85, 0x012dc63c, 0x02c0d8c7, 0x00965dc2, 0x03269182, 0x033eea76, 0x02417fc9, 0x0102e7d2, 0x0003b228}}, Y: Field{[10]uint32{0x034371c0, 0x028fb73d, 0x00b6dbe5, 0x0170da33, 0x02706ffe, 0x03d9c584, 0x03836868, 0x025b2d24, 0x01e7242d, 0x00363226}}}, + {X: Field{[10]uint32{0x03e236c6, 0x0339810a, 0x02dafcda, 0x02c0e73d, 0x010582c5, 0x010a9496, 0x012a3c77, 0x020169b2, 0x02b3c351, 0x00041fc0}}, Y: Field{[10]uint32{0x019bfb9f, 0x03ce272a, 0x00a3e685, 0x017820b1, 0x03c5c2d5, 0x0371c929, 0x01746858, 0x01d8055f, 0x02bf1ab4, 0x00145c8d}}}, + {X: Field{[10]uint32{0x02298971, 0x018194d5, 0x036cfb98, 0x01eb6bdb, 0x02b10d63, 0x020c5e1c, 0x038c1fea, 0x03005b5e, 0x00a1a5c1, 0x003c3ec5}}, Y: Field{[10]uint32{0x024540d1, 0x02f151e5, 0x0033792f, 0x03fecc59, 0x00c40b89, 0x00a00007, 0x018e87c7, 0x03997509, 0x01140d33, 0x0038767b}}}, + {X: Field{[10]uint32{0x00489459, 0x03e6cd51, 0x0347a333, 0x002bfe0e, 0x0078a1c8, 0x03af781a, 0x00ce83c0, 0x013b7bdb, 0x02dbea78, 0x00294dc6}}, Y: Field{[10]uint32{0x00129224, 0x0338fcb2, 0x03edd48e, 0x02f33344, 0x007e3d09, 0x00a88b2f, 0x03acbe7b, 0x0175d1dc, 0x0172127f, 0x003d5e01}}}, + {X: Field{[10]uint32{0x0217300d, 0x013eb7ef, 0x013b999e, 0x005e580f, 0x022bbbb8, 0x03e9f64b, 0x00109715, 0x0295d84f, 0x025e1b0b, 0x000f00c7}}, Y: Field{[10]uint32{0x029c83f3, 0x0309cbab, 0x03e6bbf9, 0x035c70d8, 0x0079cb40, 0x035edb31, 0x00e65a2c, 0x00db751d, 0x03fb3920, 0x00349d68}}}, + {X: Field{[10]uint32{0x01a5318f, 0x0071a701, 0x0218b217, 0x02b948f3, 0x01f8a1b9, 0x00e48203, 0x0169a689, 0x02d4c282, 0x019e685d, 0x0021ed62}}, Y: Field{[10]uint32{0x01a775d4, 0x02bd23ff, 0x02c081f5, 0x03ebe673, 0x011b1166, 0x010ba134, 0x0140b01a, 0x02be968b, 0x0204e3f0, 0x0001ab8c}}}, + {X: Field{[10]uint32{0x01b8bf74, 0x01014042, 0x038dd2ae, 0x0138ffa0, 0x01ea00d0, 0x01adf9ec, 0x018eedb5, 0x0305b7e7, 0x03ddc002, 0x00367c1d}}, Y: Field{[10]uint32{0x033ffeaf, 0x0084996b, 0x012f278f, 0x000bb954, 0x0211c273, 0x01c32e7b, 0x00fc486f, 0x0063894f, 0x011e5031, 0x00194635}}}, + {X: Field{[10]uint32{0x00921af7, 0x031c873e, 0x0398ec9b, 0x02482bbe, 0x037558a4, 0x0089dfd8, 0x01ce3053, 0x02b32582, 0x03638d15, 0x0027026a}}, Y: Field{[10]uint32{0x00e0f6fc, 0x0292de40, 0x033d91ca, 0x012a7ef7, 0x010bf2f8, 0x0194897c, 0x02d6ab31, 0x02f0422f, 0x018d535a, 0x002cb2b1}}}, + {X: Field{[10]uint32{0x028a7fc0, 0x01b71ce6, 0x008ae167, 0x0037b439, 0x0052ab25, 0x030da689, 0x038948a5, 0x0248c973, 0x038b4c2d, 0x001bb47b}}, Y: Field{[10]uint32{0x02742008, 0x02b21fbd, 0x00585f54, 0x02f07241, 0x025c6423, 0x018f69d6, 0x02741368, 0x014553f2, 0x008c2cfe, 0x00306de8}}}, + {X: Field{[10]uint32{0x006928d1, 0x034ef894, 0x018f13fb, 0x02a4c1e7, 0x03cfc458, 0x00ae9821, 0x01f71c1e, 0x01fdb09e, 0x0170154b, 0x00220ba3}}, Y: Field{[10]uint32{0x03e64131, 0x00e9ce9b, 0x03d1d9b2, 0x0197b6ec, 0x0208b315, 0x019eb07c, 0x014ac62e, 0x0061ca42, 0x022e97c4, 0x0022526c}}}, + {X: Field{[10]uint32{0x037aba52, 0x0284e7ec, 0x0246aa6d, 0x03a7f08c, 0x00516840, 0x00942605, 0x019d0afb, 0x01ba81c4, 0x02a024c8, 0x001c211c}}, Y: Field{[10]uint32{0x028fe5ac, 0x014feec4, 0x0130db7a, 0x01ee0335, 0x013a8b05, 0x02528d99, 0x03378d65, 0x0054ca96, 0x03a51d55, 0x0026026d}}}, + {X: Field{[10]uint32{0x039fac3e, 0x02a330eb, 0x025ebd87, 0x00f5c688, 0x03769d57, 0x023420d4, 0x01a1250d, 0x02dc212b, 0x02d509a8, 0x000e913e}}, Y: Field{[10]uint32{0x037f20cd, 0x031a7ed2, 0x01c85cb0, 0x0114b4f1, 0x03f9186e, 0x01849204, 0x0174bf84, 0x03434286, 0x01511250, 0x003ca7d1}}}, + {X: Field{[10]uint32{0x01fb9f30, 0x00dc2cf3, 0x0390afcc, 0x02116267, 0x0236ba4c, 0x00708cd8, 0x00564c04, 0x006f5058, 0x01d8e09e, 0x0028d467}}, Y: Field{[10]uint32{0x03881d7e, 0x034fb186, 0x0267472d, 0x0238d3f3, 0x02715008, 0x031d3423, 0x0199faa6, 0x001c4740, 0x01597c91, 0x001933fc}}}, + {X: Field{[10]uint32{0x00fcf1dc, 0x03c1d9d7, 0x038291c4, 0x03e835a3, 0x02bea1af, 0x027667fc, 0x033513f1, 0x0172593a, 0x00e3765f, 0x0016bc5b}}, Y: Field{[10]uint32{0x03815daa, 0x0100bae8, 0x023dc1f2, 0x02e2a1ea, 0x00511ff7, 0x0005929e, 0x0042db6b, 0x0047b52a, 0x02b53bd7, 0x00002193}}}, + {X: Field{[10]uint32{0x023d54a8, 0x0070b415, 0x0149b402, 0x0344de96, 0x0018848b, 0x00990410, 0x021ec080, 0x03970977, 0x012219ca, 0x0007fe69}}, Y: Field{[10]uint32{0x0318e031, 0x0320ec05, 0x014d4791, 0x0370526c, 0x018f85d7, 0x014dd0c2, 0x00fb919a, 0x01db86d7, 0x034c1222, 0x00151b58}}}, + {X: Field{[10]uint32{0x03d3e938, 0x01b75bd0, 0x0082ac6b, 0x0372a999, 0x007f02fc, 0x03eacda3, 0x00926ebc, 0x007b63e1, 0x00ad72a5, 0x0035e9b7}}, Y: Field{[10]uint32{0x00e41c96, 0x018ec885, 0x03278bde, 0x01601b25, 0x018598a0, 0x01119aba, 0x028f378e, 0x02b21969, 0x00d63ea6, 0x002689cf}}}, + {X: Field{[10]uint32{0x0332d797, 0x02a34647, 0x012823f4, 0x024c7c88, 0x023c874b, 0x02db3531, 0x016dfb52, 0x0331f69a, 0x03e55bdc, 0x000553d8}}, Y: Field{[10]uint32{0x03f76fae, 0x01644d5d, 0x0067a2df, 0x01f6cd03, 0x02f0f29d, 0x00aa9af1, 0x03269b0d, 0x028723a9, 0x032217bc, 0x003a63e5}}}, + {X: Field{[10]uint32{0x00399bf1, 0x03b1d613, 0x01991c27, 0x036a1f3a, 0x02dbdbb7, 0x0086ef7a, 0x0129095c, 0x01857333, 0x008b8513, 0x003dab78}}, Y: Field{[10]uint32{0x03234ad1, 0x01eb4ce3, 0x0296af03, 0x03284c63, 0x013fc1c5, 0x00a298c4, 0x01af074b, 0x032ae84c, 0x03e019fc, 0x00263206}}}, + {X: Field{[10]uint32{0x0347637e, 0x0072cb31, 0x0083a3e5, 0x03da50ea, 0x00b786b3, 0x017fb0af, 0x01290486, 0x0057db1b, 0x02c03b27, 0x00259873}}, Y: Field{[10]uint32{0x035358bf, 0x01d58813, 0x032547fe, 0x00d657c2, 0x03cb9c37, 0x027b1ce7, 0x028056a0, 0x00412dd2, 0x03d99b34, 0x003aa87d}}}, + {X: Field{[10]uint32{0x015d19a1, 0x01262d19, 0x0377f53d, 0x0333d6b1, 0x03480520, 0x000dc170, 0x0003465f, 0x00231cd3, 0x023a27d6, 0x0038294c}}, Y: Field{[10]uint32{0x020cc606, 0x02f58a49, 0x03aee836, 0x02d639f2, 0x0363d88e, 0x0118a5d7, 0x00606798, 0x03158baf, 0x0178a8b8, 0x0007dc9f}}}, + {X: Field{[10]uint32{0x002f6409, 0x0338c74a, 0x00118c24, 0x02577b39, 0x0308206e, 0x009431ab, 0x001980d5, 0x011bcbca, 0x02fd0046, 0x002eae0b}}, Y: Field{[10]uint32{0x011fb82a, 0x03356123, 0x0177d137, 0x02ed1ade, 0x03cafbdb, 0x0195b157, 0x038375a5, 0x00049a37, 0x01dc26a2, 0x000a982c}}}, + {X: Field{[10]uint32{0x01eb2631, 0x02052b78, 0x022c221e, 0x0081e79a, 0x032d7edd, 0x03946ebb, 0x006e9b3e, 0x02562c60, 0x0399ebbe, 0x000e2784}}, Y: Field{[10]uint32{0x029ae2be, 0x01167db3, 0x02fd52c9, 0x02f50d79, 0x00e48ada, 0x004a9893, 0x031fb4d1, 0x03f91679, 0x02331f3c, 0x001b0561}}}, + {X: Field{[10]uint32{0x029d4515, 0x001dc9dc, 0x000458c3, 0x01846e91, 0x01087d89, 0x03e91447, 0x03081747, 0x0154f467, 0x01cac0dc, 0x002de05e}}, Y: Field{[10]uint32{0x003e0de2, 0x0248d47a, 0x00c97a68, 0x0326ee5d, 0x01ce0a80, 0x0115df5c, 0x00caa5a9, 0x01a941b9, 0x02980c49, 0x001c082f}}}, + {X: Field{[10]uint32{0x03104306, 0x0053557f, 0x02dc9f1e, 0x03d04bb2, 0x02baa6a6, 0x03640163, 0x03d13fcf, 0x03e69c48, 0x013dd170, 0x00219fb3}}, Y: Field{[10]uint32{0x006759bb, 0x00d792a5, 0x00dc9e25, 0x038bf792, 0x03d698c5, 0x027cad50, 0x03276897, 0x03b88e3e, 0x03e1bb91, 0x000f036c}}}, + {X: Field{[10]uint32{0x00eecd38, 0x02f8bdb5, 0x004e5697, 0x00af055c, 0x03db25bb, 0x0212cb32, 0x03d4d083, 0x00097507, 0x014c26a1, 0x002f9c59}}, Y: Field{[10]uint32{0x01406afa, 0x02bdabd2, 0x001dfcdf, 0x039112cb, 0x012dcdae, 0x013683bf, 0x02f8d18e, 0x00b71e82, 0x020fc37a, 0x000c5bb4}}}, + {X: Field{[10]uint32{0x02e9079c, 0x037aea5d, 0x01fda6b6, 0x0111e58f, 0x01416905, 0x03478059, 0x015b9a2a, 0x009a179d, 0x00b024d6, 0x0016a387}}, Y: Field{[10]uint32{0x011ebba7, 0x022888bc, 0x00a27d08, 0x00aa4778, 0x023889db, 0x02377a57, 0x00f43516, 0x00c379ea, 0x01737433, 0x00131e4c}}}, + {X: Field{[10]uint32{0x002e6131, 0x005904ae, 0x031f8572, 0x003eb8f4, 0x03bb884d, 0x0018c114, 0x03a761ad, 0x02f433c4, 0x000b2347, 0x000efeb4}}, Y: Field{[10]uint32{0x02545f61, 0x02f6d0aa, 0x0051896e, 0x02adbd6c, 0x0371e3cb, 0x01b52060, 0x03fe8e63, 0x01ffb0fd, 0x01609415, 0x003bccf1}}}, + {X: Field{[10]uint32{0x012c1961, 0x00647bd7, 0x02dc7428, 0x00d4ed3c, 0x0360e026, 0x0171a32d, 0x016c2d2b, 0x03382722, 0x02de684d, 0x0000911f}}, Y: Field{[10]uint32{0x02f7bfcb, 0x009fcc07, 0x03377624, 0x01535b9f, 0x025ad6cb, 0x0110e090, 0x0339e554, 0x02182d8a, 0x002fe80f, 0x002b4e2a}}}, + {X: Field{[10]uint32{0x03cf985d, 0x0215f522, 0x0123909d, 0x001d05f1, 0x00e7685f, 0x02a379d9, 0x0007e49b, 0x02e7e3a2, 0x0321eeb4, 0x00297ab8}}, Y: Field{[10]uint32{0x034def1d, 0x02c408ea, 0x0296eed3, 0x0075229d, 0x01001788, 0x02799565, 0x015f5233, 0x02df4cab, 0x02a9f5c1, 0x000ab3e2}}}, + {X: Field{[10]uint32{0x0090b13c, 0x0395d6ba, 0x01251007, 0x0045710d, 0x03dc035e, 0x02ac17a3, 0x00a5b973, 0x0364e0f3, 0x015c5337, 0x0025f7a6}}, Y: Field{[10]uint32{0x0069e6dd, 0x02448438, 0x01f79e8f, 0x016f3624, 0x00920250, 0x01373bd4, 0x003fb4dc, 0x0228a4d3, 0x01692e30, 0x0013ecb6}}}, + {X: Field{[10]uint32{0x0038f479, 0x005c9b11, 0x01f3cc6b, 0x011151ac, 0x0125b70f, 0x002af7e5, 0x003dad8d, 0x02462be0, 0x025fa864, 0x002e32bc}}, Y: Field{[10]uint32{0x009c05c9, 0x0198f683, 0x02d79023, 0x00dac1a7, 0x02c30e2f, 0x01db01d2, 0x03a8c5a0, 0x01bacdbf, 0x01fac0f5, 0x001f146d}}}, + {X: Field{[10]uint32{0x0107b2e6, 0x0085d92b, 0x03443445, 0x02296c7c, 0x03b2cade, 0x03c50041, 0x00f3001a, 0x038a86c9, 0x028c1b96, 0x002d6f21}}, Y: Field{[10]uint32{0x0138d639, 0x02e8d9d2, 0x026f238b, 0x001ec852, 0x03672a8c, 0x015170ce, 0x02aa456f, 0x027ccf56, 0x02294e92, 0x00235b3f}}}, + {X: Field{[10]uint32{0x033ff602, 0x012a284d, 0x036e9078, 0x01887c4f, 0x0032ea26, 0x0090530a, 0x01b666bf, 0x00ec8843, 0x007c242a, 0x0017d456}}, Y: Field{[10]uint32{0x0346c858, 0x021a5122, 0x03427f58, 0x02299ab6, 0x031b3941, 0x02732ee7, 0x013950f9, 0x00293ae1, 0x020febf2, 0x000b0ec9}}}, + {X: Field{[10]uint32{0x022bcfde, 0x02d19d1e, 0x01feb822, 0x02558343, 0x034f08e6, 0x00113cfd, 0x0252e17e, 0x028ad44a, 0x00f95009, 0x000742f8}}, Y: Field{[10]uint32{0x033a159b, 0x01739363, 0x02538933, 0x02c93e19, 0x03a742c3, 0x01ee0776, 0x003181cf, 0x0061dcde, 0x03c3dbd8, 0x0030ea0a}}}, + {X: Field{[10]uint32{0x0122fb8a, 0x02bd2f23, 0x0192ccec, 0x0356d249, 0x029e0e62, 0x0338c3b4, 0x0221bcd6, 0x00ccc699, 0x0028b800, 0x000fbc3b}}, Y: Field{[10]uint32{0x0144b16d, 0x00a6e9e8, 0x001337d9, 0x018e636c, 0x03512fd3, 0x010f31fd, 0x02a03dae, 0x003a1b24, 0x00ad77d4, 0x003f8b21}}}, + {X: Field{[10]uint32{0x03555fc5, 0x03e5926d, 0x02ad302e, 0x02c39fc3, 0x00f62f12, 0x00ca8d92, 0x02bef427, 0x00136b1d, 0x0224a4ec, 0x002130a6}}, Y: Field{[10]uint32{0x014f970e, 0x029fc29e, 0x017ecb18, 0x014ce391, 0x03929ec4, 0x008b927e, 0x02b454cf, 0x01529c43, 0x02bb283a, 0x0039d883}}}, + {X: Field{[10]uint32{0x02cf43a8, 0x00c55cfa, 0x031e9283, 0x01cc041f, 0x03a309cd, 0x03c705de, 0x0340f4e5, 0x017fa487, 0x0234e75d, 0x001aee99}}, Y: Field{[10]uint32{0x03421582, 0x01af8dbe, 0x01a979d8, 0x03a9519c, 0x025b47fd, 0x00882715, 0x0086b441, 0x02090c7c, 0x008c4216, 0x000cfff8}}}, + {X: Field{[10]uint32{0x01ef0150, 0x03c59d1b, 0x01bfa47c, 0x02625567, 0x02488f62, 0x02796dba, 0x01a6046d, 0x03006f12, 0x02f051b0, 0x0004ed9e}}, Y: Field{[10]uint32{0x00237608, 0x03c764e8, 0x0109ee29, 0x01648c85, 0x03a54add, 0x0212b2b2, 0x037cc35d, 0x02fc2d4c, 0x014b01c1, 0x00343a24}}}, + {X: Field{[10]uint32{0x03af9300, 0x033c4fa4, 0x007202c5, 0x032d8d90, 0x02fdf779, 0x03331289, 0x02abc946, 0x02d8abaf, 0x01bfb5dc, 0x00058488}}, Y: Field{[10]uint32{0x00f83b2c, 0x026dfa4b, 0x007b72a4, 0x036d86bb, 0x00d1a212, 0x00ad484f, 0x0266bd30, 0x01b7e1c2, 0x02c5dd9d, 0x0034ff78}}}, + {X: Field{[10]uint32{0x02eb508b, 0x0242fe38, 0x003d39a5, 0x02fe19b7, 0x017eda1f, 0x00ad4880, 0x03602770, 0x016118eb, 0x020cc62f, 0x000c314d}}, Y: Field{[10]uint32{0x02c44efe, 0x02d2a072, 0x039f01aa, 0x03006dd9, 0x016c30e8, 0x037ab185, 0x037dbe8e, 0x0268ae20, 0x02f5009b, 0x00323a46}}}, + {X: Field{[10]uint32{0x00ec3576, 0x02e002c0, 0x01007a38, 0x03c21cdc, 0x02640364, 0x00925c9f, 0x027f38b7, 0x0147d7a9, 0x027fdd91, 0x00301966}}, Y: Field{[10]uint32{0x01cf47e3, 0x03c58069, 0x03ded648, 0x02b8728c, 0x018c57fa, 0x01d100d8, 0x018b5a77, 0x00c70d51, 0x00cb6fa1, 0x0029bd92}}}, + {X: Field{[10]uint32{0x02679386, 0x009e1fc0, 0x004be43e, 0x025429a1, 0x037d50fe, 0x0386ac72, 0x006472a8, 0x02a24811, 0x024db795, 0x000c8548}}, Y: Field{[10]uint32{0x018a9bf0, 0x01407e4d, 0x0238cc5e, 0x006fbf0f, 0x03faba83, 0x00b3ff17, 0x00c7eb59, 0x023619a4, 0x026297f2, 0x00095d41}}}, + {X: Field{[10]uint32{0x01871145, 0x029a2868, 0x035b3b19, 0x01926625, 0x03fe7762, 0x02971553, 0x0115445d, 0x01c120ef, 0x00e2a87a, 0x00095d95}}, Y: Field{[10]uint32{0x02636ec5, 0x0232234c, 0x010439c2, 0x00c259a4, 0x009efe24, 0x032816c6, 0x03fc4eef, 0x03c53e75, 0x019d0c67, 0x003f2e4c}}}, + {X: Field{[10]uint32{0x002f1b49, 0x0262c5c2, 0x03e800ce, 0x01b5b6cc, 0x0017c8a6, 0x039a422a, 0x017926e6, 0x03c553cf, 0x0201e504, 0x00291e1a}}, Y: Field{[10]uint32{0x0323a2fc, 0x00a184b4, 0x03bfd0b0, 0x038998ab, 0x027f86e8, 0x02df3e9e, 0x01a29678, 0x013e7fa0, 0x0142fc2e, 0x0015db93}}}, + {X: Field{[10]uint32{0x02db1e71, 0x02966998, 0x01e383c5, 0x03dfa0b8, 0x0090b484, 0x022bcda7, 0x013ae62a, 0x02615912, 0x03a9260c, 0x0014503d}}, Y: Field{[10]uint32{0x010bae86, 0x011c534d, 0x021fe2f6, 0x03026149, 0x0394ddcd, 0x03afe454, 0x026aa92c, 0x0277ed8e, 0x02c2b087, 0x0013945c}}}, + {X: Field{[10]uint32{0x00a66dfc, 0x01b3cc93, 0x0134231e, 0x004d4843, 0x03b781fe, 0x02295e75, 0x03d6d901, 0x0142de71, 0x020c0f0f, 0x003d5675}}, Y: Field{[10]uint32{0x014eed15, 0x00aeac23, 0x0208e205, 0x037328a7, 0x025f1f05, 0x02f6a390, 0x015fb56a, 0x014a972a, 0x02ae8e58, 0x0004b673}}}, + {X: Field{[10]uint32{0x00547e7c, 0x021a686c, 0x038570cc, 0x037e68cd, 0x00a4fb73, 0x00e814d5, 0x030e0be5, 0x03406f25, 0x03f50fa2, 0x0022241f}}, Y: Field{[10]uint32{0x03a3d2f5, 0x0055ee5f, 0x0373dab9, 0x006f0036, 0x025b2640, 0x03f29aaa, 0x03145f26, 0x0046d909, 0x0356cc12, 0x003d614e}}}, + {X: Field{[10]uint32{0x018c45ca, 0x02cfa9b9, 0x027ecfe4, 0x03c937bc, 0x03c8ac82, 0x038763fe, 0x011fba31, 0x0141b63a, 0x03f64541, 0x00330792}}, Y: Field{[10]uint32{0x00d27592, 0x00a98fce, 0x03b77590, 0x036c9d4f, 0x011efcf1, 0x00c1a55b, 0x00585a60, 0x0060f1a1, 0x017da875, 0x001d85d2}}}, + {X: Field{[10]uint32{0x03ca99d5, 0x00436ab2, 0x00dd4eca, 0x01f24d15, 0x016c3955, 0x007b7780, 0x02a6f9ef, 0x0108416d, 0x0037ef74, 0x001fb8b1}}, Y: Field{[10]uint32{0x033772d6, 0x0125a3db, 0x025b1827, 0x01c36f7b, 0x033e6d7b, 0x01457695, 0x00503f69, 0x03d767cc, 0x03345eef, 0x00085d51}}}, + {X: Field{[10]uint32{0x03e2465c, 0x0278178c, 0x0290f653, 0x012ed0b6, 0x003605ba, 0x01afd083, 0x033af3ef, 0x02d2a68f, 0x02a239f9, 0x0001cbfb}}, Y: Field{[10]uint32{0x01f553cc, 0x00abb67a, 0x0120a36d, 0x0345ac33, 0x0085482c, 0x000a50a3, 0x002ad9ad, 0x037b7723, 0x02ffdf7a, 0x0000280d}}}, + {X: Field{[10]uint32{0x0099914a, 0x0323d780, 0x0307c938, 0x02b89905, 0x03c8a0cb, 0x035e8e9b, 0x01b627c4, 0x0374019a, 0x033e94a0, 0x000d8f68}}, Y: Field{[10]uint32{0x02f58bd9, 0x03a6301e, 0x0359c3d0, 0x037351e2, 0x03a2f936, 0x00541bd1, 0x0236099c, 0x001e9038, 0x0277ef13, 0x0026f6a6}}}, + {X: Field{[10]uint32{0x02c133fe, 0x0246183c, 0x036e1a7e, 0x02347b26, 0x0393af0f, 0x02f817f7, 0x034a48bb, 0x010a426b, 0x0064c839, 0x001d9502}}, Y: Field{[10]uint32{0x00a3ecc2, 0x03970f95, 0x0084583c, 0x03d697b5, 0x01b3cc98, 0x02bcf5bc, 0x013a236d, 0x03ac0888, 0x03d7738c, 0x003c1a48}}}, + {X: Field{[10]uint32{0x02b239c4, 0x032d007c, 0x01606c94, 0x0224d1c2, 0x0251e381, 0x00ba6928, 0x01945c16, 0x022a7e2f, 0x00217a31, 0x0015cfc2}}, Y: Field{[10]uint32{0x0346bef5, 0x00754ead, 0x03fbe7ca, 0x00a35f1c, 0x00496cc1, 0x030faf45, 0x00b105fe, 0x02792e52, 0x00f27de6, 0x001f9e39}}}, + {X: Field{[10]uint32{0x02b01f5f, 0x02a4d388, 0x01467213, 0x02120669, 0x02f90d21, 0x015f97b5, 0x0009656f, 0x012e4ed4, 0x01818923, 0x000214de}}, Y: Field{[10]uint32{0x02e475f8, 0x01bc07d8, 0x02820ed2, 0x003b267e, 0x029281fc, 0x02733be8, 0x0069bbe8, 0x00266387, 0x01e8cc99, 0x0032529e}}}, + {X: Field{[10]uint32{0x01eb6041, 0x0184cb3b, 0x0051257f, 0x0031e001, 0x016f00a3, 0x033c3b61, 0x01ccd4c1, 0x000cd8ec, 0x01122989, 0x0014ce21}}, Y: Field{[10]uint32{0x0183334e, 0x022d12da, 0x03722fd7, 0x01551a6f, 0x000dd22f, 0x02f26a11, 0x038feacd, 0x0346e693, 0x0252f856, 0x00355b8a}}}, + {X: Field{[10]uint32{0x00e4796d, 0x00eaabac, 0x00c852f3, 0x02300e71, 0x01c5cb47, 0x03ee6258, 0x009f913a, 0x03ded971, 0x008a750e, 0x00107b79}}, Y: Field{[10]uint32{0x02559de4, 0x0090270c, 0x0065b8de, 0x02734693, 0x0104bdfe, 0x0012d4f2, 0x0092ea7f, 0x011a0062, 0x03f94b6c, 0x0035d31e}}}, + {X: Field{[10]uint32{0x01f08148, 0x034ed4f9, 0x03eefb6d, 0x00e4eb3f, 0x03fe7621, 0x03b5aa77, 0x02eece4e, 0x03dcda64, 0x01f36596, 0x0025fa4c}}, Y: Field{[10]uint32{0x00dd5f1b, 0x01838a85, 0x002c09b6, 0x0052d8b5, 0x0039a246, 0x01013ee9, 0x0276ce77, 0x0314a827, 0x013353b9, 0x000f6a26}}}, + {X: Field{[10]uint32{0x0222579d, 0x00024dec, 0x039a54db, 0x01933125, 0x035c55b6, 0x0094acde, 0x00476335, 0x02c410e6, 0x02ea3ca8, 0x00132bd3}}, Y: Field{[10]uint32{0x011607bb, 0x01c7358a, 0x01464621, 0x00013034, 0x0345a191, 0x01c75628, 0x03885807, 0x02f701f3, 0x03320a93, 0x00030999}}}, + {X: Field{[10]uint32{0x027b1ca4, 0x029f2127, 0x0306bb7e, 0x03e086a1, 0x01b52960, 0x01478e0e, 0x0324ee4e, 0x020f0cea, 0x02905b34, 0x00215f07}}, Y: Field{[10]uint32{0x0269dd80, 0x02456ebf, 0x00c01be5, 0x03f7a6d0, 0x011c6b09, 0x028b9af1, 0x018380c4, 0x021dc6cd, 0x010c7a57, 0x00235ba7}}}, + {X: Field{[10]uint32{0x00b5a182, 0x03b4b06f, 0x0322c1e7, 0x02925a1a, 0x0310ec39, 0x0372e8f2, 0x00fc1248, 0x03deb69a, 0x030be0db, 0x001043bd}}, Y: Field{[10]uint32{0x007f9e94, 0x02e508c9, 0x03db3b7c, 0x01e6023f, 0x00e6925d, 0x002d2970, 0x03074aee, 0x015bd73b, 0x02a3331a, 0x00349ba7}}}, + {X: Field{[10]uint32{0x0351029f, 0x00410655, 0x03f7a307, 0x03e69f98, 0x0289dff6, 0x01ea90c6, 0x03e5ec30, 0x03ac4205, 0x03a8c831, 0x00232be1}}, Y: Field{[10]uint32{0x03c8890a, 0x02421c99, 0x02058bfe, 0x001cf176, 0x0113aad2, 0x030e9192, 0x0265ba07, 0x029b0f23, 0x02e1c8dd, 0x000fc2f5}}}, + {X: Field{[10]uint32{0x02f10e8e, 0x01b57ebf, 0x037798c1, 0x022ffee6, 0x01b35ca1, 0x034c53ec, 0x026a8a39, 0x00920d52, 0x02cfe92d, 0x003bb7b8}}, Y: Field{[10]uint32{0x0114c4c3, 0x02cd6ab9, 0x01624c1e, 0x03259e4f, 0x009fcd12, 0x03e73877, 0x031181f3, 0x02fbf92c, 0x02b021f0, 0x0032d456}}}, + {X: Field{[10]uint32{0x02ebcee1, 0x03bb2bca, 0x00312f02, 0x01d5d135, 0x0248bb2a, 0x0045b6d4, 0x02d6a4e9, 0x02dfddee, 0x02c71e77, 0x00232fde}}, Y: Field{[10]uint32{0x039b7320, 0x028b015d, 0x03799169, 0x01fc36da, 0x02b6f669, 0x0034258d, 0x017f97c3, 0x009ad4f4, 0x0331f67b, 0x001d9712}}}, + {X: Field{[10]uint32{0x00995db2, 0x03f19c95, 0x02dfcc19, 0x032e6190, 0x02715dc6, 0x00380448, 0x03f0627f, 0x026abcd3, 0x01b4cd44, 0x001c3351}}, Y: Field{[10]uint32{0x03535c8e, 0x00314e0b, 0x00c4120f, 0x036442d8, 0x02ee184a, 0x02b685b1, 0x0320eac3, 0x025ec610, 0x00567614, 0x0020b965}}}, + {X: Field{[10]uint32{0x007c45d5, 0x00bf7edb, 0x002ea070, 0x011b83d1, 0x03050e51, 0x00defb0f, 0x039d558e, 0x033f6479, 0x03f9783f, 0x0033f885}}, Y: Field{[10]uint32{0x01c419d5, 0x03dc1e65, 0x00dfc7b6, 0x02185eed, 0x00da2251, 0x0231f0eb, 0x03d70d87, 0x00feff15, 0x010e8645, 0x0014df2f}}}, + {X: Field{[10]uint32{0x00579d52, 0x005e43d2, 0x0317e065, 0x032c4afc, 0x01ccabd2, 0x033ebe9c, 0x033d4f74, 0x02ee38af, 0x00df6486, 0x002609b0}}, Y: Field{[10]uint32{0x01c57342, 0x005cb76e, 0x02da734f, 0x015e353b, 0x02ae3bb4, 0x03f0db45, 0x0349c052, 0x01894f4d, 0x0186f86d, 0x000f6fcd}}}, + {X: Field{[10]uint32{0x028a02c4, 0x013d65b8, 0x00e74d0f, 0x037d5db2, 0x00a13e13, 0x01d13a71, 0x033fa3e3, 0x012f0b1a, 0x00ef381b, 0x003a863f}}, Y: Field{[10]uint32{0x0209f397, 0x03f9a7fb, 0x01874d7f, 0x02931074, 0x02041c9a, 0x016568c2, 0x0103c7fe, 0x01175e1c, 0x039d2bc4, 0x0030f9af}}}, + {X: Field{[10]uint32{0x026d8f4a, 0x033e433f, 0x033a0e88, 0x01759cc0, 0x0221b82e, 0x02705bfe, 0x00618bec, 0x01695187, 0x0065c09d, 0x001b78b1}}, Y: Field{[10]uint32{0x004ee2ba, 0x01973caf, 0x03f5d28b, 0x02c0ca02, 0x03e1c4cc, 0x00ec87d6, 0x00a8199d, 0x0220ad0a, 0x03d28950, 0x000d9eb2}}}, + {X: Field{[10]uint32{0x02183f4e, 0x03e9cfc6, 0x0284706f, 0x01a27bf4, 0x03cecc9c, 0x03469505, 0x0250f803, 0x031f516b, 0x0213ee10, 0x00358a1b}}, Y: Field{[10]uint32{0x02a56f56, 0x004fa4da, 0x008ad37f, 0x024d5f6e, 0x01e965ab, 0x0320a790, 0x023ca411, 0x013a271f, 0x03b75520, 0x001eae4a}}}, + {X: Field{[10]uint32{0x03c3bf58, 0x020f7dc8, 0x0364dfce, 0x0187bcf0, 0x0173f0c8, 0x036dbc82, 0x0125962f, 0x01182895, 0x02faea67, 0x001d49b9}}, Y: Field{[10]uint32{0x00e3a674, 0x023d2306, 0x01ae8f00, 0x02b04b8d, 0x0125a21f, 0x02cc8dd4, 0x0274411c, 0x01846f4c, 0x00e0d5a8, 0x000b1daa}}}, + {X: Field{[10]uint32{0x0079308d, 0x0141c3e2, 0x00b2ab78, 0x000e24fa, 0x02e737c8, 0x0067d47d, 0x01d5d897, 0x0128f5b4, 0x02da56d6, 0x003f32aa}}, Y: Field{[10]uint32{0x039362d1, 0x0171aa11, 0x03d7d868, 0x034ff9b9, 0x01a2ee95, 0x025a7eae, 0x01750efa, 0x03de4bbf, 0x01663fac, 0x002098b1}}}, + {X: Field{[10]uint32{0x01b57fe3, 0x012c4556, 0x0088afef, 0x02a2ce9a, 0x03bd6d91, 0x028e5e11, 0x00483797, 0x017d0f31, 0x03b8eb8a, 0x002d8344}}, Y: Field{[10]uint32{0x00ebaa54, 0x033e0e18, 0x038ae94e, 0x014cdd56, 0x038405b0, 0x032217c7, 0x0104acbe, 0x021615d8, 0x02be5d2b, 0x002afdcf}}}, + {X: Field{[10]uint32{0x0377f8be, 0x039b3a30, 0x02d90127, 0x019b7ea8, 0x014250fd, 0x00de7e49, 0x016d2c14, 0x0361cbff, 0x030f4a0d, 0x000ccb52}}, Y: Field{[10]uint32{0x03c6232b, 0x021f3cc6, 0x02354b78, 0x033761f3, 0x03110dfa, 0x0382c5fa, 0x0333d7d9, 0x00d42fd0, 0x014347c2, 0x0000dfcc}}}, + {X: Field{[10]uint32{0x00c5788f, 0x03be1ed3, 0x0394e52d, 0x0082d556, 0x025d0216, 0x01ef44e3, 0x020e8803, 0x0358cc07, 0x02e62ce6, 0x003a66cb}}, Y: Field{[10]uint32{0x025546bc, 0x01210593, 0x03c6d2c0, 0x030ae469, 0x00e2858d, 0x02ecf954, 0x031df268, 0x032a7db7, 0x02fedabc, 0x00327a81}}}, + {X: Field{[10]uint32{0x01c54353, 0x0015b712, 0x033b1dfb, 0x0247a015, 0x005af241, 0x01c666f7, 0x02692a1d, 0x01ebb9ff, 0x00382a97, 0x00227ab5}}, Y: Field{[10]uint32{0x01994ece, 0x003e6bf6, 0x0319c2de, 0x00efaf97, 0x0107fec4, 0x02dc042b, 0x0167f706, 0x01ddb0aa, 0x01cedb2d, 0x002d5cb7}}}, + {X: Field{[10]uint32{0x0198268f, 0x021ed3b5, 0x01488595, 0x03fec243, 0x004777ba, 0x0231d016, 0x006f6fa9, 0x0104fc2d, 0x018e529b, 0x000336b6}}, Y: Field{[10]uint32{0x03ed034e, 0x03ba0c2f, 0x00cac3ef, 0x0205e22c, 0x02ceabc2, 0x0087e1e1, 0x00f10db8, 0x0398e51c, 0x015e0543, 0x0035016a}}}, + {X: Field{[10]uint32{0x02ee2cc3, 0x00a43921, 0x00f5be41, 0x0275783d, 0x02c26984, 0x0330c502, 0x03f69ad3, 0x00ccaf99, 0x03411cc1, 0x001425bb}}, Y: Field{[10]uint32{0x03f8268a, 0x0114d0dc, 0x02bb418c, 0x029bcb51, 0x0149ef34, 0x0029ecfc, 0x021f3123, 0x02c1afb5, 0x029fccd4, 0x001fcce1}}}, + {X: Field{[10]uint32{0x00a5be61, 0x03d838a9, 0x00dbb8b9, 0x03b58e3b, 0x038c4d59, 0x0322fa61, 0x007253a2, 0x019cd218, 0x0270a096, 0x002f02fa}}, Y: Field{[10]uint32{0x02873b78, 0x03883345, 0x03320873, 0x03c0a777, 0x01054d1f, 0x01b1309d, 0x0286129e, 0x01382c12, 0x01ac3c2b, 0x00386444}}}, + {X: Field{[10]uint32{0x03223ec1, 0x014500e1, 0x007a7dc4, 0x02297210, 0x03b024bb, 0x02a9f5d1, 0x00674d38, 0x01682038, 0x0169ac8f, 0x000b4599}}, Y: Field{[10]uint32{0x019a597a, 0x006f5df8, 0x038f73dd, 0x021f8888, 0x01445c15, 0x03bb1396, 0x027d92d4, 0x01a97c4a, 0x03386221, 0x00122bc6}}}, + {X: Field{[10]uint32{0x0145ba30, 0x03a2dfe0, 0x01d40f27, 0x037f8f3c, 0x012947cd, 0x01bb1ded, 0x00e37b32, 0x00454377, 0x03aebb8b, 0x002e32f3}}, Y: Field{[10]uint32{0x00823ca4, 0x01bf76cd, 0x01a0562b, 0x03ef357d, 0x00ffc2c3, 0x021a287a, 0x030ec022, 0x034b7218, 0x00ab8b2a, 0x003548d3}}}, + {X: Field{[10]uint32{0x00960ee7, 0x02abb1b7, 0x02a227a9, 0x02f9823b, 0x01fb2e3e, 0x006b0676, 0x01db9c0f, 0x004bd377, 0x0092563f, 0x003ece58}}, Y: Field{[10]uint32{0x01823c45, 0x02798bb2, 0x0395358c, 0x02ec1a50, 0x01646e88, 0x00bac07a, 0x027f661c, 0x028e50f4, 0x01dffda1, 0x00197959}}}, + {X: Field{[10]uint32{0x0014b297, 0x03fe9529, 0x0022580a, 0x03b88400, 0x02f8da06, 0x02c89d2c, 0x0225150d, 0x0337ea41, 0x01760b8d, 0x00071ba7}}, Y: Field{[10]uint32{0x01666255, 0x02f0bbe9, 0x00057607, 0x02e5e35d, 0x0085679f, 0x02fb62c4, 0x026edcbb, 0x02c2c151, 0x010d009a, 0x001c1ad1}}}, + {X: Field{[10]uint32{0x01fca1c3, 0x0180d46e, 0x00277dc6, 0x00355578, 0x0377f55a, 0x026173b2, 0x0166b13d, 0x03fc39b9, 0x01c146ec, 0x000b810f}}, Y: Field{[10]uint32{0x026d8398, 0x01c7915c, 0x00e1428a, 0x0000aab1, 0x03665da5, 0x02429eaf, 0x011103b0, 0x03abc281, 0x01caf75c, 0x0000713c}}}, + {X: Field{[10]uint32{0x005f482f, 0x002f2696, 0x0192cb4b, 0x03b8b625, 0x019549f9, 0x025f5e15, 0x023ee12d, 0x023a4399, 0x030ca1bf, 0x0016b85e}}, Y: Field{[10]uint32{0x00fc8111, 0x008daf2d, 0x031c716f, 0x02b6235c, 0x03a71806, 0x03a3969d, 0x006966c1, 0x0002f1cf, 0x03349317, 0x002ec37d}}}, + {X: Field{[10]uint32{0x03caafc4, 0x023d1a29, 0x0271c1b0, 0x037f241a, 0x00fca910, 0x01d7b6a5, 0x0011c46e, 0x030f974f, 0x03426a24, 0x003ea2fc}}, Y: Field{[10]uint32{0x035954e2, 0x02b6930b, 0x000435dc, 0x03e795f0, 0x014e2884, 0x016cf3c1, 0x01e6c846, 0x03ef678d, 0x017cdb07, 0x00329a60}}}, + {X: Field{[10]uint32{0x011a88a4, 0x0016bee6, 0x003cb0f9, 0x02d779c2, 0x011e1031, 0x00fd0e53, 0x01f67aea, 0x035fdee7, 0x01c1846d, 0x000b37fc}}, Y: Field{[10]uint32{0x0376f39e, 0x03fcf8bb, 0x00d3b507, 0x023e3959, 0x016ea0d8, 0x038c11c4, 0x00530fed, 0x0390adf4, 0x024f3827, 0x0012ef5c}}}, + {X: Field{[10]uint32{0x013b6905, 0x02ccc8a7, 0x02df95f5, 0x02472a50, 0x01c5bb82, 0x019413e2, 0x01f82b29, 0x0127b2bf, 0x000055ca, 0x001beb6f}}, Y: Field{[10]uint32{0x00b7df62, 0x03d5fbd5, 0x02868c06, 0x014fd64f, 0x03911a30, 0x03104645, 0x02f94728, 0x020c9a95, 0x0184033a, 0x003dd9c4}}}, + {X: Field{[10]uint32{0x00dd0841, 0x0280392e, 0x01fca2f5, 0x00184964, 0x026f4a1e, 0x0357aa34, 0x02b15f55, 0x02a90373, 0x015a2f26, 0x0031451a}}, Y: Field{[10]uint32{0x0113266c, 0x014a0eac, 0x03a6e800, 0x02c45b63, 0x01652905, 0x00ff13bc, 0x01375677, 0x02c1aa42, 0x02082e78, 0x001415ae}}}, + {X: Field{[10]uint32{0x037ff933, 0x004785b2, 0x0306466c, 0x03bbf747, 0x01aad758, 0x03862304, 0x00368dd3, 0x013e1553, 0x00d49347, 0x0020f72e}}, Y: Field{[10]uint32{0x030a53c7, 0x022f6118, 0x02288e9f, 0x03ec3987, 0x030d6ed6, 0x004679e7, 0x027a029e, 0x01c649f1, 0x033d04e5, 0x00041396}}}, + {X: Field{[10]uint32{0x00c8a93f, 0x032aec7f, 0x01127a8b, 0x0208b8ac, 0x015f9ae8, 0x01597e6a, 0x03690890, 0x002c990e, 0x038acf9a, 0x002f1973}}, Y: Field{[10]uint32{0x00fb2143, 0x030a4a85, 0x039c3ae9, 0x03045569, 0x0023ff28, 0x019a66de, 0x000ac90f, 0x03741a82, 0x016ba31d, 0x003f7e5c}}}, + {X: Field{[10]uint32{0x009f140b, 0x0272f493, 0x0153c1e0, 0x035901c3, 0x02695e37, 0x016b4de8, 0x0174b476, 0x004a904b, 0x03a9520b, 0x00121de3}}, Y: Field{[10]uint32{0x029c373e, 0x0328875d, 0x01b39fbe, 0x0316cb8d, 0x01446dd3, 0x03146d1a, 0x03b4c02b, 0x016500e1, 0x0005bec1, 0x00337192}}}, + {X: Field{[10]uint32{0x0301dc25, 0x019f77e8, 0x006e841f, 0x02d4cb46, 0x0328077b, 0x03b5a1cf, 0x01c88312, 0x01621a3b, 0x002c6a73, 0x00276cb1}}, Y: Field{[10]uint32{0x03b3a0dc, 0x024098af, 0x00ac8569, 0x0351e1b4, 0x00aa0ac5, 0x01a8c96c, 0x0193e064, 0x02d17b84, 0x0235ec9d, 0x0038072c}}}, + {X: Field{[10]uint32{0x00f8da6b, 0x0201cd27, 0x012aefb2, 0x023c925b, 0x03037c6c, 0x015ac9ff, 0x021ef442, 0x0009690e, 0x018f62bf, 0x0032f3fd}}, Y: Field{[10]uint32{0x03b1896d, 0x0379b94e, 0x01da2818, 0x006f0440, 0x0128f533, 0x00784daf, 0x029251fe, 0x009d4c0e, 0x02d52da3, 0x0013f667}}}, + {X: Field{[10]uint32{0x034f3639, 0x019c94db, 0x00270933, 0x03ce45e2, 0x02070cbc, 0x00ec77e5, 0x03a12a29, 0x02311605, 0x039787e6, 0x00275482}}, Y: Field{[10]uint32{0x02bc0f14, 0x027b3bed, 0x036bb22d, 0x001e763e, 0x01041fec, 0x028c9589, 0x01885ca0, 0x02625764, 0x015d2b53, 0x00185784}}}, + {X: Field{[10]uint32{0x0225dbbd, 0x01a8d064, 0x02e7b3ef, 0x00f7e0ec, 0x024b0bfd, 0x02331b5b, 0x023d1820, 0x030af2f0, 0x01c40057, 0x00319237}}, Y: Field{[10]uint32{0x018ab3d8, 0x029fef14, 0x02caf209, 0x0187705f, 0x01ec16fe, 0x019e8f67, 0x0347e99e, 0x00659a6e, 0x006338dd, 0x0002b26a}}}, + {X: Field{[10]uint32{0x002137dc, 0x0259187a, 0x0229a7e5, 0x00a5ed17, 0x02b80ead, 0x0248877b, 0x01e3f1e7, 0x03dd9ebf, 0x0035ea96, 0x002b847e}}, Y: Field{[10]uint32{0x00452596, 0x0085e393, 0x01a15c2a, 0x0395397e, 0x034c5dfe, 0x00654eb2, 0x016e1b5f, 0x018bca26, 0x03ecb65a, 0x0008114e}}}, + {X: Field{[10]uint32{0x0364d46f, 0x00a03428, 0x00fec029, 0x03f8d970, 0x000699f6, 0x023bd44a, 0x03b9293d, 0x02993748, 0x01ad56f8, 0x0028d552}}, Y: Field{[10]uint32{0x03fbbe75, 0x0335b842, 0x00868f11, 0x02480f19, 0x008f55a2, 0x01fffb38, 0x015ffce1, 0x026604c0, 0x01cba38c, 0x00321010}}}, + {X: Field{[10]uint32{0x035f8077, 0x011c25f8, 0x03a649c3, 0x0020351c, 0x022aad83, 0x01f6b226, 0x01bfaef3, 0x01d78423, 0x0029af55, 0x001d61dc}}, Y: Field{[10]uint32{0x03c2b8b6, 0x02a173d7, 0x0165b2e5, 0x01d085b3, 0x01603cd6, 0x005df31a, 0x02437620, 0x0146efb4, 0x0097d198, 0x00210ec1}}}, + {X: Field{[10]uint32{0x02d4ea99, 0x0181fecc, 0x031ca917, 0x03a43cba, 0x01ae00b9, 0x00f94cb0, 0x027b1f68, 0x03f54311, 0x0168ca7f, 0x00113b8c}}, Y: Field{[10]uint32{0x012c3270, 0x00fadff2, 0x001411e7, 0x038e6e5b, 0x03022564, 0x024443bb, 0x01a9f9a0, 0x01684efb, 0x02a8120b, 0x00042883}}}, + {X: Field{[10]uint32{0x025337d4, 0x02dbd99e, 0x007d6477, 0x02550b2c, 0x01461e45, 0x00eee632, 0x0278f92f, 0x02bc2e41, 0x00898daf, 0x0026804f}}, Y: Field{[10]uint32{0x023c2a73, 0x012e87f6, 0x0205e877, 0x03c7fd4c, 0x03fec396, 0x017367f2, 0x009b773f, 0x008e939b, 0x005ac966, 0x00047e12}}}, + {X: Field{[10]uint32{0x02b47d5c, 0x01cf5a6d, 0x01bea83e, 0x005cae2d, 0x013fa12d, 0x03d42cd2, 0x0019a615, 0x01060882, 0x00a144d5, 0x002d178a}}, Y: Field{[10]uint32{0x02c29f4b, 0x01b0c1a4, 0x00ae45b7, 0x0248256f, 0x03fb1c20, 0x00e65c94, 0x03f1dec4, 0x0334877f, 0x0383ccda, 0x003661f6}}}, + {X: Field{[10]uint32{0x0241a0c9, 0x000f4d69, 0x02603cdc, 0x0014074a, 0x009a6592, 0x004064be, 0x0065d073, 0x016222a2, 0x02534984, 0x00279f5a}}, Y: Field{[10]uint32{0x00f462d9, 0x00052615, 0x033233c0, 0x02f2c87e, 0x02ce5f1f, 0x0134702c, 0x03e5690b, 0x027e9fd5, 0x00edace2, 0x003285dd}}}, + {X: Field{[10]uint32{0x00991f47, 0x03fa90d5, 0x00b01b9a, 0x01023bc5, 0x03e433a9, 0x02017058, 0x03b306d5, 0x0184f159, 0x0029be1b, 0x00044e85}}, Y: Field{[10]uint32{0x03928697, 0x005159de, 0x023c7500, 0x0006454a, 0x000321e8, 0x01478e17, 0x0191ec1a, 0x032ee124, 0x01fa6d26, 0x000897b9}}}, + {X: Field{[10]uint32{0x018d9181, 0x01575c50, 0x03964776, 0x029b4375, 0x016d6eb0, 0x01ac017a, 0x01e2597f, 0x02177e4c, 0x01d102cf, 0x000cbb23}}, Y: Field{[10]uint32{0x03f9d8b9, 0x035eeeeb, 0x022ab00d, 0x001786a8, 0x003423bc, 0x0310c1d9, 0x02f7f4d9, 0x0392966f, 0x01d078b3, 0x003f5c63}}}, + {X: Field{[10]uint32{0x02e9246e, 0x0063a45c, 0x03865b12, 0x01c3bd1d, 0x01b145db, 0x018547e2, 0x021a5f14, 0x036b9017, 0x0267f2ce, 0x002b690c}}, Y: Field{[10]uint32{0x007cf82c, 0x038352c9, 0x00a541f3, 0x021b0acb, 0x0116e396, 0x02c11d1a, 0x0315c578, 0x0134a7e7, 0x02e04d1f, 0x0034522f}}}, + {X: Field{[10]uint32{0x01bf0cbe, 0x02e611e5, 0x006bbbf7, 0x001c805f, 0x0265f5ca, 0x036e8694, 0x03e662be, 0x01d29a47, 0x02bedebd, 0x00206282}}, Y: Field{[10]uint32{0x009c0a53, 0x006738c2, 0x03bc8da7, 0x00ee4240, 0x030ac0f0, 0x0389cede, 0x008da9bc, 0x00b1cda6, 0x006a0187, 0x0039ecb4}}}, + {X: Field{[10]uint32{0x010b3c94, 0x02fa041f, 0x02f14d80, 0x01b7cb44, 0x02ae7602, 0x0165bc27, 0x00c1a1bf, 0x03684201, 0x0355ef77, 0x000bd27a}}, Y: Field{[10]uint32{0x02038b83, 0x0138e0cf, 0x02ffa569, 0x01ae00b2, 0x011a7903, 0x01b533b4, 0x0289aa1e, 0x004463ad, 0x0010002f, 0x001a8896}}}, + {X: Field{[10]uint32{0x02faf74a, 0x0314d4de, 0x0278ba5c, 0x031e61b1, 0x02bf66d5, 0x03b6f457, 0x02f8029b, 0x00097daf, 0x017054cb, 0x001ff953}}, Y: Field{[10]uint32{0x00ad89b0, 0x025b042d, 0x03695022, 0x03f76dd5, 0x00a47a82, 0x02462155, 0x016afb66, 0x0198c9b4, 0x03ec72ac, 0x003f7185}}}, + {X: Field{[10]uint32{0x02ed2689, 0x028fdd63, 0x0131956a, 0x02eb7bb0, 0x03411ec9, 0x02e71575, 0x01b8675d, 0x02128327, 0x03662b82, 0x00213d64}}, Y: Field{[10]uint32{0x02cd0d88, 0x0263a0c2, 0x01dfe4de, 0x024bd07b, 0x01480425, 0x01144722, 0x01119c4c, 0x01bb5e09, 0x01d96bef, 0x0020db99}}}, + {X: Field{[10]uint32{0x0185ee1b, 0x029bed50, 0x01f52da0, 0x004978ad, 0x00a46b16, 0x033326ff, 0x02eb6b71, 0x02083781, 0x00301a84, 0x003242aa}}, Y: Field{[10]uint32{0x010dc8df, 0x00d48dfe, 0x02efb161, 0x01276489, 0x01cc2134, 0x02671628, 0x031e05cd, 0x01760a4c, 0x03c00b28, 0x003aa1b5}}}, + {X: Field{[10]uint32{0x012ef100, 0x01f65b86, 0x00addc05, 0x02b673f7, 0x018669b2, 0x00d850aa, 0x03047ef6, 0x0126f9a7, 0x0176abae, 0x003fed35}}, Y: Field{[10]uint32{0x03ec6c7a, 0x024406ed, 0x0012080a, 0x01b6948e, 0x013d9596, 0x0203daa3, 0x02700e4c, 0x038060ce, 0x0114b2d5, 0x000dd033}}}, + {X: Field{[10]uint32{0x01403de0, 0x01e3f2b3, 0x00a3c08b, 0x0174b0cf, 0x0312c24b, 0x026bfbff, 0x03ebb618, 0x01af33ad, 0x018967ad, 0x001022a3}}, Y: Field{[10]uint32{0x01caecf3, 0x02f391f8, 0x013a2cdc, 0x015ff58c, 0x014acd35, 0x007605c7, 0x00fb66ff, 0x0310ba8a, 0x03a6378c, 0x000edd87}}}, + {X: Field{[10]uint32{0x0053b787, 0x0120ba1f, 0x027123e3, 0x013c60c9, 0x006c80c0, 0x006c2ac1, 0x01e27e3f, 0x00276ff7, 0x03f61531, 0x0016028c}}, Y: Field{[10]uint32{0x0028431a, 0x00d4f039, 0x02dd801d, 0x028d58e6, 0x02f70a33, 0x025c0bfd, 0x01ac5ae6, 0x020783a6, 0x03c3fddc, 0x002ee01c}}}, + {X: Field{[10]uint32{0x0344130f, 0x039e27e0, 0x018c2505, 0x036ce31a, 0x014c7860, 0x020d26b4, 0x02b11008, 0x03332b11, 0x02947054, 0x000b4c42}}, Y: Field{[10]uint32{0x023db697, 0x0237204f, 0x02a9a5d2, 0x0168b89a, 0x022df187, 0x0244f643, 0x011be0a0, 0x03243a70, 0x029c3c6e, 0x0007a881}}}, + {X: Field{[10]uint32{0x027aa450, 0x008c7e1a, 0x03b32985, 0x009091a5, 0x015d82b4, 0x02e0d6bb, 0x022f2e3a, 0x0072b4fc, 0x002be7b1, 0x000a1d0a}}, Y: Field{[10]uint32{0x00415c42, 0x008c5c7c, 0x02b74cfa, 0x000c87c9, 0x02cf39ce, 0x0107642e, 0x02e3860e, 0x02e48888, 0x032db2e1, 0x0000a18c}}}, + {X: Field{[10]uint32{0x036231cf, 0x01b9007a, 0x02ea48b3, 0x016e54c3, 0x016940f8, 0x00adde60, 0x02f5e418, 0x03ce8042, 0x039ff77b, 0x002be79d}}, Y: Field{[10]uint32{0x00e84c67, 0x03dd5066, 0x03389c13, 0x020eac7f, 0x034deb70, 0x01b5ae23, 0x01d958b8, 0x0057249a, 0x0350dbaf, 0x00274f50}}}, + {X: Field{[10]uint32{0x008c1ef3, 0x00740d5a, 0x01b35447, 0x02302998, 0x00bc93ad, 0x00ec9de3, 0x03d27577, 0x029cd49b, 0x038d515c, 0x001117b6}}, Y: Field{[10]uint32{0x0090dc49, 0x0193c95c, 0x002f555d, 0x0269154e, 0x02e94b75, 0x03cda84f, 0x03743611, 0x018be0ed, 0x023cfde7, 0x0025245e}}}, + {X: Field{[10]uint32{0x001811b4, 0x01d4049c, 0x012aa0dc, 0x02e8ad98, 0x013e76fe, 0x01fb0d34, 0x009993cf, 0x014c183e, 0x020a370d, 0x00380430}}, Y: Field{[10]uint32{0x006fd8af, 0x03d93fc4, 0x023cee3a, 0x009bc857, 0x03798a64, 0x032cf311, 0x0157a214, 0x026f814b, 0x032d280d, 0x0032d145}}}, + {X: Field{[10]uint32{0x025af8f9, 0x0108d4ab, 0x033f9eed, 0x00ed9eed, 0x02ef548b, 0x03ed1334, 0x0134080c, 0x031f96c4, 0x03ca4625, 0x0034d09d}}, Y: Field{[10]uint32{0x03e4a4df, 0x03963235, 0x02b441ec, 0x026b389e, 0x02c39190, 0x038fd13b, 0x037bd609, 0x023dfaec, 0x03797a62, 0x0028d7d5}}}, + {X: Field{[10]uint32{0x031d628d, 0x017bb2b2, 0x01c5dd66, 0x030f27ec, 0x03d96182, 0x0291ccf8, 0x004977fe, 0x010906da, 0x03993bd5, 0x002f82e4}}, Y: Field{[10]uint32{0x03b7fdb8, 0x016fa103, 0x009dadbf, 0x003c17ec, 0x0013218b, 0x03b10626, 0x03762728, 0x0349a837, 0x0353744e, 0x000de410}}}, + {X: Field{[10]uint32{0x018f3980, 0x00b0c67f, 0x0309dc3b, 0x00d3a04b, 0x01edd9bd, 0x01ad0a0a, 0x019f48fd, 0x0087a47b, 0x01f1ed4a, 0x000c20a5}}, Y: Field{[10]uint32{0x02ac0230, 0x02975fab, 0x00181a8b, 0x00d225f1, 0x030797d4, 0x03b93328, 0x0214c314, 0x00386926, 0x034d5c36, 0x001a0d70}}}, + {X: Field{[10]uint32{0x00495b1a, 0x0236ccb7, 0x03b412b8, 0x01799a8d, 0x01c2e07a, 0x0043d7e9, 0x0391604e, 0x021e77f5, 0x035161aa, 0x0019b3fa}}, Y: Field{[10]uint32{0x0252a1e1, 0x03e726cc, 0x03fe3f9f, 0x0317edba, 0x025ffba9, 0x0120ef09, 0x0229602b, 0x03f004f8, 0x029bf8a2, 0x0028381e}}}, + {X: Field{[10]uint32{0x03e39ba4, 0x02168b5b, 0x03648ec8, 0x03be6d57, 0x01bf7b3a, 0x00d29284, 0x03b3d9d3, 0x03a9c133, 0x00fb849c, 0x0003d0ae}}, Y: Field{[10]uint32{0x01e8b22f, 0x03458298, 0x019a7036, 0x012af27c, 0x01f5b0fb, 0x034e06b8, 0x035db65d, 0x012bfe7d, 0x01e2a36d, 0x002d8188}}}, + {X: Field{[10]uint32{0x03ab034f, 0x00c4952f, 0x008e385a, 0x03698233, 0x00c57b7f, 0x0199be3d, 0x00fdc462, 0x018c8cbb, 0x03852290, 0x0010a705}}, Y: Field{[10]uint32{0x0162af35, 0x02605aca, 0x001f18e6, 0x027aaf25, 0x0250b396, 0x0206a813, 0x03bfcb04, 0x023d5d02, 0x02591a86, 0x0038642e}}}, + {X: Field{[10]uint32{0x01ebf611, 0x037dee03, 0x03d7dfaf, 0x0215bf19, 0x009895b9, 0x02cde3b9, 0x01e4237f, 0x026832e5, 0x017c9478, 0x003224e7}}, Y: Field{[10]uint32{0x00ad3682, 0x003e07c7, 0x022b0437, 0x01fa6c57, 0x0047feb7, 0x0018b4b5, 0x02d05e23, 0x01185f0d, 0x036206e9, 0x00050ebf}}}, + {X: Field{[10]uint32{0x0398ef94, 0x01bcf310, 0x00cfb1d3, 0x02de370f, 0x022b82ae, 0x010ab607, 0x0215ae41, 0x00c90c93, 0x01bf5630, 0x00179055}}, Y: Field{[10]uint32{0x035da55a, 0x03d3fd7a, 0x03b75ed6, 0x019080fc, 0x01b90833, 0x005b5d09, 0x033807f2, 0x028ee6a7, 0x01272325, 0x001a007d}}}, + {X: Field{[10]uint32{0x00d1b573, 0x036f4fc2, 0x0165b5e9, 0x00c181e2, 0x03eb01c5, 0x01c45388, 0x03fa851a, 0x024ef9ee, 0x019853f0, 0x000465ac}}, Y: Field{[10]uint32{0x00628795, 0x015ff4af, 0x0297e5c5, 0x03b7fbc2, 0x00fe79dc, 0x0060f6d1, 0x00dea44d, 0x03b88360, 0x00f054bf, 0x00001e53}}}, + {X: Field{[10]uint32{0x033a6094, 0x00dbb4b1, 0x03a1dea8, 0x017dadda, 0x0339803e, 0x01a00c38, 0x038fcd01, 0x01cdedf6, 0x012074bb, 0x00360636}}, Y: Field{[10]uint32{0x0176e504, 0x01bc5e40, 0x00afe9d9, 0x006fed33, 0x02ff15d5, 0x02d7c21b, 0x00d2aacf, 0x00462a03, 0x03b51f63, 0x001ab1f6}}}, + {X: Field{[10]uint32{0x006c6204, 0x02d193ec, 0x02d8851d, 0x00b6c9cf, 0x01703904, 0x02b97262, 0x01a433ee, 0x02afa7b6, 0x034bf5cc, 0x003009da}}, Y: Field{[10]uint32{0x00f4756b, 0x00bbf289, 0x02cc5fd5, 0x03526cfe, 0x00972593, 0x02160548, 0x001a582a, 0x02b20752, 0x00ae6349, 0x0012249c}}}, + {X: Field{[10]uint32{0x01d83307, 0x00d0f5f3, 0x00a7a0d3, 0x00187136, 0x020b8989, 0x00f42c92, 0x01b300b4, 0x0334c3ae, 0x021cca23, 0x000252ca}}, Y: Field{[10]uint32{0x02481df1, 0x014c0be7, 0x00640607, 0x020e6694, 0x02e6e746, 0x020ce2e7, 0x01608015, 0x02f7296e, 0x0156b709, 0x0011f17b}}}, + {X: Field{[10]uint32{0x027d5108, 0x01a21dab, 0x0195a668, 0x00af4d16, 0x009f157d, 0x030a3ed9, 0x021c3850, 0x03d53b92, 0x0379df2b, 0x003cabb8}}, Y: Field{[10]uint32{0x01c8ef08, 0x00b7558d, 0x0231113f, 0x023ef55a, 0x0319a7bf, 0x019dbbbe, 0x0079d351, 0x0287e724, 0x03ae9c90, 0x002b9d9a}}}, + {X: Field{[10]uint32{0x029833ad, 0x01aee16e, 0x02222830, 0x028115b3, 0x01e81e4d, 0x018071aa, 0x029cd043, 0x0312cabe, 0x004f3dbd, 0x003f23f9}}, Y: Field{[10]uint32{0x0156fe15, 0x001d4e1b, 0x01094ce3, 0x017b3a31, 0x012b0765, 0x029420ae, 0x0330a52e, 0x014b5d90, 0x0378a98f, 0x001a8c86}}}, + {X: Field{[10]uint32{0x00255c14, 0x02d19393, 0x02b7c5b8, 0x012d60c3, 0x017444d0, 0x00b77043, 0x01aa3ebe, 0x03cf2fef, 0x017919a4, 0x0034e337}}, Y: Field{[10]uint32{0x008c15fa, 0x0195544b, 0x02e6f1a5, 0x0254776a, 0x03e19040, 0x0336baf9, 0x02311fe0, 0x00bf6e52, 0x02f1823a, 0x001a83c7}}}, + {X: Field{[10]uint32{0x01a4b41f, 0x011d4e02, 0x03f4c142, 0x00675ddc, 0x03916ea1, 0x009ad7a7, 0x0071943a, 0x021a4343, 0x02f6013d, 0x002b00b9}}, Y: Field{[10]uint32{0x005ea2b1, 0x00c6e9b0, 0x008f3995, 0x00650ddc, 0x03726598, 0x023f4bd9, 0x019c5e76, 0x013aaefb, 0x019e436b, 0x003ab712}}}, + {X: Field{[10]uint32{0x006419c8, 0x026dc074, 0x01177d7d, 0x01d47fd9, 0x02dc6d1a, 0x001dbe73, 0x03b5cd07, 0x03518ab1, 0x031ac36b, 0x0000e522}}, Y: Field{[10]uint32{0x011765ba, 0x02ee5746, 0x00bd2732, 0x0239de59, 0x0372d5d1, 0x0333ad87, 0x0141ea71, 0x000f1eac, 0x00eba01c, 0x0032a47f}}}, + {X: Field{[10]uint32{0x02706e9a, 0x00c65c5f, 0x0355435e, 0x034176f2, 0x02ea9e73, 0x03ff6210, 0x014c0c2c, 0x000369b7, 0x008d21d6, 0x00131f6f}}, Y: Field{[10]uint32{0x038230fe, 0x0305fd49, 0x0042d35d, 0x02f6336d, 0x016db46e, 0x01fdfa16, 0x002f4129, 0x01eaf4a7, 0x0344b87b, 0x0021a9df}}}, + {X: Field{[10]uint32{0x0244f623, 0x03847920, 0x01e0698e, 0x00c7677d, 0x01b7dec7, 0x001d0ec3, 0x038c2f7a, 0x0178b427, 0x01aab382, 0x001d48a3}}, Y: Field{[10]uint32{0x000a1676, 0x0086a21e, 0x01aa4510, 0x01949829, 0x0075e336, 0x034a0ba9, 0x0237bdfe, 0x03c41f6e, 0x0187e122, 0x00258f0a}}}, + {X: Field{[10]uint32{0x0280a579, 0x034b0ac3, 0x00147632, 0x00fc40b0, 0x02b584a7, 0x006de91e, 0x02ea92c7, 0x00587e3d, 0x02b32ed2, 0x002a8ea1}}, Y: Field{[10]uint32{0x024e6cb7, 0x01806b6b, 0x002abbc4, 0x03fddc8b, 0x03f7e517, 0x00409135, 0x01345d32, 0x03193c37, 0x009d2b4e, 0x002e3f89}}}, + {X: Field{[10]uint32{0x013f22f7, 0x034c5906, 0x0368abcf, 0x01f4f4f0, 0x014c0322, 0x035bcebe, 0x00b992f7, 0x000e7696, 0x012d9828, 0x001c0ae4}}, Y: Field{[10]uint32{0x02bac387, 0x039710b1, 0x0136f71d, 0x02e8e5ab, 0x02b576cc, 0x01c5331f, 0x00a4e14c, 0x0335e04c, 0x00493a32, 0x0009624b}}}, + {X: Field{[10]uint32{0x0090ba75, 0x034ed727, 0x03567829, 0x00ee3dbc, 0x01269f70, 0x00315c04, 0x0221dfc1, 0x02fe98a8, 0x00886d44, 0x00132843}}, Y: Field{[10]uint32{0x03fde3e7, 0x00fb3ed3, 0x034b9dac, 0x0089fc0d, 0x0395b04a, 0x00b5df6c, 0x01e6f277, 0x038d6353, 0x02b29282, 0x000cc8fa}}}, + {X: Field{[10]uint32{0x02b9c325, 0x0159ce24, 0x02d342da, 0x00d4ba51, 0x00f3601c, 0x0305d3bf, 0x00aa4362, 0x01a5c80b, 0x023630da, 0x0005867a}}, Y: Field{[10]uint32{0x030e881e, 0x029cbe43, 0x02de4b98, 0x025e471f, 0x03a1c126, 0x01237b5e, 0x0188dd61, 0x019e7a9b, 0x000e13b8, 0x0008ab45}}}, + {X: Field{[10]uint32{0x034d3032, 0x02f4e634, 0x034c6365, 0x02ead941, 0x0064d589, 0x00c0be2b, 0x01409a8a, 0x02fed273, 0x003818de, 0x000877f7}}, Y: Field{[10]uint32{0x004099a9, 0x02c5f39e, 0x01c4579e, 0x00f885c9, 0x02106d19, 0x02d809b9, 0x006ddcdb, 0x0148129e, 0x02c20e83, 0x002eef9f}}}, + {X: Field{[10]uint32{0x01069fe1, 0x036f5021, 0x01bd1c0d, 0x00b82eec, 0x03036a47, 0x00b3383b, 0x02e99aa1, 0x006acb2e, 0x01dd802f, 0x00183ef9}}, Y: Field{[10]uint32{0x03349dc3, 0x02f94929, 0x013167f9, 0x02cade2c, 0x0399feb1, 0x015023c2, 0x03d07a68, 0x00135a0b, 0x03592dd3, 0x0003aa0e}}}, + {X: Field{[10]uint32{0x02147f96, 0x019db307, 0x0066ae29, 0x01e53712, 0x03dd7c24, 0x01650174, 0x008ee975, 0x0316eea1, 0x0065fdcd, 0x0032012d}}, Y: Field{[10]uint32{0x03adc5a2, 0x03bbbc96, 0x035223a7, 0x028b3e6e, 0x03fb10cc, 0x02e0a393, 0x02bf43a9, 0x00adc3af, 0x02b71fd8, 0x002a928b}}}, + {X: Field{[10]uint32{0x010336d9, 0x03674f75, 0x03b7bd96, 0x02ecc64b, 0x005c74cf, 0x030cbdb0, 0x011b3383, 0x00ed5771, 0x03e55137, 0x001de9b8}}, Y: Field{[10]uint32{0x006f047f, 0x0162dac3, 0x032b67d3, 0x01b8e15b, 0x035de35d, 0x03ff355c, 0x02075c10, 0x02b1c523, 0x026e86ef, 0x0008748c}}}, + {X: Field{[10]uint32{0x015f7a5a, 0x00758b43, 0x018c9473, 0x033d938f, 0x01a89d82, 0x01a93b19, 0x02706ff2, 0x03bb4999, 0x01874a72, 0x0021b770}}, Y: Field{[10]uint32{0x030cc29c, 0x03396ad3, 0x0295c443, 0x01781337, 0x0340507b, 0x028f9b72, 0x0217816b, 0x02848ea4, 0x0040ce45, 0x00147df3}}}, + {X: Field{[10]uint32{0x03d3beca, 0x025bcff1, 0x028ce4a5, 0x03be13a8, 0x038c80d5, 0x005578c9, 0x0108675a, 0x03ab11b0, 0x00f8db8e, 0x0033d274}}, Y: Field{[10]uint32{0x020086fc, 0x02e5b7d0, 0x02d41235, 0x02970c51, 0x007cdd64, 0x0186475a, 0x002dcd6a, 0x01d70fb6, 0x0341ebae, 0x001bff71}}}, + {X: Field{[10]uint32{0x035875f4, 0x0232d52d, 0x00381051, 0x01457f86, 0x00c9f5c8, 0x03849b3b, 0x020e8721, 0x019c88b5, 0x038957eb, 0x00075d7b}}, Y: Field{[10]uint32{0x038dbdb4, 0x027719ad, 0x033e37b9, 0x0095dd96, 0x01c20766, 0x03e8750a, 0x024ae2f5, 0x0158776f, 0x03dd9288, 0x0020b177}}}, + {X: Field{[10]uint32{0x03ad0689, 0x00b2a279, 0x036dca29, 0x038f1b76, 0x005bb5b7, 0x02540cd2, 0x00d94666, 0x01848a76, 0x0335f62e, 0x002fa92d}}, Y: Field{[10]uint32{0x03a08901, 0x0082b4c1, 0x0011cd8e, 0x00dbd4a8, 0x027cda58, 0x02df007c, 0x019a4517, 0x0278439f, 0x038a08ea, 0x002438c9}}}, + {X: Field{[10]uint32{0x0169f2bb, 0x00e5aa58, 0x037281af, 0x03c2ceb2, 0x02577f5c, 0x01756627, 0x010aaa27, 0x0145c063, 0x02dea90e, 0x003a16c2}}, Y: Field{[10]uint32{0x0250aaa8, 0x01fd6679, 0x03358066, 0x01a75020, 0x0230ef12, 0x015edfd6, 0x016fec57, 0x01d718e4, 0x00cd3ca1, 0x00350a5c}}}, + {X: Field{[10]uint32{0x03928934, 0x0390b628, 0x00f5e3ff, 0x0213008a, 0x0082ca55, 0x033df30b, 0x01ed550f, 0x00149b90, 0x02dd2405, 0x00365d64}}, Y: Field{[10]uint32{0x022d102e, 0x013713bf, 0x0126a217, 0x01149bcb, 0x024de0db, 0x0008dbd3, 0x01a3852a, 0x0070edd6, 0x01696bf0, 0x003ab1b0}}}, + {X: Field{[10]uint32{0x026e00e7, 0x00d7b859, 0x013ebedd, 0x01d56bad, 0x00fd7725, 0x023195de, 0x00e60a9a, 0x008388de, 0x02a450b6, 0x0003808f}}, Y: Field{[10]uint32{0x0094797e, 0x0198d4da, 0x01e306a9, 0x01338df8, 0x026bdd54, 0x02457d41, 0x020f0e78, 0x033e26c1, 0x00506dbd, 0x001393b6}}}, + {X: Field{[10]uint32{0x01935e5a, 0x0013b083, 0x01c9cc83, 0x00b70c0b, 0x02a7c0ec, 0x01aa15ef, 0x001b9f7e, 0x03f5ba96, 0x00955cd4, 0x001856d7}}, Y: Field{[10]uint32{0x015f4d46, 0x0086c53f, 0x038d36e4, 0x01d3cda9, 0x0146fc80, 0x0175d536, 0x01845bff, 0x00c96ef3, 0x03662602, 0x00308871}}}, + {X: Field{[10]uint32{0x02ec13a7, 0x031cd625, 0x0185bc2c, 0x02168012, 0x03fa2a0d, 0x004e46f6, 0x00e34d60, 0x008086e7, 0x003402e1, 0x002c77e9}}, Y: Field{[10]uint32{0x0348438e, 0x00fbd665, 0x03eadd10, 0x03316264, 0x0013c2a5, 0x01be062d, 0x03b7e9b0, 0x03e0a076, 0x015a8162, 0x003e8f44}}}, + {X: Field{[10]uint32{0x03eada7c, 0x028f272e, 0x0097436b, 0x02acc966, 0x0068c7e1, 0x0393b372, 0x0275b835, 0x011ff6b1, 0x001fafbe, 0x002d92d8}}, Y: Field{[10]uint32{0x01dbe68d, 0x0148dd3a, 0x007d85ea, 0x00355cd2, 0x02652ae9, 0x018b6f26, 0x03606624, 0x015d1bfa, 0x0039d231, 0x002bde30}}}, + {X: Field{[10]uint32{0x03b579cf, 0x03cc991a, 0x013364a0, 0x008d49c5, 0x01b0981f, 0x02535d59, 0x01027d4e, 0x036721b1, 0x0346fda1, 0x00150a74}}, Y: Field{[10]uint32{0x015b1880, 0x025a8ca6, 0x00f37ac6, 0x01654519, 0x02162d66, 0x035d18db, 0x00754dd2, 0x0364b8e4, 0x0197dfec, 0x0016e338}}}, + {X: Field{[10]uint32{0x026f005b, 0x0152c58a, 0x03f94ff9, 0x01a7cde1, 0x0020e216, 0x00105d27, 0x000bb781, 0x019c62c1, 0x00f2056d, 0x002241a5}}, Y: Field{[10]uint32{0x01753341, 0x0070504b, 0x00df35df, 0x02dcc6e5, 0x007bf505, 0x01abf43e, 0x010d7b22, 0x02eff2ee, 0x034a890d, 0x003659a4}}}, + {X: Field{[10]uint32{0x003cc117, 0x00b0ad9d, 0x0067ccb9, 0x0079128a, 0x00269b5d, 0x03f81832, 0x02987a05, 0x009adfe9, 0x0292cd05, 0x000eb9d4}}, Y: Field{[10]uint32{0x02416a94, 0x028b757c, 0x02871d22, 0x03a61ee0, 0x00f004ee, 0x00cc95af, 0x03d5416a, 0x02a0b63d, 0x00c15a74, 0x00042567}}}, + {X: Field{[10]uint32{0x019b0707, 0x01771fca, 0x03ce93bb, 0x037a292a, 0x01347bba, 0x006e7e87, 0x0353fd5f, 0x01f55568, 0x029bff71, 0x00275d16}}, Y: Field{[10]uint32{0x02de8134, 0x030a399f, 0x0369b0ba, 0x03feb783, 0x0210461c, 0x039cd379, 0x004f615a, 0x031831cc, 0x00aed513, 0x0033bcce}}}, + {X: Field{[10]uint32{0x0144f166, 0x02e54674, 0x009f0aaa, 0x02599214, 0x00abf1b8, 0x0248b018, 0x01ce7f4f, 0x0324e441, 0x002c8130, 0x001a67a7}}, Y: Field{[10]uint32{0x003a19cd, 0x028e7b5f, 0x004a438d, 0x00a65f49, 0x01bfb7da, 0x00e0275a, 0x01145838, 0x03e51257, 0x010e1fb9, 0x00220ad2}}}, + {X: Field{[10]uint32{0x01591f87, 0x012869e1, 0x03550388, 0x02953d0c, 0x00ae79b4, 0x032ff8a6, 0x01ea704b, 0x001426a4, 0x00c1dc52, 0x0038e807}}, Y: Field{[10]uint32{0x02dcc64e, 0x005ff507, 0x00b96066, 0x0244dd24, 0x012480a8, 0x0376bd25, 0x0287e546, 0x02755ff2, 0x01f368d1, 0x003cf190}}}, + {X: Field{[10]uint32{0x02c433d1, 0x03b8e35a, 0x035f1ee5, 0x039bf63f, 0x00cc7cce, 0x01126145, 0x01d23623, 0x00dd751b, 0x01c3d9df, 0x00174543}}, Y: Field{[10]uint32{0x02ab0316, 0x00c5bad4, 0x00061a32, 0x03fafeb7, 0x02399a83, 0x02100424, 0x000263f1, 0x03a839f6, 0x0250d2e2, 0x000b0244}}}, + {X: Field{[10]uint32{0x00996a66, 0x003170b8, 0x02b16c10, 0x0201629b, 0x00ec4778, 0x038047e0, 0x00aea5b5, 0x02e8fd91, 0x0361bb12, 0x00127ee5}}, Y: Field{[10]uint32{0x0255e23c, 0x033f41b5, 0x00370089, 0x006e4a5e, 0x00d9086b, 0x00595317, 0x0099caf2, 0x02245161, 0x020fb720, 0x001c4d08}}}, + {X: Field{[10]uint32{0x0244738e, 0x0032514a, 0x03b13d53, 0x01687d3d, 0x00bdea05, 0x02b73770, 0x03990211, 0x00b7ef79, 0x02b3a451, 0x000d3157}}, Y: Field{[10]uint32{0x0398fd16, 0x02693153, 0x021f2ba3, 0x0254c8cc, 0x010fdbb6, 0x00325e79, 0x0110e26d, 0x01007e6a, 0x0288beff, 0x00096331}}}, + {X: Field{[10]uint32{0x00a3a98c, 0x0023508c, 0x0202ab25, 0x03c8c371, 0x039b1c39, 0x02bc3272, 0x037b82c2, 0x03f8013f, 0x00f07c3e, 0x001c1a3f}}, Y: Field{[10]uint32{0x037ef1fc, 0x02c65eb8, 0x01d77aaa, 0x01e5f8b8, 0x012fe506, 0x000ad77d, 0x03657bf2, 0x01e314b9, 0x00d88445, 0x003921cc}}}, + {X: Field{[10]uint32{0x03355a1e, 0x02e1d3da, 0x01909f73, 0x01528ac0, 0x02f49e52, 0x03a38d1b, 0x03a1f95a, 0x02aa844a, 0x0110a987, 0x00038762}}, Y: Field{[10]uint32{0x03e3cdb8, 0x02ae41c3, 0x00235d7b, 0x008282e4, 0x01d4a56a, 0x03f57167, 0x01c2c149, 0x011f6266, 0x011bcc49, 0x0022b40c}}}, + {X: Field{[10]uint32{0x02d2caf2, 0x02b0f2dc, 0x03d57c10, 0x0363b536, 0x006bdf06, 0x01837d17, 0x02c6b2dc, 0x018c6c05, 0x03880ba8, 0x00249426}}, Y: Field{[10]uint32{0x006a3ccf, 0x022bd61d, 0x038c3397, 0x00ccd776, 0x01ee6f0f, 0x0257c504, 0x0395651b, 0x018a66a7, 0x0231633b, 0x000fa91e}}}, + {X: Field{[10]uint32{0x0266a519, 0x00d5ab06, 0x0351206a, 0x0078d371, 0x01644647, 0x02df4a69, 0x02ec994d, 0x0017a65a, 0x002ae8d5, 0x00243f50}}, Y: Field{[10]uint32{0x02da3b6b, 0x0162e96e, 0x02a62e19, 0x01611aaa, 0x039a6dc6, 0x0313c399, 0x0231816e, 0x00db82b6, 0x03f7bcdc, 0x0001a303}}}, + {X: Field{[10]uint32{0x01400704, 0x024367ea, 0x005f5eb3, 0x01fc319b, 0x0004cbc7, 0x0104ac4a, 0x035b0ddd, 0x032a3878, 0x02cb7d9b, 0x0002ce03}}, Y: Field{[10]uint32{0x006a01a4, 0x03d14321, 0x038a7d78, 0x036f87d7, 0x0118fa71, 0x00a75573, 0x01f69a72, 0x02de0c27, 0x009277d9, 0x003f4a88}}}, + {X: Field{[10]uint32{0x02b83f0c, 0x03bdec0c, 0x027520d3, 0x03bf33ca, 0x03f3d029, 0x01852495, 0x0066140b, 0x02db3dbe, 0x0041aecb, 0x001038b8}}, Y: Field{[10]uint32{0x002291f0, 0x01d131af, 0x01326704, 0x01063949, 0x01e1eda6, 0x005fc8ca, 0x02266794, 0x02223d53, 0x00a53c83, 0x000489c4}}}, + {X: Field{[10]uint32{0x02a03583, 0x03082a2a, 0x009c8c99, 0x02e7dded, 0x037d254e, 0x02bab33a, 0x013a38e9, 0x00c324e2, 0x03c43f4e, 0x00239827}}, Y: Field{[10]uint32{0x02c1a3e8, 0x028f70de, 0x0296d066, 0x01ec3835, 0x00837fb5, 0x0075c0de, 0x0259a86b, 0x005411fc, 0x006e9a82, 0x00251f13}}}, + {X: Field{[10]uint32{0x0035f5ce, 0x03020d7d, 0x020bb2ec, 0x00914bf3, 0x038d9c93, 0x02be26a3, 0x0098d001, 0x027f441a, 0x01b22bfe, 0x002e1c71}}, Y: Field{[10]uint32{0x031d3078, 0x015bc9a3, 0x00b64cd6, 0x03b80018, 0x03507fe8, 0x03c0e000, 0x007226b6, 0x003ba67e, 0x01a3ecbd, 0x0038c0b9}}}, + {X: Field{[10]uint32{0x00841682, 0x001f3554, 0x03f832ac, 0x015f33a1, 0x01c6f80f, 0x01bffd35, 0x01241709, 0x02246aed, 0x027e039e, 0x00149b6a}}, Y: Field{[10]uint32{0x03d210df, 0x0169552c, 0x01f43c5f, 0x02733171, 0x00c477bc, 0x02b503da, 0x00fd3975, 0x004c39d6, 0x00994fb7, 0x001a7c11}}}, + {X: Field{[10]uint32{0x021ad25a, 0x004be521, 0x01ba2edc, 0x01462b76, 0x015c031f, 0x03ed9be8, 0x027cc073, 0x00c15f39, 0x004a514e, 0x00305709}}, Y: Field{[10]uint32{0x02846c50, 0x00e5661c, 0x01b901ba, 0x037d72c1, 0x0016449d, 0x02f26a3f, 0x0234780b, 0x03225e37, 0x01acecc3, 0x0036c408}}}, + {X: Field{[10]uint32{0x02c1d388, 0x00d05cfa, 0x033443e2, 0x01db36df, 0x01d34948, 0x00374f71, 0x03638735, 0x000e36ce, 0x0319466a, 0x000df882}}, Y: Field{[10]uint32{0x003b89f0, 0x023bd8ff, 0x00f252d6, 0x01e7da7b, 0x025ea5bb, 0x036d5eae, 0x02bcfa27, 0x01078bb2, 0x02245465, 0x00002e02}}}, + {X: Field{[10]uint32{0x024ea528, 0x02393ed5, 0x01eabc59, 0x03241ffd, 0x016a0da5, 0x015e5629, 0x011cd81f, 0x00050acc, 0x0328feae, 0x001b4247}}, Y: Field{[10]uint32{0x01d07906, 0x00a418ff, 0x0274c27c, 0x01f16a2e, 0x026e9d9f, 0x03217748, 0x01897196, 0x029b04e0, 0x03f04d7e, 0x00122f25}}}, + {X: Field{[10]uint32{0x0354fd71, 0x018d782e, 0x008d35ca, 0x0334fb75, 0x02d3e545, 0x020676ff, 0x001664fb, 0x03ed5bb4, 0x0016a76e, 0x000ef6f5}}, Y: Field{[10]uint32{0x00eb0639, 0x03cdbd4b, 0x00d26a6b, 0x024e0ae6, 0x039a63a8, 0x007eeb63, 0x03016219, 0x0094ffbc, 0x01723ed7, 0x0029a553}}}, + {X: Field{[10]uint32{0x029d61ce, 0x022cb91f, 0x01237401, 0x0103661c, 0x00c41095, 0x02f0cfbc, 0x005d41a4, 0x02d57e30, 0x02a9f111, 0x0033538d}}, Y: Field{[10]uint32{0x014e3e57, 0x03188551, 0x02ddadf0, 0x02f09939, 0x03abded9, 0x014b7e01, 0x02f95ec4, 0x00b9a41b, 0x02165263, 0x0011e37e}}}, + {X: Field{[10]uint32{0x01f24efd, 0x02a7c44b, 0x031c6272, 0x01c4b9df, 0x02248457, 0x01c2b19f, 0x03214131, 0x027038ef, 0x004a09c5, 0x0003c8f3}}, Y: Field{[10]uint32{0x037fa4b2, 0x0179f715, 0x013da9ed, 0x0339d28f, 0x02dc71cd, 0x00bde919, 0x0358fc07, 0x03bff573, 0x007299b6, 0x003a4cef}}}, + {X: Field{[10]uint32{0x013c33e0, 0x01a56b7b, 0x0098931a, 0x01250d75, 0x0300d7a3, 0x02db6d88, 0x0046840c, 0x03acd6da, 0x01858c97, 0x00366319}}, Y: Field{[10]uint32{0x03114990, 0x02e18b78, 0x02eb2a85, 0x0068593c, 0x01ba1378, 0x00189ce5, 0x02c953c7, 0x020977ad, 0x0224ffe8, 0x00110ffa}}}, + {X: Field{[10]uint32{0x00744225, 0x01b99adb, 0x0085fa94, 0x03728924, 0x0165325d, 0x031d2a6f, 0x012b9d16, 0x036b86db, 0x02a6c055, 0x00089a76}}, Y: Field{[10]uint32{0x01bfb3dd, 0x00b726fd, 0x03dee235, 0x03ceed1f, 0x0130e14f, 0x010bbf73, 0x00f0fe6a, 0x00115ac2, 0x01f9a61f, 0x00056740}}}, + {X: Field{[10]uint32{0x027c48d5, 0x010300c5, 0x03ba4877, 0x02d08eb9, 0x01eb4d75, 0x011ac06b, 0x023880a5, 0x021e4a37, 0x00fd8eea, 0x000cd411}}, Y: Field{[10]uint32{0x02da1cc1, 0x01e8c273, 0x00226818, 0x027398f6, 0x000cfe1d, 0x015ecefa, 0x030f2bb7, 0x01aef18e, 0x03f52626, 0x001a7940}}}, + {X: Field{[10]uint32{0x03f6c512, 0x0317e68f, 0x03a5046b, 0x026d8dea, 0x01a601da, 0x01ef2b9d, 0x00ee87b0, 0x02a0f953, 0x023d86f9, 0x003b9e89}}, Y: Field{[10]uint32{0x01373d56, 0x020a4250, 0x00f6042d, 0x020c587e, 0x01222714, 0x01039d8d, 0x008ac1c8, 0x01a3a48e, 0x01922032, 0x0027f74c}}}, + {X: Field{[10]uint32{0x03f44245, 0x03975694, 0x02d976c5, 0x0111d9a8, 0x00bf95f3, 0x03d12a22, 0x03b6111e, 0x018c6db1, 0x03b336f1, 0x0014a6cc}}, Y: Field{[10]uint32{0x02061099, 0x002a15fa, 0x030004cf, 0x03ba7335, 0x036f29f9, 0x00a00927, 0x02bc1a03, 0x01bd28be, 0x010693da, 0x0004a158}}}, + {X: Field{[10]uint32{0x03df1849, 0x00f3596a, 0x0243dd3e, 0x014e3af4, 0x006a2513, 0x035956a2, 0x01337182, 0x03a7d46a, 0x006da6ce, 0x003caccd}}, Y: Field{[10]uint32{0x03b77da3, 0x00ec3ddd, 0x032e1f48, 0x032cc937, 0x0355aaef, 0x03d89e34, 0x00665262, 0x000ffa7a, 0x0228be77, 0x0035077d}}}, + {X: Field{[10]uint32{0x0182befa, 0x0166dc11, 0x0037b3f5, 0x00a88bce, 0x011db7a1, 0x0358e31f, 0x0103d045, 0x026319c3, 0x01bcf03d, 0x0014d7a7}}, Y: Field{[10]uint32{0x02358392, 0x0307d967, 0x024e740b, 0x01853d93, 0x0262ea47, 0x01fe0e12, 0x00fa98d6, 0x025f16f5, 0x0228bad8, 0x000b08cc}}}, + {X: Field{[10]uint32{0x0299a7f1, 0x00ed282c, 0x03970825, 0x01e2140c, 0x00b019bf, 0x03fcd189, 0x023172dd, 0x01ab197b, 0x008b70da, 0x00304c5a}}, Y: Field{[10]uint32{0x00e5f3cc, 0x01e14677, 0x00d207dd, 0x03fc22e1, 0x000d6e1a, 0x027e65be, 0x0211d82e, 0x012365a6, 0x03b6e0e7, 0x003fbc61}}}, + {X: Field{[10]uint32{0x014d3ba9, 0x01c6c85d, 0x02a645dc, 0x003261c9, 0x02a984d0, 0x029afe0c, 0x00eddf3d, 0x01e61443, 0x00d3f7ab, 0x001d7721}}, Y: Field{[10]uint32{0x03841c50, 0x02c8cab8, 0x02183af5, 0x03ac770a, 0x0384f62d, 0x00bbaa94, 0x005e4d28, 0x001244b3, 0x01f35e11, 0x003d767b}}}, + {X: Field{[10]uint32{0x032a36c5, 0x011fb53c, 0x00648788, 0x035dbe63, 0x0282c6da, 0x01717f54, 0x03273102, 0x030e3ab9, 0x03bc9136, 0x00164771}}, Y: Field{[10]uint32{0x03a421a0, 0x025c9a35, 0x00233953, 0x02dc8751, 0x008d4875, 0x032db17a, 0x003aabb4, 0x034e0b80, 0x00c4f81c, 0x003f33e9}}}, + {X: Field{[10]uint32{0x02712596, 0x01d4f384, 0x00f0fb14, 0x02d93162, 0x02d2c78d, 0x021eb3de, 0x0148fadb, 0x024aeb9d, 0x00892a83, 0x0020e967}}, Y: Field{[10]uint32{0x03c5873b, 0x0140c339, 0x0119be3e, 0x038c573e, 0x0046f090, 0x0208bfcf, 0x027c5988, 0x00819435, 0x001a33b1, 0x001f402b}}}, + {X: Field{[10]uint32{0x026f6f83, 0x024f8b2e, 0x03fc76ca, 0x01a3b116, 0x036608f9, 0x018e47bf, 0x001b8c37, 0x02cbd2a7, 0x03a58c52, 0x003a6c37}}, Y: Field{[10]uint32{0x020a7c8d, 0x02d77bcb, 0x01be2e5c, 0x00e69e02, 0x035c1f08, 0x03acfcfe, 0x0089124f, 0x0378349d, 0x028d5846, 0x0019126c}}}, + {X: Field{[10]uint32{0x032bc03b, 0x0269942d, 0x02f81b1b, 0x01435569, 0x00c76adf, 0x00e8f497, 0x011c002d, 0x02430f45, 0x02f967b0, 0x00005b34}}, Y: Field{[10]uint32{0x02d63a7b, 0x03f931a2, 0x0206f50f, 0x013e123b, 0x03a23db7, 0x035e1162, 0x00cc091b, 0x01c240e7, 0x001e2fe7, 0x00316498}}}, + {X: Field{[10]uint32{0x02ff1cbe, 0x0128e28e, 0x026b6f58, 0x02e9ec61, 0x01d80b8d, 0x0135b97d, 0x023d9e24, 0x038d8da7, 0x03fd1bcd, 0x003cd1f4}}, Y: Field{[10]uint32{0x0287977a, 0x0313491f, 0x03a9766d, 0x02045613, 0x00c7349f, 0x0190497a, 0x01cfc6d0, 0x02284e63, 0x02b90ae3, 0x000710d6}}}, + {X: Field{[10]uint32{0x02428b1b, 0x00dd33f6, 0x0126d534, 0x034ad3a6, 0x01f349ed, 0x01248551, 0x0049f113, 0x02153243, 0x0187d644, 0x0016c643}}, Y: Field{[10]uint32{0x025401f3, 0x0325efbe, 0x03ea856b, 0x01dac9c4, 0x039c1d31, 0x0174b055, 0x013ab256, 0x035aed72, 0x00c363ef, 0x002293ab}}}, + {X: Field{[10]uint32{0x0030834f, 0x03d9f587, 0x003ab105, 0x03cdddcb, 0x01c49e78, 0x02f32b2b, 0x01e96650, 0x0133a3c8, 0x00b2d731, 0x0029de1b}}, Y: Field{[10]uint32{0x01441953, 0x025af52a, 0x0237146e, 0x006e817d, 0x006c4ea7, 0x02dc2ff0, 0x031f911c, 0x00b8fcbe, 0x00d41898, 0x0013f1eb}}}, + {X: Field{[10]uint32{0x03bf33cb, 0x02807ecb, 0x01dcf545, 0x009bc1cf, 0x02abf74d, 0x003bcd85, 0x01faeddc, 0x00686231, 0x0353e907, 0x0034d953}}, Y: Field{[10]uint32{0x032f4383, 0x03c40ed0, 0x00de1880, 0x03649b0f, 0x0377c7a3, 0x0129c5bc, 0x038502fc, 0x000e5165, 0x00c7213c, 0x00295bc8}}}, + {X: Field{[10]uint32{0x0022399c, 0x00e6a4de, 0x00994020, 0x01d83ba2, 0x0127d031, 0x02db6d33, 0x01d8ac3b, 0x032f681a, 0x0287400a, 0x003844e2}}, Y: Field{[10]uint32{0x03a162c1, 0x0259f544, 0x0012c9ce, 0x02543d78, 0x001803cd, 0x01a14f90, 0x0240de6b, 0x01b51971, 0x03bfdd3f, 0x003ca6a3}}}, + {X: Field{[10]uint32{0x02317708, 0x02b26561, 0x007e7374, 0x0039daee, 0x02571473, 0x03272a54, 0x03c49c69, 0x03d3942c, 0x023c91c0, 0x0034a7ad}}, Y: Field{[10]uint32{0x02a5f1a1, 0x02bfd87f, 0x03dd9d73, 0x027c72cf, 0x02d9d38c, 0x0215b79a, 0x022ab4ac, 0x02029674, 0x03024e91, 0x0012b64d}}}, + {X: Field{[10]uint32{0x02ee49f8, 0x022d2089, 0x03147ca4, 0x00c34637, 0x03d2124b, 0x022e3b2c, 0x0177da1d, 0x01ff5c19, 0x03baa671, 0x002a7500}}, Y: Field{[10]uint32{0x02d5323b, 0x005dadc9, 0x0133ff45, 0x027b6dd0, 0x0056f1e4, 0x02564451, 0x0137bcad, 0x0387b942, 0x027a8c5e, 0x0007bb7f}}}, + {X: Field{[10]uint32{0x02f57528, 0x01daf427, 0x01e39ca0, 0x018e6390, 0x018d8f37, 0x004b6272, 0x02c6bfd1, 0x00156bba, 0x00e8dbb6, 0x003fded6}}, Y: Field{[10]uint32{0x00381121, 0x034942bf, 0x02ee6cf5, 0x03d6f506, 0x018e39f1, 0x00db01a1, 0x02cb57c8, 0x01479c35, 0x01d1ad7a, 0x0013938e}}}, + {X: Field{[10]uint32{0x01362979, 0x02ebf46f, 0x016131e7, 0x007559bd, 0x021672ea, 0x038bc51b, 0x036db234, 0x027d8786, 0x029df783, 0x0010f142}}, Y: Field{[10]uint32{0x03f449ae, 0x029d3aa0, 0x03bd61ad, 0x0217d833, 0x001e2158, 0x02781486, 0x03e908f6, 0x006a2ea0, 0x02988154, 0x003c83f6}}}, + {X: Field{[10]uint32{0x034ac30c, 0x00fc89c5, 0x03e53984, 0x0354a74e, 0x035803a9, 0x02f9b410, 0x0262ae16, 0x004a61d5, 0x01b701c9, 0x003d822a}}, Y: Field{[10]uint32{0x027ad5bf, 0x03121a8c, 0x008f2083, 0x019b5ed4, 0x01d788d2, 0x004eed59, 0x02d32434, 0x0375086e, 0x00fae919, 0x0017bcd9}}}, + {X: Field{[10]uint32{0x005a117e, 0x004cc9d1, 0x02d568d0, 0x00881736, 0x033cc117, 0x03099d95, 0x03c48d00, 0x03c10fe6, 0x0029dd1e, 0x003244f8}}, Y: Field{[10]uint32{0x01a83049, 0x02169406, 0x02d8bace, 0x00610f89, 0x0032a38f, 0x00d49a81, 0x01cf07c1, 0x032ecdef, 0x030b9c31, 0x0025d5cf}}}, + {X: Field{[10]uint32{0x02a7d728, 0x03715720, 0x0363cce7, 0x02c4d20b, 0x0361318b, 0x0332a11f, 0x000c58a0, 0x01ef059b, 0x009db17e, 0x002ab831}}, Y: Field{[10]uint32{0x006be0b8, 0x0398ddd7, 0x012516a7, 0x03fe7576, 0x02810396, 0x01633703, 0x0051aae6, 0x00f6b088, 0x03f3f68c, 0x001045c2}}}, + {X: Field{[10]uint32{0x03c846c8, 0x02a8e23a, 0x02c96d35, 0x02d7af16, 0x01e306c8, 0x03792817, 0x039b15e3, 0x02d88966, 0x031f45a0, 0x003ca017}}, Y: Field{[10]uint32{0x038d1267, 0x027421da, 0x01dc9978, 0x00709902, 0x00b36e20, 0x0244be8e, 0x0325cdd0, 0x01c9115d, 0x03396ba3, 0x003d75c9}}}, + {X: Field{[10]uint32{0x00fa4f39, 0x029ea400, 0x030d87b0, 0x00e9e049, 0x00f7d232, 0x01f61968, 0x0230e593, 0x0344b928, 0x00e6e150, 0x001a5a79}}, Y: Field{[10]uint32{0x0214de3a, 0x02dc61d7, 0x02f888da, 0x036eab85, 0x03e030a0, 0x01657727, 0x037ebe08, 0x03b430f9, 0x03d6d323, 0x0031c70c}}}, + {X: Field{[10]uint32{0x01988f3e, 0x03bc0e63, 0x003e3e4c, 0x00e90465, 0x022aa064, 0x021cb7ef, 0x00fbdb8e, 0x0095eaf9, 0x03f07a0e, 0x0002bb0a}}, Y: Field{[10]uint32{0x00c931d0, 0x00755172, 0x01df6ef2, 0x0289c936, 0x00bcc3b6, 0x03fc2a0c, 0x00bc528f, 0x030e0321, 0x0157e686, 0x00363a7d}}}, + {X: Field{[10]uint32{0x0126f710, 0x0090ef52, 0x033226bb, 0x0071e42f, 0x01198f56, 0x02764775, 0x002890b6, 0x030d7294, 0x019a13df, 0x00271bfe}}, Y: Field{[10]uint32{0x03ef849d, 0x020d00fd, 0x0311e9b6, 0x018cd08a, 0x012f7f4e, 0x03fd1a0e, 0x008f5411, 0x03d6b676, 0x020c84a4, 0x000abbe4}}}, + {X: Field{[10]uint32{0x02d7f1c2, 0x0239b825, 0x00aefafb, 0x03b2d776, 0x02ade75a, 0x03bb7994, 0x00246d67, 0x0388e37c, 0x005b37a5, 0x003e90dd}}, Y: Field{[10]uint32{0x018689b1, 0x013a0b6a, 0x01eaddc4, 0x03e167fa, 0x0248aba7, 0x03be4e7b, 0x013c8f3f, 0x019500de, 0x02a42a3c, 0x0037e756}}}, + {X: Field{[10]uint32{0x038d46b9, 0x010f76a9, 0x00741276, 0x01396196, 0x020ce3b7, 0x039ddfe5, 0x03b84d09, 0x009b1fac, 0x02886c4e, 0x001a528c}}, Y: Field{[10]uint32{0x03dfe67a, 0x01aa7862, 0x018b0144, 0x00cb2c4c, 0x02a700d9, 0x0248b316, 0x00909be0, 0x011795ba, 0x006d0076, 0x0029535b}}}, + {X: Field{[10]uint32{0x008f38a0, 0x02b45eb0, 0x02be43d4, 0x0081f31c, 0x01930fe9, 0x00498843, 0x00339a2b, 0x01aca2d3, 0x01975be0, 0x00195265}}, Y: Field{[10]uint32{0x02f7900c, 0x01110fdc, 0x02be1c68, 0x02c22cd6, 0x03d29fe8, 0x02078fd6, 0x02cd92ce, 0x03738cb4, 0x03bb467f, 0x002f7b88}}}, + {X: Field{[10]uint32{0x0399f0bd, 0x00266c01, 0x00137400, 0x02ca6c42, 0x000ea38e, 0x020ebb11, 0x014f0844, 0x005392df, 0x00f675bb, 0x000de472}}, Y: Field{[10]uint32{0x02f7bc76, 0x013a463b, 0x0316d15a, 0x01170c72, 0x018b2a3f, 0x02fb97b9, 0x0396ddbc, 0x017adbce, 0x034ada5e, 0x000b723d}}}, + {X: Field{[10]uint32{0x02f31364, 0x0106a31b, 0x018ed429, 0x01e864e7, 0x0359795c, 0x02b3da90, 0x00469360, 0x0243a7a4, 0x0065eaf8, 0x00357904}}, Y: Field{[10]uint32{0x025bbcad, 0x0055b2fd, 0x03f6d21f, 0x032c341b, 0x00bd2f30, 0x00b930cb, 0x03bb6b8f, 0x03f539ea, 0x00c8a559, 0x000647b1}}}, + {X: Field{[10]uint32{0x00970dec, 0x02b5940b, 0x03ae8b77, 0x03cbaaa8, 0x01e504e6, 0x008162e6, 0x0229acb6, 0x010134a2, 0x0280fa0b, 0x0005b388}}, Y: Field{[10]uint32{0x02efb09b, 0x012e0755, 0x029b8817, 0x0179fe5b, 0x00b6eaec, 0x01d39643, 0x00bc2520, 0x0376e795, 0x03f4486a, 0x000f51a0}}}, + {X: Field{[10]uint32{0x02107d07, 0x00ed4071, 0x030160bf, 0x01fb5f51, 0x03e08f99, 0x005a106d, 0x025b4478, 0x02c7ce43, 0x03306cdf, 0x0029ac2a}}, Y: Field{[10]uint32{0x000abf7a, 0x02692daa, 0x0258d9cb, 0x0392843d, 0x03094e96, 0x01caaf26, 0x02d337fd, 0x009e524b, 0x002fb67e, 0x000a98a1}}}, + {X: Field{[10]uint32{0x02033583, 0x00018a15, 0x02d9021e, 0x022a3fda, 0x0252b9d0, 0x01c27cdd, 0x00b779cd, 0x00c82c87, 0x0138760b, 0x0035f29b}}, Y: Field{[10]uint32{0x009e7bb5, 0x01cbffe1, 0x01b046d6, 0x03ea660b, 0x015e2d1c, 0x00500586, 0x011b6cbb, 0x0166e5ae, 0x0372866d, 0x0035b017}}}, + {X: Field{[10]uint32{0x01609d33, 0x01b2d17d, 0x03ef375f, 0x01758682, 0x03e16240, 0x004871cf, 0x00cb1347, 0x01c1f9ce, 0x01632d3f, 0x001e2ac1}}, Y: Field{[10]uint32{0x0275a6b0, 0x013b17fb, 0x034f2109, 0x012557ed, 0x00350eba, 0x02ea9714, 0x03a4b424, 0x032d3ca5, 0x010c10c7, 0x003f868e}}}, + {X: Field{[10]uint32{0x000d6f04, 0x001cb146, 0x01879bd1, 0x00a0a24d, 0x01218e21, 0x003923f6, 0x01fc5a96, 0x03a00c19, 0x013a5b9f, 0x003014d5}}, Y: Field{[10]uint32{0x02719192, 0x0221a68f, 0x008a4752, 0x03714730, 0x027d0d28, 0x01ef8a00, 0x01c45cf5, 0x02ac1384, 0x0374214d, 0x00380b69}}}, + {X: Field{[10]uint32{0x03f02d03, 0x0357af48, 0x01b4eb65, 0x025604e1, 0x035faf8e, 0x003f07ec, 0x018d4033, 0x02570fbe, 0x0313e2a9, 0x002fe175}}, Y: Field{[10]uint32{0x03e59b18, 0x0101d22c, 0x00bbd6b9, 0x025a20a1, 0x03dcb68e, 0x00777481, 0x0142a6f2, 0x02c386a1, 0x014758d7, 0x00297516}}}, + {X: Field{[10]uint32{0x01bd280a, 0x01343c40, 0x0031d69a, 0x00167954, 0x00138169, 0x02c2bbb0, 0x022ee0de, 0x01e2e03f, 0x02c92be5, 0x003edced}}, Y: Field{[10]uint32{0x0214cd16, 0x0348b165, 0x01cf3e31, 0x0260df8f, 0x00e15bbc, 0x016f7a06, 0x0030bd25, 0x02957f51, 0x00939bf5, 0x001cb39e}}}, + {X: Field{[10]uint32{0x0228aa79, 0x03cdc305, 0x00dfc1e2, 0x00d60cd8, 0x00d99281, 0x03d2db0b, 0x01b04f78, 0x02372480, 0x025aed33, 0x0015925b}}, Y: Field{[10]uint32{0x028c2db1, 0x02291daf, 0x0072586c, 0x015344c0, 0x00092ffa, 0x015b5454, 0x0315d3fa, 0x0329c048, 0x008a824f, 0x002076fd}}}, + {X: Field{[10]uint32{0x03a2130c, 0x01724c6d, 0x036df790, 0x01e56327, 0x02aecc0a, 0x03ca9086, 0x01edcc62, 0x03c26121, 0x03959e81, 0x0035a638}}, Y: Field{[10]uint32{0x01563d27, 0x01e3271e, 0x03ba45ce, 0x02f8743f, 0x0179408b, 0x03a5c28e, 0x0001a8e3, 0x02a8e76b, 0x02bce61e, 0x001640f7}}}, + {X: Field{[10]uint32{0x0166ff80, 0x01d93931, 0x01931780, 0x01ee4e1f, 0x007fad8d, 0x00d012cd, 0x02ade00d, 0x025142cc, 0x02408670, 0x00212ccb}}, Y: Field{[10]uint32{0x031cfdc8, 0x00e9606e, 0x01c244aa, 0x039000c9, 0x009bb5b0, 0x025714d4, 0x03941e31, 0x010a58ad, 0x007856cc, 0x00132034}}}, + {X: Field{[10]uint32{0x00db2ed6, 0x00e29842, 0x00cf05ac, 0x010ca3cc, 0x036528e2, 0x007b4cc9, 0x0073a45f, 0x0226d306, 0x03992a36, 0x001c4a71}}, Y: Field{[10]uint32{0x020810e4, 0x02265699, 0x00a68ce3, 0x00673cff, 0x0044f866, 0x024026aa, 0x01154567, 0x00969753, 0x03e84821, 0x000d8ad3}}}, + {X: Field{[10]uint32{0x0180d824, 0x00e74a34, 0x01b98781, 0x01fbda31, 0x005f8cad, 0x0326470d, 0x02cac088, 0x02dba9ad, 0x0087fa48, 0x0024c593}}, Y: Field{[10]uint32{0x01d9e26b, 0x017a11ed, 0x02a87278, 0x0087234d, 0x03bd1832, 0x0058e5aa, 0x0397771d, 0x03c3e432, 0x015cc91c, 0x0028eb03}}}, + {X: Field{[10]uint32{0x03305a68, 0x03b66c27, 0x02d94808, 0x017a2e26, 0x0194744d, 0x024a7cca, 0x004c7b1f, 0x024df28e, 0x00e237c4, 0x0013e43a}}, Y: Field{[10]uint32{0x012430b8, 0x0123c226, 0x00e70147, 0x0000d0f1, 0x02ce725e, 0x033bb41e, 0x03f417cf, 0x01212c20, 0x02e02b6b, 0x003379dd}}}, + {X: Field{[10]uint32{0x01f716a1, 0x03e46d9d, 0x00ed6a10, 0x0284f016, 0x034442f6, 0x014fb334, 0x0113fae2, 0x01c5ab9a, 0x03bc9f40, 0x00136580}}, Y: Field{[10]uint32{0x0124add6, 0x0153b90e, 0x02493c66, 0x0048a12a, 0x009c52a4, 0x029bed14, 0x0165827a, 0x038d565c, 0x01fc278c, 0x0024ad9e}}}, + {X: Field{[10]uint32{0x02b17203, 0x004f1312, 0x006a5aed, 0x00619fe4, 0x03f90cd7, 0x0058cb84, 0x0094f3bc, 0x01050c4b, 0x011f91c5, 0x0022dbd9}}, Y: Field{[10]uint32{0x010c7066, 0x020d9548, 0x02c130bf, 0x0256eb1a, 0x0109ded9, 0x0049b103, 0x00e2b78c, 0x00955aed, 0x01a4b80f, 0x00223056}}}, + {X: Field{[10]uint32{0x025ec256, 0x03082f6c, 0x02ee98cd, 0x03ad8155, 0x021909e1, 0x02352645, 0x02448f07, 0x020d1fa1, 0x0052cab9, 0x001bd62e}}, Y: Field{[10]uint32{0x00239885, 0x01c08f26, 0x01cd32fa, 0x02cab601, 0x021681da, 0x02833afa, 0x02bd30dd, 0x024c179a, 0x005f233d, 0x0000e930}}}, + {X: Field{[10]uint32{0x000c44bd, 0x02601c44, 0x010086cb, 0x024566a4, 0x028bb6ca, 0x03febe8c, 0x03710da3, 0x010472b2, 0x02a84021, 0x001af9fd}}, Y: Field{[10]uint32{0x0036bee9, 0x00405152, 0x0168bb58, 0x03fcc83a, 0x0186f339, 0x017f0464, 0x01c8d59b, 0x037ed160, 0x02f9d461, 0x002fd929}}}, + {X: Field{[10]uint32{0x02102d39, 0x020f4b2b, 0x0044ab39, 0x003cab06, 0x0299661f, 0x03b3fe6a, 0x00fdbe13, 0x02799bcb, 0x010bb8ea, 0x0002cbf3}}, Y: Field{[10]uint32{0x0182bb86, 0x013a339c, 0x02c74144, 0x02c3a8cf, 0x0027c38c, 0x00e9fa04, 0x032cbbad, 0x023e8c3a, 0x0189bb3b, 0x0002811a}}}, + {X: Field{[10]uint32{0x01a6fd96, 0x03dd129e, 0x02f1291b, 0x01adb667, 0x03391682, 0x00331644, 0x037770b5, 0x026ca7b7, 0x010eab55, 0x002875bb}}, Y: Field{[10]uint32{0x004ab69b, 0x008ded30, 0x03391df2, 0x00c02b1a, 0x002f17df, 0x00612025, 0x03bf93b5, 0x0156b85c, 0x017e0c92, 0x002ee459}}}, + {X: Field{[10]uint32{0x012a9575, 0x02a047a4, 0x0301bd08, 0x039f8725, 0x01440da5, 0x026ad8e7, 0x0366201e, 0x00c35cd4, 0x030ded71, 0x000a3d95}}, Y: Field{[10]uint32{0x02d2884a, 0x039ab73c, 0x0362edec, 0x017a5576, 0x00e2216e, 0x03efd30b, 0x011a7c70, 0x0166c8fa, 0x0360119c, 0x000e4647}}}, + {X: Field{[10]uint32{0x00271fa3, 0x032013e4, 0x038530b9, 0x0089258d, 0x0031cfce, 0x00075edb, 0x00b089d1, 0x00f79086, 0x00eddbb8, 0x00005323}}, Y: Field{[10]uint32{0x029a41fc, 0x03fb393a, 0x0384d7a8, 0x00f5128b, 0x030de129, 0x0131e252, 0x01cba3d2, 0x00b9c44d, 0x02d2a5d0, 0x00012014}}}, + {X: Field{[10]uint32{0x012d489b, 0x00be3eb8, 0x03ca9eda, 0x00ee4886, 0x03a75f56, 0x03211429, 0x0228fa1b, 0x00df4f4a, 0x0305fec7, 0x003abfe7}}, Y: Field{[10]uint32{0x03b8c139, 0x02dc2a48, 0x01c3dd3f, 0x01206844, 0x022ad9f3, 0x0083d18e, 0x03349fa5, 0x021cf5f4, 0x019b05c9, 0x0035b510}}}, + {X: Field{[10]uint32{0x00b35e95, 0x02fb4545, 0x02a43d92, 0x03825a4c, 0x00ce0757, 0x00b9ff0f, 0x03524575, 0x00dc4a16, 0x006eb42a, 0x003a3b93}}, Y: Field{[10]uint32{0x023b748a, 0x00c28ada, 0x01e2d5f2, 0x03f32f17, 0x00ee55ab, 0x0091b2df, 0x007ff4e6, 0x0060c7c4, 0x014c27ef, 0x000361af}}}, + {X: Field{[10]uint32{0x0241e7e4, 0x01db9abb, 0x00386a07, 0x008819de, 0x02d5e909, 0x03222946, 0x03707591, 0x00ec181a, 0x01090821, 0x00263186}}, Y: Field{[10]uint32{0x025d4c8c, 0x0106bbfd, 0x03efbfc2, 0x02a068df, 0x030fd72d, 0x02339314, 0x0290e2d3, 0x02e4110b, 0x022cf98b, 0x003acf4b}}}, + {X: Field{[10]uint32{0x0146dd29, 0x033dfcfe, 0x0217d946, 0x001938a3, 0x01893198, 0x00e2f2d7, 0x03a0dbbc, 0x00a61b15, 0x0381f5d6, 0x00353d9a}}, Y: Field{[10]uint32{0x037a5fc2, 0x02087ede, 0x03b32867, 0x023814c2, 0x002a1229, 0x02052d6e, 0x03c5579d, 0x0068032d, 0x038deedf, 0x003064c3}}}, + {X: Field{[10]uint32{0x0011087f, 0x01e41805, 0x03c4eb98, 0x030ab511, 0x01a13dd4, 0x02619bc3, 0x01543696, 0x02466d57, 0x00e705f8, 0x000535cf}}, Y: Field{[10]uint32{0x03ededf8, 0x0381b1a4, 0x0067d16e, 0x03c98a75, 0x03b71c48, 0x02bd0822, 0x0106df2c, 0x0034f174, 0x0222b9cb, 0x001a6e51}}}, + {X: Field{[10]uint32{0x03da3aec, 0x00d30808, 0x017115bc, 0x010229c4, 0x015646ab, 0x02942a35, 0x00511058, 0x01e831ab, 0x0135059c, 0x0015fbf2}}, Y: Field{[10]uint32{0x01c5dfd1, 0x01cb00ad, 0x00c4b262, 0x03c14ccb, 0x0127f959, 0x00ab954a, 0x03fba0d9, 0x015705d2, 0x029a60b8, 0x003f2a4c}}}, + {X: Field{[10]uint32{0x01b3677f, 0x00dcbf65, 0x0073dcb6, 0x03d4da0e, 0x00171213, 0x016a7cf9, 0x00b94585, 0x02a036a4, 0x0286063d, 0x00247c4e}}, Y: Field{[10]uint32{0x019a90ea, 0x02d3bed0, 0x016d03ca, 0x03384d05, 0x01e0332e, 0x0081558e, 0x029a7ae9, 0x03c4430c, 0x00d86734, 0x001d0178}}}, + {X: Field{[10]uint32{0x01607592, 0x035abfe8, 0x037675f9, 0x005b44cd, 0x02c33227, 0x01037170, 0x03dfd64b, 0x017896a0, 0x010b4614, 0x00373213}}, Y: Field{[10]uint32{0x012d6c66, 0x02a2ea07, 0x00adc8bb, 0x01869c0c, 0x0251b951, 0x03d4c91a, 0x01f15260, 0x03fab023, 0x00f48e4d, 0x00391a93}}}, + {X: Field{[10]uint32{0x0348676c, 0x01405d0c, 0x02db0542, 0x007f7c5a, 0x00df0bfa, 0x02fcf1a8, 0x016011e6, 0x03d0c804, 0x02acd5a6, 0x000a2ac1}}, Y: Field{[10]uint32{0x03b0cb9a, 0x015ad8e5, 0x012d427e, 0x00af8369, 0x03cc31f4, 0x013ff3fb, 0x011d6b7a, 0x01276ba7, 0x021c967f, 0x001449ca}}}, + {X: Field{[10]uint32{0x01d8b240, 0x03c3d148, 0x02d00bef, 0x0248c830, 0x020d9c2a, 0x0245718d, 0x032adb45, 0x037f7f4f, 0x0321f8d1, 0x0001f006}}, Y: Field{[10]uint32{0x002c8b48, 0x03e89715, 0x01aedf76, 0x018b4db4, 0x016e7ffd, 0x02aa5acf, 0x02f78fda, 0x01b607f1, 0x03cc9990, 0x002d2923}}}, + {X: Field{[10]uint32{0x014d98f1, 0x02a66b34, 0x01f5b428, 0x026f832d, 0x03a0d327, 0x02703a3e, 0x03624230, 0x03a57ca8, 0x037830f8, 0x003e53ba}}, Y: Field{[10]uint32{0x03649527, 0x03f8f290, 0x00d2305c, 0x0076544f, 0x03715722, 0x02ed2a4f, 0x01c91be8, 0x01ae7297, 0x03646967, 0x00325b56}}}, + {X: Field{[10]uint32{0x01ec35ca, 0x01bd7e04, 0x0045bd40, 0x01dcc3a4, 0x039a6d64, 0x03d78cb4, 0x01e0dd85, 0x0336902f, 0x00e47788, 0x003a919d}}, Y: Field{[10]uint32{0x035a235a, 0x01188c29, 0x01a0fe1a, 0x0185093a, 0x01fb622a, 0x0062f5da, 0x030032ba, 0x024488c1, 0x03790a9b, 0x0001da6f}}}, + {X: Field{[10]uint32{0x03b40112, 0x00f09407, 0x005d1728, 0x0234dd9d, 0x0019b7b3, 0x020aff8a, 0x03172606, 0x021a1404, 0x00197f8f, 0x0036969d}}, Y: Field{[10]uint32{0x01c37a39, 0x018f8ee5, 0x0290ceb6, 0x0104841c, 0x00b5a19f, 0x0358dcef, 0x025ef5f5, 0x0078604c, 0x02ec0587, 0x002982d7}}}, + {X: Field{[10]uint32{0x02e9d41d, 0x03dcbc89, 0x03b6c22f, 0x03b08ee3, 0x01a75ebc, 0x03b5eddb, 0x00c6820d, 0x003f6806, 0x03a55256, 0x0030405f}}, Y: Field{[10]uint32{0x009fed39, 0x01e0450d, 0x0129b1b0, 0x03699e0a, 0x039b5dc1, 0x03fc1625, 0x03da3b8d, 0x011fe459, 0x019daf26, 0x003a51ec}}}, + {X: Field{[10]uint32{0x01216a7f, 0x03a452ca, 0x00b164b3, 0x016066fc, 0x011b9646, 0x0160269d, 0x0215238b, 0x0111d9e2, 0x00e14e81, 0x0002f9f0}}, Y: Field{[10]uint32{0x03eb392e, 0x0189e803, 0x0204e4f1, 0x002e28d8, 0x01088084, 0x035923a0, 0x03072b15, 0x00669bc2, 0x0297f642, 0x0028c3af}}}, + {X: Field{[10]uint32{0x03007cea, 0x00ec4e65, 0x0014fcb5, 0x03cb3e01, 0x0059e0ff, 0x00bffe0b, 0x01184056, 0x0303f730, 0x02c1a4d6, 0x0019d63b}}, Y: Field{[10]uint32{0x00b316b3, 0x038fabdf, 0x00edcb4f, 0x02eb42e7, 0x00a0149b, 0x01898c7a, 0x02c88988, 0x03614908, 0x006620fc, 0x001194ef}}}, + {X: Field{[10]uint32{0x005b6116, 0x02143710, 0x01dae70d, 0x0379a6b3, 0x03011014, 0x03a1cd6c, 0x000cf059, 0x01366676, 0x01d3f88f, 0x00272ed4}}, Y: Field{[10]uint32{0x01902360, 0x01442ec9, 0x023d60e2, 0x02064642, 0x02047c63, 0x01fbf134, 0x00e0ed51, 0x016d4a00, 0x0348cad7, 0x0037e8b9}}}, + {X: Field{[10]uint32{0x00bf0bc3, 0x03854436, 0x00dea3d6, 0x0354d087, 0x0065328b, 0x02a96b46, 0x0350229e, 0x01e4bc5c, 0x02e7b170, 0x0018e96a}}, Y: Field{[10]uint32{0x02da1010, 0x03ee20d4, 0x00ea195a, 0x035e3396, 0x0212a261, 0x034d8d30, 0x026250ae, 0x017d27df, 0x03d0f25d, 0x0004496b}}}, + {X: Field{[10]uint32{0x02f10657, 0x038b226c, 0x02430b0f, 0x00907698, 0x014e036d, 0x0090f688, 0x02e11fb0, 0x000ca3ae, 0x02493e5f, 0x002b7e58}}, Y: Field{[10]uint32{0x01b1ea1e, 0x00d2d5c2, 0x037f784f, 0x037a280f, 0x03219a29, 0x005f52d7, 0x0018b16d, 0x0376ccb4, 0x00bafcd8, 0x0014260d}}}, + {X: Field{[10]uint32{0x034d472f, 0x01d97678, 0x01f32f00, 0x01270ac9, 0x01bfdfa5, 0x00135c89, 0x0183364e, 0x0128564d, 0x035b7fb4, 0x00028363}}, Y: Field{[10]uint32{0x03998ab2, 0x026c48bb, 0x0048dd53, 0x008be7df, 0x01630b6c, 0x0365ff8f, 0x01da99f3, 0x009a1e52, 0x0366f84c, 0x000187aa}}}, + {X: Field{[10]uint32{0x02e61fc1, 0x019a42c2, 0x0033ef68, 0x03496c9f, 0x027a3ee0, 0x01b60097, 0x00dbf815, 0x028b6eb7, 0x00ea9596, 0x002e60c2}}, Y: Field{[10]uint32{0x03ddbd37, 0x00334149, 0x006f5125, 0x01b9619e, 0x01445bae, 0x00f3f496, 0x00c582a0, 0x02933ad3, 0x03177566, 0x00336d38}}}, + {X: Field{[10]uint32{0x00b98134, 0x008cabdc, 0x03f637f0, 0x03236d2a, 0x03cf3969, 0x024ee8c0, 0x01eefe37, 0x035b3046, 0x031d37e3, 0x00386993}}, Y: Field{[10]uint32{0x003231da, 0x0173b507, 0x00fc2f95, 0x019e3d3b, 0x01ddbd35, 0x00fd606d, 0x00d2084b, 0x034bd7b1, 0x02d8885d, 0x0016235e}}}, + {X: Field{[10]uint32{0x01fdaaed, 0x0089da99, 0x00eca49c, 0x03b9ebc5, 0x01318929, 0x035c4644, 0x02253a1b, 0x00ea9b9c, 0x03ede854, 0x003ef577}}, Y: Field{[10]uint32{0x013b78bc, 0x033efc06, 0x016f2f76, 0x006b6f43, 0x00f23489, 0x016e30c4, 0x0005d516, 0x00d458f1, 0x030a432c, 0x000c5f3b}}}, + {X: Field{[10]uint32{0x00da6bc2, 0x01df39a1, 0x00a2ae30, 0x0137005e, 0x0030b87c, 0x03dedbc8, 0x031a8822, 0x02544213, 0x03f3b0a3, 0x003eb12d}}, Y: Field{[10]uint32{0x00867d75, 0x02ca656f, 0x01fae390, 0x034557c6, 0x00386ce0, 0x018a3f75, 0x00a5c54a, 0x008bf058, 0x01209e95, 0x001c0a6e}}}, + {X: Field{[10]uint32{0x03ef7c2b, 0x02a06150, 0x0053ee64, 0x014571d7, 0x013c29fc, 0x006d7f1f, 0x02c02964, 0x033d4200, 0x03de834f, 0x0032a190}}, Y: Field{[10]uint32{0x03cf17f9, 0x03ea592b, 0x014c3b26, 0x00c73b9c, 0x02f8ecea, 0x02b6767e, 0x036fd4d0, 0x00a5b890, 0x0027111e, 0x00241e9b}}}, + {X: Field{[10]uint32{0x03315f1f, 0x00b25b3c, 0x0066b120, 0x008af150, 0x03a4a73b, 0x03f92d22, 0x0226b19e, 0x003a85fa, 0x02490d70, 0x001c61cd}}, Y: Field{[10]uint32{0x03ded2fd, 0x00b04761, 0x0215abd8, 0x01208108, 0x01515127, 0x03973d0a, 0x03fc614d, 0x01d2ddd4, 0x00474bb3, 0x003db361}}}, + {X: Field{[10]uint32{0x00c5e3d7, 0x030f14d2, 0x03e6f15a, 0x023dddb2, 0x00175b76, 0x01df18fc, 0x02574826, 0x031cc89b, 0x00ff21c3, 0x0019f9ce}}, Y: Field{[10]uint32{0x02f2bdb2, 0x024d43ba, 0x026bfac7, 0x0151744c, 0x030ebd28, 0x01f3d824, 0x03a50644, 0x0375c95d, 0x000f2343, 0x00053945}}}, + {X: Field{[10]uint32{0x02198893, 0x03d57c66, 0x02934280, 0x010998b3, 0x036c5a5c, 0x00d3b85f, 0x01339f64, 0x0094fc81, 0x0331f875, 0x001452cf}}, Y: Field{[10]uint32{0x02e9a090, 0x02601f92, 0x0269fe46, 0x030b72a5, 0x01a61c0f, 0x039f3793, 0x011c538c, 0x03b1c133, 0x0193a2fb, 0x0013acce}}}, + {X: Field{[10]uint32{0x03c2dab3, 0x01614062, 0x03586f98, 0x005be12c, 0x02ca53c2, 0x006280e4, 0x0330a414, 0x00f9d5aa, 0x03a6eab0, 0x00109ab3}}, Y: Field{[10]uint32{0x01083926, 0x0166ab7c, 0x01a74acb, 0x03441d27, 0x02d34944, 0x0015ceed, 0x0206682d, 0x00431702, 0x02ab21cc, 0x0030f58f}}}, + {X: Field{[10]uint32{0x02d7a09c, 0x003a3de8, 0x005cad42, 0x01cb1608, 0x01b8ad4a, 0x01165f21, 0x03dcbee9, 0x015cdc3f, 0x034668c0, 0x002e51ae}}, Y: Field{[10]uint32{0x023401b9, 0x008eeb47, 0x02b2cdc7, 0x00e927fb, 0x03969ea1, 0x0196f180, 0x03e63a5e, 0x00e09959, 0x02d41263, 0x00331c03}}}, + {X: Field{[10]uint32{0x018e33ac, 0x00d6e576, 0x02dcd803, 0x03e3eca2, 0x001d1e38, 0x0335d77d, 0x01d7d3cc, 0x02d17d44, 0x00b3f6c8, 0x0039aa11}}, Y: Field{[10]uint32{0x0058cce2, 0x005db0bb, 0x017e2c0b, 0x00273249, 0x036c4aa1, 0x007dc5ea, 0x023268ee, 0x022431d2, 0x03893939, 0x0001fc91}}}, + {X: Field{[10]uint32{0x02458001, 0x034503e5, 0x03dcd117, 0x00fc08c4, 0x00493e90, 0x01492e63, 0x0236b415, 0x014ba305, 0x03bfd9e0, 0x0010f98a}}, Y: Field{[10]uint32{0x023b352d, 0x011de669, 0x03cec8e1, 0x02ed27b2, 0x01ebee23, 0x0373fcc7, 0x01993000, 0x0354a0c2, 0x013d0a90, 0x003d2061}}}, + {X: Field{[10]uint32{0x0047f817, 0x03d12e20, 0x02ad9e94, 0x01124496, 0x01e555a8, 0x00776e6f, 0x0223e1c4, 0x011db50b, 0x000e3427, 0x003113bd}}, Y: Field{[10]uint32{0x02236fac, 0x02e7a8e3, 0x009d2498, 0x02cb6e13, 0x0238f664, 0x01dbd2b8, 0x0018e147, 0x03964fca, 0x0313e43e, 0x002fb750}}}, + {X: Field{[10]uint32{0x03212385, 0x022f7814, 0x037e8d40, 0x03eabf66, 0x037f58f2, 0x03e39265, 0x016f93f5, 0x00625702, 0x0313dcc1, 0x00286cd4}}, Y: Field{[10]uint32{0x023079f5, 0x023a29c2, 0x02c55bdc, 0x03008098, 0x03135a9e, 0x0024f605, 0x009f9cf5, 0x01430dcc, 0x025abf0d, 0x002f5fac}}}, + {X: Field{[10]uint32{0x035e964e, 0x0122a486, 0x01c91b67, 0x026b4562, 0x02138222, 0x00d6f663, 0x03f2f0c7, 0x0007268d, 0x03f9fd62, 0x001229bc}}, Y: Field{[10]uint32{0x034481b4, 0x00b14316, 0x01c91971, 0x00e54e97, 0x022c73e0, 0x02a75659, 0x0062c81f, 0x02a28192, 0x01553d41, 0x0006d514}}}, + {X: Field{[10]uint32{0x00061e9f, 0x00a17669, 0x0354db06, 0x033716c8, 0x0375f050, 0x023bb3c6, 0x019181dc, 0x02c1ba28, 0x0174651d, 0x0023807d}}, Y: Field{[10]uint32{0x035e108b, 0x03efec89, 0x00cae256, 0x0192e87c, 0x027d7ba9, 0x00bbb2b6, 0x006e90a0, 0x039f56db, 0x02a09800, 0x0027455b}}}, + {X: Field{[10]uint32{0x0205345d, 0x029372be, 0x0258f43d, 0x03cc5a52, 0x0228e375, 0x029e7e39, 0x0368b195, 0x02d5d8fa, 0x00db9e6d, 0x0012f03e}}, Y: Field{[10]uint32{0x03a5b555, 0x03c85710, 0x019d98d0, 0x00eda8cb, 0x01633805, 0x009a929a, 0x02380e81, 0x02c592ee, 0x0389a1e6, 0x0031a9c1}}}, + {X: Field{[10]uint32{0x0297a768, 0x015288ee, 0x0255f32d, 0x0236c033, 0x00f4c7ee, 0x002df6ae, 0x0230a665, 0x037ab758, 0x00cb5f5e, 0x00259bf4}}, Y: Field{[10]uint32{0x011a994b, 0x01b3de60, 0x004e1654, 0x0272a795, 0x0001e892, 0x038285ae, 0x0019a1de, 0x026d97d6, 0x0243bb4f, 0x00275913}}}, + {X: Field{[10]uint32{0x017b0d8a, 0x00b14421, 0x027f8296, 0x02e21891, 0x0320d50e, 0x010e38cd, 0x02dc7c74, 0x00ba9964, 0x01ad4952, 0x001aad46}}, Y: Field{[10]uint32{0x023ae44d, 0x00245442, 0x020da8a8, 0x0280de3b, 0x02e82653, 0x0153087b, 0x0367ec35, 0x0142898a, 0x02342b72, 0x00316e8e}}}, + {X: Field{[10]uint32{0x0276c62f, 0x01b5bbea, 0x03856d52, 0x029094c9, 0x03e55f18, 0x001db858, 0x03d0a0cd, 0x0183d4e6, 0x00e43e50, 0x003e2c2e}}, Y: Field{[10]uint32{0x00d48ba4, 0x03b3dbf5, 0x03ad1fe1, 0x02e90d9c, 0x017d5c95, 0x00a0e6a8, 0x00f29c86, 0x014fe963, 0x0052a658, 0x001d0f78}}}, + {X: Field{[10]uint32{0x02d18bad, 0x01e8494f, 0x030e1658, 0x018e7456, 0x02967e97, 0x0088f57e, 0x0185c0e5, 0x023fc2ad, 0x02f8579d, 0x00311427}}, Y: Field{[10]uint32{0x01b08362, 0x016393c7, 0x01cf97fe, 0x03021bc4, 0x0381199d, 0x01d2e2b9, 0x036d8d35, 0x02696168, 0x03e8ee97, 0x001ee47d}}}, + {X: Field{[10]uint32{0x0342379f, 0x02c03f6a, 0x003c3aac, 0x00cb3ead, 0x0004cef7, 0x02530393, 0x0207c538, 0x0143e388, 0x035a6ff4, 0x00268004}}, Y: Field{[10]uint32{0x03a9975d, 0x02e3fe07, 0x03d594df, 0x01ba2e11, 0x00b48159, 0x0232aee4, 0x020902a2, 0x0316c51d, 0x03483684, 0x000e4fb1}}}, + {X: Field{[10]uint32{0x03488601, 0x029016db, 0x01e3eaa4, 0x00c53949, 0x02a484d3, 0x0174f7b8, 0x010c17c2, 0x0235f37a, 0x03df173f, 0x000f5dd6}}, Y: Field{[10]uint32{0x030e51d4, 0x03a631ec, 0x02046b3d, 0x016e265c, 0x0138a402, 0x0275d389, 0x03287f55, 0x003da96f, 0x00bc0a56, 0x001f9ac2}}}, + {X: Field{[10]uint32{0x0303b529, 0x003a60de, 0x017b8f5d, 0x000b5c0f, 0x02a95e50, 0x034428a6, 0x03380a80, 0x0062d144, 0x013ea601, 0x0033aebf}}, Y: Field{[10]uint32{0x03b74b4e, 0x0054d2a1, 0x010c0fd6, 0x006fd54a, 0x025f6d8b, 0x00cee811, 0x0203594e, 0x027d87fd, 0x02b646f5, 0x000651de}}}, + {X: Field{[10]uint32{0x03a731b2, 0x02c661f3, 0x01de158c, 0x018fd62b, 0x037ecbc9, 0x03926c8d, 0x001ac162, 0x038f87bc, 0x00ac1ff3, 0x002ba28f}}, Y: Field{[10]uint32{0x01531efe, 0x0287a794, 0x03ac2bac, 0x00ac4529, 0x02ee26fd, 0x02371dce, 0x03f6af9e, 0x02dd25cc, 0x02752052, 0x001692c1}}}, + {X: Field{[10]uint32{0x01e3b38e, 0x010dd4eb, 0x02b28308, 0x00d743ef, 0x01fd39b6, 0x011deb13, 0x0118edee, 0x01c48d70, 0x00bb8bd4, 0x0035d34e}}, Y: Field{[10]uint32{0x00b54451, 0x01aecddf, 0x01c325d6, 0x03f4e4db, 0x021ec0a0, 0x006e9b78, 0x01850843, 0x00a0e5ea, 0x01b6f17a, 0x003cf941}}}, + {X: Field{[10]uint32{0x02beb2a8, 0x0256c53d, 0x01db2495, 0x00cec33a, 0x014d4f0b, 0x0381d747, 0x00dc1bef, 0x01e17345, 0x02757780, 0x003d0a1d}}, Y: Field{[10]uint32{0x00514b38, 0x00787618, 0x015364eb, 0x0354ffc9, 0x03950f34, 0x00d86b5b, 0x018bf6da, 0x018b7719, 0x0231eefc, 0x0028f7c8}}}, + {X: Field{[10]uint32{0x02378e94, 0x03250051, 0x0145450d, 0x0220f287, 0x01e62776, 0x0272c826, 0x03caaa86, 0x02b589da, 0x036bda19, 0x003a4755}}, Y: Field{[10]uint32{0x0040779c, 0x032a5c4e, 0x01db87ac, 0x0060df9d, 0x00020e79, 0x00c99763, 0x00313db8, 0x00b2e66b, 0x0038c8da, 0x002d5f88}}}, + {X: Field{[10]uint32{0x00c66ea2, 0x00c33f8e, 0x01aec7e8, 0x0377cf1f, 0x03e035e1, 0x03caaa90, 0x011b53da, 0x0385d8de, 0x00e87d77, 0x0009a651}}, Y: Field{[10]uint32{0x013707f6, 0x0339db06, 0x02ea739a, 0x0115edfb, 0x01567641, 0x026cc8f2, 0x028ca430, 0x031fec14, 0x036434bd, 0x0032c045}}}, + {X: Field{[10]uint32{0x0244a3d1, 0x03807ec1, 0x02a5ee94, 0x005cbfdb, 0x01fb0993, 0x01eec5d9, 0x0261c685, 0x00da046a, 0x028a8f0b, 0x003b5079}}, Y: Field{[10]uint32{0x0108231c, 0x0037ae31, 0x005dc1dd, 0x03823302, 0x0071c918, 0x00f65600, 0x03a1e448, 0x02f8109a, 0x007b880c, 0x003cb324}}}, + {X: Field{[10]uint32{0x01fec0de, 0x01e59083, 0x0113ab0b, 0x03c4cc88, 0x01538192, 0x00e8cf5a, 0x0236e4f5, 0x032e978b, 0x024a96cf, 0x001a51d9}}, Y: Field{[10]uint32{0x038fb6cd, 0x01770be8, 0x01dc77f9, 0x02577b3d, 0x03256101, 0x01ab78cc, 0x01b76c4d, 0x02dbeea4, 0x01bc5b65, 0x00192074}}}, + {X: Field{[10]uint32{0x0227fb03, 0x021715c7, 0x02f668ea, 0x00b1c3a3, 0x00437901, 0x02a4996c, 0x000a42bb, 0x018f7daa, 0x007ce22b, 0x002a8f86}}, Y: Field{[10]uint32{0x00d011be, 0x02a47fc2, 0x0329c38f, 0x01239736, 0x03e8732f, 0x00c04150, 0x03fcab70, 0x027f465b, 0x016b9810, 0x00298e37}}}, + {X: Field{[10]uint32{0x004a944b, 0x026f863e, 0x021c5eff, 0x00de4493, 0x02bfd5ea, 0x0150ff5b, 0x029fbab6, 0x03e536d2, 0x00e1a4be, 0x00001779}}, Y: Field{[10]uint32{0x0157e2d6, 0x026ea79e, 0x03442967, 0x03469fb1, 0x0158f8ae, 0x01dd11d8, 0x0299513f, 0x038a502d, 0x0282693b, 0x00087128}}}, + {X: Field{[10]uint32{0x007a7ce5, 0x01b0ad0a, 0x030a0964, 0x03ba8ce8, 0x02fdd18f, 0x02bc2bc8, 0x0096c793, 0x02d1de07, 0x00c72c87, 0x00194cf7}}, Y: Field{[10]uint32{0x037ccc51, 0x00dc1620, 0x00cd3f8c, 0x033e8ebb, 0x00482748, 0x00d1085d, 0x01589fc2, 0x03e6ef3a, 0x01f23d82, 0x001fc0f9}}}, + {X: Field{[10]uint32{0x00fdf354, 0x02ec0299, 0x01871a5e, 0x008e9c2e, 0x01c5109f, 0x014d0d4c, 0x02008ab8, 0x01612af6, 0x033c129e, 0x0004e797}}, Y: Field{[10]uint32{0x033f0a98, 0x0028bddd, 0x009de619, 0x039209ab, 0x026bf011, 0x020d4ad8, 0x03182ee9, 0x023abe94, 0x025741fb, 0x00125edf}}}, + {X: Field{[10]uint32{0x0161f7c3, 0x01e6bba0, 0x01f0c7c7, 0x02060645, 0x013ce57b, 0x0363c958, 0x00ea9918, 0x03a5420f, 0x01ccf7e1, 0x00124ffa}}, Y: Field{[10]uint32{0x03020cd5, 0x02f93059, 0x02f4088c, 0x00562f30, 0x00639ab6, 0x028eed12, 0x00aff6a6, 0x03874115, 0x03fd62fc, 0x0039a5d8}}}, + {X: Field{[10]uint32{0x02a064a9, 0x039acd94, 0x008a7446, 0x0055d9bb, 0x03900e3c, 0x0240f29d, 0x01ac2fb4, 0x01c2e190, 0x03dbd8dd, 0x003b59d7}}, Y: Field{[10]uint32{0x00416de9, 0x01bcc4da, 0x037fd1f2, 0x02c9739d, 0x0223ccff, 0x02c0622b, 0x00669b40, 0x03d6d1b8, 0x037985ce, 0x002986ec}}}, + {X: Field{[10]uint32{0x02260a4d, 0x02c32a66, 0x00b83136, 0x0110e187, 0x02b6d484, 0x014e4f54, 0x03c14e31, 0x0278e9e5, 0x00a89a76, 0x0005cd9c}}, Y: Field{[10]uint32{0x03bd4904, 0x00f689f1, 0x02bc6d68, 0x03ddf760, 0x00d140b3, 0x01242104, 0x02a1b28e, 0x0134ba57, 0x0121c1ba, 0x0013750e}}}, + {X: Field{[10]uint32{0x035d1610, 0x0387c258, 0x0128cdf9, 0x00f4b329, 0x00a1da93, 0x03041ba0, 0x011e05a0, 0x038551bc, 0x03a08f87, 0x00356978}}, Y: Field{[10]uint32{0x01175352, 0x00a45397, 0x01167255, 0x01d0828d, 0x01aa20df, 0x0307fec3, 0x00a9c6f2, 0x03024a34, 0x01e0daf3, 0x001f1b15}}}, + {X: Field{[10]uint32{0x02f6fa2a, 0x0168ce36, 0x00ebe417, 0x00c9d3b9, 0x01a0a999, 0x01359a5f, 0x02f2e2b9, 0x00c871a4, 0x01a004ab, 0x00153d7a}}, Y: Field{[10]uint32{0x01f2de21, 0x0359b622, 0x0342b5cb, 0x032a157f, 0x0258a7d9, 0x03e0a376, 0x02eb7614, 0x01b91cd2, 0x03d175fa, 0x001633c4}}}, + {X: Field{[10]uint32{0x03ebe6da, 0x01c96f1f, 0x01d4c9e8, 0x00b65111, 0x02fd9a63, 0x010988ac, 0x025544a4, 0x03a6558b, 0x0098154d, 0x00359a0a}}, Y: Field{[10]uint32{0x0190f206, 0x01c7718c, 0x001ebd13, 0x0117dd83, 0x030b2d50, 0x01e5c6a8, 0x0202c50a, 0x02e15d43, 0x023b9ba3, 0x00260247}}}, + {X: Field{[10]uint32{0x01c2da08, 0x0126fdb3, 0x008cafef, 0x03fc6324, 0x02610bec, 0x00b7b34d, 0x01f6e1a8, 0x03131236, 0x01b92af2, 0x00094c06}}, Y: Field{[10]uint32{0x017c680a, 0x02e1ae8e, 0x02a5a495, 0x00ef694e, 0x023ffbdd, 0x00421cb8, 0x02ebdce8, 0x0275d397, 0x035ad950, 0x00185f4c}}}, + {X: Field{[10]uint32{0x004da6cb, 0x019f3544, 0x00f16bab, 0x01d14391, 0x02ced725, 0x03023ca4, 0x00d2bcfa, 0x03af7958, 0x00ca461b, 0x00015bd9}}, Y: Field{[10]uint32{0x013aee44, 0x00efcf56, 0x023eebd8, 0x014ee40e, 0x02757cb5, 0x00bba050, 0x012bca8f, 0x020ca2a6, 0x01cfdc27, 0x0016c821}}}, + {X: Field{[10]uint32{0x03553420, 0x03b49163, 0x012f64dd, 0x03a6fbcc, 0x005a31a1, 0x01f8fb8e, 0x025c1928, 0x00ea6bc3, 0x01711e15, 0x003ce725}}, Y: Field{[10]uint32{0x03b0b1cc, 0x020a4c38, 0x03a974b8, 0x018922f7, 0x02e742ef, 0x0126304c, 0x039df908, 0x01ae7de1, 0x02c11c20, 0x00133252}}}, + {X: Field{[10]uint32{0x013128b5, 0x037758b0, 0x005368c8, 0x01297783, 0x01b2f303, 0x01716ab9, 0x02d3dad9, 0x021cf00c, 0x02a8cbdf, 0x00010dfa}}, Y: Field{[10]uint32{0x013c59c6, 0x038c2026, 0x01fcc721, 0x00b77c30, 0x012f8d1b, 0x03583696, 0x00245993, 0x0042ed65, 0x020eb003, 0x0009f63a}}}, + {X: Field{[10]uint32{0x0080e9b2, 0x027ad2ea, 0x0371f0a7, 0x0298053b, 0x003f13e7, 0x00715d4d, 0x010ae621, 0x019e6112, 0x01893f5d, 0x002b7869}}, Y: Field{[10]uint32{0x0391c715, 0x00b8988d, 0x01304902, 0x00adfc90, 0x01e80188, 0x00f06d0a, 0x03404d8c, 0x01a8eeb1, 0x017c537e, 0x002f5270}}}, + {X: Field{[10]uint32{0x02c1224e, 0x038b64ce, 0x0198fd16, 0x01e31eb4, 0x00a87ef9, 0x029386db, 0x0357d977, 0x00696ae7, 0x01d5c309, 0x0024d89d}}, Y: Field{[10]uint32{0x036b9f32, 0x000481f7, 0x0057e5aa, 0x0146c5ee, 0x00ed5988, 0x01b88934, 0x0375d96c, 0x021317aa, 0x010ad8bd, 0x001a149a}}}, + {X: Field{[10]uint32{0x039b786e, 0x03ed69da, 0x01e8cc33, 0x00741dad, 0x03e29497, 0x03202e74, 0x006db205, 0x03573781, 0x01fd3e8f, 0x0000a795}}, Y: Field{[10]uint32{0x00010a0d, 0x03379263, 0x02f57af6, 0x00ab5869, 0x002bbf3e, 0x01c83391, 0x038312f0, 0x00d2e515, 0x017a7eb9, 0x0001da79}}}, + {X: Field{[10]uint32{0x009051ef, 0x02c566e0, 0x00584168, 0x0011d91f, 0x003ae378, 0x01785bde, 0x00b52754, 0x0217fc66, 0x02a73501, 0x0037e0d8}}, Y: Field{[10]uint32{0x02af6bab, 0x032b82d8, 0x01a263a6, 0x0203b923, 0x03735ece, 0x012c5b0e, 0x026b6048, 0x028ef7a0, 0x0046fbd4, 0x002bf2cd}}}, + {X: Field{[10]uint32{0x018a427e, 0x0057b381, 0x0033c254, 0x020e5b3d, 0x01b9a01e, 0x01b31867, 0x01660379, 0x017f83e5, 0x012309a3, 0x0017d10c}}, Y: Field{[10]uint32{0x00901ac0, 0x01f530ac, 0x03c906fd, 0x01c923eb, 0x0337d81c, 0x01aaa705, 0x0272b605, 0x02af14a4, 0x0012fc0a, 0x000e170a}}}, + {X: Field{[10]uint32{0x01dd2de5, 0x038d1205, 0x0163f4b7, 0x03fd74f7, 0x008c5323, 0x01a4ff13, 0x01b77a31, 0x000df149, 0x021553c6, 0x00306710}}, Y: Field{[10]uint32{0x013900a4, 0x0323b06a, 0x01822159, 0x01564b26, 0x00a19d22, 0x03679ac8, 0x01161896, 0x01df849c, 0x028a8791, 0x0027ddba}}}, + {X: Field{[10]uint32{0x032d45ac, 0x028508eb, 0x013f1d62, 0x024aa084, 0x0214d19d, 0x018e5091, 0x0162fdb3, 0x008ccbab, 0x021dd1e0, 0x0022afce}}, Y: Field{[10]uint32{0x03e36dde, 0x006d6629, 0x007ec7de, 0x0105b754, 0x02defc29, 0x0330b67c, 0x027a984e, 0x03b0fdd7, 0x027fdcf5, 0x000c96a5}}}, + {X: Field{[10]uint32{0x0359ae7a, 0x028f377d, 0x03b9433f, 0x01db0181, 0x0257c1dd, 0x01c7aa12, 0x014a58fa, 0x01879b13, 0x0390b931, 0x00322ff7}}, Y: Field{[10]uint32{0x030b20f9, 0x02513cc9, 0x01ce5b51, 0x033c054d, 0x00fd7990, 0x00f96a8f, 0x007efd3c, 0x03ed8fb5, 0x00a3d172, 0x0008f70e}}}, + {X: Field{[10]uint32{0x02d2c78d, 0x01fa1b80, 0x038b443c, 0x01016dde, 0x02a26ccc, 0x017e435e, 0x019e7ab8, 0x01665e9d, 0x026c35c5, 0x00025d99}}, Y: Field{[10]uint32{0x001ed0ff, 0x0145850e, 0x00f89605, 0x03fad0dc, 0x0392c52c, 0x008333bb, 0x02db2e4e, 0x033c96fc, 0x003e44fa, 0x001b4d0b}}}, + {X: Field{[10]uint32{0x0163252b, 0x00aa337e, 0x0273a1c1, 0x01b3fac8, 0x021fd65b, 0x02f6270e, 0x03b8e8a5, 0x0393871e, 0x03a77737, 0x0039de42}}, Y: Field{[10]uint32{0x03bdba42, 0x0096773f, 0x02e1a810, 0x03caa7a4, 0x01f7138f, 0x02ca2663, 0x02754ead, 0x02d63dc3, 0x02201534, 0x000098d7}}}, + {X: Field{[10]uint32{0x0176fb0d, 0x01df6051, 0x03efe375, 0x03265d7c, 0x03b471ce, 0x02e61ab0, 0x00e3ecd5, 0x03b20fd8, 0x017f6bfc, 0x0010b2e0}}, Y: Field{[10]uint32{0x005cf49a, 0x022937b1, 0x03cce270, 0x025941d7, 0x01144a85, 0x015cde42, 0x0162050a, 0x02f643c8, 0x0128b2f9, 0x003b4d78}}}, + {X: Field{[10]uint32{0x012f3cbb, 0x014383d0, 0x018f0024, 0x00a293f5, 0x01319024, 0x03847c51, 0x0060397a, 0x024ccfff, 0x00701a23, 0x0028221a}}, Y: Field{[10]uint32{0x0083af52, 0x0207e646, 0x00ad6d8a, 0x03267300, 0x03fc6002, 0x01221fae, 0x0251995b, 0x0380d023, 0x03371ad6, 0x0032121b}}}, + {X: Field{[10]uint32{0x032c4bb3, 0x021bc95c, 0x01aab034, 0x00b08998, 0x02e6a964, 0x00d9294b, 0x00fd8e8b, 0x006e2c10, 0x02419f10, 0x00290332}}, Y: Field{[10]uint32{0x0045a910, 0x02c542a5, 0x01285bab, 0x026e5402, 0x03b0655b, 0x001c0730, 0x01e611df, 0x025bc0b4, 0x03693ec0, 0x0003d086}}}, + {X: Field{[10]uint32{0x01beb721, 0x0181290d, 0x0350fefe, 0x003c5068, 0x02c53294, 0x027d5d57, 0x035b70bc, 0x011cb169, 0x0178bbb0, 0x00242bbe}}, Y: Field{[10]uint32{0x014bbf0d, 0x021f8478, 0x01187a5f, 0x004251e7, 0x0193f585, 0x0391e3a9, 0x008cde92, 0x03db932a, 0x0070737c, 0x003e7c17}}}, + {X: Field{[10]uint32{0x003407c3, 0x031a65eb, 0x03f1a07b, 0x00ceee09, 0x02d73ae4, 0x036e6b2d, 0x00292f68, 0x007ce580, 0x0281a0f6, 0x003ff08e}}, Y: Field{[10]uint32{0x034d4b66, 0x017ca115, 0x02803686, 0x00de81d1, 0x004f313b, 0x0351f338, 0x03c74630, 0x0384e49d, 0x0212bce5, 0x002dda81}}}, + {X: Field{[10]uint32{0x00a112a5, 0x003fd408, 0x01ded2ab, 0x00b837e6, 0x02742c85, 0x02610969, 0x022bc162, 0x03e64109, 0x039440bd, 0x0034f29e}}, Y: Field{[10]uint32{0x024d637a, 0x01e03ff7, 0x022cb1f9, 0x02dcd07e, 0x005ef191, 0x0204f38b, 0x004281f9, 0x0209713d, 0x03acca7e, 0x00276bb2}}}, + {X: Field{[10]uint32{0x01bb9f06, 0x02cf3294, 0x02b41b23, 0x02b3557b, 0x03469b21, 0x038386b1, 0x02b7589c, 0x02cc70a9, 0x02bb720a, 0x000a94e8}}, Y: Field{[10]uint32{0x0051f84e, 0x0295f8f5, 0x03256c21, 0x0036e912, 0x0027f781, 0x008341bb, 0x00d0f522, 0x025919e9, 0x0133ffde, 0x00046bfe}}}, + {X: Field{[10]uint32{0x01a1ac96, 0x00211d2b, 0x0087d05a, 0x01c5fedd, 0x0322b2fc, 0x02e3d72f, 0x03d2f77b, 0x000a1e9b, 0x035680c4, 0x00121f94}}, Y: Field{[10]uint32{0x02a849c8, 0x02434356, 0x03a731e9, 0x00954830, 0x01029c96, 0x0144c111, 0x0365326d, 0x00358dde, 0x03d54607, 0x0014ef5f}}}, + {X: Field{[10]uint32{0x027b3e16, 0x0396e659, 0x03a2963d, 0x02d20827, 0x01cf23c0, 0x00bd2d8a, 0x0332cfd6, 0x028307f0, 0x03cf291d, 0x000f9697}}, Y: Field{[10]uint32{0x02b86825, 0x0037b43e, 0x01c97b06, 0x03bdfd57, 0x008b33d7, 0x01ceec4c, 0x03028df7, 0x02687c12, 0x032c4338, 0x0021a61f}}}, + {X: Field{[10]uint32{0x023e256f, 0x01f5de43, 0x02b8ed5f, 0x03ed5c21, 0x00601840, 0x00b755c1, 0x002493d2, 0x011f08b1, 0x03c515a8, 0x0013e42b}}, Y: Field{[10]uint32{0x02b831be, 0x037b43ea, 0x01e33226, 0x0250ad61, 0x024ef939, 0x02b034f0, 0x01f6b089, 0x01a248cd, 0x0158ac2e, 0x0011b8c6}}}, + {X: Field{[10]uint32{0x023601fc, 0x01617078, 0x01a1782c, 0x00e29161, 0x02c2ff4b, 0x0086fa60, 0x02738071, 0x00fa9e9a, 0x012b40be, 0x002f81ce}}, Y: Field{[10]uint32{0x01f258db, 0x02a085bc, 0x0038da57, 0x01c799bb, 0x01431727, 0x036f8842, 0x01775b81, 0x027a39ef, 0x0057657c, 0x000e8561}}}, + {X: Field{[10]uint32{0x021108ed, 0x018d04be, 0x02603e05, 0x010546d6, 0x02ecc2f7, 0x01f09381, 0x02f9e6d4, 0x00dd7c88, 0x00e52140, 0x0021b09d}}, Y: Field{[10]uint32{0x00a96ef8, 0x0025a490, 0x003a2aa0, 0x01dbe4b0, 0x012703f2, 0x0326261f, 0x02b90b64, 0x035640cb, 0x02b94065, 0x001280be}}}, + {X: Field{[10]uint32{0x0173cf97, 0x023813cd, 0x03626267, 0x02a88449, 0x02287277, 0x036b04ff, 0x03b30561, 0x00e26049, 0x026be792, 0x00013f4e}}, Y: Field{[10]uint32{0x011173e4, 0x000d0b7c, 0x000d238c, 0x0288ed0e, 0x02f07ebe, 0x00ef1fa5, 0x00f4b4b4, 0x03b2db1b, 0x01a163cf, 0x00192628}}}, + {X: Field{[10]uint32{0x01117c94, 0x031da577, 0x0118cb68, 0x021aea06, 0x03cd2a5f, 0x03f33f41, 0x02fe78d1, 0x02f75e2a, 0x01ca5423, 0x0033e90d}}, Y: Field{[10]uint32{0x00ce1fe8, 0x01a0d5c4, 0x00cefd7d, 0x00ed2a7d, 0x01c399b5, 0x01a114e2, 0x03778546, 0x03de78d6, 0x011c02df, 0x002fd322}}}, + {X: Field{[10]uint32{0x021d446c, 0x024f8b0f, 0x010c1cdf, 0x03987cf2, 0x01414119, 0x01d1a6bf, 0x029e9277, 0x00f3166c, 0x031b7953, 0x002a96b2}}, Y: Field{[10]uint32{0x02a498ab, 0x01023d08, 0x01bc26bb, 0x004271d7, 0x028b11bf, 0x0060dd9f, 0x02d3854e, 0x030007ed, 0x01b78713, 0x002c37ca}}}, + {X: Field{[10]uint32{0x005c3d15, 0x00f82855, 0x01175635, 0x03d5341b, 0x03435c09, 0x006f294b, 0x03fa1c44, 0x03d56376, 0x02ecc21b, 0x0006e4f0}}, Y: Field{[10]uint32{0x03195ed2, 0x00fed28c, 0x00c4aeb5, 0x02c68837, 0x03f72e67, 0x0171b498, 0x00e8a5fd, 0x0243996b, 0x01ff7181, 0x0015b115}}}, + {X: Field{[10]uint32{0x03b91760, 0x0145260b, 0x010acd85, 0x02489190, 0x01c84800, 0x017dcac3, 0x039438b5, 0x03482fd8, 0x03f02566, 0x0005d132}}, Y: Field{[10]uint32{0x034c66f5, 0x03d48a77, 0x01f6c683, 0x03e12f68, 0x00068dc0, 0x029f495c, 0x01d5da57, 0x02d71674, 0x03a232b0, 0x001f9de9}}}, + {X: Field{[10]uint32{0x0302582b, 0x02a101ff, 0x01bedd24, 0x029e88a4, 0x021b9cb9, 0x0181ecc5, 0x02f8ffc0, 0x02300a30, 0x00a5ed44, 0x00282fa6}}, Y: Field{[10]uint32{0x011da6ea, 0x03065c40, 0x029a2274, 0x0207774d, 0x0376b869, 0x033dab23, 0x01444620, 0x00d496d3, 0x006a0239, 0x0039f30b}}}, + {X: Field{[10]uint32{0x03845882, 0x0244019e, 0x03e71148, 0x00673723, 0x038b2f2b, 0x0235d7a8, 0x02b2591d, 0x03dea558, 0x03f5dab5, 0x00383964}}, Y: Field{[10]uint32{0x02d67334, 0x017d70b2, 0x029c7e78, 0x031927d1, 0x00b5464d, 0x0290b38b, 0x03c26141, 0x0176d6ce, 0x036215e3, 0x00242231}}}, + {X: Field{[10]uint32{0x029290f5, 0x03f21e70, 0x02b408b9, 0x01b17924, 0x01ffe579, 0x039ec359, 0x031b928d, 0x00baaf5b, 0x0095a498, 0x001e0936}}, Y: Field{[10]uint32{0x00c7ee88, 0x02bc06af, 0x02d448a4, 0x005d5f36, 0x00d6bcf1, 0x0308cb18, 0x022d8bbf, 0x0214a0e2, 0x00688e42, 0x002b85d7}}}, + {X: Field{[10]uint32{0x01d96e66, 0x0073c43e, 0x00b5c421, 0x024fa5db, 0x012aa513, 0x00066b8b, 0x00e4a2cd, 0x00477085, 0x017ee0b6, 0x001274b9}}, Y: Field{[10]uint32{0x015b770a, 0x028f2caf, 0x014d25cf, 0x013e9e05, 0x0311c81e, 0x00a6ee7e, 0x01b79198, 0x007dc9de, 0x00ca8801, 0x003fe831}}}, + {X: Field{[10]uint32{0x035ead00, 0x004e73f1, 0x03ee8be2, 0x00cba71e, 0x02eeb3de, 0x00e262ba, 0x0012e8f8, 0x006a1618, 0x036b8f70, 0x00369817}}, Y: Field{[10]uint32{0x0011d246, 0x027973a5, 0x03633d69, 0x01f19d47, 0x025a2430, 0x024fd43e, 0x030ca5ea, 0x00706a27, 0x012ce98a, 0x0016e830}}}, + {X: Field{[10]uint32{0x02c16ff2, 0x03ff672e, 0x02785652, 0x00f070cb, 0x029307be, 0x03670e02, 0x01de2bd1, 0x0139b568, 0x03ebcde9, 0x002bbaaa}}, Y: Field{[10]uint32{0x010bf840, 0x006aebf5, 0x02460664, 0x006b0965, 0x03b62e49, 0x0041c24f, 0x000a52bf, 0x03b37814, 0x03558510, 0x000c0251}}}, + {X: Field{[10]uint32{0x010c40b7, 0x007fac68, 0x0378cb0e, 0x002f972d, 0x0066ca0a, 0x00c17e7a, 0x02d1e1f4, 0x03f992c6, 0x012b35f3, 0x0018bc62}}, Y: Field{[10]uint32{0x03f5780d, 0x0204e9c0, 0x028838e1, 0x0148b452, 0x03f1f890, 0x0316fb6f, 0x0287f090, 0x02fd28b8, 0x005ee600, 0x00069108}}}, + {X: Field{[10]uint32{0x02979382, 0x01356265, 0x01e944ac, 0x00cf6b89, 0x033a567b, 0x0029a020, 0x02be9f55, 0x00b5a4a3, 0x02c54677, 0x00308247}}, Y: Field{[10]uint32{0x02d4b31e, 0x02140b72, 0x002b2382, 0x01a4b56a, 0x02eb610c, 0x007f8651, 0x01fa722a, 0x0274c5cd, 0x025bd2e8, 0x0016669d}}}, + {X: Field{[10]uint32{0x03242367, 0x0003f7c6, 0x01ba597d, 0x01557e0f, 0x02e50a24, 0x027f9f08, 0x00e1b237, 0x0248d5c0, 0x015b1951, 0x002ff5f0}}, Y: Field{[10]uint32{0x0066b17b, 0x00af51af, 0x02694037, 0x031235bf, 0x03f4cdda, 0x03ebf4a1, 0x01272130, 0x031cd7a8, 0x03de545e, 0x002b1b79}}}, + {X: Field{[10]uint32{0x032ddc7f, 0x017d8d44, 0x00fd116b, 0x027dd3cf, 0x01958162, 0x020c76a0, 0x03d85073, 0x03f7de40, 0x03843cab, 0x00353539}}, Y: Field{[10]uint32{0x021758a6, 0x01d0b501, 0x0082d219, 0x0138ae3c, 0x01d1cd6d, 0x011d572c, 0x0265a284, 0x02eb2ff3, 0x011d582c, 0x00079258}}}, + {X: Field{[10]uint32{0x03908fdc, 0x03047223, 0x03d02cdd, 0x03e37d85, 0x014945b4, 0x0177630c, 0x03434a49, 0x02cd37ce, 0x0009c378, 0x000795d4}}, Y: Field{[10]uint32{0x00f6cdb7, 0x02161fc3, 0x005655bd, 0x008cffea, 0x0010bf21, 0x023c8273, 0x017458cb, 0x0256849a, 0x03a2810c, 0x001738df}}}, + {X: Field{[10]uint32{0x01408fd0, 0x03e570ee, 0x00ee1108, 0x01b4dc41, 0x01c9268c, 0x03f7d979, 0x035e690f, 0x01fae287, 0x022eac23, 0x002d699a}}, Y: Field{[10]uint32{0x03f72798, 0x00fbca32, 0x030de3c4, 0x0200c1d8, 0x03f8cc32, 0x0219a31b, 0x0042ba86, 0x03dba982, 0x02c0aaa4, 0x00264016}}}, + {X: Field{[10]uint32{0x0326fe0d, 0x030fb99f, 0x036e60cf, 0x00c0878f, 0x0166bc3a, 0x02ebabe3, 0x0090b063, 0x0164f19b, 0x01352599, 0x000768e7}}, Y: Field{[10]uint32{0x0141311f, 0x0216e172, 0x03e489f2, 0x029e3f1f, 0x00f7e58a, 0x00070c00, 0x030d076c, 0x00546d51, 0x005eb6b0, 0x00249ca8}}}, + {X: Field{[10]uint32{0x01a971b2, 0x01d10d2d, 0x005002b3, 0x016bce11, 0x024e900c, 0x007d0a3f, 0x02862d72, 0x00029d94, 0x00b6b100, 0x001fcec4}}, Y: Field{[10]uint32{0x02ecd385, 0x03481728, 0x03a9e1f5, 0x01d37cf0, 0x008c4a4f, 0x0095be82, 0x03bd4c90, 0x03b8cc44, 0x03e07907, 0x002e528b}}}, + {X: Field{[10]uint32{0x024eb2e0, 0x02132f5e, 0x018cbbaf, 0x0228fd74, 0x02e5dc36, 0x008030b6, 0x03eb61ae, 0x003e6fda, 0x03c66185, 0x00109841}}, Y: Field{[10]uint32{0x03e511af, 0x0231c319, 0x014f540f, 0x033a3a39, 0x000857ce, 0x034ebfa9, 0x0313488b, 0x03b43e35, 0x0078a9e6, 0x00387e9f}}}, + {X: Field{[10]uint32{0x01be9697, 0x01d290d1, 0x013e2fa3, 0x0265a03d, 0x01d6c940, 0x012273ea, 0x02093c21, 0x031310c4, 0x0256708f, 0x00155789}}, Y: Field{[10]uint32{0x004db6e7, 0x00b8af8a, 0x00cb002f, 0x008b1bd1, 0x01a78224, 0x019d2e84, 0x0166e06c, 0x02dda889, 0x03b71e3b, 0x00003d7b}}}, + {X: Field{[10]uint32{0x017dd290, 0x03f6c4a4, 0x028b3af8, 0x0095190a, 0x01033606, 0x0096dc27, 0x02a927e7, 0x0381f098, 0x017b5736, 0x001c5c2c}}, Y: Field{[10]uint32{0x030973b1, 0x02b9cd40, 0x01608627, 0x029adb7d, 0x0398b2c6, 0x029df382, 0x02d86e69, 0x02204ed6, 0x02a3f899, 0x003bd0df}}}, + {X: Field{[10]uint32{0x025c2180, 0x03b0c456, 0x00172aaa, 0x011b224c, 0x01eb4de6, 0x01ca913c, 0x02329d00, 0x03f44d27, 0x033e66fe, 0x00072a2a}}, Y: Field{[10]uint32{0x030a3c49, 0x003be98e, 0x03274fd2, 0x028554c6, 0x02c70103, 0x012613b4, 0x01da2a0f, 0x035dda07, 0x01c92a87, 0x001bf190}}}, + {X: Field{[10]uint32{0x005366b8, 0x0393e370, 0x007977d5, 0x034d21ed, 0x0385f057, 0x007069ca, 0x0150c1e4, 0x00ba0afc, 0x006af6d4, 0x0020d495}}, Y: Field{[10]uint32{0x02c5fdb1, 0x00ea0d61, 0x0084b138, 0x039ba831, 0x01ac92b0, 0x0070ac72, 0x008d7e72, 0x016c4aa2, 0x02b27ca2, 0x001daf96}}}, + {X: Field{[10]uint32{0x00904cd7, 0x02211667, 0x0244c3e9, 0x0285364b, 0x03353123, 0x0197123b, 0x03988ea7, 0x02e7558f, 0x037b1730, 0x000bc44b}}, Y: Field{[10]uint32{0x0234a44f, 0x029a094b, 0x031bb743, 0x02f50680, 0x0027d7a8, 0x00ab45d0, 0x0370b16d, 0x01f568cb, 0x0297f648, 0x003acd23}}}, + {X: Field{[10]uint32{0x02a5648a, 0x009423cf, 0x00f1d519, 0x00245a9c, 0x002eb6fd, 0x01042979, 0x032494ad, 0x031b1c75, 0x023c164d, 0x0003a100}}, Y: Field{[10]uint32{0x02f4462d, 0x01bf2007, 0x01b8a48a, 0x00c6ac51, 0x01225aa0, 0x008a05af, 0x032f5106, 0x000ca226, 0x018529be, 0x0018d3cd}}}, + {X: Field{[10]uint32{0x0228fc6b, 0x010049e3, 0x029afd6e, 0x0108c719, 0x004da403, 0x005355fd, 0x00039291, 0x03d49c2e, 0x011745da, 0x00254713}}, Y: Field{[10]uint32{0x0227f0a7, 0x02b92b56, 0x00921bb2, 0x03c71cbf, 0x03b9592e, 0x02ba0989, 0x0296f608, 0x003eecb1, 0x0311a8b3, 0x003e420e}}}, + {X: Field{[10]uint32{0x00cb19f4, 0x02e24be3, 0x007fd689, 0x010546ba, 0x01788458, 0x007e516e, 0x025548c5, 0x027cfb82, 0x0057f60b, 0x002b6aa5}}, Y: Field{[10]uint32{0x0361caa6, 0x01a16205, 0x018302e4, 0x01450339, 0x03f899b9, 0x0159d265, 0x039b0475, 0x03fbee37, 0x03f92145, 0x0020d195}}}, + {X: Field{[10]uint32{0x019e6ef7, 0x017f7b98, 0x03397749, 0x00d474c0, 0x00597f3e, 0x00b5fee9, 0x02ef3d85, 0x0028ed45, 0x02b30980, 0x001924a5}}, Y: Field{[10]uint32{0x021df105, 0x0214cfb5, 0x038535c7, 0x00776233, 0x005c8b44, 0x00bb7faf, 0x005f078e, 0x01459ff7, 0x00901021, 0x001133a7}}}, + {X: Field{[10]uint32{0x0006266f, 0x02534fd8, 0x012ce4bc, 0x02dac47e, 0x029f1e9d, 0x021d7c75, 0x02fe2ba7, 0x01d6fce2, 0x02979085, 0x000b075f}}, Y: Field{[10]uint32{0x01a2cf7f, 0x008dc983, 0x02ff50ba, 0x0307f469, 0x038c6c8e, 0x030272c0, 0x03b4e4bb, 0x02f422ee, 0x00bc030a, 0x0027ac94}}}, + {X: Field{[10]uint32{0x004647ec, 0x0355be5d, 0x0174f0f6, 0x029f46ef, 0x03b44ada, 0x014be865, 0x0293b100, 0x02f0c9e0, 0x038bed4e, 0x002c4c3f}}, Y: Field{[10]uint32{0x02a5eb33, 0x01643ffb, 0x01806212, 0x002c3730, 0x000136f6, 0x019b908a, 0x03d0a950, 0x031fd9db, 0x01e9b785, 0x00128291}}}, + {X: Field{[10]uint32{0x030e6231, 0x00335432, 0x0011732a, 0x012b5a3c, 0x0029bf68, 0x03335c73, 0x02e9c740, 0x02cb64c6, 0x019762ec, 0x0013ca96}}, Y: Field{[10]uint32{0x00cf17de, 0x0302fd5f, 0x00237377, 0x005b3def, 0x000fc442, 0x00c27b70, 0x0300dde7, 0x01c20fe9, 0x01b45cfc, 0x0037afe3}}}, + {X: Field{[10]uint32{0x03a23c0b, 0x0034b781, 0x030d1cab, 0x002ea678, 0x020a178c, 0x02968936, 0x01419a18, 0x01b89790, 0x01a17fbe, 0x0025fe7a}}, Y: Field{[10]uint32{0x03559128, 0x03688c95, 0x03c0a4dd, 0x02ef9c74, 0x026cb622, 0x003ed4e1, 0x034fdc87, 0x02d2003e, 0x026b0cce, 0x0006ac48}}}, + {X: Field{[10]uint32{0x01d9d8cb, 0x00ed1f42, 0x02f4cbb9, 0x03c42b4f, 0x00bfd486, 0x02dc4250, 0x01820673, 0x0345f900, 0x03e5e9f5, 0x00385fcf}}, Y: Field{[10]uint32{0x01272f58, 0x00a40eed, 0x0196b59c, 0x018b80fb, 0x0344ad7d, 0x0014492b, 0x0360b263, 0x00ea29ac, 0x0252615d, 0x003c449a}}}, + {X: Field{[10]uint32{0x032fa2de, 0x02a2ed9e, 0x026887a5, 0x014eab0d, 0x033ae668, 0x00e283f8, 0x00c3e945, 0x02060a40, 0x00467d63, 0x00068e7e}}, Y: Field{[10]uint32{0x02903aa5, 0x037bd6e0, 0x027bf28d, 0x00feed15, 0x0118492f, 0x035f1d40, 0x034dc019, 0x0169390a, 0x03995a62, 0x002b9f04}}}, + {X: Field{[10]uint32{0x002f5320, 0x021a4bad, 0x03e68cd1, 0x0205450a, 0x00baa605, 0x013ebfee, 0x0293e52f, 0x03e91242, 0x006127f6, 0x00229777}}, Y: Field{[10]uint32{0x016b0d8e, 0x020346a2, 0x0338974c, 0x0297f1e1, 0x00328e69, 0x03577f30, 0x02559ebb, 0x0377c690, 0x0325853d, 0x0017ad88}}}, + {X: Field{[10]uint32{0x0238c299, 0x0387e73f, 0x0190f7af, 0x01bfc234, 0x02b86490, 0x01bd6d76, 0x03dc17d5, 0x035bf351, 0x03b574b7, 0x00045f6f}}, Y: Field{[10]uint32{0x0190196b, 0x036e3757, 0x03b26bd5, 0x00bdae40, 0x00c50471, 0x0009902a, 0x03bc9233, 0x0051390d, 0x015130b7, 0x0012b348}}}, + {X: Field{[10]uint32{0x0270a537, 0x02168e62, 0x019f3f29, 0x031d0606, 0x00eec84e, 0x01428a98, 0x010706d9, 0x01fad5cc, 0x0228431c, 0x002c30c4}}, Y: Field{[10]uint32{0x0064ff78, 0x0122c02c, 0x02419a10, 0x01f10e3f, 0x030085e4, 0x0183608d, 0x00c32372, 0x01dbffa6, 0x03347928, 0x0029f7a6}}}, + {X: Field{[10]uint32{0x0243946f, 0x0347c0fc, 0x017e08d1, 0x02196962, 0x02736cbc, 0x005d81af, 0x03e6d5b5, 0x009d6b85, 0x00b9f493, 0x001f0843}}, Y: Field{[10]uint32{0x0359c63a, 0x038d4a45, 0x02db1c38, 0x02b0c3eb, 0x00920a7f, 0x02bc7c77, 0x00a92d87, 0x006173a9, 0x0123a8bd, 0x0005ec1d}}}, + {X: Field{[10]uint32{0x02d6e650, 0x01c5841b, 0x00aa1387, 0x02cbd15c, 0x03177b14, 0x02c3b285, 0x017b5192, 0x03b5118e, 0x0167578b, 0x0005cb94}}, Y: Field{[10]uint32{0x03830ba7, 0x01f3614c, 0x00cee173, 0x005f07e2, 0x039d3ba8, 0x00f1ceb4, 0x03de8038, 0x02e01758, 0x012e4776, 0x0027055d}}}, + {X: Field{[10]uint32{0x00030686, 0x02738a88, 0x019ca47e, 0x03ceaa70, 0x02c95a6e, 0x036b6011, 0x02373173, 0x03f6840d, 0x0040df25, 0x000586bf}}, Y: Field{[10]uint32{0x026089ce, 0x0035bc04, 0x03759ab9, 0x0182d895, 0x009926f1, 0x0291783a, 0x039c8193, 0x017ddad2, 0x0083c126, 0x00179bf4}}}, + {X: Field{[10]uint32{0x0216a85f, 0x034fb0e2, 0x018d9459, 0x0243b854, 0x002d194e, 0x01b8e451, 0x0369cf8b, 0x03b4cd35, 0x02a8e18a, 0x002e647c}}, Y: Field{[10]uint32{0x03cab7b0, 0x03433586, 0x00e8b1a0, 0x003886ca, 0x017e6e59, 0x0248f4b0, 0x0169d3e0, 0x01c723a8, 0x01a6b89f, 0x00074aea}}}, + {X: Field{[10]uint32{0x00ca8afc, 0x0328c351, 0x035026f1, 0x0121f56a, 0x007d6233, 0x03ecd91f, 0x016f4881, 0x03b9dfde, 0x009f5a6c, 0x0036b81a}}, Y: Field{[10]uint32{0x039c329c, 0x03221cf0, 0x01fa8c6c, 0x02c0c533, 0x0143ccc1, 0x00ef96e5, 0x01e69643, 0x02eb8a85, 0x0270f730, 0x003b99ed}}}, + {X: Field{[10]uint32{0x027e4e41, 0x03f63b22, 0x02e61aea, 0x02905a84, 0x03d72805, 0x018a7ed6, 0x0217ba14, 0x0270551a, 0x00cd75f8, 0x0011e963}}, Y: Field{[10]uint32{0x01fdd889, 0x0153cf0a, 0x007679b9, 0x02e5cf65, 0x02a4bc43, 0x007f07c2, 0x03e60bb6, 0x02043ad2, 0x03ed1bbb, 0x0030579f}}}, + {X: Field{[10]uint32{0x03040e3c, 0x0026d11a, 0x01698cef, 0x01a57142, 0x02d7582f, 0x013bd96d, 0x000697c9, 0x01bb8cc3, 0x03d02e3b, 0x003deb8b}}, Y: Field{[10]uint32{0x0019ca03, 0x03762b75, 0x00ea36a9, 0x0195e64d, 0x015eb495, 0x037506b2, 0x00d8e6dd, 0x004e6f15, 0x00aac527, 0x002b7a7e}}}, + {X: Field{[10]uint32{0x0012989d, 0x0112365f, 0x00dc8b6c, 0x0091757e, 0x00ae61cf, 0x03091296, 0x03e9c214, 0x02b88235, 0x02a89be2, 0x000557e7}}, Y: Field{[10]uint32{0x01b009ff, 0x033a74d9, 0x036808c1, 0x003d3345, 0x00cf5ea6, 0x032fd124, 0x0204abe6, 0x03466bf6, 0x01f3840c, 0x0004813d}}}, + {X: Field{[10]uint32{0x029d74f6, 0x018598c7, 0x01a5189a, 0x02e404f1, 0x01e35057, 0x0034fb8e, 0x01348a0e, 0x017c53e9, 0x01c3933b, 0x002a0f32}}, Y: Field{[10]uint32{0x0072a74a, 0x0352ebfc, 0x021dbe30, 0x00468a0f, 0x0052b91d, 0x007ef91e, 0x02a9c78e, 0x0211d878, 0x02d7fad6, 0x00102a99}}}, + {X: Field{[10]uint32{0x03b5f5df, 0x030fa959, 0x02cce11f, 0x02f6fca9, 0x00d7acef, 0x02912d55, 0x00a20e0f, 0x01708ca6, 0x01cfc07b, 0x00329254}}, Y: Field{[10]uint32{0x01f4afc2, 0x004b13c2, 0x02050b80, 0x0115e161, 0x0235aac5, 0x00a31e66, 0x01791a6b, 0x032beb1e, 0x03d76700, 0x00061aa2}}}, + {X: Field{[10]uint32{0x02b6787c, 0x0339c4a7, 0x011a9ae0, 0x0296e11e, 0x01d6760b, 0x02f090e3, 0x031f2a0d, 0x00407d79, 0x01e61bad, 0x0033e4b7}}, Y: Field{[10]uint32{0x003bcbd8, 0x014f88d7, 0x0159528f, 0x027444df, 0x026c9d8a, 0x00a51638, 0x00c1f053, 0x0079af2f, 0x01b7f3e3, 0x0029f4d4}}}, + {X: Field{[10]uint32{0x029c1179, 0x01466144, 0x0287d08f, 0x02a5b8a9, 0x03b06154, 0x020fa2cd, 0x039df9be, 0x00a0e8ed, 0x033ecfd8, 0x002c6ac2}}, Y: Field{[10]uint32{0x01506bbf, 0x017435ba, 0x0305812d, 0x0254e0df, 0x0099e973, 0x0204a403, 0x034cd97b, 0x014d2907, 0x02f34bab, 0x00336dfc}}}, + {X: Field{[10]uint32{0x021789ce, 0x02549283, 0x0035424e, 0x028a62cc, 0x01197296, 0x00ffaeb6, 0x0399295f, 0x0327a13e, 0x03299cd4, 0x00285d0c}}, Y: Field{[10]uint32{0x037e1afe, 0x00bd75fd, 0x03fc4428, 0x02913cbc, 0x035bee11, 0x0373e9b5, 0x0078088a, 0x00d5ddbc, 0x02f44cf5, 0x00102653}}}, + {X: Field{[10]uint32{0x01c0573b, 0x02868af6, 0x01e0b0d0, 0x011981fc, 0x0338b318, 0x006954c5, 0x03b946a6, 0x02b1f0f1, 0x00864efc, 0x0000906d}}, Y: Field{[10]uint32{0x03a0d574, 0x03d72607, 0x0197c832, 0x0166eb4e, 0x002f9801, 0x02f2900f, 0x01f3ba8f, 0x00734cc9, 0x0048eec6, 0x001733a2}}}, + {X: Field{[10]uint32{0x0291b387, 0x00f8f937, 0x0137ed75, 0x01534960, 0x03e3efd3, 0x01e66ac2, 0x01559adf, 0x01e611a6, 0x02096499, 0x00207e20}}, Y: Field{[10]uint32{0x0226d15c, 0x031c79aa, 0x01967a32, 0x0266be8a, 0x0243bda5, 0x03cf3236, 0x01e5caa5, 0x01c1846e, 0x01b85bfd, 0x0023e7fb}}}, + {X: Field{[10]uint32{0x024e5a5b, 0x03d75251, 0x006fe8fb, 0x01ad955c, 0x00c22da9, 0x028bb095, 0x00793d64, 0x00851480, 0x0231bd2c, 0x00127590}}, Y: Field{[10]uint32{0x0351e825, 0x0350ccf1, 0x0302b548, 0x0100fc69, 0x01bf9864, 0x01c71b76, 0x01f81216, 0x00b2b607, 0x02dab0d7, 0x003ebb23}}}, + {X: Field{[10]uint32{0x026e0ae4, 0x01f6db41, 0x029387e7, 0x013651db, 0x006daea2, 0x02dd0260, 0x03e1f159, 0x00e90471, 0x00324fad, 0x001d3053}}, Y: Field{[10]uint32{0x00641a41, 0x01ce2038, 0x009fd5aa, 0x0176af6e, 0x013ee016, 0x011b9ad9, 0x031a2cb9, 0x03972fc0, 0x02031fbe, 0x002bde54}}}, + {X: Field{[10]uint32{0x02a1e7c3, 0x012db5c4, 0x011b2a98, 0x00674276, 0x00930f9c, 0x004e0f1b, 0x03f42158, 0x036532f8, 0x009c7342, 0x00222f08}}, Y: Field{[10]uint32{0x005b3e08, 0x03265313, 0x02a2346a, 0x03985606, 0x01b817eb, 0x00a1d843, 0x0288866e, 0x021c8e26, 0x034576dd, 0x002b2df5}}}, + {X: Field{[10]uint32{0x026eb3f8, 0x0361738a, 0x02e77c1b, 0x01099daa, 0x0009bee2, 0x0285497d, 0x03b93c85, 0x02a2337d, 0x0068c81c, 0x00121b23}}, Y: Field{[10]uint32{0x03e52d54, 0x03749bd3, 0x0234ec1a, 0x0013eccf, 0x01d62490, 0x03d79a12, 0x02648706, 0x02a5f357, 0x014b035f, 0x00383fb2}}}, + {X: Field{[10]uint32{0x00a681a3, 0x033ae401, 0x02f14e28, 0x00f5b97e, 0x03ba3904, 0x034377cd, 0x01e30fb5, 0x02388ded, 0x02116c58, 0x001287be}}, Y: Field{[10]uint32{0x017b64f4, 0x03efc6a6, 0x00d538fc, 0x030506f6, 0x0365f2ac, 0x02f391db, 0x0137dd31, 0x01c596a2, 0x03373c90, 0x002ec659}}}, + {X: Field{[10]uint32{0x00eb28d2, 0x0110a51e, 0x0392f8da, 0x016dfdfd, 0x002632e8, 0x03bf9eed, 0x0317f308, 0x0027b436, 0x0006c696, 0x0035dd17}}, Y: Field{[10]uint32{0x01b96a73, 0x00fc208e, 0x0297cad1, 0x001fdc0a, 0x025371f0, 0x006b76c6, 0x0046e11b, 0x00af557f, 0x02754d1b, 0x0001d5d6}}}, + {X: Field{[10]uint32{0x03e68def, 0x01ebe90a, 0x015f49ca, 0x0143f666, 0x00dc333d, 0x03dd2a1f, 0x0208cedd, 0x009f1a9a, 0x032ea3db, 0x002f5d4b}}, Y: Field{[10]uint32{0x01e9491a, 0x03b0e2e9, 0x024d791d, 0x01b76a70, 0x02ef5c57, 0x01b54318, 0x00725ed2, 0x023482e9, 0x02af6747, 0x000de3e2}}}, + {X: Field{[10]uint32{0x03224d21, 0x0115ec07, 0x001f94be, 0x0131fccc, 0x0055eb30, 0x03380357, 0x0202bffa, 0x031faf19, 0x033315a3, 0x003bd620}}, Y: Field{[10]uint32{0x03517abd, 0x02830482, 0x0123ff46, 0x01532d69, 0x01eb52e0, 0x0210dd47, 0x01a95f7e, 0x037ef8f6, 0x02ab6253, 0x0015bace}}}, + {X: Field{[10]uint32{0x0253727a, 0x031810d4, 0x01f1fc1d, 0x0339fb7c, 0x0106b495, 0x010b7c90, 0x01beea4f, 0x02097682, 0x03747355, 0x000b0778}}, Y: Field{[10]uint32{0x03a150c2, 0x00ec74e1, 0x0058873a, 0x0340a34b, 0x005ff92c, 0x01dd9caa, 0x01986bdf, 0x03d7623e, 0x02609082, 0x0026164d}}}, + {X: Field{[10]uint32{0x000daf99, 0x03fd43ca, 0x02535324, 0x008aa23c, 0x00b78e2a, 0x03ce6cba, 0x00c90016, 0x000503d4, 0x031b23e6, 0x00127e35}}, Y: Field{[10]uint32{0x018b04ec, 0x024ea1ad, 0x0254622b, 0x03207f90, 0x00308111, 0x03dbf788, 0x00ec3393, 0x039f70cc, 0x02654807, 0x003d9aed}}}, + {X: Field{[10]uint32{0x009f37be, 0x0185eac6, 0x03ceb6df, 0x01e36d64, 0x02d18fdf, 0x0153ce94, 0x02a30f99, 0x018728ac, 0x0385754b, 0x000d9727}}, Y: Field{[10]uint32{0x0132825e, 0x00169054, 0x01a3af14, 0x000488da, 0x007681b6, 0x0028c9e5, 0x026aced6, 0x01af2ffe, 0x03e6aca5, 0x00310ffb}}}, + {X: Field{[10]uint32{0x01f1b5af, 0x013a2fc8, 0x023108e2, 0x00f86612, 0x027e2cb5, 0x028c473c, 0x02446c4d, 0x01a3b706, 0x03e9e896, 0x00073cb3}}, Y: Field{[10]uint32{0x00c966b7, 0x007bd688, 0x03803673, 0x004b8b2b, 0x03aebc7b, 0x029a17c8, 0x038f1041, 0x00c251ed, 0x01ac43c5, 0x001c795b}}}, + {X: Field{[10]uint32{0x008ca3ec, 0x03398dad, 0x03d5225d, 0x03e38072, 0x02219694, 0x01fa1de5, 0x011c26fa, 0x00089bce, 0x00796266, 0x003ccc0d}}, Y: Field{[10]uint32{0x02762827, 0x023e3e98, 0x030026f4, 0x03215aa4, 0x02afa585, 0x013e0e90, 0x0359ab87, 0x03a5176e, 0x03f4c110, 0x001f7a82}}}, + {X: Field{[10]uint32{0x00b27154, 0x030c94f9, 0x02df0587, 0x01a46b9e, 0x008756a9, 0x008a5fa8, 0x00664f90, 0x01b220e6, 0x004c4bc1, 0x002da249}}, Y: Field{[10]uint32{0x0050c856, 0x03466a39, 0x00364c27, 0x02b971c0, 0x00bd7483, 0x02d29d68, 0x03f89a90, 0x00da3325, 0x03481357, 0x0026d221}}}, + {X: Field{[10]uint32{0x038cbe41, 0x02c45018, 0x00517f3e, 0x00089035, 0x01a78b43, 0x0392f808, 0x032f8745, 0x00dc73fb, 0x00d2d6b4, 0x002fcd3f}}, Y: Field{[10]uint32{0x0397ac02, 0x01386557, 0x03546546, 0x00e09fd9, 0x001ef6a2, 0x006d0ef0, 0x0372914e, 0x01baba39, 0x00d27e32, 0x00339a22}}}, + {X: Field{[10]uint32{0x018d74fe, 0x03520844, 0x01cd110e, 0x018f116e, 0x00d51ffe, 0x01300094, 0x005a5944, 0x031e5b3a, 0x026d231b, 0x0030825e}}, Y: Field{[10]uint32{0x03e4ac87, 0x002da82f, 0x0372b135, 0x00f96e67, 0x01d1f92b, 0x0299d221, 0x023a85ac, 0x0305cf87, 0x0013fc4a, 0x00162c19}}}, + {X: Field{[10]uint32{0x017afa81, 0x01a8cc10, 0x026184d4, 0x0261036c, 0x02e3e817, 0x03191eba, 0x011b1de3, 0x0013cc28, 0x02223d88, 0x0021d298}}, Y: Field{[10]uint32{0x0380b429, 0x00e83b6b, 0x00f8f6b1, 0x03803bdc, 0x02b31668, 0x03263cd5, 0x02b181d5, 0x03988a5d, 0x01f67986, 0x00104ca9}}}, + {X: Field{[10]uint32{0x01bc605c, 0x021382bd, 0x03b85b97, 0x00f332a8, 0x021f2846, 0x0030fb51, 0x002227ab, 0x03564a05, 0x028a1a05, 0x002b1f1b}}, Y: Field{[10]uint32{0x018a2186, 0x02c52cc4, 0x00da4a08, 0x036da1e5, 0x01c107a9, 0x018fd71c, 0x0260a0a9, 0x00ce5fae, 0x0195581e, 0x00069668}}}, + {X: Field{[10]uint32{0x0333342c, 0x02c58e8c, 0x00a65575, 0x02e0bc95, 0x0344bc12, 0x005c5697, 0x0075c01a, 0x028fd822, 0x02d8d825, 0x000fc4f8}}, Y: Field{[10]uint32{0x0025e3b7, 0x00fe8716, 0x02724339, 0x033f5ee9, 0x036a2e6e, 0x02d788a4, 0x02f76a68, 0x009847ff, 0x0082fb2c, 0x002ebfda}}}, + {X: Field{[10]uint32{0x03a8fe2d, 0x03e57b2f, 0x03cec4d5, 0x003d327d, 0x01aa7e40, 0x007418c3, 0x03e26315, 0x01fce770, 0x0354515e, 0x0007afac}}, Y: Field{[10]uint32{0x025c85cf, 0x02847deb, 0x02daca6c, 0x02e6131c, 0x00c70724, 0x00617ce9, 0x00a2473c, 0x03373ce1, 0x00ef00c2, 0x0028b8d7}}}, + {X: Field{[10]uint32{0x0202b2ab, 0x00668777, 0x019a0d2d, 0x027388ae, 0x00b47d8f, 0x004ad176, 0x0059218d, 0x039d979b, 0x0365b211, 0x0030b736}}, Y: Field{[10]uint32{0x00f3be50, 0x01bd4389, 0x01237b14, 0x00cb25ad, 0x028722e0, 0x00967e21, 0x009326e9, 0x0045e9ca, 0x039ca960, 0x00382a96}}}, + {X: Field{[10]uint32{0x00bc0d45, 0x03a1e459, 0x01b85841, 0x02e09c32, 0x0207f360, 0x000e3db1, 0x02ed8a9c, 0x03451238, 0x01f7e2a9, 0x0012575a}}, Y: Field{[10]uint32{0x017088d2, 0x03d67825, 0x003e70bd, 0x02f84d0a, 0x03c48584, 0x013eb1bd, 0x034465d7, 0x0339ee0e, 0x022a1dab, 0x0017ecff}}}, + {X: Field{[10]uint32{0x0053bab2, 0x01eb21cd, 0x0169d203, 0x01deeb56, 0x01270a94, 0x0368fd45, 0x01be43d8, 0x0393e5c0, 0x01692139, 0x0033ab11}}, Y: Field{[10]uint32{0x00908070, 0x00b05811, 0x00b3bca3, 0x01035548, 0x02f385ea, 0x01812dac, 0x002f2bd9, 0x03a1cad8, 0x01d815f4, 0x002f47f6}}}, + {X: Field{[10]uint32{0x01407e0d, 0x015625c2, 0x0140682f, 0x006835b3, 0x034e6dba, 0x002881ab, 0x01284cbc, 0x02e30073, 0x00b93196, 0x001fb474}}, Y: Field{[10]uint32{0x012801c5, 0x03286287, 0x00e0af1b, 0x03036103, 0x0111018e, 0x035d6a71, 0x034ee732, 0x002f988b, 0x02c96ba6, 0x003a568e}}}, + {X: Field{[10]uint32{0x01040b04, 0x02dc5e28, 0x010fba24, 0x02c84c49, 0x03ac5fe4, 0x02e9f325, 0x00fd4365, 0x033b2250, 0x03664f42, 0x0001cbec}}, Y: Field{[10]uint32{0x007dce41, 0x028994f1, 0x029bcdbb, 0x0372887b, 0x0063d551, 0x02d4b3a4, 0x01e5c9b4, 0x0047d7d7, 0x031a93a2, 0x0003060a}}}, + {X: Field{[10]uint32{0x0008beea, 0x0183c118, 0x00309021, 0x00b56455, 0x03469019, 0x00f9b615, 0x0320043d, 0x00791759, 0x018c9ca9, 0x003741b3}}, Y: Field{[10]uint32{0x001e7ecd, 0x021771b1, 0x03ce272b, 0x016e402c, 0x01418970, 0x020faf60, 0x03a8a7ee, 0x03a8efe7, 0x03276eeb, 0x0033705c}}}, + {X: Field{[10]uint32{0x0178cd13, 0x02a6a64e, 0x00743da8, 0x010c0b8b, 0x003c708c, 0x02ffb6c4, 0x02504398, 0x01fc3c79, 0x0129e90a, 0x000203d8}}, Y: Field{[10]uint32{0x01deb82a, 0x009b53ce, 0x0000fe72, 0x0208e0a3, 0x02d95a30, 0x016d9129, 0x02f594f8, 0x03bfd28f, 0x0012145f, 0x001d365e}}}, + {X: Field{[10]uint32{0x005995b6, 0x0309f9c4, 0x01b24f5b, 0x00f13014, 0x020b48f8, 0x02bee774, 0x02970afb, 0x01422bbb, 0x00daf56b, 0x0015abcd}}, Y: Field{[10]uint32{0x01ae68bf, 0x02ac37b4, 0x0334d8a3, 0x016b7317, 0x03decca6, 0x00867734, 0x0105a4cc, 0x02386624, 0x02529e78, 0x0035077f}}}, + {X: Field{[10]uint32{0x023f91ee, 0x00f11393, 0x001f6ca3, 0x024e8687, 0x00148cf6, 0x01a27647, 0x005e29c4, 0x0196d031, 0x01ba7955, 0x00208089}}, Y: Field{[10]uint32{0x024b7db4, 0x000a2fae, 0x03334b24, 0x03c52ce1, 0x0011a0f4, 0x01e09a4a, 0x02bf5a31, 0x0270b819, 0x025bc89b, 0x000d88ab}}}, + {X: Field{[10]uint32{0x02ea57d2, 0x008cafa8, 0x037033bf, 0x02c5594a, 0x03ad388d, 0x0231fc27, 0x01a1b7ca, 0x0080aa25, 0x01bfcfcc, 0x001e497f}}, Y: Field{[10]uint32{0x0290525c, 0x00dcc253, 0x00d0a9dc, 0x0072a105, 0x021ebcc2, 0x01b4fd7c, 0x019cf5ec, 0x01f72455, 0x0301c9cb, 0x0011bdfb}}}, + {X: Field{[10]uint32{0x01d81808, 0x01fd8341, 0x039f6102, 0x012a6ffd, 0x02663879, 0x036f4ac7, 0x03316eb8, 0x039cc416, 0x036af38a, 0x0012c892}}, Y: Field{[10]uint32{0x015c3dac, 0x03e72c56, 0x029d423f, 0x02207f19, 0x00b6dc68, 0x007ff96d, 0x032ad2e1, 0x00c00aee, 0x0208b163, 0x000c50fa}}}, + {X: Field{[10]uint32{0x007380ee, 0x02bc831a, 0x013cd28d, 0x0192a904, 0x022c1bdd, 0x01b39223, 0x02a1a36e, 0x03d3ad80, 0x03fa4135, 0x000b01d9}}, Y: Field{[10]uint32{0x03bc16a7, 0x006f8ec3, 0x0389a5f7, 0x00ac4142, 0x0006a65d, 0x004dcf78, 0x002da710, 0x00c185f3, 0x03fce78d, 0x003770fb}}}, + {X: Field{[10]uint32{0x00a7ae7c, 0x0366ee94, 0x01ef1982, 0x03097544, 0x0137b5a2, 0x006a7e0d, 0x02ed2d94, 0x026a13bd, 0x013ee717, 0x0020e0df}}, Y: Field{[10]uint32{0x03b66dbe, 0x00092db8, 0x008d8556, 0x03c9e51b, 0x01fe2294, 0x029809ed, 0x02f1a495, 0x01ed32a1, 0x02166095, 0x00188807}}}, + {X: Field{[10]uint32{0x0095387a, 0x009c4256, 0x01d9bda4, 0x027875c3, 0x0225e50d, 0x00d6fc76, 0x028e0118, 0x03c15d4e, 0x0334e560, 0x0033c1d6}}, Y: Field{[10]uint32{0x02127018, 0x001c6128, 0x02a1404b, 0x03746035, 0x032b11d8, 0x00f7ce35, 0x0219f6f3, 0x03d348e3, 0x01d0330f, 0x0031cc82}}}, + {X: Field{[10]uint32{0x008931a4, 0x006e20df, 0x0329dcb0, 0x00b04020, 0x039d06ba, 0x0038faed, 0x00680300, 0x01d747bd, 0x00ff9b18, 0x003560fe}}, Y: Field{[10]uint32{0x03ae3292, 0x02f94f1b, 0x0258cd55, 0x0270ccee, 0x00aaac7c, 0x0165ad42, 0x03cfcc69, 0x024ae9af, 0x031c03f0, 0x003e33f3}}}, + {X: Field{[10]uint32{0x03eaefaa, 0x006de490, 0x02220343, 0x02cb687f, 0x0327568b, 0x010bb6c6, 0x01853723, 0x00e26ff0, 0x01b621d2, 0x001547fa}}, Y: Field{[10]uint32{0x023c24e0, 0x02b74095, 0x023d8c3b, 0x03fa5c48, 0x03ff48e5, 0x03cc4467, 0x02ff5057, 0x018f331a, 0x004ae485, 0x001b1da4}}}, + {X: Field{[10]uint32{0x016a80b2, 0x018fdbb4, 0x02da9a9d, 0x0252f239, 0x0051f063, 0x0339f264, 0x0162be7b, 0x00bc92c2, 0x00fc7406, 0x0006edde}}, Y: Field{[10]uint32{0x01d88318, 0x0385d018, 0x03bdb14b, 0x00bc775e, 0x0260e935, 0x03fc0dbe, 0x02700b68, 0x03459cf4, 0x013d2f4e, 0x0009d53d}}}, + {X: Field{[10]uint32{0x03e364aa, 0x00ff8439, 0x03be6e4a, 0x0313a5f3, 0x01aa0744, 0x03fe354e, 0x009f1a93, 0x0160be25, 0x02f71261, 0x00028542}}, Y: Field{[10]uint32{0x02ea4773, 0x037dc87a, 0x03ab99e0, 0x03b57e5b, 0x03100737, 0x01b86fd1, 0x02124715, 0x01c70be7, 0x02fea686, 0x00388a86}}}, + {X: Field{[10]uint32{0x032e2a9e, 0x00b856b9, 0x0380b724, 0x02f095e1, 0x00835ed2, 0x023a4f5a, 0x0163a030, 0x037e475e, 0x03df727f, 0x003253b0}}, Y: Field{[10]uint32{0x0152009c, 0x00d3485c, 0x030d50a9, 0x0042cfd5, 0x02011b28, 0x003eb427, 0x0312b35f, 0x014f1518, 0x00e97bda, 0x00291da8}}}, + {X: Field{[10]uint32{0x0146875a, 0x02d97dfc, 0x03f255f8, 0x0285e131, 0x02f186bd, 0x008d69ca, 0x01427394, 0x00c8c5f1, 0x01dbebe1, 0x000cd9ae}}, Y: Field{[10]uint32{0x0345d3cf, 0x00c9c984, 0x01862eea, 0x0064805c, 0x026b6206, 0x010e4657, 0x03213835, 0x00a22508, 0x007895f5, 0x00017a89}}}, + {X: Field{[10]uint32{0x00e8ba25, 0x030e3978, 0x02373974, 0x02f91130, 0x0358bec6, 0x0024acae, 0x005ef365, 0x0197b32e, 0x026ce522, 0x00185b23}}, Y: Field{[10]uint32{0x01aa0970, 0x0126fc73, 0x033caba0, 0x0240bc7b, 0x02724a98, 0x03d04926, 0x03286f45, 0x00963362, 0x01433d6e, 0x00134f55}}}, + {X: Field{[10]uint32{0x02651827, 0x008a47da, 0x00b1d043, 0x0298c825, 0x032617b3, 0x01177129, 0x001d86ef, 0x03a13a2e, 0x01772e38, 0x001d37c8}}, Y: Field{[10]uint32{0x02e01334, 0x011b6308, 0x0360c487, 0x0071a86c, 0x032a9ccf, 0x0326e695, 0x00abc6f9, 0x02549ff1, 0x03af30f0, 0x000130ca}}}, + {X: Field{[10]uint32{0x01accbd1, 0x03f14008, 0x00ce5d68, 0x0366fb83, 0x02532f8d, 0x03bd0bea, 0x01966d15, 0x0114ca5e, 0x01bf76b7, 0x00060528}}, Y: Field{[10]uint32{0x00d46bdc, 0x02feeb6b, 0x02ef3154, 0x01b826cb, 0x037af174, 0x03ea4ee6, 0x0205ad25, 0x0350e6c8, 0x01ff0da9, 0x0017d77d}}}, + {X: Field{[10]uint32{0x018625cc, 0x01db00ae, 0x02975c74, 0x019b108a, 0x035f444d, 0x03a17ef6, 0x01f22878, 0x01d49aeb, 0x029498ff, 0x000a2447}}, Y: Field{[10]uint32{0x02638537, 0x03240f07, 0x01ada5e4, 0x02ef8e02, 0x02eac150, 0x02c886e9, 0x0069542f, 0x01801a76, 0x00f35cf2, 0x00168d07}}}, + {X: Field{[10]uint32{0x01270865, 0x0343bf8a, 0x0279abd6, 0x006f9913, 0x02f441ce, 0x0227a1a1, 0x01ce2926, 0x011570e8, 0x0371e82a, 0x00356b3f}}, Y: Field{[10]uint32{0x0126d5e8, 0x031f6007, 0x0070e00d, 0x025a5636, 0x03ca8cde, 0x0344fc0c, 0x004971aa, 0x03a5c281, 0x008f1b46, 0x002ab1b5}}}, + {X: Field{[10]uint32{0x02711596, 0x002638b8, 0x00b6a91f, 0x015d4401, 0x008f03fc, 0x00842545, 0x0365e173, 0x00361675, 0x001b0221, 0x00173d47}}, Y: Field{[10]uint32{0x02d5c3b3, 0x016f73c9, 0x01838f39, 0x03ba8e65, 0x00017fe9, 0x028a8852, 0x031e58ea, 0x03d164b0, 0x01e0610d, 0x0007bac6}}}, +} + +var preG128 = []XY{ + {X: Field{[10]uint32{0x02c4c0da, 0x02d11327, 0x023351b7, 0x01e1c8fa, 0x02e88c56, 0x0207c58b, 0x039c1ad9, 0x017cce48, 0x01d2f63b, 0x0023da2e}}, Y: Field{[10]uint32{0x001fff82, 0x032fde54, 0x00bfdf23, 0x03fa5544, 0x01bbea2c, 0x01af8857, 0x01d90c2b, 0x00e61b78, 0x032dba06, 0x00198aa7}}}, + {X: Field{[10]uint32{0x023809fa, 0x00ae3b74, 0x014be18e, 0x02cd4765, 0x00fd845c, 0x009147c2, 0x0293363f, 0x027c8a2e, 0x01be2e50, 0x000e0e07}}, Y: Field{[10]uint32{0x031fed52, 0x001d460c, 0x0324dbd7, 0x032ccb63, 0x003681fc, 0x0083ac73, 0x01405a55, 0x005f72c2, 0x010a0fb9, 0x003928cb}}}, + {X: Field{[10]uint32{0x03c2a310, 0x01099225, 0x026303ea, 0x02950048, 0x01f186ae, 0x0291a668, 0x0121b82a, 0x00ab9bda, 0x0324e437, 0x00124989}}, Y: Field{[10]uint32{0x0227ded0, 0x006da057, 0x038ce0c4, 0x004a9d7f, 0x036d1636, 0x01c50c0e, 0x02cfa569, 0x02afe568, 0x0373bca7, 0x0004cdf9}}}, + {X: Field{[10]uint32{0x02bd2d31, 0x012c1e73, 0x01b8d138, 0x015bfc1b, 0x004dcc1a, 0x011df8be, 0x02253b3e, 0x00324357, 0x028c1a24, 0x0038c195}}, Y: Field{[10]uint32{0x02546e44, 0x02d020e4, 0x03826692, 0x010af8dc, 0x02ffbc80, 0x03df436d, 0x00f2b107, 0x01098222, 0x03e37893, 0x0003ab1b}}}, + {X: Field{[10]uint32{0x023136b0, 0x0030e78d, 0x01dd9c53, 0x0366aad0, 0x0374ebf8, 0x00fef58c, 0x01b0e762, 0x033bf09c, 0x000e2428, 0x000ee784}}, Y: Field{[10]uint32{0x00dbbc8a, 0x03b05bdb, 0x01f81953, 0x028ceb4c, 0x02a2ae28, 0x03d1d6c9, 0x01533eb8, 0x02edc77c, 0x00152d16, 0x003ebee6}}}, + {X: Field{[10]uint32{0x03485d3f, 0x023c11cb, 0x03eee960, 0x01a2041e, 0x0317ca07, 0x0177b7bd, 0x036ca80f, 0x0326a4ad, 0x0149712a, 0x002ec2ab}}, Y: Field{[10]uint32{0x00a2f975, 0x00e4940f, 0x00bffe79, 0x03e8c59c, 0x00895a5a, 0x00a5f68d, 0x00d201f7, 0x0151e63b, 0x0053c583, 0x003a9a67}}}, + {X: Field{[10]uint32{0x02718dc9, 0x03b4ce8d, 0x023de4ae, 0x0136c044, 0x03e1e58b, 0x02bf8044, 0x028eb197, 0x03f30353, 0x02c8e4ee, 0x001e4242}}, Y: Field{[10]uint32{0x00fae7c5, 0x00c8ac47, 0x0008b963, 0x02dc2ea4, 0x02dd36af, 0x0366aa95, 0x01816cbc, 0x016e3c4f, 0x022b9190, 0x003aaadc}}}, + {X: Field{[10]uint32{0x0360c7d1, 0x025a531f, 0x01ad2a26, 0x039f35dd, 0x028dd71d, 0x01526e99, 0x003dbbce, 0x01ed5470, 0x01ade9f9, 0x0039df20}}, Y: Field{[10]uint32{0x02d72449, 0x01607ca0, 0x006d34ec, 0x03dc70a6, 0x03631470, 0x03aa0550, 0x03c3b323, 0x004c8717, 0x0078eef8, 0x000eb3c5}}}, + {X: Field{[10]uint32{0x01ccf6b0, 0x03ece915, 0x01341501, 0x02ba8b51, 0x003d633d, 0x037b61f3, 0x018878e3, 0x014473cb, 0x00e9dbce, 0x00378ad7}}, Y: Field{[10]uint32{0x01100666, 0x00a7adc4, 0x018bb348, 0x016b198c, 0x0065b8c4, 0x02c68dd1, 0x03717e98, 0x038386ef, 0x02f3d3c3, 0x003c415d}}}, + {X: Field{[10]uint32{0x03c03c56, 0x005182c4, 0x0258b26b, 0x02977919, 0x0329659c, 0x03048485, 0x0259fbd7, 0x028bf87a, 0x01ffd491, 0x00341ef7}}, Y: Field{[10]uint32{0x03405ce7, 0x00fd830a, 0x02ea76be, 0x03fe330b, 0x0161d963, 0x00778135, 0x01c40e2a, 0x025f743e, 0x0308cd3c, 0x002cab51}}}, + {X: Field{[10]uint32{0x036a4d51, 0x036ad06e, 0x0025710e, 0x01710d2e, 0x010f8da4, 0x025b3a38, 0x025ec4c3, 0x005abcdd, 0x027c5d30, 0x0020900f}}, Y: Field{[10]uint32{0x03463b19, 0x024bab5e, 0x03c1b11e, 0x03313b19, 0x0199ab6c, 0x00fa1014, 0x016baddb, 0x02dd9d11, 0x021be27c, 0x00034259}}}, + {X: Field{[10]uint32{0x010680cf, 0x032d219d, 0x0023f438, 0x00f65507, 0x01930f93, 0x0132bd36, 0x03faa58c, 0x009bd498, 0x0131fbd6, 0x003ab70c}}, Y: Field{[10]uint32{0x0087a914, 0x0253fc4b, 0x01a74360, 0x02770de4, 0x01a388fb, 0x01cb5740, 0x024b36c9, 0x02a25d71, 0x03b1c9b4, 0x0034f25d}}}, + {X: Field{[10]uint32{0x007987d9, 0x03ca427f, 0x038ac609, 0x0172ddf9, 0x0336bdd6, 0x019d23d3, 0x018a4b38, 0x03fc9314, 0x025f6758, 0x000e40fb}}, Y: Field{[10]uint32{0x002be83b, 0x03f8ab86, 0x028dab0c, 0x0061249e, 0x018d222a, 0x0348d1d2, 0x0115934b, 0x01075902, 0x014ea152, 0x0003a486}}}, + {X: Field{[10]uint32{0x03e6a5d9, 0x007e2096, 0x00e9323e, 0x010f6efe, 0x015759c3, 0x026a7c86, 0x035bdccf, 0x01228e11, 0x037839ab, 0x0034200e}}, Y: Field{[10]uint32{0x00582f0b, 0x012a4999, 0x01d24289, 0x01b39474, 0x0004ecf0, 0x00e2ebe9, 0x02ec15fb, 0x0325fa84, 0x0180ff29, 0x000b30ec}}}, + {X: Field{[10]uint32{0x00567ed0, 0x018a3ef0, 0x02c19215, 0x008f6a39, 0x018496dd, 0x033e2f81, 0x013a5aea, 0x01d26685, 0x0096b18a, 0x0007d5bc}}, Y: Field{[10]uint32{0x039dff58, 0x004f2d0d, 0x000d51fc, 0x03d06a4f, 0x01c94189, 0x02d9735a, 0x00044360, 0x03d2420c, 0x038a3b52, 0x003fbc8a}}}, + {X: Field{[10]uint32{0x038e213b, 0x03f016d8, 0x032974e0, 0x033f3c80, 0x0079e947, 0x008d2a8c, 0x006f5250, 0x01d0cb8e, 0x01b1a4a4, 0x000767da}}, Y: Field{[10]uint32{0x00d4ccbb, 0x00575bb9, 0x0372041f, 0x02cf4fdb, 0x005438d5, 0x00ac7689, 0x00500c3a, 0x001d86ce, 0x0017949c, 0x0036263b}}}, + {X: Field{[10]uint32{0x03629efd, 0x016a773e, 0x008b1aeb, 0x01537200, 0x00552133, 0x01719eb4, 0x03c43610, 0x032de04b, 0x01134d9d, 0x00004a32}}, Y: Field{[10]uint32{0x03e67c96, 0x01060602, 0x036e45ff, 0x0393b1bd, 0x02c160c8, 0x00267598, 0x03259360, 0x00984365, 0x014add15, 0x003fb8f9}}}, + {X: Field{[10]uint32{0x011a9685, 0x0038f643, 0x011fc49c, 0x015238b1, 0x00301f28, 0x01d581d7, 0x00b8d519, 0x02e53491, 0x012f5a95, 0x00087b00}}, Y: Field{[10]uint32{0x00de08ae, 0x0237864f, 0x00162d12, 0x029bf57f, 0x027418ed, 0x02527ca3, 0x03fef716, 0x0125fd31, 0x010577af, 0x000b7bc8}}}, + {X: Field{[10]uint32{0x02331cc5, 0x008a0d8f, 0x0311c584, 0x039df6be, 0x00761c3b, 0x031f3f1d, 0x0080e894, 0x022f0279, 0x0202fb9d, 0x001a23d4}}, Y: Field{[10]uint32{0x03302cd3, 0x02708631, 0x03d9462d, 0x02be27ba, 0x001a393e, 0x00900d0d, 0x007cabd9, 0x01069cbb, 0x015963b5, 0x0025ae9f}}}, + {X: Field{[10]uint32{0x03f02baf, 0x034ead3d, 0x03f682e4, 0x03bc3a2e, 0x010744d0, 0x0029434d, 0x0314c300, 0x02a3d6cc, 0x02ea1cb9, 0x003ed727}}, Y: Field{[10]uint32{0x03630418, 0x015fa77e, 0x02af0911, 0x0331f949, 0x006868e0, 0x01717a57, 0x028bd269, 0x031547ec, 0x0044e18f, 0x000a7ee2}}}, + {X: Field{[10]uint32{0x02c03421, 0x00d89732, 0x0380de0b, 0x03b1ed48, 0x01593168, 0x012a7787, 0x01f6a5d8, 0x02b8fcbd, 0x03e22eed, 0x003c51e7}}, Y: Field{[10]uint32{0x02764606, 0x015acb88, 0x02131cb8, 0x003120d4, 0x01c0b463, 0x03ef4d06, 0x0350d1a3, 0x022e084e, 0x015d2fd8, 0x0006990b}}}, + {X: Field{[10]uint32{0x031a7950, 0x0171ecaf, 0x0165a69f, 0x01eca261, 0x0200f60f, 0x03f83bfe, 0x005b0e09, 0x025dd24f, 0x01c5e819, 0x00089cfb}}, Y: Field{[10]uint32{0x027bda12, 0x02b8e7bf, 0x03530906, 0x03f13d42, 0x00b64691, 0x021254d6, 0x031a1df9, 0x01e364a7, 0x02388fd9, 0x002ceba8}}}, + {X: Field{[10]uint32{0x03ef5214, 0x0016b5e6, 0x0285656f, 0x03d2c518, 0x03496d59, 0x02ce768b, 0x03d10b32, 0x010de2d1, 0x000c3050, 0x00267e12}}, Y: Field{[10]uint32{0x0264b2cd, 0x029eb998, 0x0215171d, 0x00df9398, 0x02d930e4, 0x02d6aa67, 0x00bd397c, 0x010a1a36, 0x015d8e22, 0x00380075}}}, + {X: Field{[10]uint32{0x016a6f1f, 0x0195aea6, 0x03635bc9, 0x03561fd5, 0x0209c000, 0x024f2190, 0x00fdfc69, 0x004a035d, 0x017fe475, 0x0000e089}}, Y: Field{[10]uint32{0x0351d474, 0x01caab62, 0x019731c6, 0x00e78d96, 0x0130dbfa, 0x01ad7c7e, 0x01a4f1da, 0x032c1899, 0x033dfe52, 0x0030b71c}}}, + {X: Field{[10]uint32{0x00efb24b, 0x01179ffb, 0x034526e1, 0x03e7db57, 0x0262e5ea, 0x02b3211e, 0x01f4e1b2, 0x00e1af91, 0x02329125, 0x0008e84d}}, Y: Field{[10]uint32{0x016854c0, 0x0057d566, 0x03a6f49f, 0x01c0dcd2, 0x01413cc3, 0x03dc557c, 0x03817a1a, 0x02e888af, 0x037e0643, 0x00244a5d}}}, + {X: Field{[10]uint32{0x01149f0b, 0x002b0d5e, 0x039d48a3, 0x00f71102, 0x008cf559, 0x031737b5, 0x01791a18, 0x01937a8d, 0x026058a6, 0x0019967a}}, Y: Field{[10]uint32{0x02f2199d, 0x0031b5ac, 0x031ffc82, 0x036394d3, 0x035300d1, 0x010bf1b0, 0x007b69e7, 0x020dbecd, 0x0305a85d, 0x000ab731}}}, + {X: Field{[10]uint32{0x03a939fc, 0x0299f746, 0x01033037, 0x021d0508, 0x022899b4, 0x027f4a8f, 0x00e6f6c8, 0x034ed1fb, 0x03c6e1ac, 0x0014b70e}}, Y: Field{[10]uint32{0x03d05746, 0x03a270d0, 0x013e2709, 0x028fb946, 0x031e8f6b, 0x0168f13f, 0x003d9da1, 0x0041fef6, 0x034632ad, 0x00176bac}}}, + {X: Field{[10]uint32{0x01573551, 0x01dac435, 0x034f6173, 0x03add7c1, 0x01693fbc, 0x03251ef0, 0x01189ba9, 0x015d16f6, 0x029793cd, 0x001492ca}}, Y: Field{[10]uint32{0x00c80b71, 0x011b86ef, 0x02ca02d1, 0x0318f7b3, 0x01a6865a, 0x03a28bed, 0x02b92cc3, 0x03ec6a77, 0x01d6cb23, 0x0027a026}}}, + {X: Field{[10]uint32{0x0382756e, 0x01e45585, 0x029976fe, 0x02579641, 0x03525b7b, 0x02583a6d, 0x03e6c3dd, 0x01654e48, 0x01a8e2bc, 0x001cc860}}, Y: Field{[10]uint32{0x022e4823, 0x0318869c, 0x01d84eda, 0x0258523c, 0x03e3c42d, 0x02eba62a, 0x03a193c0, 0x03ac290a, 0x02b35592, 0x000945b1}}}, + {X: Field{[10]uint32{0x0102664b, 0x01c04479, 0x0315d8d5, 0x00f7ddba, 0x0249a7ae, 0x00bbdbf2, 0x038496ac, 0x00e3f7cc, 0x002d926e, 0x002e3a25}}, Y: Field{[10]uint32{0x02faf8eb, 0x00bd7b6f, 0x01d77f79, 0x0105a794, 0x03972486, 0x000c79b1, 0x0270ba22, 0x01623935, 0x016e7dea, 0x001e6435}}}, + {X: Field{[10]uint32{0x0098e4e5, 0x006de5f8, 0x001ae18d, 0x03989e25, 0x0119e744, 0x037733de, 0x00ac11e7, 0x02affdcb, 0x00f63e73, 0x000513a2}}, Y: Field{[10]uint32{0x0021837c, 0x027e0f0c, 0x02b3b4e0, 0x033df70b, 0x01158705, 0x029518cf, 0x018197fe, 0x03195431, 0x03f35df3, 0x00018f36}}}, + {X: Field{[10]uint32{0x003a9081, 0x023bef57, 0x0303975b, 0x024da055, 0x0160e5bc, 0x0271cf8f, 0x016a739c, 0x033638b4, 0x03dc489e, 0x00250db8}}, Y: Field{[10]uint32{0x01a7e59c, 0x002fd80e, 0x02d5e03a, 0x02cace99, 0x038e8d76, 0x02a139fd, 0x02a7806e, 0x01baff46, 0x031f50cb, 0x00051814}}}, + {X: Field{[10]uint32{0x00890db9, 0x01b09d48, 0x01e76193, 0x00177d9a, 0x03e840e0, 0x01c43464, 0x019b01a1, 0x03442d1b, 0x01617a56, 0x00274f09}}, Y: Field{[10]uint32{0x00521ea3, 0x019f38de, 0x02aca044, 0x0337a2bc, 0x001f89ff, 0x00b6a6e5, 0x01fee9b8, 0x03a6f30b, 0x00bc4c4a, 0x001aef70}}}, + {X: Field{[10]uint32{0x03db76c8, 0x02a1418f, 0x01d2d0dd, 0x02a2c398, 0x02d0aca5, 0x0114f13c, 0x00c6ae0b, 0x01fe2f86, 0x0250f51b, 0x000a7e63}}, Y: Field{[10]uint32{0x00e5d28f, 0x0038f1fc, 0x01186df8, 0x00c2b4de, 0x0358a6ec, 0x01016018, 0x02b8b211, 0x000c71cf, 0x00dcae8e, 0x0036bcef}}}, + {X: Field{[10]uint32{0x01c22c94, 0x02bc1d13, 0x02e1a538, 0x014a535d, 0x0217a897, 0x0375811b, 0x0005e311, 0x02a8d806, 0x00c2c71d, 0x00359f4c}}, Y: Field{[10]uint32{0x014f670c, 0x00452ee9, 0x03d969c1, 0x02faabd2, 0x00e87ebb, 0x00b81a33, 0x02e690aa, 0x001ec2e4, 0x00e712c8, 0x00122e6c}}}, + {X: Field{[10]uint32{0x03c81649, 0x019809cb, 0x00334835, 0x02e65e9e, 0x03059aa7, 0x0340e805, 0x032c9b76, 0x030b92dd, 0x03a88ce9, 0x003c8b0a}}, Y: Field{[10]uint32{0x01b7028f, 0x001bf77e, 0x019a3cbc, 0x02a4233e, 0x022d92dc, 0x015c09c2, 0x03a4e0f1, 0x02f85890, 0x0310f190, 0x001aaa79}}}, + {X: Field{[10]uint32{0x02c5f894, 0x00c25a66, 0x034a5eff, 0x03b73f01, 0x0336b722, 0x03bcc8d3, 0x02533c90, 0x01320f94, 0x018d06b9, 0x0003179c}}, Y: Field{[10]uint32{0x02eef436, 0x02cc5983, 0x01d7e642, 0x027b3111, 0x03f7f8ce, 0x02a71412, 0x024e810f, 0x01986775, 0x0051ccfc, 0x00092584}}}, + {X: Field{[10]uint32{0x0144d611, 0x019bdcde, 0x014a2c1f, 0x022cccd5, 0x02c291dc, 0x03e1fb93, 0x0218999e, 0x03adf55d, 0x00aac836, 0x0009aa2f}}, Y: Field{[10]uint32{0x03bcecc9, 0x0331976e, 0x027a6c69, 0x03438667, 0x00e57192, 0x00781d8f, 0x022da29c, 0x01998eb3, 0x01ba0723, 0x00308014}}}, + {X: Field{[10]uint32{0x01fa098c, 0x020cd18b, 0x027aa2c0, 0x03841d93, 0x016bcf65, 0x029925b5, 0x0301ba17, 0x0055166f, 0x0170fb7b, 0x000e238d}}, Y: Field{[10]uint32{0x007be798, 0x0003d7e8, 0x02bdea95, 0x0049176d, 0x0299120d, 0x038d12f9, 0x01561e5a, 0x003fc151, 0x0122a2eb, 0x000b5383}}}, + {X: Field{[10]uint32{0x01250709, 0x03e3dc85, 0x03fca7a7, 0x0070ba95, 0x0200da2d, 0x03aacb1b, 0x0227efa4, 0x01e0f88c, 0x03abb5a0, 0x001a0626}}, Y: Field{[10]uint32{0x007ae856, 0x02e0d34f, 0x00855a0e, 0x005cc34c, 0x003e42d5, 0x0145117e, 0x00954f62, 0x034fea85, 0x01833694, 0x002f4c2f}}}, + {X: Field{[10]uint32{0x012190ab, 0x0364344a, 0x03d42b88, 0x020ff5ec, 0x01ea6ff6, 0x00106289, 0x03b7aa90, 0x01de5659, 0x0023bb34, 0x00190b82}}, Y: Field{[10]uint32{0x03b4000f, 0x018e71fc, 0x00903210, 0x02418eda, 0x01286b46, 0x00e76bce, 0x02748926, 0x0014bf8d, 0x02a786ec, 0x0036dcf7}}}, + {X: Field{[10]uint32{0x00924afa, 0x01a0d719, 0x02027f91, 0x00bf4e61, 0x037f4eff, 0x0225abea, 0x01addea5, 0x015415d4, 0x0281e5bf, 0x0026adba}}, Y: Field{[10]uint32{0x0229bb6c, 0x0001eb1d, 0x02f2b47d, 0x026ca659, 0x03dd951c, 0x03392cf9, 0x0329efcb, 0x02979cbf, 0x02a74870, 0x000e301a}}}, + {X: Field{[10]uint32{0x014a8ee7, 0x020563ba, 0x01a62dd1, 0x0056f780, 0x01e059e0, 0x0227993e, 0x0298248e, 0x03da71c6, 0x01aee567, 0x002c2601}}, Y: Field{[10]uint32{0x0183d221, 0x01eca386, 0x0212c814, 0x02a038f6, 0x03dea885, 0x034882b0, 0x01382eb6, 0x004bbf31, 0x016a7ec9, 0x0018aba8}}}, + {X: Field{[10]uint32{0x0107e6e5, 0x01306f00, 0x03b5a82b, 0x03c25d6f, 0x0291d6b5, 0x020c5a46, 0x018bfbc9, 0x03568d29, 0x025b636e, 0x000f58ca}}, Y: Field{[10]uint32{0x03395a1c, 0x033e8c73, 0x01aef682, 0x0273c581, 0x027a7ee0, 0x032d3525, 0x036ba0f9, 0x005b64ba, 0x009e75bf, 0x0015de91}}}, + {X: Field{[10]uint32{0x00cef707, 0x0069a5d0, 0x0150ab1c, 0x00d4e8db, 0x03b51e36, 0x025ab22e, 0x02db69dd, 0x017fcb3b, 0x03f0f70d, 0x001ae086}}, Y: Field{[10]uint32{0x02d12e5d, 0x00ede271, 0x0347a6d8, 0x02d37e8b, 0x00006371, 0x03377aa5, 0x00286745, 0x03048220, 0x0211993f, 0x001484b3}}}, + {X: Field{[10]uint32{0x01728b23, 0x036e1511, 0x0196c789, 0x00c32476, 0x02dc33b3, 0x03364e53, 0x027740b5, 0x03f82e14, 0x01514496, 0x002fca52}}, Y: Field{[10]uint32{0x0112782c, 0x009cac7a, 0x03baec13, 0x00aaed06, 0x034c53bc, 0x004378e3, 0x03f745c4, 0x0339e8d0, 0x01e5da35, 0x001e42bb}}}, + {X: Field{[10]uint32{0x0175ec80, 0x02d80d47, 0x02f06742, 0x026c453d, 0x024906f6, 0x01126251, 0x0268267c, 0x025a2859, 0x00c382bf, 0x002954d5}}, Y: Field{[10]uint32{0x025962e8, 0x0298c332, 0x00c88179, 0x025b460a, 0x019dd6d2, 0x0337ed6c, 0x03319676, 0x00697ca2, 0x01dc4566, 0x000a026f}}}, + {X: Field{[10]uint32{0x0249a693, 0x03e8d109, 0x019f45a6, 0x02be13d4, 0x03b893f8, 0x03ed2603, 0x03a1574f, 0x020c46ef, 0x0036abcd, 0x003f0054}}, Y: Field{[10]uint32{0x019db819, 0x03d9dafc, 0x00789657, 0x03280f9f, 0x02f5542a, 0x026b34fd, 0x01cd0042, 0x03812ce1, 0x02781946, 0x00343da8}}}, + {X: Field{[10]uint32{0x019a7aae, 0x01e26003, 0x024eab75, 0x01b1447e, 0x0059caea, 0x012bef89, 0x02a799fb, 0x03cd489c, 0x010d9f81, 0x00185910}}, Y: Field{[10]uint32{0x025a7966, 0x031c54fb, 0x01ac0abe, 0x03d7539f, 0x034982ff, 0x016e4e5b, 0x03ee69c9, 0x027f34f2, 0x00800ba1, 0x0024af05}}}, + {X: Field{[10]uint32{0x030b5f2d, 0x003f2145, 0x01fc6faa, 0x01f47b01, 0x016e2591, 0x0060ad3d, 0x00f9a9b3, 0x035cddca, 0x01358de9, 0x003be059}}, Y: Field{[10]uint32{0x007ec595, 0x0320fa9d, 0x03d7e155, 0x03732c71, 0x010f1721, 0x02dbf4cb, 0x0249df88, 0x02a71141, 0x0026403c, 0x00370dc9}}}, + {X: Field{[10]uint32{0x0187a8ed, 0x03029222, 0x032e2642, 0x011a107a, 0x00178c56, 0x01c34b10, 0x0304e681, 0x00db7771, 0x00b989a4, 0x0010a30d}}, Y: Field{[10]uint32{0x02eebe06, 0x00deaf4e, 0x01f4f512, 0x01f9c651, 0x003836f9, 0x010da58d, 0x004dc3e6, 0x01191b28, 0x0158251c, 0x002c7c90}}}, + {X: Field{[10]uint32{0x01417a9e, 0x03f88199, 0x024a55ac, 0x01cdfb69, 0x025f19da, 0x02faef5a, 0x01e62437, 0x0055ed05, 0x0382f909, 0x001bad85}}, Y: Field{[10]uint32{0x00577b72, 0x013bfffa, 0x00c3904c, 0x03b8a43b, 0x02af03ed, 0x026710bd, 0x012f168f, 0x03cac5b2, 0x0146baed, 0x0013f9f1}}}, + {X: Field{[10]uint32{0x0376fa4b, 0x01c718a8, 0x01646e43, 0x01cf4530, 0x03cb6f95, 0x02338c77, 0x03830099, 0x013fb17b, 0x02f1466d, 0x00264b82}}, Y: Field{[10]uint32{0x01f9e825, 0x01a4354a, 0x01ae3871, 0x0398c75e, 0x0150d000, 0x002590d9, 0x001e3a90, 0x025acbac, 0x02691e43, 0x003438f6}}}, + {X: Field{[10]uint32{0x01721d11, 0x0210e0c1, 0x039c3010, 0x000e33d6, 0x00513e99, 0x00925a4d, 0x00f31d11, 0x0001e3c8, 0x024badc7, 0x003fb6d5}}, Y: Field{[10]uint32{0x00157a39, 0x01237bce, 0x00b2fa94, 0x021f5502, 0x02ba26ae, 0x015fc580, 0x015d97d6, 0x010833cb, 0x024957e8, 0x0006a38a}}}, + {X: Field{[10]uint32{0x033b24bd, 0x010c3401, 0x03575e54, 0x009989d2, 0x023e6832, 0x03109245, 0x007088d3, 0x02746049, 0x028a4dd8, 0x003cfc81}}, Y: Field{[10]uint32{0x03a2bfa8, 0x0069fdde, 0x00f0e75c, 0x017f87c7, 0x0312381c, 0x002a9f8c, 0x026ab1ee, 0x03d18850, 0x011900a7, 0x003caaaf}}}, + {X: Field{[10]uint32{0x00a13680, 0x00c1dc8f, 0x02e02b3d, 0x016364f6, 0x015b6aa4, 0x01daa160, 0x024e7c14, 0x028d6637, 0x025e4217, 0x000cae48}}, Y: Field{[10]uint32{0x02133802, 0x00d74396, 0x008a396f, 0x0051cce0, 0x03532462, 0x0341c7a5, 0x0185683d, 0x018d004a, 0x00042685, 0x001d19ba}}}, + {X: Field{[10]uint32{0x02e64a8a, 0x0266e7f6, 0x01c7fc62, 0x024fe893, 0x01ee6c6b, 0x03ad64be, 0x03899792, 0x035ac13f, 0x0287385e, 0x00214022}}, Y: Field{[10]uint32{0x0104a2df, 0x01b8a129, 0x023622ae, 0x023e8943, 0x0284b5b3, 0x0020961d, 0x01569f6c, 0x0015dbee, 0x022b8a5b, 0x0007c9e7}}}, + {X: Field{[10]uint32{0x002effd4, 0x0114bdaa, 0x030e9e44, 0x01883c04, 0x010b8353, 0x03f126ff, 0x00edac7c, 0x02ac2fb2, 0x0033ebbe, 0x00136b1e}}, Y: Field{[10]uint32{0x023c740a, 0x03426a80, 0x001f00cc, 0x02d76e3b, 0x01133dc3, 0x02d08df7, 0x014ada57, 0x02a9a184, 0x0170f230, 0x003f2746}}}, + {X: Field{[10]uint32{0x016dbeeb, 0x03cc40b5, 0x03d71031, 0x010406e4, 0x034b44de, 0x014d77d6, 0x0340226e, 0x01755066, 0x008145a6, 0x0026dd56}}, Y: Field{[10]uint32{0x0089a02d, 0x03674478, 0x00e1fa1e, 0x0185679f, 0x01c15160, 0x036ee8ed, 0x03382907, 0x00dedf26, 0x01710d69, 0x00340c90}}}, + {X: Field{[10]uint32{0x03bc8bdd, 0x00fb66b2, 0x004bdb58, 0x03291877, 0x0198b525, 0x02d9176d, 0x02e6e8b1, 0x029f5e99, 0x02b92592, 0x0006f5b3}}, Y: Field{[10]uint32{0x0229944c, 0x0242b126, 0x01e4e7b7, 0x03955473, 0x015a1c4c, 0x0296dc15, 0x037abb10, 0x022fa922, 0x028784a9, 0x00269677}}}, + {X: Field{[10]uint32{0x015b56ee, 0x03d4d56f, 0x00637268, 0x01f62d11, 0x016b3a3c, 0x03f9e1ba, 0x025b08a7, 0x00250594, 0x02b93b36, 0x00096a2c}}, Y: Field{[10]uint32{0x025f22ec, 0x0393a2e5, 0x0240ac45, 0x02bb7dc6, 0x0045f131, 0x03b1b154, 0x01027e63, 0x01a1ff6f, 0x00f75734, 0x000f1633}}}, + {X: Field{[10]uint32{0x03ed9f5f, 0x02c87945, 0x003c0d88, 0x02aa3695, 0x02bf5a1c, 0x0148975a, 0x01a57671, 0x00fbec88, 0x003327c3, 0x000912ca}}, Y: Field{[10]uint32{0x01f53d7d, 0x027c2ff0, 0x000dbc22, 0x0398110e, 0x0237f83c, 0x00a7d404, 0x02cec92a, 0x02254d6b, 0x02ace48d, 0x0008800d}}}, + {X: Field{[10]uint32{0x025dd1b7, 0x01928d4c, 0x01e64e97, 0x00775ab0, 0x0291f0cc, 0x0159a5e3, 0x0042d13e, 0x01e415ad, 0x000f27b8, 0x001be5eb}}, Y: Field{[10]uint32{0x03433d32, 0x0034ffe7, 0x01c814dd, 0x01697cb6, 0x007e937f, 0x0246ce28, 0x02ce1cc6, 0x031c1c89, 0x030cfac6, 0x0020f1b9}}}, + {X: Field{[10]uint32{0x021dce1f, 0x03120055, 0x02badc94, 0x0352c88d, 0x012d6abc, 0x01153c98, 0x00265cad, 0x0138b6ea, 0x020feb01, 0x001cb175}}, Y: Field{[10]uint32{0x03978fe2, 0x02d03698, 0x00bf0690, 0x02db491b, 0x0397b281, 0x03174eb2, 0x03282163, 0x00658ece, 0x02197ef9, 0x0038c466}}}, + {X: Field{[10]uint32{0x01f33825, 0x0367b435, 0x006ea707, 0x0252aba3, 0x002af32b, 0x0110686c, 0x018659df, 0x000619a6, 0x01a001b1, 0x002a5b4b}}, Y: Field{[10]uint32{0x02513f9f, 0x03a04202, 0x016906c0, 0x01c45aa4, 0x025659ea, 0x0230dc2a, 0x03cfd412, 0x0148d67d, 0x018305da, 0x0019835f}}}, + {X: Field{[10]uint32{0x03e3c4fa, 0x00537156, 0x00875173, 0x009e6431, 0x03d906aa, 0x01d8599d, 0x001d2008, 0x017b3066, 0x03634d81, 0x000b339b}}, Y: Field{[10]uint32{0x02ba4b50, 0x008cc8ef, 0x036e5d3c, 0x01d327b2, 0x01b33cb2, 0x03f4151d, 0x02f997a0, 0x027a446d, 0x00ddbd59, 0x00185484}}}, + {X: Field{[10]uint32{0x0245f0c4, 0x0226f5a9, 0x02f4660e, 0x03f1d628, 0x024558fa, 0x02e354ec, 0x00602d98, 0x034e6766, 0x0084525d, 0x00264ac0}}, Y: Field{[10]uint32{0x00e2f98d, 0x01935869, 0x02a572da, 0x0039657b, 0x02f5a5c7, 0x00508180, 0x005f40b1, 0x0168a631, 0x00d22654, 0x0020f2a6}}}, + {X: Field{[10]uint32{0x03eb7357, 0x03dd9ba6, 0x0388e44e, 0x027ad17a, 0x01c6b0c6, 0x03f52ddf, 0x0361ee43, 0x01867f31, 0x03453089, 0x0010d3be}}, Y: Field{[10]uint32{0x029291ea, 0x027bf08a, 0x01bd001e, 0x03220c2e, 0x0126967a, 0x00db02fa, 0x025586d2, 0x02e4b965, 0x016d01c0, 0x000f6ec3}}}, + {X: Field{[10]uint32{0x03fbc156, 0x037171f8, 0x02b884bd, 0x02271370, 0x00f0dbf5, 0x00fbf8c1, 0x02e47359, 0x00cc1828, 0x01ad2c68, 0x0002885e}}, Y: Field{[10]uint32{0x02033c1f, 0x001ebebd, 0x00b20192, 0x008c21b7, 0x0288a2d2, 0x036d8274, 0x00e6dfab, 0x0005da86, 0x01f8ab98, 0x003b914e}}}, + {X: Field{[10]uint32{0x0305a2e1, 0x00e41ebb, 0x00f146d6, 0x00a999c6, 0x02a445f2, 0x024887bd, 0x012bb400, 0x03851ea9, 0x001ed3e1, 0x000e4d02}}, Y: Field{[10]uint32{0x03b5b3c7, 0x02aca429, 0x0206214f, 0x03f9d4b1, 0x03d3a9fe, 0x03c7a566, 0x01e79d49, 0x006de882, 0x02563139, 0x002f0dc1}}}, + {X: Field{[10]uint32{0x0395d8ef, 0x022381f7, 0x013db396, 0x0388414a, 0x03f1f3f7, 0x03310957, 0x00383546, 0x02e4e401, 0x00e159a2, 0x000d6f09}}, Y: Field{[10]uint32{0x0223ae15, 0x03b42a24, 0x02dfa246, 0x034e2127, 0x00e87e0c, 0x0159c93e, 0x02beb5c0, 0x02636bde, 0x00700a96, 0x0037b87f}}}, + {X: Field{[10]uint32{0x0148127d, 0x0394962e, 0x01b48bc7, 0x0386f2b9, 0x0163aa14, 0x00176399, 0x012a0eef, 0x02d1ce15, 0x035c251f, 0x003d7479}}, Y: Field{[10]uint32{0x037170fe, 0x0084aa1b, 0x036fe92d, 0x03d02fde, 0x03e7d586, 0x00a614a2, 0x0009134d, 0x03c1623d, 0x01bc7044, 0x00389830}}}, + {X: Field{[10]uint32{0x03eb121c, 0x03687301, 0x00f54d12, 0x02cd80d4, 0x03f9617b, 0x02b2ddd0, 0x01170dd6, 0x00a0bc28, 0x02d36fed, 0x003b829d}}, Y: Field{[10]uint32{0x020ba5b1, 0x03debc50, 0x035166db, 0x01612d0a, 0x024e56c4, 0x03e78432, 0x02135eff, 0x02583c39, 0x02dbeba6, 0x003e33f0}}}, + {X: Field{[10]uint32{0x00a689d8, 0x01e43467, 0x01676f94, 0x03d85b69, 0x004d1879, 0x005dd345, 0x00ab377f, 0x01d99057, 0x03cf7892, 0x00278ee1}}, Y: Field{[10]uint32{0x02b3b577, 0x02a39b6e, 0x03482266, 0x025ad151, 0x027a9c2d, 0x006c7c9a, 0x033b0c2b, 0x028ab2c9, 0x0122da3c, 0x003e3cd1}}}, + {X: Field{[10]uint32{0x034868f0, 0x016cc43a, 0x0115286e, 0x031d3d89, 0x0012f409, 0x019ae2d4, 0x005b89ee, 0x010b00f2, 0x016fd089, 0x00389bc9}}, Y: Field{[10]uint32{0x02f210f9, 0x03a2fed5, 0x012f21bb, 0x00fcf13c, 0x033552c2, 0x00f26c49, 0x008c6562, 0x0127e9b4, 0x00d96fea, 0x002eacf1}}}, + {X: Field{[10]uint32{0x011da6c2, 0x01626000, 0x0021cf08, 0x014baa31, 0x01a3f5c8, 0x03c1eaf1, 0x00b67634, 0x020e6345, 0x0046a5d3, 0x0022b1d0}}, Y: Field{[10]uint32{0x0229b3dc, 0x0174c91c, 0x0288e149, 0x02543210, 0x024a71af, 0x00d500b0, 0x00f59160, 0x00c66215, 0x0393f56e, 0x00348329}}}, + {X: Field{[10]uint32{0x01932bd0, 0x01dea495, 0x03a83ac6, 0x02fecb20, 0x02753928, 0x03a074a7, 0x01531a86, 0x0253324f, 0x00956346, 0x0016c038}}, Y: Field{[10]uint32{0x00a99656, 0x00fbf598, 0x032d64bc, 0x00cdd200, 0x0242882b, 0x0003561f, 0x02daf180, 0x03123185, 0x027a8071, 0x00234bc9}}}, + {X: Field{[10]uint32{0x0211f0b1, 0x00d5fe27, 0x02a872c0, 0x026ad3a7, 0x01546ffb, 0x02ca9984, 0x01ae4ba7, 0x0175eeac, 0x00c4080c, 0x00058864}}, Y: Field{[10]uint32{0x02423525, 0x024c0c24, 0x019d8796, 0x00ba6317, 0x01bb8419, 0x00ef731b, 0x006d7a31, 0x022a7396, 0x01041244, 0x0036d788}}}, + {X: Field{[10]uint32{0x01b145b1, 0x0299db21, 0x0236cf26, 0x03726bfd, 0x03476774, 0x001805f6, 0x03f8520e, 0x020fa021, 0x0021b4b3, 0x003daa11}}, Y: Field{[10]uint32{0x0037a3b3, 0x01d2a010, 0x020a80ed, 0x0056fe23, 0x02937172, 0x03a3f87b, 0x03a2da82, 0x01c3b401, 0x01a95967, 0x0014131c}}}, + {X: Field{[10]uint32{0x032dd6e5, 0x01d66a64, 0x0013455a, 0x02795727, 0x0183e591, 0x0127e423, 0x038937da, 0x034f62cf, 0x0142f0b5, 0x0007c0b4}}, Y: Field{[10]uint32{0x01863e65, 0x0220b68e, 0x00348fb3, 0x017d22b8, 0x03fbc903, 0x036df27f, 0x02c2eae5, 0x01b7dd43, 0x03338ed3, 0x0039a972}}}, + {X: Field{[10]uint32{0x0178899f, 0x01889e07, 0x03a0434a, 0x03d44b5d, 0x0268e29b, 0x00d21295, 0x02e38c37, 0x0287fa8a, 0x016bc326, 0x00187d36}}, Y: Field{[10]uint32{0x03b4aab8, 0x00deb4b5, 0x02b38b3a, 0x012cdd79, 0x02217272, 0x00603097, 0x03970216, 0x016b1d93, 0x03386200, 0x001947bd}}}, + {X: Field{[10]uint32{0x01c11616, 0x005f2b8c, 0x019c19c9, 0x00ac6be8, 0x007c7ebe, 0x034a45b8, 0x008a71f8, 0x0179e602, 0x000d623c, 0x002e9f57}}, Y: Field{[10]uint32{0x015f5a51, 0x016c1f6f, 0x00958ce4, 0x039f99b2, 0x01a1ec37, 0x03ecd565, 0x02551530, 0x00fdb1e1, 0x03400d7e, 0x00369027}}}, + {X: Field{[10]uint32{0x025bdb09, 0x01be7464, 0x003c3bb1, 0x029a6af1, 0x01fe5a92, 0x036f0f86, 0x02a68ee6, 0x025df1b9, 0x0190eacb, 0x0022e429}}, Y: Field{[10]uint32{0x035df718, 0x00d4603e, 0x039a92a0, 0x01d760a6, 0x024d01ef, 0x01d1a9d4, 0x02734e1f, 0x0175642b, 0x0342ef65, 0x002973d7}}}, + {X: Field{[10]uint32{0x03f4fe4c, 0x03a6ab37, 0x025b71c9, 0x03ffd56c, 0x01f0d994, 0x02d6b85c, 0x00294a3c, 0x0133f73a, 0x02272191, 0x0021fcd4}}, Y: Field{[10]uint32{0x00babb2f, 0x00930a19, 0x03552dda, 0x00fc88a8, 0x01f26b28, 0x026a44cd, 0x027c1efb, 0x031787ab, 0x01af530b, 0x00331c74}}}, + {X: Field{[10]uint32{0x0377a15d, 0x03bb92b2, 0x0358b6c1, 0x027c61fb, 0x0383d550, 0x014c3c7c, 0x00ffe8a5, 0x014566fc, 0x0136ba40, 0x002bba93}}, Y: Field{[10]uint32{0x00d3ac1a, 0x01581e98, 0x033f78d5, 0x01f738da, 0x0196958f, 0x022aa8a3, 0x03031c24, 0x00f7e1f4, 0x01eae740, 0x0036d58f}}}, + {X: Field{[10]uint32{0x03cc7111, 0x00e2966b, 0x02db62a3, 0x00d95dd3, 0x00d8dda4, 0x02016353, 0x006f1ef0, 0x03ae755f, 0x018d3996, 0x000c03fa}}, Y: Field{[10]uint32{0x00c40e77, 0x01962c8e, 0x025e3a49, 0x009b49c8, 0x01d2e6e2, 0x010eddbf, 0x037913c1, 0x029033e4, 0x00178fdd, 0x00345228}}}, + {X: Field{[10]uint32{0x01c19fdb, 0x0017d0a6, 0x0073aa50, 0x006ddb53, 0x03d01e9c, 0x019d0f93, 0x01095a1f, 0x0051ba0e, 0x035e22cd, 0x0031c02b}}, Y: Field{[10]uint32{0x014b32c0, 0x0151aa86, 0x011d28b5, 0x024b0b54, 0x010d4a30, 0x02dba95a, 0x02b1fc6b, 0x00709c9e, 0x0181b1f0, 0x000ff800}}}, + {X: Field{[10]uint32{0x0350bc60, 0x030dd233, 0x034a5941, 0x01d7e5ae, 0x0194228f, 0x0211214e, 0x02147af3, 0x0104e06a, 0x00e117b9, 0x00340f42}}, Y: Field{[10]uint32{0x0096e31d, 0x001c6cea, 0x000fa10e, 0x01dba451, 0x01f47dd0, 0x015076a3, 0x00bfbfdc, 0x02f314b8, 0x03fd2785, 0x0016c467}}}, + {X: Field{[10]uint32{0x022bd361, 0x017697f0, 0x03832b39, 0x00fb2533, 0x03ea9c98, 0x02be0697, 0x017fadb6, 0x0082e15b, 0x00fa17a5, 0x001b19c4}}, Y: Field{[10]uint32{0x02804941, 0x028e4f3c, 0x00ad64fb, 0x002097b5, 0x01b036a4, 0x00225ec1, 0x01964f3c, 0x0207a906, 0x012636e2, 0x0036d3bf}}}, + {X: Field{[10]uint32{0x03d91bbb, 0x03cfef68, 0x021d9b46, 0x03a653e1, 0x025ea3bf, 0x00229766, 0x02cb900d, 0x01e859ad, 0x02399df4, 0x0035ed70}}, Y: Field{[10]uint32{0x00efe8ba, 0x03565f59, 0x03710cff, 0x0194a702, 0x03a3c8a0, 0x0253ff87, 0x003494d7, 0x03097a72, 0x034e4ab1, 0x003b5e47}}}, + {X: Field{[10]uint32{0x00f66c06, 0x02a7a394, 0x029524ab, 0x008c8d06, 0x0253ff2f, 0x03aaa8fb, 0x01eb8dcc, 0x02054b8b, 0x01ab8f72, 0x00243da6}}, Y: Field{[10]uint32{0x02fce91d, 0x0320b27f, 0x0008e641, 0x0339b98f, 0x00561558, 0x00da487e, 0x006d80ec, 0x004aee75, 0x03a77f53, 0x0022f430}}}, + {X: Field{[10]uint32{0x01fb65cc, 0x02b9c6a3, 0x0344abb9, 0x0338ada1, 0x0137557d, 0x0285bd5a, 0x01eaead6, 0x0370d324, 0x023e3d7a, 0x001343ab}}, Y: Field{[10]uint32{0x03a3de5a, 0x01b8bc87, 0x02a5352c, 0x02641425, 0x026e874c, 0x010aa94b, 0x019a6851, 0x021cc6ea, 0x0006a950, 0x00205ac2}}}, + {X: Field{[10]uint32{0x02f7de62, 0x023df26c, 0x031d0243, 0x0266381a, 0x01689a23, 0x00c54617, 0x034f8153, 0x0212637e, 0x02ddec31, 0x0011b367}}, Y: Field{[10]uint32{0x021f29bc, 0x0211be95, 0x0100810a, 0x01a0491f, 0x03e0d5d1, 0x0204ce22, 0x0164a8bb, 0x01e1d232, 0x01a3d5fd, 0x000ed6f0}}}, + {X: Field{[10]uint32{0x02ff730b, 0x013ae0c0, 0x000aebce, 0x03f88696, 0x00653748, 0x01154b90, 0x0176297b, 0x02aadc71, 0x000e3f6e, 0x00012ab2}}, Y: Field{[10]uint32{0x008c7954, 0x00d4e61b, 0x020509e4, 0x02a53c77, 0x0240d331, 0x02b1a811, 0x03e2dd5b, 0x03d1aa03, 0x000d8014, 0x000f50a8}}}, + {X: Field{[10]uint32{0x002a4114, 0x01a06956, 0x006374bb, 0x03d8bb2f, 0x02e03e96, 0x006664de, 0x01e45730, 0x0270244c, 0x0261b73d, 0x00166fa9}}, Y: Field{[10]uint32{0x01afa47d, 0x038f4b2c, 0x035c130b, 0x026af576, 0x00d9f263, 0x03a24541, 0x01062e78, 0x00b0ba07, 0x03e8ee8a, 0x000c6882}}}, + {X: Field{[10]uint32{0x00ca6037, 0x024d59e4, 0x003385e2, 0x02929387, 0x029ee089, 0x03b1e937, 0x019acd3f, 0x03ba48ac, 0x006588b2, 0x0001ffa4}}, Y: Field{[10]uint32{0x01e5c128, 0x03a4da4d, 0x032a7c69, 0x018f9fb1, 0x002659b7, 0x001d8ffd, 0x01eb3262, 0x00fbac7d, 0x0190c5f4, 0x0037ed17}}}, + {X: Field{[10]uint32{0x01322157, 0x03254625, 0x0262f19d, 0x011fcb20, 0x01f3a5fc, 0x03e3cbf4, 0x00b5e4ac, 0x01e225e1, 0x03913227, 0x0036ce43}}, Y: Field{[10]uint32{0x0290bbad, 0x01872b35, 0x02dc8d5d, 0x0302b7a0, 0x012aaeb5, 0x0298f6c6, 0x00fd7d4d, 0x020c7c25, 0x015b241c, 0x0010d925}}}, + {X: Field{[10]uint32{0x0391ebc8, 0x017501dc, 0x03c29e6e, 0x02980714, 0x00985732, 0x02ba3de3, 0x02a9e615, 0x0066b1f6, 0x0266e5fc, 0x000d3740}}, Y: Field{[10]uint32{0x01dd797b, 0x007a87f1, 0x02ddb661, 0x01ad148c, 0x0077a5db, 0x030ad22f, 0x0013b1d2, 0x03f80398, 0x02d80e73, 0x0030b5ad}}}, + {X: Field{[10]uint32{0x011772ab, 0x038f7c67, 0x004db336, 0x0314ca3e, 0x015e6c7e, 0x01b8bbe5, 0x01fcfbe1, 0x0182374f, 0x032b7e31, 0x003ba9fd}}, Y: Field{[10]uint32{0x014004bb, 0x0034c354, 0x029b88af, 0x015831af, 0x03172195, 0x00e6a9d1, 0x02a6d947, 0x02930d23, 0x00f1ccde, 0x002598b2}}}, + {X: Field{[10]uint32{0x00c391f2, 0x00f9e8e2, 0x007fc10d, 0x0190db64, 0x019376d2, 0x03a1584a, 0x01e412dd, 0x003ace4f, 0x007af1b1, 0x0031abc2}}, Y: Field{[10]uint32{0x00825144, 0x02d2b9d4, 0x00959eee, 0x0090b185, 0x01e5ff98, 0x033faae9, 0x018847a9, 0x01915e2b, 0x022e3185, 0x002ea675}}}, + {X: Field{[10]uint32{0x02ccefc7, 0x0132667f, 0x01518136, 0x02fd434d, 0x02aff37f, 0x032d0fd6, 0x033d034b, 0x015d02ad, 0x03356c71, 0x003ab8d1}}, Y: Field{[10]uint32{0x02fe4703, 0x03998e64, 0x01a9879f, 0x01b6d87f, 0x03968525, 0x02513dd2, 0x02f15d84, 0x03d91735, 0x0075da8b, 0x002e4e1b}}}, + {X: Field{[10]uint32{0x0340438f, 0x0093fdfe, 0x0046165c, 0x038c0764, 0x0241b68a, 0x01392589, 0x039a27e6, 0x023d5013, 0x00250f4d, 0x00129523}}, Y: Field{[10]uint32{0x016f6d10, 0x014bca06, 0x01578382, 0x00570a83, 0x014c2742, 0x038a698f, 0x01e40c67, 0x0233dbbd, 0x0085bd60, 0x002ba7cb}}}, + {X: Field{[10]uint32{0x00f744af, 0x02bcac3b, 0x01a53f43, 0x03678603, 0x03453318, 0x032cf02f, 0x019743d7, 0x0116a3a8, 0x0279dd65, 0x00186495}}, Y: Field{[10]uint32{0x03cb184d, 0x002913ca, 0x011a1726, 0x0075138f, 0x0347fc55, 0x00f92a87, 0x02c062ca, 0x014dcba7, 0x0184d721, 0x00281a0b}}}, + {X: Field{[10]uint32{0x0137ea2a, 0x03c05424, 0x004fe025, 0x02e14bfc, 0x0250267a, 0x01097bd8, 0x03a260d2, 0x02addb53, 0x02869574, 0x003876d7}}, Y: Field{[10]uint32{0x011905a8, 0x010f2054, 0x0277483f, 0x012fed25, 0x00836e20, 0x00318494, 0x01a99a1d, 0x03de8db0, 0x00219fd5, 0x00323abd}}}, + {X: Field{[10]uint32{0x0248c7f1, 0x027498f4, 0x004a7d2f, 0x02473f08, 0x0038e636, 0x007f613c, 0x00ab862a, 0x00e108a8, 0x03ca7392, 0x000c18b2}}, Y: Field{[10]uint32{0x019670cb, 0x03011ff7, 0x02b2cf55, 0x03c7327f, 0x00721a85, 0x038610c4, 0x0289eee1, 0x00a5c373, 0x02570e3f, 0x0023c44b}}}, + {X: Field{[10]uint32{0x01a4f739, 0x00500113, 0x00f4e4e8, 0x03ca5dd9, 0x039da74f, 0x02d4fe54, 0x007a861e, 0x00dbf3bb, 0x03ccaa97, 0x0019f0e4}}, Y: Field{[10]uint32{0x01853203, 0x011f1352, 0x013942d1, 0x03551b1f, 0x0033ac24, 0x03566d49, 0x00009d5a, 0x017f88be, 0x01d09a16, 0x0024f4ca}}}, + {X: Field{[10]uint32{0x0099bf5e, 0x00c213fa, 0x03728f94, 0x02c43a2e, 0x01ac5bc5, 0x0160731f, 0x01a5619d, 0x00861fb9, 0x01f236cf, 0x00319d1c}}, Y: Field{[10]uint32{0x01e2c513, 0x039a1223, 0x00aea62f, 0x00dfeda1, 0x003a533f, 0x0132ef32, 0x03c32477, 0x00c63650, 0x009c787b, 0x001d7243}}}, + {X: Field{[10]uint32{0x00ed1b52, 0x01fa62b9, 0x03070182, 0x03301951, 0x0112143a, 0x0096aab1, 0x033d7a40, 0x02376484, 0x03efd593, 0x00354057}}, Y: Field{[10]uint32{0x00f03d6b, 0x01b0975f, 0x0379f400, 0x0182de63, 0x00e99668, 0x00761177, 0x037c0d65, 0x00dbc570, 0x0216a022, 0x00110c15}}}, + {X: Field{[10]uint32{0x0164f2d2, 0x024a73a0, 0x003b73c1, 0x002473d4, 0x02243ca3, 0x0000bb66, 0x008ed564, 0x0258572d, 0x0365aaa8, 0x002baf2f}}, Y: Field{[10]uint32{0x00b3f019, 0x01f4dff9, 0x01ee535e, 0x015554e6, 0x02a6ee7f, 0x027223a1, 0x020305ba, 0x03b8ad08, 0x025d1a30, 0x0013f07c}}}, + {X: Field{[10]uint32{0x03b30e43, 0x03c03ffa, 0x00d8105e, 0x002ed4dc, 0x01bb8f98, 0x00ca8e74, 0x02d68219, 0x037bbd26, 0x02171727, 0x000572c5}}, Y: Field{[10]uint32{0x000ebd7a, 0x039f4afe, 0x02d93b1f, 0x01ad243a, 0x012dfff8, 0x01cd2cd3, 0x035c1b99, 0x0014ffb8, 0x008287fc, 0x00192b63}}}, + {X: Field{[10]uint32{0x0049c123, 0x000c2013, 0x026986bd, 0x008c18f8, 0x0119fb25, 0x00948468, 0x03b88a55, 0x0359d026, 0x009e8530, 0x00350108}}, Y: Field{[10]uint32{0x00a7a128, 0x03318890, 0x032c562b, 0x02fa28d0, 0x0046ef87, 0x02d68c9f, 0x01062753, 0x017467a1, 0x0168fdb8, 0x000dd8ff}}}, + {X: Field{[10]uint32{0x03ffdd96, 0x03a4e066, 0x02a4ed42, 0x025fd08a, 0x00d40b44, 0x030c9eb1, 0x02330c2f, 0x00a12563, 0x00cf0c23, 0x003ceafe}}, Y: Field{[10]uint32{0x015b0d5d, 0x0083a69f, 0x02061cc7, 0x03b1f33c, 0x01d1dfe9, 0x035e9d88, 0x01076432, 0x00c9f0fa, 0x0305d831, 0x00142187}}}, + {X: Field{[10]uint32{0x00874dea, 0x01ffdbdf, 0x03b4e57b, 0x011b0f92, 0x035cf92b, 0x0146e748, 0x004755a6, 0x036fecfe, 0x00932ee9, 0x001e28ca}}, Y: Field{[10]uint32{0x02c85895, 0x005fdae6, 0x02473b46, 0x02ca4b06, 0x01b3c36e, 0x0257aadf, 0x02ccd874, 0x0087d1ba, 0x003a9667, 0x002496de}}}, + {X: Field{[10]uint32{0x0350cd4a, 0x000c8269, 0x01e8df65, 0x0390fb55, 0x011b7d15, 0x01eed9e3, 0x001ed91a, 0x01be286b, 0x010f5d14, 0x00205948}}, Y: Field{[10]uint32{0x015d260d, 0x02e161e4, 0x0363a384, 0x019a87b6, 0x03859541, 0x00e5b1c4, 0x0145875e, 0x00af732f, 0x013a19e2, 0x003f8e43}}}, + {X: Field{[10]uint32{0x01fe3f09, 0x03295fdf, 0x032f3633, 0x007f3c01, 0x00ba7343, 0x00fbe866, 0x0317dd6f, 0x00f4d337, 0x01e86c2f, 0x001d49a7}}, Y: Field{[10]uint32{0x004805bd, 0x03454f9c, 0x020b1f5e, 0x027c77c6, 0x00f463f3, 0x017ba214, 0x006e3dbd, 0x009fb111, 0x025fd199, 0x002c58a9}}}, + {X: Field{[10]uint32{0x027145b0, 0x01394490, 0x02b38954, 0x02dea405, 0x03c520a7, 0x013ecbfd, 0x01c4e104, 0x0252796e, 0x028fb393, 0x00178db3}}, Y: Field{[10]uint32{0x0011614c, 0x0269381e, 0x03a4e7d3, 0x0170320a, 0x0022074c, 0x0152baa4, 0x01822ced, 0x025a9076, 0x0318292f, 0x001f1039}}}, + {X: Field{[10]uint32{0x02632746, 0x0302dac5, 0x03d25b05, 0x0181db69, 0x01c249d3, 0x02b260f9, 0x0176edc6, 0x02ff1b01, 0x0129fdeb, 0x0032331c}}, Y: Field{[10]uint32{0x00716fb1, 0x01d35e13, 0x01e68e46, 0x02bf53dd, 0x022653fb, 0x014e7fae, 0x011a332c, 0x011261db, 0x00e3a77e, 0x00122a33}}}, + {X: Field{[10]uint32{0x0246973f, 0x0303053a, 0x021dd2d6, 0x022dce0e, 0x03fa8579, 0x038f772b, 0x024d2a9a, 0x00f9b4e4, 0x0336f1ee, 0x0027f876}}, Y: Field{[10]uint32{0x0074f6d2, 0x039db38b, 0x0223e7c2, 0x03b2facc, 0x0343dc55, 0x00084ad8, 0x02d96588, 0x01170257, 0x02a86070, 0x00074d6d}}}, + {X: Field{[10]uint32{0x008ecda2, 0x01c4fd6f, 0x024657c9, 0x036f49b4, 0x01e23648, 0x030d449e, 0x019e02dd, 0x01d239b8, 0x038a3d45, 0x00132a2a}}, Y: Field{[10]uint32{0x023e73da, 0x02a68e53, 0x005cf164, 0x0236ec83, 0x0113b8a6, 0x0021db25, 0x03c9f23c, 0x036e489c, 0x02ad9bb7, 0x00229619}}}, + {X: Field{[10]uint32{0x032060c0, 0x01dbd62d, 0x017b13d3, 0x00607604, 0x03f1f308, 0x006c78a7, 0x01bc7242, 0x0227b173, 0x0150e4a9, 0x00032340}}, Y: Field{[10]uint32{0x0082ebd1, 0x018cd954, 0x0271749e, 0x00cb2c9b, 0x027ac4a7, 0x002c800c, 0x0242a9df, 0x00e9286b, 0x00a4c5a7, 0x00171620}}}, + {X: Field{[10]uint32{0x02f2aa31, 0x03868304, 0x03feafc1, 0x0113c4c2, 0x039e3684, 0x02072620, 0x03e1b7c9, 0x03f79927, 0x017bb4b9, 0x000f5855}}, Y: Field{[10]uint32{0x025b56f9, 0x021e64b7, 0x0228671c, 0x0254c63a, 0x021e2336, 0x01ac70df, 0x0160c90e, 0x02102cea, 0x03ff62cd, 0x0024cc59}}}, + {X: Field{[10]uint32{0x00e69e2a, 0x02bc5a49, 0x00552ccf, 0x03b72d89, 0x03feaada, 0x0170fb47, 0x0078dbb8, 0x0328256d, 0x039ffd44, 0x0019d5a7}}, Y: Field{[10]uint32{0x03eb7fcc, 0x006c9b59, 0x00102feb, 0x037abc3f, 0x03d16619, 0x02b7ec92, 0x01412887, 0x02f4b2aa, 0x0148230f, 0x0018aeca}}}, + {X: Field{[10]uint32{0x0372fbc2, 0x02dd4f9c, 0x01af70f3, 0x0340f3c3, 0x006e3075, 0x0319b6aa, 0x037d2792, 0x0050043a, 0x013edebf, 0x0018c4f4}}, Y: Field{[10]uint32{0x03573ef3, 0x0389ab74, 0x039c2f65, 0x01d2fabf, 0x032839f8, 0x00f81b8b, 0x01754556, 0x0049161a, 0x023050eb, 0x00111884}}}, + {X: Field{[10]uint32{0x01d23968, 0x03f78913, 0x031955e2, 0x03c857c4, 0x03088529, 0x01f1b2ca, 0x023085b4, 0x01ba3343, 0x01e7fbbe, 0x001be3b2}}, Y: Field{[10]uint32{0x0136cd79, 0x0031dbfb, 0x0078dc51, 0x002a0c07, 0x0323e195, 0x0311bbba, 0x003b215d, 0x00febad5, 0x0214523b, 0x0007ed87}}}, + {X: Field{[10]uint32{0x010b7f6c, 0x0301519c, 0x022447be, 0x01638380, 0x0336f0ae, 0x020e6d30, 0x01a0ec2f, 0x0286b2f6, 0x01ac3c5a, 0x0015984f}}, Y: Field{[10]uint32{0x02ca79e8, 0x01ceaa63, 0x0316cf7b, 0x02f775fd, 0x03530908, 0x010d2be2, 0x03233194, 0x0263e40e, 0x03ab86c3, 0x00091c98}}}, + {X: Field{[10]uint32{0x03aee08c, 0x02cf0861, 0x01da041e, 0x02c1a167, 0x0217e91a, 0x0169f775, 0x03e6e57c, 0x01c8644d, 0x01e7b414, 0x00327785}}, Y: Field{[10]uint32{0x038b0009, 0x03eff10f, 0x0370fd8f, 0x02c7d792, 0x0040cc5d, 0x00556473, 0x0111c877, 0x015b437f, 0x02a5cfa0, 0x0031c5e3}}}, + {X: Field{[10]uint32{0x016c0504, 0x01aeff7d, 0x01c48a8b, 0x00b74b77, 0x02f90618, 0x02f9925e, 0x02a4b0f6, 0x017a4390, 0x024a627d, 0x0001d642}}, Y: Field{[10]uint32{0x02c38587, 0x00f38aa9, 0x029f81f9, 0x01d4d4ed, 0x00cc5bd8, 0x02a9192f, 0x017e878b, 0x021d8172, 0x021ab549, 0x00358478}}}, + {X: Field{[10]uint32{0x03e19d6a, 0x025e421f, 0x0173b760, 0x0176fcf2, 0x021fcc55, 0x0076ccd8, 0x00dff728, 0x03815b6c, 0x020fb310, 0x00252c76}}, Y: Field{[10]uint32{0x014fc217, 0x021b78ff, 0x01159852, 0x02723cbf, 0x0045c42e, 0x0392e54f, 0x03a2ab4a, 0x0069580c, 0x013dd5b4, 0x0020c622}}}, + {X: Field{[10]uint32{0x00c9a6cb, 0x039b54a1, 0x011a5f20, 0x0084e385, 0x02d6f8f8, 0x02bb0b3e, 0x007d081d, 0x033bc438, 0x0299bcda, 0x002d6bd0}}, Y: Field{[10]uint32{0x0395448d, 0x0091e6ea, 0x00b2043b, 0x03f42bb7, 0x01c8cf65, 0x004df702, 0x032987eb, 0x02e0b7d5, 0x00078a7d, 0x00302611}}}, + {X: Field{[10]uint32{0x0139c3e3, 0x01da11da, 0x03b0c3c4, 0x01066226, 0x03f8ef61, 0x021460a6, 0x000a153c, 0x01161ce6, 0x01437074, 0x0017d26b}}, Y: Field{[10]uint32{0x007e04eb, 0x0346001d, 0x020f7d01, 0x0251172b, 0x022ae25c, 0x0103f092, 0x0208ae1b, 0x01b0f42e, 0x038520f5, 0x00171034}}}, + {X: Field{[10]uint32{0x007da385, 0x0386e792, 0x01c645cd, 0x02fc9bb2, 0x0216bea3, 0x01a24e50, 0x0230d1ae, 0x03047193, 0x027f88cc, 0x003daec1}}, Y: Field{[10]uint32{0x00288f55, 0x03b5c85e, 0x004fead4, 0x0367cafd, 0x0328dbfd, 0x037792a0, 0x01d4ec8a, 0x025e3362, 0x036d7268, 0x000c5691}}}, + {X: Field{[10]uint32{0x01df6950, 0x03b4affe, 0x03f10bee, 0x0124112c, 0x0152690b, 0x03000115, 0x01aea0ee, 0x00678253, 0x02dec02b, 0x001ed1f3}}, Y: Field{[10]uint32{0x00efe9a6, 0x03b64ef8, 0x01330280, 0x03603084, 0x0353b7cc, 0x015e462b, 0x03ac5a79, 0x037b25ba, 0x01f49bee, 0x0006f369}}}, + {X: Field{[10]uint32{0x0140876d, 0x03f59826, 0x01035a78, 0x0087000a, 0x01182236, 0x035c3d4b, 0x025e1ab2, 0x015b67ad, 0x03f3082d, 0x002e9a75}}, Y: Field{[10]uint32{0x035d393d, 0x01b447e5, 0x02c7684b, 0x00d6b86b, 0x001d1cf9, 0x003b894e, 0x036bdb95, 0x00a2703c, 0x02fd56d5, 0x0017d128}}}, + {X: Field{[10]uint32{0x03d929ff, 0x037f6e5e, 0x0347d1d3, 0x017e5d0c, 0x01fe7ec3, 0x00cc2e8e, 0x03713bf0, 0x03065488, 0x0094d226, 0x0028edc2}}, Y: Field{[10]uint32{0x02ae6135, 0x03013355, 0x00aa593c, 0x00b082ec, 0x01495edf, 0x02ace51e, 0x01ad2e10, 0x016a80d5, 0x03df4275, 0x00017432}}}, + {X: Field{[10]uint32{0x01c804e5, 0x0368df74, 0x0384f0e8, 0x02cd1233, 0x025ae602, 0x003aceff, 0x03e73b52, 0x0207f647, 0x023ebb2d, 0x0031d5b8}}, Y: Field{[10]uint32{0x00df49ff, 0x0044840d, 0x035f8985, 0x02a753ec, 0x025a4fab, 0x02192a60, 0x01f52b29, 0x01ae6f2a, 0x02faedf8, 0x00227d2d}}}, + {X: Field{[10]uint32{0x0271822c, 0x00bba10d, 0x02a00d17, 0x0271b37e, 0x0065410e, 0x030e4127, 0x011c2341, 0x0252afde, 0x00356fab, 0x000d8c9f}}, Y: Field{[10]uint32{0x03ed4c6d, 0x034187f4, 0x0127abe7, 0x00c63096, 0x01eb7456, 0x0253dc0e, 0x0201f04e, 0x0234d7c3, 0x00a4698c, 0x003f8d62}}}, + {X: Field{[10]uint32{0x03dd21bb, 0x0278418d, 0x00c32118, 0x02c61d2c, 0x00b66051, 0x017acabd, 0x02ecf6fc, 0x008c47d1, 0x03be8e37, 0x000edd6f}}, Y: Field{[10]uint32{0x02879908, 0x002a8a56, 0x03c2aea5, 0x02575f46, 0x022e42a0, 0x01e502d3, 0x015e2488, 0x00ce6916, 0x0233e3c3, 0x002e4512}}}, + {X: Field{[10]uint32{0x00d3c5e2, 0x029fdd7c, 0x017b4d92, 0x02f4de6a, 0x035f0272, 0x03e3d11d, 0x015ed721, 0x03a22831, 0x031057b4, 0x00112987}}, Y: Field{[10]uint32{0x02d80141, 0x03785120, 0x00086111, 0x0019b705, 0x02181623, 0x016de4e4, 0x016ec1f0, 0x0011925c, 0x02658034, 0x003a1c3a}}}, + {X: Field{[10]uint32{0x0097fefd, 0x026889c0, 0x00acb74c, 0x039b28a5, 0x011ebed2, 0x03a481bb, 0x00c6fe5c, 0x00f02809, 0x02f70066, 0x00046b80}}, Y: Field{[10]uint32{0x03d6a36f, 0x01f4a337, 0x0024bd69, 0x019a5039, 0x01a4e357, 0x01c108b3, 0x008737ae, 0x03ecc140, 0x0387a262, 0x0018d686}}}, + {X: Field{[10]uint32{0x02142f5c, 0x0021728f, 0x01981069, 0x03c84175, 0x008e987a, 0x02cc6cdf, 0x02ab1b0a, 0x017450b9, 0x010adfb2, 0x0031d44c}}, Y: Field{[10]uint32{0x02821014, 0x0250eebb, 0x018864df, 0x00752f30, 0x02ccca85, 0x039a1716, 0x00485a4b, 0x005ea7c4, 0x01d8ed27, 0x002918c3}}}, + {X: Field{[10]uint32{0x03efe46a, 0x02f76dfb, 0x02f7f790, 0x00ac3856, 0x00a639b7, 0x03ac94db, 0x0357b173, 0x03ce7105, 0x03c64009, 0x003ffd35}}, Y: Field{[10]uint32{0x025080e5, 0x01d91433, 0x02dc6e89, 0x01af6b5f, 0x014c110d, 0x024a92ec, 0x030697a2, 0x008b4440, 0x018e0ffe, 0x001a529e}}}, + {X: Field{[10]uint32{0x03f90534, 0x03233a70, 0x00d18c06, 0x0068c495, 0x0300932b, 0x03350dc1, 0x031e8bc1, 0x027d1ba4, 0x0239c13c, 0x001f5dba}}, Y: Field{[10]uint32{0x03e415bb, 0x00727fa2, 0x026d4d2a, 0x022ce696, 0x024cee43, 0x01163245, 0x007cf7c3, 0x00f63cd3, 0x02ba8f0a, 0x002f052c}}}, + {X: Field{[10]uint32{0x0207ad39, 0x00c3a557, 0x037e8a67, 0x017a097d, 0x01625fda, 0x00c2aaab, 0x00807075, 0x0393cdbc, 0x02d2ca6a, 0x002dbbf2}}, Y: Field{[10]uint32{0x01b1c765, 0x00864e6f, 0x005f00a4, 0x00687d90, 0x02469430, 0x00fa9ab5, 0x036f4a32, 0x034c9c0f, 0x00ef8a56, 0x00121a36}}}, + {X: Field{[10]uint32{0x0233a32e, 0x032a9b8d, 0x02b4ae30, 0x02ab034a, 0x0348e38f, 0x01d501b4, 0x03f9050e, 0x03129b4d, 0x012aa889, 0x0006812c}}, Y: Field{[10]uint32{0x0075911d, 0x01baf237, 0x02966c24, 0x0005ebe1, 0x0221e1c8, 0x039fa827, 0x0017dca3, 0x023641b2, 0x008ffad3, 0x003d0e83}}}, + {X: Field{[10]uint32{0x03209b7e, 0x02ab5460, 0x02a6c531, 0x00016935, 0x03b70e25, 0x0323b777, 0x0078b126, 0x0146413a, 0x00fe9b34, 0x002b6bac}}, Y: Field{[10]uint32{0x037522ad, 0x032c0e74, 0x03173f33, 0x03bf19e4, 0x02b1c59d, 0x02639bb7, 0x00c6b4e1, 0x00a69c23, 0x016ddd4d, 0x000ac9ac}}}, + {X: Field{[10]uint32{0x006e0679, 0x013ae20b, 0x010d19a9, 0x00961183, 0x00d97fa1, 0x0358c9d9, 0x012121d2, 0x03cff2d4, 0x02023931, 0x00013932}}, Y: Field{[10]uint32{0x00537467, 0x0208b461, 0x00348515, 0x005fc965, 0x02cc917b, 0x00a3accc, 0x00c68609, 0x029b2515, 0x02cd3704, 0x003be43b}}}, + {X: Field{[10]uint32{0x011e2971, 0x030821f0, 0x02a220a7, 0x02b2b700, 0x035654ec, 0x00e7d80e, 0x01b5ee41, 0x0304e9c4, 0x0279df69, 0x00287cf0}}, Y: Field{[10]uint32{0x02a16b2d, 0x0148eb6d, 0x023b2252, 0x035ea2a4, 0x02e8aafa, 0x03bf88c9, 0x03699165, 0x01e375fb, 0x039454cb, 0x0015c925}}}, + {X: Field{[10]uint32{0x0398c7a5, 0x004f8339, 0x003c4f4b, 0x0321a9a4, 0x03c19424, 0x03259d7f, 0x030c911b, 0x01a39bd2, 0x03814886, 0x002ab1db}}, Y: Field{[10]uint32{0x00dd2978, 0x029cb461, 0x03189588, 0x00dbac9d, 0x02c37595, 0x00d826f0, 0x011df3f7, 0x01f5b04e, 0x02dfdd6c, 0x00092b85}}}, + {X: Field{[10]uint32{0x00034769, 0x036dc074, 0x030a2a5b, 0x025a8578, 0x010ddce4, 0x012639b2, 0x03601666, 0x008bc378, 0x0171e596, 0x001c3a50}}, Y: Field{[10]uint32{0x0103b757, 0x0113c684, 0x0257d5e2, 0x02ef3d1a, 0x02446111, 0x00803e4a, 0x004d4e80, 0x032fbcae, 0x00a775a9, 0x0035b5f0}}}, + {X: Field{[10]uint32{0x02c78890, 0x023825a3, 0x002b6f28, 0x01ad6e0a, 0x03342670, 0x01aac711, 0x02fa849c, 0x01124925, 0x01e711d4, 0x003285f9}}, Y: Field{[10]uint32{0x03ce2c2e, 0x00bcfa22, 0x034105e3, 0x03b938a0, 0x00e6c58f, 0x005f4cb3, 0x039f501e, 0x01dee376, 0x02322ce5, 0x002cf775}}}, + {X: Field{[10]uint32{0x03aa62e8, 0x018c928b, 0x025717ec, 0x0006357f, 0x00255ec0, 0x0290eae7, 0x000700f3, 0x03f7a1ab, 0x018d8d70, 0x000685a9}}, Y: Field{[10]uint32{0x02710c27, 0x003ac746, 0x017e116c, 0x03cde8e2, 0x00dc2eb6, 0x015f074c, 0x03bc1372, 0x03c28f75, 0x02ba65af, 0x003cb2cb}}}, + {X: Field{[10]uint32{0x00b9d4f2, 0x02438ca5, 0x0301e981, 0x01eb8f97, 0x012dd335, 0x02acab04, 0x01c6bbf5, 0x037c430a, 0x02650b4d, 0x0023cb77}}, Y: Field{[10]uint32{0x034c6afb, 0x024ff937, 0x01f5d804, 0x016f4c9e, 0x0179df33, 0x01647df3, 0x02954bd8, 0x00db5413, 0x00f7e5a7, 0x00381ae3}}}, + {X: Field{[10]uint32{0x00950162, 0x0376a401, 0x018c5a3a, 0x0215b223, 0x00ba1d72, 0x0336cd59, 0x014562e0, 0x00f9f203, 0x0153f821, 0x000cc52d}}, Y: Field{[10]uint32{0x0043532d, 0x02a87e7f, 0x00c24fc4, 0x018804eb, 0x02b4dab4, 0x00f2b547, 0x00a7434e, 0x031543e5, 0x005ee3f7, 0x000cfa0f}}}, + {X: Field{[10]uint32{0x01304000, 0x00f16e89, 0x026062af, 0x0153b8ad, 0x03fa5895, 0x01229f30, 0x01b11a33, 0x0030bff1, 0x02f465ac, 0x001f041f}}, Y: Field{[10]uint32{0x035702c5, 0x0398fba5, 0x0124b508, 0x01e708fc, 0x0289b5a9, 0x015b4d97, 0x027fe78e, 0x001c1741, 0x03122e8a, 0x001ad6f3}}}, + {X: Field{[10]uint32{0x03e4f8b3, 0x01a95296, 0x00cb97b7, 0x0014dac8, 0x0019be46, 0x01565b42, 0x01e257ee, 0x037d9d44, 0x0029325a, 0x003a462a}}, Y: Field{[10]uint32{0x032fa8ae, 0x032481f3, 0x00ebfa9d, 0x03bc0ffc, 0x01b70af0, 0x00846705, 0x03a8f0d1, 0x014b0f86, 0x00a0b461, 0x0006a4bc}}}, + {X: Field{[10]uint32{0x01b9b079, 0x032533d0, 0x015d1e3f, 0x01f4b3a8, 0x01c346c9, 0x038c2720, 0x02dd2e3b, 0x0292e7a4, 0x0203d4f3, 0x0021dc36}}, Y: Field{[10]uint32{0x03123c03, 0x03a10b6a, 0x0005a10c, 0x01847ed4, 0x0053f964, 0x013d5feb, 0x01372fe6, 0x00f55c63, 0x030fdc63, 0x00340950}}}, + {X: Field{[10]uint32{0x00d8b22b, 0x012ab56b, 0x03ea1731, 0x01c318a0, 0x01a6589f, 0x02ef00e7, 0x026a57f6, 0x00955ec4, 0x013fae2b, 0x0031ad2b}}, Y: Field{[10]uint32{0x00d29bfe, 0x006bfeb6, 0x036fb46e, 0x023b3cf1, 0x0385f288, 0x01270e37, 0x01f278de, 0x00d048d7, 0x01cd2c1c, 0x003a148f}}}, + {X: Field{[10]uint32{0x03a86e14, 0x0232dc0d, 0x039689c8, 0x006c786a, 0x01462274, 0x03e1c586, 0x03b1e91f, 0x03e610dc, 0x01486ffb, 0x0026b3b6}}, Y: Field{[10]uint32{0x00b352d9, 0x01fd6482, 0x012cde8e, 0x03b29aa1, 0x0316e1e7, 0x02527074, 0x003cc321, 0x00c77ffd, 0x031f1b4c, 0x0035e9fa}}}, + {X: Field{[10]uint32{0x039007f3, 0x0153d7c6, 0x0322b87c, 0x015780e2, 0x01b08bf0, 0x03a2b29a, 0x034015b1, 0x036ad313, 0x036ffccb, 0x002bd454}}, Y: Field{[10]uint32{0x03130f7b, 0x03e12791, 0x027ef00c, 0x02ddc0e8, 0x00cbe813, 0x02ec74c2, 0x03fa85ba, 0x01fb3d27, 0x034c95c0, 0x002daec2}}}, + {X: Field{[10]uint32{0x01823ce2, 0x00bb94c4, 0x00c3e5bb, 0x03e8608e, 0x0156e02f, 0x01707249, 0x0045a092, 0x02aed5bf, 0x02df3ea0, 0x003b14c1}}, Y: Field{[10]uint32{0x01ee8b99, 0x004a100b, 0x009f6898, 0x02ff6507, 0x009457f4, 0x00f242f6, 0x00653524, 0x0197d060, 0x01b6720f, 0x00325433}}}, + {X: Field{[10]uint32{0x032d90a0, 0x0366ebb9, 0x00d876c5, 0x02320779, 0x03587f46, 0x024590d8, 0x0397ecd5, 0x01ef1868, 0x00a5be12, 0x000a4ec7}}, Y: Field{[10]uint32{0x0235d821, 0x01bdd36e, 0x0261bae2, 0x0090f463, 0x010443a5, 0x01d9218f, 0x03d81d91, 0x027c17a4, 0x030f238e, 0x00120840}}}, + {X: Field{[10]uint32{0x00865488, 0x007d21ad, 0x003c1256, 0x01088bbe, 0x00168771, 0x01a2ff04, 0x0151f0ee, 0x01aadaca, 0x037d9987, 0x003af952}}, Y: Field{[10]uint32{0x01381c07, 0x01bbae1b, 0x03c47924, 0x02835206, 0x0158d84f, 0x02090bd4, 0x0299d91b, 0x0200bfe9, 0x011ccaf8, 0x000a8759}}}, + {X: Field{[10]uint32{0x0064acdc, 0x03671a4d, 0x019dfd38, 0x00951174, 0x0133ac83, 0x00a74366, 0x0220109b, 0x035a6fb4, 0x01233ab0, 0x00223ddd}}, Y: Field{[10]uint32{0x03276702, 0x00a0b2f2, 0x00d5b79a, 0x01651670, 0x038e0590, 0x03b1afaf, 0x02a2cb1a, 0x017bd4c7, 0x0122fbd9, 0x0023e454}}}, + {X: Field{[10]uint32{0x02b3bb01, 0x005cd668, 0x0039fb81, 0x02e5ba51, 0x03c7fa40, 0x03afa5e5, 0x036cfa08, 0x00376276, 0x013de721, 0x0007611d}}, Y: Field{[10]uint32{0x01f41ad6, 0x029e187c, 0x0260dabf, 0x00ce7cd0, 0x012e889c, 0x01503121, 0x000b6d6f, 0x029361d1, 0x035aba53, 0x003dcd82}}}, + {X: Field{[10]uint32{0x011d4b2f, 0x033bed4c, 0x01e1c27f, 0x00f979d0, 0x0336f82a, 0x02ce2338, 0x01ae032c, 0x020b073c, 0x01f5176f, 0x000679a7}}, Y: Field{[10]uint32{0x03d5c143, 0x016ee9b2, 0x016e00b9, 0x02bd6ed2, 0x0309d9f7, 0x030745ec, 0x0175dc8c, 0x014efaf8, 0x00fec9ba, 0x0031007d}}}, + {X: Field{[10]uint32{0x02e3f2c9, 0x00d5332b, 0x0372953d, 0x01790ab7, 0x0119b04f, 0x01fca6a9, 0x01a93995, 0x0097ff7c, 0x0202c1f1, 0x001cc627}}, Y: Field{[10]uint32{0x0137f704, 0x00270069, 0x01424010, 0x00710407, 0x00d901de, 0x0390180e, 0x01d21b01, 0x01f3e188, 0x008f1c6e, 0x0014ae3a}}}, + {X: Field{[10]uint32{0x0087a74f, 0x0095ba4a, 0x0366901c, 0x02c296b9, 0x03278fd2, 0x01d1fc74, 0x038956cb, 0x02a2fd4b, 0x00828ff1, 0x00317af8}}, Y: Field{[10]uint32{0x01259860, 0x03c736f3, 0x033823ef, 0x0075b026, 0x02c506e5, 0x035cdad7, 0x0397dc92, 0x012e606a, 0x00b962e7, 0x00033963}}}, + {X: Field{[10]uint32{0x0182da76, 0x02815892, 0x01166435, 0x019f20ee, 0x011a7808, 0x02f220f5, 0x016feed3, 0x0038050a, 0x0221f799, 0x001e0f05}}, Y: Field{[10]uint32{0x0236da30, 0x0158f862, 0x03bc622f, 0x01d2f57f, 0x01f52245, 0x03ae0067, 0x0165c3e8, 0x02271a71, 0x03e2c9a1, 0x0000dc2c}}}, + {X: Field{[10]uint32{0x022b3305, 0x0267dbfe, 0x015794d7, 0x032cb1c7, 0x01fad66f, 0x0294dc87, 0x024cbd64, 0x01a9185c, 0x02800ccc, 0x0015579f}}, Y: Field{[10]uint32{0x004e9e41, 0x036980fd, 0x030eb63b, 0x00242cc9, 0x02db9b48, 0x023f9b75, 0x035ed312, 0x01c10863, 0x0165d39d, 0x0019eefc}}}, + {X: Field{[10]uint32{0x00243471, 0x0084e950, 0x0150a4b0, 0x02932b37, 0x030faa40, 0x010b1ac6, 0x028467e2, 0x0351b3c7, 0x0226ab1c, 0x00103126}}, Y: Field{[10]uint32{0x03dadf86, 0x0204fd8b, 0x0296bdc2, 0x00c19fd3, 0x03ad55bf, 0x00d08930, 0x039fdb4c, 0x0188bf82, 0x03005002, 0x0005a542}}}, + {X: Field{[10]uint32{0x03935298, 0x02d8bdb5, 0x021627c8, 0x009835df, 0x02473062, 0x0164f1d1, 0x0010b9f5, 0x02346272, 0x03e5db09, 0x003adace}}, Y: Field{[10]uint32{0x015c5bc8, 0x01d3c380, 0x022fb9bd, 0x01c512f8, 0x00c84e96, 0x00073b72, 0x01902317, 0x01bd707e, 0x01843f35, 0x000f4a55}}}, + {X: Field{[10]uint32{0x02b26091, 0x019c3397, 0x03ca903f, 0x00da6813, 0x03a06835, 0x034186d4, 0x020a0734, 0x0305a472, 0x00a42b55, 0x0005dc86}}, Y: Field{[10]uint32{0x03a5fa42, 0x02da432c, 0x00f4eced, 0x01c9d67c, 0x02057e0e, 0x017a2e5e, 0x017f243e, 0x02f1cddc, 0x021aa8a3, 0x00258459}}}, + {X: Field{[10]uint32{0x03d2a680, 0x020e99e3, 0x02be37f8, 0x018a2c1f, 0x02ea0c37, 0x009f099e, 0x0028c001, 0x017e29f4, 0x03a2f3bc, 0x002106a3}}, Y: Field{[10]uint32{0x012cf1b0, 0x00b53cd1, 0x0289d9a4, 0x02313e6e, 0x00052693, 0x0236ef73, 0x00577128, 0x007dde80, 0x037db2fd, 0x0015e6fc}}}, + {X: Field{[10]uint32{0x02dea82d, 0x0142985b, 0x01691322, 0x02735f94, 0x00358578, 0x00e6714f, 0x001421da, 0x01fc7b20, 0x01543a37, 0x002c07bd}}, Y: Field{[10]uint32{0x01a90265, 0x000802c9, 0x009eb962, 0x0347998e, 0x0082e119, 0x01e8dfc5, 0x03626a00, 0x02cbc4eb, 0x00e97e29, 0x000a3cc3}}}, + {X: Field{[10]uint32{0x00f38904, 0x006c2b01, 0x029a6259, 0x01f02ce2, 0x00ba344e, 0x03e32646, 0x02e70d6e, 0x03190c5f, 0x014e8e3c, 0x002e4f80}}, Y: Field{[10]uint32{0x000ac3d3, 0x027f2549, 0x001f72b2, 0x03b702b8, 0x00d0b368, 0x00bfe26d, 0x03152e10, 0x034431af, 0x01855bdf, 0x00004a70}}}, + {X: Field{[10]uint32{0x03acd522, 0x02fd5201, 0x0137305f, 0x031a2b20, 0x01a00601, 0x01b58c62, 0x000a1dd2, 0x00366bfe, 0x02f243c5, 0x00383d09}}, Y: Field{[10]uint32{0x02b749fc, 0x0035c177, 0x02d1e143, 0x00abac92, 0x021c1938, 0x033ce70a, 0x00bd848c, 0x037178c1, 0x03e0951a, 0x0025b620}}}, + {X: Field{[10]uint32{0x0073233c, 0x03aa6de7, 0x03df2147, 0x0052ceee, 0x00d5379f, 0x00ee7b01, 0x030adda6, 0x025eb4a1, 0x007440e8, 0x003847a7}}, Y: Field{[10]uint32{0x01c1f019, 0x03c2881b, 0x016c5cb9, 0x013767cf, 0x01e125e3, 0x0388b8d6, 0x01a9df03, 0x01d4c8fd, 0x014b2919, 0x001275b9}}}, + {X: Field{[10]uint32{0x016b2c2b, 0x03d9e9ea, 0x0191c79c, 0x01c26b11, 0x02ae38ee, 0x00009f30, 0x0396eca2, 0x03c514ed, 0x004b0c5e, 0x00246b56}}, Y: Field{[10]uint32{0x030bac2a, 0x030729d4, 0x001e23e9, 0x025fb3a1, 0x01565dfd, 0x017670f1, 0x0379e5db, 0x0314c447, 0x0213a620, 0x00360568}}}, + {X: Field{[10]uint32{0x0299f8d2, 0x01011850, 0x033dabfe, 0x00708c0f, 0x01103297, 0x02cc8bcd, 0x0013785c, 0x00d3c81d, 0x0392f4fa, 0x000f9c94}}, Y: Field{[10]uint32{0x0308ae85, 0x0088f95d, 0x0039e042, 0x015de256, 0x014e0c1d, 0x0241fbe9, 0x01482176, 0x03bb57cd, 0x02515add, 0x00238c8e}}}, + {X: Field{[10]uint32{0x01a98160, 0x03d5e411, 0x039bced4, 0x026e6808, 0x0191d911, 0x02a18fcd, 0x03c00acf, 0x0226ad20, 0x02c201a5, 0x0017a1ef}}, Y: Field{[10]uint32{0x02e7d47b, 0x009408fc, 0x032633a8, 0x00734335, 0x0233625f, 0x03f0e69b, 0x02f3c159, 0x01707e7a, 0x038433c7, 0x002a228e}}}, + {X: Field{[10]uint32{0x0268a0ed, 0x03e87234, 0x00f32489, 0x003b494b, 0x01da1826, 0x013a6642, 0x01cb6524, 0x00ecd5d2, 0x02132cb9, 0x0030b821}}, Y: Field{[10]uint32{0x008a5761, 0x00360aa3, 0x007644ed, 0x01934169, 0x0328e02e, 0x015381dc, 0x03038d68, 0x00d97751, 0x03ad1f16, 0x0034fcb8}}}, + {X: Field{[10]uint32{0x031978af, 0x005ee9c3, 0x0025c745, 0x034392e4, 0x023b9053, 0x0077650c, 0x02193c23, 0x0261a5ec, 0x005eccf0, 0x00264c13}}, Y: Field{[10]uint32{0x009dc789, 0x00066a88, 0x02111338, 0x03cc7836, 0x00ba1324, 0x00f74128, 0x03e77e34, 0x004e59bd, 0x027b638b, 0x003b9dfe}}}, + {X: Field{[10]uint32{0x00c5c6bc, 0x004c8aad, 0x02b1d1c2, 0x000d9435, 0x0325a79f, 0x027be256, 0x01f04f70, 0x03ecdd94, 0x00c559ad, 0x00103842}}, Y: Field{[10]uint32{0x039db653, 0x039192d9, 0x02b2cfc5, 0x02ae8253, 0x00210eb2, 0x011ffbd1, 0x02ff3f8c, 0x03992212, 0x03385733, 0x0022602a}}}, + {X: Field{[10]uint32{0x00c6a78a, 0x03ab3722, 0x01aca5bb, 0x037725c4, 0x006d6276, 0x03d4237d, 0x00315287, 0x001c8483, 0x02572d19, 0x00263220}}, Y: Field{[10]uint32{0x01a61c92, 0x0399dad0, 0x03256f3e, 0x003b8230, 0x00b57f27, 0x0341443a, 0x02ea7f48, 0x017fef44, 0x01761f5c, 0x001746aa}}}, + {X: Field{[10]uint32{0x00af6fed, 0x036ac818, 0x03740c05, 0x002601bf, 0x02d7b4cf, 0x005b0deb, 0x00eeab7a, 0x008c1ae1, 0x027a25e9, 0x000e26ae}}, Y: Field{[10]uint32{0x0065707e, 0x003b3db4, 0x01c13d6f, 0x00dcd7d8, 0x0049c326, 0x004aca64, 0x032ed608, 0x038ba34d, 0x00c9ec48, 0x0019ceac}}}, + {X: Field{[10]uint32{0x0253df17, 0x014fbab2, 0x03732614, 0x02ab94e6, 0x026619ea, 0x017c46ce, 0x02fda62e, 0x0255ba4f, 0x03ba832c, 0x00277193}}, Y: Field{[10]uint32{0x005990ac, 0x02ebf6bd, 0x0089f956, 0x0326520e, 0x038f60a9, 0x0228d63b, 0x0267ad8d, 0x02ac4290, 0x00a93c56, 0x000602ce}}}, + {X: Field{[10]uint32{0x024921f7, 0x0270557f, 0x008a9675, 0x00334f54, 0x03b3439b, 0x02d9c1ea, 0x003528b8, 0x030b0d88, 0x0218e758, 0x001c4463}}, Y: Field{[10]uint32{0x02104ee0, 0x01e78a2a, 0x0000b5ec, 0x03df8732, 0x0176bf22, 0x0046d4b4, 0x0108719f, 0x013a7192, 0x02f12c1b, 0x0030bd86}}}, + {X: Field{[10]uint32{0x02c3d096, 0x02ecaa0f, 0x0224245c, 0x008d94c6, 0x0146218b, 0x02b717f4, 0x00e09909, 0x03cf1249, 0x01ee11b9, 0x000cef3b}}, Y: Field{[10]uint32{0x00fbad0a, 0x0015f56b, 0x03e9d655, 0x023578c5, 0x03f83b3e, 0x011a53f6, 0x01a71f6f, 0x0319ce50, 0x011a6c22, 0x00057d2f}}}, + {X: Field{[10]uint32{0x0213ccb4, 0x02c83713, 0x031d0e66, 0x0101d661, 0x01fbd977, 0x00bf6e95, 0x021e5cb6, 0x03a7c7c5, 0x033a4ab5, 0x0012d666}}, Y: Field{[10]uint32{0x023fb523, 0x020a6752, 0x034232b1, 0x0268b1b7, 0x006c9601, 0x02cd0851, 0x03064119, 0x009cae2d, 0x01da9035, 0x0018d40e}}}, + {X: Field{[10]uint32{0x01269d10, 0x010d96c8, 0x03627569, 0x0368d7a5, 0x02decb8d, 0x0144d809, 0x038f6429, 0x0132a506, 0x034cdae5, 0x00067daf}}, Y: Field{[10]uint32{0x033c95d7, 0x024b1933, 0x03f3da1c, 0x01ad8274, 0x036cb31a, 0x02c9d40b, 0x00bca48d, 0x001b7099, 0x03dc090b, 0x0028930f}}}, + {X: Field{[10]uint32{0x0301314c, 0x03751bc6, 0x0267a058, 0x01d6c5de, 0x028a2708, 0x02b41ceb, 0x0229adf7, 0x034537d9, 0x01a98027, 0x002f0f7c}}, Y: Field{[10]uint32{0x008d1f76, 0x02cc2ae0, 0x005e7b6b, 0x0195dc1d, 0x01934450, 0x03645462, 0x0233e898, 0x00741cbb, 0x029154f5, 0x0026774e}}}, + {X: Field{[10]uint32{0x01d72c3c, 0x012a795f, 0x0285e1ea, 0x00793768, 0x02c34ef3, 0x0306b97d, 0x025f5b5a, 0x01c3a134, 0x0264521a, 0x0025de90}}, Y: Field{[10]uint32{0x039f5a0c, 0x03a6ca8a, 0x0041b4fc, 0x01a0cb87, 0x01dbf44f, 0x03500ff2, 0x0025b61c, 0x00bf9341, 0x00197aab, 0x003c6ff2}}}, + {X: Field{[10]uint32{0x01c9b339, 0x004b1a43, 0x01b47a1c, 0x0044f89c, 0x00098b26, 0x02b71ec7, 0x014a7f58, 0x01694cfb, 0x024a85fc, 0x0017f7f7}}, Y: Field{[10]uint32{0x02c6555a, 0x0113d245, 0x02b1ce97, 0x0222cbdb, 0x01731c25, 0x01bec92e, 0x011bad52, 0x02539825, 0x03afbd6a, 0x000fb7ca}}}, + {X: Field{[10]uint32{0x01e9c50d, 0x000508fa, 0x007476ce, 0x02fe089a, 0x00afc17a, 0x03edf6e3, 0x02c1ac50, 0x022bf3ba, 0x032cdcd2, 0x002e2f35}}, Y: Field{[10]uint32{0x03c55e9d, 0x01144940, 0x026dbf2c, 0x038da9d5, 0x039cb6d0, 0x01dc694f, 0x03d9f2f3, 0x03015e6e, 0x03c52e6d, 0x0002098c}}}, + {X: Field{[10]uint32{0x01f75c77, 0x02290700, 0x01c728be, 0x03a769cd, 0x01721bc2, 0x03a51959, 0x01d01eb6, 0x030def19, 0x0199133b, 0x001b082e}}, Y: Field{[10]uint32{0x00b71e53, 0x037c4550, 0x03f20cf6, 0x0129e717, 0x015e36f4, 0x0296b91d, 0x0342aa47, 0x000db897, 0x0274d8ad, 0x000832bd}}}, + {X: Field{[10]uint32{0x015adb07, 0x03246b4c, 0x03a7022b, 0x03e858ed, 0x03f877b5, 0x00ba4677, 0x00e4bf2f, 0x017c54e7, 0x01416965, 0x002ef924}}, Y: Field{[10]uint32{0x03f93a1e, 0x01dba732, 0x036ac40f, 0x01fc3b21, 0x01a77b84, 0x02e3f029, 0x02b5ff6d, 0x0348f231, 0x00256618, 0x002334f8}}}, + {X: Field{[10]uint32{0x01e73786, 0x00531a19, 0x00c752fe, 0x02bb4e60, 0x03bf6dfe, 0x015905cd, 0x0339bbbc, 0x01d2fc1f, 0x0078e383, 0x001d22cc}}, Y: Field{[10]uint32{0x02811ac8, 0x032533ca, 0x02eb28f3, 0x02c18a5e, 0x03ea86b6, 0x005ff211, 0x01f2c802, 0x037e891c, 0x020a61a7, 0x001fdf2b}}}, + {X: Field{[10]uint32{0x0364e4b4, 0x03522fb1, 0x000bcd23, 0x024b414b, 0x005d39d5, 0x009cb3da, 0x015728b2, 0x00956518, 0x03c5b89a, 0x003e98f1}}, Y: Field{[10]uint32{0x00a47c8a, 0x01f5a4a3, 0x01d31fbe, 0x035972d3, 0x01804724, 0x0359f410, 0x0238a506, 0x02758387, 0x03a27751, 0x003130ca}}}, + {X: Field{[10]uint32{0x0056c91c, 0x014e1c73, 0x024446c9, 0x02c1c38f, 0x0386978e, 0x02520c52, 0x025ea13d, 0x038e028d, 0x0197d014, 0x0030bb5c}}, Y: Field{[10]uint32{0x026a595e, 0x03700791, 0x0007009b, 0x02ddcdf7, 0x033404bd, 0x022e6c3e, 0x0054a09d, 0x033463de, 0x0293e7c1, 0x00171cf0}}}, + {X: Field{[10]uint32{0x03c266be, 0x03fa1c9b, 0x03ab5f22, 0x00130367, 0x026c2b3a, 0x03cfa001, 0x0334e846, 0x002f5b0b, 0x01efcb1e, 0x00094530}}, Y: Field{[10]uint32{0x024e3eb3, 0x007b2531, 0x01ad069a, 0x0376333e, 0x02507c35, 0x017d9bb1, 0x00443466, 0x02cb67fe, 0x006c07bb, 0x0031682b}}}, + {X: Field{[10]uint32{0x02286350, 0x01bbe513, 0x0081df6b, 0x03ff25a8, 0x00e2318b, 0x028e10f2, 0x01d2e289, 0x011fc963, 0x03050116, 0x0016f01f}}, Y: Field{[10]uint32{0x03bcbea4, 0x03e16afa, 0x02c66a41, 0x01947844, 0x017a91c4, 0x0096136d, 0x007d059f, 0x03bc1236, 0x00931217, 0x00084f38}}}, + {X: Field{[10]uint32{0x023cad8a, 0x0285cc66, 0x03dd8862, 0x00d7da80, 0x03db9c13, 0x01eb9193, 0x0173f706, 0x016c0e29, 0x02429737, 0x003b6d5b}}, Y: Field{[10]uint32{0x01ef5fa7, 0x01111fc5, 0x01f2e531, 0x014c7660, 0x00358620, 0x009bcef9, 0x038414a4, 0x03551986, 0x027016f8, 0x0034f986}}}, + {X: Field{[10]uint32{0x03d5d732, 0x0323675c, 0x03d55817, 0x023b435d, 0x02684908, 0x0380a191, 0x03609982, 0x019204ef, 0x036e7826, 0x000a4949}}, Y: Field{[10]uint32{0x0287296f, 0x004ff926, 0x02d22622, 0x004c8375, 0x0184b332, 0x02ec33b8, 0x032d755d, 0x0262773a, 0x03a6a97c, 0x003d4c55}}}, + {X: Field{[10]uint32{0x03c0a034, 0x039027a6, 0x0337fa69, 0x01e70ebe, 0x01912863, 0x00dc067a, 0x02098829, 0x03d294dc, 0x01d5bda0, 0x000b115e}}, Y: Field{[10]uint32{0x02f7d99c, 0x032a4d17, 0x0315c336, 0x019ec6e6, 0x02a319d4, 0x00c41ef2, 0x01acd23f, 0x030f1195, 0x034dd889, 0x0038542f}}}, + {X: Field{[10]uint32{0x00808904, 0x0221516a, 0x00b3d056, 0x02e109a6, 0x02025f21, 0x02bcc60c, 0x02295870, 0x03e1daef, 0x020011f9, 0x0017c982}}, Y: Field{[10]uint32{0x02e02350, 0x01cea263, 0x03a9b534, 0x013b60e8, 0x01736fe6, 0x001bab0f, 0x00d2ce00, 0x02a87de9, 0x0232164c, 0x001ab4ce}}}, + {X: Field{[10]uint32{0x02ac4b8b, 0x016935ed, 0x011000d6, 0x01a7a221, 0x029d1f2c, 0x00fecf5a, 0x02fd430f, 0x017b2414, 0x00c61209, 0x000eeeef}}, Y: Field{[10]uint32{0x010b0c97, 0x03e7ea95, 0x019487e4, 0x032ea8ed, 0x0240d244, 0x03256076, 0x01b090f8, 0x029b9f6d, 0x00283846, 0x0000ca3a}}}, + {X: Field{[10]uint32{0x016acff0, 0x02e76065, 0x0117daff, 0x032998b6, 0x02343e80, 0x03088bd2, 0x009af44b, 0x0363bffb, 0x027bdd0f, 0x00126140}}, Y: Field{[10]uint32{0x038affda, 0x005b088e, 0x0065468c, 0x0053fa05, 0x03460b10, 0x009c5a88, 0x01561b5f, 0x01b904c1, 0x012e37a3, 0x00162fbf}}}, + {X: Field{[10]uint32{0x03959de7, 0x0098f559, 0x0359b92e, 0x03300386, 0x006e826e, 0x000ecf73, 0x01eb2d88, 0x0022466d, 0x00e8d2e3, 0x0008518e}}, Y: Field{[10]uint32{0x0232342a, 0x0350793d, 0x03dd8ad9, 0x03c72379, 0x02dc22c0, 0x03d7f270, 0x02e0454f, 0x0078a4d6, 0x01216f13, 0x00027762}}}, + {X: Field{[10]uint32{0x02f3cfdd, 0x00013db9, 0x01f35444, 0x0041a455, 0x016876c1, 0x0197828c, 0x023532b9, 0x00b5abcf, 0x03055ced, 0x001b3b61}}, Y: Field{[10]uint32{0x02546ec6, 0x03ad5bdf, 0x00ac0a83, 0x000665ff, 0x0355b17c, 0x0079abb9, 0x03ba4e2a, 0x0155be2d, 0x02abc86f, 0x003d46c6}}}, + {X: Field{[10]uint32{0x01dcfacb, 0x007221b2, 0x0172730a, 0x03901086, 0x017fc3ad, 0x0216746b, 0x02634987, 0x024db38c, 0x0267876c, 0x0025405b}}, Y: Field{[10]uint32{0x02f4f660, 0x02ece49a, 0x03160742, 0x00bcb90f, 0x034df723, 0x004016ea, 0x03d284b8, 0x019bbbfe, 0x00c4e6e2, 0x000a679e}}}, + {X: Field{[10]uint32{0x026f23f2, 0x0054c67b, 0x00763513, 0x003e76cc, 0x00c513d2, 0x030e633c, 0x02a8019f, 0x0070e710, 0x02c83040, 0x0012fb19}}, Y: Field{[10]uint32{0x038514fc, 0x02c9cd64, 0x003d58e8, 0x028550ff, 0x034fcded, 0x0224a718, 0x01aa9162, 0x0118261c, 0x02923b7d, 0x003c77ff}}}, + {X: Field{[10]uint32{0x008a59c7, 0x03b69e21, 0x03bb27f3, 0x03bd6ac9, 0x019088c4, 0x00394eb9, 0x000015a6, 0x00ee5dab, 0x03d14051, 0x002d4144}}, Y: Field{[10]uint32{0x01c36399, 0x016252e6, 0x0084129a, 0x0326999d, 0x01dc9282, 0x02de1b33, 0x03254c51, 0x039b08fe, 0x02e51182, 0x00271072}}}, + {X: Field{[10]uint32{0x0290708d, 0x005564ed, 0x00c003e4, 0x01149bcc, 0x01d1df38, 0x02a482b2, 0x029bda38, 0x0280e5a9, 0x02533989, 0x00165e49}}, Y: Field{[10]uint32{0x02ba648f, 0x03b40bc6, 0x00bab3a3, 0x02ce5eb9, 0x034c750c, 0x027b99cd, 0x02561921, 0x021f6d79, 0x00b72748, 0x001fcb05}}}, + {X: Field{[10]uint32{0x01eacf6f, 0x00dc1581, 0x02dd34db, 0x03e4fb05, 0x01251cc7, 0x0245b599, 0x00fe2b3e, 0x00aa4d1e, 0x0366cf01, 0x001ee8ad}}, Y: Field{[10]uint32{0x016404bb, 0x02cc47e1, 0x02a6903f, 0x0230b212, 0x003dcc7e, 0x03a2f745, 0x01212865, 0x01e630dc, 0x0138f950, 0x00053f62}}}, + {X: Field{[10]uint32{0x02b5d6bb, 0x00f7e6fa, 0x013a71c4, 0x008959af, 0x017f9e9d, 0x027a0e73, 0x0147af8a, 0x024367f2, 0x02fef69c, 0x000c18bc}}, Y: Field{[10]uint32{0x02f5ee58, 0x025caf01, 0x02bbaad9, 0x0350868d, 0x02064047, 0x0364a9c5, 0x01e7b719, 0x01b505ff, 0x00334991, 0x0036e12a}}}, + {X: Field{[10]uint32{0x00b06e74, 0x0230bf55, 0x00ce3db3, 0x021f8c9f, 0x00f6fae6, 0x02d119c0, 0x034d695c, 0x03b229df, 0x009d69db, 0x003b57e5}}, Y: Field{[10]uint32{0x018930e3, 0x00bfafcb, 0x019fdee6, 0x008fc566, 0x032a6907, 0x026542f2, 0x0104ff92, 0x00f54194, 0x0060057b, 0x0011c938}}}, + {X: Field{[10]uint32{0x021b7cdc, 0x01c39181, 0x028d3d71, 0x01427af5, 0x0030e129, 0x01ab3004, 0x01312fea, 0x0209d83a, 0x02033002, 0x00135957}}, Y: Field{[10]uint32{0x00ea99bb, 0x03b948c4, 0x00d0b7bc, 0x02789e33, 0x00439957, 0x027a5fc1, 0x01e046b6, 0x01526cbd, 0x01226c27, 0x00243bf0}}}, + {X: Field{[10]uint32{0x02f1b35d, 0x019beaba, 0x0260dbf1, 0x02030d46, 0x0368e05e, 0x0120fe56, 0x029edf4a, 0x03bfb342, 0x0356b888, 0x003dad81}}, Y: Field{[10]uint32{0x00a5fb8c, 0x008a8f4e, 0x01df6bfd, 0x023c2f39, 0x00cb57e9, 0x02bebe6c, 0x0096b241, 0x005611aa, 0x02bdaa78, 0x0009efb7}}}, + {X: Field{[10]uint32{0x03c55748, 0x00c06228, 0x00b516ca, 0x00e23f1f, 0x008c81c5, 0x0235ba8b, 0x004db945, 0x0288ddcb, 0x00aa942b, 0x0033164b}}, Y: Field{[10]uint32{0x03288158, 0x0144b476, 0x0307c63d, 0x02c75900, 0x01bb6bd2, 0x00d870fc, 0x0277d100, 0x015820db, 0x03cd358e, 0x000db8bd}}}, + {X: Field{[10]uint32{0x02c1a456, 0x0280cbfd, 0x00edf6a7, 0x01865db4, 0x00f93721, 0x03b7d0c1, 0x023acb8c, 0x011a6086, 0x01dca5bb, 0x0012b2ea}}, Y: Field{[10]uint32{0x02262437, 0x0393a154, 0x021669ca, 0x00aa5cbc, 0x01d6fb30, 0x02ef40b3, 0x032287e9, 0x011fccf9, 0x003ab2ab, 0x002cdba6}}}, + {X: Field{[10]uint32{0x03061f91, 0x011b76fa, 0x0072d974, 0x00f612a5, 0x017be363, 0x02e73a58, 0x010e0c61, 0x01e74cad, 0x005e0422, 0x00322946}}, Y: Field{[10]uint32{0x03d4b5cb, 0x02348b66, 0x000ff3c3, 0x0347fd97, 0x01cdb7cb, 0x019a3bac, 0x00c1df74, 0x00626f59, 0x00b7445e, 0x0033ea94}}}, + {X: Field{[10]uint32{0x035f18f9, 0x02c41074, 0x0120e052, 0x002197e3, 0x01535faf, 0x0277842b, 0x01168a88, 0x03d844d9, 0x016707f4, 0x00307255}}, Y: Field{[10]uint32{0x00033749, 0x02ae5052, 0x027eb537, 0x0384dc23, 0x02543919, 0x015bd11c, 0x02fc1eb9, 0x01ad8c26, 0x003b3d95, 0x000d3def}}}, + {X: Field{[10]uint32{0x0236a8f3, 0x006b9474, 0x038fa8df, 0x01a3cf87, 0x028bb68d, 0x00fdf495, 0x02093703, 0x01cdbad2, 0x03b736f6, 0x00237d3e}}, Y: Field{[10]uint32{0x0102122c, 0x01ddd917, 0x00c81229, 0x03ddc1dc, 0x00cef6b0, 0x006ece14, 0x007af267, 0x00b400e6, 0x01fe8e9a, 0x000f5c61}}}, + {X: Field{[10]uint32{0x025af3dd, 0x02a979aa, 0x00297c2b, 0x02db47af, 0x01c2c8bb, 0x011d4047, 0x02a1ec0c, 0x01f2e3ca, 0x01f0e35c, 0x0000358d}}, Y: Field{[10]uint32{0x03a51a2f, 0x01a00f1e, 0x006435e3, 0x0264614f, 0x03441e5a, 0x0241eb97, 0x0190a5b5, 0x03a2cc6a, 0x02bdc588, 0x0000249b}}}, + {X: Field{[10]uint32{0x0346a4bc, 0x0181c802, 0x01923d64, 0x0097a2d4, 0x013678b5, 0x0038e381, 0x014ea383, 0x014dd5d4, 0x012d5f86, 0x0002d634}}, Y: Field{[10]uint32{0x03438d3e, 0x01121041, 0x037f648e, 0x0103a920, 0x00d77c9e, 0x0265702d, 0x01d587ce, 0x02eace4d, 0x01835b0e, 0x003ded64}}}, + {X: Field{[10]uint32{0x029a7f36, 0x029db6f6, 0x0178011b, 0x014d9187, 0x0212cb42, 0x01e3a26b, 0x03ad0755, 0x00d903b3, 0x028cb401, 0x002edf1a}}, Y: Field{[10]uint32{0x0036581c, 0x00836852, 0x00ba7d1c, 0x0100c1b7, 0x023c2f5c, 0x01c20a56, 0x0195b835, 0x035861a2, 0x02583774, 0x001f7680}}}, + {X: Field{[10]uint32{0x0114a9e6, 0x00eca60d, 0x03b91968, 0x0065c8b3, 0x02f116b8, 0x03e96dea, 0x00a990a7, 0x0233be77, 0x00f792cc, 0x00053dbc}}, Y: Field{[10]uint32{0x024d7055, 0x01bc840e, 0x000b97b9, 0x017fc8e0, 0x01226104, 0x02cffb2d, 0x00e5aac4, 0x01663243, 0x03927a07, 0x002230d7}}}, + {X: Field{[10]uint32{0x03448541, 0x02ef39dd, 0x014fa76b, 0x034125ab, 0x02fb60f4, 0x015fd2a8, 0x01ad8964, 0x02846177, 0x01f4eb9f, 0x0012e579}}, Y: Field{[10]uint32{0x01e71d21, 0x01c1b451, 0x038f4d27, 0x0023df8a, 0x01502d1f, 0x0004807b, 0x0087f512, 0x032cc6e8, 0x0387513a, 0x00078401}}}, + {X: Field{[10]uint32{0x024b63ae, 0x032f4a8d, 0x01c16dce, 0x01993617, 0x03a7af53, 0x008cd568, 0x004aa312, 0x016cb18e, 0x03c067f7, 0x003a685f}}, Y: Field{[10]uint32{0x027fb8c7, 0x00302177, 0x01ac1956, 0x01a806d3, 0x030a40e0, 0x00ad806a, 0x038fcf01, 0x01148d8b, 0x0388ad67, 0x00108288}}}, + {X: Field{[10]uint32{0x03ff9169, 0x02b55110, 0x0281cf10, 0x010e0cc6, 0x0096d4ff, 0x0020d04c, 0x023d066c, 0x03b2053b, 0x0136f320, 0x0000e761}}, Y: Field{[10]uint32{0x028ca248, 0x01b8d9f0, 0x023be7a7, 0x00d44e9e, 0x00c74345, 0x00152af4, 0x0166a556, 0x03a26183, 0x01e91478, 0x001c3ba2}}}, + {X: Field{[10]uint32{0x03b636e8, 0x036a8f0b, 0x0320e001, 0x024f127f, 0x029f95b9, 0x00dc7389, 0x031dc72f, 0x0135b2fa, 0x00c80862, 0x0025de68}}, Y: Field{[10]uint32{0x00c2712e, 0x00292ae8, 0x03907d23, 0x03629932, 0x03369684, 0x000de482, 0x01a4b0e6, 0x01b14027, 0x03cc6729, 0x00276789}}}, + {X: Field{[10]uint32{0x02f0b401, 0x022d3ed9, 0x01586bd7, 0x007f4559, 0x034a9747, 0x032bcdbf, 0x01c09de9, 0x02d23da9, 0x004a1dab, 0x00335316}}, Y: Field{[10]uint32{0x033446f1, 0x00cd0449, 0x017f0bc4, 0x03b711d9, 0x026fd60e, 0x02b4b0a3, 0x02104b0c, 0x001b8acf, 0x02b10eff, 0x0025640a}}}, + {X: Field{[10]uint32{0x0161aba4, 0x02afba89, 0x0319688e, 0x01957549, 0x02dbeb3f, 0x01cadddb, 0x03164f7c, 0x018b2d44, 0x01f41423, 0x0011b284}}, Y: Field{[10]uint32{0x0034c9ff, 0x00b13569, 0x022f5e83, 0x01198813, 0x01bcfd09, 0x01898f18, 0x036d3cbd, 0x03510b7e, 0x031a2a2a, 0x00201810}}}, + {X: Field{[10]uint32{0x0294a513, 0x030e7622, 0x003b475a, 0x0395fa3e, 0x01eb712d, 0x0000c688, 0x035c7535, 0x018fd5db, 0x01791ffb, 0x0037faf4}}, Y: Field{[10]uint32{0x03be75de, 0x032c6b71, 0x00f0aa71, 0x00b7b2ca, 0x006576af, 0x03df1843, 0x02aa0e22, 0x02d53081, 0x007e39b2, 0x0033fb5b}}}, + {X: Field{[10]uint32{0x012c2469, 0x00e021d7, 0x03fcfe12, 0x0285e59f, 0x0143daf1, 0x028ee53e, 0x0233d9d7, 0x0018ed11, 0x013282fd, 0x0031c719}}, Y: Field{[10]uint32{0x01d376d0, 0x0346d52a, 0x02ba8620, 0x00d94ab7, 0x00f18a47, 0x00eafa50, 0x01f8aed3, 0x01a840e3, 0x03cd0e00, 0x0018bf35}}}, + {X: Field{[10]uint32{0x00c0ff37, 0x022bbdcd, 0x007b1e9f, 0x0107f059, 0x026864ec, 0x0123edd6, 0x02640fbf, 0x02826938, 0x034ddc8b, 0x0018faee}}, Y: Field{[10]uint32{0x024ae28e, 0x01848176, 0x022df772, 0x013dc671, 0x01dbf1ae, 0x01cd82a1, 0x01090e19, 0x01bd2d07, 0x034b0fe1, 0x00396740}}}, + {X: Field{[10]uint32{0x0112814a, 0x00536e77, 0x000bceea, 0x00709c75, 0x01ce6e5c, 0x006d624b, 0x02eac616, 0x02fc5963, 0x00c8cb51, 0x00194126}}, Y: Field{[10]uint32{0x00a65279, 0x0162be59, 0x01e6ee30, 0x0215c2b5, 0x027a6145, 0x02f57452, 0x0057769b, 0x00064c91, 0x03855d8e, 0x0039f999}}}, + {X: Field{[10]uint32{0x03c43fd5, 0x00896a11, 0x0032ac41, 0x02a10304, 0x00090815, 0x0205b7d1, 0x0199c07b, 0x00218e05, 0x003f14c0, 0x00052878}}, Y: Field{[10]uint32{0x01fe98de, 0x03581bcd, 0x02ddb6d6, 0x00e1414c, 0x024926da, 0x02ee3bd7, 0x0366bac9, 0x02a23d1b, 0x0259bc6b, 0x000d4912}}}, + {X: Field{[10]uint32{0x02903c5c, 0x03d4c56d, 0x00f084d6, 0x0056ef54, 0x03a4f14c, 0x004553ff, 0x00f9a167, 0x0287a03b, 0x02b2f6a8, 0x000727db}}, Y: Field{[10]uint32{0x0203a033, 0x0181974a, 0x0187dd26, 0x00f900be, 0x01538638, 0x0143bba6, 0x026fc511, 0x03fd8e6d, 0x01f52ca4, 0x0039af78}}}, + {X: Field{[10]uint32{0x0170f8bf, 0x03c0863e, 0x029d97cf, 0x006b0381, 0x00b43ea6, 0x02c0355b, 0x00809664, 0x039ec41f, 0x02ed0bad, 0x000779c7}}, Y: Field{[10]uint32{0x00ee1434, 0x01f69986, 0x029bb5c6, 0x0176615d, 0x01ea99d6, 0x02def253, 0x00d42e16, 0x03babb5e, 0x02de77ed, 0x0002352c}}}, + {X: Field{[10]uint32{0x035cb4b1, 0x01baaad7, 0x018c35a9, 0x00e420e3, 0x02479f7a, 0x02eeadc1, 0x022f0628, 0x0134baea, 0x0280ce95, 0x003d10ca}}, Y: Field{[10]uint32{0x02d579bf, 0x0286272f, 0x0302cc67, 0x01dca718, 0x0291f3d0, 0x03f024e0, 0x00abf476, 0x0290300f, 0x02adac34, 0x0025bf9b}}}, + {X: Field{[10]uint32{0x0119fb21, 0x022d7a49, 0x00737482, 0x032b0549, 0x01cb37e1, 0x02109046, 0x023d3f96, 0x012bd158, 0x034d1796, 0x0023dc79}}, Y: Field{[10]uint32{0x004865ab, 0x01e15358, 0x0091cec0, 0x008021a7, 0x025b6b17, 0x02fda51b, 0x03678e4e, 0x03292e9d, 0x00dfd7f0, 0x001a643c}}}, + {X: Field{[10]uint32{0x02a6745e, 0x00671271, 0x001a1200, 0x014b3bdc, 0x005a09d0, 0x025aa0e8, 0x01546e20, 0x03097999, 0x01575e3d, 0x00088a4c}}, Y: Field{[10]uint32{0x01c423b0, 0x01bab639, 0x0285986a, 0x020b7bfa, 0x0283d050, 0x02a5072a, 0x012bfae8, 0x01581f1e, 0x00874258, 0x002ab63e}}}, + {X: Field{[10]uint32{0x0248a096, 0x00ea8abc, 0x017c63b7, 0x01a4eb08, 0x00cc57d0, 0x03989d94, 0x02bf5f29, 0x029a6a05, 0x02632ef3, 0x0019617f}}, Y: Field{[10]uint32{0x00fd9f8b, 0x00dea0db, 0x037cc12f, 0x00ff7847, 0x03dc8a89, 0x01bb3157, 0x019ca577, 0x006bfbb7, 0x03bb2028, 0x002082a8}}}, + {X: Field{[10]uint32{0x03f67bf8, 0x007907e4, 0x01339195, 0x00bf9843, 0x01aaec47, 0x02fc18a0, 0x0163ce5a, 0x01472aca, 0x0079e55c, 0x000888c9}}, Y: Field{[10]uint32{0x03f927d2, 0x016a6efa, 0x0104bb7c, 0x0062a359, 0x02888a8f, 0x0304ca68, 0x03f0514b, 0x00b5ff99, 0x03ab2cf2, 0x0003864b}}}, + {X: Field{[10]uint32{0x01df16fc, 0x01f6c097, 0x00f60826, 0x022dc3a6, 0x00446014, 0x02ce5b25, 0x00aba082, 0x001a7af3, 0x02fde4ba, 0x0036a340}}, Y: Field{[10]uint32{0x023fa2bb, 0x01d80879, 0x034d059a, 0x03422d9b, 0x01579756, 0x01e8b993, 0x0167e7c1, 0x0021291f, 0x013de337, 0x00068c08}}}, + {X: Field{[10]uint32{0x02202ebf, 0x02a7c624, 0x02501708, 0x0249e3b9, 0x01ad49e0, 0x01313a2e, 0x038a0066, 0x020b7bc6, 0x0062854e, 0x0029bdcb}}, Y: Field{[10]uint32{0x01d03ba4, 0x00d54dc0, 0x0037edaa, 0x02246a0e, 0x002e2709, 0x008c63bd, 0x03c56abc, 0x0204102d, 0x032db08c, 0x0020d565}}}, + {X: Field{[10]uint32{0x03c7db68, 0x016b8a8e, 0x028ee8d5, 0x033a67d6, 0x02a15077, 0x00df7315, 0x02f8c359, 0x02168171, 0x013a309e, 0x00081d3f}}, Y: Field{[10]uint32{0x022cff97, 0x0387c20c, 0x0182e53a, 0x03a6baa5, 0x023061a4, 0x001aa605, 0x018fc0e8, 0x00f250b9, 0x02eacb78, 0x00384700}}}, + {X: Field{[10]uint32{0x01a1a5e3, 0x0071431e, 0x0106c861, 0x03cc6098, 0x0229aa59, 0x00a92d8b, 0x00d316f6, 0x02a8adc3, 0x0266fae9, 0x00127b55}}, Y: Field{[10]uint32{0x007643f7, 0x02eb1b20, 0x028b6324, 0x0024aa0d, 0x021477c2, 0x0261a59e, 0x000b19ef, 0x0138af73, 0x009aae14, 0x001729f9}}}, + {X: Field{[10]uint32{0x016c1b1f, 0x004d8897, 0x014683ed, 0x03a63864, 0x01b582c4, 0x00dc88cd, 0x03472a71, 0x0393a617, 0x007ea1f7, 0x0008a27b}}, Y: Field{[10]uint32{0x01cbbeb1, 0x0144b2b6, 0x0090261a, 0x022f5c3a, 0x03b03f89, 0x01ff903d, 0x017bff67, 0x00219c14, 0x0318689a, 0x0000478a}}}, + {X: Field{[10]uint32{0x01859164, 0x0273afe1, 0x00635bc4, 0x014bff1c, 0x03fbed0e, 0x022e8ae8, 0x02c64a55, 0x03befb62, 0x02be23f1, 0x003aa14b}}, Y: Field{[10]uint32{0x01cbb824, 0x02a98d50, 0x00fafc97, 0x01456c97, 0x0125ef13, 0x01e93905, 0x0266583c, 0x0298e5cc, 0x0341fe97, 0x002f78bb}}}, + {X: Field{[10]uint32{0x0302f0ea, 0x026f86f4, 0x018553fe, 0x01f6905e, 0x00290b25, 0x03fbc229, 0x001a9548, 0x01f4fc6b, 0x00e67cc0, 0x0015c63c}}, Y: Field{[10]uint32{0x01acbe90, 0x0103b3da, 0x0094fd4e, 0x02828bae, 0x03a6ffca, 0x019169ab, 0x02d8bd53, 0x0175fb9c, 0x015bfca6, 0x00263b13}}}, + {X: Field{[10]uint32{0x03810a4c, 0x03af6492, 0x01ad550b, 0x00fde033, 0x0310269c, 0x01d51638, 0x00f0650b, 0x03f5f7ba, 0x02abd77a, 0x0037d8a8}}, Y: Field{[10]uint32{0x00e4c034, 0x0120a6c2, 0x028cd54c, 0x023a7f22, 0x008d39fe, 0x022198f8, 0x03ea2e95, 0x0349ee02, 0x02cce384, 0x001a9981}}}, + {X: Field{[10]uint32{0x005e6668, 0x01336ba0, 0x039aa497, 0x003bbf5d, 0x039ea7dc, 0x00254239, 0x039bd198, 0x009a2f0c, 0x00454b0c, 0x0004043f}}, Y: Field{[10]uint32{0x016410e1, 0x0197eafa, 0x0001c3fa, 0x03c674f6, 0x02d51194, 0x01adaf4a, 0x030a323c, 0x02d65cac, 0x02db0681, 0x001a1a8e}}}, + {X: Field{[10]uint32{0x035c5c18, 0x0097b5a7, 0x0087bd54, 0x01101e41, 0x02072ca3, 0x0050524f, 0x03e93c96, 0x00e061a7, 0x00527567, 0x0022b1e6}}, Y: Field{[10]uint32{0x01d1c08e, 0x031cb26f, 0x03cec684, 0x03e67496, 0x00775375, 0x027bc7e4, 0x0172e04b, 0x03219f46, 0x0248fcbf, 0x002ecc50}}}, + {X: Field{[10]uint32{0x03848b9d, 0x0321a48f, 0x021605f9, 0x01340866, 0x036f3f17, 0x017c2b78, 0x01f3bf44, 0x031f3b18, 0x031188cb, 0x001583a5}}, Y: Field{[10]uint32{0x01b9cd2f, 0x003bdb74, 0x02277bc8, 0x022b063b, 0x014d133f, 0x01939ba7, 0x03bf21fc, 0x03319efe, 0x02ce6775, 0x0027a4b6}}}, + {X: Field{[10]uint32{0x01fb943a, 0x0241c03d, 0x009fee6d, 0x00bc1fdc, 0x0028eea5, 0x011a6870, 0x015ca088, 0x03ad9b32, 0x02044b95, 0x00231190}}, Y: Field{[10]uint32{0x009d0223, 0x0049c79a, 0x03aa51a1, 0x009654f0, 0x03a34920, 0x03afa965, 0x01b3a615, 0x014604c0, 0x005d7bc2, 0x002fc43f}}}, + {X: Field{[10]uint32{0x031eb5aa, 0x034730a1, 0x013cb4d8, 0x036be1d1, 0x037f2245, 0x0362c0d9, 0x0377247c, 0x022dc4d4, 0x034cf357, 0x0034a4fd}}, Y: Field{[10]uint32{0x024a6f26, 0x02befb69, 0x03423ba7, 0x0352b8d5, 0x03f080e3, 0x02c24143, 0x0245931e, 0x03a8518f, 0x013a61df, 0x0021b080}}}, + {X: Field{[10]uint32{0x03687d35, 0x02f5d135, 0x02aff4c6, 0x029ccd99, 0x01fefbf7, 0x01dbae4d, 0x027611ec, 0x01ec7f1d, 0x0241ae75, 0x000d665c}}, Y: Field{[10]uint32{0x004b2aa0, 0x013e5bf1, 0x01f9c599, 0x03bf3283, 0x022f36e0, 0x02f4e4f6, 0x007fd357, 0x0335330f, 0x021f246b, 0x002f2fa9}}}, + {X: Field{[10]uint32{0x036464eb, 0x00d8095f, 0x006de15f, 0x0316f678, 0x00285a17, 0x013b8d77, 0x01a0ef84, 0x0065f4f0, 0x00977467, 0x00034258}}, Y: Field{[10]uint32{0x013e8783, 0x012dc2ef, 0x0303cd14, 0x01a67a22, 0x023dd448, 0x01e737a7, 0x02954bfc, 0x036e59a4, 0x02a51e06, 0x000d0abd}}}, + {X: Field{[10]uint32{0x0241a777, 0x03e2632b, 0x01470bfd, 0x025c8e89, 0x01621257, 0x0086c3e1, 0x033a3755, 0x03ab59c0, 0x00992aea, 0x0023a1d7}}, Y: Field{[10]uint32{0x03c0bbd8, 0x01ea625c, 0x010c653f, 0x02187b1b, 0x02a5ee66, 0x00c49eb4, 0x020ba101, 0x0066ec13, 0x033d2d2f, 0x00092a89}}}, + {X: Field{[10]uint32{0x02541855, 0x03786e6b, 0x01aee0d2, 0x0110215a, 0x00d622f4, 0x01cb16ee, 0x02f47d81, 0x00e93347, 0x01f30270, 0x002fd474}}, Y: Field{[10]uint32{0x039aa484, 0x0029c433, 0x0030f3c6, 0x00c510cf, 0x005918d9, 0x024d4f61, 0x01e6e409, 0x002b3eef, 0x0352b6c6, 0x0023e078}}}, + {X: Field{[10]uint32{0x0341c26f, 0x02a35320, 0x03aee696, 0x016db372, 0x022ebb11, 0x0020fbd5, 0x032d1415, 0x01a1588a, 0x00620972, 0x001bedad}}, Y: Field{[10]uint32{0x003c9c73, 0x027c182e, 0x02032a89, 0x00c2eb28, 0x01468f25, 0x015e2e91, 0x02923b3e, 0x03367b32, 0x03bff9cf, 0x0027023d}}}, + {X: Field{[10]uint32{0x03617438, 0x0237d8a4, 0x0389d067, 0x01a1acb3, 0x031db56f, 0x03fc117e, 0x026a21fa, 0x03de35f7, 0x02c18b5c, 0x001d560e}}, Y: Field{[10]uint32{0x0369f900, 0x0240d026, 0x0082df67, 0x00526100, 0x02071fe0, 0x0319a725, 0x0237c7d9, 0x011bfc38, 0x022cb085, 0x00209668}}}, + {X: Field{[10]uint32{0x00c0ef92, 0x023fe72d, 0x00f36cdd, 0x038d8404, 0x014aabc2, 0x006ddba5, 0x0051c893, 0x0166b1fb, 0x0133a5d7, 0x00109846}}, Y: Field{[10]uint32{0x01ed4261, 0x00054748, 0x00bf8783, 0x000c3e67, 0x0158cde4, 0x013ae131, 0x038e2bd5, 0x032f3a8d, 0x00ce6b8a, 0x00222991}}}, + {X: Field{[10]uint32{0x02f520d2, 0x00eb78c2, 0x038458a4, 0x025492eb, 0x016dff9c, 0x01c5af71, 0x02e776ca, 0x03e592f6, 0x01bf6128, 0x00090e9b}}, Y: Field{[10]uint32{0x001b7e50, 0x007c6948, 0x0025d609, 0x01368f64, 0x003dda74, 0x024af7ea, 0x0001850e, 0x036d2341, 0x028a5ce4, 0x00098a8b}}}, + {X: Field{[10]uint32{0x00c2ac76, 0x02c4a476, 0x03d58082, 0x00b169da, 0x0046e57e, 0x01f7c56f, 0x01e9307a, 0x031b4810, 0x01751548, 0x00084af4}}, Y: Field{[10]uint32{0x039391bc, 0x032f5dc1, 0x01aaae33, 0x03d1c66a, 0x0257f04e, 0x022c9020, 0x03cc788a, 0x01c9cc99, 0x03c76cc9, 0x00209186}}}, + {X: Field{[10]uint32{0x0161177b, 0x01f05ad3, 0x021fbc1a, 0x011842f5, 0x008ca8a5, 0x022b83b2, 0x00b3e562, 0x01b4aaa8, 0x030b21f9, 0x00369b40}}, Y: Field{[10]uint32{0x023f9fde, 0x02f6f9cb, 0x03d0a1ce, 0x00787aae, 0x012c2aad, 0x02d27b0a, 0x02b85961, 0x000a1d28, 0x02358fab, 0x0016d6f1}}}, + {X: Field{[10]uint32{0x02c1f01f, 0x027d38fd, 0x0010886a, 0x01fb3fa0, 0x004a4313, 0x03ba923f, 0x001e1012, 0x010ec296, 0x02f055a2, 0x003708c2}}, Y: Field{[10]uint32{0x028180ca, 0x03e80f95, 0x018bb950, 0x02ad805c, 0x012eb5a9, 0x00f5ffbb, 0x030120da, 0x011635c0, 0x021be70a, 0x00343e63}}}, + {X: Field{[10]uint32{0x01089df1, 0x01b412ea, 0x00797dc1, 0x01cbc291, 0x00ee9c59, 0x03c8c9a1, 0x00e73b56, 0x031a1a63, 0x023ac815, 0x0020b0b7}}, Y: Field{[10]uint32{0x03b8573d, 0x018b65e4, 0x02432544, 0x0110b07e, 0x010c8598, 0x007f85e3, 0x0253b8ec, 0x033063e8, 0x0065c6c2, 0x0007211c}}}, + {X: Field{[10]uint32{0x020494a3, 0x01d85278, 0x037f6670, 0x0081a901, 0x02cc439f, 0x0002be26, 0x0165dfa2, 0x0245bb86, 0x028874e4, 0x001b28b7}}, Y: Field{[10]uint32{0x02662043, 0x014466a6, 0x02e0699b, 0x0276ba5a, 0x02cd5111, 0x01f71f39, 0x03cc1aa5, 0x02177690, 0x034497aa, 0x001bbc2c}}}, + {X: Field{[10]uint32{0x0051d97f, 0x00ebd4de, 0x031f88d3, 0x029242f4, 0x03cf1149, 0x021003be, 0x02448f82, 0x03ed9481, 0x03c41728, 0x002e89a1}}, Y: Field{[10]uint32{0x02b4c0c4, 0x03c82c61, 0x01de5d61, 0x000090ec, 0x02033455, 0x0318b34c, 0x03803bb3, 0x039eaba2, 0x01f11f2c, 0x0025ab49}}}, + {X: Field{[10]uint32{0x01553e0d, 0x028bc203, 0x01aa5f1e, 0x00cf91a8, 0x03d311f5, 0x02cc0cc8, 0x0032d5a4, 0x03cc0458, 0x00401947, 0x002b0d88}}, Y: Field{[10]uint32{0x00b30a22, 0x01c70fcb, 0x0137fdf1, 0x006dec82, 0x001d5b98, 0x005f6e47, 0x035881fa, 0x00a21169, 0x0395fef3, 0x0014e0e7}}}, + {X: Field{[10]uint32{0x01049e13, 0x01a51d9e, 0x0246bac7, 0x0308b6ee, 0x024158c7, 0x00ecd727, 0x014241ec, 0x01c815a3, 0x00ee5b1b, 0x0019e03b}}, Y: Field{[10]uint32{0x0057d9a8, 0x02fd004c, 0x02e4ee0f, 0x015fb31e, 0x0246520d, 0x0158b9cc, 0x0090b9f3, 0x022234b7, 0x01f031e0, 0x0026b045}}}, + {X: Field{[10]uint32{0x02a63732, 0x0040e434, 0x00254cbb, 0x00eaaca5, 0x01c0f765, 0x02ef4d0e, 0x0110d622, 0x035754c1, 0x0247e7a2, 0x00254dde}}, Y: Field{[10]uint32{0x00195fc0, 0x02f948fe, 0x01d7b091, 0x01a8d992, 0x03bb01f7, 0x0319155e, 0x01abe4df, 0x02d8b3f8, 0x01109daf, 0x0015eb24}}}, + {X: Field{[10]uint32{0x02dd8921, 0x005e85ca, 0x0015e85f, 0x001ccc9d, 0x01486a85, 0x02f50abd, 0x02e97c59, 0x020efc1f, 0x01bf98fd, 0x00013c65}}, Y: Field{[10]uint32{0x011cf3dc, 0x0171ee1a, 0x03b59a86, 0x02f3c7bc, 0x011a057b, 0x01ac72b7, 0x027cae30, 0x008c8d8c, 0x032501c8, 0x00295ab3}}}, + {X: Field{[10]uint32{0x00bcb53f, 0x00a46c53, 0x036bad9e, 0x034b5edb, 0x02cc0510, 0x036eaaf3, 0x0208240a, 0x00a67f48, 0x03d1efe8, 0x003b3347}}, Y: Field{[10]uint32{0x002c667c, 0x020111e9, 0x02b29135, 0x022fff09, 0x012d9b6f, 0x00663806, 0x03d6f2d3, 0x003e9715, 0x03216da5, 0x003b0bfc}}}, + {X: Field{[10]uint32{0x0058f438, 0x0321386c, 0x01f2b1ee, 0x0004307b, 0x01502e76, 0x01f2dd1d, 0x00ff41cf, 0x010971ca, 0x004af2c3, 0x0031d5d1}}, Y: Field{[10]uint32{0x0362e53a, 0x01c0a0d8, 0x014b8fd0, 0x03f1a140, 0x039cd267, 0x0322d995, 0x0301105b, 0x0050f8a5, 0x01b6169f, 0x00387520}}}, + {X: Field{[10]uint32{0x005250b8, 0x006d5f19, 0x00ac636f, 0x0170711c, 0x03aef325, 0x028468d9, 0x01996627, 0x001dd963, 0x037ebff5, 0x000d58a0}}, Y: Field{[10]uint32{0x019234d8, 0x01cb598a, 0x02b9cf4d, 0x00d729fe, 0x00fa1d0d, 0x02f2bf00, 0x01374bb0, 0x0163f333, 0x020d97aa, 0x003373d2}}}, + {X: Field{[10]uint32{0x02d4a3a1, 0x00cc5f21, 0x00a82b11, 0x01f7ed95, 0x03b1f2f0, 0x03eb062d, 0x01339e97, 0x025eaf4b, 0x0245f62e, 0x0033a770}}, Y: Field{[10]uint32{0x00d184d5, 0x0295857c, 0x00b7927b, 0x00c2f9bb, 0x02fcaf1b, 0x030deaf7, 0x03e8520e, 0x03ee3993, 0x0325342a, 0x003db878}}}, + {X: Field{[10]uint32{0x00858a12, 0x0275b8cb, 0x03dd542d, 0x023394e0, 0x02aab481, 0x02807ea2, 0x0271a8c1, 0x0112ea74, 0x033b48ee, 0x002b008b}}, Y: Field{[10]uint32{0x02ca76fa, 0x02e6ea5c, 0x01aaf45d, 0x01f99815, 0x02191e49, 0x00e58477, 0x009e0917, 0x03447c66, 0x03a891f8, 0x00078158}}}, + {X: Field{[10]uint32{0x0251d9f9, 0x026702e9, 0x024ff3a9, 0x020a2332, 0x0355a837, 0x02dbc89d, 0x02e57e6d, 0x033eab91, 0x0282cb12, 0x0034753d}}, Y: Field{[10]uint32{0x01e71a36, 0x016639e1, 0x02960488, 0x0192b2e3, 0x03016072, 0x0059c88c, 0x023b4b07, 0x0064c530, 0x03e5870e, 0x0006c66f}}}, + {X: Field{[10]uint32{0x031c8a37, 0x014c0ebf, 0x012ee243, 0x012cb401, 0x00892e75, 0x026f746a, 0x03bacd4f, 0x02be5117, 0x0171bbdd, 0x001e6588}}, Y: Field{[10]uint32{0x03b98a7d, 0x0056f8de, 0x0320ab85, 0x02a76bc1, 0x00fe47b6, 0x00d304d5, 0x0072f77b, 0x00afad15, 0x03de2a95, 0x002e2b09}}}, + {X: Field{[10]uint32{0x009d3b90, 0x00cb8f14, 0x038d8cf0, 0x02c60e83, 0x0120ecb3, 0x001868bc, 0x03c3573b, 0x02d812ec, 0x03c42390, 0x00111685}}, Y: Field{[10]uint32{0x013f97b1, 0x02b52c5a, 0x026aae34, 0x01079026, 0x024ea769, 0x03bfd259, 0x00057c87, 0x03f97283, 0x00887c07, 0x002dd7d0}}}, + {X: Field{[10]uint32{0x03402051, 0x020ef0c3, 0x02ccfb0e, 0x01244745, 0x038c39cd, 0x0345d5d8, 0x02c49a78, 0x03d1fd7e, 0x01f963a9, 0x001859ad}}, Y: Field{[10]uint32{0x012430b3, 0x005f77fa, 0x01d7e053, 0x03d56811, 0x02933d6d, 0x03b15d24, 0x03e46204, 0x02bac884, 0x02618302, 0x002e8cdd}}}, + {X: Field{[10]uint32{0x03251531, 0x00574fe2, 0x034a9293, 0x036e8d36, 0x0330b6db, 0x012379f8, 0x027d0e40, 0x006bfa39, 0x02742890, 0x0033599b}}, Y: Field{[10]uint32{0x0002304b, 0x0146040e, 0x024f9e54, 0x0147c46c, 0x01440959, 0x027f227b, 0x02398e74, 0x02950390, 0x00b943cb, 0x002bdcb6}}}, + {X: Field{[10]uint32{0x0123ac72, 0x0272eb41, 0x0014ee83, 0x02f35ee2, 0x015a6285, 0x036640d5, 0x01837a11, 0x01bf811b, 0x028cfd2f, 0x00320cef}}, Y: Field{[10]uint32{0x01a6af03, 0x00926132, 0x00ed603a, 0x02fbfa32, 0x02b6c07d, 0x01430ed3, 0x01751531, 0x008d8ea3, 0x010b4411, 0x001faa3e}}}, + {X: Field{[10]uint32{0x025ea477, 0x0000da7c, 0x03613982, 0x013fa109, 0x02e40e4a, 0x03a56c58, 0x010ac1f5, 0x034e1762, 0x03363036, 0x00330617}}, Y: Field{[10]uint32{0x02338236, 0x03bae7c9, 0x02b42832, 0x01d50157, 0x03f66d07, 0x027384bb, 0x02aabe5a, 0x02726262, 0x0036146d, 0x00381da2}}}, + {X: Field{[10]uint32{0x009c4a5a, 0x010f0a63, 0x01770479, 0x0043a4b2, 0x0177ccd9, 0x0101ee02, 0x03c9be70, 0x030aead9, 0x006324bb, 0x00052382}}, Y: Field{[10]uint32{0x02408797, 0x03f8eeb0, 0x036ee55d, 0x00c7edc5, 0x01b706a3, 0x004e3a5f, 0x02733ae6, 0x03f20277, 0x00859cdd, 0x00227a0f}}}, + {X: Field{[10]uint32{0x02c95c76, 0x038048af, 0x03a7e460, 0x012553d4, 0x010cf8b6, 0x00a8dd87, 0x008d9b19, 0x02d60d72, 0x01c1aba5, 0x0026c54e}}, Y: Field{[10]uint32{0x00efdc18, 0x03c8756b, 0x0395b967, 0x010a88c9, 0x00d8472e, 0x02a87389, 0x00895f13, 0x01676b53, 0x021945be, 0x000e4737}}}, + {X: Field{[10]uint32{0x024495cd, 0x02e29cc3, 0x03dd3e93, 0x01d2a5d2, 0x03a60327, 0x03d09f31, 0x029e575f, 0x00074dda, 0x02c175fb, 0x001a28b9}}, Y: Field{[10]uint32{0x00e00752, 0x00f7139e, 0x014f2557, 0x02df89cf, 0x030666ca, 0x03166591, 0x0269b741, 0x0037797c, 0x0084c8c3, 0x00054f99}}}, + {X: Field{[10]uint32{0x01dfb04e, 0x01b08a18, 0x030b66c3, 0x028b9f0b, 0x007669e9, 0x00cf332b, 0x02334405, 0x029030ed, 0x004935a5, 0x00163fa4}}, Y: Field{[10]uint32{0x0136e1bb, 0x03eed815, 0x01555b39, 0x009c569e, 0x0371ac1e, 0x0356669d, 0x0106e2a2, 0x0038b5c7, 0x01c59245, 0x002cda41}}}, + {X: Field{[10]uint32{0x02ac7080, 0x0169e0d7, 0x00378337, 0x029838a6, 0x0103e9bc, 0x026d809f, 0x01aff2a1, 0x0366c2ff, 0x0396dcbd, 0x00208f03}}, Y: Field{[10]uint32{0x02ad0a7f, 0x0334823c, 0x03db8895, 0x02c36410, 0x028831a2, 0x00efcf0d, 0x03eb6d54, 0x026962ea, 0x02ccf34d, 0x00364551}}}, + {X: Field{[10]uint32{0x02d14537, 0x03378800, 0x02caf533, 0x01493df7, 0x03d68121, 0x00c04fb9, 0x03e7b710, 0x03e42157, 0x02aee908, 0x001295ab}}, Y: Field{[10]uint32{0x0222b7a2, 0x02be42b1, 0x00d8d021, 0x03ecb80c, 0x023129a7, 0x01e43ae6, 0x01995b33, 0x00634846, 0x000133b7, 0x001f9832}}}, + {X: Field{[10]uint32{0x01240334, 0x01b28efe, 0x0168a71f, 0x03d27f82, 0x0382a64b, 0x02204c66, 0x0194e2b8, 0x03d7cb11, 0x0055e6c4, 0x001b03ce}}, Y: Field{[10]uint32{0x03b5203c, 0x03f8d348, 0x02fc83ac, 0x0346d355, 0x03e1478a, 0x0016bab4, 0x01ade853, 0x02eea12d, 0x036da9ef, 0x0017239e}}}, + {X: Field{[10]uint32{0x01ac9632, 0x02e8a8cd, 0x033313ae, 0x002d4923, 0x000496e4, 0x005cb992, 0x01de21cf, 0x01241c57, 0x032cd170, 0x003673e3}}, Y: Field{[10]uint32{0x00934344, 0x00e0570f, 0x028e6b07, 0x0242db0f, 0x0315867e, 0x00d755fd, 0x0198299c, 0x03e4c02f, 0x0251b440, 0x0024a9f0}}}, + {X: Field{[10]uint32{0x0193d898, 0x01d9fdee, 0x039e27c6, 0x00a3f3c6, 0x01775927, 0x026bcc0e, 0x027ed43d, 0x0371eebe, 0x00928b91, 0x0012ff2d}}, Y: Field{[10]uint32{0x005d14f7, 0x032a5269, 0x03dda7bf, 0x03a791c0, 0x001854a4, 0x00ea8cee, 0x00c9a4ae, 0x035042cd, 0x02f1ecd9, 0x0009da81}}}, + {X: Field{[10]uint32{0x03c434e8, 0x00066b08, 0x00792944, 0x01d7964a, 0x027cdcc5, 0x0055965b, 0x0193dee8, 0x00cbd13b, 0x0093ac40, 0x002af796}}, Y: Field{[10]uint32{0x0195c40a, 0x012c0360, 0x0116ed77, 0x02c93066, 0x0346162c, 0x033bc0be, 0x002af7a7, 0x018113a5, 0x00092b9e, 0x001780ea}}}, + {X: Field{[10]uint32{0x026e1cc5, 0x00ec3f54, 0x020a803b, 0x02b8c6f8, 0x004482f1, 0x00a07688, 0x00814b49, 0x02a3845e, 0x03077a98, 0x00081758}}, Y: Field{[10]uint32{0x03e4d780, 0x027fd41b, 0x036147a7, 0x03495595, 0x00b9cab7, 0x01b992ff, 0x015cb19d, 0x00d581ae, 0x015c943e, 0x0012ef8a}}}, + {X: Field{[10]uint32{0x001c43bd, 0x02337491, 0x00b7c3b9, 0x02f116fd, 0x01b59653, 0x01b980c7, 0x0228a423, 0x00e871b0, 0x0083e667, 0x0032d313}}, Y: Field{[10]uint32{0x031a2769, 0x013a3ab8, 0x01149cfe, 0x00307fa9, 0x0062f334, 0x016bf9c5, 0x002ff397, 0x01fa83df, 0x02763926, 0x00050b80}}}, + {X: Field{[10]uint32{0x00ca77a7, 0x02ec894b, 0x004f2b5a, 0x02cb7b1f, 0x0392ccf0, 0x024cd5bb, 0x0354a4b4, 0x02f7eceb, 0x00b27ff5, 0x0009687d}}, Y: Field{[10]uint32{0x035c3c38, 0x03fe5ecc, 0x03fe93e9, 0x022ca229, 0x0136c32e, 0x02647cb6, 0x033b3afc, 0x020d05f7, 0x0193153f, 0x0006c977}}}, + {X: Field{[10]uint32{0x0254237b, 0x029dea8a, 0x026dc89c, 0x015255ed, 0x015a1b71, 0x0195f2e2, 0x011c863a, 0x02835a94, 0x02a77eec, 0x00088bdd}}, Y: Field{[10]uint32{0x00b0b289, 0x01680bcb, 0x03492794, 0x0210bda8, 0x01a205c8, 0x019974a5, 0x03a598a8, 0x03e23421, 0x02e064ef, 0x002a3caf}}}, + {X: Field{[10]uint32{0x034dfa8d, 0x032f63ce, 0x002daec3, 0x009a67c7, 0x02379f5c, 0x024dad01, 0x03f10156, 0x01946d06, 0x028d1ad2, 0x000cb50c}}, Y: Field{[10]uint32{0x0188261d, 0x033a4c1e, 0x0290d204, 0x028741a4, 0x02df5de0, 0x0391e025, 0x00d40623, 0x028ced7d, 0x02e23294, 0x0027db79}}}, + {X: Field{[10]uint32{0x01f1d3f0, 0x0195a460, 0x01b14e82, 0x00c33e64, 0x01187d08, 0x01998adf, 0x01937900, 0x0335c0ec, 0x00be6948, 0x00337a7b}}, Y: Field{[10]uint32{0x03029720, 0x03a06c56, 0x015e24bc, 0x03ffe554, 0x01f5abe8, 0x022b55b1, 0x037794ce, 0x00634a6d, 0x03320e12, 0x0021221e}}}, + {X: Field{[10]uint32{0x0348947d, 0x0354f4e9, 0x00b80011, 0x01f89979, 0x02509f4e, 0x0141a801, 0x03435826, 0x03bd32a0, 0x005c3baa, 0x002f227d}}, Y: Field{[10]uint32{0x03e68475, 0x00a7d79b, 0x03a49511, 0x02bdc89a, 0x0209fa15, 0x00d3de6f, 0x0272fce5, 0x02c519e8, 0x00a2714d, 0x003bfd6f}}}, + {X: Field{[10]uint32{0x01b51d4f, 0x003dd237, 0x03df0994, 0x02e6d5fb, 0x0139b409, 0x010d2a6b, 0x014ba655, 0x02eff8af, 0x00c0eea2, 0x001899e3}}, Y: Field{[10]uint32{0x03a74acf, 0x0141470d, 0x00883673, 0x02e79ef3, 0x02a5cc8a, 0x03db7553, 0x0161245e, 0x034c7470, 0x034fd234, 0x00234e13}}}, + {X: Field{[10]uint32{0x02bc93d0, 0x027e4ce1, 0x02f8af21, 0x030d3fa1, 0x02df7c0a, 0x037e89cd, 0x01c89cf3, 0x0388958f, 0x0139c63a, 0x00057807}}, Y: Field{[10]uint32{0x00cfb13b, 0x01d56204, 0x03ef42bc, 0x0267e8c5, 0x01e7efb9, 0x025da618, 0x03251334, 0x032e0705, 0x0132314f, 0x0007d58d}}}, + {X: Field{[10]uint32{0x03ac10e3, 0x03cd92ca, 0x03eb97b8, 0x000c06f6, 0x0052c601, 0x010a2ba7, 0x018e813e, 0x009637fe, 0x03493493, 0x0013e34a}}, Y: Field{[10]uint32{0x0169b73f, 0x02c99380, 0x021bcd66, 0x039085b2, 0x031e8c58, 0x03e467d5, 0x00580283, 0x0176db00, 0x017b6795, 0x00231f44}}}, + {X: Field{[10]uint32{0x016f1d61, 0x02249dad, 0x0136f1a7, 0x02d3d124, 0x003b0d77, 0x0374d623, 0x03e397cd, 0x01ad8260, 0x031a2bf1, 0x00345338}}, Y: Field{[10]uint32{0x013f0910, 0x03cdcd2b, 0x0335611e, 0x031c9613, 0x01833f24, 0x0375eefd, 0x022ca6e4, 0x0360e8dc, 0x0220b227, 0x0026857d}}}, + {X: Field{[10]uint32{0x02f780f1, 0x03a38ed9, 0x008419c3, 0x028b104c, 0x00024c1a, 0x02ffa800, 0x00d656c9, 0x01d7d704, 0x034eb8c2, 0x000d4886}}, Y: Field{[10]uint32{0x03f8e808, 0x0317764e, 0x03fa0f8e, 0x01186d77, 0x0306888d, 0x009de195, 0x038382bb, 0x02bf2ef5, 0x02025274, 0x000f4716}}}, + {X: Field{[10]uint32{0x00a8ddc8, 0x02b02a8d, 0x0043c49e, 0x005dc9c2, 0x0083f686, 0x03d10ec8, 0x00ff6f29, 0x0306e3d1, 0x003b1c76, 0x0020bb67}}, Y: Field{[10]uint32{0x015f1340, 0x0077177a, 0x02fc48a9, 0x0162bbf5, 0x00e81f5a, 0x000009a4, 0x002081d9, 0x00ae19cd, 0x026bc2ab, 0x00098ba7}}}, + {X: Field{[10]uint32{0x00717b85, 0x0078d244, 0x02118d18, 0x012bfd71, 0x009c49b6, 0x010ba5f1, 0x02342f77, 0x02a8dba1, 0x020eacf2, 0x002467a5}}, Y: Field{[10]uint32{0x0145b861, 0x020bf936, 0x016505a0, 0x010b1e08, 0x03ef530d, 0x030ca7c4, 0x01ce9d5a, 0x0059e736, 0x014ea3ea, 0x0012d46a}}}, + {X: Field{[10]uint32{0x03c3ec7d, 0x03f4d996, 0x02c3065f, 0x0386b3c1, 0x02edca3d, 0x0190f398, 0x02abcafa, 0x01546afb, 0x023e20ce, 0x00336b2b}}, Y: Field{[10]uint32{0x02b95bb6, 0x00881c5b, 0x009b13d3, 0x0292cd07, 0x02235df4, 0x02953d3b, 0x00c326df, 0x001dab8a, 0x0313872b, 0x002aab2e}}}, + {X: Field{[10]uint32{0x02a5f2ab, 0x027389a4, 0x015a8f94, 0x03fed98f, 0x00de3a62, 0x001c9bc2, 0x0180f829, 0x017027cf, 0x00e21bd0, 0x00069142}}, Y: Field{[10]uint32{0x00ca97ba, 0x00c83d4b, 0x013e602b, 0x0315b497, 0x00c6e672, 0x02fc0a65, 0x00459bf4, 0x02c0cdd8, 0x03f0976e, 0x00149e03}}}, + {X: Field{[10]uint32{0x003a0b45, 0x005098a0, 0x018ddd52, 0x01dfcea8, 0x02e9129f, 0x03c9b262, 0x00f73d13, 0x03c972a5, 0x02ed5686, 0x002391bb}}, Y: Field{[10]uint32{0x01edcf4d, 0x0326bd87, 0x00200782, 0x0159843a, 0x027253d5, 0x01fc2bad, 0x03f2ed1e, 0x03ba9f21, 0x038d7041, 0x003b95b4}}}, + {X: Field{[10]uint32{0x017e4031, 0x0396ecda, 0x00532a92, 0x0079e828, 0x0168d617, 0x02d8611a, 0x01797c15, 0x02cc276b, 0x00fa3bd6, 0x001e0a44}}, Y: Field{[10]uint32{0x00e4b3f4, 0x0025d4d1, 0x022ddee4, 0x03fdb4fc, 0x00717914, 0x011ac2a0, 0x00c31b89, 0x00a8a3a1, 0x0365c44c, 0x003fc5e0}}}, + {X: Field{[10]uint32{0x01f64e8a, 0x00f246b9, 0x01041ae9, 0x02a3e41a, 0x0265c50a, 0x013c75f4, 0x002d0a29, 0x004329b3, 0x028cc5a7, 0x0000aae7}}, Y: Field{[10]uint32{0x03f89b9b, 0x00ebf269, 0x001c9db2, 0x000a84f6, 0x03185366, 0x0164d251, 0x03cf23da, 0x012eb419, 0x010fa225, 0x0002aaf3}}}, + {X: Field{[10]uint32{0x0382c9e5, 0x006f4758, 0x037a5fcb, 0x03091843, 0x03a094dd, 0x01494a4d, 0x020cc533, 0x016c8a0c, 0x03c44fb2, 0x00341199}}, Y: Field{[10]uint32{0x02b0f74e, 0x0351e52c, 0x00f5ce31, 0x03600c19, 0x026e5a91, 0x02b13ea1, 0x02f436ec, 0x01239e1a, 0x013f8bf0, 0x001f24d8}}}, + {X: Field{[10]uint32{0x0286b0f7, 0x012be0db, 0x01252def, 0x00a724d8, 0x00f157bd, 0x0160e265, 0x01b0476c, 0x03769294, 0x02f9799c, 0x002e711d}}, Y: Field{[10]uint32{0x0297932e, 0x02aad2b2, 0x029eff13, 0x036aa414, 0x03d1a9b0, 0x01a11549, 0x01cefbc4, 0x0122cfc9, 0x019bc779, 0x000bb1d8}}}, + {X: Field{[10]uint32{0x006eee85, 0x036a104a, 0x02e0d64f, 0x03ff7b8a, 0x004ef765, 0x03591ce7, 0x01d8c565, 0x0265012e, 0x01abf13f, 0x00242f7b}}, Y: Field{[10]uint32{0x00cf21f5, 0x00a04138, 0x037255c6, 0x0376e53d, 0x007f8bb8, 0x0061f49b, 0x02812a48, 0x0122ad2f, 0x0082d9a8, 0x002a7d1e}}}, + {X: Field{[10]uint32{0x00485c84, 0x001cdebf, 0x01e7ba68, 0x03377356, 0x03ff4208, 0x013afc3f, 0x02b83107, 0x01dcd300, 0x00a80217, 0x002830e5}}, Y: Field{[10]uint32{0x0109364b, 0x003975c3, 0x02e3fd64, 0x02d8bcd3, 0x00e835ca, 0x026dec59, 0x002434fe, 0x00bcd3f2, 0x0132b4c6, 0x00313c22}}}, + {X: Field{[10]uint32{0x00294c3e, 0x02ad434c, 0x00273b9a, 0x008fafab, 0x02bd3c29, 0x00b9da53, 0x00f949c7, 0x03a318a1, 0x01bd3896, 0x0006c0c6}}, Y: Field{[10]uint32{0x02ee339d, 0x03b54be8, 0x02080053, 0x01c8768c, 0x021401b6, 0x000edec6, 0x038233d7, 0x02ab9f97, 0x029b17c3, 0x000576ff}}}, + {X: Field{[10]uint32{0x03dc719d, 0x00b8f66f, 0x032ab699, 0x00ecea43, 0x001210eb, 0x01463730, 0x03a93540, 0x005afa89, 0x030fe92f, 0x0026453b}}, Y: Field{[10]uint32{0x03c4086b, 0x0370ac6c, 0x02b8398d, 0x00b218cc, 0x005e671d, 0x02bd968c, 0x01f3629f, 0x002c47a3, 0x00650cea, 0x001e82f4}}}, + {X: Field{[10]uint32{0x01f60d3e, 0x03b744f7, 0x03810daa, 0x01b5eb39, 0x015798ad, 0x02572585, 0x02fa1763, 0x03d8e1f6, 0x02195599, 0x000e9a3e}}, Y: Field{[10]uint32{0x00e71a89, 0x025afdf5, 0x0054f5cd, 0x03ba6a2b, 0x00de158e, 0x00190729, 0x00faef1e, 0x01a76ce5, 0x02e6a3f5, 0x001d15d6}}}, + {X: Field{[10]uint32{0x0288b2e5, 0x01a71817, 0x023859da, 0x03b1fc04, 0x0241193d, 0x006fff23, 0x01872b1b, 0x01f8c43c, 0x0141e2b6, 0x002dcd87}}, Y: Field{[10]uint32{0x00668344, 0x0241f860, 0x029c29b0, 0x02f7c42f, 0x00315347, 0x01b9eb34, 0x00f5890f, 0x026f29cf, 0x039566d4, 0x003ea75a}}}, + {X: Field{[10]uint32{0x01174e81, 0x0216e0c9, 0x01bc637b, 0x034c4ba6, 0x02aa93a4, 0x03edffe7, 0x03d13543, 0x011903db, 0x018742d8, 0x000d07a6}}, Y: Field{[10]uint32{0x03fcfc95, 0x00adae62, 0x007ac861, 0x0269bb5d, 0x01e95b4e, 0x018b97f0, 0x01cbcff7, 0x01861d84, 0x00dc91b4, 0x00312582}}}, + {X: Field{[10]uint32{0x0083e6f6, 0x03dd76b1, 0x0026e2a0, 0x02febe1d, 0x001f6420, 0x000b25c6, 0x00849094, 0x03d55d00, 0x0045de34, 0x0020f5a9}}, Y: Field{[10]uint32{0x01dddfc1, 0x030486e8, 0x030fd787, 0x00249df6, 0x00e9fbed, 0x012a5376, 0x01cf48a1, 0x03ed4d7b, 0x034458c8, 0x001ea1b6}}}, + {X: Field{[10]uint32{0x02ac351b, 0x02e12e49, 0x03bdda40, 0x0218bf3f, 0x0032d176, 0x01a92676, 0x0082bf1c, 0x032ba624, 0x035a014b, 0x0013c448}}, Y: Field{[10]uint32{0x014a2acf, 0x018cce7a, 0x022886e9, 0x03b6f967, 0x0308678d, 0x01dce72d, 0x00021c83, 0x009a745a, 0x00f15f31, 0x002d4189}}}, + {X: Field{[10]uint32{0x03ee2b89, 0x03a6a734, 0x0115b998, 0x024b0208, 0x02eafb38, 0x02db8f5f, 0x0285907a, 0x0384b3a9, 0x032721cf, 0x0023eed5}}, Y: Field{[10]uint32{0x02906680, 0x0248e8d9, 0x03ab791c, 0x0296be2f, 0x00ef1bb1, 0x0296d6a9, 0x018de8e2, 0x02386973, 0x0285c814, 0x00369ff9}}}, + {X: Field{[10]uint32{0x0096c3de, 0x00b167d5, 0x02bd63f5, 0x03cbf19c, 0x01286023, 0x00fd6627, 0x0205b1f5, 0x00fd7dd9, 0x023cb924, 0x00201329}}, Y: Field{[10]uint32{0x035233c6, 0x01c2c175, 0x01fd8431, 0x01b52722, 0x00865fab, 0x02bad13e, 0x038300ee, 0x00455a86, 0x0112eedb, 0x00000dca}}}, + {X: Field{[10]uint32{0x012a5365, 0x005da70b, 0x03bf58cc, 0x035c77a6, 0x0060b48e, 0x01598341, 0x018de870, 0x02a091ac, 0x006ab83c, 0x002c9e57}}, Y: Field{[10]uint32{0x0249d820, 0x0024d6ca, 0x0041f90d, 0x015e6f70, 0x01db6841, 0x021aa280, 0x03510441, 0x002dad34, 0x02b58853, 0x0019ba30}}}, + {X: Field{[10]uint32{0x02d9dad3, 0x0317814d, 0x02588208, 0x00ec640e, 0x00caf390, 0x001193ad, 0x0139d07c, 0x03645302, 0x004db61b, 0x0037ad4c}}, Y: Field{[10]uint32{0x015777ca, 0x0281aa53, 0x03b27762, 0x0360fdec, 0x0040507d, 0x039201cf, 0x00b62491, 0x0179d9a9, 0x0343e7e4, 0x00063553}}}, + {X: Field{[10]uint32{0x037714c4, 0x00f3aee6, 0x035cf774, 0x03a15d27, 0x01eb79d5, 0x00cd9a40, 0x0061d696, 0x03b0d2db, 0x0102d177, 0x000446fd}}, Y: Field{[10]uint32{0x016a4e54, 0x030e35da, 0x000f0bf8, 0x0083f99e, 0x0107d8ba, 0x0391e83c, 0x036bad45, 0x02ef33c0, 0x012abc38, 0x002fa035}}}, + {X: Field{[10]uint32{0x00be92a5, 0x006f4e37, 0x00f8b016, 0x01419d34, 0x01daceeb, 0x02e18e19, 0x014e71fd, 0x014e4fa3, 0x0343c15c, 0x00252c43}}, Y: Field{[10]uint32{0x01be6dc7, 0x02e6ddfd, 0x02e9bd25, 0x035fc682, 0x038d087d, 0x004161b3, 0x03f77291, 0x0230d96c, 0x032ea34e, 0x003b156b}}}, + {X: Field{[10]uint32{0x02895593, 0x007c6203, 0x02248d3b, 0x00b44051, 0x03fb4a42, 0x00b4c0da, 0x03e529d6, 0x01de1314, 0x03f22d44, 0x001189ea}}, Y: Field{[10]uint32{0x037b3e4a, 0x018140fa, 0x01c483a5, 0x03d31fa3, 0x00cbea9e, 0x01947a52, 0x00172d56, 0x02d66dce, 0x018d6110, 0x0022cd07}}}, + {X: Field{[10]uint32{0x017c355f, 0x02e91a0a, 0x02a80757, 0x02fb05ca, 0x03585dca, 0x037714c9, 0x035727b5, 0x03730dcd, 0x01cfdfea, 0x00067385}}, Y: Field{[10]uint32{0x01e60f81, 0x0333f613, 0x03a6625c, 0x01f816ce, 0x0283853e, 0x021b3bc9, 0x02ca9ec8, 0x024505cd, 0x015ece82, 0x00014195}}}, + {X: Field{[10]uint32{0x039a3e55, 0x0373f42a, 0x01ef0fe6, 0x00b85b4f, 0x01295068, 0x0387e45b, 0x03e97d80, 0x03f2ba30, 0x02818293, 0x001d6901}}, Y: Field{[10]uint32{0x008c7930, 0x01f45577, 0x01f22a04, 0x002fce7d, 0x03452678, 0x0254a62d, 0x039f2af4, 0x03893604, 0x01c0e02e, 0x0014a4b5}}}, + {X: Field{[10]uint32{0x033bf578, 0x03de6f07, 0x026f1cbb, 0x033a3cc8, 0x0388cb82, 0x03d29ccc, 0x03a341d4, 0x01da1ad1, 0x038def4b, 0x0029fae2}}, Y: Field{[10]uint32{0x018199a1, 0x03f24fef, 0x01cc880c, 0x028a1a19, 0x0124407c, 0x0129c962, 0x0352bf39, 0x015df2ce, 0x036fe238, 0x00217662}}}, + {X: Field{[10]uint32{0x03da647a, 0x024e37ac, 0x02c00e8a, 0x01114385, 0x016c9f83, 0x03067dae, 0x0352d143, 0x00759c2c, 0x02b5dcc9, 0x00296e68}}, Y: Field{[10]uint32{0x039571c1, 0x01cbca1e, 0x00c29634, 0x004ff45b, 0x0126fc4e, 0x009833fc, 0x0335aba1, 0x0011c590, 0x03a83985, 0x003c4b53}}}, + {X: Field{[10]uint32{0x00015cca, 0x00273211, 0x0217157c, 0x00c5e2b5, 0x01df58d8, 0x026c3f7d, 0x037c20ee, 0x02269977, 0x02ed48d5, 0x001e6671}}, Y: Field{[10]uint32{0x018f5756, 0x02dcc750, 0x010145bc, 0x003489d5, 0x00aaacaf, 0x034fc4b2, 0x00b3fecb, 0x030e8715, 0x01053706, 0x00055bd1}}}, + {X: Field{[10]uint32{0x009829b1, 0x02b4de71, 0x028e20fe, 0x0161b70b, 0x01422020, 0x030171eb, 0x01baade6, 0x03b746e1, 0x01f3b708, 0x00223fa0}}, Y: Field{[10]uint32{0x03727c01, 0x035035f7, 0x01b10d99, 0x03376a87, 0x008972a8, 0x0182814b, 0x00341502, 0x01f4aec5, 0x024fb04b, 0x003358b8}}}, + {X: Field{[10]uint32{0x03e86763, 0x015f57d3, 0x0264e895, 0x00dd421e, 0x01912165, 0x01a529df, 0x03192beb, 0x0187f908, 0x02b0cfcc, 0x00063ec3}}, Y: Field{[10]uint32{0x00169785, 0x00a3174e, 0x01922b1f, 0x038d548a, 0x0380f4a6, 0x03b61c75, 0x0288e230, 0x02d594e3, 0x031fdfe8, 0x000f3dca}}}, + {X: Field{[10]uint32{0x03d38aac, 0x006721bb, 0x00b660d9, 0x03ebad7f, 0x02004719, 0x02bc639d, 0x03171d5b, 0x03cb333f, 0x02312be4, 0x0036b6cc}}, Y: Field{[10]uint32{0x018bc0d7, 0x03d2cc3e, 0x039813d9, 0x00c31a9c, 0x0150e0b3, 0x02855112, 0x0340e423, 0x03a2f2c1, 0x005d752d, 0x002359e5}}}, + {X: Field{[10]uint32{0x039e5c8e, 0x015fc1a8, 0x039c2d80, 0x0271b070, 0x027b17e0, 0x038c416e, 0x03aa0cb0, 0x027d91ac, 0x00867cdd, 0x003c2e68}}, Y: Field{[10]uint32{0x02f4e9de, 0x032782d7, 0x01c81370, 0x000f052f, 0x003ff913, 0x020872ef, 0x01cf4319, 0x03460103, 0x025625e6, 0x000ad4d3}}}, + {X: Field{[10]uint32{0x02fcb7e0, 0x03efa2b0, 0x0132d406, 0x0199922e, 0x031cd601, 0x01cba350, 0x010e2536, 0x030e9f97, 0x03052e49, 0x00370382}}, Y: Field{[10]uint32{0x03b791d9, 0x0151f871, 0x01bea086, 0x03ce087f, 0x02223e7a, 0x02487892, 0x0139cb56, 0x01946933, 0x03868e1c, 0x003fe465}}}, + {X: Field{[10]uint32{0x02eb91ee, 0x02a9688c, 0x01038b74, 0x023c4604, 0x016bea74, 0x00571b29, 0x02c365b5, 0x03751cd7, 0x0298fb6d, 0x0039c72b}}, Y: Field{[10]uint32{0x01600266, 0x020af3c7, 0x0106ce66, 0x029ca007, 0x019ed731, 0x036f47d0, 0x03c5bc75, 0x0083db8b, 0x0018396c, 0x002012ba}}}, + {X: Field{[10]uint32{0x00ddfd8c, 0x01e4ad35, 0x03b9f88d, 0x01a081e6, 0x006b5d53, 0x02f4b29b, 0x0194d486, 0x0393fced, 0x01b2f7b2, 0x0014346d}}, Y: Field{[10]uint32{0x015cc744, 0x012f2213, 0x01f5b6e3, 0x039d0083, 0x015c554f, 0x02ae863f, 0x039b03f0, 0x0019821a, 0x00c518fa, 0x00155b3d}}}, + {X: Field{[10]uint32{0x002701aa, 0x00c8746f, 0x01747325, 0x021ad1c2, 0x00966348, 0x008fdb2d, 0x00c5e86f, 0x0365537e, 0x003e2bd5, 0x003021d0}}, Y: Field{[10]uint32{0x03507712, 0x028894a8, 0x00679003, 0x012f8ac0, 0x02258bc1, 0x03b61f81, 0x023a549e, 0x01cc001b, 0x0187d851, 0x00276d12}}}, + {X: Field{[10]uint32{0x016d6894, 0x003d45ef, 0x002b3798, 0x03d47a49, 0x014d45f8, 0x03da28a6, 0x00988fd3, 0x00d08b7a, 0x03f7f384, 0x0037440d}}, Y: Field{[10]uint32{0x01cccce1, 0x030646c9, 0x025f254f, 0x03395ac1, 0x021a9c08, 0x01cc24e9, 0x01ab8b76, 0x02f3762c, 0x01615cfb, 0x0032a39b}}}, + {X: Field{[10]uint32{0x00b5ceb4, 0x02731f4d, 0x01d1473a, 0x0295b026, 0x00424dfd, 0x0063dd93, 0x02840c3d, 0x01626fd2, 0x021967ca, 0x003788a6}}, Y: Field{[10]uint32{0x00122b22, 0x014456d5, 0x00be702d, 0x03046e3a, 0x00a1d352, 0x0391bfd1, 0x023f4b2a, 0x018ea50c, 0x01ca84ca, 0x002563f2}}}, + {X: Field{[10]uint32{0x00cdfd9c, 0x031fb881, 0x01cb1143, 0x03759ea3, 0x02f8a3a3, 0x0028d690, 0x0225f487, 0x0213e858, 0x03c9cc9d, 0x0000578c}}, Y: Field{[10]uint32{0x0260e920, 0x026e6cc1, 0x022562f8, 0x00571fcd, 0x02a59a1e, 0x01792b5a, 0x02058364, 0x033574d8, 0x0206ed48, 0x00104f00}}}, + {X: Field{[10]uint32{0x03d6bee0, 0x03902328, 0x00fc4394, 0x0266deac, 0x00dc010b, 0x02c86b8e, 0x023e3173, 0x01361cb4, 0x0161ca3c, 0x0014d089}}, Y: Field{[10]uint32{0x0103048e, 0x02ecfed8, 0x038b78de, 0x002e9c6e, 0x0020f2c5, 0x01e73872, 0x007c7ab7, 0x02427d94, 0x02e5e505, 0x001bba41}}}, + {X: Field{[10]uint32{0x0282b2fc, 0x00765ca6, 0x02a74a03, 0x0028245d, 0x020308bf, 0x0172dc72, 0x0000bbff, 0x013cdcca, 0x034f9b2c, 0x0020a773}}, Y: Field{[10]uint32{0x038483c4, 0x017dab97, 0x005d3352, 0x03101857, 0x01abe3f8, 0x03d621cf, 0x0249d3c9, 0x014e2938, 0x0200429e, 0x0011cde0}}}, + {X: Field{[10]uint32{0x02e911e5, 0x039970e2, 0x00ebe450, 0x02e8757d, 0x01c05594, 0x033fe5fc, 0x023b989a, 0x02c6c524, 0x02b73769, 0x003b5bdb}}, Y: Field{[10]uint32{0x02c38eb4, 0x01403868, 0x03fbe18e, 0x02768dcb, 0x01d52e2d, 0x027fd886, 0x018cd0b6, 0x02136e2e, 0x032f3fe5, 0x0037fb9b}}}, + {X: Field{[10]uint32{0x00455503, 0x009c8170, 0x013da303, 0x02fb2d24, 0x0370616e, 0x03cac612, 0x00d1982d, 0x01c83a3f, 0x03981fbe, 0x0011f948}}, Y: Field{[10]uint32{0x02f3e900, 0x038bd2ae, 0x012515ea, 0x02e1b118, 0x00179f4c, 0x0378379c, 0x020cfbd1, 0x030c3da0, 0x00ebf360, 0x002bf4b7}}}, + {X: Field{[10]uint32{0x01037312, 0x037812ea, 0x010df49f, 0x02a304f7, 0x00ba10e2, 0x017a2039, 0x03f1170f, 0x0387e1bc, 0x03d58f48, 0x002c0a4d}}, Y: Field{[10]uint32{0x00c18c4f, 0x034f1e8a, 0x03cf5347, 0x0093da32, 0x038a6c79, 0x00d5785f, 0x02de5805, 0x021158c5, 0x024f3e4c, 0x000372c2}}}, + {X: Field{[10]uint32{0x001989f8, 0x015ff43b, 0x025d44ee, 0x03af7f71, 0x03878486, 0x00f019ba, 0x0010c2dc, 0x03070c97, 0x00f53578, 0x0027e64f}}, Y: Field{[10]uint32{0x01c8bb52, 0x00ece18c, 0x0275d914, 0x01bc34e0, 0x01e83eda, 0x03986ebe, 0x026ea432, 0x02047359, 0x000b16b8, 0x0031ae35}}}, + {X: Field{[10]uint32{0x013240e6, 0x03e6e277, 0x0284e599, 0x0213cdbf, 0x01ce4317, 0x037f4743, 0x02730edb, 0x03b077c4, 0x00c25913, 0x00250edb}}, Y: Field{[10]uint32{0x03ed3fd0, 0x01dd2093, 0x0316d09f, 0x03ffead6, 0x029604d3, 0x0153bd56, 0x02d7ca32, 0x03fcff50, 0x02bacac2, 0x00396040}}}, + {X: Field{[10]uint32{0x01acfe0a, 0x02fcbc06, 0x00a6481f, 0x033d1fd6, 0x0059511d, 0x01ed69f2, 0x0043da4f, 0x03e7b146, 0x027e69b3, 0x00026c39}}, Y: Field{[10]uint32{0x01c54dd8, 0x00274c3b, 0x01c674a0, 0x00dbdf92, 0x022e074c, 0x01cccf29, 0x02defc7d, 0x03b2d338, 0x002817a4, 0x001a9377}}}, + {X: Field{[10]uint32{0x00571651, 0x03a19ce9, 0x03acc72a, 0x02d004da, 0x020c8246, 0x012329b9, 0x03b0fd40, 0x03463e30, 0x02339cd8, 0x0025f73b}}, Y: Field{[10]uint32{0x00e693e4, 0x00b4b49d, 0x03d510d8, 0x01192208, 0x0229b952, 0x0224cf71, 0x02e36cfc, 0x02fce62a, 0x0205cc20, 0x001858e8}}}, + {X: Field{[10]uint32{0x02292ced, 0x027fdeb4, 0x00267299, 0x003cadf7, 0x02798c94, 0x01286e80, 0x02a9c26f, 0x007b69f3, 0x02f92696, 0x00287979}}, Y: Field{[10]uint32{0x00d5f19d, 0x0234c6c2, 0x00fbeca1, 0x03e4ee7a, 0x03cfc07a, 0x01b65d95, 0x01384013, 0x003dd3b4, 0x037a6a71, 0x001409d2}}}, + {X: Field{[10]uint32{0x034884a9, 0x0210a596, 0x021a61a9, 0x02c61020, 0x001c21bd, 0x03f1dc60, 0x03c9bdc6, 0x0377f14b, 0x03cf7cdf, 0x0011cf57}}, Y: Field{[10]uint32{0x03d856af, 0x01f16c63, 0x02250eba, 0x03afa2f9, 0x0389ff95, 0x0320b656, 0x032d7036, 0x03d543fa, 0x02a70ad7, 0x000d220d}}}, + {X: Field{[10]uint32{0x0396f613, 0x0147a851, 0x009d454c, 0x004caec5, 0x00db8c1e, 0x00151326, 0x00c33b27, 0x02cb413f, 0x00427384, 0x0027061d}}, Y: Field{[10]uint32{0x00ae0a19, 0x00fdfd7f, 0x0342b791, 0x00d831c4, 0x02c1825d, 0x02573bee, 0x0212e475, 0x0001e4f6, 0x0043970f, 0x000b5b7b}}}, + {X: Field{[10]uint32{0x0162b154, 0x029aa981, 0x0351e0c7, 0x00a57d6f, 0x02ed63c7, 0x039d0392, 0x002d826b, 0x038afedd, 0x00469150, 0x00047387}}, Y: Field{[10]uint32{0x034fa33d, 0x02da9887, 0x00271aa3, 0x0232bca9, 0x0267f3b2, 0x03a2df64, 0x01f8b93b, 0x00a03eaf, 0x014fea38, 0x001ba194}}}, + {X: Field{[10]uint32{0x01656042, 0x0297159e, 0x031cd4d9, 0x01c52eb3, 0x03dde2fd, 0x0234731b, 0x013c3541, 0x0379bca2, 0x0104e4e2, 0x000780de}}, Y: Field{[10]uint32{0x00960755, 0x03a06963, 0x0221b462, 0x0214f007, 0x023c81ac, 0x002bc0d7, 0x028aa38a, 0x01a084a8, 0x01c934c2, 0x0006edd6}}}, + {X: Field{[10]uint32{0x00071d82, 0x007669f0, 0x02800995, 0x0178c731, 0x003f8d50, 0x03e78d88, 0x0294f240, 0x0266abc6, 0x006723f8, 0x0014bf25}}, Y: Field{[10]uint32{0x00bd6dbb, 0x0065a5f4, 0x039db924, 0x02cd2ce8, 0x0239c909, 0x01c2d1ee, 0x00dfb992, 0x00208083, 0x02e07543, 0x000118ca}}}, + {X: Field{[10]uint32{0x0242b20d, 0x027600c1, 0x02a4ff9e, 0x02d35e37, 0x0235069e, 0x025bd4e1, 0x00f9e394, 0x00672c85, 0x01059975, 0x0032d616}}, Y: Field{[10]uint32{0x0093ac7d, 0x038e44fb, 0x02d45064, 0x03cd6643, 0x007131b2, 0x038b5794, 0x02a0f51c, 0x01d68790, 0x02e7a5b4, 0x0006e7d0}}}, + {X: Field{[10]uint32{0x00a69c46, 0x02b803ed, 0x03a12cec, 0x00368471, 0x03e7ab18, 0x034def34, 0x03275845, 0x011561d5, 0x005729f1, 0x000e0b0a}}, Y: Field{[10]uint32{0x00039440, 0x03079f95, 0x008e4a25, 0x028f82c9, 0x03495907, 0x03c4a1a4, 0x02586843, 0x003ecdb8, 0x011220a7, 0x0032c9fa}}}, + {X: Field{[10]uint32{0x034e5024, 0x03b2e213, 0x0164b6dc, 0x00fecbe5, 0x02a4dd61, 0x02cce9a4, 0x00456dce, 0x0039263e, 0x02c6c285, 0x0005bc21}}, Y: Field{[10]uint32{0x039339a9, 0x03bbfb49, 0x01df312d, 0x033b26b5, 0x0073cb5e, 0x0169940d, 0x008ca682, 0x004620d1, 0x020888eb, 0x000b854a}}}, + {X: Field{[10]uint32{0x01a02492, 0x03585dd9, 0x009506ee, 0x007d99cc, 0x014439a5, 0x011ba89d, 0x030f0ae4, 0x00d5dd54, 0x011b1f0a, 0x001d626f}}, Y: Field{[10]uint32{0x00462d49, 0x0365d966, 0x0389c00a, 0x030d8c30, 0x0004076f, 0x00534d8d, 0x01771bb0, 0x02054c79, 0x0212d375, 0x000b6103}}}, + {X: Field{[10]uint32{0x00930890, 0x00c9bd35, 0x004469a0, 0x03d689ad, 0x01a80cc5, 0x030efbba, 0x02dbd2b0, 0x00e944f7, 0x0240cce6, 0x00062e6b}}, Y: Field{[10]uint32{0x022690e4, 0x0293ae4a, 0x0118acf6, 0x035e382b, 0x039e0032, 0x02c9c342, 0x03571382, 0x00f111c6, 0x024dd5ed, 0x00092e1a}}}, + {X: Field{[10]uint32{0x03ebb48a, 0x03a2a2b4, 0x009a4ccf, 0x01b840b2, 0x0394e9ba, 0x012fa189, 0x030db5d1, 0x007bd900, 0x00a4acc7, 0x002307dd}}, Y: Field{[10]uint32{0x0245677a, 0x02c59ce4, 0x01c9416e, 0x00664b57, 0x021af1c1, 0x022c9b21, 0x03ba735c, 0x0294a478, 0x011998ae, 0x0029e7c0}}}, + {X: Field{[10]uint32{0x02bfb080, 0x00b080f0, 0x010465cd, 0x00223b1f, 0x002c0fca, 0x000e096d, 0x0157ba0d, 0x02aadd6d, 0x012d36bf, 0x00236016}}, Y: Field{[10]uint32{0x0151d3f6, 0x02d19bc0, 0x03a51859, 0x01504335, 0x027671a6, 0x014cff4a, 0x00a1bd4a, 0x01d14d34, 0x008791f2, 0x000f91e5}}}, + {X: Field{[10]uint32{0x030ca248, 0x0095d959, 0x02770f71, 0x03a78114, 0x03f36782, 0x00b159dd, 0x005046cf, 0x038563b2, 0x0319f477, 0x003aac2e}}, Y: Field{[10]uint32{0x00c04640, 0x01d3329f, 0x01ebd700, 0x0190fc62, 0x0337f0bd, 0x00ae81c7, 0x0355e563, 0x00ebd36b, 0x00812309, 0x00289f5c}}}, + {X: Field{[10]uint32{0x020a039c, 0x00cb1a8a, 0x0399bdb5, 0x00776d21, 0x0109647e, 0x0149833a, 0x03b249fd, 0x00be89b4, 0x01c9ebbb, 0x003fc343}}, Y: Field{[10]uint32{0x02b31fa9, 0x00e50bbe, 0x010233c4, 0x03d59884, 0x02fad5b0, 0x0366dd82, 0x01c35055, 0x007e2f38, 0x02ae7f16, 0x0004ac3d}}}, + {X: Field{[10]uint32{0x0037d526, 0x00aaa58e, 0x030ad42a, 0x0080fb9a, 0x02be22b3, 0x02c22def, 0x03403468, 0x02f46e48, 0x023571db, 0x0036268c}}, Y: Field{[10]uint32{0x02e3cf27, 0x02dd084d, 0x03b62146, 0x0241551b, 0x03db4a04, 0x039bdbc7, 0x008124d9, 0x03c59cc4, 0x01b99988, 0x0009768d}}}, + {X: Field{[10]uint32{0x025b43fd, 0x013004a4, 0x00a229ec, 0x0055574d, 0x0313ffb3, 0x019d47df, 0x03cdafa8, 0x02acb10c, 0x023bf01c, 0x003c5400}}, Y: Field{[10]uint32{0x02c7a9cc, 0x030f4cce, 0x03f341a9, 0x01a881ca, 0x038ac37a, 0x01ea7920, 0x00966b71, 0x032259b7, 0x0221026a, 0x000c7dc3}}}, + {X: Field{[10]uint32{0x003af2a8, 0x03b80672, 0x0070d9b3, 0x032382d1, 0x0276f442, 0x030b3436, 0x02e9d5e2, 0x0025e1ca, 0x013b2d58, 0x003663af}}, Y: Field{[10]uint32{0x01dba3f5, 0x005f249d, 0x00823e00, 0x01629453, 0x00930fb3, 0x029b1c89, 0x03f9873d, 0x0065c0d2, 0x02a95a06, 0x0027b56d}}}, + {X: Field{[10]uint32{0x03c3c746, 0x03ec06f2, 0x01827583, 0x00efe9df, 0x02817353, 0x03cf2a05, 0x002e313d, 0x0253bb7f, 0x0185833a, 0x00156d8b}}, Y: Field{[10]uint32{0x024a835c, 0x02b4444d, 0x0189715b, 0x02fd1320, 0x011f4dbb, 0x0269e84e, 0x01eb9211, 0x016bdede, 0x03730cb9, 0x0027e121}}}, + {X: Field{[10]uint32{0x01718de6, 0x003fb3ef, 0x021ca286, 0x01268a9e, 0x00ec759c, 0x01b070ff, 0x0069de8f, 0x00fe4d13, 0x0176fef7, 0x0037ebd3}}, Y: Field{[10]uint32{0x025a0671, 0x034c509c, 0x01971357, 0x0054656f, 0x017fba1f, 0x00db64fb, 0x0009f94c, 0x030a1fd9, 0x029344e2, 0x002b12bd}}}, + {X: Field{[10]uint32{0x01fe29da, 0x01fcf9b1, 0x00bf838b, 0x00f16043, 0x03a7839f, 0x005bb88a, 0x0020f29a, 0x0248b0dd, 0x00a34510, 0x00212911}}, Y: Field{[10]uint32{0x0114f06a, 0x02615404, 0x0175fa18, 0x01c032fe, 0x026e89af, 0x01cc1a7f, 0x03f420a6, 0x0304b850, 0x01802215, 0x003bdccf}}}, + {X: Field{[10]uint32{0x032212af, 0x006a94e9, 0x02548629, 0x01260e24, 0x032c3377, 0x025a0468, 0x01d24d12, 0x01c020f7, 0x021146c8, 0x0035f213}}, Y: Field{[10]uint32{0x00844ac4, 0x03350184, 0x01745f84, 0x0344135e, 0x019579b2, 0x0202bb18, 0x01357e54, 0x0102f70f, 0x0158a3be, 0x002c61f7}}}, + {X: Field{[10]uint32{0x0198051d, 0x03a9e215, 0x02a069ff, 0x02d5c68b, 0x00c7fca4, 0x01d41cb3, 0x029f6165, 0x0022fbce, 0x027fa70b, 0x003f7b70}}, Y: Field{[10]uint32{0x03b9bf9a, 0x0118a901, 0x01fbb3ec, 0x01379c91, 0x0253f6f5, 0x029fd378, 0x014d279b, 0x016a780d, 0x031a1c57, 0x003fa6de}}}, + {X: Field{[10]uint32{0x03122e77, 0x0171e57b, 0x039a5c2d, 0x0141365a, 0x03f950c2, 0x01610dec, 0x0022b350, 0x0331aa48, 0x038ad3f2, 0x0033e9d1}}, Y: Field{[10]uint32{0x021409c4, 0x02516c89, 0x023bb158, 0x0028f6a1, 0x022ad780, 0x03f7530b, 0x00f8eedf, 0x00a0d4d5, 0x01cae959, 0x003cf923}}}, + {X: Field{[10]uint32{0x020eefe2, 0x01f73a3b, 0x023f8033, 0x02f36377, 0x02aa1584, 0x01d9e3f3, 0x03b7493d, 0x00825dc3, 0x03f83fd6, 0x0023a455}}, Y: Field{[10]uint32{0x0205351b, 0x027ce94e, 0x0188ac8d, 0x016913ea, 0x003322fb, 0x02d2c8a7, 0x00f91df4, 0x037edae9, 0x02898c05, 0x00181e6e}}}, + {X: Field{[10]uint32{0x03116f75, 0x022e4a00, 0x01dfdbea, 0x03f1a9fe, 0x029d422f, 0x02f77fc8, 0x00eb80a9, 0x02b0c3b1, 0x03b6103e, 0x001efd7b}}, Y: Field{[10]uint32{0x03a71a3b, 0x00e24c4e, 0x03e67ba1, 0x0130d54f, 0x012cba4b, 0x015e5850, 0x01355542, 0x007b7f96, 0x02596479, 0x003beb6d}}}, + {X: Field{[10]uint32{0x00e8df0b, 0x009e0834, 0x0153e85f, 0x03f22747, 0x01690a13, 0x01da5c1e, 0x007b1b53, 0x030b49a3, 0x02b7b7b2, 0x003d6e80}}, Y: Field{[10]uint32{0x02465485, 0x03c54567, 0x013a3af7, 0x01930f1e, 0x00a9266b, 0x034b510c, 0x00329d19, 0x003906ff, 0x0126b264, 0x00198c5b}}}, + {X: Field{[10]uint32{0x03004475, 0x01262fff, 0x008284a1, 0x0297c494, 0x0387c10d, 0x008a547e, 0x02bc3dbf, 0x029325b4, 0x01f3dcec, 0x0017aab3}}, Y: Field{[10]uint32{0x011f122d, 0x0094652b, 0x02106c8c, 0x00425dfa, 0x00b38f58, 0x020c7341, 0x0185d404, 0x0338245a, 0x03ed9721, 0x0032cf6c}}}, + {X: Field{[10]uint32{0x024a5554, 0x0169da29, 0x01e4177c, 0x02fd3e8b, 0x01d1320a, 0x03544cdc, 0x0152ba6a, 0x0044d14d, 0x0017b8d6, 0x00073f97}}, Y: Field{[10]uint32{0x011dcd5d, 0x03a91aff, 0x008945ed, 0x039801e8, 0x0099bcab, 0x00c67dd0, 0x024a2f7e, 0x02e21c79, 0x00f64846, 0x0014e0df}}}, + {X: Field{[10]uint32{0x025dbc10, 0x007c28de, 0x028805e2, 0x02ed1391, 0x02286f47, 0x004843ef, 0x0091dd2a, 0x03321873, 0x03478a2c, 0x0024aa0f}}, Y: Field{[10]uint32{0x0199de94, 0x03d53d72, 0x01043684, 0x03e43b0d, 0x000cb69f, 0x006604cb, 0x0270b8bc, 0x016c0be0, 0x0065fcd4, 0x003fb8d7}}}, + {X: Field{[10]uint32{0x02d277d3, 0x012ada72, 0x01dd14f7, 0x034c92fd, 0x0173c07a, 0x00d6f6de, 0x0186ea10, 0x00e6c3d3, 0x01bad5d5, 0x0005c8a1}}, Y: Field{[10]uint32{0x02ada654, 0x0308be6a, 0x00897314, 0x0100a22d, 0x02cfc290, 0x03b8f883, 0x03afa15c, 0x018d9382, 0x0140cf35, 0x00116afe}}}, + {X: Field{[10]uint32{0x03164762, 0x01badcf2, 0x0032c764, 0x0204e817, 0x013126ce, 0x03e45637, 0x014ae08b, 0x026eae15, 0x015392e1, 0x002b45ef}}, Y: Field{[10]uint32{0x01065586, 0x0115d323, 0x01b94e16, 0x014625be, 0x038139c6, 0x0275c353, 0x01d4f47d, 0x00e61ddd, 0x00191c83, 0x000284a6}}}, + {X: Field{[10]uint32{0x02bdeb1c, 0x01f2cc4b, 0x00a12526, 0x001f1019, 0x03c23fd3, 0x00f94470, 0x02ce9e91, 0x02a2707d, 0x033e91a4, 0x00041086}}, Y: Field{[10]uint32{0x02a53319, 0x0164a18e, 0x03cc1923, 0x00036b1d, 0x03985697, 0x01cc4632, 0x02b8a510, 0x03c3f461, 0x01d09e49, 0x0014e6ed}}}, + {X: Field{[10]uint32{0x01de5bfd, 0x00d6c188, 0x030ff397, 0x03787838, 0x012e8476, 0x0198caa9, 0x039eba60, 0x00a8f772, 0x00fa7815, 0x00310eb7}}, Y: Field{[10]uint32{0x00abdebf, 0x00469567, 0x018801a9, 0x0389815f, 0x031e81c6, 0x036b2ede, 0x03d04f05, 0x01602e11, 0x01ca2122, 0x001b7742}}}, + {X: Field{[10]uint32{0x00bf9a73, 0x036401a6, 0x0227b5c8, 0x00764aab, 0x0014434f, 0x0279f662, 0x02b9e50d, 0x01634131, 0x00cb603a, 0x003dea67}}, Y: Field{[10]uint32{0x031a7ccb, 0x00e9df69, 0x01b0878a, 0x01332bf2, 0x005e6293, 0x032dd04c, 0x02d68091, 0x00e4eba5, 0x024476f4, 0x003337f0}}}, + {X: Field{[10]uint32{0x0209c826, 0x01d6f9c3, 0x01aacb31, 0x005a7492, 0x02f602d5, 0x028b2a6f, 0x038f44f4, 0x013a8d40, 0x01bf7017, 0x0026af25}}, Y: Field{[10]uint32{0x03adfe0c, 0x00663835, 0x03763617, 0x036d32ad, 0x0222a9fe, 0x0233b6b2, 0x027d2c9f, 0x03e28f50, 0x02ed3e71, 0x001b3ef3}}}, + {X: Field{[10]uint32{0x005d8d82, 0x02ee7b57, 0x035c5546, 0x03f03414, 0x03d7bd08, 0x0124f273, 0x034af06b, 0x0121cfb2, 0x009335c8, 0x00229f2a}}, Y: Field{[10]uint32{0x01e31bc1, 0x000064c8, 0x005ba07b, 0x03fb4bca, 0x01209ae3, 0x010511e6, 0x031ee4e5, 0x00f021cb, 0x0372090d, 0x0009462c}}}, + {X: Field{[10]uint32{0x024d1c3e, 0x032489e9, 0x03b79ff1, 0x0373091b, 0x02b39fdb, 0x018be352, 0x01182fd8, 0x018a365a, 0x03798649, 0x001c3238}}, Y: Field{[10]uint32{0x02ea3cbb, 0x0038c849, 0x0386f7f5, 0x005d3bf6, 0x03936c95, 0x03558823, 0x0297d9ef, 0x00292bb0, 0x02d527ec, 0x0031e4c6}}}, + {X: Field{[10]uint32{0x01002121, 0x00b58a0c, 0x0076b957, 0x039f0616, 0x00934a82, 0x012023f7, 0x01dcf61b, 0x007b81c7, 0x02b40612, 0x0035e0fd}}, Y: Field{[10]uint32{0x029c7fbb, 0x007662d7, 0x0262ca03, 0x0055a52e, 0x0028b3ed, 0x02699226, 0x0107c82b, 0x01a52678, 0x01841422, 0x002aa4af}}}, + {X: Field{[10]uint32{0x03654c18, 0x01f939de, 0x007581a1, 0x025671de, 0x02b75927, 0x03aa3931, 0x01ffbb87, 0x02d0eb2b, 0x021c29ab, 0x00307c1a}}, Y: Field{[10]uint32{0x03ecdbf0, 0x006497be, 0x005476cd, 0x01c2a906, 0x03bc1024, 0x03968263, 0x01b0e7d9, 0x010b3eae, 0x01e2f1db, 0x00076b83}}}, + {X: Field{[10]uint32{0x02cc5105, 0x01f98b94, 0x0072487b, 0x009d21a6, 0x02d1498a, 0x0085c998, 0x02633ea3, 0x02d61e19, 0x02113205, 0x000ab5d3}}, Y: Field{[10]uint32{0x00ff779e, 0x01176834, 0x02e105de, 0x01652e2f, 0x02b5c851, 0x01d5720e, 0x01aa7d30, 0x0287f589, 0x0107de1f, 0x0031c31d}}}, + {X: Field{[10]uint32{0x037408b6, 0x00025e35, 0x01ac03d8, 0x015dd2b2, 0x03a9e32b, 0x01c713d5, 0x0374e233, 0x01a919ba, 0x01ad7224, 0x003d243a}}, Y: Field{[10]uint32{0x01dc3d6a, 0x003c06aa, 0x01fb963a, 0x006a2d12, 0x0377e49a, 0x03096141, 0x02ef15e4, 0x005a1ee9, 0x027f8fdd, 0x00151bcd}}}, + {X: Field{[10]uint32{0x001d6149, 0x008cdce6, 0x030553f1, 0x03143781, 0x0280c431, 0x017e2ecc, 0x01788b05, 0x02da5f81, 0x00918357, 0x0008140a}}, Y: Field{[10]uint32{0x028e3b0d, 0x01aaf411, 0x02777796, 0x016d71de, 0x019489ee, 0x0214bf42, 0x01a67712, 0x00388963, 0x00e54411, 0x000e7410}}}, + {X: Field{[10]uint32{0x006eae95, 0x0007acbe, 0x005d1bb0, 0x026780e3, 0x02e4b782, 0x0137a4a5, 0x0359915d, 0x028e8fbb, 0x038ec169, 0x001ba46e}}, Y: Field{[10]uint32{0x00877dfd, 0x0252e8a0, 0x008872ae, 0x03574823, 0x0045305d, 0x0227eb12, 0x0034063a, 0x0327c459, 0x029788f8, 0x0034b084}}}, + {X: Field{[10]uint32{0x03a34905, 0x01e2ec5a, 0x02a01906, 0x02ea79f7, 0x0339e7d0, 0x00796b54, 0x00d0d2fe, 0x0102c184, 0x03c839fc, 0x0033ca51}}, Y: Field{[10]uint32{0x0337c63d, 0x00502c8f, 0x007baaec, 0x01a84c7b, 0x018db00f, 0x01cba1d7, 0x0358d7b1, 0x0354fc35, 0x030f7f0c, 0x00185169}}}, + {X: Field{[10]uint32{0x022366f1, 0x01861d3e, 0x02864ad1, 0x0306b0f1, 0x001c8db1, 0x02b4ca8a, 0x01c9b010, 0x029b2158, 0x0387ea93, 0x002d23e0}}, Y: Field{[10]uint32{0x022d253c, 0x00c5749e, 0x0276b375, 0x02077e10, 0x009f46bd, 0x018273f2, 0x03d971b3, 0x01f4f89b, 0x0333cbe0, 0x0000b2ac}}}, + {X: Field{[10]uint32{0x02a1f827, 0x007b6850, 0x0315ef39, 0x013a0515, 0x0030f605, 0x025bf50f, 0x00ae58c6, 0x00b4d393, 0x03660c57, 0x001f12d7}}, Y: Field{[10]uint32{0x01843d97, 0x034cab66, 0x033b008e, 0x02b57e53, 0x02d0adc2, 0x01848cb0, 0x007c5fcc, 0x016bc0e4, 0x024fbe12, 0x000f2f89}}}, + {X: Field{[10]uint32{0x010d86e8, 0x02a17821, 0x02567378, 0x0147d756, 0x018fe24e, 0x01e1d636, 0x027f9890, 0x02786588, 0x0368d464, 0x00395e58}}, Y: Field{[10]uint32{0x02c9d4a7, 0x030d53bd, 0x0089646e, 0x02e35982, 0x021fa111, 0x01e9f92f, 0x02880bf6, 0x0244a26b, 0x0343c9a6, 0x0001d2ec}}}, + {X: Field{[10]uint32{0x004d637f, 0x00ae963f, 0x016509f0, 0x00994f1f, 0x0167c1ab, 0x038f2976, 0x01b88416, 0x03a7bf06, 0x025efe83, 0x0037e841}}, Y: Field{[10]uint32{0x00a5042d, 0x020fbb43, 0x00a231ec, 0x00668aa8, 0x02e23fdf, 0x021794d4, 0x0270e046, 0x00dee8bc, 0x0167eb02, 0x00008b49}}}, + {X: Field{[10]uint32{0x028af132, 0x01ecdea4, 0x01f2f234, 0x01133c4c, 0x008f4638, 0x039c42e0, 0x01a3ce98, 0x030cca3f, 0x00aad436, 0x000ba876}}, Y: Field{[10]uint32{0x0298dc4c, 0x0187cc43, 0x004328fc, 0x0081e80d, 0x0213ff96, 0x033ca92c, 0x00a243cc, 0x02b44160, 0x020fb8c2, 0x000cfe9f}}}, + {X: Field{[10]uint32{0x0167253f, 0x01477975, 0x031b4c0a, 0x01b3e2a4, 0x03ab6a97, 0x039677cd, 0x008298b5, 0x02bcfe9e, 0x00518122, 0x0004ab85}}, Y: Field{[10]uint32{0x0124877d, 0x034c6807, 0x015a7926, 0x02bad555, 0x021c3ff9, 0x038fc296, 0x02fa7329, 0x0074bb78, 0x01d2b327, 0x00217fc7}}}, + {X: Field{[10]uint32{0x01bf6619, 0x01164c25, 0x00270856, 0x03bd57be, 0x03125579, 0x03b1d68e, 0x02b84fed, 0x02bc6a9c, 0x01efb588, 0x003f51b8}}, Y: Field{[10]uint32{0x03a51b17, 0x01f2dec9, 0x01ea40f5, 0x01eba071, 0x03342e6b, 0x01ce8abf, 0x007d477c, 0x00a4bd83, 0x006eceb6, 0x00341ab7}}}, + {X: Field{[10]uint32{0x0332b52b, 0x024342df, 0x01e614a2, 0x011ac5cb, 0x01c7a179, 0x02f88ab3, 0x009e1bf0, 0x0347bc71, 0x013eb8c0, 0x0003b5f6}}, Y: Field{[10]uint32{0x02303ada, 0x0233a7ec, 0x02246f36, 0x02129a33, 0x02b55522, 0x010aafac, 0x036668a7, 0x0070ebe3, 0x030a39a8, 0x001343b0}}}, + {X: Field{[10]uint32{0x029619ef, 0x0022db43, 0x034dc9d8, 0x004cd893, 0x01585179, 0x01d701b7, 0x02bda814, 0x01e69a7f, 0x03a5cd0e, 0x003f33f7}}, Y: Field{[10]uint32{0x010adf49, 0x009106b7, 0x015139bd, 0x012b5838, 0x02ec6232, 0x024aa58d, 0x01959c69, 0x026fb7e2, 0x000d11d0, 0x001e6e41}}}, + {X: Field{[10]uint32{0x034ac477, 0x02955912, 0x00010a57, 0x029c8ad1, 0x0316823e, 0x02f1c532, 0x02044b27, 0x026bfb4a, 0x02b86a9b, 0x0020c5d8}}, Y: Field{[10]uint32{0x0156c708, 0x005a7926, 0x02ff69c3, 0x0372989a, 0x032754c1, 0x02137f5d, 0x00b3f77f, 0x02ff72d2, 0x00628ef3, 0x00051eb8}}}, + {X: Field{[10]uint32{0x02f26b01, 0x00ee6753, 0x02fb3490, 0x0187c995, 0x01f92cc4, 0x03f8333e, 0x0370adbb, 0x014c0f23, 0x0001a84d, 0x000cd123}}, Y: Field{[10]uint32{0x03b8f2ff, 0x03a9507f, 0x0095f736, 0x00f1bf5f, 0x02208ad0, 0x03b9fe41, 0x00a82840, 0x02e98723, 0x03490ae8, 0x00395c9c}}}, + {X: Field{[10]uint32{0x03d215a6, 0x01533081, 0x024a2482, 0x036ac66c, 0x0160df85, 0x003aebdb, 0x03ccb8c5, 0x004c1055, 0x02616ddf, 0x00248284}}, Y: Field{[10]uint32{0x028d0f4e, 0x028f283c, 0x02e369f1, 0x00738313, 0x03e2cb67, 0x02a302e5, 0x02f7a11c, 0x03a240f4, 0x00f9cc91, 0x00067935}}}, + {X: Field{[10]uint32{0x036b1ba4, 0x03f98b94, 0x026b7fca, 0x029712e4, 0x01458385, 0x02eb0971, 0x020ac00c, 0x002e70fd, 0x021d3e37, 0x00077e33}}, Y: Field{[10]uint32{0x0099a92b, 0x039f9814, 0x01083533, 0x03d6f1c0, 0x023fcbab, 0x01ca4253, 0x02f61602, 0x0141e54a, 0x006ee363, 0x000d137d}}}, + {X: Field{[10]uint32{0x038b7b72, 0x02ca2074, 0x013b6286, 0x03236036, 0x022e2243, 0x00de8149, 0x0018175c, 0x009ae04f, 0x007dabfe, 0x001c89e1}}, Y: Field{[10]uint32{0x03973d24, 0x02622e29, 0x03364622, 0x0104311a, 0x0128b5aa, 0x0185973e, 0x0289c934, 0x00f37654, 0x01eb33da, 0x002fb79e}}}, + {X: Field{[10]uint32{0x03f7fb8d, 0x027ca4bb, 0x01995972, 0x013c9b63, 0x003caff7, 0x03321041, 0x02571f8c, 0x022feac0, 0x0259e121, 0x001b7bee}}, Y: Field{[10]uint32{0x00340a04, 0x025aa353, 0x001a6956, 0x00156487, 0x002c188c, 0x034d39df, 0x03770d1b, 0x03ef165b, 0x028e21f2, 0x00135eea}}}, + {X: Field{[10]uint32{0x002d6bd3, 0x00581478, 0x020f990b, 0x006ad8c6, 0x0208302e, 0x02b7d4ef, 0x031ae022, 0x01f491ac, 0x00eff512, 0x003199fd}}, Y: Field{[10]uint32{0x02d34cf5, 0x00312936, 0x032373e8, 0x00f549eb, 0x02f8de28, 0x01f5d1a8, 0x00d822c3, 0x02f7dbf5, 0x0276ce11, 0x000f5ef3}}}, + {X: Field{[10]uint32{0x0229d866, 0x00b1cbf3, 0x03d2355c, 0x02e39aec, 0x006fbca1, 0x00e8aac0, 0x00dcc242, 0x0083d664, 0x02744416, 0x003b67a1}}, Y: Field{[10]uint32{0x0006ad30, 0x01f08a96, 0x021a5829, 0x01c47b0d, 0x027c03dd, 0x0024c37b, 0x01a12f33, 0x0268aee0, 0x019bb428, 0x0019357b}}}, + {X: Field{[10]uint32{0x0176fb24, 0x03ae630c, 0x02ea0b0e, 0x03bab114, 0x03219e57, 0x018d13bc, 0x0000b256, 0x033b80cf, 0x0057e6b0, 0x0021a8db}}, Y: Field{[10]uint32{0x02fff739, 0x03a36cfa, 0x02f25135, 0x00f9e686, 0x01b147b4, 0x02564ad7, 0x01038748, 0x01637d38, 0x01da9e9b, 0x002d3d2f}}}, + {X: Field{[10]uint32{0x00cca913, 0x0248a02f, 0x00e04337, 0x0208779c, 0x01fd02bf, 0x0285478f, 0x02105acb, 0x01bfce83, 0x03844539, 0x000b88dd}}, Y: Field{[10]uint32{0x03148551, 0x01c5b0d9, 0x0304fc0b, 0x03728cd8, 0x00f43726, 0x02ef3241, 0x00464c43, 0x020fc184, 0x039ce779, 0x003dcd94}}}, + {X: Field{[10]uint32{0x00a1390f, 0x027e6008, 0x028c1689, 0x021eb0b5, 0x009db88a, 0x00682f00, 0x026dbcf1, 0x0364d948, 0x014c7790, 0x003334f0}}, Y: Field{[10]uint32{0x003af907, 0x037f75c7, 0x00a6781c, 0x02a01f7c, 0x00f8a9cb, 0x006264c8, 0x03bac2af, 0x017767cc, 0x035fbd6d, 0x002c902c}}}, + {X: Field{[10]uint32{0x0237b018, 0x033361cd, 0x021b217b, 0x02b6e09d, 0x01eba4ef, 0x015625e3, 0x006566d0, 0x035ec71b, 0x027f0988, 0x001dc4ef}}, Y: Field{[10]uint32{0x00475781, 0x02cd309d, 0x03d9470d, 0x039993b9, 0x01c75f31, 0x017eacd0, 0x02ef7c51, 0x00aea8bb, 0x026fa9d6, 0x0023ee46}}}, + {X: Field{[10]uint32{0x00982b02, 0x0199eea9, 0x0398b1ab, 0x03fc7165, 0x0134c739, 0x02c21573, 0x020acf56, 0x032cee54, 0x0160035d, 0x0015216b}}, Y: Field{[10]uint32{0x02a90f0f, 0x00e658a5, 0x03f9fcd4, 0x01579f72, 0x0357cbd4, 0x0224c46f, 0x03df62e5, 0x005329d0, 0x007b1e7c, 0x00077b1b}}}, + {X: Field{[10]uint32{0x00ee0f19, 0x0268f72c, 0x01ed189c, 0x0007cac1, 0x00411bd2, 0x013a1503, 0x012d1cfc, 0x01213407, 0x003ad3be, 0x002965d4}}, Y: Field{[10]uint32{0x001113cd, 0x0157b8ec, 0x014dce28, 0x03c1d972, 0x00becbd6, 0x036f3d24, 0x02cee664, 0x00466478, 0x027d3800, 0x000d444f}}}, + {X: Field{[10]uint32{0x0191ce4a, 0x03795f37, 0x0046cb94, 0x00de0320, 0x011ae249, 0x02f4bf64, 0x01d07a3d, 0x00c2c55f, 0x0251abb1, 0x002ea46c}}, Y: Field{[10]uint32{0x013e1f6c, 0x030d64c3, 0x01dcfe1d, 0x003f85e6, 0x03837742, 0x03d90bee, 0x01f33f54, 0x03b7ee9a, 0x0080500a, 0x0033f308}}}, + {X: Field{[10]uint32{0x02d324a4, 0x0116ffe1, 0x032e2fb0, 0x012980fe, 0x005c6d2f, 0x01721905, 0x03d33869, 0x01ef4f1b, 0x025883cc, 0x002b7ed6}}, Y: Field{[10]uint32{0x030cdc5c, 0x01554fde, 0x0172222a, 0x014f325d, 0x013a5257, 0x030c36a4, 0x00415a18, 0x00b7f714, 0x02d745d8, 0x000595d3}}}, + {X: Field{[10]uint32{0x03561ae8, 0x013b73e8, 0x023e29d9, 0x029383ee, 0x01ba1f13, 0x00292f8d, 0x0054b141, 0x002972b2, 0x014ddd71, 0x00042124}}, Y: Field{[10]uint32{0x01c25e99, 0x0373e152, 0x003babe6, 0x028d6423, 0x002f2b74, 0x037e3999, 0x02ac6cda, 0x03bd8104, 0x01353240, 0x00194f28}}}, + {X: Field{[10]uint32{0x026c6f7b, 0x0337345b, 0x0033f133, 0x01abe01e, 0x0281876a, 0x02e207bf, 0x028abe50, 0x022c505e, 0x02719af3, 0x001c12a8}}, Y: Field{[10]uint32{0x03769e54, 0x013d9ba8, 0x03b9263f, 0x03d10ae9, 0x0111395a, 0x038a8690, 0x00726c9b, 0x00602f12, 0x02b348c1, 0x0029bfb8}}}, + {X: Field{[10]uint32{0x00aec289, 0x01ee0daa, 0x0108051d, 0x03a250b2, 0x03fe68b0, 0x024f19a0, 0x01f57348, 0x00aa1970, 0x00c17f5d, 0x00118123}}, Y: Field{[10]uint32{0x03288efd, 0x00681e62, 0x03277a46, 0x00d0e106, 0x032e7668, 0x02d3e28c, 0x01bf9c6b, 0x03ddf41d, 0x003089a8, 0x0036173b}}}, + {X: Field{[10]uint32{0x03fce9e9, 0x011d95dd, 0x03c763d5, 0x033d6e87, 0x0107d04c, 0x016634be, 0x02781ba8, 0x00ec858d, 0x02be315d, 0x00143c79}}, Y: Field{[10]uint32{0x026b0b00, 0x017ec3bb, 0x00db7d09, 0x03851f80, 0x0325dd0c, 0x03725887, 0x00249759, 0x02e7ca33, 0x03d62057, 0x003df72d}}}, + {X: Field{[10]uint32{0x0263501c, 0x03ff3402, 0x006d03b7, 0x03cc16f5, 0x02944df1, 0x01d23527, 0x00efa037, 0x0156b404, 0x02446766, 0x001fb428}}, Y: Field{[10]uint32{0x01c18c21, 0x00343c01, 0x028d8269, 0x0196981d, 0x01e9b3ae, 0x00dab91d, 0x02eb2669, 0x0089ed11, 0x0265593f, 0x002a0dde}}}, + {X: Field{[10]uint32{0x03ebccc7, 0x03d18c93, 0x03342c29, 0x00eec7cd, 0x0219b29d, 0x03fc6f4b, 0x01c431dc, 0x030b3d84, 0x00a1ee66, 0x000340e7}}, Y: Field{[10]uint32{0x016d736f, 0x00c4139a, 0x0076e781, 0x03845699, 0x006e652e, 0x033f7321, 0x01ff5e24, 0x0319858a, 0x018214f4, 0x0036c343}}}, + {X: Field{[10]uint32{0x03b092b7, 0x03b60429, 0x015797be, 0x0272ab58, 0x028e3672, 0x01335283, 0x031768d9, 0x03f8bd14, 0x033acc55, 0x000309e5}}, Y: Field{[10]uint32{0x01f41c99, 0x005e8500, 0x020db439, 0x03c7fdd4, 0x000878e1, 0x02e78cc5, 0x02d54029, 0x02c91b15, 0x00eab36a, 0x003370c4}}}, + {X: Field{[10]uint32{0x0046e945, 0x0030cf19, 0x01d846de, 0x02000e8b, 0x01ac14a1, 0x03880b45, 0x0072e48d, 0x031a0c95, 0x0142cce3, 0x000da10a}}, Y: Field{[10]uint32{0x03b8f2f7, 0x000ee581, 0x02bcb574, 0x03e8376b, 0x03208d95, 0x03b55826, 0x009db9ae, 0x020be8d6, 0x03f819ab, 0x0014002c}}}, + {X: Field{[10]uint32{0x0162d0e9, 0x01552b9b, 0x03d7b0c4, 0x03de1783, 0x0074865e, 0x016aed15, 0x03f3a8c5, 0x0086d467, 0x015c3386, 0x00346a86}}, Y: Field{[10]uint32{0x03b737a8, 0x019c9469, 0x03c88c2e, 0x01cea6a2, 0x00832ce7, 0x0221018c, 0x0234576d, 0x00e166d1, 0x0133dc29, 0x0039f877}}}, + {X: Field{[10]uint32{0x000f00f0, 0x03c99fd7, 0x008b0489, 0x00aa3340, 0x03a59b2c, 0x01d9bb04, 0x02bd6ff5, 0x00e7b0d9, 0x01326074, 0x0013d08f}}, Y: Field{[10]uint32{0x00e7a9f4, 0x0075e1e9, 0x034eef5e, 0x016012d3, 0x00b6c3e0, 0x01cb2223, 0x008e6aa2, 0x01305701, 0x029d7ee9, 0x00178f1f}}}, + {X: Field{[10]uint32{0x03f06c4a, 0x006ee641, 0x018c5910, 0x03eabdce, 0x00ebcb9a, 0x02d7ea6e, 0x000859a9, 0x0247bc5f, 0x0280ff89, 0x001aec71}}, Y: Field{[10]uint32{0x0269a253, 0x03fcf261, 0x0039f189, 0x03f54d6e, 0x03217005, 0x01d85717, 0x03c242c9, 0x00ab9745, 0x03750d91, 0x000c6369}}}, + {X: Field{[10]uint32{0x00096f68, 0x00b426b0, 0x03b8bd0f, 0x008cc0c0, 0x02bc3934, 0x03efb8b9, 0x00b251c9, 0x0291a97f, 0x01d44713, 0x00005025}}, Y: Field{[10]uint32{0x0204a2b1, 0x032caeb9, 0x0159322d, 0x03ec2dfd, 0x001c7aa4, 0x0219f1ff, 0x01e632f6, 0x02cdd256, 0x000b3660, 0x00191f80}}}, + {X: Field{[10]uint32{0x035e5323, 0x0184ec12, 0x03b838b2, 0x0068e3a7, 0x02894319, 0x03021e1d, 0x00f831f6, 0x0271b92a, 0x03f0346e, 0x0004844a}}, Y: Field{[10]uint32{0x0257a3d0, 0x010a61a5, 0x0210e30a, 0x0196273f, 0x01faf640, 0x03b936ae, 0x03abf62a, 0x00cf6530, 0x02c2cb45, 0x00390526}}}, + {X: Field{[10]uint32{0x03ca5738, 0x0170dc22, 0x0329b4f7, 0x029e1165, 0x014f2197, 0x02bad67f, 0x00974ebe, 0x01204360, 0x00ccc2ed, 0x003e64d8}}, Y: Field{[10]uint32{0x026f1cb3, 0x020ea4bb, 0x020dbc0c, 0x00524d40, 0x03a06e44, 0x03865c76, 0x001b9f86, 0x01ea2b0b, 0x035e86d7, 0x002e4a8b}}}, + {X: Field{[10]uint32{0x02809ca4, 0x013a01ba, 0x00567a65, 0x02712522, 0x0264ae77, 0x0394fd47, 0x032112bb, 0x00fb3121, 0x024ec81a, 0x000b7b96}}, Y: Field{[10]uint32{0x033d4954, 0x00786931, 0x033b1bcb, 0x018e4d3f, 0x02bdea4d, 0x03f3c983, 0x02a1bcff, 0x011f0702, 0x00a1df6d, 0x00078baa}}}, + {X: Field{[10]uint32{0x01461229, 0x020b1ec3, 0x006a5f23, 0x0346ef5d, 0x00b73688, 0x00371404, 0x01638f7b, 0x03ade3d2, 0x02a2139e, 0x00016ea9}}, Y: Field{[10]uint32{0x01dca81d, 0x00756549, 0x00693cc0, 0x02a58055, 0x03b08a0c, 0x03909427, 0x02a75cd9, 0x014bc67c, 0x038310a3, 0x001c99dc}}}, + {X: Field{[10]uint32{0x02913d70, 0x015a2ea0, 0x0183c8f8, 0x00b365ba, 0x02f60d10, 0x004c6791, 0x034a6f3b, 0x01135add, 0x02b9321d, 0x0028fddf}}, Y: Field{[10]uint32{0x00613a05, 0x033ae397, 0x00077d3f, 0x0195dd1c, 0x00f6db17, 0x01afb074, 0x02386302, 0x039c3c6a, 0x01df8271, 0x003e4f5d}}}, + {X: Field{[10]uint32{0x03f2cf08, 0x02421371, 0x017db72f, 0x019baefa, 0x008588d7, 0x022ba7ce, 0x00fd62d6, 0x0249d0de, 0x02b5fa1f, 0x0011ae99}}, Y: Field{[10]uint32{0x038897f9, 0x02d77648, 0x0385b72d, 0x038bb3c1, 0x01f44bf7, 0x00ab5415, 0x01f9b555, 0x02e37e4b, 0x02243078, 0x000151cf}}}, + {X: Field{[10]uint32{0x0280dbf2, 0x034873b3, 0x02af4291, 0x01732865, 0x000bccb1, 0x01547eb4, 0x03415b6f, 0x000982ca, 0x0246ddcf, 0x0036da80}}, Y: Field{[10]uint32{0x00591d3c, 0x01645fca, 0x01c7ea98, 0x01bf9d78, 0x025f8885, 0x00f34259, 0x02c6f6f6, 0x00725e95, 0x0046f93e, 0x000e5b35}}}, + {X: Field{[10]uint32{0x026c8fa1, 0x00720d1b, 0x02e8c5cc, 0x02e19a64, 0x0338187e, 0x036e86c2, 0x012c4e58, 0x026368e6, 0x011ca7a2, 0x002e0be3}}, Y: Field{[10]uint32{0x01483461, 0x02d80d80, 0x03ee028e, 0x02254cf8, 0x02b1b805, 0x02dd9f1a, 0x00fdbddd, 0x0104f235, 0x036af9b0, 0x0012c2b9}}}, + {X: Field{[10]uint32{0x0085f000, 0x003c0631, 0x014a182e, 0x035edffe, 0x01d106fd, 0x02984a18, 0x00c6348a, 0x0192bfa7, 0x02a4dc92, 0x00111ba5}}, Y: Field{[10]uint32{0x01568440, 0x00cf7c26, 0x02507c8e, 0x0032984a, 0x012771c4, 0x033d9def, 0x0223b7ec, 0x00e9607f, 0x03d92159, 0x000cb7f8}}}, + {X: Field{[10]uint32{0x003a2eb9, 0x02874e4c, 0x01fb81ad, 0x01b3616f, 0x025c8a3e, 0x01941277, 0x0300ca34, 0x01b732e7, 0x03107bfa, 0x0000321b}}, Y: Field{[10]uint32{0x0034219d, 0x02b92b9f, 0x03ed888b, 0x01f92aa9, 0x019dcb27, 0x00c8d1d3, 0x0218c6a7, 0x0020502b, 0x00667e91, 0x003993dc}}}, + {X: Field{[10]uint32{0x036cd710, 0x017d6eb6, 0x01cdb83e, 0x02acc0a9, 0x009201c2, 0x000af9ee, 0x00d94cc2, 0x010a6793, 0x036ecda1, 0x002fb63a}}, Y: Field{[10]uint32{0x01411aac, 0x01226957, 0x01256708, 0x00f08250, 0x0116a1f0, 0x01a49d1b, 0x0367b9f6, 0x02903174, 0x00fab375, 0x00055cdb}}}, + {X: Field{[10]uint32{0x0364d38f, 0x0249b823, 0x02881da1, 0x014b7a0a, 0x00665e0a, 0x035d6520, 0x03171b5a, 0x02b44107, 0x03f2c5f6, 0x002cfbe9}}, Y: Field{[10]uint32{0x031677e6, 0x017eb23f, 0x013ffc53, 0x01840fed, 0x00b6dbd3, 0x03a6380d, 0x02b0dfaa, 0x00689003, 0x00843276, 0x000f7d8f}}}, + {X: Field{[10]uint32{0x0315cbd2, 0x03149749, 0x02921ebd, 0x0305947b, 0x018fa9af, 0x027850f8, 0x01213a84, 0x026d7c8d, 0x01a0cd86, 0x002c1183}}, Y: Field{[10]uint32{0x006fd7ee, 0x02ec486e, 0x00eee865, 0x017b3d8c, 0x0146b472, 0x02d5eca6, 0x033b4c02, 0x0061df39, 0x02adf354, 0x0030468f}}}, + {X: Field{[10]uint32{0x033bc071, 0x03b0f3b5, 0x0152a49c, 0x014e9f43, 0x00b49692, 0x00b58035, 0x00191871, 0x014afacb, 0x0117a174, 0x000a2c25}}, Y: Field{[10]uint32{0x0120a326, 0x01e90f7a, 0x01ae7fce, 0x0341a437, 0x0040ffd6, 0x0102bd65, 0x01635180, 0x01d64444, 0x0308073c, 0x000d9a59}}}, + {X: Field{[10]uint32{0x03b5f136, 0x02946c3e, 0x037536b1, 0x03f11c55, 0x020ad86a, 0x002fc5fe, 0x02e76b7c, 0x032d601e, 0x00d8192a, 0x001486fb}}, Y: Field{[10]uint32{0x01ac858d, 0x01ffa0dd, 0x026691dc, 0x003bb7cc, 0x02ee0671, 0x015145a0, 0x00f399e1, 0x03c4fb33, 0x00c6d7af, 0x00192295}}}, + {X: Field{[10]uint32{0x01f6cf67, 0x02dd87de, 0x01082368, 0x029ddb4e, 0x02a2a200, 0x0161f613, 0x009bca1b, 0x0275949b, 0x01d0b7fd, 0x002def06}}, Y: Field{[10]uint32{0x0370acae, 0x025ba347, 0x023ad2f7, 0x03fbfeff, 0x024a1e9f, 0x01cc58ed, 0x012c29a7, 0x03233d09, 0x02bee0d0, 0x0016b7be}}}, + {X: Field{[10]uint32{0x017aea8b, 0x00c7c34e, 0x03114dc9, 0x01b704f9, 0x0066db7b, 0x0055633b, 0x030c2412, 0x02a35507, 0x03e51b6c, 0x0039238e}}, Y: Field{[10]uint32{0x020f28ac, 0x01079f83, 0x004314bf, 0x00fbe7dd, 0x01f6cb3a, 0x03c4ad19, 0x03064bff, 0x038bc4c3, 0x03575b16, 0x0036f3d8}}}, + {X: Field{[10]uint32{0x03455751, 0x03d0a427, 0x028909b2, 0x02d65d67, 0x014ec795, 0x038a3ca9, 0x02475968, 0x024a9a8c, 0x02de71c6, 0x0000e571}}, Y: Field{[10]uint32{0x0269a13d, 0x030b2169, 0x003c3fcf, 0x0391266f, 0x03b5b097, 0x02b28557, 0x02ed4e15, 0x03768b07, 0x011803c7, 0x003b9780}}}, + {X: Field{[10]uint32{0x02808d99, 0x01814af2, 0x009a81a6, 0x02aa293a, 0x02663da3, 0x0303fb0d, 0x03412919, 0x010e6489, 0x02c3b118, 0x000a24e2}}, Y: Field{[10]uint32{0x03174603, 0x002e6193, 0x025f8031, 0x0256e87a, 0x00da1682, 0x0032e684, 0x03eadb18, 0x0306fa8a, 0x027ab1eb, 0x0012ba37}}}, + {X: Field{[10]uint32{0x0248f5a4, 0x00fb9ad4, 0x036f5852, 0x013f428d, 0x03be3af6, 0x0389fa14, 0x01472f23, 0x0233d881, 0x021895e8, 0x0001703d}}, Y: Field{[10]uint32{0x004be51b, 0x02c70f79, 0x02624b41, 0x0360d107, 0x038473e3, 0x03f6d43e, 0x03634569, 0x03aecedc, 0x0055cd09, 0x002f970f}}}, + {X: Field{[10]uint32{0x023ca1d7, 0x01536b17, 0x02ec0015, 0x004c7ae8, 0x02ae2e8f, 0x01fb416e, 0x028e125f, 0x03dccfb4, 0x03bf22d0, 0x002af87d}}, Y: Field{[10]uint32{0x02b0ab4e, 0x02a8b106, 0x02ffc918, 0x02d656ba, 0x03e553e6, 0x0265b2cc, 0x008ffe4b, 0x007daa5c, 0x00db3de3, 0x000a9692}}}, + {X: Field{[10]uint32{0x008d8be7, 0x03f4a738, 0x02349bcc, 0x03b110a9, 0x015f1dbe, 0x0298244a, 0x0124907e, 0x01c2cde4, 0x002757d3, 0x0030c109}}, Y: Field{[10]uint32{0x01868934, 0x01d73a6c, 0x031448bb, 0x0304a7a3, 0x01528959, 0x02326047, 0x01b35e2f, 0x0369d54d, 0x02b33e0f, 0x0019e993}}}, + {X: Field{[10]uint32{0x0140f5b8, 0x014cbf8c, 0x01c21c81, 0x0119abd0, 0x03031527, 0x038690fd, 0x02f0b6a9, 0x008675de, 0x0146356f, 0x00196966}}, Y: Field{[10]uint32{0x00f35918, 0x00e9871d, 0x0241f246, 0x0164f611, 0x001692b0, 0x001c3688, 0x00cf27fc, 0x013e8146, 0x028d5d3e, 0x001939c4}}}, + {X: Field{[10]uint32{0x001413e2, 0x03ad4fc5, 0x0219ede2, 0x02df536b, 0x0060311c, 0x02e67684, 0x03066f2b, 0x02321d1a, 0x023b4842, 0x001b1f4b}}, Y: Field{[10]uint32{0x00b7e3a1, 0x0192f2db, 0x007ab2a6, 0x03f8a3df, 0x03286292, 0x03b5ece0, 0x022864d1, 0x0319c137, 0x03bfc2e7, 0x00012e91}}}, + {X: Field{[10]uint32{0x03fdcdd9, 0x033d63a4, 0x019cf44a, 0x01fe914e, 0x03565579, 0x0324ffd5, 0x03798a9b, 0x02270ad1, 0x03bdb99c, 0x00037495}}, Y: Field{[10]uint32{0x01b3e4af, 0x00ab8db0, 0x020cc1af, 0x02058e43, 0x03e8194f, 0x010a2440, 0x027e0d71, 0x01fc954b, 0x00f2a920, 0x003e359c}}}, + {X: Field{[10]uint32{0x00c23d7b, 0x02ad79bb, 0x0263eb2a, 0x01f2c23c, 0x026827b8, 0x03351f18, 0x0152b8fa, 0x0310910a, 0x034eb8dd, 0x00094580}}, Y: Field{[10]uint32{0x0216ac9e, 0x031d6858, 0x02826433, 0x00d12d21, 0x00bd2ab5, 0x01cc774c, 0x03545bca, 0x03a81eb4, 0x0079f5fe, 0x002b63a2}}}, + {X: Field{[10]uint32{0x0134246d, 0x037382b6, 0x0180b907, 0x00559646, 0x017f0752, 0x00847b70, 0x01834b38, 0x02478ec6, 0x005427b5, 0x001f9c8c}}, Y: Field{[10]uint32{0x0263a71f, 0x020051d3, 0x034e33b0, 0x03a38c91, 0x032506be, 0x00261d82, 0x01671df1, 0x02129bc8, 0x00bbd8c1, 0x0017247f}}}, + {X: Field{[10]uint32{0x01d1898b, 0x0174e65b, 0x0333e72b, 0x01ffbe77, 0x038d4fb5, 0x0169bdae, 0x03876914, 0x0034a812, 0x0116ac3c, 0x0006c7e7}}, Y: Field{[10]uint32{0x035b4b1b, 0x034299fc, 0x01bd1024, 0x014e5146, 0x0215e944, 0x01890696, 0x00a399e1, 0x039142c5, 0x031e05ff, 0x001910af}}}, + {X: Field{[10]uint32{0x00872f2b, 0x001b18ff, 0x01a23e90, 0x01364f14, 0x0265b514, 0x02598c71, 0x039f6715, 0x03a90e8e, 0x024e57cd, 0x00383c7e}}, Y: Field{[10]uint32{0x0332e564, 0x02705dab, 0x018640a4, 0x037b349f, 0x0374f9a3, 0x00547751, 0x02056170, 0x003450bd, 0x01fb5489, 0x00320e14}}}, + {X: Field{[10]uint32{0x02728c3a, 0x0284bacc, 0x03d0b3e9, 0x009e675e, 0x0040efa0, 0x00a8281e, 0x01a3667b, 0x02082894, 0x03bb697c, 0x0002ba56}}, Y: Field{[10]uint32{0x03aebb41, 0x016c521a, 0x03f10e68, 0x0371ee00, 0x011140e0, 0x016b9427, 0x02a4da94, 0x0025b61b, 0x02970280, 0x003836ee}}}, + {X: Field{[10]uint32{0x002aed31, 0x00d01d9a, 0x01b3069e, 0x02b9b9fc, 0x030afad1, 0x014ffe30, 0x02529ea8, 0x03d0b07f, 0x0085d52e, 0x003f23fe}}, Y: Field{[10]uint32{0x01e3dd14, 0x0382992c, 0x00850433, 0x01c50cab, 0x0209cced, 0x00d5b406, 0x0104f1b3, 0x023d89ee, 0x02d4b26e, 0x001497b3}}}, + {X: Field{[10]uint32{0x02c8e810, 0x0272accc, 0x02546c62, 0x00f04d94, 0x00ed68d6, 0x02a59683, 0x01b57533, 0x01896835, 0x036a459d, 0x001984c4}}, Y: Field{[10]uint32{0x015b65cb, 0x02614ed9, 0x0069b93a, 0x00050049, 0x0228b4cb, 0x02c5a2f4, 0x01732b43, 0x002a52cf, 0x03f824d3, 0x00043ca7}}}, + {X: Field{[10]uint32{0x01ea56f0, 0x03d68df7, 0x01b91f24, 0x0107daf8, 0x0319dda8, 0x01bbced8, 0x02309b39, 0x00cc9f1d, 0x01157b68, 0x00114216}}, Y: Field{[10]uint32{0x01956821, 0x01d953e4, 0x02a12bbc, 0x02fed2c6, 0x032b6ebb, 0x0023569a, 0x0155e34f, 0x022391a8, 0x0046584a, 0x002e69c5}}}, + {X: Field{[10]uint32{0x008a4325, 0x00bcfddf, 0x0064f0e3, 0x013089d1, 0x01be58af, 0x035785c4, 0x0382576c, 0x02e8377a, 0x03bd8f10, 0x0005a3b8}}, Y: Field{[10]uint32{0x0278b34c, 0x01d08099, 0x0388668b, 0x02116082, 0x00465fb1, 0x020be1c0, 0x016891c9, 0x01027ea4, 0x026343ff, 0x001bbbc7}}}, + {X: Field{[10]uint32{0x03048c04, 0x0009c53b, 0x0131b718, 0x013181de, 0x00fdd86b, 0x02c800f9, 0x034db8de, 0x008d053a, 0x0197763c, 0x002cc647}}, Y: Field{[10]uint32{0x02152edd, 0x016a0f30, 0x00a04f88, 0x0358ddc4, 0x03ce6860, 0x03af7570, 0x03d53d83, 0x01d72af9, 0x008559f9, 0x002d2b0c}}}, + {X: Field{[10]uint32{0x022f8738, 0x0280898e, 0x0096a51e, 0x03f3c804, 0x033ec477, 0x03a4fd2e, 0x032acca1, 0x03724cf1, 0x005b4e73, 0x0036a757}}, Y: Field{[10]uint32{0x0012f8aa, 0x02cc826a, 0x015b50b4, 0x03422c28, 0x01400c05, 0x018d9944, 0x01b93b0d, 0x019b0da2, 0x02da65f9, 0x001feda8}}}, + {X: Field{[10]uint32{0x00b0dd66, 0x0196f339, 0x0215c01e, 0x02825538, 0x008d1cfa, 0x0314991c, 0x011730f0, 0x0159e05e, 0x01d2a7e7, 0x00050395}}, Y: Field{[10]uint32{0x0153d5b3, 0x00165042, 0x0118bce8, 0x0397225e, 0x0087e2d5, 0x03bcd8c6, 0x02470d81, 0x00965e47, 0x00d863ea, 0x0012fee8}}}, + {X: Field{[10]uint32{0x02b173d8, 0x00e67ac5, 0x00a1cf3f, 0x03e198d1, 0x03b438f7, 0x03f8f62f, 0x029bd01b, 0x03321f3b, 0x00f64b95, 0x00056a73}}, Y: Field{[10]uint32{0x03b33f3b, 0x018f2366, 0x03f90e03, 0x0269b946, 0x035d0ba5, 0x002cc6a4, 0x01e51fbf, 0x03b49581, 0x02cdbdeb, 0x0013d51c}}}, + {X: Field{[10]uint32{0x00af6e06, 0x032a8f62, 0x0088f814, 0x0244b42a, 0x00c7ed5e, 0x02b4606f, 0x033d3d8f, 0x01c076de, 0x024b6776, 0x003a1b8d}}, Y: Field{[10]uint32{0x01ea7b92, 0x0130d5d3, 0x00915f83, 0x03452989, 0x0124a466, 0x018a1a62, 0x0195518c, 0x001034fa, 0x00600afc, 0x00008bf5}}}, + {X: Field{[10]uint32{0x02500eb6, 0x020beb96, 0x03ddbfc2, 0x00ea9b56, 0x03b1f81d, 0x008faf39, 0x021134c7, 0x03c36c8c, 0x0298cd25, 0x000f0986}}, Y: Field{[10]uint32{0x03abd9c1, 0x00d7f15d, 0x02cbc455, 0x001b7abb, 0x004027a5, 0x0325a99b, 0x00b6ed7e, 0x02084629, 0x01455e49, 0x000ae348}}}, + {X: Field{[10]uint32{0x00c955c8, 0x0151bb7d, 0x0300bd66, 0x017408e0, 0x00368c3b, 0x01deab3f, 0x03b1f6c1, 0x02d45db2, 0x00114d55, 0x00126daa}}, Y: Field{[10]uint32{0x03815b94, 0x00d60e28, 0x01bca5b5, 0x0044e475, 0x020ab944, 0x03c6c2ca, 0x038e0017, 0x039f041a, 0x00a409f0, 0x00346c49}}}, + {X: Field{[10]uint32{0x0125f6b9, 0x02a36b31, 0x03f71f34, 0x007fde90, 0x016cee80, 0x003312e0, 0x01deab62, 0x039694fe, 0x0061f0d3, 0x001bb23a}}, Y: Field{[10]uint32{0x02dcfd6a, 0x00006ae9, 0x02e27782, 0x01c718fe, 0x011e01a8, 0x02dad7ac, 0x009c4f7e, 0x02bef4cc, 0x005b68cc, 0x0010b815}}}, + {X: Field{[10]uint32{0x0195b9ac, 0x02262a91, 0x03e1ac08, 0x015d1903, 0x004b527e, 0x023c5369, 0x005a2e2a, 0x02973f4c, 0x034159ac, 0x001cd0ac}}, Y: Field{[10]uint32{0x03160124, 0x01748d14, 0x01ac121b, 0x0102b21b, 0x0127f64f, 0x03a984a0, 0x03969a84, 0x00bb88d8, 0x0302d244, 0x002d4984}}}, + {X: Field{[10]uint32{0x02686fa9, 0x034c2e56, 0x0054b687, 0x015e9827, 0x00b27477, 0x03c9a59f, 0x01cfc43d, 0x00d42d97, 0x00bd54ef, 0x00210acc}}, Y: Field{[10]uint32{0x0336ead6, 0x016b20fc, 0x0277b9cc, 0x01f1c79f, 0x037d594f, 0x01723795, 0x0331f63f, 0x00dae7b3, 0x02922caa, 0x0013fea7}}}, + {X: Field{[10]uint32{0x01f94862, 0x02381306, 0x02153999, 0x0028fa46, 0x037c13bb, 0x0255d5fb, 0x03fb60d4, 0x029f1ef0, 0x035dd589, 0x000b6e90}}, Y: Field{[10]uint32{0x028cc0a1, 0x03522257, 0x013ed55c, 0x0171f7e1, 0x00931d3e, 0x01dd7940, 0x038eca16, 0x00f2e748, 0x020ea4b2, 0x0031101c}}}, + {X: Field{[10]uint32{0x033bec02, 0x034f1171, 0x01c07998, 0x02f4f40d, 0x02bb284f, 0x0064e42f, 0x035a4578, 0x03396ca9, 0x01248f84, 0x002747a1}}, Y: Field{[10]uint32{0x00eb9ead, 0x0201d325, 0x03f40129, 0x033e126f, 0x036d62e8, 0x02a018fc, 0x038bbc84, 0x0332b08c, 0x024cc935, 0x0023903b}}}, + {X: Field{[10]uint32{0x00b441af, 0x0158b4b6, 0x01cf4e76, 0x008d8b89, 0x019a7f86, 0x005525d5, 0x03639121, 0x029d6f53, 0x02c5d1fb, 0x00349cd6}}, Y: Field{[10]uint32{0x01afc081, 0x023ecd9f, 0x0331da1d, 0x01b4727e, 0x01b4ade8, 0x02d4bcf9, 0x037cb0e5, 0x03cce5de, 0x003619f9, 0x0002f4ab}}}, + {X: Field{[10]uint32{0x00a3e11a, 0x00eb7fac, 0x017cdca6, 0x025b82a5, 0x01b27c2b, 0x015ca4e5, 0x01a68d31, 0x03fc4eb4, 0x0238f46c, 0x002c04c3}}, Y: Field{[10]uint32{0x006aa3c4, 0x01666803, 0x001b5535, 0x00590d9b, 0x02610f15, 0x02c45dda, 0x02ff8443, 0x0100721f, 0x017f4a61, 0x000f67da}}}, + {X: Field{[10]uint32{0x01ec76a7, 0x00b99a0d, 0x02caaed8, 0x01e0a650, 0x03f59faa, 0x02e277a2, 0x022d8f33, 0x01abe2d9, 0x022f1530, 0x00382a81}}, Y: Field{[10]uint32{0x015e6f2e, 0x01115fb0, 0x0218179a, 0x015097f1, 0x0334305b, 0x02b260e1, 0x01ffb8ac, 0x01cc1297, 0x00b56ea7, 0x00317d7c}}}, + {X: Field{[10]uint32{0x019432d5, 0x012f42c0, 0x004139f4, 0x021665eb, 0x002156d6, 0x03a61d7b, 0x03e15c4a, 0x03472461, 0x02c1a8e6, 0x003b4589}}, Y: Field{[10]uint32{0x01f0c35d, 0x01410a5c, 0x00d7e69d, 0x011b164e, 0x037f0fad, 0x039cdcfd, 0x035e531e, 0x0128fd08, 0x015b9dcb, 0x000f0362}}}, + {X: Field{[10]uint32{0x01c92833, 0x034bb413, 0x00be8431, 0x036e1b81, 0x00664744, 0x01325d3e, 0x0025aa67, 0x03f6be33, 0x00314e18, 0x0028b333}}, Y: Field{[10]uint32{0x0359d71c, 0x00e9d3f1, 0x038a846c, 0x02230190, 0x002e1b9c, 0x019cbd79, 0x00e55368, 0x01c7bb48, 0x0249d6d4, 0x002d9043}}}, + {X: Field{[10]uint32{0x0268bf27, 0x03d9d6fd, 0x0331fa35, 0x0018f552, 0x00b3b24e, 0x00b65aa2, 0x0319119b, 0x03d8b12b, 0x012fdb15, 0x0016ff06}}, Y: Field{[10]uint32{0x03d99051, 0x02786611, 0x0223b609, 0x01890087, 0x02dbe0dc, 0x03d8a8e2, 0x0031bb39, 0x03850241, 0x0374acb4, 0x00119dd0}}}, + {X: Field{[10]uint32{0x01227028, 0x02ad7c02, 0x0090e97d, 0x015621ab, 0x0161eb21, 0x01fbec02, 0x022e5539, 0x031010ca, 0x0289da73, 0x0019a10a}}, Y: Field{[10]uint32{0x01941de9, 0x00602448, 0x02f4e90b, 0x031a2726, 0x01da171b, 0x00405b36, 0x012dc9df, 0x02812223, 0x03c3511e, 0x000ea3a0}}}, + {X: Field{[10]uint32{0x01c516e8, 0x001d9af3, 0x002f7181, 0x0137564d, 0x03e3a4a8, 0x03ba2e4a, 0x01f89913, 0x017e6351, 0x01973ba9, 0x003b208c}}, Y: Field{[10]uint32{0x037206fe, 0x0097866a, 0x032aef1d, 0x01b6b265, 0x0177d547, 0x02a54ed7, 0x033bc882, 0x00fd3865, 0x0079f511, 0x0014cb4f}}}, + {X: Field{[10]uint32{0x02fc140b, 0x009467dc, 0x007ad1ac, 0x01b0caac, 0x03e8e8e2, 0x03cfb4e7, 0x015e5b65, 0x0185dabb, 0x0278bc51, 0x000ed97f}}, Y: Field{[10]uint32{0x00208d98, 0x03deb7e6, 0x02c1b9c9, 0x035cc533, 0x02566a1f, 0x019be577, 0x037f9764, 0x03ae704f, 0x02de5190, 0x00215b4d}}}, + {X: Field{[10]uint32{0x018cc346, 0x01880db4, 0x03945182, 0x02cc9c8a, 0x01f9f31e, 0x00ff7402, 0x02545ce8, 0x00d497a7, 0x02ca51c4, 0x0000eb03}}, Y: Field{[10]uint32{0x0213a7e6, 0x00c092a8, 0x01e509ab, 0x0322c4d3, 0x00325beb, 0x01038251, 0x004ef313, 0x02933cc9, 0x018bc3b2, 0x00371c80}}}, + {X: Field{[10]uint32{0x02e23508, 0x014e810b, 0x0172ffbe, 0x02e6ed42, 0x00bcdac8, 0x005f66f8, 0x012db7c2, 0x03b39bb7, 0x018d6c50, 0x00124a59}}, Y: Field{[10]uint32{0x02cec38a, 0x012f642a, 0x00c3a728, 0x03e35e84, 0x016dfc8d, 0x008ca1d0, 0x0155980a, 0x02ef52e1, 0x002c61aa, 0x00396b29}}}, + {X: Field{[10]uint32{0x013a6291, 0x002ad6c5, 0x022781d6, 0x02ad2469, 0x037830e2, 0x031b48a5, 0x029e7488, 0x01924bc3, 0x036f4bc9, 0x002745b9}}, Y: Field{[10]uint32{0x015ac7ab, 0x0099bb22, 0x01711da7, 0x0228113a, 0x015eaa98, 0x01dc2bbd, 0x00363189, 0x01a48815, 0x0300e4ac, 0x00399643}}}, + {X: Field{[10]uint32{0x035df94d, 0x026cae07, 0x0276d5e0, 0x01a89f01, 0x014e13b3, 0x03fe5eb7, 0x02a9bbe7, 0x039febd4, 0x004a1327, 0x002c1927}}, Y: Field{[10]uint32{0x0091acdd, 0x01570f0e, 0x02d120b3, 0x00206981, 0x02d79fdd, 0x01fdd6a2, 0x032a0807, 0x01a12381, 0x0316a6f3, 0x00264720}}}, + {X: Field{[10]uint32{0x0052235d, 0x0304af6c, 0x013c96b7, 0x03d817f8, 0x03eb39a8, 0x0129285a, 0x01ce51c4, 0x00f7b4b2, 0x0221f630, 0x0023c652}}, Y: Field{[10]uint32{0x0330739e, 0x015749a5, 0x030f1bd7, 0x00b3b7f9, 0x01c63517, 0x0268b721, 0x01afb23e, 0x020b8951, 0x03d0c9af, 0x002f477c}}}, + {X: Field{[10]uint32{0x03e21ff0, 0x021fc77b, 0x0262a60e, 0x00871b08, 0x033872b7, 0x03579996, 0x037f6c3d, 0x0133651d, 0x0297cc7a, 0x000769c6}}, Y: Field{[10]uint32{0x00be6a06, 0x03411a01, 0x026e87f0, 0x03a19a8f, 0x030a4d30, 0x009cebfa, 0x032b9af1, 0x01b869eb, 0x02413903, 0x001e345e}}}, + {X: Field{[10]uint32{0x0386aa45, 0x01ebcf37, 0x0290f7a3, 0x006ec604, 0x03e04e40, 0x0148a471, 0x02fabb1c, 0x03c98b4f, 0x0363e493, 0x00027fb4}}, Y: Field{[10]uint32{0x003de729, 0x03fe0d9c, 0x00d6cb3f, 0x00da437f, 0x0353a54f, 0x02972597, 0x01b18276, 0x02b7fefb, 0x033ee164, 0x0004c330}}}, + {X: Field{[10]uint32{0x03a1e49f, 0x01d6a1e9, 0x0298febb, 0x00eb079e, 0x007a601a, 0x032ed850, 0x01ebc38f, 0x00d5a066, 0x00cd221c, 0x003459bb}}, Y: Field{[10]uint32{0x0072f06e, 0x0257dda8, 0x003c9937, 0x01f33952, 0x00b0628c, 0x0152150d, 0x00ec5628, 0x0002f577, 0x02b7e7c2, 0x00098888}}}, + {X: Field{[10]uint32{0x01dbe0fd, 0x002482a3, 0x035cc293, 0x01b8e4d0, 0x02b998a5, 0x02528ba3, 0x03078392, 0x01c30730, 0x00bd3e37, 0x0039e14f}}, Y: Field{[10]uint32{0x000e5a8e, 0x00503da6, 0x0050b80a, 0x02c63e92, 0x00cff1e7, 0x0008f0ef, 0x01d29181, 0x01f31259, 0x02ca6714, 0x001e5df9}}}, + {X: Field{[10]uint32{0x0227a17f, 0x03d27158, 0x03511480, 0x039c108f, 0x0251036c, 0x02c687c0, 0x02a3cd56, 0x000804af, 0x02b1cb14, 0x002a2c3f}}, Y: Field{[10]uint32{0x01ba8a9f, 0x02773e9d, 0x037b527c, 0x02483225, 0x0367afe7, 0x00e00723, 0x00eedd6d, 0x02db6db3, 0x03db9d3a, 0x003335f0}}}, + {X: Field{[10]uint32{0x02d617d7, 0x0167db15, 0x02b26c90, 0x001aa11a, 0x006d02e4, 0x013d62e6, 0x02905797, 0x015d54c7, 0x01d9e181, 0x0015f397}}, Y: Field{[10]uint32{0x02142d14, 0x006b18ff, 0x01bc4e85, 0x03c97bf2, 0x01829f61, 0x02a3e6bb, 0x01598f8a, 0x03cc589a, 0x00904399, 0x00330d30}}}, + {X: Field{[10]uint32{0x00f9c858, 0x02e61bf4, 0x02f2d6c8, 0x031b2fc0, 0x008077b6, 0x0196acf9, 0x03bbc1d3, 0x03f1b6fb, 0x00b64f60, 0x0011e5e4}}, Y: Field{[10]uint32{0x007f2f9b, 0x022cd582, 0x03f435df, 0x006a57a6, 0x025cff91, 0x00f923e9, 0x025382ae, 0x00649774, 0x0182e358, 0x00055fd2}}}, + {X: Field{[10]uint32{0x03f17c68, 0x019421ff, 0x03b1ccb2, 0x0328f2cd, 0x008ee0a0, 0x004ef9db, 0x001b6228, 0x00290486, 0x007b1ffe, 0x000156af}}, Y: Field{[10]uint32{0x0171d99f, 0x03b7532a, 0x032d669b, 0x02fe0a0f, 0x01606272, 0x02877496, 0x039e6030, 0x01314d33, 0x024923e9, 0x002f44d0}}}, + {X: Field{[10]uint32{0x00d2e659, 0x019ce509, 0x011da1dc, 0x03807514, 0x02bd3156, 0x0397dc27, 0x004d4310, 0x0359eae0, 0x00328bf5, 0x001b29f8}}, Y: Field{[10]uint32{0x02ca2647, 0x008815d7, 0x01a69077, 0x03d1b4ac, 0x00d80aaa, 0x03e1c360, 0x011c2ff2, 0x00e42595, 0x0133f368, 0x00310a2c}}}, + {X: Field{[10]uint32{0x01f530d3, 0x0167a44b, 0x014dd999, 0x03ba706b, 0x02346ae4, 0x02ebea2c, 0x03d20baf, 0x0021b132, 0x01a983e9, 0x001837c6}}, Y: Field{[10]uint32{0x0379cc48, 0x022dec0e, 0x01e31d7a, 0x03e211c0, 0x01a09d60, 0x0393a393, 0x01c2f1e0, 0x005e8108, 0x005429f8, 0x0036b9ee}}}, + {X: Field{[10]uint32{0x03686bce, 0x009b5b74, 0x012c7e1d, 0x00141ae9, 0x035c22ff, 0x01668e11, 0x0180ea1c, 0x03cab6eb, 0x010e5ef5, 0x001bc635}}, Y: Field{[10]uint32{0x00d7d7a9, 0x00cdab7c, 0x038f513a, 0x01756d15, 0x00d3f340, 0x030de1b8, 0x00f5c83b, 0x03bf43eb, 0x020fa166, 0x003475fa}}}, + {X: Field{[10]uint32{0x03d949e0, 0x03a281cb, 0x01233b3b, 0x00399796, 0x01fcdfe0, 0x0377ba76, 0x009569a8, 0x004cd92b, 0x009d5ed5, 0x002d8d37}}, Y: Field{[10]uint32{0x0331db69, 0x01b40dba, 0x021a70e8, 0x01d9958a, 0x02fdf189, 0x0370d15b, 0x01a505cb, 0x0095d7c9, 0x02e2c61b, 0x0035cb91}}}, + {X: Field{[10]uint32{0x03445910, 0x0159bf65, 0x00f0e4fc, 0x020da7d7, 0x0340d919, 0x00f6f16a, 0x02461714, 0x0093cf99, 0x00f02dba, 0x00168dff}}, Y: Field{[10]uint32{0x01c69d1e, 0x010918dd, 0x00b59c33, 0x00f4a5d7, 0x0333e615, 0x00531e11, 0x02a95826, 0x01d1b198, 0x01d813f8, 0x002a5834}}}, + {X: Field{[10]uint32{0x0112661c, 0x00eb86fc, 0x029e11b8, 0x023c6aac, 0x01eeeb8f, 0x0065b63f, 0x00201b6b, 0x0200cb18, 0x02a73731, 0x0022abc5}}, Y: Field{[10]uint32{0x039a8e44, 0x02ead22a, 0x0215d611, 0x025661f1, 0x036d03a7, 0x0117cab9, 0x03cc0c28, 0x02929d58, 0x035666a3, 0x0031187b}}}, + {X: Field{[10]uint32{0x035e3434, 0x012e2bab, 0x0004d9cd, 0x024d0b0a, 0x011d85a6, 0x001ca711, 0x03e7f49e, 0x0057bf64, 0x03a5a05f, 0x00115bc2}}, Y: Field{[10]uint32{0x0311cad5, 0x01fb2c9c, 0x0135bb0f, 0x02f612e4, 0x0213f616, 0x00c10785, 0x006da131, 0x006a2dfd, 0x00a99922, 0x0029a03d}}}, + {X: Field{[10]uint32{0x00f5c741, 0x02cd32ce, 0x0170a9d0, 0x003e85e2, 0x014bfdc9, 0x00784b2e, 0x03146d93, 0x015025d7, 0x02a1f190, 0x003e270d}}, Y: Field{[10]uint32{0x0044099b, 0x0348dd67, 0x01646579, 0x0233ad28, 0x034b1df3, 0x0307fe8e, 0x01866159, 0x006e4a84, 0x008058e3, 0x000ed58b}}}, + {X: Field{[10]uint32{0x01f3f76a, 0x030940d0, 0x004289d2, 0x0398cbcc, 0x00e23876, 0x035a73ed, 0x00c49031, 0x02180036, 0x03112e1d, 0x001fdafa}}, Y: Field{[10]uint32{0x00ff4a9b, 0x03743b29, 0x02fb90cd, 0x035ba33d, 0x0008d98e, 0x00589ee6, 0x0194b9b5, 0x016bf2fa, 0x0007c092, 0x002864dd}}}, + {X: Field{[10]uint32{0x02d73511, 0x03718184, 0x000d3827, 0x010c653d, 0x011010f5, 0x03475400, 0x037130ba, 0x031f0de2, 0x00aab585, 0x002416b4}}, Y: Field{[10]uint32{0x037177a9, 0x02e00942, 0x018aab83, 0x007e8b82, 0x00a44782, 0x024745b5, 0x00130aee, 0x0334e054, 0x0301c3dd, 0x002ff381}}}, + {X: Field{[10]uint32{0x03408b6c, 0x0145487d, 0x032aef1d, 0x03d1d542, 0x01e54187, 0x02d80cf4, 0x001e7a30, 0x00bf29c8, 0x02d16212, 0x003d5670}}, Y: Field{[10]uint32{0x00154481, 0x0059eb4d, 0x017f25dc, 0x0108e33b, 0x037695ea, 0x00c4209c, 0x02f04dc4, 0x03ac51fd, 0x0222dfd0, 0x000fc435}}}, + {X: Field{[10]uint32{0x018ce8b4, 0x0364741c, 0x023456f4, 0x00330d85, 0x037c0d8a, 0x022fb7d4, 0x02e5830a, 0x00527332, 0x00a4fa17, 0x00066cca}}, Y: Field{[10]uint32{0x02582f64, 0x01134127, 0x00855126, 0x0024975a, 0x01fdff7f, 0x039e19de, 0x01258838, 0x01a48da6, 0x000a2a4e, 0x0026873a}}}, + {X: Field{[10]uint32{0x01ad5d4a, 0x024d922b, 0x03e533a3, 0x03d02487, 0x032743d4, 0x0069a82f, 0x00abc24c, 0x0066f3af, 0x00a0e756, 0x002beae6}}, Y: Field{[10]uint32{0x023a32db, 0x034e6fa4, 0x017157df, 0x038c4f5d, 0x007c8e5b, 0x007ca684, 0x0341c092, 0x00e695e5, 0x02877591, 0x002fc6ce}}}, + {X: Field{[10]uint32{0x024181c7, 0x0247f63b, 0x01085cca, 0x03ba05db, 0x01b2dfe0, 0x020ea3b2, 0x01b36d9c, 0x028d36b7, 0x037c1d86, 0x0030b2af}}, Y: Field{[10]uint32{0x0191070f, 0x0349ea93, 0x032acf51, 0x0143a725, 0x01159ab1, 0x03b3ae3d, 0x00465bd6, 0x00cd71c9, 0x032453f1, 0x0016ccad}}}, + {X: Field{[10]uint32{0x0289f593, 0x035b3f0a, 0x02be4f5a, 0x03e8b068, 0x024f6e9c, 0x03050d57, 0x028c5347, 0x01d148a6, 0x00248e84, 0x0024a0e5}}, Y: Field{[10]uint32{0x008c3a07, 0x02285c5f, 0x02996c88, 0x0057594b, 0x0051983b, 0x011bebda, 0x00a7b4a1, 0x03b81a67, 0x005dfd41, 0x002ee716}}}, + {X: Field{[10]uint32{0x033c7dfa, 0x030c3431, 0x03b4aa8d, 0x004b4327, 0x0155e55f, 0x005ef5eb, 0x00cba646, 0x03c61082, 0x013c389e, 0x002f28a1}}, Y: Field{[10]uint32{0x01df63a2, 0x02235e78, 0x01340175, 0x00b80799, 0x02fe9a14, 0x01a98bee, 0x005952b1, 0x03b7b4f5, 0x009ef32a, 0x0027d04a}}}, + {X: Field{[10]uint32{0x01bf56fd, 0x013ca05c, 0x037e4a0e, 0x02f4df29, 0x015745b7, 0x03399cb1, 0x0353aea5, 0x0196a3af, 0x03da94b5, 0x00293a9e}}, Y: Field{[10]uint32{0x013e96bc, 0x03339aa2, 0x00fb0970, 0x00c4deec, 0x02629eef, 0x00b1654f, 0x01e1a284, 0x03aa426e, 0x00851405, 0x0032541d}}}, + {X: Field{[10]uint32{0x00d5e169, 0x0139e318, 0x03b1ff75, 0x022a149e, 0x03da57c1, 0x02268900, 0x0327ced0, 0x004e7b5c, 0x0145af71, 0x001c5c1f}}, Y: Field{[10]uint32{0x00223ef9, 0x037a75c4, 0x0185f1b9, 0x00e7f4f1, 0x013eef0f, 0x01691df7, 0x034e4a85, 0x029bce8f, 0x0084fe4d, 0x00092cd9}}}, + {X: Field{[10]uint32{0x03df9a05, 0x029c1b93, 0x028c07dd, 0x03db5cc8, 0x015b1f5f, 0x01ae3fd4, 0x01cf4d23, 0x03d64675, 0x02030296, 0x0014b077}}, Y: Field{[10]uint32{0x02344d0e, 0x0074d356, 0x03c5135d, 0x00524181, 0x01c95097, 0x0368ede1, 0x00066e4f, 0x0355d0e1, 0x01590d73, 0x0036e563}}}, + {X: Field{[10]uint32{0x0368912f, 0x007a9888, 0x03120d8b, 0x001f7e09, 0x0374dc20, 0x02f32ee1, 0x0291989c, 0x03a114c1, 0x00b07852, 0x001ec270}}, Y: Field{[10]uint32{0x002bd263, 0x0027a13e, 0x01f3be9c, 0x01736a5e, 0x0109545a, 0x01e0ae93, 0x02ebeeb0, 0x00a05f43, 0x0317ffc5, 0x0013b7d5}}}, + {X: Field{[10]uint32{0x03b8300a, 0x031a277f, 0x02540681, 0x01899acc, 0x03f26e70, 0x038ecf00, 0x00088343, 0x0346a0af, 0x00ceb29a, 0x003a661c}}, Y: Field{[10]uint32{0x01597f9f, 0x01e16a33, 0x00fadc6f, 0x00f6448c, 0x008ff75e, 0x005345ea, 0x0012dbc6, 0x01f596f3, 0x01927894, 0x0020202b}}}, + {X: Field{[10]uint32{0x005c38e7, 0x00e90d08, 0x02444adc, 0x02f4ae44, 0x022dd2c2, 0x00f5317b, 0x01b4cb9c, 0x0204e617, 0x026de28b, 0x0031f88c}}, Y: Field{[10]uint32{0x02ad940e, 0x02fd7871, 0x0099d195, 0x023150f6, 0x01d31adf, 0x005df3c1, 0x0387000e, 0x0332547e, 0x03f9cdc0, 0x0017ca18}}}, + {X: Field{[10]uint32{0x023f7965, 0x026d574f, 0x02244119, 0x01ad7a94, 0x014c6bb6, 0x023ee922, 0x0186bfd2, 0x02f5e0f1, 0x02c84ca7, 0x00220d65}}, Y: Field{[10]uint32{0x00e9282e, 0x01af3896, 0x03ac6940, 0x016da3b3, 0x0147a22f, 0x00a516b2, 0x02d6d4a7, 0x017c4325, 0x03e85925, 0x003ec452}}}, + {X: Field{[10]uint32{0x020b42cc, 0x03adf8fc, 0x02dcf7ff, 0x0165794c, 0x035cf616, 0x01f95b9f, 0x03029dd3, 0x0103d6c3, 0x0248a196, 0x001fdce9}}, Y: Field{[10]uint32{0x00ff4feb, 0x013fea20, 0x0107f4a9, 0x006e7565, 0x0108ef19, 0x028ed09b, 0x022df3eb, 0x02bb7ed3, 0x008af931, 0x0013dd89}}}, + {X: Field{[10]uint32{0x0341aa3d, 0x030e0aa5, 0x015bddb9, 0x026a291e, 0x0218c873, 0x00465a99, 0x03b56040, 0x0340eb38, 0x034a3660, 0x003227b8}}, Y: Field{[10]uint32{0x02923884, 0x0346e544, 0x02084684, 0x0192e677, 0x03068387, 0x003bca4b, 0x0379ac9d, 0x02b15fcb, 0x008835fb, 0x002928ee}}}, + {X: Field{[10]uint32{0x0141d5bc, 0x0313b4f6, 0x023fd566, 0x02250c15, 0x01b5c468, 0x007607c6, 0x0050cf43, 0x00313940, 0x0056d7dc, 0x00092f93}}, Y: Field{[10]uint32{0x029e6213, 0x0268217c, 0x001cbac0, 0x031e95bf, 0x010f6a5f, 0x03c6b5da, 0x00714a2a, 0x00c5757c, 0x02e24936, 0x00381c8d}}}, + {X: Field{[10]uint32{0x000b94f5, 0x02e614f9, 0x02852c4e, 0x00749a4d, 0x022866a9, 0x008dea7c, 0x00ee5c53, 0x007001e6, 0x031ecaa9, 0x001b0c79}}, Y: Field{[10]uint32{0x00cf8cd7, 0x00f0e167, 0x03922572, 0x0365203d, 0x0134543c, 0x00c2e53a, 0x0117e0ac, 0x00b34704, 0x03232b5f, 0x00196bfc}}}, + {X: Field{[10]uint32{0x0258b7e7, 0x0007b5e3, 0x02286926, 0x01d34c7e, 0x03e470a5, 0x02d860e7, 0x003c0229, 0x01a4f4f8, 0x033c8479, 0x00141b0d}}, Y: Field{[10]uint32{0x01b7ab65, 0x00feb280, 0x023ca167, 0x01db83ff, 0x03e24f86, 0x001ffba0, 0x00bd4ae7, 0x0140d49a, 0x03d3a57c, 0x0013f42f}}}, + {X: Field{[10]uint32{0x018349a4, 0x0314ccb2, 0x01b45b48, 0x00247700, 0x0057571a, 0x01c7dcc7, 0x027b0978, 0x01b3185b, 0x01f3ea1a, 0x00167669}}, Y: Field{[10]uint32{0x01fc8447, 0x005b8355, 0x0363821c, 0x004c6a9a, 0x0153aadf, 0x029fb94e, 0x03c348f0, 0x025b0c98, 0x033eee64, 0x00252b4d}}}, + {X: Field{[10]uint32{0x02d75c69, 0x00e06cc8, 0x008d64de, 0x0274d991, 0x01c6f892, 0x01b399f5, 0x001912fa, 0x005923d9, 0x03ab6537, 0x00294933}}, Y: Field{[10]uint32{0x01782823, 0x028daa51, 0x0214471a, 0x01630fd1, 0x02ac1b61, 0x02f9f1e6, 0x026ae90b, 0x0356645e, 0x03f987fb, 0x0005309b}}}, + {X: Field{[10]uint32{0x0348c550, 0x03cb195f, 0x0276a92a, 0x03537c9b, 0x038aa3fd, 0x029ac8e4, 0x000d3ac6, 0x018c1e1f, 0x006df83c, 0x00049b26}}, Y: Field{[10]uint32{0x014c5c5c, 0x00595acf, 0x03d39774, 0x00757a6b, 0x003f74ab, 0x006b1cb8, 0x00f04dd3, 0x01be3cef, 0x01d3a56a, 0x0020214e}}}, + {X: Field{[10]uint32{0x00e39722, 0x0211d283, 0x01db7318, 0x035ee6a0, 0x00d8ff25, 0x03341554, 0x01a9d5b4, 0x033ec9f8, 0x03c01aeb, 0x000cb2ae}}, Y: Field{[10]uint32{0x03bccee9, 0x01bfac63, 0x035bb957, 0x0087eaa7, 0x02be1910, 0x03b9ad4a, 0x02c070f6, 0x00c71004, 0x020ae080, 0x001f4c04}}}, + {X: Field{[10]uint32{0x02f42c64, 0x03873e08, 0x025da359, 0x01905b70, 0x028a9f08, 0x0356992a, 0x00975aba, 0x035be2a6, 0x00baf7de, 0x000ff787}}, Y: Field{[10]uint32{0x035ac075, 0x00f2580b, 0x03f919ee, 0x02858373, 0x0044ffed, 0x024484b3, 0x0293cae6, 0x03c5d2c3, 0x00ac61f0, 0x0003943f}}}, + {X: Field{[10]uint32{0x01462e24, 0x024cb1c4, 0x0326b3ce, 0x00dc7b87, 0x0336e9db, 0x02c409c9, 0x013a08d6, 0x037ef007, 0x02cad6c3, 0x00272b48}}, Y: Field{[10]uint32{0x00461c6b, 0x0136e554, 0x015a6882, 0x00653967, 0x03422bb1, 0x02aaeed4, 0x00781cb0, 0x033411fc, 0x031d873d, 0x0016ba13}}}, + {X: Field{[10]uint32{0x015872ef, 0x014b465f, 0x0024e1c6, 0x027e4927, 0x010c20cf, 0x00706beb, 0x00ca18e9, 0x01d898ea, 0x0020aa80, 0x00026164}}, Y: Field{[10]uint32{0x03c73e69, 0x00152e34, 0x02dd6a3d, 0x03aecccb, 0x01a084e7, 0x03617e8e, 0x00976f72, 0x01f5b91c, 0x03fd21ab, 0x001150c8}}}, + {X: Field{[10]uint32{0x024eb2b6, 0x00c6e791, 0x033a9d8c, 0x014f112c, 0x00ac00bc, 0x02094a07, 0x03093b6c, 0x032f568a, 0x01a3e7cb, 0x002085a6}}, Y: Field{[10]uint32{0x02a9726a, 0x001cead9, 0x0384023b, 0x0146f39b, 0x03e62cf4, 0x02ef4fa7, 0x0344cbcb, 0x032e6dca, 0x00172400, 0x003df567}}}, + {X: Field{[10]uint32{0x00d370d9, 0x029fdb63, 0x02dad74e, 0x030ff0a1, 0x00440b3c, 0x031233ae, 0x01fc7a55, 0x00e189e5, 0x00be3642, 0x002f41b5}}, Y: Field{[10]uint32{0x0183b90e, 0x03354218, 0x017140ac, 0x014fef34, 0x0361bb12, 0x032ee023, 0x00a56632, 0x03b22329, 0x013a0fdc, 0x000ec246}}}, + {X: Field{[10]uint32{0x03bdf4d2, 0x010448d2, 0x038225bc, 0x013645df, 0x02bb4b73, 0x0010f1b2, 0x00a4ed0e, 0x031e37c1, 0x02e79c8c, 0x000b1c44}}, Y: Field{[10]uint32{0x00391243, 0x00fb108e, 0x01afd6e0, 0x03bd97fc, 0x02bae242, 0x02403d87, 0x012884ad, 0x008921d8, 0x03add42e, 0x00320733}}}, + {X: Field{[10]uint32{0x0122131e, 0x02deabf8, 0x03905762, 0x01bbc660, 0x03b7f523, 0x0377e73a, 0x03cbb8c9, 0x01dcb20c, 0x010fa65d, 0x00146b8e}}, Y: Field{[10]uint32{0x017ba06e, 0x01b86a3b, 0x02ec8125, 0x0387a13a, 0x000f1e96, 0x01f6edc5, 0x02f2a888, 0x01ac18a0, 0x03808040, 0x000f5f27}}}, + {X: Field{[10]uint32{0x02cc59ea, 0x0209b936, 0x027a177d, 0x01c9ae45, 0x02c74326, 0x00ecc4d5, 0x00b8348e, 0x01e90caf, 0x0112de23, 0x00316778}}, Y: Field{[10]uint32{0x01903b25, 0x0131a275, 0x012b0285, 0x000ea381, 0x00aa33e4, 0x017859db, 0x009c1d9c, 0x02d9b67c, 0x03167c5e, 0x000d8427}}}, + {X: Field{[10]uint32{0x0156d978, 0x000608fd, 0x030f757d, 0x039a4867, 0x02077ca1, 0x015d4c09, 0x01cb89a4, 0x02766c54, 0x023ab750, 0x0022e67c}}, Y: Field{[10]uint32{0x016a4164, 0x0380203d, 0x00e9adc8, 0x00be4132, 0x00d338e1, 0x02f355cf, 0x033cf0e4, 0x03f913d4, 0x02adf53a, 0x0021a8c6}}}, + {X: Field{[10]uint32{0x00369dd5, 0x0382ae5e, 0x0271739f, 0x01f277ba, 0x0261f5fb, 0x03bc620b, 0x024135a1, 0x02a6f67b, 0x03657d6f, 0x001319c3}}, Y: Field{[10]uint32{0x03e65417, 0x002de5fb, 0x01dd3c10, 0x00d46d4e, 0x01b54e04, 0x01fe2474, 0x0075dc10, 0x014d8c4a, 0x02265d4b, 0x0014c6a0}}}, + {X: Field{[10]uint32{0x00f38548, 0x0233b778, 0x0333d938, 0x037277c3, 0x0036aed9, 0x015fc190, 0x03024e6e, 0x003e57f5, 0x02359daa, 0x0023a59f}}, Y: Field{[10]uint32{0x010d218f, 0x0285d946, 0x00d2f1f1, 0x02c7c058, 0x0145fa0a, 0x028440e0, 0x008b833b, 0x03ea9632, 0x015ba59a, 0x000dbe01}}}, + {X: Field{[10]uint32{0x032ac9e1, 0x03a78cce, 0x03c3ec82, 0x01f0231e, 0x015e2e09, 0x03c33256, 0x007bfaac, 0x028df417, 0x01159c45, 0x000fd846}}, Y: Field{[10]uint32{0x0197d7d6, 0x00cb80b5, 0x014faf6c, 0x03b896dd, 0x03b9d2f3, 0x03bab694, 0x02087578, 0x01f7148f, 0x034ab743, 0x00032004}}}, + {X: Field{[10]uint32{0x007641d9, 0x0140033d, 0x007459f8, 0x020e1c1c, 0x0366bba6, 0x01faf7b7, 0x03b203ac, 0x0104ad4f, 0x009d7c61, 0x000fd679}}, Y: Field{[10]uint32{0x003ad5b0, 0x038958e9, 0x010f2ae3, 0x01e261b5, 0x0264cd09, 0x03d77353, 0x038f1010, 0x037f8f48, 0x00884243, 0x002fb75c}}}, + {X: Field{[10]uint32{0x03f6d490, 0x032be1d6, 0x02781bbb, 0x036865e8, 0x01ad46d4, 0x033c5c3a, 0x0044b5bf, 0x00da90ef, 0x00c9b648, 0x0016df61}}, Y: Field{[10]uint32{0x034d984f, 0x00ffb0ac, 0x0156a7c7, 0x016e64a0, 0x03f2164e, 0x001f7c12, 0x00b89755, 0x02c3ffeb, 0x029cc7d6, 0x0027d56c}}}, + {X: Field{[10]uint32{0x01744b1c, 0x030a7a94, 0x02a88962, 0x003681c6, 0x0390decf, 0x02bf0faa, 0x03bf1f9a, 0x03a0f3dc, 0x00ae0ac3, 0x00387b9d}}, Y: Field{[10]uint32{0x01277030, 0x0331423c, 0x0221650a, 0x016e0319, 0x01eefbe1, 0x020e60e7, 0x028d6748, 0x02149415, 0x02f8b34e, 0x0027a1b4}}}, + {X: Field{[10]uint32{0x03eea871, 0x03125ada, 0x0200e5dd, 0x02b2fbb8, 0x01eba721, 0x025b29fb, 0x0196c22e, 0x0251238c, 0x015b8d48, 0x003e8733}}, Y: Field{[10]uint32{0x039bc469, 0x0396154b, 0x01829d25, 0x012ff4aa, 0x02851350, 0x01e95b5f, 0x02479a8a, 0x01995275, 0x019a326a, 0x0038adfd}}}, + {X: Field{[10]uint32{0x03fdc8bf, 0x03c30e9e, 0x027a04c9, 0x01afde97, 0x00b29231, 0x02d298eb, 0x02199d1a, 0x0182587d, 0x00d70f38, 0x003bc787}}, Y: Field{[10]uint32{0x0298ef05, 0x014430ae, 0x00687eeb, 0x01dd5677, 0x025783d3, 0x0104794c, 0x015dadce, 0x0044760e, 0x0001a9de, 0x00133be7}}}, + {X: Field{[10]uint32{0x01326120, 0x0391a2b8, 0x02e8e9b3, 0x02565687, 0x020fe9c3, 0x01204f6c, 0x025cc4ed, 0x034eeb7e, 0x02b93e75, 0x0036dc53}}, Y: Field{[10]uint32{0x0271a206, 0x00a56a9a, 0x0067f618, 0x00059970, 0x00fa3cb7, 0x02205a10, 0x0130311c, 0x01e3d213, 0x0286b812, 0x000f7126}}}, + {X: Field{[10]uint32{0x02ea5d5a, 0x03ccbfb9, 0x0045229a, 0x031e6b47, 0x03d70c79, 0x03a74ffa, 0x00cf936e, 0x00a1610f, 0x038dbd57, 0x001665fc}}, Y: Field{[10]uint32{0x03e4a224, 0x01a695a5, 0x00eec45a, 0x01e37d52, 0x031f44b6, 0x01970777, 0x0349e089, 0x00046ee5, 0x0062b716, 0x002b7df6}}}, + {X: Field{[10]uint32{0x03baeb92, 0x03bb0f4e, 0x00039ea4, 0x02f4ef1b, 0x02956654, 0x03f07f1e, 0x008ae666, 0x0015ddec, 0x02d90a92, 0x0025f5bd}}, Y: Field{[10]uint32{0x020068b9, 0x03c6d730, 0x03c684bd, 0x037d39ff, 0x03ce03fe, 0x00f7eefd, 0x015ab971, 0x0261536b, 0x0047ff21, 0x002d1437}}}, + {X: Field{[10]uint32{0x02d307c4, 0x00034016, 0x010abc4b, 0x032875ac, 0x0040232b, 0x013bbe67, 0x0149ae3c, 0x02dcada5, 0x03cd5ec8, 0x0013d14f}}, Y: Field{[10]uint32{0x01683f7f, 0x01303482, 0x038160b9, 0x017b59a3, 0x00bd61f1, 0x0258367a, 0x02442baf, 0x02f21f1e, 0x0168c4a8, 0x002ab7b5}}}, + {X: Field{[10]uint32{0x009424d6, 0x01c9c165, 0x031e6499, 0x0243036d, 0x00ae4c44, 0x02a9e51b, 0x01c0a6ac, 0x00c0d71c, 0x00a35059, 0x00016981}}, Y: Field{[10]uint32{0x033be9c8, 0x01e9bd04, 0x0186a893, 0x0278bde1, 0x01ae8277, 0x03ea2742, 0x02b92b93, 0x00069e80, 0x00126d87, 0x00395e3f}}}, + {X: Field{[10]uint32{0x03c635b3, 0x0061a581, 0x004985d1, 0x0324d382, 0x022de601, 0x02d7fa3b, 0x024cf0d5, 0x00cbe86d, 0x01a29168, 0x000fcc1c}}, Y: Field{[10]uint32{0x011ad3a3, 0x02147911, 0x0070d053, 0x01706f91, 0x038712f2, 0x0277c390, 0x02adb6f6, 0x02c8cec8, 0x01990bae, 0x003a456c}}}, + {X: Field{[10]uint32{0x001c06e5, 0x01252464, 0x02c45318, 0x01b0bb79, 0x02f7476a, 0x03e67088, 0x0302c5fb, 0x0226b3f3, 0x01cd6431, 0x001d16f0}}, Y: Field{[10]uint32{0x029933f0, 0x024741b4, 0x01d21872, 0x0107409d, 0x00be16cb, 0x0039676d, 0x02519bd1, 0x01dd77a6, 0x034a8703, 0x001668ae}}}, + {X: Field{[10]uint32{0x0237238e, 0x02024449, 0x01942175, 0x00da29b0, 0x01ab3967, 0x018e1e62, 0x03591a60, 0x02567614, 0x028cadb3, 0x002ef41b}}, Y: Field{[10]uint32{0x00b8b690, 0x013b7b4e, 0x00c2a02b, 0x000e9968, 0x00d562b0, 0x0242e1a9, 0x006cb880, 0x0397cf71, 0x0296b484, 0x002b8360}}}, + {X: Field{[10]uint32{0x022cf07c, 0x014ff524, 0x017a385e, 0x01a6debe, 0x029f3eb5, 0x00e8ecd7, 0x00b7e436, 0x02f99a14, 0x01b6128d, 0x003f36a3}}, Y: Field{[10]uint32{0x01551974, 0x03d4d7fe, 0x03f283a0, 0x03a0a817, 0x02cd11f1, 0x03135721, 0x0358ee14, 0x03e6a17d, 0x01fc37a0, 0x0012fcf7}}}, + {X: Field{[10]uint32{0x0073cce2, 0x006b7666, 0x015705ca, 0x025d3b7b, 0x034ed2da, 0x01c84332, 0x025e1132, 0x01f7b4a9, 0x03dffc9c, 0x0018c977}}, Y: Field{[10]uint32{0x00f222e1, 0x0355b4d3, 0x033584d7, 0x003ebc69, 0x027ce193, 0x0185e7fa, 0x00ada7e2, 0x01bf1c5c, 0x0099683e, 0x00227f93}}}, + {X: Field{[10]uint32{0x02ee0d7f, 0x038fca48, 0x02d59245, 0x026d068e, 0x03513df5, 0x009e7429, 0x035797a5, 0x014258ea, 0x00a69349, 0x001dd653}}, Y: Field{[10]uint32{0x01faabb2, 0x023760f9, 0x024a9581, 0x00ef299a, 0x03631df0, 0x03cbbd63, 0x02ddf45e, 0x02ff23f7, 0x01122ccf, 0x000657ac}}}, + {X: Field{[10]uint32{0x02a67867, 0x005514ae, 0x0027bede, 0x01f80c21, 0x02e2defd, 0x019649dc, 0x01348fdc, 0x0090bd3c, 0x0067ea9b, 0x003cd5bb}}, Y: Field{[10]uint32{0x0233ba7a, 0x00bed335, 0x00121e4a, 0x00423c41, 0x03d75a21, 0x03262c0f, 0x02b71459, 0x023a9268, 0x01b9e23f, 0x000f4899}}}, + {X: Field{[10]uint32{0x00a205c9, 0x03f74bbe, 0x012ffcad, 0x002d6428, 0x0186149f, 0x03e2b9be, 0x00e30914, 0x02923b1e, 0x02129b0f, 0x000cd82b}}, Y: Field{[10]uint32{0x01d18a34, 0x014b7dc9, 0x00b83dcb, 0x01478cdf, 0x023d7a20, 0x00ac2989, 0x00098722, 0x016844fb, 0x03f2720d, 0x001e6cde}}}, + {X: Field{[10]uint32{0x01e8727b, 0x0056b4fe, 0x032823fc, 0x02ae7fc3, 0x03b29040, 0x0311d84f, 0x031a4c5f, 0x031436cc, 0x0352c703, 0x00113a43}}, Y: Field{[10]uint32{0x02f55f17, 0x027b0178, 0x02feb400, 0x00789b45, 0x0295c249, 0x00624cbd, 0x02d013a7, 0x00f9bd8d, 0x03419265, 0x0018b7ec}}}, + {X: Field{[10]uint32{0x02c84047, 0x000ad793, 0x0209ee79, 0x0225462a, 0x01c9e042, 0x02ca3f8d, 0x01958764, 0x02b888c4, 0x03a9b5c3, 0x003974d9}}, Y: Field{[10]uint32{0x02f8bcf0, 0x02a62f39, 0x02ace9c9, 0x02d308e0, 0x03fbbc06, 0x001c14b9, 0x0337c069, 0x03c3e9be, 0x017f01ab, 0x003a86c9}}}, + {X: Field{[10]uint32{0x01a63957, 0x01504ed6, 0x038de100, 0x02af820e, 0x010559ba, 0x008a01a9, 0x0061e6d4, 0x0396b4f0, 0x00fd7910, 0x00211e3a}}, Y: Field{[10]uint32{0x022df1d6, 0x0306f0c6, 0x03d5cfd8, 0x02f6d24b, 0x032f3f1e, 0x0052f52f, 0x03e38c45, 0x00d2644f, 0x00180519, 0x0013de4d}}}, + {X: Field{[10]uint32{0x0284b42d, 0x033dd84a, 0x01b6dc2c, 0x03ffda15, 0x0010c97d, 0x01e7249d, 0x035e2240, 0x01cc6fd6, 0x03c80587, 0x0030e0c9}}, Y: Field{[10]uint32{0x01abfcd6, 0x015f5493, 0x01b22bc6, 0x03eae157, 0x00a213fe, 0x0004b39d, 0x007d61f5, 0x0040b9fa, 0x03accb1b, 0x003ac0eb}}}, + {X: Field{[10]uint32{0x0051f10a, 0x00ad486f, 0x0214cd62, 0x02d9813b, 0x024662b4, 0x005fca28, 0x00f48c9d, 0x0299c956, 0x00125348, 0x002e7a2a}}, Y: Field{[10]uint32{0x031ccfee, 0x02b5ccbb, 0x0344ce3d, 0x02ee5e85, 0x033813e7, 0x01dc6d48, 0x02a02241, 0x0341ed47, 0x000d65fc, 0x000d709e}}}, + {X: Field{[10]uint32{0x01cc713e, 0x0229ca69, 0x030fdcc6, 0x00f48506, 0x03d3c3b5, 0x002ea1ab, 0x012e4837, 0x028c94e3, 0x02d595cf, 0x002952a8}}, Y: Field{[10]uint32{0x03b8a159, 0x03ea81a2, 0x02baf4e1, 0x02e68cba, 0x007e9552, 0x02a14692, 0x036b9c86, 0x00acbb99, 0x006e63c0, 0x002fdd37}}}, + {X: Field{[10]uint32{0x029fd956, 0x006787f6, 0x015ea4cc, 0x02b61735, 0x00420ce2, 0x02e2212b, 0x00ad145f, 0x0153ae11, 0x003ce2df, 0x003517fb}}, Y: Field{[10]uint32{0x00b81bd6, 0x03122fe3, 0x0208d205, 0x039fb9d2, 0x00bf6be1, 0x02308235, 0x001dbf9b, 0x032da9a4, 0x030065ae, 0x003b633e}}}, + {X: Field{[10]uint32{0x03192172, 0x03892b54, 0x0310187b, 0x02ae390c, 0x005c0136, 0x013360db, 0x0159829d, 0x02cc632a, 0x0298f728, 0x003d2d13}}, Y: Field{[10]uint32{0x01ea9fa1, 0x030a8262, 0x024e84d3, 0x022fc2a9, 0x012febdd, 0x033dee37, 0x0041fd88, 0x033924b2, 0x01b3960b, 0x003bd548}}}, + {X: Field{[10]uint32{0x013d67e3, 0x00b5090d, 0x039e2841, 0x031b8982, 0x00dcec40, 0x0214cc1e, 0x020cd40e, 0x024443ea, 0x01bf0d34, 0x0037b1b4}}, Y: Field{[10]uint32{0x01095895, 0x028bee99, 0x03b7254c, 0x02cc9041, 0x039451b0, 0x00bff243, 0x02fe44f3, 0x032405c7, 0x03813609, 0x001ce85b}}}, + {X: Field{[10]uint32{0x03ff013e, 0x02d6deac, 0x02039238, 0x0092f069, 0x01265f1c, 0x009cd4d3, 0x010b9c02, 0x01f1064c, 0x015372e1, 0x0007ef37}}, Y: Field{[10]uint32{0x006c27ca, 0x031dfc93, 0x0374f22b, 0x01d628a9, 0x03b2358f, 0x01c9d551, 0x004d14b9, 0x00704483, 0x034a06a6, 0x00273d3f}}}, + {X: Field{[10]uint32{0x02ab593b, 0x0004bef8, 0x03890357, 0x03e6a90e, 0x0250ea1f, 0x00e8c76a, 0x02d53f49, 0x01bb5deb, 0x00cb038c, 0x003673bc}}, Y: Field{[10]uint32{0x0253303f, 0x0030b74d, 0x0148604d, 0x004fb410, 0x01e161cd, 0x03c67769, 0x00e66547, 0x01cb56da, 0x02fe2468, 0x000ca905}}}, + {X: Field{[10]uint32{0x03f03da3, 0x01d29807, 0x03ccede1, 0x01f338cf, 0x024e2f60, 0x022348e1, 0x022135f0, 0x00a86117, 0x014988e2, 0x0005906d}}, Y: Field{[10]uint32{0x0194922f, 0x0237ef5f, 0x006fb5b6, 0x03473eb6, 0x0148e3ff, 0x0103e05b, 0x024e1b95, 0x021d9cd9, 0x00d9ed71, 0x003b74fc}}}, + {X: Field{[10]uint32{0x02243cdd, 0x014d9b0e, 0x0376f96c, 0x020eb13b, 0x0237938f, 0x03bd8059, 0x0238b211, 0x027fec6d, 0x00163c5d, 0x00267bdb}}, Y: Field{[10]uint32{0x02f66b48, 0x005da7b5, 0x02499a31, 0x02f9ae87, 0x027f912b, 0x03c10f80, 0x01d7796d, 0x01607787, 0x0362d819, 0x001adbbb}}}, + {X: Field{[10]uint32{0x035bc97c, 0x0119e7d6, 0x03fe4e2f, 0x02ca3a93, 0x02b9c47f, 0x0314d917, 0x03f79b09, 0x00ba2e03, 0x012dc24c, 0x00124d63}}, Y: Field{[10]uint32{0x001cf5b4, 0x00df2bb7, 0x03865378, 0x0121efb8, 0x03b8c807, 0x023872bd, 0x03c1cbff, 0x0103afbd, 0x00a7f9df, 0x00144a85}}}, + {X: Field{[10]uint32{0x00eb206b, 0x03b2119f, 0x02ee8a4e, 0x029690c2, 0x03c8c122, 0x00533ce0, 0x009c5e1a, 0x037fa495, 0x03cfb1de, 0x0038c74f}}, Y: Field{[10]uint32{0x01b0449b, 0x00eb95a9, 0x03687e6c, 0x02b6d379, 0x01effc4d, 0x020d193e, 0x03ad1dde, 0x01d1ec28, 0x026669db, 0x001ef0f0}}}, + {X: Field{[10]uint32{0x02c64adf, 0x00933861, 0x015d44e3, 0x01fe5e68, 0x03ad1fbb, 0x00a35d20, 0x0332e66a, 0x02f2b7ee, 0x01d6ac86, 0x002a0bb2}}, Y: Field{[10]uint32{0x00f74c89, 0x03b1b4c3, 0x01f816c4, 0x03402c78, 0x023a9efa, 0x031de64d, 0x02b46f1a, 0x006b97d2, 0x012bc28b, 0x002eb21f}}}, + {X: Field{[10]uint32{0x00ea113d, 0x02d4f532, 0x01c081bf, 0x030c631c, 0x020dc370, 0x02334eae, 0x01ab82b1, 0x028b891e, 0x01942bff, 0x00085942}}, Y: Field{[10]uint32{0x001fcae3, 0x029df272, 0x03103fec, 0x02fa697c, 0x00f84511, 0x009067e4, 0x0113b6f6, 0x00d142f9, 0x006a2f65, 0x0025ea09}}}, + {X: Field{[10]uint32{0x02dd4b84, 0x03acd8b1, 0x0057f63c, 0x0318f6d6, 0x01e4e666, 0x01123a41, 0x01f8070e, 0x025a21ff, 0x00d8208d, 0x001cd414}}, Y: Field{[10]uint32{0x02b9e2e9, 0x0007e78a, 0x03918900, 0x032eb4c1, 0x00216887, 0x0320866b, 0x03e23f07, 0x0187279b, 0x00385636, 0x000b8fed}}}, + {X: Field{[10]uint32{0x03afe506, 0x02ced991, 0x008ba197, 0x0001e770, 0x0365f878, 0x02e70fa6, 0x00c3813b, 0x0370228d, 0x0061e679, 0x00074086}}, Y: Field{[10]uint32{0x02fd2f1f, 0x029ae9e9, 0x03c50cea, 0x0133b82d, 0x004a10e8, 0x00a56fc2, 0x0292cd0e, 0x0120f427, 0x00b92303, 0x00052db4}}}, + {X: Field{[10]uint32{0x02d7810b, 0x0313d391, 0x0033c1bd, 0x01dd2615, 0x03f91c55, 0x013bfe5b, 0x018c15d5, 0x0225cea1, 0x027486ca, 0x001e9fbb}}, Y: Field{[10]uint32{0x03b498cf, 0x004b2edd, 0x02297c70, 0x006ef078, 0x03448fed, 0x01f46733, 0x035057d8, 0x01439e9f, 0x007f5d91, 0x0017a0e8}}}, + {X: Field{[10]uint32{0x0302beec, 0x039c9b69, 0x00b51f50, 0x0008cbc9, 0x02485938, 0x00a8cab6, 0x0005cce3, 0x00c1851f, 0x03d4fe0a, 0x00020470}}, Y: Field{[10]uint32{0x033d9f0a, 0x03acaf20, 0x034efc95, 0x0274c7b5, 0x03b28e59, 0x016b615d, 0x004214e3, 0x03d3e4ba, 0x016c6c9c, 0x0029bf30}}}, + {X: Field{[10]uint32{0x01ad606c, 0x01f69248, 0x0150b435, 0x0020c2ba, 0x03ca25ed, 0x0112c9b4, 0x00d5b1ee, 0x027a3c09, 0x003889ea, 0x000b2851}}, Y: Field{[10]uint32{0x0026c551, 0x004398c4, 0x0186f42e, 0x038dd04f, 0x03c5e90b, 0x03e39884, 0x002c6560, 0x028a7c2a, 0x02c692d8, 0x001ed229}}}, + {X: Field{[10]uint32{0x010277bf, 0x02c7c7ce, 0x01c80d57, 0x02977bba, 0x005dd3e0, 0x015f9989, 0x01566d29, 0x006bf0ce, 0x03e16104, 0x002a603f}}, Y: Field{[10]uint32{0x03a1c64c, 0x01051581, 0x007fd10e, 0x0015c739, 0x01457d50, 0x0285d366, 0x03440797, 0x00d0ee1d, 0x03a2a139, 0x000c9dbd}}}, + {X: Field{[10]uint32{0x01cd80bd, 0x0275bab6, 0x026bc957, 0x02639977, 0x01fde41d, 0x026364dc, 0x002954a9, 0x02dd3f16, 0x03d9cbcc, 0x00395c28}}, Y: Field{[10]uint32{0x02973a52, 0x026af905, 0x022df273, 0x01af1f7a, 0x019400bc, 0x00b05a2f, 0x01d30351, 0x00e63826, 0x01776658, 0x00169d24}}}, + {X: Field{[10]uint32{0x03ce1110, 0x025530de, 0x018c972b, 0x03ed988d, 0x0171bd25, 0x024a02eb, 0x013d985d, 0x03d4399b, 0x02b8952c, 0x003d7eea}}, Y: Field{[10]uint32{0x03d77175, 0x03d5fcc7, 0x006cfb02, 0x023400eb, 0x03801081, 0x01229d13, 0x03097c9b, 0x03e08693, 0x01236179, 0x0006b288}}}, + {X: Field{[10]uint32{0x018d89be, 0x0277a85c, 0x03375555, 0x017b136f, 0x016f9e52, 0x012adf1d, 0x0008d258, 0x02a2b055, 0x02fbecbd, 0x000b9650}}, Y: Field{[10]uint32{0x00bc790b, 0x0155bec5, 0x0201640c, 0x006a3032, 0x0230e12a, 0x01ad6498, 0x0123d6cf, 0x02669e3c, 0x0107d141, 0x00254419}}}, + {X: Field{[10]uint32{0x015dd296, 0x00cc006d, 0x0013ea2f, 0x00fe9ce5, 0x010a9fc8, 0x026eadc1, 0x01e7f64a, 0x0267a5b2, 0x00a9891c, 0x0024af41}}, Y: Field{[10]uint32{0x022ba587, 0x0067eb60, 0x01fbf130, 0x00d08859, 0x035cc71c, 0x005eda83, 0x0017ba68, 0x03f67395, 0x0333659b, 0x0033d78d}}}, + {X: Field{[10]uint32{0x03b11083, 0x034c1069, 0x008ffed7, 0x02c219c9, 0x024d0e52, 0x00f77358, 0x00c54269, 0x03ab878f, 0x019fa50f, 0x000c377f}}, Y: Field{[10]uint32{0x02eb42ed, 0x036bd989, 0x0241b14b, 0x003e1eb1, 0x0221bdfa, 0x03d09a72, 0x00389e3d, 0x020fbe86, 0x00fe2bb1, 0x003fc574}}}, + {X: Field{[10]uint32{0x012a9f4f, 0x00e779c9, 0x03f1cbaf, 0x036dcbe9, 0x00067ddd, 0x0115c679, 0x03196882, 0x031a2abc, 0x010bdf8a, 0x00233d45}}, Y: Field{[10]uint32{0x0186cfd5, 0x003f0150, 0x0007a213, 0x02ad0516, 0x002a9963, 0x00232636, 0x0318bc25, 0x02ec660e, 0x017ba299, 0x00130a12}}}, + {X: Field{[10]uint32{0x025e46c7, 0x00ca2149, 0x001b8690, 0x002637b3, 0x014a8e3c, 0x03db765e, 0x02ed9f74, 0x013becf2, 0x02fd5097, 0x0007d2d3}}, Y: Field{[10]uint32{0x039fd399, 0x031bfac5, 0x00a76ee1, 0x00a49940, 0x02685352, 0x011f1f02, 0x00adeb8a, 0x02c0370e, 0x00c7f7c6, 0x001b12c1}}}, + {X: Field{[10]uint32{0x0091af81, 0x00a2c634, 0x029a22a0, 0x02e43cb8, 0x003f915c, 0x004f40e3, 0x01883bad, 0x03e8ce35, 0x0100979a, 0x00275492}}, Y: Field{[10]uint32{0x0002be38, 0x0059e79a, 0x033e1e0f, 0x031c2e69, 0x03db3257, 0x02c5874c, 0x004453d6, 0x01ccb444, 0x013c037c, 0x00102684}}}, + {X: Field{[10]uint32{0x01a2e3a1, 0x01fcd2f7, 0x00734c62, 0x0133cfec, 0x005b0398, 0x0308d00f, 0x01c124c1, 0x036743f5, 0x00e446ee, 0x0014b879}}, Y: Field{[10]uint32{0x008320a7, 0x010c85c2, 0x03e5b262, 0x00c1d69d, 0x02e2dbc6, 0x00b05c4e, 0x004104f1, 0x03fea30f, 0x03317375, 0x0019d295}}}, + {X: Field{[10]uint32{0x02401c8b, 0x00bdea05, 0x03148fd2, 0x024e9df5, 0x020e0a6c, 0x031b8dbe, 0x00a8b6e7, 0x0138c79b, 0x031a8eef, 0x00209ec5}}, Y: Field{[10]uint32{0x03ca7540, 0x017cd93d, 0x01f08827, 0x03e84a7e, 0x001d58c7, 0x01e2e845, 0x026d14cb, 0x00073df7, 0x01fdd9b8, 0x00197361}}}, + {X: Field{[10]uint32{0x00df2f9b, 0x03e45edb, 0x00383c83, 0x01506fa8, 0x023db299, 0x0160b891, 0x01abc32e, 0x025909a8, 0x01e961d8, 0x000493d1}}, Y: Field{[10]uint32{0x038d6c62, 0x02d359e5, 0x00f8358b, 0x01f484e9, 0x03e48e7a, 0x018a23e1, 0x020626fc, 0x0196c4b5, 0x03e4110b, 0x001cd38b}}}, + {X: Field{[10]uint32{0x024d67e2, 0x03d5a666, 0x011695f5, 0x035b0234, 0x00fb4ac9, 0x02648131, 0x024f0028, 0x02cc9043, 0x029818b2, 0x0000edc4}}, Y: Field{[10]uint32{0x02c27c3b, 0x01f07ed0, 0x02218560, 0x01a2862b, 0x0154ba63, 0x03119582, 0x0010c51e, 0x005ad570, 0x038b0cee, 0x000a2dbd}}}, + {X: Field{[10]uint32{0x012d8a00, 0x000ced54, 0x020a4290, 0x02871fdf, 0x02e2b887, 0x029ab9c3, 0x0264485e, 0x014d8c39, 0x007e063b, 0x00349c76}}, Y: Field{[10]uint32{0x016da847, 0x008e3ae7, 0x01c9b510, 0x009cd25c, 0x0060ef59, 0x03619134, 0x03122ba8, 0x038a009c, 0x00047865, 0x0019750e}}}, + {X: Field{[10]uint32{0x00dc03a7, 0x0252c943, 0x01661e84, 0x0326b9ef, 0x000c5ca0, 0x00ae954b, 0x00d2d82e, 0x0145819f, 0x01852db3, 0x0007471b}}, Y: Field{[10]uint32{0x02691f62, 0x02c40153, 0x02ebbae8, 0x0132f75e, 0x01e19f87, 0x02bba80d, 0x01b68407, 0x00095bba, 0x00c5673a, 0x002f0c7d}}}, + {X: Field{[10]uint32{0x02efdd9d, 0x01d5bf51, 0x007fb1d3, 0x0331a559, 0x00bf8d2e, 0x02e81f79, 0x02d274c0, 0x02530376, 0x01b471e3, 0x0023fba2}}, Y: Field{[10]uint32{0x012b8c6c, 0x0298bc6f, 0x034c434c, 0x01c51aa6, 0x034ba5cf, 0x00663e73, 0x03ae1487, 0x015e3f45, 0x00c38479, 0x001757b4}}}, + {X: Field{[10]uint32{0x0010a6ec, 0x03ef4c22, 0x02ce55d7, 0x017e4236, 0x018ef938, 0x038fb91d, 0x026302cc, 0x03cd4580, 0x030955a0, 0x001a07f3}}, Y: Field{[10]uint32{0x02a38faa, 0x00d63280, 0x00885e6d, 0x03d0643c, 0x00aa54e8, 0x013195d7, 0x0187edbc, 0x01d89200, 0x035b9992, 0x0010c1fd}}}, + {X: Field{[10]uint32{0x03a6971b, 0x024a4dec, 0x02918907, 0x0225ff0c, 0x026f6c1a, 0x001334f8, 0x0184a289, 0x029c6da9, 0x02ddfcb5, 0x001c5ff5}}, Y: Field{[10]uint32{0x00b17992, 0x036167d6, 0x02511d7c, 0x0174d075, 0x021b05e2, 0x01fdb6a3, 0x00405532, 0x02b4137f, 0x002971d4, 0x002d00fe}}}, + {X: Field{[10]uint32{0x014f2ff6, 0x0004f8dd, 0x03a34227, 0x01e71cc8, 0x00d29832, 0x02b630d0, 0x01f49986, 0x025e1b70, 0x032394eb, 0x003cae55}}, Y: Field{[10]uint32{0x0366763b, 0x02925f9d, 0x0120ddba, 0x00179e99, 0x03bb69e7, 0x02645edc, 0x009645dd, 0x033505c6, 0x03813efd, 0x002d54f4}}}, + {X: Field{[10]uint32{0x02730b1b, 0x01d21765, 0x017b1423, 0x0340755b, 0x019ab6fe, 0x00504d70, 0x0309b524, 0x01b22594, 0x03e6d7d8, 0x00161c52}}, Y: Field{[10]uint32{0x03e3e533, 0x0293579b, 0x03cf81c9, 0x01717e93, 0x03403984, 0x0038c54d, 0x02b84abf, 0x03396f7a, 0x03343e38, 0x00030047}}}, + {X: Field{[10]uint32{0x026ff3c3, 0x0056f01e, 0x0223b7f9, 0x03eecafa, 0x02b30819, 0x0271ad3e, 0x0300d49e, 0x03e306e5, 0x01abc828, 0x0034cf39}}, Y: Field{[10]uint32{0x01a23395, 0x0293045d, 0x0156fcac, 0x013cdf6e, 0x01ef5939, 0x03ef88bc, 0x0372ba63, 0x01262088, 0x02223913, 0x001ce6d8}}}, + {X: Field{[10]uint32{0x03b55479, 0x01ec9b58, 0x020d5983, 0x00235be4, 0x02249048, 0x00bdf652, 0x03a58ff4, 0x0004a13a, 0x0232fc7d, 0x0020880b}}, Y: Field{[10]uint32{0x0163b4c8, 0x000ced89, 0x0004dedd, 0x000a6800, 0x0063aa32, 0x02b0b220, 0x004fb0a8, 0x015793f3, 0x015450aa, 0x003f798e}}}, + {X: Field{[10]uint32{0x01ea7781, 0x027e9f0b, 0x022b7041, 0x021e8d09, 0x02941e64, 0x00322d92, 0x0300e370, 0x013223e8, 0x02185bfb, 0x0009798c}}, Y: Field{[10]uint32{0x0316e640, 0x03736fbd, 0x02a1142d, 0x00915230, 0x0209caa1, 0x019cc75f, 0x032d84cc, 0x02ae6537, 0x03074802, 0x002b9a5a}}}, + {X: Field{[10]uint32{0x005c114e, 0x006a56d8, 0x0048753c, 0x00e87bf7, 0x039da877, 0x010e837f, 0x0068a363, 0x01386bc9, 0x0205b925, 0x00380cda}}, Y: Field{[10]uint32{0x03b12a18, 0x036762eb, 0x01050d96, 0x0056776b, 0x015ba059, 0x011899b1, 0x03974553, 0x0368e1e6, 0x0160377a, 0x001075d6}}}, + {X: Field{[10]uint32{0x02996662, 0x01cc6aa6, 0x0375262d, 0x016b6d5e, 0x0134ee87, 0x01092270, 0x01a9253e, 0x02c6f472, 0x03af7fd2, 0x00210cd8}}, Y: Field{[10]uint32{0x03cde6ca, 0x034d58bf, 0x004734d2, 0x02c59b92, 0x0012c4b3, 0x0054e8ca, 0x00bda36f, 0x03c04fb5, 0x02d1dbfc, 0x00397028}}}, + {X: Field{[10]uint32{0x011178de, 0x03d8cca5, 0x03c0526d, 0x000a74a0, 0x03abb9f2, 0x029f95d8, 0x03955cff, 0x01fc63e5, 0x00b81cdb, 0x002b6c84}}, Y: Field{[10]uint32{0x00ea0e35, 0x02e4695d, 0x02cf068e, 0x03b0b86f, 0x01364db5, 0x0122be84, 0x03847219, 0x00aa9835, 0x0305d818, 0x000b0847}}}, + {X: Field{[10]uint32{0x024d7491, 0x019450bc, 0x036e088b, 0x0139615e, 0x02203460, 0x02684de4, 0x013854f5, 0x0088d7ba, 0x03a1a2fe, 0x002ac317}}, Y: Field{[10]uint32{0x000124d2, 0x00bde16e, 0x0132b8d9, 0x0337b29a, 0x03b9dc48, 0x01ce0d54, 0x00a73840, 0x01b855c7, 0x01cbe36d, 0x003951c9}}}, + {X: Field{[10]uint32{0x0085deda, 0x02f2235e, 0x01835f9c, 0x002d9eb3, 0x03868a08, 0x03d3d51c, 0x03124b0a, 0x018f90fc, 0x037a1d21, 0x000f9779}}, Y: Field{[10]uint32{0x01746630, 0x03994745, 0x036d2254, 0x03130dfb, 0x02e1927d, 0x01dfd452, 0x03e66b83, 0x000ee2e0, 0x00a42f95, 0x0029bb4d}}}, + {X: Field{[10]uint32{0x0191ec05, 0x03abbd92, 0x01ceb050, 0x0057e0ea, 0x01321848, 0x03ccbd9c, 0x031f0688, 0x034c996d, 0x033d31d1, 0x001831a2}}, Y: Field{[10]uint32{0x0000d498, 0x0183f29f, 0x0132a9d7, 0x00a5403b, 0x01898867, 0x021dcde9, 0x01aecbe9, 0x009322a5, 0x00619f7d, 0x0025deb3}}}, + {X: Field{[10]uint32{0x01c135e2, 0x0316cc5a, 0x0065464f, 0x00a5afa8, 0x014a1267, 0x019ae6c9, 0x0004a76a, 0x039656db, 0x02e9b646, 0x00086c14}}, Y: Field{[10]uint32{0x000779e7, 0x00262715, 0x0128538f, 0x035166aa, 0x0318db6e, 0x02c37f5f, 0x007292c4, 0x035c5dba, 0x00cd2fb3, 0x00040a79}}}, + {X: Field{[10]uint32{0x03523d68, 0x01f6e8de, 0x0379dc02, 0x03bd6c47, 0x02f58bb2, 0x002f9332, 0x0101e666, 0x011457b9, 0x02f37c66, 0x0001c032}}, Y: Field{[10]uint32{0x03a08be1, 0x024d31db, 0x00948e1a, 0x01f95bb7, 0x008eac9b, 0x02655e0c, 0x032487c1, 0x011bccb8, 0x0388f1c3, 0x001f7dda}}}, + {X: Field{[10]uint32{0x01541e8d, 0x01a59912, 0x01696299, 0x02bd5969, 0x015d34ae, 0x019160c5, 0x01f1c9f5, 0x02112b39, 0x03d21293, 0x00316ae6}}, Y: Field{[10]uint32{0x01c422d8, 0x0184c100, 0x02f29c03, 0x00315f6c, 0x029b34d9, 0x03b14e9f, 0x01f44678, 0x01b22a83, 0x01c6c61d, 0x000b4820}}}, + {X: Field{[10]uint32{0x016d75a3, 0x034dda80, 0x023dfa4a, 0x0375751a, 0x005713fb, 0x03085476, 0x00d15af8, 0x01770512, 0x032ed53f, 0x0022bf0f}}, Y: Field{[10]uint32{0x039b6c8f, 0x02c69392, 0x0389764d, 0x004fcd15, 0x036767c5, 0x00864f9a, 0x015a99d4, 0x02fb6780, 0x03932627, 0x000047d8}}}, + {X: Field{[10]uint32{0x025007a7, 0x01cf140e, 0x034d86e1, 0x019fb7a7, 0x02c0d698, 0x01eb8da0, 0x00cf7292, 0x03ab7f3d, 0x01c6bb55, 0x001052b6}}, Y: Field{[10]uint32{0x03603585, 0x0374e823, 0x03fd6181, 0x020bb6f7, 0x01dafb6f, 0x019e951b, 0x002306b6, 0x026c7444, 0x00f8f4de, 0x00312f34}}}, + {X: Field{[10]uint32{0x0304a1e3, 0x005c91f2, 0x008fdb23, 0x034eabc2, 0x01a163a2, 0x037109b4, 0x005ec88f, 0x01cc5ea7, 0x0240b84b, 0x00208478}}, Y: Field{[10]uint32{0x02722bbb, 0x0250ab49, 0x029be4e7, 0x02c5c2a7, 0x03a74f10, 0x016586cc, 0x006c4f6d, 0x02fd453c, 0x019bb268, 0x00329da9}}}, + {X: Field{[10]uint32{0x02ba700e, 0x01676bc8, 0x012f429e, 0x02450fb9, 0x023f7cd2, 0x00252c9e, 0x02c44523, 0x0374f1d7, 0x0132363a, 0x0029537f}}, Y: Field{[10]uint32{0x02d4490b, 0x02364bae, 0x02bbb279, 0x01d1aa4f, 0x013639ac, 0x026d1219, 0x038d1304, 0x000260f8, 0x022c5951, 0x003c5820}}}, + {X: Field{[10]uint32{0x018860f7, 0x029f2e52, 0x015e9a3b, 0x010f3ef6, 0x03e2921a, 0x0387a74f, 0x02ee1a81, 0x026c629e, 0x005552b2, 0x001df593}}, Y: Field{[10]uint32{0x0208ff10, 0x01bcb9e0, 0x025978d0, 0x02a43325, 0x020fed03, 0x01b6681a, 0x00ad9d73, 0x0323d110, 0x00f95ea9, 0x003a5eee}}}, + {X: Field{[10]uint32{0x02309ca9, 0x0251f85b, 0x03d61ba7, 0x000d83c4, 0x011b57c1, 0x00396862, 0x007f0f5f, 0x01afc47d, 0x0014b33e, 0x001216ce}}, Y: Field{[10]uint32{0x00e38bdb, 0x02098c81, 0x01b5f152, 0x01bcb1e0, 0x03f99857, 0x011b2194, 0x0050dd09, 0x01f18a98, 0x0070ce60, 0x0039aede}}}, + {X: Field{[10]uint32{0x0072739c, 0x01c1a3c0, 0x029aab0a, 0x032052bb, 0x017ced2a, 0x02dbb714, 0x03618be1, 0x01e30b7b, 0x01eca90a, 0x003b48e0}}, Y: Field{[10]uint32{0x034954c7, 0x0117fec4, 0x00fbc3de, 0x0058b284, 0x02d68599, 0x018d4e07, 0x00c291ec, 0x019148e0, 0x03e0ba32, 0x0032c21c}}}, + {X: Field{[10]uint32{0x00ed971d, 0x01795f11, 0x03a684a6, 0x019a3cb9, 0x02955b6a, 0x0132e83f, 0x03c7369a, 0x03049f20, 0x0379d36b, 0x0039112b}}, Y: Field{[10]uint32{0x03785fff, 0x031553f4, 0x034e9dd7, 0x03780434, 0x02ec50e5, 0x02922662, 0x0355ca16, 0x0208eaab, 0x030327b6, 0x0029e1db}}}, + {X: Field{[10]uint32{0x01fc1fca, 0x035f941a, 0x0278c07e, 0x022a5b2c, 0x03b8677b, 0x014bfa93, 0x024296c1, 0x0168b57d, 0x00d77de7, 0x002be30d}}, Y: Field{[10]uint32{0x0184d673, 0x0330ec8a, 0x00a8cf9e, 0x032e2e07, 0x02f3c451, 0x0118caf8, 0x015899f2, 0x0306a339, 0x0062ab6e, 0x00123396}}}, + {X: Field{[10]uint32{0x027efe13, 0x0150db3d, 0x000cbe31, 0x0221d812, 0x0108940c, 0x0368128c, 0x02745a81, 0x0113b463, 0x0066243a, 0x003a6675}}, Y: Field{[10]uint32{0x0237fe36, 0x0347ec00, 0x013cb2f7, 0x03adfea0, 0x00ef55d3, 0x0337b6f4, 0x02ac0e75, 0x01198708, 0x027063a8, 0x003d07a3}}}, + {X: Field{[10]uint32{0x004bcc72, 0x026d9118, 0x02d66e20, 0x02a962dc, 0x00072caf, 0x00bf7afb, 0x00c923a0, 0x0193fe8f, 0x00aa7d89, 0x003103be}}, Y: Field{[10]uint32{0x03238ce5, 0x03c189ed, 0x02c2f696, 0x031ecfbe, 0x00ff50eb, 0x01dbccde, 0x012c3b61, 0x02879bc4, 0x01b56549, 0x0012038d}}}, + {X: Field{[10]uint32{0x0252982f, 0x006c3ce6, 0x026151bd, 0x02288a89, 0x01679e4b, 0x00826a97, 0x012b546e, 0x01267226, 0x001de3f9, 0x00120bb9}}, Y: Field{[10]uint32{0x00d3de3d, 0x03fba077, 0x009f832e, 0x03b28395, 0x03563f92, 0x03843b1b, 0x012eff0e, 0x006054b5, 0x0070d213, 0x00144398}}}, + {X: Field{[10]uint32{0x0058fae5, 0x033dc997, 0x01fd465d, 0x00cb180a, 0x036df7ca, 0x034dbe2d, 0x0003c694, 0x0307599c, 0x006825a3, 0x00119829}}, Y: Field{[10]uint32{0x0223f618, 0x02fe842e, 0x017c0700, 0x0380540e, 0x03791de8, 0x00b6b7a5, 0x00acc720, 0x030a5a62, 0x03f546b5, 0x000f660a}}}, + {X: Field{[10]uint32{0x035d8f8d, 0x022fbc3a, 0x00d8703c, 0x0385d8c5, 0x00d8a3ae, 0x01d62665, 0x031dc033, 0x01bc2cfe, 0x024c92ba, 0x002e1798}}, Y: Field{[10]uint32{0x0175679b, 0x01861a2b, 0x0148688c, 0x009a19b3, 0x03e2cdff, 0x02cdbbdd, 0x03ff93ef, 0x016e9092, 0x033320a5, 0x002224da}}}, + {X: Field{[10]uint32{0x002683e3, 0x0261d524, 0x014c6b16, 0x00be53be, 0x03b3be28, 0x018bf56c, 0x0187ebab, 0x009afef4, 0x00b5361a, 0x00290648}}, Y: Field{[10]uint32{0x015ea98a, 0x031e92b8, 0x007d1491, 0x027c9819, 0x02c95a8f, 0x00814f80, 0x027201b3, 0x00ed34f4, 0x019629d9, 0x001de428}}}, + {X: Field{[10]uint32{0x03b7f86e, 0x025e7d3e, 0x03937055, 0x022c5541, 0x01ed1abf, 0x03c40762, 0x012f01bb, 0x00a980c9, 0x01a97926, 0x0024e20b}}, Y: Field{[10]uint32{0x009d7e44, 0x01024406, 0x03e0215a, 0x03c4fb4d, 0x0223e570, 0x0357c08b, 0x037450ba, 0x005bbc04, 0x004df0a7, 0x00024e22}}}, + {X: Field{[10]uint32{0x00952e00, 0x008c8972, 0x03b0679c, 0x016799bb, 0x03ebfa6a, 0x01c26c65, 0x0356b643, 0x036982b3, 0x01f83efe, 0x00284142}}, Y: Field{[10]uint32{0x024d1ddb, 0x03c19df0, 0x015fe830, 0x0291f038, 0x005a06e7, 0x0132b93e, 0x0237df52, 0x03793426, 0x03d5559b, 0x001d6420}}}, + {X: Field{[10]uint32{0x03eb3651, 0x02c7be4a, 0x02d294b3, 0x00122a89, 0x03c55de7, 0x03f9d7ab, 0x017e587d, 0x0109e1cf, 0x02976ea7, 0x000ae516}}, Y: Field{[10]uint32{0x02893c65, 0x003bd941, 0x03752698, 0x0043976b, 0x03cb488d, 0x0002d146, 0x01cbabce, 0x02fdae74, 0x03ed27cc, 0x00108f01}}}, + {X: Field{[10]uint32{0x03cc37f0, 0x01115ec3, 0x01073b59, 0x0244a354, 0x03f69516, 0x00fc5c05, 0x0203da01, 0x02ff9003, 0x01bbc1a0, 0x0021be76}}, Y: Field{[10]uint32{0x024c32bb, 0x031b19d1, 0x007eddf3, 0x00099249, 0x0362388f, 0x02f067a3, 0x039cd4bf, 0x00de5a4c, 0x02242e30, 0x003cdc31}}}, + {X: Field{[10]uint32{0x0161ed91, 0x0343e0f7, 0x0206c016, 0x003e42a4, 0x033aa9cc, 0x02f6d384, 0x038d8958, 0x00113988, 0x02f9555e, 0x003e2656}}, Y: Field{[10]uint32{0x02a8a060, 0x00964853, 0x014bcd08, 0x024d2bc6, 0x031febdb, 0x013e8b98, 0x00bdab83, 0x004b20ee, 0x02e31bee, 0x002cb534}}}, + {X: Field{[10]uint32{0x019394ce, 0x015105e0, 0x01dbe2f5, 0x00858f42, 0x00fdea26, 0x02ef071d, 0x01eee7f0, 0x00d4b515, 0x027f69eb, 0x002ad568}}, Y: Field{[10]uint32{0x031b801a, 0x01988038, 0x013534a1, 0x012a25e2, 0x024d5467, 0x012a4c38, 0x0373bc17, 0x0216d5c8, 0x009360f5, 0x0022b159}}}, + {X: Field{[10]uint32{0x023b9fa6, 0x022645a8, 0x02522e8a, 0x00ffeb6b, 0x03ce8472, 0x017a60d4, 0x02a89069, 0x037e6245, 0x02c9c428, 0x0013f041}}, Y: Field{[10]uint32{0x02b92031, 0x00c5a227, 0x02fd1925, 0x0129f066, 0x01fdebbc, 0x00e49a1f, 0x00c88be3, 0x00d0793d, 0x02e83d54, 0x002435cc}}}, + {X: Field{[10]uint32{0x03149a91, 0x01af2080, 0x036b2462, 0x036c2e81, 0x03874080, 0x00ea2538, 0x0187b257, 0x03332ddf, 0x01808831, 0x00327216}}, Y: Field{[10]uint32{0x02abf0b8, 0x00c0b8ec, 0x026e6a6f, 0x01a1e015, 0x02c5f992, 0x002f7e8d, 0x01a6355f, 0x0127e6fa, 0x00cd8c09, 0x0027eb53}}}, + {X: Field{[10]uint32{0x005209e7, 0x01dc5247, 0x00cb7aee, 0x01737756, 0x01a278eb, 0x028508bf, 0x0378c46a, 0x02aee97f, 0x037e2293, 0x003032d6}}, Y: Field{[10]uint32{0x0210c47b, 0x0035ccd3, 0x027d5133, 0x027bb634, 0x03cc7278, 0x0037d328, 0x036b572d, 0x02161976, 0x002e3664, 0x0020407d}}}, + {X: Field{[10]uint32{0x00ce0b63, 0x03c56436, 0x0215d140, 0x03383ef3, 0x01af2f70, 0x0246f75a, 0x02ab60c3, 0x00fe0d1c, 0x03c516d9, 0x0036ff00}}, Y: Field{[10]uint32{0x02d26564, 0x023054ff, 0x03b46465, 0x00937af1, 0x024811fa, 0x00ddaa93, 0x033ecfec, 0x0328ba68, 0x014d7228, 0x003e0e38}}}, + {X: Field{[10]uint32{0x004f59c8, 0x00fcf4d2, 0x03af37cc, 0x02e58b8e, 0x00435140, 0x00d581ec, 0x031d8910, 0x00ffc455, 0x0285eea1, 0x00378981}}, Y: Field{[10]uint32{0x01cfbbcc, 0x023eb966, 0x00accd7f, 0x0132a97e, 0x02c1f5f5, 0x02d9bc79, 0x0363335b, 0x01619798, 0x02c9a602, 0x001af08f}}}, + {X: Field{[10]uint32{0x02a2e71e, 0x00f162fe, 0x01e5f6f7, 0x027f1e06, 0x031ed812, 0x01b05fae, 0x0362f79f, 0x023f6c06, 0x0160b8cb, 0x001635e3}}, Y: Field{[10]uint32{0x004bccc1, 0x029014ed, 0x0353140a, 0x00f6ec98, 0x03b04d6d, 0x018e444c, 0x0222f5e1, 0x0319c630, 0x00f2fd6b, 0x001f2ef9}}}, + {X: Field{[10]uint32{0x0000a490, 0x03afbf8b, 0x01738211, 0x004bd91b, 0x03fde1af, 0x0000538e, 0x00869aa9, 0x013f96ac, 0x031aeed5, 0x0039cae6}}, Y: Field{[10]uint32{0x00af4fc2, 0x03cc9ce4, 0x01d348cf, 0x01a5df49, 0x00d94659, 0x00b320a8, 0x02af020a, 0x0160ce10, 0x014d8f59, 0x003364b4}}}, + {X: Field{[10]uint32{0x030fd658, 0x03cd2355, 0x0085b3b9, 0x00508885, 0x00b725f6, 0x0277fe2a, 0x03cef97c, 0x016f862d, 0x03aed55a, 0x0001aa1a}}, Y: Field{[10]uint32{0x032c5724, 0x001b59fb, 0x01d4081c, 0x00515c6a, 0x0360a14f, 0x01c27ea1, 0x03121407, 0x00c05440, 0x02914c3b, 0x0004e289}}}, + {X: Field{[10]uint32{0x030a1fc5, 0x0002bbae, 0x0316e0e1, 0x0386d891, 0x03b17c39, 0x0193f0a0, 0x00b00595, 0x03c9135b, 0x00f67240, 0x00072823}}, Y: Field{[10]uint32{0x01ef0a55, 0x011ecff6, 0x0016ab34, 0x010d3a70, 0x03deec27, 0x019ab7c1, 0x0236317c, 0x0027b0d2, 0x03ce655d, 0x0008b893}}}, + {X: Field{[10]uint32{0x024a0b0f, 0x01608060, 0x016070f5, 0x022bf525, 0x02b7cf62, 0x03377ddb, 0x021ee30b, 0x012711cf, 0x0128feba, 0x00365770}}, Y: Field{[10]uint32{0x03c7e8a1, 0x00b135b1, 0x02116161, 0x02eab8bf, 0x03633e98, 0x01a6da38, 0x0061274c, 0x0384df44, 0x02b8fea3, 0x00354d02}}}, + {X: Field{[10]uint32{0x00d83857, 0x001cfe33, 0x03afcf3c, 0x022f6661, 0x03ae7e28, 0x01a6a22e, 0x03a14e47, 0x035405b0, 0x022a7f4f, 0x000b3334}}, Y: Field{[10]uint32{0x033b389e, 0x01593741, 0x01f3b0f2, 0x00513b6d, 0x00c2a7b6, 0x03e393ee, 0x010f849f, 0x027f6d1c, 0x023caea8, 0x002ba099}}}, + {X: Field{[10]uint32{0x01628a43, 0x03afac25, 0x001d1c5e, 0x03207ca0, 0x01ae4a9a, 0x0375ed04, 0x03bc0037, 0x03788e4d, 0x01f6c8e4, 0x003b05ed}}, Y: Field{[10]uint32{0x0258df83, 0x01b9ba59, 0x007348e6, 0x0083c1e6, 0x03743196, 0x01a3f9c3, 0x01fa2989, 0x0056c18c, 0x011dfd58, 0x002cf835}}}, + {X: Field{[10]uint32{0x0096b6f4, 0x0216225b, 0x023ca956, 0x00b22eb3, 0x00cee8e1, 0x033c7326, 0x0213cddc, 0x01fd3869, 0x037e6290, 0x00298eab}}, Y: Field{[10]uint32{0x02e8216e, 0x01500c6b, 0x00deeef7, 0x01f7a003, 0x01f8bc1a, 0x00c95688, 0x0144ab12, 0x0265cfa7, 0x02bcdc5f, 0x000be54f}}}, + {X: Field{[10]uint32{0x03ad32f3, 0x03805a61, 0x00b2c550, 0x02bc6685, 0x0390e345, 0x00a5b44d, 0x005636cb, 0x023435ad, 0x0330318d, 0x0023ad3f}}, Y: Field{[10]uint32{0x00a4a3e3, 0x022bddc3, 0x031718f2, 0x0144209f, 0x020cc01d, 0x017aeddd, 0x0200151c, 0x03f1f9f5, 0x038bae7f, 0x0012e388}}}, + {X: Field{[10]uint32{0x0276b8d2, 0x012b7660, 0x02341437, 0x0232d1c4, 0x002432fa, 0x01298ebb, 0x038a6e57, 0x010e5fd5, 0x00afbb5b, 0x002ac508}}, Y: Field{[10]uint32{0x00b94396, 0x03995fd9, 0x0357490c, 0x0335fdd6, 0x038f264a, 0x029e5562, 0x039df900, 0x03a49d96, 0x028ea197, 0x003ebd8c}}}, + {X: Field{[10]uint32{0x006f680a, 0x002f46a2, 0x03b5e963, 0x01acd23f, 0x015102aa, 0x00756667, 0x0016f1cc, 0x0286ab73, 0x010e6b2b, 0x0036a862}}, Y: Field{[10]uint32{0x012fa209, 0x03db7e8d, 0x0051094b, 0x0170b088, 0x038744f0, 0x03caef48, 0x02f6005c, 0x03ae532d, 0x03695a63, 0x00067eb2}}}, + {X: Field{[10]uint32{0x032a28e3, 0x033d91df, 0x03f2e0b1, 0x010af48b, 0x03cb08a6, 0x03e3aedc, 0x01a1b0ed, 0x0346d226, 0x012e5398, 0x003c667d}}, Y: Field{[10]uint32{0x02c2f454, 0x02d66167, 0x03d9e5c1, 0x02b15526, 0x012d5278, 0x01fbe6dd, 0x00f87476, 0x004c7533, 0x03aba5e2, 0x000d866a}}}, + {X: Field{[10]uint32{0x0046ad6a, 0x014888fc, 0x00046e27, 0x03d6727f, 0x01e75c86, 0x025e928d, 0x0320bc14, 0x03b3cdaf, 0x0293a5f9, 0x00060aa7}}, Y: Field{[10]uint32{0x03b8bcfd, 0x0079223f, 0x007a5c73, 0x0328d2bc, 0x03e0924d, 0x021585f1, 0x0067693d, 0x03b8632a, 0x0288c39d, 0x00318257}}}, + {X: Field{[10]uint32{0x0214abbb, 0x0026552c, 0x0327c3b5, 0x02b82418, 0x025ac21e, 0x0109dfec, 0x020a7016, 0x03f99ad9, 0x03530636, 0x00022932}}, Y: Field{[10]uint32{0x01d0ed1c, 0x035a49a8, 0x00bbf63f, 0x01709540, 0x008efcb8, 0x0349758e, 0x02e707fa, 0x02a5048f, 0x00514cc6, 0x001a4f96}}}, + {X: Field{[10]uint32{0x008c1282, 0x00224597, 0x018d42b2, 0x023204ef, 0x02f49517, 0x00b1565c, 0x01e31058, 0x030cf845, 0x035a3b40, 0x0012404c}}, Y: Field{[10]uint32{0x004214e3, 0x02760072, 0x0016624d, 0x00393778, 0x00f26a9a, 0x0387c3a5, 0x02c70eb9, 0x01d03772, 0x0176429d, 0x0011c01c}}}, + {X: Field{[10]uint32{0x004e01dd, 0x01048ca6, 0x02b8fcdf, 0x01772b60, 0x01df64f5, 0x02e7cb81, 0x01b49e14, 0x00d8ad18, 0x01a77c34, 0x00206039}}, Y: Field{[10]uint32{0x0305040b, 0x01d0ab2b, 0x03e650de, 0x02704c3c, 0x01cb3fb4, 0x0016b247, 0x034b0fd0, 0x03c402a8, 0x0221d4b9, 0x000d33d5}}}, + {X: Field{[10]uint32{0x0251ee9f, 0x0217f84d, 0x032a4b10, 0x01f2df48, 0x01a90e1d, 0x023aa975, 0x00aeee35, 0x03d2a277, 0x027efea9, 0x0023dc48}}, Y: Field{[10]uint32{0x0255ad73, 0x036bd3a5, 0x01aaee90, 0x01aaf011, 0x03e27267, 0x02e4531f, 0x03c344f3, 0x01e68289, 0x01bcbb2b, 0x00293685}}}, + {X: Field{[10]uint32{0x03b58264, 0x023508f3, 0x02a3ccc6, 0x02a96821, 0x02d1ea8e, 0x00f30669, 0x03592a2a, 0x02eb2c20, 0x0374cdc9, 0x0036fae6}}, Y: Field{[10]uint32{0x00576161, 0x000268d0, 0x022d45b1, 0x03e6d967, 0x0018e86d, 0x02785aef, 0x00732eb7, 0x01fed60c, 0x039283f0, 0x002f99a1}}}, + {X: Field{[10]uint32{0x01591933, 0x02985f5c, 0x02958ab0, 0x037e0c5e, 0x017d9ea4, 0x02014a37, 0x03b09b62, 0x00b2b0f1, 0x013fa7f5, 0x003cca3a}}, Y: Field{[10]uint32{0x02405547, 0x0108c47c, 0x00a60fc0, 0x005f5faf, 0x002f780c, 0x036174e5, 0x01c3f3a7, 0x027a4187, 0x0059811f, 0x001073a3}}}, + {X: Field{[10]uint32{0x00fea051, 0x0033c20c, 0x00b7d8fb, 0x020544c7, 0x01d4ca41, 0x00087091, 0x005f44c2, 0x006fb127, 0x0003416b, 0x0015b53d}}, Y: Field{[10]uint32{0x00bd39ce, 0x028eb614, 0x002a8d35, 0x024b8f60, 0x0051ae1a, 0x035773a3, 0x00cb6373, 0x01defa4d, 0x0133948f, 0x003317d8}}}, + {X: Field{[10]uint32{0x039022b8, 0x03d3af00, 0x03c49e9c, 0x03e819f3, 0x01dd90c9, 0x00c9ff50, 0x02becf2a, 0x01dadf33, 0x004b8bb4, 0x002388b8}}, Y: Field{[10]uint32{0x00286b8b, 0x0064ecc2, 0x01d6d3e4, 0x024b0b20, 0x00934e79, 0x0074fbd6, 0x0103c023, 0x01a5b4d3, 0x02603204, 0x00007e3e}}}, + {X: Field{[10]uint32{0x02f064f6, 0x019f5e83, 0x00e1a518, 0x01cafe7f, 0x02b396eb, 0x033fbeb7, 0x03624dc1, 0x01f1a3e4, 0x02e4b9a7, 0x000d06c8}}, Y: Field{[10]uint32{0x02d9441a, 0x023fe2e4, 0x01e27cfc, 0x01c9f4ca, 0x03af11ed, 0x036f2cb6, 0x0162bcf0, 0x01a55d65, 0x03877bc3, 0x002560e7}}}, + {X: Field{[10]uint32{0x03324763, 0x02c8098e, 0x0305045e, 0x02670002, 0x00e6af97, 0x013ee2a3, 0x01e86809, 0x01044a1e, 0x02939f23, 0x000fa90b}}, Y: Field{[10]uint32{0x0201a623, 0x01af544b, 0x02f59186, 0x028ce2c5, 0x0160a5c0, 0x03b3ea3f, 0x024d51ff, 0x029bc13f, 0x01676f5a, 0x00110c90}}}, + {X: Field{[10]uint32{0x035d625b, 0x0249efd4, 0x0317342f, 0x01829c70, 0x0023d8a6, 0x02337a47, 0x00faa1bb, 0x01453be5, 0x004cef10, 0x002bf9ed}}, Y: Field{[10]uint32{0x008b4b65, 0x02b3f21f, 0x0042751c, 0x01dde8e2, 0x026cfcdd, 0x012c18fb, 0x0151f185, 0x021dcaf3, 0x03885121, 0x001d85e9}}}, + {X: Field{[10]uint32{0x02034d2b, 0x00fef9a8, 0x01dda37a, 0x038ffc38, 0x0112f69e, 0x00b00d74, 0x00ac725f, 0x003531b8, 0x0202abb4, 0x0028d832}}, Y: Field{[10]uint32{0x016b646d, 0x020c9a64, 0x03814fab, 0x01e49568, 0x039d8bbe, 0x0298211b, 0x01d0f723, 0x00fa80c1, 0x01783fec, 0x0005879c}}}, + {X: Field{[10]uint32{0x00011b88, 0x012a16de, 0x0361ec91, 0x02304667, 0x035984d1, 0x02cbb37d, 0x025d9899, 0x03f9f66d, 0x025ff7d9, 0x00041213}}, Y: Field{[10]uint32{0x0176cdc9, 0x01135be5, 0x031844f7, 0x00f5e3de, 0x03e7f4e0, 0x00b05127, 0x01e1086c, 0x01cd5e7b, 0x00e21e13, 0x0004b470}}}, + {X: Field{[10]uint32{0x0256b138, 0x030e71b4, 0x01ba67ee, 0x03996c14, 0x02b11245, 0x0369f79a, 0x0276c40e, 0x02777090, 0x00e15dad, 0x001db0b7}}, Y: Field{[10]uint32{0x0064ce82, 0x033bc57f, 0x03605ed4, 0x01f4fac3, 0x0361a896, 0x010dce68, 0x023fca2a, 0x0020e64b, 0x01ce585b, 0x00366980}}}, + {X: Field{[10]uint32{0x01d4d2e1, 0x0266dd44, 0x0335627b, 0x0220e951, 0x03d1d839, 0x00f71831, 0x004fcb18, 0x03b662c1, 0x01d4c3e6, 0x0019c68c}}, Y: Field{[10]uint32{0x02053088, 0x034dc6c3, 0x01b3b08a, 0x017a94b0, 0x01281f18, 0x03d0ea12, 0x033762fb, 0x03bcfdfb, 0x01152005, 0x001bf763}}}, + {X: Field{[10]uint32{0x02898a37, 0x0384ad9b, 0x032431be, 0x016e9bc5, 0x00c2343a, 0x01fdc706, 0x03729985, 0x01a40c4a, 0x0165a2da, 0x0024743d}}, Y: Field{[10]uint32{0x0332f681, 0x02c8275f, 0x0147a41e, 0x0359c924, 0x01e6393a, 0x007df377, 0x02906a10, 0x028a2355, 0x01b91956, 0x00275a95}}}, + {X: Field{[10]uint32{0x028512ba, 0x03ba6ad8, 0x032d4de9, 0x0379c902, 0x006b90d8, 0x03d37dee, 0x014d0cd8, 0x028b0f2f, 0x00581953, 0x001f967c}}, Y: Field{[10]uint32{0x0242a173, 0x02da6ee6, 0x03dbd9d9, 0x03f8ca3e, 0x0035a012, 0x027c0dc5, 0x0019b0af, 0x01f583bd, 0x01eb74cc, 0x000cec34}}}, + {X: Field{[10]uint32{0x03788a26, 0x024abf87, 0x0380dd34, 0x016f8100, 0x03f43a28, 0x02c7ccbf, 0x02652ada, 0x006fb484, 0x025e0b79, 0x003bde2d}}, Y: Field{[10]uint32{0x0108d306, 0x007346d9, 0x03910abb, 0x03be4e55, 0x00f156cd, 0x013feb00, 0x027ab1b2, 0x02bf08fa, 0x013896d5, 0x0027cf89}}}, + {X: Field{[10]uint32{0x016b7cd3, 0x02337e6d, 0x02e1f50a, 0x0133b9d4, 0x01cb0c0e, 0x0304b2c0, 0x03ce2f5f, 0x00cfb905, 0x00d01998, 0x001e2e5e}}, Y: Field{[10]uint32{0x01560dd9, 0x00251e30, 0x00cd0197, 0x0245c518, 0x01dd631f, 0x005647d7, 0x01701413, 0x001aef8c, 0x01d73726, 0x0027e71f}}}, + {X: Field{[10]uint32{0x00bfe64a, 0x00f49b5c, 0x00ceff1b, 0x03e9ee9f, 0x02906ffd, 0x002aeadc, 0x012f5e88, 0x016883a6, 0x0331f994, 0x0017de16}}, Y: Field{[10]uint32{0x03881c1c, 0x034285ca, 0x0046e0a6, 0x004f9742, 0x01575224, 0x0089e447, 0x021988d3, 0x00e1abfe, 0x000eb3cb, 0x0028f312}}}, + {X: Field{[10]uint32{0x0006b3d1, 0x03a7f95e, 0x00887fce, 0x01f58dd7, 0x0102c388, 0x0112135c, 0x03aadfa4, 0x0124bf3c, 0x01997cbb, 0x0027fb9e}}, Y: Field{[10]uint32{0x0224c22e, 0x02752b3f, 0x00437a12, 0x03c31b19, 0x00c0f0b8, 0x0039f512, 0x03ef25a6, 0x031d807e, 0x03277e94, 0x0010c450}}}, + {X: Field{[10]uint32{0x02e3f30b, 0x0362c313, 0x031020ac, 0x004fe694, 0x02c0f462, 0x036f5f1d, 0x03befd7c, 0x022215ed, 0x015db75d, 0x0004bcb7}}, Y: Field{[10]uint32{0x034097d8, 0x02d2a94c, 0x010216dc, 0x01c1d0b7, 0x00f85105, 0x00e1901c, 0x013ecfad, 0x00127a6b, 0x018b0e85, 0x003389d6}}}, + {X: Field{[10]uint32{0x03997bd7, 0x020c9773, 0x004d5317, 0x027c74aa, 0x02fbb86f, 0x0306dc63, 0x00e2befb, 0x02d470fc, 0x02b43ee2, 0x0031a52b}}, Y: Field{[10]uint32{0x01050977, 0x0221ea3b, 0x03226bdc, 0x003ab9c7, 0x036fc519, 0x02169be0, 0x02c3e5cc, 0x024c44b2, 0x033eb6a6, 0x00105207}}}, + {X: Field{[10]uint32{0x01047ae9, 0x035e32a0, 0x03ab149a, 0x00002182, 0x029bd161, 0x02bcefbe, 0x033493f5, 0x030172eb, 0x024614c5, 0x003f899a}}, Y: Field{[10]uint32{0x00471e6b, 0x006e5506, 0x0320b074, 0x021d255f, 0x00f58ca0, 0x01dca971, 0x00614ada, 0x025352df, 0x02bec446, 0x0038b863}}}, + {X: Field{[10]uint32{0x016118dd, 0x0149a64d, 0x03250d21, 0x039fd9e9, 0x01daff04, 0x03060fc8, 0x03abfa58, 0x02c1f121, 0x01dc0926, 0x001e5d78}}, Y: Field{[10]uint32{0x011409e5, 0x03f1c24d, 0x029d821c, 0x02366e5c, 0x01f94346, 0x02a536b9, 0x014b779d, 0x02cc0329, 0x039744e2, 0x00032612}}}, + {X: Field{[10]uint32{0x018a2b06, 0x01f3c5a8, 0x02951a13, 0x023adff5, 0x00702284, 0x0061b5c0, 0x0109e8e6, 0x00d62682, 0x00db5018, 0x0024d5cf}}, Y: Field{[10]uint32{0x00bf47d5, 0x02439886, 0x010f0265, 0x022bf27d, 0x02caae2d, 0x004db2b3, 0x0090039d, 0x03dabb65, 0x00663047, 0x001ea55f}}}, + {X: Field{[10]uint32{0x01d77660, 0x01febe20, 0x00829fa3, 0x003b8a6d, 0x026771d8, 0x0217f13f, 0x00ac7dd4, 0x01bfae38, 0x021ea60f, 0x00302f4b}}, Y: Field{[10]uint32{0x0335bacd, 0x03fc96c0, 0x0306556a, 0x00ff896b, 0x002effc8, 0x027c91fa, 0x0076267d, 0x03871da4, 0x00fd9edd, 0x001a16dd}}}, + {X: Field{[10]uint32{0x0024bf3e, 0x031a6127, 0x032538c4, 0x00af6a90, 0x01b67685, 0x01575646, 0x02e5f45d, 0x00881e41, 0x00e19319, 0x0015aeb0}}, Y: Field{[10]uint32{0x03c18ebf, 0x0081fb0b, 0x01096a5d, 0x03a7e342, 0x010f5c0a, 0x022c4639, 0x02480bbc, 0x02e04b4b, 0x01d39856, 0x0038efd4}}}, + {X: Field{[10]uint32{0x0142c06c, 0x01347964, 0x03c65231, 0x002ae4f7, 0x015225fa, 0x02617f7b, 0x03ec7c4a, 0x03774baf, 0x0313fe7c, 0x0014ed06}}, Y: Field{[10]uint32{0x03b69c4b, 0x00bfa6f0, 0x03a988f6, 0x008123ca, 0x03cb4ecf, 0x0334af7f, 0x02e038dc, 0x03d59574, 0x025744e4, 0x00243f2e}}}, + {X: Field{[10]uint32{0x02e765bb, 0x03f3cab0, 0x025f5d55, 0x00019d33, 0x00b11364, 0x0060b28b, 0x02baa269, 0x03b6e51f, 0x0231ccc0, 0x002f6817}}, Y: Field{[10]uint32{0x02cf75e8, 0x0371ae9e, 0x0307b447, 0x036aba3d, 0x032fff08, 0x00c23aa5, 0x00593567, 0x01a60a9d, 0x01793123, 0x0025c9d6}}}, + {X: Field{[10]uint32{0x030413d8, 0x03b78552, 0x0189b21a, 0x0254715c, 0x0291196e, 0x023d97e0, 0x0209f19a, 0x0020807f, 0x006a8a90, 0x00123747}}, Y: Field{[10]uint32{0x009b98f5, 0x022d8eb0, 0x017af78c, 0x00367143, 0x01c5a615, 0x0039cbe1, 0x017e2878, 0x00f72994, 0x02fb1a94, 0x001e687d}}}, + {X: Field{[10]uint32{0x012f1f2c, 0x0010e00a, 0x0051c13c, 0x01bcd119, 0x002be834, 0x03a68b52, 0x02ff4e2c, 0x010a323b, 0x0269e28c, 0x001d5018}}, Y: Field{[10]uint32{0x033e996a, 0x03371684, 0x0289f9e7, 0x03377796, 0x00202c44, 0x024bbf11, 0x00d13d76, 0x0201f88f, 0x0097211c, 0x0011d0ec}}}, + {X: Field{[10]uint32{0x0192ee5f, 0x02181288, 0x03165401, 0x0009376a, 0x00744200, 0x010c53ff, 0x000ae4d2, 0x0204ce21, 0x0193bf31, 0x0006a957}}, Y: Field{[10]uint32{0x00bc3bfc, 0x038e3c4b, 0x0118f041, 0x02204d84, 0x017a6a8e, 0x02db2cb3, 0x02ac7e99, 0x027a2995, 0x035492d5, 0x002eaeb0}}}, + {X: Field{[10]uint32{0x037dcf03, 0x01c48311, 0x02fbab93, 0x03d26c5d, 0x0234d214, 0x03627dc8, 0x00fa8503, 0x0318a799, 0x0050db7b, 0x001d6f93}}, Y: Field{[10]uint32{0x00b6f819, 0x015320a5, 0x003fb511, 0x00a9069b, 0x03ed2e5e, 0x0321831a, 0x033d9343, 0x01b6c820, 0x03ba8c60, 0x002d5482}}}, + {X: Field{[10]uint32{0x00ef6c8c, 0x00e0950f, 0x01c7d8d6, 0x002871c9, 0x036508e1, 0x01846e56, 0x00b2486b, 0x022cb435, 0x0022e4ed, 0x003cd812}}, Y: Field{[10]uint32{0x022dc0f5, 0x00e51188, 0x00105f98, 0x00b2c8eb, 0x0075d99d, 0x00b2f5a6, 0x021a412f, 0x02f1a896, 0x00797404, 0x003d016b}}}, + {X: Field{[10]uint32{0x037cefe8, 0x01f7fc39, 0x012bf2d8, 0x0247c107, 0x01da54ee, 0x0380c9ac, 0x015f727a, 0x009afbeb, 0x02e66f93, 0x001b2485}}, Y: Field{[10]uint32{0x01d16517, 0x00ddfece, 0x01704557, 0x01c94194, 0x031ec2f3, 0x03d48c37, 0x0146f922, 0x011f237d, 0x01b9bc19, 0x00192808}}}, + {X: Field{[10]uint32{0x0105668a, 0x0351d35a, 0x03b09e74, 0x03896c4a, 0x00988346, 0x01a01d9e, 0x03138617, 0x01ccb77c, 0x03bdce97, 0x002b91e6}}, Y: Field{[10]uint32{0x02612929, 0x01f02b24, 0x028b3f4b, 0x025fa8fc, 0x02b33a6f, 0x01366f74, 0x01363366, 0x01821e26, 0x0355c599, 0x0028f380}}}, + {X: Field{[10]uint32{0x014898be, 0x01c14b5d, 0x034ff480, 0x029eaabd, 0x039ccc05, 0x01b3f4bd, 0x02abcf83, 0x0136c871, 0x017966f7, 0x0033a4b0}}, Y: Field{[10]uint32{0x001bb978, 0x039e7298, 0x0127ce44, 0x0200fc42, 0x038adebf, 0x0238d15a, 0x019cec9c, 0x00e31329, 0x03f3530f, 0x003cf8f4}}}, + {X: Field{[10]uint32{0x026ea68d, 0x033c589b, 0x03b9f477, 0x0388de28, 0x01a96f5a, 0x02623137, 0x0153d875, 0x01d705dd, 0x02b68152, 0x002282ef}}, Y: Field{[10]uint32{0x03e77f4e, 0x005e60d7, 0x036d64e9, 0x02b08a11, 0x00a7c74e, 0x0216938d, 0x02a9f770, 0x01504ab2, 0x015e46f4, 0x002562de}}}, + {X: Field{[10]uint32{0x01d9ccfe, 0x03944da3, 0x028d00c2, 0x029c721b, 0x027f0e97, 0x017b479e, 0x02a033c0, 0x00038a44, 0x02e99754, 0x0030a913}}, Y: Field{[10]uint32{0x0275668f, 0x02a5514d, 0x03c60596, 0x02e3afda, 0x0170cd17, 0x00ed44da, 0x03b69b29, 0x02941f6f, 0x01ef7d24, 0x0025590d}}}, + {X: Field{[10]uint32{0x019ea1e1, 0x022471c6, 0x01c293cc, 0x02472057, 0x013d3bbe, 0x01510ef3, 0x03785208, 0x037d851e, 0x0225534d, 0x002d857d}}, Y: Field{[10]uint32{0x02c3ea25, 0x037079db, 0x01e12267, 0x0071ace6, 0x00fe3afd, 0x03d97189, 0x02908764, 0x0051a18a, 0x00f199e2, 0x00132afd}}}, + {X: Field{[10]uint32{0x00a75a0e, 0x002e4efa, 0x030b55fd, 0x0153e020, 0x03b64a0c, 0x02602fb9, 0x016dde93, 0x009cab3d, 0x038dfdcf, 0x002bf32b}}, Y: Field{[10]uint32{0x0042a63e, 0x00b05044, 0x00e9554f, 0x01801f62, 0x03e7d6a6, 0x00d6186b, 0x036d9ba7, 0x03113e27, 0x005d6f6f, 0x0002363b}}}, + {X: Field{[10]uint32{0x03135f53, 0x00cf22a6, 0x033ac328, 0x00ab2ce1, 0x03559d07, 0x03de0c02, 0x039395d0, 0x006c987c, 0x02a8c531, 0x0014d05d}}, Y: Field{[10]uint32{0x02b2f436, 0x031f9b22, 0x03643b03, 0x0175a0fb, 0x020b1615, 0x03e9d5be, 0x02f66398, 0x029ed21f, 0x004b5eee, 0x002ae13e}}}, + {X: Field{[10]uint32{0x0391f34c, 0x03f34506, 0x0393ea65, 0x02f194c6, 0x028705ab, 0x00883cfc, 0x03651ac6, 0x025737d1, 0x017397ef, 0x0017dea8}}, Y: Field{[10]uint32{0x0081da22, 0x01215866, 0x02ab8b75, 0x02ef8118, 0x0270cffc, 0x01e9df63, 0x011b28f1, 0x02cd3cbb, 0x00983cdd, 0x001cbdf6}}}, + {X: Field{[10]uint32{0x008f3d3b, 0x00a1ff2b, 0x034490aa, 0x0161a40f, 0x02b6a952, 0x00d6bf5e, 0x001db193, 0x03edcacc, 0x024cc1e2, 0x00353ed2}}, Y: Field{[10]uint32{0x014154f9, 0x02062538, 0x00306088, 0x03de6ba4, 0x02f213ad, 0x037b9e1f, 0x01098cd5, 0x02ca1c67, 0x02e84a9d, 0x001dad5c}}}, + {X: Field{[10]uint32{0x037a9ff4, 0x03515327, 0x035694c6, 0x01716aef, 0x00dad097, 0x00f6c374, 0x013116c2, 0x00bcebde, 0x0163843b, 0x000f719d}}, Y: Field{[10]uint32{0x016753ae, 0x01da980d, 0x01fbf780, 0x01dd3ece, 0x004894b2, 0x0126a022, 0x010ccf80, 0x00edfd0f, 0x039e4db8, 0x00377d96}}}, + {X: Field{[10]uint32{0x02f897d6, 0x01720b28, 0x036b13bb, 0x0176cdb8, 0x039c3e41, 0x00334599, 0x006c4495, 0x0005344e, 0x02bd1edd, 0x00195e44}}, Y: Field{[10]uint32{0x02d505cf, 0x00249fbf, 0x02143430, 0x012327d6, 0x0178205e, 0x03341b1a, 0x007fb3aa, 0x0389023f, 0x03db11bb, 0x00138bf7}}}, + {X: Field{[10]uint32{0x03d69f99, 0x0205c5cf, 0x027b8f90, 0x017f12b7, 0x036f412b, 0x03cffa4d, 0x00473e50, 0x016173d9, 0x03b35f82, 0x00016914}}, Y: Field{[10]uint32{0x00097ebe, 0x02d985d6, 0x00c4fa29, 0x02d5fcad, 0x03ec2fb4, 0x012ae868, 0x01dbf06f, 0x02d64138, 0x02113448, 0x003f05a7}}}, + {X: Field{[10]uint32{0x00052679, 0x02cdece9, 0x03689093, 0x02c83d3f, 0x03d01c68, 0x025a8c10, 0x02cfaf1f, 0x012f21a6, 0x005ac24b, 0x0030eb7d}}, Y: Field{[10]uint32{0x00ae19cc, 0x00ab1a04, 0x017d7edc, 0x020f3b72, 0x014f0d4b, 0x01cae342, 0x0285bea9, 0x012d274e, 0x0207cd37, 0x000f648c}}}, + {X: Field{[10]uint32{0x021e1d56, 0x0103fa57, 0x006b6e90, 0x003eb2c1, 0x035bd84f, 0x007c976b, 0x016420be, 0x0372109d, 0x01c8905d, 0x00068cbb}}, Y: Field{[10]uint32{0x00eb4c51, 0x0108591a, 0x0059c0ca, 0x0203e33e, 0x03f1612c, 0x01a98bd3, 0x00b73ad1, 0x01dfe307, 0x019d113a, 0x001fd19f}}}, + {X: Field{[10]uint32{0x034d6c98, 0x00efc829, 0x006b7b4a, 0x010bac69, 0x02f925c1, 0x03944092, 0x028b7da2, 0x025deb0c, 0x019862e5, 0x001c255f}}, Y: Field{[10]uint32{0x02f09381, 0x03f49cef, 0x03ec1441, 0x00c7c8c9, 0x037d7ee2, 0x02074b14, 0x01513488, 0x0330d282, 0x02c62e42, 0x0009a6d5}}}, + {X: Field{[10]uint32{0x037537a7, 0x03b72120, 0x02b44bd7, 0x015b65da, 0x01bf6dd2, 0x02db37c9, 0x03ae4540, 0x02c5b041, 0x00165a02, 0x0001f9a5}}, Y: Field{[10]uint32{0x005185f5, 0x01a09ad1, 0x03b243e6, 0x0075e28d, 0x03a6aac2, 0x00f91cd8, 0x010d2ce0, 0x0030478b, 0x00db3836, 0x003fee1d}}}, + {X: Field{[10]uint32{0x01df9678, 0x0355495b, 0x018b60ee, 0x01d78ded, 0x003b9d8a, 0x03d10176, 0x03e7ac6f, 0x03a6d492, 0x01597b42, 0x0013e068}}, Y: Field{[10]uint32{0x02e0a78c, 0x02e125e1, 0x038b377c, 0x035e6494, 0x003558ee, 0x0349f7d3, 0x00ffbe16, 0x018196b6, 0x02071867, 0x002c94c4}}}, + {X: Field{[10]uint32{0x014fd547, 0x0068d74a, 0x002d9359, 0x03586f74, 0x009be6fd, 0x024e04cd, 0x020be8de, 0x0196bc2d, 0x03685770, 0x003e8940}}, Y: Field{[10]uint32{0x00e81625, 0x01873512, 0x02f06d4d, 0x029deda5, 0x033b0a1f, 0x03d7b842, 0x0242f0dc, 0x01f2fd75, 0x01e396c7, 0x003c2e64}}}, + {X: Field{[10]uint32{0x032ba3d4, 0x03c09689, 0x02c4d440, 0x0312961d, 0x006b61d6, 0x00ffb1b6, 0x03da5172, 0x00aff0f8, 0x02bd6716, 0x003d37d7}}, Y: Field{[10]uint32{0x0052212b, 0x038ca860, 0x00d44674, 0x016e425c, 0x026380dc, 0x0278dd73, 0x010e384c, 0x017ecb56, 0x02798bc7, 0x002c8ee8}}}, + {X: Field{[10]uint32{0x01ac5015, 0x021c1da8, 0x0141c4a5, 0x00681955, 0x0051b897, 0x0111835b, 0x0228e5c4, 0x016d97eb, 0x031db372, 0x002ad6da}}, Y: Field{[10]uint32{0x02ee2ece, 0x03a972c9, 0x02a9e286, 0x02e3422d, 0x00424f72, 0x01e16b7c, 0x01d7876d, 0x005c60ea, 0x0057ecdc, 0x0005b4b1}}}, + {X: Field{[10]uint32{0x00869e55, 0x01df380a, 0x03981ac8, 0x0264f0c3, 0x0002e08d, 0x01c34e29, 0x0280dcc4, 0x014dc101, 0x007e13db, 0x002a293b}}, Y: Field{[10]uint32{0x037f60a4, 0x01205472, 0x007bb2d2, 0x0356eaec, 0x00754025, 0x01961e29, 0x03d08749, 0x03b94e25, 0x019c2cdf, 0x0012a77b}}}, + {X: Field{[10]uint32{0x00245f48, 0x02c5042e, 0x00faa5f1, 0x03678aaf, 0x016f914d, 0x01970404, 0x0183d081, 0x01836c01, 0x00f633bd, 0x000cdfd5}}, Y: Field{[10]uint32{0x0176dbfc, 0x0159dc60, 0x00a94ea4, 0x0395022c, 0x00679b58, 0x00eaeb93, 0x035452bd, 0x03f12902, 0x0328696a, 0x002514fa}}}, + {X: Field{[10]uint32{0x01901b53, 0x0190ad7f, 0x020e433b, 0x00354a74, 0x00f6db48, 0x00694153, 0x004c7674, 0x02abc415, 0x03abdc2b, 0x003bb8cd}}, Y: Field{[10]uint32{0x029c27be, 0x019091e1, 0x01830872, 0x03357db2, 0x00825616, 0x01a55be2, 0x03a1d8ba, 0x00035292, 0x038802cc, 0x00196b56}}}, + {X: Field{[10]uint32{0x012f1548, 0x00ff3bdd, 0x010b8451, 0x01f143c0, 0x00f56e47, 0x010fc49d, 0x01aaf0cb, 0x00002bb0, 0x021857cb, 0x00167d4b}}, Y: Field{[10]uint32{0x021698be, 0x0383d4e7, 0x00e70a1a, 0x018665e3, 0x014f2254, 0x01bb078a, 0x007006ba, 0x00ec6601, 0x036e8db0, 0x003632a3}}}, + {X: Field{[10]uint32{0x006f3e12, 0x0297c150, 0x0115e8f5, 0x0043cad2, 0x038583ab, 0x01f618a1, 0x01618d9d, 0x036caa2a, 0x020c25fa, 0x001b0802}}, Y: Field{[10]uint32{0x038081f8, 0x03b6527b, 0x03a617d6, 0x0276c5e4, 0x00050464, 0x0170343e, 0x01af24da, 0x03cd7051, 0x004e374c, 0x00053526}}}, + {X: Field{[10]uint32{0x02ac07fa, 0x03fef0e2, 0x002a032c, 0x03e2628f, 0x02f8144f, 0x00e6d95e, 0x02ad8782, 0x02dbe1c6, 0x02fd51df, 0x00059528}}, Y: Field{[10]uint32{0x021a839c, 0x02410f45, 0x037148d5, 0x0317e977, 0x00e36d46, 0x031c5c17, 0x00dcc1d4, 0x0215a6db, 0x01c382d9, 0x0022da59}}}, + {X: Field{[10]uint32{0x03556d77, 0x008cbdd9, 0x02fae8de, 0x0301fa63, 0x027b3ed1, 0x014fe5b5, 0x0182f339, 0x00d55b26, 0x03c9ab47, 0x0031200c}}, Y: Field{[10]uint32{0x01968bac, 0x01ead2fb, 0x002b6f89, 0x01520a2c, 0x010abe4a, 0x0373feab, 0x03873828, 0x00c5a041, 0x00a87bc4, 0x002bcfd2}}}, + {X: Field{[10]uint32{0x003c6032, 0x01390a0f, 0x003baf1a, 0x007c084b, 0x001a9577, 0x015fdea6, 0x005aaea5, 0x00a35462, 0x03faa9d2, 0x0017765d}}, Y: Field{[10]uint32{0x032eb656, 0x01ca8de3, 0x02b4549e, 0x03349d2f, 0x02abb06a, 0x036a81bc, 0x00e52043, 0x023db34b, 0x014aba17, 0x000effe7}}}, + {X: Field{[10]uint32{0x0242a564, 0x03f7ca73, 0x032abefe, 0x01a69760, 0x03261e4c, 0x00f26aba, 0x03f1d8af, 0x025b12f3, 0x0025dd9a, 0x000a9db7}}, Y: Field{[10]uint32{0x01244806, 0x02ad31b5, 0x02c5b2fc, 0x02ab7d85, 0x0307ff82, 0x03d70e20, 0x00c972aa, 0x032b9f7a, 0x02f23ad5, 0x00124d14}}}, + {X: Field{[10]uint32{0x029a4b8d, 0x02e3d2f4, 0x02d6ff2d, 0x02a69279, 0x02fd3935, 0x01198aca, 0x02bab4db, 0x01e48e08, 0x01064c0e, 0x00336f4d}}, Y: Field{[10]uint32{0x017a90ce, 0x03828f15, 0x03143a8c, 0x0054550f, 0x0358b845, 0x021bf6d7, 0x008a84c3, 0x009d3e9a, 0x032eb61e, 0x002c849b}}}, + {X: Field{[10]uint32{0x0354d978, 0x03dc974a, 0x02a75bf6, 0x00969051, 0x012bcfd5, 0x01c4ebfe, 0x0182d6ce, 0x0353d8d3, 0x009b2cb9, 0x00260fc9}}, Y: Field{[10]uint32{0x028abca2, 0x03c12122, 0x033ef0cf, 0x01dc8e20, 0x02af302e, 0x0280b6af, 0x004d25f5, 0x0380b69b, 0x0006850b, 0x001e7349}}}, + {X: Field{[10]uint32{0x00afd4f4, 0x0370630e, 0x0138396f, 0x0227eb78, 0x019e1284, 0x03ec8f94, 0x017e21ef, 0x02a7ce89, 0x01b4a5a0, 0x002231d9}}, Y: Field{[10]uint32{0x015f46c2, 0x0226df56, 0x006971cf, 0x038d170a, 0x02e3336a, 0x034511a0, 0x005cc031, 0x02568f94, 0x02647299, 0x003d357f}}}, + {X: Field{[10]uint32{0x03d52c31, 0x01e960ad, 0x036926b6, 0x001d1580, 0x031d147d, 0x02234398, 0x01c7d08b, 0x032c2866, 0x01ecd603, 0x00065d41}}, Y: Field{[10]uint32{0x01057f15, 0x0158793e, 0x0208f49a, 0x037e88d3, 0x002f212a, 0x0169d6bb, 0x035a7461, 0x017f142b, 0x013bf2d7, 0x00251fb0}}}, + {X: Field{[10]uint32{0x032eaaf8, 0x00c82d8e, 0x00fec668, 0x003fad8e, 0x019a1979, 0x035af013, 0x02700c30, 0x01817d62, 0x0232e10f, 0x00260610}}, Y: Field{[10]uint32{0x03f9c85b, 0x01e3873b, 0x03d7f395, 0x024aac62, 0x01dbbdf1, 0x01b0c7d6, 0x02a837e3, 0x03e8e4c3, 0x02edc0e2, 0x003bcc1d}}}, + {X: Field{[10]uint32{0x000bc002, 0x03e388db, 0x02764892, 0x0205a1a6, 0x02f0c7d0, 0x00c899c3, 0x00f47a9e, 0x004d2de4, 0x0335cba0, 0x00143c36}}, Y: Field{[10]uint32{0x00396072, 0x00cff2da, 0x00edd832, 0x0112e181, 0x009e466b, 0x02389976, 0x03260f65, 0x0213ab9d, 0x0013d98a, 0x000706c7}}}, + {X: Field{[10]uint32{0x01665502, 0x00770c75, 0x03a8680c, 0x005b35af, 0x0099ac85, 0x03d08a3d, 0x00bb19f3, 0x02ed42b9, 0x00ea1a44, 0x003678d0}}, Y: Field{[10]uint32{0x034aaad8, 0x03d2cd56, 0x00f75355, 0x02b49412, 0x01341445, 0x020eebba, 0x0005251b, 0x00864ffe, 0x0288335a, 0x0004a285}}}, + {X: Field{[10]uint32{0x007c539c, 0x00f03e3a, 0x034c91e3, 0x02a42a51, 0x01d42cb4, 0x01557706, 0x03067020, 0x01377631, 0x013301b8, 0x00056aa0}}, Y: Field{[10]uint32{0x0142dbc1, 0x031a9b62, 0x03b1de22, 0x011d17d8, 0x032a14bf, 0x01d8b32e, 0x01d2ba17, 0x019003af, 0x03209658, 0x001e54c1}}}, + {X: Field{[10]uint32{0x025d34d2, 0x0060be1e, 0x0024255e, 0x00608d81, 0x03d489dd, 0x01f1ef88, 0x010d169c, 0x026936e4, 0x030453d1, 0x001bdc21}}, Y: Field{[10]uint32{0x01c7dde2, 0x01e2aa66, 0x02101355, 0x03f569b7, 0x01c15246, 0x01f136ee, 0x029beabd, 0x00afd282, 0x01567c1c, 0x003814c6}}}, + {X: Field{[10]uint32{0x03167674, 0x03e370f1, 0x03f1bf33, 0x0163f8b4, 0x03867f9a, 0x01a2153d, 0x02d97e91, 0x028e9226, 0x00dfcddc, 0x000c7a48}}, Y: Field{[10]uint32{0x03706f39, 0x020a4030, 0x038afdbe, 0x017ec4b2, 0x01244a9c, 0x03af89f7, 0x01576600, 0x01b96054, 0x003d0b0c, 0x00149c4b}}}, + {X: Field{[10]uint32{0x008d51d8, 0x007cb693, 0x015ab8d0, 0x030a1a8c, 0x028258de, 0x00622325, 0x0381fbcf, 0x03c0765b, 0x0211708f, 0x0024cc03}}, Y: Field{[10]uint32{0x026c33ff, 0x00f52838, 0x01f464c9, 0x00d8495b, 0x009e0b76, 0x01961393, 0x0049b536, 0x00823021, 0x02473b6a, 0x00054da1}}}, + {X: Field{[10]uint32{0x03acb3db, 0x0153d973, 0x017dcecd, 0x00c9c81e, 0x0230c946, 0x01c4b072, 0x016cfdf3, 0x019c0818, 0x010bf62d, 0x0023deb5}}, Y: Field{[10]uint32{0x0043c637, 0x03e2d121, 0x01d347e4, 0x01c4197e, 0x001eff0d, 0x00686532, 0x0290080a, 0x014af0cc, 0x023207dc, 0x0016b042}}}, + {X: Field{[10]uint32{0x0189f4a9, 0x022921ca, 0x03dd7445, 0x007723be, 0x027f5cf5, 0x01431822, 0x028f5d73, 0x0035c711, 0x03827627, 0x001bb602}}, Y: Field{[10]uint32{0x01826dc0, 0x0248f422, 0x035a2e00, 0x03c8058e, 0x0177fd3c, 0x01a1f1f8, 0x01e47b7c, 0x039ded19, 0x03f738f6, 0x002f2e8a}}}, + {X: Field{[10]uint32{0x00e3714c, 0x00aed2df, 0x01e38eea, 0x02ca1a52, 0x027c2b11, 0x01dfab68, 0x02cb85f7, 0x02278a58, 0x017db949, 0x003b1b07}}, Y: Field{[10]uint32{0x02d08fdd, 0x02c0c3a7, 0x02516df3, 0x01354bf3, 0x018ef266, 0x02f295d5, 0x00089d0e, 0x037f6c75, 0x01af6042, 0x002b767e}}}, + {X: Field{[10]uint32{0x0237f093, 0x00982112, 0x0335c1fe, 0x023a5519, 0x01c59bca, 0x0042166e, 0x03a82d35, 0x03064964, 0x032c24dc, 0x0023ddf2}}, Y: Field{[10]uint32{0x03e07202, 0x0266cf13, 0x02213831, 0x02f561f9, 0x00423fde, 0x0029c32e, 0x0355bd4f, 0x0267e9c2, 0x0186fbf4, 0x001459d2}}}, + {X: Field{[10]uint32{0x024b6aca, 0x01e30741, 0x0049f1fd, 0x035890f4, 0x011122f2, 0x03d28cb7, 0x00c4ed62, 0x00c6bea9, 0x0374dae8, 0x0038ab77}}, Y: Field{[10]uint32{0x028b2297, 0x020463f8, 0x0323ccf5, 0x02808296, 0x00a73a1a, 0x0369984a, 0x02560224, 0x03ec2c22, 0x03941ead, 0x001f6f2c}}}, + {X: Field{[10]uint32{0x02b1e3eb, 0x011768c0, 0x0072d3e8, 0x0144d2ea, 0x033a22b1, 0x0233516c, 0x03b7c6db, 0x00c7266b, 0x01bc614d, 0x002fdebc}}, Y: Field{[10]uint32{0x00125a21, 0x00bb0b14, 0x03239754, 0x0193c49d, 0x012b8504, 0x00c99ef5, 0x029e2552, 0x02288bee, 0x01e78cf8, 0x0004234e}}}, + {X: Field{[10]uint32{0x02fe50e4, 0x03af1663, 0x01987093, 0x01a29d60, 0x0035b4f0, 0x014b60b3, 0x012c5f69, 0x0196016e, 0x007f0cec, 0x000223ff}}, Y: Field{[10]uint32{0x01378a4c, 0x03713693, 0x00cf4a63, 0x03262e7a, 0x00d39193, 0x008e5159, 0x01558c78, 0x00b0fae8, 0x00ca94b4, 0x000e0b6b}}}, + {X: Field{[10]uint32{0x013a152b, 0x00d4f51f, 0x003b7a28, 0x001cd33e, 0x039070e2, 0x00dbaac9, 0x00569ae6, 0x02b982e7, 0x03840ef4, 0x002c4528}}, Y: Field{[10]uint32{0x00a3fa70, 0x02311df3, 0x03001b18, 0x01d9b629, 0x03bb8260, 0x02ef972f, 0x036438c9, 0x03882981, 0x033ce58e, 0x000df1d9}}}, + {X: Field{[10]uint32{0x03e801b0, 0x036cea31, 0x009da627, 0x00ac6453, 0x00cfb0cd, 0x00c4064b, 0x0368fa1e, 0x008edbe9, 0x002fe20d, 0x00390469}}, Y: Field{[10]uint32{0x019b1039, 0x02140225, 0x0080b91c, 0x02ba2bb1, 0x028f6828, 0x00a2bca6, 0x012bbc17, 0x01e601c9, 0x039b43ee, 0x003fac6d}}}, + {X: Field{[10]uint32{0x00ee1999, 0x0053f35d, 0x00fd7cb8, 0x035fc7d2, 0x0031057a, 0x037979f1, 0x005182ae, 0x008c4f02, 0x007e4643, 0x000647da}}, Y: Field{[10]uint32{0x026dbc72, 0x03d2c7a4, 0x001e60e4, 0x0100f542, 0x0043e5c5, 0x00e02336, 0x0239efb8, 0x0338b566, 0x002b3f77, 0x0015192d}}}, + {X: Field{[10]uint32{0x006bcd81, 0x0023ae54, 0x01bf0b22, 0x01321686, 0x03983774, 0x006bbd4d, 0x018c4ff0, 0x02927bd8, 0x017733b0, 0x0018ffd2}}, Y: Field{[10]uint32{0x00593d3b, 0x0126ca4c, 0x020903ae, 0x02321f89, 0x0039535d, 0x02a4fca9, 0x0287b500, 0x0164c7ce, 0x0397ca83, 0x001b32bb}}}, + {X: Field{[10]uint32{0x03fc2c1c, 0x01f96b6d, 0x015564c5, 0x0291a361, 0x00f4ce72, 0x00ba318a, 0x027056c0, 0x0016e9a7, 0x0025c377, 0x003bf8d9}}, Y: Field{[10]uint32{0x01970ad5, 0x02443014, 0x032d08dd, 0x0049485c, 0x028faa7f, 0x00b956ec, 0x01a5f52c, 0x0127160c, 0x035f27ac, 0x000e4ae6}}}, + {X: Field{[10]uint32{0x037e94a5, 0x0001477d, 0x00a99988, 0x00dd3968, 0x02841d47, 0x005c1287, 0x01419102, 0x0302346f, 0x026bdd7c, 0x0001b484}}, Y: Field{[10]uint32{0x00e6e806, 0x01be55a1, 0x015f55da, 0x02c236bd, 0x03efb4d4, 0x02b50849, 0x0372ce6e, 0x02fa5d4b, 0x023acda1, 0x000ba6e0}}}, + {X: Field{[10]uint32{0x00933743, 0x037da941, 0x02f54b20, 0x03261ad3, 0x006d453a, 0x00732a4f, 0x006340dc, 0x02716e47, 0x03f4297d, 0x0033dee7}}, Y: Field{[10]uint32{0x03670c15, 0x02ea8ffa, 0x012ca083, 0x031078d8, 0x00c20613, 0x03dd46d5, 0x01efec2b, 0x0000ac44, 0x008a2c07, 0x002295e0}}}, + {X: Field{[10]uint32{0x01f7e83e, 0x0093f981, 0x023f2c15, 0x02ffdf00, 0x0027f5a5, 0x038b5568, 0x01ba4e80, 0x017b8747, 0x002b4cbe, 0x002c5809}}, Y: Field{[10]uint32{0x000fb5a0, 0x016e318f, 0x01567607, 0x03d19f42, 0x024f1faa, 0x03ece74f, 0x02e9f540, 0x0049801f, 0x03956cf3, 0x0002b0d5}}}, + {X: Field{[10]uint32{0x02bb050e, 0x0336a95a, 0x02733c02, 0x031b7f43, 0x021744d9, 0x0098669c, 0x013dce02, 0x0063661b, 0x012c4f89, 0x001ea191}}, Y: Field{[10]uint32{0x010de179, 0x02daf172, 0x0285a91e, 0x03e90f62, 0x00542370, 0x025b3d15, 0x02a1fb35, 0x02c383ee, 0x031cb558, 0x000c34c2}}}, + {X: Field{[10]uint32{0x002323b9, 0x0014bfd6, 0x01372408, 0x01024e07, 0x00af41ba, 0x025f19dc, 0x0296d3ab, 0x001bbc3a, 0x001a64d2, 0x00289e6f}}, Y: Field{[10]uint32{0x00e42046, 0x0129af1b, 0x0261da1b, 0x034d2d60, 0x02e96199, 0x0380cc60, 0x01a7ab1f, 0x02f1119e, 0x013d701e, 0x002bbf21}}}, + {X: Field{[10]uint32{0x01e5cc76, 0x039bb1aa, 0x0301a0d4, 0x0218987a, 0x00f76918, 0x03167e1a, 0x00c301aa, 0x0005ad82, 0x01705c16, 0x003a38a1}}, Y: Field{[10]uint32{0x030a983d, 0x02cfab27, 0x01eb8f2f, 0x01989da6, 0x02c988ea, 0x02509c9c, 0x0303b7a4, 0x0201442d, 0x0315f8e7, 0x00248d40}}}, + {X: Field{[10]uint32{0x029f2bbd, 0x03833862, 0x03e73459, 0x0216e4e6, 0x0046da15, 0x01cd3e73, 0x015f300a, 0x03f20601, 0x02f814f3, 0x0007f673}}, Y: Field{[10]uint32{0x00abb55e, 0x02230367, 0x025cd264, 0x02a5e528, 0x00c26d79, 0x00117c08, 0x003c71bc, 0x033239bb, 0x033fa50f, 0x0037313d}}}, + {X: Field{[10]uint32{0x027e5f11, 0x006b41a4, 0x0174d39f, 0x02db3d39, 0x03c609d4, 0x03cd93db, 0x0148942d, 0x017f583f, 0x02fc7027, 0x000c86c6}}, Y: Field{[10]uint32{0x00add33d, 0x015118e0, 0x01680c5b, 0x03e3b40a, 0x03725a80, 0x0293207e, 0x01ad36f8, 0x02cc46ba, 0x00ef808b, 0x0004da3b}}}, + {X: Field{[10]uint32{0x02d7bf72, 0x02310bbd, 0x01741810, 0x02731433, 0x03f9ef1e, 0x0037b095, 0x010cad9b, 0x038e4f6b, 0x01fb6518, 0x00137fca}}, Y: Field{[10]uint32{0x00dfb70c, 0x003d308c, 0x00efde4d, 0x022d20c1, 0x02d92f8f, 0x004fb23d, 0x03bfd067, 0x013a0935, 0x006e05aa, 0x0010565e}}}, + {X: Field{[10]uint32{0x00ed1e0b, 0x00dcfdd7, 0x001b9274, 0x01ca56a3, 0x00c839b9, 0x028fcb95, 0x03162e11, 0x00157196, 0x00a5eb63, 0x0024dea1}}, Y: Field{[10]uint32{0x0166afc6, 0x0253cdde, 0x01954532, 0x02c6a73e, 0x0162c122, 0x038f9e8b, 0x03fb3b52, 0x028d4769, 0x00bbbf11, 0x00280c1e}}}, + {X: Field{[10]uint32{0x016cc3d2, 0x03c111fa, 0x03c7a56d, 0x024ecc5d, 0x0156f073, 0x0176dff1, 0x032a87d2, 0x01cee13e, 0x029b7cab, 0x002f8fea}}, Y: Field{[10]uint32{0x02faf77f, 0x02625a02, 0x00ee1029, 0x01a9f8d2, 0x02927644, 0x03a47dfd, 0x01dacc44, 0x0252bd5c, 0x02e01ad7, 0x0039c147}}}, + {X: Field{[10]uint32{0x016c9b41, 0x0037c55d, 0x021f8c68, 0x004ec3ef, 0x0136928d, 0x001635f7, 0x01d24da6, 0x035419d9, 0x006bcc36, 0x00162ce7}}, Y: Field{[10]uint32{0x023d74ff, 0x00b4fc10, 0x0063dad7, 0x0278315e, 0x03b4ecd9, 0x00fdeb9b, 0x0012b777, 0x011b669d, 0x0291aaa8, 0x001127a5}}}, + {X: Field{[10]uint32{0x03765798, 0x00af7270, 0x007b2819, 0x00ac71cb, 0x008c9128, 0x02195d0b, 0x00e21000, 0x002d19c8, 0x0171b166, 0x0026c62a}}, Y: Field{[10]uint32{0x02e0f49f, 0x024b8c4c, 0x03d506c7, 0x00dc1673, 0x022be28d, 0x02819405, 0x0007a934, 0x03e0f4b3, 0x012298ad, 0x000a04b9}}}, + {X: Field{[10]uint32{0x02c0f59e, 0x0286cfb7, 0x002d7f73, 0x031724a5, 0x02c86740, 0x005de209, 0x035e2076, 0x0352f5e8, 0x0003dbac, 0x0029b113}}, Y: Field{[10]uint32{0x0056077f, 0x0124f31c, 0x000e0797, 0x027b1032, 0x022258d2, 0x02abce71, 0x03737278, 0x00d041da, 0x037cd1fa, 0x001ccc5a}}}, + {X: Field{[10]uint32{0x01682ee3, 0x00168e88, 0x03aaa21a, 0x010eefe8, 0x005dde20, 0x012b5e28, 0x037495b9, 0x03e35760, 0x0355628f, 0x0007fec9}}, Y: Field{[10]uint32{0x03b5943b, 0x016bfe36, 0x02fec5f9, 0x02b71a43, 0x03a71243, 0x01c38aa0, 0x019962df, 0x022db3ff, 0x00f7006b, 0x0012811e}}}, + {X: Field{[10]uint32{0x019b8283, 0x03c79e10, 0x0025c3d6, 0x039c23ed, 0x02b67a21, 0x023b97dc, 0x02538a80, 0x00451120, 0x008e3605, 0x002ba931}}, Y: Field{[10]uint32{0x01a80b27, 0x01aeea50, 0x0099b221, 0x00c1ad91, 0x0282c7b5, 0x039c44cc, 0x009d216c, 0x02ce5ef6, 0x02b8c28e, 0x001145f2}}}, + {X: Field{[10]uint32{0x034ed3eb, 0x025e6402, 0x03127f52, 0x0050e0af, 0x030b972f, 0x0000f29b, 0x036fabb5, 0x0009c210, 0x03fa5f8c, 0x00377166}}, Y: Field{[10]uint32{0x03d995c1, 0x0014d17a, 0x02696996, 0x0200ea65, 0x01ad7dbc, 0x0108117a, 0x00370b67, 0x01d6d94f, 0x019fb80e, 0x003db0fc}}}, + {X: Field{[10]uint32{0x014c80a8, 0x00f162c1, 0x0237d0d0, 0x032619a9, 0x0394d204, 0x011d0bdb, 0x03f83ed6, 0x006cb58a, 0x03e7ed30, 0x00088613}}, Y: Field{[10]uint32{0x0179b442, 0x00d85020, 0x00ab4ace, 0x01a8ee03, 0x013bc55d, 0x015a6095, 0x03a389dc, 0x028f5585, 0x01281073, 0x00276c9d}}}, + {X: Field{[10]uint32{0x0201cef3, 0x02a8debc, 0x02eeaf98, 0x00421c4d, 0x036488c5, 0x02ebf0f2, 0x030ed2d6, 0x01bd29d2, 0x03f474e4, 0x00396185}}, Y: Field{[10]uint32{0x02aa2220, 0x013e393c, 0x019d436d, 0x038b93d4, 0x00c6b141, 0x0126906c, 0x03f2047d, 0x038179c6, 0x037552dd, 0x00331a9c}}}, + {X: Field{[10]uint32{0x024f8e41, 0x0280de60, 0x0046c5b2, 0x003c740a, 0x02b7394a, 0x029cecfc, 0x02c2c5ab, 0x0317fb79, 0x00925add, 0x00306a90}}, Y: Field{[10]uint32{0x028c687b, 0x0161b074, 0x0357028b, 0x009815c4, 0x032475bf, 0x0020ead4, 0x016ce735, 0x03d58254, 0x0307e30a, 0x0025c4eb}}}, + {X: Field{[10]uint32{0x01df6168, 0x034a46b0, 0x01b5ac08, 0x0082c2dc, 0x0069e4d3, 0x001931c6, 0x00cd1c23, 0x01916407, 0x008d8957, 0x0012a976}}, Y: Field{[10]uint32{0x0113e6e6, 0x0034cab2, 0x006adf24, 0x020b7396, 0x010c0484, 0x01e01920, 0x0336cc3f, 0x00a23b1a, 0x001b915c, 0x000743a9}}}, + {X: Field{[10]uint32{0x02a8a977, 0x025be4e8, 0x031e7432, 0x01c4e477, 0x02738d41, 0x02a1a680, 0x025e192f, 0x01e0d372, 0x01917313, 0x0024e1db}}, Y: Field{[10]uint32{0x026457a4, 0x01beeb5e, 0x03c3de2d, 0x023e74a9, 0x0173fc6c, 0x015e1a9a, 0x0263d9dd, 0x03514093, 0x023d32ba, 0x001e5211}}}, + {X: Field{[10]uint32{0x011b7b28, 0x012243ea, 0x006ee50e, 0x00295310, 0x035d1808, 0x00bcabcd, 0x033dd13f, 0x020096c8, 0x017d3026, 0x00032033}}, Y: Field{[10]uint32{0x0318bc4b, 0x03f9486d, 0x00292278, 0x03249e1c, 0x019e6260, 0x031eb49d, 0x008f904a, 0x0047e459, 0x018b1f1d, 0x0027dced}}}, + {X: Field{[10]uint32{0x00c8c5cb, 0x010943a8, 0x01bb8fba, 0x0310f39e, 0x00e8e7e7, 0x01ea70c3, 0x004e8579, 0x028d16a3, 0x00d97dd4, 0x0034af49}}, Y: Field{[10]uint32{0x02494b9e, 0x0059ae41, 0x030f7665, 0x0257b868, 0x00055ae8, 0x0027ac0a, 0x03310558, 0x0064c640, 0x00b815cb, 0x000cc3c3}}}, + {X: Field{[10]uint32{0x01d7e9f4, 0x000cc1d7, 0x038b8dc3, 0x02254568, 0x015d7225, 0x00eae605, 0x015457df, 0x03a863ec, 0x03a290de, 0x00353928}}, Y: Field{[10]uint32{0x027d1c21, 0x0308774f, 0x038a56ee, 0x01b2e452, 0x0271c57a, 0x014867a6, 0x02bdc9ba, 0x03b2c5d0, 0x013e77d0, 0x00121512}}}, + {X: Field{[10]uint32{0x03236d19, 0x026f9b51, 0x02bea277, 0x00b85807, 0x03d318f8, 0x0039db8a, 0x011b246f, 0x038e67f3, 0x00f4810d, 0x003c3edb}}, Y: Field{[10]uint32{0x00595daf, 0x03b779eb, 0x00d07ad0, 0x034df3d6, 0x022cc9b4, 0x03aca907, 0x030b1973, 0x0008e622, 0x01606648, 0x0038eb54}}}, + {X: Field{[10]uint32{0x00858939, 0x01cec40d, 0x03ab0ebf, 0x03c66191, 0x039a4f9d, 0x000ac3f1, 0x0191740d, 0x011c30da, 0x018e3f4c, 0x003753b1}}, Y: Field{[10]uint32{0x00a3bfe3, 0x00df6810, 0x0246417e, 0x024253fe, 0x00737a63, 0x0107a4b7, 0x038c8395, 0x01633bc9, 0x0086a3b0, 0x000e9bb3}}}, + {X: Field{[10]uint32{0x03904e51, 0x02baedea, 0x01a8b8fd, 0x00eb771d, 0x012af12f, 0x013dab78, 0x02fe1b6c, 0x03655353, 0x01101d7e, 0x0003b15a}}, Y: Field{[10]uint32{0x0050c54a, 0x02df9435, 0x01d6dbe0, 0x02b6cb30, 0x01be7cba, 0x008bc988, 0x027111ae, 0x013dc50c, 0x027f5d59, 0x000d25f1}}}, + {X: Field{[10]uint32{0x03aa35c5, 0x03668676, 0x03da5a85, 0x02c38a2a, 0x03e25ef6, 0x013b70f2, 0x025e1aa6, 0x015a95f2, 0x02f80518, 0x00329177}}, Y: Field{[10]uint32{0x003521b2, 0x034cf6dc, 0x03df04d1, 0x01a569e8, 0x026eb4ed, 0x0044dcb0, 0x013fcde1, 0x02e7af80, 0x0357268d, 0x0036e2c8}}}, + {X: Field{[10]uint32{0x01b49a47, 0x03702485, 0x022e65f6, 0x00550d73, 0x0040f8ba, 0x03722925, 0x003c8b63, 0x00878920, 0x03889645, 0x002d1314}}, Y: Field{[10]uint32{0x02198d00, 0x018aa0f7, 0x031f5724, 0x02a7076b, 0x01509890, 0x021459ae, 0x0125e04b, 0x012e033c, 0x035df30c, 0x000b8590}}}, + {X: Field{[10]uint32{0x005dea26, 0x033fb2b8, 0x00603666, 0x0386d66d, 0x0333a20c, 0x02d1b65d, 0x01291a54, 0x00bc503a, 0x01e23586, 0x00256dcd}}, Y: Field{[10]uint32{0x024aabb9, 0x01159d49, 0x02553211, 0x02c4a1ba, 0x00f22ab5, 0x01ba0302, 0x03c9977b, 0x02f86426, 0x03055f38, 0x00384a05}}}, + {X: Field{[10]uint32{0x03e5bdfc, 0x024a3b5c, 0x027cee56, 0x02c99b06, 0x00a15c71, 0x03b91c5b, 0x028d2313, 0x00098db3, 0x00678fbb, 0x0020f676}}, Y: Field{[10]uint32{0x03949246, 0x021a1eda, 0x00545991, 0x0308df7e, 0x00c35027, 0x0267d280, 0x03e7d784, 0x03c4cbbf, 0x002fbe92, 0x00381253}}}, + {X: Field{[10]uint32{0x01bbae03, 0x010ddc12, 0x016f02e8, 0x0233cc37, 0x031d3b47, 0x02453891, 0x036bad16, 0x0151b6ef, 0x0085a04c, 0x000262df}}, Y: Field{[10]uint32{0x032ace57, 0x02718f4e, 0x00972e56, 0x03e510d9, 0x01ce4106, 0x0042c299, 0x0027da4a, 0x037f6764, 0x03953733, 0x001da70e}}}, + {X: Field{[10]uint32{0x03b12e45, 0x01018aa8, 0x01dfe086, 0x02c46691, 0x0375019c, 0x03699b54, 0x0358a8f4, 0x00d3b0d0, 0x0277852d, 0x000f39ed}}, Y: Field{[10]uint32{0x027e409a, 0x0158b751, 0x03218e42, 0x03677913, 0x0102cf03, 0x0179062a, 0x0272c4bd, 0x022e1a58, 0x010f0183, 0x001a349e}}}, + {X: Field{[10]uint32{0x02d7836f, 0x011c9fb2, 0x03291e07, 0x0320265e, 0x036b50bd, 0x00550ae0, 0x010dca75, 0x01c40507, 0x00f4d4da, 0x00282f0a}}, Y: Field{[10]uint32{0x03e47c88, 0x02d21665, 0x012242a8, 0x02f329e1, 0x02177eec, 0x027c58f4, 0x005a5819, 0x01e0735a, 0x014940f2, 0x001bb5f8}}}, + {X: Field{[10]uint32{0x02185c0b, 0x03846ac7, 0x00b6818f, 0x03126863, 0x0397750f, 0x00350660, 0x01d290ac, 0x0358ad39, 0x03a352b1, 0x002695c6}}, Y: Field{[10]uint32{0x011b4ad1, 0x0078a56b, 0x00128ff6, 0x01c26f76, 0x030f6c28, 0x00d19245, 0x03c0dfed, 0x03d63e73, 0x00cdb2b1, 0x0006a473}}}, + {X: Field{[10]uint32{0x0221b9bf, 0x03d91f8a, 0x00b93d53, 0x00760d23, 0x004e135c, 0x016a312c, 0x024eca55, 0x0379cc34, 0x004fcdd2, 0x003ee815}}, Y: Field{[10]uint32{0x0374568a, 0x015f8109, 0x023f7aed, 0x0327df6f, 0x02f71a6c, 0x03e0ef9a, 0x02fe631f, 0x01ab3cba, 0x0025a4ec, 0x001e8469}}}, + {X: Field{[10]uint32{0x00920a9b, 0x02af2875, 0x00b485f7, 0x00551585, 0x01ecad11, 0x0070eeb6, 0x002bdd70, 0x03d988e4, 0x013a1edb, 0x00365ac9}}, Y: Field{[10]uint32{0x0318c2e8, 0x0341980e, 0x031f2408, 0x0322c5cb, 0x021499f1, 0x03ccc54d, 0x027d09f2, 0x02e0c4bc, 0x0198f951, 0x000af222}}}, + {X: Field{[10]uint32{0x02267c2b, 0x012e2990, 0x0135613a, 0x00ba51f0, 0x01982338, 0x03e5c8fe, 0x02e14da0, 0x02e09652, 0x03ce1081, 0x000acf05}}, Y: Field{[10]uint32{0x036048ff, 0x037e9a4c, 0x0074fdbb, 0x030b6ef3, 0x02e77205, 0x009e8aad, 0x007f1fa4, 0x00916e23, 0x009f2ebd, 0x00293356}}}, + {X: Field{[10]uint32{0x016439f9, 0x0158da72, 0x021252eb, 0x03253f61, 0x013f6bc5, 0x03891367, 0x0313ea72, 0x0148b1a4, 0x0380fdac, 0x001a5a61}}, Y: Field{[10]uint32{0x01a03154, 0x0007ddc9, 0x0020ec10, 0x0053f880, 0x018d6e43, 0x02ee6653, 0x02b59439, 0x011d7f01, 0x03c6460f, 0x003a3bac}}}, + {X: Field{[10]uint32{0x00848c68, 0x0257be68, 0x03c6d763, 0x03f2b8bf, 0x02d1577e, 0x02ff0bd2, 0x03e172c9, 0x03713258, 0x02114cb4, 0x00078d11}}, Y: Field{[10]uint32{0x004f5b19, 0x00d0db10, 0x01e1da47, 0x00858167, 0x01a2bb46, 0x02ef1b54, 0x016d4643, 0x0268382e, 0x00dfe6f5, 0x0037aeee}}}, + {X: Field{[10]uint32{0x006aa61a, 0x022ba34a, 0x03a1fc55, 0x0213109c, 0x03d5c302, 0x034d78a1, 0x012c191b, 0x00aa6ae8, 0x02024c7f, 0x001b33eb}}, Y: Field{[10]uint32{0x02e7cb11, 0x0120e22d, 0x02de854e, 0x03c7ba0e, 0x0194c4cd, 0x00791623, 0x002ade25, 0x028bf74d, 0x01740c78, 0x00308050}}}, + {X: Field{[10]uint32{0x024c728e, 0x02c5b8b2, 0x0077ec32, 0x00fe525f, 0x02db4315, 0x006884a2, 0x03f0a2e6, 0x0284ccd6, 0x008769b6, 0x0016d7f5}}, Y: Field{[10]uint32{0x00f00c77, 0x039df363, 0x0108850f, 0x03694f10, 0x015a54c9, 0x01a1c46d, 0x01f26321, 0x027513ab, 0x013fb23c, 0x0026550d}}}, + {X: Field{[10]uint32{0x035d069e, 0x01aa6f00, 0x0221565a, 0x0277d504, 0x03e6a41d, 0x00c8ed8f, 0x03bbbd27, 0x01137587, 0x025727af, 0x001add28}}, Y: Field{[10]uint32{0x0032a34c, 0x02674cfd, 0x01756480, 0x01185491, 0x0039b87a, 0x03c01326, 0x03d689c5, 0x0237fed6, 0x0214f17b, 0x00029384}}}, + {X: Field{[10]uint32{0x00e372a2, 0x02fc50ee, 0x004b263c, 0x01b02ab8, 0x03868860, 0x03823cc5, 0x03408b9f, 0x03b4060d, 0x01878ae9, 0x00145c68}}, Y: Field{[10]uint32{0x03172d06, 0x01009d82, 0x037e8681, 0x0057164e, 0x0044da8e, 0x02a3c829, 0x024a4728, 0x014f33f9, 0x026b9641, 0x002d79f7}}}, + {X: Field{[10]uint32{0x03c8e80d, 0x03a5b350, 0x0356c279, 0x024a102d, 0x03dbce8a, 0x014a562a, 0x018568ce, 0x03bcc8d4, 0x006a4337, 0x00037e7a}}, Y: Field{[10]uint32{0x03027da7, 0x0246ed1c, 0x001df5f5, 0x037c1865, 0x0250b2cc, 0x03a4e04c, 0x00e8ff61, 0x01182844, 0x02eec72f, 0x001510ae}}}, + {X: Field{[10]uint32{0x0087c850, 0x0200608e, 0x033072ec, 0x024dedb4, 0x00ac9e46, 0x0240fef4, 0x0076ab73, 0x007dc6be, 0x0279eb6f, 0x003381c0}}, Y: Field{[10]uint32{0x02a155eb, 0x0037b52d, 0x01e84aea, 0x025d4e37, 0x016ea230, 0x0247e2b6, 0x03f2a79e, 0x034d1787, 0x01f988f9, 0x0037a0f7}}}, + {X: Field{[10]uint32{0x002f35fd, 0x01fcd213, 0x00c40766, 0x026c3b4a, 0x0296e578, 0x0274234d, 0x0238936c, 0x03213160, 0x006244af, 0x00280957}}, Y: Field{[10]uint32{0x033c6f7a, 0x0383459d, 0x0269f17e, 0x005f3589, 0x0206cd50, 0x02c83c88, 0x0098293f, 0x02635c32, 0x0007aef8, 0x0024f8b5}}}, + {X: Field{[10]uint32{0x02f0d86b, 0x009b72a1, 0x03ef0d51, 0x010370bd, 0x02138e18, 0x00e0ffd8, 0x00e1197a, 0x01775c50, 0x02adb76d, 0x002ba0b7}}, Y: Field{[10]uint32{0x0320964a, 0x02057295, 0x027c65f5, 0x01606668, 0x0072d36b, 0x038c2d64, 0x036d8ec2, 0x001de6a7, 0x03accaaa, 0x0008e76e}}}, + {X: Field{[10]uint32{0x02332393, 0x00dd7645, 0x0088444c, 0x02b27024, 0x0197c597, 0x02250918, 0x016441ea, 0x0178bb56, 0x01cebee6, 0x0033c266}}, Y: Field{[10]uint32{0x02748ca4, 0x017fecce, 0x01880865, 0x03481a4d, 0x011c664a, 0x016b736f, 0x03f8cd54, 0x03b75407, 0x03d2f074, 0x00198832}}}, + {X: Field{[10]uint32{0x00d3965c, 0x01600ce7, 0x0222a762, 0x00065151, 0x029ec068, 0x02eb2ecd, 0x03ff1b41, 0x02c06d8e, 0x03746404, 0x0017ed2b}}, Y: Field{[10]uint32{0x032abff5, 0x0338e489, 0x03e93d99, 0x02d16553, 0x00916a51, 0x01239d12, 0x009529fa, 0x01a5f350, 0x02e12cce, 0x0011932c}}}, + {X: Field{[10]uint32{0x033216b4, 0x00e83cc6, 0x023a0199, 0x003e0453, 0x002c7a35, 0x00af12b3, 0x01e5687a, 0x008cb815, 0x000a46b5, 0x00056bcf}}, Y: Field{[10]uint32{0x01d45a83, 0x00e95d33, 0x03b37ad8, 0x02795a96, 0x0286c818, 0x028ffdee, 0x035acd93, 0x00e2c11c, 0x039bbdce, 0x002b80dc}}}, + {X: Field{[10]uint32{0x000b4b10, 0x00cf8d95, 0x0046576d, 0x021d9034, 0x0232c887, 0x00b65cf6, 0x00b8b5d3, 0x0333150b, 0x01d1d008, 0x0017400d}}, Y: Field{[10]uint32{0x0254c465, 0x00f9ef9b, 0x02f39617, 0x023356d2, 0x0376db8a, 0x00e9d3c5, 0x009061f7, 0x027ca19a, 0x00e5bffa, 0x001123b6}}}, + {X: Field{[10]uint32{0x03c95527, 0x01eeb520, 0x03915e02, 0x0013f12b, 0x02a40b07, 0x03f1a78e, 0x039d322f, 0x01277fb6, 0x00f39cf7, 0x0025131c}}, Y: Field{[10]uint32{0x006c6f0c, 0x023b2f6e, 0x02fc21a1, 0x03f52388, 0x02df10ac, 0x012699a6, 0x026e95ce, 0x024cc992, 0x003bbf48, 0x002c2b03}}}, + {X: Field{[10]uint32{0x011e4402, 0x02f17585, 0x00acc846, 0x0095b34a, 0x0052e262, 0x02b58bc1, 0x0246754d, 0x00f128fc, 0x01f082ec, 0x003e9486}}, Y: Field{[10]uint32{0x027afae9, 0x0138fcc2, 0x0065a01b, 0x00af7340, 0x01eb730d, 0x000a240c, 0x0364f26a, 0x00c4cb5e, 0x01e9d640, 0x000cb3a0}}}, + {X: Field{[10]uint32{0x00a30ede, 0x010e4a0e, 0x03032704, 0x01ad766f, 0x0085c6a1, 0x0162e146, 0x009455a8, 0x03898c14, 0x0230ddbe, 0x00327d2a}}, Y: Field{[10]uint32{0x00ad7b7c, 0x02dd8c8d, 0x01baea15, 0x00d30be9, 0x03add203, 0x01adcee9, 0x00927994, 0x02bcc66a, 0x03c6b438, 0x0017bdc5}}}, + {X: Field{[10]uint32{0x03770319, 0x0305e39e, 0x02120162, 0x018b7bba, 0x020529b3, 0x01cb53ff, 0x00dd2fdc, 0x0355a56c, 0x03ca7454, 0x000bd33c}}, Y: Field{[10]uint32{0x02f7d487, 0x0033ade8, 0x02042d5a, 0x0317fc51, 0x02fe7c87, 0x02dd9c24, 0x03c1ce0f, 0x03af2fd1, 0x020e3566, 0x003736a4}}}, + {X: Field{[10]uint32{0x01969945, 0x02a5ae1e, 0x02af40a0, 0x01080891, 0x02a1cb0a, 0x007e46cf, 0x03a41a75, 0x035d2bc1, 0x01762e0c, 0x000905fd}}, Y: Field{[10]uint32{0x027807d9, 0x02e9ffc7, 0x02ceefcf, 0x01b65aea, 0x01741ef9, 0x0072d13b, 0x02d0a3f6, 0x01c6f2b6, 0x0355f8dc, 0x001aa5b5}}}, + {X: Field{[10]uint32{0x0088852c, 0x02d86e16, 0x008c66cf, 0x002bba45, 0x00d43d06, 0x02ecf6e9, 0x01ca5bac, 0x00707d9d, 0x0384305a, 0x0026ac8b}}, Y: Field{[10]uint32{0x0028a03e, 0x02d45ea9, 0x01c18e23, 0x01acb32a, 0x03b51d99, 0x02b3768e, 0x02ac12a7, 0x0238e9eb, 0x02faa258, 0x002bc141}}}, + {X: Field{[10]uint32{0x00a72b6c, 0x00074749, 0x02f52875, 0x00996858, 0x0077a917, 0x038551c9, 0x00ed8787, 0x01e4980a, 0x02a22462, 0x003dd087}}, Y: Field{[10]uint32{0x0343fcf6, 0x00224015, 0x004dd8f5, 0x03322160, 0x01fe1c72, 0x03351845, 0x032ca6d8, 0x0104cbcd, 0x0265e448, 0x0036c2b9}}}, + {X: Field{[10]uint32{0x035c6f75, 0x00ef5ff7, 0x01e35496, 0x02edf65c, 0x0110a912, 0x02e61d6c, 0x00bb7918, 0x015fa370, 0x02f3548d, 0x000d5d5a}}, Y: Field{[10]uint32{0x0077a1d2, 0x01c26378, 0x0260fc51, 0x023882c5, 0x0186d94b, 0x03538658, 0x02d69aeb, 0x02d3f753, 0x01ba78a2, 0x0007291b}}}, + {X: Field{[10]uint32{0x03f01837, 0x031136c6, 0x01bc0241, 0x030bf80c, 0x03de4041, 0x0036b9ff, 0x0049d9ab, 0x03ebc859, 0x000c494c, 0x0029fa7c}}, Y: Field{[10]uint32{0x021a0280, 0x02013005, 0x008b7d10, 0x03793bd4, 0x005a7760, 0x02d7eedd, 0x013d0093, 0x0101aa5d, 0x01ae480b, 0x003cabae}}}, + {X: Field{[10]uint32{0x0262adb7, 0x03d79bf2, 0x03c1ac88, 0x028a4213, 0x0064838a, 0x0195739c, 0x037755b7, 0x00a1e5dc, 0x01ba9287, 0x001a5147}}, Y: Field{[10]uint32{0x002b1cd9, 0x00fc69ec, 0x0143c0c7, 0x01ed468c, 0x00107153, 0x01b1ee54, 0x01845d49, 0x03c244c7, 0x03a8d40d, 0x00098863}}}, + {X: Field{[10]uint32{0x02abf06d, 0x01b338f6, 0x00ad35eb, 0x003c3148, 0x0089a92d, 0x0220817f, 0x0186a375, 0x0299bf3a, 0x033015cc, 0x0031270e}}, Y: Field{[10]uint32{0x000e354c, 0x01b59f16, 0x01b5e621, 0x02714f8c, 0x03624291, 0x034ab425, 0x00f9ca99, 0x000ac383, 0x004a665b, 0x001ebf7a}}}, + {X: Field{[10]uint32{0x039dae8f, 0x01ad891a, 0x003871ab, 0x0110215c, 0x0090c0c7, 0x0047053e, 0x036ee1df, 0x01b8e316, 0x01bfb68e, 0x003a7860}}, Y: Field{[10]uint32{0x01ef5e1b, 0x0309a8b5, 0x00018fc6, 0x0297868d, 0x00d1af5c, 0x00d946a9, 0x007e260c, 0x010c5c24, 0x02db3f39, 0x002c2f3f}}}, + {X: Field{[10]uint32{0x02392324, 0x00b8c0b7, 0x028bc406, 0x00e2ae67, 0x012e7d87, 0x0035b87e, 0x01c9e52e, 0x01073d6d, 0x006f0adf, 0x00290a16}}, Y: Field{[10]uint32{0x01b8d142, 0x019fc225, 0x031c83f9, 0x00fd37a0, 0x01a2a741, 0x012737ba, 0x03911e8b, 0x0324dd96, 0x018bfe71, 0x001df0f8}}}, + {X: Field{[10]uint32{0x032712cf, 0x03743641, 0x0194d785, 0x039d7bfb, 0x0038077b, 0x0195a99d, 0x00a4830b, 0x0068952d, 0x02d2de1d, 0x003d724b}}, Y: Field{[10]uint32{0x033958fb, 0x019c2e7a, 0x03f1ed7c, 0x01f80699, 0x01228fdf, 0x01471446, 0x01f6dcbc, 0x0127356d, 0x013a4978, 0x001fba63}}}, + {X: Field{[10]uint32{0x009c3f66, 0x023c062d, 0x034bdf26, 0x031ffc95, 0x01e18c19, 0x019ed55c, 0x01b69307, 0x03d418c4, 0x03ca6c85, 0x002a15c1}}, Y: Field{[10]uint32{0x028aa050, 0x006367d7, 0x0273d775, 0x00d5356e, 0x00536543, 0x00dee3ee, 0x0367d103, 0x038626ab, 0x0271cde2, 0x0005e17f}}}, + {X: Field{[10]uint32{0x00a7468d, 0x0250bfb0, 0x0197c0f9, 0x01819e9f, 0x00d084ab, 0x027b2971, 0x01e0cf81, 0x03470bcb, 0x035fa4c8, 0x0002219b}}, Y: Field{[10]uint32{0x0188336e, 0x024c120d, 0x0009afe6, 0x022e9fb0, 0x02291528, 0x01d8af9b, 0x02c49adc, 0x0241e8bd, 0x026c3f33, 0x000c0508}}}, + {X: Field{[10]uint32{0x020688cc, 0x02f8532b, 0x03d66f40, 0x02d59186, 0x0392af22, 0x036901b3, 0x03d07c8b, 0x00b5a385, 0x017337eb, 0x001097db}}, Y: Field{[10]uint32{0x004d4980, 0x035a63f4, 0x03dbdef8, 0x016561c6, 0x00096436, 0x0202f67f, 0x0373290e, 0x038e446a, 0x026f7c42, 0x003a1954}}}, + {X: Field{[10]uint32{0x00323139, 0x03208f5a, 0x019a2f8a, 0x02bcef27, 0x0236bfe6, 0x00f7ad2f, 0x00184414, 0x02cff555, 0x003e1de3, 0x0003dc3f}}, Y: Field{[10]uint32{0x0224ce03, 0x01012d76, 0x0144adae, 0x002d02aa, 0x008ae575, 0x01ac635e, 0x0374a82d, 0x02cc278d, 0x014b1feb, 0x0022d1e6}}}, + {X: Field{[10]uint32{0x0283116c, 0x002cd8ca, 0x0106758a, 0x03650e7a, 0x00d59c66, 0x02be8487, 0x003b10ce, 0x00a8581c, 0x00f3038d, 0x0006fa58}}, Y: Field{[10]uint32{0x01e29aef, 0x0070378f, 0x0201062f, 0x036c67ba, 0x030647e0, 0x02c0403e, 0x01549cc3, 0x03b810d4, 0x022f8218, 0x001fe932}}}, + {X: Field{[10]uint32{0x020cf385, 0x01cb54cc, 0x02a7e484, 0x022520c7, 0x02e915eb, 0x01a52a03, 0x0351e9f5, 0x02028e2b, 0x02d3bc5c, 0x00007ca8}}, Y: Field{[10]uint32{0x013940e5, 0x0194ef9b, 0x00e9ff55, 0x001d9e0b, 0x0147053f, 0x0399c07e, 0x03cb9455, 0x013127e6, 0x0239174b, 0x0028633a}}}, + {X: Field{[10]uint32{0x00d04766, 0x01dfcf91, 0x0140e884, 0x00dff9dc, 0x019aa67c, 0x01f2beaa, 0x03908611, 0x01ac2edd, 0x03607084, 0x0001875a}}, Y: Field{[10]uint32{0x00f2688f, 0x0230472a, 0x024d2533, 0x03ab2bdc, 0x02b7c4b1, 0x0325b799, 0x02eb59a6, 0x026b858c, 0x02908684, 0x0031fd2f}}}, + {X: Field{[10]uint32{0x02e6cc9c, 0x033c3507, 0x03c4fe6c, 0x00e249db, 0x026d5405, 0x012f9fc9, 0x0108daf0, 0x019145e5, 0x00932d9a, 0x0000acdc}}, Y: Field{[10]uint32{0x015beca7, 0x0002438a, 0x01d9f5ca, 0x0111860e, 0x0391cdfc, 0x005b382d, 0x016a1d86, 0x0262c7b8, 0x03f42c89, 0x003000a8}}}, + {X: Field{[10]uint32{0x02708858, 0x03598a7c, 0x0263a87c, 0x0255a89d, 0x0364af0e, 0x03fa6c07, 0x03fd1360, 0x02de8d35, 0x03efaba8, 0x00123d70}}, Y: Field{[10]uint32{0x0232b5ab, 0x03c0fa3f, 0x015e2b88, 0x02fed4a2, 0x0290aefd, 0x00be5cef, 0x02f09cc5, 0x019c91f0, 0x00b7fce4, 0x002330e3}}}, + {X: Field{[10]uint32{0x0262cfa0, 0x007766cf, 0x00b86e98, 0x03a42798, 0x00adfbe9, 0x01edb54d, 0x01cfc876, 0x03089dbd, 0x01972e5e, 0x0039826d}}, Y: Field{[10]uint32{0x02b43081, 0x00cf997c, 0x0189f0a4, 0x005826b8, 0x02335ca6, 0x02fc6c9e, 0x0385e3db, 0x017f4f8e, 0x01eeff20, 0x001afa70}}}, + {X: Field{[10]uint32{0x016d205a, 0x019a806c, 0x02b0b2ab, 0x01ecb69a, 0x02f19a76, 0x03bc3073, 0x02b8ea81, 0x0273211b, 0x031a5b2c, 0x003af902}}, Y: Field{[10]uint32{0x03c67058, 0x01be4525, 0x032f445d, 0x008035c2, 0x02967d69, 0x02593d76, 0x01899bd1, 0x032f440e, 0x00e8e4fe, 0x000bddc4}}}, + {X: Field{[10]uint32{0x018e3abd, 0x037d964d, 0x01b3ff70, 0x01160f60, 0x03dbc72d, 0x02c18af3, 0x03d32f39, 0x02c7bd94, 0x00399391, 0x0025f353}}, Y: Field{[10]uint32{0x03f37968, 0x036629fe, 0x03fe813d, 0x00ae88ce, 0x02263acf, 0x03a7d72b, 0x03c35c56, 0x02db7be6, 0x0184a175, 0x00281698}}}, + {X: Field{[10]uint32{0x02a7e6d9, 0x0128f06f, 0x0100ebf6, 0x02a80de0, 0x03257343, 0x019566b9, 0x00d99fce, 0x0343a14f, 0x00aa1d3f, 0x00209a4a}}, Y: Field{[10]uint32{0x021efc79, 0x02c1ec8b, 0x0399b020, 0x022a26ec, 0x02faad7f, 0x03dbe112, 0x010fddfc, 0x03a42bfd, 0x01b1a3bd, 0x002f128b}}}, + {X: Field{[10]uint32{0x03a19121, 0x03b4e697, 0x02398967, 0x00c59dcb, 0x0283bd14, 0x0042eb9e, 0x02e91814, 0x0257745d, 0x0097f3ac, 0x000f9d50}}, Y: Field{[10]uint32{0x0118df32, 0x03f99d69, 0x01801135, 0x0251fcfc, 0x0000ca7f, 0x033e50db, 0x0107ea15, 0x033fe282, 0x0299c6a2, 0x001d1b33}}}, + {X: Field{[10]uint32{0x029365db, 0x014c998c, 0x028fa446, 0x0118eee0, 0x0282991f, 0x02809c19, 0x00a236c8, 0x02651e02, 0x0064b49b, 0x003394e5}}, Y: Field{[10]uint32{0x022e5dd9, 0x0353009d, 0x00d41a74, 0x027046cb, 0x03a7bda7, 0x0270b0e2, 0x01f2fda2, 0x011d8c18, 0x02c2b8bc, 0x000d5e3f}}}, + {X: Field{[10]uint32{0x03e349dd, 0x0030ebd4, 0x036692c9, 0x01a4854c, 0x0344a2b6, 0x01929df2, 0x0041d6ae, 0x0056b5eb, 0x01d9cda6, 0x00324cf6}}, Y: Field{[10]uint32{0x0172c610, 0x002c36c1, 0x00c11f9f, 0x012a8713, 0x02a25b05, 0x0262eaf3, 0x02a8ede2, 0x03aeee3c, 0x024f83ba, 0x00129b68}}}, + {X: Field{[10]uint32{0x000b2ac4, 0x0068ef20, 0x03d51d08, 0x03bca009, 0x03a78e2d, 0x0237777b, 0x0116f2e7, 0x02057fa4, 0x003b1aa9, 0x001166a9}}, Y: Field{[10]uint32{0x03e993d5, 0x017f1f18, 0x016454bd, 0x01583f0a, 0x025c6151, 0x0377347c, 0x02900d4c, 0x0178c2c5, 0x03c3de99, 0x0006b3b6}}}, + {X: Field{[10]uint32{0x023b0a5e, 0x01fe44c7, 0x004d43b2, 0x00d268c3, 0x00ff4453, 0x018e6aff, 0x00675640, 0x02b4a7ad, 0x01d99862, 0x0017caa9}}, Y: Field{[10]uint32{0x01ace144, 0x01507258, 0x02cfbce7, 0x02df7538, 0x025acfbb, 0x0116ce6c, 0x01ef9ba4, 0x002fcb67, 0x022be61d, 0x0015c7b2}}}, + {X: Field{[10]uint32{0x00f4fd1d, 0x02079822, 0x000f5756, 0x01fe51ed, 0x01fc2c3d, 0x028ce152, 0x0393e681, 0x01756630, 0x021de6cc, 0x003b19ba}}, Y: Field{[10]uint32{0x01280f52, 0x01f6faaa, 0x025978ab, 0x027e8dc1, 0x02554073, 0x0029525e, 0x014dfa9d, 0x0210d562, 0x03db3b37, 0x0035c47f}}}, + {X: Field{[10]uint32{0x016105fe, 0x0205a0ab, 0x007ab1a4, 0x00e31e15, 0x0169ad06, 0x03472ace, 0x003f018b, 0x01fcb666, 0x01f5aa09, 0x001ab14f}}, Y: Field{[10]uint32{0x0218a598, 0x03238159, 0x00578abf, 0x025aee82, 0x013cd517, 0x010c1e5a, 0x008f2242, 0x02e46652, 0x02815127, 0x00257da6}}}, + {X: Field{[10]uint32{0x0396c0b0, 0x00bc4a67, 0x014fd384, 0x02142cd1, 0x0016fb5c, 0x03700b3d, 0x026dcb8f, 0x0343f711, 0x01e29e4a, 0x002a28fa}}, Y: Field{[10]uint32{0x0316dc2b, 0x00e29559, 0x03685ce1, 0x00242f78, 0x03169b8d, 0x00e535f0, 0x016d152f, 0x037a943b, 0x033e3006, 0x0037e1ba}}}, + {X: Field{[10]uint32{0x02db251c, 0x01030f79, 0x0116632c, 0x01f0c618, 0x001dbe98, 0x03b69b7e, 0x02c84a2f, 0x01d06e57, 0x00d2a0d8, 0x001429d9}}, Y: Field{[10]uint32{0x03e41055, 0x03ed089f, 0x00a4085c, 0x03890c29, 0x0176a8c7, 0x03a6d44b, 0x027632ac, 0x005f052d, 0x03f02339, 0x002ca080}}}, + {X: Field{[10]uint32{0x02b51ef9, 0x01d1b286, 0x013a9423, 0x021160a2, 0x011bd9c5, 0x01b8e73e, 0x0056c9fa, 0x037c749a, 0x00b15ef9, 0x0030b0c5}}, Y: Field{[10]uint32{0x012ab759, 0x0086693a, 0x01d4493e, 0x00c79c5d, 0x03a22f1e, 0x0167c22d, 0x009a9f5d, 0x037eaae5, 0x0286ff7f, 0x00289fe4}}}, + {X: Field{[10]uint32{0x02a9d3df, 0x01aee49d, 0x01b75dbf, 0x01d4dc3f, 0x0364868b, 0x00882930, 0x03ce375e, 0x032344ac, 0x0185da44, 0x002e9955}}, Y: Field{[10]uint32{0x024fda50, 0x0198eef2, 0x0073be51, 0x0139bf22, 0x00bdd9d0, 0x00cb3127, 0x0318f614, 0x00e16f7b, 0x016ba03a, 0x000f5938}}}, + {X: Field{[10]uint32{0x006e600e, 0x0173fbe9, 0x001c2aca, 0x004ee785, 0x0256bd0d, 0x00694403, 0x0276a650, 0x000292d6, 0x0249d4d1, 0x000f517e}}, Y: Field{[10]uint32{0x00059176, 0x02f70ad6, 0x001eced5, 0x0039cc60, 0x00da3039, 0x031d6e92, 0x01a93b13, 0x03b90b87, 0x013c38ee, 0x000024a5}}}, + {X: Field{[10]uint32{0x008c3a8c, 0x011ac12f, 0x005964ca, 0x01fd144e, 0x0083e5ab, 0x03ecb043, 0x025d96e1, 0x030f8903, 0x0346e40d, 0x00391930}}, Y: Field{[10]uint32{0x0204cf4e, 0x03243594, 0x0390fc7a, 0x0293d5f3, 0x030ca364, 0x01d3359e, 0x02205aa3, 0x0142f4a0, 0x03461829, 0x0018fc52}}}, + {X: Field{[10]uint32{0x02a42688, 0x010b756b, 0x001e3fdf, 0x03931ce1, 0x00d56f3f, 0x034f71c8, 0x030d218b, 0x02cc1c16, 0x012fe235, 0x000529f8}}, Y: Field{[10]uint32{0x01e9ff2a, 0x02fce8c5, 0x038099ee, 0x01266b84, 0x00eac312, 0x004de93c, 0x02a22d48, 0x03d20bb5, 0x03cc40ce, 0x0035e5a0}}}, + {X: Field{[10]uint32{0x023828be, 0x03ec1e25, 0x01936a99, 0x00ae1757, 0x0061d2ee, 0x02cbfdbd, 0x0334ffab, 0x01cec896, 0x03b821af, 0x00239ebe}}, Y: Field{[10]uint32{0x026b1853, 0x02739f6b, 0x01ec16cc, 0x01c37b98, 0x02bb5284, 0x00838418, 0x015bea0e, 0x01da33c1, 0x03765aa0, 0x00010391}}}, + {X: Field{[10]uint32{0x03297573, 0x0181a414, 0x002465b1, 0x015629fb, 0x017d8440, 0x03973a0a, 0x00f9f1f9, 0x02f43d2f, 0x01623227, 0x00275904}}, Y: Field{[10]uint32{0x0307fc8d, 0x030d70e6, 0x01b2c126, 0x03576974, 0x021f8630, 0x003fb027, 0x0067ea47, 0x006f95c0, 0x03a06800, 0x003b4360}}}, + {X: Field{[10]uint32{0x03c83eaf, 0x0201625f, 0x00f0b7bd, 0x03c512bc, 0x0352bb40, 0x00f69d39, 0x025b52be, 0x02767d04, 0x02d6d9e4, 0x0019d631}}, Y: Field{[10]uint32{0x004fd292, 0x032d0d06, 0x026e36a1, 0x033351a0, 0x005f7d22, 0x0255df6f, 0x0229b3de, 0x00b0d8e8, 0x008ec2aa, 0x001d26b8}}}, + {X: Field{[10]uint32{0x0061d73a, 0x0045452f, 0x03fb80da, 0x0066d28c, 0x01326327, 0x0293047d, 0x0193df63, 0x00b62c53, 0x01a04570, 0x0002cf84}}, Y: Field{[10]uint32{0x01d562eb, 0x01bef66a, 0x02d189a8, 0x02d8d2c8, 0x009660c6, 0x032e5c11, 0x02238928, 0x01fb0806, 0x02b12b26, 0x0031b854}}}, + {X: Field{[10]uint32{0x026fa5f1, 0x03b56835, 0x00b98994, 0x00f08842, 0x02137bf4, 0x002e789d, 0x0371b0fe, 0x02644404, 0x01ea3b30, 0x001428c9}}, Y: Field{[10]uint32{0x0345b70e, 0x02b8500d, 0x00739dfe, 0x027009d4, 0x028a9939, 0x02ce7bfa, 0x03585279, 0x002a9629, 0x011fd39e, 0x00251b6b}}}, + {X: Field{[10]uint32{0x015e9661, 0x0138c8ba, 0x03e39121, 0x029a91bb, 0x02a97341, 0x02b1423b, 0x02802ce8, 0x03568b3d, 0x02493bef, 0x003df23c}}, Y: Field{[10]uint32{0x0234cb67, 0x00f62347, 0x03f5d4e3, 0x039fe8fc, 0x02573883, 0x02639365, 0x00b7ec05, 0x03cdc051, 0x00c4eec1, 0x000f01cb}}}, + {X: Field{[10]uint32{0x038f85b6, 0x01977200, 0x00cc3c89, 0x02ee1b0a, 0x0038c7e7, 0x03127a9a, 0x030b94e9, 0x00ce1bc2, 0x0350c154, 0x000c0b4e}}, Y: Field{[10]uint32{0x00310744, 0x00b496a2, 0x03720567, 0x00a3539f, 0x013588d1, 0x01b1e324, 0x0366e5a9, 0x02a8bd82, 0x03d0d891, 0x00262011}}}, + {X: Field{[10]uint32{0x019f0eb7, 0x014edf48, 0x0386afbf, 0x03f2c363, 0x021d3810, 0x017b7a26, 0x00e8ecb5, 0x016e9834, 0x03282e7e, 0x0032e3b9}}, Y: Field{[10]uint32{0x038094cd, 0x038058ea, 0x0118e75f, 0x018381a8, 0x02bc10bd, 0x03c12470, 0x009a4e3c, 0x00426423, 0x022befad, 0x0012c13a}}}, + {X: Field{[10]uint32{0x03d5fd42, 0x015cb533, 0x0131b211, 0x00d7e42f, 0x0174f920, 0x031ce927, 0x00f6f04a, 0x0362a883, 0x022b4a0c, 0x0019172a}}, Y: Field{[10]uint32{0x037ef5b9, 0x0320d1be, 0x010a6b6f, 0x008dfd47, 0x03b0aa13, 0x03f945b6, 0x022b64ea, 0x035f0779, 0x019635f9, 0x001e4fca}}}, + {X: Field{[10]uint32{0x015f5a21, 0x031289ce, 0x034f3e69, 0x01ccf617, 0x00f00b1c, 0x0185f593, 0x034b8df6, 0x02d79d50, 0x002f6148, 0x00134dcd}}, Y: Field{[10]uint32{0x03a708bd, 0x01df6294, 0x01cded15, 0x0374e341, 0x034eebd7, 0x006dad99, 0x00a7db2b, 0x031c1519, 0x012bd4c5, 0x00190002}}}, + {X: Field{[10]uint32{0x00c0e0d8, 0x024c5c06, 0x02d3dbd6, 0x00d0db9d, 0x01747a21, 0x034a2f4e, 0x02c6285e, 0x001ecad2, 0x0317024e, 0x00398d2f}}, Y: Field{[10]uint32{0x03e9f021, 0x036e1cc4, 0x00a53020, 0x03efa25f, 0x025e9660, 0x02c44e1d, 0x01d9d8b6, 0x02947b0c, 0x02de4b82, 0x003332f2}}}, + {X: Field{[10]uint32{0x020cef38, 0x0044014d, 0x0192ba51, 0x0018eefe, 0x0264c490, 0x00c74966, 0x03ff5354, 0x03144f56, 0x01e62767, 0x00202803}}, Y: Field{[10]uint32{0x028ef572, 0x033737d8, 0x036b203f, 0x03de54c2, 0x03b2620d, 0x03f71f80, 0x027e23e8, 0x00cd9b11, 0x0189e8d7, 0x001f73ad}}}, + {X: Field{[10]uint32{0x028f8a0f, 0x00b8b767, 0x0225d05b, 0x0197dc65, 0x02baf5b7, 0x0047571d, 0x01b8409f, 0x0143b669, 0x00e6d23d, 0x00181b54}}, Y: Field{[10]uint32{0x03b32788, 0x010d9acf, 0x00cc748c, 0x03a2edf2, 0x004cbb41, 0x0305c480, 0x001d2206, 0x02d30bf3, 0x009245b1, 0x00067d55}}}, + {X: Field{[10]uint32{0x024f0420, 0x03583b83, 0x02a247fd, 0x020ce359, 0x02266c30, 0x0392864c, 0x03ea835a, 0x013edd29, 0x0214f7d4, 0x00272282}}, Y: Field{[10]uint32{0x01d9169a, 0x021d1679, 0x028b4d01, 0x01e8ecaf, 0x018737fc, 0x006bb74a, 0x02da6218, 0x023748c7, 0x02373157, 0x0010b1b0}}}, + {X: Field{[10]uint32{0x0235da1c, 0x030cf6c7, 0x00e59ceb, 0x032810ea, 0x001a32d3, 0x02905e49, 0x01a01548, 0x01bd63fe, 0x00f781a4, 0x0035b33f}}, Y: Field{[10]uint32{0x021d084f, 0x037c88e1, 0x016d568b, 0x02f24409, 0x0287cbcf, 0x015c3e0c, 0x00824e61, 0x01ae362d, 0x021ace84, 0x002872ae}}}, + {X: Field{[10]uint32{0x01f2e3c4, 0x01aeb67d, 0x000da459, 0x03b6903b, 0x006eed5d, 0x0251f234, 0x016f4464, 0x00ffc915, 0x036a3e4c, 0x00233ebc}}, Y: Field{[10]uint32{0x00f3c4d7, 0x0381a4b6, 0x031fcc80, 0x00ee5b28, 0x026b7237, 0x00419fc8, 0x03f81d1c, 0x0337f78c, 0x02ccede6, 0x002646db}}}, + {X: Field{[10]uint32{0x03e664a0, 0x03023aed, 0x03da0541, 0x02c1245f, 0x03189849, 0x031a9b31, 0x02f39738, 0x00e82ef3, 0x01815b0f, 0x00351b0f}}, Y: Field{[10]uint32{0x0167c159, 0x033962b6, 0x026421fe, 0x02650107, 0x0158cffe, 0x02a13b60, 0x02dc9b63, 0x03975f22, 0x03b6d053, 0x000d5492}}}, + {X: Field{[10]uint32{0x037adfff, 0x008ffb0a, 0x02f0490c, 0x01d7280b, 0x03e2ce9b, 0x0118df73, 0x02dce33e, 0x0237dfe0, 0x00a52f1f, 0x0023b5fc}}, Y: Field{[10]uint32{0x028d99ff, 0x003088d8, 0x019a55d9, 0x017509dd, 0x024be1aa, 0x037b8ed9, 0x00272253, 0x0344325b, 0x00c7b418, 0x003c0918}}}, + {X: Field{[10]uint32{0x01aaa2ca, 0x02a17d9b, 0x02c2b0ce, 0x02ca2af4, 0x00825c46, 0x03ba8ffc, 0x03a4d6ca, 0x0146f54a, 0x02dca8a3, 0x0010cfb2}}, Y: Field{[10]uint32{0x022977e5, 0x02850bc5, 0x0038f983, 0x03f20f41, 0x03f6d396, 0x01bce438, 0x00d03c48, 0x0345dd17, 0x01bcc2d7, 0x00134edc}}}, + {X: Field{[10]uint32{0x03a006e6, 0x02cfe72e, 0x014eb249, 0x00ec5701, 0x03ba0449, 0x007d990a, 0x01bbddd8, 0x01fe0dea, 0x02f31037, 0x00301dc7}}, Y: Field{[10]uint32{0x034ccb1e, 0x037c963b, 0x015b0784, 0x00ce98e5, 0x00e1ea2b, 0x01e35312, 0x018c6b47, 0x01a809e2, 0x01ab1d81, 0x000f94f7}}}, + {X: Field{[10]uint32{0x03597ad7, 0x00ea7143, 0x03d238ff, 0x02a29d07, 0x0092072b, 0x00d71b36, 0x0197383e, 0x021ee54e, 0x02264a6a, 0x00370b80}}, Y: Field{[10]uint32{0x0012c74d, 0x00f07c5f, 0x00e01d8a, 0x03272f20, 0x018ddbac, 0x03d65fa1, 0x00ac0ff6, 0x03dc8d10, 0x0346ecd5, 0x002263b9}}}, + {X: Field{[10]uint32{0x02dab771, 0x002dd81a, 0x01f0311f, 0x02cbb60e, 0x01d043d7, 0x0273678c, 0x005f7811, 0x0232fc7f, 0x023459ad, 0x0005aeb3}}, Y: Field{[10]uint32{0x002fb1c4, 0x01b077f0, 0x01243e89, 0x02c4af52, 0x0066e835, 0x00acae0d, 0x02239797, 0x025f8cb2, 0x01326ec6, 0x00003d91}}}, + {X: Field{[10]uint32{0x0169c736, 0x017ce95f, 0x001a4072, 0x036a0e72, 0x029af55e, 0x023c00d1, 0x02539a86, 0x0050e451, 0x018f3a27, 0x002bee53}}, Y: Field{[10]uint32{0x035201d8, 0x03a2f468, 0x009cb386, 0x029d5653, 0x00bdf37f, 0x0158f5d9, 0x00a4eff7, 0x000c769c, 0x014ea455, 0x002bf6ca}}}, + {X: Field{[10]uint32{0x00e89b74, 0x0056aa74, 0x01dc706b, 0x02017de0, 0x02ecc337, 0x0006397a, 0x01b0ae76, 0x03dfd07b, 0x02364a98, 0x002ecc74}}, Y: Field{[10]uint32{0x02031a9a, 0x029307f6, 0x01c27a92, 0x0229ee76, 0x0287cbc2, 0x01373657, 0x009f032f, 0x0331fb35, 0x00031f47, 0x00068193}}}, + {X: Field{[10]uint32{0x004318b8, 0x00f0454f, 0x0270001c, 0x01bb5c9f, 0x03241e48, 0x03bdba0e, 0x0204ee30, 0x0176a059, 0x036c4bbf, 0x003dcec6}}, Y: Field{[10]uint32{0x008c9b17, 0x03e6e29b, 0x01ffb476, 0x03bcedf5, 0x0125ba08, 0x03006c98, 0x00ac2255, 0x0132ead6, 0x016e09d6, 0x00268a2b}}}, + {X: Field{[10]uint32{0x01afa8a4, 0x01ba4864, 0x03313b23, 0x01983c34, 0x03708c87, 0x025816ca, 0x038ea7b6, 0x03168213, 0x0212d0dd, 0x00018ef4}}, Y: Field{[10]uint32{0x016c3e67, 0x001da631, 0x01b0fa33, 0x023b33b3, 0x0102fbca, 0x027f4d0b, 0x03bb0b3a, 0x0100c82b, 0x00f60482, 0x0003b9bd}}}, + {X: Field{[10]uint32{0x02bc6465, 0x001fe186, 0x016299e0, 0x01761d7f, 0x00967b95, 0x031a241e, 0x02416b78, 0x020088c2, 0x022b3606, 0x0018d9f4}}, Y: Field{[10]uint32{0x029417eb, 0x00a225fd, 0x020bbec6, 0x011e4967, 0x03118d16, 0x01657e6c, 0x02444ad5, 0x01e4fc5f, 0x032d14e6, 0x0030fb87}}}, + {X: Field{[10]uint32{0x0085976e, 0x00186a25, 0x02c4f2df, 0x003c2d8c, 0x020c922d, 0x0120e531, 0x0101e3a4, 0x03d4b95e, 0x0143fbb7, 0x001938b9}}, Y: Field{[10]uint32{0x00ab2a4c, 0x024df7ff, 0x0011b48f, 0x01093f38, 0x02895119, 0x0218e939, 0x0047e5a5, 0x01a2d3f1, 0x002e336a, 0x00190698}}}, + {X: Field{[10]uint32{0x03fee1c6, 0x03cc0c78, 0x03f38d6b, 0x01298399, 0x02e16e82, 0x036704c8, 0x0179e869, 0x00d72347, 0x02fd18c8, 0x000b8a42}}, Y: Field{[10]uint32{0x01390f21, 0x0199161e, 0x03874962, 0x02b178dc, 0x02da18cc, 0x00a68d89, 0x0286b0ec, 0x01ad9c1d, 0x028ed2fa, 0x001fe158}}}, + {X: Field{[10]uint32{0x00ee401e, 0x03c421cb, 0x0242b17e, 0x0333602e, 0x00c0ba2d, 0x02231ddd, 0x03229079, 0x0174f7d7, 0x008a0c47, 0x00216688}}, Y: Field{[10]uint32{0x0319f5d8, 0x009ffea2, 0x01e31336, 0x0297c4d2, 0x0384b982, 0x03e84bf3, 0x02ed1e3c, 0x01d0eb58, 0x0245778e, 0x002999f1}}}, + {X: Field{[10]uint32{0x02bcaf21, 0x02b00a80, 0x00939b92, 0x036f64ac, 0x03b608d3, 0x00a7f718, 0x01c0b868, 0x002abbc6, 0x0108ccc5, 0x00324a46}}, Y: Field{[10]uint32{0x02cd2599, 0x023406c1, 0x0231a17d, 0x0115df18, 0x0320cb7d, 0x00bf227e, 0x01352c8b, 0x007d631c, 0x03b74711, 0x0039714a}}}, + {X: Field{[10]uint32{0x01cefb26, 0x03507118, 0x00459b04, 0x031d6369, 0x0364bc42, 0x03c68752, 0x02b01411, 0x02d881e2, 0x009042b5, 0x00140d65}}, Y: Field{[10]uint32{0x034f04e0, 0x01147aaf, 0x02af1e5b, 0x00abdef4, 0x03347c13, 0x009cbe05, 0x00d9bd8f, 0x00193fe0, 0x023db68c, 0x003d87a0}}}, + {X: Field{[10]uint32{0x00a4cbf3, 0x007cb7b1, 0x0343e7b6, 0x00067d17, 0x0039f29a, 0x00ed4d7b, 0x02787c35, 0x03c7ed84, 0x02e7d6a3, 0x003e6f3e}}, Y: Field{[10]uint32{0x032ff883, 0x0301e848, 0x0067b28f, 0x018abb77, 0x02a65658, 0x003f211a, 0x02d5a995, 0x035f9e40, 0x026f273a, 0x003d361b}}}, + {X: Field{[10]uint32{0x014a9152, 0x011c0e7c, 0x01dbad77, 0x03a5fe35, 0x01602ac4, 0x001d91c5, 0x03c0004b, 0x03c143a4, 0x028b901c, 0x0000723f}}, Y: Field{[10]uint32{0x0136769c, 0x01ee031f, 0x00c4c99d, 0x009fdbdd, 0x03b42a0f, 0x02c67e1f, 0x0143b6ec, 0x00a50a48, 0x03347c45, 0x002c9776}}}, + {X: Field{[10]uint32{0x0386f552, 0x010c4c79, 0x004dd2c5, 0x033d04af, 0x008ff676, 0x03ad4d38, 0x023947c6, 0x00ea1f4d, 0x03e14cbe, 0x0000f142}}, Y: Field{[10]uint32{0x0305a74d, 0x03b928e6, 0x032388a0, 0x00f6ed94, 0x00194f55, 0x0119b2b4, 0x02277754, 0x03d80362, 0x031c6e03, 0x00110d11}}}, + {X: Field{[10]uint32{0x030522f5, 0x009c0bb9, 0x01409fe7, 0x02b5b677, 0x005b3e91, 0x03e322c9, 0x0168b4b4, 0x01cbe3ea, 0x01b25554, 0x0019335c}}, Y: Field{[10]uint32{0x01ede304, 0x03c5b622, 0x002af5bf, 0x00f05a1e, 0x0140350a, 0x0066f58a, 0x017fc2a8, 0x0121540b, 0x033ae9fa, 0x003c6c72}}}, + {X: Field{[10]uint32{0x019af7a8, 0x038d0518, 0x00bccc41, 0x039f4bb2, 0x02fd8f69, 0x033102c3, 0x03dded87, 0x030d1b46, 0x0044c584, 0x00307001}}, Y: Field{[10]uint32{0x01879436, 0x0240174f, 0x0238eee0, 0x0332f1b7, 0x01f78dbc, 0x016042d8, 0x03b391ad, 0x03aec21e, 0x00943e3f, 0x00358c6d}}}, + {X: Field{[10]uint32{0x03a2a7ed, 0x03d6558f, 0x01b96cbe, 0x00a2be5c, 0x002fbd0c, 0x02df92e8, 0x0050fd03, 0x02ed871d, 0x0182dad5, 0x003e9425}}, Y: Field{[10]uint32{0x033df4e5, 0x038acd8b, 0x03816165, 0x016cd242, 0x012acdff, 0x01af8865, 0x03890d75, 0x00bde26a, 0x0364617c, 0x00099f09}}}, + {X: Field{[10]uint32{0x01a2386c, 0x008351b0, 0x024d0509, 0x0033df49, 0x0235175e, 0x018130b6, 0x0205f04b, 0x0249aa9b, 0x02e6864e, 0x00195773}}, Y: Field{[10]uint32{0x03ee19c8, 0x03853cb3, 0x02df72bb, 0x00e2d788, 0x025f1dc2, 0x01e596ea, 0x02d36c46, 0x00b2d2e8, 0x02dabf06, 0x00368bab}}}, + {X: Field{[10]uint32{0x033c213e, 0x01bf02b7, 0x01beb760, 0x001b4568, 0x002cc1de, 0x03b17135, 0x03c8fbef, 0x03989025, 0x01ac1b7b, 0x001aad78}}, Y: Field{[10]uint32{0x00a9e466, 0x008c7934, 0x01d3cf36, 0x02353a02, 0x00f83392, 0x03fb37d6, 0x003e0247, 0x00c671d1, 0x03b204eb, 0x0009be60}}}, + {X: Field{[10]uint32{0x00c25f3b, 0x02a75458, 0x01af35f5, 0x02951fbd, 0x036224e2, 0x03dceadc, 0x0373a0d3, 0x02a8b7a7, 0x029e039c, 0x0031f6a1}}, Y: Field{[10]uint32{0x00da579f, 0x010adad0, 0x0175dc79, 0x02267b08, 0x02cfdc0f, 0x01ab9312, 0x02f4cf67, 0x001f604a, 0x010249a6, 0x003a66c4}}}, + {X: Field{[10]uint32{0x0144ef99, 0x03034852, 0x01084a9c, 0x0152fc05, 0x03e20b68, 0x03d34526, 0x028091fa, 0x00f3b7b5, 0x00a15f1c, 0x000a9b53}}, Y: Field{[10]uint32{0x02661ae0, 0x01ad8e03, 0x039b4ced, 0x03cc4fc5, 0x015cb44b, 0x029c0eb1, 0x00d92846, 0x0257a6ae, 0x0288ae92, 0x0037f09d}}}, + {X: Field{[10]uint32{0x01c846c0, 0x018b3684, 0x015752de, 0x009c604a, 0x0292600a, 0x0079dc5a, 0x0259f70b, 0x008932a9, 0x00b3bba7, 0x00111c98}}, Y: Field{[10]uint32{0x008999bf, 0x03687837, 0x00996db8, 0x02990098, 0x038331e2, 0x00184e51, 0x000c9220, 0x00bb7a26, 0x020f33ef, 0x003c5f8f}}}, + {X: Field{[10]uint32{0x03781969, 0x0253dbe9, 0x016fd5b9, 0x0299b94d, 0x015a8788, 0x02cc4abb, 0x00b0f441, 0x01c00e35, 0x00adbaba, 0x002336c7}}, Y: Field{[10]uint32{0x00536977, 0x01dfb75d, 0x00fa17c1, 0x0392e81b, 0x03b88750, 0x0355b080, 0x03be06d8, 0x019ceab9, 0x010e262e, 0x002ce96f}}}, + {X: Field{[10]uint32{0x01caaefe, 0x009aa175, 0x00576851, 0x003c5d76, 0x00bc3e2c, 0x033d1b03, 0x0323e6cd, 0x03e41460, 0x0350fb60, 0x000a2f83}}, Y: Field{[10]uint32{0x022b7320, 0x03e6e8e1, 0x009de21b, 0x030fa590, 0x028d986f, 0x01a30c5d, 0x01404295, 0x02313384, 0x00f7fb18, 0x00173016}}}, + {X: Field{[10]uint32{0x014673a0, 0x012128a6, 0x00eb6f23, 0x0189fe3c, 0x02837e22, 0x0273e0e7, 0x029218ad, 0x03eb522d, 0x00badd2d, 0x0002db73}}, Y: Field{[10]uint32{0x022de992, 0x033f533e, 0x02eafb52, 0x01daba07, 0x02496231, 0x03731cc2, 0x00aa2ab5, 0x005899dd, 0x02d7297f, 0x00387052}}}, + {X: Field{[10]uint32{0x03766a87, 0x01c25578, 0x02e1dbe7, 0x03e4066e, 0x02b9cbb0, 0x0317f369, 0x03ecec9d, 0x03df95e9, 0x02c88813, 0x003917af}}, Y: Field{[10]uint32{0x01fbb07a, 0x004d7ac3, 0x028563ff, 0x01fc4e91, 0x03f915cc, 0x02b2eaa7, 0x03848857, 0x00de0df0, 0x00bb4ccf, 0x000e98a8}}}, + {X: Field{[10]uint32{0x00dccdbb, 0x0087faba, 0x030eb07b, 0x001f7d97, 0x0059bc9d, 0x00adf21d, 0x00b9e552, 0x02752078, 0x037726f3, 0x0037a49b}}, Y: Field{[10]uint32{0x004d8e05, 0x00d9fd8c, 0x02ba0f5f, 0x02c75c86, 0x01115be2, 0x008e7db8, 0x03618ce1, 0x01090092, 0x02a9263d, 0x00274643}}}, + {X: Field{[10]uint32{0x00f2caf0, 0x0280fcbb, 0x03091b54, 0x00b84c17, 0x0091e427, 0x01a5c8ad, 0x03948075, 0x027011b5, 0x03842066, 0x003dd884}}, Y: Field{[10]uint32{0x039e4914, 0x00a4f412, 0x00f6d12d, 0x00aed31f, 0x033088c9, 0x016432a8, 0x01945284, 0x03caa571, 0x00e5a227, 0x003431fa}}}, + {X: Field{[10]uint32{0x025ce751, 0x02effa15, 0x0037d4a8, 0x03458669, 0x01a5cdb1, 0x02e83ae7, 0x00d472e8, 0x03b823d1, 0x028644ff, 0x00139e57}}, Y: Field{[10]uint32{0x0190a4e0, 0x03a0f885, 0x03549749, 0x0156672c, 0x0365038c, 0x01d47961, 0x01b4be3c, 0x01a3e6ee, 0x00e54782, 0x0014a4b6}}}, + {X: Field{[10]uint32{0x01b50b3d, 0x0174b4b7, 0x03559bf4, 0x0237a15d, 0x01cdf75e, 0x02248d4c, 0x0333a97c, 0x02c0fcca, 0x0289a944, 0x001c3991}}, Y: Field{[10]uint32{0x00225586, 0x01349483, 0x0151a536, 0x02eea45a, 0x03925a93, 0x01c79bb7, 0x01ae263c, 0x0226928b, 0x02e5460b, 0x00299d71}}}, + {X: Field{[10]uint32{0x0367056b, 0x02d73c96, 0x020fab08, 0x0240ee76, 0x03477ef3, 0x02d2ffc7, 0x00b8c1c8, 0x0091f803, 0x002e682b, 0x000858df}}, Y: Field{[10]uint32{0x0292d882, 0x0125e793, 0x00e04831, 0x01638934, 0x03c5716b, 0x009f60e1, 0x00c2b6c7, 0x006955f9, 0x025e3e76, 0x0038d5c5}}}, + {X: Field{[10]uint32{0x001d1964, 0x015828e7, 0x02949a40, 0x02c5d19a, 0x03d8ae5b, 0x00062f6e, 0x01a41350, 0x034b85d0, 0x039908da, 0x001da468}}, Y: Field{[10]uint32{0x02422b74, 0x020711c2, 0x00be4d8c, 0x0038a31a, 0x03025728, 0x01db9fc9, 0x03f2296f, 0x016edb36, 0x0004b05b, 0x000897c5}}}, + {X: Field{[10]uint32{0x01af9302, 0x0266be1e, 0x012cb698, 0x0244361d, 0x01b0d11e, 0x009faafe, 0x035a14b0, 0x0021266b, 0x02a4f395, 0x001d20c5}}, Y: Field{[10]uint32{0x03fd7ee2, 0x00c11ed6, 0x0061f179, 0x006e7a11, 0x00f600fc, 0x037628b1, 0x0187c126, 0x0027630f, 0x00d26bd7, 0x00337375}}}, + {X: Field{[10]uint32{0x02ed9b8a, 0x03f83bfd, 0x03390c2f, 0x0146001a, 0x00a97089, 0x007814a5, 0x0084aa6c, 0x03a171b7, 0x01ab3839, 0x002bd623}}, Y: Field{[10]uint32{0x03d9cff0, 0x0055058d, 0x0081d870, 0x00d633c3, 0x01616ca1, 0x03800aab, 0x014131f5, 0x01523c9e, 0x02401b06, 0x0028f4dd}}}, + {X: Field{[10]uint32{0x01b42dc6, 0x011b8436, 0x0253735c, 0x001dbc2d, 0x005f869d, 0x0255ca2c, 0x03617969, 0x01bfec66, 0x00603170, 0x002f6477}}, Y: Field{[10]uint32{0x00f153b2, 0x01c41d91, 0x01a6d161, 0x03df5949, 0x00cdce2c, 0x0381c21c, 0x028db8ed, 0x03d71868, 0x02d15a74, 0x000f258f}}}, + {X: Field{[10]uint32{0x01e98f47, 0x01ccbb7b, 0x0382d985, 0x0209f7ae, 0x030c202c, 0x0132c787, 0x03aa583c, 0x002efd70, 0x00a59146, 0x00398971}}, Y: Field{[10]uint32{0x0170b72e, 0x03733056, 0x0299d7fd, 0x0187244c, 0x000812a4, 0x0392b180, 0x02505348, 0x014e5877, 0x01f9a903, 0x003409b1}}}, + {X: Field{[10]uint32{0x03daac1c, 0x023f971f, 0x000e8ebc, 0x015f6566, 0x00122cd0, 0x0060d5f9, 0x014553c7, 0x024ebe2e, 0x03fed4b1, 0x001af489}}, Y: Field{[10]uint32{0x0221a9f9, 0x03549271, 0x039f022f, 0x012792de, 0x03c66a05, 0x0028ad39, 0x01835d3b, 0x02c1127b, 0x01400a98, 0x0017cff9}}}, + {X: Field{[10]uint32{0x02db2609, 0x03d99907, 0x02f495cf, 0x03e5531b, 0x0068a0f0, 0x016cd39f, 0x03d3872c, 0x01bce148, 0x0225895e, 0x0009dc1e}}, Y: Field{[10]uint32{0x02a777ee, 0x0060088f, 0x0335e03a, 0x02452337, 0x01e5de5c, 0x01fd9dfa, 0x0334b38f, 0x035a5da7, 0x038ec893, 0x003bdbd3}}}, + {X: Field{[10]uint32{0x03f0ebde, 0x005383f3, 0x026db1f3, 0x03039d51, 0x00c01770, 0x010a135f, 0x03770ea0, 0x01053aed, 0x008e3359, 0x00181489}}, Y: Field{[10]uint32{0x03f7b7a2, 0x00638ab8, 0x0312c8b1, 0x034c72e5, 0x031a1ac7, 0x02a955be, 0x0262e020, 0x03551a7e, 0x00585cf0, 0x000f6608}}}, + {X: Field{[10]uint32{0x0370f6bc, 0x0168453c, 0x0150e6c7, 0x019a6d15, 0x034d4fc6, 0x02c8a615, 0x01825068, 0x0049305b, 0x03534fa6, 0x003cb2d6}}, Y: Field{[10]uint32{0x0241112e, 0x029d02dc, 0x008a0ad7, 0x02ef17eb, 0x038ec9dc, 0x00f31de7, 0x0152def4, 0x032b484e, 0x030763a5, 0x00173795}}}, + {X: Field{[10]uint32{0x007a502e, 0x0342c8fa, 0x01b20aa9, 0x01453bdb, 0x0304989b, 0x01d71807, 0x00030c7a, 0x02e7e782, 0x02159fe6, 0x001deb60}}, Y: Field{[10]uint32{0x029b703d, 0x031a037a, 0x0132a87f, 0x01e266be, 0x0300c136, 0x02e87aec, 0x0056add2, 0x0124c9d2, 0x01eeffc2, 0x00249a28}}}, + {X: Field{[10]uint32{0x028fd29d, 0x0132f252, 0x001c8a11, 0x003ee93b, 0x035cc9aa, 0x00b5e246, 0x0380fd7c, 0x03e03e9f, 0x008d171c, 0x0011061d}}, Y: Field{[10]uint32{0x031835c1, 0x02ed063e, 0x02aeebab, 0x01aa99f1, 0x029916c1, 0x009e7f9e, 0x0318322b, 0x006dfdcb, 0x028579f0, 0x000144c0}}}, + {X: Field{[10]uint32{0x027355e0, 0x01f5f98d, 0x008831d3, 0x03ff7df4, 0x01126e59, 0x0046a09b, 0x01901b4d, 0x0321edf9, 0x01606f89, 0x0005abd2}}, Y: Field{[10]uint32{0x00b04c2e, 0x0130b353, 0x009f68ca, 0x03a943b8, 0x0012c8e8, 0x03a8ece3, 0x02131ca8, 0x008f27a3, 0x00405372, 0x000684e1}}}, + {X: Field{[10]uint32{0x02120f9d, 0x00e4be77, 0x03e4aae6, 0x00c0d49d, 0x000730a7, 0x03606123, 0x037ba0ca, 0x00c6e33d, 0x003cab44, 0x0008b481}}, Y: Field{[10]uint32{0x011b8acd, 0x03d3dae6, 0x0145a432, 0x03263b4f, 0x034d71f9, 0x01ff33e7, 0x036520ac, 0x011b4270, 0x01ad5e5b, 0x0035de57}}}, + {X: Field{[10]uint32{0x03676302, 0x02cc9c55, 0x017349fb, 0x022ec906, 0x0241d92c, 0x03d8912d, 0x02033602, 0x0194cdf8, 0x028b3482, 0x00015f9e}}, Y: Field{[10]uint32{0x0199b83a, 0x00a00ed1, 0x022a0975, 0x0374f473, 0x015146af, 0x02ecb951, 0x02bd2eb6, 0x0322cb0e, 0x00e8ba4b, 0x0013648e}}}, + {X: Field{[10]uint32{0x02acc359, 0x01156c09, 0x009da9ab, 0x02093018, 0x007ea19a, 0x01776ac7, 0x02b39ed0, 0x0009f8a0, 0x03602755, 0x0011559f}}, Y: Field{[10]uint32{0x0134f5a7, 0x02e92350, 0x03d4c2fb, 0x03dfdc9b, 0x0182c1cc, 0x0104e4b7, 0x02291611, 0x0153b790, 0x015a77a3, 0x0036d57b}}}, + {X: Field{[10]uint32{0x027fa80f, 0x03e9683d, 0x00c383e8, 0x039c68a1, 0x01798a0b, 0x02114c80, 0x001933ca, 0x024d1e77, 0x01549105, 0x0025a3ed}}, Y: Field{[10]uint32{0x00e8920e, 0x01332849, 0x00bd0b16, 0x0007740f, 0x0201c141, 0x019c60dd, 0x02d83945, 0x03d5430d, 0x02b16853, 0x00018d61}}}, + {X: Field{[10]uint32{0x01873107, 0x0050946b, 0x02d1714c, 0x033446bc, 0x013d640a, 0x01e3dee1, 0x03ef522b, 0x00f35fc7, 0x02490f63, 0x003cd9b1}}, Y: Field{[10]uint32{0x0082c6b9, 0x03ed971d, 0x01546e56, 0x0355c46b, 0x0325b260, 0x0275057b, 0x004cfab5, 0x0262360b, 0x02af38f4, 0x0017f0e5}}}, + {X: Field{[10]uint32{0x00201d06, 0x01a1d0ff, 0x026e9ad0, 0x0224540f, 0x0059b192, 0x00acf0a7, 0x0016effd, 0x01a2cbb7, 0x03d44a2e, 0x002a8313}}, Y: Field{[10]uint32{0x033fee33, 0x037e2dff, 0x01b82b5d, 0x028952a9, 0x002763ac, 0x01d89c34, 0x00b5c4db, 0x01e5dd19, 0x02242fba, 0x0018538c}}}, + {X: Field{[10]uint32{0x032cc876, 0x01125223, 0x00ad2b44, 0x033cdd21, 0x01da4cbd, 0x02a0c391, 0x0057abbd, 0x033b1a47, 0x00ee19b2, 0x001b221b}}, Y: Field{[10]uint32{0x02fc16a1, 0x012e5382, 0x01cf5def, 0x025ef3cb, 0x02a197e8, 0x03b19396, 0x03eb384f, 0x037e1c21, 0x03bd9ab4, 0x000933f2}}}, + {X: Field{[10]uint32{0x02095554, 0x005e16f1, 0x02e439a8, 0x032b7cef, 0x00fbe5e4, 0x0045b538, 0x01d1686f, 0x01dbbb20, 0x0199c33f, 0x00135800}}, Y: Field{[10]uint32{0x03ae614a, 0x0057cc97, 0x028e9dad, 0x03127c58, 0x032bf73d, 0x037fb5d0, 0x01d4321f, 0x03dc3845, 0x00ceb769, 0x0032d053}}}, + {X: Field{[10]uint32{0x010a4fc2, 0x01689697, 0x0230aa67, 0x032b4bc8, 0x0212c3ca, 0x02d96ec5, 0x01e84724, 0x0167839c, 0x00a0196d, 0x000ddf74}}, Y: Field{[10]uint32{0x00feb560, 0x010f1d2b, 0x0338fe03, 0x00d8ad47, 0x021159c7, 0x02cd25d4, 0x03f7c270, 0x009f7297, 0x027d8c8e, 0x000b1c9f}}}, + {X: Field{[10]uint32{0x00820f46, 0x024a2967, 0x025529ca, 0x006633cd, 0x02e8aa50, 0x036402e2, 0x031826f9, 0x037cd46e, 0x038a23af, 0x00273033}}, Y: Field{[10]uint32{0x03e67256, 0x0234d1fd, 0x031f8b06, 0x01197554, 0x00693e54, 0x0290e828, 0x0142c53e, 0x0302a320, 0x015be2aa, 0x002d5cbc}}}, + {X: Field{[10]uint32{0x01fa3050, 0x01363b46, 0x000ead4a, 0x03aa9471, 0x024cfb01, 0x02f81107, 0x01d154a2, 0x00ac7a60, 0x02a64149, 0x0035577e}}, Y: Field{[10]uint32{0x03238ac1, 0x02cb9463, 0x012eb45f, 0x01dc30b7, 0x02da0c4c, 0x008e879c, 0x0098f315, 0x01d30aa6, 0x01cb408c, 0x000b9e57}}}, + {X: Field{[10]uint32{0x01210fd5, 0x001b7b9f, 0x024e8463, 0x021c9e5c, 0x02e3d27e, 0x02b1b01f, 0x035efb3f, 0x00c548c1, 0x03d72d11, 0x0011afd8}}, Y: Field{[10]uint32{0x03b0b199, 0x02cb220c, 0x002fc94c, 0x00dccb8a, 0x02dc4a2e, 0x02417128, 0x03b433a2, 0x00c94df8, 0x01f230fa, 0x001dc6ec}}}, + {X: Field{[10]uint32{0x00ca3aad, 0x000165d4, 0x03a3a13f, 0x02e306a6, 0x03594ef8, 0x01d79f0e, 0x02f1826f, 0x01f05e31, 0x038803e7, 0x0012f3f8}}, Y: Field{[10]uint32{0x021b0129, 0x02abd522, 0x009b62dd, 0x008ed1f4, 0x00ec5ea9, 0x03014e27, 0x0283cf56, 0x0119cbe8, 0x02939dcf, 0x002d558b}}}, + {X: Field{[10]uint32{0x00c241db, 0x01d1ee36, 0x02c57df9, 0x00e477dd, 0x016255ba, 0x012eca92, 0x00ce8023, 0x01a7bb5f, 0x02f4715e, 0x00325a06}}, Y: Field{[10]uint32{0x01e038e6, 0x0087dfb3, 0x02e0828c, 0x0204c420, 0x00da530e, 0x006f72c1, 0x02bb8468, 0x0148197c, 0x01cbb03d, 0x00322c5d}}}, + {X: Field{[10]uint32{0x02fbc33c, 0x02c5af30, 0x00101790, 0x02f531ad, 0x01bd5538, 0x02d3daba, 0x022671a3, 0x01ab1fd2, 0x021b56bd, 0x00027e82}}, Y: Field{[10]uint32{0x03129e63, 0x03f62d8c, 0x01fb5c08, 0x01a1b511, 0x0016056f, 0x0122d219, 0x00599593, 0x01f33b92, 0x02be785c, 0x0009fe7a}}}, + {X: Field{[10]uint32{0x03d0381e, 0x03b1a91c, 0x01feaa56, 0x03caf038, 0x03a87203, 0x019de593, 0x023e7b98, 0x022ab01c, 0x01f0ca17, 0x0005410b}}, Y: Field{[10]uint32{0x010183f2, 0x03b8ef63, 0x033a1677, 0x03f49082, 0x03e271cb, 0x0050f9d7, 0x039eb59a, 0x01ac37e3, 0x0257dac8, 0x0011176d}}}, + {X: Field{[10]uint32{0x0337e9b2, 0x022c0c87, 0x00b65eb0, 0x03403abe, 0x036b7f9d, 0x00876dd9, 0x027da3e9, 0x0061df83, 0x02630d4c, 0x000d53da}}, Y: Field{[10]uint32{0x004ea8fc, 0x026a8ac4, 0x03fea555, 0x0361942f, 0x012eb784, 0x010fbf59, 0x032f480a, 0x0202fbad, 0x003bd65b, 0x00040014}}}, + {X: Field{[10]uint32{0x01de065c, 0x010c3166, 0x03d8ac11, 0x0139e6b8, 0x029e4ba7, 0x009c1f5b, 0x00d8864d, 0x023f0127, 0x01617a44, 0x000670d8}}, Y: Field{[10]uint32{0x009acff5, 0x001bcc26, 0x022fa4dd, 0x00605842, 0x0275742d, 0x02dca67b, 0x02f570c1, 0x03ba0653, 0x03d8fd38, 0x000be7e7}}}, + {X: Field{[10]uint32{0x0083f88e, 0x0130519c, 0x01d395bd, 0x01ed5b39, 0x035a5080, 0x03767ea3, 0x027a2d4a, 0x02299ada, 0x008ad2ab, 0x000dce61}}, Y: Field{[10]uint32{0x01f0cbc9, 0x02058b19, 0x0151e6f5, 0x002440da, 0x01068a54, 0x00b86233, 0x01d20569, 0x000af7d3, 0x00206111, 0x001bf5c6}}}, + {X: Field{[10]uint32{0x0010aa35, 0x018bab07, 0x01ba9500, 0x023e2b1b, 0x012dd7e5, 0x0212e13d, 0x00e66f1f, 0x008cd9f7, 0x0345261c, 0x002708b2}}, Y: Field{[10]uint32{0x012a1116, 0x02fb9901, 0x0146ec8d, 0x005c665b, 0x03605b00, 0x021b72e7, 0x00bead62, 0x02f9ca44, 0x03f58c25, 0x003fe138}}}, + {X: Field{[10]uint32{0x01b4538e, 0x02f7525b, 0x03abbd0f, 0x0215d44f, 0x015a4127, 0x038df155, 0x00c71e45, 0x005cc9fb, 0x01c87f31, 0x0015c851}}, Y: Field{[10]uint32{0x0238871f, 0x031e4422, 0x03550242, 0x02b013a9, 0x015338c6, 0x00485523, 0x02d5166c, 0x002368ab, 0x03ac5e39, 0x00058f98}}}, + {X: Field{[10]uint32{0x01e940ef, 0x0078c84b, 0x0285bd93, 0x036636e1, 0x034c641e, 0x006a59b1, 0x03213b75, 0x00fad63b, 0x0154d841, 0x00327c1e}}, Y: Field{[10]uint32{0x01e17fd0, 0x03061333, 0x0041d792, 0x03cfb7a4, 0x0092cf5a, 0x0026f3b3, 0x025fe7cb, 0x00f4f281, 0x00bc804f, 0x00279a11}}}, + {X: Field{[10]uint32{0x007f25e3, 0x024684de, 0x000c3f92, 0x02a83a20, 0x01f7b0e4, 0x0016a294, 0x024a24df, 0x0228a759, 0x0346b07c, 0x002b0a5f}}, Y: Field{[10]uint32{0x01b66cbb, 0x02637a0a, 0x0185875e, 0x01ddd4f0, 0x02b1556c, 0x01297460, 0x01bbca05, 0x016b5ff4, 0x037f78e4, 0x001a1b8e}}}, + {X: Field{[10]uint32{0x00b3e1b5, 0x025e4d26, 0x0198c218, 0x02f202f0, 0x035ad55d, 0x0087b688, 0x00274df1, 0x029a20e4, 0x013bb383, 0x0001b164}}, Y: Field{[10]uint32{0x00b9ccf1, 0x016ab78b, 0x00dc91c3, 0x02d743de, 0x0153e5b4, 0x00789295, 0x011ebf46, 0x027d28bc, 0x003ae364, 0x00152e6e}}}, + {X: Field{[10]uint32{0x032495df, 0x03aa396b, 0x01b45cf7, 0x03f71e4f, 0x01846e3e, 0x0058f2fe, 0x0259ee92, 0x00d5afb2, 0x03a3f503, 0x002e649b}}, Y: Field{[10]uint32{0x02e2a512, 0x03e41510, 0x03047bb8, 0x0030402f, 0x01054fd0, 0x03f05781, 0x0015c511, 0x039e87b5, 0x03c533d4, 0x00035b75}}}, + {X: Field{[10]uint32{0x00e69556, 0x01ceb61d, 0x03d5a314, 0x03314d5f, 0x03cb36ad, 0x0181cc15, 0x00ac758f, 0x02f9dff8, 0x01d2f2ca, 0x0010c974}}, Y: Field{[10]uint32{0x034904a9, 0x029f53d4, 0x01932ed5, 0x02d7116b, 0x03818c8f, 0x01833123, 0x030562d5, 0x00c57e21, 0x01682ff6, 0x003790de}}}, + {X: Field{[10]uint32{0x00164917, 0x022a3045, 0x03f110d3, 0x037346ff, 0x00eed924, 0x0387103d, 0x03c9059c, 0x02ff292b, 0x015ffd84, 0x002860fa}}, Y: Field{[10]uint32{0x01d64b95, 0x0006ed10, 0x017f0a0d, 0x0176fbc1, 0x00c38d69, 0x0337e57b, 0x005046d4, 0x03290405, 0x0210c7ff, 0x0004715d}}}, + {X: Field{[10]uint32{0x00d07114, 0x017a205b, 0x0009184d, 0x03f4eeaa, 0x02ab7af5, 0x0123f6f0, 0x0251414f, 0x00a3c365, 0x00d9ad65, 0x002cd034}}, Y: Field{[10]uint32{0x020dd4e1, 0x03410384, 0x01384919, 0x02a6db0f, 0x02ae2671, 0x00392da3, 0x024dfbd4, 0x01c3dfe5, 0x026a9ecd, 0x00217b5c}}}, + {X: Field{[10]uint32{0x02719377, 0x03cd3085, 0x0240e8e6, 0x038db035, 0x00b146fa, 0x02781d74, 0x015f0a4c, 0x00be9056, 0x02883599, 0x002d4b6a}}, Y: Field{[10]uint32{0x024ad7ad, 0x0324391e, 0x029df85e, 0x020892c5, 0x004f42f0, 0x011e31e8, 0x00b5cbad, 0x00e2269b, 0x01399fa8, 0x0018222c}}}, + {X: Field{[10]uint32{0x02b9d8ad, 0x015c268a, 0x0218d5dc, 0x00d9148e, 0x01f269ba, 0x030ad7f9, 0x03f82bf7, 0x03e23a7d, 0x011542b0, 0x000242ef}}, Y: Field{[10]uint32{0x028fc4e5, 0x039cd214, 0x00743e06, 0x02432a9a, 0x03c69584, 0x034dd0f7, 0x01461d2b, 0x00d1329c, 0x024a51af, 0x003277e4}}}, + {X: Field{[10]uint32{0x03aa8365, 0x023a9aa8, 0x01fd2278, 0x03ed0e2c, 0x02b31c54, 0x00b24c4b, 0x03d4603f, 0x00653fb4, 0x01a81696, 0x003dcbb9}}, Y: Field{[10]uint32{0x010fde8a, 0x0305c879, 0x0307404f, 0x0331e159, 0x010e66f4, 0x035169cb, 0x03c1078c, 0x003d2e3f, 0x0182b6ca, 0x0038a58f}}}, + {X: Field{[10]uint32{0x02b9fb53, 0x02a0e5f9, 0x01298c35, 0x0137667e, 0x0366a10f, 0x03f4d23c, 0x035d6ddd, 0x0014950b, 0x03715bc7, 0x000422ba}}, Y: Field{[10]uint32{0x0209f1ce, 0x0273c70c, 0x0145b49b, 0x01c2b1af, 0x0297b8d9, 0x00dca261, 0x036df472, 0x02381283, 0x033975a5, 0x0020e22c}}}, + {X: Field{[10]uint32{0x0361d5b0, 0x019fedbf, 0x02e86e26, 0x000524f8, 0x00fe54c9, 0x01fd189a, 0x00a5ff5c, 0x017afe09, 0x02ed8734, 0x00370f6b}}, Y: Field{[10]uint32{0x013411e5, 0x003e2776, 0x01d56da2, 0x01e64ca9, 0x02cf0010, 0x02ad1fd9, 0x02c1683b, 0x00119c65, 0x0241238e, 0x002d69f9}}}, + {X: Field{[10]uint32{0x0265c589, 0x01e70190, 0x03ef9381, 0x00cbe35a, 0x03a82c5f, 0x00e14fbc, 0x01e1d26e, 0x018483a0, 0x003c2be1, 0x000fe5aa}}, Y: Field{[10]uint32{0x035c64b3, 0x00dc4c5a, 0x03a0f2ea, 0x03eaebff, 0x01630ba1, 0x03ef409f, 0x020d7349, 0x03c83f56, 0x030e797c, 0x003ae34d}}}, + {X: Field{[10]uint32{0x03f5c4f3, 0x004ee5bb, 0x038661de, 0x01febc6d, 0x03b35835, 0x00913ef8, 0x00a22780, 0x008f8c73, 0x006ce1f4, 0x0009f2be}}, Y: Field{[10]uint32{0x02b30f61, 0x03e86e28, 0x005a139b, 0x0128bcb5, 0x032187e2, 0x036f7283, 0x03ddbc23, 0x033ed18c, 0x0318647a, 0x003a3ddd}}}, + {X: Field{[10]uint32{0x0374d04f, 0x00931883, 0x0236167a, 0x0071f020, 0x012d301a, 0x01206591, 0x007f9648, 0x021e1862, 0x03b9e241, 0x0019a073}}, Y: Field{[10]uint32{0x0015151d, 0x02d28dee, 0x017608dc, 0x01a66353, 0x03f1ce48, 0x0023447b, 0x01f521cc, 0x03a510bd, 0x033a7849, 0x0027227a}}}, + {X: Field{[10]uint32{0x02ba8da5, 0x02c3996f, 0x0280e67f, 0x03705e57, 0x02fcac45, 0x03eeebe8, 0x02747092, 0x0118e59c, 0x00494866, 0x0019c46e}}, Y: Field{[10]uint32{0x014cfcc6, 0x00ac964a, 0x00118b81, 0x017d834b, 0x016b986a, 0x02f2a947, 0x02d8cecb, 0x017b6488, 0x003f1c8f, 0x003284b2}}}, + {X: Field{[10]uint32{0x031dd94d, 0x0210f8ad, 0x010118b7, 0x019c89da, 0x01fdd734, 0x01a61d71, 0x03d22b05, 0x00b36e83, 0x03d0b110, 0x0017ba73}}, Y: Field{[10]uint32{0x007d7d86, 0x00087782, 0x0063aed9, 0x02522d7d, 0x02060d22, 0x026d80cc, 0x03c518f1, 0x027b9385, 0x00e5bd7f, 0x000775e9}}}, + {X: Field{[10]uint32{0x01f4924c, 0x028fcabb, 0x01785e38, 0x0074b4b6, 0x02d7538f, 0x03408937, 0x0195a466, 0x002f9bcf, 0x017b1339, 0x00161b6b}}, Y: Field{[10]uint32{0x002b64d0, 0x0365e1b3, 0x039867be, 0x00072657, 0x00bc2fb1, 0x00467963, 0x035bd337, 0x00d6085c, 0x01a5a68a, 0x0031ddfb}}}, + {X: Field{[10]uint32{0x025091ec, 0x01c94359, 0x02d9184f, 0x0382b63b, 0x00867f6e, 0x003771fa, 0x024b6e69, 0x004b1c64, 0x02d20fa0, 0x000169d4}}, Y: Field{[10]uint32{0x03b95db6, 0x02ba0651, 0x02d27d53, 0x025d7cb2, 0x03ec1ace, 0x01e2410b, 0x01029fc5, 0x0190a7c5, 0x032b32b3, 0x0015fc88}}}, + {X: Field{[10]uint32{0x013e638e, 0x02a01929, 0x02e60002, 0x0381ef9c, 0x02426372, 0x01e3ac50, 0x00fef223, 0x015dfaa7, 0x02ff22bc, 0x003e4f2f}}, Y: Field{[10]uint32{0x03afe50f, 0x00d08de0, 0x00a5996f, 0x01755c64, 0x03eeadb7, 0x009e793c, 0x03166702, 0x036d0a52, 0x02bb401b, 0x002af1dc}}}, + {X: Field{[10]uint32{0x012608a9, 0x00053a43, 0x038cc3dd, 0x03ee15ba, 0x0076052c, 0x029b98eb, 0x03c34c36, 0x0025c8bb, 0x009e9613, 0x002309cb}}, Y: Field{[10]uint32{0x024607b3, 0x03a49f9b, 0x02dfde85, 0x0058d257, 0x03731e37, 0x022d5000, 0x027d2261, 0x01c588ee, 0x016813c5, 0x002661f4}}}, + {X: Field{[10]uint32{0x01769bc5, 0x021f0453, 0x015e23e1, 0x01327e55, 0x0038dfd8, 0x00e1b770, 0x00226c4d, 0x0150ae95, 0x00d61519, 0x002fde28}}, Y: Field{[10]uint32{0x01910280, 0x01bb262c, 0x00fe55d2, 0x01f4c56f, 0x03e16058, 0x010a567b, 0x0014b59d, 0x03020798, 0x01e4d84e, 0x00182538}}}, + {X: Field{[10]uint32{0x02e65caa, 0x03f6e64c, 0x02b28ee1, 0x016b8c47, 0x01497aaa, 0x0109217f, 0x03ab651f, 0x00a86ffe, 0x0376cd09, 0x0016c992}}, Y: Field{[10]uint32{0x01d70d78, 0x0062381a, 0x00c84c8c, 0x008b5762, 0x021dd847, 0x015a56c1, 0x010fdc88, 0x035f0d98, 0x03594b68, 0x002513e4}}}, + {X: Field{[10]uint32{0x0082b559, 0x03810ab0, 0x027974b7, 0x014409d3, 0x01322f71, 0x03451dc1, 0x03c14598, 0x028344ce, 0x00ea8075, 0x002891cf}}, Y: Field{[10]uint32{0x02575a18, 0x01a2a268, 0x004b5d2c, 0x00a9c212, 0x035168d3, 0x03db2416, 0x0309d794, 0x01ec1b66, 0x030db655, 0x001937a0}}}, + {X: Field{[10]uint32{0x009efa45, 0x022a00d8, 0x02350652, 0x002028a4, 0x01f14b07, 0x01c21ef5, 0x001535da, 0x0314510d, 0x01e63dd0, 0x000f8635}}, Y: Field{[10]uint32{0x00288c5b, 0x027fd9d5, 0x030a6e1d, 0x00589aa7, 0x0026dc2f, 0x0394d1c3, 0x02fd041b, 0x01ce0be0, 0x01b97d00, 0x001ba71c}}}, + {X: Field{[10]uint32{0x0294dfa5, 0x03d855a0, 0x0184b71a, 0x01050a16, 0x026a7674, 0x0308a421, 0x0296eb09, 0x018c56f3, 0x03cdb91e, 0x00346b36}}, Y: Field{[10]uint32{0x013da5a4, 0x03a7e218, 0x014522c9, 0x03a59ae6, 0x00accb67, 0x00f8a74f, 0x00072017, 0x00dd70fe, 0x00d89872, 0x00178ec3}}}, + {X: Field{[10]uint32{0x0050c90d, 0x002badf6, 0x024e1a21, 0x00a3103d, 0x0125ddb0, 0x00d7b3dd, 0x02cc880a, 0x0383cad7, 0x01e29344, 0x000eaa66}}, Y: Field{[10]uint32{0x0143d42b, 0x00eaafe9, 0x01951567, 0x013b1f28, 0x01028c45, 0x027a6a20, 0x02e6fcbe, 0x0286fb74, 0x025cfbe3, 0x00334b38}}}, + {X: Field{[10]uint32{0x01a5017d, 0x0359c258, 0x02398146, 0x0389692d, 0x033e1b31, 0x028e9b28, 0x010aa4c8, 0x00572fb3, 0x021d7c38, 0x0026288d}}, Y: Field{[10]uint32{0x0009f2bc, 0x01c4a28b, 0x00de6d39, 0x01753674, 0x01516df2, 0x035e380e, 0x00213958, 0x00304efa, 0x03780304, 0x0007ccf7}}}, + {X: Field{[10]uint32{0x013d98d0, 0x01459d01, 0x03cc4613, 0x011ef86d, 0x03ff3482, 0x0132da72, 0x03a55628, 0x02e1c1b5, 0x018c907a, 0x0014a2e7}}, Y: Field{[10]uint32{0x01eafabd, 0x01fab4f7, 0x01051aba, 0x014c6531, 0x0129700d, 0x00028450, 0x02d67bb8, 0x015de1f1, 0x0036d666, 0x003e47ae}}}, + {X: Field{[10]uint32{0x025029b6, 0x01b07398, 0x0193a355, 0x0398b236, 0x00f4be50, 0x02e33dcc, 0x01a6a866, 0x0034822f, 0x008d3d1b, 0x003c6b7b}}, Y: Field{[10]uint32{0x03cc7224, 0x01d07506, 0x0178f964, 0x0153822a, 0x0257e4a7, 0x00b51e55, 0x03fb61b3, 0x01860896, 0x00aac3bf, 0x0011e0c9}}}, + {X: Field{[10]uint32{0x0124a099, 0x035429ce, 0x00f10f74, 0x0329d0aa, 0x000e0181, 0x01d752a8, 0x0070cf8d, 0x0056b106, 0x0133b1b1, 0x002acbbc}}, Y: Field{[10]uint32{0x026a91ea, 0x00a6ac15, 0x030a5756, 0x0339c29c, 0x012f2baa, 0x02302bda, 0x0149ef53, 0x03baad5e, 0x0374c584, 0x0028b11e}}}, + {X: Field{[10]uint32{0x00576f85, 0x0326c9f8, 0x00c72348, 0x01f4446e, 0x00539a61, 0x024dc21a, 0x0120e2bf, 0x01be0ec7, 0x001af6da, 0x002753ad}}, Y: Field{[10]uint32{0x01f30eea, 0x035accf1, 0x000d7cc5, 0x031c7096, 0x0373acc3, 0x00d4cc17, 0x02dfe904, 0x03213ea2, 0x000db786, 0x003071ec}}}, + {X: Field{[10]uint32{0x03b916d9, 0x01088a4f, 0x011d018a, 0x023e790c, 0x02a55363, 0x0367a418, 0x006dff05, 0x00b20722, 0x017f7b1b, 0x000c3b75}}, Y: Field{[10]uint32{0x00842ee7, 0x039f1291, 0x00502d44, 0x0192a8a2, 0x00f7449e, 0x02b3f38c, 0x0220b485, 0x015e8607, 0x034b16d2, 0x001af11d}}}, + {X: Field{[10]uint32{0x01306583, 0x00715d0c, 0x0066a41d, 0x029c7a04, 0x00f10969, 0x01248053, 0x0058fc6a, 0x02e15597, 0x039d09a2, 0x000a38fa}}, Y: Field{[10]uint32{0x03bb6c2c, 0x00f23f37, 0x00e7ddc9, 0x00577d2a, 0x0359ad3c, 0x030542b8, 0x025245c8, 0x01019c03, 0x03878073, 0x003f194e}}}, + {X: Field{[10]uint32{0x02ac75a3, 0x015c69a6, 0x00e08c91, 0x02d9d276, 0x035a3a8b, 0x03cfa098, 0x03be578f, 0x010b428b, 0x0335e3c8, 0x0032e611}}, Y: Field{[10]uint32{0x03ea8367, 0x0050a6de, 0x02268b48, 0x01efa64d, 0x004c3e25, 0x035c52bd, 0x013f977a, 0x030fd4c0, 0x00cc7181, 0x003a4d68}}}, + {X: Field{[10]uint32{0x000fe170, 0x00146ae9, 0x037a3ed0, 0x016c82a8, 0x015e4d66, 0x021437f3, 0x0283b106, 0x001fabba, 0x02727e83, 0x000d8619}}, Y: Field{[10]uint32{0x00707a6d, 0x03be3440, 0x0124be32, 0x03cb6976, 0x01ab27cb, 0x038b2cd2, 0x014c710c, 0x037007d7, 0x02d32ae6, 0x003b189b}}}, + {X: Field{[10]uint32{0x006b7d2e, 0x020ec5d3, 0x03136021, 0x02c8ed40, 0x034260ab, 0x032099ef, 0x02ccd54d, 0x03cd970a, 0x015e69e9, 0x002c6903}}, Y: Field{[10]uint32{0x01c186ec, 0x011cc28f, 0x027c3af0, 0x02a02eb8, 0x0331edde, 0x03bd8cba, 0x001ff894, 0x0107d490, 0x01ab2a7b, 0x001d9867}}}, + {X: Field{[10]uint32{0x01660825, 0x02c509c5, 0x02be242e, 0x00d75308, 0x00b32a8f, 0x00988019, 0x03f0ccb2, 0x00288fa0, 0x00b3dff6, 0x002af522}}, Y: Field{[10]uint32{0x000b3a89, 0x03dfc8e1, 0x0105be1b, 0x00124684, 0x03fa9949, 0x006122ea, 0x007a463d, 0x038ebe5b, 0x00f217da, 0x001bbfe0}}}, + {X: Field{[10]uint32{0x01d6aa22, 0x01443293, 0x00598c92, 0x0055cff9, 0x002a5721, 0x0086f6c4, 0x00979743, 0x03ad20bd, 0x0304d91c, 0x002b033e}}, Y: Field{[10]uint32{0x034582d5, 0x03958149, 0x02de81c5, 0x0129198a, 0x02395031, 0x0111d366, 0x018ae4a6, 0x0342a419, 0x01874a90, 0x001ad7db}}}, + {X: Field{[10]uint32{0x03c34432, 0x02ebc46b, 0x008e6087, 0x03cd54a5, 0x02a3a0bf, 0x0374762f, 0x03c75410, 0x012d9da5, 0x020f476c, 0x0007ea2f}}, Y: Field{[10]uint32{0x00788d33, 0x036d6ae0, 0x01e5496d, 0x01ae3d71, 0x03fe79df, 0x02071c61, 0x0161d201, 0x011878ca, 0x00848038, 0x0031ac94}}}, + {X: Field{[10]uint32{0x01f90e56, 0x03ed0970, 0x00ec9b29, 0x0355fa34, 0x03f336a4, 0x015717c3, 0x017d3137, 0x022626a0, 0x03c0d373, 0x000a06d0}}, Y: Field{[10]uint32{0x009f4a9c, 0x02a6ef2f, 0x03689921, 0x0111fe08, 0x03686830, 0x0089e9a9, 0x03e3db31, 0x016726dc, 0x030eba10, 0x0009ad41}}}, + {X: Field{[10]uint32{0x008f4052, 0x02c9a532, 0x02f120f0, 0x0118aa4a, 0x013b83eb, 0x01796a0b, 0x006327f5, 0x007b11d1, 0x01e954e8, 0x0035939a}}, Y: Field{[10]uint32{0x01c8622a, 0x0251e5cf, 0x030d58f3, 0x0036bebf, 0x0227a8f0, 0x019ba952, 0x0275565f, 0x00f28a6f, 0x015f284c, 0x002a9fb5}}}, + {X: Field{[10]uint32{0x00e7b028, 0x02f353f9, 0x03a5417b, 0x02315086, 0x01483fb5, 0x0185e08d, 0x035b0c9d, 0x0076c7c2, 0x02eed4b0, 0x003d336e}}, Y: Field{[10]uint32{0x02c63b47, 0x02eac641, 0x013021dd, 0x011e3aa4, 0x01b2b924, 0x02894022, 0x039f48c5, 0x0264137a, 0x00eb29d6, 0x0019b564}}}, + {X: Field{[10]uint32{0x03c9dca5, 0x00ffc2a4, 0x02f4c724, 0x0334779d, 0x00761fc1, 0x01e74868, 0x02ca8090, 0x038cd03f, 0x004a6c46, 0x0023fe53}}, Y: Field{[10]uint32{0x0149abf7, 0x00236bbc, 0x0377c2ab, 0x00d2a2ed, 0x01772071, 0x021ff731, 0x0342d4f1, 0x01a38ca7, 0x00335f3c, 0x00048f77}}}, + {X: Field{[10]uint32{0x03cf267a, 0x00fb3449, 0x01e705c3, 0x0313cabd, 0x00efed70, 0x00ed93ec, 0x007c0e62, 0x0061adfa, 0x01b46e34, 0x00031e1a}}, Y: Field{[10]uint32{0x0011f48a, 0x01c829d7, 0x01a59629, 0x0291a401, 0x03029aef, 0x0368aef5, 0x017d95d7, 0x002260bc, 0x00393662, 0x00198a55}}}, + {X: Field{[10]uint32{0x02cce1a4, 0x02c90c41, 0x00142351, 0x01c9bbb0, 0x0309836f, 0x016d4106, 0x026ba9e2, 0x03721ef4, 0x02c60ad5, 0x00383a9d}}, Y: Field{[10]uint32{0x00eff928, 0x00f52e35, 0x03dbc5a0, 0x005f22bd, 0x016a3a44, 0x02248ad9, 0x02a620a7, 0x0126ae22, 0x00e66320, 0x0022f5c9}}}, + {X: Field{[10]uint32{0x01e30159, 0x029fac4a, 0x027bfc6a, 0x03492d2a, 0x00e8e357, 0x0220fd4b, 0x0019f1f4, 0x022608d9, 0x02c73e5f, 0x000be98e}}, Y: Field{[10]uint32{0x00d8c3fd, 0x02c0e3ae, 0x01d517d0, 0x00a01bde, 0x007251db, 0x02d79711, 0x025b3146, 0x00fea3d6, 0x001cd632, 0x0015f858}}}, + {X: Field{[10]uint32{0x033026a1, 0x01b4cb71, 0x0012f6aa, 0x01dec808, 0x0149d008, 0x02ede99c, 0x02783fc1, 0x0024c08b, 0x0038d4c5, 0x001d3b50}}, Y: Field{[10]uint32{0x0328476f, 0x01bf509a, 0x0035e80e, 0x0200e3a6, 0x0258234f, 0x03deff69, 0x00618e49, 0x0027a233, 0x030e65d0, 0x0016dd3d}}}, + {X: Field{[10]uint32{0x00025f97, 0x03f4b63c, 0x01148eae, 0x03737101, 0x0216ce75, 0x03f7c83e, 0x02d1f934, 0x004f71b7, 0x00a6e387, 0x001c75ab}}, Y: Field{[10]uint32{0x0067e302, 0x00f9829c, 0x02bae0dd, 0x013688b6, 0x02072ffd, 0x0067da74, 0x00c6c4fb, 0x037f209e, 0x01337d48, 0x002d0c51}}}, + {X: Field{[10]uint32{0x03ed5292, 0x01d2b316, 0x004ac8a1, 0x031a25c1, 0x02ee617e, 0x0100a5eb, 0x02d5720f, 0x02f27e68, 0x03f16e91, 0x000a3ed1}}, Y: Field{[10]uint32{0x00b498f7, 0x02e1293e, 0x0059e0bd, 0x03b4ae9e, 0x00ef8e7a, 0x0250f06d, 0x00db6059, 0x01caf93f, 0x0161d724, 0x003412da}}}, + {X: Field{[10]uint32{0x0347a37a, 0x01c3b887, 0x036f8942, 0x0177898b, 0x03828c5a, 0x0269eccb, 0x02fca795, 0x016d7d74, 0x01f5c865, 0x001a3f35}}, Y: Field{[10]uint32{0x038d74ab, 0x009fcc9d, 0x01fb6d3d, 0x01395183, 0x017aa1ad, 0x029c409d, 0x032bc4e7, 0x01c59b0d, 0x02503362, 0x0015d201}}}, + {X: Field{[10]uint32{0x01aa36da, 0x0041a165, 0x03e97491, 0x01346b1a, 0x0117c974, 0x01e9800b, 0x017f8a8a, 0x02af11fb, 0x02d2f423, 0x0031d85e}}, Y: Field{[10]uint32{0x03121d9d, 0x01fd95ed, 0x022e8d59, 0x03f281b2, 0x0269e330, 0x00cf1852, 0x027a9db8, 0x01b2b72f, 0x0367fba9, 0x00366412}}}, + {X: Field{[10]uint32{0x02487cdd, 0x019864a9, 0x028c8df5, 0x00862c93, 0x01474fdc, 0x00966a74, 0x0278b955, 0x03f85b03, 0x029d2396, 0x0029fbd3}}, Y: Field{[10]uint32{0x02f67f28, 0x01427bd6, 0x015c1f40, 0x03753dd9, 0x0323c1e4, 0x01bc8bcd, 0x003f7e68, 0x02f81263, 0x020491c6, 0x00359e09}}}, + {X: Field{[10]uint32{0x031e2578, 0x01ad0d9d, 0x00890eab, 0x00602789, 0x0271856d, 0x00246ecb, 0x00e420f4, 0x00d9d92b, 0x00467ff0, 0x003cef9e}}, Y: Field{[10]uint32{0x0236dbc5, 0x0198aec1, 0x03309434, 0x00e9a047, 0x010dc58f, 0x02c9fff0, 0x026966f6, 0x03cf959e, 0x025745cb, 0x003cc09d}}}, + {X: Field{[10]uint32{0x02f0259c, 0x00fdd54d, 0x0347094d, 0x00a9385c, 0x016c8d9e, 0x03afd3cd, 0x0214c303, 0x0338a414, 0x03955bd9, 0x0017251f}}, Y: Field{[10]uint32{0x035e76cc, 0x02d729ed, 0x039c468f, 0x0235a3bc, 0x0190a81d, 0x015e2893, 0x01fdf498, 0x014a8f4b, 0x03753e75, 0x002daded}}}, + {X: Field{[10]uint32{0x018b2c68, 0x033d02ef, 0x00c134e4, 0x02274410, 0x002c54c1, 0x0309681d, 0x01b87028, 0x01cd789e, 0x0160c3b1, 0x0008dbf6}}, Y: Field{[10]uint32{0x01bbc279, 0x02b0e416, 0x01181873, 0x02fad097, 0x01b44bac, 0x01e69db3, 0x019360eb, 0x03063743, 0x03f7c0ba, 0x0026ad66}}}, + {X: Field{[10]uint32{0x01947b31, 0x0184ecec, 0x00d99cd7, 0x03ff2a2c, 0x02c1a9e9, 0x02e7624c, 0x01d02438, 0x038bdd96, 0x032617cc, 0x00324b27}}, Y: Field{[10]uint32{0x02357a51, 0x03f826d4, 0x0150b725, 0x037c54e7, 0x02e4804d, 0x006b38ac, 0x02707695, 0x0193ad97, 0x014c1a5e, 0x002af7aa}}}, + {X: Field{[10]uint32{0x01a94fc0, 0x0068509b, 0x03bd28bd, 0x03a02f07, 0x02733c2a, 0x0348b0c5, 0x0383a124, 0x018230cd, 0x03c9142c, 0x00261821}}, Y: Field{[10]uint32{0x0342a1cd, 0x01844fea, 0x0068d3fa, 0x0373ac9b, 0x038f5bad, 0x01158b37, 0x0282c650, 0x02d475af, 0x03f5fd76, 0x00052496}}}, + {X: Field{[10]uint32{0x008a1d43, 0x01e18869, 0x021bf914, 0x024e0ed0, 0x0222424e, 0x00d5942d, 0x0244e21f, 0x02eab5f1, 0x0374f4f6, 0x00119687}}, Y: Field{[10]uint32{0x0388cb48, 0x03fa48f1, 0x031579f2, 0x01ee0c91, 0x03d41c14, 0x036c0554, 0x02698d57, 0x00c2f7b9, 0x01e41794, 0x0009b69c}}}, + {X: Field{[10]uint32{0x009796b4, 0x033b9bd7, 0x00a00785, 0x03645643, 0x03c7aa2e, 0x002d1ab6, 0x033c88bd, 0x005f113f, 0x00cdf281, 0x00375d96}}, Y: Field{[10]uint32{0x03cc43be, 0x01ecd033, 0x00f37c1c, 0x0303ddf7, 0x039a9b8a, 0x0391749f, 0x034935a8, 0x03a65c29, 0x000d1e10, 0x000c8c5f}}}, + {X: Field{[10]uint32{0x03c72033, 0x033ae1d5, 0x02d09715, 0x022f766b, 0x006222af, 0x0097d4bf, 0x0148b177, 0x03127ad1, 0x02bfa803, 0x00156f4a}}, Y: Field{[10]uint32{0x013ebf43, 0x037f214f, 0x00e3553a, 0x02e10559, 0x0096b991, 0x0373ca95, 0x03c603b8, 0x0112ceaf, 0x03b39d73, 0x000d2b4c}}}, + {X: Field{[10]uint32{0x0012fcde, 0x0322297b, 0x03c36db0, 0x01d90627, 0x00440068, 0x0056c787, 0x01616d30, 0x0089b232, 0x0006d10c, 0x001def97}}, Y: Field{[10]uint32{0x029ba01b, 0x03f67810, 0x037f6ec8, 0x017b6597, 0x0020e8b5, 0x000d86e7, 0x0327ae1b, 0x01252623, 0x03ca5c47, 0x00333cb2}}}, + {X: Field{[10]uint32{0x012ab21c, 0x02dabcbd, 0x0161830d, 0x03bb52ed, 0x0180b890, 0x03a9f6f7, 0x0060b19b, 0x03c987c1, 0x00863eb6, 0x003eadc9}}, Y: Field{[10]uint32{0x0076d0b0, 0x00bdd322, 0x025c15d2, 0x03ebea76, 0x00b67f6a, 0x0276039a, 0x01174ed9, 0x00b8baaa, 0x003a408a, 0x0002453c}}}, + {X: Field{[10]uint32{0x020b2f66, 0x02e0208a, 0x005a109d, 0x017573c4, 0x02510db6, 0x039e0c52, 0x02671f8d, 0x022e1942, 0x0039fafe, 0x0008ca88}}, Y: Field{[10]uint32{0x0178576a, 0x03cfb0ab, 0x02218d95, 0x0389934b, 0x033be3a6, 0x0085bb04, 0x03b9f6ee, 0x03078d4c, 0x0082510b, 0x0005329c}}}, + {X: Field{[10]uint32{0x037f58e7, 0x00e41506, 0x00cfc64e, 0x028a252a, 0x01deee9f, 0x023c4f9a, 0x01847526, 0x013fde81, 0x0039612a, 0x002cd20a}}, Y: Field{[10]uint32{0x0126ae44, 0x03edc757, 0x0193a3f2, 0x00919ac4, 0x01653b82, 0x01f16378, 0x034e9faf, 0x00096c3a, 0x02eddf30, 0x001c8b40}}}, + {X: Field{[10]uint32{0x02353210, 0x008e6596, 0x017b2858, 0x012889b7, 0x02cf6fd8, 0x024c89c4, 0x0310871a, 0x01d61f2a, 0x02570b0a, 0x0034e1ce}}, Y: Field{[10]uint32{0x0160f186, 0x01789fd4, 0x011d660e, 0x003327f0, 0x01f1f45d, 0x01578cd4, 0x03f95b1c, 0x039c1b37, 0x018459c7, 0x000edf92}}}, + {X: Field{[10]uint32{0x022c20ad, 0x02cb6e85, 0x03281cc9, 0x030c9b72, 0x0226a049, 0x011f029e, 0x01289a71, 0x02caddc7, 0x008ceeeb, 0x00220a1e}}, Y: Field{[10]uint32{0x007b71a7, 0x0197d230, 0x0364cc8c, 0x00b77928, 0x025da2fa, 0x0125c709, 0x0398922b, 0x017c88f5, 0x01958742, 0x00390a28}}}, + {X: Field{[10]uint32{0x027e537d, 0x002cfd3a, 0x0280a37f, 0x02d3a9d5, 0x0052f8db, 0x024fe85d, 0x0186c189, 0x030035d2, 0x013126d0, 0x001e7fb9}}, Y: Field{[10]uint32{0x002cb5b6, 0x0005ea20, 0x035a4560, 0x02fa4f56, 0x01525ceb, 0x00eaceaf, 0x017b4a14, 0x03e652d3, 0x00713143, 0x003f7940}}}, + {X: Field{[10]uint32{0x02814e91, 0x03962a19, 0x01cbaac1, 0x0272fda6, 0x03367242, 0x000ead42, 0x00f3a8ce, 0x017de57c, 0x01f05a9f, 0x003d13ce}}, Y: Field{[10]uint32{0x019a1dd4, 0x02768c35, 0x030e3fc0, 0x01191ab1, 0x02ff75a2, 0x02aca2ee, 0x00a27afb, 0x004c0254, 0x01d1e4de, 0x002e5791}}}, + {X: Field{[10]uint32{0x00aa9abb, 0x009bb0a0, 0x02148504, 0x02fcf0be, 0x02da45af, 0x00cb3def, 0x01d7d788, 0x0326dee2, 0x0209baf9, 0x00044e38}}, Y: Field{[10]uint32{0x006a0d6e, 0x01f9267c, 0x02f88372, 0x005c259c, 0x03ac7d59, 0x0399fcba, 0x02285207, 0x02cabc3a, 0x016a3965, 0x000570a3}}}, + {X: Field{[10]uint32{0x00912c1e, 0x02e0fe4d, 0x02620472, 0x03c56bf0, 0x00dcd3d3, 0x02940c4c, 0x024685aa, 0x035e3183, 0x01421b98, 0x000a74fa}}, Y: Field{[10]uint32{0x02bf5825, 0x011729f4, 0x02ce1a6d, 0x019f222e, 0x01411c8c, 0x02df14ee, 0x01d46b6d, 0x0025a485, 0x00f84968, 0x00242945}}}, + {X: Field{[10]uint32{0x00ff3eb8, 0x025a7021, 0x020c7e90, 0x022294fe, 0x01d6efeb, 0x034b51c2, 0x00c18d7c, 0x00cf813c, 0x02945fdd, 0x002a28da}}, Y: Field{[10]uint32{0x016ab564, 0x025abd7d, 0x002a9bb5, 0x03351e7c, 0x0223db1f, 0x033b872b, 0x02aedbe1, 0x0335c009, 0x0105edbf, 0x000775fe}}}, + {X: Field{[10]uint32{0x02981eff, 0x0030849a, 0x03fd5367, 0x032a0498, 0x003c35f2, 0x00f9e81b, 0x02ab4f0c, 0x02513e43, 0x02ceb3fa, 0x00168123}}, Y: Field{[10]uint32{0x03c886ff, 0x035b52ed, 0x019b24b3, 0x0015a486, 0x008e330d, 0x03a201df, 0x03caf7b5, 0x03b59754, 0x03aeb70f, 0x000493c6}}}, + {X: Field{[10]uint32{0x0132b8ba, 0x0204a23a, 0x031583dc, 0x03b35ca5, 0x00fd1eb4, 0x01917eb1, 0x01ee579c, 0x02f0bd99, 0x02820c5e, 0x000c81c0}}, Y: Field{[10]uint32{0x01bdaa17, 0x036b7ca1, 0x03d55b86, 0x026a00f2, 0x03c17eda, 0x022109c1, 0x03b11ee0, 0x0101fb6b, 0x022d0d68, 0x0023da59}}}, + {X: Field{[10]uint32{0x03afe787, 0x01e91f95, 0x01786db7, 0x024c9e86, 0x02c78105, 0x0202927f, 0x0188a7b0, 0x034fc6ee, 0x025bfb04, 0x001f08a1}}, Y: Field{[10]uint32{0x0036bd3b, 0x03c1b874, 0x00d53097, 0x01c9839c, 0x03d0830b, 0x00e7c672, 0x01997344, 0x02675f55, 0x026e30f5, 0x00280bac}}}, + {X: Field{[10]uint32{0x039385cc, 0x0384f2c2, 0x033a422d, 0x01682abc, 0x01fd842e, 0x00f730d9, 0x02c8269a, 0x02094b01, 0x001330ad, 0x00282e93}}, Y: Field{[10]uint32{0x02239bc8, 0x00a4397f, 0x00960c13, 0x00511d5a, 0x00940fdb, 0x01dee7a1, 0x036d2ce2, 0x02efdfce, 0x03135cfd, 0x00163b2a}}}, + {X: Field{[10]uint32{0x00f76309, 0x007b08d1, 0x038194e3, 0x0121c399, 0x03007be4, 0x00b8b033, 0x03e47a41, 0x02e97723, 0x0042c8a2, 0x0010ab98}}, Y: Field{[10]uint32{0x02a1542e, 0x03c826f7, 0x02c3ce19, 0x008f2f25, 0x0336ea3a, 0x00f19119, 0x010a6e75, 0x022fc888, 0x01ac7ba3, 0x001cab5a}}}, + {X: Field{[10]uint32{0x007b2a19, 0x000b56c2, 0x01e7c6e8, 0x00323f04, 0x01d8f35f, 0x01c081ce, 0x025d82f4, 0x01e8b8fa, 0x00b64550, 0x0023ceba}}, Y: Field{[10]uint32{0x025b4cfe, 0x034ae03b, 0x036a50d1, 0x009f4fe6, 0x03604259, 0x02e6c51c, 0x003420ef, 0x03b5506e, 0x02353028, 0x00186ee3}}}, + {X: Field{[10]uint32{0x005df32f, 0x006d0dec, 0x004c00d9, 0x00498ab9, 0x00a7ba1e, 0x00254f9b, 0x024fb4f3, 0x00648283, 0x024b1e15, 0x000ea12e}}, Y: Field{[10]uint32{0x013e20c0, 0x02eb679f, 0x02ce7d3c, 0x03af3771, 0x0332c44e, 0x02438743, 0x023abe9c, 0x017c51ec, 0x01794352, 0x002c83d9}}}, + {X: Field{[10]uint32{0x03316210, 0x017f6239, 0x005b62d2, 0x0204af05, 0x017b87d1, 0x03918b9f, 0x00c102bd, 0x02940cfb, 0x026c0b04, 0x0019207f}}, Y: Field{[10]uint32{0x0364560d, 0x039709e3, 0x01075b26, 0x003abbcc, 0x03d4e88b, 0x00232461, 0x036538b8, 0x00ab4245, 0x00abf5f3, 0x002f306d}}}, + {X: Field{[10]uint32{0x0151a094, 0x004c1935, 0x02f4d1ff, 0x032b2b02, 0x038e4bd1, 0x03dceccf, 0x01cd3651, 0x0160febe, 0x0174722c, 0x00014d00}}, Y: Field{[10]uint32{0x01a66a8e, 0x02f88840, 0x00a41a3b, 0x016ebafe, 0x01d9e465, 0x021742a5, 0x0035180f, 0x0185b439, 0x0135448a, 0x00392408}}}, + {X: Field{[10]uint32{0x022867cc, 0x003e1493, 0x0349bb35, 0x029e4372, 0x016c9ee2, 0x015ef0cb, 0x024e08bd, 0x017135b0, 0x02aea582, 0x00301a4f}}, Y: Field{[10]uint32{0x03b9a05e, 0x0217618c, 0x00a0462c, 0x022bbf83, 0x01f4f617, 0x032e3ed5, 0x006c601b, 0x01047817, 0x034b7627, 0x0036883e}}}, + {X: Field{[10]uint32{0x00fa0d9d, 0x02dba4cf, 0x0335ca91, 0x006a0d59, 0x01e63e58, 0x02862608, 0x03f9200c, 0x00140b45, 0x037372fd, 0x00314743}}, Y: Field{[10]uint32{0x02352655, 0x02b5308b, 0x03413b3b, 0x01f4f1be, 0x03a2797a, 0x013ae5e6, 0x03ff1345, 0x01fb74b3, 0x02b207ed, 0x00234439}}}, + {X: Field{[10]uint32{0x02c3290c, 0x005837ef, 0x0059dbe3, 0x023b674b, 0x03366600, 0x022d4ab4, 0x02f79f85, 0x0266b8b6, 0x00564d2d, 0x0005a046}}, Y: Field{[10]uint32{0x012e7460, 0x03ddee8a, 0x0202d1ad, 0x0128f021, 0x033e9cc8, 0x0148b342, 0x01dbac34, 0x01e123a0, 0x01a14561, 0x000afafc}}}, + {X: Field{[10]uint32{0x000afeb5, 0x0125d21f, 0x01a0920a, 0x02695e0d, 0x030b1599, 0x01952a9b, 0x00e16225, 0x021496cb, 0x0133e143, 0x001eba52}}, Y: Field{[10]uint32{0x019b95f5, 0x00bd3d6f, 0x0390195a, 0x02dbd10f, 0x01a13b87, 0x038ccc6f, 0x00282a51, 0x0191684e, 0x0237830a, 0x0024644b}}}, + {X: Field{[10]uint32{0x0019d4ac, 0x0166684c, 0x0036b179, 0x02c156cb, 0x02c27709, 0x00b46fc2, 0x014c5f6c, 0x01daac90, 0x0197d02b, 0x0039de4b}}, Y: Field{[10]uint32{0x013f2b52, 0x02e6383b, 0x02e8d16f, 0x00528a05, 0x01dd2746, 0x01755b30, 0x00c75a0d, 0x02c5e6e6, 0x02895fce, 0x0027d365}}}, + {X: Field{[10]uint32{0x0247bde1, 0x0278d34c, 0x004f769d, 0x001bba9b, 0x003d97d7, 0x02b1e514, 0x00ff64f4, 0x0358fc93, 0x01d4946f, 0x0000bfee}}, Y: Field{[10]uint32{0x0381014f, 0x0095edfa, 0x03a9ff32, 0x00c955db, 0x02cff188, 0x038d823a, 0x016907a6, 0x0054c4af, 0x00743488, 0x00019ac7}}}, + {X: Field{[10]uint32{0x00bb2fbe, 0x01722c7b, 0x00ea3c16, 0x02e84b80, 0x01aeb6f4, 0x012b9cd4, 0x012aafab, 0x03bac450, 0x0232f90c, 0x0011512e}}, Y: Field{[10]uint32{0x038f6736, 0x0221f2e7, 0x017b3948, 0x022e0d1e, 0x002bba53, 0x000b6eff, 0x039ede9b, 0x033ba2fe, 0x03b4c2a5, 0x0018bef5}}}, + {X: Field{[10]uint32{0x0118980f, 0x0278f99e, 0x0137a1b0, 0x039e2093, 0x025d981c, 0x02319ed7, 0x02b156dd, 0x03fe89d7, 0x01b925d9, 0x000942c0}}, Y: Field{[10]uint32{0x0209c481, 0x03ae074f, 0x000ff261, 0x0185010b, 0x03eb1851, 0x01d98967, 0x032bcbe6, 0x036a1b94, 0x024a32f0, 0x002e8764}}}, + {X: Field{[10]uint32{0x02beb4d2, 0x0387fb82, 0x030f5ecb, 0x004e4078, 0x0262e0b8, 0x00ba58bb, 0x00468073, 0x017f71cc, 0x02541f2a, 0x00273cc3}}, Y: Field{[10]uint32{0x01510723, 0x035528ed, 0x00741c6b, 0x03ad959f, 0x02848259, 0x02aa3fd8, 0x0201d14b, 0x02ddec65, 0x02cd1281, 0x001f2c91}}}, + {X: Field{[10]uint32{0x02285a2c, 0x005ec695, 0x01c03cd2, 0x03293c47, 0x01b5a90e, 0x0254213b, 0x013be124, 0x0287823e, 0x00b13c61, 0x003b727a}}, Y: Field{[10]uint32{0x021e1f3d, 0x03e67f98, 0x01fda5e9, 0x02168bf7, 0x01b0e8df, 0x02320198, 0x0143b1b5, 0x03eb1d3f, 0x012107e8, 0x0019b0bf}}}, + {X: Field{[10]uint32{0x01e2c66e, 0x020b1c3c, 0x036b6970, 0x000acf76, 0x02cae9d0, 0x009ee06e, 0x02a41649, 0x029260aa, 0x015f8388, 0x0037650a}}, Y: Field{[10]uint32{0x00d6706b, 0x03af0602, 0x00f4bfd3, 0x02c920b6, 0x033b08c2, 0x007eb20f, 0x00d9e8cb, 0x0307aa6f, 0x020cd409, 0x0020e301}}}, + {X: Field{[10]uint32{0x0285ab7e, 0x01d14d41, 0x0087692f, 0x037742b1, 0x0296e96d, 0x02ff1cd3, 0x000d3b35, 0x02f92397, 0x0204dfc0, 0x001f81a3}}, Y: Field{[10]uint32{0x02c70d0a, 0x02100793, 0x036462c8, 0x0021e620, 0x0369351e, 0x024fc52f, 0x00052e60, 0x00972341, 0x014690d2, 0x0037cb34}}}, + {X: Field{[10]uint32{0x009a5052, 0x010fce65, 0x0217a21f, 0x01cdf7b0, 0x00b7c2a0, 0x01b10e68, 0x02e659f7, 0x02b26c11, 0x03cfd10a, 0x001cea6f}}, Y: Field{[10]uint32{0x03be10dd, 0x01092a6c, 0x00ec24a1, 0x03da46a7, 0x03bf379d, 0x023e1b2f, 0x002062c0, 0x02c1481a, 0x01293ea7, 0x001cee45}}}, + {X: Field{[10]uint32{0x0008c55b, 0x0211fb35, 0x0205adaa, 0x012fda6f, 0x0055cc22, 0x0216026f, 0x0234678d, 0x031d539b, 0x03840c8c, 0x003bf77f}}, Y: Field{[10]uint32{0x02f188d5, 0x01b75b70, 0x013fc173, 0x0228ed9c, 0x008aac21, 0x03116d2b, 0x026ed7e0, 0x02aacbbf, 0x03418264, 0x00197763}}}, + {X: Field{[10]uint32{0x03d73f4b, 0x015a23af, 0x03585756, 0x016c5c69, 0x01dc264f, 0x010e1b76, 0x023d6dfa, 0x00e13634, 0x01857118, 0x0011aa51}}, Y: Field{[10]uint32{0x01aaf35c, 0x03004699, 0x02a6d256, 0x03a3a37c, 0x031e684e, 0x0239fd85, 0x03f16cb3, 0x03063d36, 0x037ea298, 0x000f796b}}}, + {X: Field{[10]uint32{0x0021cd3f, 0x03a91fce, 0x0193b910, 0x02326b5b, 0x0045dd0c, 0x038582a5, 0x02fa17bb, 0x03099752, 0x01b27ce3, 0x001a243b}}, Y: Field{[10]uint32{0x03cbd1ab, 0x008103dd, 0x03852dd2, 0x03abad9e, 0x037c24be, 0x02a200aa, 0x00810a7c, 0x01525336, 0x005b10ef, 0x00183d1f}}}, + {X: Field{[10]uint32{0x0205f5ae, 0x02d12d0a, 0x0288d952, 0x03087d55, 0x01e33e68, 0x01e89470, 0x02c4b328, 0x0221aa07, 0x02b6340b, 0x00023327}}, Y: Field{[10]uint32{0x007fb6eb, 0x022fc08c, 0x01c95507, 0x01c05432, 0x01f03238, 0x02f11d6e, 0x011981a3, 0x020a4224, 0x030d90e3, 0x0026c5da}}}, + {X: Field{[10]uint32{0x015b0475, 0x007f8a92, 0x00e0b0fd, 0x03809b25, 0x01227875, 0x025b3785, 0x0001ccae, 0x03782d60, 0x035ada48, 0x000ac18b}}, Y: Field{[10]uint32{0x031eab0d, 0x00d4e40b, 0x0280548b, 0x02523bfd, 0x02da9de9, 0x02fc5c9d, 0x0097bad4, 0x01c31420, 0x00683d51, 0x0014dfc7}}}, + {X: Field{[10]uint32{0x037240f9, 0x01ea2fae, 0x0008252d, 0x037c9fcc, 0x01cd358b, 0x0093a48c, 0x032ff7f2, 0x0354fd0c, 0x011a84b3, 0x0037556e}}, Y: Field{[10]uint32{0x012a5c94, 0x02064206, 0x0158bff6, 0x01ce8eb0, 0x01774d21, 0x037bbe5a, 0x03376094, 0x0194c3b5, 0x0208a40b, 0x00039bc6}}}, + {X: Field{[10]uint32{0x02c59c70, 0x032592bc, 0x01e7516f, 0x02035c54, 0x008986fd, 0x01e0bb8b, 0x000cdb1c, 0x02a5e51b, 0x03e040b1, 0x002b1449}}, Y: Field{[10]uint32{0x03ae5db9, 0x017a806d, 0x038e2476, 0x025e202b, 0x038afbb0, 0x01d9164f, 0x020a82e1, 0x0014e776, 0x0249323d, 0x00212788}}}, + {X: Field{[10]uint32{0x01311123, 0x0084b06d, 0x034bff72, 0x008c54c5, 0x039d1364, 0x038776b9, 0x004e9ce1, 0x033a68de, 0x02daf0b6, 0x0037cbcb}}, Y: Field{[10]uint32{0x006d46a5, 0x031d7dba, 0x027bedba, 0x01105880, 0x02fde6ab, 0x01991009, 0x02da64f4, 0x02f080c5, 0x038ebd78, 0x002e7663}}}, + {X: Field{[10]uint32{0x0373e5f9, 0x03e4f5e8, 0x0002773f, 0x03d0fec2, 0x0097bdc5, 0x00844d84, 0x0385e216, 0x0305d88e, 0x0387d630, 0x003f60ec}}, Y: Field{[10]uint32{0x036cd2ee, 0x019c2daa, 0x00837d3c, 0x02f0e10e, 0x01115805, 0x0303f772, 0x03503d40, 0x00d69675, 0x027d375f, 0x0026a58a}}}, + {X: Field{[10]uint32{0x02cac4df, 0x03ae384c, 0x00c9505f, 0x0079081b, 0x00d565ca, 0x028ffaaa, 0x02ad443b, 0x0322b22f, 0x03c1155e, 0x00363ef7}}, Y: Field{[10]uint32{0x011f73ac, 0x02697a9d, 0x03abc9cb, 0x03587e58, 0x027fb1fc, 0x03afdd90, 0x01258edf, 0x0272d1ce, 0x000fccb9, 0x003e514f}}}, + {X: Field{[10]uint32{0x03bf86d6, 0x00443037, 0x010ddc89, 0x01cae08d, 0x0285f008, 0x01aabcf5, 0x03093891, 0x03a3006c, 0x009a20a3, 0x0027f25d}}, Y: Field{[10]uint32{0x023e19df, 0x0129e661, 0x02379109, 0x02eb9d69, 0x0075c85c, 0x0023c3c6, 0x033bca70, 0x02b1655d, 0x01a76c92, 0x0028bd9e}}}, + {X: Field{[10]uint32{0x03476a3f, 0x032057cb, 0x00f62b58, 0x024b4dca, 0x0365b810, 0x038865ae, 0x02bcf252, 0x0073a6f6, 0x034671a9, 0x000a7838}}, Y: Field{[10]uint32{0x00d0c0e6, 0x02f5a635, 0x039d4174, 0x002aad0b, 0x011ce5ad, 0x0319ac98, 0x00a35fb9, 0x002b91e6, 0x0061b82e, 0x000bd103}}}, + {X: Field{[10]uint32{0x02e102d7, 0x01ad4642, 0x0278f873, 0x002ea1bb, 0x007fbee7, 0x0330f7ee, 0x03e6f929, 0x015683c9, 0x02153989, 0x003901a2}}, Y: Field{[10]uint32{0x03165086, 0x0279a623, 0x014e77d6, 0x010c1d1f, 0x0016b911, 0x012a68d4, 0x01999438, 0x0272dabb, 0x02ad550f, 0x0028fcbc}}}, + {X: Field{[10]uint32{0x026c9f2c, 0x01080a1c, 0x0109248a, 0x01934f55, 0x0010f163, 0x0132065e, 0x03156c8a, 0x0366262e, 0x0210bb1b, 0x00146d17}}, Y: Field{[10]uint32{0x03e141a2, 0x023256f8, 0x03f6bb47, 0x01452315, 0x008a1f1d, 0x00004330, 0x01ac4797, 0x03798ca0, 0x01d04225, 0x0038c1c6}}}, + {X: Field{[10]uint32{0x02a0b83e, 0x032fe96a, 0x005acf6f, 0x00bf5683, 0x0164dc49, 0x01b18ecf, 0x02ec2e60, 0x02dad7a4, 0x01297b8a, 0x00053357}}, Y: Field{[10]uint32{0x03666805, 0x00af5df8, 0x033279b7, 0x01c0a91a, 0x015be192, 0x02c71f63, 0x01ad1faf, 0x032198d2, 0x03d77cdc, 0x0016fcc1}}}, + {X: Field{[10]uint32{0x022c4da6, 0x03376d74, 0x0168f8c3, 0x037d067b, 0x0045e9f2, 0x027060a2, 0x02254cae, 0x03451b0c, 0x031149d6, 0x00296a29}}, Y: Field{[10]uint32{0x00bf6c2e, 0x002eeb4f, 0x012d549c, 0x0205e0cf, 0x00b003f4, 0x0158e6fc, 0x00ae6933, 0x034d16bd, 0x00877bc3, 0x0027d1f6}}}, + {X: Field{[10]uint32{0x039372cb, 0x01303107, 0x038f999a, 0x0394b31d, 0x01bda494, 0x00519893, 0x01b13ddd, 0x0108cb5d, 0x00d24baa, 0x000d64ca}}, Y: Field{[10]uint32{0x001af6d8, 0x0206b3c9, 0x03050a78, 0x01f5923d, 0x03b6695d, 0x0323da02, 0x0084afe0, 0x00e67a64, 0x02b571df, 0x0034c555}}}, + {X: Field{[10]uint32{0x0273e7fd, 0x03e56f79, 0x005e891a, 0x0304349b, 0x00c8fdac, 0x02407b6c, 0x0268a12d, 0x0168b05c, 0x01ca4f2a, 0x00327ae0}}, Y: Field{[10]uint32{0x008adb66, 0x034a5092, 0x008df76e, 0x0394d558, 0x035acb73, 0x026fef5a, 0x01ae19cd, 0x03fa69c4, 0x012fc974, 0x001b5294}}}, + {X: Field{[10]uint32{0x02ca8e2c, 0x037979b0, 0x01f386cc, 0x00c093d0, 0x0248e557, 0x02d840b8, 0x00c9f90e, 0x02cc22b1, 0x01f816f3, 0x0038998c}}, Y: Field{[10]uint32{0x039306bd, 0x011857fa, 0x0224858a, 0x00502f56, 0x0396cfb8, 0x00146094, 0x01e2f102, 0x03b34059, 0x02a8823a, 0x0005b82c}}}, + {X: Field{[10]uint32{0x019110ba, 0x020d57fe, 0x029658db, 0x03e68ec2, 0x02677e5a, 0x01a711cc, 0x0007b242, 0x039f941e, 0x02f365c0, 0x003ddba6}}, Y: Field{[10]uint32{0x012a9407, 0x032c04ef, 0x021028a0, 0x018a5ab6, 0x019d174c, 0x0217e759, 0x02f25423, 0x00593af6, 0x0039d26f, 0x002032fd}}}, + {X: Field{[10]uint32{0x012c5dd9, 0x03d89c21, 0x03421e65, 0x01521079, 0x00bc333d, 0x02a23f38, 0x01d6ab69, 0x00520ca5, 0x005baf89, 0x00373205}}, Y: Field{[10]uint32{0x031e2a19, 0x031866bc, 0x01480cca, 0x03360362, 0x00296155, 0x000d8eec, 0x00d6cd16, 0x039ea6d0, 0x0370a620, 0x0033b6cd}}}, + {X: Field{[10]uint32{0x0203e4fd, 0x00feb4f1, 0x03847ed3, 0x010107b6, 0x007660bc, 0x02ba4c06, 0x02a199ec, 0x01343e95, 0x013a6a1c, 0x001d9178}}, Y: Field{[10]uint32{0x0291e713, 0x01308b2f, 0x002ee186, 0x014ec8b1, 0x02bcfc53, 0x036a2434, 0x01eccbb5, 0x03975449, 0x011b7990, 0x001f23a9}}}, + {X: Field{[10]uint32{0x022f3f25, 0x00acc627, 0x00fb4422, 0x01751788, 0x01465822, 0x00706daf, 0x027210d5, 0x02f3bebf, 0x006ed74c, 0x002e89a2}}, Y: Field{[10]uint32{0x02b3409d, 0x01436e28, 0x02893bdf, 0x009dcd67, 0x01e0b896, 0x02ee8c9b, 0x025fa64a, 0x02b7ba79, 0x01b223dd, 0x003f6217}}}, + {X: Field{[10]uint32{0x01050fe1, 0x03486946, 0x02c92299, 0x023579e4, 0x000fc657, 0x029497a0, 0x01bda654, 0x016c7640, 0x00e13100, 0x001a2d40}}, Y: Field{[10]uint32{0x0312f96b, 0x001757da, 0x0202207e, 0x009e0f80, 0x008df9b1, 0x01f6951a, 0x01ac8e87, 0x012a53cf, 0x017ab354, 0x001c7bdf}}}, + {X: Field{[10]uint32{0x027996ff, 0x03a9d6b6, 0x01064b84, 0x03265029, 0x035b19f7, 0x00b1be81, 0x03f851f1, 0x02a0f09f, 0x03e2613f, 0x000b3329}}, Y: Field{[10]uint32{0x03d7707f, 0x02b83cc9, 0x005703c6, 0x023c2fb5, 0x03cf37af, 0x03164e42, 0x01b2d2f0, 0x006b4343, 0x022222dd, 0x0016adc2}}}, + {X: Field{[10]uint32{0x03179f14, 0x03d369bd, 0x033c1827, 0x03013573, 0x00383ad9, 0x032db729, 0x01af7183, 0x0291686d, 0x012d6a56, 0x001b5e5f}}, Y: Field{[10]uint32{0x000edf3f, 0x0189547a, 0x02ea67b1, 0x0078568e, 0x03b80e54, 0x035bd6a2, 0x0284bee7, 0x03463667, 0x00e5d203, 0x0002ab8d}}}, + {X: Field{[10]uint32{0x018ee327, 0x001665ba, 0x027b5116, 0x0160157d, 0x009a565a, 0x025a94f9, 0x013751ad, 0x01dac655, 0x03c437be, 0x002a9a65}}, Y: Field{[10]uint32{0x00684835, 0x0030cf03, 0x034cb3cc, 0x01de87d3, 0x036532e2, 0x038bd7c6, 0x018a15b2, 0x0103825a, 0x00219cdb, 0x00180d29}}}, + {X: Field{[10]uint32{0x022a0f48, 0x00316fae, 0x02dead01, 0x02137006, 0x0201e624, 0x02c3e25f, 0x005d53a7, 0x0075c28d, 0x03bffb8e, 0x0015b103}}, Y: Field{[10]uint32{0x02f0bd01, 0x032daa91, 0x01f4c458, 0x01e1f8a6, 0x01676a4a, 0x01cf632a, 0x03a0e091, 0x024a409e, 0x0389078b, 0x003a7419}}}, + {X: Field{[10]uint32{0x03918d89, 0x0240f545, 0x010731d2, 0x00dca94d, 0x01b6e1e2, 0x02d4b0f7, 0x0262be08, 0x03b5ef70, 0x02a83963, 0x0036dbfd}}, Y: Field{[10]uint32{0x01951769, 0x02dc461f, 0x03bdc162, 0x019435d5, 0x030e248d, 0x00513283, 0x02f6b18c, 0x03f512d0, 0x02fa0f30, 0x00290044}}}, + {X: Field{[10]uint32{0x03402c6d, 0x03286018, 0x01de4151, 0x01cdd539, 0x03dcdd11, 0x02950c04, 0x00e730d4, 0x018f88ce, 0x0301a46f, 0x00237d55}}, Y: Field{[10]uint32{0x03a1c3df, 0x0344b755, 0x02a93b9d, 0x0196f227, 0x02b3e696, 0x0122efd8, 0x016ddafb, 0x00ffc04e, 0x009a64b6, 0x001933e7}}}, + {X: Field{[10]uint32{0x030588a1, 0x03d22806, 0x00af37be, 0x033b7896, 0x0166485c, 0x01775791, 0x03ae460e, 0x023d5d01, 0x002c5101, 0x0027442f}}, Y: Field{[10]uint32{0x00922c04, 0x0324e261, 0x02ac2fcb, 0x00baba83, 0x01726b30, 0x000f7fae, 0x01ebe44e, 0x0385c5fb, 0x0008b2a4, 0x000e3a8f}}}, + {X: Field{[10]uint32{0x03640367, 0x02e601cd, 0x03e662e4, 0x01ec3f39, 0x02056025, 0x0080581b, 0x027a7068, 0x029e1cb2, 0x0075cc07, 0x0004eef2}}, Y: Field{[10]uint32{0x00c2c708, 0x011d2c70, 0x007697fe, 0x02bf5bd5, 0x02d2ea3d, 0x02abc6c7, 0x00a19acb, 0x00a99b63, 0x031a47c8, 0x002d3365}}}, + {X: Field{[10]uint32{0x02a9c3e1, 0x03273257, 0x02b1e24e, 0x028c4f24, 0x011857d9, 0x00369b72, 0x0147630d, 0x02c5d372, 0x0037f617, 0x0023c9b7}}, Y: Field{[10]uint32{0x033f15ef, 0x03ddb839, 0x0375bd5c, 0x03f0554c, 0x00f887f2, 0x01646b11, 0x00238776, 0x02fc9d39, 0x03031d96, 0x000e1228}}}, + {X: Field{[10]uint32{0x007b5f21, 0x0295e693, 0x01041ad3, 0x026c4419, 0x03a23e0d, 0x01836f84, 0x015236f6, 0x0245bd79, 0x003df290, 0x000b8795}}, Y: Field{[10]uint32{0x01473846, 0x002b4bed, 0x02d28ff1, 0x020ca3f8, 0x03947bc0, 0x00610d2d, 0x00cd9f32, 0x00176b04, 0x0127626e, 0x00221691}}}, + {X: Field{[10]uint32{0x023f3109, 0x02020b3b, 0x0385a123, 0x0143a31e, 0x018bed8f, 0x00fada6d, 0x0076936e, 0x027aa2ee, 0x00a3e050, 0x00320f0b}}, Y: Field{[10]uint32{0x029cd5ed, 0x01f0cc4c, 0x00c0e3b0, 0x01d54c07, 0x0074b75e, 0x00276955, 0x030da10d, 0x02378ac2, 0x02a9bc80, 0x000ae580}}}, + {X: Field{[10]uint32{0x03d29607, 0x0347eaf4, 0x02700578, 0x00724181, 0x01afee8b, 0x038e14c4, 0x024111ae, 0x005394c9, 0x03b4e2c1, 0x00231e40}}, Y: Field{[10]uint32{0x01025731, 0x011cddbc, 0x01b2528d, 0x000620a6, 0x00b488c4, 0x00a8d0fa, 0x02ebea9a, 0x03e53407, 0x02d1964d, 0x003740b6}}}, + {X: Field{[10]uint32{0x02569cc0, 0x029a0769, 0x009bda38, 0x02199532, 0x01b51857, 0x00707ae1, 0x00adfc6c, 0x01d732cc, 0x0054dd75, 0x0012098f}}, Y: Field{[10]uint32{0x0213167f, 0x037ee204, 0x03955dda, 0x017d572d, 0x02e223ac, 0x00964dba, 0x0198e49a, 0x02d4a03b, 0x03bddacd, 0x0039bc41}}}, + {X: Field{[10]uint32{0x02f0d2d3, 0x02c95185, 0x0227495f, 0x009f153b, 0x00accb71, 0x00f35766, 0x018644c6, 0x007d61e4, 0x010aea7d, 0x001a9f01}}, Y: Field{[10]uint32{0x0021e232, 0x01c95bb6, 0x0154628d, 0x020ed2ec, 0x02f80f73, 0x00226c32, 0x03f733dc, 0x0191b8d2, 0x026127a2, 0x003eb464}}}, + {X: Field{[10]uint32{0x035c3ea8, 0x0168661f, 0x01a3bf10, 0x02683331, 0x030ece87, 0x00c72c27, 0x01147dcc, 0x03080b7e, 0x013f62fb, 0x00387c29}}, Y: Field{[10]uint32{0x01706277, 0x02483c79, 0x01d8dcfe, 0x024bf8b9, 0x003968f6, 0x0100dde0, 0x03148489, 0x03a8c030, 0x010f0b0e, 0x000e4c28}}}, + {X: Field{[10]uint32{0x03182b7b, 0x00999d74, 0x0213b485, 0x0029b539, 0x02da9b6a, 0x02293219, 0x026efcae, 0x03296ff5, 0x0113cb0f, 0x002f03ec}}, Y: Field{[10]uint32{0x03090f31, 0x02871b2f, 0x0060131c, 0x01581d17, 0x0037892c, 0x00fb2c52, 0x0315f691, 0x03baef49, 0x025e6993, 0x0038479c}}}, + {X: Field{[10]uint32{0x0342f908, 0x02c0ca72, 0x034fe266, 0x0285d284, 0x030ee7e6, 0x027ab9ed, 0x03f9ebf8, 0x023d2192, 0x00f49c43, 0x0007f968}}, Y: Field{[10]uint32{0x0275f66c, 0x03584271, 0x0379b35a, 0x012b3a6d, 0x02069451, 0x03e9ed65, 0x033878bc, 0x0190724a, 0x01cef912, 0x0036e025}}}, + {X: Field{[10]uint32{0x02524cd4, 0x010c82aa, 0x00f6de43, 0x020cfcf2, 0x00ade6ea, 0x02afe94f, 0x02e61aae, 0x01c00be9, 0x01b49016, 0x001778ff}}, Y: Field{[10]uint32{0x007e08f0, 0x01615e45, 0x00535dc1, 0x028f57a6, 0x016d7e9c, 0x02346b0a, 0x004a1dd8, 0x035b3acd, 0x0288862a, 0x002d72f7}}}, + {X: Field{[10]uint32{0x023da54f, 0x02ff2f00, 0x020738ad, 0x00b78865, 0x02b2964f, 0x02529916, 0x02b0be62, 0x037f3d7b, 0x0193a913, 0x0024ec1a}}, Y: Field{[10]uint32{0x012ae0b8, 0x01285352, 0x0107c4d1, 0x03607a2d, 0x029c151a, 0x0328f1f8, 0x007330ef, 0x02dd1106, 0x002f856c, 0x001e0d9e}}}, + {X: Field{[10]uint32{0x02762f0c, 0x02de1823, 0x01851886, 0x026f8e05, 0x009c3336, 0x01ac1578, 0x005a044f, 0x001d079a, 0x000d27d9, 0x0001c15d}}, Y: Field{[10]uint32{0x033d956e, 0x01772645, 0x03c55d3f, 0x00c87eec, 0x00b2142b, 0x00a7c4ab, 0x013193b5, 0x011b1a7a, 0x03bb738d, 0x00312963}}}, + {X: Field{[10]uint32{0x0193e296, 0x00687847, 0x0086434a, 0x019d8410, 0x02e5b787, 0x0254c3c2, 0x00a20e19, 0x015499cd, 0x0000fc48, 0x001d8668}}, Y: Field{[10]uint32{0x006ebed6, 0x02fa1b41, 0x032014f8, 0x01d5dc80, 0x01ab26f6, 0x028b3ad6, 0x03a0afe0, 0x011e73db, 0x01e1182f, 0x001fcc03}}}, + {X: Field{[10]uint32{0x019ff2fe, 0x0150a296, 0x0060dbec, 0x02d8e139, 0x01cc0d54, 0x00a0504f, 0x01346fcd, 0x014805b3, 0x01a8ddbb, 0x003f883d}}, Y: Field{[10]uint32{0x002d879c, 0x02a4ae49, 0x02e0bae7, 0x01ead3b2, 0x01338cf4, 0x02655ec3, 0x02be551f, 0x0121c6bf, 0x02e6e260, 0x0016d222}}}, + {X: Field{[10]uint32{0x02ad11e2, 0x03878fd0, 0x00b84422, 0x00862ae2, 0x01707681, 0x00f1d47e, 0x0129e077, 0x014b3cb7, 0x0327ba7e, 0x002656e5}}, Y: Field{[10]uint32{0x037fd26e, 0x03d71b4b, 0x0391f42a, 0x0217e416, 0x0049c8d5, 0x00a6f62e, 0x02c5e5f5, 0x0051a313, 0x01c97ee4, 0x0030f277}}}, + {X: Field{[10]uint32{0x002b3136, 0x01f0909c, 0x02a16e26, 0x02836130, 0x01636d26, 0x01458648, 0x02913445, 0x0135f1e7, 0x024d2ca9, 0x0032d3cb}}, Y: Field{[10]uint32{0x003ddb9b, 0x021e77a0, 0x02e49bbb, 0x01c5e9a3, 0x031b9b2f, 0x03df8ae2, 0x000df480, 0x01039b3c, 0x02ee3949, 0x000857ad}}}, + {X: Field{[10]uint32{0x01fce397, 0x00b095ae, 0x00e6fc72, 0x02757869, 0x034572b6, 0x019a3ad9, 0x00b10707, 0x024512eb, 0x025634b4, 0x0032828a}}, Y: Field{[10]uint32{0x03f4841b, 0x023ae0b4, 0x01ebfe95, 0x029c2f6d, 0x036e2562, 0x01ab69e9, 0x0098c855, 0x00beee94, 0x00c974ab, 0x002481e7}}}, + {X: Field{[10]uint32{0x03af7c7b, 0x01ae48b8, 0x00246acd, 0x02259ed3, 0x02bfadde, 0x013bc58e, 0x02f27a02, 0x0302bf5c, 0x032dc6c0, 0x003ee08c}}, Y: Field{[10]uint32{0x0134c7ee, 0x0315032a, 0x030c660d, 0x02646733, 0x032b90d3, 0x038b12c6, 0x00beaa52, 0x02da40ce, 0x0119f21c, 0x00069a5c}}}, + {X: Field{[10]uint32{0x00513dd2, 0x03b10a97, 0x006736af, 0x02818f6d, 0x02d07550, 0x008062f5, 0x02184a4e, 0x0237bc83, 0x0205d925, 0x003415bb}}, Y: Field{[10]uint32{0x0015bffb, 0x0366632f, 0x0031c276, 0x03135a37, 0x0389ab0f, 0x0006b5c9, 0x027cfb62, 0x038d599f, 0x01d0d222, 0x0002bcb0}}}, + {X: Field{[10]uint32{0x02526f12, 0x028494d0, 0x007267ae, 0x004b360a, 0x01c63257, 0x02dde18d, 0x0046c594, 0x01098b10, 0x0222c658, 0x000feb6c}}, Y: Field{[10]uint32{0x0199ae96, 0x019adfb0, 0x02717586, 0x0387aae1, 0x03d181e0, 0x02875d2d, 0x00a7e8bf, 0x00474e13, 0x0007fa68, 0x00369723}}}, + {X: Field{[10]uint32{0x019c4b61, 0x01098ec7, 0x029248ab, 0x023bed9f, 0x03214b81, 0x0274f914, 0x01915dd3, 0x03943977, 0x0169e222, 0x00349eb2}}, Y: Field{[10]uint32{0x033a1c7f, 0x02529db2, 0x03f6f9b4, 0x016b6079, 0x0209a7c5, 0x02100c8d, 0x02709a32, 0x034c15b9, 0x0294baea, 0x0031215d}}}, + {X: Field{[10]uint32{0x02c565d4, 0x0103c05c, 0x02cbcd93, 0x00064686, 0x0399cd3a, 0x03ff5a7b, 0x03a4324b, 0x006b9a97, 0x01b48b98, 0x001048de}}, Y: Field{[10]uint32{0x00fa280e, 0x034fa1ff, 0x023abac9, 0x00ec9154, 0x03c75505, 0x02f9aad5, 0x02523e7e, 0x0393c0b2, 0x02c9c7db, 0x003c900d}}}, + {X: Field{[10]uint32{0x039336f1, 0x037ea8fd, 0x003eace9, 0x027ec849, 0x01bef790, 0x018f4029, 0x028cc3b6, 0x01304ee6, 0x02aa9937, 0x003608d3}}, Y: Field{[10]uint32{0x02755c27, 0x03e412db, 0x00e5cb1f, 0x03e47720, 0x001845d8, 0x00a4aeaf, 0x03c15930, 0x0197d9a8, 0x028ec4b4, 0x0002e32f}}}, + {X: Field{[10]uint32{0x01189009, 0x02ebca97, 0x03bbe47f, 0x00e8f61d, 0x00427d32, 0x03634f00, 0x000ea349, 0x03fe72eb, 0x033568c5, 0x00109be2}}, Y: Field{[10]uint32{0x0100586d, 0x010e672f, 0x03bfd7dc, 0x01fde214, 0x019931f5, 0x01f2e0ae, 0x03a1ba72, 0x00f1ee71, 0x013dce02, 0x0013808a}}}, + {X: Field{[10]uint32{0x0097dfa5, 0x009d8291, 0x036ccfe7, 0x01bb1e03, 0x01871757, 0x0272971e, 0x012a7fdc, 0x017cb090, 0x02f902ee, 0x003c71c1}}, Y: Field{[10]uint32{0x03b7e740, 0x0173eb0a, 0x004d59f8, 0x02575ae7, 0x009ef758, 0x006826e1, 0x01787005, 0x01570ece, 0x01a1727f, 0x00317868}}}, + {X: Field{[10]uint32{0x02c2c679, 0x03c61a4d, 0x00b67608, 0x00799d66, 0x03598200, 0x0094d5ad, 0x00d66825, 0x01661e5a, 0x007ecc1d, 0x002138b8}}, Y: Field{[10]uint32{0x0028555a, 0x01ce19b3, 0x03bb6281, 0x03dbd6d0, 0x012903f4, 0x01ff3ae9, 0x0275a8ab, 0x03b3732f, 0x03438ab5, 0x00106ac4}}}, + {X: Field{[10]uint32{0x02ad2b54, 0x0226d01d, 0x020689c6, 0x002fbc3d, 0x023d599b, 0x028633da, 0x02bb6993, 0x01608d12, 0x02c2fe53, 0x001e4d7b}}, Y: Field{[10]uint32{0x03371910, 0x033ef554, 0x01b406c4, 0x02b78f5d, 0x01b77480, 0x0393d721, 0x00ed574f, 0x022186db, 0x016aab97, 0x00338bf2}}}, + {X: Field{[10]uint32{0x00dbd9a0, 0x029a8c2c, 0x0383927a, 0x02250878, 0x013e8c26, 0x0368e802, 0x01abbef9, 0x01b55ade, 0x00a8319f, 0x003550a9}}, Y: Field{[10]uint32{0x038173e1, 0x01e6bb1e, 0x037a4f19, 0x00326161, 0x026badb7, 0x00654681, 0x019f3e9c, 0x0217aa3e, 0x016265d2, 0x00144128}}}, + {X: Field{[10]uint32{0x00ece2be, 0x009f6691, 0x0232fd3c, 0x02e49bec, 0x00041011, 0x000e049b, 0x02f0157a, 0x02624012, 0x02194228, 0x002f1a49}}, Y: Field{[10]uint32{0x0252f3bc, 0x00da71ff, 0x034f9847, 0x00bb6c97, 0x0311e202, 0x032e3bdd, 0x032e8543, 0x0298c24d, 0x00c147e2, 0x00238bc4}}}, + {X: Field{[10]uint32{0x018d8d03, 0x0086fd74, 0x03e51f45, 0x024257d0, 0x00ae079a, 0x0122ad94, 0x02cdd80b, 0x0230237a, 0x0336bb17, 0x003af86d}}, Y: Field{[10]uint32{0x01db7514, 0x0028bab3, 0x02bbb0cd, 0x0187f23b, 0x03782f20, 0x00aa049a, 0x0378ef4b, 0x01437917, 0x02590b14, 0x002b6071}}}, + {X: Field{[10]uint32{0x01e2774c, 0x014b7b2e, 0x03e7bde1, 0x012a4e0a, 0x02666d09, 0x03e3c158, 0x01f887ad, 0x0214f93f, 0x010849e1, 0x003989ae}}, Y: Field{[10]uint32{0x034834ea, 0x004ffe43, 0x027c30f5, 0x010b1658, 0x002dca73, 0x033ee1d6, 0x02ab4062, 0x00a89c32, 0x01daa419, 0x002433d5}}}, + {X: Field{[10]uint32{0x00381e67, 0x021ea739, 0x000b61a9, 0x0072f1eb, 0x000d8f57, 0x0291453c, 0x013b8b5b, 0x021e488c, 0x0057ba04, 0x003ee9e8}}, Y: Field{[10]uint32{0x029ec44a, 0x03b9ebb5, 0x000f718c, 0x0243b94c, 0x037cea5b, 0x016295fa, 0x005133f9, 0x014eeafc, 0x03fc1426, 0x001f4abd}}}, + {X: Field{[10]uint32{0x00c35a54, 0x02f9a265, 0x039ea1e3, 0x01691595, 0x03023973, 0x01c0cf99, 0x02e5bdb5, 0x01460568, 0x03955b5d, 0x00051336}}, Y: Field{[10]uint32{0x0253f1e6, 0x021e9dd8, 0x02a83919, 0x023e28ba, 0x03ed0a10, 0x0204d6d2, 0x0150d2b0, 0x03f16600, 0x0389e896, 0x0039805b}}}, + {X: Field{[10]uint32{0x003c0a24, 0x009787c6, 0x01eb681c, 0x023c099e, 0x03ad28cd, 0x02566767, 0x034a2d1a, 0x006d7b35, 0x026ee7ab, 0x00014e37}}, Y: Field{[10]uint32{0x00121004, 0x021012c5, 0x009601de, 0x01cc84f4, 0x012482b9, 0x016ce281, 0x01bac87d, 0x00464d6f, 0x03477961, 0x000db029}}}, + {X: Field{[10]uint32{0x03c03794, 0x001856ba, 0x02f2e9d1, 0x029c152f, 0x007876eb, 0x018edd5f, 0x00a38062, 0x01cfb883, 0x030fd28f, 0x001da453}}, Y: Field{[10]uint32{0x03a12642, 0x00c1a00c, 0x0008ec39, 0x014be7e2, 0x00593307, 0x0189b18b, 0x03557861, 0x0156fc88, 0x01cae168, 0x001b7893}}}, + {X: Field{[10]uint32{0x0234e4a7, 0x00caeaa7, 0x000af27e, 0x02eea960, 0x0186bee7, 0x03244bca, 0x015f7f96, 0x03df6bd6, 0x026cf675, 0x001a6457}}, Y: Field{[10]uint32{0x039513c9, 0x00b3c88a, 0x00d56df7, 0x006ddd9d, 0x03139bc3, 0x0374b68e, 0x0353c918, 0x026155de, 0x03c02f10, 0x0018253e}}}, + {X: Field{[10]uint32{0x00ce3015, 0x02ea11c6, 0x03e5d859, 0x00d790a1, 0x022c37eb, 0x02e4460b, 0x0142dcfd, 0x0353f6fa, 0x020c900b, 0x0013b9b0}}, Y: Field{[10]uint32{0x0062cd64, 0x03543cc8, 0x00f7590e, 0x0319311f, 0x0142e2a9, 0x030a4f4f, 0x0338e668, 0x0186312d, 0x0369863d, 0x00212b25}}}, + {X: Field{[10]uint32{0x00a0fa61, 0x01c5e5a2, 0x02c6ad22, 0x00442be7, 0x01aa5982, 0x01323160, 0x00e11dca, 0x03e28e3b, 0x001af57b, 0x0029a04f}}, Y: Field{[10]uint32{0x038edca4, 0x00ba0256, 0x000e1d18, 0x026f7168, 0x01d415c9, 0x0263ecbc, 0x03e2335e, 0x0258c56d, 0x034df4e2, 0x00190809}}}, + {X: Field{[10]uint32{0x010fce84, 0x03f9aadc, 0x03d6c0fd, 0x01ddbb94, 0x0269d910, 0x01d76d27, 0x01fc7432, 0x00a25c93, 0x03b7107b, 0x00108400}}, Y: Field{[10]uint32{0x02f9427f, 0x023ccf1d, 0x0002ac21, 0x021ceaa0, 0x020a9320, 0x022f3fa9, 0x01cb1498, 0x010e570c, 0x01697b92, 0x0032e555}}}, + {X: Field{[10]uint32{0x00c8c522, 0x002f7192, 0x02df8fc6, 0x02616d51, 0x015e1252, 0x02b3d7c9, 0x009d362e, 0x0313f100, 0x01e10cb8, 0x000272c6}}, Y: Field{[10]uint32{0x03d70d12, 0x03a253b1, 0x036231b7, 0x0382416f, 0x028fd286, 0x035f3fe1, 0x0220e70e, 0x039a2d8f, 0x01d32c6e, 0x00089c05}}}, + {X: Field{[10]uint32{0x03b953c2, 0x00d8d8a2, 0x03704362, 0x012dd78c, 0x03c4a7ac, 0x038b3832, 0x03412d64, 0x01623ce3, 0x01968193, 0x0031d04d}}, Y: Field{[10]uint32{0x0108aa6b, 0x01d7bd2a, 0x008019ae, 0x03c949de, 0x015e1d70, 0x03b05ace, 0x02dd4c90, 0x03135b48, 0x03a01b7c, 0x001efb9f}}}, + {X: Field{[10]uint32{0x01df22cc, 0x00b99d98, 0x02cec9dc, 0x02603a1b, 0x00c2f8e3, 0x02a5f319, 0x03ac1ea8, 0x01249ba3, 0x0205321f, 0x000aa3a2}}, Y: Field{[10]uint32{0x001fae42, 0x007ef6e6, 0x037809c8, 0x001febfd, 0x0364f0c0, 0x0034fe04, 0x0360c21c, 0x0372aab2, 0x01074e4f, 0x0018ee19}}}, + {X: Field{[10]uint32{0x0097a14d, 0x008a4fb5, 0x02127355, 0x031f1bd9, 0x025af1d8, 0x02a38b72, 0x02ab014e, 0x00d65122, 0x02607d40, 0x003cfbcb}}, Y: Field{[10]uint32{0x022cccc9, 0x01f0c758, 0x03ca9c63, 0x012fd0f6, 0x019e9ce4, 0x0275e305, 0x01d1d964, 0x027d12f1, 0x0334214b, 0x0037f354}}}, + {X: Field{[10]uint32{0x0057ead9, 0x0100a012, 0x0365a80e, 0x0092effa, 0x03a93964, 0x02c759c4, 0x0111b361, 0x00ce9744, 0x01c8169c, 0x001b5710}}, Y: Field{[10]uint32{0x005e84c8, 0x031522a9, 0x02a4a6a0, 0x00829486, 0x023d6742, 0x003d66f7, 0x0291d370, 0x02f0a89e, 0x00c49f01, 0x001307dd}}}, + {X: Field{[10]uint32{0x02fff85c, 0x031c7d12, 0x03c73488, 0x00891f81, 0x01608223, 0x013f51e3, 0x01982ce3, 0x021ac0b1, 0x0261c6a9, 0x0017604a}}, Y: Field{[10]uint32{0x03a960b8, 0x036894ff, 0x001fdcc8, 0x005e2fb5, 0x00680b15, 0x03248d21, 0x0349e164, 0x023f1095, 0x037b1601, 0x000dc20f}}}, + {X: Field{[10]uint32{0x0373093e, 0x02aa11df, 0x027d5dc6, 0x029827be, 0x01720177, 0x00a44615, 0x03a97108, 0x03cd1f0e, 0x02ecb82f, 0x00380565}}, Y: Field{[10]uint32{0x005b3bdd, 0x01faceed, 0x0177e554, 0x03061dd9, 0x03a17aca, 0x02963929, 0x00da5d06, 0x0212e74e, 0x00328498, 0x00299d32}}}, + {X: Field{[10]uint32{0x01980f55, 0x01100b02, 0x00d0b834, 0x0183bdac, 0x00ad52b9, 0x0373fdfc, 0x032fcaea, 0x03fcb9ec, 0x01000313, 0x0019e96a}}, Y: Field{[10]uint32{0x000a4a02, 0x01c0f24f, 0x02a03f41, 0x022bae2d, 0x009fdf92, 0x01f10783, 0x00075753, 0x022197ae, 0x01db5e8e, 0x0039dfbf}}}, + {X: Field{[10]uint32{0x0066b277, 0x0035f0d9, 0x01c217df, 0x02cd5ca0, 0x0353d77d, 0x03798960, 0x01c16477, 0x002b60a0, 0x039c2e2d, 0x000ae5a1}}, Y: Field{[10]uint32{0x00b62b25, 0x02f211a0, 0x030743cb, 0x0019e1a9, 0x027e0dae, 0x012a7f9f, 0x032408f6, 0x030caf31, 0x007343ba, 0x0037574d}}}, + {X: Field{[10]uint32{0x010367e9, 0x038b670c, 0x02bad825, 0x012fedc9, 0x03639b05, 0x00f8f848, 0x03137aea, 0x01235cb7, 0x038df087, 0x002ae50d}}, Y: Field{[10]uint32{0x03a10f03, 0x03740610, 0x011c99e3, 0x027fcb7c, 0x017f9d76, 0x01e376bd, 0x0331865c, 0x01f446a0, 0x02244003, 0x0015e173}}}, + {X: Field{[10]uint32{0x03e7439f, 0x02aaec10, 0x00985fa3, 0x036e1ef9, 0x012f3fd4, 0x028edb23, 0x013def6c, 0x03f78e32, 0x01560fd6, 0x001c1e09}}, Y: Field{[10]uint32{0x038ebec7, 0x02cfee05, 0x036af8f9, 0x03603e88, 0x0151894b, 0x03abd4d4, 0x01274b48, 0x01408331, 0x0365ecf1, 0x001e44ef}}}, + {X: Field{[10]uint32{0x03ca3942, 0x028062dd, 0x01eb3e71, 0x0203bf3b, 0x036b4d5e, 0x000928fd, 0x038c72c1, 0x03541ecc, 0x0070138b, 0x000c0974}}, Y: Field{[10]uint32{0x02b470ae, 0x03759a43, 0x03096f83, 0x02558e96, 0x038d5032, 0x00a93b94, 0x00172b5f, 0x03fe56a5, 0x020e175e, 0x000ea29a}}}, + {X: Field{[10]uint32{0x039ab0b6, 0x028f4602, 0x03ac9901, 0x02864e25, 0x02576081, 0x02a34079, 0x0069e7b2, 0x01eaee50, 0x02d065e9, 0x000ff8dc}}, Y: Field{[10]uint32{0x00842e5a, 0x00082895, 0x00c2d4c1, 0x014b3898, 0x00824035, 0x0359ed69, 0x03315e41, 0x037300dd, 0x02923154, 0x000bbf3b}}}, + {X: Field{[10]uint32{0x02f55636, 0x03968c0a, 0x001640bc, 0x03836a04, 0x03c3c373, 0x0301af5f, 0x02be8f9c, 0x00cfba5f, 0x00113a91, 0x000da31c}}, Y: Field{[10]uint32{0x006162a8, 0x03e1ad34, 0x024a135b, 0x03969bea, 0x02eb7d70, 0x0305a5c4, 0x028b942b, 0x02a385bc, 0x00fa4870, 0x00086f50}}}, + {X: Field{[10]uint32{0x00d96810, 0x03ab253b, 0x0100387e, 0x01a3953f, 0x0357682f, 0x02b5b5c4, 0x0040f230, 0x01793879, 0x03d8beb4, 0x001f7e3f}}, Y: Field{[10]uint32{0x002ed0df, 0x01d99f66, 0x013c9ec0, 0x0034281f, 0x03dc5555, 0x0131fff9, 0x0057d789, 0x016a6512, 0x00f9908e, 0x000f6793}}}, + {X: Field{[10]uint32{0x036f23d4, 0x036fdf42, 0x038bbdd2, 0x01c9413e, 0x02882691, 0x026c449d, 0x02162624, 0x031fb9f0, 0x0139eb49, 0x0032dab6}}, Y: Field{[10]uint32{0x0298346d, 0x000063ba, 0x01cb345e, 0x019785e2, 0x005480ca, 0x027e399a, 0x01319c45, 0x01cd9f78, 0x00db18f2, 0x003b2181}}}, + {X: Field{[10]uint32{0x00f4265a, 0x0263ca1c, 0x0053d390, 0x010b9a13, 0x01d8a1e0, 0x02766c81, 0x014e6a75, 0x00679b81, 0x02c80fc3, 0x0016b949}}, Y: Field{[10]uint32{0x010a9a63, 0x022185f5, 0x03850f24, 0x02af678c, 0x00a03f4b, 0x0155df02, 0x033ef80d, 0x016a433f, 0x028114c2, 0x00368784}}}, + {X: Field{[10]uint32{0x01ff7661, 0x021ab9c9, 0x03323a87, 0x019d6e34, 0x02174777, 0x000115b5, 0x03f2b10e, 0x02eb306e, 0x008906dd, 0x0021a35e}}, Y: Field{[10]uint32{0x0322ca1d, 0x030c24eb, 0x00ef296f, 0x0120d0a8, 0x0246e6ce, 0x027051bd, 0x03e57baa, 0x0037e38a, 0x001d189b, 0x00364b5a}}}, + {X: Field{[10]uint32{0x03686b74, 0x00762675, 0x025a4834, 0x02611f0c, 0x0223bd32, 0x01041a8c, 0x01d1f8a7, 0x0206db13, 0x034de7b8, 0x0027cbc2}}, Y: Field{[10]uint32{0x02440088, 0x013f0523, 0x016e3c44, 0x0172d1fc, 0x02deca28, 0x016158bc, 0x0329ca66, 0x012be2d5, 0x0111c297, 0x001beef5}}}, + {X: Field{[10]uint32{0x03fca8a3, 0x0140ddb4, 0x00b4fe69, 0x03afa302, 0x02c522f5, 0x03b8babd, 0x032da983, 0x0037c56f, 0x022b813b, 0x003eabc8}}, Y: Field{[10]uint32{0x000b472e, 0x036d0751, 0x01469b2c, 0x01b175b4, 0x0147f00e, 0x013c4aaf, 0x032ae874, 0x036b1a3e, 0x02692e98, 0x002fb14f}}}, + {X: Field{[10]uint32{0x03161475, 0x01f48a69, 0x00008fd6, 0x020293b1, 0x0313c81c, 0x01b1718b, 0x02a7ab70, 0x02e7e8b0, 0x01b9db4a, 0x001fd482}}, Y: Field{[10]uint32{0x0248d193, 0x033a82d2, 0x00ce4e69, 0x002e6b31, 0x00a58be4, 0x03c64736, 0x017d1c76, 0x01a67fce, 0x00daf9e8, 0x00284f5b}}}, + {X: Field{[10]uint32{0x02c84c2a, 0x012fd3c4, 0x00c04683, 0x02490168, 0x0050c7b4, 0x009c0285, 0x025f395e, 0x00dbc201, 0x016e80b1, 0x003d0d85}}, Y: Field{[10]uint32{0x017e60c4, 0x022546ef, 0x020e5911, 0x002e220a, 0x00e7aa89, 0x026c01fa, 0x020807d3, 0x03806e9d, 0x03b05684, 0x00337655}}}, + {X: Field{[10]uint32{0x00f1d06e, 0x03c70c4f, 0x0169f201, 0x0150ac93, 0x02882167, 0x00d153e9, 0x020c2bb0, 0x00df6081, 0x03495c5b, 0x003be6a9}}, Y: Field{[10]uint32{0x027a4aa9, 0x033d32bc, 0x0366654c, 0x03bf47dd, 0x0050003a, 0x0139b35f, 0x0125750e, 0x012a3eb0, 0x024df1d8, 0x003e1036}}}, + {X: Field{[10]uint32{0x035de05a, 0x00a25bfe, 0x01d40b12, 0x0322965c, 0x016d9e1c, 0x0179e4db, 0x010809c2, 0x02e4eb0a, 0x0043e96e, 0x001f7bb7}}, Y: Field{[10]uint32{0x02a8e0ce, 0x009ad949, 0x03381220, 0x03edaf24, 0x01de6683, 0x033c4bf3, 0x027b349c, 0x03439003, 0x026627b9, 0x00399703}}}, + {X: Field{[10]uint32{0x006d6459, 0x012cf3a6, 0x0215c0e7, 0x03d3ca0f, 0x01878384, 0x020bcd87, 0x03e74955, 0x01e5711e, 0x03156669, 0x001686fb}}, Y: Field{[10]uint32{0x00cf39ff, 0x01e711cb, 0x00d61b11, 0x020777e3, 0x0069b28b, 0x020cf8e0, 0x035b97e1, 0x000aca78, 0x02811fdb, 0x0033a616}}}, + {X: Field{[10]uint32{0x0125fa8e, 0x014d5639, 0x0383bfa4, 0x033e12c8, 0x0173b8fd, 0x020f1beb, 0x00eeb789, 0x004f0ac5, 0x01392334, 0x0036048f}}, Y: Field{[10]uint32{0x0233ef73, 0x009a51e9, 0x00095ea2, 0x028c3256, 0x02835e35, 0x02ecf2d5, 0x03f78a5a, 0x01c8011b, 0x019d905b, 0x003aa74e}}}, + {X: Field{[10]uint32{0x024d4bc8, 0x00c4cd03, 0x035d8939, 0x03469e9a, 0x0310d3df, 0x0026bed7, 0x02a36c39, 0x030c4099, 0x01d4f1f4, 0x0018bd0f}}, Y: Field{[10]uint32{0x0190f3ed, 0x028772ed, 0x028ef89f, 0x00a76a8b, 0x02755258, 0x00e8407c, 0x034fe225, 0x03591cb8, 0x01f1f83b, 0x002edd62}}}, + {X: Field{[10]uint32{0x039d72f7, 0x033cc4bd, 0x01f4fcc1, 0x0111bd8b, 0x00865f6e, 0x033d6535, 0x015aa750, 0x03011450, 0x0371d549, 0x00001b3c}}, Y: Field{[10]uint32{0x01e93af4, 0x006b7172, 0x0216a758, 0x02741a33, 0x002b3dee, 0x020ad168, 0x024ce206, 0x026f4a0a, 0x022b5c97, 0x003e33ad}}}, + {X: Field{[10]uint32{0x03cdd7e7, 0x03bf16d1, 0x01f3c509, 0x01c545af, 0x0249aeb3, 0x03e55021, 0x01638dd8, 0x03a70df0, 0x0380770b, 0x0016f5ed}}, Y: Field{[10]uint32{0x006ba9ff, 0x0242664a, 0x031e3021, 0x000ca8a2, 0x01efc12c, 0x02b74309, 0x006b91c5, 0x02abd3d8, 0x00488a87, 0x00351b1e}}}, + {X: Field{[10]uint32{0x036b6a62, 0x02fcf6f0, 0x001af0e6, 0x01ffc55a, 0x0081eecd, 0x02e566e8, 0x02086653, 0x02f52b96, 0x0154a319, 0x0031dc12}}, Y: Field{[10]uint32{0x016d0fe7, 0x00ecf294, 0x0337836e, 0x0002c571, 0x03e508f6, 0x02273312, 0x013b9c61, 0x012ea0fd, 0x03e82478, 0x000dcd50}}}, + {X: Field{[10]uint32{0x01b19cda, 0x0371b40e, 0x039588fe, 0x02342790, 0x02d6e92c, 0x0040b07b, 0x007da707, 0x00ea7760, 0x03fe4153, 0x000ad3c9}}, Y: Field{[10]uint32{0x001fb424, 0x038ab67e, 0x01d6b089, 0x02009005, 0x0049ba21, 0x024bd30c, 0x01fadd4a, 0x01f2c704, 0x03100ecd, 0x00262ea0}}}, + {X: Field{[10]uint32{0x014c0e5a, 0x001b2297, 0x03db54d3, 0x0204f5f0, 0x032c920c, 0x01a4c7e5, 0x000c581d, 0x030d3498, 0x01710b3d, 0x00039f50}}, Y: Field{[10]uint32{0x029a409a, 0x00513c92, 0x011f75b6, 0x01c74735, 0x0303e75b, 0x0169b128, 0x03a97efb, 0x014e1e67, 0x01ba9a82, 0x002ca560}}}, + {X: Field{[10]uint32{0x01c5d52e, 0x0198357c, 0x0284b2b5, 0x0187a01b, 0x032face7, 0x01a89c5f, 0x02700435, 0x00d5dc14, 0x022c18f4, 0x001880c0}}, Y: Field{[10]uint32{0x036a720d, 0x02021944, 0x024eb06c, 0x035aaa21, 0x020212ef, 0x0150ae5f, 0x035fe973, 0x0135d409, 0x03255d0a, 0x0006294b}}}, + {X: Field{[10]uint32{0x02e43b2b, 0x00700124, 0x026300e8, 0x01e5e479, 0x02489876, 0x02c3f332, 0x02327fe3, 0x02036e83, 0x03a28c1c, 0x002f6071}}, Y: Field{[10]uint32{0x003871c0, 0x0388d1e0, 0x00678db1, 0x02b3a4ea, 0x02416064, 0x03c6154d, 0x00831f07, 0x02f19278, 0x004ea14b, 0x0032942a}}}, + {X: Field{[10]uint32{0x004bc29a, 0x01aa6d3f, 0x0154a062, 0x0139bce9, 0x01b875eb, 0x000e9b83, 0x01385cd6, 0x00e43f34, 0x021ad3c1, 0x0026f10f}}, Y: Field{[10]uint32{0x00cb2cd4, 0x00b9a9b8, 0x0222e6b1, 0x02f763d2, 0x0264ea39, 0x01e5c5ec, 0x00d8b34b, 0x012ed5eb, 0x00bf9aa5, 0x00215e96}}}, + {X: Field{[10]uint32{0x03e40f33, 0x01da7329, 0x039082c8, 0x01c7195b, 0x015e5bfb, 0x0262fea8, 0x030117cb, 0x038f1e7b, 0x028d194d, 0x000c1569}}, Y: Field{[10]uint32{0x000d1d10, 0x008cf90d, 0x0086c1c9, 0x01ca9ff8, 0x00acbd8c, 0x01aae9af, 0x00218cfb, 0x038712fc, 0x01eadfeb, 0x000060fe}}}, + {X: Field{[10]uint32{0x034b08ac, 0x01e7eedc, 0x03e1b710, 0x00c5f62e, 0x002cec12, 0x00d60ee0, 0x02710724, 0x03462324, 0x0184ad1f, 0x0012b6fe}}, Y: Field{[10]uint32{0x03ec04e6, 0x013578f5, 0x01954709, 0x02dbde7d, 0x032192ce, 0x038fcb42, 0x01507668, 0x033bfcf6, 0x01889560, 0x0005149c}}}, + {X: Field{[10]uint32{0x016487cc, 0x01947469, 0x00b0cd00, 0x00daa81d, 0x0283fc6a, 0x033c5b48, 0x03ae3979, 0x0107671e, 0x01cc27e0, 0x000e3dcb}}, Y: Field{[10]uint32{0x033dc0bf, 0x01830ea4, 0x0188df71, 0x0110b946, 0x02496104, 0x002dbff1, 0x030d6f2c, 0x001b904d, 0x017c33a1, 0x00148e32}}}, + {X: Field{[10]uint32{0x015be2d3, 0x00623199, 0x03813322, 0x011d1f09, 0x02045606, 0x03167fca, 0x0013828a, 0x03f78285, 0x018a7bdf, 0x0037956f}}, Y: Field{[10]uint32{0x0042d9da, 0x034eed40, 0x0151ce65, 0x0146e65b, 0x0367bf9d, 0x01ec2bed, 0x039d0979, 0x0097cdd7, 0x01b0df5b, 0x0011de18}}}, + {X: Field{[10]uint32{0x023bcc66, 0x026e2797, 0x03893873, 0x03a9b159, 0x02e19340, 0x019bfa44, 0x00edf986, 0x000ae246, 0x00fdc47e, 0x003185ef}}, Y: Field{[10]uint32{0x01117072, 0x0098d259, 0x00d473b8, 0x01cad6c2, 0x01a6e046, 0x01133f12, 0x020f4e86, 0x01da0cab, 0x0117357e, 0x002e42e8}}}, + {X: Field{[10]uint32{0x01c84758, 0x02aceefc, 0x036724ad, 0x036fb2b6, 0x03c455f4, 0x024acc0c, 0x02402f1e, 0x0223252d, 0x01961b51, 0x00119570}}, Y: Field{[10]uint32{0x02fbc4a0, 0x0071b779, 0x01b5cf2c, 0x0300a0e2, 0x02714600, 0x012f017a, 0x0202df4f, 0x017d37ec, 0x0093a257, 0x000f3bb3}}}, + {X: Field{[10]uint32{0x03726a45, 0x021ba375, 0x004c9e5f, 0x00c67077, 0x00110df4, 0x02ad0f68, 0x013c503f, 0x0396b4da, 0x0340dc05, 0x003f2a43}}, Y: Field{[10]uint32{0x035771ca, 0x0321bf17, 0x021c3e6c, 0x03b1a323, 0x027478ed, 0x0269c29b, 0x0337aeb1, 0x0198106b, 0x039bbe3e, 0x003d608b}}}, + {X: Field{[10]uint32{0x027f61e9, 0x03c546f4, 0x00afb93f, 0x0015e31f, 0x02a31cbe, 0x02434ecf, 0x01e88d7f, 0x020961de, 0x004adcb2, 0x000c5db3}}, Y: Field{[10]uint32{0x02cc0135, 0x00308c50, 0x006aac34, 0x01115b34, 0x036a18ce, 0x03ed6ad6, 0x00fe7bba, 0x00290f25, 0x02cc148a, 0x000e18fc}}}, + {X: Field{[10]uint32{0x03b2ddc4, 0x0079943a, 0x014e0b81, 0x02734c69, 0x0151d9c1, 0x013e0b31, 0x030db151, 0x00842b41, 0x0373d124, 0x0018c9a7}}, Y: Field{[10]uint32{0x005cd0ac, 0x003c36f6, 0x02188e30, 0x02f0fdaa, 0x03038246, 0x002230e1, 0x034114e5, 0x01e90929, 0x03dd8a78, 0x002fe3b1}}}, + {X: Field{[10]uint32{0x032003d0, 0x00f39518, 0x02708dee, 0x0124d374, 0x000f07e7, 0x0104c9aa, 0x027f5445, 0x014ed86b, 0x01328d0f, 0x0019e687}}, Y: Field{[10]uint32{0x025c350f, 0x0240629c, 0x0085c034, 0x0157268d, 0x02c9b3eb, 0x03dbba69, 0x03e341d5, 0x03b28c46, 0x03488f21, 0x0020f284}}}, + {X: Field{[10]uint32{0x00b38b28, 0x033ce678, 0x036fb846, 0x0277a009, 0x03f7172f, 0x0153624c, 0x0148568a, 0x00b2134e, 0x01792998, 0x001a689f}}, Y: Field{[10]uint32{0x03b26168, 0x0058f90e, 0x034f3a02, 0x03d6b0b6, 0x0369c8b7, 0x00bce6f5, 0x00b16a12, 0x002ee15d, 0x0207cb0f, 0x003d0474}}}, + {X: Field{[10]uint32{0x0373ee4d, 0x015b23d9, 0x03c7f9dd, 0x02e72bfa, 0x02abfdab, 0x000a73bc, 0x03f21716, 0x01410b2f, 0x005701af, 0x000a6354}}, Y: Field{[10]uint32{0x0297e9e1, 0x00f0156a, 0x0222075e, 0x029e733e, 0x034271bd, 0x03db70db, 0x02e62c4b, 0x02113904, 0x0271d271, 0x003d0d0f}}}, + {X: Field{[10]uint32{0x000c4653, 0x022e5e48, 0x023b1f8f, 0x0391513d, 0x00e26f66, 0x02f3ce4c, 0x00eb9845, 0x03c4063e, 0x03da46d1, 0x000fca60}}, Y: Field{[10]uint32{0x01d71db0, 0x03166542, 0x01b53b26, 0x02f1e760, 0x009b2c38, 0x00c9b4e0, 0x02d57e6b, 0x00cec40d, 0x0114c4ad, 0x00125cea}}}, + {X: Field{[10]uint32{0x023538dd, 0x02aa2fdf, 0x03b1359f, 0x0287bda8, 0x0154412e, 0x0074a9be, 0x02d64b2a, 0x02e23650, 0x013e30ce, 0x003e0dbf}}, Y: Field{[10]uint32{0x037f9367, 0x0380a0b3, 0x02ba3b28, 0x038c1b9a, 0x00c8161e, 0x0162ddc8, 0x01fd29c1, 0x01ad69c2, 0x00815347, 0x001c828c}}}, + {X: Field{[10]uint32{0x00ef583a, 0x038b7c80, 0x03930b3a, 0x008807bb, 0x01295ed5, 0x03a647fa, 0x03c8ee4f, 0x00e2898e, 0x039b911e, 0x00375cba}}, Y: Field{[10]uint32{0x00c1b2ef, 0x02d03250, 0x00b8683c, 0x02c50fc4, 0x02398e86, 0x0182d4ec, 0x0285d9b3, 0x03dfe5e4, 0x01a5688b, 0x000a8369}}}, + {X: Field{[10]uint32{0x0168a619, 0x00fc0cd2, 0x019be028, 0x02912584, 0x037cef92, 0x00962dfc, 0x027bd818, 0x00957310, 0x025046ab, 0x00154789}}, Y: Field{[10]uint32{0x03bc4f30, 0x01e8dc39, 0x0223b200, 0x02a8f1ba, 0x02e5ca16, 0x00560a9b, 0x006a5ecd, 0x03cd6e6e, 0x03d24cd8, 0x000c5f0c}}}, + {X: Field{[10]uint32{0x0336c650, 0x00eb5e14, 0x02a90fbd, 0x01857214, 0x01ab28cb, 0x01e09564, 0x0319a304, 0x038f43b2, 0x0292131d, 0x0019a0f7}}, Y: Field{[10]uint32{0x002225f8, 0x01b4224a, 0x019e4d63, 0x03082397, 0x00b3c3b2, 0x011be839, 0x029556ec, 0x01548fe2, 0x018e7fd9, 0x00127ba9}}}, + {X: Field{[10]uint32{0x00f97805, 0x0127224f, 0x03ac7bea, 0x00f4c692, 0x01ca99ef, 0x023e257a, 0x029b146e, 0x03a99782, 0x01e284a6, 0x002d6cec}}, Y: Field{[10]uint32{0x01b6fe0d, 0x013ba239, 0x01667ffa, 0x030d51fa, 0x023cf16c, 0x0065402f, 0x0391437e, 0x038a5bca, 0x0294f333, 0x00285c82}}}, + {X: Field{[10]uint32{0x03cbf466, 0x009007e6, 0x00d1011a, 0x00e954d4, 0x03ccdde4, 0x01c63518, 0x009a2329, 0x01da125c, 0x03737c33, 0x00294065}}, Y: Field{[10]uint32{0x01d429e2, 0x03eb61ea, 0x0027e12e, 0x0233efcf, 0x03c51fff, 0x01add47a, 0x03a5e09b, 0x031777a3, 0x029effef, 0x00027301}}}, + {X: Field{[10]uint32{0x001588fb, 0x00dad8fb, 0x03849e12, 0x0092238b, 0x02e5cb72, 0x02c7162c, 0x0041b663, 0x0361850a, 0x018feb2b, 0x0027b0d2}}, Y: Field{[10]uint32{0x001f5f12, 0x00194bc3, 0x0333ba00, 0x0216a01c, 0x01e517e5, 0x005437fb, 0x02719bf2, 0x025fc0d8, 0x01a5e14b, 0x00380324}}}, + {X: Field{[10]uint32{0x03c5b6b2, 0x00c6afbc, 0x004b1f47, 0x02f16abc, 0x03581f97, 0x02e49999, 0x00b446ba, 0x00c615d4, 0x00b4adc1, 0x003842db}}, Y: Field{[10]uint32{0x01e2b9c3, 0x017f720d, 0x00ed3c1f, 0x010bc998, 0x01d5520b, 0x02d97007, 0x0287bba5, 0x0011dfce, 0x02137db2, 0x0014e944}}}, + {X: Field{[10]uint32{0x013ae314, 0x01873877, 0x00d0d3ff, 0x009c4ec6, 0x0360ace9, 0x000ad810, 0x0093691e, 0x029f1e63, 0x0167e36e, 0x002dd52a}}, Y: Field{[10]uint32{0x0073d849, 0x02e0a855, 0x0359be12, 0x00a64cf3, 0x00d83ee0, 0x02ac0794, 0x02f8d5fb, 0x03b96690, 0x01639aa7, 0x0022a68e}}}, + {X: Field{[10]uint32{0x02efa869, 0x0060ffcc, 0x02c8d489, 0x01d58d02, 0x017999a2, 0x02fa95a7, 0x038a51e6, 0x02fcf81b, 0x0361c10c, 0x0017fbf2}}, Y: Field{[10]uint32{0x02881e83, 0x02f86fd3, 0x0120715b, 0x01426cd2, 0x01dfe499, 0x02308150, 0x008c0932, 0x020d7076, 0x0093cbc4, 0x003606cc}}}, + {X: Field{[10]uint32{0x03d2d848, 0x02910bc9, 0x0118470a, 0x002aca6e, 0x01f0ed6f, 0x009f2265, 0x0009400b, 0x025f8658, 0x03bb04ac, 0x003f9468}}, Y: Field{[10]uint32{0x01116a58, 0x03f55a32, 0x00bd6ec5, 0x013c020f, 0x03d30625, 0x027c2c60, 0x02b8aaf5, 0x0279103c, 0x00e0a4c3, 0x00215a3f}}}, + {X: Field{[10]uint32{0x02b7dee3, 0x024519be, 0x0158d7b5, 0x0263911d, 0x00391df7, 0x03aca908, 0x00d5d38a, 0x03fb6f16, 0x02299fcc, 0x001a8f91}}, Y: Field{[10]uint32{0x02a5e548, 0x00fba6c8, 0x01a91aec, 0x02e78c58, 0x0289873e, 0x02ac7679, 0x02e7b5a3, 0x01767750, 0x03ba7bb1, 0x0006fb63}}}, + {X: Field{[10]uint32{0x03450c37, 0x01fff225, 0x012ee745, 0x0134e492, 0x0233db30, 0x0385af4c, 0x0162d970, 0x03537bdf, 0x00b83c40, 0x002b7f6f}}, Y: Field{[10]uint32{0x00138e0e, 0x0216e1fd, 0x001956be, 0x0064b873, 0x038fde78, 0x0055ab08, 0x00b588c4, 0x0127b0aa, 0x03dc1635, 0x001ec20a}}}, + {X: Field{[10]uint32{0x0113bf61, 0x030f7540, 0x02cb9f06, 0x0371bb31, 0x01509ed7, 0x00b45c04, 0x0254c270, 0x00b1520d, 0x03cc9c20, 0x0025a143}}, Y: Field{[10]uint32{0x0281aaf7, 0x022e2c34, 0x03b6c008, 0x01568070, 0x01b9fcc4, 0x01fb062d, 0x00c05dac, 0x01b126bc, 0x00327f96, 0x00041011}}}, + {X: Field{[10]uint32{0x00458bbe, 0x01026d57, 0x03ac4f09, 0x005059bc, 0x031703f5, 0x0010de69, 0x00151ca8, 0x03285362, 0x01978f78, 0x000ab884}}, Y: Field{[10]uint32{0x01ecf7b1, 0x03277106, 0x012c86cb, 0x009fe80c, 0x022328e3, 0x021e5873, 0x01c7dde3, 0x00d7f514, 0x00d95760, 0x001379d3}}}, + {X: Field{[10]uint32{0x02987e57, 0x03ab1846, 0x006cfb79, 0x038f149d, 0x027e5816, 0x0358b109, 0x021a332c, 0x03265899, 0x0342e1b5, 0x003b7061}}, Y: Field{[10]uint32{0x01b4fe5e, 0x00868d01, 0x01bc02c0, 0x00c8c0c4, 0x0129ba90, 0x02eaf95e, 0x01d484fe, 0x0026fcfe, 0x033fc633, 0x0020000e}}}, + {X: Field{[10]uint32{0x0243a244, 0x0299033f, 0x025aa1d6, 0x012610dd, 0x0038b35d, 0x022e50da, 0x0290885c, 0x03c2b8a6, 0x022a5fa0, 0x001e00aa}}, Y: Field{[10]uint32{0x0192a803, 0x03dc59e4, 0x025dd7f5, 0x004616ea, 0x037e3dda, 0x005b126e, 0x03297e04, 0x00e6a101, 0x029fe632, 0x00031fcc}}}, + {X: Field{[10]uint32{0x012335cf, 0x01efdfe6, 0x02386bf6, 0x03a0d79c, 0x02c2173d, 0x038ff16a, 0x02ede712, 0x011d6b0d, 0x0179b124, 0x003eddd1}}, Y: Field{[10]uint32{0x03a82c94, 0x032f3011, 0x02c01cdf, 0x029add8e, 0x01b6f413, 0x006a3590, 0x03ebf0e3, 0x01edeb90, 0x035163c1, 0x0030399a}}}, + {X: Field{[10]uint32{0x00bc2852, 0x03886cff, 0x02982051, 0x00928c6d, 0x00695a9c, 0x03a70480, 0x0394881f, 0x02ba78cb, 0x018a43ab, 0x0036068f}}, Y: Field{[10]uint32{0x0112673f, 0x03dafcb7, 0x00dbf2cc, 0x028f2419, 0x01a693e3, 0x002a636d, 0x0351de7e, 0x032db5ef, 0x0011e8a8, 0x0018c376}}}, + {X: Field{[10]uint32{0x03324cf0, 0x01ddadf1, 0x0249f9bf, 0x02812f94, 0x027cb2ed, 0x0089a336, 0x00da0c7e, 0x001a2e01, 0x03d497cf, 0x001467f3}}, Y: Field{[10]uint32{0x0162fdb9, 0x039bff25, 0x0391dc20, 0x03b0ef28, 0x03a357c8, 0x03912ae7, 0x02916466, 0x02cfaef9, 0x00cd198a, 0x002fb1bd}}}, + {X: Field{[10]uint32{0x028ef592, 0x024a5be1, 0x0044124f, 0x021389dc, 0x023e31b2, 0x003e6c70, 0x0193853e, 0x0181cd78, 0x03e48fd6, 0x003312b4}}, Y: Field{[10]uint32{0x0383c27b, 0x0098eb75, 0x02f68996, 0x007b6c96, 0x019b1215, 0x01ec0f1d, 0x01520ac6, 0x0311d1f5, 0x018d8583, 0x00222bc5}}}, + {X: Field{[10]uint32{0x00d24117, 0x00240d1e, 0x01e338f7, 0x02852e17, 0x02c06a57, 0x0137b5ba, 0x0340cf96, 0x021a9662, 0x00ae6f51, 0x002b7654}}, Y: Field{[10]uint32{0x03affa7d, 0x01effd28, 0x0165bc04, 0x03f1c013, 0x00111f6d, 0x002fb1d1, 0x03d6853a, 0x00a1737a, 0x00bd2d69, 0x00316729}}}, + {X: Field{[10]uint32{0x02b383e4, 0x030fdb6e, 0x027ddd0b, 0x0319f124, 0x03ef0437, 0x032cd62b, 0x03c81730, 0x01f79c4a, 0x03454309, 0x003701c6}}, Y: Field{[10]uint32{0x015ca8ed, 0x0042d03a, 0x0385f9e4, 0x0283ec46, 0x03f28fca, 0x0061f7ef, 0x03b2adfc, 0x00c1305c, 0x02a9899b, 0x001e4e44}}}, + {X: Field{[10]uint32{0x02c167c7, 0x01e6c6ab, 0x03abe94d, 0x01c91fda, 0x02fd97a6, 0x025ade9c, 0x0037da4a, 0x002676a7, 0x037e6db6, 0x0017738c}}, Y: Field{[10]uint32{0x024377f6, 0x0276f593, 0x021d5754, 0x015993ac, 0x00eb35bf, 0x005ae8a8, 0x0082991f, 0x02290ed9, 0x03ba1f09, 0x0006e21f}}}, + {X: Field{[10]uint32{0x01f5cfcb, 0x02133e78, 0x009e5ba2, 0x03d0f984, 0x02900a83, 0x03a02260, 0x022ead80, 0x029989b4, 0x02ad8493, 0x00145bad}}, Y: Field{[10]uint32{0x00e05042, 0x00c3fbfb, 0x03e3c68d, 0x0046ecdb, 0x03ef6a85, 0x0074fe51, 0x018308c6, 0x02d1bd23, 0x02b38085, 0x00328d42}}}, + {X: Field{[10]uint32{0x000e5e75, 0x03c71f3c, 0x020a335a, 0x02e02321, 0x03732b3f, 0x03a45f21, 0x03912114, 0x00b68796, 0x01503b1f, 0x003dd9f0}}, Y: Field{[10]uint32{0x01aaab54, 0x02d1cf68, 0x0165795b, 0x003854f3, 0x0109ec61, 0x015776ad, 0x00f64a26, 0x0119ee22, 0x00c8cdbe, 0x000fb3be}}}, + {X: Field{[10]uint32{0x03c977f0, 0x00eb099c, 0x01e7531f, 0x00b0b319, 0x02418558, 0x005df79e, 0x03bc5d8f, 0x00b2329e, 0x03cf0f79, 0x003e6efa}}, Y: Field{[10]uint32{0x01614a85, 0x026595d2, 0x02f52b8c, 0x02aab3b2, 0x03ac751e, 0x02867957, 0x02f767b8, 0x00e89895, 0x00fefecb, 0x000a42ad}}}, + {X: Field{[10]uint32{0x0147c45f, 0x01dff3d3, 0x00e8eaf4, 0x02f326c2, 0x016ec3ad, 0x0048f7d8, 0x01bff42c, 0x0236c7d5, 0x01febe5c, 0x0031aff8}}, Y: Field{[10]uint32{0x0241792f, 0x02b55b35, 0x02995c79, 0x0004d1fa, 0x0041c271, 0x0159e624, 0x032eddc9, 0x028bff60, 0x0082d6d6, 0x0031657e}}}, + {X: Field{[10]uint32{0x00d3ce1e, 0x020a7978, 0x02425761, 0x00862e1c, 0x03c55595, 0x005c2ed1, 0x01cfe6e5, 0x02d321c7, 0x0371808f, 0x0015b0b5}}, Y: Field{[10]uint32{0x000468ba, 0x003f27d5, 0x0229f5ee, 0x02bdc58d, 0x0112ec15, 0x039c8718, 0x00a91889, 0x03989bf7, 0x02e69e03, 0x001b79ca}}}, + {X: Field{[10]uint32{0x0109d663, 0x028d99d4, 0x00fb5066, 0x03fbf181, 0x02da9ecf, 0x03033df4, 0x0296d8c3, 0x016f961e, 0x0305ec9f, 0x00080862}}, Y: Field{[10]uint32{0x038f6993, 0x00a0eefb, 0x02e12e79, 0x00ea22d0, 0x02b41bfa, 0x029cc86b, 0x02ea0aa7, 0x01f8907c, 0x03c2c535, 0x000bb069}}}, + {X: Field{[10]uint32{0x036be4ee, 0x03f2bfe5, 0x00f09e2a, 0x03d2ece9, 0x03519035, 0x01252bfc, 0x03db4f33, 0x0333656f, 0x02690a04, 0x000e8224}}, Y: Field{[10]uint32{0x0042d1a2, 0x006b615a, 0x02757ed9, 0x00899036, 0x020bbeba, 0x00d012cc, 0x0293757b, 0x0287fa45, 0x0225fb0b, 0x00395a03}}}, + {X: Field{[10]uint32{0x005b3f07, 0x01948ebd, 0x01a2e285, 0x0006ca5d, 0x02dfd3e1, 0x02618125, 0x00fd0f25, 0x022d4f6c, 0x0296a0cd, 0x0023e7c8}}, Y: Field{[10]uint32{0x01c625b5, 0x02d5c8ad, 0x01920a3f, 0x00295de1, 0x038ab3be, 0x018a435d, 0x029015cd, 0x037cc6c8, 0x01072cac, 0x00187056}}}, + {X: Field{[10]uint32{0x0288070e, 0x03d1d33f, 0x0106c836, 0x024347a8, 0x00097e2b, 0x0352d8ca, 0x01599b26, 0x036a5f34, 0x03e8695b, 0x00219602}}, Y: Field{[10]uint32{0x017d7d21, 0x03146aec, 0x00ac6166, 0x02a276e9, 0x022bb220, 0x001f71fb, 0x022fe5fd, 0x02b160e2, 0x00a17e19, 0x002aeb9a}}}, + {X: Field{[10]uint32{0x02b4d762, 0x00b74a5c, 0x03d048c7, 0x0163ec61, 0x01eb1f94, 0x015ea879, 0x005b4f0e, 0x035627b3, 0x038a1e69, 0x003edab0}}, Y: Field{[10]uint32{0x02ac32c1, 0x0004c061, 0x000147fb, 0x01bc2e58, 0x03e5d180, 0x02e0ad72, 0x031d3af2, 0x01c7cc5b, 0x0116bec2, 0x00358077}}}, + {X: Field{[10]uint32{0x02a5f0b0, 0x02e36f9f, 0x027b4242, 0x00c6d9b8, 0x02c5bb7d, 0x00aec273, 0x03aec947, 0x03aa06fc, 0x006bc54f, 0x001f0418}}, Y: Field{[10]uint32{0x01f68f54, 0x035df6ef, 0x010abd14, 0x00a8f809, 0x0202ea52, 0x0102d116, 0x01839872, 0x01590dd9, 0x0180d3d6, 0x00048854}}}, + {X: Field{[10]uint32{0x0152a1a6, 0x00ac05cb, 0x02495204, 0x0398ee11, 0x02740a5b, 0x0367ce12, 0x007822b1, 0x024ef1d3, 0x03948335, 0x002179aa}}, Y: Field{[10]uint32{0x01fae93a, 0x0397af80, 0x030f981f, 0x033371d7, 0x02d6e69f, 0x0334a38f, 0x02512138, 0x03e1aa3d, 0x00d068d6, 0x003d7058}}}, + {X: Field{[10]uint32{0x0351cfe5, 0x0044eb7f, 0x00a27f02, 0x03b2e203, 0x005e626a, 0x0151c7d4, 0x0374ea0e, 0x006e8146, 0x013a99cd, 0x001f878b}}, Y: Field{[10]uint32{0x01ad89bc, 0x012c0267, 0x0299781f, 0x033b0018, 0x02c1eb96, 0x00dbc6b7, 0x02322291, 0x03f8de30, 0x002ee9d4, 0x00104fb2}}}, + {X: Field{[10]uint32{0x007aaacd, 0x03af407a, 0x02bd2928, 0x02b1ca70, 0x016a9490, 0x024c7187, 0x03a08dd6, 0x00d7cbb5, 0x00ad8137, 0x00162590}}, Y: Field{[10]uint32{0x00485429, 0x0009c648, 0x02e15c1a, 0x026f8d0f, 0x017a1e90, 0x025b1335, 0x039fc330, 0x03ed2cd9, 0x010b8a89, 0x002275ac}}}, + {X: Field{[10]uint32{0x026e6608, 0x02b41017, 0x00c5d7b7, 0x03511046, 0x0191fdd7, 0x01d07067, 0x00db0ef3, 0x0173a3f7, 0x034ff346, 0x001c2033}}, Y: Field{[10]uint32{0x022441fe, 0x02b627e3, 0x03d347df, 0x0274d050, 0x00303348, 0x02036c76, 0x006d334f, 0x002e82d7, 0x01a95cbc, 0x001e8fc3}}}, + {X: Field{[10]uint32{0x02917c55, 0x026a1d89, 0x0261c7d5, 0x000d954f, 0x01091deb, 0x01dcdf0c, 0x0196bd4d, 0x0009a4b7, 0x034c2d40, 0x002ed982}}, Y: Field{[10]uint32{0x00983c24, 0x028fd030, 0x002faf5e, 0x00446370, 0x03f150af, 0x017a2e1b, 0x00684031, 0x00125c18, 0x0113a756, 0x002d252b}}}, + {X: Field{[10]uint32{0x03221b27, 0x03141b67, 0x02e0c1e2, 0x02c23376, 0x013f4f4f, 0x03629719, 0x008161c5, 0x0056c910, 0x01ec7ebf, 0x001ce890}}, Y: Field{[10]uint32{0x0063640a, 0x02f05d75, 0x0332b5e1, 0x024a8bdb, 0x0364bbe1, 0x03520363, 0x00865041, 0x0295bde1, 0x03b433a0, 0x002014d2}}}, + {X: Field{[10]uint32{0x00b1fe07, 0x0056aa9e, 0x03a6f89a, 0x000b0f5e, 0x039e45f2, 0x028ad62f, 0x005741e6, 0x03f6f1dc, 0x0351f08b, 0x003f707b}}, Y: Field{[10]uint32{0x016c0586, 0x039683a6, 0x00e36880, 0x0051d57d, 0x001684f7, 0x0160c950, 0x03ac05b5, 0x0121e191, 0x00dcdc1e, 0x001fa740}}}, + {X: Field{[10]uint32{0x033618af, 0x01ccf4e8, 0x007bc6d6, 0x00ea449a, 0x03a15ab1, 0x02838cf7, 0x0344736e, 0x017304ea, 0x02cba0ce, 0x00081210}}, Y: Field{[10]uint32{0x016bd521, 0x03e4ab32, 0x03a35896, 0x03708516, 0x029e1804, 0x0062a53c, 0x01187418, 0x02472feb, 0x0205a6e9, 0x002bf248}}}, + {X: Field{[10]uint32{0x017ed768, 0x02f2d805, 0x0193e0b2, 0x02660eeb, 0x01a47c4a, 0x00121a1a, 0x00095675, 0x00c54604, 0x001ef82c, 0x00280ea7}}, Y: Field{[10]uint32{0x02090a65, 0x033c67fd, 0x0263ca26, 0x028b7361, 0x0302158b, 0x02690ee2, 0x033e5eed, 0x01a603bb, 0x0164fb9c, 0x001e1be4}}}, + {X: Field{[10]uint32{0x03c00ed2, 0x026c56f6, 0x025baee1, 0x010b1515, 0x01fa18bd, 0x036a04f3, 0x015e3ff7, 0x005e118d, 0x025f6cb4, 0x00178edb}}, Y: Field{[10]uint32{0x02ee603f, 0x0000db10, 0x02cfde34, 0x022b1722, 0x019d6f35, 0x0234f936, 0x03b8f9f8, 0x008a13f0, 0x015342bf, 0x002e70e9}}}, + {X: Field{[10]uint32{0x005dbc70, 0x010e1728, 0x0254b015, 0x01d840a6, 0x00abf764, 0x03ec9d1b, 0x03dfbd6e, 0x004a0198, 0x020e082d, 0x00066c25}}, Y: Field{[10]uint32{0x01504773, 0x01993d39, 0x02f312d2, 0x03b64845, 0x0133df5d, 0x00d74107, 0x03356451, 0x004aa517, 0x03bc4401, 0x003e2ca2}}}, + {X: Field{[10]uint32{0x03f3677e, 0x01d98e37, 0x00d05098, 0x0076dafa, 0x006f1c2d, 0x028688b3, 0x039b274b, 0x02ebf9d2, 0x01007597, 0x0004187a}}, Y: Field{[10]uint32{0x01444b21, 0x0171e048, 0x00fa9815, 0x03c533d3, 0x01fe2fff, 0x03894629, 0x017b59eb, 0x024bb113, 0x0122dec5, 0x001c1eb2}}}, + {X: Field{[10]uint32{0x03030b85, 0x01c73c7c, 0x01f5709a, 0x0078ec55, 0x01cc0e22, 0x02683940, 0x039b5676, 0x01f61d50, 0x001160fc, 0x00324613}}, Y: Field{[10]uint32{0x00327805, 0x00fa608a, 0x02e308c4, 0x02527ec7, 0x018e83e5, 0x017c8e26, 0x01d30f87, 0x01a27f5b, 0x01e37c04, 0x002202da}}}, + {X: Field{[10]uint32{0x0374cf04, 0x01567fd0, 0x02f12d37, 0x0190988a, 0x01c8fa23, 0x01b09ae9, 0x005af94e, 0x014b363f, 0x03044dec, 0x0028d7ec}}, Y: Field{[10]uint32{0x012242fd, 0x035d5704, 0x0284042d, 0x01c614c9, 0x038b3604, 0x00d08b73, 0x03adcb9a, 0x00d612b1, 0x0375692a, 0x0005513c}}}, + {X: Field{[10]uint32{0x010929ca, 0x0012f46e, 0x00a8c1b2, 0x0069e000, 0x021b2c50, 0x02c4c3da, 0x00efbe8e, 0x03afa046, 0x03ad60ff, 0x002ea300}}, Y: Field{[10]uint32{0x03aaafbe, 0x00da71b8, 0x03722f11, 0x011eb84d, 0x0365b88d, 0x03de002a, 0x03732112, 0x010783eb, 0x0329a3f3, 0x003a57bd}}}, + {X: Field{[10]uint32{0x0330ddb9, 0x0346d4a3, 0x03ba3361, 0x017d7992, 0x02fe0849, 0x01268042, 0x03ba189f, 0x0229de5f, 0x0355842d, 0x0034ae95}}, Y: Field{[10]uint32{0x03df7957, 0x00c2fe94, 0x03d477c0, 0x00b0e42d, 0x000549e7, 0x00e95758, 0x00bc5f0c, 0x005e7de1, 0x01b10cad, 0x00368d9a}}}, + {X: Field{[10]uint32{0x008703f2, 0x036e6b9b, 0x0194a086, 0x01e552b2, 0x00d3de15, 0x020332c9, 0x031d2b28, 0x0222c9de, 0x03587ec9, 0x000f813a}}, Y: Field{[10]uint32{0x0328dd9c, 0x0336d3f9, 0x0207bb98, 0x02273170, 0x00ff3c60, 0x037e5bef, 0x031d6503, 0x021767ba, 0x0113e6dc, 0x003e9048}}}, + {X: Field{[10]uint32{0x019fe7f6, 0x0368f09a, 0x01ca17a0, 0x008177e4, 0x0260c9f1, 0x007d19b5, 0x019aefa9, 0x029274f8, 0x03424339, 0x003bf96e}}, Y: Field{[10]uint32{0x005156e9, 0x00fa74c9, 0x0008ff9e, 0x0029f2d1, 0x01e3576b, 0x01f3e7f1, 0x0221db29, 0x01903f3a, 0x012ffb39, 0x00263188}}}, + {X: Field{[10]uint32{0x02a0908b, 0x0359a92e, 0x008a302b, 0x00b6605b, 0x03bca2dc, 0x031383a9, 0x03e65915, 0x00cdb7bb, 0x02e5a330, 0x0028a510}}, Y: Field{[10]uint32{0x02a135e6, 0x0109ea77, 0x023112db, 0x02251199, 0x02dc5e77, 0x029bee79, 0x0374c130, 0x0391f0ed, 0x00297320, 0x00286fe2}}}, + {X: Field{[10]uint32{0x008bb792, 0x022aa23c, 0x013714da, 0x03fe0063, 0x0148e877, 0x0324862c, 0x01f632d1, 0x0097daa4, 0x00ba6f72, 0x001152f3}}, Y: Field{[10]uint32{0x01ec713c, 0x02562dd1, 0x00e3e918, 0x00f681f8, 0x01815775, 0x000ba837, 0x021106b2, 0x00ac0582, 0x01312d53, 0x0036837b}}}, + {X: Field{[10]uint32{0x00c2dca9, 0x0160d337, 0x01fced42, 0x020ba503, 0x00565737, 0x00941501, 0x00631afa, 0x02559b2c, 0x014032c3, 0x0000c58e}}, Y: Field{[10]uint32{0x03cc5fc7, 0x016a36f3, 0x004dd844, 0x017e9555, 0x0267f089, 0x03d359a2, 0x037464c6, 0x02c34691, 0x01c41b15, 0x00063158}}}, + {X: Field{[10]uint32{0x01b07703, 0x03f22112, 0x00a92bc4, 0x00e8ef38, 0x01524089, 0x03f1c4cb, 0x015fcedf, 0x01efc83c, 0x035f53f0, 0x00152d4d}}, Y: Field{[10]uint32{0x01abdee7, 0x0058fb98, 0x026a7b3f, 0x031b59c8, 0x00f5df11, 0x028ba886, 0x02922bdf, 0x01094794, 0x033f0a94, 0x000c6f8a}}}, + {X: Field{[10]uint32{0x0058b3bd, 0x02dfb980, 0x003280d2, 0x03118e7a, 0x00de9033, 0x025368f3, 0x03b9b6a6, 0x03419caf, 0x031b0745, 0x000a0f38}}, Y: Field{[10]uint32{0x00c0245a, 0x00801136, 0x0338ff9d, 0x02a99eaa, 0x010dc1c7, 0x03a074b2, 0x01c24e76, 0x02ed5b8f, 0x00a4d452, 0x003daa52}}}, + {X: Field{[10]uint32{0x00e99967, 0x0059fc84, 0x033e3a60, 0x00c5892e, 0x0148d5f8, 0x0012515e, 0x012419cb, 0x029d51ec, 0x0353117b, 0x002d79d3}}, Y: Field{[10]uint32{0x018dd3e6, 0x0120a01c, 0x01b5e10d, 0x007d33f6, 0x003da833, 0x03ce0c02, 0x03c22e89, 0x03e6aaa0, 0x0354d635, 0x0017d8d5}}}, + {X: Field{[10]uint32{0x03f83080, 0x0159c4f2, 0x031340a8, 0x012c7349, 0x03d587c3, 0x0335476b, 0x00dc776f, 0x00c60c5c, 0x0332cfa3, 0x001a0797}}, Y: Field{[10]uint32{0x0279266a, 0x0106951c, 0x010e38f2, 0x03bfef8e, 0x0276f646, 0x01ff3cc2, 0x00361d9b, 0x039375ed, 0x00b8d144, 0x003161f6}}}, + {X: Field{[10]uint32{0x029f1d0c, 0x01697f40, 0x00621b92, 0x00857fe3, 0x012f28b2, 0x00177d5b, 0x021ec17d, 0x00a27c94, 0x02b7722f, 0x0007ee97}}, Y: Field{[10]uint32{0x0311f5ba, 0x0372fa7a, 0x037d1524, 0x018d6cae, 0x0234283b, 0x032b2d9a, 0x03f287ef, 0x03f537e9, 0x00d997ec, 0x0037c450}}}, + {X: Field{[10]uint32{0x020d0a77, 0x004c029a, 0x00f2031e, 0x01933095, 0x0217855b, 0x00cfc6f3, 0x038fc5a7, 0x022cf3b4, 0x00b0df37, 0x000e2ffd}}, Y: Field{[10]uint32{0x0206b1be, 0x03728719, 0x03dc2520, 0x01979cef, 0x01f35a50, 0x0094dd1d, 0x00485ee3, 0x00a5b993, 0x025df634, 0x001b53c1}}}, + {X: Field{[10]uint32{0x017de831, 0x023dd3b9, 0x015ed6e0, 0x0281df32, 0x03779df8, 0x01ed5e63, 0x00050d52, 0x00992ef9, 0x03c359a9, 0x001c1c04}}, Y: Field{[10]uint32{0x014ea422, 0x032455c0, 0x00c3fda9, 0x029d8cb9, 0x02582313, 0x00f3662b, 0x03b8dcc5, 0x021b0195, 0x01a03153, 0x002e7cde}}}, + {X: Field{[10]uint32{0x01642ef5, 0x028fd8d1, 0x0135a73d, 0x02467799, 0x03fc5b8c, 0x0082416a, 0x010abbb3, 0x00921392, 0x012f7028, 0x002b653b}}, Y: Field{[10]uint32{0x02c88457, 0x01c0b0aa, 0x02bd6cb8, 0x01cdb409, 0x020fdf49, 0x01951485, 0x00011fec, 0x0387cfa6, 0x0013a554, 0x00276fa2}}}, + {X: Field{[10]uint32{0x0362612e, 0x0115613f, 0x001f54f5, 0x021d62e2, 0x00fd174f, 0x0110de17, 0x01ad1552, 0x021da926, 0x01e4e991, 0x0011ed5b}}, Y: Field{[10]uint32{0x00efdced, 0x0356695f, 0x012d986b, 0x03483524, 0x03383d92, 0x03dd4ddd, 0x016117a5, 0x02faddf1, 0x01375855, 0x00028501}}}, + {X: Field{[10]uint32{0x01f431e8, 0x03ded205, 0x036af03c, 0x013433cc, 0x03f31f62, 0x0047ca04, 0x024643af, 0x029a4c7c, 0x024e9291, 0x00146f39}}, Y: Field{[10]uint32{0x0107e552, 0x00eaaebb, 0x02e13a06, 0x01a435d6, 0x03f40c4c, 0x00480e53, 0x0235d284, 0x00891c3b, 0x03d9a301, 0x00023dd0}}}, + {X: Field{[10]uint32{0x03f7a43f, 0x02e550b9, 0x03447a0c, 0x03b80ef1, 0x0083b80b, 0x026d3af8, 0x018e56b4, 0x01683f3a, 0x00feb52c, 0x001d8a1f}}, Y: Field{[10]uint32{0x02a7a7bc, 0x00cfadb8, 0x007ff13e, 0x026f7161, 0x03e9e339, 0x003662c1, 0x01d064a5, 0x0112ef4e, 0x0256fa57, 0x001cdadf}}}, + {X: Field{[10]uint32{0x036b8f5e, 0x02b37037, 0x0155b181, 0x0333c713, 0x028dc29b, 0x006dddc6, 0x011aaa2c, 0x000430c6, 0x039ead01, 0x0018535c}}, Y: Field{[10]uint32{0x002f8085, 0x036d9b43, 0x031664f4, 0x036eabc1, 0x025591ef, 0x00001193, 0x0296c2c5, 0x01eddb22, 0x028fe860, 0x00173353}}}, + {X: Field{[10]uint32{0x024e1bc9, 0x00b4ce97, 0x0380803e, 0x02262598, 0x0035cd58, 0x00354fb4, 0x039404d9, 0x00d7cacc, 0x00c8ee8c, 0x0030e111}}, Y: Field{[10]uint32{0x00cd29f2, 0x02febd9b, 0x03f441f4, 0x02685ae4, 0x031d2ffc, 0x021fea6a, 0x02221092, 0x014baf70, 0x00cdde54, 0x0022d102}}}, + {X: Field{[10]uint32{0x01c8f349, 0x0077dea6, 0x02539239, 0x025cb6ed, 0x0256a1c1, 0x014aff79, 0x019bf028, 0x01bcd760, 0x0249c601, 0x0022a725}}, Y: Field{[10]uint32{0x0369a8ed, 0x03a5d2b5, 0x001afdc6, 0x0168ce46, 0x031797aa, 0x0132d402, 0x00a6030a, 0x0067e9b1, 0x0157be2c, 0x002cb736}}}, + {X: Field{[10]uint32{0x02a04b03, 0x02ccc46f, 0x026bced6, 0x02d0745d, 0x0196292a, 0x0334a35d, 0x010ea0a6, 0x025c2497, 0x011be444, 0x00283d73}}, Y: Field{[10]uint32{0x027ff95b, 0x03e56524, 0x034b868a, 0x00681c73, 0x00c8d793, 0x03912738, 0x0045d923, 0x00a6c338, 0x01e9291b, 0x00349c2c}}}, + {X: Field{[10]uint32{0x033a9614, 0x03530447, 0x03a64709, 0x0372a550, 0x0025c64d, 0x00a38964, 0x03bdbaf0, 0x01661deb, 0x03368767, 0x0029e3c8}}, Y: Field{[10]uint32{0x02a6de83, 0x007c108c, 0x01e7ee24, 0x02690e7d, 0x01de34aa, 0x007d4346, 0x0245b3ab, 0x0116fb94, 0x02c9a5d2, 0x0004d97e}}}, + {X: Field{[10]uint32{0x03391769, 0x03f0f902, 0x03b514a9, 0x00c27b8f, 0x03af6cae, 0x0104e91a, 0x03aa6f5a, 0x00b16e4a, 0x03e3ae48, 0x000eff4d}}, Y: Field{[10]uint32{0x016d1c59, 0x01553c0e, 0x03d66bdc, 0x0019371f, 0x03d0219c, 0x01de3273, 0x02424a07, 0x02c3719b, 0x001834bb, 0x000b64c2}}}, + {X: Field{[10]uint32{0x013881a2, 0x00735c74, 0x00e5d1b4, 0x00f580bb, 0x02d426f2, 0x039e5b4a, 0x036ea757, 0x00748f9d, 0x009a0026, 0x0024b2b1}}, Y: Field{[10]uint32{0x031521c1, 0x02124b95, 0x035dac0d, 0x032061e8, 0x00c7a43a, 0x02303176, 0x023e587a, 0x00df2266, 0x00138e0f, 0x00231dbb}}}, + {X: Field{[10]uint32{0x0356842a, 0x01008502, 0x01d6b829, 0x0379ea5b, 0x03718944, 0x0124d59e, 0x03708941, 0x03719f30, 0x01e00ea7, 0x00033dbb}}, Y: Field{[10]uint32{0x00627cb7, 0x03a343d5, 0x0042ca76, 0x0343d646, 0x020fa070, 0x00f72314, 0x016128a5, 0x01822deb, 0x03d4e939, 0x0038adc5}}}, + {X: Field{[10]uint32{0x0291e17a, 0x006fe0be, 0x0035e3dd, 0x00b44781, 0x00968c8c, 0x02c1b886, 0x02cb92bb, 0x00a5149b, 0x0198ba51, 0x00188132}}, Y: Field{[10]uint32{0x00cd0ea4, 0x0362b765, 0x03939d12, 0x031e6981, 0x03d1ed18, 0x002bca8f, 0x03ae21ef, 0x01972723, 0x015fe783, 0x0005a428}}}, + {X: Field{[10]uint32{0x00c0aa5d, 0x006bff79, 0x03f12ef7, 0x001fc88d, 0x02d8ce07, 0x01ab0b85, 0x0268d13a, 0x000384d4, 0x0348cc55, 0x0028b13e}}, Y: Field{[10]uint32{0x000cd839, 0x03cb5c0f, 0x039509e5, 0x01ea3566, 0x03c403f5, 0x016048ea, 0x03e3906c, 0x03225f2d, 0x000ee608, 0x000e0251}}}, + {X: Field{[10]uint32{0x03656f60, 0x01e1cf7a, 0x024f2b66, 0x03135cc8, 0x016acc8e, 0x00ecb8c2, 0x01a36a6d, 0x00f92f17, 0x03a1cc30, 0x00362bdf}}, Y: Field{[10]uint32{0x00c6de0d, 0x0333fffc, 0x02e5ddd4, 0x006e7b7a, 0x015e14d8, 0x00116c4d, 0x03b39f97, 0x00cf1437, 0x02bd5a55, 0x0027f1fc}}}, + {X: Field{[10]uint32{0x02dea0e7, 0x035dd75d, 0x0390a864, 0x00fb476b, 0x01377073, 0x0014c12f, 0x00e6bbdb, 0x00a46981, 0x00adb873, 0x000fa680}}, Y: Field{[10]uint32{0x0101ded0, 0x023bad02, 0x0063051f, 0x026cc86d, 0x0320a5cb, 0x0066a35d, 0x0124e37f, 0x0313bd4d, 0x0057f6d1, 0x0037ad25}}}, + {X: Field{[10]uint32{0x03dc3d7f, 0x03943974, 0x0136809d, 0x0357a862, 0x01760ca8, 0x0306cab2, 0x014346aa, 0x01883261, 0x02e930aa, 0x0002fbd6}}, Y: Field{[10]uint32{0x00dfc48f, 0x037eb592, 0x03034c0f, 0x028ff8dc, 0x0105da98, 0x03501079, 0x0212b9c7, 0x017d66c0, 0x0042f792, 0x00083603}}}, + {X: Field{[10]uint32{0x0155f67f, 0x00ad2424, 0x0035d592, 0x011e2229, 0x0238215e, 0x03ce5916, 0x01743088, 0x03541db0, 0x01fbcd28, 0x0033505a}}, Y: Field{[10]uint32{0x01e74674, 0x030bc98d, 0x025b929d, 0x03192d6a, 0x00a170da, 0x015b06da, 0x025f2743, 0x01937569, 0x00a21a55, 0x003e798b}}}, + {X: Field{[10]uint32{0x015a4c28, 0x02d810bb, 0x0121d538, 0x004533ce, 0x014bd37b, 0x025f5db3, 0x01a25047, 0x009893f7, 0x01ed34cd, 0x00292da4}}, Y: Field{[10]uint32{0x026af55d, 0x01b08174, 0x02d12c33, 0x01ddcb1c, 0x025c045a, 0x00f8ce5f, 0x030ca545, 0x02d30456, 0x00b16781, 0x003194dd}}}, + {X: Field{[10]uint32{0x00aa4818, 0x01576f62, 0x0047dc9e, 0x0056fe7a, 0x03c2b3a6, 0x02a14303, 0x03cf68fa, 0x02de2065, 0x016a4226, 0x001793a4}}, Y: Field{[10]uint32{0x0398951e, 0x02128c6d, 0x032808d9, 0x0014fac9, 0x03f3395d, 0x0193d2cb, 0x01991f44, 0x014b9972, 0x02a25c7c, 0x000fcf0f}}}, + {X: Field{[10]uint32{0x03a74a7c, 0x011d357a, 0x0105ca5f, 0x02e88653, 0x01f743e6, 0x00293180, 0x011b3ad5, 0x027dcb25, 0x02cff4d6, 0x003751e0}}, Y: Field{[10]uint32{0x00977b99, 0x0304b208, 0x0281d6c7, 0x0247536c, 0x0205d3a7, 0x018a3630, 0x03dd6ae8, 0x03bdf178, 0x035e9854, 0x0025e9ee}}}, + {X: Field{[10]uint32{0x01adce36, 0x02026470, 0x02f0bcc0, 0x01044f92, 0x00281aff, 0x019a701f, 0x03945432, 0x0017b376, 0x02d54ab4, 0x002854c2}}, Y: Field{[10]uint32{0x0263e756, 0x01125612, 0x0168a774, 0x02dbf6ee, 0x01b18550, 0x038aa96c, 0x01dda781, 0x0210b977, 0x02212732, 0x003cf494}}}, + {X: Field{[10]uint32{0x0264719e, 0x035db2a7, 0x013234a2, 0x00cab639, 0x03e5ee0d, 0x00cabd92, 0x014523f2, 0x0393c018, 0x02f7b438, 0x00146493}}, Y: Field{[10]uint32{0x028a8095, 0x01631dc4, 0x00176268, 0x01563ab6, 0x03fdfe6e, 0x02d912fe, 0x036e82b8, 0x0136d59c, 0x01a811f9, 0x0021f045}}}, + {X: Field{[10]uint32{0x03fada6e, 0x03555a14, 0x03563a3b, 0x01701ae5, 0x016ac905, 0x03882a75, 0x03625d4b, 0x0361d041, 0x0268e137, 0x0020b3fb}}, Y: Field{[10]uint32{0x00733b7a, 0x019e61cc, 0x01cc06ff, 0x01e140a9, 0x02a363e9, 0x037b9e9c, 0x02804d76, 0x031471ca, 0x0246c4f5, 0x0037526a}}}, + {X: Field{[10]uint32{0x032e623a, 0x03f5f957, 0x03f30a4e, 0x03f4b30e, 0x02e02b70, 0x00db1f69, 0x021346b0, 0x03bd1016, 0x0076f7f1, 0x0028dce2}}, Y: Field{[10]uint32{0x0204a21a, 0x0365847a, 0x02edf368, 0x00d9606c, 0x02b1204d, 0x01200cc6, 0x00de46e5, 0x014acaf8, 0x012be1ea, 0x001965bd}}}, + {X: Field{[10]uint32{0x0180bcbc, 0x000d960a, 0x01d7dd82, 0x02cc62c3, 0x028d8382, 0x00b33c92, 0x0224fd6b, 0x00635cad, 0x02f7aec8, 0x002b9329}}, Y: Field{[10]uint32{0x018f1ae2, 0x02325eb7, 0x015e9237, 0x02586aa6, 0x03348155, 0x015322ee, 0x02a29f25, 0x01f15c78, 0x020335ad, 0x001a9eb6}}}, + {X: Field{[10]uint32{0x01d12732, 0x03df7ea2, 0x006b1400, 0x0250b614, 0x004d6ac8, 0x03732e72, 0x018d1984, 0x01d8be6c, 0x022bfa9d, 0x002f8cd5}}, Y: Field{[10]uint32{0x0075d442, 0x034b9ba5, 0x008fe473, 0x015a40c1, 0x01c4f5c9, 0x013a1d29, 0x0336cc21, 0x019a9cd4, 0x03b877c6, 0x002d99bb}}}, + {X: Field{[10]uint32{0x03c74446, 0x02e4b68d, 0x01ecf37c, 0x007c1711, 0x03f38289, 0x02983fda, 0x003b2888, 0x00f6e14c, 0x02d9815b, 0x00275f69}}, Y: Field{[10]uint32{0x015b12a8, 0x00ada35d, 0x001ac540, 0x003627f3, 0x00df3d2c, 0x02d04f51, 0x01f6d734, 0x016f8398, 0x007372ba, 0x0011b0a4}}}, + {X: Field{[10]uint32{0x030d4d3f, 0x02a77d0e, 0x02366b62, 0x03edf266, 0x020b5981, 0x02edecef, 0x02028498, 0x030af301, 0x0131e513, 0x000e48cf}}, Y: Field{[10]uint32{0x0116dfd8, 0x038e136e, 0x03c81f97, 0x012ea6bf, 0x001ec57d, 0x0187e9dd, 0x00ac3e1c, 0x03a93d36, 0x017c92e0, 0x003f09e1}}}, + {X: Field{[10]uint32{0x037768be, 0x039450f6, 0x004b43f7, 0x00cea0b6, 0x02547e6f, 0x02d63d06, 0x00d02dd7, 0x03a0ec16, 0x0388db90, 0x0016f8b5}}, Y: Field{[10]uint32{0x03de1026, 0x0127cbdb, 0x00875b90, 0x01ae6899, 0x03d585ef, 0x0213edb3, 0x01396f2e, 0x03e8cf9c, 0x03a86b2d, 0x0002e33c}}}, + {X: Field{[10]uint32{0x00f162ac, 0x01e187a2, 0x035d682f, 0x02f8e09f, 0x027c53a0, 0x01c011e7, 0x03600c25, 0x02853044, 0x01e8191f, 0x000ffd67}}, Y: Field{[10]uint32{0x01c77ba2, 0x01730c8b, 0x024dfd81, 0x03ed79e6, 0x0308ae4e, 0x009e6847, 0x03f5f60c, 0x02db9efb, 0x01856ab0, 0x00009756}}}, + {X: Field{[10]uint32{0x019a256f, 0x01d6f05c, 0x01b5875f, 0x029398c1, 0x00b61a18, 0x02803e36, 0x02d9475d, 0x00648262, 0x0030ed22, 0x00207727}}, Y: Field{[10]uint32{0x014682a5, 0x01e34a3d, 0x03fc2ca6, 0x00913503, 0x009cccf0, 0x01a6897e, 0x038f9c98, 0x032c9e9b, 0x005e5c44, 0x000a5c1d}}}, + {X: Field{[10]uint32{0x0370e9da, 0x0168f926, 0x00d24f76, 0x010eedea, 0x02ea3869, 0x00c353d2, 0x036121b2, 0x01026455, 0x0216579c, 0x002e8f87}}, Y: Field{[10]uint32{0x02c72f4e, 0x02088d8c, 0x02abd90f, 0x039956ae, 0x0154eb0d, 0x034c39ec, 0x01d8d9c7, 0x03e99e2a, 0x0008653c, 0x00287bae}}}, + {X: Field{[10]uint32{0x03f854f8, 0x02271220, 0x0304ca05, 0x0250ee5b, 0x01fa66d1, 0x02df479a, 0x01f52a51, 0x02bb8450, 0x028150fa, 0x0000d7ff}}, Y: Field{[10]uint32{0x01366fad, 0x03422a32, 0x00dc9b7d, 0x018c181c, 0x00b4ad31, 0x03c44170, 0x00a09b8d, 0x01b74ff3, 0x0022e83f, 0x00359a86}}}, + {X: Field{[10]uint32{0x00763a06, 0x0142ab58, 0x00f685b9, 0x038f95c9, 0x038b50d7, 0x00e2e605, 0x0214c0ae, 0x03e5c870, 0x00221435, 0x000e63af}}, Y: Field{[10]uint32{0x00811f46, 0x016e0120, 0x03011682, 0x021c5240, 0x0115551b, 0x030b233a, 0x00d4da7f, 0x03baaff3, 0x009d0eb2, 0x0030b7d5}}}, + {X: Field{[10]uint32{0x00a89e96, 0x0284e243, 0x01a0d6cf, 0x00aa913f, 0x029ca89d, 0x01397387, 0x018511a8, 0x029d7474, 0x0333e7d0, 0x000ae89f}}, Y: Field{[10]uint32{0x017cf4a7, 0x02d98ae6, 0x02f19c6b, 0x0153f304, 0x0045c2ac, 0x02472845, 0x039946cc, 0x01d70e3c, 0x004b8323, 0x001408da}}}, + {X: Field{[10]uint32{0x01e829c2, 0x034547be, 0x0014465c, 0x00fbc7fc, 0x032b5497, 0x014c60ba, 0x02cd4856, 0x007e4813, 0x023e7ec5, 0x001095c1}}, Y: Field{[10]uint32{0x01232c1c, 0x01518ad5, 0x015d747c, 0x016a04ab, 0x00919f8b, 0x01a6af59, 0x009ab35b, 0x00145447, 0x034116dd, 0x0011cd47}}}, + {X: Field{[10]uint32{0x034063a8, 0x03c5cb66, 0x006ebe3e, 0x025623b9, 0x0180da81, 0x00b95946, 0x0218582d, 0x03295a50, 0x03c1b5b3, 0x001df9cd}}, Y: Field{[10]uint32{0x01d1587a, 0x038830a2, 0x007b50e0, 0x017135ec, 0x03651ae4, 0x032e44b8, 0x008d4f11, 0x0262b4df, 0x01c5e667, 0x0003df2d}}}, + {X: Field{[10]uint32{0x00cdaa4f, 0x03bb1e8d, 0x028c44a7, 0x010d1ed7, 0x01ef027d, 0x02932dcb, 0x02f98b82, 0x02307ef7, 0x024d7101, 0x0037f2ed}}, Y: Field{[10]uint32{0x03972a23, 0x02c31765, 0x01a92e06, 0x0160b72a, 0x01bc2f4e, 0x014713c2, 0x03379e87, 0x01d6222b, 0x01bcc720, 0x0037f033}}}, + {X: Field{[10]uint32{0x0355ae8a, 0x0258ab74, 0x00e78ce6, 0x0388a94b, 0x01b39855, 0x011b5c62, 0x02c52567, 0x007a38ca, 0x02d0a787, 0x0023ada1}}, Y: Field{[10]uint32{0x00cc30da, 0x038cc71b, 0x02a5ed71, 0x01d5ba29, 0x0389b796, 0x0308b17e, 0x00afe424, 0x00a0dff4, 0x0211fec5, 0x003aa2cd}}}, + {X: Field{[10]uint32{0x02cc3e54, 0x025ac74d, 0x0298785a, 0x00b6fa9e, 0x02ee5652, 0x0313083f, 0x02703ff8, 0x00b754c5, 0x0313ebaf, 0x00345f61}}, Y: Field{[10]uint32{0x01c10b54, 0x007616f7, 0x038b5682, 0x01c9391b, 0x00e9fdb8, 0x03e25074, 0x00a7a19b, 0x018b2a76, 0x03e86d78, 0x003a9c2d}}}, + {X: Field{[10]uint32{0x00b3ba89, 0x000df88c, 0x02cfa3ec, 0x007e0b35, 0x02249c47, 0x0053bbb6, 0x02d28e9c, 0x00287215, 0x03e6ae05, 0x001f531d}}, Y: Field{[10]uint32{0x0265fe60, 0x01cffa58, 0x027bcea7, 0x0230f686, 0x01900ad6, 0x009f440b, 0x0180f393, 0x037e4d2c, 0x0253f5fb, 0x0031681d}}}, + {X: Field{[10]uint32{0x017ebcab, 0x014306d3, 0x01e88f4f, 0x03b4378e, 0x003721dc, 0x02c942f3, 0x021d51b3, 0x0179a1b5, 0x0109451e, 0x00258e04}}, Y: Field{[10]uint32{0x00801b64, 0x01745959, 0x003947f1, 0x00529c8a, 0x0209f065, 0x035bc3f9, 0x017642bd, 0x032951fc, 0x0019b088, 0x0025263d}}}, + {X: Field{[10]uint32{0x038c2ba7, 0x02be42a5, 0x00d208af, 0x020ff68f, 0x0385f44e, 0x023d3a54, 0x02da8f2f, 0x00f5cdec, 0x01505435, 0x001d002d}}, Y: Field{[10]uint32{0x01909771, 0x022ab9ff, 0x008be6b1, 0x00749d41, 0x02e36bed, 0x036c7572, 0x0129a04c, 0x00d9df88, 0x00a3ce50, 0x00264ceb}}}, + {X: Field{[10]uint32{0x026ff59f, 0x00792e81, 0x01be2a01, 0x030e4ed4, 0x00d1de3b, 0x03c4baf6, 0x02f59639, 0x02ff49c7, 0x0011fff7, 0x000f5ec3}}, Y: Field{[10]uint32{0x02404b9d, 0x007133cc, 0x01789b79, 0x00bdd51a, 0x008bddb1, 0x02a21851, 0x01eb57d8, 0x02839738, 0x00317f7c, 0x002d8e5d}}}, + {X: Field{[10]uint32{0x01c46328, 0x01bd33d9, 0x0343c5cd, 0x0377f78d, 0x0245d128, 0x03237665, 0x03125455, 0x01fc5398, 0x01ec7ebf, 0x00125136}}, Y: Field{[10]uint32{0x00589996, 0x009c6fcb, 0x01d1f5bf, 0x036449b2, 0x035c2f49, 0x02747cf4, 0x01cd408c, 0x02bb04ca, 0x019313ba, 0x003c1954}}}, + {X: Field{[10]uint32{0x01bdecf1, 0x0391b49e, 0x00b5189c, 0x00cda6eb, 0x01f37b99, 0x03822cd5, 0x0207d6d8, 0x02c743e1, 0x032b4764, 0x00265810}}, Y: Field{[10]uint32{0x03160ebd, 0x02b15ac1, 0x0386578f, 0x03e37aea, 0x03f7e1a9, 0x030852b7, 0x0200ea9e, 0x034be8a4, 0x034c0921, 0x000c13ae}}}, + {X: Field{[10]uint32{0x033de4d6, 0x0212a8ee, 0x0281d9ca, 0x01658cc5, 0x019196cc, 0x009ad77b, 0x03409cc7, 0x015963f0, 0x035b6358, 0x000c4fd4}}, Y: Field{[10]uint32{0x016c9716, 0x01024bf1, 0x01fb3dd6, 0x03fe3266, 0x0159b049, 0x0007fd3c, 0x0323bcfd, 0x0383af97, 0x008aa55f, 0x00394469}}}, + {X: Field{[10]uint32{0x008ed7b2, 0x03c0d315, 0x01bcb3cc, 0x03597004, 0x00c99478, 0x03d3dd3b, 0x01b9006e, 0x01b7036e, 0x006f8cd3, 0x00217116}}, Y: Field{[10]uint32{0x03434229, 0x02d34416, 0x01f63a75, 0x01699d8e, 0x00144c8c, 0x03e6c01c, 0x02325923, 0x0175b371, 0x03c0045c, 0x00335a54}}}, + {X: Field{[10]uint32{0x00671af8, 0x01c1be65, 0x0251d21d, 0x0036d935, 0x03d489b2, 0x01ce07ba, 0x01b668db, 0x00d6747b, 0x02d2a7fc, 0x0025a2f1}}, Y: Field{[10]uint32{0x00725186, 0x02f6df3c, 0x033ce0d0, 0x03f02d4b, 0x02de88bc, 0x0396545f, 0x032f3304, 0x01c1f306, 0x02a3723d, 0x003ec2b5}}}, + {X: Field{[10]uint32{0x0328985d, 0x023158ef, 0x024200e5, 0x03373fda, 0x0326d343, 0x01bb03a1, 0x00c72215, 0x039dfb9b, 0x00eb3722, 0x0008c96b}}, Y: Field{[10]uint32{0x038d39e1, 0x03323fe1, 0x03a5a21a, 0x03f7a06e, 0x0019b9c8, 0x03cfa7bb, 0x02596836, 0x0165e3ca, 0x0353dd29, 0x0018069f}}}, + {X: Field{[10]uint32{0x03acd2e4, 0x001ff759, 0x01dff054, 0x00d61f0c, 0x024b1c93, 0x02abcca9, 0x00667f99, 0x00efab70, 0x02abb231, 0x00231b9d}}, Y: Field{[10]uint32{0x0250c29f, 0x01444b47, 0x02a46b3f, 0x00b8d036, 0x023d7bb9, 0x00a6ce43, 0x03b19c42, 0x037ceb24, 0x0050d422, 0x0009f8ee}}}, + {X: Field{[10]uint32{0x0236748f, 0x03508c17, 0x037af9d8, 0x02a22e60, 0x000352e7, 0x0354e285, 0x02b2c728, 0x0234f935, 0x02313446, 0x0038c7fb}}, Y: Field{[10]uint32{0x010309be, 0x02686c9b, 0x00139e41, 0x00f8a035, 0x0237f9df, 0x02684078, 0x03974f6b, 0x0123e24d, 0x02e12d19, 0x00226c25}}}, + {X: Field{[10]uint32{0x00d306c6, 0x0305f52c, 0x02981215, 0x02c19eb8, 0x00da748a, 0x03968ce6, 0x0342fdd7, 0x0012d1f1, 0x006e8494, 0x00165ad6}}, Y: Field{[10]uint32{0x02a0a16b, 0x03863e18, 0x02791ff6, 0x0180acb3, 0x012ac277, 0x036b7c86, 0x00e8f05e, 0x031c4579, 0x00c5912c, 0x003a5b17}}}, + {X: Field{[10]uint32{0x01aa1c02, 0x01492185, 0x03317714, 0x028e0c4f, 0x03d453d5, 0x006549c3, 0x019c3b71, 0x00032e86, 0x01675cf5, 0x00080330}}, Y: Field{[10]uint32{0x0320ce61, 0x01e73d54, 0x024b3e7b, 0x013b05f7, 0x011905e2, 0x024900dc, 0x005c1334, 0x010a7191, 0x00c87e34, 0x001e02ab}}}, + {X: Field{[10]uint32{0x02d2025f, 0x017a774a, 0x01767dfb, 0x01be04cc, 0x0370f0e9, 0x01e93c91, 0x01148f87, 0x007f3c1e, 0x0032e10e, 0x001f9355}}, Y: Field{[10]uint32{0x03aa432a, 0x02d49458, 0x0136eec0, 0x03284f8c, 0x01fa58f0, 0x0105e60b, 0x03f5fd7d, 0x00a0dfcd, 0x03b26ee8, 0x000d7d76}}}, + {X: Field{[10]uint32{0x000237b7, 0x02edef67, 0x030e5776, 0x01e4d4a1, 0x00ff21f8, 0x01bac430, 0x038f800b, 0x01f9b9e9, 0x010895c9, 0x00307b5d}}, Y: Field{[10]uint32{0x03418fb9, 0x005063fa, 0x01bb1d8b, 0x02565c82, 0x01a38e80, 0x013ffb0f, 0x031e89f6, 0x02aa2670, 0x02068dc0, 0x00241c8e}}}, + {X: Field{[10]uint32{0x02104770, 0x0339cc2c, 0x018defc7, 0x02b9a55b, 0x029948dd, 0x00576374, 0x01239b2a, 0x02027e0f, 0x02e8a53e, 0x00397f52}}, Y: Field{[10]uint32{0x031c4fa2, 0x00bc37bd, 0x0112ade0, 0x03d77d30, 0x03050c7b, 0x017cb76e, 0x00e8ebd3, 0x00865c82, 0x029c1cbb, 0x001a9376}}}, + {X: Field{[10]uint32{0x0251f30d, 0x01bab076, 0x03f2ca76, 0x0057d9cc, 0x03e3534d, 0x00be7b3b, 0x0372cdb4, 0x02f621ea, 0x01f24b33, 0x0000f39d}}, Y: Field{[10]uint32{0x02838ed7, 0x03c132c6, 0x0136213b, 0x02334f72, 0x01a43eb4, 0x00a2bd56, 0x00e9b5d8, 0x03db898b, 0x015b51dd, 0x0027b68c}}}, + {X: Field{[10]uint32{0x0013391c, 0x033bcee2, 0x01d34ad8, 0x02a23867, 0x00527fb9, 0x01fb7d66, 0x018d8ce7, 0x00735392, 0x004f33a8, 0x00263013}}, Y: Field{[10]uint32{0x038bd3a7, 0x03c185ff, 0x01949483, 0x00ea3fc8, 0x03acb484, 0x00158255, 0x0371c463, 0x03e04bd0, 0x0167f853, 0x003f4af3}}}, + {X: Field{[10]uint32{0x0287bbf3, 0x02281e42, 0x001b10fc, 0x00a1b905, 0x01f3d2dd, 0x004f390f, 0x00e62f84, 0x032c1b2f, 0x00882906, 0x000143a7}}, Y: Field{[10]uint32{0x002fa3fb, 0x01890f36, 0x00a9ce1c, 0x0168bcf2, 0x02479a61, 0x028111d2, 0x01eefb2b, 0x006731a1, 0x013bb05f, 0x00010f1c}}}, + {X: Field{[10]uint32{0x03adf2d1, 0x022a0c50, 0x023a2eeb, 0x0190a9cf, 0x0071bf65, 0x03c86ddb, 0x00faa663, 0x0378ec19, 0x0217458b, 0x0017506e}}, Y: Field{[10]uint32{0x03b6cec5, 0x031117d5, 0x0351087c, 0x029da1d8, 0x0307f64f, 0x01eac163, 0x039e22b0, 0x008564ac, 0x0054b308, 0x0005fbff}}}, + {X: Field{[10]uint32{0x00d5b077, 0x00e3e749, 0x023e789d, 0x018191bf, 0x026b34cc, 0x0364b81d, 0x003cb8e1, 0x0164edba, 0x00bf2a02, 0x00138ccb}}, Y: Field{[10]uint32{0x039e1f95, 0x00aa1679, 0x01955c8b, 0x00f77b34, 0x01744ad0, 0x0278e478, 0x03699859, 0x000c0256, 0x005c3ab9, 0x00143e9d}}}, + {X: Field{[10]uint32{0x01a2dae9, 0x005baecd, 0x013f8347, 0x01f3776d, 0x03c83cd4, 0x00d04141, 0x017455e4, 0x02096f0d, 0x029d27ee, 0x0006efd8}}, Y: Field{[10]uint32{0x01e9bb75, 0x03ea250f, 0x0370971f, 0x01a58074, 0x018fb72f, 0x002f6179, 0x000070ec, 0x014fcd3d, 0x00c1e997, 0x00214242}}}, + {X: Field{[10]uint32{0x01cde650, 0x03d6c06d, 0x01b8aa25, 0x026f71e7, 0x0023aece, 0x03af72cc, 0x00cb3f5d, 0x0358aab4, 0x02eff9db, 0x002a4526}}, Y: Field{[10]uint32{0x00c327bd, 0x03c2fdad, 0x01a79918, 0x02318766, 0x02ae3c14, 0x037da1b5, 0x00a16d09, 0x00447d1a, 0x0346e6db, 0x0029eed2}}}, + {X: Field{[10]uint32{0x01b72a71, 0x0385c87f, 0x0037ffc5, 0x0375d7e0, 0x03b98ffc, 0x02c876b2, 0x01e5b406, 0x03590867, 0x01ee0185, 0x00200402}}, Y: Field{[10]uint32{0x03e26441, 0x00b96bcd, 0x010f2daf, 0x00162619, 0x01382839, 0x01171d7c, 0x0136f706, 0x02b5b077, 0x020957c7, 0x003a0859}}}, + {X: Field{[10]uint32{0x00ba6770, 0x01a2a1b0, 0x0068ab73, 0x00e4e401, 0x0096c6b6, 0x01bc4cbb, 0x02345846, 0x03d9e82c, 0x019ae466, 0x00301c3a}}, Y: Field{[10]uint32{0x00769362, 0x01124154, 0x00171a15, 0x033e703c, 0x03be6f8f, 0x02ca47ff, 0x016f77e3, 0x013d5a29, 0x03df358d, 0x00220fea}}}, + {X: Field{[10]uint32{0x00109f4a, 0x017fc7d5, 0x039da71c, 0x014c77fd, 0x018e028c, 0x0342be68, 0x03549a9e, 0x009d85e3, 0x0239cf61, 0x001afa25}}, Y: Field{[10]uint32{0x0204cf14, 0x017f6ce5, 0x02e0d821, 0x03c5b5d9, 0x00ff2dd6, 0x03e65c31, 0x0292f38f, 0x0244c49a, 0x017ddd37, 0x001ddebb}}}, + {X: Field{[10]uint32{0x0224ce8c, 0x016bf165, 0x01009219, 0x0014ae76, 0x03100945, 0x036ec6a1, 0x0052e796, 0x00792808, 0x01d41ce7, 0x00347f4c}}, Y: Field{[10]uint32{0x013fded1, 0x00425249, 0x01a2e5b5, 0x02aba8af, 0x0136d5f2, 0x02183979, 0x02796d91, 0x000a77aa, 0x03d378a8, 0x003cd5ea}}}, + {X: Field{[10]uint32{0x03169d9e, 0x0351a6e3, 0x010337ae, 0x022bab66, 0x02614c32, 0x02909a65, 0x01e617c0, 0x03c52cf3, 0x002d66fe, 0x0007214e}}, Y: Field{[10]uint32{0x038a71f9, 0x02257bc1, 0x01113a8f, 0x0137f6fe, 0x01e2406a, 0x01c9f669, 0x018702ab, 0x039aa13d, 0x031cb236, 0x0016316b}}}, + {X: Field{[10]uint32{0x0336b5ea, 0x03b7f653, 0x0212e272, 0x02dd0f2e, 0x03eec32c, 0x0304a2b5, 0x025c2d52, 0x019edd0b, 0x01edd5fd, 0x000b63ea}}, Y: Field{[10]uint32{0x032cd37d, 0x026b4763, 0x0331f0aa, 0x0103de01, 0x02231453, 0x0325930c, 0x0133af4b, 0x00a827e5, 0x033937eb, 0x001c6c57}}}, + {X: Field{[10]uint32{0x03dbafb4, 0x00e048b7, 0x00c954c5, 0x031a1c0c, 0x0240ceb1, 0x014376f7, 0x00d0a159, 0x031659c0, 0x0379d9f6, 0x0013d448}}, Y: Field{[10]uint32{0x0248c05b, 0x01f020d0, 0x01674c7f, 0x03ef80e0, 0x034b320a, 0x01f76159, 0x0061980c, 0x037d7aea, 0x0305f864, 0x001537a6}}}, + {X: Field{[10]uint32{0x01e7cd1c, 0x02348b36, 0x02834016, 0x0173b64f, 0x032c6999, 0x0350fb28, 0x02609496, 0x00b08563, 0x01ba4856, 0x002697e4}}, Y: Field{[10]uint32{0x0322b86b, 0x0034aa6d, 0x036382d4, 0x00fb84bd, 0x0129bfa3, 0x02b3e714, 0x01b11266, 0x03b28b80, 0x03ecc668, 0x0027e228}}}, + {X: Field{[10]uint32{0x02f9f610, 0x01df7614, 0x03cf0065, 0x03f83563, 0x01d84d54, 0x020cedd7, 0x00cc6b6e, 0x03eb9313, 0x0102d417, 0x003768c1}}, Y: Field{[10]uint32{0x015469a1, 0x036ff045, 0x02b0c5d4, 0x01e9b1fe, 0x0207f4c5, 0x000b8a90, 0x005468d1, 0x019079b5, 0x01da2e74, 0x003eee23}}}, + {X: Field{[10]uint32{0x0326e117, 0x036978d6, 0x025e8e88, 0x02c58635, 0x000600df, 0x00c7397d, 0x00e50cc6, 0x00507612, 0x027c5586, 0x00234ba7}}, Y: Field{[10]uint32{0x0251aa86, 0x0287b400, 0x009a9e33, 0x02f3dd8f, 0x02bb72fa, 0x0170a955, 0x01ab4fd8, 0x01f15355, 0x01ecffd6, 0x0026270e}}}, + {X: Field{[10]uint32{0x001ee995, 0x029f2a59, 0x01bbfa27, 0x03378f56, 0x0310c911, 0x00f47689, 0x031cee1c, 0x00f5b2c1, 0x0076e6b6, 0x001c9b38}}, Y: Field{[10]uint32{0x010af9c1, 0x02588b98, 0x015951c4, 0x02043522, 0x0206ea5e, 0x022ad74d, 0x02d01acd, 0x03e34d34, 0x02a0c91f, 0x0013906e}}}, + {X: Field{[10]uint32{0x02a43a1a, 0x02eb366f, 0x017aa27d, 0x01c7b4ba, 0x02c0d429, 0x027a5418, 0x02c0dc2c, 0x000f4fee, 0x01fe1835, 0x0037af24}}, Y: Field{[10]uint32{0x022d2f11, 0x01e8ccef, 0x00100d49, 0x0323fda2, 0x026dfdf3, 0x0357c9b9, 0x03b2ab80, 0x033a6bcc, 0x0315a6fe, 0x0004d64d}}}, + {X: Field{[10]uint32{0x00fd4b28, 0x017a443c, 0x00f41c58, 0x013b5ac9, 0x03237c79, 0x01cbfcb5, 0x0039e8c4, 0x012ae39c, 0x03357791, 0x00314e50}}, Y: Field{[10]uint32{0x0126087b, 0x01bf1533, 0x0310d1fc, 0x03da691c, 0x0123c26c, 0x002a8a83, 0x03041128, 0x027139ec, 0x019b628a, 0x000a014d}}}, + {X: Field{[10]uint32{0x005f29b0, 0x022f1e68, 0x00e1cc99, 0x00412fb9, 0x0072b818, 0x022a3ebb, 0x02bf1fbe, 0x0002c600, 0x02fd33c3, 0x00268a24}}, Y: Field{[10]uint32{0x01186e33, 0x03dcbfd1, 0x00bebb37, 0x0177d7ea, 0x00553870, 0x01738df3, 0x02ebc53a, 0x0004d948, 0x023bc2fa, 0x00265fc4}}}, + {X: Field{[10]uint32{0x039a351a, 0x0160412c, 0x0279f4c5, 0x02ff5cf7, 0x001503bb, 0x0382fc60, 0x017fe427, 0x013ef9fb, 0x00ac0f22, 0x0035288b}}, Y: Field{[10]uint32{0x02ce752b, 0x02bdae0e, 0x02860341, 0x00442a0b, 0x02232603, 0x01238d1a, 0x01133495, 0x00b824a9, 0x02973062, 0x00209a3f}}}, + {X: Field{[10]uint32{0x00c11659, 0x01653ee7, 0x0003c077, 0x02ee1df7, 0x0111d4d2, 0x001c27ee, 0x0014963b, 0x02f87635, 0x03ff15ad, 0x0012933c}}, Y: Field{[10]uint32{0x01ced874, 0x03b75834, 0x0336fc2d, 0x002f0e7f, 0x035109a3, 0x03a992b4, 0x00418100, 0x0254a989, 0x018336f1, 0x0015f211}}}, + {X: Field{[10]uint32{0x018e1539, 0x026fc305, 0x02f441f6, 0x009e1c72, 0x00e85e0b, 0x00b28992, 0x00836cf4, 0x0354c263, 0x00edb580, 0x0016303b}}, Y: Field{[10]uint32{0x0042467e, 0x005e0fba, 0x03fd7412, 0x0027e847, 0x0292e54a, 0x000b346a, 0x023d36f7, 0x02f25139, 0x00491e1d, 0x003abde7}}}, + {X: Field{[10]uint32{0x024892bb, 0x03326fdc, 0x0016f634, 0x0009fd39, 0x03261323, 0x03961a8c, 0x02154f3f, 0x01fa24e2, 0x00e8a60c, 0x002c3ef4}}, Y: Field{[10]uint32{0x02a5d3c3, 0x00cc31e0, 0x03d079a0, 0x024c4df0, 0x026dd83f, 0x0012662e, 0x00fcb501, 0x03d036d5, 0x027d6757, 0x0009ee9d}}}, + {X: Field{[10]uint32{0x0192f0d3, 0x01b630b6, 0x000818c1, 0x03de132d, 0x00ee90c2, 0x013bc611, 0x01fecf3e, 0x004d6849, 0x012a26b0, 0x002a52b8}}, Y: Field{[10]uint32{0x018e2050, 0x0229d808, 0x03c95bbc, 0x00d8221d, 0x02e046fe, 0x02ee8f59, 0x0016a6f6, 0x01d6571e, 0x03ba665e, 0x0028dd11}}}, + {X: Field{[10]uint32{0x00dcbeb5, 0x02f8c223, 0x02eeb9ad, 0x0101cc16, 0x00c540e2, 0x03e40137, 0x036c4844, 0x013eb8ca, 0x009b3eb7, 0x00232f6c}}, Y: Field{[10]uint32{0x00c932fe, 0x01cb3d0d, 0x023b810e, 0x01146d27, 0x01912df7, 0x0139685a, 0x007b14c0, 0x03bf4bfc, 0x03a291f6, 0x0000ae18}}}, + {X: Field{[10]uint32{0x00cdbac8, 0x00e721cd, 0x03afcf8f, 0x0071034d, 0x020ab313, 0x01422af5, 0x02fb89ed, 0x03af8731, 0x02c3b70e, 0x000fe33e}}, Y: Field{[10]uint32{0x0158b65e, 0x0124e84b, 0x01321f0c, 0x021ed10f, 0x01a68b52, 0x0122592d, 0x00b303db, 0x03c975e5, 0x0111846e, 0x0036ec08}}}, + {X: Field{[10]uint32{0x0315b25b, 0x01f69837, 0x004b9054, 0x0136ceb2, 0x0331fcaf, 0x020598c2, 0x03e9a4e1, 0x039e704b, 0x00e0cea3, 0x002d8581}}, Y: Field{[10]uint32{0x01b86801, 0x03a7660a, 0x0192cea2, 0x02224063, 0x00317d53, 0x02849929, 0x0265b41b, 0x03e96d59, 0x03ad9ea0, 0x0006abca}}}, + {X: Field{[10]uint32{0x011327d7, 0x021bbc11, 0x00a3f07c, 0x028d9347, 0x02fa51bd, 0x03ef5a2d, 0x026630a7, 0x02ce3870, 0x00103c6a, 0x003ac39d}}, Y: Field{[10]uint32{0x00e82e6d, 0x01a05eb8, 0x037d44c3, 0x0330bb8d, 0x0045cdaa, 0x027edd0e, 0x001c9c7d, 0x034f0655, 0x001757c4, 0x0037e814}}}, + {X: Field{[10]uint32{0x0156b7ae, 0x0342fda5, 0x0144f4bc, 0x01f92c95, 0x031fcfdd, 0x01d8b012, 0x02d28126, 0x03993236, 0x0103be51, 0x0018dbf1}}, Y: Field{[10]uint32{0x013f4cd9, 0x021c0e8c, 0x011e6984, 0x0375414b, 0x02b633c8, 0x022df621, 0x03b6735a, 0x010525fc, 0x030f0510, 0x0015ee0e}}}, + {X: Field{[10]uint32{0x012ab330, 0x031cd639, 0x02288c15, 0x01953a8f, 0x005ba9dc, 0x034b7867, 0x02fc2bd1, 0x008d6f1a, 0x00ec4d42, 0x000bf31c}}, Y: Field{[10]uint32{0x016a30ce, 0x01df9949, 0x01069395, 0x03a09467, 0x0135bde8, 0x03f36da5, 0x024cbbfc, 0x00788b6d, 0x00182bfa, 0x001a8d58}}}, + {X: Field{[10]uint32{0x02a94b54, 0x0043889f, 0x007d01cd, 0x0396f56f, 0x0183be81, 0x01af7ea5, 0x00969ebd, 0x02e2ff6e, 0x02c38d38, 0x00045401}}, Y: Field{[10]uint32{0x0080e08a, 0x01687508, 0x02780250, 0x00e9cc94, 0x023fac02, 0x01ba1e00, 0x0339e83f, 0x00feea6b, 0x010216eb, 0x001810eb}}}, + {X: Field{[10]uint32{0x01b3aaf1, 0x0194fca3, 0x019a515b, 0x021afb70, 0x013756a9, 0x03f95340, 0x00a2da82, 0x0070a583, 0x025a15ba, 0x00005f55}}, Y: Field{[10]uint32{0x03c7399c, 0x012b5ea6, 0x00c35f27, 0x0064cd4d, 0x027a6338, 0x0274c494, 0x00b05aab, 0x002cf92e, 0x01dd4204, 0x00245eee}}}, + {X: Field{[10]uint32{0x03221ef2, 0x01d31b5a, 0x0330e023, 0x022ad20b, 0x01d2af8f, 0x00f96f2a, 0x00598f7a, 0x00710c2e, 0x00898850, 0x00037309}}, Y: Field{[10]uint32{0x03652e72, 0x01919193, 0x02b0a578, 0x02d667c7, 0x01cd14ca, 0x03c037b3, 0x03102a6e, 0x03b14ac7, 0x017dd5c6, 0x002a165d}}}, + {X: Field{[10]uint32{0x011f0b0f, 0x00fea3cd, 0x03a03d83, 0x030f50f2, 0x03ae2cf9, 0x03a0229f, 0x01919db6, 0x00c2df37, 0x039f4e94, 0x0029a2ca}}, Y: Field{[10]uint32{0x00786526, 0x0096f165, 0x00f66d65, 0x0137cbe7, 0x017f45b1, 0x009de008, 0x015614d9, 0x00248e3a, 0x0232d3ad, 0x0038d2e2}}}, + {X: Field{[10]uint32{0x010e9462, 0x0020a7e3, 0x013c2319, 0x005d1c0b, 0x01fe7e2f, 0x02b5654e, 0x02d11e9e, 0x00466174, 0x025a938e, 0x000be553}}, Y: Field{[10]uint32{0x03b16dd5, 0x02ac79c2, 0x02c61e55, 0x02fe7e26, 0x01f6aaa6, 0x01a8e4ec, 0x02fecc84, 0x01f502e8, 0x0379fa8b, 0x002cbc34}}}, + {X: Field{[10]uint32{0x027ffe4f, 0x00e4e330, 0x03556fa9, 0x0234f33f, 0x033cc33c, 0x02ecb77a, 0x03fcae86, 0x0253f66c, 0x01136bca, 0x00088f4f}}, Y: Field{[10]uint32{0x01512915, 0x01329614, 0x00ec09c7, 0x02294eed, 0x0327f6cd, 0x00f58866, 0x016f7dd8, 0x0061f309, 0x0106e317, 0x0021f864}}}, + {X: Field{[10]uint32{0x028f7b2e, 0x020d2b67, 0x02abf517, 0x00ae83ce, 0x00b61443, 0x02d3d257, 0x01f3a3e9, 0x0186d90f, 0x00e82911, 0x00156476}}, Y: Field{[10]uint32{0x026d07c2, 0x03bd6503, 0x01416673, 0x01fb1028, 0x0130b3fe, 0x02e91c67, 0x03d454eb, 0x01f94b66, 0x0235f626, 0x000b235a}}}, + {X: Field{[10]uint32{0x01f29a29, 0x024dd451, 0x02252c8e, 0x0078b939, 0x03414184, 0x027a6bbe, 0x00cbaecb, 0x0068521c, 0x004ad15d, 0x003acb3f}}, Y: Field{[10]uint32{0x0052e5ac, 0x019c855c, 0x00b955bc, 0x0035b4d7, 0x00e62f21, 0x01d94054, 0x0304c79c, 0x03664ade, 0x020810bf, 0x001e2043}}}, + {X: Field{[10]uint32{0x00a3f74b, 0x0178fa7b, 0x0392700d, 0x01f4b867, 0x02bdcdb4, 0x00e7310d, 0x00b1d4c5, 0x02a06179, 0x03f99680, 0x001844b0}}, Y: Field{[10]uint32{0x00da4403, 0x03694ae6, 0x00f353b8, 0x01f1a9a4, 0x02f2579d, 0x007db2a5, 0x008f9d40, 0x022feb6b, 0x03dd723c, 0x001ba182}}}, + {X: Field{[10]uint32{0x03d58b16, 0x02477b69, 0x015797b3, 0x00535f8c, 0x03b9b329, 0x0283c5f0, 0x002c23b9, 0x0362c031, 0x00d8d552, 0x00224848}}, Y: Field{[10]uint32{0x01cf7941, 0x0008c5ad, 0x00edf325, 0x025b33c3, 0x03cc4a94, 0x02f7300d, 0x013d1f64, 0x01e3cbe4, 0x03acb3c7, 0x00398948}}}, + {X: Field{[10]uint32{0x03c4dc0a, 0x0347a447, 0x021c5ecb, 0x01245a11, 0x0160ca4a, 0x018c1129, 0x03155839, 0x034ef808, 0x0056217a, 0x0011d62d}}, Y: Field{[10]uint32{0x01d83679, 0x0121e336, 0x027ca960, 0x01ec0f13, 0x03bb7498, 0x030c2b06, 0x03eec6a1, 0x025cfc15, 0x015a4f30, 0x00267909}}}, + {X: Field{[10]uint32{0x025629da, 0x039d5d5b, 0x02143b99, 0x031f658b, 0x03a3b95d, 0x01e11e6b, 0x03a0c6f9, 0x01ea1e5f, 0x02a69a20, 0x002ac108}}, Y: Field{[10]uint32{0x01823faa, 0x01b8b8e9, 0x02dfa7a0, 0x01c12653, 0x0184af0f, 0x02e37f3b, 0x00280c32, 0x026157af, 0x010f00fc, 0x001cce63}}}, + {X: Field{[10]uint32{0x0145d227, 0x02b50fb5, 0x01b20ee7, 0x02983c28, 0x01852cc7, 0x020a4dd3, 0x010b4c35, 0x002c50c3, 0x032accb9, 0x00066010}}, Y: Field{[10]uint32{0x028b05c5, 0x023696e7, 0x01546766, 0x03e3cb94, 0x0069c919, 0x02e626f4, 0x03d1a0e9, 0x0233acab, 0x0073bfbc, 0x0025ab8e}}}, + {X: Field{[10]uint32{0x00e93f17, 0x01894bb8, 0x010cbb71, 0x0055d0f5, 0x0293b8a0, 0x02aefbcf, 0x0361cd72, 0x03eceb29, 0x037fe2df, 0x0010a204}}, Y: Field{[10]uint32{0x02238825, 0x0021b76a, 0x008de456, 0x0011679e, 0x0271fddb, 0x03681d9c, 0x01855f14, 0x019a9bef, 0x033e36c3, 0x00300b0c}}}, + {X: Field{[10]uint32{0x02b6cde2, 0x024a06b5, 0x03d3d52d, 0x01db836d, 0x0077e432, 0x02a9cfe9, 0x03c4d160, 0x0227682b, 0x003505bc, 0x003597eb}}, Y: Field{[10]uint32{0x0007383f, 0x01e11e30, 0x02b13056, 0x03906221, 0x038e9f07, 0x000e18b4, 0x01005456, 0x03ccded1, 0x0175a6c5, 0x0039bd32}}}, + {X: Field{[10]uint32{0x018f6ca7, 0x00665e2e, 0x014c843e, 0x021346ca, 0x02beb967, 0x0181e4db, 0x028b54e1, 0x0349e93f, 0x0144e62d, 0x001c0a6c}}, Y: Field{[10]uint32{0x0140a25c, 0x023ca99c, 0x0114aa47, 0x011f1cf7, 0x009a1af3, 0x0155113c, 0x02c90c38, 0x01b1b8e8, 0x01665805, 0x0022c43b}}}, + {X: Field{[10]uint32{0x039183b2, 0x0256d0f3, 0x01711502, 0x013911c5, 0x01fa343e, 0x01768306, 0x00ea87da, 0x026f77a0, 0x00ebdf96, 0x0013c9d8}}, Y: Field{[10]uint32{0x03e28167, 0x00a59de0, 0x03425d46, 0x017536bf, 0x0115d862, 0x023da6da, 0x001fd39b, 0x03bc27e8, 0x017bf3f9, 0x0010f8b0}}}, + {X: Field{[10]uint32{0x0374a5fc, 0x01c98570, 0x03e52143, 0x015fcbb9, 0x01b573ce, 0x02e7e94e, 0x015f0d23, 0x025aa3cd, 0x02addb41, 0x0033265a}}, Y: Field{[10]uint32{0x028ef28d, 0x027cb702, 0x019232c0, 0x02b6fffe, 0x0144284b, 0x02fa1744, 0x00a9cb66, 0x00a4d70c, 0x03871878, 0x002c7103}}}, + {X: Field{[10]uint32{0x014ade42, 0x010c0f35, 0x006313cf, 0x0214ef6b, 0x01cd9b32, 0x017adc24, 0x0038e398, 0x036416cb, 0x02d3f3e3, 0x0031e062}}, Y: Field{[10]uint32{0x00339eee, 0x01feebe5, 0x03937800, 0x03f747d7, 0x033403a5, 0x030510f3, 0x0363fb0f, 0x02142c51, 0x004e7bbb, 0x001555d3}}}, + {X: Field{[10]uint32{0x0189c4fd, 0x01d5cdc9, 0x0045e52a, 0x03279de5, 0x009a45db, 0x02b97496, 0x0344d1f3, 0x023affd0, 0x01846fc4, 0x001b340d}}, Y: Field{[10]uint32{0x03416e34, 0x03a33224, 0x00723a44, 0x024a34b5, 0x014d811c, 0x039347ea, 0x0367dda8, 0x038dc6b7, 0x037db165, 0x002bea16}}}, + {X: Field{[10]uint32{0x003b2e0a, 0x03aeeb51, 0x00fd3bfa, 0x02491d37, 0x00f5231b, 0x004548c5, 0x02b72359, 0x02c6b98c, 0x0205f716, 0x003594a8}}, Y: Field{[10]uint32{0x013bedcf, 0x02281bae, 0x02dcba45, 0x008fb059, 0x03c4646a, 0x03780f62, 0x002f0d85, 0x0103df2e, 0x0021b782, 0x00348661}}}, + {X: Field{[10]uint32{0x0052fb54, 0x0014be37, 0x02d73a6a, 0x02bf4d38, 0x0181ff0b, 0x00d00116, 0x01b3e4fe, 0x012877e6, 0x004dcd84, 0x002a01f4}}, Y: Field{[10]uint32{0x02e2cd9a, 0x0067a7e8, 0x03151af0, 0x011e5f3e, 0x00c385c0, 0x03eef1c6, 0x03e5079f, 0x0260d4ee, 0x00bb7393, 0x0006229e}}}, + {X: Field{[10]uint32{0x009eb2d7, 0x03f705f3, 0x02de224e, 0x017a7d33, 0x01b8c3a9, 0x01b2c0ae, 0x03acd07d, 0x02b523a4, 0x03bca5d6, 0x0007bf4a}}, Y: Field{[10]uint32{0x02745b39, 0x00fbbcd9, 0x01a05006, 0x02baa2bc, 0x0202a9d2, 0x02ecd5fd, 0x03e191a1, 0x031f98d5, 0x03881b98, 0x003e547b}}}, + {X: Field{[10]uint32{0x0395888f, 0x002e6b08, 0x01f666ed, 0x004df0ef, 0x030ea0ff, 0x025ff838, 0x02bcd044, 0x00f6d660, 0x0254d27d, 0x00016f17}}, Y: Field{[10]uint32{0x02ec3300, 0x03d97ca0, 0x003754c1, 0x01d409c4, 0x025a22d9, 0x00c86cda, 0x01f8b857, 0x03ac0598, 0x0002d4f4, 0x000d556f}}}, + {X: Field{[10]uint32{0x006a3247, 0x02e023dd, 0x02f221f5, 0x01c456f9, 0x02158cca, 0x022b4bc7, 0x022ea80e, 0x0234379b, 0x028d26b0, 0x0003d802}}, Y: Field{[10]uint32{0x03ca3523, 0x02ceac62, 0x00aa3cd5, 0x0371945b, 0x0276c753, 0x03a3846e, 0x02f75b28, 0x03e96c1f, 0x02134bc3, 0x0008ef96}}}, + {X: Field{[10]uint32{0x00ccaf7b, 0x00af49a4, 0x0381ae49, 0x030db1cf, 0x01f5119b, 0x0396404d, 0x01712a8b, 0x029ea331, 0x020b2ab2, 0x003f1f93}}, Y: Field{[10]uint32{0x001151a6, 0x03242ace, 0x01cddb31, 0x02d6aa0d, 0x01e4a682, 0x01b7624a, 0x02862b8a, 0x011a41ba, 0x02f41f27, 0x0012f584}}}, + {X: Field{[10]uint32{0x01442655, 0x00eced62, 0x01700bcd, 0x0161daaa, 0x0141641d, 0x01e6d8f9, 0x0067eecd, 0x03402feb, 0x033cfe12, 0x00144c97}}, Y: Field{[10]uint32{0x033ef941, 0x00de92c4, 0x03b33a44, 0x03964730, 0x03982a35, 0x01e595ff, 0x01623605, 0x039b8b6e, 0x00ad7b7a, 0x0035aa25}}}, + {X: Field{[10]uint32{0x0198aec8, 0x009b92b1, 0x03a09056, 0x01b6e3fb, 0x02afee9a, 0x005fc00e, 0x01bd2d57, 0x03d823c8, 0x00271a55, 0x000b6ceb}}, Y: Field{[10]uint32{0x03f9533e, 0x03832226, 0x03dd6e0d, 0x01a2d1f3, 0x013c6621, 0x0199827d, 0x00c9fc9d, 0x00718307, 0x0333a0c0, 0x003149af}}}, + {X: Field{[10]uint32{0x01fa7dcc, 0x03481775, 0x01be51e1, 0x00d8fce4, 0x0135fbd4, 0x01f790c8, 0x0305b554, 0x02c06d7a, 0x037293de, 0x00024201}}, Y: Field{[10]uint32{0x02d7442d, 0x01304097, 0x03f23e03, 0x02134f30, 0x0164dfef, 0x01718856, 0x013d318b, 0x00ccdc19, 0x02ac1724, 0x003fa587}}}, + {X: Field{[10]uint32{0x039ed9d6, 0x030def0c, 0x017cce2e, 0x02b4f4d6, 0x03045557, 0x01e43353, 0x02cc03f6, 0x013f20b6, 0x0181e5a6, 0x000ca86b}}, Y: Field{[10]uint32{0x027cb07a, 0x01c41898, 0x02cf3d13, 0x0362a41d, 0x0279cb55, 0x01e573b1, 0x017b63ca, 0x000089c2, 0x03681801, 0x0021eaf3}}}, + {X: Field{[10]uint32{0x019246f9, 0x01c745d3, 0x016e9a37, 0x027556ce, 0x0108c584, 0x01c745ea, 0x031af769, 0x02714683, 0x00fa5868, 0x003df2ea}}, Y: Field{[10]uint32{0x0358ee45, 0x01ee7b2b, 0x0072cac3, 0x030bf20c, 0x025309a0, 0x01757ee8, 0x024d7333, 0x02a72bb6, 0x03a910d5, 0x003d2c2a}}}, + {X: Field{[10]uint32{0x0329ea81, 0x022be098, 0x006d58ee, 0x0156b9c1, 0x03fab75f, 0x0015e690, 0x01b6b7bc, 0x00036759, 0x01042da9, 0x003369ac}}, Y: Field{[10]uint32{0x011771e3, 0x035bc773, 0x000fc068, 0x038a6b1f, 0x01a8ee20, 0x038d8078, 0x01171a01, 0x01d00568, 0x000eacfd, 0x001c321b}}}, + {X: Field{[10]uint32{0x027ee58b, 0x021e3c3d, 0x03f2ac23, 0x032b446d, 0x01a46f3b, 0x0113282f, 0x00f27b05, 0x02c73a6a, 0x024009c5, 0x00289869}}, Y: Field{[10]uint32{0x03fff888, 0x01b9043c, 0x014d420c, 0x030c1496, 0x0185da67, 0x034cf5c9, 0x029cda8f, 0x036ba6d3, 0x031d4c42, 0x000789a9}}}, + {X: Field{[10]uint32{0x01f4db57, 0x0252e9ba, 0x028846b3, 0x00f1a0bd, 0x009435aa, 0x007edb4d, 0x018e885d, 0x0210b300, 0x0167fd7f, 0x002f1c32}}, Y: Field{[10]uint32{0x00bd9468, 0x0213847e, 0x03e5718d, 0x03121f11, 0x013032ef, 0x01e195c0, 0x00a07840, 0x00b78310, 0x013a837e, 0x0028ae67}}}, + {X: Field{[10]uint32{0x0077a9c2, 0x000e269c, 0x020269c6, 0x019c4147, 0x02c7a265, 0x03ebc8d2, 0x03fdba3f, 0x00c52532, 0x02f75dc4, 0x000d9054}}, Y: Field{[10]uint32{0x0146d265, 0x0130ca81, 0x018eae08, 0x000496f3, 0x013c8fa6, 0x03b79c75, 0x038ae4e7, 0x02150cc0, 0x03d9f4ec, 0x002b0eb1}}}, + {X: Field{[10]uint32{0x00f3043d, 0x01b765a5, 0x01326cc3, 0x00be8f62, 0x01d82ca4, 0x01008b7e, 0x02f59d8e, 0x01756364, 0x00bed57d, 0x0014bfa9}}, Y: Field{[10]uint32{0x004feb35, 0x0150a363, 0x0399b249, 0x00216daa, 0x005708c6, 0x0299ece7, 0x038f9a37, 0x0229d7dc, 0x032852f9, 0x002dfa60}}}, + {X: Field{[10]uint32{0x023e1a4d, 0x035a08a1, 0x03ce67b8, 0x030f4af8, 0x039c32ec, 0x026b0ffe, 0x033a096a, 0x032203e5, 0x0110c8ba, 0x000d3fba}}, Y: Field{[10]uint32{0x009c7a17, 0x0155881a, 0x008b2243, 0x02825c74, 0x002231f6, 0x008b8983, 0x00db14b1, 0x03111b1e, 0x00969c9d, 0x00383c04}}}, + {X: Field{[10]uint32{0x0349c65b, 0x026cef76, 0x024bb401, 0x02c3d1da, 0x030f815a, 0x007c1dbd, 0x02424ec3, 0x034ba064, 0x030bf4c9, 0x001abca3}}, Y: Field{[10]uint32{0x02a45248, 0x0143fadb, 0x005d3f13, 0x03742f29, 0x0017d1e1, 0x005fd819, 0x01aa3469, 0x00ecc46a, 0x012fbb66, 0x000b157f}}}, + {X: Field{[10]uint32{0x01320e46, 0x01d3dc93, 0x0003b8bc, 0x0204eebb, 0x03a4f0ad, 0x02b174db, 0x00f1b6b6, 0x02d07991, 0x036639e4, 0x001c2daa}}, Y: Field{[10]uint32{0x02913a14, 0x02030622, 0x02c95237, 0x01777f37, 0x0196f713, 0x025b4f37, 0x01ad5f10, 0x013f3346, 0x01e64f4e, 0x003b1902}}}, + {X: Field{[10]uint32{0x0065724d, 0x00212068, 0x000bc155, 0x01a84e18, 0x03061419, 0x03df6ef8, 0x03eff50f, 0x01d6bab6, 0x03114ab9, 0x003b795b}}, Y: Field{[10]uint32{0x0336ecfc, 0x02b7f254, 0x0173c02d, 0x018dbbf7, 0x0371906b, 0x006c1a12, 0x01839dc6, 0x0087b49b, 0x024c11f4, 0x00279feb}}}, + {X: Field{[10]uint32{0x016df8a4, 0x01f0f915, 0x03efe685, 0x03e7c5a0, 0x025de54a, 0x01992399, 0x0019d746, 0x01cc40f6, 0x003c840a, 0x0020f0d3}}, Y: Field{[10]uint32{0x0086cd10, 0x035c2903, 0x0040fd31, 0x00dfc426, 0x0290aa81, 0x0338bbb4, 0x00d97719, 0x035b03bb, 0x0041562d, 0x002708e0}}}, + {X: Field{[10]uint32{0x00c7e200, 0x00164f68, 0x037c6102, 0x0114934d, 0x0052cbdb, 0x0017a1e9, 0x028cf032, 0x026e6148, 0x00900008, 0x002a8abf}}, Y: Field{[10]uint32{0x02be01f4, 0x017309e5, 0x006af2db, 0x0093fa2a, 0x006d8129, 0x00c58780, 0x013bc4fa, 0x02b0674f, 0x016ab382, 0x000d10c6}}}, + {X: Field{[10]uint32{0x0155c520, 0x01d5cc10, 0x02800e3a, 0x0116207b, 0x03e90eb0, 0x03efdc7e, 0x02956a02, 0x03322e7c, 0x03dc4310, 0x00390bb1}}, Y: Field{[10]uint32{0x0225336c, 0x0099e735, 0x027b693c, 0x011562af, 0x012d0009, 0x02369536, 0x00324bbe, 0x02473f88, 0x02cfa52d, 0x0024e7bc}}}, + {X: Field{[10]uint32{0x02ec2b21, 0x0315818c, 0x01dd34a3, 0x02ac99ff, 0x00181617, 0x005bbe7d, 0x038de47a, 0x014803f5, 0x0124937c, 0x002f02f7}}, Y: Field{[10]uint32{0x02b63035, 0x034a64d4, 0x03ac9df6, 0x00448175, 0x004a0285, 0x024ac21c, 0x02e0e1d1, 0x0087de61, 0x024c10b5, 0x00036c12}}}, + {X: Field{[10]uint32{0x01adc8e7, 0x013aebab, 0x03990626, 0x03559037, 0x0155c005, 0x03dd838a, 0x0310fbb3, 0x029ccd78, 0x01d89b43, 0x00372232}}, Y: Field{[10]uint32{0x002fc512, 0x00f2353f, 0x0163625a, 0x00cb308f, 0x033fe37b, 0x027faded, 0x03fc6777, 0x011e5196, 0x01e46f98, 0x000b59de}}}, + {X: Field{[10]uint32{0x00111c20, 0x0278d260, 0x03210f6f, 0x01422315, 0x035ee3dc, 0x00175dbb, 0x030cb02e, 0x00cb18bf, 0x018ab0c9, 0x0029eb83}}, Y: Field{[10]uint32{0x02e553a2, 0x001f6864, 0x03cdd01d, 0x0115a48c, 0x03ac8dcc, 0x00c87794, 0x039dc94b, 0x018b2262, 0x03c9d631, 0x00358caa}}}, + {X: Field{[10]uint32{0x00be0e97, 0x0296b317, 0x03215592, 0x026e97c0, 0x00d631ac, 0x01f69b99, 0x0203af75, 0x01baaf6c, 0x036ee7bd, 0x00118808}}, Y: Field{[10]uint32{0x00627c6e, 0x025da40a, 0x018c88fa, 0x02f1c0a3, 0x02707851, 0x03eb99a8, 0x0330cdf4, 0x0078a9b3, 0x004f69ea, 0x00177d09}}}, + {X: Field{[10]uint32{0x03d8f671, 0x036647c9, 0x00a38e2b, 0x03fcd276, 0x015cd35f, 0x03e4c8c0, 0x0350acac, 0x0364c147, 0x004a3d8b, 0x0020132e}}, Y: Field{[10]uint32{0x00ae8d3f, 0x026a391c, 0x01267bbc, 0x014aef9b, 0x00cdc395, 0x000d884a, 0x02b2f192, 0x03e0d65a, 0x00129ee0, 0x0012ddee}}}, + {X: Field{[10]uint32{0x011c2ed2, 0x0076ef6e, 0x032378e7, 0x01343881, 0x02b4f6fb, 0x02918e44, 0x001fcbee, 0x02cbcae0, 0x030f5382, 0x001ba94d}}, Y: Field{[10]uint32{0x00b2d88d, 0x02f85064, 0x025b1a8b, 0x038b4de0, 0x008b513e, 0x006567b2, 0x012a002f, 0x03fc203a, 0x0109d8f3, 0x003d6d3e}}}, + {X: Field{[10]uint32{0x02e22ba6, 0x031c1ca8, 0x01f4769f, 0x000ee068, 0x031ee564, 0x03d871ac, 0x03b0852a, 0x01d6984a, 0x021c4ff5, 0x00362e37}}, Y: Field{[10]uint32{0x02468c0e, 0x00e37d38, 0x018928d5, 0x032d1ec1, 0x01f23cbd, 0x017095b9, 0x02ad8275, 0x02fe2625, 0x0190d37a, 0x00078f10}}}, + {X: Field{[10]uint32{0x01f1b147, 0x0320a47b, 0x00a9e475, 0x019c1420, 0x0080d384, 0x00e8035b, 0x033f3ea4, 0x02f5ba71, 0x006404a0, 0x0019ab06}}, Y: Field{[10]uint32{0x03a1260e, 0x02207313, 0x030bca61, 0x0319cf6a, 0x029be98e, 0x0147868d, 0x0103efd5, 0x02ddd805, 0x000f7db6, 0x000b3183}}}, + {X: Field{[10]uint32{0x0360e942, 0x0314d9cf, 0x0185bef3, 0x00d70dd7, 0x02f27844, 0x022d6972, 0x0263cf93, 0x008f9c1d, 0x022c4ed2, 0x0011c652}}, Y: Field{[10]uint32{0x03d9f920, 0x01213034, 0x036045f4, 0x033aaf7d, 0x035808a3, 0x01409f55, 0x032738c7, 0x03704def, 0x011b5a64, 0x002c3f78}}}, + {X: Field{[10]uint32{0x024c6186, 0x034f3d0a, 0x0229010b, 0x00ab17c1, 0x009fdc1b, 0x02375da3, 0x02747428, 0x03660e20, 0x00599af2, 0x00045072}}, Y: Field{[10]uint32{0x02f0226e, 0x014234fb, 0x02c64d6b, 0x034aea63, 0x005392a0, 0x015e343e, 0x017555a0, 0x01184ccc, 0x034761ed, 0x001e90c7}}}, + {X: Field{[10]uint32{0x03496f79, 0x00c030f9, 0x0251d4ba, 0x03585ab1, 0x01487002, 0x03ee3952, 0x01da689b, 0x03fa7b59, 0x01d8e80a, 0x003e416f}}, Y: Field{[10]uint32{0x03bfcf72, 0x0096c65d, 0x000fca7e, 0x0317e7d3, 0x03cd999f, 0x01fc1419, 0x021b03ba, 0x01411751, 0x037f3bfb, 0x0007b1ef}}}, + {X: Field{[10]uint32{0x0315e9e0, 0x03c7eb03, 0x023e5573, 0x00beb51e, 0x00232ea6, 0x0053c2be, 0x004faadb, 0x014bb88f, 0x00e4fba4, 0x002e952e}}, Y: Field{[10]uint32{0x00f5cda8, 0x02f52818, 0x030b8da1, 0x002c044d, 0x039c96ed, 0x00ab203c, 0x018e48a8, 0x02ef36ef, 0x02e9efca, 0x002bd55a}}}, + {X: Field{[10]uint32{0x0226a80a, 0x028a2d02, 0x035e9c08, 0x01080e9d, 0x001494a0, 0x00d868ad, 0x0287f3cf, 0x01b890c3, 0x02d0561f, 0x001674fa}}, Y: Field{[10]uint32{0x000a9bc8, 0x007863c0, 0x015d9ac5, 0x00730b42, 0x02f5f1ba, 0x009f1cc1, 0x00a278d4, 0x0088a70a, 0x007d50a9, 0x0026c9bd}}}, + {X: Field{[10]uint32{0x00865d47, 0x03641c2b, 0x00f5b129, 0x0023bfc0, 0x0315520a, 0x01f83cf3, 0x032924be, 0x0324a363, 0x023fab4c, 0x000a9b96}}, Y: Field{[10]uint32{0x00a625a5, 0x01dc60d7, 0x000cb38b, 0x037ba4e0, 0x00919913, 0x01824d47, 0x01191964, 0x01c08e1b, 0x03505872, 0x00015700}}}, + {X: Field{[10]uint32{0x00907502, 0x022c00aa, 0x03d84682, 0x00716aba, 0x01fff1fb, 0x010b3d96, 0x00afe918, 0x03b90422, 0x00d1c35b, 0x002263d4}}, Y: Field{[10]uint32{0x02f3267b, 0x02e3e3d8, 0x01a79daf, 0x03c528f1, 0x02fc9bd0, 0x01ae1300, 0x0202e490, 0x00ab406b, 0x0280c97c, 0x002c915b}}}, + {X: Field{[10]uint32{0x016af85a, 0x03119c43, 0x03bf9422, 0x028eb013, 0x03bda5d9, 0x027b8f34, 0x01d2304e, 0x03c32c7e, 0x02b8b49b, 0x00346152}}, Y: Field{[10]uint32{0x03155c20, 0x03fafa51, 0x03fabd0a, 0x00085f7d, 0x00d7bdeb, 0x00fb77cd, 0x016a0775, 0x0206016c, 0x000fd881, 0x00013894}}}, + {X: Field{[10]uint32{0x02af4680, 0x037f19bf, 0x01303a3e, 0x03d0a15b, 0x024a417d, 0x025a3bdf, 0x03cc787d, 0x02db87c0, 0x008a394d, 0x002187ee}}, Y: Field{[10]uint32{0x02135da6, 0x0348d882, 0x018dddc6, 0x022f6f00, 0x0268f3c3, 0x018e3380, 0x03ff11b0, 0x002c4c8f, 0x015aab8b, 0x002975fa}}}, + {X: Field{[10]uint32{0x013403d6, 0x033d8b60, 0x0111cb0c, 0x000ce7f0, 0x03ea5269, 0x019db3de, 0x0155d90b, 0x0277f0f0, 0x0368b9fa, 0x0025513d}}, Y: Field{[10]uint32{0x006e047f, 0x02659c20, 0x0290253e, 0x000d78c0, 0x0328d876, 0x02fd4552, 0x011ed21b, 0x01893c21, 0x012fcbde, 0x0033b136}}}, + {X: Field{[10]uint32{0x01db68e9, 0x01732a34, 0x009ba2cb, 0x0034edc5, 0x00311cd4, 0x027ce825, 0x00d7b078, 0x019af88f, 0x0192f80a, 0x003ddc88}}, Y: Field{[10]uint32{0x001b516e, 0x03bf83f2, 0x03462d40, 0x00809dfd, 0x011c11e3, 0x03321479, 0x02266610, 0x035939cf, 0x029f3243, 0x00010743}}}, + {X: Field{[10]uint32{0x018e14ed, 0x0381eb5a, 0x02fc1be9, 0x01f10e7d, 0x01b6bd8e, 0x027aa479, 0x039927a8, 0x01ca6f6f, 0x00651f88, 0x0021dad3}}, Y: Field{[10]uint32{0x016b49da, 0x00c7773e, 0x004e16ad, 0x02121aae, 0x037b5730, 0x018bc94d, 0x0387b88f, 0x03a7773d, 0x03811cfa, 0x003b38b3}}}, + {X: Field{[10]uint32{0x03b70b10, 0x032c0f01, 0x03127b7e, 0x03d8cd4e, 0x00721be8, 0x0245e267, 0x00614278, 0x02649221, 0x00e46224, 0x001c1abd}}, Y: Field{[10]uint32{0x0258a5f3, 0x0141ba5f, 0x03545aa6, 0x0383984b, 0x00cdcf0e, 0x004f7add, 0x015bd298, 0x0348039a, 0x01720c65, 0x00325cb6}}}, + {X: Field{[10]uint32{0x03863c9d, 0x0256df7c, 0x03ddef14, 0x016fe745, 0x024301b7, 0x009f97d2, 0x00dde0ba, 0x01898ad7, 0x0218c9c9, 0x0033a5e8}}, Y: Field{[10]uint32{0x02a1ef10, 0x01c2b280, 0x03f55c57, 0x02c9cac0, 0x01c12900, 0x01ebda3c, 0x0116410d, 0x00509a22, 0x021a20fd, 0x003a4e63}}}, + {X: Field{[10]uint32{0x013be895, 0x03991275, 0x019bca8f, 0x03afa6cf, 0x037dae0f, 0x00b6cf54, 0x02a1f01c, 0x020c7a21, 0x039a92cf, 0x003ed896}}, Y: Field{[10]uint32{0x02599a37, 0x0165f7a0, 0x0344c30d, 0x030a9947, 0x031fe2a8, 0x00b2fc88, 0x029d68f1, 0x02781028, 0x0274ba56, 0x001fde0f}}}, + {X: Field{[10]uint32{0x01f4747d, 0x00b16955, 0x01bc4c6b, 0x03ced0b7, 0x02f126c6, 0x020cc912, 0x039098a8, 0x00ae2d46, 0x03697a7d, 0x00207fef}}, Y: Field{[10]uint32{0x0006f33b, 0x000858bc, 0x00d0a8b0, 0x037b43f5, 0x0190b4d1, 0x0336aa9f, 0x013d5303, 0x03bedcc8, 0x0357982e, 0x0038b19c}}}, + {X: Field{[10]uint32{0x020ed0e4, 0x00c6d55a, 0x01ba8c0f, 0x01def9a5, 0x00679d6b, 0x002728bb, 0x016d4d63, 0x02adf2bc, 0x03668c30, 0x001b7f03}}, Y: Field{[10]uint32{0x015a563c, 0x03fe1f6c, 0x03d905ae, 0x00e2ff77, 0x01367724, 0x003d107a, 0x002d7a62, 0x02a9d0c6, 0x02b2d9a0, 0x002907b4}}}, + {X: Field{[10]uint32{0x03501b44, 0x03e530ce, 0x0023fe77, 0x037e22f3, 0x001d5715, 0x03d8f0ca, 0x01a9b5b0, 0x0395aae8, 0x01d1b953, 0x00071afc}}, Y: Field{[10]uint32{0x00e4b0ef, 0x00d82279, 0x02d3a8e3, 0x037e4688, 0x028f1e74, 0x01f0ae92, 0x01c368bf, 0x005e0806, 0x014db4ca, 0x003199c8}}}, + {X: Field{[10]uint32{0x02def93d, 0x03f491fe, 0x00ba6b2a, 0x03c3479e, 0x035417b9, 0x005134bc, 0x00632319, 0x027d8176, 0x02df5d99, 0x002da444}}, Y: Field{[10]uint32{0x018df4ae, 0x00d318d5, 0x020209a0, 0x01722508, 0x00464f11, 0x02b2b77b, 0x00fafeb8, 0x021b9c1c, 0x037a3028, 0x000858f3}}}, + {X: Field{[10]uint32{0x0176b6e0, 0x0192f792, 0x0287cda4, 0x03363805, 0x019737a2, 0x027be48a, 0x018b8fcf, 0x003e45f1, 0x0332ac23, 0x002f00e1}}, Y: Field{[10]uint32{0x025682d2, 0x007011a8, 0x00ab3719, 0x03677d8e, 0x017a7ae0, 0x01f88ce1, 0x03e1d6fa, 0x018dcd80, 0x02010079, 0x0000ce49}}}, + {X: Field{[10]uint32{0x03e32d81, 0x00faf689, 0x001ae183, 0x0032b7b4, 0x007489c2, 0x0166ec03, 0x024d9aee, 0x02b531aa, 0x02951047, 0x0025b7cc}}, Y: Field{[10]uint32{0x02e2034b, 0x02313bf8, 0x00466181, 0x03c7999d, 0x02cbfaa8, 0x01743c19, 0x01189bbf, 0x018cf060, 0x002d74ce, 0x001063db}}}, + {X: Field{[10]uint32{0x02304979, 0x034be9da, 0x001d263c, 0x03e8bcd4, 0x01cb6a65, 0x02d864f0, 0x02fcefde, 0x0102afb1, 0x0227939e, 0x0028f14c}}, Y: Field{[10]uint32{0x03c967e4, 0x0283b5b6, 0x00de8caf, 0x02637180, 0x0300f467, 0x01e8bd99, 0x0329ade3, 0x029bc64b, 0x02a5498e, 0x00111a32}}}, + {X: Field{[10]uint32{0x0145eb2b, 0x02bc2b49, 0x01a92601, 0x011ae475, 0x017a0c7d, 0x0385ca98, 0x005f1b31, 0x01b5b5ae, 0x02073dfd, 0x0024ff60}}, Y: Field{[10]uint32{0x0163a847, 0x025f51f5, 0x02866883, 0x026c82e2, 0x03961155, 0x02b3faec, 0x03ca8636, 0x01a9046f, 0x02c19a8a, 0x001806fa}}}, + {X: Field{[10]uint32{0x02ca0a9b, 0x01e82ea1, 0x00a2bee8, 0x027ad179, 0x01a5bc0d, 0x011a2b63, 0x039acef2, 0x018fc403, 0x03ef2e2c, 0x002e9f4e}}, Y: Field{[10]uint32{0x015114dc, 0x03bf2ba9, 0x02e097c6, 0x02c5eefc, 0x01376f29, 0x0316daf6, 0x0133ed0b, 0x0278c443, 0x02673312, 0x003fffe6}}}, + {X: Field{[10]uint32{0x036157a8, 0x010a4380, 0x03011190, 0x03ea5fbc, 0x00218898, 0x025935e9, 0x01972582, 0x0270d65d, 0x01c02a4f, 0x00383655}}, Y: Field{[10]uint32{0x01c617f0, 0x02ee6140, 0x0397baa2, 0x01a75699, 0x01b28cbc, 0x021c1de2, 0x0382f0f0, 0x002ee681, 0x039e7d42, 0x0005dbf7}}}, + {X: Field{[10]uint32{0x03f81ac9, 0x0111d42f, 0x02dcd0a4, 0x03f785d4, 0x036cd226, 0x01a435aa, 0x02da689c, 0x032e4c44, 0x01408320, 0x0005acb0}}, Y: Field{[10]uint32{0x018bb281, 0x031de436, 0x01edd2ab, 0x02494f19, 0x025025f7, 0x02a85edb, 0x0217488f, 0x00e4cbc9, 0x00e3dafd, 0x000a8beb}}}, + {X: Field{[10]uint32{0x01f502da, 0x00af043a, 0x020c7fc2, 0x02e3ad36, 0x02220db4, 0x02569053, 0x01d61d97, 0x00f8bd91, 0x00329c82, 0x000beec1}}, Y: Field{[10]uint32{0x00ebc31d, 0x02d89664, 0x00246a0a, 0x0239a7d6, 0x030cbfe5, 0x021c1a2a, 0x03cda69c, 0x0377eeae, 0x02ef15ea, 0x0006b7d9}}}, + {X: Field{[10]uint32{0x03208ebf, 0x00b79399, 0x01ccce13, 0x020e3277, 0x02c178f8, 0x00135915, 0x0122f2f4, 0x0095e6d9, 0x00daf42d, 0x0019244d}}, Y: Field{[10]uint32{0x009355cb, 0x015b0efc, 0x00e8a4a7, 0x0147f991, 0x02e7709b, 0x02a6ba96, 0x00446480, 0x012f09e2, 0x03fc3c55, 0x0010e16a}}}, + {X: Field{[10]uint32{0x013991cd, 0x03b7e2c3, 0x03023dbc, 0x02c2e264, 0x03128d62, 0x0271ff7b, 0x0201c172, 0x007e7381, 0x00b1dcb8, 0x002e5551}}, Y: Field{[10]uint32{0x029dcd2a, 0x0314e0dd, 0x02b0f33c, 0x01824f02, 0x03206fe7, 0x013c1c9b, 0x01f2d450, 0x0378cb54, 0x02dcffba, 0x003e1c7e}}}, + {X: Field{[10]uint32{0x01d668de, 0x00f03297, 0x0389fd06, 0x005c0a23, 0x02ace1ea, 0x012c6c25, 0x03df5b4a, 0x03430288, 0x03fc5034, 0x0033500e}}, Y: Field{[10]uint32{0x02717742, 0x0387f509, 0x0316054e, 0x01529763, 0x023fa92e, 0x00e92fc3, 0x0359760f, 0x03d1bd27, 0x0131aa56, 0x00304a58}}}, + {X: Field{[10]uint32{0x0004c581, 0x03a91e0f, 0x019394b6, 0x01e656d3, 0x021ad784, 0x026a3d5a, 0x0202074c, 0x02f72640, 0x0337d7f8, 0x000292ab}}, Y: Field{[10]uint32{0x0316da34, 0x00d234eb, 0x03431009, 0x032ce22b, 0x031a8cb9, 0x001dcf5c, 0x02594f94, 0x02d873f4, 0x02f2dc02, 0x00132ced}}}, + {X: Field{[10]uint32{0x03f438c4, 0x01f67e2a, 0x039376c3, 0x031f9b9e, 0x0297478f, 0x021915e3, 0x02dd3c52, 0x00123a17, 0x03f8ebdf, 0x0015c40b}}, Y: Field{[10]uint32{0x00161d4f, 0x00763bbe, 0x01128833, 0x005a42ad, 0x01915aef, 0x0146cbcc, 0x01e308c2, 0x00658b9e, 0x019beaec, 0x003213c7}}}, + {X: Field{[10]uint32{0x03c9b6ac, 0x02c188e8, 0x01774832, 0x02171a02, 0x01124246, 0x03ebf1c0, 0x00c08c58, 0x017f8442, 0x00e93c5c, 0x001a3fa6}}, Y: Field{[10]uint32{0x004df273, 0x02033e43, 0x01cd4d64, 0x023fba1c, 0x03cb5ea5, 0x011bc878, 0x00078e2c, 0x01ae1fba, 0x0017fd95, 0x00124ab1}}}, + {X: Field{[10]uint32{0x024a5e77, 0x022f900a, 0x03d43ec0, 0x028ac224, 0x03d97bae, 0x00bba92a, 0x0132cef0, 0x0388ebc2, 0x03b69ef5, 0x0000352e}}, Y: Field{[10]uint32{0x03c7c98c, 0x03e92c11, 0x00166607, 0x0130a8b7, 0x019e7488, 0x00334231, 0x01e223df, 0x02b8c7d9, 0x02609c1d, 0x00016063}}}, + {X: Field{[10]uint32{0x0283192a, 0x01f9a416, 0x03b5d68c, 0x00fdd8fc, 0x0123a5c5, 0x022b314f, 0x00d872f2, 0x022dc9fc, 0x0157a8eb, 0x003a589e}}, Y: Field{[10]uint32{0x010d984f, 0x026ea1f3, 0x008d66e5, 0x015d3d68, 0x020cab10, 0x01329b32, 0x0066d17d, 0x005a5b65, 0x027ddc29, 0x00176a4b}}}, + {X: Field{[10]uint32{0x0311caf5, 0x008e0bc5, 0x032076dd, 0x03cb7e0f, 0x001cd547, 0x003e7fa1, 0x0108ffb7, 0x03cbadf1, 0x00ada83b, 0x00127c87}}, Y: Field{[10]uint32{0x01f31931, 0x022497ce, 0x00114ca1, 0x00693fb6, 0x03244761, 0x00cb9bbf, 0x033afc21, 0x013b62b1, 0x01295f83, 0x00071f60}}}, + {X: Field{[10]uint32{0x02fa792e, 0x034060ab, 0x0364dfd6, 0x03316c3f, 0x006c34a8, 0x0061c4f5, 0x011d110c, 0x00754c53, 0x02a940f6, 0x000160a0}}, Y: Field{[10]uint32{0x005f6ddd, 0x03c28d04, 0x0091e677, 0x0124fab0, 0x012a96ee, 0x0360f5f7, 0x03701457, 0x03cb5948, 0x0155d3e0, 0x001e1578}}}, + {X: Field{[10]uint32{0x03ca118d, 0x01a46648, 0x012e5f55, 0x039d0f52, 0x01dc3a14, 0x01c2fb1f, 0x01db6f1d, 0x0009e9ed, 0x02324b07, 0x0032725e}}, Y: Field{[10]uint32{0x0264b56d, 0x035d31a5, 0x001e8747, 0x03678bb1, 0x0115d600, 0x03080cae, 0x031e99f7, 0x037f870a, 0x000f894d, 0x003d807d}}}, + {X: Field{[10]uint32{0x019e054e, 0x00568845, 0x0062b8d5, 0x0332a9ca, 0x039bbbe0, 0x0047e49c, 0x027bcdda, 0x01d4061a, 0x01758ed6, 0x00279370}}, Y: Field{[10]uint32{0x03c6c0ab, 0x020e04f3, 0x03d3bc94, 0x0321c57a, 0x03fcf4f4, 0x026df8db, 0x00736aa1, 0x019a9af8, 0x031f2bb8, 0x00328470}}}, + {X: Field{[10]uint32{0x02afe2b5, 0x03c31ae2, 0x0152f7a7, 0x03d89a3d, 0x028e5af1, 0x0337ef76, 0x00c1e5e8, 0x000c2f36, 0x03893ae0, 0x003f418d}}, Y: Field{[10]uint32{0x01c8e676, 0x008754c3, 0x00435b2e, 0x02037c68, 0x01f4a354, 0x00c9b700, 0x0068a8e4, 0x01d12881, 0x030b068d, 0x0023027a}}}, + {X: Field{[10]uint32{0x014af04e, 0x00ac9cbf, 0x02c77b3f, 0x02d6d19b, 0x00d85360, 0x004ddd60, 0x0281c3ec, 0x01d9466e, 0x033b6e7a, 0x000df7f7}}, Y: Field{[10]uint32{0x00fb7844, 0x02d3e3b4, 0x01727ea3, 0x0217b250, 0x03043dcd, 0x0004a79d, 0x00f3b078, 0x009d635e, 0x03b27b73, 0x00330c4d}}}, + {X: Field{[10]uint32{0x001dbae0, 0x0291751b, 0x018ffe72, 0x0127785b, 0x010a69cb, 0x034af832, 0x01a2f18b, 0x038971dc, 0x006ac8a5, 0x00117bc4}}, Y: Field{[10]uint32{0x020ab158, 0x022da608, 0x00bf42ad, 0x006cc646, 0x0060e568, 0x00058d24, 0x03bd452e, 0x01f6dcfd, 0x000d742e, 0x0032b5a9}}}, + {X: Field{[10]uint32{0x01fdfca4, 0x0091a704, 0x02d14be0, 0x036f0414, 0x0099648c, 0x011cafd6, 0x03cde710, 0x0328941c, 0x02f988b9, 0x00096314}}, Y: Field{[10]uint32{0x01939dfd, 0x02be7b0a, 0x00ffc359, 0x02e20e53, 0x010d60d0, 0x0296d87f, 0x026c9e21, 0x0171f1a9, 0x008b26ea, 0x00112476}}}, + {X: Field{[10]uint32{0x01e65217, 0x014464ea, 0x01c83afd, 0x019f7a20, 0x01d4f8ff, 0x034dbc76, 0x00cddb90, 0x0138d8f4, 0x00a7727c, 0x002f24a9}}, Y: Field{[10]uint32{0x03aa5120, 0x004c4898, 0x039d79dd, 0x02d2e8dd, 0x00331c22, 0x01193a70, 0x031c024d, 0x011e5587, 0x0208b18b, 0x001dbfda}}}, + {X: Field{[10]uint32{0x01f27ebd, 0x0304b451, 0x03353249, 0x00dfed7f, 0x0223e4e8, 0x03055aef, 0x01ceccb0, 0x0120d3c4, 0x00c258c0, 0x0022867a}}, Y: Field{[10]uint32{0x00e92c1a, 0x017941f9, 0x01f065d6, 0x032e1706, 0x018f50a9, 0x02e5e3f8, 0x016caca2, 0x023a8831, 0x0070bff4, 0x00057f1b}}}, + {X: Field{[10]uint32{0x01d70eea, 0x02447a95, 0x00572d9c, 0x02a30a91, 0x03e6f3b1, 0x00e65a2f, 0x013c1a7a, 0x00d136c4, 0x02d1ab90, 0x003966e0}}, Y: Field{[10]uint32{0x013b91be, 0x00abf20c, 0x00b80cc2, 0x02640205, 0x036634d6, 0x00baa9db, 0x01f0bc01, 0x01a86f93, 0x018cd58c, 0x002478cf}}}, + {X: Field{[10]uint32{0x0371a7d0, 0x000c6c1c, 0x03eb3330, 0x034976b2, 0x020f3456, 0x03e506fa, 0x0017db72, 0x01335af1, 0x025f8824, 0x003e653b}}, Y: Field{[10]uint32{0x019c62e2, 0x0102816b, 0x03d40514, 0x027d09c1, 0x03d9c268, 0x036b923d, 0x02bf9c04, 0x0266ccc0, 0x006aecc2, 0x002409be}}}, + {X: Field{[10]uint32{0x0000410f, 0x00e9a4de, 0x015ffc1e, 0x03355976, 0x018000cc, 0x0200f448, 0x0317bc79, 0x03e9409e, 0x008c32d1, 0x001ddb13}}, Y: Field{[10]uint32{0x00785149, 0x03c2eb72, 0x03803165, 0x0298e104, 0x01988b64, 0x00f4f8c6, 0x00201d50, 0x01dce1be, 0x0234438e, 0x00103b38}}}, + {X: Field{[10]uint32{0x01c9b12e, 0x00feb96d, 0x02620fb8, 0x022b1780, 0x0032c196, 0x02fc95cc, 0x00aea3d8, 0x02c004a7, 0x01a5dd13, 0x000e4d9d}}, Y: Field{[10]uint32{0x035a8b00, 0x0129a7e9, 0x02dc0378, 0x01cd39d0, 0x032e5dc7, 0x02c3af30, 0x016ff4c4, 0x00033bb4, 0x03c47934, 0x000e79b3}}}, + {X: Field{[10]uint32{0x03401b1e, 0x027ea330, 0x00eaa2f0, 0x03c9efce, 0x0094dcfd, 0x0242f87f, 0x01de130e, 0x031ed8b3, 0x029422ed, 0x0035f374}}, Y: Field{[10]uint32{0x014fb184, 0x031c194d, 0x00302db5, 0x03662fc5, 0x020728bd, 0x031e7ad1, 0x00ca141d, 0x03462edd, 0x0328073c, 0x00372e72}}}, + {X: Field{[10]uint32{0x0256bc2c, 0x019f73db, 0x021b99cb, 0x01ea6216, 0x01902613, 0x00925274, 0x02206718, 0x011278fd, 0x01272726, 0x002f38fc}}, Y: Field{[10]uint32{0x02e76217, 0x0355e1b9, 0x0097d296, 0x01f714a9, 0x011c33c3, 0x02b4496b, 0x0168f040, 0x037692fa, 0x0017ee92, 0x00290900}}}, + {X: Field{[10]uint32{0x035d6e52, 0x037ba5ff, 0x01eb9738, 0x00ddd0e6, 0x03700801, 0x0078d7eb, 0x02daf442, 0x010529e6, 0x00cdefe9, 0x00277c26}}, Y: Field{[10]uint32{0x01abf15d, 0x0223ae94, 0x01baf3b7, 0x02d36fbc, 0x03f04bf4, 0x01a45f65, 0x0317bb80, 0x0250f343, 0x035fef36, 0x001afe48}}}, + {X: Field{[10]uint32{0x03d43f1d, 0x0332536c, 0x02522e8d, 0x02d1c888, 0x0005d88a, 0x0249c4e8, 0x00839a82, 0x03712a69, 0x002ee561, 0x00265616}}, Y: Field{[10]uint32{0x028c226a, 0x013a2341, 0x00dc78cb, 0x02cd0ed7, 0x02850008, 0x00966cde, 0x0376cba2, 0x03c8fa1b, 0x0214b63a, 0x00382562}}}, + {X: Field{[10]uint32{0x01fb1f24, 0x024cf11b, 0x02871bad, 0x01e548ce, 0x03dda933, 0x02230122, 0x0292447c, 0x009e79f4, 0x00ce7d7b, 0x000f9fee}}, Y: Field{[10]uint32{0x008806e5, 0x01bb2b59, 0x0309d229, 0x02aa4e17, 0x02e36352, 0x001ae92f, 0x037a5dd9, 0x0208e4b5, 0x01083410, 0x000109e7}}}, + {X: Field{[10]uint32{0x01e8ed62, 0x0029a8dd, 0x001c71ac, 0x01a7f2da, 0x0097611d, 0x0209b3d6, 0x02c93ee7, 0x01684433, 0x0050f740, 0x00073415}}, Y: Field{[10]uint32{0x0334d0f0, 0x02880eeb, 0x0136b039, 0x017264c6, 0x025759d3, 0x002e54db, 0x020a3a02, 0x02c10358, 0x0070bb52, 0x000216ef}}}, + {X: Field{[10]uint32{0x03c9b367, 0x02b6fdf5, 0x005e3c76, 0x03283ed3, 0x0393cf99, 0x02e040cb, 0x0387bd01, 0x0168f7db, 0x03763214, 0x0001411d}}, Y: Field{[10]uint32{0x03d1d2c3, 0x01820115, 0x03f7a1ed, 0x008e2132, 0x00a0e67b, 0x031c7d06, 0x02b97ce6, 0x01ddc627, 0x0359919c, 0x0001eeb7}}}, + {X: Field{[10]uint32{0x0070e6ea, 0x03de8391, 0x030be636, 0x00afdfcb, 0x0079fd30, 0x03452629, 0x01b8d87a, 0x012ea0c2, 0x02c949b6, 0x0007aa44}}, Y: Field{[10]uint32{0x002b7650, 0x0021b401, 0x02b4d029, 0x039b3e0e, 0x014acd50, 0x0140aba3, 0x014896d3, 0x00477a10, 0x03dd0b12, 0x0026c9e7}}}, + {X: Field{[10]uint32{0x01a01628, 0x00c0a3c8, 0x007ac8c0, 0x026f4bd3, 0x03e1ed32, 0x017c0f12, 0x00e0b009, 0x001daf2d, 0x00d34b00, 0x0026cfe8}}, Y: Field{[10]uint32{0x03d420de, 0x02549f09, 0x01f4126e, 0x035543bf, 0x038cef81, 0x033b1987, 0x00d5dcb0, 0x023bd4b8, 0x0248b2a5, 0x0004045e}}}, + {X: Field{[10]uint32{0x024c94eb, 0x01e3f020, 0x03e22ff6, 0x00a34095, 0x036200d1, 0x02eb4530, 0x02c7f7f5, 0x027712ce, 0x03b801d3, 0x00197fbd}}, Y: Field{[10]uint32{0x0308b475, 0x026bc249, 0x032fe325, 0x03b1e80a, 0x02f2dcd6, 0x01bbc9db, 0x0373b9b3, 0x013f09dc, 0x01ee680c, 0x000c0878}}}, + {X: Field{[10]uint32{0x0385f9ac, 0x00a45fdf, 0x01d46c5a, 0x02ee3f7b, 0x036ef5e1, 0x030afbd6, 0x004c0f2b, 0x00e95419, 0x023daf76, 0x000f9dec}}, Y: Field{[10]uint32{0x024f3221, 0x02cf930a, 0x0021b415, 0x021443f4, 0x018d4fc7, 0x00b6cb1e, 0x03f0766a, 0x01e1e671, 0x00e95bb0, 0x00156c9e}}}, + {X: Field{[10]uint32{0x01de2965, 0x023022c8, 0x0378396f, 0x0228c8cb, 0x02f69fbf, 0x0335f4d4, 0x0215fba1, 0x0248af11, 0x02bf2fec, 0x000ab136}}, Y: Field{[10]uint32{0x019f957f, 0x03cfab08, 0x0089fa92, 0x00947bfc, 0x006d6494, 0x03e16946, 0x03e60187, 0x022f3c0a, 0x00177623, 0x000b0cf0}}}, + {X: Field{[10]uint32{0x0162c66e, 0x0150a153, 0x0155868d, 0x03c65f8c, 0x03748be0, 0x00acb3ae, 0x01feac74, 0x00134215, 0x022067da, 0x003faf22}}, Y: Field{[10]uint32{0x01d96083, 0x012a3499, 0x03bd1a55, 0x01b6898a, 0x01e3db34, 0x004169dc, 0x029d583e, 0x0398ffe6, 0x02873d45, 0x002bb8e4}}}, + {X: Field{[10]uint32{0x0206a569, 0x023da261, 0x038d3e1c, 0x000b7138, 0x02026542, 0x01715006, 0x002d10bd, 0x009d4623, 0x00b4a598, 0x0029045d}}, Y: Field{[10]uint32{0x03732a00, 0x0021fa47, 0x0367e3bd, 0x00be3643, 0x016b589f, 0x020ad947, 0x0165337e, 0x03e17b1a, 0x03b99fb5, 0x002f1ad8}}}, + {X: Field{[10]uint32{0x025de220, 0x02919396, 0x02ae93a3, 0x0134f2bc, 0x02907c19, 0x004bdd26, 0x0397fc6d, 0x028ebcee, 0x02cf5d10, 0x00048865}}, Y: Field{[10]uint32{0x0304e533, 0x031ba4a4, 0x032b946f, 0x03175016, 0x01674697, 0x02508ff7, 0x00e2c7c5, 0x03884d51, 0x0342b3c1, 0x00333d19}}}, + {X: Field{[10]uint32{0x021eadb3, 0x02d98f0b, 0x0373e799, 0x0187a38e, 0x019f93ec, 0x03219dd8, 0x03bfaa08, 0x03731f86, 0x01cb0104, 0x001deeb5}}, Y: Field{[10]uint32{0x02faa3cc, 0x03a18271, 0x00fea411, 0x02317bc2, 0x014023fd, 0x03c948bb, 0x021214dd, 0x037afd23, 0x007bad8b, 0x0002225d}}}, + {X: Field{[10]uint32{0x02d4a98b, 0x005faec4, 0x015d2f55, 0x0225a578, 0x024e3f6c, 0x00cc9f9b, 0x01451637, 0x02b505ab, 0x00758c49, 0x0007a350}}, Y: Field{[10]uint32{0x023b09f4, 0x01a05803, 0x01cd1259, 0x02835220, 0x0398d94a, 0x032f13e0, 0x03379a2e, 0x02986726, 0x00b00730, 0x000745b3}}}, + {X: Field{[10]uint32{0x03b6ee42, 0x01a7e97e, 0x028cfb18, 0x02b3d280, 0x01880ff2, 0x03ed6d4d, 0x03f4974a, 0x01077521, 0x016b2402, 0x00321e99}}, Y: Field{[10]uint32{0x02757beb, 0x02bfdc2f, 0x01cb76dd, 0x02a2d326, 0x0134f694, 0x029a9e43, 0x0174412f, 0x0254e17b, 0x033a6fac, 0x0005bc97}}}, + {X: Field{[10]uint32{0x0355a4eb, 0x02f67092, 0x03b8071f, 0x005b9ce4, 0x01669adf, 0x03385a81, 0x0369944c, 0x01ba23a5, 0x0007482c, 0x0025ac05}}, Y: Field{[10]uint32{0x00b50223, 0x02fffee5, 0x00ca4578, 0x03886c5e, 0x0082b786, 0x021a2006, 0x00d68de3, 0x0213c382, 0x02805903, 0x002ccaf8}}}, + {X: Field{[10]uint32{0x01ae4af5, 0x02fe211b, 0x01eff7eb, 0x01888b87, 0x00b2afd1, 0x01b423d5, 0x0272fb74, 0x018b9a07, 0x00b37395, 0x000483da}}, Y: Field{[10]uint32{0x000bcc78, 0x0305a40c, 0x00743ded, 0x02758572, 0x0102f4da, 0x03643853, 0x03c6729b, 0x01dbe51d, 0x034f2b23, 0x001f07ad}}}, + {X: Field{[10]uint32{0x02acd157, 0x03177139, 0x00989b65, 0x0074a170, 0x0049a441, 0x00923fba, 0x008be2cf, 0x02d15618, 0x01ec2789, 0x0039921c}}, Y: Field{[10]uint32{0x00e10a6b, 0x01d8a516, 0x02145843, 0x039740bc, 0x02f3dbfa, 0x017be47f, 0x039ecfd4, 0x02c2d56d, 0x02d14999, 0x000a602c}}}, + {X: Field{[10]uint32{0x026798ad, 0x010e18ea, 0x012660eb, 0x03894ea3, 0x0243daa1, 0x01cf9721, 0x0324adfc, 0x00f8b094, 0x0009b20d, 0x001822c4}}, Y: Field{[10]uint32{0x010e13df, 0x03f8b223, 0x0038b3b4, 0x00f10fbf, 0x03a021e1, 0x033c3998, 0x0181c68c, 0x0258e144, 0x0203ad5c, 0x00209b96}}}, + {X: Field{[10]uint32{0x01bb152a, 0x017e1068, 0x033e57c6, 0x00ada142, 0x00cdc4dc, 0x01bd306a, 0x02614353, 0x03917d82, 0x01558132, 0x002325e0}}, Y: Field{[10]uint32{0x037460fc, 0x03504df6, 0x0344ba6e, 0x00f670c6, 0x001875d6, 0x02193c65, 0x01083c53, 0x0207bc2a, 0x0098394d, 0x00328ecc}}}, + {X: Field{[10]uint32{0x0021bf3e, 0x0323e366, 0x00627f80, 0x015da084, 0x03100727, 0x0380441b, 0x018e731c, 0x00920be3, 0x011ac73b, 0x0000d4d6}}, Y: Field{[10]uint32{0x01eb6412, 0x02131ed0, 0x03df9d4f, 0x02067d12, 0x0370ae89, 0x009823aa, 0x02306db0, 0x02d1a6b1, 0x011a501a, 0x000adf8f}}}, + {X: Field{[10]uint32{0x00d78857, 0x03710c27, 0x02978b05, 0x01f6a7f6, 0x023c387b, 0x01e3f38c, 0x0270a671, 0x01cdcbb3, 0x0188ec35, 0x003acb7f}}, Y: Field{[10]uint32{0x024b88e4, 0x011fbc68, 0x01f6318c, 0x01ff2828, 0x023dd7aa, 0x02148dcb, 0x001a8cf9, 0x01548711, 0x02ed1f5a, 0x001bcaed}}}, + {X: Field{[10]uint32{0x012eb279, 0x03fdcca6, 0x00487b29, 0x03a619cb, 0x00abd72a, 0x03bbd9b7, 0x018f3b07, 0x001439a6, 0x03f65db1, 0x00290703}}, Y: Field{[10]uint32{0x01a99cd4, 0x0147bba6, 0x00244ba9, 0x03acaab3, 0x03bc0786, 0x014841c9, 0x019d7f86, 0x03fe77d8, 0x03205616, 0x0015be9e}}}, + {X: Field{[10]uint32{0x02217e92, 0x009395e8, 0x00ea9415, 0x02b6186f, 0x01615d85, 0x021677c4, 0x005917e0, 0x00540329, 0x0335f5bb, 0x00239d22}}, Y: Field{[10]uint32{0x00a46df8, 0x01d78fbf, 0x0266c9ef, 0x028e5b3f, 0x00825515, 0x025cef14, 0x03f86043, 0x031a9e12, 0x0362e226, 0x0015504c}}}, + {X: Field{[10]uint32{0x02dd17e5, 0x0354d709, 0x03708f35, 0x009f3339, 0x02bc506c, 0x01fb1eff, 0x00de2c7b, 0x001891cf, 0x0007cce7, 0x002a0fd8}}, Y: Field{[10]uint32{0x026af268, 0x00edd318, 0x02cbb26c, 0x005221e8, 0x015a1ac6, 0x03543585, 0x0397a379, 0x01f9718c, 0x012daf21, 0x002b523b}}}, + {X: Field{[10]uint32{0x0282d2fa, 0x022bfb44, 0x033abf11, 0x0376d1d5, 0x025cf208, 0x03f4e5f7, 0x000246eb, 0x0058924e, 0x02927e45, 0x003e7b5e}}, Y: Field{[10]uint32{0x00237b70, 0x02eed772, 0x01324087, 0x001ed2f9, 0x0303c844, 0x01c34e03, 0x015d53c6, 0x00c3de03, 0x02163a6f, 0x003055d1}}}, + {X: Field{[10]uint32{0x002ea08e, 0x00499c9b, 0x0255af01, 0x00491b14, 0x02c7dff0, 0x03c27e04, 0x01177078, 0x031e99fe, 0x038a175e, 0x0028af79}}, Y: Field{[10]uint32{0x01ca12ec, 0x004c8f72, 0x01e20b09, 0x00aa976e, 0x013b5dd6, 0x037140fe, 0x03d27419, 0x01302db5, 0x018fe82d, 0x001c495a}}}, + {X: Field{[10]uint32{0x039899b2, 0x03a88c6f, 0x01a56e62, 0x010b861d, 0x036b37da, 0x02385a42, 0x01cc0e9b, 0x019cda41, 0x01c79dcb, 0x0032a301}}, Y: Field{[10]uint32{0x0087534c, 0x003c67c5, 0x0199641d, 0x0275c4e2, 0x02275125, 0x03eea72a, 0x0160c1e3, 0x02b6e999, 0x01ca1e19, 0x00141314}}}, + {X: Field{[10]uint32{0x00eca02b, 0x01ec0655, 0x0397c061, 0x008725e7, 0x0061fd4b, 0x0140609e, 0x037ecdd1, 0x004eb104, 0x02ee61db, 0x0003f041}}, Y: Field{[10]uint32{0x03bef3ee, 0x0265945e, 0x0308e6bc, 0x035d724b, 0x02971f2c, 0x037168b0, 0x03ce9c2c, 0x0198e0ab, 0x02284fc2, 0x001b6956}}}, + {X: Field{[10]uint32{0x0092a8ab, 0x02da9c59, 0x0390b8b9, 0x012f0be3, 0x03504f67, 0x02b1e11b, 0x019a3217, 0x0041a150, 0x0039f47b, 0x000b2c86}}, Y: Field{[10]uint32{0x000a5757, 0x0204927c, 0x017aff10, 0x00cc116a, 0x00637264, 0x01978bf2, 0x0007feb9, 0x00112bda, 0x0332ae75, 0x00007fac}}}, + {X: Field{[10]uint32{0x0161f3ae, 0x03c84c95, 0x002245d4, 0x01c9e65c, 0x0356ba35, 0x02e957b6, 0x022963ef, 0x001ffff2, 0x00ee759c, 0x0019e314}}, Y: Field{[10]uint32{0x02cba96c, 0x022ffd2b, 0x03107c49, 0x015f6a9d, 0x01780b16, 0x00e2787e, 0x03afce2d, 0x00130724, 0x0387abbf, 0x0006626d}}}, + {X: Field{[10]uint32{0x024aa6fc, 0x00724420, 0x01da41b2, 0x032907cf, 0x0275d407, 0x002cbc99, 0x015097c3, 0x00d36608, 0x01ceaa2e, 0x002ad8f8}}, Y: Field{[10]uint32{0x00e2363c, 0x00955a9b, 0x00d82479, 0x0395f43d, 0x02812eb7, 0x011506b5, 0x01d3da2c, 0x03fdc9c5, 0x02611150, 0x003b196f}}}, + {X: Field{[10]uint32{0x003dd336, 0x02466ba4, 0x03cc9f5c, 0x01e6c14a, 0x03ec5672, 0x00499260, 0x0239a2a3, 0x02565d69, 0x01cafad5, 0x0029a4e6}}, Y: Field{[10]uint32{0x010d97dd, 0x00f84bb1, 0x017551c4, 0x012d8d24, 0x001c8730, 0x024eb8d2, 0x02799dcc, 0x013d369e, 0x0259c30c, 0x002d4971}}}, + {X: Field{[10]uint32{0x00fc5f3e, 0x01d4ef70, 0x001fbe13, 0x02bf4ef9, 0x00bd7a48, 0x00e720b4, 0x01cb5ed4, 0x033d7b49, 0x0282507b, 0x000cafd0}}, Y: Field{[10]uint32{0x0279bff2, 0x02eda543, 0x0033ac20, 0x02607a00, 0x026773c5, 0x038d1fa0, 0x0282f90b, 0x0367f495, 0x017a4336, 0x00336480}}}, + {X: Field{[10]uint32{0x02dfd862, 0x00ba6e3b, 0x032ec5e4, 0x0213da06, 0x02f2fe64, 0x005141c5, 0x003e2cc1, 0x000259c8, 0x01837e72, 0x00287f32}}, Y: Field{[10]uint32{0x01ed4fd7, 0x01b0c58c, 0x03a964ba, 0x03f6f05f, 0x02a419af, 0x008b7927, 0x03fa79a7, 0x03ee277f, 0x02c317e8, 0x000785ad}}}, + {X: Field{[10]uint32{0x030ceae0, 0x02ccae5f, 0x00838472, 0x03cceafa, 0x0360485c, 0x0073dce2, 0x01f1e822, 0x01f94063, 0x014e6961, 0x0036168c}}, Y: Field{[10]uint32{0x000a52f1, 0x02a8d9f8, 0x024e86e1, 0x033ccc22, 0x00fbbcba, 0x02229e6d, 0x034b5daa, 0x0379999a, 0x03eee92d, 0x001c683f}}}, + {X: Field{[10]uint32{0x020c2e7f, 0x000feabc, 0x0224e4ee, 0x017a010f, 0x02f5a53b, 0x00d5bab0, 0x01b20e31, 0x031c3905, 0x02fa0688, 0x00062489}}, Y: Field{[10]uint32{0x01515aa6, 0x0161f7bc, 0x00eaa1a0, 0x01fe54b9, 0x02fc2bba, 0x0261f3d8, 0x00be5759, 0x0354f9ef, 0x00ac40c7, 0x00366ff6}}}, + {X: Field{[10]uint32{0x019e1330, 0x001c2695, 0x01241ff7, 0x009534b6, 0x0132465d, 0x00b3c84d, 0x02674e63, 0x00458b5e, 0x020a6a93, 0x0034d50b}}, Y: Field{[10]uint32{0x0357c369, 0x01e645d2, 0x032bf9a0, 0x021012c7, 0x03dbd427, 0x008aef60, 0x00be5ed6, 0x0108d0d3, 0x0351e266, 0x000097a3}}}, + {X: Field{[10]uint32{0x013a2bc5, 0x01af861d, 0x0245f287, 0x016ab6ff, 0x029a8c0a, 0x0161d615, 0x006e6b82, 0x02d8487b, 0x0286fb2c, 0x00145367}}, Y: Field{[10]uint32{0x03cbf261, 0x02a10615, 0x0179145c, 0x02f1218a, 0x011b8370, 0x0197de76, 0x01918d9f, 0x008f10d0, 0x01c0be54, 0x001c01e1}}}, + {X: Field{[10]uint32{0x023fe495, 0x01a128fa, 0x03f6ad6d, 0x0188b5c8, 0x0343f9aa, 0x02b981aa, 0x031db335, 0x0333f787, 0x036512e9, 0x00327e18}}, Y: Field{[10]uint32{0x0230270b, 0x00efac87, 0x01db3a3b, 0x0163cc7d, 0x01b7b80b, 0x0372f8ee, 0x02f9445d, 0x02807271, 0x02313868, 0x000c34e9}}}, + {X: Field{[10]uint32{0x002deb93, 0x03481bcb, 0x00768357, 0x029cae42, 0x03641200, 0x0039e436, 0x00cd96fa, 0x0227f826, 0x020c8fc0, 0x000089bc}}, Y: Field{[10]uint32{0x025f66bc, 0x00ee56aa, 0x00cff1c0, 0x01bfb860, 0x015e0262, 0x012d0f6a, 0x03c20452, 0x024d880f, 0x03b8b43e, 0x000b88fe}}}, + {X: Field{[10]uint32{0x035350bd, 0x0125adb2, 0x03da0a38, 0x03f62366, 0x019fcc79, 0x02e29f98, 0x019bd9e6, 0x03e531c8, 0x0268d4b6, 0x00286c9d}}, Y: Field{[10]uint32{0x02d68a32, 0x013ccb75, 0x01b94264, 0x01d2dcae, 0x01c96b5f, 0x0003f57b, 0x02a62bc2, 0x0305ab9e, 0x005eb6e1, 0x000e4cff}}}, + {X: Field{[10]uint32{0x03e28887, 0x0037dfab, 0x01ae38c4, 0x01f05643, 0x0357dd4e, 0x02023ac2, 0x03b71810, 0x02f0c47d, 0x02570087, 0x00043c4d}}, Y: Field{[10]uint32{0x03366d84, 0x031ba178, 0x03995db5, 0x02d29e68, 0x02291338, 0x00753b73, 0x02c570d9, 0x030fb139, 0x008709bd, 0x000694b9}}}, + {X: Field{[10]uint32{0x01be3e46, 0x03861073, 0x01884273, 0x03623e62, 0x00f613b3, 0x0003717b, 0x03558615, 0x03d60fe7, 0x00eea984, 0x00022aa8}}, Y: Field{[10]uint32{0x0133260d, 0x025f48a8, 0x017b8f21, 0x016055b6, 0x0124e564, 0x00bc91bb, 0x02c46abc, 0x009df700, 0x01540f85, 0x0014a588}}}, + {X: Field{[10]uint32{0x01c89d2e, 0x019990fc, 0x034aa3bd, 0x03be96e2, 0x00dc9472, 0x01ea4ea6, 0x0397ce5f, 0x02c6de6c, 0x02710024, 0x000ca016}}, Y: Field{[10]uint32{0x003091fd, 0x01439621, 0x002a2f4d, 0x019702e2, 0x029e23c7, 0x00a9d3b5, 0x02d0a858, 0x00e7d734, 0x007cb7c1, 0x002bd497}}}, + {X: Field{[10]uint32{0x01412451, 0x0141d26a, 0x02b12cde, 0x030a1fda, 0x01058db0, 0x03ce9483, 0x030835a4, 0x035125fe, 0x00cc909a, 0x0031cbc4}}, Y: Field{[10]uint32{0x02c7c65a, 0x0044b5bc, 0x03030a7a, 0x00c99d19, 0x03b8e2ca, 0x0192d83c, 0x015ff15b, 0x02ea78df, 0x027d5197, 0x0029599b}}}, + {X: Field{[10]uint32{0x03fc9a22, 0x0082195d, 0x01f97c03, 0x016b5301, 0x0172c0fa, 0x0080ef50, 0x01a74adc, 0x0046c905, 0x00c78702, 0x001bb1da}}, Y: Field{[10]uint32{0x031b09fb, 0x009833ab, 0x014d05da, 0x010b6d9f, 0x03b51cbf, 0x01527230, 0x01e67100, 0x036ec249, 0x02220aa2, 0x00060e52}}}, + {X: Field{[10]uint32{0x00a64737, 0x00e9c70f, 0x01e61dc9, 0x0343bbe4, 0x01a846e7, 0x01c117f2, 0x01061438, 0x03455981, 0x03bbff99, 0x00378dba}}, Y: Field{[10]uint32{0x000f4270, 0x0292d3a4, 0x00c81b39, 0x02e86d34, 0x00488208, 0x011db138, 0x0247dcda, 0x02cded01, 0x02520f3c, 0x0031605d}}}, + {X: Field{[10]uint32{0x00c00218, 0x0082adcf, 0x0297bc0c, 0x008ad1a8, 0x0019bea3, 0x037a9bd3, 0x0001ef86, 0x03f1a16b, 0x015d5538, 0x003d4d05}}, Y: Field{[10]uint32{0x03b9523c, 0x0355c1ac, 0x026030d3, 0x013c5376, 0x03f9d092, 0x028b4494, 0x02b38a49, 0x02632bbb, 0x01f2979d, 0x0013eadf}}}, + {X: Field{[10]uint32{0x0286129d, 0x01ff304c, 0x035210bc, 0x0223436a, 0x0008db20, 0x0156da1f, 0x00ecb981, 0x02409420, 0x0050a1db, 0x0036bf6e}}, Y: Field{[10]uint32{0x011ada22, 0x03cbfbd9, 0x0291aa2e, 0x014183ff, 0x027d0ccc, 0x00dbeef4, 0x02be601f, 0x013050ff, 0x03fcae6c, 0x0010e597}}}, + {X: Field{[10]uint32{0x01d705ce, 0x027e7d26, 0x03721299, 0x01a5a02c, 0x022efe40, 0x00cf31a7, 0x016893ee, 0x02f21460, 0x02211dca, 0x002b2682}}, Y: Field{[10]uint32{0x00c728ef, 0x00e5c6e6, 0x03a8879c, 0x02c4e7d6, 0x02acf64e, 0x034035c4, 0x021e02c2, 0x034af7fe, 0x02408281, 0x0005baff}}}, + {X: Field{[10]uint32{0x00503030, 0x0207afa6, 0x02ceb1db, 0x00bc0ede, 0x0131ae2b, 0x02e2da7f, 0x01eb8b97, 0x03dba578, 0x03d4b48c, 0x002becde}}, Y: Field{[10]uint32{0x024b7929, 0x0336c582, 0x01d84d3f, 0x037b3913, 0x01c47c06, 0x017e8c4f, 0x0231af3e, 0x033765bc, 0x0164f8d9, 0x000733d0}}}, + {X: Field{[10]uint32{0x0088e709, 0x000a494e, 0x007d51a6, 0x00b4ac4a, 0x00f55368, 0x007591c3, 0x0318e7f2, 0x013e0cea, 0x02ef6c29, 0x00006e40}}, Y: Field{[10]uint32{0x00d69ebe, 0x007b3bb7, 0x024aa24b, 0x00091b1c, 0x0066ca01, 0x00359a93, 0x005e9fe4, 0x027f9c8e, 0x01ff34e4, 0x001dcd71}}}, + {X: Field{[10]uint32{0x003133e2, 0x0138a2df, 0x030b255e, 0x031630ef, 0x00c61b41, 0x00cc883f, 0x01b4ec3d, 0x00a561f1, 0x03108a20, 0x001b9396}}, Y: Field{[10]uint32{0x028fcfbe, 0x012a6766, 0x02f660f1, 0x0011b3a8, 0x00b55ae5, 0x01224569, 0x01ea4106, 0x01abd11a, 0x03065c33, 0x002d27e0}}}, + {X: Field{[10]uint32{0x037e9714, 0x00346ac6, 0x0280b5b1, 0x0261f607, 0x0112342d, 0x034e4c6e, 0x00532760, 0x0008416e, 0x037fbb80, 0x0021f38f}}, Y: Field{[10]uint32{0x00f0f635, 0x0065ce93, 0x02e16d1e, 0x0263751b, 0x016b71f8, 0x03078ce1, 0x013c3869, 0x03ce700a, 0x004779db, 0x0015b1aa}}}, + {X: Field{[10]uint32{0x01426b2d, 0x0199eab2, 0x01d0c9f6, 0x00189d1f, 0x02d368a7, 0x01687a51, 0x00193724, 0x01927270, 0x029bb7ba, 0x0021c90c}}, Y: Field{[10]uint32{0x010b944c, 0x0243fe59, 0x030d89d0, 0x03548745, 0x0155b109, 0x003e811e, 0x03a5a5bb, 0x03512d76, 0x00e848d7, 0x00011116}}}, + {X: Field{[10]uint32{0x02a1a4bc, 0x025fd8ad, 0x005cd7d2, 0x03333b21, 0x03c6338d, 0x01935f5f, 0x01b18b6b, 0x030244cb, 0x03a64735, 0x002e46fb}}, Y: Field{[10]uint32{0x00138467, 0x03dc0778, 0x0340b14c, 0x00323e7c, 0x0015e7ca, 0x0391d9a8, 0x03f16cfb, 0x01e71a19, 0x01ef8c9b, 0x002ece58}}}, + {X: Field{[10]uint32{0x00d08fb3, 0x038c8028, 0x0296cd8d, 0x02e19735, 0x009ae3d6, 0x0228d227, 0x00fbb896, 0x025fa8ef, 0x0259332e, 0x0010c87a}}, Y: Field{[10]uint32{0x00cd538e, 0x032d8021, 0x00f7ee31, 0x008d7394, 0x0203f6b0, 0x01ce8d7a, 0x0182e3fc, 0x02754f5d, 0x00d4c514, 0x0025f920}}}, + {X: Field{[10]uint32{0x02f1bc6d, 0x014b29bd, 0x02069057, 0x0357a230, 0x017950a8, 0x02a63508, 0x01051d25, 0x025a990c, 0x03b2836d, 0x00371165}}, Y: Field{[10]uint32{0x03df36ff, 0x01cfc814, 0x02ad7f9b, 0x03f79310, 0x03362bb4, 0x00d5c96a, 0x00e3a83c, 0x00c32ba1, 0x000d16ba, 0x0031c496}}}, + {X: Field{[10]uint32{0x0159a009, 0x00b4e700, 0x00992997, 0x0194b67e, 0x03c5f19b, 0x037801ee, 0x02617508, 0x00c0242c, 0x02f085ff, 0x00339913}}, Y: Field{[10]uint32{0x033cc8f7, 0x02641b35, 0x02c17c08, 0x01a48299, 0x00c9402a, 0x019026ac, 0x0200c92f, 0x02e596ea, 0x01d0058d, 0x00002690}}}, + {X: Field{[10]uint32{0x0136b41a, 0x01138066, 0x002b4a74, 0x0309611a, 0x022ec439, 0x00f2e3bc, 0x01aecf42, 0x02d2eae0, 0x035cb6c7, 0x0002e878}}, Y: Field{[10]uint32{0x01bd6272, 0x0339a50d, 0x0128ad2f, 0x00cc73ab, 0x0001098b, 0x02c5ea39, 0x0178d6f7, 0x037918f8, 0x0252f91d, 0x003cecf1}}}, + {X: Field{[10]uint32{0x02e3920f, 0x0344d821, 0x0114d72e, 0x011c640b, 0x036988c7, 0x011763d0, 0x03c839f8, 0x006efd83, 0x02a02a33, 0x002e7e63}}, Y: Field{[10]uint32{0x020d03d3, 0x03eca4b1, 0x0327d318, 0x013ea52e, 0x0235d9b0, 0x02a85f04, 0x0326f5e8, 0x00e85b31, 0x0101a7f2, 0x00027ec9}}}, + {X: Field{[10]uint32{0x007e886f, 0x028da7a0, 0x02ed09c1, 0x03c45b5e, 0x00dc10db, 0x03f3fe4c, 0x038e702f, 0x003e0711, 0x034655f9, 0x001c1645}}, Y: Field{[10]uint32{0x0205a59f, 0x0255426c, 0x02f8c64b, 0x010747cd, 0x03d09d3f, 0x0182a8fd, 0x031ec925, 0x03c32836, 0x00a4b9d6, 0x002099e8}}}, + {X: Field{[10]uint32{0x025434bf, 0x00886b30, 0x0031eb76, 0x01b938c7, 0x0114cc5a, 0x01004858, 0x036469f8, 0x02818e9e, 0x00bcc43c, 0x003bf69e}}, Y: Field{[10]uint32{0x02fa2864, 0x038de055, 0x032aa92b, 0x0191126b, 0x034cdf80, 0x00c64f44, 0x0121b135, 0x03e1643d, 0x03f6ef45, 0x001ed0db}}}, + {X: Field{[10]uint32{0x010ccc34, 0x01b4251d, 0x02f0e430, 0x01d00068, 0x0335fbd8, 0x02015aba, 0x0230988c, 0x002578e9, 0x030f5d62, 0x0008a692}}, Y: Field{[10]uint32{0x0234de6e, 0x028d6578, 0x034288be, 0x00d771a8, 0x00741acf, 0x01a9466f, 0x01694cef, 0x01d38f4b, 0x03af491c, 0x0005c34c}}}, + {X: Field{[10]uint32{0x02f07100, 0x0238bb1a, 0x03f178ce, 0x02d2069a, 0x03f91860, 0x02b343e4, 0x01d44b83, 0x0084c862, 0x008e20a0, 0x0031dc3d}}, Y: Field{[10]uint32{0x00266eec, 0x03e18870, 0x038c9610, 0x02fdf82f, 0x02a6d8db, 0x00c96fab, 0x0143aca3, 0x00647e7b, 0x00d38b2a, 0x001f8448}}}, + {X: Field{[10]uint32{0x0286aa44, 0x0121a6bc, 0x00af8eb7, 0x0260f509, 0x01e89b89, 0x002c626a, 0x020a48a2, 0x00754a2d, 0x00630390, 0x002976cb}}, Y: Field{[10]uint32{0x00af1e50, 0x03868dc9, 0x03a1446f, 0x021a0146, 0x010384e1, 0x0270dfbb, 0x034e6abd, 0x0356c069, 0x01926a93, 0x002e6587}}}, + {X: Field{[10]uint32{0x0241db1c, 0x01eca636, 0x005ff007, 0x01233a8b, 0x024b447e, 0x005a36e6, 0x03897b7c, 0x000a2298, 0x029e9f33, 0x000fb1c5}}, Y: Field{[10]uint32{0x03053fb2, 0x01de0d7c, 0x00b49e44, 0x01a04b96, 0x024b3be2, 0x034d2935, 0x004aa34e, 0x003b688b, 0x034de8e6, 0x0030ffa5}}}, + {X: Field{[10]uint32{0x035bf3b3, 0x00b0453e, 0x02b777cf, 0x024f3a4b, 0x03810cff, 0x0267923a, 0x0060d4cf, 0x00461356, 0x0217c331, 0x002dccf7}}, Y: Field{[10]uint32{0x000c11b0, 0x038690d2, 0x0290ad28, 0x033a7c9a, 0x0157fc4a, 0x02ed855c, 0x000d537e, 0x002b4c80, 0x00dd72d2, 0x00031d70}}}, + {X: Field{[10]uint32{0x002ed278, 0x0140585b, 0x01df28b4, 0x0279aa08, 0x00027db5, 0x005601d7, 0x0149616a, 0x02f09057, 0x0208d555, 0x0015f5b8}}, Y: Field{[10]uint32{0x0346eba8, 0x00d31b0d, 0x02891fca, 0x00b9b3ca, 0x0274b5d0, 0x014ecd3d, 0x028e3533, 0x036968d4, 0x0279d130, 0x0020e1c2}}}, + {X: Field{[10]uint32{0x02d3673d, 0x0249621a, 0x03aab8d7, 0x0027f6cb, 0x026f0694, 0x00823dbc, 0x032fd3c3, 0x0291e0ef, 0x00f1aa69, 0x0027908d}}, Y: Field{[10]uint32{0x008d0653, 0x00dccf8a, 0x0029bd75, 0x005abffb, 0x019fb42b, 0x01e81610, 0x03ed0414, 0x03af0fa2, 0x03737725, 0x0017e691}}}, + {X: Field{[10]uint32{0x02b68173, 0x00fc7ce6, 0x00a758d4, 0x03c9d81a, 0x0322e4fc, 0x0362ba44, 0x0096202f, 0x00bff6f6, 0x039d9fc1, 0x001bf8ff}}, Y: Field{[10]uint32{0x0109fa1b, 0x00f688ad, 0x02a3c2ab, 0x0058f9fe, 0x010bf94e, 0x02482316, 0x03ef7b50, 0x0118209c, 0x02821d41, 0x003bc355}}}, + {X: Field{[10]uint32{0x005c4631, 0x02ab96ed, 0x0161fff2, 0x015f446c, 0x0154c492, 0x01532d26, 0x02af415e, 0x01b867be, 0x014fd258, 0x000b0c79}}, Y: Field{[10]uint32{0x03311346, 0x003908c4, 0x0308bd8e, 0x015069c1, 0x00039af3, 0x03ee0979, 0x0353c0e9, 0x02c6b39f, 0x00ad364a, 0x002fb7ec}}}, + {X: Field{[10]uint32{0x00203ebc, 0x019839de, 0x037823b8, 0x0225270b, 0x004d745b, 0x02e4ce16, 0x00ea2ee2, 0x01230d1e, 0x02590231, 0x0014565c}}, Y: Field{[10]uint32{0x02aa1817, 0x027cefd9, 0x033628a5, 0x03396984, 0x03b81ff7, 0x015e4140, 0x03dc4702, 0x02dd0f13, 0x0153f688, 0x000ca7d8}}}, + {X: Field{[10]uint32{0x01caf1f4, 0x010791b3, 0x03d6070d, 0x0213378d, 0x020d3946, 0x03d4733e, 0x03fcb3bd, 0x035ee370, 0x032458f7, 0x000622cc}}, Y: Field{[10]uint32{0x03901910, 0x0195a934, 0x03104487, 0x030a22ab, 0x003d1dde, 0x026671aa, 0x026b04c8, 0x02845cc6, 0x01dad112, 0x000137a9}}}, + {X: Field{[10]uint32{0x03a6e471, 0x00dcb573, 0x0090e307, 0x033dfc4f, 0x0085f804, 0x0384f8aa, 0x02b0a494, 0x03856233, 0x0241a503, 0x00248163}}, Y: Field{[10]uint32{0x00ec108a, 0x01c95761, 0x0151068e, 0x01e96334, 0x01bcbe17, 0x0085dfa5, 0x025a230e, 0x01a1785f, 0x02d4449e, 0x000da01c}}}, + {X: Field{[10]uint32{0x00099fcf, 0x011e20cd, 0x0105d5b6, 0x03a27a0c, 0x03726f79, 0x01bab14d, 0x03a7a689, 0x01941bc9, 0x022644e0, 0x001a9bd4}}, Y: Field{[10]uint32{0x01132586, 0x0268cb69, 0x013214c1, 0x0269692d, 0x007104e7, 0x01d261fd, 0x027b6645, 0x0360fac5, 0x014bd8ce, 0x0033cfb7}}}, + {X: Field{[10]uint32{0x0376bb26, 0x03e49bc8, 0x0148d89c, 0x0008d3c0, 0x03c77c34, 0x035523cd, 0x021e0efa, 0x03730f28, 0x02a2340c, 0x001f8df3}}, Y: Field{[10]uint32{0x009a0016, 0x027fa6b3, 0x0369e83b, 0x00af4c72, 0x026b02d4, 0x0172f08a, 0x022938e0, 0x01f1aac1, 0x029b42a2, 0x0031cb60}}}, + {X: Field{[10]uint32{0x00d0b667, 0x023ee0b6, 0x00c5ad84, 0x00314b0f, 0x00800d01, 0x0325ea37, 0x03b4b39b, 0x01b3deeb, 0x0069cf0f, 0x00079b08}}, Y: Field{[10]uint32{0x0260196f, 0x031c8e23, 0x03e81f86, 0x02198c2d, 0x00491469, 0x032c2450, 0x02cfbdc2, 0x03611a1b, 0x0276bca1, 0x00030607}}}, + {X: Field{[10]uint32{0x02f07e16, 0x00fbd6c1, 0x00be3520, 0x00f32901, 0x02f36ba4, 0x0112d1fa, 0x02336c8d, 0x0293dec1, 0x000fe6ee, 0x00155998}}, Y: Field{[10]uint32{0x01057e55, 0x03f87380, 0x0278b5a7, 0x0059da56, 0x0269e5ac, 0x03cdcbb6, 0x00acb4c0, 0x0065e7b5, 0x008f7adc, 0x001aeef4}}}, + {X: Field{[10]uint32{0x01c791b5, 0x0341f64c, 0x03a7619a, 0x005b54a6, 0x00690450, 0x017653e3, 0x01c5adc4, 0x00717008, 0x034ded45, 0x0010d718}}, Y: Field{[10]uint32{0x034d4cc1, 0x02d391f1, 0x02c14024, 0x01d8adbd, 0x02850098, 0x0254f032, 0x006f9591, 0x02943c88, 0x02688252, 0x000c7b78}}}, + {X: Field{[10]uint32{0x0057b9b6, 0x0108d0a7, 0x027e9dd1, 0x00abe157, 0x01f19a0d, 0x014a9053, 0x01c06122, 0x01c71ce5, 0x00e6a660, 0x001bee33}}, Y: Field{[10]uint32{0x0368e052, 0x017627c9, 0x034c5b84, 0x03baaff8, 0x02183dad, 0x0208c989, 0x0399fad6, 0x014c5351, 0x0249e2f0, 0x0005fe50}}}, + {X: Field{[10]uint32{0x0180dc36, 0x037a30ca, 0x01890148, 0x028a6781, 0x0011c711, 0x0153b98d, 0x016a695f, 0x01325252, 0x029920fc, 0x00219bcf}}, Y: Field{[10]uint32{0x018d62f7, 0x0221e1b4, 0x0109bae1, 0x000ba0de, 0x01f5211f, 0x030036cb, 0x00a11e13, 0x030f074e, 0x01af4f8d, 0x003a6715}}}, + {X: Field{[10]uint32{0x00468b2d, 0x01bd8620, 0x03c79461, 0x002df009, 0x0162404f, 0x0372f941, 0x024f7234, 0x0122669c, 0x0010b716, 0x0020304d}}, Y: Field{[10]uint32{0x000b91aa, 0x037e254a, 0x016216d8, 0x03870b10, 0x01bd6e8f, 0x0371a74e, 0x03592819, 0x00793f5e, 0x002e71a0, 0x00218c65}}}, + {X: Field{[10]uint32{0x02a7da99, 0x00577060, 0x004d2c38, 0x030292e9, 0x00bf37ab, 0x005eedbb, 0x03e68bec, 0x02762014, 0x01eeef4e, 0x0023e16f}}, Y: Field{[10]uint32{0x0217897e, 0x027edfbb, 0x02962b4a, 0x017927b9, 0x034e8c29, 0x02a96468, 0x00f8ce78, 0x00d0b2bc, 0x03df8ae9, 0x000db516}}}, + {X: Field{[10]uint32{0x01600749, 0x01280692, 0x022aa440, 0x039209b6, 0x0317a920, 0x03ba286c, 0x00edaf40, 0x03369833, 0x032b3393, 0x00027342}}, Y: Field{[10]uint32{0x02fc5a5a, 0x03977baa, 0x00463414, 0x024a9258, 0x023a00c4, 0x03c313a8, 0x0101e348, 0x01942ec6, 0x035a51d9, 0x000e0c74}}}, + {X: Field{[10]uint32{0x009f33b0, 0x0380ddf5, 0x032d3bdb, 0x032b7fe8, 0x02003ab7, 0x01d31de6, 0x03832f79, 0x01fff5b3, 0x01af15c6, 0x0028317c}}, Y: Field{[10]uint32{0x01cb91ec, 0x00a5a080, 0x03c57800, 0x00aee210, 0x03307939, 0x0188317f, 0x03344123, 0x01898905, 0x00d442de, 0x001abfd0}}}, + {X: Field{[10]uint32{0x00edfacc, 0x0208c4d6, 0x02d7890a, 0x01c0df2c, 0x02c01113, 0x03b100e7, 0x021fbf02, 0x03885f5f, 0x03400013, 0x002bce5b}}, Y: Field{[10]uint32{0x02cfb936, 0x03a53d66, 0x024bc936, 0x0267a161, 0x016754c5, 0x0017c397, 0x0035d167, 0x014d28b7, 0x01e25a57, 0x002aabae}}}, + {X: Field{[10]uint32{0x01ed0eaf, 0x039c7124, 0x01307cf1, 0x01c7cbe2, 0x0187d4c0, 0x02f8d65e, 0x02871b0d, 0x03b3179f, 0x0057e3e0, 0x003f6b0f}}, Y: Field{[10]uint32{0x00a09fc7, 0x03981a0f, 0x00b18cde, 0x03fd7684, 0x02b14d14, 0x033f8db5, 0x00877afc, 0x03c259cf, 0x00cca22e, 0x000c0a28}}}, + {X: Field{[10]uint32{0x02fa88b7, 0x011c767b, 0x0103e14a, 0x035aab14, 0x00ae745f, 0x023bebb7, 0x012b6a96, 0x02eaa6b8, 0x01239587, 0x0038ebac}}, Y: Field{[10]uint32{0x02f769c7, 0x00ce5ef2, 0x036cd2d3, 0x00168b23, 0x017b4603, 0x02c9f469, 0x006833fb, 0x01512f8c, 0x038652c1, 0x001fb471}}}, + {X: Field{[10]uint32{0x038352f5, 0x01694335, 0x00a0e605, 0x01e8f8f8, 0x000eb83d, 0x0246b2e5, 0x00cc663c, 0x00058bed, 0x01e3382a, 0x0025aebb}}, Y: Field{[10]uint32{0x00c50cbc, 0x02b8167c, 0x039972ad, 0x0187a963, 0x0105100d, 0x02e4c022, 0x00c3a80f, 0x00a090e2, 0x0297b3ad, 0x001e1c8b}}}, + {X: Field{[10]uint32{0x03f5f5b5, 0x0013b88e, 0x03e408de, 0x008911a8, 0x02ba93d1, 0x036d51bf, 0x01e1eda4, 0x0158dfcd, 0x01561697, 0x001a1c12}}, Y: Field{[10]uint32{0x014ca494, 0x00d86f18, 0x005ff46e, 0x0099dc90, 0x02934bd2, 0x01310986, 0x006c7a20, 0x011c7ce8, 0x02feb5f7, 0x001891f4}}}, + {X: Field{[10]uint32{0x00bcf749, 0x0257827d, 0x01ad7940, 0x014be0fb, 0x0362eaf6, 0x02c374ac, 0x0202d72e, 0x03e1622b, 0x02342ca1, 0x001c7331}}, Y: Field{[10]uint32{0x012a45fb, 0x027e60f7, 0x02c686cb, 0x02510aa5, 0x01aee177, 0x01c0f968, 0x00e3f222, 0x0039a52a, 0x03d923b1, 0x00121eba}}}, + {X: Field{[10]uint32{0x0235d3f0, 0x002cfb3d, 0x00dff25d, 0x02ebc927, 0x01713844, 0x03a2d842, 0x00cd1831, 0x0268b816, 0x01d06573, 0x001bf687}}, Y: Field{[10]uint32{0x0078108e, 0x02597d48, 0x013df60a, 0x00f554dc, 0x00a232a9, 0x02a22a2c, 0x00a96c32, 0x032dc93e, 0x00f48afc, 0x0028bb91}}}, + {X: Field{[10]uint32{0x01147f45, 0x005b31b5, 0x03b64b10, 0x03d60e39, 0x0165cbfc, 0x02651c45, 0x02395c13, 0x0365ed17, 0x0309ff5a, 0x0034fc9d}}, Y: Field{[10]uint32{0x03265077, 0x024559e4, 0x0161a043, 0x03854767, 0x0329006e, 0x026ef5b1, 0x02026ed2, 0x03870d53, 0x0016cdc8, 0x003e5b2b}}}, + {X: Field{[10]uint32{0x00a011d6, 0x038d9ba9, 0x0278641e, 0x024e38af, 0x0268f827, 0x02e0a4b1, 0x027d064b, 0x01bbfde2, 0x0144a28a, 0x0009ee86}}, Y: Field{[10]uint32{0x027bdcab, 0x03dea613, 0x014d0a77, 0x01755d1a, 0x01fcbe30, 0x0163c15c, 0x0312fc94, 0x0190c39c, 0x00759d21, 0x00092fbe}}}, + {X: Field{[10]uint32{0x004fe190, 0x039f4025, 0x0348ee35, 0x011061c1, 0x01772f4c, 0x021cb83a, 0x03ca9ff7, 0x01f3820b, 0x00125fd8, 0x003f4dee}}, Y: Field{[10]uint32{0x03dcb453, 0x01ee6809, 0x02951184, 0x01118041, 0x028ec68a, 0x02ccdf7c, 0x01b8c43f, 0x0066376e, 0x0125d9ae, 0x00251429}}}, + {X: Field{[10]uint32{0x02071c69, 0x013322a3, 0x00b802c2, 0x02296576, 0x03446751, 0x00caa005, 0x0329b63f, 0x00f83634, 0x00ca9258, 0x0036659f}}, Y: Field{[10]uint32{0x03376c25, 0x0192ba5c, 0x02ab97ed, 0x034c85e7, 0x0328361c, 0x00b96bc9, 0x0086dbb9, 0x0275a4ef, 0x0273c2c3, 0x001ab28d}}}, + {X: Field{[10]uint32{0x014a0a3c, 0x027b502e, 0x0044f3d8, 0x017c38f4, 0x02f53cd4, 0x03f65705, 0x02798efb, 0x0007af48, 0x013c4a8d, 0x0023ba0b}}, Y: Field{[10]uint32{0x011e1b2d, 0x0189b1de, 0x022f036c, 0x02836ceb, 0x0379c8b6, 0x0356e702, 0x0271c3af, 0x03ee742a, 0x037e9167, 0x00382c2a}}}, + {X: Field{[10]uint32{0x00562caa, 0x022876c3, 0x01a4764c, 0x0336fc8b, 0x038d709c, 0x0140a5c1, 0x03ea0291, 0x02d526a7, 0x03d2817c, 0x001187b0}}, Y: Field{[10]uint32{0x036684af, 0x01abd1eb, 0x0259adb1, 0x0036c218, 0x0126cdf8, 0x00594100, 0x00f6e126, 0x025e4144, 0x017dcb5c, 0x001986cb}}}, + {X: Field{[10]uint32{0x01f5793e, 0x00406f50, 0x01890673, 0x0203cf79, 0x0059f517, 0x014ffdae, 0x01bb7ffb, 0x032bb51a, 0x005c0935, 0x000c5562}}, Y: Field{[10]uint32{0x0043dfff, 0x010d3388, 0x0181e28d, 0x0309a71d, 0x0208ca6a, 0x023cd5db, 0x00bbdfe0, 0x00423e34, 0x00e992ac, 0x00180d65}}}, + {X: Field{[10]uint32{0x024ea9eb, 0x0109d60a, 0x02f0dcad, 0x028ae7ed, 0x00c68a60, 0x03621d39, 0x02267a0a, 0x02670641, 0x03b0ad91, 0x00172b24}}, Y: Field{[10]uint32{0x000032ab, 0x008ee662, 0x0234a0e4, 0x0254df99, 0x03c48e72, 0x035d20fa, 0x0161fe7a, 0x036ae5a6, 0x0298a116, 0x0020dbea}}}, + {X: Field{[10]uint32{0x0156cc42, 0x03b15b1a, 0x039047e3, 0x01d09121, 0x0154d052, 0x02a3c05e, 0x02eea1c4, 0x03bd5a2d, 0x03acafd5, 0x0007edb4}}, Y: Field{[10]uint32{0x022a5411, 0x00f6bf4b, 0x00839313, 0x0120460f, 0x027431be, 0x014318d8, 0x036a1ec0, 0x013cc9b7, 0x01f2f89e, 0x002e3be4}}}, + {X: Field{[10]uint32{0x002b28f2, 0x03f1dcf6, 0x02bdcd31, 0x015fdeec, 0x0369fe01, 0x03f7b9ec, 0x00618f03, 0x0001768c, 0x01e152f0, 0x0022702c}}, Y: Field{[10]uint32{0x00b4a507, 0x01deac60, 0x007a9254, 0x0362b27d, 0x01ad8223, 0x009b19ed, 0x0105de5b, 0x01a05ab3, 0x0357bbf4, 0x001875b8}}}, + {X: Field{[10]uint32{0x039a211e, 0x01eac6ed, 0x01751080, 0x02f83cc7, 0x007cb968, 0x01064c90, 0x023875a3, 0x006bf359, 0x018b1f9d, 0x0001f174}}, Y: Field{[10]uint32{0x00779ff3, 0x02e70def, 0x01b3b6dc, 0x02c4a5b2, 0x03d136b5, 0x0353a517, 0x023b4495, 0x03683ef4, 0x03ea985b, 0x00117ef9}}}, + {X: Field{[10]uint32{0x0159f85c, 0x027744fc, 0x03792ddf, 0x034e978b, 0x00b6afda, 0x017adfc0, 0x031ad4db, 0x0042326c, 0x03c19393, 0x003209f3}}, Y: Field{[10]uint32{0x013a1cb1, 0x006aa99d, 0x01a129c3, 0x00f758cd, 0x000330ea, 0x0265478b, 0x03e12fc8, 0x03500553, 0x007a3025, 0x001717f8}}}, + {X: Field{[10]uint32{0x03cc5d9b, 0x005e1d55, 0x001e6571, 0x0201541d, 0x002e0dfa, 0x01ac806d, 0x01e2fa40, 0x03df7081, 0x032bb1f3, 0x0018d1ec}}, Y: Field{[10]uint32{0x028c3ba4, 0x02f868eb, 0x02e52e22, 0x03cec5c3, 0x01a455d3, 0x03e2b09b, 0x00d72553, 0x034d3292, 0x02109508, 0x003e3cc3}}}, + {X: Field{[10]uint32{0x03ae1014, 0x00748999, 0x00130e0a, 0x00ea5266, 0x02bfa21f, 0x036c0cab, 0x02e42837, 0x0040757d, 0x0195e822, 0x0035227d}}, Y: Field{[10]uint32{0x027c66a9, 0x0299b648, 0x000c22b4, 0x037fae54, 0x012bfa98, 0x00987e32, 0x024c33d1, 0x02851a3d, 0x02898dc4, 0x0022c44b}}}, + {X: Field{[10]uint32{0x00a6205b, 0x0016372e, 0x000b276f, 0x01cf50ef, 0x0102200d, 0x039da991, 0x02b8f981, 0x03ef3ab7, 0x0063fb4a, 0x002432e7}}, Y: Field{[10]uint32{0x02e74645, 0x00c93394, 0x0087ba02, 0x01ed6fdb, 0x002611a7, 0x00811c76, 0x02f19c67, 0x01fc6aee, 0x01c0f6ba, 0x002252bf}}}, + {X: Field{[10]uint32{0x02196af4, 0x0269e55a, 0x0018bbc4, 0x01b1a67a, 0x00869bb0, 0x002a6255, 0x026a1bef, 0x0087d395, 0x00bb19f1, 0x001037da}}, Y: Field{[10]uint32{0x020cec90, 0x02f758c8, 0x0269da31, 0x034a90c7, 0x02e1d6b3, 0x01843dad, 0x009f8303, 0x037df0c7, 0x0009d0ce, 0x001c3507}}}, + {X: Field{[10]uint32{0x03da41bf, 0x00450ea0, 0x009d78b4, 0x007acd55, 0x00a888dd, 0x00c7c5ff, 0x00962b64, 0x01411647, 0x0174a0ac, 0x00124dbf}}, Y: Field{[10]uint32{0x03ff4f92, 0x02d7fc86, 0x03392c5a, 0x00ad7743, 0x013fc5b7, 0x02cfc73d, 0x0068af85, 0x0214fb5f, 0x01dd6517, 0x000cea38}}}, + {X: Field{[10]uint32{0x02023557, 0x03a0ac36, 0x03594288, 0x039eca8f, 0x03c1a0c6, 0x025601d2, 0x03aad592, 0x01d6e3d6, 0x01388110, 0x0005c5dd}}, Y: Field{[10]uint32{0x01b10837, 0x02ec1cb0, 0x0077504b, 0x00a08e6a, 0x01b163fe, 0x00d36848, 0x03a0c5f7, 0x01d0b179, 0x0014efd8, 0x00160f52}}}, + {X: Field{[10]uint32{0x038926a2, 0x01dc33d3, 0x02bab586, 0x023c0da4, 0x006abb11, 0x03c87c82, 0x014c82d8, 0x0117aad0, 0x03fbad51, 0x002849ad}}, Y: Field{[10]uint32{0x022ec669, 0x032cb46b, 0x00394452, 0x0251a679, 0x0288d465, 0x007dffb0, 0x02bfdb74, 0x02d34868, 0x0017b601, 0x001e6d2b}}}, + {X: Field{[10]uint32{0x02871163, 0x0039c0eb, 0x004fdba3, 0x02361a61, 0x023485db, 0x03619694, 0x015de512, 0x00012035, 0x0361f884, 0x00147b33}}, Y: Field{[10]uint32{0x02a8d50f, 0x032bb4cb, 0x03dcee87, 0x02a55e94, 0x0012b2c6, 0x0003a824, 0x000c46a2, 0x0327c20b, 0x025397bd, 0x001652b4}}}, + {X: Field{[10]uint32{0x02b3c7a9, 0x016e8ed4, 0x02882510, 0x00e22d45, 0x03d89844, 0x01e7496b, 0x01966cca, 0x01c4c7d5, 0x02336f1b, 0x0025de05}}, Y: Field{[10]uint32{0x03214c60, 0x03a2764e, 0x01516e47, 0x03bbd0d5, 0x02105011, 0x0149d7ad, 0x01a20e0a, 0x023f8337, 0x0141b4b0, 0x003c77cd}}}, + {X: Field{[10]uint32{0x0093f7fe, 0x01e6f80b, 0x03f01cdb, 0x00ea1c2e, 0x0064231d, 0x0068d73a, 0x038cf6db, 0x0236ad71, 0x003a7224, 0x0022f0b1}}, Y: Field{[10]uint32{0x00cbb425, 0x02ef8385, 0x01b2ef49, 0x001e009a, 0x030b428f, 0x03eee75e, 0x028106af, 0x0276fc27, 0x0276173e, 0x00354b8b}}}, + {X: Field{[10]uint32{0x01aef9f2, 0x014f9401, 0x020d9799, 0x01d7a267, 0x036c3271, 0x012e42cd, 0x00abd033, 0x02846729, 0x00816c7c, 0x00167b5e}}, Y: Field{[10]uint32{0x02449910, 0x02981a85, 0x02133152, 0x0094d2f1, 0x02207794, 0x019a7836, 0x01b46a28, 0x003faf93, 0x0027690c, 0x0008e7f0}}}, + {X: Field{[10]uint32{0x03c70fda, 0x0033dacb, 0x025200ca, 0x0268b2ad, 0x01c8ff8e, 0x00a8e716, 0x01923907, 0x01265750, 0x01d17671, 0x002fb0e6}}, Y: Field{[10]uint32{0x010ba8e7, 0x0266ff6b, 0x03fbf709, 0x01f3bf17, 0x02a21a2f, 0x0394bcd1, 0x021ab9ad, 0x0082348e, 0x01ef7831, 0x003ff12f}}}, + {X: Field{[10]uint32{0x020c4d34, 0x00d62167, 0x0307668a, 0x036d6318, 0x019e3b87, 0x0348a9df, 0x01f99517, 0x03c76fe9, 0x01eef4ce, 0x0024ef49}}, Y: Field{[10]uint32{0x0335b4dc, 0x039aa1d9, 0x00860794, 0x018c0d01, 0x01fa008c, 0x03e265c3, 0x003b1f94, 0x006e1269, 0x00129736, 0x00375f45}}}, + {X: Field{[10]uint32{0x02ddcf58, 0x039b2483, 0x00f8e3e8, 0x0316f7a9, 0x0344e553, 0x01d15695, 0x00b2e708, 0x01354456, 0x0257fb4e, 0x002c80e9}}, Y: Field{[10]uint32{0x02d8c99c, 0x0200d657, 0x03a6a0ac, 0x029e866b, 0x03c74ae5, 0x010fee9e, 0x030d4c75, 0x03860987, 0x01480c63, 0x0026091a}}}, + {X: Field{[10]uint32{0x00f6aa69, 0x01a0f760, 0x024e70be, 0x008533fd, 0x023e20ac, 0x0076a2aa, 0x018a28d1, 0x009ed604, 0x013c1dcd, 0x002bce2d}}, Y: Field{[10]uint32{0x009fd919, 0x030cbe70, 0x02c16acd, 0x01e463e2, 0x035ec101, 0x028feb19, 0x02867237, 0x00ad08d1, 0x0136ba8b, 0x002478e2}}}, + {X: Field{[10]uint32{0x03fd8518, 0x0315d3da, 0x02d862f8, 0x01c83d79, 0x02988ed4, 0x002ad33b, 0x00587562, 0x03601788, 0x025b0b99, 0x00157936}}, Y: Field{[10]uint32{0x00eb2d35, 0x005845eb, 0x0130940b, 0x00963c5e, 0x02e7713b, 0x00d30d9b, 0x01b5976c, 0x0274cb85, 0x02347517, 0x001cda2f}}}, + {X: Field{[10]uint32{0x002133f5, 0x00e83279, 0x035d9018, 0x01b74968, 0x01a3608c, 0x03605f64, 0x021a15e1, 0x0389020f, 0x002aa7eb, 0x0034f5fa}}, Y: Field{[10]uint32{0x005d504b, 0x029f53ff, 0x03bfcae6, 0x01a5b06f, 0x024b1c6d, 0x031789dc, 0x01080b06, 0x00df1a25, 0x01cce895, 0x00029491}}}, + {X: Field{[10]uint32{0x02e48799, 0x01b9699b, 0x003f2231, 0x012da31b, 0x03beab75, 0x03732641, 0x021e8031, 0x0110de5d, 0x039fe6b5, 0x0022f453}}, Y: Field{[10]uint32{0x0178fe19, 0x0042bfda, 0x00603891, 0x009f66ba, 0x00ecb2eb, 0x0158ce1a, 0x0263a263, 0x01895d45, 0x0150a387, 0x003e2770}}}, + {X: Field{[10]uint32{0x02212932, 0x0223f488, 0x0370485c, 0x016c1208, 0x023a7dbc, 0x01ca9688, 0x02b08589, 0x003d0b3f, 0x036503f5, 0x002c75c8}}, Y: Field{[10]uint32{0x002143ac, 0x03cdc5b0, 0x0025570b, 0x013801f4, 0x01627986, 0x0216c877, 0x00aa52d3, 0x0387e6dd, 0x01d8594e, 0x0010165f}}}, + {X: Field{[10]uint32{0x039d3023, 0x03d3dc99, 0x013a8593, 0x000c1787, 0x01c22d44, 0x001173bd, 0x03e4763e, 0x0248324e, 0x03e1cb7d, 0x001134c0}}, Y: Field{[10]uint32{0x0189a70c, 0x004b1857, 0x02004769, 0x02a6806c, 0x03e77e41, 0x00f8f3b8, 0x03d6fcc8, 0x0368bcc6, 0x02fc5ed6, 0x001e7ef7}}}, + {X: Field{[10]uint32{0x030cb3ca, 0x03ae848e, 0x00aed3df, 0x026420f5, 0x02925589, 0x0183ae65, 0x03bd4b90, 0x02aba5c9, 0x0054447a, 0x0005957b}}, Y: Field{[10]uint32{0x0226fcdf, 0x03b39419, 0x017443b9, 0x029ac76b, 0x006ea28f, 0x027c1b65, 0x00f7bf8a, 0x038c7a62, 0x0178cf96, 0x0023a439}}}, + {X: Field{[10]uint32{0x005a3f29, 0x01eedf61, 0x02cb1971, 0x00120032, 0x027902b1, 0x0226439b, 0x01a93261, 0x019afd9b, 0x03fb5305, 0x002c0ab8}}, Y: Field{[10]uint32{0x03006876, 0x000c1f5e, 0x0105162a, 0x00ca4a98, 0x03d8c052, 0x02ce5d09, 0x03b76311, 0x00c0c466, 0x0313f448, 0x0031b4c9}}}, + {X: Field{[10]uint32{0x00c5bcd3, 0x03927344, 0x02c6e065, 0x0266854f, 0x018e1236, 0x02c4ae6b, 0x015e1402, 0x0010ae1d, 0x016653a0, 0x0004f119}}, Y: Field{[10]uint32{0x02d41c88, 0x024b1441, 0x002b0044, 0x02a29e2c, 0x007bab13, 0x00eb0f84, 0x0121ea40, 0x0180f8f1, 0x032c498f, 0x001c3cd9}}}, + {X: Field{[10]uint32{0x00f1483f, 0x03b68f01, 0x034c6361, 0x00fc5077, 0x010dee48, 0x017a5ece, 0x01c7bffc, 0x00dee0ba, 0x022b03fc, 0x0039f1d5}}, Y: Field{[10]uint32{0x03454066, 0x00be39b0, 0x028331b1, 0x026076ec, 0x021a9372, 0x01e85b43, 0x03dce515, 0x01256306, 0x00603d2b, 0x001cd2f9}}}, + {X: Field{[10]uint32{0x0159aefc, 0x035fee8a, 0x038d2263, 0x00870c12, 0x03332f39, 0x02f1ec9f, 0x02b2ed1e, 0x03f1d4d0, 0x012dfb6c, 0x00378097}}, Y: Field{[10]uint32{0x02de12f1, 0x01dbc705, 0x005985e6, 0x007601a5, 0x001a88c3, 0x020dce8c, 0x02fc30c3, 0x03cf40b6, 0x01b16ab6, 0x0011b182}}}, + {X: Field{[10]uint32{0x02ca2e01, 0x00b0c8cf, 0x03e4b6a4, 0x03d20e05, 0x0225730a, 0x02ebc14e, 0x01db714a, 0x0070f497, 0x00b4fed2, 0x000879e2}}, Y: Field{[10]uint32{0x01c1c4c6, 0x00a7f6b9, 0x03c58ddd, 0x03e73504, 0x01b249b1, 0x008cd6e7, 0x02af9b83, 0x01d64ad9, 0x02bda7d0, 0x0007f9c5}}}, + {X: Field{[10]uint32{0x0379edce, 0x033fc41e, 0x02012e39, 0x02776a5f, 0x02d1bc1a, 0x01d6ca39, 0x0058242c, 0x03542c69, 0x03ca7481, 0x0029f6c9}}, Y: Field{[10]uint32{0x01ae73f8, 0x00d860dc, 0x02238851, 0x0348ec47, 0x00084239, 0x02569f31, 0x0055fc17, 0x039b074d, 0x006dcabd, 0x00313e1a}}}, + {X: Field{[10]uint32{0x022d477a, 0x03d92d97, 0x01ccf41a, 0x00faf56f, 0x01e80a7d, 0x02b22533, 0x01616275, 0x03c90388, 0x01732790, 0x00314814}}, Y: Field{[10]uint32{0x022ba20b, 0x02fab27d, 0x03cda463, 0x00290150, 0x00af8770, 0x03ab70fe, 0x028e216d, 0x004283c3, 0x015b2094, 0x003a6a8a}}}, + {X: Field{[10]uint32{0x0172846d, 0x00dc7125, 0x01d05ea9, 0x03aa2e15, 0x0138e91e, 0x00dbaf36, 0x0025f86d, 0x036bafc7, 0x00ad99d1, 0x00121efd}}, Y: Field{[10]uint32{0x00febf70, 0x02a55dbf, 0x00ffe791, 0x01c21b78, 0x0032f729, 0x013062b8, 0x004b2a50, 0x03b42fb8, 0x0037ac6d, 0x00204a4e}}}, + {X: Field{[10]uint32{0x0208cb53, 0x005120c3, 0x03cb13cd, 0x01d083b7, 0x01355675, 0x03958097, 0x03e2d550, 0x01a22e13, 0x02a6bfcf, 0x002f5b74}}, Y: Field{[10]uint32{0x01ab0fca, 0x00dcc936, 0x01a1a1b0, 0x00b34714, 0x000c467d, 0x00a14566, 0x02a1501c, 0x00e018e3, 0x01e184c8, 0x00321a91}}}, + {X: Field{[10]uint32{0x035ec737, 0x02931f08, 0x02ce7936, 0x00619caf, 0x0070dbca, 0x0019cc7a, 0x034fbb69, 0x0223904c, 0x03fdfbf1, 0x00252905}}, Y: Field{[10]uint32{0x01be8e34, 0x026910f6, 0x01765029, 0x024d51be, 0x03564e9f, 0x033edf65, 0x02af124b, 0x03052e07, 0x0207343e, 0x00380f19}}}, + {X: Field{[10]uint32{0x02aba51e, 0x02236519, 0x00fa8ebd, 0x034c0e5a, 0x002ac597, 0x005e88f0, 0x02d9b733, 0x00ec9aa5, 0x02c33fa1, 0x000a95f6}}, Y: Field{[10]uint32{0x00c13b61, 0x02ca4dfa, 0x010c442d, 0x0366016d, 0x013b05bf, 0x0117cd3f, 0x027996e5, 0x02cee2c2, 0x02bf1db7, 0x0005d529}}}, + {X: Field{[10]uint32{0x007e7df7, 0x0242dffb, 0x01742eae, 0x0284b0fe, 0x02d1c66d, 0x00c20f0c, 0x00613e99, 0x00a8e59f, 0x02710614, 0x002e8b92}}, Y: Field{[10]uint32{0x034cb07e, 0x01eb3fa0, 0x00c971da, 0x00d6091f, 0x02ccc6de, 0x02b7b197, 0x03fc60c5, 0x03a0efb5, 0x00c1a704, 0x003098be}}}, + {X: Field{[10]uint32{0x00c01ca9, 0x018baa3b, 0x015a80a8, 0x02681cc3, 0x0008bb0b, 0x03eef609, 0x00a12b11, 0x00944b4a, 0x0343b313, 0x0012b865}}, Y: Field{[10]uint32{0x0017eece, 0x01323de8, 0x0019320b, 0x00f0fe75, 0x00cb2788, 0x029aa2e8, 0x001ec7c0, 0x00fa8747, 0x027d48fa, 0x0019edc9}}}, + {X: Field{[10]uint32{0x0306ddcb, 0x0143a9dd, 0x023ad618, 0x02fd046d, 0x000778b9, 0x01dd24fc, 0x00e6ff9d, 0x00d99fc6, 0x026c8182, 0x000133ec}}, Y: Field{[10]uint32{0x00e4028e, 0x00789dc9, 0x020c778e, 0x01e70e5e, 0x01aa6c60, 0x001f0c84, 0x017af164, 0x024f7c13, 0x023e3a8c, 0x000437e2}}}, + {X: Field{[10]uint32{0x01130349, 0x034f6e57, 0x02561934, 0x0009bdf5, 0x0215f061, 0x00f01418, 0x03bc3efb, 0x02d9bc03, 0x0166a014, 0x0027e791}}, Y: Field{[10]uint32{0x0396c592, 0x005f4964, 0x015fb0a4, 0x027333f2, 0x02ab6e5c, 0x01682a9e, 0x03d0c17c, 0x009aee63, 0x03a276d5, 0x00124ae2}}}, + {X: Field{[10]uint32{0x00239301, 0x033c7dab, 0x03bd222e, 0x0252d57c, 0x03ecf2a1, 0x0045678b, 0x039f4c10, 0x02d582c3, 0x01133641, 0x0038db01}}, Y: Field{[10]uint32{0x0343736c, 0x01696f6e, 0x00c7faa0, 0x004eb0ac, 0x0220e9a1, 0x027e0ea0, 0x022aea8e, 0x03f1018c, 0x00ba48e7, 0x0031ff5d}}}, + {X: Field{[10]uint32{0x00480bbf, 0x027e0936, 0x025e033e, 0x02938fb1, 0x02a0bbe0, 0x03c76846, 0x0337580b, 0x0115a1e1, 0x03b3b94d, 0x00246c04}}, Y: Field{[10]uint32{0x00cfc5b4, 0x00bc8afa, 0x03f00647, 0x02b0f4d9, 0x02948790, 0x038cf45c, 0x026f8247, 0x0094a48a, 0x007ec13a, 0x000578dc}}}, + {X: Field{[10]uint32{0x02324f56, 0x00fdc8fa, 0x001077d4, 0x01eb5d74, 0x00041f66, 0x0354e7cb, 0x02782de2, 0x01b5488d, 0x03888c67, 0x00095345}}, Y: Field{[10]uint32{0x0014094a, 0x00944cf2, 0x002755fd, 0x037e5e5d, 0x0309bec3, 0x02cb6fc9, 0x034aa03b, 0x0079744f, 0x012e9351, 0x003dc10b}}}, + {X: Field{[10]uint32{0x02f4079a, 0x00d59e15, 0x03f0b061, 0x018a65a5, 0x0234fce6, 0x0288bc5b, 0x03abe442, 0x003dc4ab, 0x037ece7d, 0x00114b5a}}, Y: Field{[10]uint32{0x03776998, 0x00c5691f, 0x02d23db3, 0x0164504c, 0x029a39ee, 0x0384c812, 0x000d69fc, 0x03f9d8d0, 0x03a128cf, 0x00087aa2}}}, + {X: Field{[10]uint32{0x004c508b, 0x01451e73, 0x001631f1, 0x02157ca3, 0x02817831, 0x02c660b4, 0x0386b855, 0x023d0606, 0x01d00788, 0x0005602e}}, Y: Field{[10]uint32{0x01d689ff, 0x03403d70, 0x02dc3ecd, 0x02abd95d, 0x0365b69f, 0x01e306df, 0x03cbbe87, 0x036775ce, 0x029c78b3, 0x00136747}}}, + {X: Field{[10]uint32{0x02fc2700, 0x00e582a8, 0x02f450c4, 0x01fb4212, 0x0245a5aa, 0x033c9680, 0x011470c2, 0x0253245b, 0x023fc316, 0x001e7768}}, Y: Field{[10]uint32{0x015bc978, 0x03c968ea, 0x03c03c34, 0x0086855b, 0x02d7158c, 0x01dc0c73, 0x0374e0f3, 0x02363312, 0x0169a58b, 0x001f1ef0}}}, + {X: Field{[10]uint32{0x0149dbe6, 0x036bb850, 0x013b5fe2, 0x00141119, 0x02419b49, 0x017d2a83, 0x02500afb, 0x0337084f, 0x03a9bf80, 0x00219b69}}, Y: Field{[10]uint32{0x026bd3d7, 0x02066add, 0x0124b239, 0x00b1af19, 0x02081a28, 0x022af126, 0x027e8adc, 0x015ea9a1, 0x00b3b45d, 0x00189b4e}}}, + {X: Field{[10]uint32{0x0011d374, 0x012e02e5, 0x0122e102, 0x032be641, 0x02cdb502, 0x01818ae5, 0x01624cfc, 0x01c7a4c8, 0x0112bed2, 0x0010caf2}}, Y: Field{[10]uint32{0x0011cf01, 0x0339a8f9, 0x03605bcd, 0x030aebae, 0x034cb341, 0x03175177, 0x020cc5ac, 0x01350507, 0x009edd7c, 0x00399151}}}, + {X: Field{[10]uint32{0x0010518e, 0x00fb27d9, 0x01be477b, 0x02b420e9, 0x030717f5, 0x009764de, 0x02970865, 0x00e16854, 0x032883ec, 0x002b0f4e}}, Y: Field{[10]uint32{0x00b9b8db, 0x031c9a21, 0x01a125fc, 0x03e55061, 0x033dde58, 0x0039e439, 0x00d01b2c, 0x01f9d704, 0x02fcc9ed, 0x003449bb}}}, + {X: Field{[10]uint32{0x03d6aa37, 0x00f690ea, 0x0064a5c1, 0x018a5834, 0x03fa18b2, 0x01ab8999, 0x03696d95, 0x00e175b6, 0x034b2a82, 0x00115c20}}, Y: Field{[10]uint32{0x01236f28, 0x0121ac18, 0x004e121a, 0x0192b590, 0x03d9d15c, 0x02a565f9, 0x022eb590, 0x02fe21ee, 0x0083b249, 0x0007a758}}}, + {X: Field{[10]uint32{0x0183ef15, 0x00d5752e, 0x03fd3341, 0x0144dabb, 0x02b224b0, 0x0058f02a, 0x029bf792, 0x03816df0, 0x02a0ffaa, 0x00223a69}}, Y: Field{[10]uint32{0x018d1e5a, 0x01a4c91c, 0x00413999, 0x01d746ba, 0x00fe4574, 0x01e6aebf, 0x00ef5e25, 0x018fab71, 0x022dfa2f, 0x003b4e0a}}}, + {X: Field{[10]uint32{0x02dff706, 0x0361d20a, 0x0348c04f, 0x00ef5b25, 0x00b39703, 0x02b5fd86, 0x005663dc, 0x009f1a94, 0x02b4de33, 0x0005a043}}, Y: Field{[10]uint32{0x0260c81b, 0x02f0b3fb, 0x0111901f, 0x01f96a7b, 0x0230693b, 0x00370a6b, 0x019e84c4, 0x01b27485, 0x03d89132, 0x0000d4ba}}}, + {X: Field{[10]uint32{0x014adf7b, 0x00cc0726, 0x01cabe2e, 0x03650fea, 0x0088c861, 0x0223455f, 0x01c65035, 0x01260473, 0x02929506, 0x0035f40e}}, Y: Field{[10]uint32{0x002f9627, 0x00578d8e, 0x003ef2a9, 0x023f66aa, 0x02ef419c, 0x0339e079, 0x023042d5, 0x00b01472, 0x03fe933c, 0x00232082}}}, + {X: Field{[10]uint32{0x01cf11b0, 0x03c994b7, 0x018d91c6, 0x01df9154, 0x03f33aed, 0x0220339e, 0x0225c4ae, 0x02b24093, 0x0104f645, 0x0016cb25}}, Y: Field{[10]uint32{0x01296449, 0x02271d8a, 0x00354fc2, 0x02893abb, 0x03440e1d, 0x023ca901, 0x01681e5e, 0x013cc847, 0x03bcc776, 0x001402cd}}}, + {X: Field{[10]uint32{0x00fbd761, 0x012b7523, 0x01c2d628, 0x0137d5e7, 0x03bab1a6, 0x03567bb0, 0x01826759, 0x022ef05a, 0x02edd2c7, 0x00346389}}, Y: Field{[10]uint32{0x010770c3, 0x031fbd5f, 0x021a44a6, 0x03684e4b, 0x00685915, 0x016eda51, 0x018989aa, 0x00f9e23f, 0x0172037a, 0x00068780}}}, + {X: Field{[10]uint32{0x0258222d, 0x00d338a3, 0x0077224f, 0x02fe1759, 0x02dc9e46, 0x03c94951, 0x0221e88d, 0x011e5632, 0x00169bbc, 0x0017dac5}}, Y: Field{[10]uint32{0x037fd6a6, 0x02ab6bd2, 0x00600e02, 0x02378e0f, 0x033a5791, 0x018f992e, 0x03ca0bf1, 0x00140651, 0x02164d5a, 0x000ea39d}}}, + {X: Field{[10]uint32{0x03762bc7, 0x036f2283, 0x0137339b, 0x00289508, 0x01ec2e05, 0x03fa15a4, 0x00020238, 0x02d159a6, 0x01e8dcc8, 0x0035e989}}, Y: Field{[10]uint32{0x02ea3643, 0x0142d34d, 0x0080620d, 0x029c4000, 0x00208683, 0x03b07f63, 0x017bcbcf, 0x00981eaf, 0x0135a8ce, 0x0023c7e6}}}, + {X: Field{[10]uint32{0x015913f9, 0x03198fa3, 0x027716ba, 0x0325780a, 0x027ffb42, 0x0286cd3a, 0x01c891b3, 0x0293dc57, 0x001972ae, 0x00295a95}}, Y: Field{[10]uint32{0x03c3f994, 0x0266a41a, 0x038971e9, 0x008d9038, 0x0059b440, 0x01fd7451, 0x00f7bbfa, 0x0159c460, 0x03cdad78, 0x0011ecf7}}}, + {X: Field{[10]uint32{0x02ade31e, 0x0045beae, 0x03c3ad93, 0x02ccd86d, 0x0030325d, 0x028c1ad1, 0x031a3cd4, 0x032f44de, 0x01d7e574, 0x0007aee2}}, Y: Field{[10]uint32{0x00da4dc7, 0x01401d4e, 0x03e6cb95, 0x00cd24d5, 0x02ee020c, 0x0108a8d0, 0x003d1185, 0x03212d26, 0x012fbd30, 0x00080e71}}}, + {X: Field{[10]uint32{0x009706fe, 0x024ea22d, 0x030c5ad4, 0x03e8fb93, 0x03e189ef, 0x01e63b09, 0x01cd1a4a, 0x0195d52d, 0x0208931a, 0x002d5ca0}}, Y: Field{[10]uint32{0x03ede9ee, 0x037df442, 0x036c214d, 0x0028c5e0, 0x03358f68, 0x01881e2f, 0x029a6125, 0x034c072c, 0x01e72da3, 0x002ae9e1}}}, + {X: Field{[10]uint32{0x01a775c9, 0x015f2161, 0x00a8aa24, 0x025d1ebf, 0x02f5162a, 0x03ff07bd, 0x02a00dee, 0x01f1dc80, 0x0270d67b, 0x00159985}}, Y: Field{[10]uint32{0x018803f6, 0x01128953, 0x019b2ea0, 0x024ce7c6, 0x014de8a8, 0x015274f0, 0x0055122e, 0x01441c13, 0x00e183bc, 0x002b6bc2}}}, + {X: Field{[10]uint32{0x01f2704d, 0x001a3c37, 0x023e93fd, 0x0346c5c2, 0x01c18521, 0x015cded4, 0x01042433, 0x01ada5dc, 0x02e1ecc8, 0x00062ad5}}, Y: Field{[10]uint32{0x0119e94a, 0x020967a0, 0x039ff46b, 0x01fb387f, 0x03df74f0, 0x032cc158, 0x009572ca, 0x02ea6c83, 0x003f43bf, 0x00331a53}}}, + {X: Field{[10]uint32{0x020ac357, 0x0283c6f3, 0x027c3c1a, 0x0214b83c, 0x036e9451, 0x02fd7d43, 0x035b7540, 0x000d8055, 0x00744827, 0x002f04aa}}, Y: Field{[10]uint32{0x01ada1e9, 0x0005f1bc, 0x036f95de, 0x01598bfc, 0x00abe12d, 0x00812b39, 0x027783c7, 0x01738759, 0x036bac17, 0x00271b39}}}, + {X: Field{[10]uint32{0x01054584, 0x01eb119e, 0x024572c2, 0x0259776f, 0x01756667, 0x014fb29d, 0x01bdd6c3, 0x036835bb, 0x002699b2, 0x00291253}}, Y: Field{[10]uint32{0x0082d621, 0x014e1b54, 0x01d03554, 0x01a4ee2b, 0x02e8f0cf, 0x00756c6e, 0x022a9146, 0x02a79f4f, 0x00d58360, 0x00162601}}}, + {X: Field{[10]uint32{0x023aea6e, 0x012b2733, 0x009c7828, 0x038ba8f7, 0x03f1baf9, 0x000da809, 0x034de77d, 0x0139faf8, 0x02f96d0e, 0x0007fe11}}, Y: Field{[10]uint32{0x013f2e6a, 0x00f84b59, 0x009748d0, 0x03be94b7, 0x0327ba3e, 0x01302da3, 0x035d1a8d, 0x00d580c7, 0x036b9f0e, 0x0022828c}}}, + {X: Field{[10]uint32{0x0110b374, 0x023c7ca5, 0x00099ffa, 0x0090d5d1, 0x026862d7, 0x005cfdc5, 0x00839e04, 0x00f771ca, 0x02ae9157, 0x000cc606}}, Y: Field{[10]uint32{0x01c5223e, 0x039f27ef, 0x01fedad0, 0x01acf86a, 0x01f01ee2, 0x030d3129, 0x01aaa0a4, 0x03393077, 0x029a8cc8, 0x00049484}}}, + {X: Field{[10]uint32{0x00012594, 0x0232795e, 0x02ae5702, 0x001bf931, 0x00644264, 0x01c9d2a5, 0x0249b157, 0x0112bbdd, 0x032dfb0e, 0x0039a1e0}}, Y: Field{[10]uint32{0x0113b7c0, 0x030312a9, 0x030028ca, 0x0263bb2a, 0x03c5de4f, 0x01dffedf, 0x01caec8c, 0x00d2ded9, 0x009706b7, 0x001796ce}}}, + {X: Field{[10]uint32{0x00b37def, 0x031cbce5, 0x02aa5755, 0x01477d31, 0x0000c229, 0x028631db, 0x0174b5e2, 0x01c6b160, 0x02c3ed93, 0x000d52ef}}, Y: Field{[10]uint32{0x0214c29a, 0x02a0ff31, 0x0244b5c2, 0x03beeeae, 0x033c2f4d, 0x01d0078f, 0x0213ac73, 0x0105b6cd, 0x00769283, 0x00103432}}}, + {X: Field{[10]uint32{0x0039a485, 0x01bdc99d, 0x00511ae3, 0x02ffe8bd, 0x02a8bc68, 0x02d7afbc, 0x01e8aa68, 0x02e07cf2, 0x006c5205, 0x003e91ab}}, Y: Field{[10]uint32{0x0367d180, 0x01354b8f, 0x03b35c1b, 0x01e9d97e, 0x010f2565, 0x00fe4461, 0x00de37b1, 0x034aa007, 0x01fab016, 0x000e14fe}}}, + {X: Field{[10]uint32{0x0024328c, 0x01fb50cc, 0x02688562, 0x01de517d, 0x0256a53d, 0x008fee1b, 0x005263c9, 0x017e387a, 0x02b73325, 0x00109be1}}, Y: Field{[10]uint32{0x028c4fdf, 0x03bef353, 0x011486a2, 0x0105abfe, 0x01658c63, 0x01ec8885, 0x013c4c45, 0x0322756c, 0x01685301, 0x0024bb00}}}, + {X: Field{[10]uint32{0x00bc64e3, 0x02db9620, 0x01edeb47, 0x03b2d6b8, 0x017685df, 0x01f5233c, 0x01d3f4d1, 0x00b56f85, 0x009bf9a7, 0x00172347}}, Y: Field{[10]uint32{0x01bda7e5, 0x0343df4a, 0x02dc4e18, 0x014d9074, 0x00b6a26b, 0x0083c37b, 0x038a3c7c, 0x02054198, 0x010e286c, 0x00188155}}}, + {X: Field{[10]uint32{0x0283422f, 0x02f95c39, 0x03c80271, 0x01cfe998, 0x01be6733, 0x01aa72c0, 0x00313562, 0x01407f77, 0x01bc7bf7, 0x000e8087}}, Y: Field{[10]uint32{0x001bfa53, 0x01ec3793, 0x00fff54c, 0x0209217f, 0x02a7a71b, 0x0015924a, 0x00e508ad, 0x037e25e1, 0x00540dda, 0x00192a27}}}, + {X: Field{[10]uint32{0x03ba47bb, 0x012bc9c8, 0x0326fa50, 0x030c8a59, 0x027c0062, 0x007590b6, 0x01d2dd91, 0x027c001d, 0x02491d71, 0x002360aa}}, Y: Field{[10]uint32{0x03e4e77a, 0x01718b14, 0x026991ff, 0x03f51d83, 0x007c2ae8, 0x031b4f14, 0x00ed10d6, 0x01e3da62, 0x03506d14, 0x001b985b}}}, + {X: Field{[10]uint32{0x005e536f, 0x03c2394f, 0x02d76f27, 0x0145b9ea, 0x010bbe54, 0x032b06cf, 0x015d60ef, 0x023869bb, 0x0188fe48, 0x001bfbba}}, Y: Field{[10]uint32{0x0044c502, 0x00a6632c, 0x00eeff48, 0x0184d781, 0x0073dcee, 0x0096da28, 0x026d8484, 0x02ea5ae8, 0x0395839f, 0x00003ba7}}}, + {X: Field{[10]uint32{0x0216fa1b, 0x00f9672b, 0x00e5d2df, 0x002ba257, 0x02306388, 0x005024f1, 0x03cadc73, 0x00355dcb, 0x0179bafd, 0x000d8902}}, Y: Field{[10]uint32{0x004afa48, 0x005f1872, 0x036ca65f, 0x003055e0, 0x03eb2082, 0x01f60cb2, 0x02fe3267, 0x00f6169e, 0x037658ef, 0x00186740}}}, + {X: Field{[10]uint32{0x036a18f4, 0x026128f3, 0x03407009, 0x0132461d, 0x000b7849, 0x01ba05c1, 0x0046fc32, 0x01814f08, 0x00474da5, 0x00130ae2}}, Y: Field{[10]uint32{0x0328142c, 0x007f884e, 0x03398dda, 0x038f432a, 0x03734286, 0x01716a08, 0x00a0b438, 0x035c4587, 0x026917a4, 0x001166a7}}}, + {X: Field{[10]uint32{0x01478ac2, 0x004beeac, 0x005ad84e, 0x0142bdee, 0x00d6e54f, 0x0141130d, 0x034eb5b1, 0x0046ea9f, 0x01fdb332, 0x003e4872}}, Y: Field{[10]uint32{0x02016973, 0x005243eb, 0x014f9317, 0x030d7356, 0x01e31fae, 0x03dfd893, 0x006b16a5, 0x0120f923, 0x01b8c850, 0x000e336a}}}, + {X: Field{[10]uint32{0x0319b257, 0x00b1ac86, 0x038b8ca4, 0x01f7d079, 0x02850ae0, 0x028ff6d3, 0x006c8a7d, 0x035a3e3e, 0x01e66181, 0x00295dda}}, Y: Field{[10]uint32{0x027cfc6c, 0x0276bf14, 0x00eb3882, 0x0260a03e, 0x011dcd66, 0x013542e9, 0x017e00d5, 0x0310afdd, 0x007e644b, 0x00084aa6}}}, + {X: Field{[10]uint32{0x03c11d9f, 0x02a526b1, 0x0063901e, 0x0053fb5d, 0x03375a27, 0x00f26c5a, 0x00c91952, 0x03b2b622, 0x010437ab, 0x002569e0}}, Y: Field{[10]uint32{0x02cfdf78, 0x007b2ca8, 0x0274809e, 0x01da4688, 0x00ec6428, 0x03c46925, 0x02723df1, 0x0015ac90, 0x00aa227b, 0x003ab8c8}}}, + {X: Field{[10]uint32{0x01cfa42a, 0x03503d0a, 0x020e5d10, 0x01761612, 0x009f034a, 0x03a61002, 0x01a9a64c, 0x00f850ab, 0x0034f7ef, 0x001da9f8}}, Y: Field{[10]uint32{0x028effa2, 0x0251a2d9, 0x0240479c, 0x025948a8, 0x009f2e49, 0x02f0bbb7, 0x00ec9319, 0x03acf0a9, 0x00e49633, 0x00266770}}}, + {X: Field{[10]uint32{0x035881d6, 0x023347ba, 0x0247df4e, 0x03357a50, 0x01427010, 0x036df60b, 0x00ddf929, 0x01e01407, 0x03964756, 0x003aea24}}, Y: Field{[10]uint32{0x03bca552, 0x029a6d76, 0x026a50d4, 0x022a3692, 0x02aebe0f, 0x005b3175, 0x037d8be6, 0x014850fc, 0x01f1c088, 0x002e4ab8}}}, + {X: Field{[10]uint32{0x0223704f, 0x03cf875b, 0x028addd3, 0x0225c4f3, 0x01dc0b75, 0x02bb51cd, 0x014f872a, 0x038559ac, 0x00d8059f, 0x00294e92}}, Y: Field{[10]uint32{0x01387fb6, 0x022d454e, 0x02a0d252, 0x00619db3, 0x004f4634, 0x03b9f559, 0x009403f3, 0x028ea0f6, 0x01a07e85, 0x00279ce3}}}, + {X: Field{[10]uint32{0x0307d3bc, 0x013f57a9, 0x00fb595b, 0x03e660a2, 0x03c831cd, 0x001418e9, 0x039b1481, 0x03e28e38, 0x010bdba5, 0x0020c996}}, Y: Field{[10]uint32{0x03768982, 0x01986caf, 0x02b06cb4, 0x013ca5f9, 0x03061b7d, 0x03e904c3, 0x000d62ec, 0x037494b4, 0x0388a2a1, 0x000280b3}}}, + {X: Field{[10]uint32{0x03916030, 0x02b1b7c5, 0x014af7f5, 0x00b02571, 0x03b0c35a, 0x01e9d2cb, 0x01714a21, 0x0042ff8c, 0x0194ba8c, 0x001a9248}}, Y: Field{[10]uint32{0x00c77b87, 0x01b148be, 0x0145db6b, 0x0001bfaf, 0x01c531cd, 0x013f0ca2, 0x02e8b4fb, 0x024dea4b, 0x01658e0c, 0x000f3c2f}}}, + {X: Field{[10]uint32{0x03c52a57, 0x030c1a0c, 0x007474b6, 0x004df8f5, 0x013b34bf, 0x01ae8887, 0x0180c494, 0x01fbb587, 0x01c6ff79, 0x002d2b1c}}, Y: Field{[10]uint32{0x012820f7, 0x000d41b5, 0x03683905, 0x01837e04, 0x0214ae3b, 0x01893835, 0x03d23434, 0x03fbf3bc, 0x02e48fb6, 0x0011ab2c}}}, + {X: Field{[10]uint32{0x0286e0bc, 0x0064c5b0, 0x02f9b49a, 0x024e8707, 0x0113b19b, 0x0155ec84, 0x03f05b4e, 0x00a7845a, 0x011e65bc, 0x0022c45c}}, Y: Field{[10]uint32{0x02af0dde, 0x0241e322, 0x004910aa, 0x03d71c8b, 0x00faa6bc, 0x02d3ab96, 0x02d695e5, 0x00d4e086, 0x00cfcf38, 0x001e7128}}}, + {X: Field{[10]uint32{0x0008e098, 0x013d90d1, 0x0192d897, 0x030db5e8, 0x00727362, 0x0203f789, 0x0203f82e, 0x0095e65d, 0x0276e86b, 0x002e2c02}}, Y: Field{[10]uint32{0x013e56c6, 0x006dbe14, 0x03d0a585, 0x03ede121, 0x029e0b9f, 0x03ab5ecb, 0x006fa1cf, 0x002375f3, 0x03188b01, 0x000176d9}}}, + {X: Field{[10]uint32{0x01d89814, 0x038b4b58, 0x03a52c50, 0x01a41917, 0x02bebe8f, 0x026dc4f1, 0x0027a8f6, 0x02e5a14d, 0x021b0fb6, 0x0022130e}}, Y: Field{[10]uint32{0x03a3749b, 0x01963381, 0x00fbf14d, 0x012f56c6, 0x00ff28aa, 0x03d537b0, 0x003f821d, 0x00bbbcdd, 0x00e5094b, 0x000f6b30}}}, + {X: Field{[10]uint32{0x00637596, 0x0291fe5d, 0x037d8496, 0x006abad8, 0x02c004dd, 0x02fdbed3, 0x004100dc, 0x02fd8ff8, 0x01cf51aa, 0x000f4307}}, Y: Field{[10]uint32{0x025df51c, 0x010c8d82, 0x0305d228, 0x004cf8bb, 0x02883fe0, 0x0267eedd, 0x0242a6f5, 0x038b3418, 0x015bbf5d, 0x0015dbaf}}}, + {X: Field{[10]uint32{0x02bca8c7, 0x020478b6, 0x028fa13f, 0x02d8f54c, 0x031ae972, 0x009deddf, 0x0057f79a, 0x026b7097, 0x01af6153, 0x0015acfb}}, Y: Field{[10]uint32{0x012e98eb, 0x02b19b4b, 0x01347dbd, 0x02ade6cf, 0x0096bdfb, 0x0376a574, 0x02b3d2b5, 0x021809c6, 0x0100a2b2, 0x00100e0e}}}, + {X: Field{[10]uint32{0x03cfd3e2, 0x02417eca, 0x01457a74, 0x0360c67e, 0x025fbb11, 0x0115217f, 0x00eacfa8, 0x01327d0d, 0x01bf50f3, 0x00109b8a}}, Y: Field{[10]uint32{0x03cb117a, 0x004c660c, 0x017a35d6, 0x02237c7d, 0x00eeb60b, 0x00ee77d0, 0x0110cd5c, 0x01031883, 0x02e8eeff, 0x003ab11f}}}, + {X: Field{[10]uint32{0x02929308, 0x014329d8, 0x03ea67ed, 0x03ed6ff0, 0x03cf0a91, 0x00bb6b71, 0x01419baa, 0x0135fb1b, 0x03c9f4e2, 0x002555cd}}, Y: Field{[10]uint32{0x001675dd, 0x02b3bb52, 0x0260867b, 0x02d6ee0b, 0x01b69831, 0x0166fd91, 0x02783143, 0x024100be, 0x009d18fd, 0x0025eeee}}}, + {X: Field{[10]uint32{0x00b3e514, 0x021405fa, 0x004a1cbb, 0x02820e9e, 0x00704e74, 0x035f9eb4, 0x03ae639f, 0x009e83cb, 0x0013d464, 0x00175caa}}, Y: Field{[10]uint32{0x00876c2f, 0x00584f2e, 0x005ac9bc, 0x00dbd471, 0x022e8c26, 0x0267ae56, 0x01d6839a, 0x03187956, 0x010e851f, 0x00324bd0}}}, + {X: Field{[10]uint32{0x0369b6ef, 0x0146edf9, 0x02406225, 0x02701e14, 0x02dda784, 0x01c12570, 0x00876d91, 0x02224188, 0x0359e9bc, 0x0031f6a4}}, Y: Field{[10]uint32{0x01c10653, 0x02530fc1, 0x001c6d37, 0x031720bc, 0x01cb41f6, 0x012831f6, 0x01907872, 0x02340257, 0x01687150, 0x000489e0}}}, + {X: Field{[10]uint32{0x029ac683, 0x024193d5, 0x01ace972, 0x035ff86b, 0x02d92697, 0x0082b945, 0x03ee080f, 0x03c3f70b, 0x0226da7a, 0x0019c202}}, Y: Field{[10]uint32{0x0316d94d, 0x008b3f08, 0x03714aa5, 0x0339e7dd, 0x008e08c5, 0x01443ab0, 0x0144107e, 0x01c22cc2, 0x03acfbba, 0x002b6681}}}, + {X: Field{[10]uint32{0x03fc0dbf, 0x00015c16, 0x01a4163a, 0x00117055, 0x023947f4, 0x00b8ebeb, 0x0078ddc8, 0x00a3ddbe, 0x0239d614, 0x00084356}}, Y: Field{[10]uint32{0x028c511c, 0x02c600cb, 0x017ac96e, 0x01324fa6, 0x002efa80, 0x01ea464f, 0x014cc296, 0x00a70bb4, 0x03e6b0a6, 0x00185fbf}}}, + {X: Field{[10]uint32{0x0334ed98, 0x00874138, 0x015fc590, 0x0071bfd9, 0x039b8e46, 0x01e0df44, 0x03242a93, 0x0046e714, 0x0231ca15, 0x001742e4}}, Y: Field{[10]uint32{0x03e924ae, 0x00e99baf, 0x01986bd1, 0x0387dbe3, 0x011a2f58, 0x0279f5b3, 0x03ae1b4a, 0x013b69c4, 0x0121f479, 0x003201c0}}}, + {X: Field{[10]uint32{0x02907392, 0x01e299f8, 0x00ab63ce, 0x00abf344, 0x019013fe, 0x0131c65d, 0x00c8bd54, 0x004587b4, 0x002c4210, 0x001a1eee}}, Y: Field{[10]uint32{0x000d9eeb, 0x017a5984, 0x03e356a2, 0x020440e5, 0x03fafc8e, 0x022c8273, 0x03c721cf, 0x028e9be7, 0x0187758a, 0x003abd8f}}}, + {X: Field{[10]uint32{0x025f5d33, 0x01a9b473, 0x00da40e6, 0x0347d2f3, 0x03c63527, 0x03cb0ffc, 0x02a3931f, 0x023da068, 0x0157b804, 0x00146910}}, Y: Field{[10]uint32{0x0047dd31, 0x009ffa7a, 0x02a1ec51, 0x019cb6e5, 0x001a0c56, 0x00298e24, 0x03dc8f42, 0x00a50053, 0x0116519c, 0x001bff23}}}, + {X: Field{[10]uint32{0x01e86775, 0x01c2f2e3, 0x004f989f, 0x02c8af5f, 0x000a5dd7, 0x01e30eff, 0x024786a4, 0x00568d58, 0x017256f5, 0x002ca189}}, Y: Field{[10]uint32{0x0264f3a3, 0x0364cb51, 0x03692abc, 0x037917c5, 0x02f53b64, 0x024a4bfe, 0x0267e5b2, 0x014e5ade, 0x02a80a5a, 0x0008aba5}}}, + {X: Field{[10]uint32{0x0035bc30, 0x01f1ff82, 0x02e584bb, 0x02f3ee4a, 0x036ee129, 0x028e5884, 0x03d89a5c, 0x01e32bba, 0x021e2010, 0x003ddadc}}, Y: Field{[10]uint32{0x02c0d561, 0x00bd28f9, 0x024b7a06, 0x00e07a5a, 0x03223a0a, 0x0186ebff, 0x02b3d171, 0x026100f5, 0x02b10841, 0x0016671a}}}, + {X: Field{[10]uint32{0x00178e9c, 0x001f0d31, 0x01b9793b, 0x022cdb7b, 0x01d9a3b8, 0x03da5a44, 0x02f20b7f, 0x03b81ba0, 0x028763ad, 0x0004bc92}}, Y: Field{[10]uint32{0x0055b7f1, 0x01e35638, 0x021b7351, 0x037c230b, 0x02b2427f, 0x00a09efb, 0x025d939c, 0x007edec9, 0x039f96f0, 0x00167f5e}}}, + {X: Field{[10]uint32{0x0122260a, 0x008878c6, 0x010cefa0, 0x0117123e, 0x00bcfaf1, 0x01609033, 0x0082d477, 0x01aef8a8, 0x0290de6c, 0x002786e2}}, Y: Field{[10]uint32{0x03390f9f, 0x02966042, 0x000a66cd, 0x001ba923, 0x008a71eb, 0x0025f401, 0x02a54f42, 0x036781f0, 0x02a5b54b, 0x003e97a1}}}, + {X: Field{[10]uint32{0x03baae9c, 0x00240c4b, 0x020a38c1, 0x03e1b134, 0x01ed4117, 0x00a38c7c, 0x01b6a66e, 0x00fadec0, 0x010320b7, 0x0018fc16}}, Y: Field{[10]uint32{0x0101d8eb, 0x02fa2c65, 0x019c501a, 0x032aebd7, 0x0340bd68, 0x0098e1df, 0x0288967a, 0x0207f81b, 0x01d2d34a, 0x00092e32}}}, + {X: Field{[10]uint32{0x03905999, 0x0264ad18, 0x003a8e27, 0x01ba671d, 0x01e5c89b, 0x0367ca15, 0x03569a4a, 0x00a8f687, 0x0009f540, 0x00111f1d}}, Y: Field{[10]uint32{0x0149e154, 0x0240dc2b, 0x0328db77, 0x01ce2e4f, 0x00716baa, 0x03805b02, 0x0337723b, 0x01e8251e, 0x019ab34a, 0x003513a3}}}, + {X: Field{[10]uint32{0x00793254, 0x03c437fe, 0x006df1bb, 0x03d28fe6, 0x0025eed4, 0x003c65f9, 0x037db0c2, 0x0102bead, 0x006a4c53, 0x001d2910}}, Y: Field{[10]uint32{0x03742023, 0x0261fad9, 0x0246dfc7, 0x02f014aa, 0x02dc4c07, 0x00711ac5, 0x0136907d, 0x029c4a33, 0x038a0a4b, 0x00058b59}}}, + {X: Field{[10]uint32{0x03047c07, 0x00c91ba3, 0x005ff3a2, 0x01d814e9, 0x022bf5e0, 0x010731ed, 0x00e63cc8, 0x0098deac, 0x01713187, 0x003dc0d4}}, Y: Field{[10]uint32{0x021097ef, 0x03ba7076, 0x00936cca, 0x032599c6, 0x02b3c7ee, 0x025cad67, 0x01762a95, 0x001e15c8, 0x03914f47, 0x003212c0}}}, + {X: Field{[10]uint32{0x02eaae11, 0x0267dbdc, 0x024f6ac9, 0x01a37285, 0x022194d1, 0x02c29054, 0x013bd706, 0x00d604b1, 0x007b57b2, 0x003b13f8}}, Y: Field{[10]uint32{0x02fff789, 0x00a3d728, 0x004d7b55, 0x01e6f74c, 0x01b2f9df, 0x026dd814, 0x02b1dc4e, 0x02ca7fb0, 0x029145de, 0x002bd254}}}, + {X: Field{[10]uint32{0x01d2ac9d, 0x02ead2b3, 0x0238878d, 0x011c47cd, 0x00c65520, 0x005a3435, 0x00b274ee, 0x005d3de8, 0x01e8fa96, 0x0005c55b}}, Y: Field{[10]uint32{0x0061ac3d, 0x01a00fc5, 0x00ca6abb, 0x0211e78a, 0x03c2de9f, 0x037b2e23, 0x00e37ed6, 0x01183261, 0x02c436c1, 0x0000ab8f}}}, + {X: Field{[10]uint32{0x021b2ede, 0x032990e6, 0x02a6aabf, 0x00302541, 0x01549cb9, 0x00374c33, 0x029be560, 0x011feb3e, 0x022b9c5a, 0x003906d1}}, Y: Field{[10]uint32{0x017507f4, 0x002fc440, 0x01311d38, 0x01308885, 0x03e1b360, 0x0231a563, 0x00fb3533, 0x02982b1a, 0x02b208bd, 0x000423f8}}}, + {X: Field{[10]uint32{0x0344aa38, 0x01bd0ddd, 0x015ad38a, 0x01e314ee, 0x03f357ea, 0x006a00e3, 0x00800515, 0x01e20f5e, 0x015920a6, 0x002e9b00}}, Y: Field{[10]uint32{0x02002cf3, 0x026d6e45, 0x03680457, 0x006d9a1b, 0x00cda144, 0x003a39c4, 0x0366aa5c, 0x02dd1a0c, 0x00e7deb6, 0x00369270}}}, + {X: Field{[10]uint32{0x00cbf1ae, 0x020d5a3e, 0x0329cee2, 0x014e1255, 0x037e8a95, 0x01f94998, 0x0102ab7f, 0x012dae1c, 0x006e883a, 0x0009bc06}}, Y: Field{[10]uint32{0x03d5f47a, 0x009176d2, 0x002d398b, 0x008c1d5c, 0x00aad788, 0x02568628, 0x01519809, 0x025f2b33, 0x01e4bb21, 0x0003bbe3}}}, + {X: Field{[10]uint32{0x000c9d22, 0x0007296d, 0x03cddc45, 0x038f6998, 0x03e00874, 0x00050398, 0x01b5588c, 0x033af0d4, 0x03de80c0, 0x000042e4}}, Y: Field{[10]uint32{0x00903258, 0x016d3407, 0x002842d0, 0x03c850d6, 0x001dfef7, 0x03b1257b, 0x0186b027, 0x03cdaf9e, 0x01ddf79a, 0x003b4c62}}}, + {X: Field{[10]uint32{0x03769dde, 0x0268f9dd, 0x002558bc, 0x0101db25, 0x017a1595, 0x03d6a315, 0x03b32da8, 0x020b0725, 0x0274337a, 0x0039e7b0}}, Y: Field{[10]uint32{0x028a06f6, 0x0145d898, 0x0102c3b6, 0x03660f5d, 0x02e527da, 0x02223cfb, 0x024c175d, 0x03f38d52, 0x039f22da, 0x0027c8c1}}}, + {X: Field{[10]uint32{0x03c101e1, 0x034c685b, 0x01b0c1b7, 0x038e4810, 0x002be265, 0x023832a9, 0x039915e0, 0x02b4ff22, 0x017544f0, 0x0003f680}}, Y: Field{[10]uint32{0x018902e7, 0x00bd7061, 0x0030d0db, 0x01dae128, 0x03e4d49a, 0x029415cc, 0x03e42981, 0x0271baf1, 0x022785d5, 0x001093a6}}}, + {X: Field{[10]uint32{0x0099c6bd, 0x033c46e8, 0x01b31577, 0x028f2f3f, 0x008327d8, 0x022f20c3, 0x03147258, 0x0337f940, 0x01cb5380, 0x001a07c0}}, Y: Field{[10]uint32{0x039002bc, 0x0252463c, 0x018cd007, 0x02b63836, 0x0359c02f, 0x03f279d5, 0x006cef06, 0x02c17e70, 0x0117cdc3, 0x002fe748}}}, + {X: Field{[10]uint32{0x03d12f64, 0x00825736, 0x039611de, 0x0236e7bf, 0x03d6fe9f, 0x02b28942, 0x0251f4d9, 0x00b30b74, 0x026b2a2d, 0x001c3096}}, Y: Field{[10]uint32{0x02966126, 0x02669346, 0x021f46b2, 0x00136647, 0x03134dae, 0x024fa96d, 0x03f4dc47, 0x02cb3f34, 0x0368a386, 0x00327bab}}}, + {X: Field{[10]uint32{0x03ccbb9d, 0x00486e27, 0x0330403b, 0x02143fa2, 0x023b466e, 0x03d02199, 0x03d5ea45, 0x010b53fb, 0x012c404b, 0x0011937b}}, Y: Field{[10]uint32{0x005d910b, 0x009c4884, 0x01260796, 0x01ef9069, 0x03610bb4, 0x0295a0d9, 0x02d2d3e0, 0x03d84c8e, 0x01046ad3, 0x002b044e}}}, + {X: Field{[10]uint32{0x03a103db, 0x00bc4d04, 0x023f02ad, 0x02406d73, 0x01b7ff89, 0x023177f0, 0x0055109a, 0x02466175, 0x037248e7, 0x00028cb7}}, Y: Field{[10]uint32{0x03160e72, 0x0084d292, 0x02173821, 0x034cf997, 0x00cf9ad8, 0x01d8a5b2, 0x02a2d1d8, 0x0241ae6b, 0x00fb9d60, 0x001b6d2d}}}, + {X: Field{[10]uint32{0x0165179a, 0x0254c540, 0x03fe9a76, 0x0370a971, 0x023ccb74, 0x013b13fa, 0x00297746, 0x034e725c, 0x029e7ee5, 0x003f9273}}, Y: Field{[10]uint32{0x03e7dc8c, 0x023c3e8f, 0x026e63f5, 0x020ad310, 0x0390bfc5, 0x018555c8, 0x03b98662, 0x01773bbb, 0x013a3592, 0x00194fd5}}}, + {X: Field{[10]uint32{0x0354ad14, 0x01cc5b8c, 0x01a878aa, 0x0028ab75, 0x01ec0f1a, 0x0049ac43, 0x0224750c, 0x029f0936, 0x0255c895, 0x0021a2cb}}, Y: Field{[10]uint32{0x02c299ef, 0x0187c91e, 0x00324efb, 0x02080201, 0x00776bca, 0x0298a46f, 0x03035941, 0x0067f5c7, 0x0074cdea, 0x00178a22}}}, + {X: Field{[10]uint32{0x00098461, 0x03422d63, 0x011aec63, 0x01fbf4cb, 0x03d267ff, 0x003f121a, 0x013f1c08, 0x00d31a2b, 0x00da90ae, 0x003f81e4}}, Y: Field{[10]uint32{0x00f7177e, 0x00efabdb, 0x03ef416f, 0x036d5a02, 0x02cdbfcc, 0x008b184c, 0x01a02444, 0x02ca0d1c, 0x0393de35, 0x002b4cc4}}}, + {X: Field{[10]uint32{0x03e9a9d9, 0x03609e5b, 0x039557f6, 0x03d59a0d, 0x0242a23b, 0x019f7fbe, 0x016b1961, 0x020373fc, 0x028d0f4f, 0x003f9ff2}}, Y: Field{[10]uint32{0x00d4eb3b, 0x023c72f6, 0x01b1e71c, 0x02738605, 0x02ccc572, 0x02051dab, 0x000cb3d6, 0x03a49776, 0x018a0d7e, 0x002ef137}}}, + {X: Field{[10]uint32{0x0034cfc2, 0x00da1625, 0x03fd23aa, 0x0263a7c0, 0x02ae7975, 0x00473d30, 0x011b11b5, 0x03882fad, 0x0270aa4c, 0x00288db0}}, Y: Field{[10]uint32{0x0088f29b, 0x00e8c7c8, 0x01f4c486, 0x0103eeda, 0x028bc370, 0x00230842, 0x00c3ade6, 0x02f7ad07, 0x01c575a7, 0x00164d66}}}, + {X: Field{[10]uint32{0x02519248, 0x0151bf1d, 0x03644565, 0x03ab6787, 0x02800472, 0x00e0d938, 0x028a3485, 0x0309fcfa, 0x00a56bb8, 0x00035a81}}, Y: Field{[10]uint32{0x0142deb9, 0x01c1a6ad, 0x00e079b7, 0x019889ba, 0x03dbf6e4, 0x015d8490, 0x03099aba, 0x01d8a48a, 0x030d50b9, 0x0012e551}}}, + {X: Field{[10]uint32{0x00a30e7f, 0x000baa7e, 0x02ebd74e, 0x00a0c986, 0x00677732, 0x035c0689, 0x0276f974, 0x00117f86, 0x0377d64a, 0x00342734}}, Y: Field{[10]uint32{0x0188ffea, 0x02a49359, 0x02e57b90, 0x03abb81a, 0x0141a342, 0x032be203, 0x02ed2d01, 0x000acf5d, 0x02b902b7, 0x0027c250}}}, + {X: Field{[10]uint32{0x01d98b8b, 0x0343a979, 0x03440b2e, 0x02fffc29, 0x01b9a469, 0x0071f8ff, 0x02e52456, 0x006a75b0, 0x032c16d0, 0x00340c31}}, Y: Field{[10]uint32{0x031f2c8e, 0x02c3c454, 0x006f473d, 0x019f2850, 0x03fddeee, 0x02baa10e, 0x02b60ffe, 0x03e60405, 0x0308dba4, 0x00031ac4}}}, + {X: Field{[10]uint32{0x0345a691, 0x031aec78, 0x03ba1100, 0x03dd5c1a, 0x0157d0c6, 0x002ce695, 0x01980ab8, 0x0129f510, 0x02c6d2c0, 0x0015b115}}, Y: Field{[10]uint32{0x02084819, 0x00d39909, 0x03189fae, 0x00968184, 0x02825ce5, 0x01d4f0ac, 0x0310ffc2, 0x01743e3b, 0x00dc2c73, 0x00316cbc}}}, + {X: Field{[10]uint32{0x008400c9, 0x0146eb0c, 0x0037d75e, 0x03178396, 0x0129d911, 0x0353f779, 0x01d1b98d, 0x0347d0a3, 0x01f3b505, 0x002ab56b}}, Y: Field{[10]uint32{0x0377acc6, 0x02ae1f89, 0x036e46af, 0x03c877d2, 0x00f55569, 0x01e431a3, 0x03aa411b, 0x02530448, 0x03674f79, 0x003a52b7}}}, + {X: Field{[10]uint32{0x026a0ef0, 0x0219e8d7, 0x0034e6b1, 0x030c67b4, 0x02ca1d43, 0x0062d32c, 0x006b089f, 0x02e3dd22, 0x00b4dd76, 0x002b2336}}, Y: Field{[10]uint32{0x037ba96d, 0x02753dc4, 0x001f3c75, 0x02d26f32, 0x02ffb71d, 0x032b73f1, 0x013f8271, 0x02ac55d0, 0x0094f9da, 0x001c75c2}}}, + {X: Field{[10]uint32{0x0047ca1d, 0x0314d5f7, 0x0394841d, 0x0143d085, 0x0093eb41, 0x01665ad1, 0x01d7a4d0, 0x03e91502, 0x006df110, 0x000e5900}}, Y: Field{[10]uint32{0x03ad7cdb, 0x0291b7c0, 0x017d6395, 0x01d0daff, 0x01c2f244, 0x00fc15f9, 0x022a2bd2, 0x0364ebe4, 0x006d21db, 0x00392847}}}, + {X: Field{[10]uint32{0x03ca56ec, 0x0387efde, 0x01d551a0, 0x03e3ed0f, 0x03723a1f, 0x02fe442d, 0x02a37b19, 0x004aedd3, 0x039227a3, 0x000af842}}, Y: Field{[10]uint32{0x02df59ab, 0x014bb731, 0x000b4590, 0x03a3076f, 0x03755b2d, 0x00a42c92, 0x03ecca94, 0x037034a4, 0x02fbc886, 0x00066aa2}}}, + {X: Field{[10]uint32{0x01ad6ae5, 0x018c96ad, 0x01342a4c, 0x005c70e3, 0x03ccc1e4, 0x03ff22ea, 0x0219a34d, 0x03d46874, 0x01562bd7, 0x000de705}}, Y: Field{[10]uint32{0x03185907, 0x00feb10b, 0x0348db98, 0x00d1fc81, 0x01e7bc67, 0x0036554d, 0x01ce2231, 0x0077d59b, 0x028fa637, 0x0011e87c}}}, + {X: Field{[10]uint32{0x03ce9809, 0x033dea07, 0x014f9914, 0x02426277, 0x0130a362, 0x01e0443a, 0x03584a7d, 0x011674ab, 0x01c2e675, 0x00090153}}, Y: Field{[10]uint32{0x017ae592, 0x016128b9, 0x02a7612b, 0x02069bc0, 0x013553dc, 0x008345a9, 0x00e06d48, 0x03429c71, 0x021d3e05, 0x00195cab}}}, + {X: Field{[10]uint32{0x002420a4, 0x02d323a8, 0x0298fa3b, 0x0322e140, 0x02913199, 0x00408ecc, 0x03cd8790, 0x02a5e6ad, 0x02a6f46c, 0x002604b9}}, Y: Field{[10]uint32{0x00f937f0, 0x004ae722, 0x0315152a, 0x00ed595d, 0x033afd96, 0x021be4dd, 0x03baf369, 0x0364cc06, 0x02eddfec, 0x0011a3db}}}, + {X: Field{[10]uint32{0x0313c700, 0x000e969f, 0x03c6b962, 0x03ee5720, 0x029f6c14, 0x00b2778a, 0x00c928d6, 0x02392b61, 0x02446a34, 0x00118161}}, Y: Field{[10]uint32{0x022d57ab, 0x00079dd8, 0x021ad904, 0x004415ec, 0x034c873f, 0x02c62103, 0x0359c203, 0x01c07f99, 0x02e3ca3d, 0x00277157}}}, + {X: Field{[10]uint32{0x00be006a, 0x002541ef, 0x003228e9, 0x03298e6b, 0x021cb877, 0x012bb43e, 0x00d862fe, 0x0017ca91, 0x03972d5b, 0x002a36eb}}, Y: Field{[10]uint32{0x036fa4bc, 0x0312a5c5, 0x0190251a, 0x00a6e0f2, 0x03253e67, 0x0050742f, 0x018d38c6, 0x024df13e, 0x0003f082, 0x000f6d53}}}, + {X: Field{[10]uint32{0x011149fe, 0x01e0024e, 0x01128741, 0x0064899c, 0x02008b30, 0x013e611a, 0x0324bcd4, 0x004ca44c, 0x01f4f4d9, 0x0026e2ce}}, Y: Field{[10]uint32{0x0052c1d3, 0x025aa647, 0x030976b3, 0x01fcb82a, 0x034e4cae, 0x002c346c, 0x03fc6939, 0x00b96a23, 0x03721c45, 0x00124293}}}, + {X: Field{[10]uint32{0x014615eb, 0x00d62b4c, 0x0059773e, 0x00909e99, 0x017406ce, 0x039407e0, 0x02404ea9, 0x011b6c65, 0x01d5a7ef, 0x000cd1a0}}, Y: Field{[10]uint32{0x03ad6c0d, 0x01951094, 0x02b6d6c1, 0x0304dff9, 0x02e328fd, 0x0081a778, 0x004775a5, 0x0335aa7c, 0x003a1d80, 0x000ac8d8}}}, + {X: Field{[10]uint32{0x01c32529, 0x00fc380a, 0x02a88202, 0x01cadeba, 0x02bd5f83, 0x02933390, 0x00639b40, 0x01baf4a5, 0x0310c63c, 0x003fae38}}, Y: Field{[10]uint32{0x0343b213, 0x02fe1b76, 0x02617fbc, 0x018ef7df, 0x0068a45c, 0x019a0898, 0x017934b8, 0x035e02a9, 0x02ad6a0c, 0x0032db90}}}, + {X: Field{[10]uint32{0x0305cb67, 0x003cb121, 0x013b3fcf, 0x02d8acf6, 0x01a8ca5c, 0x02e44295, 0x01232523, 0x013a4b72, 0x03c2c733, 0x003d285e}}, Y: Field{[10]uint32{0x026e9dfe, 0x011c6c36, 0x02304bb0, 0x038f573e, 0x02e7f4a9, 0x03d14982, 0x03d55a32, 0x011ca52c, 0x039501b2, 0x00204add}}}, + {X: Field{[10]uint32{0x00cf181b, 0x011e6e93, 0x0324c7e0, 0x0257c208, 0x02c330a9, 0x03f2abd3, 0x016d596b, 0x010d2552, 0x007b8551, 0x0023b0ab}}, Y: Field{[10]uint32{0x01250130, 0x03aeea4d, 0x00258ce4, 0x025c9ec7, 0x0070e927, 0x0173c2f1, 0x00b3bcf0, 0x03498def, 0x00b67811, 0x003a8562}}}, + {X: Field{[10]uint32{0x00d4f19a, 0x010f1b01, 0x04001534, 0x02ddf68e, 0x03e4aa9e, 0x039231bd, 0x01c4b6d9, 0x0336f032, 0x021bd9ae, 0x002c79b5}}, Y: Field{[10]uint32{0x028cbf4a, 0x03e62bec, 0x031a35ae, 0x02e83b32, 0x011bc20a, 0x0235bcce, 0x01fdb344, 0x0325da2c, 0x0355b2e2, 0x0010ebde}}}, + {X: Field{[10]uint32{0x0313b2be, 0x03c8124b, 0x022e4b69, 0x018c0b53, 0x031a9519, 0x036cd50c, 0x004a3974, 0x011f70e4, 0x02e8210d, 0x001360f4}}, Y: Field{[10]uint32{0x0137a6b3, 0x015cbd8f, 0x000367c8, 0x02b25500, 0x017a0e3b, 0x039610ae, 0x005f1d88, 0x03f25ef9, 0x00833874, 0x001fb65b}}}, + {X: Field{[10]uint32{0x03b20b84, 0x02dba3ca, 0x01c36b9e, 0x03bac2ca, 0x0325f5c5, 0x01549fd9, 0x035d5143, 0x03f0875b, 0x012efd51, 0x0005123a}}, Y: Field{[10]uint32{0x02e344ad, 0x02efae65, 0x03f4cea8, 0x0298e790, 0x0013336a, 0x021a25cf, 0x011c9a22, 0x020f94be, 0x038fc8be, 0x0009228c}}}, + {X: Field{[10]uint32{0x024e4ead, 0x01c24f24, 0x03e63dcf, 0x02c09617, 0x0239d928, 0x03828863, 0x01cc7d44, 0x0142b0b3, 0x03d69c22, 0x00388ec0}}, Y: Field{[10]uint32{0x01b9aea9, 0x03ee2b9c, 0x024542ef, 0x02e84f7b, 0x0380b91c, 0x02b6c135, 0x017ef44f, 0x012df066, 0x03d04a8a, 0x00231a71}}}, + {X: Field{[10]uint32{0x02b5d7cb, 0x01c8ad0c, 0x02f94e5a, 0x0093699a, 0x00786632, 0x02baff2e, 0x02a929b9, 0x00ff9a51, 0x035e21fb, 0x00133478}}, Y: Field{[10]uint32{0x0167e3bc, 0x012ac1dc, 0x02984cba, 0x035dcc32, 0x03eca892, 0x00a5e185, 0x02887803, 0x016c42e9, 0x02dc5e86, 0x001ac444}}}, + {X: Field{[10]uint32{0x020db647, 0x03ec8102, 0x01bf5f2e, 0x02c363c7, 0x00bf25c6, 0x0165bb38, 0x00b92123, 0x02dec09f, 0x02f8092c, 0x003cf3ae}}, Y: Field{[10]uint32{0x0168d8e0, 0x0160af2a, 0x02ab7e12, 0x01cbbef6, 0x02cf3c71, 0x02ee974f, 0x0123b887, 0x03004e46, 0x01eb8418, 0x00298577}}}, + {X: Field{[10]uint32{0x01655e7d, 0x02168b1b, 0x01736a3a, 0x0379ec75, 0x02dfe341, 0x00c605c1, 0x0337c813, 0x03e235a0, 0x0128500b, 0x0012e2b3}}, Y: Field{[10]uint32{0x01219bb8, 0x0325b83f, 0x018ac624, 0x021e113c, 0x027b7c5d, 0x014bcec1, 0x016f76e0, 0x0159d613, 0x03c3825a, 0x002fa4f5}}}, + {X: Field{[10]uint32{0x00eb9fe1, 0x01c6541f, 0x03c53d47, 0x020616ba, 0x003e567d, 0x0331a37a, 0x03d2de62, 0x0002218f, 0x0081d04e, 0x002371eb}}, Y: Field{[10]uint32{0x01fa9198, 0x02e53104, 0x000e8214, 0x0224bb84, 0x031eb14c, 0x0097200f, 0x03a7755e, 0x0064c711, 0x024abe7b, 0x0018b52d}}}, + {X: Field{[10]uint32{0x01b89a23, 0x01394c30, 0x02033710, 0x015e400f, 0x01a817c2, 0x03d3cb06, 0x002bbbed, 0x03523425, 0x003f3078, 0x002a98cd}}, Y: Field{[10]uint32{0x02a7b524, 0x0256399b, 0x009bbfe7, 0x01b4338e, 0x0013befc, 0x037a51d6, 0x0020f4d9, 0x01cc3da7, 0x003423a6, 0x0009dfbe}}}, + {X: Field{[10]uint32{0x01121d30, 0x0135e841, 0x034955d0, 0x0186f085, 0x02dadeba, 0x028df7ce, 0x01096c01, 0x0079023a, 0x00619f30, 0x000df794}}, Y: Field{[10]uint32{0x0138898a, 0x00cbef39, 0x00c31f57, 0x01c35b6d, 0x00e3f6aa, 0x0001565f, 0x0136516c, 0x002e59a8, 0x009c33e4, 0x0001f9c1}}}, + {X: Field{[10]uint32{0x01eb83b4, 0x03cb0311, 0x0045e011, 0x0208be45, 0x003ebc66, 0x00d1d207, 0x028cd44f, 0x01673a8f, 0x0355506d, 0x001b4633}}, Y: Field{[10]uint32{0x00a30cdb, 0x03cabdee, 0x03854c8f, 0x029f3a01, 0x00220f7b, 0x03536e28, 0x039818e5, 0x01cfd1fe, 0x01c1ca8b, 0x003a4c3a}}}, + {X: Field{[10]uint32{0x02caa7d3, 0x025ece45, 0x01c0a5b7, 0x03f7ac74, 0x00f70243, 0x00054b27, 0x00203c49, 0x036b1775, 0x02606de7, 0x001df615}}, Y: Field{[10]uint32{0x019c659c, 0x01f6123d, 0x0122e8c3, 0x03b3e481, 0x031a2722, 0x02cf038e, 0x01b0fc94, 0x03554327, 0x03e39b37, 0x000fd5f3}}}, + {X: Field{[10]uint32{0x0381bf16, 0x0398d77c, 0x01229670, 0x002f5a76, 0x00ea5645, 0x03e753ee, 0x01dc8b56, 0x016ec715, 0x01a6c44b, 0x00170b9a}}, Y: Field{[10]uint32{0x01a3588d, 0x03c0499d, 0x03049f1a, 0x03c930d2, 0x009ec21a, 0x03f42d1b, 0x0021a8c2, 0x032a6e8a, 0x009d0a69, 0x003c2081}}}, + {X: Field{[10]uint32{0x01a393ee, 0x0339002d, 0x02af1918, 0x023626ca, 0x02aaacb9, 0x00afac1a, 0x01944ed9, 0x02496c94, 0x01f5066d, 0x000ca700}}, Y: Field{[10]uint32{0x02a57abf, 0x02bfb7fe, 0x032a9c3c, 0x0114f531, 0x02e21c2c, 0x0292494b, 0x0150c80a, 0x003ffdab, 0x0038427a, 0x001f8a6c}}}, + {X: Field{[10]uint32{0x029525da, 0x02d26f58, 0x0099df62, 0x03f21519, 0x02b670f4, 0x01c75ec3, 0x02bb4017, 0x037e90df, 0x031f18b2, 0x00130b98}}, Y: Field{[10]uint32{0x029a6f9c, 0x022728ff, 0x013701f7, 0x00b68fe1, 0x00050c6c, 0x02df0813, 0x01314326, 0x00fe9d30, 0x03fb8742, 0x0022a57a}}}, + {X: Field{[10]uint32{0x03d03fdc, 0x03efc6d8, 0x03fd9392, 0x0393184c, 0x01d3808c, 0x0384295d, 0x037cf02c, 0x0111971f, 0x03930d25, 0x003f8486}}, Y: Field{[10]uint32{0x009e0ba6, 0x0032f3a9, 0x036352a8, 0x022bcd82, 0x030e5943, 0x0110e83f, 0x03b997f9, 0x010c4653, 0x03077bda, 0x000cc4a6}}}, + {X: Field{[10]uint32{0x03784c23, 0x00ab984b, 0x0316da53, 0x03510600, 0x032cf8c5, 0x0079d2e2, 0x0220521f, 0x03cfddd3, 0x027b1cdb, 0x000c8eb0}}, Y: Field{[10]uint32{0x03c3dc18, 0x025acb4f, 0x01197bb2, 0x005bcf4c, 0x01c8489e, 0x00d2ea69, 0x00b15fe8, 0x012b1622, 0x0108f6a6, 0x00084558}}}, + {X: Field{[10]uint32{0x03afd533, 0x006a3481, 0x00d3741b, 0x0287964d, 0x01eeccbc, 0x03830840, 0x01f0ed5c, 0x02c780e9, 0x0362fdfc, 0x000451e3}}, Y: Field{[10]uint32{0x005f9153, 0x025a667b, 0x0366c70d, 0x02c82614, 0x02aba8d0, 0x0344549e, 0x00cdb176, 0x03b32191, 0x02732fd3, 0x002a7de5}}}, + {X: Field{[10]uint32{0x00b9d078, 0x010fbf08, 0x016e5e73, 0x02d5d9e2, 0x02bc8d82, 0x03b569a9, 0x008acf3a, 0x0306b7ae, 0x01b6c9d3, 0x0027c242}}, Y: Field{[10]uint32{0x007db181, 0x03ce1139, 0x017a33b0, 0x035ee669, 0x0061a579, 0x023d948d, 0x0263e30b, 0x01759371, 0x00a6c5c9, 0x00294587}}}, + {X: Field{[10]uint32{0x024a6b9f, 0x0255f4e9, 0x01711c55, 0x02c6d4bc, 0x032807ac, 0x006be02e, 0x01d8cd1a, 0x02b508a6, 0x007532a9, 0x0012582a}}, Y: Field{[10]uint32{0x02976625, 0x02e42d37, 0x03dd8cd6, 0x000bbbdd, 0x004bfc62, 0x00fe0bc9, 0x008f54a9, 0x0198a3ad, 0x01f3f1b4, 0x0015e394}}}, + {X: Field{[10]uint32{0x01310354, 0x0160bc17, 0x0066854b, 0x00d92d7b, 0x01d142d5, 0x03f27dcf, 0x010951cb, 0x00997952, 0x01c20bdb, 0x0019d70a}}, Y: Field{[10]uint32{0x008bd6d1, 0x00a411f8, 0x03a49832, 0x017e768c, 0x028cb8ad, 0x021af7e9, 0x02d4f9a1, 0x037a1080, 0x02693d82, 0x0008b47d}}}, + {X: Field{[10]uint32{0x007ce605, 0x02df26c4, 0x01d36f65, 0x037eb612, 0x01a9053a, 0x005aaccb, 0x01221779, 0x034389aa, 0x00bd6c75, 0x0031025b}}, Y: Field{[10]uint32{0x01c2bb46, 0x016f94e5, 0x023c294f, 0x01440092, 0x01b2b97e, 0x018ceb81, 0x0361efb9, 0x0325e4bf, 0x03472ae3, 0x0017c8da}}}, + {X: Field{[10]uint32{0x03905c0b, 0x003b66ce, 0x03789dd8, 0x018007e8, 0x01b1ddd4, 0x031d5055, 0x01205ec2, 0x015007c0, 0x0341ddd0, 0x0027a834}}, Y: Field{[10]uint32{0x01a28e69, 0x00570803, 0x03b717e6, 0x016654fd, 0x00ba7ce0, 0x00e625d9, 0x03692cd5, 0x0342ddbc, 0x010197e7, 0x000efd20}}}, + {X: Field{[10]uint32{0x02fb92e4, 0x035d690c, 0x028c7b4d, 0x03cb78dd, 0x01637367, 0x026056c3, 0x026edd2d, 0x03e8cdca, 0x02d784bf, 0x002f7aef}}, Y: Field{[10]uint32{0x03d0b9c0, 0x01312bb3, 0x00067673, 0x007f28ac, 0x01297a43, 0x02882507, 0x016af105, 0x026d8b70, 0x037eb62a, 0x0017fcd0}}}, + {X: Field{[10]uint32{0x02910932, 0x031f5b27, 0x020c7bcc, 0x01d1ded5, 0x000cbfe6, 0x03d55084, 0x02ea82c8, 0x00d3cb5a, 0x0244b46e, 0x002921be}}, Y: Field{[10]uint32{0x0097317a, 0x007208be, 0x03ca8323, 0x02a9fd1f, 0x01b8ad5b, 0x01532955, 0x023caa0f, 0x038a1022, 0x036d8a15, 0x0006adf8}}}, + {X: Field{[10]uint32{0x01cbba08, 0x0069f44a, 0x03769fbd, 0x02c4631f, 0x0366e7ab, 0x0082bbea, 0x0204376a, 0x02a49aa8, 0x00a557a1, 0x001118e8}}, Y: Field{[10]uint32{0x0034af0d, 0x036ada74, 0x02ce09a9, 0x0148973a, 0x037dc081, 0x002e2b44, 0x00f01de2, 0x0180a9c1, 0x02a5ab7b, 0x0012a08e}}}, + {X: Field{[10]uint32{0x01825ac4, 0x029cf7d3, 0x00b4c593, 0x0318bbad, 0x008cbdc5, 0x03647476, 0x03135840, 0x0237eead, 0x024fc45e, 0x0035b822}}, Y: Field{[10]uint32{0x02b4c55f, 0x020032d7, 0x02506c59, 0x036588bf, 0x0108be98, 0x003f8b6f, 0x031ae8fc, 0x0342e941, 0x03b477c0, 0x000b3616}}}, + {X: Field{[10]uint32{0x016a10f1, 0x00fea1fe, 0x03656a43, 0x034293e2, 0x00546d31, 0x026eff4d, 0x0076dca2, 0x032b5398, 0x02992a69, 0x002d89b8}}, Y: Field{[10]uint32{0x03cb5bc6, 0x015bd0d0, 0x03d343c6, 0x00ee32ef, 0x0162ac5e, 0x01789d95, 0x01686325, 0x0249a3c5, 0x02ceba91, 0x001b7d2c}}}, + {X: Field{[10]uint32{0x007139a5, 0x006959a5, 0x03b057e3, 0x03ad8678, 0x0225a4df, 0x03f93497, 0x01d61965, 0x0141c2cb, 0x02eb7464, 0x000d8679}}, Y: Field{[10]uint32{0x0282093f, 0x0035c944, 0x014311aa, 0x00ed1430, 0x0379940c, 0x02519f1e, 0x036c3bf2, 0x01848674, 0x0189ba15, 0x002592e2}}}, + {X: Field{[10]uint32{0x00bda2e9, 0x03dfd232, 0x02a847cc, 0x01838c9a, 0x0141e5c0, 0x014cc258, 0x00a3a65d, 0x0210ff10, 0x035e6718, 0x002cd4a6}}, Y: Field{[10]uint32{0x01c1b935, 0x03f15496, 0x030579d4, 0x01eca99e, 0x0131111e, 0x0216fb3d, 0x00595ac2, 0x02fd17a7, 0x00d37ce1, 0x001279b8}}}, + {X: Field{[10]uint32{0x03a9e05b, 0x02bf7c4b, 0x01598d42, 0x01e2500d, 0x014a1997, 0x03491fbc, 0x0385527d, 0x00517ff3, 0x00675bd7, 0x003947c0}}, Y: Field{[10]uint32{0x01b32666, 0x00a72ff0, 0x02c8cec7, 0x017cc3ad, 0x017d2e17, 0x026c11f9, 0x023d5fc6, 0x01cbad14, 0x033e8b4d, 0x003566ab}}}, + {X: Field{[10]uint32{0x01e79b28, 0x017e0c73, 0x00720170, 0x03935148, 0x0391c930, 0x0029ed52, 0x025eb6aa, 0x0311a348, 0x0066f64b, 0x0022a1fc}}, Y: Field{[10]uint32{0x02800227, 0x03afa959, 0x0113bb5e, 0x02b18954, 0x03249c34, 0x0343909d, 0x019062f5, 0x01f256c8, 0x0195e005, 0x002a4a97}}}, + {X: Field{[10]uint32{0x01310b06, 0x03661eff, 0x03632cd7, 0x03eee2bb, 0x013a926a, 0x03e236ab, 0x01c771eb, 0x023b969a, 0x0015aa87, 0x00362a04}}, Y: Field{[10]uint32{0x020acbdd, 0x017d4ff8, 0x02ad3d5e, 0x03680667, 0x03ec9f31, 0x03ce50b1, 0x03e3a262, 0x03b53a58, 0x03e8f276, 0x002bddfd}}}, + {X: Field{[10]uint32{0x020cc5c1, 0x01d0f533, 0x034d2c3b, 0x02f5466b, 0x02051c9a, 0x01974a35, 0x025b8a38, 0x01364f6f, 0x02194f3f, 0x002230fe}}, Y: Field{[10]uint32{0x020d8f8d, 0x0192381d, 0x039d9a9d, 0x036a660a, 0x0226b5de, 0x01dd16fb, 0x03671a7e, 0x03e089ec, 0x037a0f9f, 0x0004132b}}}, + {X: Field{[10]uint32{0x01ce648e, 0x00b0f650, 0x02484553, 0x0045b169, 0x02220701, 0x031ca6a2, 0x01e9c763, 0x02c3abc1, 0x03253434, 0x003e1ce1}}, Y: Field{[10]uint32{0x006f7bd7, 0x0327885e, 0x0320146f, 0x0055e059, 0x024c286e, 0x0034f86f, 0x01f66270, 0x01e44eda, 0x02d1d4ee, 0x002a2d7b}}}, + {X: Field{[10]uint32{0x009acc33, 0x021083e4, 0x02f606b1, 0x03e3723f, 0x007b35c8, 0x01a25817, 0x00ca8265, 0x00087e53, 0x01385afb, 0x00017f29}}, Y: Field{[10]uint32{0x01b2b3a8, 0x0246bd75, 0x036392b7, 0x01e35752, 0x03c5b4d0, 0x008facaf, 0x01f9a527, 0x022ff7ac, 0x0251f5c2, 0x000075fe}}}, + {X: Field{[10]uint32{0x035007db, 0x01193eb3, 0x01a51891, 0x013f8558, 0x03f1fddf, 0x03b52f43, 0x02cef9db, 0x02b366ec, 0x0148d4b2, 0x0011d211}}, Y: Field{[10]uint32{0x028f44a8, 0x02a8f20c, 0x02bce3dd, 0x00efb620, 0x01b93e22, 0x03ed113f, 0x03a25397, 0x033f811b, 0x0154f011, 0x003a9878}}}, + {X: Field{[10]uint32{0x02c5b8f1, 0x01ab2179, 0x0234ab46, 0x01b49500, 0x01dd8ef5, 0x0106a008, 0x029a6feb, 0x0350ffb1, 0x03ff0b14, 0x000cc7c5}}, Y: Field{[10]uint32{0x02ec144b, 0x015a6c27, 0x0299b68d, 0x01840b11, 0x0337d8c0, 0x02864c47, 0x0364a0f8, 0x011cc6da, 0x00a18d77, 0x002e882f}}}, + {X: Field{[10]uint32{0x03dc68ce, 0x02c51b76, 0x027f15e9, 0x0073e710, 0x0205b897, 0x0014c395, 0x0388ce98, 0x034b192a, 0x022d200b, 0x0001aae9}}, Y: Field{[10]uint32{0x01f832c8, 0x02ac09ba, 0x00c5b000, 0x035de376, 0x01fcf65f, 0x03c1c7cb, 0x0126ef0c, 0x022466b3, 0x02d7d7d9, 0x0039324d}}}, + {X: Field{[10]uint32{0x03ca19c5, 0x032f1a48, 0x014fcf52, 0x02371cc9, 0x02c0cfee, 0x027b1bb3, 0x01022b4d, 0x02867188, 0x0035e72f, 0x0031dadb}}, Y: Field{[10]uint32{0x0213efc9, 0x02ea0c7e, 0x03fb1ee7, 0x0215ec86, 0x01b49dba, 0x01fe80a2, 0x034d0a1d, 0x0216666d, 0x027a48ee, 0x0016c3fe}}}, + {X: Field{[10]uint32{0x021bb77a, 0x024e1533, 0x014a404a, 0x03b50549, 0x02aaa438, 0x00a70529, 0x01590fa4, 0x00f7e6c0, 0x023d43f3, 0x003015ba}}, Y: Field{[10]uint32{0x033dca7b, 0x01ee31fa, 0x0231cc33, 0x000a2e80, 0x0258355a, 0x01da95c7, 0x0079e7f5, 0x02a7c4b1, 0x00e32337, 0x00356c65}}}, + {X: Field{[10]uint32{0x01ac938a, 0x0222cf6f, 0x003a147e, 0x03124f2b, 0x037df652, 0x01ae3ced, 0x03bb897e, 0x003bc44d, 0x00cc8ddf, 0x000f5a23}}, Y: Field{[10]uint32{0x015879fc, 0x02bc8b53, 0x03b4a691, 0x0269ebce, 0x0338b6bc, 0x0045563d, 0x00daead1, 0x0387ca58, 0x03884d7a, 0x002f2a51}}}, + {X: Field{[10]uint32{0x00d2a179, 0x012ccf42, 0x009cf392, 0x027d7cb9, 0x00c59d7a, 0x03dbf60d, 0x0145f0cd, 0x004602a4, 0x02f669ce, 0x0013ebfe}}, Y: Field{[10]uint32{0x020159d2, 0x03d55841, 0x00485b71, 0x01c9e6f3, 0x03dcbad8, 0x032442ae, 0x000c16d8, 0x00bb0956, 0x00ac2dca, 0x00278057}}}, + {X: Field{[10]uint32{0x024aecad, 0x00c15e68, 0x02f614ac, 0x031d9a67, 0x000e8ba0, 0x037b31f1, 0x01a44eb3, 0x03ade1ad, 0x00e37cd7, 0x00011d5e}}, Y: Field{[10]uint32{0x03171651, 0x03be3259, 0x0056945e, 0x019a7af2, 0x0007fd00, 0x02d8a3b6, 0x00eab83f, 0x03802f1a, 0x0017a6be, 0x002522b2}}}, + {X: Field{[10]uint32{0x00618836, 0x0386a577, 0x01dfe103, 0x029dded6, 0x038c72fd, 0x01d221f6, 0x02d1a35f, 0x0191a892, 0x02753eaa, 0x0026ab78}}, Y: Field{[10]uint32{0x002bca96, 0x000dcf74, 0x0025687e, 0x03b771fd, 0x03ceef2f, 0x0325120f, 0x02e7a050, 0x0097cc79, 0x03848f46, 0x002d9470}}}, + {X: Field{[10]uint32{0x03aed711, 0x004cebd8, 0x02f9a276, 0x027d8a72, 0x03321c9b, 0x011ecaf3, 0x02818524, 0x03b9d556, 0x03e0b1c6, 0x002c6c30}}, Y: Field{[10]uint32{0x000ac827, 0x02eac90c, 0x01571759, 0x019d632f, 0x03c2c741, 0x03fc5c44, 0x001d0dca, 0x01bfcf7f, 0x00fd624e, 0x00124eb3}}}, + {X: Field{[10]uint32{0x032a8ff6, 0x0373cfaf, 0x0201c156, 0x01881eeb, 0x032a0ce4, 0x03ce46a6, 0x02c5762f, 0x028163ab, 0x018fb192, 0x003155dd}}, Y: Field{[10]uint32{0x011bd3b3, 0x011e5a5b, 0x01766399, 0x02129dc6, 0x03989212, 0x006ff6fc, 0x010f671b, 0x0386567c, 0x0353d209, 0x000753a6}}}, + {X: Field{[10]uint32{0x037b5e0e, 0x02b648ca, 0x00d07cc9, 0x0209237d, 0x020edcc0, 0x037d686d, 0x01b5ca60, 0x03b53ed2, 0x01ed5120, 0x001cd48b}}, Y: Field{[10]uint32{0x02e08d74, 0x02233e37, 0x01a96e43, 0x013b25c9, 0x037f87db, 0x016f3f71, 0x01299ced, 0x009c3b47, 0x0194cdf0, 0x0011d5a7}}}, + {X: Field{[10]uint32{0x00323506, 0x02e70bfa, 0x033ad72b, 0x0033c3b1, 0x00fd6fbc, 0x030afb94, 0x03ae46df, 0x02258ca8, 0x000d6632, 0x000595c7}}, Y: Field{[10]uint32{0x03ec68d2, 0x00911212, 0x03143d22, 0x02135d67, 0x00a936d6, 0x01f39854, 0x0157911e, 0x0071833b, 0x01869e00, 0x001977a7}}}, + {X: Field{[10]uint32{0x00e5f090, 0x00be5626, 0x03343dbe, 0x00ba0b72, 0x01b1810d, 0x0327be1b, 0x020cc8d7, 0x00c29721, 0x01642eb6, 0x003d7f95}}, Y: Field{[10]uint32{0x03adfa87, 0x03244fa7, 0x03504e20, 0x02f75fb5, 0x02eec2da, 0x030b025e, 0x0340dcdf, 0x036b2328, 0x021fbea9, 0x00173b9e}}}, + {X: Field{[10]uint32{0x016e3592, 0x0138f28e, 0x00591881, 0x005d635e, 0x037aece0, 0x021f3b6b, 0x01a67a0b, 0x02410d0f, 0x033270d0, 0x003bc276}}, Y: Field{[10]uint32{0x03b675e2, 0x0288e6b1, 0x036ea80c, 0x01c4ab81, 0x037df142, 0x03bf7d38, 0x01c6161c, 0x01ba7e59, 0x0005ba24, 0x00164d3e}}}, + {X: Field{[10]uint32{0x033a54e8, 0x03f948cd, 0x030c13ed, 0x008be5d2, 0x025e1746, 0x03c807b4, 0x012b102b, 0x03c26661, 0x03d727d2, 0x00221b36}}, Y: Field{[10]uint32{0x00a73b2b, 0x029ec277, 0x021426ee, 0x021ce351, 0x015166f6, 0x019393e2, 0x03518255, 0x01b96b94, 0x028a7fca, 0x0036b2cc}}}, + {X: Field{[10]uint32{0x02237cff, 0x03be0ab3, 0x011f96e4, 0x00226ef6, 0x01620713, 0x02367cfa, 0x029ff848, 0x02fcba14, 0x03cd04f7, 0x002df61a}}, Y: Field{[10]uint32{0x03702f0e, 0x03f623ce, 0x0002ee32, 0x0293b434, 0x0303acf2, 0x01d5d210, 0x0146dc41, 0x0151faa1, 0x03f1375a, 0x0031ac2b}}}, + {X: Field{[10]uint32{0x03388c67, 0x03f1eeba, 0x02c4d22b, 0x02659ef1, 0x00c24f5e, 0x0257653b, 0x03910593, 0x02ae14c1, 0x01b28132, 0x0035f45c}}, Y: Field{[10]uint32{0x001a8f8f, 0x01950f77, 0x00744bfe, 0x020a5c22, 0x037be396, 0x02ece6fd, 0x013c1351, 0x038ad957, 0x00e02421, 0x00260ddc}}}, + {X: Field{[10]uint32{0x0394b1be, 0x024202a5, 0x03502a42, 0x025b0524, 0x00f01a18, 0x00cf6b64, 0x01f1cfa8, 0x00c39c8a, 0x02fd881e, 0x003ff9c4}}, Y: Field{[10]uint32{0x00505da8, 0x03063395, 0x01586cda, 0x01e94c59, 0x02f18b03, 0x03cbe8af, 0x0311ae58, 0x00212842, 0x0203075d, 0x003d0a67}}}, + {X: Field{[10]uint32{0x03d13f7c, 0x01919555, 0x03d669f6, 0x03781bc0, 0x03dff3f0, 0x03decd71, 0x03cd10b3, 0x01a54735, 0x02b30322, 0x00158f24}}, Y: Field{[10]uint32{0x03ec10c1, 0x0272cdcc, 0x01f43076, 0x0252153d, 0x009bb210, 0x0105be52, 0x030ccfb2, 0x03bd0602, 0x02f4085b, 0x0037287b}}}, + {X: Field{[10]uint32{0x00f32437, 0x0353591a, 0x013dd9a0, 0x00a19a9f, 0x01dd52c2, 0x03e91f05, 0x00056d7e, 0x03af3985, 0x02f33a2c, 0x002e39db}}, Y: Field{[10]uint32{0x018651c2, 0x01068a24, 0x004a22aa, 0x03084277, 0x003076cc, 0x00986687, 0x02539ba4, 0x039e668e, 0x039d652a, 0x00111539}}}, + {X: Field{[10]uint32{0x02f1c971, 0x01d5182a, 0x002d2c56, 0x03cf8219, 0x0107b4a4, 0x022a6610, 0x02e429fb, 0x000e8b7c, 0x0304f607, 0x000db6c8}}, Y: Field{[10]uint32{0x0284b5cc, 0x010bf269, 0x03ef00f8, 0x02d02323, 0x03ecf7f9, 0x009ac6ae, 0x03859eee, 0x002a8f66, 0x028f5cc3, 0x002814db}}}, + {X: Field{[10]uint32{0x00d9a5ab, 0x01562862, 0x02314f9d, 0x0286df1a, 0x00d537c1, 0x03a6b8a9, 0x0055e529, 0x018df758, 0x011d1521, 0x00317539}}, Y: Field{[10]uint32{0x03eb3f6d, 0x036cce9b, 0x02d0de04, 0x00f12d22, 0x00aaf709, 0x0195c265, 0x0365b08c, 0x01e0b3ef, 0x02ed6a13, 0x0032107b}}}, + {X: Field{[10]uint32{0x01c4bffd, 0x0263e7dc, 0x032207cd, 0x00cd802b, 0x02b05615, 0x018d785e, 0x0379ed3f, 0x0167dbfe, 0x01c29858, 0x0014300f}}, Y: Field{[10]uint32{0x03137720, 0x01929df5, 0x02b0a68b, 0x00a22dfd, 0x025c4255, 0x01471d22, 0x01a2bd74, 0x008a6bd6, 0x0397a7ed, 0x0031a321}}}, + {X: Field{[10]uint32{0x008333ef, 0x014d1b7c, 0x01ff3364, 0x0245c74c, 0x03985606, 0x03d6ec3b, 0x010ae5dc, 0x01be68b8, 0x004b3e7e, 0x000a01b6}}, Y: Field{[10]uint32{0x007b429d, 0x026d40f2, 0x0385e54a, 0x0099090d, 0x02bf8cac, 0x00e9ad63, 0x00b5ddbf, 0x01332d33, 0x004338e3, 0x001cbc8d}}}, + {X: Field{[10]uint32{0x008790a4, 0x02254bce, 0x0353f4c5, 0x006f888a, 0x0282bb9c, 0x026103fb, 0x03e33c62, 0x02374710, 0x01dd1ef5, 0x001035c3}}, Y: Field{[10]uint32{0x030770d5, 0x00a875fd, 0x0130d96b, 0x016ce51a, 0x02e65468, 0x03d35545, 0x00d170ea, 0x0264c8ce, 0x0157b6dd, 0x0026c6a7}}}, + {X: Field{[10]uint32{0x0387c835, 0x01598222, 0x03905d01, 0x00105e60, 0x02ac7338, 0x038876a0, 0x037b193e, 0x00484ef5, 0x003204e7, 0x0022143b}}, Y: Field{[10]uint32{0x01c160e2, 0x00dfddf7, 0x00d3a7d6, 0x02cac32d, 0x02961480, 0x019701c5, 0x01f58eaa, 0x002e464b, 0x03a0a916, 0x002abffd}}}, + {X: Field{[10]uint32{0x00ad6e8b, 0x0033dc54, 0x00bd2c24, 0x02c1a8c2, 0x030de291, 0x02f92175, 0x039d4a62, 0x00a7d1df, 0x0109bd7c, 0x00152545}}, Y: Field{[10]uint32{0x03ef2722, 0x01b1ccb1, 0x02f27f13, 0x027ddf00, 0x01b1d8f7, 0x013307ea, 0x0245c764, 0x00ee7e8e, 0x007cf2a2, 0x000bf6cd}}}, + {X: Field{[10]uint32{0x037e5d44, 0x023da7eb, 0x0221facf, 0x022f990d, 0x031c3d3e, 0x0028f9f3, 0x01af1ab7, 0x03ad3ef9, 0x0355cdf8, 0x0027d7b0}}, Y: Field{[10]uint32{0x01d3c06e, 0x01bcb286, 0x00a58488, 0x017a4afe, 0x0312b8be, 0x0368712e, 0x03da94ba, 0x00d5401b, 0x015fb38b, 0x002c80f7}}}, + {X: Field{[10]uint32{0x02c0b3da, 0x00dc688b, 0x0037bbdf, 0x0388c18a, 0x028b72f0, 0x022cc9bf, 0x035e606c, 0x02794a32, 0x029c1bba, 0x00204b92}}, Y: Field{[10]uint32{0x00e222a1, 0x0347163e, 0x00f24d10, 0x01227be4, 0x015d98d2, 0x03b4004d, 0x02bd36a1, 0x02b8e718, 0x01b714a9, 0x000ae9ed}}}, + {X: Field{[10]uint32{0x023d924a, 0x0072a18a, 0x02c36c5c, 0x03d8a89b, 0x01af52c6, 0x03575ff4, 0x00ff16ec, 0x0185ad50, 0x01dbcf85, 0x003980d7}}, Y: Field{[10]uint32{0x001eec86, 0x03ed77fc, 0x0154ad6c, 0x0011a716, 0x01173d31, 0x007ca7c6, 0x0118718a, 0x03f2b1be, 0x009ef687, 0x002a514e}}}, + {X: Field{[10]uint32{0x02033446, 0x0079d49a, 0x00bc6032, 0x00a69ad4, 0x032643f1, 0x01ac8ce6, 0x01696938, 0x0351c6dc, 0x01e8d771, 0x0035e229}}, Y: Field{[10]uint32{0x017d3990, 0x026259fa, 0x030e0b25, 0x00bde7f8, 0x01c0c9a4, 0x01f646d9, 0x017fe32a, 0x01e0fbe9, 0x02225095, 0x000d2e15}}}, + {X: Field{[10]uint32{0x03c6f41c, 0x0175291d, 0x01802561, 0x00bdc1af, 0x020c8ef4, 0x03e8cad5, 0x01b5f116, 0x013e7c07, 0x03dd2937, 0x00198dcc}}, Y: Field{[10]uint32{0x0078676d, 0x03b09b74, 0x013c1394, 0x0199b895, 0x0185b59f, 0x005002de, 0x014e916a, 0x03f16458, 0x01453ae0, 0x0000d617}}}, + {X: Field{[10]uint32{0x0323ad9c, 0x02c08f6c, 0x006f0a5a, 0x00ccd585, 0x016affda, 0x0278b8f5, 0x03ad4d11, 0x00504cf6, 0x032805ae, 0x0017b1b9}}, Y: Field{[10]uint32{0x00884579, 0x008f5a70, 0x029f645c, 0x03919a37, 0x03d35a56, 0x00683f28, 0x00d609db, 0x00c078a7, 0x01bfcfc6, 0x000f7490}}}, + {X: Field{[10]uint32{0x00f8f3c5, 0x019d28cb, 0x02ceee4a, 0x03975105, 0x0087532b, 0x01165c5f, 0x03366471, 0x019a89f0, 0x00421fbb, 0x003c63f1}}, Y: Field{[10]uint32{0x0359d560, 0x008a7344, 0x00de9b4f, 0x0397dd60, 0x02026847, 0x01a1b03e, 0x03b4e836, 0x00f7c403, 0x00813bb3, 0x0034e282}}}, + {X: Field{[10]uint32{0x01f5345a, 0x0089108e, 0x01719206, 0x03fbba87, 0x017dec0d, 0x004d0919, 0x038d3362, 0x03f87c52, 0x009ed9bc, 0x002063d5}}, Y: Field{[10]uint32{0x006602ee, 0x00b237e1, 0x013688cc, 0x0170ae7d, 0x0048b24c, 0x01fd2cfe, 0x001a8e9d, 0x03d12117, 0x011fcca2, 0x000df398}}}, + {X: Field{[10]uint32{0x02dce942, 0x016c02c7, 0x02a6417a, 0x03ad9086, 0x024f4fa8, 0x00cba1e5, 0x034ee3a5, 0x00ff20a9, 0x0391f98e, 0x001d78b1}}, Y: Field{[10]uint32{0x03e5f6b4, 0x0153354d, 0x00b26f2d, 0x02f888aa, 0x007c4d37, 0x00582157, 0x02a17c71, 0x004d89a2, 0x033ba495, 0x00147c8d}}}, + {X: Field{[10]uint32{0x023954d3, 0x01a0db87, 0x011199ca, 0x01667d2e, 0x009b44de, 0x0264ddcc, 0x03f4ec1f, 0x01b4c76b, 0x01b64c0c, 0x001c47e3}}, Y: Field{[10]uint32{0x00caa4b0, 0x038f9f5c, 0x03eb5b75, 0x02e85c2e, 0x016e4dfb, 0x02cd4673, 0x0170fcf7, 0x0320b7cc, 0x01e3432a, 0x00121655}}}, + {X: Field{[10]uint32{0x033ba6a5, 0x01c6f237, 0x0003a160, 0x003f8878, 0x005216f5, 0x0232a70b, 0x022104ee, 0x0168792f, 0x00266f75, 0x0018d40b}}, Y: Field{[10]uint32{0x01bea942, 0x00a2a852, 0x028dd90f, 0x022bc7ce, 0x033954b8, 0x03f9de5d, 0x01075bda, 0x00fd2bd5, 0x01eac8fc, 0x0029720a}}}, + {X: Field{[10]uint32{0x02850872, 0x00425530, 0x0138c92d, 0x0358e49e, 0x0213f5c3, 0x00bb95f9, 0x01bb82fd, 0x0381c06d, 0x0059ccfe, 0x000a99dd}}, Y: Field{[10]uint32{0x037cbe71, 0x035717bb, 0x02053714, 0x00a3ace7, 0x00401bbf, 0x02c0f831, 0x031cbf5d, 0x02c2ca6e, 0x03985c5d, 0x003fdba5}}}, + {X: Field{[10]uint32{0x02b52cbe, 0x006c020c, 0x00d99f05, 0x03417c8c, 0x015b359b, 0x035febe5, 0x01b4a223, 0x01a69c27, 0x038778fb, 0x001a3e17}}, Y: Field{[10]uint32{0x03c92210, 0x0357cf3f, 0x0389e405, 0x0302cef7, 0x01ef9c65, 0x022d5ae1, 0x037b771f, 0x00c62713, 0x0149f4fc, 0x000370ba}}}, + {X: Field{[10]uint32{0x02b74ade, 0x02413cf4, 0x0390e1c2, 0x0321bd2e, 0x009e9883, 0x039642c9, 0x01fd8b9d, 0x0080d942, 0x01b73b54, 0x001fba75}}, Y: Field{[10]uint32{0x03343e62, 0x030c3b81, 0x03828002, 0x01aa7759, 0x03492063, 0x02497775, 0x01c6977b, 0x03c817e4, 0x0013241c, 0x00260489}}}, + {X: Field{[10]uint32{0x00aa33c8, 0x01d54f89, 0x03391381, 0x0011e7ab, 0x00102b5d, 0x03503948, 0x03680230, 0x0249c76c, 0x0090cdb1, 0x002111ec}}, Y: Field{[10]uint32{0x03c0bdb0, 0x02a3087d, 0x02a78c14, 0x0295e225, 0x03121d02, 0x00096948, 0x02eacd39, 0x01d20700, 0x03e655a2, 0x00096d0f}}}, + {X: Field{[10]uint32{0x0016a645, 0x02a2dbca, 0x03268c89, 0x00b9de8b, 0x03e45e62, 0x00317bce, 0x0151f569, 0x01439ade, 0x03b93f15, 0x000c581c}}, Y: Field{[10]uint32{0x007624be, 0x00b6cc65, 0x02caf6a5, 0x02286191, 0x03a1a6f3, 0x00c7571d, 0x0254a4db, 0x0033a30f, 0x01ac2fc7, 0x00155f29}}}, + {X: Field{[10]uint32{0x0036d6ac, 0x007addd2, 0x004ae5fc, 0x03c7264a, 0x00cdaa8e, 0x030046c6, 0x00fe9495, 0x0086b0d6, 0x012da2ef, 0x003eb88c}}, Y: Field{[10]uint32{0x030b76c7, 0x03ba358f, 0x00b8b54e, 0x0366ca6d, 0x00aa948a, 0x03f32fc2, 0x00ee7cb3, 0x03a196c3, 0x02612d99, 0x001bcefd}}}, + {X: Field{[10]uint32{0x00f839f0, 0x0339e0d5, 0x023e12f8, 0x031addbc, 0x007d4c72, 0x00c58abb, 0x01e1691d, 0x037f7c2c, 0x03ef5588, 0x000a028a}}, Y: Field{[10]uint32{0x03683f72, 0x02d21ce4, 0x01c73ca7, 0x018f3036, 0x01b2b4ba, 0x03910161, 0x03be1bc7, 0x025dd2a1, 0x011bc31a, 0x003c037b}}}, + {X: Field{[10]uint32{0x037ccdcd, 0x03dab02f, 0x01ddb86b, 0x02ca2a99, 0x034d0609, 0x031d5113, 0x037e5d28, 0x024b264a, 0x037a9b7b, 0x000fd0f9}}, Y: Field{[10]uint32{0x0072a2d6, 0x01c2a113, 0x015366cf, 0x0155401d, 0x00ac2678, 0x00ae3617, 0x02bd6b99, 0x002952f1, 0x0103bb3c, 0x002cc45e}}}, + {X: Field{[10]uint32{0x0069f2de, 0x03c58b75, 0x0229646d, 0x0037d941, 0x02953550, 0x00147843, 0x02539290, 0x03e8d21f, 0x01c8387b, 0x000e82bf}}, Y: Field{[10]uint32{0x01bb29c7, 0x0061eb32, 0x0324e8b4, 0x03df23fc, 0x01907d4c, 0x03cb294f, 0x0386dff3, 0x0242db87, 0x00c8f0f6, 0x001d5a5f}}}, + {X: Field{[10]uint32{0x0170809d, 0x03a905de, 0x01660949, 0x02aa288f, 0x002789d0, 0x01c81ca8, 0x026e7c4a, 0x01c8fa66, 0x0364209f, 0x000fe5ca}}, Y: Field{[10]uint32{0x02e47d15, 0x0293e110, 0x02342b32, 0x00fb98fc, 0x039a7c05, 0x0280b17f, 0x0026e769, 0x03f672bf, 0x00287a6b, 0x001e9209}}}, + {X: Field{[10]uint32{0x0089b0b4, 0x036bd2ba, 0x004df0e8, 0x0175c7d0, 0x01c21ff8, 0x02e138f4, 0x01f1ecc4, 0x00d93447, 0x000ffa73, 0x00024e2b}}, Y: Field{[10]uint32{0x01be0312, 0x02e9d291, 0x0204a63f, 0x0255932d, 0x004e9689, 0x03681a84, 0x02e8820e, 0x02ce0437, 0x02d3d526, 0x00287027}}}, + {X: Field{[10]uint32{0x00e28bcc, 0x007b22bd, 0x01071831, 0x016993a6, 0x01631c9b, 0x02f4d15d, 0x01eb9ed3, 0x039d309d, 0x01752993, 0x0014d57b}}, Y: Field{[10]uint32{0x006ad088, 0x01c94f3f, 0x01a40ddf, 0x011c0c24, 0x01c81885, 0x0003c614, 0x010279f6, 0x02aabeb0, 0x007d680a, 0x002eec40}}}, + {X: Field{[10]uint32{0x03f277b7, 0x0224c47e, 0x024574e9, 0x01bead8b, 0x02b03369, 0x010d0191, 0x03bda46a, 0x01db1b60, 0x02ed70ba, 0x0022038c}}, Y: Field{[10]uint32{0x020410bc, 0x0331ea1b, 0x00e7c623, 0x02bccc39, 0x0308dcda, 0x01a59a1a, 0x02763d5f, 0x03578901, 0x02cb8d10, 0x001dbfac}}}, + {X: Field{[10]uint32{0x00f11aa8, 0x03447c42, 0x02beebd6, 0x000f6ab5, 0x00857ac5, 0x012dd3a7, 0x00beec11, 0x016da0ae, 0x00aaa275, 0x0036bdde}}, Y: Field{[10]uint32{0x00a5f428, 0x0260bba6, 0x01c88fd4, 0x03c24a60, 0x02e38325, 0x01bb5a5d, 0x00f3024d, 0x00c05e7c, 0x0062710d, 0x0007b617}}}, + {X: Field{[10]uint32{0x03b474dd, 0x01eaf6a3, 0x004641cf, 0x01690b23, 0x009a60b9, 0x00d4cfe0, 0x01c0a4ff, 0x00f49f46, 0x01dd7563, 0x003970fa}}, Y: Field{[10]uint32{0x01fb0dfc, 0x01ec9063, 0x02afb251, 0x03f858cc, 0x0371b7b7, 0x03c82f27, 0x03036990, 0x0021faac, 0x02f65c5c, 0x003c795a}}}, + {X: Field{[10]uint32{0x00096973, 0x01a0df70, 0x03afdd11, 0x00302335, 0x016859c2, 0x03ec9d32, 0x03f3bf2f, 0x0361c25d, 0x0334ecdf, 0x0017500f}}, Y: Field{[10]uint32{0x00f6aeb1, 0x004a4e76, 0x01e4a5ba, 0x00d110f9, 0x022335c3, 0x005d935c, 0x001ba707, 0x01b3165e, 0x007c7024, 0x001ad6f9}}}, + {X: Field{[10]uint32{0x02246b12, 0x019162d7, 0x01f81389, 0x00d3cf95, 0x03993bf0, 0x02642ac9, 0x01b4caac, 0x007dc6cd, 0x013c2551, 0x00142e81}}, Y: Field{[10]uint32{0x02291f63, 0x03e8aefc, 0x025b88a7, 0x028af32f, 0x009f8a22, 0x0018f6ac, 0x02903993, 0x00c5c19d, 0x02455c7a, 0x0034bc4a}}}, + {X: Field{[10]uint32{0x026629cf, 0x02fc0bc1, 0x03a00b38, 0x0088e670, 0x039f2906, 0x00d961e4, 0x03898f0b, 0x02a7b681, 0x00eaee4a, 0x000e16a0}}, Y: Field{[10]uint32{0x03efcd50, 0x029a5d02, 0x01eb16e6, 0x00091a64, 0x038cfe49, 0x02a42e3e, 0x010806d6, 0x031b975d, 0x020bd72a, 0x002950cc}}}, + {X: Field{[10]uint32{0x03dedbef, 0x03866582, 0x00a9b276, 0x02948d88, 0x02eaa669, 0x03501463, 0x029de6c3, 0x0378e1b9, 0x00b9904e, 0x00026184}}, Y: Field{[10]uint32{0x0206b581, 0x03436522, 0x03315c4a, 0x034d8760, 0x03b88f72, 0x016d7fe3, 0x00d0c892, 0x02840343, 0x01a2eb6a, 0x00241dd5}}}, + {X: Field{[10]uint32{0x011b7fe8, 0x01e66646, 0x0329ed45, 0x016d1d53, 0x0219ae21, 0x032efda8, 0x007b0d3d, 0x0034ef7f, 0x0007d964, 0x0020fc42}}, Y: Field{[10]uint32{0x03293364, 0x029be681, 0x035e2489, 0x012bef0a, 0x02fe719e, 0x002778b1, 0x00e69c65, 0x035b4a18, 0x031b5095, 0x003d8b48}}}, + {X: Field{[10]uint32{0x03b1c246, 0x03285f53, 0x0059e74d, 0x03f19ed8, 0x01e3f287, 0x009d67f4, 0x002b0285, 0x00d718be, 0x02939273, 0x00147488}}, Y: Field{[10]uint32{0x0063745d, 0x008677db, 0x0187be05, 0x0374c4a1, 0x02f7184b, 0x00f22c49, 0x00b909e2, 0x016d3462, 0x03a3b514, 0x002e6e00}}}, + {X: Field{[10]uint32{0x03465006, 0x0277bc53, 0x03c70368, 0x01316827, 0x013e8cc2, 0x009b0df1, 0x02919458, 0x00f50f49, 0x0342e578, 0x002f9a98}}, Y: Field{[10]uint32{0x007ef000, 0x0236e89f, 0x0004c200, 0x012c70d8, 0x0081bc7e, 0x00f773f6, 0x01efc141, 0x0149e76a, 0x00fc3fc1, 0x002071c6}}}, + {X: Field{[10]uint32{0x00790036, 0x023c89af, 0x02e81a4e, 0x03642a0a, 0x00448681, 0x022c9c1c, 0x03b043b5, 0x004a1292, 0x00d9c36f, 0x003c84cd}}, Y: Field{[10]uint32{0x0016eff2, 0x03d1d4e2, 0x0308e428, 0x02e0b3c9, 0x03f5f143, 0x00878a4e, 0x03dcc1eb, 0x03f4c114, 0x00513a87, 0x00000112}}}, + {X: Field{[10]uint32{0x01730508, 0x03abebb2, 0x022cb419, 0x00ca494f, 0x020932a8, 0x01cef49f, 0x00cb1f1b, 0x0118fe04, 0x00e5af34, 0x00055631}}, Y: Field{[10]uint32{0x00c917f8, 0x007f937d, 0x0149e2dd, 0x00dd0a28, 0x006921bb, 0x029d4217, 0x023f3f41, 0x0104c8d9, 0x025025e1, 0x0032e331}}}, + {X: Field{[10]uint32{0x025d71e2, 0x02428699, 0x02e642e0, 0x03b6641c, 0x01b575a4, 0x02238e09, 0x00d3596a, 0x0083606d, 0x032c8f60, 0x000614e8}}, Y: Field{[10]uint32{0x003a8367, 0x03b660a8, 0x005e89e3, 0x0222ca50, 0x03eaf268, 0x006187ff, 0x024aedbb, 0x02ba838d, 0x031cb170, 0x002368a8}}}, + {X: Field{[10]uint32{0x00cd323d, 0x00d4e233, 0x0190b8cc, 0x02d0ef75, 0x002da679, 0x03ebea77, 0x01f60dbc, 0x00efb087, 0x00bcf0f0, 0x003bd617}}, Y: Field{[10]uint32{0x00c2f296, 0x03db601e, 0x03acdd93, 0x02e876a9, 0x01f02ccd, 0x00a04e41, 0x0192e078, 0x007db4e1, 0x0203aff9, 0x000af178}}}, + {X: Field{[10]uint32{0x02fd5c14, 0x01da022c, 0x03471a14, 0x01938344, 0x031fa458, 0x0092cf1e, 0x03d99714, 0x01a3aefb, 0x0237e1ea, 0x000fd30b}}, Y: Field{[10]uint32{0x020eeaa5, 0x038da91f, 0x005e330d, 0x005ed50e, 0x01051b9c, 0x03cca6d4, 0x02665b04, 0x00ecfeaa, 0x00ab3d28, 0x0019e264}}}, + {X: Field{[10]uint32{0x0021693a, 0x02d04679, 0x0133b621, 0x004082d5, 0x0059fc9b, 0x00eafcab, 0x01cb20ab, 0x02b12860, 0x038ad557, 0x000ac006}}, Y: Field{[10]uint32{0x02c6b94a, 0x00a5c8e0, 0x006758fa, 0x0234b283, 0x01310a32, 0x0122c949, 0x026f8c30, 0x0276c5cf, 0x0007f8d1, 0x003f93cc}}}, + {X: Field{[10]uint32{0x012cd229, 0x016f24d1, 0x00bb98d0, 0x009d62e8, 0x0379c90d, 0x007ec328, 0x02b5b108, 0x0023fe37, 0x01dd7d5a, 0x00196274}}, Y: Field{[10]uint32{0x028149a9, 0x01e45966, 0x007faa11, 0x016c64af, 0x01fdc547, 0x038003f5, 0x008dca23, 0x00a64d2f, 0x0080ed84, 0x00209025}}}, + {X: Field{[10]uint32{0x03950a6f, 0x027c3d49, 0x028a83b8, 0x03968e8e, 0x00ab4377, 0x01da9aa4, 0x00553162, 0x020d6e3a, 0x010df5d3, 0x00308cff}}, Y: Field{[10]uint32{0x00f6f3e5, 0x0088e4ad, 0x0384f494, 0x00c61ae2, 0x02314680, 0x016bbf81, 0x00fbac08, 0x02690c4b, 0x00a8775a, 0x0023fa38}}}, + {X: Field{[10]uint32{0x024cc14a, 0x02c4f41d, 0x036e7b65, 0x003e27db, 0x02a38867, 0x01d68afe, 0x02e3f57f, 0x023bbb5b, 0x02852a84, 0x00209cc6}}, Y: Field{[10]uint32{0x01117583, 0x0039334e, 0x004c1208, 0x026e29d4, 0x011ffacc, 0x0238d288, 0x03096883, 0x017a1fc6, 0x009a307c, 0x00300314}}}, + {X: Field{[10]uint32{0x02d2a50d, 0x03a9b401, 0x0097707e, 0x02d54fab, 0x00c9dde3, 0x008a50bb, 0x02b51501, 0x02c6c16a, 0x03a0e5d8, 0x003884e1}}, Y: Field{[10]uint32{0x01b0ff83, 0x02043723, 0x00349bb2, 0x02564cd5, 0x000fc81c, 0x012b177f, 0x003c9207, 0x024f7c0d, 0x0109f90d, 0x0031d379}}}, + {X: Field{[10]uint32{0x039fdc25, 0x03269256, 0x0236a00b, 0x0305b410, 0x0292780f, 0x0358d6e3, 0x035c3414, 0x010f6716, 0x01fd2fa4, 0x0006021c}}, Y: Field{[10]uint32{0x0314d120, 0x021400ea, 0x00146599, 0x00db89de, 0x021f25e6, 0x02f80971, 0x02014a8b, 0x03cde908, 0x01506008, 0x00359b1c}}}, + {X: Field{[10]uint32{0x00cb2c42, 0x034c382f, 0x03ab4b44, 0x024d360f, 0x00d64dff, 0x00455ae4, 0x0329a9a3, 0x00aa307b, 0x027eed11, 0x002d6a77}}, Y: Field{[10]uint32{0x0139db38, 0x029c7d0d, 0x03d91130, 0x033ec3fc, 0x0130315c, 0x03be15c8, 0x00afe660, 0x00febcec, 0x0279a81c, 0x00159d69}}}, + {X: Field{[10]uint32{0x00aee7d6, 0x00047f40, 0x03b4d40d, 0x01ec01b4, 0x018ce569, 0x0016973e, 0x02baf78c, 0x039437d0, 0x007261f1, 0x0026b339}}, Y: Field{[10]uint32{0x0107a05c, 0x0223fae5, 0x01e0a95f, 0x00c6b74a, 0x026cb8c8, 0x00c969e7, 0x03568304, 0x0131a795, 0x013c4046, 0x003edf10}}}, + {X: Field{[10]uint32{0x03574e5c, 0x03303ae2, 0x01100a02, 0x038d9f61, 0x01916796, 0x0064f7bb, 0x007bc4b2, 0x01dc48bf, 0x039b7bef, 0x003e02ad}}, Y: Field{[10]uint32{0x015c8f6d, 0x00067747, 0x022aac77, 0x02142d74, 0x003a1ac5, 0x01b372b3, 0x035834ed, 0x022c9766, 0x003f842d, 0x0031b534}}}, + {X: Field{[10]uint32{0x009366a1, 0x0287e62f, 0x01aeefae, 0x0123b058, 0x0125d814, 0x0182c936, 0x005845ef, 0x008c30c0, 0x0355cdb4, 0x002d0c78}}, Y: Field{[10]uint32{0x0241c1cd, 0x0345db76, 0x0390ef69, 0x0395731c, 0x017aebac, 0x014adb9a, 0x02ddb985, 0x002850e0, 0x01d4ae23, 0x003af36b}}}, + {X: Field{[10]uint32{0x0275f1fb, 0x01aa001b, 0x009c593f, 0x037db082, 0x02efe56e, 0x01b72939, 0x02b686f4, 0x00e98d47, 0x039e08c9, 0x001ea982}}, Y: Field{[10]uint32{0x03a0347e, 0x03c03bd7, 0x00c98328, 0x0002d01a, 0x00cb4248, 0x038cf9a5, 0x013e3892, 0x002fc781, 0x01e21770, 0x00001320}}}, + {X: Field{[10]uint32{0x0286b30b, 0x039d8404, 0x0296ba72, 0x03bc9cbd, 0x01d304fb, 0x028ded37, 0x001d1a4d, 0x0090edd1, 0x010b3aa4, 0x0006a209}}, Y: Field{[10]uint32{0x01b7a473, 0x017d2ada, 0x033fe3fd, 0x0163d166, 0x02b33b76, 0x0015aa6f, 0x02d8cb0f, 0x02056f81, 0x010557d3, 0x001896e7}}}, + {X: Field{[10]uint32{0x022b57c7, 0x03b6f0ea, 0x0196682d, 0x011c7aea, 0x0106c4ca, 0x02d773b8, 0x034db23c, 0x015628b4, 0x02eb49fd, 0x0016d493}}, Y: Field{[10]uint32{0x038ae50c, 0x014a41ae, 0x02d5dbf2, 0x009caf28, 0x0025c8b2, 0x01b80af7, 0x01b163d5, 0x033875cd, 0x009756b7, 0x000b570b}}}, + {X: Field{[10]uint32{0x0276d2c5, 0x0016139d, 0x007d1892, 0x03610cef, 0x00191550, 0x03dd5826, 0x00cb8b10, 0x02f9e749, 0x03776d9f, 0x002b9839}}, Y: Field{[10]uint32{0x018d7784, 0x0249bec5, 0x0311ffff, 0x0350d1a8, 0x00b76c36, 0x03bf219e, 0x011be83e, 0x0091cb28, 0x01867377, 0x0010c3fa}}}, + {X: Field{[10]uint32{0x02efb9d4, 0x03e04a98, 0x03105ab4, 0x00c2710b, 0x0353e8d7, 0x017739be, 0x020b081a, 0x03d9a351, 0x023d9e29, 0x000c8e97}}, Y: Field{[10]uint32{0x004776ba, 0x0295afa0, 0x01830c2f, 0x02911d98, 0x03da6216, 0x02d7aa6b, 0x0256d1d3, 0x00fd0859, 0x03b36948, 0x0000ad15}}}, + {X: Field{[10]uint32{0x027c1c9d, 0x00d9445e, 0x022a2a8b, 0x0125e965, 0x02b3db86, 0x01a50a6c, 0x00e612ed, 0x0154b219, 0x01b6591e, 0x002b346d}}, Y: Field{[10]uint32{0x026e88b8, 0x01886423, 0x00fa3265, 0x00947af1, 0x0067544d, 0x009498d2, 0x02ba7729, 0x01a40249, 0x03ff056f, 0x003984c7}}}, + {X: Field{[10]uint32{0x005b36f4, 0x02fdd3de, 0x02cf114e, 0x018211d0, 0x02f2e61e, 0x01549233, 0x026286b1, 0x014b80a8, 0x00708178, 0x001ad38b}}, Y: Field{[10]uint32{0x01b893df, 0x03a19139, 0x01a1a1e4, 0x03f359b9, 0x037398f7, 0x007354a5, 0x007130d0, 0x026f7080, 0x011c7a52, 0x00210025}}}, + {X: Field{[10]uint32{0x0084ab31, 0x01e5a7e0, 0x017c7151, 0x017e02a0, 0x004e6a37, 0x0230d1d1, 0x004cb914, 0x0029187d, 0x0327d67b, 0x0030acb1}}, Y: Field{[10]uint32{0x036d5f59, 0x0207ebb0, 0x01718824, 0x03522414, 0x03a52c47, 0x030a07f4, 0x00aa2519, 0x01ec3e66, 0x0359ebf3, 0x003fb590}}}, + {X: Field{[10]uint32{0x004f202e, 0x01f286e4, 0x02f71220, 0x008af683, 0x022ec564, 0x01e283e1, 0x014609d9, 0x02f653de, 0x02dab5b2, 0x000ce17b}}, Y: Field{[10]uint32{0x003d7443, 0x01eedc58, 0x0074b490, 0x0219d1a9, 0x01b12a21, 0x006a7d10, 0x01975aa3, 0x02a3b871, 0x02af1db8, 0x000a0234}}}, + {X: Field{[10]uint32{0x00c803f2, 0x006701c5, 0x02a82335, 0x03c35314, 0x02edce15, 0x03ead1e1, 0x030c2923, 0x010dee11, 0x00d7f2cb, 0x002003db}}, Y: Field{[10]uint32{0x00a37056, 0x0054bd35, 0x03734ad0, 0x0233b0e5, 0x0023e0a8, 0x02c980a3, 0x0206ca59, 0x006a8337, 0x023e0ad1, 0x002607cb}}}, + {X: Field{[10]uint32{0x02aa2f3b, 0x0071803b, 0x01f32474, 0x02dd853c, 0x02ebfaf4, 0x01eedb2a, 0x00103c6d, 0x00a1bf4f, 0x03ff3a9f, 0x001cea82}}, Y: Field{[10]uint32{0x00c6f7b1, 0x03c76946, 0x02846701, 0x00f13f79, 0x00a54a2e, 0x0362f39f, 0x009fe73d, 0x02e60f2e, 0x012981a9, 0x0000c2f1}}}, + {X: Field{[10]uint32{0x0178f2c5, 0x005a7ee8, 0x029ca789, 0x02626f3c, 0x03863804, 0x00f9d84b, 0x03fdfa9c, 0x004fda02, 0x00e6ab5c, 0x0024a03f}}, Y: Field{[10]uint32{0x00ae36bb, 0x013df373, 0x03b233e7, 0x02f76c28, 0x03aeb6a7, 0x03dfd6ed, 0x01397b18, 0x00b8ecbf, 0x00dbc5bc, 0x0012e5bb}}}, + {X: Field{[10]uint32{0x026e03ca, 0x02fda769, 0x00b8107d, 0x020397b3, 0x029f4387, 0x01c344ba, 0x009be162, 0x02e7bed6, 0x004bbb50, 0x001c8157}}, Y: Field{[10]uint32{0x036bc7cb, 0x0169b183, 0x023f9891, 0x0016a87f, 0x01985ad7, 0x006a188f, 0x01746935, 0x01df7561, 0x017fc30a, 0x002baa89}}}, + {X: Field{[10]uint32{0x03c1879f, 0x017411f9, 0x008e0308, 0x021c4aaf, 0x000eb8e8, 0x03ea09f3, 0x02687c73, 0x038f6c2e, 0x03d0c771, 0x003c3cf3}}, Y: Field{[10]uint32{0x00936b33, 0x026054e9, 0x02e20eff, 0x01733db8, 0x031bf8aa, 0x013f8428, 0x030c4b32, 0x013153e3, 0x027d8b74, 0x000b184b}}}, + {X: Field{[10]uint32{0x02f5dcfa, 0x01ebe6f9, 0x033ec67a, 0x01df979e, 0x00d8b611, 0x0290ddab, 0x02c8fe8e, 0x03c9c1be, 0x036570b0, 0x0025f1e2}}, Y: Field{[10]uint32{0x03e14c3d, 0x027563ce, 0x00daa127, 0x026cd1f1, 0x01133460, 0x00f2d650, 0x03da765c, 0x016162a5, 0x010cfea9, 0x0006bae5}}}, + {X: Field{[10]uint32{0x02509e69, 0x0327bfa7, 0x03eeb9b5, 0x03d4ce9c, 0x024b7908, 0x022c1dfe, 0x013a9de4, 0x01bf0f52, 0x021e967e, 0x002ce7fe}}, Y: Field{[10]uint32{0x0265dc05, 0x01039d7a, 0x01e16f3b, 0x00bc4486, 0x03f76c30, 0x007205f8, 0x0218c007, 0x01cb3035, 0x015181ac, 0x003d57ce}}}, + {X: Field{[10]uint32{0x00e7baaa, 0x007198fe, 0x03fd1735, 0x01ca2c79, 0x0201b2a9, 0x0246c582, 0x003fcc4d, 0x01f1346f, 0x037a5ff2, 0x000566e7}}, Y: Field{[10]uint32{0x00c4360a, 0x0202df29, 0x02697a83, 0x01f55e30, 0x015e6012, 0x01e27f50, 0x021c7f0d, 0x013febae, 0x036d86c5, 0x002c2abb}}}, + {X: Field{[10]uint32{0x0385e44c, 0x027dfcf2, 0x021aaf72, 0x02acf04d, 0x016dff76, 0x0189bf11, 0x0107a62b, 0x012c5b1f, 0x03d18d4a, 0x00096043}}, Y: Field{[10]uint32{0x036a2d9b, 0x0348864b, 0x00f442fc, 0x017ccd5e, 0x009252dd, 0x02d2e2c0, 0x0295526a, 0x02f5c2b4, 0x03257794, 0x003d0148}}}, + {X: Field{[10]uint32{0x033352b2, 0x024d37d1, 0x0241d6e1, 0x02440b69, 0x01eab362, 0x0241d620, 0x019864c0, 0x028ca312, 0x024d5860, 0x0009f882}}, Y: Field{[10]uint32{0x03b45203, 0x02e52640, 0x02a7b65c, 0x00ac03a1, 0x03d3822a, 0x000f0469, 0x030b4905, 0x02d43f89, 0x00f2888c, 0x00305663}}}, + {X: Field{[10]uint32{0x001448a2, 0x03cef44d, 0x032dd685, 0x01a13651, 0x006d684a, 0x02885ed8, 0x008f465b, 0x0253999c, 0x014e517a, 0x00120fd1}}, Y: Field{[10]uint32{0x039ad11f, 0x01a2985f, 0x02aa82ba, 0x01bfc308, 0x01d338d0, 0x01772dc3, 0x0123346c, 0x0268d917, 0x0144d93b, 0x00304ecc}}}, + {X: Field{[10]uint32{0x0204e6e5, 0x002967af, 0x03266e2e, 0x023e0e93, 0x0267ef06, 0x03054cbc, 0x024c9a30, 0x012a996b, 0x02f63173, 0x0013d1ec}}, Y: Field{[10]uint32{0x00d99d2b, 0x00d35996, 0x03a27c01, 0x00bb7551, 0x01682439, 0x03b6adcb, 0x033ebcf3, 0x0272d174, 0x034cf11b, 0x00163c7c}}}, + {X: Field{[10]uint32{0x0397db07, 0x02d8d05d, 0x0057424f, 0x00ac4711, 0x00d6f42a, 0x03a04330, 0x031774b8, 0x033a12d3, 0x037e0835, 0x002a9e3a}}, Y: Field{[10]uint32{0x005e743b, 0x0124fa86, 0x0311b0cf, 0x018c85c4, 0x03ee9ffc, 0x00fdcb8c, 0x00c7541d, 0x0351f167, 0x0139d957, 0x000e5900}}}, + {X: Field{[10]uint32{0x00033d49, 0x02c33a33, 0x0194417e, 0x03daa97d, 0x0031a3f1, 0x00dd602c, 0x01c0655c, 0x00158047, 0x018583c0, 0x00349662}}, Y: Field{[10]uint32{0x02f24b08, 0x00744696, 0x02d8bc84, 0x00193413, 0x02b6a830, 0x036af85c, 0x014622a2, 0x02062e8a, 0x01739de8, 0x000d9072}}}, + {X: Field{[10]uint32{0x01e26634, 0x004a9215, 0x03faf487, 0x017567df, 0x03f2d2b8, 0x010d641e, 0x0338f877, 0x02dd3d5b, 0x03a0eccc, 0x0013c08e}}, Y: Field{[10]uint32{0x01a6a456, 0x020a57ec, 0x02e95bc4, 0x012e1a9b, 0x03a2ae09, 0x024edb0f, 0x03c35ea3, 0x014496e3, 0x0033b15d, 0x003e03bf}}}, + {X: Field{[10]uint32{0x023a1589, 0x03df8b5d, 0x003c670b, 0x00a3df05, 0x028eda41, 0x0056b22f, 0x03e13cfa, 0x03425def, 0x008b48ab, 0x002721bc}}, Y: Field{[10]uint32{0x01c2df45, 0x014bc570, 0x00a171a1, 0x036b211a, 0x0217d4ee, 0x00a7536c, 0x02ff453d, 0x032e20e7, 0x03870e9e, 0x00045447}}}, + {X: Field{[10]uint32{0x02137576, 0x00362e3b, 0x0120e913, 0x01dda760, 0x01c5e6ac, 0x0355f89a, 0x03affcec, 0x017323ff, 0x018b72e9, 0x000e021c}}, Y: Field{[10]uint32{0x01ea728f, 0x0227f4cc, 0x00ceedb7, 0x0068278f, 0x00c614a6, 0x03b62d63, 0x02e59cf8, 0x02dc8936, 0x01ebcf5e, 0x003d03af}}}, + {X: Field{[10]uint32{0x00dda3df, 0x03e9d4bf, 0x03b4255d, 0x011d71f7, 0x00eb349f, 0x03b68091, 0x01c80a13, 0x024bf01c, 0x015e3994, 0x00237bf4}}, Y: Field{[10]uint32{0x03f7a771, 0x01317d9e, 0x00c7ff9e, 0x033b8ec3, 0x01a01786, 0x03f0e58c, 0x03b0d19f, 0x03430ed3, 0x03784353, 0x0034f7e9}}}, + {X: Field{[10]uint32{0x0024bf8a, 0x02a2a9f7, 0x03d466ea, 0x03430c92, 0x03ed99f9, 0x0263eb79, 0x00052487, 0x0341f8ea, 0x01425ac1, 0x00236b23}}, Y: Field{[10]uint32{0x02ef8009, 0x0042dcaa, 0x00087d64, 0x0098834a, 0x0262e9d9, 0x00d5375b, 0x032f097d, 0x00d3f362, 0x01b79232, 0x003c8cbf}}}, + {X: Field{[10]uint32{0x03a90e1b, 0x032b011f, 0x01d35329, 0x03f1be04, 0x01e45d26, 0x0090f0f4, 0x03178b4f, 0x039b78a1, 0x0043f3bc, 0x0021f399}}, Y: Field{[10]uint32{0x01724138, 0x00cfa54e, 0x02875fac, 0x03523dc3, 0x000f0af0, 0x01fb7cec, 0x002799d7, 0x012ad316, 0x00196241, 0x0002a25c}}}, + {X: Field{[10]uint32{0x00fdf08d, 0x0259b1aa, 0x02f3bd22, 0x03201d06, 0x02124a21, 0x02dddd6e, 0x0360a3f8, 0x02ddfa7a, 0x03fabf2f, 0x002ffb9a}}, Y: Field{[10]uint32{0x03ba76f7, 0x0339757e, 0x03fa69c9, 0x03a102e0, 0x02cd2e8b, 0x00bf20fb, 0x026f2155, 0x012fc5fc, 0x0399541e, 0x000a6870}}}, + {X: Field{[10]uint32{0x00c2bec1, 0x026bcad7, 0x0341daef, 0x02be0e06, 0x00044873, 0x02bfdcae, 0x001a5537, 0x02a0008d, 0x01a5b553, 0x00030c3f}}, Y: Field{[10]uint32{0x039fea6d, 0x01054ed0, 0x0162e7d1, 0x01b99775, 0x028a96f7, 0x0338d011, 0x004aafc0, 0x023593e9, 0x02b587d8, 0x001738fa}}}, + {X: Field{[10]uint32{0x0000ed97, 0x0375360d, 0x030a00f1, 0x001dca35, 0x014d9226, 0x006d067d, 0x01cadbfe, 0x00675c31, 0x01fd5941, 0x00179c54}}, Y: Field{[10]uint32{0x02108917, 0x03654c7a, 0x0020d73b, 0x0259895e, 0x024c64ec, 0x032f75d7, 0x0136816e, 0x0129f58b, 0x02a5a51d, 0x001aa33b}}}, + {X: Field{[10]uint32{0x0086100b, 0x01a436fb, 0x007c04bf, 0x01ead435, 0x03e974af, 0x01494896, 0x03d06208, 0x0357c3cc, 0x030a66cd, 0x002a723a}}, Y: Field{[10]uint32{0x038e0a2f, 0x02786ca2, 0x02bf329c, 0x0223cebb, 0x00a4371e, 0x03ca4335, 0x02a24bcf, 0x00c7cec0, 0x039d8987, 0x003c8272}}}, + {X: Field{[10]uint32{0x03a2e439, 0x021446b8, 0x0253b946, 0x01cd7ebd, 0x01cb8043, 0x00bb9848, 0x01b16595, 0x0245411c, 0x01d79366, 0x0025579e}}, Y: Field{[10]uint32{0x03930d06, 0x001c02f3, 0x028261de, 0x037c4839, 0x002e82cd, 0x0295b1e8, 0x02a3bcc1, 0x019e8043, 0x03e32a9b, 0x001a36ab}}}, + {X: Field{[10]uint32{0x03a34a71, 0x00ad0277, 0x005fac19, 0x0014f21a, 0x02bef248, 0x02edf875, 0x03bc70b3, 0x0331a96c, 0x0293d3c1, 0x0008b49c}}, Y: Field{[10]uint32{0x039b3357, 0x020dfa58, 0x02389e6c, 0x037ece77, 0x014d5d76, 0x01036ed6, 0x004e42e7, 0x0156dd4f, 0x00e34fc8, 0x0031d2d1}}}, + {X: Field{[10]uint32{0x0137abc0, 0x013a3108, 0x03835b2f, 0x022ce80d, 0x0370d46e, 0x0121ebaf, 0x01d91f71, 0x005d9d3a, 0x02cef74b, 0x003467f3}}, Y: Field{[10]uint32{0x02db7580, 0x02b6db12, 0x00a83fe9, 0x0397cd97, 0x0334ca9f, 0x025332e8, 0x02224f74, 0x002604f3, 0x03f63dca, 0x0016e412}}}, + {X: Field{[10]uint32{0x02336899, 0x00df2470, 0x0073f2a4, 0x01b1492a, 0x001723c3, 0x02f1a9aa, 0x02091136, 0x01200359, 0x022aadc7, 0x001aa85c}}, Y: Field{[10]uint32{0x02319d07, 0x03c7b8b5, 0x03c369a4, 0x0367b599, 0x023d9709, 0x00855273, 0x01640583, 0x016d318c, 0x004cdf49, 0x0023a5c0}}}, + {X: Field{[10]uint32{0x00ea6efc, 0x01be146c, 0x01052f73, 0x01ac1c83, 0x02b16e3b, 0x025ab461, 0x0107262e, 0x0348804b, 0x02239ee4, 0x001e6f4d}}, Y: Field{[10]uint32{0x0018729e, 0x03d36fbd, 0x000fe42d, 0x01beb5ae, 0x036a3116, 0x031f24b0, 0x00972c71, 0x03369077, 0x03dbf568, 0x000292d0}}}, + {X: Field{[10]uint32{0x00f16ce9, 0x00460be9, 0x028c9e40, 0x00800500, 0x03a1c7d8, 0x01a43033, 0x0183c5d3, 0x00ded59d, 0x032c1463, 0x002d780a}}, Y: Field{[10]uint32{0x0069e0b2, 0x0389e564, 0x026fb938, 0x0299c634, 0x021a819b, 0x003a2850, 0x013516fa, 0x02a9c39e, 0x02be3fac, 0x0012e591}}}, + {X: Field{[10]uint32{0x03a7403a, 0x02bdd0c1, 0x0057dd05, 0x02152ce2, 0x0114a2b6, 0x021fde43, 0x0044d643, 0x03ad3419, 0x0271de2d, 0x00238cf8}}, Y: Field{[10]uint32{0x01ecc429, 0x00f5b8a2, 0x0171fc91, 0x03fc3fa7, 0x00e08d73, 0x00f833ac, 0x02011bd0, 0x028773aa, 0x03a2c7a4, 0x00360b54}}}, + {X: Field{[10]uint32{0x0019c2f5, 0x0164f293, 0x0036b074, 0x03d8bd7b, 0x020abd6e, 0x03b68df6, 0x0369b73f, 0x029e0395, 0x004277db, 0x0013ffbd}}, Y: Field{[10]uint32{0x0392f854, 0x021a04f4, 0x01d694a1, 0x02f59efe, 0x03796755, 0x02ec27e6, 0x036162cf, 0x0282ae7b, 0x0057378a, 0x002a28c2}}}, + {X: Field{[10]uint32{0x01f57368, 0x00dc49ba, 0x02bdefb7, 0x035bb2e9, 0x03f7e42e, 0x006e491b, 0x00b03341, 0x001722d6, 0x012a6338, 0x0021e2d9}}, Y: Field{[10]uint32{0x02e85836, 0x007bf055, 0x0020ad54, 0x004749d2, 0x02148c97, 0x01290750, 0x02e71f0b, 0x0056334e, 0x033ed691, 0x000b3efa}}}, + {X: Field{[10]uint32{0x01eb415e, 0x002c41a7, 0x02783dd4, 0x00bc6c20, 0x01a0aa0b, 0x01e6b2f0, 0x0399ee6a, 0x02bb451a, 0x0215aee2, 0x003be69a}}, Y: Field{[10]uint32{0x01e97240, 0x02f42392, 0x00d826d9, 0x03686715, 0x02cffd9c, 0x02d271ea, 0x03c44802, 0x00d45286, 0x02ba7fd5, 0x00264278}}}, + {X: Field{[10]uint32{0x0245bf37, 0x02b081c1, 0x008fcdcf, 0x00630b55, 0x02c7814e, 0x036c33a3, 0x00358855, 0x0348c182, 0x00d41551, 0x00357092}}, Y: Field{[10]uint32{0x01a36f05, 0x02013045, 0x029cb3c3, 0x017e0b6a, 0x003cbeb4, 0x0053542a, 0x0378c88c, 0x007e0a32, 0x009e7bf0, 0x003e717a}}}, + {X: Field{[10]uint32{0x03227d1a, 0x016467d5, 0x00289f2c, 0x003c25bb, 0x026dad0c, 0x005155a0, 0x036e6148, 0x0055f659, 0x01cca526, 0x003b6fc9}}, Y: Field{[10]uint32{0x0299554d, 0x036b80bb, 0x034c7409, 0x007bdb95, 0x03d0ca70, 0x0034dc95, 0x0033c137, 0x0191592a, 0x0088be05, 0x0001a115}}}, + {X: Field{[10]uint32{0x00cf09bb, 0x039ba953, 0x0378b26f, 0x02c37f3c, 0x0314be80, 0x033e4a1a, 0x021f5cf0, 0x038dd894, 0x026fb8e2, 0x00170480}}, Y: Field{[10]uint32{0x02daa596, 0x0299d619, 0x010471bf, 0x014102ea, 0x0094b81a, 0x02072691, 0x010154d5, 0x0194a1e5, 0x01ef4e2c, 0x000f6635}}}, + {X: Field{[10]uint32{0x008e2d6d, 0x0134acb9, 0x030a0b43, 0x0352bce5, 0x03ae728b, 0x019cce31, 0x00dcef7f, 0x00157585, 0x02435056, 0x00309f98}}, Y: Field{[10]uint32{0x018525c9, 0x004dea9f, 0x033ced82, 0x025e158c, 0x029e372d, 0x0334a315, 0x00839eeb, 0x03e51bde, 0x02fc703c, 0x001dad61}}}, + {X: Field{[10]uint32{0x01abaf8a, 0x036bb794, 0x027e7b96, 0x00feac52, 0x007f6760, 0x0263b981, 0x0024e8af, 0x0061ad35, 0x03045140, 0x0028a631}}, Y: Field{[10]uint32{0x00108fda, 0x0358e35a, 0x031085d7, 0x027ae9cb, 0x00463b77, 0x01283087, 0x01b430db, 0x0064d529, 0x01582a1b, 0x001371c0}}}, + {X: Field{[10]uint32{0x012013c4, 0x00bccf86, 0x02f073a6, 0x005223ae, 0x02fdf400, 0x0125a8cc, 0x0204fb19, 0x03a2c2b0, 0x015782da, 0x00387f3a}}, Y: Field{[10]uint32{0x01d02f4c, 0x0138d9c7, 0x008a4a26, 0x00e513cc, 0x01e8ca64, 0x01de8435, 0x022b50aa, 0x01bfe5aa, 0x02e5d578, 0x0010145f}}}, + {X: Field{[10]uint32{0x03097d6d, 0x00e6ff02, 0x033a21e1, 0x010bd9cf, 0x001a2b0c, 0x008d8551, 0x00e49bb6, 0x02e00239, 0x03fc5f06, 0x00039c66}}, Y: Field{[10]uint32{0x02fd7822, 0x0118b0ab, 0x025e1a0a, 0x00cd3e45, 0x01d14e2c, 0x00631251, 0x023929ee, 0x037da287, 0x001d83f5, 0x003c320f}}}, + {X: Field{[10]uint32{0x00ad0a4e, 0x0130e2d4, 0x0235a17f, 0x01436723, 0x020dc27c, 0x039a5f6e, 0x00b11277, 0x03358a10, 0x024ba9d8, 0x001ddd9a}}, Y: Field{[10]uint32{0x031b6431, 0x02da7388, 0x00554b26, 0x01b9bdb9, 0x0060b758, 0x01b0642f, 0x02265ac8, 0x009ee808, 0x02d94483, 0x0016ce8a}}}, + {X: Field{[10]uint32{0x008514b4, 0x03ca390d, 0x00292597, 0x035d8983, 0x004f2c9d, 0x00418da4, 0x0260cda4, 0x02a157e1, 0x021f6215, 0x003c8ddc}}, Y: Field{[10]uint32{0x02cfef79, 0x02e4ce06, 0x03651bcc, 0x03a755ec, 0x0046f5ad, 0x00f2e61d, 0x02e8c6d3, 0x027e73b2, 0x021c187b, 0x0004276a}}}, + {X: Field{[10]uint32{0x027b3e08, 0x014fc269, 0x033b9f19, 0x00edb16b, 0x0397517b, 0x01436f20, 0x004e7a8a, 0x006868f3, 0x01d5e889, 0x0025023d}}, Y: Field{[10]uint32{0x01691555, 0x01e7b256, 0x02b90ed8, 0x0150cb67, 0x03ca33e9, 0x0173b4af, 0x01f87b90, 0x006ba725, 0x0212c32f, 0x0006e0bc}}}, + {X: Field{[10]uint32{0x012a7064, 0x027db055, 0x020f4c4f, 0x03223c59, 0x03883649, 0x03a419d7, 0x03214f13, 0x01e49b27, 0x02551170, 0x002ca0dd}}, Y: Field{[10]uint32{0x011abfcf, 0x02c2f5db, 0x00131829, 0x01054671, 0x03be6ee0, 0x02f5545b, 0x0303ca45, 0x02258b9b, 0x033915be, 0x0022554d}}}, + {X: Field{[10]uint32{0x0378f4a9, 0x019eff92, 0x039c1437, 0x00c4fe4b, 0x03986413, 0x01b034a7, 0x012a9dcb, 0x03d5293b, 0x020036b5, 0x003390ae}}, Y: Field{[10]uint32{0x03a048d4, 0x02f4dff8, 0x028024a7, 0x0360914a, 0x0339b757, 0x03dc1afe, 0x00c91792, 0x02ebd1da, 0x0292cf35, 0x001b951c}}}, + {X: Field{[10]uint32{0x00cbcc59, 0x03b738bb, 0x0007d8e9, 0x02f10bc2, 0x00d3942b, 0x0352bd08, 0x009325e8, 0x00ea5efb, 0x02a01a06, 0x002ecf68}}, Y: Field{[10]uint32{0x02d70b32, 0x016749fe, 0x00d9d5c5, 0x00023685, 0x0225d6eb, 0x035b9ecb, 0x018a19ec, 0x0241ffbd, 0x03aabc39, 0x001f0a39}}}, + {X: Field{[10]uint32{0x02c490ee, 0x00b0378d, 0x02acf539, 0x0249b7a3, 0x01dd3e95, 0x01bec9a4, 0x036f620d, 0x0281d3a9, 0x003c97f3, 0x00097613}}, Y: Field{[10]uint32{0x02d5651a, 0x01ce90c5, 0x0154016f, 0x01b279d6, 0x03415309, 0x02b5bf49, 0x0391ffb1, 0x022a6c1e, 0x0345088c, 0x0017839d}}}, + {X: Field{[10]uint32{0x00d5765b, 0x00e511a1, 0x034a7faf, 0x00af9d0e, 0x03764994, 0x01f01d85, 0x015a01de, 0x01bc60b9, 0x03fdca25, 0x0022ea8e}}, Y: Field{[10]uint32{0x030506f1, 0x0022e034, 0x018117f3, 0x01f41f9c, 0x01587bfe, 0x01cc2c84, 0x01c28164, 0x0057345c, 0x00978bbe, 0x001851fa}}}, + {X: Field{[10]uint32{0x021f5170, 0x01a5e5c0, 0x0319274c, 0x026ca1f1, 0x024d3b6b, 0x000931c1, 0x0065dea8, 0x000e1447, 0x020a5b7d, 0x00141f5a}}, Y: Field{[10]uint32{0x037bf5d3, 0x00eb6b5f, 0x03b372dc, 0x034338c3, 0x03c12793, 0x00eb8cae, 0x02a8141c, 0x020eb91f, 0x024770ea, 0x0004e7c5}}}, + {X: Field{[10]uint32{0x02bbd846, 0x003f4e89, 0x030d6d64, 0x03ced3fc, 0x00e45620, 0x003f085f, 0x037354b1, 0x0316fa66, 0x02f7a059, 0x001f1a64}}, Y: Field{[10]uint32{0x01e0bee6, 0x006838ed, 0x02d03274, 0x02814386, 0x001f64e6, 0x004e7efb, 0x027062d7, 0x019070aa, 0x034efa63, 0x00025911}}}, + {X: Field{[10]uint32{0x02698bf2, 0x0319a496, 0x0238fcfc, 0x005efec2, 0x033d5e33, 0x03a9bc55, 0x00507509, 0x016c8c52, 0x02b01bf6, 0x003d8a0c}}, Y: Field{[10]uint32{0x00c1ec95, 0x0230a995, 0x0040d366, 0x00ee31d6, 0x011546cc, 0x013cdd6f, 0x02ce6f88, 0x037f5cfd, 0x00107b8f, 0x0035cc52}}}, + {X: Field{[10]uint32{0x03d1ebad, 0x03e2e71a, 0x02657def, 0x022b3332, 0x00594f62, 0x02f8f1f1, 0x00e20913, 0x03b0d8ad, 0x00abd8e4, 0x002bb487}}, Y: Field{[10]uint32{0x037100f8, 0x03759cae, 0x01dfdf9c, 0x00158094, 0x02b880a2, 0x03d07515, 0x02de1ac2, 0x01ffeaa2, 0x02f3833c, 0x0003e003}}}, + {X: Field{[10]uint32{0x014bf405, 0x0337f6dc, 0x01f66e06, 0x032adb00, 0x029e0ba8, 0x032a5094, 0x011b877a, 0x026905ae, 0x00a9343a, 0x0011b79e}}, Y: Field{[10]uint32{0x014d2bcf, 0x027662fb, 0x00bf66c8, 0x021c237e, 0x0181f30b, 0x00646136, 0x02809c6f, 0x029cfb84, 0x02524f3e, 0x00305104}}}, + {X: Field{[10]uint32{0x00bd41bc, 0x000ed095, 0x02174a63, 0x02469d42, 0x03ba4b65, 0x0010ee66, 0x016ae193, 0x03a4c94d, 0x01b8ab82, 0x000a0cad}}, Y: Field{[10]uint32{0x00aba440, 0x0398fdcd, 0x0049e249, 0x0093d242, 0x01a82752, 0x032e19a5, 0x02ce5340, 0x03c5248f, 0x02033f59, 0x00300d8f}}}, + {X: Field{[10]uint32{0x03e43f9a, 0x017c3132, 0x007ff939, 0x00109cdb, 0x020d85bd, 0x003cdaf6, 0x00abe39b, 0x005885df, 0x01024b5c, 0x0016d5f1}}, Y: Field{[10]uint32{0x0120766c, 0x0032306f, 0x00c06853, 0x0131eb73, 0x01b282ed, 0x00d7613b, 0x03f57b9b, 0x0011cfc6, 0x0007dc0c, 0x00002109}}}, + {X: Field{[10]uint32{0x01c2f103, 0x0132ec70, 0x03af3dac, 0x0362a7b6, 0x00814c45, 0x025ad2a7, 0x01bf8211, 0x01d63a09, 0x02708063, 0x002ce136}}, Y: Field{[10]uint32{0x030fa325, 0x002fbf48, 0x02d13df3, 0x0056bcc3, 0x03aa2375, 0x0241d5fe, 0x03925965, 0x033101d3, 0x01df6400, 0x0039b998}}}, + {X: Field{[10]uint32{0x009a5e1c, 0x00031697, 0x008f8e73, 0x01c8057b, 0x0282a5b6, 0x0069519a, 0x00a5da96, 0x01122a6c, 0x0191563e, 0x000dbff6}}, Y: Field{[10]uint32{0x00bb961c, 0x03b625c0, 0x013b632a, 0x035812d4, 0x01d1a742, 0x0135c8a9, 0x01873208, 0x0351fa50, 0x0035fc17, 0x0025c19e}}}, + {X: Field{[10]uint32{0x0189d81c, 0x02acd2bb, 0x022e7f5a, 0x00b31b0d, 0x035b9d14, 0x00eb7361, 0x0260ecc3, 0x000d9f93, 0x005257c2, 0x0020d9f9}}, Y: Field{[10]uint32{0x008be121, 0x00efc665, 0x0327af1f, 0x0356ef73, 0x02b77ce2, 0x03d0e067, 0x00a9e74d, 0x02c9bb4e, 0x00903ffa, 0x003f1ffc}}}, + {X: Field{[10]uint32{0x00b0564b, 0x0225a6f7, 0x02d179c9, 0x02e752c6, 0x0004719f, 0x0048e196, 0x00539e24, 0x00a5bed0, 0x03e48cc9, 0x003db391}}, Y: Field{[10]uint32{0x03950e1c, 0x003582a1, 0x02a60093, 0x0019e002, 0x02b524a6, 0x033464ab, 0x01590175, 0x03702dbc, 0x036afe5e, 0x000da34a}}}, + {X: Field{[10]uint32{0x01fae013, 0x00769efe, 0x02ac6509, 0x01623fe7, 0x03194ccb, 0x01c95917, 0x03d20c2a, 0x029bc149, 0x03e4beda, 0x0010e308}}, Y: Field{[10]uint32{0x02ff15f8, 0x004c69a4, 0x00b456d6, 0x02ffe392, 0x03e28dc6, 0x01c8a884, 0x01c93b53, 0x02095f6f, 0x0230c721, 0x00151882}}}, + {X: Field{[10]uint32{0x02bee7bd, 0x02124b61, 0x03fbc84e, 0x02acbbb1, 0x03a1fa1d, 0x0176d405, 0x00e87228, 0x00d2fdeb, 0x02f8cc94, 0x00073d9c}}, Y: Field{[10]uint32{0x01cafdcc, 0x00d2f16d, 0x01018167, 0x0047891e, 0x018932b5, 0x01d9f3bf, 0x03cccedb, 0x03769655, 0x01258bb4, 0x0035b48f}}}, + {X: Field{[10]uint32{0x021a2861, 0x01688fcf, 0x00bf4432, 0x018e2bca, 0x01943052, 0x03dc557f, 0x01cd1574, 0x00a6d9ba, 0x0212b0fa, 0x0011d193}}, Y: Field{[10]uint32{0x02b05141, 0x02a19368, 0x01e5681d, 0x02c286c6, 0x03a2468d, 0x0121a6a0, 0x0166e808, 0x03d5997a, 0x01d53bcd, 0x00082690}}}, + {X: Field{[10]uint32{0x02a964a2, 0x0301d69a, 0x02ff8717, 0x008f82c0, 0x020c4ee2, 0x02efdceb, 0x0077a0a9, 0x0324139a, 0x03a1c884, 0x002a6b7e}}, Y: Field{[10]uint32{0x03f79dc8, 0x02b90120, 0x0236c6cf, 0x0282121e, 0x02b2d809, 0x03fad49f, 0x03371d4a, 0x030d71cf, 0x001da7bb, 0x002ac584}}}, + {X: Field{[10]uint32{0x018edcbe, 0x00071bf1, 0x03f97d31, 0x02b97d05, 0x01824421, 0x0167b3e5, 0x00983dd6, 0x000c496b, 0x02de1060, 0x000a4cbf}}, Y: Field{[10]uint32{0x0176d727, 0x01d508f7, 0x02176e10, 0x0385f210, 0x012df54f, 0x03d32c47, 0x0234fe06, 0x0055afcb, 0x0343e666, 0x00218069}}}, + {X: Field{[10]uint32{0x03a50216, 0x0359969c, 0x01df3e31, 0x00e79a62, 0x0064f9ba, 0x03fdd103, 0x02b62c58, 0x02b41080, 0x01282f87, 0x0016afd5}}, Y: Field{[10]uint32{0x01a1fabf, 0x01a4a541, 0x029c5d32, 0x015ca0b5, 0x00610b6f, 0x03b71738, 0x00a1b370, 0x0170080b, 0x0216f270, 0x001c7713}}}, + {X: Field{[10]uint32{0x0001843a, 0x02670f6a, 0x013ec573, 0x02f34902, 0x020f359c, 0x00b0b1f9, 0x0087fc28, 0x0072b506, 0x015d9a12, 0x00010652}}, Y: Field{[10]uint32{0x033e0c31, 0x014daabd, 0x009d2956, 0x01f3638e, 0x02d5e661, 0x00e641cc, 0x02fefc78, 0x01425046, 0x01974029, 0x002454b8}}}, + {X: Field{[10]uint32{0x01fbc3af, 0x016ade8a, 0x03eae416, 0x013889bd, 0x00a902bc, 0x02b2ec56, 0x027979a5, 0x039270f0, 0x0082ea2b, 0x003f28e1}}, Y: Field{[10]uint32{0x0346f5f4, 0x015a9b73, 0x0234f288, 0x01d5ec03, 0x01bad50a, 0x00a5b110, 0x0235f0f7, 0x00999242, 0x035e5fe6, 0x0004981c}}}, + {X: Field{[10]uint32{0x01065d06, 0x02bd1595, 0x02de14b7, 0x01023244, 0x02d499ec, 0x016f0eac, 0x02135305, 0x00da22b2, 0x01233d70, 0x002f3c14}}, Y: Field{[10]uint32{0x01fb8bf9, 0x032d97e9, 0x0271d5f5, 0x0245d9c3, 0x01c16d49, 0x00d15a21, 0x0084e63a, 0x01a42cd5, 0x03f10645, 0x003cc995}}}, + {X: Field{[10]uint32{0x029a92e1, 0x036292e3, 0x018e479d, 0x03128999, 0x0268bf6c, 0x017f25ac, 0x019cf74f, 0x02d092c5, 0x002f6391, 0x00139c2d}}, Y: Field{[10]uint32{0x013b3688, 0x02ccfdf9, 0x03d36591, 0x02c8ff93, 0x0266c595, 0x02db38d5, 0x0324fa44, 0x007019de, 0x00111af3, 0x0022e9e2}}}, + {X: Field{[10]uint32{0x0121742f, 0x0213c37a, 0x00e6e1be, 0x03ce2897, 0x013cdb83, 0x01d8a370, 0x013703ca, 0x0183ab08, 0x03d7331c, 0x000ffa14}}, Y: Field{[10]uint32{0x01dca5d6, 0x00c39517, 0x0076d0b2, 0x00966d81, 0x03f27b51, 0x003c9374, 0x01961540, 0x03704dbd, 0x0377c2c6, 0x003edf6e}}}, + {X: Field{[10]uint32{0x0248b9be, 0x0098d27d, 0x025f5ee7, 0x0208f33d, 0x01ca42f5, 0x013a5d90, 0x02aa8100, 0x03750028, 0x037fc3ca, 0x003600cd}}, Y: Field{[10]uint32{0x03d6fe99, 0x011c67a3, 0x02900d82, 0x00616b44, 0x00aeed21, 0x033044eb, 0x02b7fbfe, 0x02020152, 0x004f281a, 0x0018d5ee}}}, + {X: Field{[10]uint32{0x030bebe1, 0x001b2781, 0x03845941, 0x00535b62, 0x0290a051, 0x01fe97b4, 0x037128e7, 0x01c5880a, 0x007b6f9e, 0x001777f7}}, Y: Field{[10]uint32{0x01cd76ad, 0x0047b915, 0x021e9d59, 0x03644663, 0x02714b6d, 0x00740c19, 0x0274c81a, 0x03edefeb, 0x00edfa1e, 0x00008fab}}}, + {X: Field{[10]uint32{0x036f7dd5, 0x0133528e, 0x004115bc, 0x01bb5c85, 0x037913b4, 0x004b459e, 0x01353e6b, 0x02523fa4, 0x0243c964, 0x0017c540}}, Y: Field{[10]uint32{0x00af903f, 0x0375366e, 0x014e571c, 0x0336555d, 0x03b18147, 0x028d8313, 0x00991e2b, 0x03440805, 0x01497a2f, 0x000daaf2}}}, + {X: Field{[10]uint32{0x00942647, 0x01a6eb14, 0x00e14979, 0x00898551, 0x030539f0, 0x02c49fbf, 0x00cc89c2, 0x0110a5e9, 0x00975b0c, 0x00092d3f}}, Y: Field{[10]uint32{0x02b5c207, 0x00e895e7, 0x038f9a82, 0x00b290f2, 0x0311d96f, 0x000529de, 0x02f88819, 0x001f617e, 0x03df54ad, 0x002f4f8f}}}, + {X: Field{[10]uint32{0x002202e0, 0x03395739, 0x0276e1dc, 0x03aab987, 0x03f11b18, 0x02191061, 0x025ba2b2, 0x02d7f277, 0x03355556, 0x0028083a}}, Y: Field{[10]uint32{0x02639f66, 0x02416755, 0x0188027e, 0x01bafadc, 0x039765ac, 0x02a60b8a, 0x03667c00, 0x03d15c5a, 0x021f1ad2, 0x00269c7a}}}, + {X: Field{[10]uint32{0x01f37a68, 0x01abf6b8, 0x00a0f86f, 0x01e33356, 0x038a224c, 0x018711f8, 0x0131de59, 0x00fab181, 0x0064f717, 0x00182de4}}, Y: Field{[10]uint32{0x010786b7, 0x017ce312, 0x016decfc, 0x038d89c9, 0x013437e4, 0x022d529f, 0x01fcbaed, 0x01f5b5ae, 0x024cf6a4, 0x000eb412}}}, + {X: Field{[10]uint32{0x01f7d60b, 0x01edf8e8, 0x01685177, 0x02d74442, 0x03d2e233, 0x03238ff7, 0x002d9159, 0x0079512b, 0x01f2b57d, 0x0020d73c}}, Y: Field{[10]uint32{0x02a84b31, 0x017281fd, 0x01b16166, 0x0255f24a, 0x01a7112f, 0x03871b80, 0x03f77339, 0x036c4eee, 0x0135136e, 0x001f48f7}}}, + {X: Field{[10]uint32{0x037f77ed, 0x00e549e0, 0x00dcab1d, 0x0378c623, 0x03606cd7, 0x012cc66e, 0x021d8ade, 0x036b540b, 0x03501f1e, 0x003ebdd0}}, Y: Field{[10]uint32{0x0221bcc9, 0x0122f7ff, 0x0147616d, 0x006e15d4, 0x030fbcd1, 0x026deb3f, 0x01a0fa03, 0x0160392e, 0x00bdbffb, 0x0036efac}}}, + {X: Field{[10]uint32{0x012de938, 0x02775dc3, 0x027620a3, 0x02974eca, 0x01044091, 0x004849c7, 0x03f74edf, 0x02eb88f9, 0x03c3e072, 0x000e5b1b}}, Y: Field{[10]uint32{0x026fa667, 0x027458b7, 0x024799e9, 0x01dbd1aa, 0x029fb0e0, 0x01ae3d53, 0x00499409, 0x01513533, 0x02f8a143, 0x00177948}}}, + {X: Field{[10]uint32{0x0144ab88, 0x0051fb83, 0x03684881, 0x0170790e, 0x00ae8e60, 0x0023bc83, 0x02622f80, 0x03cb2870, 0x0140ad8d, 0x0003e2ae}}, Y: Field{[10]uint32{0x01bff796, 0x00f9c377, 0x011e0406, 0x03d4cf91, 0x01630d28, 0x0201310a, 0x0057163f, 0x009f3b26, 0x0281fa74, 0x00267f94}}}, + {X: Field{[10]uint32{0x01772367, 0x0106d1af, 0x01e78758, 0x01325640, 0x008197af, 0x020a70dd, 0x0122219a, 0x03fff078, 0x0068af6d, 0x0029880a}}, Y: Field{[10]uint32{0x01e9af45, 0x03deeac1, 0x00e4d145, 0x031360ec, 0x03fe9c4f, 0x0235a363, 0x0254eb6f, 0x0127053e, 0x020bc82a, 0x000981e8}}}, + {X: Field{[10]uint32{0x0067e41e, 0x0312611c, 0x02bda4d7, 0x017edda8, 0x00cfbced, 0x00e93f6f, 0x03644842, 0x02185a41, 0x019349a9, 0x002c4b46}}, Y: Field{[10]uint32{0x02d75e31, 0x0270cf70, 0x037ec009, 0x0155c006, 0x0173fdd5, 0x01c05112, 0x0045eb3f, 0x022ac4a4, 0x00e0ac6c, 0x00299b75}}}, + {X: Field{[10]uint32{0x01eb3b3c, 0x01ef7085, 0x01c64fd6, 0x00d17372, 0x009ae0a7, 0x0064e0c1, 0x00d3b97b, 0x003d7f1b, 0x0355b499, 0x00023723}}, Y: Field{[10]uint32{0x01435d83, 0x01044679, 0x002f5fa6, 0x00e3211f, 0x02c00ce4, 0x021c8bd2, 0x0354cc38, 0x023f632e, 0x017d62cc, 0x0006f9d1}}}, + {X: Field{[10]uint32{0x018feeec, 0x03586719, 0x0053b1b6, 0x00f6b743, 0x01f12864, 0x018d47d9, 0x0121c4b3, 0x02792df5, 0x0337d1db, 0x000b02dc}}, Y: Field{[10]uint32{0x039bad53, 0x0264016c, 0x02d9ad8b, 0x0254ec20, 0x01ef765b, 0x001f3b85, 0x03dae62c, 0x004867de, 0x039ceb7c, 0x003a289e}}}, + {X: Field{[10]uint32{0x023bab35, 0x001b24f6, 0x00d0e66d, 0x024aed7c, 0x02b17ad6, 0x009052ac, 0x00a0d1d2, 0x001a2692, 0x00a25010, 0x002247ed}}, Y: Field{[10]uint32{0x027260f6, 0x014f8903, 0x00c7c0cb, 0x00399869, 0x0052d06c, 0x00d1fcf2, 0x013c03bc, 0x00f04efa, 0x0166cdf4, 0x00105a14}}}, + {X: Field{[10]uint32{0x01ca1738, 0x027b4eda, 0x03b02ed9, 0x02d87d6e, 0x0039fbcc, 0x0399a3bc, 0x0213729d, 0x01103f9c, 0x01b1511c, 0x00128cde}}, Y: Field{[10]uint32{0x03ac0f6f, 0x00519328, 0x02b0039d, 0x000f505c, 0x0017b3bf, 0x02d133a2, 0x01d75eed, 0x006476a2, 0x01c239e9, 0x002c4a8f}}}, + {X: Field{[10]uint32{0x03815521, 0x01c18697, 0x000d22c5, 0x00f0721e, 0x017dc58e, 0x00efe359, 0x01a360f8, 0x01afe98b, 0x03c85493, 0x002e2ca9}}, Y: Field{[10]uint32{0x02a2d15b, 0x0168f57d, 0x03021c06, 0x00b05f0a, 0x021cd441, 0x014aa26e, 0x02c70012, 0x00d8b096, 0x000b7719, 0x0023e48b}}}, + {X: Field{[10]uint32{0x039624fb, 0x024491f6, 0x03a7ff01, 0x02d88b25, 0x002fb56a, 0x01f3dcea, 0x029341d7, 0x014b941e, 0x0219d1dc, 0x002419bf}}, Y: Field{[10]uint32{0x011baf50, 0x00f9f51c, 0x00896215, 0x02f02aef, 0x00c281f5, 0x02d9e269, 0x01d4929e, 0x0315d760, 0x03436ec3, 0x0008f466}}}, + {X: Field{[10]uint32{0x00ced8ec, 0x00d35d5f, 0x017c2b05, 0x0379b99d, 0x029f32c8, 0x02d6dcfb, 0x01a18df2, 0x03a6c728, 0x014c19c9, 0x002fe6ac}}, Y: Field{[10]uint32{0x029759c0, 0x007c5d03, 0x011dd048, 0x01d756f2, 0x0385e793, 0x00de8ebd, 0x02724188, 0x018f782a, 0x01233c38, 0x003b25a6}}}, + {X: Field{[10]uint32{0x016f9d03, 0x01978d4c, 0x031af102, 0x021ba216, 0x0378c656, 0x023adeab, 0x01b7e69e, 0x01280889, 0x006f9c65, 0x001a2c9a}}, Y: Field{[10]uint32{0x014da9c3, 0x012e06fc, 0x0019af28, 0x035bd3dd, 0x03b6b407, 0x00e49caa, 0x014d4077, 0x009af615, 0x01048468, 0x00074f5d}}}, + {X: Field{[10]uint32{0x010bf2fa, 0x009c00dc, 0x01a7de04, 0x01a6fdef, 0x024d3bf6, 0x00b27cda, 0x00989d39, 0x02886a53, 0x03855251, 0x00083720}}, Y: Field{[10]uint32{0x01aa749f, 0x01d83c25, 0x0224a974, 0x0251588f, 0x03975d67, 0x0182321d, 0x0080c4b3, 0x00ca7fe4, 0x02ff713d, 0x000085f9}}}, + {X: Field{[10]uint32{0x01fd0368, 0x026872ad, 0x01568168, 0x011a6a1d, 0x025c822e, 0x03164612, 0x01859bf8, 0x0266328e, 0x009b555d, 0x003c2fad}}, Y: Field{[10]uint32{0x02664aac, 0x0022d01c, 0x032f53bd, 0x03c05830, 0x002e8ff7, 0x029d74fd, 0x033b3b30, 0x037e52e8, 0x02e7a23d, 0x00383816}}}, + {X: Field{[10]uint32{0x00a0ee57, 0x0168ed71, 0x022cfaab, 0x032b7229, 0x0016ddc1, 0x00b3d311, 0x01ad8abf, 0x03e7ae90, 0x0173270f, 0x0023c6aa}}, Y: Field{[10]uint32{0x015920ec, 0x038c2996, 0x00a87071, 0x02c0ae68, 0x002bd6bb, 0x00bdbae8, 0x02a441f1, 0x026c5ea1, 0x0260e340, 0x00242a8d}}}, + {X: Field{[10]uint32{0x028a9957, 0x0208a0e4, 0x01dfb413, 0x02a02ab2, 0x00fecd43, 0x024d2e20, 0x00ca847a, 0x03051d83, 0x0135278d, 0x0031c7ac}}, Y: Field{[10]uint32{0x02003804, 0x021c57ad, 0x03299a9d, 0x0311f9c6, 0x0351d23a, 0x03b31fdb, 0x0307ad5d, 0x0206e224, 0x03774852, 0x0010599f}}}, + {X: Field{[10]uint32{0x02c41c81, 0x03b5946f, 0x01180b0f, 0x00f6ee87, 0x00fa904d, 0x01259717, 0x0109df5d, 0x01aa7cdf, 0x026e50d6, 0x003a401c}}, Y: Field{[10]uint32{0x01028e39, 0x0317c25c, 0x01d5a921, 0x0095e1ba, 0x03117f77, 0x0371f5ec, 0x00e64f2c, 0x01bd02cd, 0x0230db03, 0x0035482a}}}, + {X: Field{[10]uint32{0x0123fa38, 0x0398ed80, 0x00c3beda, 0x035d3e1f, 0x0258d72d, 0x0083bf79, 0x03a6d6b7, 0x014aa6e8, 0x00afa159, 0x002502ac}}, Y: Field{[10]uint32{0x03bfcbcd, 0x01974a3c, 0x00702f87, 0x03c14f10, 0x016e5061, 0x012445b8, 0x01e443aa, 0x022866e1, 0x03476f78, 0x003fb1b5}}}, + {X: Field{[10]uint32{0x00c76949, 0x00b9c32a, 0x006be8b6, 0x01a81903, 0x02a03ba4, 0x004b1739, 0x033ce9d4, 0x02619937, 0x026d643e, 0x002684f7}}, Y: Field{[10]uint32{0x0126dd5e, 0x000e54da, 0x02499061, 0x00c0bada, 0x01a46016, 0x02f1b2f2, 0x00c914d4, 0x02361e2d, 0x02966c2d, 0x00108e20}}}, + {X: Field{[10]uint32{0x02c577c3, 0x03e0ee9d, 0x01d6f256, 0x0176f782, 0x01b76d6a, 0x035fd8ba, 0x006b1497, 0x00a7652a, 0x01b2b311, 0x0010e10a}}, Y: Field{[10]uint32{0x00bc1c7d, 0x013e4c97, 0x006cd2e4, 0x0261f11b, 0x03b2398e, 0x03a0cef6, 0x03cb600b, 0x026f86cc, 0x0186a722, 0x00390d80}}}, + {X: Field{[10]uint32{0x02d02605, 0x019df1a5, 0x00f018c1, 0x02f9a8ea, 0x03c8bb59, 0x010c03a5, 0x007b524e, 0x01cb97eb, 0x025d66d4, 0x000fd8ec}}, Y: Field{[10]uint32{0x00ca39dd, 0x0257ced4, 0x0249d44c, 0x028bef7d, 0x01d9971a, 0x033fcb1a, 0x0119bbe5, 0x006734af, 0x0042158e, 0x0001161c}}}, + {X: Field{[10]uint32{0x038cc0c5, 0x00d716ae, 0x013d1e17, 0x03b5b3ef, 0x0047afe5, 0x0237b7bc, 0x004f90b9, 0x0294828e, 0x01f717c7, 0x0001987f}}, Y: Field{[10]uint32{0x01a80abd, 0x01c0a4df, 0x02549d99, 0x00cec765, 0x03b83b74, 0x014be083, 0x012f00ea, 0x00386496, 0x003ab43c, 0x002f6689}}}, + {X: Field{[10]uint32{0x02b951ce, 0x0317e256, 0x018cc279, 0x01f1d6f1, 0x000c999d, 0x03a8b532, 0x0027c367, 0x01abdf43, 0x0326daac, 0x002e706e}}, Y: Field{[10]uint32{0x03140f4e, 0x02e1fac6, 0x0138a767, 0x01eed632, 0x01b872d1, 0x03b575fc, 0x026c5b2e, 0x021aedf1, 0x0334a42b, 0x002934ef}}}, + {X: Field{[10]uint32{0x0127e8fa, 0x006fe82c, 0x010999b1, 0x03b2ead7, 0x017d9b23, 0x03bf4aee, 0x02af4733, 0x03676142, 0x00a0fc6c, 0x0033d6b1}}, Y: Field{[10]uint32{0x011070ec, 0x03c5817e, 0x002872ca, 0x01dff521, 0x01ad465d, 0x0298b2bd, 0x03a94fe3, 0x005c601f, 0x0316c37f, 0x00112498}}}, + {X: Field{[10]uint32{0x02b3b422, 0x02191c6f, 0x01b7413c, 0x0286cf0a, 0x03749caa, 0x03c28d3e, 0x0082c57f, 0x028cb8ee, 0x02afab8d, 0x002a94ac}}, Y: Field{[10]uint32{0x000859ce, 0x038fb303, 0x00244ac4, 0x02105b18, 0x03733260, 0x00c8094b, 0x028df35e, 0x0396546d, 0x03284a7b, 0x0012d589}}}, + {X: Field{[10]uint32{0x0068211c, 0x01fc60d2, 0x0217ad34, 0x0159e61c, 0x007926b0, 0x011a25af, 0x032909c5, 0x002342a7, 0x022eb3aa, 0x0001843c}}, Y: Field{[10]uint32{0x0019e6bb, 0x030d5492, 0x006eac1b, 0x01ef09dd, 0x012dbf63, 0x019bb68f, 0x01571e61, 0x0312cc06, 0x010df35f, 0x00294b86}}}, + {X: Field{[10]uint32{0x011a6d80, 0x00f30d31, 0x03b44acc, 0x01690997, 0x02db65f1, 0x025449e5, 0x00543307, 0x02963381, 0x00c3a485, 0x00004fc9}}, Y: Field{[10]uint32{0x03f3bc3b, 0x01261301, 0x02e611a4, 0x01b6c93e, 0x020f0797, 0x03e01cd9, 0x01c4327c, 0x01a7fcf3, 0x03b618e0, 0x003eb32f}}}, + {X: Field{[10]uint32{0x00eb0f24, 0x02176768, 0x02bdf922, 0x03ed0573, 0x01caeb18, 0x008b16a1, 0x00112e69, 0x026ca72c, 0x02a84927, 0x000573af}}, Y: Field{[10]uint32{0x0075d833, 0x03a27e38, 0x00d05821, 0x014a3430, 0x01c36de4, 0x029dec70, 0x01af7ed4, 0x03e6f54e, 0x00fe158f, 0x0008f973}}}, + {X: Field{[10]uint32{0x004d97f6, 0x03721c80, 0x029a55f2, 0x032025bc, 0x02cf92e0, 0x00093586, 0x001b1d60, 0x014d9f71, 0x018efb7d, 0x00098168}}, Y: Field{[10]uint32{0x0266d375, 0x012f5417, 0x022f4f94, 0x0132500b, 0x02fd6d67, 0x002b5bf4, 0x018ae518, 0x02dfb371, 0x0374f111, 0x00235a99}}}, + {X: Field{[10]uint32{0x027f9995, 0x002c172f, 0x0356c33d, 0x004cda52, 0x0225cd05, 0x00d6cd8a, 0x0236d6cd, 0x015bcdfe, 0x0272a787, 0x00396238}}, Y: Field{[10]uint32{0x0072fbb7, 0x015bff55, 0x0191766e, 0x0300341c, 0x02115425, 0x0348f94f, 0x00715c6a, 0x010a5a6e, 0x018320b8, 0x00056fae}}}, + {X: Field{[10]uint32{0x016b46a5, 0x021d436f, 0x00b6ccb9, 0x00e64d16, 0x023a02cc, 0x03de729f, 0x03205cb0, 0x03b716da, 0x0122f264, 0x002000c9}}, Y: Field{[10]uint32{0x011a44a8, 0x01c60ee1, 0x01043bca, 0x03a3530f, 0x02fd2c1d, 0x02aa5c97, 0x038b93b5, 0x007aea63, 0x02f4fb4e, 0x0011e724}}}, + {X: Field{[10]uint32{0x0241bfaa, 0x01a8be85, 0x013f3c16, 0x02dfe45b, 0x0394b525, 0x0084a1f9, 0x0101308a, 0x0206d5c1, 0x000ee1a5, 0x00254301}}, Y: Field{[10]uint32{0x0338ea71, 0x03bc76ed, 0x01a751e4, 0x022370e1, 0x0252441a, 0x01d808de, 0x0171725f, 0x01c29a7c, 0x020e911d, 0x00390f6c}}}, + {X: Field{[10]uint32{0x02c391fa, 0x015402a1, 0x018759db, 0x02f8a0b7, 0x01a634b9, 0x02e2f03d, 0x030aecad, 0x03b95cb9, 0x0336423f, 0x003a267f}}, Y: Field{[10]uint32{0x003a9bd1, 0x01231f2d, 0x02790a02, 0x02432c62, 0x01886117, 0x03e1ea44, 0x03100340, 0x02da3899, 0x03b0dfe6, 0x0001fb65}}}, + {X: Field{[10]uint32{0x00a1a51b, 0x00a972f6, 0x0045e833, 0x034a715e, 0x006a7415, 0x01b867ee, 0x00ce5c76, 0x01adea3e, 0x008f0c20, 0x00348d9a}}, Y: Field{[10]uint32{0x016ec9e9, 0x00170b19, 0x01113adb, 0x021d5486, 0x01d50988, 0x0060ed49, 0x02d65085, 0x012983f9, 0x019fe3d5, 0x001cbc8d}}}, + {X: Field{[10]uint32{0x019dcccf, 0x038be884, 0x0286ae94, 0x017f7709, 0x01430eab, 0x01718a3d, 0x02458c58, 0x00bc920f, 0x0071da4b, 0x00234f5f}}, Y: Field{[10]uint32{0x0361178f, 0x01e3d607, 0x00aad827, 0x000c7d65, 0x021f435c, 0x0191ffc7, 0x039c22ad, 0x03c832f5, 0x00e47948, 0x000cf102}}}, + {X: Field{[10]uint32{0x032651a9, 0x01ff66ed, 0x028a587d, 0x01431585, 0x03fee4b7, 0x034418fe, 0x02542ba5, 0x02066546, 0x037ae891, 0x000c83c4}}, Y: Field{[10]uint32{0x03c402c5, 0x016f3cf4, 0x02232679, 0x0262a317, 0x03086036, 0x014efc00, 0x0275a021, 0x0387bcc8, 0x006ae2a4, 0x002e1015}}}, + {X: Field{[10]uint32{0x0081352c, 0x015df186, 0x020de8ce, 0x01fe691b, 0x027546c8, 0x03519006, 0x01686072, 0x02c967d1, 0x03ce3fe6, 0x0027a2bf}}, Y: Field{[10]uint32{0x029d02f1, 0x01def530, 0x00f9273e, 0x03db14fb, 0x01af8639, 0x01c8d949, 0x00ebaf09, 0x01fdf098, 0x0301d83b, 0x00343a8d}}}, + {X: Field{[10]uint32{0x021eef64, 0x031cacf1, 0x03f539be, 0x03d26b4a, 0x03daf70f, 0x0090487b, 0x03c915ea, 0x00e61ca4, 0x01b81d35, 0x00177d19}}, Y: Field{[10]uint32{0x01e690af, 0x01069eb5, 0x03e54385, 0x01f3ccf0, 0x038b3804, 0x003d1820, 0x00c193d4, 0x03210416, 0x01ff5ae4, 0x000c81b1}}}, + {X: Field{[10]uint32{0x02f28f58, 0x01197523, 0x0064d6e1, 0x00e621a8, 0x011312bb, 0x009ae8f1, 0x0061d488, 0x00d42fd2, 0x0326a18c, 0x00266734}}, Y: Field{[10]uint32{0x00b1ef12, 0x02244772, 0x00b0dd41, 0x02c2fa21, 0x00a9fcea, 0x02554582, 0x018e6629, 0x0337d9e6, 0x032ad6dc, 0x000b362a}}}, + {X: Field{[10]uint32{0x03ce163b, 0x02c09ada, 0x034cdc0a, 0x019d1d86, 0x03479a66, 0x01551832, 0x02ba6f42, 0x02705be8, 0x00ee574d, 0x0020763f}}, Y: Field{[10]uint32{0x00673143, 0x02d2b166, 0x00ca638c, 0x03f3f5f2, 0x003cf771, 0x0169a605, 0x039a996f, 0x01e9a8ed, 0x0334f589, 0x0016539f}}}, + {X: Field{[10]uint32{0x0096d278, 0x01b610f4, 0x020dd4da, 0x027b254e, 0x0385839c, 0x01be1460, 0x032b42d5, 0x01cefbe4, 0x0324b9ac, 0x0027a0f5}}, Y: Field{[10]uint32{0x00c88869, 0x03e9788c, 0x01689a1a, 0x00029287, 0x0100d3a0, 0x03125bb1, 0x02fda95a, 0x016b2e27, 0x00abfed0, 0x003e2c63}}}, + {X: Field{[10]uint32{0x02320c3e, 0x0244510f, 0x0231764f, 0x00ecd6ea, 0x01908ec3, 0x00ecb640, 0x00b1f647, 0x00f022bb, 0x00b13b44, 0x00262e8e}}, Y: Field{[10]uint32{0x0399b84f, 0x0075808f, 0x020a44df, 0x01e8d0d2, 0x010d8ece, 0x01bd0bd2, 0x012f972e, 0x00cbefd7, 0x01d7fc22, 0x000d0fd8}}}, + {X: Field{[10]uint32{0x02a875ec, 0x00120194, 0x01285de7, 0x01ef9b0d, 0x01582244, 0x03a5c19c, 0x03a94886, 0x017bb169, 0x025a9adf, 0x000824ba}}, Y: Field{[10]uint32{0x024e7f35, 0x02b71efa, 0x0228f304, 0x03099650, 0x0195a7e9, 0x00985998, 0x00facc8e, 0x009c8aa5, 0x02eb5238, 0x00377edc}}}, + {X: Field{[10]uint32{0x02eeb75a, 0x00c13080, 0x01e765b9, 0x00e65687, 0x00c044c6, 0x02f25d04, 0x037bce4e, 0x02817ab1, 0x009a8f45, 0x003e7ba4}}, Y: Field{[10]uint32{0x0301705e, 0x03b93b84, 0x01d51a41, 0x034df8ba, 0x023a39c0, 0x02babc4f, 0x03e50fd2, 0x02c3a11c, 0x01ba93f5, 0x0021840c}}}, + {X: Field{[10]uint32{0x01df101c, 0x03394d4d, 0x00603c75, 0x009f18fa, 0x015c676e, 0x03baa6fe, 0x002dfc02, 0x0169f2cd, 0x00e23bc5, 0x00284e1e}}, Y: Field{[10]uint32{0x03108427, 0x03ffe09e, 0x02ed001b, 0x0214d71c, 0x02233f05, 0x034fa069, 0x02a2f833, 0x02c24424, 0x02d03d4b, 0x000d7033}}}, + {X: Field{[10]uint32{0x004ae3e4, 0x01ec6d84, 0x0065d34f, 0x03e0e9c6, 0x03b863a7, 0x02760300, 0x004cfce0, 0x037f61ca, 0x01d2cd32, 0x003a3b20}}, Y: Field{[10]uint32{0x0017648b, 0x009c89c1, 0x01e4ec6e, 0x03a2c219, 0x011d24c4, 0x0145eff2, 0x032b01af, 0x0375ffd4, 0x0377ee12, 0x00182fa6}}}, + {X: Field{[10]uint32{0x00f35b60, 0x00ae2607, 0x0297a664, 0x0261a6e6, 0x00d48e98, 0x013818e4, 0x030b18fe, 0x03710cd1, 0x02551529, 0x003c1f2c}}, Y: Field{[10]uint32{0x0223b550, 0x00a5e9b0, 0x03d2b0a3, 0x00856544, 0x01c6e854, 0x0388d56a, 0x034b9412, 0x018cf566, 0x03776d74, 0x002f51ba}}}, + {X: Field{[10]uint32{0x02af7f51, 0x022136ae, 0x03dd82fe, 0x00fcbcb2, 0x0242becd, 0x02982e0d, 0x03189ae0, 0x02a7c2a5, 0x0023dcfd, 0x000e6f39}}, Y: Field{[10]uint32{0x022c8e4d, 0x01e2ec7a, 0x01a2b2db, 0x03a0525e, 0x01f3430b, 0x00c0fb24, 0x00903127, 0x008679d1, 0x00aa4b71, 0x00305667}}}, + {X: Field{[10]uint32{0x029ad3cf, 0x03f44147, 0x00ec80e0, 0x019f3cb6, 0x0358142f, 0x00f2793f, 0x033de211, 0x02e05062, 0x01cbd51d, 0x001b6984}}, Y: Field{[10]uint32{0x001e4b7f, 0x01e3fcc1, 0x00d704d1, 0x01a0b867, 0x02f7fe55, 0x02c0d203, 0x03d494eb, 0x03d953f6, 0x00483250, 0x001af0bc}}}, + {X: Field{[10]uint32{0x031aed8a, 0x0327eee2, 0x00c709a3, 0x011de51c, 0x01f4e13a, 0x029fa571, 0x00a5e8ef, 0x003ae629, 0x00038d2e, 0x0033b6e7}}, Y: Field{[10]uint32{0x019a0d40, 0x01ab5361, 0x028feeca, 0x0297dfd7, 0x0046804f, 0x034213d0, 0x00d5d56e, 0x0362f208, 0x0131de42, 0x001e68bf}}}, + {X: Field{[10]uint32{0x01ae3d82, 0x01e841c1, 0x02d8a3a0, 0x02134037, 0x0225393f, 0x01b107f9, 0x0340458f, 0x001b40cb, 0x00986d11, 0x001f6255}}, Y: Field{[10]uint32{0x026d0d61, 0x03561a86, 0x01866ee7, 0x030ac842, 0x02edd110, 0x0382b783, 0x02a117c7, 0x01652d86, 0x02cfff1c, 0x001753ed}}}, + {X: Field{[10]uint32{0x03dc3df7, 0x000310f5, 0x01aa175a, 0x01431ba7, 0x00851aaf, 0x00fb3b18, 0x01e26069, 0x010ebfac, 0x01627370, 0x00293ca4}}, Y: Field{[10]uint32{0x039c4439, 0x009a0871, 0x00846b27, 0x01ef118a, 0x0392265d, 0x0116abb4, 0x03abb201, 0x012c54e3, 0x00e8fb76, 0x002fbaff}}}, + {X: Field{[10]uint32{0x011cab70, 0x0058bc3e, 0x000a29cb, 0x01959a03, 0x00e0ba81, 0x01a26ef3, 0x00ce964e, 0x032c23b0, 0x01acde4c, 0x002d8e27}}, Y: Field{[10]uint32{0x00303529, 0x00103294, 0x02cdd679, 0x029fbbf6, 0x039ee836, 0x0238c7f9, 0x032826d2, 0x0091d05e, 0x03dbd2d0, 0x00391031}}}, + {X: Field{[10]uint32{0x02fcc9e1, 0x022bbefd, 0x00b4927b, 0x005a6673, 0x01ae4ee0, 0x03bbcdfd, 0x00ac2d6a, 0x030dbe5e, 0x01acf752, 0x001cb39b}}, Y: Field{[10]uint32{0x039bbca6, 0x017c43b5, 0x03bc67c4, 0x03379e5a, 0x028ad38a, 0x0380409f, 0x00c6d4d5, 0x01100f58, 0x0297bbd8, 0x00339ab0}}}, + {X: Field{[10]uint32{0x00255f06, 0x004e119b, 0x0117531b, 0x02b43e2b, 0x014fb3e5, 0x01af1430, 0x00931faa, 0x01096958, 0x036fcfd7, 0x003beb4c}}, Y: Field{[10]uint32{0x015a82c0, 0x008ba3f8, 0x0203b2b4, 0x00251064, 0x039eab6b, 0x00605c58, 0x03ab5597, 0x026847b1, 0x00f4eeee, 0x000fede1}}}, + {X: Field{[10]uint32{0x034eaae3, 0x0177ac80, 0x0349c289, 0x01b3ce0a, 0x0322002c, 0x00e4f295, 0x034bd1f0, 0x008599f1, 0x022d04bb, 0x003e6352}}, Y: Field{[10]uint32{0x016fd148, 0x01b3116d, 0x0269e9a3, 0x022b59a7, 0x0297a26f, 0x01851f2e, 0x0350763c, 0x01e2a0d1, 0x031f7e37, 0x00261d78}}}, + {X: Field{[10]uint32{0x0134183f, 0x02251832, 0x02eafb0b, 0x0079961d, 0x012b0d16, 0x02b04fb4, 0x01eea342, 0x0108ccb1, 0x034d2bc2, 0x001da33d}}, Y: Field{[10]uint32{0x02fdc34e, 0x0003e9e8, 0x022654ba, 0x00cb9cb9, 0x00af083b, 0x0341a954, 0x02e9f72d, 0x0135ebe1, 0x0207e55b, 0x00108cdd}}}, + {X: Field{[10]uint32{0x01beff7b, 0x0049d369, 0x01c59979, 0x01b88949, 0x03d34cfb, 0x02a45b42, 0x01ec27aa, 0x03189645, 0x03b01d05, 0x002b09bc}}, Y: Field{[10]uint32{0x014f4045, 0x033b37fa, 0x0254a42f, 0x01dae2f7, 0x01a30055, 0x03afac66, 0x0113bcb1, 0x005a0746, 0x00ac89b6, 0x0038d9d8}}}, + {X: Field{[10]uint32{0x0374fbac, 0x0263cd07, 0x01285212, 0x00368234, 0x02fcd905, 0x02c10a8e, 0x025045e1, 0x002f8b99, 0x0181741a, 0x0036b750}}, Y: Field{[10]uint32{0x00a84f60, 0x01b80339, 0x0002b805, 0x02f2a40a, 0x03f6a4df, 0x018d5d39, 0x01e4e2c8, 0x03741098, 0x03e0da78, 0x001b3d1b}}}, + {X: Field{[10]uint32{0x0286a3e8, 0x0342ae46, 0x00f82a6f, 0x03aa46a2, 0x032c4e1e, 0x010fc6dc, 0x03139ed1, 0x01aa18be, 0x0198ce9e, 0x00395945}}, Y: Field{[10]uint32{0x01f1ac98, 0x03bf6cbc, 0x0221a9e9, 0x022b55a6, 0x000770fd, 0x03d357db, 0x01723d8f, 0x01b04042, 0x033669ab, 0x002ed084}}}, + {X: Field{[10]uint32{0x030f5b02, 0x03922b89, 0x03d65de9, 0x02dc3730, 0x032d47a2, 0x0007b8ea, 0x0369b454, 0x03d658e6, 0x011eb4f0, 0x003c9bde}}, Y: Field{[10]uint32{0x030ff699, 0x026f02d1, 0x004fbe1a, 0x02458cea, 0x002693c5, 0x02915d5f, 0x003c799e, 0x02efc946, 0x03251fe5, 0x0008b8d2}}}, + {X: Field{[10]uint32{0x023da9da, 0x0379a398, 0x018ac19f, 0x008a76de, 0x032d2bec, 0x02137628, 0x01da048a, 0x00bd21ea, 0x010b9561, 0x0029433c}}, Y: Field{[10]uint32{0x03dcc576, 0x020554c2, 0x02888e4c, 0x033730f7, 0x00ce345e, 0x03358166, 0x039f9f47, 0x02899076, 0x013c0a76, 0x0014041f}}}, + {X: Field{[10]uint32{0x0245c13c, 0x025fc6c2, 0x00c10a11, 0x02ad7b17, 0x03e917e5, 0x0205f2e6, 0x0386a5c1, 0x01b06f57, 0x03b90273, 0x0031d220}}, Y: Field{[10]uint32{0x008beedc, 0x03d2f44b, 0x0232e847, 0x01570ade, 0x01d1c2bd, 0x003a89d6, 0x013e73b6, 0x00f3fc35, 0x03bce739, 0x00380f10}}}, + {X: Field{[10]uint32{0x01e1c0a9, 0x03fa0002, 0x02e9c98d, 0x02937400, 0x01be7cad, 0x00a78b23, 0x005c00f6, 0x03b622ec, 0x03d01741, 0x00028d0d}}, Y: Field{[10]uint32{0x007bca1c, 0x0181c4e1, 0x01c9ed21, 0x019c2ed0, 0x00fc268e, 0x0134fbbe, 0x01a00afa, 0x032af47f, 0x005a257f, 0x002989f8}}}, + {X: Field{[10]uint32{0x01c8312d, 0x027fe8e6, 0x03093832, 0x01dc128f, 0x0090c00c, 0x00c1a1bf, 0x018ba895, 0x02ead37a, 0x0188f179, 0x0029b312}}, Y: Field{[10]uint32{0x0170b6df, 0x03fd1d67, 0x01643712, 0x03bd3d84, 0x01bbba86, 0x004d191c, 0x03cad7c1, 0x0169e4a6, 0x00737db2, 0x003d3ae9}}}, + {X: Field{[10]uint32{0x00b84dbe, 0x0286b29c, 0x02f2400d, 0x020c4e4d, 0x039e6801, 0x03286af8, 0x03330776, 0x02355ecc, 0x00a8f577, 0x0003becd}}, Y: Field{[10]uint32{0x03428d3f, 0x00a61e1f, 0x025952f0, 0x0328526c, 0x027e5845, 0x019d4dae, 0x00878e71, 0x03ea60c8, 0x016efc53, 0x002a5288}}}, + {X: Field{[10]uint32{0x00dfa07a, 0x017ef5bf, 0x01a94a2c, 0x02e0fe91, 0x03019ec3, 0x021fee6a, 0x03914ef4, 0x039aeec8, 0x02d81385, 0x0004e611}}, Y: Field{[10]uint32{0x00fce099, 0x0132f1ab, 0x02aa09c3, 0x02cba325, 0x0362d837, 0x0237f682, 0x01f6aff2, 0x004336a6, 0x004e599b, 0x0013edf3}}}, + {X: Field{[10]uint32{0x01f2a101, 0x02336aeb, 0x01bb7a53, 0x00284ca6, 0x0249c209, 0x02d4fa98, 0x01f6eeaa, 0x0159ea0f, 0x03af98ba, 0x00198248}}, Y: Field{[10]uint32{0x0094bd29, 0x003c3623, 0x0078d446, 0x021a5c55, 0x00ee2a56, 0x0118bd10, 0x01890ee8, 0x025c89a6, 0x00cab1a2, 0x002ca2d6}}}, + {X: Field{[10]uint32{0x012be3c6, 0x000e243d, 0x01a98d3e, 0x03430772, 0x02d2f86b, 0x00698d16, 0x0389d31f, 0x005f78fc, 0x02b58c75, 0x003c6024}}, Y: Field{[10]uint32{0x00f9c906, 0x02a6bf5a, 0x006d07e8, 0x018ca8db, 0x00440ca7, 0x00ec0c87, 0x00276973, 0x013b5df7, 0x02049148, 0x002a0f9e}}}, + {X: Field{[10]uint32{0x01d0ab75, 0x03844e20, 0x03f74bfe, 0x019d9233, 0x017b7004, 0x02d7eca5, 0x026a6e25, 0x01503ce2, 0x020d1b2c, 0x003a342a}}, Y: Field{[10]uint32{0x0314409a, 0x02ee2af4, 0x016e9f19, 0x032ffaa9, 0x021abfc0, 0x022a0260, 0x00c3f298, 0x01706f43, 0x03be5205, 0x0028c932}}}, + {X: Field{[10]uint32{0x03526c1a, 0x00b7f11b, 0x025f3c7d, 0x00b540c0, 0x021d8ee7, 0x007dd18f, 0x01613df5, 0x001d0c3e, 0x00c0230a, 0x000961a8}}, Y: Field{[10]uint32{0x0016c735, 0x000eb026, 0x02653ede, 0x02891d01, 0x03ce9b1d, 0x02143d70, 0x007b4694, 0x011c350f, 0x01a1eb2b, 0x0028a5cd}}}, + {X: Field{[10]uint32{0x037dffd8, 0x032ad099, 0x00e48a12, 0x015390b0, 0x018be682, 0x0375f23d, 0x01bb2d27, 0x01b51b0c, 0x02888d82, 0x00085f3e}}, Y: Field{[10]uint32{0x001ac4ce, 0x025adab0, 0x031a006d, 0x015fd204, 0x0134179c, 0x02be477b, 0x01f99017, 0x03ec540d, 0x00309ff0, 0x00135767}}}, + {X: Field{[10]uint32{0x02edf4c0, 0x00e8d4c6, 0x03ccb820, 0x02fc4035, 0x03943af3, 0x00df3f59, 0x02791eb0, 0x00ee3e79, 0x013471aa, 0x0013a996}}, Y: Field{[10]uint32{0x00b7b4c5, 0x004a6121, 0x02ca506c, 0x00d3222f, 0x03ded8a5, 0x03257a65, 0x00474035, 0x000b1160, 0x02c419a3, 0x003fbb66}}}, + {X: Field{[10]uint32{0x00c7a1ae, 0x02b09346, 0x01f7d4fa, 0x03cb2591, 0x007d7759, 0x0125fbaf, 0x0122150c, 0x01aa93a9, 0x028b5102, 0x0025d2e0}}, Y: Field{[10]uint32{0x03aa9d26, 0x0063fb53, 0x0109396d, 0x000ff2c1, 0x0165cd3a, 0x02a07c98, 0x026f344c, 0x01ccd895, 0x01a0c308, 0x00300da7}}}, + {X: Field{[10]uint32{0x00978186, 0x031c25a7, 0x01755529, 0x0113b475, 0x0299bb45, 0x033d16cd, 0x01c8ae93, 0x035e9653, 0x0379d572, 0x00366056}}, Y: Field{[10]uint32{0x035241fa, 0x038d62b9, 0x013ecd67, 0x036193b5, 0x035b6c20, 0x0023e99f, 0x00ea24f5, 0x006552b1, 0x02cbf518, 0x0027f3ae}}}, + {X: Field{[10]uint32{0x00368837, 0x00acc3ae, 0x02d38efd, 0x02f7e7da, 0x01478208, 0x03596ab0, 0x01506f1b, 0x03539f2f, 0x01970d9b, 0x00149c49}}, Y: Field{[10]uint32{0x033df18e, 0x008c98a2, 0x01d79aef, 0x03044b5b, 0x0068bbf0, 0x014da004, 0x00911d16, 0x03b2b668, 0x0196ba2c, 0x0014bb2a}}}, + {X: Field{[10]uint32{0x009abf6d, 0x01577a11, 0x018186af, 0x0278ae2b, 0x00ed2fc8, 0x022a3d3a, 0x030e1fee, 0x03d7e7bd, 0x01afd890, 0x0036508c}}, Y: Field{[10]uint32{0x019e2867, 0x01195248, 0x01e27e06, 0x03d23343, 0x0384278f, 0x00b61972, 0x03475fc3, 0x0248609c, 0x036ef078, 0x0009964a}}}, + {X: Field{[10]uint32{0x019a7d90, 0x00a2936a, 0x034bfe53, 0x02c1c534, 0x02b661f7, 0x01d8fae6, 0x03a99d4b, 0x036558ec, 0x02317a69, 0x00192144}}, Y: Field{[10]uint32{0x01d46bc6, 0x024828d4, 0x02fb4af4, 0x02cde048, 0x021e06d3, 0x028fa485, 0x02020885, 0x01038dbe, 0x02335150, 0x003ac82e}}}, + {X: Field{[10]uint32{0x0368a8c2, 0x00e0473b, 0x0021779c, 0x037c3b80, 0x0370df9e, 0x03018959, 0x03413a5f, 0x00bc5e63, 0x011bef66, 0x0034292c}}, Y: Field{[10]uint32{0x0170b9cd, 0x00a7dd37, 0x00dbe8b3, 0x018ffd35, 0x03748b7a, 0x02ace7ba, 0x00ef5c99, 0x01a5170e, 0x012018e1, 0x00352ee6}}}, + {X: Field{[10]uint32{0x005802b6, 0x001fc1a6, 0x0249b3dc, 0x00dcef54, 0x01dcf546, 0x032f5dac, 0x03e103dd, 0x0121a07e, 0x0086c4b2, 0x0007626e}}, Y: Field{[10]uint32{0x0369535d, 0x0024e7d8, 0x01f3030d, 0x01150af3, 0x02a7885a, 0x00e9c31a, 0x036056ba, 0x00415df8, 0x00caaacd, 0x0028ce73}}}, + {X: Field{[10]uint32{0x00dbb256, 0x01d72cb9, 0x036c010a, 0x008efac2, 0x039dbab2, 0x00e2e82d, 0x036682fa, 0x010f93c4, 0x01d59363, 0x002db3b3}}, Y: Field{[10]uint32{0x019f7be8, 0x0236c0cc, 0x01d583ba, 0x00ba090b, 0x025f77d1, 0x03604d99, 0x01a5d1fe, 0x021e896f, 0x005387dd, 0x000a4d70}}}, + {X: Field{[10]uint32{0x032f8e24, 0x02ba942f, 0x002c4028, 0x0244261a, 0x0040f1b4, 0x03d6065a, 0x00a6c5fb, 0x03611cd7, 0x00e0a0ca, 0x00212c91}}, Y: Field{[10]uint32{0x021f7a71, 0x0226b221, 0x021bad82, 0x018b6837, 0x03148c8e, 0x038e9762, 0x0313087e, 0x002c47d5, 0x028c7df8, 0x0018b8a3}}}, + {X: Field{[10]uint32{0x00114d1a, 0x037db073, 0x036d1638, 0x01650ffa, 0x01664331, 0x038ddf10, 0x00366102, 0x0200a0e5, 0x00ff2a90, 0x003e57b3}}, Y: Field{[10]uint32{0x0158eba2, 0x00e34af9, 0x039ca7de, 0x020586d3, 0x0256d16e, 0x022615bb, 0x011b9ea1, 0x001b36e3, 0x003f1a03, 0x002f436a}}}, + {X: Field{[10]uint32{0x010f55e3, 0x03bcc874, 0x0132727f, 0x00d79043, 0x032a1e63, 0x0268b748, 0x02ccd255, 0x00f792bc, 0x01fd3e61, 0x001f133b}}, Y: Field{[10]uint32{0x03d7b1d8, 0x030893b9, 0x026960cd, 0x01f504c1, 0x0111d482, 0x01ca9983, 0x017f73c6, 0x0014db1a, 0x0109d9d0, 0x000cc7c8}}}, + {X: Field{[10]uint32{0x00269713, 0x03dc80e8, 0x021c34b9, 0x019bb4c6, 0x02f88af8, 0x010d789d, 0x03918de0, 0x0360a792, 0x02381bf2, 0x0008d70b}}, Y: Field{[10]uint32{0x00dbf929, 0x00413be8, 0x03d0ff26, 0x00111803, 0x02815a13, 0x013aaa1e, 0x00486144, 0x0024bb9f, 0x030d2671, 0x00143737}}}, + {X: Field{[10]uint32{0x0207cd73, 0x00a1a0fa, 0x02923761, 0x021b1777, 0x000cdf26, 0x007128e2, 0x03ca488d, 0x0025d545, 0x00d09ab5, 0x000aa587}}, Y: Field{[10]uint32{0x0398abe5, 0x024efa48, 0x0152dd7f, 0x00bbb75d, 0x0384f84c, 0x01d951c8, 0x000f7fde, 0x011b48f3, 0x0076b2ee, 0x00217244}}}, + {X: Field{[10]uint32{0x00fd65e3, 0x023d0393, 0x01b51a62, 0x01d424f4, 0x03e00c47, 0x02fc60fd, 0x013f591c, 0x02e32e1c, 0x0091f0af, 0x002562f1}}, Y: Field{[10]uint32{0x009a65b3, 0x01431a82, 0x02eef92d, 0x01eaba3d, 0x01b2a09a, 0x03c1d868, 0x013e026a, 0x037f9244, 0x0339fa21, 0x002fd6f8}}}, + {X: Field{[10]uint32{0x015f78fd, 0x0196f60f, 0x0273ddc8, 0x03319093, 0x030adb5c, 0x01adfa54, 0x035a2e24, 0x01eafe67, 0x00a37b5b, 0x001ba583}}, Y: Field{[10]uint32{0x025e0e15, 0x0166cd5a, 0x01a81bd6, 0x02ca7335, 0x00dcc4b0, 0x0285bf32, 0x02df612e, 0x0190fd7c, 0x03d1d5e9, 0x0014eb52}}}, + {X: Field{[10]uint32{0x00d05871, 0x03b3a3fc, 0x01b5a8b2, 0x029e9237, 0x00e747e4, 0x036475aa, 0x01615257, 0x02eeb776, 0x020e9272, 0x0035eb24}}, Y: Field{[10]uint32{0x00c87ed8, 0x019b893c, 0x02dc4adf, 0x008186d9, 0x039d4c76, 0x00302630, 0x000b96d0, 0x02b178e3, 0x01fcc37b, 0x0018e06e}}}, + {X: Field{[10]uint32{0x01730609, 0x00754c57, 0x00078b6c, 0x00bfcb67, 0x024481c1, 0x02fa506b, 0x0123844e, 0x015c1bb0, 0x003b1de9, 0x00026c20}}, Y: Field{[10]uint32{0x033fb1b0, 0x00258a9a, 0x03ef2f5f, 0x02ec4f30, 0x005a5ff0, 0x0392e007, 0x002ed01f, 0x03f7f3ab, 0x03d6b12a, 0x0005833c}}}, + {X: Field{[10]uint32{0x00c5fd88, 0x0154ef29, 0x033ea689, 0x0027c08b, 0x02991bd5, 0x02e81085, 0x00e0153a, 0x03801a77, 0x006e5b74, 0x0017541d}}, Y: Field{[10]uint32{0x03259ff8, 0x018462da, 0x00e58927, 0x01bedbb4, 0x0299cb33, 0x00a724ad, 0x03a2e484, 0x012c6ef6, 0x005fd2a1, 0x002c3ec8}}}, + {X: Field{[10]uint32{0x00be04ff, 0x0006a17f, 0x02cf0bbd, 0x02af1a1b, 0x01ef4483, 0x0180230b, 0x03087483, 0x018a7249, 0x0269fa27, 0x00386f09}}, Y: Field{[10]uint32{0x00d95ecf, 0x0027e103, 0x00e783d4, 0x0124efb6, 0x0315e8b1, 0x02ce86ca, 0x033fd435, 0x00248585, 0x0371083c, 0x001bedeb}}}, + {X: Field{[10]uint32{0x00bfbf78, 0x003732f6, 0x017a2fe9, 0x00833dc0, 0x02f36ac6, 0x037e873c, 0x00519797, 0x024f6d03, 0x001cb5a8, 0x0033f242}}, Y: Field{[10]uint32{0x02a69ac2, 0x00a6b9a5, 0x01659b5f, 0x00695713, 0x00db321d, 0x026fe05f, 0x0377c15a, 0x00bf0cbc, 0x01235077, 0x0009aa23}}}, + {X: Field{[10]uint32{0x0229bb9b, 0x03677d08, 0x014b05fa, 0x01621163, 0x00cd8ad1, 0x0263b5e3, 0x021246db, 0x01a314e5, 0x009d12bd, 0x00015367}}, Y: Field{[10]uint32{0x021cbff6, 0x01275db7, 0x025eba45, 0x00161248, 0x00f8de70, 0x034cf5f5, 0x00c961fe, 0x0089658c, 0x00311dec, 0x002d7a5f}}}, + {X: Field{[10]uint32{0x03057dff, 0x02d694d0, 0x002e8d64, 0x02a987f9, 0x02bfb11e, 0x01cd71ec, 0x00f19248, 0x01986740, 0x02e67e9d, 0x0022a453}}, Y: Field{[10]uint32{0x03c040c8, 0x0046b0c6, 0x01b05a63, 0x011a8bd6, 0x0199c518, 0x00a9be94, 0x002f018c, 0x0369262f, 0x01da3374, 0x0006e478}}}, + {X: Field{[10]uint32{0x00240522, 0x02c16574, 0x03b030a0, 0x010bef48, 0x00aa2f4c, 0x026ac2ae, 0x0304fbae, 0x0077eaf1, 0x01773e64, 0x00352e04}}, Y: Field{[10]uint32{0x025cc726, 0x03ef8159, 0x007b8ce6, 0x00d405c4, 0x01cf2e68, 0x003d037c, 0x01bd3642, 0x02853d29, 0x023b1ea4, 0x002b0c33}}}, + {X: Field{[10]uint32{0x00780ba9, 0x00999c05, 0x02004362, 0x00b9cb83, 0x006f3c8e, 0x024927d9, 0x002c3517, 0x00d5f2ee, 0x0387c232, 0x002e0429}}, Y: Field{[10]uint32{0x018319e2, 0x036eec05, 0x02ef76a2, 0x00c3c6de, 0x034a422c, 0x02af2119, 0x02bac769, 0x0375fc85, 0x00341078, 0x00150d90}}}, + {X: Field{[10]uint32{0x0134a833, 0x01cb4ffd, 0x00e0d14e, 0x00b63b1f, 0x00d29c76, 0x00e9fbb4, 0x01691eac, 0x023bdc6b, 0x00cedc73, 0x0035c7e2}}, Y: Field{[10]uint32{0x00fbcd99, 0x0139c583, 0x02ad9d2a, 0x0052570e, 0x0197c1b5, 0x02d31449, 0x019d0d97, 0x02b6ba8b, 0x02831aaa, 0x00291f33}}}, + {X: Field{[10]uint32{0x01147ffc, 0x02675c5b, 0x0217496c, 0x00b331b1, 0x011ad709, 0x018b3978, 0x01d9d896, 0x018a384e, 0x031d4cac, 0x0005c33c}}, Y: Field{[10]uint32{0x006d77a5, 0x02977b33, 0x013a46f9, 0x03b9a549, 0x01adf6c4, 0x0377cc46, 0x01e8baaa, 0x03d61405, 0x0094e741, 0x0013ecee}}}, + {X: Field{[10]uint32{0x00c316af, 0x0269913b, 0x034d3172, 0x01250216, 0x03bfd48d, 0x032e6956, 0x00cbf66e, 0x017a00e3, 0x02a3b127, 0x00239da4}}, Y: Field{[10]uint32{0x00c504b1, 0x02ad501a, 0x0241134c, 0x029ae291, 0x024fc0bf, 0x0399aa46, 0x0100665c, 0x01497899, 0x01d3af07, 0x003cce70}}}, + {X: Field{[10]uint32{0x02ca891a, 0x032fbe92, 0x00d40a27, 0x01a79da1, 0x02a07ca8, 0x038addf3, 0x0047002e, 0x017a04cb, 0x03383dda, 0x001747fc}}, Y: Field{[10]uint32{0x035fbb8b, 0x0246006f, 0x039cf5b0, 0x00ce34a5, 0x02fe8438, 0x01d31145, 0x032e62e0, 0x032f6d9d, 0x03acb0de, 0x00286b6c}}}, + {X: Field{[10]uint32{0x002b8af7, 0x03fdbb0f, 0x003ebd75, 0x01717d50, 0x00375e1c, 0x00deb556, 0x032605da, 0x0319af77, 0x03dda9de, 0x003559b3}}, Y: Field{[10]uint32{0x019c78bd, 0x02b78398, 0x01ed8427, 0x035efedd, 0x00b6007b, 0x016a4293, 0x01598bb2, 0x01b6a5d0, 0x032c7858, 0x0004f888}}}, + {X: Field{[10]uint32{0x03d96493, 0x0265f40b, 0x01e33764, 0x03389271, 0x033cb85b, 0x02e7b8f6, 0x01ae74b2, 0x00ebc666, 0x00f9cc71, 0x0032f5c2}}, Y: Field{[10]uint32{0x004cb2cb, 0x03e499da, 0x026d655c, 0x02fdae01, 0x01c264f4, 0x02276376, 0x037a5af8, 0x02c2e24c, 0x016c4ca9, 0x003c0687}}}, + {X: Field{[10]uint32{0x00ed0fe2, 0x02d6e8fc, 0x013f4ad4, 0x02e3e241, 0x03e8d049, 0x014e003c, 0x020bea21, 0x01cf2208, 0x00e4e8ac, 0x003fb87b}}, Y: Field{[10]uint32{0x0226aad6, 0x015a8bba, 0x0154f53d, 0x02c2f6c2, 0x02f9763d, 0x033d0bda, 0x013354a7, 0x0019028d, 0x00ea17c8, 0x0026d482}}}, + {X: Field{[10]uint32{0x02ee843f, 0x0122f251, 0x01dbb79c, 0x00cc5305, 0x01db916f, 0x032cd6a3, 0x03a6c3af, 0x01214e35, 0x0266de44, 0x0031aabe}}, Y: Field{[10]uint32{0x01505b1b, 0x02bceff4, 0x01bfa7cd, 0x016cc2c4, 0x0234c49d, 0x029b893e, 0x001a7617, 0x0243def2, 0x02b67fc5, 0x00229871}}}, + {X: Field{[10]uint32{0x01aac415, 0x0199e076, 0x02f1e0a8, 0x03ffc017, 0x02dcbe21, 0x0199aef3, 0x018551e7, 0x007df922, 0x016083d9, 0x002b0d45}}, Y: Field{[10]uint32{0x0334483d, 0x01f59804, 0x014945ac, 0x002e369b, 0x03557741, 0x03bb2289, 0x00318fbe, 0x026beca3, 0x01977710, 0x0035c276}}}, + {X: Field{[10]uint32{0x01914e18, 0x01a3dc8f, 0x02ef9219, 0x00d25419, 0x017a212e, 0x00eb013d, 0x0055d199, 0x0092d205, 0x021607c0, 0x002a2709}}, Y: Field{[10]uint32{0x03a3c1ab, 0x00867b84, 0x02199ac8, 0x01a10cf7, 0x013569ce, 0x03b636ac, 0x01f092f5, 0x0219b1df, 0x02626127, 0x0015474d}}}, + {X: Field{[10]uint32{0x00a3f06b, 0x02202347, 0x02a3a72e, 0x016bf491, 0x02b045b9, 0x03ee458b, 0x00018d8c, 0x0267aba5, 0x031db584, 0x00265460}}, Y: Field{[10]uint32{0x01e4d773, 0x021ec5b6, 0x01188fd4, 0x02856c34, 0x0081696e, 0x02ce1202, 0x0027146f, 0x03e19f56, 0x02ecb9d5, 0x003f8e6b}}}, + {X: Field{[10]uint32{0x001fba96, 0x009a489a, 0x02e8c78d, 0x03a4df34, 0x028615e2, 0x007b3af1, 0x01be26c6, 0x01111e55, 0x03e01456, 0x002dc785}}, Y: Field{[10]uint32{0x03b9e3bf, 0x007142d8, 0x03dc4301, 0x02a7324a, 0x031a6c5b, 0x03bfa554, 0x023cb224, 0x02e32e57, 0x01f1d21f, 0x003af3f7}}}, + {X: Field{[10]uint32{0x01914074, 0x020fff05, 0x002c22d6, 0x03b5399d, 0x032fe89f, 0x030f52f2, 0x020ef6a1, 0x027fdb51, 0x001edbdd, 0x00385c3e}}, Y: Field{[10]uint32{0x0396e67f, 0x019f9caa, 0x014d2d6f, 0x03af1f7c, 0x03801fa7, 0x03dbe72b, 0x02206e3d, 0x0072b233, 0x00ee0f97, 0x0024fc44}}}, + {X: Field{[10]uint32{0x02c104f2, 0x01757207, 0x00c73acf, 0x02291f73, 0x014ac8dd, 0x007eaeec, 0x00f04eda, 0x0017157b, 0x0147318d, 0x0010c695}}, Y: Field{[10]uint32{0x03a779e7, 0x0022fcaf, 0x00dea6fd, 0x01c1d72a, 0x027a6f1f, 0x01f2a09e, 0x03a1f045, 0x0068d92b, 0x00ad7b14, 0x000f8c62}}}, + {X: Field{[10]uint32{0x02203394, 0x03ffb098, 0x01eec383, 0x0245fc2d, 0x013c1932, 0x007e032c, 0x0226ce4a, 0x01d48caf, 0x026ee158, 0x000a679a}}, Y: Field{[10]uint32{0x01301575, 0x00a9df81, 0x010c93bb, 0x0393b4de, 0x0123c9b3, 0x03002815, 0x008e8bf4, 0x028846ff, 0x00ed3ad4, 0x00176edc}}}, + {X: Field{[10]uint32{0x038934ee, 0x01e32730, 0x0359fb09, 0x026fa80a, 0x01bc99ac, 0x0079fe09, 0x03b5f786, 0x0221a6cb, 0x008ff2b5, 0x0019b6d2}}, Y: Field{[10]uint32{0x00ae6a5f, 0x01adcc3a, 0x0017fc31, 0x03bfac52, 0x006040e7, 0x03da19b1, 0x010e9972, 0x020fe02c, 0x0112b51c, 0x002addb8}}}, + {X: Field{[10]uint32{0x02274932, 0x02091f49, 0x002a1c3c, 0x02d7fb50, 0x0054c812, 0x022b56dc, 0x03912fa7, 0x00354aec, 0x016b6698, 0x00049661}}, Y: Field{[10]uint32{0x02150383, 0x011631fc, 0x03c2245d, 0x02ee1c31, 0x02d70dfc, 0x015a06f0, 0x03e0557d, 0x02571fb7, 0x013fc678, 0x003ab5f3}}}, + {X: Field{[10]uint32{0x01f1cf00, 0x01d177ff, 0x02cf9102, 0x0233bfaf, 0x00426996, 0x03494b1f, 0x025272fd, 0x03cf732a, 0x0214cbb0, 0x00140b21}}, Y: Field{[10]uint32{0x03c53c3c, 0x0242654e, 0x0154c10b, 0x0001921c, 0x001b2f45, 0x01abc28e, 0x01d06951, 0x038d5bf6, 0x028807e4, 0x001c46f1}}}, + {X: Field{[10]uint32{0x02a8d6fd, 0x026f31c2, 0x00c42224, 0x03b05f00, 0x01f43acd, 0x01edadff, 0x01c10734, 0x01900fda, 0x013c323c, 0x00381446}}, Y: Field{[10]uint32{0x02560455, 0x0045f8e2, 0x039f1c85, 0x02c61fe2, 0x00c574d9, 0x0097098c, 0x011d2bcf, 0x023b985b, 0x0271ce42, 0x000840b0}}}, + {X: Field{[10]uint32{0x01f1dc46, 0x0381d06b, 0x02cb800a, 0x0162d4e2, 0x030abe7c, 0x030ecdf9, 0x03d90c15, 0x0234c8a7, 0x03ae0d76, 0x0032461e}}, Y: Field{[10]uint32{0x01c92c0f, 0x011ccd62, 0x000f8d75, 0x0373c9ff, 0x015714f6, 0x0056b0a7, 0x03d02526, 0x02e92865, 0x0043f9eb, 0x00304c35}}}, + {X: Field{[10]uint32{0x010fe897, 0x03b2367a, 0x017a16ea, 0x03513a0a, 0x0123dba4, 0x031ac190, 0x003ae701, 0x02cfb8ac, 0x027eb9f3, 0x0016c215}}, Y: Field{[10]uint32{0x010c27c9, 0x006a61ea, 0x02d92aa8, 0x012dd43f, 0x03914d4b, 0x03a3d32e, 0x02e9c726, 0x03246b37, 0x00159079, 0x002b41c7}}}, + {X: Field{[10]uint32{0x003ba7cc, 0x03d2946d, 0x0286f839, 0x015343aa, 0x038a9cc5, 0x0189a46a, 0x0306a26d, 0x01ea1b3e, 0x008ac581, 0x002b96d9}}, Y: Field{[10]uint32{0x032db311, 0x03a49750, 0x019830d5, 0x004a9bfa, 0x0166e752, 0x0285f18a, 0x00a48c3d, 0x0308aaac, 0x030db665, 0x0007aa2a}}}, + {X: Field{[10]uint32{0x010178d2, 0x00085222, 0x038f0421, 0x034c9f95, 0x0004f2e0, 0x03326aed, 0x02ea5c5c, 0x0215b663, 0x00d0a092, 0x000ee6eb}}, Y: Field{[10]uint32{0x01bd5052, 0x031977c8, 0x024911fd, 0x011fc606, 0x00b79be4, 0x02a4a6b8, 0x03628d7e, 0x02e8715e, 0x008e9603, 0x002da07a}}}, + {X: Field{[10]uint32{0x0259fef4, 0x0016a191, 0x02d7ee8d, 0x01e8707d, 0x03f6dfbf, 0x0179056a, 0x022f8279, 0x019b6b54, 0x0180a740, 0x0014937d}}, Y: Field{[10]uint32{0x0252f35f, 0x02ae9c89, 0x039c1ed2, 0x03e78d62, 0x019c72c5, 0x034c0bbc, 0x03c210ca, 0x0307869b, 0x03285f3b, 0x000feb31}}}, + {X: Field{[10]uint32{0x010e4363, 0x034c2751, 0x00cdff6e, 0x03a9ff1c, 0x01599a34, 0x01202e1d, 0x0109a383, 0x01d7121f, 0x03f2ade7, 0x000b818d}}, Y: Field{[10]uint32{0x0364738e, 0x0228283d, 0x023696da, 0x03bab69c, 0x031aafb7, 0x012b557c, 0x038e903e, 0x01392731, 0x03087e2f, 0x0038f1ba}}}, + {X: Field{[10]uint32{0x020cc483, 0x0184c2ea, 0x0364bbda, 0x00a089bd, 0x033f7857, 0x021ee509, 0x013fb335, 0x02f4ef90, 0x02adbeaf, 0x003dffb1}}, Y: Field{[10]uint32{0x0208c68d, 0x014c7467, 0x00544c66, 0x00eb967f, 0x03dd4209, 0x018ee5da, 0x00fefd8e, 0x015f1ff2, 0x01748eb4, 0x003d91aa}}}, + {X: Field{[10]uint32{0x023608be, 0x0362f122, 0x0229929a, 0x025d3609, 0x00cd6eb4, 0x03624b72, 0x02c95b12, 0x01310cad, 0x00e06af6, 0x001d7e53}}, Y: Field{[10]uint32{0x01958a29, 0x0221deec, 0x026c622e, 0x0248b1ef, 0x026e32c8, 0x007b001d, 0x0316b322, 0x0241a9a4, 0x02d0a2b7, 0x002fe1c5}}}, + {X: Field{[10]uint32{0x03fb4d85, 0x0370733c, 0x0104331b, 0x03a74c04, 0x00f62e07, 0x0321a424, 0x00f039fc, 0x03cf2c31, 0x02de5e0d, 0x001040a5}}, Y: Field{[10]uint32{0x03fecfa0, 0x03dcbb4f, 0x0396c383, 0x01ff2187, 0x02da7426, 0x018996e0, 0x00a82ff8, 0x03765aae, 0x039ca314, 0x003a58d5}}}, + {X: Field{[10]uint32{0x033ffa05, 0x03ff8035, 0x03b23cbd, 0x02605b3e, 0x0369b4e6, 0x025f699e, 0x03c1703d, 0x0385acbd, 0x02ac05f5, 0x00332093}}, Y: Field{[10]uint32{0x013e8abb, 0x03c428cd, 0x02aa8b8c, 0x006a4abe, 0x03d18c6f, 0x01f1e203, 0x00582182, 0x013be577, 0x01a69f41, 0x0005f0c3}}}, + {X: Field{[10]uint32{0x026e5820, 0x03fc44df, 0x00d03a83, 0x0193e976, 0x03d2074b, 0x00c5dc1d, 0x00f0b3fd, 0x03b6335e, 0x00ef4d26, 0x002b306c}}, Y: Field{[10]uint32{0x003ce6c3, 0x01432367, 0x04000111, 0x03405a79, 0x014fcd24, 0x03e3efbb, 0x01d2a804, 0x02ba4406, 0x00c68519, 0x001b3391}}}, + {X: Field{[10]uint32{0x010da922, 0x03f1c6f2, 0x038257c2, 0x0238c61d, 0x01583c2b, 0x00c62e48, 0x034bccf4, 0x00766c1d, 0x036eccce, 0x00072cc1}}, Y: Field{[10]uint32{0x00e373cc, 0x021d2393, 0x03b04c62, 0x03cb3c96, 0x02a6372d, 0x03b37168, 0x0217dfd3, 0x0181760a, 0x036c0058, 0x000a8bc9}}}, + {X: Field{[10]uint32{0x00fe13f2, 0x02096aa1, 0x039783d5, 0x0085e8e2, 0x008cb3a5, 0x02796900, 0x03ea9750, 0x03d26d61, 0x00512a22, 0x001bbf69}}, Y: Field{[10]uint32{0x038e2424, 0x0251d621, 0x0103954a, 0x03f6f2f5, 0x0360673c, 0x03968a96, 0x032a54ad, 0x00becc7f, 0x02d56dfe, 0x00047513}}}, + {X: Field{[10]uint32{0x01bf0858, 0x00c30ee7, 0x01cdd51b, 0x03345f7a, 0x02e2fcf1, 0x02a3f665, 0x00931ecd, 0x00de2d73, 0x0219aef4, 0x0011fda5}}, Y: Field{[10]uint32{0x00b5e274, 0x0242251f, 0x03ee9bf8, 0x022b0cea, 0x020d2fa2, 0x0135c359, 0x0057af2a, 0x038f5b69, 0x02a19776, 0x00052555}}}, + {X: Field{[10]uint32{0x014d28e4, 0x0120cd5e, 0x00d4f8ff, 0x02f0691f, 0x028b2eae, 0x00e86789, 0x01032c51, 0x0375754e, 0x021e97f5, 0x00374f63}}, Y: Field{[10]uint32{0x00467e83, 0x03e7aa93, 0x029c2e0f, 0x02ec0d2f, 0x030c2233, 0x020bafcc, 0x033d7c63, 0x02a0eaa5, 0x000020f6, 0x001e5a2f}}}, + {X: Field{[10]uint32{0x01e16d78, 0x02b4ad99, 0x01f9197a, 0x02dd414d, 0x027de2a2, 0x00f2d2cc, 0x015737cd, 0x00e9b2f9, 0x00eea19d, 0x000af515}}, Y: Field{[10]uint32{0x029f7f99, 0x03c7f5c4, 0x037549c1, 0x01221f8f, 0x039f7c62, 0x02b503fa, 0x0271c667, 0x009e3cd0, 0x00f0d6a1, 0x00029c2c}}}, + {X: Field{[10]uint32{0x035a5ee0, 0x00cc6103, 0x02d91047, 0x037c4eb0, 0x02915462, 0x02899e13, 0x02035b29, 0x01d2d136, 0x01bb2a7e, 0x00233f9d}}, Y: Field{[10]uint32{0x0207cd1e, 0x03cb8919, 0x01ca1eef, 0x0289ff6b, 0x00b65c2d, 0x02491550, 0x02226d1c, 0x01f2193d, 0x0056bdc8, 0x001923ff}}}, + {X: Field{[10]uint32{0x01724d36, 0x02cc9559, 0x02f6e665, 0x01a13c44, 0x005e046a, 0x012d5ef2, 0x03dab832, 0x018b2f0b, 0x00ae19c4, 0x0017bfcd}}, Y: Field{[10]uint32{0x004d68a4, 0x03378568, 0x026b0ccf, 0x020d1f1a, 0x01d551e7, 0x00b80414, 0x0289629d, 0x011fff08, 0x01bb9db3, 0x000663ed}}}, + {X: Field{[10]uint32{0x00f92b91, 0x0198e7de, 0x02a61042, 0x02e07c62, 0x00a2c51b, 0x01d8c5dd, 0x02db6244, 0x00ec238d, 0x0154f367, 0x0026a951}}, Y: Field{[10]uint32{0x01384806, 0x0235e118, 0x006fa75c, 0x01197c97, 0x011d167b, 0x01cad42f, 0x0222faf2, 0x01d0134b, 0x03ad4a6e, 0x0021d128}}}, + {X: Field{[10]uint32{0x03f259e0, 0x032d4e97, 0x0165a955, 0x02a2e75d, 0x03ac88a2, 0x037c1bae, 0x007463c5, 0x0165c37f, 0x01758cfb, 0x0012e0dd}}, Y: Field{[10]uint32{0x028df208, 0x0069793e, 0x02aa9917, 0x01aaadea, 0x02ed7076, 0x0048cf7d, 0x0074396a, 0x0294fdb9, 0x0142bda1, 0x0021d647}}}, + {X: Field{[10]uint32{0x02428bb1, 0x03317bdd, 0x00428226, 0x009615cd, 0x03c49dc7, 0x01671f3b, 0x03f5a579, 0x03e4399c, 0x00b49134, 0x001752dd}}, Y: Field{[10]uint32{0x02d89425, 0x001e83ef, 0x03cfcb1f, 0x02efc670, 0x00cdc2f6, 0x00036368, 0x026bf3f1, 0x03b856af, 0x0110f466, 0x0006caa2}}}, + {X: Field{[10]uint32{0x03cad2d8, 0x00a8c255, 0x002b2570, 0x0105eae7, 0x002d4754, 0x018bb9a0, 0x013bafaf, 0x01133976, 0x02c0c552, 0x003542f8}}, Y: Field{[10]uint32{0x0162f583, 0x00735700, 0x0144ef24, 0x03c82f11, 0x005a4dc0, 0x03aa9779, 0x01854617, 0x026ad300, 0x024c6ee8, 0x003f881f}}}, + {X: Field{[10]uint32{0x0075bff1, 0x0280d384, 0x032e9a1d, 0x03c505b6, 0x02f93bbf, 0x02fe616a, 0x02489155, 0x02ce1193, 0x01ce8e0e, 0x002ec3d8}}, Y: Field{[10]uint32{0x037b7d0e, 0x03dbefed, 0x00412631, 0x0184c51d, 0x034e6b05, 0x02f2c23b, 0x02a1032c, 0x02c37cc3, 0x03152dde, 0x000004e9}}}, + {X: Field{[10]uint32{0x01dcb2f5, 0x00cafe13, 0x03d22886, 0x02785366, 0x0263e22b, 0x00bf17be, 0x00e41fb2, 0x0006c85c, 0x01db473f, 0x000f39af}}, Y: Field{[10]uint32{0x00e0922e, 0x01e896ab, 0x01edf8d4, 0x023c6eb0, 0x029a8426, 0x0043714b, 0x02b73081, 0x034a6109, 0x0057f4b3, 0x0010c218}}}, + {X: Field{[10]uint32{0x038f81aa, 0x01d182ec, 0x03c85bd3, 0x03c695b0, 0x02bbcbbf, 0x01f36dd7, 0x00b5490c, 0x0202ff24, 0x014aef16, 0x003ff7ec}}, Y: Field{[10]uint32{0x02f4af0d, 0x005bb87a, 0x00a547c2, 0x031ceef3, 0x0124f228, 0x02522d69, 0x02880d0e, 0x03c6788c, 0x01ef02f1, 0x003cc117}}}, + {X: Field{[10]uint32{0x0223172c, 0x03e93020, 0x000fed59, 0x000941eb, 0x02c828d1, 0x008cc2bb, 0x026eb60a, 0x00993604, 0x02e19ab4, 0x0006b07c}}, Y: Field{[10]uint32{0x00e18bf8, 0x03c64db6, 0x027f5133, 0x018e06d3, 0x02d8fae0, 0x020363c0, 0x015e3a8f, 0x021abec8, 0x00bc3394, 0x001d8da9}}}, + {X: Field{[10]uint32{0x01ec228e, 0x01987b2b, 0x009a22d6, 0x02d81f9b, 0x01b1a1a6, 0x0083c8ce, 0x002957aa, 0x03a26985, 0x000a0740, 0x001494d3}}, Y: Field{[10]uint32{0x0261b669, 0x02a5f3cc, 0x022f1365, 0x00d6ba00, 0x02e1a318, 0x02213ebe, 0x02c2fa5d, 0x03226707, 0x02bafe41, 0x0033dbf9}}}, + {X: Field{[10]uint32{0x011b09eb, 0x03d91899, 0x0278d5b9, 0x00b25928, 0x0104f36f, 0x00df4cac, 0x00dccd61, 0x00b0b1e3, 0x02857cd2, 0x00102480}}, Y: Field{[10]uint32{0x01031d0d, 0x0384b10b, 0x025fb3bd, 0x023ae2a1, 0x01f6b773, 0x013c5824, 0x01fef1bf, 0x00f8fd9b, 0x0373a5fa, 0x00103253}}}, + {X: Field{[10]uint32{0x03029289, 0x006f1466, 0x019e70c8, 0x030901a7, 0x0225a5b3, 0x021036c5, 0x02ac6e4e, 0x0336c852, 0x00334b9c, 0x0022c74f}}, Y: Field{[10]uint32{0x0223e853, 0x035b6d57, 0x006e5630, 0x027c517e, 0x03802076, 0x01e0889d, 0x01658985, 0x0256647f, 0x00642acf, 0x000453f5}}}, + {X: Field{[10]uint32{0x00a242bd, 0x01ce5e7d, 0x020fd7e4, 0x0398f4d1, 0x008a6055, 0x019058b7, 0x006bbd20, 0x03c4e967, 0x0260b7c7, 0x002b8537}}, Y: Field{[10]uint32{0x0065a412, 0x031a8f93, 0x00ef16ca, 0x039ebe80, 0x03afccfe, 0x01dbc844, 0x00463e23, 0x028cce85, 0x0089cdb5, 0x0022e581}}}, + {X: Field{[10]uint32{0x02d3e3d7, 0x020e1b8b, 0x02420078, 0x01204df7, 0x03b81539, 0x037f76eb, 0x00d4e395, 0x0179b0fa, 0x004099c9, 0x003cdfc7}}, Y: Field{[10]uint32{0x03fb3606, 0x003028ec, 0x01af5031, 0x004413d4, 0x030a5644, 0x033dd95d, 0x0283d769, 0x02b4d2c8, 0x008082f6, 0x0007ca40}}}, + {X: Field{[10]uint32{0x03017a84, 0x00fb2c86, 0x005dfaa5, 0x00cd99b4, 0x00a13f89, 0x030925af, 0x0041c1d3, 0x022270d1, 0x03ae9636, 0x0007ec1f}}, Y: Field{[10]uint32{0x037753c0, 0x03e32718, 0x03cb7b8d, 0x011bea5f, 0x0358e6da, 0x01ffd546, 0x0368934b, 0x015dab12, 0x01c93931, 0x0004a062}}}, + {X: Field{[10]uint32{0x0015f3cc, 0x0365ca12, 0x0371552b, 0x0087435a, 0x032afb07, 0x02e88ae9, 0x00ea2b51, 0x03b3b520, 0x0354e112, 0x0011347a}}, Y: Field{[10]uint32{0x02ed7043, 0x02a6cabc, 0x0288e3c3, 0x02df56db, 0x02ea1855, 0x035e4e3e, 0x0273e02e, 0x0149bc49, 0x0328574c, 0x0029b84e}}}, + {X: Field{[10]uint32{0x0103238e, 0x02559168, 0x03cbfd87, 0x0229d669, 0x00ec9491, 0x01dbdef4, 0x02311cff, 0x02e1d5ff, 0x032e5732, 0x001a6025}}, Y: Field{[10]uint32{0x03d26a5e, 0x03ac18d8, 0x03c262d2, 0x03385f16, 0x02ac4a0f, 0x024be826, 0x0376b24a, 0x02450c85, 0x00324ffb, 0x001ee7fa}}}, + {X: Field{[10]uint32{0x00efcfa3, 0x00c09554, 0x0379bf70, 0x018a7616, 0x01a8566a, 0x03d901a8, 0x019639c4, 0x02c79379, 0x009d405b, 0x001a8ea3}}, Y: Field{[10]uint32{0x02c038ba, 0x023799b2, 0x0124d0ce, 0x03ae7546, 0x002e0f59, 0x025ad1e9, 0x01b408e1, 0x03412a3f, 0x02e87b22, 0x000fa2ae}}}, + {X: Field{[10]uint32{0x0012ed0b, 0x00e42d91, 0x036831da, 0x013251b0, 0x03bfb680, 0x02f3e809, 0x01844c4d, 0x01192afd, 0x00d41598, 0x003fcc42}}, Y: Field{[10]uint32{0x03d0a317, 0x01cb51f2, 0x03515dc0, 0x03408672, 0x0011f5d4, 0x01c15192, 0x02abe857, 0x03422571, 0x01e33ee1, 0x00201559}}}, + {X: Field{[10]uint32{0x01517d73, 0x024c93a5, 0x011bb213, 0x01406012, 0x03499727, 0x00d772d6, 0x0134e533, 0x0126acf8, 0x036a2f85, 0x0003b93d}}, Y: Field{[10]uint32{0x0071a838, 0x0204125c, 0x0075c8fe, 0x01f628a4, 0x03830736, 0x032509d9, 0x0189e899, 0x00ac45a2, 0x01672240, 0x001af640}}}, + {X: Field{[10]uint32{0x0053e0a4, 0x023d4693, 0x01966ac7, 0x00163342, 0x00230c63, 0x032eae83, 0x023b7205, 0x02563cda, 0x01cb01ca, 0x0030845d}}, Y: Field{[10]uint32{0x0072bf51, 0x008da233, 0x02a44ea9, 0x03acbff9, 0x01585a02, 0x03021760, 0x02a0ecd2, 0x0282bc95, 0x03a67a7c, 0x001a8860}}}, + {X: Field{[10]uint32{0x0237d6fc, 0x0272fce6, 0x01292c40, 0x030317cb, 0x03953141, 0x01f2ae46, 0x0246e39e, 0x02ce60d3, 0x0008a9a0, 0x000b5793}}, Y: Field{[10]uint32{0x01c6e15e, 0x0190119d, 0x03054d61, 0x0087713b, 0x004b5127, 0x024017b4, 0x0234f37e, 0x00c7e824, 0x01c531a3, 0x001d5a6e}}}, + {X: Field{[10]uint32{0x0315dbc3, 0x030a932e, 0x01c26ef7, 0x019dade6, 0x015d573b, 0x00c5d97c, 0x00124086, 0x03ac2730, 0x0041bfbb, 0x0018c0b0}}, Y: Field{[10]uint32{0x02491025, 0x02bc209f, 0x0063f915, 0x02201279, 0x01a1e514, 0x0024cba4, 0x00ddfedd, 0x010a82b1, 0x020f67ce, 0x000caa3c}}}, + {X: Field{[10]uint32{0x01934e2d, 0x00d98481, 0x0308ca3b, 0x0330b7aa, 0x005b6c67, 0x027be6e5, 0x01c9cfb8, 0x03823bdf, 0x016c198d, 0x000f9854}}, Y: Field{[10]uint32{0x037520d9, 0x01b818c0, 0x00dbee95, 0x03b41239, 0x005692f3, 0x003d89e1, 0x03849447, 0x01c413dd, 0x03f74d5f, 0x0007bfee}}}, + {X: Field{[10]uint32{0x0142fe30, 0x02ac2bb9, 0x005a7d8a, 0x0064422c, 0x01b89892, 0x03ccc148, 0x0335a378, 0x00d3492a, 0x02b2d7d1, 0x0028022e}}, Y: Field{[10]uint32{0x01b475a1, 0x027f8c54, 0x01de6be0, 0x03aa0ae6, 0x03f5454a, 0x02701790, 0x03ec2fde, 0x001b9518, 0x03ec903c, 0x001de8dd}}}, + {X: Field{[10]uint32{0x0224005f, 0x02645fa9, 0x022f8c38, 0x019c05bc, 0x03287114, 0x00b90c05, 0x00f42b80, 0x0258aa54, 0x0348b928, 0x001de0bf}}, Y: Field{[10]uint32{0x03608c15, 0x0322263e, 0x03c18c78, 0x033d6c8a, 0x008ad2c9, 0x026ebf8c, 0x01b766db, 0x00f832b4, 0x024938a0, 0x001e3c8f}}}, + {X: Field{[10]uint32{0x03ddcfc2, 0x019dbe09, 0x03c20d20, 0x01c633fb, 0x02f6ffbe, 0x03225bba, 0x0019d648, 0x02d13f44, 0x0278c26a, 0x0008ced2}}, Y: Field{[10]uint32{0x033b655c, 0x00fb679d, 0x037b518f, 0x0108b825, 0x01f553d3, 0x020a1337, 0x03ddc1a4, 0x037e4121, 0x0036d976, 0x00379421}}}, + {X: Field{[10]uint32{0x01b8bb0e, 0x0177831c, 0x02a0792c, 0x008ca57c, 0x023f7a46, 0x03630cd0, 0x03d7aed2, 0x03524f60, 0x022906ee, 0x0020052a}}, Y: Field{[10]uint32{0x03583d92, 0x01b75543, 0x02444f3e, 0x02be0687, 0x01695f39, 0x0215aa78, 0x030caba4, 0x02f26c45, 0x029df2a5, 0x0037161c}}}, + {X: Field{[10]uint32{0x03bbdfce, 0x012ad676, 0x012c1b28, 0x03abafab, 0x0060882a, 0x02f18723, 0x03050ce7, 0x02b9c46e, 0x010b233d, 0x0022807a}}, Y: Field{[10]uint32{0x0291fdb0, 0x0376eb5d, 0x01cf4ca4, 0x03bc8294, 0x03b34b72, 0x00b2569d, 0x0006cc41, 0x01a4fa4b, 0x035dc9e3, 0x001603b5}}}, + {X: Field{[10]uint32{0x02e733b4, 0x02e48c86, 0x011a44cb, 0x006825af, 0x03a56988, 0x020ae81f, 0x026372d5, 0x024561c3, 0x034924a2, 0x00014288}}, Y: Field{[10]uint32{0x038cc751, 0x02af3699, 0x03cde3ed, 0x0038bdf3, 0x03aa21d0, 0x0111bf38, 0x01d8e2fa, 0x0007529e, 0x0220a977, 0x001a50f0}}}, + {X: Field{[10]uint32{0x02aa6d83, 0x00821ebb, 0x015cecbd, 0x01b6a299, 0x02b51b8f, 0x0209903b, 0x0307bd61, 0x01d13dea, 0x03578c96, 0x0032fd24}}, Y: Field{[10]uint32{0x028d4bf0, 0x03c1f13b, 0x011d5e75, 0x02961f41, 0x0129e79f, 0x01212813, 0x00bdb1c9, 0x036e6501, 0x02f45711, 0x001346cd}}}, + {X: Field{[10]uint32{0x028efe38, 0x026e9c62, 0x03d89ad5, 0x007fe93a, 0x007c63d1, 0x00a2cc76, 0x0164c2e8, 0x034a5a34, 0x0175e4ed, 0x001cdecf}}, Y: Field{[10]uint32{0x01f31586, 0x0208ad4d, 0x03439e7c, 0x01b74e1d, 0x02ff1ebf, 0x03720c9e, 0x027002ee, 0x03945514, 0x03a18aa8, 0x003b1fde}}}, + {X: Field{[10]uint32{0x0038813a, 0x008bff2b, 0x00b8bb7e, 0x03166aaa, 0x028812e0, 0x035ed105, 0x03f46d69, 0x00e6b9b1, 0x00642519, 0x000a72ca}}, Y: Field{[10]uint32{0x00a2e6e9, 0x02edcebb, 0x038f0528, 0x01477af4, 0x03b5f1eb, 0x01043fc6, 0x02d77c8b, 0x02cb1725, 0x000a7c98, 0x0030fb0a}}}, + {X: Field{[10]uint32{0x0228fe9d, 0x01653f17, 0x01d352c9, 0x015091d0, 0x03f36689, 0x0065e553, 0x00dffa25, 0x00bef791, 0x02592428, 0x0006162a}}, Y: Field{[10]uint32{0x02d4bd46, 0x03b0a074, 0x0248596f, 0x03512f9d, 0x00be50b1, 0x01f92ad3, 0x03d7879a, 0x027eae7e, 0x01d6b0a6, 0x00283a24}}}, + {X: Field{[10]uint32{0x022eb75c, 0x03a45d21, 0x004fc2a9, 0x02374d1b, 0x0126c137, 0x013c24ba, 0x03ae314d, 0x003abd9e, 0x00581a42, 0x001cb39f}}, Y: Field{[10]uint32{0x0025ae1c, 0x012f781d, 0x02ff3628, 0x007fdd18, 0x038bec12, 0x002162ee, 0x02236ae3, 0x00f833db, 0x037a5a9c, 0x0008ca45}}}, + {X: Field{[10]uint32{0x03112903, 0x035bd1ab, 0x0031517b, 0x02f403b3, 0x00a3f9dc, 0x02777e6f, 0x03dcb830, 0x02db492a, 0x025e5dfa, 0x000d3072}}, Y: Field{[10]uint32{0x02a1f803, 0x02a01ec8, 0x021a27ac, 0x0093ad26, 0x0080088a, 0x02962682, 0x03c4aeb6, 0x03325c0d, 0x02adc931, 0x0024fdbf}}}, + {X: Field{[10]uint32{0x00392c36, 0x02e83749, 0x02243284, 0x011e7389, 0x028d348b, 0x03b8f59d, 0x003100cc, 0x01619fe0, 0x004a80af, 0x0001f16b}}, Y: Field{[10]uint32{0x02fc5828, 0x003a9019, 0x01b86337, 0x03faad61, 0x00a3201c, 0x03a9eae1, 0x03db23d1, 0x03991cc7, 0x0164903b, 0x002911a2}}}, + {X: Field{[10]uint32{0x00363caa, 0x012dfb13, 0x00b35e59, 0x00f69d1b, 0x010b57bf, 0x01a0ffdf, 0x018851c8, 0x01dca06a, 0x0113244c, 0x002f8b77}}, Y: Field{[10]uint32{0x02580fa2, 0x0391648f, 0x01f257df, 0x02151e56, 0x018c45ea, 0x02f1ee99, 0x033e5b92, 0x028b3c73, 0x01390af8, 0x002b6dd6}}}, + {X: Field{[10]uint32{0x02c13806, 0x0285d923, 0x039b7901, 0x00ae0665, 0x037f7b22, 0x018b7f67, 0x0244471d, 0x03bf7292, 0x036a3b3b, 0x001b7b87}}, Y: Field{[10]uint32{0x002e5651, 0x02e66657, 0x01ab6af3, 0x00c43d90, 0x021a9a24, 0x02c04c48, 0x000356ce, 0x03dbffe3, 0x01014fa5, 0x001767a1}}}, + {X: Field{[10]uint32{0x01e68c19, 0x039bf9e7, 0x03c3180e, 0x01afdaeb, 0x02c76438, 0x01ec4544, 0x00355b3a, 0x023b5d24, 0x00e68e2c, 0x00057c99}}, Y: Field{[10]uint32{0x00326aba, 0x00fe315c, 0x0374eddf, 0x02ae9daa, 0x03c41291, 0x01c73ca6, 0x01053fd3, 0x03d023be, 0x0126302b, 0x002415d3}}}, + {X: Field{[10]uint32{0x029c91a3, 0x026017af, 0x036660df, 0x01ec60fc, 0x016d4c5e, 0x02a61323, 0x0192b785, 0x022433a9, 0x03e904cc, 0x000f5f3e}}, Y: Field{[10]uint32{0x03f62808, 0x01f7f979, 0x00d12682, 0x01239d8c, 0x0042b30b, 0x01aa12d5, 0x0351694f, 0x00196be3, 0x01d44ea7, 0x00355737}}}, + {X: Field{[10]uint32{0x003a1e10, 0x00773667, 0x02e1445b, 0x02c1ffaf, 0x011ec637, 0x0125c480, 0x035dd3e7, 0x014771ea, 0x03f90d79, 0x00150e22}}, Y: Field{[10]uint32{0x02e5a547, 0x03bfd52a, 0x03dcf6fb, 0x030aa75b, 0x03725f99, 0x03d58348, 0x008738b3, 0x00a97e6f, 0x038825dc, 0x0005ecd9}}}, + {X: Field{[10]uint32{0x02088313, 0x03c065da, 0x03c94be5, 0x03154818, 0x00425327, 0x024a05e5, 0x00a0d2cc, 0x02029652, 0x03dd9a00, 0x000f08a7}}, Y: Field{[10]uint32{0x02926a1c, 0x036ee34a, 0x01d8d3a8, 0x01c7fb48, 0x01192f0a, 0x00dcf141, 0x0083d12c, 0x020ed2be, 0x0395a84f, 0x000d25d5}}}, + {X: Field{[10]uint32{0x03c63210, 0x00149c49, 0x02b26157, 0x0138dbc6, 0x011974e7, 0x03ea35eb, 0x0291f368, 0x01669b85, 0x036ee146, 0x002d84ae}}, Y: Field{[10]uint32{0x00df5bb4, 0x0181cb29, 0x00dc223b, 0x005fa382, 0x02052408, 0x0357a3aa, 0x0077733d, 0x0337c7e5, 0x005dd623, 0x00016523}}}, + {X: Field{[10]uint32{0x0305f613, 0x037bf81e, 0x03d64d2e, 0x0108bbec, 0x03ae381e, 0x024038ce, 0x0341ed3e, 0x003750a0, 0x01855447, 0x003b15b9}}, Y: Field{[10]uint32{0x015e9c45, 0x03d9b3ca, 0x016d9df8, 0x00334ec5, 0x0286effe, 0x01e2f39d, 0x03f2bd65, 0x038c237f, 0x0151acf6, 0x003b35fc}}}, + {X: Field{[10]uint32{0x0011f80d, 0x039d23ff, 0x0308f25e, 0x02bf9353, 0x02a565ee, 0x026c56c9, 0x000c8baf, 0x027e3ef6, 0x03ca85ff, 0x00006fbc}}, Y: Field{[10]uint32{0x012914f9, 0x0315a0fe, 0x03135272, 0x002b7a22, 0x01125f0a, 0x006f2262, 0x014b8927, 0x0125ee86, 0x00bb96be, 0x003f8098}}}, + {X: Field{[10]uint32{0x0107c20a, 0x0020fa64, 0x0325168a, 0x03968bae, 0x010c4b27, 0x034afd2b, 0x00e42653, 0x01a38aa4, 0x004a522b, 0x0006f6eb}}, Y: Field{[10]uint32{0x00d63ea1, 0x00a10e54, 0x03a9e3d2, 0x009c38fe, 0x025b09e1, 0x00ba2c81, 0x00467b9d, 0x01fe8004, 0x03263ede, 0x00135838}}}, + {X: Field{[10]uint32{0x0262fc84, 0x027aab4d, 0x038373bd, 0x01ffa252, 0x026e601b, 0x02cb0b08, 0x01e0f8b1, 0x02e36954, 0x039a567a, 0x003a40cb}}, Y: Field{[10]uint32{0x00eb70e9, 0x00c65b5d, 0x0400064e, 0x0252372c, 0x0121d609, 0x02bf783c, 0x00b0a49d, 0x006bce83, 0x03e647d2, 0x0002b158}}}, + {X: Field{[10]uint32{0x00f79c75, 0x0241f0c2, 0x011a9fda, 0x03af2281, 0x03a9608d, 0x015b8d19, 0x0108044f, 0x03dd2295, 0x02ec044a, 0x001f39d1}}, Y: Field{[10]uint32{0x02aa426a, 0x0103f57c, 0x017d5406, 0x02814beb, 0x012c6b8f, 0x01bcf006, 0x03bbb804, 0x02f48ef9, 0x01c13166, 0x0023c21e}}}, + {X: Field{[10]uint32{0x0359eecd, 0x01b7932e, 0x01fc906c, 0x032fbcda, 0x0068862d, 0x01b34c80, 0x01298564, 0x01b47282, 0x038919de, 0x00383549}}, Y: Field{[10]uint32{0x02886b20, 0x028a51b2, 0x03ce88cd, 0x03c74faf, 0x01f46680, 0x025d02f5, 0x03547912, 0x03764293, 0x039db4eb, 0x00263d19}}}, + {X: Field{[10]uint32{0x025ca397, 0x004eba9f, 0x01f1800a, 0x02159070, 0x02e28c8b, 0x00bc8222, 0x000a4d48, 0x012d6110, 0x01cdcf1f, 0x0031a891}}, Y: Field{[10]uint32{0x021ac628, 0x0399da25, 0x01bf3605, 0x02a0cc08, 0x01cb11ec, 0x02d79b34, 0x00ff944a, 0x032c2656, 0x03b9f8f2, 0x0034c1b6}}}, + {X: Field{[10]uint32{0x0295c910, 0x00a1b9cd, 0x02b06a1b, 0x00652837, 0x024ade09, 0x026661ff, 0x0334acec, 0x03c20a87, 0x008d9710, 0x003fe55b}}, Y: Field{[10]uint32{0x03bcc306, 0x008f4304, 0x0239fb78, 0x03b2c38b, 0x01a8086a, 0x0362a4dd, 0x028c832f, 0x03f5187f, 0x012b866a, 0x003eafb1}}}, + {X: Field{[10]uint32{0x02c23af0, 0x00485489, 0x00cc73ff, 0x0059bd2b, 0x025cef12, 0x0313709d, 0x0344fe45, 0x01813343, 0x024a0d1a, 0x00152776}}, Y: Field{[10]uint32{0x000631ef, 0x03dd9784, 0x00381a33, 0x025d58b1, 0x01166fec, 0x02aec578, 0x02eede71, 0x02a0980d, 0x03c0e05b, 0x001c78eb}}}, + {X: Field{[10]uint32{0x02776416, 0x01f99127, 0x01723207, 0x004bb708, 0x016070dd, 0x037647e7, 0x01896e82, 0x01cf339a, 0x03090215, 0x0019b4f7}}, Y: Field{[10]uint32{0x03b46d5d, 0x03c9e756, 0x01ebc25f, 0x0327aa4c, 0x0009ccf1, 0x02bc162f, 0x0029dd3e, 0x03b8fb65, 0x021359a2, 0x0024e605}}}, + {X: Field{[10]uint32{0x01e4f8d9, 0x01c0bd5e, 0x01be737b, 0x02083eb8, 0x028a4d7a, 0x01713c61, 0x013ede5a, 0x018e1a71, 0x01bc0942, 0x00186f4f}}, Y: Field{[10]uint32{0x0082e780, 0x015cad38, 0x02caac1b, 0x020788cd, 0x00502aee, 0x003be923, 0x01ddf540, 0x013d24b2, 0x0247e27d, 0x0023015a}}}, + {X: Field{[10]uint32{0x00178f4e, 0x01bcee60, 0x0000647d, 0x01dbe99f, 0x004ef20c, 0x005236c7, 0x002f7849, 0x036aa49c, 0x03464a31, 0x00229b62}}, Y: Field{[10]uint32{0x028f7407, 0x019f2eab, 0x00d8ccfe, 0x02864efd, 0x03c31309, 0x02081451, 0x0082f9e3, 0x01d8065b, 0x02eee408, 0x00347d01}}}, + {X: Field{[10]uint32{0x022e573e, 0x03f47924, 0x02b1b809, 0x01096b3d, 0x0137893b, 0x03b76607, 0x00aa90e1, 0x021105c0, 0x029399eb, 0x0038ad83}}, Y: Field{[10]uint32{0x0219f7af, 0x004fba93, 0x029ed635, 0x02b42003, 0x01bd8a38, 0x02cd75e2, 0x0209dc0a, 0x020a6a2b, 0x025fe394, 0x001a2831}}}, + {X: Field{[10]uint32{0x00f55e85, 0x03c9b375, 0x00574ac6, 0x031cad56, 0x01fc23b8, 0x0277e950, 0x0316cad9, 0x03f24993, 0x030fe85c, 0x00131d80}}, Y: Field{[10]uint32{0x012b7bb6, 0x0166fa28, 0x000902d9, 0x02aa62bb, 0x01e98c63, 0x006157df, 0x039a5745, 0x02d3b323, 0x02d89a31, 0x00112cd4}}}, + {X: Field{[10]uint32{0x03baed2e, 0x0151d897, 0x01580fe4, 0x025cd98f, 0x002f0e89, 0x00e304e8, 0x022c9ef5, 0x00f0d42a, 0x02a35910, 0x00372ea5}}, Y: Field{[10]uint32{0x036544b4, 0x00530885, 0x003deb4d, 0x034b6cb6, 0x00b13053, 0x016fedcf, 0x01f91bd7, 0x01a62b7a, 0x005f0727, 0x002be788}}}, + {X: Field{[10]uint32{0x02dc7883, 0x02cacc7c, 0x02a433b5, 0x01ffa6d9, 0x03e68242, 0x0327b71c, 0x03d3e036, 0x03fe6b2f, 0x03d8f75f, 0x003f4125}}, Y: Field{[10]uint32{0x00d62d79, 0x002eb7ff, 0x0213509c, 0x022625b7, 0x01445762, 0x002f792a, 0x03fb2fcc, 0x0041deac, 0x00b69c8d, 0x00348c05}}}, + {X: Field{[10]uint32{0x01f48040, 0x0331bb7b, 0x01077542, 0x026bae28, 0x02e70500, 0x013a0fe7, 0x011b7795, 0x03904d0f, 0x01bb0b38, 0x0016ed00}}, Y: Field{[10]uint32{0x02599c14, 0x020afe20, 0x03a5ee7a, 0x01cc03b3, 0x00ca9445, 0x01e38f2a, 0x00ea6283, 0x004e47da, 0x00b5acec, 0x0010c7f3}}}, + {X: Field{[10]uint32{0x00bb283b, 0x00b6d6d2, 0x01d20a26, 0x00119ef1, 0x023acac7, 0x00d70ddf, 0x0341c38b, 0x01ab62c9, 0x024ff9cc, 0x0007ea5a}}, Y: Field{[10]uint32{0x02b963eb, 0x02a3fafb, 0x02ac8bfc, 0x031c6c88, 0x036404dc, 0x0278527a, 0x02af7f1f, 0x016bf3c7, 0x0092ffc6, 0x0030d123}}}, + {X: Field{[10]uint32{0x002f86ea, 0x00c8a459, 0x00f11614, 0x0080bfb2, 0x03697ea4, 0x01c74298, 0x02384531, 0x014749e9, 0x02ef1ae5, 0x000254d2}}, Y: Field{[10]uint32{0x03729591, 0x00aab03b, 0x03849643, 0x0084b2ff, 0x0346fd7f, 0x0284fa5b, 0x0148a4ec, 0x01f740cf, 0x003c3883, 0x00334325}}}, + {X: Field{[10]uint32{0x001b8ceb, 0x000ca834, 0x038b7b57, 0x02fc06a3, 0x02138440, 0x02a93fd2, 0x018d08f3, 0x000e42f2, 0x03ed4330, 0x003a9cab}}, Y: Field{[10]uint32{0x0058663e, 0x0299b4b6, 0x0280925e, 0x0112145c, 0x00af4fb0, 0x03ab9fa5, 0x02856a44, 0x00b30a72, 0x018c0369, 0x00385d37}}}, + {X: Field{[10]uint32{0x00122327, 0x03e1b517, 0x01fa9a01, 0x0188d75e, 0x03165698, 0x02fce874, 0x03801f2a, 0x0148e980, 0x01343ca2, 0x000e564d}}, Y: Field{[10]uint32{0x0153dd96, 0x00b80026, 0x0175b45d, 0x021eb1b2, 0x0142a5b8, 0x0111d449, 0x01cbf0e9, 0x01b72154, 0x03e92cd7, 0x002b34f8}}}, + {X: Field{[10]uint32{0x002d4721, 0x038f827b, 0x02a3f246, 0x03e1c9d0, 0x034f74ef, 0x037eed46, 0x027d4b53, 0x01683da5, 0x022a375e, 0x00355eca}}, Y: Field{[10]uint32{0x013ed306, 0x03495443, 0x03b036a0, 0x0251c6b9, 0x01c0aeeb, 0x01209e07, 0x02c20913, 0x01fb0c43, 0x00484d10, 0x0004b5be}}}, + {X: Field{[10]uint32{0x002f1082, 0x02eabd91, 0x0119c59b, 0x023f5480, 0x01fc5def, 0x03804d75, 0x02c781af, 0x03bbd839, 0x03c51b99, 0x00027cb7}}, Y: Field{[10]uint32{0x0320dd0d, 0x022d5b96, 0x01a77e0f, 0x01626789, 0x017ad1d7, 0x02a5bf83, 0x03ca6e4e, 0x00c123e8, 0x0162fd27, 0x00023c82}}}, + {X: Field{[10]uint32{0x0229884b, 0x00b06f40, 0x0216a935, 0x01d96316, 0x01afa587, 0x03037b68, 0x0336c1f9, 0x03244d26, 0x03c6f030, 0x002c70c2}}, Y: Field{[10]uint32{0x02ecdfc3, 0x00e43187, 0x019f1939, 0x009fd4ed, 0x035563e7, 0x028b8a32, 0x01c63d18, 0x02223735, 0x01d16e77, 0x003e2916}}}, + {X: Field{[10]uint32{0x01c6e53b, 0x03866369, 0x002eb665, 0x00ce14f8, 0x02305429, 0x02ed7499, 0x01ad6f91, 0x0348dc4b, 0x03e740ca, 0x00022998}}, Y: Field{[10]uint32{0x035c1e99, 0x007bb9ae, 0x03812c0c, 0x03f8081d, 0x000786a8, 0x00ec2463, 0x00cf7116, 0x0174576b, 0x03995117, 0x003881ac}}}, + {X: Field{[10]uint32{0x012941a1, 0x02aa2d2a, 0x03696fe1, 0x03a09f98, 0x005f4a5a, 0x01b302c0, 0x00fac0a7, 0x0247bbd1, 0x02cbe0ca, 0x000ac255}}, Y: Field{[10]uint32{0x006cffd2, 0x00aa588e, 0x03423ddf, 0x03fb68a7, 0x033f84b8, 0x018989f8, 0x02e1e110, 0x013abe43, 0x03a8dd45, 0x0028c79b}}}, + {X: Field{[10]uint32{0x0262c3bd, 0x00a449b9, 0x01330d54, 0x02001a83, 0x006b0099, 0x03847ed3, 0x02381df7, 0x0325c3ad, 0x01517a2a, 0x00380510}}, Y: Field{[10]uint32{0x008dfcee, 0x02e8d810, 0x03a1e7f4, 0x00d12218, 0x03aeb3fd, 0x0234636f, 0x01639341, 0x03203085, 0x029ba691, 0x00208e33}}}, + {X: Field{[10]uint32{0x02c86c37, 0x008568df, 0x02eba08b, 0x035c78a2, 0x02f344e0, 0x01682d99, 0x0316c530, 0x00bccf2b, 0x013e8b06, 0x0002f8c8}}, Y: Field{[10]uint32{0x0151cd1f, 0x02ca725f, 0x00adc3f1, 0x00f7476c, 0x03550fb8, 0x014a8990, 0x03956838, 0x00e29335, 0x03baeaca, 0x00154948}}}, + {X: Field{[10]uint32{0x01e8ff2b, 0x03859faa, 0x030abc4f, 0x01b6d7ac, 0x001c18eb, 0x0396389d, 0x03aa1db9, 0x02f593f1, 0x03b6bfbf, 0x00188ce4}}, Y: Field{[10]uint32{0x00e42cd3, 0x03537f8d, 0x00b500ba, 0x025ed4ac, 0x031339a1, 0x028edee5, 0x025e316f, 0x016fca80, 0x0174f0fd, 0x001f0390}}}, + {X: Field{[10]uint32{0x01cfe97a, 0x00856c43, 0x0326fbc6, 0x02aa2bea, 0x01bffe79, 0x0233d02f, 0x01eb624b, 0x007a1d9a, 0x0302dd0a, 0x0036b7ad}}, Y: Field{[10]uint32{0x03253490, 0x030e37c5, 0x00bb48fb, 0x026686ac, 0x025a5225, 0x0334e6f2, 0x0260acb8, 0x026d04b5, 0x00cae4c2, 0x0024c224}}}, + {X: Field{[10]uint32{0x01362f33, 0x03edde32, 0x03c13627, 0x03563894, 0x010ac98a, 0x00986133, 0x01c9cfec, 0x026e0aec, 0x03b78317, 0x002d4a34}}, Y: Field{[10]uint32{0x038babab, 0x00af54b6, 0x004f047c, 0x00222ed1, 0x01aa902e, 0x028b4628, 0x0140676b, 0x0048a98e, 0x03af1545, 0x00018c80}}}, + {X: Field{[10]uint32{0x01734a6a, 0x0096adc4, 0x036e02d0, 0x018835d0, 0x017a4de5, 0x0013a7a0, 0x0018a5c8, 0x01b88ab9, 0x03e09398, 0x000bfc88}}, Y: Field{[10]uint32{0x0100f678, 0x029e7000, 0x000965ef, 0x01d75280, 0x03819904, 0x01e0e2ad, 0x0276d8a9, 0x036866f6, 0x0188ec9c, 0x00317234}}}, + {X: Field{[10]uint32{0x01eb1742, 0x01b9d2e6, 0x0312ff94, 0x03da67f1, 0x019ec839, 0x0322ac73, 0x03d2c393, 0x014f2733, 0x01d50e1e, 0x0032e1cc}}, Y: Field{[10]uint32{0x02d19fb5, 0x02394f3d, 0x0076d8c1, 0x0123921c, 0x00a9db38, 0x024b3a29, 0x01252480, 0x03141374, 0x01f838fe, 0x00334be7}}}, + {X: Field{[10]uint32{0x00cf4a2e, 0x02c49c78, 0x0379936b, 0x0376fa61, 0x006dac52, 0x03c9c9a4, 0x02c265aa, 0x02972ddb, 0x0045d776, 0x0004ddeb}}, Y: Field{[10]uint32{0x02a04670, 0x02b287b0, 0x010d4f34, 0x0154353b, 0x0025ab21, 0x036524f8, 0x027a8187, 0x0124cb56, 0x030dd595, 0x00292ccc}}}, + {X: Field{[10]uint32{0x001a5ccd, 0x006894d9, 0x00724c51, 0x01cdeb04, 0x0222fbac, 0x020107ea, 0x03489bd8, 0x031d7f80, 0x03f2f140, 0x002612e6}}, Y: Field{[10]uint32{0x00d14ff3, 0x0050c7f2, 0x02bb590b, 0x026a50a8, 0x03d82f4c, 0x03135431, 0x010ea82a, 0x03bb2e9d, 0x02399733, 0x00311d3d}}}, + {X: Field{[10]uint32{0x03bdcb06, 0x025835eb, 0x00c4d857, 0x01e5ca63, 0x01d50504, 0x0000afe6, 0x035d56ac, 0x01f3e6c4, 0x000074f5, 0x0012e3f4}}, Y: Field{[10]uint32{0x00c703bf, 0x038deccd, 0x0097e3a8, 0x03a531b4, 0x0095560e, 0x01833ddb, 0x01937a4c, 0x03dbddc8, 0x01031df0, 0x001f0110}}}, + {X: Field{[10]uint32{0x018b6079, 0x0215a0c8, 0x000b6605, 0x006e2fb3, 0x0334fc75, 0x022f4376, 0x01250b25, 0x0088d986, 0x02536841, 0x0015cc59}}, Y: Field{[10]uint32{0x01652904, 0x010142a4, 0x01c37da6, 0x016f8e8e, 0x0216f833, 0x022bf850, 0x0172898b, 0x00715d22, 0x024f30f0, 0x0034755b}}}, + {X: Field{[10]uint32{0x0369f286, 0x01c883f6, 0x03bd253c, 0x019d3cae, 0x00607373, 0x019f50fd, 0x032cb597, 0x005bcbef, 0x0197a0ff, 0x00326800}}, Y: Field{[10]uint32{0x00142f0b, 0x03314610, 0x034e4009, 0x03b694c7, 0x006b4dfe, 0x018172af, 0x02074b0c, 0x0045f077, 0x0383d739, 0x0005df19}}}, + {X: Field{[10]uint32{0x021881cb, 0x03b1b3a9, 0x03ff645e, 0x03d5fba2, 0x00c87b9e, 0x01e6cc02, 0x01616185, 0x008ea76c, 0x02da91df, 0x00388d05}}, Y: Field{[10]uint32{0x00b8da15, 0x01cb755c, 0x00137937, 0x03d28f78, 0x02e42fbc, 0x005c60a5, 0x02c82e0e, 0x00da479f, 0x017f8404, 0x00395590}}}, + {X: Field{[10]uint32{0x038e9ad8, 0x038a5558, 0x01c1e3b0, 0x03ba29d2, 0x0114293e, 0x01def62a, 0x0214c450, 0x01d4f399, 0x03f2369d, 0x0027e5b8}}, Y: Field{[10]uint32{0x021ddff1, 0x012cae68, 0x00ff6b49, 0x025b94a7, 0x039b01a3, 0x0104f83a, 0x0250d10e, 0x029369c5, 0x02681567, 0x003d7344}}}, + {X: Field{[10]uint32{0x01301fd2, 0x013efdae, 0x03d5f1d9, 0x01e16e90, 0x01ae4880, 0x039a8c91, 0x014317dd, 0x00048f35, 0x03a4b24b, 0x0012195e}}, Y: Field{[10]uint32{0x02f0d890, 0x02319beb, 0x03e36a4a, 0x02824a69, 0x00dd4931, 0x02a4086c, 0x013ca772, 0x00de04a0, 0x02c06eb5, 0x000647b7}}}, + {X: Field{[10]uint32{0x0236f24a, 0x021f9a5a, 0x032d4e01, 0x03201de0, 0x02c6c858, 0x00500b5e, 0x03155111, 0x02193632, 0x02e9d72e, 0x0019ecc8}}, Y: Field{[10]uint32{0x03f6946a, 0x03f7ceb1, 0x02208c3d, 0x019fdfe6, 0x030e15c8, 0x017eaa0c, 0x0387058c, 0x02fc54ef, 0x02c26b58, 0x0033fac4}}}, + {X: Field{[10]uint32{0x004ded15, 0x0381bc29, 0x02d40fbd, 0x004c5820, 0x03c545ba, 0x014800b6, 0x00e89250, 0x037663f3, 0x0068542b, 0x00010ba0}}, Y: Field{[10]uint32{0x03c4aae5, 0x0111146f, 0x02402bf6, 0x0139eab1, 0x01a1ee81, 0x0313c987, 0x03649158, 0x00f3d49c, 0x01b0c1f3, 0x0005916a}}}, + {X: Field{[10]uint32{0x0290d4c7, 0x0230417f, 0x00e30758, 0x03292a32, 0x013e058c, 0x02eeb001, 0x02191079, 0x01437555, 0x00e1339c, 0x0023b9f7}}, Y: Field{[10]uint32{0x02c9d5f9, 0x01a6a05b, 0x011d2b46, 0x03fc79bc, 0x0098e102, 0x036fa7f8, 0x01a61705, 0x0209e4b3, 0x02f48aae, 0x003fef42}}}, + {X: Field{[10]uint32{0x03a368e6, 0x01e2a087, 0x02ece559, 0x03c3319b, 0x0237a935, 0x02c82485, 0x01aaaf27, 0x01a9c5ab, 0x01041292, 0x0002af25}}, Y: Field{[10]uint32{0x01f79203, 0x0317db5c, 0x027c9624, 0x01234e91, 0x02155a4a, 0x036b93f4, 0x0375c484, 0x01879e7e, 0x0135e9b4, 0x001cb952}}}, + {X: Field{[10]uint32{0x02976ba8, 0x037746e9, 0x02f3b433, 0x0235e0fc, 0x00fd72fd, 0x000de3f3, 0x000568d4, 0x03a6d4ec, 0x032081e0, 0x002f4940}}, Y: Field{[10]uint32{0x003ceb39, 0x0318e55b, 0x021ca4c3, 0x01f4a75a, 0x02e8c4c8, 0x005ee39e, 0x00ca8797, 0x01526265, 0x03db8585, 0x0016b6e2}}}, + {X: Field{[10]uint32{0x02e25f71, 0x02297862, 0x00740c01, 0x03812222, 0x01b31609, 0x039ea836, 0x02e91677, 0x03a13926, 0x0262fbee, 0x0002d3ec}}, Y: Field{[10]uint32{0x0176e5fc, 0x0371fe38, 0x0003b24c, 0x00da3a8d, 0x01265d6d, 0x033d85ba, 0x00ecbe41, 0x00754496, 0x0386dc09, 0x000d37cf}}}, + {X: Field{[10]uint32{0x02605c01, 0x03a20cef, 0x021c495d, 0x005c86cd, 0x03e46048, 0x00418ed7, 0x005ad148, 0x013abe85, 0x036766f2, 0x00346ea6}}, Y: Field{[10]uint32{0x01e8400a, 0x011da8f6, 0x03a75068, 0x00f292e2, 0x01f87194, 0x0245f8ea, 0x03ce7f28, 0x00bc7998, 0x00bd17de, 0x003a029b}}}, + {X: Field{[10]uint32{0x022639b3, 0x009d4ba4, 0x01ba8373, 0x0009a771, 0x03a80c67, 0x03ae78aa, 0x006652d5, 0x016a34b5, 0x02b03a3e, 0x0017262d}}, Y: Field{[10]uint32{0x010f4a54, 0x03d944f1, 0x012e06b8, 0x02d98d4a, 0x006a35ef, 0x03e41e81, 0x011bd130, 0x003374b1, 0x039a145d, 0x0002078b}}}, + {X: Field{[10]uint32{0x002618f8, 0x036d7753, 0x02a840c8, 0x00382a1e, 0x02908abf, 0x03ec97cb, 0x00b70714, 0x02e1bd87, 0x0288f75f, 0x00307e91}}, Y: Field{[10]uint32{0x028397ea, 0x00f32e72, 0x01d9b204, 0x0396ae18, 0x039db869, 0x02aa44f2, 0x0355d0b1, 0x03c9b45f, 0x02776d4b, 0x003cbdd2}}}, + {X: Field{[10]uint32{0x03227ec1, 0x00ae9b3d, 0x01f76dc2, 0x022d1017, 0x0396aec7, 0x00269d56, 0x0062ba2f, 0x03acc947, 0x02e9a644, 0x00017a01}}, Y: Field{[10]uint32{0x033e614b, 0x013e1fe9, 0x01bba9d8, 0x03adcbcc, 0x02b871d2, 0x01d08c4e, 0x02caa050, 0x020a75ab, 0x0118d6a1, 0x002e2320}}}, + {X: Field{[10]uint32{0x01c8de9a, 0x018c9bb4, 0x00c1434c, 0x01b7bfd5, 0x01096863, 0x031e406f, 0x023d965b, 0x0069efd8, 0x03fefd2c, 0x003e7451}}, Y: Field{[10]uint32{0x029caffd, 0x01235cb4, 0x00c33cd5, 0x032e1260, 0x0040de44, 0x0045cc18, 0x027d77b4, 0x021b1e4e, 0x0249ab66, 0x0031e21c}}}, + {X: Field{[10]uint32{0x030ccdb1, 0x0283fb29, 0x0023babe, 0x02b8c5c4, 0x009f7020, 0x001e658d, 0x0138a1f5, 0x03447ea3, 0x015685f6, 0x002e6332}}, Y: Field{[10]uint32{0x010ecf7f, 0x00ab6f26, 0x01f49571, 0x0085c25d, 0x013dcbdf, 0x002208d5, 0x024cc0d4, 0x03a28dbb, 0x00953689, 0x003c1d35}}}, + {X: Field{[10]uint32{0x0017b474, 0x0229925a, 0x02b03464, 0x024fceed, 0x02184584, 0x0052f2e9, 0x01091dc7, 0x005f9fbe, 0x02d41008, 0x003c5872}}, Y: Field{[10]uint32{0x03740904, 0x0227db66, 0x01ffd612, 0x03e7e946, 0x01c4410a, 0x01798945, 0x0081eb24, 0x03cc908a, 0x012e396a, 0x002dfbae}}}, + {X: Field{[10]uint32{0x0326914c, 0x02c70214, 0x038fb1b7, 0x03da2899, 0x03fb54af, 0x01bb7022, 0x02abac24, 0x00187915, 0x00892ea4, 0x001f22db}}, Y: Field{[10]uint32{0x027692f8, 0x02722bd7, 0x015b10d6, 0x00f736ae, 0x02296072, 0x00acd1a0, 0x035eacd0, 0x034b0a7f, 0x03026ea1, 0x003c2387}}}, + {X: Field{[10]uint32{0x00f28729, 0x00d7bb49, 0x01e5dd36, 0x023dc937, 0x023ab207, 0x03dc681d, 0x01b93cce, 0x01196065, 0x029f1633, 0x00119a30}}, Y: Field{[10]uint32{0x0074ea4f, 0x039d0013, 0x00fa129e, 0x01f0bd87, 0x008fd22f, 0x02766545, 0x024c7233, 0x03b1480c, 0x00c98391, 0x00176c8a}}}, + {X: Field{[10]uint32{0x0167b65e, 0x0071f94c, 0x00b2f4e2, 0x00a724a4, 0x0296fa67, 0x00d9c994, 0x0239f8cf, 0x03697066, 0x00f39dd6, 0x000d10f4}}, Y: Field{[10]uint32{0x03429234, 0x01f03a25, 0x014b92a8, 0x002edfb6, 0x0114a432, 0x0301e514, 0x0131f637, 0x0237723b, 0x02399a08, 0x0012db6d}}}, + {X: Field{[10]uint32{0x03c227b4, 0x031e0422, 0x020e8ffe, 0x02a6beb0, 0x02458dbc, 0x015d3025, 0x0281e693, 0x013a5560, 0x010117a0, 0x0034f38d}}, Y: Field{[10]uint32{0x02eb9908, 0x01ff2ac1, 0x0384a9b7, 0x01ba4338, 0x007696ee, 0x03555ab4, 0x001e47f8, 0x01bba4d5, 0x03b9628f, 0x002f3f1d}}}, + {X: Field{[10]uint32{0x015127af, 0x0005583e, 0x03080233, 0x030f34b5, 0x00f2bc1a, 0x03782b0a, 0x01f86409, 0x00914888, 0x0363ad77, 0x00313718}}, Y: Field{[10]uint32{0x012d3038, 0x025ae2dd, 0x0271b3e0, 0x03165fda, 0x00038a79, 0x020d1494, 0x01bc9493, 0x0299990e, 0x028fd789, 0x001e326e}}}, + {X: Field{[10]uint32{0x015ac666, 0x034a769b, 0x01075b23, 0x0332ef37, 0x021bf4ed, 0x008f4b83, 0x0178d7a1, 0x011fb3f3, 0x0394221a, 0x00031dc7}}, Y: Field{[10]uint32{0x028d6091, 0x0157dc73, 0x01980d91, 0x01bd6e3d, 0x03f2ec52, 0x01778a4f, 0x00719246, 0x016abbd1, 0x0330829f, 0x00137b8e}}}, + {X: Field{[10]uint32{0x01e6e199, 0x00945f5e, 0x03d50e77, 0x02fc9d6b, 0x0136a1e9, 0x012287c9, 0x02516e64, 0x023dfd6d, 0x00e89633, 0x002ffe23}}, Y: Field{[10]uint32{0x0388c206, 0x01d05629, 0x03f68532, 0x00a6ed56, 0x01c15526, 0x03a5d876, 0x00b62117, 0x004293ac, 0x007ab620, 0x0023cfc3}}}, + {X: Field{[10]uint32{0x01a3b97a, 0x0287ca82, 0x002da576, 0x01dbcb38, 0x006a467e, 0x00f2b089, 0x010e7e3d, 0x02fc93a1, 0x00645d57, 0x0012bf34}}, Y: Field{[10]uint32{0x0110f0a2, 0x02b95393, 0x01f93984, 0x00ec301b, 0x00ef927d, 0x021db5b0, 0x00692f61, 0x02be4db3, 0x035487b2, 0x0014bc8e}}}, + {X: Field{[10]uint32{0x02b1f373, 0x022e884c, 0x03abdf8a, 0x00d26001, 0x0379e23c, 0x0136c04b, 0x03933fd9, 0x0038815f, 0x022cb9bf, 0x00312f04}}, Y: Field{[10]uint32{0x02fbfc6d, 0x01e21859, 0x00ce1a87, 0x02f5ef7e, 0x031daf76, 0x02ad5b5d, 0x005d4273, 0x0206eb71, 0x03b6a31d, 0x00390311}}}, + {X: Field{[10]uint32{0x01f821a8, 0x01a3c614, 0x019ddb4c, 0x0229f4d3, 0x02837a0f, 0x02ac46b2, 0x0223d27b, 0x01de4738, 0x01b1d1be, 0x00121e86}}, Y: Field{[10]uint32{0x01d0ef98, 0x027912a9, 0x00e67f51, 0x000dec97, 0x01055524, 0x0150578d, 0x02335544, 0x013a6821, 0x034316ff, 0x00294f35}}}, + {X: Field{[10]uint32{0x0301a326, 0x00cb2e10, 0x007f8106, 0x0202a162, 0x01f4ac3d, 0x022333ff, 0x02035165, 0x031d201d, 0x00ecbe06, 0x0009d28f}}, Y: Field{[10]uint32{0x01a9f40d, 0x02627121, 0x019b3ff4, 0x01e98efc, 0x035d06b4, 0x00e172db, 0x0272cab5, 0x022d1426, 0x03e3afbe, 0x0005e892}}}, + {X: Field{[10]uint32{0x03afa9e8, 0x01e4418c, 0x022c48a0, 0x01a8002f, 0x03e82fcc, 0x01563e74, 0x03fc34e7, 0x0266b00e, 0x0377b0cb, 0x000cacc7}}, Y: Field{[10]uint32{0x018f5bc2, 0x036a0297, 0x032a8993, 0x03542c5c, 0x0217f422, 0x02e0111c, 0x02b3f71d, 0x036a4383, 0x004cc191, 0x000111ed}}}, + {X: Field{[10]uint32{0x024a2752, 0x022e1680, 0x03c2925d, 0x038419b7, 0x03945285, 0x03f424cd, 0x0339d46f, 0x0051a370, 0x01cf5556, 0x001e30e7}}, Y: Field{[10]uint32{0x03a3ac55, 0x022119de, 0x009ce890, 0x00c57844, 0x02a66809, 0x03008f98, 0x03df63d5, 0x032a17ba, 0x01bb4e41, 0x0035a477}}}, + {X: Field{[10]uint32{0x0134e5ff, 0x035bece7, 0x0325fa04, 0x0258ac79, 0x00d2f21f, 0x03bbf06a, 0x0102116d, 0x001ddf11, 0x0111a492, 0x0017f1d6}}, Y: Field{[10]uint32{0x017512f2, 0x0182ecd2, 0x00d507a4, 0x01892dca, 0x01f3fe16, 0x0284e5d2, 0x03524d96, 0x0221737f, 0x037f18f5, 0x00167cdb}}}, + {X: Field{[10]uint32{0x0108fa8a, 0x00a274eb, 0x0364ae38, 0x039bda4e, 0x01fa62dd, 0x038d1b86, 0x010fc164, 0x00ad269b, 0x00e9152b, 0x00328564}}, Y: Field{[10]uint32{0x0046dc8c, 0x023fcc20, 0x007f524a, 0x01124da5, 0x01535ea7, 0x00499157, 0x029eae17, 0x03b5d527, 0x033c1174, 0x0011a9ee}}}, + {X: Field{[10]uint32{0x0111fa1f, 0x01433767, 0x037f1f3d, 0x02f16ea6, 0x01743d94, 0x03d9b56b, 0x036e660b, 0x02f7ae9f, 0x02665ff0, 0x00171c54}}, Y: Field{[10]uint32{0x0073a03e, 0x03ffa711, 0x00c39b31, 0x02903c82, 0x02e41684, 0x03333293, 0x01ee9ddc, 0x02570e88, 0x031556e9, 0x001f688e}}}, + {X: Field{[10]uint32{0x00177e82, 0x0361a139, 0x017c8c29, 0x03387255, 0x03fa0c09, 0x03cb840c, 0x01c38774, 0x031ce957, 0x01a36361, 0x0031fdc7}}, Y: Field{[10]uint32{0x01b0dedf, 0x03b6e156, 0x01f92078, 0x0030d0a7, 0x0177c6f5, 0x0013c3e5, 0x022dbf9a, 0x033b2dac, 0x007fb5c2, 0x000235b9}}}, + {X: Field{[10]uint32{0x0058afab, 0x00070af7, 0x0316da01, 0x03339be9, 0x024130b4, 0x00cedd4d, 0x01259004, 0x0284f8de, 0x019f5264, 0x001ba46f}}, Y: Field{[10]uint32{0x00fd604f, 0x008e946d, 0x034499ed, 0x00d077d6, 0x01ee0f94, 0x00826a80, 0x0020c20f, 0x01612576, 0x0055506b, 0x0016ea9d}}}, + {X: Field{[10]uint32{0x02ef0d33, 0x015065ae, 0x01072689, 0x0280d416, 0x03244907, 0x00cc8a04, 0x01c789df, 0x01f2ff1d, 0x028e69ac, 0x0007c037}}, Y: Field{[10]uint32{0x02e040f4, 0x020dc0f6, 0x02feab2e, 0x032106e9, 0x020e65fe, 0x0120ad9e, 0x000c30b4, 0x00c3b4a0, 0x0290f323, 0x000a24b3}}}, + {X: Field{[10]uint32{0x01300638, 0x01e4515f, 0x01e1091d, 0x002c8c93, 0x001a2f5b, 0x01c76356, 0x01efa3ad, 0x0311a508, 0x03f507d8, 0x0030004c}}, Y: Field{[10]uint32{0x00f18895, 0x010d3b4d, 0x027a2f86, 0x004bf72d, 0x031aa3dc, 0x027a38c6, 0x005ea455, 0x03a60b74, 0x01820d3e, 0x000f1dac}}}, + {X: Field{[10]uint32{0x020cad49, 0x03a420f1, 0x0248d2f8, 0x03819b37, 0x00cdb172, 0x012efe5c, 0x00ef7560, 0x009a784b, 0x01e795e8, 0x0002bd8e}}, Y: Field{[10]uint32{0x0026abb4, 0x00b11d09, 0x03219808, 0x02bd59ce, 0x030c479d, 0x03477921, 0x0014a74c, 0x0334a439, 0x0179ce92, 0x0006f404}}}, + {X: Field{[10]uint32{0x01f4c9a1, 0x01e5e5cc, 0x00cd54e9, 0x00e22dcf, 0x00ede585, 0x03af2e68, 0x03a0a5d8, 0x03011063, 0x027d5447, 0x0039b6f4}}, Y: Field{[10]uint32{0x01242153, 0x037aaf8f, 0x038ee6b5, 0x00dcd236, 0x01a20710, 0x03433e2f, 0x00c780a0, 0x020c80f5, 0x0124f284, 0x001dfce1}}}, + {X: Field{[10]uint32{0x036360a9, 0x037f54cc, 0x0246e4c2, 0x007b9015, 0x028d1e3e, 0x0304467a, 0x02dd904e, 0x01c2ab40, 0x0123c95b, 0x003d46a3}}, Y: Field{[10]uint32{0x00f46c57, 0x012c6a70, 0x0113873e, 0x02ad4651, 0x02ae5c6a, 0x02566b36, 0x03488714, 0x00f3d831, 0x009a1d70, 0x00109acb}}}, + {X: Field{[10]uint32{0x00f6bcf4, 0x01135428, 0x01863429, 0x02b07b91, 0x00a3e4d1, 0x00eb8e98, 0x038d8fc3, 0x00dedfd5, 0x01e70fe4, 0x00384bc4}}, Y: Field{[10]uint32{0x0019f5d2, 0x01b64011, 0x01253e3c, 0x0359b71f, 0x038bfec8, 0x00453255, 0x03985b14, 0x0226ad58, 0x015835fa, 0x0008b457}}}, + {X: Field{[10]uint32{0x0188e14c, 0x02f1fb7a, 0x00bb9bf6, 0x01467624, 0x03ac6193, 0x02562853, 0x0351e56d, 0x018b418b, 0x020a8ec7, 0x0039d621}}, Y: Field{[10]uint32{0x027ecd78, 0x0070a5d5, 0x03b23ec4, 0x0208ec00, 0x03104386, 0x032d1d43, 0x008d780d, 0x013c87ee, 0x00ef10b8, 0x0010b678}}}, + {X: Field{[10]uint32{0x00a64163, 0x00e8e608, 0x032c6e42, 0x020bbe47, 0x02d47998, 0x022952de, 0x022b90c7, 0x00797360, 0x03e90ba2, 0x000f24cf}}, Y: Field{[10]uint32{0x029080df, 0x00b77cd9, 0x03f96b67, 0x00d447d9, 0x017fc161, 0x01c02d2b, 0x01b23a56, 0x008b8b29, 0x00be5319, 0x00307aa8}}}, + {X: Field{[10]uint32{0x02857872, 0x004d3f7a, 0x00e07939, 0x0138f027, 0x00df828e, 0x02469e70, 0x02b6b08e, 0x0019b2db, 0x036a83c9, 0x0011d5d5}}, Y: Field{[10]uint32{0x0038277a, 0x03b9b183, 0x00d7b058, 0x03a27654, 0x01818248, 0x0249c311, 0x03e8388d, 0x01fc5778, 0x03b262d7, 0x0004fc8b}}}, + {X: Field{[10]uint32{0x031045c7, 0x0275ad00, 0x00aa8012, 0x03361987, 0x0246570f, 0x029fffd0, 0x01df9039, 0x014502c6, 0x01037008, 0x000d798e}}, Y: Field{[10]uint32{0x01b9e8c9, 0x0272b979, 0x011f1b0e, 0x02b6961a, 0x0053cfb3, 0x00f0a3a1, 0x004f022b, 0x018361a9, 0x00bcaa9d, 0x000a157d}}}, + {X: Field{[10]uint32{0x02126fa3, 0x0398cb8c, 0x024fe82b, 0x0371aa2f, 0x02ad5330, 0x0342a17d, 0x025f0316, 0x02081cd5, 0x02011f11, 0x002b511b}}, Y: Field{[10]uint32{0x00e83e39, 0x00653d8a, 0x00d4315c, 0x0150bdcc, 0x021d8acb, 0x02b03aac, 0x012b2f81, 0x038fd47e, 0x02f1dece, 0x000900e0}}}, + {X: Field{[10]uint32{0x02718815, 0x0359001a, 0x021aff82, 0x03d75dd1, 0x0289164e, 0x03108869, 0x00af7529, 0x02b0de08, 0x01f3eb01, 0x003efa79}}, Y: Field{[10]uint32{0x02d088e6, 0x0007fd84, 0x00468478, 0x0210aafe, 0x01ba2073, 0x0137a485, 0x013e0884, 0x00b8338e, 0x00add85a, 0x003cbcc3}}}, + {X: Field{[10]uint32{0x03038135, 0x014bc4ce, 0x029166e9, 0x03d8cb4c, 0x00b9b585, 0x020b326e, 0x0149aa24, 0x03d0c281, 0x0320d81f, 0x000799d4}}, Y: Field{[10]uint32{0x00686aa7, 0x02d326bc, 0x01db1b44, 0x006cd9b4, 0x002e2c7f, 0x02621c03, 0x03aa5de2, 0x03665716, 0x0276c9c7, 0x003283c4}}}, + {X: Field{[10]uint32{0x02267718, 0x00e45f35, 0x0285f359, 0x010cc383, 0x0394c3f6, 0x0349e492, 0x02b8068a, 0x0394ae8b, 0x037023b0, 0x0005db71}}, Y: Field{[10]uint32{0x017ca8d9, 0x003cff8a, 0x02701d51, 0x03da1746, 0x000548d4, 0x03d98254, 0x010686fd, 0x016c1bd1, 0x02885df7, 0x0034b718}}}, + {X: Field{[10]uint32{0x01a9c938, 0x002aded0, 0x008dd99a, 0x01080f3f, 0x017ac839, 0x0331f150, 0x02feadbc, 0x00aceacd, 0x02c232a0, 0x000f214d}}, Y: Field{[10]uint32{0x025186b5, 0x013d6b68, 0x03d9dbdc, 0x014b5a8e, 0x018ebc7f, 0x00c08ab4, 0x00dd8f17, 0x0344ab49, 0x02a5249c, 0x0029a13b}}}, + {X: Field{[10]uint32{0x02f006fd, 0x028c8b5e, 0x014a5605, 0x000f58f1, 0x00ec6ea0, 0x02a20466, 0x00c446fb, 0x01dadb95, 0x03abc61a, 0x00122a9c}}, Y: Field{[10]uint32{0x02403a64, 0x03e64d63, 0x00d4ecdb, 0x02dc1039, 0x035977fa, 0x033cf77c, 0x00185065, 0x002208b4, 0x02eeffb2, 0x0030a317}}}, + {X: Field{[10]uint32{0x03cc1ff1, 0x028e86d4, 0x024cbd83, 0x0034329f, 0x01263d17, 0x022eb292, 0x02d2b363, 0x000a3676, 0x03620abd, 0x001d1cc9}}, Y: Field{[10]uint32{0x0136c2c6, 0x02f5a779, 0x01f3fddf, 0x03f982ea, 0x00927a88, 0x03008edb, 0x02ef7ce5, 0x02827cfc, 0x030ce8df, 0x00328477}}}, + {X: Field{[10]uint32{0x01698522, 0x01cb16e5, 0x0002eb86, 0x0095491f, 0x01a40427, 0x0053fa40, 0x03dc9188, 0x016455d9, 0x0309520e, 0x003adc6a}}, Y: Field{[10]uint32{0x0148e995, 0x027d5b93, 0x031eb874, 0x0007001f, 0x01c81b69, 0x0008ecaa, 0x02563cb2, 0x016ce3b5, 0x02e0a7e9, 0x0017eb5e}}}, + {X: Field{[10]uint32{0x02f5be6b, 0x0110dc5f, 0x021cef84, 0x0256595d, 0x02af5e86, 0x02c5e731, 0x02da74be, 0x00f7d5cb, 0x03f6c776, 0x000ac406}}, Y: Field{[10]uint32{0x03140ce9, 0x03fa188f, 0x02597067, 0x0065fe26, 0x01f66647, 0x03c96108, 0x014629fe, 0x0068f663, 0x02c84e1d, 0x00003745}}}, + {X: Field{[10]uint32{0x020ab337, 0x02910d9b, 0x033ebca2, 0x03fa3cec, 0x0213976a, 0x017a06e8, 0x032b0507, 0x0195494c, 0x03a82c66, 0x0028267b}}, Y: Field{[10]uint32{0x01136c07, 0x02a66f57, 0x013abdc0, 0x02d796dd, 0x02fb1e33, 0x0049ab32, 0x016c7faa, 0x03cacf77, 0x017b5cf1, 0x003e20e5}}}, + {X: Field{[10]uint32{0x0362f95d, 0x02f267e2, 0x00f153d5, 0x03340bd6, 0x018cc107, 0x01c2f7ac, 0x032ab6d4, 0x00f3a56d, 0x0056a61c, 0x003d0e5a}}, Y: Field{[10]uint32{0x029f6133, 0x01db005b, 0x02567cfd, 0x03cf87bc, 0x03df81c2, 0x00c9d398, 0x03240caf, 0x02c2c019, 0x011aa8ed, 0x001b8fab}}}, + {X: Field{[10]uint32{0x014050c0, 0x038e1fda, 0x00008bd5, 0x01f12516, 0x0353215b, 0x0124f600, 0x00aabe5a, 0x02ec6128, 0x019726aa, 0x00369cc8}}, Y: Field{[10]uint32{0x01a0eeb6, 0x0211813a, 0x01b4666d, 0x01339f38, 0x019489af, 0x017a5538, 0x00b987d8, 0x012da1af, 0x03291772, 0x003881d7}}}, + {X: Field{[10]uint32{0x000a6792, 0x01359be6, 0x02f4575f, 0x0345343c, 0x018fea44, 0x025d0080, 0x0259c09b, 0x01860fd0, 0x021e1959, 0x002645c6}}, Y: Field{[10]uint32{0x01219a4f, 0x01d9ec5d, 0x03f5f27a, 0x034b9d81, 0x0066af1b, 0x0381efb0, 0x032cbd80, 0x03bbcf9f, 0x000c83e1, 0x00148ae1}}}, + {X: Field{[10]uint32{0x018cf08f, 0x034d329d, 0x0323f8f0, 0x03da44cc, 0x001db7bc, 0x01122270, 0x008997a9, 0x013cd890, 0x02848a2c, 0x000d4f31}}, Y: Field{[10]uint32{0x0267ebe7, 0x01449373, 0x01fa243d, 0x0051b839, 0x0097effd, 0x000a0d32, 0x02b283f7, 0x000559f8, 0x0062f4ba, 0x0006196f}}}, + {X: Field{[10]uint32{0x02312852, 0x0090b75e, 0x026d5deb, 0x00f755e8, 0x01b9ed7e, 0x02dbf330, 0x027c77f1, 0x034f4e39, 0x003b5053, 0x0022c5a6}}, Y: Field{[10]uint32{0x005d47c6, 0x03217976, 0x00e9fbe6, 0x034b1ca8, 0x000caeb3, 0x03fd26b2, 0x02adeedc, 0x014f4e55, 0x0392fa59, 0x0012764f}}}, + {X: Field{[10]uint32{0x010cabc9, 0x0381191d, 0x002ef505, 0x00c0eeb0, 0x02efb367, 0x020fed88, 0x03b25130, 0x00c9f089, 0x02a4b1da, 0x001a3d77}}, Y: Field{[10]uint32{0x03d31782, 0x01a263f8, 0x0350c435, 0x0115c72d, 0x02146de0, 0x01b271d0, 0x01257744, 0x012e76bb, 0x039c5d62, 0x00099d03}}}, + {X: Field{[10]uint32{0x020c699b, 0x02ec8080, 0x01244e74, 0x001a6156, 0x03cc9367, 0x008229b5, 0x019d8bd7, 0x03c03238, 0x007fc3ac, 0x003ebd48}}, Y: Field{[10]uint32{0x02f1936c, 0x019282f3, 0x03eebb85, 0x009c2181, 0x03d42c15, 0x01c77a39, 0x00186ac9, 0x031b952b, 0x004617a6, 0x003eaded}}}, + {X: Field{[10]uint32{0x00d17630, 0x03d4207a, 0x004a2bca, 0x00828998, 0x02917c04, 0x00bc0685, 0x0204707a, 0x0316f4f6, 0x0291b541, 0x0030f46a}}, Y: Field{[10]uint32{0x00d9ce27, 0x03450d7f, 0x02c64d8c, 0x028d1324, 0x01c9b631, 0x0397ded1, 0x02d7ce54, 0x031017c1, 0x006e5a58, 0x0016d5e0}}}, + {X: Field{[10]uint32{0x02c8db1a, 0x03267ea2, 0x01455623, 0x016bf8b0, 0x0254b5bd, 0x0246cc3c, 0x00db5263, 0x02e48114, 0x02354970, 0x0008c9e2}}, Y: Field{[10]uint32{0x00e1888b, 0x03b91064, 0x0144d55d, 0x01afef48, 0x03357048, 0x018150b7, 0x0093b746, 0x02791c6b, 0x01dae8df, 0x00219360}}}, + {X: Field{[10]uint32{0x038c0146, 0x01d97151, 0x02d25485, 0x00ac3b2b, 0x017c12c3, 0x02773440, 0x00de4ab2, 0x0329341d, 0x018133cb, 0x00180bd8}}, Y: Field{[10]uint32{0x027aa968, 0x02791800, 0x0011f91c, 0x010b39a8, 0x019ffab3, 0x0266e721, 0x03d2da15, 0x030d43dd, 0x03b7279e, 0x001310b3}}}, + {X: Field{[10]uint32{0x01843ee9, 0x03b2ab49, 0x02690fd4, 0x02af1e58, 0x03c545a9, 0x0373233f, 0x002aa463, 0x030ec976, 0x03c70126, 0x00077133}}, Y: Field{[10]uint32{0x03fedeb1, 0x0097986c, 0x003ac182, 0x02e4aa6d, 0x036002b1, 0x0178cabe, 0x0020f172, 0x0155d4d6, 0x01825c53, 0x002a4d5e}}}, + {X: Field{[10]uint32{0x0235af82, 0x0308f3f3, 0x028b33c6, 0x037e2c13, 0x01887a95, 0x032997f1, 0x00d99108, 0x02f1e453, 0x01216e02, 0x000da53c}}, Y: Field{[10]uint32{0x00555d88, 0x00d9090e, 0x006d1d1c, 0x03266e0e, 0x02c61e57, 0x021162e7, 0x016e7428, 0x0065db51, 0x0291b1c4, 0x001fffb8}}}, + {X: Field{[10]uint32{0x01f1bdbf, 0x0248ac87, 0x003b4b65, 0x00eea483, 0x00457be0, 0x03c1b0b1, 0x00725e0a, 0x019081ee, 0x0275a959, 0x001d0eb6}}, Y: Field{[10]uint32{0x000f908f, 0x035c5d6d, 0x026c0b16, 0x03e4e6c4, 0x035629b9, 0x00b706d0, 0x00c23ed9, 0x03176027, 0x01b55ac4, 0x0023cae0}}}, + {X: Field{[10]uint32{0x02420085, 0x02bdf5ac, 0x0394f210, 0x00b89b5b, 0x00f047cf, 0x0011181f, 0x00c42d7f, 0x03129ee7, 0x03977c7c, 0x0002ffa4}}, Y: Field{[10]uint32{0x02373d64, 0x00241beb, 0x01d92126, 0x03fa80b8, 0x01666c3d, 0x037b94f5, 0x02f2b510, 0x03720c07, 0x00598f80, 0x00189758}}}, + {X: Field{[10]uint32{0x03240eb9, 0x01b62e46, 0x01f8373e, 0x03ff21e5, 0x01cb56eb, 0x0219e86b, 0x01447517, 0x011b230a, 0x000e6ee6, 0x0021b00b}}, Y: Field{[10]uint32{0x005be4ed, 0x0299abf2, 0x037b40bf, 0x01224591, 0x0159d39f, 0x03d5be02, 0x02af5290, 0x004262dd, 0x029fda4b, 0x001966d7}}}, + {X: Field{[10]uint32{0x007bfda4, 0x02a48a4e, 0x02ce5dc3, 0x011d2e0a, 0x026c4f8f, 0x02a13719, 0x01d357d3, 0x0007a665, 0x0045857f, 0x000eca04}}, Y: Field{[10]uint32{0x02e9fd4c, 0x02039ff4, 0x00f8a16d, 0x008cfd40, 0x01e318a1, 0x03cc4f6b, 0x007c42f1, 0x0055091f, 0x032ccdeb, 0x00265209}}}, + {X: Field{[10]uint32{0x02fc47c0, 0x0294a13f, 0x007a3da9, 0x02380cc2, 0x02985903, 0x01b5bfca, 0x004d33d4, 0x025e7c14, 0x01d3b54d, 0x00337733}}, Y: Field{[10]uint32{0x016683b8, 0x00ebad01, 0x00321213, 0x02469fac, 0x010196c9, 0x001f7759, 0x0191e5e8, 0x004f0513, 0x03f83693, 0x0027ca84}}}, + {X: Field{[10]uint32{0x030e16d7, 0x014b0d21, 0x00088403, 0x027ccdc2, 0x018f8c2e, 0x0008c9c4, 0x034462bd, 0x00f76fb8, 0x0102a602, 0x00260401}}, Y: Field{[10]uint32{0x0169b9cb, 0x0253a406, 0x01a5747a, 0x019af5c8, 0x004cf8fb, 0x0152a13b, 0x0381c084, 0x00ecec78, 0x02f469af, 0x0006a2ff}}}, + {X: Field{[10]uint32{0x01978179, 0x0088f966, 0x02316c90, 0x03e6cd77, 0x03c26092, 0x02e08492, 0x00168479, 0x005e6c24, 0x017db2fc, 0x0022dd9d}}, Y: Field{[10]uint32{0x02b16f05, 0x03e69cd0, 0x009606ea, 0x01a07a2d, 0x01ee4492, 0x00459cc8, 0x01a71a6a, 0x01972950, 0x0326588e, 0x0011fabc}}}, + {X: Field{[10]uint32{0x02cc3b43, 0x015c759f, 0x02771bf2, 0x02cb557a, 0x0045c83b, 0x01ac3187, 0x004d8a94, 0x02d981bd, 0x03dc897f, 0x00399bb5}}, Y: Field{[10]uint32{0x0214dcbe, 0x03316a7c, 0x01810518, 0x03e64dd3, 0x017f1745, 0x0229016f, 0x00ffd470, 0x03fd3b1b, 0x039b8a9f, 0x00394dbd}}}, + {X: Field{[10]uint32{0x02bc88c8, 0x01aa84fc, 0x020d2262, 0x00241a82, 0x01ead632, 0x03bd7045, 0x02ad0656, 0x002e7e33, 0x0192cc9c, 0x00381801}}, Y: Field{[10]uint32{0x035a584f, 0x035472df, 0x03f7ca42, 0x01775527, 0x02e7f75f, 0x0304e105, 0x02552544, 0x01c1745b, 0x00b78b84, 0x0018a365}}}, + {X: Field{[10]uint32{0x01152767, 0x016b01c6, 0x02cfbffc, 0x0109ace4, 0x0362db2e, 0x018f8bc1, 0x0358fc70, 0x00975331, 0x0242a9cf, 0x0006c2bc}}, Y: Field{[10]uint32{0x0056a2be, 0x010ff0f2, 0x035a0ed0, 0x012c0be5, 0x00592dec, 0x024d5012, 0x0128da0d, 0x0015668f, 0x02a5eec3, 0x000ceba2}}}, + {X: Field{[10]uint32{0x035acb7d, 0x02a935ab, 0x00ed5439, 0x0137396f, 0x009b8092, 0x02c2f2fc, 0x005beeed, 0x01fb68d4, 0x03aa142f, 0x0038813f}}, Y: Field{[10]uint32{0x018911ba, 0x0136d257, 0x0159e692, 0x00c11e69, 0x03a02f70, 0x03bcb08a, 0x02acdd1a, 0x005466b7, 0x019b98e1, 0x0028a013}}}, + {X: Field{[10]uint32{0x01515ed5, 0x03c26683, 0x0196469c, 0x03d24a11, 0x00a35431, 0x00c5cf53, 0x00ea1fc1, 0x00c7d885, 0x02676515, 0x002bf103}}, Y: Field{[10]uint32{0x00b648e0, 0x01b4ccc0, 0x01b45589, 0x001f34ef, 0x035e6297, 0x02c13499, 0x02e85963, 0x0037a4ca, 0x02f41e48, 0x0015fbdb}}}, + {X: Field{[10]uint32{0x03e8d226, 0x037b88aa, 0x001d4690, 0x00197298, 0x01729634, 0x017038f2, 0x00588b04, 0x01907e00, 0x03db747b, 0x001654e2}}, Y: Field{[10]uint32{0x002d4438, 0x000c773b, 0x00e28652, 0x00a174de, 0x0352ca7a, 0x037a5821, 0x026547a3, 0x0270d530, 0x006a3c91, 0x00280c12}}}, + {X: Field{[10]uint32{0x0197ed8f, 0x0391a6aa, 0x026f1efb, 0x01106012, 0x02b964cf, 0x03b6ca9d, 0x03a4baeb, 0x0100a318, 0x034fc38d, 0x001aa474}}, Y: Field{[10]uint32{0x01073260, 0x00075d76, 0x02a00f2b, 0x034729b3, 0x0345f221, 0x034f9cfa, 0x02ead10d, 0x0149d0b4, 0x00836a0b, 0x000c9403}}}, + {X: Field{[10]uint32{0x02c28d61, 0x018330a2, 0x02ee8f77, 0x02772170, 0x00332ae3, 0x038870d1, 0x01c44ab5, 0x025fba5f, 0x0287b11d, 0x00249839}}, Y: Field{[10]uint32{0x0223e778, 0x03a61458, 0x01d1892c, 0x020e8cf9, 0x01c1d13e, 0x03736765, 0x0124f5e2, 0x01953bdc, 0x033de8d8, 0x0003d1f7}}}, + {X: Field{[10]uint32{0x00fe3cba, 0x02410413, 0x03e06a03, 0x030f73e6, 0x00b48820, 0x02d3ca4f, 0x038561f4, 0x03cc07d9, 0x03337a66, 0x000d2439}}, Y: Field{[10]uint32{0x029bbd6c, 0x0281c857, 0x006f1f5e, 0x00d94ca2, 0x02a81695, 0x016eec8a, 0x03876368, 0x01c2b1d3, 0x02797edb, 0x00125646}}}, + {X: Field{[10]uint32{0x0107b4a0, 0x0029a023, 0x03c8a6ec, 0x02049e00, 0x01d71d7a, 0x02a55228, 0x00b1311e, 0x02a68df7, 0x00fe1f47, 0x0025ca7d}}, Y: Field{[10]uint32{0x0317f896, 0x02e2bcba, 0x0386c2dc, 0x01cffa2a, 0x01c8f03d, 0x008bbfa9, 0x03ee569e, 0x03f5ca39, 0x01d4ccc4, 0x0015b869}}}, + {X: Field{[10]uint32{0x029c2caf, 0x036360eb, 0x034b1c37, 0x02d60332, 0x005e694e, 0x0200113c, 0x03d77a66, 0x0108f473, 0x004f06da, 0x002bd8e4}}, Y: Field{[10]uint32{0x03e110b2, 0x006cc1b6, 0x02400f3d, 0x003df1e6, 0x01b8cfaf, 0x029f8bb7, 0x01fa10b4, 0x02e52345, 0x002f5fe2, 0x001b7b37}}}, + {X: Field{[10]uint32{0x00435a3f, 0x00bede8b, 0x031f2f24, 0x03831ede, 0x01403cf0, 0x01f0a53f, 0x0274edf8, 0x007c8688, 0x03721f4a, 0x002589c7}}, Y: Field{[10]uint32{0x025adddf, 0x03d6c872, 0x01e7951c, 0x01deb904, 0x01719400, 0x027dba52, 0x03bbca44, 0x033f54af, 0x00731fc8, 0x0019bfef}}}, + {X: Field{[10]uint32{0x03717c7d, 0x03653292, 0x0296a95b, 0x00f1fb89, 0x00dfa5a1, 0x02ea3658, 0x0027287e, 0x03168056, 0x02151f0c, 0x00290bbc}}, Y: Field{[10]uint32{0x00046fec, 0x0257dad4, 0x03a1ba49, 0x01c82d48, 0x02e32431, 0x0051823b, 0x02969298, 0x029644c8, 0x02d45f08, 0x00179247}}}, + {X: Field{[10]uint32{0x0062e5e4, 0x00b01eee, 0x02c2f7fb, 0x00ac4d6f, 0x00fc4ce9, 0x022f89e0, 0x019c2896, 0x029d5f61, 0x01ede770, 0x00064ecf}}, Y: Field{[10]uint32{0x00716700, 0x0066d7bc, 0x0177522d, 0x01026031, 0x02d1d1d7, 0x02378155, 0x01d5cd13, 0x01cd7828, 0x03baffbb, 0x00064b12}}}, + {X: Field{[10]uint32{0x001e8dc7, 0x0029f3a3, 0x02029e29, 0x02c389d5, 0x02054084, 0x01bfbbcf, 0x03b4fc82, 0x0113933c, 0x0075da6f, 0x00333e68}}, Y: Field{[10]uint32{0x0235a183, 0x02c83266, 0x03a67bf6, 0x0247ffa6, 0x020a5d64, 0x00208671, 0x020f0a23, 0x030c2e40, 0x004dccf2, 0x003413e1}}}, + {X: Field{[10]uint32{0x025b0140, 0x039eb3b4, 0x03831873, 0x02e5b738, 0x00d3ddff, 0x02614c82, 0x00ec69ef, 0x02ed0fd8, 0x025b1d69, 0x001fafa8}}, Y: Field{[10]uint32{0x03ec3d65, 0x00f9f293, 0x01d16fc8, 0x01d62557, 0x002a9483, 0x004e8fce, 0x031a47d0, 0x0358dd53, 0x02f2bf87, 0x00091502}}}, + {X: Field{[10]uint32{0x00a038c7, 0x004718e1, 0x02e45d71, 0x03af5ca6, 0x02674662, 0x00e11e2d, 0x03ff0380, 0x006c066d, 0x034ac2a3, 0x0000327a}}, Y: Field{[10]uint32{0x01f32240, 0x02f77b60, 0x016a6e26, 0x02cca744, 0x0312f6e8, 0x022b90a8, 0x032b90d7, 0x00fd3afb, 0x003dcaed, 0x001f8bb8}}}, + {X: Field{[10]uint32{0x01acd867, 0x03651bf9, 0x007b87fe, 0x00361b15, 0x02cd0b29, 0x03f61ed2, 0x0323bc5c, 0x013a7a9e, 0x020c08c8, 0x00115d5b}}, Y: Field{[10]uint32{0x00acdd1f, 0x0076829c, 0x00413461, 0x00b216c2, 0x0031326e, 0x01f705b4, 0x03984c3d, 0x03005cf6, 0x022ce577, 0x00270fd4}}}, + {X: Field{[10]uint32{0x03e3c0da, 0x0036dfc4, 0x0225ce4a, 0x039c42ae, 0x0359438d, 0x0197891d, 0x009e3416, 0x0358db1e, 0x008121be, 0x0006f561}}, Y: Field{[10]uint32{0x0386a90b, 0x03d0d451, 0x008e7350, 0x035e5627, 0x00ffd4d6, 0x001e1d0c, 0x028a7b75, 0x014e658e, 0x0097bf90, 0x0032c3ae}}}, + {X: Field{[10]uint32{0x01324dc1, 0x01f3b676, 0x00063054, 0x038333e9, 0x0032eda7, 0x01677663, 0x02a80a97, 0x026e9612, 0x022c8e80, 0x003c6655}}, Y: Field{[10]uint32{0x0008d1d0, 0x026b1ead, 0x00f32400, 0x0047374e, 0x022f7ea8, 0x00f28537, 0x01dbcea3, 0x00126252, 0x02ad7643, 0x000cd467}}}, + {X: Field{[10]uint32{0x005ea6f3, 0x00f4f53d, 0x03559674, 0x03a61372, 0x02975319, 0x00162548, 0x02ac3b93, 0x01f707d5, 0x0110e9e3, 0x001fed3a}}, Y: Field{[10]uint32{0x03c960ee, 0x00341399, 0x0062855f, 0x029ef553, 0x005f4d94, 0x038c80f7, 0x02b59bcf, 0x03b273cd, 0x003c0cdb, 0x0002dd28}}}, + {X: Field{[10]uint32{0x006c03e6, 0x03ea7fa2, 0x031364c6, 0x0229ae73, 0x03c1a1d6, 0x0137108c, 0x02270205, 0x0275e2b2, 0x00fd1983, 0x00140f42}}, Y: Field{[10]uint32{0x02448e0a, 0x00def463, 0x02f77589, 0x0355f10d, 0x02698459, 0x01cf48f7, 0x01059144, 0x03ae1ef6, 0x01db9a09, 0x00212b65}}}, + {X: Field{[10]uint32{0x01e1e713, 0x025820d4, 0x02c25091, 0x032390be, 0x0162db42, 0x021c5629, 0x02d0deac, 0x034f8961, 0x0204e6ae, 0x000cd724}}, Y: Field{[10]uint32{0x00c1c2f9, 0x027c2b3d, 0x01ce67ef, 0x01774d06, 0x0049b60c, 0x004bf761, 0x00849d42, 0x02fb8a50, 0x01bb10f8, 0x00056cd6}}}, + {X: Field{[10]uint32{0x0034bc9f, 0x01104d0a, 0x035ef30c, 0x0262738f, 0x00f218c2, 0x01c82ed4, 0x01117df5, 0x00567e08, 0x01cbe0f7, 0x002e9a39}}, Y: Field{[10]uint32{0x00fa5d72, 0x01ef2510, 0x017f3ca5, 0x011dc719, 0x03101ff4, 0x0104a8a1, 0x005a2ede, 0x01393bfd, 0x03dd0ff3, 0x000ab096}}}, + {X: Field{[10]uint32{0x037e6baa, 0x017b0821, 0x03a0a02a, 0x010e8791, 0x03446d79, 0x00e71252, 0x00202677, 0x0210c163, 0x0313311d, 0x0024f5b9}}, Y: Field{[10]uint32{0x001a0856, 0x01a99748, 0x0324fdb5, 0x0055f353, 0x01e10bf6, 0x02d427e7, 0x00710410, 0x03f49b81, 0x019c99a2, 0x001665f0}}}, + {X: Field{[10]uint32{0x03397172, 0x01402917, 0x00c22ac7, 0x009a3b30, 0x00cb8f46, 0x031746da, 0x0284fbe0, 0x01e829ce, 0x001b5cc7, 0x001ea52f}}, Y: Field{[10]uint32{0x0178bee5, 0x03dad341, 0x02cef34a, 0x025405b7, 0x03032d36, 0x02fb7d34, 0x01c9f8c1, 0x0354a9c6, 0x006e82a4, 0x0004a307}}}, + {X: Field{[10]uint32{0x0021b809, 0x00f165b2, 0x01c54c21, 0x00b6eb2b, 0x0375fbe5, 0x01bcf919, 0x02ec848f, 0x020f6517, 0x01a7c193, 0x003c0c7b}}, Y: Field{[10]uint32{0x03cabab8, 0x0031dd88, 0x03ea0517, 0x00dabe5a, 0x01eb505d, 0x0394bc65, 0x001e2e7e, 0x0393d76e, 0x010d1c17, 0x002d29e3}}}, + {X: Field{[10]uint32{0x0039907c, 0x02df5c08, 0x0360857a, 0x01d58329, 0x010ce9f3, 0x01d34065, 0x00cb924c, 0x03820b75, 0x02cd5c17, 0x0021bbc6}}, Y: Field{[10]uint32{0x00f3bb3c, 0x0383b093, 0x03de1ef7, 0x0172731d, 0x0136c310, 0x01b559cf, 0x02d34b10, 0x022b2509, 0x013db907, 0x001a4da8}}}, + {X: Field{[10]uint32{0x03c6d720, 0x005ad832, 0x00bc9409, 0x0324aac4, 0x006d24ee, 0x00a853ee, 0x039beeb6, 0x00e8d526, 0x00c9c78e, 0x003f3adb}}, Y: Field{[10]uint32{0x03f7583d, 0x005e1cdd, 0x0162f08b, 0x024ba9d5, 0x009f8d92, 0x004b2946, 0x03697015, 0x007c7382, 0x00245f56, 0x001f0b98}}}, + {X: Field{[10]uint32{0x03a5c8d9, 0x0084fbb7, 0x00f3ecd2, 0x01b8ec50, 0x00d475e3, 0x02bf90e0, 0x0026d837, 0x03cd207d, 0x011b9a36, 0x0028767b}}, Y: Field{[10]uint32{0x03a558a0, 0x016fc1f7, 0x00c6007d, 0x00ef9aaa, 0x0078bd5e, 0x03a7fb95, 0x002cb779, 0x00fca7b0, 0x017ca127, 0x000da0f2}}}, + {X: Field{[10]uint32{0x01bd48c7, 0x03e43814, 0x03dac844, 0x0269dfac, 0x013e8f62, 0x022bff28, 0x01bbdc75, 0x03b55785, 0x01996311, 0x0036637a}}, Y: Field{[10]uint32{0x00ef2a22, 0x01127ca1, 0x037cc07d, 0x014e5a75, 0x02693943, 0x01de3970, 0x011b8100, 0x023b9da3, 0x014d272a, 0x0022bd86}}}, + {X: Field{[10]uint32{0x019aac60, 0x022e8fea, 0x023edbee, 0x008e625e, 0x0060f4d2, 0x0197e014, 0x031ba80d, 0x03e8a6db, 0x01b7cd6a, 0x001e0ca3}}, Y: Field{[10]uint32{0x02fc5efb, 0x031ea79d, 0x02f01f35, 0x02171265, 0x02629f81, 0x0384d910, 0x023377f4, 0x00eb1204, 0x016f1d14, 0x0038df92}}}, + {X: Field{[10]uint32{0x0336db5e, 0x0347d9b8, 0x02117223, 0x033f36c9, 0x005d9747, 0x02ca7b9b, 0x001e1c09, 0x02bc2cdf, 0x0093031f, 0x000f5c05}}, Y: Field{[10]uint32{0x037600ad, 0x033474f9, 0x008b6648, 0x0316e1fe, 0x03414ea3, 0x02d3a774, 0x01f7ce0a, 0x02c82ad0, 0x01408311, 0x00347a64}}}, + {X: Field{[10]uint32{0x02288628, 0x03dd8ab3, 0x03a96e90, 0x021bf6fd, 0x000e2239, 0x02953b31, 0x015ba2a7, 0x0352ac2f, 0x00c047e0, 0x003d866b}}, Y: Field{[10]uint32{0x001564f2, 0x013b299e, 0x01de68fa, 0x037f3bed, 0x02f9cdcc, 0x039ff07b, 0x016a2d70, 0x017443f2, 0x023de154, 0x003c93ad}}}, + {X: Field{[10]uint32{0x02d0a2d2, 0x02f0032a, 0x03489a1d, 0x00d678be, 0x0291718f, 0x03de5ff3, 0x004a8514, 0x016800cd, 0x01b871f8, 0x00332a02}}, Y: Field{[10]uint32{0x0090b037, 0x0047045a, 0x012f712b, 0x03b4e0a6, 0x03aba642, 0x007d8be5, 0x018f260a, 0x020d6489, 0x02b83565, 0x002df5ca}}}, + {X: Field{[10]uint32{0x01c81958, 0x00fb471f, 0x03eeaa7d, 0x016d4706, 0x01aa26c4, 0x003ee851, 0x034eec03, 0x014076be, 0x0366ee2c, 0x002ef465}}, Y: Field{[10]uint32{0x035250fa, 0x03c6b3f7, 0x03cfeb98, 0x033b0cbb, 0x036c1ca4, 0x01c9110b, 0x030a6e89, 0x0184b9f3, 0x01ff70b3, 0x002f1c27}}}, + {X: Field{[10]uint32{0x001cfadd, 0x01352bfb, 0x025f79c3, 0x03a0e9a2, 0x01ca8f0e, 0x01912a97, 0x03a19381, 0x02065c99, 0x00a0e4a5, 0x001a9bf7}}, Y: Field{[10]uint32{0x02732081, 0x0145fa74, 0x00c36db6, 0x01bf2b6c, 0x006bd7ff, 0x01faf31c, 0x0104298d, 0x01495730, 0x02367658, 0x0030a2c4}}}, + {X: Field{[10]uint32{0x035c8006, 0x014c85b7, 0x00be02c5, 0x00ac05e9, 0x029564af, 0x014bc2b7, 0x03d693de, 0x00688bb9, 0x03e1fd40, 0x000248b8}}, Y: Field{[10]uint32{0x0088f757, 0x03ac7105, 0x004aa3b9, 0x031c82e5, 0x03696841, 0x032a2889, 0x0379e0c5, 0x012902e6, 0x0065aae8, 0x0029ec40}}}, + {X: Field{[10]uint32{0x0276eac8, 0x020be629, 0x01490383, 0x036b5225, 0x03aff8a6, 0x00f2f4ec, 0x02bd9dae, 0x02d54fe4, 0x024e3526, 0x0014ffeb}}, Y: Field{[10]uint32{0x01f8c6f4, 0x0390fb66, 0x03d23cfd, 0x024b115b, 0x009e6652, 0x033a183b, 0x023b2228, 0x0202e0f4, 0x00aeb51f, 0x00207f7f}}}, + {X: Field{[10]uint32{0x0203d119, 0x009e1882, 0x015b9772, 0x031ad574, 0x027c2e70, 0x00a73f92, 0x03e70289, 0x025be274, 0x01d1c945, 0x00052837}}, Y: Field{[10]uint32{0x036dd086, 0x03c7efa5, 0x02e83806, 0x03bed663, 0x007e8c94, 0x00f71956, 0x03e14835, 0x0074777d, 0x0071febe, 0x000ad770}}}, + {X: Field{[10]uint32{0x0168c8f9, 0x0143c78f, 0x03f4dc01, 0x00a9ce7b, 0x00bebe27, 0x032bcee4, 0x01a25428, 0x03cd6ed4, 0x000dfb74, 0x001cda09}}, Y: Field{[10]uint32{0x00a7a27f, 0x02ea17b9, 0x03cd8fd2, 0x01cac572, 0x0321801a, 0x031191a7, 0x00c71687, 0x03a0b9dd, 0x0317b4c5, 0x00254e4a}}}, + {X: Field{[10]uint32{0x00580560, 0x00340408, 0x0079e640, 0x0041ef16, 0x035fbdb6, 0x0105a217, 0x016825e2, 0x02ce748e, 0x0053b9ea, 0x001302a0}}, Y: Field{[10]uint32{0x03db5427, 0x02a5eef5, 0x002f093c, 0x0099820f, 0x02f5a6f8, 0x01022de7, 0x03f67f65, 0x0394c985, 0x02a75b7d, 0x00216888}}}, + {X: Field{[10]uint32{0x01dabbf8, 0x00c814cf, 0x00a1e91e, 0x01abd5e4, 0x026751a2, 0x00cf7f2c, 0x01447a49, 0x03e2b2f6, 0x02a824a6, 0x00328359}}, Y: Field{[10]uint32{0x01395d18, 0x003cca5e, 0x016b2155, 0x0020297c, 0x036f7d7d, 0x03bc0790, 0x01fd49b1, 0x00211447, 0x018d4f8b, 0x00187322}}}, + {X: Field{[10]uint32{0x01e9d6d4, 0x01629b95, 0x03a76453, 0x03dcd572, 0x01a3d7df, 0x031fec20, 0x020763b5, 0x01a8db54, 0x0375e62f, 0x00191a81}}, Y: Field{[10]uint32{0x037dbbb4, 0x006807de, 0x026f7a6b, 0x011b85f1, 0x01b11000, 0x00b24dbe, 0x01b23662, 0x00299083, 0x0044e738, 0x000f94a2}}}, + {X: Field{[10]uint32{0x0055d070, 0x000c00d9, 0x007f2303, 0x00faa044, 0x01bac77f, 0x0014b69c, 0x02d7c477, 0x02f04c50, 0x01ecf3d6, 0x0010d559}}, Y: Field{[10]uint32{0x00c9f6bd, 0x027ad369, 0x02d159fa, 0x01706ba5, 0x03ab6edc, 0x027c31c3, 0x03ca8f6c, 0x023658d0, 0x009689fd, 0x0013b54a}}}, + {X: Field{[10]uint32{0x03aa8f9d, 0x029d82e4, 0x0316fff6, 0x02b000dc, 0x037a014a, 0x018171a4, 0x01f22fee, 0x01512a94, 0x00969328, 0x00362c06}}, Y: Field{[10]uint32{0x0206edf3, 0x03dc964e, 0x020ac989, 0x020b9318, 0x01dd4127, 0x00525ed7, 0x0160719c, 0x01e6b4db, 0x0242a2b8, 0x0018fd47}}}, + {X: Field{[10]uint32{0x023d48d7, 0x039511b5, 0x0399a21e, 0x02ed1fc1, 0x0283a30a, 0x03c60b97, 0x02f6f2b6, 0x00c14a52, 0x01504a9b, 0x002e51d6}}, Y: Field{[10]uint32{0x002fb876, 0x0241a243, 0x01018042, 0x01f0d2b8, 0x02968027, 0x038d62b5, 0x03896769, 0x0266fde6, 0x002837a8, 0x0032f1d0}}}, + {X: Field{[10]uint32{0x038e0ef0, 0x01a89c7f, 0x02f0fc3e, 0x019c6c98, 0x01d521b4, 0x0121084d, 0x0201b5e3, 0x0356fb16, 0x00492972, 0x00050c5f}}, Y: Field{[10]uint32{0x02069381, 0x02419470, 0x006cfc20, 0x027930d2, 0x01d318e7, 0x036d20f6, 0x02a476a7, 0x033f48b9, 0x0235d1ce, 0x00331348}}}, + {X: Field{[10]uint32{0x0144f8c6, 0x03753927, 0x005f8fcd, 0x01cd3a57, 0x0278c4b8, 0x0224a354, 0x0062ab33, 0x019fd13c, 0x03575b68, 0x0022ef6c}}, Y: Field{[10]uint32{0x0173a778, 0x025fccd4, 0x019fa90b, 0x028bb86d, 0x021279ec, 0x01f40398, 0x01a67e6c, 0x01015301, 0x03873242, 0x0034e34c}}}, + {X: Field{[10]uint32{0x006aa685, 0x002c643c, 0x014761ab, 0x03e53b4c, 0x03380b00, 0x0265b035, 0x0279786b, 0x02f9e024, 0x02f636ec, 0x001ddd7f}}, Y: Field{[10]uint32{0x0355407b, 0x025bafcb, 0x018e12a9, 0x014cae0c, 0x00342431, 0x02e21711, 0x0257d7fc, 0x03596773, 0x0273162d, 0x0014c54a}}}, + {X: Field{[10]uint32{0x01693b48, 0x0247030e, 0x0242ba74, 0x02955143, 0x00bc9b0e, 0x0279cbed, 0x02649502, 0x038ddef2, 0x03d139eb, 0x0036d792}}, Y: Field{[10]uint32{0x005a0abb, 0x025399b3, 0x00e62141, 0x003af6f9, 0x00416ca2, 0x00e209f7, 0x037ceb32, 0x025ab68c, 0x0113a5a7, 0x002991a0}}}, + {X: Field{[10]uint32{0x01c619eb, 0x013fc47c, 0x020fc241, 0x00c5c255, 0x016ebf06, 0x03c1a73c, 0x0011be39, 0x014b8bab, 0x03b0578c, 0x003aac15}}, Y: Field{[10]uint32{0x01023f67, 0x036d157f, 0x01f750cd, 0x03386031, 0x006fb041, 0x030b787a, 0x00e5c6c3, 0x02e2a116, 0x023fcf69, 0x00150880}}}, + {X: Field{[10]uint32{0x03f5e44c, 0x00460ff9, 0x02fe6d02, 0x00c90639, 0x02c231ba, 0x01944ccf, 0x02d43cc0, 0x035845f8, 0x00d3c657, 0x003a557f}}, Y: Field{[10]uint32{0x028e6b57, 0x008a3d20, 0x02369cfe, 0x03f2cb8d, 0x02973095, 0x0311b176, 0x014953a4, 0x00bc9c91, 0x02986521, 0x003743aa}}}, + {X: Field{[10]uint32{0x002d8e49, 0x01fe46c1, 0x027a72a0, 0x01cfabec, 0x03ec0f5e, 0x00759817, 0x011f596f, 0x03f0c30c, 0x005758ea, 0x0017d68f}}, Y: Field{[10]uint32{0x01cdf1a2, 0x00fbca97, 0x0090ccf2, 0x017a132a, 0x01c6d9f5, 0x02914dbd, 0x005a04aa, 0x02cbaa76, 0x00b01d1f, 0x0000f378}}}, + {X: Field{[10]uint32{0x00b99bab, 0x00b64902, 0x019c0757, 0x03c9ab48, 0x0049c82c, 0x0012bc46, 0x03fbd7ae, 0x03787bbf, 0x01e4ff0a, 0x003ede8c}}, Y: Field{[10]uint32{0x01df2a01, 0x00ac1fcc, 0x0345a550, 0x00b01cd8, 0x039e6910, 0x03918f75, 0x006bc4eb, 0x0395fbba, 0x020c431d, 0x003aa1ea}}}, + {X: Field{[10]uint32{0x03ae1ffb, 0x005de352, 0x02b44e41, 0x00f79ac8, 0x036ec18d, 0x020fb8e8, 0x01f8dd96, 0x01dde52e, 0x016aa3e8, 0x00355ec7}}, Y: Field{[10]uint32{0x000f62ee, 0x0235eaf7, 0x008ca73f, 0x015c08b6, 0x009fcb9e, 0x00f32ebb, 0x01adb0e4, 0x034bc027, 0x02d6b85b, 0x00095bff}}}, + {X: Field{[10]uint32{0x03b8f1a6, 0x02b15232, 0x00b5bbd6, 0x00cb1c2f, 0x030f7268, 0x020da5ec, 0x00fc90e1, 0x0128e3bc, 0x0052d3a2, 0x0024c9bf}}, Y: Field{[10]uint32{0x02889a2b, 0x01629bc4, 0x0330801a, 0x03095355, 0x00d7d766, 0x0267ebea, 0x01176f5c, 0x00afab48, 0x00a0cc0a, 0x00218ef4}}}, + {X: Field{[10]uint32{0x013caff4, 0x01e6d2ea, 0x036da360, 0x0354c4fb, 0x03d5d310, 0x0082b421, 0x0217e946, 0x02d7995d, 0x00d5abc9, 0x00160d8b}}, Y: Field{[10]uint32{0x022fc52f, 0x012350bd, 0x021c03da, 0x03cf098b, 0x03d6923c, 0x0390c88c, 0x03b673b2, 0x02ef635c, 0x00044e86, 0x00017ca9}}}, + {X: Field{[10]uint32{0x001738ee, 0x03f3a061, 0x03681034, 0x01a5fa68, 0x01b8c4cd, 0x02cc6358, 0x001b3a96, 0x039a3c38, 0x00b9cd06, 0x001f7522}}, Y: Field{[10]uint32{0x019782cf, 0x0267af82, 0x0010f34a, 0x03414998, 0x00d963de, 0x00f4a4a8, 0x0370846a, 0x03225f2d, 0x01ed0130, 0x003f5ea9}}}, + {X: Field{[10]uint32{0x00fe798d, 0x01419003, 0x0061df95, 0x0091aea0, 0x011fa2a3, 0x00ed05c1, 0x030d7d5a, 0x005550cc, 0x0302524c, 0x0026fde2}}, Y: Field{[10]uint32{0x00cf5a83, 0x009d5224, 0x00f48104, 0x0215da59, 0x00c7d063, 0x02d08672, 0x01d5a703, 0x01a0075e, 0x03d66d2e, 0x00167d4d}}}, + {X: Field{[10]uint32{0x02b3fc47, 0x00f70d83, 0x03c39366, 0x02dbbbaf, 0x00e71513, 0x02ef5b47, 0x01b4f879, 0x03572c63, 0x0173743a, 0x0013205a}}, Y: Field{[10]uint32{0x0141105f, 0x010b6243, 0x00254ab1, 0x03af545b, 0x0044c6f8, 0x0003e594, 0x033ef09f, 0x025002a4, 0x02ac37a4, 0x00069b71}}}, + {X: Field{[10]uint32{0x01051be8, 0x00715bec, 0x031a835c, 0x0169fc00, 0x00173f4e, 0x003ce89b, 0x02964084, 0x018d0d64, 0x03c2c748, 0x001818da}}, Y: Field{[10]uint32{0x03e88e8b, 0x03763d76, 0x01b08541, 0x01adf3e0, 0x020efc2e, 0x0346f95b, 0x024190b0, 0x00af25c2, 0x037a3aed, 0x001c69e2}}}, + {X: Field{[10]uint32{0x03f8d00a, 0x01e83cc1, 0x00a2f004, 0x00dd0329, 0x03122115, 0x03579b34, 0x0263fc94, 0x0029c1b1, 0x02dec3e9, 0x0029b9dc}}, Y: Field{[10]uint32{0x00eed520, 0x029f1cf4, 0x032ca76b, 0x00875e30, 0x00f10902, 0x002a87ae, 0x02175a81, 0x01c60529, 0x021f5c72, 0x00096e3f}}}, + {X: Field{[10]uint32{0x00b89262, 0x00c9395f, 0x026c9019, 0x004c598c, 0x031692f6, 0x02a2feeb, 0x03b4b2aa, 0x01c857ea, 0x013c6030, 0x001e7199}}, Y: Field{[10]uint32{0x02197bcb, 0x039fb4b4, 0x028f8db1, 0x00f08138, 0x03c24eaa, 0x0025572f, 0x0379da4c, 0x02525b8a, 0x0112b6b4, 0x000db57b}}}, + {X: Field{[10]uint32{0x0246cb15, 0x02a151b5, 0x0242ed4b, 0x013aaaf6, 0x034a2bdb, 0x03911530, 0x0374af4c, 0x03eb7b51, 0x032e4530, 0x000fd55a}}, Y: Field{[10]uint32{0x00fd25c3, 0x00a4e27b, 0x039e0588, 0x0360e5f3, 0x02c9fd04, 0x01717138, 0x028996bf, 0x010cc4ef, 0x03211ce8, 0x002eac74}}}, + {X: Field{[10]uint32{0x03b3913a, 0x009cedcf, 0x01dd93b7, 0x00abce18, 0x02d645c5, 0x03dcc7f8, 0x011e0fbc, 0x03fa7d78, 0x02238d21, 0x003b6966}}, Y: Field{[10]uint32{0x012bbfee, 0x006e6a1c, 0x02562416, 0x015d032c, 0x03d3cea8, 0x01d6dfad, 0x0029c06d, 0x0082e0b3, 0x03014ba3, 0x0008bc8b}}}, + {X: Field{[10]uint32{0x01e68548, 0x02909e5f, 0x02cb0c42, 0x00aea7d8, 0x033a2bea, 0x01c753c0, 0x0158adf0, 0x03ed3cda, 0x0277323d, 0x0001e87a}}, Y: Field{[10]uint32{0x024825a0, 0x030fc809, 0x01940f6c, 0x0147dbd0, 0x006d2d7f, 0x00984c63, 0x036f9766, 0x00ad7689, 0x0225ee7a, 0x001219b3}}}, + {X: Field{[10]uint32{0x0323de2a, 0x0330f668, 0x00178a0e, 0x023d8b57, 0x0233d102, 0x02421db8, 0x027c51d5, 0x035b42eb, 0x013aad62, 0x0002b43f}}, Y: Field{[10]uint32{0x003b0601, 0x0100e082, 0x02787a6d, 0x01f7b660, 0x01d16315, 0x01e4b5d8, 0x034a64eb, 0x011a7d53, 0x00c59672, 0x00223809}}}, + {X: Field{[10]uint32{0x002729d3, 0x001b3718, 0x00dfd207, 0x01c6358d, 0x03ee7437, 0x02e12972, 0x016e9d67, 0x0129a55b, 0x0032f404, 0x0006fc65}}, Y: Field{[10]uint32{0x00516aa9, 0x00710c1f, 0x0292263d, 0x0270fe93, 0x034f2acd, 0x01b0dfa6, 0x02f8e3e1, 0x028681d7, 0x0200afb6, 0x0010452c}}}, + {X: Field{[10]uint32{0x0121d93b, 0x008130b8, 0x019afc35, 0x017c4b48, 0x012fb1af, 0x0002da53, 0x023b9d5f, 0x036bea2f, 0x02f20bc2, 0x00145185}}, Y: Field{[10]uint32{0x022eaf9c, 0x01cb33e4, 0x0058a740, 0x02dc1140, 0x0257ba8e, 0x0196b6fc, 0x03f4e0a0, 0x00a673d9, 0x0253608a, 0x000f973b}}}, + {X: Field{[10]uint32{0x0121a661, 0x000b685a, 0x01a1c3b0, 0x00c1aa38, 0x00fdc423, 0x033fcd39, 0x0321d181, 0x03b4c64d, 0x00e85338, 0x00238ffb}}, Y: Field{[10]uint32{0x00f686d2, 0x01993e08, 0x03b2e077, 0x010e2ccc, 0x03128945, 0x032b267b, 0x02dfc249, 0x0121ad9d, 0x034b6736, 0x002c255c}}}, + {X: Field{[10]uint32{0x03ad4447, 0x0350e329, 0x03355916, 0x02682b98, 0x016db1eb, 0x0362882e, 0x00421867, 0x007b4a4a, 0x0020df10, 0x0011b01a}}, Y: Field{[10]uint32{0x01f1afa9, 0x031eaf37, 0x0226f9ac, 0x01606f3f, 0x01d7d439, 0x0051ed4d, 0x00d1b601, 0x02dcff12, 0x00f4059b, 0x003f2a84}}}, + {X: Field{[10]uint32{0x03722b31, 0x031f6ff3, 0x02dba0fe, 0x01a470bb, 0x013fff8c, 0x02cdebdc, 0x001e406a, 0x00e42ac0, 0x01f71f9b, 0x00158cd3}}, Y: Field{[10]uint32{0x026707dc, 0x01082f1c, 0x006904af, 0x031011d1, 0x038a3724, 0x01269b24, 0x03c4b0bf, 0x03055a9c, 0x0394340d, 0x0008b410}}}, + {X: Field{[10]uint32{0x00a67c4f, 0x020998c3, 0x03d37cb8, 0x03e86d72, 0x03b2fd55, 0x03294b48, 0x03e3dc97, 0x017e3276, 0x006d8904, 0x00080b89}}, Y: Field{[10]uint32{0x017a62b1, 0x039ec828, 0x033659a2, 0x038d44f2, 0x027a6241, 0x0116201c, 0x01f661ec, 0x03c08c72, 0x03899cbc, 0x003d39b3}}}, + {X: Field{[10]uint32{0x039bd4d5, 0x008e7a66, 0x0009dece, 0x01735979, 0x03c56b63, 0x00d54bbf, 0x03c1ff94, 0x0070b3d6, 0x02e01021, 0x00320153}}, Y: Field{[10]uint32{0x03f31057, 0x008a09c5, 0x0046b46e, 0x034419e3, 0x010bf1eb, 0x02e152c1, 0x02842b43, 0x0072f379, 0x01af5160, 0x003d4145}}}, + {X: Field{[10]uint32{0x00438383, 0x00954e05, 0x004f51c6, 0x02b95be6, 0x01ea3282, 0x02e5c068, 0x01407084, 0x02d86b4a, 0x008c235e, 0x00270a5e}}, Y: Field{[10]uint32{0x0359ead7, 0x01c3b125, 0x0286c2ab, 0x010a6774, 0x00c116cc, 0x02b4c38c, 0x02469db4, 0x03bcb88d, 0x02ecefdb, 0x000c8447}}}, + {X: Field{[10]uint32{0x01a57ef8, 0x005d1706, 0x009e74bc, 0x008cd9d4, 0x02729990, 0x02530f35, 0x028dc86f, 0x030e51c1, 0x00d0b7b5, 0x0016153a}}, Y: Field{[10]uint32{0x023eb98d, 0x02dd72e9, 0x005f2345, 0x001505f5, 0x00edafec, 0x03834b4f, 0x00c41134, 0x02faf7d4, 0x01c50c06, 0x001f9e40}}}, + {X: Field{[10]uint32{0x033fef34, 0x03ea247d, 0x010b74d0, 0x03767239, 0x011104a5, 0x0151e913, 0x0046e1b3, 0x039e2681, 0x03f0f45b, 0x0022ecbf}}, Y: Field{[10]uint32{0x03b182c1, 0x02a45cdc, 0x03a7935d, 0x037dc888, 0x03efb979, 0x00e0fdd9, 0x0171e2bc, 0x00fa99b1, 0x0365a534, 0x0030ccb8}}}, + {X: Field{[10]uint32{0x00cd209e, 0x022d5863, 0x033c45ad, 0x015b71cc, 0x02992f56, 0x02d90f36, 0x0165faac, 0x00ce1e18, 0x02656ee4, 0x0003aa23}}, Y: Field{[10]uint32{0x01f0f909, 0x02a0e897, 0x006f1fd0, 0x012a10e6, 0x02af9f4f, 0x0115c971, 0x03357ab8, 0x00d0f62a, 0x00d64a7a, 0x0030e310}}}, + {X: Field{[10]uint32{0x0046295a, 0x0075aa51, 0x01ff6698, 0x02e33236, 0x02a3b18a, 0x00352e8a, 0x0322c2ee, 0x01fa984c, 0x00df857c, 0x00303075}}, Y: Field{[10]uint32{0x0172b981, 0x00bf8167, 0x02918729, 0x0123aede, 0x029a2846, 0x0326f91a, 0x02ae1dbe, 0x03bdf739, 0x01d10e8e, 0x00091c45}}}, + {X: Field{[10]uint32{0x007fc72a, 0x0380a33b, 0x0265db74, 0x0049e4ae, 0x0267b8e2, 0x02dc8faf, 0x0008d8dd, 0x00d800aa, 0x00f9407d, 0x002479a9}}, Y: Field{[10]uint32{0x005721ba, 0x0394104f, 0x0299547e, 0x02ed1e92, 0x0212e57d, 0x00841b82, 0x00e98f7b, 0x022fa173, 0x016035f5, 0x003bdab9}}}, + {X: Field{[10]uint32{0x03208454, 0x0253823e, 0x03078187, 0x000b8873, 0x0224a7a4, 0x020340d9, 0x015cf613, 0x0074d8a6, 0x02189a8c, 0x00335d25}}, Y: Field{[10]uint32{0x03af0bd9, 0x00b17b72, 0x024f6ba0, 0x00bc748e, 0x022dd6ba, 0x022bf2ae, 0x03debcf8, 0x03e44a80, 0x02be15d1, 0x003cf724}}}, + {X: Field{[10]uint32{0x02943018, 0x01d4bfe0, 0x015e9f71, 0x0196bc28, 0x0285f630, 0x013ac929, 0x004f3fa4, 0x0239c30c, 0x012d02e6, 0x00267d74}}, Y: Field{[10]uint32{0x020b8a9e, 0x01a37076, 0x01dfb611, 0x020091b5, 0x01dff9f9, 0x0028a5ec, 0x03962c9c, 0x02fccda3, 0x021ad97e, 0x00167c64}}}, + {X: Field{[10]uint32{0x01f7608f, 0x03580aee, 0x02dff7b3, 0x036e77ae, 0x01a6ac02, 0x01745c64, 0x0256b1e7, 0x01c25845, 0x0130f9c0, 0x0018f1b3}}, Y: Field{[10]uint32{0x021083f0, 0x00fffbd1, 0x017234b7, 0x03d03b9c, 0x006d8b1e, 0x02add6f9, 0x025f0a13, 0x006e3f83, 0x037370a4, 0x000b90e4}}}, + {X: Field{[10]uint32{0x01184d92, 0x0357a5d7, 0x01e9394c, 0x011c602c, 0x019e04fe, 0x01f9b06c, 0x037fc551, 0x03a84766, 0x032690a5, 0x002dd01f}}, Y: Field{[10]uint32{0x013de6d2, 0x0233df54, 0x0301aaed, 0x0200f835, 0x03828ee8, 0x0299e5b9, 0x020f7277, 0x012611d0, 0x012947dd, 0x0006e54e}}}, + {X: Field{[10]uint32{0x0383fd40, 0x03e69b78, 0x02297150, 0x023761ad, 0x02c29ce4, 0x01e94015, 0x0121e962, 0x02210375, 0x0116161c, 0x000925e4}}, Y: Field{[10]uint32{0x00b9a70b, 0x03826c0a, 0x03649143, 0x010fdee8, 0x0076f999, 0x03ec5992, 0x00d3e325, 0x0273dce1, 0x01ab3dd6, 0x0004f75c}}}, + {X: Field{[10]uint32{0x01d73b7d, 0x037a3dfe, 0x0196b6f2, 0x00651943, 0x030b4199, 0x03210542, 0x016c80d4, 0x02c9e219, 0x02c36122, 0x003c426d}}, Y: Field{[10]uint32{0x011c96ac, 0x03ab575e, 0x01c77142, 0x01ad284f, 0x01bd971f, 0x02525be1, 0x0291d4a3, 0x03553702, 0x0369bef8, 0x0029d15c}}}, + {X: Field{[10]uint32{0x01118df9, 0x038edb5a, 0x015169f0, 0x000289ad, 0x0136be99, 0x03ef42b0, 0x017c9297, 0x030dc13c, 0x03f82031, 0x00166cc0}}, Y: Field{[10]uint32{0x03d678c3, 0x0197af4b, 0x01e02d6c, 0x01b431a5, 0x01983030, 0x00d41a30, 0x008c936b, 0x009c696b, 0x00dd1666, 0x000c31f1}}}, + {X: Field{[10]uint32{0x0062fc52, 0x00e5d3b5, 0x02cd6602, 0x006b4afd, 0x01a67862, 0x01ee2132, 0x0254cd6c, 0x00436d2e, 0x019aeb39, 0x001989cd}}, Y: Field{[10]uint32{0x0110d487, 0x03115f6a, 0x010b2555, 0x0377a93d, 0x00feab83, 0x024de5de, 0x00867347, 0x01e29ff1, 0x01bad2de, 0x002f2f3e}}}, + {X: Field{[10]uint32{0x0151f1d9, 0x009e16b7, 0x0281e921, 0x00104610, 0x00ec7efc, 0x003a062b, 0x01d23059, 0x0141f672, 0x0180c4fb, 0x001dbf6b}}, Y: Field{[10]uint32{0x03a8c346, 0x03b376f8, 0x0119a18c, 0x0035ff27, 0x039b88b7, 0x01566156, 0x00adf7ef, 0x03cc1fcd, 0x03cc349c, 0x00332331}}}, + {X: Field{[10]uint32{0x01313330, 0x00ede478, 0x00700b98, 0x032d30a2, 0x037f2380, 0x02a6ebf6, 0x03ed9cc4, 0x03c2294b, 0x0006e99c, 0x0001e24d}}, Y: Field{[10]uint32{0x0111d149, 0x03e02bc9, 0x0007450e, 0x00ede96e, 0x00d0c2e8, 0x02f56e3b, 0x001acd3f, 0x03f96b42, 0x01af39ea, 0x003b0578}}}, + {X: Field{[10]uint32{0x038c81d5, 0x02c6e820, 0x039ff3bb, 0x033760e8, 0x01018f16, 0x003a0d3d, 0x013c229d, 0x0084cfb6, 0x02a4e8d0, 0x00031152}}, Y: Field{[10]uint32{0x03ac51f0, 0x00ecea1c, 0x01f5c67e, 0x039b7afd, 0x018af57b, 0x00a69b96, 0x00959245, 0x00e023d2, 0x01cf89c4, 0x002a6398}}}, + {X: Field{[10]uint32{0x02402880, 0x002d845c, 0x0327bf99, 0x03b8e55e, 0x0097dac1, 0x0108e404, 0x02ba8f96, 0x03048b74, 0x021ccbe5, 0x003fc2f0}}, Y: Field{[10]uint32{0x03bca50a, 0x0334e59d, 0x020da467, 0x03dc14a5, 0x01ecd634, 0x039117b0, 0x00cd5f89, 0x00860635, 0x009c1f7b, 0x00030d02}}}, + {X: Field{[10]uint32{0x0331c301, 0x00789e4d, 0x0373586f, 0x03a74fad, 0x003a0e61, 0x004ade3c, 0x0132e398, 0x0108ef60, 0x02e349a0, 0x00239121}}, Y: Field{[10]uint32{0x022053a1, 0x01ee6ca6, 0x0083ca8a, 0x02130422, 0x0116bbf0, 0x037088bb, 0x021866f4, 0x0098354b, 0x00d437cc, 0x00225ec9}}}, + {X: Field{[10]uint32{0x01c579e7, 0x03e96d13, 0x03584590, 0x01b04e11, 0x010bf7fb, 0x00d44227, 0x00a30d20, 0x0313a5ab, 0x017f84f5, 0x0013d329}}, Y: Field{[10]uint32{0x01e63a9e, 0x0094396b, 0x010b717d, 0x01d63ca3, 0x01336349, 0x0286e46a, 0x031cb1f8, 0x0155b0db, 0x03dc1691, 0x00354f6d}}}, + {X: Field{[10]uint32{0x03c203bb, 0x002ab633, 0x02423c76, 0x01bce22d, 0x0279b3a9, 0x02bb63ee, 0x00618300, 0x013ea417, 0x00b2d7a2, 0x003fa249}}, Y: Field{[10]uint32{0x00b056be, 0x033a8cb4, 0x0026a7e3, 0x02103ea3, 0x00e92c37, 0x02c5f82b, 0x0279df9c, 0x0038afd3, 0x0229c6be, 0x002f4c0f}}}, + {X: Field{[10]uint32{0x006abb5d, 0x03345371, 0x03fc5dcd, 0x028cc83c, 0x03008ed9, 0x014be66c, 0x005895d1, 0x031cbe1a, 0x035cf6a8, 0x000c267d}}, Y: Field{[10]uint32{0x02fc9f1c, 0x0082cba9, 0x000bc6fc, 0x0313038b, 0x0304a939, 0x02a570a9, 0x038a32c2, 0x014a7289, 0x002aec76, 0x003eed6f}}}, + {X: Field{[10]uint32{0x0072f4eb, 0x0170b727, 0x004b9741, 0x0088ab0e, 0x03432443, 0x00901727, 0x0232de01, 0x009bced9, 0x0383f841, 0x000ee4e7}}, Y: Field{[10]uint32{0x005607fb, 0x030932bc, 0x0255f1d3, 0x031fd22f, 0x01c1e602, 0x00e84e2d, 0x014cc202, 0x010e03a7, 0x0353ec45, 0x00210edc}}}, + {X: Field{[10]uint32{0x01c732d8, 0x03191b65, 0x009327b0, 0x025f5b4c, 0x00b032f1, 0x00e12a4e, 0x023cbc06, 0x038d1772, 0x02a04a50, 0x00371d41}}, Y: Field{[10]uint32{0x03d5772a, 0x0378e766, 0x039eae8d, 0x013ad88f, 0x01c6a39d, 0x0345bd0f, 0x039559a3, 0x02758a67, 0x0311f6d4, 0x003fa508}}}, + {X: Field{[10]uint32{0x03b30dea, 0x03483aa0, 0x01433f84, 0x03ed2af2, 0x003dde68, 0x01c875d7, 0x02fb61a2, 0x01a8d45c, 0x0196c699, 0x003d6931}}, Y: Field{[10]uint32{0x01f26572, 0x01a02ee7, 0x018e35ae, 0x00c3bdf7, 0x02fd783b, 0x034c2e58, 0x02ef9220, 0x03d8eeec, 0x013e77d2, 0x0005d783}}}, + {X: Field{[10]uint32{0x02a4029e, 0x02f87e6b, 0x03133cb9, 0x01a4098b, 0x01373c2f, 0x03de7d2c, 0x01222ae2, 0x00127f97, 0x00e2c499, 0x001fa40e}}, Y: Field{[10]uint32{0x0025c737, 0x01bccae0, 0x03dfe714, 0x012c888e, 0x031d7dc6, 0x015428d8, 0x00162766, 0x00d6f038, 0x026a3433, 0x000d64b9}}}, + {X: Field{[10]uint32{0x022b1f41, 0x01227ffd, 0x0050f0af, 0x00eb6482, 0x02e2cb80, 0x03e643ad, 0x0028e921, 0x03f1bf5b, 0x0373d16b, 0x00203c8b}}, Y: Field{[10]uint32{0x03503b28, 0x02f5df9e, 0x02d682a1, 0x00471c9b, 0x00370e67, 0x0133d360, 0x03e11fd2, 0x01d2f01c, 0x01d3c5ee, 0x0021c529}}}, + {X: Field{[10]uint32{0x020c897d, 0x021efebf, 0x03535fc8, 0x001f6748, 0x03007c31, 0x02e5bf82, 0x0070a58a, 0x014fe10d, 0x02e9e86e, 0x0012628a}}, Y: Field{[10]uint32{0x0001bb53, 0x033b4e99, 0x0209ec3c, 0x02754ee1, 0x037ec380, 0x02acc207, 0x020f6516, 0x01078509, 0x02b373e8, 0x0011eaa7}}}, + {X: Field{[10]uint32{0x033a010e, 0x0377cc0e, 0x03b6d960, 0x026a009d, 0x028e9c06, 0x029e31d1, 0x012c5427, 0x03861329, 0x024cd14c, 0x001806bd}}, Y: Field{[10]uint32{0x02b7fa18, 0x00734833, 0x00d59916, 0x026c00ef, 0x0156dd57, 0x00b21fbd, 0x0346c273, 0x01db4046, 0x023fca15, 0x000a4029}}}, + {X: Field{[10]uint32{0x0174a25b, 0x00d07fcb, 0x019849a1, 0x03c41775, 0x03957f2b, 0x008aa9a0, 0x018b06a8, 0x032f12b5, 0x00f07b2f, 0x0023ecb8}}, Y: Field{[10]uint32{0x01070aa4, 0x01a32d1d, 0x016e6b7c, 0x032427db, 0x0306137d, 0x0357e0ab, 0x03386f75, 0x01f3aac6, 0x03508d79, 0x001f3608}}}, + {X: Field{[10]uint32{0x0269e6d9, 0x03962bda, 0x0282c9bd, 0x02bebbcc, 0x0083468e, 0x01cb18ef, 0x01a14980, 0x0053a2d5, 0x000f0e9d, 0x000cdb5e}}, Y: Field{[10]uint32{0x023d2261, 0x008c8529, 0x00fb00b7, 0x01e7d3f8, 0x02ac3e66, 0x03f4061e, 0x02eba682, 0x02fb9ae3, 0x0004be45, 0x00024b44}}}, + {X: Field{[10]uint32{0x00d5872d, 0x011fbea4, 0x021a5e4e, 0x000f338f, 0x02b06343, 0x02c0eaba, 0x00d2cbdf, 0x021c113e, 0x0321f4d5, 0x00141eb1}}, Y: Field{[10]uint32{0x007174d9, 0x0348b20c, 0x02f0e917, 0x0254e72a, 0x009ba53c, 0x01ee0f58, 0x00550939, 0x00175e84, 0x018de7db, 0x002e268e}}}, + {X: Field{[10]uint32{0x033ba343, 0x01a22a51, 0x009a046e, 0x0132fa86, 0x00992c60, 0x019b004b, 0x0171026f, 0x03ee58a4, 0x02c13bb7, 0x00310b73}}, Y: Field{[10]uint32{0x014f7bb5, 0x007380b9, 0x0064be3c, 0x03b00d4d, 0x018fe010, 0x0104e4a7, 0x021bfe7c, 0x008f2e80, 0x0331a532, 0x0022a8dd}}}, + {X: Field{[10]uint32{0x02866a2c, 0x010651ca, 0x00417d9f, 0x02d9400e, 0x00857eed, 0x03144212, 0x026b5c45, 0x024e8b57, 0x02c3cd60, 0x002c0ba8}}, Y: Field{[10]uint32{0x03a5527c, 0x027049cb, 0x01bf86ac, 0x03a31d69, 0x03ed1d8e, 0x033f3a4e, 0x037c5058, 0x0243186e, 0x0050cea1, 0x003aed17}}}, + {X: Field{[10]uint32{0x0370d84b, 0x005f117b, 0x02db151e, 0x010566df, 0x0185626d, 0x03aad0ed, 0x03dc2c9a, 0x03b4b89c, 0x03d29f20, 0x003d3464}}, Y: Field{[10]uint32{0x02dd0974, 0x03946586, 0x027e7280, 0x01b1847a, 0x0101f84b, 0x0133695e, 0x013f8cf1, 0x00d28b12, 0x023f19b8, 0x002f6866}}}, + {X: Field{[10]uint32{0x025f1bb0, 0x01fed93f, 0x02857eef, 0x02ec7fdb, 0x03cc84f6, 0x0340c0b4, 0x0059b9e4, 0x0318add6, 0x00eb19ea, 0x0021d037}}, Y: Field{[10]uint32{0x03c6ca49, 0x023eda39, 0x01d1b1d9, 0x03780522, 0x00f2f151, 0x03ad4887, 0x01d5b6e7, 0x008168b8, 0x02b04783, 0x00029ca7}}}, + {X: Field{[10]uint32{0x00fcc9cb, 0x017a88e1, 0x03f6c92a, 0x0098da4e, 0x0050aec6, 0x011273a2, 0x010bc940, 0x027c2364, 0x024a85a2, 0x001e7b11}}, Y: Field{[10]uint32{0x02f53b39, 0x039a3a83, 0x03a2cd44, 0x01131896, 0x03a1d7c5, 0x0216aeb8, 0x02d476d0, 0x0342ca6a, 0x00f5b52e, 0x001df45c}}}, + {X: Field{[10]uint32{0x0207fceb, 0x03bf338c, 0x01238847, 0x03011622, 0x006fb3aa, 0x0157abf5, 0x000e29b2, 0x02edc72f, 0x00d5dd54, 0x0013c406}}, Y: Field{[10]uint32{0x03e7dd8c, 0x00bd938e, 0x0222224a, 0x0364b505, 0x03a64531, 0x01c7ef8e, 0x029b2a02, 0x030b9dce, 0x01e5d23c, 0x0030ca06}}}, + {X: Field{[10]uint32{0x03e969a1, 0x00181efe, 0x00eb033a, 0x02ae05e0, 0x00e53768, 0x032a1735, 0x0325de68, 0x03a17f76, 0x01362094, 0x0037efc6}}, Y: Field{[10]uint32{0x0380e563, 0x025f876b, 0x0067193d, 0x02eb82df, 0x00a2ca3a, 0x00cb7af3, 0x005f1e49, 0x00870cab, 0x035933ba, 0x00097a82}}}, + {X: Field{[10]uint32{0x01226649, 0x02ed06a1, 0x034f9b67, 0x01c41505, 0x010940a3, 0x02184912, 0x01805f10, 0x01a20cb0, 0x02c002c3, 0x00061319}}, Y: Field{[10]uint32{0x00662eaf, 0x03fb1f7e, 0x03487ec4, 0x016ea442, 0x00736f81, 0x03814c39, 0x034a24c1, 0x031e453e, 0x0244f1cf, 0x0033d8ff}}}, + {X: Field{[10]uint32{0x03043686, 0x01043d43, 0x022e0a0f, 0x0027d40c, 0x03ede9de, 0x02090b90, 0x01a8a51a, 0x03813b8e, 0x0206d386, 0x0036aacd}}, Y: Field{[10]uint32{0x0011718a, 0x01dc63b5, 0x015e5dbb, 0x0208ea75, 0x00fbb2b6, 0x03a3dba3, 0x010d0ac4, 0x01f441bf, 0x01c40ebe, 0x000302e8}}}, + {X: Field{[10]uint32{0x0204530f, 0x0330ce5f, 0x00dfa89d, 0x0059a408, 0x0026b0e2, 0x021234cd, 0x00219d1f, 0x03c94ae8, 0x034a5311, 0x0002a21f}}, Y: Field{[10]uint32{0x01edeace, 0x023de7e7, 0x03195287, 0x0113bb34, 0x02a5b4fa, 0x03680773, 0x029bff3e, 0x032b1fd0, 0x00bd8c37, 0x00169f01}}}, + {X: Field{[10]uint32{0x002d207a, 0x008fd85f, 0x0158d281, 0x001eca12, 0x024784a9, 0x0216bef3, 0x01dbfd5a, 0x03ae6135, 0x0264409f, 0x0006cc55}}, Y: Field{[10]uint32{0x03a205bb, 0x02715a2a, 0x01c37311, 0x02eaa66f, 0x0384eea5, 0x0165ff55, 0x001d4634, 0x02396961, 0x007cba34, 0x000a5cb3}}}, + {X: Field{[10]uint32{0x01fe4984, 0x037e85ac, 0x00d1f019, 0x027e0bb2, 0x016727e6, 0x035fa119, 0x035de1e0, 0x00355b57, 0x03d427c3, 0x000552b7}}, Y: Field{[10]uint32{0x020372b5, 0x0265dd4f, 0x02079981, 0x0312487c, 0x03882477, 0x01fe94b7, 0x01f61baa, 0x009e7912, 0x028a324b, 0x0016ea1b}}}, + {X: Field{[10]uint32{0x00480994, 0x03b03562, 0x02f9494f, 0x027ed130, 0x02585fe8, 0x02c6bcf0, 0x00df417c, 0x03057eca, 0x01f9fe55, 0x0037af5a}}, Y: Field{[10]uint32{0x03f9708d, 0x038f35d5, 0x03c9ef8d, 0x03fe4d17, 0x03002564, 0x03f3d85a, 0x031b8314, 0x01b493a2, 0x002155c1, 0x00263633}}}, + {X: Field{[10]uint32{0x03baf9e2, 0x01124abb, 0x0066b71d, 0x00f7edcb, 0x01e0316c, 0x01563119, 0x0055fc09, 0x0153e68a, 0x00902a7c, 0x0027f34d}}, Y: Field{[10]uint32{0x03f5d14c, 0x029a47fd, 0x00be51cf, 0x03a09926, 0x03143e1d, 0x0356ae99, 0x029e49c8, 0x02905a27, 0x0160c2b5, 0x0029eb10}}}, + {X: Field{[10]uint32{0x0143a727, 0x02fe9ce2, 0x019bbfda, 0x024bbb83, 0x00586fd7, 0x03cf79f8, 0x00fb1d2d, 0x02ba6566, 0x01f6fe4b, 0x001672b3}}, Y: Field{[10]uint32{0x020df035, 0x0348d045, 0x01acfed8, 0x031034de, 0x03624599, 0x02471213, 0x00d349e1, 0x02b45b1d, 0x01347b3e, 0x001f1cc3}}}, + {X: Field{[10]uint32{0x03fb226c, 0x008bfb01, 0x00821677, 0x01cd01ea, 0x0134e6b3, 0x012b398d, 0x03a4c9ec, 0x00765f6c, 0x03d1fb29, 0x0017386a}}, Y: Field{[10]uint32{0x023b7526, 0x0037a3c0, 0x01d3f763, 0x01bc149d, 0x030a39de, 0x03fdea06, 0x02110255, 0x0025cf62, 0x0234b407, 0x002af091}}}, + {X: Field{[10]uint32{0x0207d73c, 0x02c6a8c0, 0x01baf3af, 0x03433856, 0x01e70897, 0x02cc053d, 0x02680015, 0x002d3dbb, 0x028ebd0a, 0x003de0d8}}, Y: Field{[10]uint32{0x0039af61, 0x027e0273, 0x031df284, 0x03ee0ecb, 0x026c7a6e, 0x03d7efcc, 0x0268b6b1, 0x02e23252, 0x00fd5b96, 0x0034190e}}}, + {X: Field{[10]uint32{0x037ba0b3, 0x01659614, 0x0200c6c1, 0x011dcbaf, 0x029a988d, 0x011074ba, 0x007130db, 0x00a7b8d7, 0x02bccc72, 0x001e0c3e}}, Y: Field{[10]uint32{0x0338fa7f, 0x02aab746, 0x0157e835, 0x02249fcb, 0x0378acc8, 0x0200e8cf, 0x01c901fa, 0x0345e0f5, 0x018e6aea, 0x00127a2d}}}, + {X: Field{[10]uint32{0x03cba9e1, 0x014bead7, 0x03482062, 0x01270a3d, 0x006416d5, 0x03e692a4, 0x024399ee, 0x004a1886, 0x010ea890, 0x00324c0e}}, Y: Field{[10]uint32{0x0161cfce, 0x00443bec, 0x0019704d, 0x01f36aac, 0x023bab13, 0x0052d2f2, 0x014e8fdd, 0x0062883d, 0x03da3d06, 0x003e83a1}}}, + {X: Field{[10]uint32{0x029cd28a, 0x0308f736, 0x018b52d0, 0x02c2979d, 0x03ba0924, 0x017c03b0, 0x0149876e, 0x00645dbe, 0x00672057, 0x000a836a}}, Y: Field{[10]uint32{0x00907647, 0x0342fc3f, 0x01dd1975, 0x007b3413, 0x0390c1fa, 0x01b7c473, 0x01b4870f, 0x00256565, 0x00fc6935, 0x0025b341}}}, + {X: Field{[10]uint32{0x0046fc83, 0x00dd2cc5, 0x01c53256, 0x033b7072, 0x00f2bef6, 0x00e5a389, 0x036e92e0, 0x01606bd5, 0x01e260da, 0x003d9220}}, Y: Field{[10]uint32{0x027c8b94, 0x02dcbd43, 0x01ac3863, 0x0027e28b, 0x022aacec, 0x01247e95, 0x02f833db, 0x019fd10f, 0x005b660b, 0x002022a5}}}, + {X: Field{[10]uint32{0x0381f052, 0x005fe66a, 0x00341330, 0x02205597, 0x00c181e4, 0x00243c78, 0x03cea175, 0x017c34e8, 0x013305ec, 0x0025c2f6}}, Y: Field{[10]uint32{0x02e9fc48, 0x0050c7c6, 0x00a796ca, 0x036ce519, 0x038eb30b, 0x01730066, 0x03b6658d, 0x01dd2bf2, 0x030fe284, 0x00134749}}}, + {X: Field{[10]uint32{0x00c4779a, 0x0056f3b9, 0x03073354, 0x021824a0, 0x032c0588, 0x0172b465, 0x023ecfdf, 0x01507d1c, 0x033124c4, 0x0037fa52}}, Y: Field{[10]uint32{0x0140e23b, 0x0169eae5, 0x00b1c185, 0x03da2c65, 0x01d047af, 0x034d00f1, 0x03afe8c5, 0x0181aa83, 0x0253d547, 0x00330a0f}}}, + {X: Field{[10]uint32{0x018df800, 0x00e8e7a1, 0x007e3bf3, 0x03463dc1, 0x0216c8bd, 0x021cdf43, 0x0230bbad, 0x0396523e, 0x0379673a, 0x003c604c}}, Y: Field{[10]uint32{0x007d294a, 0x011102ea, 0x015d2ed5, 0x03630921, 0x0220bfb9, 0x002d347c, 0x0008d50d, 0x00b6fe6c, 0x01a6139a, 0x002b34b0}}}, + {X: Field{[10]uint32{0x01423740, 0x001810db, 0x00f3ec21, 0x025e70da, 0x008890ec, 0x03036c32, 0x0192bd01, 0x006f7d44, 0x0156fb63, 0x003d3ef0}}, Y: Field{[10]uint32{0x03b7149f, 0x02409b07, 0x03f4b4f6, 0x00eb7d21, 0x039cfccd, 0x0061d2eb, 0x01faf91e, 0x037bfd0c, 0x00f05b07, 0x000f2c23}}}, + {X: Field{[10]uint32{0x0393de6d, 0x00893881, 0x01bbed36, 0x0179d150, 0x00cb9267, 0x033116a0, 0x03a9a725, 0x0275c929, 0x00e83b07, 0x00049369}}, Y: Field{[10]uint32{0x008d00e7, 0x02d26195, 0x01e6ac6f, 0x00c7a819, 0x001cd155, 0x029d6555, 0x02200fb2, 0x0032e935, 0x0066f12e, 0x000f9c00}}}, + {X: Field{[10]uint32{0x038d1138, 0x033a586d, 0x00c16428, 0x00b40ab2, 0x006c2b11, 0x019ae5f4, 0x02045bb2, 0x01e09877, 0x01c4455e, 0x001d25c8}}, Y: Field{[10]uint32{0x015a3032, 0x01567f01, 0x03b87086, 0x0250e7c1, 0x01025bc5, 0x00cc9b1f, 0x015b237d, 0x00c70bfa, 0x02eda3f3, 0x0009d55a}}}, + {X: Field{[10]uint32{0x0227a028, 0x026a46dd, 0x00e979ff, 0x02eff531, 0x00257676, 0x0143efd6, 0x0060dfed, 0x023d5487, 0x02490aa5, 0x0018b372}}, Y: Field{[10]uint32{0x015c37b5, 0x03b58156, 0x00fbbd10, 0x02229c52, 0x0317c4a6, 0x03d0cfa3, 0x021528b4, 0x0043a9fb, 0x039ae16d, 0x0022f526}}}, + {X: Field{[10]uint32{0x006478c6, 0x01692c5a, 0x01344789, 0x03a205d6, 0x011cd3a1, 0x03b4592c, 0x013b2275, 0x00ea985b, 0x00f139b1, 0x00193594}}, Y: Field{[10]uint32{0x01fa5c2f, 0x00f61fcf, 0x03a426b8, 0x0195ee56, 0x02f9e2a0, 0x02590d00, 0x039595b7, 0x00b61fcc, 0x012af757, 0x0037bbb9}}}, + {X: Field{[10]uint32{0x009ab59d, 0x0327d280, 0x0365a1ec, 0x017b6c00, 0x0237cb93, 0x02149b7d, 0x017c17cd, 0x00dbbcd0, 0x025566c6, 0x0034228f}}, Y: Field{[10]uint32{0x000dc103, 0x02b91889, 0x02a549c9, 0x03f49090, 0x00e9ed32, 0x00e15b69, 0x00d35023, 0x0145d8ff, 0x01c75eec, 0x000b6c12}}}, + {X: Field{[10]uint32{0x00f20d89, 0x0237c38c, 0x007c6f4b, 0x020926e9, 0x02971547, 0x006166bf, 0x0220d626, 0x031426be, 0x005a35bc, 0x0021d85c}}, Y: Field{[10]uint32{0x01b726ae, 0x03c37e2b, 0x03f64436, 0x027af8b6, 0x010fd43b, 0x02011a82, 0x029c3db7, 0x02588924, 0x01eebb02, 0x002cd309}}}, + {X: Field{[10]uint32{0x006f5f85, 0x0278468f, 0x03307c4e, 0x03d038de, 0x020e35f6, 0x0139f39f, 0x02cc3175, 0x00990c51, 0x01334ce2, 0x0038d14e}}, Y: Field{[10]uint32{0x0065d97d, 0x03417075, 0x03bf700a, 0x01eccda8, 0x031afdde, 0x00aed144, 0x022a0caf, 0x0206fbfc, 0x038a941e, 0x001cfb85}}}, + {X: Field{[10]uint32{0x00ca917b, 0x00d8208d, 0x01e27fac, 0x02fe5783, 0x02246b36, 0x036ff3a3, 0x00e6f11f, 0x029f9eb2, 0x012f6609, 0x0020e246}}, Y: Field{[10]uint32{0x032b636f, 0x030de303, 0x019bec68, 0x01db94f2, 0x0267c889, 0x033ec6a8, 0x027b681c, 0x023b0a75, 0x03a55044, 0x00255c1c}}}, + {X: Field{[10]uint32{0x03c5d387, 0x0186bd30, 0x02b8de5a, 0x03ede893, 0x03bbf287, 0x025ff618, 0x0278029a, 0x03897f8b, 0x00c067bb, 0x0022ff5c}}, Y: Field{[10]uint32{0x03f952fb, 0x0251d03c, 0x031fd5d8, 0x0069bb6e, 0x008b5900, 0x03c93f3b, 0x01b1d644, 0x01973568, 0x026bee72, 0x0038b9b1}}}, + {X: Field{[10]uint32{0x02ff257d, 0x0164f839, 0x01269fdb, 0x0055a21d, 0x03eaf820, 0x02601482, 0x021582d0, 0x002ec566, 0x019aa05f, 0x00297426}}, Y: Field{[10]uint32{0x0023635a, 0x01970d31, 0x0050bf9c, 0x03469910, 0x00fe6d27, 0x00b392cd, 0x02b62b36, 0x015d999d, 0x03205ef0, 0x0038d365}}}, + {X: Field{[10]uint32{0x015043ce, 0x01eeaa97, 0x02544282, 0x02164b53, 0x01176451, 0x0227ff67, 0x03942e30, 0x03222d41, 0x01a7b949, 0x0011391e}}, Y: Field{[10]uint32{0x013a7087, 0x013b7788, 0x02e23250, 0x01deb84b, 0x01e2b10d, 0x01295c2a, 0x02714162, 0x03118ec2, 0x00298c12, 0x001ee1bb}}}, + {X: Field{[10]uint32{0x012aa558, 0x01b38f4d, 0x013c4317, 0x02355648, 0x023f37bb, 0x002af432, 0x02e0251e, 0x01e045c1, 0x0143d979, 0x001837b2}}, Y: Field{[10]uint32{0x01fcaab8, 0x0042759a, 0x03d508bc, 0x013e331b, 0x0116b076, 0x01a614cd, 0x0181448d, 0x0167db14, 0x01f4a31c, 0x000b71a2}}}, + {X: Field{[10]uint32{0x01f7709b, 0x039eacc0, 0x03b24af7, 0x027f9906, 0x00d4ab82, 0x016506e6, 0x013c5c53, 0x0127983e, 0x01385b54, 0x00172963}}, Y: Field{[10]uint32{0x017cd575, 0x019607b0, 0x03eb74d9, 0x0213574f, 0x00945d9d, 0x03ce7770, 0x00ce0907, 0x01bd2044, 0x02e980eb, 0x0020abee}}}, + {X: Field{[10]uint32{0x018b031c, 0x02641234, 0x01138100, 0x028f34ca, 0x03b9a23e, 0x01afe1b0, 0x009cf3d2, 0x0358326c, 0x027ea1b1, 0x002ddd65}}, Y: Field{[10]uint32{0x0040fef1, 0x001025c2, 0x030b7120, 0x023211bd, 0x0366f12d, 0x0373eb73, 0x01885c4a, 0x004155c3, 0x029becfa, 0x0034adc5}}}, + {X: Field{[10]uint32{0x00220f96, 0x01ade690, 0x0044e92e, 0x03047e8e, 0x03a23bc4, 0x026a8175, 0x003595fb, 0x00bd840f, 0x00f67d60, 0x001cf635}}, Y: Field{[10]uint32{0x0000ce3d, 0x015d6ac9, 0x0285d331, 0x00f55a3f, 0x00bb17fb, 0x03b3453b, 0x02185309, 0x03fb96fa, 0x022cffc9, 0x002fdc8a}}}, + {X: Field{[10]uint32{0x01182b75, 0x02c46026, 0x024d61e7, 0x01151230, 0x008b1e97, 0x0271b7c3, 0x012bcce7, 0x01e08805, 0x01f9f49f, 0x003a0413}}, Y: Field{[10]uint32{0x02137361, 0x00494fe0, 0x0102396b, 0x02087175, 0x03e14fc6, 0x03e57fee, 0x03b0da00, 0x00afac6f, 0x0139ec8f, 0x00370bf5}}}, + {X: Field{[10]uint32{0x006113e6, 0x03a65715, 0x03209e89, 0x00912403, 0x01777e55, 0x00586039, 0x01449b6d, 0x010cb238, 0x02f6fb6c, 0x003b35cb}}, Y: Field{[10]uint32{0x0226e135, 0x03593ade, 0x029e0e00, 0x00f89a04, 0x00425291, 0x00516180, 0x009f518e, 0x02ea6794, 0x015d358f, 0x00059c5c}}}, + {X: Field{[10]uint32{0x00fc36cc, 0x001c1429, 0x02455a99, 0x0041fa75, 0x01464bfe, 0x029b5f0d, 0x01fc6b5f, 0x026f45bc, 0x00cfbe82, 0x00038ed7}}, Y: Field{[10]uint32{0x028044f5, 0x01ea1f68, 0x03fa331e, 0x03c042d7, 0x02296cb5, 0x016d9c7e, 0x017a2c9b, 0x03069b78, 0x039b5471, 0x00339eae}}}, + {X: Field{[10]uint32{0x03107734, 0x0286ae49, 0x01c5ed7c, 0x013c97e2, 0x0041c1ce, 0x013af48b, 0x03e75f7f, 0x024753ad, 0x0202ffab, 0x003cd646}}, Y: Field{[10]uint32{0x00fa4b3d, 0x015f0ae5, 0x01c1018a, 0x01aef8bb, 0x03cf0474, 0x00c52eda, 0x03c7d535, 0x02e49921, 0x0211f2ba, 0x000d168b}}}, + {X: Field{[10]uint32{0x0345c635, 0x006b65f2, 0x021a6550, 0x034c89eb, 0x00c61349, 0x03f16a54, 0x01184f9f, 0x02b654df, 0x005dae54, 0x003292c1}}, Y: Field{[10]uint32{0x03c1d806, 0x01312d35, 0x00d72eaf, 0x015833a7, 0x014660f4, 0x0110747a, 0x02f3c24b, 0x02fb28d4, 0x017e255e, 0x0038c3e0}}}, + {X: Field{[10]uint32{0x0341ea38, 0x00a6ed9b, 0x02a72dfd, 0x00819d6a, 0x02300947, 0x01daa57d, 0x00ebdb7b, 0x03a987ee, 0x034054a9, 0x003df315}}, Y: Field{[10]uint32{0x02556eac, 0x00b207ac, 0x009900f5, 0x02ffd4b5, 0x03b3dd7f, 0x03811af8, 0x0275aeb5, 0x00936460, 0x018cfc54, 0x0027518f}}}, + {X: Field{[10]uint32{0x016ab6c2, 0x007dc37b, 0x029f876b, 0x03ec9eda, 0x01b4fd9b, 0x034d3a2a, 0x024bbef7, 0x038fe3b9, 0x0379fba3, 0x003dd6d7}}, Y: Field{[10]uint32{0x00a43faa, 0x00c3b024, 0x014f9d40, 0x019be168, 0x037e0e82, 0x01d159df, 0x0048e362, 0x02ddedcb, 0x00bc5c3f, 0x000882d0}}}, + {X: Field{[10]uint32{0x019cd450, 0x023e9303, 0x00fde0e8, 0x0191cd69, 0x0189d86a, 0x03428e63, 0x03d89b6a, 0x008da989, 0x03a25060, 0x000aa8d9}}, Y: Field{[10]uint32{0x0041fc32, 0x02512336, 0x038f6e82, 0x03ffa6bb, 0x021e70ec, 0x0135df61, 0x00a802bc, 0x006c69d9, 0x00250249, 0x000affb7}}}, + {X: Field{[10]uint32{0x0141620f, 0x00df0e28, 0x0325765a, 0x039ec7ac, 0x03a1078c, 0x01609ec1, 0x01a1e221, 0x00f3db9f, 0x01c11178, 0x003fdfd2}}, Y: Field{[10]uint32{0x00702733, 0x026b3d95, 0x00bead51, 0x02177d91, 0x03a488c5, 0x0049477e, 0x00a8b542, 0x00163a2f, 0x009e2e48, 0x001a5543}}}, + {X: Field{[10]uint32{0x003aa39f, 0x000a82d7, 0x016016fd, 0x02d1799e, 0x0076d017, 0x034faee4, 0x01f7338f, 0x03d3b291, 0x03581164, 0x000c7414}}, Y: Field{[10]uint32{0x0163f575, 0x03364aa6, 0x011fe6bc, 0x003b46ff, 0x03d4d3ea, 0x0387e348, 0x022fa902, 0x01ffc411, 0x019b7217, 0x003c490c}}}, + {X: Field{[10]uint32{0x026a3bd0, 0x023ed7df, 0x006eabb8, 0x034ead7c, 0x030c8a02, 0x0236a6b5, 0x00bf2f30, 0x000fb28b, 0x02ddfd12, 0x001babc3}}, Y: Field{[10]uint32{0x03e05f08, 0x0242719c, 0x016d4125, 0x01d28c56, 0x02815a0c, 0x0028ee0e, 0x00521a01, 0x0251d127, 0x01012d8e, 0x00364cdb}}}, + {X: Field{[10]uint32{0x02da1347, 0x006ea5df, 0x011b9e9a, 0x0320472e, 0x0168e759, 0x03d7ea23, 0x03943acf, 0x006adff0, 0x01197799, 0x0002e569}}, Y: Field{[10]uint32{0x01e5ef23, 0x0208afdb, 0x0287f533, 0x0054dbba, 0x029758bd, 0x0168bfe9, 0x018fbfe7, 0x0112296a, 0x035f446d, 0x00233cb2}}}, + {X: Field{[10]uint32{0x011427e8, 0x03071608, 0x02eeada6, 0x03d5ae43, 0x021fd386, 0x03a0139f, 0x031dc212, 0x03b6ebce, 0x01d48ce5, 0x001394c0}}, Y: Field{[10]uint32{0x01b9f0d9, 0x00297600, 0x016b76fb, 0x0364ddb6, 0x00dcabaa, 0x02f675a1, 0x012f684c, 0x03f6cb87, 0x003de169, 0x003d40fb}}}, + {X: Field{[10]uint32{0x00f49cd2, 0x0080cf0f, 0x017a3914, 0x0152b587, 0x02fc7c2b, 0x01270b42, 0x01f92cdc, 0x006d0dc5, 0x01e50903, 0x0013f46a}}, Y: Field{[10]uint32{0x024adcb1, 0x02169b23, 0x031602c8, 0x02fa2e1d, 0x022d99c9, 0x033bda52, 0x034b43be, 0x0196f0ea, 0x011cab01, 0x001cfb30}}}, + {X: Field{[10]uint32{0x00257c84, 0x00402648, 0x00b86745, 0x03e8ba29, 0x00384070, 0x02363eb8, 0x03b7fa4a, 0x010fe97a, 0x0065b325, 0x0019d01a}}, Y: Field{[10]uint32{0x03c62008, 0x021625ae, 0x0271f3fd, 0x0173bcf4, 0x03e829a4, 0x00c89f7d, 0x00451f5e, 0x0382e53d, 0x02d593a4, 0x000ff766}}}, + {X: Field{[10]uint32{0x006569e4, 0x024a9969, 0x01cb4e49, 0x02b46723, 0x00de7e8d, 0x036b1028, 0x03dcfa0e, 0x016f9bbc, 0x01aed6ee, 0x00052e55}}, Y: Field{[10]uint32{0x022daf70, 0x0029757e, 0x011ebed6, 0x03097aa7, 0x017d9f31, 0x0184d4f7, 0x001eff67, 0x00fe0612, 0x00b62182, 0x00352e48}}}, + {X: Field{[10]uint32{0x0339ae42, 0x0297c88c, 0x00fb722c, 0x00d318da, 0x004003e4, 0x0390bf48, 0x02a0b3ff, 0x0357eb7e, 0x03bc5608, 0x00053ca0}}, Y: Field{[10]uint32{0x02db7397, 0x015df3e7, 0x008c37c1, 0x00c0aebb, 0x03bf0ba6, 0x002a1ff6, 0x004d4bfb, 0x03f4ff19, 0x023dc3ae, 0x002c9057}}}, + {X: Field{[10]uint32{0x03bd1c1f, 0x00ce8c87, 0x03d098e7, 0x01701637, 0x005416a5, 0x03e032ea, 0x02275be7, 0x038829b9, 0x00677d3c, 0x000ff783}}, Y: Field{[10]uint32{0x02daaac6, 0x01740cc6, 0x0389a115, 0x00962498, 0x009a018b, 0x02fa87c2, 0x01782f90, 0x0064b252, 0x03dc610f, 0x0026e3bd}}}, + {X: Field{[10]uint32{0x02d17267, 0x00cca883, 0x01247df5, 0x01310776, 0x00b993bf, 0x020a4150, 0x01c74dd4, 0x00f417c5, 0x0269df5f, 0x00271579}}, Y: Field{[10]uint32{0x024979f6, 0x02d3829b, 0x00810981, 0x00c8b498, 0x018c6b3c, 0x00dd5ff0, 0x01abd783, 0x01d9945d, 0x00e930c9, 0x0008f6c3}}}, + {X: Field{[10]uint32{0x02968d16, 0x01a2a4a0, 0x02ee7d85, 0x030d2cfe, 0x02506d2d, 0x003d05d1, 0x00da60b3, 0x006835ba, 0x00dfae14, 0x0002f7a1}}, Y: Field{[10]uint32{0x02b3ab04, 0x03ce3112, 0x00dcb468, 0x03cdb0a6, 0x02900374, 0x0269b1a1, 0x024697b9, 0x01877f9c, 0x0214ff13, 0x001168cc}}}, + {X: Field{[10]uint32{0x019546a3, 0x00e76bf2, 0x030c0549, 0x021651ac, 0x01e5d970, 0x03183168, 0x0368f454, 0x030b2917, 0x014ab8f3, 0x0006500a}}, Y: Field{[10]uint32{0x00e3b81e, 0x025aed3b, 0x0386abfd, 0x009b9db8, 0x00848bc9, 0x01f186ec, 0x020ea767, 0x0318a879, 0x03993816, 0x00158fe7}}}, + {X: Field{[10]uint32{0x032ccb0e, 0x027f33ac, 0x00ad6682, 0x0358dcf3, 0x00757a34, 0x0348b60e, 0x00df92ea, 0x00f991f4, 0x01e0d0d1, 0x00375ba8}}, Y: Field{[10]uint32{0x0233c313, 0x00023c3b, 0x003fdd8e, 0x01f2a803, 0x00384b55, 0x012797fe, 0x03ad27fa, 0x03a2ca14, 0x01e36bf4, 0x0030063a}}}, + {X: Field{[10]uint32{0x037fbf19, 0x01a58596, 0x01ffec06, 0x00dd0b13, 0x00dc1047, 0x02f09ee1, 0x02656bfb, 0x01158b89, 0x03e8c784, 0x00195e11}}, Y: Field{[10]uint32{0x015f2df5, 0x03daad82, 0x001725b5, 0x02d39e69, 0x0242c6a4, 0x0292a6a2, 0x01beda90, 0x02b69240, 0x03b658b6, 0x00376437}}}, + {X: Field{[10]uint32{0x023dea6b, 0x0141acff, 0x00d3e352, 0x007ce5ae, 0x0349b8e7, 0x036de072, 0x02d26c2e, 0x0275ba41, 0x00b140be, 0x003edc09}}, Y: Field{[10]uint32{0x0308efdf, 0x03f28cba, 0x0061c5a0, 0x0014501c, 0x02fea360, 0x03746b11, 0x02d961e9, 0x008ca2da, 0x03f4e50b, 0x00379023}}}, + {X: Field{[10]uint32{0x01d8e8e0, 0x004cd434, 0x018dfa31, 0x0031268e, 0x00b3f2be, 0x034fa251, 0x0280179c, 0x02c9e74e, 0x000865a7, 0x000b4a70}}, Y: Field{[10]uint32{0x02efcf8f, 0x027648f6, 0x03ee992e, 0x0017c999, 0x0125c550, 0x02592791, 0x00027485, 0x01292996, 0x027aee70, 0x0032abc4}}}, + {X: Field{[10]uint32{0x03d5662d, 0x01f07314, 0x036326d8, 0x02269f0c, 0x02392685, 0x00f06f8e, 0x028d42ba, 0x00827d37, 0x007479b7, 0x0036da41}}, Y: Field{[10]uint32{0x03aa4e00, 0x01dddc3e, 0x0063c0b7, 0x02fca48b, 0x01c58c1f, 0x020f893a, 0x013ce32c, 0x021eaa64, 0x03e95c35, 0x002437a2}}}, + {X: Field{[10]uint32{0x0141697b, 0x011cd5b2, 0x03f0adf2, 0x021f33c4, 0x01723c70, 0x01635bf0, 0x0154ada2, 0x013c2abf, 0x006f922e, 0x00260194}}, Y: Field{[10]uint32{0x016bc237, 0x011684bc, 0x037c9252, 0x0125dec9, 0x01b97fef, 0x034c72b4, 0x0298eef3, 0x02e104dd, 0x0018a8ca, 0x00301f88}}}, + {X: Field{[10]uint32{0x00e40187, 0x02b9ebd8, 0x025eaae1, 0x03478cf4, 0x01661e0a, 0x023c5188, 0x011c1122, 0x0096b16c, 0x013fe6da, 0x002ae1a3}}, Y: Field{[10]uint32{0x00bf54ad, 0x0357c4cf, 0x001d4d47, 0x0222ef4c, 0x014b12c4, 0x015e9ff6, 0x01195ced, 0x02614068, 0x0298334a, 0x003b892d}}}, + {X: Field{[10]uint32{0x018dcda2, 0x03627bbf, 0x02f4931f, 0x019aafd9, 0x003122f3, 0x01095f8a, 0x0056be17, 0x023b9848, 0x03d19d2a, 0x0039d587}}, Y: Field{[10]uint32{0x02166d5a, 0x02a0004f, 0x0118d5a8, 0x0242281e, 0x0385bcb1, 0x0089edd6, 0x0366ea73, 0x01b63171, 0x034be365, 0x000814b9}}}, + {X: Field{[10]uint32{0x00f21e6c, 0x00b7e6fa, 0x0082083c, 0x0004e654, 0x017b562f, 0x02a1132d, 0x008f2e0f, 0x038c1ef8, 0x023d84bb, 0x0017c654}}, Y: Field{[10]uint32{0x0265d7fa, 0x039f105c, 0x02cb9d9b, 0x0109ba46, 0x00333775, 0x01c93ae2, 0x029ad2d5, 0x007778ab, 0x021628ee, 0x000ea5bf}}}, + {X: Field{[10]uint32{0x01c10cc1, 0x00df4a36, 0x03545698, 0x005c9571, 0x022fdcad, 0x015407bf, 0x022ec1dc, 0x026c4490, 0x02683c94, 0x00327e91}}, Y: Field{[10]uint32{0x03fd1dba, 0x008fb7b1, 0x03ffab5e, 0x00d1db51, 0x00b5b6e7, 0x03a380d2, 0x01dcd8d9, 0x0246b33c, 0x035d18f6, 0x0006aab9}}}, + {X: Field{[10]uint32{0x03eb8d8c, 0x02de4ec2, 0x02401b1a, 0x03505690, 0x011799b2, 0x024ee081, 0x03a084c3, 0x0061e733, 0x022a1e91, 0x00076a43}}, Y: Field{[10]uint32{0x009c0b63, 0x0134a3b2, 0x013322da, 0x03947d3f, 0x0274994e, 0x00ecff0c, 0x02cbae15, 0x0134e011, 0x006911ea, 0x000f4fdf}}}, + {X: Field{[10]uint32{0x031b3186, 0x03e26b7c, 0x029153e6, 0x026363d9, 0x03707e40, 0x02de11fd, 0x01504ac0, 0x0390c9af, 0x010f3851, 0x0031bf3c}}, Y: Field{[10]uint32{0x03a50ced, 0x029494e4, 0x00bff03e, 0x02bea726, 0x004e2705, 0x03e3b972, 0x036ea108, 0x018f61b8, 0x01f4a16a, 0x00342b22}}}, + {X: Field{[10]uint32{0x02378233, 0x035fd185, 0x02588fef, 0x01ac7e6d, 0x0003cf23, 0x00495eb8, 0x02b7d4ef, 0x0319f32d, 0x022eeb56, 0x0005415e}}, Y: Field{[10]uint32{0x004930c2, 0x012ec3f7, 0x010cf505, 0x0188be6a, 0x036f205a, 0x038f42a1, 0x01543ef5, 0x029ea312, 0x0130ccc0, 0x00136ead}}}, + {X: Field{[10]uint32{0x0308b20f, 0x039067c0, 0x01ea36d1, 0x02de300b, 0x0145bf1c, 0x001f77af, 0x027337dd, 0x02b039ba, 0x02e072d5, 0x000dfbab}}, Y: Field{[10]uint32{0x0361d506, 0x02458c3c, 0x0394aebb, 0x036efd68, 0x01a5761a, 0x00ca8e8f, 0x0077249a, 0x02a85067, 0x00965d9d, 0x002c3191}}}, + {X: Field{[10]uint32{0x0157745c, 0x009cd889, 0x03ebe61a, 0x022deb66, 0x01f1d6ce, 0x024a2f71, 0x031cd96d, 0x03438cf1, 0x03f83a8b, 0x0016881e}}, Y: Field{[10]uint32{0x00f54dad, 0x031d9998, 0x0213819e, 0x0004c8f1, 0x03ee8789, 0x015d1044, 0x01494ac1, 0x026da8a9, 0x0357fadc, 0x000eb32d}}}, + {X: Field{[10]uint32{0x03abd139, 0x034e6efe, 0x006d1642, 0x002241c1, 0x02f6b2ee, 0x0206fbed, 0x0391271e, 0x038c9568, 0x016a1a0f, 0x003f8237}}, Y: Field{[10]uint32{0x0181ef40, 0x00319380, 0x030d6c52, 0x00984de6, 0x03665d23, 0x027c8130, 0x02f1b436, 0x0208bb93, 0x02d13535, 0x0010b0d0}}}, + {X: Field{[10]uint32{0x00706111, 0x032e665e, 0x01daca39, 0x03800f47, 0x01d6d859, 0x0201132b, 0x003edcf3, 0x036ee992, 0x02c908df, 0x002df498}}, Y: Field{[10]uint32{0x00d798e8, 0x01ff91ca, 0x01689ee9, 0x0044194f, 0x0230bb4c, 0x00606d6e, 0x0007c8f5, 0x02ce5da8, 0x0350b308, 0x00258218}}}, + {X: Field{[10]uint32{0x00130c86, 0x01be008d, 0x00407683, 0x015f731e, 0x027d354b, 0x006eb7d6, 0x0297d7c0, 0x00ddd4eb, 0x032e23b3, 0x0012c4aa}}, Y: Field{[10]uint32{0x023c450e, 0x03ee3c3c, 0x005c0f52, 0x027926b9, 0x012bc964, 0x007f9605, 0x0211e73a, 0x022fd00b, 0x020d9f70, 0x00106753}}}, + {X: Field{[10]uint32{0x00e88dac, 0x00331276, 0x034f74f3, 0x02addd42, 0x008f362b, 0x02f311f1, 0x009570c8, 0x0333692d, 0x0282a96e, 0x003f1b49}}, Y: Field{[10]uint32{0x00beedbb, 0x0090eb3d, 0x0184808a, 0x03c25800, 0x000694af, 0x024165fe, 0x0322612e, 0x01160347, 0x01273026, 0x0006bd59}}}, + {X: Field{[10]uint32{0x02607e8b, 0x026d9547, 0x00f0632e, 0x0303910b, 0x025e07e6, 0x012bf6e7, 0x0342c40c, 0x03ae8151, 0x03a9a189, 0x0031ee70}}, Y: Field{[10]uint32{0x001822ab, 0x02010bfc, 0x03e30fc5, 0x02e35370, 0x02ef6b38, 0x03069517, 0x0084cd19, 0x01d36d88, 0x02772f22, 0x0016eda0}}}, + {X: Field{[10]uint32{0x00dfd956, 0x001be9d4, 0x01627034, 0x030aedbe, 0x0246c761, 0x03b50c1a, 0x02339ba3, 0x029cbca6, 0x034230de, 0x003ae934}}, Y: Field{[10]uint32{0x01237cee, 0x0172fd77, 0x0106d215, 0x02961e4d, 0x01d31b01, 0x001a1033, 0x01a17477, 0x01e2cb8f, 0x020f23d2, 0x003f385e}}}, + {X: Field{[10]uint32{0x02c04155, 0x0295a7e0, 0x02cc8944, 0x03d1b366, 0x013595dc, 0x02b7b0a1, 0x034358c6, 0x0351c4d6, 0x01c02177, 0x002934db}}, Y: Field{[10]uint32{0x01f00281, 0x00ddfd20, 0x03ad1013, 0x01770beb, 0x0365f3e4, 0x016983f7, 0x038fd0fb, 0x006f838d, 0x037963b2, 0x002168a5}}}, + {X: Field{[10]uint32{0x02109ba2, 0x002b255d, 0x00a16906, 0x02a939b5, 0x020eb165, 0x0379ceaf, 0x035bf56f, 0x03eb878f, 0x0063ae8b, 0x001245b4}}, Y: Field{[10]uint32{0x003f22ee, 0x026d3513, 0x006564ae, 0x013d9d8e, 0x003b2b0b, 0x014dadf2, 0x027a08ca, 0x010357e5, 0x03034a0b, 0x0029e459}}}, + {X: Field{[10]uint32{0x02edd046, 0x02b90483, 0x03f97ecb, 0x01e61605, 0x009de019, 0x0012ad27, 0x038f1a44, 0x0180c217, 0x0310b296, 0x001d8736}}, Y: Field{[10]uint32{0x02193db7, 0x00bce88b, 0x010cf2ee, 0x03aa376a, 0x039789f0, 0x022079fe, 0x038f50ab, 0x015175cb, 0x0320763b, 0x00074455}}}, + {X: Field{[10]uint32{0x01c64ea3, 0x03f28ae3, 0x019d2e05, 0x0053a377, 0x02860ff0, 0x0242f04f, 0x005541b4, 0x023a4b7e, 0x01704d71, 0x00035e89}}, Y: Field{[10]uint32{0x034cb90c, 0x023d0f94, 0x00acec15, 0x0216a8eb, 0x026102db, 0x02f1b7b1, 0x000e035f, 0x019d9dc7, 0x039d2134, 0x00179152}}}, + {X: Field{[10]uint32{0x014d3bbe, 0x00290fcf, 0x025dfeb2, 0x02653716, 0x020a6b9a, 0x00a5d6ef, 0x02bcb063, 0x0314aec3, 0x004f7962, 0x000abd80}}, Y: Field{[10]uint32{0x001a14f3, 0x03825776, 0x01933d91, 0x006d4c8e, 0x02be1deb, 0x01a31965, 0x0108e3eb, 0x0330540c, 0x01e226f8, 0x001a622a}}}, + {X: Field{[10]uint32{0x01504255, 0x0023d72a, 0x00959741, 0x0061d6e9, 0x03ca805d, 0x034cc613, 0x027571e5, 0x00218044, 0x00e53bab, 0x002a49d0}}, Y: Field{[10]uint32{0x02d2379f, 0x01d7adb1, 0x0244e68d, 0x0214436a, 0x0096d49c, 0x00eaa138, 0x02dfd3d0, 0x01adc419, 0x011e2eb7, 0x00177ca1}}}, + {X: Field{[10]uint32{0x00014939, 0x01fb661c, 0x02057bcc, 0x01c0341d, 0x02768567, 0x00e8323a, 0x0287c449, 0x0229ad82, 0x021a510d, 0x00243425}}, Y: Field{[10]uint32{0x00aa545d, 0x01d80eb3, 0x034d3f8d, 0x00be16d2, 0x037c13dc, 0x008e1ab4, 0x036f7a8a, 0x00c2219a, 0x013c1c91, 0x001d351d}}}, + {X: Field{[10]uint32{0x00ecd12b, 0x02f98441, 0x00ded249, 0x029b28ce, 0x038dd5c6, 0x00b8b820, 0x02bfa279, 0x029813d8, 0x03eaf2e3, 0x0003394a}}, Y: Field{[10]uint32{0x015c009e, 0x0220020b, 0x031a1a49, 0x002a3e3f, 0x03dd0867, 0x0097cf66, 0x00244449, 0x0028adf2, 0x0273738a, 0x002a1a77}}}, + {X: Field{[10]uint32{0x03cd05c4, 0x038d43fc, 0x02be7cc3, 0x0105b3c5, 0x01122154, 0x0301ab12, 0x0139a471, 0x03f34bff, 0x01c210e3, 0x002672a3}}, Y: Field{[10]uint32{0x03bc4982, 0x03925ab7, 0x02142c6c, 0x03a00244, 0x024550fb, 0x03c1c82f, 0x0326309e, 0x0370b1af, 0x0280131a, 0x001e021e}}}, + {X: Field{[10]uint32{0x0202d1c6, 0x03b18428, 0x0211ab51, 0x0285f639, 0x00cbfcc6, 0x008b7ae4, 0x03ff1f43, 0x01ef1741, 0x00c29f5a, 0x002f910b}}, Y: Field{[10]uint32{0x03c084a2, 0x01584a1d, 0x03734111, 0x00978c92, 0x02fb3d1f, 0x02b3d6ec, 0x028f2c01, 0x0364d200, 0x02c4680e, 0x0018943c}}}, + {X: Field{[10]uint32{0x00ec8e54, 0x01c2ec39, 0x00e65677, 0x03e6e3e0, 0x03e75d95, 0x006e6c53, 0x030346b5, 0x02c04084, 0x01f4037f, 0x0014fd7d}}, Y: Field{[10]uint32{0x00c62f93, 0x0331774a, 0x020f9cb1, 0x01c4ca14, 0x0224c0d5, 0x00f8b870, 0x00dd2ef2, 0x00cfd6a8, 0x0353c6e7, 0x0023694a}}}, + {X: Field{[10]uint32{0x008c4d6c, 0x039b6a97, 0x0155411d, 0x006461bb, 0x02a897ab, 0x00d295bd, 0x0399e3a1, 0x03affdf5, 0x01650e90, 0x00081b39}}, Y: Field{[10]uint32{0x02a75804, 0x02a6a5a9, 0x006754dc, 0x00f0e2b8, 0x00aaa5d5, 0x01e754c8, 0x03ec5c2e, 0x01b729f7, 0x0122bd2d, 0x0030bfd7}}}, + {X: Field{[10]uint32{0x0073f443, 0x037cab1c, 0x03744faa, 0x0083308f, 0x0002176a, 0x009b4ad5, 0x01f2a727, 0x00beae04, 0x03bb87ee, 0x0034772f}}, Y: Field{[10]uint32{0x01d17db9, 0x003e5a3b, 0x0350c187, 0x024f87d0, 0x00f71da6, 0x03e0cdf6, 0x02fc27e3, 0x002edef2, 0x023b4180, 0x000041b1}}}, + {X: Field{[10]uint32{0x03749328, 0x005ce4b6, 0x002f6db1, 0x0343bc5f, 0x020a516f, 0x01bff26a, 0x039d4322, 0x01dae87a, 0x0173c543, 0x003486a8}}, Y: Field{[10]uint32{0x0074e424, 0x0131a098, 0x00b24772, 0x0293b5d3, 0x002326f9, 0x00e9d52c, 0x00f79de6, 0x02035981, 0x01f4e014, 0x000df3d7}}}, + {X: Field{[10]uint32{0x011fa3d2, 0x03553adf, 0x0203178d, 0x020fe387, 0x0215e563, 0x032edf39, 0x01acfbe2, 0x01a69d5a, 0x0024a22c, 0x00148d2c}}, Y: Field{[10]uint32{0x03c000cb, 0x02258c22, 0x02ddfd91, 0x02569d2b, 0x02b41038, 0x0296cd0e, 0x03c3b042, 0x02d4b58a, 0x0042651d, 0x000afab9}}}, + {X: Field{[10]uint32{0x01412f64, 0x010704cd, 0x00b6a509, 0x033d7b9b, 0x01f5048d, 0x01662253, 0x009dbd4f, 0x0086ae9c, 0x00759f3e, 0x00279ba6}}, Y: Field{[10]uint32{0x01757ea8, 0x009a418c, 0x034a92dc, 0x00ce9f93, 0x01431110, 0x03811c62, 0x00dd1690, 0x00b96909, 0x0199e38f, 0x000ad9c0}}}, + {X: Field{[10]uint32{0x0343ae45, 0x03ca4a21, 0x017fcd28, 0x01ce0c96, 0x0289232c, 0x00b7a6ec, 0x01f8a927, 0x0239dc43, 0x02959a71, 0x002105b8}}, Y: Field{[10]uint32{0x0133d139, 0x01c487c4, 0x004db4c7, 0x01d1d931, 0x0220732a, 0x03347c00, 0x01b79044, 0x01023b60, 0x0202801b, 0x001bbd24}}}, + {X: Field{[10]uint32{0x013561a5, 0x02389eb5, 0x0029bb10, 0x01ca7a8d, 0x0027462f, 0x014ae8b7, 0x02405ebe, 0x00ecbcc9, 0x03a7048a, 0x00214a93}}, Y: Field{[10]uint32{0x0162e520, 0x0332bce9, 0x02ac6a81, 0x03de3418, 0x02770b99, 0x032fad9c, 0x00e441c2, 0x02708dac, 0x0046ee0d, 0x000f81b0}}}, + {X: Field{[10]uint32{0x0277c1bd, 0x00a50b8d, 0x00c5d328, 0x02872c8d, 0x01fa6097, 0x03020f3b, 0x03b876d3, 0x015afae4, 0x01a02dbe, 0x000a2037}}, Y: Field{[10]uint32{0x031bb43a, 0x01991043, 0x019d3bf9, 0x01e103a4, 0x023d371f, 0x00dc37e8, 0x015366c5, 0x01aed3fa, 0x021092d4, 0x0037ec3a}}}, + {X: Field{[10]uint32{0x01819c65, 0x027fe27c, 0x006f0770, 0x01549d72, 0x0037b535, 0x02699da8, 0x03dbf869, 0x0235ff00, 0x00029e82, 0x0032dbef}}, Y: Field{[10]uint32{0x02062266, 0x00589de1, 0x02bdace5, 0x03ef816e, 0x00ce9161, 0x032ddb2e, 0x00d50c21, 0x01ce6457, 0x019a3657, 0x003f138b}}}, + {X: Field{[10]uint32{0x001afebe, 0x00c17bfe, 0x021615f6, 0x02962a1c, 0x030abc76, 0x001b43b0, 0x03241066, 0x00d0e086, 0x035bff1c, 0x002021ee}}, Y: Field{[10]uint32{0x0024ce72, 0x0305f782, 0x00353d9b, 0x01fa513d, 0x0223a443, 0x03a6918c, 0x01c5030a, 0x0300ae3d, 0x007aa602, 0x0015e2ca}}}, + {X: Field{[10]uint32{0x02d3a33a, 0x028a3ed0, 0x01482653, 0x0274493b, 0x00f8ae82, 0x0145f396, 0x030def22, 0x032431eb, 0x00bc30f2, 0x000da7d5}}, Y: Field{[10]uint32{0x01b59d16, 0x009855ee, 0x01b40b45, 0x02f71330, 0x0361f466, 0x01658850, 0x03c97aef, 0x01f8cb18, 0x02af35af, 0x0002e3cb}}}, + {X: Field{[10]uint32{0x03ed8f7d, 0x00f54cc7, 0x01eb6edd, 0x00a1af92, 0x03df2946, 0x03f6dab1, 0x03b2448f, 0x03e1c54e, 0x004c01b2, 0x0021ef93}}, Y: Field{[10]uint32{0x020effb1, 0x01bd3af2, 0x00a2adfe, 0x02a19a4e, 0x0071fdc8, 0x00735474, 0x031ec542, 0x0302855d, 0x00bc6386, 0x001fbd1d}}}, + {X: Field{[10]uint32{0x0214715e, 0x00fe8a47, 0x01cfbc01, 0x006d7bb4, 0x0280393f, 0x00e7b6f8, 0x0310eeb2, 0x016faa30, 0x00f018f7, 0x001ed99e}}, Y: Field{[10]uint32{0x038b1fd7, 0x006a2c7c, 0x02890c18, 0x01f4f754, 0x03d98570, 0x02a86efc, 0x008275d2, 0x039a69ce, 0x00e2666e, 0x001e3a2e}}}, + {X: Field{[10]uint32{0x0160f135, 0x009ce52c, 0x00aed90d, 0x01b5acdf, 0x0377d282, 0x03ee8e22, 0x01608f58, 0x027808aa, 0x02419672, 0x000227b1}}, Y: Field{[10]uint32{0x00786cff, 0x025055e9, 0x021f80ac, 0x02c36466, 0x035e3030, 0x0077ac62, 0x01ee5a74, 0x01ce1c06, 0x0142108d, 0x00177bcc}}}, + {X: Field{[10]uint32{0x02177f8e, 0x01b4698d, 0x0131199e, 0x0275907e, 0x008b8374, 0x01e30feb, 0x022acbab, 0x00242cea, 0x03393769, 0x000b2fb1}}, Y: Field{[10]uint32{0x03de8886, 0x024820fc, 0x03bad2ca, 0x0332240b, 0x0367fea7, 0x013c9aba, 0x034a007f, 0x00b56b2c, 0x03e757ad, 0x000c5039}}}, + {X: Field{[10]uint32{0x01946908, 0x033c3baf, 0x03cf02eb, 0x0061198f, 0x0229d576, 0x000c082b, 0x027b116d, 0x02962d4f, 0x03cda2d6, 0x0019e33b}}, Y: Field{[10]uint32{0x026a3491, 0x02f40a03, 0x01713314, 0x0310cc70, 0x0118834f, 0x00caca90, 0x00d56ee9, 0x023bbcdf, 0x01e01329, 0x003d16fa}}}, + {X: Field{[10]uint32{0x033ec0df, 0x03c608b1, 0x01524b43, 0x01cf2230, 0x015073b0, 0x01337c04, 0x012305a9, 0x013b391a, 0x0278adcc, 0x002376f4}}, Y: Field{[10]uint32{0x00fc5b0c, 0x024ec5e0, 0x0102268b, 0x016e8cec, 0x005d2d67, 0x00a31de1, 0x029ea1ae, 0x031b232a, 0x02dd3c52, 0x00241443}}}, + {X: Field{[10]uint32{0x03e36626, 0x00743035, 0x00739304, 0x01e2abdc, 0x00607d78, 0x008e0983, 0x03149c3d, 0x03fd7c8a, 0x0082b162, 0x0025cafc}}, Y: Field{[10]uint32{0x004087dc, 0x01416f93, 0x01324797, 0x0093408d, 0x026eca9f, 0x03a42910, 0x01b64f43, 0x02f29366, 0x03baf61c, 0x0011a16c}}}, + {X: Field{[10]uint32{0x03c97230, 0x03315f2e, 0x0280f540, 0x0182f218, 0x01d8c1f7, 0x0145348f, 0x02801c54, 0x012ae5f7, 0x01526660, 0x0010abc3}}, Y: Field{[10]uint32{0x0299ce38, 0x024afb05, 0x03b89771, 0x01a26378, 0x01cced06, 0x025edd35, 0x017160bd, 0x00a7b50d, 0x03898c90, 0x00015926}}}, + {X: Field{[10]uint32{0x03bb30ac, 0x0188fcf5, 0x010a9fa5, 0x00853010, 0x021748ee, 0x02686831, 0x02138bca, 0x01b47639, 0x03708729, 0x00014d99}}, Y: Field{[10]uint32{0x015cac1d, 0x02e3f63b, 0x01f31fd8, 0x00b96564, 0x027c297b, 0x01cb642e, 0x0219c2f6, 0x02834d49, 0x0260786b, 0x00381a0e}}}, + {X: Field{[10]uint32{0x0039fc24, 0x0157047f, 0x002559de, 0x02d2b648, 0x017d5d0a, 0x033903a4, 0x00308d6b, 0x02c63fc1, 0x0284e85b, 0x00280ed8}}, Y: Field{[10]uint32{0x00785493, 0x0356a3fa, 0x035644ca, 0x016f8052, 0x02c07300, 0x024e76e2, 0x03e7235a, 0x030d208f, 0x0282c22c, 0x0009ce7b}}}, + {X: Field{[10]uint32{0x02b66e97, 0x00b893c9, 0x03a63733, 0x0326648c, 0x01f5801d, 0x02893df7, 0x01980550, 0x014e9af6, 0x02d7268a, 0x000bce53}}, Y: Field{[10]uint32{0x03918d88, 0x03d3375c, 0x014138d3, 0x027d7415, 0x000e49d0, 0x009af130, 0x03d3714a, 0x02ea1b46, 0x033ee934, 0x002d4ad3}}}, + {X: Field{[10]uint32{0x0133f8ab, 0x01684b1c, 0x016ebbb3, 0x03b7bc2d, 0x027740bc, 0x0047bd7f, 0x020c19a6, 0x014df8ea, 0x0010527e, 0x00245dcc}}, Y: Field{[10]uint32{0x029fb5b6, 0x012053fa, 0x0396500f, 0x017333ee, 0x01b097ae, 0x02ef0dad, 0x021063ab, 0x0120249f, 0x03b328b6, 0x001a3e4d}}}, + {X: Field{[10]uint32{0x004af615, 0x018035a4, 0x00b24763, 0x03154280, 0x0028486b, 0x0354a77e, 0x020c1aeb, 0x022bc5e8, 0x01bfcddc, 0x000a146f}}, Y: Field{[10]uint32{0x00cb1356, 0x016cb5b7, 0x017585d1, 0x0320edcc, 0x02ee2acf, 0x00cc0d75, 0x006c3760, 0x009eb9b5, 0x0085702e, 0x0034c0b0}}}, + {X: Field{[10]uint32{0x014bdfef, 0x0136920c, 0x029c25d3, 0x018d69bc, 0x038be3d3, 0x02d1f965, 0x0210b791, 0x0267c515, 0x03ab0254, 0x003a61b5}}, Y: Field{[10]uint32{0x03de35a6, 0x00f0cc51, 0x01c165f5, 0x00b4c710, 0x01cfdb18, 0x00441156, 0x02c63b96, 0x03054043, 0x00dcb3b3, 0x0003418e}}}, + {X: Field{[10]uint32{0x038bfc03, 0x019238a3, 0x02099b2e, 0x0329fefe, 0x00ab44da, 0x020c7609, 0x001c5e0d, 0x02cb38b7, 0x032c5639, 0x002f1176}}, Y: Field{[10]uint32{0x03213e32, 0x03e6d481, 0x028842c1, 0x02020981, 0x0079a805, 0x02a7d4f8, 0x02327400, 0x0226b527, 0x03b127b2, 0x001764f8}}}, + {X: Field{[10]uint32{0x00a8dfc6, 0x012632d4, 0x022fd667, 0x004b29ec, 0x01849ef5, 0x0278a440, 0x027b4c84, 0x020274b1, 0x027e47d9, 0x00105175}}, Y: Field{[10]uint32{0x0113f096, 0x0085ce91, 0x00ea9492, 0x001f58a4, 0x03daeae0, 0x0036a993, 0x008604d9, 0x01fe0a5c, 0x00fc2a4f, 0x00151c7d}}}, + {X: Field{[10]uint32{0x00686825, 0x035d03d7, 0x02fa3c1a, 0x021f9e96, 0x02427e30, 0x01ce373a, 0x015314aa, 0x02755aec, 0x037f4cd7, 0x000b455f}}, Y: Field{[10]uint32{0x016fc1c0, 0x03c7a88a, 0x034eeeab, 0x0084e9c8, 0x02962a4e, 0x01d9aed1, 0x027a29a2, 0x027d2e53, 0x03187615, 0x0030713c}}}, + {X: Field{[10]uint32{0x033933ba, 0x035e5869, 0x0187b361, 0x025a089a, 0x03d6e896, 0x0304aa06, 0x03e26cb0, 0x002cb977, 0x02847704, 0x000bd098}}, Y: Field{[10]uint32{0x0144075e, 0x0120f460, 0x024bd45e, 0x010a1e7c, 0x00a384f9, 0x01d54cbe, 0x03cf601c, 0x00a1e7bf, 0x020d141b, 0x002f7384}}}, + {X: Field{[10]uint32{0x03bf527f, 0x007fff0e, 0x0220ab8a, 0x0110dfa8, 0x03bf9f8f, 0x03bc8f29, 0x003c9c0e, 0x004c0b9a, 0x03a76cc9, 0x002d0673}}, Y: Field{[10]uint32{0x02929517, 0x009478ea, 0x00dba3c0, 0x015b8f34, 0x00a911e9, 0x012201ad, 0x0091a70b, 0x00906792, 0x014e290f, 0x002ee1a5}}}, + {X: Field{[10]uint32{0x0125236f, 0x035cb552, 0x018dcae2, 0x0026c0da, 0x012b17bd, 0x0037b64e, 0x02f2913f, 0x00593f1e, 0x02f95734, 0x00336d29}}, Y: Field{[10]uint32{0x02c8e7aa, 0x03e39baa, 0x025ffc9e, 0x00f013c4, 0x01d57c96, 0x01265914, 0x0100c47d, 0x03d75c39, 0x0236bd1b, 0x00227b68}}}, + {X: Field{[10]uint32{0x0008c256, 0x02003e3d, 0x00a3e321, 0x013088cf, 0x00a12a8c, 0x000e4bfa, 0x026f2f15, 0x031128cf, 0x0351a45a, 0x003b53a9}}, Y: Field{[10]uint32{0x030ffef2, 0x01018d25, 0x0264acaf, 0x018e62b3, 0x00a296d9, 0x0013644b, 0x01266d4d, 0x00d26aba, 0x01a74a2b, 0x00271fa7}}}, + {X: Field{[10]uint32{0x00fbf5d3, 0x03b3428f, 0x0287c96d, 0x000be9e6, 0x0384a74b, 0x037c229c, 0x00ccfcd1, 0x018f0a0c, 0x0138fdf9, 0x0026c1bf}}, Y: Field{[10]uint32{0x03226416, 0x0277801a, 0x020d4eb2, 0x028ca86c, 0x023ede27, 0x0136b435, 0x004ba3cd, 0x018056bb, 0x021ce7ee, 0x003a1991}}}, + {X: Field{[10]uint32{0x02f6ae75, 0x01b94846, 0x004ef516, 0x012f7869, 0x02c2b789, 0x001c0815, 0x0213f1ee, 0x03346a5f, 0x001eefc1, 0x0037c452}}, Y: Field{[10]uint32{0x022b7e02, 0x0152ae88, 0x03ad4a83, 0x0185c5ea, 0x0180c766, 0x039cf8b3, 0x02e1f24d, 0x027e87af, 0x00563542, 0x00285046}}}, + {X: Field{[10]uint32{0x02a3c9f5, 0x0280cb44, 0x0284523d, 0x00569462, 0x0146e4df, 0x0201f186, 0x03bc65de, 0x00fecf41, 0x01010b1f, 0x003e0ca3}}, Y: Field{[10]uint32{0x01ca6216, 0x003c4033, 0x01df0d5e, 0x0051e9c2, 0x02de1749, 0x0172a7af, 0x029a6d0b, 0x0351e272, 0x00747746, 0x0038a76f}}}, + {X: Field{[10]uint32{0x013fff86, 0x03c024d3, 0x01e461fc, 0x01ea4b82, 0x01ff0d1b, 0x02b313ed, 0x02135900, 0x008c07e6, 0x03bdb7fc, 0x000f8ebe}}, Y: Field{[10]uint32{0x02b6ebd6, 0x0098849b, 0x00742f0f, 0x0070fb0a, 0x01a5c2af, 0x01866bac, 0x004c8d09, 0x007146f5, 0x03e1b982, 0x0007f1fd}}}, + {X: Field{[10]uint32{0x03f86125, 0x007aa6c7, 0x0166074d, 0x02013154, 0x0078ede8, 0x0274cd6d, 0x0019f8b6, 0x02005673, 0x02ea6834, 0x002ab45f}}, Y: Field{[10]uint32{0x01365257, 0x033e77e7, 0x008e8ed6, 0x02749ad2, 0x00dfa174, 0x0187ba44, 0x00f45bf3, 0x02276d9f, 0x038cebab, 0x0003a64e}}}, + {X: Field{[10]uint32{0x010ea35c, 0x03a65ca4, 0x0072d37c, 0x02e3eca4, 0x00286442, 0x0389a85e, 0x00f44b6f, 0x031a1bfa, 0x03195515, 0x00084fee}}, Y: Field{[10]uint32{0x0152a852, 0x0225a77b, 0x0136218e, 0x016189e0, 0x03d68c39, 0x0261d880, 0x00ee5771, 0x03d2ecb4, 0x011b7df7, 0x00125ee5}}}, + {X: Field{[10]uint32{0x030120fa, 0x024de40d, 0x021a2924, 0x011c24a0, 0x03eba91b, 0x022e31e9, 0x013321ec, 0x020678fa, 0x02a578ed, 0x00335fdc}}, Y: Field{[10]uint32{0x01bb1148, 0x03d7f3d1, 0x03ce2d8f, 0x02464fa5, 0x02ca4eac, 0x02441df9, 0x02c537d9, 0x003cb3e8, 0x00709928, 0x0028f547}}}, + {X: Field{[10]uint32{0x027f3b51, 0x0248f82d, 0x01b19068, 0x03061e3e, 0x038240ae, 0x0346a78b, 0x023a28a1, 0x00a4e7e6, 0x00c700a7, 0x001c28d8}}, Y: Field{[10]uint32{0x01710259, 0x001554ab, 0x021b73eb, 0x0261b4bd, 0x00dd175c, 0x01a82ee3, 0x024ae36b, 0x036f08ba, 0x007c53a4, 0x00287670}}}, + {X: Field{[10]uint32{0x01b5e46a, 0x01d98048, 0x02d337a0, 0x03f67369, 0x00eedc35, 0x027a72fa, 0x021dd199, 0x00ad983e, 0x015b4f8e, 0x00151298}}, Y: Field{[10]uint32{0x028451e5, 0x0142cd6e, 0x026bd751, 0x0269cc23, 0x03d7ba7a, 0x0376725f, 0x0286aecb, 0x03235d94, 0x01b9c76f, 0x001d749b}}}, + {X: Field{[10]uint32{0x02c8acef, 0x030d19e3, 0x03c92a01, 0x03dcdb08, 0x00f8b779, 0x01356d72, 0x019b2657, 0x01cf5ebc, 0x039f76a0, 0x00108635}}, Y: Field{[10]uint32{0x02cfb28e, 0x0007ae6f, 0x00bdaf2c, 0x0157881f, 0x0187e603, 0x02ca1308, 0x01c05f4e, 0x00ed7f99, 0x02314907, 0x001a057d}}}, + {X: Field{[10]uint32{0x0269b0a9, 0x00bf06a8, 0x03b3864a, 0x01767936, 0x0203deca, 0x018d7e0e, 0x03337598, 0x02b30628, 0x02381a82, 0x001ab689}}, Y: Field{[10]uint32{0x02da6c08, 0x03388a57, 0x033bae8a, 0x03e2d854, 0x012e77b6, 0x022d7e10, 0x0105f32b, 0x0149bd83, 0x02da65f7, 0x0014f4d5}}}, + {X: Field{[10]uint32{0x0118b09e, 0x019863b8, 0x03579336, 0x0291e04f, 0x018bd46e, 0x030e0b10, 0x0118e987, 0x026965d5, 0x0101d9f2, 0x0017ea67}}, Y: Field{[10]uint32{0x03fc3b39, 0x003a0b4c, 0x034cd6fc, 0x000b6fb0, 0x02f15f66, 0x0260994a, 0x00e381e4, 0x02e06f73, 0x023838de, 0x00351e74}}}, + {X: Field{[10]uint32{0x00d76f6e, 0x000656d1, 0x03e4412d, 0x0002cadf, 0x030bbb4a, 0x03fbe5b4, 0x02676d72, 0x019eadba, 0x017634cc, 0x00331bb5}}, Y: Field{[10]uint32{0x03bf820c, 0x002bd8bd, 0x03e94f52, 0x00343692, 0x03dd801b, 0x020d0a13, 0x009e5f15, 0x0266e2ab, 0x015ad509, 0x0002c570}}}, + {X: Field{[10]uint32{0x00ffceb4, 0x00bb8e90, 0x03ddfec3, 0x01e761d1, 0x01ff4476, 0x00289adb, 0x0310bf89, 0x03a8ff7a, 0x03db5323, 0x00393343}}, Y: Field{[10]uint32{0x0220e1f5, 0x021a8c34, 0x00c48d5d, 0x01ef107e, 0x00e2caa8, 0x02dd8a71, 0x02af718d, 0x010d5d95, 0x00c8ba9c, 0x003ef6d0}}}, + {X: Field{[10]uint32{0x0388a8af, 0x02df3626, 0x025686af, 0x03b1e9d5, 0x030b3c1f, 0x008d1a0c, 0x01e3ca1a, 0x02e4a6b0, 0x022aba51, 0x001dff5c}}, Y: Field{[10]uint32{0x01e98505, 0x0243d6cf, 0x006919cf, 0x016cb1ec, 0x006b5b55, 0x037d2edd, 0x0378ee31, 0x0272d13c, 0x01e10d6e, 0x00340946}}}, + {X: Field{[10]uint32{0x017a41dd, 0x010630a6, 0x033e2665, 0x008e57fd, 0x006291e5, 0x00a67d3e, 0x03ca57bf, 0x00f51e74, 0x03bca9dd, 0x00134e47}}, Y: Field{[10]uint32{0x00ce899e, 0x03afc96d, 0x02fce1a9, 0x0310e7b1, 0x03e5d4a3, 0x024f10fc, 0x03e9fcd5, 0x0181aee4, 0x0033b55e, 0x0017327b}}}, + {X: Field{[10]uint32{0x03084e97, 0x00e9115c, 0x022ba83f, 0x03e20586, 0x012eb232, 0x0324bfa0, 0x019d63c3, 0x01ee1172, 0x004617b1, 0x001d02f1}}, Y: Field{[10]uint32{0x00355464, 0x00952bfe, 0x00c67883, 0x00aa640a, 0x02fb1074, 0x004c061d, 0x0317481c, 0x02559dc5, 0x006e0f4f, 0x0003f63b}}}, + {X: Field{[10]uint32{0x01b46e5c, 0x004396c0, 0x00392b2d, 0x03106f73, 0x00c6aa12, 0x0333b40c, 0x02fd8d60, 0x02114d6e, 0x021cadeb, 0x00309630}}, Y: Field{[10]uint32{0x01171d31, 0x01884e57, 0x022af4cb, 0x029d7b0f, 0x02b73646, 0x0083797c, 0x01d08afa, 0x02f5fdce, 0x037f3e60, 0x001f37c0}}}, + {X: Field{[10]uint32{0x00130d44, 0x03fee0c9, 0x01768dbe, 0x01786fff, 0x01fac22a, 0x00327299, 0x0180261c, 0x0135742f, 0x0069733a, 0x0023f220}}, Y: Field{[10]uint32{0x02fc946e, 0x03d2a804, 0x00a95954, 0x0298e3c3, 0x01ca5bf0, 0x0073b9a4, 0x0137ba74, 0x0010b553, 0x014bf88c, 0x0010846a}}}, + {X: Field{[10]uint32{0x0096ad4c, 0x0186ee43, 0x027c967a, 0x038ccae0, 0x00f5152d, 0x03a674c5, 0x03b0e0bc, 0x007091fe, 0x021a4032, 0x0033d8bb}}, Y: Field{[10]uint32{0x02c4a3fe, 0x00259007, 0x015a19bb, 0x00d99043, 0x02e61373, 0x01f70348, 0x01978c07, 0x01ee352f, 0x03c3e64f, 0x0018a129}}}, + {X: Field{[10]uint32{0x009f8ba7, 0x00103915, 0x019d06c0, 0x032bf5bf, 0x00bb00b3, 0x026da458, 0x00884431, 0x01dd83b3, 0x038a4d44, 0x0014cd47}}, Y: Field{[10]uint32{0x037f6b83, 0x014af34d, 0x02a0a163, 0x02e23027, 0x00c7c1cb, 0x015220e1, 0x01c148fd, 0x039bfdd5, 0x02193816, 0x0020e113}}}, + {X: Field{[10]uint32{0x0106bb0c, 0x00cd2287, 0x000a9e17, 0x01eb4b98, 0x03baa015, 0x02b3a501, 0x010e1f62, 0x02464653, 0x03ceee2c, 0x00280818}}, Y: Field{[10]uint32{0x03146339, 0x03061ba7, 0x01de05f4, 0x02c0401f, 0x03fcdaee, 0x011122a2, 0x01b40eac, 0x00fd4b6a, 0x01b55565, 0x0018c118}}}, + {X: Field{[10]uint32{0x01d35660, 0x02a35bf8, 0x018575a6, 0x027a546e, 0x02c360c0, 0x0259822a, 0x034f3741, 0x005d91c9, 0x01cc25de, 0x001c2f2f}}, Y: Field{[10]uint32{0x03461d74, 0x02c3d3b6, 0x02b64a90, 0x00c252a0, 0x003a1c74, 0x02787503, 0x035e719a, 0x01673a02, 0x019b7163, 0x000ef56f}}}, + {X: Field{[10]uint32{0x02dc8fc7, 0x004b466a, 0x01fff138, 0x0305d055, 0x0054b161, 0x02945778, 0x03b1fe52, 0x030f01be, 0x017783cf, 0x00037e2b}}, Y: Field{[10]uint32{0x00069569, 0x031cd560, 0x0060444e, 0x006c4993, 0x01af3840, 0x002df2e6, 0x034ff20a, 0x036c3274, 0x00f60416, 0x002f1024}}}, + {X: Field{[10]uint32{0x000a30f9, 0x02a76795, 0x009ed777, 0x011f8154, 0x028788df, 0x014b55be, 0x02fff3a4, 0x0260017c, 0x01ccef39, 0x0009413a}}, Y: Field{[10]uint32{0x0390612a, 0x0167de5c, 0x00a51116, 0x013b6da4, 0x036fd651, 0x02d7f60c, 0x03f4d2fa, 0x023bf2bd, 0x02a2c6f4, 0x001cf141}}}, + {X: Field{[10]uint32{0x03c97025, 0x005068d6, 0x03a61571, 0x00320678, 0x0218a9ce, 0x0225e7f3, 0x02a6fa56, 0x000cd0e9, 0x03241c92, 0x00093b81}}, Y: Field{[10]uint32{0x00bd7b8a, 0x00909f2c, 0x00bf6ba2, 0x00580bec, 0x03fa0c68, 0x035fd364, 0x0140a6cc, 0x0213a1a2, 0x02cd605b, 0x003b990b}}}, + {X: Field{[10]uint32{0x023929b3, 0x01b6465e, 0x03093e1c, 0x00ac9700, 0x014961e1, 0x00825fcd, 0x00d8eb11, 0x0301698f, 0x00e09665, 0x0007ab57}}, Y: Field{[10]uint32{0x0156fcc3, 0x012a9b5c, 0x0009dc2f, 0x03d77b9c, 0x007284b5, 0x00775c48, 0x0032fbea, 0x03312ac7, 0x035da1ab, 0x00060037}}}, + {X: Field{[10]uint32{0x0205d507, 0x01e247ba, 0x009c098e, 0x03bcb97a, 0x03160c69, 0x020e21d2, 0x020b0dcd, 0x013e3e40, 0x03f22608, 0x0011f3cb}}, Y: Field{[10]uint32{0x01fb7d48, 0x03e948b5, 0x03516cf8, 0x03723720, 0x00bca2ef, 0x00e19919, 0x004d0d2c, 0x016bfc41, 0x03df129b, 0x0028d034}}}, + {X: Field{[10]uint32{0x02d6cbdd, 0x038e7110, 0x03e75b04, 0x02a0fe69, 0x0151f050, 0x0391d293, 0x018bb8ea, 0x01254a88, 0x039b8e2e, 0x0010193e}}, Y: Field{[10]uint32{0x0035de10, 0x0221b76e, 0x03d2b9c7, 0x030346b7, 0x0118ea66, 0x02b77383, 0x013e02aa, 0x0064c24b, 0x0076a2ef, 0x003fe73b}}}, + {X: Field{[10]uint32{0x0381904e, 0x038cd4fe, 0x000d222d, 0x0101a766, 0x03cdd70a, 0x029b5007, 0x01e0150b, 0x008340c8, 0x00d6e58e, 0x0020e2b2}}, Y: Field{[10]uint32{0x015614bc, 0x015222b6, 0x027105f9, 0x03f03a24, 0x01b1ef24, 0x01054ccc, 0x01a6b251, 0x036efdee, 0x03962909, 0x00264e9b}}}, + {X: Field{[10]uint32{0x0202f266, 0x03a6d7b8, 0x033855fc, 0x01caf133, 0x035aedee, 0x03b3d650, 0x016ea260, 0x010f48d3, 0x0183189d, 0x002978db}}, Y: Field{[10]uint32{0x01822c55, 0x02c7251e, 0x03fe954a, 0x02d79fae, 0x03dfc2d1, 0x01050d68, 0x012933fb, 0x00ee2677, 0x003ce25c, 0x001e300b}}}, + {X: Field{[10]uint32{0x03ba72c9, 0x0323f8c7, 0x035725dd, 0x01ea6d47, 0x015ad79e, 0x0235bdeb, 0x03312095, 0x03134cd3, 0x00bcd357, 0x00278903}}, Y: Field{[10]uint32{0x0111f06b, 0x0245cb2d, 0x030eb672, 0x00433be7, 0x0068cc5e, 0x00c2cf27, 0x01476b7b, 0x02818bb0, 0x025ced60, 0x002ba8d2}}}, + {X: Field{[10]uint32{0x02dc2eba, 0x036bb0ed, 0x020c7ea8, 0x016a182f, 0x02dfc9ed, 0x03b91e89, 0x022b91d1, 0x014e0170, 0x0246bb31, 0x002b46c1}}, Y: Field{[10]uint32{0x02dd2083, 0x02e65564, 0x018bb353, 0x02a5b4c3, 0x03a298da, 0x0285661c, 0x0110c9ee, 0x0314246a, 0x01a22499, 0x003b8b98}}}, + {X: Field{[10]uint32{0x030ec72b, 0x02df34d6, 0x020cc35c, 0x01d288da, 0x02fa12df, 0x0047b2a9, 0x00d8c7f0, 0x03d92954, 0x008911d8, 0x0013dec2}}, Y: Field{[10]uint32{0x01bb21e3, 0x00549713, 0x01d993e3, 0x0143c778, 0x0129b942, 0x035fe1a4, 0x019ffac8, 0x01f862d3, 0x001b0d29, 0x0024c6bd}}}, + {X: Field{[10]uint32{0x03d3a7ee, 0x00d48f24, 0x01870d2d, 0x01d0d5a5, 0x02834d02, 0x002ec4be, 0x03ba8747, 0x023cf24f, 0x0170e410, 0x0036aca8}}, Y: Field{[10]uint32{0x0173ae4d, 0x002cbef1, 0x0251e7bb, 0x01bc5d19, 0x03293a5c, 0x002338d6, 0x02ecb24d, 0x0004377a, 0x02cfc37f, 0x00098bc4}}}, + {X: Field{[10]uint32{0x03cf39be, 0x031d2128, 0x03a317ab, 0x021f12f3, 0x02d499f6, 0x0046d699, 0x01e50823, 0x035cb906, 0x017b0784, 0x000d0dc9}}, Y: Field{[10]uint32{0x01c398d3, 0x02cef6a9, 0x00ec2a49, 0x0281dbc7, 0x00f38bd0, 0x02c1b5f0, 0x013fa143, 0x035a3a11, 0x03076da8, 0x0033a6f3}}}, + {X: Field{[10]uint32{0x0099545b, 0x0179cd82, 0x0155c9ed, 0x0024d2b4, 0x03939fa4, 0x028d2feb, 0x0386024e, 0x006ad6fd, 0x029f8261, 0x0011652b}}, Y: Field{[10]uint32{0x02d450f5, 0x00fe4a3a, 0x00da4c4b, 0x0178fb83, 0x0177d3f1, 0x01ded1e3, 0x0034e72e, 0x02e9cb0e, 0x03f562b0, 0x00089571}}}, + {X: Field{[10]uint32{0x01898819, 0x0084b760, 0x003c2f13, 0x00dac89d, 0x033aebb0, 0x01ad6169, 0x02b21fc2, 0x001bec0d, 0x030512db, 0x0001ccdd}}, Y: Field{[10]uint32{0x00307887, 0x00315fd4, 0x03c51515, 0x03b4a4a0, 0x00848b53, 0x0161fcfe, 0x01cf461c, 0x02c28958, 0x0159725f, 0x001d4f77}}}, + {X: Field{[10]uint32{0x029790ff, 0x02af59b5, 0x0372e3f2, 0x00b41953, 0x00a53f4c, 0x0231d2af, 0x02d81c10, 0x03fbcd54, 0x00144d2a, 0x002f6456}}, Y: Field{[10]uint32{0x0027763e, 0x01fb4b46, 0x005b950e, 0x016e5783, 0x0231ae89, 0x017d1c52, 0x02b3277a, 0x038dced0, 0x01e17f27, 0x0006bd82}}}, + {X: Field{[10]uint32{0x015bb557, 0x0395b6e4, 0x03c73d4c, 0x01007d27, 0x01677827, 0x00f621c3, 0x001ced90, 0x03fb88a3, 0x014ca51d, 0x00228473}}, Y: Field{[10]uint32{0x02f5cf23, 0x003d8655, 0x017196be, 0x03c09cce, 0x02ca46b3, 0x03d1c403, 0x00278229, 0x02725fbb, 0x03eeae9f, 0x0034c2b5}}}, + {X: Field{[10]uint32{0x039bfcfd, 0x011b61db, 0x01ea697d, 0x035f0291, 0x03cfd058, 0x016c09ca, 0x023e6886, 0x02ffadb0, 0x01f02802, 0x001e4a6d}}, Y: Field{[10]uint32{0x00fde5d0, 0x02d538bd, 0x00b36963, 0x033507c2, 0x018c80d1, 0x00aa2430, 0x01e366c3, 0x01e0f534, 0x02218039, 0x003e6eeb}}}, + {X: Field{[10]uint32{0x03d89d01, 0x0131498e, 0x018bcf6e, 0x01566c69, 0x03d55f88, 0x0327c07c, 0x000e79bc, 0x0259be02, 0x02ac1d5b, 0x002037c1}}, Y: Field{[10]uint32{0x01136538, 0x006ab250, 0x03a7ebe4, 0x00dc9983, 0x025ee5c3, 0x030043cd, 0x025614ba, 0x0162a498, 0x02d0a595, 0x000d1a49}}}, + {X: Field{[10]uint32{0x025ccaf7, 0x020cc56f, 0x00ac6efc, 0x036b483d, 0x03ed4b01, 0x020eb44e, 0x0292b4f3, 0x020fca52, 0x00789ff3, 0x001d1515}}, Y: Field{[10]uint32{0x0160fa9a, 0x01ddf2f0, 0x00ceafae, 0x018679d8, 0x03e82173, 0x0133cad7, 0x01ea165c, 0x01dffb78, 0x037781ee, 0x000d9227}}}, + {X: Field{[10]uint32{0x02f8fe85, 0x00af3616, 0x01e67de6, 0x0357e1df, 0x03e562d7, 0x00a0a2df, 0x0011fdb4, 0x02a28257, 0x01bcb213, 0x000b1b4d}}, Y: Field{[10]uint32{0x035d159b, 0x02f9ad31, 0x0163144d, 0x0270af4d, 0x002e6013, 0x00bc8ca6, 0x002206c7, 0x013e7d14, 0x03703409, 0x002a8c38}}}, + {X: Field{[10]uint32{0x02e338db, 0x0369c3ec, 0x027be830, 0x0274c12a, 0x024b4342, 0x00a33458, 0x011846a7, 0x013ac0a0, 0x017a9d93, 0x0020d4d9}}, Y: Field{[10]uint32{0x00e02b71, 0x0275011d, 0x003b166a, 0x02bcebfe, 0x02ed4a4c, 0x039a4f22, 0x0189c5ac, 0x03e974a0, 0x0038020f, 0x003e1001}}}, + {X: Field{[10]uint32{0x02ae494f, 0x02a377ea, 0x027f6fd1, 0x01cd3b61, 0x012177ca, 0x018698a6, 0x02f63365, 0x015b5f1f, 0x013a54ce, 0x003c85ba}}, Y: Field{[10]uint32{0x00d30611, 0x00fa912b, 0x036723f4, 0x02dc0bc6, 0x038da296, 0x004730d1, 0x03e8fadb, 0x020c9818, 0x0313a0fe, 0x0036c28f}}}, + {X: Field{[10]uint32{0x008324fb, 0x0342046a, 0x03112273, 0x032379b9, 0x002e9a3d, 0x018bb1fd, 0x022baa4b, 0x01cfe595, 0x02219b5d, 0x00370dc4}}, Y: Field{[10]uint32{0x0357c004, 0x02c553f7, 0x000fb581, 0x0055f0cc, 0x004f1c90, 0x00a7e6ed, 0x020acaa9, 0x00fa58dc, 0x0092ec56, 0x003bb324}}}, + {X: Field{[10]uint32{0x02649475, 0x02641c8d, 0x0116dd44, 0x01ed0959, 0x02b10f04, 0x03bd4d2b, 0x02f60296, 0x02d3c787, 0x036d48f0, 0x0036cd1c}}, Y: Field{[10]uint32{0x00586bec, 0x02f93fab, 0x00fdfdd1, 0x01985934, 0x001a1169, 0x024f9462, 0x02c34c9b, 0x031e1a54, 0x016cf7a8, 0x00070a73}}}, + {X: Field{[10]uint32{0x03696add, 0x031ca5c0, 0x03d3378f, 0x03b4d63e, 0x01971b09, 0x00bd6f3c, 0x015af536, 0x021093cd, 0x00572046, 0x00028921}}, Y: Field{[10]uint32{0x02547803, 0x028ddd89, 0x006948c9, 0x00c6f214, 0x03baffc9, 0x00b8915c, 0x0367a56c, 0x037ae28d, 0x016137d0, 0x00269c0f}}}, + {X: Field{[10]uint32{0x024436c4, 0x027ea8c4, 0x01ed240c, 0x02e63ec9, 0x023eba38, 0x007da343, 0x02aa4293, 0x01d4eeef, 0x006fa9ac, 0x002edee0}}, Y: Field{[10]uint32{0x02426752, 0x020daa04, 0x02e646e5, 0x0273e6d0, 0x0007c6ff, 0x026c0543, 0x03682e3d, 0x02efa366, 0x0174a1a8, 0x0023e049}}}, + {X: Field{[10]uint32{0x03ecf446, 0x0025bff0, 0x01ad517b, 0x02a9d125, 0x00489344, 0x02783c1a, 0x02194276, 0x02808fd9, 0x0076fc28, 0x0019c0f1}}, Y: Field{[10]uint32{0x00e2a38c, 0x02b10f4a, 0x0215eed3, 0x02ac148b, 0x00f42699, 0x019cc785, 0x00211a30, 0x029c8d61, 0x023f7c9b, 0x0022d200}}}, + {X: Field{[10]uint32{0x02dbf6a2, 0x012e9878, 0x023b71b4, 0x02a8d251, 0x0214cf0d, 0x00584ae0, 0x023f3b7a, 0x02d123f8, 0x00e4bfa4, 0x002f2abe}}, Y: Field{[10]uint32{0x01c7f404, 0x0385c435, 0x01736d6f, 0x03b1a333, 0x03b07498, 0x02fa1e4e, 0x0108835d, 0x0254ffa7, 0x0300e2cc, 0x002f7fc9}}}, + {X: Field{[10]uint32{0x0310cd49, 0x0361e464, 0x00f7bbfe, 0x005cfb1d, 0x02217945, 0x01c9a8b9, 0x015b446d, 0x01c88077, 0x03da1a55, 0x00241ad3}}, Y: Field{[10]uint32{0x012653cf, 0x029d34e2, 0x00f93441, 0x0240b5fd, 0x01cf8384, 0x021a421c, 0x0304bc47, 0x0134a340, 0x02dbcd2c, 0x0035d4fc}}}, + {X: Field{[10]uint32{0x02f93d5f, 0x009ab0e7, 0x029058d7, 0x0337ade1, 0x00fa5369, 0x006ff741, 0x000e326e, 0x01f65546, 0x0383018f, 0x0027b025}}, Y: Field{[10]uint32{0x03acf205, 0x0252b765, 0x02049d17, 0x03e3e252, 0x00ad22ba, 0x034a3edc, 0x02c68424, 0x0059054e, 0x0057994b, 0x002732a0}}}, + {X: Field{[10]uint32{0x02b8209d, 0x038cc504, 0x030f3a2d, 0x02faec00, 0x036f823c, 0x004534bc, 0x0362a96f, 0x0103b0a0, 0x0106b754, 0x0014cd1e}}, Y: Field{[10]uint32{0x020c1fa0, 0x02824332, 0x0034ab06, 0x0200f864, 0x01595816, 0x025543b1, 0x02f1bf02, 0x022af91f, 0x00e0471f, 0x000332ce}}}, + {X: Field{[10]uint32{0x023a4870, 0x023e0374, 0x013373b9, 0x00445485, 0x03a33e54, 0x02cd5e01, 0x0224b18e, 0x0012024f, 0x032961b7, 0x0009f14f}}, Y: Field{[10]uint32{0x02575601, 0x02e222f6, 0x014fe2f3, 0x03ea2016, 0x00703fa5, 0x02b23139, 0x03c70e59, 0x00db11c7, 0x038de186, 0x00168fd2}}}, + {X: Field{[10]uint32{0x0259b68f, 0x03339d77, 0x02a5beac, 0x028f9d72, 0x0322ed51, 0x03d57084, 0x02616bac, 0x017e684a, 0x03e37a11, 0x00248649}}, Y: Field{[10]uint32{0x0327b141, 0x00db1341, 0x00ae2e06, 0x01c45e19, 0x0155884e, 0x0098f5de, 0x02fb5906, 0x0316d662, 0x007bc1e4, 0x002f6edf}}}, + {X: Field{[10]uint32{0x033ea8c2, 0x01b35b8f, 0x01ff8dde, 0x002468f6, 0x01efb3e6, 0x0390c9d4, 0x03c692ca, 0x007ff59d, 0x00876eb8, 0x0025cecf}}, Y: Field{[10]uint32{0x03bbb0ed, 0x03af7655, 0x003b849a, 0x02b8ea5a, 0x018684b0, 0x036f3b36, 0x0112c5da, 0x01442e90, 0x03710129, 0x000d037d}}}, + {X: Field{[10]uint32{0x0301ae71, 0x017a6b06, 0x02ce4020, 0x00c84995, 0x00d5972c, 0x024811c0, 0x038ef036, 0x00dd9e64, 0x03def053, 0x00082e05}}, Y: Field{[10]uint32{0x0395707b, 0x0052aa20, 0x01c1234a, 0x0193faa6, 0x01c6b1ce, 0x01282af1, 0x025c3529, 0x02805871, 0x025be2da, 0x000ab8bf}}}, + {X: Field{[10]uint32{0x03c95876, 0x02226d28, 0x01402aa6, 0x0358f64c, 0x01ca9fc5, 0x01cbad0f, 0x02347b7f, 0x0246041e, 0x004f7a7e, 0x0018f895}}, Y: Field{[10]uint32{0x000d16b1, 0x032b5c4a, 0x02067f91, 0x02c7e1b9, 0x02adf49c, 0x022f57eb, 0x01cdf521, 0x00533801, 0x026d20d7, 0x00398abb}}}, + {X: Field{[10]uint32{0x022aeb80, 0x00e5d4f8, 0x034216ac, 0x01cb9060, 0x01a69dd4, 0x011f5d8b, 0x0183abfc, 0x0233c2cd, 0x02107150, 0x000be437}}, Y: Field{[10]uint32{0x0388d389, 0x024eaf4d, 0x0264b761, 0x0226708f, 0x00880f3a, 0x02846122, 0x01e5e025, 0x0375d189, 0x02bd04a0, 0x0014dc6f}}}, + {X: Field{[10]uint32{0x02ed7209, 0x0373ca74, 0x0048ac9a, 0x03082b47, 0x037c9359, 0x03968d47, 0x0237cf75, 0x01b41517, 0x00e8faa9, 0x0023508f}}, Y: Field{[10]uint32{0x03ab40f2, 0x002c4a42, 0x03d6eea8, 0x03056b02, 0x03bb9d23, 0x0299570f, 0x00df7948, 0x03100686, 0x003dee76, 0x0020f52e}}}, + {X: Field{[10]uint32{0x00181efd, 0x03b04420, 0x03ea3bec, 0x0220156c, 0x02a9c91d, 0x02451090, 0x03111a20, 0x022bfcc0, 0x01425e02, 0x0004be90}}, Y: Field{[10]uint32{0x00c3ff57, 0x00ab103a, 0x03d4dc4d, 0x022ecb8d, 0x03ee5c3b, 0x018bac43, 0x010eddb3, 0x00ad5eb0, 0x03708e79, 0x001ae56c}}}, + {X: Field{[10]uint32{0x02706f73, 0x011e20a2, 0x00bbff83, 0x01bfff43, 0x00ce7019, 0x037cb5cc, 0x0105632c, 0x0375f35d, 0x015f2a3b, 0x00248f2a}}, Y: Field{[10]uint32{0x0346abbc, 0x0106ad49, 0x032ee3e5, 0x036f2b42, 0x031903af, 0x00433ffc, 0x003983b2, 0x0185cece, 0x0066c39b, 0x003e2c32}}}, + {X: Field{[10]uint32{0x00893646, 0x027835a2, 0x01776a86, 0x02859882, 0x0064ce3a, 0x00a3d1c1, 0x023875a7, 0x0103a58f, 0x013e8782, 0x00021135}}, Y: Field{[10]uint32{0x03eeaca1, 0x01579cdb, 0x032b25b8, 0x031c67ec, 0x011c84f9, 0x01c4ef1d, 0x00c47b4a, 0x02307fe6, 0x029192bf, 0x00318334}}}, + {X: Field{[10]uint32{0x01dc98f3, 0x01eb087c, 0x02b2a65e, 0x027d998d, 0x03883829, 0x00016977, 0x0277ff81, 0x007636e8, 0x03d6c547, 0x0010de1b}}, Y: Field{[10]uint32{0x02091b51, 0x00bd4a95, 0x0127e914, 0x0213e630, 0x03745ff8, 0x021c1bf9, 0x039109cb, 0x016ef63d, 0x02c29c8c, 0x0034a4a8}}}, + {X: Field{[10]uint32{0x0236d7ab, 0x01cdb72b, 0x0257ce94, 0x01162c1c, 0x02bb0dec, 0x02e628b3, 0x0383f71f, 0x03b3d8e1, 0x028df5e9, 0x001b46f0}}, Y: Field{[10]uint32{0x00d549e6, 0x020008e2, 0x0238da0e, 0x001c8c85, 0x00e2c00e, 0x00a04237, 0x0214cf7a, 0x00111e18, 0x0192bfd8, 0x0030b150}}}, + {X: Field{[10]uint32{0x02ff86c6, 0x0255aac5, 0x037f67d8, 0x0333fe12, 0x016c742c, 0x00f89975, 0x033f89cc, 0x0338f0bb, 0x03347f74, 0x001af13b}}, Y: Field{[10]uint32{0x01b46408, 0x03f33c5e, 0x0066b8b0, 0x03918317, 0x01be26a6, 0x01af798b, 0x036be35c, 0x02c13c49, 0x02fd2d2a, 0x003ad124}}}, + {X: Field{[10]uint32{0x03678b38, 0x03ea66ef, 0x00ddcb35, 0x00af2ccf, 0x000d67a6, 0x00342357, 0x02a756e0, 0x00256350, 0x0075fa81, 0x001abd14}}, Y: Field{[10]uint32{0x025bff28, 0x01ffe7ee, 0x00bfd528, 0x024e1258, 0x02886c7b, 0x02dce199, 0x00ffc3fa, 0x020b1d9e, 0x024f0e76, 0x002b6edc}}}, + {X: Field{[10]uint32{0x01260600, 0x03a29995, 0x011caa24, 0x003e416b, 0x00939f34, 0x0156dd18, 0x02f49cd3, 0x018d96a5, 0x03763646, 0x003adb62}}, Y: Field{[10]uint32{0x03bea3cd, 0x02eb835f, 0x015c33c2, 0x021c0cfe, 0x0241f7a1, 0x000ee074, 0x03a11ff6, 0x002dfee6, 0x02fdaea3, 0x001eba73}}}, + {X: Field{[10]uint32{0x01795068, 0x0115d7a4, 0x000af11e, 0x026eb594, 0x01b34d5e, 0x02eb533d, 0x038dd694, 0x01f4fd9c, 0x02332fef, 0x002f4308}}, Y: Field{[10]uint32{0x011cf209, 0x02082fa7, 0x0113676f, 0x015ceaa7, 0x01a91c4d, 0x01a08e93, 0x01100b66, 0x02c8702a, 0x004e2ea0, 0x003aae97}}}, + {X: Field{[10]uint32{0x02b7e392, 0x03261e54, 0x034b5054, 0x027e010d, 0x030aa56d, 0x01092455, 0x003e0831, 0x025064d2, 0x03bdc504, 0x0031788e}}, Y: Field{[10]uint32{0x02597751, 0x022b1e9b, 0x00fe2f7f, 0x019a156d, 0x038d59e7, 0x02a92b8f, 0x01cd02e3, 0x0085feff, 0x00cbf684, 0x00132bae}}}, + {X: Field{[10]uint32{0x0092d2a3, 0x019f3e23, 0x00bd8108, 0x02637a8e, 0x0017178e, 0x03487181, 0x003edb03, 0x02ae4955, 0x0231f3aa, 0x002d5c5d}}, Y: Field{[10]uint32{0x0011942a, 0x01027ca3, 0x020e9a02, 0x02b23c74, 0x00d2bdf0, 0x00936ead, 0x03318745, 0x02a7bc22, 0x01cc0324, 0x0039d082}}}, + {X: Field{[10]uint32{0x01305cfc, 0x012d7a57, 0x00cca2fe, 0x01f1ee0e, 0x01b2d17b, 0x00c281f8, 0x00a85d5d, 0x007cbf2b, 0x00994960, 0x00271158}}, Y: Field{[10]uint32{0x0304eeb6, 0x03b81bbf, 0x00674674, 0x030d6172, 0x00329273, 0x0079401e, 0x001b61b3, 0x0371f0a1, 0x0140a109, 0x000b5e85}}}, + {X: Field{[10]uint32{0x02a82f63, 0x01de9462, 0x00d5498c, 0x0175cc8a, 0x03e33dae, 0x00ed9812, 0x02ff1757, 0x00db12a2, 0x0146c0ab, 0x0014ab8a}}, Y: Field{[10]uint32{0x037f87b4, 0x035dc71d, 0x0104d24d, 0x0320190c, 0x027179f5, 0x019524fc, 0x003f899b, 0x006fe934, 0x019b6606, 0x001c388f}}}, + {X: Field{[10]uint32{0x0394adf9, 0x0167c280, 0x03dcef4f, 0x030b0a7b, 0x0189db9a, 0x0210207a, 0x01ba4903, 0x0118b770, 0x03bf55ff, 0x000527b0}}, Y: Field{[10]uint32{0x009dd7af, 0x02a2f05e, 0x01801341, 0x01737e52, 0x0049642b, 0x039a5472, 0x028fbc7c, 0x02e508ab, 0x0188b91d, 0x00016707}}}, + {X: Field{[10]uint32{0x02ea7ea7, 0x018e0410, 0x005768a1, 0x00270534, 0x03dbe14a, 0x0054e368, 0x03835346, 0x0063777f, 0x0294d667, 0x002bfe24}}, Y: Field{[10]uint32{0x0159266b, 0x0139d913, 0x00bb9a92, 0x0244aa23, 0x017b6154, 0x02f095b7, 0x022352ac, 0x021e97b3, 0x03ebcf58, 0x001c619a}}}, + {X: Field{[10]uint32{0x004e76fc, 0x02ed0196, 0x02b78da7, 0x02dce38a, 0x0133887e, 0x000f8ad0, 0x012d49b3, 0x0011cab5, 0x00782cb3, 0x0037913d}}, Y: Field{[10]uint32{0x02482bf5, 0x0348f273, 0x01da7eef, 0x03ea0c3b, 0x01b13d08, 0x02b23bc8, 0x03c630d7, 0x0360b015, 0x018425ba, 0x0019e62b}}}, + {X: Field{[10]uint32{0x01682e61, 0x03b1f1ce, 0x021345a2, 0x03aca253, 0x02b3a380, 0x006e80b1, 0x032c88be, 0x024d9b05, 0x02737616, 0x00382f1e}}, Y: Field{[10]uint32{0x022cb2e0, 0x01827349, 0x024d3c23, 0x030aad50, 0x035ad1f7, 0x01edfa64, 0x027c0ec8, 0x023fa37f, 0x02b933b1, 0x002f451f}}}, + {X: Field{[10]uint32{0x032f0e6d, 0x01e91d80, 0x03b1127c, 0x0269c73e, 0x02ed2613, 0x0294da88, 0x033cfa70, 0x027cce51, 0x03272af6, 0x0017b8d3}}, Y: Field{[10]uint32{0x00e13b8c, 0x018abab1, 0x036cb807, 0x004370d8, 0x011316bf, 0x01737bf1, 0x0257de98, 0x01360bda, 0x0396dc0d, 0x003077e3}}}, + {X: Field{[10]uint32{0x0199a0f2, 0x03397a39, 0x0113a68b, 0x011afb57, 0x03672968, 0x03855f5e, 0x00c274df, 0x01e98e6e, 0x03c177fa, 0x0013728e}}, Y: Field{[10]uint32{0x012fb234, 0x030cb14f, 0x032a1d01, 0x01a14bbf, 0x012fb489, 0x03d6723a, 0x033fd758, 0x026baff6, 0x015836fb, 0x0023f4ad}}}, + {X: Field{[10]uint32{0x00b48136, 0x0211d47e, 0x004f5bc1, 0x00d280d2, 0x00980810, 0x03a64fd5, 0x01ed9373, 0x000a43be, 0x03c18756, 0x001553da}}, Y: Field{[10]uint32{0x0172b26a, 0x0129af28, 0x0183d206, 0x00e8783f, 0x03de8086, 0x0230fd43, 0x03834e0e, 0x004a8d45, 0x03b7dfd5, 0x002d1530}}}, + {X: Field{[10]uint32{0x01592ad4, 0x00a096e1, 0x02ba420b, 0x01f2d4e7, 0x02955af8, 0x018b708b, 0x0160b2e1, 0x021e69aa, 0x0350a6c0, 0x00256a06}}, Y: Field{[10]uint32{0x0045c712, 0x006ac303, 0x011af265, 0x021bd9c0, 0x037c7d50, 0x00e2a930, 0x0072b75f, 0x008b47d6, 0x00c4dfed, 0x002f957a}}}, + {X: Field{[10]uint32{0x037e5c4d, 0x02e2f9d1, 0x01d853ef, 0x029ba8a4, 0x0244a4f8, 0x00c7d560, 0x00d14d34, 0x01a9b8d6, 0x01539e49, 0x00241edb}}, Y: Field{[10]uint32{0x03150eac, 0x021cb91d, 0x0265c21f, 0x0000a489, 0x01ff33e2, 0x0375f475, 0x0017fad1, 0x02ee799e, 0x02943853, 0x002cf4f5}}}, + {X: Field{[10]uint32{0x03f17aa6, 0x03330271, 0x003575bc, 0x0191adea, 0x01c8884c, 0x00fc5d81, 0x0337cb23, 0x015dbd9d, 0x001bb342, 0x002149f2}}, Y: Field{[10]uint32{0x037604fc, 0x013a3d61, 0x02a64504, 0x0274cce1, 0x019cd47b, 0x0115ddfc, 0x031930c1, 0x0149255e, 0x01bcdb8d, 0x002db59d}}}, + {X: Field{[10]uint32{0x03ab00ec, 0x025d38bb, 0x01e9f913, 0x00ea066e, 0x03bc6bf8, 0x03e41ba6, 0x02134360, 0x0036493a, 0x027d5a32, 0x0023878e}}, Y: Field{[10]uint32{0x0018b0b9, 0x002783fd, 0x01c4aff3, 0x01f1e4a0, 0x000792e0, 0x029e4b14, 0x023dad4e, 0x017c970c, 0x03abd81d, 0x003653c0}}}, + {X: Field{[10]uint32{0x019a8d76, 0x03eadd54, 0x0034d72c, 0x0125731d, 0x02dd0d89, 0x031a32da, 0x02cbd86b, 0x012a3426, 0x0393be1f, 0x003f00b2}}, Y: Field{[10]uint32{0x024d4f94, 0x00f1dc9f, 0x004e98b7, 0x027659fa, 0x02ffe4cd, 0x0216895b, 0x026ceb08, 0x01171662, 0x0132729e, 0x001c7de9}}}, + {X: Field{[10]uint32{0x03e6e7b8, 0x00a26c42, 0x016af80a, 0x01fe6cbb, 0x03ff7635, 0x03c21d46, 0x02c44db4, 0x022ceec6, 0x0302a285, 0x0033e604}}, Y: Field{[10]uint32{0x0173b528, 0x006fa223, 0x007bad3a, 0x00a2e221, 0x02f1a8a8, 0x0213c7e8, 0x0205ded9, 0x0199b9c0, 0x0012bf23, 0x0008dfa7}}}, + {X: Field{[10]uint32{0x00231d82, 0x03712faa, 0x01228e97, 0x00782e81, 0x0371718d, 0x03235433, 0x0274cbba, 0x03a480f2, 0x01dc1408, 0x000f9b91}}, Y: Field{[10]uint32{0x031ef848, 0x01d19dce, 0x028a3147, 0x0387c3f7, 0x03961009, 0x01fbe1b7, 0x01f287ca, 0x02a017d8, 0x037a2ad3, 0x000b8ff6}}}, + {X: Field{[10]uint32{0x007d4657, 0x02e7b69c, 0x028b3749, 0x02cb7c99, 0x023ce1b2, 0x00466c3b, 0x00090888, 0x0051c442, 0x03950758, 0x002ec11d}}, Y: Field{[10]uint32{0x01c67587, 0x00e45a1d, 0x01bc1bc4, 0x016ff38a, 0x028d6ee5, 0x036fbbb4, 0x01ad6977, 0x03ce9abd, 0x02fc5f95, 0x002569cb}}}, + {X: Field{[10]uint32{0x00dd6748, 0x01746e5a, 0x0193903f, 0x01b604a4, 0x0100fe35, 0x0338132d, 0x03a31034, 0x00b0412a, 0x0142b8b0, 0x00138057}}, Y: Field{[10]uint32{0x00a870fb, 0x010b001c, 0x00d2dd39, 0x03ea046f, 0x02746419, 0x02499d08, 0x00e96ffc, 0x01b5c765, 0x00e7dfbf, 0x0034d6c8}}}, + {X: Field{[10]uint32{0x00a49daf, 0x00dd1649, 0x0386792a, 0x03c90437, 0x0270850a, 0x01a341e3, 0x037391bd, 0x02c8427a, 0x005790c8, 0x00182693}}, Y: Field{[10]uint32{0x03ad0e98, 0x01540bc2, 0x00e8a0e3, 0x000347cd, 0x0314431d, 0x02290e42, 0x01cb14e7, 0x016ce960, 0x027ebc96, 0x003ce98c}}}, + {X: Field{[10]uint32{0x027fc730, 0x02eac0e8, 0x00aa1780, 0x0184c16d, 0x01b9ea07, 0x005fb3d8, 0x01b7558a, 0x016b0138, 0x03362a95, 0x00332f81}}, Y: Field{[10]uint32{0x0092cd3b, 0x0311fe47, 0x03abb71f, 0x00492c0f, 0x00d981a0, 0x00190ca6, 0x02a4e3ae, 0x02875d97, 0x00166c98, 0x003e5adf}}}, + {X: Field{[10]uint32{0x03ccab14, 0x01471a70, 0x008c3e21, 0x01a6a10e, 0x009143c5, 0x01384738, 0x0310ef90, 0x008c0b9a, 0x028285df, 0x001bb580}}, Y: Field{[10]uint32{0x02d196e7, 0x0247a946, 0x026081d5, 0x00709614, 0x03e91b0d, 0x0199798b, 0x03c75649, 0x00ede3a3, 0x03b0687a, 0x0019d7a8}}}, + {X: Field{[10]uint32{0x0349d8e0, 0x01ffda72, 0x02c7f4c0, 0x01dd10f6, 0x02708061, 0x0214554c, 0x033c5923, 0x02853156, 0x01cba0cc, 0x002f7fc1}}, Y: Field{[10]uint32{0x020c9a50, 0x0041b69b, 0x017981dd, 0x024eaab2, 0x03f09d79, 0x020ce443, 0x00a72390, 0x023b309d, 0x010486cd, 0x0014526b}}}, + {X: Field{[10]uint32{0x022bff2b, 0x01e64453, 0x0386eed5, 0x01570b1c, 0x00af9f6e, 0x01e6bb47, 0x03e53665, 0x00c96c8a, 0x028ccc70, 0x00019339}}, Y: Field{[10]uint32{0x01cb1cae, 0x01abb791, 0x0106bd59, 0x0387aad9, 0x0211bf1b, 0x0084f2ee, 0x021dddf2, 0x02683bbd, 0x01763c8a, 0x003e3226}}}, + {X: Field{[10]uint32{0x00ab2bb4, 0x0051c686, 0x007edaf0, 0x03d58984, 0x02b40de7, 0x007968bd, 0x02f3c06e, 0x0143cf72, 0x006f4891, 0x003350b9}}, Y: Field{[10]uint32{0x01bcfada, 0x03f68280, 0x025c281d, 0x0227d9e7, 0x0017f11f, 0x0094e9e2, 0x00921f4e, 0x01a59ed3, 0x00ddd202, 0x00367094}}}, + {X: Field{[10]uint32{0x01619735, 0x0157c062, 0x02c4359d, 0x0070d713, 0x025e9b12, 0x03b136ba, 0x01a7e8e3, 0x0150838b, 0x0007e714, 0x003df0a4}}, Y: Field{[10]uint32{0x03a493b7, 0x02928cfa, 0x023ddc2b, 0x00e8db3e, 0x005ea293, 0x0281b76c, 0x03735a56, 0x02a4f98d, 0x00064dbd, 0x00199145}}}, + {X: Field{[10]uint32{0x0293b7a8, 0x007d9e57, 0x010f2c5c, 0x034b6445, 0x00377609, 0x01c560d7, 0x033d2214, 0x0121589a, 0x01e1d494, 0x0018ce70}}, Y: Field{[10]uint32{0x02d59b28, 0x00cbf1cf, 0x02d95be5, 0x018261d8, 0x01d10a69, 0x03eb2e30, 0x015a20d8, 0x03a3dffd, 0x01ea47b4, 0x003bef9b}}}, + {X: Field{[10]uint32{0x0089b37b, 0x0160050d, 0x00b4daaf, 0x01e367d0, 0x0207b1ec, 0x027d3ae1, 0x00bbcf1e, 0x03b4197d, 0x03137d22, 0x003f33c7}}, Y: Field{[10]uint32{0x01bf3e10, 0x012d541f, 0x0111c64a, 0x02bc86cd, 0x016646be, 0x025d5ad3, 0x01559d9d, 0x02b30e20, 0x002fef9f, 0x002969df}}}, + {X: Field{[10]uint32{0x004f62d2, 0x03058010, 0x03d4e935, 0x035d63b0, 0x00a13434, 0x01ef23d7, 0x023b5541, 0x0213b3c4, 0x031006f2, 0x0036a5ff}}, Y: Field{[10]uint32{0x0312e168, 0x00c0732b, 0x0093cf8b, 0x008a2069, 0x024f3082, 0x0362ae4a, 0x031e3d1c, 0x00cc37cb, 0x028b4900, 0x00197085}}}, + {X: Field{[10]uint32{0x033e4fd8, 0x00b6260c, 0x039bddce, 0x03c887c2, 0x03343ab6, 0x006d1164, 0x0157556c, 0x009338da, 0x00d5428a, 0x00199da9}}, Y: Field{[10]uint32{0x01af7b41, 0x02c717cf, 0x01593854, 0x01611686, 0x03b7afcf, 0x0119f5e4, 0x034d3d83, 0x0094d7d7, 0x00a4b933, 0x00116f77}}}, + {X: Field{[10]uint32{0x017859ca, 0x004ab7b9, 0x01ccd302, 0x01e8a986, 0x0153396e, 0x00f7ba90, 0x0222c7cd, 0x00508152, 0x02becf46, 0x001e479a}}, Y: Field{[10]uint32{0x02dd37a1, 0x01ec333e, 0x02c9268a, 0x03745f93, 0x03e2ec07, 0x03fd0fb2, 0x0332990a, 0x01724fb1, 0x03fd08c5, 0x003900ce}}}, + {X: Field{[10]uint32{0x030018a1, 0x005fcc6b, 0x005ae207, 0x011d2f5f, 0x02c66dd9, 0x012dcc91, 0x00985aa8, 0x0055429e, 0x03b2d518, 0x000e9f1e}}, Y: Field{[10]uint32{0x029d7459, 0x014b517f, 0x03d1437b, 0x0094612b, 0x02b6c38d, 0x039417e2, 0x01f732a9, 0x03b71488, 0x0317e03c, 0x0008e23a}}}, + {X: Field{[10]uint32{0x013ab999, 0x0082f150, 0x00c3bef7, 0x005cad15, 0x0362b740, 0x0004e075, 0x03ca9361, 0x00725a72, 0x01b18680, 0x0009268b}}, Y: Field{[10]uint32{0x01d5e7a3, 0x0225ed74, 0x030cff71, 0x002cfb24, 0x002f708e, 0x01701d7a, 0x003cf9c8, 0x0247075e, 0x004176aa, 0x00368617}}}, + {X: Field{[10]uint32{0x034f8590, 0x029a215a, 0x0313614d, 0x01fede4a, 0x0032c085, 0x01595794, 0x01f21e0c, 0x03302661, 0x0153b4e0, 0x002c9783}}, Y: Field{[10]uint32{0x0183eda2, 0x021399d7, 0x01055d6b, 0x02010ac8, 0x0300ac5b, 0x034a360d, 0x00fac42f, 0x038eb387, 0x02ff6b02, 0x0006f45e}}}, + {X: Field{[10]uint32{0x03862fcd, 0x0167aaed, 0x02cd6013, 0x03dd45ff, 0x02bd1073, 0x0044090f, 0x029db66f, 0x00ce22a1, 0x036805e8, 0x001cd814}}, Y: Field{[10]uint32{0x015f9d56, 0x00494d9b, 0x02913d69, 0x039569d7, 0x03e767fa, 0x0384b507, 0x02434076, 0x0316983e, 0x002d0842, 0x003a71e8}}}, + {X: Field{[10]uint32{0x03f1b1d9, 0x0172585d, 0x03ff9711, 0x036979c3, 0x022e5b52, 0x03c96750, 0x038a0c9a, 0x00ba5c0b, 0x03567139, 0x003b0bc2}}, Y: Field{[10]uint32{0x008183a8, 0x025263a4, 0x00818204, 0x00ad3f7b, 0x02d49e07, 0x02395b4c, 0x00571fa9, 0x01396432, 0x02bbadb2, 0x0011fdf7}}}, + {X: Field{[10]uint32{0x03e2d378, 0x02981612, 0x038e5cbf, 0x025484dd, 0x01afc255, 0x00838630, 0x022ad2f3, 0x0350ea46, 0x03a8250d, 0x001f5ea3}}, Y: Field{[10]uint32{0x00fea3be, 0x00384458, 0x0352e02a, 0x01e904fd, 0x03fab2b0, 0x026f0835, 0x0300f110, 0x01f5dc09, 0x02168962, 0x001ad22e}}}, + {X: Field{[10]uint32{0x026713d7, 0x01a57fea, 0x0036605c, 0x02433fd3, 0x0206e594, 0x009820b1, 0x03aaa01e, 0x01c8ee99, 0x01ce52b6, 0x000c5a9c}}, Y: Field{[10]uint32{0x02a1cb9e, 0x016bdcf5, 0x020200e9, 0x03f73e0b, 0x0184152f, 0x0172d2e8, 0x0344cf6e, 0x0318484a, 0x01a07820, 0x0035bc70}}}, + {X: Field{[10]uint32{0x03bcca51, 0x01b9caa7, 0x01930ade, 0x015c476e, 0x029ace88, 0x02b65e88, 0x02e5fc6e, 0x0227ff0c, 0x00c30ade, 0x000868aa}}, Y: Field{[10]uint32{0x0082e4d0, 0x01b073e2, 0x001e47c5, 0x00e28ae5, 0x01726fd4, 0x00cbc38d, 0x012aafb4, 0x0145ed5c, 0x010438df, 0x00257f4f}}}, + {X: Field{[10]uint32{0x028f94d5, 0x027b0c9c, 0x01535536, 0x0378107e, 0x021ad2cf, 0x0144ebeb, 0x0146c68f, 0x0205c36b, 0x0067b3ad, 0x000fc606}}, Y: Field{[10]uint32{0x02317527, 0x0277c428, 0x00a915f0, 0x03c0e2c0, 0x0191abb8, 0x0088aac3, 0x01991894, 0x003aab55, 0x00e4e9f2, 0x002946a5}}}, + {X: Field{[10]uint32{0x01f63c1e, 0x0024bc22, 0x02a697d0, 0x01b4c563, 0x0079b7aa, 0x0243b3ed, 0x01ecb9b6, 0x00e6f3c4, 0x013911be, 0x003a59cc}}, Y: Field{[10]uint32{0x0103abc2, 0x02050b52, 0x035461f9, 0x03a184c1, 0x00da9be6, 0x00c808a8, 0x022017c0, 0x020f8e37, 0x00f76f87, 0x00030403}}}, + {X: Field{[10]uint32{0x0008b122, 0x0153eba4, 0x00cd8615, 0x010caf42, 0x02d3096d, 0x03ce61b1, 0x03e94b06, 0x02b1f951, 0x02b01407, 0x00187aa2}}, Y: Field{[10]uint32{0x00a4d182, 0x0172a3fd, 0x02792a10, 0x03d0a0fe, 0x02150167, 0x01a7c73b, 0x0090488e, 0x004ea5d9, 0x03cca6f7, 0x00397156}}}, + {X: Field{[10]uint32{0x02dab9fe, 0x01cfe4ef, 0x02402cab, 0x03dc928e, 0x0149673d, 0x008e68fc, 0x00815540, 0x01ff767d, 0x027a1745, 0x002b63eb}}, Y: Field{[10]uint32{0x00f03e6b, 0x01fbfbd4, 0x035d4d77, 0x0080bb4d, 0x01485172, 0x00958fde, 0x001d0371, 0x0312eeec, 0x03ef7966, 0x0014edf7}}}, + {X: Field{[10]uint32{0x02a829d3, 0x02062f6d, 0x0020c586, 0x01324640, 0x02cdf997, 0x0136750d, 0x0362f274, 0x00b9534f, 0x02dfbf7f, 0x00218173}}, Y: Field{[10]uint32{0x01946b88, 0x01bd52df, 0x01873d78, 0x03c143a1, 0x02e7a33d, 0x01dc23fd, 0x009fe4da, 0x02a86988, 0x015f0ca2, 0x0016be29}}}, + {X: Field{[10]uint32{0x03921d87, 0x034b5b3f, 0x014c8cbc, 0x00f0bc8b, 0x016e8325, 0x029e533e, 0x00ffa5a7, 0x027bd1f7, 0x004b465b, 0x002f7795}}, Y: Field{[10]uint32{0x00aadcd8, 0x02f5b3a3, 0x01a7414e, 0x0237e228, 0x030ec97c, 0x0206f9aa, 0x01e7d230, 0x019fd57b, 0x03677ba8, 0x001b14d8}}}, + {X: Field{[10]uint32{0x02fe1cdb, 0x039cd18c, 0x016bbfe3, 0x034aeb64, 0x0162a47b, 0x0170a3d2, 0x02eafca8, 0x0223724f, 0x0245e8b0, 0x000c620a}}, Y: Field{[10]uint32{0x01f176bc, 0x0075a4d5, 0x021a6fd1, 0x02a780aa, 0x01d03557, 0x00b80a32, 0x02b833c1, 0x01b8784a, 0x00f0c5f8, 0x0002cd62}}}, + {X: Field{[10]uint32{0x01dc1202, 0x0013dda9, 0x00883b0d, 0x02f589e6, 0x03e49fad, 0x000ee398, 0x0110b726, 0x003e7b6d, 0x00524580, 0x0005ef90}}, Y: Field{[10]uint32{0x0132fc54, 0x00ce92e3, 0x01cb9c9e, 0x01568bd6, 0x0181667e, 0x010349df, 0x00f7738e, 0x0156b80a, 0x03dcdf88, 0x0005413a}}}, + {X: Field{[10]uint32{0x03629537, 0x01abeb72, 0x0308c9c5, 0x03d69806, 0x00a303ea, 0x001fcaca, 0x03c4e697, 0x01f4a9af, 0x0133bb69, 0x00318cef}}, Y: Field{[10]uint32{0x0218cef8, 0x03566dee, 0x01eac2b4, 0x01e0cc4e, 0x039f3b7f, 0x0187193c, 0x0006b924, 0x01936fcb, 0x00132d47, 0x0021b8fd}}}, + {X: Field{[10]uint32{0x0260bb52, 0x01863d60, 0x00062570, 0x02d8ed18, 0x03633434, 0x00cf3444, 0x00881f3a, 0x0043dc64, 0x008af4c7, 0x003ce788}}, Y: Field{[10]uint32{0x01e2e62c, 0x014be4ae, 0x014e2bfe, 0x038ee973, 0x03d0171e, 0x03650f0c, 0x02e2b664, 0x00dbd89c, 0x0005807b, 0x0024315a}}}, + {X: Field{[10]uint32{0x00a16c54, 0x01808cbd, 0x033db893, 0x0053d67d, 0x01ee4e54, 0x00b6e2b1, 0x00ddfb37, 0x02581e95, 0x039414f2, 0x0033a610}}, Y: Field{[10]uint32{0x0224e0d7, 0x033eebae, 0x03d7f627, 0x00b6e97a, 0x02bb8054, 0x03502ba5, 0x02f78354, 0x01ec4f1c, 0x01a1d105, 0x00069201}}}, + {X: Field{[10]uint32{0x030a76bb, 0x01fd8cee, 0x0273f625, 0x008a8569, 0x01945041, 0x022175d5, 0x0171af10, 0x01e93ee9, 0x039f8110, 0x001499b9}}, Y: Field{[10]uint32{0x0159b457, 0x003f25a9, 0x01918d3b, 0x0003edce, 0x0018d382, 0x01ed5708, 0x033ca397, 0x017c4a1d, 0x01d09cc8, 0x00179eb4}}}, + {X: Field{[10]uint32{0x027056e4, 0x030563ef, 0x035c11ff, 0x0025449b, 0x03675070, 0x01de2f22, 0x0370113c, 0x01ea8efc, 0x025763f4, 0x0013ee77}}, Y: Field{[10]uint32{0x0086f7ef, 0x021d54c5, 0x0175e52e, 0x01d61e27, 0x0229fe02, 0x00bf8f6c, 0x022fa347, 0x01c65c2a, 0x02368eec, 0x000b365d}}}, + {X: Field{[10]uint32{0x03cc0226, 0x015d01c8, 0x0345bded, 0x02a348cd, 0x024ae7bb, 0x005632e4, 0x03ec8406, 0x0376f6aa, 0x0024a99e, 0x002b45a0}}, Y: Field{[10]uint32{0x014095de, 0x03dc103c, 0x003cba21, 0x01ae47b8, 0x029ee638, 0x014f12f9, 0x01e230bb, 0x0119ce3b, 0x0015968e, 0x002ac414}}}, + {X: Field{[10]uint32{0x03719cb8, 0x0320005c, 0x028d55a7, 0x02e8522e, 0x01277923, 0x03c6cc1f, 0x03aea9b0, 0x01556dcc, 0x01aef7cc, 0x0001560a}}, Y: Field{[10]uint32{0x03267689, 0x03c269d8, 0x03d3d3c4, 0x03db12eb, 0x00382969, 0x031829ef, 0x003b47d6, 0x02561550, 0x02eb9c9b, 0x001a9ecb}}}, + {X: Field{[10]uint32{0x0378b935, 0x03af0e1a, 0x01910960, 0x010d1435, 0x014e1e4c, 0x013a7780, 0x004bbe78, 0x01383888, 0x02338efa, 0x0008467c}}, Y: Field{[10]uint32{0x00e7bb93, 0x00da44ee, 0x0195711c, 0x01a4d29c, 0x0052acb4, 0x027144ea, 0x0337db96, 0x011319e8, 0x01c37785, 0x0027c867}}}, + {X: Field{[10]uint32{0x01295bbf, 0x003f96ec, 0x01b3257f, 0x0260fd70, 0x02c52274, 0x0095634d, 0x01e53caa, 0x006fa75f, 0x021b0949, 0x00047f0f}}, Y: Field{[10]uint32{0x004cf6f5, 0x02314a21, 0x00ed6219, 0x02234427, 0x0191b8d1, 0x00c4416b, 0x026b6c02, 0x0164cdaa, 0x034decb0, 0x00071a71}}}, + {X: Field{[10]uint32{0x03d2a908, 0x02fa8ef7, 0x0182180a, 0x00626421, 0x015e64ac, 0x01f981ab, 0x0091bc86, 0x01450e54, 0x026fea6e, 0x000d2db3}}, Y: Field{[10]uint32{0x03ccad6d, 0x00e5908a, 0x00694403, 0x00953860, 0x0328e9f3, 0x00b1e8c4, 0x01e41a13, 0x02fbcfee, 0x0104f4bd, 0x0016dbb6}}}, + {X: Field{[10]uint32{0x0210a84c, 0x0103254d, 0x02e2e22a, 0x00f4b6da, 0x00b326fb, 0x01fbdd17, 0x01c567d9, 0x01a2acec, 0x01cab457, 0x001b0897}}, Y: Field{[10]uint32{0x002a1084, 0x03f5da10, 0x0229cd72, 0x010b403a, 0x03912fe0, 0x03610ef6, 0x0363cfa2, 0x03f633af, 0x03522180, 0x001fa175}}}, + {X: Field{[10]uint32{0x028ed7d7, 0x001c5116, 0x003e32a7, 0x008039c1, 0x03cbfd20, 0x0052da22, 0x03cc7570, 0x025708cb, 0x02e541dd, 0x00017ddd}}, Y: Field{[10]uint32{0x03273c0e, 0x002cda62, 0x022ff2a2, 0x00fdb435, 0x01c11680, 0x0299354a, 0x009de0b9, 0x020d50e8, 0x0078fc6d, 0x000ee317}}}, + {X: Field{[10]uint32{0x011b0e23, 0x02f64ca2, 0x014e9b8b, 0x01205bf6, 0x01d5371e, 0x00913ea9, 0x037eaa63, 0x010fbd78, 0x00c55315, 0x000f89b6}}, Y: Field{[10]uint32{0x0379bb65, 0x03eaaf82, 0x034b0c70, 0x003db62b, 0x02a5b4c7, 0x01b0fafe, 0x01a53bc0, 0x0280dbb8, 0x011b43a4, 0x000c2827}}}, + {X: Field{[10]uint32{0x018b36af, 0x0036affc, 0x0085e8aa, 0x03efb84b, 0x0106be8a, 0x01954f91, 0x02970ac2, 0x00d5a2aa, 0x0291c17a, 0x00318d36}}, Y: Field{[10]uint32{0x01a925f0, 0x0088067c, 0x0346d6d5, 0x0267181b, 0x0016eb9f, 0x02361fb5, 0x01d34bd9, 0x0029ef41, 0x01bae139, 0x001925a0}}}, + {X: Field{[10]uint32{0x027e9a7e, 0x0258b7cb, 0x0347e806, 0x02ceb235, 0x024e8361, 0x03090b5f, 0x02ab4eef, 0x00d6631b, 0x01d64d64, 0x0003b4cd}}, Y: Field{[10]uint32{0x00aa93e7, 0x01ad803f, 0x015e1eb5, 0x039fd5e3, 0x025a1552, 0x023ca2fb, 0x034b6909, 0x01ea9c8c, 0x03f819c9, 0x003c39f0}}}, + {X: Field{[10]uint32{0x02521581, 0x03656147, 0x0328ed72, 0x0191d54f, 0x02d10be1, 0x021c3fec, 0x023dbf22, 0x0167b0fd, 0x00094113, 0x0034dfe3}}, Y: Field{[10]uint32{0x011f1922, 0x0391ed27, 0x0351a191, 0x03532f8e, 0x02831467, 0x01b4f26f, 0x01f1be75, 0x0380d9cb, 0x03b9ba3a, 0x00369f2f}}}, + {X: Field{[10]uint32{0x0115c360, 0x00cd4b9d, 0x0391943c, 0x0017ba1b, 0x0005b32d, 0x031ad083, 0x02ae0611, 0x017a970e, 0x01d7c747, 0x003b8c48}}, Y: Field{[10]uint32{0x004c1686, 0x03c916ef, 0x00281b76, 0x012ae9a4, 0x01b80916, 0x02b5ec4b, 0x0047411d, 0x028eca6d, 0x023797be, 0x001c0ecb}}}, + {X: Field{[10]uint32{0x0187a12b, 0x02005f46, 0x032b5fe9, 0x024109d5, 0x023f5c72, 0x024a984c, 0x02f1a594, 0x00453a83, 0x01bc5c2b, 0x001ed0b2}}, Y: Field{[10]uint32{0x020d27da, 0x03736549, 0x019c9dc7, 0x0378c377, 0x01dd57ed, 0x024909c9, 0x03cd92a9, 0x01cf5d5b, 0x0382e85b, 0x00173dd8}}}, + {X: Field{[10]uint32{0x00a555cd, 0x01d248be, 0x033c3ad0, 0x02117da4, 0x007c8f9b, 0x003e4975, 0x039b6b9a, 0x014e8a4f, 0x039ab13a, 0x0026bd7f}}, Y: Field{[10]uint32{0x025d4153, 0x01bc7eaf, 0x0042ca33, 0x0065905c, 0x0113a9ec, 0x02423215, 0x02a13fa5, 0x011cd322, 0x009e8995, 0x0032a4fb}}}, + {X: Field{[10]uint32{0x0048dacc, 0x02061dce, 0x017b659c, 0x014215af, 0x00a5b2b8, 0x01c260f7, 0x021d591f, 0x037c6c1b, 0x027401a2, 0x0017afe8}}, Y: Field{[10]uint32{0x00f7ad18, 0x01a7f1e8, 0x020fb5fb, 0x0047d1cb, 0x0046e124, 0x008a647a, 0x004c15e8, 0x00f190a4, 0x00b96ac2, 0x0002c2b7}}}, + {X: Field{[10]uint32{0x00c81e6f, 0x00979b3f, 0x01dd3ac1, 0x0219f699, 0x000daeb4, 0x007dbafb, 0x018382bc, 0x017ab214, 0x0108465e, 0x0024ed63}}, Y: Field{[10]uint32{0x0224a4e7, 0x02cfbd46, 0x01b8cf4f, 0x03618ec7, 0x038a50b8, 0x02f2a722, 0x00646c36, 0x005e135d, 0x0118c315, 0x00152fa2}}}, + {X: Field{[10]uint32{0x036fc858, 0x00c7c772, 0x0211132c, 0x02643b6a, 0x005bc868, 0x00ad0199, 0x00943ee3, 0x0191d3ff, 0x039b4fb4, 0x0028a295}}, Y: Field{[10]uint32{0x02f14670, 0x026c54e6, 0x0239646c, 0x0053ebbd, 0x036e059b, 0x03d942ad, 0x016605f0, 0x01592006, 0x01a3d562, 0x00103ba4}}}, + {X: Field{[10]uint32{0x0206ac9a, 0x0397cab5, 0x01078e8d, 0x011fe432, 0x01add7cb, 0x0143482b, 0x01f60297, 0x015582dc, 0x0109781d, 0x0003a61e}}, Y: Field{[10]uint32{0x029819d2, 0x01d3c63b, 0x00907102, 0x037ab233, 0x01c55318, 0x031786a0, 0x02a346f5, 0x036b3fff, 0x02c34c80, 0x0001c486}}}, + {X: Field{[10]uint32{0x01e1dcef, 0x02cefd18, 0x00a7d1d2, 0x02a5d7a1, 0x025c84bc, 0x00e5515b, 0x00ee62ae, 0x02035ff0, 0x011d1587, 0x000a47fc}}, Y: Field{[10]uint32{0x03ec2616, 0x000d9a94, 0x02ceec23, 0x00de4cd6, 0x0171e79e, 0x00892a51, 0x00298ce8, 0x02152d9c, 0x03e8abb6, 0x00317232}}}, + {X: Field{[10]uint32{0x01e315b4, 0x02600fbf, 0x03d824bd, 0x005ae37f, 0x01efda7d, 0x01cea84c, 0x03d9e573, 0x02d4f90a, 0x03909e28, 0x0012b6c4}}, Y: Field{[10]uint32{0x00b1456a, 0x03b37d75, 0x023eefa2, 0x00093f79, 0x0124eb70, 0x0303266c, 0x00a796e5, 0x02b9f25c, 0x0312b827, 0x0019b5fa}}}, + {X: Field{[10]uint32{0x027591ff, 0x029c0936, 0x033846b3, 0x0237902f, 0x0201707a, 0x00951807, 0x007e47b2, 0x003bf78f, 0x034b9524, 0x00157897}}, Y: Field{[10]uint32{0x00c830c2, 0x038ad6de, 0x022664b1, 0x038c8ba0, 0x03e4491a, 0x00b72e82, 0x03000b37, 0x0181b5d0, 0x017b7e98, 0x003a7c89}}}, + {X: Field{[10]uint32{0x02747eca, 0x00016c7e, 0x03ad8aa3, 0x00063084, 0x01388ddd, 0x0118e0d3, 0x03a6d8d5, 0x03f0caf9, 0x0093e41d, 0x0034939d}}, Y: Field{[10]uint32{0x00c26cac, 0x02de18d2, 0x01e93fc4, 0x028260ae, 0x026d7feb, 0x0053527c, 0x01f5bee4, 0x012c597a, 0x0216a51b, 0x0039cea0}}}, + {X: Field{[10]uint32{0x01fd8b2a, 0x03ba84d8, 0x027d9ed8, 0x01880648, 0x03caa035, 0x03b586bd, 0x03e46003, 0x0176872d, 0x02526d01, 0x0029442c}}, Y: Field{[10]uint32{0x02bea726, 0x0174bce2, 0x01adc356, 0x03ca8004, 0x01eaa2b2, 0x0031b11e, 0x02b15a28, 0x02aee98f, 0x02a09015, 0x000f6630}}}, + {X: Field{[10]uint32{0x03b314d1, 0x030ad221, 0x01f4f6b8, 0x039bf9a0, 0x008404cd, 0x029575db, 0x03ac63cc, 0x00035456, 0x00d81275, 0x00301341}}, Y: Field{[10]uint32{0x034d9d59, 0x01019eb6, 0x02e1b98c, 0x01637dff, 0x00e3cd44, 0x006f0205, 0x00db9373, 0x003aea67, 0x01779fb8, 0x0032cff3}}}, + {X: Field{[10]uint32{0x02bd0649, 0x01c3e43b, 0x0245a0df, 0x03fe9e24, 0x006b5dd2, 0x023fe9dc, 0x0051e691, 0x00cd5eea, 0x0061146c, 0x003b271f}}, Y: Field{[10]uint32{0x01186170, 0x03438f4f, 0x027a4daf, 0x0026c498, 0x03b36b07, 0x02458648, 0x028803ce, 0x01a48f01, 0x03fa10ca, 0x00268274}}}, + {X: Field{[10]uint32{0x020488cc, 0x033b5602, 0x030640ba, 0x0044b294, 0x03b25985, 0x02017952, 0x037e8403, 0x013117d2, 0x013f5d50, 0x002577d7}}, Y: Field{[10]uint32{0x00e8ecc6, 0x01ab5213, 0x00c21c7a, 0x036dd0f7, 0x0235079c, 0x00facc16, 0x03d1ef32, 0x014c16c1, 0x018589b8, 0x00290f73}}}, + {X: Field{[10]uint32{0x033a6d16, 0x00b511d8, 0x016510c7, 0x0135aec6, 0x012fc8ec, 0x0177fe52, 0x02bf50eb, 0x00314b11, 0x020c3a95, 0x002e3bb3}}, Y: Field{[10]uint32{0x01583744, 0x02c23875, 0x0384b8d0, 0x00b338fe, 0x024a4957, 0x025a68b0, 0x02c1460d, 0x02fe0ee9, 0x02a31b75, 0x001d3a50}}}, + {X: Field{[10]uint32{0x02dd09a2, 0x002fc71c, 0x000ba052, 0x01df178b, 0x00c82b2d, 0x014487a8, 0x01eac517, 0x0270894f, 0x0216d1f6, 0x001667b3}}, Y: Field{[10]uint32{0x0111bb14, 0x00f48c6a, 0x038599f7, 0x01c99908, 0x00b2fdb6, 0x035eebd2, 0x00e2e725, 0x00f43b76, 0x00c325af, 0x00012284}}}, + {X: Field{[10]uint32{0x0282ab32, 0x017f37c3, 0x023bc35a, 0x006eee93, 0x007fff71, 0x0186b360, 0x02fdfaa9, 0x0162a5b8, 0x02068d94, 0x002e2e96}}, Y: Field{[10]uint32{0x00f8ca4d, 0x0133b314, 0x007e32d4, 0x005db8ab, 0x03c2d824, 0x0134ca94, 0x00388454, 0x0160b824, 0x03227554, 0x00200d6a}}}, + {X: Field{[10]uint32{0x027e65f4, 0x017b45c8, 0x00c508c3, 0x020285c4, 0x03ae8063, 0x006c7ffc, 0x02d3d7af, 0x01e19795, 0x03e1cccd, 0x002da11a}}, Y: Field{[10]uint32{0x00bc7201, 0x039bed83, 0x0224177f, 0x03527039, 0x03361ee9, 0x0208c1d8, 0x0189f526, 0x017c2b7a, 0x00253294, 0x002ef6dc}}}, + {X: Field{[10]uint32{0x01a9d0fe, 0x0203fe03, 0x032ffc35, 0x02ce8464, 0x0120dd31, 0x0211b668, 0x0009e53f, 0x00aefbb4, 0x025e6987, 0x00287fe9}}, Y: Field{[10]uint32{0x02da215b, 0x00116c73, 0x02adadc0, 0x032c9a11, 0x0331c210, 0x022dae9b, 0x00549996, 0x00efe774, 0x0180d576, 0x002a8cb9}}}, + {X: Field{[10]uint32{0x030d0fa2, 0x03e6885c, 0x02ebeb62, 0x035b7997, 0x022ad73c, 0x0033bc22, 0x008c7078, 0x0071f7d1, 0x036d6709, 0x0026ce05}}, Y: Field{[10]uint32{0x02609207, 0x01813b53, 0x019d26fb, 0x02206412, 0x0264a459, 0x023fd665, 0x02c86bab, 0x026dfbc7, 0x0319c0fb, 0x0008b49a}}}, + {X: Field{[10]uint32{0x01fd0cd2, 0x014a104d, 0x008981fa, 0x0135f7ab, 0x020accfa, 0x036ad0fe, 0x0132553b, 0x03193eec, 0x009e209d, 0x002f0b33}}, Y: Field{[10]uint32{0x015ccfa6, 0x0160c169, 0x0134374d, 0x004dc624, 0x01350d1d, 0x021e47ef, 0x034931ba, 0x03e22c19, 0x02dc176f, 0x0011cd9a}}}, + {X: Field{[10]uint32{0x00730f6a, 0x01f735c9, 0x03aa607a, 0x00d39fe4, 0x00d45187, 0x03ef4a8c, 0x0036f514, 0x00a98974, 0x00a16545, 0x00073800}}, Y: Field{[10]uint32{0x01c6811d, 0x0018abcd, 0x02c19ee3, 0x0336dac3, 0x03fa288a, 0x038f56fc, 0x0334baf3, 0x03c3b552, 0x03fb5b90, 0x00382440}}}, + {X: Field{[10]uint32{0x01e0031f, 0x033742b7, 0x0109d63d, 0x01a13682, 0x034cc63d, 0x02718911, 0x03b26a44, 0x019303a3, 0x029a887d, 0x00211b15}}, Y: Field{[10]uint32{0x0212c07e, 0x010231be, 0x03be47df, 0x0111de61, 0x0207dcbe, 0x013fc105, 0x03acf93d, 0x027e635f, 0x0353132c, 0x0000151d}}}, + {X: Field{[10]uint32{0x00fe59e9, 0x0207a95d, 0x00b82f5c, 0x007d5321, 0x03701f7b, 0x01a1ac62, 0x00585185, 0x01b88f27, 0x00f72865, 0x0018d96a}}, Y: Field{[10]uint32{0x0316c2eb, 0x0273e9fa, 0x0023fc8d, 0x02d5fff3, 0x01be27f2, 0x027302cf, 0x0151d46c, 0x0394f2b4, 0x01fda992, 0x00231f37}}}, + {X: Field{[10]uint32{0x012939fc, 0x019fe01f, 0x0237fbd2, 0x03d66314, 0x0371dc5b, 0x017a3f45, 0x01726195, 0x00f6365e, 0x033c89ae, 0x003b5097}}, Y: Field{[10]uint32{0x01a3590b, 0x03f580a6, 0x01d74daf, 0x0341b8f0, 0x02010c98, 0x0273c53d, 0x03285fd1, 0x0280ef35, 0x03dc14f7, 0x001089aa}}}, + {X: Field{[10]uint32{0x031f00c7, 0x01b728e5, 0x03d5662a, 0x01e8ba40, 0x0285a0bd, 0x02b8c42f, 0x0267f235, 0x01fafa35, 0x006c2e1b, 0x00336949}}, Y: Field{[10]uint32{0x01247f56, 0x020922ca, 0x013f6eae, 0x03cc879b, 0x0296b2c2, 0x006293fa, 0x00534ba3, 0x026cd246, 0x0296f8ea, 0x001e47bc}}}, + {X: Field{[10]uint32{0x00eaf99e, 0x01a968fd, 0x03bc6f90, 0x0260e1be, 0x02f5017d, 0x025a8470, 0x01d3f7e5, 0x030786fb, 0x00e6ce79, 0x002d0aa1}}, Y: Field{[10]uint32{0x0007e6ac, 0x03e903b5, 0x02610823, 0x0005c2c0, 0x03cc3d06, 0x01d427f2, 0x03fad5e4, 0x00dc60db, 0x00c960bb, 0x000b9c8b}}}, + {X: Field{[10]uint32{0x030bcf90, 0x01a807ea, 0x024c16d4, 0x0342ea14, 0x01be23ca, 0x021c021d, 0x03149df5, 0x03a6f2d0, 0x008ce1e2, 0x000d62f8}}, Y: Field{[10]uint32{0x039d1308, 0x00171107, 0x01b0034f, 0x0298d922, 0x03462318, 0x01bd4446, 0x00fe0bfb, 0x02b333d9, 0x02f070ba, 0x003cf13f}}}, + {X: Field{[10]uint32{0x0016a789, 0x02784d58, 0x03ac985c, 0x03de6d0c, 0x01427d16, 0x0115c410, 0x0374bfe1, 0x0188c293, 0x035de5b3, 0x000fb590}}, Y: Field{[10]uint32{0x0041f26f, 0x0249d898, 0x02d9104b, 0x01b56a95, 0x03ee0dc5, 0x014b4f7f, 0x03e677e3, 0x010f4ad6, 0x005e1427, 0x00071cba}}}, + {X: Field{[10]uint32{0x0016c910, 0x00f67989, 0x00610c25, 0x0142e494, 0x000afb7e, 0x01c85dbd, 0x000d7e26, 0x03685965, 0x022c580d, 0x000927df}}, Y: Field{[10]uint32{0x02a9f50c, 0x01c51ece, 0x02e486dc, 0x0021e7a5, 0x021630f5, 0x037378db, 0x030f8423, 0x0245ba3d, 0x031149e9, 0x001bf058}}}, + {X: Field{[10]uint32{0x009cc85f, 0x00379bb2, 0x00d4c69f, 0x01bdbd06, 0x0114d2d7, 0x014b2fe4, 0x00f6f0b7, 0x006e8c6c, 0x0144e838, 0x0025ecec}}, Y: Field{[10]uint32{0x0188724f, 0x00111372, 0x01dc2182, 0x01827904, 0x02f72822, 0x03c77a16, 0x00492570, 0x0082d685, 0x013033b7, 0x0019f26f}}}, + {X: Field{[10]uint32{0x03395a85, 0x03bbc697, 0x01b68cfa, 0x0038e57a, 0x0380610d, 0x00491421, 0x010fcaf4, 0x00a44947, 0x019e868b, 0x000ece11}}, Y: Field{[10]uint32{0x0225ce6f, 0x02392754, 0x023a3c3e, 0x00966c5f, 0x0391ec4c, 0x01dc917a, 0x00cc9a2b, 0x01d1531e, 0x00ddbfde, 0x002f9460}}}, + {X: Field{[10]uint32{0x02163ebf, 0x03f88725, 0x017efc54, 0x03452680, 0x0074fb35, 0x0209c3f4, 0x00974f44, 0x03822a45, 0x03909f33, 0x00139bc5}}, Y: Field{[10]uint32{0x02b9fd15, 0x03341e39, 0x026a3e56, 0x02035dd3, 0x000dcd28, 0x02a69793, 0x02d34913, 0x01c5596d, 0x038f06f4, 0x0003ed95}}}, + {X: Field{[10]uint32{0x015c75de, 0x02ccb68c, 0x01a9218d, 0x02ddd586, 0x0272e301, 0x00289597, 0x025a0a67, 0x024df5d0, 0x0063e408, 0x0024506b}}, Y: Field{[10]uint32{0x006d6045, 0x024713d5, 0x007a05de, 0x037ef5e1, 0x03f10b34, 0x00aa95f6, 0x0055e721, 0x030f84f3, 0x010a56be, 0x0034d78a}}}, + {X: Field{[10]uint32{0x015ba578, 0x00b1844e, 0x01aa2e21, 0x018a23b7, 0x00337c91, 0x013f2480, 0x01c006a0, 0x009d4559, 0x03ca7205, 0x003b26dc}}, Y: Field{[10]uint32{0x00224887, 0x014043cf, 0x039051b1, 0x01d53139, 0x01ba1922, 0x031d38bc, 0x015f3ab4, 0x00b9dce3, 0x02f5c1a2, 0x000df847}}}, + {X: Field{[10]uint32{0x021caca3, 0x016e06b3, 0x00d7ef0f, 0x0022f94c, 0x01aef502, 0x03aab1b9, 0x00430b1f, 0x024a3f38, 0x00e1bb1a, 0x0015bf05}}, Y: Field{[10]uint32{0x00209001, 0x01fcc1e4, 0x01865f6d, 0x01f30e36, 0x03b05e59, 0x0203d14a, 0x03101d7a, 0x00341e7c, 0x0084f868, 0x00139698}}}, + {X: Field{[10]uint32{0x017df731, 0x00ea2699, 0x021e4d80, 0x030fc603, 0x00cf3997, 0x003c6c8b, 0x037c3627, 0x0353320a, 0x001b2ceb, 0x002bb35d}}, Y: Field{[10]uint32{0x010b8e21, 0x0315f9fe, 0x03d4d8cc, 0x005c2bff, 0x02256bd3, 0x037426ce, 0x036356e8, 0x03d27c64, 0x03336c0d, 0x0017c412}}}, + {X: Field{[10]uint32{0x01836cb8, 0x03e2f505, 0x03f0d418, 0x01c8c70f, 0x039b5c10, 0x00c27a7a, 0x0222b9a4, 0x00f54892, 0x03af54f8, 0x00145899}}, Y: Field{[10]uint32{0x03efe4fc, 0x0248261e, 0x0313d865, 0x017628f6, 0x01cc37e8, 0x02dae10e, 0x02f6fd54, 0x00b05fd3, 0x009b9e06, 0x001061ce}}}, + {X: Field{[10]uint32{0x0066fed5, 0x023d50c9, 0x007e7f25, 0x0371b84a, 0x036e7658, 0x00e0ed3f, 0x01a03687, 0x0111cfe4, 0x02bd8d3f, 0x001a2efa}}, Y: Field{[10]uint32{0x017049c4, 0x018d6b42, 0x03c27048, 0x01e9a8e0, 0x008656fc, 0x025e356c, 0x027f7ccd, 0x026d09e9, 0x000f0ac9, 0x0033d8f2}}}, + {X: Field{[10]uint32{0x007b67be, 0x036fad6c, 0x018a2b90, 0x023e4259, 0x0049ba90, 0x02d4b079, 0x01592138, 0x01fa6d47, 0x02ab6946, 0x00083388}}, Y: Field{[10]uint32{0x0297ce2d, 0x008374b7, 0x00c3e68f, 0x03c52a77, 0x0331649f, 0x026e8b05, 0x032d17e4, 0x01cfda48, 0x007d9f41, 0x00158b68}}}, + {X: Field{[10]uint32{0x02798f78, 0x00582b1b, 0x00b07d04, 0x0241ffe0, 0x029c86cd, 0x014855e1, 0x03c1ec6a, 0x027e48eb, 0x02d3a4a5, 0x002d6df5}}, Y: Field{[10]uint32{0x029d4de5, 0x03cf9e7f, 0x02dbcb8e, 0x02e96efd, 0x0045b5ea, 0x034565ed, 0x03c55af4, 0x0097b836, 0x02c97751, 0x0034178c}}}, + {X: Field{[10]uint32{0x03f45df4, 0x0130c28c, 0x03d4acdc, 0x024dac1d, 0x023967e5, 0x01d7db6e, 0x023d848f, 0x0202c577, 0x00897a42, 0x002556f5}}, Y: Field{[10]uint32{0x01453a02, 0x03e5cd0f, 0x016b2749, 0x006d12c5, 0x01644826, 0x03c97700, 0x03b9fe5b, 0x026473bc, 0x03cb5d79, 0x0012efad}}}, + {X: Field{[10]uint32{0x020a5a98, 0x0391fe19, 0x02211201, 0x0126721d, 0x0150fee8, 0x02fd4dcd, 0x0002fe18, 0x00dc3acf, 0x015198e7, 0x0027d83a}}, Y: Field{[10]uint32{0x00d613cc, 0x00b13e93, 0x00a6a3a6, 0x03a98b8a, 0x03c865a7, 0x00c87626, 0x02570f59, 0x01619a80, 0x02a933ed, 0x0018e56a}}}, + {X: Field{[10]uint32{0x00d776ee, 0x03cb5394, 0x01468999, 0x01642895, 0x009c2b64, 0x02269c40, 0x00041c75, 0x00f436f9, 0x00b6f592, 0x001c207c}}, Y: Field{[10]uint32{0x028f9fc9, 0x02a7fdd9, 0x00758403, 0x028ca231, 0x0227f3f0, 0x02fca2d2, 0x02ec9c91, 0x00067a4e, 0x0005e067, 0x00272d80}}}, + {X: Field{[10]uint32{0x0369561f, 0x02adcecc, 0x023fffb0, 0x00161f99, 0x02b607d6, 0x0358fbe6, 0x00e982ab, 0x0169f06c, 0x01800d8d, 0x00038a40}}, Y: Field{[10]uint32{0x00d924f7, 0x022345f5, 0x01f7861b, 0x006850a6, 0x01993f74, 0x002d5394, 0x00ccc7b8, 0x02692894, 0x02fe7728, 0x001189dd}}}, + {X: Field{[10]uint32{0x00598bfb, 0x031590d6, 0x035212f4, 0x037f10b2, 0x00ac254c, 0x017231ad, 0x03d5939c, 0x02f57ad8, 0x0328b285, 0x0022ba9c}}, Y: Field{[10]uint32{0x01568ec2, 0x0064be02, 0x01e228e0, 0x03ba6436, 0x0213819a, 0x03281602, 0x00a559a8, 0x0157ffad, 0x027704fc, 0x002da0b6}}}, + {X: Field{[10]uint32{0x03256e68, 0x005e418b, 0x010feb3a, 0x01e877fa, 0x0127302d, 0x01619702, 0x00fc2874, 0x012d5fa9, 0x00b254b2, 0x003a7442}}, Y: Field{[10]uint32{0x03a128d0, 0x01ee4e6a, 0x032c48f6, 0x026a9169, 0x018d0ba6, 0x02bc50d9, 0x030fc0b1, 0x0367ef9e, 0x02746d29, 0x0003ffdc}}}, + {X: Field{[10]uint32{0x01ba0fee, 0x021ae1ab, 0x009136d8, 0x00505f4a, 0x00b81f29, 0x00a79332, 0x02d49094, 0x01f985e1, 0x013d1f31, 0x0027a87e}}, Y: Field{[10]uint32{0x0180ec0a, 0x031af91a, 0x036e45d9, 0x0002e564, 0x01975a5c, 0x03f7b845, 0x023ba6aa, 0x02cd45b9, 0x0325d3b0, 0x0008c77f}}}, + {X: Field{[10]uint32{0x001e7a0d, 0x006da352, 0x000c5718, 0x00042166, 0x0080701d, 0x00fa354c, 0x00d687c4, 0x02efb81f, 0x0015e5fa, 0x003a2849}}, Y: Field{[10]uint32{0x022f62c6, 0x02886e64, 0x005dd5d6, 0x03c8b80e, 0x030ac53b, 0x021d15c9, 0x0062f185, 0x039d1a65, 0x039ce263, 0x00375a60}}}, + {X: Field{[10]uint32{0x02c3def2, 0x011bfcc1, 0x02cefb44, 0x01009d8d, 0x02ed7968, 0x03db5706, 0x002e04c7, 0x01851687, 0x03baae48, 0x0038a1fc}}, Y: Field{[10]uint32{0x01968c63, 0x02e7efe7, 0x016e0be5, 0x0239f9af, 0x005bcfbe, 0x03c85560, 0x0053baef, 0x02c3a93b, 0x013d401d, 0x0024e550}}}, + {X: Field{[10]uint32{0x02ad1194, 0x02583755, 0x03927641, 0x00c9aadd, 0x01fb23e2, 0x0053239f, 0x01756eba, 0x016ac39e, 0x039cec20, 0x0023e67d}}, Y: Field{[10]uint32{0x0019a2ea, 0x03ffe67a, 0x02de8c5d, 0x013f27c2, 0x0089cbff, 0x0226c92f, 0x021b0da3, 0x01b5b8bd, 0x03e615cc, 0x00201654}}}, + {X: Field{[10]uint32{0x0366f586, 0x00f0d0f1, 0x03e14c6b, 0x0351ebcc, 0x013adb63, 0x01687fdb, 0x00dfb59e, 0x008eb783, 0x036a8cb7, 0x002721ea}}, Y: Field{[10]uint32{0x0165bb19, 0x031ba2aa, 0x002004ed, 0x038dd61d, 0x036a3699, 0x032073fd, 0x01012cbb, 0x035e79f5, 0x01227a3b, 0x001d1e60}}}, + {X: Field{[10]uint32{0x019dc00a, 0x03b1d776, 0x03c3ec75, 0x0141f622, 0x006042bd, 0x02d44bfd, 0x02a10b7f, 0x0177902e, 0x02086f24, 0x00314b21}}, Y: Field{[10]uint32{0x02b3f844, 0x016b80d2, 0x01cc2ca0, 0x01b017ed, 0x0385e540, 0x01f50bf9, 0x00762d83, 0x02e2f672, 0x013abae8, 0x003a30a0}}}, + {X: Field{[10]uint32{0x028dafb2, 0x0138582e, 0x030ded8d, 0x03f419aa, 0x000dd7c3, 0x02f58d2b, 0x039c6b6e, 0x02f89669, 0x02e194d5, 0x0002d8a1}}, Y: Field{[10]uint32{0x019b5910, 0x00e156a2, 0x034aa18b, 0x0090a80c, 0x0027eaaf, 0x01e64549, 0x03cdf7b4, 0x03c9c1dd, 0x02a8ee0b, 0x001cbb0b}}}, + {X: Field{[10]uint32{0x03086b6d, 0x035b4d0b, 0x024ce8c5, 0x02817cee, 0x0245c648, 0x01c32a26, 0x013792e3, 0x00be2dc8, 0x02f2045f, 0x0037ded5}}, Y: Field{[10]uint32{0x0196ab4a, 0x008eb985, 0x02cb43df, 0x0335765f, 0x0139ac18, 0x000e6e5b, 0x009fc90d, 0x02f73d08, 0x01483850, 0x000e1b3b}}}, + {X: Field{[10]uint32{0x0146a3b0, 0x03341a1b, 0x0020f48e, 0x00dd9d79, 0x01459b2b, 0x0192aad6, 0x01110eda, 0x008d5cfa, 0x009f4cd4, 0x000ab3d3}}, Y: Field{[10]uint32{0x022cc579, 0x00a15f56, 0x000cff62, 0x02be5513, 0x0258b37b, 0x009487fe, 0x01ff9bbd, 0x03a60737, 0x0029aea5, 0x0017c696}}}, + {X: Field{[10]uint32{0x00d33f36, 0x02da1367, 0x03877586, 0x02b29082, 0x026a64f2, 0x00d48dcb, 0x010033db, 0x034de1c8, 0x01aaeb55, 0x002febe5}}, Y: Field{[10]uint32{0x00a3d8ee, 0x000f36ac, 0x03b0f608, 0x00b97c50, 0x0378c6ed, 0x02fe7b20, 0x02fce3eb, 0x039db8a8, 0x0313bb61, 0x001f48ae}}}, + {X: Field{[10]uint32{0x00f31421, 0x035f635d, 0x01f6a6ad, 0x02a4528a, 0x01faacb6, 0x01627329, 0x0393c9ef, 0x02a24369, 0x03604eab, 0x001e3374}}, Y: Field{[10]uint32{0x0219a634, 0x028e373a, 0x00bfd327, 0x023bebfd, 0x0376430c, 0x02d788a1, 0x030d60ef, 0x0007445a, 0x001505b8, 0x003b5fa7}}}, + {X: Field{[10]uint32{0x01213d2e, 0x010f08a3, 0x00276d98, 0x0131f2da, 0x01edb894, 0x019aa292, 0x03977135, 0x00e47f1e, 0x03a9050a, 0x003cbaf3}}, Y: Field{[10]uint32{0x00fa4eaa, 0x03d79e2c, 0x01900bb3, 0x00593cf7, 0x0309513d, 0x01a754d3, 0x03a180c5, 0x027c4f14, 0x030d956f, 0x002c71d8}}}, + {X: Field{[10]uint32{0x02af4c2b, 0x0142e746, 0x00adfca8, 0x02aba056, 0x02857593, 0x01154bab, 0x00199433, 0x032ecc33, 0x020d83bf, 0x00010f35}}, Y: Field{[10]uint32{0x007e8f62, 0x02784418, 0x0130247e, 0x00313f33, 0x01099623, 0x00926633, 0x023d6592, 0x0079ae78, 0x02b10f72, 0x003fd92e}}}, + {X: Field{[10]uint32{0x038ea93c, 0x0025c27c, 0x01315f92, 0x03ee97b0, 0x0302168d, 0x009fc4ed, 0x020c3a3b, 0x012775ef, 0x00e0c01a, 0x00106497}}, Y: Field{[10]uint32{0x00f77110, 0x03c362e5, 0x02c26c48, 0x01dbc512, 0x01a725a6, 0x02c0b66a, 0x02f49c19, 0x002b0068, 0x015ecb6a, 0x0014d1ae}}}, + {X: Field{[10]uint32{0x023877e5, 0x03b396cc, 0x03eee3e6, 0x00c9f89b, 0x000fa1c2, 0x0343b836, 0x011bb478, 0x00b60aa1, 0x02106c76, 0x003f48c4}}, Y: Field{[10]uint32{0x016fa162, 0x00bead3e, 0x0266e7eb, 0x018876cf, 0x014bf334, 0x00d3bb70, 0x03748d62, 0x03b3a2eb, 0x0316f5a6, 0x000e5d8c}}}, + {X: Field{[10]uint32{0x00556ef7, 0x01a0f63d, 0x01cb26ea, 0x012c0341, 0x03d5ad68, 0x028f4727, 0x0254a0a0, 0x02f87cda, 0x0298cb7a, 0x003f8fa2}}, Y: Field{[10]uint32{0x031223bf, 0x02503813, 0x0346c3fa, 0x01d6af81, 0x00837b44, 0x02b56992, 0x03f05f9b, 0x00198e87, 0x027734d8, 0x001f4881}}}, + {X: Field{[10]uint32{0x035ec5dd, 0x023adcd3, 0x01ab69ba, 0x02521060, 0x0338232e, 0x01c5c5f6, 0x03f9b1d2, 0x006f7130, 0x0364ae0d, 0x003980a9}}, Y: Field{[10]uint32{0x00916fdb, 0x00f9bd33, 0x03450d51, 0x03d5ed20, 0x028bc9be, 0x02dded20, 0x001f9516, 0x022c400b, 0x00aa2626, 0x002b440e}}}, + {X: Field{[10]uint32{0x0181e086, 0x02f1bfe3, 0x0364eeb0, 0x00b40d91, 0x03321814, 0x01774e46, 0x01cd9620, 0x01cb65c6, 0x01cfadb7, 0x0021c625}}, Y: Field{[10]uint32{0x0337722e, 0x0322658f, 0x029cb555, 0x03293989, 0x00dda2c9, 0x00e184d4, 0x011ef565, 0x01908675, 0x0064f791, 0x00126824}}}, + {X: Field{[10]uint32{0x03a7e4b4, 0x00e83803, 0x0107f4ab, 0x013d3052, 0x028ed4ec, 0x03ef315b, 0x014ec278, 0x01601720, 0x016e7775, 0x00388a75}}, Y: Field{[10]uint32{0x00e48af2, 0x02ae4205, 0x03ce5795, 0x026ab9ba, 0x006d4265, 0x00f3abaa, 0x017a46b6, 0x020156fb, 0x02bd66d6, 0x00336c1f}}}, + {X: Field{[10]uint32{0x00bbf8ed, 0x02a54dda, 0x01dd6ca4, 0x02be9c2b, 0x03471066, 0x034835a3, 0x00a31189, 0x0321a223, 0x03856b0c, 0x000154d7}}, Y: Field{[10]uint32{0x030ac5e8, 0x012096dd, 0x02c296ab, 0x014d3de9, 0x01f6f529, 0x030c81a8, 0x027822fa, 0x00a99e10, 0x0044245e, 0x00219572}}}, + {X: Field{[10]uint32{0x00767ad6, 0x00d7b949, 0x0130c0dd, 0x00843edc, 0x00b8c48d, 0x00f4419b, 0x000d78e0, 0x033a6b89, 0x01054b37, 0x0004195e}}, Y: Field{[10]uint32{0x03e125f5, 0x02077520, 0x02be2e8b, 0x02bf84ce, 0x004393a5, 0x000d57dc, 0x00eb013c, 0x0186400a, 0x037a508a, 0x0014a0da}}}, + {X: Field{[10]uint32{0x00868c1c, 0x02c3fce8, 0x00e4be6c, 0x00321d0a, 0x00e796db, 0x00d11dde, 0x029e311e, 0x03408e67, 0x02072521, 0x000cd9ac}}, Y: Field{[10]uint32{0x0311638c, 0x0168a350, 0x00ae3025, 0x0191d28d, 0x00ac908c, 0x026660e5, 0x032f15d3, 0x0374b29f, 0x02a422a8, 0x003b1808}}}, + {X: Field{[10]uint32{0x035953ca, 0x00c0c582, 0x03332f26, 0x01919905, 0x0291bd01, 0x027f6d07, 0x0208a1f5, 0x0391b1cd, 0x0396339b, 0x00129e24}}, Y: Field{[10]uint32{0x01b4c442, 0x008fbe79, 0x021013a1, 0x011ab86e, 0x016e6e03, 0x03ae1863, 0x01c0af84, 0x02b51602, 0x017f615a, 0x003516d9}}}, + {X: Field{[10]uint32{0x01f1302e, 0x0251f8e2, 0x030fcae9, 0x02d5eae7, 0x00d75d70, 0x037d818a, 0x00c64ad4, 0x0271ff70, 0x0084fa0a, 0x003b93c9}}, Y: Field{[10]uint32{0x01f80170, 0x03afd082, 0x003cbf81, 0x00fd1e95, 0x03409207, 0x036add28, 0x03dbd0d8, 0x037ebb7d, 0x0094d8ec, 0x0014adde}}}, + {X: Field{[10]uint32{0x01f30a1f, 0x02567f89, 0x02c0eaf9, 0x01831421, 0x039aa9b7, 0x000d7da8, 0x037fbb83, 0x0089bde4, 0x035c163f, 0x00010256}}, Y: Field{[10]uint32{0x01dff7ab, 0x011f1601, 0x025aad55, 0x00ca4c11, 0x006a15d0, 0x030167d9, 0x03145955, 0x01353ba6, 0x00ac6555, 0x00073860}}}, + {X: Field{[10]uint32{0x00436a24, 0x03318bec, 0x034943d6, 0x02734bd4, 0x037a36a5, 0x00062fee, 0x02ecd9fd, 0x02750904, 0x013b067d, 0x001a8897}}, Y: Field{[10]uint32{0x027c2701, 0x0213e67a, 0x008da6a3, 0x02f31cf1, 0x03cc698a, 0x00c0164b, 0x023c91ee, 0x038332a8, 0x023d9352, 0x000a6cf5}}}, + {X: Field{[10]uint32{0x01d36e93, 0x0343235c, 0x0057cf46, 0x015253c8, 0x02172492, 0x00fd2e78, 0x0153a89e, 0x02eeff1a, 0x0241e5f9, 0x0008fbea}}, Y: Field{[10]uint32{0x00db789d, 0x023924df, 0x0386ef21, 0x02844c56, 0x0188cea3, 0x0309a486, 0x03d70755, 0x01c68816, 0x03b17f26, 0x00332269}}}, + {X: Field{[10]uint32{0x033ae55f, 0x02b42053, 0x0066a258, 0x01afd8df, 0x02f97217, 0x028e62b8, 0x01591bd6, 0x02655d63, 0x0297f7f9, 0x0038c307}}, Y: Field{[10]uint32{0x026509e1, 0x0192c061, 0x02df311e, 0x0155a096, 0x013e8e47, 0x034a6f62, 0x01edb4d4, 0x03a497f0, 0x036c3e66, 0x00069c32}}}, + {X: Field{[10]uint32{0x0308e278, 0x0328caf7, 0x01265b57, 0x02444f23, 0x03f05aac, 0x018061da, 0x0212f534, 0x005b54ad, 0x0382acd4, 0x002f9935}}, Y: Field{[10]uint32{0x03ad7e4a, 0x01ab3561, 0x0261f946, 0x017d6887, 0x03bff8f1, 0x00f2d413, 0x03b81c87, 0x00df24a4, 0x004a43e8, 0x001e9061}}}, + {X: Field{[10]uint32{0x023822ac, 0x00930e3c, 0x0145076d, 0x02e35291, 0x0073ada0, 0x00bf7cbc, 0x032b4c28, 0x02987019, 0x02bee009, 0x0032ab00}}, Y: Field{[10]uint32{0x0216d06f, 0x03298be4, 0x008ea500, 0x013f1984, 0x0172a9a6, 0x01711579, 0x02cc3047, 0x03d3888e, 0x00bba040, 0x001f64f9}}}, + {X: Field{[10]uint32{0x0284ccb3, 0x03b079c1, 0x02860fc0, 0x030e1b43, 0x03c1ef94, 0x0385c66c, 0x009321e0, 0x03aa5248, 0x01b03a9c, 0x0036894e}}, Y: Field{[10]uint32{0x023cf9f5, 0x0172fc33, 0x01f15779, 0x01bda8cf, 0x00b1b130, 0x0019fa69, 0x03f601f8, 0x033a8bd9, 0x0387bef1, 0x003a1784}}}, + {X: Field{[10]uint32{0x019cc0ed, 0x003a4d9e, 0x00198070, 0x01eefa6d, 0x024ce4fe, 0x03673ee9, 0x03c1bd8a, 0x01492192, 0x01525c96, 0x002fcbb9}}, Y: Field{[10]uint32{0x0058f18e, 0x00c0c3d8, 0x0304f634, 0x02639d80, 0x035df423, 0x000ce408, 0x01529bc3, 0x02289284, 0x021db129, 0x0022277a}}}, + {X: Field{[10]uint32{0x03abde36, 0x0259f051, 0x0226430b, 0x00a9c829, 0x01113060, 0x0290b18d, 0x024c9ff7, 0x00d98a7f, 0x0141cb0c, 0x002cf92c}}, Y: Field{[10]uint32{0x02865657, 0x01f22a94, 0x01f56a7d, 0x02ecb906, 0x03eff979, 0x035abffa, 0x00ff83e5, 0x020a3631, 0x0118c38a, 0x003d9bdc}}}, + {X: Field{[10]uint32{0x009475a0, 0x01ee9622, 0x03e01496, 0x024d8f0c, 0x0124a255, 0x02888d92, 0x01818265, 0x00846844, 0x024ffad7, 0x001147ac}}, Y: Field{[10]uint32{0x00565bb6, 0x01506791, 0x001a21fe, 0x0316fec5, 0x034cb2f8, 0x0307ccf8, 0x01bd3211, 0x030ede69, 0x014049f6, 0x002227fe}}}, + {X: Field{[10]uint32{0x00f5984c, 0x019741ce, 0x03c53b5d, 0x02fd2f03, 0x03ea4c77, 0x012e2bcc, 0x027a0b0c, 0x011de084, 0x018a6a75, 0x000a6ad9}}, Y: Field{[10]uint32{0x03f0f2c1, 0x0380688a, 0x016d215e, 0x02aae02c, 0x02947b8b, 0x01cb69af, 0x0219f9ad, 0x01b0ec29, 0x01a9c77d, 0x002aac6f}}}, + {X: Field{[10]uint32{0x017b24db, 0x026cd04a, 0x038ac287, 0x026b1953, 0x0209d9e7, 0x0076967e, 0x03bb9c0d, 0x03089016, 0x0007d815, 0x0026d671}}, Y: Field{[10]uint32{0x0276d190, 0x006ae369, 0x0376cc76, 0x02d826c6, 0x0117bb35, 0x02eb302a, 0x0027811a, 0x0004530a, 0x018ee630, 0x00293bc1}}}, + {X: Field{[10]uint32{0x026c9fd0, 0x01939d29, 0x0220fc05, 0x01e94ab1, 0x0378e69a, 0x01b0eb1d, 0x01b970e7, 0x02e5d62e, 0x036582ae, 0x0021f49e}}, Y: Field{[10]uint32{0x03511e03, 0x0026384d, 0x00b1acd9, 0x01724c9a, 0x0004d03d, 0x03c1fd07, 0x0083e087, 0x024cdd07, 0x03ccdec2, 0x000ffcec}}}, + {X: Field{[10]uint32{0x009701dc, 0x02e9bda6, 0x00bf4d9b, 0x020edc36, 0x037fe7d3, 0x01af2e4e, 0x005a0ab3, 0x02058ef6, 0x004d3895, 0x003eecda}}, Y: Field{[10]uint32{0x03b94504, 0x02f89921, 0x014c0301, 0x0109a297, 0x01759e73, 0x00981b42, 0x01c2af7b, 0x02cef443, 0x01c6c9c5, 0x001ec1f3}}}, + {X: Field{[10]uint32{0x0314a453, 0x033de7d0, 0x034eacc7, 0x0253e549, 0x01a3ef14, 0x019b9629, 0x03cc1adc, 0x00ae7488, 0x02e4ccc4, 0x0020808a}}, Y: Field{[10]uint32{0x01d2b695, 0x03439245, 0x02a3bb5c, 0x017a6a3a, 0x003a8180, 0x02d36d14, 0x030481a9, 0x00b6841b, 0x02509ddf, 0x00309090}}}, + {X: Field{[10]uint32{0x0220f901, 0x03b2562f, 0x0001a1db, 0x01f15f42, 0x01ab4e65, 0x0247e25d, 0x02475fae, 0x032cdeef, 0x005b3b51, 0x002e9735}}, Y: Field{[10]uint32{0x0341b0a5, 0x00e807b3, 0x0016478e, 0x0062d639, 0x007f9eb7, 0x026394c9, 0x007eddd2, 0x03d638d0, 0x03c0f8b4, 0x000b8353}}}, + {X: Field{[10]uint32{0x026703fc, 0x00197622, 0x02d277cd, 0x00eb7d6d, 0x02cfadaf, 0x00f9cb88, 0x02b44445, 0x0346f9da, 0x0041b316, 0x0004a4f2}}, Y: Field{[10]uint32{0x0133c2fa, 0x01c2ab54, 0x01749286, 0x01122012, 0x002488f1, 0x01081c27, 0x004ab523, 0x012622e1, 0x033740fb, 0x00263d63}}}, + {X: Field{[10]uint32{0x035015c6, 0x02aa6237, 0x037c2c69, 0x03923610, 0x03987d77, 0x022b8db1, 0x03972dea, 0x006f6b6e, 0x03c854bf, 0x003b27ec}}, Y: Field{[10]uint32{0x01486d3f, 0x01047329, 0x00cb2a00, 0x0152ff3b, 0x00fe425d, 0x020c9583, 0x01d6b364, 0x03a5d258, 0x03fdea59, 0x00357cd6}}}, + {X: Field{[10]uint32{0x0144d244, 0x01372dc9, 0x02d62769, 0x03b1ab6b, 0x029950ea, 0x039f563d, 0x03d44662, 0x016da5b2, 0x003f4cd5, 0x000bb338}}, Y: Field{[10]uint32{0x03f68879, 0x01857990, 0x0082f0f6, 0x00ff79e4, 0x00d1bc79, 0x001f3133, 0x01403cae, 0x03dd1fab, 0x00a97f1c, 0x003853cc}}}, + {X: Field{[10]uint32{0x026fb3b2, 0x000973d5, 0x03c3d77c, 0x02beb141, 0x024c6ad5, 0x01bdbbe2, 0x025e7fa5, 0x039481e0, 0x037fa63e, 0x003b63eb}}, Y: Field{[10]uint32{0x03684a9d, 0x0011b620, 0x008f2c9b, 0x03123afe, 0x01cb0636, 0x03e8f953, 0x02f10407, 0x009cf296, 0x00b8ab21, 0x00037c48}}}, + {X: Field{[10]uint32{0x00c32e4f, 0x01e317c5, 0x023a5bc0, 0x027cf0a3, 0x030bf3fd, 0x00c3f645, 0x02b456af, 0x036afb07, 0x037b8780, 0x0011f2e3}}, Y: Field{[10]uint32{0x00aa3203, 0x00c6f4ad, 0x029af669, 0x006625e3, 0x02c5889d, 0x0087b8b7, 0x02fc948f, 0x02a9b1a2, 0x02021f16, 0x003e181e}}}, + {X: Field{[10]uint32{0x01762009, 0x0056890f, 0x025cacf2, 0x011c78e3, 0x02d49620, 0x02bf9c3a, 0x01a3ee38, 0x02acbcee, 0x02c1fdeb, 0x001d8d96}}, Y: Field{[10]uint32{0x0253aa28, 0x03146d53, 0x01c3211f, 0x00d03737, 0x025d7783, 0x01f517e9, 0x037d3a69, 0x02d803fc, 0x03728b4b, 0x000b2b2b}}}, + {X: Field{[10]uint32{0x0027b424, 0x00cc27b3, 0x00ea8a23, 0x0078461a, 0x039f0931, 0x018fb720, 0x03750550, 0x03954b84, 0x01e099b8, 0x00327757}}, Y: Field{[10]uint32{0x00f8c1a5, 0x0088daee, 0x039e4b38, 0x022ec45f, 0x0338163a, 0x02bf9f4a, 0x00f134ae, 0x017adf1a, 0x02384e61, 0x0012f534}}}, + {X: Field{[10]uint32{0x010a8961, 0x0164cb6b, 0x02a3183e, 0x02de08b8, 0x009a1e08, 0x036f2dbe, 0x01c2f96b, 0x01baf1f0, 0x03adcc40, 0x0008ada9}}, Y: Field{[10]uint32{0x020ac794, 0x007b77eb, 0x02d5e22c, 0x0389dd4d, 0x0287b553, 0x00d2bcb5, 0x02be9a95, 0x013d3f4b, 0x0095bab2, 0x0014ae18}}}, + {X: Field{[10]uint32{0x0381a158, 0x006a6da7, 0x00d24a33, 0x0012cb79, 0x0296f06c, 0x02adfdaf, 0x03017fec, 0x01f7c30d, 0x00a749fa, 0x000fba02}}, Y: Field{[10]uint32{0x0039cb4a, 0x008f0709, 0x02d0c01e, 0x015b6107, 0x016c4b13, 0x01933ff9, 0x03dc1740, 0x027b3621, 0x00ef5f1f, 0x000fa553}}}, + {X: Field{[10]uint32{0x00fa4803, 0x027088ae, 0x0048f3e4, 0x0009c10c, 0x00aa97d3, 0x0356d890, 0x0269ae44, 0x01225837, 0x00588a7a, 0x000a4e2f}}, Y: Field{[10]uint32{0x01ada03e, 0x0015340e, 0x0081865b, 0x0071672d, 0x029ea59a, 0x029ba80a, 0x034826cb, 0x00764379, 0x02619fad, 0x003c9aef}}}, + {X: Field{[10]uint32{0x01a15451, 0x025df5f8, 0x030b12c3, 0x01737dca, 0x0094962e, 0x037d0c9d, 0x03ea34f5, 0x03277932, 0x00ecda97, 0x001a0956}}, Y: Field{[10]uint32{0x01fedc6c, 0x02092bee, 0x0220f112, 0x00cd6bad, 0x028b543f, 0x023b1b31, 0x0253c4cc, 0x0004fc64, 0x036522c7, 0x003130b9}}}, + {X: Field{[10]uint32{0x02493620, 0x029a2d01, 0x03d8c08b, 0x00243dfd, 0x010cbfad, 0x007cf411, 0x036811de, 0x003695e7, 0x0068fc52, 0x001c8363}}, Y: Field{[10]uint32{0x004c9cb5, 0x01517899, 0x03a2950d, 0x030ed217, 0x0107ac26, 0x02eecc6a, 0x016fd4b8, 0x01b41813, 0x00a84f7a, 0x002e19fa}}}, + {X: Field{[10]uint32{0x00b84831, 0x01fd7afd, 0x029e02a1, 0x00beceb2, 0x01994d5d, 0x030118ea, 0x02153ec6, 0x019634d5, 0x03e71bdf, 0x00259fec}}, Y: Field{[10]uint32{0x007cc83f, 0x0180bad5, 0x03a094cf, 0x03271e21, 0x03e3cddf, 0x0326a135, 0x01d0926e, 0x0092ccbd, 0x01f88617, 0x002e1299}}}, + {X: Field{[10]uint32{0x03cedc85, 0x029063a2, 0x03d88db2, 0x0353e19c, 0x0273f6eb, 0x03bc4ee6, 0x01fc1131, 0x030f7a39, 0x025c77ec, 0x000767f4}}, Y: Field{[10]uint32{0x028035d7, 0x02b713ab, 0x030e4aa6, 0x032758af, 0x03033012, 0x00fe908c, 0x03ff58e2, 0x003ed2fe, 0x0301d972, 0x00152818}}}, + {X: Field{[10]uint32{0x01311c0a, 0x033aa27c, 0x0144a0b4, 0x027e4143, 0x017d0402, 0x00d1b8ce, 0x00dff5ff, 0x01ebcc45, 0x0158a113, 0x002004e0}}, Y: Field{[10]uint32{0x025a6b31, 0x008d2a9a, 0x01c36bdd, 0x0225f157, 0x00bc5e94, 0x028ebf9c, 0x01cc712d, 0x02b06309, 0x0076e6d6, 0x0005bd26}}}, + {X: Field{[10]uint32{0x03ef632f, 0x00de4cf0, 0x00c55c6c, 0x006088aa, 0x0233aa34, 0x0041f7c8, 0x020906b3, 0x0161138e, 0x002177fa, 0x0002aad0}}, Y: Field{[10]uint32{0x0201b092, 0x0139780c, 0x03d2f703, 0x00e669fe, 0x019a0620, 0x028225c4, 0x02d58767, 0x0373b4e0, 0x008f3ad0, 0x0026e0c8}}}, + {X: Field{[10]uint32{0x03a72f10, 0x004bc4c3, 0x00fe1d36, 0x00dc52ef, 0x003c5232, 0x00052f98, 0x02f1e3b3, 0x03d19367, 0x014c7670, 0x0023cff4}}, Y: Field{[10]uint32{0x0205c68e, 0x01b022d0, 0x030a4b54, 0x03d75c70, 0x02862ef6, 0x032181b9, 0x03a593a5, 0x02e07eef, 0x00947901, 0x002132dc}}}, + {X: Field{[10]uint32{0x021f4933, 0x0254fb52, 0x00d88e49, 0x000cc32e, 0x00df69a9, 0x00e5e7b2, 0x034578a3, 0x0301bfab, 0x011caba3, 0x000eea72}}, Y: Field{[10]uint32{0x026f99cc, 0x03b91ede, 0x0072f582, 0x016ed248, 0x03fdcff6, 0x01646efb, 0x00107990, 0x0188c7a1, 0x034c3eb6, 0x001c1229}}}, + {X: Field{[10]uint32{0x00f36a7c, 0x026a72b7, 0x006455f2, 0x0070a618, 0x017344c2, 0x027db2d8, 0x01524682, 0x02c38354, 0x03d289da, 0x000be30d}}, Y: Field{[10]uint32{0x03508396, 0x01d3503a, 0x00201d2f, 0x024dea0d, 0x014223d0, 0x0271e659, 0x02f145e6, 0x01c43afe, 0x024e9d02, 0x000dfc2d}}}, + {X: Field{[10]uint32{0x02dce846, 0x0310329d, 0x012d300e, 0x00a33b6f, 0x0273fc61, 0x02995bf2, 0x03f60500, 0x02749ee1, 0x03a2c920, 0x001179ba}}, Y: Field{[10]uint32{0x035f16ec, 0x018b24ef, 0x02d908a0, 0x015d399a, 0x02813867, 0x03b88960, 0x0091a635, 0x020aef47, 0x0144ba18, 0x0028f8a3}}}, + {X: Field{[10]uint32{0x01767ee9, 0x03ee2c7f, 0x023cc605, 0x026e62b4, 0x0182ea7d, 0x03a10b67, 0x027143ff, 0x03348d11, 0x03d380a0, 0x00297b34}}, Y: Field{[10]uint32{0x0311353f, 0x029b8a53, 0x03b959be, 0x00cc3459, 0x02c9ab6c, 0x0140573c, 0x0331fe5b, 0x0109a4fe, 0x00238ea8, 0x0008bc4a}}}, + {X: Field{[10]uint32{0x0174be83, 0x00ffe400, 0x034a2c94, 0x02a7fd80, 0x0051eb66, 0x0060dd3a, 0x03698213, 0x00ec3510, 0x0271c466, 0x003dfd16}}, Y: Field{[10]uint32{0x0346fce5, 0x030290d6, 0x021498ac, 0x01b3d4be, 0x017fbdf4, 0x01a8ca07, 0x013d6e3e, 0x025fd503, 0x03cd4ec1, 0x000e858c}}}, + {X: Field{[10]uint32{0x007cb59c, 0x02c9d2d2, 0x00832a94, 0x020a957b, 0x0252bf6c, 0x015c5f50, 0x0303b7de, 0x01385d6b, 0x02866b31, 0x00249608}}, Y: Field{[10]uint32{0x02811f68, 0x03c149d2, 0x004a0369, 0x00b377eb, 0x03d6c2f5, 0x01256ef1, 0x02346700, 0x00277194, 0x01847368, 0x003f23a5}}}, + {X: Field{[10]uint32{0x02556da4, 0x01db3043, 0x027b5a7f, 0x03c53754, 0x011d7849, 0x02b9be9d, 0x017fa966, 0x034028bd, 0x00d32303, 0x003057fa}}, Y: Field{[10]uint32{0x01c10951, 0x03ec4260, 0x00d067b5, 0x01ab8ba7, 0x03e017c0, 0x00334d22, 0x03c445c5, 0x037fc699, 0x03d04685, 0x000d890a}}}, + {X: Field{[10]uint32{0x022b5355, 0x013d8331, 0x03e5ca46, 0x00d9f5ca, 0x0004dd71, 0x01c2fc35, 0x00372df2, 0x029838c4, 0x0026152a, 0x000127be}}, Y: Field{[10]uint32{0x00c4c645, 0x01f4b2c8, 0x02165d9c, 0x00bad597, 0x024e369d, 0x01ea4f85, 0x01c572c7, 0x01202e68, 0x03a20dc4, 0x001f2b52}}}, + {X: Field{[10]uint32{0x0091a18f, 0x02b848a7, 0x006a3be4, 0x0077b59a, 0x03629b2f, 0x018c4cf8, 0x02c876e1, 0x03e53f84, 0x01e7538f, 0x00323782}}, Y: Field{[10]uint32{0x017c2635, 0x02d891da, 0x03e885ea, 0x003c69db, 0x029cecb1, 0x01825958, 0x031e872d, 0x02228417, 0x031fe580, 0x002d69fc}}}, + {X: Field{[10]uint32{0x02abb344, 0x007ffae5, 0x00576946, 0x0067bdd9, 0x016b3d51, 0x026bc92a, 0x03a6cd3d, 0x010ebc75, 0x03a4616f, 0x00361ae7}}, Y: Field{[10]uint32{0x0003bcab, 0x01c3867c, 0x02539fb5, 0x01cb8e4b, 0x0056df6f, 0x01a72e3a, 0x001b6606, 0x006d2652, 0x028e8f93, 0x0008e233}}}, + {X: Field{[10]uint32{0x00cbbf88, 0x00eb9bc0, 0x0055a743, 0x02793cfb, 0x0187c496, 0x003f8c10, 0x027b7193, 0x038ac4fe, 0x0218f351, 0x0028b35d}}, Y: Field{[10]uint32{0x0119d685, 0x034dae17, 0x0324aa8d, 0x034e8258, 0x0229870c, 0x00c430d8, 0x015711ab, 0x00d8ec51, 0x0062436a, 0x000f82d7}}}, + {X: Field{[10]uint32{0x0100b2ca, 0x010b33c8, 0x02b87ab4, 0x00efb4be, 0x02ad6c21, 0x00e6d55d, 0x036e4f6b, 0x0128f5e0, 0x00d4e33e, 0x002dca0f}}, Y: Field{[10]uint32{0x02abc9ea, 0x00c5cfa3, 0x008fc273, 0x019c0109, 0x03090833, 0x0097aacf, 0x021e7e30, 0x008c1c60, 0x02fb111c, 0x00246001}}}, + {X: Field{[10]uint32{0x00b9a769, 0x02903d92, 0x00d9a0cd, 0x0151bbf3, 0x01d12e18, 0x0328c4d9, 0x01b123b9, 0x02ea34d5, 0x012e9707, 0x002c7f4b}}, Y: Field{[10]uint32{0x035e674e, 0x027bd2d1, 0x0294b58c, 0x00f58b6b, 0x021a40cf, 0x00a062ff, 0x004d2226, 0x01577bd8, 0x00168e8f, 0x00230df3}}}, + {X: Field{[10]uint32{0x0339f90f, 0x034ae0b2, 0x0262e7c0, 0x031ce574, 0x02cf6077, 0x0216d69b, 0x034be328, 0x03a17832, 0x03e74242, 0x0006c265}}, Y: Field{[10]uint32{0x037760b3, 0x01a48eda, 0x03183fa3, 0x00493052, 0x02f30fae, 0x00ef3e33, 0x00c2d2ef, 0x00762bb6, 0x00d427cd, 0x00156d36}}}, + {X: Field{[10]uint32{0x018d78d6, 0x01541976, 0x03e698e0, 0x02e06ff5, 0x034f1dc9, 0x03b86eec, 0x02362588, 0x0324977a, 0x03bc094a, 0x0015bfee}}, Y: Field{[10]uint32{0x00edc65f, 0x029c6636, 0x022089f8, 0x02dee00d, 0x02a517fc, 0x02fc716e, 0x02f3d235, 0x00af6c82, 0x008f46d7, 0x002a9cc8}}}, + {X: Field{[10]uint32{0x02d7045e, 0x00f8364e, 0x00685353, 0x02459c8a, 0x00e39081, 0x0049847a, 0x026cd368, 0x01fe70d0, 0x02b07ddb, 0x0030497e}}, Y: Field{[10]uint32{0x0377e5ae, 0x034c3c66, 0x024b68cc, 0x03d137d1, 0x031f235e, 0x00b07763, 0x003f1189, 0x01952bdb, 0x003f622f, 0x000a019c}}}, + {X: Field{[10]uint32{0x027f4a17, 0x014508ff, 0x0130148a, 0x03efc967, 0x02dbab85, 0x0207a02b, 0x01fa6fee, 0x031d0a2c, 0x01dbe4e0, 0x0039fb7a}}, Y: Field{[10]uint32{0x033fc066, 0x01695b34, 0x021d9e63, 0x016f0b6e, 0x02e23692, 0x039fd434, 0x00d32e65, 0x0173eb20, 0x037a9fbc, 0x0024eac9}}}, + {X: Field{[10]uint32{0x03df93f3, 0x02545668, 0x01cc8aa3, 0x00a3122c, 0x03a47c16, 0x0214fe59, 0x00c3da9d, 0x01af311c, 0x0363f1bd, 0x001d1c05}}, Y: Field{[10]uint32{0x018ac8ee, 0x01bb5557, 0x029d8a4b, 0x01eca3b5, 0x02bd2223, 0x001551ee, 0x0393dd5f, 0x0043ccdc, 0x011c7c55, 0x002acb00}}}, + {X: Field{[10]uint32{0x039081b8, 0x02403579, 0x0257689c, 0x00717195, 0x020a6554, 0x00de138c, 0x01ffb8d8, 0x03dc7f9b, 0x039755ba, 0x0002349f}}, Y: Field{[10]uint32{0x02c250ad, 0x02184946, 0x01386e55, 0x0032dfcc, 0x03f308f9, 0x0354889f, 0x021f837b, 0x0258052b, 0x0268f3c8, 0x0029c5db}}}, + {X: Field{[10]uint32{0x00cc7ea9, 0x01e633ab, 0x028c10f5, 0x00063a60, 0x0071b0db, 0x02b0976e, 0x000a0ff1, 0x02d4c7ab, 0x02fe9040, 0x0018f81a}}, Y: Field{[10]uint32{0x00910aa5, 0x003001fd, 0x0213e930, 0x0112ca9a, 0x010c9112, 0x00126bb5, 0x028fcf99, 0x03822dac, 0x0084a9db, 0x002aa846}}}, + {X: Field{[10]uint32{0x004ed50f, 0x0256251d, 0x004b5dde, 0x030a2082, 0x036bf8ba, 0x00f92c6a, 0x01617d02, 0x002acd0b, 0x01ae27d6, 0x00371fa8}}, Y: Field{[10]uint32{0x002f3dfa, 0x000a4705, 0x0140e48a, 0x029b8445, 0x03b63efb, 0x01d52968, 0x03e97fc0, 0x0317feef, 0x036e2b95, 0x0024f1f5}}}, + {X: Field{[10]uint32{0x02e842d7, 0x00ef46fd, 0x02253221, 0x00e6ee5d, 0x0136e402, 0x02d6baa6, 0x03dfb691, 0x03bd28f5, 0x036df69c, 0x003cebbb}}, Y: Field{[10]uint32{0x0208de5d, 0x0343d188, 0x001151fb, 0x023bd24f, 0x0272e562, 0x032c7a2b, 0x03bde031, 0x01c00be1, 0x01da339c, 0x0015f4df}}}, + {X: Field{[10]uint32{0x02bec3ce, 0x0286b29d, 0x01b67816, 0x03eca3da, 0x02ae87da, 0x00f5c9cb, 0x005d0812, 0x0193a837, 0x004c316e, 0x002096f6}}, Y: Field{[10]uint32{0x00a52251, 0x032846d0, 0x00f1dc28, 0x01925d96, 0x00849a25, 0x018be1fc, 0x03e3f69d, 0x01c2a1a8, 0x03fdba83, 0x001878e9}}}, + {X: Field{[10]uint32{0x0056a75d, 0x03bae4ce, 0x03ba7f5a, 0x02e543b0, 0x010edb63, 0x03a509a8, 0x02988cd8, 0x014dc274, 0x00d74dec, 0x000c428b}}, Y: Field{[10]uint32{0x03122c97, 0x00ee07c5, 0x00228ffa, 0x03b8f863, 0x03e3ff1e, 0x02bb0943, 0x02b4ab3a, 0x0395fdfc, 0x02aedfa5, 0x00175b61}}}, + {X: Field{[10]uint32{0x03425217, 0x0160b006, 0x024d85af, 0x02e25dfb, 0x0369f04d, 0x026edb0f, 0x02355aef, 0x004b43e0, 0x007562a5, 0x000d1c75}}, Y: Field{[10]uint32{0x039cba31, 0x00e67af6, 0x00358aed, 0x02a51410, 0x01ccd444, 0x000ded09, 0x006d68c5, 0x02da7afe, 0x02702fe0, 0x0009cb77}}}, + {X: Field{[10]uint32{0x00257a2f, 0x01a01f93, 0x0138d808, 0x03ac3a8d, 0x00aaeee4, 0x020a6bb2, 0x022b3df6, 0x02bc9082, 0x0163bfaf, 0x002fdb49}}, Y: Field{[10]uint32{0x000b496d, 0x003b8ac1, 0x03ff1a92, 0x03113079, 0x003a2738, 0x0155d1ae, 0x03847ef7, 0x0125ad93, 0x02007e7b, 0x003a01de}}}, + {X: Field{[10]uint32{0x039cddc4, 0x03b5094a, 0x023fbbdb, 0x0194c9c8, 0x02d6f4d4, 0x03361db9, 0x03ce42a3, 0x03dc614b, 0x03c4a883, 0x003accf3}}, Y: Field{[10]uint32{0x02e5453f, 0x02b69287, 0x028d2a7d, 0x00df8977, 0x03eaab91, 0x01f7a1be, 0x00f03ad2, 0x022f6641, 0x00f2ef60, 0x0026f500}}}, + {X: Field{[10]uint32{0x00c2279f, 0x002475bb, 0x0108f082, 0x00f68363, 0x016b123d, 0x037a5591, 0x0383edf7, 0x03cc67ec, 0x00d03e5d, 0x0004c5f8}}, Y: Field{[10]uint32{0x03675afd, 0x0348a48c, 0x03b252a9, 0x025fab2e, 0x01dcae42, 0x001a951c, 0x0122b607, 0x02755ac3, 0x024d5c6f, 0x000efd90}}}, + {X: Field{[10]uint32{0x009aeb56, 0x02f38d0c, 0x03456c99, 0x039099ee, 0x007e00f8, 0x01501bcc, 0x022cf5dc, 0x010fafac, 0x032e99dc, 0x00206c27}}, Y: Field{[10]uint32{0x03361932, 0x02006028, 0x03d7c495, 0x01bfafc5, 0x011dbc5f, 0x00b8cc72, 0x035b1df9, 0x03bab10b, 0x02a4b300, 0x00275215}}}, + {X: Field{[10]uint32{0x015a62f2, 0x02199121, 0x01f7e98b, 0x00c8348f, 0x03ed436d, 0x03d3a8cd, 0x02626bae, 0x03fc65c8, 0x01670a32, 0x00037ba9}}, Y: Field{[10]uint32{0x01032414, 0x019b50e7, 0x005a6dfe, 0x03bda79e, 0x014a8310, 0x00305e4b, 0x0157ab34, 0x005ff821, 0x0297c61a, 0x00172449}}}, + {X: Field{[10]uint32{0x003444e5, 0x03713a39, 0x02755ef3, 0x02c73ba1, 0x0296ae44, 0x01ea46e7, 0x00e02ffa, 0x0345cf9a, 0x00835746, 0x003392b4}}, Y: Field{[10]uint32{0x0303aa7d, 0x001bd89f, 0x02a20d34, 0x006bfc70, 0x00df7cc8, 0x01517fa1, 0x013e2891, 0x023532d5, 0x03890523, 0x002fa1b2}}}, + {X: Field{[10]uint32{0x030b077e, 0x0339ffd4, 0x004f6fbb, 0x0131f606, 0x032e3638, 0x02281c57, 0x0119a324, 0x006bdb93, 0x023d407f, 0x0026a64f}}, Y: Field{[10]uint32{0x001a7a7e, 0x03baf04c, 0x034e2481, 0x0077150f, 0x023f8700, 0x01b65bfe, 0x027bd6fe, 0x019fba66, 0x012d80a2, 0x00392869}}}, + {X: Field{[10]uint32{0x039bd0d8, 0x00d844be, 0x03ccc06b, 0x03bd16ab, 0x039247c7, 0x0099ea98, 0x017ae6a1, 0x0017205c, 0x032d7c7f, 0x0007c437}}, Y: Field{[10]uint32{0x00760410, 0x01e0ec16, 0x029affdc, 0x010c9f30, 0x03e45ad6, 0x0259fa6b, 0x0283b0ec, 0x036de4c9, 0x025b71e2, 0x0019c2c9}}}, + {X: Field{[10]uint32{0x02621b53, 0x0355c461, 0x00a5a0ba, 0x03fe7645, 0x02d57d1d, 0x0329dd77, 0x0317633d, 0x008239f6, 0x025729c9, 0x001c33ac}}, Y: Field{[10]uint32{0x01df0c62, 0x0307b0d2, 0x0164ace7, 0x00941fa7, 0x0200ee98, 0x01b475d6, 0x0211c0ec, 0x01157f37, 0x0291b3f3, 0x001b805b}}}, + {X: Field{[10]uint32{0x00694e3e, 0x024fdf9d, 0x032fd466, 0x0312b3a7, 0x00043fb6, 0x02841818, 0x03b79210, 0x020bec37, 0x01e64dc8, 0x002e91b9}}, Y: Field{[10]uint32{0x01789acc, 0x010b221f, 0x009cb0f3, 0x02cf7a81, 0x025868d0, 0x0276310d, 0x0208e060, 0x0207fe28, 0x02b90793, 0x003abad3}}}, + {X: Field{[10]uint32{0x03c30d81, 0x0034e200, 0x037a9e32, 0x01538123, 0x02a631d1, 0x00f5d5e7, 0x0179beaf, 0x02b48390, 0x02dfd233, 0x002ee8ee}}, Y: Field{[10]uint32{0x021b961d, 0x03e400d7, 0x011e8ed3, 0x039a3229, 0x0202bdfc, 0x01d95a4f, 0x03a0af4e, 0x01131cc5, 0x030d69dd, 0x003ca9f1}}}, + {X: Field{[10]uint32{0x02d3f8a5, 0x01d4298d, 0x01283d93, 0x007ce396, 0x02057d49, 0x010782bc, 0x0258f1bf, 0x02e9a05f, 0x0369d300, 0x001b7da9}}, Y: Field{[10]uint32{0x033a4a6f, 0x0268db69, 0x02819dad, 0x024a67c4, 0x01ebf0f4, 0x0337ed36, 0x02d1f31c, 0x031dcbb3, 0x03b3aa51, 0x0018e820}}}, + {X: Field{[10]uint32{0x03174f2c, 0x02970529, 0x022361ad, 0x014c74bf, 0x034fab19, 0x024e945c, 0x00c7ea87, 0x026a60a5, 0x031a4b8c, 0x002bff44}}, Y: Field{[10]uint32{0x0011be6d, 0x00a59c4d, 0x01708734, 0x0072cc81, 0x03342689, 0x022a5e23, 0x02ed3225, 0x00da60ff, 0x00d9ec4a, 0x00130f79}}}, + {X: Field{[10]uint32{0x030abc7e, 0x028914ce, 0x016ee2f0, 0x031af086, 0x01d42cca, 0x031f1c23, 0x01ba5464, 0x02c62867, 0x00499e54, 0x000b68c4}}, Y: Field{[10]uint32{0x032db974, 0x001527c8, 0x03e7c0bb, 0x028fded1, 0x02426981, 0x00713414, 0x0109d445, 0x027e2d5b, 0x009120ad, 0x003cd52b}}}, + {X: Field{[10]uint32{0x02e57b61, 0x01f433e4, 0x03f2b2dc, 0x0007bb24, 0x0323cdd2, 0x036d30c7, 0x01381ace, 0x03e0aba3, 0x0053cbe3, 0x000e20bb}}, Y: Field{[10]uint32{0x037e6e3a, 0x020328bb, 0x03c786cd, 0x014cbec2, 0x0271a43d, 0x009d0191, 0x02b0046b, 0x02ff3124, 0x015de5a7, 0x00074d0c}}}, + {X: Field{[10]uint32{0x0387f9f1, 0x026ed21c, 0x00b28d55, 0x01d4a997, 0x03468259, 0x03a7ad78, 0x03c8e4e8, 0x02ac98e6, 0x02356a08, 0x003f2ae1}}, Y: Field{[10]uint32{0x00fceb94, 0x02c81532, 0x03f540d7, 0x023413bd, 0x02bef2b3, 0x034d5c2b, 0x0166753a, 0x001f395d, 0x00c0d08f, 0x002bd020}}}, + {X: Field{[10]uint32{0x0136bb58, 0x02275d67, 0x00ebe5dd, 0x00468552, 0x02847bf0, 0x01d5032a, 0x01dcd5a5, 0x01f84a8a, 0x00bb8a89, 0x003f4d2e}}, Y: Field{[10]uint32{0x0110b2f3, 0x00d465de, 0x0255b762, 0x00ef4356, 0x00d19b60, 0x008c41b9, 0x0127eaa7, 0x03e5cd5e, 0x02ac6a56, 0x0014699a}}}, + {X: Field{[10]uint32{0x03d4b469, 0x03663961, 0x002fa808, 0x01826776, 0x031d3b46, 0x01f1f605, 0x007a1678, 0x016fc1db, 0x0120c0d8, 0x0007a26f}}, Y: Field{[10]uint32{0x00fe882a, 0x03218a4f, 0x01353eaf, 0x0243ef13, 0x03dcf115, 0x01d3cc48, 0x02dae475, 0x021d80f7, 0x01d0e576, 0x0013d4ea}}}, + {X: Field{[10]uint32{0x03aa05ed, 0x00ea55de, 0x0048f5fb, 0x02795231, 0x01ddca45, 0x03beeaea, 0x017d93ea, 0x026b3b23, 0x03ba6690, 0x002287a9}}, Y: Field{[10]uint32{0x037be091, 0x030133e2, 0x00f99e09, 0x033e2ba5, 0x01ea1f1f, 0x0140600c, 0x037655b2, 0x00de90e7, 0x01e9064f, 0x00356016}}}, + {X: Field{[10]uint32{0x011331a1, 0x03ddb587, 0x032cbd7f, 0x00302d55, 0x00e4451f, 0x03ca586c, 0x0086549a, 0x02649a5a, 0x000d80d5, 0x003830de}}, Y: Field{[10]uint32{0x0145491d, 0x013da392, 0x02551114, 0x02baefb6, 0x03d827dd, 0x008c39ec, 0x03e6f1e5, 0x00ec7f0b, 0x02e6a13c, 0x00267674}}}, + {X: Field{[10]uint32{0x03996035, 0x032303a0, 0x0260ef7c, 0x0373fc83, 0x008e7e1b, 0x036ab786, 0x03ed36c5, 0x02b0485b, 0x00e6ed23, 0x002590d5}}, Y: Field{[10]uint32{0x0028998a, 0x02f4c98d, 0x03529aa8, 0x0234f18c, 0x027e6a40, 0x039bc188, 0x02531984, 0x031ba1c8, 0x009a8563, 0x003dd228}}}, + {X: Field{[10]uint32{0x02fe3f9b, 0x036f0f06, 0x014a1ab1, 0x00556150, 0x038bd094, 0x01a61871, 0x02eab869, 0x03218bf1, 0x03295125, 0x00260279}}, Y: Field{[10]uint32{0x007b9fd7, 0x01afd8e6, 0x0005efd4, 0x02250cbf, 0x00ab0fc0, 0x03f21296, 0x03909f86, 0x0155a20c, 0x0228bbf5, 0x003614d8}}}, + {X: Field{[10]uint32{0x0301ed17, 0x03b31303, 0x03b34abb, 0x01cf6852, 0x011d8d71, 0x00097f1f, 0x0183bf94, 0x013108a3, 0x0102305e, 0x000657d3}}, Y: Field{[10]uint32{0x009d637f, 0x02e1d99f, 0x0221a726, 0x0174ea23, 0x03ce1384, 0x00f2d119, 0x00152e02, 0x02e7341a, 0x00b497ae, 0x00255f6e}}}, + {X: Field{[10]uint32{0x014e0b37, 0x011286a1, 0x036c0f2c, 0x039a06e0, 0x02b0203f, 0x0009243a, 0x023f726d, 0x01f8d3be, 0x02ba3eb1, 0x00158baa}}, Y: Field{[10]uint32{0x0152b1e8, 0x015a9be1, 0x02da59db, 0x02935ecc, 0x0397093b, 0x003bd094, 0x03a35a77, 0x012010b4, 0x00ed9e66, 0x002d3996}}}, + {X: Field{[10]uint32{0x01ec8282, 0x027ca383, 0x01a288d7, 0x00b0292c, 0x03de3a60, 0x00c0bcd3, 0x00579693, 0x02405203, 0x01eb1efa, 0x002128b1}}, Y: Field{[10]uint32{0x02207cf1, 0x018acd91, 0x02023bdf, 0x00fd7c36, 0x00c70331, 0x0372b110, 0x03261dba, 0x03bb6161, 0x01c788cf, 0x001c0354}}}, + {X: Field{[10]uint32{0x0272f913, 0x00025ccd, 0x007fb8ba, 0x02b5df53, 0x00b93e2b, 0x031b52e1, 0x00e73406, 0x0245a2c5, 0x03cf0dbd, 0x0020f44b}}, Y: Field{[10]uint32{0x03279a7b, 0x02d44c79, 0x018ee523, 0x03f61848, 0x013c0dd6, 0x020b3a73, 0x03c78b36, 0x00cb3eeb, 0x0226bf25, 0x0039215b}}}, + {X: Field{[10]uint32{0x015451cf, 0x0001a3b7, 0x03701dfb, 0x008a7b52, 0x00ce64d5, 0x03d190fe, 0x03e73bf9, 0x00c8383e, 0x02f2bbd9, 0x00266229}}, Y: Field{[10]uint32{0x02882d5b, 0x02877462, 0x01910ed5, 0x0070aafa, 0x000d2f43, 0x024be269, 0x0244e4d8, 0x00994342, 0x02fcbd3b, 0x002eecd4}}}, + {X: Field{[10]uint32{0x03ff0724, 0x0202842b, 0x00b5160f, 0x0130aa9c, 0x0183017d, 0x028845ac, 0x0321d1e2, 0x00571ccd, 0x003dcfa6, 0x000fa486}}, Y: Field{[10]uint32{0x002dc945, 0x0202ce45, 0x03d7f226, 0x0029d395, 0x0276a2f3, 0x029cfcf4, 0x01fe5453, 0x02f98bc3, 0x0251f4bc, 0x0031e220}}}, + {X: Field{[10]uint32{0x0239492f, 0x018f5b20, 0x0044de77, 0x02617a96, 0x01e5f85b, 0x02cd89d7, 0x03130faf, 0x03f8e932, 0x0300fa1e, 0x003645d4}}, Y: Field{[10]uint32{0x03678b4b, 0x0199c0a6, 0x03521c55, 0x036217ba, 0x00fbad38, 0x00596aff, 0x0236220d, 0x00a83366, 0x0065e959, 0x001644e3}}}, + {X: Field{[10]uint32{0x02d933dc, 0x01044a4d, 0x01068b47, 0x02e1ea57, 0x03ed74c5, 0x01d9b99d, 0x017f7b47, 0x02fb9974, 0x025f7c12, 0x001bfd60}}, Y: Field{[10]uint32{0x038c0edf, 0x0200920d, 0x0038131f, 0x02a10334, 0x002ea9ac, 0x034ae360, 0x004be0a4, 0x025d2c8c, 0x01de0cb7, 0x001986ba}}}, + {X: Field{[10]uint32{0x00b1c31d, 0x03ac4594, 0x035ab15c, 0x01aeeba1, 0x03956036, 0x030093de, 0x027d580a, 0x004190c1, 0x02b1a876, 0x003b5b2f}}, Y: Field{[10]uint32{0x0217dede, 0x01f59aa1, 0x03f4519a, 0x01dbc675, 0x011269c4, 0x000ba040, 0x024d60f7, 0x02270595, 0x007ed1e8, 0x0024501a}}}, + {X: Field{[10]uint32{0x03d69164, 0x02f812a2, 0x03ca443a, 0x01b8e190, 0x000853bf, 0x02c4c88c, 0x016b56ee, 0x016a8c42, 0x00eb32d7, 0x0017e333}}, Y: Field{[10]uint32{0x0195da3a, 0x0396df9e, 0x02d456bd, 0x03c08734, 0x024f6576, 0x013d60d2, 0x02ac0fac, 0x0077352d, 0x023dd0c8, 0x000d7dca}}}, + {X: Field{[10]uint32{0x002d0b7b, 0x029b88e6, 0x02f7c479, 0x018bc056, 0x0186580d, 0x03b599d4, 0x02896c67, 0x00e5dd48, 0x00859bb2, 0x00207808}}, Y: Field{[10]uint32{0x03fbb669, 0x036f1933, 0x019601eb, 0x00e38abe, 0x02fce84a, 0x017558ac, 0x02ddc088, 0x03c9bed0, 0x029e4159, 0x0021e47e}}}, + {X: Field{[10]uint32{0x01d8f721, 0x0109c4a5, 0x005f141d, 0x03a1eb2a, 0x003eb435, 0x018eeb72, 0x03aba7ad, 0x01709a6d, 0x0316dd1e, 0x0037889a}}, Y: Field{[10]uint32{0x02c8423a, 0x01591c06, 0x0120d841, 0x01a90d37, 0x03342841, 0x038cf644, 0x007dc03d, 0x039cb0fe, 0x0399fa2c, 0x0018b878}}}, + {X: Field{[10]uint32{0x03d140f3, 0x0282f765, 0x012b1d13, 0x02549f2f, 0x00fa7629, 0x03dffc59, 0x0058be59, 0x00ca57f4, 0x03423fcd, 0x0018291b}}, Y: Field{[10]uint32{0x037f1219, 0x034dc3b7, 0x02c8e0f4, 0x015332ff, 0x01912cb8, 0x0280f2ad, 0x02bc31e1, 0x02785f91, 0x02de7b78, 0x00255c74}}}, + {X: Field{[10]uint32{0x032249c0, 0x0227f2f0, 0x027f5ce0, 0x0164fd0a, 0x0080d7e7, 0x028318d9, 0x013a77ab, 0x02f647ef, 0x005ce1b4, 0x001bfbd1}}, Y: Field{[10]uint32{0x00fa347d, 0x00b17a7d, 0x01a919a9, 0x0361f532, 0x03f82e73, 0x01605e5b, 0x020cae2e, 0x036e0e6b, 0x00fbaf46, 0x000457ef}}}, + {X: Field{[10]uint32{0x0293522f, 0x01713f90, 0x02a30914, 0x01705120, 0x03a9892b, 0x03b7af95, 0x025f7c26, 0x03e54e8f, 0x011ca8d2, 0x001b4dfd}}, Y: Field{[10]uint32{0x015309af, 0x019fbba7, 0x03dda0a9, 0x016ea212, 0x00cbefae, 0x00ee4382, 0x026897cd, 0x02b52c37, 0x01f36718, 0x001e3944}}}, + {X: Field{[10]uint32{0x03d46098, 0x02c0d440, 0x02ceaa76, 0x0157f9d2, 0x02738aa1, 0x0376fa65, 0x01cb035e, 0x01c07d72, 0x00275bd0, 0x000302b2}}, Y: Field{[10]uint32{0x00e3cd97, 0x020c807e, 0x026b7c3e, 0x00c5a996, 0x0031d762, 0x003389a9, 0x01684906, 0x029c21aa, 0x022a188f, 0x0039fcca}}}, + {X: Field{[10]uint32{0x00cde108, 0x00481814, 0x02b935d0, 0x02352c95, 0x01822a64, 0x017ebd29, 0x00507df8, 0x01408c7f, 0x03a86f89, 0x00240036}}, Y: Field{[10]uint32{0x014ef3fd, 0x0360f2d9, 0x00ff1779, 0x0008bd63, 0x00323319, 0x03d32c0f, 0x018383c2, 0x03a7a2ef, 0x003694b2, 0x0026deba}}}, + {X: Field{[10]uint32{0x029098a1, 0x02ba35a5, 0x01d9a28a, 0x029d18f8, 0x01ad58de, 0x01b0a8b8, 0x02092532, 0x02f23cd9, 0x03f4b490, 0x003c4426}}, Y: Field{[10]uint32{0x012f24c5, 0x00014257, 0x030224a8, 0x030b0c96, 0x006e3382, 0x032305fb, 0x02305141, 0x00b04200, 0x02279fd7, 0x0021d0c6}}}, + {X: Field{[10]uint32{0x028c0003, 0x0372155b, 0x018b00d1, 0x02353db8, 0x03929adc, 0x01b587e0, 0x00aac8b3, 0x031bc231, 0x01e54e9c, 0x00137a1c}}, Y: Field{[10]uint32{0x00d3bba6, 0x021fc1dc, 0x029c7f01, 0x01c3a68f, 0x00805f4b, 0x027785af, 0x01d7fce1, 0x03a29b1d, 0x03cfca98, 0x00009747}}}, + {X: Field{[10]uint32{0x02766ece, 0x0004f618, 0x01c80b66, 0x019ff633, 0x008f47b4, 0x01384004, 0x02e89ff9, 0x00aefce9, 0x02759297, 0x00288f2d}}, Y: Field{[10]uint32{0x03cf548c, 0x016bae51, 0x01dc7cae, 0x0337f5fa, 0x03cbca18, 0x01f48eab, 0x02811267, 0x0308f685, 0x0384ed05, 0x002371c2}}}, + {X: Field{[10]uint32{0x004244e5, 0x00385256, 0x0032bbb4, 0x00e296df, 0x0179d3c9, 0x039c0f31, 0x03a9dd3b, 0x023e2e46, 0x00cce96d, 0x0000a574}}, Y: Field{[10]uint32{0x0303c926, 0x00fdfb8a, 0x02c95265, 0x02304ace, 0x02745e07, 0x014e2b97, 0x030fe376, 0x0352fdab, 0x0206a16b, 0x0029b516}}}, + {X: Field{[10]uint32{0x02babbce, 0x0009517b, 0x008af9e1, 0x0337bf49, 0x016cb40b, 0x03ef45da, 0x00b13d51, 0x01da9b50, 0x03919d53, 0x001f1a0e}}, Y: Field{[10]uint32{0x01fd3f73, 0x02c6b6ab, 0x02e39332, 0x0169f08e, 0x02197d4e, 0x0367c558, 0x03ed30b8, 0x0215bd6d, 0x01d03608, 0x000f6832}}}, + {X: Field{[10]uint32{0x000c3189, 0x039fbe07, 0x001ecdf5, 0x027b2a7d, 0x038505f3, 0x0388bb08, 0x020e21ff, 0x00926a57, 0x012ed27e, 0x000c3dd4}}, Y: Field{[10]uint32{0x00875169, 0x010790b9, 0x00164fad, 0x01fd5ba2, 0x039e4e7f, 0x02d1cc65, 0x01286514, 0x00e8e856, 0x005e25ea, 0x000bd7f6}}}, + {X: Field{[10]uint32{0x03514961, 0x03d69d8b, 0x00835431, 0x00bed244, 0x031c7f84, 0x02358c52, 0x00a41c77, 0x013c9cc9, 0x038c9658, 0x0024ddef}}, Y: Field{[10]uint32{0x01f3df42, 0x03f5b4da, 0x00ad4335, 0x00b4ea27, 0x003cfa89, 0x03b60c34, 0x017fe92a, 0x036cab9f, 0x0055e2ed, 0x00356673}}}, + {X: Field{[10]uint32{0x0131e9be, 0x0307555b, 0x00ca240a, 0x01e1affd, 0x0328a66e, 0x03e0f153, 0x03530b85, 0x001256e8, 0x03e867f2, 0x000d627f}}, Y: Field{[10]uint32{0x01224c89, 0x02a49d1b, 0x0385b581, 0x019e3f74, 0x00d75b3a, 0x03c4cf71, 0x01c22a89, 0x02278482, 0x02aa9830, 0x0026208b}}}, + {X: Field{[10]uint32{0x023f8935, 0x036e2e3a, 0x03f85999, 0x01e84754, 0x012c79e7, 0x03f31905, 0x00e0f841, 0x03713396, 0x01f4b2da, 0x000e706c}}, Y: Field{[10]uint32{0x00256721, 0x026aa135, 0x0131e628, 0x010985b3, 0x0350bb8a, 0x03fe76a0, 0x036991de, 0x00ce2590, 0x031ad9df, 0x0039e149}}}, + {X: Field{[10]uint32{0x0325be33, 0x03bb7b62, 0x0372cad5, 0x0368914e, 0x00b103f9, 0x02d84639, 0x00799188, 0x00b0b666, 0x0059d3d6, 0x00373c45}}, Y: Field{[10]uint32{0x03a1c074, 0x00f31cbc, 0x017b330a, 0x0323eb9f, 0x02a190f6, 0x031f7771, 0x01a92fe7, 0x01c398d1, 0x001aaf32, 0x003700e3}}}, + {X: Field{[10]uint32{0x02623d1d, 0x018d6cc1, 0x038f0eed, 0x0179bac8, 0x00a32ff0, 0x02f60143, 0x00d82e55, 0x02c304fd, 0x01dd1de9, 0x0018524a}}, Y: Field{[10]uint32{0x00d8a24b, 0x02a9d7b1, 0x02a6ae0e, 0x010c6b2f, 0x02afafdc, 0x020603fd, 0x0118e3be, 0x03c5ee86, 0x0117c9e7, 0x0002bfa1}}}, + {X: Field{[10]uint32{0x00ce743c, 0x006c2ea7, 0x00296a7c, 0x027ed66a, 0x03ef8160, 0x03b22b6f, 0x005da355, 0x036a5029, 0x0228cff6, 0x003d29c8}}, Y: Field{[10]uint32{0x019cdacb, 0x02a069b8, 0x01e50a25, 0x0094f328, 0x032fbcd0, 0x015a71af, 0x01e90f10, 0x016ab827, 0x00fbde09, 0x00151480}}}, + {X: Field{[10]uint32{0x022c93f7, 0x03f94903, 0x01a650b5, 0x0133f23f, 0x0357aa16, 0x00dc6e50, 0x0262fbf5, 0x01565d1b, 0x02736caa, 0x0018f310}}, Y: Field{[10]uint32{0x02ce5665, 0x011f1142, 0x004fe09b, 0x0139143c, 0x01e7d822, 0x012c20a2, 0x02d2bd30, 0x0104eb5a, 0x035bc5a6, 0x0007e93b}}}, + {X: Field{[10]uint32{0x02ab8889, 0x012f8ae3, 0x002016b8, 0x022659e3, 0x00aa7f9d, 0x00d172c1, 0x02cf761f, 0x00e29834, 0x02281184, 0x002b05d4}}, Y: Field{[10]uint32{0x024af2b1, 0x016a60aa, 0x03396343, 0x02266684, 0x00832f29, 0x03ddd97c, 0x02b01b68, 0x00f6b09e, 0x00ae2964, 0x00375f7e}}}, + {X: Field{[10]uint32{0x024a0e48, 0x01e205a7, 0x02c03dd6, 0x008bcde1, 0x03823e86, 0x00bbead6, 0x00a5a2f7, 0x0106d831, 0x02b9637c, 0x00276ed7}}, Y: Field{[10]uint32{0x03d924d7, 0x00e353ad, 0x025cd1ba, 0x001e2718, 0x0205aa01, 0x021466a8, 0x01cde34b, 0x03587d0b, 0x02ba13f4, 0x0001dcb5}}}, + {X: Field{[10]uint32{0x02f7dddc, 0x015cc70f, 0x02fb173d, 0x0266e30c, 0x004e88f5, 0x01683622, 0x015b5866, 0x0304d440, 0x01ddd2fc, 0x001c5c25}}, Y: Field{[10]uint32{0x024fa5af, 0x03f7ed1f, 0x0020e581, 0x01b74638, 0x03472732, 0x031ed902, 0x023da3f3, 0x01c2f3ec, 0x010952b4, 0x0007783c}}}, + {X: Field{[10]uint32{0x025872ca, 0x026a5909, 0x03b2a331, 0x01a0b336, 0x01a32c4a, 0x00535ba7, 0x01e3964c, 0x02c7a900, 0x00d3f829, 0x0016b08c}}, Y: Field{[10]uint32{0x01c026ea, 0x0373ebb2, 0x02e8151b, 0x0360c85e, 0x03423484, 0x00c67290, 0x0206a16e, 0x03d9af17, 0x03a627db, 0x003eb0f0}}}, + {X: Field{[10]uint32{0x038752ef, 0x01f3dd87, 0x00100857, 0x02854446, 0x01382496, 0x00b9d387, 0x0057537b, 0x03d05785, 0x02af0a39, 0x00349fb2}}, Y: Field{[10]uint32{0x01c6c037, 0x037e92dc, 0x03ae35dc, 0x0213eb38, 0x00d5938e, 0x010486da, 0x03d8eb60, 0x02bcc438, 0x036746cb, 0x003f1202}}}, + {X: Field{[10]uint32{0x02ac6cda, 0x007882fc, 0x00d6477f, 0x0064e822, 0x01703af6, 0x03eb6a31, 0x0387d539, 0x0266df13, 0x03ddf92d, 0x003821dd}}, Y: Field{[10]uint32{0x01ccfee9, 0x0169404a, 0x00070db0, 0x039fb6f7, 0x001202c4, 0x03384357, 0x016ecc53, 0x0062c93a, 0x008ac6cb, 0x0009693e}}}, + {X: Field{[10]uint32{0x019ba6ed, 0x0284601a, 0x00776753, 0x039a2015, 0x0363bbe3, 0x0225aae5, 0x02a6a138, 0x01603ef6, 0x02b7afe9, 0x00116b9e}}, Y: Field{[10]uint32{0x0156f322, 0x01b9aa28, 0x00ff16c4, 0x01f83fbf, 0x02502f79, 0x0365bd0f, 0x00d440e3, 0x0381b934, 0x03ed127f, 0x003706bd}}}, + {X: Field{[10]uint32{0x00d00590, 0x0387793d, 0x00045327, 0x00516007, 0x026ae265, 0x01a2d30b, 0x00f509a7, 0x00114ecf, 0x033b71c5, 0x003f4a32}}, Y: Field{[10]uint32{0x00e5a7b6, 0x01994617, 0x02159c26, 0x00ac95fd, 0x013298a2, 0x005d3388, 0x01081f08, 0x033d12a9, 0x03954867, 0x002c1a13}}}, + {X: Field{[10]uint32{0x001d850d, 0x02cc9807, 0x01d7a158, 0x0181d9c7, 0x03956816, 0x00ee7ee9, 0x015e4e22, 0x0127c286, 0x000dac6f, 0x003c89bc}}, Y: Field{[10]uint32{0x0109ef86, 0x01c6d968, 0x0150f10f, 0x0228da45, 0x01d823a0, 0x00661bfa, 0x0230e53a, 0x028e2ad1, 0x004f6925, 0x00341757}}}, + {X: Field{[10]uint32{0x020337a3, 0x0113a41d, 0x0340ff0e, 0x03b23271, 0x00a994e1, 0x02cc0e3e, 0x00e23a72, 0x0212021f, 0x0213a80d, 0x000f3185}}, Y: Field{[10]uint32{0x013c3956, 0x036ef6b3, 0x033f5a11, 0x00794a85, 0x0090377f, 0x0256ac04, 0x0221f09f, 0x00ebda50, 0x016a2409, 0x00211d3e}}}, + {X: Field{[10]uint32{0x0260e736, 0x036b3833, 0x02223e5c, 0x03572579, 0x02633e7e, 0x03d5f5a1, 0x03be2331, 0x025c4af4, 0x01898cd9, 0x001c87b3}}, Y: Field{[10]uint32{0x00ffd69f, 0x02b064a8, 0x028ad532, 0x0284bdd9, 0x0221dc34, 0x03b18cf1, 0x009450bf, 0x01f2b928, 0x00d86fc0, 0x000c74a5}}}, + {X: Field{[10]uint32{0x032eff38, 0x03f3fe8a, 0x03aa2db0, 0x00b03fea, 0x00d5b106, 0x03963ea3, 0x01862715, 0x0366c6c9, 0x02581144, 0x00372eb2}}, Y: Field{[10]uint32{0x01ec7d34, 0x00ec95c8, 0x00689e6d, 0x03986bce, 0x00708b53, 0x038b185d, 0x02fbdca5, 0x01b3fe43, 0x021d339f, 0x00273dd8}}}, + {X: Field{[10]uint32{0x01db8b92, 0x007ccdc5, 0x03878342, 0x02654a39, 0x02b9300b, 0x031e895b, 0x00919382, 0x03b0af39, 0x0293e649, 0x003b4c53}}, Y: Field{[10]uint32{0x00744a11, 0x01f772d8, 0x0318bc83, 0x01238f7e, 0x0153ea03, 0x007c5519, 0x0122355e, 0x03fbcb8a, 0x02af0229, 0x001c2a06}}}, + {X: Field{[10]uint32{0x01c036ee, 0x00dae30a, 0x01c09854, 0x02d8010a, 0x005f5c7e, 0x017d96ba, 0x02977689, 0x02f23466, 0x03cc7a59, 0x001af466}}, Y: Field{[10]uint32{0x00999090, 0x0109cd41, 0x0332c0bc, 0x039de2d5, 0x0131803c, 0x010d5171, 0x03ea28f8, 0x015a06f6, 0x01e3f4f6, 0x00144d1b}}}, + {X: Field{[10]uint32{0x003d9acf, 0x01f1ac75, 0x03e15577, 0x0101eb62, 0x03ebe9d6, 0x02f8222f, 0x00228bb5, 0x037ecd81, 0x02156ac8, 0x00267b47}}, Y: Field{[10]uint32{0x01d2c922, 0x024430c2, 0x03c61e19, 0x02683d11, 0x0169f57e, 0x01c90dab, 0x02a0ac04, 0x01332a03, 0x01a4478b, 0x001d6c56}}}, + {X: Field{[10]uint32{0x02452045, 0x03821dec, 0x0171cc7f, 0x030e30d8, 0x000f00c3, 0x000c0e5c, 0x02dd90fb, 0x0377c212, 0x038c793a, 0x000f859b}}, Y: Field{[10]uint32{0x015bbd59, 0x0086aa07, 0x038da019, 0x0209ee52, 0x019f07e3, 0x0269b31b, 0x0330f6fb, 0x00a997b0, 0x0263b0cd, 0x00245966}}}, + {X: Field{[10]uint32{0x036df936, 0x01567345, 0x03656cf8, 0x00c82107, 0x01a1b1a4, 0x01027427, 0x00d1b168, 0x017ce2fe, 0x02d9a3a9, 0x003f06ea}}, Y: Field{[10]uint32{0x008af43d, 0x0158fc68, 0x0263884a, 0x024486db, 0x02e0b4d7, 0x020ad6d3, 0x005f2489, 0x02e27541, 0x03bdb013, 0x000c7de9}}}, + {X: Field{[10]uint32{0x037ff340, 0x02a0673f, 0x0125a5a5, 0x010d3a72, 0x003bd318, 0x00ce1a21, 0x003c8795, 0x007b2b24, 0x013d4b37, 0x00202ceb}}, Y: Field{[10]uint32{0x012af178, 0x039336dc, 0x02bfdf20, 0x00a1cd1e, 0x010108ae, 0x0197eb1a, 0x03ed7d3b, 0x01b61319, 0x00bdaac9, 0x003ec72a}}}, + {X: Field{[10]uint32{0x00616af2, 0x0330b91a, 0x03422073, 0x012535c9, 0x0002a87d, 0x023bdeab, 0x02c6c364, 0x03dc9f5d, 0x01ab2901, 0x002eb419}}, Y: Field{[10]uint32{0x030a37ed, 0x00ca71d1, 0x01d92236, 0x00d04fc5, 0x02fa925a, 0x02ae8a5c, 0x01d69a2e, 0x03bab536, 0x010216b5, 0x002ba75e}}}, + {X: Field{[10]uint32{0x029b8fe7, 0x010d7e44, 0x03ca9bce, 0x023dfa06, 0x01a2fb75, 0x0321e079, 0x01beb99c, 0x00329a65, 0x02d90d70, 0x00347c11}}, Y: Field{[10]uint32{0x0111a4df, 0x00d16818, 0x01017fca, 0x0029195d, 0x033090fc, 0x0110cc50, 0x03167188, 0x0056bcd1, 0x025d7eb8, 0x0009d3b7}}}, + {X: Field{[10]uint32{0x03f0a22f, 0x02811e8c, 0x03ea1751, 0x01851ce9, 0x0299df17, 0x00a6a83d, 0x01ea798d, 0x02a02963, 0x0355e3dc, 0x0036d4d7}}, Y: Field{[10]uint32{0x0353ff6b, 0x014a2b56, 0x037cced3, 0x03591de8, 0x00e61b86, 0x039ea3c4, 0x013df837, 0x00ef2846, 0x015d931a, 0x0039f600}}}, + {X: Field{[10]uint32{0x00a42a80, 0x039a4703, 0x01d5082a, 0x03945933, 0x008635b7, 0x02693c61, 0x00b1a5db, 0x03c3ebe6, 0x0206a56e, 0x0036876e}}, Y: Field{[10]uint32{0x0210c9ff, 0x0238c4a8, 0x01508d92, 0x0196c85e, 0x008807e2, 0x0172d058, 0x00066210, 0x00c6f2ba, 0x003ca695, 0x0021aa0e}}}, + {X: Field{[10]uint32{0x01aa42e7, 0x03b0a282, 0x008aeff5, 0x01de6cd6, 0x033b176b, 0x01ed509d, 0x014f29ff, 0x0019b1f7, 0x02b4d980, 0x00099f09}}, Y: Field{[10]uint32{0x0027161d, 0x03c82d42, 0x0034142f, 0x0231fe8c, 0x01d58465, 0x0364f6aa, 0x02300531, 0x03ac9574, 0x003ff4e5, 0x000ce430}}}, + {X: Field{[10]uint32{0x01cbea0a, 0x0120fff0, 0x0027d4f3, 0x00a7fb97, 0x025561fd, 0x0021246a, 0x00c79152, 0x03e5541c, 0x03524e6f, 0x0020092b}}, Y: Field{[10]uint32{0x02dd86b0, 0x0075f2ec, 0x00a16dff, 0x01c5cd17, 0x03df7a8a, 0x00279dbf, 0x0078fc06, 0x01c9ac20, 0x00d0498f, 0x0032779e}}}, + {X: Field{[10]uint32{0x0208f661, 0x014d1158, 0x002d2779, 0x025501a2, 0x00dc3dc1, 0x01c73c00, 0x030d7dd3, 0x02d0801f, 0x0268c7be, 0x00047fda}}, Y: Field{[10]uint32{0x03b4092c, 0x0306f029, 0x03dbd658, 0x02ea5e9f, 0x03916b75, 0x007df8ee, 0x03cac25c, 0x0206d479, 0x00252547, 0x002d4f77}}}, + {X: Field{[10]uint32{0x02e3c929, 0x02309fcd, 0x011f6aa8, 0x025ac01d, 0x02b70d65, 0x016a660a, 0x0232d7a6, 0x02080ce6, 0x0083f9a6, 0x00158a84}}, Y: Field{[10]uint32{0x01e05b51, 0x0112b2ec, 0x03364557, 0x01854248, 0x0166ec20, 0x0042b5d0, 0x00e7d255, 0x02022e54, 0x007f0908, 0x0028e03b}}}, + {X: Field{[10]uint32{0x0341c413, 0x0020b8b4, 0x037af68d, 0x029533c1, 0x030e097f, 0x03bd915c, 0x02a75987, 0x0035a4ed, 0x00fd327c, 0x0013bf9c}}, Y: Field{[10]uint32{0x00ce3dc7, 0x02afbcb2, 0x0098a4a1, 0x0118233b, 0x00b110a3, 0x03b476c4, 0x028befc3, 0x02d8b766, 0x039b92e0, 0x0004351e}}}, + {X: Field{[10]uint32{0x03a51f20, 0x03027008, 0x0034ff9a, 0x0260b34c, 0x03354abd, 0x00780709, 0x028576c9, 0x00a2c2f7, 0x030cd7f1, 0x0013592f}}, Y: Field{[10]uint32{0x00a5e28f, 0x030cb97a, 0x00d6eb9d, 0x013cf532, 0x03da3c52, 0x0136f0b9, 0x03bf38e1, 0x037feb79, 0x001af57f, 0x0005679d}}}, + {X: Field{[10]uint32{0x00a187bf, 0x03cc2cc0, 0x0243bc48, 0x02b0dcab, 0x03466de2, 0x03bb3be8, 0x02f0064c, 0x01e35acf, 0x034aff32, 0x00269058}}, Y: Field{[10]uint32{0x02aeae2a, 0x01faa801, 0x03c3cad2, 0x00c3d014, 0x02f409e5, 0x01591262, 0x007a1936, 0x01df3e11, 0x020faebb, 0x0003bbfb}}}, + {X: Field{[10]uint32{0x0102418b, 0x0137b4a4, 0x014cf4fc, 0x03f39e09, 0x002c85cf, 0x039719dd, 0x02fec2d2, 0x03782023, 0x00fb9a6b, 0x00038601}}, Y: Field{[10]uint32{0x02fcdda7, 0x01aacd1f, 0x01e7bfa5, 0x030c60f3, 0x02447e93, 0x00e9996b, 0x03e81c9b, 0x0192e70b, 0x01eb9c16, 0x003a72ac}}}, + {X: Field{[10]uint32{0x00593212, 0x018bc6d9, 0x03b411eb, 0x03c097e7, 0x00717611, 0x03fd134b, 0x021705ad, 0x01ec2be0, 0x0344c024, 0x0002980d}}, Y: Field{[10]uint32{0x02603b61, 0x0066ee32, 0x01d9ce5c, 0x0056a5ae, 0x026dcdb0, 0x021c4ee6, 0x035c0a2f, 0x01d8e10c, 0x032b706a, 0x002083f4}}}, + {X: Field{[10]uint32{0x015f20b0, 0x01882812, 0x036cb66a, 0x02ceab89, 0x01a1108a, 0x03258193, 0x0172a2fe, 0x004a60d2, 0x01b6895b, 0x0029bc76}}, Y: Field{[10]uint32{0x01c8273c, 0x027550db, 0x0288029c, 0x03be0e81, 0x037f55d7, 0x0219e70f, 0x03f5ea81, 0x020e518f, 0x00d0df03, 0x0026a577}}}, + {X: Field{[10]uint32{0x01ac5c48, 0x02bc49b3, 0x0041893b, 0x03cef5d3, 0x02f09f30, 0x01b88850, 0x00f920ab, 0x00ad8f80, 0x00320782, 0x0012b145}}, Y: Field{[10]uint32{0x00f43885, 0x012f0c68, 0x02a6ad7e, 0x031dc83d, 0x027ff037, 0x025156ef, 0x03da161f, 0x01291917, 0x014877e9, 0x002afd74}}}, + {X: Field{[10]uint32{0x03fb7a9b, 0x02efdebd, 0x004752da, 0x00dccd81, 0x0248af6e, 0x02cce508, 0x02c588e1, 0x03ab9633, 0x015ba16e, 0x00168b3d}}, Y: Field{[10]uint32{0x029322e2, 0x00001039, 0x01c4fe0c, 0x007dc58f, 0x01a45f8c, 0x03795688, 0x005aeca5, 0x01cb353f, 0x022d32ff, 0x0023c9ef}}}, + {X: Field{[10]uint32{0x03011c99, 0x00acf636, 0x0388f023, 0x00f8c32c, 0x02a87605, 0x01bff13a, 0x0012b27f, 0x0307d810, 0x03e8ef48, 0x00385bc8}}, Y: Field{[10]uint32{0x00c56000, 0x030e43ee, 0x017990e8, 0x03a84d0a, 0x0247ffe3, 0x02f69853, 0x015bb977, 0x0297036a, 0x0152b0af, 0x000657ff}}}, + {X: Field{[10]uint32{0x0124fb84, 0x02f458e1, 0x0145ac1b, 0x00ebfe5a, 0x0228923a, 0x03761ba4, 0x01e4263c, 0x027dc543, 0x00d7ac10, 0x00194d9f}}, Y: Field{[10]uint32{0x0347d731, 0x020d2945, 0x006b68a7, 0x02541a02, 0x00a7687c, 0x03ad3fa3, 0x009b170b, 0x01f75934, 0x01bafbe6, 0x00033c2e}}}, + {X: Field{[10]uint32{0x03d6eac2, 0x03bcd99a, 0x00d54a5c, 0x02723a55, 0x0389da48, 0x01b75991, 0x004228bd, 0x00ee35e9, 0x000b3944, 0x00042a21}}, Y: Field{[10]uint32{0x0261eff2, 0x01f80d31, 0x00a60798, 0x01571384, 0x03d8cc40, 0x03dfeb44, 0x01163ace, 0x01637861, 0x036ee4aa, 0x001ffdbd}}}, + {X: Field{[10]uint32{0x0245d6a0, 0x02c4c9d4, 0x000e1528, 0x03aa46ba, 0x027b1db5, 0x0315dfc5, 0x039d0380, 0x020809ae, 0x00a6c01b, 0x000ffbfa}}, Y: Field{[10]uint32{0x03637b5e, 0x01630e8e, 0x02350ecd, 0x01e9f27f, 0x03a95975, 0x0275a3bf, 0x00a0b543, 0x00512915, 0x01a937e6, 0x002a5b7d}}}, + {X: Field{[10]uint32{0x00052b61, 0x02b68871, 0x00c626c3, 0x03575861, 0x0058595f, 0x01759534, 0x03fb908f, 0x018ba5af, 0x037c0e41, 0x003be4f5}}, Y: Field{[10]uint32{0x03cd0bf5, 0x03efd03c, 0x0066b953, 0x007db35d, 0x01e53526, 0x011745a7, 0x01a23a86, 0x025f1fd6, 0x0385c18d, 0x00100222}}}, + {X: Field{[10]uint32{0x00ca4872, 0x01ef60ac, 0x01d40d62, 0x0335466f, 0x009224a2, 0x025c6df1, 0x01edbd84, 0x0240f521, 0x035eb0fa, 0x003c5e27}}, Y: Field{[10]uint32{0x031a9da8, 0x000587e9, 0x028d0583, 0x0016b6aa, 0x019e36a9, 0x01ec7d28, 0x03570f47, 0x0115fa8b, 0x00b65456, 0x00132117}}}, + {X: Field{[10]uint32{0x009b3274, 0x03313533, 0x004bfff3, 0x02422a1c, 0x00641938, 0x0353907c, 0x000d15ba, 0x017b4083, 0x0388ebc7, 0x00342ec5}}, Y: Field{[10]uint32{0x022a7641, 0x02aeffc8, 0x022fd8f7, 0x0091137d, 0x0143ac55, 0x00199992, 0x02877963, 0x009fd239, 0x00a895a3, 0x000e8483}}}, + {X: Field{[10]uint32{0x00e8963a, 0x0337df37, 0x0005a3fa, 0x0186bae6, 0x022f05e4, 0x00844350, 0x02aab317, 0x01eb9935, 0x010cf780, 0x000592b0}}, Y: Field{[10]uint32{0x02549b69, 0x037166fa, 0x032093f9, 0x0098c07c, 0x009b6dca, 0x0127e63f, 0x01d6f858, 0x037642ec, 0x03d440f1, 0x002373d0}}}, + {X: Field{[10]uint32{0x001fbe5f, 0x01b1e0a5, 0x02e40987, 0x00a5ce68, 0x00cd3aca, 0x00a527c3, 0x017dcf89, 0x0038eae1, 0x0165a8e4, 0x003c48b6}}, Y: Field{[10]uint32{0x02447371, 0x03409a36, 0x02257f50, 0x01cb4863, 0x00715043, 0x02d9c2fb, 0x02192d0b, 0x02260de2, 0x039dd9e6, 0x00136652}}}, + {X: Field{[10]uint32{0x008870a8, 0x0050e939, 0x03829662, 0x008605b9, 0x01b975fc, 0x015e07c2, 0x02e2cdbf, 0x02a4a86b, 0x014775e5, 0x002b25c5}}, Y: Field{[10]uint32{0x03c9aa71, 0x010f1c50, 0x03edef89, 0x0373e2ef, 0x0253fff7, 0x01e3725e, 0x03679452, 0x005d0a59, 0x0203795b, 0x000927ed}}}, + {X: Field{[10]uint32{0x01330906, 0x0312174b, 0x03fbdd48, 0x01b8512c, 0x02fb0add, 0x03a721c3, 0x013da811, 0x03f73243, 0x011edfd5, 0x002567b2}}, Y: Field{[10]uint32{0x0257ebdc, 0x02428898, 0x024b9aed, 0x01d4a91c, 0x0229f489, 0x014d617f, 0x01b5ebc6, 0x031d86d8, 0x0128b707, 0x000797b0}}}, + {X: Field{[10]uint32{0x02982859, 0x02ea4f87, 0x028b7c59, 0x02348ed7, 0x003c6abd, 0x01b7827c, 0x03b2d157, 0x0208c915, 0x01d8ed7d, 0x001641e5}}, Y: Field{[10]uint32{0x00576708, 0x014a4b4d, 0x003c0683, 0x008ea760, 0x01a09cb1, 0x011ead0b, 0x0216490a, 0x02210583, 0x02861a3c, 0x0017b74a}}}, + {X: Field{[10]uint32{0x03e0ba9e, 0x005373a8, 0x02555897, 0x02d6fc6e, 0x0348fdb4, 0x032b4541, 0x02178535, 0x00916fb6, 0x03987439, 0x00314dca}}, Y: Field{[10]uint32{0x00bca987, 0x02266c58, 0x035a022e, 0x010e2d92, 0x00767afc, 0x01ada713, 0x01536a54, 0x036e300d, 0x03617159, 0x003e0b42}}}, + {X: Field{[10]uint32{0x035bd38a, 0x013e5b38, 0x01ee1653, 0x00a1f72f, 0x00101611, 0x00c3c9b1, 0x00d20166, 0x032f4fb2, 0x01fcae39, 0x003cf656}}, Y: Field{[10]uint32{0x009b3562, 0x00f3c5eb, 0x016ce160, 0x000fb42b, 0x03da586a, 0x03918051, 0x03e2f97f, 0x009e0cbf, 0x001f8760, 0x00387957}}}, + {X: Field{[10]uint32{0x037fad9e, 0x033b0b94, 0x02cf8dd5, 0x010fe2a4, 0x0103a280, 0x0226c193, 0x023d9604, 0x038de0af, 0x036ebe3c, 0x00248af1}}, Y: Field{[10]uint32{0x01122109, 0x0302657d, 0x02b54352, 0x016f440c, 0x00116fbf, 0x006a5486, 0x00b9ea75, 0x03bf688c, 0x03572508, 0x002cc667}}}, + {X: Field{[10]uint32{0x01f0360d, 0x00e1cd36, 0x00a1299a, 0x02236ebf, 0x022c461d, 0x001c2b32, 0x02b1df08, 0x00b255e6, 0x01407a6d, 0x001171f7}}, Y: Field{[10]uint32{0x03e85ac4, 0x01349799, 0x00e73264, 0x029a983a, 0x02d076eb, 0x03765bd2, 0x03c4e044, 0x01a7b5b0, 0x015b5f24, 0x000e85e1}}}, + {X: Field{[10]uint32{0x0159bacb, 0x038b49ae, 0x00d5b33e, 0x02787c24, 0x00f1af5c, 0x01104705, 0x0189a5b7, 0x02c028f7, 0x0198dfd4, 0x001908b6}}, Y: Field{[10]uint32{0x037a3bb7, 0x03df6240, 0x03a09cdb, 0x01f1c0ee, 0x03376f59, 0x01dbd6cf, 0x018cea22, 0x0062864f, 0x03344912, 0x00388d63}}}, + {X: Field{[10]uint32{0x00b0535c, 0x03320b31, 0x01a6f535, 0x033c14d9, 0x0295b1a3, 0x00afdb07, 0x00640f19, 0x01b45469, 0x02143319, 0x00238120}}, Y: Field{[10]uint32{0x017c34ce, 0x023bd43a, 0x00e65b63, 0x02562ea5, 0x00200121, 0x017d56a8, 0x0282ee53, 0x00b1567c, 0x033a1f65, 0x0035b4b5}}}, + {X: Field{[10]uint32{0x024a79bb, 0x001c27f9, 0x002c4a1c, 0x003c0575, 0x02b8a708, 0x0049184f, 0x025a9e17, 0x00bc3e28, 0x01a8b5eb, 0x00168acf}}, Y: Field{[10]uint32{0x0386e6b7, 0x01fc622f, 0x00cd4422, 0x0209ae09, 0x01a6435a, 0x03be7629, 0x0095f8e6, 0x02abf9b7, 0x011deb54, 0x00181f1e}}}, + {X: Field{[10]uint32{0x02cd7ccf, 0x034b573d, 0x0213e1a0, 0x0000f377, 0x01c5296e, 0x0082afd2, 0x00f3d912, 0x005299d4, 0x03a35cf6, 0x00050d61}}, Y: Field{[10]uint32{0x02a653d7, 0x00bcb7e1, 0x0201b662, 0x01f0ba0c, 0x0315f14c, 0x011b0d02, 0x021af490, 0x03162d26, 0x01fade6c, 0x00126f21}}}, + {X: Field{[10]uint32{0x00a93193, 0x006f8677, 0x031a3ac8, 0x01f3fc97, 0x01ba357b, 0x03276141, 0x032c4bc8, 0x031d330e, 0x00428737, 0x003c0203}}, Y: Field{[10]uint32{0x023951f1, 0x00970e52, 0x00f0b5cf, 0x0364b289, 0x001c6a5a, 0x01c09f47, 0x03cfe320, 0x019d29f5, 0x019f57bf, 0x002f7404}}}, + {X: Field{[10]uint32{0x01130034, 0x01235417, 0x009cef77, 0x02bab01d, 0x023e162d, 0x0175f109, 0x00b26b68, 0x03fbd0db, 0x0373e547, 0x0021deb8}}, Y: Field{[10]uint32{0x00dfcf5f, 0x03db7c35, 0x00a8e6f9, 0x0054cb97, 0x03e1275e, 0x03c9a328, 0x0156b798, 0x00d06bb6, 0x0095b750, 0x0007c2bd}}}, + {X: Field{[10]uint32{0x00e619d4, 0x03caae7a, 0x02ca0d1d, 0x00182dce, 0x03e55f07, 0x01a689cb, 0x016a0714, 0x03286232, 0x036f0635, 0x00290637}}, Y: Field{[10]uint32{0x02f754e3, 0x03ff3580, 0x00856525, 0x0061a52e, 0x002e7558, 0x0296d646, 0x0099a6da, 0x009383f9, 0x01bb5bbb, 0x000ac1b3}}}, + {X: Field{[10]uint32{0x02aedeab, 0x001d8de8, 0x029671d9, 0x00253ad4, 0x00114dc2, 0x0131ec2d, 0x02dce4f4, 0x02eb4897, 0x0174bb6f, 0x0013084f}}, Y: Field{[10]uint32{0x03970b51, 0x0037dce7, 0x01be0e48, 0x03ec81b1, 0x01402fb5, 0x022bea73, 0x012c7d54, 0x0170561d, 0x039fccc6, 0x001d06fb}}}, + {X: Field{[10]uint32{0x00deb13a, 0x02dc1588, 0x01bff0ec, 0x030eed33, 0x032cf93b, 0x02240046, 0x014073a4, 0x03946c6a, 0x02fd3f94, 0x0028de41}}, Y: Field{[10]uint32{0x00e6030a, 0x028b59cc, 0x02332f01, 0x0376252a, 0x008a8a16, 0x00cc52dc, 0x00d5e552, 0x026c7461, 0x00b1c14a, 0x001828ec}}}, + {X: Field{[10]uint32{0x01e72301, 0x013b1353, 0x0225c5e8, 0x02396e14, 0x02d6d652, 0x01aed194, 0x038ae3d2, 0x02bd4592, 0x02ed639e, 0x000b19df}}, Y: Field{[10]uint32{0x03ee832a, 0x006e7fc1, 0x0278eaca, 0x00c4ecb4, 0x005fe639, 0x02b01f09, 0x0389240c, 0x01f2e85f, 0x0006d3bb, 0x0037c393}}}, + {X: Field{[10]uint32{0x017e77b4, 0x0077d2df, 0x009395d6, 0x02c33eb2, 0x01684473, 0x02c07000, 0x035fc3c5, 0x01af940c, 0x0014eaf8, 0x002d547e}}, Y: Field{[10]uint32{0x0246664b, 0x026738c1, 0x00bb1bd3, 0x03984693, 0x038818b6, 0x012b879f, 0x033f923b, 0x0057e0c0, 0x03354697, 0x002a5e72}}}, + {X: Field{[10]uint32{0x01f45c39, 0x020851b7, 0x01984fba, 0x02a1d050, 0x012cd47b, 0x0037c31c, 0x0361ad74, 0x0013abc7, 0x03185c8c, 0x00263571}}, Y: Field{[10]uint32{0x00050804, 0x034ae928, 0x01bc5b36, 0x00b10a3d, 0x019d4a8e, 0x007b3aa2, 0x02f88f5f, 0x01fb083a, 0x01915c73, 0x002b2949}}}, + {X: Field{[10]uint32{0x00cefc7c, 0x008f8ae5, 0x03bc9a0b, 0x021bbe3e, 0x02ed1e13, 0x03ef3318, 0x00104854, 0x02d949a3, 0x02f7260f, 0x00145238}}, Y: Field{[10]uint32{0x03ca2500, 0x01c914a9, 0x016e1296, 0x00581f2a, 0x039e9b27, 0x0068236e, 0x024a8ccb, 0x0292616e, 0x012d35de, 0x00196d37}}}, + {X: Field{[10]uint32{0x020e753c, 0x03a44c63, 0x031daf91, 0x01f260b7, 0x00a08a22, 0x02fad145, 0x0240cccb, 0x019042e2, 0x01c18c9d, 0x0004b1a6}}, Y: Field{[10]uint32{0x032fcc99, 0x0008b624, 0x028e120b, 0x01a013b4, 0x004889e9, 0x00145ba2, 0x029a1975, 0x015c90d1, 0x004289b5, 0x001f654f}}}, + {X: Field{[10]uint32{0x020a8d20, 0x01a75204, 0x02c639dc, 0x01e540e6, 0x02134e44, 0x03aec8c4, 0x02ecac37, 0x010046cd, 0x03f8a773, 0x0013434f}}, Y: Field{[10]uint32{0x0144ec64, 0x025816c0, 0x02a57397, 0x00a7c2c3, 0x03960b3d, 0x025fc85c, 0x00f10261, 0x013180f1, 0x03a0e098, 0x003b7fc5}}}, + {X: Field{[10]uint32{0x0136e42d, 0x00941855, 0x03be4481, 0x036606a7, 0x03ccb069, 0x019a0cdb, 0x01b0985a, 0x01e9c6a4, 0x030b3e7b, 0x0033a42d}}, Y: Field{[10]uint32{0x01569000, 0x00e91e01, 0x01e672e6, 0x039915fc, 0x00d3af73, 0x021d581b, 0x00640ca2, 0x03ab5d49, 0x015612e0, 0x002337a7}}}, + {X: Field{[10]uint32{0x0163b2d8, 0x03124c41, 0x0297e360, 0x02c720ef, 0x00d197f5, 0x034bea42, 0x03bf9851, 0x021e7667, 0x03276bb1, 0x000a31e4}}, Y: Field{[10]uint32{0x00643868, 0x02125b3b, 0x010857c1, 0x00f8cf64, 0x03bc0f3e, 0x03873ef8, 0x02b10f6a, 0x02d5196d, 0x0240e2f3, 0x00322513}}}, + {X: Field{[10]uint32{0x03442443, 0x03fa94f9, 0x006659a1, 0x02021f4c, 0x03864d4c, 0x016dc1fc, 0x00c2b6b5, 0x033c0601, 0x01062413, 0x001b8b6b}}, Y: Field{[10]uint32{0x029430e0, 0x000d77c4, 0x01f7dc4c, 0x00a10d10, 0x02497bc0, 0x02703f8d, 0x021fba73, 0x01a450c2, 0x0064e05d, 0x0027699f}}}, + {X: Field{[10]uint32{0x004d20fe, 0x016dc923, 0x0254f871, 0x022248fb, 0x0119f261, 0x037d0dfe, 0x034d03df, 0x00e51b10, 0x02c80376, 0x002fbe52}}, Y: Field{[10]uint32{0x031e25db, 0x033b5500, 0x038aaee7, 0x01cf39f8, 0x02386484, 0x02578501, 0x0383032e, 0x007719be, 0x0134e5fc, 0x00348c91}}}, + {X: Field{[10]uint32{0x018e433d, 0x033b6be0, 0x01125918, 0x0190f517, 0x009b7d86, 0x003c994f, 0x0166a24c, 0x01707728, 0x0057f1b4, 0x0014d523}}, Y: Field{[10]uint32{0x010c3b44, 0x024e013c, 0x0240db6a, 0x0170f2b5, 0x01c36aec, 0x00c2c4ea, 0x01307e21, 0x001fe700, 0x0146f0c2, 0x003304e2}}}, + {X: Field{[10]uint32{0x00b5867e, 0x01bfd001, 0x0188f90f, 0x02aff51e, 0x012aee71, 0x022dc8fb, 0x00b0e09b, 0x0324053a, 0x03847f25, 0x001ff53d}}, Y: Field{[10]uint32{0x00a1bd9d, 0x0174899d, 0x0297641b, 0x0234dd7e, 0x0358eec1, 0x01b900b6, 0x0205805a, 0x004ab659, 0x02bc901f, 0x003ff0f7}}}, + {X: Field{[10]uint32{0x0397dd9d, 0x031e7e94, 0x003ccd3d, 0x03da72e2, 0x03d4251b, 0x036411bb, 0x0062424c, 0x0226d127, 0x027e4997, 0x001112a2}}, Y: Field{[10]uint32{0x03b30282, 0x03117936, 0x03f828f7, 0x0106fce4, 0x02abbe8e, 0x002355b0, 0x028c7757, 0x02c0802b, 0x003b3356, 0x0013317c}}}, + {X: Field{[10]uint32{0x0326bd8b, 0x0033aa15, 0x02bc1acb, 0x019e398a, 0x0204af8c, 0x0108071e, 0x0294bd0a, 0x01897481, 0x007784d8, 0x003fc172}}, Y: Field{[10]uint32{0x0196eeb3, 0x030b79ea, 0x012d906e, 0x028242f4, 0x02a55f6a, 0x02fa613b, 0x025a0b5c, 0x01894f3e, 0x00ce6ac2, 0x001f3c3a}}}, + {X: Field{[10]uint32{0x027e4ab2, 0x020ce6b7, 0x027c679b, 0x001223c2, 0x00e29f47, 0x00ff649d, 0x0094ea08, 0x006daf3a, 0x03ae6aa3, 0x00203f7d}}, Y: Field{[10]uint32{0x0152fb75, 0x01b9828e, 0x018fe3f4, 0x02fc2f79, 0x0249e066, 0x03515d71, 0x004a8b4b, 0x009d158d, 0x017b1696, 0x001df5cc}}}, + {X: Field{[10]uint32{0x01879214, 0x012bab50, 0x01589685, 0x01edfad2, 0x03ef2022, 0x0035dcb5, 0x0020a74f, 0x001f2b54, 0x00c810a3, 0x002b0e29}}, Y: Field{[10]uint32{0x035016ac, 0x034b3a87, 0x01213c7c, 0x02acd057, 0x00d75ecf, 0x00b88a7b, 0x02f77ca9, 0x01616105, 0x00bb3c67, 0x003d2713}}}, + {X: Field{[10]uint32{0x01f75514, 0x02445569, 0x036fea26, 0x00d77a6a, 0x013a90a4, 0x03d40bc6, 0x0162f408, 0x00098bf5, 0x02ddf1e1, 0x002cdcdb}}, Y: Field{[10]uint32{0x015a78c8, 0x020c15eb, 0x027514e4, 0x037995fb, 0x000eafa2, 0x02856b83, 0x01cb0682, 0x00d4f3c0, 0x03aff190, 0x0020633b}}}, + {X: Field{[10]uint32{0x010dc295, 0x00e2cccc, 0x0322f127, 0x03d73ed9, 0x03e698d4, 0x031aa16a, 0x03f6d5ea, 0x03045ad5, 0x0212d100, 0x0019b59f}}, Y: Field{[10]uint32{0x00a05dd3, 0x0097fa85, 0x0318fd4e, 0x0318cb5c, 0x02685fae, 0x026ef5fa, 0x0208ea70, 0x0269534d, 0x021f3a0c, 0x0027353e}}}, + {X: Field{[10]uint32{0x02b59043, 0x011c4d4f, 0x0333eb87, 0x01ae9ee6, 0x029fa10c, 0x01bb37c2, 0x02eb6514, 0x0392136a, 0x035f756a, 0x002e15b5}}, Y: Field{[10]uint32{0x01cb0a38, 0x0069f6e2, 0x004c4b04, 0x0071c9ca, 0x026566da, 0x037c91bc, 0x03a177d8, 0x0259252c, 0x02b12f24, 0x00172150}}}, + {X: Field{[10]uint32{0x01c47d27, 0x014a547e, 0x01548afc, 0x017ee165, 0x03c736b1, 0x01869950, 0x00142cd6, 0x008e4d16, 0x03d70320, 0x0001a0ef}}, Y: Field{[10]uint32{0x022de166, 0x018d045d, 0x01746b41, 0x028a3653, 0x02420387, 0x031a3365, 0x0029f84a, 0x037c9945, 0x0240f5db, 0x00243d4a}}}, + {X: Field{[10]uint32{0x032923c2, 0x003e2a46, 0x018963d0, 0x029fe25d, 0x0141ee1c, 0x00ce8250, 0x00959345, 0x0079944e, 0x01f0811e, 0x000bfaa8}}, Y: Field{[10]uint32{0x00499c1a, 0x00e843fa, 0x0202b07e, 0x0081f41b, 0x03690d18, 0x039bb87b, 0x03701c35, 0x03500575, 0x0176b884, 0x00277602}}}, + {X: Field{[10]uint32{0x0287cda4, 0x001ed608, 0x0009780e, 0x02a86a5a, 0x01847070, 0x01134833, 0x0365e9b1, 0x02ebcea5, 0x0137da9e, 0x0033994a}}, Y: Field{[10]uint32{0x001ba572, 0x00c87cc1, 0x01b6801b, 0x00dbade8, 0x00454e17, 0x0279eba1, 0x01db3782, 0x00b6f96a, 0x03fb5f15, 0x0030711b}}}, + {X: Field{[10]uint32{0x00976211, 0x017f9a1e, 0x008a84fd, 0x02dac137, 0x03556087, 0x01d42f71, 0x03f9738a, 0x018feeac, 0x03d91701, 0x00269a56}}, Y: Field{[10]uint32{0x02aeda70, 0x0273c48f, 0x03c27d0c, 0x00b5935a, 0x010dce26, 0x02521a36, 0x002b1332, 0x03361669, 0x01f375ac, 0x003d02e8}}}, + {X: Field{[10]uint32{0x0134ba44, 0x034c88ef, 0x00ec718c, 0x0285d55e, 0x035908b0, 0x03936930, 0x02bd6d09, 0x020fb2fe, 0x0368bd30, 0x00396eab}}, Y: Field{[10]uint32{0x03a27fb0, 0x03bee642, 0x03dbce4d, 0x011aa6be, 0x005feb7f, 0x028fa1a9, 0x0076d0ed, 0x030f0541, 0x01f0365c, 0x002ae194}}}, + {X: Field{[10]uint32{0x03e59cc7, 0x00ddb63f, 0x0104ce06, 0x0322fd8f, 0x03dd0c4d, 0x01fb87f6, 0x033530bb, 0x03f9df63, 0x02a2b507, 0x000b09b3}}, Y: Field{[10]uint32{0x0230d62e, 0x002da739, 0x0004a500, 0x030abbf0, 0x03c30a1c, 0x016114a5, 0x0367151b, 0x00fae6c2, 0x03af54d0, 0x002cd138}}}, + {X: Field{[10]uint32{0x00bbd0e4, 0x00527d72, 0x027a3c2a, 0x02701ff2, 0x024d5333, 0x0281f8bd, 0x01eadaf0, 0x00b98623, 0x039f52af, 0x001f19d4}}, Y: Field{[10]uint32{0x009067c9, 0x039cfa4c, 0x0303896e, 0x02f986d8, 0x03df7a2c, 0x01990bb1, 0x02cc97ec, 0x0244d813, 0x02fdc21c, 0x000fe61c}}}, + {X: Field{[10]uint32{0x02249574, 0x02b7072a, 0x01aab8f9, 0x013dd080, 0x00334561, 0x00769c72, 0x02e1d17e, 0x002f24ed, 0x012dec8b, 0x0012d777}}, Y: Field{[10]uint32{0x02c5460b, 0x02cdaa2a, 0x03d695df, 0x0155b957, 0x036e16e7, 0x00aa169a, 0x00d18b3d, 0x03bf6d0d, 0x02dcaa3e, 0x0033eb68}}}, + {X: Field{[10]uint32{0x00d80e4b, 0x02f0d6e2, 0x03e59216, 0x0200bac2, 0x00f9bb66, 0x01cea13e, 0x0266edb8, 0x0020d61a, 0x02f2ccfc, 0x0035dd70}}, Y: Field{[10]uint32{0x0053ddbb, 0x02ce933f, 0x01ea765b, 0x015e444d, 0x02ff56ca, 0x025902a1, 0x02aa0b51, 0x0088c73d, 0x01b7988a, 0x00322976}}}, + {X: Field{[10]uint32{0x00d9bb4a, 0x0200ea6f, 0x014dcd3c, 0x01ec0dab, 0x00b005b0, 0x00f70f69, 0x001d9844, 0x003e77ec, 0x03097881, 0x001c68f3}}, Y: Field{[10]uint32{0x03caaa55, 0x00c41002, 0x01f5a1ad, 0x01362627, 0x01bd4a3c, 0x0185eb55, 0x000c5b39, 0x00c06e59, 0x02217db0, 0x0022aae3}}}, + {X: Field{[10]uint32{0x011f53b7, 0x03a2ec66, 0x00d3fdde, 0x00160970, 0x02a82f7d, 0x035de3bd, 0x00596ae3, 0x025b9880, 0x005492b6, 0x002f1c68}}, Y: Field{[10]uint32{0x029a2a15, 0x02abd85c, 0x03b52b07, 0x00db9003, 0x00d11255, 0x018c2a42, 0x03744600, 0x02e362c4, 0x01259785, 0x00055e24}}}, + {X: Field{[10]uint32{0x00847abc, 0x0247193f, 0x01f7e6f8, 0x002f1ade, 0x00e8d94a, 0x003d8396, 0x001ec81a, 0x02ff73ee, 0x0119ee62, 0x00274882}}, Y: Field{[10]uint32{0x02d0c675, 0x002f1f9b, 0x02a16e53, 0x03229efe, 0x0075f3a7, 0x027d3a53, 0x03fe8865, 0x00f0ae37, 0x039b1a07, 0x0020524d}}}, + {X: Field{[10]uint32{0x03f33425, 0x0230cfbb, 0x016e5c6c, 0x006d38da, 0x00d25bff, 0x038eb565, 0x030c6c91, 0x02f4668c, 0x026ad30b, 0x0020da5d}}, Y: Field{[10]uint32{0x02e79e4a, 0x02562e5c, 0x008a4e4b, 0x0236185f, 0x038ed5d2, 0x0087df6b, 0x00970d9c, 0x015d7216, 0x0282b3f4, 0x00289fdd}}}, + {X: Field{[10]uint32{0x00542451, 0x02cba2c8, 0x00ab457d, 0x02b4735a, 0x03e91f51, 0x021fed09, 0x00d36b54, 0x03aaac6a, 0x00750e4a, 0x001389de}}, Y: Field{[10]uint32{0x026566e0, 0x014083a8, 0x0123e763, 0x0036a3e1, 0x02d138fd, 0x0054a951, 0x02bf1d2a, 0x012e07e5, 0x03655bbc, 0x0027ebbf}}}, + {X: Field{[10]uint32{0x01a0d2fa, 0x024408ce, 0x036b108b, 0x0306c84c, 0x01825046, 0x009816a4, 0x028d2027, 0x03ffcc39, 0x03b51b9d, 0x0009fe41}}, Y: Field{[10]uint32{0x012d4a15, 0x035ec301, 0x0068acbf, 0x0167ff10, 0x000105f4, 0x03571276, 0x004bf3dd, 0x00d803ee, 0x01c36cb1, 0x00045489}}}, + {X: Field{[10]uint32{0x02b1fab3, 0x010bbb55, 0x0281864b, 0x02a3cf35, 0x02ef0900, 0x007dc3c5, 0x03ff42d4, 0x01d3110d, 0x03206506, 0x001b67fa}}, Y: Field{[10]uint32{0x03a02065, 0x015d3483, 0x02444f60, 0x0000e6a8, 0x035f7f7b, 0x014ebe8e, 0x015f8576, 0x00f070b9, 0x03ecd82b, 0x0020b365}}}, + {X: Field{[10]uint32{0x0187bfac, 0x03cb3de0, 0x03558857, 0x02f4ef45, 0x01ecb9cd, 0x00a139ca, 0x01c3b363, 0x019a74d8, 0x02b43360, 0x00226074}}, Y: Field{[10]uint32{0x00d48498, 0x01b5e05c, 0x0245a3e8, 0x018db09d, 0x000216b2, 0x0053b357, 0x011bf736, 0x0174761e, 0x0327d5a4, 0x0006e6ba}}}, + {X: Field{[10]uint32{0x02e1d72e, 0x026169dc, 0x010ce9c5, 0x0215b4f0, 0x02816916, 0x01fa4b38, 0x0140d557, 0x0347f895, 0x0118e47a, 0x0021299d}}, Y: Field{[10]uint32{0x01631658, 0x0294d071, 0x03356dc8, 0x0389a67b, 0x0016ca04, 0x0312dcff, 0x0011777d, 0x00ba8b9b, 0x03af8507, 0x0034f2e4}}}, + {X: Field{[10]uint32{0x00a8c683, 0x030a346b, 0x03418d50, 0x0376e77e, 0x007e666c, 0x0196999d, 0x00111e2e, 0x033ddd43, 0x035672a6, 0x0034f999}}, Y: Field{[10]uint32{0x02556dd9, 0x027eb8e9, 0x023f0735, 0x016f7441, 0x034e2e81, 0x008cfe0f, 0x01aca5d8, 0x031b0ead, 0x00aa20e5, 0x001dddbb}}}, + {X: Field{[10]uint32{0x01b87bba, 0x00b6ce19, 0x03c4af7b, 0x02129a3b, 0x02522a76, 0x0394958f, 0x00e76b5e, 0x015a2201, 0x01ef71d4, 0x003b7a5f}}, Y: Field{[10]uint32{0x01ae702f, 0x01eda4bf, 0x03513758, 0x023eddfa, 0x0285bafb, 0x01d62a03, 0x02279f95, 0x0049d982, 0x020f0c9c, 0x0024b9b4}}}, + {X: Field{[10]uint32{0x02e8c871, 0x0282e73a, 0x006ed025, 0x021091eb, 0x036ff84f, 0x00c4b9c0, 0x03db3ae2, 0x01213b3d, 0x0142e000, 0x000cd678}}, Y: Field{[10]uint32{0x021cdf66, 0x019be774, 0x0377f871, 0x0024db90, 0x00d00ada, 0x00e76fca, 0x00c98bf7, 0x017e87ce, 0x01f23c84, 0x0019ec0e}}}, + {X: Field{[10]uint32{0x022b44a1, 0x018b1f84, 0x0158f8fd, 0x02bb3c36, 0x0196f675, 0x00245295, 0x014a3dc4, 0x000bf499, 0x01720c05, 0x0038342a}}, Y: Field{[10]uint32{0x036b0312, 0x01ef51d5, 0x021718db, 0x00b46c47, 0x033ee29e, 0x03684640, 0x03d916ed, 0x0169faef, 0x01bc3457, 0x00032fac}}}, + {X: Field{[10]uint32{0x01a4c987, 0x01f7e108, 0x02605939, 0x00676368, 0x014f3320, 0x007d757b, 0x0031ac7a, 0x01dc1190, 0x03675df7, 0x00142e24}}, Y: Field{[10]uint32{0x0292f293, 0x013ccd74, 0x01204cb0, 0x014cf67b, 0x0045c382, 0x01b5bfc3, 0x009c3f25, 0x0327ae82, 0x0181063e, 0x00311d97}}}, + {X: Field{[10]uint32{0x016d446a, 0x0390cb73, 0x0111391c, 0x02f9073a, 0x037f80cb, 0x03e3a048, 0x01e84e99, 0x017fdbc8, 0x018e6677, 0x0017718b}}, Y: Field{[10]uint32{0x0373a9c2, 0x01bac505, 0x01de99ad, 0x02fc497d, 0x00b020ca, 0x0058ff57, 0x021cdabd, 0x011695db, 0x037de270, 0x0012d15a}}}, + {X: Field{[10]uint32{0x02c10971, 0x0353e588, 0x01b03fdc, 0x01f88bbf, 0x004e56ba, 0x0241c430, 0x0232e187, 0x00611749, 0x038fc792, 0x0022e85d}}, Y: Field{[10]uint32{0x023e3854, 0x031ebd8f, 0x00c53f48, 0x03a23d06, 0x0048ffeb, 0x025c1c9a, 0x01d7d435, 0x025962ce, 0x00ffa835, 0x0007cc7f}}}, + {X: Field{[10]uint32{0x00db9fc7, 0x03681b02, 0x0294be7a, 0x00aeea2d, 0x02999a10, 0x02fe6042, 0x03ad055f, 0x029eef9a, 0x02147d1e, 0x0028e851}}, Y: Field{[10]uint32{0x006ac294, 0x01fab0e2, 0x03d57a69, 0x01ec69c9, 0x00b3bdb8, 0x014c7ff3, 0x00cd6eb3, 0x004a108f, 0x0331d432, 0x0032609d}}}, + {X: Field{[10]uint32{0x00af78f5, 0x03470bf8, 0x0328621a, 0x03d93637, 0x01f6ce1a, 0x00d9a0b1, 0x01671c44, 0x00d2ab20, 0x0047bd20, 0x0025882a}}, Y: Field{[10]uint32{0x01826e1c, 0x03855553, 0x01f0d099, 0x0017a256, 0x016168a2, 0x0055af37, 0x007e32f4, 0x037ffb2d, 0x0108a7e3, 0x0038731b}}}, + {X: Field{[10]uint32{0x0396016b, 0x03663881, 0x016eebc9, 0x01f16126, 0x0395b2c5, 0x012363ff, 0x00b6a52c, 0x01a9e4fc, 0x02a0aa7d, 0x00290361}}, Y: Field{[10]uint32{0x02351ea2, 0x03365402, 0x0087396e, 0x02d117d1, 0x00062911, 0x009585f6, 0x014c15cb, 0x0119b6b6, 0x00e2d453, 0x003b1535}}}, + {X: Field{[10]uint32{0x03484c80, 0x0241de6c, 0x02fbd5ed, 0x03a6e993, 0x037e5f40, 0x01d1661b, 0x0173b979, 0x009a295d, 0x01a6f60f, 0x001c7bcd}}, Y: Field{[10]uint32{0x038a1ba3, 0x0058ded3, 0x01669875, 0x00f2f91d, 0x0302f369, 0x03d69ab5, 0x037df7f6, 0x01642b15, 0x021e9ff3, 0x003aaffe}}}, + {X: Field{[10]uint32{0x00f68de2, 0x031db5e9, 0x0267486f, 0x02fbc40f, 0x005308ab, 0x017dc256, 0x01ffa52c, 0x028ecb92, 0x0008c742, 0x002ef469}}, Y: Field{[10]uint32{0x01246124, 0x002d86d7, 0x0079a2ac, 0x00201428, 0x01ee6e1e, 0x01cca116, 0x00fbe96c, 0x0384f86c, 0x03ec9d07, 0x00125072}}}, + {X: Field{[10]uint32{0x00ba9009, 0x03c7e7a1, 0x012ab433, 0x03fe5613, 0x03805d60, 0x00b226d7, 0x009c92ff, 0x01b7d4f8, 0x03389211, 0x0005a7af}}, Y: Field{[10]uint32{0x03c6228d, 0x000d6641, 0x02a08345, 0x01247a4c, 0x02c997d1, 0x03c77923, 0x01b5adeb, 0x01fb8560, 0x0116e766, 0x002453d5}}}, + {X: Field{[10]uint32{0x00666acc, 0x01d40b3e, 0x020c3977, 0x02781313, 0x01d71c8d, 0x02436391, 0x00115458, 0x031fefab, 0x02bc4c5e, 0x0023c55e}}, Y: Field{[10]uint32{0x03f25908, 0x00604e0f, 0x021bc635, 0x0026260b, 0x02014dc7, 0x000af28f, 0x019883e6, 0x02a7ee62, 0x02ba1e78, 0x0035055d}}}, + {X: Field{[10]uint32{0x00ec9a8d, 0x03632d6d, 0x0010091e, 0x024e53ee, 0x0284f71f, 0x026801b6, 0x00ebcd83, 0x009b7001, 0x00d5694b, 0x002334ce}}, Y: Field{[10]uint32{0x00002578, 0x03b34874, 0x03d952a6, 0x00d30809, 0x0303fd9d, 0x015192ac, 0x000eccf4, 0x0366e702, 0x0010dd88, 0x00100c63}}}, + {X: Field{[10]uint32{0x013272f2, 0x003b8f8a, 0x02e28cbf, 0x030a5224, 0x03a64748, 0x012b5d83, 0x036171af, 0x02e8a834, 0x022f7ba5, 0x0008391f}}, Y: Field{[10]uint32{0x03be00bd, 0x00549519, 0x020a771b, 0x03e1db1c, 0x03162dda, 0x02279099, 0x00520897, 0x02608570, 0x022056b8, 0x002e5ab4}}}, + {X: Field{[10]uint32{0x032bb880, 0x032d7997, 0x015793f3, 0x031bfefc, 0x02f9c31e, 0x03d0477b, 0x02942d11, 0x023e736d, 0x00a5a0d3, 0x00160bb6}}, Y: Field{[10]uint32{0x03ce8486, 0x03d1e580, 0x02352a4c, 0x0248d29b, 0x02948ea8, 0x012ebd2f, 0x00a8db56, 0x0274f7b1, 0x000e4f9d, 0x000524a3}}}, + {X: Field{[10]uint32{0x001896d6, 0x03ac6d18, 0x01e7b877, 0x022db47d, 0x03b0bcab, 0x023011ba, 0x03daf30b, 0x030474fd, 0x019a6e76, 0x003d29bd}}, Y: Field{[10]uint32{0x0070f0c5, 0x0229922c, 0x01abeedc, 0x010792f6, 0x01ccde46, 0x026c5239, 0x01a05d4a, 0x01055956, 0x02e9e5d8, 0x000b4e71}}}, + {X: Field{[10]uint32{0x00957b24, 0x00a6bdcc, 0x0252d2c3, 0x02e31d8e, 0x02fc8564, 0x01588fc1, 0x0266bf01, 0x033d71db, 0x00600f71, 0x000aa083}}, Y: Field{[10]uint32{0x03ff3ca2, 0x0249919d, 0x02d370fd, 0x01f6e655, 0x0236f77f, 0x01401e34, 0x009a1d72, 0x0256679b, 0x0303d742, 0x002ce301}}}, + {X: Field{[10]uint32{0x02e2799e, 0x00612281, 0x03872623, 0x00ef075f, 0x0133634d, 0x001de8ea, 0x01d48026, 0x02fd921c, 0x004e9fcc, 0x00230b67}}, Y: Field{[10]uint32{0x01351a7d, 0x0152162a, 0x02db8d59, 0x01dd8130, 0x03cf032d, 0x02026169, 0x009c534e, 0x02edb631, 0x036cae43, 0x002b5404}}}, + {X: Field{[10]uint32{0x00061ba9, 0x003466dd, 0x004906eb, 0x017eb7f1, 0x03db00d2, 0x00e49d64, 0x00b991e2, 0x02cfb434, 0x00530744, 0x002c63a4}}, Y: Field{[10]uint32{0x033877b6, 0x03faa4ac, 0x002a702f, 0x02e1108c, 0x0343a8aa, 0x02600d34, 0x01edd739, 0x02cb19dc, 0x0244c829, 0x00243d72}}}, + {X: Field{[10]uint32{0x00e835be, 0x01e37347, 0x00109330, 0x01f3d2b1, 0x01d12482, 0x0314efe8, 0x01d2f58c, 0x010d6e41, 0x0157b03d, 0x00033c74}}, Y: Field{[10]uint32{0x0271b459, 0x01b65672, 0x031ab119, 0x037d87ba, 0x003ea656, 0x01147359, 0x0303cf21, 0x031f5a83, 0x01a15547, 0x003b8dea}}}, + {X: Field{[10]uint32{0x014a6007, 0x0358fdf9, 0x004c1562, 0x0347c8be, 0x0192fc13, 0x01bd2f39, 0x021ac36a, 0x02103ecb, 0x018ad91a, 0x002362e7}}, Y: Field{[10]uint32{0x03842dba, 0x006d1ac2, 0x02ee1ce6, 0x03851f39, 0x01ee9227, 0x00e6af7b, 0x020ec3b4, 0x023cb76b, 0x024393ca, 0x00254a2f}}}, + {X: Field{[10]uint32{0x0087fc9d, 0x006d18ff, 0x0106f256, 0x02387569, 0x037ae04a, 0x00366932, 0x02c936fb, 0x02c355c5, 0x0144bbc5, 0x001812d5}}, Y: Field{[10]uint32{0x016ac8eb, 0x00649528, 0x01d8a3e3, 0x01bc41a8, 0x03ee3cde, 0x034f67b6, 0x001e5fe7, 0x029b9d07, 0x039c4fb9, 0x000cff8b}}}, + {X: Field{[10]uint32{0x03aed8f6, 0x030245be, 0x03e5309e, 0x0191e567, 0x02cbd16d, 0x02785328, 0x017aab74, 0x03b91181, 0x00141058, 0x000f9fb5}}, Y: Field{[10]uint32{0x012e79fc, 0x00915a25, 0x006481ba, 0x01860bc6, 0x01f66bd3, 0x00280574, 0x01aa6971, 0x031b8324, 0x024186de, 0x003f056c}}}, + {X: Field{[10]uint32{0x0143f326, 0x034149de, 0x00f26736, 0x01a531a7, 0x0126e46f, 0x01b3d0b0, 0x01242431, 0x01ee2b25, 0x003586c1, 0x00342b9d}}, Y: Field{[10]uint32{0x034e0757, 0x007386fd, 0x0304b197, 0x00fa2ed7, 0x00fbaca0, 0x02fdada7, 0x0398865a, 0x01622b50, 0x01e8b983, 0x002fe80b}}}, + {X: Field{[10]uint32{0x00be1441, 0x0147ae62, 0x0197f5f8, 0x01967781, 0x023627bc, 0x014e02b7, 0x02ce2f94, 0x010f8df9, 0x01ced4f3, 0x003bd701}}, Y: Field{[10]uint32{0x00103281, 0x0031865d, 0x036350d6, 0x030ab527, 0x01b681e7, 0x012ba388, 0x010e40b7, 0x03c678ef, 0x001b0379, 0x0036499f}}}, + {X: Field{[10]uint32{0x008f49ae, 0x01921917, 0x038ca8dc, 0x01971efc, 0x03d7cf42, 0x02c2766b, 0x033015c3, 0x022b65f1, 0x03ebd799, 0x0005dae3}}, Y: Field{[10]uint32{0x0122f1b4, 0x0086fce1, 0x034c5fc8, 0x017a8053, 0x017f989f, 0x019db1e0, 0x00da1905, 0x03268da7, 0x024c8267, 0x002d2f2f}}}, + {X: Field{[10]uint32{0x0116c3dd, 0x00e9d9af, 0x03a0097b, 0x0374d50b, 0x03b20771, 0x02db698b, 0x0358d69f, 0x03053bae, 0x03db0cff, 0x00223da0}}, Y: Field{[10]uint32{0x011cb601, 0x03fdc607, 0x02219f52, 0x025aca5c, 0x020cf800, 0x0094add3, 0x02797ca0, 0x000f1499, 0x03de8121, 0x0002efbc}}}, + {X: Field{[10]uint32{0x0237abaa, 0x03f88e3d, 0x00854dd1, 0x0208c7ee, 0x018488b0, 0x00f59e24, 0x00c4121c, 0x03b113f6, 0x038f1247, 0x00299750}}, Y: Field{[10]uint32{0x023f36a3, 0x012a0be6, 0x00986d4d, 0x0257743f, 0x034bb500, 0x0131dc6b, 0x01cf3c0b, 0x010cff7f, 0x004e551e, 0x0017d972}}}, + {X: Field{[10]uint32{0x0398cc27, 0x0169a818, 0x03d2ff6a, 0x02e40a20, 0x02d5cdda, 0x03c565f1, 0x0208148a, 0x022edfdf, 0x0251c502, 0x002f5a9f}}, Y: Field{[10]uint32{0x0059d885, 0x02dc3d9e, 0x02f662dd, 0x01369dbb, 0x030c1ed1, 0x026a63a4, 0x0397979b, 0x03748ba2, 0x00c4247c, 0x000fc8a0}}}, + {X: Field{[10]uint32{0x009d274b, 0x00468264, 0x02202344, 0x02b1d34d, 0x0158f7a3, 0x01440514, 0x031814ec, 0x02837152, 0x036c2896, 0x00299c90}}, Y: Field{[10]uint32{0x03c2ec3f, 0x03f3b3af, 0x02654a7a, 0x02765590, 0x02c81f3d, 0x02b6b795, 0x02acea6b, 0x01e3656e, 0x02934681, 0x0037ba00}}}, + {X: Field{[10]uint32{0x003a24b0, 0x0380de7c, 0x004bc8d9, 0x02a4c844, 0x0257891b, 0x01f4b6a9, 0x01b0993d, 0x03433c6b, 0x01fed3a1, 0x003283d5}}, Y: Field{[10]uint32{0x023cfa6f, 0x010f9bd6, 0x0399db58, 0x020e59c4, 0x03520166, 0x02f2a363, 0x0188baae, 0x00b73645, 0x00e46346, 0x0037006e}}}, + {X: Field{[10]uint32{0x036429a1, 0x03c2d712, 0x034ccb91, 0x029fa831, 0x02211843, 0x02cbf881, 0x004961cc, 0x00087815, 0x008d9bff, 0x001843fc}}, Y: Field{[10]uint32{0x01d46b28, 0x01d82fb4, 0x020dd9b0, 0x00d8d7c5, 0x02d889bc, 0x03f34f84, 0x03daee68, 0x017e9f6a, 0x018aee96, 0x0012f8ec}}}, + {X: Field{[10]uint32{0x01ff42ae, 0x03318e2a, 0x0162238f, 0x032588b7, 0x026b695d, 0x037e3c28, 0x00f006cd, 0x03b32de3, 0x0215a70a, 0x000b5be0}}, Y: Field{[10]uint32{0x01a3927b, 0x011521e5, 0x010fd3ff, 0x005491b1, 0x037a9887, 0x03543ccd, 0x01e4e5be, 0x0325a798, 0x0164e2a3, 0x0000ff02}}}, + {X: Field{[10]uint32{0x00a1bbbb, 0x00318c22, 0x004ea70b, 0x009a90bf, 0x02998468, 0x0386826b, 0x010b132d, 0x00e716d8, 0x01b4868e, 0x002303a6}}, Y: Field{[10]uint32{0x001cfe52, 0x01314d85, 0x01a95c38, 0x00b821e1, 0x036ead99, 0x0186e305, 0x036a41de, 0x01032ca1, 0x0242f0a2, 0x000cae32}}}, + {X: Field{[10]uint32{0x03c96ed7, 0x0327ac23, 0x007e4dba, 0x007596be, 0x03658c6d, 0x013bdb5d, 0x0062af77, 0x02b9d78c, 0x028f9000, 0x00054a2e}}, Y: Field{[10]uint32{0x013b5651, 0x03b29914, 0x0253a5fa, 0x03571cc6, 0x012d39f0, 0x01d4ea2f, 0x00e64665, 0x01af3475, 0x038d54df, 0x002a3749}}}, + {X: Field{[10]uint32{0x03f1d7a4, 0x027bde9b, 0x037d2fa0, 0x02feb16b, 0x00104394, 0x02545616, 0x03a040e2, 0x01a9ebc4, 0x02a5d925, 0x0030519b}}, Y: Field{[10]uint32{0x01be5128, 0x0115ec9d, 0x00a7bc05, 0x02db8414, 0x00d8bab3, 0x01800f7c, 0x0284b540, 0x0361e7c1, 0x02c6fb36, 0x0032adbf}}}, + {X: Field{[10]uint32{0x03e98cb4, 0x004604b4, 0x02b56c6f, 0x02ea1e9d, 0x022ea946, 0x03e430fc, 0x0297a87c, 0x002274a8, 0x0093e051, 0x0033a2ec}}, Y: Field{[10]uint32{0x003a0470, 0x014ba578, 0x028884c2, 0x02b642c3, 0x00679cbc, 0x0344eeab, 0x03f556fb, 0x0213f9b7, 0x0251b906, 0x002a36ee}}}, + {X: Field{[10]uint32{0x02d6c86d, 0x01960b81, 0x016ea918, 0x018e85ea, 0x027c4267, 0x0024aa53, 0x030ddd9b, 0x02785634, 0x02737c9d, 0x0001dbce}}, Y: Field{[10]uint32{0x01d16c8a, 0x00a808b9, 0x00443b20, 0x00081f90, 0x01b29c53, 0x01b38fc1, 0x00ad27ec, 0x0179b1de, 0x007c4f34, 0x0016c728}}}, + {X: Field{[10]uint32{0x0274017f, 0x015cb542, 0x001adee1, 0x03fabdda, 0x032ed997, 0x0375f50e, 0x03988725, 0x002c84ee, 0x03c32339, 0x003dd5f7}}, Y: Field{[10]uint32{0x01b83cf8, 0x034912e9, 0x016be461, 0x019f2869, 0x0374ec4f, 0x023ace55, 0x00b63d98, 0x025c99c0, 0x00ea6787, 0x00342d39}}}, + {X: Field{[10]uint32{0x02d5f5d0, 0x00aa1ee7, 0x0065c149, 0x01a43647, 0x03f27a57, 0x036f8f19, 0x000ec6d3, 0x02bbf7c2, 0x0198a2de, 0x00166fd8}}, Y: Field{[10]uint32{0x0010f8b2, 0x00f5c3e1, 0x029b3a2f, 0x03b58054, 0x016e02f2, 0x03519e15, 0x010834c4, 0x028a08c4, 0x03399011, 0x002fd7ad}}}, + {X: Field{[10]uint32{0x0149ba16, 0x02020b81, 0x0052d53f, 0x0173c4b3, 0x02a7b0e8, 0x02463056, 0x02857900, 0x021d5d21, 0x030ac86d, 0x002c740b}}, Y: Field{[10]uint32{0x031a19d0, 0x00dff095, 0x0106b854, 0x00965b4f, 0x03972977, 0x00fce14a, 0x000878d6, 0x01adda2a, 0x02039992, 0x0001e497}}}, + {X: Field{[10]uint32{0x001d1905, 0x0393900e, 0x02908882, 0x03bc53ce, 0x027e5267, 0x01f10610, 0x03d2ec12, 0x0381f406, 0x032f41d8, 0x003349cd}}, Y: Field{[10]uint32{0x01c77297, 0x02bc3257, 0x003522ac, 0x005d4826, 0x02c33296, 0x01045a4e, 0x03810f3b, 0x027ccf33, 0x0203661b, 0x003338db}}}, + {X: Field{[10]uint32{0x019d3ace, 0x036d26f7, 0x01695b01, 0x033eef20, 0x03ad2258, 0x032eaad3, 0x028940f5, 0x00d664ed, 0x00fc26ca, 0x00044991}}, Y: Field{[10]uint32{0x01c0bf60, 0x01341245, 0x01b904e7, 0x00acefa7, 0x037ff136, 0x03b7c274, 0x03a49b3b, 0x02e57cbd, 0x03907b5a, 0x0021a17d}}}, + {X: Field{[10]uint32{0x0197d3ce, 0x001b8b03, 0x018bb3a6, 0x03abae12, 0x0192fb51, 0x00d68936, 0x02845759, 0x01285883, 0x032a99ce, 0x0024637d}}, Y: Field{[10]uint32{0x038a8461, 0x0333faee, 0x03065602, 0x00609d26, 0x01bb6b79, 0x0241e533, 0x038b0d3c, 0x03fe63c6, 0x01ec9ebb, 0x00222cce}}}, + {X: Field{[10]uint32{0x00dcb83b, 0x02b3eaff, 0x01af2a7d, 0x0093cd28, 0x00436e64, 0x035229dc, 0x0025b510, 0x03ff2025, 0x00f265c4, 0x0026e3c6}}, Y: Field{[10]uint32{0x0185ba55, 0x0152a6b5, 0x012475e4, 0x03e4fd8f, 0x01476c4a, 0x0318a04e, 0x02e8c78f, 0x0306e4b0, 0x01e86a34, 0x0002fee5}}}, + {X: Field{[10]uint32{0x0024ce30, 0x031e3fef, 0x0340c9b9, 0x002b62cc, 0x00382174, 0x03a87639, 0x02be52a1, 0x0189a90a, 0x032ac396, 0x0002b40b}}, Y: Field{[10]uint32{0x022885fb, 0x030b41c6, 0x01b13255, 0x03978953, 0x03ad8c97, 0x02deede9, 0x0027cfe1, 0x01e1cbfe, 0x00e6cf8a, 0x003f31ce}}}, + {X: Field{[10]uint32{0x026d85a3, 0x03ee6b76, 0x0076c84b, 0x00a23d51, 0x029b5c19, 0x016b3c49, 0x02e34f3f, 0x036b2423, 0x03bd5e60, 0x0000d66b}}, Y: Field{[10]uint32{0x03088955, 0x0055e7ec, 0x030f6b50, 0x00da8608, 0x03443586, 0x024cb385, 0x02721553, 0x03fb59c4, 0x01e79cd3, 0x000b8aa8}}}, + {X: Field{[10]uint32{0x00b279de, 0x0024459a, 0x033ca55e, 0x03008187, 0x030c3c15, 0x0335b1e3, 0x00c34a31, 0x00bc7384, 0x023e230f, 0x00158e6a}}, Y: Field{[10]uint32{0x0111bef1, 0x01b0bb2d, 0x0309c8ed, 0x006c1189, 0x02e3a7d5, 0x02a7a0f8, 0x023bc263, 0x01fc2cfe, 0x015c15de, 0x00382dba}}}, + {X: Field{[10]uint32{0x0269ec44, 0x015d94b5, 0x00e4ad86, 0x01b2b50b, 0x03693d3b, 0x0097bf0a, 0x00ef3d0c, 0x02567617, 0x03cc7b2f, 0x000c273f}}, Y: Field{[10]uint32{0x0150077d, 0x02596dea, 0x0274bcf7, 0x0299e664, 0x0232f949, 0x01487548, 0x00095205, 0x02c6f9e6, 0x022fd917, 0x0000eaed}}}, + {X: Field{[10]uint32{0x033b86b2, 0x006bdb94, 0x033cace9, 0x01a922af, 0x00534a02, 0x01d7244c, 0x018eab63, 0x035f0017, 0x01d2dac1, 0x00147cf5}}, Y: Field{[10]uint32{0x03e99f74, 0x0262a3e8, 0x0235aba9, 0x00aab410, 0x0234f9cf, 0x02816f76, 0x03fbfe0c, 0x0123b67c, 0x027f4bdc, 0x000142c7}}}, + {X: Field{[10]uint32{0x01c2a244, 0x03897b8a, 0x00e1fa3f, 0x03d22cf9, 0x034158b0, 0x014074c9, 0x000e0c6f, 0x01040115, 0x011833aa, 0x0023d58f}}, Y: Field{[10]uint32{0x03432193, 0x01d64a19, 0x03589028, 0x024f0600, 0x033d031d, 0x0004a263, 0x035248da, 0x00cdc55f, 0x01d85ea9, 0x0013531c}}}, + {X: Field{[10]uint32{0x037177a9, 0x031cb229, 0x01108ee7, 0x0303b867, 0x003c4853, 0x02c25ab0, 0x0045b39f, 0x036ae72f, 0x0109d68f, 0x000db28a}}, Y: Field{[10]uint32{0x024301b0, 0x00588234, 0x02ed6905, 0x018cc384, 0x0269cbf3, 0x00519e97, 0x033d0953, 0x00a58217, 0x01dfc825, 0x00193d44}}}, + {X: Field{[10]uint32{0x02a306e0, 0x00d1c0a3, 0x00cf3807, 0x023ad35c, 0x0358dd91, 0x036c9bc3, 0x001ca9c2, 0x03f5f308, 0x00d51f3f, 0x003d8a2e}}, Y: Field{[10]uint32{0x00adc2e8, 0x00d82ef6, 0x01c1ea2d, 0x01f798ca, 0x03b7c2d7, 0x03d55f7b, 0x00d6eb27, 0x00ba6cba, 0x00e30ea8, 0x0002f5af}}}, + {X: Field{[10]uint32{0x00e67c1b, 0x010454b0, 0x02f2586e, 0x035d8400, 0x00b44fa7, 0x0340d435, 0x026922c9, 0x00b02eca, 0x03f500a8, 0x003ede9a}}, Y: Field{[10]uint32{0x02702da1, 0x017af252, 0x02cfb034, 0x00cc8e86, 0x018419fc, 0x03fa3cfa, 0x01f1406e, 0x031c0c00, 0x0037f1c9, 0x00304a87}}}, + {X: Field{[10]uint32{0x0278d092, 0x0247ef3f, 0x03033753, 0x00769696, 0x01bf8ec0, 0x0003231d, 0x014080f4, 0x00abcb7c, 0x01195c3e, 0x00308246}}, Y: Field{[10]uint32{0x031adeb9, 0x01ad8c83, 0x01e6c382, 0x0063a203, 0x037aec38, 0x02d9b0c9, 0x007b1fa3, 0x036acfbe, 0x016fcbeb, 0x002cc1ed}}}, + {X: Field{[10]uint32{0x013192d1, 0x02ff8a2f, 0x0003e8d1, 0x03e3466f, 0x0073c3be, 0x00ddd292, 0x02d7c4c9, 0x009fea81, 0x03893d17, 0x001d89f7}}, Y: Field{[10]uint32{0x028451e1, 0x01c9ac6d, 0x026f4bcf, 0x033fdb4d, 0x021326da, 0x001ddb14, 0x029a865f, 0x0157dea8, 0x036c36f4, 0x000d7499}}}, + {X: Field{[10]uint32{0x002c62b9, 0x012ca580, 0x01639ed5, 0x01cf2c16, 0x01a3df6f, 0x036ff80d, 0x025df658, 0x00cea5b4, 0x01187c9f, 0x00099999}}, Y: Field{[10]uint32{0x0286630d, 0x00096931, 0x037ba468, 0x02bbd2a5, 0x02c4e7fc, 0x00d5aa1d, 0x01fe7578, 0x01789a94, 0x03c7d34a, 0x002ecc2e}}}, + {X: Field{[10]uint32{0x022ac683, 0x02fce931, 0x037bbc7a, 0x017dcd60, 0x01ef8b12, 0x03ca9bdc, 0x006a02e8, 0x000b9df7, 0x0185fa98, 0x000ef6a4}}, Y: Field{[10]uint32{0x00a05b85, 0x00b95300, 0x02118936, 0x0172ec32, 0x0222b347, 0x002b8e1d, 0x0075a76a, 0x005e135e, 0x032bc11d, 0x00080bb7}}}, + {X: Field{[10]uint32{0x003a5c4d, 0x00cf5ae6, 0x00097bc0, 0x022dfd49, 0x023be197, 0x0215c348, 0x0313c714, 0x02d93604, 0x00de4486, 0x000be42f}}, Y: Field{[10]uint32{0x00384f89, 0x03f69c6f, 0x01705270, 0x027b3d5e, 0x01f4aa75, 0x0332a677, 0x01b2e300, 0x0351d4d9, 0x02502028, 0x0018e193}}}, + {X: Field{[10]uint32{0x00becda7, 0x02f3ef32, 0x01cb6562, 0x0309b1c7, 0x017083ed, 0x0327f35c, 0x0192e654, 0x0039bf72, 0x01d4e9b0, 0x002224fd}}, Y: Field{[10]uint32{0x0238ab50, 0x00c4ed2c, 0x003130fe, 0x0275b36e, 0x02a80fa2, 0x03831a65, 0x03566a1f, 0x0041d3ef, 0x00558e63, 0x0007ebcc}}}, + {X: Field{[10]uint32{0x0155abba, 0x030d2561, 0x0237d855, 0x0094c273, 0x00f482fc, 0x0369cd44, 0x024fac54, 0x01778fb6, 0x02e686be, 0x002b3f12}}, Y: Field{[10]uint32{0x02c52d87, 0x01c5a14a, 0x0037cb90, 0x01f3e6f4, 0x0176423f, 0x03b0a47f, 0x03a5b998, 0x0229ab4d, 0x0197d187, 0x000e1fd1}}}, + {X: Field{[10]uint32{0x0017a469, 0x00a95788, 0x020d9542, 0x039f5d19, 0x01d5fe35, 0x00a2948a, 0x03a892dd, 0x03a620bc, 0x0090a4c5, 0x000ab134}}, Y: Field{[10]uint32{0x03086c09, 0x03095c77, 0x01914a3b, 0x00afdd68, 0x01927d17, 0x03639a1a, 0x0279f2d7, 0x03b1151e, 0x01162aa3, 0x0018163d}}}, + {X: Field{[10]uint32{0x02badef6, 0x03d6139f, 0x0024e9c9, 0x03b09430, 0x02c9b1a3, 0x004f1f98, 0x03c235cd, 0x0315cb96, 0x013ffc13, 0x00004dfb}}, Y: Field{[10]uint32{0x02c6fdba, 0x0214daa3, 0x00bf54fb, 0x030bcdeb, 0x010319e7, 0x0321d63c, 0x003ff023, 0x013d442d, 0x01cc3a46, 0x000307a5}}}, + {X: Field{[10]uint32{0x033ecfe4, 0x013615fb, 0x02002cfe, 0x03dd63c2, 0x006cfb16, 0x00454ae5, 0x009f6068, 0x0228f4b2, 0x037a7214, 0x0000a280}}, Y: Field{[10]uint32{0x03973d10, 0x02ce613e, 0x03aa8a1b, 0x0093ea40, 0x02ec5951, 0x031b9e8e, 0x03788cf5, 0x037a6e34, 0x0250135c, 0x002cbd2d}}}, + {X: Field{[10]uint32{0x027a9eeb, 0x02b773c6, 0x000ae3bb, 0x016d7cd3, 0x0378ad6d, 0x01d869db, 0x01d426e8, 0x00cfef3a, 0x01518fd4, 0x000c0fb3}}, Y: Field{[10]uint32{0x01abb602, 0x0158ce66, 0x01385ea9, 0x00fa2761, 0x02cbd8dc, 0x009d72c6, 0x03a5945a, 0x02c67a59, 0x02443b73, 0x001a9ff2}}}, + {X: Field{[10]uint32{0x01533202, 0x008ce054, 0x0140a509, 0x01e7e2cc, 0x02c69cf0, 0x03595a6e, 0x001defd9, 0x03dc7099, 0x002e5680, 0x0033d8c1}}, Y: Field{[10]uint32{0x00eb4ee8, 0x03cd007b, 0x009b6b8f, 0x00ebd437, 0x00017664, 0x0386a90a, 0x01a20525, 0x03f715c6, 0x036dfb17, 0x000e7ccd}}}, + {X: Field{[10]uint32{0x031fe4b7, 0x01216a86, 0x0168c44f, 0x02a38b76, 0x0334a229, 0x0395b124, 0x0123b6f2, 0x027eda5a, 0x03efb4a4, 0x0033ebee}}, Y: Field{[10]uint32{0x029f9007, 0x034971b1, 0x02a160b5, 0x0260063e, 0x01f39506, 0x0075dbdc, 0x03afbc70, 0x005f8777, 0x034d4a9c, 0x003703b4}}}, + {X: Field{[10]uint32{0x010d363e, 0x034bcc4e, 0x0153d785, 0x01da6822, 0x004a7ffd, 0x00f1aa90, 0x0093ff7b, 0x009fa9a9, 0x01e10fd5, 0x003b038f}}, Y: Field{[10]uint32{0x027a35dd, 0x030a17e3, 0x03528fc5, 0x0303fcd4, 0x01723129, 0x005fd4f3, 0x02f3c6a7, 0x00d30420, 0x03ce3002, 0x00252f76}}}, + {X: Field{[10]uint32{0x032bcde0, 0x038a9012, 0x02f7f84b, 0x0213bac0, 0x0113e9cd, 0x000645af, 0x039c0c35, 0x008b3f52, 0x00d19144, 0x003c1f4f}}, Y: Field{[10]uint32{0x01637320, 0x007ddece, 0x018103aa, 0x001a2b8b, 0x01dfe912, 0x01b47dc1, 0x0048de51, 0x00c860df, 0x02facb39, 0x0033c325}}}, + {X: Field{[10]uint32{0x0248db10, 0x01c267cd, 0x003e2821, 0x01f799d9, 0x038a6fab, 0x00031e98, 0x0264ac0a, 0x00813a8c, 0x00b66f2e, 0x00129095}}, Y: Field{[10]uint32{0x02e5023a, 0x02acaf0b, 0x0157ac26, 0x0022eb2c, 0x01b187ab, 0x017df7e5, 0x03ef9891, 0x03f0d7be, 0x0229be93, 0x002d5443}}}, + {X: Field{[10]uint32{0x007774a8, 0x0204fa3a, 0x001d9b5d, 0x02c0e017, 0x01910285, 0x03d9c651, 0x02625829, 0x02bc74d7, 0x03cfb38e, 0x00015bce}}, Y: Field{[10]uint32{0x01ed9dc6, 0x029e9d74, 0x026bac57, 0x01c219df, 0x038a1e82, 0x0051fddc, 0x03f3e5ca, 0x01fe6a6a, 0x00e79e6b, 0x002a6e59}}}, + {X: Field{[10]uint32{0x03081295, 0x01586f9a, 0x03561ace, 0x021947f9, 0x01af6b98, 0x03aa9327, 0x02d95bff, 0x00bbf030, 0x034e07d3, 0x003e2763}}, Y: Field{[10]uint32{0x01bacc69, 0x03b1c663, 0x030d1449, 0x0145235d, 0x0075e48f, 0x01c61a65, 0x02656911, 0x00e19d8e, 0x031156a3, 0x003298cb}}}, + {X: Field{[10]uint32{0x03c5530b, 0x03948149, 0x02af9758, 0x00cf1b66, 0x032890b9, 0x007c3a4a, 0x02e4a075, 0x005bad42, 0x01a0d3e7, 0x00170de4}}, Y: Field{[10]uint32{0x03b34616, 0x03e2eae9, 0x021c3ca1, 0x0070cdab, 0x02c4ed86, 0x0244d24e, 0x01e30dae, 0x00b4445e, 0x03c62de5, 0x00113bc4}}}, + {X: Field{[10]uint32{0x03a38d27, 0x02804caa, 0x0233115f, 0x03c34e8f, 0x038ab94e, 0x01b3bab6, 0x00d71561, 0x0292b98b, 0x025ae6ba, 0x0009d21d}}, Y: Field{[10]uint32{0x03f69e48, 0x013c7c9d, 0x033590cd, 0x00cea4ec, 0x020f36b3, 0x031eba4a, 0x0105bbe6, 0x01dc3582, 0x019dde63, 0x001c7534}}}, + {X: Field{[10]uint32{0x0327e254, 0x00d8efae, 0x0145322e, 0x028116a5, 0x000d2c41, 0x01fb8f9e, 0x00e4ee18, 0x035de00b, 0x03a2f8ec, 0x002593c7}}, Y: Field{[10]uint32{0x00138a2e, 0x01598435, 0x022e6775, 0x0000ee60, 0x015137ae, 0x00b33988, 0x0081a5fa, 0x02a20fa5, 0x03cade64, 0x0031d12e}}}, + {X: Field{[10]uint32{0x01b8ca3b, 0x0217895e, 0x02754589, 0x001d3df4, 0x03ee758a, 0x01b0de7f, 0x003594fe, 0x0327ea14, 0x03758709, 0x0022fd81}}, Y: Field{[10]uint32{0x03dd51a4, 0x03986221, 0x03715a5a, 0x03b9c629, 0x02ccc193, 0x02c46343, 0x011cfb8f, 0x0375cbfd, 0x0192b3fb, 0x000f98e2}}}, + {X: Field{[10]uint32{0x02e06612, 0x008e3740, 0x015f5a10, 0x03603b83, 0x00fbff70, 0x036fb9e6, 0x03c5a95d, 0x008e70af, 0x01239189, 0x003e841c}}, Y: Field{[10]uint32{0x0168e7f1, 0x01311a3e, 0x03936c62, 0x0384b5dc, 0x02315a6b, 0x00757b07, 0x0133ea97, 0x02c29664, 0x015e1a4e, 0x00029833}}}, + {X: Field{[10]uint32{0x00975588, 0x00d39451, 0x0059383c, 0x00f2a251, 0x033fe250, 0x01e5f2e2, 0x03d145ef, 0x025ffb00, 0x02d09f6f, 0x0016d231}}, Y: Field{[10]uint32{0x006e30a0, 0x00428ea4, 0x03d83c64, 0x0114a01d, 0x02173d6c, 0x02597c4d, 0x0291762d, 0x0046f304, 0x02893526, 0x00113619}}}, + {X: Field{[10]uint32{0x02b94fd0, 0x03c6f2bb, 0x025b1ae8, 0x013552f2, 0x005d4e85, 0x0397a232, 0x025d1ea1, 0x01f8fca1, 0x03e823aa, 0x00203854}}, Y: Field{[10]uint32{0x006b9728, 0x01eb2ea8, 0x023f73ed, 0x00b01c60, 0x03c888a1, 0x03d3d904, 0x03a92d8e, 0x03046c04, 0x0229e435, 0x003b74ff}}}, + {X: Field{[10]uint32{0x01ccf2c4, 0x03b5b41e, 0x03e3dae7, 0x027c1ec7, 0x03cd25de, 0x0131b8a6, 0x0190dd15, 0x01d49b09, 0x01d977bf, 0x0005b889}}, Y: Field{[10]uint32{0x01710768, 0x00622b02, 0x0274dd85, 0x014b83e8, 0x0340088c, 0x033708ad, 0x02db82af, 0x01d551b4, 0x0123b9b5, 0x00381c0b}}}, + {X: Field{[10]uint32{0x01456938, 0x0247bf36, 0x013ce7a6, 0x028b78d6, 0x03bb064a, 0x02097af2, 0x021b65e7, 0x01b1d208, 0x020915a1, 0x0028d102}}, Y: Field{[10]uint32{0x00dbf40c, 0x01c24135, 0x0226bbe9, 0x00f79f0f, 0x0326fa5d, 0x03d0de99, 0x001323a7, 0x00aa3d59, 0x02a03a58, 0x003fdf1e}}}, + {X: Field{[10]uint32{0x01aa2b5f, 0x00c3a7b3, 0x037c80a0, 0x000e4fac, 0x018d6072, 0x00b564e1, 0x0320401f, 0x0111a008, 0x034cd116, 0x0020550c}}, Y: Field{[10]uint32{0x033d5142, 0x004e7196, 0x03d54150, 0x0361f55c, 0x0017126a, 0x02824522, 0x030676f4, 0x03939ec3, 0x014e5f97, 0x002ee902}}}, + {X: Field{[10]uint32{0x014d93c7, 0x039a96df, 0x01efa329, 0x0184f86d, 0x02fe7f23, 0x0138265d, 0x0092b257, 0x02eb28e8, 0x00ca27b5, 0x003244d2}}, Y: Field{[10]uint32{0x0176b44a, 0x0079cf16, 0x036399d6, 0x02550257, 0x01e7c372, 0x0006fed6, 0x020e62dc, 0x0268b141, 0x010de9d4, 0x00338907}}}, + {X: Field{[10]uint32{0x026e8a88, 0x0096435f, 0x024363ba, 0x0101cdf9, 0x01cf3629, 0x0272a592, 0x0235e995, 0x02b5319d, 0x01a879fe, 0x0025022d}}, Y: Field{[10]uint32{0x03994fc0, 0x005d915f, 0x00fdfcbf, 0x034a12e0, 0x00e02155, 0x007d1825, 0x02858d52, 0x004306fc, 0x010a26c7, 0x003842d0}}}, + {X: Field{[10]uint32{0x02bdd2ce, 0x00f9f975, 0x01b92e7d, 0x02436408, 0x02f80ddf, 0x02160aab, 0x020a159f, 0x0122e1e7, 0x0158eefe, 0x002e1474}}, Y: Field{[10]uint32{0x02d85469, 0x02f6a8b1, 0x0293f06a, 0x036394dd, 0x0060facf, 0x0271f560, 0x00c53f06, 0x00908707, 0x02e10079, 0x000a42b8}}}, + {X: Field{[10]uint32{0x013d10fc, 0x01c79ab9, 0x005eb1b9, 0x02e15368, 0x0387e7a5, 0x0394d824, 0x00053875, 0x00801d96, 0x034d4a7c, 0x00274c82}}, Y: Field{[10]uint32{0x01d7c456, 0x000fd1c9, 0x0306e796, 0x018729a0, 0x009b44be, 0x039e0ec3, 0x022acd0a, 0x006435a0, 0x037b6a1f, 0x0013dab2}}}, + {X: Field{[10]uint32{0x018ac7b5, 0x002a7a0d, 0x004c22f3, 0x0053401d, 0x01eaa491, 0x004e9362, 0x0386799d, 0x03b1953f, 0x00107b29, 0x001b5de6}}, Y: Field{[10]uint32{0x03823950, 0x028f9e76, 0x038804b0, 0x00d00ee8, 0x0177b2a3, 0x03899731, 0x0060a2ac, 0x013c26e8, 0x03cc105c, 0x0023de64}}}, + {X: Field{[10]uint32{0x017f6489, 0x02476a79, 0x0372d73c, 0x001cb209, 0x00680c96, 0x02015b4a, 0x017d62db, 0x013eda68, 0x02ce77e1, 0x002f6cb4}}, Y: Field{[10]uint32{0x03aa590d, 0x02790b96, 0x030c184c, 0x00000f0a, 0x0008a3bc, 0x029bd592, 0x038ecede, 0x00ec6773, 0x0371d43c, 0x0002707b}}}, + {X: Field{[10]uint32{0x0055b3fa, 0x03ff68fc, 0x02dea741, 0x02a34286, 0x001f7897, 0x01ceec16, 0x01b4787f, 0x002a5293, 0x00ff1ab7, 0x00126a33}}, Y: Field{[10]uint32{0x006ba426, 0x024a0a9b, 0x0243d8bd, 0x0053f5b7, 0x0115b419, 0x03814eb5, 0x02414ed6, 0x03af47b8, 0x02772049, 0x003ca634}}}, + {X: Field{[10]uint32{0x029d2236, 0x0285ce9d, 0x000d77f1, 0x014ad441, 0x013b3d56, 0x00c5e80b, 0x0267992d, 0x02dec158, 0x016eb466, 0x00328fdf}}, Y: Field{[10]uint32{0x02145c37, 0x036ec4a3, 0x021b7126, 0x02b7dbc6, 0x0090e538, 0x025a90b0, 0x00e6f2bf, 0x00e13bde, 0x02259dcf, 0x00289b58}}}, + {X: Field{[10]uint32{0x037176e4, 0x03a98c1c, 0x0065bc00, 0x02b699af, 0x01902e9c, 0x003422e6, 0x038469cb, 0x009f46d1, 0x0214f1c4, 0x002d9cb3}}, Y: Field{[10]uint32{0x00865efa, 0x022fdd9a, 0x03eddb81, 0x0142e312, 0x0083f4f5, 0x00f1695b, 0x020f1aff, 0x0145d89e, 0x01790001, 0x0005db02}}}, + {X: Field{[10]uint32{0x029c199b, 0x03244ebb, 0x0168bda3, 0x01e23cba, 0x022c26dd, 0x010dde2a, 0x01b6866f, 0x01886f5b, 0x0357d4ad, 0x002f72ea}}, Y: Field{[10]uint32{0x00df5603, 0x01548ca2, 0x03c11240, 0x003ba4f1, 0x021cee9f, 0x03585a36, 0x0075a338, 0x004ff5f7, 0x00729bb2, 0x001e61a2}}}, + {X: Field{[10]uint32{0x01fbf9f5, 0x00e12c95, 0x001961cb, 0x03420b60, 0x020d5bee, 0x0317d08f, 0x0064aa96, 0x01f7d5d3, 0x031e382f, 0x003d7c97}}, Y: Field{[10]uint32{0x02210221, 0x0277febc, 0x0324c98a, 0x01a03849, 0x00f54bc0, 0x02942934, 0x0393a829, 0x012ab960, 0x030b5ad8, 0x003a8e23}}}, + {X: Field{[10]uint32{0x02ae09c3, 0x002e2505, 0x0250aa73, 0x01261689, 0x03603720, 0x009d1f10, 0x026e280b, 0x02ae7872, 0x0064f9f8, 0x0034a841}}, Y: Field{[10]uint32{0x029c5962, 0x033da2c8, 0x01b454fd, 0x03aeacf0, 0x032c9ffa, 0x00b240ba, 0x00d8dcaf, 0x0194cc0a, 0x01ed8dc4, 0x003465c6}}}, + {X: Field{[10]uint32{0x00410038, 0x02068008, 0x0291cc5f, 0x00ffcffd, 0x0119058c, 0x03979aa9, 0x01221058, 0x01312f15, 0x02fee672, 0x00224956}}, Y: Field{[10]uint32{0x023fd7bd, 0x01f62bf6, 0x013e6914, 0x02d19c5c, 0x00c833c3, 0x03eead40, 0x0352ffb4, 0x0324d046, 0x02dd9560, 0x00023589}}}, + {X: Field{[10]uint32{0x016e3952, 0x004bef55, 0x03f94beb, 0x03c81b24, 0x015165e3, 0x01e06406, 0x027d73f5, 0x03bbb8a9, 0x0042c5ec, 0x001791a3}}, Y: Field{[10]uint32{0x00f240de, 0x01994163, 0x021edc38, 0x02d0e92b, 0x03ce1fde, 0x00c39003, 0x00b6a8c3, 0x025f8aae, 0x024a467f, 0x002be0f8}}}, + {X: Field{[10]uint32{0x019c4e2c, 0x021401fa, 0x0036d7fc, 0x023a4e14, 0x03552caf, 0x03d52ac0, 0x006850e8, 0x00662fd8, 0x03ac9eca, 0x001c30af}}, Y: Field{[10]uint32{0x02ea37b3, 0x03fadb35, 0x00591544, 0x010034b1, 0x023b45d9, 0x0033dd65, 0x00f99392, 0x02b95e2a, 0x0365f5ff, 0x00180c88}}}, + {X: Field{[10]uint32{0x01c2f318, 0x0107032e, 0x001eeab6, 0x006993a4, 0x03bbb0db, 0x031e58c3, 0x000f86d7, 0x01ad0814, 0x013afe5f, 0x0005850f}}, Y: Field{[10]uint32{0x036a8a94, 0x022c91f5, 0x01e68ecb, 0x009132b4, 0x039fd749, 0x0134734d, 0x0109561d, 0x02075e04, 0x00140bdf, 0x001c1e3a}}}, + {X: Field{[10]uint32{0x02b62bce, 0x01ba5985, 0x03ed029f, 0x02ddce82, 0x03e1326e, 0x003fd82a, 0x025b0346, 0x0059136c, 0x02ada934, 0x0022b0cf}}, Y: Field{[10]uint32{0x00945cc6, 0x0276ff46, 0x0005dc6d, 0x013f6918, 0x00ea9e61, 0x0266f694, 0x0055d0ed, 0x0062d2f4, 0x03566f0d, 0x0001b41d}}}, + {X: Field{[10]uint32{0x0166e22a, 0x02a78189, 0x03ce771e, 0x0096843e, 0x0270cb33, 0x038323ad, 0x01f01166, 0x03abf7bd, 0x00b89e7f, 0x0011dae6}}, Y: Field{[10]uint32{0x02a91050, 0x01743875, 0x03f4730c, 0x0176e03e, 0x00fd98bd, 0x0004bc88, 0x0138483c, 0x00ae19f8, 0x00418325, 0x000e36fc}}}, + {X: Field{[10]uint32{0x01497f11, 0x03114fbb, 0x03058a19, 0x01fc64a5, 0x012e383a, 0x0086b7e8, 0x0302bcb3, 0x0270ef4c, 0x02eff0de, 0x00393498}}, Y: Field{[10]uint32{0x022781d3, 0x01f3def3, 0x0050bfec, 0x0039f008, 0x01953d0c, 0x03a92400, 0x02070c49, 0x0048323c, 0x00fc2fd6, 0x00287e0c}}}, + {X: Field{[10]uint32{0x00b5cbf8, 0x0303f3fc, 0x019871be, 0x01e5065b, 0x03e2e092, 0x027ccf99, 0x00c4f7cb, 0x02f86fc6, 0x010f48f0, 0x0019ef21}}, Y: Field{[10]uint32{0x0352d32f, 0x0373ae17, 0x03355526, 0x02f24b83, 0x01b7e6fa, 0x034bc833, 0x013e9271, 0x0292c91a, 0x0070334a, 0x00389581}}}, + {X: Field{[10]uint32{0x02ef2797, 0x0147849c, 0x02b8d58f, 0x029689c4, 0x02b543a6, 0x00aac9d3, 0x024be020, 0x01250895, 0x02c5c0dd, 0x0014372c}}, Y: Field{[10]uint32{0x02b04ea0, 0x0227e352, 0x03ca890d, 0x01a8bddf, 0x038d2ea1, 0x01c17732, 0x03854b49, 0x01132671, 0x036fb69c, 0x000b2f00}}}, + {X: Field{[10]uint32{0x0358bd6e, 0x029edda1, 0x0287644b, 0x013a2644, 0x01f86080, 0x0377d599, 0x00a57f1b, 0x0123d07a, 0x01777849, 0x001b26f1}}, Y: Field{[10]uint32{0x03b3ff20, 0x003fd13a, 0x00260cd4, 0x005724a0, 0x03a04019, 0x00892406, 0x029ca3d1, 0x02b211cc, 0x01f35998, 0x0021299c}}}, + {X: Field{[10]uint32{0x0382a868, 0x01f12520, 0x010e7a33, 0x011919ce, 0x0128b441, 0x0231bab4, 0x03ceb361, 0x036ee67c, 0x03c6d27c, 0x00176b24}}, Y: Field{[10]uint32{0x002df508, 0x0292fe0d, 0x02d8bac2, 0x02e38c57, 0x008a91c2, 0x025dc13e, 0x034578aa, 0x0020b9d0, 0x00651805, 0x002195c8}}}, + {X: Field{[10]uint32{0x01780c86, 0x00af9f21, 0x0196f2ed, 0x002ad1ae, 0x03f6b2a4, 0x00c1cf03, 0x02e9484d, 0x015f85e9, 0x03c65e1c, 0x00081e40}}, Y: Field{[10]uint32{0x03f6a442, 0x018cf051, 0x02c14854, 0x020c4569, 0x020bbdcb, 0x00f85e8e, 0x00fd3107, 0x01353db1, 0x00202956, 0x0012d5a1}}}, + {X: Field{[10]uint32{0x02dc2f90, 0x0118884b, 0x011dd295, 0x01320a44, 0x036ffbc9, 0x00a0a0c3, 0x03351132, 0x024fa4ea, 0x03639be5, 0x00368097}}, Y: Field{[10]uint32{0x016d2723, 0x0250e0e4, 0x02e68eb6, 0x02997bd2, 0x00714def, 0x006b3d72, 0x02dea9a2, 0x0395dbc3, 0x01eba315, 0x0026d2b3}}}, + {X: Field{[10]uint32{0x02823cb1, 0x002943ec, 0x02ea5603, 0x03d7b91f, 0x012a0f61, 0x021f3c64, 0x026ffa6b, 0x02272084, 0x02cd01b4, 0x000c9fea}}, Y: Field{[10]uint32{0x00c33b9b, 0x03e7b3ee, 0x037e96b7, 0x019d7f85, 0x0314c00c, 0x000f97e2, 0x00c5ac29, 0x00026c51, 0x03426010, 0x00018d2a}}}, + {X: Field{[10]uint32{0x037e8084, 0x0091561e, 0x010cc79a, 0x005fd6fd, 0x006c9cab, 0x02746ff6, 0x013478ba, 0x03d18aa1, 0x03ee1619, 0x001133fe}}, Y: Field{[10]uint32{0x008e7da4, 0x031c535d, 0x01f64563, 0x00703f8d, 0x0176442a, 0x0041e691, 0x02f8c288, 0x0278a1fa, 0x03db6207, 0x002c2260}}}, + {X: Field{[10]uint32{0x02a6fe3a, 0x0085c381, 0x0393a43a, 0x02141203, 0x03beb197, 0x00d3477a, 0x01ad6797, 0x00338b08, 0x01ca1373, 0x00317651}}, Y: Field{[10]uint32{0x023cc3fb, 0x01efc6eb, 0x02f0446e, 0x03ec328f, 0x0374102f, 0x0392a707, 0x03f72878, 0x01c503d9, 0x011b4d8b, 0x0028eab4}}}, + {X: Field{[10]uint32{0x02c0de31, 0x0290b873, 0x019e677f, 0x03d90d4d, 0x01d4bf22, 0x03c76c3b, 0x032694b8, 0x03a4d446, 0x031984df, 0x003d3633}}, Y: Field{[10]uint32{0x01a30845, 0x02e970ba, 0x03f020c0, 0x01753ec3, 0x025b48a5, 0x01f8eff7, 0x02d76bfc, 0x0062035e, 0x01223aae, 0x0020f40b}}}, + {X: Field{[10]uint32{0x0037c4cd, 0x002b9f06, 0x02e707e5, 0x0387854e, 0x03a2dce0, 0x0343c3b9, 0x006380af, 0x002f2243, 0x01dc8e7b, 0x0004f5c8}}, Y: Field{[10]uint32{0x00841116, 0x01844ba2, 0x00d28e97, 0x004b57c5, 0x009309c4, 0x002bdf93, 0x039e8237, 0x015045fa, 0x01e3e157, 0x00318830}}}, + {X: Field{[10]uint32{0x0265ce1a, 0x018b8458, 0x01783928, 0x013389ec, 0x02516482, 0x013076bc, 0x03eb55d9, 0x019ca081, 0x03a666fc, 0x00397e7b}}, Y: Field{[10]uint32{0x000d9975, 0x00bc8f57, 0x0156c771, 0x033d4f82, 0x0201f0f3, 0x018f5e6d, 0x03f9fbe1, 0x00aed48b, 0x03e61830, 0x001402a7}}}, + {X: Field{[10]uint32{0x0319c9ec, 0x0180f0f0, 0x016988da, 0x038290fa, 0x02a48ea0, 0x009ec6cc, 0x027abb98, 0x0284dd96, 0x00bd0a1b, 0x001cfb8f}}, Y: Field{[10]uint32{0x02b38f58, 0x017b1686, 0x00744b0a, 0x03408386, 0x03bbc909, 0x00ba097c, 0x0330bd5a, 0x01a272fa, 0x02b44093, 0x00365a0c}}}, + {X: Field{[10]uint32{0x01990d91, 0x0074b3f1, 0x0255df10, 0x0007c09e, 0x003e0285, 0x0089d429, 0x03285e71, 0x01aeea04, 0x03c59404, 0x00046e4b}}, Y: Field{[10]uint32{0x00315417, 0x0245c5a9, 0x03b639fe, 0x03347655, 0x0023b324, 0x002526cb, 0x01cfcd08, 0x033f8103, 0x00aae20f, 0x003822c9}}}, + {X: Field{[10]uint32{0x0160935b, 0x032873e4, 0x006a0623, 0x0148d8bc, 0x01b1bf49, 0x008a9897, 0x014442a0, 0x003717ec, 0x029c22be, 0x000c10d9}}, Y: Field{[10]uint32{0x00d0eb34, 0x034b2189, 0x00a2206d, 0x02c9724b, 0x0341eead, 0x0349b886, 0x0152c044, 0x01f5afeb, 0x00b04bf4, 0x0037120d}}}, + {X: Field{[10]uint32{0x015f9a0c, 0x02d71f4f, 0x00495132, 0x0185aa72, 0x023f92aa, 0x001f7b12, 0x007622b4, 0x034510ae, 0x01aac290, 0x0012430e}}, Y: Field{[10]uint32{0x0126b986, 0x01a36b8a, 0x021eab3d, 0x03799dcf, 0x03110f87, 0x00f2cc53, 0x001361f7, 0x012a9bfa, 0x00fd5784, 0x00171db0}}}, + {X: Field{[10]uint32{0x0002d03a, 0x02c90ce4, 0x03f2d2bb, 0x02528f82, 0x023a4caf, 0x01cac310, 0x01fb2127, 0x00cd1f28, 0x015867d7, 0x003f7573}}, Y: Field{[10]uint32{0x03411995, 0x033a425d, 0x0117210b, 0x01321762, 0x01bd69f8, 0x02f25369, 0x035bcc06, 0x01af1dbe, 0x0007d1d2, 0x003bf97d}}}, + {X: Field{[10]uint32{0x00435ea9, 0x031405c5, 0x012d80e9, 0x02272b46, 0x00e2d359, 0x01956b10, 0x03db2722, 0x003f3910, 0x008eb083, 0x002f2284}}, Y: Field{[10]uint32{0x03c979f9, 0x01a6e4f8, 0x00d60220, 0x03d8a41f, 0x0076bd3a, 0x024c65b0, 0x008a384b, 0x0369d29c, 0x0258cbc3, 0x00249300}}}, + {X: Field{[10]uint32{0x02924b44, 0x0177e3ab, 0x02e3b339, 0x02904054, 0x012c706e, 0x00626273, 0x02e431a7, 0x02db2e1a, 0x036e41f4, 0x003b6026}}, Y: Field{[10]uint32{0x00315da8, 0x0326ff19, 0x01f8a324, 0x02642c46, 0x00bede66, 0x0251eaa2, 0x0142ffe0, 0x01562723, 0x005c0329, 0x0004d760}}}, + {X: Field{[10]uint32{0x00da52d8, 0x02145edb, 0x03276797, 0x0049e7a7, 0x00043982, 0x0390b5aa, 0x007d2f1e, 0x00781d05, 0x02c75d87, 0x0009ad42}}, Y: Field{[10]uint32{0x005dd7a0, 0x011aeb55, 0x005180e3, 0x02814879, 0x021fe37e, 0x00d253c3, 0x014b4c80, 0x01ba7c2c, 0x00638642, 0x00099667}}}, + {X: Field{[10]uint32{0x03e8efd5, 0x02e53527, 0x01dd725a, 0x00419de1, 0x01679f6b, 0x02241f3c, 0x02746ff9, 0x033351fd, 0x00de27d0, 0x00333b62}}, Y: Field{[10]uint32{0x03f5729a, 0x037d0f5c, 0x00825fe4, 0x019f38af, 0x00e2beba, 0x014ad09a, 0x036adc2c, 0x0212b2d2, 0x022b4dc5, 0x0016c3b7}}}, + {X: Field{[10]uint32{0x003c6249, 0x02a20f76, 0x032bb52d, 0x005863d1, 0x02bf3fe5, 0x01e221b3, 0x00429c11, 0x018cc8c2, 0x03cb3152, 0x00363b7d}}, Y: Field{[10]uint32{0x03984be3, 0x036bc1c5, 0x033437f3, 0x0201ad21, 0x0108c71b, 0x002e9a47, 0x03427e13, 0x03bbdb50, 0x003ec155, 0x00295aaf}}}, + {X: Field{[10]uint32{0x0164b4ef, 0x02dc711d, 0x02515c2f, 0x00414fd9, 0x02526489, 0x035b23f3, 0x0149aa5c, 0x00e9d542, 0x03c9f8db, 0x003b60b0}}, Y: Field{[10]uint32{0x00b2f0b4, 0x03a3f948, 0x00f39b06, 0x032057f3, 0x0141ddcc, 0x0112a291, 0x029a26d4, 0x034f1dbe, 0x014906d9, 0x0017b966}}}, + {X: Field{[10]uint32{0x018ca937, 0x006b910f, 0x0365e777, 0x02b61620, 0x005853b3, 0x01b54212, 0x026249d5, 0x03ad5017, 0x03aee89a, 0x001b89de}}, Y: Field{[10]uint32{0x01f40b8e, 0x01f408ce, 0x025b403f, 0x03713892, 0x008f9623, 0x00e845c3, 0x01a3fe66, 0x02529f0c, 0x03d81e6f, 0x002121c6}}}, + {X: Field{[10]uint32{0x00a03c5c, 0x00abee52, 0x00967f70, 0x0109d9da, 0x00f2f8b6, 0x0386bfe5, 0x01b12293, 0x00484159, 0x02c86727, 0x002bad9e}}, Y: Field{[10]uint32{0x00bde197, 0x0034875e, 0x0289b698, 0x02fcdc1f, 0x02747100, 0x01bfd6b1, 0x027898d6, 0x02700f37, 0x01889425, 0x003f34f1}}}, + {X: Field{[10]uint32{0x0283da79, 0x01f381d4, 0x03af23ba, 0x024e8f44, 0x00457531, 0x00e18cfa, 0x00967d1e, 0x031d5a53, 0x034baa20, 0x0027c1ff}}, Y: Field{[10]uint32{0x03f2136b, 0x017edff7, 0x02e36397, 0x03df656e, 0x0014308c, 0x02b28fc7, 0x03c5f363, 0x0185a3fc, 0x030d49d0, 0x002ba2df}}}, + {X: Field{[10]uint32{0x013e1520, 0x00e5755c, 0x03df7243, 0x0325dab3, 0x03baafc3, 0x02f15406, 0x004b3ef7, 0x036ae859, 0x0114a026, 0x0009011b}}, Y: Field{[10]uint32{0x02029ae6, 0x0219f32a, 0x016cd321, 0x0202eb43, 0x0037fd53, 0x00554d2d, 0x013cd0e9, 0x0028c6ea, 0x01e96dc4, 0x00099521}}}, + {X: Field{[10]uint32{0x033de519, 0x02f08cca, 0x010c913b, 0x02adf67e, 0x011806af, 0x015d39ae, 0x0344f48c, 0x03471a00, 0x0126bf8f, 0x00004dda}}, Y: Field{[10]uint32{0x01a61fa5, 0x02f9e575, 0x01ced56e, 0x014685d5, 0x018aed90, 0x01f4da5b, 0x02b2198e, 0x01309be1, 0x00e7c4b4, 0x0028d040}}}, + {X: Field{[10]uint32{0x035a7d6e, 0x03268fbb, 0x015f11ef, 0x02996073, 0x025e4c38, 0x0045aba0, 0x037c85fb, 0x0319a21f, 0x014e816c, 0x00250f1b}}, Y: Field{[10]uint32{0x029de8dd, 0x00c69825, 0x02b24eca, 0x01c0c5a7, 0x0274112f, 0x0220fb8d, 0x02351657, 0x0369b4a7, 0x0324f618, 0x00364f51}}}, + {X: Field{[10]uint32{0x005432d9, 0x002023a2, 0x03f53d4d, 0x0252bd82, 0x03a0f46e, 0x017d3e19, 0x03c9e61d, 0x0183f72b, 0x001f1592, 0x002b7e01}}, Y: Field{[10]uint32{0x03e57958, 0x01680dc6, 0x02d952b9, 0x01779b0f, 0x02c055ff, 0x03a42cdb, 0x0331bcbb, 0x0145bcf5, 0x021f99d2, 0x00313aae}}}, + {X: Field{[10]uint32{0x022dcc44, 0x014df01b, 0x01bb8d96, 0x01860c97, 0x01dc0d94, 0x001ea7ea, 0x01defb67, 0x02b82047, 0x0313a404, 0x0005705f}}, Y: Field{[10]uint32{0x01b6898e, 0x03ce0eba, 0x01dc679d, 0x01898359, 0x01a799fb, 0x0144b5e7, 0x0042b482, 0x0257a0da, 0x0352021f, 0x0021d034}}}, + {X: Field{[10]uint32{0x02cb8ca0, 0x012df372, 0x0143580e, 0x03b46b0c, 0x00966ec9, 0x01ae04f7, 0x01bd5758, 0x01665271, 0x03356236, 0x0021eeee}}, Y: Field{[10]uint32{0x022a48c4, 0x01892a34, 0x00a36f83, 0x03a472b5, 0x036a28f4, 0x00928fa6, 0x0214ccbe, 0x00f09257, 0x012c1bfc, 0x00005666}}}, + {X: Field{[10]uint32{0x031fa105, 0x01705da7, 0x00daf95b, 0x00f35751, 0x03564da7, 0x02ba710c, 0x0082b5fe, 0x01530678, 0x004a0964, 0x000e6f45}}, Y: Field{[10]uint32{0x016fb207, 0x01dec4c9, 0x019bcfa2, 0x009ccc0c, 0x01dadf15, 0x030f2a3e, 0x02be12eb, 0x03535be2, 0x011c30b5, 0x003ffa28}}}, + {X: Field{[10]uint32{0x003bca7a, 0x02ef592a, 0x00a9ab78, 0x01dbba5c, 0x00a1c696, 0x0196cbd3, 0x0399bfe2, 0x030319ae, 0x034f9bce, 0x0031393a}}, Y: Field{[10]uint32{0x02bfc286, 0x012283a5, 0x03cb7c22, 0x00ed13f0, 0x012ecb49, 0x001798e0, 0x024be2bd, 0x02e712f3, 0x003d316c, 0x0006ee6a}}}, + {X: Field{[10]uint32{0x03244e69, 0x0392bb33, 0x01801488, 0x00d3d4f0, 0x028b53f0, 0x023280d7, 0x01dd2f44, 0x034cd3c3, 0x03831c80, 0x003060f9}}, Y: Field{[10]uint32{0x01a8b820, 0x00c362f6, 0x020b1593, 0x02552539, 0x0008ff2f, 0x03770203, 0x03389268, 0x007520f6, 0x02aac771, 0x003e663f}}}, + {X: Field{[10]uint32{0x02d47d92, 0x0309007f, 0x03b6be39, 0x03655d4e, 0x027ac812, 0x00dd3674, 0x013b630f, 0x038423c2, 0x03ac22a2, 0x00267475}}, Y: Field{[10]uint32{0x02d0e1f0, 0x031378d4, 0x008b039c, 0x00f70d9b, 0x0352080a, 0x00daa25e, 0x01ca3d9b, 0x038d07a3, 0x033488df, 0x000299f4}}}, + {X: Field{[10]uint32{0x0161cea5, 0x033324ab, 0x012bc5c3, 0x00e79fd7, 0x02985a33, 0x01a42420, 0x03d6f187, 0x0226ef7c, 0x025d16cd, 0x00381c02}}, Y: Field{[10]uint32{0x00a0b0f0, 0x025381dc, 0x007e3bd9, 0x00a529eb, 0x001fd08b, 0x02756708, 0x03ec97bc, 0x00fea102, 0x03e03895, 0x0009bdaa}}}, + {X: Field{[10]uint32{0x01a7e721, 0x021e8f98, 0x0268b554, 0x01734fe9, 0x025415e9, 0x01ea98bb, 0x03813b56, 0x0360e546, 0x02e8cf36, 0x002c66fd}}, Y: Field{[10]uint32{0x0170153d, 0x00fe2e46, 0x01041fc0, 0x016e9dc2, 0x0246c105, 0x030439c4, 0x019f59e4, 0x036cbb35, 0x00a5ca2c, 0x0018c39e}}}, + {X: Field{[10]uint32{0x0371fd44, 0x039b867f, 0x03943c6f, 0x01c870cc, 0x0039abaf, 0x025c051d, 0x0027adfa, 0x0343b220, 0x0156e90d, 0x00094024}}, Y: Field{[10]uint32{0x033afc11, 0x019b87d5, 0x01dec9c4, 0x0000b467, 0x01b78255, 0x02e4ce16, 0x014ed74c, 0x01d8c808, 0x03dc8647, 0x000c9011}}}, + {X: Field{[10]uint32{0x01a3e4ae, 0x02e14e18, 0x00681771, 0x007e588e, 0x02aca501, 0x03531402, 0x030c98d9, 0x0174726e, 0x03e8bbe4, 0x0011739f}}, Y: Field{[10]uint32{0x0392f8b1, 0x0018b908, 0x008327ca, 0x01d804d6, 0x019e41b1, 0x02db1fd9, 0x00725702, 0x02e3c297, 0x02afd1ad, 0x00232f08}}}, + {X: Field{[10]uint32{0x019ec059, 0x020522d8, 0x026834e3, 0x014d0ec4, 0x02b939e9, 0x028a1bbd, 0x03392120, 0x01ff19f7, 0x0107d3a2, 0x001cc955}}, Y: Field{[10]uint32{0x01c35b63, 0x013a4fc9, 0x00e28a35, 0x03b44d13, 0x00eeba10, 0x03b5b233, 0x00f3deda, 0x0008376c, 0x02e6e941, 0x000c5d35}}}, + {X: Field{[10]uint32{0x0011df58, 0x0002b072, 0x03885978, 0x00b68481, 0x03602596, 0x0322eb4f, 0x009a9458, 0x030e787b, 0x02f401c6, 0x0025acb3}}, Y: Field{[10]uint32{0x027fa8cd, 0x009271a2, 0x01a997d1, 0x00b660f7, 0x002fbf9e, 0x003000d7, 0x01ab5b7c, 0x02b498eb, 0x012141b4, 0x003b617b}}}, + {X: Field{[10]uint32{0x02b9c772, 0x00fbbd90, 0x01cdbb98, 0x0324dc09, 0x0357f23c, 0x0244aba1, 0x007bebb0, 0x02ca2a8c, 0x001cd941, 0x0015d906}}, Y: Field{[10]uint32{0x00ac7089, 0x0234afb8, 0x01b8ef2c, 0x0133cf38, 0x01249576, 0x0115e90f, 0x01f64375, 0x0023f76d, 0x034fc239, 0x003a05ce}}}, + {X: Field{[10]uint32{0x03ec1b61, 0x00a7b724, 0x02c60efd, 0x028e0aed, 0x02ea16d2, 0x0356c9e0, 0x031e3145, 0x0141580a, 0x00397e96, 0x000e3b1e}}, Y: Field{[10]uint32{0x018ec96e, 0x0353258c, 0x01089744, 0x00c47354, 0x02f522e6, 0x012fc995, 0x02caa3ba, 0x0378b362, 0x02a4c7b6, 0x002b3c13}}}, + {X: Field{[10]uint32{0x02c0b572, 0x03b55e5d, 0x01eb8b7a, 0x03752ca1, 0x0179c9f7, 0x0023dce2, 0x00439fa1, 0x0071e5d6, 0x038013d0, 0x001bb13b}}, Y: Field{[10]uint32{0x0098be7e, 0x006e8bf2, 0x004df13c, 0x01abd7cf, 0x017a6d26, 0x03adabc5, 0x026560e3, 0x03b37c0e, 0x0242e618, 0x0008ca39}}}, + {X: Field{[10]uint32{0x0377141b, 0x0249127b, 0x027ba884, 0x020713b5, 0x034c40a5, 0x029da1a0, 0x000fc149, 0x01ec6940, 0x036b30c2, 0x00363687}}, Y: Field{[10]uint32{0x01519758, 0x00ecd20b, 0x007dc49a, 0x0385c9ca, 0x03d92464, 0x00e4e1f5, 0x038c3108, 0x024b3c0a, 0x02d6876d, 0x00332d4c}}}, + {X: Field{[10]uint32{0x037ccb90, 0x03b458a3, 0x022b4e5f, 0x01b0ce1c, 0x026894d3, 0x032a1287, 0x02aa9f0e, 0x01c3b259, 0x00027349, 0x00213c95}}, Y: Field{[10]uint32{0x035cd8b1, 0x0308648c, 0x02944983, 0x00df4e51, 0x0109bee1, 0x027c18c6, 0x017d283d, 0x018c0b32, 0x0109f07e, 0x003cb5ff}}}, + {X: Field{[10]uint32{0x029503e3, 0x02cb7733, 0x00038136, 0x03533c02, 0x033adabf, 0x00761bfd, 0x01190e39, 0x010dca16, 0x02b55887, 0x003bd9d4}}, Y: Field{[10]uint32{0x03131c56, 0x00567e0f, 0x010f91e6, 0x0391850e, 0x0273f949, 0x02373e63, 0x03aa6759, 0x02d1e5f2, 0x0250013c, 0x0008f672}}}, + {X: Field{[10]uint32{0x0085ba6d, 0x02f0b004, 0x02a46602, 0x01d3f845, 0x00fe198f, 0x01df1ddb, 0x001cb52c, 0x0399f3d9, 0x01903b3f, 0x003e2361}}, Y: Field{[10]uint32{0x0208742d, 0x001fedee, 0x03a32405, 0x028a39b3, 0x0021da61, 0x0377c539, 0x0295714c, 0x02b5a28d, 0x02bd2178, 0x00162bca}}}, + {X: Field{[10]uint32{0x01b9c01c, 0x037805cb, 0x01354645, 0x03543457, 0x0218cde6, 0x0177b5f4, 0x01daaa8c, 0x02e5719d, 0x01bdd366, 0x0024edce}}, Y: Field{[10]uint32{0x01cf3627, 0x02e21b89, 0x03fb4748, 0x03c71f22, 0x017afea5, 0x02b83f2b, 0x03af5b96, 0x023aa98c, 0x01356c2f, 0x000093b1}}}, + {X: Field{[10]uint32{0x00443394, 0x00fc88c0, 0x00f95d41, 0x02496260, 0x006d313b, 0x02030455, 0x0382f801, 0x03968b6f, 0x0004da7a, 0x001ccb3d}}, Y: Field{[10]uint32{0x01596953, 0x035e2693, 0x01e431b7, 0x021054f2, 0x02e88200, 0x029dded5, 0x02eae580, 0x02e42a40, 0x03261758, 0x002163a0}}}, + {X: Field{[10]uint32{0x01d36e32, 0x0296652a, 0x02f7528e, 0x00ad6f92, 0x0365fc25, 0x006e0e2d, 0x002e024a, 0x0000b4fe, 0x03192c40, 0x003bf781}}, Y: Field{[10]uint32{0x01d9107b, 0x00be034f, 0x01483f0c, 0x02d5a751, 0x03b8dd69, 0x020ea71b, 0x02635851, 0x00d5da46, 0x035c3a15, 0x00227074}}}, + {X: Field{[10]uint32{0x02c90a15, 0x03764307, 0x034a6b42, 0x016e6c69, 0x02f114e6, 0x02a542f6, 0x0020c1cd, 0x00ce49d9, 0x02f28069, 0x0027bb6a}}, Y: Field{[10]uint32{0x03164de2, 0x022e81f4, 0x035337de, 0x03842b0e, 0x0226f427, 0x0134a314, 0x009728da, 0x010334c9, 0x00247fa5, 0x0004e677}}}, + {X: Field{[10]uint32{0x01433195, 0x034f5086, 0x017dd877, 0x031f52e8, 0x03775805, 0x03f6d21f, 0x01eaafeb, 0x028851a7, 0x028d342a, 0x0008fc3a}}, Y: Field{[10]uint32{0x03699b03, 0x02ff5182, 0x0306e4fc, 0x030e79f0, 0x0163444d, 0x0353a4f0, 0x032ca8d1, 0x02071574, 0x0231d2a4, 0x0037071b}}}, + {X: Field{[10]uint32{0x03e060b8, 0x032ddbaa, 0x0052c074, 0x003538cc, 0x02edd47c, 0x01a8c174, 0x0116e827, 0x02798162, 0x027058c2, 0x00003614}}, Y: Field{[10]uint32{0x010cfac8, 0x03f69baf, 0x012583a2, 0x02da2a68, 0x0384d497, 0x027a9264, 0x009e5105, 0x016ee57b, 0x0104e4db, 0x00268392}}}, + {X: Field{[10]uint32{0x009f28b8, 0x02411acc, 0x0363ad4d, 0x00ddeacd, 0x00f7d36b, 0x0033ce18, 0x022d2d19, 0x00481164, 0x015cccf9, 0x0006cd32}}, Y: Field{[10]uint32{0x0151e948, 0x0128478a, 0x0008f6f1, 0x03a246ed, 0x01f7080d, 0x0181f2d3, 0x0078c3d2, 0x0198ead9, 0x020c3f5f, 0x001c308c}}}, + {X: Field{[10]uint32{0x0384b228, 0x02851cd2, 0x028c28fc, 0x00d85263, 0x0289569d, 0x03c41c1e, 0x016d4e20, 0x0165aedd, 0x03dcae5e, 0x000c9563}}, Y: Field{[10]uint32{0x02038d86, 0x0241be45, 0x03cfb501, 0x0381d2db, 0x01fe63f6, 0x0356ab36, 0x03978c43, 0x01d56ec8, 0x00b75ed5, 0x001dd66a}}}, + {X: Field{[10]uint32{0x01984acd, 0x032c7a37, 0x02bf8577, 0x03b3e8f5, 0x016028d7, 0x00102bef, 0x01a38202, 0x02f15ce4, 0x037737d2, 0x00192062}}, Y: Field{[10]uint32{0x01ca2300, 0x001d225c, 0x03e1f057, 0x03b29c99, 0x012cf895, 0x0298c12f, 0x027b8914, 0x01553648, 0x01346ae9, 0x001080ae}}}, + {X: Field{[10]uint32{0x0177b333, 0x00b61f63, 0x031aae57, 0x0015cb86, 0x01bcd337, 0x010a2154, 0x02a23732, 0x01f2d50a, 0x02c6ec2d, 0x0031abda}}, Y: Field{[10]uint32{0x02c78cbf, 0x031f36b7, 0x023529fc, 0x022e17c8, 0x015d5af1, 0x034101fb, 0x02393bcd, 0x028b7c63, 0x01594ae5, 0x003fff95}}}, + {X: Field{[10]uint32{0x00f1cef0, 0x00378fa9, 0x02f13a8b, 0x00d0a3ba, 0x002e7a9e, 0x03ccbf51, 0x022a0317, 0x004be03e, 0x004494ea, 0x00247e3f}}, Y: Field{[10]uint32{0x0154dbcf, 0x03fdb669, 0x02a42481, 0x0097aba8, 0x03e76c22, 0x003309ab, 0x02765f42, 0x007742b1, 0x007ad81b, 0x0001a829}}}, + {X: Field{[10]uint32{0x01c1c017, 0x00ff1084, 0x016c8e35, 0x01848cd7, 0x02dc610a, 0x030056d1, 0x01b081fd, 0x03d5f21e, 0x01fa6a26, 0x0038566a}}, Y: Field{[10]uint32{0x013e8851, 0x0126beaa, 0x010b6bd7, 0x031f2a07, 0x00f1c181, 0x013077cb, 0x01656f9b, 0x0380269d, 0x0243445a, 0x00308271}}}, + {X: Field{[10]uint32{0x00f9330b, 0x02fae969, 0x01813556, 0x01a6e279, 0x031a7051, 0x001b4a0f, 0x011eda9c, 0x00ea5c48, 0x005e135f, 0x003a3a7f}}, Y: Field{[10]uint32{0x01af0abb, 0x02c4353a, 0x01553fe0, 0x02e7cff1, 0x01c88423, 0x03c7912d, 0x03b55fa6, 0x03a3db69, 0x00993b73, 0x003a2e5a}}}, + {X: Field{[10]uint32{0x000edead, 0x010d4daf, 0x035b1642, 0x0062bbbe, 0x0011aa98, 0x004ce12d, 0x0027ec6e, 0x013030db, 0x0129d5ae, 0x003cfd75}}, Y: Field{[10]uint32{0x033d34b9, 0x016f9876, 0x02ae533f, 0x00190f94, 0x021dd1e3, 0x03f1782a, 0x01abbc4f, 0x0304ccd1, 0x02431e40, 0x000fdd01}}}, + {X: Field{[10]uint32{0x00c81159, 0x013db5db, 0x0206a02e, 0x01727285, 0x0209eae6, 0x00505d80, 0x039acffe, 0x02ee6b86, 0x0030f5d8, 0x00316dd9}}, Y: Field{[10]uint32{0x032429c1, 0x03a1b633, 0x00fad0d2, 0x00ce6800, 0x0229b139, 0x02454e02, 0x00875916, 0x02426090, 0x03097008, 0x00201a27}}}, + {X: Field{[10]uint32{0x00fc09b0, 0x01442703, 0x00261e93, 0x0191ca25, 0x00ff2755, 0x03edb6d4, 0x02d30c9f, 0x0241d117, 0x00b434f5, 0x002552a9}}, Y: Field{[10]uint32{0x0072e4ad, 0x01974f43, 0x00ec5832, 0x01ba029c, 0x03a808b7, 0x00ec3f3c, 0x0176be8b, 0x00b095b3, 0x02861bad, 0x002008f2}}}, + {X: Field{[10]uint32{0x023d528b, 0x03c4cd5b, 0x00249d6d, 0x01512eed, 0x021b96ee, 0x002960cd, 0x020c9b93, 0x03cce4c0, 0x00bb4803, 0x0001576a}}, Y: Field{[10]uint32{0x02e5b64c, 0x03bdf38c, 0x02575799, 0x0134d568, 0x002387b1, 0x02805e17, 0x00bb209d, 0x03a7d61b, 0x0388ca06, 0x00373112}}}, + {X: Field{[10]uint32{0x03a1de03, 0x01fe2ee8, 0x0236877a, 0x02f285db, 0x01db59ea, 0x0098ad38, 0x02d48d3d, 0x02ca1ac2, 0x0000d810, 0x0020213a}}, Y: Field{[10]uint32{0x03dc1480, 0x0223f118, 0x00f85e08, 0x02b3acd2, 0x00070d60, 0x02f17e60, 0x0309c129, 0x0197f027, 0x029c59f8, 0x00362fba}}}, + {X: Field{[10]uint32{0x0318b39b, 0x03be9055, 0x00bd7f85, 0x005ec030, 0x03d15e02, 0x00252526, 0x00f49a15, 0x01fe21d2, 0x02c236c8, 0x0006caed}}, Y: Field{[10]uint32{0x01029c74, 0x006b4514, 0x001dc810, 0x00b02c3a, 0x00c3c3f4, 0x01afaa69, 0x03dd0180, 0x03cdbbc6, 0x01956aad, 0x0008592c}}}, + {X: Field{[10]uint32{0x00377872, 0x0368e295, 0x02d84830, 0x03667e46, 0x01de9139, 0x034bfafb, 0x01c65ce3, 0x030dcb97, 0x03e80125, 0x003ee9a1}}, Y: Field{[10]uint32{0x03e001c9, 0x00fb049c, 0x03f83092, 0x03c95fd2, 0x0355aabb, 0x0016a584, 0x00a7a821, 0x02540729, 0x02df03b8, 0x0022513a}}}, + {X: Field{[10]uint32{0x01560cbd, 0x038b7fbf, 0x03a948aa, 0x017bc246, 0x03d21e15, 0x0168b5e5, 0x00699c97, 0x0305bfe7, 0x0380a5f1, 0x002d6392}}, Y: Field{[10]uint32{0x02cec3ec, 0x02944a14, 0x02fec937, 0x01f64097, 0x0304606f, 0x00b5aaa5, 0x031b7f41, 0x02fe9b95, 0x02ba1429, 0x003ffe72}}}, + {X: Field{[10]uint32{0x0026edec, 0x03c5f38d, 0x02900fce, 0x01f2750e, 0x00114fdb, 0x00171af9, 0x0222551e, 0x01b08554, 0x0126da5d, 0x0023af35}}, Y: Field{[10]uint32{0x013aa97e, 0x01f7e194, 0x0021eae9, 0x00d2bbb7, 0x03de11f0, 0x014bd519, 0x02aafb1a, 0x0006d8fa, 0x03986b33, 0x001ce83e}}}, + {X: Field{[10]uint32{0x03ee325e, 0x0159a446, 0x00d2dbb9, 0x00c99010, 0x037354e0, 0x025c5526, 0x01c68f0e, 0x00a7a257, 0x000b924b, 0x003ee915}}, Y: Field{[10]uint32{0x0105ebd4, 0x039bd464, 0x0321b6c9, 0x009c5bd4, 0x02290f3c, 0x0394a10e, 0x02ba0d07, 0x015eb8d0, 0x00c33b98, 0x0014a422}}}, + {X: Field{[10]uint32{0x039c44de, 0x01bd3a2f, 0x025b0ab4, 0x025d946c, 0x02ce014c, 0x01bcfcdb, 0x006301a6, 0x034c91b6, 0x0097a1a7, 0x0022de8b}}, Y: Field{[10]uint32{0x00b247c7, 0x00ca3f69, 0x017b94cb, 0x02110ff0, 0x027c88a6, 0x007a9d4d, 0x006c1f47, 0x00d6cd9e, 0x00ab699c, 0x002e0a15}}}, + {X: Field{[10]uint32{0x02d2279c, 0x00e6963a, 0x0096f40c, 0x01dd2f52, 0x03931796, 0x006ea426, 0x0003bbba, 0x01c5539c, 0x03435adb, 0x00277c45}}, Y: Field{[10]uint32{0x01b884eb, 0x03c866d0, 0x02f8377e, 0x019775e8, 0x01d45668, 0x01eae190, 0x02913d6e, 0x0330db0d, 0x034ea216, 0x0029e48b}}}, + {X: Field{[10]uint32{0x02931cd8, 0x02b6b915, 0x03e9e414, 0x005707e6, 0x02c54b62, 0x01cc5224, 0x02fd9e73, 0x0111320b, 0x0384749b, 0x0016fade}}, Y: Field{[10]uint32{0x03abb95c, 0x0183a6cb, 0x01f7b64f, 0x03f3ad47, 0x03d32b7c, 0x03cc23bf, 0x02753fbf, 0x0029f0a3, 0x025f32cd, 0x00026790}}}, + {X: Field{[10]uint32{0x00788879, 0x004abd93, 0x02f43cd5, 0x01745c19, 0x01c9f8ed, 0x028edec2, 0x005114f4, 0x0012e9e3, 0x00430ff2, 0x000aa0c3}}, Y: Field{[10]uint32{0x02666c84, 0x02588c18, 0x0286561e, 0x00267b90, 0x009ba148, 0x0081fac0, 0x02827fed, 0x00994bae, 0x03a4e888, 0x00004948}}}, + {X: Field{[10]uint32{0x0057486a, 0x02488787, 0x014191b6, 0x00500670, 0x00985a77, 0x0334cb65, 0x00ab408b, 0x00a8639a, 0x02a14c1f, 0x003dc691}}, Y: Field{[10]uint32{0x00534875, 0x01d6db48, 0x00f0aef6, 0x00feca07, 0x034fac44, 0x03303683, 0x00ce36a4, 0x02694d3f, 0x033e0ea7, 0x002b7c66}}}, + {X: Field{[10]uint32{0x029d193b, 0x010da9f1, 0x012fdcb6, 0x02acdb10, 0x00bbad2b, 0x01f58f03, 0x00ae2d9f, 0x00acc59e, 0x01dcaa9c, 0x000ae039}}, Y: Field{[10]uint32{0x022119c3, 0x00875880, 0x00ffa276, 0x00670821, 0x038f3c90, 0x0141891e, 0x001ce04c, 0x00018ada, 0x004d71d6, 0x002f20f8}}}, + {X: Field{[10]uint32{0x023beece, 0x0148d739, 0x01d5bb97, 0x00300f11, 0x0175424a, 0x011124d0, 0x0375b58d, 0x031a71a0, 0x033be521, 0x001272f7}}, Y: Field{[10]uint32{0x0062de7f, 0x01b12697, 0x017a8ae4, 0x03c558e6, 0x0291d260, 0x00e84dab, 0x0356abad, 0x039f3b0d, 0x02eaf0f0, 0x00315857}}}, + {X: Field{[10]uint32{0x029ee1b2, 0x016e8c73, 0x0373979c, 0x00ee72a1, 0x03f7aa66, 0x03741c3d, 0x015e2f31, 0x02c45648, 0x0314b643, 0x00339351}}, Y: Field{[10]uint32{0x02feac38, 0x023f76c7, 0x010aad6f, 0x02d08030, 0x00479745, 0x0188406c, 0x0359ef5e, 0x00ea8d36, 0x0212a2fc, 0x002c7cd7}}}, + {X: Field{[10]uint32{0x01e10054, 0x00b53758, 0x01656299, 0x01e7b5f1, 0x01a8bef4, 0x03562071, 0x013bb1b5, 0x016b0e36, 0x02bbaa90, 0x001a09ed}}, Y: Field{[10]uint32{0x016bb869, 0x03e3b3ca, 0x0064d1af, 0x009dfbc8, 0x0030fc37, 0x016007d5, 0x00484279, 0x00083646, 0x007baf65, 0x0021492a}}}, + {X: Field{[10]uint32{0x0056535f, 0x03d2b460, 0x0112519a, 0x0062c5b7, 0x00ab9472, 0x000e9268, 0x037879aa, 0x035fc71e, 0x00d548f4, 0x00039c79}}, Y: Field{[10]uint32{0x0232f574, 0x006ece03, 0x01c09f0d, 0x01a0f7b4, 0x0383aeed, 0x02d72604, 0x03e3beda, 0x02cf55bd, 0x00617098, 0x00125741}}}, + {X: Field{[10]uint32{0x0200e032, 0x00199f1b, 0x02542632, 0x005a1cf3, 0x00656528, 0x00ffb69a, 0x036aa32a, 0x03ecc350, 0x01797429, 0x003bda0e}}, Y: Field{[10]uint32{0x0134613f, 0x028d8d41, 0x01404fbb, 0x001bc053, 0x0002f175, 0x006229ab, 0x01ed846f, 0x025fa03f, 0x024ade11, 0x002d2c63}}}, + {X: Field{[10]uint32{0x012deaf4, 0x0162c0f9, 0x0245b0a2, 0x00db07b1, 0x01dd557e, 0x038bbb61, 0x008007d0, 0x01fbffa4, 0x01c1ac8f, 0x000031ca}}, Y: Field{[10]uint32{0x021305fe, 0x01fafd15, 0x00f27bde, 0x02242b0e, 0x0312365b, 0x00cd6821, 0x02bade6a, 0x013dab17, 0x01c21858, 0x000ba0fb}}}, + {X: Field{[10]uint32{0x015735ab, 0x031fec44, 0x0288cc1c, 0x03088492, 0x01290d54, 0x02b8b7b4, 0x03c4f2c3, 0x01b54eca, 0x01199a71, 0x0033c74e}}, Y: Field{[10]uint32{0x0100e6e6, 0x02dc35b7, 0x029089b7, 0x03bab550, 0x03c276c8, 0x02ae14e2, 0x0180970d, 0x0100b3a2, 0x01a57ec3, 0x001ad13d}}}, + {X: Field{[10]uint32{0x03ecdeae, 0x03582696, 0x00f55cf9, 0x01ffe0b6, 0x01a9c28a, 0x03a4369d, 0x031f772e, 0x03b8a3cf, 0x03a0266d, 0x001b3cf5}}, Y: Field{[10]uint32{0x01bc58d4, 0x037ebad2, 0x01e14034, 0x02d3113b, 0x00ede5c9, 0x0366a66f, 0x01b9cf94, 0x03338a25, 0x03b31e11, 0x000ef463}}}, + {X: Field{[10]uint32{0x01395542, 0x01d2701f, 0x00be7f28, 0x02bb3e0c, 0x0256393c, 0x0002ba4c, 0x02e4274f, 0x03bb2b37, 0x0032ae63, 0x003692d6}}, Y: Field{[10]uint32{0x01b2210b, 0x03220633, 0x00ec4dfe, 0x038c6da5, 0x02106374, 0x005a12e4, 0x01610c9d, 0x0103c605, 0x023bd2d9, 0x0026aaec}}}, + {X: Field{[10]uint32{0x0330bbfa, 0x0357de90, 0x002d4b8a, 0x0043a561, 0x03407d1a, 0x03a8b1af, 0x0063270c, 0x00385be7, 0x03502321, 0x003e46b8}}, Y: Field{[10]uint32{0x013aa1c2, 0x00421ae4, 0x01e161b5, 0x010ccd94, 0x0153c915, 0x034f46bc, 0x029290ef, 0x0095cd65, 0x01acd196, 0x00007c58}}}, + {X: Field{[10]uint32{0x02f1ac02, 0x021d2cbc, 0x0025556c, 0x01cfe872, 0x02c72e3f, 0x01cca149, 0x0047c862, 0x00a8b916, 0x0352cc3e, 0x001f86fb}}, Y: Field{[10]uint32{0x02f6e6fe, 0x0305e1f9, 0x017f44c4, 0x008fba36, 0x0008ff05, 0x003f13d4, 0x03048fee, 0x03934f6d, 0x037ea706, 0x002f92c3}}}, + {X: Field{[10]uint32{0x03d5998f, 0x03f20534, 0x020ecb27, 0x03c52f9c, 0x03706567, 0x03724bad, 0x00e256cc, 0x00bb8dd2, 0x015d30dc, 0x0003749a}}, Y: Field{[10]uint32{0x032dc74f, 0x000a8668, 0x0396ed1a, 0x0103c3c2, 0x01bba677, 0x01151cad, 0x027cf998, 0x02004e7b, 0x0044f102, 0x0026bccb}}}, + {X: Field{[10]uint32{0x009dbb9d, 0x002ccdd9, 0x037c94d2, 0x02550fec, 0x02125fe3, 0x00ceddb6, 0x02602ba0, 0x018f2344, 0x02507147, 0x001e3eb9}}, Y: Field{[10]uint32{0x03ce3aa6, 0x0388d46f, 0x00ce121d, 0x00c81989, 0x00c3b925, 0x02bc7fa9, 0x01826e5e, 0x03339bd9, 0x000f0726, 0x001e3713}}}, + {X: Field{[10]uint32{0x01c98bd5, 0x02498da3, 0x018dfee6, 0x02e16476, 0x021b6fb6, 0x0005ad16, 0x01d3e00d, 0x01774aa8, 0x021e510e, 0x0007b7d4}}, Y: Field{[10]uint32{0x01311f86, 0x02369055, 0x00a59751, 0x034d8efb, 0x00aeafd8, 0x006ac3c8, 0x034d8177, 0x026e3743, 0x016d9b2e, 0x00268340}}}, + {X: Field{[10]uint32{0x00101d39, 0x01aa8634, 0x02b4d416, 0x0250dd58, 0x007ce286, 0x00f31a79, 0x013272cd, 0x02d82e45, 0x030c5e53, 0x002181ee}}, Y: Field{[10]uint32{0x02eb519a, 0x0159b565, 0x00e988ef, 0x015c9e49, 0x02388707, 0x01922be3, 0x01a294aa, 0x0195070d, 0x031ec83c, 0x00005728}}}, + {X: Field{[10]uint32{0x02d02eab, 0x02d97de5, 0x02df7166, 0x001e44bc, 0x03037f96, 0x010ae6ed, 0x020dbb7c, 0x000fde02, 0x000d9a05, 0x00197f4c}}, Y: Field{[10]uint32{0x02a3b5d9, 0x02e4a2d3, 0x00aa5335, 0x00f3513b, 0x02904caf, 0x03dad0fc, 0x03945401, 0x02a14847, 0x035084fb, 0x003f3454}}}, + {X: Field{[10]uint32{0x0002d148, 0x03c51633, 0x03f99f47, 0x02a4cc24, 0x0336d031, 0x01332fac, 0x01845f03, 0x01f38700, 0x03a76c84, 0x0032462c}}, Y: Field{[10]uint32{0x03728568, 0x00eb7f5f, 0x00eb53ed, 0x02772a17, 0x02059632, 0x03ea9b98, 0x00632700, 0x00b880c8, 0x0003dbbb, 0x003c95bd}}}, + {X: Field{[10]uint32{0x01661817, 0x014ab381, 0x03bb5c13, 0x03536f82, 0x01532e54, 0x0102b783, 0x02cb4291, 0x02e1e42f, 0x00fd02f0, 0x001ab0b7}}, Y: Field{[10]uint32{0x029e2af3, 0x02ab8592, 0x026dccca, 0x038c1811, 0x03784c3d, 0x01c89470, 0x0323074e, 0x00e5b16b, 0x0310abf9, 0x003cb098}}}, + {X: Field{[10]uint32{0x033f3d19, 0x02ffcbf2, 0x0295f5b0, 0x02a517da, 0x02cf8e95, 0x017facac, 0x0239b94b, 0x03ce273b, 0x00ee54ac, 0x00235c71}}, Y: Field{[10]uint32{0x031ce52d, 0x01d611c3, 0x00cb6548, 0x015e26d1, 0x03f0bc88, 0x00cc1840, 0x03a3881e, 0x030711f6, 0x03d95a02, 0x0026110a}}}, + {X: Field{[10]uint32{0x00f583c3, 0x03b84911, 0x03072b3d, 0x01a2a426, 0x002e5d73, 0x01447a1d, 0x000abbb0, 0x01c463cb, 0x00d3fd55, 0x003a2f49}}, Y: Field{[10]uint32{0x03ce6538, 0x02c6fc22, 0x0343a4d4, 0x016b3583, 0x02238028, 0x01c59167, 0x037992a6, 0x008b6d96, 0x03a6e286, 0x003874b0}}}, + {X: Field{[10]uint32{0x00075217, 0x01c9568f, 0x011d032d, 0x0092acab, 0x00483fd0, 0x00c478ed, 0x02c8c516, 0x033e2794, 0x01755cf8, 0x0018b70a}}, Y: Field{[10]uint32{0x000e2a97, 0x0247e3d7, 0x00d1e093, 0x02a523cf, 0x018b3fc8, 0x00255094, 0x0301e9cd, 0x008b6383, 0x0132d80d, 0x0001e678}}}, + {X: Field{[10]uint32{0x004c0e13, 0x014125b5, 0x01451a60, 0x013d9aa5, 0x034d4323, 0x031f4f01, 0x01027099, 0x01f9832c, 0x03aacf72, 0x000df6c4}}, Y: Field{[10]uint32{0x01b1066b, 0x0090cd22, 0x02fb0629, 0x01b7427a, 0x02d3402a, 0x0004e87d, 0x02e9d07e, 0x03bfd065, 0x03be8f8c, 0x00030e0e}}}, + {X: Field{[10]uint32{0x032aa1ab, 0x01d6cc3e, 0x02c39378, 0x00e49a67, 0x01be9dc4, 0x01cbc77c, 0x018e17c4, 0x01c67b21, 0x0365eab7, 0x000defed}}, Y: Field{[10]uint32{0x01721364, 0x014d58f4, 0x00eea23b, 0x017419bc, 0x025cf44b, 0x022be329, 0x0135f4a9, 0x031308be, 0x03fd865d, 0x001c9c62}}}, + {X: Field{[10]uint32{0x005d1b94, 0x02e914aa, 0x0145606d, 0x03f84803, 0x03b5d5c3, 0x01885229, 0x01ba6e1f, 0x02fcd57f, 0x021287fc, 0x0010cfb7}}, Y: Field{[10]uint32{0x0357c20e, 0x01765251, 0x02e60571, 0x01f1ebb9, 0x01137a4c, 0x00f8c1e0, 0x030c9591, 0x0144eca3, 0x0213ad6e, 0x002c9f15}}}, + {X: Field{[10]uint32{0x02671861, 0x02695f4f, 0x03b323af, 0x0342e2c9, 0x02d23295, 0x02adf7d1, 0x021917f6, 0x00379a4a, 0x019fc5ed, 0x0003960b}}, Y: Field{[10]uint32{0x00073154, 0x0077bff5, 0x01fd6557, 0x01cc6de3, 0x01d1c9e0, 0x021b2c74, 0x039faa53, 0x0036f5f9, 0x0385e277, 0x000cfba1}}}, + {X: Field{[10]uint32{0x009442c2, 0x00a18013, 0x0189e4e4, 0x000529a8, 0x02ad8fae, 0x003c1ab7, 0x02d4e5da, 0x03c56bb8, 0x0340634b, 0x00182c1e}}, Y: Field{[10]uint32{0x004b283d, 0x00466c6f, 0x00f37ff2, 0x027295ec, 0x011557f2, 0x02362ab1, 0x034a2cd6, 0x010ee98a, 0x03cd00d2, 0x003fb821}}}, + {X: Field{[10]uint32{0x01e03100, 0x0196b4cb, 0x009b2102, 0x029f38df, 0x02643e6d, 0x01ba23ee, 0x0245e35b, 0x03df2828, 0x027601e5, 0x0012c59c}}, Y: Field{[10]uint32{0x02d8dde7, 0x024324e3, 0x00a6473b, 0x00aed8c5, 0x00cacda0, 0x03547c57, 0x0126c1dc, 0x021f8243, 0x03024768, 0x000a2ab3}}}, + {X: Field{[10]uint32{0x022a3170, 0x034be6ff, 0x027b2a17, 0x03853b53, 0x02fab97d, 0x026a22b8, 0x0003e638, 0x01f9d312, 0x013d6d79, 0x00175584}}, Y: Field{[10]uint32{0x01cd524f, 0x00ac79f6, 0x033abee4, 0x024b8b65, 0x02c65459, 0x03acacd3, 0x02462a27, 0x02cbfe98, 0x02a8534e, 0x000253bc}}}, + {X: Field{[10]uint32{0x0234f828, 0x02cf418e, 0x03a7ee38, 0x0363ca37, 0x03f4a06c, 0x03a3111c, 0x01572878, 0x006b6344, 0x03ae7511, 0x002a740f}}, Y: Field{[10]uint32{0x03517881, 0x0347e54c, 0x0262e4d9, 0x02d31f78, 0x03480c94, 0x01a3daea, 0x02665bf9, 0x0261e4b2, 0x000cc731, 0x00281ccf}}}, + {X: Field{[10]uint32{0x020e1ad5, 0x0157c959, 0x00522508, 0x0058599b, 0x0058fd37, 0x02cfdf9c, 0x00db3b77, 0x02f3a7b5, 0x01712b1a, 0x001d0665}}, Y: Field{[10]uint32{0x00da44db, 0x019ef640, 0x0385f22b, 0x03062ab0, 0x00ea3ef2, 0x009c9800, 0x013b8a32, 0x01d6273f, 0x02a8097f, 0x001c432b}}}, + {X: Field{[10]uint32{0x01918dc8, 0x02ae5bc9, 0x00be7cab, 0x03cab31a, 0x02ba0106, 0x0119cf85, 0x03a1e5f8, 0x0296c7ba, 0x010dbf81, 0x0027c5a6}}, Y: Field{[10]uint32{0x00ebc4f5, 0x01962314, 0x007b0f0b, 0x03c7a996, 0x03135d46, 0x000e01aa, 0x0049d39c, 0x004108d3, 0x007b6232, 0x00035835}}}, + {X: Field{[10]uint32{0x0301d57d, 0x01c302c8, 0x00619b6a, 0x03d322c9, 0x03c99143, 0x02af4569, 0x011c888f, 0x02e69eb6, 0x01bc4f12, 0x000ed41a}}, Y: Field{[10]uint32{0x01dd1a79, 0x020a31ff, 0x035a8979, 0x013aa1ad, 0x02da1854, 0x02cc4759, 0x034ddfd4, 0x02a5127e, 0x00d1ae59, 0x0036ee1f}}}, + {X: Field{[10]uint32{0x02baee90, 0x026e51b6, 0x01c68115, 0x035c26dd, 0x01f90cdc, 0x02feaecc, 0x03bf9afb, 0x028db82e, 0x03a967b5, 0x00277a98}}, Y: Field{[10]uint32{0x02bc4464, 0x019989f1, 0x01e57b8a, 0x03ae5353, 0x0305c7d2, 0x02460348, 0x01a605ce, 0x02e5638c, 0x019b11ba, 0x002c52ee}}}, + {X: Field{[10]uint32{0x01e31e79, 0x0377d215, 0x03a188e0, 0x00b30cf0, 0x0309fe6b, 0x0104798e, 0x025cb534, 0x01aa1095, 0x03921da3, 0x00342c8c}}, Y: Field{[10]uint32{0x0374f8e9, 0x010d7943, 0x02a7515c, 0x01d90fed, 0x02991172, 0x00d42cec, 0x02f1cfcc, 0x01524b72, 0x03ea1a6e, 0x00203b64}}}, + {X: Field{[10]uint32{0x00b03d20, 0x0205ece4, 0x01da552c, 0x0323dc44, 0x03acfe85, 0x03d1078f, 0x00ca7a49, 0x03912fe6, 0x0255966a, 0x0022b725}}, Y: Field{[10]uint32{0x03c0021e, 0x0069b95c, 0x013b4eed, 0x019b6c6e, 0x005dd1d5, 0x024cdd0c, 0x00c80eac, 0x01cc4860, 0x014c6a71, 0x00339c81}}}, + {X: Field{[10]uint32{0x020c1670, 0x0059c987, 0x03fe3ec9, 0x00438b84, 0x02141ac6, 0x00062929, 0x00800b6d, 0x00f7a9c0, 0x03f8cf6d, 0x003dbdda}}, Y: Field{[10]uint32{0x039a302c, 0x0070e54f, 0x01a54e24, 0x03dd9913, 0x0263e4fe, 0x01ace93b, 0x025e2a10, 0x0261da63, 0x00afe1ea, 0x002cb11e}}}, + {X: Field{[10]uint32{0x00b898e5, 0x00f61bc5, 0x039fef87, 0x0235b697, 0x03217638, 0x01cece44, 0x00fcaa18, 0x0368c05d, 0x007d38b7, 0x0003560a}}, Y: Field{[10]uint32{0x02fc8402, 0x00ba7b1a, 0x005ee350, 0x03d58795, 0x03da2b8f, 0x0052b433, 0x018f91d1, 0x00217a0c, 0x013469ed, 0x001e17f2}}}, + {X: Field{[10]uint32{0x01a3661c, 0x02fd9d0e, 0x0354a02f, 0x0047d2e0, 0x01538e3d, 0x0361c0b0, 0x03e810c6, 0x03b9567f, 0x022350c5, 0x001ddcb2}}, Y: Field{[10]uint32{0x006edddb, 0x036690da, 0x00d6c931, 0x02a2b87f, 0x03fe3dd3, 0x00fa6393, 0x008aefb2, 0x0368516d, 0x02de853f, 0x001688c4}}}, + {X: Field{[10]uint32{0x02433ad5, 0x01c177dc, 0x02308069, 0x00f9dab7, 0x0046ce90, 0x03f0fecb, 0x010ac95e, 0x00da1deb, 0x0176c50f, 0x0028be7e}}, Y: Field{[10]uint32{0x00c285f3, 0x03c15bf2, 0x0238a22a, 0x012da2be, 0x01f201dd, 0x03e35d11, 0x0211b22b, 0x0227ccd7, 0x031124c2, 0x003b1594}}}, + {X: Field{[10]uint32{0x038b15f7, 0x0086a013, 0x0211bcb2, 0x019ad4b3, 0x0026fce1, 0x02b49c44, 0x010ec165, 0x03159c93, 0x036585f8, 0x00388365}}, Y: Field{[10]uint32{0x018f33fb, 0x01753766, 0x0031bfc8, 0x008059ab, 0x0321d082, 0x01aaed52, 0x0348b6bc, 0x00e18a62, 0x0133c7f6, 0x0018ed86}}}, + {X: Field{[10]uint32{0x00ecc18f, 0x033b00eb, 0x0093e42d, 0x0222cafc, 0x03659ba6, 0x001b6c77, 0x0298d945, 0x00778b2f, 0x019d00ca, 0x00221a2d}}, Y: Field{[10]uint32{0x00f2fd0e, 0x005760ff, 0x03076e22, 0x0146bed4, 0x02dea562, 0x01493afd, 0x01dbfe84, 0x023ec014, 0x030796b9, 0x003c0ba6}}}, + {X: Field{[10]uint32{0x01fb677c, 0x01606e22, 0x016a43f8, 0x0099e09b, 0x0099c832, 0x029afc3a, 0x005f86b9, 0x004d869e, 0x002fe32a, 0x0004267e}}, Y: Field{[10]uint32{0x0044445b, 0x03cdf627, 0x01aac7fc, 0x01866bfa, 0x02cd2d3e, 0x024bab11, 0x0320cd35, 0x03c9c4b3, 0x03f29aa7, 0x0004fee0}}}, + {X: Field{[10]uint32{0x01cbeea3, 0x00147d0d, 0x01d31ef2, 0x032bb8b5, 0x03deae65, 0x032986c9, 0x03329698, 0x039ecd7d, 0x029677ec, 0x0012be71}}, Y: Field{[10]uint32{0x024e5ef0, 0x00420999, 0x006985b2, 0x025a04c3, 0x00ebfe51, 0x00910229, 0x02e3f80a, 0x02a5dbe5, 0x0196429d, 0x001cc011}}}, + {X: Field{[10]uint32{0x03dab473, 0x00ed50d5, 0x02045edb, 0x022f45bb, 0x01300d1f, 0x01c4f2ae, 0x02d4bbe8, 0x02e2c0c8, 0x03ca5ace, 0x0025a032}}, Y: Field{[10]uint32{0x010df58a, 0x004c766f, 0x02aec0e9, 0x00f09e62, 0x006904ee, 0x0026ccf8, 0x014697c2, 0x02874bb3, 0x0140e36b, 0x000bca4e}}}, + {X: Field{[10]uint32{0x03fae7c2, 0x036e6b89, 0x000ee4e2, 0x03eb5ba7, 0x023eb7fd, 0x00520324, 0x01c37203, 0x011fc17e, 0x003afd63, 0x001fbbf3}}, Y: Field{[10]uint32{0x035cac06, 0x023c42fe, 0x0357e973, 0x0276b3ac, 0x007bb93d, 0x01eec78a, 0x0353e421, 0x017051f1, 0x02754f74, 0x002e3a7e}}}, + {X: Field{[10]uint32{0x039fddb4, 0x0351becb, 0x002fe98f, 0x0016c097, 0x01065e78, 0x02252557, 0x021fbf36, 0x004ae4d1, 0x0156d636, 0x0002e08c}}, Y: Field{[10]uint32{0x00bd465a, 0x02771604, 0x0360cdab, 0x031a8aa3, 0x00d0b537, 0x03a7ab75, 0x03453ebf, 0x03a47917, 0x017a826f, 0x003c8f14}}}, + {X: Field{[10]uint32{0x01bdadd9, 0x005134e1, 0x002b44d5, 0x008ba246, 0x01bfb9de, 0x00b9d96a, 0x0178706e, 0x03f55248, 0x035e2035, 0x003a0074}}, Y: Field{[10]uint32{0x02956a26, 0x0186025d, 0x03478481, 0x0000fea9, 0x011c2162, 0x00678dea, 0x00868e04, 0x039bc206, 0x023427de, 0x00079920}}}, + {X: Field{[10]uint32{0x01c67f3a, 0x0123d4b3, 0x01a1c2f3, 0x01402122, 0x0029fd77, 0x01fa243f, 0x00369e50, 0x0025a4a1, 0x010e56b7, 0x003a7518}}, Y: Field{[10]uint32{0x008e4a0e, 0x02a13fad, 0x02c1f7d9, 0x008895f0, 0x031df0e6, 0x03b9145a, 0x01bfca22, 0x020b868a, 0x02ac357d, 0x002397da}}}, + {X: Field{[10]uint32{0x03b7609b, 0x0206bdb4, 0x028ff4a4, 0x022838d4, 0x00b94bae, 0x011a0021, 0x00d7aa09, 0x0377b8d0, 0x030f51d6, 0x001c70fb}}, Y: Field{[10]uint32{0x015f6b96, 0x03d5f8cc, 0x03ca4544, 0x0351264b, 0x03db6886, 0x02985690, 0x00adc4da, 0x021e8c4e, 0x00dc2f80, 0x0013459d}}}, + {X: Field{[10]uint32{0x027d6f20, 0x02670392, 0x03947ce9, 0x020f055e, 0x0121aadb, 0x00e2aeb1, 0x038b44d9, 0x03107ef7, 0x0243b6f5, 0x002559f3}}, Y: Field{[10]uint32{0x03a35538, 0x0280084c, 0x00fe35e2, 0x0366cb79, 0x011fd0fd, 0x011730d7, 0x0247ca89, 0x028c6029, 0x0317031e, 0x00327618}}}, + {X: Field{[10]uint32{0x02dcc141, 0x02c8ade3, 0x0163eb9d, 0x014c3f62, 0x014f8fc7, 0x00468648, 0x033de850, 0x019ce442, 0x014f8116, 0x000d148f}}, Y: Field{[10]uint32{0x0022ac90, 0x03a43121, 0x01ce77d6, 0x0213c9df, 0x02877bca, 0x009df62e, 0x000a0660, 0x0223ae6e, 0x01fe268b, 0x002403ee}}}, + {X: Field{[10]uint32{0x03c1bd98, 0x002b5e78, 0x01278159, 0x03f2d873, 0x01f2993d, 0x0083973c, 0x034350bf, 0x010f7e8b, 0x037e5f1c, 0x001a7f47}}, Y: Field{[10]uint32{0x0051d7f3, 0x0327ce9b, 0x01615043, 0x008caf37, 0x0302d1c9, 0x0249de5c, 0x0315665a, 0x02502bb6, 0x02cf8b74, 0x0018cdc9}}}, + {X: Field{[10]uint32{0x014a3de7, 0x021e2bfa, 0x03aa2a9f, 0x01d78c5f, 0x02411b2a, 0x02d3f1ae, 0x006dd39b, 0x02e3dcc5, 0x0024c28c, 0x003930b1}}, Y: Field{[10]uint32{0x0321ae89, 0x022a527a, 0x01158fcc, 0x023a6cef, 0x01c86137, 0x00814573, 0x02607398, 0x017bd236, 0x03e8468e, 0x003ee345}}}, + {X: Field{[10]uint32{0x00e32773, 0x035ec78d, 0x019ea5de, 0x004c8984, 0x0398e445, 0x03125218, 0x01feb590, 0x005b4270, 0x019aada9, 0x0015c411}}, Y: Field{[10]uint32{0x023871bc, 0x00fb2939, 0x009f0738, 0x00abccfd, 0x02905bf1, 0x002a0d57, 0x016b4093, 0x00e96139, 0x01bdd2d8, 0x002277bb}}}, + {X: Field{[10]uint32{0x03d48e64, 0x0085e81b, 0x01bc189b, 0x02a642e1, 0x0359a3a8, 0x01c406c9, 0x0017f913, 0x001b856b, 0x02d41718, 0x00355beb}}, Y: Field{[10]uint32{0x00a6652c, 0x00c511cd, 0x038c76d7, 0x01de9221, 0x01ebe439, 0x00da3d52, 0x02f513f5, 0x02cb5ad8, 0x02c33408, 0x003ea1c7}}}, + {X: Field{[10]uint32{0x02599bcb, 0x014976ea, 0x003f7604, 0x004a0134, 0x00cb5cf0, 0x03b7e1f7, 0x0347be8e, 0x02016da2, 0x02ebda0b, 0x0039d05b}}, Y: Field{[10]uint32{0x01a56c19, 0x03d510ae, 0x01185bbc, 0x00dc4ec4, 0x03533d4f, 0x01f90c52, 0x03eb4c77, 0x0159f8c4, 0x0316f11c, 0x00218431}}}, + {X: Field{[10]uint32{0x01fa997d, 0x03c581f5, 0x0175f2d5, 0x0291b980, 0x02a4fbfc, 0x00f38cb1, 0x00606081, 0x00d50647, 0x0062ebdd, 0x00232966}}, Y: Field{[10]uint32{0x037698f4, 0x0355a478, 0x031c6980, 0x03bbeab5, 0x01113dd6, 0x00ac5343, 0x01fa1950, 0x03fab1ab, 0x000fb132, 0x002abcd2}}}, + {X: Field{[10]uint32{0x03243413, 0x02e9bc54, 0x0218172f, 0x0314a30a, 0x036eb8e4, 0x011b1480, 0x015867a8, 0x00ed1464, 0x00451fd4, 0x001925b7}}, Y: Field{[10]uint32{0x004da1f2, 0x01358939, 0x03e87cb1, 0x02f1722c, 0x03153fe2, 0x00a4b3c6, 0x00a281b9, 0x03267b80, 0x00410f85, 0x000113f7}}}, + {X: Field{[10]uint32{0x01925a5d, 0x02cbf064, 0x035d6c9c, 0x008753a3, 0x0067d207, 0x032b3348, 0x00bc248d, 0x0105aa8e, 0x0063aa82, 0x000e9091}}, Y: Field{[10]uint32{0x02fa9fb2, 0x01e11922, 0x03ca9c31, 0x02fea949, 0x00d4857a, 0x01f206fc, 0x00775cb3, 0x0096450d, 0x0063fd24, 0x001c6959}}}, + {X: Field{[10]uint32{0x0178c2e6, 0x01344274, 0x03418157, 0x0079ade1, 0x03881178, 0x02a17f98, 0x03f7985a, 0x014652b6, 0x030551d5, 0x001aa516}}, Y: Field{[10]uint32{0x0357ac44, 0x03a67fe6, 0x01d31924, 0x03c4c989, 0x0380df9a, 0x0099f289, 0x0021fc0d, 0x02a0d8c9, 0x003a1ca3, 0x00061b4d}}}, + {X: Field{[10]uint32{0x02add47f, 0x03f5df4e, 0x008aac9f, 0x003adfe3, 0x0132baac, 0x031704ec, 0x027381b8, 0x0012dedf, 0x0292682d, 0x0004fc7d}}, Y: Field{[10]uint32{0x02e99f0e, 0x02a92b89, 0x03ce2282, 0x00cce311, 0x03433725, 0x01745003, 0x03368528, 0x03fe227a, 0x01e49622, 0x0015ca81}}}, + {X: Field{[10]uint32{0x02804330, 0x0198d2f4, 0x02522a51, 0x001f9533, 0x01a27007, 0x03b6ddfd, 0x018e7b33, 0x03a3c7b6, 0x03c14f0d, 0x001e7e84}}, Y: Field{[10]uint32{0x01987c65, 0x02247bb5, 0x03aa096e, 0x02ad68bb, 0x00cf2484, 0x0183dc66, 0x001e40e0, 0x027b9cfd, 0x0188e196, 0x0028252f}}}, + {X: Field{[10]uint32{0x0133130a, 0x0280f6f9, 0x011019dd, 0x01f6ecf7, 0x01fb0837, 0x029b6acf, 0x033f7350, 0x006fdf09, 0x02dbd2c6, 0x0037c7fd}}, Y: Field{[10]uint32{0x023f886e, 0x02584764, 0x02824fd1, 0x02dd6ac3, 0x00cd0061, 0x023452a5, 0x025c969d, 0x021a264b, 0x03ad68c5, 0x0000bf71}}}, + {X: Field{[10]uint32{0x02cbdb34, 0x021b4a86, 0x032ec51d, 0x006f7de5, 0x032bff65, 0x00204331, 0x00f87760, 0x00e6b460, 0x02805f59, 0x002a088c}}, Y: Field{[10]uint32{0x03c2dfba, 0x013fed45, 0x025b5278, 0x00ab52c4, 0x01e7f2ef, 0x00010dd4, 0x02ea9b44, 0x00d8caca, 0x010f982e, 0x0025a056}}}, + {X: Field{[10]uint32{0x004c7c44, 0x01a9a212, 0x018c479e, 0x02b6e8ff, 0x02b3780f, 0x00f1ce4c, 0x010ada16, 0x02fd61a6, 0x00c049f3, 0x00101ac3}}, Y: Field{[10]uint32{0x036503dd, 0x008205f7, 0x012d31bb, 0x00ca1646, 0x028b2179, 0x0062bb9f, 0x0074fe02, 0x023951e4, 0x00eff250, 0x002aac39}}}, + {X: Field{[10]uint32{0x0116bcc8, 0x00cc033d, 0x014604b7, 0x03ab6eb2, 0x00523c81, 0x031366f2, 0x00f103db, 0x011e70f7, 0x03fd5783, 0x00139c10}}, Y: Field{[10]uint32{0x002d1133, 0x014f5a7a, 0x007fa98f, 0x02d9ce93, 0x0177c859, 0x01b24989, 0x0033ead6, 0x006f47a0, 0x03b73ed0, 0x000658a1}}}, + {X: Field{[10]uint32{0x033e9997, 0x03d003c3, 0x0344e43c, 0x0003a74b, 0x00a7d55b, 0x03c9301c, 0x0175c0ef, 0x0297d641, 0x0271b945, 0x002a68a9}}, Y: Field{[10]uint32{0x020c6285, 0x029636db, 0x014ca5b2, 0x0390ed1b, 0x039ae22c, 0x03dfcbcf, 0x03f957ca, 0x009c5459, 0x0220cb97, 0x001b3517}}}, + {X: Field{[10]uint32{0x003d3c01, 0x028ffca2, 0x0208b22b, 0x031da01d, 0x0312b2de, 0x00c569bb, 0x0247ae49, 0x02ba23ee, 0x039475ff, 0x001a4a84}}, Y: Field{[10]uint32{0x02e46131, 0x0197059b, 0x0340685a, 0x00fc2018, 0x00c83477, 0x029df458, 0x02867321, 0x01295302, 0x034a03c1, 0x001d3756}}}, + {X: Field{[10]uint32{0x022cfad8, 0x02aa3235, 0x016e77dd, 0x02b3d740, 0x01063b44, 0x0003f352, 0x0128e75d, 0x00e2ee22, 0x01fd1566, 0x000dbe45}}, Y: Field{[10]uint32{0x0042e8b9, 0x01fd76fa, 0x00e3c0cf, 0x02c38dff, 0x02991dc8, 0x008b3db7, 0x0217d027, 0x03460d7b, 0x02b616ed, 0x0000fc47}}}, + {X: Field{[10]uint32{0x02a53b31, 0x028e3592, 0x02c8f99a, 0x01f82ece, 0x00a5202a, 0x00d90c51, 0x002fd6ca, 0x00302d51, 0x035a7e01, 0x000fc3db}}, Y: Field{[10]uint32{0x0035c649, 0x027f41c3, 0x01f9ab86, 0x035fc4f3, 0x03ab1f9e, 0x02c3fecf, 0x00099acd, 0x038a6a54, 0x03cf5b33, 0x00095d35}}}, + {X: Field{[10]uint32{0x00b7b067, 0x02559ccd, 0x00cfd26b, 0x03eaff00, 0x03508a9d, 0x024aab3c, 0x01d4258a, 0x019876c8, 0x02ff071f, 0x0023163e}}, Y: Field{[10]uint32{0x03944893, 0x0285359c, 0x0273f694, 0x01c56778, 0x01e9a8a1, 0x002c44c9, 0x03d08a88, 0x013b8a10, 0x0094ea1d, 0x000e347a}}}, + {X: Field{[10]uint32{0x01da78de, 0x021fedf1, 0x03a9c0f2, 0x020219ad, 0x02dbc6f5, 0x036502c4, 0x03918642, 0x0068f192, 0x031a205c, 0x0036019c}}, Y: Field{[10]uint32{0x01d0e05e, 0x030bafb3, 0x02ba8d43, 0x001b4907, 0x03704020, 0x018d497e, 0x01da8318, 0x01eaedcd, 0x00302ff5, 0x0021c2a1}}}, + {X: Field{[10]uint32{0x03848648, 0x0108138a, 0x02741335, 0x00244ae6, 0x03416bde, 0x029f3765, 0x01de1515, 0x02c10693, 0x037e195d, 0x001f6f68}}, Y: Field{[10]uint32{0x00715e71, 0x03ec00c4, 0x00cf3885, 0x006a1ea3, 0x03e1c026, 0x00bd82a7, 0x0284ff13, 0x0001c3f7, 0x007a649d, 0x0020f227}}}, + {X: Field{[10]uint32{0x03ec54a1, 0x0233ba00, 0x0245e58d, 0x0149f52f, 0x03410a1b, 0x02dddb3e, 0x038ee093, 0x02c38b7d, 0x03c0c803, 0x0022bf08}}, Y: Field{[10]uint32{0x012ed76b, 0x03ba270d, 0x035b401b, 0x028ae5fa, 0x02bf7b11, 0x0218e52f, 0x02529573, 0x039282ce, 0x02ce4f4a, 0x002c107b}}}, + {X: Field{[10]uint32{0x0252207b, 0x02e4084d, 0x0211236f, 0x033795e1, 0x031b2531, 0x01588452, 0x0003b4b2, 0x03eac12e, 0x00c22c50, 0x00139109}}, Y: Field{[10]uint32{0x01796e6f, 0x02e74376, 0x02ab57e7, 0x0297052d, 0x03889d5c, 0x02c33c90, 0x03421e4f, 0x01c4603e, 0x01815118, 0x0008afd8}}}, + {X: Field{[10]uint32{0x02e97453, 0x024a5079, 0x023828fd, 0x03bb24ee, 0x02f394b1, 0x038e6cd2, 0x0016e396, 0x002be282, 0x03885a23, 0x00181c5d}}, Y: Field{[10]uint32{0x00dc4b26, 0x03d005c0, 0x016f49f8, 0x03ea278d, 0x03fc0a18, 0x037db6e1, 0x03247620, 0x02906c53, 0x029f2b9d, 0x002a137c}}}, + {X: Field{[10]uint32{0x00af3213, 0x00b28923, 0x022ac602, 0x01a40b70, 0x00a271f1, 0x02b3dc39, 0x03bbf8df, 0x015bb0de, 0x0120384e, 0x00327dcf}}, Y: Field{[10]uint32{0x01fb5437, 0x02897e23, 0x02cb069e, 0x022e5d85, 0x0089070e, 0x02fd6d5e, 0x03c9bfa8, 0x025606dc, 0x03f4c77f, 0x001d88b9}}}, + {X: Field{[10]uint32{0x0245282a, 0x0297b6bb, 0x03c4a81e, 0x02718c2f, 0x01a8b995, 0x023643db, 0x002bfea4, 0x0287630f, 0x01fbdab5, 0x00067a97}}, Y: Field{[10]uint32{0x01f1d56c, 0x03876e3f, 0x00c653b8, 0x0275f5b9, 0x00870a95, 0x03cc1ec7, 0x03a4d62a, 0x02f605f0, 0x015d0014, 0x0003084a}}}, + {X: Field{[10]uint32{0x01617b58, 0x032f9b70, 0x025cb290, 0x01a5c5f7, 0x02047806, 0x02febe14, 0x030e1491, 0x030a4b37, 0x031e30b2, 0x001592f6}}, Y: Field{[10]uint32{0x022b1c0d, 0x013dd39f, 0x01984700, 0x00703aee, 0x0332508c, 0x01dfd777, 0x02841988, 0x02e57e67, 0x00e86fc0, 0x0026a368}}}, + {X: Field{[10]uint32{0x010bf06b, 0x011a54df, 0x023b54bf, 0x00778376, 0x0150b39d, 0x02fb81ce, 0x02e21237, 0x039b3249, 0x00424f3e, 0x0016f24e}}, Y: Field{[10]uint32{0x00fd5d16, 0x0277a908, 0x01e00c11, 0x00eda52d, 0x0032bb00, 0x035d4e94, 0x03f4bd4c, 0x01e2f82d, 0x03a96627, 0x00353a70}}}, + {X: Field{[10]uint32{0x00b7f99e, 0x036e6f17, 0x003a5980, 0x00b68ba3, 0x035b2a5f, 0x02071f5f, 0x02f4fc31, 0x022d5cfb, 0x0294829e, 0x000650cb}}, Y: Field{[10]uint32{0x02bcbcf6, 0x039caee6, 0x003f7a4b, 0x0205715c, 0x032e8607, 0x01b806b3, 0x029316e3, 0x02159eed, 0x019e5c5b, 0x003dd726}}}, + {X: Field{[10]uint32{0x00080b8d, 0x00c33688, 0x01672ea2, 0x0346fbbc, 0x018d0235, 0x002c6d56, 0x02c28bfa, 0x0338668b, 0x001e6196, 0x0034e64a}}, Y: Field{[10]uint32{0x0168aa19, 0x013468d4, 0x03ea9638, 0x03c357b6, 0x03d5483c, 0x017ae90c, 0x02949319, 0x0338e8cf, 0x029520ff, 0x0000729f}}}, + {X: Field{[10]uint32{0x00e73c88, 0x032a3a84, 0x026bae21, 0x025dd2b8, 0x0239372e, 0x000bd995, 0x01f55563, 0x03ea7f95, 0x035ab220, 0x001b2138}}, Y: Field{[10]uint32{0x0101b2b3, 0x02d30084, 0x029b89a7, 0x0195c7bf, 0x0001d154, 0x003a2c8d, 0x01711e7b, 0x00b02b52, 0x032abd44, 0x00262846}}}, + {X: Field{[10]uint32{0x00f8f64b, 0x002a0328, 0x00858118, 0x02dba77d, 0x03ec4205, 0x020ef601, 0x0397f14c, 0x0117b685, 0x018ab1b0, 0x001e0533}}, Y: Field{[10]uint32{0x0115f33b, 0x038e34ed, 0x022841b0, 0x00c106bc, 0x036bf177, 0x03798eb7, 0x03e8b704, 0x02e3ffd4, 0x0240edc8, 0x003be45f}}}, + {X: Field{[10]uint32{0x0196235f, 0x0381b1c2, 0x03993fb6, 0x0035c4e2, 0x02444e71, 0x034a014c, 0x01accfcc, 0x008aa2ff, 0x02831c8e, 0x001e807b}}, Y: Field{[10]uint32{0x001a5519, 0x009f9f0a, 0x00b41045, 0x02606058, 0x00dcb061, 0x024370ef, 0x02f2e080, 0x0170aad8, 0x01091989, 0x003f944b}}}, + {X: Field{[10]uint32{0x039bd908, 0x02085f07, 0x000ce72e, 0x01bcfcf9, 0x01512e85, 0x0352979e, 0x00b56605, 0x0327be46, 0x02bcdf86, 0x001957b9}}, Y: Field{[10]uint32{0x02f87721, 0x0253d8c4, 0x035c3cae, 0x02e848f7, 0x037dfdef, 0x002079a6, 0x0196ea9d, 0x02c217ce, 0x01a691fc, 0x0032fae9}}}, + {X: Field{[10]uint32{0x025219bb, 0x021fb877, 0x01d9e1cf, 0x0051103c, 0x003d4d48, 0x01e045ef, 0x00be25fe, 0x01cba3ac, 0x0009fb03, 0x003af5a0}}, Y: Field{[10]uint32{0x0258814b, 0x039e6d2e, 0x0068bd8c, 0x02dbfd96, 0x036da8cd, 0x02f6dd7c, 0x00aed2d6, 0x037d56fc, 0x02386f96, 0x0023bedf}}}, + {X: Field{[10]uint32{0x01a3865b, 0x0358ed86, 0x039149f1, 0x033c45a3, 0x028b7834, 0x01f56af5, 0x015cf051, 0x016eed3a, 0x00189ac0, 0x0021cd02}}, Y: Field{[10]uint32{0x00480838, 0x00fe4f05, 0x0330cdf6, 0x03eb78af, 0x027d24c0, 0x03eb828f, 0x01d4deed, 0x003c5724, 0x012772ce, 0x0027c7ef}}}, + {X: Field{[10]uint32{0x00513df3, 0x03cb18cc, 0x0368ba12, 0x0136aa5b, 0x035dda3a, 0x0055a432, 0x0262e925, 0x01eed937, 0x0213b02a, 0x00186dac}}, Y: Field{[10]uint32{0x02b6144e, 0x01894230, 0x03d56e01, 0x03994e65, 0x03c42c6c, 0x03000e86, 0x02d29628, 0x020650da, 0x00f24eff, 0x00331c6e}}}, + {X: Field{[10]uint32{0x0125fe37, 0x0028190e, 0x0187298f, 0x0388060b, 0x02ed5e02, 0x02126106, 0x01c9e663, 0x006b8b8e, 0x024d7717, 0x0012e9fb}}, Y: Field{[10]uint32{0x0296dbd6, 0x0371cd23, 0x004f1f1f, 0x03ddd46f, 0x035a9da4, 0x02029c9b, 0x032158eb, 0x013c5b2d, 0x01b4fe34, 0x001736f5}}}, + {X: Field{[10]uint32{0x008badb7, 0x011f9bc8, 0x01de2ee2, 0x01c7fa78, 0x026f9a39, 0x01a24ba6, 0x025bd7a4, 0x037350cb, 0x027fc4d5, 0x0035609e}}, Y: Field{[10]uint32{0x0098e1fa, 0x03c28698, 0x00f18ca0, 0x0298ed4b, 0x002fb667, 0x02c8f183, 0x02fb5349, 0x00303d87, 0x02dc9d0e, 0x003de43e}}}, + {X: Field{[10]uint32{0x03237633, 0x032e6ca4, 0x0098d411, 0x03f72894, 0x01e9086d, 0x027bf9a4, 0x0144d4a8, 0x0033df03, 0x01597f95, 0x00207b14}}, Y: Field{[10]uint32{0x039a1e7f, 0x0182dcfa, 0x000655fa, 0x028aaa0a, 0x000741d3, 0x03e4bed8, 0x0253f28e, 0x03e03251, 0x03ddc9ef, 0x002216c9}}}, + {X: Field{[10]uint32{0x02b6dec7, 0x02e8bf5a, 0x01e684cd, 0x01e762b2, 0x026e7237, 0x03c2bfc7, 0x023e06da, 0x03da01da, 0x01f4a0d4, 0x000a3f10}}, Y: Field{[10]uint32{0x01657225, 0x0328aa92, 0x01f54d80, 0x0236c421, 0x01482c6a, 0x0056c8d7, 0x02b9415c, 0x02af1cfa, 0x031e7aff, 0x002c792b}}}, + {X: Field{[10]uint32{0x03ae4f47, 0x02c62a3d, 0x035d1328, 0x02333d66, 0x036341a8, 0x01fe8be7, 0x00f5b857, 0x01d71f2c, 0x03d6c5bf, 0x003579d4}}, Y: Field{[10]uint32{0x00a1bff9, 0x00315031, 0x013cffaf, 0x003765e5, 0x02fc2f38, 0x03b359ba, 0x018a10c8, 0x0068c894, 0x00b98eb0, 0x00346a95}}}, + {X: Field{[10]uint32{0x0076e836, 0x03521cc5, 0x0286d8ba, 0x00f5d624, 0x01257d41, 0x0130696a, 0x0008fac4, 0x010a5f98, 0x015d8909, 0x0005a08d}}, Y: Field{[10]uint32{0x0309cf4a, 0x001151ba, 0x02a0278d, 0x03677b53, 0x002ec9c2, 0x014fb613, 0x0059b11d, 0x024327a1, 0x0362e29f, 0x0013da71}}}, + {X: Field{[10]uint32{0x03e781db, 0x000902c8, 0x032e7903, 0x006b4089, 0x0273425d, 0x03311b88, 0x03511a78, 0x02b9ccba, 0x005fb64c, 0x0027bdea}}, Y: Field{[10]uint32{0x009ce73c, 0x02ce61f4, 0x0204b03e, 0x027ce9dd, 0x0278a50c, 0x03d7a4b8, 0x035e2f20, 0x01691cfc, 0x016f6f6a, 0x0031c80d}}}, + {X: Field{[10]uint32{0x02e915ec, 0x03b1c280, 0x03612dd7, 0x01a304f3, 0x02021744, 0x03383aaa, 0x031be48a, 0x02694932, 0x03b36f42, 0x0013daba}}, Y: Field{[10]uint32{0x038e761f, 0x0082c473, 0x036c6396, 0x01ba1e03, 0x010b28f9, 0x014adb5f, 0x02d36092, 0x035e400a, 0x014da8b6, 0x00101ab6}}}, + {X: Field{[10]uint32{0x023f8232, 0x01586ec8, 0x01f8e088, 0x03c690ac, 0x037a3cc7, 0x03035fa2, 0x0310dae5, 0x00b99999, 0x020e5ac0, 0x00132b0f}}, Y: Field{[10]uint32{0x03263142, 0x00168232, 0x019318ba, 0x015b0bf9, 0x03dca655, 0x0230a749, 0x03fcb9cd, 0x03cf2013, 0x008eaa96, 0x0024e5bb}}}, + {X: Field{[10]uint32{0x039367b8, 0x0282983d, 0x0193738e, 0x01e18186, 0x02f61fbd, 0x01931d81, 0x00a9dd10, 0x02b15cb1, 0x00633aa2, 0x00021bcd}}, Y: Field{[10]uint32{0x01824f05, 0x008f9609, 0x0312a03f, 0x0186d6b9, 0x03cfb2aa, 0x02d30e2b, 0x0376c9fd, 0x01e76d7d, 0x012b5561, 0x003200bf}}}, + {X: Field{[10]uint32{0x007103a9, 0x0371ffcd, 0x034da318, 0x008ee8f5, 0x000bcd6f, 0x0074e7ea, 0x025ab4cd, 0x03848f9e, 0x01457685, 0x0014c8fc}}, Y: Field{[10]uint32{0x00691cb1, 0x0000de22, 0x028e3461, 0x03c7fb87, 0x0394cab4, 0x02efce3e, 0x01ec977c, 0x02ca784b, 0x0379eccc, 0x000c24be}}}, + {X: Field{[10]uint32{0x03ea74fd, 0x03c45e0c, 0x030e71a7, 0x001a60ff, 0x03f85cf1, 0x02838717, 0x000c45f3, 0x00471f9a, 0x01464027, 0x0034f5c3}}, Y: Field{[10]uint32{0x00d07bad, 0x01bd896a, 0x03c90fdf, 0x03cf855d, 0x01e4f722, 0x03ba9fee, 0x0093b9e0, 0x003cc45a, 0x0373d9b9, 0x00246609}}}, + {X: Field{[10]uint32{0x036d4359, 0x02192ef6, 0x02fdd6fd, 0x03e86ac7, 0x01f8cb89, 0x00d953c7, 0x01b5d714, 0x01d84c0b, 0x013728a8, 0x0037d8ee}}, Y: Field{[10]uint32{0x02ce5510, 0x02b2ded8, 0x012a791b, 0x035212de, 0x02a2c7be, 0x00cbe96c, 0x03930348, 0x00fb2db1, 0x01ca191a, 0x001f0ede}}}, + {X: Field{[10]uint32{0x01b70c74, 0x01afa15c, 0x00ec3974, 0x02531f7b, 0x0328a994, 0x0138898a, 0x0303169a, 0x00d3657c, 0x02228cc3, 0x003c7fa4}}, Y: Field{[10]uint32{0x0351a10e, 0x03944db9, 0x02b6469d, 0x00d630a3, 0x03b67a24, 0x0266bc78, 0x0335f60f, 0x03e9ca8a, 0x03b84e65, 0x0015623c}}}, + {X: Field{[10]uint32{0x0274fd95, 0x0324216e, 0x03c7dcb3, 0x02d7e8a7, 0x00fb0adb, 0x01f2ca34, 0x03ec14cb, 0x028cc3b7, 0x035d918c, 0x00240c39}}, Y: Field{[10]uint32{0x00b427f7, 0x0366768e, 0x004cd71a, 0x0304eef7, 0x035a452d, 0x00e2b7b5, 0x0128821c, 0x02261302, 0x01286169, 0x001f7c80}}}, + {X: Field{[10]uint32{0x03ad641a, 0x01f3d71d, 0x007d5ddd, 0x0218b0f3, 0x03dfa0b5, 0x01d9047a, 0x00f628c5, 0x036e1c4d, 0x013935be, 0x000734f0}}, Y: Field{[10]uint32{0x039a324d, 0x012f7852, 0x02bcf592, 0x03c40c3e, 0x0288264c, 0x03211ec9, 0x013a25e0, 0x02ec22fa, 0x01f25488, 0x0008553b}}}, + {X: Field{[10]uint32{0x0046ad96, 0x03c49f49, 0x01f42202, 0x03feb265, 0x03bd6e91, 0x03b0356e, 0x039f4621, 0x03b1f1e2, 0x0337a19f, 0x00395b81}}, Y: Field{[10]uint32{0x02ad70d7, 0x02226a8f, 0x0177698f, 0x00bd2cbb, 0x011e69b4, 0x01a4fa5d, 0x028d9bbb, 0x01d83902, 0x0027368c, 0x00220c36}}}, + {X: Field{[10]uint32{0x03b6b101, 0x0398fc57, 0x02657587, 0x0219e021, 0x0156fd08, 0x012b6299, 0x026dfeb2, 0x03978d8f, 0x02c458ab, 0x0006c29a}}, Y: Field{[10]uint32{0x035178dc, 0x00b3124c, 0x01926521, 0x01acb87d, 0x029a35e8, 0x03777b97, 0x033e5aab, 0x018e8ac4, 0x03dae642, 0x0034b7db}}}, + {X: Field{[10]uint32{0x03ea22b2, 0x03302048, 0x00679d80, 0x01d9173f, 0x0250bb16, 0x011b58a8, 0x01390a62, 0x0186393b, 0x01468fd4, 0x00042850}}, Y: Field{[10]uint32{0x0140185f, 0x00ce003f, 0x015620b0, 0x0096f0c3, 0x01f9a09b, 0x013aec54, 0x0113dbaf, 0x03746bb3, 0x0068dd7f, 0x000ce0ee}}}, + {X: Field{[10]uint32{0x003f5e35, 0x00f90669, 0x006ac8a7, 0x035e5755, 0x02e357f7, 0x01a2be9c, 0x038837e5, 0x028d45b6, 0x03515378, 0x0027712a}}, Y: Field{[10]uint32{0x0305903f, 0x02359a98, 0x01a06cc6, 0x0386410e, 0x02bfe05c, 0x03a9647b, 0x02422be1, 0x033eff8a, 0x022d9bce, 0x0002376a}}}, + {X: Field{[10]uint32{0x00ed7196, 0x02b1db8f, 0x035de1aa, 0x0264d880, 0x0213539e, 0x0226c82b, 0x038eb19e, 0x0387ef14, 0x035de7a4, 0x002aa4c5}}, Y: Field{[10]uint32{0x02afb9ad, 0x02e192b0, 0x01a05eff, 0x01afb38f, 0x00c18d14, 0x022d2001, 0x03e133ad, 0x0115a27c, 0x0304c134, 0x003b73b6}}}, + {X: Field{[10]uint32{0x022edf7b, 0x03bdbec8, 0x00e27536, 0x03e8d753, 0x0294f3ce, 0x0341b31a, 0x036fcbc6, 0x0366822e, 0x03e4da02, 0x00205c7c}}, Y: Field{[10]uint32{0x01e6dd6b, 0x0272967a, 0x03189749, 0x02de9963, 0x03c32038, 0x00f06993, 0x002b55f7, 0x00aae870, 0x01fcaae6, 0x003a46f9}}}, + {X: Field{[10]uint32{0x02a19ab6, 0x00201606, 0x024b111b, 0x009d0dd1, 0x01893fe6, 0x031e73de, 0x01888c93, 0x00a3998d, 0x0183c891, 0x00147db2}}, Y: Field{[10]uint32{0x0081a067, 0x003c164e, 0x03252a3d, 0x0003578d, 0x00b8cee4, 0x02a37194, 0x001dbf41, 0x0193d483, 0x01494bb1, 0x00174bbc}}}, + {X: Field{[10]uint32{0x03d7d38a, 0x002ae3db, 0x02580950, 0x02b1d36b, 0x03ec34df, 0x036c3769, 0x01016b19, 0x00c371a9, 0x0184766b, 0x0030287c}}, Y: Field{[10]uint32{0x02c6f01e, 0x024d65fa, 0x01490528, 0x007b1a57, 0x01b27f36, 0x009349aa, 0x01410516, 0x036bc4a7, 0x03e2c7b6, 0x002f72b4}}}, + {X: Field{[10]uint32{0x03a0eb02, 0x00e51c8c, 0x00a222bd, 0x026c7ade, 0x02fde927, 0x00d07bee, 0x02b6fe07, 0x0145a412, 0x02cc9543, 0x002c6ec7}}, Y: Field{[10]uint32{0x001689a8, 0x02fead32, 0x021d55a7, 0x02137931, 0x014b1490, 0x01c78325, 0x00dbf0a6, 0x010b8b03, 0x035b5253, 0x0037d48f}}}, + {X: Field{[10]uint32{0x000b5dce, 0x00f79f59, 0x00470180, 0x039da063, 0x023b0891, 0x010dce47, 0x0139ea7e, 0x013b5621, 0x00dc86d0, 0x002d730c}}, Y: Field{[10]uint32{0x02d4ec14, 0x00798bd0, 0x00b65ca4, 0x0077fff9, 0x009f5556, 0x00b80fca, 0x031acc86, 0x00c4b43e, 0x019e45c7, 0x003c7303}}}, + {X: Field{[10]uint32{0x0263ccb6, 0x03a503e4, 0x016b0da8, 0x008d47f8, 0x008cacee, 0x01f56507, 0x0155b3ea, 0x03fd4ca0, 0x01e705f0, 0x00378ad2}}, Y: Field{[10]uint32{0x018de99f, 0x01364fdb, 0x032ab74b, 0x02d5c0d5, 0x024690d5, 0x01e0552b, 0x017c6801, 0x02fd9ec3, 0x002bb12d, 0x000d35e9}}}, + {X: Field{[10]uint32{0x03cc8f51, 0x017cf395, 0x0311ad51, 0x02c3bcbb, 0x00ea5c0d, 0x0161c33f, 0x00984046, 0x03845c3a, 0x00e7c129, 0x0022c63d}}, Y: Field{[10]uint32{0x01111f37, 0x00b80226, 0x00aff884, 0x009f9acb, 0x0372281c, 0x0323b72c, 0x01e9d6cd, 0x012964f1, 0x0086c867, 0x001ac784}}}, + {X: Field{[10]uint32{0x03c86889, 0x0160aa45, 0x03442f9e, 0x0092da97, 0x01822ce4, 0x018aa0c3, 0x00e46f17, 0x03222246, 0x02c027ce, 0x001c9c58}}, Y: Field{[10]uint32{0x03223cca, 0x01bce28b, 0x02e7e841, 0x008f3145, 0x03248656, 0x024f9491, 0x03de5af6, 0x028da79b, 0x02961452, 0x00378d20}}}, + {X: Field{[10]uint32{0x0105058c, 0x0215adcd, 0x016056d0, 0x03f28fd8, 0x02946a75, 0x0309252f, 0x00eb9b81, 0x01d20fc6, 0x001f4dd1, 0x0012b93f}}, Y: Field{[10]uint32{0x032563e7, 0x011a4843, 0x017a39ae, 0x00db8b18, 0x0059999b, 0x0361e11c, 0x0034a05b, 0x03f05f68, 0x0012e901, 0x00361f9e}}}, + {X: Field{[10]uint32{0x03f43cd1, 0x00548197, 0x010bf58b, 0x02e93bda, 0x0272007b, 0x01abff40, 0x0026f016, 0x01cffa46, 0x01ace9e8, 0x003a42f2}}, Y: Field{[10]uint32{0x0164fa87, 0x0398d811, 0x02d58905, 0x00b34b95, 0x0147f076, 0x0196e6ff, 0x009b0c00, 0x03f5a147, 0x00e89acd, 0x0012f208}}}, + {X: Field{[10]uint32{0x011450ba, 0x0101db7d, 0x010209af, 0x0295fc14, 0x0208340b, 0x03a7bdd1, 0x021af7db, 0x00bedbde, 0x02a1db43, 0x002e82b9}}, Y: Field{[10]uint32{0x012be720, 0x021dabe4, 0x02908c58, 0x00630cba, 0x0351019a, 0x0068b0c2, 0x029894c5, 0x0250805c, 0x01b70409, 0x001f4e0e}}}, + {X: Field{[10]uint32{0x03accfeb, 0x020808b4, 0x03a5def8, 0x02fca607, 0x034f9682, 0x035ee5f5, 0x018b403e, 0x0194c476, 0x0381f77c, 0x001c1986}}, Y: Field{[10]uint32{0x02d06387, 0x02f13929, 0x0277e4e5, 0x02497d19, 0x027b4eeb, 0x02c1bf99, 0x024bd7cf, 0x027d366b, 0x01731895, 0x002408ae}}}, + {X: Field{[10]uint32{0x00471a47, 0x038248bf, 0x011d80e5, 0x0056347c, 0x0029451c, 0x0367be8e, 0x0381b817, 0x00e81c47, 0x03472815, 0x003f86de}}, Y: Field{[10]uint32{0x02b0f847, 0x02280d34, 0x01fae19c, 0x037c8d13, 0x0285725b, 0x03930c6a, 0x0115dc05, 0x02df1bec, 0x01cc68cf, 0x0025681d}}}, + {X: Field{[10]uint32{0x02cc3fc0, 0x01c3dfa6, 0x01e867ab, 0x00dfb171, 0x004325bc, 0x009f8e97, 0x0013d04f, 0x02a41ca0, 0x03d2bbae, 0x0022b3ce}}, Y: Field{[10]uint32{0x0216174e, 0x012195cf, 0x00785ee1, 0x03bf6f8b, 0x01b3e2e0, 0x02547e03, 0x01c06a25, 0x009f53ca, 0x03fb36da, 0x003d9e78}}}, + {X: Field{[10]uint32{0x02f395e3, 0x03aa3612, 0x0314f1d6, 0x03443283, 0x00d2db01, 0x03d8ae9f, 0x03fc6a47, 0x01f56ae1, 0x013725fc, 0x00076157}}, Y: Field{[10]uint32{0x020b1b90, 0x037234c0, 0x012a5815, 0x03436a24, 0x019b0a9a, 0x0189a317, 0x0255183f, 0x01953b51, 0x03ac2d41, 0x0033ac98}}}, + {X: Field{[10]uint32{0x012a8cba, 0x009b5c16, 0x0302e039, 0x02601147, 0x03099344, 0x01c3466d, 0x00ec6f6d, 0x01338f21, 0x016630c2, 0x0006aed1}}, Y: Field{[10]uint32{0x00525885, 0x0065521d, 0x01863f4b, 0x024d048a, 0x021778d2, 0x00c91514, 0x01886ef7, 0x01ff5cab, 0x006f6be8, 0x001189dc}}}, + {X: Field{[10]uint32{0x03eac036, 0x03cafaa4, 0x00a5fb86, 0x01992c26, 0x03620e5c, 0x0128fcc2, 0x01d07e24, 0x004bfe59, 0x00fa672c, 0x0006d1e4}}, Y: Field{[10]uint32{0x03edd60e, 0x00634939, 0x012831b0, 0x01c27278, 0x017c19fd, 0x02e0e47f, 0x022a9a06, 0x038b47ca, 0x00fca758, 0x003bb414}}}, + {X: Field{[10]uint32{0x00de3dd3, 0x00dcca9a, 0x01c98a43, 0x0280878f, 0x0344c106, 0x01584d9e, 0x01dcfc12, 0x032238c3, 0x032cfc9c, 0x001861e2}}, Y: Field{[10]uint32{0x02aed78e, 0x000037c7, 0x0229d436, 0x002dac4f, 0x03afc6f5, 0x0262a7be, 0x014cb774, 0x009e746d, 0x00a0037c, 0x003e8915}}}, + {X: Field{[10]uint32{0x0144308a, 0x010042a1, 0x030b5335, 0x006a4c5c, 0x00abc727, 0x0114088e, 0x00c21ecf, 0x03fac5ef, 0x01f02767, 0x00210123}}, Y: Field{[10]uint32{0x0193c32f, 0x03223b3a, 0x00b7c838, 0x02a90e33, 0x02605acc, 0x01dd8f1b, 0x03f9814f, 0x00239751, 0x024a39d6, 0x00351c4b}}}, + {X: Field{[10]uint32{0x02683a94, 0x02eb0cf2, 0x015cf889, 0x0032a201, 0x018ba37d, 0x01fa27e5, 0x031e1e03, 0x005d7b0f, 0x00e56c96, 0x003adeb1}}, Y: Field{[10]uint32{0x0285da8a, 0x00e053d7, 0x030112bc, 0x00ccbd45, 0x03cc07de, 0x004f7f1b, 0x00bfe075, 0x009d2db6, 0x02672ccc, 0x00125078}}}, + {X: Field{[10]uint32{0x02142e91, 0x00656bc8, 0x03eaf1a4, 0x0154e027, 0x014cbce4, 0x000a2370, 0x02b452ba, 0x012f6ad8, 0x02c9877d, 0x001228da}}, Y: Field{[10]uint32{0x0369659c, 0x0143aeaa, 0x02e2530b, 0x027087fd, 0x0027eec3, 0x013a5436, 0x02d88480, 0x018a21b1, 0x018a0125, 0x0038935b}}}, + {X: Field{[10]uint32{0x00cca1b5, 0x00b385af, 0x02a91252, 0x019320b4, 0x02e817b6, 0x02c8e803, 0x029af3b1, 0x028975e1, 0x01d05a62, 0x00270c49}}, Y: Field{[10]uint32{0x01e5afe3, 0x026daf4e, 0x03450a18, 0x0185541a, 0x01385663, 0x03863d7d, 0x00172774, 0x01c5a061, 0x0210f670, 0x0031bb36}}}, + {X: Field{[10]uint32{0x00f80d68, 0x02a479a4, 0x0116bc2c, 0x03b526bc, 0x0310160b, 0x013722f8, 0x033843e0, 0x019c371f, 0x0221dcc7, 0x000cfa07}}, Y: Field{[10]uint32{0x01757b6f, 0x024a4195, 0x01bb8fa5, 0x03a27b01, 0x029ce417, 0x03bf8e2b, 0x01f11678, 0x021b4b9b, 0x01d3a0a3, 0x0039a530}}}, + {X: Field{[10]uint32{0x036a1ad2, 0x00700cc6, 0x03056d8e, 0x012e29a3, 0x035c1d0d, 0x00256609, 0x02b10715, 0x0383f2ff, 0x029e6899, 0x002550dd}}, Y: Field{[10]uint32{0x009b0d7e, 0x01e54d3b, 0x00b163f5, 0x0219fd9a, 0x0301c4be, 0x00bb473a, 0x035f1487, 0x021041d8, 0x03fdafc5, 0x0001c033}}}, + {X: Field{[10]uint32{0x0039efdd, 0x0142099d, 0x00203a0d, 0x018f8877, 0x026ca9b1, 0x02d4201f, 0x0081e6e5, 0x00b0e5f5, 0x00d173e6, 0x0013d073}}, Y: Field{[10]uint32{0x0069f79d, 0x0339df43, 0x011eed95, 0x02ff8563, 0x008fea56, 0x02dd2c95, 0x00b309ba, 0x0065cb62, 0x02d6aa8c, 0x003efe63}}}, + {X: Field{[10]uint32{0x005f12e5, 0x03b3c819, 0x03bd9064, 0x01a91946, 0x00a667fe, 0x023baf0a, 0x03fd9c33, 0x00037ef8, 0x0245584b, 0x00133eda}}, Y: Field{[10]uint32{0x0214652b, 0x006486bd, 0x0312f550, 0x028979ca, 0x00219638, 0x00495640, 0x00fac21d, 0x003a1d1c, 0x02dafe08, 0x000b77f5}}}, + {X: Field{[10]uint32{0x01eca626, 0x005dd5dd, 0x039821f2, 0x0324605f, 0x038e536b, 0x03eb94ce, 0x02217fd8, 0x028cf297, 0x03ecd9bb, 0x0027bee2}}, Y: Field{[10]uint32{0x00658fb4, 0x003e32ac, 0x02f8e944, 0x02e21d78, 0x018e3573, 0x029f70f8, 0x00bcf9c1, 0x03057a46, 0x00ed0529, 0x001984c0}}}, + {X: Field{[10]uint32{0x0030e441, 0x039876b9, 0x02470da9, 0x03e7a143, 0x00f5d3c0, 0x02f9b717, 0x01ab953e, 0x039302e1, 0x01525be7, 0x0030aa02}}, Y: Field{[10]uint32{0x009d9d2d, 0x02713be0, 0x0277b483, 0x018f5434, 0x036be063, 0x03027ef0, 0x026fa221, 0x01a5f1f6, 0x0136bf72, 0x00074b7b}}}, + {X: Field{[10]uint32{0x03baa707, 0x010b808e, 0x0030c0a2, 0x02d006fe, 0x032501a1, 0x031882c4, 0x02162764, 0x0208afd6, 0x036b49ae, 0x0010adff}}, Y: Field{[10]uint32{0x02b71d6d, 0x00288da0, 0x028b0eb9, 0x0254317a, 0x00fb2c75, 0x032ed68e, 0x02de994d, 0x039001c4, 0x005883f0, 0x003907f8}}}, + {X: Field{[10]uint32{0x03b0c28c, 0x007c38aa, 0x0386df78, 0x02d1fb8e, 0x01e00cc3, 0x017de3ce, 0x03e15185, 0x02d904ab, 0x0129d420, 0x003b82ec}}, Y: Field{[10]uint32{0x000aec61, 0x00d0fad7, 0x01099258, 0x015552ba, 0x0154b174, 0x003b6eb7, 0x006204b6, 0x02891d9f, 0x027a5a4f, 0x003dc743}}}, + {X: Field{[10]uint32{0x00ef5b9a, 0x0121f01e, 0x02e789ca, 0x0390a894, 0x0077546c, 0x009b140f, 0x031a7160, 0x00efd499, 0x02079cdb, 0x0007c762}}, Y: Field{[10]uint32{0x03571c20, 0x027a6365, 0x01cfc5c3, 0x02a98f47, 0x00180ee4, 0x03ef0c19, 0x00e8e6f9, 0x0144b7aa, 0x030dae55, 0x00318444}}}, + {X: Field{[10]uint32{0x02a31310, 0x004bfb34, 0x017b8b29, 0x01b97e4c, 0x027cf313, 0x01063c05, 0x026ebe55, 0x027ec564, 0x0006ecdc, 0x0016f6a7}}, Y: Field{[10]uint32{0x005ecad7, 0x02370a01, 0x023feb72, 0x01a285ed, 0x03890761, 0x01cbab6c, 0x03e59d5b, 0x00983203, 0x0370dce1, 0x000d63fe}}}, + {X: Field{[10]uint32{0x03866ea6, 0x011d5137, 0x01be91f8, 0x01cd2018, 0x01edc789, 0x0383bf5c, 0x0252dec8, 0x031c9d99, 0x0103fa50, 0x0030cbd9}}, Y: Field{[10]uint32{0x01fca304, 0x02e71c40, 0x008566de, 0x00a882e0, 0x006a34af, 0x02c4fc2c, 0x0309443c, 0x03b3101e, 0x02267a13, 0x0019c8d2}}}, + {X: Field{[10]uint32{0x0089caed, 0x0337aa25, 0x03069941, 0x01ce25ae, 0x00849bb6, 0x02584990, 0x026c83f2, 0x03ac19c3, 0x0111b71f, 0x001520f5}}, Y: Field{[10]uint32{0x008c1148, 0x034e49f6, 0x03ecfbfe, 0x0141e512, 0x03494d53, 0x03639377, 0x02df0f38, 0x00d0dd02, 0x0262d323, 0x0028269a}}}, + {X: Field{[10]uint32{0x02a322ef, 0x00625603, 0x010472d5, 0x03f6710f, 0x02d5e3c6, 0x029b3091, 0x00b93425, 0x01aae47b, 0x035ff0b8, 0x000f4b63}}, Y: Field{[10]uint32{0x0155b830, 0x027cd936, 0x00509c73, 0x03b28613, 0x00fb45d7, 0x01c75d82, 0x039cf4ab, 0x03381461, 0x008b4c23, 0x0010620d}}}, + {X: Field{[10]uint32{0x01af1dc0, 0x011d5d08, 0x01e9e40b, 0x000eaae2, 0x00735ddf, 0x024daf04, 0x01ffa9df, 0x019e017f, 0x013929ed, 0x000e970e}}, Y: Field{[10]uint32{0x00a7011d, 0x020893a4, 0x0081e0dd, 0x00aea517, 0x0344dcd5, 0x00a5d720, 0x002a7de2, 0x00a458ab, 0x01197675, 0x001d82c6}}}, + {X: Field{[10]uint32{0x00590a83, 0x03752135, 0x01f900e5, 0x0120cdcf, 0x00648869, 0x03892831, 0x039272ef, 0x0301b8fb, 0x02ac7c1c, 0x0028f548}}, Y: Field{[10]uint32{0x021b6be2, 0x007cb13b, 0x00795566, 0x031a4c15, 0x0328c377, 0x000005a5, 0x01684a95, 0x03758486, 0x022cb739, 0x001bd4ee}}}, + {X: Field{[10]uint32{0x00e8180f, 0x01451176, 0x01d42367, 0x021f76e5, 0x02c1437d, 0x00b80aa8, 0x00785836, 0x00806110, 0x01311399, 0x003bc2c2}}, Y: Field{[10]uint32{0x0086c634, 0x03210ae5, 0x019801b9, 0x0029065c, 0x00217352, 0x024be31d, 0x00408cdf, 0x011dc9f4, 0x00078d18, 0x001cefd1}}}, + {X: Field{[10]uint32{0x0115da20, 0x01bd031b, 0x03e070f2, 0x01734728, 0x02a770c1, 0x01846169, 0x02118991, 0x033ae708, 0x03fd1498, 0x0020503b}}, Y: Field{[10]uint32{0x0022a474, 0x03127f40, 0x01c3e45f, 0x0008280b, 0x03051c11, 0x0058bc0e, 0x028b7eb2, 0x02dfc6f9, 0x03df6d2d, 0x00131d3c}}}, + {X: Field{[10]uint32{0x03e122f0, 0x02966f3a, 0x00b74215, 0x03c000de, 0x017603c7, 0x03f5bf59, 0x0132f4d3, 0x027c7e4f, 0x03208e08, 0x000d1175}}, Y: Field{[10]uint32{0x010b6d5b, 0x0388e922, 0x013d4b63, 0x00dfa0a5, 0x0238da06, 0x000db868, 0x03c8626f, 0x013bcce8, 0x035dfdb5, 0x001b5040}}}, + {X: Field{[10]uint32{0x03a58cd7, 0x008f50fd, 0x02b9c72c, 0x01b57f9a, 0x01789a36, 0x00493378, 0x01933f97, 0x00da6874, 0x025a6235, 0x003852ca}}, Y: Field{[10]uint32{0x01fc8f8f, 0x011342fe, 0x013be447, 0x00658954, 0x01d67a9f, 0x022a7962, 0x02fe6ce5, 0x030409b2, 0x02c52f63, 0x00085bc1}}}, + {X: Field{[10]uint32{0x01891e0b, 0x00fa4b8b, 0x00deaf8f, 0x00199cd2, 0x00eec931, 0x0302205c, 0x010b2b33, 0x02f113f3, 0x00bc8389, 0x001b6590}}, Y: Field{[10]uint32{0x0104227d, 0x00af105f, 0x0331a185, 0x02c20586, 0x0068b5d4, 0x010a21ff, 0x0204759a, 0x036d927f, 0x00856e42, 0x0012d305}}}, + {X: Field{[10]uint32{0x019b2916, 0x002bf3bf, 0x0232462a, 0x0016e781, 0x02fd028a, 0x01f00ec6, 0x027cc60d, 0x007c84fd, 0x00045c46, 0x0009cbc5}}, Y: Field{[10]uint32{0x03348416, 0x03350cea, 0x00b1e825, 0x020cc551, 0x03fd6b75, 0x0003ac37, 0x023f78d8, 0x00d4e029, 0x02c0c0b2, 0x002618d7}}}, + {X: Field{[10]uint32{0x033a07e3, 0x00ca7b87, 0x02257681, 0x013b7a45, 0x02415233, 0x0378738e, 0x01250bec, 0x01d1698c, 0x0128eaae, 0x002a3266}}, Y: Field{[10]uint32{0x03351621, 0x03358479, 0x006209f5, 0x02df9879, 0x0124ae51, 0x0058bfb4, 0x01149aa5, 0x00fdfa38, 0x0286abdf, 0x00133309}}}, + {X: Field{[10]uint32{0x00975409, 0x00e18036, 0x01ceffac, 0x01403f4c, 0x011c660d, 0x02c79320, 0x01be6869, 0x03559626, 0x03337f93, 0x003ec092}}, Y: Field{[10]uint32{0x00c7fdb0, 0x01cbd1f1, 0x01e127b0, 0x028a2765, 0x03ee562c, 0x0115e59b, 0x00730c39, 0x00f255fa, 0x02b78bff, 0x000ce5a1}}}, + {X: Field{[10]uint32{0x00562f9c, 0x021c15ca, 0x014f2351, 0x03e73912, 0x00a6cb14, 0x0246e136, 0x03ecfe36, 0x00d525dc, 0x0147aa61, 0x00383921}}, Y: Field{[10]uint32{0x00a7b307, 0x01dbbbf7, 0x03676a6d, 0x03e1a7d1, 0x03778609, 0x00e58012, 0x03488389, 0x01d60149, 0x018b5640, 0x00182db7}}}, + {X: Field{[10]uint32{0x025d16e4, 0x01bbd644, 0x02169807, 0x00f77fb0, 0x03ed9e38, 0x001786c2, 0x0374d296, 0x022d4c27, 0x002d378b, 0x002f5b10}}, Y: Field{[10]uint32{0x01ef2c24, 0x0086c8a7, 0x00f10755, 0x012de544, 0x02a27692, 0x0231b4b0, 0x036a8f8c, 0x0071ecdd, 0x009cbb76, 0x00330eab}}}, + {X: Field{[10]uint32{0x01e451c0, 0x0085eb01, 0x02ef552c, 0x02f78542, 0x01d5886c, 0x03da548d, 0x00e2c554, 0x013d1051, 0x0231eefa, 0x0039a464}}, Y: Field{[10]uint32{0x03b1cfa7, 0x02ea6b18, 0x0346bc2a, 0x03f1a49f, 0x0173a888, 0x00a8473f, 0x0156133c, 0x00984ad3, 0x01d4d34d, 0x0039d3b8}}}, + {X: Field{[10]uint32{0x003d03a9, 0x02e92868, 0x01463f9c, 0x007a3051, 0x02037c48, 0x00a2f6ce, 0x012ac5a3, 0x01e1d136, 0x006a2a48, 0x0006a6b3}}, Y: Field{[10]uint32{0x01f0fb10, 0x01f1623f, 0x01ca126a, 0x0206d26d, 0x02df71fc, 0x01ff87d7, 0x02224224, 0x00d8a3eb, 0x029a960e, 0x0002e981}}}, + {X: Field{[10]uint32{0x02070910, 0x033bd33d, 0x028d536c, 0x0108f5b6, 0x00abfde6, 0x00b6e66e, 0x004e9395, 0x038c07cb, 0x03a92e5f, 0x0016d4ae}}, Y: Field{[10]uint32{0x0347ae29, 0x01bb796d, 0x00341f54, 0x02c0bf9d, 0x02cc1ab1, 0x01c6bb42, 0x00c68f0a, 0x0089f446, 0x03dd901e, 0x00042376}}}, + {X: Field{[10]uint32{0x01e05242, 0x00ce29ac, 0x022860f1, 0x02935fe6, 0x000652b0, 0x00ef8a0a, 0x01a096a7, 0x020aa6c4, 0x03601ebe, 0x0024b04d}}, Y: Field{[10]uint32{0x02449d7c, 0x02b01b02, 0x0027559f, 0x02f74538, 0x0251a588, 0x017db1e6, 0x003dd578, 0x0343e975, 0x03fc2dc6, 0x000b8fa4}}}, + {X: Field{[10]uint32{0x014318b8, 0x03ff97c7, 0x01d69a12, 0x01e7d818, 0x0194b4f2, 0x022550af, 0x021c749e, 0x01305dce, 0x00da7996, 0x000f2dbe}}, Y: Field{[10]uint32{0x03b11956, 0x02e904da, 0x01d54d05, 0x01c5b9ac, 0x0272a777, 0x02bb8a55, 0x023bd02f, 0x016b6370, 0x01a8b4f4, 0x0010b930}}}, + {X: Field{[10]uint32{0x03dbf5db, 0x00545142, 0x0183f664, 0x01366a00, 0x013c60a1, 0x01437839, 0x01a51100, 0x00637444, 0x0351d345, 0x0017fb58}}, Y: Field{[10]uint32{0x0346c3f6, 0x0299621d, 0x036cd056, 0x0078a579, 0x01da77e0, 0x026f60dd, 0x00140b64, 0x029342dd, 0x0190de07, 0x001ade69}}}, + {X: Field{[10]uint32{0x015d3840, 0x0064f8f6, 0x0356e7d3, 0x02c7f43e, 0x00a14132, 0x0301844a, 0x00245d37, 0x0213cadf, 0x00a781c3, 0x000ae23c}}, Y: Field{[10]uint32{0x01a0e10e, 0x021cfe22, 0x02981bd4, 0x02e520e2, 0x00c1632b, 0x0089125d, 0x01b6453c, 0x01b95d95, 0x03a21144, 0x003de1f9}}}, + {X: Field{[10]uint32{0x03293443, 0x02ec0b60, 0x02fd2047, 0x0253a623, 0x0118507f, 0x0368d9c6, 0x030ac3e1, 0x0157ecd6, 0x03b15a3f, 0x0031ec91}}, Y: Field{[10]uint32{0x01b85f4f, 0x01ee341b, 0x00b6799e, 0x03d993cf, 0x00c3c8e5, 0x0309f152, 0x02b6ac8b, 0x017c448d, 0x003734c6, 0x0012ad01}}}, + {X: Field{[10]uint32{0x003647dd, 0x02a8dd78, 0x005344c6, 0x03484875, 0x0045df69, 0x00b04df8, 0x0008a201, 0x02520417, 0x01338dcb, 0x00377f6a}}, Y: Field{[10]uint32{0x03795c1b, 0x02ff96d5, 0x02091bbc, 0x015691be, 0x0095f912, 0x0161c4b4, 0x032e93ac, 0x005af565, 0x01fd02a1, 0x003a57de}}}, + {X: Field{[10]uint32{0x031da7db, 0x013fbe8d, 0x00c29da0, 0x02d99dfe, 0x029d15a6, 0x0091fa1f, 0x03e3233b, 0x02c415b1, 0x02455084, 0x00372369}}, Y: Field{[10]uint32{0x001449c3, 0x00c81211, 0x00c80931, 0x00a198df, 0x018fc66d, 0x022f5da1, 0x0207fea0, 0x03b00fda, 0x01a3fde3, 0x0030a8d1}}}, + {X: Field{[10]uint32{0x01ff5333, 0x015520b4, 0x0395b8e3, 0x0334ea31, 0x02a31547, 0x0190e415, 0x0263bc7a, 0x02fea3c4, 0x0326c5fc, 0x003d4fce}}, Y: Field{[10]uint32{0x02716ac1, 0x022f8eb9, 0x031d1bb6, 0x03b1e662, 0x035249e8, 0x005f13ec, 0x0188f1da, 0x02e72a63, 0x0145e664, 0x000044fb}}}, + {X: Field{[10]uint32{0x0246cae9, 0x0277242d, 0x03a391d8, 0x021a4c4e, 0x027d7546, 0x0365a77d, 0x021d6477, 0x012d793b, 0x03fd0c6d, 0x00192348}}, Y: Field{[10]uint32{0x03e18962, 0x036f8a00, 0x0120615e, 0x01500c98, 0x009b3364, 0x02b81a5f, 0x02ffbd4b, 0x01d74d39, 0x00452393, 0x00340d78}}}, + {X: Field{[10]uint32{0x002839b1, 0x020ff84f, 0x011cb1c4, 0x038ac72a, 0x03bd51bd, 0x035c2cd0, 0x0073f3ed, 0x01603e09, 0x010e5dbe, 0x0024b9b7}}, Y: Field{[10]uint32{0x039577a5, 0x03d1852c, 0x012015dd, 0x007a8432, 0x01a61ab0, 0x02826ce4, 0x02d1a465, 0x01ef4964, 0x03fea544, 0x00336437}}}, + {X: Field{[10]uint32{0x009f687b, 0x013b983d, 0x03b782ef, 0x020daf9b, 0x00eaec05, 0x02505695, 0x0223ec54, 0x03be33e8, 0x018a7616, 0x0004c579}}, Y: Field{[10]uint32{0x03e1431c, 0x016109b5, 0x0280f1ac, 0x0285cdf6, 0x022fe189, 0x036b1caa, 0x00e1fa45, 0x01832f15, 0x0100802d, 0x001ca780}}}, + {X: Field{[10]uint32{0x033e2a3b, 0x0008522a, 0x035e6c94, 0x03579b41, 0x0186b001, 0x00d55394, 0x026b284a, 0x03f61438, 0x03999857, 0x000f22a5}}, Y: Field{[10]uint32{0x00b25977, 0x01a76f4a, 0x012f6d6c, 0x00568410, 0x03a722e9, 0x00140819, 0x0087b3d6, 0x00829565, 0x0092acc7, 0x001193c1}}}, + {X: Field{[10]uint32{0x027591c8, 0x00ba9d84, 0x00879f86, 0x03e3fc0f, 0x010bf3c7, 0x01be6b38, 0x02b37cae, 0x0317d10d, 0x0230cc94, 0x003a905c}}, Y: Field{[10]uint32{0x01a4faa6, 0x01819f61, 0x033ace91, 0x01d5c09a, 0x006f4ec4, 0x02735010, 0x00cff1eb, 0x03542eeb, 0x00cb8d95, 0x0025848e}}}, + {X: Field{[10]uint32{0x021a6ceb, 0x0066854d, 0x0040bceb, 0x0282c316, 0x0348496c, 0x00b262bd, 0x01a8c816, 0x001e78ca, 0x01c2f271, 0x0023b33e}}, Y: Field{[10]uint32{0x017e56af, 0x00f5a1ec, 0x03a5b0b5, 0x00e684cb, 0x01c8ac52, 0x00bcdeca, 0x00c6a7c5, 0x03c6a98c, 0x0219165b, 0x000f8966}}}, + {X: Field{[10]uint32{0x030f296d, 0x00e62d53, 0x0155677f, 0x004e10b3, 0x027bf3d9, 0x0153adaa, 0x033c34ab, 0x00e965a1, 0x0083b350, 0x000cbc3f}}, Y: Field{[10]uint32{0x0381a811, 0x036328be, 0x01e26655, 0x02b73268, 0x00311e50, 0x032d7dec, 0x02da3459, 0x01e2dd8b, 0x016d906f, 0x00351cdb}}}, + {X: Field{[10]uint32{0x00d7accb, 0x00c60db8, 0x00a9f638, 0x0302c985, 0x03e4fa4c, 0x017fdf2f, 0x03c171da, 0x00ea3e90, 0x011077c8, 0x002df58c}}, Y: Field{[10]uint32{0x016be9de, 0x0217af5e, 0x037e35e2, 0x02d30648, 0x008b84a5, 0x0307ae99, 0x02c27ef9, 0x00554aa2, 0x02405644, 0x0018257d}}}, + {X: Field{[10]uint32{0x02536954, 0x009a52ef, 0x02cf06c3, 0x03e35a49, 0x010588b4, 0x0158f95b, 0x00cd74e6, 0x013ec295, 0x004a22df, 0x003bdb24}}, Y: Field{[10]uint32{0x025dbaa4, 0x02568881, 0x00c9fb10, 0x024b83a7, 0x02aa7a04, 0x00dc5788, 0x03c3d3c4, 0x00de9396, 0x00b144cd, 0x000c2244}}}, + {X: Field{[10]uint32{0x02941a6a, 0x00b5eac8, 0x02e27067, 0x0079baaa, 0x02b37524, 0x012385fe, 0x00eebf0b, 0x0096f2b3, 0x03d1e628, 0x0006784e}}, Y: Field{[10]uint32{0x00b613f7, 0x00f2430a, 0x03bbad3e, 0x019b92bc, 0x02855ea6, 0x02fe3330, 0x01308bbd, 0x016f0455, 0x03290700, 0x001bc8b0}}}, + {X: Field{[10]uint32{0x008e9420, 0x02dec447, 0x025df967, 0x02af5e4a, 0x009a98a7, 0x03ca602c, 0x0349ae45, 0x03de41e4, 0x00df10f2, 0x0015f66f}}, Y: Field{[10]uint32{0x0265db68, 0x01a29ca6, 0x0265eb50, 0x03d6ff93, 0x0142ebfd, 0x033009ec, 0x00f8fcb1, 0x0215378d, 0x01e1d9b7, 0x002fd997}}}, + {X: Field{[10]uint32{0x03df06b2, 0x03e1eb80, 0x0057e4e3, 0x0087c4f4, 0x00bb530a, 0x0347b4c9, 0x038874e3, 0x017a2c21, 0x02857c3d, 0x000def19}}, Y: Field{[10]uint32{0x00998539, 0x00711493, 0x02ec83a8, 0x02f5cbd7, 0x0377764a, 0x00729eef, 0x02abbeac, 0x02c4bbc4, 0x03dc764d, 0x00055066}}}, + {X: Field{[10]uint32{0x01c2cec2, 0x01962a7e, 0x021387f3, 0x00729d04, 0x00b572e1, 0x01944b0b, 0x00012a59, 0x024544cf, 0x01d99ca5, 0x0006cc31}}, Y: Field{[10]uint32{0x02f39697, 0x02c16417, 0x0169101d, 0x01445a97, 0x002344f7, 0x01ebe327, 0x004d8421, 0x03343150, 0x020b2a0d, 0x0037108c}}}, + {X: Field{[10]uint32{0x01efd0bf, 0x02d387f0, 0x03e65b8d, 0x008616e4, 0x01e6e89f, 0x016b5297, 0x0329f4f8, 0x0156b374, 0x01b3050c, 0x0025a0c7}}, Y: Field{[10]uint32{0x03d47837, 0x0127b673, 0x00ef455e, 0x035687e3, 0x0082bd8b, 0x01c1cbcb, 0x0275ef61, 0x01ce6b43, 0x0020fd03, 0x0021bd0e}}}, + {X: Field{[10]uint32{0x00e3d8ad, 0x024f3551, 0x0379266b, 0x027a85f2, 0x02bce799, 0x01eb3550, 0x0309f28f, 0x00129560, 0x000faa1f, 0x00334bd4}}, Y: Field{[10]uint32{0x00dd8c29, 0x025011b2, 0x0009e929, 0x00158fbc, 0x0127dd1b, 0x02057de5, 0x00743c24, 0x03abba5f, 0x0080ddfc, 0x0007e5dc}}}, + {X: Field{[10]uint32{0x02d01c08, 0x00af85d2, 0x003e8ff3, 0x0279829e, 0x00802f51, 0x00d54a4a, 0x0318ff9d, 0x02789e8c, 0x027d237c, 0x00180e4a}}, Y: Field{[10]uint32{0x02893fdc, 0x03615bc8, 0x02065663, 0x00714e7f, 0x0088ae9e, 0x03ca5f11, 0x0194afbd, 0x0347e362, 0x0147df91, 0x003adfcc}}}, + {X: Field{[10]uint32{0x0237ee9a, 0x015d3e7e, 0x03c90d22, 0x01e45e6c, 0x03d8abb6, 0x03cf075f, 0x00d68fb9, 0x02adcc08, 0x03ad0df6, 0x003db3dd}}, Y: Field{[10]uint32{0x0042ebd1, 0x031de389, 0x03523280, 0x02e873e6, 0x0177e81e, 0x037dd8c4, 0x01d513b7, 0x03dc59ad, 0x01c33587, 0x0023fe8a}}}, + {X: Field{[10]uint32{0x027cdf7a, 0x001c50b6, 0x00abd018, 0x028b49a9, 0x00944a0e, 0x0046f8bf, 0x01b6f4ff, 0x03145165, 0x015af542, 0x0015f200}}, Y: Field{[10]uint32{0x00b05da9, 0x0319cfaa, 0x03e3d2c9, 0x02ff45b8, 0x00ffb692, 0x028dd537, 0x02b32d33, 0x00f319ed, 0x039e8015, 0x002d9f1d}}}, + {X: Field{[10]uint32{0x034fe462, 0x0390679a, 0x03b4bfa1, 0x01feed90, 0x012f58a1, 0x02ba664c, 0x03d5c51c, 0x01248bfe, 0x0158ac18, 0x001ff821}}, Y: Field{[10]uint32{0x01ec7a11, 0x023ef9de, 0x0079e5a8, 0x01745664, 0x007268cb, 0x03565616, 0x027e9e4c, 0x0162d4db, 0x037d8bbf, 0x001d8011}}}, + {X: Field{[10]uint32{0x01517b75, 0x0367cfb7, 0x0177d87b, 0x017d62f8, 0x023d8109, 0x03639f13, 0x029b87a0, 0x026fbf5c, 0x016e73b3, 0x000b85bd}}, Y: Field{[10]uint32{0x035fcb7a, 0x013905cd, 0x011aa69b, 0x03c1e808, 0x0177aa59, 0x01a3c260, 0x02c950e6, 0x00e836ea, 0x01ef5732, 0x0013389c}}}, + {X: Field{[10]uint32{0x00ffdedb, 0x03ae9886, 0x017ad9c2, 0x039b4b76, 0x0049200d, 0x0328929a, 0x0381f666, 0x01e00af9, 0x000d456d, 0x0029351c}}, Y: Field{[10]uint32{0x026e4532, 0x0350d3f1, 0x036d5efe, 0x0396bc4b, 0x009124aa, 0x02192936, 0x030e7628, 0x0283c3a3, 0x006d0e7b, 0x0030267e}}}, + {X: Field{[10]uint32{0x033fc059, 0x02306676, 0x0145dc04, 0x01d061fc, 0x01a2327e, 0x00795eb9, 0x016c9219, 0x0278fa8c, 0x01505011, 0x002d1d93}}, Y: Field{[10]uint32{0x0398653c, 0x00f55a91, 0x03092c2f, 0x01c13e93, 0x004f1270, 0x0005a862, 0x00831ea9, 0x0084a4fb, 0x00facc27, 0x0038e6fa}}}, + {X: Field{[10]uint32{0x027e2d0e, 0x0064c6c3, 0x02235503, 0x008ebae0, 0x02c29fe1, 0x0213f1a5, 0x015b352e, 0x02afc33b, 0x03a7d291, 0x000f9a1a}}, Y: Field{[10]uint32{0x0185d266, 0x0371306a, 0x02ed88c7, 0x001e6327, 0x005a889b, 0x00c86e6e, 0x00caf9a9, 0x00f207e1, 0x00ab07cc, 0x001ecd70}}}, + {X: Field{[10]uint32{0x024a46c5, 0x02501f34, 0x03346db4, 0x0014a234, 0x03584001, 0x00c488c5, 0x0161e563, 0x01c3bf16, 0x032d1d4c, 0x0035e21b}}, Y: Field{[10]uint32{0x00b9efc8, 0x02501015, 0x023e868d, 0x00fe053c, 0x03c5ef50, 0x0135f6ea, 0x0225903d, 0x018092cb, 0x02e617c4, 0x00369917}}}, + {X: Field{[10]uint32{0x03a17a40, 0x01e643c2, 0x03475d3a, 0x03c8c976, 0x02cea867, 0x038dd519, 0x0257ba71, 0x0135016a, 0x03cc1465, 0x001f2f48}}, Y: Field{[10]uint32{0x02dcbc51, 0x03968774, 0x0303954c, 0x01ffb74d, 0x02088d32, 0x018e3b3a, 0x005541ee, 0x01b6d2e6, 0x01af96e6, 0x003b7739}}}, + {X: Field{[10]uint32{0x03eb9795, 0x02e62505, 0x00a5c5d2, 0x02ed6185, 0x0018f877, 0x00cf0864, 0x00ea0a92, 0x03876bbb, 0x0185c279, 0x00151898}}, Y: Field{[10]uint32{0x00e9b6f8, 0x0342e1b8, 0x0309d928, 0x03c37192, 0x018cfb07, 0x033f1e46, 0x03967305, 0x0211502f, 0x0185dc8f, 0x001941fb}}}, + {X: Field{[10]uint32{0x0163c32e, 0x02170201, 0x00681892, 0x03e78880, 0x0259e68c, 0x0376afbe, 0x02db20aa, 0x030b38af, 0x01551cbe, 0x003b73bc}}, Y: Field{[10]uint32{0x02753179, 0x035e8f6f, 0x00b33b03, 0x03f677da, 0x00bed59e, 0x032e936d, 0x016ab45b, 0x00a14f0a, 0x01437559, 0x002b799c}}}, + {X: Field{[10]uint32{0x023380cd, 0x02342180, 0x02dd99cf, 0x017320d2, 0x036a30bc, 0x032476df, 0x03db47fb, 0x03e74fc9, 0x0153ff6e, 0x003809ea}}, Y: Field{[10]uint32{0x03a2bbf5, 0x00d8b6b2, 0x032e4c7e, 0x02025d61, 0x0162eafc, 0x03114aa0, 0x012d174a, 0x03408239, 0x004de18a, 0x00079ac9}}}, + {X: Field{[10]uint32{0x02e2b2d6, 0x02b1bd9c, 0x00960e17, 0x00b2aa88, 0x0366dbf9, 0x01e1f549, 0x02a251f3, 0x00090953, 0x0168db98, 0x0029401b}}, Y: Field{[10]uint32{0x020b2b9c, 0x00fea95a, 0x01babfa6, 0x037d735b, 0x0372d1e6, 0x003dd1c8, 0x0198766c, 0x03756e53, 0x017ee854, 0x002864e3}}}, + {X: Field{[10]uint32{0x0027be11, 0x039419a1, 0x004e03d5, 0x00943b94, 0x01dbb020, 0x00a65646, 0x029adf73, 0x03f67b69, 0x01f201a1, 0x000c9c1d}}, Y: Field{[10]uint32{0x03c4debb, 0x02ace05a, 0x02df32de, 0x03091466, 0x02611a4e, 0x036157e8, 0x00ee3356, 0x0252fa52, 0x02b1c32e, 0x0010695f}}}, + {X: Field{[10]uint32{0x023363bd, 0x01e567c6, 0x0399ac1c, 0x0013188d, 0x039c87ac, 0x03a57dd2, 0x010cdcd7, 0x012f29ac, 0x01c66669, 0x0025f869}}, Y: Field{[10]uint32{0x00ab5e88, 0x026e49f2, 0x006a948c, 0x02601095, 0x01566894, 0x0359c709, 0x032bb6c4, 0x01587ded, 0x008d1ec7, 0x000f3269}}}, + {X: Field{[10]uint32{0x00c07a21, 0x0243b4ec, 0x01a047f7, 0x01a27dbf, 0x03d0a2d8, 0x013bad2a, 0x01bce28f, 0x01373f44, 0x0240a737, 0x001143e9}}, Y: Field{[10]uint32{0x03a77f4c, 0x00f285bb, 0x0231fc4c, 0x01b1fae8, 0x02aa35a5, 0x0034774d, 0x002a1f17, 0x033e8752, 0x0298dc17, 0x003aba20}}}, + {X: Field{[10]uint32{0x020a6559, 0x007bd2e7, 0x004a8a7a, 0x02461fa5, 0x00d81fad, 0x01025090, 0x0209ce1f, 0x019a84b6, 0x0340fc0a, 0x003d6a9c}}, Y: Field{[10]uint32{0x02eb5017, 0x0367f1ca, 0x022e349a, 0x004276d4, 0x00899d98, 0x02136e9d, 0x02e7738f, 0x024bc718, 0x03da9ef9, 0x0004956c}}}, + {X: Field{[10]uint32{0x0242f1b4, 0x032529e2, 0x02c8c90c, 0x022a2c53, 0x028857ac, 0x01fef5d6, 0x03238419, 0x01e0da9e, 0x01655519, 0x0001a402}}, Y: Field{[10]uint32{0x031b027b, 0x02eb6305, 0x007100f1, 0x02d3a7bd, 0x02952b5b, 0x02f817cc, 0x02271072, 0x025db6d1, 0x01d2038c, 0x00077060}}}, + {X: Field{[10]uint32{0x03f290aa, 0x00b484b0, 0x01e878ff, 0x03e4cd55, 0x03bc3bc0, 0x030dd830, 0x019f377b, 0x0104d9fa, 0x005a8ed8, 0x000ac6a8}}, Y: Field{[10]uint32{0x0013e280, 0x019f9633, 0x00a417b2, 0x002b2f74, 0x0035e900, 0x01fcda2f, 0x01f58965, 0x02f0c645, 0x02f41eb8, 0x0011ec96}}}, + {X: Field{[10]uint32{0x0052d81d, 0x00574974, 0x01a7ab53, 0x00e75320, 0x03454b1e, 0x00017976, 0x013540d3, 0x02bfc366, 0x029ca18c, 0x002939ad}}, Y: Field{[10]uint32{0x015d70c5, 0x02b70068, 0x0182236f, 0x00845f22, 0x00df4fcb, 0x00b9e9bb, 0x02d78edc, 0x01e41290, 0x01039c58, 0x001f3fc8}}}, + {X: Field{[10]uint32{0x039d2582, 0x01a45bec, 0x00fa17a3, 0x02ca029f, 0x01f728e1, 0x02775de5, 0x039cb0fd, 0x03292cf8, 0x0396c74f, 0x002ad12e}}, Y: Field{[10]uint32{0x0026f5c1, 0x01a8b264, 0x00ab7cb7, 0x036079e5, 0x037edc0d, 0x00645659, 0x0373febb, 0x03633279, 0x03a4519f, 0x00167646}}}, + {X: Field{[10]uint32{0x01e332a2, 0x036f08e7, 0x03cc7715, 0x01d5750b, 0x00934729, 0x015108a2, 0x016a31ae, 0x030f9232, 0x005b3fb9, 0x0020ec32}}, Y: Field{[10]uint32{0x01a6da6e, 0x034c07cd, 0x014b1e36, 0x00e4b592, 0x009652d7, 0x03c21a00, 0x0033b342, 0x00160bf6, 0x0240fb62, 0x003a67d5}}}, + {X: Field{[10]uint32{0x03954537, 0x02c856bb, 0x0078841e, 0x03d10381, 0x03e5bd10, 0x01402f03, 0x02911ee0, 0x033e059d, 0x013e624e, 0x003a914c}}, Y: Field{[10]uint32{0x000c7445, 0x0344c4db, 0x0244e81a, 0x0005342d, 0x00d5afb1, 0x027a2915, 0x03bde53b, 0x02733880, 0x000ce235, 0x0012ae2c}}}, + {X: Field{[10]uint32{0x01a3cd4e, 0x033a87d4, 0x03412ac4, 0x0278df3d, 0x03ae6d60, 0x023249f2, 0x03f7a269, 0x00f65a7d, 0x00e4af82, 0x0024db04}}, Y: Field{[10]uint32{0x017b7213, 0x023a37ec, 0x02b60bf6, 0x01ec04f4, 0x00bdb906, 0x000d67db, 0x03e5bdcf, 0x02142e38, 0x03bb10dd, 0x0011bdca}}}, + {X: Field{[10]uint32{0x02e9bfd6, 0x0243583c, 0x0296b36c, 0x00597478, 0x01847bb1, 0x01aa26cc, 0x02cf8e13, 0x030f6ce4, 0x015b61aa, 0x0010da97}}, Y: Field{[10]uint32{0x0336d68d, 0x0155a18b, 0x0247e336, 0x036839cd, 0x025e342b, 0x012a43e7, 0x038559c8, 0x032b3065, 0x008dae67, 0x003e079a}}}, + {X: Field{[10]uint32{0x00b315d7, 0x02136001, 0x0067aabd, 0x0108b986, 0x02d931a4, 0x0153d898, 0x024b929e, 0x022684e8, 0x00273fe7, 0x0027ae55}}, Y: Field{[10]uint32{0x012ef59c, 0x03e568d3, 0x01c60768, 0x012bfb04, 0x02d29f20, 0x03bfea0a, 0x0020fba8, 0x03990002, 0x01927dc0, 0x000e2ff0}}}, + {X: Field{[10]uint32{0x02280d8a, 0x0392e97e, 0x0277a0e6, 0x00342f68, 0x02ecb77a, 0x0003d8f9, 0x02b4328a, 0x02f02b2d, 0x02f587ec, 0x000e09ad}}, Y: Field{[10]uint32{0x024ef271, 0x00cbc10e, 0x016e6572, 0x024e2e8f, 0x01db35e2, 0x03698fe2, 0x03e6eb9e, 0x039a6c84, 0x01fedcef, 0x0003650d}}}, + {X: Field{[10]uint32{0x00a1dde2, 0x03e32881, 0x00a21cd0, 0x02e36cf3, 0x034dbdce, 0x010d92e7, 0x0193bcf8, 0x0286f8fe, 0x0111ae0e, 0x0028d233}}, Y: Field{[10]uint32{0x0083ac75, 0x03522107, 0x001e91d1, 0x02f5b591, 0x0007078e, 0x004ada28, 0x01c202f2, 0x03ebc9a8, 0x01d3db7c, 0x0007f214}}}, + {X: Field{[10]uint32{0x03df7329, 0x03a6818a, 0x002053c4, 0x039cf2dc, 0x025d70d1, 0x01c90993, 0x027646d0, 0x037cf139, 0x0239237f, 0x002ff855}}, Y: Field{[10]uint32{0x035f88e4, 0x03413e4a, 0x023adf12, 0x0373924b, 0x03345488, 0x01dd9d20, 0x03c09d1d, 0x03967670, 0x03e61ec5, 0x00240acd}}}, + {X: Field{[10]uint32{0x003dfa5e, 0x004f3270, 0x02944144, 0x00409c1f, 0x012642ae, 0x02081608, 0x00dc346c, 0x02dbd350, 0x014d81a1, 0x0038bf6c}}, Y: Field{[10]uint32{0x0088fceb, 0x0028f88d, 0x004086c6, 0x02ca6c03, 0x02131e37, 0x01d9d818, 0x026925ae, 0x021545b1, 0x00ed846e, 0x000c046d}}}, + {X: Field{[10]uint32{0x013c7416, 0x0377b1a4, 0x0038a535, 0x03aab09f, 0x02cf1119, 0x02d2b088, 0x0263659d, 0x019d205d, 0x01c68f47, 0x002ef196}}, Y: Field{[10]uint32{0x0154b954, 0x026099de, 0x00c7a477, 0x00825d6e, 0x03482501, 0x034ff84e, 0x01d13a40, 0x0144abeb, 0x02e19fdb, 0x0007e2db}}}, + {X: Field{[10]uint32{0x02505521, 0x0137a368, 0x02056cef, 0x02dbf67b, 0x01ce9141, 0x03e169e2, 0x016f743a, 0x01e26f6f, 0x02029866, 0x00196f4a}}, Y: Field{[10]uint32{0x0378f5a5, 0x017ce74c, 0x0370c6b6, 0x0135c429, 0x02990b18, 0x030f9b15, 0x01644a46, 0x02def175, 0x00301ced, 0x000cb6f8}}}, + {X: Field{[10]uint32{0x0278e981, 0x01645ac8, 0x01406a3a, 0x02427817, 0x00e9318d, 0x0303cdc9, 0x0175a49f, 0x033df093, 0x02eb8382, 0x0007b039}}, Y: Field{[10]uint32{0x0015715a, 0x033f0acd, 0x019fc240, 0x0018cdf3, 0x02fa56ac, 0x01a5f7af, 0x008ade3c, 0x02f2bfab, 0x029cf486, 0x00394384}}}, + {X: Field{[10]uint32{0x03a9eb8c, 0x032c43d8, 0x00d9e10d, 0x0248cd96, 0x00c0399c, 0x0284058a, 0x01aceb1e, 0x02896678, 0x031c203d, 0x001ce42b}}, Y: Field{[10]uint32{0x037c3126, 0x03837c25, 0x02418320, 0x028ce6f3, 0x002c3ada, 0x037af9f6, 0x03cad451, 0x01ec275e, 0x00966064, 0x001f4855}}}, + {X: Field{[10]uint32{0x021a533b, 0x01c7a05a, 0x01eb2b4b, 0x007b624c, 0x01127baf, 0x00267311, 0x03ff7f37, 0x00dd91e0, 0x00697b91, 0x00266945}}, Y: Field{[10]uint32{0x03e2e8e4, 0x022018e9, 0x00d4c8a2, 0x03c23a8e, 0x00809d21, 0x02b9d23f, 0x00bd57db, 0x01dc2c3f, 0x000f7503, 0x00127034}}}, + {X: Field{[10]uint32{0x020394d9, 0x03eb5962, 0x018cbf12, 0x038313f2, 0x02320ba2, 0x03c6dc09, 0x03b7dbfe, 0x00133033, 0x00b13b48, 0x003935b8}}, Y: Field{[10]uint32{0x03761a41, 0x01d74d8e, 0x01b6c750, 0x03760619, 0x03af5fc3, 0x038338be, 0x035ad203, 0x001bf9a9, 0x02ac73a0, 0x002bac3a}}}, + {X: Field{[10]uint32{0x01fe1a04, 0x01445b86, 0x03459d88, 0x0160ad54, 0x031a9aa0, 0x02b48fec, 0x03e1c460, 0x0397ab2c, 0x0141507c, 0x00122290}}, Y: Field{[10]uint32{0x0312bd12, 0x008d7d33, 0x0104f0d7, 0x01ce97f6, 0x00e82f80, 0x02b58ec1, 0x01eaf25e, 0x03e31d33, 0x0066043e, 0x001af5a8}}}, + {X: Field{[10]uint32{0x03babaa1, 0x03057659, 0x028c55d2, 0x011f290b, 0x032cb65b, 0x00b7eeb0, 0x011c2ffd, 0x0295346b, 0x024ded0c, 0x00303ff8}}, Y: Field{[10]uint32{0x027e9289, 0x01f1af5f, 0x0167dbbd, 0x03859d59, 0x03a0a330, 0x037dc047, 0x01bbba88, 0x0137c867, 0x023e29c5, 0x00345731}}}, + {X: Field{[10]uint32{0x027780b1, 0x016e48dd, 0x03fb2830, 0x003fc82f, 0x0131b05d, 0x023f17bc, 0x02dd36dd, 0x01389677, 0x030206c7, 0x000cdb66}}, Y: Field{[10]uint32{0x014e647b, 0x0179fd50, 0x01fd1b05, 0x0184051c, 0x032b1b64, 0x006f6e27, 0x03e6510e, 0x029c1eba, 0x00fc9886, 0x0012bb6b}}}, + {X: Field{[10]uint32{0x02dcf04f, 0x03b38b40, 0x024a706a, 0x016b3a11, 0x019a2a17, 0x031ee1b9, 0x03d3711d, 0x029ef8ee, 0x02b98973, 0x00260d4f}}, Y: Field{[10]uint32{0x02ee767e, 0x01d187ea, 0x0196d980, 0x0290f5b1, 0x028e45b4, 0x00178704, 0x02108873, 0x01290e3d, 0x02c22789, 0x002a1dfe}}}, + {X: Field{[10]uint32{0x02da1e61, 0x01f0d84d, 0x039053f3, 0x01df0e3a, 0x0271c9fb, 0x0153f2c2, 0x0239cecb, 0x03e77d8d, 0x021c17ff, 0x003370d7}}, Y: Field{[10]uint32{0x0094eace, 0x026d9a25, 0x017782bb, 0x0275f58a, 0x0087ae55, 0x030528c7, 0x024f0ccd, 0x01c9837d, 0x02bafe91, 0x002a332d}}}, + {X: Field{[10]uint32{0x00111941, 0x026a4d20, 0x00b5b515, 0x03b149b3, 0x015d7407, 0x02701bc5, 0x00584093, 0x0282c9c5, 0x01c15e62, 0x00244b2c}}, Y: Field{[10]uint32{0x03049bf6, 0x02f561cd, 0x035adbf4, 0x02e60d23, 0x026fa710, 0x031c3769, 0x00cecc86, 0x03111f34, 0x00d51723, 0x00161305}}}, + {X: Field{[10]uint32{0x03bff3bc, 0x0339a4f0, 0x0102b5dd, 0x01a26003, 0x01ffd195, 0x03fd00d0, 0x02ec6e2c, 0x022b3667, 0x017c7c1e, 0x00085178}}, Y: Field{[10]uint32{0x0236356f, 0x02ffd3dd, 0x02b68957, 0x0222bebf, 0x00a5c430, 0x02769eeb, 0x030e9b89, 0x02cdce56, 0x01a240c0, 0x000ee29c}}}, + {X: Field{[10]uint32{0x010b1692, 0x00baa523, 0x004ab3aa, 0x002882ff, 0x0143e091, 0x000f3721, 0x024f7e1d, 0x01c9c888, 0x03367e87, 0x00392824}}, Y: Field{[10]uint32{0x02cf846e, 0x00557df0, 0x00f80328, 0x0372bdf4, 0x02898f48, 0x03e9b8d3, 0x02b8315a, 0x01bc0e3b, 0x00313314, 0x00092c7b}}}, + {X: Field{[10]uint32{0x0328db40, 0x026cdb34, 0x02bb0f57, 0x0361001b, 0x012b1390, 0x01900a1d, 0x03387ed4, 0x01166edf, 0x02dd464d, 0x003f7d49}}, Y: Field{[10]uint32{0x013a3987, 0x011f0379, 0x00963141, 0x026a9d17, 0x01937326, 0x004993b1, 0x02cf7766, 0x005b4774, 0x02c56792, 0x0010e5b9}}}, + {X: Field{[10]uint32{0x00729f86, 0x016fed3b, 0x01da4fab, 0x012539d4, 0x0252ca4c, 0x02b77cfd, 0x01933ebc, 0x01c9cd42, 0x0016b3e3, 0x0001b217}}, Y: Field{[10]uint32{0x03648d6f, 0x019bc5ba, 0x01cf1217, 0x02646e7e, 0x01e592ce, 0x0177a64a, 0x0249040c, 0x0201f979, 0x03c8520b, 0x0026d4c3}}}, + {X: Field{[10]uint32{0x00e28e58, 0x0031e44b, 0x03203feb, 0x02889560, 0x03004e7d, 0x0378033e, 0x0098ce4b, 0x038b0043, 0x023c596e, 0x0013efeb}}, Y: Field{[10]uint32{0x026ff099, 0x00d55fb6, 0x017993e7, 0x01960ef0, 0x02396b8a, 0x03d43f58, 0x02dcfdcf, 0x00d92e57, 0x0104ed0e, 0x003fb3c1}}}, + {X: Field{[10]uint32{0x0378bab8, 0x00d44f81, 0x001fa150, 0x02ef4f0a, 0x0197c1d7, 0x003a7204, 0x0283c2b9, 0x0045e4ed, 0x037b8017, 0x0026f30e}}, Y: Field{[10]uint32{0x01bc0b43, 0x002e45d0, 0x03e9f3b7, 0x00275f62, 0x03a887f0, 0x02166ea8, 0x03825ab9, 0x0227469d, 0x00928782, 0x00368bab}}}, + {X: Field{[10]uint32{0x03635150, 0x0380be5a, 0x03c8a024, 0x0098ed78, 0x00855b0a, 0x01cb44c5, 0x02956956, 0x028ecfd6, 0x00400e70, 0x00110568}}, Y: Field{[10]uint32{0x023986be, 0x02961a76, 0x0223ec58, 0x0158e7cc, 0x016843ac, 0x026bf571, 0x02921603, 0x02a7e207, 0x038fcf55, 0x0036294e}}}, + {X: Field{[10]uint32{0x005b2341, 0x00212dc1, 0x030924d2, 0x00d8b54d, 0x01b617b5, 0x03880e0e, 0x00988fcb, 0x02f3da8e, 0x01c9cdaf, 0x001579d6}}, Y: Field{[10]uint32{0x0131bb95, 0x03e0abfe, 0x015d6cf7, 0x02dd0bae, 0x013c1191, 0x0288c561, 0x01524834, 0x00d01626, 0x03eaca8a, 0x00129a4c}}}, + {X: Field{[10]uint32{0x0140e9c8, 0x018d2215, 0x024b95ed, 0x0162b6f7, 0x018d1153, 0x03720f82, 0x017e072b, 0x00f0bc29, 0x0325bee2, 0x00084087}}, Y: Field{[10]uint32{0x01a8c9f0, 0x02ff8f3e, 0x008d4ba5, 0x0071fe19, 0x034ed8dc, 0x037208a8, 0x002c98f8, 0x003bfdf1, 0x0291a770, 0x0026bbd5}}}, + {X: Field{[10]uint32{0x01b376d1, 0x031e60b3, 0x024a7a28, 0x03bda413, 0x02c70771, 0x003502e2, 0x03f3c641, 0x006bffb7, 0x011ddded, 0x000ad38c}}, Y: Field{[10]uint32{0x0309b05c, 0x02b1cc35, 0x02575d20, 0x034db1e4, 0x0248b25d, 0x015fd6e5, 0x0243d02b, 0x016c1c3f, 0x00f56b25, 0x0005170c}}}, + {X: Field{[10]uint32{0x015378b3, 0x022d7d17, 0x0091e8b9, 0x02be412c, 0x025ed91c, 0x0017496d, 0x00dbf5be, 0x01840324, 0x021c7e16, 0x0014642c}}, Y: Field{[10]uint32{0x02650073, 0x0102d299, 0x01166040, 0x01b085b0, 0x001826d2, 0x02f83550, 0x00e3f268, 0x0317e2d4, 0x02471fbd, 0x002e0f33}}}, + {X: Field{[10]uint32{0x005b56f7, 0x03d00c15, 0x016ae1f2, 0x0025df40, 0x0188b1b0, 0x01d82062, 0x007c7b28, 0x01702cd9, 0x02e454c6, 0x000ac847}}, Y: Field{[10]uint32{0x02854f5c, 0x01c3775d, 0x03506f9b, 0x01a6e18f, 0x00fff746, 0x01e984a2, 0x01a25634, 0x03f0755c, 0x015917d8, 0x001d5d0e}}}, + {X: Field{[10]uint32{0x024134d4, 0x03e52bb9, 0x021b6d4a, 0x013e5063, 0x03a3caad, 0x03dae99b, 0x038ec37f, 0x002bb8d1, 0x0392b41e, 0x0032cc2d}}, Y: Field{[10]uint32{0x028358c5, 0x006aad88, 0x008e771b, 0x00376bac, 0x00914230, 0x003471ca, 0x02b8b4ec, 0x027d2e48, 0x02decb3a, 0x001155c6}}}, + {X: Field{[10]uint32{0x00e4bc6c, 0x00f34c81, 0x012e065c, 0x0149fba8, 0x03e46879, 0x0226f99e, 0x0349d070, 0x02a85ba5, 0x03a8d2fc, 0x003d390d}}, Y: Field{[10]uint32{0x03ba97c4, 0x02798a9d, 0x009c4344, 0x03f0e489, 0x008e7647, 0x03743b8a, 0x01e51f8b, 0x02ba28c3, 0x028b7e81, 0x003ed4b4}}}, + {X: Field{[10]uint32{0x0350d518, 0x0314f377, 0x00080545, 0x012f2d9e, 0x00ce85a9, 0x024f677e, 0x02a726c1, 0x0066cef1, 0x02a76a2a, 0x0028299d}}, Y: Field{[10]uint32{0x03190a71, 0x01ff2223, 0x03fe8e43, 0x01a28f26, 0x0041198d, 0x02b901c0, 0x01816e5a, 0x02f4842e, 0x00c6b1b7, 0x00191ffa}}}, + {X: Field{[10]uint32{0x03ff7b7e, 0x00296eed, 0x0171c786, 0x01745762, 0x0275a2ba, 0x03abbbb9, 0x00544ab1, 0x0250a2c4, 0x03ead7f3, 0x00057753}}, Y: Field{[10]uint32{0x0038445c, 0x00b11c67, 0x02961844, 0x007c6c7e, 0x0253924d, 0x02dcc8b4, 0x02313427, 0x008551f4, 0x01dd5fab, 0x00226557}}}, + {X: Field{[10]uint32{0x030ca522, 0x03d8c864, 0x012b8850, 0x00ffdcb3, 0x0301bdea, 0x035d3767, 0x037a188e, 0x012d1d8d, 0x00004029, 0x002a01ae}}, Y: Field{[10]uint32{0x02b97213, 0x02fb7237, 0x010db9c6, 0x02b18624, 0x0253e49a, 0x02aceee1, 0x03f1fa88, 0x02c6bda5, 0x036547d8, 0x0012db5c}}}, + {X: Field{[10]uint32{0x039f148b, 0x02e8fd56, 0x0006df31, 0x02b3cf01, 0x0058a983, 0x0390c7ba, 0x036ff9f6, 0x01921de8, 0x023dca08, 0x001078dc}}, Y: Field{[10]uint32{0x038392e4, 0x0252074e, 0x02007913, 0x00b37ff2, 0x022753c5, 0x0336a7f4, 0x000b136d, 0x0163406a, 0x02caf27c, 0x0022ac59}}}, + {X: Field{[10]uint32{0x01bba3c4, 0x002f2a19, 0x00953ea0, 0x011fe353, 0x01690e04, 0x00251985, 0x03a3e587, 0x02322766, 0x00f27855, 0x0018ee28}}, Y: Field{[10]uint32{0x03cf787f, 0x0002cc90, 0x03a0c2d3, 0x025dca2c, 0x008c09b2, 0x03c01320, 0x0295da00, 0x022d254e, 0x014185eb, 0x000c87eb}}}, + {X: Field{[10]uint32{0x014c5963, 0x00aa6a6c, 0x0056c894, 0x036b4bfe, 0x01c1ca21, 0x0088a698, 0x01cae5f8, 0x0034e941, 0x037faa8b, 0x00018afa}}, Y: Field{[10]uint32{0x02bffd4b, 0x0275efd5, 0x030451ac, 0x0008bd6d, 0x03a36f4c, 0x00fbf710, 0x01886550, 0x0309fd73, 0x00bd7120, 0x0038f673}}}, + {X: Field{[10]uint32{0x03d20427, 0x03cb1206, 0x0199ac65, 0x033cf2cb, 0x03bc133f, 0x024bc0c4, 0x01d79a90, 0x02e27af9, 0x000af524, 0x002dd686}}, Y: Field{[10]uint32{0x021d2747, 0x02e08952, 0x02d48c39, 0x01918cfb, 0x036a6369, 0x0398b7ec, 0x03094b41, 0x0301534d, 0x0056b11c, 0x0039e154}}}, + {X: Field{[10]uint32{0x024949e9, 0x03bb413f, 0x032f2f03, 0x00f3bbc0, 0x026b51f9, 0x013418e8, 0x01df9cbe, 0x03f1da5f, 0x036d5298, 0x001396ef}}, Y: Field{[10]uint32{0x02a12188, 0x039138c5, 0x00119476, 0x02fa6495, 0x001871fb, 0x0336024c, 0x0114a19e, 0x02771951, 0x028640cd, 0x00199c09}}}, + {X: Field{[10]uint32{0x00173237, 0x02fdb7c3, 0x01200074, 0x039b72d8, 0x02b78e86, 0x0357f06a, 0x02edb836, 0x03c1a4ee, 0x003df509, 0x002a5de3}}, Y: Field{[10]uint32{0x01d0cab7, 0x03804fca, 0x025d690e, 0x0072302f, 0x019230a4, 0x002a1759, 0x03a0e50d, 0x03e44e57, 0x019186a0, 0x000cea72}}}, + {X: Field{[10]uint32{0x03570449, 0x01eed8f3, 0x03c95cdb, 0x039c9b32, 0x00757fb3, 0x02924dab, 0x01790bc1, 0x012f9f12, 0x02ad1666, 0x003c6cea}}, Y: Field{[10]uint32{0x0060cc06, 0x003ed29d, 0x02a3a52b, 0x0098934e, 0x02006434, 0x011899e0, 0x02183981, 0x037040fc, 0x01cbea3f, 0x003477f8}}}, + {X: Field{[10]uint32{0x0349f598, 0x02293164, 0x022d0698, 0x0172bd33, 0x019563a0, 0x0133c067, 0x0036ad6a, 0x035615a9, 0x013ab015, 0x00359b3f}}, Y: Field{[10]uint32{0x011efc4d, 0x033dbe84, 0x01756d07, 0x02fbee54, 0x00d8e91b, 0x036e503e, 0x03b73056, 0x03679598, 0x01b6d097, 0x0017a85e}}}, + {X: Field{[10]uint32{0x020ac7aa, 0x03f8ef36, 0x00470ea8, 0x01bcb036, 0x015d87a1, 0x0260bb7f, 0x030f30aa, 0x01744efb, 0x00f0924b, 0x00294ca9}}, Y: Field{[10]uint32{0x038d5c1c, 0x00aa49c7, 0x017ad553, 0x03eab188, 0x0374fd1e, 0x03d40e1b, 0x003de70d, 0x00d204f3, 0x0019ca4e, 0x0030b98b}}}, + {X: Field{[10]uint32{0x00439b70, 0x0397fd8a, 0x03b3e1a3, 0x03bcff8b, 0x0281ebb3, 0x0381ed8c, 0x03d08c09, 0x0220d7fe, 0x01125df7, 0x002a6ac9}}, Y: Field{[10]uint32{0x01877514, 0x00696d61, 0x00c7e350, 0x02d53a54, 0x01f2eaad, 0x0330d77c, 0x0243698a, 0x0056aa6a, 0x01db56e0, 0x00163fd5}}}, + {X: Field{[10]uint32{0x020466eb, 0x03fd1b11, 0x02521f2c, 0x012907b5, 0x0153df17, 0x024571b5, 0x004dc830, 0x00f7b306, 0x03849081, 0x00338163}}, Y: Field{[10]uint32{0x02f3e745, 0x011acbe2, 0x03d47c76, 0x01065ecd, 0x02282377, 0x013d3dc6, 0x02815a78, 0x01d05016, 0x00c45881, 0x0010534e}}}, + {X: Field{[10]uint32{0x02406299, 0x02faaa5b, 0x003d4737, 0x014e76d8, 0x010afe92, 0x0059137a, 0x0385c7f3, 0x02cdaaac, 0x036530a2, 0x002647ea}}, Y: Field{[10]uint32{0x008eed57, 0x00abe7f9, 0x014df4f8, 0x03edeb6a, 0x005d373c, 0x0136807d, 0x016dc9d4, 0x0112f7c5, 0x017677c5, 0x000a8a6d}}}, + {X: Field{[10]uint32{0x03715d8e, 0x0070fcab, 0x01e140e9, 0x03fa84fc, 0x03ddfdd2, 0x016ad205, 0x00419210, 0x013bbf32, 0x001fbd03, 0x003b9b32}}, Y: Field{[10]uint32{0x0386d8be, 0x00ebcef8, 0x00a3f689, 0x011ea5ef, 0x00df8fd8, 0x02972f01, 0x007358de, 0x03a59487, 0x03fe48c3, 0x002e3de7}}}, + {X: Field{[10]uint32{0x019c5ef2, 0x02b33685, 0x017a3c5d, 0x03fa04cd, 0x0316ff2d, 0x00507800, 0x004d5cc5, 0x01995d55, 0x0372d642, 0x0019a8b4}}, Y: Field{[10]uint32{0x01bc8929, 0x0368fdd3, 0x029a05ba, 0x03416608, 0x00780000, 0x03c99781, 0x01423b9a, 0x03d234e2, 0x016b91c6, 0x002d5f4b}}}, + {X: Field{[10]uint32{0x02421da9, 0x0171a48e, 0x00ac6adf, 0x0396b2d3, 0x037a5798, 0x031fcda8, 0x0043e73f, 0x0378e854, 0x01d9f697, 0x0008280b}}, Y: Field{[10]uint32{0x01cf34f7, 0x00db0c33, 0x02b97338, 0x00e0bf31, 0x02ab4ab5, 0x00478f72, 0x02ab61e7, 0x00d87aa9, 0x0100d162, 0x00079b3c}}}, + {X: Field{[10]uint32{0x037bf552, 0x00e8c0f2, 0x0211092e, 0x026873b6, 0x019f92b7, 0x036894cc, 0x0298b154, 0x03a07daf, 0x02437818, 0x00282e32}}, Y: Field{[10]uint32{0x01543be6, 0x02ff968f, 0x030baa1a, 0x039922d8, 0x02218508, 0x003f38b6, 0x0263ca11, 0x03664141, 0x00ebf447, 0x0011506f}}}, + {X: Field{[10]uint32{0x00c52c63, 0x005d3ac7, 0x00ffb9e4, 0x02376d6e, 0x01e0d501, 0x0172ea73, 0x015c25fb, 0x039221f8, 0x02ad73dc, 0x00145c53}}, Y: Field{[10]uint32{0x03dafebf, 0x024507e6, 0x0309773b, 0x00c6665d, 0x01a5c248, 0x019b7480, 0x02272c7d, 0x01587afb, 0x00a082ef, 0x0011ede5}}}, + {X: Field{[10]uint32{0x02451c59, 0x012b0b35, 0x03a2fba7, 0x02904d05, 0x017da195, 0x026487a4, 0x03c41f6a, 0x03781cf9, 0x03631fe4, 0x00063a89}}, Y: Field{[10]uint32{0x024df316, 0x02bb5435, 0x01e6b106, 0x020cba55, 0x00d31b3b, 0x0235f24f, 0x03e0428e, 0x02eea6cc, 0x0337fff6, 0x000e6282}}}, + {X: Field{[10]uint32{0x03c5a87e, 0x02e415c5, 0x030cd0e8, 0x029675d6, 0x03c3d1f0, 0x033ea617, 0x01ec341a, 0x0060d298, 0x034fc39e, 0x00387562}}, Y: Field{[10]uint32{0x006b3c47, 0x02648967, 0x007f2cf2, 0x00e83767, 0x01af8215, 0x02dfe679, 0x03e2ab3b, 0x03f7b023, 0x020215fd, 0x0006d8bb}}}, + {X: Field{[10]uint32{0x016c5a84, 0x03b0f9dc, 0x039a3bbd, 0x0104472b, 0x032c19c5, 0x02c94f70, 0x03f5ba8e, 0x030495f7, 0x011730d3, 0x000e5e4e}}, Y: Field{[10]uint32{0x01f18015, 0x02a929fd, 0x021e3f78, 0x02f5070a, 0x00be7b4e, 0x021476a3, 0x02cded5c, 0x00db6644, 0x0350189f, 0x0035a87e}}}, + {X: Field{[10]uint32{0x039ede88, 0x003c5e96, 0x02ef1552, 0x002c93ca, 0x021d5736, 0x02c09467, 0x01dbf888, 0x0101b4e0, 0x024b601b, 0x00126d27}}, Y: Field{[10]uint32{0x0169a38d, 0x01f9dcbe, 0x02fadbff, 0x02734390, 0x03a0a76e, 0x00279168, 0x03e7be10, 0x035ecd66, 0x00ca02f2, 0x003f3cf3}}}, + {X: Field{[10]uint32{0x00bdc871, 0x036a914a, 0x024c32bf, 0x02848907, 0x01d64e38, 0x003fc5e8, 0x0188548f, 0x03cdb483, 0x010d0b42, 0x000b3606}}, Y: Field{[10]uint32{0x00259187, 0x03bd66da, 0x02a67077, 0x0034ac5a, 0x022fff78, 0x016affab, 0x0284f45e, 0x0052416a, 0x03692214, 0x003dca70}}}, + {X: Field{[10]uint32{0x0241025a, 0x00218997, 0x006f2308, 0x03a91747, 0x02b5b642, 0x007e7466, 0x020cb2cf, 0x015198b6, 0x03111738, 0x0007f43e}}, Y: Field{[10]uint32{0x029ce0e9, 0x02460791, 0x0008f557, 0x035b6edb, 0x0294e928, 0x031c04b6, 0x007825d1, 0x002082af, 0x0288fec6, 0x000c4da9}}}, + {X: Field{[10]uint32{0x02f3a141, 0x0391101e, 0x0387107d, 0x02ec4834, 0x013f93d5, 0x02f61139, 0x0248a0f5, 0x02d6f861, 0x033bd7f8, 0x003c2397}}, Y: Field{[10]uint32{0x01902fac, 0x01b857f6, 0x0289fa52, 0x02f37c74, 0x01bf7ea1, 0x03253a83, 0x0361bdfc, 0x03ab872a, 0x03259067, 0x0000f761}}}, + {X: Field{[10]uint32{0x005ee207, 0x0172ac47, 0x005a5d3f, 0x03c07fbb, 0x03a0584c, 0x0171af75, 0x03a046bb, 0x03ea58dc, 0x0006b997, 0x002800cf}}, Y: Field{[10]uint32{0x03e268b4, 0x002a36f0, 0x03a17d14, 0x02d8f53f, 0x0039a577, 0x00823503, 0x00c2cda2, 0x039235c2, 0x0131aacb, 0x003bb586}}}, + {X: Field{[10]uint32{0x02c16f70, 0x0246db98, 0x03b1e1ea, 0x01c1109a, 0x0383ff8f, 0x005de469, 0x001e29b1, 0x0299c77c, 0x000868be, 0x001df7bb}}, Y: Field{[10]uint32{0x0264861d, 0x009ac015, 0x024b5dc4, 0x009f0288, 0x00fcc1fe, 0x0067d7a7, 0x031ae7ef, 0x01cfd8c9, 0x0228ba8f, 0x002e4228}}}, + {X: Field{[10]uint32{0x01aa72b1, 0x016a86ea, 0x019605fd, 0x03070623, 0x01994a03, 0x00d41acf, 0x01bd1fc6, 0x0043b468, 0x015ffe2f, 0x000bf37b}}, Y: Field{[10]uint32{0x02bbefc6, 0x02df5d81, 0x0145d3fa, 0x00a13fe7, 0x02b4df66, 0x004a8319, 0x00d7c12e, 0x021bc748, 0x03f6f09a, 0x000556fa}}}, + {X: Field{[10]uint32{0x015db3ad, 0x00438826, 0x02904c83, 0x03fddf0a, 0x018667f8, 0x02e91f02, 0x00add0c9, 0x039cceaf, 0x032dfdf5, 0x0007c302}}, Y: Field{[10]uint32{0x037bc566, 0x035d5995, 0x03e448ef, 0x020a1732, 0x0170f631, 0x00c9a122, 0x039b7613, 0x03d57d44, 0x03cb84ce, 0x002f5c46}}}, + {X: Field{[10]uint32{0x0237dcf8, 0x03aa3e42, 0x005ef465, 0x03b52aa2, 0x03d603fd, 0x03b7d953, 0x01bdf3c5, 0x00b11183, 0x0144e716, 0x0002d2a1}}, Y: Field{[10]uint32{0x003c62b2, 0x00e28f48, 0x0134c139, 0x01bb6f86, 0x0099f8ee, 0x00a4b2ce, 0x032e27b2, 0x03a2c800, 0x0391b3f2, 0x0014f010}}}, + {X: Field{[10]uint32{0x005bd68c, 0x016c2dcb, 0x0221a9d8, 0x0031b650, 0x03d00a90, 0x034c1ce5, 0x0331cdfa, 0x02dcd4e3, 0x0282dcde, 0x0037c3af}}, Y: Field{[10]uint32{0x00decfb2, 0x03d1cce2, 0x001c68a2, 0x038b5c1c, 0x034a1d07, 0x0292b3e2, 0x03b869e3, 0x00b95511, 0x0239e7fe, 0x0030ca65}}}, + {X: Field{[10]uint32{0x03c101c0, 0x032499c0, 0x01576ec7, 0x00396cde, 0x02f9fd46, 0x034a3e27, 0x02ed101f, 0x0230cf87, 0x01b6d1c3, 0x003ac12e}}, Y: Field{[10]uint32{0x01e0ee9e, 0x0363ca3d, 0x024eb008, 0x0120e5d2, 0x00f5ee75, 0x020b5ba7, 0x013cab57, 0x03e02cac, 0x00497f47, 0x0013c9b6}}}, + {X: Field{[10]uint32{0x03294334, 0x03dc7434, 0x01cface9, 0x003ba9ee, 0x017db4ee, 0x032ae619, 0x014b37a0, 0x031b3ab2, 0x03e2197c, 0x001ef27b}}, Y: Field{[10]uint32{0x01a72013, 0x01e0b697, 0x009a37ff, 0x024c7057, 0x01ad8fb4, 0x02d6ce94, 0x001d9404, 0x01e41aa5, 0x00ad5234, 0x00364c6f}}}, + {X: Field{[10]uint32{0x033e0b9b, 0x0106b4ed, 0x00844e0a, 0x01433259, 0x011321dc, 0x01a8fa2d, 0x010c10c6, 0x014b192f, 0x01e8f4bd, 0x002248b4}}, Y: Field{[10]uint32{0x0241c431, 0x00a9e8d2, 0x003182a0, 0x031b57b7, 0x0261c9ee, 0x00cdf714, 0x00e6abd3, 0x03887a24, 0x00f17d23, 0x000ad90f}}}, + {X: Field{[10]uint32{0x02ddcc72, 0x006746bc, 0x00e9acdc, 0x0369df28, 0x030139a7, 0x0311a007, 0x036a842a, 0x004bb48b, 0x01e33a93, 0x0010bcbb}}, Y: Field{[10]uint32{0x0326f99b, 0x038d25e3, 0x0376ac70, 0x0029afd1, 0x02ab9536, 0x037238d0, 0x0260edff, 0x026172e4, 0x03cc715c, 0x00143516}}}, + {X: Field{[10]uint32{0x016761c6, 0x009c1453, 0x02ea2f3b, 0x03ca4a4d, 0x00627549, 0x01c9ad79, 0x00792550, 0x03fac962, 0x03201862, 0x001ef725}}, Y: Field{[10]uint32{0x01a4fa8c, 0x02a1504b, 0x02269f1c, 0x039032b5, 0x0065372e, 0x02101998, 0x026f0bff, 0x02b7d5db, 0x032b7f77, 0x001c03ad}}}, + {X: Field{[10]uint32{0x006314cf, 0x0366385d, 0x023066b6, 0x011f4840, 0x01f79d16, 0x008a3868, 0x002e0d85, 0x0126fd79, 0x03a64bf5, 0x002e6d49}}, Y: Field{[10]uint32{0x020cd93f, 0x00a66aaa, 0x00eb7499, 0x00e71b61, 0x02e35b15, 0x000bcc3a, 0x022a2b68, 0x007d6e4e, 0x00642a72, 0x002386cd}}}, + {X: Field{[10]uint32{0x01e3dda9, 0x02b0961d, 0x02d74978, 0x00c56434, 0x03d187c4, 0x00f3845d, 0x00291929, 0x01dd9407, 0x012934d4, 0x002d9779}}, Y: Field{[10]uint32{0x039fa529, 0x038db58e, 0x014ef324, 0x0027b2f6, 0x03f07555, 0x00c0d915, 0x01c55351, 0x02d73acf, 0x03e74ab9, 0x000f5bf2}}}, + {X: Field{[10]uint32{0x027c6b9b, 0x0198d9b3, 0x02ca5c2e, 0x03a8d016, 0x01a036ed, 0x00fc1584, 0x03604f6a, 0x01d47abc, 0x02320608, 0x00063aad}}, Y: Field{[10]uint32{0x015074c5, 0x00acd942, 0x03dd99d1, 0x001492f5, 0x02ccd426, 0x027e479b, 0x0211f057, 0x004464db, 0x03bc9467, 0x00227ac1}}}, + {X: Field{[10]uint32{0x02d360d5, 0x007183ba, 0x000a14eb, 0x03928c6d, 0x03c7502e, 0x025b4e76, 0x01a16065, 0x02590e42, 0x00664a47, 0x00289844}}, Y: Field{[10]uint32{0x01814901, 0x01fcdc9d, 0x00ac03e8, 0x0207cc8f, 0x0085721a, 0x02066086, 0x022d9fe3, 0x0155d8c9, 0x034d8802, 0x0012d175}}}, + {X: Field{[10]uint32{0x0008a8a7, 0x0250d74f, 0x019595da, 0x03ebd800, 0x01c77ac0, 0x0173c972, 0x019dc583, 0x0214de80, 0x00b12c10, 0x001e2515}}, Y: Field{[10]uint32{0x01829041, 0x02b82fe9, 0x007a2591, 0x000c949a, 0x008841da, 0x0282f5d8, 0x02f43378, 0x0167eb2f, 0x030fed28, 0x001afba1}}}, + {X: Field{[10]uint32{0x02791569, 0x03897518, 0x025ed7cf, 0x03e67d98, 0x01f81570, 0x00b837e5, 0x03683b9c, 0x0197c046, 0x0206fb4f, 0x00065df0}}, Y: Field{[10]uint32{0x03698479, 0x0390d7af, 0x01de467d, 0x02c9d764, 0x019dcc79, 0x02a7af81, 0x03f435e5, 0x0112aa57, 0x01a3c222, 0x00379db7}}}, + {X: Field{[10]uint32{0x01f4222f, 0x02b26199, 0x02585189, 0x03530fd5, 0x01ec3b5a, 0x02b0d35f, 0x03e60861, 0x0354d903, 0x01f7d259, 0x002247c3}}, Y: Field{[10]uint32{0x032de219, 0x002b3a46, 0x0257dba9, 0x02ac1010, 0x025c3293, 0x02a35ac3, 0x027a6011, 0x0228a87b, 0x03f70f53, 0x00331782}}}, + {X: Field{[10]uint32{0x0299530b, 0x02a4dfff, 0x01e55c80, 0x0380f171, 0x0350169d, 0x0104ad34, 0x026c282f, 0x03e07964, 0x03f69262, 0x00214d2e}}, Y: Field{[10]uint32{0x017423b5, 0x0239fad5, 0x01cf9fb0, 0x008d3505, 0x00f70cfc, 0x0395147a, 0x00764c0b, 0x001cdd33, 0x0181e0bb, 0x003efbb9}}}, + {X: Field{[10]uint32{0x006f63fb, 0x012c1faa, 0x001989e4, 0x01f03c04, 0x0158fc89, 0x01516635, 0x034eafa3, 0x037f4dd1, 0x016404e7, 0x00396dbd}}, Y: Field{[10]uint32{0x0118da79, 0x01b38998, 0x00ad0b2c, 0x03242ce0, 0x008e153c, 0x022201e0, 0x01e7d983, 0x00ea2ddb, 0x03fa68a8, 0x0010da2e}}}, + {X: Field{[10]uint32{0x02c2b850, 0x02435381, 0x00e29f7c, 0x03ced38e, 0x0046e184, 0x001c91ea, 0x03dc5e55, 0x03945260, 0x028b11c3, 0x003e5646}}, Y: Field{[10]uint32{0x010ff6b5, 0x025e82b6, 0x032a51fe, 0x024fca7f, 0x02957de3, 0x00d9a87e, 0x024e288a, 0x03d61f32, 0x00362361, 0x00108ed9}}}, + {X: Field{[10]uint32{0x0372384c, 0x02482c7f, 0x038212f2, 0x01655ef1, 0x017c9950, 0x025918de, 0x01eb617c, 0x017a7bbe, 0x01d3252f, 0x000f4c8e}}, Y: Field{[10]uint32{0x02a2e57a, 0x00f2a7c8, 0x03df78f7, 0x0386a6d9, 0x03ef860e, 0x0257ad37, 0x02798bf6, 0x02beb394, 0x03b6fc9b, 0x00070f8d}}}, + {X: Field{[10]uint32{0x00c5dfb8, 0x035719ef, 0x00055201, 0x018707c5, 0x02a0a6ce, 0x002184a8, 0x028e8554, 0x0135da1a, 0x03234b57, 0x003d0225}}, Y: Field{[10]uint32{0x000a56a4, 0x014c8243, 0x03af3c74, 0x029d80bf, 0x03c3a62f, 0x015969e7, 0x02aac242, 0x03f24552, 0x03b73e72, 0x001ae0a0}}}, + {X: Field{[10]uint32{0x02267ccf, 0x02d18a8b, 0x03c64bc4, 0x034ac104, 0x0395058e, 0x0262e2d1, 0x03e65f84, 0x031d17da, 0x02e7aea9, 0x002b381d}}, Y: Field{[10]uint32{0x028b97aa, 0x0076b045, 0x0120a31f, 0x018aa651, 0x02dc58f3, 0x02bcd4f8, 0x032ed6dc, 0x02a797ad, 0x0217377f, 0x0002d8b1}}}, + {X: Field{[10]uint32{0x006ec161, 0x01bf0b42, 0x036af29d, 0x00ced3f7, 0x01b4e63f, 0x02b6c747, 0x030b848e, 0x0181a4c8, 0x03a7408c, 0x001c332e}}, Y: Field{[10]uint32{0x014d6959, 0x020b1ee8, 0x02ec4d77, 0x00e1c7ef, 0x025a4ff3, 0x0152a032, 0x01286776, 0x00398390, 0x01a046d3, 0x003f0736}}}, + {X: Field{[10]uint32{0x0358d372, 0x03798a79, 0x02ede7a8, 0x02ce65c2, 0x019e33fc, 0x02bd6af1, 0x0258d3a4, 0x016c317a, 0x00b27c0c, 0x0039b9ea}}, Y: Field{[10]uint32{0x018d4a66, 0x036cf972, 0x017049a8, 0x0297262f, 0x00b40df3, 0x024f8b20, 0x011fee27, 0x02d69754, 0x01c4c8c8, 0x00350344}}}, + {X: Field{[10]uint32{0x03216346, 0x02c74c88, 0x02739117, 0x029433fd, 0x007910e9, 0x0278b109, 0x01495b71, 0x00b9a0ca, 0x01c7e0a0, 0x00337125}}, Y: Field{[10]uint32{0x001583d4, 0x00816c5a, 0x022f0559, 0x0231b390, 0x00d51fc6, 0x03c77dbb, 0x01ddcd87, 0x0302b3ca, 0x036e9306, 0x0018d993}}}, + {X: Field{[10]uint32{0x022fc5cc, 0x025d741e, 0x02e4f825, 0x0065bcd6, 0x01d0142f, 0x02e09370, 0x022ba333, 0x00878000, 0x009c2fd7, 0x0009e13a}}, Y: Field{[10]uint32{0x003b8cf4, 0x00d7bd77, 0x001db4a3, 0x0113c021, 0x005a391e, 0x00958a3d, 0x00232b9b, 0x019874d5, 0x0266bdfa, 0x0002e962}}}, + {X: Field{[10]uint32{0x001a2390, 0x023b37ac, 0x00d0b9b9, 0x02ffdabd, 0x030c9118, 0x0212e8f3, 0x001dd831, 0x01ce0085, 0x0362ebcb, 0x002ada66}}, Y: Field{[10]uint32{0x00766905, 0x0241128d, 0x03e71a60, 0x01ede611, 0x012be011, 0x02829f33, 0x0142547d, 0x0083db17, 0x0210b714, 0x00179520}}}, + {X: Field{[10]uint32{0x035756ec, 0x00f53c2d, 0x02e08dda, 0x00aa60d6, 0x02220955, 0x01b747aa, 0x03ad6d39, 0x038dfee7, 0x03a567ff, 0x001e07a9}}, Y: Field{[10]uint32{0x02637256, 0x0141683c, 0x034b2af9, 0x001f6b37, 0x000403a5, 0x02e99933, 0x01481744, 0x00ee5f93, 0x007b46f6, 0x000f1db6}}}, + {X: Field{[10]uint32{0x0374029c, 0x002f4fb8, 0x033fd39d, 0x00ef882c, 0x03a0e1ce, 0x023fb968, 0x0004fe7b, 0x002a0a97, 0x0130dd5c, 0x001d6acb}}, Y: Field{[10]uint32{0x01914b9f, 0x0057f358, 0x0121a722, 0x03ead7be, 0x0330536e, 0x0253073d, 0x01f6f8e6, 0x00e4eb2e, 0x0147fdb1, 0x002abd18}}}, + {X: Field{[10]uint32{0x00ddaff0, 0x00433e02, 0x03ced85a, 0x00cf4471, 0x01087124, 0x0212b55b, 0x023caea6, 0x00f6a5b4, 0x02983730, 0x000a52d9}}, Y: Field{[10]uint32{0x0346f7c1, 0x02993de6, 0x00b4222f, 0x03f20be7, 0x01e5861b, 0x00e2fc7c, 0x0007fa8b, 0x00fa7aa5, 0x02f7feb7, 0x002bd35f}}}, + {X: Field{[10]uint32{0x0024c8d6, 0x031b8d2e, 0x02e55ea3, 0x03a4495f, 0x00f290f6, 0x0365c047, 0x0283b06b, 0x018e7f25, 0x02ea7433, 0x003619da}}, Y: Field{[10]uint32{0x03a7456d, 0x0296dc65, 0x0230fd71, 0x00ab79c7, 0x0309017b, 0x01aab04c, 0x00f3e5cd, 0x01551424, 0x007635d4, 0x001c4322}}}, + {X: Field{[10]uint32{0x021270d0, 0x02fb9d05, 0x03544fd8, 0x009ea4ed, 0x00cee714, 0x0361a916, 0x004771c6, 0x03d6b0ab, 0x02030d90, 0x001793b2}}, Y: Field{[10]uint32{0x00c97351, 0x02bc2dd0, 0x03b9ff0c, 0x0293d232, 0x00a93bb4, 0x00d8a225, 0x03a6d603, 0x03e2febf, 0x0143b970, 0x00113f80}}}, + {X: Field{[10]uint32{0x0180097e, 0x03c496e1, 0x021dc157, 0x00f76f1d, 0x01265c3a, 0x026d5521, 0x0308f212, 0x02ea17f9, 0x01aa244f, 0x0024054b}}, Y: Field{[10]uint32{0x03ef2cf7, 0x00d5ce60, 0x03939b94, 0x00b120d5, 0x038a6d39, 0x03f0bd84, 0x01fa3b28, 0x021a42d6, 0x02c9200b, 0x0005a534}}}, + {X: Field{[10]uint32{0x005637b5, 0x02cf2423, 0x020f191f, 0x0265ccbb, 0x00daf3a1, 0x032fcae7, 0x03a953fa, 0x01c7114f, 0x00f096f1, 0x0019f755}}, Y: Field{[10]uint32{0x02de74b1, 0x009e6f13, 0x005dfb36, 0x02914d99, 0x025fd6c4, 0x028ce318, 0x01022365, 0x019db6d9, 0x03432d33, 0x0014c9f6}}}, + {X: Field{[10]uint32{0x036c51ef, 0x037e57ee, 0x00790142, 0x015d57bf, 0x032e7704, 0x01d33d50, 0x020f1447, 0x03fd5d96, 0x02838f95, 0x0031925a}}, Y: Field{[10]uint32{0x00d752a2, 0x0099ff2f, 0x038caca8, 0x0078e8e2, 0x031177b5, 0x022c16d4, 0x0186f01d, 0x0075ce4b, 0x01d6604d, 0x00330010}}}, + {X: Field{[10]uint32{0x00c11c74, 0x03f6dbda, 0x029ad933, 0x02da5187, 0x02425bf4, 0x02043674, 0x01e5e728, 0x00eff51d, 0x030a0b16, 0x0039e675}}, Y: Field{[10]uint32{0x00ba8600, 0x027f0605, 0x02b215ef, 0x0274689c, 0x03e50444, 0x00631b44, 0x00adcf76, 0x03b8fe6c, 0x005fe29b, 0x003f0d1d}}}, + {X: Field{[10]uint32{0x01489d3b, 0x03d16b17, 0x0175acb6, 0x01d30f73, 0x02820c87, 0x0060f60b, 0x032aa221, 0x02404540, 0x03b0151a, 0x001b4f25}}, Y: Field{[10]uint32{0x02d4749f, 0x03356c52, 0x023231c2, 0x03e7b99c, 0x0264b57d, 0x033b767b, 0x0295d438, 0x035dee3d, 0x01013d15, 0x0016aa2f}}}, + {X: Field{[10]uint32{0x02517539, 0x0163bfc2, 0x00165456, 0x030ea0be, 0x03b96d8e, 0x0131a8e6, 0x01cf2d9a, 0x01f79d06, 0x02001c1e, 0x0021b94f}}, Y: Field{[10]uint32{0x0344ad86, 0x01d7c06a, 0x03520ce4, 0x02b099b7, 0x00c24491, 0x00198c45, 0x01da5254, 0x03b3033b, 0x0370f2ef, 0x0003e2c6}}}, + {X: Field{[10]uint32{0x02a9880a, 0x014210d4, 0x0074347c, 0x02407cf2, 0x03075feb, 0x023b6ccf, 0x023267a7, 0x01f33aa6, 0x0339ac87, 0x00299070}}, Y: Field{[10]uint32{0x03982163, 0x029c9583, 0x01009c34, 0x031abf72, 0x01407559, 0x01f5a729, 0x03dc101b, 0x016b14f1, 0x014f2b27, 0x0036229b}}}, + {X: Field{[10]uint32{0x0182511a, 0x004d5a27, 0x00ceb9e0, 0x03550243, 0x00b925aa, 0x0378c5d5, 0x001de436, 0x02099916, 0x03a94d77, 0x000e8054}}, Y: Field{[10]uint32{0x00802035, 0x00cf5e96, 0x0055e35a, 0x00367c2b, 0x0111154b, 0x03fc1b3e, 0x0252df38, 0x017169e8, 0x02489493, 0x00003db2}}}, + {X: Field{[10]uint32{0x032b170f, 0x030a9851, 0x0058c5be, 0x035f18fd, 0x002c2e51, 0x009ba5bd, 0x0126b31d, 0x0326b501, 0x00e8a131, 0x0039e009}}, Y: Field{[10]uint32{0x034e0c53, 0x01fd9627, 0x008eaf19, 0x00125d90, 0x013a3092, 0x036ad977, 0x0093d9ce, 0x02c63c8d, 0x014b1ad7, 0x00315028}}}, + {X: Field{[10]uint32{0x006a5162, 0x004cce2a, 0x007cc7df, 0x01878b76, 0x007f05a1, 0x0064919a, 0x00380fab, 0x03c3b1d0, 0x005e8351, 0x001e1632}}, Y: Field{[10]uint32{0x02a6de1c, 0x035f96cd, 0x03a60928, 0x001969db, 0x037e658e, 0x03111354, 0x002897e7, 0x0281bf0e, 0x03445313, 0x0032b650}}}, + {X: Field{[10]uint32{0x030263e6, 0x01c51eb2, 0x024b82f3, 0x022b5666, 0x00ddb9da, 0x02597ccd, 0x0268c170, 0x037750d6, 0x02281c5b, 0x0001990f}}, Y: Field{[10]uint32{0x032cf79b, 0x022d6229, 0x03f36d72, 0x03e9a513, 0x016f2dc8, 0x02125a35, 0x008f9282, 0x02a82e6f, 0x02368ee1, 0x0027e7e7}}}, + {X: Field{[10]uint32{0x01b2254b, 0x0164b5ae, 0x035e7106, 0x008fa684, 0x02b31325, 0x03a81755, 0x03e8f9e3, 0x03c5325b, 0x0137a286, 0x0017cdb6}}, Y: Field{[10]uint32{0x0056310a, 0x011922e4, 0x02cfc2e5, 0x0070f21a, 0x029adb0e, 0x03cbf4e7, 0x02bf753e, 0x017fcb73, 0x037cc826, 0x0002758d}}}, + {X: Field{[10]uint32{0x023e2224, 0x019dfaf1, 0x0212fb17, 0x01c9187a, 0x02310f91, 0x00a140f0, 0x0226f266, 0x0282a97d, 0x01ae93d3, 0x00084bac}}, Y: Field{[10]uint32{0x036d1b67, 0x033f51d2, 0x02fa51df, 0x03fbd7f5, 0x010bbc5a, 0x03d4a09a, 0x038d9fdc, 0x00805b1c, 0x0233347f, 0x0014795f}}}, + {X: Field{[10]uint32{0x01e9eab4, 0x02175dcd, 0x0277e9a0, 0x024e39bc, 0x01dedb3b, 0x000f3898, 0x00481452, 0x027e4cca, 0x02c8940b, 0x00149a54}}, Y: Field{[10]uint32{0x01a42918, 0x013d3361, 0x0210952e, 0x023c50fe, 0x001d9aa5, 0x006013fe, 0x01fe2fd8, 0x00aabe69, 0x03a356df, 0x002195f3}}}, + {X: Field{[10]uint32{0x001c099f, 0x022f81d3, 0x036ef8f9, 0x00f2e5ea, 0x010419e0, 0x0254e8b4, 0x03a8778c, 0x00a04b92, 0x010def76, 0x00083c5d}}, Y: Field{[10]uint32{0x02cd485e, 0x03a2cc6e, 0x0060ebd8, 0x01396af0, 0x01d9d97b, 0x01a87b0b, 0x020bf881, 0x034a9fec, 0x01f53e7a, 0x0034bfba}}}, + {X: Field{[10]uint32{0x027ee910, 0x024db735, 0x02496da2, 0x0397bed9, 0x01dbc7f5, 0x03c4f1a4, 0x023cfb27, 0x00599708, 0x03b7ea01, 0x00388c68}}, Y: Field{[10]uint32{0x0365d53f, 0x02d7f02f, 0x0011e96e, 0x000bec5c, 0x0345e4f6, 0x0337c4f0, 0x027316c7, 0x0004c7cf, 0x002e18e8, 0x002a9917}}}, + {X: Field{[10]uint32{0x01c702ad, 0x005d2d89, 0x002cbed7, 0x0189a1e8, 0x01d01aa9, 0x014b9ca6, 0x02eac355, 0x009b74f6, 0x01523fd0, 0x001e9393}}, Y: Field{[10]uint32{0x01b965d2, 0x02ccc13f, 0x01b8471e, 0x03047e50, 0x007d2bdf, 0x0335f269, 0x00612044, 0x02396ab9, 0x02b6a739, 0x000d4704}}}, + {X: Field{[10]uint32{0x03f137b3, 0x013471b2, 0x03eaa557, 0x019c6688, 0x039a8589, 0x0000431b, 0x00a5a5ca, 0x0159c19f, 0x007e7696, 0x003f4bdc}}, Y: Field{[10]uint32{0x00315408, 0x01d4c1be, 0x038aa1ae, 0x021e78ef, 0x01df00e2, 0x033957d0, 0x039b1613, 0x0391ccc7, 0x030c1d5a, 0x00311690}}}, + {X: Field{[10]uint32{0x002bb89d, 0x024634fc, 0x01373f3f, 0x0293e099, 0x036c2ac2, 0x034c121d, 0x0011d676, 0x03d3f384, 0x001e8cf2, 0x003141b3}}, Y: Field{[10]uint32{0x01d3118a, 0x019078a9, 0x02f0c058, 0x01b8bd63, 0x01bea33d, 0x03dee982, 0x0247f6d1, 0x026cccbe, 0x03b37402, 0x002379b7}}}, + {X: Field{[10]uint32{0x035c0369, 0x0012dd6a, 0x02eebb82, 0x035f63e1, 0x00ad1bb4, 0x0327378f, 0x02b901c3, 0x03e6661a, 0x0102d9cc, 0x000ba9eb}}, Y: Field{[10]uint32{0x02b0ed43, 0x000c6543, 0x03d9ce40, 0x0189253a, 0x032b2135, 0x02bdda51, 0x03648ddd, 0x000c09d8, 0x03d86d75, 0x0004488a}}}, + {X: Field{[10]uint32{0x02159c5c, 0x00e33467, 0x0279c4c3, 0x00eb77f4, 0x00f8a602, 0x028ab04d, 0x004b421b, 0x039394be, 0x01923555, 0x002ae330}}, Y: Field{[10]uint32{0x0351ee1a, 0x007c8fe1, 0x00ff514d, 0x03ad532a, 0x015a5b54, 0x0311241e, 0x029fbda6, 0x0236f08f, 0x03bdcc26, 0x000b1238}}}, + {X: Field{[10]uint32{0x01dad430, 0x02bd01fd, 0x00e04c54, 0x009fcb3f, 0x02c37784, 0x029c4226, 0x0348e1c2, 0x0107ea46, 0x02e1cc7c, 0x00223fb0}}, Y: Field{[10]uint32{0x033ed80b, 0x02277ae2, 0x02cf3c4b, 0x019bec7f, 0x02dce306, 0x02c0d709, 0x02c7a049, 0x01994d7e, 0x02884f69, 0x00332d17}}}, + {X: Field{[10]uint32{0x034b0d41, 0x034dda1d, 0x0357c011, 0x02871931, 0x02940522, 0x03a83373, 0x02c31272, 0x03d746d0, 0x03ae1acc, 0x00101161}}, Y: Field{[10]uint32{0x030e787b, 0x028e4ffb, 0x01325f96, 0x03ad7395, 0x0163401d, 0x02cd46cd, 0x0368c369, 0x0187d3dc, 0x025b25ae, 0x003a373c}}}, + {X: Field{[10]uint32{0x02b9ab8a, 0x0093469f, 0x01097514, 0x033ef136, 0x0128a377, 0x009d4245, 0x00cf20ab, 0x02a30234, 0x02b9cade, 0x00229c07}}, Y: Field{[10]uint32{0x02ba5a45, 0x02737ab2, 0x0143a454, 0x0099bc0b, 0x01265e8b, 0x02a62d68, 0x0076154c, 0x02b1c30f, 0x018282a9, 0x0013c116}}}, + {X: Field{[10]uint32{0x01ad3d56, 0x00aa9e22, 0x0038929b, 0x001b1b59, 0x0366e15e, 0x00422930, 0x02141fdb, 0x00270a76, 0x01781940, 0x0030a04a}}, Y: Field{[10]uint32{0x035db5c1, 0x024db22d, 0x01afa974, 0x039db952, 0x029c9db5, 0x032c7951, 0x0034255d, 0x03a5a68a, 0x02fb6670, 0x00215027}}}, + {X: Field{[10]uint32{0x031d72fe, 0x03ee0401, 0x021298ad, 0x02d0aea9, 0x000f8ea4, 0x002e0af8, 0x03b04d19, 0x03210e4a, 0x02b1c810, 0x0027ff4d}}, Y: Field{[10]uint32{0x01b38404, 0x028f5a80, 0x03d871ca, 0x0291a997, 0x026f25fd, 0x03ea7f86, 0x002955eb, 0x0037e069, 0x024ba11f, 0x0004789e}}}, + {X: Field{[10]uint32{0x01a48b96, 0x01be1e69, 0x02b25f1c, 0x011d78ff, 0x0239e431, 0x0143bb18, 0x01072107, 0x02c05f2b, 0x0044bc92, 0x002b1280}}, Y: Field{[10]uint32{0x02b8dfe1, 0x02233907, 0x00de2d5f, 0x02fd15ed, 0x03f526bb, 0x011307d4, 0x03498533, 0x000bfc79, 0x03ba7310, 0x001071f0}}}, + {X: Field{[10]uint32{0x0306eb5a, 0x0393a19e, 0x0214224a, 0x01b35d93, 0x0357d808, 0x03467f17, 0x03c83bf9, 0x02a482cf, 0x001c157c, 0x0031e2c4}}, Y: Field{[10]uint32{0x038126c8, 0x00dfc674, 0x001d2deb, 0x033570a7, 0x02b7a9d7, 0x013cee3d, 0x035f533b, 0x0183ffeb, 0x006eb9d6, 0x0006a34b}}}, + {X: Field{[10]uint32{0x03147cd2, 0x0396ba1d, 0x03d13578, 0x02e39b45, 0x01c24b0d, 0x02bb7648, 0x03c1c2db, 0x0122e57c, 0x03055723, 0x003423ce}}, Y: Field{[10]uint32{0x022713cb, 0x0187899d, 0x00696914, 0x02bd77f8, 0x034987df, 0x0028e148, 0x02e3e5c9, 0x01f2eda6, 0x00de0a06, 0x0009ed7f}}}, + {X: Field{[10]uint32{0x01e312f5, 0x02312ca9, 0x004893d0, 0x01471602, 0x001091cf, 0x01f1707f, 0x01db0f1c, 0x03d87ae0, 0x003d5060, 0x00103a81}}, Y: Field{[10]uint32{0x0166b27c, 0x005a8007, 0x01f30848, 0x00fbed96, 0x02043de0, 0x0167c54d, 0x02719be2, 0x00c0bf80, 0x02c42836, 0x000bbc47}}}, + {X: Field{[10]uint32{0x018362e7, 0x0212b40d, 0x02ec39f1, 0x03e76ec7, 0x0117db73, 0x0090bae9, 0x00827b28, 0x02d2cb7a, 0x00bdfb53, 0x003e7441}}, Y: Field{[10]uint32{0x01771877, 0x0333f3d3, 0x03167296, 0x03052bdb, 0x0268f4e3, 0x01f50fc2, 0x02707b6d, 0x006520ae, 0x020b6c37, 0x0035d912}}}, + {X: Field{[10]uint32{0x03f9ddc9, 0x00dde37b, 0x02b6e570, 0x028905c4, 0x00fea5f8, 0x0268176b, 0x02132b40, 0x0120a539, 0x02ee14c3, 0x003749da}}, Y: Field{[10]uint32{0x01ceb7ef, 0x0260d4e9, 0x0066b7bc, 0x0180add0, 0x034803f7, 0x025a4343, 0x02de6553, 0x03bb25ff, 0x017d5d92, 0x00026f98}}}, + {X: Field{[10]uint32{0x01155d49, 0x03a13c18, 0x012f4c8b, 0x035de149, 0x032104c7, 0x03c36e36, 0x03d11f67, 0x01ef4319, 0x0039d5f1, 0x002148be}}, Y: Field{[10]uint32{0x023ea117, 0x00ea5656, 0x00777316, 0x0375667e, 0x02e01f3e, 0x03729256, 0x039b59cd, 0x007e3db2, 0x01518031, 0x002dde46}}}, + {X: Field{[10]uint32{0x02b5b225, 0x000c362d, 0x0264eeb2, 0x01992ff3, 0x02510491, 0x018519ca, 0x0002a624, 0x02fa383f, 0x02bdb4f3, 0x001cca00}}, Y: Field{[10]uint32{0x02a3c6f3, 0x01aadc91, 0x01f8e35a, 0x018b4455, 0x02d9022d, 0x0302c973, 0x0105f92c, 0x03b875a9, 0x01ec590e, 0x001ef533}}}, + {X: Field{[10]uint32{0x0167af62, 0x036d5cd6, 0x02fc68fb, 0x02bf1125, 0x01f5ffcb, 0x022f7a85, 0x0273276b, 0x020d4887, 0x01a12c4f, 0x0006cd90}}, Y: Field{[10]uint32{0x01664048, 0x03619b66, 0x021cef0f, 0x00c81ea3, 0x000b824c, 0x02d33407, 0x01e2e153, 0x00adecbb, 0x02f5e5d1, 0x0000f543}}}, + {X: Field{[10]uint32{0x0301a7ce, 0x0254974f, 0x00c852c7, 0x01576efa, 0x010c8972, 0x02d9b4e4, 0x02cbe60c, 0x0213ffb5, 0x02184e92, 0x0034c0d3}}, Y: Field{[10]uint32{0x01d09e25, 0x03e3e67e, 0x013b48c4, 0x0313bacd, 0x0211172a, 0x017c6e87, 0x0094b058, 0x01439ca8, 0x030416ce, 0x002cd998}}}, + {X: Field{[10]uint32{0x01e9db17, 0x00c9c29a, 0x0176d65c, 0x00aa8eb4, 0x0261c6db, 0x023d3e16, 0x03a44610, 0x03d7bc63, 0x0200bd22, 0x00239ea0}}, Y: Field{[10]uint32{0x03530568, 0x012cec7c, 0x01ceadee, 0x01d466cd, 0x004a4824, 0x01c7d335, 0x03536edc, 0x025e6fe1, 0x03b51cce, 0x002107f8}}}, + {X: Field{[10]uint32{0x00a4027e, 0x02c2d958, 0x009e85da, 0x00f60e40, 0x01c4af5f, 0x005086b8, 0x02aee276, 0x0219c746, 0x00de29ab, 0x003f332d}}, Y: Field{[10]uint32{0x037f993b, 0x02f48b83, 0x01c47fa6, 0x0352fa8a, 0x01a6e269, 0x03a5df9c, 0x036ac069, 0x0226bf56, 0x0396203b, 0x002808a7}}}, + {X: Field{[10]uint32{0x004c8a26, 0x00b001f9, 0x02576925, 0x01d87e67, 0x039e74a4, 0x03ab5c16, 0x00681f0a, 0x02060213, 0x017f4435, 0x0039a33f}}, Y: Field{[10]uint32{0x0028f82e, 0x004874b1, 0x013c1672, 0x01863a7c, 0x01712291, 0x03c343ad, 0x0378d50c, 0x038ab908, 0x00a7b027, 0x002b7670}}}, + {X: Field{[10]uint32{0x006891d8, 0x0381184b, 0x029a8072, 0x0022dc9b, 0x0263bfe0, 0x022ecc94, 0x026de7ac, 0x02b05921, 0x03ad4b81, 0x0022dbc3}}, Y: Field{[10]uint32{0x024bc9ca, 0x03b2bb6e, 0x01288092, 0x023e98a4, 0x0391493e, 0x0289ff84, 0x008d328c, 0x0012de02, 0x0108a8d6, 0x0026eb59}}}, + {X: Field{[10]uint32{0x024b78b1, 0x035266f5, 0x021ba8cf, 0x010d5ea4, 0x02470f89, 0x0019d185, 0x03178cf2, 0x00652498, 0x00aa37ac, 0x00042283}}, Y: Field{[10]uint32{0x0265bf55, 0x0067d928, 0x032a75a8, 0x0149844a, 0x039b7c04, 0x03fd45f1, 0x03e302e1, 0x0255bd7f, 0x0122be05, 0x001a0543}}}, + {X: Field{[10]uint32{0x0357edb6, 0x0100a131, 0x0208b429, 0x02949952, 0x02ab8e13, 0x00dc2971, 0x032daa83, 0x0315e474, 0x03330844, 0x003fb460}}, Y: Field{[10]uint32{0x02457fe5, 0x02707fcd, 0x01e56f83, 0x00bb4fe2, 0x00b1b52c, 0x0254ba8d, 0x0229a976, 0x02ae13ae, 0x03378395, 0x0019ef77}}}, + {X: Field{[10]uint32{0x00170a2f, 0x02cbb824, 0x00da501f, 0x02108d46, 0x00848b2d, 0x02933789, 0x03ed6f10, 0x01b3cd42, 0x039decd5, 0x002fafec}}, Y: Field{[10]uint32{0x03a11573, 0x0350328a, 0x0275197d, 0x036c2987, 0x0005acb2, 0x0051b652, 0x0125fbde, 0x03e21c8a, 0x00b3bb86, 0x0004c0ad}}}, + {X: Field{[10]uint32{0x001e716c, 0x01efca06, 0x0286c9c6, 0x015e74a2, 0x02af8d50, 0x01369ed5, 0x0070d3cb, 0x034edb11, 0x02ed2a58, 0x0019c4d6}}, Y: Field{[10]uint32{0x02fd6664, 0x01202723, 0x03040019, 0x00fc14fa, 0x0230fa2f, 0x03cdd111, 0x00f3e778, 0x038fbf72, 0x02ab2786, 0x0025f102}}}, + {X: Field{[10]uint32{0x0354f90e, 0x024a3950, 0x038b9c37, 0x01782436, 0x03c3dea7, 0x0135b7c0, 0x0309dd41, 0x01b96b36, 0x01bb0956, 0x002c03ad}}, Y: Field{[10]uint32{0x029b1258, 0x03e4fbb9, 0x0164d8ae, 0x01c044b2, 0x02ccc3a6, 0x02666bce, 0x0173aa63, 0x0399d3a6, 0x02411cb6, 0x001b4483}}}, + {X: Field{[10]uint32{0x03bb73a2, 0x03cce13c, 0x03bb8ecd, 0x024b7a7b, 0x01233375, 0x028e6cb6, 0x01db6d3b, 0x00808bc2, 0x026cbe8d, 0x001c86c6}}, Y: Field{[10]uint32{0x0205310f, 0x01632392, 0x020885b4, 0x039e542f, 0x014acbb2, 0x0253e01d, 0x01ae1f2e, 0x003d1c1d, 0x0362631a, 0x00336d06}}}, + {X: Field{[10]uint32{0x038a0837, 0x028f9137, 0x03f71d10, 0x020e5226, 0x0242f60b, 0x02431083, 0x0147cde1, 0x004b2a37, 0x00ac015b, 0x0032e35e}}, Y: Field{[10]uint32{0x0296dbc2, 0x01f33ffa, 0x022d5d17, 0x022c4206, 0x03abdc44, 0x03ecb849, 0x00d3846c, 0x00d9d7a3, 0x01a6a307, 0x00202f8c}}}, + {X: Field{[10]uint32{0x00781920, 0x03b1e15b, 0x0017a0af, 0x00af8bb8, 0x0137e5c5, 0x03450f95, 0x03f3ae66, 0x03621348, 0x03cc4919, 0x0012473e}}, Y: Field{[10]uint32{0x02874189, 0x01fb3115, 0x03ee62b1, 0x0353b706, 0x003ba714, 0x01367cbb, 0x004d29cc, 0x00c2234d, 0x03502628, 0x001d8c86}}}, + {X: Field{[10]uint32{0x02b507b4, 0x01c02cda, 0x0027cfb3, 0x011b17af, 0x038145d1, 0x02088c0e, 0x02ed33ff, 0x00898c8e, 0x03ee4899, 0x0001b28c}}, Y: Field{[10]uint32{0x00b11f4e, 0x00fa34b0, 0x03ec644e, 0x002a7276, 0x038c376a, 0x002548af, 0x00a20cfd, 0x03419078, 0x02b3f189, 0x0025adce}}}, + {X: Field{[10]uint32{0x01d842c7, 0x032aea06, 0x00f8997c, 0x03be6058, 0x001bf602, 0x008b3e9a, 0x03b33d38, 0x025c6db2, 0x03cb3c48, 0x001b47f7}}, Y: Field{[10]uint32{0x03b1713f, 0x01b4a733, 0x0376909c, 0x0311565a, 0x00fa555a, 0x01bc1180, 0x017c0629, 0x02098979, 0x03c46608, 0x00020af1}}}, + {X: Field{[10]uint32{0x02a43554, 0x038fea7f, 0x01b55c88, 0x00f0f87a, 0x02daeb53, 0x01ac8de5, 0x01ac3ca3, 0x00bd069a, 0x02991cf9, 0x0028fa05}}, Y: Field{[10]uint32{0x012855f1, 0x02520c8c, 0x020fa25e, 0x03d5e1b4, 0x0165887d, 0x015014c2, 0x0206b0b4, 0x0119ebe8, 0x029be802, 0x0021e9be}}}, + {X: Field{[10]uint32{0x01d49c70, 0x0230fa1f, 0x03ab571f, 0x013cfcbf, 0x007f570e, 0x0142cab1, 0x02c7438d, 0x030ca53a, 0x03d7cbfb, 0x003f212a}}, Y: Field{[10]uint32{0x03f73dd9, 0x014ddf69, 0x0075b691, 0x00ee959b, 0x02589f6c, 0x0266d905, 0x01b3f1cd, 0x015ac396, 0x02690713, 0x001d11ec}}}, + {X: Field{[10]uint32{0x0355d1b1, 0x02090200, 0x01769539, 0x02a1ce9a, 0x01af4e02, 0x03b28568, 0x00d31252, 0x0056e860, 0x02408fc5, 0x002fac8c}}, Y: Field{[10]uint32{0x019c1459, 0x030d0fd4, 0x01e95b3b, 0x028417ae, 0x00e2bbe6, 0x006dd96c, 0x02deba93, 0x02a6ab97, 0x000d6fa8, 0x0004be92}}}, + {X: Field{[10]uint32{0x0299eb8e, 0x0180d906, 0x00f13df7, 0x00ed810d, 0x010a50e6, 0x02f0094a, 0x02373d71, 0x035fcc66, 0x0279cffa, 0x001a2245}}, Y: Field{[10]uint32{0x00772fb8, 0x01ed6dda, 0x00524da0, 0x0258b9bb, 0x037736ce, 0x01b40540, 0x02a7c1e8, 0x022a8b4b, 0x01b76db2, 0x00102de3}}}, + {X: Field{[10]uint32{0x03068817, 0x0007b8ae, 0x01d96ed4, 0x03350a3a, 0x03b42e2f, 0x023ed754, 0x022f736e, 0x02c103f7, 0x01ad1ae7, 0x0003b10d}}, Y: Field{[10]uint32{0x0096f9f2, 0x02fb23bf, 0x03ac244b, 0x01175943, 0x0126860c, 0x01b13de5, 0x0028a856, 0x010dbd2a, 0x02aa1283, 0x0004efdb}}}, + {X: Field{[10]uint32{0x03de3033, 0x0165341a, 0x0249f374, 0x01d9885a, 0x0060a755, 0x01df9241, 0x03b7ce7f, 0x01a22df7, 0x02fa661f, 0x0019e7d6}}, Y: Field{[10]uint32{0x03617ca1, 0x03ecd71b, 0x017094e0, 0x00ca921f, 0x02c8fddd, 0x023c172d, 0x00f14bfc, 0x013f6956, 0x03d96c25, 0x003fcfff}}}, + {X: Field{[10]uint32{0x0233be60, 0x026994bd, 0x02d68ba8, 0x000bb3ad, 0x011aa2fc, 0x010c1ec8, 0x0348aeb6, 0x009b97ef, 0x00ea05dc, 0x0027faf6}}, Y: Field{[10]uint32{0x02630bee, 0x0390d923, 0x0099272b, 0x0258b1de, 0x033fc5dc, 0x02ef1783, 0x036e785c, 0x00e292b4, 0x03c8ea62, 0x0030219e}}}, + {X: Field{[10]uint32{0x000b1601, 0x00df24d8, 0x03acfe21, 0x02046d64, 0x010347b3, 0x03763e7c, 0x02bed696, 0x02d23b6d, 0x0154c534, 0x003621ac}}, Y: Field{[10]uint32{0x0375d077, 0x02ad7583, 0x03964f10, 0x03064edd, 0x03d74028, 0x03faa8fd, 0x02246c8e, 0x036aa713, 0x0118aa07, 0x002932f0}}}, + {X: Field{[10]uint32{0x006e9d47, 0x03929d11, 0x0349ab7e, 0x009f73b0, 0x01096a8e, 0x03fc85e8, 0x03f6ab68, 0x028e9820, 0x03efc187, 0x002be332}}, Y: Field{[10]uint32{0x03e941f0, 0x01c5b3da, 0x03dc4990, 0x00cc96a3, 0x031662a7, 0x0395539b, 0x025b625b, 0x000e49f6, 0x027c9988, 0x0000fb8c}}}, + {X: Field{[10]uint32{0x01d3d26a, 0x00662f1f, 0x033654a6, 0x0162a65e, 0x0042d334, 0x012952a1, 0x0051d224, 0x0098728d, 0x00e7891c, 0x0007a600}}, Y: Field{[10]uint32{0x01a215d4, 0x0269dcd9, 0x013bd566, 0x03259bdd, 0x03978120, 0x020b9acd, 0x031a321e, 0x03f03757, 0x0186bd6f, 0x000c8be2}}}, + {X: Field{[10]uint32{0x03150044, 0x0193159d, 0x015e415d, 0x029a8b49, 0x00aae4ff, 0x00ea43cc, 0x000dc97f, 0x02002561, 0x02f29f00, 0x00045718}}, Y: Field{[10]uint32{0x02d8af95, 0x035f8cba, 0x01a14a8f, 0x017a2f0b, 0x02cceef9, 0x0393f7c2, 0x03660e01, 0x03397bf5, 0x00127e37, 0x00136513}}}, + {X: Field{[10]uint32{0x02e0178c, 0x01565a0a, 0x02ba2598, 0x017fd0a0, 0x033f5313, 0x0144896f, 0x00d78e8e, 0x01e776cd, 0x039dacbf, 0x000072e7}}, Y: Field{[10]uint32{0x011a4bf5, 0x01a32d2f, 0x0284a50c, 0x03421577, 0x02d7b602, 0x02f3c8d3, 0x01595e20, 0x026f2508, 0x00e37a18, 0x0023f4e9}}}, + {X: Field{[10]uint32{0x03bfe357, 0x01e7b94b, 0x0370b66a, 0x0163e779, 0x01af86d2, 0x0326478e, 0x02b2a5bd, 0x03059d2e, 0x03c463e4, 0x0018a856}}, Y: Field{[10]uint32{0x02f52749, 0x02f792e3, 0x01e9f9f7, 0x0107a3af, 0x02d376fe, 0x01bd1548, 0x02da69fe, 0x01f93495, 0x029fd946, 0x002de3f2}}}, + {X: Field{[10]uint32{0x02df505e, 0x0047a4d7, 0x01ec454b, 0x00a96867, 0x026bd2c8, 0x01cefb53, 0x0170914a, 0x006520c5, 0x00e05bf3, 0x0015d29b}}, Y: Field{[10]uint32{0x00001318, 0x0206a5d7, 0x00b789b2, 0x02ea2ed7, 0x02d02dba, 0x006a6943, 0x02a60b8c, 0x03cce3c3, 0x02cccbd6, 0x0039ecb8}}}, + {X: Field{[10]uint32{0x024084e6, 0x02b47549, 0x023194ad, 0x02ad5839, 0x01c5ae50, 0x027b493f, 0x039cedad, 0x018692eb, 0x037ca3a3, 0x001931b8}}, Y: Field{[10]uint32{0x00116067, 0x025bb59a, 0x008d3f79, 0x003a09c7, 0x004b7a48, 0x00d6b801, 0x0054a07f, 0x02d01027, 0x035656b6, 0x0039b90b}}}, + {X: Field{[10]uint32{0x0100fd84, 0x002041d2, 0x03b11553, 0x011ab79f, 0x0371b277, 0x01d581e9, 0x0246af84, 0x02379555, 0x0297fe4a, 0x00124196}}, Y: Field{[10]uint32{0x030ae7f9, 0x0217c6b5, 0x03342834, 0x01efeed0, 0x0094e721, 0x01ec9d9f, 0x038eb43c, 0x00c2426a, 0x009f67a0, 0x0026175a}}}, + {X: Field{[10]uint32{0x030999cb, 0x02532a8c, 0x009aa443, 0x0079f962, 0x028500c9, 0x03a227cc, 0x02a683b7, 0x0242f61d, 0x03f91857, 0x001bf4cb}}, Y: Field{[10]uint32{0x01d2de3b, 0x025ea321, 0x0278c644, 0x024e3c69, 0x03efbd64, 0x031afc07, 0x013784e9, 0x03c975ea, 0x00841be1, 0x0004bfa0}}}, + {X: Field{[10]uint32{0x02d3b185, 0x02e4ad98, 0x0098b4eb, 0x03109bf7, 0x012d6d12, 0x01c25214, 0x0334812f, 0x027239bf, 0x00da4818, 0x001299f5}}, Y: Field{[10]uint32{0x038150f5, 0x033a945f, 0x01540684, 0x0174e269, 0x033e5009, 0x03e9c6e3, 0x03c668ee, 0x02ddddcd, 0x03f2f6e5, 0x00163aa0}}}, + {X: Field{[10]uint32{0x039f4db2, 0x0386fae9, 0x00c85987, 0x03165708, 0x00edecf4, 0x026b6d19, 0x020752db, 0x009dc174, 0x0131d3a9, 0x003a86b2}}, Y: Field{[10]uint32{0x0322b83e, 0x03dbcd19, 0x008309c3, 0x014da292, 0x03426b57, 0x001bf646, 0x0316597b, 0x02580560, 0x030e25aa, 0x0033da26}}}, + {X: Field{[10]uint32{0x01545c5a, 0x0136fd37, 0x006c12de, 0x03cfc65b, 0x0161414a, 0x02af2672, 0x032663f7, 0x00149f55, 0x026e248a, 0x00232cd6}}, Y: Field{[10]uint32{0x000cfcfa, 0x0254b99a, 0x02a7c4a3, 0x02afcdaf, 0x01c43292, 0x00235403, 0x02dfc3fa, 0x0336d99b, 0x00e047da, 0x0012ccb9}}}, + {X: Field{[10]uint32{0x027f21c8, 0x02673374, 0x008e3c8d, 0x02110c1e, 0x00843186, 0x01160558, 0x02f8dfbf, 0x030bab3f, 0x000cf150, 0x00091f20}}, Y: Field{[10]uint32{0x031d0db6, 0x010ba147, 0x030a7579, 0x01776cf9, 0x02a70839, 0x020a7adf, 0x026462f5, 0x03468398, 0x00dc914f, 0x003320b6}}}, + {X: Field{[10]uint32{0x03426673, 0x012191cc, 0x02482c9f, 0x0133b480, 0x025e0c4a, 0x0040dc23, 0x00f35666, 0x0249f3ec, 0x03c407fb, 0x001950f5}}, Y: Field{[10]uint32{0x0107ebab, 0x023cf51e, 0x0019c88d, 0x00c0ff72, 0x0020bbc7, 0x00c7a9d4, 0x00ae0d16, 0x02b5d605, 0x029a69b4, 0x003894ac}}}, + {X: Field{[10]uint32{0x0388e6d0, 0x0155ad30, 0x026c29b3, 0x036cb840, 0x02d5e759, 0x03d72705, 0x01da4aca, 0x00ce8e82, 0x0255d81c, 0x00313c44}}, Y: Field{[10]uint32{0x00a8fd49, 0x03554747, 0x014f24fc, 0x02ac61ba, 0x0195379e, 0x0123d463, 0x00e5530e, 0x022ad605, 0x02a81af4, 0x0038b98d}}}, + {X: Field{[10]uint32{0x02019eec, 0x0363be57, 0x005981ba, 0x023f2798, 0x01b08284, 0x012bd681, 0x003d92a1, 0x00e6ddce, 0x029d85da, 0x0033c61a}}, Y: Field{[10]uint32{0x0079e3fc, 0x01156f2c, 0x0064248f, 0x01f81873, 0x006b49f3, 0x0100425a, 0x03672a16, 0x03f8214f, 0x021bc860, 0x0032af78}}}, + {X: Field{[10]uint32{0x02ea8f32, 0x02ba40e1, 0x037f6be9, 0x011cf517, 0x00fe9d1d, 0x0222e3f6, 0x015c2c7a, 0x03704f96, 0x0353ad69, 0x0039b0f8}}, Y: Field{[10]uint32{0x00690be1, 0x001f0a2b, 0x02b57021, 0x008357b4, 0x0396b5a9, 0x012617cc, 0x0210800a, 0x01707485, 0x00c94f45, 0x001f4efb}}}, + {X: Field{[10]uint32{0x01060988, 0x029ecbb0, 0x01c118d6, 0x03ddcc34, 0x01d1ba01, 0x033c8a44, 0x0295dc6b, 0x01553551, 0x03a39bcb, 0x000e09ec}}, Y: Field{[10]uint32{0x0225a211, 0x0142bff2, 0x027bfd9f, 0x01890648, 0x00c800a3, 0x02e3d304, 0x0018c5ec, 0x03ba0c6e, 0x0047b7c9, 0x000c904c}}}, + {X: Field{[10]uint32{0x006d24fa, 0x01582373, 0x0013e48f, 0x021446d5, 0x004b55ed, 0x0102c3bd, 0x01ae898c, 0x01268aa3, 0x0138a4b1, 0x003fcdf3}}, Y: Field{[10]uint32{0x01c49048, 0x00cb2b2e, 0x03ceca68, 0x0354810c, 0x01f3ffde, 0x01a14ea5, 0x03a489b8, 0x019995f0, 0x01198f4c, 0x00179856}}}, + {X: Field{[10]uint32{0x020ce509, 0x034fa28c, 0x001def68, 0x01f11545, 0x01d9e53c, 0x03a0edd4, 0x03343229, 0x00beb87b, 0x03c85b49, 0x002f7fd3}}, Y: Field{[10]uint32{0x03de3d20, 0x013f7822, 0x00b8a43b, 0x0139135c, 0x02531f8a, 0x02656784, 0x015088a2, 0x01759985, 0x00649dcc, 0x003a3f66}}}, + {X: Field{[10]uint32{0x03bcd0af, 0x02a6cf0e, 0x02aef625, 0x001c9051, 0x02e59d10, 0x00063c47, 0x032719d9, 0x03cb55fe, 0x029c313f, 0x003f5ae8}}, Y: Field{[10]uint32{0x01c1079d, 0x00fa5f7d, 0x02bf6de7, 0x03a078e2, 0x035018db, 0x0065ae1d, 0x01f584b3, 0x00430c0e, 0x035e9133, 0x00061f6b}}}, + {X: Field{[10]uint32{0x0329ff28, 0x02dc42c6, 0x03b621d0, 0x01e05017, 0x004f4b5f, 0x02b0c05e, 0x032ae1c3, 0x01a4a7bd, 0x022d4860, 0x003a8f10}}, Y: Field{[10]uint32{0x03bf208c, 0x03fbe48c, 0x02af2564, 0x01f3be66, 0x01d10b37, 0x028c5b89, 0x03637eef, 0x0381bf0d, 0x001ec6c3, 0x0039162d}}}, + {X: Field{[10]uint32{0x007b3978, 0x01c14fd2, 0x03c390f8, 0x03b6bc6c, 0x0002ba8a, 0x002d166e, 0x0228924f, 0x03580234, 0x01334982, 0x001194dc}}, Y: Field{[10]uint32{0x01adf3f0, 0x03fd9693, 0x017006bb, 0x0368ee25, 0x023b2444, 0x00850f72, 0x003bb29e, 0x0277bfc9, 0x014c1318, 0x003f6599}}}, + {X: Field{[10]uint32{0x0178d8f5, 0x00dc5da1, 0x039dd996, 0x012a8b43, 0x01b5b29b, 0x03e78414, 0x036227f9, 0x001a6ab1, 0x03f11226, 0x003f6924}}, Y: Field{[10]uint32{0x01d46fa3, 0x02e1b1f8, 0x03a06d8e, 0x02d4958c, 0x02e04e55, 0x02600e98, 0x03a69d7f, 0x004db7d0, 0x013df63d, 0x00168cd6}}}, + {X: Field{[10]uint32{0x01f3e4c1, 0x0185d3ce, 0x000cd096, 0x015f15c8, 0x027ab5e7, 0x03a8dbfb, 0x028e2835, 0x00062951, 0x02e95f09, 0x001d3f10}}, Y: Field{[10]uint32{0x018751f0, 0x02c94848, 0x010b32a8, 0x01d52ff4, 0x033760e0, 0x017e3d75, 0x006204d4, 0x0324536a, 0x03403802, 0x00332a82}}}, + {X: Field{[10]uint32{0x00483d53, 0x022ec6bb, 0x03bafe11, 0x030a0503, 0x030d98f8, 0x0239051d, 0x03818da5, 0x01e68032, 0x004a997b, 0x0002633b}}, Y: Field{[10]uint32{0x02aaec08, 0x01a26b1f, 0x02ae4d81, 0x02782103, 0x01ac422d, 0x020b0675, 0x03b82fa1, 0x017354d9, 0x00581494, 0x000bf398}}}, + {X: Field{[10]uint32{0x03cba60f, 0x00dd2c44, 0x01fc13c2, 0x01025b31, 0x01e4fa15, 0x025ff55d, 0x015119f6, 0x032f7081, 0x01b789a5, 0x0031d0b7}}, Y: Field{[10]uint32{0x02f3532d, 0x02837a91, 0x0168013f, 0x03d3cac7, 0x01b32248, 0x039b6ea8, 0x002474b0, 0x02438750, 0x012834a9, 0x0026c2bc}}}, + {X: Field{[10]uint32{0x0391eb89, 0x0027f479, 0x0019b774, 0x0360ec4e, 0x005b5973, 0x03131c89, 0x00979136, 0x0019aad6, 0x004f9a78, 0x0036e8b8}}, Y: Field{[10]uint32{0x033baf43, 0x03f29798, 0x016a889d, 0x03821c11, 0x03aa0e90, 0x005e3c1d, 0x00240e7a, 0x017dd05a, 0x01223adb, 0x000d1d1e}}}, + {X: Field{[10]uint32{0x02f6538d, 0x0271a710, 0x01fbf106, 0x02183ada, 0x036cc47f, 0x03091cac, 0x0184dcb6, 0x021619ee, 0x02436e59, 0x001b532b}}, Y: Field{[10]uint32{0x01e0a84f, 0x02ec7cf5, 0x01cedb98, 0x019f59fc, 0x02125c2b, 0x00fbfbd4, 0x03c53c92, 0x03df3b75, 0x00c9f0c4, 0x0031fed6}}}, + {X: Field{[10]uint32{0x00523982, 0x005a80ee, 0x0010f9cc, 0x00e5bf65, 0x029ec5b5, 0x02eb8a46, 0x0264ed43, 0x01ec156d, 0x036ed5b6, 0x0013115f}}, Y: Field{[10]uint32{0x00f344eb, 0x007fb548, 0x00e988e9, 0x01ffb086, 0x02a435f4, 0x029ca09e, 0x022ed682, 0x03867d51, 0x03cf20aa, 0x00124b96}}}, + {X: Field{[10]uint32{0x0346eb3f, 0x035107f2, 0x018179cd, 0x030c1933, 0x0151fd8a, 0x01d2b8a5, 0x00033bfd, 0x022907d6, 0x01223477, 0x00135f9a}}, Y: Field{[10]uint32{0x022750c4, 0x024bd1b1, 0x012ad0c0, 0x001ef443, 0x036d7bbd, 0x01eb692e, 0x00538791, 0x0274f0e9, 0x00b2ff5c, 0x001d5bb0}}}, + {X: Field{[10]uint32{0x03d464b2, 0x0311f8c1, 0x0115cfef, 0x027292be, 0x004a4839, 0x02dd3be5, 0x03c565ea, 0x0351e6f6, 0x025069ba, 0x0002b16f}}, Y: Field{[10]uint32{0x02874345, 0x02df3eb7, 0x00381928, 0x02a94a6d, 0x008bad5d, 0x02739176, 0x0322c546, 0x0042d8dd, 0x03febc58, 0x000c91b8}}}, + {X: Field{[10]uint32{0x023995b2, 0x027a1036, 0x002d15d6, 0x002d8362, 0x0224f91e, 0x014d2c96, 0x026a4812, 0x0004e6ff, 0x01412135, 0x001f6a23}}, Y: Field{[10]uint32{0x00b9c587, 0x0080d23c, 0x03eb5cbc, 0x00b262b6, 0x026a2d09, 0x025dc90c, 0x00bb03cf, 0x0293e1c0, 0x018d62a7, 0x0026222b}}}, + {X: Field{[10]uint32{0x01abf149, 0x014af8ec, 0x037d4e8b, 0x00ac1744, 0x015d3b92, 0x034f3ad2, 0x01aa3eb4, 0x02734832, 0x031a6323, 0x000e27fc}}, Y: Field{[10]uint32{0x00fe7c93, 0x03000dce, 0x02d49dc3, 0x03b55456, 0x01042f54, 0x01db0521, 0x022ab22b, 0x002fca28, 0x022fbc84, 0x002c3b0a}}}, + {X: Field{[10]uint32{0x016c4370, 0x009e9756, 0x036f8f3c, 0x012637f3, 0x02a94b2e, 0x00f55cdb, 0x025afaad, 0x00a2cba9, 0x02cf5fb1, 0x00307306}}, Y: Field{[10]uint32{0x034fd38e, 0x010279a4, 0x0153b27c, 0x02a706ec, 0x00ecfec6, 0x028aa233, 0x006bf2da, 0x02b4c5b3, 0x004d1986, 0x002240d6}}}, + {X: Field{[10]uint32{0x03c9aa3a, 0x01462d21, 0x03cf98b3, 0x015fa46c, 0x0002a349, 0x00725b01, 0x0340be83, 0x01a28a91, 0x0252b927, 0x000e66b3}}, Y: Field{[10]uint32{0x00800005, 0x03ac4d12, 0x02869786, 0x030f2812, 0x03fd9af1, 0x035827e8, 0x017ae095, 0x00e91e84, 0x00b3abdb, 0x002420c5}}}, + {X: Field{[10]uint32{0x0206d0a2, 0x020eea6e, 0x03c76d82, 0x001832b6, 0x01470cc6, 0x001694ae, 0x02d98593, 0x000695c0, 0x03fd8c9d, 0x0001a550}}, Y: Field{[10]uint32{0x031057df, 0x03a2865c, 0x01d1b6f4, 0x030e2a40, 0x00404eb1, 0x00ca6022, 0x0348f17b, 0x01cbb4b8, 0x03d9a0c3, 0x003a6639}}}, + {X: Field{[10]uint32{0x00200100, 0x02dabdfa, 0x02d6d400, 0x00f3dc0e, 0x00911e55, 0x01cac70a, 0x01289a58, 0x011bbd68, 0x014fdf9b, 0x00085cb5}}, Y: Field{[10]uint32{0x03687a8c, 0x00625c46, 0x035d9edc, 0x03afd90a, 0x0334a8fb, 0x01cac89b, 0x0020df57, 0x00397832, 0x007d3b79, 0x0008486d}}}, + {X: Field{[10]uint32{0x015e8b56, 0x017df3a7, 0x03f286d4, 0x00e84390, 0x01cc2713, 0x01248e59, 0x026847d2, 0x00939743, 0x03e937a3, 0x003d81bd}}, Y: Field{[10]uint32{0x0286e007, 0x039d5c4f, 0x008d1a30, 0x02024728, 0x03f5b805, 0x024c9284, 0x03379448, 0x00878b44, 0x03b8622a, 0x001c004f}}}, + {X: Field{[10]uint32{0x0040fc99, 0x03639c5f, 0x0214edfc, 0x00b7526a, 0x012f95bb, 0x00d0abcd, 0x0032013b, 0x02d93c7d, 0x00c2dfce, 0x0027c548}}, Y: Field{[10]uint32{0x018e863d, 0x035534e2, 0x001996ca, 0x029040c2, 0x02d53dc0, 0x0192a41f, 0x024fe3b7, 0x03c0123e, 0x0226feb1, 0x003fa3f2}}}, + {X: Field{[10]uint32{0x031eaa08, 0x024dc288, 0x0260518a, 0x00632ca1, 0x0053afe4, 0x01724f4e, 0x00674eb7, 0x019dbbac, 0x036e7587, 0x00199c2b}}, Y: Field{[10]uint32{0x03eb09f3, 0x02933b92, 0x0053734b, 0x03314936, 0x00fb59fc, 0x02ec4bf6, 0x03fcee90, 0x01c7b825, 0x035edfc0, 0x000a64ff}}}, + {X: Field{[10]uint32{0x03898350, 0x0166a52c, 0x0152465f, 0x013ab5b2, 0x0140650a, 0x03a5530b, 0x00a4e2fe, 0x0312f393, 0x018b345c, 0x000571b5}}, Y: Field{[10]uint32{0x0363cf7f, 0x0039de28, 0x02cf3a6b, 0x02a9cf7c, 0x00221b12, 0x014a34b0, 0x020f3adf, 0x01865996, 0x013b4727, 0x00022531}}}, + {X: Field{[10]uint32{0x01389621, 0x00665ddd, 0x024548a9, 0x0082583a, 0x00adfffd, 0x017e1692, 0x0293ef17, 0x03790b24, 0x02bf60db, 0x002f12ad}}, Y: Field{[10]uint32{0x01040e42, 0x00d1d846, 0x01a4437a, 0x01d18552, 0x0100791a, 0x0335c64c, 0x016bb68e, 0x038a9d17, 0x00ba24a4, 0x003f8a28}}}, + {X: Field{[10]uint32{0x013e6ee1, 0x03cb8443, 0x01c8054e, 0x0141001f, 0x0064f20e, 0x031c0eea, 0x015e87f1, 0x03cbdb92, 0x006323fb, 0x00176ac7}}, Y: Field{[10]uint32{0x02695d93, 0x00d2a194, 0x023059c1, 0x0305acc3, 0x03e7f01a, 0x039a2ffe, 0x02db4153, 0x0182f6b9, 0x0200cf44, 0x0007f430}}}, + {X: Field{[10]uint32{0x028acaf2, 0x01f0625a, 0x03bb2dd6, 0x03639c0b, 0x035cea0b, 0x030ce73a, 0x0228dbb0, 0x01f111ef, 0x0157d735, 0x000b7c73}}, Y: Field{[10]uint32{0x02f1b9e8, 0x03d096b8, 0x01741492, 0x019e6577, 0x0186eefa, 0x0136ddbd, 0x039c0319, 0x0323770e, 0x001120cb, 0x000cc648}}}, + {X: Field{[10]uint32{0x00d9ab8d, 0x01377bd8, 0x02fea058, 0x019054d5, 0x023d9f97, 0x034aeb1d, 0x0100585e, 0x036bc20c, 0x00175a02, 0x000b606b}}, Y: Field{[10]uint32{0x01f9a0b7, 0x02060f0b, 0x011c9cd5, 0x00b33a7d, 0x0021052e, 0x039b09b9, 0x0297fd49, 0x0217d5e0, 0x00d13b17, 0x003e6423}}}, + {X: Field{[10]uint32{0x037dc097, 0x0241c090, 0x00db59ef, 0x03d3c47a, 0x0367b1e7, 0x00d5bac5, 0x000d40a5, 0x00b9cc91, 0x0362fb73, 0x0007eb05}}, Y: Field{[10]uint32{0x039b8729, 0x0176569e, 0x031584df, 0x009c04a7, 0x015ae7ce, 0x01d72cc3, 0x01a08ace, 0x01444cad, 0x004ca58d, 0x003b755e}}}, + {X: Field{[10]uint32{0x00c8c98e, 0x00659e0e, 0x01a9cc2b, 0x03c266c5, 0x0245caba, 0x02aa421b, 0x0093e884, 0x02e42e03, 0x035b4694, 0x00341a82}}, Y: Field{[10]uint32{0x0347def3, 0x00833ec1, 0x02da4986, 0x00517de2, 0x0114fcc8, 0x008bfcec, 0x01b391b2, 0x02c93f34, 0x02ba2777, 0x00132b51}}}, + {X: Field{[10]uint32{0x01e53445, 0x0054ac5f, 0x01d6929b, 0x02e33e6c, 0x01870059, 0x02dbc1a5, 0x007928ac, 0x0103e664, 0x03275902, 0x00124a37}}, Y: Field{[10]uint32{0x0300d505, 0x029d468c, 0x00ac53db, 0x0330a1aa, 0x03240b83, 0x01f70cda, 0x00c400f3, 0x00ec39ec, 0x020b655b, 0x002ddcf9}}}, + {X: Field{[10]uint32{0x03a28390, 0x018e7fe1, 0x01dda1b8, 0x01430cc7, 0x03f945d4, 0x00c8a09f, 0x02992617, 0x0060452e, 0x01f9cd54, 0x002986f3}}, Y: Field{[10]uint32{0x00d93a68, 0x03fa01ee, 0x004eeb40, 0x01c3af99, 0x018e61b3, 0x0007f893, 0x0201b2b3, 0x02eca151, 0x016ed6fd, 0x000f9dc7}}}, + {X: Field{[10]uint32{0x01db93c3, 0x0106c544, 0x0093f9f6, 0x013041fc, 0x030fb8e3, 0x00029e5d, 0x031228c0, 0x02deaece, 0x01b93e2f, 0x0014d68d}}, Y: Field{[10]uint32{0x02ff786f, 0x027fb26c, 0x02e96f0c, 0x02d7a354, 0x0292475f, 0x01f0b8f0, 0x0283fba2, 0x033230e0, 0x03355657, 0x00091c7f}}}, + {X: Field{[10]uint32{0x0065d4d0, 0x01e42d31, 0x00acfa5f, 0x00ab442e, 0x00f23ad4, 0x01af9c2c, 0x02888bbc, 0x003ca4dd, 0x012ce014, 0x0039a299}}, Y: Field{[10]uint32{0x001a7385, 0x03e7074f, 0x0094c06c, 0x01f82e03, 0x00ea6e0c, 0x02b54848, 0x034ecb6d, 0x00182cc4, 0x010cc368, 0x001275ce}}}, + {X: Field{[10]uint32{0x03e25fde, 0x03c3a64d, 0x007576b4, 0x01bc22f1, 0x01f5f05f, 0x03a883a6, 0x017855c3, 0x03334fbc, 0x027a74df, 0x003a24e7}}, Y: Field{[10]uint32{0x0261b173, 0x020a7fb5, 0x0388b3e0, 0x015368b0, 0x033773f4, 0x0127930a, 0x00c0fdf4, 0x0156df24, 0x033eff0a, 0x001ad229}}}, + {X: Field{[10]uint32{0x00751543, 0x0003ebd2, 0x01dafbfd, 0x020d9f0c, 0x007fe164, 0x029b9c2b, 0x00fa2930, 0x0061d200, 0x03ea3145, 0x00125804}}, Y: Field{[10]uint32{0x038c4332, 0x00b8bc6a, 0x03f65614, 0x0022e14d, 0x02581e15, 0x020accc4, 0x00001cb2, 0x0155be29, 0x01118790, 0x002d5c54}}}, + {X: Field{[10]uint32{0x004b1e1f, 0x0370f060, 0x0120189d, 0x00a79f31, 0x01bb0f6c, 0x00981342, 0x0157a072, 0x030ea55a, 0x01b0b1ef, 0x001111cd}}, Y: Field{[10]uint32{0x0259d6e4, 0x02f9001f, 0x0321f9ae, 0x027cca96, 0x023e9a43, 0x00143956, 0x0332a857, 0x02eacea5, 0x00a3461a, 0x002c6b58}}}, + {X: Field{[10]uint32{0x02d9511c, 0x02d0450f, 0x02475da3, 0x02279dea, 0x03e88821, 0x02e72630, 0x01a40e74, 0x01f573e1, 0x02c84acd, 0x00016016}}, Y: Field{[10]uint32{0x023c07c0, 0x0204d35a, 0x02363bb4, 0x00882bab, 0x0301ad00, 0x03635a6d, 0x0170dcf0, 0x014cfdef, 0x023bfbba, 0x003254a4}}}, + {X: Field{[10]uint32{0x039a9501, 0x02ddfbc9, 0x00898dca, 0x02f711b2, 0x02c12619, 0x02da4080, 0x01c53a12, 0x031e1578, 0x011830fd, 0x0022b045}}, Y: Field{[10]uint32{0x01ca4fa4, 0x035af52a, 0x0053ad59, 0x02e376cc, 0x00d5deb3, 0x02fec800, 0x0015493a, 0x03e83874, 0x00c77867, 0x000a7edf}}}, + {X: Field{[10]uint32{0x02ab542d, 0x01ed1102, 0x01ec67bd, 0x01bc8bd0, 0x014d7022, 0x031efbfd, 0x03c8a7cc, 0x02632da3, 0x01d3e429, 0x002a91eb}}, Y: Field{[10]uint32{0x003683e9, 0x0079d731, 0x01816f77, 0x013f0656, 0x024f8e8c, 0x03d9d166, 0x034f9e39, 0x036630eb, 0x0081ebef, 0x0033e96b}}}, + {X: Field{[10]uint32{0x0199889a, 0x02236e79, 0x013e419e, 0x026390cf, 0x03d39848, 0x019248ad, 0x0133f753, 0x0053ba48, 0x0127a27a, 0x003cd410}}, Y: Field{[10]uint32{0x001b45df, 0x0337c218, 0x03313c09, 0x008e819a, 0x0256c6d4, 0x01ef2e21, 0x02cdae54, 0x01a2a213, 0x037e9f98, 0x003c6be7}}}, + {X: Field{[10]uint32{0x024bf08d, 0x03bbbb5f, 0x0398c7c6, 0x03964986, 0x02272d3c, 0x026a6269, 0x00870766, 0x039a20d6, 0x0344edcb, 0x000cdcc3}}, Y: Field{[10]uint32{0x01775a6b, 0x0172f9b8, 0x02794860, 0x01fb31c2, 0x01b6fd05, 0x02f4b5e2, 0x02a32d81, 0x005b412c, 0x0128d877, 0x000fe0ce}}}, + {X: Field{[10]uint32{0x02dfb0d6, 0x02d2850f, 0x034786e5, 0x01fef84d, 0x00a33d41, 0x02492730, 0x00bdf072, 0x03d61220, 0x02dc8c06, 0x000c5a75}}, Y: Field{[10]uint32{0x0274ce5f, 0x018fa1aa, 0x037fcea1, 0x0030bf79, 0x00a31160, 0x023d0a32, 0x0382f596, 0x00e0e6e9, 0x022dec56, 0x000aa450}}}, + {X: Field{[10]uint32{0x002a4429, 0x03f331bc, 0x038e980c, 0x0114355f, 0x03c8c43a, 0x02a370fa, 0x007a64d5, 0x02ba073c, 0x0182013a, 0x00363191}}, Y: Field{[10]uint32{0x03822aea, 0x012312a4, 0x02a7be7f, 0x011e1278, 0x02c4773d, 0x027fb8ec, 0x012f195c, 0x018eba32, 0x00519688, 0x003121cc}}}, + {X: Field{[10]uint32{0x002b6f11, 0x007da7d0, 0x03fe1789, 0x03605368, 0x007e59c8, 0x018c6e21, 0x03cb0395, 0x0091bde9, 0x001f307e, 0x002b99c4}}, Y: Field{[10]uint32{0x01ed44cb, 0x007871c4, 0x022aee41, 0x03e5f608, 0x031d3900, 0x027e68d5, 0x02767afa, 0x0027a2e5, 0x03b4a90b, 0x003d7cb6}}}, + {X: Field{[10]uint32{0x01dbd8ee, 0x035fc520, 0x00f0c1a9, 0x010e095d, 0x02b4e2ff, 0x02068b17, 0x00a7dc9c, 0x020ce070, 0x023183ba, 0x002a7a1c}}, Y: Field{[10]uint32{0x02468901, 0x03775be5, 0x023354b7, 0x02b0f5ce, 0x03333153, 0x039a0d13, 0x01fb59be, 0x0038cf5a, 0x019990d9, 0x0025a041}}}, + {X: Field{[10]uint32{0x003376f2, 0x01078d39, 0x0048dad1, 0x01e7ed6f, 0x00694ef8, 0x00cf9a12, 0x014f43aa, 0x03502c9a, 0x021c0ae7, 0x00185afc}}, Y: Field{[10]uint32{0x0080fc77, 0x01772526, 0x02799bf0, 0x016a8f67, 0x024a2772, 0x02d693ea, 0x02451153, 0x0282ea0c, 0x03832aa8, 0x002fb063}}}, + {X: Field{[10]uint32{0x033f5c2d, 0x0144262b, 0x0295f8d3, 0x033dc069, 0x0339be47, 0x03a6f96e, 0x02882b11, 0x00cf51e2, 0x0335601f, 0x000487a0}}, Y: Field{[10]uint32{0x0103b3e8, 0x00a8a613, 0x03659f68, 0x01c11216, 0x03010dd0, 0x02ffe077, 0x005fdfdc, 0x02812df6, 0x013318fa, 0x000ba64a}}}, + {X: Field{[10]uint32{0x009f1141, 0x02325eee, 0x0193325c, 0x00a12a42, 0x003a83cc, 0x03bc6f12, 0x0013948f, 0x032a7025, 0x03973025, 0x002fe211}}, Y: Field{[10]uint32{0x02ad5386, 0x01c4fd9b, 0x0363f0e2, 0x0181aaee, 0x016de247, 0x020e3449, 0x015ae3a7, 0x03475e1b, 0x03263d26, 0x000654e8}}}, + {X: Field{[10]uint32{0x02f811f0, 0x0180295a, 0x02124e86, 0x0383ebb6, 0x00dd1b06, 0x0371d734, 0x0094d4bd, 0x0003e617, 0x01a65a38, 0x001f0a3a}}, Y: Field{[10]uint32{0x02b5c277, 0x005218e2, 0x03863134, 0x035bcb90, 0x002d396f, 0x001d09ed, 0x014cedb7, 0x027c0e24, 0x01b70e33, 0x0028dd5b}}}, + {X: Field{[10]uint32{0x00a66077, 0x024c5ca4, 0x02b9cb8b, 0x0244c6f0, 0x0346be07, 0x02e48e1e, 0x00b5bf6b, 0x00b3d073, 0x01ad45e6, 0x00397b1b}}, Y: Field{[10]uint32{0x004f0e19, 0x00ceaeb9, 0x00eda67c, 0x0249e884, 0x012bacd0, 0x038f1348, 0x014bea4b, 0x000f2be1, 0x02cc7757, 0x00340117}}}, + {X: Field{[10]uint32{0x018c2fed, 0x00d85a44, 0x02043583, 0x00f8d363, 0x00703626, 0x0112965d, 0x031c3525, 0x025517ec, 0x021f9203, 0x001bf25b}}, Y: Field{[10]uint32{0x038a9a51, 0x02eaeb62, 0x0089d9aa, 0x00376434, 0x026ca7c2, 0x010e5f8d, 0x030457f8, 0x037a365a, 0x02871571, 0x00340cb7}}}, + {X: Field{[10]uint32{0x006e4133, 0x0244569d, 0x0149acf4, 0x03738684, 0x021db684, 0x01f04c51, 0x02790914, 0x02711d0b, 0x03511c21, 0x002278f4}}, Y: Field{[10]uint32{0x030c5c90, 0x00be4618, 0x00b03689, 0x02eeec89, 0x0352fde5, 0x000f55fa, 0x00b53d23, 0x0211a361, 0x030b672e, 0x002aaf65}}}, + {X: Field{[10]uint32{0x010d5890, 0x0238628e, 0x01de84ff, 0x011c3fa8, 0x00c043e9, 0x02b6e36a, 0x00eb44ea, 0x01914e1e, 0x00f0b213, 0x000ade98}}, Y: Field{[10]uint32{0x004a5244, 0x02eeadf4, 0x02f41ae8, 0x01b46409, 0x01b80668, 0x02ce2cd9, 0x03407091, 0x00ca8164, 0x03161ba0, 0x000320a6}}}, + {X: Field{[10]uint32{0x009627e7, 0x01c8141b, 0x029d42f8, 0x01e6498e, 0x01bfeb98, 0x021e0bc9, 0x037c3dfa, 0x02badf9b, 0x031ac2c2, 0x001192e7}}, Y: Field{[10]uint32{0x02f7502c, 0x016d6d6d, 0x028aadac, 0x001db2d3, 0x029a23a1, 0x0140e1d7, 0x03761dbe, 0x02f30b7d, 0x03f459e1, 0x001f0982}}}, + {X: Field{[10]uint32{0x019b616f, 0x02d8e89d, 0x035ab268, 0x006a61ba, 0x000b2514, 0x01dd2d9c, 0x0331519e, 0x008a5438, 0x02304357, 0x001e494f}}, Y: Field{[10]uint32{0x027f88e1, 0x000d61b8, 0x03f69100, 0x0363c95d, 0x02ed6467, 0x01a59972, 0x00f5bae9, 0x008d4ec8, 0x017a55b6, 0x00369827}}}, + {X: Field{[10]uint32{0x01399556, 0x010b45b7, 0x02773876, 0x00250d65, 0x01019acb, 0x0154643e, 0x02b1967f, 0x03032d70, 0x007ce900, 0x00018d0a}}, Y: Field{[10]uint32{0x03debead, 0x02d186b0, 0x037581fc, 0x00f8c4af, 0x00223c47, 0x014ccd2b, 0x00042db2, 0x005804c3, 0x01098cf0, 0x00288d42}}}, + {X: Field{[10]uint32{0x021bee98, 0x01fc60d0, 0x00223358, 0x012e4588, 0x02d7ef2f, 0x01a9d6d0, 0x0018557f, 0x03f56e8d, 0x01c38bd8, 0x001d8448}}, Y: Field{[10]uint32{0x02dd530f, 0x025ef6d4, 0x010405c8, 0x00d2bebb, 0x0276070e, 0x02eca489, 0x026eeb01, 0x01d0d443, 0x015ff9c1, 0x0010051c}}}, + {X: Field{[10]uint32{0x01453413, 0x0375819b, 0x034b3e63, 0x03870bc1, 0x0077990f, 0x039428ac, 0x01a30784, 0x037c6967, 0x00c1bfbb, 0x00098632}}, Y: Field{[10]uint32{0x02a48da0, 0x01a7774c, 0x01ab0581, 0x016cc9bf, 0x024bdaf3, 0x03a8f2d1, 0x00e584b4, 0x02daac63, 0x023720f5, 0x002b94e6}}}, + {X: Field{[10]uint32{0x00f685be, 0x007c76e4, 0x0020dab3, 0x02d70266, 0x00d91699, 0x0124c22d, 0x03a57e19, 0x03c097f1, 0x00cc10c6, 0x00350a7f}}, Y: Field{[10]uint32{0x02648edf, 0x026f5396, 0x00964068, 0x00f5bedb, 0x00a8df04, 0x02f945a2, 0x0014ae91, 0x01646379, 0x01c1ee15, 0x00368ac5}}}, + {X: Field{[10]uint32{0x00e8b705, 0x036a3639, 0x00b6d56d, 0x03d8d994, 0x01bf1e0c, 0x028b6bbd, 0x0207625b, 0x0232acdb, 0x03c7c04b, 0x001a8638}}, Y: Field{[10]uint32{0x00e94eec, 0x005762f0, 0x0049ed62, 0x010097f3, 0x0120e754, 0x03149507, 0x039c9dab, 0x025b6faf, 0x0330f56c, 0x00198a44}}}, + {X: Field{[10]uint32{0x00f97756, 0x01e848be, 0x032201a3, 0x03fe906c, 0x01d7ca3e, 0x01a88719, 0x002fa4ad, 0x03cff952, 0x0046d1c9, 0x002616da}}, Y: Field{[10]uint32{0x02a3a92e, 0x03d5102a, 0x01592d56, 0x030234e4, 0x03bb9dc6, 0x03150fe2, 0x022f2c32, 0x023dadda, 0x03dd98e1, 0x000f8ac8}}}, + {X: Field{[10]uint32{0x026e8c64, 0x024a5b27, 0x03f3355c, 0x038e5953, 0x0296fba8, 0x031ef328, 0x02ee3395, 0x00e2918f, 0x01db4ba8, 0x00252283}}, Y: Field{[10]uint32{0x00f5c1d8, 0x010c970f, 0x00d2e12c, 0x03b4bde5, 0x01c7b705, 0x03949f58, 0x03b69b52, 0x0360fad9, 0x0025da19, 0x00316cd3}}}, + {X: Field{[10]uint32{0x00a3de2e, 0x02a903ea, 0x028c4256, 0x0331a521, 0x020a437f, 0x020985ec, 0x0246b47e, 0x02c0fede, 0x002c1332, 0x0010ccb4}}, Y: Field{[10]uint32{0x02aa5289, 0x02f83762, 0x01de1e1b, 0x02adcdd9, 0x00393985, 0x025045e0, 0x00327c03, 0x015576a5, 0x016f5f9c, 0x0039b946}}}, + {X: Field{[10]uint32{0x022a5aa3, 0x0330fedc, 0x01d96a67, 0x0315ac84, 0x02f7e12d, 0x0235a7d6, 0x0150b68a, 0x032257cc, 0x03b92ac1, 0x0017725d}}, Y: Field{[10]uint32{0x0107844d, 0x0342e567, 0x0217d10f, 0x00d0d040, 0x0283260c, 0x0331a5b4, 0x03d29123, 0x03b27872, 0x00a74bf1, 0x00116223}}}, + {X: Field{[10]uint32{0x03d15764, 0x006a078f, 0x022b0c6e, 0x035f418e, 0x00605e3b, 0x00000e49, 0x030cb6df, 0x03c492a6, 0x0134ca94, 0x0016e73d}}, Y: Field{[10]uint32{0x00897458, 0x006f2f00, 0x03d1d0d8, 0x01233a22, 0x03f9ba4b, 0x0282cb59, 0x0248790f, 0x01bffaf6, 0x01c3b051, 0x00113a63}}}, + {X: Field{[10]uint32{0x01372f59, 0x035ffdb5, 0x00a6697f, 0x02c25d1b, 0x02e2feb4, 0x022578b7, 0x026baf9c, 0x01c531f4, 0x00073a63, 0x00210d4c}}, Y: Field{[10]uint32{0x00c7a175, 0x00fcda2c, 0x022d23ca, 0x01f209b1, 0x023f9fea, 0x03cbcd14, 0x037361c0, 0x02751132, 0x029e3768, 0x0035cdce}}}, + {X: Field{[10]uint32{0x021e6a61, 0x000c3eb0, 0x02619804, 0x037fe1d1, 0x008f1a28, 0x00e09b9e, 0x008485fc, 0x026d7227, 0x000e3eef, 0x00273c00}}, Y: Field{[10]uint32{0x0291543c, 0x0184bdff, 0x020a1ac2, 0x01daaa47, 0x002764cd, 0x00801708, 0x021fcb9d, 0x012cb653, 0x033ad868, 0x000acf6a}}}, + {X: Field{[10]uint32{0x00e1235c, 0x01c68913, 0x035e9996, 0x014e0ebf, 0x038ee028, 0x012469d5, 0x0088b25b, 0x00623882, 0x03dc5897, 0x002eca4b}}, Y: Field{[10]uint32{0x012507e5, 0x00bd6690, 0x023a09e0, 0x03dc9f86, 0x00d5e9b8, 0x01624cd2, 0x03839909, 0x01e18ef2, 0x01c350ba, 0x0034edb6}}}, + {X: Field{[10]uint32{0x03b7d680, 0x01c32403, 0x01ced2d7, 0x01afc9f1, 0x03efd2bc, 0x008e6d88, 0x008a21a9, 0x03b55daa, 0x01d89835, 0x002575b4}}, Y: Field{[10]uint32{0x00baf048, 0x02ff819b, 0x02468e40, 0x00e31cb3, 0x02b39e7d, 0x03cf39a4, 0x034ac720, 0x01973bea, 0x01ad39db, 0x0032454d}}}, + {X: Field{[10]uint32{0x01d09a46, 0x01428ea1, 0x00fd89ee, 0x021f7cb2, 0x0115ea37, 0x00328325, 0x02c3fb90, 0x03b08270, 0x020fa164, 0x0032f8fc}}, Y: Field{[10]uint32{0x02fb9a28, 0x00bbfe42, 0x00e8b825, 0x01469962, 0x01734a22, 0x0061b9bb, 0x02222804, 0x00596d23, 0x0354faea, 0x00335625}}}, + {X: Field{[10]uint32{0x039f604a, 0x0278a4ec, 0x020949f3, 0x03d121f5, 0x01002942, 0x0299e0d7, 0x031c215b, 0x02788166, 0x02b99bab, 0x000f8076}}, Y: Field{[10]uint32{0x0123d481, 0x0172d7a1, 0x022670bd, 0x03e7a2da, 0x00d0a556, 0x019e7cfa, 0x03509798, 0x014113b8, 0x00323336, 0x002d0777}}}, + {X: Field{[10]uint32{0x02afef7a, 0x004e991d, 0x03350972, 0x0238578f, 0x01c79891, 0x012d8cc7, 0x031cfd2e, 0x03725857, 0x00c05543, 0x000a625d}}, Y: Field{[10]uint32{0x0299da2f, 0x0360181e, 0x0257de5c, 0x028d8b2d, 0x0222354e, 0x011fd82c, 0x00e02e87, 0x0362fa9d, 0x035555f2, 0x001a0060}}}, + {X: Field{[10]uint32{0x011fdc61, 0x019e4fd4, 0x003dfd93, 0x0322824f, 0x022aabde, 0x0107453d, 0x03764b46, 0x00f25ba8, 0x034d5476, 0x00075c19}}, Y: Field{[10]uint32{0x00dfe632, 0x03ad2f8e, 0x0010e8a4, 0x000588f7, 0x02807741, 0x025d4fd0, 0x024378e5, 0x0112f18c, 0x01ac697e, 0x00259d2b}}}, + {X: Field{[10]uint32{0x000fece1, 0x02c713c1, 0x00fbacc0, 0x02be46ae, 0x0073c47a, 0x023e2d8d, 0x021875ec, 0x02e5c189, 0x0107b43a, 0x001d4880}}, Y: Field{[10]uint32{0x03aeaffb, 0x01580ba8, 0x00b7b088, 0x035670d4, 0x0041bc9a, 0x02d5bbee, 0x02ebf2bf, 0x001f404a, 0x027cc3bf, 0x000a4253}}}, + {X: Field{[10]uint32{0x03779720, 0x039e4883, 0x03df92e7, 0x0232743b, 0x03fc7f4c, 0x002eb20e, 0x01b31aab, 0x013b0c9f, 0x01ffb347, 0x0033eb6e}}, Y: Field{[10]uint32{0x019a09b2, 0x002e64c3, 0x00b06ab0, 0x001b34ae, 0x0297d418, 0x02a67ea0, 0x0322ee02, 0x023315e3, 0x017f6f7b, 0x003fedd9}}}, + {X: Field{[10]uint32{0x01cb828f, 0x03a2daf0, 0x026f464c, 0x03d35ee0, 0x0334a7b4, 0x027612a9, 0x02e46e13, 0x01580eb7, 0x019dbe3c, 0x00093ba4}}, Y: Field{[10]uint32{0x03ff1506, 0x0297a985, 0x03e29364, 0x01dbb55f, 0x01ca6514, 0x00e6e3c4, 0x020b63c5, 0x0151ee4d, 0x0356794b, 0x001100e5}}}, + {X: Field{[10]uint32{0x00b100f4, 0x00c3bfdf, 0x011dd1b5, 0x014ff90e, 0x00c50ddb, 0x02972fbb, 0x016b8f10, 0x01495bd3, 0x02462f75, 0x00166578}}, Y: Field{[10]uint32{0x001dc64a, 0x005875b6, 0x0018ce08, 0x01ac4f74, 0x03fe78ac, 0x010049ff, 0x02d7ba20, 0x01459711, 0x027c7da0, 0x001df776}}}, + {X: Field{[10]uint32{0x034d54dd, 0x035470c8, 0x019c29db, 0x00dc073c, 0x00364f8c, 0x02464f02, 0x029fa205, 0x011e3384, 0x007197dd, 0x0029c8cd}}, Y: Field{[10]uint32{0x01796e68, 0x00bbbc4c, 0x019ad92f, 0x00446874, 0x009cfdd7, 0x006a5999, 0x00a5fa00, 0x00b32ce1, 0x015eec2b, 0x000b139a}}}, + {X: Field{[10]uint32{0x032251a5, 0x015b3404, 0x01c234ed, 0x0358eb50, 0x01a57cfe, 0x037a7f32, 0x0275fcc5, 0x00872f5f, 0x0369d5bc, 0x001919aa}}, Y: Field{[10]uint32{0x01294dc9, 0x0037e909, 0x005d2099, 0x033f12bc, 0x022e0c1e, 0x03da2536, 0x0222f5e5, 0x005b89d9, 0x03896dbb, 0x001db9fb}}}, + {X: Field{[10]uint32{0x01c28e60, 0x02b3683d, 0x014f11e0, 0x02d478cf, 0x017fab8b, 0x03c85851, 0x02fca2ab, 0x0222af79, 0x0390a293, 0x00297b33}}, Y: Field{[10]uint32{0x020e3ac3, 0x0016c998, 0x023f7948, 0x038b2044, 0x03110e74, 0x019a42b7, 0x02886435, 0x0047cdcf, 0x0116468a, 0x002bf5d6}}}, + {X: Field{[10]uint32{0x029c2779, 0x03561c7b, 0x01cdf89e, 0x01813472, 0x006a15d0, 0x00fb6796, 0x02e52a1e, 0x01e367c9, 0x02c74936, 0x0010946e}}, Y: Field{[10]uint32{0x02987aa5, 0x016b62dc, 0x0138d3a1, 0x032437fe, 0x004bb023, 0x01980ef3, 0x0190c60e, 0x01c5b5da, 0x027d92e6, 0x003e877c}}}, + {X: Field{[10]uint32{0x027db30e, 0x00b0a93e, 0x01903f04, 0x03409aa0, 0x030f40c9, 0x006078a0, 0x00f6b973, 0x03308763, 0x02a204c3, 0x001dea79}}, Y: Field{[10]uint32{0x00155aa0, 0x00f79746, 0x03180b6e, 0x0041cacb, 0x03e78d93, 0x02a84333, 0x01b757fa, 0x017336f7, 0x03ef23f2, 0x00287bd3}}}, + {X: Field{[10]uint32{0x03dbea6b, 0x007fdf9b, 0x0239de75, 0x003a667d, 0x02e9c0d2, 0x015dfe8a, 0x02de73c4, 0x01386f5a, 0x0161c40d, 0x000cff9e}}, Y: Field{[10]uint32{0x01f54849, 0x0102e335, 0x03037058, 0x0251c8ca, 0x039a5919, 0x01930c33, 0x016e7c14, 0x00c1b38c, 0x01cd4eeb, 0x00246df5}}}, + {X: Field{[10]uint32{0x01179564, 0x02085c3e, 0x003115b6, 0x00054927, 0x03395357, 0x01216f8b, 0x00a9d8cb, 0x00884692, 0x032e5ee5, 0x0010fd9a}}, Y: Field{[10]uint32{0x01a46a45, 0x03de1d0b, 0x028921db, 0x0265ca39, 0x003555e6, 0x018fd7e2, 0x030cf7fe, 0x03aefc30, 0x015ffec0, 0x0014dc2d}}}, + {X: Field{[10]uint32{0x00b19bfc, 0x0116db0e, 0x0170e1a7, 0x010dcfd6, 0x03ad2f0b, 0x011baa1e, 0x00c7f6b4, 0x0041d35d, 0x021497ef, 0x0012b4d9}}, Y: Field{[10]uint32{0x035cfd39, 0x0133583b, 0x03cfc0cd, 0x0208ca7a, 0x036f9eea, 0x00dbe143, 0x02da00d4, 0x016ff57a, 0x01aa769a, 0x0023d770}}}, + {X: Field{[10]uint32{0x0012754d, 0x035654f0, 0x012f9155, 0x019a6cbc, 0x02593368, 0x016de5ea, 0x0334dc97, 0x013553cd, 0x02ef9520, 0x0025e66a}}, Y: Field{[10]uint32{0x003e6353, 0x016a1d7a, 0x02f3a984, 0x03b3a88d, 0x0044c256, 0x03124b55, 0x025b476b, 0x0385cd0e, 0x00a3d31f, 0x0012dacd}}}, + {X: Field{[10]uint32{0x01d828a1, 0x03275045, 0x00dca0fb, 0x0145be6a, 0x03c1c22f, 0x0038d759, 0x003f2525, 0x018d70b4, 0x01f0c6e4, 0x00321892}}, Y: Field{[10]uint32{0x0295ec73, 0x026519fb, 0x0102586d, 0x024d1a7c, 0x02465238, 0x012f1dac, 0x01260b39, 0x013437d3, 0x030b37dc, 0x0003885d}}}, + {X: Field{[10]uint32{0x0256038d, 0x03370b99, 0x0308e3ac, 0x039824be, 0x0061a08f, 0x033f5018, 0x0282c840, 0x021fbf1c, 0x00c5de56, 0x002d237f}}, Y: Field{[10]uint32{0x00e8927c, 0x02db467f, 0x01566277, 0x0254deb4, 0x01c0b52a, 0x01c51d99, 0x0369c7bc, 0x01c1d1c7, 0x021fec73, 0x00021f8f}}}, + {X: Field{[10]uint32{0x02357fca, 0x000ff353, 0x02da8585, 0x0134d9cc, 0x030146fa, 0x034e0da8, 0x025c828f, 0x0154d718, 0x036c62d6, 0x001df73a}}, Y: Field{[10]uint32{0x00228bd4, 0x00747a86, 0x0367e909, 0x02321fee, 0x024304d0, 0x034dc3b4, 0x01b85213, 0x025c4d49, 0x02005a13, 0x003642c9}}}, + {X: Field{[10]uint32{0x0175e49a, 0x0191d40c, 0x01c17473, 0x00f8ccbd, 0x0069cfb4, 0x0331c2b2, 0x031cd633, 0x00061137, 0x00bf4cda, 0x0016d623}}, Y: Field{[10]uint32{0x02d55cda, 0x022432be, 0x017c0d47, 0x01e11d1a, 0x01a52e19, 0x03e57f39, 0x02b823b2, 0x02792a13, 0x031df9e6, 0x0005093b}}}, + {X: Field{[10]uint32{0x0320b20c, 0x001da164, 0x003b7da1, 0x02944711, 0x032c50ce, 0x03277764, 0x00702518, 0x01082023, 0x03ba8393, 0x003021ee}}, Y: Field{[10]uint32{0x0209d996, 0x00881ee4, 0x02b5f6ec, 0x00f1faf0, 0x00f637c2, 0x032f92cc, 0x030e3455, 0x0157cec0, 0x02697175, 0x001dfc9a}}}, + {X: Field{[10]uint32{0x0031ed94, 0x011d304c, 0x02a3835e, 0x0183c45f, 0x00247d7d, 0x030b1563, 0x00b3e7cf, 0x0020bc82, 0x017b68f8, 0x00234581}}, Y: Field{[10]uint32{0x02ba3eca, 0x01442475, 0x0314fed5, 0x029fbb1a, 0x016ffb8c, 0x02710e78, 0x00f6e0d1, 0x0344f440, 0x01b662ff, 0x000f4c17}}}, + {X: Field{[10]uint32{0x01c184b7, 0x03f7307b, 0x019d9242, 0x02597878, 0x03d17daa, 0x03dcdc7f, 0x03b8cd2a, 0x00af21b6, 0x00a603d3, 0x001d7fb8}}, Y: Field{[10]uint32{0x03efa2f8, 0x03f71924, 0x0040910b, 0x027a6810, 0x01061ee8, 0x020245e5, 0x03c992ff, 0x0025d7f9, 0x00ffabc3, 0x0030ac79}}}, + {X: Field{[10]uint32{0x03368abb, 0x0170789b, 0x007a110d, 0x01d51839, 0x02dda7fb, 0x02a1dc42, 0x00925990, 0x0024f5f4, 0x0159b147, 0x0019768e}}, Y: Field{[10]uint32{0x01862844, 0x01171708, 0x03ce95e3, 0x00a32eb8, 0x00a6f530, 0x0268c08c, 0x032b463d, 0x0307870f, 0x01f52f92, 0x000d6678}}}, + {X: Field{[10]uint32{0x027933d3, 0x0102dbe5, 0x03f4df81, 0x016fd101, 0x005dda1a, 0x01d4e61c, 0x02b787ca, 0x0084975d, 0x00109463, 0x0019587f}}, Y: Field{[10]uint32{0x020e6337, 0x02a6d564, 0x01ad629f, 0x00ddb4e8, 0x02cd083f, 0x02dba200, 0x02e8aeca, 0x00a0a0fa, 0x03cea88e, 0x001301b1}}}, + {X: Field{[10]uint32{0x00c4410e, 0x0179e920, 0x016a35ca, 0x00c19993, 0x03c8a3fc, 0x02748cd0, 0x03041a6a, 0x00dc0548, 0x03807049, 0x0032694f}}, Y: Field{[10]uint32{0x036e4bf9, 0x01128882, 0x02d42183, 0x02b7c8d9, 0x02369d4d, 0x038ec9cd, 0x02f0dd06, 0x003517af, 0x00a9b2e3, 0x0026bd1c}}}, + {X: Field{[10]uint32{0x03b89158, 0x00d165cc, 0x03bf03c7, 0x00517d5d, 0x00c203f8, 0x02e68550, 0x009f45a1, 0x015b76c0, 0x01f3443e, 0x00170549}}, Y: Field{[10]uint32{0x034f4f18, 0x00d24efa, 0x03c02f5b, 0x03eb2e67, 0x0358574a, 0x01895c1e, 0x00f4c803, 0x03646b5d, 0x02f7cb3e, 0x00259e24}}}, + {X: Field{[10]uint32{0x001648ed, 0x024e72d5, 0x01454d69, 0x02a5d7d8, 0x0269bb6e, 0x01cbfb83, 0x00add6d4, 0x005c75c5, 0x00dad87c, 0x000d5973}}, Y: Field{[10]uint32{0x0062aef8, 0x01a8b64d, 0x014edd48, 0x029daa35, 0x034f02d3, 0x00022c65, 0x03d09bbd, 0x018d6176, 0x03bfec2b, 0x0027df61}}}, + {X: Field{[10]uint32{0x010e3614, 0x03799847, 0x01edabd8, 0x03744e2d, 0x004527d3, 0x00a85297, 0x00f29df4, 0x0386a2bf, 0x0334c0f5, 0x001000fb}}, Y: Field{[10]uint32{0x003048c4, 0x0131a093, 0x00e2cd3c, 0x003cd85d, 0x033d3ead, 0x0160e70b, 0x03d0a763, 0x0133bf30, 0x01524489, 0x0019c80c}}}, + {X: Field{[10]uint32{0x012ea57f, 0x01574764, 0x013931cf, 0x0088024a, 0x02138864, 0x02d25689, 0x03b7de39, 0x0141e4fa, 0x035b3796, 0x003d7137}}, Y: Field{[10]uint32{0x01eb3482, 0x0011f80c, 0x02968f30, 0x0295f4c6, 0x03aca34d, 0x028d8434, 0x03672c74, 0x02331168, 0x003e12a9, 0x002c2e4f}}}, + {X: Field{[10]uint32{0x029e213a, 0x0259e4d5, 0x010b397a, 0x0239a73b, 0x01cbe869, 0x019600a2, 0x023533e5, 0x021b36e9, 0x0280e211, 0x0002f27d}}, Y: Field{[10]uint32{0x032e06a3, 0x004fea6c, 0x01d72007, 0x03d6e478, 0x017bf54e, 0x01f48137, 0x03b94ff8, 0x01463543, 0x03788105, 0x001ab7fe}}}, + {X: Field{[10]uint32{0x01a16516, 0x02674ab2, 0x006b055f, 0x011d39c1, 0x01549e83, 0x028f8988, 0x03e15d37, 0x02204514, 0x0397f1fe, 0x001373a1}}, Y: Field{[10]uint32{0x03e668ea, 0x0381d52a, 0x01d4337c, 0x02a1d26a, 0x02fc8a8a, 0x035c35ec, 0x00fd9f37, 0x02096a57, 0x0377cca7, 0x003a979a}}}, + {X: Field{[10]uint32{0x0359b16b, 0x01a74fa5, 0x01eee818, 0x02149944, 0x02af2a4f, 0x000024e0, 0x032a0c04, 0x0255c2f5, 0x02ba1ef2, 0x003d26d6}}, Y: Field{[10]uint32{0x017c7f7d, 0x02391675, 0x01202865, 0x010ed060, 0x021d2fb3, 0x0182af19, 0x02125d0f, 0x03a349a5, 0x0020b996, 0x000b925b}}}, + {X: Field{[10]uint32{0x012125ec, 0x006fb902, 0x03fa054a, 0x001df5f5, 0x00a2d02f, 0x00afca52, 0x00ff7657, 0x038749ed, 0x014a7573, 0x0009a45f}}, Y: Field{[10]uint32{0x03cd8f97, 0x0173a0c1, 0x006780ad, 0x00c02986, 0x017eb125, 0x03e32232, 0x02fd2d5c, 0x019a80a9, 0x037eae9b, 0x002e391f}}}, + {X: Field{[10]uint32{0x0329d290, 0x03eab53e, 0x03cb1cd7, 0x01bb3e2e, 0x007ead77, 0x0084f9b6, 0x00b71daf, 0x00bf9263, 0x00d6285a, 0x0006d252}}, Y: Field{[10]uint32{0x00d3bfd8, 0x00306d09, 0x0227bdd3, 0x0266cbd7, 0x00d56984, 0x00b4a186, 0x0336c7a9, 0x0364966d, 0x001fef87, 0x0006ad02}}}, + {X: Field{[10]uint32{0x01ae64ca, 0x022f55e6, 0x036c7725, 0x03d29a58, 0x00f8b20f, 0x02a6594f, 0x019676fe, 0x02ebde77, 0x02ec8179, 0x000535c4}}, Y: Field{[10]uint32{0x000c6ef0, 0x01b8138e, 0x03ad6d36, 0x00e14eeb, 0x0006f385, 0x01cb38fc, 0x030df37d, 0x0143b0ca, 0x00a64246, 0x000b876e}}}, + {X: Field{[10]uint32{0x01952453, 0x01a53dc7, 0x038134d9, 0x02222d6f, 0x03a11119, 0x01111644, 0x01967e15, 0x01da1278, 0x02204174, 0x0001d9d4}}, Y: Field{[10]uint32{0x0182fd31, 0x01da10fb, 0x01c27377, 0x00f58253, 0x00de1a5c, 0x029c8b79, 0x0155a906, 0x02d80ce8, 0x00636457, 0x000fc7ec}}}, + {X: Field{[10]uint32{0x0149fc63, 0x012e8d37, 0x00937fc8, 0x01be5ac9, 0x020a53b1, 0x002ec789, 0x0016d028, 0x022d9d00, 0x0134a882, 0x0016b239}}, Y: Field{[10]uint32{0x00a1fc73, 0x03881bae, 0x0187a8e5, 0x021c457a, 0x0018568f, 0x0242739c, 0x005a4296, 0x03edec0b, 0x020f68f5, 0x00064f40}}}, + {X: Field{[10]uint32{0x034a14b8, 0x00880b6a, 0x02c43337, 0x0375ab3d, 0x02d618d0, 0x0064d127, 0x01135b60, 0x0158a94c, 0x02b28d16, 0x0021f377}}, Y: Field{[10]uint32{0x03846e2e, 0x01a32ea7, 0x0084be5b, 0x009404d7, 0x01cd7094, 0x038ba44a, 0x011cecbd, 0x022b6650, 0x00e67c95, 0x00170779}}}, + {X: Field{[10]uint32{0x024c84cb, 0x01de2810, 0x02d52f8c, 0x01fbac35, 0x004d4f8b, 0x03ea198c, 0x021dfe7a, 0x03427d23, 0x0225a39e, 0x00310c72}}, Y: Field{[10]uint32{0x0100d825, 0x02b8299c, 0x034292ae, 0x035b8d7f, 0x00489ede, 0x00c4a4cc, 0x00f2d11d, 0x02f9b4d7, 0x03d65b2d, 0x00114181}}}, + {X: Field{[10]uint32{0x00a3dd5a, 0x03cda0e2, 0x02c1d9bf, 0x000970bc, 0x03aaa930, 0x003b7128, 0x03af3d44, 0x0068452f, 0x01e8985c, 0x00231408}}, Y: Field{[10]uint32{0x012fb108, 0x02d82aa8, 0x01db13c2, 0x02bb50c5, 0x02b6d31f, 0x0025bf52, 0x01d74ba6, 0x0360701c, 0x00aa8077, 0x00132e58}}}, + {X: Field{[10]uint32{0x02513d4f, 0x0275c5db, 0x01bb770b, 0x012c99e0, 0x0306e7a1, 0x005df6ef, 0x017c07a0, 0x01d21630, 0x00bb38a4, 0x000ce395}}, Y: Field{[10]uint32{0x00420548, 0x02033e31, 0x026fb92f, 0x03554bb9, 0x02c44a6a, 0x019dd8ee, 0x02951def, 0x033e9308, 0x024e84ca, 0x001e1dab}}}, + {X: Field{[10]uint32{0x031f3c5a, 0x01bba34b, 0x0061bcb0, 0x0385fbfd, 0x013c7b0f, 0x03349a2b, 0x03683abc, 0x00e88645, 0x00a9efbb, 0x0021fcef}}, Y: Field{[10]uint32{0x01229b61, 0x028cfb55, 0x007f8361, 0x03c6845f, 0x00e5cc11, 0x03d7eef2, 0x001f258b, 0x03f15122, 0x02a1eccc, 0x0029e874}}}, + {X: Field{[10]uint32{0x013a3e40, 0x001eeed0, 0x01aad524, 0x037119f2, 0x00de27d6, 0x029a9e36, 0x016a0375, 0x01615a39, 0x03df8ed8, 0x0003d008}}, Y: Field{[10]uint32{0x03e178cc, 0x03e7da87, 0x001615cf, 0x0114f89d, 0x03d5e2c5, 0x03567cdc, 0x0230e566, 0x00e845aa, 0x0142fc4e, 0x002c9264}}}, + {X: Field{[10]uint32{0x006f2d3a, 0x00215927, 0x001a8927, 0x00bcdd38, 0x03453b51, 0x0398ecbe, 0x013d282f, 0x02288a27, 0x03c6d55a, 0x0033ed47}}, Y: Field{[10]uint32{0x0070635d, 0x01ffa724, 0x0125eb56, 0x004872c9, 0x03e4ea53, 0x01879874, 0x02c120e7, 0x0047b4a3, 0x02232838, 0x0023528c}}}, + {X: Field{[10]uint32{0x0243c539, 0x01f3a5ab, 0x00486893, 0x02c45c87, 0x01c45f77, 0x0089258d, 0x03219db2, 0x00051c2f, 0x020b9705, 0x00166912}}, Y: Field{[10]uint32{0x03039afa, 0x0364c781, 0x00efd158, 0x01644ddd, 0x02400ff9, 0x017ae29d, 0x021d0cd5, 0x003cfc77, 0x00a66a91, 0x0000c787}}}, + {X: Field{[10]uint32{0x00a8ee7e, 0x015c3a0a, 0x0386f8ab, 0x01cc67f5, 0x02d8e26d, 0x012ecea3, 0x03446281, 0x01e8ddaa, 0x0256ec27, 0x002e673b}}, Y: Field{[10]uint32{0x023494ad, 0x02c44d70, 0x0223062a, 0x00c74773, 0x00b6be5d, 0x01360305, 0x013b16ab, 0x017535c9, 0x0398dda0, 0x0011b83c}}}, + {X: Field{[10]uint32{0x01172bd2, 0x001eb403, 0x03cb0252, 0x00ad4a51, 0x001c6b92, 0x0369d6ce, 0x00398725, 0x006889b4, 0x036ad96b, 0x0028e784}}, Y: Field{[10]uint32{0x02abb532, 0x00286e6d, 0x023a2d91, 0x01de2bc6, 0x007dbfc9, 0x0258e7ea, 0x010fa717, 0x038238f4, 0x0358074d, 0x001e9701}}}, + {X: Field{[10]uint32{0x03001976, 0x02365d15, 0x039c45b4, 0x0154d7d1, 0x032c23c8, 0x02dd44ad, 0x02dd59ae, 0x02dd3989, 0x01253b2e, 0x001ba2d0}}, Y: Field{[10]uint32{0x012bc88e, 0x02667a33, 0x02b47873, 0x020bb086, 0x020715bc, 0x032e16a8, 0x0004068a, 0x0301157a, 0x00e1e4e8, 0x003302e2}}}, + {X: Field{[10]uint32{0x01abb019, 0x0111e294, 0x024189c4, 0x01bc7263, 0x03cd1fb6, 0x03bf44d0, 0x03b6ec98, 0x010627df, 0x02f5681e, 0x002650ad}}, Y: Field{[10]uint32{0x010e7a9a, 0x01459e63, 0x02430569, 0x01afb499, 0x02d2fe98, 0x01f26278, 0x0211e6ff, 0x00b54a42, 0x02bbb0cc, 0x00080343}}}, + {X: Field{[10]uint32{0x0078506d, 0x0383df94, 0x01744642, 0x03dcbabf, 0x02759636, 0x0122bcd4, 0x0166918b, 0x02e52510, 0x01ec3c57, 0x001ff738}}, Y: Field{[10]uint32{0x03baabd2, 0x004e8ab5, 0x0146b2e3, 0x01e5974f, 0x0353cfb9, 0x038b4b39, 0x03786ed1, 0x01db8dce, 0x02efc19a, 0x0035de16}}}, + {X: Field{[10]uint32{0x03989c57, 0x035381a4, 0x01b04a70, 0x01362065, 0x035f5165, 0x01df1e6a, 0x030906bd, 0x020fc3c5, 0x005c958c, 0x001bc4c8}}, Y: Field{[10]uint32{0x03b55ee0, 0x023c4fdc, 0x02c99e84, 0x02655445, 0x01033deb, 0x0254368d, 0x028d4f1c, 0x03920ec9, 0x015bb386, 0x0022b268}}}, + {X: Field{[10]uint32{0x0297654e, 0x03352d8d, 0x007e6e50, 0x013d6d09, 0x03cd405f, 0x0137fefe, 0x00a0665f, 0x01a6f810, 0x035d833c, 0x003e5568}}, Y: Field{[10]uint32{0x03c9ee44, 0x03e93d62, 0x0183e4e2, 0x02c9f686, 0x00f56e80, 0x0103acdf, 0x02f2407f, 0x020e2692, 0x03ce2246, 0x00227d3e}}}, + {X: Field{[10]uint32{0x02248007, 0x03edaa09, 0x00132e65, 0x0346248e, 0x010b58b8, 0x037e5e63, 0x02257431, 0x011a8d0a, 0x012d6196, 0x0036f345}}, Y: Field{[10]uint32{0x02d8ba13, 0x02d34d8c, 0x01dcec02, 0x038f4086, 0x03e57d23, 0x039a0c3d, 0x0025e9e2, 0x023f4f91, 0x017ec194, 0x0019be9c}}}, + {X: Field{[10]uint32{0x026e8ebe, 0x03a854d7, 0x035cc71e, 0x02ca2cd6, 0x0399f713, 0x00b9e54f, 0x03cfb1da, 0x02427eb1, 0x00e8e57b, 0x003c6baf}}, Y: Field{[10]uint32{0x01d9d516, 0x03d842f9, 0x0157e1b7, 0x0365617f, 0x0288b0bf, 0x00b93d65, 0x01c24d09, 0x0396a983, 0x02143e77, 0x0021d57e}}}, + {X: Field{[10]uint32{0x00b55187, 0x01b92281, 0x005f5fef, 0x016a4754, 0x01c002bc, 0x0010c241, 0x01ceab65, 0x0212ffe2, 0x024d941f, 0x00288085}}, Y: Field{[10]uint32{0x02f057ff, 0x00ecfbf0, 0x004c1bee, 0x0256b7a2, 0x01b6d4b0, 0x02e6f393, 0x0172e978, 0x01a2d479, 0x002b2bc2, 0x00038335}}}, + {X: Field{[10]uint32{0x028ad68a, 0x01011f72, 0x02861e78, 0x02942009, 0x02b1344d, 0x021fe2e6, 0x000eccb2, 0x039f7a52, 0x025746fd, 0x0015cb85}}, Y: Field{[10]uint32{0x01eb5d9f, 0x01a585cc, 0x01170475, 0x01ac283f, 0x0239eda8, 0x00176b5d, 0x02461eb4, 0x02aed234, 0x01e7c066, 0x00305d2b}}}, + {X: Field{[10]uint32{0x03eba31d, 0x0333a696, 0x00dac58a, 0x03296799, 0x00b67047, 0x01db927a, 0x00b1052b, 0x035d4f02, 0x0107fee4, 0x003d38b2}}, Y: Field{[10]uint32{0x0011c42c, 0x02fe1c4b, 0x030f8f41, 0x00d09201, 0x032b76d1, 0x02a3fa25, 0x00b8317c, 0x034b6392, 0x022d3a92, 0x002c90ea}}}, + {X: Field{[10]uint32{0x01f06dd5, 0x0258e97f, 0x00463e06, 0x0207c934, 0x02266987, 0x01a2026c, 0x029e436d, 0x015c5bd7, 0x02ec8445, 0x0029bf1a}}, Y: Field{[10]uint32{0x0018ca8d, 0x02402a86, 0x013d5073, 0x013a4614, 0x00a96b7f, 0x01d2367c, 0x02135fdf, 0x03f461ab, 0x0215548e, 0x003705a9}}}, + {X: Field{[10]uint32{0x0205f026, 0x03378b56, 0x009bcc00, 0x033ac133, 0x00c4ffb3, 0x00dfcb2f, 0x00d8eec9, 0x02594a73, 0x00175fde, 0x002f601a}}, Y: Field{[10]uint32{0x00a26216, 0x008a2cd9, 0x03f76bce, 0x01d1454a, 0x02db0482, 0x02daf771, 0x03e6a0d8, 0x010ca383, 0x02e78e01, 0x002c9e46}}}, + {X: Field{[10]uint32{0x000165ef, 0x021b74d7, 0x0251e163, 0x02c8e976, 0x032d8614, 0x032b9ae3, 0x015e810e, 0x00f482e7, 0x02676f8c, 0x003e2229}}, Y: Field{[10]uint32{0x009a0dea, 0x00f6b724, 0x0223942a, 0x014f7890, 0x03579788, 0x031ec7ae, 0x034bfe39, 0x03cfbfdb, 0x020fe429, 0x003ed3b8}}}, + {X: Field{[10]uint32{0x009ae200, 0x0221df10, 0x02fd23ba, 0x039af69d, 0x01c3182e, 0x034583f3, 0x01023a48, 0x02a9c7b2, 0x02055adb, 0x001f2347}}, Y: Field{[10]uint32{0x03907ceb, 0x0385d90b, 0x00524f16, 0x0293cb23, 0x01c489b9, 0x033a0dde, 0x02936f4f, 0x01548f65, 0x020bec59, 0x00228ee0}}}, + {X: Field{[10]uint32{0x02fabf43, 0x00539d89, 0x0159e75c, 0x02dd48a6, 0x026dfd9b, 0x024eebdc, 0x00ccd715, 0x01c48184, 0x02a4ee25, 0x0006221b}}, Y: Field{[10]uint32{0x0091531d, 0x026361b8, 0x01d31ffa, 0x0210e622, 0x02898a31, 0x01f40ade, 0x033ad3f0, 0x01a2c034, 0x0295f570, 0x00099b19}}}, + {X: Field{[10]uint32{0x03e52cba, 0x03f73e9a, 0x009a3184, 0x0265419e, 0x011242a0, 0x02b00dae, 0x039a44ec, 0x02b6f4cc, 0x031e38c8, 0x003fa9c3}}, Y: Field{[10]uint32{0x039e7915, 0x009bb38e, 0x0046883e, 0x00bf5d17, 0x02076c0e, 0x00d99c2d, 0x0058093a, 0x0306e777, 0x01f50ba8, 0x00277fdb}}}, + {X: Field{[10]uint32{0x03d1365a, 0x0312d28d, 0x00c8fb1d, 0x01eff908, 0x0096dcbf, 0x01e5146e, 0x0199142e, 0x00f241db, 0x038945aa, 0x001378c0}}, Y: Field{[10]uint32{0x0287cba4, 0x0193b634, 0x0316d356, 0x02884ec2, 0x03992ac0, 0x0006ccdd, 0x001eb2e2, 0x03799090, 0x029e9093, 0x0033b9d3}}}, + {X: Field{[10]uint32{0x02104fb2, 0x02220c06, 0x03da3739, 0x01adad6f, 0x028c2d8e, 0x03040a60, 0x03b8c401, 0x02f9e718, 0x01d1eafe, 0x0019f427}}, Y: Field{[10]uint32{0x01360a5f, 0x03ea96ef, 0x0098461f, 0x016367cb, 0x00d4f035, 0x0063e26f, 0x019049e8, 0x00365a3a, 0x01089266, 0x00043ad5}}}, + {X: Field{[10]uint32{0x00e6010f, 0x03f75dd0, 0x01b5af5f, 0x03d3fe8c, 0x01325e55, 0x01c0c735, 0x0396d4d8, 0x00d3e34e, 0x00fe1868, 0x000ad75c}}, Y: Field{[10]uint32{0x0095ed02, 0x029351ea, 0x03b1f7bd, 0x024327d4, 0x00384398, 0x02c8206d, 0x031f54af, 0x028dcde2, 0x025324d2, 0x00191b9f}}}, + {X: Field{[10]uint32{0x017be248, 0x03d8b7f8, 0x00752527, 0x008f2893, 0x005d600b, 0x02bb42b4, 0x03f7b446, 0x029db064, 0x02998700, 0x0032d098}}, Y: Field{[10]uint32{0x0019a8b6, 0x03a4e796, 0x006e65ac, 0x01413086, 0x03bcfd02, 0x03339dc8, 0x01f74eb8, 0x01832439, 0x0213f3eb, 0x0024a10f}}}, + {X: Field{[10]uint32{0x018e4e41, 0x00137b50, 0x00d25f9b, 0x014ff638, 0x0322d0b8, 0x039b7a22, 0x01ce4d01, 0x02f15c4d, 0x037e75b3, 0x000fb9aa}}, Y: Field{[10]uint32{0x034bcc87, 0x0154da06, 0x027689ad, 0x013da03b, 0x006ee1ab, 0x00cfd480, 0x01b6afc9, 0x01466e4c, 0x03984e52, 0x001a720f}}}, + {X: Field{[10]uint32{0x0087e7be, 0x010217f2, 0x01724e90, 0x031ca8e1, 0x016918ac, 0x005f5e0a, 0x0232df6f, 0x01450c5c, 0x00b0a95a, 0x00160ddd}}, Y: Field{[10]uint32{0x007c3e7b, 0x01cdaaa0, 0x0042418c, 0x03f8542d, 0x03f8f047, 0x019970d4, 0x00160730, 0x033c5cc3, 0x02660ee8, 0x000ceec7}}}, + {X: Field{[10]uint32{0x0079dc1a, 0x020e381c, 0x03fcb0a8, 0x000269e8, 0x03eb3341, 0x02990fa8, 0x0082b772, 0x009e1de4, 0x01ef3982, 0x002bccb8}}, Y: Field{[10]uint32{0x0295fd4c, 0x027b2dd3, 0x037f8b3a, 0x00c792d2, 0x03169383, 0x0068d9a5, 0x02ee7e8b, 0x0048f9ce, 0x028dc660, 0x001a6178}}}, + {X: Field{[10]uint32{0x0034d0c4, 0x02b705b8, 0x03f9c948, 0x02737aae, 0x0150f724, 0x03eff0fd, 0x020c740e, 0x01d5466d, 0x03dd3266, 0x001bb7df}}, Y: Field{[10]uint32{0x02f46026, 0x01144f43, 0x016d40bb, 0x0052edf6, 0x0164534f, 0x02c249a4, 0x030de819, 0x01f69d7e, 0x03185def, 0x003c2317}}}, + {X: Field{[10]uint32{0x01f16b42, 0x00293c00, 0x01f0072a, 0x0182cff6, 0x0086257a, 0x02060878, 0x0104120a, 0x023e51b1, 0x02455d26, 0x000ee699}}, Y: Field{[10]uint32{0x00fe7c7b, 0x006f774b, 0x00117e2e, 0x0121916c, 0x023dfa48, 0x01864041, 0x03601090, 0x01b02257, 0x0215aedf, 0x003b560e}}}, + {X: Field{[10]uint32{0x007a1039, 0x00eb429d, 0x03ae2d68, 0x010e0ba2, 0x0327b529, 0x02804ac3, 0x03cbdf07, 0x03f6c345, 0x03082b5c, 0x002f40d6}}, Y: Field{[10]uint32{0x03b2ef54, 0x003e68e6, 0x03f61ac9, 0x030e2d8a, 0x00e94a23, 0x01cafa2b, 0x0135ccd5, 0x035fa2a8, 0x03aded4a, 0x00192532}}}, + {X: Field{[10]uint32{0x015338c3, 0x0116d13c, 0x02ff7a8c, 0x02c50408, 0x024dda59, 0x022780e0, 0x03316ef0, 0x00602eb8, 0x0319fe9b, 0x003897ef}}, Y: Field{[10]uint32{0x034c7cf2, 0x0220d8c5, 0x03be6f63, 0x00467d3e, 0x007c2c8f, 0x0214b9a5, 0x02412581, 0x037548d0, 0x03f658a3, 0x00117b11}}}, + {X: Field{[10]uint32{0x00ffc9b8, 0x01cb993b, 0x02e6c7c0, 0x0170e1c7, 0x01f30f59, 0x00059501, 0x02ebea75, 0x01cd5814, 0x01cd8ffd, 0x000b88c7}}, Y: Field{[10]uint32{0x0359317a, 0x03cc591b, 0x0127d29c, 0x032fb946, 0x027610d4, 0x02892b78, 0x018f3d3e, 0x02586a11, 0x0052db15, 0x00031991}}}, + {X: Field{[10]uint32{0x01338fc8, 0x0161983d, 0x020483b4, 0x01d299a9, 0x01fd2a41, 0x00c5b819, 0x01ae1260, 0x0189bc6c, 0x01c93932, 0x001f03ca}}, Y: Field{[10]uint32{0x01cd037f, 0x008cee9d, 0x00162350, 0x013e6326, 0x01b76e2c, 0x021fd5aa, 0x0255d7a5, 0x0049cb00, 0x033ddf6f, 0x0009fbd4}}}, + {X: Field{[10]uint32{0x00d5bb48, 0x02da881f, 0x019ba31b, 0x0385c2ca, 0x027bd857, 0x01e53ecc, 0x003e0144, 0x027fbfed, 0x021cea6f, 0x0039c0b5}}, Y: Field{[10]uint32{0x023f79c9, 0x0303acc6, 0x02f2112e, 0x02bf298e, 0x00ee5e28, 0x03781de5, 0x0228a712, 0x03b8f9fc, 0x0081c924, 0x00311de6}}}, + {X: Field{[10]uint32{0x02c852a8, 0x02b917d9, 0x026d8cc2, 0x02900d69, 0x01c362c5, 0x030591fb, 0x0275c117, 0x0306d6fb, 0x0044eade, 0x003c5e00}}, Y: Field{[10]uint32{0x029e1c18, 0x01dd5c8c, 0x030f89a6, 0x00121727, 0x01e8b7a3, 0x00e00c43, 0x00f63ac1, 0x00e5dfc2, 0x01f0f31b, 0x0017e37a}}}, + {X: Field{[10]uint32{0x0312dd9e, 0x001c07c7, 0x0369f8d0, 0x02dc5982, 0x011582cc, 0x00999969, 0x0152c533, 0x016c6352, 0x037f22ec, 0x001e906c}}, Y: Field{[10]uint32{0x007fc443, 0x01425458, 0x002b9db7, 0x017890a7, 0x01344886, 0x028bc780, 0x00cd74d2, 0x00967020, 0x02132c57, 0x0021102f}}}, + {X: Field{[10]uint32{0x002db6d3, 0x033342ca, 0x02779ca4, 0x005b5482, 0x02a5ce63, 0x01f0d546, 0x00f4e165, 0x035a7866, 0x037d8111, 0x000253ff}}, Y: Field{[10]uint32{0x005c6fc0, 0x00926f14, 0x03b909c3, 0x00c0ea4c, 0x0342541d, 0x02c763b5, 0x00a75d38, 0x0030155e, 0x0270026c, 0x00120b24}}}, + {X: Field{[10]uint32{0x03f4e9d1, 0x03251005, 0x02560a54, 0x0224bdc3, 0x01d37759, 0x02c1692a, 0x00ac76b1, 0x03eaa55b, 0x004e8a3f, 0x0035a9b5}}, Y: Field{[10]uint32{0x00863e1a, 0x01ee95e4, 0x00b6cdc5, 0x021f78e2, 0x03c7b93e, 0x00ea2815, 0x023bbe78, 0x0277a645, 0x0322cd83, 0x001230ee}}}, + {X: Field{[10]uint32{0x00cdf80c, 0x00813e54, 0x03d53699, 0x024e56e4, 0x02c47c09, 0x00550ee4, 0x01dbc477, 0x03b6ac79, 0x01c08e24, 0x00330389}}, Y: Field{[10]uint32{0x011fb70b, 0x00a0af41, 0x038c8220, 0x015490c6, 0x031a977c, 0x02d29b4e, 0x0376ab2c, 0x033ced0e, 0x00b37170, 0x0008314b}}}, + {X: Field{[10]uint32{0x02f8d827, 0x0095ced8, 0x01be3db7, 0x0291041e, 0x01efddb6, 0x03ee0f2d, 0x025d0eac, 0x0346be84, 0x03684cb7, 0x0033e54f}}, Y: Field{[10]uint32{0x00909c0c, 0x027b76cc, 0x009ac0b8, 0x01406bf2, 0x03b302fa, 0x038f9428, 0x0047a7b8, 0x0046c42a, 0x0366a45d, 0x001c33f8}}}, + {X: Field{[10]uint32{0x0015d5dc, 0x02675ada, 0x0319fbff, 0x01d450ea, 0x02f8ce69, 0x03f57f87, 0x016b7112, 0x02ac1bfc, 0x02942b34, 0x0006b089}}, Y: Field{[10]uint32{0x036539fc, 0x038fe96a, 0x026154d9, 0x0348911d, 0x011bd823, 0x027859a0, 0x01b7fddd, 0x0025d53a, 0x017e02bd, 0x00290f51}}}, + {X: Field{[10]uint32{0x024d65c2, 0x03dc8c9e, 0x029e9bb9, 0x03f6904b, 0x00496349, 0x0256501b, 0x03800bcf, 0x02012bc3, 0x03ff1153, 0x00340aee}}, Y: Field{[10]uint32{0x0002a384, 0x03fff06e, 0x032f2876, 0x02087083, 0x020d41e6, 0x03bc22d5, 0x0344f9b9, 0x00cbdc75, 0x00de3c78, 0x000177a0}}}, + {X: Field{[10]uint32{0x031831a7, 0x021496d3, 0x0204025a, 0x009920de, 0x02d8a603, 0x0312ca67, 0x021cc2b2, 0x013b8d0b, 0x03478d46, 0x000f32b4}}, Y: Field{[10]uint32{0x002691c0, 0x00dac9b4, 0x0035af30, 0x00f926d4, 0x0147492f, 0x033acd00, 0x0079fdd6, 0x0156d82b, 0x024ca59b, 0x000d7a8a}}}, + {X: Field{[10]uint32{0x02033688, 0x01ee90cd, 0x0106b80f, 0x02cc1067, 0x01b3a758, 0x03fe12cf, 0x0362e90f, 0x030f3835, 0x01543e69, 0x003ab135}}, Y: Field{[10]uint32{0x01deacbe, 0x01a84bf4, 0x01dbf17f, 0x01b7250d, 0x02ee00fb, 0x036a8611, 0x00449aad, 0x01d2effa, 0x02dac543, 0x002a993e}}}, + {X: Field{[10]uint32{0x03fca753, 0x02383318, 0x037a9a02, 0x01974f6e, 0x015df624, 0x00cef8a0, 0x026d0c61, 0x00dc4ccc, 0x01b173d9, 0x000f4a1e}}, Y: Field{[10]uint32{0x00d6e0f0, 0x029ca59a, 0x00c9d8f0, 0x0230a9aa, 0x01fd38a0, 0x01336e34, 0x023eecb3, 0x02d7a2a7, 0x024d9b95, 0x0015db39}}}, + {X: Field{[10]uint32{0x0176ca14, 0x0138c11a, 0x03ce4cf7, 0x015a67ae, 0x0272358a, 0x02a31d9a, 0x0137087c, 0x01a0b894, 0x038d56a9, 0x000fd62a}}, Y: Field{[10]uint32{0x0321f29d, 0x010169ec, 0x02315447, 0x00280579, 0x01f6bce2, 0x02d2036b, 0x030f45f1, 0x02a2a07c, 0x03d101a2, 0x000f2414}}}, + {X: Field{[10]uint32{0x03fd12d7, 0x01776c44, 0x01b97314, 0x004d6211, 0x022a4ed9, 0x022bab90, 0x029df0fa, 0x03346506, 0x0289b48d, 0x0013d7c4}}, Y: Field{[10]uint32{0x00dc1428, 0x03e095b8, 0x03e86077, 0x01a968f0, 0x0342ac0d, 0x0288cf77, 0x02286ed0, 0x0195dc0f, 0x032cc40c, 0x002d70f8}}}, + {X: Field{[10]uint32{0x03376a76, 0x00e4b724, 0x03bc5ad0, 0x037fe682, 0x03e4a9dc, 0x028aeb35, 0x00e70ddd, 0x031beb9d, 0x01e2a52d, 0x0029928a}}, Y: Field{[10]uint32{0x018a9590, 0x02c05990, 0x0330b4eb, 0x0332c395, 0x01c776f2, 0x00f770d9, 0x02efe873, 0x02c6ddee, 0x00a6faa9, 0x002b78be}}}, + {X: Field{[10]uint32{0x00480e70, 0x0331f6f2, 0x02f04994, 0x017788d2, 0x00b8694b, 0x0071b4f8, 0x0186f94e, 0x03e22b47, 0x0212c4d6, 0x0037b82a}}, Y: Field{[10]uint32{0x02f93389, 0x01947e18, 0x002193d4, 0x0320034d, 0x02413ae1, 0x00cb4c35, 0x01368df3, 0x00df3ea7, 0x00d4cbda, 0x0032f66b}}}, + {X: Field{[10]uint32{0x01796936, 0x003c6235, 0x01f74f9c, 0x023220bf, 0x01772b95, 0x003ad9bf, 0x013e2948, 0x01ab86d9, 0x019dc8af, 0x00219dea}}, Y: Field{[10]uint32{0x0397232e, 0x03abe07f, 0x029ed783, 0x0075370f, 0x00662115, 0x002187d1, 0x03a24f3a, 0x0012392d, 0x00c8348c, 0x000c719a}}}, + {X: Field{[10]uint32{0x02997fee, 0x005e307d, 0x01d80ed6, 0x0306633b, 0x02f44aed, 0x02f5b59d, 0x0229bc79, 0x029f30ac, 0x013acb73, 0x0014445f}}, Y: Field{[10]uint32{0x01110cd6, 0x0395a30e, 0x01a4d174, 0x01c0c870, 0x0278f207, 0x00258d0f, 0x00651d30, 0x0217045c, 0x0004123f, 0x001718e3}}}, + {X: Field{[10]uint32{0x03141b12, 0x0328e0e7, 0x024689c3, 0x03e0d08f, 0x020a83c9, 0x00ba8490, 0x03585d45, 0x0020a3a1, 0x03646967, 0x0012362b}}, Y: Field{[10]uint32{0x0265e9de, 0x035938d4, 0x0040fdc4, 0x00d6501b, 0x011998dd, 0x00157b41, 0x029843b9, 0x01269f1a, 0x0342f07f, 0x001562a3}}}, + {X: Field{[10]uint32{0x02966d2c, 0x03a03d7d, 0x0317aecb, 0x01f7d6ee, 0x01d4060c, 0x0070593a, 0x003d4574, 0x03bb9685, 0x02c1b0fd, 0x0018aea6}}, Y: Field{[10]uint32{0x01d9450e, 0x01b04629, 0x00aedb58, 0x019cec0d, 0x019329fe, 0x01c2cee6, 0x0096494b, 0x0105b17f, 0x013f2290, 0x00196819}}}, + {X: Field{[10]uint32{0x01febf0d, 0x00a5f492, 0x0004a486, 0x00150fcc, 0x00508d8d, 0x00f1e4c4, 0x02f20580, 0x0295ad43, 0x03cb679d, 0x002f937d}}, Y: Field{[10]uint32{0x01f3ba9b, 0x01b10f35, 0x03a0995f, 0x00183e8f, 0x00ca6973, 0x032a21a5, 0x018cb8ba, 0x00f9fea2, 0x0150dd5f, 0x00306d59}}}, + {X: Field{[10]uint32{0x00c9979d, 0x010d6c0a, 0x010c3a0c, 0x00b33855, 0x02424eac, 0x0211ccc5, 0x02cdf340, 0x0381a016, 0x036ccca2, 0x00392700}}, Y: Field{[10]uint32{0x01609a1b, 0x02264b98, 0x03bcab16, 0x0078ed0a, 0x0121186b, 0x009ebf5f, 0x010d273d, 0x03f7956f, 0x025f0457, 0x00115af0}}}, + {X: Field{[10]uint32{0x03fd58e3, 0x01e9be25, 0x01302705, 0x006ab570, 0x02976e70, 0x02ddd30a, 0x03ddfc9c, 0x017642cf, 0x01eda81d, 0x002b9a11}}, Y: Field{[10]uint32{0x02d755bc, 0x01299d5f, 0x03e11e5b, 0x01b39a6c, 0x00450112, 0x014e694d, 0x026194e7, 0x038d8264, 0x0055322a, 0x0014a6f7}}}, + {X: Field{[10]uint32{0x02a25e1b, 0x03ab8c6f, 0x02d183fb, 0x02652867, 0x004c2744, 0x035c4e19, 0x00717e02, 0x02ddcb32, 0x00f8bcc2, 0x0014a876}}, Y: Field{[10]uint32{0x0189011b, 0x01a79810, 0x001dc9f8, 0x01cf1c0d, 0x03dbb806, 0x00edd4a2, 0x00e77f95, 0x01e25212, 0x032ce7f1, 0x00368a82}}}, + {X: Field{[10]uint32{0x02a2250a, 0x03ce0165, 0x02918425, 0x02724349, 0x010cc552, 0x035692af, 0x0119f50d, 0x01e01357, 0x0301d89a, 0x003feeeb}}, Y: Field{[10]uint32{0x029880e2, 0x00dfb666, 0x0214538c, 0x0043dac6, 0x022d5144, 0x00bf84c8, 0x02a47a6c, 0x018af416, 0x03b7eba6, 0x00222d7d}}}, + {X: Field{[10]uint32{0x038c942e, 0x0296783f, 0x011f9fe5, 0x0323fd81, 0x014473fb, 0x013e15c9, 0x03840eed, 0x006adebe, 0x0038aab5, 0x0001bfe9}}, Y: Field{[10]uint32{0x0202d775, 0x02131fb9, 0x01f8e668, 0x0168ab1f, 0x0350a0e9, 0x02584ef2, 0x0060dc66, 0x028100ce, 0x02dd3b88, 0x0016c089}}}, + {X: Field{[10]uint32{0x00a2fc79, 0x03b250c2, 0x00cb5a45, 0x01eb22f2, 0x00c2c1b7, 0x00749a84, 0x00f5ee59, 0x0311f8c6, 0x0258f92a, 0x00272255}}, Y: Field{[10]uint32{0x001045f9, 0x02b3ea70, 0x0338e516, 0x0057fdd3, 0x00ef4b01, 0x0378963b, 0x0255e286, 0x02f563c5, 0x01e2665e, 0x001c201c}}}, + {X: Field{[10]uint32{0x01861ba9, 0x037dbc30, 0x03bb5df1, 0x0338153e, 0x00a59bb3, 0x03afb38f, 0x01bffd18, 0x00d6c4ff, 0x020defba, 0x0014cb9b}}, Y: Field{[10]uint32{0x02bc5b8a, 0x02d1d52b, 0x027fff61, 0x003e942e, 0x0336f04b, 0x0192d164, 0x0332ed24, 0x02ef0fad, 0x01dad326, 0x0006bd19}}}, + {X: Field{[10]uint32{0x01fff425, 0x01238039, 0x02ea138d, 0x02020f69, 0x038a8a9f, 0x01432d28, 0x01add8eb, 0x01c24833, 0x0321e3f2, 0x0026410c}}, Y: Field{[10]uint32{0x0377ea6f, 0x0347c123, 0x03786ef9, 0x00937ca6, 0x02404ecb, 0x0394b0cd, 0x025b1be8, 0x00943f67, 0x0197325c, 0x00046fa1}}}, + {X: Field{[10]uint32{0x004084f9, 0x02bd1b9f, 0x0217287d, 0x01730cc7, 0x017d7908, 0x008308af, 0x00a6e941, 0x00d2a668, 0x00803a09, 0x00259e64}}, Y: Field{[10]uint32{0x00005e03, 0x011b08e6, 0x02d047dc, 0x02ab5d72, 0x02574903, 0x02ca04bb, 0x0120b5c9, 0x002ff9a9, 0x012d1845, 0x003aa400}}}, + {X: Field{[10]uint32{0x02a0afb9, 0x036b0dce, 0x006ab729, 0x006d3f0e, 0x021f36f7, 0x03bfdd85, 0x02d99819, 0x03f8433d, 0x0157915f, 0x001d3d74}}, Y: Field{[10]uint32{0x01b29eb5, 0x02750846, 0x0009a2c4, 0x02925069, 0x034e4ce4, 0x03323111, 0x02e225cd, 0x02f1d04a, 0x011e4922, 0x00152800}}}, + {X: Field{[10]uint32{0x01927855, 0x0335aa30, 0x0231e3e7, 0x035caa81, 0x0176e5f3, 0x0235e9d4, 0x000ddebe, 0x00e5555c, 0x035381c6, 0x00049a49}}, Y: Field{[10]uint32{0x039ae553, 0x03833070, 0x017b72c5, 0x03f544cd, 0x013eefef, 0x0387442d, 0x00554fa1, 0x000b5513, 0x00768110, 0x002e4b94}}}, + {X: Field{[10]uint32{0x00230d9f, 0x03801ee0, 0x028e11aa, 0x02f37471, 0x00d7cdcf, 0x03c63604, 0x036ae35a, 0x00f5cc16, 0x001b1d14, 0x000213be}}, Y: Field{[10]uint32{0x0175d42a, 0x028bb72d, 0x001bb33c, 0x0116a9b8, 0x02b0dda6, 0x00e28b96, 0x02bcf2c6, 0x033a3087, 0x022ba5b4, 0x0032b8e6}}}, + {X: Field{[10]uint32{0x009037ad, 0x00544b7b, 0x02a62dd7, 0x034a9ccf, 0x01c8d89d, 0x03b58aa1, 0x007af5e0, 0x01ab1d99, 0x01a3326e, 0x000708ab}}, Y: Field{[10]uint32{0x02aab458, 0x00126045, 0x00b64493, 0x03726580, 0x00bc4142, 0x02e79bf5, 0x0246283c, 0x029abe67, 0x00c61562, 0x003d6966}}}, + {X: Field{[10]uint32{0x024aff1b, 0x01c7307e, 0x03f4e736, 0x012142ef, 0x03c00f1f, 0x02781054, 0x00dd35fe, 0x02af56aa, 0x024ff08e, 0x001ae472}}, Y: Field{[10]uint32{0x01b31852, 0x00943f84, 0x039778cb, 0x0069f761, 0x01b3c955, 0x00413d61, 0x0368c8b6, 0x03e6753e, 0x02da85ad, 0x0031b36a}}}, + {X: Field{[10]uint32{0x01f85bc2, 0x01e2573b, 0x0188e23f, 0x02d7a3dc, 0x00b99063, 0x020dcdb9, 0x03f03219, 0x00855d84, 0x01996d2e, 0x0015eed2}}, Y: Field{[10]uint32{0x0347cc3a, 0x036dd96a, 0x0150e94f, 0x0050156d, 0x02d0a1ad, 0x01cea0b6, 0x034b9b20, 0x02a43a49, 0x01c672ee, 0x0024ed1b}}}, + {X: Field{[10]uint32{0x0233ba6e, 0x03d49812, 0x001ccb40, 0x0289e2be, 0x00067c38, 0x018f7e3c, 0x016d9f24, 0x0159b841, 0x0327ebf7, 0x001d5e42}}, Y: Field{[10]uint32{0x009d2045, 0x0267172e, 0x02dac6be, 0x01c66b81, 0x003af8dc, 0x011bab75, 0x025decf3, 0x002976c1, 0x00a3d99b, 0x00328323}}}, + {X: Field{[10]uint32{0x0074ebe9, 0x02f2ed41, 0x00a08f32, 0x03d36e31, 0x028dd7b4, 0x00c01287, 0x032b6fde, 0x01642fdf, 0x01ada90b, 0x00329e9d}}, Y: Field{[10]uint32{0x03fc69e3, 0x037b5a60, 0x03a1efd3, 0x0166b372, 0x00512732, 0x003c7700, 0x00e8a08e, 0x01479efd, 0x019c5c93, 0x002cc9e3}}}, + {X: Field{[10]uint32{0x0390b2d1, 0x013d754b, 0x0365c07a, 0x016bcc61, 0x0147b65a, 0x014aecd9, 0x02a8d6ce, 0x018a50e4, 0x00b93bf4, 0x0029b71a}}, Y: Field{[10]uint32{0x010ad45b, 0x00970cf2, 0x024de8f9, 0x01220648, 0x0237f533, 0x024c7718, 0x033c76a0, 0x01558683, 0x0167fc57, 0x00106e9b}}}, + {X: Field{[10]uint32{0x03b6bba5, 0x036b87da, 0x01b56fe0, 0x0130fd49, 0x002fafed, 0x0030d844, 0x035a0252, 0x03242b1f, 0x01f3f8af, 0x0036884e}}, Y: Field{[10]uint32{0x036349db, 0x001819c6, 0x02c369ad, 0x00743d6e, 0x0271e92c, 0x03968e53, 0x0097522d, 0x03605b70, 0x0388fa9e, 0x00256b72}}}, + {X: Field{[10]uint32{0x013da4de, 0x023893d0, 0x002cdf5a, 0x01ec8fc4, 0x03215935, 0x02aea732, 0x034194bf, 0x00018eb2, 0x00752f0e, 0x0028cac9}}, Y: Field{[10]uint32{0x03e576cc, 0x034c587a, 0x013dbddf, 0x02e0d3c1, 0x03e09f8a, 0x030d40db, 0x0316ffd8, 0x009ff31d, 0x0143bd8b, 0x0015f7d0}}}, + {X: Field{[10]uint32{0x01e9bedc, 0x00e2532b, 0x01392b89, 0x03c8b248, 0x02741718, 0x008cf1ce, 0x0319d8ba, 0x013fcf1c, 0x011d3382, 0x002aba92}}, Y: Field{[10]uint32{0x001a63a7, 0x02d85513, 0x02f4eb24, 0x00cb57e3, 0x01a7ad0d, 0x016bb61b, 0x026a3a1a, 0x0371964e, 0x029184d8, 0x000323ec}}}, + {X: Field{[10]uint32{0x007f2c75, 0x0222b362, 0x015e7ed3, 0x0170ac0c, 0x01ccf75d, 0x01a3ed8e, 0x00f3eb3d, 0x0026f489, 0x00e27a84, 0x000a4d78}}, Y: Field{[10]uint32{0x0168aad4, 0x026a4e31, 0x001640c8, 0x00343f7f, 0x03977e90, 0x00603530, 0x03d00680, 0x02b90260, 0x002462c9, 0x000313fc}}}, + {X: Field{[10]uint32{0x030fe577, 0x0091339d, 0x0218163d, 0x02581419, 0x03fdebbd, 0x02fabfb2, 0x034259aa, 0x01c94d60, 0x00769e2e, 0x001ff2a0}}, Y: Field{[10]uint32{0x01bc3542, 0x0384f355, 0x02ed99a5, 0x02e9f6eb, 0x0369cfec, 0x03f453fe, 0x003b8f6f, 0x03b48b2b, 0x03abf04d, 0x0028f770}}}, + {X: Field{[10]uint32{0x028b483e, 0x02d06457, 0x002a96a7, 0x031c4c59, 0x00bc129e, 0x01ed144d, 0x01e665f5, 0x02929fe9, 0x01c601ca, 0x00316d7c}}, Y: Field{[10]uint32{0x00b538e4, 0x01efeee7, 0x012576d3, 0x019b6332, 0x0173dabb, 0x0098047a, 0x0358fd0c, 0x0263368f, 0x0016da50, 0x0009b2ce}}}, + {X: Field{[10]uint32{0x01a50d88, 0x03eda81e, 0x034f456b, 0x01d33ff6, 0x03d7d5b1, 0x01e400d6, 0x01ecf4bf, 0x019dc993, 0x0274df43, 0x00104368}}, Y: Field{[10]uint32{0x039a6abf, 0x034aefbb, 0x000f88e1, 0x00e56efc, 0x02254a19, 0x01065e7e, 0x002ef1e8, 0x02cd25b7, 0x0168188e, 0x001c7206}}}, + {X: Field{[10]uint32{0x0367769a, 0x01634173, 0x03387540, 0x02b142af, 0x036f7976, 0x00e89a06, 0x036c5a24, 0x032002ae, 0x00ca334d, 0x000f664a}}, Y: Field{[10]uint32{0x01d2beb7, 0x03d3a7e5, 0x0115b2e4, 0x02af137c, 0x0062bf01, 0x00282879, 0x0183cdd8, 0x009ed4f8, 0x01dc7661, 0x0033f300}}}, + {X: Field{[10]uint32{0x00040cec, 0x03d0db32, 0x009192e4, 0x0387ce7f, 0x02d858ea, 0x000028c8, 0x037ce312, 0x0392991d, 0x017bc523, 0x00196a3d}}, Y: Field{[10]uint32{0x01192432, 0x01ff7018, 0x01b323f0, 0x03f30815, 0x03c9df69, 0x008affd8, 0x03f7b0ea, 0x00dd16c7, 0x00b99e95, 0x002081a6}}}, + {X: Field{[10]uint32{0x0192fb79, 0x00f99a97, 0x021531ac, 0x00e4929c, 0x0055f4e5, 0x0189c969, 0x013ef5ca, 0x001b0bff, 0x03ccbaa6, 0x00213954}}, Y: Field{[10]uint32{0x00c5f8d2, 0x03f43ce7, 0x01d674dc, 0x01d4640b, 0x014c0b5f, 0x03004887, 0x01f77311, 0x025197f6, 0x03324aaa, 0x000d35ab}}}, + {X: Field{[10]uint32{0x00773783, 0x03059a80, 0x036ac5f8, 0x02d3de68, 0x00dda3d4, 0x03451b6a, 0x011578d5, 0x00489bce, 0x01582885, 0x000ed29d}}, Y: Field{[10]uint32{0x01a59e53, 0x0021306c, 0x007877d0, 0x02f1335f, 0x021a4249, 0x013534d6, 0x00b3cc14, 0x00f30bad, 0x02fc4de8, 0x0038df25}}}, + {X: Field{[10]uint32{0x00cee6b0, 0x01b67bd4, 0x01db8922, 0x01e1920b, 0x02743395, 0x01ff344b, 0x00898193, 0x013a37a9, 0x012c0616, 0x001b6ef4}}, Y: Field{[10]uint32{0x01e02b90, 0x005845ab, 0x02a70333, 0x03182000, 0x020eed3b, 0x0069a2b3, 0x0247c17e, 0x0345514b, 0x0349b3f5, 0x00227923}}}, + {X: Field{[10]uint32{0x03c441f6, 0x03edcaa5, 0x03e02f0b, 0x0275b307, 0x02f1118e, 0x03e12bdc, 0x020b7431, 0x019205d2, 0x00db3b92, 0x002d9060}}, Y: Field{[10]uint32{0x03b25fd2, 0x03c30b13, 0x004d99e1, 0x036fab1c, 0x0033cc19, 0x03256817, 0x03a4f0f8, 0x00205899, 0x019783d0, 0x002ce53e}}}, + {X: Field{[10]uint32{0x016b5c56, 0x003c0e88, 0x02115b26, 0x02fb91ac, 0x0137e96f, 0x02ed9fca, 0x037fc08e, 0x01df1b65, 0x038cf473, 0x00085cfc}}, Y: Field{[10]uint32{0x012e2abf, 0x008becc8, 0x0136f27e, 0x006939e7, 0x023bd1c6, 0x01afb3d5, 0x008c6df0, 0x029a13f6, 0x027803c4, 0x002f680a}}}, + {X: Field{[10]uint32{0x005c5214, 0x03899b7f, 0x0356a222, 0x029aa289, 0x02ea2b89, 0x033cd781, 0x00df0b48, 0x00bc3619, 0x00d3f373, 0x0027767b}}, Y: Field{[10]uint32{0x03e921fe, 0x035c4b85, 0x0106fa70, 0x0069437b, 0x01dcf00b, 0x01f6e52b, 0x019256a5, 0x0209083b, 0x03202ba6, 0x00390ba9}}}, + {X: Field{[10]uint32{0x03af71a9, 0x004873f9, 0x0136b02a, 0x00c98134, 0x029d3982, 0x03dca424, 0x0149526a, 0x02d8bb75, 0x03ed5ceb, 0x001c17e7}}, Y: Field{[10]uint32{0x010d30a8, 0x00b30a5d, 0x01d2c44d, 0x00028580, 0x002b32c1, 0x01e9e18f, 0x0269a4a5, 0x01cbac4b, 0x017daa44, 0x002ecb2c}}}, + {X: Field{[10]uint32{0x00ef4410, 0x02130acb, 0x031a217b, 0x028a3637, 0x033fbcda, 0x03f04978, 0x037fcd8c, 0x01a6f5fe, 0x00d18071, 0x003c6a42}}, Y: Field{[10]uint32{0x00911512, 0x02a91a2e, 0x02cc14e7, 0x03921e04, 0x02d792bb, 0x0214799e, 0x01cfa759, 0x01b15be0, 0x0008804c, 0x0003a1b3}}}, + {X: Field{[10]uint32{0x01355f57, 0x03370938, 0x00d5fd40, 0x00d1491f, 0x005625e4, 0x02148983, 0x012a4756, 0x00f2071d, 0x01793569, 0x0036c317}}, Y: Field{[10]uint32{0x0283daea, 0x030ba371, 0x02629fe8, 0x0354d533, 0x01d0de9b, 0x014e7af9, 0x0321f1e2, 0x034a54dd, 0x02a9fb00, 0x00048317}}}, + {X: Field{[10]uint32{0x02423ec6, 0x03b652f2, 0x00af59a2, 0x01c1ed4f, 0x02e979d4, 0x010476a1, 0x0158f683, 0x01fa486c, 0x01355600, 0x00179356}}, Y: Field{[10]uint32{0x0272d935, 0x01ddcf98, 0x026dcb94, 0x02824a1d, 0x01c309b5, 0x0339abbf, 0x0062fb37, 0x027b4c9e, 0x03001a0e, 0x001c5622}}}, + {X: Field{[10]uint32{0x03ec7f28, 0x00abd013, 0x02bcd487, 0x0019fb3e, 0x00a264d1, 0x00904059, 0x017fd112, 0x0397e23a, 0x02083c46, 0x00069e7b}}, Y: Field{[10]uint32{0x02349111, 0x03de8c8c, 0x02aacc4d, 0x03536501, 0x0254f94b, 0x0229723f, 0x016289f1, 0x01d54c0d, 0x03fc49bf, 0x003e4a36}}}, + {X: Field{[10]uint32{0x00ac5468, 0x028ebcdb, 0x0346e86c, 0x00492af7, 0x011c3a18, 0x00e8290d, 0x000a2d7f, 0x00311b2d, 0x008be3be, 0x0039a4fe}}, Y: Field{[10]uint32{0x01649cc4, 0x002529b7, 0x00efb78f, 0x0135994e, 0x03fb4f35, 0x022bb16b, 0x032db89d, 0x00a8aebb, 0x03bd24ab, 0x00157c2d}}}, + {X: Field{[10]uint32{0x029ca25e, 0x0315468c, 0x03e581bc, 0x015d7435, 0x0043bb61, 0x017a5b8a, 0x03b12d4f, 0x00f1dbdc, 0x00b1f3c7, 0x001b457a}}, Y: Field{[10]uint32{0x017f069d, 0x030d620b, 0x0365db74, 0x02f9b8ed, 0x01173f8c, 0x0067e296, 0x020d05e4, 0x01909cca, 0x02e18438, 0x003c87cf}}}, + {X: Field{[10]uint32{0x03ddb682, 0x02aab78e, 0x02dc48a5, 0x0393fd4d, 0x0220dd98, 0x01964f45, 0x0303f2cf, 0x012bd254, 0x0127b261, 0x00122e3c}}, Y: Field{[10]uint32{0x03546e3f, 0x0395fb0b, 0x02e99c7c, 0x0075a00e, 0x02a50d19, 0x0175e1b5, 0x027e23b5, 0x01f18944, 0x01baec13, 0x0023b46e}}}, + {X: Field{[10]uint32{0x02eb3028, 0x029f03d6, 0x023d4170, 0x02923fdf, 0x008c29fc, 0x028cb828, 0x0319f291, 0x01144251, 0x0231ee1e, 0x000bb0c9}}, Y: Field{[10]uint32{0x017aa945, 0x015e171a, 0x02c91610, 0x03e04faa, 0x02491572, 0x0341f426, 0x010ee359, 0x014db963, 0x019fe21b, 0x003ae187}}}, + {X: Field{[10]uint32{0x03afce3a, 0x02e3282b, 0x017b6776, 0x019ba861, 0x007ab72f, 0x01573251, 0x012c13fb, 0x0353517b, 0x02cb3b35, 0x003de583}}, Y: Field{[10]uint32{0x0010f08a, 0x0366b9e1, 0x00510cd6, 0x01fe3e1f, 0x03d8f7cf, 0x0280bba9, 0x0140334d, 0x01ad029c, 0x00f8d40f, 0x00240917}}}, + {X: Field{[10]uint32{0x02613ef2, 0x011c496e, 0x035af7a2, 0x02e31f72, 0x01139b29, 0x0163cea8, 0x0385780d, 0x03df9bbc, 0x003e4b22, 0x002a5333}}, Y: Field{[10]uint32{0x02845409, 0x03511768, 0x00c45e94, 0x032e33e9, 0x02782471, 0x02f1a99b, 0x01ba357c, 0x03e836a2, 0x00fadd6a, 0x003bdc14}}}, + {X: Field{[10]uint32{0x01485c38, 0x018bd53d, 0x0239956d, 0x03b45c21, 0x028c42b3, 0x0315bc09, 0x03d6f576, 0x03d0c034, 0x03f86d80, 0x0039229f}}, Y: Field{[10]uint32{0x029a6255, 0x03671697, 0x00231a7b, 0x00091ee6, 0x03e429b7, 0x01ffed0a, 0x01e3c65c, 0x01ec2c8a, 0x0229b499, 0x002c5a54}}}, + {X: Field{[10]uint32{0x0322d2ae, 0x027a6edf, 0x00d9eac7, 0x02efd922, 0x02cccb09, 0x00a98cf5, 0x025b422b, 0x0320eb36, 0x008c7d46, 0x0037e652}}, Y: Field{[10]uint32{0x0345fd4b, 0x01dd58bc, 0x038c3e04, 0x01176468, 0x03aaf83a, 0x02f4f1ca, 0x001a8785, 0x03d17114, 0x0280a958, 0x00225240}}}, + {X: Field{[10]uint32{0x0322fd84, 0x03bd06bb, 0x03770553, 0x00f8a6c9, 0x032bb4e4, 0x02e8d23b, 0x024368eb, 0x03e7d1bd, 0x02c04db9, 0x00285431}}, Y: Field{[10]uint32{0x01c5c201, 0x0193ca46, 0x01ccae1f, 0x01fad121, 0x00e7b539, 0x0038fb47, 0x0122ab02, 0x01683b0e, 0x0274e152, 0x001877ea}}}, + {X: Field{[10]uint32{0x03aa0edd, 0x02a9507c, 0x024e1204, 0x03ff615a, 0x00937392, 0x0326128a, 0x03aa167b, 0x031be475, 0x01fa452e, 0x0026df7b}}, Y: Field{[10]uint32{0x03d2c74a, 0x012a113f, 0x03e7910a, 0x002732b6, 0x03b4262c, 0x0326cc6a, 0x020ef6e7, 0x01a37af2, 0x01122f51, 0x0028dfd2}}}, + {X: Field{[10]uint32{0x00e51904, 0x03b4d60a, 0x01a23d38, 0x00f3e482, 0x02ad1aa8, 0x01e69641, 0x00f75c55, 0x03a9c6c8, 0x02516d0c, 0x0031f5de}}, Y: Field{[10]uint32{0x00a44bd6, 0x0393635d, 0x00e7f56d, 0x02232d7b, 0x0108e5a2, 0x026c36ba, 0x030a7a14, 0x00d980de, 0x007d9e1a, 0x000e669f}}}, + {X: Field{[10]uint32{0x02fe73fd, 0x009e52d0, 0x02e8d806, 0x03b2cee1, 0x02fc1d1d, 0x01cf6604, 0x026c2b0f, 0x0396e685, 0x00298e4d, 0x0034c4ea}}, Y: Field{[10]uint32{0x03708fe4, 0x02a20c07, 0x02a16fc9, 0x027182bd, 0x03b8514c, 0x02ef6d36, 0x03062c5d, 0x01b8bcd3, 0x023a7eb2, 0x00194911}}}, + {X: Field{[10]uint32{0x03211e5f, 0x0181ffa5, 0x038b9787, 0x00f1263c, 0x022e6c2a, 0x00f13c63, 0x0069b8e8, 0x031a4c19, 0x023b4d66, 0x0012efcd}}, Y: Field{[10]uint32{0x011c60c3, 0x01ba301f, 0x025629f2, 0x01670378, 0x0382bb0d, 0x00605dd0, 0x03b64061, 0x01cb1631, 0x024b2438, 0x002790b2}}}, + {X: Field{[10]uint32{0x021e9cf2, 0x0114d7e1, 0x0003e3f8, 0x00ddd19d, 0x01d471bd, 0x0199f3c6, 0x027ef1da, 0x033a1b52, 0x00ed23a0, 0x0000ef84}}, Y: Field{[10]uint32{0x0066d885, 0x02c10cd0, 0x00ead0a7, 0x02432e57, 0x00edfd20, 0x026ee7ea, 0x034748a4, 0x005f0194, 0x03780cb3, 0x002ee564}}}, + {X: Field{[10]uint32{0x01ca2076, 0x02736cd7, 0x01d96b16, 0x026032e9, 0x00946da1, 0x034a7bb1, 0x01074ec8, 0x0258f20a, 0x0080d723, 0x003f347e}}, Y: Field{[10]uint32{0x02a87b01, 0x024674ec, 0x013467c0, 0x02b896fb, 0x02d3b105, 0x03e97f21, 0x00ec2755, 0x018b8713, 0x00e3a313, 0x0025226f}}}, + {X: Field{[10]uint32{0x02b317c4, 0x03009c7e, 0x0217cf0e, 0x02a14b34, 0x01f39f42, 0x023a81a0, 0x027114cd, 0x00d98acb, 0x0358993d, 0x0002d7ec}}, Y: Field{[10]uint32{0x03a71b43, 0x02ceeefc, 0x0334a791, 0x0314537d, 0x0380a653, 0x02c12b09, 0x01bfa828, 0x00b2f3c3, 0x02b8ee62, 0x00227623}}}, + {X: Field{[10]uint32{0x03e274e7, 0x00920563, 0x037c9556, 0x01fd8139, 0x0330fc13, 0x00b32acf, 0x000f39bd, 0x0118291d, 0x02d17fca, 0x002a1aee}}, Y: Field{[10]uint32{0x030753fb, 0x02de8a40, 0x01a0bd03, 0x038498fd, 0x031394ed, 0x01258b01, 0x0294742e, 0x026b1e34, 0x0259ba96, 0x00309b70}}}, + {X: Field{[10]uint32{0x0330d29a, 0x02486004, 0x01467887, 0x025309f4, 0x019dd3fc, 0x024d744a, 0x034bc7ba, 0x02f259f8, 0x01f6348c, 0x0003b4c8}}, Y: Field{[10]uint32{0x03f7c3b5, 0x00349468, 0x021351be, 0x00085400, 0x00fc5ac4, 0x03c1ef72, 0x03b44d6c, 0x0177871d, 0x0360832b, 0x002d01e0}}}, + {X: Field{[10]uint32{0x02d17dea, 0x035c6506, 0x0097996e, 0x023dc07f, 0x022c425b, 0x03825312, 0x01e827ed, 0x02e4dbd5, 0x0275e4dd, 0x003205e4}}, Y: Field{[10]uint32{0x002553a7, 0x03fa6776, 0x02622e16, 0x018f14ac, 0x038ce5e9, 0x019921ab, 0x009b0b92, 0x034597ad, 0x005be241, 0x003667c7}}}, + {X: Field{[10]uint32{0x0284985b, 0x03435f77, 0x02512df1, 0x00b87647, 0x010eeaf8, 0x03e37f3f, 0x02743283, 0x02ce0d24, 0x013f23b9, 0x001bc23c}}, Y: Field{[10]uint32{0x00bd602e, 0x00ff8236, 0x03a76a4a, 0x00788b31, 0x010665d6, 0x000dc2b1, 0x0258ed05, 0x010ce9bb, 0x0029f99f, 0x0025adaa}}}, + {X: Field{[10]uint32{0x038f9d5a, 0x031f99e7, 0x015e4b35, 0x01b28461, 0x03e6ab5d, 0x03ab0f97, 0x01f8b609, 0x02753fbe, 0x03e3410f, 0x002510e9}}, Y: Field{[10]uint32{0x03eded57, 0x003e4d8e, 0x01b538fa, 0x03756847, 0x02ac9b2a, 0x001eaf08, 0x03c93e6d, 0x0230fcc6, 0x03b57818, 0x00363141}}}, + {X: Field{[10]uint32{0x033c502b, 0x01c0fd44, 0x013d2e37, 0x0120378a, 0x01d38c88, 0x01c015bb, 0x03afcfa5, 0x00da06b4, 0x00ca3ed5, 0x0010cbaa}}, Y: Field{[10]uint32{0x03edff71, 0x00ce26da, 0x00118faa, 0x0371909c, 0x010965dd, 0x009b1a98, 0x0266a498, 0x00aec023, 0x028b70b5, 0x00278648}}}, + {X: Field{[10]uint32{0x0182403b, 0x0240ff86, 0x032c130f, 0x03ab8adc, 0x005e22ff, 0x00f1ffb6, 0x02584a3d, 0x00bf6316, 0x009a42f8, 0x000745d6}}, Y: Field{[10]uint32{0x00c39ceb, 0x003d549e, 0x00e9454e, 0x017ef978, 0x03511e96, 0x0117c31a, 0x0164ed02, 0x03482099, 0x03b48f18, 0x0027def3}}}, + {X: Field{[10]uint32{0x018e6b2d, 0x00da87f8, 0x0098b554, 0x03fffdf0, 0x021ab8c6, 0x024104b3, 0x02778ea7, 0x0211bd97, 0x01b5cd84, 0x001d0ce6}}, Y: Field{[10]uint32{0x00b784bc, 0x03d26cb6, 0x03145fb1, 0x02739733, 0x01e84ff4, 0x0006dbf4, 0x0166d3fc, 0x006f9399, 0x001a8280, 0x00371b32}}}, + {X: Field{[10]uint32{0x0110b2a7, 0x0268369e, 0x0071fa27, 0x00cb817e, 0x025330d2, 0x02d7e490, 0x023e80e3, 0x0123058b, 0x01583b28, 0x00390de1}}, Y: Field{[10]uint32{0x01624b68, 0x036b3c15, 0x011f080c, 0x006f41db, 0x01d5e242, 0x005e6862, 0x013f99f8, 0x01e3901f, 0x0171aa49, 0x0030e6d0}}}, + {X: Field{[10]uint32{0x0318d63e, 0x0009acd9, 0x02a10664, 0x033bd7d0, 0x038f8a99, 0x00029918, 0x0355ac7d, 0x00e6a3c5, 0x00a31b16, 0x003bbdda}}, Y: Field{[10]uint32{0x0224a991, 0x01211cc7, 0x01ef5ee6, 0x02e22f8a, 0x01878efc, 0x03a5ec19, 0x030043af, 0x039a186b, 0x01f4cbf4, 0x000aa401}}}, + {X: Field{[10]uint32{0x03c91fe9, 0x0032a86f, 0x0129a180, 0x027ecb7a, 0x00fc2afa, 0x01807612, 0x00dce1bd, 0x0184b3d0, 0x02872504, 0x000576d1}}, Y: Field{[10]uint32{0x027eded8, 0x01c43313, 0x03515f17, 0x002e568b, 0x021e7236, 0x0242e0b2, 0x00678a9d, 0x02366941, 0x024e7d50, 0x002a2db9}}}, + {X: Field{[10]uint32{0x014a4191, 0x015eeb43, 0x022a0c77, 0x00fbf1e3, 0x01d2b330, 0x015a87f6, 0x028d2a04, 0x02a12e74, 0x02cf2529, 0x002b517e}}, Y: Field{[10]uint32{0x0254f069, 0x012a234d, 0x0125aa6b, 0x002583e6, 0x01bf8d81, 0x03ddf56b, 0x02f58678, 0x00c0d45b, 0x0171473f, 0x00069e39}}}, + {X: Field{[10]uint32{0x01151824, 0x02526d6e, 0x03d8958c, 0x01b57e92, 0x021c19b6, 0x0224aeb0, 0x0375050a, 0x01ed33ad, 0x03446e02, 0x0010680d}}, Y: Field{[10]uint32{0x01140317, 0x0150df65, 0x00e74bb4, 0x033590d7, 0x0027c53a, 0x00381ea1, 0x021cb2e6, 0x034e3e9c, 0x00ddfa96, 0x003b5f11}}}, + {X: Field{[10]uint32{0x03217ae0, 0x0047c749, 0x00740560, 0x035836b0, 0x015a70d5, 0x003c410f, 0x03645890, 0x031ffcb3, 0x006958f4, 0x0008082e}}, Y: Field{[10]uint32{0x01c4e9e0, 0x02e53df8, 0x02aa0490, 0x0184a754, 0x02b37f59, 0x0093ac71, 0x01946171, 0x03d0c686, 0x01e22757, 0x00044656}}}, + {X: Field{[10]uint32{0x02bd4ba1, 0x00e0ea7a, 0x00180283, 0x0155c400, 0x0299c5f7, 0x021685a7, 0x033bf27d, 0x01d2a543, 0x0146859f, 0x000be66a}}, Y: Field{[10]uint32{0x0389fc53, 0x0153dd37, 0x039fa128, 0x02753a35, 0x0236ecba, 0x03982164, 0x024ed246, 0x03aa891e, 0x0182d3ca, 0x000f9888}}}, + {X: Field{[10]uint32{0x02369baa, 0x03af7467, 0x03a3c177, 0x01d752a0, 0x010e7c56, 0x03889fca, 0x027688c2, 0x014e4005, 0x018957f6, 0x003773ce}}, Y: Field{[10]uint32{0x034b2431, 0x0077004b, 0x01b873da, 0x0233cac4, 0x01c3c342, 0x02437408, 0x01a3ceea, 0x020ce88e, 0x023f3fa6, 0x0029c031}}}, + {X: Field{[10]uint32{0x011ace4f, 0x03441086, 0x0117b73b, 0x02ab02de, 0x0392df1e, 0x024c6716, 0x022fa9e0, 0x008d8067, 0x03b80425, 0x002618e9}}, Y: Field{[10]uint32{0x003b69e6, 0x018d58b8, 0x02b6a3bf, 0x02b93c6c, 0x023a1fa7, 0x00928c3a, 0x0309f8c7, 0x02ac852f, 0x01a9281d, 0x00126926}}}, + {X: Field{[10]uint32{0x01733886, 0x02a3d637, 0x01d2e467, 0x03bcf1b5, 0x0219cb4d, 0x012e3a4b, 0x033734a6, 0x01645cd3, 0x01f9ea2c, 0x001b1519}}, Y: Field{[10]uint32{0x020e733c, 0x03f110c7, 0x03c8d3da, 0x017e8701, 0x03768f65, 0x00c66acf, 0x02a2616a, 0x03cd7456, 0x02bb179d, 0x00015f88}}}, + {X: Field{[10]uint32{0x00f3fcdd, 0x01e7c514, 0x03a530d9, 0x0153f9c0, 0x0025acb6, 0x02c281a4, 0x00ca387f, 0x00efac34, 0x0113360b, 0x002acdd5}}, Y: Field{[10]uint32{0x0041be4a, 0x01170bdb, 0x027c5464, 0x01d940fb, 0x0157f0f7, 0x030de9bb, 0x03842f43, 0x00b7966d, 0x0149309a, 0x000fa704}}}, + {X: Field{[10]uint32{0x002603d2, 0x00481e93, 0x03111482, 0x02a7a450, 0x00ff0878, 0x0016c8b4, 0x03aee379, 0x03bac2c8, 0x03ea4a72, 0x001ab2f8}}, Y: Field{[10]uint32{0x030d32b9, 0x032c6777, 0x025330ae, 0x00f39256, 0x02ac2ca2, 0x03279a01, 0x023dad76, 0x01365a85, 0x00be9f93, 0x0007b3bf}}}, + {X: Field{[10]uint32{0x02955d89, 0x03e573ce, 0x008c3653, 0x00141fc7, 0x03b4ddd1, 0x01d9b894, 0x00ac9f9c, 0x00310979, 0x014458fd, 0x001e5574}}, Y: Field{[10]uint32{0x0250aaca, 0x00d40925, 0x01245847, 0x00ec0349, 0x0340c672, 0x00e880a1, 0x02892255, 0x021fc252, 0x01f73043, 0x0023ea71}}}, + {X: Field{[10]uint32{0x01ace377, 0x0083360d, 0x0213228c, 0x02ff95e0, 0x02d488eb, 0x01ef4f68, 0x02b25a22, 0x010cfdc0, 0x010c0090, 0x002d65cb}}, Y: Field{[10]uint32{0x02b008fa, 0x035932d0, 0x03212cf3, 0x0211702f, 0x00e3e78f, 0x005d2cbf, 0x01ef70ed, 0x00f7949e, 0x00bf7fbc, 0x0008d51c}}}, + {X: Field{[10]uint32{0x00bcf886, 0x02d22f41, 0x038e4d9c, 0x01f91257, 0x02cc500d, 0x00f31e7c, 0x004f3bc5, 0x03e9a288, 0x001033a5, 0x002899aa}}, Y: Field{[10]uint32{0x015949f8, 0x022def7d, 0x011ecb56, 0x00916c2e, 0x03d52b78, 0x011bcf8d, 0x00390e6a, 0x0056dd99, 0x01a1958d, 0x000c6a2c}}}, + {X: Field{[10]uint32{0x00b9cc15, 0x03908751, 0x03123451, 0x00fdf783, 0x01ae7f4f, 0x03a7df08, 0x03bf47e1, 0x006d8d6e, 0x02ec2119, 0x00071904}}, Y: Field{[10]uint32{0x002c685a, 0x0188a131, 0x0169d82a, 0x006c8bfe, 0x016e7fec, 0x000958c2, 0x0173851d, 0x0313cfd6, 0x022c1111, 0x0020cfe2}}}, + {X: Field{[10]uint32{0x020b7fda, 0x018841cf, 0x01f68a74, 0x01f17989, 0x03817267, 0x03b813fc, 0x019ccbef, 0x016d5e70, 0x02ab1757, 0x003b8d4c}}, Y: Field{[10]uint32{0x027e8718, 0x03d1441b, 0x00f53a9a, 0x02d24acb, 0x0304b704, 0x03123b9a, 0x01ff04dc, 0x0261ee0f, 0x00c8b2fd, 0x003c4b84}}}, + {X: Field{[10]uint32{0x021a3838, 0x011367fb, 0x0115e379, 0x012c0259, 0x0152ef9a, 0x01fd6d2f, 0x012765af, 0x01e4dcbb, 0x03be0486, 0x0017b443}}, Y: Field{[10]uint32{0x00080573, 0x03218ced, 0x028af2a8, 0x01ed7ef1, 0x02a4bffd, 0x00977399, 0x00ac6410, 0x00e493b6, 0x01b49fbe, 0x002313ae}}}, + {X: Field{[10]uint32{0x001378d2, 0x00754d74, 0x0152a15a, 0x0165c208, 0x01b8f6b8, 0x01cd0838, 0x03e7345f, 0x0217b5a7, 0x0221f04c, 0x003f8d22}}, Y: Field{[10]uint32{0x001f2b7b, 0x0273f482, 0x019117fa, 0x00f5f67e, 0x03506947, 0x038e3908, 0x02abd103, 0x02afd173, 0x0046c9f5, 0x00356575}}}, + {X: Field{[10]uint32{0x032436e9, 0x0221d17e, 0x0223dbda, 0x02730245, 0x03b57367, 0x016e8e5c, 0x021e1c0b, 0x012e8021, 0x0369b7b6, 0x0001c500}}, Y: Field{[10]uint32{0x03a12b2d, 0x01da9520, 0x010ad1f3, 0x01881cb1, 0x0240dfa3, 0x003199cb, 0x003bc213, 0x02581ca3, 0x0350f979, 0x003c1dc0}}}, + {X: Field{[10]uint32{0x01dad15d, 0x020855e6, 0x01bd40aa, 0x036ea0e0, 0x020a7465, 0x0048c025, 0x02c6b88b, 0x0078eb9f, 0x00e48e98, 0x001b4531}}, Y: Field{[10]uint32{0x03e0f841, 0x016c1439, 0x0299a50e, 0x023ed6fa, 0x01f9c6de, 0x02d62cb5, 0x02635f6d, 0x0344aa93, 0x02aaa5f2, 0x00097934}}}, + {X: Field{[10]uint32{0x024383da, 0x036c2bc6, 0x0228daea, 0x01c416ed, 0x004dffe0, 0x015413a2, 0x020558e5, 0x01f5f8d8, 0x01c6a683, 0x001e4c6e}}, Y: Field{[10]uint32{0x03e80c0b, 0x033fb7be, 0x002ff9d5, 0x0012108b, 0x0196b7a9, 0x03cef4e3, 0x0112128b, 0x00971b77, 0x02733209, 0x00161b2a}}}, + {X: Field{[10]uint32{0x01cec834, 0x03342f79, 0x03d95b0e, 0x01149eaa, 0x0088dca1, 0x005462e2, 0x00e1f32a, 0x00f50d74, 0x016a35b8, 0x000527a7}}, Y: Field{[10]uint32{0x025606f5, 0x01d316b3, 0x02e1fcbc, 0x03300641, 0x00f87b11, 0x03404bed, 0x01d49b38, 0x033197a4, 0x02a0fd84, 0x0011601e}}}, + {X: Field{[10]uint32{0x01297394, 0x026f49c3, 0x03ff7b80, 0x025b0a12, 0x001bf6e6, 0x01e52404, 0x02f2b59d, 0x0146a088, 0x036eb4b3, 0x00195ac9}}, Y: Field{[10]uint32{0x03763291, 0x01cca05e, 0x025d9b64, 0x034feaa3, 0x03905eb6, 0x0038d624, 0x00ebfa9a, 0x010e8a4a, 0x03095f86, 0x0021d1bc}}}, + {X: Field{[10]uint32{0x031eb02e, 0x012d8283, 0x000a6988, 0x00814e62, 0x033656a7, 0x01e14b87, 0x022370ff, 0x01a627b9, 0x01e36808, 0x00183ce6}}, Y: Field{[10]uint32{0x0044ad59, 0x02cadbf5, 0x0267d4f1, 0x03f937bc, 0x039e5976, 0x0082dde7, 0x0251676d, 0x02f85214, 0x005a8347, 0x00157728}}}, + {X: Field{[10]uint32{0x006eaa13, 0x036f9062, 0x00e0d4ca, 0x016a4063, 0x01034a30, 0x013e6f70, 0x006f4175, 0x02907029, 0x03030a67, 0x00136f68}}, Y: Field{[10]uint32{0x03a48fc4, 0x01616e0f, 0x03970c22, 0x025748f5, 0x01909a3b, 0x010cedd1, 0x01f9fe64, 0x00d16359, 0x0086fec3, 0x003818b3}}}, + {X: Field{[10]uint32{0x010363d1, 0x03ca8037, 0x03111d07, 0x0313d256, 0x03f8c8b1, 0x0360671a, 0x03c10c8f, 0x01336569, 0x01ca04d6, 0x00205ab8}}, Y: Field{[10]uint32{0x02526009, 0x03470619, 0x0366b2df, 0x03c83524, 0x03b12187, 0x03a744ee, 0x02a55208, 0x035bf55b, 0x03ffc331, 0x003027da}}}, + {X: Field{[10]uint32{0x0081b52b, 0x00636be0, 0x020a000f, 0x011305b5, 0x01872029, 0x0178a22b, 0x032b8fae, 0x03829f0e, 0x039c983f, 0x001160e7}}, Y: Field{[10]uint32{0x01dd8649, 0x02169a99, 0x004db2a7, 0x01af3684, 0x01aff40c, 0x0020d6be, 0x01f7beb3, 0x013ad020, 0x02074de7, 0x003e4da3}}}, + {X: Field{[10]uint32{0x00223465, 0x016dba35, 0x00d5063c, 0x01f6c8ef, 0x0244b715, 0x0309153c, 0x004c482e, 0x0080ec78, 0x02483a49, 0x00142b92}}, Y: Field{[10]uint32{0x015f3008, 0x02e8df9f, 0x0065836d, 0x00a170d9, 0x010a6190, 0x0160ef69, 0x032031ec, 0x00b87d97, 0x03d7e7bd, 0x00386e33}}}, + {X: Field{[10]uint32{0x016b72d6, 0x010657d8, 0x039dba69, 0x012fb49b, 0x03c5d8bb, 0x0086b39d, 0x02dde15b, 0x01422467, 0x02316039, 0x0037ddec}}, Y: Field{[10]uint32{0x034344a4, 0x03254022, 0x0303717d, 0x0032ccfc, 0x00c99e27, 0x019cd997, 0x00cff822, 0x02fef2e2, 0x01b89ece, 0x002292dd}}}, + {X: Field{[10]uint32{0x0233277d, 0x02c2e3bc, 0x01345437, 0x02358ecb, 0x016d2d23, 0x0009d01d, 0x00419d67, 0x00bc62dd, 0x0219978e, 0x003b1b03}}, Y: Field{[10]uint32{0x0236e553, 0x018fc2c9, 0x02d8a4a3, 0x01a05cf3, 0x0296bd39, 0x016ff931, 0x0171dc13, 0x03133189, 0x039a02df, 0x003e436a}}}, + {X: Field{[10]uint32{0x017b3329, 0x00640458, 0x03e4ba46, 0x0215214a, 0x005af2a8, 0x029c8886, 0x014eacb1, 0x03f39a9b, 0x016f90e7, 0x000a1d10}}, Y: Field{[10]uint32{0x02eb4466, 0x0374997a, 0x0282d448, 0x01256d36, 0x03b8628e, 0x0244ab5f, 0x024c9af7, 0x0359222e, 0x0275f6ce, 0x0007cc8d}}}, + {X: Field{[10]uint32{0x00ff4247, 0x02b3cfdc, 0x01d2be7d, 0x032e25f2, 0x02529de5, 0x00edb74f, 0x0087f3e8, 0x00ea03e3, 0x03ec586d, 0x0021c8d9}}, Y: Field{[10]uint32{0x02a3ac05, 0x01a144a9, 0x02eeceef, 0x032792d8, 0x017dc571, 0x0109f802, 0x00768b5e, 0x0210ede2, 0x00e0fae0, 0x00396ed8}}}, + {X: Field{[10]uint32{0x024713cc, 0x02368f90, 0x01f4891b, 0x02c84efc, 0x004339a0, 0x00312bcd, 0x0030ce94, 0x03f4c2b9, 0x00040baf, 0x003043c8}}, Y: Field{[10]uint32{0x0231c7ee, 0x00dfef61, 0x02e59c35, 0x01e58d0f, 0x03bf6dbf, 0x00fe0bb7, 0x006d456b, 0x026cdb15, 0x0055f0c3, 0x000defa4}}}, + {X: Field{[10]uint32{0x00d847c5, 0x01b7651c, 0x0059da35, 0x02cee4ef, 0x00733b8b, 0x00cd4fa0, 0x01f0f150, 0x00c015af, 0x02e191c8, 0x0005384b}}, Y: Field{[10]uint32{0x03efcfb2, 0x01438ea6, 0x020dab15, 0x00c80634, 0x01d487f0, 0x019b5c91, 0x0332ba7c, 0x005e044a, 0x038ee00c, 0x003a5c1e}}}, + {X: Field{[10]uint32{0x009fdf36, 0x01e08f12, 0x003057b5, 0x02d2ba01, 0x003687ea, 0x02b414f9, 0x00dd89f6, 0x00de774b, 0x021e2583, 0x0036b0ee}}, Y: Field{[10]uint32{0x03e2c041, 0x011d171b, 0x03fa4761, 0x010bf4de, 0x02d13a69, 0x00b47b13, 0x0020ab1c, 0x00546557, 0x024d8821, 0x001178f6}}}, + {X: Field{[10]uint32{0x03800bf4, 0x01373faf, 0x00b09264, 0x02eff74b, 0x00a2507d, 0x000e968b, 0x039fad0b, 0x021abba1, 0x027a05c0, 0x00366ff1}}, Y: Field{[10]uint32{0x02be6730, 0x00518d00, 0x02ca42fc, 0x023ac8f9, 0x02e5bb4e, 0x024d243d, 0x036c8b1e, 0x03d6f454, 0x014b5a39, 0x00380577}}}, + {X: Field{[10]uint32{0x0196c61e, 0x01861cde, 0x00b34007, 0x00704bdb, 0x028a9a98, 0x03659660, 0x00d7e581, 0x03283c5c, 0x00522f04, 0x00379bcd}}, Y: Field{[10]uint32{0x032a0cc7, 0x00153bbd, 0x00e3b826, 0x0053fc09, 0x012fc6d8, 0x00d3857c, 0x039c251f, 0x013ea50e, 0x033b28d7, 0x0007b05b}}}, + {X: Field{[10]uint32{0x00e30eaf, 0x02fe0a28, 0x00d93f54, 0x00e93ea3, 0x02b35c87, 0x00d94a0f, 0x00a15ef2, 0x005eba21, 0x0355338e, 0x0010caac}}, Y: Field{[10]uint32{0x01447807, 0x00f73fe5, 0x02b9e870, 0x0029f61a, 0x01caa9af, 0x00830429, 0x023e0767, 0x0036fc22, 0x02a10a13, 0x003d5819}}}, + {X: Field{[10]uint32{0x037c4d99, 0x0102359f, 0x02afa35a, 0x0036d6fa, 0x008d9699, 0x02550c75, 0x010f546d, 0x009f0e8d, 0x0107cfa1, 0x000f4b8d}}, Y: Field{[10]uint32{0x035f74f2, 0x015564e8, 0x02ac51b2, 0x0020aef4, 0x017f4a05, 0x003e288d, 0x01655cab, 0x030dcc51, 0x005f4711, 0x00369822}}}, + {X: Field{[10]uint32{0x00ba87ef, 0x01b94609, 0x0183f457, 0x03180646, 0x03f781c7, 0x017cedc6, 0x0029d0a5, 0x0352f8df, 0x031cb96d, 0x001fcfd0}}, Y: Field{[10]uint32{0x00b8bfec, 0x032009d8, 0x021c1695, 0x03093a45, 0x02cfdb08, 0x01c5dee5, 0x00259f6f, 0x034930ae, 0x03457649, 0x003d37d0}}}, + {X: Field{[10]uint32{0x03687143, 0x00129fcb, 0x017163d6, 0x0357c4a3, 0x026f7b67, 0x015639ab, 0x036cdd8b, 0x01c00112, 0x0359f2c8, 0x00109c2f}}, Y: Field{[10]uint32{0x01a99315, 0x023aaf53, 0x0174e0d0, 0x0037b494, 0x006c4a18, 0x01689549, 0x025da0a1, 0x03e465a1, 0x00ef2e8f, 0x00000d63}}}, + {X: Field{[10]uint32{0x03603852, 0x0256e31f, 0x02ebd46f, 0x02ac3af8, 0x01b7931c, 0x0147194e, 0x013af50d, 0x03f27104, 0x022b9930, 0x003198dc}}, Y: Field{[10]uint32{0x025ecfab, 0x01c237a4, 0x0313f719, 0x0231e3e3, 0x020b9476, 0x00f292cc, 0x0132a310, 0x008f63ad, 0x03b32cdf, 0x000d10f9}}}, + {X: Field{[10]uint32{0x006c4e14, 0x023c58b2, 0x0214f21f, 0x03ce56b9, 0x010168e8, 0x019b95fe, 0x03d7b65c, 0x03fc0b3a, 0x0064e396, 0x002c0052}}, Y: Field{[10]uint32{0x002eb876, 0x02f92e86, 0x0272cb7d, 0x027a8381, 0x004a80b6, 0x02d4048c, 0x025007da, 0x02537bb9, 0x01d7e2ec, 0x000fdb26}}}, + {X: Field{[10]uint32{0x0284f41a, 0x00310436, 0x03b2e125, 0x03d34919, 0x03c2d735, 0x032e0b90, 0x03329f0c, 0x02768d74, 0x019398fe, 0x00193273}}, Y: Field{[10]uint32{0x024372e9, 0x02544555, 0x0105ec8d, 0x01e3fd42, 0x01c223ef, 0x033b7c12, 0x0206fc6d, 0x0180cf44, 0x00ab71bf, 0x003492d4}}}, + {X: Field{[10]uint32{0x0129b766, 0x03f676f3, 0x02736ab4, 0x03533cc9, 0x00ecccfa, 0x009f6e58, 0x0359706b, 0x0161893d, 0x001d51e0, 0x003ff821}}, Y: Field{[10]uint32{0x01cf2562, 0x001d245e, 0x00a0177c, 0x0244c2cd, 0x03eb5d83, 0x01360193, 0x02c15952, 0x01b0413f, 0x01c9f695, 0x001af47c}}}, + {X: Field{[10]uint32{0x03ca7432, 0x034fe6dd, 0x020fa47f, 0x01873c3c, 0x034b4518, 0x03103479, 0x0138d630, 0x03165eeb, 0x00c0c053, 0x00034774}}, Y: Field{[10]uint32{0x0055976f, 0x0288ef5b, 0x0103280b, 0x02b77a4a, 0x035c9dc5, 0x02aabd9a, 0x03b5628d, 0x0257c0f9, 0x03fdb594, 0x000d2aa5}}}, + {X: Field{[10]uint32{0x028e5779, 0x03b2916b, 0x01d8df99, 0x00106c61, 0x019153f7, 0x03e65bc7, 0x0249cd3a, 0x035fde8f, 0x02e8c76b, 0x0021e90d}}, Y: Field{[10]uint32{0x011006f3, 0x02f9e5fc, 0x02027b6d, 0x03fdaa26, 0x00369ea4, 0x0287f0db, 0x0105d5b2, 0x00e113fe, 0x03f91255, 0x00234b3c}}}, + {X: Field{[10]uint32{0x0327c379, 0x03a7b2f7, 0x016e4b59, 0x0037354e, 0x00180107, 0x023f58bb, 0x00f707da, 0x031100e1, 0x00a74899, 0x00295140}}, Y: Field{[10]uint32{0x03cb2668, 0x00d15c8c, 0x02cae2f3, 0x00fc4768, 0x005315df, 0x00b249fe, 0x035b5e57, 0x02ec1817, 0x004a6d26, 0x00388591}}}, + {X: Field{[10]uint32{0x03d8187b, 0x02f54695, 0x00a9c88f, 0x01c821a4, 0x0328417b, 0x012358c8, 0x01aea85b, 0x0067d3e9, 0x00f799a3, 0x0024dfa9}}, Y: Field{[10]uint32{0x03dc9d9d, 0x03215533, 0x027bbb24, 0x036a9f4f, 0x00fce77b, 0x00510e2b, 0x01ce4afd, 0x02bb22df, 0x03fc9eb4, 0x000a4c69}}}, + {X: Field{[10]uint32{0x03fa6f36, 0x02c1766d, 0x03f07a1e, 0x018e3525, 0x02c70608, 0x02c13fc9, 0x00dbc96c, 0x012a8c81, 0x0076bb91, 0x00141e4f}}, Y: Field{[10]uint32{0x00bdab21, 0x00ff59c1, 0x03fbdeb1, 0x000daec7, 0x03d963b6, 0x0077a7bc, 0x00940df4, 0x001d8ada, 0x0078b5e3, 0x002beabf}}}, + {X: Field{[10]uint32{0x02d8bb5a, 0x025d9bc1, 0x01bf13a2, 0x02098755, 0x01f8da52, 0x02ff86b5, 0x011c5709, 0x03959373, 0x0230fada, 0x0022d801}}, Y: Field{[10]uint32{0x032916c0, 0x0108481a, 0x01f4dc11, 0x026e7080, 0x01788538, 0x0164dd30, 0x005a7c38, 0x010e6bb1, 0x024a3bd0, 0x003efc6d}}}, + {X: Field{[10]uint32{0x038c8458, 0x03cf40b9, 0x027bd635, 0x010c8ac5, 0x021fc616, 0x03ff062e, 0x03c96500, 0x0057b68d, 0x03dde32a, 0x00053a22}}, Y: Field{[10]uint32{0x036f02c9, 0x007bfa65, 0x009d735b, 0x004dd809, 0x035cc2cd, 0x01d6bf82, 0x02355be4, 0x003ea97e, 0x02c3dc24, 0x00020b07}}}, + {X: Field{[10]uint32{0x011c6c06, 0x00bf3d26, 0x00a30a91, 0x024bbf1c, 0x01975a3d, 0x031e2c72, 0x013dc028, 0x0211cb51, 0x00a324b6, 0x00308079}}, Y: Field{[10]uint32{0x00e2dc08, 0x01a7a73c, 0x00cee624, 0x02334e37, 0x02a82f5f, 0x031e1a84, 0x03f3e503, 0x039b423a, 0x015441d6, 0x000098ea}}}, + {X: Field{[10]uint32{0x019db4fb, 0x03443b82, 0x035a70c5, 0x00b9846c, 0x01409418, 0x0060a337, 0x0061b1e1, 0x022cfdc6, 0x025d319a, 0x001025d9}}, Y: Field{[10]uint32{0x027a506a, 0x02dc3540, 0x027a85dc, 0x0255415c, 0x03322a6b, 0x01bffb80, 0x02cd1ef5, 0x00ac7d5d, 0x00ebb1aa, 0x0032835f}}}, + {X: Field{[10]uint32{0x0027fa92, 0x03aad26d, 0x037a445d, 0x007cde94, 0x01371334, 0x02f814b6, 0x02021a04, 0x00a4fb74, 0x007aeff9, 0x0005cf4a}}, Y: Field{[10]uint32{0x02432548, 0x02691b05, 0x00e541fb, 0x00b34fe7, 0x0172e530, 0x015c9519, 0x03c37b58, 0x00621b09, 0x0204f03a, 0x002589b8}}}, + {X: Field{[10]uint32{0x014d4256, 0x0086911a, 0x039e78f1, 0x031a3c7c, 0x01227fb8, 0x0098a6fb, 0x014b03c9, 0x00453cc3, 0x034d001b, 0x003248f1}}, Y: Field{[10]uint32{0x035b3d29, 0x004d1016, 0x002731f4, 0x000f62b5, 0x00c9f918, 0x03c089e2, 0x00d1e08e, 0x004e0842, 0x026bdd5e, 0x00163b6f}}}, + {X: Field{[10]uint32{0x00b92d46, 0x0312adc3, 0x01a57c88, 0x02f9b2e4, 0x0393e5a8, 0x025b3cc7, 0x03104c51, 0x0170b4f7, 0x0106b1f2, 0x0024be9e}}, Y: Field{[10]uint32{0x0087f307, 0x0185d472, 0x0024079a, 0x017b3962, 0x00ae99a7, 0x02f34367, 0x0374db62, 0x007f07a3, 0x02bd7934, 0x00284858}}}, + {X: Field{[10]uint32{0x00639140, 0x02a8f102, 0x0294c691, 0x024412ba, 0x00976a9c, 0x034c3577, 0x008e17ee, 0x01e30aa7, 0x01f6f51f, 0x000dd1df}}, Y: Field{[10]uint32{0x00089872, 0x0357f0aa, 0x037305c2, 0x019bd419, 0x0325c3da, 0x0142c114, 0x006e15de, 0x0195b193, 0x02ed1955, 0x001a9a89}}}, + {X: Field{[10]uint32{0x010521bf, 0x03682637, 0x0359667a, 0x0090db17, 0x00be9bc7, 0x02fc03ec, 0x034e78ca, 0x03ce37e0, 0x02591195, 0x002d6cbb}}, Y: Field{[10]uint32{0x01ddd5e4, 0x01c1b885, 0x03e44314, 0x02c03f63, 0x00cc8bae, 0x0146afa4, 0x01d276d9, 0x00c0211b, 0x03859523, 0x00043cdb}}}, + {X: Field{[10]uint32{0x02a137bb, 0x0116c0f4, 0x03630948, 0x00d5dbb2, 0x02560393, 0x034c1fbc, 0x02415e90, 0x006ff8da, 0x01b8443f, 0x0002c174}}, Y: Field{[10]uint32{0x01066cbc, 0x01fc189f, 0x02f6465f, 0x01200f87, 0x0054098f, 0x03c358fe, 0x002a4156, 0x002cb0c4, 0x024bddc9, 0x00267fb3}}}, + {X: Field{[10]uint32{0x01d918fd, 0x01aba281, 0x03179de7, 0x0219b342, 0x03d69dcd, 0x025496d6, 0x03d703ae, 0x02cef73b, 0x01bd4778, 0x003975c4}}, Y: Field{[10]uint32{0x01b64248, 0x0070d71b, 0x01327542, 0x0092bce2, 0x009685d5, 0x03fbd5a4, 0x0088e218, 0x016ca683, 0x00ae5aa0, 0x0022bc05}}}, + {X: Field{[10]uint32{0x02fa4f30, 0x007de1a1, 0x03eb9f4f, 0x00471092, 0x001e217d, 0x0344de66, 0x031c6fc4, 0x0120beff, 0x02b8377a, 0x001dc0f2}}, Y: Field{[10]uint32{0x0084e8b3, 0x000d5c7a, 0x03f0a8e9, 0x03b5082b, 0x008dd329, 0x015a324b, 0x02247fd5, 0x02e36f1f, 0x01d13c80, 0x000cc8fb}}}, + {X: Field{[10]uint32{0x014f3cc8, 0x017d8985, 0x03085540, 0x00b3052c, 0x032c87da, 0x00a910d5, 0x02cf7225, 0x02d220d9, 0x0329c18b, 0x003e0d2b}}, Y: Field{[10]uint32{0x015ab248, 0x0007fb6f, 0x015c2820, 0x0311c5d8, 0x026bd8f7, 0x03f56f31, 0x027dc094, 0x01068a78, 0x02c0ca54, 0x000ba282}}}, + {X: Field{[10]uint32{0x03bbaee0, 0x01d0cd92, 0x03a794c7, 0x01f40740, 0x0213bbcd, 0x007614ab, 0x038ee845, 0x00f18076, 0x013d13f3, 0x001e0ec2}}, Y: Field{[10]uint32{0x00ae5b4b, 0x0326e09d, 0x001ab66e, 0x031c105c, 0x036b5fb1, 0x03b0b3be, 0x00dbfb20, 0x01aaffe8, 0x0301cfde, 0x000eaa42}}}, + {X: Field{[10]uint32{0x001c3391, 0x00b69678, 0x022666f9, 0x02087062, 0x033ae42e, 0x023bcb1d, 0x00a243b4, 0x002e6405, 0x0035a777, 0x002f8f31}}, Y: Field{[10]uint32{0x00e4a701, 0x02a49d97, 0x01c51e6a, 0x00149775, 0x00a560f7, 0x0187af16, 0x01fc64de, 0x02316056, 0x01360911, 0x003c34ef}}}, + {X: Field{[10]uint32{0x003b606d, 0x0024a15e, 0x02a08fc9, 0x001a115d, 0x0197f89e, 0x03fb86b8, 0x03624545, 0x0003bbf8, 0x03d7adac, 0x000fa602}}, Y: Field{[10]uint32{0x01c5c228, 0x00ccffba, 0x0088a34d, 0x00c14ff5, 0x0367455e, 0x03824451, 0x00734347, 0x0251b1d1, 0x0241204c, 0x003193c3}}}, + {X: Field{[10]uint32{0x0182b442, 0x02f3ecb5, 0x027c335b, 0x01517757, 0x0291d7b1, 0x025e435c, 0x0159bf12, 0x0079a8d2, 0x0140aa62, 0x0029ac10}}, Y: Field{[10]uint32{0x03cce830, 0x00705a6a, 0x0137f804, 0x0363b90b, 0x03a997f8, 0x010abdb9, 0x021d1515, 0x01765d79, 0x01e29cc0, 0x00272cb2}}}, + {X: Field{[10]uint32{0x03fa721b, 0x02038a91, 0x002e51f2, 0x00b4888e, 0x0229ba43, 0x00a6cb0e, 0x009a6a1b, 0x032e3e84, 0x003fc133, 0x001fa9ea}}, Y: Field{[10]uint32{0x0299d7e8, 0x01f763a9, 0x031b45bb, 0x01d78e15, 0x026aabab, 0x03450c29, 0x01c5562a, 0x01dcc60c, 0x00e88a1f, 0x0032f8e1}}}, + {X: Field{[10]uint32{0x010fa042, 0x00ab2982, 0x026c8d84, 0x03b851aa, 0x008189f9, 0x0052e9b5, 0x002b5fca, 0x027af8be, 0x007ef0fc, 0x0021497a}}, Y: Field{[10]uint32{0x0332c86f, 0x01c39d5a, 0x022a686c, 0x0391f7f8, 0x00192873, 0x028d295c, 0x02a393f2, 0x028f3c60, 0x0278f311, 0x00373c1a}}}, + {X: Field{[10]uint32{0x03d56dce, 0x029ed06e, 0x00fc0952, 0x03cdb341, 0x0316daff, 0x0197fa59, 0x0129c337, 0x0034327b, 0x037dfa05, 0x001d5569}}, Y: Field{[10]uint32{0x03152177, 0x035bc7c5, 0x019cfd0b, 0x024a0c1a, 0x0118dc03, 0x002bcc44, 0x03d0a3cd, 0x03707f62, 0x00a7bdc3, 0x00261530}}}, + {X: Field{[10]uint32{0x02ac296b, 0x03b85f66, 0x02f710be, 0x02eefb98, 0x00972bb3, 0x00cf8031, 0x026f0261, 0x036b0453, 0x02a07a0a, 0x0027b450}}, Y: Field{[10]uint32{0x037a9d08, 0x0142880a, 0x03f6a391, 0x02144709, 0x009f4dca, 0x01a66bd4, 0x00d4006f, 0x038ee349, 0x02416c80, 0x00307aba}}}, + {X: Field{[10]uint32{0x03c56b79, 0x00ec6a37, 0x029d5fb1, 0x0310b805, 0x00c9d761, 0x00463f60, 0x02aa67c8, 0x02333424, 0x00b3784d, 0x0028ff4b}}, Y: Field{[10]uint32{0x007ea755, 0x02ff56fe, 0x01f6d659, 0x03c9e827, 0x02b0d13d, 0x03243562, 0x00fcdd48, 0x0157cb54, 0x034155db, 0x001d7366}}}, + {X: Field{[10]uint32{0x005ad251, 0x014880d8, 0x0142fc99, 0x038a2edb, 0x01554338, 0x02703884, 0x01ad598b, 0x01fba1e6, 0x0205217e, 0x000aad2f}}, Y: Field{[10]uint32{0x0076d853, 0x03d78c55, 0x01dc7bd8, 0x0320f231, 0x03b788af, 0x00f8791e, 0x008c8eb8, 0x01b529ff, 0x0258da06, 0x000b0a86}}}, + {X: Field{[10]uint32{0x0248c383, 0x02959ee1, 0x033592ce, 0x002767e3, 0x0308c95d, 0x019bb33a, 0x02268af5, 0x006ababd, 0x0088af8c, 0x0012bf0a}}, Y: Field{[10]uint32{0x004f5eed, 0x0164cdaa, 0x0005458b, 0x012f8778, 0x03cf3f28, 0x03a671fa, 0x01025797, 0x03a4ba62, 0x03825e69, 0x002c789a}}}, + {X: Field{[10]uint32{0x018e3d4a, 0x00086d4b, 0x0188b548, 0x03236bf6, 0x02f63f5f, 0x02b070ac, 0x0038600a, 0x0274b920, 0x03aa9231, 0x00376003}}, Y: Field{[10]uint32{0x0039ed7d, 0x006a5dc4, 0x0260ce8e, 0x024853fb, 0x028fdbc1, 0x006206f1, 0x02522ac9, 0x01a35d83, 0x00926e04, 0x00167fa0}}}, + {X: Field{[10]uint32{0x02378c91, 0x029d3cf1, 0x017e2af5, 0x0209b7e7, 0x0007bb51, 0x02bec1fe, 0x039bc886, 0x0297e226, 0x03d1daa3, 0x00212abc}}, Y: Field{[10]uint32{0x0035afbb, 0x030a920e, 0x030e8011, 0x021add13, 0x03a04fd5, 0x0333825a, 0x0331218e, 0x0375be98, 0x02b845ea, 0x003d0592}}}, + {X: Field{[10]uint32{0x03c40b2b, 0x02b4ea09, 0x02fcc8ad, 0x0202e233, 0x00d2ffc1, 0x037feda4, 0x02823a3a, 0x0276e2a4, 0x02c39e2e, 0x002ddc3c}}, Y: Field{[10]uint32{0x000d53e6, 0x01667a37, 0x0122e79f, 0x025f29b3, 0x037e319c, 0x01ba9593, 0x01b90a91, 0x01260974, 0x02370989, 0x0003df1b}}}, + {X: Field{[10]uint32{0x02bb2b29, 0x00879fae, 0x0336236a, 0x021c924f, 0x017cb1db, 0x02c41f32, 0x0145c5fb, 0x039559c0, 0x00a8a0d7, 0x00298182}}, Y: Field{[10]uint32{0x0354de5f, 0x009715de, 0x00e1906f, 0x007ed603, 0x01a289c9, 0x03528e06, 0x0006f906, 0x01152259, 0x027c4e41, 0x000d08d4}}}, + {X: Field{[10]uint32{0x03414597, 0x02d926d4, 0x032d921e, 0x03dff2af, 0x0320f6b0, 0x0324469c, 0x02b4e5fc, 0x00e4e979, 0x00f97b7f, 0x00203d1c}}, Y: Field{[10]uint32{0x03d9adc3, 0x033a7c4a, 0x03e4afa1, 0x01392d6d, 0x03770fa1, 0x004f0fce, 0x028faea0, 0x02f8304c, 0x02f96e1b, 0x0015f63c}}}, + {X: Field{[10]uint32{0x015abb6f, 0x032ccea6, 0x017fe261, 0x036c7c0e, 0x0072e4a3, 0x01929ed6, 0x03f0096c, 0x012330ff, 0x03f21f52, 0x00138446}}, Y: Field{[10]uint32{0x02eb2b9f, 0x02b2eda5, 0x02b0f6d5, 0x0050c7ea, 0x00c03af6, 0x0182f64c, 0x01829c1d, 0x00cefd7f, 0x01721027, 0x0009273c}}}, + {X: Field{[10]uint32{0x022844c9, 0x005b1a31, 0x034f0184, 0x0037ce05, 0x00960cb7, 0x0083a17b, 0x0254660a, 0x00763040, 0x00b547fa, 0x001f6303}}, Y: Field{[10]uint32{0x0335a271, 0x00015c57, 0x00743404, 0x02b87daf, 0x0372b0f1, 0x00d633f4, 0x017335bf, 0x0135e685, 0x023c17ec, 0x000b5e6e}}}, + {X: Field{[10]uint32{0x030a0034, 0x00aabe59, 0x013aaf61, 0x02e26d65, 0x0014b132, 0x016a7cbc, 0x023d48fa, 0x01be95fc, 0x00bd9589, 0x002f0353}}, Y: Field{[10]uint32{0x03a0639d, 0x0283d20b, 0x01412480, 0x00fca3a9, 0x0383d756, 0x015dcef2, 0x02410915, 0x019605e9, 0x02707b31, 0x003d7419}}}, + {X: Field{[10]uint32{0x02d37a40, 0x039c3ead, 0x006a42df, 0x029a9f99, 0x015cceb0, 0x024c8785, 0x02ddbe1c, 0x03445657, 0x02aead08, 0x002c5528}}, Y: Field{[10]uint32{0x0216592a, 0x01794fcc, 0x00756c8b, 0x0234278f, 0x0217120d, 0x0257225b, 0x01e586f6, 0x0344af40, 0x0221674d, 0x0026aeb7}}}, + {X: Field{[10]uint32{0x0372e1e4, 0x01729615, 0x03325531, 0x0159f91d, 0x02314be7, 0x0107f8b9, 0x013bc318, 0x001bc9c1, 0x0034a6ce, 0x003bd80f}}, Y: Field{[10]uint32{0x009ad65d, 0x02b965f1, 0x00f5164a, 0x023cef42, 0x0115fced, 0x0206688c, 0x03a7e57d, 0x02c2e648, 0x022896f3, 0x003e7aef}}}, + {X: Field{[10]uint32{0x02aa9376, 0x0388ffa0, 0x016e2c04, 0x03686b12, 0x01014f7b, 0x02b70010, 0x01a05d91, 0x007aeeb5, 0x036c2d90, 0x00298045}}, Y: Field{[10]uint32{0x02e88ab8, 0x0228c0c6, 0x01e68f8c, 0x03e74fab, 0x03d59abc, 0x03a450dd, 0x032fb849, 0x00d924dd, 0x01b7ce0c, 0x003de077}}}, + {X: Field{[10]uint32{0x0031e6a7, 0x00c54e57, 0x007eb273, 0x03bcea40, 0x03b1c7f0, 0x0326a409, 0x03968b9b, 0x00413bea, 0x0147b6b3, 0x002af105}}, Y: Field{[10]uint32{0x017e0ec9, 0x02e28df6, 0x00dce879, 0x034d498a, 0x03594c5b, 0x035e0e66, 0x00a1821d, 0x0075bef6, 0x00a228f2, 0x00334a16}}}, + {X: Field{[10]uint32{0x007f5a81, 0x038e85f6, 0x008a92f2, 0x029b4c6d, 0x02941d1d, 0x009b904e, 0x024c4300, 0x031c86cb, 0x010500c9, 0x0024a240}}, Y: Field{[10]uint32{0x0260a5da, 0x025fca36, 0x03e2bb30, 0x02669f2f, 0x0015c223, 0x004ed1f1, 0x0032e17c, 0x03185c79, 0x007b1bdc, 0x003072b6}}}, + {X: Field{[10]uint32{0x037ca563, 0x01129f70, 0x00228ad1, 0x0201af59, 0x00500a7a, 0x0251da43, 0x02468319, 0x00d7291a, 0x02a69f4b, 0x00394837}}, Y: Field{[10]uint32{0x022a82de, 0x02c34f22, 0x03356638, 0x002b6d9c, 0x01e2330b, 0x02b538b6, 0x0355dda6, 0x023efa40, 0x0366ac3f, 0x001b0035}}}, + {X: Field{[10]uint32{0x017fadc4, 0x00b5c071, 0x03fb3750, 0x005463c3, 0x02ac2e93, 0x035bbc97, 0x03d18a79, 0x03c70695, 0x0223e2b3, 0x00300cde}}, Y: Field{[10]uint32{0x00808b65, 0x00851bd4, 0x021eccdd, 0x00e3db81, 0x017ac7e9, 0x001e95c3, 0x029c3d5b, 0x037cd51c, 0x0073be22, 0x003f3a96}}}, + {X: Field{[10]uint32{0x0181ac04, 0x0049e6ca, 0x0193cfa5, 0x02583d4d, 0x001b796a, 0x00b47589, 0x01fb6a76, 0x00b01dad, 0x02bb6a8e, 0x0009db18}}, Y: Field{[10]uint32{0x021afc1a, 0x00ba85db, 0x0292b73e, 0x01e0223d, 0x00773c45, 0x01a588db, 0x01284d7d, 0x000748fe, 0x025abb6b, 0x001714e9}}}, + {X: Field{[10]uint32{0x01663a5f, 0x00776fa3, 0x01ed4fad, 0x01bd9ea7, 0x00c4a2de, 0x00f23b79, 0x037ccdd4, 0x00770ae0, 0x0287e505, 0x00181387}}, Y: Field{[10]uint32{0x03429bee, 0x001ac9e2, 0x0034902d, 0x01ce670d, 0x02ace4c4, 0x01113618, 0x014d6759, 0x0065ce4f, 0x023ce351, 0x003dc3f8}}}, + {X: Field{[10]uint32{0x0041f6fa, 0x038e21d7, 0x00eec3b6, 0x02bbdf93, 0x024aba16, 0x03a40e6e, 0x00b05be5, 0x02441b56, 0x011f470d, 0x003cbf05}}, Y: Field{[10]uint32{0x01e98de0, 0x02a485b8, 0x037b85d2, 0x01ce705a, 0x00d41887, 0x001da418, 0x027f2d6e, 0x01718f63, 0x02c7f1aa, 0x003d26f4}}}, + {X: Field{[10]uint32{0x000ac560, 0x0240b84d, 0x00315eb0, 0x025359ac, 0x007ee0b2, 0x0391babe, 0x001d9cd7, 0x00d3bcee, 0x03460e9f, 0x002380c4}}, Y: Field{[10]uint32{0x00394296, 0x00517e4b, 0x00dca450, 0x023003b0, 0x02006b02, 0x03b81413, 0x027441c0, 0x00787944, 0x00bda5e2, 0x003fc032}}}, + {X: Field{[10]uint32{0x01a9970b, 0x027d03f9, 0x01a0a96b, 0x02cea174, 0x03d4e26e, 0x02ca553a, 0x021cbe16, 0x01ea3c9e, 0x031ad75b, 0x002a1a03}}, Y: Field{[10]uint32{0x02070c01, 0x0065cef9, 0x024c6950, 0x02fb10a5, 0x02757401, 0x00fd4a25, 0x03281f2a, 0x036b18e5, 0x0341a55b, 0x001831af}}}, + {X: Field{[10]uint32{0x004f4658, 0x039b1bd4, 0x03066128, 0x00035372, 0x0009ca8c, 0x002171e5, 0x03407c05, 0x00ba8780, 0x01e7f4d8, 0x00135a28}}, Y: Field{[10]uint32{0x03d1ce76, 0x009979e8, 0x02af4d36, 0x0028e99c, 0x0126a955, 0x030db75b, 0x0295d2d2, 0x00da44aa, 0x0211e5dd, 0x00217177}}}, + {X: Field{[10]uint32{0x02c2a7a9, 0x02882bb9, 0x024835c6, 0x0306b9e2, 0x01758c0b, 0x0340bace, 0x003cdc1b, 0x021925a6, 0x001c2a6d, 0x000dc23d}}, Y: Field{[10]uint32{0x03ec4152, 0x014febea, 0x039e7f45, 0x01171c2b, 0x023c2b71, 0x02aac64f, 0x01ae0f87, 0x03d77572, 0x019e79b7, 0x000c42de}}}, + {X: Field{[10]uint32{0x0115f059, 0x038de028, 0x01a92f6c, 0x0334eaec, 0x022d1a18, 0x00fd6dcc, 0x03961814, 0x02317fc6, 0x01674502, 0x0023220e}}, Y: Field{[10]uint32{0x020725d8, 0x0229f9d8, 0x00e10b00, 0x01097237, 0x0040128e, 0x019b761f, 0x03441800, 0x01212830, 0x02d4e4ae, 0x0009158e}}}, + {X: Field{[10]uint32{0x018f8fb0, 0x0387fd35, 0x0305d0a0, 0x03098d08, 0x03652e83, 0x0129c98e, 0x010fd1a9, 0x01eb4ef7, 0x036a7b37, 0x00311179}}, Y: Field{[10]uint32{0x03acc89d, 0x033a9872, 0x01b8cc94, 0x039c8c19, 0x02f60ae2, 0x02ab9f71, 0x03bd3c13, 0x036d84eb, 0x001adc8d, 0x0012fd69}}}, + {X: Field{[10]uint32{0x02419f16, 0x03d976a3, 0x02e8deb2, 0x017bb6ab, 0x0236949d, 0x0292e7f5, 0x019f1d4d, 0x00d7f983, 0x013ac8a6, 0x0012b658}}, Y: Field{[10]uint32{0x00b0d7c4, 0x02d2545a, 0x0331642a, 0x01ded2c1, 0x01387458, 0x03c6a06e, 0x0131c83e, 0x0283eceb, 0x03068f67, 0x0016a6d6}}}, + {X: Field{[10]uint32{0x0360c943, 0x0074a7f5, 0x00b0c20d, 0x02f163a4, 0x022e397f, 0x0122a998, 0x0349d776, 0x03f9b26a, 0x02e1958b, 0x002facfa}}, Y: Field{[10]uint32{0x0382c9b8, 0x03bfe200, 0x02678dba, 0x01edaa08, 0x03ec76f2, 0x02a9a36b, 0x01dc6fb5, 0x019eac89, 0x02bef43a, 0x00035691}}}, + {X: Field{[10]uint32{0x0134f397, 0x026867f4, 0x018ab9df, 0x0050f900, 0x034623fc, 0x035281da, 0x03f1daea, 0x0086cef8, 0x02b0bc0e, 0x002aaa6a}}, Y: Field{[10]uint32{0x0342e40b, 0x01c0ee89, 0x0390ed3c, 0x03e2ead9, 0x02d3f094, 0x03e8b6b4, 0x000347e8, 0x00b1969b, 0x03fe1964, 0x000271f5}}}, + {X: Field{[10]uint32{0x0199dc52, 0x035a956b, 0x01356604, 0x01867f57, 0x00d40116, 0x0073e749, 0x017ae86f, 0x03d118bf, 0x028999d6, 0x00154f07}}, Y: Field{[10]uint32{0x0150cebc, 0x002f5bfd, 0x004ed646, 0x0250de4d, 0x013f6fe4, 0x01f17c37, 0x02ba776f, 0x02b169b4, 0x013b8410, 0x0009ad03}}}, + {X: Field{[10]uint32{0x02a1abc8, 0x03afe096, 0x0128ab47, 0x0025567b, 0x00c3d565, 0x01c97581, 0x00dae9c4, 0x023f10e6, 0x01ea3637, 0x00216621}}, Y: Field{[10]uint32{0x000687f5, 0x00c7f3fc, 0x030669e5, 0x02a8f102, 0x020e6e84, 0x02cb458d, 0x02fd9305, 0x02e58eec, 0x02f9fc74, 0x003eb96b}}}, + {X: Field{[10]uint32{0x00368f93, 0x01ef7bbc, 0x0254b0bb, 0x00ca9c31, 0x0189e510, 0x00ee08d1, 0x00bf7c16, 0x01752155, 0x0118679c, 0x0017ec28}}, Y: Field{[10]uint32{0x03c2a2d0, 0x03c6099a, 0x00c70a4c, 0x02b4e765, 0x005b9966, 0x02e5761a, 0x0302111e, 0x005b4efe, 0x01f04a68, 0x0003a355}}}, + {X: Field{[10]uint32{0x00f91dfa, 0x02fa0be5, 0x00302194, 0x0175df39, 0x02bbed44, 0x039c376b, 0x03d737c1, 0x03854f26, 0x034786f3, 0x00029090}}, Y: Field{[10]uint32{0x03beed46, 0x00595239, 0x02496971, 0x02963b04, 0x01a54239, 0x0096da7f, 0x0012f4df, 0x03f6a704, 0x02d6abd9, 0x0009f472}}}, + {X: Field{[10]uint32{0x00c821e7, 0x006e4868, 0x003eef57, 0x0115cac2, 0x00394659, 0x01ca4c43, 0x028213cc, 0x0307ce82, 0x0108063f, 0x0017401d}}, Y: Field{[10]uint32{0x02b2df3a, 0x00744aff, 0x007f939f, 0x0205ac10, 0x02d99bfa, 0x0048e121, 0x00c26056, 0x01681ecb, 0x03c45d05, 0x00394e3e}}}, + {X: Field{[10]uint32{0x002e3db9, 0x00bd7a0a, 0x02a525f8, 0x02a9c737, 0x01e80393, 0x012aadfe, 0x00605a0e, 0x000a1a4d, 0x01b897b1, 0x0028fac9}}, Y: Field{[10]uint32{0x01e7f77d, 0x00f60fdc, 0x00c6f030, 0x022f9a24, 0x036beec5, 0x00a259f1, 0x036baaf1, 0x03117908, 0x00c21430, 0x0038acd5}}}, + {X: Field{[10]uint32{0x0097981b, 0x00b8273a, 0x01f0fff7, 0x01453a8d, 0x021e309e, 0x0043f205, 0x033f51cd, 0x00c80a5b, 0x02208a13, 0x001cfd8c}}, Y: Field{[10]uint32{0x02420179, 0x03b41cc2, 0x01dc4015, 0x01ea286d, 0x02309525, 0x00d26a4b, 0x01f7ded0, 0x03ccbb5b, 0x0159cc78, 0x0010d04a}}}, + {X: Field{[10]uint32{0x00da41af, 0x03b139d2, 0x01bb4ccf, 0x00b7c6ee, 0x00776051, 0x01811992, 0x00d9628f, 0x02d7ce3c, 0x01d1c21b, 0x0017c209}}, Y: Field{[10]uint32{0x025c0cab, 0x0108e7ff, 0x02323b37, 0x02e30925, 0x005becd4, 0x01964a09, 0x031abd5b, 0x03784a13, 0x020e1d95, 0x0037aeb1}}}, + {X: Field{[10]uint32{0x03d84294, 0x00967fbd, 0x0276da10, 0x03ff19a9, 0x02efc26d, 0x03448a53, 0x023f624c, 0x03a7cbeb, 0x02f2b4a8, 0x003310a9}}, Y: Field{[10]uint32{0x03230519, 0x0383850e, 0x016901ba, 0x0385a804, 0x03118a7a, 0x02d7ec5f, 0x03f2adb2, 0x02f417c4, 0x0200f92c, 0x00246c99}}}, + {X: Field{[10]uint32{0x03635a17, 0x0000bb1b, 0x022618f0, 0x035af44d, 0x034de0c5, 0x03bef347, 0x01aad7a8, 0x0384fea0, 0x00e76eeb, 0x001f55b8}}, Y: Field{[10]uint32{0x03fa1ad8, 0x004eb090, 0x01754f7d, 0x03b156a4, 0x00051122, 0x03a9779f, 0x01ca813e, 0x038fb91b, 0x0307fe55, 0x00255189}}}, + {X: Field{[10]uint32{0x03a5be61, 0x015301bd, 0x00dc6add, 0x03f0f1d9, 0x02fba8ca, 0x02b6d5ad, 0x03605b3a, 0x017b12b2, 0x021b4fe8, 0x001e5cad}}, Y: Field{[10]uint32{0x02b8c7d8, 0x0249b24c, 0x037dd9f4, 0x03397516, 0x024764c4, 0x011aa3a4, 0x00f5141c, 0x03e9ba9f, 0x02702642, 0x002e8619}}}, + {X: Field{[10]uint32{0x01025626, 0x00208d75, 0x02e0bbbe, 0x01fcd87e, 0x034344c8, 0x019d3e43, 0x01f63609, 0x00540226, 0x0040347b, 0x003b7229}}, Y: Field{[10]uint32{0x032cd77b, 0x007b3106, 0x024864d0, 0x008a6947, 0x027bf841, 0x034502cb, 0x00c7cefa, 0x02fd666f, 0x03409a14, 0x000be049}}}, + {X: Field{[10]uint32{0x01b16899, 0x021df34f, 0x00d18d54, 0x02fc9558, 0x02d4ea1b, 0x027e6661, 0x0327b571, 0x03d354bd, 0x01c97a8c, 0x002f66d9}}, Y: Field{[10]uint32{0x02fe432d, 0x02638af0, 0x019af7db, 0x00fd77fa, 0x01ee9c8e, 0x02f93e18, 0x00d9e02d, 0x023972fc, 0x01274e87, 0x001673dc}}}, + {X: Field{[10]uint32{0x00f35782, 0x038ab313, 0x02106f3b, 0x00096542, 0x0072d918, 0x01317636, 0x03565714, 0x03a3334d, 0x02381191, 0x0009d8d7}}, Y: Field{[10]uint32{0x00d1ab7d, 0x0264bdc3, 0x00ce9db1, 0x03cdf9ae, 0x00eb5251, 0x03d46eb5, 0x03fa3ab8, 0x021c3401, 0x0247a019, 0x0030d67f}}}, + {X: Field{[10]uint32{0x0321d85c, 0x0377c84e, 0x03261839, 0x03d2577e, 0x00359950, 0x01e803a6, 0x02abad14, 0x014c02a5, 0x00c316c0, 0x001124b7}}, Y: Field{[10]uint32{0x009ad35b, 0x00d3b5f7, 0x02433189, 0x02fe9630, 0x02fafed4, 0x008a7716, 0x03b8c6d2, 0x00790b6f, 0x0371a4e8, 0x0003b7c4}}}, + {X: Field{[10]uint32{0x01f9c67b, 0x02a981bb, 0x03c01279, 0x031b3b8d, 0x0325887f, 0x02f623e3, 0x028a3869, 0x00079637, 0x0040409e, 0x003e0493}}, Y: Field{[10]uint32{0x026fa6bc, 0x01830868, 0x009d3655, 0x0231879d, 0x022b0f00, 0x035fcd98, 0x026269c3, 0x03b82a28, 0x01d1d31f, 0x0003801c}}}, + {X: Field{[10]uint32{0x0205a2b5, 0x0212f0e6, 0x030b1b57, 0x00ce3d57, 0x02ce3aed, 0x03579470, 0x000716ad, 0x03337e8b, 0x0367066e, 0x0033165e}}, Y: Field{[10]uint32{0x00682865, 0x00e9061d, 0x022da74e, 0x039fcfbc, 0x03df52da, 0x00a3a356, 0x0212ec40, 0x010f6747, 0x01fc394a, 0x0004b80c}}}, + {X: Field{[10]uint32{0x005aeda2, 0x034c78a0, 0x022ee6fd, 0x01c698c8, 0x03d4a45f, 0x03549774, 0x01642707, 0x020fef48, 0x02c6bc12, 0x00050b2c}}, Y: Field{[10]uint32{0x02d66ec0, 0x017b7197, 0x02f2e181, 0x03edf1a1, 0x00ed082b, 0x02fb1916, 0x015b7180, 0x0108ab93, 0x0112c72c, 0x002f7a4f}}}, + {X: Field{[10]uint32{0x001d2d3c, 0x03645230, 0x0147968f, 0x01d78fc3, 0x01c33273, 0x02a25dea, 0x016704a1, 0x0165079a, 0x0202dd76, 0x003efd35}}, Y: Field{[10]uint32{0x006afa8d, 0x03c4e5b0, 0x0118d08e, 0x02ca6bdf, 0x00c7b96f, 0x01a3d858, 0x014cae8e, 0x02572e9b, 0x01f799e8, 0x00196d1b}}}, + {X: Field{[10]uint32{0x01bfffb8, 0x0048f863, 0x02bc7c6d, 0x036f3163, 0x01f09436, 0x03053143, 0x0300ea5e, 0x03a3338c, 0x0157bb5f, 0x003bf6d7}}, Y: Field{[10]uint32{0x0203fe01, 0x01ee2900, 0x00deb813, 0x01fb7758, 0x01d444e4, 0x019ef627, 0x019ce931, 0x00318988, 0x0003d9a9, 0x000e420e}}}, + {X: Field{[10]uint32{0x003f35ad, 0x0241d08b, 0x03d74976, 0x03c7ab7a, 0x02921f59, 0x01afcb53, 0x00b36c7b, 0x00155c2d, 0x0334faa3, 0x0016f290}}, Y: Field{[10]uint32{0x021206e3, 0x03489ef0, 0x0345b520, 0x00a8d4fe, 0x0179d27f, 0x03591b6d, 0x03f2fe1c, 0x018fdc8a, 0x02f5e2a6, 0x000f25ee}}}, + {X: Field{[10]uint32{0x01156632, 0x03c7cfd4, 0x00d4c49f, 0x025c69cf, 0x01ff921e, 0x012a9990, 0x018a0f05, 0x03c1956b, 0x03bce90c, 0x0026a876}}, Y: Field{[10]uint32{0x031a4200, 0x00efd00a, 0x012dc651, 0x01eae404, 0x016e0b33, 0x02730449, 0x002f0f0b, 0x03a176e0, 0x001d8bf1, 0x0032fdba}}}, + {X: Field{[10]uint32{0x03c2d408, 0x02a5589c, 0x01b86aba, 0x01bfbfc2, 0x035386e5, 0x037b0a09, 0x01d4d23d, 0x01d9d935, 0x005586ed, 0x000bf1ff}}, Y: Field{[10]uint32{0x01d6285f, 0x0272041a, 0x03f3f54f, 0x01617531, 0x016019a5, 0x000c42d7, 0x037b0c3e, 0x00d2bb91, 0x01e4773c, 0x0016ffda}}}, + {X: Field{[10]uint32{0x034190b2, 0x03332ef4, 0x03f34764, 0x00403cbf, 0x026ef3b2, 0x0037e445, 0x01954878, 0x01bcb10c, 0x0141c3ac, 0x002397ee}}, Y: Field{[10]uint32{0x0110d2ce, 0x026ebaff, 0x02c4b1df, 0x027b73c6, 0x038d29b5, 0x039eccbe, 0x03ae154c, 0x01a38b18, 0x01b15f66, 0x0036f8b0}}}, + {X: Field{[10]uint32{0x033d49c6, 0x006f5842, 0x03690480, 0x001c99a4, 0x02dcfbaa, 0x02a56e36, 0x013389ea, 0x035b7417, 0x03594748, 0x001e96ee}}, Y: Field{[10]uint32{0x034187c0, 0x03b7ab18, 0x03fa7fd4, 0x0073bff8, 0x00ca1386, 0x0048d71a, 0x00b755c6, 0x00cffa36, 0x0043a42d, 0x0030b4a0}}}, + {X: Field{[10]uint32{0x03b76753, 0x03ebc86f, 0x00745f87, 0x0388894d, 0x00917c2f, 0x02d8c738, 0x033ee1b1, 0x00d4c6b9, 0x00bdf0d3, 0x00256fae}}, Y: Field{[10]uint32{0x0064f45b, 0x030bc2c3, 0x00adaa43, 0x020df88c, 0x03b9bd77, 0x01283932, 0x03e269fb, 0x0165d549, 0x0200d9c5, 0x0031b3e1}}}, + {X: Field{[10]uint32{0x02968d25, 0x003488f8, 0x03a32054, 0x0365dae3, 0x03576dbb, 0x002ae5e4, 0x00fa4809, 0x01b700c1, 0x030c6d89, 0x003d13b2}}, Y: Field{[10]uint32{0x0321086a, 0x027cd4f0, 0x038106d1, 0x003d79db, 0x01e20e47, 0x03a91a82, 0x0203c629, 0x010ca5da, 0x00f62964, 0x00151419}}}, + {X: Field{[10]uint32{0x038109de, 0x01274994, 0x01e074fb, 0x0309dc18, 0x01d56d68, 0x03deb899, 0x033ef501, 0x024db985, 0x00d33dbd, 0x002374cb}}, Y: Field{[10]uint32{0x003f1e76, 0x0217dc1f, 0x00851ae9, 0x00968430, 0x00ad158c, 0x011f5b64, 0x012bca8a, 0x02b0814e, 0x025c80da, 0x001ac443}}}, + {X: Field{[10]uint32{0x0237997b, 0x01d77698, 0x01a8c770, 0x00fe2473, 0x010fea5e, 0x01c74113, 0x03bc77eb, 0x03d5e353, 0x0130b0f0, 0x000f52bf}}, Y: Field{[10]uint32{0x018bb9ce, 0x02c7bf01, 0x0093ed83, 0x02af9d21, 0x020ae286, 0x02708eb6, 0x013d4424, 0x03d5fb1e, 0x00e8664d, 0x000a05b8}}}, + {X: Field{[10]uint32{0x01d95ff1, 0x03ff45e1, 0x020200a5, 0x0204b4af, 0x02b83913, 0x01a81ee8, 0x015ccac8, 0x00ec8aca, 0x01fbbeaa, 0x002a6dce}}, Y: Field{[10]uint32{0x03b84f1b, 0x016cabaf, 0x02d401a5, 0x00ae3b5e, 0x00d3c5d4, 0x0310ff7b, 0x016d7323, 0x029abbda, 0x023021d6, 0x00287420}}}, + {X: Field{[10]uint32{0x0203715a, 0x01fd1ae4, 0x03632bb7, 0x019eb3e6, 0x02a37e5d, 0x022d5659, 0x02cc754c, 0x0147aff0, 0x0347e512, 0x003a4025}}, Y: Field{[10]uint32{0x02f9df72, 0x036ad3f3, 0x03907d9c, 0x01e85f38, 0x00756f27, 0x015c6962, 0x03476f25, 0x03e65dc6, 0x01679ea8, 0x000d0962}}}, + {X: Field{[10]uint32{0x021a3f2e, 0x01d90e7c, 0x006c1a83, 0x0104eb13, 0x002108fe, 0x02ccc821, 0x00d09b96, 0x035d3309, 0x00ed55aa, 0x001f8d23}}, Y: Field{[10]uint32{0x00389e5f, 0x033e0fad, 0x020f91ed, 0x00bcd964, 0x01c884c2, 0x010e793d, 0x0065706e, 0x009e5761, 0x038e3b72, 0x000e61d3}}}, + {X: Field{[10]uint32{0x03b1f55a, 0x029d29be, 0x01220aaa, 0x02da2834, 0x038e340f, 0x003f3034, 0x032cdabf, 0x035c055b, 0x02765ec2, 0x0029f759}}, Y: Field{[10]uint32{0x0341d447, 0x029439cb, 0x00e73760, 0x02b5117a, 0x0163710d, 0x02c02efa, 0x02ded9b0, 0x0298f4a4, 0x03f2ab00, 0x002dc246}}}, + {X: Field{[10]uint32{0x03f57025, 0x02354780, 0x03a96a30, 0x00a91a4f, 0x0051c085, 0x01b624d3, 0x0033a481, 0x032fdb70, 0x01e9a8cc, 0x0002e15e}}, Y: Field{[10]uint32{0x0158268b, 0x0337315c, 0x00feca8b, 0x00cdbda5, 0x0242c888, 0x02f046f6, 0x0164a3e0, 0x00546cbc, 0x00df4d79, 0x0039a5bb}}}, + {X: Field{[10]uint32{0x03f57af8, 0x00b0b0af, 0x03cdabb4, 0x007519e1, 0x03184f1c, 0x01ed669f, 0x00c8c72e, 0x002032fe, 0x00459de0, 0x0001eca7}}, Y: Field{[10]uint32{0x03801799, 0x011b7a57, 0x026145dc, 0x02dc97d3, 0x02817578, 0x000ddbb7, 0x0101ca56, 0x0344f506, 0x0367a6d8, 0x001037a0}}}, + {X: Field{[10]uint32{0x02f00f9f, 0x026bf765, 0x0214e017, 0x0276cc7f, 0x030d1c4e, 0x002df940, 0x020e34ef, 0x016f9eb0, 0x026f89b6, 0x00073bfe}}, Y: Field{[10]uint32{0x0276f179, 0x01d12d46, 0x02da979a, 0x03d6f2a9, 0x008e293b, 0x005e4384, 0x018feb78, 0x00c2f7b6, 0x00b1f059, 0x001bf7ba}}}, + {X: Field{[10]uint32{0x01e58d74, 0x0365f645, 0x01e47ca2, 0x03fa8013, 0x0280ba4e, 0x00078bb1, 0x01d01e9a, 0x000715b5, 0x016d11d3, 0x00155b8b}}, Y: Field{[10]uint32{0x0249d711, 0x00b175d4, 0x0096108a, 0x031cbd36, 0x013d66e6, 0x03bb2f26, 0x01ba7eef, 0x035edad5, 0x009bb633, 0x0025620d}}}, + {X: Field{[10]uint32{0x01e51586, 0x02ae45e8, 0x026ba6a7, 0x03d3a7b9, 0x02b97f7b, 0x00ad8ba8, 0x004518a4, 0x00f723b4, 0x028873b9, 0x002cd41b}}, Y: Field{[10]uint32{0x030b3b38, 0x00eb9306, 0x023fd582, 0x027c7e3f, 0x025917a3, 0x02b2ea7f, 0x0293eaa7, 0x03edeff9, 0x01001230, 0x0011d3e0}}}, + {X: Field{[10]uint32{0x012628f3, 0x01d2e5af, 0x00504e97, 0x00e86665, 0x001ba7ff, 0x0243b99f, 0x001a886f, 0x0124236c, 0x02f389cb, 0x0003461a}}, Y: Field{[10]uint32{0x02a2db7d, 0x023dfbbc, 0x0021d5d0, 0x01bfd046, 0x02d01d74, 0x0218bbcd, 0x0378c75a, 0x01f372d1, 0x002bc656, 0x000ece5e}}}, + {X: Field{[10]uint32{0x03987bb7, 0x02215cbb, 0x00d55d67, 0x0200aa04, 0x0119e8c9, 0x018b18e7, 0x02459000, 0x016b08fe, 0x0121e106, 0x003e5476}}, Y: Field{[10]uint32{0x01d7d950, 0x002631fe, 0x0207055d, 0x019aedda, 0x01051abc, 0x03d54ed7, 0x03db2397, 0x03a5d409, 0x01c187f8, 0x00373df7}}}, + {X: Field{[10]uint32{0x00d915ec, 0x00f83eb1, 0x0242ebb5, 0x01d3f20a, 0x038bcbf8, 0x03cd0382, 0x021b75e8, 0x01bf1845, 0x02167bac, 0x002373a3}}, Y: Field{[10]uint32{0x00ae940c, 0x004985f8, 0x03674e32, 0x03d240cb, 0x039c0287, 0x01349bb5, 0x00b410b3, 0x02e7ae6d, 0x03a14a9e, 0x00047394}}}, + {X: Field{[10]uint32{0x01e26e2b, 0x00e7baa6, 0x005dc4f4, 0x016bb56a, 0x02755dfc, 0x0304a9ea, 0x012ed15e, 0x0290f35f, 0x00dda0a7, 0x00338b4f}}, Y: Field{[10]uint32{0x03a5a145, 0x025f1801, 0x0009a36b, 0x0191f886, 0x036a8eed, 0x03160881, 0x035c2853, 0x009d03a9, 0x02bbe7ca, 0x001aa5ab}}}, + {X: Field{[10]uint32{0x00d92092, 0x00e42a37, 0x000f05ea, 0x00295632, 0x00f712c4, 0x020ce492, 0x03367b5c, 0x0353173b, 0x02fcdcc2, 0x0008e519}}, Y: Field{[10]uint32{0x03ac28cd, 0x02157849, 0x0318ed0e, 0x02acedf5, 0x0265d176, 0x023805cd, 0x023ee8e9, 0x03c22f29, 0x023c9b49, 0x003cb388}}}, + {X: Field{[10]uint32{0x0163e033, 0x0297fb8d, 0x0395e0f6, 0x01911d98, 0x034a2f3c, 0x00c7825c, 0x005bcd83, 0x00f02367, 0x0364341d, 0x000882ad}}, Y: Field{[10]uint32{0x02df5011, 0x03360dd5, 0x03f4cf9d, 0x028d5e05, 0x03aa51a9, 0x02d48300, 0x03dc7a42, 0x004fbd19, 0x0060d030, 0x003b0791}}}, + {X: Field{[10]uint32{0x004b469f, 0x03ffa024, 0x03db4ee2, 0x004993e8, 0x02845f0b, 0x00f13443, 0x03ffd81f, 0x01a9b1c3, 0x01fe1640, 0x00355157}}, Y: Field{[10]uint32{0x020aaf9a, 0x00428401, 0x019b8088, 0x03c0abe5, 0x0028a20a, 0x0056125f, 0x01d99e49, 0x00798899, 0x038d257e, 0x00283e4e}}}, + {X: Field{[10]uint32{0x00e60c72, 0x03627ca2, 0x0137e1a9, 0x03e73f07, 0x02f5039c, 0x007bb034, 0x0054665f, 0x03c1777c, 0x0377a1f6, 0x00148d9c}}, Y: Field{[10]uint32{0x02c7bb41, 0x027f1767, 0x01ce6a03, 0x005b663e, 0x00d05e70, 0x038925e8, 0x018d0477, 0x030d4b35, 0x0355430f, 0x001e3627}}}, + {X: Field{[10]uint32{0x03a56395, 0x0377a957, 0x02c9f4c1, 0x03c644b9, 0x01a8e569, 0x01cd9049, 0x023dc886, 0x0250889a, 0x01133ecc, 0x0016e658}}, Y: Field{[10]uint32{0x02436d0a, 0x010abd93, 0x00f19101, 0x02a84226, 0x03f7a0bc, 0x0178bf57, 0x00ac902c, 0x01b2bd76, 0x03641207, 0x002ee75d}}}, + {X: Field{[10]uint32{0x004c13fb, 0x0093ccae, 0x00f0c07c, 0x010f6e5b, 0x03eecd1a, 0x02c299dc, 0x007fa4a5, 0x03479963, 0x035cbfbe, 0x003cdb36}}, Y: Field{[10]uint32{0x018c394c, 0x01b24640, 0x039b9315, 0x039d1e4d, 0x01993744, 0x006d8996, 0x016aee18, 0x03b68a45, 0x02f05ee9, 0x0033f1b4}}}, + {X: Field{[10]uint32{0x0079a6f9, 0x017ee45c, 0x03e44059, 0x00cc43b1, 0x030842ce, 0x014c499b, 0x00bf7545, 0x01ebcace, 0x018e2510, 0x000c8231}}, Y: Field{[10]uint32{0x02c785d7, 0x011d628c, 0x001c645a, 0x028b2220, 0x03653599, 0x0257b0b2, 0x01d9ab58, 0x02db2581, 0x01cb5346, 0x0020c71b}}}, + {X: Field{[10]uint32{0x009927a7, 0x014e4623, 0x025a8c52, 0x020d9406, 0x02472535, 0x01135cd5, 0x0021b80b, 0x00438aa8, 0x02071f85, 0x002981ce}}, Y: Field{[10]uint32{0x0364fec9, 0x03c64698, 0x032462a9, 0x00361600, 0x026fefa3, 0x033f26ee, 0x0318baad, 0x01d84859, 0x03c54c8a, 0x003a4ea7}}}, + {X: Field{[10]uint32{0x01f0d913, 0x00d5d62e, 0x007139e3, 0x01f8d589, 0x00f7ec1a, 0x02a9fffa, 0x00f21476, 0x02bdfc98, 0x0062f79e, 0x000cd42d}}, Y: Field{[10]uint32{0x01152959, 0x01c5c448, 0x00d4e805, 0x02f120a9, 0x03020f33, 0x02a34ba4, 0x03d2341b, 0x0048883e, 0x01b30fce, 0x0007c327}}}, + {X: Field{[10]uint32{0x03073caa, 0x03893380, 0x0344c11d, 0x00f99bd9, 0x00177391, 0x02859433, 0x007c89b5, 0x00a9d248, 0x03170bc8, 0x00295356}}, Y: Field{[10]uint32{0x02cd3ab8, 0x01edec4c, 0x033afcdb, 0x009be4ad, 0x02fe62dc, 0x02488b27, 0x007fe5d4, 0x0374460f, 0x035f5309, 0x000f090e}}}, + {X: Field{[10]uint32{0x00a04cf8, 0x0095ca41, 0x005cae5b, 0x01b558e4, 0x028a7d34, 0x0071e18f, 0x0024f7b0, 0x01e8d285, 0x02bf676a, 0x00196428}}, Y: Field{[10]uint32{0x03e781e7, 0x01419168, 0x02f09396, 0x03b10919, 0x004f8d0c, 0x03a8bdcd, 0x002d972e, 0x0106684e, 0x00030490, 0x00047356}}}, + {X: Field{[10]uint32{0x03cba9a5, 0x025bb271, 0x0159289e, 0x00f7ed6e, 0x01884039, 0x028d9c04, 0x03461a20, 0x03d22f4b, 0x00029fc7, 0x002cf027}}, Y: Field{[10]uint32{0x00f5cfa9, 0x03324ac2, 0x0360ab97, 0x035abcb6, 0x03c6a3e6, 0x0300c38a, 0x03bb1bda, 0x012b4065, 0x026cbce5, 0x0039ed6a}}}, + {X: Field{[10]uint32{0x00fa8bc0, 0x024a4e46, 0x0064426a, 0x03be3f75, 0x02cdc693, 0x022ca65c, 0x03361439, 0x004de9f6, 0x02a8044a, 0x0035e5a3}}, Y: Field{[10]uint32{0x0157a75c, 0x009bb22b, 0x022e5283, 0x01d35d36, 0x0156dd31, 0x004338b9, 0x015dd294, 0x010d3b2f, 0x01892901, 0x00209009}}}, + {X: Field{[10]uint32{0x038e8304, 0x0167c020, 0x0365c6d9, 0x03212d40, 0x033bf6ed, 0x009406b6, 0x02ca172b, 0x03e73347, 0x006c2f98, 0x002295ef}}, Y: Field{[10]uint32{0x03e7d14e, 0x02ff8361, 0x038b992c, 0x00404691, 0x01bf6434, 0x02fe9a30, 0x00b5d67c, 0x0166150e, 0x0062a0f8, 0x000bafd5}}}, + {X: Field{[10]uint32{0x0073fd22, 0x03435418, 0x03b4e551, 0x034dfc3b, 0x011a555d, 0x023218f3, 0x00b8d18f, 0x0142a30f, 0x00416847, 0x0014621a}}, Y: Field{[10]uint32{0x02f3f192, 0x0145f68d, 0x03691f30, 0x0141b14b, 0x006a28ce, 0x00bd660f, 0x00e0f15c, 0x00eb429b, 0x009b9e98, 0x003ac17c}}}, + {X: Field{[10]uint32{0x027c85f3, 0x0124f8bd, 0x037b0ab7, 0x005a6e7a, 0x02d3a026, 0x00575574, 0x02ab8566, 0x01e53ea7, 0x035f27e4, 0x003faa30}}, Y: Field{[10]uint32{0x00148864, 0x012940a3, 0x03c889b5, 0x03d52aa5, 0x03b24158, 0x038ae8b9, 0x01123378, 0x01b8ea61, 0x0297cf0a, 0x0030c977}}}, + {X: Field{[10]uint32{0x01f94b63, 0x01409fb4, 0x0051077b, 0x01a5fbd3, 0x01d79d5f, 0x01707273, 0x01ab955d, 0x009793e3, 0x00ccd7bc, 0x001984b3}}, Y: Field{[10]uint32{0x0057860b, 0x0012668d, 0x0320073d, 0x0200570e, 0x03e9bd6a, 0x0094f7e6, 0x02abab50, 0x02342b9e, 0x02c17a37, 0x00185544}}}, + {X: Field{[10]uint32{0x006f8746, 0x02f5f92a, 0x03533cbd, 0x019e7db4, 0x02f8a7ae, 0x00c66655, 0x009d6983, 0x01676c13, 0x007a4998, 0x0032662c}}, Y: Field{[10]uint32{0x01d17138, 0x0046fc23, 0x038a66af, 0x03a444e0, 0x0137d6b5, 0x03a881ba, 0x019d81b0, 0x01dd7a89, 0x0371919e, 0x00367804}}}, + {X: Field{[10]uint32{0x024cc1e1, 0x003ec30e, 0x004bb052, 0x00551835, 0x00c32e39, 0x00f77242, 0x00fcd0d2, 0x02597e15, 0x0269c5cf, 0x00170391}}, Y: Field{[10]uint32{0x035adea1, 0x02e42719, 0x0055464f, 0x03b722cf, 0x0189f5ed, 0x0343df2e, 0x0335ffac, 0x0269374b, 0x03af7e0f, 0x0033faee}}}, + {X: Field{[10]uint32{0x0158c0fd, 0x036fee1c, 0x0350bcb2, 0x016d93e5, 0x037ab319, 0x01aa74fe, 0x02f6433c, 0x01459fc1, 0x02483038, 0x00343f76}}, Y: Field{[10]uint32{0x031283db, 0x000838fb, 0x03c358f0, 0x0057442a, 0x03f5c6e3, 0x01860cda, 0x02e13598, 0x03d87f20, 0x01776a34, 0x00133795}}}, + {X: Field{[10]uint32{0x024a3e81, 0x01c0617e, 0x00fd37bc, 0x014c66df, 0x0007cab1, 0x0088b39d, 0x01482656, 0x03d96817, 0x030fd78b, 0x00364955}}, Y: Field{[10]uint32{0x03c1924c, 0x0360dc21, 0x00ed1673, 0x03833740, 0x00ff52be, 0x027195d7, 0x021a5c7b, 0x02ea4068, 0x019ac448, 0x00000f0e}}}, + {X: Field{[10]uint32{0x018374c8, 0x030861c2, 0x00f9a1d0, 0x013f5e06, 0x02a023cc, 0x0212c200, 0x037d6074, 0x012eb081, 0x016d81f8, 0x001174ad}}, Y: Field{[10]uint32{0x0019d7f4, 0x01901067, 0x03f05030, 0x007e122e, 0x00982941, 0x009598f3, 0x010506ea, 0x032cdeb5, 0x00d192a9, 0x00053286}}}, + {X: Field{[10]uint32{0x02157400, 0x005c2de7, 0x03fba5b7, 0x01e196a4, 0x00ea8c19, 0x03e6843e, 0x013404dd, 0x0316efde, 0x00118588, 0x001ab4eb}}, Y: Field{[10]uint32{0x011686d7, 0x018bfa60, 0x02c97a87, 0x02b45cc7, 0x02382eb5, 0x035d8a4b, 0x0320e80f, 0x00b0ffb7, 0x001f1e24, 0x003e895d}}}, + {X: Field{[10]uint32{0x02595f52, 0x0387afd2, 0x00bf5028, 0x00a00b77, 0x0026d540, 0x004ac876, 0x03ea9e39, 0x02582de4, 0x0045b6dc, 0x00176891}}, Y: Field{[10]uint32{0x01f16026, 0x01007cd9, 0x005fd01b, 0x03663222, 0x02fabfa0, 0x03e28bf4, 0x015063bf, 0x0329a626, 0x038cad1d, 0x002f063f}}}, + {X: Field{[10]uint32{0x0132b346, 0x0057bf2b, 0x00f445ed, 0x0227549f, 0x03d7b5f1, 0x01975c4c, 0x039b89f8, 0x021b4a4e, 0x006811ce, 0x00377fd9}}, Y: Field{[10]uint32{0x027f5737, 0x03b68d95, 0x0110db1a, 0x019c4fa9, 0x034d236b, 0x004ac070, 0x021ae080, 0x0005af84, 0x0194cb22, 0x001c983a}}}, + {X: Field{[10]uint32{0x0097f029, 0x0279a6fe, 0x012436ad, 0x02637275, 0x02c1030d, 0x02142611, 0x032f50bc, 0x03ea4f43, 0x033b9120, 0x002a2e7f}}, Y: Field{[10]uint32{0x0066c591, 0x01f8cca1, 0x017b2359, 0x03da8ac7, 0x00c866aa, 0x00ec1fbf, 0x01a4c2ca, 0x01a1cbaa, 0x029a4e51, 0x00172fe8}}}, + {X: Field{[10]uint32{0x01dbcafd, 0x03068054, 0x00eb7a2f, 0x01921a3b, 0x02628752, 0x03237bac, 0x03c18eda, 0x0275a9c8, 0x03fb177b, 0x00250c1d}}, Y: Field{[10]uint32{0x00e7eb4e, 0x03d2a546, 0x01442e48, 0x004be97f, 0x03ccb6e3, 0x031f7e4f, 0x038248da, 0x0007274f, 0x01fc41ad, 0x0000866a}}}, + {X: Field{[10]uint32{0x0058b8e3, 0x0043cd99, 0x0174e9e8, 0x027e9593, 0x0382b33f, 0x00917aef, 0x0360f524, 0x0205ebf7, 0x01ac09c9, 0x001d72d8}}, Y: Field{[10]uint32{0x0003c367, 0x02b7f7bb, 0x00fb85b3, 0x01df3563, 0x02664414, 0x0277dae7, 0x00986f5f, 0x00210d18, 0x01bdf66f, 0x002aa04d}}}, + {X: Field{[10]uint32{0x031fccc8, 0x0039f238, 0x010c5075, 0x03cee6eb, 0x02c34fdc, 0x0239fc2b, 0x00922b22, 0x023a152f, 0x017727cb, 0x0006edf8}}, Y: Field{[10]uint32{0x00221ca3, 0x00368e30, 0x023d5238, 0x0030f989, 0x02855ea0, 0x0109737a, 0x01e322c2, 0x0179c2f6, 0x00861e85, 0x002efdca}}}, + {X: Field{[10]uint32{0x03ee8dbb, 0x02a536a2, 0x02a2eafd, 0x01c72638, 0x0087f024, 0x001743cc, 0x034b41cf, 0x036fcd16, 0x004b39e9, 0x002510ce}}, Y: Field{[10]uint32{0x024544ee, 0x0380723e, 0x02504aba, 0x015fdbde, 0x03e7b5da, 0x01f8e4e7, 0x00ac6e22, 0x0047d8e3, 0x0173ccb2, 0x0038d984}}}, + {X: Field{[10]uint32{0x03740d25, 0x033a9dbb, 0x0183961c, 0x015359a4, 0x00b4c27d, 0x0306a59a, 0x011638ae, 0x02aaca35, 0x01d5a68c, 0x00126f45}}, Y: Field{[10]uint32{0x0318c6e4, 0x01d0e7cf, 0x03e579db, 0x0183ab3c, 0x0377563b, 0x02657303, 0x03b9f0bd, 0x0391f7ef, 0x00688760, 0x001923f2}}}, + {X: Field{[10]uint32{0x02cfed85, 0x02517f5e, 0x02f9073f, 0x01e2960c, 0x02c151aa, 0x001e241f, 0x013684fd, 0x027a1613, 0x038e9280, 0x003431ed}}, Y: Field{[10]uint32{0x02970c89, 0x02e56ce3, 0x01d5707a, 0x01d48ab6, 0x03be91e4, 0x030c1480, 0x0129046b, 0x012902d5, 0x01abbe49, 0x002a0365}}}, + {X: Field{[10]uint32{0x02eb9275, 0x01af5f64, 0x00bf0cd9, 0x0361e5d2, 0x027c4c28, 0x033721d6, 0x018f9c75, 0x0088c97a, 0x01463ab2, 0x0037af77}}, Y: Field{[10]uint32{0x02b9799c, 0x02531c42, 0x00754ab5, 0x0192c4af, 0x0150d020, 0x01cebc96, 0x03b3dd7a, 0x03f2c17f, 0x008dc3ff, 0x0003440f}}}, + {X: Field{[10]uint32{0x03f33998, 0x01004bc6, 0x02dc33f6, 0x032152c0, 0x029f9ebc, 0x03681cc4, 0x022d6bf9, 0x01a8563a, 0x017c192a, 0x00075e6c}}, Y: Field{[10]uint32{0x00f60a5e, 0x039aef53, 0x00a12b78, 0x020af102, 0x020c7876, 0x033d91c0, 0x00d986fb, 0x0322a014, 0x00b3dbc1, 0x001bb206}}}, + {X: Field{[10]uint32{0x0281ca1b, 0x03f4db9b, 0x018449ed, 0x015c9931, 0x0374bd3b, 0x03454d7f, 0x009c38d7, 0x011fa5ca, 0x02ebff5d, 0x000bfadd}}, Y: Field{[10]uint32{0x01f93b74, 0x030ceee2, 0x00899378, 0x01d1e267, 0x03bb462e, 0x03e72af1, 0x02e18cd1, 0x02a08f7e, 0x024a7ba3, 0x00116f53}}}, + {X: Field{[10]uint32{0x00682573, 0x00bf82ec, 0x013c0637, 0x00e52619, 0x013eef1b, 0x0393d7bf, 0x0372ab62, 0x0169dfd4, 0x0190faef, 0x00005343}}, Y: Field{[10]uint32{0x02081453, 0x02a4bd8d, 0x0131236b, 0x025dcae8, 0x01601a4f, 0x01c65a0c, 0x0130f51d, 0x02e4c13d, 0x029a80c2, 0x00145fc5}}}, + {X: Field{[10]uint32{0x03313321, 0x008aafff, 0x02476fd5, 0x00dd1b4b, 0x02ad0941, 0x0042ce6c, 0x00bd9adb, 0x02470ce1, 0x03a5728f, 0x001cc1a9}}, Y: Field{[10]uint32{0x03a915a2, 0x005ee06d, 0x02a85a8e, 0x03b496e1, 0x01574c85, 0x0124bc6c, 0x03bd4e4f, 0x03a1ecd6, 0x02aba5b9, 0x00085788}}}, + {X: Field{[10]uint32{0x0255aaba, 0x0134d89a, 0x0171976d, 0x01e9cdfa, 0x00fd2406, 0x0263eb48, 0x02873a06, 0x036e32cc, 0x014f870c, 0x00217611}}, Y: Field{[10]uint32{0x0117e4a2, 0x010d2c4c, 0x033bb951, 0x03b8446b, 0x01539fe7, 0x02e720cf, 0x02a0715c, 0x027a3948, 0x000a36eb, 0x000db58f}}}, + {X: Field{[10]uint32{0x034384c3, 0x0028392c, 0x00dffc1f, 0x00a25b63, 0x0202f7da, 0x0386448a, 0x01b21cb9, 0x019ea896, 0x03829930, 0x0031a3d9}}, Y: Field{[10]uint32{0x0079e94a, 0x030da04c, 0x014ffb7d, 0x024daca6, 0x0308dcd4, 0x026575a8, 0x02484fb0, 0x00ce1dfa, 0x016a331c, 0x001d39ba}}}, + {X: Field{[10]uint32{0x00214dd3, 0x038c6101, 0x0217fe18, 0x0141a1c2, 0x00e29cd8, 0x00d47227, 0x02d5c9c3, 0x01554211, 0x01115dbe, 0x00205120}}, Y: Field{[10]uint32{0x030d19a8, 0x02af2c59, 0x02785210, 0x00f97b75, 0x01540ea3, 0x011e1a27, 0x03740e92, 0x030a71a5, 0x00b3d4cd, 0x001d775e}}}, + {X: Field{[10]uint32{0x00c945f5, 0x00120558, 0x00ebe3e2, 0x006f3d85, 0x0324214e, 0x01c1bc87, 0x0325993a, 0x0351e3d7, 0x0319de24, 0x000c42d6}}, Y: Field{[10]uint32{0x004318c3, 0x00ccc9c4, 0x021a147e, 0x014fc0a8, 0x01bf04cc, 0x03a1035a, 0x01d017e2, 0x03481782, 0x02ca0f01, 0x0022d0b1}}}, + {X: Field{[10]uint32{0x03c4bc3e, 0x0165d302, 0x03420a02, 0x00471a13, 0x01b0a90f, 0x00b9b514, 0x01e4bcab, 0x038ae77f, 0x03c74baf, 0x0033e291}}, Y: Field{[10]uint32{0x034c97d1, 0x00806ef8, 0x01c3d1cc, 0x01a70299, 0x02614d8a, 0x0321d8af, 0x02331e62, 0x021a65e1, 0x0264a9a7, 0x003c2dec}}}, + {X: Field{[10]uint32{0x038650fc, 0x011ebe62, 0x002d33d7, 0x0221a6e6, 0x03ab5533, 0x00f4ed82, 0x00100ec6, 0x02a4139c, 0x02267352, 0x00283f18}}, Y: Field{[10]uint32{0x0385865f, 0x025bcace, 0x02497e2b, 0x02cfe659, 0x03cd162e, 0x00870e67, 0x0388c395, 0x013ad192, 0x014c16b2, 0x002e8eb9}}}, + {X: Field{[10]uint32{0x00ff8bdb, 0x038f08db, 0x03fb07dc, 0x01c29386, 0x032e1eaf, 0x000114cc, 0x00d03391, 0x03751d61, 0x03e2535e, 0x002ab976}}, Y: Field{[10]uint32{0x03a7449b, 0x02554ced, 0x00321911, 0x03168d56, 0x02a51d85, 0x011cdccb, 0x02784392, 0x001adeec, 0x01f6e558, 0x001f3ea9}}}, + {X: Field{[10]uint32{0x0103ae39, 0x0285eec1, 0x01bd50b0, 0x009a1b69, 0x005c3172, 0x009c1686, 0x000792fb, 0x01d5432f, 0x03115b89, 0x002293a4}}, Y: Field{[10]uint32{0x017cef2c, 0x03a48ff4, 0x016922dd, 0x0362a770, 0x022442ae, 0x02a85d5c, 0x011b976d, 0x00231c5d, 0x01c8d85f, 0x000588eb}}}, + {X: Field{[10]uint32{0x03066463, 0x0336b1a1, 0x03f26a51, 0x028332eb, 0x018627e1, 0x02404096, 0x015cd612, 0x002c254a, 0x0135eca9, 0x0032f3bd}}, Y: Field{[10]uint32{0x03212653, 0x01fee35a, 0x03c259d8, 0x005cd18b, 0x02498fee, 0x03143855, 0x00afb9d8, 0x032670ff, 0x03fac2a2, 0x0019470b}}}, + {X: Field{[10]uint32{0x010f8c99, 0x00bab07b, 0x02609990, 0x0134bab5, 0x010bf12c, 0x00ae7210, 0x0290e336, 0x00af42ea, 0x01594d6a, 0x000965c5}}, Y: Field{[10]uint32{0x0075245e, 0x02b4afca, 0x02a8294b, 0x008b4289, 0x01d974dd, 0x00cfa2ec, 0x004002bc, 0x00132e05, 0x036cc974, 0x00127806}}}, + {X: Field{[10]uint32{0x02f1445f, 0x00b34a6d, 0x02a89167, 0x0178fa6c, 0x00a707da, 0x0203c0d9, 0x0389044c, 0x027daeb0, 0x028b2b04, 0x002dd535}}, Y: Field{[10]uint32{0x01e37740, 0x02bb1793, 0x01da1af2, 0x01097d37, 0x02bea555, 0x037f0bd3, 0x0092e3ed, 0x008f459c, 0x03c1625e, 0x0006ca6d}}}, + {X: Field{[10]uint32{0x03084037, 0x02263fd3, 0x0040aafa, 0x022f4a53, 0x02ab0bde, 0x03ce2d68, 0x03ca2fe2, 0x023ce731, 0x01a850e6, 0x00082ba9}}, Y: Field{[10]uint32{0x03f59444, 0x03877c00, 0x00fc20b4, 0x00f0c48c, 0x02ab1e88, 0x03f9f86c, 0x02fd6a56, 0x019bb1aa, 0x02b3f176, 0x001bb55d}}}, + {X: Field{[10]uint32{0x031979a6, 0x017876f8, 0x01e7bf0d, 0x0341f340, 0x02c6939f, 0x025fae16, 0x008cba9a, 0x03a48cca, 0x0202919d, 0x0009a113}}, Y: Field{[10]uint32{0x009ebfb7, 0x03154817, 0x005a16c7, 0x030a0cb1, 0x00cc08a6, 0x0063ed83, 0x026f11e5, 0x03eb4409, 0x028e06a5, 0x0000f7e6}}}, + {X: Field{[10]uint32{0x0028414c, 0x0372a577, 0x033fd485, 0x01ac68e2, 0x00efbe0a, 0x03b37e6d, 0x00fd413b, 0x026abc9f, 0x026133a6, 0x00046bf2}}, Y: Field{[10]uint32{0x03737b1c, 0x007d6b36, 0x0377b212, 0x03eee724, 0x009e4678, 0x0391ed00, 0x0047bbf8, 0x01ff988a, 0x0390c067, 0x002352e1}}}, + {X: Field{[10]uint32{0x00d2a63d, 0x01e37bba, 0x0160df3d, 0x01ec8f9c, 0x00498633, 0x039fa578, 0x03be09fc, 0x017594de, 0x00d52fe2, 0x00311b85}}, Y: Field{[10]uint32{0x01d2b723, 0x01d7563d, 0x017589b1, 0x03bd0fe8, 0x011f04b9, 0x0377d9e9, 0x0008dd77, 0x03a7fcb4, 0x01ab4211, 0x0028803f}}}, + {X: Field{[10]uint32{0x0055e4d7, 0x03673635, 0x02142d31, 0x00f23d63, 0x01241228, 0x00429d81, 0x01f598a2, 0x03f82491, 0x0212578a, 0x00015c2a}}, Y: Field{[10]uint32{0x00c50ac8, 0x00b03c4b, 0x01601b93, 0x02a57429, 0x019a2bed, 0x0144a81c, 0x03439e08, 0x00378750, 0x0361f8e9, 0x0030a3f6}}}, + {X: Field{[10]uint32{0x03c3fa64, 0x00c4237e, 0x00d1f3a3, 0x02b33ec5, 0x02224236, 0x00e15385, 0x0170b84e, 0x033a80a1, 0x035e88a1, 0x0034c4b6}}, Y: Field{[10]uint32{0x0397e1de, 0x0185fdb3, 0x026cf36b, 0x012ba9cb, 0x0064b8aa, 0x000c724c, 0x01fa0aae, 0x00e0f211, 0x00891843, 0x00329794}}}, + {X: Field{[10]uint32{0x02398087, 0x013b022a, 0x00a6d1fe, 0x02e1d889, 0x01c9be5e, 0x009e7c00, 0x01a9ad99, 0x019c3853, 0x00769981, 0x0007b88a}}, Y: Field{[10]uint32{0x02176dcc, 0x00c727c0, 0x034526ff, 0x02896031, 0x00b68603, 0x01511835, 0x0242c650, 0x038deb7f, 0x0114e303, 0x00188404}}}, + {X: Field{[10]uint32{0x03bb81a0, 0x02a6a955, 0x004a94af, 0x035cb530, 0x011700b9, 0x03259300, 0x005511d1, 0x013fd2ba, 0x02cde2b8, 0x0007ee72}}, Y: Field{[10]uint32{0x03737fcb, 0x0159d497, 0x0038ee04, 0x01acb3e8, 0x0115b130, 0x0108050d, 0x019f59f7, 0x017cab5b, 0x03c1295c, 0x0010c2dc}}}, + {X: Field{[10]uint32{0x011c085b, 0x00685d98, 0x01145f19, 0x02e7e913, 0x034a998b, 0x0201f9d0, 0x032934a9, 0x002d1da7, 0x002dd3cf, 0x00341332}}, Y: Field{[10]uint32{0x01be5fa9, 0x00805a40, 0x0392d155, 0x02b32196, 0x018f4c13, 0x03848f75, 0x02cf1cac, 0x03454710, 0x01afb551, 0x001e9286}}}, + {X: Field{[10]uint32{0x03e7e9aa, 0x03a1c133, 0x01e15712, 0x02295237, 0x038a544f, 0x009f7d77, 0x00b97f1f, 0x0345faea, 0x02088bd4, 0x0007932c}}, Y: Field{[10]uint32{0x019b828d, 0x0119b369, 0x03e515e8, 0x025971c6, 0x03db0663, 0x00ff68fc, 0x019930a5, 0x00cfb39e, 0x021eb729, 0x00360171}}}, + {X: Field{[10]uint32{0x0251590d, 0x01b71237, 0x028c717d, 0x01a77cf7, 0x008f769f, 0x02f3f6ae, 0x032bbadc, 0x02168359, 0x0398707a, 0x001482a8}}, Y: Field{[10]uint32{0x02e9ada8, 0x01495513, 0x0052a39a, 0x01366638, 0x013b5472, 0x0045daab, 0x01095e2f, 0x01e88b02, 0x00e4a904, 0x002634d1}}}, + {X: Field{[10]uint32{0x03614ef2, 0x032b1b9e, 0x005d7a79, 0x0325e0c9, 0x00e7080a, 0x001a4ff2, 0x00d45a06, 0x03bdf0b8, 0x03de165b, 0x000ea7f8}}, Y: Field{[10]uint32{0x03038d4a, 0x00187bdc, 0x0398e151, 0x0126a9b5, 0x007607ff, 0x024d3222, 0x02895f52, 0x037bbf1e, 0x0046fd3f, 0x00014625}}}, + {X: Field{[10]uint32{0x02149938, 0x03639cf6, 0x0005665f, 0x00190dcc, 0x018e3c68, 0x02db5a32, 0x0289a3a2, 0x00201790, 0x01ccc26c, 0x002724a7}}, Y: Field{[10]uint32{0x016ba2fa, 0x0285034e, 0x02dd956a, 0x00b6aaf9, 0x02c81edf, 0x00409d8a, 0x039f6bab, 0x024824fc, 0x0140b4c2, 0x001b7efe}}}, + {X: Field{[10]uint32{0x01be419e, 0x005dd222, 0x00a660d1, 0x02af1a6b, 0x03ee22ab, 0x0179e822, 0x02f1e42e, 0x0019462e, 0x00cef4e0, 0x000d56d8}}, Y: Field{[10]uint32{0x002604e2, 0x011bd0ff, 0x031b1ed1, 0x02baed13, 0x034fc01d, 0x02d4fedc, 0x020eaaac, 0x03ec417f, 0x023bb277, 0x001fd1e2}}}, + {X: Field{[10]uint32{0x03f7f37f, 0x039efcf5, 0x01705dfc, 0x02465d0e, 0x01ea9660, 0x00478406, 0x0389bb1c, 0x01110b84, 0x014f21ad, 0x001daffc}}, Y: Field{[10]uint32{0x0289d763, 0x01a95260, 0x0307b93f, 0x03e2488f, 0x02a29a34, 0x0308b80b, 0x034da79b, 0x02ac4ad7, 0x0291376a, 0x000e1568}}}, + {X: Field{[10]uint32{0x0156b454, 0x023e2d98, 0x021dbfa0, 0x02ffe88b, 0x02becbb4, 0x01620ce5, 0x023aadd3, 0x01e8edf8, 0x00df1057, 0x00246ee7}}, Y: Field{[10]uint32{0x00edbb91, 0x0333c965, 0x01a1ef2c, 0x010b0b2a, 0x00a3edea, 0x005846d7, 0x0053e93d, 0x026c0bb7, 0x039e4f14, 0x003b1b2e}}}, + {X: Field{[10]uint32{0x00865562, 0x00c4296a, 0x02537f8c, 0x01f53acc, 0x010a7dde, 0x003116c2, 0x0081204f, 0x01b184d9, 0x010f1ba8, 0x002795ac}}, Y: Field{[10]uint32{0x028aa67c, 0x010d8756, 0x022d516f, 0x02bc3461, 0x028b523e, 0x027ba31a, 0x03ca1a37, 0x0305b122, 0x013d8552, 0x00337cd1}}}, + {X: Field{[10]uint32{0x008e09f9, 0x0125cb66, 0x00af500f, 0x01d53a69, 0x01a11dcb, 0x00e4c15c, 0x02e28a42, 0x01af7939, 0x014daf28, 0x00139cd6}}, Y: Field{[10]uint32{0x018a36e7, 0x02d47c51, 0x02418cd1, 0x014c20a2, 0x01af0d8e, 0x0289d00d, 0x03d812ce, 0x010b3b80, 0x03d070c0, 0x002967c8}}}, + {X: Field{[10]uint32{0x0123d860, 0x02b254ce, 0x01bb1d9f, 0x01cc12c4, 0x00393d59, 0x032cb185, 0x01d3c557, 0x0227e9a4, 0x03f7e92d, 0x00055bf7}}, Y: Field{[10]uint32{0x013b360b, 0x03ac04e8, 0x032ee620, 0x033408c4, 0x00bff653, 0x0199408f, 0x02d68f64, 0x01d833bd, 0x0237c448, 0x0013a4a5}}}, + {X: Field{[10]uint32{0x028ea03b, 0x0029f9eb, 0x0356998b, 0x01487e24, 0x0170d23d, 0x00f4d36e, 0x017a9052, 0x008cd975, 0x0250eb37, 0x003cb22d}}, Y: Field{[10]uint32{0x001a7881, 0x010aa1c6, 0x0183d72f, 0x031d9ce5, 0x00204488, 0x002f7a7b, 0x03422a56, 0x026fda5c, 0x031484a9, 0x002f66b0}}}, + {X: Field{[10]uint32{0x0351e3e3, 0x01399eb1, 0x0316cd4a, 0x028806b8, 0x0288d526, 0x01ee05ae, 0x01bb92ba, 0x01d0c17d, 0x0257a4a3, 0x0009f74d}}, Y: Field{[10]uint32{0x03be3304, 0x019092e0, 0x00e8c022, 0x0007df61, 0x008a756b, 0x03fa5d79, 0x03af3d51, 0x029005ab, 0x01d3c0fa, 0x0022033f}}}, + {X: Field{[10]uint32{0x03b3d1bc, 0x013c58fa, 0x037081c6, 0x020b099c, 0x037a3901, 0x03312dfc, 0x00c5d981, 0x00d5f00f, 0x020c19f7, 0x003db097}}, Y: Field{[10]uint32{0x0289e43d, 0x039f08a3, 0x03c2f183, 0x014ab7cd, 0x01295341, 0x010ecd62, 0x0144d666, 0x0283e8e6, 0x03ea7c05, 0x0023202c}}}, + {X: Field{[10]uint32{0x03fad4f2, 0x02b1fd29, 0x01f45087, 0x0015c5bf, 0x02ae2803, 0x0274dd84, 0x02847d3d, 0x017a87a8, 0x000c7130, 0x00319e20}}, Y: Field{[10]uint32{0x000b63c6, 0x0127a21b, 0x022d92d5, 0x00e7c41b, 0x0055d41d, 0x02fabd76, 0x0349a42e, 0x00ae3376, 0x03f4d2fb, 0x002f97fe}}}, + {X: Field{[10]uint32{0x03f6d560, 0x0244ba04, 0x03d30931, 0x037e816f, 0x02f98177, 0x023c347b, 0x01e2d3a6, 0x01de1bf2, 0x0221e66b, 0x003cd76c}}, Y: Field{[10]uint32{0x003f29fa, 0x01f30039, 0x007c7bb6, 0x0054da9f, 0x0209eccb, 0x03f96c7b, 0x0174ca5a, 0x00810226, 0x00080e6b, 0x0012266a}}}, + {X: Field{[10]uint32{0x03e69de9, 0x00718e64, 0x00debd02, 0x0013101d, 0x035d944f, 0x00ce2230, 0x01843d6c, 0x018cfb6e, 0x037da915, 0x000ae4f8}}, Y: Field{[10]uint32{0x030522f0, 0x034f2212, 0x001676f2, 0x017f1c94, 0x00366a4a, 0x004c83bf, 0x0372a58f, 0x0287324f, 0x0095c6ff, 0x003acf44}}}, + {X: Field{[10]uint32{0x02091b69, 0x02407459, 0x02331060, 0x02522c52, 0x03e4875b, 0x03f6d01b, 0x01913ab0, 0x011c5bd4, 0x03b39045, 0x00206008}}, Y: Field{[10]uint32{0x0227e7b1, 0x039130a8, 0x00990f98, 0x0227e9f6, 0x026fe573, 0x00e393cb, 0x01af3e1f, 0x03911c31, 0x018a6224, 0x002cfd5c}}}, + {X: Field{[10]uint32{0x00662bb6, 0x00fc180f, 0x001fbdb3, 0x01ec84f7, 0x006645ce, 0x016c5061, 0x02e565b6, 0x029a76ca, 0x026a244c, 0x000059db}}, Y: Field{[10]uint32{0x022e0298, 0x028c7ee0, 0x001fdcf4, 0x026c5bb3, 0x01aeb968, 0x034b1f03, 0x03208300, 0x0177049a, 0x03a5deef, 0x00223872}}}, + {X: Field{[10]uint32{0x00298d54, 0x00b2c877, 0x02e4c391, 0x0150c38c, 0x01d96574, 0x008f8bc8, 0x0229d733, 0x00df78e1, 0x01a1a925, 0x0000be4c}}, Y: Field{[10]uint32{0x030ef904, 0x0077eba8, 0x03ccc52e, 0x03442f6e, 0x0195a5b2, 0x015899c4, 0x036fe43f, 0x003ebbbb, 0x01086fbc, 0x0024ca4b}}}, + {X: Field{[10]uint32{0x01fd0279, 0x01cc3228, 0x001af2d1, 0x03044898, 0x02be8a32, 0x013d1521, 0x03f20d9b, 0x0232462f, 0x0212f0dd, 0x001ee935}}, Y: Field{[10]uint32{0x02401179, 0x00d39e34, 0x00310d02, 0x0316f131, 0x013018e3, 0x0334126a, 0x0220af14, 0x0190c6cb, 0x02a1f5b0, 0x0022ab5e}}}, + {X: Field{[10]uint32{0x001d5e78, 0x01aa9872, 0x023d8528, 0x00233323, 0x03d6974d, 0x008de67a, 0x039b2be7, 0x01ea45a9, 0x02b085fe, 0x0003a37e}}, Y: Field{[10]uint32{0x023f926c, 0x02ead01b, 0x0181c37d, 0x00eec637, 0x00fbaec5, 0x01521eee, 0x0195d47a, 0x02d55b99, 0x006e519d, 0x0008485a}}}, + {X: Field{[10]uint32{0x0184ab5e, 0x02432683, 0x0264c94c, 0x028554d6, 0x02ea751d, 0x01facb9a, 0x01071061, 0x01fbd1be, 0x03bcb159, 0x001f5588}}, Y: Field{[10]uint32{0x00ce7575, 0x0372f0a8, 0x037e4204, 0x0351759a, 0x00701b3c, 0x02f8ba2e, 0x0114b70e, 0x031378c5, 0x03318004, 0x003718e7}}}, + {X: Field{[10]uint32{0x00a7ffa3, 0x03213ee2, 0x02ad57b9, 0x005a0778, 0x001e4ac9, 0x00ee0880, 0x0186194b, 0x02fb1d22, 0x022d8074, 0x00023a07}}, Y: Field{[10]uint32{0x019fa890, 0x02052641, 0x03e6cdc7, 0x026a37e4, 0x03fa94e9, 0x018b40fd, 0x016f6cf7, 0x01120329, 0x001df4a3, 0x0010217b}}}, + {X: Field{[10]uint32{0x028da71e, 0x034ea169, 0x0052b53e, 0x0324ad73, 0x0173e68a, 0x01a71a0a, 0x018affd1, 0x03b98978, 0x03e78290, 0x002a7568}}, Y: Field{[10]uint32{0x00805fd6, 0x026f92ad, 0x02536ee8, 0x0083391e, 0x028d6e8b, 0x01e4ce22, 0x009ed298, 0x01622546, 0x016bf9eb, 0x000736ab}}}, + {X: Field{[10]uint32{0x03dba2cd, 0x02c48f15, 0x00497d64, 0x03c391ab, 0x00984985, 0x00c4be12, 0x037b3134, 0x01f0380e, 0x03cabcda, 0x0013df05}}, Y: Field{[10]uint32{0x034a25d7, 0x02d72a28, 0x00f5e888, 0x002a6eaa, 0x00c87701, 0x0141c334, 0x00be7c1d, 0x0030efcf, 0x01d95f47, 0x002182fb}}}, + {X: Field{[10]uint32{0x03a64921, 0x02ec2ae7, 0x025b5b4f, 0x00f14d5c, 0x01034b8c, 0x0155cd3a, 0x01bd016f, 0x029ee6a4, 0x017a9234, 0x0011e3cf}}, Y: Field{[10]uint32{0x00051a1f, 0x02d364ee, 0x021018ff, 0x015360fc, 0x003f2530, 0x0087a69f, 0x02bca05c, 0x00fc63ae, 0x0394f025, 0x0036e5e8}}}, + {X: Field{[10]uint32{0x027963d5, 0x014bac7f, 0x02329f25, 0x02ad87ee, 0x033ea09a, 0x007685e7, 0x037cc01b, 0x01b9f5a7, 0x017b73d9, 0x002b39f9}}, Y: Field{[10]uint32{0x02908918, 0x03bee249, 0x0211b796, 0x013040c1, 0x017e213e, 0x03809659, 0x010f824b, 0x02f413b2, 0x01f22b8d, 0x003e8094}}}, + {X: Field{[10]uint32{0x0108d1fd, 0x001039ea, 0x01f24374, 0x03e28742, 0x034401f2, 0x0337da7b, 0x013757cd, 0x001dc609, 0x0067f517, 0x003355ba}}, Y: Field{[10]uint32{0x03338fe1, 0x012ee89f, 0x03b90a45, 0x02109ded, 0x0183e4bd, 0x03d8831f, 0x02b29a22, 0x002e9228, 0x021652cf, 0x0021e3dc}}}, + {X: Field{[10]uint32{0x024d5329, 0x00f944fb, 0x03e33e92, 0x01cae819, 0x0167a2c6, 0x01ec9769, 0x031dd249, 0x03e26992, 0x025cd9d2, 0x000c10ba}}, Y: Field{[10]uint32{0x0268b1fb, 0x03906cd6, 0x0261281c, 0x021a3817, 0x02d3fa1d, 0x01b489e8, 0x028568cd, 0x01a85282, 0x0144d551, 0x0002e130}}}, + {X: Field{[10]uint32{0x02712ec0, 0x0147b267, 0x03f1bce3, 0x02455ebc, 0x0130a2e2, 0x02be80d1, 0x002b042b, 0x03b49802, 0x008da094, 0x00015782}}, Y: Field{[10]uint32{0x026b33e9, 0x03274bb1, 0x01db2082, 0x037e0b54, 0x0100caca, 0x00531512, 0x00919335, 0x020c9258, 0x017f6439, 0x0031be0a}}}, + {X: Field{[10]uint32{0x03408966, 0x02d1a44e, 0x01875e63, 0x020fbb5c, 0x01e0e0da, 0x0295e83a, 0x03f91817, 0x024ef28d, 0x013a69dd, 0x002f4b6c}}, Y: Field{[10]uint32{0x01b0da2d, 0x029d0a82, 0x00cf8078, 0x0391016e, 0x00187ee6, 0x03d96cfe, 0x03c25d50, 0x026cbc48, 0x0260f948, 0x0011b849}}}, + {X: Field{[10]uint32{0x03d3d210, 0x0158939f, 0x03ecb609, 0x006661a9, 0x00ef7c52, 0x013b4685, 0x02678e62, 0x0211557f, 0x0110cdbb, 0x001f5e94}}, Y: Field{[10]uint32{0x02c6c37c, 0x01d2965a, 0x00867727, 0x03680570, 0x00626a46, 0x02ea9281, 0x019d640a, 0x011493e0, 0x01c3c0a5, 0x003255e3}}}, + {X: Field{[10]uint32{0x037a3fa7, 0x02cc3d24, 0x037825bd, 0x00a406f5, 0x02fd4e6d, 0x013b6af1, 0x01669813, 0x004d50aa, 0x0317513b, 0x0007bc48}}, Y: Field{[10]uint32{0x010e1ade, 0x012276d6, 0x00039909, 0x02651a13, 0x01123198, 0x01aa327e, 0x011cee33, 0x02f3bcd1, 0x0288a391, 0x0038392d}}}, + {X: Field{[10]uint32{0x0206baaf, 0x00c33a85, 0x01d1949d, 0x021a2e68, 0x029f463b, 0x00cb4bc4, 0x02c6b2e3, 0x02e5db6f, 0x0003766f, 0x003bfe81}}, Y: Field{[10]uint32{0x001cb082, 0x00877bef, 0x003c2382, 0x03116d28, 0x03b0cbfd, 0x0280f785, 0x00de1b7d, 0x03e993ce, 0x0083bf3e, 0x002316c7}}}, + {X: Field{[10]uint32{0x0087d65c, 0x03699868, 0x02069df5, 0x0036743a, 0x0320bf78, 0x01cebd6f, 0x025f0222, 0x02810955, 0x01e976a9, 0x0037249c}}, Y: Field{[10]uint32{0x023d6063, 0x033629ad, 0x010c1944, 0x01f18852, 0x0055ce7c, 0x031ceddb, 0x02f11bb1, 0x034c3261, 0x01e7b27b, 0x0037219e}}}, + {X: Field{[10]uint32{0x00264619, 0x02ad052e, 0x031b2384, 0x024c0376, 0x02a1336b, 0x01d54075, 0x00f69462, 0x0280b086, 0x01c21e1c, 0x0002b877}}, Y: Field{[10]uint32{0x01b26b48, 0x03d0881f, 0x0076a01f, 0x0326a21f, 0x0332466b, 0x026a9db5, 0x00e5c8e1, 0x018497b2, 0x039d300b, 0x000871ac}}}, + {X: Field{[10]uint32{0x0282cf5b, 0x0338ead3, 0x00a1285c, 0x0226fcaf, 0x01033dd9, 0x00c5918d, 0x00924808, 0x00d724ae, 0x000ffe58, 0x002ba8b0}}, Y: Field{[10]uint32{0x03dfa97f, 0x0064eca4, 0x029673e8, 0x035014ee, 0x039aad65, 0x019c2c64, 0x0220e84e, 0x0184490a, 0x00cf935a, 0x00185566}}}, + {X: Field{[10]uint32{0x02ebf696, 0x02322fa2, 0x0066b634, 0x00f98db2, 0x01b45e72, 0x02451d9f, 0x01b30b65, 0x00ea1bd5, 0x021634b4, 0x00244f43}}, Y: Field{[10]uint32{0x01971a9f, 0x01e9710e, 0x00305148, 0x00385235, 0x0039c0c1, 0x00c5c809, 0x02574af4, 0x03f69340, 0x020751af, 0x00385319}}}, + {X: Field{[10]uint32{0x03c26fc0, 0x0094b48e, 0x0005a301, 0x00f621e3, 0x0040fc16, 0x02ec3e72, 0x00d61916, 0x02b20178, 0x0354775c, 0x0013c2cc}}, Y: Field{[10]uint32{0x018da1e3, 0x03f0fcef, 0x01ac3fa8, 0x01ddba15, 0x016c0e10, 0x03cf897c, 0x02eb2eb5, 0x03f7e0e9, 0x00863aed, 0x002c2dd5}}}, + {X: Field{[10]uint32{0x0316129d, 0x028f693c, 0x0083b181, 0x02583e02, 0x02f469df, 0x03197ab4, 0x033b2f75, 0x025e3dd9, 0x014073cc, 0x00176886}}, Y: Field{[10]uint32{0x02f311d1, 0x03051663, 0x031eaf3b, 0x036d8a16, 0x030237b1, 0x0067ad50, 0x00d5e63e, 0x0099c15c, 0x0080743d, 0x002145b4}}}, + {X: Field{[10]uint32{0x03e74a23, 0x03bbb45a, 0x0163dd4b, 0x00c89a74, 0x02a8fbc1, 0x00d0134d, 0x0392fb46, 0x03e46b32, 0x0330ca7a, 0x001db86c}}, Y: Field{[10]uint32{0x027f5326, 0x02b83787, 0x02791bca, 0x000000c6, 0x0002ce28, 0x03fe837b, 0x016f2e52, 0x023bcfb2, 0x0253c590, 0x00042ce4}}}, + {X: Field{[10]uint32{0x02393e64, 0x025d743b, 0x01be1d76, 0x015d9c77, 0x018fe8ef, 0x022c8cd6, 0x03912637, 0x003b860b, 0x008b2f21, 0x00312f92}}, Y: Field{[10]uint32{0x0379f449, 0x01389c2e, 0x02aee10d, 0x01c3e01f, 0x00b910cd, 0x02632809, 0x00beadcb, 0x02695120, 0x012fa1a0, 0x002fb04e}}}, + {X: Field{[10]uint32{0x0333ff37, 0x00329724, 0x0254256d, 0x000134da, 0x0025f5be, 0x00f58230, 0x0313848d, 0x03f5dec7, 0x018da141, 0x000151a4}}, Y: Field{[10]uint32{0x01914ac7, 0x008fa3ce, 0x004dcc2d, 0x02920cdc, 0x03b0b82b, 0x033e686f, 0x0300d716, 0x02f86973, 0x00c79684, 0x0000f475}}}, + {X: Field{[10]uint32{0x026078de, 0x03065809, 0x0210a320, 0x02c6719f, 0x002e6df8, 0x023fc3d0, 0x03368b09, 0x03af44b7, 0x03c42c51, 0x00337f1b}}, Y: Field{[10]uint32{0x0189cb0d, 0x02f81a3f, 0x0063c0fe, 0x0046dbdd, 0x03c26894, 0x02cddd3c, 0x03bef456, 0x01499151, 0x0130023e, 0x0016617a}}}, + {X: Field{[10]uint32{0x00f03034, 0x02ef351f, 0x00e99c99, 0x012d1c63, 0x02036f0e, 0x01023851, 0x021eec62, 0x005281bc, 0x00cc593b, 0x001dcc3f}}, Y: Field{[10]uint32{0x02016b72, 0x023e644f, 0x0001ccc2, 0x02ddbe5c, 0x0152beac, 0x024aa9f7, 0x030151b4, 0x03904a70, 0x03e20736, 0x003c5f43}}}, + {X: Field{[10]uint32{0x0141b3ea, 0x01acd51e, 0x03090572, 0x02a57eb7, 0x01d855a7, 0x03e256f1, 0x00c7b559, 0x0023d19d, 0x03de4743, 0x0022a930}}, Y: Field{[10]uint32{0x00b8594d, 0x0357dc57, 0x018be7db, 0x01085432, 0x0278d9da, 0x03d00fb4, 0x034ae9ad, 0x00988c6f, 0x004a0eac, 0x003c9d71}}}, + {X: Field{[10]uint32{0x0325bb79, 0x01534434, 0x0313c5cb, 0x0375e156, 0x01f32d33, 0x02250124, 0x036f87ff, 0x03a49625, 0x01a497a4, 0x0005649b}}, Y: Field{[10]uint32{0x03ce8e51, 0x03c5b619, 0x00d40d35, 0x01e20a20, 0x001aa03c, 0x0327dc6e, 0x031bf67e, 0x02fea3a1, 0x00b65b1e, 0x00056b18}}}, + {X: Field{[10]uint32{0x01b1710d, 0x02bbaf7d, 0x02dbb35f, 0x01175159, 0x02fc99f5, 0x00005a23, 0x0062b48f, 0x0055d1e5, 0x00feaa74, 0x00157d3d}}, Y: Field{[10]uint32{0x0302d15f, 0x01486d2e, 0x03e0f662, 0x02b6db8f, 0x03d015a4, 0x01f7fb0f, 0x027b8945, 0x0132139d, 0x020563f2, 0x00203b3a}}}, + {X: Field{[10]uint32{0x00e93cee, 0x00dfda38, 0x03e0d0b1, 0x035d335c, 0x02f04a60, 0x0136ccdf, 0x0357c4ae, 0x01fccfe8, 0x02cf402f, 0x0025695a}}, Y: Field{[10]uint32{0x036501fd, 0x0086d3bb, 0x021a4bd5, 0x038f396d, 0x01d21c89, 0x00c326b9, 0x034e72ca, 0x02ea105b, 0x01bfb7c9, 0x0039c901}}}, + {X: Field{[10]uint32{0x027a2aac, 0x02206ae3, 0x03cd64b0, 0x03fc1266, 0x03c2a697, 0x00daa5e0, 0x0034b7bc, 0x01eed44c, 0x0190b50d, 0x000a2a7f}}, Y: Field{[10]uint32{0x0394a788, 0x00fea8e5, 0x01720b58, 0x03d453e8, 0x01a37cfa, 0x005421e0, 0x02635968, 0x01fa9268, 0x01b05c7e, 0x001dac54}}}, + {X: Field{[10]uint32{0x0334b672, 0x03e97bf9, 0x0393cb36, 0x034e6736, 0x00b571e2, 0x02b0e3ac, 0x0116b93e, 0x018b1290, 0x01136d64, 0x001901b7}}, Y: Field{[10]uint32{0x01d7fd1e, 0x03a8d617, 0x0274fdef, 0x006a5df6, 0x01b4c5eb, 0x00aa447e, 0x019c9d06, 0x0398514b, 0x037b92b8, 0x000e5d31}}}, + {X: Field{[10]uint32{0x01066529, 0x022d99bc, 0x003c2e3c, 0x01f8dd9c, 0x029d40c3, 0x024cdd1f, 0x03ef9039, 0x03870253, 0x023fcb62, 0x0023f63c}}, Y: Field{[10]uint32{0x014ab5c8, 0x003815c3, 0x02baf310, 0x004c8244, 0x025ba190, 0x016498a5, 0x029099d7, 0x005d6c92, 0x039bde10, 0x0022c2cb}}}, + {X: Field{[10]uint32{0x03a1a24b, 0x03bb0558, 0x023cc3e0, 0x02acb49c, 0x03cc525b, 0x02325390, 0x00679bdc, 0x01cda270, 0x022bd445, 0x00145e02}}, Y: Field{[10]uint32{0x00e01109, 0x000fe8bc, 0x03dfc646, 0x028cd4c3, 0x014b6b08, 0x024e4713, 0x006e5db2, 0x02347b1d, 0x019b0e17, 0x001409b3}}}, + {X: Field{[10]uint32{0x00283561, 0x02d0aa63, 0x01065bee, 0x00d1a123, 0x025b8c85, 0x0364e772, 0x02fe0e5c, 0x03e6fcf4, 0x013ae7c7, 0x002a8052}}, Y: Field{[10]uint32{0x00da82d9, 0x0220440b, 0x030f0e9e, 0x0022cf84, 0x021783e9, 0x006678f4, 0x023af145, 0x02d78d91, 0x03454a42, 0x002823c2}}}, + {X: Field{[10]uint32{0x00ceab70, 0x029814c6, 0x01afb97f, 0x035065b3, 0x010e4456, 0x01a89fa0, 0x001c4fad, 0x039b52b2, 0x0349d4bb, 0x003362ad}}, Y: Field{[10]uint32{0x01f59beb, 0x00bc6e17, 0x01231da3, 0x020ec14a, 0x01ca8621, 0x0335eb4f, 0x01c92493, 0x02883780, 0x0339bd68, 0x003f1b1d}}}, + {X: Field{[10]uint32{0x01fe3e32, 0x02fb1715, 0x027eae00, 0x03871668, 0x02379f56, 0x002ed221, 0x017bc54e, 0x014079e8, 0x02f2e824, 0x0039a737}}, Y: Field{[10]uint32{0x02c41cd4, 0x03616362, 0x03c80f41, 0x0399b12e, 0x013fe735, 0x018a45e4, 0x0125338f, 0x014e6040, 0x01104037, 0x0003a03b}}}, + {X: Field{[10]uint32{0x03ff8a8d, 0x00623836, 0x004a2f30, 0x01a5e406, 0x00f6b6ec, 0x038c6073, 0x0308af19, 0x007dfbbe, 0x02d9182b, 0x0016939c}}, Y: Field{[10]uint32{0x01f9da19, 0x0049408b, 0x00bee2d9, 0x0189ed6c, 0x017b62ea, 0x02b0ce97, 0x031c5885, 0x015f60ec, 0x03f2d5a8, 0x000b473d}}}, + {X: Field{[10]uint32{0x00984a2b, 0x00f46d7e, 0x0330a8f2, 0x01517740, 0x020d78f1, 0x024829e7, 0x00416b03, 0x01884504, 0x005948bd, 0x00278002}}, Y: Field{[10]uint32{0x008e3f62, 0x00459d32, 0x03338db6, 0x01683634, 0x00151ab8, 0x036c37f2, 0x030680ce, 0x03f4f308, 0x00920412, 0x000dab81}}}, + {X: Field{[10]uint32{0x018bc6ff, 0x00bc84c9, 0x00d18ac8, 0x0217c2f2, 0x0399f884, 0x03a90971, 0x02d35d4a, 0x021cd3b2, 0x03aeb12f, 0x001f82e5}}, Y: Field{[10]uint32{0x01f3946e, 0x01902d5a, 0x037bccc7, 0x01011a4b, 0x00ab95fb, 0x02c2db97, 0x003b0b8a, 0x006da8ff, 0x0224a4be, 0x0039dbd3}}}, + {X: Field{[10]uint32{0x01038ee2, 0x00cdb198, 0x00c860b9, 0x039606f8, 0x02b3064b, 0x019e1e3e, 0x0281ff28, 0x03125772, 0x00fb1bdf, 0x00188a17}}, Y: Field{[10]uint32{0x009b5161, 0x013705e1, 0x024f771f, 0x0360869b, 0x00a65ca8, 0x03c56775, 0x0285ea08, 0x03a7cd03, 0x03e45f60, 0x003cb246}}}, + {X: Field{[10]uint32{0x02c82623, 0x03c49aa9, 0x00ac8006, 0x02ebbbcf, 0x00cd3765, 0x01b57067, 0x01870ef3, 0x02d735a6, 0x02812de1, 0x001c08d3}}, Y: Field{[10]uint32{0x01330736, 0x00e6ee10, 0x036ec071, 0x01a43f56, 0x023140f7, 0x0011ce2e, 0x03f3c920, 0x029ddc98, 0x018a0f92, 0x0038b6fe}}}, + {X: Field{[10]uint32{0x015db07d, 0x025e29f3, 0x025e6136, 0x0399fd2f, 0x037dc1b4, 0x010d2c29, 0x0240ef57, 0x035737b7, 0x00618f31, 0x002b9dc1}}, Y: Field{[10]uint32{0x013d16e6, 0x034fa4f6, 0x03b01d46, 0x004a5459, 0x005cc43e, 0x001d00df, 0x0120e420, 0x01121cfd, 0x01646558, 0x00293894}}}, + {X: Field{[10]uint32{0x006f2b53, 0x0126dbc9, 0x026049e3, 0x039f590f, 0x005b7f4c, 0x01a39825, 0x02b78fb7, 0x01a62d22, 0x008fe4db, 0x0033b1eb}}, Y: Field{[10]uint32{0x025fadfb, 0x01b4006d, 0x03c325ca, 0x03d2035a, 0x017f5d3c, 0x0293f20c, 0x03bfd2a7, 0x001a150c, 0x01459933, 0x001246ed}}}, + {X: Field{[10]uint32{0x005eee36, 0x013571df, 0x006658db, 0x033f0bfe, 0x010852e4, 0x01588a5e, 0x02f62e83, 0x03927c9d, 0x0296b051, 0x002009db}}, Y: Field{[10]uint32{0x002f6d9d, 0x035f713d, 0x0330cf06, 0x0394dccf, 0x002c4d4c, 0x03dd44e9, 0x00d526e5, 0x0227c21c, 0x02968825, 0x003d4435}}}, + {X: Field{[10]uint32{0x0285b27d, 0x0110c5f6, 0x02741b89, 0x03260af6, 0x00e9e351, 0x03e3e142, 0x0163934e, 0x03eabb98, 0x03d49d85, 0x002c6409}}, Y: Field{[10]uint32{0x0247a824, 0x02ecdcba, 0x002d6dba, 0x0048815d, 0x028439f8, 0x00bac10b, 0x038443af, 0x039a72cd, 0x01cbdec0, 0x00304918}}}, + {X: Field{[10]uint32{0x030c792c, 0x0016cb95, 0x0308129e, 0x01bfef10, 0x01989c65, 0x02b851fc, 0x013fc78a, 0x0300074f, 0x014acf07, 0x0015d667}}, Y: Field{[10]uint32{0x018514b0, 0x02ef7100, 0x03a23f13, 0x03ce4042, 0x0238b57a, 0x02d2d3c0, 0x00e181b1, 0x02e85b86, 0x020fd215, 0x00173e3a}}}, + {X: Field{[10]uint32{0x02e6e4b7, 0x01b9063a, 0x01490bad, 0x0230ac1f, 0x00306e6f, 0x014f9d8f, 0x03cda2b6, 0x002e0b14, 0x0283fa11, 0x0016add8}}, Y: Field{[10]uint32{0x015e8ea0, 0x00deaead, 0x02884f74, 0x01c9058a, 0x03aebe82, 0x00decfe0, 0x027de95b, 0x01e38c5e, 0x0243cc2a, 0x003fcd95}}}, + {X: Field{[10]uint32{0x019d4a85, 0x000f9fe5, 0x00898649, 0x03910943, 0x0266ea88, 0x02800c77, 0x012dd45f, 0x035edfa9, 0x01e48602, 0x001ee4f6}}, Y: Field{[10]uint32{0x022b52f0, 0x01474cc5, 0x01099a48, 0x01807cab, 0x030f6dd0, 0x03beb5b0, 0x00f50a0f, 0x007fa428, 0x02015ab9, 0x0026732c}}}, + {X: Field{[10]uint32{0x0396ebb6, 0x038b38be, 0x00a9307e, 0x0086e584, 0x011de26a, 0x02cded2e, 0x0101be72, 0x009dd904, 0x00b6af64, 0x000b561e}}, Y: Field{[10]uint32{0x00fc585a, 0x012f5f0b, 0x018f547d, 0x01aedf48, 0x00a88706, 0x019c5bcb, 0x00815d94, 0x00013a08, 0x005ddf4b, 0x0004e3b8}}}, + {X: Field{[10]uint32{0x0160af3b, 0x00c9a739, 0x03ee7ac1, 0x03d4e33e, 0x03cf1ccf, 0x039072d5, 0x00a0fce2, 0x00cb6809, 0x0068eebc, 0x000758dc}}, Y: Field{[10]uint32{0x0276eadb, 0x0333f4b0, 0x009ed1b4, 0x0252dfba, 0x02d589a4, 0x0377282b, 0x005ce542, 0x0191159a, 0x01f1a289, 0x001aa4cb}}}, + {X: Field{[10]uint32{0x027de64c, 0x0273c111, 0x029a3947, 0x03bc3fa4, 0x0326a478, 0x0244ac15, 0x0187a680, 0x0048d7cc, 0x036b460e, 0x0020aeae}}, Y: Field{[10]uint32{0x0345647f, 0x00227844, 0x00faff51, 0x0068c9f4, 0x015de43a, 0x013560da, 0x033c11c9, 0x000e5807, 0x0233603d, 0x000ea7d3}}}, + {X: Field{[10]uint32{0x0348090a, 0x01b72a82, 0x01262c27, 0x00d0306e, 0x00a01c51, 0x036ab984, 0x03d899a9, 0x016ff6d8, 0x031d4e71, 0x002ba1b9}}, Y: Field{[10]uint32{0x00fd7b5e, 0x00778a53, 0x02126a30, 0x020e7271, 0x006f2f9e, 0x02d1619e, 0x02c4df93, 0x023deffa, 0x008bfcae, 0x000d592d}}}, + {X: Field{[10]uint32{0x02a413e8, 0x01d0d90a, 0x0000ef57, 0x02f247d0, 0x02664c50, 0x007accad, 0x02d6ad7f, 0x00730fd2, 0x02fbfc66, 0x000d6970}}, Y: Field{[10]uint32{0x02d6cde5, 0x006f33b2, 0x02752711, 0x0249332b, 0x01b901d6, 0x022a0721, 0x00727826, 0x019920f8, 0x01a2887f, 0x0012940a}}}, + {X: Field{[10]uint32{0x0058e2dc, 0x01ac1a56, 0x0360ecbc, 0x0259b1b5, 0x02763244, 0x03494766, 0x027c29ad, 0x00229d87, 0x007f4dd5, 0x000e1afc}}, Y: Field{[10]uint32{0x02407696, 0x006b61f7, 0x01f41e81, 0x008456a0, 0x020f07c6, 0x023ec52c, 0x0103e196, 0x0280e076, 0x00049c1f, 0x00353c52}}}, + {X: Field{[10]uint32{0x02346f96, 0x0379aa84, 0x00909fab, 0x01f32f5c, 0x03f9c46c, 0x02441361, 0x02c445ec, 0x03d33142, 0x001c9bd6, 0x0037fb0e}}, Y: Field{[10]uint32{0x017553f1, 0x033fc09e, 0x03f2e56c, 0x01da922d, 0x03d1ce0f, 0x0365a516, 0x017ef3ca, 0x01926f7e, 0x00f825b6, 0x00179cd1}}}, + {X: Field{[10]uint32{0x002abbb2, 0x0307aa21, 0x00aaa007, 0x000b48d6, 0x02f8a243, 0x03a82ff0, 0x013e0b70, 0x00133152, 0x00c604db, 0x000d81b7}}, Y: Field{[10]uint32{0x0287301d, 0x011f9e15, 0x025edbb5, 0x02c6f880, 0x0387eea8, 0x03b28d99, 0x03569a1f, 0x026dd2e2, 0x003bbc4d, 0x0029721d}}}, + {X: Field{[10]uint32{0x012b0016, 0x014a0979, 0x012b6660, 0x00e239db, 0x00db0860, 0x007464a8, 0x03025a47, 0x025b8a68, 0x0337e190, 0x000d1079}}, Y: Field{[10]uint32{0x01eef0da, 0x02d83de0, 0x01b9e7db, 0x0128de18, 0x015eb9bd, 0x02c8ce8e, 0x003ad47b, 0x032639cf, 0x037ed5ca, 0x0001b443}}}, + {X: Field{[10]uint32{0x02636e99, 0x01504289, 0x03030002, 0x02fd737f, 0x01b1d902, 0x015aa73d, 0x02a7a5c4, 0x0230d2d7, 0x002e460d, 0x002cb25f}}, Y: Field{[10]uint32{0x02057b7c, 0x0227a8f8, 0x02bfa232, 0x007c9c85, 0x021f151e, 0x03da5cf8, 0x03417b3c, 0x03bcc1d4, 0x0081a8c8, 0x0019c4cc}}}, + {X: Field{[10]uint32{0x03e045fd, 0x03054055, 0x01a973b6, 0x02dcf6d1, 0x019b7932, 0x016409ed, 0x03fdabed, 0x00f773e3, 0x018b59a4, 0x0009d02f}}, Y: Field{[10]uint32{0x03b02a85, 0x01e01fa4, 0x0182e1ea, 0x0392c3af, 0x03987aab, 0x0304ddd4, 0x00787a63, 0x006b50b0, 0x02b1f69f, 0x002041bc}}}, + {X: Field{[10]uint32{0x01b6c21b, 0x01597862, 0x009a69ee, 0x01a76331, 0x00aaa8e2, 0x00fe5003, 0x00b4f400, 0x02530336, 0x03d9bdbd, 0x00286b3f}}, Y: Field{[10]uint32{0x02f0235b, 0x0305afc3, 0x00a66df7, 0x03033065, 0x00bcc4fd, 0x03d393d1, 0x00acfbd4, 0x03d4625d, 0x017e0733, 0x0018bb1f}}}, + {X: Field{[10]uint32{0x03349847, 0x007d05d5, 0x00cff630, 0x02f4ccb6, 0x019a5357, 0x00e34eab, 0x038c0f15, 0x012b30c9, 0x02d68d52, 0x00142eca}}, Y: Field{[10]uint32{0x03acfb32, 0x00d4a1fe, 0x03139b85, 0x039659df, 0x02ba4b33, 0x03bc062e, 0x03d4c6e1, 0x009af6e5, 0x03d5d035, 0x00363f0c}}}, + {X: Field{[10]uint32{0x034fdbd9, 0x03420e17, 0x0132ec9f, 0x02823f43, 0x01948e2c, 0x008a2040, 0x035e8601, 0x02d3eb59, 0x02626031, 0x003af7ec}}, Y: Field{[10]uint32{0x000dbf2e, 0x018a69e9, 0x02a0a9c4, 0x010a2546, 0x034f853a, 0x019b8c66, 0x03964e44, 0x0044f76c, 0x026cc470, 0x002c1e01}}}, + {X: Field{[10]uint32{0x018bd48f, 0x022dd0ba, 0x001f63a4, 0x03e05c55, 0x01d57b35, 0x0023f56b, 0x02f73e82, 0x00a8bef7, 0x00236548, 0x00176bd3}}, Y: Field{[10]uint32{0x0287f967, 0x031d728b, 0x0327db2c, 0x03cb08c0, 0x009cbd11, 0x03e8f7fb, 0x03fc83c4, 0x02181fd7, 0x03cb5a24, 0x0024056f}}}, + {X: Field{[10]uint32{0x028533c7, 0x0147327b, 0x0277d085, 0x017cac4a, 0x01238c90, 0x00d4fe09, 0x0219517f, 0x0020519e, 0x00205d84, 0x0008b6e7}}, Y: Field{[10]uint32{0x006dcdf8, 0x01c0e2ce, 0x0231c85f, 0x00a6d811, 0x027ad19e, 0x02e6b3c3, 0x02192642, 0x00a8a28c, 0x03c82343, 0x001a0286}}}, + {X: Field{[10]uint32{0x00c100ae, 0x01ca1875, 0x00d4f4db, 0x016111a5, 0x019fb446, 0x021b9b95, 0x0225213f, 0x02f94649, 0x01d102e8, 0x0010110d}}, Y: Field{[10]uint32{0x011586d1, 0x0213de1b, 0x00f4cb62, 0x016a5078, 0x02dd734e, 0x03e09246, 0x02047768, 0x03bbeba3, 0x0282b321, 0x0027af39}}}, + {X: Field{[10]uint32{0x0037530f, 0x00994cba, 0x009f260c, 0x027331a7, 0x00fe59df, 0x0354b687, 0x0200d1a3, 0x029b7be1, 0x02ff6831, 0x003730db}}, Y: Field{[10]uint32{0x0377a893, 0x0256b307, 0x014d65b7, 0x03fda643, 0x03b6b385, 0x01e159b2, 0x0298c135, 0x02dfa17a, 0x01e67360, 0x0021826d}}}, + {X: Field{[10]uint32{0x001a1514, 0x014f9e67, 0x019a8b43, 0x0101178b, 0x00e991d1, 0x018cf2d2, 0x004cd04c, 0x00e0f929, 0x03941a1c, 0x003bc37e}}, Y: Field{[10]uint32{0x036f6f42, 0x01721abd, 0x006d461e, 0x02f0f8cd, 0x019c3599, 0x01a4fb41, 0x033afabf, 0x017e6adc, 0x0160f2a7, 0x00009a17}}}, + {X: Field{[10]uint32{0x01766b8a, 0x02f14dc7, 0x01b3086a, 0x02eb6758, 0x02410b0f, 0x03299ac1, 0x012e18f2, 0x03bf5ad3, 0x00fdc6c3, 0x00092213}}, Y: Field{[10]uint32{0x00e2267d, 0x01ec5f6b, 0x0119e465, 0x0066a9a1, 0x0086a786, 0x0288f04c, 0x015c6bf8, 0x036a9f4e, 0x008566f3, 0x001f0737}}}, + {X: Field{[10]uint32{0x02cd8b20, 0x01d18c92, 0x01a450de, 0x00219e36, 0x01485b07, 0x0206dbc1, 0x0207756f, 0x012a04b1, 0x0291c700, 0x001506d9}}, Y: Field{[10]uint32{0x01c609d7, 0x0179d931, 0x0117fc7f, 0x037eba61, 0x00cefff3, 0x008e0de1, 0x009f0d50, 0x010a6b1d, 0x03018a3c, 0x0037733c}}}, + {X: Field{[10]uint32{0x01fa822d, 0x0090b068, 0x03b9a138, 0x0322ee76, 0x02f792cf, 0x03c7e0a5, 0x005eea4f, 0x00b8fea4, 0x01696726, 0x0001518a}}, Y: Field{[10]uint32{0x01e6880e, 0x02b6ff88, 0x0218570d, 0x01c043db, 0x03da2d73, 0x02195967, 0x02d8e7f9, 0x02549d3e, 0x02898e42, 0x0018c048}}}, + {X: Field{[10]uint32{0x00848e83, 0x0200833b, 0x01f6d6e1, 0x01241b3a, 0x003ddfd9, 0x001185bf, 0x0122bb97, 0x004a7734, 0x0112ad2c, 0x002501c2}}, Y: Field{[10]uint32{0x0314017b, 0x02e9b66d, 0x01536d1f, 0x03e0ad5c, 0x00b5d261, 0x0169cca9, 0x0101080b, 0x0327c532, 0x00e56bfa, 0x00270ece}}}, + {X: Field{[10]uint32{0x023ca6c9, 0x02e4a95b, 0x020173ed, 0x0180d94e, 0x02ea73b0, 0x00505ee4, 0x028071cc, 0x01987abe, 0x00e48ddc, 0x000a98cc}}, Y: Field{[10]uint32{0x03fc7d79, 0x01d878f0, 0x016f3d8b, 0x00e1ad54, 0x035802bc, 0x02fd3eea, 0x02d56a3f, 0x030d42e8, 0x01cd4754, 0x002ce314}}}, + {X: Field{[10]uint32{0x03f7424d, 0x02c11eb4, 0x00c39dac, 0x0071fbf1, 0x008c418c, 0x03fd69f5, 0x024078c5, 0x03685d6b, 0x00935f95, 0x002450b9}}, Y: Field{[10]uint32{0x0085cd05, 0x022b732e, 0x02ac0e69, 0x01fd629f, 0x0137d0ab, 0x0293e6c1, 0x0284ea55, 0x00cea7a1, 0x0274c471, 0x00054596}}}, + {X: Field{[10]uint32{0x0285804d, 0x03a995b2, 0x0169ad1e, 0x01c9ff2f, 0x000bb8d3, 0x022351fa, 0x0263ef38, 0x0137bb6e, 0x03295cac, 0x000b8662}}, Y: Field{[10]uint32{0x0380fd52, 0x01ae7b19, 0x02e63067, 0x01a07148, 0x00eb3824, 0x02c720c3, 0x02b0c2b1, 0x03fef854, 0x01b3e700, 0x000c7757}}}, + {X: Field{[10]uint32{0x0272f72d, 0x03d4db2c, 0x0264e5a3, 0x038befc0, 0x0032a671, 0x02f66f16, 0x023e52a7, 0x032bebc4, 0x01e9b2ef, 0x002d138d}}, Y: Field{[10]uint32{0x02a43423, 0x005a9696, 0x02b0871c, 0x0304e4d2, 0x03f80c81, 0x0090f992, 0x032b80a1, 0x027f5098, 0x03e3beb3, 0x00235227}}}, + {X: Field{[10]uint32{0x003a3cd7, 0x037d906e, 0x013beefd, 0x02d6439b, 0x00f609f0, 0x008918f7, 0x02cf365c, 0x012db6d7, 0x0101e132, 0x0037266b}}, Y: Field{[10]uint32{0x0111b682, 0x03f921bb, 0x003decf0, 0x02511e81, 0x03a4c1e7, 0x00e4f021, 0x000ad6a4, 0x02fabccb, 0x02ca2fea, 0x002d2d08}}}, + {X: Field{[10]uint32{0x0162a359, 0x03146ebe, 0x0237648f, 0x03f3a8a1, 0x013029eb, 0x021a3d34, 0x02af89bb, 0x0070b73e, 0x038eeb99, 0x00385d20}}, Y: Field{[10]uint32{0x00e7570b, 0x016b4aa8, 0x01ec70c0, 0x018a086a, 0x000238dc, 0x0369731d, 0x031b60a4, 0x0377252e, 0x008727cb, 0x003e0373}}}, + {X: Field{[10]uint32{0x02583d33, 0x00437ea8, 0x0349765d, 0x0062d5a2, 0x014ca21d, 0x02dce7ad, 0x00d79a48, 0x005b510b, 0x018b15bd, 0x0018900d}}, Y: Field{[10]uint32{0x00ec2d00, 0x00f0375b, 0x0013fa61, 0x005b7ccd, 0x01fc5461, 0x0290db54, 0x02d8caa8, 0x01d543b5, 0x014d724e, 0x001ab2c1}}}, + {X: Field{[10]uint32{0x023f8d70, 0x01a0d0b9, 0x007b2e62, 0x01dcb070, 0x02aa61c0, 0x03f4ebde, 0x03a29b4b, 0x02b03d50, 0x00eb560a, 0x0029d5ff}}, Y: Field{[10]uint32{0x000352da, 0x0031033d, 0x0057b39d, 0x01419d25, 0x02b4c074, 0x02f1a880, 0x00713e27, 0x015743ed, 0x02eff808, 0x00161933}}}, + {X: Field{[10]uint32{0x03777bba, 0x02f5044b, 0x008143a1, 0x02602f1d, 0x01d4b1f4, 0x03942746, 0x02e94162, 0x00527640, 0x007357c3, 0x003cdb84}}, Y: Field{[10]uint32{0x03d1993e, 0x02a5a60e, 0x0025a14a, 0x010de3c3, 0x0045f74b, 0x01b0ff92, 0x00d93967, 0x009a4f90, 0x022d139a, 0x003535f6}}}, + {X: Field{[10]uint32{0x024af99a, 0x01a75648, 0x0020b172, 0x013f3125, 0x004a8e0e, 0x0189dfbc, 0x0134949b, 0x003fdc4e, 0x014b55a4, 0x00213bcb}}, Y: Field{[10]uint32{0x01ea73a6, 0x020c2161, 0x03e3e80a, 0x01d9d53b, 0x0260465e, 0x02c759d4, 0x03f2b7a0, 0x01423d97, 0x00b701d3, 0x0015ebff}}}, + {X: Field{[10]uint32{0x03ce7576, 0x01e1e10f, 0x03f4784f, 0x037d022c, 0x0296b046, 0x03fca2eb, 0x02fdca34, 0x03d9b5f7, 0x024b274f, 0x0004e3bd}}, Y: Field{[10]uint32{0x02e1ecf1, 0x021546ff, 0x03d4ced9, 0x004bb929, 0x01dfe979, 0x000c94bb, 0x02010cbd, 0x01f10d04, 0x00e51d51, 0x003af741}}}, + {X: Field{[10]uint32{0x011f318c, 0x032d820f, 0x0189b435, 0x00a38b66, 0x032d4547, 0x01434c15, 0x02a11455, 0x015a4884, 0x03fe2ba0, 0x003a0bc0}}, Y: Field{[10]uint32{0x0012dcda, 0x017d8fd6, 0x010f2eb2, 0x00dd8099, 0x03613b29, 0x028d3848, 0x02aaf1fe, 0x0162064a, 0x03b9cf29, 0x0006469b}}}, + {X: Field{[10]uint32{0x02afb317, 0x02f4b216, 0x0296be44, 0x02630346, 0x00111170, 0x03cd17b0, 0x035fb3e7, 0x01beb1fa, 0x0000676b, 0x0015a9a1}}, Y: Field{[10]uint32{0x031dfb4e, 0x016c33a7, 0x0194903f, 0x03f33874, 0x02f49ff2, 0x03106067, 0x01dcb5f4, 0x02df316e, 0x027a5ae1, 0x000e9060}}}, + {X: Field{[10]uint32{0x001309f5, 0x028f0cb7, 0x010084ef, 0x006b9029, 0x028f735b, 0x007c9982, 0x02fe255e, 0x00f6d3ce, 0x007f1b35, 0x0020bd5d}}, Y: Field{[10]uint32{0x024a0144, 0x02a64189, 0x03bd7dd5, 0x028a933d, 0x03d05f9e, 0x0055caef, 0x007e4c67, 0x03007dfa, 0x0103f4cc, 0x0010ba2e}}}, + {X: Field{[10]uint32{0x02e0cf13, 0x02b5651d, 0x002bb0bf, 0x03040678, 0x0280ef76, 0x01dacc4d, 0x0389e0c3, 0x00659292, 0x0141c47b, 0x002244da}}, Y: Field{[10]uint32{0x002d3f3b, 0x01d4de8b, 0x0221af6f, 0x01641dfd, 0x01d722e6, 0x005df18d, 0x0071bc50, 0x01593fd2, 0x0385fb6a, 0x002ce8a9}}}, + {X: Field{[10]uint32{0x02238909, 0x018297d0, 0x01df1c73, 0x02ee5d9c, 0x010b9954, 0x03bd7628, 0x030cb51e, 0x03d60003, 0x01690c98, 0x00318942}}, Y: Field{[10]uint32{0x018ec724, 0x01cc68c1, 0x01240219, 0x0365ac7b, 0x01552d5b, 0x0065f83a, 0x013f935e, 0x02ac8937, 0x024c915e, 0x0020f40c}}}, + {X: Field{[10]uint32{0x03c7e3b4, 0x0047f523, 0x00184274, 0x02377439, 0x01ad1293, 0x03aa6761, 0x024a481d, 0x00c80119, 0x02d96391, 0x00388e66}}, Y: Field{[10]uint32{0x03c69d47, 0x01537e24, 0x03298f9b, 0x0287ec43, 0x005d8b1f, 0x02270de0, 0x02836ed3, 0x00a388ba, 0x0162beae, 0x00183fff}}}, + {X: Field{[10]uint32{0x0003d959, 0x03e0870c, 0x007b85a1, 0x035f09f3, 0x020a59c5, 0x032345e5, 0x02383d6c, 0x00a64a69, 0x031c186d, 0x00013402}}, Y: Field{[10]uint32{0x02487640, 0x00c9fa33, 0x01cb4687, 0x0375be35, 0x02dd4aa3, 0x002df1f9, 0x01c8ce7a, 0x0067f527, 0x02d127eb, 0x0021d4ba}}}, + {X: Field{[10]uint32{0x0264121e, 0x025ceba4, 0x003185ea, 0x028d6591, 0x00933cbf, 0x02df8712, 0x02548e98, 0x014b246a, 0x03ef8b8b, 0x000d1198}}, Y: Field{[10]uint32{0x014d9efd, 0x02b9d814, 0x02b06dfe, 0x01738bdc, 0x036fe388, 0x02fa959c, 0x017e6240, 0x023bb2e5, 0x01c89dfe, 0x001cf426}}}, + {X: Field{[10]uint32{0x00de6648, 0x0222ef68, 0x019e35c7, 0x0355f28c, 0x03f411d3, 0x02526d3c, 0x03038d47, 0x00aa60cc, 0x004ddbd2, 0x000dffd2}}, Y: Field{[10]uint32{0x00547c67, 0x02b9aa48, 0x00bfba9a, 0x021a0e60, 0x03a45cf0, 0x03b07d70, 0x03b14554, 0x0236074b, 0x014b5161, 0x0015694e}}}, + {X: Field{[10]uint32{0x03556ca5, 0x0256c185, 0x012e14d7, 0x01c035bc, 0x00d2881f, 0x0331b4f6, 0x01339d14, 0x0019ae42, 0x01db0ad5, 0x0033cef3}}, Y: Field{[10]uint32{0x01678a6f, 0x025e91c4, 0x000b13c1, 0x03dc22df, 0x00b61b90, 0x009d8089, 0x020e4023, 0x003c8188, 0x02bc99e2, 0x003849a1}}}, + {X: Field{[10]uint32{0x01a73402, 0x000bb7d7, 0x00d4149f, 0x02852606, 0x03d35e47, 0x00f5d296, 0x00f91101, 0x0346b28e, 0x02e7db8f, 0x00258740}}, Y: Field{[10]uint32{0x01fed240, 0x0014561c, 0x0282a1db, 0x02b7f8be, 0x01765dc8, 0x03fc85fa, 0x0115ca3b, 0x019df059, 0x02acd698, 0x002518ba}}}, + {X: Field{[10]uint32{0x006ec3ba, 0x02be5fad, 0x0135c5e1, 0x00901169, 0x003648b7, 0x01d2052b, 0x0122ca60, 0x02399497, 0x0390574a, 0x0010f98b}}, Y: Field{[10]uint32{0x01939734, 0x01a8d6cf, 0x033a318f, 0x02167b71, 0x03e141dc, 0x00634140, 0x029e20ed, 0x033c5e4d, 0x025617c1, 0x001b7bc2}}}, + {X: Field{[10]uint32{0x03dfdbb7, 0x02001495, 0x0116033b, 0x02d2a58b, 0x020457e4, 0x0237a4ec, 0x02113cf9, 0x000630d4, 0x03799d79, 0x00279a0a}}, Y: Field{[10]uint32{0x0049041b, 0x00fb1754, 0x001e93f2, 0x0153ba6a, 0x01b29833, 0x010174b2, 0x00468a06, 0x018d0e27, 0x0316bfe9, 0x00276e72}}}, + {X: Field{[10]uint32{0x01a1a8b4, 0x021db935, 0x008f9436, 0x0390800b, 0x025f9682, 0x02148064, 0x0222d130, 0x02d676ca, 0x03a78079, 0x001e4061}}, Y: Field{[10]uint32{0x03fa456e, 0x02564b2b, 0x004de17e, 0x0075a981, 0x02ade0ad, 0x01aa39aa, 0x014381e5, 0x00c600d9, 0x0346f6b4, 0x00009722}}}, + {X: Field{[10]uint32{0x00169583, 0x0339557c, 0x02b1d683, 0x030c356e, 0x01662a0d, 0x016887ff, 0x0222d653, 0x012cce67, 0x038a6c74, 0x0024a292}}, Y: Field{[10]uint32{0x026fcf84, 0x01373266, 0x01eaa75d, 0x03d9a1ff, 0x01323d55, 0x03fb21ea, 0x01af7e45, 0x02552f87, 0x0284c064, 0x000947fb}}}, + {X: Field{[10]uint32{0x02084c88, 0x01b0fd2f, 0x03fde6c1, 0x00fa6efe, 0x03a6ffb7, 0x03262e1b, 0x01872de8, 0x00bcb2b1, 0x00da8118, 0x001a13a2}}, Y: Field{[10]uint32{0x036383fe, 0x03c19173, 0x00bb60bf, 0x02c1abee, 0x03ad179e, 0x01d55eac, 0x01ae45ff, 0x018b5648, 0x019dfc9d, 0x0031146d}}}, + {X: Field{[10]uint32{0x01174343, 0x02defe93, 0x02f6cad7, 0x033aa165, 0x038e8166, 0x02526f3a, 0x00ebfa86, 0x02c335ea, 0x0283a403, 0x0022f74b}}, Y: Field{[10]uint32{0x00177172, 0x032f23ea, 0x03bad08c, 0x0167a7bf, 0x03643bb3, 0x03b24df0, 0x0307b2fe, 0x020be1f5, 0x014797f6, 0x001c8830}}}, + {X: Field{[10]uint32{0x02399543, 0x03a02c2f, 0x008b4b69, 0x01a791a5, 0x03b71958, 0x03e487da, 0x0258ef50, 0x01254a14, 0x03216e3c, 0x0030fe8e}}, Y: Field{[10]uint32{0x02ec1796, 0x03b654c2, 0x0310fc8e, 0x0285d22e, 0x015a519c, 0x0009b0b1, 0x00880503, 0x01986ddc, 0x00ed21f6, 0x003ac811}}}, + {X: Field{[10]uint32{0x037e63a2, 0x028e29eb, 0x02b483d6, 0x034b990a, 0x00195a8b, 0x0034d578, 0x01fb0df5, 0x00a564de, 0x0013eb2d, 0x0007018f}}, Y: Field{[10]uint32{0x030f2abb, 0x03d5cde1, 0x02ed7cfc, 0x01d1fd11, 0x02b00428, 0x0310389a, 0x005005c8, 0x027fd9d7, 0x0392d14c, 0x000814e3}}}, + {X: Field{[10]uint32{0x0331d452, 0x006d7803, 0x0399981f, 0x037841f8, 0x016c6086, 0x009f2d4e, 0x002dc6c2, 0x03063d2e, 0x03977b54, 0x00183019}}, Y: Field{[10]uint32{0x0098429a, 0x0157c637, 0x0013b737, 0x03dc2ab3, 0x02ce0e8b, 0x015ebebf, 0x03d2617b, 0x0046cb9b, 0x02c4e3eb, 0x000fd151}}}, + {X: Field{[10]uint32{0x02a36856, 0x03c022ff, 0x01722c0a, 0x00aebc61, 0x03421cdc, 0x008c7b62, 0x0263e90a, 0x01aaef3c, 0x03999225, 0x003f0573}}, Y: Field{[10]uint32{0x0235d798, 0x00d375f1, 0x0197e276, 0x025fd726, 0x00c01dbd, 0x0268efc9, 0x01d46e46, 0x00214dc3, 0x02a4d9c4, 0x002af8d1}}}, + {X: Field{[10]uint32{0x03249454, 0x023f9109, 0x02ee5c6f, 0x01a99649, 0x001a92b0, 0x0322c1ee, 0x00da262b, 0x00eedd0a, 0x01851817, 0x003d850e}}, Y: Field{[10]uint32{0x0301cf84, 0x00f38635, 0x004aab9f, 0x03a6731e, 0x0011fced, 0x02fa397a, 0x001f06d4, 0x01630835, 0x02ef3a25, 0x002c760c}}}, + {X: Field{[10]uint32{0x0261b5f5, 0x0085b73b, 0x00bc7ad5, 0x010c4275, 0x0301f1fd, 0x01a845aa, 0x02685427, 0x02110907, 0x00a96221, 0x0015e516}}, Y: Field{[10]uint32{0x0053e2d8, 0x0352d84b, 0x03e237bd, 0x01365eba, 0x0021274a, 0x00d6fb5c, 0x00c8d461, 0x015f1857, 0x007468c1, 0x000cf959}}}, + {X: Field{[10]uint32{0x01fe62e7, 0x01479e90, 0x023bd8c0, 0x0007f85f, 0x03abab20, 0x038d57a3, 0x0162678f, 0x0104cad5, 0x03dcb080, 0x0018dd54}}, Y: Field{[10]uint32{0x03572dce, 0x005e4826, 0x00d3c319, 0x025a1d38, 0x036989b2, 0x019ee853, 0x026a9511, 0x01b87fc6, 0x01c2ad58, 0x000a2f5b}}}, + {X: Field{[10]uint32{0x0180e2a3, 0x00dc8bad, 0x028ea66c, 0x036d5dfe, 0x0389e99d, 0x03953d60, 0x01ddb923, 0x02156f88, 0x030f6f64, 0x003baef5}}, Y: Field{[10]uint32{0x02fd4d68, 0x021a09cc, 0x00e1dedc, 0x0260f7d8, 0x007c9866, 0x034eb13b, 0x015606ea, 0x000d1529, 0x017915b5, 0x000f46da}}}, + {X: Field{[10]uint32{0x006c56fb, 0x0143909a, 0x01ddb2e3, 0x022db971, 0x023a6e88, 0x01de448d, 0x011135f3, 0x02c769a2, 0x031f2bf4, 0x0013b224}}, Y: Field{[10]uint32{0x02a09bc7, 0x0277c8d5, 0x019f535d, 0x004155a4, 0x003cbab9, 0x02370f8a, 0x03197704, 0x00c1aaf5, 0x02794c2b, 0x00357db1}}}, + {X: Field{[10]uint32{0x02e9730e, 0x03094eaf, 0x001a735b, 0x01733137, 0x018f4937, 0x03f571dc, 0x004deabf, 0x01f9e9f6, 0x0376fc5b, 0x001ad69f}}, Y: Field{[10]uint32{0x03b58af8, 0x0277d910, 0x00b7af8f, 0x02afdab6, 0x039eafb8, 0x006155d5, 0x02562df1, 0x017daac4, 0x01c48fbf, 0x0007a4d7}}}, + {X: Field{[10]uint32{0x02013af7, 0x0391e227, 0x00f27683, 0x03cc8753, 0x035f5b73, 0x01f8a601, 0x024c7591, 0x02562909, 0x01ebf620, 0x000a8c4a}}, Y: Field{[10]uint32{0x01020da4, 0x006487f4, 0x036c689a, 0x00be9b09, 0x01406673, 0x036e2b1f, 0x0346edef, 0x00a2cfe8, 0x01e4c1fc, 0x003a503d}}}, + {X: Field{[10]uint32{0x0328b5ab, 0x03d458ee, 0x02d124c6, 0x00ef120d, 0x0294a872, 0x02fcb209, 0x0307f345, 0x010fcde0, 0x001ce994, 0x00022ffa}}, Y: Field{[10]uint32{0x00433c71, 0x0192b0fc, 0x01348364, 0x01214b99, 0x0087de98, 0x02345de9, 0x028edc26, 0x017ebe5d, 0x0227857e, 0x00162c5b}}}, + {X: Field{[10]uint32{0x02d61be3, 0x00cdef62, 0x00f831c1, 0x024a8143, 0x01054236, 0x03934d5b, 0x039daf3e, 0x0159b4b4, 0x00d9449c, 0x0011e083}}, Y: Field{[10]uint32{0x0152c2e4, 0x03ca3326, 0x026655e5, 0x0232a6ba, 0x011200d3, 0x00bc9d11, 0x02d069d2, 0x02a04001, 0x02032988, 0x001237eb}}}, + {X: Field{[10]uint32{0x01a934e2, 0x03a64855, 0x01131cd6, 0x0149075f, 0x00f9e8dc, 0x0130fbca, 0x01221d88, 0x00d81627, 0x03ce8e45, 0x000b5fc0}}, Y: Field{[10]uint32{0x03ee9c72, 0x00ae3a2d, 0x0043a57a, 0x01c9b5b2, 0x0116a7b2, 0x00a1813e, 0x014d55fe, 0x03ce387c, 0x03c05a39, 0x0021052c}}}, + {X: Field{[10]uint32{0x01d8e37b, 0x008017a6, 0x0267f1dc, 0x01b2cec7, 0x03f5a5b0, 0x02109416, 0x0150d4ee, 0x02321b08, 0x00ec919d, 0x0020e21f}}, Y: Field{[10]uint32{0x02b4c009, 0x03ba5064, 0x03e327a2, 0x039fe620, 0x03fcea9d, 0x03962117, 0x0134fe12, 0x03ab89e3, 0x03cdf5c9, 0x003fb839}}}, + {X: Field{[10]uint32{0x01ca1e24, 0x037c6474, 0x010f3f37, 0x002469ed, 0x00a9d0b7, 0x01970ff8, 0x028c03f5, 0x02eac836, 0x01e1138b, 0x0001467e}}, Y: Field{[10]uint32{0x0261ba9e, 0x0300da86, 0x039eb367, 0x02a6b79a, 0x01ef6cd6, 0x0207a5bd, 0x0231ec07, 0x033908fd, 0x02fe2bff, 0x001935ae}}}, + {X: Field{[10]uint32{0x028fba61, 0x004eb652, 0x02e6c3cd, 0x03998fb7, 0x023946ff, 0x00a4d854, 0x02de2087, 0x01d3a9a6, 0x038f84bc, 0x0020247d}}, Y: Field{[10]uint32{0x030bda1a, 0x00ea7302, 0x02212fe1, 0x03b0e79e, 0x006765fa, 0x01c02aab, 0x03a5d90d, 0x01a23072, 0x018baf84, 0x0006aaa9}}}, + {X: Field{[10]uint32{0x02db3afc, 0x023a5f9e, 0x01bb49ed, 0x00815b35, 0x018388cf, 0x028dbc43, 0x02a53434, 0x015d21f0, 0x000dd3fe, 0x00142af0}}, Y: Field{[10]uint32{0x01ed25ea, 0x00390763, 0x015d68a8, 0x03640eb7, 0x01670fe0, 0x026e76c0, 0x0064f01d, 0x00103ec7, 0x019514b6, 0x002ae2eb}}}, + {X: Field{[10]uint32{0x02a2f110, 0x001dcacd, 0x0131faa2, 0x00b9b44a, 0x0120e572, 0x010dab9d, 0x024f2533, 0x007d12a7, 0x00bb4da0, 0x002a690a}}, Y: Field{[10]uint32{0x034c0c5f, 0x0321141d, 0x037a0557, 0x02da16d0, 0x00f8c226, 0x03e94f88, 0x00f05822, 0x0289b110, 0x021a1830, 0x002e8144}}}, + {X: Field{[10]uint32{0x007a83ce, 0x026c742b, 0x03ecf64e, 0x0396ddd4, 0x01d6948b, 0x0047a668, 0x03fa11b2, 0x0359ddc9, 0x03d46314, 0x0035ebf6}}, Y: Field{[10]uint32{0x00e21d04, 0x02e8734d, 0x008f480a, 0x03e945ca, 0x03ee9b2a, 0x0272d0aa, 0x010ed9d7, 0x012aee8e, 0x017d748a, 0x002d7e2e}}}, + {X: Field{[10]uint32{0x036de265, 0x00aaff66, 0x03a99d62, 0x006b5462, 0x0113f19b, 0x019cab15, 0x0141694b, 0x01119a8f, 0x034cd2b5, 0x000adae0}}, Y: Field{[10]uint32{0x02b9b0d6, 0x033b141e, 0x01df187c, 0x026e24b6, 0x0174ec84, 0x032facb9, 0x01d52dd3, 0x02cf4ab4, 0x0193ddc0, 0x00306489}}}, + {X: Field{[10]uint32{0x016ac8ea, 0x018326ea, 0x025a2513, 0x012c68fb, 0x03f29c34, 0x0270471a, 0x016ef7ea, 0x00fe8c56, 0x034ad7f9, 0x003ce4f3}}, Y: Field{[10]uint32{0x028133e1, 0x03b6ea9e, 0x027ec41b, 0x02ccd78e, 0x01fbfa56, 0x00341849, 0x02480163, 0x033bae43, 0x00a9de67, 0x0013a047}}}, + {X: Field{[10]uint32{0x008f418a, 0x0235d7a7, 0x03c0e084, 0x02f414be, 0x00bbc546, 0x028922a5, 0x03050120, 0x02c95204, 0x02504e14, 0x002f0ee4}}, Y: Field{[10]uint32{0x02a58223, 0x03bcab69, 0x022d9af0, 0x00e31d86, 0x018f5eca, 0x00475e31, 0x013a911f, 0x021f05d9, 0x03c6f8b4, 0x002694ab}}}, + {X: Field{[10]uint32{0x036055c0, 0x019fbbd7, 0x01cec014, 0x00eefdbe, 0x03e71edc, 0x02af6c7d, 0x021e1704, 0x03ee29cc, 0x0273c601, 0x000bd683}}, Y: Field{[10]uint32{0x0153e393, 0x00fd1099, 0x002ebc5a, 0x033c4f65, 0x02b79a5e, 0x03e01c84, 0x01d97f80, 0x00b2c4ee, 0x010d142d, 0x00362ec7}}}, + {X: Field{[10]uint32{0x03a54ae8, 0x00fb4d1c, 0x0215bfa1, 0x01efd72f, 0x018d8d8d, 0x0245b047, 0x01099b96, 0x01a6b213, 0x01e3b4fc, 0x002e0f94}}, Y: Field{[10]uint32{0x023dda5b, 0x00d970b2, 0x02a78f3f, 0x0211b876, 0x01daeb7a, 0x01f3f094, 0x0018084a, 0x00e48c88, 0x038869c5, 0x0008cb83}}}, + {X: Field{[10]uint32{0x03516377, 0x026902f9, 0x00c0ea24, 0x00c16423, 0x00e90e9b, 0x03ba2416, 0x032b3722, 0x01e8c854, 0x019350b0, 0x000425c6}}, Y: Field{[10]uint32{0x020a1055, 0x025adb96, 0x03f672c7, 0x03e7395b, 0x010dc735, 0x00c21e67, 0x023a3a5e, 0x0168126f, 0x027c7bd5, 0x001a682d}}}, + {X: Field{[10]uint32{0x005c4477, 0x009e88fa, 0x01647dcb, 0x0053051a, 0x02622508, 0x000a6774, 0x0171711a, 0x014063cf, 0x035cc95d, 0x0036fbbd}}, Y: Field{[10]uint32{0x00d66413, 0x01daa422, 0x0175335e, 0x038c72fe, 0x00676311, 0x03148dfe, 0x02a68556, 0x013e38ae, 0x02cd1633, 0x003751c4}}}, + {X: Field{[10]uint32{0x03af114f, 0x0201b55a, 0x00d29d96, 0x02239328, 0x03027238, 0x00ded043, 0x0005f185, 0x03a4e3cd, 0x01992bde, 0x000a32c4}}, Y: Field{[10]uint32{0x001e5aa3, 0x03afd2fa, 0x03fea695, 0x01b30a95, 0x01c3e2ef, 0x00e973a2, 0x029fc1e8, 0x0376078e, 0x03febbe5, 0x00039b18}}}, + {X: Field{[10]uint32{0x029f60ba, 0x02e8b893, 0x02da3790, 0x016b919d, 0x00caef38, 0x0273b175, 0x039f1768, 0x03a67997, 0x030b64ef, 0x003c28b7}}, Y: Field{[10]uint32{0x007a4519, 0x02db4520, 0x01a85713, 0x0081ef3c, 0x02006a25, 0x02a9df69, 0x0098c12a, 0x03d99051, 0x0208b900, 0x0029f29f}}}, + {X: Field{[10]uint32{0x002b0f00, 0x037ff952, 0x01410799, 0x001a6aec, 0x0254fe9b, 0x03d54c41, 0x007ad4f0, 0x010e5837, 0x02eb38e5, 0x00346ed1}}, Y: Field{[10]uint32{0x02ce4214, 0x007e48ba, 0x00b14a03, 0x00b2be4c, 0x00d03bbd, 0x01a09adb, 0x00a54639, 0x00c2d834, 0x019fe088, 0x00052c18}}}, + {X: Field{[10]uint32{0x0369517a, 0x00333807, 0x00a8415c, 0x00083152, 0x0185d740, 0x03074268, 0x01adb31a, 0x0049a97d, 0x02567705, 0x0009ef4b}}, Y: Field{[10]uint32{0x01468d32, 0x01e064a9, 0x0008f655, 0x02b61cd3, 0x03202690, 0x0238c0b5, 0x01ce428a, 0x00734a7e, 0x01d7cba2, 0x0004880f}}}, + {X: Field{[10]uint32{0x03d21d9c, 0x010c806f, 0x003bd61d, 0x0376e36f, 0x0355441a, 0x02cad9db, 0x03835efa, 0x038805a4, 0x03901c72, 0x001acb31}}, Y: Field{[10]uint32{0x02dd7456, 0x016ce8d2, 0x015601bd, 0x0014639d, 0x006690bb, 0x018bfce3, 0x03f90d4b, 0x00124f6b, 0x0006deea, 0x001665cd}}}, + {X: Field{[10]uint32{0x00840f27, 0x0027ed65, 0x012675df, 0x024f981f, 0x01c63c3b, 0x02ff35af, 0x02a8bcc6, 0x014f158c, 0x003f32f9, 0x001d7a17}}, Y: Field{[10]uint32{0x00b6bb30, 0x03c07b5b, 0x01c47723, 0x02832fdb, 0x00bc59ac, 0x0109b99a, 0x0324f89d, 0x031cf65a, 0x03768714, 0x0008bd68}}}, + {X: Field{[10]uint32{0x006d56a7, 0x00802e7e, 0x0268315e, 0x0149a314, 0x02f26e17, 0x038a3c79, 0x000eed57, 0x0054bd07, 0x0071969e, 0x0034de8c}}, Y: Field{[10]uint32{0x02ff6181, 0x0080d59d, 0x036d3abe, 0x030ed1d0, 0x0370e296, 0x025885c8, 0x004b1fbd, 0x00747437, 0x03269875, 0x0014f549}}}, + {X: Field{[10]uint32{0x03414976, 0x014407a9, 0x001d237d, 0x0262538d, 0x02676931, 0x03860eec, 0x01466408, 0x01a5ccd9, 0x03047f5e, 0x001c56ec}}, Y: Field{[10]uint32{0x01a968d4, 0x01827ba8, 0x01acadb7, 0x03ec0f60, 0x02a89dd1, 0x03a570f5, 0x01ea6722, 0x0357a1e9, 0x035f9e82, 0x000a1103}}}, + {X: Field{[10]uint32{0x02c642e8, 0x022b7df6, 0x0013968d, 0x0292c21f, 0x028e4924, 0x01a04bb0, 0x034a52cc, 0x0056569e, 0x002a4f5b, 0x003dcb45}}, Y: Field{[10]uint32{0x021087dd, 0x023e5e9d, 0x007a6537, 0x0333eebd, 0x00585486, 0x03165305, 0x02ab9bbb, 0x0010b3c5, 0x004bb5d8, 0x001406d9}}}, + {X: Field{[10]uint32{0x01284c26, 0x00ee58b0, 0x03f28024, 0x01b363ef, 0x00384084, 0x0291a7cd, 0x003cf020, 0x0228e97f, 0x038fb4ca, 0x001ecfbf}}, Y: Field{[10]uint32{0x01748579, 0x0240ad6c, 0x00522811, 0x01bbf544, 0x023bbf63, 0x03858408, 0x00bc5555, 0x01849294, 0x00fd1539, 0x002f8962}}}, + {X: Field{[10]uint32{0x02113dd8, 0x017f0de2, 0x018a59cc, 0x00d7fcad, 0x03ec2a70, 0x025d3933, 0x03652257, 0x03b29334, 0x00d771fb, 0x0009106a}}, Y: Field{[10]uint32{0x02447981, 0x00a624e0, 0x00fccae1, 0x00b64c5b, 0x00fe035d, 0x02b08cd8, 0x03f4c6a7, 0x019c4d2e, 0x03760531, 0x000152c1}}}, + {X: Field{[10]uint32{0x00cf7591, 0x03a68a85, 0x0024de78, 0x01f2d92e, 0x02512d09, 0x03d2ace1, 0x03916b12, 0x019f2916, 0x024ed054, 0x003083f2}}, Y: Field{[10]uint32{0x00eecc02, 0x008d56b9, 0x0346d02b, 0x022c8e33, 0x03931fc4, 0x036b4439, 0x007e69c9, 0x0101cb2a, 0x00c796ee, 0x0022146b}}}, + {X: Field{[10]uint32{0x009ec8e7, 0x024bac81, 0x01d67634, 0x01b5a437, 0x00a34c6c, 0x035d604c, 0x00e415aa, 0x01498edd, 0x028d0137, 0x000bdac3}}, Y: Field{[10]uint32{0x02f25dbe, 0x01354e36, 0x02868e38, 0x01d7d88d, 0x03adc722, 0x02d327d9, 0x02cb614e, 0x03da9e5d, 0x01f8438c, 0x003431e4}}}, + {X: Field{[10]uint32{0x02b665dd, 0x02e47aac, 0x00762c5a, 0x00f0f763, 0x01fc0037, 0x00dd36c8, 0x00b3ed11, 0x0015b5be, 0x01be426f, 0x002febf0}}, Y: Field{[10]uint32{0x010e2a2e, 0x00d84545, 0x02781684, 0x01429d64, 0x006dc400, 0x02841b69, 0x027b0710, 0x0000e9fe, 0x0297a4cf, 0x0027107c}}}, + {X: Field{[10]uint32{0x01cb4e8c, 0x024c1db3, 0x01be91df, 0x03dc5ca3, 0x03895980, 0x01d675d3, 0x0376f860, 0x0009cdb5, 0x01ca9056, 0x0033dc47}}, Y: Field{[10]uint32{0x034f1cd5, 0x0102a9dc, 0x020124e1, 0x02991fb3, 0x022f91f6, 0x02226c8f, 0x0156defe, 0x0085bf8d, 0x01bfcf25, 0x0014a8de}}}, + {X: Field{[10]uint32{0x03d1384b, 0x0145b26a, 0x0394e1c3, 0x01d46191, 0x03f516fd, 0x00da43cb, 0x0001ec36, 0x03c6630c, 0x01de27aa, 0x002e6fa5}}, Y: Field{[10]uint32{0x02cb6df9, 0x030489c7, 0x013cd27f, 0x0160aea1, 0x001ff85d, 0x02232e3e, 0x029b6144, 0x03710c0f, 0x0397dca1, 0x001a21d7}}}, + {X: Field{[10]uint32{0x00e9638e, 0x014ddcca, 0x03331fff, 0x02cf095f, 0x037bec31, 0x01466b80, 0x0042b377, 0x01aa314d, 0x03e6c4d0, 0x003d7c95}}, Y: Field{[10]uint32{0x03e986dd, 0x03c85950, 0x0169e35f, 0x03b2ed00, 0x02c80bea, 0x03483432, 0x012e3ed0, 0x00c84eed, 0x020a48d0, 0x002da879}}}, + {X: Field{[10]uint32{0x00099ce7, 0x02455799, 0x02bf9df0, 0x00ff2db3, 0x02a5281b, 0x002bdf64, 0x00036033, 0x022a8456, 0x034c17e3, 0x003f0d71}}, Y: Field{[10]uint32{0x0379dae9, 0x00e489f6, 0x0245ac62, 0x02ecbb23, 0x018421fb, 0x0205344c, 0x00c1c589, 0x01a4ed69, 0x004d41e8, 0x001b8be6}}}, + {X: Field{[10]uint32{0x014384dd, 0x00bf33b5, 0x00aa7473, 0x0287338d, 0x02c1bc18, 0x027feb29, 0x005e5a98, 0x01cd8dd0, 0x020149d9, 0x002b04d7}}, Y: Field{[10]uint32{0x02f021d0, 0x00685882, 0x01cb1c47, 0x014d844f, 0x01d8e545, 0x027e35c2, 0x00cbf630, 0x0129adaf, 0x02cdff95, 0x000f8e2e}}}, + {X: Field{[10]uint32{0x035f345d, 0x01d3e4a7, 0x01055f36, 0x015f3d30, 0x01bfd8f6, 0x01e46806, 0x02400c4e, 0x03175e00, 0x03fbefb3, 0x00182804}}, Y: Field{[10]uint32{0x00a1bd97, 0x00817cce, 0x035b2711, 0x019151a2, 0x039907e3, 0x028c8004, 0x00a5138c, 0x03f8f8a8, 0x00483582, 0x001f9d8f}}}, + {X: Field{[10]uint32{0x01a7acb7, 0x03413a86, 0x013a906e, 0x01642fbe, 0x02ceb3a6, 0x029e2664, 0x023d0273, 0x01ea290e, 0x01065d90, 0x00282668}}, Y: Field{[10]uint32{0x03c5a50d, 0x038f5ed6, 0x007db06f, 0x02836c50, 0x02d5cca4, 0x03c326d1, 0x034bb579, 0x008bff00, 0x03fbfe3c, 0x0004dfe7}}}, + {X: Field{[10]uint32{0x00a792ab, 0x03d3f0e5, 0x0107b09e, 0x005c127c, 0x00c6ed70, 0x00472769, 0x03ea5a8c, 0x018f5861, 0x0286d027, 0x0026e876}}, Y: Field{[10]uint32{0x0263f741, 0x00866759, 0x01650c47, 0x029970b6, 0x008716ae, 0x0005d461, 0x03879089, 0x0167156f, 0x02d8ab54, 0x003c6788}}}, + {X: Field{[10]uint32{0x0277ada0, 0x01453269, 0x0134f63a, 0x00e24d42, 0x01b5e022, 0x03ca3643, 0x03e93633, 0x0050c05e, 0x001ad30d, 0x000d909c}}, Y: Field{[10]uint32{0x01aba970, 0x00378efc, 0x02c22344, 0x02613d4a, 0x026432fa, 0x02a2ef61, 0x0279f487, 0x02ef1b13, 0x02b9c76b, 0x000bf7e6}}}, + {X: Field{[10]uint32{0x02941a5b, 0x028e94b5, 0x02c31c2e, 0x003551c4, 0x0106188c, 0x00b261c6, 0x0153012e, 0x01c26363, 0x0058100b, 0x000a7de7}}, Y: Field{[10]uint32{0x022d524b, 0x01a242e6, 0x01bf3721, 0x02dc0b56, 0x02919d5b, 0x021a8a01, 0x00ec42f5, 0x0306ec34, 0x0199eaa6, 0x002fa7b7}}}, + {X: Field{[10]uint32{0x01ba1bbc, 0x034b11e2, 0x03061e5e, 0x0342b17f, 0x0004b470, 0x00ffacd4, 0x02d5030c, 0x00a13e05, 0x02dfbc35, 0x0038046a}}, Y: Field{[10]uint32{0x00c979e3, 0x0030068f, 0x0270055a, 0x02a4fd2c, 0x03021ec1, 0x00a4ef9d, 0x026ee97f, 0x016468db, 0x03934f2b, 0x00382a63}}}, + {X: Field{[10]uint32{0x03d78585, 0x025bb813, 0x02dfb3ed, 0x0145dfff, 0x020ee06a, 0x022e4887, 0x02b54b68, 0x014d58df, 0x016b00fe, 0x00297220}}, Y: Field{[10]uint32{0x01ff8e5f, 0x02f96a32, 0x0076fe03, 0x0076bb59, 0x037d6595, 0x029abb54, 0x00977929, 0x02c46912, 0x037b9d63, 0x000fe198}}}, + {X: Field{[10]uint32{0x03194707, 0x03c5b271, 0x02509abe, 0x038244a8, 0x022e6d49, 0x01c23f39, 0x0207798e, 0x00d42e54, 0x00237e44, 0x000ee54b}}, Y: Field{[10]uint32{0x01d68936, 0x026d676f, 0x02edaff4, 0x00c5af37, 0x02e6ebb6, 0x01e44b99, 0x0141a385, 0x01b22b27, 0x032a419e, 0x003de125}}}, + {X: Field{[10]uint32{0x0157af04, 0x000bc937, 0x02632725, 0x004667e1, 0x02b75dd6, 0x021e92aa, 0x007982a1, 0x0054be03, 0x02bcd9d8, 0x002365e5}}, Y: Field{[10]uint32{0x03e611bd, 0x026080ad, 0x0092c89c, 0x034a63a6, 0x010317c2, 0x035a2654, 0x015695f2, 0x0078e8a3, 0x007994a3, 0x003ee6c5}}}, + {X: Field{[10]uint32{0x0202de40, 0x005dc11a, 0x03f51845, 0x01edbbd9, 0x014fde4d, 0x01e2259a, 0x036f689d, 0x01911454, 0x005b2f4e, 0x0025acaf}}, Y: Field{[10]uint32{0x008e89cc, 0x01712842, 0x0178b214, 0x026cd4b0, 0x01914eee, 0x03eff394, 0x039bbf5a, 0x020b6d40, 0x0126f919, 0x00382ddb}}}, + {X: Field{[10]uint32{0x032e2d79, 0x03bd7490, 0x0103625b, 0x02e68743, 0x034e3ab2, 0x01963be5, 0x028f54d8, 0x0254038a, 0x03109f12, 0x0026fdf3}}, Y: Field{[10]uint32{0x016e8582, 0x0343c652, 0x0020be32, 0x029c66f3, 0x01dd6373, 0x0223af49, 0x038bb521, 0x0071a146, 0x03adf77e, 0x000844f5}}}, + {X: Field{[10]uint32{0x03d4f1b7, 0x0013cabc, 0x00dab11a, 0x00f58756, 0x00c91f85, 0x0366a861, 0x008c7414, 0x016d7abf, 0x03a72037, 0x000434ff}}, Y: Field{[10]uint32{0x03298c90, 0x0043a8c3, 0x0321beeb, 0x002b505b, 0x02c98d75, 0x03e30fc0, 0x015c7046, 0x03d0f2c8, 0x032a8a96, 0x00307e12}}}, + {X: Field{[10]uint32{0x003a5eb6, 0x019e7a03, 0x00e92c0e, 0x01fa210c, 0x030e9257, 0x006da1cc, 0x01636920, 0x007342e3, 0x022b6adf, 0x0015b593}}, Y: Field{[10]uint32{0x02f71cc0, 0x0069badf, 0x0382451b, 0x01f89792, 0x025d4b68, 0x01f579a5, 0x00427c25, 0x02108d22, 0x030efbe9, 0x0000004d}}}, + {X: Field{[10]uint32{0x031528bf, 0x02b70d1c, 0x021c1420, 0x014a95a0, 0x026dbfa3, 0x003091e4, 0x01eddbd2, 0x033c81d7, 0x003e1c83, 0x003fb128}}, Y: Field{[10]uint32{0x01a95509, 0x01f9aa2f, 0x00b2aa78, 0x023bf5ef, 0x031bab78, 0x00e1fa6f, 0x03a0d98f, 0x0390b4ee, 0x02af8670, 0x002854ac}}}, + {X: Field{[10]uint32{0x03ee92eb, 0x030983cb, 0x03001779, 0x036ca6a1, 0x02a45d11, 0x02256796, 0x02e6d53e, 0x02a6b18e, 0x01177cce, 0x0016029d}}, Y: Field{[10]uint32{0x029e8edd, 0x03d3e719, 0x02a06862, 0x02436304, 0x0086733a, 0x0054dd69, 0x008c4111, 0x03193081, 0x029c3263, 0x001e4ef9}}}, + {X: Field{[10]uint32{0x02f636f6, 0x036e5d9a, 0x002f535e, 0x034b437b, 0x02991b46, 0x004de866, 0x017431b1, 0x0073af3e, 0x03e57893, 0x0024a1af}}, Y: Field{[10]uint32{0x0329f516, 0x006d6974, 0x015f28cb, 0x020147b7, 0x00c55fce, 0x0014ede0, 0x00b38fb2, 0x036d0a0f, 0x0130e962, 0x001f9dd3}}}, + {X: Field{[10]uint32{0x00f4890d, 0x008b070a, 0x02041e54, 0x01476982, 0x02803e38, 0x03fbb196, 0x002cf2ee, 0x0099494e, 0x01a99b70, 0x00181b55}}, Y: Field{[10]uint32{0x00eda1a7, 0x02295314, 0x02e5407f, 0x00147d3b, 0x0379ae2c, 0x006e2a85, 0x004a1e03, 0x01904528, 0x026e3c2a, 0x00372256}}}, + {X: Field{[10]uint32{0x01f917f5, 0x001fda5d, 0x00df66e8, 0x03180139, 0x0011387d, 0x033f23b6, 0x03ef2f1b, 0x03073773, 0x0140833e, 0x00285a83}}, Y: Field{[10]uint32{0x022d6527, 0x0246f620, 0x01388ba9, 0x03658c04, 0x037fd281, 0x02203421, 0x01f32a82, 0x01294c54, 0x013713de, 0x0015235f}}}, + {X: Field{[10]uint32{0x039f0329, 0x027430d3, 0x0262d9b7, 0x0057b7d6, 0x004a687a, 0x03881c9b, 0x03e3e7aa, 0x01388e68, 0x01d2be57, 0x00001652}}, Y: Field{[10]uint32{0x005288a9, 0x02a44851, 0x0255f337, 0x01de5c8f, 0x02f7f4e7, 0x01203de3, 0x01d94275, 0x02c970c4, 0x025a167a, 0x001c772c}}}, + {X: Field{[10]uint32{0x0168b240, 0x01f1395e, 0x01536cef, 0x00ce0840, 0x03cd1e23, 0x02707fd3, 0x017b295e, 0x00362927, 0x024ae67b, 0x002107d3}}, Y: Field{[10]uint32{0x031f4161, 0x019c7415, 0x03d5cb56, 0x00de335c, 0x01ccae80, 0x0236f99e, 0x03979f4a, 0x0293b43a, 0x009c265f, 0x0007d587}}}, + {X: Field{[10]uint32{0x02cb7442, 0x00fb0791, 0x0240ddd4, 0x02b80289, 0x03faf680, 0x0109e23f, 0x03d4b831, 0x03a7ca22, 0x01f8c748, 0x0008988f}}, Y: Field{[10]uint32{0x03a55da3, 0x003804e1, 0x03aaad5e, 0x01ed2530, 0x0317d582, 0x033a7de1, 0x024381d0, 0x02d64be5, 0x000adfcd, 0x000e03bc}}}, + {X: Field{[10]uint32{0x005185e4, 0x0319523d, 0x02e2dc88, 0x037aced9, 0x02670083, 0x0298285f, 0x007a21e5, 0x00c07ba8, 0x03c36438, 0x00205819}}, Y: Field{[10]uint32{0x01c4cbf7, 0x020abb93, 0x02647f59, 0x03b11409, 0x022eeedc, 0x00dbf0e7, 0x00f4e8e2, 0x03a7c7c1, 0x011b9a95, 0x0016be8e}}}, + {X: Field{[10]uint32{0x02085c1f, 0x01a49373, 0x02485354, 0x0270b065, 0x017d28af, 0x02a38109, 0x00f6431b, 0x0314c493, 0x01614745, 0x003e3c8d}}, Y: Field{[10]uint32{0x0334750f, 0x0199d4d9, 0x01e7507f, 0x01d6b34a, 0x02bd1012, 0x03f9dad7, 0x008c1b93, 0x006d5695, 0x0067e3b4, 0x00028594}}}, + {X: Field{[10]uint32{0x03f2f57a, 0x00ee4cd5, 0x03e23775, 0x00f77812, 0x0228bb93, 0x01c214ec, 0x01537d4c, 0x02285709, 0x0184e25b, 0x00084c95}}, Y: Field{[10]uint32{0x02e873e2, 0x02dc9fa1, 0x01f53d20, 0x03c566e8, 0x03f627b5, 0x01fc869b, 0x00b00d51, 0x03d5e83c, 0x00f2078e, 0x000dc232}}}, + {X: Field{[10]uint32{0x03dfbda3, 0x0335a98f, 0x01c77845, 0x02b2f245, 0x0188b0ba, 0x03feb050, 0x00c24b37, 0x0066cb00, 0x03fcf485, 0x002cbd3d}}, Y: Field{[10]uint32{0x0157702c, 0x0138a31f, 0x03e171c9, 0x00eb356c, 0x03de4972, 0x03d33cf1, 0x03196bb5, 0x03b90cf9, 0x019e6f52, 0x002c81ad}}}, + {X: Field{[10]uint32{0x027f7265, 0x004bfb3b, 0x02064622, 0x014f6b2b, 0x03fd9c5c, 0x01593e70, 0x0070fd39, 0x00001adf, 0x014f5f42, 0x002d3997}}, Y: Field{[10]uint32{0x016bee0e, 0x01cd41a0, 0x025bffc0, 0x0235a119, 0x0003c75b, 0x020fb0b1, 0x021723ea, 0x00efd3cc, 0x02f2e399, 0x000c1edb}}}, + {X: Field{[10]uint32{0x023a7240, 0x00d4ac77, 0x00bab8f2, 0x007410fd, 0x03aa58b6, 0x01e63ba4, 0x033968e9, 0x0026b497, 0x01939ac6, 0x0013c411}}, Y: Field{[10]uint32{0x038179ae, 0x00887b9f, 0x024bd186, 0x0224fd2a, 0x03ed9d0a, 0x01569424, 0x01698f5c, 0x0257e960, 0x03bb9883, 0x003b6361}}}, + {X: Field{[10]uint32{0x014672fa, 0x01f00592, 0x00738d09, 0x02148e22, 0x0390018e, 0x02b5d4a7, 0x026b2157, 0x0304967e, 0x00ffe515, 0x0026d79d}}, Y: Field{[10]uint32{0x01fece15, 0x00f8ebc8, 0x00bc43db, 0x03610786, 0x01fe2df3, 0x00fecee7, 0x01bf70c4, 0x00c3c5ef, 0x026d4c4e, 0x00075561}}}, + {X: Field{[10]uint32{0x0217e302, 0x0205f21f, 0x02cf510d, 0x030b1da8, 0x0330f8a2, 0x024e1ec6, 0x02968f94, 0x03dc6040, 0x0042ac8c, 0x0001defd}}, Y: Field{[10]uint32{0x032af0e9, 0x039d5bf4, 0x021f26a6, 0x0217dbbb, 0x01e4daaa, 0x01b16fbb, 0x03b1103e, 0x0011ac74, 0x02611d90, 0x002ec3e7}}}, + {X: Field{[10]uint32{0x00c266a9, 0x034e22de, 0x00fe64bc, 0x01a4c20d, 0x00d2f5d4, 0x005aa662, 0x0028f34b, 0x008125ac, 0x025cd49f, 0x0009f784}}, Y: Field{[10]uint32{0x00b54bfe, 0x00f78957, 0x039b81a4, 0x00b4c8e5, 0x0384cdfc, 0x000e6b4a, 0x019dac24, 0x0364a8ab, 0x02a8483d, 0x003d0f61}}}, + {X: Field{[10]uint32{0x03e9c116, 0x00262712, 0x01b13225, 0x03c1fe11, 0x017f026c, 0x03bed6a3, 0x03b60ae4, 0x01d78652, 0x0178ae1d, 0x00086fdc}}, Y: Field{[10]uint32{0x01b8d967, 0x03da26bb, 0x0081d434, 0x02455a59, 0x0076b522, 0x034ed63e, 0x03444664, 0x037c5745, 0x02adbc21, 0x001b2aa0}}}, + {X: Field{[10]uint32{0x0232e234, 0x00916c15, 0x0156a66d, 0x03e6702e, 0x02dc9100, 0x020a2768, 0x0365b7f0, 0x0005a906, 0x025493ee, 0x00000924}}, Y: Field{[10]uint32{0x03c45b3d, 0x01738c41, 0x016f82ed, 0x0119ebb2, 0x00d883ff, 0x013dbe41, 0x004c5367, 0x007e6054, 0x01941cb5, 0x002f28c0}}}, + {X: Field{[10]uint32{0x01867f76, 0x039d4e1f, 0x016fe230, 0x00966e4c, 0x00ea8e94, 0x02e4dc42, 0x02d89b96, 0x00ad3351, 0x00c1e347, 0x0034fd91}}, Y: Field{[10]uint32{0x018cade5, 0x02cb6943, 0x03b7c597, 0x02b8c5af, 0x0202e536, 0x01489e50, 0x0337ed9d, 0x025cca8e, 0x0203fd62, 0x00246089}}}, + {X: Field{[10]uint32{0x0325b261, 0x00dfdeb8, 0x02e89d03, 0x01d51894, 0x01915c26, 0x011fd95b, 0x00e52c81, 0x034532a2, 0x034b0e2b, 0x00321187}}, Y: Field{[10]uint32{0x00dcae06, 0x033bb6a7, 0x02b07e38, 0x016aa2a4, 0x01fa3b61, 0x011bbf7d, 0x0232868e, 0x01e66cfd, 0x018197ac, 0x000625c4}}}, + {X: Field{[10]uint32{0x0395a380, 0x00cd0ab0, 0x0060d913, 0x01aaaa96, 0x01a8c240, 0x01ef5b28, 0x0357e1da, 0x02a4e306, 0x0190be20, 0x002db97d}}, Y: Field{[10]uint32{0x018a04b6, 0x011b579f, 0x02026ff1, 0x0325a9b7, 0x01cf01ee, 0x02d698c1, 0x0186569a, 0x03ab79cb, 0x00f1a2f2, 0x00299ca3}}}, + {X: Field{[10]uint32{0x01eb5d6c, 0x013b2556, 0x008c0312, 0x0237c524, 0x018b7013, 0x017bf043, 0x014eee4b, 0x0007415b, 0x039d4657, 0x000f4945}}, Y: Field{[10]uint32{0x0395980f, 0x00ca9c62, 0x03c8c3e0, 0x028ab155, 0x023b56f7, 0x00f1625e, 0x03e88e2b, 0x035fb18c, 0x03fe1d61, 0x000562de}}}, + {X: Field{[10]uint32{0x02f94d99, 0x026965d1, 0x02927984, 0x004646bd, 0x00d85155, 0x03689fc4, 0x0093425b, 0x00526656, 0x0154c717, 0x0002aed7}}, Y: Field{[10]uint32{0x00b9a161, 0x015108b1, 0x03ad04e4, 0x002b64f5, 0x037012ff, 0x03d08270, 0x0106e89f, 0x0237a8db, 0x03cc3be2, 0x001337fa}}}, + {X: Field{[10]uint32{0x0325c73e, 0x014a41ec, 0x0224c523, 0x0219cfb1, 0x02f12433, 0x038c72ec, 0x00dedaa4, 0x03e70a40, 0x0125115e, 0x00262740}}, Y: Field{[10]uint32{0x00c6c8df, 0x01a081a5, 0x000c8d16, 0x018ca547, 0x00d553df, 0x0109e5d4, 0x01f28ee1, 0x0381c3f0, 0x02e9945d, 0x0034da67}}}, + {X: Field{[10]uint32{0x02013884, 0x03908c97, 0x02af82d0, 0x004f20a8, 0x015e05db, 0x003b7dc3, 0x028bbe4e, 0x0347fc18, 0x01d429c3, 0x00313171}}, Y: Field{[10]uint32{0x03a97eea, 0x02e9f9fb, 0x023ee0f2, 0x003744cc, 0x03ccee86, 0x002b7a5f, 0x029da677, 0x0222a7f0, 0x00b88251, 0x0030b1db}}}, + {X: Field{[10]uint32{0x02c0807b, 0x00552789, 0x01edc360, 0x0047b02e, 0x03be9471, 0x000283a0, 0x035080a9, 0x02d97236, 0x0050c623, 0x002198b6}}, Y: Field{[10]uint32{0x01da840b, 0x03c3db8d, 0x01526b3d, 0x01333e32, 0x03f91e72, 0x0246020e, 0x02a72b32, 0x039e93d9, 0x0277b0c9, 0x00029c75}}}, + {X: Field{[10]uint32{0x01083898, 0x03b6c5c7, 0x02626cbd, 0x031f03aa, 0x00543b73, 0x00eaef51, 0x0309b389, 0x0166fccc, 0x03497e73, 0x00349bfb}}, Y: Field{[10]uint32{0x01851395, 0x00e07e1e, 0x03ad956d, 0x00835236, 0x0004d60c, 0x0141c3e4, 0x0101ea9a, 0x002ce5ad, 0x0209bb09, 0x002b62ec}}}, + {X: Field{[10]uint32{0x029d8d0f, 0x01e17488, 0x009838f8, 0x03d7c5cf, 0x025b4560, 0x02d00844, 0x0342ff85, 0x02da09f5, 0x00e8c584, 0x0015a6fa}}, Y: Field{[10]uint32{0x001b8559, 0x036bf1f5, 0x0235422e, 0x00cd789b, 0x0247c74a, 0x02692754, 0x015581bf, 0x01f626a3, 0x01a4a826, 0x002c24e0}}}, + {X: Field{[10]uint32{0x030116d4, 0x0279e534, 0x02255d4a, 0x02ef256a, 0x03842f82, 0x01658363, 0x0167bc6c, 0x021eceb6, 0x00c34d17, 0x00378d2b}}, Y: Field{[10]uint32{0x021816d3, 0x02cf5de8, 0x00505b6c, 0x002fbc26, 0x00e322c4, 0x0220f4fc, 0x00f4d3e0, 0x02d4a95f, 0x001cb2b6, 0x000bf76d}}}, + {X: Field{[10]uint32{0x01c50b1a, 0x01bea671, 0x003d5544, 0x0101c376, 0x03ece852, 0x01d0a96c, 0x0149b861, 0x02dd89b5, 0x034876db, 0x0011d0c2}}, Y: Field{[10]uint32{0x03200df1, 0x00d5e92b, 0x033e85af, 0x01223771, 0x02b53dd0, 0x0323b1dc, 0x006a0ead, 0x0115cd63, 0x02ba0700, 0x0035d564}}}, + {X: Field{[10]uint32{0x02e9fe13, 0x002c25f5, 0x00fd7914, 0x03fbdb1a, 0x018c2d8f, 0x01aeeadb, 0x017339b7, 0x01c99ae8, 0x00b5e668, 0x003c7478}}, Y: Field{[10]uint32{0x0324e580, 0x0150f56f, 0x0350bb96, 0x013699f6, 0x03a1d849, 0x008c03e5, 0x01c54837, 0x00ce14d2, 0x0226fc23, 0x00002958}}}, + {X: Field{[10]uint32{0x00cdbcd0, 0x0056e17e, 0x004c3c05, 0x03fce0fd, 0x006e8132, 0x025a30dd, 0x03d0426e, 0x003784f6, 0x03357614, 0x0008a9bd}}, Y: Field{[10]uint32{0x03d18d1b, 0x038d157e, 0x01e48e69, 0x0276a101, 0x03430a39, 0x003e5690, 0x00dc0044, 0x0038f8d6, 0x01a89027, 0x00277362}}}, + {X: Field{[10]uint32{0x01a9ada2, 0x019538f8, 0x02867b46, 0x00c30a78, 0x02fc307b, 0x01d10ba3, 0x030c6ea5, 0x0232826e, 0x03280afd, 0x000b7714}}, Y: Field{[10]uint32{0x0087dee4, 0x03b6dcf0, 0x03393b5f, 0x024c665d, 0x0107d077, 0x007fe438, 0x02daa6e3, 0x039ba1ef, 0x010edb84, 0x001ee6ae}}}, + {X: Field{[10]uint32{0x01da0fca, 0x0078b065, 0x03a9e1a0, 0x015151b7, 0x011fb1c8, 0x0162e719, 0x00a116c0, 0x03d4bf4c, 0x0039a60a, 0x00182dbe}}, Y: Field{[10]uint32{0x00d26c40, 0x01360f88, 0x02bcdca5, 0x00187615, 0x03b0e743, 0x011a763a, 0x039b07b2, 0x02d052f8, 0x029f28cf, 0x00179dfd}}}, + {X: Field{[10]uint32{0x01dee53c, 0x009a9f43, 0x02776dcd, 0x00a15f25, 0x022a1f1f, 0x0257a90e, 0x0306bfdf, 0x024b9432, 0x019b9b90, 0x0009e430}}, Y: Field{[10]uint32{0x014e7f64, 0x01767cdc, 0x005b6271, 0x01662caf, 0x00de0677, 0x00085c26, 0x0387afaa, 0x01b9e2c8, 0x0120d04e, 0x003f7ba8}}}, + {X: Field{[10]uint32{0x01113803, 0x03e411bd, 0x037c00d7, 0x028d1453, 0x02db181e, 0x03eb65e0, 0x03576b16, 0x02f22c49, 0x020f9ee8, 0x0039510c}}, Y: Field{[10]uint32{0x00510741, 0x00465cb0, 0x01e0f952, 0x002b89ad, 0x023c7368, 0x03739f0c, 0x01b63dd9, 0x01d1139a, 0x02fb0239, 0x002e4dd8}}}, + {X: Field{[10]uint32{0x0355313d, 0x026abeb6, 0x00cee39f, 0x0335a6ed, 0x038e2706, 0x02f535d3, 0x00a236cb, 0x00a35618, 0x01ae73e4, 0x001b1fc9}}, Y: Field{[10]uint32{0x00dc9121, 0x012d6072, 0x030916a4, 0x012f577f, 0x018db30c, 0x0163aa48, 0x020864be, 0x026c63a6, 0x03c9e33f, 0x003632e3}}}, + {X: Field{[10]uint32{0x0393d4e8, 0x03a94ee6, 0x03499121, 0x00e80c3b, 0x03dd9eaa, 0x00e54bc9, 0x01e9c3ef, 0x00351d34, 0x0328ff71, 0x000a2746}}, Y: Field{[10]uint32{0x02880667, 0x02ce52bb, 0x03e38cf2, 0x00c9dfd2, 0x02642859, 0x0116cf2e, 0x00d5cb72, 0x00b75613, 0x000aaebc, 0x003cdabe}}}, + {X: Field{[10]uint32{0x0110b5aa, 0x028769d6, 0x03476b9f, 0x022b53bd, 0x002a6f4a, 0x0244c306, 0x0287b5d2, 0x0359cc97, 0x0197ac01, 0x003c0aad}}, Y: Field{[10]uint32{0x00e38adb, 0x025902b3, 0x02aaffe8, 0x007d97b2, 0x01d3262d, 0x030d18cf, 0x02c53795, 0x022c4fb3, 0x002aecf2, 0x002ba230}}}, + {X: Field{[10]uint32{0x00a0413a, 0x03e10637, 0x01a8d2d8, 0x01c13b0a, 0x03c625bb, 0x01b531b4, 0x0332c82d, 0x00c4195d, 0x034f71a7, 0x0002a6a5}}, Y: Field{[10]uint32{0x01b372cd, 0x022496e4, 0x01c2126e, 0x02b33f47, 0x01af1497, 0x0183b479, 0x02f222d8, 0x03a5bf57, 0x0033eed4, 0x0030837d}}}, + {X: Field{[10]uint32{0x0177496a, 0x0073d023, 0x0071f4a2, 0x03f05941, 0x024cc392, 0x018d2d57, 0x020e9c78, 0x00226466, 0x010d728e, 0x001e1986}}, Y: Field{[10]uint32{0x000cfd22, 0x004a44eb, 0x01b23035, 0x038ea4da, 0x0029d79d, 0x00d68799, 0x028e265c, 0x008bbf2a, 0x00d95404, 0x0006ed7f}}}, + {X: Field{[10]uint32{0x0333b9ac, 0x004c2920, 0x00773ce0, 0x016a4443, 0x0025cc11, 0x018f6550, 0x00e4e2de, 0x02e3afc0, 0x03e344b3, 0x003229ff}}, Y: Field{[10]uint32{0x02e67b6e, 0x0148ff97, 0x02806dbb, 0x003f6a5f, 0x02ca9128, 0x032a1c91, 0x00141aa5, 0x018ed59d, 0x03e5010c, 0x003287fe}}}, + {X: Field{[10]uint32{0x039208ba, 0x0259b993, 0x033472f9, 0x00cf533c, 0x019cc1e6, 0x01369a1c, 0x0019e84e, 0x01ab4e0d, 0x026a13ff, 0x0001b2ee}}, Y: Field{[10]uint32{0x02214a88, 0x0228a987, 0x011fcfac, 0x02258a9f, 0x03058598, 0x02711986, 0x0392c34e, 0x024fd13e, 0x01820c78, 0x000d4489}}}, + {X: Field{[10]uint32{0x019de719, 0x008ff6bf, 0x03e1287b, 0x020526e8, 0x00ffe9aa, 0x031d976b, 0x01450c82, 0x021847ad, 0x01bd691a, 0x00381fe3}}, Y: Field{[10]uint32{0x00fbc509, 0x02c18763, 0x02bc6894, 0x01b96d49, 0x030acb0c, 0x0384631f, 0x01937994, 0x033fba89, 0x01f08e39, 0x0024cb8d}}}, + {X: Field{[10]uint32{0x02d2c5d4, 0x00ce8b21, 0x029b84b6, 0x00e3f331, 0x0151f3e2, 0x034fcca9, 0x02720d71, 0x02505b37, 0x009832fd, 0x001884da}}, Y: Field{[10]uint32{0x02784e9c, 0x03dc576f, 0x00f68206, 0x01b5a72f, 0x03791f3b, 0x03c79665, 0x016d9684, 0x01f90616, 0x024d6224, 0x0004dfa6}}}, + {X: Field{[10]uint32{0x03a7b9eb, 0x013a3036, 0x004f2325, 0x02e87a9a, 0x0240a318, 0x01c43021, 0x03eb2faf, 0x019c1894, 0x018862de, 0x0022c041}}, Y: Field{[10]uint32{0x01bfd264, 0x008dc686, 0x0348e2ce, 0x00655bc3, 0x03dbd7e4, 0x01e8cfe7, 0x00bf43cf, 0x01b18333, 0x0062dcc5, 0x00152922}}}, + {X: Field{[10]uint32{0x00f213d8, 0x01203aa1, 0x031cfeaf, 0x021f70c2, 0x023fb2ed, 0x015af2eb, 0x03bbbace, 0x020d1bfb, 0x008c14af, 0x0004b4e4}}, Y: Field{[10]uint32{0x0267fdfc, 0x0206a626, 0x0024ecb1, 0x01766396, 0x01fef41e, 0x000b1366, 0x02764210, 0x036b2611, 0x01fbdf7d, 0x003f1185}}}, + {X: Field{[10]uint32{0x01784cd2, 0x018b4580, 0x013dc8da, 0x01bb7df0, 0x02b47428, 0x00a48a64, 0x00e368f6, 0x0331a6ef, 0x01e2a7b8, 0x00086741}}, Y: Field{[10]uint32{0x034c7f5c, 0x00785e28, 0x02de2076, 0x00ec8587, 0x03dd2820, 0x023eeafb, 0x029407de, 0x02c79e3b, 0x03739a7e, 0x0022bb93}}}, + {X: Field{[10]uint32{0x005de204, 0x00016db6, 0x03074852, 0x004f0e32, 0x0049bbe2, 0x034997ce, 0x011fa23a, 0x03ea47da, 0x01599a76, 0x0035f433}}, Y: Field{[10]uint32{0x011ce2fa, 0x023cdf24, 0x019d1e93, 0x018302c7, 0x03ed1a2d, 0x01c9683b, 0x021330ea, 0x0036b97a, 0x032c6075, 0x003cd255}}}, + {X: Field{[10]uint32{0x02bb6c6d, 0x03d25e3a, 0x0042d635, 0x02ecb1dc, 0x009f65cf, 0x03ea3f0f, 0x018b73f6, 0x02408e0f, 0x01f5a04c, 0x0028fe9a}}, Y: Field{[10]uint32{0x03cbdea2, 0x007296b0, 0x03e8372c, 0x035d6665, 0x010accb2, 0x00e268bc, 0x0395b18f, 0x02aac52b, 0x01a89994, 0x0031e628}}}, + {X: Field{[10]uint32{0x03b2d1cd, 0x0322bec4, 0x00e92cc5, 0x01307414, 0x00854073, 0x0176505c, 0x0072e71e, 0x0115f5e6, 0x001a825c, 0x00240ba2}}, Y: Field{[10]uint32{0x01a62d43, 0x020b0c2f, 0x01e338ac, 0x001f33f2, 0x02de099f, 0x018be091, 0x0163cccf, 0x01bee444, 0x013263bf, 0x003fc1d4}}}, + {X: Field{[10]uint32{0x0329c144, 0x03318381, 0x03505d34, 0x01693e32, 0x036923ea, 0x03c64cae, 0x021aa2b3, 0x00155b4d, 0x01f24c47, 0x000c97c6}}, Y: Field{[10]uint32{0x0294bec4, 0x01f11ae7, 0x021782a5, 0x03058665, 0x0173e3e9, 0x006fe3e7, 0x001bf358, 0x028337e6, 0x02b829a6, 0x003d2a6b}}}, + {X: Field{[10]uint32{0x021edd4b, 0x02c1f1be, 0x0024763b, 0x0117ac1e, 0x00bcdf72, 0x033ffeb3, 0x025f8602, 0x033d854f, 0x03b441a6, 0x001a653c}}, Y: Field{[10]uint32{0x0074c174, 0x02c45806, 0x03bd927d, 0x02ae1fdc, 0x02198ee4, 0x00fc1454, 0x00479d8d, 0x02a25ca7, 0x01ea892d, 0x003b0bf1}}}, + {X: Field{[10]uint32{0x02cb2d8c, 0x0284149a, 0x0137f3b7, 0x028ad6eb, 0x005663c5, 0x02307daa, 0x011bd2f0, 0x01e5bff5, 0x00324e8f, 0x00086156}}, Y: Field{[10]uint32{0x01897c2d, 0x03475da8, 0x00cf4b15, 0x0255759f, 0x033b93c4, 0x000d0efd, 0x0290d44b, 0x0300f265, 0x02cb33ce, 0x0039df3b}}}, + {X: Field{[10]uint32{0x0191b099, 0x01d33be7, 0x021b0a56, 0x00fd21ea, 0x01319693, 0x0391dcad, 0x027c312a, 0x02a00695, 0x023b32f2, 0x0024176a}}, Y: Field{[10]uint32{0x01cf369f, 0x0161c710, 0x021d6b69, 0x010d6cb2, 0x0382b648, 0x019ff705, 0x0291d5d7, 0x005c644d, 0x01c36d27, 0x002fd8a1}}}, + {X: Field{[10]uint32{0x025339f1, 0x02547bad, 0x017f5b39, 0x01d8c54e, 0x031b6853, 0x036f839f, 0x03e51613, 0x001491d7, 0x038434b6, 0x0037df3e}}, Y: Field{[10]uint32{0x03558243, 0x00333d37, 0x00d2ee58, 0x00f1be91, 0x010d1beb, 0x03659475, 0x0153393d, 0x039154b6, 0x017e1419, 0x0039c973}}}, + {X: Field{[10]uint32{0x01732491, 0x016f2d39, 0x024a5d8c, 0x01d8a33d, 0x00385cb2, 0x03297ae0, 0x0096b821, 0x00ae7a8f, 0x02fc8884, 0x0039fee7}}, Y: Field{[10]uint32{0x00f22331, 0x00a054de, 0x03d5f5e9, 0x00a3b76a, 0x011353c1, 0x019d6a5f, 0x03b83900, 0x0380dc98, 0x02bca6f9, 0x0032399d}}}, + {X: Field{[10]uint32{0x0124285b, 0x008da773, 0x012fecc1, 0x00575c78, 0x01bad797, 0x029103d6, 0x02ac0a3f, 0x02885879, 0x030c272b, 0x003468d7}}, Y: Field{[10]uint32{0x019edb3c, 0x02e526b2, 0x02ec1806, 0x02a25840, 0x0049dc41, 0x02c55900, 0x02f2f21b, 0x01c5b6e7, 0x00f7d475, 0x0007d6dc}}}, + {X: Field{[10]uint32{0x027b079f, 0x0043694a, 0x032e5551, 0x00a41164, 0x024f4204, 0x01eb98a7, 0x03da74ac, 0x03753385, 0x02e85f2d, 0x00019ae9}}, Y: Field{[10]uint32{0x03a80402, 0x002279c1, 0x03733263, 0x0010d921, 0x02219679, 0x026f7fef, 0x01a4f357, 0x03bef3d3, 0x005beb8e, 0x00363aeb}}}, + {X: Field{[10]uint32{0x00f3a749, 0x03ce682d, 0x01e487b1, 0x008875ee, 0x00c36e7c, 0x01d7e714, 0x03cf8065, 0x00414ad2, 0x029a2688, 0x0001bdfd}}, Y: Field{[10]uint32{0x0331a4c4, 0x00d6a99c, 0x0202b892, 0x016096ed, 0x00bc1835, 0x03058394, 0x00352b9c, 0x02e22ead, 0x03840d89, 0x0004741a}}}, + {X: Field{[10]uint32{0x026c0abd, 0x00308724, 0x01b90eda, 0x03fa132b, 0x0141c23a, 0x017006b1, 0x01699067, 0x0140ec98, 0x016f571d, 0x0012f85b}}, Y: Field{[10]uint32{0x02c1d06d, 0x013f8ca7, 0x011bd9a0, 0x023f2c8c, 0x01d9ede7, 0x034cffb5, 0x02116c5d, 0x03cb7586, 0x02deffa1, 0x00004107}}}, + {X: Field{[10]uint32{0x01e75886, 0x03c142c0, 0x029bd33b, 0x00d43b95, 0x03191603, 0x005a6315, 0x00abbc79, 0x02b2d9d8, 0x005db55e, 0x0022be23}}, Y: Field{[10]uint32{0x01d9a12c, 0x02fd65af, 0x02beaf61, 0x02d74af9, 0x00ca203e, 0x025801f0, 0x02eeb245, 0x02d2c4a6, 0x010b6bf2, 0x0013d6e1}}}, + {X: Field{[10]uint32{0x00ef8672, 0x02d82213, 0x035072e2, 0x00602339, 0x01edb695, 0x00e457a0, 0x03648491, 0x03ae3869, 0x037a3316, 0x002b4cf9}}, Y: Field{[10]uint32{0x037ccd90, 0x0297932b, 0x0313f16c, 0x0227c563, 0x016c4f4f, 0x025431d7, 0x01157fd7, 0x022f6769, 0x01e24bc8, 0x003e8058}}}, + {X: Field{[10]uint32{0x01d8c2bc, 0x037b6cf6, 0x01ba069e, 0x007d808b, 0x01cdb51e, 0x0070d121, 0x0196ee9b, 0x02bf9e47, 0x01ef7620, 0x001112a0}}, Y: Field{[10]uint32{0x0351e2fd, 0x006bc465, 0x03b52e64, 0x00a47beb, 0x02bd2683, 0x02ff366e, 0x02811c7f, 0x013af0bb, 0x03d9a49d, 0x002a2005}}}, + {X: Field{[10]uint32{0x02aa5c51, 0x002d98f3, 0x00aa51d1, 0x034492b2, 0x0377af3a, 0x01940e8b, 0x0387e9d2, 0x03e2d981, 0x03a39530, 0x0016c781}}, Y: Field{[10]uint32{0x037810b9, 0x00311c3d, 0x0013b450, 0x0041eef4, 0x02e87cb5, 0x021aa01a, 0x031e59b6, 0x0383ec9c, 0x00d38d55, 0x003f3d30}}}, + {X: Field{[10]uint32{0x03174309, 0x00cfb45c, 0x02844ba5, 0x01f65897, 0x01b1d42e, 0x00c5f99f, 0x034c4033, 0x01aa195e, 0x00170e98, 0x00000fa3}}, Y: Field{[10]uint32{0x00cd6caa, 0x03d54865, 0x03e5e696, 0x03d70a5b, 0x029db702, 0x00f1fb83, 0x020f3966, 0x028d743a, 0x009ff4f5, 0x0037baf9}}}, + {X: Field{[10]uint32{0x00d112c1, 0x03a0f601, 0x017e5746, 0x0241fc75, 0x036432af, 0x011ad4a2, 0x024c078b, 0x032c6674, 0x02ee5e9b, 0x0028425b}}, Y: Field{[10]uint32{0x02e7c6d4, 0x0229db74, 0x02fc13f0, 0x003f87a4, 0x0097eace, 0x033553cf, 0x02b3019a, 0x00db3595, 0x00fe6994, 0x002f44f9}}}, + {X: Field{[10]uint32{0x0265f2f0, 0x001c6dd9, 0x0093898c, 0x024d37b4, 0x00368610, 0x0269d7ba, 0x000a6d89, 0x0379d76d, 0x01794218, 0x00151d61}}, Y: Field{[10]uint32{0x01174548, 0x0184fd86, 0x021b5c6f, 0x02fca71d, 0x026bcde4, 0x0376a995, 0x00dcd94f, 0x031a25c3, 0x024213e1, 0x000ef555}}}, + {X: Field{[10]uint32{0x01456057, 0x02f1a511, 0x02df7f7b, 0x02417ba6, 0x02a44002, 0x013dd161, 0x0356604f, 0x02f112ff, 0x0192fcb4, 0x0013acca}}, Y: Field{[10]uint32{0x0245c3d4, 0x0185502e, 0x03609216, 0x02319b6d, 0x00e0cc9d, 0x0014400c, 0x0277c673, 0x027c06b6, 0x00f26834, 0x00215daa}}}, + {X: Field{[10]uint32{0x0261a22d, 0x016d322d, 0x01ea269c, 0x008fe4b9, 0x000f2917, 0x026429f0, 0x01428e75, 0x0124cf1b, 0x01efd2eb, 0x000d42cb}}, Y: Field{[10]uint32{0x00de6943, 0x003ec964, 0x0159e354, 0x02a04c83, 0x0370f807, 0x0203bd6f, 0x02126d83, 0x03cd2fcd, 0x0300add9, 0x00186b36}}}, + {X: Field{[10]uint32{0x01f360ff, 0x03f6611d, 0x03017d7a, 0x01ac0c1a, 0x032da3c9, 0x02b284a6, 0x037341ee, 0x0220654c, 0x00bece7f, 0x002453aa}}, Y: Field{[10]uint32{0x01ac7b53, 0x01ca98e1, 0x01213d32, 0x02927f22, 0x03582948, 0x022c90b6, 0x03b563ce, 0x02029d20, 0x0148ebef, 0x003caa95}}}, + {X: Field{[10]uint32{0x03dc0fef, 0x01891ae0, 0x01a33459, 0x03e714f8, 0x03ad6d44, 0x01c38fd7, 0x02baa6bd, 0x0097d2ea, 0x021738da, 0x0003d95b}}, Y: Field{[10]uint32{0x01fd83e5, 0x0076b256, 0x03ef54c3, 0x012c8103, 0x00c742ce, 0x00dcf0b1, 0x025f53cf, 0x024a1c29, 0x00fc3463, 0x00102a2d}}}, + {X: Field{[10]uint32{0x033b618f, 0x0399dc64, 0x00182ce3, 0x008e8849, 0x02d77e10, 0x0036a99b, 0x00310bbc, 0x00f39519, 0x02f0334e, 0x00291f22}}, Y: Field{[10]uint32{0x000c7f08, 0x0254a503, 0x02c4b522, 0x00ba1c57, 0x0341ec5b, 0x0285c4fa, 0x031694ff, 0x01f1d579, 0x0354056d, 0x001b6f32}}}, + {X: Field{[10]uint32{0x00753ca9, 0x01bba74c, 0x02688676, 0x00c47ab3, 0x003b5fde, 0x0085e357, 0x007947f8, 0x0012997a, 0x00625e1d, 0x0002a28a}}, Y: Field{[10]uint32{0x02fc2169, 0x03cbc78b, 0x023ba94d, 0x01d75ce4, 0x021feb3f, 0x03e8426f, 0x039e672e, 0x02813429, 0x02f7483a, 0x003e0ab5}}}, + {X: Field{[10]uint32{0x01c017d0, 0x00fde88c, 0x008371e8, 0x002283d1, 0x034fe062, 0x03f501fb, 0x02903cb3, 0x02e15789, 0x014e5f8e, 0x002807fd}}, Y: Field{[10]uint32{0x032edf92, 0x016cbb83, 0x03ee2f0e, 0x00009d98, 0x009fd59b, 0x01f64945, 0x0018ec07, 0x0069a213, 0x02f9c52f, 0x000891f1}}}, + {X: Field{[10]uint32{0x0142aed1, 0x01f21d63, 0x0072ff2d, 0x038c47d8, 0x0061ef4f, 0x02668c83, 0x02adbd60, 0x03226db2, 0x003a626a, 0x0039ec27}}, Y: Field{[10]uint32{0x00609fdc, 0x02bbf34e, 0x005e2c0f, 0x0285b667, 0x0337c3c5, 0x000f3d68, 0x01c64ace, 0x0143a639, 0x02d36a7b, 0x0023b665}}}, + {X: Field{[10]uint32{0x023ff2fd, 0x016916e1, 0x037173f3, 0x025cdcf2, 0x0196307c, 0x01816410, 0x009fb522, 0x00a81b2a, 0x0253336c, 0x000eeea7}}, Y: Field{[10]uint32{0x03d24799, 0x03a0d049, 0x0160d52a, 0x008dba32, 0x00419d51, 0x0153a6e3, 0x00ccaeae, 0x03f05bd6, 0x01093faf, 0x003cbfa4}}}, + {X: Field{[10]uint32{0x000630a3, 0x0017e70b, 0x00acdaf9, 0x0086d890, 0x0311950c, 0x010cbd4c, 0x01224000, 0x0005d088, 0x02b6dc66, 0x003d8748}}, Y: Field{[10]uint32{0x009ffb05, 0x006915c1, 0x02796142, 0x01405778, 0x00692bb2, 0x0337eac6, 0x02b7e865, 0x00b3ce4f, 0x035a1a66, 0x000181a3}}}, + {X: Field{[10]uint32{0x00a80962, 0x026f9c3a, 0x02d13718, 0x037009c0, 0x01891c45, 0x03cf91c8, 0x0038dcb8, 0x0288b62f, 0x00556b1a, 0x00296d82}}, Y: Field{[10]uint32{0x00b1ddb6, 0x02640cbf, 0x0234a071, 0x01a5f357, 0x023a9b3a, 0x01b060ab, 0x0220b99e, 0x0017287f, 0x03d2d5e3, 0x003ddfe5}}}, + {X: Field{[10]uint32{0x01e1a259, 0x02a97321, 0x02ac1be3, 0x006ca008, 0x02f03030, 0x039bd64b, 0x00ae950b, 0x00958b87, 0x02f900eb, 0x001c30ea}}, Y: Field{[10]uint32{0x00587583, 0x0085ee53, 0x01deb61f, 0x02fa85eb, 0x033f91f2, 0x004eabbd, 0x00626f72, 0x034c6739, 0x03cd31a8, 0x000fcb2d}}}, + {X: Field{[10]uint32{0x0106e530, 0x01744da3, 0x03d93b97, 0x02bf0cf9, 0x01a67952, 0x010f9e44, 0x01fcc4d4, 0x0178dca3, 0x01d1a875, 0x000775c3}}, Y: Field{[10]uint32{0x0190d084, 0x0077f35c, 0x020c4014, 0x01f6dafb, 0x01240e67, 0x03b31cf7, 0x00400742, 0x0253bd1c, 0x01741f58, 0x0011a13e}}}, + {X: Field{[10]uint32{0x0083fcf9, 0x020331a4, 0x035462b1, 0x00f5195c, 0x02f5d37c, 0x034372a0, 0x016bb7f2, 0x03f52f63, 0x018d7aac, 0x0035135a}}, Y: Field{[10]uint32{0x007dc407, 0x026fafc2, 0x03e47281, 0x0104dd02, 0x03c0c940, 0x031056f5, 0x0067b0f4, 0x00a59643, 0x003d0423, 0x00286360}}}, + {X: Field{[10]uint32{0x01b34ca5, 0x02700414, 0x019f9410, 0x00418553, 0x0362730a, 0x02c6f0ee, 0x0122ae74, 0x015d0a15, 0x02e13045, 0x00211626}}, Y: Field{[10]uint32{0x03b3606c, 0x03d88d4d, 0x0390349b, 0x02e8f78e, 0x03de14fc, 0x00be9c1f, 0x02ffce9b, 0x02bd26fd, 0x0208f2a9, 0x002e5e7e}}}, + {X: Field{[10]uint32{0x03724627, 0x034bc122, 0x006f5469, 0x00fff413, 0x01bc84e7, 0x03fc5707, 0x0131c1ef, 0x02265afb, 0x03df8911, 0x000f7b23}}, Y: Field{[10]uint32{0x03eb2c8c, 0x0389c406, 0x0310c16a, 0x028aff50, 0x03daccca, 0x013fe237, 0x011a555f, 0x016f3f6f, 0x03c1e20b, 0x002c50fc}}}, + {X: Field{[10]uint32{0x00cac160, 0x03d0dd02, 0x0012a2f0, 0x037905ed, 0x02023a8d, 0x00339197, 0x01bfcc47, 0x0367180e, 0x03c5519d, 0x000d9e97}}, Y: Field{[10]uint32{0x03f021a6, 0x03eb1729, 0x03cc2dba, 0x00825ea1, 0x03faa648, 0x00f83e3c, 0x011b136a, 0x03f2438a, 0x01df2c6b, 0x0016e3ef}}}, + {X: Field{[10]uint32{0x0063efc1, 0x00c95b25, 0x02cce5fa, 0x03f521ee, 0x031e7c2e, 0x003623a4, 0x03ab6b32, 0x0181bd82, 0x007e7777, 0x0022a956}}, Y: Field{[10]uint32{0x03f091dc, 0x00e7f474, 0x00c1888a, 0x00d11278, 0x0150beeb, 0x02b548a2, 0x02921eca, 0x0284cb05, 0x036c98bf, 0x002b16e9}}}, + {X: Field{[10]uint32{0x0084cae0, 0x01afcf03, 0x038c6a5d, 0x0107b299, 0x02af3aa4, 0x02c34471, 0x00fd9e60, 0x00cba80c, 0x01910ea6, 0x001e7000}}, Y: Field{[10]uint32{0x01dfb899, 0x034b608e, 0x01e85472, 0x037caf46, 0x01ae9c8b, 0x03d0070b, 0x000b659b, 0x02a504eb, 0x00703b19, 0x000fe550}}}, + {X: Field{[10]uint32{0x03a04fc8, 0x03e2fe00, 0x018b3d4e, 0x0292b692, 0x01e858aa, 0x01920c95, 0x01951a06, 0x027a5737, 0x032221a5, 0x00321379}}, Y: Field{[10]uint32{0x02f0a0b9, 0x02f11452, 0x01102158, 0x03483d8e, 0x010548fc, 0x01888112, 0x0011109a, 0x02fca37e, 0x0158915a, 0x001cf37a}}}, + {X: Field{[10]uint32{0x01a9d6d5, 0x01ae24ad, 0x00c218cb, 0x0373f9a5, 0x01fedf74, 0x028f164d, 0x023822b2, 0x01f58781, 0x0050c632, 0x0022c6e3}}, Y: Field{[10]uint32{0x00fe168b, 0x01832c00, 0x037f841f, 0x01ad6d90, 0x00c03676, 0x03fd0c53, 0x03dfc479, 0x0190d7d1, 0x01529f15, 0x0015ef62}}}, + {X: Field{[10]uint32{0x00702c52, 0x00ff5492, 0x03650e78, 0x039dc675, 0x0033a31c, 0x0107e061, 0x0117c4a3, 0x00be6148, 0x008a3ae8, 0x002d17bb}}, Y: Field{[10]uint32{0x020a1c90, 0x0231b867, 0x0046dc98, 0x02167ba4, 0x03254117, 0x0280525e, 0x005d0fce, 0x01ad3c24, 0x035cc708, 0x0033555a}}}, + {X: Field{[10]uint32{0x00757319, 0x001de020, 0x01cd2c57, 0x004e196a, 0x0031ab70, 0x031632f7, 0x034871ea, 0x025b1d9e, 0x00ddd930, 0x0028b577}}, Y: Field{[10]uint32{0x03064547, 0x0351ab92, 0x001a60a6, 0x02a2bd8b, 0x03227ae8, 0x00782d4d, 0x02b5978b, 0x02c8fa79, 0x02b4b130, 0x001ea901}}}, + {X: Field{[10]uint32{0x01ed2b2d, 0x0053066e, 0x025db3d3, 0x0064486b, 0x01e97f6e, 0x01426fb0, 0x0164ea83, 0x0165429d, 0x02b4e5d3, 0x001c480d}}, Y: Field{[10]uint32{0x00a93616, 0x01d0539a, 0x0172a21d, 0x00cbe725, 0x00e3a322, 0x0094d0b2, 0x0298d2f4, 0x0183a811, 0x03f38d05, 0x0009618b}}}, + {X: Field{[10]uint32{0x00bfb392, 0x00ad54bc, 0x02df0756, 0x038c1e56, 0x03dca402, 0x026bf25c, 0x02e58c87, 0x0322ea50, 0x00f7d70f, 0x0016f3bc}}, Y: Field{[10]uint32{0x03af1919, 0x032c2242, 0x0247454c, 0x0391cc95, 0x011a444c, 0x00ff15be, 0x03b0e12c, 0x016ff4fb, 0x024cecb4, 0x001f3216}}}, + {X: Field{[10]uint32{0x01741ada, 0x0076164e, 0x02b0eb5c, 0x00519d9e, 0x03b9e5f2, 0x03d713a6, 0x03ab9f0a, 0x02286c2b, 0x002f9d50, 0x0037355c}}, Y: Field{[10]uint32{0x01cc1fa1, 0x009463b7, 0x0335f9eb, 0x0161bc31, 0x013369d5, 0x00949940, 0x00d40a4a, 0x038e9f73, 0x02d7ea13, 0x003dfaba}}}, + {X: Field{[10]uint32{0x02cb3d9f, 0x02e46ef9, 0x02ec9784, 0x02e4974f, 0x02363bfc, 0x02e2dc5d, 0x01c3ade1, 0x018a7424, 0x00d0004f, 0x000b3a8c}}, Y: Field{[10]uint32{0x01c42624, 0x011825a8, 0x036e3444, 0x0152ce6c, 0x03c48ba4, 0x00f778d2, 0x009a76aa, 0x02c5c73f, 0x03ada42a, 0x002a0fd2}}}, + {X: Field{[10]uint32{0x01c32f8d, 0x01b7f1e8, 0x035d009c, 0x035ba540, 0x01150e54, 0x029064d3, 0x015fcb13, 0x00647b7c, 0x01f2767b, 0x002162d0}}, Y: Field{[10]uint32{0x03de8dd7, 0x03b3e0a7, 0x01358e5c, 0x0277d975, 0x00b34d6e, 0x01200a8a, 0x00a21720, 0x0257d51e, 0x017d76dc, 0x0020602e}}}, + {X: Field{[10]uint32{0x030e81e6, 0x03f40830, 0x01294245, 0x01a034bc, 0x033eb9a6, 0x03d06004, 0x01234e5f, 0x0166e1b4, 0x0002bee3, 0x00357260}}, Y: Field{[10]uint32{0x033781de, 0x02bad256, 0x0376d921, 0x03a47640, 0x03a0b6bc, 0x00bf21ed, 0x01a2e4ee, 0x031e5419, 0x01a4cd2b, 0x0013948b}}}, + {X: Field{[10]uint32{0x0120c1ed, 0x01b0e865, 0x00fb7d4d, 0x01db6a2b, 0x0134002d, 0x00b792df, 0x024ddf58, 0x03aa7dc6, 0x01622f9c, 0x0003afe4}}, Y: Field{[10]uint32{0x02d4e251, 0x02074616, 0x0136ecd4, 0x0126394d, 0x027e43d0, 0x00631d6a, 0x03fb4833, 0x02073638, 0x03223e18, 0x003bb9d4}}}, + {X: Field{[10]uint32{0x0261db4d, 0x01bdb202, 0x01ff6b40, 0x0013cd9a, 0x000acc45, 0x03dd2f9a, 0x002e111a, 0x015bcc23, 0x02a9d087, 0x0000e1fd}}, Y: Field{[10]uint32{0x03cdd28a, 0x02d54ba1, 0x00c4a59d, 0x0288dc89, 0x01ed0bbb, 0x033d73d3, 0x01f96d5d, 0x017e449b, 0x01e3ea1d, 0x000a2165}}}, + {X: Field{[10]uint32{0x03e46714, 0x01d255b7, 0x020df255, 0x03ba7fbc, 0x009aa409, 0x01648051, 0x03a2d70e, 0x0354b8e0, 0x01c0989b, 0x00225ffc}}, Y: Field{[10]uint32{0x01adc9d1, 0x03b3e942, 0x016c6bca, 0x01a4db7f, 0x02de0940, 0x0112a1ce, 0x0295a006, 0x0194a7d3, 0x00c9308c, 0x000f3ef0}}}, + {X: Field{[10]uint32{0x01a395af, 0x01fbc6ad, 0x03eefb57, 0x00ddbe13, 0x03bbcbb3, 0x00b62c93, 0x02bbf21e, 0x02131e2d, 0x00a68e04, 0x000c956a}}, Y: Field{[10]uint32{0x0112aeb3, 0x0089664a, 0x0081fd81, 0x0355107a, 0x0379ef3f, 0x00b5d224, 0x014a426d, 0x012e139b, 0x0002f920, 0x0005ecf0}}}, + {X: Field{[10]uint32{0x01c55599, 0x023be7f7, 0x01b7e277, 0x00079c1c, 0x011fbca1, 0x007b6889, 0x003eeafb, 0x038ec0e5, 0x0152d4d9, 0x000b292a}}, Y: Field{[10]uint32{0x03891e00, 0x00b858c8, 0x016a0989, 0x032d8f28, 0x03e98631, 0x01d231fa, 0x01a2c044, 0x030637e0, 0x02ccdf02, 0x002feb2e}}}, + {X: Field{[10]uint32{0x024383b2, 0x0017dab7, 0x03d73105, 0x03e22936, 0x02046ee5, 0x006dbb2d, 0x03b0410e, 0x00cd2b51, 0x009c478c, 0x0030fa0a}}, Y: Field{[10]uint32{0x02f0f55f, 0x00012cf5, 0x0391fde4, 0x03b89c9e, 0x0000229b, 0x02d3b488, 0x03f4309c, 0x0048e191, 0x02ceb043, 0x0015e4b0}}}, + {X: Field{[10]uint32{0x01119049, 0x02f49f05, 0x019d5f87, 0x02376e4b, 0x0086fb96, 0x01fe6108, 0x03ad63c6, 0x024be619, 0x0360a862, 0x000aef7b}}, Y: Field{[10]uint32{0x00a85362, 0x0219d598, 0x03538802, 0x018953c0, 0x00e75dac, 0x03503534, 0x0099d193, 0x0311e4a4, 0x03623536, 0x003d292d}}}, + {X: Field{[10]uint32{0x032496a9, 0x00cf2e7f, 0x03d2ce03, 0x01ef88ab, 0x01fe3ee4, 0x005292f8, 0x0014ef07, 0x02b2cc60, 0x00909e7d, 0x001de9b8}}, Y: Field{[10]uint32{0x0251065f, 0x01746214, 0x00384381, 0x009f858f, 0x0234461e, 0x00658524, 0x01915d18, 0x0241b347, 0x0075b1a9, 0x00153c39}}}, + {X: Field{[10]uint32{0x00f40ff0, 0x00e79141, 0x00b1145c, 0x0391e4d4, 0x02ea94d5, 0x01e7d935, 0x034f4139, 0x0249537a, 0x016b7871, 0x0034656e}}, Y: Field{[10]uint32{0x00e0636c, 0x01fdca70, 0x0069bd99, 0x02b696bd, 0x00b8245c, 0x002936e2, 0x032d4b2b, 0x0211ba51, 0x0040613c, 0x0008e291}}}, + {X: Field{[10]uint32{0x00815b1f, 0x029866c1, 0x01bd8113, 0x00552369, 0x00ad024d, 0x00213d05, 0x03b0f3c6, 0x029975d6, 0x0336208a, 0x0030e6a8}}, Y: Field{[10]uint32{0x0126fe5a, 0x00cc54c4, 0x012004b2, 0x014db612, 0x02455a00, 0x0395cfb9, 0x0083b226, 0x00775052, 0x02d63274, 0x001eaac7}}}, + {X: Field{[10]uint32{0x01e31f30, 0x01dd933f, 0x028d2296, 0x01c11362, 0x01d6661c, 0x00932ecc, 0x020bd270, 0x020b6f2f, 0x023d0baf, 0x003a0328}}, Y: Field{[10]uint32{0x0197451b, 0x0211d129, 0x017138c4, 0x01091a18, 0x01f67e81, 0x03ae0f97, 0x03c583a5, 0x01e1e2f2, 0x01d47318, 0x002854f4}}}, + {X: Field{[10]uint32{0x0272ef80, 0x032dec0b, 0x00120711, 0x017f82bb, 0x01f3e850, 0x0356569f, 0x016723a4, 0x0308e83e, 0x0265a5a9, 0x000e56de}}, Y: Field{[10]uint32{0x009bf990, 0x026979f9, 0x034b6222, 0x000ca64b, 0x034f88cf, 0x02895950, 0x02d37b19, 0x01b8e4da, 0x01d54747, 0x00164083}}}, + {X: Field{[10]uint32{0x010b495c, 0x03f688a4, 0x02577644, 0x0117ffbc, 0x02e8b495, 0x0144a976, 0x017e2cd9, 0x008f49ed, 0x00dbb83e, 0x0019e9fa}}, Y: Field{[10]uint32{0x00965735, 0x014c0cba, 0x01f15a87, 0x03b9a338, 0x0041fd34, 0x03a02d04, 0x00a89f78, 0x02e7d040, 0x019d3791, 0x001f0052}}}, + {X: Field{[10]uint32{0x01c0c7e7, 0x02cecfdb, 0x03892ac9, 0x00218508, 0x03ecfb4b, 0x032f8b38, 0x01863952, 0x039ec21a, 0x027d76d2, 0x003100e3}}, Y: Field{[10]uint32{0x01e92f3b, 0x0080d459, 0x0229e72f, 0x002d9909, 0x00012946, 0x030d3f23, 0x02a27bab, 0x026df4c9, 0x030d9efc, 0x00186ece}}}, + {X: Field{[10]uint32{0x03a25e5a, 0x0095a630, 0x019a88a5, 0x00201c28, 0x01b9bdda, 0x03f0fd5d, 0x029c52f5, 0x034ebbb9, 0x01e226a4, 0x001dc169}}, Y: Field{[10]uint32{0x03c7a1b7, 0x020f92d4, 0x022073a8, 0x00088901, 0x0244be9e, 0x0071aa60, 0x0026973d, 0x001be309, 0x016cf019, 0x00116382}}}, + {X: Field{[10]uint32{0x00ff48d0, 0x028d1d4d, 0x028759e4, 0x03c6d192, 0x0268a5f1, 0x007f80e5, 0x02994fa0, 0x02d7985a, 0x03c35958, 0x003cf3a2}}, Y: Field{[10]uint32{0x010058fe, 0x02891cf8, 0x00d6b222, 0x02821d40, 0x038dc92a, 0x01ebb18f, 0x008c441f, 0x035e2d9f, 0x0197be3a, 0x00270687}}}, + {X: Field{[10]uint32{0x00a4e0d0, 0x0279fccf, 0x005d7664, 0x02b6bd5a, 0x003ebb94, 0x00075be2, 0x029d764e, 0x033af6e6, 0x0120de69, 0x002417b0}}, Y: Field{[10]uint32{0x00a9d554, 0x039127a7, 0x030e93a8, 0x004b5e6a, 0x024d42ce, 0x01470032, 0x00a75d0e, 0x02a8e9dd, 0x02993974, 0x0024985f}}}, + {X: Field{[10]uint32{0x0321eeed, 0x02b69a26, 0x006b4f15, 0x011ff6c9, 0x0127d484, 0x01993078, 0x02d0edc3, 0x02164a2e, 0x024da357, 0x002c6dd2}}, Y: Field{[10]uint32{0x013206d9, 0x02c9baa7, 0x021328f5, 0x0240cf13, 0x00c14e4d, 0x00c8b134, 0x00e38231, 0x027a3ef3, 0x01c7b84e, 0x00310d4e}}}, + {X: Field{[10]uint32{0x03d8bcf1, 0x03ee58c0, 0x02025bd5, 0x01344b4f, 0x038dcf81, 0x0310b6ad, 0x03a2a471, 0x00b51acb, 0x0165c72f, 0x00035100}}, Y: Field{[10]uint32{0x0343ae3e, 0x001c87d4, 0x0022aca3, 0x01247601, 0x03fabab7, 0x031da0f7, 0x03ad9cff, 0x017eb3a5, 0x0150261f, 0x00382192}}}, + {X: Field{[10]uint32{0x0053b303, 0x00fe4e54, 0x02ed1de0, 0x02bd9602, 0x03fe08d5, 0x0355ce95, 0x03910be6, 0x00669fde, 0x004f722c, 0x003fd493}}, Y: Field{[10]uint32{0x0353bf0d, 0x02ea986d, 0x0391398f, 0x01a18bd7, 0x035b9f13, 0x00c80cd6, 0x0262deab, 0x02aa2ece, 0x014e5b25, 0x0003f52b}}}, + {X: Field{[10]uint32{0x018d091e, 0x017fbc63, 0x01a4463a, 0x02c128eb, 0x038fafa2, 0x02706e90, 0x0376a53c, 0x00420f92, 0x00bd331c, 0x003bff78}}, Y: Field{[10]uint32{0x01947dde, 0x038530c7, 0x02b9aee0, 0x037cad06, 0x02c563bd, 0x01b33bc3, 0x02e54208, 0x0084179a, 0x029ca75c, 0x003f5ea1}}}, + {X: Field{[10]uint32{0x033875e8, 0x03115c4b, 0x01278f40, 0x01939027, 0x021115ba, 0x0160eb6c, 0x034a304b, 0x03667a22, 0x02c099c8, 0x002979d1}}, Y: Field{[10]uint32{0x02934a68, 0x0307bbcb, 0x00c07fd2, 0x00e7767a, 0x02841709, 0x001cfdff, 0x00baba4f, 0x00e0c0b1, 0x0112c2af, 0x001fe0c8}}}, + {X: Field{[10]uint32{0x02ccb431, 0x006424cc, 0x0246a1ba, 0x01d121be, 0x037df5e2, 0x03f91544, 0x00daa722, 0x03a50e76, 0x01e3af5e, 0x001ab32e}}, Y: Field{[10]uint32{0x0328dcae, 0x03277267, 0x01dc443e, 0x00207f3d, 0x01a3faf1, 0x01a3e4b9, 0x03c26a9b, 0x01960141, 0x0258842d, 0x003c3785}}}, + {X: Field{[10]uint32{0x032b6d4e, 0x0225e2bd, 0x023ba1ec, 0x00c7b404, 0x00b86f3d, 0x03be15a6, 0x00e782b3, 0x00cafdba, 0x0055e40d, 0x003204f4}}, Y: Field{[10]uint32{0x01068ca6, 0x01e40463, 0x0128d288, 0x03d0aee5, 0x0047d37e, 0x021318a0, 0x01a41916, 0x0118c713, 0x03572f92, 0x002ebdb5}}}, + {X: Field{[10]uint32{0x03c7aaf9, 0x02a11365, 0x01177038, 0x0398bf7c, 0x03599dfa, 0x02f93561, 0x03baeb58, 0x03f18913, 0x00122cad, 0x0022e208}}, Y: Field{[10]uint32{0x02f7a6a3, 0x00f1e081, 0x00b2d409, 0x0291da02, 0x007867c8, 0x029690aa, 0x016e131f, 0x003693dc, 0x0293ac90, 0x003d79b0}}}, + {X: Field{[10]uint32{0x017310ce, 0x006760cb, 0x017ee096, 0x00d1341c, 0x03bc02ff, 0x03fea910, 0x00a5acc4, 0x03960ad5, 0x0050f49e, 0x0023c1d4}}, Y: Field{[10]uint32{0x01f7fd3f, 0x0284c56d, 0x021c9b99, 0x02a1adc0, 0x01f1f9f9, 0x011e668f, 0x00555c4a, 0x034c95f3, 0x01bb7ab3, 0x0004ee40}}}, + {X: Field{[10]uint32{0x00374c58, 0x035047ec, 0x01f66921, 0x036c8720, 0x0389a456, 0x00bdcb25, 0x025fb1df, 0x00f950f1, 0x02f8cf64, 0x002ef214}}, Y: Field{[10]uint32{0x030a590b, 0x012ee8ac, 0x032cd4c1, 0x00be13c0, 0x03a27e1c, 0x02c922cf, 0x03f604cf, 0x007892ca, 0x02bbe797, 0x002b423a}}}, + {X: Field{[10]uint32{0x0280bc1f, 0x000940c6, 0x009fcffa, 0x0332c795, 0x03009278, 0x03730b72, 0x00edddc9, 0x0156ee1e, 0x004b662b, 0x000b5df7}}, Y: Field{[10]uint32{0x00d058eb, 0x01821c3b, 0x03fffa8e, 0x0282272b, 0x02c07707, 0x01dbbdbb, 0x01a62f4e, 0x03ca86b4, 0x00d84fa7, 0x000a22ec}}}, + {X: Field{[10]uint32{0x03ccbdf9, 0x01e452b5, 0x00b4ffea, 0x02ae7216, 0x00c90945, 0x012ee9b2, 0x03df7d99, 0x02a1bae6, 0x031ff3b4, 0x002f20fd}}, Y: Field{[10]uint32{0x03232292, 0x034f9252, 0x00b30020, 0x018e8ea2, 0x01fa3c25, 0x03446550, 0x01ed4553, 0x01f48e02, 0x03a3e506, 0x00063a47}}}, + {X: Field{[10]uint32{0x00200919, 0x036d0d4b, 0x037b3205, 0x03038aee, 0x0045f83d, 0x011f4149, 0x0211b7e8, 0x02239ac3, 0x02578d9b, 0x001f56e5}}, Y: Field{[10]uint32{0x00515ba9, 0x03d55c24, 0x00d352fa, 0x01caabf5, 0x00b1c9e6, 0x015a6bd3, 0x00e7230c, 0x0304370a, 0x037b8830, 0x00079a27}}}, + {X: Field{[10]uint32{0x000cdc80, 0x03e4a288, 0x03cdc1ba, 0x021f2b30, 0x01516148, 0x01183128, 0x01bab4c7, 0x021a20c7, 0x03648d75, 0x00217a7c}}, Y: Field{[10]uint32{0x01369e27, 0x0239684c, 0x03a9dd5f, 0x03d300ff, 0x035ba5e4, 0x001fdff0, 0x025224cc, 0x01170161, 0x01180d50, 0x001fd339}}}, + {X: Field{[10]uint32{0x02cd0810, 0x00765d12, 0x0065da10, 0x01dd16c7, 0x029c1d10, 0x02ef6dc6, 0x0055816d, 0x0252f4d2, 0x00dfc1c0, 0x001094e4}}, Y: Field{[10]uint32{0x0349bc00, 0x01df53c7, 0x0327d1e2, 0x030c2303, 0x02707547, 0x0027785d, 0x0026d94f, 0x0135c1a4, 0x00dd20ef, 0x00207c53}}}, + {X: Field{[10]uint32{0x013549d7, 0x036bfd90, 0x004194ce, 0x0026fe39, 0x02dbb594, 0x00283dd6, 0x00d00bb6, 0x024eb094, 0x030b66dc, 0x000f31f3}}, Y: Field{[10]uint32{0x00204a58, 0x01307587, 0x0323a066, 0x00668afa, 0x02ae17b7, 0x037dc399, 0x008bcf99, 0x036267da, 0x032fc3db, 0x000cc698}}}, + {X: Field{[10]uint32{0x0270853d, 0x00acfaf3, 0x035f017e, 0x00a8af8e, 0x009d6a0b, 0x03fde276, 0x03c923bc, 0x02f3a023, 0x008db8a1, 0x003f5c82}}, Y: Field{[10]uint32{0x01eaf599, 0x0037b242, 0x03494b71, 0x02a37d91, 0x0193db4a, 0x0282fb76, 0x03296383, 0x0066ebac, 0x0323a388, 0x0034e44a}}}, + {X: Field{[10]uint32{0x03e65060, 0x02cd6b3b, 0x037a6b72, 0x01071f74, 0x01c73185, 0x0282ea89, 0x00940af9, 0x025b6936, 0x038d5e00, 0x000f9563}}, Y: Field{[10]uint32{0x0260e90a, 0x01414f79, 0x00dde769, 0x00c5ffb0, 0x03f78f64, 0x02ea56e1, 0x03bdb3ef, 0x020170fa, 0x017f069d, 0x000a900f}}}, + {X: Field{[10]uint32{0x00694a7e, 0x03c81276, 0x00b01e82, 0x00aa43f4, 0x03721ec3, 0x0386dd17, 0x0000149f, 0x03c8885b, 0x0223f525, 0x001c1c20}}, Y: Field{[10]uint32{0x03d12569, 0x036afafb, 0x0354b410, 0x02218d98, 0x01fce17d, 0x01f650ed, 0x0186ac90, 0x0354fc67, 0x0387f0b4, 0x003bd2b5}}}, + {X: Field{[10]uint32{0x02414f72, 0x03a4452a, 0x012fc6e5, 0x02537be7, 0x02440b4a, 0x007933dd, 0x01eddb71, 0x03ebd92e, 0x0225eabf, 0x003b28a5}}, Y: Field{[10]uint32{0x037618cf, 0x00e2e388, 0x009dcd35, 0x00a0a0e6, 0x03f798b6, 0x03162433, 0x03bb2274, 0x028ff2c8, 0x007575af, 0x003c7e0e}}}, + {X: Field{[10]uint32{0x03297695, 0x00e3d957, 0x00108778, 0x02959b5b, 0x02da7423, 0x02186496, 0x0206db46, 0x03c31311, 0x0350542d, 0x0016df11}}, Y: Field{[10]uint32{0x011f784d, 0x008ae79e, 0x010795f9, 0x00b57a01, 0x01de04db, 0x033669a9, 0x00cb1a24, 0x02227f5b, 0x03661ae1, 0x0010a044}}}, + {X: Field{[10]uint32{0x00012042, 0x026e61af, 0x0038cb37, 0x01a20016, 0x02bd5da1, 0x039e20bf, 0x02982dd1, 0x02cbbb4d, 0x03e6040c, 0x002bc697}}, Y: Field{[10]uint32{0x013e6224, 0x0104856b, 0x00778b7e, 0x023a18f5, 0x02576877, 0x03f3f228, 0x03d12ed1, 0x0298d298, 0x0149305f, 0x001c55c1}}}, + {X: Field{[10]uint32{0x0366b1d2, 0x00659da4, 0x0346a9a3, 0x022c755d, 0x03e1e8b1, 0x00627132, 0x03cd1be1, 0x01f9c3e0, 0x03a24678, 0x001c9d10}}, Y: Field{[10]uint32{0x0116d540, 0x024a341b, 0x03dead68, 0x0303480b, 0x004df56a, 0x01dc396d, 0x02565cc1, 0x00fa2684, 0x00269bba, 0x00218d5e}}}, + {X: Field{[10]uint32{0x02640b8d, 0x03866284, 0x012556c5, 0x00aeafcf, 0x03ae2c9a, 0x004e647d, 0x01e68352, 0x0398a852, 0x0179db34, 0x0000259e}}, Y: Field{[10]uint32{0x019edcc4, 0x0301f07f, 0x03b014d4, 0x009c946c, 0x018547b8, 0x02fcf47b, 0x02e44ac3, 0x015944f3, 0x014f5244, 0x00267707}}}, + {X: Field{[10]uint32{0x03203601, 0x03ee20eb, 0x038b159d, 0x01f6f95e, 0x02be5693, 0x0016c1ac, 0x02f9d739, 0x0124789f, 0x01db08f3, 0x001e5002}}, Y: Field{[10]uint32{0x02da40b6, 0x0329878a, 0x017e750e, 0x009090e4, 0x005db60d, 0x022761ad, 0x026a0872, 0x03873456, 0x024d7ee5, 0x00169ab5}}}, + {X: Field{[10]uint32{0x01851d10, 0x018a5faa, 0x015110cf, 0x00bd41e4, 0x03d2f421, 0x03ec3747, 0x029470b1, 0x02c2436e, 0x02396f90, 0x0021f2f6}}, Y: Field{[10]uint32{0x001b63f0, 0x02480169, 0x013e773a, 0x014b8473, 0x03fb8f79, 0x01561771, 0x01fb4c9c, 0x03e65d40, 0x01f3a2a4, 0x00272825}}}, + {X: Field{[10]uint32{0x0110acb0, 0x0116c06e, 0x01fa84b2, 0x036816e5, 0x02cd1f3a, 0x006f9f84, 0x00207720, 0x005d4963, 0x0303475d, 0x0027b55e}}, Y: Field{[10]uint32{0x03bbd5eb, 0x03ba8da8, 0x0350d324, 0x0112387b, 0x03253106, 0x0032cfa2, 0x0058a7bd, 0x0206be17, 0x005443bd, 0x00356324}}}, + {X: Field{[10]uint32{0x028b0402, 0x00d53980, 0x02be7d5d, 0x0087f499, 0x0335fd95, 0x01844cd8, 0x02c77e38, 0x011260b6, 0x022292ca, 0x003be342}}, Y: Field{[10]uint32{0x00b58b6b, 0x01629d0f, 0x0037ff97, 0x034b8ad0, 0x02f2f547, 0x01df06a6, 0x0223e5b6, 0x02076a92, 0x034a5568, 0x00395712}}}, + {X: Field{[10]uint32{0x0127e3d9, 0x000565f4, 0x01c75abd, 0x0386c4bd, 0x002299f6, 0x03e93b42, 0x02d369f4, 0x03ca7540, 0x01f5a274, 0x001b6e88}}, Y: Field{[10]uint32{0x01a39d94, 0x0369de94, 0x00f3c930, 0x02774b7c, 0x01c951f6, 0x039ba720, 0x00302de3, 0x03907a31, 0x032f0a0c, 0x001da17d}}}, + {X: Field{[10]uint32{0x00399a3d, 0x0111a4f2, 0x032aa6ba, 0x026dfecc, 0x02784196, 0x01bb4a94, 0x001b0f42, 0x0308d5f7, 0x02bf857a, 0x0023370f}}, Y: Field{[10]uint32{0x03f910ca, 0x01dbe92d, 0x02beca58, 0x02ac9d22, 0x03df250d, 0x02da2866, 0x00d87249, 0x031c501b, 0x03c1915a, 0x0008d374}}}, + {X: Field{[10]uint32{0x01eca2da, 0x03f620ad, 0x00de1e88, 0x03e8a4d1, 0x00a9c790, 0x011c1a26, 0x03391b6f, 0x0196d1f8, 0x01c8caa6, 0x0028020a}}, Y: Field{[10]uint32{0x01424110, 0x02d4c5bf, 0x02aa8184, 0x025d81a3, 0x00234862, 0x020c6095, 0x004b1299, 0x01333962, 0x00c71e83, 0x002df23f}}}, + {X: Field{[10]uint32{0x0149ce6a, 0x02007748, 0x005f5640, 0x00bbbfdf, 0x02a4ed5b, 0x0353c8b5, 0x012e54a1, 0x02fac528, 0x0362446c, 0x00161cbd}}, Y: Field{[10]uint32{0x00ee198f, 0x0283070a, 0x01e2ac75, 0x0362eeb3, 0x004c37d5, 0x010d93bd, 0x030c29e2, 0x015fe869, 0x03e88627, 0x0022ab34}}}, + {X: Field{[10]uint32{0x02fd34f2, 0x0331ae40, 0x03b2fec4, 0x02b24674, 0x0353e7ce, 0x016d4cb3, 0x02677d2e, 0x01c543c8, 0x01c05dba, 0x002dc3b5}}, Y: Field{[10]uint32{0x00d28cf8, 0x035120a9, 0x0083126b, 0x026c2158, 0x0376c3d6, 0x006363f2, 0x03cee0b0, 0x005c728b, 0x0128cc74, 0x001f90fd}}}, + {X: Field{[10]uint32{0x0053bb52, 0x00305ae0, 0x027d309d, 0x00169e42, 0x022e8ca5, 0x03ac272e, 0x01a6d7c8, 0x0187431f, 0x02133c61, 0x0012faa8}}, Y: Field{[10]uint32{0x01d4f6d5, 0x02b372a6, 0x03ffadb1, 0x01b30a62, 0x03070349, 0x012cbb84, 0x0226d8fe, 0x0368bb19, 0x003c9cbd, 0x00369302}}}, + {X: Field{[10]uint32{0x01804831, 0x003a07c1, 0x035fc8a1, 0x00d134d3, 0x0108594b, 0x017e6af4, 0x00de363c, 0x0060d29e, 0x02c653ce, 0x002a34c7}}, Y: Field{[10]uint32{0x02c5cff9, 0x0130a1b6, 0x00bce64f, 0x00616529, 0x008c462c, 0x02df22e9, 0x01b5601c, 0x038dc27b, 0x01cd7cbb, 0x002d35aa}}}, +} + +var prec = [64][16]XY{ + { + {X: Field{[10]uint32{0x02f81798, 0x00a056c5, 0x028d959f, 0x036cb738, 0x03029bfc, 0x03a1c2c1, 0x0206295c, 0x02eeb156, 0x027ef9dc, 0x001e6f99}}, Y: Field{[10]uint32{0x0310d4b8, 0x01f423fe, 0x014199c4, 0x01229a15, 0x00fd17b4, 0x0384422a, 0x024fbfc0, 0x03119576, 0x027726a3, 0x00120eb6}}}, + {X: Field{[10]uint32{0x00709ee5, 0x03026e57, 0x03ca7aba, 0x012e33bc, 0x005c778e, 0x01701f36, 0x005406e9, 0x01f5b4c1, 0x039441ed, 0x0031811f}}, Y: Field{[10]uint32{0x00cfe52a, 0x010c6a54, 0x010e1236, 0x0194c99b, 0x02f7f632, 0x019b3abb, 0x00584194, 0x030ce68f, 0x00fea63d, 0x0006b85a}}}, + {X: Field{[10]uint32{0x00e036f9, 0x007c44ef, 0x019b0860, 0x01160dbe, 0x01b531c8, 0x0227548a, 0x0344f85f, 0x030c4124, 0x02019258, 0x003e4c22}}, Y: Field{[10]uint32{0x00b8e672, 0x027f5d61, 0x0231b6cb, 0x0264d308, 0x026500a9, 0x028dfcd5, 0x02337e62, 0x03a0503f, 0x030f632d, 0x000e23de}}}, + {X: Field{[10]uint32{0x00c4cd13, 0x02a52afa, 0x0358474f, 0x02403b81, 0x00cc6c13, 0x00c2c501, 0x01e49049, 0x0203cd60, 0x03f1c10d, 0x003924f6}}, Y: Field{[10]uint32{0x03739922, 0x025ef711, 0x03e40cfe, 0x00cefef7, 0x00d967ae, 0x03a94512, 0x002e2098, 0x0156dd59, 0x013ea0d4, 0x00147b66}}}, + {X: Field{[10]uint32{0x0240efe4, 0x02355a6c, 0x01ab7cba, 0x02f77186, 0x00e88b84, 0x0297144a, 0x034a7250, 0x00824d56, 0x024d1a07, 0x000be2f7}}, Y: Field{[10]uint32{0x02ac62d6, 0x021f4ea9, 0x02840dca, 0x006eac35, 0x02f78827, 0x01b27109, 0x01ba9dda, 0x038f5b53, 0x022636e5, 0x00362b08}}}, + {X: Field{[10]uint32{0x00297556, 0x015e8518, 0x0218b2f0, 0x00be15a2, 0x0382f647, 0x01548d74, 0x0053a143, 0x03ba9081, 0x03d5755e, 0x003ffe5e}}, Y: Field{[10]uint32{0x0075f297, 0x01c30dac, 0x024a03c8, 0x03d9463f, 0x00de80f0, 0x03d17158, 0x03e96017, 0x02d883ce, 0x037aacfb, 0x002b849d}}}, + {X: Field{[10]uint32{0x02c4f9bc, 0x02f77b72, 0x0239ce92, 0x01f80cc3, 0x023d419b, 0x00ba9e83, 0x018f365f, 0x02d3aa8e, 0x00646e5d, 0x00172f7c}}, Y: Field{[10]uint32{0x007264da, 0x02098a02, 0x027b5a50, 0x02e04ff7, 0x03a813d0, 0x01869536, 0x0178d6d8, 0x0165828c, 0x0240ba25, 0x001abaf2}}}, + {X: Field{[10]uint32{0x010a2a01, 0x0213bcf8, 0x0088a677, 0x001796be, 0x030a1bdd, 0x01c3cf0b, 0x033843fb, 0x00d476bf, 0x01e15cca, 0x000bc079}}, Y: Field{[10]uint32{0x00bde904, 0x028b2ddb, 0x03617b5d, 0x035ae96d, 0x00c2e213, 0x00cb44ed, 0x03d082a1, 0x026524a4, 0x00a74153, 0x0017136a}}}, + {X: Field{[10]uint32{0x0027ccbe, 0x03c4437f, 0x02714c35, 0x025d315f, 0x01e09796, 0x03d566af, 0x02d178a9, 0x03d94c26, 0x00e2f0c7, 0x002b3521}}, Y: Field{[10]uint32{0x024f9c37, 0x03098ab1, 0x00e0f05c, 0x0290dd7e, 0x01add888, 0x018ed87a, 0x03809717, 0x0367f590, 0x0121b0a7, 0x00330ce2}}}, + {X: Field{[10]uint32{0x03e247c7, 0x01a38a91, 0x002b752a, 0x026c650f, 0x013442d4, 0x02b9ab97, 0x0077c7b1, 0x032188d5, 0x019e47f3, 0x002810d3}}, Y: Field{[10]uint32{0x037368d7, 0x03b94ec0, 0x021593cb, 0x00bb61de, 0x016f794c, 0x00e8931a, 0x036c7e69, 0x02f09e8e, 0x02425419, 0x00224eae}}}, + {X: Field{[10]uint32{0x01a008cb, 0x0305e257, 0x03891bbe, 0x002f9705, 0x00564998, 0x003196ab, 0x034246b7, 0x0104797b, 0x03f858a9, 0x001dd2b9}}, Y: Field{[10]uint32{0x0153c61b, 0x035d3272, 0x016a8301, 0x038b7fe7, 0x01372db1, 0x01edecd9, 0x003dd56d, 0x01786409, 0x0032eb6b, 0x00366128}}}, + {X: Field{[10]uint32{0x00afe85a, 0x003d1c1c, 0x0095bc5b, 0x01065880, 0x03687cf4, 0x035cd18c, 0x0038f004, 0x01586c57, 0x01d548e7, 0x00340445}}, Y: Field{[10]uint32{0x00062327, 0x0146c4fd, 0x02d526b0, 0x017766a1, 0x0179238c, 0x005ef605, 0x0364537e, 0x03835ea2, 0x03fdc815, 0x002a7cd3}}}, + {X: Field{[10]uint32{0x01405aa8, 0x0377e3c6, 0x018cddee, 0x03198439, 0x01b075fb, 0x00dd2194, 0x011d205c, 0x00a22f1f, 0x03c2d975, 0x003ca1dc}}, Y: Field{[10]uint32{0x0303ed81, 0x0172d4b6, 0x0291f29b, 0x0369487e, 0x033a1a06, 0x01736bd1, 0x00212eb6, 0x002a25d6, 0x002e8d88, 0x0002ac24}}}, + {X: Field{[10]uint32{0x00e823e4, 0x02c90698, 0x009e6e49, 0x018d9e25, 0x0226aa7b, 0x01f4e38c, 0x024e67f0, 0x01c673f5, 0x039e895e, 0x001267f7}}, Y: Field{[10]uint32{0x03a13f5b, 0x03d03500, 0x015bcc65, 0x0309e8fe, 0x00464279, 0x01ecf519, 0x03044e4a, 0x02154643, 0x02c4b54e, 0x0032b0bd}}}, + {X: Field{[10]uint32{0x027e080e, 0x036f3e38, 0x0379e44a, 0x01bcf217, 0x0131e594, 0x0257fd04, 0x0065ae30, 0x03aa5969, 0x014f7d43, 0x0035e493}}, Y: Field{[10]uint32{0x02a26b58, 0x013727fd, 0x013a5c50, 0x00af625b, 0x03ea40af, 0x02331b7b, 0x0042ec22, 0x01ca9a0e, 0x0072a86c, 0x0016078a}}}, + {X: Field{[10]uint32{0x026dec0a, 0x03ba278a, 0x01ae9c44, 0x01a6e1e9, 0x03b2a313, 0x00708fa5, 0x011aabc2, 0x027b14c0, 0x0293b59e, 0x003983f3}}, Y: Field{[10]uint32{0x01616821, 0x00cb339a, 0x03f0be1f, 0x00791348, 0x00129689, 0x015e4dc4, 0x0399f34f, 0x02564a76, 0x007399e5, 0x003df8d4}}}, + }, + { + {X: Field{[10]uint32{0x026dec0a, 0x03ba278a, 0x01ae9c44, 0x01a6e1e9, 0x03b2a313, 0x00708fa5, 0x011aabc2, 0x027b14c0, 0x0293b59e, 0x003983f3}}, Y: Field{[10]uint32{0x01616821, 0x00cb339a, 0x03f0be1f, 0x00791348, 0x00129689, 0x015e4dc4, 0x0399f34f, 0x02564a76, 0x007399e5, 0x003df8d4}}}, + {X: Field{[10]uint32{0x03143e65, 0x0036f501, 0x0261d75d, 0x02e26412, 0x02dacffc, 0x00bcde33, 0x036e054e, 0x0288b51e, 0x01d74fb5, 0x0034c066}}, Y: Field{[10]uint32{0x00106ab9, 0x00ffc7c9, 0x0019605b, 0x030d93b6, 0x011f760c, 0x0260e019, 0x016dec9e, 0x03570ecf, 0x019d0ae3, 0x002540e3}}}, + {X: Field{[10]uint32{0x0118e5c3, 0x021c2a84, 0x02bc19bd, 0x009d14af, 0x03fc579b, 0x013996d2, 0x001656ef, 0x00c1f6d1, 0x035d9645, 0x001bb28c}}, Y: Field{[10]uint32{0x01a08668, 0x028bde01, 0x02c34498, 0x00e8efe3, 0x003a496a, 0x012e1d68, 0x02f57907, 0x001c4164, 0x03b57a7a, 0x00354048}}}, + {X: Field{[10]uint32{0x0074ef8b, 0x024639be, 0x03d81e37, 0x007736eb, 0x00fc4c6f, 0x020ca08f, 0x01051eaf, 0x03aadc2c, 0x01542d16, 0x002fc8f0}}, Y: Field{[10]uint32{0x02831d9f, 0x00dfbf99, 0x02f784dc, 0x01520478, 0x00c522fc, 0x0294e4b9, 0x01928a0b, 0x000dcdeb, 0x026fc330, 0x00172ce1}}}, + {X: Field{[10]uint32{0x0387f62e, 0x034c7853, 0x021270ec, 0x00e18dc5, 0x0010e6e6, 0x00d1967c, 0x03c744ed, 0x0243b035, 0x03bef1bf, 0x003a588e}}, Y: Field{[10]uint32{0x004ee737, 0x004fabe9, 0x0044e530, 0x032775a2, 0x01fe6043, 0x03b6aa4a, 0x03e953a8, 0x0267a783, 0x003b4bc2, 0x000e2a5d}}}, + {X: Field{[10]uint32{0x038cb0e3, 0x00ceb29f, 0x023a4439, 0x00ff87bf, 0x02a22eb5, 0x02cbadcb, 0x0264e044, 0x01b63e3e, 0x00e57445, 0x000fc3a0}}, Y: Field{[10]uint32{0x025f404f, 0x00a278ba, 0x013a4cb0, 0x00ea996d, 0x03950125, 0x0217406c, 0x00b9c084, 0x02f247a4, 0x03d7296c, 0x0032d9b5}}}, + {X: Field{[10]uint32{0x028d733c, 0x02ab7e0a, 0x028f9eb0, 0x02fd8bf2, 0x02ffc274, 0x002035a0, 0x004a36f2, 0x0076e822, 0x0173e516, 0x002f20b7}}, Y: Field{[10]uint32{0x007797f0, 0x0218413d, 0x017301e7, 0x02eb9ce2, 0x03ae93a0, 0x0067c0b7, 0x029b4bf7, 0x0072b152, 0x003a044b, 0x00397ca3}}}, + {X: Field{[10]uint32{0x0369a24e, 0x001dd159, 0x01655647, 0x035c014d, 0x00bcf55c, 0x01f459c7, 0x02c3d09f, 0x01e819a5, 0x03e4033f, 0x000d3fce}}, Y: Field{[10]uint32{0x03cc2f1a, 0x00419e9c, 0x03681849, 0x030fa3e2, 0x0055df16, 0x020c8263, 0x02619d89, 0x01b154fd, 0x01623a23, 0x00176744}}}, + {X: Field{[10]uint32{0x03bc7671, 0x03f88c57, 0x00e32d7e, 0x03214a16, 0x00743f1b, 0x01e63d24, 0x00291ce1, 0x01c84748, 0x0248c765, 0x00238f44}}, Y: Field{[10]uint32{0x00717dec, 0x00771906, 0x0144a7ef, 0x02aa98f8, 0x02b9352b, 0x00e4fa43, 0x00480e19, 0x032e07d9, 0x00e10ecf, 0x00026692}}}, + {X: Field{[10]uint32{0x01b03f6c, 0x030cab54, 0x0184b05e, 0x0048aa6c, 0x02a4d047, 0x03dcfd5d, 0x00776838, 0x036488af, 0x03a27a52, 0x000c2244}}, Y: Field{[10]uint32{0x00fe4c67, 0x02d7bf3a, 0x01f1260a, 0x03aa0af4, 0x01a8333f, 0x01b00dd7, 0x023531f6, 0x02f97e47, 0x009543fe, 0x003d296c}}}, + {X: Field{[10]uint32{0x02b31db2, 0x021d0caf, 0x006a0f32, 0x009e23d4, 0x028fcae8, 0x002228ad, 0x02a193ed, 0x02926225, 0x01aa2234, 0x001e2a24}}, Y: Field{[10]uint32{0x01fa4343, 0x027588ee, 0x0382d306, 0x03376002, 0x0254379b, 0x01cc0b7d, 0x035f2552, 0x00d72ff3, 0x035beb50, 0x001a44a8}}}, + {X: Field{[10]uint32{0x03ce1752, 0x01d43dcc, 0x0204ec7b, 0x025f5f34, 0x02e783c7, 0x026726ba, 0x02ddf64d, 0x0318d604, 0x0258d01d, 0x0035e836}}, Y: Field{[10]uint32{0x0362cef4, 0x0009ce01, 0x03742bbc, 0x02a3018a, 0x010be040, 0x0038a119, 0x03292834, 0x0200cbdb, 0x00e06800, 0x002449dc}}}, + {X: Field{[10]uint32{0x01b0e595, 0x0123dde3, 0x002bb653, 0x02e7ee82, 0x03a7163c, 0x00581dba, 0x00e37658, 0x006c5f5f, 0x001855db, 0x001f619e}}, Y: Field{[10]uint32{0x00733de8, 0x01478eaf, 0x01532999, 0x01383897, 0x00293784, 0x0353e20e, 0x0162e2be, 0x03e1dcb9, 0x02dfec86, 0x0038ae66}}}, + {X: Field{[10]uint32{0x00e6b514, 0x03115c1b, 0x03322609, 0x031e6cd5, 0x01890905, 0x00211352, 0x005c3560, 0x03b45622, 0x01c2f919, 0x00022f22}}, Y: Field{[10]uint32{0x00c95157, 0x00fd33aa, 0x036f06f6, 0x0158449d, 0x01172d30, 0x02d624b0, 0x0376fec3, 0x03305b79, 0x03cdd7cd, 0x0034c4fc}}}, + {X: Field{[10]uint32{0x02060dfc, 0x03fbe145, 0x02a2a008, 0x02108179, 0x0276545f, 0x0106ac21, 0x0094b9dc, 0x00ab2121, 0x010f0058, 0x0037714c}}, Y: Field{[10]uint32{0x03820ca8, 0x03e2adb9, 0x00730fb5, 0x031aaf41, 0x0041dbaf, 0x0323c3a4, 0x011ab6dc, 0x025a4806, 0x033af20d, 0x002e834b}}}, + {X: Field{[10]uint32{0x01f51508, 0x01b88ff5, 0x01ca1064, 0x02af56b0, 0x00d8c39c, 0x01cb788e, 0x02a6e3e1, 0x002767a8, 0x023212c6, 0x0020a089}}, Y: Field{[10]uint32{0x02e26caf, 0x02dbabfd, 0x017bed31, 0x02b0bdec, 0x0262d613, 0x002d82b3, 0x00256e83, 0x037f917a, 0x00098557, 0x00047e2a}}}, + }, + { + {X: Field{[10]uint32{0x01f51508, 0x01b88ff5, 0x01ca1064, 0x02af56b0, 0x00d8c39c, 0x01cb788e, 0x02a6e3e1, 0x002767a8, 0x023212c6, 0x0020a089}}, Y: Field{[10]uint32{0x02e26caf, 0x02dbabfd, 0x017bed31, 0x02b0bdec, 0x0262d613, 0x002d82b3, 0x00256e83, 0x037f917a, 0x00098557, 0x00047e2a}}}, + {X: Field{[10]uint32{0x0334a24d, 0x038b003b, 0x019d0926, 0x01a36785, 0x010adbc9, 0x033e4635, 0x01a857a9, 0x027fce41, 0x00b287a7, 0x001194dc}}, Y: Field{[10]uint32{0x033887f4, 0x023ec82c, 0x03a10a2f, 0x02c8574d, 0x01588e09, 0x037bb0b0, 0x02f8bdaf, 0x03020a92, 0x01b38368, 0x000d794c}}}, + {X: Field{[10]uint32{0x017e8dfa, 0x03032e79, 0x02184fcf, 0x02468f1f, 0x00098091, 0x032a6328, 0x01a30f8a, 0x02713036, 0x032ff079, 0x002098b3}}, Y: Field{[10]uint32{0x03ac376a, 0x03fe363e, 0x0047835c, 0x00ccac53, 0x0057b6ed, 0x016cd3cd, 0x03ee22ec, 0x0279399b, 0x01e20910, 0x0020ff65}}}, + {X: Field{[10]uint32{0x0285131f, 0x02406cb8, 0x03088d5b, 0x0337204e, 0x00aaec6e, 0x01ab5890, 0x024a18f6, 0x02f5df59, 0x03b8e23c, 0x000907fa}}, Y: Field{[10]uint32{0x0350026d, 0x00f99bc9, 0x035afabb, 0x003ef432, 0x00cd50fd, 0x00e6077e, 0x00420bd1, 0x03e34f5b, 0x00d9ff94, 0x00144cde}}}, + {X: Field{[10]uint32{0x026bdb6f, 0x00b922c0, 0x00b94905, 0x0351edcd, 0x037ca41b, 0x033a6721, 0x00105b24, 0x0377545a, 0x008b1da0, 0x00066097}}, Y: Field{[10]uint32{0x009cfc9b, 0x03dc2131, 0x013a6b5d, 0x033233db, 0x00ebe9ee, 0x013d67db, 0x00261cc9, 0x021e3cc8, 0x010f0d4c, 0x0018a50c}}}, + {X: Field{[10]uint32{0x0070620c, 0x03307c9f, 0x008d9d17, 0x02faaf0a, 0x004998c4, 0x02d9c5e0, 0x00dd31a2, 0x008db718, 0x00a48d2c, 0x000594ea}}, Y: Field{[10]uint32{0x015b32cd, 0x00ba074c, 0x01c526ca, 0x01237f4f, 0x00012af7, 0x03be9c07, 0x03a99474, 0x01fdebab, 0x010935af, 0x0000ce0a}}}, + {X: Field{[10]uint32{0x0182824c, 0x0342548f, 0x034e650e, 0x00d17854, 0x02dfa58e, 0x01b0a667, 0x005f56ec, 0x0064510f, 0x006c1160, 0x001bc4b6}}, Y: Field{[10]uint32{0x02eb34d0, 0x0270d201, 0x03c5b857, 0x01042152, 0x01391c92, 0x03588dda, 0x01994f3f, 0x02fe821d, 0x03f44ab3, 0x001713fd}}}, + {X: Field{[10]uint32{0x03920471, 0x02d8c1a6, 0x01e0dedc, 0x0217d08f, 0x01fc318b, 0x00f63e36, 0x024cc298, 0x03e9e7f3, 0x034ea172, 0x001746f6}}, Y: Field{[10]uint32{0x03b83103, 0x00c199bd, 0x02e7b703, 0x02665b15, 0x0279eb1e, 0x02288995, 0x00bb9943, 0x0278b9e5, 0x02677937, 0x000a10e0}}}, + {X: Field{[10]uint32{0x03453629, 0x037700b6, 0x02603076, 0x03703d67, 0x0245cfdc, 0x008eafbd, 0x0262716a, 0x02a97450, 0x006f9a0a, 0x00080ea3}}, Y: Field{[10]uint32{0x03f89f84, 0x0071e14f, 0x01ed4597, 0x009714a1, 0x02686deb, 0x03d04184, 0x00c76d15, 0x0366e4db, 0x0353de5d, 0x000ec3c2}}}, + {X: Field{[10]uint32{0x0147f3d6, 0x011955ec, 0x00b45b94, 0x0085eae3, 0x03553199, 0x01195440, 0x026a3632, 0x02c78467, 0x0332c294, 0x0011d291}}, Y: Field{[10]uint32{0x00628ba4, 0x03a14a0a, 0x01300dce, 0x005c0438, 0x0311fa7f, 0x00e922a8, 0x02cc30cc, 0x03c13bb4, 0x02231206, 0x00251897}}}, + {X: Field{[10]uint32{0x006c7ecb, 0x004c3779, 0x00ce9783, 0x00ff96ed, 0x009d3aed, 0x0219b87b, 0x01ef7334, 0x01060720, 0x02eb3d03, 0x001b8ab2}}, Y: Field{[10]uint32{0x02bc8720, 0x024807bb, 0x0112c844, 0x02e46d9d, 0x02fac706, 0x003ed90e, 0x000c4daf, 0x03b85276, 0x006797ef, 0x00279869}}}, + {X: Field{[10]uint32{0x031dabcd, 0x010ae9b9, 0x00b4f47d, 0x01262797, 0x0354d3fe, 0x002d4dcf, 0x018ae326, 0x03d0f182, 0x00fb6b63, 0x003527b9}}, Y: Field{[10]uint32{0x016603c2, 0x02a433c0, 0x03031e66, 0x024c4bfd, 0x02129c50, 0x0186fcd5, 0x0087ea7a, 0x0124375f, 0x039209a5, 0x00014c78}}}, + {X: Field{[10]uint32{0x00a4147e, 0x00063cfc, 0x03201eb7, 0x022fddd7, 0x002747dd, 0x02924296, 0x021717e8, 0x0055aebd, 0x0092e9e9, 0x003569c1}}, Y: Field{[10]uint32{0x03fb65ff, 0x02cf2e0c, 0x0357f8e4, 0x0211e59f, 0x02f4c4d9, 0x0197814c, 0x00909907, 0x02271bf1, 0x02f5dbab, 0x00276d49}}}, + {X: Field{[10]uint32{0x003841c6, 0x02a3da2d, 0x02fbd63d, 0x03034d0f, 0x0212aa3c, 0x033afd30, 0x03b6b52d, 0x00226526, 0x009e03df, 0x001b3044}}, Y: Field{[10]uint32{0x0154e94d, 0x00ce91ae, 0x02cf5b97, 0x00f8b641, 0x00d79b43, 0x028a7ffb, 0x03d3d6b0, 0x012dd83f, 0x02fe9c09, 0x002bd586}}}, + {X: Field{[10]uint32{0x00edcec6, 0x036d1af6, 0x00f454ed, 0x030b4d8d, 0x02a1061c, 0x000b36b1, 0x023efc63, 0x022ea014, 0x019aabe1, 0x000e3144}}, Y: Field{[10]uint32{0x0133db08, 0x0382fec6, 0x030a6456, 0x0208ad54, 0x0328a16c, 0x01d7ca0b, 0x00cb2da2, 0x01cca99a, 0x012285d9, 0x00399277}}}, + {X: Field{[10]uint32{0x01e5b739, 0x03396d54, 0x022ed73f, 0x00cff488, 0x01e0b938, 0x01bf211b, 0x0399cc6c, 0x021969cb, 0x019f728b, 0x0005d785}}, Y: Field{[10]uint32{0x01fed695, 0x029bffba, 0x0345c6ef, 0x016b7490, 0x02acb595, 0x03fdc7d7, 0x02f97a51, 0x01e7ae93, 0x020d9e3c, 0x0034d41b}}}, + }, + { + {X: Field{[10]uint32{0x01e5b739, 0x03396d54, 0x022ed73f, 0x00cff488, 0x01e0b938, 0x01bf211b, 0x0399cc6c, 0x021969cb, 0x019f728b, 0x0005d785}}, Y: Field{[10]uint32{0x01fed695, 0x029bffba, 0x0345c6ef, 0x016b7490, 0x02acb595, 0x03fdc7d7, 0x02f97a51, 0x01e7ae93, 0x020d9e3c, 0x0034d41b}}}, + {X: Field{[10]uint32{0x02bc47d6, 0x02012791, 0x0121bce7, 0x02d71b68, 0x0130fdfe, 0x004e7188, 0x03fbcc8e, 0x00cb5e97, 0x013f03ff, 0x00108e80}}, Y: Field{[10]uint32{0x03548a34, 0x00db9b62, 0x0009ed12, 0x030d493c, 0x03720d8e, 0x02bdacf1, 0x0179f7bb, 0x0365c284, 0x000fe1e1, 0x002e46b8}}}, + {X: Field{[10]uint32{0x01041216, 0x01fe3c71, 0x0036a65b, 0x03da10ae, 0x023f7335, 0x030bfb54, 0x00b59efd, 0x02b3d04a, 0x017b21f7, 0x00369d4c}}, Y: Field{[10]uint32{0x02708572, 0x034ca61b, 0x00edadae, 0x01eb9deb, 0x02e9aac0, 0x010b5ff1, 0x019e21b3, 0x0357c37c, 0x0046bf72, 0x001cfe28}}}, + {X: Field{[10]uint32{0x0016824a, 0x037dbde1, 0x02741302, 0x00bcecf8, 0x0249df66, 0x0335a1dd, 0x0107a7ab, 0x02e41422, 0x0245ac1f, 0x0004475a}}, Y: Field{[10]uint32{0x0108e9d0, 0x00447508, 0x00a4ca9a, 0x02265b6b, 0x02f07000, 0x03c19654, 0x00d48dbf, 0x02bfeee4, 0x011c478e, 0x0001a5a4}}}, + {X: Field{[10]uint32{0x0065a930, 0x010f9c79, 0x012fdb01, 0x0305ac4d, 0x022587f1, 0x02a0bac7, 0x033c58c4, 0x01275c15, 0x01b48e97, 0x00071c71}}, Y: Field{[10]uint32{0x034638b5, 0x01cfdb30, 0x00d471d8, 0x00fedc5d, 0x0079345e, 0x0092eda3, 0x013f1f28, 0x03e8309c, 0x0334e8f5, 0x0012a470}}}, + {X: Field{[10]uint32{0x0062bac0, 0x014c93cf, 0x02b06950, 0x037d47c2, 0x0219150d, 0x00fa2dc3, 0x024b7d2c, 0x011a704d, 0x00f9023f, 0x00254c3c}}, Y: Field{[10]uint32{0x0218e309, 0x02af6a5d, 0x01c68478, 0x0214bc7f, 0x00e25b32, 0x026cccf8, 0x01d2f7f5, 0x008788d3, 0x005a8f9f, 0x0023cf0c}}}, + {X: Field{[10]uint32{0x02db6ee7, 0x0236b96e, 0x02077e31, 0x010c9d12, 0x007850dd, 0x0026d327, 0x02e837a9, 0x02959a4d, 0x02fc1f31, 0x00361392}}, Y: Field{[10]uint32{0x002ebed2, 0x0155b9b5, 0x0264982d, 0x025d2a8f, 0x01fdd8ac, 0x01597793, 0x0238d58f, 0x01e7384a, 0x009a7c7b, 0x00394960}}}, + {X: Field{[10]uint32{0x03ced775, 0x03b77806, 0x00e56ab5, 0x02297bdd, 0x037290b6, 0x032e773f, 0x0395dbeb, 0x0322e2b5, 0x01c97ac7, 0x0012929b}}, Y: Field{[10]uint32{0x038dd66d, 0x03e3da29, 0x002acb2b, 0x036d091d, 0x031de90c, 0x02703d15, 0x03ef9f73, 0x0079ca50, 0x01b01663, 0x0014a644}}}, + {X: Field{[10]uint32{0x009e6d10, 0x03a7b3e9, 0x019d2394, 0x03cebab2, 0x03f60adf, 0x017fdbb4, 0x0322b928, 0x02053506, 0x004bde66, 0x003cf511}}, Y: Field{[10]uint32{0x0347da3f, 0x00e33014, 0x02c630a0, 0x01433a75, 0x03fc1ada, 0x026292d6, 0x02b95ac1, 0x0058f52e, 0x00dfa6f0, 0x000290c9}}}, + {X: Field{[10]uint32{0x0147b4b3, 0x0246dde9, 0x01411f5e, 0x0347f599, 0x00356929, 0x0026548b, 0x0382efee, 0x013dd477, 0x002f1d8e, 0x003c01b1}}, Y: Field{[10]uint32{0x006aa74b, 0x03d127ea, 0x03ae1b5e, 0x03bb5af9, 0x0275c933, 0x0393df45, 0x007848a4, 0x01482971, 0x00d4a666, 0x003da055}}}, + {X: Field{[10]uint32{0x01d33a07, 0x02cd01ba, 0x03cab48c, 0x0022a8e6, 0x004e72ee, 0x036f7d01, 0x0085520c, 0x007627e4, 0x012c9d9c, 0x002b8c19}}, Y: Field{[10]uint32{0x00a0b2a6, 0x01c303d8, 0x0295c748, 0x03d77f5f, 0x031c9c37, 0x036e3573, 0x00ce7d33, 0x03f95fbf, 0x01c38d63, 0x001b2e76}}}, + {X: Field{[10]uint32{0x003c9c8f, 0x0010e177, 0x027b2067, 0x03b8f90d, 0x00f2816f, 0x02a8ccac, 0x009ff43a, 0x0263f5bc, 0x02dcbe42, 0x0019ef80}}, Y: Field{[10]uint32{0x013652d9, 0x02126616, 0x002be553, 0x03d82e23, 0x03cd993b, 0x020a45a4, 0x00945b60, 0x03be128b, 0x01a73e4d, 0x001ea6d5}}}, + {X: Field{[10]uint32{0x0028caca, 0x01952e43, 0x001da759, 0x02ef320a, 0x021869c7, 0x00ce2326, 0x0217e758, 0x03872057, 0x032a5bd5, 0x00363706}}, Y: Field{[10]uint32{0x03b3ec7a, 0x019dba88, 0x028f6cdb, 0x00b3b204, 0x007d315d, 0x00091f65, 0x02d8da42, 0x031f5631, 0x02d927ce, 0x00233b02}}}, + {X: Field{[10]uint32{0x018b01b5, 0x00be5d14, 0x03adac5c, 0x022e1c42, 0x01ddccc8, 0x0149016c, 0x0250c453, 0x03a21706, 0x0346403d, 0x00039a6c}}, Y: Field{[10]uint32{0x00d965c5, 0x03b8da1e, 0x0283e418, 0x017cf401, 0x03cedf59, 0x01f5f74d, 0x01ed70ab, 0x03914987, 0x02c5fcd7, 0x0002d3be}}}, + {X: Field{[10]uint32{0x03c4416f, 0x007ed98e, 0x00402892, 0x008fcc2c, 0x01a7aefd, 0x000cbcc7, 0x01425a8d, 0x013b3356, 0x0292c5f8, 0x0009d278}}, Y: Field{[10]uint32{0x006bbd8e, 0x022f78bf, 0x021057e9, 0x02d97ba5, 0x02f59e9f, 0x03f2b6cf, 0x03d94990, 0x00af1100, 0x014e3767, 0x0014330b}}}, + {X: Field{[10]uint32{0x03ff4640, 0x02eb63e0, 0x02ffe526, 0x01f95554, 0x0053441c, 0x01898bb8, 0x00eac05b, 0x00327267, 0x00d447b0, 0x000d8f64}}, Y: Field{[10]uint32{0x03ee9de9, 0x000f1fce, 0x01ecb620, 0x02402066, 0x0145b9a8, 0x01fccd8c, 0x03b44539, 0x00888654, 0x03adfc73, 0x0001389c}}}, + }, + { + {X: Field{[10]uint32{0x03ff4640, 0x02eb63e0, 0x02ffe526, 0x01f95554, 0x0053441c, 0x01898bb8, 0x00eac05b, 0x00327267, 0x00d447b0, 0x000d8f64}}, Y: Field{[10]uint32{0x03ee9de9, 0x000f1fce, 0x01ecb620, 0x02402066, 0x0145b9a8, 0x01fccd8c, 0x03b44539, 0x00888654, 0x03adfc73, 0x0001389c}}}, + {X: Field{[10]uint32{0x0392c541, 0x004a972b, 0x0359dd27, 0x0004bb7e, 0x030b62fb, 0x024ec0af, 0x03973c6c, 0x01fa6d54, 0x0066ed9a, 0x001306e6}}, Y: Field{[10]uint32{0x028fe020, 0x013cff71, 0x031ad72c, 0x035f90fa, 0x00c652ea, 0x0395b9a7, 0x03cb753c, 0x02283dfe, 0x02d320be, 0x00307de4}}}, + {X: Field{[10]uint32{0x02e55dc8, 0x024485bd, 0x004394b8, 0x02dbab28, 0x026ff95a, 0x00142510, 0x004a440c, 0x03fecaea, 0x004790c5, 0x00110c50}}, Y: Field{[10]uint32{0x03e323b3, 0x02512bb6, 0x02e5031d, 0x02de7aa8, 0x03a66a29, 0x0190bfb5, 0x019837f5, 0x019be3fa, 0x0142e653, 0x0025ac30}}}, + {X: Field{[10]uint32{0x02aaf3d1, 0x023ca32f, 0x03135e0c, 0x02f068a3, 0x023233ed, 0x01e02d53, 0x01a2f3c0, 0x02c4ad4a, 0x0077ba83, 0x0029020e}}, Y: Field{[10]uint32{0x00b254b9, 0x02d4d37c, 0x02f90b12, 0x015dbb47, 0x022001e7, 0x00d86cf8, 0x03f83d69, 0x02f1e6e2, 0x0212feef, 0x00103a7d}}}, + {X: Field{[10]uint32{0x001b23a8, 0x0252175c, 0x02e0adfe, 0x011c2a1f, 0x01ab7b7d, 0x02484227, 0x02243d5b, 0x02a1f049, 0x028d866c, 0x002788bf}}, Y: Field{[10]uint32{0x0084edae, 0x0104f142, 0x01cecf7a, 0x0127ed44, 0x03c0f7c9, 0x0267054c, 0x03f3f020, 0x00b4405d, 0x00e9ca12, 0x003f4bfc}}}, + {X: Field{[10]uint32{0x03f0e9aa, 0x0178658c, 0x0134b3eb, 0x01dac46f, 0x02681127, 0x01604e34, 0x0124ae0d, 0x009ab6de, 0x03e8575f, 0x00394e03}}, Y: Field{[10]uint32{0x0082720f, 0x02904d90, 0x0318ec4b, 0x0177d1a0, 0x016fb94e, 0x00932380, 0x02913639, 0x02d0756d, 0x00739087, 0x002e5ff6}}}, + {X: Field{[10]uint32{0x031a70e4, 0x01022fc1, 0x03475dd7, 0x007d7d73, 0x01cd5ee5, 0x01c14c1b, 0x01d69e64, 0x00aa34bb, 0x02d503ce, 0x0014237d}}, Y: Field{[10]uint32{0x01950984, 0x0396fdca, 0x02dfedf2, 0x00a3ba2a, 0x014ec032, 0x00cf9271, 0x03304aa7, 0x0310b5dd, 0x039b933b, 0x00055310}}}, + {X: Field{[10]uint32{0x0140d33a, 0x00f6d69e, 0x003b98cd, 0x00291508, 0x036e0d88, 0x03d5b21b, 0x00e3e1a2, 0x0302d4e9, 0x0241d28c, 0x002a0131}}, Y: Field{[10]uint32{0x0146967a, 0x03a57e9b, 0x036a943c, 0x02a273dc, 0x001af18c, 0x005811fa, 0x02c2842c, 0x029b40f7, 0x03252b2f, 0x00256fa0}}}, + {X: Field{[10]uint32{0x021abe11, 0x03f69db3, 0x0220f6ea, 0x0309672c, 0x02dab921, 0x00c0496c, 0x00df5819, 0x025d8cce, 0x03845510, 0x0038f6ff}}, Y: Field{[10]uint32{0x03a8de63, 0x026b5527, 0x01c414b4, 0x0240f1ad, 0x03d3c97d, 0x02e2a3bc, 0x038fa75d, 0x00508590, 0x01099a34, 0x0001bcbe}}}, + {X: Field{[10]uint32{0x023968b6, 0x00a4de2d, 0x03ab2e69, 0x0197b678, 0x02f40261, 0x0224224e, 0x005a9600, 0x01e7ed0f, 0x023dfc65, 0x003de92f}}, Y: Field{[10]uint32{0x00c34882, 0x03768cb4, 0x0105e494, 0x02e34440, 0x0299702f, 0x023294b4, 0x01290303, 0x03185487, 0x036ce823, 0x0035b77b}}}, + {X: Field{[10]uint32{0x03593449, 0x006c8d80, 0x006ffdcf, 0x004b90a9, 0x02f61b7c, 0x001f4052, 0x00d9c13a, 0x0250361e, 0x0064c7de, 0x00066b38}}, Y: Field{[10]uint32{0x01f83631, 0x0052e4eb, 0x0068a3a4, 0x027d0210, 0x02ac710b, 0x02500b11, 0x02bd739d, 0x028cceff, 0x02035268, 0x0038de64}}}, + {X: Field{[10]uint32{0x02bc61d6, 0x034d86fb, 0x002de1ae, 0x029f67fd, 0x018a8fd3, 0x035ac7d4, 0x015f0d15, 0x026bc30e, 0x03e4a3ed, 0x0024e7fc}}, Y: Field{[10]uint32{0x03f5cb70, 0x03a919a8, 0x03f82e75, 0x01bade31, 0x00980bf2, 0x03c05b01, 0x006fc4ee, 0x02a43a75, 0x03cf08b7, 0x0037aace}}}, + {X: Field{[10]uint32{0x00ba6b63, 0x03a624b3, 0x03bb5ee3, 0x01d3f42c, 0x010a0fe6, 0x03aa238c, 0x00c33228, 0x01f6a842, 0x00ec20f8, 0x00361d03}}, Y: Field{[10]uint32{0x0134c5f3, 0x028db01a, 0x0294abee, 0x01730e05, 0x0140104f, 0x000eb0df, 0x00a6ee99, 0x00cafcde, 0x0133c6b9, 0x00191cb0}}}, + {X: Field{[10]uint32{0x028ff2cf, 0x03b5ba22, 0x02094a34, 0x0171ec18, 0x0038ea75, 0x00901469, 0x03a98dba, 0x02b8c1e5, 0x025f1c4c, 0x000066a7}}, Y: Field{[10]uint32{0x030e4352, 0x01f9d9b6, 0x02d353a7, 0x03ba2121, 0x000ce7eb, 0x0004adcc, 0x01062925, 0x02bd7bea, 0x0067ea85, 0x00079987}}}, + {X: Field{[10]uint32{0x033ec038, 0x013fcb06, 0x02b27619, 0x01ab9831, 0x00d9fd51, 0x03ca4294, 0x0083e762, 0x01820d92, 0x03391b50, 0x00162b0c}}, Y: Field{[10]uint32{0x00246279, 0x02a8fc44, 0x03bca16e, 0x00f02d3e, 0x03021904, 0x02647fa5, 0x0379249e, 0x024b65e1, 0x0306d55c, 0x002458f5}}}, + {X: Field{[10]uint32{0x03fdf80c, 0x01e69577, 0x00d1b69f, 0x0206856f, 0x0043e4a7, 0x01d158e2, 0x02244b5b, 0x030afa31, 0x03165df3, 0x0022d2d7}}, Y: Field{[10]uint32{0x03d4fd36, 0x03fc3197, 0x02e56b3e, 0x0151858b, 0x00f9e336, 0x02ac3681, 0x03bd7813, 0x0022d2cf, 0x026f68d3, 0x0012ab42}}}, + }, + { + {X: Field{[10]uint32{0x03fdf80c, 0x01e69577, 0x00d1b69f, 0x0206856f, 0x0043e4a7, 0x01d158e2, 0x02244b5b, 0x030afa31, 0x03165df3, 0x0022d2d7}}, Y: Field{[10]uint32{0x03d4fd36, 0x03fc3197, 0x02e56b3e, 0x0151858b, 0x00f9e336, 0x02ac3681, 0x03bd7813, 0x0022d2cf, 0x026f68d3, 0x0012ab42}}}, + {X: Field{[10]uint32{0x0355e4be, 0x03c99c51, 0x0197abb3, 0x03b905f2, 0x0071af64, 0x020f1844, 0x0217c7ec, 0x0245c633, 0x00e4e132, 0x003b4317}}, Y: Field{[10]uint32{0x007bf42f, 0x027e9ba8, 0x01ab163f, 0x0095d8f7, 0x0049d939, 0x029fa9a0, 0x03dad7f5, 0x0116f6fc, 0x03c7bc23, 0x000886a7}}}, + {X: Field{[10]uint32{0x015812dd, 0x00a960bd, 0x030e2a0a, 0x008d54b4, 0x023d4467, 0x00163de3, 0x02abed6c, 0x00d4bc2d, 0x017a92ff, 0x001c0a6f}}, Y: Field{[10]uint32{0x022d2927, 0x03319ac6, 0x0073c721, 0x01090ecb, 0x0047dae8, 0x00c1a0eb, 0x016544ae, 0x02cf49f7, 0x02dafde8, 0x002c3bbe}}}, + {X: Field{[10]uint32{0x03cec8ab, 0x01b9b201, 0x012ced4b, 0x0159b815, 0x00e53254, 0x00fc7eba, 0x0315c3f8, 0x039a52ce, 0x0013c44c, 0x003ebb2c}}, Y: Field{[10]uint32{0x03155070, 0x0077f66a, 0x02e2e898, 0x021ae178, 0x019c32b2, 0x030bec4f, 0x02e02c6e, 0x032d5ff0, 0x01e90e9e, 0x0033026d}}}, + {X: Field{[10]uint32{0x01486ed1, 0x0395a0ef, 0x01b6a49c, 0x02e92559, 0x005745be, 0x0233dd58, 0x01d4109d, 0x01726402, 0x01caeae6, 0x002733fb}}, Y: Field{[10]uint32{0x01e95d8d, 0x03567b5d, 0x02aa24f6, 0x0165a564, 0x01242167, 0x0002cd04, 0x01224812, 0x00cb3ed8, 0x01713d6a, 0x001f0bd3}}}, + {X: Field{[10]uint32{0x0181fdc2, 0x02affe6c, 0x02364dcd, 0x02ed7318, 0x02dd2f62, 0x0228d39f, 0x02264b81, 0x01b91d2a, 0x002af47e, 0x003d0b04}}, Y: Field{[10]uint32{0x0085d7fd, 0x000024e9, 0x00f2681f, 0x00b668ab, 0x024c1550, 0x021bf88a, 0x03ad05cb, 0x0201b1e3, 0x02b46cfe, 0x0015d40e}}}, + {X: Field{[10]uint32{0x03d0eaca, 0x01ac69d6, 0x00ab7a20, 0x01dae8b5, 0x01d0c745, 0x032937c6, 0x028fde33, 0x01050cd6, 0x03876341, 0x00336692}}, Y: Field{[10]uint32{0x03ff4acc, 0x03ebed6a, 0x0234f6e6, 0x023bb5bd, 0x030127b3, 0x00cfa822, 0x01488ae9, 0x03c8fa05, 0x0079a1e8, 0x003c1156}}}, + {X: Field{[10]uint32{0x02d1b1f7, 0x0193aba6, 0x00d3e07f, 0x02093c8f, 0x01b3b2dd, 0x01f2f2bf, 0x0331a0b3, 0x034bcb21, 0x02132dca, 0x00026ee2}}, Y: Field{[10]uint32{0x03811c80, 0x00c189f0, 0x02d53641, 0x0103d1d4, 0x010f54a8, 0x03e18fa1, 0x039dd284, 0x038ee6db, 0x02b2afee, 0x002516ec}}}, + {X: Field{[10]uint32{0x03bc57c6, 0x0254e8f1, 0x036cbf20, 0x0288fac9, 0x004903d7, 0x00f58c25, 0x00f2d2e9, 0x026faa21, 0x002f88ed, 0x002b4262}}, Y: Field{[10]uint32{0x024a0ab8, 0x00b03b6b, 0x022d3ca3, 0x00dcd643, 0x037b311d, 0x0276af97, 0x00186c72, 0x0294ae8a, 0x008c42fb, 0x001c90f0}}}, + {X: Field{[10]uint32{0x03927dc7, 0x036ad913, 0x018a49e2, 0x00358f50, 0x0337a7a4, 0x019a8508, 0x029ed953, 0x029aef99, 0x00cc082b, 0x00389828}}, Y: Field{[10]uint32{0x02aef35d, 0x03cdbd11, 0x0382da45, 0x02d118b2, 0x00edbcc0, 0x0096fd10, 0x033cb3d7, 0x02759fc1, 0x0344b0da, 0x000dfb99}}}, + {X: Field{[10]uint32{0x03a56302, 0x00c31caa, 0x01862ea8, 0x00debc3c, 0x00f506a9, 0x027eb4b8, 0x02da2d2a, 0x02907c7a, 0x010aeb3c, 0x0036744a}}, Y: Field{[10]uint32{0x00291c29, 0x0376bea2, 0x00f2aeaa, 0x03367e9d, 0x001739ae, 0x0098e1b9, 0x01715c67, 0x00fbb40a, 0x0113ec2d, 0x001fad4c}}}, + {X: Field{[10]uint32{0x02dd7dd6, 0x01b51f7b, 0x0168c386, 0x03899786, 0x0049376f, 0x039f3f7b, 0x01a7840e, 0x01492f29, 0x036a24c7, 0x000cb3f3}}, Y: Field{[10]uint32{0x0208e330, 0x03512bbf, 0x0208b25f, 0x03480d26, 0x027a0d8c, 0x0027d587, 0x008096a4, 0x01dd2188, 0x0234976a, 0x0008611a}}}, + {X: Field{[10]uint32{0x00d1243a, 0x034dc13d, 0x025fdbac, 0x0008fd52, 0x0002b126, 0x018fd561, 0x00d21ac0, 0x01b3be47, 0x01de539d, 0x002f141e}}, Y: Field{[10]uint32{0x015db68a, 0x02545a21, 0x03169f5c, 0x03d6c7d1, 0x035f7ee4, 0x037ff235, 0x02c72b94, 0x0172ee3b, 0x023b3a70, 0x0019418a}}}, + {X: Field{[10]uint32{0x02abf83d, 0x0340ff7d, 0x00596696, 0x0163ecb4, 0x02b8f940, 0x00348b00, 0x00be68f1, 0x03127cfb, 0x02dde85a, 0x0008d72a}}, Y: Field{[10]uint32{0x0133e191, 0x03b27a43, 0x010ae7f4, 0x0358c8d8, 0x013f0518, 0x0324eb62, 0x00232a5b, 0x011fafb9, 0x01c745fd, 0x003704be}}}, + {X: Field{[10]uint32{0x034a3f9f, 0x009139ad, 0x0016908d, 0x01977026, 0x02c287a6, 0x036c9896, 0x03deaae7, 0x031fa244, 0x037e505f, 0x00134c69}}, Y: Field{[10]uint32{0x001e0ba7, 0x02c0904c, 0x00a754fc, 0x0146db80, 0x03cbf6fb, 0x01e009d4, 0x0318f38c, 0x015d6c1a, 0x02c96098, 0x00088907}}}, + {X: Field{[10]uint32{0x0232fcda, 0x00456494, 0x0277bcb6, 0x03fe9b03, 0x03b700db, 0x02f55231, 0x03771c00, 0x0265b5af, 0x02a6e5db, 0x001c8f2e}}, Y: Field{[10]uint32{0x02b39f5f, 0x0301a767, 0x0094801d, 0x0194dde5, 0x022660a0, 0x0220935b, 0x02113748, 0x031262a4, 0x03b5595c, 0x0025ba19}}}, + }, + { + {X: Field{[10]uint32{0x0232fcda, 0x00456494, 0x0277bcb6, 0x03fe9b03, 0x03b700db, 0x02f55231, 0x03771c00, 0x0265b5af, 0x02a6e5db, 0x001c8f2e}}, Y: Field{[10]uint32{0x02b39f5f, 0x0301a767, 0x0094801d, 0x0194dde5, 0x022660a0, 0x0220935b, 0x02113748, 0x031262a4, 0x03b5595c, 0x0025ba19}}}, + {X: Field{[10]uint32{0x00a030d5, 0x00e0f583, 0x009071fd, 0x010c1e61, 0x022d240a, 0x01dce8f1, 0x03d7dc45, 0x01d134d0, 0x0386437b, 0x0015fbe9}}, Y: Field{[10]uint32{0x00b02f9e, 0x02ad109d, 0x0174ab07, 0x00ab97a6, 0x00689b6d, 0x023780fb, 0x03627c92, 0x02146224, 0x030bd1b4, 0x0035c4b6}}}, + {X: Field{[10]uint32{0x00633cb1, 0x01f827a0, 0x02113256, 0x012da740, 0x03575a22, 0x008607f2, 0x00627321, 0x032b5003, 0x00f317aa, 0x001b77a7}}, Y: Field{[10]uint32{0x03ce6b34, 0x03526a99, 0x01ef357d, 0x036b3e16, 0x0080b27f, 0x006e99aa, 0x019ef86a, 0x03907572, 0x03e7a707, 0x0024623e}}}, + {X: Field{[10]uint32{0x00584dd5, 0x03f1ddc3, 0x0012a7fa, 0x01f8c9ec, 0x01108057, 0x01489b2e, 0x01f7e9cd, 0x02f10a8b, 0x01436a28, 0x000992ef}}, Y: Field{[10]uint32{0x0304ab11, 0x0089e4dd, 0x00d8de61, 0x010dc5ee, 0x026a1182, 0x030cef88, 0x0375ce24, 0x024ed353, 0x03a94ee0, 0x00361f1b}}}, + {X: Field{[10]uint32{0x0133f3c5, 0x0294634a, 0x02522419, 0x01c457c4, 0x00085a0f, 0x0391ee14, 0x004bb7f8, 0x0337a04f, 0x032cd5b5, 0x00121be9}}, Y: Field{[10]uint32{0x02fb0f53, 0x0129c6b2, 0x023b79ad, 0x020f3c3c, 0x0362d9b7, 0x03323c67, 0x00c48bae, 0x03750f92, 0x0319f56b, 0x0018b848}}}, + {X: Field{[10]uint32{0x00e5467d, 0x02f5da91, 0x03ace4d0, 0x02e066ef, 0x0140908a, 0x03b25c3a, 0x021f62e0, 0x028488b0, 0x00f0fc69, 0x0025f419}}, Y: Field{[10]uint32{0x029cb3fa, 0x00c03f47, 0x03ccd797, 0x02e153c5, 0x03da5fb3, 0x02142187, 0x037c66fa, 0x000b300f, 0x032ed334, 0x002265d3}}}, + {X: Field{[10]uint32{0x0299f728, 0x01650897, 0x02204ebd, 0x03ef9bc4, 0x03677375, 0x01da94c0, 0x024ff27b, 0x02bd3ed9, 0x0174a894, 0x00091e5a}}, Y: Field{[10]uint32{0x03aaebff, 0x000145ba, 0x022d837a, 0x030255d6, 0x025adbf3, 0x03635992, 0x012e87e7, 0x00c007b1, 0x0144688f, 0x0038f5e3}}}, + {X: Field{[10]uint32{0x032438e8, 0x009af612, 0x02c9d2bf, 0x007f56f7, 0x01a78bc6, 0x008da9e7, 0x0085c056, 0x034aef6b, 0x0124bd40, 0x002a5319}}, Y: Field{[10]uint32{0x018661f4, 0x00b236fc, 0x01b2bc2e, 0x0182838e, 0x027e5d3c, 0x0140678e, 0x03921950, 0x018a03f5, 0x03d992f9, 0x002d4807}}}, + {X: Field{[10]uint32{0x03b0079a, 0x0031b50b, 0x02049c9e, 0x03dc8e49, 0x00916f9e, 0x01ace0c9, 0x01a59ee7, 0x017fc18c, 0x03daa3d5, 0x000bce72}}, Y: Field{[10]uint32{0x005690ba, 0x00a5cc0b, 0x00230fe2, 0x02f220a8, 0x039bfb3f, 0x01e36962, 0x02936d02, 0x00e60d36, 0x03de1386, 0x002afab6}}}, + {X: Field{[10]uint32{0x018086c8, 0x01bca26e, 0x023ff5f4, 0x00d2d899, 0x0040c10e, 0x02aa39bf, 0x01263b70, 0x00af74a2, 0x025baa80, 0x000fa10b}}, Y: Field{[10]uint32{0x02e939a9, 0x012d44e3, 0x03d4ef99, 0x01dadd79, 0x0037b8e5, 0x006c1df0, 0x01370463, 0x039cb86e, 0x03f5fc92, 0x00227c93}}}, + {X: Field{[10]uint32{0x00f7ab73, 0x00c02cb9, 0x003a7793, 0x03aa7511, 0x0262e3d4, 0x014d2bb4, 0x0239e86c, 0x0186e95a, 0x016c327d, 0x003968c7}}, Y: Field{[10]uint32{0x00561f42, 0x00e8ff1c, 0x03a21391, 0x0126a032, 0x01bf8c44, 0x0293b397, 0x0118a977, 0x0275e830, 0x003d8d1e, 0x000dde23}}}, + {X: Field{[10]uint32{0x03613bec, 0x02072e44, 0x03e67cca, 0x02744073, 0x028bb5fc, 0x01d3e5ca, 0x031b33dc, 0x00def7b7, 0x02b8c939, 0x000b73f2}}, Y: Field{[10]uint32{0x02039215, 0x00c24926, 0x01f383e7, 0x02eb4cfd, 0x003732cf, 0x01bdb1bd, 0x03088b7d, 0x02904997, 0x00dd9474, 0x0011b6f1}}}, + {X: Field{[10]uint32{0x014dcd86, 0x024a68f0, 0x031b588f, 0x00825afd, 0x011fc5d4, 0x0014773c, 0x010dd982, 0x00d11f7d, 0x014a0d15, 0x00330e27}}, Y: Field{[10]uint32{0x00f0a873, 0x02db7672, 0x0387468e, 0x0063f9f9, 0x0205c57e, 0x03aa4432, 0x0168bdbb, 0x02efb66d, 0x03d660f6, 0x0024eb93}}}, + {X: Field{[10]uint32{0x03b4f6be, 0x00f5d937, 0x02b64844, 0x03fd3e8f, 0x02b567d5, 0x023c3a2d, 0x004bb042, 0x0208a23b, 0x03d1ae75, 0x0028ab94}}, Y: Field{[10]uint32{0x02eeb9a2, 0x008959d2, 0x00436c04, 0x019f0f50, 0x004c0efa, 0x0306d51f, 0x015679c7, 0x028261f2, 0x014d44b3, 0x001a4cd6}}}, + {X: Field{[10]uint32{0x00819311, 0x0271bade, 0x0314724f, 0x0388421d, 0x030b3e1e, 0x033d7b47, 0x010a17e0, 0x03a408dd, 0x01c89d71, 0x001fe4a4}}, Y: Field{[10]uint32{0x002eb125, 0x03e6d5eb, 0x02174aa9, 0x0102721a, 0x02120aaa, 0x0149056d, 0x010de8c4, 0x00fbc3d7, 0x011063ec, 0x00276803}}}, + {X: Field{[10]uint32{0x027dd7fa, 0x00cfb283, 0x019839a5, 0x0048dea4, 0x01094796, 0x00b0b4ed, 0x01feec81, 0x02fe62e9, 0x00d493be, 0x003bafe9}}, Y: Field{[10]uint32{0x01de8999, 0x0353f6b8, 0x03712ddf, 0x030e9c47, 0x019ae4cd, 0x005e0227, 0x02e7edaf, 0x03c3c9a7, 0x00a3970e, 0x001766a3}}}, + }, + { + {X: Field{[10]uint32{0x027dd7fa, 0x00cfb283, 0x019839a5, 0x0048dea4, 0x01094796, 0x00b0b4ed, 0x01feec81, 0x02fe62e9, 0x00d493be, 0x003bafe9}}, Y: Field{[10]uint32{0x01de8999, 0x0353f6b8, 0x03712ddf, 0x030e9c47, 0x019ae4cd, 0x005e0227, 0x02e7edaf, 0x03c3c9a7, 0x00a3970e, 0x001766a3}}}, + {X: Field{[10]uint32{0x03d297fd, 0x03ba4211, 0x026d676b, 0x03023d9d, 0x03c4ea4b, 0x00461257, 0x01c6031c, 0x01eff698, 0x02d7a7a9, 0x000e0712}}, Y: Field{[10]uint32{0x01493fc5, 0x0338c61f, 0x01c0093a, 0x00cb6e4e, 0x00f04510, 0x026457b3, 0x03e5fa70, 0x03bb923c, 0x013b238e, 0x0024dabd}}}, + {X: Field{[10]uint32{0x037ceceb, 0x019e3fee, 0x03af0f3f, 0x024e225f, 0x0073a59f, 0x03db9a05, 0x03fb8126, 0x035140db, 0x02204276, 0x0010dea1}}, Y: Field{[10]uint32{0x02c181e1, 0x00ef30d5, 0x01782736, 0x033f723e, 0x0387220f, 0x0274a5ff, 0x038feb69, 0x030cbda6, 0x03a13eea, 0x0002e45a}}}, + {X: Field{[10]uint32{0x02de454c, 0x035c108b, 0x008b2448, 0x017fbf74, 0x039cf1d0, 0x0254e311, 0x0210831d, 0x0318ef33, 0x01cd05ad, 0x00387bee}}, Y: Field{[10]uint32{0x00913797, 0x03f48cea, 0x014c6ad9, 0x01129e8b, 0x03464e32, 0x0391dc48, 0x0154c1ff, 0x026f9ec0, 0x0130d8af, 0x0003b2d1}}}, + {X: Field{[10]uint32{0x017f96f2, 0x035ca782, 0x0335cd58, 0x00a74b21, 0x03358235, 0x028f309c, 0x00b7e3b9, 0x0226f20f, 0x0313e2a4, 0x002a7be7}}, Y: Field{[10]uint32{0x02c04be4, 0x03556c15, 0x00702c03, 0x02bd6a6d, 0x01b74f89, 0x03aed84f, 0x016ee160, 0x0275f365, 0x00e59455, 0x003a0533}}}, + {X: Field{[10]uint32{0x00bf00eb, 0x036761f7, 0x002274c9, 0x022f0634, 0x0241b4e9, 0x0068c2f0, 0x03e16f6a, 0x03537126, 0x00ae96ea, 0x002e241c}}, Y: Field{[10]uint32{0x030e664e, 0x03c6f346, 0x02a671b7, 0x001adae5, 0x02cb0d8b, 0x007129d9, 0x02294e4c, 0x03623d1c, 0x00c2c8a2, 0x001bc932}}}, + {X: Field{[10]uint32{0x010cf77e, 0x02ad684d, 0x02b0dbc0, 0x01d152a2, 0x0207dbf5, 0x03ea8190, 0x03827d69, 0x00d6f954, 0x0141ee1d, 0x0019b601}}, Y: Field{[10]uint32{0x00eaa3a6, 0x03e5ebe8, 0x0376d2a5, 0x00eadec6, 0x029444b4, 0x00d584fd, 0x031d4205, 0x03ed0b0f, 0x03e732ff, 0x001473f7}}}, + {X: Field{[10]uint32{0x01eb99a4, 0x03fbacca, 0x03b18d33, 0x027ccf51, 0x00c7e541, 0x02bd1d6a, 0x02c235e9, 0x01c04316, 0x01b1a269, 0x0014c63e}}, Y: Field{[10]uint32{0x0291f92d, 0x009bbbbf, 0x02c652c7, 0x0103478f, 0x00a41f2b, 0x02ed017a, 0x032d93ae, 0x0290655d, 0x03eb4bed, 0x003d1333}}}, + {X: Field{[10]uint32{0x03213a5a, 0x01218a21, 0x0262b935, 0x0129e17e, 0x000b7320, 0x019330f2, 0x03508a1c, 0x00fe8afc, 0x01e13650, 0x0018ab01}}, Y: Field{[10]uint32{0x006a9e45, 0x0348703d, 0x014efc10, 0x000605e6, 0x01e55909, 0x01ea495e, 0x015e79e0, 0x029b934e, 0x01f3a0d1, 0x0008dbef}}}, + {X: Field{[10]uint32{0x03c76ac1, 0x0086cf3b, 0x02c05d6b, 0x02572908, 0x016124c3, 0x0354fa26, 0x021859a7, 0x00de10df, 0x03bfab10, 0x000623bc}}, Y: Field{[10]uint32{0x028f00bc, 0x0180ca94, 0x03875351, 0x03a0f1d8, 0x00e4d66d, 0x03ce638e, 0x005fb18c, 0x02ea6740, 0x017a052f, 0x0039bf26}}}, + {X: Field{[10]uint32{0x03bad12b, 0x03f52619, 0x02e1ec30, 0x0003abd9, 0x0385d5ea, 0x031bcb6c, 0x03613af5, 0x023d6d6f, 0x00497244, 0x003284f1}}, Y: Field{[10]uint32{0x0323b0f2, 0x0267d1a5, 0x03566896, 0x01c44695, 0x026370ab, 0x02ab68f5, 0x015fa64e, 0x021f22b0, 0x018361c2, 0x0020ea82}}}, + {X: Field{[10]uint32{0x02fbe7b2, 0x01bfe6ad, 0x025a3b9d, 0x03051635, 0x005eaded, 0x00aa2118, 0x036bbb1b, 0x0107e3cc, 0x03669cb4, 0x00099221}}, Y: Field{[10]uint32{0x01bc2a34, 0x029e2f08, 0x03603932, 0x0205a83a, 0x005638d9, 0x000b77c6, 0x02f2dcad, 0x0112623c, 0x02b4b201, 0x00278576}}}, + {X: Field{[10]uint32{0x0080414e, 0x03b97e57, 0x00f7fdda, 0x0218b59b, 0x0114ef8a, 0x01182792, 0x0011c4f4, 0x00aba16b, 0x0101a705, 0x00073b2c}}, Y: Field{[10]uint32{0x02169a3b, 0x03a524b4, 0x031d0dca, 0x039511c8, 0x02907557, 0x017b6b45, 0x01aa3283, 0x01f3ed39, 0x00669609, 0x003cd0d8}}}, + {X: Field{[10]uint32{0x0320907d, 0x00793462, 0x0051c50d, 0x0358581e, 0x003b15b2, 0x012143fd, 0x002f4589, 0x03089ec0, 0x01bc3e54, 0x003e62d7}}, Y: Field{[10]uint32{0x00c926af, 0x004c66d7, 0x00e35835, 0x038096a4, 0x0241fcd9, 0x02ea7327, 0x0139b706, 0x004fe90a, 0x00bd4f4a, 0x0038b542}}}, + {X: Field{[10]uint32{0x02d810a9, 0x016f2313, 0x00155c4f, 0x00fcf1c0, 0x024f889d, 0x0077c8e4, 0x010daf5f, 0x023e7325, 0x007504d7, 0x000a9a64}}, Y: Field{[10]uint32{0x029b4728, 0x01ace23e, 0x005c7cf8, 0x03a5fb05, 0x00667d47, 0x013ec13f, 0x02c58695, 0x03ff6b0f, 0x039b6c3d, 0x00153e40}}}, + {X: Field{[10]uint32{0x01a48db0, 0x01e0d6ce, 0x003bfefd, 0x028a6cf0, 0x019f1215, 0x02def791, 0x011d0a09, 0x01c59c9e, 0x00da696e, 0x000403d1}}, Y: Field{[10]uint32{0x03c65a09, 0x0357358a, 0x015ac0fb, 0x0063fd46, 0x02b7ff4a, 0x03024199, 0x008f3300, 0x002ddcbb, 0x013192a0, 0x00337678}}}, + }, + { + {X: Field{[10]uint32{0x01a48db0, 0x01e0d6ce, 0x003bfefd, 0x028a6cf0, 0x019f1215, 0x02def791, 0x011d0a09, 0x01c59c9e, 0x00da696e, 0x000403d1}}, Y: Field{[10]uint32{0x03c65a09, 0x0357358a, 0x015ac0fb, 0x0063fd46, 0x02b7ff4a, 0x03024199, 0x008f3300, 0x002ddcbb, 0x013192a0, 0x00337678}}}, + {X: Field{[10]uint32{0x024df706, 0x014a13c7, 0x008084b0, 0x03e48df4, 0x01d8d9c8, 0x02d31066, 0x0015dff2, 0x031dc6a1, 0x01f2ceb5, 0x00230262}}, Y: Field{[10]uint32{0x0172fa98, 0x02b168d7, 0x011aa736, 0x03d45594, 0x0060de6b, 0x0277259b, 0x012172cb, 0x0080d3ff, 0x01044f43, 0x003ed36f}}}, + {X: Field{[10]uint32{0x01bc15b4, 0x02684d25, 0x02ee69cb, 0x02391968, 0x01927502, 0x03b5f2a3, 0x0058ee9c, 0x02b727b6, 0x022e51ee, 0x00043a43}}, Y: Field{[10]uint32{0x00aa258d, 0x02f98256, 0x02a8834e, 0x018c0aed, 0x014ca589, 0x01ab47dd, 0x017a8c61, 0x03810935, 0x030380d5, 0x0031a28d}}}, + {X: Field{[10]uint32{0x0047bffd, 0x018f0cf7, 0x03c1bb1e, 0x00e6f256, 0x019c5285, 0x0098b009, 0x02481743, 0x019c1312, 0x013c5e26, 0x003ee3c5}}, Y: Field{[10]uint32{0x0149b095, 0x02917776, 0x02613090, 0x0226b150, 0x031dde13, 0x012f3354, 0x03a11d9b, 0x0188605b, 0x029dc5e0, 0x001b289e}}}, + {X: Field{[10]uint32{0x03e75269, 0x00ff0c0f, 0x033182dd, 0x033014f4, 0x01a377a3, 0x0052df73, 0x035b90b7, 0x0058e115, 0x0342da54, 0x003dd08b}}, Y: Field{[10]uint32{0x03e49bd5, 0x0203a1c5, 0x018e0189, 0x00dfd28e, 0x037fb3a2, 0x027d8d65, 0x00ce7dcb, 0x0024ff46, 0x031a3313, 0x00101b0b}}}, + {X: Field{[10]uint32{0x021c0a80, 0x00aaf21e, 0x01c740f6, 0x0163196a, 0x034d6251, 0x000bfe70, 0x03c9be70, 0x033296c5, 0x0268a614, 0x002dac56}}, Y: Field{[10]uint32{0x01ce0a03, 0x03404410, 0x016eeb6c, 0x02cc20b8, 0x009c9a12, 0x03d94db5, 0x00e223ee, 0x02d87a95, 0x0214d6cd, 0x003eb98b}}}, + {X: Field{[10]uint32{0x01a7175f, 0x02d9a5bd, 0x0342a653, 0x01c74c73, 0x03edb8e7, 0x00b577ae, 0x0079a558, 0x00f3fdca, 0x010417d4, 0x000b632b}}, Y: Field{[10]uint32{0x039d592a, 0x01eee46e, 0x025e0cf3, 0x03f672d7, 0x037a846b, 0x004b274d, 0x03232fa6, 0x02a529ee, 0x0383318c, 0x0031cfce}}}, + {X: Field{[10]uint32{0x03b2629a, 0x0286e2d2, 0x027b8b8f, 0x0161dcde, 0x0065a02c, 0x01ca1c21, 0x00cc9f0a, 0x0145d568, 0x033fd75d, 0x0039d1cc}}, Y: Field{[10]uint32{0x0146f6d6, 0x0365869a, 0x0169a9f8, 0x02a9b86a, 0x01c88376, 0x00130960, 0x00436038, 0x00304533, 0x02014507, 0x003cabff}}}, + {X: Field{[10]uint32{0x00b51045, 0x0326f0e5, 0x025b3e34, 0x025bcc70, 0x03bbc6c8, 0x007a33dc, 0x0273d4eb, 0x01ba962b, 0x011db98a, 0x0007b2ff}}, Y: Field{[10]uint32{0x02c70026, 0x019c4040, 0x0022d53a, 0x011ad0d9, 0x00b19006, 0x0126a6ce, 0x03d0bb18, 0x030e9911, 0x02308b99, 0x00073db8}}}, + {X: Field{[10]uint32{0x0013e439, 0x016d5b19, 0x02f674a3, 0x03bf7757, 0x02f92f69, 0x01fb6d92, 0x00b1bfeb, 0x038a5abe, 0x03b8b477, 0x00265d06}}, Y: Field{[10]uint32{0x0032cd5b, 0x015f609a, 0x026e43e6, 0x0325a5d1, 0x02b17c15, 0x01638f9e, 0x035aa562, 0x0326979c, 0x01b07bd9, 0x003791fa}}}, + {X: Field{[10]uint32{0x01358533, 0x0335d9ba, 0x00b9df7a, 0x03e753ed, 0x0010a933, 0x0074caa3, 0x02955a29, 0x01d4a20f, 0x00c5fe57, 0x00268225}}, Y: Field{[10]uint32{0x0360ba08, 0x03871770, 0x01dadfb3, 0x02f6ee03, 0x0165a6e5, 0x0153f0c8, 0x0117d5f9, 0x023f0c7e, 0x03c4201b, 0x0029e620}}}, + {X: Field{[10]uint32{0x02b062d4, 0x02a942a4, 0x02141a7c, 0x03966eda, 0x027a5ce7, 0x00fa889e, 0x03b17128, 0x03ab281b, 0x02a43256, 0x000d658f}}, Y: Field{[10]uint32{0x03b25302, 0x02a9346e, 0x019b1a10, 0x02e59379, 0x02d04082, 0x027022a5, 0x00ce196f, 0x039726ff, 0x01454951, 0x003d96f8}}}, + {X: Field{[10]uint32{0x018ef7f6, 0x01017586, 0x00f9f694, 0x03dde81e, 0x025923f3, 0x00ee2ba9, 0x019c8527, 0x034b8d6f, 0x0049db4f, 0x00199376}}, Y: Field{[10]uint32{0x011eac94, 0x025bfcd7, 0x02ecee74, 0x02cc6e39, 0x03fc3d3a, 0x03411633, 0x0048ce5d, 0x01e4ca85, 0x001717f2, 0x002b5448}}}, + {X: Field{[10]uint32{0x019334f0, 0x02d9bcc4, 0x011b60d0, 0x03ece82b, 0x0174728e, 0x0170a790, 0x020e8248, 0x030c871a, 0x037b02cf, 0x0033aede}}, Y: Field{[10]uint32{0x01e45191, 0x0142f494, 0x036cb167, 0x0276e780, 0x004765a2, 0x0374b8dc, 0x01ec0f74, 0x0128cae8, 0x0243633b, 0x003f8f7c}}}, + {X: Field{[10]uint32{0x03c934b3, 0x0029adf0, 0x022c4e0c, 0x02016c2b, 0x022b31f5, 0x020469c0, 0x031d9669, 0x02e18e08, 0x029377d0, 0x0020844e}}, Y: Field{[10]uint32{0x002c6a0f, 0x01798ab1, 0x0280377e, 0x009a6911, 0x00aa1f7c, 0x0168318a, 0x0066cf2b, 0x00d99821, 0x00dac9ae, 0x0023686e}}}, + {X: Field{[10]uint32{0x0134fd2d, 0x02b379b9, 0x033852c8, 0x011193ce, 0x03a77f8d, 0x02813005, 0x009227a4, 0x03b46c77, 0x03e262c7, 0x003840c6}}, Y: Field{[10]uint32{0x0056a00d, 0x03c63ca5, 0x02d79a44, 0x01067873, 0x02f292dd, 0x0165d4d6, 0x036a4176, 0x010179ae, 0x01928940, 0x00275c18}}}, + }, + { + {X: Field{[10]uint32{0x0134fd2d, 0x02b379b9, 0x033852c8, 0x011193ce, 0x03a77f8d, 0x02813005, 0x009227a4, 0x03b46c77, 0x03e262c7, 0x003840c6}}, Y: Field{[10]uint32{0x0056a00d, 0x03c63ca5, 0x02d79a44, 0x01067873, 0x02f292dd, 0x0165d4d6, 0x036a4176, 0x010179ae, 0x01928940, 0x00275c18}}}, + {X: Field{[10]uint32{0x015c8356, 0x009f8daa, 0x0185784e, 0x03177a53, 0x01028a6a, 0x03ca6cb2, 0x0395dcd0, 0x0227aae7, 0x03224c80, 0x003d2e4f}}, Y: Field{[10]uint32{0x02001fd3, 0x02186e6f, 0x0209abd5, 0x00d12455, 0x00c37ef1, 0x0103bba4, 0x025f6a7a, 0x018b7ec3, 0x02ec0629, 0x00299ea4}}}, + {X: Field{[10]uint32{0x03028d83, 0x0188ebbb, 0x03961579, 0x01b6e9d0, 0x03619592, 0x01779a76, 0x01abe5a1, 0x0217b1a9, 0x03c4e3c7, 0x0029fafd}}, Y: Field{[10]uint32{0x01d0bed1, 0x000e4ae6, 0x03919964, 0x009d2c14, 0x0347a389, 0x00112012, 0x019c7377, 0x018b573f, 0x012fbfe3, 0x00188145}}}, + {X: Field{[10]uint32{0x03160e8a, 0x018bf85e, 0x0296c20d, 0x004be5f9, 0x00d51e85, 0x0096c22c, 0x01622ea0, 0x0148dac6, 0x00a1fce5, 0x0002746b}}, Y: Field{[10]uint32{0x00a04c44, 0x0014315f, 0x035e534e, 0x03ba484a, 0x026fe9e0, 0x0036309f, 0x016692ce, 0x03c318f9, 0x008f5101, 0x000454c6}}}, + {X: Field{[10]uint32{0x03dd5cfa, 0x00390089, 0x014b5bae, 0x004dfc27, 0x036a89c5, 0x0098d18c, 0x01c6a534, 0x013d3073, 0x008dcb02, 0x0016d728}}, Y: Field{[10]uint32{0x0248e98c, 0x0129be67, 0x029d3e66, 0x0332bcc9, 0x00bfd067, 0x0221a425, 0x011f0cea, 0x016097a6, 0x02f70aa1, 0x000fb32d}}}, + {X: Field{[10]uint32{0x03b61ee5, 0x021104de, 0x00c13f28, 0x038bec7c, 0x02da4f04, 0x025d2b9b, 0x02638cd8, 0x0086e198, 0x0230cc87, 0x003524cc}}, Y: Field{[10]uint32{0x01d694a8, 0x03693439, 0x00ddc662, 0x0231690e, 0x021ad12c, 0x03b2bed7, 0x00c5e9d1, 0x02748fb7, 0x01abf51a, 0x00008702}}}, + {X: Field{[10]uint32{0x03531f82, 0x014a38c8, 0x02c9f2b9, 0x01aec430, 0x01ff5132, 0x02708b0a, 0x02f3e748, 0x012ed733, 0x02acc111, 0x00011bc9}}, Y: Field{[10]uint32{0x03ceda07, 0x017f22c2, 0x01c7fa50, 0x01736ad5, 0x01d02594, 0x03f0c95e, 0x02370ac2, 0x020bab38, 0x0331635b, 0x001ae012}}}, + {X: Field{[10]uint32{0x01ba7fc2, 0x035f411d, 0x01562e97, 0x024eff0e, 0x03518b3a, 0x02087379, 0x022ad793, 0x00ae7862, 0x01cc454c, 0x00319b16}}, Y: Field{[10]uint32{0x035f5956, 0x00f1a73d, 0x015977ec, 0x0376c565, 0x02f00a60, 0x02b0432c, 0x024f3cea, 0x003f3efa, 0x03e2bfb3, 0x0036564b}}}, + {X: Field{[10]uint32{0x00432711, 0x00550dc4, 0x02b9060b, 0x00bf7645, 0x02cf140b, 0x02265916, 0x0396f0f0, 0x03bed4d7, 0x02d931e0, 0x00304649}}, Y: Field{[10]uint32{0x03e2610c, 0x009878bb, 0x00055e49, 0x00b283cd, 0x0383ab92, 0x01b331b3, 0x0094bf18, 0x02da2461, 0x00cc7d25, 0x0022f87e}}}, + {X: Field{[10]uint32{0x02be316c, 0x01b1b348, 0x03ad0f83, 0x00fc9e39, 0x016bf404, 0x0097bd7c, 0x017cef5b, 0x00deccac, 0x01aa4a0b, 0x00156735}}, Y: Field{[10]uint32{0x03e04013, 0x02ae7267, 0x000e71a6, 0x0074d81e, 0x038a389a, 0x01d31a4b, 0x01ba9298, 0x0101dbcb, 0x009c08d4, 0x002ab551}}}, + {X: Field{[10]uint32{0x01257963, 0x0261d3e8, 0x02861c17, 0x014b0d2a, 0x005b018d, 0x00e25e71, 0x01bb54b5, 0x023cb9b3, 0x02e9eb68, 0x001a4211}}, Y: Field{[10]uint32{0x026f9835, 0x01d96651, 0x02b253a5, 0x02a08724, 0x036cbc3c, 0x024beedf, 0x0017024f, 0x03af16d0, 0x03cb7f3f, 0x00389217}}}, + {X: Field{[10]uint32{0x0004554a, 0x03772f3b, 0x00ffe530, 0x02ed1a23, 0x00aadcff, 0x028428bb, 0x00652c27, 0x0346811d, 0x03c89873, 0x00225bcd}}, Y: Field{[10]uint32{0x029138df, 0x03e7f864, 0x017dcd68, 0x0186b310, 0x01e6085b, 0x03a046fc, 0x0222bb04, 0x0312b369, 0x03e7224a, 0x000e0108}}}, + {X: Field{[10]uint32{0x02e23ace, 0x004e52f7, 0x012fd2d1, 0x0196d537, 0x01dec87c, 0x0128ca45, 0x027552df, 0x0082eaee, 0x03fb8c92, 0x003ecf7d}}, Y: Field{[10]uint32{0x0322e8de, 0x037bd325, 0x03f5ee09, 0x010bfb49, 0x029e7271, 0x036ead62, 0x02251540, 0x00f1594a, 0x01bc11c7, 0x0014438a}}}, + {X: Field{[10]uint32{0x00d36f89, 0x003c4c17, 0x00b925f9, 0x031b9c03, 0x031e4754, 0x00a403b8, 0x01d68b87, 0x0148e594, 0x03176915, 0x00120adb}}, Y: Field{[10]uint32{0x00a4f423, 0x0328dc9c, 0x01a68467, 0x00d10b52, 0x0219ee07, 0x035ffa4b, 0x018c23e6, 0x03316b2c, 0x011df9a5, 0x003a30f0}}}, + {X: Field{[10]uint32{0x00272351, 0x01f3fbd4, 0x03109860, 0x00f7e67f, 0x0170734b, 0x02ac7350, 0x038a3eb3, 0x01462cfa, 0x02c24f5c, 0x001b7617}}, Y: Field{[10]uint32{0x03c7664b, 0x01fe8adf, 0x0017c9b0, 0x03df0f82, 0x03877c6f, 0x03d7106d, 0x01407f9a, 0x0109f827, 0x03f4121f, 0x0005ba99}}}, + {X: Field{[10]uint32{0x0094696d, 0x039a2364, 0x02af52d5, 0x019a9075, 0x005cf8b2, 0x010ef5fb, 0x002839f1, 0x016d4c2b, 0x00ae46d5, 0x003fba9b}}, Y: Field{[10]uint32{0x00090088, 0x0177afc6, 0x0042d315, 0x015f3105, 0x00981c89, 0x03cfb357, 0x02e4e12b, 0x0386eac1, 0x036c97dc, 0x00395f1a}}}, + }, + { + {X: Field{[10]uint32{0x0094696d, 0x039a2364, 0x02af52d5, 0x019a9075, 0x005cf8b2, 0x010ef5fb, 0x002839f1, 0x016d4c2b, 0x00ae46d5, 0x003fba9b}}, Y: Field{[10]uint32{0x00090088, 0x0177afc6, 0x0042d315, 0x015f3105, 0x00981c89, 0x03cfb357, 0x02e4e12b, 0x0386eac1, 0x036c97dc, 0x00395f1a}}}, + {X: Field{[10]uint32{0x02752b08, 0x010102bb, 0x021870aa, 0x0382ccc6, 0x01141eca, 0x036cb85e, 0x03261af9, 0x021f8714, 0x03621adb, 0x00134002}}, Y: Field{[10]uint32{0x00302cea, 0x00a147d2, 0x0293a3e7, 0x03c4671c, 0x00cb7df5, 0x00b65cb3, 0x02d82558, 0x0349572d, 0x038f18e0, 0x001a8356}}}, + {X: Field{[10]uint32{0x00dfd587, 0x00d86ed2, 0x02656079, 0x00e326c0, 0x015ec4ba, 0x033d684b, 0x0067aaa2, 0x01422cd2, 0x001bacf4, 0x0014212d}}, Y: Field{[10]uint32{0x01470e89, 0x027a5fe4, 0x035606e7, 0x0181a247, 0x035db6f5, 0x014a49d1, 0x01aa6c85, 0x0034c586, 0x031a1d98, 0x000d2a58}}}, + {X: Field{[10]uint32{0x035c58ef, 0x0258bf51, 0x01b77f89, 0x0100f87c, 0x00d657a0, 0x011c5c4a, 0x02a26211, 0x0281775a, 0x00ca203d, 0x001c7d5c}}, Y: Field{[10]uint32{0x035d420e, 0x01269cb4, 0x03e7df86, 0x00030cd8, 0x01f2445d, 0x02f256e3, 0x01557345, 0x02203749, 0x015b95dc, 0x003ad090}}}, + {X: Field{[10]uint32{0x02b34cc6, 0x008c985e, 0x00a12d08, 0x01d9f3cc, 0x00c80c29, 0x00635c4a, 0x03b3f1fd, 0x0357a94f, 0x003e0642, 0x0013c530}}, Y: Field{[10]uint32{0x007e681f, 0x03094be6, 0x01d0225e, 0x033a3a07, 0x00b9de3c, 0x00e98950, 0x013a70f4, 0x03a25319, 0x00a8caa4, 0x001ed4f4}}}, + {X: Field{[10]uint32{0x00953fa9, 0x01655b5b, 0x003db4d0, 0x00a7c2e3, 0x0228ab26, 0x02f46301, 0x01f485d4, 0x024c8ce9, 0x010eaaab, 0x002927b4}}, Y: Field{[10]uint32{0x02fb4c72, 0x00af4891, 0x0181b67b, 0x00d25a38, 0x035ae875, 0x0037f77e, 0x03476c0a, 0x014e6380, 0x0094660f, 0x00331cae}}}, + {X: Field{[10]uint32{0x0241d90d, 0x01dc4044, 0x004f8342, 0x01076c91, 0x03e81cf1, 0x03b774d8, 0x01436095, 0x027b4750, 0x007e49c7, 0x0029d36e}}, Y: Field{[10]uint32{0x037adad4, 0x01462e0f, 0x02313f32, 0x024d1282, 0x00a9ee50, 0x02205c72, 0x03dd08a5, 0x03bbcc9f, 0x01cdaf23, 0x003de1a4}}}, + {X: Field{[10]uint32{0x03ff8359, 0x022c1810, 0x03651604, 0x00771979, 0x0046b482, 0x00876805, 0x01282b5c, 0x03494edf, 0x03629f7b, 0x0028adec}}, Y: Field{[10]uint32{0x0286fec2, 0x025ffb3f, 0x03835a23, 0x00d411bc, 0x0110d108, 0x01c78a72, 0x02937a3f, 0x0048b55e, 0x00941695, 0x001a4c0e}}}, + {X: Field{[10]uint32{0x01c1ae1f, 0x0332888c, 0x000b2a5e, 0x031a2b35, 0x00456e58, 0x02e8d596, 0x00dcd44e, 0x028b3e6b, 0x025744ba, 0x001a407e}}, Y: Field{[10]uint32{0x022838b0, 0x00cc1974, 0x03a930f8, 0x0297971d, 0x01d79f3b, 0x00a72403, 0x01b5380c, 0x03084918, 0x00882273, 0x000d7797}}}, + {X: Field{[10]uint32{0x01f1f366, 0x002404e6, 0x036be34f, 0x01e8f401, 0x004a7905, 0x01265364, 0x015f216b, 0x01fdee92, 0x025c5da4, 0x001744d3}}, Y: Field{[10]uint32{0x00990f2c, 0x0034fa71, 0x00b39e2b, 0x005882a2, 0x03cf02d6, 0x00ea0adc, 0x03e2a4ae, 0x011410b6, 0x034d3e08, 0x0000ec7b}}}, + {X: Field{[10]uint32{0x027a4bdb, 0x00c4206c, 0x00cac4b0, 0x0010d525, 0x01046a6d, 0x006ee8d7, 0x004b643f, 0x02049e89, 0x002d1d43, 0x00234f36}}, Y: Field{[10]uint32{0x029a8a2c, 0x00d31f39, 0x01296c3d, 0x01f4dc2b, 0x02d4e380, 0x001d88db, 0x00fbf9d0, 0x0107d1c3, 0x016180ee, 0x0026f509}}}, + {X: Field{[10]uint32{0x03a1d916, 0x025b4ff9, 0x01f3a3c0, 0x00e5747c, 0x00315b0a, 0x0176ec1c, 0x006158a6, 0x027432eb, 0x01acb6d5, 0x001943be}}, Y: Field{[10]uint32{0x0068387b, 0x0127299c, 0x026ba858, 0x00229db0, 0x0158bb46, 0x01e6e0b1, 0x029c0b92, 0x02c461c3, 0x01f21162, 0x00021744}}}, + {X: Field{[10]uint32{0x00ec1d2d, 0x0334f1ad, 0x00f45440, 0x0171b9f6, 0x03d9099f, 0x019eda47, 0x029d6729, 0x011ce6bf, 0x0363d606, 0x003abe60}}, Y: Field{[10]uint32{0x00838452, 0x039d5813, 0x00b53fcf, 0x01515fa1, 0x02a9f52d, 0x01ac666a, 0x01228a0e, 0x023489dd, 0x003a7fe7, 0x00394606}}}, + {X: Field{[10]uint32{0x03d98ee1, 0x0323a022, 0x012bed42, 0x01ea4226, 0x03579df3, 0x023ee865, 0x027c924a, 0x00860ffa, 0x02ce0ceb, 0x00075dc2}}, Y: Field{[10]uint32{0x0138ffca, 0x02e05e47, 0x017ecf9f, 0x029038f5, 0x0237f61c, 0x01954aa1, 0x0163038b, 0x03d779e2, 0x0005f46e, 0x0009e3e2}}}, + {X: Field{[10]uint32{0x005ae767, 0x00d6fdc1, 0x0371cbcb, 0x032e7a25, 0x00c273a9, 0x0301b976, 0x0340e052, 0x02d8d19b, 0x01163aed, 0x003ee56f}}, Y: Field{[10]uint32{0x03bf0e11, 0x00fa82be, 0x03134185, 0x01c62967, 0x03b816f4, 0x01a089d6, 0x0004d9d3, 0x0376f148, 0x00d811a8, 0x00199305}}}, + {X: Field{[10]uint32{0x01ec6cb1, 0x02a5e2f0, 0x003de33f, 0x01f60216, 0x00feed65, 0x01bff28f, 0x027be4be, 0x027372cd, 0x011d9104, 0x003699ea}}, Y: Field{[10]uint32{0x0268be1d, 0x03aa389e, 0x000a17e9, 0x031423dd, 0x01dec7ad, 0x0325e039, 0x03463f7e, 0x010af107, 0x02354816, 0x0026eb2a}}}, + }, + { + {X: Field{[10]uint32{0x01ec6cb1, 0x02a5e2f0, 0x003de33f, 0x01f60216, 0x00feed65, 0x01bff28f, 0x027be4be, 0x027372cd, 0x011d9104, 0x003699ea}}, Y: Field{[10]uint32{0x0268be1d, 0x03aa389e, 0x000a17e9, 0x031423dd, 0x01dec7ad, 0x0325e039, 0x03463f7e, 0x010af107, 0x02354816, 0x0026eb2a}}}, + {X: Field{[10]uint32{0x03e741c9, 0x00f32087, 0x01a835ee, 0x00d733a9, 0x018bbd9f, 0x03c0361c, 0x00c0cfaa, 0x03bd61f0, 0x01365fa1, 0x00136eb3}}, Y: Field{[10]uint32{0x038eb623, 0x03843e0c, 0x0135f60b, 0x02827f01, 0x010cc384, 0x020e0a67, 0x01cfd59e, 0x0224b9ff, 0x000e8a51, 0x0005b0d5}}}, + {X: Field{[10]uint32{0x01bc8a44, 0x03741945, 0x011a19ef, 0x01df2f85, 0x03684101, 0x029697f1, 0x00565a4b, 0x03b68f4e, 0x00583cfc, 0x00134060}}, Y: Field{[10]uint32{0x02dbc09e, 0x03e53246, 0x01a362f1, 0x011a160b, 0x03969420, 0x01f58e04, 0x029ba800, 0x03d74d9f, 0x02c18cb4, 0x000e8cf1}}}, + {X: Field{[10]uint32{0x00e218da, 0x036a2ead, 0x0205087e, 0x03c549a1, 0x010f4c85, 0x03d07096, 0x00f17d8f, 0x026fbb9a, 0x03c48150, 0x0004f47f}}, Y: Field{[10]uint32{0x03191c19, 0x02d06776, 0x01127e0d, 0x0081b56f, 0x01a4ad01, 0x006dd62f, 0x00b9337b, 0x0258773b, 0x011fa991, 0x0018020e}}}, + {X: Field{[10]uint32{0x01daeb00, 0x02ad4a19, 0x01f76bc1, 0x00933991, 0x015923eb, 0x00edba74, 0x02cb6a27, 0x03e55c20, 0x0107df5c, 0x000bd985}}, Y: Field{[10]uint32{0x033992c0, 0x01d9e260, 0x0308c122, 0x009c6574, 0x006ecdee, 0x00802b74, 0x039537a8, 0x02ccfdbb, 0x02136f52, 0x003f5704}}}, + {X: Field{[10]uint32{0x035b4eb8, 0x0084f924, 0x01a3cf52, 0x03c6ae2d, 0x0207f557, 0x032bcb73, 0x03f54a3c, 0x00895bc3, 0x00e43adf, 0x0030465a}}, Y: Field{[10]uint32{0x03911add, 0x01265b5b, 0x0149b704, 0x02504a9c, 0x0242f8b4, 0x019d9be0, 0x039d81fe, 0x01163e0d, 0x02937786, 0x002ffd79}}}, + {X: Field{[10]uint32{0x016aa6d9, 0x02a42824, 0x02dcf182, 0x02d91dc0, 0x003662c8, 0x0060d68e, 0x00f174da, 0x011f4895, 0x017d05fe, 0x003d6504}}, Y: Field{[10]uint32{0x032e50cf, 0x001a5baf, 0x01b86c7d, 0x0220f9ad, 0x037a9277, 0x00252f3a, 0x025dbdab, 0x006c4b3d, 0x01a56e97, 0x0032a9d8}}}, + {X: Field{[10]uint32{0x02e96db8, 0x02d032a8, 0x01bff133, 0x005b38a7, 0x033cc9d9, 0x016c14ce, 0x019c79c4, 0x018001d9, 0x039cef6c, 0x000866d3}}, Y: Field{[10]uint32{0x013b6bc7, 0x03c069e3, 0x0176527d, 0x0314fa41, 0x02394f8a, 0x000dca9b, 0x0244180c, 0x03bfabd6, 0x0205d959, 0x00093671}}}, + {X: Field{[10]uint32{0x02c6f4c0, 0x0380e55e, 0x01c4ccaa, 0x03a3312f, 0x01da4e8d, 0x01a59c47, 0x021c38be, 0x02737b13, 0x017f1f4d, 0x0003cb53}}, Y: Field{[10]uint32{0x02339b58, 0x01eeeb5c, 0x02656e7e, 0x029e4090, 0x028f6a10, 0x00e079c7, 0x03b27fdf, 0x0379345f, 0x03857e93, 0x000fb227}}}, + {X: Field{[10]uint32{0x00284327, 0x0347e6bd, 0x02facc56, 0x02c0e0e9, 0x03ac4020, 0x001a8d05, 0x003ebdd8, 0x02d17375, 0x00bdcd64, 0x0003da10}}, Y: Field{[10]uint32{0x01e2ab72, 0x0349d691, 0x01eb7400, 0x029dc4ae, 0x03b68dab, 0x02d8452b, 0x01e8bff4, 0x0069dd25, 0x037f100f, 0x003cc134}}}, + {X: Field{[10]uint32{0x03428cb2, 0x01414ff7, 0x02b55d85, 0x03f59a88, 0x01233822, 0x0256343c, 0x037a1815, 0x012ef47a, 0x02c2e2a1, 0x00075773}}, Y: Field{[10]uint32{0x015b189b, 0x03b44022, 0x004a51e5, 0x00be1d81, 0x00bd3e91, 0x021bc2e2, 0x00787824, 0x03231434, 0x0083b142, 0x001b9710}}}, + {X: Field{[10]uint32{0x01dffc96, 0x02e84256, 0x01857295, 0x0296beb1, 0x019228cd, 0x0205fac0, 0x039b395c, 0x00f7abdb, 0x00bee148, 0x0005871b}}, Y: Field{[10]uint32{0x03492de4, 0x02f3d846, 0x00621c93, 0x0324babe, 0x019b9634, 0x032c60c1, 0x01259391, 0x03fe616f, 0x0292a6b9, 0x002289b2}}}, + {X: Field{[10]uint32{0x00381273, 0x03aa23ea, 0x01ae5fb0, 0x02581a4f, 0x02d84376, 0x031049b3, 0x01ea9b2c, 0x019d0e7f, 0x02fd3009, 0x00227668}}, Y: Field{[10]uint32{0x0309773d, 0x03acfbb4, 0x03324a03, 0x0202b449, 0x018f61d6, 0x01b3d8bd, 0x03aaf207, 0x01bd40dd, 0x01b451d6, 0x0037f289}}}, + {X: Field{[10]uint32{0x010a683f, 0x018557e0, 0x031be4cf, 0x00c6fdba, 0x005248bd, 0x00626aa3, 0x02c7285f, 0x035283f9, 0x02cc3f64, 0x001e0f43}}, Y: Field{[10]uint32{0x00f54c4c, 0x019b38b8, 0x01ee9dfd, 0x0221c8e5, 0x02b5de92, 0x01fcb547, 0x02b74572, 0x03d28c05, 0x01029073, 0x0008029b}}}, + {X: Field{[10]uint32{0x01c71d91, 0x00cacb2d, 0x00fd21cc, 0x00b8aa25, 0x0223945e, 0x0056bfb3, 0x02a1c131, 0x002b8714, 0x038783a5, 0x0020c646}}, Y: Field{[10]uint32{0x02148a61, 0x027b0238, 0x005ee70b, 0x0145d411, 0x0217a11f, 0x005f2ba2, 0x006de13d, 0x006dc278, 0x03157380, 0x00382b1f}}}, + {X: Field{[10]uint32{0x0237b7c0, 0x01173306, 0x0069f575, 0x03deec44, 0x01ec08d0, 0x03bc8854, 0x02000935, 0x0133769b, 0x03aa0b33, 0x0014e413}}, Y: Field{[10]uint32{0x022771c8, 0x02c25ac0, 0x034699dc, 0x02078510, 0x00139999, 0x00834f07, 0x009eccac, 0x0041b623, 0x03d0bc80, 0x0016f021}}}, + }, + { + {X: Field{[10]uint32{0x0237b7c0, 0x01173306, 0x0069f575, 0x03deec44, 0x01ec08d0, 0x03bc8854, 0x02000935, 0x0133769b, 0x03aa0b33, 0x0014e413}}, Y: Field{[10]uint32{0x022771c8, 0x02c25ac0, 0x034699dc, 0x02078510, 0x00139999, 0x00834f07, 0x009eccac, 0x0041b623, 0x03d0bc80, 0x0016f021}}}, + {X: Field{[10]uint32{0x00a47ca9, 0x0343c7ce, 0x005ad57c, 0x02aab43e, 0x012a6ee7, 0x00c5a657, 0x03991196, 0x0119d4f3, 0x01af9d41, 0x0000695d}}, Y: Field{[10]uint32{0x03ebcdb7, 0x0177cb9d, 0x03ea667c, 0x01767d35, 0x00bdb93c, 0x006ee1a6, 0x015fc52e, 0x00370f31, 0x01cb8ab2, 0x000c0e3c}}}, + {X: Field{[10]uint32{0x00a2050e, 0x0310bf92, 0x00a6771a, 0x015d857e, 0x01742ef5, 0x0391e6e2, 0x03769cc6, 0x01cc625a, 0x00fd24bc, 0x0019cdc9}}, Y: Field{[10]uint32{0x021d3d70, 0x03269241, 0x01cc2b90, 0x03f50cd2, 0x01be6bac, 0x02a21adb, 0x03482c09, 0x01288080, 0x0257896a, 0x003933e0}}}, + {X: Field{[10]uint32{0x0315565b, 0x0275d578, 0x00c6ee30, 0x020f4f08, 0x02d3a61a, 0x01d85575, 0x031f5c1b, 0x0350e729, 0x00437621, 0x003d7c38}}, Y: Field{[10]uint32{0x012ecc82, 0x010c2bf7, 0x0240a678, 0x02fcfb5f, 0x02a5bf61, 0x037dc406, 0x02189160, 0x0014afd8, 0x0262be5a, 0x001ae7d3}}}, + {X: Field{[10]uint32{0x02de63bf, 0x01b920e0, 0x01c66cbf, 0x00ca1c98, 0x00e03af5, 0x03d859aa, 0x0198a631, 0x0130c279, 0x03a472df, 0x0010d9bb}}, Y: Field{[10]uint32{0x017924cd, 0x01a90238, 0x02d6b02c, 0x01496aa9, 0x02f33b0c, 0x00c09a3a, 0x022537e1, 0x035f38bb, 0x0109bee2, 0x000b9f76}}}, + {X: Field{[10]uint32{0x01a78179, 0x03d807ea, 0x02afe34c, 0x00149835, 0x036b50e9, 0x00827b67, 0x01a47336, 0x02e37241, 0x03f37081, 0x00265729}}, Y: Field{[10]uint32{0x03ec1f47, 0x03eed32b, 0x00e52931, 0x015a6ad9, 0x02bbcc85, 0x0124a18e, 0x0234d880, 0x015cead7, 0x01e95553, 0x00366816}}}, + {X: Field{[10]uint32{0x02f96190, 0x0149ffc1, 0x0125ef10, 0x03a41f25, 0x03d1f02d, 0x019ea9d7, 0x03e55696, 0x02ac7e5e, 0x03627991, 0x001ef5d4}}, Y: Field{[10]uint32{0x03da00f6, 0x005c812a, 0x02695a3d, 0x0170783a, 0x02ce0fcc, 0x010e09f5, 0x02d64749, 0x018c2757, 0x02b3dbba, 0x0020cdbc}}}, + {X: Field{[10]uint32{0x01362d33, 0x01e0767d, 0x03642cbe, 0x00851889, 0x0347cbc9, 0x01c32938, 0x027f36d9, 0x01ba695e, 0x030b6c0b, 0x0023d41b}}, Y: Field{[10]uint32{0x03fa243f, 0x021f4321, 0x00eaf304, 0x01750eee, 0x0048cf92, 0x03c70cda, 0x030c5424, 0x0185c654, 0x015d2afa, 0x0011a7e5}}}, + {X: Field{[10]uint32{0x02ad41ed, 0x0054c555, 0x0352433b, 0x00d7d3c0, 0x020308ac, 0x02463724, 0x023419e8, 0x035706be, 0x027bddaa, 0x0013dfa4}}, Y: Field{[10]uint32{0x02642d57, 0x00d5e19f, 0x0375bdf4, 0x01c53abd, 0x022e7314, 0x00ea3da9, 0x02980df5, 0x022c4154, 0x005156a8, 0x0037f9dd}}}, + {X: Field{[10]uint32{0x025e6618, 0x010e868f, 0x03cb4c18, 0x03d6763f, 0x03166d65, 0x03904918, 0x02017141, 0x01f6fe1f, 0x007338b9, 0x003ef084}}, Y: Field{[10]uint32{0x0230c860, 0x01536808, 0x00cf20ed, 0x00fc772f, 0x017f3c4f, 0x03ce6c47, 0x0160c1a6, 0x025052d2, 0x0059185c, 0x0027e6c2}}}, + {X: Field{[10]uint32{0x03748690, 0x01814499, 0x00b01cfa, 0x0137618c, 0x007d5790, 0x0374cf40, 0x03452b1e, 0x00733252, 0x03867d29, 0x0008d572}}, Y: Field{[10]uint32{0x0089582b, 0x011d4c53, 0x0139147c, 0x01633472, 0x00582868, 0x016a9f16, 0x01b85ec1, 0x0387e3d5, 0x018a5a71, 0x000870bc}}}, + {X: Field{[10]uint32{0x009135d3, 0x02361761, 0x031fc13d, 0x03404b90, 0x0274203c, 0x004c2c5a, 0x00134294, 0x02a16997, 0x03c7ef82, 0x00016502}}, Y: Field{[10]uint32{0x022255d2, 0x035d1465, 0x02391d02, 0x00a32640, 0x02f12863, 0x02ad9a1e, 0x035b0c7a, 0x02ad84bd, 0x0185eb4f, 0x002414de}}}, + {X: Field{[10]uint32{0x02de7f16, 0x03a88582, 0x0028c6da, 0x03a4f2f8, 0x00ae9cba, 0x0309d749, 0x03592ab6, 0x0295b004, 0x025b9b3d, 0x0002d9a0}}, Y: Field{[10]uint32{0x00c56217, 0x01109a12, 0x00d2bd94, 0x0037cf9f, 0x03b7243c, 0x02d5ea5f, 0x03a76ba8, 0x026cffbc, 0x00b818e0, 0x00287ee8}}}, + {X: Field{[10]uint32{0x00d2374d, 0x00c1c059, 0x02b2bc63, 0x025a133f, 0x00dcf38a, 0x02cffda9, 0x025a9f71, 0x03274976, 0x02d8b5e5, 0x0005bba3}}, Y: Field{[10]uint32{0x00865998, 0x016f2d3f, 0x01dd980e, 0x003b9b53, 0x02075513, 0x016dbfd8, 0x026b843e, 0x03c44228, 0x03f0546f, 0x003d4039}}}, + {X: Field{[10]uint32{0x01060d5b, 0x01ac08a6, 0x03a7c290, 0x02c470e8, 0x03904613, 0x027e5472, 0x0109b2fd, 0x0008b2d8, 0x003cf0bd, 0x003d8081}}, Y: Field{[10]uint32{0x02f88f13, 0x01bd42c6, 0x01a3f76f, 0x034adf74, 0x0237aa56, 0x0313defa, 0x01a8f64a, 0x033c6620, 0x0306c1f0, 0x003c0dad}}}, + {X: Field{[10]uint32{0x02d86047, 0x02567d0e, 0x00bcaeff, 0x0010ea6e, 0x0379b53a, 0x0132a419, 0x01cca776, 0x020e9dc6, 0x010bd359, 0x00239ef3}}, Y: Field{[10]uint32{0x0060372a, 0x00011fa1, 0x028b3ea1, 0x00b91ff5, 0x0179e88e, 0x032a5451, 0x00310420, 0x0292ce50, 0x030b2a3d, 0x00042ddd}}}, + }, + { + {X: Field{[10]uint32{0x02d86047, 0x02567d0e, 0x00bcaeff, 0x0010ea6e, 0x0379b53a, 0x0132a419, 0x01cca776, 0x020e9dc6, 0x010bd359, 0x00239ef3}}, Y: Field{[10]uint32{0x0060372a, 0x00011fa1, 0x028b3ea1, 0x00b91ff5, 0x0179e88e, 0x032a5451, 0x00310420, 0x0292ce50, 0x030b2a3d, 0x00042ddd}}}, + {X: Field{[10]uint32{0x013f0351, 0x00a022fc, 0x009e777d, 0x0234f40e, 0x033bc15b, 0x025a5437, 0x010f3199, 0x01ca770d, 0x03aa195e, 0x000cecd6}}, Y: Field{[10]uint32{0x038d7418, 0x0140f332, 0x01b702bc, 0x03bef222, 0x00aa6560, 0x012354af, 0x00640362, 0x02fe1fe5, 0x0185640a, 0x00296280}}}, + {X: Field{[10]uint32{0x001ead4b, 0x0221e681, 0x003c1ffe, 0x03eda46c, 0x023a75ed, 0x02bf9daf, 0x014734ef, 0x00cdfb1c, 0x000c8c8f, 0x002ff243}}, Y: Field{[10]uint32{0x02fedaed, 0x00b1bc21, 0x02e3e745, 0x03fccb82, 0x02fb468e, 0x01410b4d, 0x03a718dd, 0x037b4936, 0x01b1e09c, 0x001ea520}}}, + {X: Field{[10]uint32{0x0014bb36, 0x0371ec91, 0x03ca6d71, 0x00272b5e, 0x0256f6e1, 0x01c7df88, 0x0383ad20, 0x00fe5572, 0x02ae22c9, 0x000dd37b}}, Y: Field{[10]uint32{0x01af734a, 0x016faa63, 0x00321787, 0x018c0395, 0x013828d6, 0x0201bdca, 0x0032c06f, 0x013e6458, 0x01b64fcd, 0x0005c459}}}, + {X: Field{[10]uint32{0x01bb3b3e, 0x01ef41dd, 0x033cb26e, 0x005fbe7d, 0x03507536, 0x030b4fd6, 0x025993e8, 0x02aa9372, 0x011cbe3f, 0x001ccb7c}}, Y: Field{[10]uint32{0x03366693, 0x01df87b5, 0x00436cc5, 0x01b59316, 0x02e69dad, 0x00094e45, 0x03e25584, 0x0265df2d, 0x003ede8f, 0x001fd064}}}, + {X: Field{[10]uint32{0x01b7ad0d, 0x03215bb9, 0x011d3694, 0x01f2a743, 0x0076ee76, 0x01b45b11, 0x010d8a49, 0x0380370b, 0x010dabb5, 0x000e955a}}, Y: Field{[10]uint32{0x02e8c407, 0x0261e42c, 0x01218d6c, 0x022b2b0c, 0x0301cacb, 0x01fbe67c, 0x021fbac9, 0x0195efec, 0x021975a0, 0x0030f8a3}}}, + {X: Field{[10]uint32{0x008dc3b9, 0x016cf062, 0x00c99c5f, 0x0093a5dd, 0x0019a669, 0x0325fbd8, 0x01a8840c, 0x011ed0a3, 0x00b96039, 0x00133825}}, Y: Field{[10]uint32{0x01c0de52, 0x013dedb9, 0x006502c1, 0x008327a8, 0x0216205b, 0x029dab28, 0x03b4d80c, 0x026cfb55, 0x03babf1a, 0x00014e43}}}, + {X: Field{[10]uint32{0x02e7d616, 0x02992b5a, 0x01f0c5e8, 0x03cad8aa, 0x00944dba, 0x016bac37, 0x006e0739, 0x03ab95f1, 0x009c7f3a, 0x0008e030}}, Y: Field{[10]uint32{0x021bbc1a, 0x026f9205, 0x02756009, 0x00523e11, 0x0293af92, 0x01426c26, 0x0198aefd, 0x0255abc5, 0x02193464, 0x001be3a1}}}, + {X: Field{[10]uint32{0x02aafe5a, 0x01d782c2, 0x02edd4c3, 0x02ce9426, 0x00e25470, 0x02c08ff4, 0x018a6a95, 0x019f7a5b, 0x02b76fc6, 0x0026a5a3}}, Y: Field{[10]uint32{0x02d975c0, 0x02ff5093, 0x00cc0ce6, 0x0029979c, 0x02e7b588, 0x03618743, 0x03c66d03, 0x02e8a553, 0x0307a6d3, 0x002afdbe}}}, + {X: Field{[10]uint32{0x03a32402, 0x018b453b, 0x025348d9, 0x0184f19a, 0x025e659c, 0x000e00d3, 0x037db3bb, 0x03aaaf83, 0x02ced74c, 0x00060293}}, Y: Field{[10]uint32{0x00894b4e, 0x00de0371, 0x0118b320, 0x024dff73, 0x01a602c5, 0x013fafa1, 0x03bfc2f2, 0x035f8ab6, 0x015747ba, 0x00126293}}}, + {X: Field{[10]uint32{0x034c6397, 0x0072fe7c, 0x00d09375, 0x02d401d3, 0x0107dd3d, 0x014dac88, 0x00aef802, 0x0186553c, 0x03ed0171, 0x0034f1be}}, Y: Field{[10]uint32{0x00cb3f9c, 0x0323415a, 0x00e00b1f, 0x00224178, 0x028a0c77, 0x00baad91, 0x018394d9, 0x00abc651, 0x02c55e5e, 0x00128374}}}, + {X: Field{[10]uint32{0x01b2df82, 0x0291ec26, 0x00fb1927, 0x00591c41, 0x00ec5e7a, 0x0338cb01, 0x012d18ec, 0x02e4b332, 0x005c62bf, 0x00101699}}, Y: Field{[10]uint32{0x01307dbf, 0x00a0d282, 0x0062b5da, 0x02cb3b71, 0x022ffa9d, 0x008df9c4, 0x00aca61e, 0x025b83d7, 0x0014f44d, 0x002f0f2d}}}, + {X: Field{[10]uint32{0x02c3137e, 0x020964c2, 0x0244619b, 0x018a96bd, 0x03fe925b, 0x02aace54, 0x02f06a76, 0x010ee380, 0x03981292, 0x00132f78}}, Y: Field{[10]uint32{0x02c02fe6, 0x023c573b, 0x02d60c00, 0x02b9623a, 0x00d193a7, 0x02e530dc, 0x0092a134, 0x01856540, 0x00608f13, 0x001b3955}}}, + {X: Field{[10]uint32{0x010ce56e, 0x006788f9, 0x014a3c71, 0x03c35de4, 0x02c8293a, 0x032f9e05, 0x00590fca, 0x006bcf9a, 0x00d3ce53, 0x002a9b71}}, Y: Field{[10]uint32{0x01edd739, 0x03ce8d1f, 0x010a8b9d, 0x036be3dc, 0x03c11984, 0x03997998, 0x01f6edc5, 0x0394a5b8, 0x018fa241, 0x003af1e6}}}, + {X: Field{[10]uint32{0x00fbf84b, 0x008c1b38, 0x00b8a47a, 0x032ef0fc, 0x0303c48f, 0x030533ae, 0x03d9c730, 0x01891ee2, 0x033c82b1, 0x0012e74c}}, Y: Field{[10]uint32{0x036c3c48, 0x03b92d28, 0x035e6239, 0x010f8bd6, 0x036766d5, 0x019e6dfa, 0x0313d982, 0x03054954, 0x03fbe24c, 0x003f5ff1}}}, + {X: Field{[10]uint32{0x01c43862, 0x01078566, 0x026690a8, 0x03c60e5f, 0x0271a7f4, 0x026e06f7, 0x01081868, 0x03fc879b, 0x0134c1cd, 0x000e17bb}}, Y: Field{[10]uint32{0x002e5453, 0x0163f955, 0x01c8cc04, 0x03b0821b, 0x036b304e, 0x027afd15, 0x001de19e, 0x008fd59c, 0x03c3e8ea, 0x000a0efa}}}, + }, + { + {X: Field{[10]uint32{0x01c43862, 0x01078566, 0x026690a8, 0x03c60e5f, 0x0271a7f4, 0x026e06f7, 0x01081868, 0x03fc879b, 0x0134c1cd, 0x000e17bb}}, Y: Field{[10]uint32{0x002e5453, 0x0163f955, 0x01c8cc04, 0x03b0821b, 0x036b304e, 0x027afd15, 0x001de19e, 0x008fd59c, 0x03c3e8ea, 0x000a0efa}}}, + {X: Field{[10]uint32{0x00f2827c, 0x00e89c1e, 0x01ce2dc8, 0x010afbf0, 0x0147c826, 0x0357d9f4, 0x016be134, 0x01520011, 0x02083daf, 0x003dbd88}}, Y: Field{[10]uint32{0x00aaa102, 0x02c82d48, 0x01bf6d15, 0x01d120c8, 0x03e657ca, 0x00d9f3b9, 0x02c5715b, 0x00e83ebc, 0x02817de7, 0x0006f353}}}, + {X: Field{[10]uint32{0x02e2d9b3, 0x034c1aad, 0x0163514b, 0x020c6ce3, 0x0241db92, 0x0273e115, 0x012ea613, 0x00179d78, 0x00f397c7, 0x000668c5}}, Y: Field{[10]uint32{0x03aaaf33, 0x00bb8972, 0x03e56d55, 0x00749012, 0x03a5021d, 0x01fd4a2c, 0x00965f88, 0x00a3748d, 0x00f5dac7, 0x001b2b36}}}, + {X: Field{[10]uint32{0x015adcb6, 0x024c825c, 0x02f369d8, 0x0339f631, 0x01cd91c3, 0x0347f095, 0x030cb3c3, 0x00f78af5, 0x01188f95, 0x003ec9b9}}, Y: Field{[10]uint32{0x00ba68f3, 0x02f28ed6, 0x02b5449d, 0x00c6e2de, 0x0116d2cb, 0x027405da, 0x02846a71, 0x028d3563, 0x00811012, 0x003cf84a}}}, + {X: Field{[10]uint32{0x02f00480, 0x0161fac4, 0x01cee7d8, 0x00128403, 0x01203588, 0x013d9c86, 0x01c98636, 0x036a8d57, 0x014b95a8, 0x0016103b}}, Y: Field{[10]uint32{0x0222cf9e, 0x00b578af, 0x03872159, 0x01514ab8, 0x02ba7522, 0x00577636, 0x0168deaa, 0x03c5041e, 0x026b220b, 0x0019c336}}}, + {X: Field{[10]uint32{0x03a52264, 0x01cdf658, 0x00b3752e, 0x000c5500, 0x03d0adfc, 0x02b9473f, 0x006e2a9a, 0x01ffa6a0, 0x000de818, 0x00217ff7}}, Y: Field{[10]uint32{0x02da2082, 0x01f4a6a0, 0x01d0498c, 0x0324ac5e, 0x00678182, 0x01551c1b, 0x02568f50, 0x0252342f, 0x00187ae2, 0x000ffb8c}}}, + {X: Field{[10]uint32{0x03f54c42, 0x0137ba08, 0x03dc8e48, 0x00f09a68, 0x0145dc1a, 0x03b394c9, 0x0058c1f4, 0x0063ec77, 0x01a53469, 0x0027d5c0}}, Y: Field{[10]uint32{0x03eb6a21, 0x0387124b, 0x02527860, 0x012ac867, 0x0189ee78, 0x01ca6ff7, 0x0395b6b5, 0x02795efe, 0x03b8801d, 0x00339ee3}}}, + {X: Field{[10]uint32{0x00788c1e, 0x0136dd58, 0x011d7ed4, 0x00183a2f, 0x03d18c37, 0x018f3aad, 0x035c6bc7, 0x004cb4a3, 0x025911b9, 0x00226448}}, Y: Field{[10]uint32{0x028f0ef1, 0x031088a3, 0x01e11635, 0x0213f7be, 0x0236969c, 0x026c4dbe, 0x03876355, 0x02b26c9e, 0x01987cc9, 0x0036a2d3}}}, + {X: Field{[10]uint32{0x0122461a, 0x0104cca5, 0x018327e9, 0x00996f1c, 0x00bcb30a, 0x019fbe68, 0x03b87010, 0x0233f006, 0x0169235a, 0x0009fd84}}, Y: Field{[10]uint32{0x03301a2d, 0x0132be71, 0x039446aa, 0x00836a18, 0x00e4981b, 0x01d0a3ba, 0x008c5612, 0x01ab4ba9, 0x01a9900a, 0x003944bc}}}, + {X: Field{[10]uint32{0x02ddd3ac, 0x03662579, 0x006516db, 0x00ce8bc0, 0x037bf8f6, 0x0338b568, 0x012d90d6, 0x00b82561, 0x03e6732a, 0x0025bb94}}, Y: Field{[10]uint32{0x029b6fde, 0x0096cd9c, 0x01c06fbf, 0x025db19b, 0x02ef0d07, 0x03afc783, 0x004c9711, 0x00a7cb63, 0x02eae4b6, 0x000e6e72}}}, + {X: Field{[10]uint32{0x014f36b9, 0x00b26cb4, 0x03390cce, 0x02ed8ee7, 0x012598ca, 0x017d2a60, 0x01bf2f43, 0x03e50498, 0x01856cee, 0x001901de}}, Y: Field{[10]uint32{0x00b4b50a, 0x02c7ba79, 0x02eb2894, 0x01c12673, 0x008cda08, 0x02169edb, 0x010d75fd, 0x01bbebbe, 0x028f44e5, 0x00369864}}}, + {X: Field{[10]uint32{0x02a88c9c, 0x03fd692d, 0x01f069c1, 0x0198c527, 0x02a37b68, 0x01cb2a8a, 0x021d9ac9, 0x0244e62c, 0x0081e547, 0x001e1964}}, Y: Field{[10]uint32{0x01a7d19b, 0x0164d15d, 0x02a155e0, 0x026c0ead, 0x0112cf91, 0x017a0658, 0x028fa722, 0x0034ada7, 0x007792a3, 0x0016688c}}}, + {X: Field{[10]uint32{0x00d6b76f, 0x018f7e65, 0x015dbcef, 0x03eed320, 0x027fe5a9, 0x00277fab, 0x02f708bc, 0x019a7d14, 0x00e31c85, 0x00288dd4}}, Y: Field{[10]uint32{0x01cca8da, 0x024b3323, 0x008d141d, 0x0047f6e1, 0x03e7707c, 0x03504444, 0x032fa3e4, 0x0379b6b0, 0x0314a6e7, 0x003dcce6}}}, + {X: Field{[10]uint32{0x00c13079, 0x0336c4f4, 0x01688d4f, 0x00055374, 0x026f3e5a, 0x036bcc05, 0x01fea76e, 0x003aee02, 0x010b6e1f, 0x001794ad}}, Y: Field{[10]uint32{0x00e1296f, 0x00f1239c, 0x00e1cc10, 0x0344f58f, 0x004a3829, 0x01280fab, 0x02987853, 0x012c326d, 0x02e73a35, 0x000667b7}}}, + {X: Field{[10]uint32{0x00eee475, 0x03a7193f, 0x0382b12e, 0x00a103b5, 0x01ab6ac8, 0x00f2bfd0, 0x013c021f, 0x00de357b, 0x0007a3f2, 0x002efc6b}}, Y: Field{[10]uint32{0x03fe5067, 0x008a8021, 0x001d6846, 0x02250e2d, 0x0324eb9d, 0x01ac57f8, 0x0083cc83, 0x01839842, 0x00deead4, 0x002d2fee}}}, + {X: Field{[10]uint32{0x03fac3a7, 0x01bb61b0, 0x03bc9c60, 0x0129651f, 0x000fddf8, 0x004f7e86, 0x03c73a44, 0x03c6458d, 0x01b803ec, 0x0001be76}}, Y: Field{[10]uint32{0x02842160, 0x0224180e, 0x01002d86, 0x00bd70a0, 0x007ea4dd, 0x03917135, 0x038e2a30, 0x0166e9a6, 0x028e6030, 0x001f2031}}}, + }, + { + {X: Field{[10]uint32{0x03fac3a7, 0x01bb61b0, 0x03bc9c60, 0x0129651f, 0x000fddf8, 0x004f7e86, 0x03c73a44, 0x03c6458d, 0x01b803ec, 0x0001be76}}, Y: Field{[10]uint32{0x02842160, 0x0224180e, 0x01002d86, 0x00bd70a0, 0x007ea4dd, 0x03917135, 0x038e2a30, 0x0166e9a6, 0x028e6030, 0x001f2031}}}, + {X: Field{[10]uint32{0x037fd72d, 0x03489d12, 0x01a175c9, 0x03969f93, 0x01da1745, 0x01120a4e, 0x01c36c28, 0x01047073, 0x02ea252b, 0x002ba1bb}}, Y: Field{[10]uint32{0x02ee38bc, 0x0132de93, 0x03728233, 0x015451cb, 0x018d9211, 0x0227fc3a, 0x02b0ace5, 0x000be58a, 0x03c97073, 0x00067a64}}}, + {X: Field{[10]uint32{0x021ce204, 0x035d7a34, 0x023d524e, 0x0239099d, 0x03b2a725, 0x0329bdcb, 0x0374d859, 0x03193ee0, 0x01d162b3, 0x0010f290}}, Y: Field{[10]uint32{0x034a8f6b, 0x014113a4, 0x02468e52, 0x02ccfa92, 0x039ab6c7, 0x0236e8c7, 0x0250f921, 0x008fe871, 0x0282e370, 0x00373a96}}}, + {X: Field{[10]uint32{0x00169290, 0x011d099f, 0x032ee7a1, 0x01d73cdb, 0x008718be, 0x01b70b12, 0x01d2f8c5, 0x03fd5798, 0x01f90bbf, 0x00089232}}, Y: Field{[10]uint32{0x003ea257, 0x036284a2, 0x02be2369, 0x0008d768, 0x00e16375, 0x010d6e86, 0x006bb55b, 0x03bb5e94, 0x00692d21, 0x003e8165}}}, + {X: Field{[10]uint32{0x03e6efda, 0x033a4b3a, 0x0005964f, 0x03cfe1ca, 0x01922d4f, 0x0216941b, 0x026f7237, 0x00afd6d9, 0x02ef2289, 0x00270f81}}, Y: Field{[10]uint32{0x03aefc7d, 0x0103cca9, 0x03df7df1, 0x01a1ecdb, 0x01d43bc8, 0x03389bf5, 0x030b2d44, 0x0248f62b, 0x01e5e762, 0x0029edc2}}}, + {X: Field{[10]uint32{0x00978583, 0x0290c805, 0x0213f5b3, 0x02bbc185, 0x00cdd6e9, 0x003e4885, 0x03841999, 0x00c4dd25, 0x009b9cf2, 0x000c2afe}}, Y: Field{[10]uint32{0x01c75777, 0x00600d47, 0x004ac446, 0x0288eed6, 0x0063120e, 0x00386ae0, 0x037b4f2d, 0x01d26337, 0x0115477f, 0x0012c0d4}}}, + {X: Field{[10]uint32{0x02c88be2, 0x009ead71, 0x025e2791, 0x008341bb, 0x03ea2c78, 0x020c1dd6, 0x0372759d, 0x003c0cee, 0x02a313e2, 0x00175be2}}, Y: Field{[10]uint32{0x017ad75d, 0x03954fc3, 0x012c2892, 0x023a9afe, 0x00edab6f, 0x02c22f08, 0x01aaf33a, 0x0353a31c, 0x018d8d56, 0x002b712c}}}, + {X: Field{[10]uint32{0x010964e3, 0x036b12ed, 0x02f76fd0, 0x01df7471, 0x00a99f08, 0x02502174, 0x0011b48d, 0x01101d2b, 0x0216e05c, 0x0038469b}}, Y: Field{[10]uint32{0x0282bfc8, 0x03efe2c1, 0x00c6f767, 0x0384e0c6, 0x0017adc6, 0x01bc2bc9, 0x02d5e259, 0x0350c386, 0x025b87a2, 0x0021f581}}}, + {X: Field{[10]uint32{0x02d1b844, 0x024d46e4, 0x02484f28, 0x020b05cf, 0x01c69c03, 0x004e22f1, 0x02b15c3c, 0x00357f21, 0x01c304a6, 0x003d5f4d}}, Y: Field{[10]uint32{0x01266837, 0x02eaef58, 0x01c6a464, 0x0080c245, 0x00700697, 0x027918d3, 0x004d3f5a, 0x03d365e4, 0x019ea98e, 0x001c1fcf}}}, + {X: Field{[10]uint32{0x021f51d3, 0x01c591ec, 0x03df8739, 0x0118b0e7, 0x0011f80d, 0x036842ea, 0x00d419b9, 0x02a5573a, 0x03216726, 0x001a9cfe}}, Y: Field{[10]uint32{0x01224b17, 0x00937669, 0x03774018, 0x011a2d82, 0x022db482, 0x025c844c, 0x02a7d294, 0x03cf09ff, 0x02fca1ed, 0x0013cf3b}}}, + {X: Field{[10]uint32{0x00c7cb09, 0x03401fcf, 0x03435234, 0x01a28746, 0x023bc7eb, 0x00f61c51, 0x016e1fee, 0x025297d6, 0x007a3a65, 0x0004f9d8}}, Y: Field{[10]uint32{0x00079160, 0x01d6a282, 0x036411be, 0x02ed9ad5, 0x0165eae2, 0x02cd0a67, 0x025fdd85, 0x02e2c78c, 0x008de8fb, 0x000a1372}}}, + {X: Field{[10]uint32{0x00288015, 0x00df98fb, 0x019cc39a, 0x014fbb72, 0x024673f8, 0x0016daa9, 0x01fac61a, 0x0379bda0, 0x02aad936, 0x002a8053}}, Y: Field{[10]uint32{0x02c1006f, 0x00539991, 0x00ad9df8, 0x001d0f3b, 0x03ef4b9b, 0x03dec3d8, 0x032a7e43, 0x02fa6b0f, 0x03c04636, 0x000f7a44}}}, + {X: Field{[10]uint32{0x00cdee05, 0x00338496, 0x003b9006, 0x02c85cbb, 0x01a8761f, 0x02c1a407, 0x000250b1, 0x020b9890, 0x03225681, 0x000a6fa8}}, Y: Field{[10]uint32{0x022651c8, 0x0280d669, 0x018e39e4, 0x02db231a, 0x03f9fc31, 0x021c17b1, 0x0009b3fb, 0x02683aa4, 0x01a2690e, 0x001f1036}}}, + {X: Field{[10]uint32{0x011d45f9, 0x02155e3c, 0x026144cf, 0x0379b1e5, 0x02ba4c1c, 0x01f6de5b, 0x022ef2c7, 0x0144ad3a, 0x03d35337, 0x000dabb8}}, Y: Field{[10]uint32{0x00febad4, 0x02eacfdf, 0x036069d3, 0x0342b11c, 0x00004b35, 0x01f263d5, 0x00b95470, 0x018271e7, 0x0235cd69, 0x0032ab76}}}, + {X: Field{[10]uint32{0x02f18ada, 0x01b1d584, 0x01bcc11b, 0x024eef6f, 0x01d460bd, 0x00cf5296, 0x0036faff, 0x02239f67, 0x006d2382, 0x003d485e}}, Y: Field{[10]uint32{0x03953516, 0x01a2bf48, 0x030981dd, 0x028db16f, 0x02aa5ef4, 0x03347475, 0x0026102b, 0x036d5fb3, 0x03bf6038, 0x00381a1b}}}, + {X: Field{[10]uint32{0x02d0e6bd, 0x01f839d0, 0x01e5313b, 0x018f6c3d, 0x03f774d1, 0x00135bb2, 0x022147c1, 0x0138960a, 0x0001243c, 0x000cc8b5}}, Y: Field{[10]uint32{0x0028b2a0, 0x00e8ba5b, 0x03af624f, 0x00fa8a1c, 0x032805f6, 0x0376be6d, 0x03019bc4, 0x013bd6fe, 0x0397e966, 0x0015b9c1}}}, + }, + { + {X: Field{[10]uint32{0x02d0e6bd, 0x01f839d0, 0x01e5313b, 0x018f6c3d, 0x03f774d1, 0x00135bb2, 0x022147c1, 0x0138960a, 0x0001243c, 0x000cc8b5}}, Y: Field{[10]uint32{0x0028b2a0, 0x00e8ba5b, 0x03af624f, 0x00fa8a1c, 0x032805f6, 0x0376be6d, 0x03019bc4, 0x013bd6fe, 0x0397e966, 0x0015b9c1}}}, + {X: Field{[10]uint32{0x00ade462, 0x025b4cb0, 0x00f29fc6, 0x0323ab6f, 0x010d4cdd, 0x01320335, 0x00ef31b0, 0x02f6b848, 0x000250ce, 0x00234988}}, Y: Field{[10]uint32{0x0326470c, 0x002a2e43, 0x00b3ad8e, 0x0139c99e, 0x021d4afb, 0x00fb8dae, 0x01f6f2dc, 0x03d0df4c, 0x03b4715b, 0x003afb4e}}}, + {X: Field{[10]uint32{0x019ab499, 0x0274fc81, 0x00330abd, 0x0271b9cf, 0x000b1329, 0x019fc06f, 0x02196b3c, 0x0016e974, 0x03f3015c, 0x001e2eab}}, Y: Field{[10]uint32{0x02e097fd, 0x0348c63f, 0x01199681, 0x03ba3449, 0x0291632e, 0x0360820b, 0x00a84e0e, 0x0302bebf, 0x00dbdb06, 0x002b52f7}}}, + {X: Field{[10]uint32{0x0116e633, 0x01190f85, 0x01c8b916, 0x00341cb6, 0x038ed493, 0x0165340e, 0x00068a1f, 0x02faa739, 0x00766eae, 0x00048e30}}, Y: Field{[10]uint32{0x037b7805, 0x036dca31, 0x0022805c, 0x00b731d0, 0x03094625, 0x0070f705, 0x00979e2d, 0x004d675b, 0x002dbb27, 0x0022a76c}}}, + {X: Field{[10]uint32{0x0106ace6, 0x00f85b3f, 0x020ca449, 0x00dbe0e8, 0x0223709b, 0x024a6ac6, 0x00b84984, 0x038f5308, 0x0211a14a, 0x001bdc3c}}, Y: Field{[10]uint32{0x0202d5de, 0x02fb4d2d, 0x005ee048, 0x019af96b, 0x00753295, 0x01ee67d4, 0x015d8f34, 0x01edcdbe, 0x02309402, 0x001e47a2}}}, + {X: Field{[10]uint32{0x01cd5379, 0x018ccc29, 0x03cadc30, 0x00e161c2, 0x032db794, 0x02a93488, 0x002481b8, 0x004e0a9e, 0x02d56bdd, 0x0005f01c}}, Y: Field{[10]uint32{0x0108cd25, 0x02b8146c, 0x02d0df7c, 0x01d8996e, 0x038959ac, 0x03c740d3, 0x03c1247a, 0x0281939d, 0x01f4283d, 0x0036406f}}}, + {X: Field{[10]uint32{0x00ee1b40, 0x03b8fb98, 0x02247dc8, 0x016dc7a5, 0x008ced48, 0x0040f335, 0x00949f19, 0x029057e0, 0x01b29d6a, 0x00385667}}, Y: Field{[10]uint32{0x038f93a6, 0x018997b5, 0x0199de1d, 0x01d2f0ca, 0x03a6363a, 0x028bf1f3, 0x02f894aa, 0x035283be, 0x02232a81, 0x001e4cd8}}}, + {X: Field{[10]uint32{0x008e7a66, 0x0005549e, 0x0021619b, 0x00a0ac3b, 0x01cddcd7, 0x029a846e, 0x032ea758, 0x0270579e, 0x030770cb, 0x0009c756}}, Y: Field{[10]uint32{0x003c9727, 0x035c9638, 0x0024e7a8, 0x038d422a, 0x03e2a065, 0x026b21df, 0x017d0994, 0x03d24791, 0x005834e7, 0x00174ea9}}}, + {X: Field{[10]uint32{0x01c00c3e, 0x037e8a12, 0x008e2f81, 0x000f2448, 0x01f00e8f, 0x03514616, 0x02562d33, 0x01a5590d, 0x00970440, 0x002ec2c1}}, Y: Field{[10]uint32{0x01955a35, 0x02a60b44, 0x0090a799, 0x013a4177, 0x02fe6704, 0x02ac6c14, 0x01d2fa17, 0x027d8d95, 0x005853af, 0x001019f9}}}, + {X: Field{[10]uint32{0x00a923b7, 0x03a1f62a, 0x01b30da1, 0x03bb6071, 0x02aef650, 0x020ce099, 0x00708ab6, 0x0269c150, 0x039b2199, 0x002b0ab2}}, Y: Field{[10]uint32{0x03cd20a6, 0x030492b5, 0x03a4fa2d, 0x02fc4b49, 0x0360b0d0, 0x004f67ac, 0x01afa0df, 0x01c93472, 0x028511c1, 0x001da110}}}, + {X: Field{[10]uint32{0x01dd32e6, 0x01d6e701, 0x01ee7e0e, 0x0146d4f9, 0x03c663b5, 0x01d697ef, 0x0249dbe0, 0x01e27a6d, 0x01554195, 0x00371690}}, Y: Field{[10]uint32{0x014a99b9, 0x01f6de9d, 0x01bcf80e, 0x0241db92, 0x002ff2ee, 0x006fd651, 0x00ea5e20, 0x019e9db7, 0x00a63f9f, 0x0012bcea}}}, + {X: Field{[10]uint32{0x022d8dae, 0x00f00632, 0x01ea9579, 0x03e47f49, 0x02ac32a5, 0x032c895b, 0x02b25ef9, 0x024be6e9, 0x00026211, 0x002209c7}}, Y: Field{[10]uint32{0x021e77d9, 0x009b03cf, 0x01099fb4, 0x01b71c5f, 0x00c30087, 0x016afd6b, 0x01c8b3ae, 0x01daa900, 0x01535071, 0x0035c677}}}, + {X: Field{[10]uint32{0x0144e7cb, 0x0116eb11, 0x020359ed, 0x0096d4a5, 0x01a10642, 0x004053a6, 0x03354a57, 0x00ee76f8, 0x01703987, 0x00055b86}}, Y: Field{[10]uint32{0x01250a37, 0x00e4b02b, 0x039cd6d5, 0x02357ad0, 0x009496d5, 0x00e0d2fa, 0x039572a6, 0x0241f6a4, 0x019f8f31, 0x001af023}}}, + {X: Field{[10]uint32{0x0089240f, 0x02eb7267, 0x03b858f5, 0x02ebe8b9, 0x0274f8c4, 0x01f8385d, 0x00ee0919, 0x01cce386, 0x010d652d, 0x00056e0e}}, Y: Field{[10]uint32{0x0326f04a, 0x03e7be38, 0x033352e2, 0x02ad7068, 0x01b30367, 0x01e967e6, 0x03dd7ccc, 0x023420ea, 0x020c8efe, 0x001e1b3c}}}, + {X: Field{[10]uint32{0x019853ca, 0x02f0a731, 0x03f54dbf, 0x01ae7c66, 0x0348e962, 0x0239c584, 0x00a76a22, 0x010e09af, 0x00cecb68, 0x00109a6f}}, Y: Field{[10]uint32{0x01b8d367, 0x0163bd4d, 0x028a3da9, 0x0297e796, 0x01fd3940, 0x010c6902, 0x0084ca9c, 0x005adc8f, 0x001a82c0, 0x003b4ac7}}}, + {X: Field{[10]uint32{0x0134ab83, 0x035d34a0, 0x03397721, 0x026bdd90, 0x00741b3f, 0x0259961a, 0x011770d8, 0x02df68af, 0x007d2de0, 0x002159cb}}, Y: Field{[10]uint32{0x010313a6, 0x00c253de, 0x00f44c8e, 0x03f314a6, 0x01e77f17, 0x0298b0b9, 0x034049bf, 0x02cbad8d, 0x039b5b43, 0x001f1206}}}, + }, + { + {X: Field{[10]uint32{0x0134ab83, 0x035d34a0, 0x03397721, 0x026bdd90, 0x00741b3f, 0x0259961a, 0x011770d8, 0x02df68af, 0x007d2de0, 0x002159cb}}, Y: Field{[10]uint32{0x010313a6, 0x00c253de, 0x00f44c8e, 0x03f314a6, 0x01e77f17, 0x0298b0b9, 0x034049bf, 0x02cbad8d, 0x039b5b43, 0x001f1206}}}, + {X: Field{[10]uint32{0x0317fc25, 0x02e42f07, 0x02d96998, 0x011b7cb9, 0x033b89ea, 0x01722987, 0x00186121, 0x027b00db, 0x036b740f, 0x0014d333}}, Y: Field{[10]uint32{0x03e86e76, 0x031fdbb3, 0x028ddd71, 0x01deff74, 0x010ae3d2, 0x00b550d5, 0x02ae3dd3, 0x00b76d18, 0x00b09c8b, 0x00355c57}}}, + {X: Field{[10]uint32{0x03ba9000, 0x001c8ea0, 0x028b6fdf, 0x0271a097, 0x01c4872f, 0x0210050f, 0x00876075, 0x036305a1, 0x00f9fff1, 0x002b0e1d}}, Y: Field{[10]uint32{0x0310cf0a, 0x00f1f65b, 0x029fa4da, 0x0035fd9b, 0x03085e35, 0x01045fe4, 0x022dde89, 0x0301a6e1, 0x012308a1, 0x002a997a}}}, + {X: Field{[10]uint32{0x00bee8b6, 0x01c248fa, 0x008d2c71, 0x011fb3ef, 0x0179020d, 0x023e2abb, 0x01e14201, 0x02dfcc20, 0x035cee87, 0x002a4747}}, Y: Field{[10]uint32{0x010644c1, 0x0345aa90, 0x03225003, 0x027d8a32, 0x02f80056, 0x0376b4ec, 0x03189c8d, 0x023b8569, 0x024ee2df, 0x001d228c}}}, + {X: Field{[10]uint32{0x0106dbd4, 0x001bd9bb, 0x00d081a6, 0x0215e288, 0x01ec0e3f, 0x0268f9ca, 0x0114075e, 0x01c04e6b, 0x00e7aa68, 0x0015c357}}, Y: Field{[10]uint32{0x011ed495, 0x016fb3af, 0x00bed5a6, 0x01b71918, 0x03b683a3, 0x007406ee, 0x0366e671, 0x000bd816, 0x0349420e, 0x0029ab94}}}, + {X: Field{[10]uint32{0x03ba402e, 0x0358c2c5, 0x02989ae5, 0x0170b410, 0x03c3b81a, 0x021238f0, 0x03ead0c4, 0x0280a962, 0x035cd18f, 0x0023a246}}, Y: Field{[10]uint32{0x00fad9e0, 0x02d89e71, 0x027ee8e1, 0x0090855e, 0x02af650c, 0x013ca8c1, 0x038d0e40, 0x0319a02c, 0x020e6a9e, 0x003974c3}}}, + {X: Field{[10]uint32{0x012d230e, 0x0307e482, 0x03928434, 0x02834a4c, 0x01daee32, 0x000d9bbd, 0x03c229ee, 0x022edbe1, 0x00702826, 0x001d6d7e}}, Y: Field{[10]uint32{0x011570b8, 0x032f7ef5, 0x038fb037, 0x02c01447, 0x020267a4, 0x01377ea3, 0x01787455, 0x02148d8f, 0x0221e3a7, 0x00149f33}}}, + {X: Field{[10]uint32{0x0184cf74, 0x02870956, 0x01f10aa1, 0x0116fbd8, 0x000735ae, 0x00b50e0f, 0x02214dde, 0x0238d706, 0x0023d90c, 0x00305723}}, Y: Field{[10]uint32{0x01ccb000, 0x0123360e, 0x015a2c4a, 0x00b542c0, 0x0247bf77, 0x0097f5ee, 0x01c6f45e, 0x0088d723, 0x00d82852, 0x000aea55}}}, + {X: Field{[10]uint32{0x034fcc0e, 0x01afdab0, 0x0084c47b, 0x0290af8e, 0x00927f10, 0x01f49672, 0x025b80e2, 0x037b0ac2, 0x02fae1ed, 0x00113f23}}, Y: Field{[10]uint32{0x019c420a, 0x03c0c79c, 0x0089d9cf, 0x0292f341, 0x03720e94, 0x020cf4f5, 0x01267e78, 0x004d9f92, 0x0294ba9b, 0x0034b1f7}}}, + {X: Field{[10]uint32{0x0142dea9, 0x004fc3a2, 0x03130584, 0x0232e2df, 0x02ab35a9, 0x0182a1ff, 0x006ad8ba, 0x0176d9e5, 0x02133428, 0x000559a1}}, Y: Field{[10]uint32{0x027be3df, 0x0151bc0d, 0x02dcbf92, 0x01a22c8f, 0x02de4828, 0x02c83f48, 0x02894eff, 0x03c14413, 0x03aa0e82, 0x0013cd65}}}, + {X: Field{[10]uint32{0x03b69991, 0x01207f22, 0x03175d5a, 0x028b0cc1, 0x01fffb3f, 0x0380bd4d, 0x02a16620, 0x01ef1a19, 0x0247bace, 0x0037a8ae}}, Y: Field{[10]uint32{0x016fe2df, 0x01d0aa7c, 0x019bc706, 0x02cd887b, 0x03229dcd, 0x013dee79, 0x01cbfec8, 0x00a392b1, 0x03d6d90c, 0x002b8a2f}}}, + {X: Field{[10]uint32{0x036bcfe8, 0x03b58794, 0x03bb3e61, 0x027b5a6d, 0x020e0c17, 0x001acc66, 0x02ca8f23, 0x02666d1c, 0x00bc1cc6, 0x0004ccbe}}, Y: Field{[10]uint32{0x02e78402, 0x00374b36, 0x0021451b, 0x009356a3, 0x01ba93b4, 0x017701a0, 0x0367c453, 0x00bb5c4f, 0x03ee2960, 0x0030e771}}}, + {X: Field{[10]uint32{0x014fc9cc, 0x01034094, 0x021658c2, 0x02f0a691, 0x0226d00a, 0x012e2a0d, 0x001cf6cc, 0x01a35bbf, 0x0098a6e1, 0x000e5a3f}}, Y: Field{[10]uint32{0x03ad37dd, 0x00e52257, 0x03334019, 0x01dbfe23, 0x011a1465, 0x02ab4cb2, 0x037982d1, 0x0164a048, 0x03d0db4b, 0x001e272e}}}, + {X: Field{[10]uint32{0x00cc84bf, 0x00ebcf85, 0x01f27c02, 0x01b7bae8, 0x0380bf1d, 0x030a9254, 0x00e37159, 0x00205a0c, 0x01364e54, 0x002d775a}}, Y: Field{[10]uint32{0x0374750c, 0x01485f38, 0x01a90c78, 0x037b75ac, 0x01353110, 0x01635051, 0x0118733c, 0x032dadaf, 0x005853c7, 0x0012cdbb}}}, + {X: Field{[10]uint32{0x020c85f1, 0x0308646b, 0x03a250ae, 0x014d80e8, 0x01a6a52e, 0x015e5175, 0x0325df09, 0x01a8a49a, 0x010698e0, 0x001a25a4}}, Y: Field{[10]uint32{0x01c1de21, 0x01208ccb, 0x003922c7, 0x02768354, 0x011f40c1, 0x021175cb, 0x03305c1d, 0x025e495b, 0x03b4b38c, 0x002bbf4f}}}, + {X: Field{[10]uint32{0x00c82a0a, 0x02566bd8, 0x00832ffd, 0x03183d9a, 0x010f9226, 0x006504ec, 0x006c9f19, 0x022291ac, 0x03809b19, 0x0002522f}}, Y: Field{[10]uint32{0x00c8e589, 0x02dfe236, 0x012bed4c, 0x002325f3, 0x006d4dff, 0x0070d063, 0x02b74c5d, 0x01991b71, 0x02856dcb, 0x0014e958}}}, + }, + { + {X: Field{[10]uint32{0x00c82a0a, 0x02566bd8, 0x00832ffd, 0x03183d9a, 0x010f9226, 0x006504ec, 0x006c9f19, 0x022291ac, 0x03809b19, 0x0002522f}}, Y: Field{[10]uint32{0x00c8e589, 0x02dfe236, 0x012bed4c, 0x002325f3, 0x006d4dff, 0x0070d063, 0x02b74c5d, 0x01991b71, 0x02856dcb, 0x0014e958}}}, + {X: Field{[10]uint32{0x028b000a, 0x03ac115f, 0x01e51396, 0x00cc7a09, 0x02ef16c1, 0x00a47c2d, 0x01ce4c66, 0x0164d835, 0x007f372e, 0x0009a54b}}, Y: Field{[10]uint32{0x01ef705a, 0x035007c1, 0x027318c3, 0x023d94f5, 0x02debe39, 0x035a2108, 0x03c893d2, 0x029a218a, 0x024c5800, 0x003d44fa}}}, + {X: Field{[10]uint32{0x00c8ac7f, 0x00bf97ee, 0x02a52728, 0x03b9978a, 0x01641242, 0x0015be12, 0x003396d2, 0x00aef2d7, 0x02fbe382, 0x0026516c}}, Y: Field{[10]uint32{0x01aea3b0, 0x0250e85a, 0x00dfa96d, 0x008fbb6b, 0x01282f7a, 0x02ca3bfd, 0x03db44ff, 0x00a0b581, 0x01824b0f, 0x000fbbfb}}}, + {X: Field{[10]uint32{0x02134f96, 0x0096225d, 0x030e9f10, 0x0195cb5a, 0x03f52119, 0x00c7fc90, 0x032be8b1, 0x0316f6fb, 0x00e6fc23, 0x00318b96}}, Y: Field{[10]uint32{0x014cf97e, 0x01dfb534, 0x01c3e822, 0x00d58dcc, 0x01bcfb85, 0x00c507f1, 0x03d67675, 0x02859e30, 0x027d45b1, 0x0010e5e0}}}, + {X: Field{[10]uint32{0x029e353a, 0x035e78e5, 0x021f6ed1, 0x00214aef, 0x0210a044, 0x0041f57f, 0x01f82227, 0x01c3988d, 0x006b2058, 0x000a8c53}}, Y: Field{[10]uint32{0x01746067, 0x0249b879, 0x018bfc25, 0x02ab6c99, 0x00138a54, 0x02ea86e8, 0x0063e476, 0x009eb069, 0x000bf35a, 0x0005692b}}}, + {X: Field{[10]uint32{0x02fccf64, 0x02926624, 0x0318e3ba, 0x03789604, 0x033bd278, 0x01f2576f, 0x028772c7, 0x018df6c1, 0x015c0eb4, 0x00031f44}}, Y: Field{[10]uint32{0x0078fee0, 0x01b4ecca, 0x0268d53f, 0x020e566b, 0x0148785d, 0x01e2bc51, 0x02424b84, 0x02c111ea, 0x007b1925, 0x0012aa1d}}}, + {X: Field{[10]uint32{0x01b84966, 0x00bd27ba, 0x03ff989e, 0x001b75fc, 0x011b4f41, 0x029adb24, 0x00b6faf3, 0x03f0b526, 0x0100b703, 0x00165669}}, Y: Field{[10]uint32{0x03473a6a, 0x0198c861, 0x0242640a, 0x030233f8, 0x009100dc, 0x03720a9c, 0x00312820, 0x02a25fe5, 0x02741f5c, 0x0000dc39}}}, + {X: Field{[10]uint32{0x03188cbb, 0x01be2002, 0x01e97368, 0x0080201f, 0x00b81c03, 0x005988ac, 0x003329a7, 0x0171d05a, 0x00520eec, 0x00041d18}}, Y: Field{[10]uint32{0x03272124, 0x01ed8d87, 0x03da601d, 0x01d23738, 0x01242e0d, 0x033d5284, 0x0326b9b9, 0x016630d4, 0x00c09a21, 0x002af975}}}, + {X: Field{[10]uint32{0x03c6b173, 0x0326e48a, 0x03feb3b0, 0x00f1fbb4, 0x017dd862, 0x0016d7e7, 0x0160c463, 0x00bfa384, 0x01393722, 0x0027bacc}}, Y: Field{[10]uint32{0x0323a71d, 0x02588365, 0x00c4b953, 0x02fb439c, 0x030ea71a, 0x02ee86b8, 0x02aabfdb, 0x03563654, 0x01e0110e, 0x0038487c}}}, + {X: Field{[10]uint32{0x02d2cf25, 0x03a6f24a, 0x03a94457, 0x0136f249, 0x037ba49b, 0x009ecf0b, 0x011e80ba, 0x02a72c63, 0x029bf3da, 0x00148366}}, Y: Field{[10]uint32{0x0285181f, 0x02db20e8, 0x030c7610, 0x019446fd, 0x022bab0b, 0x012ea5c1, 0x030ae71b, 0x007ab923, 0x009b1027, 0x003949bd}}}, + {X: Field{[10]uint32{0x02c805f3, 0x00910fdf, 0x01591577, 0x01d42766, 0x007de40f, 0x001ba5e2, 0x02bb2388, 0x0063d45b, 0x03e4c7f7, 0x000e7313}}, Y: Field{[10]uint32{0x023c48d3, 0x0068304e, 0x012e4d19, 0x00dcff24, 0x01bbb957, 0x03d0b79f, 0x01e6693c, 0x03e3cc54, 0x032c5a46, 0x003b2c51}}}, + {X: Field{[10]uint32{0x008d5622, 0x02baeb15, 0x03d2e8b5, 0x03bde946, 0x03e1db07, 0x02fcce06, 0x01586a81, 0x0254d68e, 0x011e6168, 0x0017f1b0}}, Y: Field{[10]uint32{0x01ac1683, 0x03610040, 0x03f300d0, 0x00239b1e, 0x030e05ad, 0x000d9eb2, 0x019ba2db, 0x03676e70, 0x02549aa1, 0x00043a03}}}, + {X: Field{[10]uint32{0x0222580e, 0x018bed73, 0x0388793d, 0x025b4b5b, 0x02c71328, 0x0136f534, 0x012ffde6, 0x0371a5a2, 0x007466ec, 0x003e5320}}, Y: Field{[10]uint32{0x0127db82, 0x0148fd9c, 0x01d4e81e, 0x0114c8dc, 0x029887ec, 0x02d6a07d, 0x014bff6a, 0x00896a46, 0x03dc6785, 0x0017a71f}}}, + {X: Field{[10]uint32{0x00a3d8a5, 0x02ad81f0, 0x02f99123, 0x01a115cf, 0x0126d77d, 0x00fb426b, 0x031274a3, 0x035ba4d0, 0x03e5d872, 0x0016a90c}}, Y: Field{[10]uint32{0x013c2ba7, 0x03dfbddb, 0x02ef4fb5, 0x03d4b675, 0x0116475c, 0x01ca2958, 0x02394aec, 0x039e6866, 0x01fc682a, 0x003773a8}}}, + {X: Field{[10]uint32{0x00c4f21f, 0x0102eb44, 0x01a7a6be, 0x0165340f, 0x025024a9, 0x02c66674, 0x0002068d, 0x03458bf3, 0x006c6ad5, 0x0023332e}}, Y: Field{[10]uint32{0x029dfea0, 0x0049ba9c, 0x03e28f7f, 0x02b20992, 0x014b92dc, 0x0321d629, 0x01bef549, 0x00710da6, 0x02586275, 0x0015fe25}}}, + {X: Field{[10]uint32{0x038fd8e8, 0x0336067c, 0x0352acce, 0x0137f1a5, 0x00f1b0e4, 0x000a1cea, 0x0067ce0f, 0x00070d3c, 0x027f4618, 0x00189833}}, Y: Field{[10]uint32{0x02b4ae17, 0x0213a56c, 0x00198c1a, 0x008e0147, 0x03ecd292, 0x01da87bd, 0x03090497, 0x02d5c69f, 0x002b6fa5, 0x002f0b6a}}}, + }, + { + {X: Field{[10]uint32{0x038fd8e8, 0x0336067c, 0x0352acce, 0x0137f1a5, 0x00f1b0e4, 0x000a1cea, 0x0067ce0f, 0x00070d3c, 0x027f4618, 0x00189833}}, Y: Field{[10]uint32{0x02b4ae17, 0x0213a56c, 0x00198c1a, 0x008e0147, 0x03ecd292, 0x01da87bd, 0x03090497, 0x02d5c69f, 0x002b6fa5, 0x002f0b6a}}}, + {X: Field{[10]uint32{0x01477c2d, 0x019d1bcf, 0x0127e076, 0x01465aab, 0x0316e65c, 0x0213c684, 0x008409be, 0x0069cf7b, 0x024748ad, 0x00217636}}, Y: Field{[10]uint32{0x03d1dd70, 0x02605bf1, 0x015a6207, 0x0080cf13, 0x0094b0a0, 0x007bf1ef, 0x02b53653, 0x019a4161, 0x0353665c, 0x00162522}}}, + {X: Field{[10]uint32{0x01136602, 0x02e91950, 0x03a5bbb0, 0x01203678, 0x0138c46f, 0x008ccecf, 0x0058937f, 0x037f0cf4, 0x03280482, 0x0021f449}}, Y: Field{[10]uint32{0x00af6aac, 0x020f1076, 0x03f7c4f6, 0x01d1bf4e, 0x0387a884, 0x03d9dd14, 0x02a276cf, 0x000f7a49, 0x00870a5a, 0x001c7389}}}, + {X: Field{[10]uint32{0x000b80d9, 0x000c4b5b, 0x007f0485, 0x00403f71, 0x024d1e7e, 0x030fb8fb, 0x00892e9c, 0x012e5a30, 0x0166e7ec, 0x00238a9c}}, Y: Field{[10]uint32{0x02b29f50, 0x0187cab5, 0x0349a49c, 0x02235c18, 0x005297b6, 0x005aa752, 0x02dd29b7, 0x02f964b3, 0x03a9ae2c, 0x003ab6c2}}}, + {X: Field{[10]uint32{0x00c5a916, 0x00175cd2, 0x010f25b2, 0x00354d58, 0x013f5c44, 0x02ad52a8, 0x00acc63d, 0x03a5d1ac, 0x013fe261, 0x003f575f}}, Y: Field{[10]uint32{0x02db8bda, 0x02cdec1e, 0x02faab14, 0x0052f73d, 0x03e5d738, 0x0271ed4b, 0x0343ca67, 0x016c1f4a, 0x02d0eeb5, 0x0003760f}}}, + {X: Field{[10]uint32{0x00e74459, 0x028d722c, 0x036dd674, 0x018e1f76, 0x01fef237, 0x004f22a4, 0x00f46587, 0x015a0164, 0x001d4ec0, 0x000a37de}}, Y: Field{[10]uint32{0x035e656f, 0x001f303b, 0x02f0a8de, 0x029406b9, 0x00a3795b, 0x003c89e5, 0x00db1789, 0x003c5f2c, 0x02a66a13, 0x003c5267}}}, + {X: Field{[10]uint32{0x01f7529c, 0x0264258d, 0x011dd45d, 0x0262d6f5, 0x0138765b, 0x034d10e0, 0x02453c32, 0x009848ae, 0x0010981c, 0x00378375}}, Y: Field{[10]uint32{0x00cd88fe, 0x008300b9, 0x0374063c, 0x031a226d, 0x00178924, 0x035e8d5c, 0x02109822, 0x00517e6c, 0x029d10a2, 0x0035c29b}}}, + {X: Field{[10]uint32{0x004561be, 0x007e8f4b, 0x0190f992, 0x03a04d67, 0x00ee4ab2, 0x01e3e254, 0x00366ecd, 0x03d63b72, 0x035842bf, 0x001da6f1}}, Y: Field{[10]uint32{0x00d9685f, 0x0082ffec, 0x033add59, 0x01d9ede1, 0x0341a177, 0x01cfd751, 0x01ce4cef, 0x020eeb23, 0x03362fe7, 0x0012fe05}}}, + {X: Field{[10]uint32{0x00f76d11, 0x00bd234e, 0x015573c8, 0x003efe14, 0x02151100, 0x0270a4a8, 0x005befc3, 0x03d139a7, 0x008ada4c, 0x002c9b08}}, Y: Field{[10]uint32{0x03b7356b, 0x03002c78, 0x0224bdc1, 0x01967609, 0x03050030, 0x0033590c, 0x004e87d9, 0x034cf3c3, 0x00820949, 0x0007c73e}}}, + {X: Field{[10]uint32{0x008e129e, 0x00e76825, 0x01b10312, 0x02cb00a2, 0x032bd1df, 0x0394f0b7, 0x00f8de28, 0x0133debc, 0x00efb7b2, 0x0019b8ff}}, Y: Field{[10]uint32{0x02e7bbea, 0x02f0d80b, 0x03b5172b, 0x027b4694, 0x035fd7d9, 0x0337e032, 0x00b5bf34, 0x0303d966, 0x034fb770, 0x00082fe2}}}, + {X: Field{[10]uint32{0x029e22db, 0x038ec199, 0x00933f94, 0x03d67e72, 0x02ac993f, 0x00630a53, 0x023bd290, 0x03d48e9f, 0x00b8fc7f, 0x003f3ac5}}, Y: Field{[10]uint32{0x002260a1, 0x01cb6c97, 0x03e4cbf5, 0x01e4e93a, 0x00ad550e, 0x0097c249, 0x018a5a75, 0x02e347f3, 0x033a40d6, 0x00192a9a}}}, + {X: Field{[10]uint32{0x01c71143, 0x0367714a, 0x017ea346, 0x02b113c1, 0x012e7ead, 0x0008fe8d, 0x027ccf90, 0x03a840f2, 0x039622bb, 0x0003ad17}}, Y: Field{[10]uint32{0x0370b136, 0x02336882, 0x01bf4c8a, 0x03a9a8ac, 0x03d65969, 0x00078a15, 0x03601f59, 0x02f43d5c, 0x03585838, 0x0014b10b}}}, + {X: Field{[10]uint32{0x038a2755, 0x02105e68, 0x005506f0, 0x01c59527, 0x0253721a, 0x02d41fea, 0x00175774, 0x0172b157, 0x02623ccd, 0x0013a426}}, Y: Field{[10]uint32{0x03cca3de, 0x02927d88, 0x0000caf7, 0x025348a6, 0x03b6cd53, 0x001d5676, 0x03246dd5, 0x00d6bb3b, 0x02878cce, 0x002b95b6}}}, + {X: Field{[10]uint32{0x0007d7c8, 0x0345234f, 0x0232f00c, 0x01d7e0a7, 0x01e0f196, 0x03cf5226, 0x0070411b, 0x02dcf5a1, 0x008ab230, 0x000f3e48}}, Y: Field{[10]uint32{0x024cee08, 0x02a476b6, 0x0059c0c4, 0x032356e3, 0x009d4684, 0x017059c8, 0x02ce6ca6, 0x02197547, 0x024c15af, 0x003780f1}}}, + {X: Field{[10]uint32{0x003ba64d, 0x01625666, 0x015a3a82, 0x01de2316, 0x02bde60f, 0x02e39038, 0x030a145e, 0x01300efe, 0x015c22e0, 0x0030d9d1}}, Y: Field{[10]uint32{0x022181fd, 0x03323e5a, 0x00f14614, 0x02b285de, 0x0342626a, 0x01365931, 0x00e0e6e8, 0x0180cc20, 0x02d069cb, 0x000e9482}}}, + {X: Field{[10]uint32{0x0037fa2d, 0x00f32348, 0x01c43295, 0x03d5d6ff, 0x03043ec8, 0x02efd040, 0x00348414, 0x036350f6, 0x01e0afc1, 0x003940df}}, Y: Field{[10]uint32{0x01755bda, 0x01772107, 0x01f10e0e, 0x000fb120, 0x01bd5f5b, 0x02e642f7, 0x0398d09f, 0x034ed7e7, 0x034baa94, 0x00115c54}}}, + }, + { + {X: Field{[10]uint32{0x0037fa2d, 0x00f32348, 0x01c43295, 0x03d5d6ff, 0x03043ec8, 0x02efd040, 0x00348414, 0x036350f6, 0x01e0afc1, 0x003940df}}, Y: Field{[10]uint32{0x01755bda, 0x01772107, 0x01f10e0e, 0x000fb120, 0x01bd5f5b, 0x02e642f7, 0x0398d09f, 0x034ed7e7, 0x034baa94, 0x00115c54}}}, + {X: Field{[10]uint32{0x023d34ef, 0x00f231e7, 0x02ddb8c6, 0x01f1e4a8, 0x02c3ab21, 0x00b586cf, 0x00b6cf7d, 0x015253d0, 0x01a467fd, 0x00297803}}, Y: Field{[10]uint32{0x037adb4c, 0x0171738b, 0x000acb85, 0x03f9e424, 0x025b60dc, 0x026fd0f4, 0x01726fe9, 0x02155508, 0x01f5e560, 0x000263f9}}}, + {X: Field{[10]uint32{0x037e7775, 0x02a29b85, 0x015f6388, 0x024e23b6, 0x02b5e155, 0x03d4a46b, 0x00543bac, 0x00cf3b96, 0x023aff96, 0x0027625a}}, Y: Field{[10]uint32{0x02056691, 0x03db4eae, 0x0253befc, 0x01fb8a64, 0x01e899cd, 0x0094249f, 0x02964ed7, 0x02fc2e53, 0x01e43f49, 0x0037646a}}}, + {X: Field{[10]uint32{0x03b91252, 0x00dc5835, 0x0172ae67, 0x00b911dd, 0x006d4afd, 0x0326fef1, 0x019f4bb1, 0x00ad00d4, 0x01f5ef3a, 0x002a6505}}, Y: Field{[10]uint32{0x03edc264, 0x00ddeb12, 0x00ddd73a, 0x02b5643d, 0x02899a16, 0x013dbdad, 0x022f10f2, 0x03e12ee7, 0x024cae81, 0x0020b439}}}, + {X: Field{[10]uint32{0x002a3293, 0x0381378f, 0x0076c5fd, 0x01bba40d, 0x015688b8, 0x00a0bd33, 0x02b0a573, 0x00de4b43, 0x00ee7116, 0x0020c9ee}}, Y: Field{[10]uint32{0x020df9bd, 0x02153863, 0x02a416bc, 0x02d3b8c9, 0x0096afda, 0x009e5c21, 0x03b3ea66, 0x02a63862, 0x02266ee0, 0x0001265f}}}, + {X: Field{[10]uint32{0x00904ed3, 0x015fc7a3, 0x01784159, 0x01624161, 0x00df2a74, 0x0049c8e1, 0x03f8e643, 0x00637fe5, 0x002d2db8, 0x000033e3}}, Y: Field{[10]uint32{0x016f77c1, 0x02658ede, 0x02827b00, 0x01e74cbd, 0x0122991d, 0x0146f604, 0x01d5c1bd, 0x03510467, 0x000ea781, 0x002aab40}}}, + {X: Field{[10]uint32{0x0162c042, 0x006c9b11, 0x03b1a242, 0x008d2e37, 0x02092d23, 0x03e6a3b5, 0x016661d8, 0x02c5a25f, 0x02aa2a6d, 0x0016b90a}}, Y: Field{[10]uint32{0x0379269c, 0x017337e3, 0x018dbf90, 0x025441f3, 0x0294e0db, 0x000e2752, 0x01c1ddc6, 0x00147aad, 0x027c05ff, 0x0026764e}}}, + {X: Field{[10]uint32{0x02540f17, 0x01196d9a, 0x0132bd8c, 0x01c17c30, 0x004c750d, 0x023e4d7e, 0x00edde09, 0x0347f1f6, 0x029f9e4f, 0x002d5bd3}}, Y: Field{[10]uint32{0x0200102d, 0x00bf2b80, 0x0285446a, 0x018f2f32, 0x0121d429, 0x00160b47, 0x01c11adf, 0x02a15b4f, 0x013429cc, 0x000cba39}}}, + {X: Field{[10]uint32{0x0285af61, 0x02204a17, 0x02766b34, 0x008b752b, 0x034e8ed7, 0x01b086c3, 0x02eb68ff, 0x0323ad66, 0x02e426a1, 0x0024b08e}}, Y: Field{[10]uint32{0x036a2b09, 0x008d9a70, 0x02fed4e7, 0x020ad8a1, 0x012d23ad, 0x01ce355e, 0x03217d5c, 0x006ed027, 0x008f0155, 0x0010533e}}}, + {X: Field{[10]uint32{0x01e5d1b3, 0x02a92096, 0x02a3e280, 0x0227f5b2, 0x0048c9b7, 0x003f36cc, 0x027e4c6f, 0x0120ef47, 0x0151caf6, 0x000eae94}}, Y: Field{[10]uint32{0x02f30087, 0x02d9e350, 0x02ee6a85, 0x01674b79, 0x01e18463, 0x01f5cb32, 0x024ec804, 0x01474241, 0x0223bff2, 0x0023079c}}}, + {X: Field{[10]uint32{0x03b5eba8, 0x02bc6cb1, 0x02a36ce2, 0x031fe463, 0x022dabed, 0x02be37d0, 0x010f4176, 0x037c4223, 0x008c76af, 0x003fb958}}, Y: Field{[10]uint32{0x010b9b5c, 0x00574da3, 0x014793f5, 0x010afe41, 0x02e380ff, 0x00a1f053, 0x01402f99, 0x0162bec4, 0x019134fe, 0x000e01d6}}}, + {X: Field{[10]uint32{0x00f8cffd, 0x02d66223, 0x01ae61b2, 0x0056de91, 0x01432e6b, 0x01e6f762, 0x01afb88f, 0x02306f51, 0x037f1fe7, 0x00002026}}, Y: Field{[10]uint32{0x01b5f32f, 0x03516863, 0x01f93d91, 0x03eb64ae, 0x0112a340, 0x0394bf72, 0x008c836d, 0x02a18c0a, 0x0022bf41, 0x003e05f8}}}, + {X: Field{[10]uint32{0x0063caf4, 0x00ee92cf, 0x03d5281e, 0x02aca3d4, 0x00a28ff3, 0x018a9abf, 0x02113b4c, 0x019f9882, 0x00eb92e6, 0x0010b951}}, Y: Field{[10]uint32{0x029c29c8, 0x02bb0265, 0x005f1187, 0x01edafbf, 0x0073a50e, 0x01d0579e, 0x01f220c1, 0x0319c7dc, 0x00e0f91c, 0x0027fe15}}}, + {X: Field{[10]uint32{0x03ed9ef9, 0x006417bd, 0x0063d6c6, 0x02803bc3, 0x02ad2ba5, 0x01ff064a, 0x01f78494, 0x03529d07, 0x02ddd352, 0x000cb779}}, Y: Field{[10]uint32{0x031fb871, 0x02e11a00, 0x034b21ab, 0x00de7263, 0x0059ec1b, 0x0356307d, 0x036a4f94, 0x019ef388, 0x03dc3420, 0x0010745e}}}, + {X: Field{[10]uint32{0x020f09a1, 0x00af6617, 0x0328380a, 0x03c6e500, 0x02f0a109, 0x011c03bf, 0x0196ed2a, 0x00b38e0e, 0x03b66553, 0x001ebb60}}, Y: Field{[10]uint32{0x01857d73, 0x036337a1, 0x00a54045, 0x00c03cfd, 0x02d88b2f, 0x0040cb63, 0x01afd0ab, 0x03bdf1f7, 0x005f9a31, 0x003d6e15}}}, + {X: Field{[10]uint32{0x00fce725, 0x019a82b9, 0x005b7258, 0x03471a9b, 0x00e7e8db, 0x03c5dc6d, 0x02a905e8, 0x001eb7d7, 0x02b0f4a2, 0x003818dc}}, Y: Field{[10]uint32{0x02ee31dd, 0x000d3e53, 0x00870b27, 0x01de1c41, 0x00d7484a, 0x03569223, 0x0227bb2a, 0x0233f84a, 0x0174bce1, 0x001ea422}}}, + }, + { + {X: Field{[10]uint32{0x00fce725, 0x019a82b9, 0x005b7258, 0x03471a9b, 0x00e7e8db, 0x03c5dc6d, 0x02a905e8, 0x001eb7d7, 0x02b0f4a2, 0x003818dc}}, Y: Field{[10]uint32{0x02ee31dd, 0x000d3e53, 0x00870b27, 0x01de1c41, 0x00d7484a, 0x03569223, 0x0227bb2a, 0x0233f84a, 0x0174bce1, 0x001ea422}}}, + {X: Field{[10]uint32{0x02d2ff3e, 0x026bb90f, 0x02d3cfe0, 0x036d3b1b, 0x00045ebf, 0x03eb4fcf, 0x00dbd304, 0x01ae3e72, 0x034ca204, 0x0003ab04}}, Y: Field{[10]uint32{0x01210988, 0x0081881f, 0x01376e17, 0x025adfc8, 0x01ac19f6, 0x00ac45e6, 0x03f103bf, 0x026d0916, 0x01be7935, 0x001258c3}}}, + {X: Field{[10]uint32{0x02328d6a, 0x02a06236, 0x0018bdba, 0x00ea56b7, 0x03b24d77, 0x016c23e9, 0x00689918, 0x0138028d, 0x005ba623, 0x003198f0}}, Y: Field{[10]uint32{0x02c9b8c0, 0x002edaaf, 0x039cc23b, 0x03a944af, 0x03dd8551, 0x01d5c4c5, 0x01afdcf2, 0x0070e34e, 0x018d5f72, 0x000ccc7a}}}, + {X: Field{[10]uint32{0x03bfa4dc, 0x01c1b937, 0x01b17476, 0x01e01321, 0x03f5948a, 0x02b6ed07, 0x012119d7, 0x03a8660e, 0x0190731f, 0x00359e21}}, Y: Field{[10]uint32{0x013b5406, 0x02f35aef, 0x0207cca7, 0x03137726, 0x026206f1, 0x008704ea, 0x00ef5c6d, 0x018f1250, 0x00c89d50, 0x000a3aaa}}}, + {X: Field{[10]uint32{0x0196de2f, 0x0072120e, 0x01114bc9, 0x00bb82c9, 0x0177cedf, 0x0283f93a, 0x02b30dee, 0x01a91673, 0x0282dfb8, 0x0034ff09}}, Y: Field{[10]uint32{0x00526f8c, 0x02489075, 0x03f168c4, 0x02637dea, 0x024e59b4, 0x013de076, 0x00b4754d, 0x002863da, 0x0399a45f, 0x00313c37}}}, + {X: Field{[10]uint32{0x02143fb0, 0x00d69958, 0x005dd6dc, 0x020c2f08, 0x03a9fb92, 0x011e6565, 0x03aff339, 0x020de433, 0x001c33af, 0x000a4ab7}}, Y: Field{[10]uint32{0x036ad01c, 0x036d8f38, 0x01d4d8a9, 0x00b5cd7a, 0x02d83e66, 0x03313b3d, 0x031968a0, 0x02d91fcf, 0x021bcee0, 0x00281c99}}}, + {X: Field{[10]uint32{0x03e697ea, 0x03123440, 0x003e85c6, 0x03ee617e, 0x019ce678, 0x028feaf4, 0x00a1fec9, 0x03008df7, 0x0343feb2, 0x00305e92}}, Y: Field{[10]uint32{0x02dc6c87, 0x00ee1f77, 0x002ab0ee, 0x02d5fe7c, 0x0296e1a1, 0x025807eb, 0x02178f71, 0x0165532b, 0x002d55ab, 0x000e4d57}}}, + {X: Field{[10]uint32{0x008ff9b3, 0x017ed039, 0x0301a727, 0x00815666, 0x03c7b1a6, 0x00adc752, 0x03f210f1, 0x01025d2a, 0x00cbd9a0, 0x001a4c3f}}, Y: Field{[10]uint32{0x02e96a4e, 0x036ad7e3, 0x0051acfd, 0x004f92b3, 0x00090f9b, 0x01d7db5e, 0x030fcdb8, 0x0007ab68, 0x0294b947, 0x001fc0ab}}}, + {X: Field{[10]uint32{0x0163da1b, 0x00b0c08c, 0x0231182d, 0x03983e4e, 0x029a0ede, 0x03f047f7, 0x009349d7, 0x0242d1a3, 0x037ca267, 0x0023d862}}, Y: Field{[10]uint32{0x03bdd76e, 0x00c48440, 0x036e7c7f, 0x01a8c926, 0x026450c6, 0x01eb1690, 0x03bda74d, 0x03adbad7, 0x0325f08b, 0x001e08cf}}}, + {X: Field{[10]uint32{0x010cec10, 0x02c26d53, 0x016b084f, 0x03f2ab7b, 0x02ba25f0, 0x00b4f39c, 0x02b0e61b, 0x0079a6ba, 0x029ca332, 0x0013654a}}, Y: Field{[10]uint32{0x03d06932, 0x00dac4ee, 0x014da8ee, 0x037f213d, 0x02ba4aa2, 0x01ed72d3, 0x002aec78, 0x009e7915, 0x004a66dd, 0x002c5e06}}}, + {X: Field{[10]uint32{0x02c8ae90, 0x01643f83, 0x005deee8, 0x024ba2ef, 0x00cfb26b, 0x0320fc6e, 0x02d5b8da, 0x0079bae1, 0x00f15b7a, 0x0025e630}}, Y: Field{[10]uint32{0x012844d3, 0x02b0bab9, 0x008e27a9, 0x016f40c6, 0x02e2e496, 0x03e71cef, 0x02ec9494, 0x00bb4f74, 0x02aa75a4, 0x002e9038}}}, + {X: Field{[10]uint32{0x00b90e0b, 0x03079b0c, 0x00a4589e, 0x00e7ec25, 0x03d6ff1d, 0x02719d6c, 0x01c804a5, 0x019f4ffb, 0x03f9ad54, 0x00290d41}}, Y: Field{[10]uint32{0x021fdc20, 0x0002e64e, 0x01b5a3f0, 0x00d94d66, 0x00dc2a20, 0x0102fa30, 0x02d07ccb, 0x035c6850, 0x01c94c3f, 0x001f23cb}}}, + {X: Field{[10]uint32{0x01d66b7f, 0x0065e3c4, 0x01c8105a, 0x0141461f, 0x017aa692, 0x0224a11d, 0x00f1b90b, 0x00b59d1f, 0x02e3fb5a, 0x003f7e9b}}, Y: Field{[10]uint32{0x00e5178b, 0x023e019e, 0x00de9daa, 0x03744f5e, 0x00d846f9, 0x00f68631, 0x000c1c9a, 0x02636e4f, 0x031e2249, 0x0013673c}}}, + {X: Field{[10]uint32{0x01c0d7ad, 0x01ad6196, 0x0093ab83, 0x036de8ad, 0x011ddb64, 0x01d2799c, 0x0211ca1a, 0x03eeebbf, 0x02cd4b7b, 0x001cac13}}, Y: Field{[10]uint32{0x0323cd97, 0x039bfd19, 0x034fb2ef, 0x01a0771b, 0x0196265d, 0x0364d340, 0x01d452d6, 0x028d633b, 0x03ea0e64, 0x001a196c}}}, + {X: Field{[10]uint32{0x0265bcf0, 0x01d5e124, 0x03d30b80, 0x01e10471, 0x0269ce2b, 0x0073c883, 0x01ea9a46, 0x02790eb7, 0x0238de22, 0x003f5633}}, Y: Field{[10]uint32{0x03996292, 0x039ea73a, 0x00d1df33, 0x03f8a3c7, 0x0387261b, 0x0121793e, 0x0382ab9a, 0x00856f54, 0x01e53763, 0x003ff829}}}, + {X: Field{[10]uint32{0x00559754, 0x035a4234, 0x0358540a, 0x03778a8f, 0x0204b10b, 0x03033808, 0x010bbf9d, 0x03514d63, 0x02715cd5, 0x00084f1e}}, Y: Field{[10]uint32{0x00b458f2, 0x00b09d4d, 0x03eeddff, 0x03d7cda9, 0x00bb4850, 0x0116e864, 0x013ad062, 0x018941c0, 0x010b5ae4, 0x0012db6b}}}, + }, + { + {X: Field{[10]uint32{0x00559754, 0x035a4234, 0x0358540a, 0x03778a8f, 0x0204b10b, 0x03033808, 0x010bbf9d, 0x03514d63, 0x02715cd5, 0x00084f1e}}, Y: Field{[10]uint32{0x00b458f2, 0x00b09d4d, 0x03eeddff, 0x03d7cda9, 0x00bb4850, 0x0116e864, 0x013ad062, 0x018941c0, 0x010b5ae4, 0x0012db6b}}}, + {X: Field{[10]uint32{0x02c87fac, 0x00e25783, 0x03cf0899, 0x01d188b9, 0x020d1ab9, 0x00c8d203, 0x02e9fed8, 0x0269fd9a, 0x008132b4, 0x00071795}}, Y: Field{[10]uint32{0x03c2d4ef, 0x035ecf57, 0x0324c555, 0x03ac9bf8, 0x03a3deac, 0x03530ab4, 0x03959fa1, 0x011a3cae, 0x020f837f, 0x0013ff3d}}}, + {X: Field{[10]uint32{0x0205dccc, 0x03600467, 0x0293e532, 0x03b53066, 0x02ae3fa3, 0x0254f45c, 0x006e096b, 0x0280c255, 0x02e1753d, 0x002e33bd}}, Y: Field{[10]uint32{0x006d5750, 0x012833f3, 0x02813301, 0x030da9ad, 0x01df757f, 0x0134af66, 0x00d4a74e, 0x026efda9, 0x0260a6cc, 0x000c0ae2}}}, + {X: Field{[10]uint32{0x00531dbc, 0x03f2e875, 0x00970e20, 0x0067fb57, 0x021f901c, 0x002ef1f3, 0x036e9421, 0x019a377b, 0x010602c5, 0x001189db}}, Y: Field{[10]uint32{0x0286b8e2, 0x01cc0265, 0x03c99af8, 0x03efff86, 0x01498bad, 0x01c37b66, 0x02922875, 0x01d6e128, 0x0324d44c, 0x000383df}}}, + {X: Field{[10]uint32{0x033bb31a, 0x037fb84d, 0x017b485b, 0x01ad7f6e, 0x01701f7b, 0x03aed7d2, 0x02a0bde2, 0x01ce1780, 0x03e779b4, 0x0000fecc}}, Y: Field{[10]uint32{0x01215c9e, 0x032f9a5f, 0x000d4e34, 0x01db11d9, 0x03c65a7c, 0x02eed5ca, 0x00c161aa, 0x03f8a078, 0x0152548e, 0x003cdab6}}}, + {X: Field{[10]uint32{0x006df50d, 0x03bb405a, 0x012bd0c4, 0x00a871be, 0x00cd5e79, 0x03020818, 0x03d87442, 0x007c0b5b, 0x0230935c, 0x000e95c5}}, Y: Field{[10]uint32{0x0059679b, 0x0162ca3a, 0x01a11d21, 0x007aede0, 0x01e0aaf8, 0x015c2837, 0x02f3ff2e, 0x03ccbd45, 0x0073b599, 0x0021784e}}}, + {X: Field{[10]uint32{0x019a4ab4, 0x01457af7, 0x037c0a5b, 0x0306156e, 0x02717c36, 0x0343de8d, 0x0316f7b4, 0x00f84587, 0x00d109ec, 0x0012c5df}}, Y: Field{[10]uint32{0x035ab6f7, 0x0377f918, 0x01f558aa, 0x0157c5d0, 0x006e37e2, 0x00d89ad2, 0x028f6729, 0x03e997f6, 0x02e9a5e2, 0x000fb259}}}, + {X: Field{[10]uint32{0x022f001d, 0x013bc4d4, 0x01899611, 0x02b371e3, 0x036850e0, 0x030c6458, 0x025eb211, 0x03093d39, 0x00eca7a6, 0x003bfa9a}}, Y: Field{[10]uint32{0x03bc4415, 0x021067dc, 0x00771c12, 0x027ece12, 0x03e41395, 0x00dc6685, 0x0150307a, 0x00f05368, 0x03869d58, 0x002aae11}}}, + {X: Field{[10]uint32{0x001c23a4, 0x01beca6c, 0x01cf56f4, 0x01611e92, 0x01c22a41, 0x026e735d, 0x0203829b, 0x01e81b0a, 0x035206a2, 0x0017a1c0}}, Y: Field{[10]uint32{0x00d986f9, 0x01e65ac4, 0x00fda121, 0x021d2933, 0x01a2171d, 0x038b1b8b, 0x01755d1a, 0x0248879c, 0x004efb9c, 0x0016e599}}}, + {X: Field{[10]uint32{0x0291dc6e, 0x007bc8b0, 0x01fbd8b4, 0x02a537ca, 0x02661fa8, 0x028f8e3c, 0x03136c23, 0x016c9171, 0x0347a3f1, 0x0033c2f7}}, Y: Field{[10]uint32{0x037a8196, 0x00f05136, 0x032a99c7, 0x03f4aed7, 0x02b4fc6c, 0x015e463d, 0x00523b4e, 0x03d44693, 0x001c6e61, 0x000e30b8}}}, + {X: Field{[10]uint32{0x007b0c66, 0x03cd7480, 0x006fb1f3, 0x039195b2, 0x0034a7fe, 0x002b3add, 0x032244f6, 0x01a02911, 0x0301930d, 0x00395170}}, Y: Field{[10]uint32{0x01f2d470, 0x03d5f49c, 0x0239dd87, 0x02386d68, 0x0397e582, 0x02566f2f, 0x01c6fda3, 0x025579f9, 0x000e8c62, 0x00381a8d}}}, + {X: Field{[10]uint32{0x008f7e09, 0x028ad9fe, 0x012cde2a, 0x01e6e9f6, 0x02b3a037, 0x0117702f, 0x00e12e5a, 0x017f2ef6, 0x023d4f20, 0x00179aa1}}, Y: Field{[10]uint32{0x00dfca97, 0x018a19d2, 0x00fe3bbd, 0x00dc8ed3, 0x00a68e50, 0x01a5008d, 0x004a8d1f, 0x023b7f11, 0x02078a38, 0x003095c6}}}, + {X: Field{[10]uint32{0x03648bba, 0x020642e0, 0x007444a5, 0x02c1a70f, 0x0082a0f0, 0x03c06ce6, 0x033ee225, 0x03d60284, 0x02157a54, 0x002ca910}}, Y: Field{[10]uint32{0x00fb6452, 0x03ead280, 0x017bb246, 0x00547270, 0x01c0d855, 0x03ef5f8c, 0x01fbc978, 0x0199867a, 0x03c2b693, 0x003f93d7}}}, + {X: Field{[10]uint32{0x0304ab91, 0x039d78ac, 0x01557679, 0x00650914, 0x0325a40c, 0x02de0470, 0x02383063, 0x00452e29, 0x03ea8fe5, 0x0001e87f}}, Y: Field{[10]uint32{0x0397e554, 0x03d18ed9, 0x01d9d35a, 0x03a86402, 0x01287e5d, 0x00d12965, 0x010437c4, 0x01f151a4, 0x0021b0fd, 0x00384301}}}, + {X: Field{[10]uint32{0x03ab27d0, 0x03748bba, 0x0103fcf6, 0x03e8b114, 0x03f70b41, 0x02365c01, 0x02970191, 0x00e1946e, 0x020f3d45, 0x0006e423}}, Y: Field{[10]uint32{0x00d3d110, 0x0219d790, 0x011b571e, 0x024d61f9, 0x02b5bbca, 0x005f12e6, 0x0357c918, 0x01ad79bc, 0x025eec46, 0x0026db58}}}, + {X: Field{[10]uint32{0x00fbd53c, 0x030e8ec2, 0x02cddf0c, 0x01c2b718, 0x03e2838c, 0x015066a1, 0x03b9352a, 0x02cd3a36, 0x032a7af4, 0x00139f09}}, Y: Field{[10]uint32{0x03dcaae6, 0x00e50605, 0x01d33e0b, 0x0052ffdf, 0x03530b96, 0x037bda06, 0x02fd09f6, 0x002c6385, 0x00766c9d, 0x0005dd27}}}, + }, + { + {X: Field{[10]uint32{0x00fbd53c, 0x030e8ec2, 0x02cddf0c, 0x01c2b718, 0x03e2838c, 0x015066a1, 0x03b9352a, 0x02cd3a36, 0x032a7af4, 0x00139f09}}, Y: Field{[10]uint32{0x03dcaae6, 0x00e50605, 0x01d33e0b, 0x0052ffdf, 0x03530b96, 0x037bda06, 0x02fd09f6, 0x002c6385, 0x00766c9d, 0x0005dd27}}}, + {X: Field{[10]uint32{0x006e1b4d, 0x00879b9f, 0x00790e28, 0x01686fbe, 0x009b11f2, 0x038e1767, 0x00a269f4, 0x02223c9a, 0x03b02696, 0x00226405}}, Y: Field{[10]uint32{0x0014ab2b, 0x02baf6b6, 0x03212009, 0x0303e4ca, 0x02e4e51b, 0x018d62fe, 0x00579833, 0x00d3c2ed, 0x00dab5b3, 0x0010eb8b}}}, + {X: Field{[10]uint32{0x0121b3ff, 0x02611939, 0x0350cee2, 0x005fa6a9, 0x01233c07, 0x026b8929, 0x0244d2be, 0x011571d7, 0x023010c9, 0x00009213}}, Y: Field{[10]uint32{0x0269da7e, 0x02b92e40, 0x008bbcc1, 0x037a48eb, 0x03ad7006, 0x02cb43ba, 0x02c2b3c2, 0x038c341f, 0x00a0aa23, 0x00258674}}}, + {X: Field{[10]uint32{0x025f712f, 0x018d685f, 0x003a8af2, 0x02fe46d6, 0x022831f5, 0x00c89fc3, 0x034728e6, 0x017f52a3, 0x00f76e90, 0x0019fd91}}, Y: Field{[10]uint32{0x007160e5, 0x02b2d79c, 0x02198d68, 0x0223df4d, 0x005e0e14, 0x0161b3de, 0x01adeb7b, 0x017413c1, 0x028f6644, 0x002e0cf5}}}, + {X: Field{[10]uint32{0x004ba7b9, 0x02de7ea0, 0x01751f96, 0x01c0c1d0, 0x0220d6a4, 0x01cb2553, 0x039b70d6, 0x03395fbd, 0x0126cfb6, 0x0005b071}}, Y: Field{[10]uint32{0x005bd741, 0x02f8e947, 0x029cc475, 0x0006f726, 0x02ec755c, 0x0322a537, 0x02627459, 0x0050e418, 0x037c3403, 0x0036c55f}}}, + {X: Field{[10]uint32{0x00692fd1, 0x01825850, 0x00dfe2b2, 0x01b32f64, 0x02dcf43c, 0x02c7c643, 0x00aadef4, 0x03fe0038, 0x00b49901, 0x001394f2}}, Y: Field{[10]uint32{0x028625e0, 0x024c39cc, 0x01753934, 0x03695ff2, 0x01a87a50, 0x01c86768, 0x02cd709a, 0x02807861, 0x024f4d41, 0x00375b8f}}}, + {X: Field{[10]uint32{0x036683fa, 0x01921ea8, 0x00825e83, 0x014e03b0, 0x0295821b, 0x01149ed9, 0x0289ce77, 0x00c6be1e, 0x00d753f9, 0x0000e5cf}}, Y: Field{[10]uint32{0x034a577f, 0x03ecaddf, 0x001dedf5, 0x03863fa6, 0x00d77884, 0x00ad689b, 0x03e12b63, 0x028e8d90, 0x022cc30c, 0x000e33d6}}}, + {X: Field{[10]uint32{0x0389a762, 0x0098fb4e, 0x02b8dc10, 0x00c04bb9, 0x02930dc9, 0x01a2d1c4, 0x000a0549, 0x009557ea, 0x036c9365, 0x000c9fe1}}, Y: Field{[10]uint32{0x01203301, 0x03f6566e, 0x03dfe9c9, 0x01c3faf5, 0x01755350, 0x038665ee, 0x01969255, 0x01009ac2, 0x00eab352, 0x002cb501}}}, + {X: Field{[10]uint32{0x00bf6f06, 0x02ce6670, 0x03b57180, 0x00c89410, 0x01713c13, 0x000815d9, 0x02c04f4b, 0x03c54470, 0x03ba72ec, 0x002e9aa6}}, Y: Field{[10]uint32{0x001db551, 0x02fbdc1e, 0x03aafe32, 0x03deb1a5, 0x029e5d14, 0x01562f63, 0x0020bf2e, 0x0046c0c8, 0x0238b34a, 0x0004ddc7}}}, + {X: Field{[10]uint32{0x01637b39, 0x03c46655, 0x01fa2799, 0x02617b1d, 0x026c52b9, 0x0300c05a, 0x015b9286, 0x02b1730f, 0x01da6b99, 0x00033cf1}}, Y: Field{[10]uint32{0x02852a40, 0x01e8f5e8, 0x01c3cd24, 0x00148f09, 0x0137acd3, 0x00600929, 0x00671adc, 0x026d904d, 0x012fd9f3, 0x0000b3ed}}}, + {X: Field{[10]uint32{0x01231a43, 0x03be7c1c, 0x003b9fd1, 0x035996b5, 0x0344d514, 0x0137910b, 0x02ed9506, 0x01374b62, 0x00cc27cc, 0x000d716f}}, Y: Field{[10]uint32{0x0220c8f6, 0x01cb9145, 0x030ae7db, 0x033018f3, 0x014cf7a4, 0x01be9627, 0x00e5820b, 0x011b39cd, 0x01723b97, 0x00038d9d}}}, + {X: Field{[10]uint32{0x0149827b, 0x038d5f6d, 0x03d6148c, 0x03cf8486, 0x01fcc4f7, 0x038b38c4, 0x0212e06d, 0x01d7cea0, 0x00f5e0d3, 0x003391f4}}, Y: Field{[10]uint32{0x03aed097, 0x032697fb, 0x029df43c, 0x00bfc15d, 0x0329e659, 0x016e6b43, 0x009139fe, 0x00352756, 0x00fb9963, 0x000571a6}}}, + {X: Field{[10]uint32{0x01d40609, 0x002f15bf, 0x00d76bf4, 0x02603607, 0x02c74190, 0x01620d5a, 0x022f12fc, 0x021af284, 0x00245c55, 0x003f51e7}}, Y: Field{[10]uint32{0x0264ca53, 0x00bc4d9a, 0x024739de, 0x035c9872, 0x019113ae, 0x0326107f, 0x00ad7a43, 0x02bfbfcb, 0x03b52694, 0x000c1a73}}}, + {X: Field{[10]uint32{0x0148be00, 0x03f9c55f, 0x03e13b38, 0x03a85a63, 0x03f60682, 0x03e550f1, 0x030e2207, 0x010bcd3a, 0x00bd4a8e, 0x0024c6fe}}, Y: Field{[10]uint32{0x0344f452, 0x01aa44c7, 0x01df5158, 0x01aacccf, 0x026a43ee, 0x00503afb, 0x03388e61, 0x00820f46, 0x03f0489c, 0x003c454e}}}, + {X: Field{[10]uint32{0x03799a7f, 0x01c0bd4a, 0x028424db, 0x03354ee3, 0x004f18b6, 0x03cb1f55, 0x02d8eb9a, 0x036192f7, 0x002a3acc, 0x001b1000}}, Y: Field{[10]uint32{0x03c81e32, 0x03320b34, 0x003f68b5, 0x01320812, 0x01c07abd, 0x0387772f, 0x00b836a0, 0x00d6f9a4, 0x001530b6, 0x002570b7}}}, + {X: Field{[10]uint32{0x00fb27b6, 0x009f8a10, 0x00576324, 0x02caf90c, 0x01c76e3d, 0x005a1aa9, 0x03238ad6, 0x022c6c43, 0x023dbe77, 0x003fa9d3}}, Y: Field{[10]uint32{0x023cb96f, 0x034f6dfc, 0x03b77701, 0x01ae5cfd, 0x03126b59, 0x032dabe4, 0x03674dec, 0x004ca5f3, 0x00db9b0b, 0x001b815a}}}, + }, + { + {X: Field{[10]uint32{0x00fb27b6, 0x009f8a10, 0x00576324, 0x02caf90c, 0x01c76e3d, 0x005a1aa9, 0x03238ad6, 0x022c6c43, 0x023dbe77, 0x003fa9d3}}, Y: Field{[10]uint32{0x023cb96f, 0x034f6dfc, 0x03b77701, 0x01ae5cfd, 0x03126b59, 0x032dabe4, 0x03674dec, 0x004ca5f3, 0x00db9b0b, 0x001b815a}}}, + {X: Field{[10]uint32{0x039756e4, 0x025f2587, 0x030488fd, 0x039778dc, 0x02bb570e, 0x003a3343, 0x00e03d85, 0x0203fc60, 0x01c83042, 0x003b6510}}, Y: Field{[10]uint32{0x033abfae, 0x03827e4f, 0x0298bff0, 0x01d3f937, 0x0209f237, 0x02c4e447, 0x02176128, 0x03e866be, 0x029efe8b, 0x000f6fa7}}}, + {X: Field{[10]uint32{0x02889756, 0x0206ba6f, 0x00bb25dd, 0x0265ec01, 0x03f27b64, 0x01c6267c, 0x02cd97b2, 0x03faa089, 0x03c33211, 0x001d8ba2}}, Y: Field{[10]uint32{0x00a6b774, 0x0096781f, 0x03a5e25e, 0x00c52213, 0x031972db, 0x0260b8d1, 0x03cc4f14, 0x03a5f0f1, 0x00260af3, 0x00300a25}}}, + {X: Field{[10]uint32{0x011cf119, 0x02b40cf5, 0x00d3015b, 0x03613ead, 0x015b10bd, 0x012d21d4, 0x03ed3f62, 0x01f0ff27, 0x018ee67a, 0x000a765a}}, Y: Field{[10]uint32{0x01056339, 0x021d015d, 0x002963c8, 0x003a4e9f, 0x03b89c94, 0x013c725b, 0x03a12540, 0x00ad149d, 0x00517dc8, 0x001ff40b}}}, + {X: Field{[10]uint32{0x0175d2ea, 0x01d7a5c2, 0x028ea26f, 0x03e84053, 0x011e52ac, 0x00c23d2a, 0x019bdbb2, 0x0254d238, 0x0147df60, 0x0037c1df}}, Y: Field{[10]uint32{0x01936f95, 0x030b678c, 0x01277aa3, 0x02e13ef7, 0x008a1ec5, 0x0228949f, 0x008425c9, 0x01fd1093, 0x028800ef, 0x003e185e}}}, + {X: Field{[10]uint32{0x02714560, 0x01602969, 0x006c2875, 0x0009f95b, 0x00247f21, 0x00696a17, 0x007ef64f, 0x034dae75, 0x0275579a, 0x000e2e0a}}, Y: Field{[10]uint32{0x0374299e, 0x021ccd29, 0x02284ada, 0x00efbdc5, 0x017d94f2, 0x00590d16, 0x03f56346, 0x007bd0a2, 0x02976f26, 0x003e7629}}}, + {X: Field{[10]uint32{0x004c92d7, 0x01247eef, 0x011b45b8, 0x01bb950e, 0x0135db4d, 0x00d2c50a, 0x017dea83, 0x03680cb8, 0x01758bd3, 0x0027cf9f}}, Y: Field{[10]uint32{0x014906dd, 0x02eff3ec, 0x021186cb, 0x000f5a53, 0x02452a23, 0x02eac540, 0x0062b21c, 0x0119ad62, 0x001ea77d, 0x003b34a1}}}, + {X: Field{[10]uint32{0x03422491, 0x031114df, 0x00cff467, 0x012a1818, 0x01fd453e, 0x00d6028c, 0x03fb7bd3, 0x024db5bc, 0x03d05013, 0x00049ad5}}, Y: Field{[10]uint32{0x01a3ef84, 0x00c7c667, 0x01347afa, 0x030c2fce, 0x00e148ba, 0x00afcfec, 0x004a3eba, 0x018b0b8f, 0x00130616, 0x003069f7}}}, + {X: Field{[10]uint32{0x02a8c483, 0x0035ccac, 0x00ac35ae, 0x02231410, 0x01174b0c, 0x03be54a0, 0x038c3d22, 0x033e7b70, 0x015d7b5c, 0x0028331e}}, Y: Field{[10]uint32{0x02cc6ba9, 0x019d1564, 0x03605509, 0x006f7da4, 0x006b348f, 0x008c77de, 0x0374fc97, 0x021cfb88, 0x0122f8b3, 0x002af0c0}}}, + {X: Field{[10]uint32{0x02faf403, 0x01588e8e, 0x03576051, 0x03ee5eb5, 0x0338a0ae, 0x02282d6f, 0x00faffac, 0x007d59c3, 0x0179b9e8, 0x00068904}}, Y: Field{[10]uint32{0x00d79a16, 0x02db9039, 0x0360d590, 0x03d05e37, 0x002c8177, 0x02416ddb, 0x03f27493, 0x01030b12, 0x00c0a867, 0x00238728}}}, + {X: Field{[10]uint32{0x01dd3aee, 0x03c6daf1, 0x012f2170, 0x022a3e5b, 0x0213153a, 0x01aa5db2, 0x0222a9ac, 0x031f3383, 0x00a51553, 0x001b4714}}, Y: Field{[10]uint32{0x01f597f7, 0x00d5393f, 0x013adfee, 0x002aa3b5, 0x00851e31, 0x00a1f51d, 0x03272002, 0x037f725d, 0x008e06ab, 0x002bffc5}}}, + {X: Field{[10]uint32{0x03720b26, 0x00bac126, 0x03cd0762, 0x017e6333, 0x0026f283, 0x004e4188, 0x006bbed4, 0x01a3b87d, 0x01ae9ac9, 0x000f8431}}, Y: Field{[10]uint32{0x01d92db5, 0x03a631eb, 0x01e43346, 0x02936f82, 0x00e2ff79, 0x01c8578a, 0x00665b28, 0x0222456a, 0x02cffe42, 0x0031cd71}}}, + {X: Field{[10]uint32{0x00a6d0bb, 0x032a6df9, 0x02fdc678, 0x008bd686, 0x03659d31, 0x02299063, 0x011a6d8a, 0x03e7cfcc, 0x01618b97, 0x001797c7}}, Y: Field{[10]uint32{0x0033eaf9, 0x00e11e44, 0x0253a168, 0x00b941bd, 0x0272555f, 0x0139c876, 0x00f6bcd0, 0x039bdcd6, 0x002b06a7, 0x0035ec54}}}, + {X: Field{[10]uint32{0x01543cb4, 0x020e9f59, 0x00299e00, 0x02db08b4, 0x003c4529, 0x0203aa28, 0x03684d05, 0x02152a2a, 0x03ae9734, 0x001cfe1e}}, Y: Field{[10]uint32{0x00856cdd, 0x03761cb1, 0x02d7a3d2, 0x03d4d5fc, 0x019d5c42, 0x028500a2, 0x03fbfc11, 0x03e1bfba, 0x00f03a87, 0x000df19b}}}, + {X: Field{[10]uint32{0x03005e3f, 0x026d7913, 0x01bd2dda, 0x00c6fb0e, 0x015af68e, 0x03806852, 0x013cb9ac, 0x0109ffff, 0x026b3c16, 0x003e04e2}}, Y: Field{[10]uint32{0x03357eb7, 0x01f8080b, 0x0221342d, 0x02f5552f, 0x01f4ec41, 0x02a972d4, 0x01015e57, 0x03af67e7, 0x033befb4, 0x00329d63}}}, + {X: Field{[10]uint32{0x03bdde39, 0x000a9105, 0x0032952c, 0x01e6dd81, 0x031544e1, 0x02665a34, 0x022570d5, 0x033c3842, 0x0113f677, 0x001db990}}, Y: Field{[10]uint32{0x0101ac01, 0x005d4b46, 0x02032b4b, 0x034ad5b4, 0x035e2a33, 0x01a07c34, 0x03066d70, 0x02573d5d, 0x038dee4e, 0x00324377}}}, + }, + { + {X: Field{[10]uint32{0x03bdde39, 0x000a9105, 0x0032952c, 0x01e6dd81, 0x031544e1, 0x02665a34, 0x022570d5, 0x033c3842, 0x0113f677, 0x001db990}}, Y: Field{[10]uint32{0x0101ac01, 0x005d4b46, 0x02032b4b, 0x034ad5b4, 0x035e2a33, 0x01a07c34, 0x03066d70, 0x02573d5d, 0x038dee4e, 0x00324377}}}, + {X: Field{[10]uint32{0x021187a5, 0x02666a0e, 0x02e691cf, 0x0188b0a6, 0x00005d57, 0x00587204, 0x007c9d88, 0x031cefba, 0x030e9e52, 0x001c2294}}, Y: Field{[10]uint32{0x033db9c0, 0x013c66d1, 0x03e8a58a, 0x00f1b4d4, 0x003ecda7, 0x02db4e0a, 0x01656dcb, 0x02a25fea, 0x0011e1f9, 0x0026e212}}}, + {X: Field{[10]uint32{0x0078ee8d, 0x01424730, 0x019442f0, 0x033941a4, 0x024ebf20, 0x02a6d3fd, 0x03f7263a, 0x02a6f897, 0x03ad859d, 0x00342395}}, Y: Field{[10]uint32{0x01a63e86, 0x01fd370b, 0x02d9de99, 0x033e508b, 0x00123ef7, 0x015f9b7d, 0x02172ee7, 0x02235cb5, 0x03984ab4, 0x00214ba5}}}, + {X: Field{[10]uint32{0x01e4f5be, 0x02c5b1b3, 0x0359e2e1, 0x01b61aca, 0x039f374b, 0x017918b3, 0x03d64839, 0x00ef8866, 0x034fc48b, 0x000673c0}}, Y: Field{[10]uint32{0x03321af2, 0x0054cadb, 0x01c0c0a9, 0x0324fc3c, 0x03ef91d1, 0x02c60651, 0x034be68a, 0x02d19b0e, 0x0306a15a, 0x000a38ca}}}, + {X: Field{[10]uint32{0x029129ec, 0x00519c10, 0x02548159, 0x033c7920, 0x000cae3a, 0x0334c742, 0x018be80e, 0x01349d7d, 0x0085e4d4, 0x001f69b0}}, Y: Field{[10]uint32{0x00d9ff0e, 0x002bb8ab, 0x0186aeb5, 0x02195329, 0x030448c0, 0x024589ef, 0x01d02074, 0x00615d44, 0x006bb9f4, 0x003d2605}}}, + {X: Field{[10]uint32{0x029c22bc, 0x02b950c3, 0x0042fd43, 0x035a46f3, 0x0201da67, 0x026f1ef9, 0x01b3444d, 0x03ac8dd9, 0x02a5e99e, 0x0014cd73}}, Y: Field{[10]uint32{0x03dacb60, 0x03099cb2, 0x0319b3c2, 0x008db287, 0x02c8c30c, 0x0033ae1a, 0x027f080f, 0x01489281, 0x0020769c, 0x000efe34}}}, + {X: Field{[10]uint32{0x01654f22, 0x00f52554, 0x02ee94f8, 0x02508c6a, 0x03b2f7f3, 0x039a7653, 0x03e9001b, 0x02f9b886, 0x00cff5c1, 0x00243424}}, Y: Field{[10]uint32{0x001a43e1, 0x037815d8, 0x038740f5, 0x0194f68f, 0x036dd635, 0x01afdc0c, 0x03f021e0, 0x03d86a54, 0x021d2bac, 0x003355a6}}}, + {X: Field{[10]uint32{0x017cf3e8, 0x02f08274, 0x02219e3a, 0x000d2fa8, 0x02ee93bd, 0x00e5fd5d, 0x0319c2f8, 0x017c35f1, 0x00a078cb, 0x002bdb11}}, Y: Field{[10]uint32{0x0351baea, 0x03741805, 0x01435b8a, 0x03a9f283, 0x03ec362a, 0x032c91b7, 0x01e73153, 0x012cc2be, 0x016fe85d, 0x0001e102}}}, + {X: Field{[10]uint32{0x036b19fa, 0x03bd9471, 0x019d71b6, 0x01b41a20, 0x02d9d6e0, 0x02084a4b, 0x0322c310, 0x0347b31c, 0x00587cf1, 0x003691e6}}, Y: Field{[10]uint32{0x026f5af7, 0x009bbacc, 0x03c206aa, 0x00fa554f, 0x02a67bd1, 0x038595a7, 0x03369077, 0x02bc0745, 0x03789bcc, 0x003aec75}}}, + {X: Field{[10]uint32{0x02569044, 0x03e47b75, 0x02ef96d2, 0x01b3e833, 0x0033c039, 0x017163cc, 0x002bafe9, 0x01894e75, 0x020d6f7d, 0x002a8871}}, Y: Field{[10]uint32{0x02f37766, 0x00931070, 0x00334c19, 0x03044e4a, 0x02ee5aba, 0x0106b7d3, 0x01d26add, 0x01aba9b4, 0x0086fc4e, 0x002cab9a}}}, + {X: Field{[10]uint32{0x01135dbd, 0x00bed96e, 0x0231ecd9, 0x02bce761, 0x00f0c087, 0x00ba625f, 0x017aaf58, 0x03b9ab60, 0x0104a8dd, 0x0038f91d}}, Y: Field{[10]uint32{0x0348045d, 0x01abcf91, 0x01da9690, 0x03fd7b25, 0x02a5a202, 0x00ae0fff, 0x018c8195, 0x031b102e, 0x03f809cb, 0x0024c296}}}, + {X: Field{[10]uint32{0x03f4de54, 0x00798853, 0x002be5bc, 0x0247a74f, 0x00a5cabd, 0x00528a16, 0x034031cf, 0x000a8b0e, 0x00355df2, 0x0015c5b7}}, Y: Field{[10]uint32{0x00100fa5, 0x0293f554, 0x02417d3e, 0x0333411f, 0x01ebf3fe, 0x0264c931, 0x02aa661a, 0x020fce47, 0x00400a5b, 0x002617db}}}, + {X: Field{[10]uint32{0x01ee455f, 0x002e7973, 0x00075cbf, 0x039ba339, 0x02ff67ff, 0x0202f6d2, 0x0345338f, 0x02a6c291, 0x016fe870, 0x001fa319}}, Y: Field{[10]uint32{0x031b9cba, 0x037a6605, 0x02627173, 0x019d1bd1, 0x034aa2d1, 0x0200e94e, 0x03f760f4, 0x01d03ca8, 0x0232ca30, 0x002f7771}}}, + {X: Field{[10]uint32{0x0369b57c, 0x00540365, 0x03c7b1e6, 0x02f0e78b, 0x01da5033, 0x02f8fc13, 0x008f1925, 0x00a0ad4d, 0x01cb592d, 0x0000c194}}, Y: Field{[10]uint32{0x033236e3, 0x00e9417c, 0x038057ff, 0x0061ce7d, 0x03192a4d, 0x0215a0b0, 0x00e2423e, 0x030262b1, 0x0033bb7a, 0x00094822}}}, + {X: Field{[10]uint32{0x0298b59e, 0x025ae6d9, 0x007a4377, 0x009624d1, 0x020a3359, 0x00f8f1c9, 0x02b035ab, 0x017ac56f, 0x01f891a9, 0x000f7e10}}, Y: Field{[10]uint32{0x0392baf5, 0x02399e5a, 0x009f8bcf, 0x01ec8525, 0x027bfc86, 0x00473ce1, 0x002bae8f, 0x02430768, 0x02df98b0, 0x002ce3f9}}}, + {X: Field{[10]uint32{0x03cbb891, 0x0054090a, 0x00bee3ab, 0x010f7c9b, 0x028f7cc6, 0x010fe3e6, 0x0281baa7, 0x02af87a0, 0x016b03b2, 0x0031ce31}}, Y: Field{[10]uint32{0x019a84c3, 0x01cd765a, 0x00fe917e, 0x03bde203, 0x0382314e, 0x032feeee, 0x0318f2ea, 0x03494dfd, 0x0178951a, 0x00224fed}}}, + }, + { + {X: Field{[10]uint32{0x03cbb891, 0x0054090a, 0x00bee3ab, 0x010f7c9b, 0x028f7cc6, 0x010fe3e6, 0x0281baa7, 0x02af87a0, 0x016b03b2, 0x0031ce31}}, Y: Field{[10]uint32{0x019a84c3, 0x01cd765a, 0x00fe917e, 0x03bde203, 0x0382314e, 0x032feeee, 0x0318f2ea, 0x03494dfd, 0x0178951a, 0x00224fed}}}, + {X: Field{[10]uint32{0x0262ab1b, 0x02ac1e11, 0x009e4dda, 0x03a926e3, 0x00647197, 0x00b9eaa5, 0x0332a699, 0x000dd0d6, 0x005ecd7c, 0x00155e21}}, Y: Field{[10]uint32{0x016f3511, 0x03463cc1, 0x024de316, 0x01d1a975, 0x03f653a7, 0x034a9014, 0x026d0a51, 0x038b0f3a, 0x03978b6d, 0x00398741}}}, + {X: Field{[10]uint32{0x0361d58d, 0x02abcce1, 0x00e2f34b, 0x03902358, 0x02ca4c9b, 0x01c837de, 0x02240a35, 0x01851842, 0x0127823f, 0x002e3118}}, Y: Field{[10]uint32{0x011051a4, 0x03a82ea7, 0x03c5b638, 0x01e17841, 0x013f7504, 0x01fcf141, 0x02458f69, 0x038df452, 0x016c5170, 0x0023e7b6}}}, + {X: Field{[10]uint32{0x008b6c29, 0x021a6e25, 0x0196094f, 0x0153f38e, 0x0122f123, 0x03433b33, 0x03fa3bc1, 0x0193312a, 0x003888a3, 0x0011fcce}}, Y: Field{[10]uint32{0x02537ef9, 0x03b84483, 0x014a81ed, 0x025623e6, 0x0118bb49, 0x02d05b1c, 0x00e48675, 0x00a4dc64, 0x028d0f03, 0x001232a6}}}, + {X: Field{[10]uint32{0x010b0040, 0x002cc101, 0x00adc2db, 0x02e7c04d, 0x01f3f47d, 0x03a68d9c, 0x010c993f, 0x01c7de8d, 0x029f7102, 0x0002355b}}, Y: Field{[10]uint32{0x033fd0a1, 0x03899e96, 0x002beb58, 0x01c8385e, 0x01f6d7c4, 0x035e6ca1, 0x03d150a8, 0x026a887f, 0x01aebd0a, 0x00284861}}}, + {X: Field{[10]uint32{0x0166ff40, 0x037a8684, 0x0336da14, 0x012907ff, 0x02caeebf, 0x0392028b, 0x038125d8, 0x0234adf1, 0x00331881, 0x001ac010}}, Y: Field{[10]uint32{0x0171b847, 0x0104c3a7, 0x02de9eb7, 0x03db9fcf, 0x00076883, 0x0242fcbc, 0x00943a05, 0x03eb265a, 0x033ae8aa, 0x00107346}}}, + {X: Field{[10]uint32{0x03573b7f, 0x0158f7c4, 0x02270f56, 0x017b4c2d, 0x03889a1c, 0x02f9968d, 0x0220f977, 0x03398d07, 0x0232d42f, 0x003704fc}}, Y: Field{[10]uint32{0x001f2ba6, 0x03348a13, 0x00b1c42a, 0x01c05d01, 0x02704554, 0x012a429d, 0x03410da8, 0x00d030f1, 0x0280429e, 0x0032426e}}}, + {X: Field{[10]uint32{0x01ff4adb, 0x029b23c1, 0x03768a81, 0x035bf2fb, 0x0214f570, 0x01a9757d, 0x026b4c9c, 0x02e33f91, 0x0334ae41, 0x00303007}}, Y: Field{[10]uint32{0x00351065, 0x03bfdceb, 0x01b85fc4, 0x0345c345, 0x02cdbc43, 0x001d6e33, 0x0137a0b4, 0x01fd71f2, 0x01bee435, 0x0002e13d}}}, + {X: Field{[10]uint32{0x03ae9ceb, 0x03d642e1, 0x02d14b02, 0x03a9c3bc, 0x00226c21, 0x02c8466a, 0x0319565d, 0x01fc1ceb, 0x01e601df, 0x0009700b}}, Y: Field{[10]uint32{0x03c6e275, 0x024344d2, 0x00726470, 0x037c2996, 0x0137c641, 0x03eb4475, 0x0084e0dc, 0x00e0f032, 0x02d2c812, 0x0022a7fa}}}, + {X: Field{[10]uint32{0x032c1a1c, 0x000675e4, 0x01d6e365, 0x006808af, 0x03a2f32b, 0x002d8ee4, 0x0229ea40, 0x032f6cf4, 0x03bc468e, 0x000ea4cb}}, Y: Field{[10]uint32{0x01343540, 0x02a49a5f, 0x028b684a, 0x0055d268, 0x02c0417e, 0x03720742, 0x009547d4, 0x015ea007, 0x00540f34, 0x002b4f60}}}, + {X: Field{[10]uint32{0x005a3c34, 0x00263dbb, 0x009fe1f8, 0x0300a565, 0x00aece82, 0x01eb8f96, 0x02b9f4ca, 0x039273a2, 0x011b2cf8, 0x003fb767}}, Y: Field{[10]uint32{0x013d7714, 0x0152fd38, 0x0029762b, 0x011a66fe, 0x00adaeb5, 0x0323d2c0, 0x03e85312, 0x02e382c2, 0x00c31853, 0x00294b89}}}, + {X: Field{[10]uint32{0x00d6bf1f, 0x00841ae0, 0x03cbb045, 0x00fa6093, 0x0146bd03, 0x01acd1ae, 0x0121e927, 0x02e0f28d, 0x0343451c, 0x0030ccdc}}, Y: Field{[10]uint32{0x00b01f48, 0x0396108f, 0x02162f95, 0x01083899, 0x0198ba36, 0x01cb0c55, 0x01ff31af, 0x00b3684f, 0x01391b81, 0x000bbbfa}}}, + {X: Field{[10]uint32{0x02b6a396, 0x0395346a, 0x020769b4, 0x0246844d, 0x0373021b, 0x03a1222c, 0x02e2d7f5, 0x029230b7, 0x0286bc6e, 0x000f838c}}, Y: Field{[10]uint32{0x0180e27e, 0x00c79236, 0x00f6a2eb, 0x0107cd1a, 0x026ab010, 0x02d14ff1, 0x031fe1de, 0x00de593c, 0x0172fa3b, 0x00329120}}}, + {X: Field{[10]uint32{0x02f027e9, 0x03d31236, 0x0277e27b, 0x036fb951, 0x03d7ca75, 0x01fb5b45, 0x03c7cd53, 0x00f894f0, 0x033d3ea8, 0x001698a1}}, Y: Field{[10]uint32{0x004c68b4, 0x02764161, 0x035fb319, 0x00c27299, 0x03988af4, 0x03b15e90, 0x02409cfe, 0x01abf69d, 0x0079a5bf, 0x003db651}}}, + {X: Field{[10]uint32{0x001023ec, 0x00d6188d, 0x03570aaf, 0x03ddbfb3, 0x035645d8, 0x0260ae6b, 0x002e0200, 0x00b4a126, 0x013080c3, 0x000d12ae}}, Y: Field{[10]uint32{0x021eeb87, 0x02260a47, 0x015d704f, 0x01abf0e6, 0x03fc4e97, 0x02945317, 0x038f2d1e, 0x0118a9cf, 0x03042b24, 0x001b870a}}}, + {X: Field{[10]uint32{0x00f6c14b, 0x03a7d962, 0x01014372, 0x017cea49, 0x03d1d72e, 0x0325ca1d, 0x024c7637, 0x016e0789, 0x026548b6, 0x00362558}}, Y: Field{[10]uint32{0x017d991f, 0x018fb5d7, 0x027e1793, 0x018caec1, 0x0303428d, 0x0230d03a, 0x00ec6081, 0x01fab9ca, 0x0238f2bc, 0x003fafea}}}, + }, + { + {X: Field{[10]uint32{0x00f6c14b, 0x03a7d962, 0x01014372, 0x017cea49, 0x03d1d72e, 0x0325ca1d, 0x024c7637, 0x016e0789, 0x026548b6, 0x00362558}}, Y: Field{[10]uint32{0x017d991f, 0x018fb5d7, 0x027e1793, 0x018caec1, 0x0303428d, 0x0230d03a, 0x00ec6081, 0x01fab9ca, 0x0238f2bc, 0x003fafea}}}, + {X: Field{[10]uint32{0x03078424, 0x02d652dd, 0x00c3fba5, 0x01e83b10, 0x0303ecaf, 0x0000e899, 0x03a43622, 0x00113a28, 0x02ef8971, 0x003f44db}}, Y: Field{[10]uint32{0x0271ddf1, 0x007bbbf1, 0x01fa8cd6, 0x03de28ab, 0x017cf2b1, 0x01717be9, 0x021d191b, 0x014b319e, 0x0034f3c6, 0x0008636a}}}, + {X: Field{[10]uint32{0x0127b756, 0x02a1ffd8, 0x0170480b, 0x0392ae82, 0x0203428b, 0x00182d05, 0x01362da5, 0x03c499cb, 0x002f716d, 0x001b631e}}, Y: Field{[10]uint32{0x03172571, 0x007dd2af, 0x01cca655, 0x0368b5f3, 0x034e3aa6, 0x01b4d36b, 0x019a82d3, 0x02e44451, 0x030896fd, 0x00266bb7}}}, + {X: Field{[10]uint32{0x01b1cb3c, 0x03613b23, 0x0024a5f1, 0x028350fc, 0x021b7003, 0x01d467e1, 0x01cca536, 0x0234503a, 0x029dd963, 0x003667a3}}, Y: Field{[10]uint32{0x038637a7, 0x028a78da, 0x0365cd88, 0x03e3ff21, 0x026286fe, 0x02f3ae9b, 0x005bb321, 0x028e9ea5, 0x01ad1cc0, 0x000db706}}}, + {X: Field{[10]uint32{0x018cf17a, 0x03869cdd, 0x023524de, 0x032e9620, 0x00f1f85d, 0x02d025fe, 0x0059aef1, 0x01eb2a34, 0x02dd95bf, 0x003af2af}}, Y: Field{[10]uint32{0x00aa0ccd, 0x033717d7, 0x0295c446, 0x004b42b3, 0x0310fad2, 0x01f0cb9a, 0x0000a1b6, 0x02e72c0b, 0x020f8f22, 0x0011f4f3}}}, + {X: Field{[10]uint32{0x01a3c43c, 0x012cb154, 0x02258e4c, 0x032a3b3b, 0x000df701, 0x02ab99c5, 0x00c1f2b4, 0x03356d23, 0x029467ca, 0x0015b276}}, Y: Field{[10]uint32{0x00d7c9ed, 0x0362df48, 0x00aa1824, 0x03e4cbb7, 0x0241d40f, 0x0372da14, 0x03c7964d, 0x027b0bcc, 0x02cb42c7, 0x000e351a}}}, + {X: Field{[10]uint32{0x00855c5b, 0x03b9456b, 0x00afbbce, 0x006805f2, 0x00118562, 0x0385ff0a, 0x0331a369, 0x03389114, 0x012e4bd4, 0x003a37d3}}, Y: Field{[10]uint32{0x02465650, 0x0179cb0b, 0x00d7d59d, 0x017c7879, 0x019663b5, 0x027bccb1, 0x004db4f5, 0x026c9911, 0x0170c47f, 0x001b15ff}}}, + {X: Field{[10]uint32{0x00385172, 0x01bda34f, 0x02636fd4, 0x00781103, 0x01d20335, 0x016c2464, 0x03d8a54e, 0x020c5e86, 0x01619a19, 0x0000ff7c}}, Y: Field{[10]uint32{0x00cb9794, 0x0319fc3f, 0x0232b79a, 0x027a439c, 0x015b9b92, 0x03215cdd, 0x0070c7d3, 0x004b0ff9, 0x02c06e5c, 0x00102340}}}, + {X: Field{[10]uint32{0x02e7e454, 0x03d6f694, 0x02150d08, 0x03bc3c39, 0x02fe32ef, 0x02a60598, 0x02486023, 0x02a0ca44, 0x03d718ec, 0x00101a34}}, Y: Field{[10]uint32{0x00ef191e, 0x02b37976, 0x03332779, 0x03b44f0d, 0x01988d21, 0x03674e34, 0x02c14597, 0x011eaae7, 0x03b7254a, 0x00233614}}}, + {X: Field{[10]uint32{0x01d8247e, 0x0307fd4d, 0x011eb400, 0x0309445a, 0x00cd4780, 0x03e82de8, 0x02101f9a, 0x0157395b, 0x01bba2c3, 0x000cfab2}}, Y: Field{[10]uint32{0x033da9bf, 0x005aac2b, 0x0007f372, 0x00dedfa9, 0x0184f8cf, 0x03457bcb, 0x0061f2af, 0x01f10751, 0x0173e4e1, 0x000d65cc}}}, + {X: Field{[10]uint32{0x02c5d939, 0x01eb7e11, 0x033de085, 0x021deea4, 0x02a475a2, 0x0032809f, 0x01bf32e6, 0x009782d5, 0x02cdb1d8, 0x00049543}}, Y: Field{[10]uint32{0x01e757c9, 0x01d3f156, 0x0143192a, 0x007fb363, 0x02838b74, 0x01dc929c, 0x008e43c1, 0x035e9d51, 0x0334f872, 0x001ee3e0}}}, + {X: Field{[10]uint32{0x01f771c8, 0x0092740b, 0x00c87b9e, 0x0047b825, 0x00335a52, 0x0007e1d4, 0x032c2b3c, 0x03240a74, 0x006d922d, 0x002dc795}}, Y: Field{[10]uint32{0x03f48c51, 0x00e89be4, 0x02286245, 0x00ad56ee, 0x0026bd52, 0x0338a23d, 0x0112a4cc, 0x03e401e2, 0x03a8cec9, 0x0039f33b}}}, + {X: Field{[10]uint32{0x02c8a56f, 0x002ab195, 0x0342138d, 0x0150d3cd, 0x0385093c, 0x02beb423, 0x01bb7b53, 0x0217531a, 0x031ac3b5, 0x00251359}}, Y: Field{[10]uint32{0x027be289, 0x01371976, 0x0117eb9f, 0x01d37419, 0x0167d4c1, 0x00ceb186, 0x01439361, 0x007ffd30, 0x01977b50, 0x0029c419}}}, + {X: Field{[10]uint32{0x03194444, 0x01cc24b4, 0x03ea268f, 0x0252ea9f, 0x02850fea, 0x0361e867, 0x02239666, 0x009ae184, 0x0196ba15, 0x003eb3d7}}, Y: Field{[10]uint32{0x00bad676, 0x02fd2211, 0x0100b552, 0x0116e51f, 0x02be72b2, 0x024b76b1, 0x01b77563, 0x0113da4d, 0x007bb8ad, 0x001f3ae4}}}, + {X: Field{[10]uint32{0x0208f15a, 0x02e2862b, 0x0100baee, 0x01b7204a, 0x01fd69e5, 0x02b4f0c1, 0x02b03655, 0x026833f9, 0x0291cd09, 0x0021a953}}, Y: Field{[10]uint32{0x01388308, 0x013479f0, 0x0254d352, 0x00496cd4, 0x0377129d, 0x035d5a19, 0x032a8d06, 0x021180e9, 0x014837a7, 0x0033fb98}}}, + {X: Field{[10]uint32{0x03676e03, 0x01429593, 0x00edd491, 0x00da4fa1, 0x01ceffc7, 0x01c7a1d8, 0x00f64335, 0x01d463ac, 0x00032a95, 0x002e36a5}}, Y: Field{[10]uint32{0x02fdf6e7, 0x023939d3, 0x03b51148, 0x013657fc, 0x0092cc58, 0x018a022c, 0x0099cc97, 0x0287935f, 0x03a44805, 0x000a0137}}}, + }, + { + {X: Field{[10]uint32{0x03676e03, 0x01429593, 0x00edd491, 0x00da4fa1, 0x01ceffc7, 0x01c7a1d8, 0x00f64335, 0x01d463ac, 0x00032a95, 0x002e36a5}}, Y: Field{[10]uint32{0x02fdf6e7, 0x023939d3, 0x03b51148, 0x013657fc, 0x0092cc58, 0x018a022c, 0x0099cc97, 0x0287935f, 0x03a44805, 0x000a0137}}}, + {X: Field{[10]uint32{0x01af726a, 0x00fd0531, 0x036e6d41, 0x0172c96f, 0x01469a3e, 0x02ad883e, 0x032cb698, 0x0317394f, 0x0105ed8c, 0x001b4db4}}, Y: Field{[10]uint32{0x03f9fc7d, 0x00124684, 0x00a35c57, 0x00dad042, 0x01dcc599, 0x0171400a, 0x018c66c9, 0x019a79cb, 0x0034e377, 0x00392e97}}}, + {X: Field{[10]uint32{0x02e1346b, 0x02612771, 0x031c5ea1, 0x0040e16b, 0x005abe7b, 0x013454b0, 0x00c761f1, 0x03442f95, 0x00ff0982, 0x0001a41a}}, Y: Field{[10]uint32{0x03226c13, 0x01629535, 0x0026e7bb, 0x00e65318, 0x02a4f689, 0x0021910a, 0x005db2bd, 0x03789b6a, 0x03e090bf, 0x002e18f8}}}, + {X: Field{[10]uint32{0x0140db99, 0x00a8c329, 0x0012286e, 0x03014d2e, 0x03eb1309, 0x01bc2c38, 0x02883fa6, 0x02b03341, 0x01e10cd3, 0x000eadaf}}, Y: Field{[10]uint32{0x03da78a3, 0x01cff8c6, 0x00043e68, 0x02c38da7, 0x0038d137, 0x0284fa67, 0x03117a96, 0x01c75ff0, 0x02079be8, 0x002eb298}}}, + {X: Field{[10]uint32{0x00a1f6a1, 0x01a47f37, 0x03f1a30e, 0x0050d233, 0x01068cbd, 0x007a1b38, 0x006dc5cb, 0x025d854a, 0x0093cb25, 0x0022630d}}, Y: Field{[10]uint32{0x024f647c, 0x037083c5, 0x0179ca4a, 0x025e7caf, 0x03b2a7cf, 0x00ab1ba4, 0x00454245, 0x02955276, 0x0186ab56, 0x001d7dd6}}}, + {X: Field{[10]uint32{0x0235c795, 0x038aef1c, 0x001d7584, 0x0163af55, 0x030b0d89, 0x03472275, 0x03b05b37, 0x025d2ce4, 0x022435ef, 0x00018f11}}, Y: Field{[10]uint32{0x03110258, 0x00b70256, 0x029bd3f3, 0x02b3e926, 0x029e4acb, 0x00c7216d, 0x01f660d9, 0x0210110c, 0x03b91303, 0x00389fe6}}}, + {X: Field{[10]uint32{0x011e3998, 0x02780f0f, 0x00328aa6, 0x02e45e81, 0x025e56c8, 0x008a89d3, 0x01299d70, 0x022fc069, 0x02fed291, 0x002c84f8}}, Y: Field{[10]uint32{0x025fb81e, 0x032f718c, 0x01175ec2, 0x016faf7b, 0x03d53416, 0x00e90ef0, 0x0161ebf8, 0x00f04b0f, 0x02c20f2d, 0x0008a7e3}}}, + {X: Field{[10]uint32{0x031048da, 0x01efc9e7, 0x013ba777, 0x03cdcf77, 0x02ba2fd4, 0x0341ef38, 0x03a069d9, 0x015bc3f6, 0x00e3f1ad, 0x001e598d}}, Y: Field{[10]uint32{0x0106cf01, 0x026f8928, 0x00862e8f, 0x03633f5d, 0x02532576, 0x029e49fc, 0x01e74735, 0x002e255b, 0x02b6cfb2, 0x001363b8}}}, + {X: Field{[10]uint32{0x025be234, 0x0387fb28, 0x0350700b, 0x039c377c, 0x020e83e3, 0x00581b81, 0x01d0ba69, 0x03e4f974, 0x02d816c7, 0x0012cece}}, Y: Field{[10]uint32{0x020e8362, 0x02df80e4, 0x01b84063, 0x024b3c84, 0x0041e7fd, 0x03633013, 0x035e96df, 0x02f271e1, 0x023b85da, 0x0017bb00}}}, + {X: Field{[10]uint32{0x005201e1, 0x0026b270, 0x0377dab2, 0x016ba0da, 0x01d264cb, 0x03a8d7e6, 0x02bd55cd, 0x01e2ba14, 0x02b06e6c, 0x0030a671}}, Y: Field{[10]uint32{0x00f51ba3, 0x00cc4e94, 0x02ae9add, 0x03d60eb0, 0x03bd74dc, 0x035dd335, 0x0084f24f, 0x02016ce2, 0x01923611, 0x0016a9ce}}}, + {X: Field{[10]uint32{0x0289f55e, 0x018d29f8, 0x02707b96, 0x03c38b1d, 0x022976b0, 0x01e2596f, 0x00251b02, 0x013e5808, 0x00b6ddb0, 0x0027dee2}}, Y: Field{[10]uint32{0x021e4bde, 0x034ed97f, 0x022b1b3c, 0x0383ac42, 0x03c0e536, 0x0263f1c7, 0x03146b42, 0x0043def8, 0x0384c704, 0x000cbe7d}}}, + {X: Field{[10]uint32{0x001cbaab, 0x01e9fc5b, 0x0164cfd3, 0x01e40cf5, 0x001acab8, 0x029c18d7, 0x00ab6c18, 0x0181c566, 0x0298fb35, 0x00340c6b}}, Y: Field{[10]uint32{0x01116b26, 0x02411fe1, 0x01fdc4c3, 0x013f6f59, 0x036dfb4a, 0x0372d373, 0x02e4c06a, 0x01613a39, 0x02b4e954, 0x00105465}}}, + {X: Field{[10]uint32{0x01fe1d2b, 0x01272307, 0x038e5165, 0x002795a1, 0x00c493f5, 0x00fedce9, 0x02ccadfd, 0x01238f9d, 0x03e9cb74, 0x00356290}}, Y: Field{[10]uint32{0x00d50922, 0x009e56e3, 0x02fbffcf, 0x008572f5, 0x0354d9ba, 0x020a09da, 0x02729132, 0x020f3c42, 0x026ba058, 0x003f05e1}}}, + {X: Field{[10]uint32{0x007996c0, 0x03ef5611, 0x0269a626, 0x01c9dae8, 0x016e2eed, 0x02fb743a, 0x03979577, 0x00d590e6, 0x02d86a95, 0x0005ba16}}, Y: Field{[10]uint32{0x00151d48, 0x022f192e, 0x01d54488, 0x02b6715a, 0x0221b642, 0x0003b556, 0x0217e5ce, 0x0124fbec, 0x00aeb424, 0x001d022c}}}, + {X: Field{[10]uint32{0x009c795e, 0x00546f89, 0x0005e124, 0x02aa673a, 0x02ed4406, 0x0309fa93, 0x02d969c3, 0x020c4335, 0x01397111, 0x0008749c}}, Y: Field{[10]uint32{0x01208ece, 0x004bb0e6, 0x03761b00, 0x01292b7e, 0x03d67194, 0x008aed30, 0x0335b855, 0x02b3a85d, 0x01b4b075, 0x0025317e}}}, + {X: Field{[10]uint32{0x03c0df5d, 0x0045de38, 0x02792f1a, 0x03ed455a, 0x032019ef, 0x01d75fea, 0x00adab94, 0x02cce9f6, 0x0214441f, 0x003a03fa}}, Y: Field{[10]uint32{0x02c9ec78, 0x010a46da, 0x02ea9fcb, 0x0202bcc8, 0x032d155e, 0x00f2a511, 0x009768ca, 0x0001dc7a, 0x027f638e, 0x003bb477}}}, + }, + { + {X: Field{[10]uint32{0x03c0df5d, 0x0045de38, 0x02792f1a, 0x03ed455a, 0x032019ef, 0x01d75fea, 0x00adab94, 0x02cce9f6, 0x0214441f, 0x003a03fa}}, Y: Field{[10]uint32{0x02c9ec78, 0x010a46da, 0x02ea9fcb, 0x0202bcc8, 0x032d155e, 0x00f2a511, 0x009768ca, 0x0001dc7a, 0x027f638e, 0x003bb477}}}, + {X: Field{[10]uint32{0x0383cd58, 0x0039e2c3, 0x039162db, 0x00e1df4b, 0x03122dcc, 0x03bf9e8d, 0x01ac4ed1, 0x00499660, 0x01f08ea4, 0x00110328}}, Y: Field{[10]uint32{0x008a3f4b, 0x02f01a6e, 0x02260b07, 0x0109a702, 0x02a21e4d, 0x03538bc0, 0x00954dc9, 0x03848abe, 0x00d2cd5e, 0x0029b22c}}}, + {X: Field{[10]uint32{0x03592d55, 0x00d67b35, 0x010192c0, 0x011d038d, 0x0106d5b9, 0x00cf38ec, 0x02fef696, 0x00149822, 0x02dbc4a1, 0x00174bb1}}, Y: Field{[10]uint32{0x035183a7, 0x039743ab, 0x01174266, 0x0336b445, 0x010e2a7b, 0x01a335a5, 0x03710fa2, 0x0117ad63, 0x01f89c6e, 0x0002a4b3}}}, + {X: Field{[10]uint32{0x02998b10, 0x02f689c4, 0x029d9e81, 0x02f306c8, 0x019bc70e, 0x00ea41e0, 0x037f829d, 0x01b07317, 0x03af2b96, 0x003da532}}, Y: Field{[10]uint32{0x00f05e51, 0x0222c5c0, 0x02a47f67, 0x030c60f0, 0x02eb6c64, 0x0311b60a, 0x03c5ffac, 0x03c0f58c, 0x02ba61be, 0x0010298f}}}, + {X: Field{[10]uint32{0x028f9f5c, 0x03d2d27f, 0x00a51991, 0x03856620, 0x017361f1, 0x0057d013, 0x02cae342, 0x03dd0bf8, 0x01c3b11b, 0x002b0dc7}}, Y: Field{[10]uint32{0x025a503c, 0x020ffccc, 0x01e1d17a, 0x0163b9d4, 0x01229534, 0x009539cd, 0x02101e73, 0x0291dffc, 0x02c18709, 0x00314585}}}, + {X: Field{[10]uint32{0x015bf84c, 0x012e3e39, 0x01027a74, 0x03b55c36, 0x03d964c6, 0x008f2b93, 0x01d3c252, 0x01b32397, 0x0099ceb9, 0x00189e0a}}, Y: Field{[10]uint32{0x0315fa2a, 0x0073ead7, 0x036ed6f5, 0x039f7745, 0x039a020d, 0x025c99e0, 0x00549722, 0x028a2407, 0x00a40911, 0x00359c2b}}}, + {X: Field{[10]uint32{0x01e33446, 0x00723546, 0x0385df4a, 0x03114abc, 0x0240893b, 0x0088a85e, 0x008c0bd0, 0x0210324d, 0x003a14f1, 0x00225080}}, Y: Field{[10]uint32{0x02387689, 0x00e28039, 0x00f9840d, 0x00d9e79d, 0x006bfd77, 0x03bf7938, 0x00b2d6d0, 0x001de936, 0x039595a5, 0x002a7f40}}}, + {X: Field{[10]uint32{0x01d553fd, 0x0284cd63, 0x02414f95, 0x0257022d, 0x0047abf6, 0x02689654, 0x036d4f43, 0x01a12142, 0x022a3556, 0x0022dba1}}, Y: Field{[10]uint32{0x029be5ed, 0x00f6b4cf, 0x003d0d80, 0x016860ce, 0x0124ac3c, 0x013ae7e8, 0x010bc2df, 0x0072d034, 0x00910ed1, 0x003a9782}}}, + {X: Field{[10]uint32{0x0113cb26, 0x00a3256e, 0x016d03d7, 0x027004ef, 0x0099eb41, 0x01541726, 0x00da44ff, 0x010aa28b, 0x026b30a3, 0x0009dc09}}, Y: Field{[10]uint32{0x0348a7a2, 0x01c5ccfc, 0x01bebbfe, 0x006f3205, 0x00e940c9, 0x01fcacc9, 0x012d24d0, 0x036c6955, 0x005e79b0, 0x003d926f}}}, + {X: Field{[10]uint32{0x030c58bd, 0x010912b3, 0x024ce23f, 0x0137d911, 0x0228d49f, 0x01aabb3d, 0x019e1005, 0x013024cb, 0x006e2484, 0x0034eb7c}}, Y: Field{[10]uint32{0x03c89387, 0x0392ae4d, 0x00c9ce52, 0x027e92e6, 0x02aee386, 0x03fd8e2e, 0x03b2febc, 0x0181def7, 0x01b4fc2a, 0x0015fa67}}}, + {X: Field{[10]uint32{0x015e8247, 0x02a80856, 0x00d1af0a, 0x01155a1b, 0x0097bfdc, 0x033e2ea4, 0x025e6e01, 0x03b485e3, 0x00d383cb, 0x001d7934}}, Y: Field{[10]uint32{0x01982d22, 0x00ff6756, 0x01893ca2, 0x02dbaa6b, 0x007ddab5, 0x01edc9b5, 0x01f970ec, 0x002641d0, 0x02a17541, 0x0007f390}}}, + {X: Field{[10]uint32{0x039715c2, 0x011c743c, 0x0129a399, 0x0087e629, 0x01690065, 0x028cffb7, 0x011f78ce, 0x00f616d0, 0x0288f19a, 0x000bc627}}, Y: Field{[10]uint32{0x0171dfea, 0x018d6110, 0x014f066a, 0x038b0da1, 0x03eb3333, 0x03443e7d, 0x0308475e, 0x035f3f7d, 0x01f8f3c5, 0x0032468e}}}, + {X: Field{[10]uint32{0x02333323, 0x027d1369, 0x02bf4747, 0x0071a3d2, 0x009cbbbc, 0x026136a1, 0x0020d605, 0x02efc0fc, 0x02383361, 0x000fb46d}}, Y: Field{[10]uint32{0x01d61ba3, 0x00ff122d, 0x037294b1, 0x02842de3, 0x02a9b728, 0x0223e4a7, 0x017c9896, 0x013b9d76, 0x01a48b5b, 0x003613cb}}}, + {X: Field{[10]uint32{0x023eb3fc, 0x018bb73e, 0x02398875, 0x02513643, 0x0277ee68, 0x02229bdf, 0x0246b408, 0x01aedddf, 0x00bb0a1b, 0x0034b372}}, Y: Field{[10]uint32{0x02d37564, 0x021f6cf7, 0x00927442, 0x02e4c42d, 0x02c1f217, 0x033e49bb, 0x01e95362, 0x018411b7, 0x02f9e5c5, 0x003154e2}}}, + {X: Field{[10]uint32{0x033980bf, 0x0015f52c, 0x000baf25, 0x00b94374, 0x0368a370, 0x00d23750, 0x006fd772, 0x020606e1, 0x02f06a75, 0x001c3f74}}, Y: Field{[10]uint32{0x00b75785, 0x03aa33a8, 0x00a5612e, 0x020e175d, 0x030a1035, 0x007b965a, 0x03a410d1, 0x021a5a55, 0x02c0d0d5, 0x0017b7f2}}}, + {X: Field{[10]uint32{0x00e16070, 0x001eef31, 0x02915ddc, 0x000c7bf5, 0x03f2a182, 0x03559d50, 0x03a48e51, 0x01c10c4e, 0x017bdfcd, 0x0028c05a}}, Y: Field{[10]uint32{0x02177ea1, 0x03468107, 0x01a130c0, 0x03df0284, 0x031735db, 0x017503e6, 0x01809fa2, 0x0393d420, 0x011cfb67, 0x001cdc3e}}}, + }, + { + {X: Field{[10]uint32{0x00e16070, 0x001eef31, 0x02915ddc, 0x000c7bf5, 0x03f2a182, 0x03559d50, 0x03a48e51, 0x01c10c4e, 0x017bdfcd, 0x0028c05a}}, Y: Field{[10]uint32{0x02177ea1, 0x03468107, 0x01a130c0, 0x03df0284, 0x031735db, 0x017503e6, 0x01809fa2, 0x0393d420, 0x011cfb67, 0x001cdc3e}}}, + {X: Field{[10]uint32{0x024ba5ae, 0x0080c5bc, 0x035d8114, 0x000130d2, 0x00b43965, 0x0382ffdd, 0x028d2419, 0x03c127cf, 0x019cff79, 0x0009f879}}, Y: Field{[10]uint32{0x003a45b3, 0x016ffba2, 0x023f784a, 0x029a6be9, 0x01df48a1, 0x031e77c1, 0x01b5e3cf, 0x038827b8, 0x02a6c804, 0x000c42c9}}}, + {X: Field{[10]uint32{0x038011fc, 0x0049c004, 0x00562670, 0x019eb5ca, 0x0183596a, 0x00880293, 0x02b13308, 0x03ac4455, 0x03a30815, 0x001ba0c4}}, Y: Field{[10]uint32{0x0315ab7d, 0x02da7e8f, 0x01f9a6ac, 0x016ba714, 0x0026af91, 0x0076b0c1, 0x0212db20, 0x03c81306, 0x018bdc24, 0x003051e0}}}, + {X: Field{[10]uint32{0x00aed7ae, 0x0245d727, 0x03b4f996, 0x037a13ef, 0x035a39ad, 0x024b5f93, 0x0188ec38, 0x012bb859, 0x03a5f686, 0x0031c4b9}}, Y: Field{[10]uint32{0x02156294, 0x00522a91, 0x0263784d, 0x01512c33, 0x01380d8e, 0x00477679, 0x02d4b823, 0x018ecd97, 0x01075163, 0x00125910}}}, + {X: Field{[10]uint32{0x000e6ba7, 0x01d26e34, 0x02f7f53a, 0x016d1245, 0x003d36ec, 0x0136786d, 0x011e038a, 0x02147caf, 0x01099784, 0x003e54aa}}, Y: Field{[10]uint32{0x0175e4c1, 0x02bbb940, 0x022b98db, 0x01ed318a, 0x02555716, 0x009fe83d, 0x01376a2e, 0x033afe18, 0x025b08ab, 0x00362a4e}}}, + {X: Field{[10]uint32{0x015b6f7e, 0x0127d716, 0x02021f95, 0x014f4e2c, 0x01beb32b, 0x00261db3, 0x02053aad, 0x028c320e, 0x011d04cd, 0x00296b1f}}, Y: Field{[10]uint32{0x02b19c84, 0x02edcc22, 0x00a4848d, 0x0183d606, 0x0399e391, 0x01f67b86, 0x00c3c924, 0x03d56cdb, 0x020ab540, 0x0037c2e2}}}, + {X: Field{[10]uint32{0x03aa0e93, 0x001968a0, 0x01f62690, 0x010ebbec, 0x028f2e39, 0x0367a24e, 0x00031a19, 0x03fb9d41, 0x015e31d3, 0x0025005b}}, Y: Field{[10]uint32{0x03addac2, 0x03b49a21, 0x0307a38e, 0x00eea95e, 0x03f48437, 0x03bb9bf5, 0x0355d354, 0x01365900, 0x02ee5c45, 0x0019d40c}}}, + {X: Field{[10]uint32{0x00a6db03, 0x00f87f91, 0x01d791b4, 0x01bd609d, 0x00b2c85d, 0x02e19d7f, 0x01c0d426, 0x008d7419, 0x0104a4b3, 0x0002ff01}}, Y: Field{[10]uint32{0x024b8542, 0x03234691, 0x00f0558a, 0x025cd175, 0x02374271, 0x0129b264, 0x038ec7f9, 0x03cd14fe, 0x027a6c34, 0x00065551}}}, + {X: Field{[10]uint32{0x0266b17b, 0x01218b80, 0x03b32b0f, 0x0288098a, 0x02023568, 0x02a7c270, 0x03978846, 0x02ca246e, 0x0174d59f, 0x003bc8b4}}, Y: Field{[10]uint32{0x01dac83e, 0x01b810de, 0x001b732a, 0x01bdc70d, 0x033ee727, 0x038d2841, 0x039ccc3a, 0x0131d5a3, 0x00c97ab2, 0x002f15e1}}}, + {X: Field{[10]uint32{0x034318b5, 0x00b150ba, 0x0045657f, 0x0204bd6e, 0x0272ed5c, 0x03c815fb, 0x0388a38d, 0x02343d55, 0x01fbe194, 0x0026217d}}, Y: Field{[10]uint32{0x0199175c, 0x01509505, 0x004af2fe, 0x03b59da4, 0x027c82ad, 0x01a33ae3, 0x012c4677, 0x0263e65b, 0x02f69ef1, 0x0004d7f5}}}, + {X: Field{[10]uint32{0x02d382a0, 0x00c056a4, 0x019ae231, 0x02f38bb3, 0x03f28dcb, 0x02cb7e49, 0x00acc780, 0x0224b4e7, 0x03ce4ceb, 0x002d7dfb}}, Y: Field{[10]uint32{0x01b4b532, 0x03c2aee9, 0x038c5ba2, 0x01b4a6b3, 0x0371fb09, 0x0032f774, 0x00957c6e, 0x03c8d4f0, 0x005b51c3, 0x001a10d5}}}, + {X: Field{[10]uint32{0x0281c1bc, 0x0292b933, 0x01b33b93, 0x03962aed, 0x03d25365, 0x01a339d9, 0x01815b8d, 0x00118d6b, 0x0305465c, 0x0000cd83}}, Y: Field{[10]uint32{0x026cbedd, 0x034a2595, 0x0150176d, 0x03ad7204, 0x03231728, 0x004c19d4, 0x0369c425, 0x0140053f, 0x01f90c57, 0x001f922d}}}, + {X: Field{[10]uint32{0x012cffa5, 0x02491910, 0x005c47e6, 0x00219a33, 0x0389ed42, 0x02f51890, 0x00754d8f, 0x0041d902, 0x03d2b2e7, 0x00073770}}, Y: Field{[10]uint32{0x0121954e, 0x01b62735, 0x03528ade, 0x0109acda, 0x02c41c98, 0x0250ac22, 0x01b126bf, 0x03e298ff, 0x020cb2f1, 0x000791da}}}, + {X: Field{[10]uint32{0x008993f7, 0x027dcd01, 0x03ce1150, 0x008fe09c, 0x02962552, 0x0322eb90, 0x034fbe1b, 0x0214458c, 0x006a56a3, 0x00021d4d}}, Y: Field{[10]uint32{0x02b9dcc2, 0x030b205c, 0x0018e601, 0x03c6c498, 0x03c9f4d4, 0x01d7e8a1, 0x02994e6e, 0x022c0c43, 0x00a8a2ef, 0x0001939b}}}, + {X: Field{[10]uint32{0x00a9f22f, 0x03f90e4d, 0x00e2ad35, 0x031485ea, 0x00cc0819, 0x01220d6c, 0x01f8b8b9, 0x03a4e7c8, 0x0359f25c, 0x000ab32c}}, Y: Field{[10]uint32{0x035c4927, 0x01772ced, 0x0150b7b7, 0x02fb16e9, 0x01154bd7, 0x037c3b7c, 0x0213a37e, 0x034b9464, 0x00e9588a, 0x00354629}}}, + {X: Field{[10]uint32{0x03b04ed4, 0x02b18f8f, 0x03fffab7, 0x002c44c1, 0x0208cc33, 0x0099e378, 0x03f9d051, 0x02e4d918, 0x01b389d6, 0x00242b61}}, Y: Field{[10]uint32{0x036ef150, 0x03535232, 0x0094d991, 0x02f8560a, 0x0039aefa, 0x009c88ae, 0x03dcbd94, 0x020986bf, 0x023620a3, 0x0003941e}}}, + }, + { + {X: Field{[10]uint32{0x03b04ed4, 0x02b18f8f, 0x03fffab7, 0x002c44c1, 0x0208cc33, 0x0099e378, 0x03f9d051, 0x02e4d918, 0x01b389d6, 0x00242b61}}, Y: Field{[10]uint32{0x036ef150, 0x03535232, 0x0094d991, 0x02f8560a, 0x0039aefa, 0x009c88ae, 0x03dcbd94, 0x020986bf, 0x023620a3, 0x0003941e}}}, + {X: Field{[10]uint32{0x03dc0151, 0x022c3b69, 0x03bad281, 0x039919c1, 0x017e125b, 0x0210978f, 0x00b1d154, 0x0101dfd1, 0x000ef8c9, 0x001f8b35}}, Y: Field{[10]uint32{0x00721ec7, 0x02f14e48, 0x0082c9a3, 0x0102bbb8, 0x01889bee, 0x0087be57, 0x0261a8b3, 0x03eace0a, 0x01082adc, 0x002416dd}}}, + {X: Field{[10]uint32{0x00b7b678, 0x0176ccec, 0x03816627, 0x0046f3d8, 0x02f13c43, 0x009adb1d, 0x0186bca4, 0x008c6e86, 0x017334e4, 0x00061b92}}, Y: Field{[10]uint32{0x00d91fc1, 0x001dbcbe, 0x035dca7a, 0x00951254, 0x02110772, 0x002df99f, 0x03fc825c, 0x02f612a9, 0x00e49807, 0x00303518}}}, + {X: Field{[10]uint32{0x0345e597, 0x000eb904, 0x03cf90e1, 0x03e76e14, 0x039c636b, 0x007bd4a9, 0x00975bbd, 0x036b3887, 0x012195be, 0x002851bd}}, Y: Field{[10]uint32{0x005a770a, 0x0159dabd, 0x014b0767, 0x02c887c2, 0x00ea67a5, 0x02ecc6d0, 0x0295dd2d, 0x03fac26b, 0x030ab053, 0x00296a66}}}, + {X: Field{[10]uint32{0x03421fb8, 0x01b972ec, 0x015d0cf0, 0x03cbbd69, 0x02984971, 0x00edc904, 0x0206b34c, 0x02fd8b9f, 0x01834f6d, 0x00018723}}, Y: Field{[10]uint32{0x023ccd80, 0x03bd9a13, 0x00dd2995, 0x012ce9bf, 0x00806713, 0x03817ad7, 0x01392590, 0x02d2deea, 0x02d99003, 0x001b7f1a}}}, + {X: Field{[10]uint32{0x03b9dc8f, 0x03226e12, 0x01333d08, 0x00fbd7b7, 0x01aba9e9, 0x0149e1f4, 0x00f70353, 0x01a19092, 0x01cee1c2, 0x003f6650}}, Y: Field{[10]uint32{0x019780d5, 0x03ab94f9, 0x0138d743, 0x03f7bbfa, 0x027872b2, 0x02221679, 0x0297e057, 0x039bd1b7, 0x0075bd40, 0x001e907b}}}, + {X: Field{[10]uint32{0x036b35a4, 0x012f862b, 0x03b48712, 0x029aac9f, 0x01889f37, 0x00ce9a2b, 0x03632407, 0x03944edc, 0x023a208e, 0x003da9ad}}, Y: Field{[10]uint32{0x01f422a6, 0x02dbfb20, 0x01862cae, 0x01b9d7b8, 0x0319d575, 0x0158061b, 0x02d3704f, 0x004e2c72, 0x00a8002d, 0x000f7df2}}}, + {X: Field{[10]uint32{0x00e45444, 0x02d4ff13, 0x004e20cb, 0x007bfb33, 0x00dbde42, 0x0096a045, 0x03bf9dab, 0x024ee6f3, 0x01a1cf19, 0x0034931d}}, Y: Field{[10]uint32{0x03dd4a57, 0x00c91a61, 0x02524cb9, 0x03d267c7, 0x02bf7593, 0x003969e2, 0x00b7d181, 0x0307473f, 0x012de84d, 0x00163f87}}}, + {X: Field{[10]uint32{0x02954c11, 0x0208fa29, 0x01018b96, 0x00f05583, 0x037fa8a4, 0x0141de3f, 0x00d1b0f1, 0x030dd888, 0x0028c286, 0x0021e8bf}}, Y: Field{[10]uint32{0x032a8b45, 0x038ccb89, 0x0124b756, 0x00fca9e0, 0x02cc4893, 0x00349d4c, 0x031948da, 0x03b3be5e, 0x018b45aa, 0x000ceb54}}}, + {X: Field{[10]uint32{0x03a43ddc, 0x006bfa61, 0x02e4aeeb, 0x0286a655, 0x0124282c, 0x039ef7d5, 0x001eb85e, 0x02b1b684, 0x03864946, 0x002a2c22}}, Y: Field{[10]uint32{0x03a2a6b8, 0x000720b7, 0x036c3870, 0x0114ac41, 0x00a325b4, 0x03c3a3b7, 0x01591ffd, 0x01a807cc, 0x028bc8a3, 0x001fc03f}}}, + {X: Field{[10]uint32{0x02706ab6, 0x01d1cab8, 0x03c0dae4, 0x00774b94, 0x023c0b34, 0x030e133f, 0x0156efcb, 0x02069a11, 0x02046e78, 0x003851cb}}, Y: Field{[10]uint32{0x0158de05, 0x021a85a7, 0x0127536e, 0x015514f3, 0x00aa589d, 0x0321887e, 0x03691978, 0x023f1a0f, 0x02aa47c5, 0x0020b364}}}, + {X: Field{[10]uint32{0x03963645, 0x0250cb0e, 0x031f8e3e, 0x0201f9c7, 0x032dcdb2, 0x038c4cbe, 0x034781a2, 0x0298f9b9, 0x014fb1b8, 0x00317c25}}, Y: Field{[10]uint32{0x008be2dd, 0x0221d3c0, 0x03e4edbf, 0x00ac011e, 0x02a33050, 0x009835f9, 0x023cb440, 0x02dbec62, 0x031021b0, 0x003554b4}}}, + {X: Field{[10]uint32{0x03a84fb6, 0x02b95081, 0x01021ebf, 0x01d43e85, 0x03c42368, 0x03922e7a, 0x00b4d601, 0x02bbd77a, 0x02c804f8, 0x00072be4}}, Y: Field{[10]uint32{0x03149109, 0x00606409, 0x0267616b, 0x01a5a8b3, 0x02ec1cc1, 0x03c40588, 0x01a64f8f, 0x0394e920, 0x005ac976, 0x002f092e}}}, + {X: Field{[10]uint32{0x01c8381f, 0x024c48fa, 0x011a753a, 0x0358e0f0, 0x000ed3d6, 0x013f8404, 0x02beb463, 0x025f38d3, 0x0355bc6d, 0x0037ceb3}}, Y: Field{[10]uint32{0x0347de3a, 0x03f5a588, 0x009e61af, 0x01f99f8e, 0x03b10195, 0x036b347a, 0x0099c1de, 0x01e9d698, 0x00ca5190, 0x001acf76}}}, + {X: Field{[10]uint32{0x02955911, 0x0233f852, 0x0152db76, 0x0289837b, 0x03107e16, 0x00f5e0e5, 0x009efe9b, 0x01943496, 0x0169af09, 0x001c16ff}}, Y: Field{[10]uint32{0x03d200e4, 0x01f1a4ff, 0x0272d8bb, 0x0148a90b, 0x02297f3b, 0x0150147e, 0x0263d81f, 0x03e6429f, 0x00130b73, 0x003852a9}}}, + {X: Field{[10]uint32{0x02c4c0da, 0x02d11327, 0x023351b7, 0x01e1c8fa, 0x02e88c56, 0x0207c58b, 0x039c1ad9, 0x017cce48, 0x01d2f63b, 0x0023da2e}}, Y: Field{[10]uint32{0x001fff82, 0x032fde54, 0x00bfdf23, 0x03fa5544, 0x01bbea2c, 0x01af8857, 0x01d90c2b, 0x00e61b78, 0x032dba06, 0x00198aa7}}}, + }, + { + {X: Field{[10]uint32{0x02c4c0da, 0x02d11327, 0x023351b7, 0x01e1c8fa, 0x02e88c56, 0x0207c58b, 0x039c1ad9, 0x017cce48, 0x01d2f63b, 0x0023da2e}}, Y: Field{[10]uint32{0x001fff82, 0x032fde54, 0x00bfdf23, 0x03fa5544, 0x01bbea2c, 0x01af8857, 0x01d90c2b, 0x00e61b78, 0x032dba06, 0x00198aa7}}}, + {X: Field{[10]uint32{0x00f27076, 0x011f7e13, 0x03eaee68, 0x02b79d89, 0x01d89858, 0x03f66bd6, 0x02febe77, 0x020563f2, 0x02fd784e, 0x0013526b}}, Y: Field{[10]uint32{0x03aa781e, 0x002d9880, 0x018466b9, 0x0069f7d3, 0x006e0f2d, 0x016729bc, 0x023f2103, 0x0344d79c, 0x0059a10d, 0x00334cbf}}}, + {X: Field{[10]uint32{0x023809fa, 0x00ae3b74, 0x014be18e, 0x02cd4765, 0x00fd845c, 0x009147c2, 0x0293363f, 0x027c8a2e, 0x01be2e50, 0x000e0e07}}, Y: Field{[10]uint32{0x031fed52, 0x001d460c, 0x0324dbd7, 0x032ccb63, 0x003681fc, 0x0083ac73, 0x01405a55, 0x005f72c2, 0x010a0fb9, 0x003928cb}}}, + {X: Field{[10]uint32{0x01b62026, 0x02f2d5ca, 0x01d4ee8d, 0x03822274, 0x038d2a3d, 0x03d716a9, 0x016619e1, 0x01be14df, 0x039e85d5, 0x001d5914}}, Y: Field{[10]uint32{0x02ce0cf3, 0x00b23eb6, 0x01f33417, 0x036552de, 0x01684aac, 0x029c8a49, 0x031df524, 0x02cf1948, 0x01413749, 0x003075a1}}}, + {X: Field{[10]uint32{0x03c2a310, 0x01099225, 0x026303ea, 0x02950048, 0x01f186ae, 0x0291a668, 0x0121b82a, 0x00ab9bda, 0x0324e437, 0x00124989}}, Y: Field{[10]uint32{0x0227ded0, 0x006da057, 0x038ce0c4, 0x004a9d7f, 0x036d1636, 0x01c50c0e, 0x02cfa569, 0x02afe568, 0x0373bca7, 0x0004cdf9}}}, + {X: Field{[10]uint32{0x03663da4, 0x019b0640, 0x00b81f81, 0x02467d74, 0x03a5a362, 0x03112a8a, 0x008a6ed7, 0x01c179a0, 0x02356aa5, 0x001a9992}}, Y: Field{[10]uint32{0x03fc22c4, 0x00c4fecc, 0x004c9c28, 0x0049f9b0, 0x01089916, 0x01afc335, 0x0386ec19, 0x03a62ca7, 0x025954fd, 0x00112684}}}, + {X: Field{[10]uint32{0x02bd2d31, 0x012c1e73, 0x01b8d138, 0x015bfc1b, 0x004dcc1a, 0x011df8be, 0x02253b3e, 0x00324357, 0x028c1a24, 0x0038c195}}, Y: Field{[10]uint32{0x02546e44, 0x02d020e4, 0x03826692, 0x010af8dc, 0x02ffbc80, 0x03df436d, 0x00f2b107, 0x01098222, 0x03e37893, 0x0003ab1b}}}, + {X: Field{[10]uint32{0x03b4a278, 0x0136b355, 0x0082b536, 0x017c7fd0, 0x0078f61a, 0x02b67332, 0x006ff301, 0x009de59d, 0x017ad9df, 0x000842a4}}, Y: Field{[10]uint32{0x007b2231, 0x01c4ff43, 0x00bfc7f2, 0x006abfc8, 0x013789e6, 0x02359cdf, 0x039be81f, 0x0395ede8, 0x035450b5, 0x0019c386}}}, + {X: Field{[10]uint32{0x023136b0, 0x0030e78d, 0x01dd9c53, 0x0366aad0, 0x0374ebf8, 0x00fef58c, 0x01b0e762, 0x033bf09c, 0x000e2428, 0x000ee784}}, Y: Field{[10]uint32{0x00dbbc8a, 0x03b05bdb, 0x01f81953, 0x028ceb4c, 0x02a2ae28, 0x03d1d6c9, 0x01533eb8, 0x02edc77c, 0x00152d16, 0x003ebee6}}}, + {X: Field{[10]uint32{0x0190124e, 0x023ad4f7, 0x0085dea9, 0x01a14a07, 0x02c1e802, 0x036ce055, 0x029a1946, 0x015505df, 0x0293c06c, 0x001ebab2}}, Y: Field{[10]uint32{0x02021e31, 0x001e0408, 0x0104b3f5, 0x03e6e42a, 0x0159bc1b, 0x01b07654, 0x02caff04, 0x0243c13e, 0x03190c13, 0x0037eca6}}}, + {X: Field{[10]uint32{0x03485d3f, 0x023c11cb, 0x03eee960, 0x01a2041e, 0x0317ca07, 0x0177b7bd, 0x036ca80f, 0x0326a4ad, 0x0149712a, 0x002ec2ab}}, Y: Field{[10]uint32{0x00a2f975, 0x00e4940f, 0x00bffe79, 0x03e8c59c, 0x00895a5a, 0x00a5f68d, 0x00d201f7, 0x0151e63b, 0x0053c583, 0x003a9a67}}}, + {X: Field{[10]uint32{0x01ed815e, 0x01c0b541, 0x017b470f, 0x02af0700, 0x0166f440, 0x02551eb4, 0x035fad21, 0x0128cbae, 0x02c679f7, 0x00155a36}}, Y: Field{[10]uint32{0x00602df0, 0x02fd9300, 0x02151d9b, 0x03bb8960, 0x03eb05f7, 0x0341cfca, 0x00d6fe01, 0x02e99160, 0x00742788, 0x001ea17e}}}, + {X: Field{[10]uint32{0x02718dc9, 0x03b4ce8d, 0x023de4ae, 0x0136c044, 0x03e1e58b, 0x02bf8044, 0x028eb197, 0x03f30353, 0x02c8e4ee, 0x001e4242}}, Y: Field{[10]uint32{0x00fae7c5, 0x00c8ac47, 0x0008b963, 0x02dc2ea4, 0x02dd36af, 0x0366aa95, 0x01816cbc, 0x016e3c4f, 0x022b9190, 0x003aaadc}}}, + {X: Field{[10]uint32{0x0244a0c8, 0x0306f70b, 0x01932abe, 0x0100bb8a, 0x032c9be7, 0x031d0db0, 0x01bae600, 0x0250f2f2, 0x02884807, 0x001807a7}}, Y: Field{[10]uint32{0x0200e557, 0x024d04ae, 0x02659547, 0x0169ad1b, 0x01424e0c, 0x03feaeec, 0x00b8cfa9, 0x023b31c5, 0x02aa6fdc, 0x00169e88}}}, + {X: Field{[10]uint32{0x0360c7d1, 0x025a531f, 0x01ad2a26, 0x039f35dd, 0x028dd71d, 0x01526e99, 0x003dbbce, 0x01ed5470, 0x01ade9f9, 0x0039df20}}, Y: Field{[10]uint32{0x02d72449, 0x01607ca0, 0x006d34ec, 0x03dc70a6, 0x03631470, 0x03aa0550, 0x03c3b323, 0x004c8717, 0x0078eef8, 0x000eb3c5}}}, + {X: Field{[10]uint32{0x03231e11, 0x01bf5414, 0x01e3e668, 0x01940da0, 0x011f48e8, 0x02630d82, 0x0399ff91, 0x0217597f, 0x030176af, 0x00393cfe}}, Y: Field{[10]uint32{0x03eb73bc, 0x030e15db, 0x011c9822, 0x013b2547, 0x006cc7e7, 0x0280adca, 0x021a6d0e, 0x013c7059, 0x033ad0ef, 0x000798d8}}}, + }, + { + {X: Field{[10]uint32{0x03231e11, 0x01bf5414, 0x01e3e668, 0x01940da0, 0x011f48e8, 0x02630d82, 0x0399ff91, 0x0217597f, 0x030176af, 0x00393cfe}}, Y: Field{[10]uint32{0x03eb73bc, 0x030e15db, 0x011c9822, 0x013b2547, 0x006cc7e7, 0x0280adca, 0x021a6d0e, 0x013c7059, 0x033ad0ef, 0x000798d8}}}, + {X: Field{[10]uint32{0x03cdaf2f, 0x03b888ce, 0x032953bf, 0x02096e85, 0x0388531a, 0x02f6cd8b, 0x0064110a, 0x01cf807b, 0x03b76867, 0x0012cc32}}, Y: Field{[10]uint32{0x0126b5b7, 0x00cf518f, 0x00575680, 0x020790d2, 0x011fdf3c, 0x01f0f12a, 0x01e2c577, 0x018a6dbe, 0x010265bb, 0x001d318d}}}, + {X: Field{[10]uint32{0x03f05bd6, 0x027c139a, 0x01946539, 0x000c84aa, 0x00a2f56e, 0x02d1c37b, 0x032f51fe, 0x013fa420, 0x0241bee4, 0x0024030c}}, Y: Field{[10]uint32{0x000d358b, 0x00ab4efc, 0x03b15de5, 0x0160f13b, 0x01d69853, 0x01c2c90e, 0x01c72045, 0x03c3d7e5, 0x01e8e8b1, 0x001b0c7e}}}, + {X: Field{[10]uint32{0x0273059f, 0x03a70a69, 0x03a192ff, 0x01414383, 0x03ec1171, 0x01d19205, 0x015b20b1, 0x01c03734, 0x00aa7ae1, 0x0032ed0d}}, Y: Field{[10]uint32{0x027c070c, 0x02a59088, 0x03845b7d, 0x013c2b57, 0x0141d45e, 0x022d77eb, 0x02d49233, 0x02f45d58, 0x000ab4da, 0x00128688}}}, + {X: Field{[10]uint32{0x03105c50, 0x030a3327, 0x005257a7, 0x03bdec4e, 0x0182e0de, 0x00f08cf3, 0x028cc340, 0x0242ab58, 0x0362ab05, 0x0016a340}}, Y: Field{[10]uint32{0x00a4cde9, 0x02c8060e, 0x013c35c9, 0x02299b40, 0x00a605f6, 0x0050ffdd, 0x02a6b724, 0x0394da4d, 0x02b113d4, 0x0030167a}}}, + {X: Field{[10]uint32{0x032e294d, 0x03ecbde9, 0x00dd5be6, 0x028fc034, 0x02f158eb, 0x037dfb71, 0x02289eae, 0x00d2e469, 0x00805cd5, 0x000a77f9}}, Y: Field{[10]uint32{0x00469b52, 0x00dc983b, 0x02e69441, 0x0070e4a7, 0x01d1f196, 0x02281793, 0x0034e758, 0x01cb866d, 0x0026d006, 0x002fd9b6}}}, + {X: Field{[10]uint32{0x02d64feb, 0x03862e6c, 0x0292c647, 0x02964a48, 0x003772f8, 0x01b2e93a, 0x02f3a577, 0x03d82923, 0x01031232, 0x00364fd3}}, Y: Field{[10]uint32{0x00698359, 0x03ef564d, 0x00da37b0, 0x002fbb24, 0x0193e043, 0x01372313, 0x037311c5, 0x009cce88, 0x015d45cb, 0x001e4955}}}, + {X: Field{[10]uint32{0x02de12c0, 0x01e1b841, 0x010e94d4, 0x03161d18, 0x006d9cda, 0x0155c913, 0x02d7b1e7, 0x00b07341, 0x016d9c10, 0x003d1e01}}, Y: Field{[10]uint32{0x025361fe, 0x01db39b2, 0x012d769a, 0x03d826ae, 0x0026c17e, 0x001a1a53, 0x00095e01, 0x00e51b9a, 0x0210f33e, 0x001fc279}}}, + {X: Field{[10]uint32{0x039fbc84, 0x00813350, 0x02016722, 0x0245815e, 0x037e7062, 0x018ab196, 0x014e2bc6, 0x00a1106c, 0x01c6e36f, 0x000bc1da}}, Y: Field{[10]uint32{0x00201bec, 0x0240b787, 0x015d73fb, 0x01a93137, 0x01cca79b, 0x02438852, 0x01df0079, 0x02f777e9, 0x03724d73, 0x002d0d3c}}}, + {X: Field{[10]uint32{0x0026dea2, 0x02cbf4b4, 0x005d8928, 0x0114b167, 0x0187c84c, 0x0269b758, 0x01a1e26d, 0x02efef5c, 0x0248d561, 0x0007773e}}, Y: Field{[10]uint32{0x003de522, 0x0121cf46, 0x0273406f, 0x02314701, 0x00666fd6, 0x0100b008, 0x03ea34d6, 0x00e9f507, 0x001fa992, 0x0031be90}}}, + {X: Field{[10]uint32{0x02a758ea, 0x01fab321, 0x019c4d53, 0x006249fc, 0x01911883, 0x01505b8e, 0x006895a1, 0x000c2656, 0x0380559e, 0x003f9f99}}, Y: Field{[10]uint32{0x037ab649, 0x008b6576, 0x020d1e4f, 0x001d10c4, 0x033b8017, 0x02124947, 0x0008e169, 0x0372e623, 0x0167a281, 0x000e2a9a}}}, + {X: Field{[10]uint32{0x033773f7, 0x03c011b0, 0x019953c7, 0x034d16d6, 0x0150d44f, 0x0278dca8, 0x01410c00, 0x008db4f8, 0x0226f5dd, 0x000d56cc}}, Y: Field{[10]uint32{0x0087c182, 0x00f0ffc6, 0x01109005, 0x01e33389, 0x001e25df, 0x03487f2e, 0x0310eedd, 0x000eb527, 0x00807047, 0x00023b29}}}, + {X: Field{[10]uint32{0x00fffefa, 0x005589a3, 0x01afade7, 0x013dc194, 0x01101804, 0x0030ebe1, 0x01f6f915, 0x00c49f5b, 0x01ca7538, 0x00246ebd}}, Y: Field{[10]uint32{0x037f6faf, 0x00dbcd37, 0x0303dc7d, 0x00439bf4, 0x02f4bef3, 0x01f74f64, 0x01969f12, 0x02f3af97, 0x03119347, 0x00013973}}}, + {X: Field{[10]uint32{0x00785491, 0x037d01a4, 0x025d1dd3, 0x01792baa, 0x035291de, 0x00be19ad, 0x019f43cb, 0x002eb958, 0x00f17f26, 0x0024ac78}}, Y: Field{[10]uint32{0x00be555b, 0x0234d816, 0x00d7b9c9, 0x01df88a2, 0x003985fb, 0x00d396b4, 0x027c1d10, 0x02798f85, 0x00028d8d, 0x00207b11}}}, + {X: Field{[10]uint32{0x0133c546, 0x00245fa3, 0x01af32fc, 0x02cca17b, 0x0382575f, 0x003d7775, 0x02c5373e, 0x01e29f2c, 0x0121cb3f, 0x00111610}}, Y: Field{[10]uint32{0x000b4fd4, 0x01b461c0, 0x0273660a, 0x00f3ecb2, 0x00852f0a, 0x0246b688, 0x0225eae3, 0x01d4e9dc, 0x0377f3f8, 0x000c2364}}}, + {X: Field{[10]uint32{0x00eae29e, 0x02dbab88, 0x01d0716f, 0x00bc3538, 0x02c7034f, 0x01169099, 0x0161537a, 0x03ccc7ae, 0x029b18eb, 0x0023003e}}, Y: Field{[10]uint32{0x0302414b, 0x00a93199, 0x02c54e7d, 0x03ea078d, 0x00c2fada, 0x01cdb25d, 0x01c343a3, 0x008686a7, 0x0267fea5, 0x003be91c}}}, + }, + { + {X: Field{[10]uint32{0x00eae29e, 0x02dbab88, 0x01d0716f, 0x00bc3538, 0x02c7034f, 0x01169099, 0x0161537a, 0x03ccc7ae, 0x029b18eb, 0x0023003e}}, Y: Field{[10]uint32{0x0302414b, 0x00a93199, 0x02c54e7d, 0x03ea078d, 0x00c2fada, 0x01cdb25d, 0x01c343a3, 0x008686a7, 0x0267fea5, 0x003be91c}}}, + {X: Field{[10]uint32{0x018ada5f, 0x0326ac30, 0x02fb3e84, 0x01fca448, 0x03fd7e29, 0x00daf87b, 0x03b5bf96, 0x02d1bea2, 0x00176da2, 0x000933f0}}, Y: Field{[10]uint32{0x038a586b, 0x02984e65, 0x014f268f, 0x028693e0, 0x03ed959c, 0x037b6a49, 0x028714d5, 0x01869a61, 0x03bb079c, 0x003affe3}}}, + {X: Field{[10]uint32{0x03fd913d, 0x025580fa, 0x009eac3f, 0x039bb953, 0x0050a680, 0x030aa348, 0x0107a084, 0x0377e1d3, 0x02a7e907, 0x000d8d8a}}, Y: Field{[10]uint32{0x012e243d, 0x03e6bab1, 0x03aafc44, 0x00435acb, 0x02d830bb, 0x00368aa0, 0x01624437, 0x02bf54d0, 0x00676cb8, 0x00123c9e}}}, + {X: Field{[10]uint32{0x00679da2, 0x00c62565, 0x017edf10, 0x01ff1fc1, 0x0216ddd6, 0x004a4bb1, 0x02ded72a, 0x02f20ba8, 0x0158d4b9, 0x0000129f}}, Y: Field{[10]uint32{0x039ffe26, 0x01fd211d, 0x0228a487, 0x025258fe, 0x0371c3b4, 0x03b1c6ce, 0x031d8147, 0x032dd79a, 0x01b76702, 0x002e62b1}}}, + {X: Field{[10]uint32{0x01132896, 0x02eafe6b, 0x02c967ca, 0x02eadef1, 0x01fcb1e3, 0x03764803, 0x015ad962, 0x00780bca, 0x036df32a, 0x001121e5}}, Y: Field{[10]uint32{0x03685248, 0x0006c4ab, 0x02a7a48c, 0x016989da, 0x0306b40d, 0x0115868c, 0x009a9077, 0x02bf87bf, 0x0060d115, 0x0009ef56}}}, + {X: Field{[10]uint32{0x035732c0, 0x021934dd, 0x037aa859, 0x039c8cdd, 0x02202fe5, 0x032c425b, 0x00a5d1b7, 0x012e6d89, 0x0331f8b7, 0x0023cf33}}, Y: Field{[10]uint32{0x01b9415b, 0x02f79799, 0x00825e73, 0x01dd5216, 0x00a90e68, 0x01f394f6, 0x02f46d99, 0x0394c627, 0x013e2d39, 0x0019fc73}}}, + {X: Field{[10]uint32{0x03a2670c, 0x0055bdaf, 0x033e6e08, 0x00ae8189, 0x007400f8, 0x00cd40c9, 0x02a9caa8, 0x020de22d, 0x02c28bcb, 0x0012934e}}, Y: Field{[10]uint32{0x02c1764d, 0x02e7ff75, 0x03eed808, 0x0132fca6, 0x01493059, 0x03bc0ae7, 0x027711dd, 0x01693c5f, 0x011c0184, 0x001c2aee}}}, + {X: Field{[10]uint32{0x007c4b65, 0x00d3ab72, 0x032a9ccf, 0x0228781e, 0x0196f880, 0x0019b392, 0x036c5e2c, 0x00071ff1, 0x01c4cbd0, 0x003b9f5a}}, Y: Field{[10]uint32{0x0136a95a, 0x023d13b4, 0x002e523e, 0x0266eba5, 0x02c33e89, 0x00c3cbb8, 0x0192abf0, 0x004e0868, 0x026ec1a4, 0x003b3218}}}, + {X: Field{[10]uint32{0x00b24aa7, 0x01abf893, 0x01c530d9, 0x0318e4d1, 0x00903108, 0x03fe3f86, 0x02e6fd89, 0x00600b0e, 0x01190ae9, 0x0017decb}}, Y: Field{[10]uint32{0x02693d7d, 0x0201d0d2, 0x01d0c6d7, 0x01c24f20, 0x03ce8deb, 0x03399f11, 0x023f80a3, 0x03caccc2, 0x0200c4fd, 0x0001dc0d}}}, + {X: Field{[10]uint32{0x03004130, 0x018cb5ff, 0x02b09842, 0x00ce070d, 0x0249fd86, 0x01532d6a, 0x02a14e52, 0x0061ac99, 0x01b5f72d, 0x001435dd}}, Y: Field{[10]uint32{0x036e406d, 0x02e31937, 0x024c3456, 0x0117bbda, 0x032975d9, 0x0004018f, 0x01724346, 0x02955f14, 0x023b0f4e, 0x000d007b}}}, + {X: Field{[10]uint32{0x037fb8bd, 0x006f17cb, 0x0090a419, 0x02857f90, 0x007bc464, 0x025221b6, 0x02c24e6d, 0x024340ab, 0x0051339d, 0x00144e5d}}, Y: Field{[10]uint32{0x03908c0f, 0x012b0b60, 0x00d5a809, 0x034f8fe6, 0x03fafc32, 0x03a05711, 0x008fefda, 0x00efcd2e, 0x003e4764, 0x003f35c5}}}, + {X: Field{[10]uint32{0x00889f3f, 0x007e0e4d, 0x01da7f2a, 0x022d1425, 0x03c4feb2, 0x005a6c3a, 0x02a3469b, 0x00465887, 0x0026f1b2, 0x0021e644}}, Y: Field{[10]uint32{0x03bb792b, 0x00b7e6f0, 0x0037b49e, 0x006fca18, 0x01e932f6, 0x005fc9e7, 0x032f2cb7, 0x00765884, 0x014ca5a9, 0x00377aae}}}, + {X: Field{[10]uint32{0x0236ca73, 0x01d2457b, 0x033ede2b, 0x034daeef, 0x03eac864, 0x03c05221, 0x0029112b, 0x037ee2a9, 0x02d62bfb, 0x0033e0c5}}, Y: Field{[10]uint32{0x02c25534, 0x0248650b, 0x0310f5b4, 0x02636235, 0x001c9615, 0x0037329a, 0x00445089, 0x0275cf8e, 0x018deb5d, 0x00027fad}}}, + {X: Field{[10]uint32{0x019c8f0a, 0x036611af, 0x00e64afc, 0x00b22f61, 0x00af3e9f, 0x0300ea1f, 0x0126603b, 0x02913f0e, 0x00ed297b, 0x001b8845}}, Y: Field{[10]uint32{0x016a2c9b, 0x02452374, 0x0195ebd7, 0x01d743e5, 0x01090bec, 0x00317647, 0x026d50f8, 0x001b89f6, 0x020cc26f, 0x00015646}}}, + {X: Field{[10]uint32{0x0352f97d, 0x024df5ad, 0x036613c8, 0x031d7cd1, 0x025a2efb, 0x0233e985, 0x039d2866, 0x02d27794, 0x029a4c4b, 0x00218437}}, Y: Field{[10]uint32{0x031b1af2, 0x01f73507, 0x003e0805, 0x027d5155, 0x0257ab4d, 0x014cfe67, 0x03cd99b2, 0x002ef24d, 0x03a02b63, 0x0034c665}}}, + {X: Field{[10]uint32{0x00cb3e41, 0x03f77f18, 0x012c0997, 0x013cc22e, 0x03143d08, 0x027a63b4, 0x010cec0a, 0x020a7cf8, 0x00e69dd4, 0x0039e89b}}, Y: Field{[10]uint32{0x032cfd51, 0x02a50873, 0x003e20e8, 0x0301083a, 0x00d0a6b2, 0x02abeec6, 0x01b006a1, 0x02612d1c, 0x02300fa7, 0x000a9d63}}}, + }, + { + {X: Field{[10]uint32{0x00cb3e41, 0x03f77f18, 0x012c0997, 0x013cc22e, 0x03143d08, 0x027a63b4, 0x010cec0a, 0x020a7cf8, 0x00e69dd4, 0x0039e89b}}, Y: Field{[10]uint32{0x032cfd51, 0x02a50873, 0x003e20e8, 0x0301083a, 0x00d0a6b2, 0x02abeec6, 0x01b006a1, 0x02612d1c, 0x02300fa7, 0x000a9d63}}}, + {X: Field{[10]uint32{0x034ae861, 0x0396e45e, 0x02fa9d97, 0x03935b8c, 0x01203c35, 0x01c8227d, 0x038bfb67, 0x03e34034, 0x02ba036b, 0x003d72be}}, Y: Field{[10]uint32{0x0182239c, 0x0308e703, 0x005f3cc9, 0x027154bc, 0x019b3b2a, 0x01020e45, 0x03f99046, 0x01b605ef, 0x038a022a, 0x00067a0e}}}, + {X: Field{[10]uint32{0x02ee42db, 0x027f4afe, 0x0314a70f, 0x016d1cc1, 0x01d9bbbc, 0x007b2ff0, 0x03b6edb9, 0x024543f1, 0x03e7d9b5, 0x00330d09}}, Y: Field{[10]uint32{0x01d87bdb, 0x00a70045, 0x0022dc62, 0x02b639c9, 0x0010e5cb, 0x02c85480, 0x01e3fd3f, 0x031a8621, 0x0041a521, 0x003a8926}}}, + {X: Field{[10]uint32{0x012a9651, 0x035335ef, 0x0182084f, 0x02712532, 0x028f9e50, 0x01fa0150, 0x01f5156d, 0x00fc7c4b, 0x0024ceb6, 0x003a4e24}}, Y: Field{[10]uint32{0x02786824, 0x0378add7, 0x00bfefef, 0x033b19dc, 0x018d7110, 0x019c6abc, 0x0287abaf, 0x019657e4, 0x00872372, 0x0021921a}}}, + {X: Field{[10]uint32{0x02d4a086, 0x00d9b19f, 0x0010eff4, 0x00563a71, 0x00b1d75c, 0x02f2d73d, 0x003c585f, 0x011177b2, 0x01bacd98, 0x002523c1}}, Y: Field{[10]uint32{0x022bca4b, 0x006003e7, 0x022d1a2a, 0x029c70fe, 0x011c2328, 0x00044e50, 0x03450a66, 0x00a8ce0b, 0x009ffb5a, 0x0021932a}}}, + {X: Field{[10]uint32{0x0296e4f1, 0x029c594b, 0x00030cb0, 0x01802ba0, 0x02ff5f01, 0x00d7bf32, 0x01777083, 0x0065f880, 0x008f0198, 0x0015aec5}}, Y: Field{[10]uint32{0x02b0582e, 0x027c067b, 0x030eb588, 0x0348012b, 0x037313d1, 0x038c3aa7, 0x0303ed8b, 0x0028cefa, 0x00a56130, 0x00282561}}}, + {X: Field{[10]uint32{0x03542c21, 0x02fa9b2d, 0x00c15c0c, 0x034a3a99, 0x03ae19f4, 0x01475b50, 0x016fc454, 0x026b2419, 0x01629291, 0x00096106}}, Y: Field{[10]uint32{0x032bfabf, 0x02f8c659, 0x02d7b3be, 0x021b930a, 0x01f3e3a1, 0x031d44f5, 0x025daa4c, 0x00912007, 0x031f1cdb, 0x003f2cd6}}}, + {X: Field{[10]uint32{0x00ddab8b, 0x03506b9f, 0x00e6fcf2, 0x00494f1a, 0x039f0e4d, 0x020b430d, 0x0116900d, 0x0095afb4, 0x01d87829, 0x00099156}}, Y: Field{[10]uint32{0x001de473, 0x0192d140, 0x031e6c9f, 0x02bce72b, 0x037a8631, 0x00d01cb5, 0x03bc6370, 0x0144b3bd, 0x011926d3, 0x001e796f}}}, + {X: Field{[10]uint32{0x001ecbf8, 0x01187d03, 0x017ca43c, 0x037a6bbb, 0x036489f0, 0x007a1087, 0x029754cc, 0x0314948a, 0x01c41373, 0x001f84b3}}, Y: Field{[10]uint32{0x00bed615, 0x016e336c, 0x019f59d4, 0x00763f87, 0x01c969f6, 0x03934496, 0x03f94dab, 0x0320dc50, 0x0388888d, 0x001c4a13}}}, + {X: Field{[10]uint32{0x018a26c1, 0x028a3ee2, 0x0304ae2d, 0x0285ce4e, 0x019a954f, 0x0309b871, 0x02351579, 0x014aedba, 0x00fd373b, 0x002da832}}, Y: Field{[10]uint32{0x0278217c, 0x0143b6a2, 0x01a06f55, 0x03a162ad, 0x00fc94a5, 0x02f69feb, 0x0101e3fe, 0x01d2526a, 0x03bfda03, 0x0017bc64}}}, + {X: Field{[10]uint32{0x00557d86, 0x01994705, 0x03ff417e, 0x011e3999, 0x031cfeec, 0x028169b3, 0x02b91ca7, 0x010a99dc, 0x02ff2a37, 0x0012e3b0}}, Y: Field{[10]uint32{0x01167eb9, 0x026c646d, 0x03692bdd, 0x03bc3f0f, 0x0328d5f2, 0x0149eb17, 0x024072de, 0x015eac52, 0x03ff04c1, 0x003f79b0}}}, + {X: Field{[10]uint32{0x01f23d1f, 0x015fd660, 0x036d8a4c, 0x035c8300, 0x02b6b25f, 0x03f62829, 0x03d489e1, 0x002eeef4, 0x00153d67, 0x002ce63a}}, Y: Field{[10]uint32{0x032ff3fc, 0x00faffe0, 0x016cd158, 0x022b4985, 0x02ea791d, 0x02c02e94, 0x037feb2f, 0x03d1fc1f, 0x0022572d, 0x001a7d67}}}, + {X: Field{[10]uint32{0x0380763c, 0x020b4ed1, 0x0291d52b, 0x017a4995, 0x025f8a6d, 0x025eb01f, 0x02436dc6, 0x00e9094c, 0x01073396, 0x003f3570}}, Y: Field{[10]uint32{0x00e851cb, 0x039d080e, 0x023a4b54, 0x00b9c591, 0x00b119b2, 0x03dcb8e3, 0x0320db35, 0x00b118ed, 0x03e2e552, 0x0006376a}}}, + {X: Field{[10]uint32{0x03e9fc8d, 0x0311e98c, 0x028ad2b1, 0x0026093c, 0x0348b848, 0x0118c69c, 0x00d0b205, 0x0177fe9b, 0x01c1bb42, 0x0018d283}}, Y: Field{[10]uint32{0x033f87b6, 0x01fcc2c9, 0x00616958, 0x02863b57, 0x03519ad5, 0x03792a73, 0x0205a657, 0x012db2bf, 0x021fe75a, 0x0035d6f8}}}, + {X: Field{[10]uint32{0x018ef686, 0x00ef8c17, 0x02e66bce, 0x03d0089c, 0x03f68e48, 0x02099b94, 0x038a5daf, 0x032f9488, 0x00ee5843, 0x002403cb}}, Y: Field{[10]uint32{0x0121a8cf, 0x029259f8, 0x016d5073, 0x03d0f245, 0x00596cdf, 0x00d27444, 0x01c551b1, 0x01096b58, 0x0155ec60, 0x001ccab0}}}, + {X: Field{[10]uint32{0x026b80ef, 0x00a7acf7, 0x0024f3cf, 0x0259f5e5, 0x0171cbcb, 0x00ef2f71, 0x03540c22, 0x00bb2348, 0x020ee366, 0x002d9167}}, Y: Field{[10]uint32{0x0271ba45, 0x02fc2d86, 0x01b2ff30, 0x01b5238d, 0x03c4b3ae, 0x0159876c, 0x01adf16e, 0x0381b787, 0x036d06f3, 0x00019f21}}}, + }, + { + {X: Field{[10]uint32{0x026b80ef, 0x00a7acf7, 0x0024f3cf, 0x0259f5e5, 0x0171cbcb, 0x00ef2f71, 0x03540c22, 0x00bb2348, 0x020ee366, 0x002d9167}}, Y: Field{[10]uint32{0x0271ba45, 0x02fc2d86, 0x01b2ff30, 0x01b5238d, 0x03c4b3ae, 0x0159876c, 0x01adf16e, 0x0381b787, 0x036d06f3, 0x00019f21}}}, + {X: Field{[10]uint32{0x033eb51f, 0x03bcdd40, 0x00211253, 0x01daf9e7, 0x03b68905, 0x007d0564, 0x0136f730, 0x00f22393, 0x00f0d982, 0x0039763a}}, Y: Field{[10]uint32{0x0262a2d9, 0x016f6596, 0x0354979d, 0x011b67c3, 0x00e509dc, 0x023fbbbc, 0x0316a57d, 0x00f812ae, 0x01b7861e, 0x0013707a}}}, + {X: Field{[10]uint32{0x019888e9, 0x033c9e4c, 0x00a8b439, 0x01afc912, 0x033d12ba, 0x0259a059, 0x0260d302, 0x029b8b77, 0x02773ac3, 0x0007e43a}}, Y: Field{[10]uint32{0x03113b79, 0x037f25fb, 0x022e656f, 0x03fb9654, 0x00213751, 0x007ae5aa, 0x00153d27, 0x02843a56, 0x027c15da, 0x00226f8d}}}, + {X: Field{[10]uint32{0x03155e64, 0x019d9203, 0x0011737a, 0x013ea28c, 0x01ab66be, 0x006eb837, 0x02b0f732, 0x0230f715, 0x03f77dbc, 0x002a7289}}, Y: Field{[10]uint32{0x021b3297, 0x03cccf15, 0x030ae1f3, 0x02086f2b, 0x00875d41, 0x0300b401, 0x017d2246, 0x00535346, 0x035678fb, 0x003d2ecc}}}, + {X: Field{[10]uint32{0x0162222c, 0x03bedbcd, 0x032c6085, 0x01e6479b, 0x02de0344, 0x00d2d4ae, 0x0302bad3, 0x0382b5b9, 0x014dedff, 0x0004e939}}, Y: Field{[10]uint32{0x00200145, 0x0059a32a, 0x004c08cb, 0x01deb724, 0x02d4f9c5, 0x03582694, 0x00ac2f81, 0x03a04ecb, 0x014e5816, 0x0032759f}}}, + {X: Field{[10]uint32{0x01bf6c42, 0x02acf770, 0x0075393e, 0x026c4662, 0x02f7793d, 0x01b3b9d3, 0x03465481, 0x00171fb9, 0x033cd6c1, 0x00340b86}}, Y: Field{[10]uint32{0x03bc54cc, 0x018ca3e1, 0x02aac133, 0x026e4c6d, 0x02bca587, 0x00349149, 0x0332270d, 0x00896049, 0x00f3ca8e, 0x002682dd}}}, + {X: Field{[10]uint32{0x003b46bb, 0x0393703d, 0x02525437, 0x018feb24, 0x0112ed3a, 0x0211576f, 0x0007c05d, 0x02ab7475, 0x02bf233c, 0x00186647}}, Y: Field{[10]uint32{0x0020a848, 0x03d64073, 0x00d8ef48, 0x027294bb, 0x011ca872, 0x01beeb7c, 0x02f38716, 0x03924a54, 0x0308f3fd, 0x00007178}}}, + {X: Field{[10]uint32{0x02ee247c, 0x02f18a75, 0x00ee06d4, 0x0211fd47, 0x011f478e, 0x0073f9d6, 0x03a10561, 0x035fc97a, 0x01800686, 0x001a3edc}}, Y: Field{[10]uint32{0x0201865d, 0x03e08b46, 0x03c9dae1, 0x002c131c, 0x039a8d58, 0x0006c301, 0x03354275, 0x0258d9cd, 0x023462dd, 0x003344b4}}}, + {X: Field{[10]uint32{0x021add3b, 0x02f8f774, 0x03d8f7e5, 0x013d15c9, 0x018b9a94, 0x03458984, 0x0039cdb0, 0x034e1d24, 0x02a4b787, 0x003a89eb}}, Y: Field{[10]uint32{0x028ce7dd, 0x038a476d, 0x01be71b5, 0x035a3938, 0x0278b212, 0x00970bd8, 0x023ceb23, 0x005f795c, 0x01e6e42a, 0x0031c3fc}}}, + {X: Field{[10]uint32{0x02da1f54, 0x016af6f8, 0x025df934, 0x03088c50, 0x021b2b52, 0x024d1445, 0x03550ab1, 0x0183ae61, 0x03b23df2, 0x001c4dfd}}, Y: Field{[10]uint32{0x01c3edbc, 0x02350db3, 0x01bb84af, 0x03551b3f, 0x03ebf081, 0x03c98029, 0x00dacb17, 0x0201d397, 0x02d80435, 0x0017f9e2}}}, + {X: Field{[10]uint32{0x011ff757, 0x02be2ed8, 0x0226e6e8, 0x01d07130, 0x029b4ce9, 0x01b8adb6, 0x01010f8b, 0x03f552ea, 0x01356b7f, 0x00165194}}, Y: Field{[10]uint32{0x014d031a, 0x019bb2a2, 0x03e3b28a, 0x01edfeff, 0x01961bbc, 0x017101be, 0x02038d01, 0x009d4010, 0x020ce5df, 0x000d844d}}}, + {X: Field{[10]uint32{0x036c15c2, 0x03d1fc63, 0x00f1ca1e, 0x005323ce, 0x003de764, 0x027450d2, 0x01739813, 0x01d5ffa8, 0x0052bca1, 0x002115aa}}, Y: Field{[10]uint32{0x03174134, 0x03bf0ca2, 0x03671ff1, 0x002615be, 0x034cc90f, 0x0041e79f, 0x0349ec37, 0x00b37bf4, 0x0246d484, 0x00386e76}}}, + {X: Field{[10]uint32{0x036160b5, 0x009628d8, 0x02bc0676, 0x0091c39f, 0x00ccc53f, 0x000247b0, 0x003af797, 0x00ca43a1, 0x023915f7, 0x0005ac9b}}, Y: Field{[10]uint32{0x00a1dc0e, 0x0097efd6, 0x03ef8146, 0x02b1c2e8, 0x00e1363a, 0x018d9535, 0x03643524, 0x03be2ed8, 0x025a6302, 0x000183d5}}}, + {X: Field{[10]uint32{0x021b793e, 0x0077a4e3, 0x025183d6, 0x028ac34b, 0x01d36aee, 0x033eab93, 0x002eccf2, 0x00739970, 0x017c9835, 0x0013c545}}, Y: Field{[10]uint32{0x03ba9889, 0x03307f70, 0x007aab4f, 0x012cd529, 0x02c0daff, 0x03352833, 0x01da9db9, 0x02e4e7f2, 0x0366079d, 0x00302538}}}, + {X: Field{[10]uint32{0x03b32db8, 0x0134a24d, 0x0391f396, 0x0127d91d, 0x01c91ed7, 0x010b3aa1, 0x02a143c8, 0x027e4c6f, 0x0295c455, 0x000092d4}}, Y: Field{[10]uint32{0x0264f760, 0x0153eaaa, 0x001a9594, 0x0044816e, 0x0062ab68, 0x031796fa, 0x02e2821c, 0x00c271ed, 0x038f5bff, 0x001827fb}}}, + {X: Field{[10]uint32{0x016943e8, 0x0283d6d2, 0x005a5ded, 0x0319f9cf, 0x031d6f1f, 0x0063c188, 0x03234aa1, 0x02e101e4, 0x00c8280b, 0x0035a2a0}}, Y: Field{[10]uint32{0x03133120, 0x0321099a, 0x0295a294, 0x023de114, 0x035b0e7b, 0x01ec38a2, 0x00b1f917, 0x021b4031, 0x01fff4b5, 0x0036e2ea}}}, + }, + { + {X: Field{[10]uint32{0x016943e8, 0x0283d6d2, 0x005a5ded, 0x0319f9cf, 0x031d6f1f, 0x0063c188, 0x03234aa1, 0x02e101e4, 0x00c8280b, 0x0035a2a0}}, Y: Field{[10]uint32{0x03133120, 0x0321099a, 0x0295a294, 0x023de114, 0x035b0e7b, 0x01ec38a2, 0x00b1f917, 0x021b4031, 0x01fff4b5, 0x0036e2ea}}}, + {X: Field{[10]uint32{0x0012b6fd, 0x02888b29, 0x02b828bd, 0x00f1bdc0, 0x00aced05, 0x01d48dcf, 0x02f8efb3, 0x0102f900, 0x009c677a, 0x003c5a90}}, Y: Field{[10]uint32{0x00a052da, 0x036b9dfb, 0x03ca4268, 0x0164927a, 0x02165406, 0x0138c393, 0x026a75a7, 0x009e675e, 0x01171453, 0x000a904c}}}, + {X: Field{[10]uint32{0x00a1c4f9, 0x010aa863, 0x0228235b, 0x00d32adf, 0x004f4efe, 0x0187c5bd, 0x000b83da, 0x01ca3131, 0x038f22bd, 0x001e057d}}, Y: Field{[10]uint32{0x0378bc15, 0x007a8dad, 0x011e19ab, 0x039855df, 0x015cb42d, 0x011630d7, 0x0193cf31, 0x02bda9f7, 0x01e8cd39, 0x00307180}}}, + {X: Field{[10]uint32{0x026dd4e4, 0x0282db8c, 0x018325c1, 0x00bdafb6, 0x01b89f4f, 0x025dbe13, 0x0237f699, 0x01bd0bef, 0x0106ab76, 0x0010552d}}, Y: Field{[10]uint32{0x035ded1c, 0x0164a541, 0x02dd46c8, 0x03674788, 0x02414ea9, 0x004097fd, 0x006e44d6, 0x02622253, 0x035043c5, 0x0008eb41}}}, + {X: Field{[10]uint32{0x028c8530, 0x01b870fb, 0x00d8e6d2, 0x0207be3d, 0x01512df6, 0x005a9b1b, 0x0377c640, 0x01005db8, 0x03cda0ec, 0x0030e49c}}, Y: Field{[10]uint32{0x018446c7, 0x00c3c3de, 0x01715c40, 0x02f68bbb, 0x0050edfc, 0x0070c666, 0x001d3944, 0x00f23a74, 0x02425743, 0x0023106f}}}, + {X: Field{[10]uint32{0x03ed5996, 0x0133a2d0, 0x02f53bde, 0x01664d82, 0x006831fe, 0x00a06e49, 0x02fbc903, 0x0293a924, 0x03e9fe99, 0x000691ad}}, Y: Field{[10]uint32{0x00c85cae, 0x013b447a, 0x0345c2ee, 0x02a7bd49, 0x01508794, 0x0018fafd, 0x03ee084a, 0x03715c38, 0x001ea3f1, 0x001a0f3a}}}, + {X: Field{[10]uint32{0x037a26c1, 0x00902ec8, 0x036a531f, 0x0163036f, 0x01166c6e, 0x00740ec9, 0x0122431c, 0x0046c09d, 0x0047f584, 0x00368c5d}}, Y: Field{[10]uint32{0x00f74d6f, 0x020dbb3b, 0x01525f51, 0x03175ea0, 0x03d36836, 0x0096762d, 0x0384167c, 0x0231a748, 0x03b87f5d, 0x001d4ee5}}}, + {X: Field{[10]uint32{0x037f0246, 0x0069e98f, 0x03ddf4c5, 0x0127f1c9, 0x0293e86e, 0x02d655ba, 0x00a8d4d0, 0x02570420, 0x012769cc, 0x002dcf19}}, Y: Field{[10]uint32{0x022a407b, 0x0394593a, 0x014e5597, 0x03931b95, 0x021a0d72, 0x016db07a, 0x0135893c, 0x032a752d, 0x03107174, 0x002699f6}}}, + {X: Field{[10]uint32{0x0339dc49, 0x018a2a4d, 0x01603d2b, 0x03699bd5, 0x02239392, 0x02ffc8c6, 0x024ac508, 0x0039b041, 0x02cb02af, 0x001a92f9}}, Y: Field{[10]uint32{0x02edd5cf, 0x028ae77c, 0x00a4d3e6, 0x0132c529, 0x00ab7e2b, 0x003ea016, 0x00166e36, 0x001d65f7, 0x03aa2a89, 0x003c5763}}}, + {X: Field{[10]uint32{0x00f8fb8c, 0x026fe776, 0x01e148ad, 0x026ea96f, 0x014cdc2b, 0x031cc044, 0x012facb5, 0x00803254, 0x027060d8, 0x000d966e}}, Y: Field{[10]uint32{0x00c8a3d1, 0x011ae31f, 0x0313575e, 0x0353912e, 0x031e142e, 0x031d261f, 0x01725f8e, 0x00685c4e, 0x01e806e0, 0x0013b9ea}}}, + {X: Field{[10]uint32{0x02987fac, 0x03a28311, 0x02f6798b, 0x021902a1, 0x008bc90f, 0x03b2628f, 0x02982603, 0x01fc4d13, 0x029f13ae, 0x00007df1}}, Y: Field{[10]uint32{0x01174c68, 0x0079ce06, 0x03c263f9, 0x038867da, 0x01cb7f5d, 0x00a6adbe, 0x031036e3, 0x0288b796, 0x003f36fd, 0x002753b3}}}, + {X: Field{[10]uint32{0x022e607b, 0x034d673b, 0x036aa1f4, 0x03b1b03c, 0x0388aa1e, 0x015ff74a, 0x01111f56, 0x01dcb083, 0x0367fd31, 0x0001dccf}}, Y: Field{[10]uint32{0x00614763, 0x03cc4773, 0x017d26a2, 0x03816f80, 0x0089e3bd, 0x02ec55bd, 0x0263a8c5, 0x020a17ab, 0x00fbac17, 0x003f67fa}}}, + {X: Field{[10]uint32{0x02daba4d, 0x00e86f5d, 0x016261d3, 0x003880c6, 0x039c65fb, 0x023e8af2, 0x03062edd, 0x034e072d, 0x0001761f, 0x00155fa5}}, Y: Field{[10]uint32{0x03a52316, 0x01d286ed, 0x0190a513, 0x03d7e90d, 0x02c5e9b8, 0x01732f21, 0x0135cfa1, 0x029f811b, 0x033a601f, 0x001e9fa3}}}, + {X: Field{[10]uint32{0x0005fbdd, 0x00b6734f, 0x001396e2, 0x0149d392, 0x0279589d, 0x01abe80c, 0x0120654b, 0x003120e2, 0x010a0031, 0x0038f91d}}, Y: Field{[10]uint32{0x0135b883, 0x0088c745, 0x02ffbcba, 0x02ff173e, 0x00b46587, 0x01868481, 0x02350499, 0x00964014, 0x0301abad, 0x0003e9e5}}}, + {X: Field{[10]uint32{0x01f5341a, 0x03d4bfca, 0x036b8038, 0x00b19a58, 0x019cc7a3, 0x01ec4050, 0x029d40ea, 0x0216a4ec, 0x02821998, 0x000eb6b6}}, Y: Field{[10]uint32{0x0186c6cc, 0x016024d9, 0x00fbcb51, 0x0396d17a, 0x03e9d6d2, 0x01aac405, 0x02e35bf3, 0x00da7d54, 0x02228999, 0x002ffa87}}}, + {X: Field{[10]uint32{0x028d3d5d, 0x016603f0, 0x01cea409, 0x02e5cd12, 0x009612ae, 0x001e8c2c, 0x01c02709, 0x0201094b, 0x017df65c, 0x000c92bb}}, Y: Field{[10]uint32{0x02ab7c84, 0x00892be5, 0x02843967, 0x0031f8cc, 0x0319213b, 0x02bb07d3, 0x030c0c35, 0x007cbfc4, 0x025774b6, 0x0019228d}}}, + }, + { + {X: Field{[10]uint32{0x028d3d5d, 0x016603f0, 0x01cea409, 0x02e5cd12, 0x009612ae, 0x001e8c2c, 0x01c02709, 0x0201094b, 0x017df65c, 0x000c92bb}}, Y: Field{[10]uint32{0x02ab7c84, 0x00892be5, 0x02843967, 0x0031f8cc, 0x0319213b, 0x02bb07d3, 0x030c0c35, 0x007cbfc4, 0x025774b6, 0x0019228d}}}, + {X: Field{[10]uint32{0x02919749, 0x00e0e06c, 0x01b1fa8f, 0x012a3783, 0x03f72b3e, 0x02035c80, 0x01326818, 0x012408a3, 0x031ea26f, 0x000cb24c}}, Y: Field{[10]uint32{0x0290b5e3, 0x03a5ec3c, 0x02b09631, 0x02f6b8e6, 0x00268a4a, 0x01bcf6ee, 0x01a2f02b, 0x0272d5a5, 0x032b3420, 0x0035f349}}}, + {X: Field{[10]uint32{0x03d53ed3, 0x0245d60b, 0x02ccef5c, 0x03ee7695, 0x01163f74, 0x0077df12, 0x00f60b93, 0x01cab56e, 0x03d59967, 0x00082102}}, Y: Field{[10]uint32{0x027a7132, 0x010ff946, 0x00899871, 0x01ce539c, 0x025487c4, 0x01aebeb0, 0x03bd476a, 0x02090d21, 0x0097cec1, 0x003ca64d}}}, + {X: Field{[10]uint32{0x039795e4, 0x0308949e, 0x02b8e1e1, 0x02db8611, 0x0069c161, 0x03fb1ac7, 0x002f6a70, 0x00de1528, 0x033b3b98, 0x003aca4b}}, Y: Field{[10]uint32{0x0253a0fe, 0x03a74beb, 0x01c6f5b7, 0x01d42444, 0x0357131d, 0x005160d6, 0x016634af, 0x02fa005a, 0x025a96ee, 0x002310f0}}}, + {X: Field{[10]uint32{0x00a35b35, 0x00b2ed62, 0x0121edbd, 0x02297028, 0x011ab5d8, 0x01623aff, 0x013d029e, 0x00e6eef4, 0x03f60eb3, 0x0039adaf}}, Y: Field{[10]uint32{0x001007bd, 0x00a4f6e7, 0x019c7c57, 0x0274efa6, 0x01fe3b6c, 0x00d65877, 0x02f43e38, 0x034bcc99, 0x02bd3300, 0x000697fc}}}, + {X: Field{[10]uint32{0x0032f9a2, 0x02e38a48, 0x006ccc48, 0x0143e87f, 0x03ce566f, 0x007fe3d8, 0x02374cb3, 0x009903b4, 0x02bd9a6b, 0x00096ab1}}, Y: Field{[10]uint32{0x0351d4f0, 0x008c284a, 0x033d9e76, 0x02ef1067, 0x02559883, 0x013c643d, 0x0332f54f, 0x0151b05b, 0x023ba644, 0x003d69b1}}}, + {X: Field{[10]uint32{0x00360dd3, 0x03be34b0, 0x022090d4, 0x00db6143, 0x0347a8a8, 0x038338ee, 0x030b8086, 0x0266ca22, 0x03745be4, 0x003814c5}}, Y: Field{[10]uint32{0x0024f87b, 0x03b3644f, 0x03dc2b2a, 0x037a6040, 0x0061b987, 0x016da805, 0x0009582b, 0x00bce736, 0x0371a5d9, 0x0037070e}}}, + {X: Field{[10]uint32{0x01303fdd, 0x00e755e2, 0x02d35aea, 0x01fc6747, 0x014d7145, 0x00127ef8, 0x020d4310, 0x017bcb98, 0x0201df3b, 0x0029968e}}, Y: Field{[10]uint32{0x02e68703, 0x0112a340, 0x013cadad, 0x00093ebb, 0x0286861d, 0x003b4b1d, 0x0343d8d9, 0x0171bee3, 0x00940cff, 0x001e63a8}}}, + {X: Field{[10]uint32{0x0098dfea, 0x011998b4, 0x038797c1, 0x0324ba99, 0x03fadcb3, 0x020e9795, 0x018e5d2a, 0x01b16780, 0x033a7788, 0x002a054e}}, Y: Field{[10]uint32{0x026d892f, 0x026a77db, 0x034158a4, 0x03dd0b6b, 0x03b1b5e0, 0x01e14f80, 0x018db9c5, 0x0183f14f, 0x016461d0, 0x000a91ce}}}, + {X: Field{[10]uint32{0x024c9489, 0x00c354b4, 0x00a98616, 0x039b8539, 0x00c0aef4, 0x01ba754a, 0x027887ff, 0x019f0a68, 0x0315d9d5, 0x0018a06e}}, Y: Field{[10]uint32{0x01f42bc6, 0x01fc9ae7, 0x033ad918, 0x01374c86, 0x0145fd96, 0x01ba6efd, 0x02738f45, 0x02a19648, 0x01a0908d, 0x000bf4f1}}}, + {X: Field{[10]uint32{0x03cecfa5, 0x039de922, 0x03b020a7, 0x03686c5a, 0x032a0d62, 0x00e3b68e, 0x034695c6, 0x02b76b7a, 0x03b30fec, 0x0013c170}}, Y: Field{[10]uint32{0x01d37b53, 0x034092a5, 0x008cd2ec, 0x00c7c06d, 0x01447ee4, 0x01654d2e, 0x01632361, 0x0109beb7, 0x01ea603d, 0x0014e926}}}, + {X: Field{[10]uint32{0x00445a7a, 0x00c72ea5, 0x01ec5901, 0x03c2073c, 0x01df9535, 0x01807235, 0x02f11b6c, 0x031afec4, 0x03bc9f06, 0x003e0bfb}}, Y: Field{[10]uint32{0x002a7a98, 0x02b38619, 0x011e5963, 0x02d91903, 0x00b51c83, 0x02502d29, 0x003942c1, 0x01ad9d54, 0x03bdc6fb, 0x00252ecd}}}, + {X: Field{[10]uint32{0x004b96aa, 0x039d9642, 0x03cce461, 0x00d548aa, 0x02d02986, 0x028ee603, 0x02405e1a, 0x02a46f89, 0x02b99f67, 0x00364c26}}, Y: Field{[10]uint32{0x02b28a86, 0x0313cdf0, 0x02978f26, 0x03eebf3f, 0x03d3b6c9, 0x009d32d7, 0x0210f066, 0x03155f5f, 0x032a9b4e, 0x001bbe66}}}, + {X: Field{[10]uint32{0x02b7d2d5, 0x03750ac5, 0x02a66f6f, 0x0134755b, 0x022637b8, 0x00bbd40b, 0x030f3d32, 0x01080f20, 0x03aa9783, 0x0028a16a}}, Y: Field{[10]uint32{0x0001f99c, 0x01754be4, 0x013e9c40, 0x0086dadd, 0x02d86573, 0x0042cb8a, 0x03952dfe, 0x01eb1a4a, 0x0292cd1b, 0x00395ba5}}}, + {X: Field{[10]uint32{0x038fcf0e, 0x02e34167, 0x026facf7, 0x03f79f12, 0x01d65b6f, 0x03aa8d04, 0x01c3446d, 0x00b4d6ea, 0x00a13856, 0x001f561f}}, Y: Field{[10]uint32{0x00bc9459, 0x03068276, 0x0380a501, 0x002b4c8d, 0x00c46390, 0x033f5ab4, 0x023400b6, 0x0131849c, 0x00038830, 0x0029ca57}}}, + {X: Field{[10]uint32{0x01054c96, 0x02f4dcff, 0x00a888e8, 0x00eea347, 0x00eec414, 0x017fb977, 0x011dfdbe, 0x03987db5, 0x014919cd, 0x00137e70}}, Y: Field{[10]uint32{0x02d10d5d, 0x02eb01b2, 0x0090192e, 0x03370a21, 0x00b5d506, 0x02876175, 0x00974c23, 0x021ca014, 0x0051092d, 0x00000d7b}}}, + }, + { + {X: Field{[10]uint32{0x01054c96, 0x02f4dcff, 0x00a888e8, 0x00eea347, 0x00eec414, 0x017fb977, 0x011dfdbe, 0x03987db5, 0x014919cd, 0x00137e70}}, Y: Field{[10]uint32{0x02d10d5d, 0x02eb01b2, 0x0090192e, 0x03370a21, 0x00b5d506, 0x02876175, 0x00974c23, 0x021ca014, 0x0051092d, 0x00000d7b}}}, + {X: Field{[10]uint32{0x01a49e04, 0x01ac3f07, 0x00d70c0c, 0x015395ea, 0x00e9de45, 0x012e1c22, 0x01317d4e, 0x02663349, 0x02d8d2cc, 0x003b4cb2}}, Y: Field{[10]uint32{0x001db9e0, 0x0048345f, 0x02b7db63, 0x02b2d27e, 0x0352da9f, 0x02167482, 0x001ca375, 0x00081295, 0x035f1d03, 0x0004a7fb}}}, + {X: Field{[10]uint32{0x01ef001d, 0x00897697, 0x0227ef4f, 0x035a626e, 0x0321f9bb, 0x0278ed92, 0x020bd1c0, 0x00b2bc83, 0x032db27e, 0x00295268}}, Y: Field{[10]uint32{0x00624783, 0x036c69fc, 0x0305add5, 0x00a98b25, 0x02eb141e, 0x02296515, 0x00cc30ed, 0x019b2f7d, 0x027906d9, 0x001e66de}}}, + {X: Field{[10]uint32{0x0083f855, 0x0106353a, 0x00016cb7, 0x032d8f0d, 0x0228c36d, 0x031c0d9b, 0x009e4111, 0x0183c601, 0x03724d63, 0x003a086a}}, Y: Field{[10]uint32{0x01852ddf, 0x03831a96, 0x023efed4, 0x031853b0, 0x018b3b19, 0x0105b3d6, 0x010d4115, 0x00f38d9f, 0x03f863f5, 0x002b7bf2}}}, + {X: Field{[10]uint32{0x012ed4cb, 0x03bc7971, 0x02c5a05a, 0x03ecf027, 0x02c954de, 0x00d4cb9b, 0x0308bd98, 0x03b3448f, 0x0330da07, 0x001f9e63}}, Y: Field{[10]uint32{0x00bb9462, 0x005981e5, 0x037a1257, 0x006ffe7c, 0x03b17357, 0x03bcbc15, 0x01a9549d, 0x02b20c10, 0x00c4a24d, 0x00348f73}}}, + {X: Field{[10]uint32{0x0206e37a, 0x01de2b10, 0x00731a24, 0x02523141, 0x034d8c18, 0x02d689d3, 0x00e83f46, 0x02000b3d, 0x0387f286, 0x002d49aa}}, Y: Field{[10]uint32{0x00c5ccab, 0x019e3ffc, 0x0392abf3, 0x026c03e8, 0x0128ce53, 0x0029bc63, 0x00aaced6, 0x00363b57, 0x01d77810, 0x001907cd}}}, + {X: Field{[10]uint32{0x03630834, 0x00e83ef4, 0x00067fdf, 0x00a18f6b, 0x008463f1, 0x02a32042, 0x01b9e96b, 0x011e0eb5, 0x02003151, 0x000893e8}}, Y: Field{[10]uint32{0x007a2272, 0x0311cdf1, 0x00f75cd3, 0x013b0294, 0x013d6292, 0x0247427d, 0x00b70fa3, 0x036970f1, 0x0232bb3e, 0x002ef953}}}, + {X: Field{[10]uint32{0x0041742e, 0x03d67bad, 0x006e9fbf, 0x011ebce0, 0x032f14a5, 0x0325a4e9, 0x015452fb, 0x03484bd1, 0x0194e51a, 0x000fc362}}, Y: Field{[10]uint32{0x03ecadbe, 0x014d8ef3, 0x03d958c6, 0x00b0eb44, 0x031e205e, 0x011e9b82, 0x025cb0e8, 0x00f71117, 0x0023f28c, 0x003ef5db}}}, + {X: Field{[10]uint32{0x003c19d7, 0x01927456, 0x0357bb67, 0x0116b0b3, 0x02bbbb5e, 0x0108a3bc, 0x01a25cce, 0x00e7904a, 0x00cc600a, 0x0030b528}}, Y: Field{[10]uint32{0x0107928d, 0x00a2e0b1, 0x01c9772f, 0x020c5cd1, 0x0126804a, 0x03d04983, 0x0183b5f7, 0x018a5350, 0x00f9c080, 0x00196b68}}}, + {X: Field{[10]uint32{0x01848116, 0x01507957, 0x027bba04, 0x0003f278, 0x001cc9b1, 0x03a52115, 0x0072ce10, 0x034ef814, 0x019abb39, 0x0005a4de}}, Y: Field{[10]uint32{0x027198b3, 0x03d9b080, 0x012e483d, 0x03971366, 0x02c03193, 0x01b1837b, 0x02af60f1, 0x03631539, 0x033b9cb2, 0x00312710}}}, + {X: Field{[10]uint32{0x00940c9a, 0x0202b52f, 0x0233084c, 0x0384ebd0, 0x0113cf3c, 0x01137708, 0x01585e27, 0x03cc6439, 0x027ec305, 0x000bb08a}}, Y: Field{[10]uint32{0x011e7a4d, 0x0253f661, 0x01bdacd1, 0x020f668d, 0x03124051, 0x00a71ffa, 0x02e24f50, 0x01e5a130, 0x0068de33, 0x0022c769}}}, + {X: Field{[10]uint32{0x01d9123f, 0x00e0c7ae, 0x03a7d7e9, 0x006c7e22, 0x0129fc79, 0x03ef47a4, 0x015f8eca, 0x01a9bcbe, 0x038f72aa, 0x000d06d4}}, Y: Field{[10]uint32{0x00bb9a40, 0x0282abc6, 0x026ed19e, 0x029c14a8, 0x0072dee6, 0x0049366b, 0x02f2f041, 0x03167ae9, 0x024719c1, 0x00161604}}}, + {X: Field{[10]uint32{0x01683eeb, 0x003b97f7, 0x03133aa7, 0x00e28234, 0x033e36eb, 0x00212e3c, 0x01af6525, 0x0233b2ac, 0x01738f9a, 0x002bf19a}}, Y: Field{[10]uint32{0x00cd4509, 0x00a72acc, 0x01fdc91e, 0x015497b7, 0x02570bab, 0x0288e705, 0x0359c7fc, 0x009d4af0, 0x01976dd2, 0x00000b08}}}, + {X: Field{[10]uint32{0x03aad77f, 0x001ec731, 0x03b7fa7d, 0x037c3d69, 0x006d4ebb, 0x01da659c, 0x004afc3a, 0x02e378ca, 0x033ec68e, 0x0013c3aa}}, Y: Field{[10]uint32{0x00e6eea8, 0x00fc4773, 0x0092ce6c, 0x0234096b, 0x00adaa07, 0x00ab0bca, 0x008de306, 0x02dd5d68, 0x027176eb, 0x002ca3a8}}}, + {X: Field{[10]uint32{0x036f4293, 0x0007e1ed, 0x01139ea2, 0x02d594f1, 0x0210e978, 0x01c2ca0b, 0x01bc8cf3, 0x00cc2448, 0x035a9f34, 0x0034955e}}, Y: Field{[10]uint32{0x0282740a, 0x0061e894, 0x01a5f1db, 0x00e37901, 0x03e34b68, 0x02d2b487, 0x0282f06e, 0x009fc049, 0x034355e4, 0x0029e1ec}}}, + {X: Field{[10]uint32{0x001f98cd, 0x0326722b, 0x00308cbf, 0x001535fc, 0x01523489, 0x03319808, 0x02d8a9c1, 0x0121c3eb, 0x01a84a47, 0x00270e46}}, Y: Field{[10]uint32{0x00fc599d, 0x039780f5, 0x008e6be7, 0x03ddb193, 0x01905326, 0x00983990, 0x00f044bf, 0x03755d61, 0x030f4a4d, 0x00376e13}}}, + }, + { + {X: Field{[10]uint32{0x001f98cd, 0x0326722b, 0x00308cbf, 0x001535fc, 0x01523489, 0x03319808, 0x02d8a9c1, 0x0121c3eb, 0x01a84a47, 0x00270e46}}, Y: Field{[10]uint32{0x00fc599d, 0x039780f5, 0x008e6be7, 0x03ddb193, 0x01905326, 0x00983990, 0x00f044bf, 0x03755d61, 0x030f4a4d, 0x00376e13}}}, + {X: Field{[10]uint32{0x014a09ec, 0x03bededa, 0x035f0435, 0x0294fa14, 0x000cd326, 0x01724aa9, 0x002fc69d, 0x03603c29, 0x01326255, 0x000b8f01}}, Y: Field{[10]uint32{0x00c7327e, 0x0121a062, 0x02651253, 0x00f1c1ed, 0x03e048a5, 0x020bf06a, 0x01ae240b, 0x01bed6f7, 0x0091656c, 0x000007fe}}}, + {X: Field{[10]uint32{0x03b64db3, 0x026354e3, 0x0138417b, 0x0328e775, 0x02a7ede4, 0x0394ee35, 0x03bb83fb, 0x0332dd02, 0x039229bd, 0x00304508}}, Y: Field{[10]uint32{0x000259be, 0x0033a7ff, 0x027d1e23, 0x02413515, 0x01a87580, 0x03a5e2f4, 0x00ecde4f, 0x01bf0a97, 0x02dc5b48, 0x00048dfd}}}, + {X: Field{[10]uint32{0x039c7ce6, 0x03c668aa, 0x00934205, 0x005a8642, 0x00337103, 0x03893769, 0x015fb7e3, 0x00561eb8, 0x024ccfa4, 0x003a38a8}}, Y: Field{[10]uint32{0x0036267c, 0x0007ada2, 0x03a73b2c, 0x000ed709, 0x016e09e6, 0x02fb8816, 0x02f2b2b3, 0x01746d32, 0x03ce0c6f, 0x0011b260}}}, + {X: Field{[10]uint32{0x03081e46, 0x03b60d00, 0x019ea1ed, 0x02315515, 0x013a5221, 0x02498d1c, 0x02d9c2c1, 0x01c89020, 0x03f831a7, 0x001b16d2}}, Y: Field{[10]uint32{0x03fbcd70, 0x03e72e02, 0x02a62ed1, 0x0209ab08, 0x0041d0cf, 0x038af91e, 0x0347863c, 0x0350bec8, 0x03714926, 0x0032c144}}}, + {X: Field{[10]uint32{0x011349e2, 0x00cab77c, 0x00c05808, 0x03d05d49, 0x0160e3ec, 0x0106b5e3, 0x02147e9a, 0x030b9f98, 0x0324c6b9, 0x003e0160}}, Y: Field{[10]uint32{0x032025fc, 0x0311a796, 0x0288d5fa, 0x02d589b7, 0x03509498, 0x03a84488, 0x0281aa60, 0x015b3737, 0x025a0a88, 0x00257183}}}, + {X: Field{[10]uint32{0x024dcd4b, 0x0396bb11, 0x00124dca, 0x03566447, 0x010c30c7, 0x02ac4291, 0x0270665c, 0x02b792d5, 0x0056670c, 0x00387a6a}}, Y: Field{[10]uint32{0x03041f2c, 0x02d897ae, 0x02b292d0, 0x026ab285, 0x027f44d1, 0x02c95de4, 0x02c43599, 0x0314c6de, 0x02954455, 0x00158ac2}}}, + {X: Field{[10]uint32{0x02c7b3c2, 0x034e59a2, 0x01b5f5b0, 0x0248e0f5, 0x0212acaf, 0x01c00ca8, 0x030a38b1, 0x01cf0acb, 0x02ac5d85, 0x0029d526}}, Y: Field{[10]uint32{0x0287eaef, 0x03245c64, 0x016dffa0, 0x00554dc4, 0x035d6b51, 0x00651f4a, 0x01a1d70c, 0x009054cd, 0x01b90d1c, 0x002f45f4}}}, + {X: Field{[10]uint32{0x03add73c, 0x021dbf8a, 0x00b7d005, 0x03640a99, 0x008fd9cd, 0x03b70508, 0x00a74e42, 0x02c265de, 0x0257ad11, 0x00146c86}}, Y: Field{[10]uint32{0x0336d8d1, 0x0352b87a, 0x034ba6f7, 0x003ca31c, 0x026c2013, 0x034b073e, 0x00a07f01, 0x034f9755, 0x0010001f, 0x00001e4c}}}, + {X: Field{[10]uint32{0x017e2c95, 0x037265af, 0x00d82ab7, 0x02852e1e, 0x036f3f2b, 0x02b15055, 0x019a12a8, 0x034697b7, 0x03fbb24a, 0x003281f2}}, Y: Field{[10]uint32{0x0150dfa2, 0x0266eb23, 0x00cbf05e, 0x03ccedf8, 0x013ac306, 0x030419b2, 0x00a2267b, 0x003b7d2a, 0x011032df, 0x002bb70c}}}, + {X: Field{[10]uint32{0x0309f34b, 0x01742dce, 0x026ce6d7, 0x03982331, 0x01e58873, 0x00fce758, 0x02b6296f, 0x02de6186, 0x03a63b1c, 0x0025c07c}}, Y: Field{[10]uint32{0x00df5793, 0x03214330, 0x00794acd, 0x00e5ff73, 0x037104bc, 0x0055a0cd, 0x03031b53, 0x003b4575, 0x03bb8caf, 0x000f7512}}}, + {X: Field{[10]uint32{0x02548418, 0x01c7446b, 0x03923173, 0x01f62260, 0x02dce488, 0x00de8d06, 0x03072b05, 0x01f8a4be, 0x00c9e481, 0x000b9b6c}}, Y: Field{[10]uint32{0x00a2b918, 0x01e4b004, 0x035f1e69, 0x01cf870f, 0x004b8e1d, 0x022a4459, 0x01314897, 0x01befe88, 0x02411d77, 0x001d3ada}}}, + {X: Field{[10]uint32{0x031e2f46, 0x039888ef, 0x0383015c, 0x007a1c9d, 0x035270f7, 0x00358f15, 0x01592e04, 0x019b3111, 0x001d2c9e, 0x00280dad}}, Y: Field{[10]uint32{0x02ffb349, 0x00789a57, 0x031f4f73, 0x020b3fc2, 0x010680e2, 0x01e7ac23, 0x031f6aa4, 0x01acf5f7, 0x01a003e9, 0x0030efe4}}}, + {X: Field{[10]uint32{0x03db2a09, 0x00154580, 0x01bbf096, 0x021f7080, 0x01f63142, 0x029d9b68, 0x01638800, 0x0030d4af, 0x0004d9c3, 0x002c2773}}, Y: Field{[10]uint32{0x00b1a093, 0x01f6cea0, 0x014e7aed, 0x035305ab, 0x026a951b, 0x02bab403, 0x008d1635, 0x009037dc, 0x006481cf, 0x00229fcc}}}, + {X: Field{[10]uint32{0x004cea08, 0x022e40e3, 0x0221dbcd, 0x02e8383a, 0x02654b58, 0x01001194, 0x00a61153, 0x023141bd, 0x02dbaa4e, 0x001aa17e}}, Y: Field{[10]uint32{0x0062f4f3, 0x037b3966, 0x021b6a19, 0x012d0f5c, 0x00b4271a, 0x023f988c, 0x01933c14, 0x0196754c, 0x0204bae4, 0x00002d91}}}, + {X: Field{[10]uint32{0x00a959e5, 0x004e0848, 0x014cc5a2, 0x00ea2e47, 0x0391e149, 0x036381ae, 0x0205f281, 0x00bf7e37, 0x030b1dd1, 0x001815c5}}, Y: Field{[10]uint32{0x0385a2a8, 0x026fa4c8, 0x00c65e89, 0x02f0fb89, 0x02465152, 0x01c77c98, 0x019a2daf, 0x01201eb7, 0x00b26a6a, 0x002686bc}}}, + }, + { + {X: Field{[10]uint32{0x00a959e5, 0x004e0848, 0x014cc5a2, 0x00ea2e47, 0x0391e149, 0x036381ae, 0x0205f281, 0x00bf7e37, 0x030b1dd1, 0x001815c5}}, Y: Field{[10]uint32{0x0385a2a8, 0x026fa4c8, 0x00c65e89, 0x02f0fb89, 0x02465152, 0x01c77c98, 0x019a2daf, 0x01201eb7, 0x00b26a6a, 0x002686bc}}}, + {X: Field{[10]uint32{0x02fd545c, 0x02729760, 0x00e66189, 0x0237528a, 0x037c133f, 0x01b72177, 0x014110a4, 0x0381900e, 0x01677c52, 0x0019dcff}}, Y: Field{[10]uint32{0x007eb1ae, 0x01fc0d25, 0x00f98e8c, 0x03d6871b, 0x03ead780, 0x034ac91a, 0x00f25c9d, 0x0194bc3c, 0x02d8cd97, 0x001113ad}}}, + {X: Field{[10]uint32{0x031c032b, 0x036858a5, 0x01c980d4, 0x02285ebf, 0x01ff6b66, 0x03f1d9b1, 0x0111b5fd, 0x000980f7, 0x00fcd6e0, 0x001c7aea}}, Y: Field{[10]uint32{0x0268359f, 0x02d6a385, 0x00755e7a, 0x0345dd2d, 0x0371931a, 0x01532edf, 0x0260516f, 0x034e77bd, 0x02624b61, 0x0034bfc4}}}, + {X: Field{[10]uint32{0x0386f021, 0x03185ac2, 0x00050373, 0x00e0411a, 0x020374e4, 0x038321f0, 0x03c79aac, 0x0395948d, 0x0194d17c, 0x00383e1b}}, Y: Field{[10]uint32{0x01bf325a, 0x02de732d, 0x0045b3b6, 0x0300457f, 0x009a80bc, 0x0072268b, 0x011e832f, 0x02f3d1ea, 0x0073730a, 0x000315c7}}}, + {X: Field{[10]uint32{0x0203a61c, 0x0391d14a, 0x00574d06, 0x03d1a41c, 0x00507868, 0x02aaa774, 0x0217442b, 0x02748cb2, 0x0305b324, 0x002157b0}}, Y: Field{[10]uint32{0x025dfc07, 0x031baab1, 0x004965df, 0x013a85f9, 0x02d332f7, 0x02d0bed3, 0x003cbff9, 0x00705fd5, 0x012ec5f0, 0x00037617}}}, + {X: Field{[10]uint32{0x02aa138b, 0x00367dce, 0x02cd66df, 0x002fbde1, 0x0363efba, 0x03119c7f, 0x003ebc18, 0x02b8a1e5, 0x0249d3c3, 0x00105ff8}}, Y: Field{[10]uint32{0x021ae869, 0x0246ccd2, 0x026afd1c, 0x037b0155, 0x03c19daf, 0x003ea795, 0x00a5d29f, 0x00f8e308, 0x01d7bcd2, 0x00008d62}}}, + {X: Field{[10]uint32{0x0332d706, 0x03029207, 0x00678b00, 0x0291d1a8, 0x020618cc, 0x00256fe8, 0x010d29a3, 0x03efc7c5, 0x006abab3, 0x000f3912}}, Y: Field{[10]uint32{0x007fd9e4, 0x01cd8dff, 0x0289f40b, 0x010f3587, 0x02edd156, 0x00425241, 0x02fd046b, 0x01e14a23, 0x008daae3, 0x0039dd50}}}, + {X: Field{[10]uint32{0x02da6e03, 0x001dcb00, 0x016038ad, 0x03e4232b, 0x034c277d, 0x035a5bd3, 0x0191e193, 0x0141073a, 0x01ab9f24, 0x0010b285}}, Y: Field{[10]uint32{0x00347793, 0x02227ea3, 0x03ea7836, 0x029a041a, 0x02d66e85, 0x032e003b, 0x03ce4d1f, 0x015f2591, 0x0326c81c, 0x001a34bb}}}, + {X: Field{[10]uint32{0x011cd3fb, 0x01032ede, 0x03e686db, 0x03f65ca6, 0x034a2a33, 0x03e2113a, 0x02e03218, 0x00dfebc0, 0x01143f4e, 0x00047331}}, Y: Field{[10]uint32{0x01160d86, 0x01c5ae95, 0x03472a93, 0x03f4b374, 0x01fa0b1e, 0x00e3308e, 0x028e2449, 0x00477ad4, 0x032a902b, 0x0012a95a}}}, + {X: Field{[10]uint32{0x01583a3e, 0x02ebc10a, 0x02808108, 0x02662c55, 0x00b15205, 0x036521c7, 0x0275dbbe, 0x03df955c, 0x033f16d0, 0x00162255}}, Y: Field{[10]uint32{0x025b124f, 0x016632df, 0x029cf8f1, 0x01335331, 0x0096fe29, 0x0269ad39, 0x00f5df8a, 0x015bf811, 0x0062c558, 0x0006be8a}}}, + {X: Field{[10]uint32{0x018f7552, 0x02e44658, 0x00fac387, 0x022e6015, 0x01bd4113, 0x0208e0b7, 0x0397774f, 0x0271bd0e, 0x0317e514, 0x0000942e}}, Y: Field{[10]uint32{0x0110b14d, 0x0212588d, 0x02f1e3f0, 0x00f0ccf5, 0x03da006f, 0x03fa7605, 0x02d7df75, 0x020208d0, 0x00fc9bbe, 0x001cc64c}}}, + {X: Field{[10]uint32{0x0307e636, 0x0162d040, 0x011d97e1, 0x039cc858, 0x00b4a77d, 0x028844b2, 0x01bc29bd, 0x01d910f7, 0x01601638, 0x0008867c}}, Y: Field{[10]uint32{0x01f15109, 0x0286cb5c, 0x02f55e07, 0x0034fdce, 0x016dd723, 0x02e08c2f, 0x0006d4f1, 0x028bd86e, 0x00ac5cb6, 0x00012a61}}}, + {X: Field{[10]uint32{0x03725d12, 0x004fa4e7, 0x0347505d, 0x02ef72d7, 0x03d94642, 0x02808bef, 0x00a39ce0, 0x01ff4ead, 0x0088b346, 0x00069d27}}, Y: Field{[10]uint32{0x03ac56e4, 0x01945348, 0x01aa7013, 0x01a62643, 0x03607208, 0x00abcf63, 0x018be75c, 0x0038b3d1, 0x019573ec, 0x001fa474}}}, + {X: Field{[10]uint32{0x02c704c0, 0x00b59c2d, 0x0394f5d2, 0x0183b378, 0x00560446, 0x00d41e09, 0x027f8a6e, 0x0099d285, 0x0107c92f, 0x0029deaa}}, Y: Field{[10]uint32{0x02dfea48, 0x02f1c11f, 0x01462af8, 0x0311d056, 0x014c921f, 0x030af56a, 0x01e188e5, 0x033f93c8, 0x02e5bf35, 0x002e2206}}}, + {X: Field{[10]uint32{0x01fae458, 0x0012394a, 0x0097fd61, 0x0109d9bb, 0x028b0a5c, 0x037edecc, 0x01d156a5, 0x00863042, 0x005be0f8, 0x0031d41a}}, Y: Field{[10]uint32{0x0357b598, 0x01a10655, 0x011a2b01, 0x0140cd65, 0x000a5dca, 0x019cb1ed, 0x012f414c, 0x007817ed, 0x01f8cf92, 0x003ab5e5}}}, + {X: Field{[10]uint32{0x00b94266, 0x01a5cfbb, 0x01f12b1a, 0x03ee9f53, 0x0080cef0, 0x006368c6, 0x01439a45, 0x02104508, 0x038e23a0, 0x00295db7}}, Y: Field{[10]uint32{0x01b28ec8, 0x02f846b8, 0x019f3ee8, 0x029fd453, 0x00432e10, 0x0163360b, 0x02b97afe, 0x0102cb24, 0x0320e766, 0x001029af}}}, + }, + { + {X: Field{[10]uint32{0x00b94266, 0x01a5cfbb, 0x01f12b1a, 0x03ee9f53, 0x0080cef0, 0x006368c6, 0x01439a45, 0x02104508, 0x038e23a0, 0x00295db7}}, Y: Field{[10]uint32{0x01b28ec8, 0x02f846b8, 0x019f3ee8, 0x029fd453, 0x00432e10, 0x0163360b, 0x02b97afe, 0x0102cb24, 0x0320e766, 0x001029af}}}, + {X: Field{[10]uint32{0x02704896, 0x015c96f6, 0x03b8dcec, 0x018f26b3, 0x026f3ba0, 0x02f9c6eb, 0x02520867, 0x0168ed51, 0x0062ef3b, 0x00279773}}, Y: Field{[10]uint32{0x0282c835, 0x009da772, 0x0351248f, 0x006180c3, 0x0279605d, 0x0131d848, 0x03d3a215, 0x017cfa97, 0x012ddb92, 0x001bfb74}}}, + {X: Field{[10]uint32{0x019ed6c1, 0x02bad633, 0x013d6b68, 0x016f0f56, 0x02c24e74, 0x0017b743, 0x03fc1877, 0x03d4fa02, 0x036dcb74, 0x0000ca0c}}, Y: Field{[10]uint32{0x00fafeee, 0x01baf9be, 0x0094adec, 0x037c972d, 0x00265bf4, 0x00835f23, 0x02d5943a, 0x027ca311, 0x003812fd, 0x001c6a26}}}, + {X: Field{[10]uint32{0x00bf7ea0, 0x03b561d1, 0x01833953, 0x028173bd, 0x00e33625, 0x01bc0ec8, 0x016e9f97, 0x0116b7e3, 0x00375b87, 0x0029f782}}, Y: Field{[10]uint32{0x03bcabaa, 0x030154e6, 0x01aa2e04, 0x0303faf1, 0x02645a47, 0x012223a6, 0x004a0b33, 0x02979484, 0x02b057ad, 0x00298f65}}}, + {X: Field{[10]uint32{0x0235983a, 0x02a6a34c, 0x00eb2919, 0x00dc04ef, 0x01e38a10, 0x003f854c, 0x023926d7, 0x00715371, 0x02ae8b91, 0x003393d3}}, Y: Field{[10]uint32{0x013cdecf, 0x035ac643, 0x0340aecf, 0x008a3afd, 0x03526c65, 0x039c1d50, 0x02de0249, 0x03eeecfa, 0x0173c390, 0x003cf27e}}}, + {X: Field{[10]uint32{0x02da57e4, 0x01592299, 0x019f86b7, 0x01bbf737, 0x0298c499, 0x018c6f07, 0x01ea2a74, 0x0062e76f, 0x02e39839, 0x001a4336}}, Y: Field{[10]uint32{0x033f33bb, 0x00656d24, 0x023d42b6, 0x03ef3a56, 0x01f863d8, 0x01656253, 0x01fd91bf, 0x01e691ea, 0x0079677b, 0x002102b7}}}, + {X: Field{[10]uint32{0x01b0e6c9, 0x02aad995, 0x00c89a6d, 0x033de1b9, 0x01db5ff9, 0x037e2f2f, 0x0228fb36, 0x018889e3, 0x03a54b98, 0x00136faf}}, Y: Field{[10]uint32{0x02b2cc25, 0x029e1557, 0x00efae94, 0x02caf141, 0x03589311, 0x03888a7c, 0x01a626e6, 0x00ebb7d1, 0x03b03c91, 0x00043fb9}}}, + {X: Field{[10]uint32{0x02d916fb, 0x023e8412, 0x024a3a9f, 0x03f7a527, 0x03e68065, 0x0073fd32, 0x03c35ac0, 0x02032704, 0x018e6890, 0x00309999}}, Y: Field{[10]uint32{0x00887814, 0x03bd4ae8, 0x0138856a, 0x037fad84, 0x036b8fec, 0x009189ea, 0x0398170b, 0x036aac3d, 0x013854e7, 0x0039fa16}}}, + {X: Field{[10]uint32{0x01857295, 0x00068469, 0x03f0164e, 0x01fc0d0c, 0x0069c8e4, 0x02872848, 0x02e118fc, 0x0170862c, 0x000bfef4, 0x00290a89}}, Y: Field{[10]uint32{0x027eb9c1, 0x00ddffb2, 0x0139556b, 0x00b34546, 0x0027a1c2, 0x01376931, 0x026b22b2, 0x0175159e, 0x03f26100, 0x000ea82c}}}, + {X: Field{[10]uint32{0x005c5b40, 0x02f3f580, 0x03d1e269, 0x021e6ee7, 0x03150b96, 0x023330f7, 0x01ed382e, 0x0334536b, 0x00c8bf53, 0x00292d4f}}, Y: Field{[10]uint32{0x01c61bfd, 0x017b45b4, 0x019e3d1f, 0x026fdd49, 0x03199cca, 0x037f6961, 0x015ca003, 0x016e0112, 0x00ce8300, 0x0033bbc2}}}, + {X: Field{[10]uint32{0x03cdc098, 0x003fd55b, 0x02803222, 0x003dab91, 0x01550ae0, 0x00312670, 0x03f1f86c, 0x008899e9, 0x032f96fb, 0x000d384a}}, Y: Field{[10]uint32{0x027474e2, 0x02c6b79a, 0x003f664c, 0x00c3c662, 0x0304df51, 0x005e5cb6, 0x034cbc84, 0x034c8b65, 0x02ddd7b5, 0x002992b0}}}, + {X: Field{[10]uint32{0x00fb8036, 0x02262a97, 0x035085f9, 0x024b0368, 0x033ad09a, 0x03f59fa0, 0x02117dd1, 0x011ed22b, 0x0351fb16, 0x0033fd89}}, Y: Field{[10]uint32{0x00f59de0, 0x03ced689, 0x02825843, 0x0363d80c, 0x0278a589, 0x021850f1, 0x03e34b58, 0x00b46b17, 0x0126bd54, 0x00337d3b}}}, + {X: Field{[10]uint32{0x03173b92, 0x01bad7a3, 0x037611cd, 0x03d05a7e, 0x003b7e72, 0x03d3595a, 0x0231a218, 0x0247ca6f, 0x0240d9bb, 0x00043d34}}, Y: Field{[10]uint32{0x033146c2, 0x00801b58, 0x02db7c90, 0x0274521a, 0x0290bb76, 0x00ce422e, 0x01b25a5a, 0x014eb484, 0x01950917, 0x0021438b}}}, + {X: Field{[10]uint32{0x004393d7, 0x01983b74, 0x01de1ee6, 0x00959dd2, 0x03869dff, 0x008d5cf8, 0x017f8936, 0x03cee10c, 0x00018a78, 0x0037a87f}}, Y: Field{[10]uint32{0x01710ccd, 0x01f53be5, 0x00cbdbf9, 0x0268ade7, 0x03af6def, 0x01b59b80, 0x03f134ff, 0x0171434e, 0x01cc942e, 0x0013d952}}}, + {X: Field{[10]uint32{0x00d84958, 0x03f4766a, 0x005caee6, 0x02c5b2b3, 0x026a11de, 0x03503321, 0x0319b976, 0x01df9d27, 0x000b69b6, 0x003a11ba}}, Y: Field{[10]uint32{0x0082cf9f, 0x01191ede, 0x001a640c, 0x00d9c783, 0x03ad51a3, 0x01e62ddb, 0x01bd9104, 0x01f89507, 0x00fc894c, 0x0028a72e}}}, + {X: Field{[10]uint32{0x0258ad71, 0x018e226f, 0x03a208f7, 0x03d73e68, 0x00bb30d1, 0x0277a30e, 0x005fe962, 0x030f8c28, 0x038c28de, 0x001dde29}}, Y: Field{[10]uint32{0x019f43ac, 0x004ff07f, 0x02c563b5, 0x0047fc92, 0x0087b384, 0x00bfd600, 0x0098e12f, 0x02c8bfdc, 0x019ab5a5, 0x000d189b}}}, + }, + { + {X: Field{[10]uint32{0x0258ad71, 0x018e226f, 0x03a208f7, 0x03d73e68, 0x00bb30d1, 0x0277a30e, 0x005fe962, 0x030f8c28, 0x038c28de, 0x001dde29}}, Y: Field{[10]uint32{0x019f43ac, 0x004ff07f, 0x02c563b5, 0x0047fc92, 0x0087b384, 0x00bfd600, 0x0098e12f, 0x02c8bfdc, 0x019ab5a5, 0x000d189b}}}, + {X: Field{[10]uint32{0x0073e879, 0x02870944, 0x02ea7a7e, 0x016b8413, 0x032cf16a, 0x03c3f8e4, 0x02f482d7, 0x001b458c, 0x016b5ca0, 0x0039ee5e}}, Y: Field{[10]uint32{0x02a89d98, 0x01c4226e, 0x00af338e, 0x0097b6a6, 0x029cb5bf, 0x00df3072, 0x002102a7, 0x0278bf7d, 0x008c1916, 0x0004ae26}}}, + {X: Field{[10]uint32{0x0319c869, 0x031bab8c, 0x032702f7, 0x0175d87a, 0x0018a9f9, 0x03f32b37, 0x01839022, 0x00ff2340, 0x005d9817, 0x000c0601}}, Y: Field{[10]uint32{0x02b856f0, 0x031db274, 0x01a7bfc0, 0x032928f6, 0x03ca2a84, 0x03588b8e, 0x02624320, 0x02dedbe1, 0x01782503, 0x002b17f1}}}, + {X: Field{[10]uint32{0x02628f0f, 0x035c8afc, 0x02919865, 0x02abcabb, 0x0365423d, 0x02f8269c, 0x00915a24, 0x01880f0b, 0x00185087, 0x0001c6fc}}, Y: Field{[10]uint32{0x01a1c334, 0x03172f51, 0x000bbb57, 0x01a88c72, 0x02098f9c, 0x03021338, 0x03600bc1, 0x033d2b8c, 0x015d504d, 0x00149ea8}}}, + {X: Field{[10]uint32{0x01ed29b5, 0x01a61be9, 0x01d1b4c6, 0x0181c4ab, 0x01f5830b, 0x0298f221, 0x02b67db9, 0x01fbcd0e, 0x01b61ee5, 0x000c8a20}}, Y: Field{[10]uint32{0x00d15ad2, 0x03c49b9f, 0x03604ef4, 0x02ae53b9, 0x01ca83ae, 0x01054c78, 0x010b19df, 0x00d13ac4, 0x028417a0, 0x00059dc0}}}, + {X: Field{[10]uint32{0x00953133, 0x01f726c6, 0x021ae647, 0x00a9d21c, 0x017fb3b4, 0x03f337ea, 0x012806c0, 0x03748e20, 0x034fed0d, 0x000282ca}}, Y: Field{[10]uint32{0x00af0fc9, 0x00928dcd, 0x00ba94bc, 0x03a2c3b5, 0x016fa384, 0x01916323, 0x001c6ca8, 0x02fcbc0f, 0x002cfb5a, 0x00336846}}}, + {X: Field{[10]uint32{0x02c96100, 0x02a101e1, 0x008e63bf, 0x006a9ba7, 0x00a16301, 0x037cf6f3, 0x003dd9b2, 0x006e7fed, 0x033ac0fb, 0x000fce11}}, Y: Field{[10]uint32{0x02624707, 0x00ab06fc, 0x031bcf1e, 0x01f02dd7, 0x0166571c, 0x03c1e739, 0x034c4462, 0x000e5494, 0x0055f5d4, 0x001c31a7}}}, + {X: Field{[10]uint32{0x039620e1, 0x00ddb7e8, 0x013786f6, 0x03214048, 0x025b1911, 0x0300f0e7, 0x0232e594, 0x0395a0ce, 0x003acb9b, 0x0000860d}}, Y: Field{[10]uint32{0x006998b5, 0x00667d94, 0x009ec5e0, 0x0290bd0f, 0x00443299, 0x000beff0, 0x03f24fd6, 0x0142fabc, 0x0148970a, 0x002faa07}}}, + {X: Field{[10]uint32{0x0122d2ac, 0x031bb1bf, 0x02ce0234, 0x0049b72a, 0x0310ddfe, 0x01e177cb, 0x003c0e09, 0x029db72d, 0x03c5fd27, 0x000a2044}}, Y: Field{[10]uint32{0x0342a268, 0x03ad57e3, 0x008fd081, 0x01285523, 0x03ddc3d4, 0x0325d84d, 0x00777260, 0x031723c8, 0x030158fb, 0x002869fa}}}, + {X: Field{[10]uint32{0x02e515dd, 0x0284ebbf, 0x024228c1, 0x008cd0ea, 0x029d0453, 0x012f7f8b, 0x035866ab, 0x0306083b, 0x02fee6ee, 0x0028afe6}}, Y: Field{[10]uint32{0x02c30212, 0x02a5ac01, 0x018745c3, 0x02aa6a3a, 0x0000f2e3, 0x03017a8a, 0x00a5e2ab, 0x02adece8, 0x0071c55c, 0x0016846f}}}, + {X: Field{[10]uint32{0x005f8ea8, 0x02a03749, 0x02900d4b, 0x038e5934, 0x01d17248, 0x01c467f9, 0x03f4d95d, 0x00e8a954, 0x0200c846, 0x003e58e8}}, Y: Field{[10]uint32{0x01bc99eb, 0x0157ec16, 0x020824bc, 0x00d6762d, 0x008bb8f2, 0x03fd09c8, 0x03722301, 0x020f028e, 0x00268c7f, 0x00272165}}}, + {X: Field{[10]uint32{0x030a2a53, 0x03c3b037, 0x0211e7ea, 0x02cfe059, 0x02d51dca, 0x00ea6e24, 0x00394574, 0x0265f0ea, 0x018d07c3, 0x001be194}}, Y: Field{[10]uint32{0x033bfeb2, 0x02695d1c, 0x01f35113, 0x01cbaa81, 0x00bf54f7, 0x029c265a, 0x0376ea95, 0x020bca6d, 0x0216fd45, 0x003542bd}}}, + {X: Field{[10]uint32{0x0206a315, 0x02a20c49, 0x023ad9e1, 0x01cbc9a5, 0x02407260, 0x0243825f, 0x00d8b2a5, 0x03669fe6, 0x024cff70, 0x00297648}}, Y: Field{[10]uint32{0x023b68d1, 0x0184cd67, 0x027c9d35, 0x00d1f446, 0x01ed4d0d, 0x01e6037a, 0x03306abd, 0x03696cd0, 0x03003b20, 0x0021cca2}}}, + {X: Field{[10]uint32{0x00d52891, 0x027abd36, 0x01f52af1, 0x03620fae, 0x0339a0f7, 0x02c5ffe9, 0x0244de90, 0x02378d19, 0x03c9cbc5, 0x000ef092}}, Y: Field{[10]uint32{0x0105b79c, 0x03478a13, 0x032d1386, 0x00a02921, 0x004da845, 0x02fed23d, 0x02bed840, 0x00f629ff, 0x00a48a78, 0x003c238c}}}, + {X: Field{[10]uint32{0x02231493, 0x02ded501, 0x00d469cd, 0x020c3331, 0x0096411a, 0x003979a9, 0x034e41d0, 0x030d813a, 0x002e1b73, 0x003c7fa6}}, Y: Field{[10]uint32{0x018848c1, 0x02a6699d, 0x030d0196, 0x00d1b97f, 0x03f173fb, 0x03df6674, 0x02d3c205, 0x01377085, 0x01eaed9a, 0x000b8806}}}, + {X: Field{[10]uint32{0x02d903ac, 0x03b6a701, 0x03e5cb09, 0x01d396b5, 0x02d5f962, 0x039ebf4b, 0x0329fd30, 0x02a1118d, 0x015ee637, 0x00024a25}}, Y: Field{[10]uint32{0x03cd091f, 0x0203a4d6, 0x0183fc51, 0x03bea2a3, 0x02ac3d26, 0x024ea57b, 0x0378a130, 0x010aa09e, 0x01003d3f, 0x00309588}}}, + }, + { + {X: Field{[10]uint32{0x02d903ac, 0x03b6a701, 0x03e5cb09, 0x01d396b5, 0x02d5f962, 0x039ebf4b, 0x0329fd30, 0x02a1118d, 0x015ee637, 0x00024a25}}, Y: Field{[10]uint32{0x03cd091f, 0x0203a4d6, 0x0183fc51, 0x03bea2a3, 0x02ac3d26, 0x024ea57b, 0x0378a130, 0x010aa09e, 0x01003d3f, 0x00309588}}}, + {X: Field{[10]uint32{0x0359dd9e, 0x0011e983, 0x030e7231, 0x03156d63, 0x027ce5e9, 0x032c62b5, 0x01163b04, 0x034d436b, 0x01ee3771, 0x0013e26f}}, Y: Field{[10]uint32{0x0156b049, 0x01ab8c80, 0x01f5c101, 0x014198e3, 0x031e4882, 0x010eec91, 0x00baf4c0, 0x007da571, 0x02d5227a, 0x00329e54}}}, + {X: Field{[10]uint32{0x0074b839, 0x004a1d5e, 0x02b41811, 0x02ce54f4, 0x02be4115, 0x008c2dab, 0x03df0dfb, 0x0396a014, 0x001fc0e1, 0x000f80ee}}, Y: Field{[10]uint32{0x000594ba, 0x0073959f, 0x01b8da0c, 0x03c3f6ad, 0x027de5c5, 0x01c663d9, 0x00f66075, 0x01fd0b11, 0x0163dff0, 0x00344eb8}}}, + {X: Field{[10]uint32{0x03f01197, 0x030c533f, 0x005bf529, 0x03c1e689, 0x0194b668, 0x00b0f132, 0x0396baca, 0x0316a030, 0x0304cae3, 0x0032e7a0}}, Y: Field{[10]uint32{0x03989c1d, 0x01381d8e, 0x00a24c33, 0x02300578, 0x0341b2d1, 0x03c22245, 0x03258cdf, 0x0039a849, 0x02801eb8, 0x0018b1f4}}}, + {X: Field{[10]uint32{0x0357a513, 0x03de39a0, 0x0023f3a3, 0x004d16cc, 0x01f151bd, 0x028a48b1, 0x02fa283a, 0x0124b358, 0x00b7a2f4, 0x003998b0}}, Y: Field{[10]uint32{0x0017d07e, 0x02880728, 0x00d89192, 0x0358954e, 0x01d8035c, 0x00486906, 0x01ae208a, 0x01148c17, 0x013ce612, 0x002ac2c6}}}, + {X: Field{[10]uint32{0x01a7d197, 0x03a434ee, 0x019459ba, 0x030623a9, 0x035e83a8, 0x008b08d2, 0x038ffe0a, 0x03d8e51d, 0x0254280d, 0x0030b162}}, Y: Field{[10]uint32{0x01eeb5e9, 0x00732fe2, 0x002484e4, 0x011516b6, 0x020a47ec, 0x00bb4e69, 0x03041ab6, 0x00249d5c, 0x0288366e, 0x001cba8c}}}, + {X: Field{[10]uint32{0x0337d242, 0x017dfbf7, 0x014b0499, 0x02981e70, 0x01c29fec, 0x02f8d61f, 0x03862c7c, 0x03db2e10, 0x00b1c94c, 0x00102fe0}}, Y: Field{[10]uint32{0x02405088, 0x03609e69, 0x035583d1, 0x02e90af4, 0x0274321e, 0x02c9bf84, 0x013fe9b1, 0x02abc13d, 0x0135d856, 0x002d5e77}}}, + {X: Field{[10]uint32{0x008d2cc2, 0x027ff094, 0x0058c15f, 0x0351c123, 0x018e0bee, 0x001cc371, 0x00cf2a41, 0x01a6f4f2, 0x01b0f89c, 0x0038bcd2}}, Y: Field{[10]uint32{0x00d4c04f, 0x011ef638, 0x03db37e3, 0x03a38272, 0x0242344b, 0x0180856e, 0x0060aec7, 0x01c8de06, 0x03280f82, 0x0007facb}}}, + {X: Field{[10]uint32{0x015a3558, 0x00acd916, 0x027f2baf, 0x021788d2, 0x02ac071f, 0x0236d67d, 0x02f97813, 0x0329c201, 0x0297601d, 0x000f453f}}, Y: Field{[10]uint32{0x0043df4c, 0x036ceb19, 0x01727c6a, 0x03851f07, 0x0082e0a2, 0x02fd5b85, 0x029a931d, 0x0207be3c, 0x01d6e846, 0x0005b1af}}}, + {X: Field{[10]uint32{0x00ea4178, 0x031c0905, 0x03cd510f, 0x0153931d, 0x03782e03, 0x01dd2532, 0x00453c6a, 0x018da1a0, 0x0072d175, 0x00011c2a}}, Y: Field{[10]uint32{0x00098bd6, 0x01127c6e, 0x01aea079, 0x01c1a613, 0x0319b568, 0x034e7032, 0x02145e9f, 0x026b359d, 0x03a9c110, 0x00022669}}}, + {X: Field{[10]uint32{0x02b1fc24, 0x027d6b60, 0x03570ede, 0x0071f8fd, 0x012528d8, 0x03249219, 0x001ac4d2, 0x01949473, 0x0140e82e, 0x00375be9}}, Y: Field{[10]uint32{0x029b74ca, 0x00c71183, 0x022304a4, 0x01afb5cc, 0x03ec10de, 0x00595f9d, 0x026f1ebf, 0x0061bf8d, 0x037eb1d3, 0x0019f98a}}}, + {X: Field{[10]uint32{0x03369217, 0x0379b658, 0x011ead74, 0x01a40198, 0x01ca1c39, 0x01013ab3, 0x01a278f5, 0x03589288, 0x00ffcba4, 0x0010b714}}, Y: Field{[10]uint32{0x022dbc57, 0x0025f88f, 0x01e841c3, 0x03b2a380, 0x03a7a139, 0x0182ea14, 0x0178f5f1, 0x016c75fb, 0x021f6638, 0x00296ea6}}}, + {X: Field{[10]uint32{0x01d08e02, 0x02a4564f, 0x0302881e, 0x02dff6b7, 0x00108547, 0x028f47a0, 0x0069499a, 0x0175e03e, 0x01a82de5, 0x0004fe8b}}, Y: Field{[10]uint32{0x00b03410, 0x0150770f, 0x02b97da5, 0x02ec6690, 0x03e644af, 0x02ed0cb1, 0x03356206, 0x0369c8c4, 0x00b04555, 0x0004d8ce}}}, + {X: Field{[10]uint32{0x0246a9e9, 0x006b3a45, 0x03b0423f, 0x029f62b9, 0x015dcbb7, 0x03329d77, 0x01f82bb9, 0x03bdd5f4, 0x039c4b0a, 0x002560ad}}, Y: Field{[10]uint32{0x0256a698, 0x035d24ea, 0x002ffbc4, 0x0317c4ee, 0x0001cbb5, 0x02be39a9, 0x02c6acee, 0x009bbb53, 0x01800ed4, 0x0008819f}}}, + {X: Field{[10]uint32{0x004ee41a, 0x00ceae65, 0x029a6ac2, 0x0374edf5, 0x02879b56, 0x00b1a0a0, 0x03c10b67, 0x002910fd, 0x0051d3c7, 0x00341b12}}, Y: Field{[10]uint32{0x03295e6f, 0x03e13a62, 0x02e252f1, 0x00d1858b, 0x019b7b84, 0x013d8c24, 0x030acd4f, 0x0342b6ee, 0x014c0584, 0x0016057f}}}, + {X: Field{[10]uint32{0x03d82751, 0x02b9d458, 0x0354527a, 0x02a41eb4, 0x015645b4, 0x0038eca1, 0x01064f3a, 0x02c424e6, 0x02f3ec6d, 0x0021743f}}, Y: Field{[10]uint32{0x02b1f962, 0x008de893, 0x0331582c, 0x03a5a1dc, 0x023e8751, 0x020b3d59, 0x01d496e5, 0x02302f8a, 0x008413a3, 0x0007c0d9}}}, + }, + { + {X: Field{[10]uint32{0x03d82751, 0x02b9d458, 0x0354527a, 0x02a41eb4, 0x015645b4, 0x0038eca1, 0x01064f3a, 0x02c424e6, 0x02f3ec6d, 0x0021743f}}, Y: Field{[10]uint32{0x02b1f962, 0x008de893, 0x0331582c, 0x03a5a1dc, 0x023e8751, 0x020b3d59, 0x01d496e5, 0x02302f8a, 0x008413a3, 0x0007c0d9}}}, + {X: Field{[10]uint32{0x015fcade, 0x015b4507, 0x01ff7563, 0x038025c4, 0x0068b482, 0x034477c1, 0x007a6cfc, 0x0313d3d8, 0x034b19a4, 0x001ade43}}, Y: Field{[10]uint32{0x0338d3ff, 0x03fe1bf0, 0x02b0ab6f, 0x02d1ef89, 0x03a83fa5, 0x032b8272, 0x016661f9, 0x03acfbca, 0x001b2ff9, 0x00340ea6}}}, + {X: Field{[10]uint32{0x00de4cf3, 0x0154187b, 0x0066ab99, 0x00d51e28, 0x039340e5, 0x005766b9, 0x03c2d26d, 0x008b0ef9, 0x034ac114, 0x000e136a}}, Y: Field{[10]uint32{0x012d0566, 0x01e5ac89, 0x03a73b7c, 0x00ce5d46, 0x001f430a, 0x00ad31bc, 0x034ed6da, 0x03290efe, 0x01bcd1b9, 0x0035b8f1}}}, + {X: Field{[10]uint32{0x03a3e0cb, 0x03336af8, 0x00be0bb0, 0x037a165e, 0x023d2479, 0x03313e3f, 0x022c367a, 0x02fb4f05, 0x032c2d7e, 0x00104526}}, Y: Field{[10]uint32{0x039033a8, 0x024ba60c, 0x00f2470e, 0x0017bd24, 0x00b3ec78, 0x0240b3ca, 0x0015c9b9, 0x00c150ad, 0x0392db7c, 0x00324356}}}, + {X: Field{[10]uint32{0x025238c2, 0x03cfa487, 0x00b8b98a, 0x0170e03b, 0x0040355f, 0x03a0bb52, 0x031610b4, 0x0056a906, 0x000eb7d4, 0x00053c3b}}, Y: Field{[10]uint32{0x02f07922, 0x01a8d1e4, 0x0139d6e8, 0x03600c12, 0x03d25c00, 0x02109d1f, 0x01fc73e3, 0x01760248, 0x013dd483, 0x002ac4b5}}}, + {X: Field{[10]uint32{0x02972627, 0x00d9a822, 0x01e1f8a4, 0x00100948, 0x00e19216, 0x02f11068, 0x018c1efc, 0x03857206, 0x030949bf, 0x00228c61}}, Y: Field{[10]uint32{0x02bb8af9, 0x011ed591, 0x00bcce7b, 0x016b0fbf, 0x00174436, 0x0161eea9, 0x0177ed28, 0x02993425, 0x008768f7, 0x00192edf}}}, + {X: Field{[10]uint32{0x0143e94d, 0x00d4bbf5, 0x00e188f6, 0x029d5be6, 0x02dd1302, 0x02968376, 0x01c34678, 0x00a1fb10, 0x03bb782c, 0x003ad0bc}}, Y: Field{[10]uint32{0x01924d89, 0x01677911, 0x02d42405, 0x02379835, 0x034cd846, 0x03f37edd, 0x020dd572, 0x0364b726, 0x01074f25, 0x0008d29b}}}, + {X: Field{[10]uint32{0x03f3d3fc, 0x03774a38, 0x01cebf8d, 0x0208170a, 0x02664a9b, 0x021ca9ee, 0x02c3dfe2, 0x021277eb, 0x00fa4e7c, 0x00347eb5}}, Y: Field{[10]uint32{0x00f3704d, 0x008d0f14, 0x03326ed2, 0x00c7bfcd, 0x00bad371, 0x0162de06, 0x033f70e8, 0x03f7f951, 0x0314a348, 0x0023f865}}}, + {X: Field{[10]uint32{0x0219aaed, 0x01396d5f, 0x03327032, 0x037a3199, 0x00459bac, 0x0381aa48, 0x02ec02f6, 0x008366a7, 0x00ca5168, 0x00073c4e}}, Y: Field{[10]uint32{0x012f400e, 0x01ba975a, 0x03ffbc13, 0x023fbf1d, 0x03479eef, 0x02db7785, 0x00372a66, 0x018e197d, 0x02f3171c, 0x0035bff6}}}, + {X: Field{[10]uint32{0x00ba68dd, 0x01cee8b8, 0x02d65374, 0x010e31fa, 0x02bca7c9, 0x0076b4c4, 0x0266838c, 0x01d049fc, 0x02abfe2b, 0x000172fa}}, Y: Field{[10]uint32{0x01d03959, 0x00a7cc9f, 0x033b5942, 0x01c17794, 0x007f3d96, 0x0141bbe8, 0x01386665, 0x0055baba, 0x03b6fa90, 0x0004f288}}}, + {X: Field{[10]uint32{0x02a8aa39, 0x0303a7ed, 0x03ac55f6, 0x01ed29e3, 0x0137a663, 0x01266436, 0x035a0968, 0x03504b21, 0x02be5f40, 0x002d61a1}}, Y: Field{[10]uint32{0x03493c1f, 0x01e4d74a, 0x0347b8fc, 0x02639b6c, 0x01abbdaf, 0x01302a47, 0x01478d45, 0x0230b052, 0x014324c7, 0x00158cb5}}}, + {X: Field{[10]uint32{0x023a1550, 0x011319f2, 0x01f279a5, 0x027e3bff, 0x01801da9, 0x007e2dd4, 0x0130976e, 0x015d04b7, 0x01ab3405, 0x003aff1a}}, Y: Field{[10]uint32{0x01362f6e, 0x010afd90, 0x00b1951f, 0x00639a30, 0x037983c8, 0x01fd3f41, 0x01f199db, 0x02d5028f, 0x00cdb99c, 0x0038bffa}}}, + {X: Field{[10]uint32{0x003b4cc5, 0x007af8ec, 0x037c2ee9, 0x02e96871, 0x02572831, 0x01fcea00, 0x035bc4fe, 0x0330ad9e, 0x01b06b8b, 0x0017f067}}, Y: Field{[10]uint32{0x01b57c28, 0x00e7ee19, 0x03ec4a3b, 0x000f3021, 0x009276f5, 0x028e97bd, 0x022138f9, 0x031f19bb, 0x00c0ec98, 0x003b23a1}}}, + {X: Field{[10]uint32{0x028d319f, 0x02fce397, 0x018e948b, 0x0185b510, 0x00e66aa5, 0x01eab260, 0x010b6533, 0x02a19841, 0x0350ce93, 0x001b3970}}, Y: Field{[10]uint32{0x01cf513f, 0x031af5e5, 0x0378308a, 0x03803b14, 0x012da8f2, 0x02ef88fc, 0x013e3e8c, 0x00f216fb, 0x0026e250, 0x00254340}}}, + {X: Field{[10]uint32{0x00b38cb5, 0x02e15f53, 0x00948bb4, 0x037d34e2, 0x03e10b7f, 0x034fba86, 0x03a8a40f, 0x038a277a, 0x030d42ed, 0x002e23ed}}, Y: Field{[10]uint32{0x0165f3d7, 0x03e9d596, 0x00c7197b, 0x00489ebe, 0x024d4f3e, 0x02cd6a38, 0x034bb994, 0x00ca0180, 0x02ad46ea, 0x0035b1cd}}}, + {X: Field{[10]uint32{0x0126087e, 0x01012091, 0x020308f5, 0x02220b68, 0x01fdfb6d, 0x01e62e17, 0x009b6041, 0x033a5f07, 0x01ce97ee, 0x003fcac3}}, Y: Field{[10]uint32{0x00c29907, 0x0147807c, 0x02ceb2c9, 0x01bee438, 0x02c7b7ed, 0x01341e4d, 0x034c4dc5, 0x02e8622b, 0x03fef524, 0x00124f44}}}, + }, + { + {X: Field{[10]uint32{0x0126087e, 0x01012091, 0x020308f5, 0x02220b68, 0x01fdfb6d, 0x01e62e17, 0x009b6041, 0x033a5f07, 0x01ce97ee, 0x003fcac3}}, Y: Field{[10]uint32{0x00c29907, 0x0147807c, 0x02ceb2c9, 0x01bee438, 0x02c7b7ed, 0x01341e4d, 0x034c4dc5, 0x02e8622b, 0x03fef524, 0x00124f44}}}, + {X: Field{[10]uint32{0x0149f8ef, 0x00ea6bcc, 0x034583bd, 0x013b98e2, 0x023deb5c, 0x032c6ec8, 0x0229ebbe, 0x01b27de3, 0x03bc5f36, 0x000a60b6}}, Y: Field{[10]uint32{0x02c7a248, 0x01c9ac05, 0x02d8456e, 0x02504b8f, 0x01095db9, 0x01ed6f27, 0x03a5339c, 0x00882ae7, 0x03e9af66, 0x002986d6}}}, + {X: Field{[10]uint32{0x01d681f9, 0x00153f9e, 0x02b9fc59, 0x03beb23f, 0x0066ce0e, 0x000b252c, 0x037ff25e, 0x008c2222, 0x01f2775f, 0x0031d17f}}, Y: Field{[10]uint32{0x03bb1247, 0x005cd0de, 0x005c7603, 0x00d719f5, 0x038cdbd3, 0x003a0619, 0x031394c7, 0x03979e29, 0x02f2f6b9, 0x00164088}}}, + {X: Field{[10]uint32{0x0380441b, 0x0227d848, 0x03658852, 0x01160385, 0x0060011f, 0x0125f6d6, 0x036eb590, 0x0303dad0, 0x01042af0, 0x00068a39}}, Y: Field{[10]uint32{0x0052af25, 0x03d81aa1, 0x027aeb05, 0x016d1bb9, 0x0104b3e7, 0x025dbc3b, 0x038329a8, 0x0276adf1, 0x027996c5, 0x00155de6}}}, + {X: Field{[10]uint32{0x01cd0ea3, 0x0133bb4d, 0x004815e0, 0x03a0832b, 0x02b34478, 0x019cb9fc, 0x0259e5eb, 0x00142c9e, 0x01f3a975, 0x002aec9e}}, Y: Field{[10]uint32{0x00307bce, 0x024c4cdf, 0x033b6470, 0x0016780b, 0x007c9769, 0x00c1e3b5, 0x034be0c0, 0x025c367e, 0x003bbf17, 0x00177b84}}}, + {X: Field{[10]uint32{0x009a2115, 0x03f54d19, 0x025ebe77, 0x00245e95, 0x02ec7960, 0x01902606, 0x006aca9d, 0x031b1b75, 0x0052b194, 0x003f5cf0}}, Y: Field{[10]uint32{0x02ba6cda, 0x032adee9, 0x0021f049, 0x0158ba75, 0x0104f601, 0x01bdf5b6, 0x00abab02, 0x02211008, 0x00c1c817, 0x001881da}}}, + {X: Field{[10]uint32{0x03c9ee3e, 0x038bcfc6, 0x0382c5c2, 0x02a58f9c, 0x01ea9fa1, 0x0099fb44, 0x03aeaa74, 0x01a0a09f, 0x010b59fc, 0x000fe045}}, Y: Field{[10]uint32{0x019aae06, 0x02b6c316, 0x001603ce, 0x0373f36a, 0x027623b2, 0x011e5598, 0x031beb3c, 0x02a0b519, 0x0268fdbf, 0x00067222}}}, + {X: Field{[10]uint32{0x021e30a7, 0x03c38e58, 0x003242ee, 0x02de6176, 0x002edd5e, 0x034fc805, 0x0250cc0b, 0x00c18074, 0x03e9535f, 0x000322e0}}, Y: Field{[10]uint32{0x03f688de, 0x03defae7, 0x0134dbeb, 0x00dee61c, 0x00aacad2, 0x03bf7215, 0x010e3f17, 0x036b1ee1, 0x0077065f, 0x0003731c}}}, + {X: Field{[10]uint32{0x00e4a007, 0x006fbebe, 0x0358b617, 0x033c22ec, 0x0015ecee, 0x0295b1fb, 0x014ba33a, 0x00b79a56, 0x032dd008, 0x00173e04}}, Y: Field{[10]uint32{0x0068b883, 0x00fc2424, 0x03fe8ce6, 0x025b1e71, 0x02c8946f, 0x01230f7d, 0x02d41588, 0x03e837d2, 0x025c0d61, 0x002d16bb}}}, + {X: Field{[10]uint32{0x003c18e1, 0x00fbf313, 0x03230300, 0x03eeeab5, 0x00ba4ae5, 0x012eb1fd, 0x02267110, 0x0035ae44, 0x01458351, 0x002cfe81}}, Y: Field{[10]uint32{0x02aa2b4f, 0x007efb84, 0x02542cb1, 0x0267c433, 0x01aa55a4, 0x0193f9bf, 0x02182980, 0x03d5adee, 0x00759340, 0x002a1709}}}, + {X: Field{[10]uint32{0x02c2d4a7, 0x01bf9ec9, 0x03fb1095, 0x024cef3f, 0x021bc36f, 0x031013b4, 0x03e33973, 0x02925194, 0x024d0d4b, 0x002db57f}}, Y: Field{[10]uint32{0x02e86371, 0x03739f8e, 0x03cc8118, 0x0139bd78, 0x02745b7e, 0x037fff63, 0x03cf9209, 0x035b0537, 0x03a13abb, 0x0011fcdc}}}, + {X: Field{[10]uint32{0x03816b2f, 0x021b0d46, 0x02e11fdb, 0x021048a3, 0x01ee0cb7, 0x009b1757, 0x00165fe1, 0x00699dba, 0x02dd6595, 0x00169351}}, Y: Field{[10]uint32{0x03e86c60, 0x01ebae1c, 0x00cebaf9, 0x0317ecfb, 0x02b50e6c, 0x03cf7f35, 0x003e27f8, 0x0182ac0a, 0x0396ca0e, 0x001df248}}}, + {X: Field{[10]uint32{0x0066dd33, 0x00cd88bf, 0x036dc509, 0x023fc771, 0x02ea8fbc, 0x000a6c08, 0x03b1b150, 0x01621c1a, 0x03c066cf, 0x0018722e}}, Y: Field{[10]uint32{0x02f10bfa, 0x02ea7ced, 0x00c8ca3b, 0x03ab0a08, 0x036a5106, 0x026174fe, 0x0269994b, 0x03dc0d11, 0x02239e54, 0x0024d667}}}, + {X: Field{[10]uint32{0x035cacbb, 0x019233cc, 0x01b26fce, 0x00a2f58d, 0x0118ac30, 0x0318899c, 0x0177e5bd, 0x003335ee, 0x01b12c72, 0x0013f5a6}}, Y: Field{[10]uint32{0x021ad839, 0x00bbea23, 0x03e6133b, 0x02cba088, 0x00aa998e, 0x036d878b, 0x0079dbfc, 0x0282bb65, 0x02f3f511, 0x0031b243}}}, + {X: Field{[10]uint32{0x016b2ff8, 0x016df337, 0x008fa980, 0x0305ca1b, 0x01876336, 0x03b0ef7c, 0x009f5373, 0x01e1461f, 0x03a57426, 0x002538ca}}, Y: Field{[10]uint32{0x00e1af3e, 0x0121554b, 0x03e13add, 0x010949af, 0x00b33af0, 0x018b67a3, 0x031e4886, 0x0013864b, 0x008b43da, 0x000346d1}}}, + {X: Field{[10]uint32{0x0056e241, 0x03978b3e, 0x01d28780, 0x0052335b, 0x0357f1ee, 0x0006c84a, 0x012b2e63, 0x0203aa7b, 0x03e4b1e8, 0x00209fee}}, Y: Field{[10]uint32{0x02c293ec, 0x016da2eb, 0x03166d60, 0x00c61a40, 0x007ff7a6, 0x0347449a, 0x03ef2c67, 0x01ec2dc6, 0x00923c72, 0x003183e7}}}, + }, + { + {X: Field{[10]uint32{0x0056e241, 0x03978b3e, 0x01d28780, 0x0052335b, 0x0357f1ee, 0x0006c84a, 0x012b2e63, 0x0203aa7b, 0x03e4b1e8, 0x00209fee}}, Y: Field{[10]uint32{0x02c293ec, 0x016da2eb, 0x03166d60, 0x00c61a40, 0x007ff7a6, 0x0347449a, 0x03ef2c67, 0x01ec2dc6, 0x00923c72, 0x003183e7}}}, + {X: Field{[10]uint32{0x00b1815d, 0x03912dc3, 0x03461ef6, 0x024862e1, 0x0260470a, 0x01db9acd, 0x02d7c8d5, 0x01ae5cf8, 0x02a7dce5, 0x002ddfc4}}, Y: Field{[10]uint32{0x0257dbc5, 0x00f4af23, 0x0016d6ba, 0x03e46912, 0x014c42f0, 0x00f30b99, 0x00cefb37, 0x02b310fc, 0x01b14f86, 0x0012dbe1}}}, + {X: Field{[10]uint32{0x03b80fa7, 0x012172ce, 0x01388634, 0x01aedc10, 0x033aa7da, 0x00c82067, 0x011a06bd, 0x030bef03, 0x031f6308, 0x000215f8}}, Y: Field{[10]uint32{0x01366b2d, 0x020847c2, 0x0016abd9, 0x0010f35c, 0x03172e37, 0x0372dc51, 0x017cc9d1, 0x005c824b, 0x03423ae0, 0x003d90e4}}}, + {X: Field{[10]uint32{0x005565ec, 0x0176b4b1, 0x005970fe, 0x037d25df, 0x02d858d8, 0x02de7e55, 0x03308b2c, 0x02fc491e, 0x03943018, 0x001225ce}}, Y: Field{[10]uint32{0x02ed07e9, 0x01e41d7e, 0x037b83b8, 0x02596011, 0x01511b35, 0x005116bc, 0x037bb3a0, 0x03706d90, 0x01684f3c, 0x001d87dd}}}, + {X: Field{[10]uint32{0x01c70e63, 0x000b0e82, 0x01496f5d, 0x01e39d4f, 0x029cbb8b, 0x019299cb, 0x005c6557, 0x018010d5, 0x00ea56bd, 0x000a2ab3}}, Y: Field{[10]uint32{0x0057da4e, 0x000e20bc, 0x021e8b9f, 0x03391136, 0x03f5fc59, 0x01da3aed, 0x0289667c, 0x0038559e, 0x022ef81a, 0x000ada4c}}}, + {X: Field{[10]uint32{0x036d6cd3, 0x0002af9e, 0x0378833a, 0x00740e24, 0x03341661, 0x015948e5, 0x0269b870, 0x02061206, 0x02167f2b, 0x003a8499}}, Y: Field{[10]uint32{0x00f450be, 0x018a497d, 0x01a88aae, 0x00b7aef8, 0x01b1c975, 0x00451789, 0x00e112bf, 0x038ff6ab, 0x02e5078e, 0x00086938}}}, + {X: Field{[10]uint32{0x03e674b5, 0x03714bdc, 0x00aac601, 0x02739c18, 0x0392d8f6, 0x033ae293, 0x01db2c9b, 0x02998517, 0x0225a055, 0x0028bced}}, Y: Field{[10]uint32{0x02937941, 0x00e32383, 0x03a53b09, 0x00c5f0cf, 0x039222fa, 0x00ca9f12, 0x0044a90f, 0x01a2ba00, 0x0159614c, 0x001883a8}}}, + {X: Field{[10]uint32{0x03fd71fa, 0x0135d0ae, 0x027d4a4d, 0x00996d14, 0x030b775a, 0x029c1305, 0x02972728, 0x015671b5, 0x018e8eb5, 0x003a4c49}}, Y: Field{[10]uint32{0x034d3307, 0x02f434c5, 0x035f33d9, 0x0386ed78, 0x00b3946c, 0x032552d0, 0x01eb4169, 0x037b83a1, 0x03364c3f, 0x003ec78c}}}, + {X: Field{[10]uint32{0x011eb056, 0x00058c76, 0x01386c76, 0x036e3b3f, 0x01a002ef, 0x00fd457d, 0x018b5c6a, 0x01648c76, 0x03c9eaae, 0x000f13e0}}, Y: Field{[10]uint32{0x005cecab, 0x01624f68, 0x02b87742, 0x0112073d, 0x001982b5, 0x00ec9e20, 0x02d6573c, 0x022da8ce, 0x0007514a, 0x002511e4}}}, + {X: Field{[10]uint32{0x008fadf1, 0x00f632d5, 0x01f9de64, 0x021e9c4b, 0x0300359b, 0x0224605e, 0x0365f8de, 0x01091270, 0x00387f7f, 0x003b7ce1}}, Y: Field{[10]uint32{0x00415fb6, 0x010db3db, 0x03d2879c, 0x004f7a8d, 0x030f4e88, 0x0082a9ad, 0x01802351, 0x0214037b, 0x01b0a189, 0x001cb4ed}}}, + {X: Field{[10]uint32{0x0186dfa9, 0x0187f6ef, 0x013a7190, 0x029026e6, 0x02dc38b4, 0x02040eea, 0x01c1e03e, 0x019f538a, 0x01288a99, 0x002bfe38}}, Y: Field{[10]uint32{0x01d12681, 0x000f0db0, 0x039c7071, 0x02a51067, 0x00f9116d, 0x03f3d4fd, 0x013ebaa1, 0x01f0ff4f, 0x03b32137, 0x002362d2}}}, + {X: Field{[10]uint32{0x00ff55c5, 0x008f5097, 0x01ec9771, 0x00a0689d, 0x035f4efd, 0x020ad2d8, 0x0012c1e7, 0x0110b29b, 0x01fdfb25, 0x0033cdab}}, Y: Field{[10]uint32{0x01a0228e, 0x009e2148, 0x02706aca, 0x03097034, 0x03a7547e, 0x02f67c81, 0x002f58b3, 0x01da1927, 0x02166ae0, 0x00345a84}}}, + {X: Field{[10]uint32{0x009ba9c1, 0x009cdae6, 0x0338e28f, 0x02968274, 0x01e40f7c, 0x03b3b95e, 0x0058262a, 0x0002cfa1, 0x004528dc, 0x0034fede}}, Y: Field{[10]uint32{0x0351b267, 0x02e237fa, 0x02de0061, 0x03570046, 0x02341ced, 0x022dc3f9, 0x03ca0575, 0x02d39f29, 0x0034efa6, 0x003e2535}}}, + {X: Field{[10]uint32{0x0181f79b, 0x015032f0, 0x02db4fe8, 0x01943392, 0x02e045d8, 0x01a97289, 0x01f82e7c, 0x037ebb8b, 0x00a26c63, 0x000c7203}}, Y: Field{[10]uint32{0x01225400, 0x027949b5, 0x025f1f0b, 0x03abd444, 0x01622ff9, 0x023cc364, 0x014e4d36, 0x009b7cc2, 0x02c12029, 0x0024ad67}}}, + {X: Field{[10]uint32{0x032bb909, 0x025b0743, 0x00d999da, 0x01f14d66, 0x03639102, 0x02461f5f, 0x00729883, 0x02aa23fd, 0x000e0ac9, 0x0013b24c}}, Y: Field{[10]uint32{0x00cf4071, 0x028e0fe9, 0x03827b88, 0x020836b0, 0x02d52e16, 0x0213126e, 0x000dc451, 0x00137172, 0x0106be1b, 0x001e0ae8}}}, + {X: Field{[10]uint32{0x0120e2b3, 0x02d63e88, 0x039aa7f3, 0x0339fd1f, 0x017a58fd, 0x0339b948, 0x03e4ae34, 0x02f6eb9e, 0x01f21f51, 0x003aa992}}, Y: Field{[10]uint32{0x025ad93d, 0x0294c16e, 0x03e59d47, 0x0197c4fd, 0x0201a6b9, 0x021e6a96, 0x01a80f89, 0x02c0eb1a, 0x01ed5bbb, 0x002f8c9e}}}, + }, + { + {X: Field{[10]uint32{0x0120e2b3, 0x02d63e88, 0x039aa7f3, 0x0339fd1f, 0x017a58fd, 0x0339b948, 0x03e4ae34, 0x02f6eb9e, 0x01f21f51, 0x003aa992}}, Y: Field{[10]uint32{0x025ad93d, 0x0294c16e, 0x03e59d47, 0x0197c4fd, 0x0201a6b9, 0x021e6a96, 0x01a80f89, 0x02c0eb1a, 0x01ed5bbb, 0x002f8c9e}}}, + {X: Field{[10]uint32{0x03c9b0a8, 0x02f07307, 0x03db453d, 0x0171c17c, 0x029e337b, 0x00089e7a, 0x0223ea50, 0x025fbb09, 0x01b3beb9, 0x000eb6e7}}, Y: Field{[10]uint32{0x005bbdda, 0x039e5d7c, 0x026cc61a, 0x03e61c09, 0x02aad9c8, 0x030257fd, 0x0374de07, 0x0139c4f1, 0x016daee7, 0x000dd38b}}}, + {X: Field{[10]uint32{0x032e070d, 0x00ff4e8f, 0x02a98f58, 0x007314a9, 0x0229aab7, 0x021411f8, 0x00731c3b, 0x012affd2, 0x01e9042f, 0x0012dca9}}, Y: Field{[10]uint32{0x016dd780, 0x02ea0bba, 0x00c3de44, 0x03774a52, 0x00b0b465, 0x0343cf04, 0x0277bb36, 0x03873d80, 0x014e1d6a, 0x00166787}}}, + {X: Field{[10]uint32{0x00ae86f9, 0x03a78324, 0x03caf054, 0x015a58f9, 0x01fefdff, 0x01b17f1a, 0x010955e5, 0x0272edf8, 0x03ac428e, 0x0004a794}}, Y: Field{[10]uint32{0x0289c85d, 0x03bf7347, 0x0201b822, 0x03f45acf, 0x03b2a232, 0x01c4860f, 0x01a2115b, 0x0268a6cb, 0x03958aee, 0x001057b2}}}, + {X: Field{[10]uint32{0x0202591c, 0x039ff612, 0x025a1e9c, 0x02596144, 0x013ef549, 0x01787f58, 0x026bfbeb, 0x03238a16, 0x03fc6539, 0x002a7f24}}, Y: Field{[10]uint32{0x01bec2dc, 0x02b77bda, 0x03253790, 0x01057f3d, 0x01ca888c, 0x02a45979, 0x004c17a1, 0x021c5cfa, 0x0339dc53, 0x00270b39}}}, + {X: Field{[10]uint32{0x005912ec, 0x01c0283e, 0x01113428, 0x00139182, 0x0327f9ca, 0x02abc150, 0x03499694, 0x016de1aa, 0x01d4e3fb, 0x002a9c48}}, Y: Field{[10]uint32{0x02e35978, 0x0132c992, 0x02cbdb11, 0x02a33815, 0x03fee134, 0x01a8bb7a, 0x005266b9, 0x02542714, 0x0077dad0, 0x0031a43c}}}, + {X: Field{[10]uint32{0x01968b59, 0x001b838b, 0x03c2e110, 0x02b84f2e, 0x0309a28b, 0x0026c09d, 0x03d7ac12, 0x027c29a9, 0x017c1a6f, 0x00325000}}, Y: Field{[10]uint32{0x01e572fb, 0x035d9023, 0x009c8fef, 0x02d90e43, 0x00e2842c, 0x016d5d0b, 0x038a1bfa, 0x0218804e, 0x02500c9b, 0x000e7648}}}, + {X: Field{[10]uint32{0x0055b8da, 0x0090f57a, 0x00711922, 0x01f44a25, 0x02c75626, 0x03b84255, 0x005ecb6a, 0x0251216e, 0x0094c8f6, 0x00180511}}, Y: Field{[10]uint32{0x034e4bbd, 0x0001643c, 0x02a4bad5, 0x0309f8fc, 0x03543955, 0x004cb996, 0x00be1fd9, 0x03991a7a, 0x0269f681, 0x0022ed75}}}, + {X: Field{[10]uint32{0x026b3332, 0x01cccd5c, 0x01de6a28, 0x0341cfb9, 0x00310388, 0x01c2fe38, 0x02793a5f, 0x000093b1, 0x039d7eed, 0x0007e12e}}, Y: Field{[10]uint32{0x00e8d52e, 0x010a28c5, 0x003a2554, 0x00b50db7, 0x00c2bcce, 0x016e7b7c, 0x007c27f7, 0x027b3095, 0x01072bca, 0x003b9c9b}}}, + {X: Field{[10]uint32{0x01972bcb, 0x02565e6c, 0x00ceb9dd, 0x00f8907b, 0x02c2f22e, 0x03b685dd, 0x028e0213, 0x027c0a3d, 0x0057c8bb, 0x000f7cb4}}, Y: Field{[10]uint32{0x025d09df, 0x008b34f5, 0x00771b28, 0x025a0065, 0x031b9144, 0x011a9a12, 0x026b23b0, 0x01bbab5b, 0x01c640c8, 0x00371fac}}}, + {X: Field{[10]uint32{0x01efa98e, 0x02a952b3, 0x027995cd, 0x01a046b0, 0x03724844, 0x02647a71, 0x028157b3, 0x03f341b2, 0x00890945, 0x0003c4f8}}, Y: Field{[10]uint32{0x02286767, 0x029dda6f, 0x02ccdc08, 0x01785b3a, 0x03287e70, 0x01ecd8b6, 0x023f8b0a, 0x01f140d7, 0x01f1764e, 0x002b7548}}}, + {X: Field{[10]uint32{0x03d292dc, 0x001a893f, 0x014ce1b8, 0x0202c5dc, 0x01775e26, 0x01ef5e76, 0x008070d3, 0x03e4d2e9, 0x01533720, 0x0012e645}}, Y: Field{[10]uint32{0x03095ca6, 0x0297ff95, 0x02afd433, 0x03116cdd, 0x03938323, 0x017c07d5, 0x03c0a74b, 0x00e889b7, 0x01496110, 0x0038c9dd}}}, + {X: Field{[10]uint32{0x01f59b6b, 0x00700efa, 0x00e2fa5e, 0x018f0622, 0x03e9b38c, 0x035609b4, 0x0328a1d2, 0x03b1f6cd, 0x01a551dd, 0x00377864}}, Y: Field{[10]uint32{0x02cb1410, 0x03658a49, 0x00fecf6a, 0x02ef9c55, 0x028b5738, 0x0314b853, 0x02757d61, 0x01d72f82, 0x03780282, 0x0016cafe}}}, + {X: Field{[10]uint32{0x03b43eeb, 0x0346cd08, 0x0184feee, 0x0006fe04, 0x00181c94, 0x03cd6717, 0x024825ff, 0x017a4dfa, 0x03979eb9, 0x0020f100}}, Y: Field{[10]uint32{0x0084fb51, 0x00d021b5, 0x03b40aff, 0x032ad54f, 0x0295b6bf, 0x0003586c, 0x03c1e46d, 0x03b8f42f, 0x03f2437c, 0x000a55d7}}}, + {X: Field{[10]uint32{0x01c6b699, 0x03157f72, 0x02871b68, 0x00d5af91, 0x02a86f57, 0x01ed05a0, 0x016d7bf9, 0x01bde968, 0x012eed83, 0x0017eac0}}, Y: Field{[10]uint32{0x01c6c3aa, 0x00c854b0, 0x03519b17, 0x01ffaa20, 0x0390ab11, 0x00358bde, 0x02bb4113, 0x034513a7, 0x0270a3c3, 0x000b66fe}}}, + {X: Field{[10]uint32{0x0234d24f, 0x00d8cb76, 0x037401e2, 0x03c32684, 0x0141b6d8, 0x033d0bb9, 0x011df6de, 0x005a764e, 0x0143c5cf, 0x0039290b}}, Y: Field{[10]uint32{0x02ba9414, 0x03dc4c77, 0x024f13a7, 0x037ea363, 0x00e886ee, 0x02e2b4d3, 0x03c99ccf, 0x031cd49b, 0x02e716d1, 0x001367e4}}}, + }, + { + {X: Field{[10]uint32{0x0234d24f, 0x00d8cb76, 0x037401e2, 0x03c32684, 0x0141b6d8, 0x033d0bb9, 0x011df6de, 0x005a764e, 0x0143c5cf, 0x0039290b}}, Y: Field{[10]uint32{0x02ba9414, 0x03dc4c77, 0x024f13a7, 0x037ea363, 0x00e886ee, 0x02e2b4d3, 0x03c99ccf, 0x031cd49b, 0x02e716d1, 0x001367e4}}}, + {X: Field{[10]uint32{0x028f62bb, 0x03cba8cf, 0x00d2a303, 0x018bdeb9, 0x010553c5, 0x01b13bd3, 0x030acf85, 0x02c634fb, 0x01fb84cf, 0x003f5914}}, Y: Field{[10]uint32{0x032c0911, 0x03642184, 0x0283fd0a, 0x024b4803, 0x00fa2ab4, 0x02f0d133, 0x03e7a5c1, 0x0055e2db, 0x02b2b187, 0x0039d173}}}, + {X: Field{[10]uint32{0x03ea0c68, 0x01042bce, 0x0392b5c8, 0x008d9dec, 0x03094301, 0x034e5beb, 0x009bc8e8, 0x028e8925, 0x0234e156, 0x000f9065}}, Y: Field{[10]uint32{0x0245edb6, 0x02dbfdc6, 0x01a1abcb, 0x0118c0f3, 0x022fa119, 0x01c1a4c1, 0x033cbfe3, 0x0087dfcd, 0x019d924b, 0x000048f1}}}, + {X: Field{[10]uint32{0x01fe696b, 0x0347ee75, 0x007a1fa1, 0x035773cf, 0x030042e2, 0x03e7b6ee, 0x02e81a06, 0x021af1c5, 0x007cb240, 0x0007bb88}}, Y: Field{[10]uint32{0x0029337b, 0x0159c39d, 0x0294ebb4, 0x00b82bf5, 0x037a0206, 0x01187257, 0x03196d12, 0x009a734a, 0x0119aef6, 0x00194b2f}}}, + {X: Field{[10]uint32{0x039824d7, 0x01748f24, 0x01897af7, 0x0130d472, 0x036eb7b6, 0x03dfc2d5, 0x014a3e62, 0x01d423bb, 0x00f5455d, 0x0023650e}}, Y: Field{[10]uint32{0x0366489f, 0x0013d224, 0x0063d8a0, 0x02e0c9ac, 0x038fb9e2, 0x02adbbdb, 0x0260bd31, 0x01b0a8b2, 0x00734fee, 0x000c9878}}}, + {X: Field{[10]uint32{0x03d4b84a, 0x02053105, 0x033e69a9, 0x0123c7d0, 0x00621ddf, 0x00a141c1, 0x022a492d, 0x00bf2c31, 0x01e58dc7, 0x003c4ea6}}, Y: Field{[10]uint32{0x03fd1c81, 0x0243f154, 0x01962859, 0x011c43cb, 0x02b6e37d, 0x038ff81b, 0x02b91cd1, 0x03a656a9, 0x00cd0f0b, 0x000cf0b2}}}, + {X: Field{[10]uint32{0x00d713de, 0x0201c6a6, 0x026208e4, 0x03edd0a3, 0x039360c2, 0x03f95150, 0x00a912a2, 0x01510835, 0x00c558ee, 0x002dc949}}, Y: Field{[10]uint32{0x038350e9, 0x03f94966, 0x01fcb76f, 0x01bf9129, 0x010482d2, 0x0275a505, 0x002d182e, 0x00f91441, 0x039a8a28, 0x0013146c}}}, + {X: Field{[10]uint32{0x0394c0d5, 0x0103c67b, 0x0257908d, 0x0005f15c, 0x01e1c0fc, 0x011b8844, 0x025ab2c3, 0x03ac5351, 0x033ea8a9, 0x003303a8}}, Y: Field{[10]uint32{0x03452fe6, 0x02f965eb, 0x03543dea, 0x0099844f, 0x03f6074f, 0x017ef998, 0x03dd203b, 0x0228bec8, 0x023b711c, 0x003e641e}}}, + {X: Field{[10]uint32{0x023b2cb4, 0x01b0a4ff, 0x010402cc, 0x016fcdc8, 0x023049f3, 0x00484527, 0x01c76e38, 0x0049466b, 0x035a216d, 0x000f7917}}, Y: Field{[10]uint32{0x007eb02f, 0x038ceb0c, 0x0044cf61, 0x03996a1c, 0x02823e28, 0x025f2441, 0x0208aa4a, 0x02b77143, 0x0198405e, 0x002e8aa1}}}, + {X: Field{[10]uint32{0x020c0222, 0x02f5d44a, 0x00b559cc, 0x03e720ba, 0x0016937e, 0x005c03cb, 0x00a18bfc, 0x0228111b, 0x024d9ca5, 0x002792b1}}, Y: Field{[10]uint32{0x00fdc9bb, 0x03dd9ce9, 0x0104e16c, 0x003cf6ae, 0x001c6203, 0x00ecc034, 0x000e8df6, 0x039d34c2, 0x011d9fe4, 0x0033a917}}}, + {X: Field{[10]uint32{0x00e4e5bf, 0x011d9bdb, 0x005b1723, 0x021a8240, 0x029b67ca, 0x012241ab, 0x023fce37, 0x02fa1f07, 0x01c68959, 0x0021447c}}, Y: Field{[10]uint32{0x01789c08, 0x024a5130, 0x025262fc, 0x0226f14d, 0x032da878, 0x01aa8008, 0x01ddf7ec, 0x03521d30, 0x01cf91bc, 0x003b37fd}}}, + {X: Field{[10]uint32{0x02735a1e, 0x030ec513, 0x01fa05f0, 0x0259af98, 0x004003e0, 0x018480bf, 0x038cddad, 0x015b2d1a, 0x03c0799b, 0x0019e2b1}}, Y: Field{[10]uint32{0x02f7c055, 0x00e97dc4, 0x01457a36, 0x02ccf4dc, 0x02597fff, 0x01c417a3, 0x030ff3d5, 0x00a16de9, 0x0233d9a5, 0x00021453}}}, + {X: Field{[10]uint32{0x013258ab, 0x0159a28f, 0x014dc31b, 0x02062af0, 0x0157d242, 0x03852ad6, 0x03a1c72e, 0x018088b3, 0x012e81cf, 0x00231681}}, Y: Field{[10]uint32{0x022d0f8f, 0x038214c0, 0x004ade57, 0x03e70365, 0x0246dae8, 0x00130230, 0x01a80c79, 0x02f6841e, 0x034bb443, 0x001a0476}}}, + {X: Field{[10]uint32{0x022aa9b8, 0x03a5dc20, 0x02f8ed7b, 0x00a4cd41, 0x0300006e, 0x0316b517, 0x026895d9, 0x003db375, 0x0114d868, 0x00192ea5}}, Y: Field{[10]uint32{0x02163565, 0x0347ee6d, 0x03b35e93, 0x01bda0c1, 0x025fef1b, 0x0066f927, 0x0207728c, 0x006f6edf, 0x0322a643, 0x002049cf}}}, + {X: Field{[10]uint32{0x0391bcee, 0x030a82af, 0x00d84158, 0x023c7830, 0x03f5cf1d, 0x015afc4d, 0x0063cec5, 0x00d582f7, 0x0016debd, 0x0033bdfe}}, Y: Field{[10]uint32{0x01966b33, 0x0136a7e0, 0x036ac6bb, 0x000a85cb, 0x03a63e4b, 0x00074917, 0x023b339c, 0x021c0491, 0x00836374, 0x0019f9d3}}}, + {X: Field{[10]uint32{0x0300bf19, 0x01cee750, 0x02a49471, 0x01daa23f, 0x0392b535, 0x02cd4ada, 0x0160fada, 0x02f76550, 0x03ef360c, 0x0007b203}}, Y: Field{[10]uint32{0x0107cefd, 0x03370730, 0x0207b671, 0x01fd8a56, 0x020146e7, 0x01eaefd7, 0x03a4958a, 0x00d034bc, 0x013756b5, 0x002bbbfa}}}, + }, + { + {X: Field{[10]uint32{0x0300bf19, 0x01cee750, 0x02a49471, 0x01daa23f, 0x0392b535, 0x02cd4ada, 0x0160fada, 0x02f76550, 0x03ef360c, 0x0007b203}}, Y: Field{[10]uint32{0x0107cefd, 0x03370730, 0x0207b671, 0x01fd8a56, 0x020146e7, 0x01eaefd7, 0x03a4958a, 0x00d034bc, 0x013756b5, 0x002bbbfa}}}, + {X: Field{[10]uint32{0x014ff9e4, 0x03a01750, 0x010560da, 0x03dbaf62, 0x038e8462, 0x013f242e, 0x02eaa034, 0x012f1b2f, 0x023519f0, 0x0016f9fa}}, Y: Field{[10]uint32{0x03e0bdbb, 0x002c1e11, 0x02309403, 0x00c08466, 0x020e99c6, 0x0156adff, 0x03f890f6, 0x0398151d, 0x02c3f638, 0x000cbccb}}}, + {X: Field{[10]uint32{0x02fea1f9, 0x01f2ef14, 0x012b94b1, 0x01423011, 0x01c4ff0b, 0x01c4194c, 0x00fddab6, 0x03cba0ef, 0x000a55d1, 0x0029b722}}, Y: Field{[10]uint32{0x03c345e9, 0x0305391e, 0x037e63b1, 0x036df9a3, 0x00057b89, 0x01ab2f14, 0x00683a11, 0x019f0c0e, 0x00547dc3, 0x001fbc6a}}}, + {X: Field{[10]uint32{0x01db7bb8, 0x02d517d3, 0x03991e3f, 0x01927e14, 0x00d50028, 0x0237dfd7, 0x013fc869, 0x01399420, 0x01116eae, 0x00163c26}}, Y: Field{[10]uint32{0x025b2d6e, 0x031cd60b, 0x00302bde, 0x0018b45d, 0x02507ee4, 0x0118e019, 0x022ff761, 0x00446835, 0x002aaffe, 0x001f81c0}}}, + {X: Field{[10]uint32{0x02d6c9b3, 0x01030fc1, 0x01637c8d, 0x03a1d219, 0x028c6c4c, 0x0229206e, 0x01c229c7, 0x011664af, 0x013fea42, 0x003f9aea}}, Y: Field{[10]uint32{0x0148bdfb, 0x031e23ea, 0x029b00c2, 0x02fc170b, 0x02d980f1, 0x01504ed5, 0x03b41b34, 0x0261cada, 0x00d74053, 0x001fba46}}}, + {X: Field{[10]uint32{0x007985c4, 0x004f9dc7, 0x02b108b6, 0x01256e78, 0x00134bfc, 0x00bdd30d, 0x00284280, 0x026df395, 0x01caf7b5, 0x0008c82d}}, Y: Field{[10]uint32{0x002c6d44, 0x013c77d3, 0x02b8d4ff, 0x00847367, 0x03d96f10, 0x03e6f2a4, 0x00721b81, 0x03a50c63, 0x003dc88b, 0x0031e7e5}}}, + {X: Field{[10]uint32{0x00f95151, 0x03c41cc3, 0x00b64422, 0x01b910b1, 0x01b96480, 0x030237b4, 0x020c8c2d, 0x0262fec0, 0x02f146fc, 0x00057578}}, Y: Field{[10]uint32{0x03f8ecf2, 0x0281f30b, 0x000f9482, 0x02e5f763, 0x01bb204f, 0x022408fe, 0x010e1097, 0x0353b1fe, 0x0231915f, 0x00296dcb}}}, + {X: Field{[10]uint32{0x009a8e2c, 0x030581b3, 0x021c1413, 0x00693306, 0x03823d8d, 0x021832c3, 0x03cc04fd, 0x0242d8ce, 0x00b9b297, 0x002c3e79}}, Y: Field{[10]uint32{0x033d0db4, 0x0019b137, 0x00ee76c2, 0x000b05c7, 0x003350cc, 0x01bf78fc, 0x00bb0b90, 0x0379b507, 0x03f1843a, 0x00127a0a}}}, + {X: Field{[10]uint32{0x016a5658, 0x02042e4a, 0x025643d7, 0x014907bd, 0x023814b2, 0x01eb8a6f, 0x007e0092, 0x0111eb63, 0x00725688, 0x0021303a}}, Y: Field{[10]uint32{0x001b80d1, 0x019ca6f6, 0x01fd22d9, 0x02607d3c, 0x02d3a61a, 0x0194dc97, 0x007e3190, 0x008b1282, 0x0380c160, 0x00099660}}}, + {X: Field{[10]uint32{0x01d6fad4, 0x000bca76, 0x0124c5aa, 0x033c7268, 0x0094b357, 0x004f567d, 0x02d04ce2, 0x0247b23e, 0x0280670a, 0x0015b6d8}}, Y: Field{[10]uint32{0x019e0836, 0x02703f4d, 0x01cc867a, 0x02868c79, 0x03f5b8b2, 0x035a0c31, 0x03591016, 0x009c9143, 0x0394db57, 0x0036834e}}}, + {X: Field{[10]uint32{0x00dc6a0f, 0x02ed7225, 0x01575375, 0x02450bf8, 0x02744341, 0x00b01df0, 0x01264e7a, 0x01cc7559, 0x01c71a93, 0x003fb5ac}}, Y: Field{[10]uint32{0x036fc7e0, 0x0235cb65, 0x00409ccb, 0x024c28ff, 0x031374d5, 0x0134eb88, 0x039181ae, 0x03fc2a11, 0x03e6b0ff, 0x002378aa}}}, + {X: Field{[10]uint32{0x023a809c, 0x0382c2f2, 0x0346d79f, 0x03d75e60, 0x02dab662, 0x00952a27, 0x03cf97e4, 0x037d5afe, 0x02c83933, 0x0004979f}}, Y: Field{[10]uint32{0x009e70d9, 0x032402a5, 0x00a3dda8, 0x00bbc1ff, 0x031e4e3b, 0x015c868d, 0x03747caf, 0x032ce221, 0x02ede254, 0x003834fd}}}, + {X: Field{[10]uint32{0x00e29355, 0x02217c46, 0x00d86db3, 0x024ce5c8, 0x002f1c8e, 0x0008ee76, 0x00ef8604, 0x032f1c3f, 0x01d992d3, 0x000a9a93}}, Y: Field{[10]uint32{0x01cc2872, 0x00f803ed, 0x0076c005, 0x00e99313, 0x01fe905a, 0x009a3e43, 0x00fdc81e, 0x01f831d8, 0x03ba7c4a, 0x00219df7}}}, + {X: Field{[10]uint32{0x03681028, 0x00a54479, 0x01bb47f5, 0x017abf2e, 0x03196e23, 0x036bcf63, 0x033ce97d, 0x008386fc, 0x03f1185d, 0x00286b2c}}, Y: Field{[10]uint32{0x00a11c9d, 0x02918f85, 0x017881f1, 0x009c7e83, 0x0266eecb, 0x0223c316, 0x00475882, 0x02ca6da8, 0x03a61abb, 0x00156a20}}}, + {X: Field{[10]uint32{0x0148dabf, 0x03ea23f8, 0x038eb1f9, 0x02e4d275, 0x01c1add2, 0x017eb9cd, 0x0364ec23, 0x01d51b65, 0x03026c92, 0x00390b64}}, Y: Field{[10]uint32{0x011e1361, 0x00b1d5a0, 0x03eb9d77, 0x01c0679d, 0x00327275, 0x037ce14c, 0x0338cebf, 0x0212c362, 0x022c6e2d, 0x001904e1}}}, + {X: Field{[10]uint32{0x026642be, 0x02d64a0d, 0x03a889dd, 0x01c5f562, 0x03ce3490, 0x02037ea2, 0x0300af46, 0x0030be46, 0x038c0467, 0x00051a9d}}, Y: Field{[10]uint32{0x0183efd0, 0x00a5d20f, 0x01ed1d0b, 0x0074bdf9, 0x030aaa97, 0x02752ca1, 0x0269827f, 0x000a2b75, 0x00ec3354, 0x002cc638}}}, + }, + { + {X: Field{[10]uint32{0x026642be, 0x02d64a0d, 0x03a889dd, 0x01c5f562, 0x03ce3490, 0x02037ea2, 0x0300af46, 0x0030be46, 0x038c0467, 0x00051a9d}}, Y: Field{[10]uint32{0x0183efd0, 0x00a5d20f, 0x01ed1d0b, 0x0074bdf9, 0x030aaa97, 0x02752ca1, 0x0269827f, 0x000a2b75, 0x00ec3354, 0x002cc638}}}, + {X: Field{[10]uint32{0x01de5cac, 0x008d955e, 0x0261911b, 0x00f1fb2c, 0x03eefc98, 0x02f34533, 0x0270b5c0, 0x01f89395, 0x00ce8a59, 0x0015d3bc}}, Y: Field{[10]uint32{0x035a4805, 0x026ba9b1, 0x0008cae5, 0x01efbc40, 0x011a260a, 0x01a6de11, 0x016ada05, 0x00671cef, 0x0130281f, 0x00026e66}}}, + {X: Field{[10]uint32{0x03315443, 0x00e1ce09, 0x027299d9, 0x03552ba1, 0x013d79bb, 0x002850a8, 0x02c89982, 0x024d7fd0, 0x00040660, 0x003f1a5b}}, Y: Field{[10]uint32{0x03d28960, 0x003582d5, 0x011b1749, 0x0218426f, 0x01487ff4, 0x01a59ded, 0x030e1cdd, 0x01624aef, 0x03ebf83b, 0x00383389}}}, + {X: Field{[10]uint32{0x020966d3, 0x030b5d09, 0x00645808, 0x0306bbfe, 0x0110a770, 0x026320d7, 0x0109397b, 0x03e7e176, 0x02799d8b, 0x0034f65f}}, Y: Field{[10]uint32{0x033c2e52, 0x03ae1420, 0x004eebdd, 0x0046fa37, 0x03b5e487, 0x03500eb4, 0x02a89275, 0x032579aa, 0x006376ba, 0x002376ed}}}, + {X: Field{[10]uint32{0x02fdb4eb, 0x02cbd705, 0x02a79d1b, 0x01e718b9, 0x028fa3dd, 0x00afac24, 0x0256a356, 0x03cab46b, 0x0221ff4f, 0x0025d2bc}}, Y: Field{[10]uint32{0x01f6f484, 0x0270f7ea, 0x00234840, 0x00a8efff, 0x01111c57, 0x00b0243b, 0x011e43d0, 0x000f2993, 0x007d5350, 0x0015548e}}}, + {X: Field{[10]uint32{0x006b5b56, 0x01857f5f, 0x00b607f3, 0x02abb622, 0x014185c8, 0x02fc8039, 0x03587ed3, 0x010ce337, 0x025700ef, 0x00283a21}}, Y: Field{[10]uint32{0x021d7518, 0x02f7944e, 0x00a51a16, 0x0075c216, 0x01526b87, 0x0214f7ab, 0x01a6b89b, 0x02b542e6, 0x02839fa9, 0x003d6e91}}}, + {X: Field{[10]uint32{0x015aeee3, 0x0012b6d7, 0x00813739, 0x030d9963, 0x01e8284b, 0x01a49c31, 0x0121b3a6, 0x00e62c24, 0x019b49de, 0x0016eaad}}, Y: Field{[10]uint32{0x00f69717, 0x00a6bedc, 0x01eed82d, 0x0276af4c, 0x03215ddc, 0x007ff6bd, 0x01a00866, 0x01fa15b9, 0x03617c0f, 0x002295df}}}, + {X: Field{[10]uint32{0x028c6d4b, 0x003ee4e5, 0x00c12004, 0x033e3d25, 0x02b2be78, 0x032efb82, 0x0174e782, 0x006261ee, 0x013288b3, 0x002c6a99}}, Y: Field{[10]uint32{0x0091ac51, 0x02798aba, 0x03cc383d, 0x02427588, 0x03100a1d, 0x0358ea0e, 0x004aa8e2, 0x0035c49a, 0x031c6081, 0x001fb581}}}, + {X: Field{[10]uint32{0x01726890, 0x02c7913d, 0x03d15851, 0x03fab20d, 0x02e59025, 0x03e44283, 0x0032fceb, 0x0310f404, 0x03a7eb49, 0x003eda17}}, Y: Field{[10]uint32{0x0035783a, 0x03aa3cee, 0x039b2606, 0x004ba439, 0x014fa6cb, 0x02192e82, 0x01ca16d9, 0x0178ba1a, 0x0322c98e, 0x0035d437}}}, + {X: Field{[10]uint32{0x02c6e5bb, 0x03b6bb18, 0x03e6ab7e, 0x03b8d5b3, 0x0324fdff, 0x024a965f, 0x00ab0b83, 0x00417cd6, 0x004108c7, 0x0009445b}}, Y: Field{[10]uint32{0x037e1321, 0x011cca83, 0x0272d4dc, 0x037d4730, 0x0377c508, 0x02057763, 0x037406dc, 0x01df807a, 0x0113e771, 0x0018361a}}}, + {X: Field{[10]uint32{0x00bca48a, 0x012fc4ea, 0x0362f546, 0x03d3a0f7, 0x0178b4d5, 0x00a1fdc7, 0x0327b91c, 0x0265682a, 0x03f659e2, 0x00177963}}, Y: Field{[10]uint32{0x02fd41cd, 0x0253a034, 0x00aa9587, 0x0271383e, 0x003fe5bd, 0x014b4f21, 0x01a623c2, 0x026d54c2, 0x033d8035, 0x001a168e}}}, + {X: Field{[10]uint32{0x00cedd26, 0x01977dd4, 0x015541d7, 0x0277a95c, 0x023cc8b9, 0x0258e78a, 0x01d8100f, 0x03aec984, 0x00372961, 0x002be212}}, Y: Field{[10]uint32{0x00e43f7f, 0x039eb4ec, 0x001708b6, 0x01219ea9, 0x0254549e, 0x02fb4be5, 0x00cbb88e, 0x01c0c34a, 0x03f97b16, 0x003715fe}}}, + {X: Field{[10]uint32{0x01ef63b6, 0x00e0d139, 0x0182ebde, 0x0059cc6c, 0x005ab4d0, 0x02d3f072, 0x01b7fda3, 0x0062febc, 0x01cdead6, 0x001bc609}}, Y: Field{[10]uint32{0x01c655f3, 0x0211b3d1, 0x0145412c, 0x019009fe, 0x013c895a, 0x020ccd15, 0x034204d7, 0x02446e63, 0x027dd591, 0x003fc25f}}}, + {X: Field{[10]uint32{0x02a50e2d, 0x02796c7e, 0x00bdc39f, 0x03b3dab9, 0x00b5a275, 0x00206b74, 0x0256e3ea, 0x0200d96c, 0x02605b88, 0x00148435}}, Y: Field{[10]uint32{0x02fda8ee, 0x026a24d6, 0x0286eb02, 0x03371909, 0x035a273d, 0x03fd9622, 0x0013c0e7, 0x034c04e7, 0x034a5dec, 0x000d7d99}}}, + {X: Field{[10]uint32{0x00a63f3b, 0x0011fb7d, 0x039727b5, 0x000665e3, 0x0183203b, 0x039db1d9, 0x007115f5, 0x028ddad6, 0x0095f762, 0x00317b2e}}, Y: Field{[10]uint32{0x01005024, 0x03cdd1a1, 0x03ee5b53, 0x03b978c2, 0x008beb65, 0x03e48cfb, 0x02a4058f, 0x0207cdd3, 0x01181978, 0x00088949}}}, + {X: Field{[10]uint32{0x0180eef9, 0x01aa1e4c, 0x039776d7, 0x008268a2, 0x028d0012, 0x02a81ec4, 0x03acebb1, 0x0397c1f8, 0x00f61d22, 0x003e9430}}, Y: Field{[10]uint32{0x034f2811, 0x03635f4f, 0x0213b38c, 0x024e95e8, 0x025e6832, 0x00a069a2, 0x02cd2872, 0x03aea6dc, 0x02922397, 0x001ae131}}}, + }, + { + {X: Field{[10]uint32{0x0180eef9, 0x01aa1e4c, 0x039776d7, 0x008268a2, 0x028d0012, 0x02a81ec4, 0x03acebb1, 0x0397c1f8, 0x00f61d22, 0x003e9430}}, Y: Field{[10]uint32{0x034f2811, 0x03635f4f, 0x0213b38c, 0x024e95e8, 0x025e6832, 0x00a069a2, 0x02cd2872, 0x03aea6dc, 0x02922397, 0x001ae131}}}, + {X: Field{[10]uint32{0x007f5048, 0x016f88c6, 0x006d459c, 0x0349120e, 0x02e72328, 0x00ba420d, 0x00140fe0, 0x01d381e0, 0x02ee6190, 0x0018e593}}, Y: Field{[10]uint32{0x01309df8, 0x028a1362, 0x02c84383, 0x024d3779, 0x013d580b, 0x00d2fef2, 0x01ff9b1c, 0x033d068e, 0x033a6b89, 0x000edb3e}}}, + {X: Field{[10]uint32{0x01da5e12, 0x03838ce4, 0x00b2971e, 0x0100572b, 0x02a9c60a, 0x028728ad, 0x02329f93, 0x038c6f36, 0x023c4379, 0x003dd40b}}, Y: Field{[10]uint32{0x0385f4eb, 0x02e717a0, 0x00ebc7a4, 0x00bbdc97, 0x007b86d3, 0x00f59c81, 0x0170945c, 0x03ebf566, 0x01edd67c, 0x000f15fd}}}, + {X: Field{[10]uint32{0x02db2a65, 0x012e87ae, 0x01a31f81, 0x00ab4f2f, 0x01afd7f1, 0x003f27dd, 0x01469ddf, 0x02df88b4, 0x025b4d15, 0x00168f38}}, Y: Field{[10]uint32{0x01327f1d, 0x005c33c7, 0x03e8ed8b, 0x030f6097, 0x033ee28b, 0x03cfe66b, 0x03a6dbfb, 0x017d8e1c, 0x025b92e0, 0x0022cd04}}}, + {X: Field{[10]uint32{0x00b7d105, 0x0124cc44, 0x03c9f207, 0x012e5395, 0x03f4ca5c, 0x038d156c, 0x024f6624, 0x01618a8e, 0x00f983ae, 0x0004bf9e}}, Y: Field{[10]uint32{0x03794a60, 0x02b1bee7, 0x010b8458, 0x01975bba, 0x031dece2, 0x0269f2dd, 0x02b5aa19, 0x02f3dde1, 0x01a338d6, 0x000818bc}}}, + {X: Field{[10]uint32{0x0232478e, 0x00c481cf, 0x027ed237, 0x023caa6e, 0x0024ab31, 0x03cccac8, 0x02c6b7f3, 0x004e203f, 0x01d60106, 0x00350804}}, Y: Field{[10]uint32{0x004e88d4, 0x0015a074, 0x00cc31ce, 0x00bcd542, 0x036fb24b, 0x012fe11e, 0x02d5f5f4, 0x0138306c, 0x00e9a37d, 0x002eb975}}}, + {X: Field{[10]uint32{0x020c5d05, 0x00760ce7, 0x02daff62, 0x0142a95c, 0x02480e6c, 0x020212c6, 0x004bb102, 0x011cf563, 0x031347df, 0x001daab0}}, Y: Field{[10]uint32{0x01ece63e, 0x01866dd4, 0x02ee3556, 0x033c0579, 0x034b1225, 0x00809897, 0x02f32c83, 0x01c3beaf, 0x02ef0d5c, 0x003bd55d}}}, + {X: Field{[10]uint32{0x029f44d0, 0x01ccdd52, 0x03a0016a, 0x01b9a6a3, 0x0385dbcb, 0x0037907f, 0x010be34f, 0x00fb69a4, 0x01af98f9, 0x00173981}}, Y: Field{[10]uint32{0x01d30105, 0x0017cd22, 0x00cc6c0d, 0x02fe8cbb, 0x00ab3cb1, 0x0071db16, 0x0256bd03, 0x01aff9ee, 0x039bec22, 0x00133773}}}, + {X: Field{[10]uint32{0x0053c086, 0x01bd217f, 0x01aec9e2, 0x00d27268, 0x00c6b55c, 0x017a2041, 0x0260c314, 0x0173321f, 0x025bbe5c, 0x002998ff}}, Y: Field{[10]uint32{0x01016201, 0x03140ca9, 0x00fc0e69, 0x0295ce65, 0x03991ecc, 0x02608f70, 0x01b102c8, 0x007efd74, 0x017f6b21, 0x002d5066}}}, + {X: Field{[10]uint32{0x01f40840, 0x0035a472, 0x0359eaa2, 0x010a7954, 0x03a71df4, 0x00e290d1, 0x00eaa239, 0x03dd07f9, 0x0121121f, 0x00380d1b}}, Y: Field{[10]uint32{0x03d7ce72, 0x0286abfc, 0x033edc39, 0x0269baf4, 0x02269cd3, 0x03b9ee8a, 0x016d4a97, 0x02255b5d, 0x03713c99, 0x000fb9a0}}}, + {X: Field{[10]uint32{0x03758574, 0x02007b52, 0x01c6e9ad, 0x02250d3e, 0x03d83266, 0x02b8af7c, 0x03ca1027, 0x0336096d, 0x027a0206, 0x0037a554}}, Y: Field{[10]uint32{0x0367232a, 0x037c7f3e, 0x02deb4b7, 0x00145568, 0x03bae6a1, 0x03c5a7b5, 0x021dc847, 0x03453938, 0x0056ac93, 0x001334f8}}}, + {X: Field{[10]uint32{0x016ddcd3, 0x01c8dee8, 0x0003556a, 0x000087a8, 0x03044b11, 0x02e1d86b, 0x035beb6c, 0x0267b7de, 0x0136f64e, 0x0006b86b}}, Y: Field{[10]uint32{0x027eb2b7, 0x0118674b, 0x0213c7cc, 0x0377f2ed, 0x0159616a, 0x00841122, 0x0074f775, 0x02488167, 0x014987a0, 0x001c0581}}}, + {X: Field{[10]uint32{0x0185474f, 0x026e2aff, 0x00668d77, 0x00ae258d, 0x02894c4a, 0x011e16ba, 0x02dccbe4, 0x00ab76ff, 0x00e066d3, 0x002369af}}, Y: Field{[10]uint32{0x017b4ef7, 0x03e71f4f, 0x01d7a5fd, 0x024c176f, 0x010b1cc5, 0x01c77ffc, 0x03ddf5d0, 0x0353fe13, 0x006af31e, 0x0004ff1b}}}, + {X: Field{[10]uint32{0x029de533, 0x03ffe242, 0x02e3c80f, 0x019c08d5, 0x002a9bb5, 0x0191c49d, 0x02979f6a, 0x0243e483, 0x01123337, 0x00044e2b}}, Y: Field{[10]uint32{0x01332573, 0x02dc253f, 0x040006a8, 0x002d1528, 0x03f679bd, 0x03e569f7, 0x030dc3e9, 0x0076521b, 0x01b75875, 0x002cd549}}}, + {X: Field{[10]uint32{0x01d042ea, 0x0350959f, 0x02fd06b5, 0x0299163a, 0x02ebfa26, 0x00cf24ef, 0x03d6649e, 0x02e8e6c6, 0x00c7cfb3, 0x001cca6b}}, Y: Field{[10]uint32{0x035c94a1, 0x0233fb0b, 0x034f0ada, 0x01cc77ea, 0x02184897, 0x03eada3b, 0x0284e794, 0x01bc5224, 0x013541b7, 0x00249c92}}}, + {X: Field{[10]uint32{0x03067ec2, 0x00f4cad7, 0x025220e5, 0x02d756ee, 0x021a288a, 0x03623a10, 0x025bf6b7, 0x006846c6, 0x01d0ca72, 0x00368758}}, Y: Field{[10]uint32{0x02d836f1, 0x03ee83c6, 0x0348a655, 0x026749e6, 0x0166a738, 0x0072478a, 0x00076616, 0x00c1b1e7, 0x015a7c99, 0x002055fd}}}, + }, + { + {X: Field{[10]uint32{0x03067ec2, 0x00f4cad7, 0x025220e5, 0x02d756ee, 0x021a288a, 0x03623a10, 0x025bf6b7, 0x006846c6, 0x01d0ca72, 0x00368758}}, Y: Field{[10]uint32{0x02d836f1, 0x03ee83c6, 0x0348a655, 0x026749e6, 0x0166a738, 0x0072478a, 0x00076616, 0x00c1b1e7, 0x015a7c99, 0x002055fd}}}, + {X: Field{[10]uint32{0x00d3c369, 0x0084348b, 0x02934b3c, 0x020f87e3, 0x02236054, 0x03704a0e, 0x005d5f61, 0x0311137e, 0x000b4ef4, 0x00271ef8}}, Y: Field{[10]uint32{0x02329515, 0x038ffae8, 0x01cbd29e, 0x00e859da, 0x003e3115, 0x03390052, 0x0226d455, 0x0034814a, 0x00de74b2, 0x00248830}}}, + {X: Field{[10]uint32{0x0295a8db, 0x021dccbe, 0x036f615d, 0x03111e74, 0x03b83ec0, 0x0246c5c8, 0x02966469, 0x03741067, 0x01a46303, 0x0038fa43}}, Y: Field{[10]uint32{0x030d1cf9, 0x01b3dfc6, 0x00d3d101, 0x025f3261, 0x02fbb1ef, 0x01c0b9da, 0x00faa90c, 0x005e2ec0, 0x03c0056c, 0x003ef94e}}}, + {X: Field{[10]uint32{0x03b8c9e3, 0x03364b5e, 0x0178e76b, 0x029c1504, 0x0174dd06, 0x02333124, 0x01664b23, 0x0098eed5, 0x03f42825, 0x0003f360}}, Y: Field{[10]uint32{0x034aa9ad, 0x03557ef7, 0x03bf4e86, 0x0337c589, 0x03adbeae, 0x017f6da0, 0x018232de, 0x03ef3b47, 0x01cfeac5, 0x001b02f0}}}, + {X: Field{[10]uint32{0x012ee214, 0x02bf5904, 0x0154017a, 0x025e564c, 0x00782a4e, 0x01703007, 0x03650dfd, 0x035dd6a2, 0x02c732e3, 0x0027d3ff}}, Y: Field{[10]uint32{0x0085f37a, 0x01108894, 0x000283ef, 0x024c2f22, 0x019719b6, 0x035d71a7, 0x0296682f, 0x00bcb983, 0x02e1318e, 0x0018e738}}}, + {X: Field{[10]uint32{0x001d0ce6, 0x030f72d5, 0x00d41f4f, 0x028b3d66, 0x02748992, 0x00e817ec, 0x0214cce3, 0x02a504bb, 0x022937f1, 0x00050a56}}, Y: Field{[10]uint32{0x0338bb86, 0x0206a2b5, 0x0241a52a, 0x01806d74, 0x01310895, 0x011020ec, 0x0031c448, 0x0141c46c, 0x0363df11, 0x003fa9d4}}}, + {X: Field{[10]uint32{0x0361a0a5, 0x01a05147, 0x00e3ef8b, 0x0386cf05, 0x004b1253, 0x03d102cb, 0x031a0a41, 0x012b06c5, 0x022d4113, 0x0010c7d8}}, Y: Field{[10]uint32{0x00cef899, 0x01edff9e, 0x0177246b, 0x0010d559, 0x0241baaa, 0x01c8ea9c, 0x02de6519, 0x010e3db5, 0x027fe7aa, 0x0028a60c}}}, + {X: Field{[10]uint32{0x026b64f1, 0x00e6512c, 0x02d995cf, 0x00a3d51d, 0x01b7edcf, 0x01447967, 0x00da4c62, 0x03c04353, 0x007f1b58, 0x001c5d50}}, Y: Field{[10]uint32{0x024234d5, 0x039fbeac, 0x01d2a426, 0x02ddd11c, 0x02b01fe8, 0x00d3321b, 0x02d34011, 0x035543cd, 0x014344e3, 0x0010ed15}}}, + {X: Field{[10]uint32{0x03748503, 0x0099f559, 0x028e7cac, 0x011dcc4c, 0x000e6e0e, 0x03e284ab, 0x0362ef39, 0x023ee1b2, 0x02ddece7, 0x00264f6e}}, Y: Field{[10]uint32{0x02b0cee2, 0x01cd84df, 0x01aa49ba, 0x03da6e2b, 0x0217f87b, 0x01e87d46, 0x01f78478, 0x03bbade1, 0x01ee8569, 0x0029486a}}}, + {X: Field{[10]uint32{0x03421e21, 0x0136ea65, 0x022f4e46, 0x0288f3bf, 0x003aca86, 0x010633eb, 0x00289212, 0x005dcaea, 0x006b84e5, 0x0003083a}}, Y: Field{[10]uint32{0x01aa6a45, 0x020f5928, 0x01349dfc, 0x03d96f42, 0x0386ee76, 0x0386696d, 0x01237a11, 0x02b6b068, 0x01bf76d0, 0x003d587a}}}, + {X: Field{[10]uint32{0x02d23d80, 0x02889d69, 0x00d478de, 0x007c991d, 0x00e10bd1, 0x024258b0, 0x039431cb, 0x017a968c, 0x02ba06ad, 0x001d7c5e}}, Y: Field{[10]uint32{0x000dd57e, 0x02a16c0a, 0x02590986, 0x03b6ed3a, 0x02372ffb, 0x0066d8a4, 0x03c7d0bf, 0x026a031f, 0x02fe1563, 0x00281e98}}}, + {X: Field{[10]uint32{0x03344f7f, 0x0233e712, 0x020c4c71, 0x03f52339, 0x00ee8b89, 0x0349b504, 0x017e32cb, 0x0382b83a, 0x004bd972, 0x000d5332}}, Y: Field{[10]uint32{0x01db82d6, 0x02c46ba9, 0x020ec7e4, 0x0006180b, 0x018e36c6, 0x026ea215, 0x010b493f, 0x01ad759d, 0x0329291c, 0x0027012f}}}, + {X: Field{[10]uint32{0x01ad3413, 0x02e6db58, 0x01684ae2, 0x00100c9f, 0x028db9c0, 0x032e1ede, 0x0295f485, 0x03d2829b, 0x015e11d9, 0x00199e15}}, Y: Field{[10]uint32{0x02bca672, 0x0204081f, 0x02660124, 0x0054eb71, 0x02a6ce2d, 0x01f2f7e7, 0x01266d92, 0x03d91a49, 0x023de278, 0x00144376}}}, + {X: Field{[10]uint32{0x0102b4b1, 0x01ed7e0d, 0x00a44748, 0x01535b02, 0x01c4af25, 0x018884ea, 0x0086c0f2, 0x0250a101, 0x0018da0f, 0x002b3bc5}}, Y: Field{[10]uint32{0x02e85bfc, 0x007e9e59, 0x0078c6f8, 0x0242b7c6, 0x012a3f62, 0x03625c73, 0x00017b53, 0x01e93781, 0x019fd7e8, 0x003134d5}}}, + {X: Field{[10]uint32{0x02cc8563, 0x002bd6c1, 0x001eaac0, 0x016fff84, 0x009224df, 0x00658da2, 0x02c82bd8, 0x01dd22b6, 0x02362cda, 0x003af712}}, Y: Field{[10]uint32{0x0394ccfa, 0x005ef3a8, 0x00f9249b, 0x02492481, 0x03bec407, 0x033753c1, 0x01ee35e6, 0x034d7e6c, 0x0144e856, 0x0019668c}}}, + {X: Field{[10]uint32{0x01064e13, 0x00ec1843, 0x01e062a7, 0x038111bc, 0x0215311d, 0x023f5059, 0x015ff98e, 0x001a41c8, 0x02ff0c97, 0x002a38a0}}, Y: Field{[10]uint32{0x01f4cc0c, 0x01f1cc44, 0x02bd6cef, 0x00f94375, 0x008b679a, 0x02c94562, 0x03b7f3c5, 0x007026af, 0x015b8db8, 0x001fe5cd}}}, + }, + { + {X: Field{[10]uint32{0x01064e13, 0x00ec1843, 0x01e062a7, 0x038111bc, 0x0215311d, 0x023f5059, 0x015ff98e, 0x001a41c8, 0x02ff0c97, 0x002a38a0}}, Y: Field{[10]uint32{0x01f4cc0c, 0x01f1cc44, 0x02bd6cef, 0x00f94375, 0x008b679a, 0x02c94562, 0x03b7f3c5, 0x007026af, 0x015b8db8, 0x001fe5cd}}}, + {X: Field{[10]uint32{0x037653a1, 0x03ae7a9f, 0x027c1c15, 0x02a9d4f5, 0x03efbe9e, 0x03a99b98, 0x0076f805, 0x02bb2f2e, 0x02e7e27f, 0x0032b1bc}}, Y: Field{[10]uint32{0x02c5e556, 0x0042b43f, 0x003a068c, 0x0395a204, 0x0081e83a, 0x010a8d14, 0x01b65d9a, 0x01bc6533, 0x02e5e2aa, 0x003df505}}}, + {X: Field{[10]uint32{0x023979b5, 0x00666c2e, 0x0029e22a, 0x023799fa, 0x00ba288f, 0x03b90394, 0x0337f0b1, 0x03898c9f, 0x03c5cdad, 0x002b8881}}, Y: Field{[10]uint32{0x0050fa6f, 0x00f359a1, 0x0388968f, 0x01f4df53, 0x00fca87b, 0x00eb5c18, 0x00c92452, 0x027dc6b5, 0x02510c07, 0x003aa47f}}}, + {X: Field{[10]uint32{0x0224003d, 0x03d2ac21, 0x00b11cc9, 0x00a508e3, 0x014ab767, 0x016390c9, 0x03c5932e, 0x03481bbe, 0x0246ee37, 0x0039b7f7}}, Y: Field{[10]uint32{0x0216b93b, 0x02194388, 0x017dd754, 0x03a949ff, 0x003b1ce5, 0x0223e488, 0x02f48f7b, 0x00e5263c, 0x03b7be91, 0x0021c9ec}}}, + {X: Field{[10]uint32{0x02fca824, 0x00064403, 0x024fae41, 0x013fa885, 0x01e0be0c, 0x01961518, 0x02c54100, 0x02b39673, 0x010cad72, 0x0032e37b}}, Y: Field{[10]uint32{0x03227361, 0x002f4163, 0x01742f14, 0x037f1e4c, 0x0096ad1f, 0x028b32f1, 0x0316c487, 0x0223216c, 0x008f740d, 0x000ce940}}}, + {X: Field{[10]uint32{0x00e4dd6a, 0x0384787b, 0x01cef559, 0x02728c88, 0x020a00e4, 0x02359311, 0x01eca37e, 0x00ad92f2, 0x00f7b279, 0x001276f9}}, Y: Field{[10]uint32{0x029e3eae, 0x02dca90a, 0x03b69b13, 0x00bf2816, 0x021c3855, 0x01a48956, 0x01fe33db, 0x02071cb1, 0x02984704, 0x002e2d5c}}}, + {X: Field{[10]uint32{0x03cbd327, 0x006d368e, 0x02aee941, 0x01488792, 0x02b04e08, 0x01f9dbb5, 0x0294900d, 0x020d9c23, 0x03298af1, 0x002c314e}}, Y: Field{[10]uint32{0x017be436, 0x01af128b, 0x02a0f161, 0x0031d18d, 0x03d82a22, 0x02d9acab, 0x00f6a601, 0x01fa858e, 0x03401fbd, 0x003b8aa5}}}, + {X: Field{[10]uint32{0x00dce109, 0x00440d52, 0x011d3b0e, 0x005273c8, 0x02e250e3, 0x02b25820, 0x0240cfc7, 0x0208f59a, 0x009cd9a6, 0x000f1382}}, Y: Field{[10]uint32{0x0219aeea, 0x03d9648e, 0x02697e2b, 0x010b65ff, 0x039579e1, 0x015d934d, 0x0357bca1, 0x0246d201, 0x02669fe1, 0x0010feef}}}, + {X: Field{[10]uint32{0x03b836a1, 0x03bed8e5, 0x01ef7de6, 0x017fdd9e, 0x02c80640, 0x039dfd49, 0x018862ec, 0x02e48353, 0x033f329d, 0x001bdae9}}, Y: Field{[10]uint32{0x02832b84, 0x037cbec1, 0x03f934db, 0x014a2387, 0x00d8990c, 0x016fba70, 0x030b8a40, 0x030638f6, 0x0217ff5f, 0x00371de2}}}, + {X: Field{[10]uint32{0x025d5241, 0x015adfe0, 0x012f6680, 0x032a482f, 0x02563ed7, 0x002cfaa2, 0x00277d34, 0x019d394d, 0x01ada779, 0x003e3307}}, Y: Field{[10]uint32{0x0070e10a, 0x02bc0e3c, 0x00bd4960, 0x01b187ac, 0x0052c2d7, 0x01459bc1, 0x03e892fa, 0x01c3facc, 0x024410b1, 0x0004f793}}}, + {X: Field{[10]uint32{0x02b39ede, 0x038d0827, 0x012d42ae, 0x00cb5c18, 0x00310880, 0x004090d8, 0x00ff467e, 0x00abd2ef, 0x027dc742, 0x001f51c6}}, Y: Field{[10]uint32{0x03f6607e, 0x02f3652a, 0x028fd0c9, 0x01f4708a, 0x027795cf, 0x03ff21be, 0x0382231e, 0x0215941e, 0x0319f3a6, 0x0000129e}}}, + {X: Field{[10]uint32{0x00e5f03a, 0x022d6f7d, 0x006d54fe, 0x03ac7858, 0x0196565f, 0x035f7f8d, 0x03dcfb33, 0x02f8cdcd, 0x03dd0289, 0x002030d3}}, Y: Field{[10]uint32{0x023ca504, 0x03d151bf, 0x005cb117, 0x03bc7cc9, 0x03d30b2a, 0x01f72680, 0x02db5700, 0x007b3557, 0x0056a78c, 0x00091f82}}}, + {X: Field{[10]uint32{0x025eb1c1, 0x03527895, 0x01c5aa56, 0x019f36b9, 0x027fcd75, 0x0260bc25, 0x030fcc31, 0x00feb1c1, 0x0163f9b7, 0x003c0094}}, Y: Field{[10]uint32{0x01de2ae0, 0x01f5c11b, 0x011e57da, 0x01735b34, 0x018576ff, 0x0289abfb, 0x026b4a5d, 0x00837d31, 0x01e8883d, 0x000153aa}}}, + {X: Field{[10]uint32{0x0214f422, 0x00281872, 0x00deca61, 0x03b67931, 0x00b383e4, 0x0136f1ef, 0x03e80221, 0x037cf52b, 0x02e897a9, 0x001b3b46}}, Y: Field{[10]uint32{0x004fc091, 0x00f690f6, 0x00932ae7, 0x0321e6a7, 0x008ca102, 0x02f9ae6e, 0x0095a728, 0x0239eaed, 0x02eb1b0f, 0x00096222}}}, + {X: Field{[10]uint32{0x02c32c64, 0x00d424f6, 0x00bf84cf, 0x000fb2b9, 0x020e36fe, 0x03d1dc57, 0x0304e950, 0x008ea83d, 0x000001ed, 0x002b0485}}, Y: Field{[10]uint32{0x02b1a867, 0x00ab6eb7, 0x03089881, 0x00e9694f, 0x03ed5a5d, 0x00c12668, 0x030b6957, 0x022ebc61, 0x00cbac33, 0x0033a3af}}}, + {X: Field{[10]uint32{0x0319497c, 0x00e0b7a0, 0x008c022f, 0x03e94494, 0x015d59b1, 0x0244f2ac, 0x039e56e6, 0x02161cb4, 0x03b9c9a2, 0x0005d294}}, Y: Field{[10]uint32{0x039afa73, 0x0284eb01, 0x0054383d, 0x007632e6, 0x02646b3a, 0x0311fe79, 0x034155f2, 0x0270595e, 0x0037abfc, 0x00333277}}}, + }, + { + {X: Field{[10]uint32{0x0319497c, 0x00e0b7a0, 0x008c022f, 0x03e94494, 0x015d59b1, 0x0244f2ac, 0x039e56e6, 0x02161cb4, 0x03b9c9a2, 0x0005d294}}, Y: Field{[10]uint32{0x039afa73, 0x0284eb01, 0x0054383d, 0x007632e6, 0x02646b3a, 0x0311fe79, 0x034155f2, 0x0270595e, 0x0037abfc, 0x00333277}}}, + {X: Field{[10]uint32{0x000dd273, 0x0368dbe1, 0x001115f5, 0x00383914, 0x03d53d28, 0x006e4ba8, 0x007071ef, 0x01aed8c3, 0x02e79694, 0x000839b8}}, Y: Field{[10]uint32{0x0346b593, 0x033f456e, 0x0293cc07, 0x01e4f6a1, 0x01811ec9, 0x01e1d195, 0x00ba1ad9, 0x01679128, 0x02fe4f15, 0x0034eb5e}}}, + {X: Field{[10]uint32{0x014b8367, 0x0201cf5d, 0x006bfe94, 0x01f59f54, 0x01b775b7, 0x0210da97, 0x00aa5d45, 0x0149b903, 0x014ae446, 0x00179682}}, Y: Field{[10]uint32{0x01ce85ca, 0x00a6a764, 0x03fa4453, 0x03bcf797, 0x02796aa9, 0x01ca92de, 0x00901f15, 0x0178170b, 0x00c9a479, 0x002ba2be}}}, + {X: Field{[10]uint32{0x02077674, 0x0153cc06, 0x00ca3e7b, 0x004db309, 0x0035ae68, 0x039c76dc, 0x00280a07, 0x01476ea0, 0x0024d7a3, 0x0023832a}}, Y: Field{[10]uint32{0x02b7ed98, 0x0132fb04, 0x010290b8, 0x00674be4, 0x03cff604, 0x0298b3d5, 0x0169d24d, 0x00b50771, 0x02075919, 0x00013b15}}}, + {X: Field{[10]uint32{0x03b10d9d, 0x0215e4e5, 0x00fcaf19, 0x0062747e, 0x01e6a52f, 0x00432e0b, 0x02ccb833, 0x00ba1677, 0x00adb970, 0x00003538}}, Y: Field{[10]uint32{0x0140dced, 0x0040121c, 0x01923e82, 0x0325e38b, 0x030b5898, 0x00c8a1fd, 0x012f8464, 0x0190251f, 0x01981837, 0x0021ee00}}}, + {X: Field{[10]uint32{0x00bcad59, 0x017a0d83, 0x02aa07b0, 0x00169382, 0x017c845a, 0x017e40bc, 0x0217c85a, 0x00d801ea, 0x001152ac, 0x000bb5db}}, Y: Field{[10]uint32{0x00ea66fe, 0x031ea271, 0x0394114a, 0x0004c29f, 0x015f72c6, 0x0205d9fb, 0x01a6eaec, 0x017c88b3, 0x014043b8, 0x0018e7d3}}}, + {X: Field{[10]uint32{0x009caee8, 0x00469827, 0x030bb208, 0x0116c689, 0x03632e20, 0x03b12999, 0x037a19ae, 0x01d303db, 0x021368ef, 0x0000d994}}, Y: Field{[10]uint32{0x0372b711, 0x03b1a8ed, 0x03a7f0a9, 0x0224ca56, 0x0101cba9, 0x02e9a511, 0x009fc681, 0x037b6665, 0x032b2a93, 0x0007c630}}}, + {X: Field{[10]uint32{0x00192441, 0x02bf17aa, 0x034afe96, 0x00868c86, 0x01afdb58, 0x038f59b0, 0x03a63553, 0x020b4717, 0x00da51c9, 0x003deed4}}, Y: Field{[10]uint32{0x005165ae, 0x0103a875, 0x0074bbc6, 0x007eef13, 0x01b1cfdc, 0x03799217, 0x01bc63bd, 0x029498c4, 0x03e30334, 0x0024f30e}}}, + {X: Field{[10]uint32{0x0046c85c, 0x03e5d465, 0x0006353f, 0x00239807, 0x02de37de, 0x00fdb1ba, 0x00676c45, 0x023c7ea8, 0x01056fdb, 0x00039624}}, Y: Field{[10]uint32{0x0148972e, 0x031df9c8, 0x01add5f6, 0x013a0337, 0x00f49023, 0x03d20626, 0x007418ba, 0x01ef683b, 0x005f11fa, 0x0038e692}}}, + {X: Field{[10]uint32{0x015ae087, 0x01240401, 0x00a57e03, 0x01be8d25, 0x00c671b9, 0x010e8544, 0x03945fb7, 0x029660b4, 0x03155b6e, 0x0028d199}}, Y: Field{[10]uint32{0x02887627, 0x03cd98c8, 0x030bccb3, 0x01bc8e53, 0x01c53eab, 0x028a8c14, 0x02fe9a1a, 0x0316f637, 0x03a5e56b, 0x00087297}}}, + {X: Field{[10]uint32{0x022e1259, 0x022b7cf0, 0x0362aff1, 0x02901a04, 0x01931739, 0x0001dddc, 0x02cf5faa, 0x0118fcad, 0x026d26f1, 0x0029d004}}, Y: Field{[10]uint32{0x034a5f43, 0x01c5c90c, 0x02dad5f7, 0x01d4ec75, 0x0117865e, 0x019f1fb9, 0x005f174a, 0x03c7fc6c, 0x03baf194, 0x00016a7f}}}, + {X: Field{[10]uint32{0x00b84b48, 0x03d15c79, 0x017ea830, 0x031e67a0, 0x0091adf4, 0x03505fdc, 0x0110f577, 0x0293d506, 0x030e7d45, 0x0017ec77}}, Y: Field{[10]uint32{0x03be8eb8, 0x037a9a8d, 0x021ad77e, 0x02421cfc, 0x020629c3, 0x039b4960, 0x00f4646f, 0x013527ef, 0x03bcbc3c, 0x000854be}}}, + {X: Field{[10]uint32{0x0308f1fe, 0x0285e8f2, 0x007bfd88, 0x039c2e82, 0x03d7ce7e, 0x0360b45d, 0x01405765, 0x01d39299, 0x00216d94, 0x0021f92e}}, Y: Field{[10]uint32{0x02d5e2ec, 0x01d2b26b, 0x02d9d75f, 0x036f59e1, 0x006e2f23, 0x00be30b3, 0x03d7f8ea, 0x01233b35, 0x02c07663, 0x003dd38e}}}, + {X: Field{[10]uint32{0x01b8f255, 0x01b661fe, 0x00d21114, 0x039d24a8, 0x01e77d43, 0x02aa0bfa, 0x022e4608, 0x02e29058, 0x017478e1, 0x00256ef6}}, Y: Field{[10]uint32{0x00361439, 0x038ffa0a, 0x03fc1010, 0x02bbf1dd, 0x00f2ba72, 0x003cb436, 0x032c208f, 0x031dff7b, 0x02d129e3, 0x002fb50e}}}, + {X: Field{[10]uint32{0x01c4d15c, 0x01c039a8, 0x0274b9a8, 0x02fc1f03, 0x00105ea7, 0x00495291, 0x02c22c0c, 0x01e696a4, 0x03463fea, 0x000d7a86}}, Y: Field{[10]uint32{0x033fe1ea, 0x00e6ebdf, 0x0095edc9, 0x0280c194, 0x005d633a, 0x01d34ec6, 0x008fa5fd, 0x034b35e2, 0x01651b9e, 0x002b4864}}}, + {X: Field{[10]uint32{0x0075b7ba, 0x03f7fc25, 0x00b3d884, 0x00c39246, 0x03e039e7, 0x01406336, 0x03e57edf, 0x01e170f4, 0x02981943, 0x002564e5}}, Y: Field{[10]uint32{0x0124f2fd, 0x022afe1d, 0x01385e9b, 0x019321c2, 0x009c653f, 0x02e735a1, 0x020386a4, 0x00c7762e, 0x012888c3, 0x000b9f95}}}, + }, + { + {X: Field{[10]uint32{0x0075b7ba, 0x03f7fc25, 0x00b3d884, 0x00c39246, 0x03e039e7, 0x01406336, 0x03e57edf, 0x01e170f4, 0x02981943, 0x002564e5}}, Y: Field{[10]uint32{0x0124f2fd, 0x022afe1d, 0x01385e9b, 0x019321c2, 0x009c653f, 0x02e735a1, 0x020386a4, 0x00c7762e, 0x012888c3, 0x000b9f95}}}, + {X: Field{[10]uint32{0x03c8f53b, 0x01d6a502, 0x007c7072, 0x01ace45d, 0x02d70222, 0x035cf657, 0x0232ca7d, 0x029f7abf, 0x0005ff0d, 0x0032fb85}}, Y: Field{[10]uint32{0x00c87f45, 0x00b9ac9e, 0x03728292, 0x03da049b, 0x030d9ff4, 0x02e0a533, 0x01f3e689, 0x03e40ad4, 0x034f4e75, 0x003d8847}}}, + {X: Field{[10]uint32{0x03d69985, 0x03177643, 0x032aea09, 0x032db77d, 0x009f309c, 0x02f333c5, 0x00f690df, 0x00bdf9e2, 0x0275ceb7, 0x0002ba5d}}, Y: Field{[10]uint32{0x0009a003, 0x023ad045, 0x01aff89c, 0x0105ebb8, 0x01d0b99d, 0x01469531, 0x038dfee0, 0x023453a6, 0x0173f6e4, 0x00244866}}}, + {X: Field{[10]uint32{0x00b311dd, 0x01f222c5, 0x01b9cf37, 0x02bbef5c, 0x003de3be, 0x02e894b8, 0x0180bfa0, 0x03d6b375, 0x02d28faa, 0x002b756e}}, Y: Field{[10]uint32{0x01d6c38d, 0x0260bcd2, 0x01b8902f, 0x039d9a6e, 0x0352d4e1, 0x00d66053, 0x00e434f8, 0x030e965d, 0x00f4da3d, 0x003a710f}}}, + {X: Field{[10]uint32{0x01262b90, 0x0064f7f6, 0x0029a9dc, 0x0307f8f3, 0x03b723c4, 0x02009747, 0x0365f177, 0x0184bb26, 0x022a5ac1, 0x000ac561}}, Y: Field{[10]uint32{0x003d7557, 0x0265b992, 0x009a4991, 0x01c3e652, 0x026f5349, 0x02a1d241, 0x0230d52d, 0x00cfea9e, 0x013daa0a, 0x000bac01}}}, + {X: Field{[10]uint32{0x0078afb0, 0x016b9e58, 0x021974e7, 0x031b1049, 0x0314ff12, 0x019b45c1, 0x00d4468c, 0x018ed492, 0x03cd7661, 0x0008275a}}, Y: Field{[10]uint32{0x0340b310, 0x006ddd69, 0x023e385d, 0x024ce7d3, 0x0301edb7, 0x02626296, 0x0165baba, 0x00ca0282, 0x03429e7b, 0x00068bc4}}}, + {X: Field{[10]uint32{0x00e7be40, 0x025c532a, 0x00ee593f, 0x02524410, 0x02f2d2c8, 0x01b91da6, 0x0295c161, 0x03b99dfb, 0x02ed1a96, 0x001abe7a}}, Y: Field{[10]uint32{0x02387e1c, 0x005b809b, 0x01569fa4, 0x019a83d6, 0x0145e3f6, 0x00d1f720, 0x009ea428, 0x0199259c, 0x02116900, 0x002ce04a}}}, + {X: Field{[10]uint32{0x017c0979, 0x01900283, 0x00c96f5f, 0x0052f16a, 0x024a29b3, 0x03d073b4, 0x029df3df, 0x005c50fe, 0x032ba817, 0x0014fc90}}, Y: Field{[10]uint32{0x037b36a2, 0x01fa4314, 0x03845f9f, 0x03d727a2, 0x024bd5a4, 0x0046c1f7, 0x014e3e09, 0x01e6df33, 0x03fbc1f0, 0x002f54bb}}}, + {X: Field{[10]uint32{0x0082801e, 0x02dbe83d, 0x00155d26, 0x022f16f5, 0x0140794f, 0x032e35be, 0x03aab424, 0x00513bac, 0x00ee0444, 0x0016599a}}, Y: Field{[10]uint32{0x00870c37, 0x01c523c1, 0x0135ad47, 0x032d8f4d, 0x028db6c1, 0x01dc4c13, 0x008f9608, 0x03bd7c7b, 0x00a85bba, 0x002526a8}}}, + {X: Field{[10]uint32{0x00977063, 0x00102962, 0x00c4fef4, 0x022fec4c, 0x0365bf6f, 0x019f83f6, 0x0150f838, 0x0269bd87, 0x029e047f, 0x0029d8b9}}, Y: Field{[10]uint32{0x014f6ef1, 0x00da7e0a, 0x00e62a06, 0x028e5b7f, 0x01958b48, 0x00cdcaa2, 0x021732d9, 0x00455e06, 0x0157cbed, 0x001ae637}}}, + {X: Field{[10]uint32{0x032c19fd, 0x026cb9f0, 0x028c3e4c, 0x03a41600, 0x034acab8, 0x02d5c2d6, 0x01f4d17a, 0x0141d8bf, 0x01881b50, 0x002fa134}}, Y: Field{[10]uint32{0x02f1281f, 0x025294dc, 0x01c37676, 0x03d57943, 0x007955a7, 0x00c20e65, 0x01e65f48, 0x01425134, 0x00cb32dc, 0x003bfe58}}}, + {X: Field{[10]uint32{0x0355a9bf, 0x02c0a637, 0x01bf8ebc, 0x03bca7a9, 0x00f6b015, 0x0075f15e, 0x00307f60, 0x00c60604, 0x00eb9c6e, 0x001c98a6}}, Y: Field{[10]uint32{0x003accae, 0x01be2c2f, 0x033b4e11, 0x032f0019, 0x00be797b, 0x00f42678, 0x0035a2ef, 0x026ff6a6, 0x0001a9de, 0x000e3522}}}, + {X: Field{[10]uint32{0x02c69482, 0x02dd7f55, 0x02167bd1, 0x01004cbe, 0x00cbeab5, 0x02bcaf22, 0x0357274c, 0x01fb9507, 0x00314c0d, 0x002619e8}}, Y: Field{[10]uint32{0x03792cd7, 0x0018451b, 0x028a916f, 0x033d4558, 0x039e6245, 0x006ea658, 0x0392d55b, 0x020d3e71, 0x015a3b10, 0x00340b98}}}, + {X: Field{[10]uint32{0x01a7e7d2, 0x01fcb610, 0x03d85995, 0x0230fbea, 0x03a4c90e, 0x0251b791, 0x03af7555, 0x039229a4, 0x030f1339, 0x002e4d04}}, Y: Field{[10]uint32{0x00653d39, 0x02646a26, 0x00c41a4a, 0x036f9c37, 0x03ffd381, 0x02fde347, 0x00929a5f, 0x0015daa8, 0x036b9b2d, 0x002548cf}}}, + {X: Field{[10]uint32{0x01557aa1, 0x008e7647, 0x03c2978a, 0x03fb3407, 0x03df1d92, 0x002675aa, 0x027f2ea0, 0x02056964, 0x024540d8, 0x002a19bc}}, Y: Field{[10]uint32{0x01430634, 0x006eed30, 0x01a4b798, 0x0319f184, 0x0161eb69, 0x036c384e, 0x013d8fa5, 0x00ad135e, 0x01f6a802, 0x002d61ce}}}, + {X: Field{[10]uint32{0x0182b151, 0x004d0327, 0x03a2dbb5, 0x00f5587e, 0x03cca0a4, 0x02c426a3, 0x005a1153, 0x00795b59, 0x0250ae40, 0x0034a98e}}, Y: Field{[10]uint32{0x00f89405, 0x01085d37, 0x00a52d41, 0x002bd213, 0x00a70f75, 0x00a52088, 0x01aee58b, 0x03f2dd59, 0x02fb6443, 0x003a0b61}}}, + }, + { + {X: Field{[10]uint32{0x0182b151, 0x004d0327, 0x03a2dbb5, 0x00f5587e, 0x03cca0a4, 0x02c426a3, 0x005a1153, 0x00795b59, 0x0250ae40, 0x0034a98e}}, Y: Field{[10]uint32{0x00f89405, 0x01085d37, 0x00a52d41, 0x002bd213, 0x00a70f75, 0x00a52088, 0x01aee58b, 0x03f2dd59, 0x02fb6443, 0x003a0b61}}}, + {X: Field{[10]uint32{0x0272da5f, 0x0312eb32, 0x013497c6, 0x01acdb10, 0x0122b9cd, 0x00cdc97e, 0x03c72020, 0x0149788e, 0x03a76100, 0x002ebc60}}, Y: Field{[10]uint32{0x00f2a0cf, 0x03398a2a, 0x01361377, 0x031729ce, 0x018e2336, 0x035a6c74, 0x008bd58d, 0x0134cd5a, 0x03be9ccb, 0x0037ab27}}}, + {X: Field{[10]uint32{0x024b3ba0, 0x027d8d7b, 0x031f1785, 0x03d7c62f, 0x035c2abe, 0x006fc917, 0x03e170f3, 0x03edcefb, 0x0105221f, 0x00104204}}, Y: Field{[10]uint32{0x03525595, 0x02587705, 0x02455486, 0x02159681, 0x00133649, 0x035ae126, 0x00a65ae1, 0x0159a3cb, 0x036976ff, 0x00370dfc}}}, + {X: Field{[10]uint32{0x016c3943, 0x02b29631, 0x02a5ffa5, 0x00b55add, 0x015adbd0, 0x03923dbf, 0x01332906, 0x01008e3e, 0x00a7e384, 0x003debbe}}, Y: Field{[10]uint32{0x00f442f1, 0x03d89feb, 0x01003431, 0x0212a373, 0x03eec301, 0x00eacff3, 0x0042bbdc, 0x0369e5f1, 0x0344d5ff, 0x00138ec2}}}, + {X: Field{[10]uint32{0x03d98ded, 0x02726e24, 0x00218462, 0x020cee28, 0x02dbdf22, 0x014c7597, 0x00f22990, 0x03032323, 0x0210a16c, 0x0018e8a8}}, Y: Field{[10]uint32{0x00d1cfc2, 0x0065f538, 0x0073a519, 0x0280271e, 0x021fabf6, 0x013b6511, 0x02503325, 0x031dbf41, 0x02e2e7fe, 0x00220ad0}}}, + {X: Field{[10]uint32{0x000e5485, 0x02799a80, 0x01df0208, 0x022fd769, 0x02451306, 0x01cc83c4, 0x02c70862, 0x02f7fe38, 0x02d793a2, 0x0007349d}}, Y: Field{[10]uint32{0x005fbd7f, 0x033c1462, 0x024ecca5, 0x01c2c826, 0x0399d0e2, 0x014ba5df, 0x00b34d45, 0x02bdce35, 0x01d18b2e, 0x0019856f}}}, + {X: Field{[10]uint32{0x00045445, 0x0186942e, 0x00d7eea8, 0x01c6407a, 0x0080ff73, 0x0355efbc, 0x0312e2e5, 0x019f28f7, 0x015d449d, 0x00030560}}, Y: Field{[10]uint32{0x0054a206, 0x03e1f550, 0x00ea3214, 0x0390d963, 0x00ba3054, 0x0198f34a, 0x0293c3b6, 0x01045742, 0x020a3ae9, 0x000bcc35}}}, + {X: Field{[10]uint32{0x01924459, 0x032515c4, 0x0278c1fa, 0x00968f1e, 0x037af2fa, 0x03776ec7, 0x022e29f0, 0x0240db16, 0x03cb1001, 0x0037ed51}}, Y: Field{[10]uint32{0x0065fd9e, 0x00178373, 0x031dcfa2, 0x00c39700, 0x0022af09, 0x03721933, 0x00389ce9, 0x011c222e, 0x02a9ba0f, 0x0026b334}}}, + {X: Field{[10]uint32{0x03857faf, 0x0048e730, 0x019701e9, 0x03787a58, 0x03882fca, 0x020a3bdf, 0x017ba8f4, 0x022a7035, 0x036b89ae, 0x0031d5fa}}, Y: Field{[10]uint32{0x00584ca4, 0x0276c328, 0x014c101d, 0x00344062, 0x03627d31, 0x022fb186, 0x03369f20, 0x03fcd895, 0x01cfcd23, 0x003c0e96}}}, + {X: Field{[10]uint32{0x02f8b517, 0x02ecd463, 0x01bac9a8, 0x00691c5c, 0x0177c277, 0x02845789, 0x01bc8064, 0x036c9257, 0x02f7ccc4, 0x001c4808}}, Y: Field{[10]uint32{0x009da1ac, 0x01f7ca09, 0x01d7748b, 0x037cef5e, 0x01a3603e, 0x00251d50, 0x03101f9b, 0x03a4a2b9, 0x0338de4d, 0x002f55e0}}}, + {X: Field{[10]uint32{0x0059225d, 0x034613d5, 0x018d10e4, 0x01f8b621, 0x0244faf7, 0x006700a8, 0x015d4099, 0x028343e0, 0x03aeadaf, 0x003ea018}}, Y: Field{[10]uint32{0x02ce1507, 0x02df8edf, 0x0059c3a2, 0x00db401f, 0x000a2b6c, 0x00931097, 0x00de2208, 0x0301a458, 0x039057c0, 0x0002e9c7}}}, + {X: Field{[10]uint32{0x010bc03e, 0x014f566a, 0x015e33c7, 0x024d4780, 0x0084b0f3, 0x011143e0, 0x01a925f7, 0x001cba79, 0x00ed2c82, 0x000b3bb6}}, Y: Field{[10]uint32{0x02b82adc, 0x01cae2de, 0x03cd01cb, 0x033c8354, 0x034a1df9, 0x03f1f6ba, 0x0050eb7a, 0x0378fb36, 0x0380e9b9, 0x002909da}}}, + {X: Field{[10]uint32{0x02f0d044, 0x027fa505, 0x021a7967, 0x03524279, 0x01aaba9f, 0x018bb829, 0x02f69cf8, 0x015ea278, 0x03c59d02, 0x00196328}}, Y: Field{[10]uint32{0x03cb872d, 0x007ccbbd, 0x00e89add, 0x018f1063, 0x0255a167, 0x004ef4dd, 0x0165d627, 0x0095183c, 0x01377aea, 0x002b9730}}}, + {X: Field{[10]uint32{0x02aa2494, 0x03538c50, 0x00c9a50c, 0x03f9f744, 0x027bdcdd, 0x013aef20, 0x01136e7c, 0x03a3b374, 0x009a4539, 0x000de71d}}, Y: Field{[10]uint32{0x02c86c63, 0x03ea7a33, 0x016435be, 0x029edfa1, 0x011364f6, 0x019e0fc4, 0x01c0ef1d, 0x0300c4f2, 0x03848bf9, 0x00289518}}}, + {X: Field{[10]uint32{0x0296756d, 0x02b255cd, 0x01417ab5, 0x01815958, 0x00676af1, 0x034fcc17, 0x00c19835, 0x03caeb39, 0x034aaf91, 0x000c7252}}, Y: Field{[10]uint32{0x0208ae78, 0x0117a377, 0x01070abc, 0x032b9ab4, 0x0283aedf, 0x02bd0581, 0x00b8b59a, 0x020ea6fd, 0x004b556e, 0x003e03e2}}}, + {X: Field{[10]uint32{0x0217e073, 0x01be6d15, 0x0317b343, 0x02f4e0e4, 0x026bacbd, 0x01f3f721, 0x02e7896d, 0x007ae243, 0x02233547, 0x0019161f}}, Y: Field{[10]uint32{0x03af6589, 0x026797a7, 0x02ab3582, 0x00e44ceb, 0x0185b90a, 0x01f0a668, 0x016dd644, 0x000b8aba, 0x01d5bf69, 0x003667f3}}}, + }, + { + {X: Field{[10]uint32{0x0217e073, 0x01be6d15, 0x0317b343, 0x02f4e0e4, 0x026bacbd, 0x01f3f721, 0x02e7896d, 0x007ae243, 0x02233547, 0x0019161f}}, Y: Field{[10]uint32{0x03af6589, 0x026797a7, 0x02ab3582, 0x00e44ceb, 0x0185b90a, 0x01f0a668, 0x016dd644, 0x000b8aba, 0x01d5bf69, 0x003667f3}}}, + {X: Field{[10]uint32{0x0384480d, 0x03362310, 0x032ef44b, 0x0288aa47, 0x0294e0b6, 0x024bc304, 0x0328b54c, 0x02503cb3, 0x02b142df, 0x002e19b5}}, Y: Field{[10]uint32{0x004cafa8, 0x0166d1c3, 0x006d60e6, 0x02012c76, 0x0024e522, 0x02a6b5eb, 0x02278d7e, 0x03adc226, 0x00b3426a, 0x0006452c}}}, + {X: Field{[10]uint32{0x02103dd6, 0x01c51c83, 0x00859adf, 0x0301f001, 0x02c34604, 0x0164a85e, 0x02213cfc, 0x000fe0da, 0x03d55a42, 0x002f11de}}, Y: Field{[10]uint32{0x02f7c343, 0x0020b635, 0x004ac639, 0x01cb18ed, 0x015d2935, 0x01b7a98e, 0x03ac552c, 0x037549b2, 0x022429a8, 0x0038c787}}}, + {X: Field{[10]uint32{0x01b20d6c, 0x02736a07, 0x02455d22, 0x0393b53f, 0x03e2d52a, 0x0040aea1, 0x019d1646, 0x02067b13, 0x009085de, 0x003b0aee}}, Y: Field{[10]uint32{0x029cf4a0, 0x02671358, 0x03a98a0e, 0x012fa1fb, 0x0233a236, 0x01425031, 0x02f66f06, 0x004e84cc, 0x017661e0, 0x00333b30}}}, + {X: Field{[10]uint32{0x004eab31, 0x0370ec35, 0x034907d0, 0x00501398, 0x000ac5af, 0x019efe3a, 0x003b4232, 0x02e0e00c, 0x00fe5a6b, 0x0016276d}}, Y: Field{[10]uint32{0x01361f6a, 0x02baf9d4, 0x038db941, 0x01548523, 0x031f610e, 0x012f643c, 0x00706202, 0x028a93d8, 0x005c108a, 0x00189551}}}, + {X: Field{[10]uint32{0x02695f94, 0x0202c60d, 0x03fa592d, 0x031a4589, 0x0362a169, 0x02be6a73, 0x00cb8683, 0x023d7f43, 0x0151b455, 0x002c7497}}, Y: Field{[10]uint32{0x02e32736, 0x01fae697, 0x03edca5b, 0x0236ae18, 0x0360f6f1, 0x026aea05, 0x03ea0ac1, 0x0242c7de, 0x0272030e, 0x001c1b76}}}, + {X: Field{[10]uint32{0x020c2c41, 0x02585ca6, 0x036c67bf, 0x0071580c, 0x0042831c, 0x035bb6df, 0x00a1860a, 0x00be8baa, 0x0337d16e, 0x0004ce6c}}, Y: Field{[10]uint32{0x01f1bc2b, 0x03c152ea, 0x023a4185, 0x03e1f7a4, 0x006b1227, 0x0044e8d0, 0x023240fd, 0x02b96e9e, 0x016362c7, 0x0027e6ca}}}, + {X: Field{[10]uint32{0x03b09d0f, 0x0183b2c8, 0x03ecf38a, 0x01903d42, 0x01e50050, 0x03951641, 0x01d75ef5, 0x025b3b4e, 0x03e389e2, 0x001c7129}}, Y: Field{[10]uint32{0x020ddb62, 0x02c7c05c, 0x03fc7637, 0x0021298b, 0x02786f2b, 0x00be042a, 0x033e0a29, 0x03cee82b, 0x02db737a, 0x0004c4fe}}}, + {X: Field{[10]uint32{0x00fc47af, 0x012c7e16, 0x00dec370, 0x0320cb03, 0x00a8ddfe, 0x00006d5a, 0x010329b5, 0x033c5f31, 0x03a11363, 0x001ffcee}}, Y: Field{[10]uint32{0x01ba43a7, 0x0185933e, 0x02c297f8, 0x006b462e, 0x0317a53b, 0x011cd11a, 0x03c891b7, 0x0298a682, 0x03ae8018, 0x0007dae9}}}, + {X: Field{[10]uint32{0x0241e20e, 0x03132ea7, 0x03864d1d, 0x00f5e34c, 0x0138a87a, 0x00e934fa, 0x030f7f00, 0x013722f2, 0x01c4a511, 0x003f0e57}}, Y: Field{[10]uint32{0x03cf42ee, 0x036330b9, 0x00e2b77a, 0x0169a179, 0x02022147, 0x02f76db5, 0x02b81a98, 0x01f42533, 0x009108d0, 0x000e19b8}}}, + {X: Field{[10]uint32{0x01213775, 0x01358025, 0x02a99018, 0x00ec8f50, 0x0100b429, 0x03fb1fd8, 0x001e9395, 0x0182ed85, 0x00463ceb, 0x0023b19c}}, Y: Field{[10]uint32{0x0041ffff, 0x0043cf9e, 0x011e90e0, 0x0282f33d, 0x0271da98, 0x033b7b83, 0x02643415, 0x016f8c1b, 0x026fa0da, 0x0023d629}}}, + {X: Field{[10]uint32{0x02f83231, 0x01c4062d, 0x025e3499, 0x0239d810, 0x00b7c30d, 0x016cff74, 0x01158276, 0x02e89aa3, 0x00c53502, 0x002143e3}}, Y: Field{[10]uint32{0x032e8373, 0x00c6a757, 0x0177f4a0, 0x0285dc8b, 0x010a85bf, 0x020b31e2, 0x03f7086b, 0x02414f42, 0x01be02a7, 0x002f12a7}}}, + {X: Field{[10]uint32{0x0052abbb, 0x00ffe34d, 0x01c2e3cb, 0x00bf8ae5, 0x01ae6aa7, 0x03657525, 0x01bac3fe, 0x0006ee27, 0x01b441e7, 0x0020f798}}, Y: Field{[10]uint32{0x014eb66e, 0x0145dac1, 0x002918a0, 0x00daef39, 0x03d79c5f, 0x03138558, 0x03fb6af8, 0x01827e9a, 0x0334a34c, 0x000cbc38}}}, + {X: Field{[10]uint32{0x032e6ffa, 0x00441937, 0x0176388b, 0x00dedc55, 0x0246be9f, 0x011d4351, 0x005bb6a9, 0x0067ec51, 0x02f98f94, 0x0014ffa2}}, Y: Field{[10]uint32{0x00e92eb5, 0x03acdc99, 0x030c22a1, 0x03980ef5, 0x005fb5f8, 0x01193797, 0x000cf6c4, 0x01518859, 0x017e7b51, 0x0024ca20}}}, + {X: Field{[10]uint32{0x019276f1, 0x022309bd, 0x03b15e96, 0x02ca4a85, 0x0033ae25, 0x03df361a, 0x00bb5c00, 0x03076c6a, 0x03898f50, 0x000f5d98}}, Y: Field{[10]uint32{0x019cbcb3, 0x012996e1, 0x0178601e, 0x008066c6, 0x02f32198, 0x02b60ccf, 0x0176e34d, 0x01f76d82, 0x01737a18, 0x0034dd9a}}}, + {X: Field{[10]uint32{0x0145e458, 0x035b21b7, 0x027fd358, 0x033a8943, 0x002f0aa6, 0x01527781, 0x02546d3e, 0x036216ce, 0x01e0e4e4, 0x0021206f}}, Y: Field{[10]uint32{0x0379057e, 0x012c6d65, 0x02e556d6, 0x0310ac98, 0x02900a79, 0x033b2cb2, 0x0225bf39, 0x00137612, 0x038cba54, 0x000e3b9e}}}, + }, + { + {X: Field{[10]uint32{0x0145e458, 0x035b21b7, 0x027fd358, 0x033a8943, 0x002f0aa6, 0x01527781, 0x02546d3e, 0x036216ce, 0x01e0e4e4, 0x0021206f}}, Y: Field{[10]uint32{0x0379057e, 0x012c6d65, 0x02e556d6, 0x0310ac98, 0x02900a79, 0x033b2cb2, 0x0225bf39, 0x00137612, 0x038cba54, 0x000e3b9e}}}, + {X: Field{[10]uint32{0x00e9f114, 0x010cd49b, 0x021dde54, 0x0014a655, 0x03392ed6, 0x007524af, 0x0143c6cd, 0x00ea2e7f, 0x0050bd38, 0x00258a69}}, Y: Field{[10]uint32{0x024aa391, 0x025cb128, 0x02f8dca3, 0x00f9715a, 0x01b92559, 0x0033bd93, 0x02befd22, 0x02db5d5d, 0x03280c5f, 0x002fd0e6}}}, + {X: Field{[10]uint32{0x012da17d, 0x0283e905, 0x0246b160, 0x036c2341, 0x0011dc13, 0x03f802f2, 0x014e6b05, 0x02317c22, 0x011e0f51, 0x000efabb}}, Y: Field{[10]uint32{0x00c768d2, 0x0012617b, 0x00416ce7, 0x01ee37fb, 0x0154cde7, 0x03a0386d, 0x034a8beb, 0x01eb37fb, 0x03f55aff, 0x0030ec35}}}, + {X: Field{[10]uint32{0x02ca6cc3, 0x00e36589, 0x0218383d, 0x011f861f, 0x031477d7, 0x033224f7, 0x01730da7, 0x011a23ac, 0x0047ef1e, 0x002dcec7}}, Y: Field{[10]uint32{0x014fdba3, 0x00d75da9, 0x03f5afac, 0x014825d5, 0x017322a2, 0x03320142, 0x017d64bb, 0x008aa429, 0x01cb2949, 0x001610c5}}}, + {X: Field{[10]uint32{0x024edcc5, 0x03e85f6e, 0x011b7234, 0x0085080c, 0x03e74e32, 0x0249d665, 0x012dfc03, 0x0275861d, 0x03a0cbdc, 0x001b9cf6}}, Y: Field{[10]uint32{0x019da0e4, 0x007df375, 0x039037b3, 0x0369c019, 0x03278a77, 0x0220a1a4, 0x02455088, 0x033122fa, 0x01fc49ee, 0x003b82b0}}}, + {X: Field{[10]uint32{0x0063e1be, 0x026b4134, 0x01a75c1b, 0x028bdf8e, 0x03a92429, 0x036f3c09, 0x02615253, 0x00ac51c8, 0x01d11d60, 0x0004c590}}, Y: Field{[10]uint32{0x01fec890, 0x007fcf88, 0x01b77fdd, 0x0303e5d1, 0x03bd0fae, 0x036f4afa, 0x002e30fc, 0x00e7c1a9, 0x02617960, 0x00130ef6}}}, + {X: Field{[10]uint32{0x0280b979, 0x03131092, 0x03b31409, 0x03e8ca6a, 0x000490f5, 0x0291f0c4, 0x027d97ea, 0x02d649d8, 0x018937e5, 0x001dc1b7}}, Y: Field{[10]uint32{0x0126cfde, 0x03d20410, 0x03e3214c, 0x00d3f5fb, 0x0117fa0a, 0x007aa71c, 0x038dd799, 0x02dc51dd, 0x01827d5b, 0x002280aa}}}, + {X: Field{[10]uint32{0x038f93e0, 0x038864b4, 0x0099f9c6, 0x00eed9da, 0x03d05b2a, 0x01e8bfbd, 0x03989200, 0x00600c47, 0x02b2db40, 0x003b7f85}}, Y: Field{[10]uint32{0x029405ad, 0x005e4f78, 0x0227e3d0, 0x000311b8, 0x025b3d51, 0x02c17434, 0x0174faa4, 0x036cda53, 0x02f1fca5, 0x003b9a40}}}, + {X: Field{[10]uint32{0x026fe285, 0x02e712dc, 0x03127dcd, 0x00a504fb, 0x02a45bac, 0x007e781a, 0x02f3c7a4, 0x0303e034, 0x02c5929b, 0x0005b508}}, Y: Field{[10]uint32{0x0155b441, 0x003ff9b0, 0x00d4233e, 0x0044dcd9, 0x01e93f0c, 0x018d4c6c, 0x02b7e69a, 0x009906a2, 0x00fa51e2, 0x00037e22}}}, + {X: Field{[10]uint32{0x01e306a5, 0x004cae1a, 0x007f15d3, 0x00931309, 0x02b8b5f6, 0x017cb971, 0x027129b3, 0x0030cd24, 0x0363f9f3, 0x0025cb2c}}, Y: Field{[10]uint32{0x02e86295, 0x007f502d, 0x00f35d06, 0x03b732b5, 0x01b85702, 0x02f1941e, 0x01e77fe5, 0x024aa97e, 0x0304e2df, 0x002b98d1}}}, + {X: Field{[10]uint32{0x02cfa513, 0x0042f2ae, 0x023aeae3, 0x027e6983, 0x004e2407, 0x003d5aa7, 0x01a34475, 0x01b58ea9, 0x0247eec7, 0x0007f303}}, Y: Field{[10]uint32{0x007afc9c, 0x01d6e904, 0x03918750, 0x03459260, 0x004beded, 0x00ce7e6d, 0x00e38754, 0x0151e2d2, 0x01a041e3, 0x00059770}}}, + {X: Field{[10]uint32{0x0046e079, 0x0280d49f, 0x0078dd12, 0x002e17a7, 0x00ab6693, 0x000ae8dd, 0x02f75adb, 0x02b14c3f, 0x02ad2acf, 0x002ae1b0}}, Y: Field{[10]uint32{0x0236ffe1, 0x00a2f05d, 0x017c0ec4, 0x03a12143, 0x01ce7728, 0x01cc8032, 0x01c46d4d, 0x00a6af3d, 0x0286019f, 0x00048270}}}, + {X: Field{[10]uint32{0x02dc69b2, 0x009c1f3f, 0x0371721a, 0x0226c9ad, 0x02a50a60, 0x0172a8e1, 0x00643043, 0x02e285cc, 0x0073ad6c, 0x00304ae4}}, Y: Field{[10]uint32{0x00dd41dd, 0x02ba6c08, 0x032a0032, 0x02f8f49e, 0x02b8ee1d, 0x03e2525d, 0x0372dc89, 0x0337c765, 0x003fe534, 0x000c5cf1}}}, + {X: Field{[10]uint32{0x02341142, 0x031ef3a7, 0x02760d3e, 0x03add91c, 0x007ae684, 0x0268459a, 0x021bd217, 0x028ec06e, 0x00110c2d, 0x00319c07}}, Y: Field{[10]uint32{0x020f4dad, 0x01318567, 0x03e57892, 0x02e96f26, 0x015d07fc, 0x03867d68, 0x03869bbd, 0x0376654b, 0x02b38d6c, 0x000a8083}}}, + {X: Field{[10]uint32{0x0161fe4d, 0x03d6177e, 0x03197ab6, 0x01be2c41, 0x028a1488, 0x004b29cf, 0x033e9313, 0x01ea3e8f, 0x0385dc32, 0x0034166f}}, Y: Field{[10]uint32{0x02e823c2, 0x00d6c19a, 0x0364cb99, 0x0287d36a, 0x00fd388b, 0x0212556d, 0x020765dc, 0x014978ff, 0x0260c08b, 0x0011441e}}}, + {X: Field{[10]uint32{0x00af666b, 0x018c0fdb, 0x00e30bcd, 0x034f12c7, 0x037ffcfe, 0x0205fd18, 0x036979ae, 0x000aa98a, 0x0257a781, 0x0004d192}}, Y: Field{[10]uint32{0x036ecc27, 0x0256a41f, 0x002e13f4, 0x02a07425, 0x0248f300, 0x00f32c32, 0x03e43345, 0x011603bd, 0x01900461, 0x001a6f85}}}, + }, + { + {X: Field{[10]uint32{0x00af666b, 0x018c0fdb, 0x00e30bcd, 0x034f12c7, 0x037ffcfe, 0x0205fd18, 0x036979ae, 0x000aa98a, 0x0257a781, 0x0004d192}}, Y: Field{[10]uint32{0x036ecc27, 0x0256a41f, 0x002e13f4, 0x02a07425, 0x0248f300, 0x00f32c32, 0x03e43345, 0x011603bd, 0x01900461, 0x001a6f85}}}, + {X: Field{[10]uint32{0x025084ae, 0x02127181, 0x02577c75, 0x01f73aaf, 0x019182be, 0x017f84b4, 0x005c88c8, 0x014d8bb0, 0x00f53224, 0x003acf3e}}, Y: Field{[10]uint32{0x016b9480, 0x01f07ffe, 0x012a66f6, 0x03179f6f, 0x01f52b45, 0x03f72928, 0x03e63dce, 0x035c010f, 0x038222d9, 0x00320cf1}}}, + {X: Field{[10]uint32{0x02ca5f51, 0x01ac8263, 0x01aebf21, 0x006e53f2, 0x03ddea17, 0x03c16d73, 0x02ed6b2b, 0x039a58b1, 0x0114dd9e, 0x00377a75}}, Y: Field{[10]uint32{0x00c638f7, 0x01a69cf4, 0x0171f9ad, 0x03a37a25, 0x0150feeb, 0x029fe3c2, 0x011f34b0, 0x02044762, 0x01133ce2, 0x002e139a}}}, + {X: Field{[10]uint32{0x02e9a5d0, 0x016f2f30, 0x001d9f8e, 0x03e61288, 0x02a576fc, 0x0211466c, 0x03a60f21, 0x02665d3d, 0x027d092d, 0x002f7c69}}, Y: Field{[10]uint32{0x0162ff7b, 0x013dc061, 0x02461cdb, 0x01879589, 0x02a6280b, 0x01afdeea, 0x00be54a8, 0x0286aaa0, 0x002bab65, 0x00102564}}}, + {X: Field{[10]uint32{0x019c88e4, 0x001ac166, 0x006ec2f9, 0x00f882b5, 0x039aed51, 0x004812c5, 0x01f406eb, 0x024dcdba, 0x02102369, 0x003f4698}}, Y: Field{[10]uint32{0x015bc8df, 0x02324596, 0x000f299c, 0x03525730, 0x02dc6b71, 0x0125dde0, 0x013c0695, 0x03082fec, 0x0354b9c8, 0x0006b25e}}}, + {X: Field{[10]uint32{0x009b0cca, 0x031a9568, 0x016f01cc, 0x02249293, 0x01a34575, 0x028a3696, 0x00454f68, 0x03d32357, 0x00b1dbb0, 0x000354e3}}, Y: Field{[10]uint32{0x00929e05, 0x02c51f83, 0x034c9731, 0x02676244, 0x038534cd, 0x003bb5f3, 0x00a8d5c4, 0x0304432c, 0x03ac7a3e, 0x0032065a}}}, + {X: Field{[10]uint32{0x038018ce, 0x0056d6d7, 0x02d68bd5, 0x01ce3624, 0x03cf2da5, 0x00b21b71, 0x03ffce4f, 0x025ae7c4, 0x0131d8c2, 0x0013b921}}, Y: Field{[10]uint32{0x0248381f, 0x016986c7, 0x006013c3, 0x01c6d3a0, 0x02710749, 0x0031f179, 0x03b4408d, 0x03e2d7f1, 0x02d4810b, 0x002da3e7}}}, + {X: Field{[10]uint32{0x0327e771, 0x017f05ce, 0x0262abde, 0x02591df6, 0x008c3b41, 0x019120ed, 0x01be267b, 0x03b0a735, 0x026eddc4, 0x001a215a}}, Y: Field{[10]uint32{0x03bbdab6, 0x02358a81, 0x0333a611, 0x03ca4ec1, 0x02331d22, 0x0067ded2, 0x036fd49c, 0x0287ec4e, 0x01f14f79, 0x001de8cf}}}, + {X: Field{[10]uint32{0x01473678, 0x014ba47c, 0x012f7028, 0x0254250e, 0x00cba057, 0x016e301c, 0x01e314c5, 0x00036ffd, 0x009c34c4, 0x003f5db3}}, Y: Field{[10]uint32{0x01144f4f, 0x0193baa3, 0x008437e1, 0x03b85007, 0x0260628e, 0x0340cb35, 0x03ee0a73, 0x010f6b83, 0x01437871, 0x003c8119}}}, + {X: Field{[10]uint32{0x02e66b24, 0x00014cb3, 0x00366b5f, 0x003fb5ee, 0x02e8b9c6, 0x03c6b7b4, 0x0244d99b, 0x031ee203, 0x00cfb9e9, 0x00133576}}, Y: Field{[10]uint32{0x000932fd, 0x03bf6ebd, 0x03aed221, 0x01784b4b, 0x03ca61e4, 0x0335b440, 0x024e8c39, 0x012d567f, 0x0282deb9, 0x0015dbab}}}, + {X: Field{[10]uint32{0x017a2193, 0x002dc523, 0x0146edf0, 0x0113c65d, 0x012c691e, 0x012d3a88, 0x026ce827, 0x02d00867, 0x03a33123, 0x002168aa}}, Y: Field{[10]uint32{0x00cdcf3a, 0x0320f52c, 0x012427f0, 0x037e70ec, 0x03e1c6da, 0x007300a7, 0x02c6082d, 0x00145b60, 0x0057eb2b, 0x002704a6}}}, + {X: Field{[10]uint32{0x01d7e577, 0x00c0f3bb, 0x004d56ae, 0x015a14db, 0x03d3a0f2, 0x003a8841, 0x00604727, 0x03dec96b, 0x010f8828, 0x0030d4b5}}, Y: Field{[10]uint32{0x00d9b570, 0x013fe23e, 0x017063ca, 0x02cad848, 0x0300a8ab, 0x02f39e7e, 0x03d53145, 0x02e6e5aa, 0x0038ba76, 0x002f9dca}}}, + {X: Field{[10]uint32{0x037568b0, 0x000c16cd, 0x03b0535b, 0x03406780, 0x0335ae8d, 0x01e0d943, 0x00b6d6c5, 0x03f9d110, 0x03fc73cf, 0x00349776}}, Y: Field{[10]uint32{0x0339929c, 0x004e49b7, 0x03f0060a, 0x022078f0, 0x03832273, 0x0379f64a, 0x02aef74c, 0x01224e2f, 0x037593f8, 0x001e8ebf}}}, + {X: Field{[10]uint32{0x02712536, 0x0158fa07, 0x03e71a33, 0x03d5bfd7, 0x02a85051, 0x02d8d7a7, 0x006de71a, 0x00ea7f82, 0x0286b0a4, 0x0001a453}}, Y: Field{[10]uint32{0x001128f1, 0x011dc4e0, 0x029da2a2, 0x01ac2bde, 0x00896c22, 0x016b0a30, 0x018aceae, 0x02f4149f, 0x012852d9, 0x000adf9e}}}, + {X: Field{[10]uint32{0x031d7c13, 0x03944629, 0x03a3855f, 0x03dfe83f, 0x01641ab5, 0x01eab201, 0x0307e9a9, 0x0129c957, 0x013143e9, 0x0011604d}}, Y: Field{[10]uint32{0x02ff63cf, 0x022f154e, 0x016b9963, 0x01550af6, 0x01702006, 0x01f75a72, 0x03f50f17, 0x026b62d5, 0x00ec1497, 0x0027d616}}}, + {X: Field{[10]uint32{0x0183f366, 0x028e834b, 0x00588cad, 0x03b78bca, 0x020cd9cc, 0x0307725e, 0x02f430bc, 0x03f8ba6b, 0x01f5b713, 0x002f12a7}}, Y: Field{[10]uint32{0x001f33c1, 0x02359996, 0x03b16d75, 0x03efe951, 0x02a6e8a9, 0x012de632, 0x03937adf, 0x017018e0, 0x01ca6e78, 0x00034ea0}}}, + }, + { + {X: Field{[10]uint32{0x0183f366, 0x028e834b, 0x00588cad, 0x03b78bca, 0x020cd9cc, 0x0307725e, 0x02f430bc, 0x03f8ba6b, 0x01f5b713, 0x002f12a7}}, Y: Field{[10]uint32{0x001f33c1, 0x02359996, 0x03b16d75, 0x03efe951, 0x02a6e8a9, 0x012de632, 0x03937adf, 0x017018e0, 0x01ca6e78, 0x00034ea0}}}, + {X: Field{[10]uint32{0x03fceb19, 0x0379517c, 0x00409282, 0x0087de17, 0x002e89b2, 0x0339eead, 0x005c7626, 0x033302af, 0x015e11ce, 0x003690cf}}, Y: Field{[10]uint32{0x02f5cc64, 0x039c4829, 0x03277684, 0x00b6489e, 0x018e77fc, 0x03e57948, 0x02bbdc4a, 0x0040c077, 0x03d321a8, 0x00392636}}}, + {X: Field{[10]uint32{0x0312be3c, 0x028b8cbd, 0x02a66b06, 0x023b6851, 0x007295f1, 0x02c0054d, 0x00725dba, 0x02cde34f, 0x009d9331, 0x000e75cd}}, Y: Field{[10]uint32{0x006ff65c, 0x00067d07, 0x01644cc3, 0x0297b290, 0x00ef5ef7, 0x019a04ba, 0x0127554c, 0x00efdfec, 0x034f56ef, 0x0023e4a6}}}, + {X: Field{[10]uint32{0x02cf692a, 0x0389d716, 0x03e0654d, 0x0229c881, 0x01bcc483, 0x00705bbf, 0x01c11698, 0x031fb070, 0x021ee9e8, 0x0000c7a3}}, Y: Field{[10]uint32{0x016f667a, 0x00aa13ac, 0x033b09cc, 0x009f16fd, 0x03706498, 0x00359d0e, 0x01097029, 0x00d4f767, 0x035b465b, 0x002b5f9f}}}, + {X: Field{[10]uint32{0x0377f22b, 0x0393ef37, 0x02e035aa, 0x00e653e0, 0x02c69972, 0x02656bc9, 0x011cd6c2, 0x00774279, 0x0217f7dc, 0x003c32e9}}, Y: Field{[10]uint32{0x0109a03c, 0x0238b1d6, 0x015661fc, 0x01fa4282, 0x0004f18c, 0x0145b410, 0x03326c36, 0x037e627b, 0x034313f9, 0x0006896a}}}, + {X: Field{[10]uint32{0x03829372, 0x002a929d, 0x00553dec, 0x003222e9, 0x03c49b30, 0x00e15e5a, 0x03626ae5, 0x0034ecc4, 0x00c90f3e, 0x002d0c67}}, Y: Field{[10]uint32{0x02dd5427, 0x02733002, 0x011bb772, 0x005728f8, 0x02707b12, 0x03087168, 0x037afe09, 0x0140affe, 0x00499a6f, 0x0011c1f5}}}, + {X: Field{[10]uint32{0x02509c12, 0x03373531, 0x0347658a, 0x008d6f47, 0x018d6bfe, 0x021c9a3b, 0x01170e8d, 0x01534c87, 0x02b9db21, 0x000e075e}}, Y: Field{[10]uint32{0x02b46102, 0x010aa38b, 0x02af7546, 0x0161b39b, 0x03205828, 0x02996079, 0x01d24573, 0x00f6a7ad, 0x035b7fda, 0x00291eaa}}}, + {X: Field{[10]uint32{0x01f488b6, 0x02f5ffe0, 0x0291592b, 0x00d8ff1e, 0x03e9c9bf, 0x00995fdc, 0x03e00d86, 0x01845574, 0x0207a88d, 0x002a61e1}}, Y: Field{[10]uint32{0x031dab1d, 0x029eeec0, 0x01c6d495, 0x006592b5, 0x0239d0f0, 0x00855f08, 0x0063e7c8, 0x02575870, 0x01abd588, 0x00346068}}}, + {X: Field{[10]uint32{0x004fe955, 0x00ed358e, 0x03ce48db, 0x0296818e, 0x03f69956, 0x02532294, 0x013b73e6, 0x021f991e, 0x005467ab, 0x0029c0fc}}, Y: Field{[10]uint32{0x021344bd, 0x02cbbef5, 0x0277fa26, 0x00a7165c, 0x03539e16, 0x02c64666, 0x02a792d6, 0x011eb703, 0x0135a2b0, 0x0035403e}}}, + {X: Field{[10]uint32{0x038a8cc6, 0x0024edb0, 0x038fbe64, 0x007a7da7, 0x00ba2e12, 0x03b5fcf7, 0x02279ff6, 0x0105f923, 0x00c750b3, 0x000cc649}}, Y: Field{[10]uint32{0x02587810, 0x02383ed1, 0x01b54c4e, 0x026b3a7a, 0x017fb99e, 0x038bfecc, 0x025b601b, 0x03c060ae, 0x01411b33, 0x0032a3de}}}, + {X: Field{[10]uint32{0x02eace58, 0x02595b01, 0x0211d349, 0x018e8bcc, 0x031b7e45, 0x0014e80f, 0x006ad0d7, 0x01435d1b, 0x03c5aad5, 0x001cf1ac}}, Y: Field{[10]uint32{0x02f8654e, 0x002a45ca, 0x01291717, 0x0236eee3, 0x02aa6a87, 0x019b6471, 0x02909913, 0x013dd06e, 0x00a4733a, 0x000e8bed}}}, + {X: Field{[10]uint32{0x01cbcb9e, 0x03c449b3, 0x03c3df4b, 0x02277360, 0x01d6fa56, 0x03f50dd8, 0x00c32447, 0x00cdea7b, 0x02d7119d, 0x003372c4}}, Y: Field{[10]uint32{0x0161cfd1, 0x029616b2, 0x03340a08, 0x0090d637, 0x01a199af, 0x01b7a652, 0x02fbea09, 0x03c47eff, 0x02e17bb9, 0x0039a678}}}, + {X: Field{[10]uint32{0x00181d5e, 0x00e22fc0, 0x02f2054b, 0x02a6e56a, 0x00de71b3, 0x0303b76e, 0x0100d3a1, 0x011ff687, 0x03e7506d, 0x003189fc}}, Y: Field{[10]uint32{0x029f886d, 0x0240298d, 0x022c3927, 0x0015272f, 0x028ef6b0, 0x02287df5, 0x01696013, 0x00a98ecb, 0x01d71e44, 0x0035e3e7}}}, + {X: Field{[10]uint32{0x025fe9cc, 0x011f3dcc, 0x008db1d7, 0x02ecd276, 0x03fbb883, 0x00b52b08, 0x00411084, 0x00c6c4dc, 0x026328ec, 0x0031bb57}}, Y: Field{[10]uint32{0x028fd94b, 0x02f38712, 0x02cf10c0, 0x00ad83c8, 0x02844f97, 0x031fdeca, 0x032ee125, 0x03e0c0a4, 0x005b49d7, 0x003791d0}}}, + {X: Field{[10]uint32{0x03828b16, 0x00a367ed, 0x0047f34e, 0x023ca292, 0x03a04795, 0x03c1b794, 0x025f40a6, 0x0348cfe8, 0x02be0edf, 0x002ee23e}}, Y: Field{[10]uint32{0x02ea5df7, 0x011ce882, 0x02969c51, 0x01d38e87, 0x03ec4a81, 0x00456458, 0x01dc5960, 0x03a374d1, 0x02b304f5, 0x002dcd9d}}}, + {X: Field{[10]uint32{0x01324caa, 0x02acc3f9, 0x032a3954, 0x038c2a51, 0x02694b65, 0x0114a8cb, 0x03d8c749, 0x022f0348, 0x017bf829, 0x00230a2a}}, Y: Field{[10]uint32{0x03ef9482, 0x00771cf2, 0x039459e7, 0x03c11472, 0x037ae784, 0x03df303a, 0x00fedf31, 0x01464cde, 0x0063a330, 0x001028c1}}}, + }, + { + {X: Field{[10]uint32{0x01324caa, 0x02acc3f9, 0x032a3954, 0x038c2a51, 0x02694b65, 0x0114a8cb, 0x03d8c749, 0x022f0348, 0x017bf829, 0x00230a2a}}, Y: Field{[10]uint32{0x03ef9482, 0x00771cf2, 0x039459e7, 0x03c11472, 0x037ae784, 0x03df303a, 0x00fedf31, 0x01464cde, 0x0063a330, 0x001028c1}}}, + {X: Field{[10]uint32{0x0211d8e2, 0x02c807dd, 0x03c4d5df, 0x03a37927, 0x02c8130f, 0x011fc368, 0x03ed5a60, 0x028bc65a, 0x01872a38, 0x002ac6b0}}, Y: Field{[10]uint32{0x0029d15b, 0x01607cf1, 0x0145f01a, 0x034cf879, 0x02f7ef93, 0x02da90ad, 0x02a5f39d, 0x005e87a6, 0x037a324d, 0x0004fd28}}}, + {X: Field{[10]uint32{0x0354dd40, 0x03a1c551, 0x026cf863, 0x00c7f0d1, 0x01a24226, 0x035cbdba, 0x034841fc, 0x037f3d16, 0x007032c0, 0x0025ca49}}, Y: Field{[10]uint32{0x02a36143, 0x02d24bca, 0x02f49384, 0x014956b2, 0x0290dae8, 0x02f537cd, 0x015c75dc, 0x03a87734, 0x0244265f, 0x00247468}}}, + {X: Field{[10]uint32{0x0251b3fa, 0x02bb9909, 0x03434226, 0x0195dcb7, 0x038ea1b3, 0x014fcc7b, 0x003a6072, 0x03e0b4dc, 0x029b5bee, 0x0009593f}}, Y: Field{[10]uint32{0x01e5122d, 0x00b9a8c0, 0x0016edb8, 0x02adade6, 0x0314f37d, 0x0080e497, 0x03a14ae1, 0x00e24257, 0x03a60678, 0x0022b67d}}}, + {X: Field{[10]uint32{0x002ca7ff, 0x0360bae3, 0x0021a3c2, 0x0176577c, 0x03180364, 0x028bc9eb, 0x00791ad5, 0x01e5b814, 0x0397580a, 0x002258df}}, Y: Field{[10]uint32{0x00493e68, 0x0105785c, 0x02ab7bed, 0x028e390b, 0x01f87bc6, 0x010d5d22, 0x03b9cf15, 0x02109355, 0x01248c88, 0x000b47f8}}}, + {X: Field{[10]uint32{0x007a89ee, 0x030d4cc3, 0x014f8057, 0x0271eadb, 0x024bdbc5, 0x03261962, 0x0060b88f, 0x01e7844a, 0x00e26a41, 0x001c7be9}}, Y: Field{[10]uint32{0x01366a2e, 0x0224ca70, 0x01a0b4f4, 0x02e2397a, 0x022aaafa, 0x005ca528, 0x03b2c32b, 0x0092ba7b, 0x001f8bb6, 0x000517ea}}}, + {X: Field{[10]uint32{0x00a8dd7f, 0x01b58e83, 0x0381a618, 0x000d5a84, 0x021bc728, 0x0354d5d0, 0x01c9da03, 0x017824bf, 0x00e71be2, 0x000c204e}}, Y: Field{[10]uint32{0x0292c7f2, 0x017c91e2, 0x01915e41, 0x01190d2b, 0x00c81656, 0x00502386, 0x039ec45d, 0x03f24978, 0x02d28828, 0x000a3478}}}, + {X: Field{[10]uint32{0x02180068, 0x0238f4eb, 0x03103b17, 0x01b082f4, 0x027ea3d5, 0x00c37006, 0x006c5c0c, 0x016c32ff, 0x0136ffac, 0x003fcf58}}, Y: Field{[10]uint32{0x008c6077, 0x01aedb86, 0x035e670a, 0x03c90007, 0x01547676, 0x0365ab70, 0x010372cd, 0x00003903, 0x01be84e4, 0x0004cc8e}}}, + {X: Field{[10]uint32{0x026a3fb1, 0x03315a21, 0x02206c0d, 0x00a0664b, 0x036ec009, 0x016da18b, 0x025750c8, 0x03ad9747, 0x00e82a6d, 0x0015d7f1}}, Y: Field{[10]uint32{0x002655ad, 0x023a42a4, 0x02f2f09b, 0x01cf1a8e, 0x02ed33b5, 0x01e3a1f6, 0x031dbc29, 0x03f28b59, 0x039042a6, 0x001bdbb6}}}, + {X: Field{[10]uint32{0x0121250a, 0x039ff72f, 0x00ad4954, 0x01d60e66, 0x03df45e1, 0x010d5579, 0x01e342ba, 0x022b494c, 0x01480bab, 0x000fea45}}, Y: Field{[10]uint32{0x02a76731, 0x021b00be, 0x01fb791c, 0x01680cad, 0x002e45e5, 0x00eec49f, 0x01bdf960, 0x02c0c33d, 0x02905499, 0x002fe6d9}}}, + {X: Field{[10]uint32{0x010117df, 0x01aa291e, 0x0102921b, 0x02ef3880, 0x03da253b, 0x03ba8aa3, 0x03f26f81, 0x02ade889, 0x0036b64e, 0x00297b24}}, Y: Field{[10]uint32{0x006462fe, 0x00a04cfe, 0x02363d81, 0x03c15852, 0x031c8461, 0x0347e83d, 0x0197983a, 0x01010031, 0x02625ec1, 0x002de771}}}, + {X: Field{[10]uint32{0x01e0545f, 0x0008d263, 0x0074f5cb, 0x0368841b, 0x0080e625, 0x02cd422b, 0x035ea004, 0x01c4928d, 0x03cc58e0, 0x00148116}}, Y: Field{[10]uint32{0x006c3d91, 0x028d3014, 0x01af236e, 0x003caa3f, 0x03793b9d, 0x00338c4a, 0x030ed9c2, 0x0048eb50, 0x01fcebe3, 0x0006cfcc}}}, + {X: Field{[10]uint32{0x032ad712, 0x03e5d705, 0x007290b0, 0x02c37841, 0x015a398c, 0x0118d26e, 0x01e79761, 0x002c2527, 0x03e91331, 0x002854f7}}, Y: Field{[10]uint32{0x0148fdd2, 0x017d94e3, 0x03329c8a, 0x00a16bc2, 0x02bd053f, 0x007c6e26, 0x00318d5f, 0x016cbf12, 0x00413fb0, 0x003f6536}}}, + {X: Field{[10]uint32{0x0220479f, 0x004f430c, 0x0338a89f, 0x02579796, 0x035de47b, 0x00dd80d8, 0x0162c8d2, 0x00bf6e00, 0x036ebe47, 0x00162d50}}, Y: Field{[10]uint32{0x027db17a, 0x01cdd795, 0x0334144a, 0x03120a6e, 0x0396af27, 0x00bdb7a0, 0x02913a25, 0x019cb138, 0x02b055cd, 0x002175ed}}}, + {X: Field{[10]uint32{0x01cf5b3a, 0x030dc044, 0x02781030, 0x020ef6d6, 0x00c4433a, 0x023b7209, 0x01c34d08, 0x0118564d, 0x02c6af79, 0x00269506}}, Y: Field{[10]uint32{0x02a44ae4, 0x0155d7cd, 0x0252d63f, 0x0389487a, 0x035548fe, 0x0223d1d7, 0x03e1af36, 0x01aadf2b, 0x00c1cb10, 0x002d9852}}}, + {X: Field{[10]uint32{0x03accae0, 0x012e8447, 0x0333748c, 0x0031692e, 0x023c8b35, 0x03c1c7f4, 0x01d94ce4, 0x009ea307, 0x02661395, 0x00023aa5}}, Y: Field{[10]uint32{0x0262b945, 0x03cd28c3, 0x038e955a, 0x02fa73c3, 0x0335b783, 0x02e57175, 0x00e7c0cf, 0x009e0b89, 0x02bbc8ee, 0x001883be}}}, + }, + { + {X: Field{[10]uint32{0x03accae0, 0x012e8447, 0x0333748c, 0x0031692e, 0x023c8b35, 0x03c1c7f4, 0x01d94ce4, 0x009ea307, 0x02661395, 0x00023aa5}}, Y: Field{[10]uint32{0x0262b945, 0x03cd28c3, 0x038e955a, 0x02fa73c3, 0x0335b783, 0x02e57175, 0x00e7c0cf, 0x009e0b89, 0x02bbc8ee, 0x001883be}}}, + {X: Field{[10]uint32{0x0190b632, 0x00c4c768, 0x01ab9a29, 0x008e92ad, 0x0263cf2a, 0x01556760, 0x0266df31, 0x003367ce, 0x03717622, 0x003097d8}}, Y: Field{[10]uint32{0x009590cf, 0x02fcf5bf, 0x03a1d6ee, 0x03fe7809, 0x000a9f04, 0x020275e6, 0x01049903, 0x00a1ce62, 0x03ede94d, 0x0014c553}}}, + {X: Field{[10]uint32{0x02a06f5e, 0x0102d659, 0x0037021a, 0x0145ba82, 0x02a34192, 0x0098edc5, 0x03b0d421, 0x0094eb0d, 0x00fbea14, 0x000e0ec9}}, Y: Field{[10]uint32{0x03c6e772, 0x03d1e1b4, 0x02b04089, 0x01d2ee30, 0x01e8f6ae, 0x013a9686, 0x00f566d5, 0x02e88113, 0x006ac4ed, 0x001533dc}}}, + {X: Field{[10]uint32{0x0066d561, 0x032cedf5, 0x00b4de2c, 0x0370c65e, 0x000c7b55, 0x01a21513, 0x002d82a5, 0x01aeacfa, 0x01fe3cce, 0x000aa7a3}}, Y: Field{[10]uint32{0x02e76373, 0x0333d494, 0x02182f96, 0x03b05e80, 0x035e01ea, 0x0022e5b3, 0x007b5ad6, 0x01947eeb, 0x01a5c16e, 0x000077fb}}}, + {X: Field{[10]uint32{0x0238a136, 0x01d70751, 0x00195c79, 0x038cda0e, 0x002b0d1c, 0x01835e43, 0x01e59c6b, 0x03b5b5e2, 0x02d03e02, 0x0039a10c}}, Y: Field{[10]uint32{0x006c2584, 0x03460423, 0x03336aaf, 0x03af6cd5, 0x032e09e3, 0x02807991, 0x012a7303, 0x01699893, 0x001398e3, 0x003296f9}}}, + {X: Field{[10]uint32{0x03cf2dce, 0x026d0236, 0x006c0213, 0x00417077, 0x0068114a, 0x00bfe660, 0x009e4c99, 0x018862f5, 0x014292e4, 0x0025798b}}, Y: Field{[10]uint32{0x00c86594, 0x0377f7d6, 0x0120e62b, 0x0180dc13, 0x025e7b30, 0x010a354b, 0x03a26e2b, 0x00a1d460, 0x0184296c, 0x0001ada0}}}, + {X: Field{[10]uint32{0x02e8c10c, 0x021f1105, 0x016807ce, 0x017ce46f, 0x03b47298, 0x01cc1b9f, 0x02fbdece, 0x0170a83b, 0x0159e2fe, 0x000e5775}}, Y: Field{[10]uint32{0x01fe638e, 0x035b64c1, 0x0122cbc3, 0x0013719a, 0x034c909c, 0x03fe9389, 0x0013e87a, 0x00ab1741, 0x00d4b459, 0x003f58b7}}}, + {X: Field{[10]uint32{0x038be384, 0x034c810f, 0x036c3e8b, 0x02b68c76, 0x0271ec0a, 0x03f7bc1c, 0x01ad6c94, 0x00f86c94, 0x00a42be6, 0x002c8de4}}, Y: Field{[10]uint32{0x0319880e, 0x0291cf7a, 0x00b58d10, 0x03d0527b, 0x0117f004, 0x02a07e51, 0x0150f88a, 0x017b6fa3, 0x014919d5, 0x003f1ada}}}, + {X: Field{[10]uint32{0x016c14ef, 0x01936c83, 0x03c8f516, 0x01d41be4, 0x000858fc, 0x03b89920, 0x02eed5be, 0x01772e7d, 0x02dc3552, 0x001e9452}}, Y: Field{[10]uint32{0x033fbd13, 0x00f861c2, 0x0224f7ad, 0x03dcaa9b, 0x0329beae, 0x0323d70d, 0x017f0b94, 0x039363a2, 0x01fed152, 0x0015bb74}}}, + {X: Field{[10]uint32{0x017ec94b, 0x03c14f42, 0x01c2dff9, 0x02472356, 0x0127ed70, 0x02b9a060, 0x02215aa8, 0x03bfb47b, 0x03cb7b4a, 0x002c844e}}, Y: Field{[10]uint32{0x007831ad, 0x03efff1a, 0x010fdbd5, 0x002c8d5f, 0x03094322, 0x01532d3a, 0x01a0b534, 0x03b9cc41, 0x027399e8, 0x0024efa7}}}, + {X: Field{[10]uint32{0x036d65eb, 0x0118f413, 0x021524a9, 0x01dd5100, 0x035a9910, 0x012423c8, 0x028ef3bf, 0x0364363a, 0x01584325, 0x0007b87f}}, Y: Field{[10]uint32{0x0122941c, 0x00dae497, 0x002b11e0, 0x03a618d6, 0x02ca32f4, 0x03d0bf3e, 0x03ab9fc4, 0x031cf073, 0x0091bdd6, 0x002eda4a}}}, + {X: Field{[10]uint32{0x03a6257f, 0x01499165, 0x02c40b80, 0x02c689e9, 0x011873c3, 0x02c1f9e2, 0x0024274a, 0x013c9699, 0x01c8e1f5, 0x001c7a4d}}, Y: Field{[10]uint32{0x01b1e582, 0x005d1874, 0x00f7a5b2, 0x015033dc, 0x02ef2523, 0x01eb8a94, 0x02d86ba4, 0x008944f7, 0x0259f47c, 0x001e364f}}}, + {X: Field{[10]uint32{0x0236cb44, 0x02543bc3, 0x020191f1, 0x01b23728, 0x01617e8b, 0x0220cd5f, 0x0058fd0d, 0x02aaa2f0, 0x0234d38f, 0x00055455}}, Y: Field{[10]uint32{0x03495a68, 0x02bd1947, 0x001e5329, 0x01d7c083, 0x01a8c371, 0x0118c817, 0x030e3f0b, 0x0148578d, 0x03c75557, 0x002ad3ff}}}, + {X: Field{[10]uint32{0x01ca950e, 0x0211c91e, 0x03bacbf0, 0x01d8aec4, 0x0139e015, 0x03b8b118, 0x02f8be79, 0x02572b14, 0x01ca4ee7, 0x002af114}}, Y: Field{[10]uint32{0x029490d2, 0x039f6326, 0x013ec07c, 0x00033a95, 0x02526840, 0x00b24515, 0x01dfb80c, 0x0029676c, 0x00befe82, 0x002b89c6}}}, + {X: Field{[10]uint32{0x0027bacc, 0x0251841d, 0x022e151f, 0x019374b5, 0x029e7331, 0x0163712a, 0x0358eb09, 0x014804d8, 0x006446bf, 0x000ef1af}}, Y: Field{[10]uint32{0x02d6fda6, 0x00cff57a, 0x02b4714c, 0x02948a2f, 0x03d71b75, 0x01b5b00a, 0x0362ee22, 0x030c1736, 0x00c07176, 0x00238c17}}}, + {X: Field{[10]uint32{0x039a9787, 0x01db313a, 0x0168092f, 0x02056566, 0x0189bdde, 0x02f4de23, 0x0269716b, 0x028181d1, 0x01faef5b, 0x00374d89}}, Y: Field{[10]uint32{0x0244a573, 0x01a34031, 0x0395937f, 0x0260a20c, 0x02941461, 0x0115cc72, 0x01a25010, 0x00c35187, 0x03a3520e, 0x001e8623}}}, + }, +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/z_init.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/z_init.go new file mode 100644 index 00000000..051b8d1b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go/secp256k1-go2/z_init.go @@ -0,0 +1,113 @@ +package secp256k1go + +/* +import ( + "os" + "fmt" + "time" +) + + +var ( + pre_g, pre_g_128 []XY + prec [64][16]XY + fin XY +) + + +func ecmult_start() { + return + sta := time.Now() + + g := TheCurve.G + + // calculate 2^128*generator + var g_128j XYZ + g_128j.SetXY(&g) + + for i := 0; i < 128; i++ { + g_128j.Double(&g_128j) + } + + var g_128 XY + g_128.SetXYZ(&g_128j) + + // precompute the tables with odd multiples + pre_g = g.precomp(WINDOW_G) + pre_g_128 = g_128.precomp(WINDOW_G) + + // compute prec and fin + var gg XYZ + gg.SetXY(&g) + ad := g + var fn XYZ + fn.Infinity = true + for j:=0; j<64; j++ { + prec[j][0].SetXYZ(&gg) + fn.Add(&fn, &gg) + for i:=1; i<16; i++ { + gg.AddXY(&gg, &ad) + prec[j][i].SetXYZ(&gg) + } + ad = prec[j][15] + } + fin.SetXYZ(&fn) + fin.Neg(&fin) + + if false { + f, _ := os.Create("z_prec.go") + fmt.Fprintln(f, "package secp256k1\n\nvar prec = [64][16]XY {") + for j:=0; j<64; j++ { + fmt.Fprintln(f, " {") + for i:=0; i<16; i++ { + fmt.Fprintln(f, "{X:" + fe2str(&prec[j][i].X) + ", Y:" + fe2str(&prec[j][i].Y) + "},") + } + fmt.Fprintln(f, "},") + } + fmt.Fprintln(f, "}") + f.Close() + } + + if false { + f, _ := os.Create("z_pre_g.go") + fmt.Fprintln(f, "package secp256k1\n\nvar pre_g = []XY {") + for i := range pre_g { + fmt.Fprintln(f, "{X:" + fe2str(&pre_g[i].X) + ", Y:" + fe2str(&pre_g[i].Y) + "},") + } + fmt.Fprintln(f, "}") + f.Close() + } + + if false { + f, _ := os.Create("z_pre_g_128.go") + fmt.Fprintln(f, "package secp256k1\n\nvar pre_g_128 = []XY {") + for i := range pre_g_128 { + fmt.Fprintln(f, "{X:" + fe2str(&pre_g_128[i].X) + ", Y:" + fe2str(&pre_g_128[i].Y) + "},") + } + fmt.Fprintln(f, "}") + f.Close() + } + + if false { + f, _ := os.Create("z_fin.go") + fmt.Fprintln(f, "package secp256k1\n\nvar fim = XY {") + fmt.Fprintln(f, "X:" + fe2str(&fin.X) + ", Y:" + fe2str(&fin.Y) + ",") + fmt.Fprintln(f, "}") + f.Close() + } + + println("start done in", time.Now().Sub(sta).String()) +} + + +func fe2str(f *Field) (s string) { + s = fmt.Sprintf("Field{[10]uint32{0x%08x", f.n[0]) + for i:=1; i= 0 { + nonce = newRandomNonceNumber() + } + return nonce +} + +// Sign sign hash, returns a compact recoverable signature +func Sign(msg []byte, seckey []byte) []byte { + if len(seckey) != 32 { + log.Panic("Sign, Invalid seckey length") + } + if secp.SeckeyIsValid(seckey) != 1 { + log.Panic("Attempting to sign with invalid seckey") + } + if len(msg) == 0 { + log.Panic("Sign, message nil") + } + if len(msg) != 32 { + log.Panic("Sign, message must be 32 bytes") + } + + nonce := newSigningNonce() + sig := make([]byte, 65) + var recid int // recovery byte, used to recover pubkey from sig + + var cSig secp.Signature + + var seckey1 secp.Number + var msg1 secp.Number + + seckey1.SetBytes(seckey) + msg1.SetBytes(msg) + + if msg1.Sign() == 0 { + log.Panic("Sign: message is 0") + } + + ret := cSig.Sign(&seckey1, &msg1, &nonce, &recid) + + if ret != 1 { + log.Panic("Secp25k1-go, Sign, signature operation failed") + } + + sigBytes := cSig.Bytes() + for i := 0; i < 64; i++ { + sig[i] = sigBytes[i] + } + if len(sigBytes) != 64 { + log.Panicf("Invalid signature byte count: %d", len(sigBytes)) + } + sig[64] = byte(recid) + + if recid > 4 { + log.Panic("invalid recovery id") + } + + return sig +} + +// VerifySeckey verifies a secret key +// Returns 1 on success +func VerifySeckey(seckey []byte) int { + if len(seckey) != 32 { + return -1 + } + + //does conversion internally if less than order of curve + if secp.SeckeyIsValid(seckey) != 1 { + return -2 + } + + //seckey is just 32 bit integer + //assume all seckey are valid + //no. must be less than order of curve + //note: converts internally + return 1 +} + +// VerifyPubkey verifies a public key +// Returns 1 on success +func VerifyPubkey(pubkey []byte) int { + if len(pubkey) != 33 { + return -2 + } + + if secp.PubkeyIsValid(pubkey) != 1 { + return -1 // tests parse and validity + } + + return 1 //valid +} + +// VerifySignatureValidity verifies a signature is well formed and not malleable +// Returns 1 on success +func VerifySignatureValidity(sig []byte) int { + //64+1 + if len(sig) != 65 { + log.Panic("VerifySignatureValidity: sig len is not 65 bytes") + return 0 + } + //malleability check: + //highest bit of 32nd byte must be 1 + //0x7f is 126 or 0b01111111 + if (sig[32] >> 7) == 1 { + return 0 // signature is malleable + } + //recovery id check + if sig[64] >= 4 { + return 0 // recovery id invalid + } + return 1 +} + +// VerifySignature for compressed signatures, does not need pubkey +// Returns 1 on success +func VerifySignature(msg []byte, sig []byte, pubkey1 []byte) int { + if msg == nil || len(sig) == 0 || len(pubkey1) == 0 { + log.Panic("VerifySignature, ERROR: invalid input, empty slices") + } + if len(sig) != 65 { + log.Panic("VerifySignature, invalid signature length") + } + if len(pubkey1) != 33 { + log.Panic("VerifySignature, invalid pubkey length") + } + + if len(msg) == 0 { + return 0 // empty message + } + + // malleability check: + // to enforce malleability, highest bit of S must be 1 + // S starts at 32nd byte + // 0x80 is 0b10000000 or 128 and masks highest bit + if (sig[32] >> 7) == 1 { + return 0 // valid signature, but fails malleability + } + + if sig[64] >= 4 { + return 0 // recovery byte invalid + } + + pubkey2 := RecoverPubkey(msg, sig) + if pubkey2 == nil { + return 0 // pubkey could not be recovered, signature is invalid + } + + if len(pubkey2) != 33 { + log.Panic("recovered pubkey length invalid") // sanity check + } + + if !bytes.Equal(pubkey1, pubkey2) { + return 0 // pubkeys do not match + } + + return 1 // valid signature +} + +// RecoverPubkey recovers the public key from the signature +func RecoverPubkey(msg []byte, sig []byte) []byte { + if len(sig) != 65 { + log.Panic("sig length must be 65 bytes") + } + + var recid = int(sig[64]) + + pubkey, ret := secp.RecoverPublicKey(sig[0:64], msg, recid) + + if ret != 1 { + if DebugPrint { + log.Printf("RecoverPubkey: code %d", ret) + } + return nil + } + + if pubkey == nil { + log.Panic("ERROR: impossible, pubkey nil and ret == 1") + } + if secp.PubkeyIsValid(pubkey) != 1 { + log.Panicf("secp.RecoverPublicKey returned invalid pubkey %s", hex.EncodeToString(pubkey)) + } + + return pubkey +} + +// ECDH raise a pubkey to the power of a seckey +func ECDH(pub, sec []byte) []byte { + if len(sec) != 32 { + log.Panic("secret key must be 32 bytes") + } + + if len(pub) != 33 { + log.Panic("public key must be 33 bytes") + } + + if VerifySeckey(sec) != 1 { + if DebugPrint { + log.Printf("Invalid Seckey") + } + return nil + } + + if ret := VerifyPubkey(pub); ret != 1 { + if DebugPrint { + log.Printf("Invalid Pubkey, %d", ret) + } + return nil + } + + pubkeyOut := secp.Multiply(pub, sec) + if pubkeyOut == nil { + return nil + } + if len(pubkeyOut) != 33 { + log.Panic("ERROR: impossible, invalid pubkey length") + } + return pubkeyOut +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/input-hashes.golden b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/input-hashes.golden new file mode 100644 index 00000000..445d849b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/input-hashes.golden @@ -0,0 +1,14 @@ +{ + "hashes": [ + "66687aadf862bd776c8fc18b8e9f8e20089714856ee233b3902a591d0d5f2925", + "72cd6e8422c407fb6d098690f1130b7ded7ec2f7f5e1d30bd9d521f015363793", + "ae1d9ccf7ce3717a9aa3316c6b7850d0a85bc0466bc1b572545f90ccf1b59130", + "a4cfaddadceb816c4dad0a10d933a1880f9b47b9f943ca93b91cc3a046567fda", + "1d93be8a70df9e7450a0ce98231c58d7353e025cd1e9db32a00c2fd0a1643d96", + "a0c10151fc212bc313332c58aba5e19de1d6787178613819ff8dc6db270c66fc", + "fc54b1c9039285084cec65510329331a82397afff54706a9ac611b95c933f783", + "621484cec82cca5d8fb163d80c361ddf7320913fb294a3855c3e4db60440919b", + "b780c445c161b65c3dc1046cfba900161fe8a5f644907995b077f1afd231b230", + "4eefdc2b82e79d98fd3f323b5c284a1c35f4a8a862d9e83c8b96cd647ca3794d" + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/many-addresses.golden b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/many-addresses.golden new file mode 100644 index 00000000..53e251ea --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/many-addresses.golden @@ -0,0 +1,6005 @@ +{ + "seed": "d2lyZSBqdW5rIG9yaWdpbmFsIHN3b3JkIGJyZWFkIGJvdHRvbSBhcm1vciBkb2cgc25vdyBhY2NpZGVudCBpbmZvcm0gcmlnaWQ=", + "keys": [ + { + "address": "2Niqzo12tZ9ioZq5vwPHMVR4g7UVpp9TCmP", + "bitcoin_address": "1j3UPpqLX13rAiZMb5QqbZzBvqXptuLAv", + "secret": "e7550f33084a1b8ba935e2a943201adbea065ba9e87ae1e07c5a0b1d87ea8f3e", + "public": "024386ad78055064e65086ab69ae5c1629aca2fc7e4857261d141c181236700ae0" + }, + { + "address": "2UDzBKnxZf4d9pdrBJAqbtoeH641RFLYKxd", + "bitcoin_address": "18YZ63fRTaeGxyCou9f4Cp5Yfks55sMX1Y", + "secret": "cd6c5e2d56c302496009c0cd8006e9264a69606524fc7f58b45351d2cd883209", + "public": "02b7e753683d5b53b5ce1c800dbfee62594d7d3f1d5f8a2af8f9b9b6d01fac02e3" + }, + { + "address": "8LbGZ9Z9r7ELNKyrQmAbhLhLvrmLJjfotm", + "bitcoin_address": "1MKxHfTysWh6d4aUrt5mavMF5tGu3m13Eh", + "secret": "4976bba22c7f481334844d8f6c8d513c573d881f64a55981506b11dab581c39f", + "public": "038c977ea6bdef6f74ab9864cdbfa3065b5aeecfb1b9fc71f2459e3609a242082b" + }, + { + "address": "7KU683yzoPE9rVuuFRQMZVhGwBBtwqTKT2", + "bitcoin_address": "17hiNheV49asAtFgzznLHvvep3tKzPSeQs", + "secret": "097669b9fa165f102c4c9aa098ae3ee4ff2554788b875cb5b0aa76d225eaccf5", + "public": "021c52a4b715fc1cdc6ab6d7c8bc8d9e0ace43ae5321a07a950d63eced0b82f8fc" + }, + { + "address": "gwgdez9f3BLvQyNE5tMFS75p69zs2i3mRq", + "bitcoin_address": "1JeHyasX1sg57FyqsZT5zAeGkkzwvDCXuz", + "secret": "52d5cba120ee89ac59506d19900833e0d4d696fa56549f3f2418958791d5f880", + "public": "022e678bb9add17994fb4603914c8fa229b5c0aac6b725e24e256f6533bb185ae7" + }, + { + "address": "aSEqXrooiycfyXDc2aLYLGSmjrozJh3jCn", + "bitcoin_address": "14nNGrX2jG231u6hHESduUVaqCUYJfCaRG", + "secret": "3bd338e8674ca06431eeca83d062f17557402b88afa9daa015783e47788168b1", + "public": "038f4cbfb7b0548f53a8fe25cce2c938acbf2d17ccbea347a10872317cb5168178" + }, + { + "address": "2Z6WpR2RoBBF722hZ75ShDp1LVmojSRfAiF", + "bitcoin_address": "17hGsDUmXe6nXG6BXwM9Xe1QcqeU69zZzZ", + "secret": "d7f3f12937a4429299e67d5f916a503fdc2ba3064d89b6b39930f5265a8d792a", + "public": "0363044bd9d59c9461dddd3a0aeb5e973d696ff5f1153c1e930263244aa8066a87" + }, + { + "address": "25sH1HLTQbr1CR4uxkMFtJY2WLLwFVPqzKQ", + "bitcoin_address": "15391158MCwt86NbUKuWGXRma8rp9RdwHC", + "secret": "2c47f82501fdb00b7d47a545ab5d1e0a148c1ed6d47e8f5630091561465ed40e", + "public": "03992d87f8e40ed2e55304a05e3bf7e12c9e8713498a90acfa51c046c9746d8f0f" + }, + { + "address": "MGiD4Bg65F7bQhaKmhCLsaVKKeEFLuGgA3", + "bitcoin_address": "1JugmvsSS6z6qCuMBrQNia9jpnuYvyHRGM", + "secret": "fc7f9fb98804537752ec2d2e58618ac316e556af202294a109ddad5747b18d31", + "public": "02f4bb55716f1c7d7bd69e1f0fa7ffc50094fa348be3633a916c8da21298c2db55" + }, + { + "address": "2bYFuBzZ7QiEbpJophC2pFhQLbEFt3YSSJH", + "bitcoin_address": "1AdZUqe3sFJSPJyR6XyF3xpa1CFWzztM53", + "secret": "c8c40438a94ccfff9b2fe7150ff7a4193341a55893aad88c06f05b904bc2aab3", + "public": "0377b14de3039f77bcf3f5f4ba852a9b36eab3d7618c59c33336aa17870162d446" + }, + { + "address": "yExu4fryscnahAEMKa7XV4Wc1mY188KvGw", + "bitcoin_address": "1PvMguZUZkmt4ZRxuQWdV9eUT4Zi1yqtbn", + "secret": "ccf9b32c1f573a7e1cbdaefb791e515847e857fa6e44a42a4bcb396c5e5e7544", + "public": "0399e8ac882b086491e424a04cd8289e340a5cf132c74950659bd21262db5674a7" + }, + { + "address": "23GxEvPcy5vFPuzuP8o3PBag3HgQdoaWyXb", + "bitcoin_address": "1EE46EfqpsHavQJU516v51ADpTjnybFWyv", + "secret": "815d3fb815e4cc29c5e17acd597c570a8f1f9108ae955c01fd756ba5564bba4f", + "public": "0370dc9f523c4bef8697e87a59cc6c54f4e89d513a8bf08b1cabab7a357a508957" + }, + { + "address": "2C3JbrfoE4dSjZ5dE4hxrYCmmmrcFEGyiUL", + "bitcoin_address": "1ESPG75CWwTntHXvwCR3PhJvLgjQprixx8", + "secret": "5e01bf90d5331617a5c83afec44ce5b13dadbfc94efa58f2445ac2e9885c867e", + "public": "03761fa32c428788d875e670ad62f128da4ee70ccafc9577b6f1e3ba69a5195137" + }, + { + "address": "KE9oA24AuPzDzWBEjhGJu7PHZsQjGXYcww", + "bitcoin_address": "12V7ZzvCtW69PMNWvyZjzxkMK4Dhky2DNX", + "secret": "70a250282d1b56abffee25badeb702c2ca82650c67ffa8be526cd600007406da", + "public": "034e06e04e3c6a32ddbc25c7572343d50a3c4eedd596550ccea33aeb24410d2422" + }, + { + "address": "2KnZdRBrVkK7EyzPxFdYrAoZ17MwjxxaCR", + "bitcoin_address": "1FAZWYP3k7kFVFrV4AHKHf1ZJDpAcqNAA2", + "secret": "4627499983552fea4be50a879b5923f039959baa3af2e0699381a95507f0e6ab", + "public": "02dba9c7be5ea5668554d295027eaec51b69a582f4561d13afa8ee9004b2941b2a" + }, + { + "address": "2NGNQTdVNxZQPpBvj64ecidwXF3ZhhkX922", + "bitcoin_address": "1FWysyVBvK8SRH8fZGTfXxDCGi2ZgUnuUJ", + "secret": "76446750f1f12301fed6037803d0560c008a98a2fa34ab5a1ddaa8ff9dcd3a52", + "public": "026341de878a483526cbf90a591fe8b6fa77fa775d3dfabca8ac5be72aa83690ef" + }, + { + "address": "3sNLvvtb5wFLMhoFxhSb9FiySLGoAzNbGd", + "bitcoin_address": "1DLmvLvjk7KU56m6bF9nuFgKib7RwWLjS5", + "secret": "9f9b67cde19a83f752c9639a86ec935526e1ab8a38dd23a702686e0e9d4e45b0", + "public": "0398a29c3eb0462bb65757990a762f7e5062db04fa228168c8a308348f1ff5903d" + }, + { + "address": "2kaTspbcfCyWNatPbRNZ55Xg8zyp77rNgv7", + "bitcoin_address": "16Epeebvdgt2raLuQRWtvmHhMMNjSnVXww", + "secret": "2ef76df65020b8c65ba9c6d71dd027cac4892e7e8ff1c8b12f87a48be1e117d0", + "public": "02d16798077bb6dc624d3dbbe99c698c7b91b17157beaba72216b6d85b436a3529" + }, + { + "address": "2mcYBt3gpiYFjkTZQHP142R3NF4JZimhSzk", + "bitcoin_address": "1LfPrqrHdZWc7M97hrxurAKZ61Ebn1F9kr", + "secret": "7c2e5e465f172630375aad2b57a45b654c10a9a805f0f25b1a34ceec1b420a74", + "public": "024ab0a1303bbe5e09222c39276da19ff1f761cd1a164dabbb48e6f388a7a82f8d" + }, + { + "address": "d4vFNveNynBj56XWK4M5cHw5JGLdc9arDb", + "bitcoin_address": "1PyuRxJV6qvfPcJw8YmAwhDZXv3JRYgkS7", + "secret": "0e956d92efe55a0b6c0b4db9a2f25d370961da54295ebf45fa8cd0bf4d4c3a3e", + "public": "0396a73e38515653a2b58030489cdb85b8dd000293597eab9616dcbfe0d02892a2" + }, + { + "address": "trJzid787SDzbZke8HGGabsRJxf5UYQ24t", + "bitcoin_address": "1BGnTbzKH11z634EZChdxu8ueZSaqXuHDo", + "secret": "aa3eab38c574d811d2238f88a8db27c3973c5f3454e50224340abbb70510da2f", + "public": "037570e5c30c2cd11af39ef7cfd8d3d1d09bc9a6618fa649b484f76560f27d9fdb" + }, + { + "address": "843rtbppb1fS7GLipW2VdAJ6U3ASNYEYXS", + "bitcoin_address": "1xpBR4ujZ2VfQPjDct4cVovgiyNBrJeed", + "secret": "f700853e5a35c9993f7951b5b7c9bcba595f8a0ac6394e233fdb40c2955bafd9", + "public": "027b6f77c26d08e3ad3bed214f8bd450635c3f53879c60ad51560eb877753dccda" + }, + { + "address": "Jn8SM7bRtzC49hb5ndj8RSjbqUUUPqMj3A", + "bitcoin_address": "1C34YDP6YqjdpoGFtZveWJZKunk78DbQTA", + "secret": "dd09b66bc338c831be7d3e781345957e0b04c691cb9e3fec7104202aabc3b949", + "public": "036abfb1f082662fbe2d39ad34c9cfa4f58f57160d77a7ef997c6738ce7cc496fd" + }, + { + "address": "2BwTfjCK38ucP4UAdAX1HbzR7etZcBY6FXr", + "bitcoin_address": "1HViemK3bHGzib5hbYUAMcq6e7HYATfRPL", + "secret": "68928b66031781cc596dd42bf1234c6ae315df97791a2f96bd5c74d2251497bb", + "public": "0328b1281495e1547dc27a29fb29f4a1b66b66fb8358e126beafd76dadbc8272c5" + }, + { + "address": "2XRhzqNgRJgT6rNp1FVp2SyZfrDedjSKUWx", + "bitcoin_address": "1cy2bSeiVsFHCoADdebEvW6W3s44J2v5X", + "secret": "8800062e991bed81298c23b773050edc552390bc5d0eefa6abec0237524a1866", + "public": "020c41cb5d5294a18378f8141b7868d39c9f9c7b0ed2d5f862222a103cd9d491e9" + }, + { + "address": "o8xuJ8PVfeBCSsZkR5hoB12ooBwXJzVztB", + "bitcoin_address": "16Y42omdtrTkzByMcKs92t4pkeZcybspry", + "secret": "7a54ee9f88101d3623b81556b36922b18b6fe2bff154170322544602daa2685a", + "public": "02d8f4e328d0c04218f563ad17edf39af82dcc8b5f8d5639a6ece03239c7695d4e" + }, + { + "address": "S49fz7SUwStZvhTM7DuJfN2DKPgkb9bo5r", + "bitcoin_address": "1Abp3EyP5zS1D17vMXzvGSyhefJten2txn", + "secret": "9cd5662056a5ebfd882c63852c8bcff133d7fdec0c7c51d3cecc4b41dbb9c5aa", + "public": "02bc622382316e90b2dc4c63a6638719f710dad0024818d96a42c67bbf49f49632" + }, + { + "address": "FZRetm6mneEEkXzZTGhMfWvK4yaSo1rjf4", + "bitcoin_address": "1JLDYtnLH4CLRuSFukPKzHsCXgNenF7aRv", + "secret": "673a827dc5452987a4e944dd5edfc286f815c3fcaa7a9f219d46cfcbb56b5dd4", + "public": "03abc7caef609535b9bbec78b24c2f0944e2d3cd472021e2e714f5136b757b85c4" + }, + { + "address": "pC4nG37Nz9VWTfEXJjgSP7wKDRzNkF4bn2", + "bitcoin_address": "16vcAZM2iuGBKMR7j7eEMFAQD4qLmwfvJL", + "secret": "a76c7a8c63a7c65eedf815ec927b0ec4236944d57bd975cbe3b0ba7c15a238a7", + "public": "03e9bf477af127058244bd5ada03d17f966ae1ac35fee464347aeca568643dae4c" + }, + { + "address": "uVfk3t6iE5f37MVCDKrquUewt2KJWZJNTP", + "bitcoin_address": "1CaNfgdhquybHRcLPL74jhGiVNYNt6V9qB", + "secret": "f1fada84b0e61f65814ac2647a8e8f776fed9d07659cf5540817e712ee4d603e", + "public": "03ac4c5040d5e6c0fb9536968e4c59b826a5bcded4af44a1c70cb06c2998e772b6" + }, + { + "address": "25sESDqRTSKZbq1Z7UUykw1UxnxejaeHKNV", + "bitcoin_address": "1hRHetLTsJw5LDg8c2cu4weDV37WrotZu", + "secret": "e66fce8a4934642b40de3206937bab985279d043a5dd063e04c2718d93612d00", + "public": "024b1e68e39344b6e3857434c4929f3c0409897725ddf6b82e363446964a5a7f8f" + }, + { + "address": "agYZZqeEPpHYS2Ks9tmtbBEg6xTCYZVatb", + "bitcoin_address": "1Dh4KmJ5nKuguEaKFKhAEDYJGeR6iBRvqL", + "secret": "8b111a441d22f5bc465913e318ff99a5dfe7df5cb011c59d8197809209e47ad6", + "public": "03e36c45480e687f6f2ac25608d0b8e75ea8ada441965c927a4b15a78e3f94c82a" + }, + { + "address": "2TpoqeGL2tHKnfBzaBpD6oo3E37rA5X74bA", + "bitcoin_address": "163oYyMAPQtSvJGAaF3cSGHNSTr2up9YPE", + "secret": "09bc51ed1979b9c3011519f2a6c900762cea345aa1af5c73a2ab94054c0e177c", + "public": "021b11212bd1127d4606e48c36938a92696d115dfb37880e3e81b8d5b59171fde3" + }, + { + "address": "22y8iKcVhL9337QPXWAM5m68f9eKHcjhU44", + "bitcoin_address": "1HPN1A6spPRejMNmMY7kEd88MKvkHAWK2T", + "secret": "af7212e928b268c0c8078fe972dd394cace9551d36b6c0c60fd264542b6b5256", + "public": "02c1147a11a54d5545f696f6c5047d1571e6b432de8a57e3dff461f159f59a88ea" + }, + { + "address": "f1YscDhp9YWMEnYbPtdJE4F7yaV7GsNTPS", + "bitcoin_address": "1Ew5JhNcH4SfM4ZUCrMRQmukm9AyDceQjG", + "secret": "d8e41cba017811d71814bd36bcd31eb63fd6ee9745a3b2436eebdd2700f58bc1", + "public": "03346a3a79d5d6eea45ba3abca39284ff97d0ccd4371487d72f3b4767d70a5df79" + }, + { + "address": "nHPDziRL3wwDpe9rGsTUEocAQbyRHAJigC", + "bitcoin_address": "1ESHQBbv8LakFs8yZyKrkQfCLwz5nGj2pS", + "secret": "c1bfbcd71db2d80d2cfd1d703a2c77d218cfcf887bdc31e54c8de628b9056fbc", + "public": "038e900f336f7c079594b2932ab6a477c88c0fc15499eca290c1901408ac0f5b6b" + }, + { + "address": "bx6Z6THQsmto8ANcgNb9WGhpedQWhvKiPD", + "bitcoin_address": "1FigmshAUTuGEiVSijeuHcD2avwhP6ou8m", + "secret": "909c29237a00742601bd955e68bd816f7e7bc6dd59ce3073c29bd33d541a2bae", + "public": "037b9af02809edd2690be5816a2884c2c13b81dac4664ae9b77955c1311b270116" + }, + { + "address": "2NAfLeTNC19wof25NSBNpKGTtKt1iEZtxDT", + "bitcoin_address": "1DimUWDkvdsZ1o7sbabNT6zAoxN4fh3Vn2", + "secret": "2e9162ff3277034514612537d06bff053b0739de417887d3aff7f4cad7234422", + "public": "02210135701345e15b2aaf4deda129cd751c47e3a37911d38c9cc69c2865b69c5f" + }, + { + "address": "9L2uQrmvmgeQDYSgiPAmczWAgJTWekBG6X", + "bitcoin_address": "16DmYCm1qzc6iSazyeqC9etneg3NKXbcct", + "secret": "74e851270b94649cc8b53aa56ae2e188de32d43346a17e7e82e492dab1104a3a", + "public": "02adcb621c62eb75c79ea6436017e5d34631cd376aa8e965d760cfd8bf7f9a225a" + }, + { + "address": "8pDsA7hNgcGmugiq9SqbpBAr8LNvqXhYCd", + "bitcoin_address": "127BezA4fgvkPMqrFa6i21y7WMp1Hj9Koz", + "secret": "df3557714a662940a82c11d84663c55c8de236095c28a31b9ec1b149b0a7bdfc", + "public": "03f1ea020b8a21dcf7c6fc3540f96ff6444f121f397ae04cadf65cb057848b80c6" + }, + { + "address": "HDVGBNTJmnVeU1wY4iEiDmT4KoNoJ97DVk", + "bitcoin_address": "14GZqTYYoCBgjsW5Qi28DVFWkaVMTjTUME", + "secret": "5041f6146dd91ca0213e2df48cf8c9bd0f99c64fc8a0b64726b44fbbc5f547d1", + "public": "031a66ada2536a17a5490072f0aee3d980b13de58700d933b691d2b95491701eaf" + }, + { + "address": "28GUdCt1ACa7Rn8pN9ekxugDh1hWgiY8W5m", + "bitcoin_address": "19qEvbgVckCLm7w5UXYJDQgciMqmTGRM2F", + "secret": "a60c4ba7fdf08fd40149620ae0e8fc4286d6283269239f302407cd1281d57580", + "public": "023fecb3e413741c3f97ef44ae34a3c9b1d32bc77ec1cb5d2e0a62c61dbb336248" + }, + { + "address": "zW4yhXcYE1ehseDfsCyRJCfsT9aFJ1P7j9", + "bitcoin_address": "16pKEtLY51WXrjEQjBqNkBbhEDepzNuCvM", + "secret": "121b9d7572889ef55b0208dca8a483887c0b2058db5a891196f561210f0fddb4", + "public": "037cfcbe2648f52ff55a77fbd120797beeeb12b3dafa78ad161bcbf539dedbe336" + }, + { + "address": "8oEmZLjUnFx8DCt6Jpbyz7iNDEfgg5FwXG", + "bitcoin_address": "19kHV9G4A4CmsguoGhSsAMZnHkUiYyMJL4", + "secret": "4c3c253abc435b410fd2705af8f0f790c3eab26415e25b7209472a40d0b0d1f3", + "public": "028d7c6613d9a95c0eab9698afbc2f2429c2fc67e62380b6536421e1b4cb4cf059" + }, + { + "address": "2FxepT5DXPGNW647tuCakM4HxzLPKXA5mnP", + "bitcoin_address": "1H54gQ41cAniUvGL4pZqoCAvi3CXz39BdJ", + "secret": "a938eed62cfb072cc74404a3133c91cd2cc056ceb466c00f466e000bd466983d", + "public": "03e72d38296b249fe8104308120c09a46155d8a31abb0e1869a56c66bd3e87f7f5" + }, + { + "address": "2Rt2P1Vh4o4GK5EwfqF8ndxscxRZErTuyV9", + "bitcoin_address": "1GNU6UcVZv1JnArXL4VibCVzCbaHtY3CKX", + "secret": "ee422bd4c063752400d45bae49135f9af10fe29d20fd5eca3116377406523de1", + "public": "0314e0b4a496c865dd68c18cf89f19d8f09cfc0fd4f6e94578af99c6325e699802" + }, + { + "address": "Y1g9wuCKZjCArscCAdw2YjyWoiwv5Dgv7U", + "bitcoin_address": "1LxDdLvhdrnE2J4X1SyEbDWTfrMAHk2kiu", + "secret": "550c62a0491ad444acf71d6eae431b4b0503df53f9e495d2340f36d4da47e9c4", + "public": "032f92422e238e703eded027945a9836efad0f1007bee51e4c32b457cade288e80" + }, + { + "address": "2Fafftp7czxeoiio5bNHUN3WbfvrJPghVZn", + "bitcoin_address": "1M6eL5Q42zUC2Hhi4FmN5gpRegmEE3dRqX", + "secret": "f4a0576bbff57e5d01ca0fc14b26407325ee7f5bc5b7f5f146dee7a6cfb0a31e", + "public": "038f0dadbe3227fae1a18427cacf83a004c63c51dc8860b7028e95cf148d000d57" + }, + { + "address": "2W5K63cGj1DsvB7RkjmpM43PgajoJKemynv", + "bitcoin_address": "1AW5ekE78wrWFh18BxZMxCZ8L9cR9kC32D", + "secret": "f0f2c983402bf6273aa88b42de4f03876f7beda8f8ad4d94ff35cf1c784667b4", + "public": "02d1c067f11e13275865477cdbd4596be460eace6d76a28e2a4190869c2a2ce598" + }, + { + "address": "2JmV5HRoUcQY4qfBCfUFgg1GKSbAW24iFDP", + "bitcoin_address": "1KkL2aLDQfabSHjN3maRfDDMtPQ3bKYbv2", + "secret": "95d2a4a278f65f262f265a485d0341b5cbadfa913a06fe4ec168a94eb469c78a", + "public": "03b3856f613e7cf421e89c7ed8d9f218835bfff56fc85813a774545d811c4a1d05" + }, + { + "address": "JWyJu3N51syANQWy8CR5H8UyoM1W4zHbja", + "bitcoin_address": "1916komFWE9CkASeuJoz62Y6ju3FXv6NC2", + "secret": "40709c6b0060a61fcbbff96623330fb65bc38d193ccaaf612ad06157c5135772", + "public": "03bdf149804ccfa96942a0985132dcadba7275b30f7cecff92f36dfff4195c4336" + }, + { + "address": "atsx4Dc6dnqoJQHKPDjR6hgjjEtF7cNhSw", + "bitcoin_address": "16AFvENwh8W93C8zZ6dZdGizj1e6JM7c6a", + "secret": "c4e95cc86105d81321c5d7c5d93f7ca9956511e621ebe0a92a18e36c333922e9", + "public": "0314ab127f4fc734f7421a4e470f8bd763f6c63c6bd7e27644a0964f50fb736a5a" + }, + { + "address": "G6TVGZhGKttfCybksiQ77EYuQ6QUuXVsFs", + "bitcoin_address": "131bJvqnppb6X4X5DEYb9169oFn6RkY9xc", + "secret": "5a1e028796d742347c7f17c2cabbcafc47c5d8fef5c34e31bcfa012cca8bb724", + "public": "028f2dc1e3dbb4cd78cdfec0a0a9d8e88d4f7d3a231530136030714b5c82040c2a" + }, + { + "address": "tnmiayXaehMjUutwQiMnjfwumiJii3Negi", + "bitcoin_address": "1UU6TZr6szRyJT1kBaMYuTzzH14WJXjst", + "secret": "ad96aca0144c11368637c0a0c204cb54812d2e6e401c35b414ac3b8e020a3d56", + "public": "03aa85be4ad8bde40cdd03f1733cab365ffe8645ac8860c13f8ee98eee7f587a47" + }, + { + "address": "qKBvbpxDrCC13fJih6z786gYkCMfPr4yt9", + "bitcoin_address": "1GWGSkcfBgHtQQ8ihw7h8cssNSA47Gvz1f", + "secret": "e62bcf14a9c22421cf790b112a49a41d292abf8f957c595d1604fe242218617f", + "public": "033fb1376285345ea5d55f282239c9ebe6a34b0bdcc2a24fd7e50f2dcd7a9f0323" + }, + { + "address": "2Q3fiiv1VnZq52EXRegs7Zm2uNuN1VqYEr6", + "bitcoin_address": "17kgPA8Dj3krYkdQpEsfMTzz7vdZQ6eYyV", + "secret": "402d0cd54cf447d0d1a6edce5b363f6d052ac923ac07880261ab1966323970f3", + "public": "036491f6619e034c7031284cd222785b9ee0873f20019e49eb80e599423050a4f2" + }, + { + "address": "2XTfvKh4sjavjxWzUpun2aEioprqmjy8DRg", + "bitcoin_address": "12PuJiPsnXmLgeJA5D4YuDxuQdJ74S81Di", + "secret": "4dccf074e0c8e4d01fb29a41da3b05acea13693c0d83ccef456f78493787de7a", + "public": "023c992a18276d82533dc77c0d12f65668083a75f9b4b8963fc1284f34b1bfd6dd" + }, + { + "address": "rDdVaVDJhB1idZHPXbQ3PmDFV1ieXp51hq", + "bitcoin_address": "1ASAAsauwboSn6QPtxbCmfUwWYtTZf4Fhc", + "secret": "2fa5575b7df071950d930de9c9e00adfc8d7e41ae4e7731296b938874c4d324f", + "public": "0252de761de10cf981f0cec0171f713090944a85970cc911e35433427991e5381c" + }, + { + "address": "5MyhUZ9JkQ8nNh11JManWvm8btNEmBDHm9", + "bitcoin_address": "1HnMysqfVmUEWZmZSCgxVL8m4CaqieoBeA", + "secret": "12be2aab0d9b3556254e6ac9ec5480f9eeee5a9e9cd48d4ee5b26863cde25694", + "public": "03d0325101940bac1762da47ed2a30916fb381a461474ed6611afaed556d32836b" + }, + { + "address": "2faGziNRteqfmS2iT2JHrqg3DGJCr7bwPuf", + "bitcoin_address": "19otXo9qS94KLQ5gYcmcxSogR95cWXBMHJ", + "secret": "d90f354a51fccdb09f854300ad60d85999062cb716b1f3e8ad706b20e99f6571", + "public": "03637c8155e9858f168a15283d0804840e01b02654ab30dc7505fdf88d7aa88ae4" + }, + { + "address": "s6nvRxY2XmgzUNxHPhpvZWL7KxgXHjpeEx", + "bitcoin_address": "12mZpjy6FfcpJmP5eF14ANUCF1P2FrMBzy", + "secret": "caa73fdc76cecdf09c278d82eda4ce9ff40c297580dcdc191a4bd43ac0804d53", + "public": "03af813f6b8137f46ba8b77cc9f1cba50f93689ba7ce5498a7edc59a0e3314c6c4" + }, + { + "address": "i4NJfp663DS2BKoZqRrwZWyqJmhV49rWVM", + "bitcoin_address": "14P5UJAtdVNrYbjuMwnDARjia4UrVe2zrb", + "secret": "5becbb9a2f3dd5ddfe991b5d8d4c7c2d578ae4d612e92fc64fe902a4233a1ee1", + "public": "0237fa3963e2fc18f0f29e323ce3c01a7ec26550a4e17fa5dfbdd748d4a0a9e116" + }, + { + "address": "fcvhLM6vswQ1Gv6TjSjiadS6zoE7zDshJa", + "bitcoin_address": "1DJaW9bXmv6w9EYWzqxQeDHFvak3WQH6Fh", + "secret": "3dcf4be5fbd7fcec93f17a2a07854e902396f8ee7f0ee136633520c00bf8f26a", + "public": "022c509d2fa07aa98b90d4056497822853c53115f519eef7560aa0b08504c59a73" + }, + { + "address": "nfSyJEW2ABm9W8vEQiRsrWEiFu7t68YkYc", + "bitcoin_address": "1CwcAVRncdFFNb5xkF3a3E4yXo3mw6q2vZ", + "secret": "26e4d66a9d8a84b8bb249179d360817f042b065ed4f6dbd88ced895efdd660d8", + "public": "025898ccdd8f913077758d97d7dff8704eecbfcdc9d6ed6aac6e46884aeeff1b80" + }, + { + "address": "bQB98uNcaCJXWWeGr6x6xrGq5NMzbSfw7B", + "bitcoin_address": "1F4jbZomxCngjKtyacX3CjUgTzqT846MNi", + "secret": "e01f466060b0a3ed01a453362d3ffd0f0612ae7dd8f9b5c1d23f3e5df7cc40c2", + "public": "0361f9eb0b245e30d44fe15780b06d67f04d1c175f2ee155e6028a14f6dba72864" + }, + { + "address": "242BmWuosWU4Sj5e3kvDQ6ibvzNqZUzZ4de", + "bitcoin_address": "1CYPuZNRBMWFMTJ5frd4LkpPkbbRoJz1mg", + "secret": "4730bf793535f544e4c3abe6d54921801305850f769cbcb64bd65f76da1928fd", + "public": "02f311980d0636ff8fe655b6a695d6214fd09d02d03ba426d1da42dce5585802e2" + }, + { + "address": "26BWqf1QCBxGUdnbuonjWRi27LVVLmab2Z3", + "bitcoin_address": "1LnHo2dDwVWs4bYw3tLewRXcZeALX2EuvL", + "secret": "ea4b5510b9a4fbac1057012004999622d16b0e8b89cadce161ff1196cdb5cd17", + "public": "02080ce1982679c7cc351d36a4f4d4725bec9167c781df0f93de7a63d02117eaa2" + }, + { + "address": "MLXZvSFYD2Q3ST9hWHJK4wgMmoSCBW4cvi", + "bitcoin_address": "1D3n6eSbrcV5QmgpUHmnwthwrqQvhmofg9", + "secret": "fb0b97b8fcd171b41fd436b8b513794adfda84fdfd2c6f472a40380a49508462", + "public": "0314787b7d974e093a356713a5be01b14586351a91464f8762ed179290e1324f9d" + }, + { + "address": "wdVZgcdoPVpdEhAM5SBQ4gm3aZQU5rbCjm", + "bitcoin_address": "163UEEWapbBDtGb3gdpSLcQNA4kdzNskWe", + "secret": "4f6c7aa166ebedcf651b11804a969cb0ab939b1bea36bc0c7ca50f0bcb208798", + "public": "03876a421f40c2fc8c6aabc3e4449f882915c2ab5a1d15b5c3329c46e61e417508" + }, + { + "address": "22z6getjDD2GNjXZqe8tHjt5ypjutAEFoLo", + "bitcoin_address": "1GSCqSuMkazX4PfHVVZ6a1YWy28aeUotfc", + "secret": "0f3d5966a4dc8b6dc64a338e16de058728c1cf2c3f839b3cb05931bd1745eec6", + "public": "029512639e507dcccabde5d47fc5e8a4a95e222c86f5b62bf210329aec935a63b0" + }, + { + "address": "2GEFesXK5Uv14hn5Bmqwd61c1CCQGMvbZLh", + "bitcoin_address": "18i3Vn1UzMgmnCQZD4mAYB8ezKm3ADU8pJ", + "secret": "4cf001cad4d96d2f2a43089246a1c756e1c23729d1d024f5d332de17e7800c53", + "public": "03045c57e07f9a97d650fe10bf7f3fee1ec1fcaa706e4d7438b5dab09198b840a0" + }, + { + "address": "24zxvoEFNb6ww8zDnchMsqdBoJuBL2t6LQD", + "bitcoin_address": "1JH8qQvT6NUHFvr4mUs1rGPuFVB5JawfkG", + "secret": "fdae58716ebdc041a3a15c70b829af15f13560a371f57086a9f44f3a0faa772f", + "public": "025b943230dcdca2a78d9e2ef9b655c310fcc1bbe6493f05f5cb685b8fa4c570b8" + }, + { + "address": "2F9PfKBjsUMEViRoM1jKAG55T1fSu6hg1aU", + "bitcoin_address": "1AAvkQnBSuEavaJVzxLEXY1XnbnyDKE5X1", + "secret": "219b0e3e367bb102d9e221b3f9505fb808bc086c9bd39d85f3043d59a0b858e4", + "public": "037cd54ab5c37e03c911ee05f7a06dac32bb55b5a18c8c51a2098905ee4f4d2731" + }, + { + "address": "k6s7miNx1cnYVEgUPQD2iqufKzQpRDmzQ", + "bitcoin_address": "1LrScMjMviVreWzYAHMV5BeCjXjAiBAwz6", + "secret": "ccc0b397cada9ce4237a0a99697ade6adb57902cb30b7205c1572c377b34b778", + "public": "037bb2652a57a019ba2409b589522ef8a469a140537b33550e161676c0ba609fb4" + }, + { + "address": "S8kVNfBsuRPY8UcwVC44L4JmHF9c2vdoz", + "bitcoin_address": "1JVdwdveXbUjPHVv6xjGJbic382K8cPjtS", + "secret": "02a608c34f19e5f5d48eb3779bc61997c6228d6a83d32ffa21cc5e00c0c66a63", + "public": "0264d8c516969cbe5bf6882187105c72e33c44534203c935cba5bceda4875bd48b" + }, + { + "address": "2ELFHvS8iJs7g9hAYmSQ4d3fPkHPZ7GSYb2", + "bitcoin_address": "13Di7UWLrbjQFJDEad4xKZ5ZEBxrc3q4gL", + "secret": "c4d7f23d8df026b38083120e820bc90150557567591f16891de724d1cbef936c", + "public": "02773b43ebe9825f49ffbf9869a63870427c0a2d952e259fb6f14d177100fc918a" + }, + { + "address": "hVeQGNagmE3VdB8FAipt4Ya792T7JhXruJ", + "bitcoin_address": "14YLogirqihw5cM1heNwXxaTmfeiCmqL65", + "secret": "4197e0ecf350e45e082214b47e17284ecfaf1fea454032595b143a0d89d79aeb", + "public": "037e25ac47ca505d157eb26196263b1747e71548381130bacdf8688c0f31e29d58" + }, + { + "address": "2gzCB5wvkKAAjind13d6r4oSm2wasV4aTjA", + "bitcoin_address": "1DHcv7n14Nz6cJ2yvEDMbWysbPbBeQ2XYi", + "secret": "9e7cdb5242980b321a79f4247362d34c0df1552dcacab20f8dc831c06d4687a1", + "public": "020b81829cd7049a05c9403d9243247b62099a7373b5687300c4f05a3d6996522b" + }, + { + "address": "6DhQZL3HQG1Ai4pH9c72G2Svy2ELaozDpH", + "bitcoin_address": "1MrnzuYjAAke1byoXSVZuV9ssfHoBZWxhP", + "secret": "ea67b633edf994dae447cfbf50852ba075be004e23f4d99962317c62d25be769", + "public": "03e11ab39dadfac039500dd103f7f466b266a08e69ab2b3b0990b620720bafebfe" + }, + { + "address": "2Tw4op3FCi2aXuSySqPEkxUxAVHCi8Wyxwp", + "bitcoin_address": "1GDM5RW5ZYrP8kf8f1B9pJc3k2UJbNSFFk", + "secret": "9a921268064f24b0e07d8740b72cfc658ca198dfe2af0b373ddf643dba4de755", + "public": "02aba206211ca5a9eff06f96823d3214dd21b2b7456de48f7fe51ffe4f7b7074bd" + }, + { + "address": "2apYHtvxjoen5tFVrb88XkjPRHp61bnMmYF", + "bitcoin_address": "1PWLA1dvKNCJiy99VZZLZ3mdRHhnCphKNz", + "secret": "7828fe7605bbbf70fc0003d04ec85a860376e8d1d8ea13fda2079be6b11b5c2d", + "public": "02e717897f6b0f94f69a393f895c9df2da0e45d895cddbbe95256f6ae0c433c7fe" + }, + { + "address": "1NdzQhMertw6PGza5eSxqfWMhMjGhbYszx", + "bitcoin_address": "1NH5p91t8ddF2zs2QyxkSzk1fnKzQbLKWd", + "secret": "6f539af4e8b9001e591421e2830a3a2508dcb1637f46203e5a80fe84a9952a9b", + "public": "0263b7563c486dcc9ab1f0d46a5c10ceae652339c353031296c9f1d7deb3fd2683" + }, + { + "address": "xQgKsD9dAHf3NAazojsQ8WYzbaAyrJZeVy", + "bitcoin_address": "1LikCz6dBh6La9PAJNr2HQLarN1mNVS5U5", + "secret": "ac07ce6a66f23f5ecfd0e0d983297e18a945730cf653405029c2e94cc7975ad6", + "public": "037104e7bbc30d57f60ce85bd56b19ad72507079dbb9befeb524bec6c6f6b35f8f" + }, + { + "address": "2SShMG5rU7mJ7v6wsjtFYgxrNB56P3cpdrS", + "bitcoin_address": "16JWLGfob4h7rkab4gfN2eY54eJbff8bN5", + "secret": "4a59d42ba0cf18052321f70d008820256b790ca132461ec0bbbdbe1e03bcab40", + "public": "0321b0224eae60e8518343b6cc8ac9943561edb276bfc468aac589eed9e1044415" + }, + { + "address": "M6JKu4bqGgnJ9ZFuodqfxdzN7Y4q6yoDYZ", + "bitcoin_address": "1tVysubyBJsWU9bBo44hpazBnNA8ZjcgE", + "secret": "dd8a0861ba597070c6d3b43be005e764dd2960bd12ba86baaec4c914132eff60", + "public": "03b046f7c69dee941ebdd54498386338bc2378ae983c9d6b949e3019205dcc7be6" + }, + { + "address": "21vVXWwfSgmhVjMZKzRqQphhHWJhQN9PDmy", + "bitcoin_address": "19sJ1KvSam3r8wEKE51v8BSnarudqShP61", + "secret": "29d4bc0900ad68a07c4d4678f9b75155fd06aae8d8c96637a75cce4f2cb332ed", + "public": "029b294458e653d166fddc0f96898b19b74b7ef9f5372c722ac159dcdd7a633557" + }, + { + "address": "HPju6EpzFnWijK4YF2PKhGw36zpC5MTPqc", + "bitcoin_address": "1PQrKCXpDTNrZRsLyfAnAtwrTWEnqyK11K", + "secret": "c1a77068a552a8183a634ee9aa117b21cb9c9d3d71bf885f747cf45a109f3bb9", + "public": "03b13f40cb83bc0fe2386b36ce0fa0c4426ebe68cca13d969951e019539aaa67dc" + }, + { + "address": "B4X6nsN8LUFZnyzPU3xuVJvJseVy5QFywn", + "bitcoin_address": "1J6hEXert9rx3c9gTJHdUT4r8fvbL9DiyV", + "secret": "5eb166ba3ca4da3353078eca2ca23fda60698388b37f860456a84a1317c669d5", + "public": "020d49986dc4f72bbf500b1d334570fbe96938b51b659f2628f51f65a8211e3afc" + }, + { + "address": "rA8hZGYDhU6mpYdXvwJwdMkCijiGHxGG22", + "bitcoin_address": "13HUY4XQUBmomzct2RfGaJc3UWBUPfcr2w", + "secret": "d8e8829f9729315b9ba98dc56e4aad0e85464b9f6bbb4728f705c1c40414177c", + "public": "022764a5135d53da5c995b93ec79259ad4895d0252f61020f9244914957ec4e67b" + }, + { + "address": "fHnsaH3e5F4iMSAaRBFdDvNuEXWMiG4h6z", + "bitcoin_address": "18YoUTZrv5tTuaUtSrmvCVKS1ujFxzHyH8", + "secret": "01897cda7e654eaa1204a88bdd0cc1a3c97ead4a56d5fdf0392bea2e5e188146", + "public": "03f1ff4bbe86bcd2b9a352f886df871b09b2cdd0820db6ec12473a620e3ab40cab" + }, + { + "address": "NpcgbvncaoAW2TZDbLvA3SgRBKGKjFBnss", + "bitcoin_address": "1DmzLxwsr1K7smUD4ShGpRB2dYavZxNqPK", + "secret": "afc18ea7580c9563bac4fad5408e27bed5fa5c3b48f72b71de3771e4f4daa9e5", + "public": "02401f34ac31518444750a1aec8aebbb98396a788bcee54235c62cc8c7f1855d38" + }, + { + "address": "7mZibtJzH5BV7nTsk2L2E8ybPJQzXgsjjY", + "bitcoin_address": "1FsyyxNVWvSczCiona9aZFkRMNZeuY4L52", + "secret": "4f8468222e72f899d3eca4bb752e46338430df815ff32dbea405077a970a42a3", + "public": "033c5e16a1857eb18cbdaa0760defc375c11c7a990f22947b32f603127fe8fec81" + }, + { + "address": "rTrV5jQZ1116ubbxqTD3r9VVgd9bRausbm", + "bitcoin_address": "13DVjXhc4LhdYQR5bCZoR5N8NcXrtahBjf", + "secret": "f26dfd8767fe4f2d99a006b20dcc1b760a1784e11469f601e33da7413006721d", + "public": "02d53189e1719326ca40f472c452f18bcf499f2eec21e11f39c366ba3cd1693f4d" + }, + { + "address": "2HCBvVq4Z7rsJ7o3NdRGoG2DT1KZ5EinoD7", + "bitcoin_address": "1ExRRW8Ebyb7rYCsiD3va6MGZt3SiFido9", + "secret": "02a404e6b1ef80a48f9339deab225c0ded0b6a80d26b28746e1292ab01413a14", + "public": "025318a298154019bda73f131fde9878ec04832efb78369cf1fc90d2c3a6da74f0" + }, + { + "address": "2RUhPZhqiAoSiEYBrymsdAJ6t5VkEVV8sTc", + "bitcoin_address": "1F5Da82QqKWCQDK8wZxs4Pdnb9myWJpbJa", + "secret": "4557c781294d893b66792f88bd6c7557ed85bc471d735b0cdaaa9e070dab173f", + "public": "02e2dd3b4e6ba39a59977a0ea678293255b3bc7d29351f0ec053c203a778dcefe2" + }, + { + "address": "Avk4QuxAyeFr7VtchVebEY6Raz4uRs4UZM", + "bitcoin_address": "18GUUVWdn4n71mUHyzihHftP34S7bghXNn", + "secret": "c73eb18af7efe89e31f452d912719611f8cab5872fa2d66c61ff376cf57fc9fc", + "public": "03907b52c063332d80a3aa3b9824c2a1873e966caee5a05c495487cd4bd30d2662" + }, + { + "address": "MGgcz3urE7CCqBm7BrUyiv5YgSkzM1zmAk", + "bitcoin_address": "162NAzAtYUMF8k27BzkfWkxFgQDH1obqar", + "secret": "7ba7d4ae04765fe5f69d8e1072b22dc2bd5d8e89fc7ea9177e51e7407cb80324", + "public": "023ef86e43a831ed5ea3faa6c0b6c92ef447ead071c32085ba186b615af3e7849f" + }, + { + "address": "2MYqwgpjcM4KooQG5kPE7nqicqqma8TPoQH", + "bitcoin_address": "1MGgSXcPHVTjdMLH4UQ4hii49ftstuaiQz", + "secret": "5a26e22f142054c7e91ac5de6e257d341a66dea9b377f5a1524e8733909061be", + "public": "033956c4733f9983bb70877076e9a16da0a3192bb6412fe7285048f1efba2a835d" + }, + { + "address": "ae8Ah32GU21Jk2K8ryWB3xdcyBmLZT7Gob", + "bitcoin_address": "1AAamdfk7zEYjZqQtNovp4KpBfuhafaQsH", + "secret": "1831d4b0c420224c83020eb30671836d8722e752619e8bbfff631ef4f4d229fb", + "public": "03b88178014789d21bc222e02cd802496baac40ad729b0183fb2da47d6b0bdf879" + }, + { + "address": "Hft6JuhuFhKpQmCteJp4y63GHadLWbtP5m", + "bitcoin_address": "1KBR4MpqfJeV7sYwREf514JEtiPVkYUeyH", + "secret": "815d2fdde17cdf80623cb0e4798553f929b247b79faea9cde29cb213be378b56", + "public": "02fb184a0fa61e856f1c3e6324ed6089fe81e211bfc1ab746c89d4962b4ffe525a" + }, + { + "address": "dNwZxggozhUJ9Kvfm3ArnH2KDVFi6gkG9z", + "bitcoin_address": "15nwfc3HieYWGhq9Z8HkdgvNVsnJ3BwCK6", + "secret": "9547add3c5808753234603f06a90dbee06728be93345d74c6e1a5639341053f0", + "public": "03ba596f4f81a2b4033a557175e9fff808ea41804ebdfb2583bbb7807c1a7242d8" + }, + { + "address": "2LBqp8gpoo7V5Am7ExiaycspCkzwDybmCus", + "bitcoin_address": "19BDaYFdMdd7iNi96cSJkAikzQzTLSFuVQ", + "secret": "2fefb1881c3102faaa2105597a139f601105fb705f2a7c7a23e12049507b9236", + "public": "035421fe09128dbccb1bb951847800525cfd979006482a0576f3db7983f005b9b9" + }, + { + "address": "CNoWEhb8kKXFWESa5vyqkpnEm37owGLncC", + "bitcoin_address": "1y9y8Ec7S9VUoN8JL8s8UP8TAyMNyF6NF", + "secret": "3afab960a2d0fc16cc418946397251ada6243348bfb8cda133157e1932e519e9", + "public": "03e8f8a2ba639a925de7f93538838b6530b68ef53a7ebdafdc399b1e2e6066088e" + }, + { + "address": "2jSnuGTDS7fbkfgwjkNErXGyz4Xx8hNT5CX", + "bitcoin_address": "1FFJWMAJ1RbXuMsZTYcsM4USK6fvE7wekT", + "secret": "7c124e22cba0f682a2a2a94144adf670f8e5c09228decab2a1cf531ffa59f82c", + "public": "03f88d2c546d56f7034fdd597f6e2c6cb1c00d54d69b605e3d0bb02b743bd9159b" + }, + { + "address": "BK1sByWwm6ZyCFvt1MYCnuhutEEoVKm1sL", + "bitcoin_address": "1M6zUjVPhgvm7nHkJvFkWgAm1rNrEuuNFg", + "secret": "51607221de3b4eede57796c66a418200535af5af75b73b8d48d47effa0d08e9c", + "public": "03efb377e6ee222a37a0d7f73be09a25947c5afc5b0aba90138344b44dce8e11c0" + }, + { + "address": "zmQok3As5KxobevD9YvReWkQDGC6AVNExn", + "bitcoin_address": "1FG6aby1V4mCPGQDXFNZT422C1Brtgziu8", + "secret": "f121104cd3d4fa345efd445fb8a39f52dec4a01d9948805dbe2fb2d8dd1153a0", + "public": "03997df1f0d27b539122782b6612529fdbef763de2ec3142844953b7f1fd91a254" + }, + { + "address": "JGRc5N3eEWYhasHmjWpiQ8RqFEQHFsgVev", + "bitcoin_address": "1LEL7PYG23TLqWsVdiNzG7sxAbDgHzimyb", + "secret": "efe5cb99efa43af9966268472eb5f2836af65d1878e12b3483dee1cd7f5ee967", + "public": "02d3cddc6ceb7eb6bc94244760b1b80e0fd8d32653c762a046f07379473e7a069b" + }, + { + "address": "5yDKACKJgXGeMLTJoT9Ak8GMKQrMuZtAXX", + "bitcoin_address": "1Cvj53iCqMx7595yZvDsyPsAj5c613z6W4", + "secret": "311d2ac25e2e93b75e4b221744a0544cd2c61cbed0f2ae9f2d1b96fb685de826", + "public": "03a460ee0fa4ae57cece255da2d237b155ef36add87596945c45ee399d9d092a61" + }, + { + "address": "Qt4eK48vohSAe9KL1VguDCdTsRbwqm4Nxi", + "bitcoin_address": "1GCVGvhYdaEPUv6pXsk3cdKjJDUoJ1cMBh", + "secret": "65e4f0874bed373e927927bcf2c4a0b3695d623dcd9b82699a23e090f4d695ff", + "public": "03cdb9a9ca9e32fa1c21f45f97951d2e86d5801800f0e199a171a5932c46ee59d0" + }, + { + "address": "oDydBKTwxrA5SG8BRXkjgC8p8bCLCKX7CB", + "bitcoin_address": "1McvZGUA8waAzYJyifF8VrzxWzpR3dk9b5", + "secret": "532b52c6afc906733f9a8d54f571bb46f8236aedbf99950f9441fd66195869e7", + "public": "033a17e3b255c31d2c462612cf55c7822b462072823c7aebd64d758013eb321ef8" + }, + { + "address": "2mtd6hKNAebgEXs3MKLUZj2Hbw98B6RWVJu", + "bitcoin_address": "12PrYKUVXTbcA7f2VN1UoMcXWj6t3kZ55b", + "secret": "1d5df1bf4861aca59db4601886abf9c14215bb47dd498328d0854f5958e2cd52", + "public": "0217ffc7084bdd74bc7c512251ae2b6875d6dad5e519d6d91a39e9cec457b77b58" + }, + { + "address": "SnSBaGjufieLSyi193EDTNP2nqS3CRuEDr", + "bitcoin_address": "1MYDNAG88QoMzDTeLBkNr7F84rEdQsuc2N", + "secret": "f22dd87c70e283100b42adafc2d766153ed090247dcd909894e9340b35926464", + "public": "031d9e9e4e86b10f0a32a6af86dfd4c0ab8c1e18e1a2410a3abfbcdc6fa54d74f9" + }, + { + "address": "aBbez48E247uZMtn4vQVCFkac8iuuJZXu3", + "bitcoin_address": "1J35G13QmXnHAoqbed6osZAxMjjb5SQ6Ue", + "secret": "cd5ccab9036554e4d7d5124393ca441e115d3b681543c1ae0e09e8cdce38ccc8", + "public": "022c1a6fcad7a9a2ae3a66dc2802482f028dcf9e156377de508592b6ddabc84a4a" + }, + { + "address": "RY9YMTk1PavUEQNbdqyVHdNNVPDDQvisys", + "bitcoin_address": "1Hi6VxMvRVb9eEAGwNWLqnzsmSuBagyJXG", + "secret": "7ce9cc17a56b261615d768361a89bd287ea24f845267e5cc5fdd8f8d492e5cf1", + "public": "030ff1f4d7abb8780198d610d84a21bddc57cbea7625b43eab90a612f5e360345f" + }, + { + "address": "YVjTfb8TGxDRfXCnqNmZj9WocQ8t48bXid", + "bitcoin_address": "1KStCCSnTWswKUv9uykTjGST8FBgcK39HF", + "secret": "94594f06051e8d60e315dd05dc7efdd99b033bb01071a48f2c4f0c5d14bfdeb6", + "public": "036d46388cb90f08c49d8c58ceb89b9713f9f28d5e40fc6ebeca7d1ffb628a3b93" + }, + { + "address": "4y2U1dJwDgL17A919tqmjqEfzXqMN1sfJr", + "bitcoin_address": "1KUouuPHoodd9RdqE3iUUr8FTpoND7nsKu", + "secret": "0d845f4f5b6fef53b40bfd07d7175881f96cf26861a298c96d1310969174e9d0", + "public": "0349290922a67e016f3fa308f0a7dbb151b1f86f19be4cbcab6ba870b5075f1fb7" + }, + { + "address": "NcapPnAXXQbKGRrxGi83uJJLb5vk2VaRT5", + "bitcoin_address": "1KM3Nb77Ud6G65KGN7QbaqHV3W1G654bEr", + "secret": "183ceb7edab8ee4a5aa307f66f3cf7a55f1e271f8064e0ed74f2390a954c9005", + "public": "02977fcd738a85253b58b7a2ef2ff36d47a5b3a6aa1aa343bf6bf62954b878b9ed" + }, + { + "address": "D8PPZ13Ex6wr5Mn64RRBorPcQnfGYYrpHo", + "bitcoin_address": "15xuB8odDbFVsn8qRW5cifCHE6FHw5QdAZ", + "secret": "8f619639b6eb91aedd1213d9581e1651fe0b564ddf7a2623cfed817c8c181da6", + "public": "02d41cdbdb8785fd538e887f82752fbef97efc94669001849fae65fc1d68f84f52" + }, + { + "address": "2d4fGA1RtyybodYc3q7sMiKX1BrznHP53Px", + "bitcoin_address": "14EcfTDYusEkhcibcPaoJVMsALYK6EnqCF", + "secret": "c7eea265a0472d0de21010f87c0db5a88b7f6bbccbb7b2fc89f12bd9198d9f80", + "public": "03b0599b68daa9ec4c330d840517d041f638dcae1ca8cb93bad5c2e83db2a6010b" + }, + { + "address": "vaeR4TDLoUiYzJULM7FByv9owEKMkX5cG4", + "bitcoin_address": "16NXi3J6TxRA2BMFK23azH2FzZcSsnaDDm", + "secret": "e27f88009bf53b0253ebfeec1c5cfa3831041a6a977a0a1fbaeebcfa3b515ff0", + "public": "0394fbf78b5909af228443f95e3bba853e1669a17e328314e27906637ee3e879c5" + }, + { + "address": "HHiby3rggQqcvcMWey7B2FFAwn4UPQSsky", + "bitcoin_address": "17gruRJuGKk5inPPvjzDGNCMZgNxrLdYTp", + "secret": "0e513ab67bc9eae469626faee07dcdc95d886feee2dba72160cd824dbdcb002f", + "public": "025ac4561cbd4acecd25d95e09d1c0df88f3f181120be234cb182e4c6422090172" + }, + { + "address": "DRbn4e9kumeadJD6bx5Zwc9hJR33pCJ3Eu", + "bitcoin_address": "15kpVuU3qo8qPas1xfKzmcVxFqzcPxaVT1", + "secret": "e1a3e5b5f6378bbac69f4c851aba44d5508b6879ae173ed538a7f58eee98c005", + "public": "03b2ec20a6bc7089b22e02f3877648ae92d6a961cbb0764264aff9635cb9b8bc66" + }, + { + "address": "eF2QTjnUujZiyEReWFFtgCcF78bseuf2uR", + "bitcoin_address": "1B72y7CEuSyEYWiisrpvCnRoEpBdJsYVas", + "secret": "5f9ac6bf76829a442c2e524d424fb91123e2afc9520df6fdeb9fa7985c017e9b", + "public": "021bc1cd131c269c4413aa235851449bf66d433ad2f7a6abe426f3d4251a38b4e3" + }, + { + "address": "GpdAHSAGjNBLy7f35PSgQd8fvmCYBWDS8k", + "bitcoin_address": "1Gg2wUr3q1wrDpAJkZDVu1FiD3NChBp1CZ", + "secret": "18fe04699878a57546523dc3076b1c47d63bdb091eeefb2839eec162619fc1d7", + "public": "025d0f942436a465d4f027c00652717f6b77a09485ae5631a7cb0c7c0ac3edb40b" + }, + { + "address": "2epTtuKgNH7hzfbFV6QNSzEvP9vv2uUpfnT", + "bitcoin_address": "18BSfxCKVWYrmEazSnbM9Dvbq8b6T5p2kv", + "secret": "c8755985ea031954c0501c048d8950c35685577cd543adc214c03437af59cf20", + "public": "03c88abdb994b24ea489bda4ab140e4c5cd9fadb95d395a11fb99fe7e790bbc4c0" + }, + { + "address": "2Qpz4d9HZzb1uaeN5uyjDonR3MR1f5v4qjV", + "bitcoin_address": "14cG4HnqjftikCuS9wbtqhNybL7tfk6kH6", + "secret": "b8ea20e202b9e411ab47c6da122aa0d2b2953567d61a99471a4ce66518bcb8be", + "public": "025c77a070003120f1af15aa42ae9740b44abe229ea7250b77eb1ba0033220a9d2" + }, + { + "address": "2iG4Fs82QP6WxCxayVbTfmoTH4M4N7Lvos9", + "bitcoin_address": "1Pksy1F8LshzxqknunUjnHZwLEe6cmF684", + "secret": "9fcb5c59bf38c087b0e427e6c10db9990056b65560b79402e1fce98f14652cd3", + "public": "031d315e2eb87ee8032dd461a5485876c1139a9c28c7e624cea4a3649f8aef35ec" + }, + { + "address": "2NKE64LsSB77PCUPud1heKa8xmjadonV3SU", + "bitcoin_address": "16YjpmdB7r8Ao9vpb4pcQ9z1pbbyVKgus2", + "secret": "9b05f64e513868d2388c06a9ad974146a2b036a40910f9ddab77a9d75c11a751", + "public": "03adfe42ccd50b9577fa7620945d72c70a5b096d6c97d0b6fe3a3f25a4fad56f6f" + }, + { + "address": "Aezo2HdLAbaoZguPpszC9ZUxhmJHmAFnfT", + "bitcoin_address": "1GDxiEQcNteHkUcDb1MbkuUx1jX9pEFBac", + "secret": "c4a375cc88e1b0164a8a6e1d02d309312e256f84b18ea085d31806a1268c98cd", + "public": "03bc9e850dd82d2171f821fe8eeb98497dc0d3864544099ed2df96d26afa407e30" + }, + { + "address": "rhhySrhPyMSZ9DxDHFrHR7ktnEu7AkqB4K", + "bitcoin_address": "1BGhisxbDxiiWS2usfQHUTtNWq6eE2QpUe", + "secret": "0c41ee6da35751a7dbaca48f0634f69ddc5b69d2586093a1047011cbf10cfde7", + "public": "03b1952ff8bcfd8d1febcd8876e11212108860879eec9e05d8f985951861df81b1" + }, + { + "address": "bxfcnYtu2tJU23uVKmw9qV9CffuN2Lzvu9", + "bitcoin_address": "12h17kjrzBEMKadtzbKLMeMrCJzScCrowo", + "secret": "a999df119d86f4a42617d53bad1a7536c5241d9bf63600a9d4245f07df3d3bd3", + "public": "0350e14e6de722e11f27ccb942e2a564738748a4678213a640ba3d3af0083f1f92" + }, + { + "address": "2m8ndBh1iPqPNBNGJe9vd5gThJ45KzTz4Fd", + "bitcoin_address": "14Z99TfTeJFG5GB92Jhjn2DgnZV5Rm5zX3", + "secret": "0523f1e4e57c30371b7f7b7f89f47ee9bb4d2d177c57da5a28d25ebd7ce71a46", + "public": "02e8a36d23ea250088c113d0b6f41ed40d22c3cff4ca3356f50637eb020088aa43" + }, + { + "address": "PHXhq5ArUzYZJSJ8PiBSUj4ef2sc4zEtW4", + "bitcoin_address": "1GJJx87fbhB9VZfyWU2vm18zw4SeKTVrKJ", + "secret": "afc892144fd61f4c3ad6c1cbc493c317ed007dc43fc414f73a380f08697303a8", + "public": "037ffedafde38ebc382fd26c61622a258a1ed18d2f7a0587a5c37a93b6e48e0f96" + }, + { + "address": "2WCPdhx6QR9RxRxDntTG6iZa1as2ja6btJR", + "bitcoin_address": "1MzEnmuY3trdgHY5oKFqax4Zsf1MtBkxut", + "secret": "1818a34ac2b005aa1f3f259dc16d189620f76515a3528985766761fe9198c53d", + "public": "027fee0b90497183521704f2929cded0adb3cf7123fc17b929e9de3a45d9927833" + }, + { + "address": "2bFrdk6bqR8FLQ6kYF4UPgnVjs2mF1DsfoS", + "bitcoin_address": "1MMXYjCFLh59gwkUSTHNJF7HibaqWMdZ75", + "secret": "f5c7bd0bd1853186cdf8a529d904f1916076880a1c5cd4a828730674a09817f2", + "public": "02c4e443c03b8c12e140ab0270fc0c67a144144e3dcd02963e107facc5dac5e428" + }, + { + "address": "2cwNZy4SWDT1zX5uJesdCKU2fFKjrcmpzvL", + "bitcoin_address": "1HG8Lu7vkrjq7NaGU4gHo7itTvTsMHdBsB", + "secret": "38296af1206f02b7650d5be42b8533ef5870c54c146c39239beabf6d500218e4", + "public": "0290aaa6866d979208b6a7ac2984015813ed4ec47f6a9ac49cc032fbc16b4533f3" + }, + { + "address": "2bwm9u7aGPMc7pfmHezfhLFabAuH7H6EBTx", + "bitcoin_address": "1EGPSamSsC73aLszwoW3aGk5nMcEmWiXFV", + "secret": "c98a3735e47a9c498dabae93f8b40683619eb1a37756e3b786b2d40dd001d7be", + "public": "03b9f0815dd914ef4e71caba76a11cfa41fc8d7063038b337a9c600c9a36273822" + }, + { + "address": "d4i4nQXJnoPiyPXnBFobXGM7nFqR7kJNZe", + "bitcoin_address": "1B8aDaL2ufnpe9NAxWBq95iLzYmLdPihrf", + "secret": "e3ed12b80054877ae1d5d9ca1be4dfc483d5ad4b44dffb14b331e9b8c07acae0", + "public": "02317c1f881a8f39c9987cf6daa3c8887ca03d91b3bd5f915d3dd3c8eb7dc90c29" + }, + { + "address": "2H9VJjLXy8nugAdyLLCRSJi1dwRx8oWxFaU", + "bitcoin_address": "15K3TK69w9bapGSPhECQRRsr7HRR168d26", + "secret": "e296d63f3558df4bd455a9850bd9420e2ac5f3bd2cbf8de148a14369705370a6", + "public": "03b4fec118a0e5409f5c7ae65462f56d5f40f477b0227083f238f49b9f90f8f70b" + }, + { + "address": "2Mvc6WgBeU4p7QKaDbKPspwfNvTbncAY5Et", + "bitcoin_address": "1PYfghL3dBHxvovijszqr3QVbBtpMnt6uv", + "secret": "20dd7688888654a5f214bee8d411c5635e0be8c8b13d9ea4719521959e65840f", + "public": "020993b1c2fb2e251064b1c53bcd1e5f18e7f7b5b845d8fca619ff5654de57bab6" + }, + { + "address": "2UjjeJqwrL8zhL9hiQHsfyQS1ACo7oQQnsE", + "bitcoin_address": "1CMSoyWEP3ThuGc3o6qUX4HXQuX5c5gcT3", + "secret": "8dad55ff69be245c2f6714dd514338118b4e18f4743b65c1a318b8ae8acafae4", + "public": "0294b9b8baa6b0f15f00f707a02c5f4002074bd9461982c6153b87573c7e2176ec" + }, + { + "address": "2N5b3ujSAFtGPbAVvZ5PSMtirXPAGxXDbzm", + "bitcoin_address": "1NkjWibR6PVD4tzwB5yPQ2hy8Mehy1PpRM", + "secret": "0c878e067cb6dbecf3af796ea802d685a6bd463f24b84a3ef973797596081e52", + "public": "033df20062b208d521babdbc6105e65e02f40283132af33fea83aaf1e41b9a5c23" + }, + { + "address": "2LD16WXviY1JcFLL3Zz1Amcb4NPhMAzeqCB", + "bitcoin_address": "1Hc5Qc8rbgtoaScJiF16iYnd6j5CQSJzG", + "secret": "aa9f09e643003c1227741d2c7c031d84cc4bc78269e988576a1e96ad94ab7baf", + "public": "037f33fdad8e27e15217a7c5a9b9ad7072439ee03176fd747c16a240938fe855dd" + }, + { + "address": "NRA6Li4MRknBbKaNEhRoxkP8g6r94r2Gnm", + "bitcoin_address": "16w9RvttK8dWW93EuMVpXfm7fJnAx7AGbG", + "secret": "4c44a49639f2885c2e2897a98a4d1135255a8a5fcfd17cec0f452571f547d7f0", + "public": "0334f64e4c6af2e283a7a994132ac8d6f652b1de0442540028c168e36007c998ac" + }, + { + "address": "2hnM4BQEaaNjdyGDcRe5yRVXE9i3oLDUxY2", + "bitcoin_address": "1HsjcwnhRyxGCqnBF6G83Ph2FxcZzQDY8y", + "secret": "fc1b2dd7770ff800de4fee7eb01ec6c06499939dd9c4ae6ac51047dc803f177d", + "public": "036c44f8a8ba59edcccf49a6dee7d22ddda61272fff258ba19614a529768105dc9" + }, + { + "address": "LZh8LgTSoTo1YgRpSkh5etREEyFgkLtQyh", + "bitcoin_address": "1KnCUKnXBAYJcAyRBPWzHoeyoY7qftcoa8", + "secret": "08d6246e2b3ae9ead57557f64d369507f2c6de10823864c33b68ab824229b7a0", + "public": "038f5db7aef3d2086f0e4f5fa6fb84057b8a7ad37eff06ee446911a385fd8197f1" + }, + { + "address": "KGToyy5gNPmoSxM4hUu4HDYjEVEv7kf7xQ", + "bitcoin_address": "1BV8ofcibMgaJBUtzkxLaKw2tNUUjmH5xS", + "secret": "ad4a60e329f80e0b3ed882b9497f5078f61e15168c92181c4cf6c86142cabfd2", + "public": "036e48c7dd1294354ec1181c1c41f55211c5c27069fa98c2c192c1fb6f1095fc23" + }, + { + "address": "2eVWTrgYXbDZnke76xyAFdFZeRWykNf8SFx", + "bitcoin_address": "1Kbyz7dKGY19nr6YTXM2V7Xqv3xELD6i27", + "secret": "3e2680dc4b231fe0c8f51b8a2c134b1fbde1f03ef8967011c1eac2054f65c741", + "public": "03c40c4d319aecf727e8b79e8b5dd2bba74d2d97d8da3486bf0e7df85458c3e7ab" + }, + { + "address": "EXeNXEayVMot8oAPsa4moaMyZ7ZqTNHdKN", + "bitcoin_address": "12JMTaj9mTQbmpEaDwfzR51qTwAhGLGEAT", + "secret": "bb4b593aac3b8938757e975b5f2f1ea203d56d4072c53e80f9b605ab35a70d55", + "public": "037a7744437290765a6024781596087b7554387227430c1feb5829879d242e3409" + }, + { + "address": "2Vt7Jv3tRKuTKu3H7eBffotFssGtcmxeUGG", + "bitcoin_address": "1Hm3JGYGdyK1hP2itd7tGM28ET2muEe8CL", + "secret": "5c6e8086199ecec957180e2bc5ddc894f91cb2ff118f10815358766dd6ce03d7", + "public": "0227df153973f5468a6b601b0aec4bf6c4f50ad3293b705d47fbc767dfe112cfdc" + }, + { + "address": "2anB6NqHTEP4MZ1kBf25m1AoZPaF5HCRNf2", + "bitcoin_address": "1Mf5BA7L3xARYADXZNuCXGzge5mfDFurce", + "secret": "f458a9a6f1345679295b52660daaab2e6c2ddfd9eec96de1309d29b8645de564", + "public": "030651edf0fa34aa2a8bd48f55304c30fa3156636ab22b72978fa2ede9c035238d" + }, + { + "address": "2MR9xtMD2fVReBmXauYAomuaMgjvgnuBzit", + "bitcoin_address": "16HhewbTZmHq2x4uFm94NNyAMPth1cEik5", + "secret": "97150bc09d496aac364d1e9dd497a082b8671d47c1fa3479f55131bcdbdd9e02", + "public": "02ff32925ac8e230d9652d112b61908ae00ced09d71b9353bfa8eba16c328e772d" + }, + { + "address": "2iRSWoCyw9nNSkcWzV1ntHZDzq4g5d7EjpM", + "bitcoin_address": "1NgV3Gps8nk2AYtpMVrWnmBVBm8CsaH8kj", + "secret": "4d60df4c11698ccd0ee61e1df48016f37bf4f2f5bb14518003b1d69b1397bcd5", + "public": "03907ffdf7c2ce2d673625e03967b9bb40b5ecdee8143f92a61bc5f8e46cafeaa1" + }, + { + "address": "Up9XUznLumQuJ6waAJAYCCvFimKkStGJ8", + "bitcoin_address": "19LB3fxAaweoNjzKehSVzY6Z3TDtDwHkU9", + "secret": "5519a06420ba5c073901876d3b1f11a9fb8b5be9766e0f05c025e525fc0a1ab2", + "public": "022463fb3a5fc5a850c12fa1da8a7c6b23f604a60136600234ea6a5ce7224e0735" + }, + { + "address": "2LQzzLF1wzgXVJGfrJwbj8fbCCKHsYPcpdk", + "bitcoin_address": "159UieWn5C2sL6fmWrb56eG3TcEDzUVeJf", + "secret": "ee48e87aa610c69d99b3257bcc5359730d16e6afc06b9b9a9757c277c0c94c47", + "public": "02da4067d72fe2d00b13d22843fac5d8b6153eed2cbed55810c22416906f7072b0" + }, + { + "address": "LKziTaWPqm1mqcuuFy25uk3nPgjQCeKpG9", + "bitcoin_address": "1GfTfcZBjHDsqbtrfnunFJqQZqnNPqnAt6", + "secret": "6222fdf0802f55ca91e656fe74408245aa477486acc16a1dff9bec220f26c3c1", + "public": "023298ce81f51ba19e8b93442cdebb4d34c5d25e82ed9cf89da090a6919bac92a4" + }, + { + "address": "2KJ5NEvapzdghqB7b8gVdU9eaYMk5Tgy2Me", + "bitcoin_address": "1EPgSpTLxuu8AZBPouyiKVg8twLJMTfTTA", + "secret": "6aa4dc4a06ef5063e3ebc083430def90f28cd90a05b13ce4ccbff29661340547", + "public": "0391782a7b3a5d8d2b34f7d2d0220a8471c1bf049ec51ea87712ba8f24a735f0fc" + }, + { + "address": "wteD4LYHyxZSBfnaik89dbELxBWoQubkB7", + "bitcoin_address": "1CZYa5vPpho41UkC39vSnL2EtMX4bjUt7C", + "secret": "03f083aced4af42b6aab54b7aa648825fbee5fe9b5b6c61535e9f6017142e256", + "public": "027c3406cfff5e4af70371660b31bc6cacca686299f24eb69becbdf30c991c8510" + }, + { + "address": "2L1CsK1CdeAG7tkwa27y5QVkHPLxzizcdTC", + "bitcoin_address": "1Gazw3eYCNt9d1NkbENdz2g6g8eDSDKHsG", + "secret": "c92dbefc11b3067762d632b5c0dfb335de6503ec5611599a98021ffccc72f3e4", + "public": "03910aaf182abbfb2cab0b137c90c2069451858ba4178f8e3b37ef395514581943" + }, + { + "address": "2Hba4NtNTJNhCPbbPTgiXNf7zGiuN22WDhC", + "bitcoin_address": "189Xn8V4sb79oECpnfoAKidS4SyEeHFg1Y", + "secret": "9ee66eee2ed4f0025c5f83e6042eebe189eaa46bfe6f6670bc0b32400cc46e98", + "public": "03fac3efccaad9eb1302982d97e76d0b675752e98f37d7b6bbf7a014bfa373a292" + }, + { + "address": "Fct5xp4TiAfoVj53FsVgz2Xvfu3VoSoGwh", + "bitcoin_address": "1EwaTFCg2aYmwf5hVZ9D8cebTQ6u4tkgLu", + "secret": "68533cfb6e102c1218d07c468bc0111e378ee524438c7493f0c6599280885cff", + "public": "034f00bfef452bdbdcdd0c55cf0e328acd67c9769dff7c8097f968734598c512d9" + }, + { + "address": "22n8VjKLqCBWMBrsmorJL4LwN3tezm5gEmS", + "bitcoin_address": "1HiocXeLXWjGHLf5aJz7o13TaCtCBcFLZn", + "secret": "4412597ea62ba47aa723023684be9f579628c79c40df98b139400304c4b32429", + "public": "037334c374d9ab761d5d9b738b07a48434444156f3fe293f222ee621615a008cd0" + }, + { + "address": "ZpBxiDKig7YMP4kpb26aGHyL2smaebcEHr", + "bitcoin_address": "1MAWmh87jqL7QkXG5AqxxwQdRDfKK6DR6b", + "secret": "d941ba613cdc2b87609c336d2063bf612e540875a4dc904ea4e63d9db4210650", + "public": "036c7bc521bf8a4700a2629a0643dcd1d157959284aed13b74339a0006357838df" + }, + { + "address": "2P6fGBjKESXhkpCPmij9e6A1NerU2ryy3xV", + "bitcoin_address": "18GNydRJUp4AwjfPUR5fybBsEqhjttJ2vv", + "secret": "5a6082c021c71535cacc07a5df04fc0e8a6eacebbdbd454ebeec87be95309c7f", + "public": "03c981d0bc997b4ab838a0f2009fa4e3211b2073b4b15a12a711ded2895bd69f9d" + }, + { + "address": "gByzB6sPJ7RmVpk1md1sXm6HLGKU8knjWi", + "bitcoin_address": "1JgTjwpHhG9qZXerq3tJLt2oEZssJ1Bcpq", + "secret": "e4f6298b83374823d72aa3796d7a4054a669c377090f61d1a11521390ce56745", + "public": "0227e1fd95615063c435c4f9ebe82c2d5dea86491c8b412d60b56a7e48bfbd9a4a" + }, + { + "address": "CwbKzRpBo1KMi4hrBBhQpfRbYqp4V8Zbf4", + "bitcoin_address": "17PU4BmmFGaYdFSTbAy78YC4RFvsQwf5FJ", + "secret": "688f61a4f695771ec1bc1329c86d057b551cf5aff926b184be538846483028ce", + "public": "03407a7bf3e89de64044ff4d28d289a54651c3320edf98640dfa479501b5c67de3" + }, + { + "address": "HvvEsysCjqffVAu4YWubvfv5yYYzf57Vnw", + "bitcoin_address": "1GUDHu7Xc9UjSNgsKxWg62sYdH8VR8bK3r", + "secret": "08b6180067c0e32854776a2b70c226abc9bccbb9c03b718ebfe625563d139d4a", + "public": "03015c8f13f0029cd5f666211955f1a1208735844256cf32ca32486853175c2abb" + }, + { + "address": "nVyEuvxiTYTzN6QqcmRj9wU17fHMa4VJta", + "bitcoin_address": "1BqrMpzbtzVpiWDF5f8RqLrCpVQr9pGbhJ", + "secret": "98bb4aea9cdc25f26e9ea16f0c17f171fc2b52645c25c72ebc02e2be0b561b86", + "public": "03b557c6cdb5bf376a38d06f53450b3fd5a9925e73f1c3ce03daf7702f98040621" + }, + { + "address": "2Swcj8nQBcNTtpExUnDLxhfYuvgo1ZPzX2N", + "bitcoin_address": "1FizcCarVHfyqS9t2HpaEziFJbpRFYGGfp", + "secret": "c3f23a6efd8d79499b054bf933460d843aa62ff66dfdaf69306ad92ceb0b63f8", + "public": "0256bee55434ce76ae429e74b63cf7c3c7961bb1c702203200f08ab063f1f895dc" + }, + { + "address": "fYMS9Gw91GaQcUNS8yCSVR8aWXC7RCJ79H", + "bitcoin_address": "1AkxELaCzDLqAPFFrenk9WWHavqysmgSHD", + "secret": "64ef7e0063f803ec119a6afc327c4a4df9d196ecec2deac3e4c64b418a72fb79", + "public": "02ac29f3444911103ce467990640372b23c2f1a98e8495e193ac576686eeee6948" + }, + { + "address": "AsNPg1CrLTFKNa1vviV5HkMJSZ38NXvVev", + "bitcoin_address": "16nk71Lm57dutgqQRAg9uFdQkYAoYB45qq", + "secret": "68d3bec66658ca2f4723d3c514a3ff65cab561e75e694204849b5c1b4733def2", + "public": "03c8d03e195092d202c6f75bd17c26d30c9841df9266a450e5a153bbb85951c2a8" + }, + { + "address": "uomhwkEj2mEc9JNvZTFpufDuxpornqcLr4", + "bitcoin_address": "1Dmt3jZwFjZbzqYygSdFDvz7XCCmjBz2ji", + "secret": "b0b2c25646387fad2336a3abd66d20fc7fd261b5a776e4e510e46975d5678034", + "public": "02047af97b315e20bb41c74427bf67feb838eca34bd82d8a1a78631c6450409a36" + }, + { + "address": "288trEspbRwW1NXhMUG6zSMmn1z1Yupss7K", + "bitcoin_address": "11669FtZYH8S9wNdSmQeAGfogigqVEpMZL", + "secret": "248d74d293a4689cb6a0160b4d3368b4ed8dd7a850587b3b23d069ea1e61039b", + "public": "03b65684d345fb8b319d50f4cffb672e9fd2ef99cbabf8ed13db898a1b40c2eb54" + }, + { + "address": "mC5F53X8PeJTqw8C8oAmbG6AcYA7zHTpWv", + "bitcoin_address": "1BPkTVCjcfywK79AjqaiLaEcaCabFHLLud", + "secret": "f88ee9fd93b3ef3bbc3e0abc31c0e14132079f91877bf27fc45fc612a11c8d04", + "public": "02ffacc6e508e69889db4b3df93b5c04f9ee20655bca13c0c76ae7d442d9a824a2" + }, + { + "address": "2N9TR5jDQWfSPvf2UTneWTTPzAzGixTUbxt", + "bitcoin_address": "15BJDk5X14cEJWZ6v63ZaYG4bc7R2Mx9Sy", + "secret": "4e8e791dd29ea7842d682b42a7e1236be9c787706dd5f130de9b2262f4aac59b", + "public": "03e1288e0f91cc983220bbde8a8eedcf82e0727670fe746d54ccad7aad336919ee" + }, + { + "address": "xQZoBgh6s3YEkaWxJcBJJj1caCqEr3qs18", + "bitcoin_address": "1GR6tcbuh86X5db1MKyNwdokYMiy222u33", + "secret": "09e91887df03369c64df32b6c05c19d4eab03760c6949586173b8df7f55e5528", + "public": "026e4ee5352bd39ed09ccc6b4f1f6893b450b6c554680277af3127d66925aa29ff" + }, + { + "address": "o1DeUpx1vAjsgz6xwdHQmjpVPsmaeArGYy", + "bitcoin_address": "1Ga3wvDvD3Juc8FwDvk5mryjz8XT9nALJn", + "secret": "eb76ba401eb1ce6f42a8a9b24766f98add7e717c96197b79806c5ae08c7fc36f", + "public": "03a5931787aa1f2e1bc5f03c160b1e72c42f00cc8ed5a6f78181ae26cf016699f4" + }, + { + "address": "26uyax1suGxdRZ7gJUjFKH3t8ptAnB3f1Ab", + "bitcoin_address": "1K1BbQSBFxvGYBsYmJF2BQzY7dUumjftKt", + "secret": "42b0c6d8afdc6c266e6afd7feec00f6fbc4298bf4b3e63e2c20a29c736b7ee3e", + "public": "02be4b56afdba2426151e542100fdb523271e8d0ca4fff3dde46a5ef90a2010bed" + }, + { + "address": "2GYqEYdWH4wd3aeCxWnAXAVBvfMiYL1rRpk", + "bitcoin_address": "1B9JUDvZspqKYkespgR7Djq668oWfozxsp", + "secret": "8662f1b8d3ca64d2eb00eebe3e245e99054d4bcb67d8bf7aad5f928516885e09", + "public": "0307c321ea95fd65d2e6b3985155d0d9899b6818bd7892347ffe8c261862da2b23" + }, + { + "address": "Xp5R1dYx4haxYjmZDpjBTUaGAqYTU6jRtP", + "bitcoin_address": "19rngLn5eeqop947gpRYFF9Js6kxL1xBBR", + "secret": "f5c6a132ec483f08b48d7965fa5c034a26247f1e55d77e6dc4ebccc781902680", + "public": "03245b41ed7ac350d9993fa89a6afddaf52d61244229a8b89c653af757054b9516" + }, + { + "address": "ZLwQzFUw75sbsMWTLS8H9jA2m3czji6hop", + "bitcoin_address": "13aMmcEhwXV7qy6DXK2efSYQZ95nej8vXp", + "secret": "1f05950172c640ab56ec5752c11139569f7c76736f00b94b397cad2c4f4977c8", + "public": "03b8b5bc8dd2c640e69c5f88c98f6ac0bed85f8119409147e7638b80c3931a2313" + }, + { + "address": "mLP32Fyc39JZxnvp2ZsEDK2xVKUv4YSQ49", + "bitcoin_address": "1755nhV2A7w5NnCZ8MA6ZkCRsunbhKsjhd", + "secret": "8d74584cca5c9941d4306ed7061a4d5632546d22635f0aaf54fabf4081078c10", + "public": "03bca03957963890c237254b7a6293d398df43f275d1705d9d2ee81dcad889163e" + }, + { + "address": "9H2rHSAsnEPey7Q9reVfQjFcn6HeuA6nZU", + "bitcoin_address": "12gEMnKRwJ1FWj8wiXgwxD4eUViKUDWqaH", + "secret": "f57f5c41a54b051c24195e9fda9e17c69ada46354ad0e100358db1153c15219c", + "public": "0294cac47535ba46b16380074e5a20b2e106eda46ef58d8588b34ffdda2b649753" + }, + { + "address": "RWeWyPo5jMW3RTQZhi4umoomc26asiQg71", + "bitcoin_address": "12ddQfcCtMKs3anpgYr8obDkmjV2RUF8Xp", + "secret": "3dcce71b3d62e7e9d60a8b0a7e7db415d2f29dabbbf9a90d9e4d028f5a2526d5", + "public": "0255f81c8260bb65c55b53ad5fcacfe14542dbb1478230bfc465f74d35f63d2ef7" + }, + { + "address": "489PcrGj1QQtFvdnrLYpabE99gVhK7CZDb", + "bitcoin_address": "12tKjc2NHLcTW942X5MzuECZ17HjtwA7LD", + "secret": "25e23bc3379bb160ee17faeb169d5b10e378cd4ff0c241ea47639d5ca5e3393b", + "public": "02351b30079c2adcc588fd1c50a68ca4c6b217129f0605f35057668eaf8528563b" + }, + { + "address": "fvAjpa6JpTXEEbuDLVd7fbaxyRpS97a35S", + "bitcoin_address": "16gaujLoDJMuTgvFvsmqTUzPG5DVtZrB3h", + "secret": "52724a60664d7b0d1b3f463324910c2b1924450be5b05e8d7a2db4bc53d453eb", + "public": "0209f0eb2cf37d24b74f01d385e77200d75e5ee67b2977c578443c8310fb9b2d7a" + }, + { + "address": "ZCV1g67KVwHfSGNfafFSSQBUHYeERkPNas", + "bitcoin_address": "16Vz6o56PUz5HY7V41t8hgckNWQ6BeTzBr", + "secret": "d6a7110de3a1ad13e9c01390c665810a596d8c6d1d4941532b32260b6defe285", + "public": "03b765ba10a5e030c8da62982214f549120fe18358f18f60855325939adad24c4e" + }, + { + "address": "2UQ9bjUN8YBtaLZrXFoFgdEz6H3PqfQRPnJ", + "bitcoin_address": "1PkHDBh9HCGt6iv5qTquTkQsMj8Fc7SJm3", + "secret": "8312de52989274e63b461bcd89cf9341b8014d3324892b8424146f3538e2ee27", + "public": "0318382d608f7da849b65e058db3afa32136f3b893f90b678001f0241a196ab325" + }, + { + "address": "2MdhNzpmAJxHnHBqsGmvSJVLzVYmMiX2qVq", + "bitcoin_address": "1PJPQkYvoc2icfW6uHQAvmbdbci4bBwbTb", + "secret": "fe3cd4f2731045ae184501ce477eb7745300158369ee44c3fdf5a87a2d5b8952", + "public": "039c452532ea6ca6af3eb68772172d42778c090cd199ba3e7009c06b0cb6c51b1f" + }, + { + "address": "816Gwzyu248U21D6f46r75pnVuv3AtHWrF", + "bitcoin_address": "1CPdWt4FQuzBbYMEYj9V3wgPNB5wHgSeRH", + "secret": "a71958850157ca5af9430ac1f7150f12970a3e5cc49f2b2f0b250f7262ee657e", + "public": "023385b52bd7cb2b0e5a749b59f1402237ddc355258a36011e03b860679e4b2728" + }, + { + "address": "NKYP3ZvpAa6ad2SvENi6T5HKwHeLbrVYT4", + "bitcoin_address": "1C5d5jFUfsnfJmoyy9xE9hqATDCiUYj5gG", + "secret": "01ca13b25a13f4fc7d4712b11861bba3d213e4ccb65d06e0572cdc7d14ce15a6", + "public": "02b313de4985803a1d054804fba3e723f88e64c6a2ec7fbe44303d1c4652c98c3c" + }, + { + "address": "2VjJfmxYideGu2ypmZJfLJZhVv3yxYED7of", + "bitcoin_address": "1FpxBz61HRtkJU8YD734PMLftCfPkJhJ67", + "secret": "f58e7c75269761d1cbd1c9c034afb754434f05f327e291ba96ca8ed727caa66e", + "public": "02be84a327e37a6d8267bc626c38bed05d2950e2ca1e4349905704f7f5c404ebeb" + }, + { + "address": "eAPpk64h74tsYepanFtSFzPzr82B2avcDT", + "bitcoin_address": "1CcphQPESCC7JWmCDnpeJBy5wJ6EPssr7t", + "secret": "7a0d7756af1ceb796d4aa202b10dd626bae3b530b714a3c90e075a2f0e301ab1", + "public": "0280324942ed3da9244cc0fec7fc32240792529d313e565c5f7cc8fb3dd38f453e" + }, + { + "address": "dT9rzRU52tZEUGohPpibWgGwZHSe7H5xjG", + "bitcoin_address": "1JCBFf7heKGgMVHhQr2wcgNcJFD8tZupCt", + "secret": "39b16997962b2a8749203fc137aaa5bc3ed17f0202f6e7965a60c2dd7302f4b2", + "public": "02c35a4dc1a33451a49ff10a38cf2e040054d775df92749f98c220d9665de0d3b4" + }, + { + "address": "2NJ6w1Q7oKUnLPZ4rkdFqxoSXSh7jPdkPMg", + "bitcoin_address": "1AFKTXZ2ECZFbwa3LiHaPGoVnGyyHYoNJW", + "secret": "cfb00a95d0bfbb4a1f2f5fbaab246b537ce130006f503dd3ed6108cb2f6fc25e", + "public": "03628ab3111affac3e804cca531c6392f25cb9accad0bc3439bc3fa3396c075756" + }, + { + "address": "sdrAWYjVrewkKMcpmxvcfS8NpFVoz8mQta", + "bitcoin_address": "12W3jqJdP6sEzDjHmaSCVtEzNQhSYsQTRa", + "secret": "122f3a66ae026891431a535ecd4a7ce87b766b36ee06cc982bae63d55b48840d", + "public": "03856a4861a9d5d1d0dcbce11fccfd15b14e621965577d7f84ad44a008a3a82488" + }, + { + "address": "AtpEoDv9QzZ1msqRpS67AfKmNUYMdZqtWR", + "bitcoin_address": "1MbUtV7UnocTsmgmwZMQ2sg4sQvVFWnpds", + "secret": "ad22f66b3f09fe8150b318dc2bf070c0e994a7a303eea67e5c784dc91cf93781", + "public": "03c43d4d1115804698e7f1e154b93537c91a61e579044682385b38abf606fc13f3" + }, + { + "address": "2RJsEraWYadfeoBhfJrBrvidi3u9VxTYpow", + "bitcoin_address": "1Ca8cwyBBF7g5NCRFRYuNZjwExE1yacRLV", + "secret": "828c57ebac860ef0f55510655de61e642aa329bd0ef90a0a407ad88a4cdb6c2f", + "public": "0200ba05a1798468845e97875530a31317ed9a428393f972f4f0bad6786cb77d77" + }, + { + "address": "8hjVBQTV9x3eL7MRXgqV9UM64rYur64iJt", + "bitcoin_address": "121EVx2iSzq27tKvG6v5GNJ32Cgeg5YMe4", + "secret": "202190f9d8a5adbc1ba486df7f076fba0338440a97595a88c49c870e4f1cc39b", + "public": "02d25d29264dab7b03d48aa58091d249de7ce2ccad2db54bf18949bf19b2c9eb05" + }, + { + "address": "PEq6dSumPciu9yo98jMQdHQ8msF2JbfnXc", + "bitcoin_address": "1Jae89Veqr8ddqqfvmp3mPutq3S9qnVnQq", + "secret": "fb4a81bfb954ec7bdc5f6c6ccb2bc18d00428be1a64ad095154939ea8d945449", + "public": "02fc4697cb9d1a8c364b685342894127d162ef5d7a3b7b9b26a0d9931247a4d549" + }, + { + "address": "2VV5BMupLapDN23JrhZu1rbS97zcYBbqkgU", + "bitcoin_address": "18FNz4wWRK981eQwS9cWHRkuvYEr4sa1bW", + "secret": "6970bfcd764f98f6095604f78a59ede3b079fdc7b9b369c28617405def807d85", + "public": "02a25a01476d6ea82a58c4022a8b5a379f4257a1aed8bee8968cbf3c162c84a16d" + }, + { + "address": "QcQpkqG2fRxcQsirLKHGJ2sYs5HTYrf7v9", + "bitcoin_address": "1NN8qvVLiLiKJJdv6TMAs1GEmUZPekZewp", + "secret": "1aa78e544b013fba58e38ae786767d93384cd75e02f3d4d059fcd0a099e34ae5", + "public": "0310f3a6b1152884ecc8d16417f0b9de900d86c29707538900f1fed76a8388af64" + }, + { + "address": "GEir5to36spsZ5uzSTck3pdLCFG2Tuq1p8", + "bitcoin_address": "1CHtnJSLXcZhY8tExDbzpGVWz9WxrxyGmX", + "secret": "f48ba7c9a2b190d50b093a4bda6b0979dd4110cfd7fb3405c965805aebe44b67", + "public": "02c20825470a7658c012e38b3901631f41d4371b0048653f62975cfb0fbdd2c867" + }, + { + "address": "8KM9nD2XJTrSSff2vfuFYVvZcGbLj8eA7u", + "bitcoin_address": "13cdT4mHAvijTKuXk3kh7b3EYNxScVjzDK", + "secret": "f274cd6a8279bab87069888a3d1dbf029ff46be4fd2e57d1a2fc82643a99878e", + "public": "0234e5b6d95fe79d493d0ecec613e9e0f0bc738c36ba1b77addf4b1f2fa6b71c67" + }, + { + "address": "2XaPonNm8z6upuKv5xtQpd7WmeRKTPUuoKH", + "bitcoin_address": "1BiuJwSpYibsUaEfqdgFmFhSCs7EqZmVHM", + "secret": "b866d4cac48a0670f498e9b4c10edbc27560db7fb0701e4ff87a13f6e24f9f19", + "public": "0321c3fb78a69728088f6b7316e03795bc487b41ba87a5cb92c3be85377ae95871" + }, + { + "address": "iN2qYbja7wU1Gp2JnoMUH5QiSammUC7baZ", + "bitcoin_address": "1PVHj4ZCX6pNWmR3pTBHtXAqUt2NLgMih1", + "secret": "588ceb37fe6370051d4cdabce2bf19035fd8ad9e8dfd334322d43fc2e16acae0", + "public": "02e3132cdd81d56c6628cd5d851cea5930f0f53e5ffc6a5e35d87a9f85186d823a" + }, + { + "address": "GbTRDoRiK7FrTca2MVEbQ9r9TK9PGqLhLX", + "bitcoin_address": "1K5Fqh9mquLxkESpsgtzUhZb6aakvKaZsS", + "secret": "89898c1b41e26fcd6a41e97c27f560f5db50c92e6830377379d84d767e6b6a3c", + "public": "03bfb7365227b03415f2f4e56821a7ad1baeae87b7c35b3e4bd393e7ff5218c392" + }, + { + "address": "SnfWDBRmDkshVcSgLfw5cYoAgmKVFygyS", + "bitcoin_address": "1H5w5P5vipvw7nTKc1ZYwpkhEmoTerwz3R", + "secret": "26030f3717e988f6739b27292401aaf8f9f7731c016fa1f5e1a7af384f22db2e", + "public": "03c754deb4f25d2d81cba3b6f0bdfa68907a37d9d87b7f5127f477cf3b1446d567" + }, + { + "address": "3SLNRTzvWE2qxPJH3zJdFZmZSNu2gnpXwr", + "bitcoin_address": "18qWHu1DScQbiFnMq5TZ8RDqpucxNc1dpz", + "secret": "bf33312864090d552a1f1c17435fab813d9dcfc5000f9b2a7aa693355856fef0", + "public": "02f684e4edc5d1dfeb37a770e08e57dd6a49cd8bda524631b7b208d6523c29b0ba" + }, + { + "address": "rsnD7sxaPfXqbqYXPggvLnWYQ9FTTERHYA", + "bitcoin_address": "1FRDDjiy6MKUAxx3aDPMnBL1aWcLMuBkw7", + "secret": "aae8981a907d7e0e5bd0baf1919f8dc663504a215223c3ed57cf70c823a3cacd", + "public": "03d18f871b16e48337b99fa6d9cee89212e53bb26eae9d73017ec796a09480fe64" + }, + { + "address": "2Ni5D2DznHv38gyn6E5Hc8mqBkrMQ1VfKq3", + "bitcoin_address": "1LQRfhZhcLnsr7UU5vRzE6jL6P3SVquuEZ", + "secret": "7673157ecbf104fec8687bebc5d8ad81dd5e93a0a8b92bbfcbee246dc7d3c7ef", + "public": "02bac8f5f1120987cb3fd7ffd4958cdc50e3906ffdd6062fd9ef4b96c7ff769970" + }, + { + "address": "2bso1AeKwYVDgZuiN8XLjNKx3xBHMm7M7xo", + "bitcoin_address": "12U5VmpZfwZuC8BNVwa36FiCcEE87wDT3q", + "secret": "c41954726c0d4369932006758b39f1afdded0d309ff99d8c1772f993570f267f", + "public": "039c3f264f985f26dd31cff7b0830c2bcc58ce13f54c191fce6d45fb827500ae83" + }, + { + "address": "2kooXVM5k6vn4y4jJcmgCJPnoqB4ydkTtUo", + "bitcoin_address": "1ABhxChMvC9ceZ3voSAs4TTKRzxALqtnES", + "secret": "4db9d88541c0efd0cdb9fa3acbb3b6e0ab3db4010a59aa78dd1488ad8c28ed14", + "public": "03bed7e9a58022dd6b2727439e1993b03088a61f2518a78436e4208efa19c4883e" + }, + { + "address": "2QiJF7CCM1tf6ESVHzrJbVckHcehKtGKAXP", + "bitcoin_address": "1LBm8y7RZw4yAcyzS1go5oSHuUDByaYG5Z", + "secret": "d530371a1e54014249b716d0f58ea68ca94a8c29cc2c77766032f9ee7675d076", + "public": "021bec8c0d092baf315dc4f51bb6a74ab276f3366a7f5a9aa72da8531b6dfdc93a" + }, + { + "address": "2ZFwFc7gPebsz3329NMpZPdrbSdTCvioRjn", + "bitcoin_address": "1Es7cS9JdeHEqDxQ6axe41EkYtoCYAFYg6", + "secret": "7bae0524fb5739792d1ca70ff661eee59d193113d2959308472efad7f745abc0", + "public": "02a497a0c6534627babf9ac0c9613702bf0774e3c663faa3a173daa489cfe9c032" + }, + { + "address": "2crTgsFrcHwrx96qTgNd5v2eZRhDSGwD9KU", + "bitcoin_address": "1jDLn1KXCoWA1qzD8A8VmpDyzeG26rhUm", + "secret": "0144fa3a146902f05d05ce1ea93d7f9f7740cd9515463541234b035ac7c13c10", + "public": "02a749c44375ac2f409ccade010712fc0b7108faedc9066e52656df90713407c1f" + }, + { + "address": "WTGdQJWnTZJy8BheAdohn9bDj1S1CJbcMK", + "bitcoin_address": "1AenW2BSrhRZ1Pj4xtC1HJrYWEszsHnJZm", + "secret": "320fff3d17aee027ab0a021d62984dc71e20e2a313d550d6bc71a7037da76ad4", + "public": "030b6ffda04d9048c4bcc32a2746f994eefde6b4a1707b5b2f4148503115227cbc" + }, + { + "address": "28JuPfNb5KQcTbMZorM5ffH5Z6dnqYoH5rs", + "bitcoin_address": "1BZ1oGvR9EwLrasW5WtxFjD7U84uadEBSV", + "secret": "5bf42214cfb2fb2b370dde6c400b89659c5b10d82623d5fb37051082be4dbc69", + "public": "03f727682db76736b93347b8f31414520db4fbfa8de36864ec33a5e397ced943de" + }, + { + "address": "2jYZCimvDikD1etTuiwNVkYdDVYoRkW5ajL", + "bitcoin_address": "18AC5mKsBHXCu3Qfse5Gee1w8bFga6xyAu", + "secret": "05140478b6c6839636564892946b45df6b3019681672f9b104c86ccfad644f1e", + "public": "02b04c95e8face2cb50c64526ca0d7c804811e4ca45ccd34ccc954d86692a39537" + }, + { + "address": "2Ws2CbP8zi2rmDoTV5wxXHYiBSgC4FcFbDH", + "bitcoin_address": "125UTSQ8eaGJ13eaJT59cEVxdPE7CdmCTF", + "secret": "2bd204df49886647bad2806269730ca62d071fc446f42881cd2b4f1fcc98d00a", + "public": "022aa6887280a4006676f44589b4b74a0e8358b627e797964f4d9ac466b35cf42d" + }, + { + "address": "eZLF5WNWovZ5N4KC8vZtS38K2A4u4BQs7w", + "bitcoin_address": "1NqMiuBFQ481mzTruTbWQZLn4SpUsP5H29", + "secret": "e7a78096dcea1a150b559775f643908650d1eac4bcca20de411a2764790ab1f5", + "public": "03ee354b340b4a723fdcb1ba2c11331bda62c40fd1c0f0cc52c5f876c66c95ff58" + }, + { + "address": "fadbXiZAhdLmL4DPDPFYGyqsZJxhDGrBnv", + "bitcoin_address": "17EZo9RG6zPcbSCmsDmymnnb3wPXh8Yjzj", + "secret": "c05043fe99c3315c8354326c6a7e38410372f2b27f68eab88e74d6f73f170993", + "public": "02a96ee70543de38766532aa7d58eb3d36ec7846ff57f3ac251e2522ff072cf046" + }, + { + "address": "dmEhj2EdVXyP6gTmNVwAv9cg1jsHNFR9kG", + "bitcoin_address": "17T6tgk6y5ufC4WaGiBpNAZLc65W7z6cJG", + "secret": "a09c86ebcaff266c7213d42a8fa98c1ffbbe12b91559a0d0b6a7936b3e16503f", + "public": "039dbf5a286018aa46bb4714984cdce0ae4eee0f35803495ca595b69adc5e07769" + }, + { + "address": "6MyEQAeTLFjYYxG52FPgpNrHDasYFrjXgy", + "bitcoin_address": "12KumkdT8xBd3ByXERYiZd6v692mCveNqQ", + "secret": "7a37469469c1063b3ec2ff3504df6e7a6a91aa1055a998dcc11e2781168b3797", + "public": "02980f6dc6efc5b1a259b1c588fb27b9c01ce6c366da9dacba815616351d62afc6" + }, + { + "address": "2Qh8ycrQGRuDaTmqjtJ6GQQCjL5KRCpAE7L", + "bitcoin_address": "1MVMYon6rSvcbGWUaJtfEj9MWZJ76NV62w", + "secret": "53c278e573892656e5ebc94420ad4f4460f368c2c9ea6a89b3534414d5cd8635", + "public": "021543e5108cd46d6038eb2f2274c59cc2670ac395b73611b0f381734f2acf6641" + }, + { + "address": "2aceT88Aq7FHfqxo2aBoiyDDw7rB57QsWtn", + "bitcoin_address": "1Gdh3EjFJTYK3stEt4z1TnymtGsSAUpbCf", + "secret": "d30bc636046b7fd619fa64d056c7bcae6d183b1e64e003ce9a358bd9be3ef3bc", + "public": "02f7c3b95e046785f21c280ead0a1eb3db86e87ba56a95671d1c44b5f72e93cb32" + }, + { + "address": "4Smrr2YzK2W52cxZxiCLoJhgPi81mSSZ2U", + "bitcoin_address": "1BwYuwKJVCjyACTNfgyzxLY2dP3JjqDBvH", + "secret": "0641dcb8d208b0012909b8e7705ec077fd485e43778e4b8dbcaef8eb925c42cc", + "public": "023143e54417d2df738825c2d521e283ba6b2ef611b3d53bb4fa0ec09ca33671f7" + }, + { + "address": "2b7YVEDW5WkLzrqfoZrkxzhuESHEwHF3xph", + "bitcoin_address": "1G5JnKPnarER8tr6sme2XJdZmypJPJqUx", + "secret": "77ebcdd32c08a25ff00b56603fbacb18d44eb869107e1b0a5b34f85bdcbb1672", + "public": "033c0e22d985b797c944acb9d176ff51200446aeed5a31cbd452b8aaa3f0364e1c" + }, + { + "address": "JaR22JZKMWEBSPNFiDKKCM8gatkWo9LVrJ", + "bitcoin_address": "19wbibojeyEqfAmMw7hsRSS8arJss54fEZ", + "secret": "e31e98a9043ecbb6ffa15fd480e0f1f169d86ffc440a56581f2cb994b887f71f", + "public": "02d604d042b35e8882515b5bb6d3c3a8f66b0fc816fa6dac3b88aa97ea9a8c8442" + }, + { + "address": "2j5pAjhg9yPyLuzBJnG6jPFq8Moi58Db1Fy", + "bitcoin_address": "1CMHBXaTDcNiDEtfUUye3UyoZ3GHQP4rjY", + "secret": "7ca8e3dec55937eb12e1abce3ae262ae1ecba643c69d4268c0b39b7c38e902f8", + "public": "0321f9d1f269d36138604eb84dc1087ac7b06e3bd0511a1f1128c089fc6b61dcb2" + }, + { + "address": "25PWupb7kLuFdM3UQK8tvcT98h7i5UDHkXT", + "bitcoin_address": "13NFP8W4jQq2p8M69TPeoYkxkgFfSe3F6e", + "secret": "15c148fca7434a18c484b539830abfd9ee169d39c3bf95e13cec5877ae5137bc", + "public": "023ba5a705ac79594261ebe524de80c022dfd42bda9094e8a4fa69889e6ccfcac2" + }, + { + "address": "2LWHyVRV3AEtYLvN6TwUzbFE7g2ccmhTVEm", + "bitcoin_address": "1SFDs4GBUWg2PJYvjyd7VNz6ADkQj4aCn", + "secret": "3bd05a85518a0596564796356e6ef267e99e8de6aa529a0bb70a992dfbd1abfe", + "public": "023f07f1368ace33dab9fdf039e05137b8df01ac5864723a8e913d7c74eed72c3a" + }, + { + "address": "2mJ7HbAJiYmNahgLpCSmxWg8HbAx15XPkzy", + "bitcoin_address": "19Sm18NshxViHH9oHvbrh8F6EYqRBHWYEK", + "secret": "4929beb2e5e57a9a5f1679b3a60bd6d20dbcd7b2a2527dd55f036d6e0a0eede7", + "public": "03ecbda83c01407aaf4f4856865fdbf082c12884a82e787ec0ce3d9c02bd6fa565" + }, + { + "address": "rVg9n43dSffZoVYdPyhpNemNbHDcZcnFnh", + "bitcoin_address": "1P8h4yzGieaMVTDZ33Vf2zChSrG4THQyES", + "secret": "c564ddbf95b83a7806655aed2277f7aab9b7fb14bb106baa03f497dbf3d7882f", + "public": "03972a262ab0052092640c9ab72b82617883a49b58df548f00b627286dd658efea" + }, + { + "address": "BvURWh8mAbBBqpqN6YcaVMo4xaqABPkjAK", + "bitcoin_address": "17gbQBBVA3kPzWjgRGSsJepNKDnURMRrMd", + "secret": "53f6d7e20bab00854fe7cb1671eac9ce35f997ccef7a5c68088a60709ba3598a", + "public": "02b92fba69673ce455c828a6eb473a185a3b5739fd928bbdf0e017c85bf973a084" + }, + { + "address": "298GYxeyvXBFpA9b32nf838vHz2L5bGQoKs", + "bitcoin_address": "19uxZinU2AmXbfxcUvvVZ7ZKhvWdMMjEc", + "secret": "e30820c25276c84d31b3048597f19f42b3eb204572d8d275c8f5f76788c9d3f5", + "public": "0278dc9c5578ed235bf491b5ce0fb47afcb1a1a57f73db7cc9f303055a124ba7e9" + }, + { + "address": "nRJwAXzpr766ne9BbdgX4wtf3vCkb6FFe", + "bitcoin_address": "12NFwrPoeZrTBwZQt4FzCsoQTrG3zWzZ7G", + "secret": "70ca6ef64244fd4f00651ed245f1f87390320b79ef721bdb6d87c14b52693c6e", + "public": "0362e369ee21ff7d59208212a8b9b696c617dda85821e4ef42194aa96c3581549c" + }, + { + "address": "TCXZMKsbdqy5yMnkuWgpVA5h8rZdK6odrS", + "bitcoin_address": "1HDsW8oTJi7aX1gdRXsURMYfphnzaZXxTU", + "secret": "6d5b53a3cd6e1b4b6cdfc44989627c71d5fe406dda8043eee286e40d4691890e", + "public": "037a95a70a38f2371799bc3cf2f329986d6f64bcad8455b93ec368c619696df252" + }, + { + "address": "yUMbbPX3JyD4oSA6L9cYDiEHpRqM5DZzEK", + "bitcoin_address": "1H2YNfgXgxtzhGsNFfzmUDchgyZRo7dDwC", + "secret": "ac9c752c92b9fab9859f41d4df2799ba3083c0d0261557d1563ce10ba2c14763", + "public": "027c5e3452c791d2d21e9a11f2362fc86258ea4470d3271422cfea29aa18d65e0d" + }, + { + "address": "22LAVaqjZaQk66dw8thM5eN9883pfwxF7ve", + "bitcoin_address": "1HV5fRv5HJpNmHhJGniQJRVPR1BARCRD9n", + "secret": "1da6d30d4fed6353c051770fa8df8bb25073d2a65c83be50516c7ece3407b698", + "public": "0333620b3e2078bcd027a76ffe66baa972baea3b1eefe02ed76b9a17ccc7d995b1" + }, + { + "address": "Gn9QCBzKVxHHh8SGb66wpu84BZuCw7PHbm", + "bitcoin_address": "1Jzhq8N6rNchKpRFgBPdniKFC5Zpd1j41T", + "secret": "16b00b79e3747c8e166120fe366546c32799aee2bab5ad442227b5c2173dc94f", + "public": "024726f46895b7ac02795bd5bea795ba7a51dc2ffd53a90c840c73657b25680c63" + }, + { + "address": "2kT2ZUiL7vzt446hY8Xc2Nx2ohGzcFjtZwM", + "bitcoin_address": "18EYnxLhTvTPPvu5ML6vZv1Ccnt2Q6Nmum", + "secret": "f0daf3cfa005eb279b7244beb2ea779ac76b1ea77045cf00c7379b75aad4805a", + "public": "03a8f0fef09af25c1f30e8267af7759b02942875d12e265a3896e7ef6399cf43af" + }, + { + "address": "2g7bpFrHiyyZhjFr8NNLoVoEL1HLcGyfXFP", + "bitcoin_address": "1HVfpJYvTZ2DquR7HpQdmW6WpZZAEemqQt", + "secret": "42e7c043b5bad590914cabd9da1c64fd95ba0e3618cf217c9e56e2cda849a1dd", + "public": "03d315900f1fa2b0363971f66067cb95b5e062799542417861acce3905ef009924" + }, + { + "address": "2aFx6zgr764yaew5kBJL83xKvJXtaFYrNe5", + "bitcoin_address": "1H4RifXGE7YRzYtKRsrTDCrQA87GEEKh7X", + "secret": "609ef2d18c07a72423ae24c2c0de839b900dd660106a4d2352606be503ab887f", + "public": "03070b88d231d49d34e46cf719e47fb0abd2d9b9db9dd571931cd0e33e9a21f251" + }, + { + "address": "2axw8SpzvpY6QJze48DubE7SVwhpfEdTt1e", + "bitcoin_address": "13dsNveiqEmEBRaHo5M9vJmHGELNm3zghU", + "secret": "3ae1e46578207468ba3ff0dc9e8670d3e92361eb8e4bdc7f372096a10fdea1fd", + "public": "02bda68d95c5516ec84e5e8ce328f6354a7f3fa1e8e0376b8708d570dc4e7cb551" + }, + { + "address": "y8DV3nCwaDs9PtsQbiZnueVcbqB5FNho3h", + "bitcoin_address": "1HxXcjcibFAsrXYY65ptqwDY6zU6qPdQoP", + "secret": "c4c7d8f99d6df9127b6ce974e4b5791619b7a6d9230bd7ea494ddd5321c3b02d", + "public": "032da1fe104a466b03731eb9fd85709ee31a91b3eaedbaca165413526ecdd87dd9" + }, + { + "address": "eJHjp2SLL6ZUtYHhfEMNdN3c49k6QU8W1k", + "bitcoin_address": "1CVYSLH4mrXUheQcz3H3HSfbKzGGsEhmFo", + "secret": "fc4c34570ee70911601b48a8881e93c713d9552cb9499c871454b1247619f7f1", + "public": "036cbcc6c350ae878de0382b4d4a998f85490f6ccd288aa37356730eae31e1d3e4" + }, + { + "address": "ZBRYcydEtrkGHYVFRmHQpzVwfDimNC7rfj", + "bitcoin_address": "1Bstoq2KqkPXiUkYhGptLwhzCUCD4TciXM", + "secret": "2df0754861dd3c563c5c1a3efb75befff40774022fd74835abe23fae37c03f49", + "public": "03f5e7d8028debaee9b5f29b2196c652cc7dbeb05f6dfd2ff19e1a7934febac699" + }, + { + "address": "J2Lu6gP8zXyq6EjayWtV8cDmdi6M73Jn5B", + "bitcoin_address": "1Nt14VDfHJa6jGLsLuZ8qmzRn5jWNcpDFz", + "secret": "4f82d68560df1e74999982c4087955f02eadadce6502054ec431a2a2958c27d5", + "public": "038494fb1ea6767a31005b3e2018500644fe5f9229d1facc6d3cbd086c1434a120" + }, + { + "address": "kXVPezUrC5jjzS1bcVEUgaXfqqPYpPG3jQ", + "bitcoin_address": "19WGgiNKxusUDrVW9SoHaX2BmJjMgrgFAy", + "secret": "72b9f75282bcfaf7c3e468f7a090bb3322ea4dceb96449a0e02d25826e242dcb", + "public": "0335224bb5460f92b2afc546fac694cc6af797543dbddc491235fe9469c269b5a8" + }, + { + "address": "sfBsXAZBz5VynyFGyEx1TA1EVA2SNS4Q3S", + "bitcoin_address": "1AznjSztpC86VLxy7MciB6yJgASP1ibFTo", + "secret": "599c05c64d67fbf675b01219f15e82a4837acdefa30d714a7d9162550604ed51", + "public": "025eef68fc3790f499996747cf941398c8f90f57a47d8ec93cccbea84081b51058" + }, + { + "address": "2Q6guBQ4Mota7bUYx2TD3xwWd9oMRScu8q4", + "bitcoin_address": "17PSuaCAe3EX5Q2XU2L7jWf7m6TgX4F6bc", + "secret": "34378458342db0df22be23ec49aa0f0e911900447c6c7f8ee2e69b79d6e9d309", + "public": "029cb1684854b84198bc61cc8fd7f42d39d259912c6f7e65d228bef8846433720f" + }, + { + "address": "9DqzJkWCWK5kCVaqY1cXszUtNdwvNZJSJd", + "bitcoin_address": "12VwnAGLGnzqfxAozhvVwcamYoKLFeLeYV", + "secret": "e381d7d02fc85b55ef129e13a10d5e7980bf88ecb631d55a9564085b6955f7cb", + "public": "033005b5aac2fdba5442c2d30adf6bac3bef6989b8f71530c91a28a7fe76908a78" + }, + { + "address": "CitkJhr47JTB2gTQhwcYXBsJrxLiHqixK4", + "bitcoin_address": "1EGkZS1MHQWCnriyF7hcEv1xYfajKXuAYw", + "secret": "7c776045c28bc10641f50461d4e985d6f28687f01a6635fb52406e2c073837b4", + "public": "0251c6fff14db8af2f982a840921ab6b228bab890ffcb2047ca9999029aa26f068" + }, + { + "address": "vFUe7fcmLXGhF2fKRF8zfWCLUujDEgLVAn", + "bitcoin_address": "1LcK3kxj8BXaNERHAzHgMpJ4UkYktArkjY", + "secret": "f643dfd7a3fa2b46e5ea2ec8d63e1fa81aa0124f24cec7902b55e8090f354867", + "public": "03cd6e4e5cc5779262e293938773a1fe3537e8bd0da18f8353a002c516a491a364" + }, + { + "address": "bNM3CoJCTquonnV3fGAHSHjkXU4VVXAtnm", + "bitcoin_address": "19SDZos7b3sy4eo3Er1mJCMgt1ombCpnXF", + "secret": "b1303503a813b58803536d68466a197b1bb3a101ec9a1bf8fbd2369d49b364db", + "public": "02a1e47b9d9f2438582fb53aeb049c715b7a061ec5f5ff0a4390a27c1c9fb5daee" + }, + { + "address": "2BDGGpDt5TeQqtxJiwCsYfUqSH3RnDaJvrT", + "bitcoin_address": "16JgK6bvczAJ33hGj8JiT1hRtXV6tKYhkz", + "secret": "62ae0cb5fb989bac7245e194d13deb83bbe7997b316a13b384afaab7d8160c27", + "public": "02285851f4a07f8247d0e718dfc9ba3c0739eb0384025bd1088e5b2fc5075cb544" + }, + { + "address": "WPP7JbSpJbHy13p3tAtSxFgKg15tna37nz", + "bitcoin_address": "13nAsEPZDyyZsTShPoKDznQbGFxhnd6SGz", + "secret": "81158f1ca73b5b92e88e35864c2cc32a7e6dc4aa1dc69549b69488be0f939210", + "public": "0399c5c339ea989ac64e6c0b8c46088241e654ea12be19055b0f3602185f59113c" + }, + { + "address": "CLWUkduHRQ3VDqWCtLPu73CWRuyYRcywUh", + "bitcoin_address": "1NaZRwzGkXGXmKizewH6oveuF2Gk4FNV9n", + "secret": "a2e2f95581ae88117371cbae30bfe82ab85b16ab30ee792c99815515f4b03144", + "public": "021025967d1d2d7cd6bae8259ade3dbec5c5c7340f7cc96ef9faa98a4e8e89356b" + }, + { + "address": "2hsch7LCnK94zgFRBbL6N5nSwHHoZLv55iY", + "bitcoin_address": "1EMUGB1o13oyghChb6cdfzp3zuL8H4FK7a", + "secret": "919e0a2d7d8f4ebb28bb9f8f4725433850e5e3d3ec90ba4f2b8bed56b736b095", + "public": "021da1eacfee5cf2ad3c323953c8ee5be4ef8ee23fb2abe88b2cb4114c24402ac1" + }, + { + "address": "GJLtCoZnL4di3kHwvkJtR8CW92iN8Vjmcv", + "bitcoin_address": "17KbsfZzrFL7BvLqvNv2R5DiLzcppchR8c", + "secret": "e7102c8e401b2d30627764d44d7233d37ad7f5e83f935499581c4118e7c3e545", + "public": "0297dd6e1b2b55a29022578bcb8f2a97c4ebd1f04e14004c83742948baf15db34a" + }, + { + "address": "dF5jq7t2pMQJbacvfPFbxbiTRYi8dt8Mh2", + "bitcoin_address": "18ghfSG4kbbB4XVEbThxjgpjq1MtA8kcsc", + "secret": "aa520684df5e3db05607e59f3e1a039348113fa32f844473c5a3b5be8cba448b", + "public": "039230da7d6b4324dbab6315c9268dec4c913e9eb2fc2cc59daf29e2195ba0c0fb" + }, + { + "address": "W1DHb2MP4dfnLYgS7YmTGrwT3jGkyYzTaV", + "bitcoin_address": "1LJyrppAWTUEZRiTAPX6yVomcG2dH7mNw1", + "secret": "4dc879f1a4d782bfcd3921714deb2371da5df3b2f46537283ccbfe919a21ee3f", + "public": "02a1596f4f937a01189f494ed81fb8354101e1c5f633d34ab6e6b189c99bfd5d95" + }, + { + "address": "14Dzj9AmYcmqHADtmZaiaGAAYPTJF5iu3Q", + "bitcoin_address": "1QDzbnawkZKos1pvrxT3ggVr5FS7436Zga", + "secret": "3179eab44f64ab0e35f3b4842112eb6cbb18ccba16b7668866adcda6ddac4882", + "public": "0395997101d2d8ca8ab15058f8e465d4b87a422ab825aaa8616dc62373f01c81ec" + }, + { + "address": "Qt3q3oPi1HN4v6iPj3EbfaaV9kMU6Qb9hh", + "bitcoin_address": "1EzwZ8xDFtG2URCVnFrnBZqA3e9gtvttd4", + "secret": "ea350bd2044b3a9352393f5169c3881d8146a5577da478c0e2185b56d7e84e59", + "public": "028959d6882142bb5dec9fdd5b4a2c93b2762df2923598e056622b899ed332f062" + }, + { + "address": "2LdwMr8hZ7MeQ6uS5e89Jwq3KjqvWQguXpN", + "bitcoin_address": "1MWkWKQWFiwJJcDPXzQgPBWCM7M7c9exW4", + "secret": "2e145d25d59f1e5314ba3f290a81ccd6d71dfe6b998352688dda120aafeb2b4c", + "public": "02e0a927394aa47473cf544a5ef5a21985d14204adb5e1bea315096f41d5d38307" + }, + { + "address": "6z7d9KEtvBw8q2VZqz7PBSwHaCAYD9SBiz", + "bitcoin_address": "1EhFVjtJp6ZNPfP8SydM536oNkiT7Bmzs5", + "secret": "ec9dc327f748b8a02b7b931d761e41f9406fa1ef637113acfea60a395f07f703", + "public": "03610bf697e09ce02f54c830792678c008542d19fca2e625706fada2eb5012a3a8" + }, + { + "address": "SeECPVtog2nqdBuhCASpu5GFW7kAQ2aWse", + "bitcoin_address": "1PjnkyeEoJEJm9JtHk3y2MhkUuP21Pb6o7", + "secret": "45cf169176971687dd96d56d544dd4739b3c3c7b24eef38e2b2eec449259fa09", + "public": "02f2ecfb3e58709626fdc9de870bb11d8a5ada1b5088af73b0d49ee2397ebdadfc" + }, + { + "address": "2RfMB8P2jTG5dLcrLus4CTZZH6mke47G1yF", + "bitcoin_address": "1QBQoZjgwpk8sEfdE79yvJBiEWsAoqFV6i", + "secret": "72082e472815e974af51c5ca2611dbd65be5d498305616aeff0e21845eb2f6fb", + "public": "022736c896b113689d8891ee1dadd6e90a357d25143199202223637127c1c082be" + }, + { + "address": "jsHspZyTeoWLQ5R3GAXPDmMdXiWMos8Lfr", + "bitcoin_address": "1CfVo27cxanhQum3M8MZkBga17F5E7fx4", + "secret": "d3b02aa4038b4c0a71588a45d9f75a670c35e28c600cee1d2de7d2a04bdb720f", + "public": "03a2ddc1d41e53f6b73967a1b47a6928be2bd29a3c0729a267d71ef8df83b4a05f" + }, + { + "address": "25CSv2NqfsHSodz2cRueFGwAbdzUiuHHLxb", + "bitcoin_address": "17VxLQZsgBMTc1qRxQZxNmPTff2agkvhff", + "secret": "f556a089f138f59e3000571593b7f9559c1f546b5f9d1f475bcf6768611c9baa", + "public": "0305705d3549479c977fed1227e84c0bb1e349c6fa2374e4f8931c7592f1e980d5" + }, + { + "address": "2SitgCMQcxkiCF9Jf4pACRa5H5z1Y78BQ87", + "bitcoin_address": "15x55PD5V4NJjrNuB66Q6wJ8xr6cgzoUtA", + "secret": "219e289fee89a7afeb2fc1316e8399953bf879f607cbebab264bbe1927cf7527", + "public": "027a4480740e264da975b95df8333c4877180c546e26cd4ef280de97822491b479" + }, + { + "address": "Gr1aAJwLcHgR2bumhPAyS9en2VnRFZz278", + "bitcoin_address": "1D45eix9i8FzgpiAU4kaS2Q5dJgCxfnbjQ", + "secret": "9980f094f2582e0810ce8cbf488c44d68ed60f6a45b94d4a5a56f4dd95ee0954", + "public": "02554006809341e915b01dc0e9687efab3f00b274b47bb61febfb2b5898128b95b" + }, + { + "address": "22k2EBqKnNRAbuGRdSCoL9EkrfvocHs2w8j", + "bitcoin_address": "1L6RCuysZu71YC5SFzXzvdHToSHZJarrUY", + "secret": "8382c706a7533cff4bca93e5dd7428eef94df089461c3fb11c9dc9a0ee3b4bd6", + "public": "023f7dc5cbc6164735acf1e0abab395d99a41fb4ed26056be2f7844c31a03c48f4" + }, + { + "address": "N31RqZUYjL4e4VFFR14rtN7DqgrnZwqbC3", + "bitcoin_address": "17rCqiZHG398jnk5bficqiD7XLL338VFre", + "secret": "2b6c4d56af2d787de889eaad0d97a07f209851a2b6589edf5a1c7a3a4f33e09f", + "public": "0312eccb8c1542b4c5d108538da52ddc5850175df7a7de3b1398155614e792cc7e" + }, + { + "address": "9Pkybqiwz1EmDy2b9L9Nkc88mc6zvPRsWT", + "bitcoin_address": "15JjSXrQvxAzFUJvDBLmJTptq14Fwa5rTw", + "secret": "1c055ba9e77726033ebfe32237bd425a140110549d82e2311d086bb48af1608c", + "public": "035304c818e2c5c93aa671d150ec763a193064d9cd95d8711254a77c8995e3f52f" + }, + { + "address": "BKvj6kmqdx2j35qJdJ5DPAKjJR8vzLU9q9", + "bitcoin_address": "1H2GDLHWeRQxfwE8L64sGXgxtNFDC5SQSz", + "secret": "30130b623de1c08e1cb7ad95a1dd87a3a321f402b9712229e6ce62b7e1efc501", + "public": "026878a7175b2fc3d0ef5a458079eeb1b63d1a63505ac71fa0667239efb3a348da" + }, + { + "address": "RFR4UhmnBPFZb5sg7zyQrr3Jw4So1u7tmv", + "bitcoin_address": "15EbenUbT7unxDV32sPJ1BfPjMck9rt14b", + "secret": "bb50fcc6980cdcd78fb3e58dd73b9a0adf6fc4539c7e56b8af9f04437f740b10", + "public": "034aac6f55a6ec5e87ace89ae7823b04ef43851316eb3bf85b52a783cb9f97927a" + }, + { + "address": "2W81p8QoSnMKvTdnBqb91J2aucdtjwVNUFo", + "bitcoin_address": "1P2xqxJppxnYcvKNQFQkfXADNNceGoAXHd", + "secret": "b3e1914296ef75748cc4cc7772880186b0ea31afea9f36a92836c3d03d66b28b", + "public": "03d9677912768e36ebab0aecb6849c9e09b161e689521bb93e3cfd5687d5eea42b" + }, + { + "address": "rLjhyJVYUrqpgimkycfCdPfi77GGTerroe", + "bitcoin_address": "1EpZ2fRe21JQ6aU7j7B8fqgkUfX9xAKBzo", + "secret": "192af09cc5032ee7dc03652c72ef0936efc1a413eb74c3b98acb50ccac9a97a8", + "public": "032eb1861040be977bd41a7ddfb8230e6d9f0ecc53b43dc6bfe3f873455011ac45" + }, + { + "address": "2GahVFLmUyYWycDo9eXvq51ekc32VgxKwRs", + "bitcoin_address": "1LL4bN8fA4YrjzRA9VKAVw5GN68GbfvtoG", + "secret": "536ee03f10031d63eb4c1f4433598dfa587a9edf031c162770eb76ea300b2410", + "public": "02be4a70bcb626976057df5e8a87f2727c6dc6dec80c1a5aa63e14d14a606387ac" + }, + { + "address": "23CNqwuhjigvmeGq1MABeYoTceo6PMFndun", + "bitcoin_address": "187EcBQBPBCe1VoJystqpV1DwQQBfQzcyW", + "secret": "89a4c39206bfe84ee531233692ec4d7da526f15e24fe66b06c0f539920620f87", + "public": "028b954910c22532fc7a3af3b5b3b03460209711c048c19d46e756312c06f6bf44" + }, + { + "address": "2M7tTKyESdcKE66Q4gJpvbDGAxryCM2MfjF", + "bitcoin_address": "1MjZa77ru58aGi4nBKbufRqNPZ99cSsUKh", + "secret": "72c021662645cc9b8b2177ad62e0f5211ade182742976a8fbbea55a44c26dba4", + "public": "031bfaf003af08ef951f3ce58096fb09eeb6935b6e3e7e5a230b70c963652f9d40" + }, + { + "address": "2A8vRNeRFyB423goYsfaf2XJfFnwLVBEogG", + "bitcoin_address": "1CchGYaf9DVSomnUUNGs6UTgmmAXpQNTaz", + "secret": "3f193e4554fd7e6755b017b7db495c2d290351cb65ef3cce34c69e340cfaf177", + "public": "030b4d89c711efc08d9392c4cfa106bc1313c478826453fdcbc115d69866a6d896" + }, + { + "address": "2QRYen7D9tDdLeJD5bXuKfuYKBbo23o4ABo", + "bitcoin_address": "1AHgVNAhEB4QA5oPC3ESC4E4Z3kUFTGjCq", + "secret": "69da90dc5871fc04146acf8a1e4121de64e55b97e1629cee8d0bba6b464f6a8d", + "public": "0203ffa8dfeb26dda72992ef3d4126c989651cd6279d4e738110296ab9b90b2515" + }, + { + "address": "2SkcSFj97J2BQU5hd4QTm5onBeXiwRsVtmd", + "bitcoin_address": "13cjEmSxqGo4fFupSFxoAP6NEbH2rZydqk", + "secret": "3d3e5bbba89085b9f3925abf1a892d4e6be4f459e935e05a71ad04ea88fe6ddc", + "public": "03c1cafc2eae3d0f3b109f942234d1fd83489e040373477dba9e27a801b3bd6588" + }, + { + "address": "fA4ByNSX3amgkeVF3ZFQ44gAsDybhD1urU", + "bitcoin_address": "1BuuCW76UBVeYdm1CC5SQocAkomvpVv6Zv", + "secret": "68a10f706545aa984a8df888700d822793d8ddf9c1999e329ea6a579bbc33175", + "public": "02cd9aaccfabadcc58ae9612cc034054595a8004401c05b314121a4d83fd966339" + }, + { + "address": "2m6BdfcCCGxbSXELzBjGNnAMxPoej35TLwt", + "bitcoin_address": "1KNgk4fZMycncrxMhgTSWYPwhTgtNBs3jm", + "secret": "bafb45146ecd2536e463c08c6b3b18534dff04f03d2a2828c889792b83b2b6b7", + "public": "039ae122d8357f4d6053be5d29a3d9ea72926c6c3fe6b586179fb11808e561c0b9" + }, + { + "address": "f9hJHRytfpoEa8B4BpNs8gvT1unMjvTFpf", + "bitcoin_address": "15muvQd7PyVJPU8oyiB9HRjUBprz7P8SSX", + "secret": "ed643cc27ce09053207c7b8eacb7ab98cff341217f2d398dc80728ba3dbc319a", + "public": "029e91944afc94461da0b314b75f07e1aca7de0af053329bf9eca191f5e9480471" + }, + { + "address": "26F9aPSV1mHR2wmqWtiY2FdXwiZG6GC1WxZ", + "bitcoin_address": "1FwrmfajDWfK1FqBVz2oMZinzQE9PSTpmq", + "secret": "5207daceea9d884ed6e35ce719fbb356a33d6a2013e1d1159d021da4cbc4ebf1", + "public": "03d41debc510d99b3be9a3fd290ed44cb6edbd4c94fd6e18cef6faacaf8a931e1f" + }, + { + "address": "62mX2aD2aDNfh5zCrrLAyw5bPPoVtsmsaS", + "bitcoin_address": "17Hno7wUxD3rVeQzDKqGAZvXHSZGTyqD2s", + "secret": "c702c01d2a48e072f21d811535ec30edf8d1940957ec61bca0082e3959f6b2fe", + "public": "03b1daa11a074fee7dda44270d842753c49eb916c19066e85bf5bd0608409060aa" + }, + { + "address": "QroU1WomNFwEpKNooGfSVqJhaPepn82jx7", + "bitcoin_address": "1nzZLpwzmvqqmLXY6QMg1yteQpwjLz8Ef", + "secret": "21e0c30a0af7930ebbab4de7723849b2c712c670d8caa66c7a600c44774b1f30", + "public": "0379bef14165a6c65fc2bd41d11077d25fd4701afffb0e3203422cdc85d0cd2b88" + }, + { + "address": "B2qurPj5Vosgdb3vMF9tNSbzvCwQvZT6Vt", + "bitcoin_address": "1ALM3q3UzGhyu5XfdYeb1od4eMBMhLnksD", + "secret": "67538ed445290e3552443d4b0b5def55ce9e14127055b89ca1a58a21589896e7", + "public": "0374a42e90a4336a0c7147d624f69070ac3ad046a3c2540fac75d874a518f2ef6e" + }, + { + "address": "rKR2aYWXsKdPe7TfeLCKpC99zZe9KrTjMK", + "bitcoin_address": "1A5bMdW3iTzrGoFiWqoZHFmTTsqo9V4dgu", + "secret": "4249267d631619da0bcbb7296779c2c74df42c3a21e7fb0241e9e45ebdf31bef", + "public": "03d0abd9eeb44e08e9e57f2c750657113eca20b16bf0ad63c46834bf526b9c7067" + }, + { + "address": "2fH2mNcRGcwTqUhi6yBhieXGuU45AiR1rSA", + "bitcoin_address": "17YVZveUvUScfcdSxpnQUBr64CL7VT6qUq", + "secret": "c1bbea6cb9ae73181b273c5f5bd7918b4c28d0e3902efe8eefa837a03c8b6f61", + "public": "03289894de48c672ca592a35fd083859bbb1d991d77cfef8d20b0fed1159e80e3b" + }, + { + "address": "61w9ZrrWmSXprKv87Nt4QRVf7vy6xZxx3S", + "bitcoin_address": "12V4VPDFgJpwspsnW2QzmY28hv7v93LMyC", + "secret": "9473ca381c03ece2f1895ca34c58ebd8ecfd6469e486d8e15baff9badbb8798c", + "public": "03095b664426e488732806e0c08b4b7e5cd49a2653c029eee6931b93cb361130e4" + }, + { + "address": "EiRhqw7RKPTSwmkEUzmWTB9anAfxB2u3HT", + "bitcoin_address": "1JG7rDuS8AoNfBmXj4ouvXrcr8uacT4EnY", + "secret": "847acc35d8932f3f0d2e9fbc57557b949be580e93a7228a4e6b8fb154f448208", + "public": "033f3d37b184bac7eccb3fbe9bb6f3fc1416f7234b8670b67b65f8948e8f8fec16" + }, + { + "address": "2SNQebSnRZUyMKRyEZyemuRZWPiiN4iSUSu", + "bitcoin_address": "1KDr1J8wQ3UzNVVUHFk1wDRZGb7SH8R5NK", + "secret": "b065935a2dc91950e4381a88907ea5bcb081eb9115e88e573c8ee73baa3bdce2", + "public": "030d9f84a7af08f7d8b104113e72e1bf56efa5cf8f9bec50356f442ac71fbcf767" + }, + { + "address": "FuBAryyosutbMmanUFRzJyqwXkwh7kdGEU", + "bitcoin_address": "1QAELtEqS8CNwnixEE2Tat2Gnx4D3X7xkG", + "secret": "0ff066fed0235320963798399f2a8def41aa9700d2f84205f6caa63422ba6dcf", + "public": "0333e807c0be00d228199cb50869176b8d3021e58faf2f3e0403a09bd010216f28" + }, + { + "address": "ovUyGnQCsAFCY4CzfNGPfpBNe4L1yXoPS7", + "bitcoin_address": "1DCgVpSwBDgTsySoAFSdQZ7tqKhGoqNVtw", + "secret": "cab4652334411dc9504f420b936d5ac85a6a50c4bc5245cec04e08898ae6a236", + "public": "030ef30e7219e020b9f9e77240fed42739b5b47063373b8e5fa2a4cd19cab80d9c" + }, + { + "address": "z8EFc9WUA6Z4PnWDHC1rcby6mMxR6yq8uj", + "bitcoin_address": "1Hu7y3Wrv6JFzE3D97Bc9kobZA4sCM7Xii", + "secret": "396b40376a1f66fe79b8050d8c2b7fd72c5442429cea1de9c3e9b7b10b93c36c", + "public": "032194941eefbd5480556832f47fc9495f2dd4daee52153fe4bca687f13e102c54" + }, + { + "address": "2cgrysvL5TgPD3Zo1bQ7atHePjU7pBbi5HM", + "bitcoin_address": "1NVS8oFV9KaUnmZGrZPvWkhQiWHt8veWCM", + "secret": "66dd774702819987b97c150b2baef6ca69d7fa77b474ae6b827b434a4a22190e", + "public": "02e84cfcfbaae65066fc96271c87c2a74f6af8870cd5f90b19003abb2695bceef0" + }, + { + "address": "CBC3XTB4jQeeQiw1K25MBVy665AmN7ndcS", + "bitcoin_address": "18ncsWjDezvm59ysE6cW1E7xa6Vj6ge4d8", + "secret": "dec7e76355a27ffaaf7d706091b3321a877bff8acd255fda5a34a21819b413c0", + "public": "02c7e48a9e20852a8e25ea0670ac9a320c682d4a2f1602c1ff4b00e00bde283e91" + }, + { + "address": "x8Amv5taKJPoBogmVgNJjtyddz21hYeGzY", + "bitcoin_address": "1JyGLBsWTRWVTrJL4yf39iVoGCFNonEk53", + "secret": "a11279a7533f382fe1c4797a35ca4c8e62577de9d32be5002037abb63c917937", + "public": "037d4322a6cedd200aeb6403700b5f723b8a4aea1f922527657572ae7da751dc8f" + }, + { + "address": "2f5JG9tVG1eJsCV6MiSAXXn9z2qLu1WwPBZ", + "bitcoin_address": "1G4uhdgiFq25wrpY4R3E3XDxdLeXRQADak", + "secret": "63cb1ce295c72df8d9a5cdf619aaab3f6531a6f8f428fb61676f319f6443b1ba", + "public": "028e3738fa11f56333e6c6319de2acc192d998767100b079dec938c66c33447d10" + }, + { + "address": "2YnwtL7Eax6ALym5ZhtbZc5mVi69SAQa7qW", + "bitcoin_address": "1KFXWL2CQGV8CSrxH3tTMvRCRZAiV6AjPs", + "secret": "fabc193d52d4bf936067eadd28c936e7c4bbf5b65bdf904e00cc80e7aad8aec4", + "public": "037e8be0c5076b7b7d9aafcbbeb1deaa872bde340171362dca6a32595c08a71501" + }, + { + "address": "n8VxbBynsNFRjMpjx2PoyCsqCobNd3tTGy", + "bitcoin_address": "1EZRumeL2ieY94vBmbZcYrpznKcD7epLER", + "secret": "d3b704c0fa85c62df383ef4c5d691920cb56f8a2eb0c676662349f592b2fda35", + "public": "0223c0bdc26f80f6b8689286475a1f6a1462b3f763368c8926681dc212e8a49d37" + }, + { + "address": "2GcfeP65kgZJsQxgjTnAbUDNXUX5pMS6qwA", + "bitcoin_address": "1EuYWuVbq4XuSYu9Lw53cHTq1SaAekjNLD", + "secret": "3084c64edd34f827750497f7ae3c432484bc86ec1ee03c236c83c10c2189100f", + "public": "02cd4aed33c68c2380060d807b2eae38c8460bcb494a68882b3560e5e917808150" + }, + { + "address": "SC23LSoVTHMLfdsy1dZA4ysYzLWYwLe3VW", + "bitcoin_address": "17dKC4oDjtLNG9jSEYzc4Sa32sXHGMFS11", + "secret": "04c3536aec2531dbab08bd614adfd9839150b82b8f15cb7a7228b04171cf9310", + "public": "0357e08cbc0fae044ee6109394bb70675c05effee3d0bc76c95cd1f3814498dcb2" + }, + { + "address": "2mBQma7LZa74M3WFJCws6dwZKn3YQBMg6rA", + "bitcoin_address": "1NWsAKS472TnSsR7P5W1r8n5PzECDWbMKS", + "secret": "aa5e825ace5471708b05f3f50929c180f85e8cc19db9975bc02934a3e0469cd2", + "public": "03474646c2920067a9fe223c1ba7411afe48327370afa1298fdf08b8077d9ee19e" + }, + { + "address": "2FxdQDCLe7c1mhtKGJEnj5sTmcyoEuQwit4", + "bitcoin_address": "1K7zr65GSdnLBnHUqtWbK7EepsMS8tr6mQ", + "secret": "5732ba0920c7688da18a7d2313c982cb4f05de6c8f8cd953b57883c64d19d01f", + "public": "020bd054f35df3619681e88b8f5b1e02d16e92136067ea29d0e944065bc17febe8" + }, + { + "address": "opjMWDaZnfGytaigCzDS1WZcMRCZQEvDSh", + "bitcoin_address": "12moK5FPkrYiFP4dSvV1jgAvFxbLtGSYnD", + "secret": "960c1024d6b803bb61d729f56edaca88bebd8dd25d611cd90f8c1553d72cc23f", + "public": "02c6ca3390d4ca5b9f9d8ffa81f217438b371505f7943f1b821ccaf267502896c7" + }, + { + "address": "287avDBot4sKcLa6uVHX6CEActGrW5z9W8J", + "bitcoin_address": "1ARhCyyrn69uRSLXtngtPzjgzgYvA6GRyw", + "secret": "0b7f4c468e9b57a69e7af6887e055ff0bc9b6c0dbd236c738b8d83e515eba25d", + "public": "0297142932f8df1b0e6def85fad14db4f5e99cc34a2bdaf9e1d4d94d5d43ff09b6" + }, + { + "address": "VDkbYkMPHKbXHs3hLyh4XC5ohQVUeyhw91", + "bitcoin_address": "1AoKxJWmoMqnRJwy2oz6uQhyEPufySDnpj", + "secret": "92e524d5eaeea948e6d5562488d971f0e4dc45d2a5f94dd4af7191bb91b93fb6", + "public": "02a5d4694d6485b3b9bc18e875d04773fd35eb4bd68cfa10bcc6e9348b5c845965" + }, + { + "address": "mAtUfYshMbtEJzjuKYcU2t6T3dZe4y2khb", + "bitcoin_address": "12QK53M8vARSrx7bFmmgcqUb9RQ8dkeVcP", + "secret": "c553186bcc8b7b6da5dcff3f522153b6a5af4df9e358f028e3fab1b02d7a7dd9", + "public": "039a29f469d54ff46f32bc5f246aa5c3714480304984e3232b723838c4d06dad0a" + }, + { + "address": "2NAdsgf4ZJJt5mFNw8at8hCR5RMQDNzwiwJ", + "bitcoin_address": "1L6effjU4hnh1XiAENiNKfLC3qNSpbUB7B", + "secret": "652f9b2e81b4882b0a3ed0acad1870f906c47b741f3264e9437578270a77fd6f", + "public": "0224d49247228129e7e7ac57aa56be2d2a318dc57841975d5d11400ec226101326" + }, + { + "address": "vcGe4piafnmA7HooScfnaPoMeAUzkGV2es", + "bitcoin_address": "1X5EkNQjFM3kdfZxmRnZEaxX8MmVzngvm", + "secret": "3d36f0ff8d896a4e29ee908c90269ef4da1950f5d43d709d46ebef82b42ec902", + "public": "0232b6196f9a91a97bcef66cefd06ced834b6e57962915762b7f3d93347eb7512a" + }, + { + "address": "TU2RS7a9ZDUuj1X7fTBXhqo9jJpa5wRGEh", + "bitcoin_address": "1L5XzGGUi5iw3unpdrLSJXByWckFHzNrKA", + "secret": "3404371d8a927f2b948ad1050a085d8c152051e6ee97aedb77c44ed3f6c0a86b", + "public": "029b1d98a32c56d68abb0c7b74f5508b4b0cbb23ffe2d6c53e7859c8fc047ac16f" + }, + { + "address": "2d7H8CquSYs2nin9jaZ13hGZta5FsStFZo8", + "bitcoin_address": "17N9cCbZFEjuopQRYcHmp7dpVjGjrQjy65", + "secret": "5039e52f7321bfa5b97ea5b6bc585df9e54d5e5d1a27758135cc842b65898882", + "public": "03e9ea87ac0e016f2fe8b789bbfa4a941c3cfcfdbadae82c4c5fdb13b5ba7389f7" + }, + { + "address": "AvV5YY5QUnFLLSJMKhu9DsuxxrZt5wpvdQ", + "bitcoin_address": "1Dt6WBYotbNB2FTPe8RP6Vpj7Nw2qyE2gc", + "secret": "a75da19d2e65a262e1a3560376e2d292a741f3a4b679fc3b86a6f342c41f7595", + "public": "03388b89a69105f3fbad86cff7edbbda8c7a6b65f670bd1ea65c1bd29ab8927794" + }, + { + "address": "ZnvGRWPCyM8BVpFWNMwAuNJu3W9Qu4EcjM", + "bitcoin_address": "1NgXA9Z7jYk6rhecxNVmZTwfbcWCHzAdFK", + "secret": "b36e756f2985b372c860d9c8ee82d701446a99df55369a09d9245cebffb7f6fc", + "public": "03211ffaccb7fc6be9ec8dfca941bd18a24834ce783071324e7797167966c169dd" + }, + { + "address": "qoVWHHmz3cst7ejrDs5Ak1veNqXvc6bKNs", + "bitcoin_address": "17YWajL6QKp8zcq3pPVVqveA4Kqk5AQdx", + "secret": "6d9ba763e4b5ece32546a46271be8024627663f8a05eb90cf7ff10aad43bb0b4", + "public": "03ae2573c7cac526eed1b7ea204d98b57b905ccfa565317562903238d9047318b6" + }, + { + "address": "27WSr8SckJGeSd9wZeuWmEXhkwZagupQBhQ", + "bitcoin_address": "1cKCM9VMiLrXyBwMWRdMnGU8dq8zKxcef", + "secret": "0eed689ddc8783a2d7405b3c7b727f5e283adf51a79c00633e06f4d7af69ea71", + "public": "03e01b17ede565155704d1d38b169772189c572f3d8daf7217bf10cfdec744f00e" + }, + { + "address": "jfHgeppkfWrLrfLDefT1ubVcX8CZtEHrxd", + "bitcoin_address": "12tLeB1kzBmNgvmSTzMtghuDNhB26nKCa4", + "secret": "ac6093af30358cd772157c99144ca77b8b51374d4d42d16ff4c044a79f659d1b", + "public": "0244bb127e905e68ac4f77a02d36f8bd43a180fdfda205c5dde80c216027fe5d3d" + }, + { + "address": "7kUKMbna5G2BnYdRaUNguDcRxZqU4DJE5Y", + "bitcoin_address": "13QeXUqhUK4e12koLxVS3zfbUbRf42j4Vj", + "secret": "aeb2ba2cd9a26758c46ff42fdd59fa2e109a57a2a7e0b6a71cd929cfb7d3c734", + "public": "02020ceac637c2e0a627a5b495991925432b2f38b278a39972c6ae3e77b5cf72dd" + }, + { + "address": "uXumjBr72CzvyStXFAcQZ7KyHazCGC7bYF", + "bitcoin_address": "1Jqf3ykjKqHBVExRQmE7ZB89pxnHZtj7Ju", + "secret": "3e1745a1032a59a4f381389fb0371169a87286a29f9d7697d095b5d65cca2457", + "public": "02da2344d15c5d43d19b9f350b1c725c636004934f087b67b240fb44d674344af7" + }, + { + "address": "2cjZgqBybtHQNio2h1hmb8W1VuNHZ9CiJMo", + "bitcoin_address": "1BWG5ECUjunq3LMtFc8g3yEjLAT8UKREsi", + "secret": "866bb52ec8c6e51e52120b64bc42277b0123c5d200ea17d20cf365eb0f343087", + "public": "039391283693aa699e839a7ac00962bc23dbb563882d1b5db5774418a5d16093d4" + }, + { + "address": "2KuhVZmuxygrtPKYXygnzWmrJxyth7aHmHo", + "bitcoin_address": "1NdohSNmwJqWyVuyvjHnT6yXxnzugLVv2E", + "secret": "114e79415b9b6162578bd08983fde25c8708fbc204669e32d244761adf81be6d", + "public": "034f94c72ad911244a5dae6a7d2cafd9e1e88edf87d244fb8478ebfcc607c8b5c0" + }, + { + "address": "9f51KEwdZ2k6fbJKw2No5QcEZfh1FcQT99", + "bitcoin_address": "19igwpqvooHb7UDPum3T2YREc22UhkGFWE", + "secret": "e36c8f6818e4f3a759b1f1c22339cb7a1a560bee4b590270ecde2789990280a1", + "public": "02dec657da3437d526c7bec71d91cbe3ebb9993e7cbb69b5844fe8d02c035a29dc" + }, + { + "address": "CUFdMUnVtSmLtXAC5ktYSSywEaQ9uxUivn", + "bitcoin_address": "1QDa15EVy7LEJwvGQ6MVhzhfZRA9Qem6Av", + "secret": "f8c15fcb6c56e3d1a5f13b02f3d6f3d751c9f113ec3837ac9ca49986e5c79938", + "public": "032e56e60227fdc1c4e7100e1a5bb8853c102efd072f7e3d3b255d98da7645e7ff" + }, + { + "address": "2QVfVHQ7c81vSHQjXwjfueUxmycPXeSoh8p", + "bitcoin_address": "1GW4QVL8BP8LzHPgshrhWtGix9xPAx9wQT", + "secret": "dd71cbe703a2aafbd6e4e9e33d5dd9845d432ca8c16dd0076330cd2aad1ea18a", + "public": "029f3682ffb06648d5ccae4e579920840a162e884cf18ea1c76f7861038d41c715" + }, + { + "address": "2aT8vQA3MncGyw2XfhqisJUuTeL8gt67r7N", + "bitcoin_address": "1BFpLwhgCrdrwGV5YjVkdfgpXkB69vKUC9", + "secret": "6f4002a5258fd36acfca3ffca8f46148788346ba97e290ce1580e3f0e40a67ed", + "public": "039ca89216842186b5d4c3d8824d9a62aa7e6a7258c51fbbde2b7582c6ab3cfd61" + }, + { + "address": "2LjJYUvxEeiuSHdmqa6WriCcrVMUgbYsC4g", + "bitcoin_address": "1D86PFjxWkS7yrWbzHXZjkPJFrCqeGgQrR", + "secret": "9d5b1907abaf169e86622e520f46530b15016a3c56e6473980783eb9e7e3bb1f", + "public": "03d47c7a4ba64efd5ceec1d90370dcb79c4a5792334f2a8fb3f816ab3de0aba6f3" + }, + { + "address": "H8WyRMJiyuttgg7raK3MHvuaP1sYYVt2GR", + "bitcoin_address": "16N8yFeB6mCdttT8Uf6uKMstFyPY5wFkju", + "secret": "d8d258e9d6ac67a32b2bbdb2fe56c753a3d4b2c45370c2081f539c87119db3e8", + "public": "0237505507f545ffb6e5762d3ee5ba7b2dbe03e1cb0b73454538331009dbb06474" + }, + { + "address": "RnvXdAurMy5aeEpGKfanQsphVYXtvPvyws", + "bitcoin_address": "1Nuf9X82iZEZMiQ6aLLuvW6HzmooLj7oAx", + "secret": "b3767d3cb4903870b7c40b50d235366e58fb24c7a2e5ac1607ced94126d308e8", + "public": "02cf83f66d10e315d6d84644682cd792e45cbad330704c7fc8951176c301ce6a09" + }, + { + "address": "2EGguQkd9xNM6rz43bQpPH5SUBbyPCypu2Y", + "bitcoin_address": "1Nc29WpkKqqScnr2hk5W4DByXUL1jM2jpx", + "secret": "544b281008d4de4530b39b3cbfa257b8d6c7df865fadb0f3ff875f0a024f16ad", + "public": "03b2d7195dabc09a3ed2ac92d44436ad57e5150d02be25db571fa2a9db513c72ed" + }, + { + "address": "2Zo7LMedeibm88xHbD6BihxYF9VbxueAsww", + "bitcoin_address": "1GHCjTvW4BFZzSL8GVoCXsK1g9ZpEMAfAD", + "secret": "10cb3fc3bfe1039921b82dd2be1a036ae7d989ac5f1308441e7cb27bfa999706", + "public": "02b69743fab8f7ef1c5572ed9efded6802054e8668c8372a718a1ed231f376e9eb" + }, + { + "address": "Er7xL49Yz8yTdxTHZ2aWF899fZwuBcN2w9", + "bitcoin_address": "1Mx6CuyksMQT68nSUTHZDSgVtEFcLauRfU", + "secret": "ee2dd1b1a27c83e12f78fd0eacb66c0b9ee63f71f49f62f2163cacaf24c96724", + "public": "037c596ce52db6b28e1a9080c0e8d0914768e7f7cb4c1b56ae01437602d91c14bf" + }, + { + "address": "Ssu5YEgifibQKpoPKNZmwPVAKEt6gdqXrS", + "bitcoin_address": "1P97Drm17gpMe5DG79zUfvSFgibzQnu9Su", + "secret": "94c8c227b8cef1971f0c88b79742da648da391682eaaaf72639bfc516024ce14", + "public": "03e6aa8cd03076584a0664a1d61609e20ea12e900eba179c7c0f1c935ae90faf52" + }, + { + "address": "6ZEir4GMrZ9dCu3LjF1txAyKxmHP1Z6B64", + "bitcoin_address": "1P9SEBtiorKHHjxSTrBG8WWwZ126EpiuKY", + "secret": "567c951ab4d83106e0ec0dfcabf84d9d4f553e828a8bf29ba3ebe2c3f2f6a6df", + "public": "026eb292c89a292a5386cf84cc0150b9d246b80e7993b15bdb63ac6ad84ff3ebcb" + }, + { + "address": "uF1CcstJsQwissNWqN6HUzbedUVHeWN919", + "bitcoin_address": "1P2ynsPKYYwX3DSBc5XuHB4MuZrTcoEgcy", + "secret": "3063086d76d5cb9e8a6b5fb1cfe9cb962dec10b02f84b52823ef66a29031b883", + "public": "0374369d1129cb7e0ee36c245f1de5cdce492addf44a3121fadc088aeea218b41c" + }, + { + "address": "LumhVq7XrSSzaV6EcGFcNJa2PRhUw4EvRS", + "bitcoin_address": "15zLYE2xMbJVhA9kvUVEKSD86LYCNnKgr9", + "secret": "b8e85174ad383c1b31cf412e36a8dfc5c7a70be075bb6dbb3f1265c8d45a1716", + "public": "033e763b16e8be84bf728c03a8a842de3e9b668db298e1d7a9a42fcbac397a87b9" + }, + { + "address": "928Epy9MYb3aXiSX3jViUK2quJUHddzm24", + "bitcoin_address": "1EsqG1QsP8Cr91a9pk2tP5BN3pjWgqZ5kF", + "secret": "3b6bf331929bba2a60117ede5aa6e82be42dcb59fec6dfc8b7d56da04229ac15", + "public": "0247c4215f2b6d5b7e9741b229653aebcb9fd407023ce710dfa8a0dcbd6f2061b8" + }, + { + "address": "x6fedkRZ2f3uAFWYuAhMHbwvezuW4YakrZ", + "bitcoin_address": "12J9ccTzUjf7DZpPmmy7kLvSiciAnqqp1i", + "secret": "be633fc2e4797327d173ff4129d17b7f00164cdf4e6bcda36575ed50e733f6be", + "public": "03b73a0b399d47ce4790adee1f5b7cab3beaf7d127ce8137d93fd8dd0589e69fb3" + }, + { + "address": "jzij8bbtnsQMJox9mVxE9Wbt2cZji1av1Q", + "bitcoin_address": "17CaGTQo4892j327pvCtS2WZ6XDzJ2eBL", + "secret": "6c5f2687c2a14db0bdd44e293294da17b6c48cf1a245dec3a724a503ac7d2d20", + "public": "03ea4ff6cc2f3bc601adfad608e0558418bf0982b803bd6c61fab1d5f7082504bb" + }, + { + "address": "24JypXuBsutTE9Au31byi6cgYUVfXDa76Yx", + "bitcoin_address": "1HxFNhvUD97TcpyNtrmdi5K88MobjreZSA", + "secret": "caa801e43715a4080604ab1962a74b6985481a4c42377f5c210b969bae817522", + "public": "02fd5562bea861fec333eddd21a49611e9efaab8e593b7f8898614982e414fa537" + }, + { + "address": "sq1oxMdWKu9y1GqYDQzydUsLsnCaSsgFdV", + "bitcoin_address": "1KVXgxAmNXjZbMabPypMtFfNsb8AP9h94f", + "secret": "115a9ee9d3a969c4c6777347e3047af13158f6b2feb2f96a207fc2bbbe6b989c", + "public": "0357723a1e36cfc4ca932d05aef4ff571a74dd01d72bb21df6a1df2b6dd6634c06" + }, + { + "address": "XF3MJCJf34rbZ71QSmTWzsc2K1EW5zp11L", + "bitcoin_address": "17UjLtHKnyqnhYMGrxQqLBWMqxVqhZh7mo", + "secret": "a15da09058bb45eee32fd2ea2421f1cd9910e1f822355aada7abaf98ac09820d", + "public": "0296785ce0760c05db6e9f81d1650d5dd71a70fe9881039592e91f3ae1f905cf37" + }, + { + "address": "2MuLPu4CtC8rCaGvVXdaFsvZCGEBSFquKyT", + "bitcoin_address": "1k89yL2Xd21CpAo7FsS331ttMZxRhCzWL", + "secret": "c2d06a485140ef111c0df041d019cf7f5f6f2a57a88f98b4818bcd3471fefbf8", + "public": "02d037fa293b9c13d7332fb57873a5c9ef6fd3faec48e2192073e4cecafa383c7f" + }, + { + "address": "2AjTTLFwqFBTv9B4TqEttxgGxd6qdb6Rc95", + "bitcoin_address": "16Km8QNBPrV7cQBysdh3DapXJGtp3LrGqz", + "secret": "00755ec32e300f700b65e584e00d642a7f94b68bac09fa56d9dd52f68367d06c", + "public": "021767b3cb8da064c221e18e5da4aba858c0783253b807cb0e7d3034e2a6971a40" + }, + { + "address": "YVao3N44KWz1gWwFA99SzE4eEWuiNDQa6", + "bitcoin_address": "17uxy2HRojBfQ1JE6My6E1dif8UqsXLbNf", + "secret": "5d419baf49e43360a2db92ff445473ae5369a3854274088447f3b8aaa730e4a1", + "public": "02671cc9348c2b37412f7be7f44cfaf887878faa61ba2977d76a341121ec8543f5" + }, + { + "address": "2B6CQHAyf7hXBdujhdth8m3iXeGKoj1cUy5", + "bitcoin_address": "1GqwLCuHprE6SNC2yj5LysUqo1WnGDvhzh", + "secret": "5ce953dbca541c64186c6cd9be8ea528b4b2e46ca018da86c568eff924bc2950", + "public": "0346f13ae7df82aeacc3f1a0264b7e1d710f09e8464acd68989bd4009d8df44912" + }, + { + "address": "9qNtyuayg8LsLBxwByHFrSo6dMK5okoFVj", + "bitcoin_address": "1NP1k2Bp9N1yHGpJgBMKY6QVKWyDjSWnim", + "secret": "22c33cd73e3c93597e7a30e0e2f7263100dff55d1fbb1cbc28862a4adc01e393", + "public": "039f4e4dcdc790708675a86f89ff79ece90e2d2db6963453bb05639cea1277e0e6" + }, + { + "address": "KEaVf8Zwk9erYrwqYg5vLuTWGDZfFZvzH6", + "bitcoin_address": "1B4eo4N7doKvzoQuKAHgLMQVgXKfJGwuAL", + "secret": "52b2e3d1fe43daef1de9ecc03f26d769d2a585e75caf027dcdd8e9a001de559e", + "public": "02e4ef2ea0fe31a8cacff87eb21d60c54bae50e6e69c725c06dae4851853c1f821" + }, + { + "address": "273HzqvvGsbfqN4DzmLXSHwxoQGvr6h2JDa", + "bitcoin_address": "1GEyYAJytRgzJzQ5xy6syMXh4FLgaWjiMU", + "secret": "76ad5b4e12a5ab1a7b8b229bda86214d00a8c96a48d36ea2b10c7407ce385477", + "public": "0251e9738384fe9bd8c9bcdb49db45b37cb817032ad5e972bbc4e62fe221f6537e" + }, + { + "address": "tCmpCM4QEmcW4KmfyGJHCUGtdpwKM95M36", + "bitcoin_address": "16NKPF5d1LJtdSSYQsprmMvwyEg768DwBQ", + "secret": "430d620b2194fa6ae143bf501ce4c6afa86cf59deff48e94d4a61aa0eac3af84", + "public": "0336454abd9fcfc96d5b9089939265878f0c192beaab0266792496b3547b999624" + }, + { + "address": "2Nr54S79UTeMQai98FHMbytUvoYpVhhTXSA", + "bitcoin_address": "12eEfauFKCHYrcninaWvuWpaRve9oHQ4Jw", + "secret": "302e30106eb4510299016075449887cfe695e7b5bcc64acadd2b9257caaf8307", + "public": "026f54ddb61336452eb33fc82ce2eaa1cb2a1fc463d5061a6437e6a379763d6725" + }, + { + "address": "VETgdwGFKAc417h7jG8AcpDWvVaSvJja3A", + "bitcoin_address": "15wAXSyBUk5MHgqawWv1gkTwAyKzui8R5M", + "secret": "ee896d44fd6a6d9a3c5d54843e1d5e2acdfd8f8b94a89e971af11250b7001ab6", + "public": "0321a92b89701a16780e524564a01b8a8c487927f6be5e5d1e8e503c1db8b6656f" + }, + { + "address": "aDooZkbTToo2zhsthv4DLzy4b2sB1hL72y", + "bitcoin_address": "1c22WrEvcnPFrrySe5abwnTRqNGUX5aPL", + "secret": "5036311405ab856a08752b575c77f9689d034804fd88013cd61ab1ef8ecfdc88", + "public": "0332eabe8dd5ad5bf2df2eed4c194a194688f55d559873362e19879486395404fe" + }, + { + "address": "2TeicjTeiN788NHkpLCYXabcViRYRzyHnS4", + "bitcoin_address": "1PNmq52kFBixzwKr7n5FDsMTaDKAe1YJ6v", + "secret": "0d5615b3585c8039e8111839037d5f278761e3e2516ee747b92a8bdfa8a3042d", + "public": "02e46c9b263f06841bb8df6d05edb7f965272cfd7a84c79a7cc34eca522f3d5aa7" + }, + { + "address": "9gAGvw6ALttV6qsCv9yoHn2duKkvawUMT5", + "bitcoin_address": "1BRbUy6tC4dQZ71BJNcnTkJ3bY8WvUP1hj", + "secret": "4461a0e36f4e178dd98d073e524f6c175c4af13d69e5895ca7d113155b7058b6", + "public": "036d44c748a5f4a0da05e9f08412ac59370fcc1456657c8da02696042b6e549319" + }, + { + "address": "2RymuWexhMxWGqZMK8H7gjcpKHYzJ7KTW3K", + "bitcoin_address": "1F5j24yZMAG4xoo2xqXWb38MaQY5tbecUH", + "secret": "fef98b243643886cd6eaeb4b03718b2583e98a5cd335f7aa145888df0e3e62ac", + "public": "0363f7994223cc65f5c344a5418bedd4fc7ec3f153651fe9babff0e387c07cfdb1" + }, + { + "address": "tRzJDgcGujKjFLvhiP29DwCFcSENXwD8NQ", + "bitcoin_address": "14Sbfo7SrsRfgToGbzrGkD7CTV117BWxmn", + "secret": "c550510324920ebc38c2b3d8f7207b45c72f53146bbe75297f65fda29adefe70", + "public": "03f1c9b77f74670325f9ed5c9144405e227a4ebc19fa2f71f263197cac542f1090" + }, + { + "address": "4fnAyeKwaaFqhL7KpWVk3dXGjTUKkZMWAE", + "bitcoin_address": "17KH58rJ1JtZvhSZLKmSLVkv36QLmPPDGz", + "secret": "adefed215155b9c86cf6b529cdaedeecf54813be2a92b7e25cf3607b635def63", + "public": "02b9ee73048d5e1547f6064c8ef19a40e334c239a0d50e2e7742881abccf4834db" + }, + { + "address": "cUg6C5xPeULFUYAi7k5z825UCFktGr8QHg", + "bitcoin_address": "1BdFqfDMzf6QACebeepWuGHfEjSEpjgvx1", + "secret": "6ece6dd12c75bbc6147091af4ee1eb6b9ca83daa4c8c74fb857dde9a559ff354", + "public": "03ea642b0f6dfe84807c2be013b697e811b056f38854185c0624e509fb115696b9" + }, + { + "address": "vJVpVYYvDY4mA8kdrtuo8W1A1TeyRqou8y", + "bitcoin_address": "1DJwRgEdbkJU5xUXcYAqmCpHMsh5vKhRcs", + "secret": "a1536d32a2a0b53847cfc69a2ac15934c8f4b5d5d3601a7ce683f454c958a9bb", + "public": "031edeb3a15926ab996d39934138f4776c8903cdd2b3373b93464a19352fc0119e" + }, + { + "address": "y8hhvxPjZpinCChM9K2PLDBW4g1av1ZcHE", + "bitcoin_address": "1HP6bXe4f6nHJdBd1hhfohrjPpDLJfPPP8", + "secret": "e29e15da9d8b981d7e511eee9ce4b3320b72eb476a7ea405431b15ebb04e8a9c", + "public": "0220c85610ff73b1eec67c09305d94cf094acdde37396da909de697e6c2a91f9ec" + }, + { + "address": "2mMfN6DGbDSjaUVVkigCvBUvrW2Te1jkWCt", + "bitcoin_address": "1CNZYN2MnhfW6bVNzJLQTsXduLFLjMUod3", + "secret": "8409735d24e573dd2c8b49f9eed1a4b43a92a0b0538fdb1a3453b012b7862c41", + "public": "0203e0317f62b21015090c038e8402cf9f68e90b4f309f848479290fff989ea77c" + }, + { + "address": "2fZZnSM65DF5XKtnNttaVkNBAEky9GNdoEG", + "bitcoin_address": "1HWymkV4HSVfxkDZBpdNobaHiC6E89Aspn", + "secret": "ccc43a9f9b194263c547e8bc7c386513d0aeed9d16747e86ff0be5e70994515b", + "public": "0358b3ce59c1362d05214c30b581fc4571053672e84c4a7bc2a94293f4b3f47c89" + }, + { + "address": "8yh8LN8kFCg3pXqEtzyTKNMwyjNAVDsNVU", + "bitcoin_address": "14F1smGV4d7tbSajzddZ8zq9asbB7ZaMwN", + "secret": "38d2135b506023ea860c37fd7b7744daa81e25f170a746cbcd7dc0ecf54e2415", + "public": "02112e98e0e9c524440a36f77cab80a971369f4e21d9e19492481318ccdc081090" + }, + { + "address": "jkFvb3j5YzTCg1LnEKrUGnjbAQmJqFhHuc", + "bitcoin_address": "1F1wK2o5Rjz5jDK9j41nEVyBJLTRYn3zyj", + "secret": "be596616d27c8e0396ebefdcb1897829bb39a7710b92f17548ae6812cb367b2e", + "public": "02959ca4a318184bc71c8e7df8636fc4d6cb3704386453967972fcece861df57df" + }, + { + "address": "m7QnzaABKgNqx4ekdVLf5SdWGUxVSFgPHP", + "bitcoin_address": "17sds9ESD4mUYD3ZoVdgbygoinMs8zZaJe", + "secret": "d1c9d0827322a843c37fe58d3169d145d5e8477f9714e44ac6575de9f20c5bce", + "public": "022169ceb4f864b4766f7f1c085564f1334a63c6c7611787ea7f80828d9e41671d" + }, + { + "address": "2Db6fRqRY7fkYpdFMp7ik9eSicRHUPcXXuY", + "bitcoin_address": "184aMznPMUiwpBiu3Mtxm8KSorjVTM8GxM", + "secret": "1ca5d69c367a4dd6f7ad4b702825e17fe66a2c0a6e219b03f00f4648598b056d", + "public": "0215e7d934e04d7b12385ffbe6e55b4dd539d4bb45b138396c18c5aa9854562896" + }, + { + "address": "6MiD95xbpTiX85WaezBFMx31qHU2Cy8mGb", + "bitcoin_address": "18yrEkNRSzBHBcBwEbTL4nUJwL7R9ris7Q", + "secret": "cc3e2454363c09febf2940941b07477d226af5ab09d598f57818423586ddc3a7", + "public": "025ed910484ad0d8d837475339882248638efa73f1d96b29ee681b8dd1f3e710bf" + }, + { + "address": "2j3PE1Gnw7dimka8tbe2DWM7nadFtKZDRCi", + "bitcoin_address": "15v3CYiGp1zKpioGNtPYtxhJCbJYWcbrbA", + "secret": "b33249380ad2c5ca60577db005bbf15e24cd260e5dbe06c8da9e877373d79bea", + "public": "02e90a239e782a8dbfbee2aac3d2d729bc45059a80f67ee3d52ce4e24b24a7aeae" + }, + { + "address": "oUmQZvH1kKqfKEhj9EkjPH7mJsDd9PekUH", + "bitcoin_address": "1NbLyu2Tz8gLw9dkguHbGt1arJf9DxUxak", + "secret": "ed2166711c446df7efe1615619a99ae9f9192cd548f28c2d76e0ef224003ea01", + "public": "03f2707b4ce0ab1664b4ec6ca958e9a6ad53de97687b933b11f36309c3ae9463ec" + }, + { + "address": "P381ZTCxZB7XJgTBnv8Je6YdQj5oRCnWrV", + "bitcoin_address": "155bct4ZJVXpEGdfEyVysBeNsnSxGrq9KC", + "secret": "20412f51c1283546151fae13238c8173f71517e839df2399f59d6975d867ba00", + "public": "022fdf6aab50d1c7ba9f07dca660507294c2347e9f0455e9d906a8b76d46232be5" + }, + { + "address": "bvjjm4USaFY153twBg4k11mKKW1SZri7Kr", + "bitcoin_address": "14BYVXuy4tNhpXAmWrf8819bbW3hiKxCbj", + "secret": "9ebc684f04adf27593e3d3862042c867d9e7b93a15486d1b910cd3df01d6f5e1", + "public": "03a26dd8d7c5536fa1ba0b8ea88974a1449796bd7a03613c7a8d0386f634d83605" + }, + { + "address": "SjAB5JX8MngBBmZqHAQv6b4xBf8EU6TUdH", + "bitcoin_address": "17wt1fG9spG8JeGzdNknHBUUtbR7X6i8Hg", + "secret": "ef9391016d560ed1bb76e27712b3eafba14a97d765e3a2c95e4a33c91e3daba7", + "public": "03e7e8262b1b397ef1f5d956b9b4ef46a87670c6e74bb84dd63d649074d6a90d95" + }, + { + "address": "AaowUNsWWGCTSQt8Ubg9t7t66WXgNm8qj6", + "bitcoin_address": "1Bfk1iu5tG6zczSQSDCUK77FUN4SCA4V7k", + "secret": "ce21b58c3a7f7eb5d7c5231a906215a39d13771d903ee07b1bd6ed2175180f68", + "public": "03c5b1e76ad124d9558599a670af3f196aa8380ba2068a3f8fd86b78959553af50" + }, + { + "address": "7M5c2bpc6vChU5LjgSenmEiRxKvFrjdJRm", + "bitcoin_address": "12mhvGJaCis6dpVYAsMnbnxdx2nV2nBGc4", + "secret": "a9b800fd9e55855e3938b2d81b7ef5f38c3ca48f4ff6f16e2a846bc8924daf9e", + "public": "02db984277e99de74db246766d96923d0da2025588bce93b3002f67020bef74a60" + }, + { + "address": "2A5Bu1Ho179P2EyoNcY6iuuweMpnTo6Dszj", + "bitcoin_address": "1KB9xagLRno8W29YAqTx1Fm3yCFMLN4Xwp", + "secret": "916a59a3fb9e8cf7ca8b57e12c479a3bececb4e2cc045b138c30d24193b2907d", + "public": "03f05db64aacd7f1872deade0890c84144ce00e38a5dc07e2880079f8e480a2eab" + }, + { + "address": "25dcnottoLnueHerPbKAhZRmUoXjKHpUTi1", + "bitcoin_address": "1EU5jcmKPkWy49mh2Xq9zmDkm8JXgT2Kwk", + "secret": "787132dcc79020e6037ad2b33708a2ccf0221154be3a53779bb13ac7fff938ab", + "public": "03b740ebcd062875de83f984c37d71f1dbe56b054bb39ac1d1294d52e8cb702d58" + }, + { + "address": "Yez45aeDFBzSDLpLRT4j1ZW6Wu4dH487QH", + "bitcoin_address": "164KhWZku8ALp5BFjAYPTTocW5CjeB98FL", + "secret": "b55fe82dbcab00982ae20bdc5d6d2205132161e91eb4bc80646e5d3e56e26deb", + "public": "024b71d54e31d943a04299bee61abaa0410b665724fddbc02062544521826b66c8" + }, + { + "address": "4wzjraRSLhkmQBfdzPYu9DcLoJCLtg4PjN", + "bitcoin_address": "1E9z7LtRUAvzS9icCUpA7A1WyU7o7tZ9X8", + "secret": "a0297d49a0ac7db02f303fca9e342fde7d3fa9588322a50be65711f3b33125ce", + "public": "0363eb9e525f712ce3549366d42944d9bb11f4489d38f61d30bf319f242f0bfcf6" + }, + { + "address": "PCgs68kierVHr2ZqQKkACJe5uFCaqn4Twa", + "bitcoin_address": "12i9spEqwzTGnVrQjLkdCvr3bjXFQ6oxbq", + "secret": "362097a58bdd050e595df2f2e49ad7be2202eacb5a7bd86c50a9b44c9d10ad73", + "public": "023f74ca7041a7d9f3ac4c524f8686018d8a24a735fbf942b271ceb2eaa840c875" + }, + { + "address": "pJ1EMgaUEpeTSXu1X469gtXhjd6RvCjNq1", + "bitcoin_address": "18VtPDQFzne7wkgAM57c22BoQPdeYZo8C8", + "secret": "556e1fab62c57725765b5250062b6b9e3d2af8bbdb522255d1304f12047d283e", + "public": "020a6a5ab65ffb60e706fc1febcdbabdee7f8f3f916a2100dcab925cc8ed0b34c0" + }, + { + "address": "PY91kddKVU4mVe2pcM4ZmEvsdP25rFze7J", + "bitcoin_address": "12atBgpg1mDEdqmjYgWzh1NgKS9qRVVLD7", + "secret": "23bfe9afcd904fd9aff9838dfd1edd67b897cc9b2aef6fa5eeff116103887a6a", + "public": "038824148c1b8ecf7848dd3d1acb359423334c5822fc46dba4016da02810d30f74" + }, + { + "address": "2NRQSCu82A61Q3Crm6fMJLUuwEnwMraT2FF", + "bitcoin_address": "1J9ovbS9XXo8mY9jm1oZhkWL5WA3Lm7uwv", + "secret": "c352efce59357fb758de15e09f00e2638b504123212003157a3917e8f41a2e96", + "public": "0202ccfdf6248cab6f045e620789fc7c9eb2a561ff80c2a89f0cd478b15d1576b0" + }, + { + "address": "3RRzhD77qJoXvM6v5D9qxdHfoKjUhnEYhX", + "bitcoin_address": "1HGHaGximnMDxizx8hhGXQwb9DAnQ64Nq9", + "secret": "63c1cb5a1c165c78c847548390a01b8bff6682a1b247373ed6887aed21dc4bb3", + "public": "02d608b2d0df929b6ab7b261f5670d53f406e27b2bcfb00e024dd256c85623b77a" + }, + { + "address": "2d1BVVuCTEhTxdKfKJnRYB1QZvAZQnzKqKb", + "bitcoin_address": "1Bp32B1rhN9b8FVtCfe5X8z76atKnLhSML", + "secret": "c888dc692ac017a6e7937fe04612473ee816f3f35c0a5a099d13adb9af7f7571", + "public": "0219c3f2baf3665dc97ddbeabbfbda43c37f9a797c66623c2d2f991e8b39a99858" + }, + { + "address": "HqZLYWBYACeiSgC3ZugJuq9hwgmDTrDgRN", + "bitcoin_address": "13FuYFhqwCSczFhvPPWDvK9uD7wZVc677A", + "secret": "fd1780ef43c24ede009e36107e15903a29fc150a1581a7844370e440cc922e56", + "public": "021ebef79e0e5afce2d4d4eafb2199cd558507ca1a0ab33556c464b41b020aa5e8" + }, + { + "address": "2cXxCXNXbFx6vF7AyK4Jq4Tn8gvL1tGxjJZ", + "bitcoin_address": "1N98PV4fdYrhoitqZu1LVqiXfV1uQntvuj", + "secret": "fb90dd91878c0a09f823b8142f71f702bbe2cec4319403b37967e17cef6aee0c", + "public": "022491a0e903acf81c62f8e13c2e342905374acc4afe48b8cf8650f269899e5bee" + }, + { + "address": "u1qW96EaRAuxaKWTJT4Uu7v1EEiiDkDbpT", + "bitcoin_address": "1BkMhGPtnR7HaS3mZd3DYU3UYUXDMGTUnC", + "secret": "5a3211ed2aff62a77006ae14b4af4cbece71e3932fe835cab03e7778b42684dc", + "public": "02676a8a39902a79d7057b177552fa7c99ccfeacd8d1ed5f4cef52d20909bdf067" + }, + { + "address": "K5PVBVZjJkg84f83p6A4Bu66NJPJBoVHYp", + "bitcoin_address": "1HtL61PUSuCfpx13CbYFKwFBAT94eJA2tS", + "secret": "1214af921adc1234c210a62675b5c4b962be4708638a67b2c840b950a7da2bc3", + "public": "02ac6ece3449fcaa163302eed3e3dd9293a46457533e4b5f28c137bed59da53e4b" + }, + { + "address": "2Gg92Ak9qtPMmijPb5W6kB8M3S5J41qwJHT", + "bitcoin_address": "1Kg2Ft9a7fLfB1kHfrrri6D2g2itagBz86", + "secret": "7a9d1e7742bca2aeb4a5b1a2bdbb304293477bb14345676a27a2052e5d4ca1f8", + "public": "03eea804e1a66b4b00ab6957a03e07750b9bf716be5deec43642e20549f54af1e6" + }, + { + "address": "CmFiKdFeKorB7hsKCmjhKCw8UScJCfXx5d", + "bitcoin_address": "19HoF6BTQqY6zqUuvxPEXJ286xB5W55C3z", + "secret": "7be562525ad05357770a38a48380a23ee8d1b9b6118ff0d36f1205d3b265727a", + "public": "0316c776b70f4ae4c158e68c3393a68b3f9bc76864c805386e93057fccde70953b" + }, + { + "address": "29tcDz14WSM58YkXMhaPJfiwUtTJDAXt2zn", + "bitcoin_address": "1JHXsH5ifsKEP7kJdbJskzUr7PvsabwE7f", + "secret": "c0bb01bbb159b0bedf44cb7ba6f8d688ba94370daa08bdaaa5b8644b57045758", + "public": "029f5edc881fd9c965626bd57608b3d39cbc03bc12891684bd3545e02e77932c98" + }, + { + "address": "23QXSzuMwpeTpdfag88sM7teo2BC2dEiqUm", + "bitcoin_address": "1HPxtgWEdCGyFuqakqSLU7VYLWYFQzKyMs", + "secret": "34ba38674aef49b33ce5deee37b685e6ebec56f3e1f249c4d9ef6bb5169c775b", + "public": "0242e775c22b176ec52c313fdb2c070c34a1de75b9f5b0aaeb5c4f37858c7541e5" + }, + { + "address": "j2twcqftn4NGiaEKTG8C8EE8ThV5E854NL", + "bitcoin_address": "18M8E4Lixq6r2XyhGSWA9Rdh919mo18tag", + "secret": "646c729eb1df22aef8c1ae4ae5fbc493241b2beffbed8cf80fe29b59c61b5946", + "public": "03ceae5231f5e67bbc1958e45cd8e13861373bd273f8a014c031af845384c26642" + }, + { + "address": "XPNkBF8xkXbFZnwvJs2mGKVtzqbYT1sxMu", + "bitcoin_address": "14K23fz3KbH6KHJbB7CtUp52yeKEtS6sK3", + "secret": "69e76a9701546342dc4a67b4b96d88387113cd0ed03334e76ecfb7f760539b90", + "public": "029dc62e8c891bf8996292dd7b9dbd4f35de762e82ca1e34075aa7772f3bde6340" + }, + { + "address": "2GWkZ9KZZ3tqL5b3WU7bWQBBAPTnoffrRch", + "bitcoin_address": "1JABA47VKnHDaEW2JRC4BvTo3Qs8rBVfya", + "secret": "e8b1495cd299d98bc817123bc3925aa58b43d80fc2e54f2572bce0ebcf890167", + "public": "02763f7a152c2190cabe16a1f29035c6c70b80a3636e5568fa4fdfcfe35094bfae" + }, + { + "address": "DmJHLWMHp5JNCFcpwt3JmxbywjNrne5jEi", + "bitcoin_address": "1AQ1etPSvfEo9qcJuMM9AwGEkJw5Jd7Z6E", + "secret": "8c2f4d83eafc53c13a85ff8035403c61d9e4c17f1453cf87b6be7b0dc6ef9e9b", + "public": "0371288fe9beaa9fc75a63444803969ad821550141e74712e9dbee02b21725875d" + }, + { + "address": "26jmnqf7s3FPRu2wLBqQc5KfbBKrkgtLerT", + "bitcoin_address": "1LEmRgjpB9ES4cQf4fCLLbkkMR1rhTPm15", + "secret": "026406771a4e3b8baf98de0521150c91eb068422d37af2974bfc6ae0d4fdcd50", + "public": "03e47579aced7c10ad1c479e46e13e930b535ac90b628d29d89f6d02a75ce6bf80" + }, + { + "address": "2UUvsfNWQNycy6smEG8c2bMNyCh9qQ9P5EY", + "bitcoin_address": "12Y2WGj6Ln2FrE3M3GhuKQaKbkpz4oizPJ", + "secret": "1814c9a6e012f1b4dabac7e7040adbe519e3e8071c15089b5620d091e3c26cc5", + "public": "020429f24353d0ebf7a17c9acb952df72b6364a010c69d5d98c61ccb462a65b2b5" + }, + { + "address": "haWRgQvuH4MdCSyjAUxzzunVLwNi3vgoj4", + "bitcoin_address": "1MqmRTEgirxhDJ5uPT6nmsftqAFekAHCVU", + "secret": "5ae9f61a0c40f15c178775033192c68581f7dc014a5c7f23b1f8342e853a919d", + "public": "022139698f089264428fe2e194d7ff0138e633f3b21cb39768b9c6f65dfa689eb5" + }, + { + "address": "28wV2r2XHDMdAgriHeYL9Mq1W7TmJufBwp9", + "bitcoin_address": "1NgEfdiHqtfTV6B8Py1so5C9CDfpSNwgh9", + "secret": "bc37955215e69841e42c9881e284fe53eb090598f3f511fed533e3e82478e83a", + "public": "03c2c2c3a698da61e8a3d95744326e1015c1842aa84a091565cd3b235b1d55a16d" + }, + { + "address": "28WhxGF5tSuvWF4D9tSJqp4Tz3dAynY4rkx", + "bitcoin_address": "1K4r9VSGYSyJ7cg3DK9owB9X6ZGnfiSahP", + "secret": "c7666cc0687a4cf835972c65c58f5a395beca834eeb8c7e0db1e87de1ee5ea43", + "public": "03c2ed06a2d7c5ab80d35d0c792ef4b3c9630a50ebb6c23aa886d4981437c79389" + }, + { + "address": "etcmKzzd4K8NT6n8aTiMtUkNxFc8sz8vyx", + "bitcoin_address": "1ivxwc9eQEn69GxfyFauZEvH41vpQKgcP", + "secret": "a3fd517ccfa8ab4623d02331e818c4d713e26f7cc7d18b2a7e1125ce3e405335", + "public": "02e1438126acabe6a4c2eaff465a5b0899b4cf66fe762f92434d6ad91b44a3ae3a" + }, + { + "address": "F4YnpYwedDV3DSuTVgAqN2F7mikJkRhcTP", + "bitcoin_address": "15cUM2ruCVErZ5SK7txiuSPPiEq7Yrsa61", + "secret": "efa78a590bd91f5b51964d3a4537abd76f03c41d93e2f68923df89662f52d32f", + "public": "03b05cc039402bd180818546c50dce27f21cc34f85d0f0a108fdadf8a6aa670d82" + }, + { + "address": "2c6N2MabsomEg3JKDkch4Jpz29bsNU2chWp", + "bitcoin_address": "18SdCHnH5GVMNgwBZgSsB4R8Dxj9C46mvd", + "secret": "f0873cd7a110412e885761425372f29c72555e50fbba2af0cbdc2745f60717b6", + "public": "030da68239a9b2f59b09726846321a3ab9268912b01802743098721229b4e36c90" + }, + { + "address": "23LApPWq6hQYCe6G4cgaPnYVS8pAX84FBaR", + "bitcoin_address": "12CjZ8futiCaQzcNyL6SUutTqgSCYHZ6w2", + "secret": "52aa35161bc67fbeb4db60e92872d737679da25a4fb65331f8ff49cebe9ec56f", + "public": "03038fde27b7f8ef7554632abf454ddb8e0dc428785851afb742599a4a69371822" + }, + { + "address": "xFw9ZDCbQFG7DpRiQPTzb2WNRHqrkj7RGQ", + "bitcoin_address": "18cB4d78M8gZntjdz9kUtCbi8B8NJAtaj", + "secret": "eca2b0b5b6b1d84723b01384112f25786c5c8f3445c941070a71cc76aa95ba88", + "public": "039b957325b2c35cd8734b8d1cf83facc02e497ad886940350a68e2f480768b0e5" + }, + { + "address": "268GpgoU9Hv289M8Hse1akwZde5ag9uj53x", + "bitcoin_address": "1HAW5XnYwxGGJk2pVk2sk9qnv1i3TgTXfi", + "secret": "2b5b22635f3aacc25b8e49aeef42bd6d64a02417a80e9ec724a68cb219a7c0a2", + "public": "02d8e1b7b6ceee82a2ed233139abca00cf638c8f2398d477f0dd06b4660e294f45" + }, + { + "address": "2FCo3HNQxWgh5K56mfG2RwLAvzagB6d1jah", + "bitcoin_address": "17guDqNBgor6ZVkbkvc2MX6x98yxyynqkt", + "secret": "4d9df01b27be68b30693b07335823009231b9da913c91b8e5d8b8d4bf0f52f5b", + "public": "0313287d7d4684f66fe587df1543766dd415c9086e8c95b8daba9242d0853b164a" + }, + { + "address": "2MpDqMjjZ5yULWt4CVDCxdPQGJVuGhaajfw", + "bitcoin_address": "1FAqNhkTanvVaqsAH49DRx8yDBtrsYAK9p", + "secret": "f54df30c69b3319ed9b23ab5a6b8f304bde489876d94a321929551d0a8308519", + "public": "02b67fe14d0c9341f3ac2aee4469517c8afe0a7e4377bd17a23016a08489f4a9a5" + }, + { + "address": "2Xz7wn9Bxb2tszHxPDNgewe4FkxQk4SccBT", + "bitcoin_address": "1PKrtFgH9b31SuAshQxqweLy5TwRgJ7mVY", + "secret": "2c1a5fd49bb16649b9a928dcdb0d3c1ecd6846a53cc59d1456883b7669dc89fb", + "public": "03c627ab67dfafd83933b644c17154cb3952fefd97cc88d80b4710c0e90f4175fd" + }, + { + "address": "sGEef8vBoVE4EroM3Zt1f1isXbpyEkQDMb", + "bitcoin_address": "1AoX3Li3dTfeBerKNWGRWFLdHEfPca7fV2", + "secret": "8a630f2682bd44c03490b6387bae44e5842af0b6b08b2b1c0a4549e73342fb53", + "public": "029d3349abd73409c2ab4ca0d69159dd09f3648abd85128f559a422a61499cf46d" + }, + { + "address": "HxKmR2d1tRHRXeAQ4tL7ekbi3MRfyHVWow", + "bitcoin_address": "1HnPkWWtouVKYbjsYw9gnpUDnCWKhwhdUX", + "secret": "3d7de091a784479b3af9ca73d8dcb8646b055b33faf8ee18b88a188a6048bd40", + "public": "03fa8f11fc56eab51d0f1658b8476afda73eae0e5d4adb3af4e721fcbd732ca25f" + }, + { + "address": "2eD58A32HBAUhHVfCgF9udzJRdswTuuG5mi", + "bitcoin_address": "16hMyErfk14e5KnxsC8wHw8esKjvsncCPE", + "secret": "6d6790b0807b0dc719eddfe623b1ea711075609d3be17609731f5d9ed05d6365", + "public": "021a69827e26d0c81e1fd1a690f84d94fc183bfc066e8aea1f0485ce1fffb4faa6" + }, + { + "address": "2e2Mr8MjvUHmMSf4DayyoVqgSerZyFsK79W", + "bitcoin_address": "18VqW8vFwRbpNn6U2UACJMnEo6wAxLoXhN", + "secret": "f09b7f763a7cbbcf01a63a81dd0a60fa014e0a96ff609dc544b3d003d0f82b70", + "public": "02746c6784634fb65f5d0b6a73a023464c47a4232831b548a57b5d4039a177388d" + }, + { + "address": "27JVEagjW413PVigf6ALjqNCgm99xS5jj25", + "bitcoin_address": "1HgWUhBxLJrQzgofMdHs3NmsbfavBkUyGR", + "secret": "e4d69a0e022f119941ece60c0b0fe8f36d93f7f7115fba75ba6c3c646bc0b804", + "public": "039ad4b9726873f1ddd35ee87cd49aafd1734cea699ed9feb3c5fcc6f5a20ab237" + }, + { + "address": "d2LgfFBTFTwxP7PyzHwpqhHKc4BLPbA5cv", + "bitcoin_address": "1GeV1TgDh71CF82EALZXRT83WnV9eiYXK3", + "secret": "fc46fbbfa893010b6b3b7a82aeb52290d58f6d14d25a68232f0143b99eb95966", + "public": "0248ef5a23acdf96f41e3a3f1b796baa6e4bcd303f223f92b34025f11f3875117e" + }, + { + "address": "DYnuqgGZsGk49sU7c8SFqCezEzeZMnYT6h", + "bitcoin_address": "1BABD5Q44XuZwJtoKrDBAJpQ3Bk59GghJg", + "secret": "dc7b04fe3530713ecb0bc55ad66236040f3df7962d0f7764184059a5300de5ae", + "public": "023240e626ea68612bf3a722df5cf567052e807a555b63eafd3c3fdabab1aa60fc" + }, + { + "address": "2XpYsb37q5XDQHvtK19wZbsTrNzkH7BVc21", + "bitcoin_address": "18H9LuwjVx7yZVn7b3AFSo7QdBMhhcQuN1", + "secret": "b2d00fb19032ca52ab73f6308248e3fbdaa6e747a5f00af9cdb4fa914d76e19e", + "public": "021a7d5d53479b596f9510b9fa23e682dc02930e715550cf70ef9844c62a9f7944" + }, + { + "address": "ucW7K9gf3qU3RN2b4i6bGxFYrL3woqAGgb", + "bitcoin_address": "15VpYZu6QSchUR2P3ZDXk9VjbomTcgqsV3", + "secret": "9ad70994a257aee7ada71f7f93ce52973febe7cbeeeaac7ebdbdf1e6c481dfec", + "public": "02ea5e47e063bdf92c93e0bcfa3ce25fba9f4df0c28ff008c6b17737bd0e994292" + }, + { + "address": "25fbmTF3vThUywruNQqVXE45sViGFJREY18", + "bitcoin_address": "1Hz4CnvvTnPXuoUQxbMP5FjvYUQQhQiLo4", + "secret": "f62247d6d0644814ab52dd187d34a409d7e4fd92cf84525adb6703a1d85aad7f", + "public": "021f05d696dedef4f9739c6a7a258e49d62cef2d53c23a37a0a3589f95e6cf7b02" + }, + { + "address": "xYMp4hezFHZQDDyRZeAdv12fwaCiJ2vMdY", + "bitcoin_address": "1DmU5oevmaKJEZcRpW2A6Sh7R5GuKQyL1t", + "secret": "6b4ab66f5d8913678ba852718f6ea0e663a6433f7f3d748966b4063c3a6177d9", + "public": "0302f82272e3d4ab41c5f2d90af3d457f1317ec703cb28e10f657f34c4b702142d" + }, + { + "address": "2QtyuU4brhrHAfUTKba4nRTMzGk1tEXruVM", + "bitcoin_address": "1FNviBBK4bjXzNHJLxK7u6ioCQ6Fg8w8Fo", + "secret": "6e9aa8ecbedcefbbae841c8b9abf7c72d047ee02d02ab3de3235e02d24d9bcd9", + "public": "03eb4850fb800b164540382b34d7d92c07f054383c4c5e8cd6da2b2d721fb27c42" + }, + { + "address": "2kvThk3SQYaNSNN5HrjPTbTFM74vXj3T65T", + "bitcoin_address": "1HtgpLNGddmDdS4pVNY3kzqQv7juW9iPPz", + "secret": "bdf9c95a73abeb67f87cb4cd628ffe1c8f11efb6538feca26b50bd8697b6df2e", + "public": "02d4cec5d6667aee1afb4c077f34031b05879ab4246decd0eed08218a8bfca1778" + }, + { + "address": "gEnn3tL7KwqmVuXQgndgbdxKesw8XLwMJ4", + "bitcoin_address": "1CwypzWAJaJtnJUuiHpPxjswNFh8jP6snJ", + "secret": "e98a343f67ba8e50dcdd8d23a32bb4fca328fc6c3ed3dfb21646a48e396c0c08", + "public": "03a69b41e972c2735d740f1c1e96b7bfcc9c20d157c3fd6981170f5171fdb0a5de" + }, + { + "address": "QhJj9DnTETkK6BKN5hX8CNxoiDrpRvp9p8", + "bitcoin_address": "1K67MJwGgMsZZGiEV858638oZBUxfjoNLs", + "secret": "e4e661663ed2750e8abdb0c6a66dd61bf3883155212c83e0d6e2ebfaf47c4138", + "public": "02e8d9982798c5f006a0adcbef9ec806a894bc88de7adce0b7839a197a437fc417" + }, + { + "address": "occqAdzZCGaz6ZHLmyW1FCSrRcL5Am49Pv", + "bitcoin_address": "1AtYKiVaNXGSLi7aLK8vdVcu7TwQkFmrtk", + "secret": "20b851a7b0615ceade0f4777e0d58b0f6f8531d1e367a4523f8f182d534bfe55", + "public": "03bea4e1361b538fe990a04555d9dd02fbf7f7b6a7e04fffa80914a5b1f5b9d74d" + }, + { + "address": "22YUVaU84KrbVogn9sjpATTEVH4KsVWdmsh", + "bitcoin_address": "14cT3TZPoW7aGT9YrLdQaUW474F1poDnNu", + "secret": "d75b07572d7bbd6aed033392cef11e46ea53b07a309e10a88cb13b7dc7b895fd", + "public": "0235ac4849583dde931ab62f283ca3b6788acfbcdc9118f95e8e70b9235b0f20f6" + }, + { + "address": "67Bvi6FjvJrmtVs8knw5jrhbB9CHbydGmb", + "bitcoin_address": "1Mhp2Z6xExFtmbNfCpAUG4eoHF1arBdMdT", + "secret": "f1ab28b4d9a4e7154200f9e97021b505680f2b6aff67b84556d3595f24b3526b", + "public": "03658ae2dfaf17d476e66d3fc37c60589a358dc2cee8a0da100745672266c6f174" + }, + { + "address": "234EUS3L1CSktQjv7Gew3XyuiWfuyYsW7zk", + "bitcoin_address": "14LUsDyLQchYW5gAMsLe3aFDLByhCkaiG4", + "secret": "34d2973733c9907551bd889bf373e43a2e8c5b725c047f30fd280c11fc5022a0", + "public": "03f26a30354f239883057cb42ef7c332ab02509d0cf65abf0a4a62023a8d649ecc" + }, + { + "address": "rh4HV53HPjP5EVzovH1N3MpS56xEFHBWR9", + "bitcoin_address": "1MJ5AjkZmH5swMbbyh2GtioKioYVXD2QqZ", + "secret": "1ea8940d0b18999efd6f6cf7d59f40372732e10abd9f08d2bdf366fe3daddbd4", + "public": "03eaf9fc065239fba9e5fc042b250988c52aa6ac9e5775d4719004b20b431297cb" + }, + { + "address": "2YzJk1MuPpnAvKXYMTyRM1VsgwrvsdxfjT", + "bitcoin_address": "1CR7siCgbSj55ZPXYqLpFPWvFJGxJSyrzq", + "secret": "bfc39b678b8ab0c31baf501d510548b7e88f1a2c4c0d61a56d99ac334eb4420a", + "public": "02e73b0cb3d96c20b4611e74cdb81501f5dc8aec50784e021cee7e3a3599eb8de4" + }, + { + "address": "2EkVeCkNTSD7QEaz88g6tL72174si87xSVL", + "bitcoin_address": "1BSxnDHa9S4tfBMjo4e5FV1gbDxy5cX1hQ", + "secret": "4412a0ad23f28be3735698d4a086e9c285a5f6ae1651a95b526f3bed320b3de1", + "public": "02fbf462883546a2e516aa22f1f5f06c89a6a3b7cde80b59e7ef39bfcb94a78e50" + }, + { + "address": "2L8NW3x6F9fnMVgosWWdEcXmdkt5Sfhkyip", + "bitcoin_address": "19NkymzaRLVfYPnHbih23fBoHmaNbY6rBi", + "secret": "da5743dd6f09bd139c9c6e2105843b19de9a3393a7549c79edf91532387bd6ad", + "public": "03fd90e6f33e338fa4e9f6111396585c124b83d6b390b39f92d072bdd862831d7e" + }, + { + "address": "22ZB5dM2NVyz13YiuwvW9X7uKABoEbHSwYN", + "bitcoin_address": "1KHAcEL29mtNhoWigUneF6H665xAYdaQ5o", + "secret": "910176e477b73d66007ae2f5d44a7bc71fc21891ad1bbfd988d8badcfb1fdcab", + "public": "036d9ba5504a7fa6f55577ee34b5e8f2e989aab504dca6ba265d26e6518f5fc5a6" + }, + { + "address": "2RcNdAmomK5hPkrzEagpBPbJKPG1YhfqBZX", + "bitcoin_address": "1EdgbpqybSggQP7voJGkPscro3gyCiwhCr", + "secret": "8b656b8a83350a408db0258f81c1fff913c6caf10fcb53049be6cdf5f6850ccd", + "public": "03e0e7fd4a33c7e2af83e476ad5d78f5fa91cd8f16c5f3a3904875444f76b038de" + }, + { + "address": "mECP2omm6nNKCRbUUEA3ngU83gBtbG2p53", + "bitcoin_address": "14LWvRMPhtKWQ8GmgtVPSN1zLEBKqPcdSu", + "secret": "3306fa898776691df724ca8b72dd5ebebe9a166a9f107a281b7e83e0bcf34d8c", + "public": "034a9096445d1401a979fc821bdefa15f44df8dc02ae88e051c6a7b45a577dfc64" + }, + { + "address": "22nsdEVSxa5aDvpFPeyTz9qpcc2h8PLzRt4", + "bitcoin_address": "1J7cUUzp6PHVDD8387PQAeCedi1JyNg7mY", + "secret": "e6fe5bdf75d6e4f7aaea16388cf2450fc1839b088c415bd3f7b9a65958c08f18", + "public": "03349d2964d9d6dada8ae6934b76145cc4d92bc43a41edb55d548a7da36530ed2a" + }, + { + "address": "2gadfsU9qYJSKcjYSbYGjrRXffK9grr74T6", + "bitcoin_address": "1JCHoZz63cnZshbw635YJeyPpgPxY3qPz8", + "secret": "56d995f35b80a3046af165ad9dc0a507ecdafa9a947403ceb63c79a3084be6ba", + "public": "034010692d87e47df712c37a3490f096d4323b0148d71eb06756d1153e47de9558" + }, + { + "address": "24krePYfSFjn21YTDA2e5FAWZefu8qE8Z3R", + "bitcoin_address": "1BRV2pyBpgvRJ1e7UovipvQmfzqnf3L2Bv", + "secret": "493102a3bbcfb4178ec7c1072631ce03f7f3e1d07d5876f07c3902cddea3e5fc", + "public": "03253e2a852b5aa4f8fe11d5d32cb8364dcd5460665935b47138ab945a1b7550a7" + }, + { + "address": "rcqLsBcsWXHodbDaCLHcjQJKSJ8kD1q4Ff", + "bitcoin_address": "1DghEhH3eJAVrMvRDBXrqCiAK94bRLivN4", + "secret": "cc8d395693f126bdbdabb3622933d1c0bc148a2d929bc30e66e22f07421f1592", + "public": "027558c499a52a96043a001f8999a6cd38a3fd2527fccf28d12edbc90fb7641aee" + }, + { + "address": "wvFzxVWV9xGs2ppokV3wmpy2C9BcUe3DZy", + "bitcoin_address": "1E5buqiTuRJapvuHJTP8JChmTQ2VLyV1ZX", + "secret": "e8e09e51b8add90be81a392196c76930e876c97cb8b1df408eec8df13c215b19", + "public": "028e99b6990ae84d590aa30acffe4b9a1fe5033cbbdbcd9971022c6e249b43d98a" + }, + { + "address": "21124BfJReTshKP7zKthRyLAkjSnvbo3JL2", + "bitcoin_address": "1DnYEBjvapKPJrrDginzJh11CTeQgNtWZm", + "secret": "f452d999bbfbe7da6cf10d8e602a09543ed716167649dbc6b260f218d08d0a33", + "public": "0323535070dbdc40d0e3e5ce3f1f75af79922dafed3f8a3d102fbc891b9be3efaf" + }, + { + "address": "KKqLNqWvbsMZ5sYKAZpXLZm39jZ8zUamy4", + "bitcoin_address": "1EgrQeZngXFR4SHmbnfvNdPvQB6naFgBTa", + "secret": "0fd7f48cc79b6252dcbd7a24d5f3e4099acfd16368f8f2e7c7db356ad1488284", + "public": "02cc8fbdac02a1050df58a28793247184b810bceeda25b7e2879ccc4b695cdfd20" + }, + { + "address": "2afkMQHbNM5EGuVPt69yjjzxfPsih4hzfAt", + "bitcoin_address": "17m418exG5Q1qP6BgzQFd21dr5GVBAnh7H", + "secret": "7ef7f98aa685734f83c7faeae4cb687b246c21998d29961d5899757814a1c28b", + "public": "0321f6a774876011ce97bb51f15a35ef2aedee2bf9aa9e5a2be3193d7bdd4020df" + }, + { + "address": "QqrvnPdiJm4qg2PZuhAEYWCHo4s9VRzQ1d", + "bitcoin_address": "1Q1NULJ84Mw65gjSJjxr2e8mqbJqRn7fVy", + "secret": "3ccaf169d3c906c5475f0d2ed148a6a0bedb23b88df3a16f485fb7a27c61f465", + "public": "031d90572ce93b645673c299b4d3540fcb11cac5137356ebff65f29e47e75bf921" + }, + { + "address": "26oEbwGTv2tGemBwWvbANw5z9oW1odHLKU", + "bitcoin_address": "15pXrDTE16hiPgLyaKsZo1DjWuWdTyQFSY", + "secret": "cbdfa24088c30d9c07bf634e84a739773b79bfadea68db57e7e690cdce00395d", + "public": "0320275a12cbc4888b9b0390de849c2bf6811a128212e43c2359fcecd2e5bc3fd0" + }, + { + "address": "2bNwEBFte5ezxWk4hVB2gSDzh3YTacKYxKo", + "bitcoin_address": "15YpeWbfFRMkmhpuSs1npmLnuoS4Wn2iNX", + "secret": "a216d679e012a931b34ddf4716f4d5184073afd962f3ffd293cdd1974eb5e919", + "public": "03fca51ddac76f423fc3863eeb7681a564f75c16026da6bafa50096c6748bf4dce" + }, + { + "address": "2M9Ms8uouj4wVZSd9sJXNFMYMDCBrLQPwNj", + "bitcoin_address": "1127a4gNNVErHhTmXdM5ajj8kU8dn97Mns", + "secret": "2e3757e0b1c32e5c930c27f9ef8a60f8eaf934b063cdfb788370f0f4a0b12100", + "public": "03022caa31c325e86fe4f9f28b7a3f4474587722821c7e0384a7e05b7aa6a8e72e" + }, + { + "address": "ZVD9KiPi2BjuXvqa2uVSUz9UVvyt6bCin7", + "bitcoin_address": "1HhY9i11XZUu32qC1zHZzBYPTB4HkBpDky", + "secret": "16d14664cb9c65122d76a74d8fcdf542f5a4badc4e63da12f9a2e21a49364142", + "public": "027044e66f79defc67e06bcd5aab6921a985c1a78e5f9c965b2b8b576aec5be7a4" + }, + { + "address": "EWFzgYgdjU6CVtPXyP4WrwMondHoPX9VSi", + "bitcoin_address": "1GmznM8Gjy4xQ6TNJKTEUDwYe8GF9PLCxb", + "secret": "bf6f0cf4e0786300a07294f18d9c0619ee77e224274ddb0b4c74ef9b5ae12bec", + "public": "02c402d13f5bda635669b0b384e2a7f937ea3668d14c6667472fbe974027f338fd" + }, + { + "address": "frgeQ5LGCQiJdqbBPmzJrvHf7osA95iCN", + "bitcoin_address": "1BLAC2zkK3zyPJ9HyZgazaiVE6FPRHbEHA", + "secret": "1b533323661fc93337c9a09546613f13f10c0dedb756a935791336b1c847a012", + "public": "022dc106b9222bd5779688fbc75010ee6f24d9491a7db1dea0bfad969d27080483" + }, + { + "address": "2Ygc9Y4SWt6pErg3smALUqb4nxe8y3Aa5SV", + "bitcoin_address": "18WHSKDFDsN7n7Gqvua4xKfS825yJ15Cm5", + "secret": "5aff64e7ee0c57c08b80c66d91c5db5d0892a7a182eaaf9fb775eb77d128e731", + "public": "0349af83b3db967df7319957aad339eeb85550e57835f4acc07293e2eb353de8de" + }, + { + "address": "VZSQ6ji6oeLZgxd5Nzzt67JPUFzm9oXa7D", + "bitcoin_address": "1DSGczefUUa7vWeFSmtNBNrED7c4Fie4P3", + "secret": "bdcf7de5460ecaca02d4e485892a4858ad4c4a7a17d57fdfa8f311a0a3b386c2", + "public": "0335f1138f086f04fba73c261ddbc263f9187454b9dcaaac91d2f628ff64e2d7fb" + }, + { + "address": "2UtPuf7UmE1RMaKaRnQnsUmHsHmTyv2GCqd", + "bitcoin_address": "179siq9DPGGP7yb4riQQhfDHkpt5nXnKGG", + "secret": "33f62c9b2d5984aaa7df578a2d8109a010f400b522d95294dad79d0579b69790", + "public": "032c2ca487f68198688cff80a29f59ff68dcd659082b8b28e850343a810702b6d0" + }, + { + "address": "CQNjG6VeT7XLoFd2DHxj7Bdu1ofdkvf9Hz", + "bitcoin_address": "13BLEMEznhDpWKJDyLEDRGrdg3U7fmdLq3", + "secret": "0d323574b86731c76d23912641b4272aad76c610641794f6008de85245d90501", + "public": "03cdb086cb3d513a001501591289093bff66c0e4694390b120c9997af573789fee" + }, + { + "address": "cFhdRpgfDXFD1d9tzSGTDxVkyexiHHbscT", + "bitcoin_address": "14ZZ8w5USeZwe6Eg2aa2HjJzP1oVRaMD9W", + "secret": "04b1bc8cc808c62c32ff387b2cfae435b3fa48e6775a98cf564e5c77d58c4d80", + "public": "03214b11698b52fa5efea3549a08c69afad4d14d2e1949a267f29a7486f40d1662" + }, + { + "address": "EPqkNxDnvQorZaKoEtjGcGKURNcywr3dny", + "bitcoin_address": "1LZ9SSESs5ZD1Sa5p59kEqeAGEkQnLrvmz", + "secret": "de6c09ad0b43723096aa1b5ad133a194954793f2005066d2f3f7f629bbd14429", + "public": "0285584deec2240b44f3ba9fa9380b39aed1582896e38fe0c8254bdb1e14bd7f0a" + }, + { + "address": "UhCE6NpRtm1Bd44MkPgVKToavRRLqoJbDr", + "bitcoin_address": "13gzqhWnwt6NNC6AWvYFf7ZNCU6snmXDsk", + "secret": "3fb29d455a7d5917a88f001aec8bb44ea20d17d7a68019b4e29320cb1bcd4561", + "public": "025c453cb7b8c4470678976e1e08baf10852d9b28a5a21b55376766f302af15d32" + }, + { + "address": "j6rcr86aiDCMtHj57zQt3f4MkG9zoscywy", + "bitcoin_address": "16MmZKhENbWLsLvqptkJby5GVF8q1dJnHj", + "secret": "1e05688f0796d4bc347a92bac8748bca26fc4cf749836672d240fcae8b8ac467", + "public": "038b8875d803161483165346766f9a1bdea5b123b38d7705538d6a1d8d5cdf54c8" + }, + { + "address": "G8unj5XY9mKMjPZ66KNrADKojueP3FxpFV", + "bitcoin_address": "1DjfzTQvznspT3xGr7TT5WVr2StxmN82Zy", + "secret": "4eb017d642be8864dd5c54d0e81d4804fd588361fa14f31b099cb5211a0b14e4", + "public": "03c0b736889e8cfa84b9fbbe9053f508a5cfe44c6148e0b575cf0d136204adc9c0" + }, + { + "address": "iEY1wongyqqfMMCwwKa6yKnrBPzWRv6Cjd", + "bitcoin_address": "1Gr2bqdCiW5XSnjBopbeRqrMgoKQf5ACTw", + "secret": "205d5d8cac7ef46d7049a8e360b5db56690c939178ca1cd46db8a686d9f2ca81", + "public": "026953569b00b6d1545899246f12bbace2fd78f568a004d0d08ac61525c0eb8e10" + }, + { + "address": "8MofVFHLEyfDbybjEuj8Av3tvtAHm7aB6i", + "bitcoin_address": "13AFc1zNdNWfJRBPYkZSk4QS5JX8ebdBi1", + "secret": "b88a93973a8a62453a83c10e00817112922471d2270d1cb0c8490fffa98ff4a5", + "public": "034abbe2d59395e30fa5e769961bc54beaa08598370b3e85193a9e200d8b18213c" + }, + { + "address": "LokNHE2zyrZgjpXXWrWY5L5BNsXR6qJR6D", + "bitcoin_address": "18Sobk2me4WTpgcjbdGn4sE6DgBgHKpzyW", + "secret": "fab1c44ee39d0839860710e49df3f47b35d48465573c0251bd844fd90a6366f2", + "public": "0251740aa6f68cb3290cb0d72db8d9c03447bc747da7f272847417cc8e40330e9c" + }, + { + "address": "NXV5XL7rggQ8GAPDjJ62jpXkYGJ8VAXSba", + "bitcoin_address": "1GFukEQ4FV9c8JqdAKMDruW8V7hrTTF66s", + "secret": "631b5a1fd96e7a99ebe33d4788a8d6e45a6d4b116b11bac53aadd116f39c4c11", + "public": "03670833bc074d7009dfcd1a61cf5b63a08ea0bd58f0f295121b8d5825d897dba8" + }, + { + "address": "frEtjtXJoKyuyq49akz1Zx3yLMpni5gYh2", + "bitcoin_address": "1HNWRDMt2G8h5SXMoPtcZNJFXSXLwiRV7g", + "secret": "8d50af61f21107f572606d21c35e453f997ec17e941f2b7afbc051acb36283f2", + "public": "038daf6200f2ca021673a6915e57b4c424ab2ac1c1b749db8dc059607d2092b1e3" + }, + { + "address": "2Fp1fioauYwyMikcL9VphTrG72ZBwP21WF8", + "bitcoin_address": "1c2GznKC6wqR1aV7vsMca1SbgSwpNZPEn", + "secret": "af01bdd50bf4187bc8fd855962fc0a68ba55b3950d9abb192ec7b5179638e045", + "public": "02619d27f77c97b36ce895a9ad47339ef69a9f02a6953379d077d078ba7bc6535b" + }, + { + "address": "PeoTufGJDpATgy7y5fKUkM9xoL8tzk4LUA", + "bitcoin_address": "1CpxJDzsZ1xFdhCazV9q49RgVHRQoCwRPc", + "secret": "f8c45f4c7034fff54f2c8f2f2b8f9ea356b299c73a66a9979832ab7e162ecf59", + "public": "03f4f3d208cea7bb257b6e6e84def31a26b22a2375c9ed50e0e02041ece9b09f50" + }, + { + "address": "2avexrXAe1yFcmEaFSMpp4E6bkHDyonTg8i", + "bitcoin_address": "18ckgcA2LJdQVrcdfmT6A3LxmQA63sA71A", + "secret": "4f62ec6881c21bc8ec63676b124ce103a59d2acfac567827d29d9f3bd8015562", + "public": "03e17e14a0c2691b025b2a07d63ac21fb28451db69d8e18904ff8161ca6bd93f68" + }, + { + "address": "pwNab8Wa7Sag9Cg2FmEDF56izp8mD7kzQw", + "bitcoin_address": "1Q922ScbuSn5Z8LEQSWHQpVpBMjitnSVkJ", + "secret": "fcdf5e499b22ec63290dc2c680f87745aea192abf5aaef858c007e946ac3002b", + "public": "02ad66e1ecc629d989a0c80f81997906f5465ab1d4ff908f02f23e8a96cfe00f50" + }, + { + "address": "scN5GgoA6epthFqoXEKc2Y5QZz8jyT9FNf", + "bitcoin_address": "1NcTbnEQVuNYGDkRxpnW79dm7iXBoiaDuG", + "secret": "24decfe6e2e505c5fb7a9a7a6608587883554ed81bfdc581921525a5a23f6305", + "public": "0344f0bedc327fa09c9686235ea3b2139c07259497264c2b4461cedda3f55399fb" + }, + { + "address": "SEAR4hqpuvGLPVoGLpd5U61aoYHUc6jNqG", + "bitcoin_address": "17Pe67zy2Hk4PdMvY3uw6JX1R7YYKGqLNQ", + "secret": "b5093a711d22263967e5ce2b2aad751e6742cb34ab51c8d517a328cb406cf801", + "public": "02b5fd3eb5a00f7bb172fab386af63c965e72c1874520fcf2121bb3bb96988f68b" + }, + { + "address": "2agxCQqyVw2Ne1n4CtBboaWQ3YjmhXaocdh", + "bitcoin_address": "12wZmmFDHoKmUWt3fsPceU8FGsBacqMENr", + "secret": "ae897238f5b80a8312437b2335442d83c695feb68b44482f5bc2684079ca40a1", + "public": "0294e9cf3b98d6c5386dee498da50e2a0fd28244d9edc82aa0aa3212c4c0ef06a7" + }, + { + "address": "XoHShPLTkcUeFqiwSEfRgvJnHHKhNYAHc6", + "bitcoin_address": "17cjKKuS1DoQyMtVPjQoqPsMUkEw1A8z1k", + "secret": "bcc65eae057e0fcf3e423255a0f5ae2ce146919bb707dfd4bd3fb762fd69d78e", + "public": "03c740e434cf3614b53c2788274f7a356905a8a1a27725d6ae9e67cb1a006027cf" + }, + { + "address": "2hGNn3KRW1Amg5xWEW8HXDW9pNhdyvp3Bxa", + "bitcoin_address": "1AmhPqfpiLWZBtKHs8kskjShyeAA5zrFap", + "secret": "7b39b68fc581a9bd7d759a74dbc1d7beab35e0a64660372ea1d598ced36d9ee8", + "public": "02a8f5bdc94366497ffbdf88fdc423b51718947a0a523ec63547f88b1c10c0382e" + }, + { + "address": "26T57mqYiFif4KBVW3N9w16RGfSg8VP9FfW", + "bitcoin_address": "1Cj2pNB5avfrhcieqf4SziBxcdWKQPfFG7", + "secret": "c71f7cabea5b39352997f647f1481710c13ae1a29a06f01480af3cab1e6b2f8b", + "public": "032f0a83a1826005975aad6e23c87088000bef7fafd11a52e1dadfae590e859a0e" + }, + { + "address": "2eCjgi3o6eTNtj5fiTs9Lu7CW5WMXWZhfXN", + "bitcoin_address": "1BTSmfd3iaAVQ2Z69pkSsNvVbZ2YBWBLDE", + "secret": "8d6142ee69ff6eba19bcd25fb16f1c781a93d404385dd9b90e85a4881187797e", + "public": "0339f788c880d61c3f6fcc23e0e90a1c18f79460533f392389650151314d59058b" + }, + { + "address": "22a6YptFqi4MjqsDjFp2L3d5ZGV9NDuczfh", + "bitcoin_address": "14Nu322uuwrAs7Jmx5UrjTc17B7JjyVB8K", + "secret": "865f1a3d7d1a95b54627dcf64e3677cca758a7cf35aab7389cb2eba2ec6607d9", + "public": "0266e102621ee4087707692aca8cb858cb51ecbcb5579b99cb2725749674394766" + }, + { + "address": "2Tzi3mCkXk2h3GshRuw89zcku2WbvZiYXmf", + "bitcoin_address": "1KWieEnkgYWewhjisNTzBvw2EtoKGkH65n", + "secret": "1a4167d782b49faacbb3c89994bad131ce61850641f79e52e4246bb1a05bbce2", + "public": "02632b4a6bb063f28ddf1034ede2e900194dc1d4d709c33672fd33070291f53d3c" + }, + { + "address": "9YRxCxLexL89oe8RV2SFCZy4AQaBYXAsLf", + "bitcoin_address": "1H4iv73Uv469JbUe2pt9ApVyL31hr1Ajaa", + "secret": "253249e9c22d9c28a110be2d8be3acbdc6a3d04bd001a07aa6759a3be2a4c591", + "public": "02548f69543f4622659ee0ef77db503e734112813f70d3bfe6b4223b395a74364e" + }, + { + "address": "EXAHo74kkrdfFnFTEU6zKSMubBYyY6ZmWL", + "bitcoin_address": "1CVkYJxjWVM9dncsJarNRSAPF4Th4eTQd1", + "secret": "1a5f08c53c600ab5a52e948bbbe77cce9ad52e90aa14d16d78938fbacebc2c4b", + "public": "02cfb2fcf1ff02fe24d210df86d12cbbdc81429eea6613824c031a8da77db2065e" + }, + { + "address": "2RRBNvJSxReWxHRTqxHoUs8gMuhkBAvQaVM", + "bitcoin_address": "1Nxmu2RmRvRnzVByYE655eNyfhYXNMoTeU", + "secret": "4ad2c6899bdad0d7a8b36ae0ba0fa22cf6713fe48a454327ebafd2a2cee2bf57", + "public": "02835fe7180f085ed98bbb305c84470d585a391a9b53cccb344f26ab0591efe186" + }, + { + "address": "DLLAzoNAdSqmjoeHY1Zs4C8cF5TsVrhxMw", + "bitcoin_address": "1Jrwy9YByu8B4gyBpgoAJe3TppbnYKeztH", + "secret": "436f14e457a94af30f1064a3ebe4b925feb0bb08728b9b37ce6e3fb2f048e6d3", + "public": "03e6c236453466b1c7e7ec6edb05d8ce526f9b34ed696526e39cfa0e7974289043" + }, + { + "address": "2g7WeX2ieVcucWtFhqVouh2U34VT7jBTKvY", + "bitcoin_address": "1JVaWP2dy9j5FhNyEQ13qCpnu4GVKb8jeh", + "secret": "6c147b748cde69b07054d13132180dff1e2968ec311727c3d5b430074abcc53d", + "public": "02515f6a52401a03498092aa16c0fe94725030545b987e2572c5700e91c7dbb7a1" + }, + { + "address": "27rnygUUorp69QkwCHqzy5WJMc1hnxoxN6n", + "bitcoin_address": "1iCzjamUkKEUacTAXe6h6p5FVcDkdfAxv", + "secret": "2f0606e012fa536aff11702f3fc192550abbea7ca580f65ff44013f6e6d2ee62", + "public": "02ddafc8f9963dab80b74c602d49a42f9ae8fbee1ebe9c10d72ef00284c563527f" + }, + { + "address": "2RcdcDLnqB9pvNPy15MaqcSNjFjZ3ToYQt5", + "bitcoin_address": "1Fvyv4iNuvYv4hm1oqea9p3KpfraTi9F3K", + "secret": "0fd61a8d1265e0479293983b5b6628867fd99f965179e5d51901c602ef2c8671", + "public": "03b9420f1acadb53799c7bcc7693d1024e45b66998821c957abf57def534c82d3e" + }, + { + "address": "2L4E53nxkgMtdEJMVEetmEqN8VsH8bvN3qL", + "bitcoin_address": "1KZJ4CofwZzwtq2aRrH8TkVdrgskDC48Zc", + "secret": "5bcf2fd07fa946483b0bff30d0008398e584ff001093e588c99d4fb4303a6654", + "public": "02cc1fd871d6ad834a8c7997c38b1101b7bb781ca886add7ff39032d7e11774031" + }, + { + "address": "nasKi6MWvCCyupab4SoScbhxJDYyzS6NzC", + "bitcoin_address": "1DmRRH35mi199cFEJBcjMXiYQLuZAAMQtY", + "secret": "9c3dce71afa6edd50d843534d0d5bc755c36e0609ebb4d42c14f144d67b57867", + "public": "033b9a12e3ac267d17c0ad1fcbd0e6204d57f021cdc3e7d63a186fb6b46c9a9344" + }, + { + "address": "JtrbAukxBVGesZgcuU46nqwYnMJxSvS69w", + "bitcoin_address": "1GTKStVNa5XVtZgpuA9Pa8uVXzZVaLUqoH", + "secret": "f6f2398e745d764547fae8d939cc137b21f0788f4bcc2b18aaa98ce9b5bfe3e6", + "public": "028a5936ce42aae51a92e89ed3d000b81e186892e3ab72da8ea02f36e1a09656d9" + }, + { + "address": "CmJZiinFtNVFsFGCo4ad5Trup7DBmehmB1", + "bitcoin_address": "18L7gmZTRQYnzY22zoXutuKUPqdrZXvCQJ", + "secret": "deb89ee1539b6cb4ed4a3ac1153f6893565b4279d9aec526651e712a02bd29e4", + "public": "03b3ff7fb687b17b45178138fbce9bba96f1def5781564adb5964bb5c1d292f2da" + }, + { + "address": "28t9se5L397uuatoiv2y4q65ZB73C2dxRRw", + "bitcoin_address": "1FH6AdXTiv7afWp9B7RJk6jgqAWDStEfnA", + "secret": "ac33995bc96e8ff83a12a49b22673484f8c3f742e2a9be2ccb74739d603e023e", + "public": "02863968a7c079c5ec060dea520c87396a60b840d7373cb6ea1a1c250f8e273031" + }, + { + "address": "2bjyscrwVN6nSWxM8L1yhavTY5326GUgdMU", + "bitcoin_address": "1PYz1EXJhAnEFKvghnWeV7wcWnRnEsdXmJ", + "secret": "54faa9a7a42f6159ddd56d8edf97acf1004129786d6e7beb88e0c7471ca32c67", + "public": "023f441a065b9026c6574ab08869d322d1dee79cae99f7bc1b71b98db92fab567d" + }, + { + "address": "2fmezc3WLhTCwfTz5AG9C9s7YtmGaisLSLz", + "bitcoin_address": "1JpXi6V1gPa5uiJsAfhvbbdhHL7RFTNPU5", + "secret": "c2c7d6d6cda61f543af9793d80508bc62b19896216039ef946d8ba68fcf84798", + "public": "0290d8e460b751e0cafe38855a130effeb6f090a0213374b537d6759c617ff4c68" + }, + { + "address": "2PwxALhCSc4XrgRCMknLxFWMoRwc8WYF2cr", + "bitcoin_address": "18JYVvEs3QedgfobGjm3jRFqmN3fTyho1t", + "secret": "c7c3b8f070204163dac5aa2b4318181540662a63bd4f0ba14906e44a6337fbd8", + "public": "028af1aceed2ebe9cf27ff522fecf8136c066d6c6c3af1e4030c8f9e124ef71602" + }, + { + "address": "BQFdx54A54kcGLx15CGi6Ffnaz8iCTksfX", + "bitcoin_address": "1JGKVZzeSXuUWbXscVo5PFnvdvAcUoVpz1", + "secret": "f7ec3ed86093aebef546cb068c0aff22079f84f388d16399ae7410d171b8a095", + "public": "020310b0d4934d5f28db1e6db364392d3e71cd6e31b95a94d4bd5cc23b7d9e8c41" + }, + { + "address": "UNEV8oNtzoUHHTRuYSZs4uMCEYZFk8Bob5", + "bitcoin_address": "14nL495YinbfPNHqrpdav83YQ9KvzFkTFT", + "secret": "8e0c7f3926a867b0bfdd1d1b62ed3462f9e564040f013039ee4e94c8b7519512", + "public": "02450766db9e74917020297e0e3d509a584390be68fed4ee488362734f075f38d1" + }, + { + "address": "2ZMV9ShQLokk1HTUVhqzR8J9tABBxnzASnA", + "bitcoin_address": "1E8Bj4tHqedouQjfqW2bTEdELsajv5jMGv", + "secret": "ab2059ce17a55d13e96137be6838b108105d561e6a888116550d0fbfbe8d1e31", + "public": "02d21a40b09a09dbf8947f67317f2262d2c72fbf0a96c8f143c65a09355a3b96d1" + }, + { + "address": "KeykKcYHZy4WKXXsEor6o9PuUJFTUVXbz4", + "bitcoin_address": "15CN5mydStXUq9pYafjVpYSDohyN9XG1gC", + "secret": "d7a282eeb2a7b1182977013d3583fa13e80d955be8ce2cdd2125635812a79a73", + "public": "022d38ed4c43431b5ac35352b2aa5291c3754075a232b694a6e06740be7f2353c7" + }, + { + "address": "irKDBpNkRF59SEC4aeJ3uBnGfsX6T991dx", + "bitcoin_address": "17cTmmCoxSDKbWmEoLiQWCXLpDr1CQ5thR", + "secret": "be96ac4a73e5aedd538eb1c38bdd31ecd4600b1f4987bf64128bede52820f02a", + "public": "0233d41add351854a597a7fd80ba47c5124ae8d926c3c24b531600c2e4f9688275" + }, + { + "address": "2LWEVDkftAQjJBgaW8MPPTrijdXyH4wGjEn", + "bitcoin_address": "18Aeiq3EpNNh1bWs4SdK8FWni2JqzuP9r3", + "secret": "f6639cb6b9a3ae2cabfe37404110cb17a0787fd92a109258a6fa19b183003764", + "public": "0381f5570ce75b62b655e9aecbb02bf5376adba0e91f21e893ea92e21c8a50bc2a" + }, + { + "address": "u7uJsj6EsCd7Z57jQnGQNFAis2YiyoeuuM", + "bitcoin_address": "1PrvQvpgoNBKwkwnSEs3UGPrLta4NNkTQk", + "secret": "034d44196c5ee1eded33599fb1bc8cf205b544f86e8947afbf49a868d081206b", + "public": "0245a408560b1f747c86b47033b083729f5785ef6b00cb37fba401ddc4545384da" + }, + { + "address": "EuuHKQUFGgHN68T6VkssAwNxP4e1htMEAU", + "bitcoin_address": "1M2PHZQm7D6smjosTSxvksGf66Bdx1kf8B", + "secret": "cda4c7df62d18d8ce0141c62fb52f05c7a987706ccbc26fdc8a900836711772f", + "public": "02894d1a4b8e222e1ae067c20567475322f925dfeca1405e2e30b845e3ef047756" + }, + { + "address": "TFVXLJKgoGENxDPfiNn9h1eXWLbER71Dgn", + "bitcoin_address": "19SGTz1oTi5kyqcshwxPLFP2F9YffhZJ5W", + "secret": "0e7d7e87f806b6d5e1063318268fc1df380d1e0aa13499d2b7e6034b89e94943", + "public": "033e8aba7f8c579c7164aa2369c62a3cbcb24bd0b49bf5339841d3c42048405a38" + }, + { + "address": "2bFS9uBumCkSkFhbaV8q3dYnNxx7725JVDV", + "bitcoin_address": "1JhT2pVGVrTs7uqgYs5DzV1Tq5SYRXwNZs", + "secret": "28672a34711c4d818c8feb835dd2198e0dda20d4dffeaf78dcdffef05c991370", + "public": "03c88bdfb32a4c8932ef3b06d066495700cc5161886f6350f7dd46469b56ac3ca2" + }, + { + "address": "a3QUbyUgZaXcZtZPFm9ChWNt5DjYgo2wKH", + "bitcoin_address": "1N7P4zuJQn28ryKRLruGJi8Auiuux9b26R", + "secret": "dc644efb58c344e4f999080d7d8847ff159710c85d0726b80036c47e336a0ec0", + "public": "03494aee0e1406ba2ebf85de3d3fa5cd19877e81720be24140d9d703eadd14d881" + }, + { + "address": "2NZGkbUWx7CHzJ6LHTf7KpcDJNbMmM7PG6z", + "bitcoin_address": "1FvmxEADLcqD8oj8sPJ5jqKGZQScrf6ZAP", + "secret": "5d4fa6c7fdf51ef26a9095245dfe6ad181f5284d338cb5b008e38a6e07399b68", + "public": "035492a39daa2b6abd7530b5846e06fce0ff45f69f62ac722f0e315a092d377923" + }, + { + "address": "2daa3YQCFEXFqwZ7HwrfhSQXgmDucjkKC2R", + "bitcoin_address": "1KTD2VkRGLPzLRjYL3dcnotesVPZizrXg5", + "secret": "a9d6dc77d7e4633075d0581eb43cb6266bedba600c62a98fd2a6349b04b98ef2", + "public": "03d83767f81104accce7893437d33f613567d85ddede6b88c0973ee8ec672fa7f0" + }, + { + "address": "2HrVw78xZrjDMz8YahiRXVgghRJNYxvoMv7", + "bitcoin_address": "1EBJ3rYpwjgZxHc8zzZgrTrHYF8nFqBJEJ", + "secret": "65a75bf3ea1df83c1d56297990620ef347b6671e4530991a15a4a0abc4b91c53", + "public": "0306ca67b3fd9b45f14865afe7405dd8810d81ef0fb27e11d4a98862565ea54eda" + }, + { + "address": "isQzfULaF8qsZwEjVqttXC5p3CwWdVrsEm", + "bitcoin_address": "114AVVPeUE1EHP9E4dkrJ13SG6J5h4bQiM", + "secret": "f421529f43cf5de54382f390fb7d4118f7151bf2b114eec6205d9fe557d07024", + "public": "02727f6d688ffc1afb11202b85b37e35478b5619afde09081620018f485970cae9" + }, + { + "address": "bBHE5LpRBZEaY7upVZrk9THomitAmUQ7pw", + "bitcoin_address": "1M2eTTKem8FetFrNZ7Pj4bfTEENZWMRJPU", + "secret": "22f23e4560ace182ebb9e4c809236e3c37e636d02cbe41dc7f57f1b0d53c3034", + "public": "03457a68ca3c395a1615bd7b41db4338b1648c076fe008973377252f23d538637e" + }, + { + "address": "R2Tmy6uLAyyBVkV9c5EzLvx7dn7QWkgRCp", + "bitcoin_address": "192dGBx2WTV8yhV7JipbsCQbc51uHyvv7S", + "secret": "5f6cd6f06cc6c5658f2212002bb31984e98edce455cae435b0abd2dd68549c95", + "public": "03a51c801274b5774032661bbfb691d832da2ecf19d77a6be035a4e0080b618d8e" + }, + { + "address": "2FbLk1kx2pqoKJifFNVKYYdhxKQEJLqBa4p", + "bitcoin_address": "1Ks8rUU3u6EZfUtJanW7Bt2uqKrnaSGEDU", + "secret": "bd3591b1afd596cdceb604d4c8755faf9effaa8e6a42637066db28b22bfbfd7e", + "public": "03717c0ad9214a4e590fc0379be9696c4168443458e75a3552cb1cce9f40e5bae4" + }, + { + "address": "D4F4Vo5xPLu4YX1sTaKzQfUGnmGk3yCUb3", + "bitcoin_address": "1HRScMbJkK8keXToZaihXeb4gMTGqPvja9", + "secret": "03e60b222f3d7571669e7f943e85d08a65693c8d2054da755149802a69307411", + "public": "03078a2be8905c0c4bd5bb15bc52388f90c996f7e59c8a0351dcba8876e0102c55" + }, + { + "address": "uZKWALKm9AYC3GQxxC1T5i4SZTtDaQ3ov4", + "bitcoin_address": "1E3PAjqJXNY5u1xj4QteKhTsdvai4e8QnK", + "secret": "be694dcc0b7c37ca2251b509dec610b1501ea16cf2dc7e48fb44953eb881373b", + "public": "028fb5be4d87deb707259c4fd9fba441f3f89f171c9b5b39cc7cdb3aa694694bec" + }, + { + "address": "2Bg7DduvSuHQQodT8rDm3zgubnLApfwe1qF", + "bitcoin_address": "1FirLXoxrdLgCwhV67ytDy6RauD2aezv1s", + "secret": "6a10bfa1c59f6d4cd1be7e707320efa6160853bdfbcc7969f9b30fbf0a9626b9", + "public": "03bdc46bff88f5854dd6aacf5a69e8b344a45633c6b2fe46b902188f70d7f4af46" + }, + { + "address": "XLkHshahJQ4QM3XdFqeuTEfzq2B2Sut1gB", + "bitcoin_address": "1DYPSqdQLd18S7YHmeLpdQo7B2kguHam14", + "secret": "48d4aed38ddaf9131b75c34976cd6983d4c35009eda7461217f9f24dcf51c854", + "public": "02ea0380924ec74c9a1e61ad665c283c6dd8e69d5a403318ea0c9f6dfe6bb71c47" + }, + { + "address": "2BPMq8EUBGRyrz8NDSaUSGT9NrFrcDjq1pN", + "bitcoin_address": "1Jw2LZUhreEp9m9rXJLEu5fk5oNiqLrUgh", + "secret": "96819304e4803e15daa655205cee676dc04417c368b9851280c2c54fe509956c", + "public": "02382b4e6a8feb6d13de1394bcd4fd9dab6e6bdf4de96c9f0efd917d5997b94f21" + }, + { + "address": "2GGWkSEStqCKs2kGUa4pDbg4RxHJVhh3DyQ", + "bitcoin_address": "12gg17VT7oruffaALNibUgHJLk7tLcMu1D", + "secret": "e81e01c500a5f159cd5451b054568ee1ffb2700ddf61fd38371d0e128934007a", + "public": "0270cfe30a0fb41dfe30b9d897580ea16a401c4c41babfb41a78b1f20c12caf0d1" + }, + { + "address": "2JAihz1jHZxDVSJ478Yx2cdkseqm6ZfNnr9", + "bitcoin_address": "1GWin6cSffpUQjACDgnuS63YZNMM1N6ZpG", + "secret": "c40ae6bb5a1c19764797563de1eb978ba85c686a379247adcf36426918f8f25c", + "public": "03d8a1fd67726ce2aba192f8358ce9143b8eec0066d80e93333f27931c8c96af56" + }, + { + "address": "2e3SyTQALdRjunDL4VpUkQqZ7kL45twGSvy", + "bitcoin_address": "1HY7RshWXzRdPZoFuhZiPtQrnmEiSyfLaS", + "secret": "443200ff2becf64f313a047c0afe64470a1b79ea56802a2a782d8a4c3b0e8bd7", + "public": "03245acebda4649d21578bd2ac5466470125d9785668e0d0e6d6969ef23d99dfc5" + }, + { + "address": "iXws2tgmeN1i68GAoneEcEzASNosHZCrR4", + "bitcoin_address": "1KKHhEWg4NQhjvcj6TmNY4mcmpVridEWKj", + "secret": "a525b3c37481552bebf2b7f6849d5cbf8d891f804427ceb01b4d0fcffc3e6a6b", + "public": "03631cb9c53d25e67cede82f50e5fb1c905a166569894b2f1a75109253ea455ce4" + }, + { + "address": "RULqwD1WjY678XddBPK3qRJC1KC1MLg5zi", + "bitcoin_address": "1NXJjPKM1LTF5TVnTGHRtJK4q9MADdBrWH", + "secret": "9d465bdd07bbde238dc7dfe872cb05a3a8461893af61ea37f85a8805edce44d4", + "public": "0379f5996ed66ac9a17a990cba9b619cfabf87336fb41043145d240bf88c1c4087" + }, + { + "address": "2e4ekDcVtjG6PHuaeVBd6y7JSiLKphizGo9", + "bitcoin_address": "12HVsJadAe2FSZPhdq2ob7DC4rEJuyHonT", + "secret": "601832e7a373217b5c84c5d77cfb1581069f970c0ec3f96f59f2907a69bb9c6a", + "public": "026302c344271cc040efd6536cdf77fb09f2a8b7cf49a2159a595770e25a741873" + }, + { + "address": "2iLYSsW9o3GGnEWRgcuPiXrmZ3xpKR5SbH3", + "bitcoin_address": "12YRjMqh3rXs6LuYEMHiGNQFLVegzak39t", + "secret": "130179676d01bc4f06e818b9746ebefbb2ae3d7aeeb287e85db1dbcfd1f12ede", + "public": "02057b44f1b07039ff175a24e133240ee378d036fa07b82b6f897ae352b8e9c66b" + }, + { + "address": "5Xx14ZZYBtd32jH8vRaQVydBo37PKDPXSn", + "bitcoin_address": "17YKmfTCX7jDAPU3T3N3pAvcDBjhiDJjH5", + "secret": "bd8f3c1423a321e75bb1358e9e48befad2730aa0eb351f35b89264686482833e", + "public": "024cac9550b8b534595cc4b648335256ce22e25911cfe85e6b50a59484ef0a6331" + }, + { + "address": "28m9mZA2vpkYVRotYxaWU2cAJ5rNA4fU8qo", + "bitcoin_address": "1BYmmpSpYTkJFWTkByqMbBs5GY4d3MRZCj", + "secret": "43e19b1dde61837e9237afd145664c21d57ef0878c298b22db20d9f1383c5a0d", + "public": "02c2d5b3e587facaa13bc9b480be8995b06cdbb83edecc7b9a751342a1dc47d3e0" + }, + { + "address": "k5zSTYgM1JJygeyj1HiH29quDhz7kp7CdE", + "bitcoin_address": "142AfB3RnSyTyhrmQJ6D14Um14pZLF8YdC", + "secret": "037824cdfa5b27ea0918ffaa34a700a32a8d216f04aef0335d775adc5dd47ef9", + "public": "0257aaf74b90dce0b3bcc41b0d28ccbcb6f4bd6c06fb24c283a740bfae74cdc136" + }, + { + "address": "2Q8onKZCoJE6YLfSqENhPyvkHtxvduBy2t5", + "bitcoin_address": "1Aeth9EoKxwfBXpxXNvKW7CQLkUJCwXJFJ", + "secret": "53e6dde235adc370674fa60b7718b8b8e66e37ddadad2c4a75acf50f8d1975a5", + "public": "0244e3aefc7b751b97ca4a0302d31f361a93fcbb1d89ac1b1b8bf6039975c6088e" + }, + { + "address": "2K9tDb6pEaLXzndCDnSEotEiYBQazoDEmMd", + "bitcoin_address": "1MdzubW4X5qohtgH5UsgynVvrfVu6ZTbC6", + "secret": "127cf350a9dd07e2622d53b5c3ddbf73030882d55538746896b135004e9668e8", + "public": "0299325e94d7e822b53055d1400a91d914993b96b78b2273d52e9032710a2d7404" + }, + { + "address": "2Po1yzP4RSDm8p1w1tF2nbwcUcCKaEEoQJq", + "bitcoin_address": "1MavSA5iscNjiuUWSB9sqtBQhRDjHa1sev", + "secret": "74ed922d8ee20fa41c5cbbec171d1248da080b3a974d0784737709749c6d9374", + "public": "0316f6d02dc551aef7eb45cd6d271a333ffea11c2a3b6c95ba84f44b1a7e366da9" + }, + { + "address": "ztvFFxYHYLzGDmW83chkUToB8Htkz8119D", + "bitcoin_address": "18ZCjHpGSfMgSYfAdDDMAPUtxNNYY7tiX4", + "secret": "1696d5006de140218790c9620873ce0b1b605711686a0b9fced1c0b10677b5be", + "public": "025d0053049ba7034a6d227041ee2800b3d4b575506c85b62a0a2e22791f88c093" + }, + { + "address": "22QmSnYryfxUNRpgM6j9uA57Dn7Jhn3JxFG", + "bitcoin_address": "1XMXCGP1eGJT9eHFGBsJC2Qe1oBvRQXNA", + "secret": "05042fa3951fcc1c3e392349d8589cefdc6a1eb6d986f497fce500bcc454b4c4", + "public": "023ec539cc83b92a8121c0e45a3d21ac79c364455efd3df406a87845ecb7f120be" + }, + { + "address": "1EXdxZfNk4VW9ZdXd8VHUah3nBmARtfD4r", + "bitcoin_address": "13BtBjqaTJbzDm2ikvx88vSQeNpELZuA72", + "secret": "291a3c544d77662dd4266425368f39e05b91ca916a8b0b4bcc773567b0bc461a", + "public": "03612f2c6450b0e95960d8b5d6b56dbb12652193f843b30cc9770e46761cdfd24c" + }, + { + "address": "AH5WE6cxeqJ7g8ThBWCt6351dpmqZxEtvR", + "bitcoin_address": "1MVGtN4ZVF8XNaJvtvmx3suZCBvrYZjtLk", + "secret": "387d9f7de29bbcac267ce51dd1cd09cce463cf4daa2e208f5a5caf79129cb03e", + "public": "02144e16ad2e88d743de602393d93b9154c30579789546f39b1538c787934d23e9" + }, + { + "address": "2bUvBzrA2rySkTsTz8ubjxUiLG2X2UXk132", + "bitcoin_address": "144A9YJHxnMLPw5yTcgLBwHLb43YtceQrN", + "secret": "730001c2c9564606fe0148a9b25a22150b386edbc657b81bcf63fe4f5e77e9ae", + "public": "03ae3acf63026f08d3369d57ea42f277c6b5dcf5c2c36f1dbe1d1d8b54b493cc82" + }, + { + "address": "K8jHVZcygoN3e7Uh57nUfQJzmews7rWi79", + "bitcoin_address": "1PpN83j7g3FA1uxiR68YMrgucbkC99Xb4Y", + "secret": "02b6931812541d3cb7de3dcc88c877918d477ca0cf6f25ee7d728059bf11ba97", + "public": "0225b37ef3f5014dd5b6eeefcc480e1b136c28e9147f98e14ffcbaa6ee2283ff11" + }, + { + "address": "Cr2ErUjL1UqhiVMVuPu5o73NDQhRFp43up", + "bitcoin_address": "1P3oR4USRnYP2LsvR1pWG1CdAqCvrevVXM", + "secret": "e55e26e1fa9decc1e8030bcabfe2c996e08a2a009984128e7301cb815d96bd61", + "public": "037599174736e30d76f9ecc5dd1107ba032353641ed7eb6acce126b0018c7ce71e" + }, + { + "address": "2UrDkbr8qkLaUJHMYkXN3k9xvmh4D19Ucei", + "bitcoin_address": "14psMjksrEQ1tGw79ZrgW4SYe1LXKW94V1", + "secret": "4a8f360f40ee58ff53e957782eb3aadb861a6e0ec252339c83b5579c1990a37e", + "public": "03b9c9c0631811a24edf9e79901114d1d03b762561183d2651443ccd65e16568d7" + }, + { + "address": "2SnMjTtr3WRJ6q8GU68CnT3vMPtrXcRLiHK", + "bitcoin_address": "16U7arsrHyV69TbZA382DhJzHGNR5GKH9k", + "secret": "9ca92d31e7fa4b7827126bab0ab02d2bcb608af1e9efbf4ee0edbca3c387fa36", + "public": "03856adf3f6a7079e6d42275a21fa0ce851eda69b1cbfbd96d25f2d72228498b1b" + }, + { + "address": "2dXPVZij2rRzCERmaXs5fjnB2epMy6ftAsj", + "bitcoin_address": "1EGuiWmw3SFrqjC8fM5NR1TCekquV7CE1b", + "secret": "28ca80b3f0db34c13e73b7ad5ff8605a6ce9099f06494a1a7b6727c51c64110d", + "public": "03545172070d03df86e8ad6580ae6fcebb6a775f2a0612d373395279debd7269e6" + }, + { + "address": "aMdRuCA5s1Ak8QqcEn7gmX9xFUJXebbntH", + "bitcoin_address": "15VeCqvPSVXJJqQ8EgNtS9LommF4tCYADD", + "secret": "d24f4bb16b89077ab63a2faa921162f4f9ff33558c6ac33ac72f76af45cd6fb6", + "public": "02866b765a68f1befb293cce71775697e8cd03cf3102a9888f337e5b1703e751d1" + }, + { + "address": "HJd5e87cu7zu2GEWweaf4SVYX1PCxHnHmE", + "bitcoin_address": "1EckWwCNheK2Uk8CymcGSWt3wezyTZ8G2R", + "secret": "be3aa9e7df5bf981a75ed0b655c7490d2611c23b973a902d8dc5295c4b41b555", + "public": "02833598127e11f7935000892baf351e5a0de50a008d5864f9a951fd5449859e66" + }, + { + "address": "RjvjFhLR8UWA8UUBwmyPFV4V99snhSujJU", + "bitcoin_address": "182dmQsWosncV7qgsRsxKfq4PMXrpL56DC", + "secret": "9f17ea1077558a3c898f0d080eccb1bb2385beabf092b3f84e027a9a84fa2e1b", + "public": "02f6ae99ad5a0e79e75f681b8c365e33ed31041d6038139c8f0c46a9cc467b0efe" + }, + { + "address": "smnUYq9hco8u5Q19wWRNtMieS91EA76vCY", + "bitcoin_address": "1zosHy7AS9TuyMfQ1M3LvqdJogaWAUSGD", + "secret": "b813a912be979cabdbca7b9b7d432b6b969c8b7d9b9b0c69f7e697945989aa98", + "public": "03ac5574e7787a94d7e79733f7c1f428805bd502608888a670e41c548cd3d466d9" + }, + { + "address": "2KKp3DbztvFi1Dq7fCbqJW3jyMLxRcVgoXf", + "bitcoin_address": "158vTgueeeFMCNY1BEFsLEgwf4Z9wqP5DG", + "secret": "8bbb021e60073065cd2250b0784e47fb0cca7974853166e3e942c070ad192a95", + "public": "02fd39b777e33098fa4c953b2f98660005a27fbfbea9c8ec8bb96fda649a139edf" + }, + { + "address": "oPWJvhk5tDy222LCYAzJUJZce13cVoZTba", + "bitcoin_address": "1PwQzLxDcRQ2cJiAXZcEtFQSdEvTDA4p3R", + "secret": "0ac8ae1963c9b62b27d6a0dc32a21daab5197c4e81ce81bd5f06253a36b0eece", + "public": "03c29d315728a212c153f094f68a93693bb09aa3868f5c0ce9dc349e2792f0bbb9" + }, + { + "address": "V2KpF1Yoht3iGMEpJ6VKLpm65uYxEmk6L8", + "bitcoin_address": "14HvriRqxgghSSydAn6jndbw47Kg6P6i6f", + "secret": "c1786113036db1edbd2e7e85322ba5b0f49a71b49d975cc503ec0bbeef70c8ff", + "public": "02a7359427fc56d44639ad1823805fe2790034811320361c0884e8dc3f9253bea1" + }, + { + "address": "ghZL4ds3pEAQ86zaZ2VqXaHajC7AWPvazN", + "bitcoin_address": "17nZXg7vmrM6E4dovFzh67h3Um7GYKefTo", + "secret": "7ecedb39e58d7dad0d035c947e350d7266a836533294dd0b645288f31fb6ce3e", + "public": "03ff6b7ae9a48247ae440fe8277a748995d1294ad40175eb63810864bb05624984" + }, + { + "address": "jRzDnixfu9hJoTGA19diDvUZmx4wFMFzYz", + "bitcoin_address": "1NCa34dnw5HKYg8KTedaJPHoKy9iY68zbg", + "secret": "184e8fdc7e1cd4d666c578601f9230f93611f465bce0e429b2e7406f41a249f2", + "public": "030e121a88721a5e312c6508e3d76cae63d27cfcd5fa0d5109a620174bfecc7355" + }, + { + "address": "24ZgZVdovTJGACYDmzTr2UmCiXvLS2BDisr", + "bitcoin_address": "1Mjm5hQ3FwQX7fGvAmsqHLdeVmxXYoTAdz", + "secret": "6201e4a74d799d9322a373d5577466f0b958ebc66e36b0c943837be70c4856c1", + "public": "03cfde6af9a8673a45c7394073a7bef3d5c734ed5fbd9e5d6bff0905521508f036" + }, + { + "address": "9QLaTBBFzbNT7FqtLyr4mC3SjUF81wscKu", + "bitcoin_address": "1GxUyCW4MqzJaonUYDjWsHizAkeS5DewQ6", + "secret": "e14ed2a6506c03fb7235637ec696508d9a4f224130db2112448284d97319f729", + "public": "0257544ad0489b631d7f839ba50ba8d817fce3b68849b014535c7c579b053af479" + }, + { + "address": "2mrdnsDH8GkDxzTfKLGM5Qic6twVNnUzUCp", + "bitcoin_address": "1LvVQK4KsQad3skX1zUD82Eo3t2yXsPnrx", + "secret": "4272244bad296247de956a03b15027018dc3eaa997c7eddb62e11eb4b62a5fce", + "public": "025079ec188d81448851558da00f1375167a99f5a47ba55178c23bd5fd83e8fdf8" + }, + { + "address": "5r1ppyYuyjxLRchj8iR88z2v2YmSjA4uRH", + "bitcoin_address": "1AVFBSFeptALW6xWrFpZ6LFvXadMm6SG9E", + "secret": "41399be04144c30fba7767d2a8b320b051efd72727a73b0eede7503a150b82c0", + "public": "0348852f17e6e423f99a927ae6711f0ca386950dadfd23e87d986e13c049249636" + }, + { + "address": "d6Kr1rcKXZFsbiA9XnAvYraR7K9b14mtJN", + "bitcoin_address": "1AmUDCyFS5w9zBetQwkGuogvcaMJnB3hfW", + "secret": "6dde963a31bd1c4ea9dac7c262a503f73f7f00a30b6bd684d39c7b774fbff32b", + "public": "039e9dfa055b56922799d5abeb4d9ac9afd653563b5827c1c0a3382cb33d32b937" + }, + { + "address": "23w3Mpx7B6T7YzS61KzGRTdFaqqVhfhSPVh", + "bitcoin_address": "16NXiff63VwSL1KryHDwxqa2p7bLZoiLrT", + "secret": "3e1e627486422c1e38525ffd5f3a20b84698337fd376a6298914b9f7ad215cc5", + "public": "03fc41d428a7984ab2e8a86de2c72fc843e3cd0822694a58b33f1d30295384b091" + }, + { + "address": "2UE1RjgYByFJTaZWm7CASrJ1zLpD6A2ibpN", + "bitcoin_address": "12HQbmPmHptHh6uN4kpnMtxhju4ibUDJQm", + "secret": "1658c7ea9d9c887b47df2bf778a2a9f02acc7342c7ee98e16250e51193f70e20", + "public": "020d1c92e2a29a11e5b77449d817edaebb620f4bcf089108fd5892d5e293760855" + }, + { + "address": "2gUQycnLvW5PNbjx8zbX6qqKSMx8AZcbHJN", + "bitcoin_address": "1L1S6nCZ4Dn86enJy5AddX6MP7PLVadnZ6", + "secret": "29990b7a22aeaea7dc196cd588c0855ae29b9cc501ef5f36a0e48493994c8121", + "public": "039a9f1c0426e4acc12d754e38373d7db58eb5fb5eab6adfd920ab57ee786d7b5c" + }, + { + "address": "LJJtdHQ8YwTXyv9ZiNTrCGgh8N6iud2jH8", + "bitcoin_address": "1EEBauBVWaYnhMEWjNLW87WpfsQd5Meocv", + "secret": "0f7a45ac7fa48214e22ae57d598357c6502b0120a53f0846a89d24b278869625", + "public": "03f96bd4d570ad5e3a424ca6b5e1fcbe2baa3990e9f930d8d096ae6e72f41908da" + }, + { + "address": "2erBQmqWbCn42XHgv5mX4FGdYmWwGWNwJtF", + "bitcoin_address": "1NTrQHGbTRQwTXDRdthJu4NmCjZr8BroQN", + "secret": "fc8ca55c4e86af2ab9d79035618bfbeea89c4582c39f6a53cf254fa0334eadd6", + "public": "02950e3d4516dc08c46228b6a77b0f28d73eeea47fd4d31ad9fb9246ff0c02fb13" + }, + { + "address": "pvvZnFhT5braNsvEF1LEDABDLXJPPy9n3D", + "bitcoin_address": "1Hu1qVUepMZG8mAFu1nT6QwevA5Y6P6DNX", + "secret": "f9d86da49c0584a6640aa990599f0d9986f58650eefad763a7eaaa90b747666e", + "public": "0268c65be7256ea4d769e8a723698db683faccc1e21b1fd38a31a591825d07202b" + }, + { + "address": "6SnfZwj1UeVtzg25n9wnkj1dun4ZWHMUwa", + "bitcoin_address": "1DvHvSFg6UqcmbP8Y4iFVK4SfxcuUbtixv", + "secret": "6d3afb2bab90de214060fed091f8dfde04fa19c540d896b5c81495d98e5256af", + "public": "03484096e0e52f26f11fd5bdb501666d4c74cd15c291d038aa9b3f9680f097d6f1" + }, + { + "address": "22Y6d1jn78SCSrea9dipxWZsHMmGYVVzrEa", + "bitcoin_address": "1PQZis9goUgaYG2f2JrbXA7DMLZgvc56DD", + "secret": "0669359fcf951af5c51ae9731c5064bd7c937015ff88842ea15971fd8a01cf8c", + "public": "03004bda791425eb21c1143628c200df0cbe2e26349a175fdcb2a6dd54e135e03c" + }, + { + "address": "c6sPKAa4oJ6pnVdLSpcsfBtvseHFCN66p3", + "bitcoin_address": "17WKchqTSL4GBx7qjy4r4Hs486efvFngrr", + "secret": "983bb4b8c8390b8a00024074b43227e2afeb1b30080e91bdb241f2434cba3c9a", + "public": "037b6f7922f08910e0b282e08206517659565254795299cf212724bc10063a76dd" + }, + { + "address": "HgoqRHGQCqjBaib5JnGxzzqJerYpSQDoDo", + "bitcoin_address": "17VabjUW6MrRTM9SnXDNFJk6WVCwCV9Exd", + "secret": "c43caa26364198a11e898020edb42eb38b48715a7047b4a970b6bd80038c7c6e", + "public": "03b6ece9d98596d9ac7b3e2297c0b321a897bdb539f38c7850a9981ab940a464e7" + }, + { + "address": "vujxJAz6RJrNhwGpRKEHTnwFvTQ4mQwfrs", + "bitcoin_address": "1LL2SVegTtbM85q6xwtL44FAoCGN7HhFt5", + "secret": "031b4b8e634853c180f13d3f8aebf5a44dc3d85eef6f5e86ae3091abf8e49a06", + "public": "03bdd90e83de029d7d1e9950d4ea800542b47fb1bb2e5666ab1b5ba4f5d12c1d05" + }, + { + "address": "HXdBWU4ned4Q19MUJvr1T8BkC2Y7gYJHhq", + "bitcoin_address": "1LQ8vL6Zi4kpKBv3ZVmX94PZZPqonpCnj5", + "secret": "06962e39a38fbe298731924221cfa42ed0ae9abb105843cbac487019252879a1", + "public": "02363ee0442a993d4dad2666ebdc7465e2ad30b38f74ebc2ce5be39cc5731283ab" + }, + { + "address": "2mJtA9XppXTh9o2267QFqmgUc4vQtMxH4Pf", + "bitcoin_address": "17tVCcEGKBzAAiq1p9owX25CYKZu9mnBr1", + "secret": "a3c41a8aa49ac7c989744f59037ab6e7ba02305e3ddb09948664698fb3c7b546", + "public": "025677fc7e26cbff2de1d162979d011fb49c2f94a51ae0049a96354798f8df9493" + }, + { + "address": "2WuGtr54gfEM6E4hzARgeDMiVke4mZGjyK8", + "bitcoin_address": "1DuKSs8ouciMxkaTbBDprPkEYo7haKJmGq", + "secret": "e701ca2b190297d5b5d17fc8e85400e555a1cd4ce59d9ec9039615560d5a77e1", + "public": "03e4a81a81a0b38d3804c998ea6d3e40eca24b301d9200d7a40f47a7bef8b1bfaf" + }, + { + "address": "21SkhMpvCAxvVnVRa3QnKEocXrPbEfpQXer", + "bitcoin_address": "1CT5661bQU3k5nD1nq1nKCKse6Q76ZbJjK", + "secret": "06f71a679c3dba236d942839f9cecd105c93df008dbda4e88502a70c67aa66b9", + "public": "02e0b7a344d4a571cdaf8b0f46feb2007a80c24027f71848745568685a33ce9a84" + }, + { + "address": "2Hch5H6WNpXjExggAWUVUozAZaBRWEWvpsE", + "bitcoin_address": "1PWhL5LoearMctxkm26tTXDU4v5imJKvcf", + "secret": "ffbd71a2fe82aeb6afeba8f7dc4247820bf479ac5beb7a95ee12e1d511736cf9", + "public": "028b22c80b41a8a2fdf64d78ceefc639745b87b6909dc4130c7bfa8828d5aad1f5" + }, + { + "address": "2FRNJ4e3FDtY9c8RALijiiXqsqZNbkHHGsB", + "bitcoin_address": "13WxFikLf6YKYsr9D3GoAQdKgSgPpakLVV", + "secret": "ea2a4ac1c298304f065d00f113125596155c2c99641988240be833c09673bf05", + "public": "030f33fa43b5854f000799468b1802e61baf183baac079e66f124c2a133e3997ab" + }, + { + "address": "iszc3eZpwcUu1GQQSz3CMnN4veQ44yMYRs", + "bitcoin_address": "1H6x13254UfyWFdTDaxJaB4LZADaxLMNfq", + "secret": "ea333ff90f76fb162dae8290d0984043e39cf6339e608e1265fb5b747b49d9a1", + "public": "038f2cbe9174da40beffc058f1a89467b1c37dce1777ab9352992f90a38763f02c" + }, + { + "address": "2iaaVJguAHYeytjfLcDVLLJLVSgPtAxBHHb", + "bitcoin_address": "16FQ5yeeGbx39yqNuD69KBnefYc8bCwWZi", + "secret": "0c4a939514204b5f8a7327b36c491281652900993a1d78d356cad26f4370ea23", + "public": "023611dea864deef27decd48b58def13dab411eb9cdb8c32662f457af30cbece7b" + }, + { + "address": "2W3ep1m7sk4opyxoX3k4CTsmgHeqfSGuZ7y", + "bitcoin_address": "122CPhviwdvp3j5KHuCC8qwS3SskRjpPRH", + "secret": "3b21495ebefdbe33ecd33bbd9bef707648252d3306256b3852f2c1e32cf19301", + "public": "030e7e2017177e74a272c6f231dc429d47d842b86032f9e825e26dcd33808d7052" + }, + { + "address": "27qTt9ETdo1L8WjA38ui2mVctqu1akWnPn2", + "bitcoin_address": "12rXDAcd4P4bNQtdRLUec7WPuarJXrLLAu", + "secret": "bd2722b3935a9f91cb7d158a36a53c33a27f32a07d02f4ea160596d96d9d2682", + "public": "02932a6c3dbb4efebec33236009ed9f625560df67703ce162d8579af9c2c28817e" + }, + { + "address": "dBFXCh3oZmfLEadzRpZuLvp7b6ty6MUH8B", + "bitcoin_address": "1MaP7jdD4eVeKwvaFXfeabgTPeos9xHsib", + "secret": "080caa4dbf128bbb328ec33fc87ccca81171ce16f30697b4198e247bdd49295f", + "public": "0260863678aacc4fd7ab87668e54d7be15a7a762a276070efd6cf3f93a285ee4a9" + }, + { + "address": "Vm38DRDiryXCdiUUy7L3ewfsADF8x3xrvG", + "bitcoin_address": "17suVPBkBvwQX8Sob2nEcjwZQxdaNTzsxw", + "secret": "9f8df7712861e96c82d2af651ebd06ddfe79b31635aca4539a018e6ee3533ecf", + "public": "02d40797f08f3d9ac42c73367db84b4243fc87dedcefe91f1ad44e288e58177389" + }, + { + "address": "x4FCuwHK2B8uxy6TcW7v9V4rMTe2inrjCp", + "bitcoin_address": "1K8VwtLroCAEcWcSyuvuPiahaRTN4K8BCy", + "secret": "ccc879b0ea61fc4960ad3933d592c407618af109c4cc87221fe9235adba4c499", + "public": "02ab01ad4cad7b1bcc9d20219415fb92fd9bc819f6cac43cf36867e8284d41d50b" + }, + { + "address": "2moHfKQdFLvdpdioxUiewyQz81yBKA2T22m", + "bitcoin_address": "16fZA6VowNUUmwDUbkAd3aC9sKAFtBeqx9", + "secret": "cb2e589bc0fc5c3fc5f9dfbaf454f5c5d6eb2fc7be47a547c4ffceeafe074cfa", + "public": "020233f795f9380e7d04c9c8d4639c7d8ec598e4e4c8de59a4c73a76c3bfd4f161" + }, + { + "address": "eNpWwxqZeY1PYuj8M4M5TwoF3jPFsoKifj", + "bitcoin_address": "1Mx4smWCCMxuAZ81zYSWSJXULR78uR1SFm", + "secret": "73ba8fe059ce1c08c5c716300d2bc92097b9dd92fbb0581f624d7b064ba0fb29", + "public": "037382d2900cea5956f8cdedd21e8cd81a63ea0227090deec7f5a7685279c711f4" + }, + { + "address": "2g51QorpyKSr6rrCxf4dD4CeZEYAMURc3dw", + "bitcoin_address": "1DWKYm7Nvedk1WWkkBrsQEaQEkW2XNUBxB", + "secret": "f3861c2d1e69b93b666aacdf0cc2cdffea36c7e7b83dc1718829ce79e7513c68", + "public": "02381d60f8d1803ec10ac693e9d3060b9b796946f503ee7eb01f967c8bd5e5d89d" + }, + { + "address": "2DKTyBvzGiaPU2kL51AVubLGQFq2mjTr4HE", + "bitcoin_address": "1BAV7oUWtFq6iQoKpq6TVSZaFJmXm7ocHE", + "secret": "c3b3d02cea87e4f6c335784d4cfbdaaec7bcd7e45836567c60230f49ec8b304c", + "public": "02274e27234d8e7a0a15155fda616f7e75188cc1b96e463ae399d77cd17ac56db8" + }, + { + "address": "2CFcXpDqV5vNd4UzoHTsjPDTWuryZcQExsR", + "bitcoin_address": "1BiJFwWqXZm13bXp3edNgYa8FACVYubW9b", + "secret": "a239a35c1279ceeaa4f6f23837e92c464e71dcc86a2217587b1c1d0fdf9d4657", + "public": "02c8dfb3b231c7ba9cc67d84b9c6fdae1945f5c61ea5ff9b443abf866e373e2050" + }, + { + "address": "2gDrnTUUeZ1xrC3hCJyXhkrkm79yABLpdxP", + "bitcoin_address": "1PhLMnnzSioFEEi5PEu21pLJjwyXB2fsaa", + "secret": "6c3652adfe9e2cd2704fa0b1181b90ffd7dc4f8a4153a633103057e08b5ff881", + "public": "024b3b047a60af29f997d46cfe157a57bc77bd53a894dc6c8557d038e6d817d763" + }, + { + "address": "5fHL9AfwcqgYEMvjqyX5RVeksU5x4hEG75", + "bitcoin_address": "1B8J5KzJbdrXMBMNQJ2MuvpPj7oouqMFAt", + "secret": "f3451f3fc143fbb7dc7b1302841dbfb29c795dfd86402e2dd625c9870382b801", + "public": "02a858158514e7355b25ade1ff88d7381c3a0bc2b3d0af7dc7a15fc085e3e9ef36" + }, + { + "address": "2BbgUyWCqJ66xaznA5o84Fu64DzBrCTwvyK", + "bitcoin_address": "19TdqBhFRb9ViMo6riHnBCCU26wA1PakRM", + "secret": "17bb9b6b89948673b6faf3bba8c0680ca1b77ee23b16e0b2b23d4d31693de961", + "public": "02fd5e3ac72dbec55b340529bf913c62075ccf8cb399d008c8716048468cb1931a" + }, + { + "address": "2G8GaA8JYfVqj3ooDtkzWN2fNideKU8b9xK", + "bitcoin_address": "1GpGVwonG5D3YTGxeb1UKvzRYnVVyWBovF", + "secret": "770fa4cc2d8f1a8a686281e8aab3ff589a852ae450983bc3accca5080495829b", + "public": "02d69f91cb1e70caeaa8839c1635643b0360f0cafc9d890ef8c1bb7c91ca40ea35" + }, + { + "address": "2BwjUtSuGKCph4EfkthDa2CdyaGzHy4WDjD", + "bitcoin_address": "17KXLhhLcWSsL9R3S6jG5GMVqKhH5n6WCs", + "secret": "b6dccd72e79f39bb939f2efdf1a90868a09dadf400629465e1ab97e2236ee7cb", + "public": "039cc9b2602ab2ffa175f87ad776a1e040555d4dd3485fc09a03dbdbe39c8740f7" + }, + { + "address": "wa5sR5oYKKY5PyqG5rnBCzafjhFmU5Mk2o", + "bitcoin_address": "18TgqhTVqDF2A4c19dST93uRPL5YhLEy4Z", + "secret": "3879cdb11ae8bd760a2378c178b29fd694d3c7447e03d161f8fd19dcfad6512d", + "public": "02d6fb32ef1862b79b935dff7bb5aa868b040749ff08a9dbe8f6054e953dd3504a" + }, + { + "address": "2APKsjpuiYDw7DgC1rK4NEtGCu61V4zAc4o", + "bitcoin_address": "1B7k1rSMzZni1KwzCF861u228Dyvei7aXz", + "secret": "91b23e1ef44587743475ca071a4ebdc3be0e87ffe46657be9299e17b3f0fbdc0", + "public": "0314cb0648861cb94994bc2631a4c782bcf0bdabec37bf3de1a170fd0503b9d258" + }, + { + "address": "2FwB1ZYgAB44ENWpudrpmYujkFZBT1ARF2q", + "bitcoin_address": "1PBcmx7uYGUqi5mi7ovAPbZFUx1FLN35Kt", + "secret": "16f82f75f6ea09ab92cb4110e1a397dd71fbec81ad7faa9c7a54c90875757a3c", + "public": "03017078b4d051aee4050e7dacd1b886cf27432d4e90286e47fd9501922476617d" + }, + { + "address": "WFNNgbZzsTztN2HvLroNXNDjP4y2qz2Wgw", + "bitcoin_address": "18XyRXxaMDi8PGKQKQUWCKap1SQ9V58hiM", + "secret": "b245f9311b8a69ade2b61164e18585ec636b0b4b9a5356b7561950c9b5beedb6", + "public": "029b5a844da9c824f7338a5d759402f7dc871ca4e331f38bf363f7e91cf7057ee3" + }, + { + "address": "JrF81tT3NehqrGLEWJPqTntBecMkZHbTLa", + "bitcoin_address": "17mWnTxuunHFvPm6ZTtcqw7G13UUsPJ6c1", + "secret": "a7fc0662dfd8fd39f8589903c95abc60b22cdf45ad67fb2a5a65dc7e2c3ef9ab", + "public": "03c67fef9d6aec9e842b7915d78a060ae2271b01cb8945d1e14fb8c16ae2b8a3c5" + }, + { + "address": "h3vEzWCwWSGxyEXHhmVbGurjYNfJbnxgpX", + "bitcoin_address": "1Gbv4gBitiA2QkE9RGSfaUD5SkLDoZAUJH", + "secret": "287cdfea83b55bf184e81c0ea6889832db112c8a8762f2331d78caa7cf9baca7", + "public": "02b1104780c99c9e6f9d94ae9a564517362f374c536271f18fdad6334f219f45c4" + }, + { + "address": "2UnSqnvfPVgWXEuNuEdmBKoyJ3xBvPnY2fo", + "bitcoin_address": "16nYYGtepEx9dRWqx72nxmzTJrc8o1MaYE", + "secret": "df35877a008cf9e514c9f64b245b5a3e0ad134bbc2e95ce9557551c79e46fd52", + "public": "03284b8af8e7cf913f02734f74a00a1df9102e8f6e93e826176a830a7aa5324fdc" + }, + { + "address": "VZptjy7VaWQjY5crMtFbDWq3mu4t5Lypso", + "bitcoin_address": "1DYLy3oAUa7ijfXtF5s6DxGijJK3G6bCEM", + "secret": "f91ba72711696fa175a549dbed4efdff703664fbd7dc98dc7c64619ba32e6390", + "public": "02b1bc13a83d263633164df5fb9eb71e913105bf2e6589ac9b5607223f7170b481" + }, + { + "address": "K6Zvz4DHtdih5k8JBcPdcXZRRDhTBWMtD3", + "bitcoin_address": "1hMpKG7QnaCvTFc575rWKhG19v6NNL4zA", + "secret": "fd515d026596d95fd283ea3ff94a3220e58c1e283711f79b0720d8bae7df5801", + "public": "03bb2baf3490d40fab6171d4d2e4387d72f43d40f516e8ea219530ebab2fc19a47" + }, + { + "address": "23WQc4TFLtfZQADK42fTfqLvqd5fVc3eCFb", + "bitcoin_address": "1G53MVdmp4NvqfkM5nSeMT4JqRuchdVRx2", + "secret": "9f49138a3f36e5fe5b2b020e7595ea39cedb7db6c55da6864d15966b118ab3d7", + "public": "02a25227209e5620211e2b5c61f20f7376c83015fdd338f6ab30a5221d71a5fcb7" + }, + { + "address": "GLSoByoK4BEQWfiZ3rbLqLxmSyhfijHrbj", + "bitcoin_address": "1G54e5ZLcxnRdmNjjkj4Gtq8bHU4ABEQpJ", + "secret": "027bf03c34f696cee5042061902d4b15e7f9c5163e2abef6d2bbb24989e3660b", + "public": "038d3c9c0734574ab07c02d905a7c045571803fc0ee93cee1626b3a15b4c993f49" + }, + { + "address": "tNdNWcH2F96PAUtB7pC4n5M5TBSTpxKVse", + "bitcoin_address": "1LdSe8ySHYXri4LmeBRLcMgGZ1VvBWRnBK", + "secret": "e9415a0e3e395800cc7551be12b54bd04dc3c4bd29995a031dbf11ea3121998f", + "public": "02db97fd454c0d93e60841a153d22471ba7e82b6aa2e3f49d19fb4bc52a8c1f5ba" + }, + { + "address": "2VNyTcriS4FrYVotvAJaqmQuYwYSBAYEKjk", + "bitcoin_address": "1CShyB7ybibGE5saMa8iRPGWMmt3jS5BMA", + "secret": "347e2aa0653c13973c2694e3bf368f9e84deada71edc0cd4d6f8b587b81d767d", + "public": "02b4a1fa85c4a9d2a6868efde449a41249bb4f8c1b3081fa9dd0085ed414286497" + }, + { + "address": "2eu6HH8nryPEjbg9TMvxNi5miWwiFHdXEbf", + "bitcoin_address": "1JzFVfmjWygzZ6obppo9WXAWakitmLoipu", + "secret": "e1086f1538f9f99ac01dda8b722c6973ac2b890fbd8c0836115a1ecf8196c84b", + "public": "03e52237f3adc43fb7f086c089c452f85fd9fedf8b50bd1c69965124e7828c31eb" + }, + { + "address": "UG8Dvm24teXpSs4MWY4BpBENnT7BnFbDNK", + "bitcoin_address": "14FH1mTy8UvSzbiZHmnSEbMoFDWQpjb3TR", + "secret": "3bddb147f42c46c265fa2cee35c90c182604618d822e22760dedfd5bc2c41199", + "public": "039087ce76a965f0b3dbbcb3b3532544b94c96d73ee4d41804f358d19648642bce" + }, + { + "address": "dzdJh62tUkWbFkHcEJYNeDrNYF6osZew1S", + "bitcoin_address": "1AmDQZxi6NkE7tWLf5LM6CKuSMngMT1pQJ", + "secret": "e5b4fd658c62ede1ec0a9b073ab9a70cf63fd0cb55a00d173657893c935d4909", + "public": "037a2e8f9a1600a8550a27792d7a543bfeaf4e6183f2ff280bef6c1f8ed85d9d07" + }, + { + "address": "a6zxRQZdY7ZurpcUXEo3GBpX5Kf95F7JhX", + "bitcoin_address": "1Me3o4D43bYrZ5ezFXHdj67EWCLzqHMLQj", + "secret": "d3968dada23fbe55a954aa2d6b34c7570d5846a84b806c052c3a3adcab120b79", + "public": "03db3c65748908d1b55ad7b8c96eb8973df440e1971f05066636f4c39b53262361" + }, + { + "address": "2GGTTctwYB3iHjYBDE9WFxGXJLFBUn7UzXn", + "bitcoin_address": "1KU4KpCLGWatwLZCz8EW2dye84qRb2gF3T", + "secret": "48435832c57f48ee7f19f6a09c752e5c2e0f230ce6ff1904445b39c3e9203e0b", + "public": "02c686311de0b0f37073bef4e2743c2f42052e0258e1dc6541cff2571268d1c852" + }, + { + "address": "2aVNmkkrKkCRSxe5JnX9QnvMhNXwwczk6nN", + "bitcoin_address": "1Q4FWZoDhjKP1fFbP15vdgaDe5ZxWAbESf", + "secret": "0eeef28c43478e967e0434dcd1231af081abd3ba31d80a8b021cf0fdc8847307", + "public": "03881a9cc92cf911a5d1c7e7c7ed6e1f38f85cdf42415dbc27a5bee88c17c52836" + }, + { + "address": "21py334hX7LKskHjLZhUPeEtJ7TYKVqfaFY", + "bitcoin_address": "1KhXz3G9ECHbmjdDVy6B7zNvBpQHwKTTdt", + "secret": "eb9e056f34028cf4546c287c7f4dc37c92d58c26b6546dfc17911359c93ae7aa", + "public": "02e3c5bbe2ccd4edee09601caa941e19847df1e8b40117557fbcf95354b817abda" + }, + { + "address": "2TKYS9gbr3CnSmAiLewX7RppUzC7r8NX6Hd", + "bitcoin_address": "15wWLwptFEKvsJyqWsGi7iY23h2gqGnE1d", + "secret": "f792b0c3e445775b4ba17400525848f3e27199bebd29380474ffcacc1a8a6ac7", + "public": "033ed56d7ba7138d71a213adcf823d9728547e849afcdf02aa0c40f6536537109d" + }, + { + "address": "27T6vpidojqAZgPhFA1gV32hbAGEvxYhrhk", + "bitcoin_address": "1Ffn5QpDLHuKBXMw3N5Y9DsBwUzQiA6Y31", + "secret": "f5b982ac586e994fa405c8b57225d4cb9f79e6823439e930ca6c3675856bf87a", + "public": "033f52847eda3a395ba83baa7aff6c40b6c27cab7e31bbff2e59aad5fcd2c39f7a" + }, + { + "address": "fKRmxuEydH3xr84jJbM2RmXLTrUQY754CM", + "bitcoin_address": "18FhydWFpi1rhjx48xgiPk6oFvFaiL4CsS", + "secret": "26d4a55a93849fdbe9df353a8a94f36fdc29850c26a80af1efd9052d77f7f97e", + "public": "035ef6fdf9d281e09fe89737a9d5aa1ba7a2f353471ccf753035a4d59b084a36c4" + }, + { + "address": "oxCKHFyceqKrQz5ufoNkiNou9vx6yiCxrf", + "bitcoin_address": "19z29UpJhbDKCXGV22TZewShTMxMnEZjM5", + "secret": "7d88523fb836a1e68249bd8b30052e2dd0105f925b0bee6192f318df099e8104", + "public": "03be2cbff63238343dfa80072c431a7fdc09efddf529b0fd403722ae3976ef6981" + }, + { + "address": "3RJy9j7ztK14sJgA5NyoLMLAUNxAFg11Lt", + "bitcoin_address": "1C4GahCZ8M8BjdB6HfYcHDxkGqxW6bjtZq", + "secret": "7476b76ac6ad3254575f2cebf43333b02ca6b263ad06938286c00e217f39864f", + "public": "03755eb7bbd9500055a58a6c05144b2479888bc59d4284b3d66bbc7e9b8d78c903" + }, + { + "address": "99Rq9gQBzT6o7hHVh9mwBi2KWpDrVueokr", + "bitcoin_address": "1HxHFszwGh4iA6KqPVTP4FCSVhHKvBHxbL", + "secret": "efc2a3b8cb9d78f38c3432040e2e2ecc6588125338224a90ba96a72e6df63150", + "public": "03bd8601f987579cebe725c52db9f343744165c023c8cc011b643df1cd0f9c4187" + }, + { + "address": "229uFKbAxjKb3S3dWxGLRUhU7nN2rm7AjJ", + "bitcoin_address": "1LzeKSBZknzWxkUexu2HfkRCJnexd6QKue", + "secret": "9fb9f20b2e6a51603689d48f53f7c65f3fbe37019f6e4dd86f37602599a8c4fc", + "public": "03735784436e95bd5de80a203aebf28f4ff01d51c15bc724cafca7b7681abbc5f8" + }, + { + "address": "R1EMZ6BCUN2euBPftE5P9xMcR2wH6wFyuV", + "bitcoin_address": "1MG3gVT7qnjX331fNSidshfprv4YkoZXUq", + "secret": "29b9c973254a1fde206af582fb3bb1dd6fe5719180640d5f15a52c963bfa17d5", + "public": "0371f270f8f053116ab75c995f06ad975417c10a3bd6134d6032fffad8e8d08114" + }, + { + "address": "KbDQwkTKbeG5WSWJo1Vvp4RoRktGyDuUTx", + "bitcoin_address": "18AJroTdtyMZPy3y3zFTCpuG8aZRsMjEuX", + "secret": "55bf5909518a71986710f11bb911c42c9a2af2714041c2cd5cb85f3232035fec", + "public": "02d133fc33f2ecef76aff19b8e0730a1fb3b63287b1a68023ab5403cfc56d02f27" + }, + { + "address": "xVa8iZKV9oFwgCDooUJRpSmj6GV7HGywBp", + "bitcoin_address": "1NbRtCtZXw388Gxg4YRC7c6AT2XDfvAJ6o", + "secret": "8590b46cec2d565adf8e9463a5a28b3f8e3c6f6ac7ca54e7446f5f8aa61ee7c3", + "public": "033d2efefd95dc97173cec2327ef9ad8f643ef40811cee511e63370ed052904e71" + }, + { + "address": "mhkWnCSekNPca91xzoGijAzk7pK5xe7YVa", + "bitcoin_address": "1QJGGZMu6g8bi5rtxqz5HUAT7fp7XrEhv6", + "secret": "81bef4b4678092a023b72b425ba9518d577e86f5a8b9337f77ce3cacfea56f6a", + "public": "027616c1c5cf8efdd7a148fa20c037c2a3910ad6cb6518844aa56f4b8cc0cbdae9" + }, + { + "address": "2H5W2Jw38hV6eoLWNUPqExSJ8AuQC96Qfav", + "bitcoin_address": "1Mgbh44Am1XXDvMx4GqkMWt4BPYUYumFJh", + "secret": "c3680727fbdd7b7d8b79d7f736886df08470801cb2a868e010b27e4d8414e1d9", + "public": "02811390fbacb53a0b30d76f70acc9da9e06aa5acf0166b8206dbc73c3836b5ebf" + }, + { + "address": "gBqUqD4wvWmsEMk73iZ77fL9QwKXMX2C4c", + "bitcoin_address": "13imE5Lfnag9jKBPZsCnfTENJU5ZQx8afu", + "secret": "c44b381379048198f1d676149bc496aee52a78ae356cc8ada3f6ceded0b8f9bc", + "public": "02603067281ccef6bef438e77296ef76679128c0eaf4a43c215df5dcb08a1d15fc" + }, + { + "address": "2aBtN3zU8f5nHW4z9HgRyaviqQAx4kNoUBt", + "bitcoin_address": "1JRC1aYmVDWjozkVedZXZsQnoeAX4p1gcH", + "secret": "2584c7512d2ec4a9e2836db33adfd709676768b823266260d8ef86abcfaf3cb0", + "public": "03c64e69cd4d2c448425dacbd34b68104820d14dcda260a9e088e1aa6bb13f9832" + }, + { + "address": "MpJfVPxdSwDePFQqzqreFqFHyFPnFvPmxZ", + "bitcoin_address": "19FXtmdkrjwwpBrAHRjnsqUzAepJb3RrDZ", + "secret": "8bf59fcce66654480b1ab5f0d792532b11829ec84b93ee325f4fcd7b7da99fa0", + "public": "02dc2a97e5e0b5986db4d7682928b3d18aad18a4375b2ca4f5d5b611592d629170" + }, + { + "address": "fMXu7ACfhpAddDQUcYMhFVtBjfeXTxPZSg", + "bitcoin_address": "1PZjutS2LUWW8G7ht9MKivMDB2qUz2nmvj", + "secret": "ad848094a7299cf5e485debc38ae745312f1de43297c214eca1712a8ed56aeda", + "public": "022e13429bd73cf57a0b81b2d14e99a6f215ca643f567275b9a4ea48aa98d2bc36" + }, + { + "address": "2HzJgfGUhaszpeqvvBkxTunGQWvMo4oi4De", + "bitcoin_address": "12CLT2bTvU9EhDC7jF4TkLMJjaBMvuoEwd", + "secret": "817eafc5caff271c2a4caa381c4340d70594110ac5a5564b322b2bd9b7317fd2", + "public": "03f2f8dd9b867e863d7afc5e222d49788cc80f937b3a69d27775866f28ee557f00" + }, + { + "address": "TEfAFxc3b7BTnq2nBQNbwNDdNQVGLEDzZi", + "bitcoin_address": "1HLCfL3XVQoMJ84L1bupzLUQpMcCqAVWBz", + "secret": "040e3177db9566e5902b2c8313d31e29aa17015580de4b66b0dcc3a6760fe697", + "public": "02a8cdd0040d877f7553f35021f8ff7bc13cb6f6f7b16d4bf71f1eeab8b417ae48" + }, + { + "address": "MQ9xeCGvPPcQsrjeu1tQ6h4W1Kf2q9BoG2", + "bitcoin_address": "1AzzT8wzx5Dswg8QXcszUNRGz4iH7dR64y", + "secret": "9aad6041f7eede6e858e0379c0afd24f60a9c73346be12ce9fa23bc58607f0e3", + "public": "032afabdf323ebf7b961340fd32b8cd5dceaca5b58f81f3f28bf547fc978fb34c8" + }, + { + "address": "23cxi2zraJZqyHLG1ModJpLBSohWDn7T9ZP", + "bitcoin_address": "1EGSw9KNHbm6pobfkszR4C19TpwPzgWs1Z", + "secret": "cb9886037a6d33329a05f8eb2668f9c68721682ac4f68767bbed2dd087938b5e", + "public": "03923baf3cc7f3e53edf3cdc60c7d64f83649ec9b8ad611a190bfc93f77cf165ca" + }, + { + "address": "2ARxqoM21PhW9zLqreZvoyhG2xuVQBnWVsB", + "bitcoin_address": "1LFKVnHTtQ4JcBnQmYybzDKRBCNTGJC2T1", + "secret": "b8d18a20d90c3be8509e1a1c14ea2a084c546dce3800fcfd64427e8e11cb842a", + "public": "03c6a58df05a703a561a9bda49ac053ee063f4684e2d689e64a57eb415a799bde1" + }, + { + "address": "2hFDnFqkKbfBgrShepvK2DazTQv4Lvcb2fS", + "bitcoin_address": "1L2qWDRxU1oH4resXY98kPzM1tJ3VSkfWv", + "secret": "300d26fcf88f23e874f714b16e5c9539064e74d3e5fd379e0bcd407811885ca9", + "public": "02c8b777679aa8fff406b3065f92815e1e7dd4e06acfb2cc2cf73d834640efba6f" + }, + { + "address": "2EMb44AyrsLU9tcMaGZH5qKMAWURWjXtj1C", + "bitcoin_address": "178Wt3ddQo8WfqzL6dYnCjdAudiY87jK56", + "secret": "2c7d8fbc9e91d0754a184b52363b2c5ce304031b30d7488a15ec53404ca1f81b", + "public": "03aeb51a80bd56711beef6bbbfc26cfeb2356e932fbc3c6c6b8c6d7442b1d2556d" + }, + { + "address": "RsWcgENNPyhM7KHFTo9VCLw5b4uU4CLmpU", + "bitcoin_address": "1BN6YjVNcyZgUBSZi5SmKfrJTJN6T9Bjof", + "secret": "ac9a2f724bba9198c756b026e5df829b8e72df7837182cff61a961a84ded209b", + "public": "0364313c902a7e6197e95aaa85218532b2626b10836d2dcc8078dd18022d3a28ad" + }, + { + "address": "2SvGwVovNFjwS91HNF1vrMjEfT7STTG9r4N", + "bitcoin_address": "1AnyFqqVM4t9uz5Dd9X75cV3D5yZo24EwH", + "secret": "ffb644d19360dd7eebf66abfa70e492ed3a276aefe38c172a11b0284aa169541", + "public": "03f3a1532a61087e9bc8f6a6ba81102d429de7414ae0085ba9f51594e68e3d1a97" + }, + { + "address": "rZMkh43Pod6kpNBGNaBXNoqXotme9NHBC8", + "bitcoin_address": "1H5f9eK2JRr9aXH5221FpLDw7ApGEWB7TE", + "secret": "5558f95e18cf37496521c244e37fc0f842e936d20cb203c3a0e6bc8f6d2e8a9e", + "public": "03f571e0a9a233ce8cd348606b097c728649f7c5c1dcbe0f5ca2874dad3de77919" + }, + { + "address": "2RxvaL652F4Wyoq3PLjr4tFEaSbbeeJZBqe", + "bitcoin_address": "187Pzqvnkm4ps7KAr8QPyq1pS1e9eLMdan", + "secret": "f5b3d206cc14c4b57df04a2fabbbaf91cd6a7e9d07c1d09bde4c0ebaa43b3ee1", + "public": "03bf9105249ae909f87dab44e18a8a052940a17180b4da0f5222f8cb5f2562da76" + }, + { + "address": "2Mt4eBP7iXYxYJD59UET1DpFJSG6HoTavJg", + "bitcoin_address": "1377gVipiUbm3hZH4YJzPjeYRbrsmCppQJ", + "secret": "7ffc75211c93ae6363522dd6b1750ff54204c0f1204edce6e368ca3b771ba821", + "public": "0221463c98407c8e24b21cfa4ec10960747daca19569ea4b3f11c71e98d27da0f6" + }, + { + "address": "qDQMt3d5dYCohkMT5B6izsGHkPRUeVZcLK", + "bitcoin_address": "1NN44uTwComXahZbZqKXivo8zA8a3U5goJ", + "secret": "b683a64ccb4319188831f8ba86c7bcb596da63d10ce89d0ca64c8dd1915cf669", + "public": "02b6a6fa5b9c8ff7836fc761be9ab4da0d2e27c53ebde0d8869a7d128cc72801a8" + }, + { + "address": "2S5Nk6LmUD1cPeVk1gBkVT9ca47EPxrmZqi", + "bitcoin_address": "19Wb7Wwe4EMHsjTX3ckG9tMo7RbDQ3NgbE", + "secret": "d3874feee7af97339d66a43890b16e1fa4e490ad6d8bca3eb69ce2b20fd8ad55", + "public": "036918969f7908670b5dffd58efd16003757f43e647c7698496ef534bb7332703e" + }, + { + "address": "2j8fTL6mXwNG1aHz4xfGLcNxomnNtsDeyXY", + "bitcoin_address": "124M37HQBhdgZY8Sou7RwFLsAp2Yddjxom", + "secret": "0f3bdc50d6664a7b9b1b537aa8c34bdfa648c9a3cbe5f45afa88cdeb15feec44", + "public": "0242704747967357dda0fe5f6f2868e2e558dc7fe8bbd653164cf87b94bf309cdb" + }, + { + "address": "2kEpigdrfgbuN2sczody557JbVjLVd6CtZb", + "bitcoin_address": "1Ge1Q7MBqFGjmwLemLrxspVmZTqKvSYMDy", + "secret": "a34e6bf7b8d3b20500f51695d36b667d9b88ba9f442cf4290260baf8e15bedbe", + "public": "03300db6dc465d523c01152f1e91ff50537804890a0b4457607e5bed41ce268993" + }, + { + "address": "2KGErAn9X6KUykj175VQ6GWkcHTQ9xg4yvK", + "bitcoin_address": "1HA2VbL8VM64wTwThtZSXeNASBGsq4C3ut", + "secret": "c6f96ec8d7b9bbd628852c417ec221fd8cbe301af5800914bd48886099a99a31", + "public": "027b6393a34246599475d26a5c35169431d79ce0b062d3bb25ce4a00b5f469b63a" + }, + { + "address": "Md27STrLZhDXCzeyiWV4dnYha4LLwoWbjo", + "bitcoin_address": "14rdpiuiRg6tHKmmMoQ8NDnyVBaNSAmf4p", + "secret": "2a0b423abe24b1554fbdf5a0cb23b8c537ae9763e94b27a4492ec5f73fe37c10", + "public": "0249ab7ea2652438992c2cda1f23b01678f9de1b037d2db8c1171c7e3a67fdddc1" + }, + { + "address": "23YsH6ZZcyVsVmoKhJ1GgFL3HudWQwUgrm9", + "bitcoin_address": "13yaxH8sjsDX6SFwswut8g3EiQqhNvzu7Y", + "secret": "db525456d04f0fec18a228065fe5c977e818854337937d491a4eeb9401236550", + "public": "022bbdf07624dc2bb2ae619781cf217cee4121fa53267a7e99c275ec9b692f8f76" + }, + { + "address": "SCWSUcZYva8MDEKRY7YmdYRoNj5sFe1XQJ", + "bitcoin_address": "1A4ixPhDKAyaaWgBe8StrJK482aL86i6cz", + "secret": "e0912a7bb851cedca4500657294f1bdd3fb6549f2187d458edd7c8cd468566ed", + "public": "032e20e706fd2f9745569d6f714c6fd0941f6c4b2806c00ecf15409a8d9256db72" + }, + { + "address": "2JgFxPbynhqiMvRREQ45cKiDdsiibSjK2et", + "bitcoin_address": "142pyVHqfMBBWeGDnk945j5evPnVpj9C36", + "secret": "09d3054ad1d287561b31569e18c1d46a3a45ff74ea86515c1d0aa119a993b717", + "public": "031e2aa54504dd6cfb2d6911033df39de005a31bc110916dd046bf15f82fc9347c" + }, + { + "address": "2k9byFja2RVJa4rFc9reVuNdn3Qq3cZFoRY", + "bitcoin_address": "16AGiHUVcLFgZCu1FzKu1upd8DT8TLK1Vx", + "secret": "943b62a940a348d81993958200d8bdfc00c13b1b376478635e07b68f080a6178", + "public": "02421da715e7043dbab22e0016018e4c94e8bee58f4c9335fa115f0c83244dce18" + }, + { + "address": "2MoEjzeLCtzMPv8ZGbkAkQeC5479wH9ha4w", + "bitcoin_address": "19WfSNNon2qseqjyQhndnQwSDM4zbjbjXV", + "secret": "c65414ed2eb2d83ac87c77ac6646ada456573761400108b8e0d05de9a5ce5fff", + "public": "03741c4051901ea5bff8e8d59676f0fd6ed7763d295e92fd1d800c6363da1609ff" + }, + { + "address": "zTtMPPtk2wiUac2uB7Qc1k7JC6ssPnTeRy", + "bitcoin_address": "1Ayid5wsoBBrxEKJBWjZ2Dk5MN4fBh2Grh", + "secret": "79a8da2939915b0da33fe11abce0fe80c7a68e0fc6d372b500fbe06f3269d165", + "public": "02489ef908c3f224d8b8e68d7e9399dfa66ff53dbda4a452d55a01ca2ff7278d7a" + }, + { + "address": "21jfiioBpG4oYW8KjYpSs9cV14aub75ZQha", + "bitcoin_address": "1PETTE74DYTSLEu3a7nwA4Vc3Rhu1wmu4D", + "secret": "9aa3371acdc4444d281a770e7579c42d2b81f24b5e8c7434fd3754212b577bd1", + "public": "03d4e9be8f6b7378f7448435a1043636bf9a77602b6a2446c417c8f0d289cf04b8" + }, + { + "address": "2jhGXgUkXV7L6o2ooBSJTRiZp8voCXsws8L", + "bitcoin_address": "1JkzBprjb7KF83mxWCgn2UUegXhX6zSqJn", + "secret": "312c20808b5c6ccb4305db4cc49831322ed841aa354c5e6f6f78ad58ea770381", + "public": "038aec6a7a2ff76b2ef68347d8cae7b6fbad292a07466ec69ba0643bf21ac3b2cf" + }, + { + "address": "hkQ28aDsUPiqtGAvVdhq9HS2JYGZPvSy7c", + "bitcoin_address": "1DhuvsPix7DQzA2N2bWmnt4wTCUamdgjRA", + "secret": "fa115d4a9929c01d41d7c1c23a197f377fb06166d0207f859bf469e75675c6dc", + "public": "02896b7c2842f4b641a3f723adc9445620f6ef1f6c354846958569349e19f15a9b" + }, + { + "address": "2HXGxGiyTiiA5JViSuYDva96pacPkKEg2DU", + "bitcoin_address": "113vkiV9oQThVKEV1EW4mKQ4gb2y6hK5xG", + "secret": "1091f0c9a82613f7879461d623e5420981116629d8163a6486ee564c95407f9f", + "public": "0277d34e24239b4be68dee716c04c4f29961bfdc89c0f1a90250d8a4a1b0ec508b" + }, + { + "address": "ETt8tPLv7KdEn3isJ8ovCk6Arpt38R8Xi9", + "bitcoin_address": "12i5Cq7taJUfCLPg4i31TivbUGZNJwYj1N", + "secret": "2d5964c37e55bdb7daba25b8f73cd30e7658263f679a9771c6eaa76d73a469da", + "public": "021098ab98d1dd4beabaab7108e2dc267d96085defb391db4797119bdeb7b6c10d" + }, + { + "address": "2aL2T8aem5nGM2dzzkQUZyhoYziUZ2q6fWG", + "bitcoin_address": "1AGum6NprMmXVMNe11pNtB9nhnKKJU2kbQ", + "secret": "ce625aaeeb7aa8d0967c20a572040b71622d225abcde8c7166f0e355163be56b", + "public": "027ab9006f88a03876f9ffa2bdd87fb687f3c9edfcec37bcb4023f7fbed35832df" + }, + { + "address": "MKutfh1PF7dQ2yyLLyVyUyKLrCcKFcrXi8", + "bitcoin_address": "18bmwNtZRLqVb9zmhiicAEMEGCeDUMhcxG", + "secret": "c52636ac3ebdadae875e9a74b264d1b2ce4c82034415ebefb5827e1bb6fd1e4b", + "public": "029ecbd866ab779ed2cd90dbfb34b7283da00d3f9b71ed805ca92c6944ee30955f" + }, + { + "address": "BcpL5eUt2jXBMCUEYJMKbDzsNHqFbapSUf", + "bitcoin_address": "1Aat3CatddK4Z1hLHvDchXf5AKwgH2TSuh", + "secret": "0ec1616139c61bdcd4f93d86c1115077e769080410b5d077718d43715eb49323", + "public": "03550226d015d7cd3298e48acd54bc0a5698905a87c5ada8467d4d0a0565362f7a" + }, + { + "address": "C6wHriSkyTXN1MxkX3c4tDFUw8qAS6gZt6", + "bitcoin_address": "1AEcNbpHdd8vRX9debLWDt4ksX9sYnDYbv", + "secret": "7e74eceae672c54786531c9c37840da266cdccdd334271a4034fe87805fa22dc", + "public": "036af0726c32dbda8b224d655b1f572bcf625bc8701ecc1f53fa0e5ca45b2a5809" + }, + { + "address": "21QWTX5QyFovW5ezTQ2as3ndPtmk5ScYiFS", + "bitcoin_address": "14a7Eb72yUWDV53DNBvFgeu5Qq5gcB9Pyt", + "secret": "65da770ee49d0b6f62cd85db5153a6961d4345f02cd1e460209b9abac795624a", + "public": "03cb526f36a2bc9dce0adaa33c27cb10302927c9ad50de88ea541e81789b246298" + }, + { + "address": "LA9fKvqm5A9k1agtszrWfnPKKjgtu8VxFR", + "bitcoin_address": "1Jq6H9SVZ35DdMcSVPmgHRmZghegxGoHaQ", + "secret": "4e02f9b57a3ad01a77e30951c2ca97ca0955f39a54346ce47311cadcedfc2f08", + "public": "027ca7b0b8a83845c3d1318b3e54ba94fccd14f259865dd770b80443b5631fa10d" + }, + { + "address": "2TxMvLAFWwm145FndHzESjU6HZLU6r4vQAq", + "bitcoin_address": "1MQGuCM8SknsiFZF8aj7sngixQ1XtX886F", + "secret": "c0c11b487b7d307d0cce023520f94c9d2e5d1e656ea3eb2ca3adc1361998ad04", + "public": "03ac77cd63f2176fef590a3a30e619e4127fe6c1b45368682b468375bc908dbcf3" + }, + { + "address": "xd9dBK1mKxiXDBHgd9Eg35Cz9sLbkgcLws", + "bitcoin_address": "17Rndp22RA4oDPbJ7f5PzgLLq9GA4pabvr", + "secret": "ff38df8c6834713082048d42afd3218bab991ca44044c971774ff2fa7a0dc918", + "public": "029b1c4622f0248a0975cfcd8502fa6d528d6a2a6d397601af0628fd09b6c4dcbb" + }, + { + "address": "NwGDy3Qoj6k8nqRqaTQk7r2jUfzLs5AEny", + "bitcoin_address": "1DjYtz7Fg2QcEACokmRxzsRjYJWg6RwQ79", + "secret": "b79e882093fd2adb54b4fa6e408cea0273f8252acd4179540d7fdda6ad367dcf", + "public": "03dbed449745129f24b6b18b68272ff5d9fe3008ad4670adee385b669674f34d4f" + }, + { + "address": "d4H2t1an8nB89LEK4Jt5mWdFokoW1cWieK", + "bitcoin_address": "1FpHfXQ9B29QGteNnPUbdqA7tmTTcmjBNc", + "secret": "4d9d83192e7fed98e7db7ce06a84c0c0b7d909fecdfbe5d0c357f69ac9838869", + "public": "0259d4c22e3388e6720f75481de2c0ae3b45d08c0e1c8ba6876d2cda2c65d2d225" + }, + { + "address": "2jTF7ftopY2Hj6xqNeLGcWv9PtPZoo2JYav", + "bitcoin_address": "1KxQ1dWiawUvchewVyabwUAtBaCS3rFDU3", + "secret": "5342506eefc9b01f50e4844179ec6d2c180e35b28b05f56b8f6af2de40f6edd1", + "public": "03d628a9bb74f35bc9318b7b28ba90421fbabd774cc0c004bb26b567c3beaefb94" + }, + { + "address": "2Zbxb2VLkptcheURB1GvfgCor8c7QMtiWbr", + "bitcoin_address": "1FstRh7eK5fkTYKv9Z2v9iBVaK9Mam8fMM", + "secret": "7c4cf9f367c4e6b48edd68b8c8cd9e8871f7e221374f2b5d8cd3d08203b076f7", + "public": "02aef811f1013bbb834716e05e798f73e5a6921f58dfea6c8c3398b9f3019fdc6a" + }, + { + "address": "2m8BVtBjvPHX5gki7X1BnyiTmK66t35mQDD", + "bitcoin_address": "14p6FXpXNdVQyAn2Y1g8YpYQm8owD3nJeW", + "secret": "b057ced7e5492e9ded80586b5eb2f76114a6c251ed5e39b24c3ec21251fea1be", + "public": "034b17a6fd6bfd049ef97e8784cbf60e107c8221b78d5500cba83aa9e59cf738ec" + }, + { + "address": "2FaK8WZ1F1BKHSjbdhyfSsJsEK3QoHcJSKi", + "bitcoin_address": "1D29G7ESWwP7wfSWzs4ZMe1JhkuAvgem64", + "secret": "c79f87f1bf048398a6472d874391d4cd3b5c7a39a6ff61e086f175640d7447bf", + "public": "033db0c425c4155a970fd67804944b021d40ff2d3551950ed9da5c610a43425d55" + }, + { + "address": "2CRGhkAxp5buiGacrgrfubi7Uhn4X8KHJdG", + "bitcoin_address": "19pjETJ6ibxb224LZL3TWY66XmvteC5J74", + "secret": "26865442a8640529bbe092aa2f91668866ab75c8bf0749f4be250f873f62881a", + "public": "03cc4acb6abce20eadd4ac2733842dc94d8b8af31cc6ba1199190c48bfcd07e7ff" + }, + { + "address": "VNy1SQuLkrD7DFtUGCv2ZRovVoRYTgQxBB", + "bitcoin_address": "1C1Twr24TaeWZh8bPeE3K29sM7kGQQBFLX", + "secret": "246e7490fb721da5d00e3ef037a0cf91e83b9448db618d4e7f1529a5db2f3dbd", + "public": "02c5697d970be8cae8b2f74e5b8482b872f130fd396d317494865d761303c969ae" + }, + { + "address": "gRiFHzstLZD8DYbVGUwy5wnX9zA6yVaUs", + "bitcoin_address": "1BU5rXb7tYHPyZuEM1ZF6WF5tFXhAzyQCW", + "secret": "d1e407b654de28a5edc1e76efe740d22c57e12dffb6651851272e1b50543822f", + "public": "03acd87ee0ba18abf1f86526d38e7e0e38869cc08f612439ee3a30fb3c35406167" + }, + { + "address": "2XAGsYg7bbb6wcFb6TJzSsutWpGQb95LQLS", + "bitcoin_address": "1GMRQqGSJ2gzPeQW37K4bLjT4VMkLnuaHL", + "secret": "e6a4e56812750dd194a556f6e0777f09fea03b4bb22e2529344f7ab664e64321", + "public": "031039ebe4e1d925358ce5640fa9b740238ce14f568d26835927449c5274e8a992" + }, + { + "address": "pYg6r2ysRY1v84tzCunvg9G3VZkF6cD2LN", + "bitcoin_address": "1MqTV7AohFEw91nygLoeHtgLYmHuJ1G7N7", + "secret": "7c553337f10619cd16eb1659a3edd2e897e7687960f27c6fc4b56805b048c3e6", + "public": "02a21ce35dc6e62279f2276e5a3eb684c6f15164218be90b39caf52fb2b5cc092c" + }, + { + "address": "wRT6Q3pkwHcgqWQBMh5QJQgzGQ9p2rDo64", + "bitcoin_address": "1LE7mbLuDc9cG65xgMA5NaadGaXtZTRsDz", + "secret": "b0736043e34e014da806c851fd4ba9b5884871f1a8bf907255d0d75087295424", + "public": "0231bdbf26e1d2bf65a713ed36008a6b471db068266de238ec15d02f46b1a349ee" + }, + { + "address": "Zu6t4hJBBUJU4ovfceA2HL7VSPybkzxPk2", + "bitcoin_address": "18q1oTX7bAAhhVUMoSLFR5N4hBmLXcwMX1", + "secret": "1994b927514fdee4f75f6421a03536eae2fb2af384e9fdd8d070cd1b8bb1d310", + "public": "0220bd88e29aec79bdd0b5ff0117273722f4e27e37e2fda6211489bbe3df06c1a8" + }, + { + "address": "rj8c2gwEmCqPPQ8aeCrDTkJdmxDoScddVA", + "bitcoin_address": "1NsZ1yWN7ZNMNkEvrKvyQpyGM28B3jhxKL", + "secret": "3bff5ba7558f7b7dbb57f9bac31ed15f5c8593497e847124808990dba099137c", + "public": "02f4de29bd53fe8376aee85bbdca748fb83bf80b1161efeaa3e23cc939035de782" + }, + { + "address": "EhEDFabctpkEQaJQ733WLfWUn6MpqZU42v", + "bitcoin_address": "1Bp8yu2vqwFCDeh6WYnRGEDqoiXgERxucy", + "secret": "29da61ba08814ac6cfc1c06e931142afe3785bcc8640ad712d817de2fbb0eb23", + "public": "02c890ef71edf9fe2b1d3b8a8a7cd8e0925e9a55b093fe0e34a1ed5c336b0051c9" + }, + { + "address": "gpAimarggdCr22gAJ4kxiF3aQecXaxQR2V", + "bitcoin_address": "1JB6nxkhNjHkoguu368m3XgrpzmprCAag2", + "secret": "83b195bedb8c8ab123ac337aa943fb8366e87a0b78a46f11a6e99811b754cc28", + "public": "0233a097a9f450f42884d32110ba6b9b384339044ad7abbdca8a9dbd10644c7c04" + }, + { + "address": "277i1qEXLAMWB4EWpimpnHSrVu6zB765nfM", + "bitcoin_address": "1DkqJ2k6bS5g7p4UgDXF6TQUJ3fZRtyHFL", + "secret": "d4e2ab32dfac3fd6db1aa5e48f93369f71fb22519512aa08e27780e900bcab8e", + "public": "02734ce3a6116b3701a67d169c0cae42422bf81f2e16ee10626ae8b2534fffc8cf" + }, + { + "address": "vKSL2GSF1kf1GQ7dLqqLsvJBXbaijecZwm", + "bitcoin_address": "194YCp5aeFtPH7hGjXYs8VFNydAMBNqSFC", + "secret": "1e9ba0985d8e225e6b5df2a15e38503886df0fc2173b3e3d9ac7660a72f3ab5b", + "public": "0321019f74d1f922b8bb10eb6a5445c7fd7cf4e4dd4f0867bf64f43c0be0c0c800" + }, + { + "address": "2E83iNBy7MQyBCuHy42D69ib4fY3PmpJGzK", + "bitcoin_address": "19oJquHfgZCrTbXYY3pU9dkTVpR3hXa78A", + "secret": "ac1edd6226835a859e5fe8c5cb1a0fdf94f68ed17219da5743083aaf93f3eeac", + "public": "03c4b5da359619972014f1f55197d9493e392aedc96d9e814ca71128747cfc20b4" + }, + { + "address": "CpZCFZEjSxMnMqeWWXuo3QgNw8zMUS35fb", + "bitcoin_address": "1C1j26YZXPktwRgpVJmjjD7VcExjwjWi5C", + "secret": "db3c84f4b276bf9985c9a645f92a477fea63e5d5eff9a51c35d323a87f9b4c42", + "public": "03dc61b6619fb09fd7d69559f5c6775651b92c5c988290f481cbb7e7a2fb8365e7" + }, + { + "address": "14fcNNPALfDmtfjt3iqnUx5ECKozQwpNuY", + "bitcoin_address": "1PziGmuTvRUpiAkrckMq3GeuUrWdY2bN5X", + "secret": "00d33565e34e583a79468d6401a4789e7d623fb3e69d8d20b9f4d5751f7d0551", + "public": "0244b282442667183a585263c8a631c7abf0245228829b59d7314da2792066f92d" + }, + { + "address": "yqK6WFVBpuDN4kfcqVqMi5YDVkwE2iuozQ", + "bitcoin_address": "115Gy4PtnJMVupfkF9ggGkcbstR1bLXnoE", + "secret": "e155a8a39e9e4ba79e16ec0ba2f7c60bf2bbb9b70011219400999a920706345f", + "public": "02b55a56bc0b74fd16fd17aba5211421f040950e9484483af788ea07dd3d7183e5" + }, + { + "address": "W51H6pd82ZWMw69h51yqufMkFKKTLJ6cUD", + "bitcoin_address": "1NXdJMxZfMCyLyedYXf3zZY94GmLWu9J5Q", + "secret": "ee32e6b847c7061bf1a351c1b37ab31d7c2f7d530a59757c6c69929c9a50277c", + "public": "03186946c764572808287eff9ec29cb1db45511785f3ab3372d77ba90fb27c8f1c" + }, + { + "address": "WeBMYEagMqSvmHsFA3KuPAaarBwZyXGSG", + "bitcoin_address": "1LC3v7k5Az4vBvsUuXzqdCLYveyb9D22ZS", + "secret": "1b3c9c5dd6b081a20bc2d24262b8007dbc2c541b71d18cf38c21f41451f90205", + "public": "031f28f96a5ea3640814207a223679603599e47b4f5f97f84788263760051d72be" + }, + { + "address": "xDmCFbvJ54uUFsWs9JdMVRc4pLgGSfMJg7", + "bitcoin_address": "15c3GQasUyMwkFFzbjmhXBk65MWY1NBGtU", + "secret": "8ab8de8bcd5b3ca578efc354834fd5808e732785424f14041b5bd88e52d74058", + "public": "03afbbefa4aab3a996d06d66db94d6a2bfe3c73e2ab06866b267322eedc4e8ad74" + }, + { + "address": "X6yjHdHhJjoZd22mBKzPbtmoAdn1c1GEFd", + "bitcoin_address": "1HFdgyugvFuPzBucsfHAnbj7URA3rhsgxc", + "secret": "960bf9bbad1970f6e29a9dc94e7257fd97c2921336b71345575b701853b1b03b", + "public": "029a88fc03edbea796c19081151942fadad9def61bacbe4acbb2d8e5cc32b3791d" + }, + { + "address": "2NtkQYTkB1Gtv5vEuxnJ2rnw7vBx2MaFZ3f", + "bitcoin_address": "1C96tVPycRe4pW4zpjV5Q5AfLVkRsncnRW", + "secret": "244dff8ab639cd4d1ae38e838fcb970d0e409440214aade40ccac2b0c93748c0", + "public": "02f15c4404d16679aecaf06a4c0a84599287f9a672ef81311c85b25f6d11fe2bac" + }, + { + "address": "qdUuCBtnWFPkqoLS4T4QeJhv1MTFd65ir9", + "bitcoin_address": "1G17rujw5mQMMRFRrsZZazrbCdQVe8BAQZ", + "secret": "328e730c6ed08d616ca8740bc05de4144f1f39a89b2840636d13dd9eeb69a1fc", + "public": "033cae48014b7dd9aaf8ac182b9d11acaf2119c4e8b136ea2eb8ef42a75e7b45c0" + }, + { + "address": "Ce24goELgjozPagSMjUJrKdYCwfzi7guUF", + "bitcoin_address": "1PWvFbbBSV1X4cBAUd9TpnThMuuTm45RVc", + "secret": "f37bba7af44d3338c12bd91f95d0879aed78bd8763925dc657faf33f0335b089", + "public": "038ec03df3b4b5c5a51abc135de0d2641a892382732fd2471133b70b9da2a99944" + }, + { + "address": "C5x5R9HUaTp5nr44tX7KgguMp7FW3874Ri", + "bitcoin_address": "1HQGnAGEfN4ro4vZYE7X4Sm6Hbnv95FV1T", + "secret": "fa0d9ece0ac17368976ec01348503cc026a19510218f660ae0abbe6965233e2e", + "public": "029e6d69030cb4730b95648443820e3f974e70b9d7d5ce2a2559163e0463668153" + }, + { + "address": "2b8k8jUXfHnDpEDk9APRWowqVHMs1C6u2xd", + "bitcoin_address": "1LFS7K9ZckRvzeGmAcKWMvT1pimXRf6683", + "secret": "fbe064b4fcd145c2155d717bb1916b1c7d73c1d624691b36bf7df1332de410b2", + "public": "0292d4e8e577b274d72e74b3fb54e56443cc2f4ea586748e86a8311a474457e2b4" + }, + { + "address": "MPZ54f9653bA1V9sDRTgPFgnYWdqdU7ye6", + "bitcoin_address": "19gEDayzWwm6YLJeu2UDxjcFXaoqsrZp5H", + "secret": "2fdf6ae40789196480461853f075b6bf34fda7f118949c4401b5d4c05dca43c8", + "public": "03e3178668134726e267877354a3e34383823bdffee27b3f7edde6b882fa4b2183" + }, + { + "address": "CicfeSE7jKdooXwA6pb2SFVmTKnBd2b2RB", + "bitcoin_address": "1nSAeWNCXiEMZtjrhKZM8nh3RqgWLrPtL", + "secret": "a1f4b57b2de3389fd1b45bdb838b789a7699c5ca1d0bf458d84faa4a9e68512a", + "public": "0343a7cfd8b57d9359de6062547c3fda453cccbc4ba7524656e9ca58bd5e4f1ec1" + }, + { + "address": "2itVDbUu9t6Y1sJB5hqGUECp3r2mA1KEg3D", + "bitcoin_address": "1KTPrnz9WJU5BP3f5VzQcbi9xpFgr11FXG", + "secret": "2b5a9358c31be11e49985c2f6e11c9039e105ca9175980609c7052cd5ad10b73", + "public": "03c06daebbf6d2c25955b3461fcc8fe73c93f1fb35ec46f0129cd03560137cab17" + }, + { + "address": "hmMGDgFx1gEVCA7FsB9Xo2AmiGXnYaZAck", + "bitcoin_address": "183XKTrBys7qfWYaYteVCDNFCHLdtBWGkc", + "secret": "a53404405b2c79359d04eaea710d283371a92e18caabe8e0cd169bb77cada7ac", + "public": "0332aed6d0d7cb573817142a69be2f34257bd95b95e04a7f29750ef284fe248ffd" + }, + { + "address": "2Hz4RbBvSeNbTwhFer6vV1Y7uUfqbN7FiFX", + "bitcoin_address": "13avX3iThU7o5gQdYsLjwE21yFK6jxPzrb", + "secret": "f5643dcfc17be04b092340b11fdad373d4bc5cab710761bdcfb94d76c005383e", + "public": "033fe130623f83bba6cbfeed537952d030f0ee3f99a4b9bcc18ebf6471274e1851" + }, + { + "address": "9Q5qJ39aeRmY8ippsZCiodMyon2wzfhDYk", + "bitcoin_address": "1Dh8bnYrGkopnjUr5AsX91vho7o2dQ98t9", + "secret": "37e970e52d13e3b95c4db1e5e5b8b13b87a03fcc433e81d49912726033ba5b12", + "public": "02d02350a1b27a087cf0301583551ad488d336b5cd2dec48006b6dcf2a08ab0509" + }, + { + "address": "pXys5mPkk4jwQW3xYRyqEyQJLKz4WEypsv", + "bitcoin_address": "19aC6LUJJ7w9awwproP4PQN6dQvD7sAA9j", + "secret": "381dd50ffc4dcc059beeada39ce30da070c0fa67fbeff5f4b183c2c3e427e7c6", + "public": "021a36d9ab658c57ff3f5734eafed081feed61ae1d6e15f0fd56bef992ab9a326d" + }, + { + "address": "aVp2GMSoJaXJp98jfksbyGxUVmkyYCTyHK", + "bitcoin_address": "1Ex3HU6EL5gfE4WVJgExjz4EnEWbe8qTPL", + "secret": "9598203aeae46c16a3f57551ba6541dc83052eb62bfffa65c67beb66e2468c16", + "public": "037985090f64098cbe218815361bf49a1143de4260e85519b9bbe64a18d7a009a0" + }, + { + "address": "2d6weK4E7LmeQ6viCECBKteexwQfmXJefeV", + "bitcoin_address": "1NGTq3KU34d8FY9GFF9nBKKjfw3FjroabA", + "secret": "55c82c51607d2612d2c558c87c0ccd2b1c1b02a16616d632f09eded8ca9eeb5d", + "public": "0378bb0f40994c3bd0d789b5cc48aea01872136c0e25eb27e0593c4f8fdae2b63c" + }, + { + "address": "17eYicrsFCUDmQ9Ay6k2enNG6kDRpH27Um", + "bitcoin_address": "1NDfaAVJ2vayLgpzngTqDyZcDxmGMrks1u", + "secret": "1d5a0997833672800fbf7f55b9dbd5eef6bc53c033c0659db8a474faba7428bb", + "public": "039fa99bbce21aaf219d1eadd3c9851280b447a21f5e42c3083e01243093f5d237" + }, + { + "address": "2SSfBC3MeLVgb3XyBGGXsKYzckjCbYKUgsP", + "bitcoin_address": "14Z3oSPPKJjqi1dTqXDFmcZZa6U1VcDBYK", + "secret": "c948107863c1f274f82c8e7759521f575b616fc0b593bb7a3f16cb84337ead51", + "public": "03fb19b4b9769665a86d3554ee26b7e44585f6d9a90109a915cfde83271d7bc5c3" + }, + { + "address": "2n18ViQiVXuUqwjEszaSWvi1kANDYKeQH5y", + "bitcoin_address": "18g2YNhZxUVnQqHxSMi8Am2JZ3gYfD43EK", + "secret": "497d87deccaf1e7c30cf18833c580ac4263ae6e010273805b1940a0e652ffc3f", + "public": "02e5ee7a913f43f7f6adeb6a6f52f0eed025267b930426747909af342b5123e106" + }, + { + "address": "2UmBGe17SSXBpYpp1t68zCU9ojfjk66dYNH", + "bitcoin_address": "1PwCseJHh1JxntAQm7n18mcJoWaGsqL7hV", + "secret": "d42ac161ded15f405c83b5bd2645ffb3f9c8f28095dbe2277de723395550a453", + "public": "02118d8b12f20485921989d7156e9cd06a9233abe03286992fd94116fa57b8df4d" + }, + { + "address": "U8YL4g25u9NnpALPn5aBGbosJXidvCooCr", + "bitcoin_address": "1PWdNaa9Ypu4PrTfxGZ9nHL2fMLqiUg8fn", + "secret": "b6b75cfa9529e12e39394a5852a077061b172da0cd6090a4271f4f942b82e7d6", + "public": "02c5094141d4e994dd81e81e4e91a6b81051370b96ebf41a624f3499f9b4525119" + }, + { + "address": "2U2k86ibWdUoe5BNBj54d96sw3rFYXnSySH", + "bitcoin_address": "1DUHTKDAzPxzZXaSekp9i2Ap692hHAHDVH", + "secret": "e715f598acf607c8552679d0d1833e4ca10aef44e4d662aca8ea84adb71840e9", + "public": "024041c3512656d1736bf7ee532a726ff43a4b4b93a89cf437640ca3f6f17f8eee" + }, + { + "address": "FaibKxHFYdqaorDr3KYXq1pnAYE8581MuH", + "bitcoin_address": "1m1QweuNthpiV55wh6C15D532mT8QPSUT", + "secret": "cf2ebf9d3f6d34189b32c7e7730de432e6ccf9858becc80be734523c5876ce2e", + "public": "02b6b3963a2517bc2010d3042e5e8e595c6074538b22db7fdbcc0c2d6cf5931922" + }, + { + "address": "pB9Q5eXorXGxNZtxfr2Mzuk7xFBYNpMnEo", + "bitcoin_address": "1EB6J1hGoUj1PgFJicjToRqaVJvrwejgBP", + "secret": "8f92555b725ed6e25a5e5805f53c5624b58a9706cb144d5a07d60509713fbdc7", + "public": "03c97d38b690b41240cd7e1bbf23529d178742736d6f1ff9f5a8a688747eda0e71" + }, + { + "address": "2Rbxzsa7C3B6cYTdk3Fun32woki93ewxvNu", + "bitcoin_address": "13PFYnCbBNjrGtuxnFUtuwLrNiXmKMc4kN", + "secret": "bb6d4b2d400e6c1b631eed7d4f572fabb51081327bb6645c425d9663e0ef8a12", + "public": "0363d28fb085932c0cfcc17f1174fd70973798ce480af85ff4430bf0bcd4715199" + }, + { + "address": "Diq3gG7K6evBUEE8osDTPq4QKtXzbxUtDi", + "bitcoin_address": "13Sub1greCzauuWrVUSiP7F3z4hzZWtCGp", + "secret": "81b5d2598b5dbb522a57b67073bbb6a130f0711923448dff127c02861b03a946", + "public": "03b0bb0ab5ca2984c0f0fcada6907ca8250d22a001ee69380b083df443265e3a98" + }, + { + "address": "2epzEVetCYHwuGNZefGrZmzYtpeaHoDAQEY", + "bitcoin_address": "1LiEM2FSEannkHC6dAFmNGuJWLLWypC7XX", + "secret": "8dacd77988acda3ff11b62ea1d8ae24b45d398b43f91147cac23451c5b68afb8", + "public": "035afc03e6b69359125261b3c78994c6b04525f09b0ae1c5111357be772ca88aa1" + }, + { + "address": "2Qkx7LFzEfxJzqWRPxTGjE4h8sFwnnfZSsw", + "bitcoin_address": "1Kdmj93Zs47XgEBrL6aYwyomb7urrW451H", + "secret": "d828a1ea868827488473c9cd4347c10408c00b4b42c649a975f9385560128607", + "public": "0381df65e2ae07acc12d48e09253698fa510bcc9c9f8ec34a136c9fe248c432103" + }, + { + "address": "gj6RTW7z32ScNorWP5WzHCgPPrh3KT8kmU", + "bitcoin_address": "177Ra6m5CFD2SPqhKEYsjEptnx55ZusYiK", + "secret": "6d10041a9ef43512dffb1a94c82171ae2afecdb62a729c48072a877967d2264e", + "public": "036bc174c86d63f4470e151ada6b664dfd7c29bce402543ed249aa7ba67568df00" + }, + { + "address": "zAS1wCFHtdeUgwRWFY2N4cMCPnSTLd5R6A", + "bitcoin_address": "16Lke6w9MSb4xqVz8t5sgFYx29n1Eb1o7J", + "secret": "0c072c2ec7c3a4feb9b946856082b9ee4f35295bf9b278349a254d3d12260c80", + "public": "02439f39e43b0a399cf84982f1e7085b5a2c0fcc248aa6ff6a7a80e1260c8293c2" + }, + { + "address": "6Fs7FRMk3GN8Z1wxksyJQTbmwjgZPcT3Qj", + "bitcoin_address": "1FeJ1B3FuAWvuys42SebULQ4LFB1TcVfxy", + "secret": "11fa5cc4f1da12b142b18f031b8de70588492f3f7c136b8227236da184bbd17b", + "public": "02773f6b07f15b38a96b3f3395206513372e92376098c2421bc8778424ef19a199" + }, + { + "address": "WpjbGPfvrPARdjnfARbsPhA64BU36oaKms", + "bitcoin_address": "1PEkTpk5VFHDhTPYJBbKwso1Se76GLcAqd", + "secret": "a3ca77abbd98c442c15ec3a9d755f708474576986d00a082b4999939786b8bd8", + "public": "03a4b79952218f7d035de076d464eb61ef837bf58db060a4765462c95b4342a8a6" + }, + { + "address": "26XKvqVnXe91pE1a6nnfZyjHRmNcHNQX14Q", + "bitcoin_address": "1EmTRjqzmgcUcCJ1STFCXBf82TGdhtPphR", + "secret": "816345565c3d408ec600f7f012185e5e35fb201a2517f56235e96730021a032d", + "public": "02d5ee48f9e78e6ccfcf20716ad8991624df0e2f08f9585071852d7cdab2505306" + }, + { + "address": "6ymppMLFLv9hDKngn3vUGXuKa82n8fVNRX", + "bitcoin_address": "13Kh5TxxGzb9W7U7aThN1QU3j6V2xYCbKY", + "secret": "04341a22e621f8e46dace5b8f4e6b4a7160b864474c04c3d96874e02d1ef1277", + "public": "038c519a633e90ad55987f55ee03acac4bf269323dd3e5367597e56dab4f0a16dd" + }, + { + "address": "3BfpvXz5km93FKb1L9q3e4gZ5tiLoNN6ES", + "bitcoin_address": "1AT6AMqfV22sc7KM9y1QAf4Quk32Jax3Jt", + "secret": "388a333fde8f497babb32008b17f4172849320f16bdd6688fd6582a52d61be2f", + "public": "03ed04ed7f880f3cd8290b53ea0f41f44f227e842abcc43d73a9640e5ce216a79a" + }, + { + "address": "EaBntaU8c9V3EnfSo6uALdB7NVNVm7BSfU", + "bitcoin_address": "113WqRbrKWicSNXbPc9uH3TXYq9vLMbMK7", + "secret": "2f0cea8d8d0be0bb2b826b813cd24da9bc6a059f785dfca5f372d1fa3ed66020", + "public": "03893d78ebea3f3835ec5b88aa5b0fa616a165af23384328a1689c684af46f74e0" + }, + { + "address": "85ewkkmYE23QsaJ8QGHDQ6c788CUTDEh2m", + "bitcoin_address": "1G8SGum6vH538P2zNPoK7w8LZx69k7ucrZ", + "secret": "8156a464cd249208b3456c7c1be5d8ecad3d42212278cb5db58d036503316501", + "public": "02cf694432823e75825bf1a9034c2b7ad054210bad5d58250b0dd8e8107a808abb" + }, + { + "address": "2fkBZZHm9KzJCj9uTwyU2EKeGVGaq2T6Tsh", + "bitcoin_address": "18SAfu6jwVDRvaDYi4H5bboRggFUCKvgoi", + "secret": "1ba157b63be9213eac9504fe35bb9b8b8441256bf486e1184d1ec95de2360b62", + "public": "03026989d4b9ba7c82055586525a3081b52ef0bdec1c60dd72c5cd2a317d7b7b9a" + }, + { + "address": "shgRMgZie6idoREA27V8zzB4YKHp6g3D53", + "bitcoin_address": "1NLzDQToztsSpTAjh1sCSeB8UNz2t3u6tT", + "secret": "0b530bc844170e8c96e2fa0270bc25b18158b1cd0a0dc335a2082ad78ab952ce", + "public": "02b9be84fbe4377cb38084efb37101296fa74871438153bc7c10b50e648a467f59" + }, + { + "address": "2WXMUMWm9BxPgg1nu8Pjo9VAA3kv6z1wctC", + "bitcoin_address": "14vQabaGBQ9kUxEPj8kyg7vYAshJsDDQhH", + "secret": "677e5a6bd11d2d7950ed67cdf19b2321a7ef6735793540615d7dee25f4a89099", + "public": "036d544ff08e196318752c2d0694cfdd2df265fd37f8f701309b206169c894464a" + }, + { + "address": "9h7vgZXrxvpSNkh9v4di38NfsAAoCKxdTV", + "bitcoin_address": "144cGMxabwPSa6c9pynHPRmdzuVcV389EN", + "secret": "64687125d8d1d0301bcb7c7f8254148ba674f2fd7976fbfd478e388e2fbdaf34", + "public": "03dda10d0169d9492fe86e73dcb4bee444f8655a3ec54630599e1873b49d62361c" + }, + { + "address": "2A8uy8LLb5VxUt9z2V2tqvFJZujEQKBvHk", + "bitcoin_address": "1MkNccq22S4k3jeMVA4pyPCLdL7iidDpu9", + "secret": "4418550903f77fb6afc475aa45f6d46385505aaa261d3333782739aac63775c7", + "public": "022ed942f2c7f4ae006a56d40d2f2973a9f6489539712b09755611e519861a915d" + }, + { + "address": "QcURHwLk8cNaycfrcB2Rw4eLojXTXFafrG", + "bitcoin_address": "1KUGpFXGdfKQQbehmNL2u2EbkFgFvEvbzP", + "secret": "22ca073353e4e79b3568d7f273bdd4d7798f32211856394caa568c06e45eb379", + "public": "02a633a0584586a40799160dc620f5198cbf9288ca1e067cce1f9983e7cd536616" + }, + { + "address": "251iuEvBheMsacZDSmnQeekfPtwjQpf33hH", + "bitcoin_address": "16BCBayxkvr7GXUP4TKxjpkQvEAkRjSyQp", + "secret": "63751fb3da5decacd945ca81560f083dff8eb89807b8e9111e306e547578ad5b", + "public": "02ed51caff4445482542a0b6ff7156da9bdf7cfa8d722c7b181c1c402e5b33beea" + }, + { + "address": "CJPiAxCd5B6SEg8gwPDGFi8wfQ7MmmCY5U", + "bitcoin_address": "1MssPwu2xKWjr8Grph7Qc2tCZyTFLd5ydF", + "secret": "1ac56d8474ba1909a44e93fd62516514219c3df4b1d83a0caa3cfc8a9926ae98", + "public": "021c30a39512cd8ae0a1dac9bbe80031548c2efea00046312e84bb90265c674315" + }, + { + "address": "2WngTwv8JkpeBGnz78k9WuzUYhspAcjV4zF", + "bitcoin_address": "1Ju1LQC7wwMEAWTaTyeZtkSKh7inFredSH", + "secret": "e077f3e181e3870cb6c3f3ee95b61c3cb61a05c40661073729a71e228940486c", + "public": "03da594d2e0fa86a0e77bc47b832fd1f270189b8e509dcc14e801103a202388467" + }, + { + "address": "282LaqNpQNhgBAGQW3uVJgTTFFbjX1qvAEp", + "bitcoin_address": "1GZbReUqLxqdKsT7TmzNhL4u8XFxmd8PM2", + "secret": "26e1bf94fa2c8a12ea407e10bea604142e7b81c879cadd378a8c151503a1dbcb", + "public": "03609ceab8230f56a60c6d85f9a4ee0b5f3275ae6ee204c297cf3906404a0e607d" + }, + { + "address": "2M2nyEzS8KcEgBHTFpTpQu5WuCHMqpwyaZQ", + "bitcoin_address": "1FxoZt3rnZFnbfBYnm6W2kb9grEbpw6vKx", + "secret": "485604374652f35a5812dd9b75019d7082209c02cf775e837500fd0233436a03", + "public": "03a7cdab6917f1f5d458774a1a6a37216da8476822bc1f9e89c66bdc7cd0650997" + }, + { + "address": "P9xPYDRBaZxSczCGXnkepWtZfvjKWcjAJr", + "bitcoin_address": "19HaMHSrt7zzCsQRh3PeZnM6Qkj8RF3eAW", + "secret": "9abd8aca5eb851431dde8a2aba245fa3dca2f196596c75bee0b4b1f5c54a8bae", + "public": "02baac3167bc9450f0595027f30bdd5fa52e8e7e2c3db98528b4bec3b116ba03ad" + }, + { + "address": "23avPf1yDCPwYDooFJ2uA3ygMshBq24oa3b", + "bitcoin_address": "1HaXbpnvLe1RMCq6WXTpUa1Yv2ArvFjFxa", + "secret": "425570cb9fd473ffafa9c3b10aa9658301e94171cf6625b8a0c8f1a1f284575e", + "public": "02b3c25bc926088840fe0325c4c277d1e5e135ecc47d77ee30135824767a682af3" + }, + { + "address": "MFY41NGXYtAxyWsrSPFGojAVuLRUS24tZ6", + "bitcoin_address": "1HEKhcSEbcXwR7couU7HABPN3uSRnJL4T5", + "secret": "aed7361510bb9fad15a1efb6599d7759ae3e4c154145f386e415d2d86af09b3b", + "public": "027658dc03f023433ebae5b19fc13110b8bc81786355a62cb0395fc4f3e44f200f" + }, + { + "address": "2mJhg63fvEcfvHkjABt1sqhsV9U1R9fi67g", + "bitcoin_address": "1NLNviCRDCqPVNFET3Z9zEuE7Z9D2yBvjf", + "secret": "c0739f6996b0fece57a490c12a6b037739526f709e56e8ec93db7ec58b27a341", + "public": "0383d00c097840d92b66c828d555f038dd23f160e1408394ab9708ad9602811803" + }, + { + "address": "B7uERaApqSwMahW6VeqZ2HekW6EHSRLuhu", + "bitcoin_address": "1NDBYy8MenxUDLVQhyKJZjnFbCut9AMaHd", + "secret": "e68379b76208250614afae494bbfe5da612e9c0de863ad2c916aae46f5a92887", + "public": "0256404e09850fdbd455763e45b75b79aec15b5eb005cb89b906fa5c6099f84ec3" + }, + { + "address": "68qcyx2YJY1C1sFvBkSPpmqpN2G88e2CvA", + "bitcoin_address": "12RR5aHhW5N8RHqfkbkRepHusRhbLbgrYf", + "secret": "f9adaa10140355edb590e61818712040662491a6eb59765fd3d8364badcb27bc", + "public": "0321c06486d367c4c40313672c3b6998c7291e3cbe0519e13827a7c4049d5c16a3" + }, + { + "address": "2FaMkeRPxhdiuDhUhXqLPv15pnmsS1oSkqo", + "bitcoin_address": "1PqAiUD8AwduA8enXhK76Fn22UwmBNHMN2", + "secret": "f0ad71ef9b7bbd682988ee3b7ec68ead4c9e7dae2e0fc41813ccf719b6ce2857", + "public": "02647a9839758ed0830bdeb1c1ce2769acbe4e8deeee42ee745d3d7f18e8f261d2" + }, + { + "address": "CFdDHPNwmVk6WhC39WCvWyrzs6SRo2bLXz", + "bitcoin_address": "1PX5QJAP82u3oQaZPsrPHGHst2sbJFtJDH", + "secret": "ffa8b3da58c93aba377e1292afc33849cd796d826d185aa04964473f0e978343", + "public": "0288f6df8b041860d17fd8d991c87a164ab51905f79c85bf93930042ce196c1df9" + }, + { + "address": "FKmFe5i5z2krYxQkg8NTq8PgPXRdP6xjLs", + "bitcoin_address": "1DSHDMjYrsaQtJgFrEwapruCwz4FboVQnP", + "secret": "06e70a542984378260026ba1a0cb09fec849a6e3de827129be09234c45959046", + "public": "022df795fa62b6497c171898520b4012b89ef28e66dfb2ec4c01dbd83d6a633d08" + }, + { + "address": "NxKCPRWfvHmpavAZw5MjP5d9JcXieC34Kp", + "bitcoin_address": "1LJZTQWRBHiNQLZG4o5CBP4dNjH9AZqE4T", + "secret": "9ccb0d6970a675903491fe280f6b07dcb018d3d7e470f3c1a6ec2984aaee7bcc", + "public": "0220b8d468f5f1f65ef33948aca4606fd21bc8b908a28f14b0de18dd18ccebb838" + }, + { + "address": "RJgPnJMTKBo7KuEDPd7GQQB4DeEtyczUT5", + "bitcoin_address": "15bSLsp93ReM2KjDyRigifmHKxxGEdWYUp", + "secret": "3a765a74fd919c407a95ce6d2ad9491641589a60878b785d9e18639e3ed185da", + "public": "03fbfd66876c8200c688488876f227df16a665e50f455ad01b3264658797c54f73" + }, + { + "address": "2ZK6KxmX9T9qk5UnFb9SfNM8LvrJejux5kt", + "bitcoin_address": "1FekLsMeUzRL7Ut6Nm78hhz8B6AdAQpFJe", + "secret": "0990c94bb8b0d8f7cd3e7e097efc6e85525720992a9b8af9bf1f2e5127f11277", + "public": "0393941b893f7b4efa9d0ecc06df1b55d46ade9fe9b385bed458fc172094b9cbf8" + }, + { + "address": "2N3RdM5K4r3eYmHCFDH58CnUGx1gFMmx9o7", + "bitcoin_address": "14an3vbKXX3W6Rvz3oKJtHWvcQkB8V31k4", + "secret": "8cb43acb4b196c151e45227fbde9488d9e15bbf8da3a1b45b8997dada8700cde", + "public": "03f6c1da3c8f27ab64794a00599887c97f32cc9e42a822451ecf26d508eca9ad82" + }, + { + "address": "2H1VNSr9z5w1szqtva9bRUCLXsyvLNSXWrq", + "bitcoin_address": "14ozxgr3pVRfmJfQrV7M7kq9tYLEE2Hxnc", + "secret": "b695dcc4a615914926331365f1e894c6efb33078e44d87542bee580574f075b5", + "public": "035020067ebc6f0b5ada96bf2ee82177cbe2fab157cc6733cb52a05047e122e0fe" + }, + { + "address": "msNB3k7p23RwHgHhttqpuvw4psfysq1Rkh", + "bitcoin_address": "19FN1UmiS6kHUfjTwtxE4UQgbriyxhqVn6", + "secret": "75b36b96993b83d56a21376aefb2638fcadc03b3e1a1d67332aa4d5e05842167", + "public": "02cb48b18b854d05d3fe595c9036a3e0f486761c43e7dea7858a5378b97040f5f0" + }, + { + "address": "2f7axMoMyTFgCbkbsXvi7zRYgQFdhPZXh6P", + "bitcoin_address": "19hD1h8EdXJPqPGt1HoBHLQboMfD6pMXrx", + "secret": "04fbee77d3726559ed06eb2f63c11dcc231547910d70869a0e061cc858efd0fd", + "public": "02594db5ca23a3c18801205e3aa94b1e70e1eb632ff0e5fe092d1b8f109932a9e1" + }, + { + "address": "4nJxCkfZkzFC3Gcng9yB4jTYbc9jYoeWui", + "bitcoin_address": "1JcRdY6QrVYtjtGnYbFFkuyQVWDyRXF4M5", + "secret": "7b4eaa2f5be99c3ff630558e26ec8df249d2f3faa2f6d5e150ada68946e56024", + "public": "02d6e473a3f1d0ab1d10f3e49b22a0f10a0c7aaf6a91ea20a4c0cc402e7be557aa" + }, + { + "address": "yuGQw5TzntwHHSFZ3Fj1yNfU6DuVtrK2Bx", + "bitcoin_address": "1KmaDDTMZKcFbqkdY1STcmCfRisB8B26E5", + "secret": "d716d9193356f96d634913768b0a9fd5c76378d87e472a20afb086566b17ba7a", + "public": "03442b91d87ed6772e0fb557ba5ad2b481c78cca2730b4ffbc0cb637c14472f054" + }, + { + "address": "1L33Kg34Gj7yccMoJKXj2ivzQyxihoybaY", + "bitcoin_address": "13Re412JbF9DFSxTnuWD5nVSted35D8ZD6", + "secret": "4583af591c90d5df33029f874c76ada794ba7ba2800fbd91778131ab8fcccfa2", + "public": "03723d1d42bfc722cfdebee030af95936030f602ce3c464593eac6bb048df5989a" + }, + { + "address": "2NwiemjJATwoJ9r25Jfmi6biyYtBUJqZ7vD", + "bitcoin_address": "127q2ah8LSQdME22dB7ZvgSxZjgpSKATpJ", + "secret": "c96a2a6ecc7c964766e15cb3e6e976500153b5d6192d8dd4520a8ac9077bac4f", + "public": "03054413578006144e776be5d65c171667fd0466f41c865fffa8d8ca4f58d3b46d" + }, + { + "address": "wh6cxtvGracfHfKPga1Gw5aAYL7YjiaoLV", + "bitcoin_address": "1HXotrAs4RQwZKbgKUKJxgPTmqdfLckhVB", + "secret": "8c2e6470f1505d55fb80d4112807f7dfafcbebb3e33ed5e5bdf844fcd8415e09", + "public": "02a8e00fd4e4a06e017c17f3d93edac7060a8f97ec4c2226552b6881d94e102449" + }, + { + "address": "2jTGRGAkWVojYeNrJ1PtE1ppcq2mt2dCQP2", + "bitcoin_address": "1C8dJagcCGrjb8aHN2RLgvVW5yE6J6KQyr", + "secret": "f41b9f940cc71f9fc889bf8e1c42df2c8cdcfe051f6e9c0bca2f3567f991d9de", + "public": "03de30a46efc8ae7e14926487fd940bfbf9752fc48f8260d17362e59fcd98c3326" + }, + { + "address": "2gunAdaL2kStrQEcaiN3wYXpyuTZVdCQgJu", + "bitcoin_address": "1JRNLVwqAsTfBF1kWXi8Ho5zFpdfiMj1bv", + "secret": "ad8a98fea822a9f6e3dde77720ac33b645f1ee653653b5002daf0b51b36054cf", + "public": "03e71f0b9923dea45f5b36f03cb39ec95091be101f50b515dc4e7305786265f12a" + }, + { + "address": "2aqkXB7Ktc9UqD3cpD85LXWM6K15sExbmjd", + "bitcoin_address": "1G7HLq8tkbroRFW7aNw5azq11ZGiXoph3c", + "secret": "ed8a62664b20244f817ba415b88748ece10c6c017b47c1eadb6aefa81a1339e4", + "public": "032340ae72ed38c789d18e9c79337dc7ed3b758bf79ca46bc96d859842522579e2" + }, + { + "address": "wAzQNGrVRX4YUpa1cVAHHAfhDUNedenZq5", + "bitcoin_address": "1LfJrZC9DBduLgtmdTb6ASF4Uw544CVPKR", + "secret": "3142f3da96ee43338c96f9adfa031a4c8f9fd6c2ecb1a3445dcbb1120c25e9e1", + "public": "023795f20aace810257af3d7b3657f91871dd420dbf71b8325bf5d4c7483f64566" + }, + { + "address": "EPMifzsxYan5zGa4vQucqTqRhoD3FVppLJ", + "bitcoin_address": "1AkyyKgen8hJ5GwEcfRQPy4PndrZYJM5UV", + "secret": "c4822448039a8158ce1df9226658200617b9567731d40eeb194932420d3fa3b2", + "public": "02d9cf102f49f1f4a179bc1c3f1b1f98d9b048521a4030adefec219c578b084a40" + }, + { + "address": "S2A5TZc9KreFuyALfSrAEqtfAnDpNZc94m", + "bitcoin_address": "1Auuwbqn9Eyj7NftU2q33M2af81zv2K2q2", + "secret": "447e435d5b33194e4d9e4fc2843f0565a7d0d4b70f5aa9e5013b41f248cf91cd", + "public": "03c1fb28de9f691912d2a70babbc75bbb98f631600e271abfabf61d91cc8cc4daa" + }, + { + "address": "iAYSpkDoyaLaR84EfrtQvN717B9u6fj4qh", + "bitcoin_address": "1CxNVwqhy6XQj7kDdcmo1u1ojU6UNtD28j", + "secret": "e7f0edcc22d803e6cb9d267e081749371654f455ca285fe89933c036dcb371bc", + "public": "033557467e9d623824a3fedd7291f0305b8ee6ae2425031a9950bff58174971671" + }, + { + "address": "2K1nzfXsFnvSVZwMJL6WEvhW8qxobLtaQR7", + "bitcoin_address": "16qinXwBrx3ewaYdbYBhYZsPXPXCMqLmaV", + "secret": "e7698cbafa77734600bafc754f0d9a24ef84b94c16d69ef4594c375bc0c849f2", + "public": "026525ef0253337c276ccbd8d7c0182ab7ab48583d5ec743ab408514d6af2ecb0f" + }, + { + "address": "2NLypD5yFCBvqNQ46f8y2AjTzrQtmdR8Amg", + "bitcoin_address": "1AgyHYL91uvYL1rhZggMXv3xSrDV8PX5Cz", + "secret": "63356b3d581b1416150cfe17c698db997c734b2303b7e7364b91b42139597a14", + "public": "02174eda85628cdf4a38a6059ff96b58435c1f841d70ebde77838f14ce029de210" + }, + { + "address": "ycaUcxZ297suGDQHX8rAE2o66uBbaHSa9K", + "bitcoin_address": "1FG7bFd3eJDUg7xi5BArhD5sXiq9aVcN3i", + "secret": "22f75ca0d85ba3ab8ab6133c4f8222cca188418422d6c8f30535f0db6399a747", + "public": "0287d014af5975037275978bd20691124f4d906be9c09ac5901d6388abc6fb2806" + }, + { + "address": "cvDxKoZWNEhuG73dxxjwBHJwHqHoj82qQJ", + "bitcoin_address": "1AhEgnjmDDwQMFtctUgQZJnvKVSnW9ZWGE", + "secret": "3cbc7c5436572ea5ff736489d84420158600d5c39e8175d3d1f752bc1ced2b90", + "public": "03279f03cfaa48f1eb80c66138e4e32b22b943c0b46c387c4a26dbd1cca5ac4147" + }, + { + "address": "2V6bLf431P4U8odSUTozXtNVyVhhfD1x8ks", + "bitcoin_address": "18zmjjyo2Y5FXXzQbHNNYCrpVdLVqZCdAs", + "secret": "4a9234206aefb76345294863efc3e344ac8294542d6c78eaa8f0f94a396eca29", + "public": "02a096ec8754944a523602aa7141c17e76de62c2d910edc107d9e5d2e2ddfafac9" + }, + { + "address": "78CiJEYytgY1GY3e7YkEEtc3iKUh17BsRB", + "bitcoin_address": "1fMGRX3i2rV1ZVjQRobAyJYoHgD2PKz5w", + "secret": "e9fe953daa778f1a4e2ebac0f2d5efd9a10835d3301f51f6c23b3c03c1d6bd2f", + "public": "0311cf95a60d6e04ac1b08b3354efa2d364fc1f26d552b1f6f864379a264d49dcb" + }, + { + "address": "KxXp9kXfiUwqYApRBpSieRjG2gUz8MCAeA", + "bitcoin_address": "12tg2CKJWF8rXMQEgXZ2GqMPg2SqXD9r75", + "secret": "f9b6f18626230dc0221df145949885138b66add73f216febbe8da03216852fa5", + "public": "0200780f30aeb162071b8e8f863d81ca0a9aff46fbf8475da8faa702ac66f7a705" + }, + { + "address": "TRXyHSr7oGbVbJurhkJGgSA3Q1NvPQadqs", + "bitcoin_address": "1AmAvLMMqNPzShNLCY4SJ8wsHYak8R77Pq", + "secret": "189694b3d311db623cb393808e89cfcdff228f1675a8392f3a85882d116a442c", + "public": "0280a7a939f549d5d8c8fe377ebdde1413223b36708ea770a9fc37fc5bb4cfc742" + }, + { + "address": "2dzxhFNvfELuA7cPFsHR6z8NnoCZbBrwq8b", + "bitcoin_address": "1DM6h8dCe5sGv9oHwYJ8yyHvHWUPELCx8k", + "secret": "626fa9e02b3cb633ec3f5bd75aa7f39cb9c0c494ee9ffa1c059032086542ba54", + "public": "03aa1d51380d5ad3fe1e6c3bda6fc013d02dcd620784d5c1e37dbee85ad2296cb7" + }, + { + "address": "2NWM7ZKdpa1KAKbJGoh2kjKQWnF4PSRuTWd", + "bitcoin_address": "134dj6hn55rvZY5rtQjmeQz1jmWNTb8gMX", + "secret": "77a01079dad73056ca87d84251811bd0e4925e59e64ea2a957fcab3368f56d5c", + "public": "02ab48fa9293ae86ce7eb083a2c90d8f63301e115052cebe7e1dbb281f424ddb8a" + }, + { + "address": "23X2NT6wQJicBDvZMUDysSV3wMgXVSoxMr3", + "bitcoin_address": "19YWz2auGocufrL8MBVDdYyDiaCbccsxCG", + "secret": "aa7aff9bedd949cd11efdb243fea9e09e8a36700cf97d611122d9eeee9d597b4", + "public": "02bd0d5009b71f203acec6294881215d7db08595e9ed86dc92e634d5b0d2f23f0a" + }, + { + "address": "LH1YBP5AjvYaen4k7DYgFyAzqi9pKXBkgW", + "bitcoin_address": "12EMhEfoXks15DTUtDrAFgbXtZTTxhgasp", + "secret": "464afa06ba6e8c59a1f16315cdaba68549cd1616644a7a25b343390ca5d86bd3", + "public": "039bde448da1bd733e8582cd0a99f6288fa227e0f36f1e945603b2d83e5bb1edd1" + }, + { + "address": "LPedwEmoxZPp1Hfh2gM19aadcfjznvdcvA", + "bitcoin_address": "17Vj7Yd8GNFR8MfvGDMGWHZRit1s9Yn5dU", + "secret": "ea2e750dbbaba5eb4f25597e27f0ecdad267de8404adbcbdffdf9ece9cb0e168", + "public": "021d0f2e38c66ea712101b9c522e9ae53c827e8c3124608ef64fc3cb316b4f099f" + }, + { + "address": "iuEGDZe6HGaVkR8Z2UgdDopPQaJZ9GahVc", + "bitcoin_address": "1E8Hgz2dLR9MCEKTATZRbCNgXoqwKpKsNX", + "secret": "88f6191752848ad861182bc02853fa7a62b2ef1e6a037a81738eee0ee0d5d495", + "public": "0224a18069cbaa5ce86031530cc6c53f5be72cce4affe5aa9e2fad32e93b231c58" + }, + { + "address": "2fFT7hVto1ijQx5S7mNtiRA14nkxKHmd8X2", + "bitcoin_address": "1EW1bS48zkb8zQduKaEaX48tZZuhZefhW4", + "secret": "a2a4095a7ee80b306c02c0dfa672f6de067ba62f6dd23e48cbf925e7cffeb376", + "public": "03b12f22cfdccd4999c0f8623e1b482f11679591198d76d7c448de1209c2b75a6e" + }, + { + "address": "2epcFgre2Cfgzr1nkLgB5LHmQNPxdebFHVW", + "bitcoin_address": "16GK2oibZfBYNUmZkZ4YQz7wakEuyfichB", + "secret": "3b9ab3594ba9909e49e46438c637f9247c3b343027196533047369af3f86d761", + "public": "034075500701002c771f867a354c5b63dfd7a27b230d6604e2b8063b945e1c83d4" + }, + { + "address": "Vwgtss72ku5Ud7UDZL836MQJohdcSuwGub", + "bitcoin_address": "1N1CHBWNNaA954gzDyebbL6kHPY7BPmEDC", + "secret": "76690e5179208d5b72b57b19e492cd8201ee8867d5ebe40bdc8667af33b62da3", + "public": "03b88ae823021df56ada42cfc8c1fd88c7143eadea1ef884f1f0ee2e2943b8cdef" + }, + { + "address": "cXJ5ihXqFezFnWMygwsfifaskFT7xV4ghw", + "bitcoin_address": "1E4tMCxq4RqvVh6A5tKLcf8sGgmgpwe9UC", + "secret": "dc352ef72b282321a30ec9b0d959d4d9b77063a45f32d8c905448d0873460b69", + "public": "0320b8d9fb36ac1b22177930e31430d5b84c89aeb89ecdcd554872362c85afdc2e" + }, + { + "address": "2B5gSmoLbRppmBiHx8wxWwnX9Wt5XhV8c4m", + "bitcoin_address": "17wmvs1bfGXEkQnJUEitsg6RtxBsaeP7nZ", + "secret": "aa687c90db3b0c2f87bad5455fd030bc8775dd0ff8a65948bddb2476f573aa46", + "public": "03bc34b2d5cfb361477821c4d7707f239b95c87d26e6928d4f3f4acc2d6718149a" + }, + { + "address": "CrMPQ1PjwKWnDdPVAQaSfozkHPuKzDe4JK", + "bitcoin_address": "16Q8HK41tEc1HnMb7ucxxmMA5ZSV4PJkhP", + "secret": "688c5018bec02673824ff63699d3002f80382aa6ecc7d2767f8f3c74ffb0590d", + "public": "0341fb80c77b69a986a39d1797a0c5b8cf1b9ebbcbf4c108a122b153e2d8ac3063" + }, + { + "address": "UxFfwBKAquEJYus4FZRJXu3Hqcrb6XgVXA", + "bitcoin_address": "16TuzmBKwkGmqg29cyMwLAp7EVudquzzAE", + "secret": "1be47e095bab584745b8474c9b8e3c1bd03cd14ab6d4cdad4278a33d804e6018", + "public": "022b2ca9b29ffab11f2ce848851c326eb8f016e7d402477c80fadea819b4c7dc2c" + }, + { + "address": "2bKghkQxAUpLRL2CH5UXi5obZR3e7bMXjev", + "bitcoin_address": "1Loj1xd9F3pMnZRD1dSi17uBv3B44j2Dpv", + "secret": "4c8f815282e42bf87fd63533bd11c27bf2f684886419927ab539165869dabb47", + "public": "0327ff01fc52d974f53769efad15458ddfafc7526628faff0834b1688429abdb3a" + }, + { + "address": "yNQkWKwwyYaSWQRqxkuCPWLBDUny2VwRW5", + "bitcoin_address": "1EU1JoJAUxxHtZpn7btpUeWyPhq6er7Tue", + "secret": "e0a08d6aaa1efe1fd000901732256ef93946d68c038735b3ea99b54d0aeee8c2", + "public": "02c8c10b617f36160a432cf69551aaf10e5d92a3ef55b7960bfdea86b85c6a2aac" + }, + { + "address": "Ehy18wxh4BaU4H4ddKzhTe8upRdHdKgM3C", + "bitcoin_address": "184v3sLoojREoRSfeX98pdCGvFkSpPDRXy", + "secret": "cf82029c3429bf9e3a2918fbb059dfdf667f56ebab79c62bb3379c4bcad9fccd", + "public": "0341b4c77a846dfb985f5e25c21dded44577d51b8cbd2c6728f1ccfea6f80ba547" + }, + { + "address": "87CxDUGMUEG4TbmKuJrnE81tnDfdbji3iD", + "bitcoin_address": "1Aw8MpLkyrNo7MWJMi8LNVCu85Sef4Q8z8", + "secret": "7d9656cb64662392ed93c60d66c7c2e5c6d917bf955729c4672841b63e6967ff", + "public": "038a4b918b57f7b303ceb32f8b3e4a0a3f93907edca2c028b1eb1730890ff9de1c" + }, + { + "address": "M5Hd2UfGCYHHHAMRhhRNuMiH1L4PFTdBu7", + "bitcoin_address": "1B5TN65AELQKU4Wm5g8XAvhSnAt1d4ZJfW", + "secret": "7f96a3f77ee706de79268dc5b161305f0d60b32b5e39f827fb7c59c9d2c6f594", + "public": "03355b8c6ee5d09e41c5cfd0aefa230b3de94484bf65fe04b2b4ddad68a452cefe" + }, + { + "address": "7dCt8NcfvF2eqSDU31BSX6sdfbuYg6D7s3", + "bitcoin_address": "19qnYfZCWrkSRyibo54spwqpz6EYgHpsXC", + "secret": "c6d2f40294eeb8d5e9b05f79ff0011dcd641c318981f2a6fa118c1fee8301787", + "public": "026a28127485642665a7d791b8a94b7a19ec42ebaa30a6cae318ded26fc2e120eb" + }, + { + "address": "EfjaJj1zqUT7c44FtWTpTtZd9SctAsgYgN", + "bitcoin_address": "1KTiquEWwrvv4Q4JREwnEbtXNoiAJ5Ubiw", + "secret": "5fa1c6aefa6b2c3265181f94362798bd97ac1157e2825a555c3a73ab298c9085", + "public": "03c51dbc5d349755cb608535d9678b67690a83ce6f4b4abd2b4b1bfa3d8deda428" + }, + { + "address": "G4t7VPjovTXpPkB4WFR5NsQs6UCKsZMrTV", + "bitcoin_address": "1EjCW3rxpak2WyrdL1oVqHhbXNrCuge3b3", + "secret": "a92f1ab3e1c387727a160af2236d5b1140b69016d8e328d0600e3ba933eae344", + "public": "02f5ef7788d11f164cb17facc1c3d755954373ad43c350ee22de71b1b4d3f6a921" + }, + { + "address": "EqnAHqETs7ZqSEwmVGcUBWENuXfF3AwX7u", + "bitcoin_address": "1HxnaGbFb3NqsTDmVV6hAWjQ8MBYqa9qYx", + "secret": "8ed59413c05a8fb4258a38bc8e2ae33c549c31e953737433edccc00f6e281375", + "public": "03e99890fcf8468447dda686a52fcc4d2ebcb4a2a9598645cf17bd35e1b2036e4a" + }, + { + "address": "9JY67nL2TLrh4rf8W5KezEjakLffjJ7ZJv", + "bitcoin_address": "1Jz4EVX2ctoVzp4fJbe6jui3XWZyVgywTU", + "secret": "819c8cc72b0c266c144c6c77f359d0c5f476fefc7d5e48b0cc32e694e00a1be9", + "public": "024eb7dd60ec2195640e68ae70cafbf9d3f32ed84491e9ef9917d50a15da31156a" + }, + { + "address": "eJhighy1FQDgytHobEPkFUrc8MRRDUrERX", + "bitcoin_address": "1NVk4wkAQWYckiFSM4CivKkKaFTs98mM4S", + "secret": "d8ec3cefb2571360c9a63e100c133e1a28f5298479f6b71f24fd2e35a2ff391b", + "public": "02ae12cd82ddf09f2d41f2eeb4c89d7bcfcf7ea6d045825d5e7ff480006c873cac" + }, + { + "address": "sXKjeTQx1Kxg7JiUsY1s9JzxmaZAxJGz71", + "bitcoin_address": "16wLpQxon7W5Fo6jivp6Ux3ZPmTFsRLGhK", + "secret": "6d2213281136b28c2311ba20c7f06dfa2631023cb9c41600a343b12eab7a1fae", + "public": "03efe76de2c6f2bb427d311f819421fd737d9796ec4b5e884724bc83313bc7df25" + }, + { + "address": "2P4vNsCQX5e2TEFsA3phiEzzLNcsa55z5ZN", + "bitcoin_address": "18qmgKLtZTsXGE62bn7ktrDkWonMq1KEKo", + "secret": "7e34200c29f235e7d41165de73e3e24345b333f2d62b1332d1645c79a131fe41", + "public": "02431861ed3afa26be09c750021b2f0e91b115216ad177403e45135346d037c421" + }, + { + "address": "2hK3XCyTcLDihcW1EpBqvRhUEfQTySJvtZj", + "bitcoin_address": "1LEQZ4eKMsrGhkkB7qnjVhFFHHXAjP31ti", + "secret": "26e1cbc5e0d46ed4ce85ffec8e2673ceb4703796b88a3dc47207f2e08dcff8dd", + "public": "03c07daec002df3915d53e49dd3bf592056f9ec01c4c9f71463bebf622d8db9651" + }, + { + "address": "CMyzndV7XRPcWyvLQtUckf4AqXh2BzeDaZ", + "bitcoin_address": "112kRZL3nAuHRjLXvFtbYvVdhw5WiBcxJu", + "secret": "016be155c064286b20c31e3eb78570aee436b4a1bcb51553a98a3b88db3f1a0e", + "public": "02dffd952d6087b6839ff2fb5406f8df0a588b47fa37f6b6501adef82237cc91e5" + }, + { + "address": "2Sx6BgyjTNa4SRGzrtQ3XczPtwKykMDNYUU", + "bitcoin_address": "19eUjFCD68vFYhgaJWj6FpXiJQQJjbZmA4", + "secret": "fd0f956556804aa600fbe8d179a5cd5293fa543f4b301496df71d44ca18f9f44", + "public": "021306263d266c508be82703eca67e924138e8373fad6db63fb082b173e3790a83" + }, + { + "address": "X54kZpzfh2QgJKptToev26n3DKtREcoPu3", + "bitcoin_address": "12VH3XrAX8vYi3nJA9zW4adq1Hg2p1uV4a", + "secret": "5ebdaf145155d2c3b8f3c2058878121d4da049de70569287afcabdcedf9e548f", + "public": "0318d7c0dee3c80ed280adeddc136dfb8addc4a96a0fe1686ae40ad48c4538485a" + }, + { + "address": "2dy28oXtQ5xjMmk5WZoxestCyYrdDKp4k9a", + "bitcoin_address": "17z6SfFLKhRPe6jhxjj2sZst5CxrRJ3mKw", + "secret": "9fef49579fb653c9a1cb089f286318cd125db8da7a02e1603a516ce0e90b9519", + "public": "0367c6fa57634d2dd0ed737eeaf9a968ee566f0f9ff8c080fb5d3a20955f1b9cd1" + }, + { + "address": "2YsSC6ULU9ud1HFPx61iK1EmbtFPwuPvLmX", + "bitcoin_address": "13iawQAxZCzbmSpdu6ZzzsvwBLmGPP2RfD", + "secret": "93ca92327524ca10a615c97c803c31e181ec25e1221a66f6cf4ed45549832f05", + "public": "0272595118ad56acb6fd1a7e733d580fef7bd7177c8f5150e834daa4ade1f69d2c" + }, + { + "address": "c9yNnwGMSciNxtfCfDpZYQBqkKhcruoCBR", + "bitcoin_address": "19MPzVZVhpHZgEFQwrAtjevRgcFM8UFR1z", + "secret": "1837ba45ee86dbaa69529292dfbcc93c1424326ebdf8a77608f1a0f7f4e46679", + "public": "03a7a4a53f0e573ea39f83bb9bacd91ed402937678c7909a2630c852f6a677659c" + }, + { + "address": "2cPy9RXG1kqppk6hvBWJdYPusTM9oaNpaGY", + "bitcoin_address": "1HuyhBqP6VK1aL6uVuUveYz1nESGD9irkJ", + "secret": "5838f6f51f7ecda21c6bb33bb6878c0a9d25a86015dba6d79b0cdc472577dc4a", + "public": "02fb56f26293d4ac62f3e49e3b87e81c78661b8af91ccff7ee4f452cace307d842" + }, + { + "address": "2RrSuZnng4zVoTt4Ytq2tGqg9yYSXB4pwCn", + "bitcoin_address": "1MCzTXEtj3HemQQycgdNSDUYws7iwk78BB", + "secret": "97b347bb13110f84c58bb17e8ed424714a897f72893ed476f285db2e4fd8c80f", + "public": "0302adfd41a08a7f23338dcc45dd6fbd0bf3f4352f8abf814c10729a63c99863e9" + }, + { + "address": "3ThUUSbyeiP8sYcKUJfjTh68rZSBh2K1Qe", + "bitcoin_address": "16itR1eKnvNhBo4rLZn9MyQHFkp2jJWuZy", + "secret": "b5396837ab1890a661f493011d5d3198849ddf54f3620ddc89c7127cdc6e1031", + "public": "02a9b07fce49c94f70ad821eed6691d35435124528e4dfa060b218098794288782" + }, + { + "address": "2P7eu8oaRGRqfZMkm7XQCA4bkAMVuW7XarV", + "bitcoin_address": "1MR73WQnpp4uuy8dLZZ2bhR5ZntHkzE1Zi", + "secret": "aa11b35c65657a62aa20b44fa2d79d7e39f0d50af94c83758db244e63cf3deb7", + "public": "0301a3fe3b088d93bc40f197f476017d02a3f269bf7e402bc30e8028f95eeb323d" + }, + { + "address": "wDgABtGkzH1fFoPRFRdXXPC8Eh4fbXA44X", + "bitcoin_address": "12FTVFpFFbdxDKzj3LZhur8agLCaXAsYfg", + "secret": "e7e5b7774a59efaa663bb190f4141a443811fd915a0542ae6d5b80350ab4d566", + "public": "0398a4a1db8426a805b7c78a101605173073a26395b9e870894bcc19edad3ca1bf" + }, + { + "address": "2bxejRENs8r4JTvfcjzzPrYqAFHCZWZpUgT", + "bitcoin_address": "13ahe5zrTmT8b5jgT3VH2EACQbPnfBFvBx", + "secret": "fd684a261ce599c7e60b4ae3dd8c25ce6f379cd0917145e784b2d65bee3dbd40", + "public": "035ecac650a6ad90a0c7ce37c4a8f60470f720bc323665342b4c8a0891223e24fe" + }, + { + "address": "2KGpywnakyuFh8JwrQzkZVYZCNTUjNUP4QH", + "bitcoin_address": "17Z7xEf9NiTqCbRT7RMdGS11RbHQb3FQZU", + "secret": "1f6f6a383bde7f74e62906fdd0e732777bdbe083d8cbc3f937911ea97527fb09", + "public": "02710b1c5b760022a5defcd04a471cb156304bc97b0f2888ec0319677de684d1b3" + }, + { + "address": "RtK2DJPZQKcDtFQUEvmjDrVWGzZ7yBL5SY", + "bitcoin_address": "18ELnogN5MrbwwjmwykREHaiWnVBU5hkW", + "secret": "398bcee8a98af1760b796cf0ffb3b97915a5f7395976af48e56a88ff1723abc4", + "public": "0395443d2c26ad2e5b14c62d83d742c212741ea90a9f862270e9b6fa65f7f93eec" + }, + { + "address": "gSHFa7incxNmjnTRVeu9adx3H491Q6Z7gL", + "bitcoin_address": "1LZ2SKYpjEzYrFPSyMLwFyT67PEnh9iAM1", + "secret": "6f75672a799f02d99f8be68c3f5ec9cdaa4e225d6b63fb28413210592852339d", + "public": "0296ca726068a5902489957ec48c85cc9d77e868b159ba9ccd50e6a5a7208515b4" + }, + { + "address": "2VErjgC2zSFHYp8upgaUmYTpyqZm54HuaTy", + "bitcoin_address": "1BiTijoJ6hUiQ6itBnMM8mLd1meYL6Lswx", + "secret": "d9a70bdb789be436b144ff6b337fc2179ae4dab76cd17ac61c69f81eb669b7db", + "public": "032ddb910371263818b94e8d5d763718ad8d6a1134bb806c1f6c84358482cc68aa" + }, + { + "address": "aGCeAXjw7P3grVg2N7ccWqvM6Urtsrr56k", + "bitcoin_address": "1GeSpVZ6YSiunscgCwVLNfsTT5WYwHhMbu", + "secret": "1f6ac2fb2540969789c1e435cbf10e32f537603beb33afb9cc2561e1612bd3f0", + "public": "03930f9ac4c718599a2bb6dfa60215ea9679d393a57e2f1d0c1df60dd813b0e320" + }, + { + "address": "2Amstf2g1ABsQwZARZdP1hsyuTF2To4Qb7E", + "bitcoin_address": "1CacLrak1vamNF7A5wrCd3aeF7428m4K94", + "secret": "d5500918f2cf90b27f68e476a7f542201f881f62ab571c1a56f92b3ef2bbde98", + "public": "02d5c5807716a26bd520189294ee1394f9e331b052904bb74529e11af87ed4725a" + }, + { + "address": "LZH9W2Au9PdRNYChRYhQQ1WygQR2m1Gv8E", + "bitcoin_address": "13o9AarSKqVfZLbchHM4mcNvFpcciwSAEj", + "secret": "8565e2c08db9f98f6dceb06f01b6234960005f049360f9ab778864b278f53935", + "public": "035c4e48eba28145bf0c949a21b2d6d8ef0bb34112a5f75341372af93aa23d749b" + }, + { + "address": "tCNwshNocxoMVaRprwjnbfSoBtNXYdZbva", + "bitcoin_address": "15c5Qbo1K7a2butk8Wj1JxJTjf4kCNmiDC", + "secret": "e5125d5a11dd0bd007cb96b665ce5a6924b3980d9707324961f3a5d98eb37fc3", + "public": "0203fa587df0939b087dcfa338bdf509674ae0b3b8c2554717c0f9bd0accf7c0b1" + }, + { + "address": "2KiyEu5BhXanjwmjASUNXS3d5fgk1ra2Dwj", + "bitcoin_address": "16oQq939N4SYtfddKdS3DnTnu23CY75f8C", + "secret": "556baa1dc55107be4cfe1c345350aa3d0d6c029b3b7e11287b06ef648ef799ab", + "public": "03003633353160cdf7887f5cd7a1631c28b52589d6349fe26105fc7831822dac1f" + }, + { + "address": "26PYDLjvhxjrKMaRnqrBoNtD523VdpsbsfA", + "bitcoin_address": "1DmP3H3fXJhMshZbGfwwXHopHEHRADHEMz", + "secret": "a14b726d7f34d630b51c2d668c9d4a309ef13caa9d29faa9b25fb1acea77971f", + "public": "024015911a99f20fd61a7c836ef8bfb8c036322e9555d4f87fbfec8a280f251b13" + }, + { + "address": "2PMnPZxbrtjJBj4HtWnbNEJXGqNVuzg7L6T", + "bitcoin_address": "1LWdEXe6agCocqtQ2tZiZhU1jAppkaC2iC", + "secret": "1e057bdc28c90b117348301d61b7788799fa48747633b3ef65f128db85bf5f94", + "public": "032c82d55599f47c022b7ec1f2d94a63a980f88ed47e07eac48bbf0ac0bde7c3b3" + }, + { + "address": "ngEoKTA5kLWYecYcHpLUSrP8Renp5xG3Vf", + "bitcoin_address": "12T28C9PY8Qj6kLxbZpbYDApawWsPSe2pQ", + "secret": "63e673ad8615535dfec17d8d4232df7ce645556517e3a7a9b77cc535b62755c8", + "public": "037ffe90571b19501cc7c0e7619b6ee64f00f2f5f9bffc54b82e9637506a5179c7" + }, + { + "address": "2XTu3GjDN1haGmdP15JiedULe17Yvou3PUA", + "bitcoin_address": "18bfV1XrFfV2dncNwRRWHQkuuPnm6orgNi", + "secret": "d0354da826bc9131d5c511bab8180df24445d4ecf3ac1d163c586a60ba691639", + "public": "03ae79c37f3806808c63ee7ccb22f82b2f43ac4da2081fd15c26c2361585415d11" + }, + { + "address": "Mi81U5WwUVeD8gvQUHk4uVwARQbW6GGdCN", + "bitcoin_address": "1Hqv4pdJUxYDM7beYUVqyXL55T6WRzJ2va", + "secret": "cf4559eb1ab7e0dc0e2589ae74744a6c6440acc1c47c1e20af6597839302cfd8", + "public": "03f39538cbdae0192c6e467950c14e8b78181ac80a4f4be7118b920a0419d4748e" + }, + { + "address": "JS6ktiN7Ms79KoTQWGzZ1M8VAtRcrERu2N", + "bitcoin_address": "1MM9fbgu3jw8u9sLsGrGnTBzAXjXaxuXK", + "secret": "753330d28ab5b9236fc9e3d2b0e289b61dd9f08f38f1326cb2adc79d10465d4e", + "public": "0369365644818b84383ec3f85eaaf5de68874b2f0993a2ca80e9fd5520a80f1142" + }, + { + "address": "2ZNsWDs1TacJQw5JxiRgVhUAcxThC6WHuJe", + "bitcoin_address": "1DrM4HbLG8qBnJRZHgb5JMkn19LSWuatMY", + "secret": "fe014fb4af0b644d30ca6cbf94dd56f9489cfe049e76ea7868f4ff77302934f4", + "public": "032efedffc122bff9baef556ea5925ecfa2c67c495cb19d981a1bdcaa44e74351e" + }, + { + "address": "LxgmkPM2f1HRcRrmzr9N3cEXugNmXsN8qH", + "bitcoin_address": "15XGC9QXs8Ay8BKJVeg5mp1pUZb785GwM4", + "secret": "a21b407ba7d8c319036912b3959a158be0f06aae3736502c8b6f9e45c3622239", + "public": "0370e1ef67eefb04dc4b36793e1d8dacef50f1956062a41e16aefd0df257ae0690" + }, + { + "address": "222JtJnk5pvmP8nbET1au9SZbomfzwUKFs5", + "bitcoin_address": "1LxKyuHLP1thF2aAdnQoJKbZsYhKHqV67", + "secret": "fd1d0d6acb0f13009f1cc4067456d8b3e2ef43b1cd7ca9a5dceb9b682a29d10a", + "public": "03e193aa4c3448f010c380254a79bf4ec7936b92acda213d33b46f684c52077237" + }, + { + "address": "24voKQR8GY8aWuDp6deB16Nq8ZQMo1eKpmB", + "bitcoin_address": "1APV3kVWXNQXEfs5qYXNDWTBqZfuqk2cmX", + "secret": "dc2d1c7680935541cd768d6a15304edbd709b2d8a6d2414d138292a707b17fbd", + "public": "03e75c1f8746e2d0c7001212b5a2f81b1703efc0bf9cb8f8b34fb10be810fd543b" + }, + { + "address": "vWtNWUB6gkdeCn5YUXbXArYNVfJLP4Cz87", + "bitcoin_address": "1NkfvnQpPYcMHnR5ZUYiJu8n5z2ewzWpzx", + "secret": "0fb2a5b69860ebb7b5b17dcc20d283aa5f45983cbe0cd4a9fc2972f3b17b90f1", + "public": "02977a6e8bd289782fe6bc933e212fa7f13c6e915b44f8de61bed4786dd16f8f3e" + }, + { + "address": "F7vSLH9cg77q973YtGaWc5iodkMBpHiJ3T", + "bitcoin_address": "1Bk9hptwMzhJ57mpLEhpaQ4agT7pc4GuPc", + "secret": "57ed144cbfe320f19d3a3ad3d5d3e7103aa2fb62586d42da71e7f987da14b648", + "public": "022187aaee0d76e40534cc89ec0b299bc9e80fbf3fc10bcc0c01fead840cf80eb2" + }, + { + "address": "FuTw7roSkr6CNsKqzpUyQJvMpUReBSFTUd", + "bitcoin_address": "13uKXvNw8JgPFbKz3Jjf4vgvqkp146mWdv", + "secret": "31ca978b4bd2bf895eee56004c56e7a3d21e8ebdafeb572bbbecb36e0e16a5c2", + "public": "029eb0564cc27d0a4a65c1942e446585105cd05dc22a96f19764cdc8b7d0228f9b" + }, + { + "address": "hFGCMRbvKs4m1zAV1RqEGcyAi5SpMCco5N", + "bitcoin_address": "1JKkFsthhBrD8qbLfCxD17pzm6apYfjnpN", + "secret": "68cdd1bbbf0b0b8774a6f45be72e0b561e6d30348d64dacec06b194e4c957365", + "public": "03d126e5cdea74eda90d02651be16a70d0580315e1617a70fe46531016a2c00cd4" + }, + { + "address": "6GPVFb8T8Y4iBd3bAmyojBiMM8RnPYgZKS", + "bitcoin_address": "1D7uivqjTigPpSCf5cqP54TUcsMy5Baqac", + "secret": "ccb1e0206867f641e3abd217c1e9811ae39ab55909a7711a04702e5603827655", + "public": "02fd2e9b6e7468dc351f32e6dda6ab83edaab1eb3d7e4acdc3d740677f106ff907" + }, + { + "address": "Ef8qDc2Q7Sz7J3eFnvd98SMEJCHmURdzS8", + "bitcoin_address": "15BUyj9KXrdUBhmor8M1Jouahjo2dSPeNa", + "secret": "3a09f2bf6b43df6c213a94214dc65a9ad30c651d09e008be435e66e46ed41c14", + "public": "03cba4c199f928595615b8dbec52e7b20f1a10b40735adbbf7b6f107cd12751308" + }, + { + "address": "2DHxwQdqxY8NvwXBnwX7xhzs9aGKsspDbX1", + "bitcoin_address": "18dY534PjwaJcVhP7vTvZMUj45K45uU9Kp", + "secret": "e8813cacbdddfa7e48271964fb91a63eea487ca3f462e64ef598d3b5748f13aa", + "public": "02f156980f66466742b818fbe5fc452f7557f9e51f51e188543b746e5496fce569" + }, + { + "address": "gecvozAwkyuw9r6eUn8Rg59Y8DcgYk2dFB", + "bitcoin_address": "1KEmWUGUHeepfKJMYHaEp9eVoMxBfEma1L", + "secret": "fa9f8353f6a67de64f4a7d2719bd0c53bc80d48d05c272d59c7c3bd45d458bba", + "public": "02afa8788e25f7be793cd8c9cb505f7613015f1c0a2de08649757ed5bdffefcb94" + }, + { + "address": "81eQpxzb3xiQs6C9R16rTKJKKcPjAYP8CS", + "bitcoin_address": "1DwHbtokpysZfTuNNEWfu4RwaAKnmdQb51", + "secret": "fb50e96115ca8e95e5def16d2ad10834dd2c5fc3fc5cf819d86cc47355bf9579", + "public": "02e5f672d5af83ce1aaab51e99a1225574598b27c922b4f1a3feca3c20cd6d3ee3" + }, + { + "address": "9RckSwNRZvVSWHRYTGW5TpYzWYAfa14CuW", + "bitcoin_address": "1F5n2TVzgY7r3zEs1EGQXBCUhjAyrP5YHe", + "secret": "c0c14f4b99871b6ab8da7d3e44e76f943481e7d313f7df492f15512c42fd9bfb", + "public": "02f57a28bc829e1fb9862d0a063f19b99d7a1acf93ee52b21ef838ca5cce45a822" + }, + { + "address": "kR5sYz4U3hpfvV9UpJoHpGe4b5dvSgxq8d", + "bitcoin_address": "1HLK1Q4rpKvEBrj1nQHGGMi3Wf4MzU36qr", + "secret": "9b8e0a6e8e1ab9f089049a33be70b0ba67f9204227e49fa7085cfb12b9ffff44", + "public": "0271bc6796ff472cc141b0afc0169efccc865786b0d3a607cbaf31dd45fe1262e8" + }, + { + "address": "Nxo31uJshFSDeQqKTrFBayX2Kp4CELgnbi", + "bitcoin_address": "1P5jwvXkTiJPZtNkc1RZ23GpfGi6oqzJjf", + "secret": "29e4fdb5b7725afb1db7035cef6d4ef29cd818c81e66981a58d597c5d4259758", + "public": "02e95df9d7dca346d3fbbfb4a5c71689ff2226200f41118f951a3cf8d4f5574f78" + }, + { + "address": "2A7CxHDjsapYNt6NHQjWVKvxrXCFccKi6a4", + "bitcoin_address": "1PKat1DHiUr5zKHUzSPi4tV5BpdGVhXzwU", + "secret": "2087742e97dd285b394d6b2f171009da8b0fb858bd4a0527a4e1fd8d04f922c3", + "public": "02a10f6ff9086e45bb2ffd96f56dcaf5adc8759da06fac9265cd116f6da6cb8d0c" + }, + { + "address": "MydhPQrxZubrT36DLVBvm4ww8jPgwXh3FR", + "bitcoin_address": "1PjwH9T9svAtRCDUjXSDNeKdJnTWdTaBzc", + "secret": "a7d1a0b8a57b64b6149903ebf0b6aec407c5d8a7f5a0765b0fb62807fefdd9ee", + "public": "02858feda2754c0e692228f459b4f5b563adfc1c0d231d32777c369bfd12025261" + }, + { + "address": "2RCHxBQrfCpWpDgHhQMx9CDdNXuRSdBvQW7", + "bitcoin_address": "1PDg2tmWBBCMm6n36r6hpCcN3PMtcrP7a8", + "secret": "9e59e8c9248db0067f382ec45f8b50fdb229b7d35145912cbda5a60652e4e2fe", + "public": "03ebf7323c9d07ae87639780e7fd2368dbb2a2be81fe2422a0a6caa3fe95af8070" + }, + { + "address": "2CibMMEZLdQNDNUkeGTxukCyP9ZQyKTdTwr", + "bitcoin_address": "13bM3bbp94E3pBYkV7R5AYNmYCdsLTkqCr", + "secret": "20ef1184fdf206000b3afe262bb8c7c1f7e47779c37e25b4aa8bc9ce1fcdd5ce", + "public": "0228a3cbbdbe7b3c06de4ba6a57b90f0a32353d967b1df3d2a735eea9985483531" + }, + { + "address": "2kS7peVSHev3CmmdN7DLaZtjEzvfvKkk5YD", + "bitcoin_address": "1J3f79F4tJNnooJC8KjQ5pX4yyS5sJEUFE", + "secret": "92bc9d6ddf02530375b614e6dd951c0ae3732ba6186cdbac6ec2f0c85f40136d", + "public": "025a3b72d6a01728ddb251dc64295c7ccc8ece2dd068054c694ff856db247cf232" + }, + { + "address": "21oC4NFV2TGUjrGcrvPwVKpzgFkKM97kmB8", + "bitcoin_address": "1PprELhnSQYmJWXynNtWenppyT3iTfBYys", + "secret": "e61d9affee3d90ba37ea488fc7afc55ab78dd71e8b1b93b04ff83226aa4b73ce", + "public": "035d082c055d9c298234e57ec9871914c996884b2014de1c0eba6f958bd1353077" + }, + { + "address": "8u6dLFZSABo5ALndKjJ5ScYpDFv9R9uZDG", + "bitcoin_address": "1chB1CbUvM32g7mEocM6ZFJoqgCVYoVro", + "secret": "aa14f51b05ab597628809bed7e01008280d702fa85dcd8d6a284bdd5d18a5402", + "public": "02c089c13a962d52e5c46a445c5b6b4beb86ba95fa56359465e2308821e92e1261" + }, + { + "address": "k5Tw2oc5wEF7msAycqGdG6f7dFmSg3Y1Zb", + "bitcoin_address": "1GVQCFuXpZo4ZFftNqf1SHy5JkzP5hy4rJ", + "secret": "a6134facf7ed270bc3bc2c69cc8883f8f63e9c937232bc4c0cf6cead6bcce999", + "public": "02a63bff81da219a749e513ac2971ddf06938ecf358c7a0d4ab4a2cd3498deed9a" + }, + { + "address": "JYXHANNbaSnXJhNsCxjytkA2F6rxE2KidV", + "bitcoin_address": "1KkRx9yCqMLyvZZkeh7u5djTwFDcQe9qti", + "secret": "19b88e4a1a08ca94d8b1a63ebb5cac5e3f862bfd33c246ce754db589e322e19f", + "public": "033ff55a1af67ae3b294be6a2d8995572681e3b71b95aa70aa2d26ace15d2fa165" + }, + { + "address": "2MiD5TDqRpKggn1kKrgrtpAUsYaREZrAcPg", + "bitcoin_address": "1J9m182cq3UjctTRB2S9BJQGgHuJBK5By6", + "secret": "14d82b366ef04a93bde3bce086256e54cbd55f597f9d9cdd9fcbfb17c7fc751e", + "public": "0352d8e915e865373d83be53fc117872ad560b7a82e2f5db84bb4785dfa7f2fc26" + }, + { + "address": "2hSv2av4dyyrsA7PWyt8Z6DfRgTxQCZV6KF", + "bitcoin_address": "1FVBUXmA8HKCU9iHoER6wiVfCiFQuKRnf8", + "secret": "0cd99b278bbd4b0c3de49d5ea72b853e45e22b699086efacd3989aca748be469", + "public": "02382bffabcbfd3b8511528b3e0a2a17a543c8739475fdfe750874f3e04f57e3a1" + }, + { + "address": "RMEbHrzzidye3H366c38zoT9sEHcxbsndj", + "bitcoin_address": "13ihL71oYvQkrdoeELwxKYQktJdGZpYvBm", + "secret": "4d8949fda234c91983c3fed2b20e2122136f027b415c53c3b28fd3a9401030e4", + "public": "03413090be4d221f8a0d6a14bd411c296569417d04efd2a6bb75459a6808380bda" + }, + { + "address": "Vu9f2FuXNzXHhVZqLPjDjyaNLvF3eirA5B", + "bitcoin_address": "1HqnW79qXt2cVNkgxe3RHAUwVVzTzDEWmV", + "secret": "d2de1f7c3105cbac90d122261c0fcfcc74cca0b0bfbfe9f334f753f3e36f9021", + "public": "039923f773cb3c12812c304aab95965c1a86c576d88508bc8ef97265568684c465" + }, + { + "address": "PvJvPdr2V2B4rRZosBo2x2tHmWefXdgQhr", + "bitcoin_address": "1DNoPQkZD6b6v6YfPspeh1q5Qfsfnx1LKn", + "secret": "2ac57beaa74675d799d24540f398b2f08672db637eda8cf024eea9e458af72cb", + "public": "02ded23068562062cccd51936e7fad88f7a202a55349f54c47cfc6f9be27a78309" + }, + { + "address": "2kaCFQ7x8rBJ6JttjYP4psf6ejKwADrH3Ed", + "bitcoin_address": "1Gf92v1mu99ZekTrEJrenQboyiwZRSFhS1", + "secret": "341b2bec8e242e758ccce37178a134a50b3a97821c9d8a78c5f7f7c8fa545b72", + "public": "020dd4d4be64e0e7305e59bb928340e27f8381c3659e0b4f5fb3b746882e8fc609" + }, + { + "address": "2AYJYq4zBgKb1ZtC5RCF4TdG2zbbEAnfNch", + "bitcoin_address": "161qa9NjorumPiCGGSQSBLMaWBiP48eC9T", + "secret": "1c304b592dcc3f935134a24eb57988bb8344a8c061d2f82c045868295c8be5a3", + "public": "0213136dc207e6b37ac9de79bd26598d2fa2ec25dd0f1fb4b9d41595b58502b348" + }, + { + "address": "GK9gno6miV6T9UTUswvc8pRdFf8NfNQLwN", + "bitcoin_address": "1EkiPMyTingDSW3XGM5rm4MhiJwk1pAwHd", + "secret": "fcc02916da58e734019b145f5850d1859905b9cdd48944de073f12d2115702b7", + "public": "02a97331c4f06faef53ba8936e0965516c6ef605724decfe69481443cf4fc2a755" + }, + { + "address": "iUkqHafpgjy6onWwQnvzdHnZDEe8rQXLdR", + "bitcoin_address": "1KfHyCtLjzGCEVtDLg7gojjYtydTtTS8GV", + "secret": "01f973071fd0188319092052ac43ffce7972283d98855265d3d82ea6a5c7cff9", + "public": "039a5cab52c9950588ac44cb5ac805d27aca17a6f7515f03f6d8b2ba5f6b12c93d" + }, + { + "address": "txb8qzZRZT1WRXrg84kQS93omLXhnTF8As", + "bitcoin_address": "1HZVMRcaywEst1LMKu2tSLk6XEDhwGopqf", + "secret": "bf709d3b0eed838ff3edf0838a585d48de69b9ce8bdf389bb7d657cdde26a132", + "public": "03a08d2ab339e68465101d9dfbfa2b83265902ff5326b11b7ce53ea7f419bcd6e1" + }, + { + "address": "wydSm3axBbXCtygk3LEoUC6TDYzrASvY5e", + "bitcoin_address": "13vTH7zTDffveAjoPKMpYewk8Br9DRHrMs", + "secret": "8f3691f710738866731a562873a18a11b17aefeb5981a1c528cf94fb2961c1aa", + "public": "0342b15f8b54187e0528d67455f4f13fee993d2ce6c3e0330a48e805cdd8ffe8fe" + }, + { + "address": "GrcRWScVaDgjfY3vfybHCh4NiE3satxdYm", + "bitcoin_address": "15Pj5Z6D5wrEMxtBZ8UXbgyxJqyefL9onZ", + "secret": "7e10f5ebf6a8ebf21e62c80ea90bf39c8c885b0b682d488dbe5b3146ae3df21e", + "public": "03be16c5650fd39e75e6344f1f94e56b8e2e32200cde1caea4a2d6a9d0b72260c8" + }, + { + "address": "2bWdKXnEMhTD1XUY2aMeiVS5bZkUHpYmMGH", + "bitcoin_address": "1LzXZuYvBLJxG9RYynHcPR52irXTCwzkUu", + "secret": "185c0f312da84fecb88764438b48185aad42c7236180dc1961cedf4ca3bcccef", + "public": "030436246f3aea56925db62803f8e30d620b744aeac79e494890e2ecaaf6699fae" + }, + { + "address": "2V2Zi5eW2Uizu8mqBoCgfM2wNEsuBUV75MA", + "bitcoin_address": "12jMWRykzfk4QYaRF5CquvdDcq9aytAL4p", + "secret": "21f8705279bc92569a2d0cc3be054f6a34da982c7d8046ba3f92a7165bdaad2b", + "public": "030a582da2554ca666e19603ab129046e69afc88b2e10a643a053f935fa1ac91f9" + }, + { + "address": "2eoMqcWAh4CZ6fr5VF1P7JWByp9ZZyXxoLt", + "bitcoin_address": "13cVvhfvziUEirvpkoKTvsfPboecqVc9Tk", + "secret": "596d3109aa4d63509bae68a6d23bfa9b31f5118823208fafaa93e37dfb388ecc", + "public": "0212d52f6325785a064fda843f18936f41ab825adaf9d013b0cf6beb792ef3ac3d" + }, + { + "address": "2UJfBnL4wU9YrrC6qadiNHysCXn5uYSgJag", + "bitcoin_address": "1KvR19QS32z877KCrAxrguvdYD7cDwVSYn", + "secret": "00e57b2fea94a45bb324b69c6efe451164dcff3f030197294e71c9e38abae3db", + "public": "031fdd5da24da4f04ad91c96c764caff0c9d5f61234446b2d4587c141e7741b754" + }, + { + "address": "Prd3few66cjZHCdB6za6G4v7fnPzeSD2iN", + "bitcoin_address": "1LBwq7TiFdwZRA4z8Zr2dQKGHeXSU5m2hS", + "secret": "efa8feb48f1da1eeff8a66b0e051127846b73aa22c5bed6966048b8e09a17f47", + "public": "03f6e0fc17b5b3efc249986380633183ae578edd267055e9cb4b5c753414acd523" + }, + { + "address": "bs2oWEVpaH8fi2YqaDZ4VpSgEAcpjrBuLH", + "bitcoin_address": "1JoEQg5rvaEPovAsSQAfdV2sbNfsn1xt9g", + "secret": "2376d1e38d7b79a5edc8db82291f7d23226ae0c9c8e541f8197e67bdef978660", + "public": "036a9e6eee4f778b184b8252ff0fa93e7054cf00e01cdba67907a3d04cf4812b27" + }, + { + "address": "jdXefcHXereUDbC6JyM9p6YKDMr48q2WPg", + "bitcoin_address": "1F9EbwL5acGLBsYdHM3Nzk7qoCf9wofCvk", + "secret": "92181da42717c4ef58029f272e56e497b15147268b0c9e3830d8a76ac8293a73", + "public": "025e49a895fdd528d99561d7864076d1067683e374fcdd2b550a8bededeab01337" + }, + { + "address": "5NxWC4oktPpNE1bHAPksR6WRBuKj1dgdgj", + "bitcoin_address": "1H4NJjNeEuPMwUzGsaTmLvbPSs9tk17pUX", + "secret": "3797eb0d846c2bfa231b21a88f68aaecddc3e4bb5f5c40b08e12a30ca5a9a8b8", + "public": "031ad96ab1dfbeeaca199c561a185165fb957dbc9ab615af157954319936759915" + }, + { + "address": "8MAM31HoWXZvDucv6K2qXDoTiVEDUoTZVo", + "bitcoin_address": "1LWHZUp1jpU31zPhrHiEZs4mQKsvkNVX6z", + "secret": "d8c3a2b3899f1a4564d12960caf8bd2e02135981224d1f1251209209a1a7c3eb", + "public": "02be30b3205f3dd43c5224c96fc73460ba227ce463dbe3accb9f8cdd5e36e05bbc" + }, + { + "address": "Mzymc2SJmEtizbeBctHtWvLwkejj88PG84", + "bitcoin_address": "1DoDEzkV4MnhEG9i4wnUBHVR4hVUHZRJhM", + "secret": "5450122d57559c9524eb51445add43f6fdb9b5b3ef514daedbbb2409380f8091", + "public": "02a630725197056ad33d7d65e93ef00353de3b8516732ad3bf01b227457d4e2d33" + }, + { + "address": "pg3L2zkpFxWvZoFFrqJB6rpbLCc6AGzuRb", + "bitcoin_address": "1GDCWw84UX9Hsmzme3gz3Q3WHVXmNwLzJK", + "secret": "e43543544e2c5587a10cb0ac69cdb99a46f31cb8fcedf0d1aba4bef755175915", + "public": "035b250809634ca72f8ff5951c8b33b26665aa4d62e367befcee476d654c2db75b" + }, + { + "address": "2ND4LcwLPgoVf9h3mWCwNzRoMKRWiNtDaVb", + "bitcoin_address": "1DV5dZn7B7XoHeLoiC7Vg95KmkqhArsJZe", + "secret": "e8338cb5e4f5008d4c2a133a5f2c5daef0b9ad807b1edca149a3ce48302cd4e6", + "public": "028f8a7bed139ce4a708872273115dee124e9187936318afce6614aaeb68efe348" + }, + { + "address": "JbxjtGo3m6fb9NHD1PXdXiePmjQoCxYGcJ", + "bitcoin_address": "1ERh7uToWS85GwcdtTovGE5tCNJH1XQJ8N", + "secret": "4e8ca2101270bdf9d18826f5b4cb19d2dad0aff9e848583d4574ca4442e6c721", + "public": "03b1b4eb17becc25c2299489bf28db1bff7d4cd282128591ba6c849d2e76c7ded1" + }, + { + "address": "2Lu6tTQ72MKV9wquyaXFja6XU9vLFScmUiF", + "bitcoin_address": "1KmGV9q2m7DbtBBWyGAh8yhMqeraTtwMvX", + "secret": "e5dbfadb988d7117ff6ffe71064f6b0af0f689a7a30a605444f45a22dd998d43", + "public": "03b6764c3cf877df3cd6cc04813061985ca1fab72eeb0fdac8020d491a9b9cc8e6" + }, + { + "address": "Bk9aopdh4aVS9DXFVteEfnvK6B1G5ZQ6yF", + "bitcoin_address": "1FCGBsM2mXjAuqWa2ZeeTv9SyUgj8Xxn5A", + "secret": "3fb44c013e9119aae6de00c4d31911a9e3c8a8f7574d6087c16e97161b8d4fd7", + "public": "03679e922161ee237706bfb3b5d08b0ff3cd83cfb91b62687ce400e917115e84a3" + }, + { + "address": "pPHJkUrsgLHLrTW3W6A8MgdrYTCyb6uipf", + "bitcoin_address": "17hU74TQvmkT8X9zUigAxgwesRUUr9bWyU", + "secret": "e5efc89a01ff944f078aaa553ce1fd81774c5a0b8f74f39c49404cdb69bb3e41", + "public": "035b2e1d01c7dd09eabc905b3c274365abed2a5439b2dee9754bb1d3d760aaef48" + }, + { + "address": "2euWrr8eWQUwofQ84zQfpStygyUdLBmHG6T", + "bitcoin_address": "1MjvAWnD6u6j8pMFDFepUbew7wtUDsaiaL", + "secret": "8985df67d23fe2ed3ba1a487d9f4e6677752497c7690ef1d6b97242bba7e218d", + "public": "03092935e59628015a627db9dc3816d2b6323fc1b383d7b6c1bf0e7ffaebb7ff78" + }, + { + "address": "2JbV1HpUFaQNxBGGzXvmgKgsMRtRLiuu4iW", + "bitcoin_address": "1AV8iHBG3xAMxdzAeAY1q7jUXX3Vq9cG5f", + "secret": "403c5105e61a06dae3846df4bb9cb015c7073137fe8c5b69633ab5fafb2f50d2", + "public": "021bf36446a0583323f37b4ccf6c3a1f7eeb9c5b16dc164a9222ce1bf58e9765d8" + }, + { + "address": "nkSd3RskDcX1UVrbi7McpTWjDDHTatAFuC", + "bitcoin_address": "1DezgRSv7e5hC5EiLsoqogVHH5vLH5LJ6J", + "secret": "936535f0861ab8774e63a0da8910311215ee5b868d2b0fb7c63e9a6bd52556f3", + "public": "039b7b5687043d02634c7a37bdc49763da72ab6dd94e0e4bb9a57f46572d1c2c5f" + }, + { + "address": "2Tsgim6KU6LQmfdvhdWMFBQmLtYU8HhJ6h2", + "bitcoin_address": "1NgCLTVpCCYtZnbZNQrRim2QWRxfpF5Ngh", + "secret": "9e4dd2b272096951ef4776cdc7f176629c4fcdc964034847a482c3cc7de5eb02", + "public": "02a8e2ab0a854e1381b0632b0961633d541f31841512aae1089be8b8a89de1f96f" + }, + { + "address": "mF5CK5hbyT59F5mjS8Nmxhc8eqpu7ZoeiV", + "bitcoin_address": "1DdmshtDtWzk5cxu87wUudTq6WUB7emXWN", + "secret": "9f4424d21a2ae111217aadf776c9070f9e499beede5c0c6ab9d6a7e8f9e5a691", + "public": "03c3bb8a4676d5eb6d32c53c82c9b2bc6d37b8d98f414e67e59fc3ec4766e52b22" + }, + { + "address": "J5XUnSVpD5BoUQHPsJb1iHXBsmpZBnFoYV", + "bitcoin_address": "1JwM3L8aYjvhSaPnS5ozCR4iXSr83KhXas", + "secret": "c41cd6d22063a0f9d674e1c23f52f1842bed8938b17bf1f32db7d1ac70b10ac0", + "public": "02489d6562dacd0b39bd71d53c123dcb69b0edda93ee428554a904bfab2d77bed2" + }, + { + "address": "QJ9mJXCzFBRSL3xgVRSD9N2qJBZJfsMXDc", + "bitcoin_address": "1CLJufL8iKLKtvH6gqwahytqAFXbUB5hxP", + "secret": "7f399ba3f61828187c23d5649ca93a4dccff0170df1b98eace826bc10c44987a", + "public": "022a0380050debb4516116c052c6b6369da3f99d8e983227d1f1ab083a776c38f0" + }, + { + "address": "qeSQ75vnGJSdfBwHLdaxNbmmh4ubrnDAju", + "bitcoin_address": "12ydwQ9Yc1up4Mx4xTRg6VyaHmpacuvbUk", + "secret": "022965e0753ecc622455ce3e794efc10afd2969f588a5653cd14858a922de550", + "public": "02f3aba0f28b0c36eabf82777f7eac06b65da1b344b4d1564d66255fd9ecaabde1" + }, + { + "address": "DQBDX9kunUZc8EhaCDaTsWCsR8fQdMFqNJ", + "bitcoin_address": "1KQjDpybdHSGCLHkLS1xkkxT757ix1EDsS", + "secret": "34b344be4497e6969cbfae8e154d837c72c85f246bff54fa5a18eb16964b3479", + "public": "02e96f90e75ea904486562d31ec162cae8b75036a75d44888e55a2a062276c3c2b" + }, + { + "address": "2M8ffrt5gQ96ec8mid58y8dob4RpEQeKRtR", + "bitcoin_address": "12hYm8pxRdoEQHnShx6vmb8WhsCj61NoG8", + "secret": "d072f6a2b4f85461aef64cac0d2f63134ddec4b9891359295b9a155eae735c15", + "public": "02fd82ff7a4f209b35152da7dec8c55a6d715c3643ffe23e53cd701b7d665da62d" + }, + { + "address": "23q2Y6do8YQ5hLqgMWPLRJoGCgHCpnmFceJ", + "bitcoin_address": "1JpXoHLf5KMu9cYaPAJtKXGYua2EtQSB6q", + "secret": "ce494783eaea98c9c19083b79aef2f8fd4ff0e5ee27acc3ec3ab810706e7d8f3", + "public": "036226b6d29fc4db7410d7887be144b48ec7cf865bc2c8457417f2e5a4fe6c95e5" + }, + { + "address": "Mj8Az1NanWTB2bmQyyGjybYuVBvnRKjJvf", + "bitcoin_address": "19rSyepKBb21ajW5eVoZNE8NkA2yMzJCpZ", + "secret": "f75fd40219820fd2984e000c531e758cc5b8ae4fbc422f63ac3f8835b0eda06e", + "public": "0388fc76f02ccc90b86c240d880c9abf9a1a2299f7a59eb21f26f3d8d55bf5a6b9" + }, + { + "address": "2ZrbqGFYr8p9AHYrsGpMX81Svf3esHnv23w", + "bitcoin_address": "1MsAzwFLnP96RzuFn6pWhs2iWvmf2FHCJf", + "secret": "e84439ec6b8da8758f88e91f33fa37a47ff218098520c634e71fa21897720bf9", + "public": "03db7a56071a216deb554b5b3bba3966c531a63c4312a18504e2d0b5780303fca0" + }, + { + "address": "2buvFGVozbDCzRpadgLt8gYqwkYApVzWzXq", + "bitcoin_address": "12S6sxRtUjDRpqfSCYjpC5zSRpkQVJtPUF", + "secret": "648af6bb80e569e9e7d8155f81459d717fd7951362fde9ca5521cec0d7a8b44a", + "public": "021559a6f9630c7345bfa81feb9181624af8a21d831a49ecc9003a107619dd7cf0" + }, + { + "address": "rYd8g48TD4MQtPbKaCoZt8xzMNx1ppHqPd", + "bitcoin_address": "1D374ERwp5ZBmVwDoaBDpPdLLzVf9pC4i3", + "secret": "fa0a33e154a972151f7b7b371d5184b07ac8ddda8141e1d0b521003ddf05dd69", + "public": "03b12cef132a3b0d6fcf79acac849681f24478df506c778c34389b5a02c660778f" + }, + { + "address": "2LVoYHBtfPiXybV5D6DRq6X6qrQxbDB6wB4", + "bitcoin_address": "15QQHvxRG2TXLCQwxc31rYkhewCfZYqjuH", + "secret": "5a350017532d09953ed6e32bd8abb0f7a47268e0e4022cf15cbfadedf890518f", + "public": "03c7475b5097a89c68652a7aeabbec758aa18f102b2fc87289f993d694f0e89c80" + }, + { + "address": "nCGXsbdNQgf8HjjRDYzDouvFvQikmaZZVr", + "bitcoin_address": "15haBqYjhbzzunWKn5mqWXb9KBbUzZzB4z", + "secret": "f6579d55c6fc7525d283831af9360d8a20a7c856dbf92fb1c5a02c146f0413a9", + "public": "021780bf8d1862a81ea1a75a89a9576e0330d0b4d20a61e0817bf3b9f9d52a815a" + }, + { + "address": "9z44BB51AgYhr3Ljqb2zMWQrvLpbLYd27j", + "bitcoin_address": "1MJmn248oQEyzJ1HeokN15MnD9A6buoeZv", + "secret": "80530625c63b9b6c1dc510039f379a8b01b0d646fe569ea2ce35322a1894fdfe", + "public": "02765c54f55f261a24c164a2ece6662d0008eb3a9f3a379d19d2b624d431738a53" + }, + { + "address": "ZHmtrHfaxG8U7y7pjf9azLyUtvYuX15egH", + "bitcoin_address": "19dM7Ms3jtynRuuQAuMQyqyDpu24hUGdLG", + "secret": "14b437e7aee69001945c95d203c08f9d19dc8a8dde97c7133d296b883e58292c", + "public": "0394c3de2b6d85c29b7b066318a8bf83f9758474f595541d9154399a790d1a0299" + }, + { + "address": "bd1D8ZA24hn2nnXJFu8BVdCZ9k1TmMADoQ", + "bitcoin_address": "153HoAVZ4XZKsaXgNaQJX5yf7ZwjayS4tE", + "secret": "e32ec60d9815b47f4de798dec53ce29d706abd85838f6aed87bb9d251ef25114", + "public": "036c0a31bd777b096d09636c11892bcf197668cadd72d339a926a404fdb6e6c9d7" + }, + { + "address": "2g5eNKbSsUF2NXqGkPP9TuTa6YuiJTaPKgF", + "bitcoin_address": "16o3CutkcyBN28SdeC1jvQUERpAS161ssQ", + "secret": "12346069b478a1004cd81e9056a4d56c8e8dbce92cca698916e93e1609bd603f", + "public": "03861f1e168860ff59e647b1b64617bb08133815ffa56fe56a79d95f2a97654298" + }, + { + "address": "tDw9LMweotZST3PeEAneUJKM4qn2Ti8Pwz", + "bitcoin_address": "1pLinRCpwM58xZj1fE1sKEq9peKmJqQWV", + "secret": "a84d45ad2f527acbb1baa76fb15f252a4e5e79763a059232a412e585030446a8", + "public": "02300b36d580deb81b563d5430f1f91b930ec72838008a1f7304c466ffc70bec66" + }, + { + "address": "wHVfmjDbVKmfYntbXYARdPyDuUUoAAw6op", + "bitcoin_address": "1Be5tfn7SUzRm5nL3rLdnnhy3nZkza9fmZ", + "secret": "206f1e19e7b1b8c61fa20a1aef9863d3119f348c9b82d4f8fcae8de42525e6d9", + "public": "039a54db3c39cfc2fdd8a2386f9e98e55462c1f1a041432ee5fa87c1fa4f70efba" + }, + { + "address": "FgkCgYgEbc9rAuuNUdZgeUwCw3XrnGFX3s", + "bitcoin_address": "1Cr91twaYqkqZjLPLaKpoRmD6vuzPyx5aa", + "secret": "db7cde643d4847775836ec285af69de816f699048e64571cb911444e258cc40f", + "public": "028332c7267e536582c2308c166c5be90c1365fea194a4916bec575f19295259d3" + }, + { + "address": "2R9QoPRT5ucDMXQku5T3ZbHymPGkX6SNSgH", + "bitcoin_address": "129FLqYQcLpPoYk4s6uZDijYoi3Gyf3THP", + "secret": "9cb4301d96c544ce6f3c19071c5145b89b100ec8aef58bdf90c90aec054ce985", + "public": "03e9b2e1541e9559887ddc09f22f575de87db66b895eadce25cbb68bb243068b20" + }, + { + "address": "2n1NfYxcLwoH1jakovQ2sM4ShKH3Tcs4rWL", + "bitcoin_address": "15T8dviLFi2fT2ykHr4Rs2M7yqUSoUt616", + "secret": "7b031409b353b33f8921ede8a6b03c6b61a6b1a4fe81769c79751aa7b023ae3c", + "public": "03f024762d6f497aef1a1fb90deeb34da641b8a1a0470040a784fe85dae164a406" + }, + { + "address": "2E21TE2z5qCtTT9WwXNWD2jQBLeH7nGB6Kt", + "bitcoin_address": "15bM6dshvVUuRYMroNYMmYQ35ESG7EBuYJ", + "secret": "555190ea46cad100a23dc8261250dce85ae205d2848c81477ad0eec31d9070dc", + "public": "0252684dff78d0b15faadb0e0d4f3fdc9ac9f168b62721119bcba98609bded5caf" + }, + { + "address": "2gRYextJNcQE2TJUSCBxhcnEK1siAtH7mhU", + "bitcoin_address": "1MrZdkxS3THSV7zDth6irPd2D7eaweVDMq", + "secret": "fd895903859ca6a879f8a6214b67a4458a804965fcf85f893d04df4fcc1dbe30", + "public": "037b4075a8e23d4d14e5b2090fb78c0cb72737197f27ce1da81ccd1097cee99db4" + }, + { + "address": "2M2KmM33LeLGZ18e4G9CioqzSqaAsii44bE", + "bitcoin_address": "18eNEbAarg5cf9zHQzY6M7xxQixDqQAijC", + "secret": "2bd1ff5e663a33f3d36df0dce93148789ec358093ff3e335e88897027a639f81", + "public": "02e579ce75e735146329eb9b67c5af870fd95ab070bc18b80ce8a536c92db98189" + }, + { + "address": "zeUUj9uFNSgkW8VTHjR7AwhcfKsa7xDwMi", + "bitcoin_address": "1AEDsryXCrujTWmrqBwXqbi6F6MRSrYuD1", + "secret": "ed2b56c6babfc1a1a55f8d393f35b517993a61651b6380d938ab0dc322a00e66", + "public": "029306804e046440a614e43dca6854a37d194dd58867c2efbc109500a63b85a38f" + }, + { + "address": "2DdyebEM9mHwrX3jmcTvzgnmdBQYetyNWY3", + "bitcoin_address": "1Lg8yxqowZozNp3YEkf1vEdUfiwwtL9Pnp", + "secret": "4eb31d856d118fbf86e151a08615bd20248315f8ff9666e7470e5ded6423019e", + "public": "026812e3cfcfac2970a723e05c5c457ba99e2298b4ec06a5464e59064f29a10d95" + }, + { + "address": "WXAafhTwvot8bnNY1ekUDmad1b3xzW5KoB", + "bitcoin_address": "12tv3smHDLPpe3eMMKnBuJEYmB5ez3gos7", + "secret": "98690f96a8bcb814cdb88a6ca5c5bf260586a1919913a2af3e5bf47f4843cfc0", + "public": "03c1ef010a6891cb5f9a34302b52f6cf47e1859dfebbb0d8aec889ff93e95a27c8" + }, + { + "address": "5Qf7bQMDQgJSGMXPh6nNJdFHjbbPr6vyB3", + "bitcoin_address": "1HjZaZJBw1sT5xnnc3ejeht9PG1se1jzBy", + "secret": "87cac60697e5670624b0086a10e5a3a29b54fabcd302e8fb22e1f46a319c14b2", + "public": "020edf7e9ddb148abc5e22cca11b3eae82a28832d0069c0dd54d75f87105f1d2b1" + }, + { + "address": "SKVDSRbKdqMjhR2ciTEc8nr8zXNHAcrSfS", + "bitcoin_address": "13LmVbGZJU8oHQMMNFxHmR4gTW2zAxms3C", + "secret": "84f3f3b47fc67662ff7353d14f28c64d824b2e877d457fc749bc437e6bcd7058", + "public": "021e6d35f208aa9bb7d4c920c3b4d10eda891efd7f9af569e6e6bc624ec5c8f3f4" + }, + { + "address": "gowLNZDHBB9tNmEG6qz2NNwGkY1SouL1tm", + "bitcoin_address": "1A4RtbfEFU7pfwTBUkZHg77miS9x8otfjd", + "secret": "b25ece468580847a3857d3d694924060e1e385d8d6c85e98c1b495bdfd8cdcdd", + "public": "036a8d7baac3beadb20bf1b5b6e900c99f1a476b91e3ffdbd8ad6cbc2310055bb5" + }, + { + "address": "Fsh4tkUymVnqmGiAYC9wX48fw2fucNipFb", + "bitcoin_address": "1NfBep2LAJsLhpF9mNC5ncpD1NoDFnMr6Y", + "secret": "e3877a2e5b413ff58ac84a792cbdb604d38b960dd5e5ea978fafd0a60850f746", + "public": "025775cf3978b487bf7aa201683a82930a0c1e8a61d466936c07006f719bb7fdf5" + }, + { + "address": "2Ma9qXTpbJ9JmYuUhZU6y1nwXKzJwbE3i5B", + "bitcoin_address": "161yywi7o8hDJMCNc3yhfnQETLDbJMCp6b", + "secret": "6625fc71d334dd607a82f6cc4e73a260eb9ae5a08b31f323bd896714eb38c7a0", + "public": "03132099778fce50227afc5e41c65d9830ee2930bc789e242dc11f153dab5538dd" + }, + { + "address": "nsjzo4SXJK9AXaw8fSkossG7einZQxmjuj", + "bitcoin_address": "1AgigM9s8wHQk5HteSVXzorQshzwRsRuhi", + "secret": "5665f7c5048337a78dc75c98c591b31901ce7fc43a8ba5ebe7f45a5ab062d80f", + "public": "0263deef3218d427110f58d0d72a66d0deadfb2d9cca0aa2b2cd283ec805cf87ba" + }, + { + "address": "2ipWusQvA7UN552H7e1zY8pXb5h7z9cvwaj", + "bitcoin_address": "1HukHuxmTeayc1cxpzVU6CaYyBHymwtZxv", + "secret": "e0842dc4b26eb0d3f04ac0aa9abe86fd1bfa7202789543ff34fb08078457c419", + "public": "0252193f968bee3c45adb88c4881c0770b49440782a1ebc5095ef6c1453a3a039d" + }, + { + "address": "f1xfUvKjRCeBzvwdfCu399cebpX1vDFESV", + "bitcoin_address": "1PCjYexMWywyfNZjENNF27wAWJjKGsvUiz", + "secret": "f7b7138be61f2785e5d7dc9c4e987c1dabb7913c5c675d68cf0dbf6ea3511238", + "public": "0313f2f2a40cff2672943935a0b529624bd8be43d65de1eb076e983b2f0b60d36e" + }, + { + "address": "o3YhEi1J9QoEkk48YwCdhdSPTZVX3FJDGQ", + "bitcoin_address": "1CvYkysw2cMh7GLDXy1ViyBPMxSUYgQasj", + "secret": "2acfe55aaeccf96199403b04f37e350244b04875946bbacefc321f5514de675c", + "public": "02eded9af107b76a0339242ac409f01664979a8edf182760c393a2a67e9f78ed40" + }, + { + "address": "49SvQFsbWdBB5y7ijBYFcDJL59Aj5NckFY", + "bitcoin_address": "1GeyHm3neiW9sGgKUbxdEv2TZKEQpDPmjB", + "secret": "766221b7013f73b64fa328c2633456eb66fbc9dab7dabb17d3a87d1ed1fb1517", + "public": "03268b627d2d62a7541c7a376738a170c897316d93a07cfb3890414f010fb00db2" + }, + { + "address": "joV4SQMdpCUDUZftsKLd7NNLshkHxeysLY", + "bitcoin_address": "1DszKrPMFCUJAn7mA3uRZ1eL6v9JX6vLBJ", + "secret": "83fd7eaa0dfd5f7e7897994d162de93d91b09aff9b9b685133c3b3f372e00ced", + "public": "02afb8fbb2f77e29f3751a5e3c9be92b4a42e05955c7b58d5c09d878c233571460" + }, + { + "address": "SmSro39dpb6RCTSd3xAVpQcXtauUk2zzL4", + "bitcoin_address": "1BgnbCdKjtZoBPw5KNoA66XQPtyWVGgWZv", + "secret": "88c46c1b53ce49abc62814e5564496b3b0c1c3a51dad775191f8ddeec522f30f", + "public": "03cf3e3cb197c3746187b8a0f3550c8389e2a00af834dfcb81ef3eeb21c5143dd7" + }, + { + "address": "QQwrjn5k3khUgvHjPst6GVHn6F2AwNYs1p", + "bitcoin_address": "1DcU5co66DTLWsG6zeyppzbykzT9fwSETa", + "secret": "c82e491f70f9bbadc4bc518cc6d74eb9149b1a10e67529874dc9292339277d74", + "public": "027ab1776783179393527326b64836d737832cc5b9909cfd1219024e1e0fd0fdc3" + }, + { + "address": "JAgmiif855wDZgaC7U5wYg9dyuWi5nxPHr", + "bitcoin_address": "14rq7YtHxwkuGcUGAy79oxqmwzbxvp6yVV", + "secret": "25830dd91c4037776b390ee7f598aa8fe65847169437dd925e240883b1947b8d", + "public": "02b9f656a6ac504eac5f22cab1472e4760fd5064589ea36492dc6d7ba2753ee5e0" + }, + { + "address": "26MHnfJWUL4uNee9LjdAGLGa7HC4EpLH7S", + "bitcoin_address": "115LEiKBtH6xF47iL15L74yeqq1NcL4F2H", + "secret": "e70d55437795dda9fae07616b2eddc1f3ea6f3ab0f971e5f7091a225caf2fd88", + "public": "03440d9fd95ada18ac1076623f92f9e2fd7d2c4493c504bfb5faa2250aa7d50cdb" + }, + { + "address": "k4jTLy6nhFhpxXKogNAcbbhXeKYJXKqgA1", + "bitcoin_address": "1PNqiNy8fm6QbjkFgSTbm6Y9agQRqARGPR", + "secret": "fb3c20a167fa642a78d55347fa54d9e1d7e2a3a0f0b43534faa6d846b84516c8", + "public": "026648469e9a9f18ec527885fe8f2665acffa546979007758fe6ce2892f0a26e65" + }, + { + "address": "gMDDYLmdNigohzJbpH4pkZEVHGzdpJC9KR", + "bitcoin_address": "13z7H93SXZYaBYsAAocDg41S9CH2Eu4TmY", + "secret": "b06b09ff98110ed0e7b76ca84288d7a0a73693d0d1058310b46922873b276252", + "public": "0298bcde4659aafc2d6f55b394de41107c400ea786460e01595c1b0ce568d0f928" + }, + { + "address": "2QXKE1KgQvHLfrUuP7pK1xDo8BHsNNR5wu1", + "bitcoin_address": "14Nxg3rEXoZ1BszDGQdfpx1mg2Ut6djVNf", + "secret": "b476c0ede7587bb5d76532c984fa5a4d810aa4341990837ebdb70e9e4d4c2099", + "public": "0378972efc8ed0aff8fe5a9b530bd70b697150c45799567bb21fc24542802157e9" + }, + { + "address": "zRH1vs7WRARth893W7ZXL7dkp24JJEHLfm", + "bitcoin_address": "16uXSXWoyFLatboF1GLFoVBBmpz38GeWsm", + "secret": "137303696ccf1fe9c4a3167dcfdab890f10fd46861634c17b75203d1ed181bcb", + "public": "03b241d494fff26c5fc1a8f9c509284151794696e4bd5736184e42bda7a2d1ceb5" + }, + { + "address": "2bgEuW1vkDRfSvzVaHrsN2V7mahtMsopgJB", + "bitcoin_address": "195VfixRRfihsThi7eihStoUUj81z5xnry", + "secret": "7584cf68badbf5cf89950fa55e92d38ad678b320a2dd87baac186ed272e3fc73", + "public": "033697a7ff566de076c1f62e21964078876ff0bf00cb52c6b0ec28885a5703b4c6" + }, + { + "address": "S3M5uARXPFWon4dVxJbFt9oL5cPZDLGEzW", + "bitcoin_address": "15FjpDfSx6GpymbtTtf9zcV6sqoDxaSsXx", + "secret": "34b07e4545dc8d5681058630b94d16b76e302020a295fa72f1f3ea5f9e555ec2", + "public": "021f506a48039b0b9daf3857207c85213a2e6e9a86b9e7f19174835c0a7fc7ff3b" + }, + { + "address": "29LsJE9Rp9EfDjMCoFSwhsJPy1BvB9v7iaY", + "bitcoin_address": "1BaB7TxyPw5F4CexRrkJ3m5GFfCsYfMMSy", + "secret": "dc9574c4593e48481e7ed0e4178289f238f63cbeaf659d9d7d9e67a919b60ddb", + "public": "022922ad2cb0d3f22f0d7c8b990db9b1c98bbbdc5c172598da5c9b0cef6d8f3537" + }, + { + "address": "29gtaNw6Sh6Eza9CLNTR6AsLYP2s5RqxBcZ", + "bitcoin_address": "142XmpGMLZ3dy7J7x47657k2nwuQe71B9R", + "secret": "a76b65ce9b49e5ecd1952d117713097b3c8610bd6a024190fbee18e516e87d86", + "public": "03428a59615bb06d26ac224215f79b47b3b90aa677db112a2a80d8a9848722ec25" + }, + { + "address": "21iG54TP9jygdxhcdceUrk2Szvg3PRHteTc", + "bitcoin_address": "1Mxfh4sKD4wUZDcnmpJJRgaCyGd2EMCGFU", + "secret": "67c4ef1f760b5953ebb32055fd76d8c2bc2415c72ef8bfe1a8eb40647b199d7b", + "public": "0397a70380961422ea32c25a34b0cec7cc58fe7f62f9501177ece0b6acadc86c59" + }, + { + "address": "XEzXQfHKhQuMtgCHRRNWYZ7VTNCJUCy5Dr", + "bitcoin_address": "1qgKGTXCxzZXJ5L5vETAM6bQLHZkNBeBC", + "secret": "8b71c09585dcede6d668bf0020787ac50c9556714321c288b4e0eb8302864386", + "public": "03bbb9313b566fa2e5bb153af95992adb39d1f3a8f77ebe6d36cf1d9e874dec0fe" + }, + { + "address": "8safALsBasgBw5U52rryWk5vWa3XWmQfks", + "bitcoin_address": "16CjSNpoUpSBLby5ZymQF5sJRNNguSMyRM", + "secret": "ebb458a1777415e80574e94ba3fd381ecefd7871dd3f8e231ac97948d9d6af2e", + "public": "027841bd654f450121a3730982808e7526365f4ead99ed226cde64fbf460c9ef52" + }, + { + "address": "o5j27rParabrSJPUGGC26yX6pBqqNcDi7", + "bitcoin_address": "17hwMUoUxLf7STDYz6o1ShgFYWeWYuc2n8", + "secret": "5091e3ea0d50a88d12c2f331717f87b5289f26f12aab3145c017e59823617b9b", + "public": "024a2c3b28276e59db236ac1458c165a30f6e8fa8af411e663aa815d2f0e0f5a1e" + }, + { + "address": "26XbTkFX3sXem69GaSBHezQkmRzGJLJsdio", + "bitcoin_address": "1EKwBE29us2GZqHPvcjWGFFzc3PpjN8wXc", + "secret": "dbad683919d198390157accf51d1c246fa6282d0ab494aa418aeae9152219445", + "public": "03e4009cac3088edb22bfea5ad639016b64b36debb1f12475cf036c37ad4e5e69f" + }, + { + "address": "yuFUDW1RSa226gQKLG7d8GcCFxFVaSb3Zk", + "bitcoin_address": "1Q7K3xu8As2gVbuGNHKZ8Un7o9VUem2yVM", + "secret": "d2b5f0954912e055d0dd56cc3e921147c62942cb665b4d52e60530edb32d72d3", + "public": "03d12828f548687480d31b41dcc6c4e90b6abce46ddec55586a6e8acb7727157d4" + }, + { + "address": "2kmy4ccRfRCDcaFJw2G5WwikcoFCxTyFmTM", + "bitcoin_address": "1KGSerPu4DtbB5Zav8nMrFEiXbVQcKxpV1", + "secret": "4381f86b3987baf546fd72efa280b8dc6b0819fb463d8ae5d591ff5061b1c12e", + "public": "021b20bd44372c14999ddb5f777d7d16bb7c2df0123b210e1a8c7e56701accc848" + }, + { + "address": "2K5dB6rem74XYuajLLhmxk1Ym5ktyF2rHK6", + "bitcoin_address": "1Pm21axeLZRBT8uQS182bsf8kYLdojpnUs", + "secret": "d6aeac3755497bac024965298fa8e8c02766122c5e99af88091751a051a1a84f", + "public": "0243b5a4cb7d2a422e2ab703520fcafcad3a62c071a1e18e827cbdd16b982af1c7" + }, + { + "address": "DS89RK7MsmZErHe4vc4a3zqp7BCatZYYh1", + "bitcoin_address": "1DK32VGBSy5cTPs8STXEfVSxiJqk2pzMaR", + "secret": "198614c6bac55b6f1ff6561051c70cf4aea344587f637e526de39e9179d3a4da", + "public": "02c92b2f731386e94d4a43f965cc443c19e5da1b7915084ab4888cb8348944194d" + }, + { + "address": "ccuSWwS7Hvw7UdQgNaZGqeAXH4v3kCsoJi", + "bitcoin_address": "12r6HKbAis8vSdWpPjbfRbDiEYQ3PEWoMx", + "secret": "b1e8829213ff5231968cf5e7b9ff13cf83d945a7de3eb903eee46d857903f544", + "public": "0334c602e039256862c040ff3200bfd591fe65c5f10e0ec6fa8b173a03ab4b20c1" + }, + { + "address": "QxgofLYmG7Cyyqg9PPbcYWUE4Jf5r6JMmK", + "bitcoin_address": "1AeqiSCeKuxJ1Xj223HaUkHRfW5RcJEktj", + "secret": "9e617dceff8339cd34094b9ff8cf3ad9f66c702528b58391e94f7c9b775a2313", + "public": "02913bac8d16a9df9c8a94507a2d93d21d7bbeb5733e3f16a1a619c8d4649f610f" + }, + { + "address": "24BL6QMtEsank54gFDG6JfGbKkzcfmbYHvH", + "bitcoin_address": "1PbSUv5Hs2VhFgNVRLM88Da5LBzzKvuxbi", + "secret": "64dbde8e8125fc928c4805122ed1def7a968ac458d949d50e77b02a9b72ff16a", + "public": "029a30417b752a63570caf8b4caf3bbc9df6ace56320121f59d9f3f73ee5c66419" + }, + { + "address": "iNCaYPUY7iFwuNdKkBdF2QRbuJG2Z89T5T", + "bitcoin_address": "1Gz53uqH21wFkPcPKMTwzFyj5huDJZ4jiN", + "secret": "4532262c82d391663f96fb922d3eee86179deab0395f32e658c243dfc4b259f6", + "public": "03e9f19634daa5aea15533f097d2e65fee7e427a26f690530f8bdf8592e08563f8" + }, + { + "address": "B5PrWYoMX4X6xQy6vavi6aSB7niTTxBEUo", + "bitcoin_address": "1A4qMvu7RPJfSMmStdDzMXnL7kebxWw4v3", + "secret": "e43f066ecb51d8b88e92ec6bdc39b62482ef349353eea9daa6ba866f336d12dc", + "public": "03e36925d3826236e41efb6fa4c7efea1c84979cdcbb299707028fe8deb3344140" + }, + { + "address": "huYwnnc82FHNNdF6MomXUGE2aFu4Apo1eB", + "bitcoin_address": "1AhjjUUsFgSaECAEihA7BTQB8CZgUMt2Po", + "secret": "e835d2a47abf7865afaf03d7399e038ade3c79ed40ded121b3879010ea437ada", + "public": "0397c04c78b5f17306d04bdb8aa986808e2aa9f736376cba5246bc3c766a552f29" + }, + { + "address": "2Uidx5h6vU5ijGsigtrhtCymmXgkdScXu2A", + "bitcoin_address": "1LTpYytpSXDbCbv636cWCfoxZqoQf2PXPE", + "secret": "9c97a07295238b5e968fb6d256efc0298b2d86ad339f41a22aa99208e441462f", + "public": "0366fa3afaa882fe120c5461c7831818ad771eb4454ac1833be66e4409d68c1d5c" + }, + { + "address": "sssGhHuMTELS4afckMa5xCfFwUdoTpQogR", + "bitcoin_address": "17E58RAReDbJKsbnxsr2kLKQgBA9vJQzoU", + "secret": "b682db37d4e64798e7ffba455ecef95ee7134582f7ad72a4f077a4612dc71eff", + "public": "036b3043af63338f60227ecd8b810e122f6efae22fd83e579b7cfa75dffaca7638" + }, + { + "address": "23FmY9Rvb9WWDZnQegW9HcwPcSSWXJYy9rW", + "bitcoin_address": "1NRe9RuWymHPUGQ7jaYJvrVSZq7tQ6nUpc", + "secret": "92bbd9023b9bd5a1871b23a4ec30144b4a9403a27aacd207df2072096fc74a92", + "public": "02530c3e0158aeb99422c5c23114e494ccefbc6581b27e46b9c1163fe71973fbac" + }, + { + "address": "fqdRNStjfsNdmpK3DQK9WVTtSs2mph8Kwt", + "bitcoin_address": "1L2wQ8hqLcJcAHegs9PqFMqBjmJ3vfYRrY", + "secret": "66fb2e78682b560c4ae978c5ab294c8d7f6d710cdd5914b4d613aebd89d3572f", + "public": "022d6a236600e6672d9e4f7f10bde1b42f2950fcf21248c8f6488b95303539a3cc" + }, + { + "address": "ZJiG2CGoqtSx2GkuxFvoToLdcnVHHzDtHi", + "bitcoin_address": "1EFa8hURsQ2sjnLLgUmd9NG8xA2bi4HRsx", + "secret": "6d95dac69ac754af9e1afae5ca34aabdf9b810a108804c58723248fcf4f05466", + "public": "02092f669a4858e627bb5a371f629aa9de2db91e1ad7ba633d027b6354af8b6811" + }, + { + "address": "stC7w5uT6NxykyuDTr8wa5yXhHL1RQHHHC", + "bitcoin_address": "15PgLs8PkTMEDLkyFKJTuEGfoCARPauXJL", + "secret": "61073b41891fb56c71e5f7483e63807b6912763019630267c19ea9d9cfc93d84", + "public": "035c445fb99914723945b2c1e1b54b7ac35bed350284b0d93e5d492a41cc87d86d" + }, + { + "address": "BpWeZBhPNCYMpzBiKMcUNaR8qX4kdxdy3E", + "bitcoin_address": "1N4wxrJBVbihZVRHPdTn4HZTZdnApfBQe8", + "secret": "5ab3d7484566f08ff1be3c9c9dc74d001c5531fb5ecdf98f87bf4e36b6154153", + "public": "0229270ef80ce2340bdfffa6e4809fc43f9a033037f63a865acc69c12773b64054" + }, + { + "address": "2SMsFtscMGLu9Sx87HBebRG8naW4iLA2cZz", + "bitcoin_address": "16NNCoPkzPk4Zu6JYKFDuRfQm2jVcNZRb", + "secret": "1e528bd5632186db07cdef8449c1eedfae575ac4c56f0bf9440b4e6be28ccb27", + "public": "031b597d85b54343593060588e1c4d820a0295ca573cfb88b066be174b69a93a69" + }, + { + "address": "bnDptZijEK6av5LjjaywjhgkqyU3xRyadj", + "bitcoin_address": "1zPBiXQREiM4tBeD68Wo27P5mirQC9TFA", + "secret": "abaad2674b08b8869a3c66dd86a6197c3f0505cf07b1f20a8f9ae934ba2dbd1b", + "public": "027e4a5d95c683171da70094a3a12c2bdf9012745d509d1ee732e58c0045035a9a" + }, + { + "address": "wwW42DUNggV9cmupj1Qf6uHU5RmipL1dSC", + "bitcoin_address": "1M8cwbg14zgYZVtVV3rmTmKnLcFhH5XLvP", + "secret": "1b9a75bdcaf6b9b4d4f4994233126f28d63f56ed11d7067a69fabf946b313456", + "public": "02a842939d4a77bfcce9994708751b564ca29233672149b4d144da27586c98ecde" + }, + { + "address": "BnRkAyySwtJ3RU1AcqLfNBFUwi1wp4SoLP", + "bitcoin_address": "1Hvk35xWSF9JTTHLB2YbC6B2tbPwqTrMiD", + "secret": "9d3cbe92944aba5c8c0649161a398d3f8f458c269d760e9b625acce3a476ed8d", + "public": "025e1cd036ecbdbfb9123ff839f007ec0feb3cc66d1a82965ad373508079669031" + }, + { + "address": "jdgX9aogovnV3BLVg43MoRmSBXUKAaKwaT", + "bitcoin_address": "15LPviesNmW6pncYPrsrf176s8J7khQfMp", + "secret": "3291f3e77bcc03cb913fa0aaec62c75f43311037ee80c80df8d162969a8756ce", + "public": "02551abd2d1ba1bbd28d2e6016bc5e41a56d153313c762797c7b8749643134c4f1" + }, + { + "address": "ZG3RtZogdoEj2gUGkgZgyqD36EJnGaBKFL", + "bitcoin_address": "1JzxtGjJXVNzb9XasWvmezsdGGzHxEJ6AT", + "secret": "3dc50dea1948cac53baa20453eb4e457c545e7b6d07c07eab23952188bbe041d", + "public": "03a100b0493995563b865c1a58612843e9120dc6b0577f95b04e5839f0260d56c6" + }, + { + "address": "HvNoZMcknBtSHMGmkNAdviAqmiynJbkbEg", + "bitcoin_address": "1NjkpVs5ytZppotCHAQvLmXNWZgFozSGyn", + "secret": "6ba1222dddac6d0a5bf8a3539d01e4117e69b559287b0bf56afdd6055d927bc1", + "public": "035559216c7f0bfdd24b03208e5d77c82dffb7108570589b4c6e9172e982c9ca03" + }, + { + "address": "2R94sJXypsCnnhWauFb8XKtJrLfNJ6Jki7G", + "bitcoin_address": "147RiHEogaLqcQeJSTARXTrszpp4bUsSxW", + "secret": "4c8809559e07f860b56132a1cb6ab660db9bd15bee02991c93dcfcd9c453b7a4", + "public": "023c9af631584445b2a6c7c22353478db1ca9d546b7af5c7384e038dc6dc38085e" + }, + { + "address": "Bf3doov6qd9M9iTzw6ppuNSiv5FnsBnPFj", + "bitcoin_address": "1PLbP2ayEALT3GBmwxvNZQjgqMhyma3h9v", + "secret": "f513f76c64ddde08ddbbf2a38a39f864218d65ae23bf457a790ce5e1c5b37893", + "public": "0304b8ecf1a3aac1eaa6b67032047848389aa3feccdcc3cc6dd5ea661c85ee5f35" + }, + { + "address": "e6297wnTqHemj3UjUsHEcfkWgoYLY34ESP", + "bitcoin_address": "1LjhGZ2FkcSfu4kbxKFQxqKSQL1RQBGVhm", + "secret": "9d69dc4a3bec0c7c706356c6ecd1c7ac5162dca35a6aae6c9ed8df86885aae50", + "public": "0305c56afe0588c191b0dc1b0ce37df4dc8e71cf6e9e55fe68c18c094ed9dcbb5a" + }, + { + "address": "sFwqVVHrN7KHN41F8jU9g7kwYpAJkQ2YXf", + "bitcoin_address": "1Q1Xmt9EQ2XcfqqUSVxVzpgEBZPcY1VB5X", + "secret": "2fc60a5c19c707445faf08a76ef89f1d4d8ce0e6ab883711ba859851ceef19a1", + "public": "023e2ee53efc59e8516a65c36f5655d57b67ecf64afa4362235568d6fbdb9aa872" + }, + { + "address": "wTttDcbFvgPuniukJhxKV73XKxTGjLt7vA", + "bitcoin_address": "1QKuYtYvU5ix1dmmTBVbyEu9kVnXRAmUx2", + "secret": "545c0b9625e5b9c9929e267c4f10379447b7c5ee9fda6f6f6b3038ccd563266b", + "public": "0357953cc18907b20e5516dfe2fac4b35c33a778559fd21f2a7266defcc5b0b8c8" + }, + { + "address": "2SCgJ7nLb3To7LihhrKWfZLNoDr88k4pcEE", + "bitcoin_address": "1BAnskvjSc6CBVky2btvuGbvbuk1s3btmk", + "secret": "8f37ec0ae63e299a6ec5db7fe241dc30acc8bcb1f629d66326c7aa79f5263d6a", + "public": "03eba8479f757c91703601cafbb601db428be8f9acd9c6d2c05440fd42d87fbf2f" + }, + { + "address": "265SGFsQ5a65k16Mifui5R1GvtuDpnuN49Q", + "bitcoin_address": "15cRBi9h368vqLJ3eDBXhYzRbtREWbpiZa", + "secret": "c98ec995d808922549bcbc5217c826bd3e0369754dd09396bbda8c5a7be6b1d2", + "public": "02cd1a00f584cab9c9fcddbc21ee8ce269d055ce230085a6318922335c00f0fabd" + }, + { + "address": "WJcJburNm8edTpbPVMNqnTuWFWWGRFUhTL", + "bitcoin_address": "17BP9z71cB2tu7YorM3YFTHmarFoePUmyi", + "secret": "3d8e9968716ef2e8ecf5c260a78af235a76be4c35c33b7ef44c9612ad061252b", + "public": "03aeb0564afd126b603a47116caa9a6a9bdaae72f6b16b57c278c8850e77669e63" + }, + { + "address": "2ZVfdVcExE27kEsqXTHRvH4CWhtrgerytru", + "bitcoin_address": "1HqpJ62xf29V3ymnKmC2UPDsXdW434mwBM", + "secret": "017a418ec986559a235f235e40dc1a4847c6ab6c8379769ca1e3f53263608a1e", + "public": "03093f374e5184893941460723c082e6c03edb07a24481011dc4913045e1988f3c" + }, + { + "address": "rrzosBqV6qPrLcXmUi38E4JuT5HK9p5EZ2", + "bitcoin_address": "1FU3mw2GJ4uJQUfxucP3Yvi6ELaqtu7Day", + "secret": "2be9b2d68a22435750341c07bfca519a0282f6b8e8a89504cf327fc0361d1794", + "public": "027ce626a4c6ed8ec8442d196c2779eefd48a1dbf14136cb4a2f1fe203d1a5488d" + }, + { + "address": "CAh4fftzSytRiuoD1mhKPr2odx1we74S9M", + "bitcoin_address": "1BEYmk7pB5ZXH3r1ErYo1YkVoqqWxBmSLv", + "secret": "7d86a42ac216a345c761f28412c606c3ddc518021c44ed5d9316469260eceb77", + "public": "02369a7e1b3527c29616f6b9cd7a9264ebe7c4fca5cec9249ec9c2fbdbaa79fca4" + }, + { + "address": "hT9MrhFKQ3st4LaCSpiLYMvHhKDjHsWhdM", + "bitcoin_address": "1Fdy4W5JoLq6uGp4jwpoDedCzetnBRvV2i", + "secret": "88e7e0a3b6709d657b686c3b44c7c94560f4287752206a80c819d18672042bbb", + "public": "02b1fe72058c93ef78e3a0d766a577d0483b34fb8e1310ebdfef3072373ee380d6" + }, + { + "address": "24U2xuWF4Sy7H54J84cTwMe19tZpJGFpYv6", + "bitcoin_address": "1EVZSvFYKmc1VLNnuzKsFP51vAsG9vA8DA", + "secret": "f66c96e161c59ff504434ef31cba28cc01bae76f9782c0ddff2b7a2b3483b44c", + "public": "0369d6be394fe7eabb5340fb2703efb82b07d92fafaf46a66716ef3e158abba759" + }, + { + "address": "2GdfV6jEBBCq39A1TAuReBR6MGu68NfAzQv", + "bitcoin_address": "1Dnr2hPXDbWZ8mr5HAbLSyxV2sP3ikboCJ", + "secret": "ed97ecfd2dcffc1bf79853d1b659720afa9334b3e94650a4a7561580e97699c4", + "public": "02abb05b3015f33f2c30230978b680f1e8e9ea00d1ee067521cb54ec3a5320a712" + }, + { + "address": "G4W6UDwRi3n4s3erXq5viKHfD8Gt6Dv6Jc", + "bitcoin_address": "13ptfZFj4DbyrWgQhpczPCibD3eFhwo7E9", + "secret": "36240bebec42b7928104606f9f939eb155ba296e567b8c62dccec004ad603339", + "public": "038808ca90a168226c3083378e9d6a43e2637d0a3ed61ea1ffbdd5619a3b2ddb03" + }, + { + "address": "2EDc2WfM84fEXwahWNynu3iDXLZeJvzSunL", + "bitcoin_address": "1Ji8RkNdaMyqMpyzXPRpF5zxpHNVpZKqYb", + "secret": "c9604c86f8a949e0d186bc656d6d3625dd3e248416e408a5c2ab8b7f70835926", + "public": "02fb89b41148210016e8ab63bc4175b0d3e8c07784536435f1535c37db523b5f04" + }, + { + "address": "2f7WZfa6CMs8YBuBpha6U7H2eSj93ePBX5j", + "bitcoin_address": "16qhCVcs8XtVvQR4HfsFR1DA4RherVEDrw", + "secret": "e6de015f90b46bff63dc0977b3e9c48338865bba24a09ee7012696c4cc56662f", + "public": "03fec5fff6df86f8783056e7e7e0d0ce9d160a62394afdbd7f4e73e1ca7f2f1a0a" + }, + { + "address": "6CGm1DqHawvJrfQjt2UfABWo3bhkr8UJQD", + "bitcoin_address": "1HGXDfYnQ3zDUVoMVv2jjgEbdqq6dYvrws", + "secret": "8d5e6cfd6440a1ca8583c59cc1f0155bcc3d3aa5e9b084d2490603acabc0fb75", + "public": "02357f3dcb10b5630bd904259bb75137889c04123b509b77cb9dcc33b9de2e1a69" + }, + { + "address": "5yq6MtxX9tP9dfM3A8FKH9xLY9UpAcxm4D", + "bitcoin_address": "15cj6ifV89JLThqEEvMonS2RTrwj5EpK9W", + "secret": "fea98f69b33c8a708459a4c224c4fefa66a152a0e6a853b85585f7147c0e95e0", + "public": "035a2b87b8d9ae00d39606bd626ab395814e2e1ae1fde6add2dba581ca00dd6200" + }, + { + "address": "GMaMEgBcs5csC5XamNTYyniVTo5ngHD8k5", + "bitcoin_address": "1LbTUwmeyeUUWQ9vB1TFx4LkXJkoYm3LNX", + "secret": "0da55fb8a6846a8a34e3965fcf0a33d314050c160bc3b9537cab8a385776ba42", + "public": "020c3aed49b27d6c62d76f209fe5227a2d4fbfaec5d7eff7015c5cb2c6403c2ff5" + }, + { + "address": "VPHFDCFDchimwsVGtc2jmPtycJwDnbp5EU", + "bitcoin_address": "16gjKq5E9Ya7PBYoPxcoUM2mQXcZWMx2eK", + "secret": "c9dd55ca1018b0d8533ba318ed08f1af73f9b98eb919f4b6af4c360becd3658e", + "public": "02b0dd156151a6228dc4cd5cc1ec9642f3215b919d793efb9900266bc18937345f" + }, + { + "address": "L3qpTuDGH5wem8EWY82fUwo1oYzFctess4", + "bitcoin_address": "1PH24NepbV3FpdsmEZSiBjEVpxVoXu5y57", + "secret": "b1e2ffdae4f2aa3b20df169a5034bd20c5a939084ac1539efa33cf673dfd1534", + "public": "0251e2d2a31adbf37e00c3e0406a15c0f97ae718ac2f284013154bd82a5b8d16f0" + }, + { + "address": "2BKAxsB6REMxDhQt3Bg4bRjvQwgpzYrpHGD", + "bitcoin_address": "1CowmWiTRVKPo2DpTRnmBDhBhv7FbCPJH4", + "secret": "94c2ab6880546c63f83e5704041aa006cdcba445233cf0ef710dc774c917af83", + "public": "031fc9a3ed32e2ff9ddbf8d64c5de39ff74847812ffd5a426dd35f7eb8ac56fea6" + }, + { + "address": "h4UF9sekW8WJDERLXiSU6JiwBJPCFXCVQz", + "bitcoin_address": "1JhhgKQFK5vVkMitUp6UfT1itWZMVzCAYi", + "secret": "e256c250043f7d7f4a60421c378c734a1b956dcbc22ff828b57e09f68fda47a7", + "public": "02c942fe2db3ef7c37ae64a7943733ed40da2bf4c7f479a5b1210fb5e57aa722cb" + }, + { + "address": "2C3wT9Wf7xsE5BNEPSj8KUerpPiYSeM9PLo", + "bitcoin_address": "1Ef8eartba7apA1u29c23kdXNhG4jpCLaK", + "secret": "85023f5d7ae3a15a82548e7785f9287d0d39b1c59920d08cd8f2dd61a227df87", + "public": "02bb78ffb03ee30ff07ae445989b15108df51c1306d5d712358ff3a77356fc928f" + }, + { + "address": "MeUC8cndNSMJdT2P7THbb7TzhfZEYbQwTF", + "bitcoin_address": "1KjSBQfrLMwTQTdntWfWBYKJFVMyBWredh", + "secret": "abfad820eb18e0fb504bdd0dfadfd98be92ca215d738c1d4c21aae87ced8fe79", + "public": "02bd31ffc3fc02ddc9c6bcfd3dad9ad4b2d51965cf368f854d9dff66f33b27e87e" + }, + { + "address": "MW7nP3oRdP1rfN6kpBjwQZ8f3MWrGEpc3F", + "bitcoin_address": "1PwnTQLJyfsHnkS8iVR9rR9fywwX4pVsfE", + "secret": "77b3b0b050d0ceb25ef73cb3cd47c16afc954b1d87b57e0b7e7215f4a1150c0e", + "public": "030ce0bdf4ee5b7fb72a4dad6d047832d52ddd34ecd8d81f81645f989c8dba2107" + }, + { + "address": "xHtjPK1SPcKTKmA6Hd3ybsL6GwBD1xyxUb", + "bitcoin_address": "197ncnN2iNMbQPQzvvoNMuVbU4VEp4Mp35", + "secret": "2a609e0536a025e55366035efbf9e28c3283f15daf9b2273e43154466e7afcf2", + "public": "02ac89388615f2b53f6890a31fbd75b31c6c27d522214843364da96ab41fe70e9d" + }, + { + "address": "2EUCXDL1Pnr35Abe3BAmewZkNtJX2Hqc2Ro", + "bitcoin_address": "1MjHNMJhu3KYKcb9Cd4PoBVNELr8sp5vZp", + "secret": "ec3bfc75efdb69da3ef0f609ded06b9848e7c5ba69cc76b4ba8e0f2fc5fac011", + "public": "0385bba88e897783786e06b55e535f13057ae68ef6f57b14ceb70e9dc4e34e92f8" + }, + { + "address": "2icjs7U7LjPRWArUe4dfKWEyXPNMKYfNqbf", + "bitcoin_address": "18ZAuqtTkb3s1ngvVQJ2bMxaBQxKpEzDwh", + "secret": "81995ff5e709bed9cf86966f88cb8da6095831f7090bdd64382b5e539246b454", + "public": "022f1466e726b826363ba710ab7575000f41e71e0ee7994f1af7331246224d766b" + }, + { + "address": "RJXHk1XPZv3gyQfydsSLY5vb82USLdpUTh", + "bitcoin_address": "1M6tg9GSTuxRYsPfnU5hWSwAwuBxtvPiYd", + "secret": "a627d0c088ae6c6a004435f93be2019e9735930e4026d14fbe0fb0309039a198", + "public": "02f200888ad6d3f3547f012d72d264fcf780e124f04aaad4acdb2617bcd901566b" + }, + { + "address": "2L5QFAHBPcogj4tVPvviCGgoEgK4yF9UHqK", + "bitcoin_address": "1Bkfa3yRJNphqS4vbbUKYkitu4vCs55ZVq", + "secret": "1fba9300ae3acb7d9d02b6be35bc7cdfe3fac495d79ef4080d25656632a75035", + "public": "03723bea8eae042c976de6884d9b54c0aa19286db7ee4c6e9740064301f465bc32" + }, + { + "address": "xz8JrwJdYru4vwnNbpt1wrXRF2NH89Khst", + "bitcoin_address": "15nbXnh87ZWVhkKatWm3EeeH4wnysFG5pD", + "secret": "a785c36c66f28f4c19818cbc54faaef43e574b2d42f8df864dbce43e177cfaea", + "public": "02ae807160537347a4eba3a0761b53e2f9c464b47e526d6d4d48052e888f434e0a" + }, + { + "address": "2EyfYcC8rHjycyL1yQqCBS16BtCvA1cwYxY", + "bitcoin_address": "1KPLEgPBvdtjuUAfM2BHpkSWUvPcaQ9NmF", + "secret": "bb152d93f18912155551d152c10ddab0c6ce77adf9092545dc458dc34dfbb603", + "public": "022c3c113b27a7726a6ad38e198b827f94a0de62cd319db41743dd08a740ed6b45" + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0000.golden b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0000.golden new file mode 100644 index 00000000..b66c202d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0000.golden @@ -0,0 +1,185 @@ +{ + "seed": "aG9iYnkgZ3JhY2UgbHVtYmVyIGN1cnZlIGRvdWJsZSBzY29ycGlvbiByb3RhdGUgaW5zcGlyZSBzaGl2ZXIgYWRkcmVzcyB3ZWFwb24gZG9vcg==", + "keys": [ + { + "address": "cfb24jWcms9pZtvEx3UjUuLPdT6rbx6r9M", + "bitcoin_address": "1GJ3vu6ZiskrnP7korsBVEanxb6fpqDjat", + "secret": "6614f0956f4e08e07ec2d4c2767b9f7121449fc2269e2b22f1a549d63e9f719b", + "public": "03b79123b2a3100420b19cccbfc688aa39f510b8491b67bdd296a92a021a3d0d8e", + "signatures": [ + "9ba679ebbcf6ebe265512d46265bdad40df99b5cb44a34f28466143cbc5f152d0e522018b8f4298ecadc129a1b471b0fd62cb51ea9305d93e3b189dd2b08e06c00", + "cf17711343205a01e4f5a6eeb81d3dbb523858cfd97e11281cff9617bd70932067b11313cde8b21487cfad20f7cca5f24fd7f1687fd073094eb2becf2e2ce37a00", + "1b45f0df19184f9e6047d2e4ae89cf5cc4f929fbcaed499ee7b2fc57c14e973f74ba3813bd28ea910a3e3d94ebab060353d564bac41cafcdc415226e9b8574d901", + "6e65a200a5a02eb1298c37d82005ced3e844d7065271db5752d242b611fef8ef2e3d811bbe83eb872213ca64bb9008bf6fe7edb548fea97e85dad05b4766cd6e01", + "7c020637b7d0f1748ad9891091de7f05f9b024d9bf4a68044515426f65d57cc3091b52ea7f72a571fcdcf629eb006523f4e173f0ab9fef7d1a906fa2956ef5fc01", + "1ca1cb90743f5599b206227ed8ae620b6e501cbffe662369a447f9846277d70569be1ea604c2c4d3af99ff5b1e5c4da0068bfa412f58f9c505d4747acd04962f01", + "af95ec5a6976f1da014accbc98aaa62340a4efd5f42c21a2ba73a53cf388b19022874e03e56cd77e9410e39fc937da8e02c23de7e3889c731d652c0da9aae16500", + "d1154d77593d24227e95233ffdb2862145457b97d27b4216e56b6a81523c9a455e37a98694c465d86573f0a55d20397a25f089738475114c954fa746b0c5ca1100", + "7d8e327ba9d328bd124b43f3d472b2a2ec45d4dd44be4a6d2a1edac8cb019c98675bcaf76e531e06e2c6c96294e8fefb1fbd29640e528a2d7671b1091c0a55b200", + "352d7850e4425012640dd63540d7fe760c728b6057bdd5722c862d59337dfe7c47bfc33bf439465ec4f833f10ef658469933765be14963982f6c112402e26d6000" + ] + }, + { + "address": "nJUPS5CrLV2iBdMvdMzMiP7iA2dzumaWGc", + "bitcoin_address": "19oERjBzyoVEL3TTXgwGnNUJSchGgtUdbT", + "secret": "93876705c31fbf77f756c7a59616ebafe12b5ec6bf6f0c85014b918fd79d6df6", + "public": "03e0298390270c0b67c62cc35b493503ae2b3e02d2d2e7711e03beb2b6f481115d", + "signatures": [ + "d6c5510639c65b5c78f2964b0d42e1ffbef3101cbe51b23ee9bb9bd627020bda7fef7c1d291fdfd46ae66825e0d419a561be56bdb4e6585a6d65bf9b25d4206e00", + "789de29db7d31f0fd788a2cb161290abe58f48c2538ea620c1ea9f1a73d723bd3d75287ecc450bfd0c401ee43f67f45ef003d53dd85514f980e69d6be3fbe2dc00", + "57c4cec61bcfb07af8d934d28afd239caa988c5b99e12fe3b157010bbb4200882896fe9d1aee6b53ee0cb59ce34e3184b347613d22ffd18d34e5ee32b14f4a0200", + "01598d2f3248547c4438669dd9cd4ddd43528d71de8d91493fa65297a88b6c8d23c876f2ca5e0e2ce2d9106342faf4cc2a5d7e71e8c363244e5e0d0a1723f40700", + "721a84e14995fd84f3d2b65d45e79bd012e59e1cb4f0a801a67129739f7949c91634cc5fed042d573d552b9e5b1c9f043b77b23988e2b1ec60f37a61c1e469bb01", + "c557e15d55028b279f899a6aed370aec27a66e59f2d3cfff517696b64d74a5a05106fad5e5b795f45383c358f554c4bd97d93728fd0bf41940005a72f85dd72c01", + "54241216147f863da2d7e0ec30bb61365343c498847fe3a788568e343e42fab947368fcb8a879766e99a85bd7614c968bd517e5ff1975195a49f999767b43e0e00", + "85c2649489658ab69ee9936b616d98a38d6c639c73d6dbc4bd434e0cd079b605131521529b2dd6d50b1d45621b7974cac8e7c6f0ad836ef102df53f60a43d8f801", + "58462dde6faf9bcfe80e3aa81e3976a3c1a5fbd4d0090b925641a15c21bc6d6a26dc6ba374765e7c470ddee3892c01c310c19a2178cbfb7260692fd3e3e3b67e01", + "ce1d26440fd13d4a4501b6417b8823c8e447f507c7a198e351633081e05a91df5d7d4fe3632c11a7d69cd1a646a23bedda6e4cbad037189b145f97713436e90e01" + ] + }, + { + "address": "UxnG3PoFvKtRuLu5nyFdb6eu6pu1SZadkR", + "bitcoin_address": "1BhEgmvmCi6h4hZBwdinzsKUfLkis9kNNR", + "secret": "c1b8c857a2039d6249d3bd4e25d40b34c358e136869592d03c1e3ea85e2916a9", + "public": "037a13b47233d512e123c180984a67571c6b0ed10c012351842846a4eb33b26e37", + "signatures": [ + "d08141df6b5627105e2ad7444c6ac67031eae74fffb1ac993038ab38081b05841c591e997942501dea90332e0c8c1c8d8d1fc041cb0284819935adac9998066a00", + "73dd6d14687efe1ba1a03e8de150dbcf16e4c91f14eb626bb39b0fb64df9156836e3923a84d95d6aecec4afb71b406c71fb6145541787830c6ca8bd07b74017301", + "033beb311d4a6306303d3e7c7089f51b06e8bf7ea0f49c2450e26cf228d0cd347e4aec6143db99a87db6bc4f25c3ba72aff652b95d8f09fc8c2bde54624540ca00", + "d045036a4c717792cd1b76d2b54218cbb2d0c3347cde1b685635ddf76fd310dd4ce356e1c97e25cb304f3850c751fbdae646f4c028c68bbef0ee0dcf5fb0ce6801", + "96ecb1fe556f543e6abdd72255f8b844e7574afb928617fa7f347030d17bbf8c745484dac51073ed18a9a1287844fa22d5b46ad5acbd67096d857da1b303e14801", + "3bbb6961256e153fba0c749b1cd73bc5d5aef993e37c28111a3f10218af4a8625d263224b43193c00d0b383c0dfd6ed5017cb764f0be76b744d0e01d1df8e66601", + "ea391ffb47c13a48f74a70b96490f7b0f7eefbe4222d55f7bfe004b1b04b983a56a465da3e033df40a3b51e63becdaddcdd38bdabcdc33b249a30a13689e5aca01", + "0bd57e44ab89c2c677eb0c491b6ed609c85018f0e875a7e1300d4699d60529e875e7850562e96fb90c897f316e5fd56d54170b3cd6320be2ce3eb5362d03cd3800", + "b27bb5e4a094442b30b7d55ba2c4996cce6e454f79c88c339ef89bb754c2b2ca561086e3ed647881fc4f6079831076d413ef027f942643a5e939ca41e583037401", + "26faa7a87708f5d27731e866ca1cce8864a4fb2e258eeb16de8bbf86c1fc4429736f07693a5e42f0bab79c696024ade370fd7374c93cc8b692bd56fb7093295600" + ] + }, + { + "address": "SZRDLCVHyoP7Xo5FEnEw7ckibmitbNx25V", + "bitcoin_address": "12H3horKLC9LrXsi76jnPXwSYZPMeevank", + "secret": "2ccb1679652e9bad28f3a316dd8d98ebfb5d8d72d679655365c4fd42e07089b1", + "public": "0284eefe3f4d6500fb563b69d52c7cfdf3152a3394321cfe1dc8d1de1e2868e3f2", + "signatures": [ + "392f6b36bf19de26894386049ae581aeb4f358296a02ea0666fa7a0c4732aa950d5b0410757644af454df89b1b6c6e8922676b21e095dc0fd094aee93e4be6a100", + "6eb48f725ed820f3001b88814a7ddbfc2dd60264612a29c2a6fe619dcd227fc3641873b78539dcb14fb74024e617b1e9c59ec71edd33f7292b5771a52bb6289d01", + "4b81f2caabe43a42915a7e19b34234f624f0dfa69353ccdc613874264bb5335003e6e04414ec7c84f4127f720b84772209ca59382fb4f38d102d312ecd4e64ac01", + "2428b1fd886fd31eea75246479dc120746ced1a4d97e633cea7a22ba67378f5636a09f06b6e9c66824efd5c761f1106b6aa15d4e0594c29239f4cb9dc1089bb800", + "627dde5f3179cfd4f1256018e59f17af2426a23d2131c4bc68d6cfb82b19a08f70e0ae7fe7d1029c71112272577c1db86086ed84ee5a7b17c112badcba0a601d00", + "8249b9da32a7f5c94035279ac4eb27f0e62cb50d230d1b30347d7cb0292dea8f2b662f54585a7bbd462858210010298abb3f7d1c16371d1221ff421a74a3744301", + "cd8c4985681c319ba9f7c797f5b9ba9c683776367dc4a90370ec09fcc8f6e0f07c7208db052e77ab6d595879e14423579eb2e2bc55ce04912e65f82601abbf6601", + "0aae569e4ceabbe5b8e1cec72ffc180fd9f93d5f17bc1b7df01e8951cb4c35a675f55a49ec380f8f33b561ff1647a063d4147808e94e2ae99dbcef97d2f1139d00", + "5b984636c673f60e7abe58c10a2e079f3e01da2fd8b41a239e6f596219dee2511ce4f0b35b1531ca8442137764980163509a3c05c219106c79a8e2f62b23d14701", + "9c6ff83bb5482a96c22eeef69246cede55105641018ef2d9cd40a265e45d402620403f555329262e20a5a0d053792ca7ddbdfc16d80552e4e0a8d6b83da86b9400" + ] + }, + { + "address": "2hSc4vmw59H1FEfsRUQ3eqvkceAAv6nanQE", + "bitcoin_address": "1NVMPk58vCB2342Z6rUoH9yKA21V8Cm2ez", + "secret": "867f5d21e6e2c3204b6c526ddd8a5d3b7fdaf8612f5bcb5423956a0d9eac9761", + "public": "02ddfd5d6c55293a925a7003bf23df040a91002f603c5db45c8605822f79caea01", + "signatures": [ + "e2255269e581bb78a86cd9b056d5089f03b77724401cfb900373571b5bce0c8069660bcdaaa99dc5df44214ffdf270d7e5065236867f20c2e692d2c4d7de0a4100", + "959d6ccae8bb8234634a5b15327a3e5ba03a15a6ac59341ed45f4e5767731bc358e2113667bf1fb15f15c0bde8b32d6aa83d4d9f91a8e479758373729641901401", + "cc8e9ec5f38f3d0a3ff71d507b9cd185ad7379448c2d33f4fc0944c4cf8d072f756e7cf1c38022375865105dbfaf5b7f71725e8c7a6491a1468db8ed93aa72df00", + "b82e4a33f0d9c4f6bdcf8a20acf103539bbd29d6e34dcbf15e396b980985f3a21d7903f83d6c61278d28de465f2a7ad2e8df1ae5db2bc823902bc63353e0937401", + "0783f3743f119b073a1ed59dea2641b5546fe585831597c655cb9841bc8ac16f656ac3ab9d16c57410bde691053675126c739cfc49694a3cf3030d776bb8def001", + "bfc6d5273d529ba5687a925e177740f33035a7677f366a3cb1660840954b417c0b9876d130231c1cffba939121d9ea12de9cecd88d6e84d5e9e061b4b443cab600", + "8edbbc3fa3c844abc1263b9ea429cde5df75524bb2acf2ffef42f65e4c1922b5676fa50b316ee8afec86fbcd116dd55218a44ceab2645d4bfb9e277822ea305a01", + "584242e0143eaa13dfb4736fab23f6a5e19848a3b625e59b9bf6c603789b00047371314b12fadc3b554437220c6af2ce6a406e694393d8e3da445496891d3ac800", + "d8fff1e095c12c899d7e993f5918e99164fa362d6262227d13f0e1f6ea40caa01fbab5f7b0252f306baa364a29e6824d4217bca7771b98e3114a6d9ddf72970000", + "6e4241e151308d5b33cd8256c7d614f804e668a61a16b4b7273f023c21d7e3006b41e1aff2703b4c8ce93da01484a70b6e9f09ebe09390f6f611db0694df44e700" + ] + }, + { + "address": "5vbcxd6wjxfVaa2rYqHXXYkW5cjFLmh8BS", + "bitcoin_address": "1DkRWzpE2mEeGujNTGqpTv5mpehpruwc1L", + "secret": "2bf3f42540a08a15ca280560e43efd112e843d4de930a2ad8de07b1befcf7231", + "public": "0243e58f57f152aceda76daef9332f9ef9f844e4ef5c1b15685359d0d0dfa07799", + "signatures": [ + "c562d6f8476717a027f1ab8c14f95e444f6a5c0eb789a640a56f58dc0339ced44a62e983abecb139a3a96ff2333a7561df23fa8b1705b8c06bc3b921a51afb4f00", + "4cc7e74e1f2e6136e1e122817f39f83faac6e9e022bd9d0361506a26b368ee28128d1ea7f0bbcb6971fda0caaed4e1e52a0270aeaeaf3daa0fd833ca1e17715201", + "88674e6524a76d0d2e1b8d07067b5342e890d9bf11091b0993b6a5cebc74f71e29dcbe6b0a41446e3d7079c1ba2a6a4df34a8a9cc9724c3dc887d40bd7f5f64401", + "488a99706031b162594963d5bbf78d426fb22dfef8491b32ff9b30a0dd18fb5f085021d97d2bebfb1132d86cfcf72e498a791e19811ff1b3985a499b059a1ebb00", + "438fec175b65eb9644fa9c88e4ebdd7d77c760822eef3bc0bc4ddbf7d04e5d5738928c1ba5e2a31cf006a21a4a888d1986043601a563fcea71afd4e7a46fc38c01", + "f7e70b4a33131be328f844d0011efaee24b63ae60c38f3e79d9cd29583f479d6125c20606de51cd56ad5bc047209f4abf0244335c8bd666306e318dfec5b11b200", + "c61983d341ea122a3001ad70a9e7bc009f564e57b0fb0b8af60e3d72f9326a6248cbad7faff8740da7b907fdc2bafbedd1593c9b83ceb418157232c8fa1802d001", + "afabaa96aa5543d5b7fee0b63c84a9a220c6de4fec3ca7a351b793aa417c28391455cbb90f298b873349f9abeff8fea461a6217a8e1694c69fba51a1d1b10c0500", + "faf1e87ae00172aa9832fa7aaf13297bda608165fc583623062d13360bcb4ab42d8ab9a9f202885030fafdf12c8c21f4bb2ff85a7855e8190b15f52dad3b122601", + "50392beddfed77190bc6c31746006ae525d6be392ebe65a71992711456491031238df2641834bd50cf119074b8f44cbbd5d44bbf8d939461d4d2d09cb022904101" + ] + }, + { + "address": "2ACC9xnasQo1uuJQiZwyxtLnCBxMACcZ5HA", + "bitcoin_address": "1CXd26Qi9HVppUWiuKeFnbMMWe2nsjJAPv", + "secret": "c2a0cef659813cf70809fb35804c0f6446524c039e4e14444c54f71d99888527", + "public": "0286b5204bdac7367a78f615f9cdfeb560fa36a7e2c9cd87d7193fb6dbd856a403", + "signatures": [ + "c77ab13d8107f4965708b75f24bdda7df11bb99b5cf0b8f7bdc8e071db62026b7179fb6256db5e36d926d8fc5227683e52277dea74b95f12c7eb6109049f813e01", + "958d52862b8f9c93bc63c3187a15e1f08e823aa0b4ce36b511668e7e082d05d976afc60b13012199bb5557f0d7726043f25e11434129f6bbc2ef665ad148492200", + "b9077e49d9f986de93cc360e5be3dbf8f30d91fc0f815752eaf0cbc64071000b16fbb965787a4a40eeaa8fd58d6f19e3ec49cdce059aad5f3674c4adaab72da901", + "3cbb3e9169b6116aef09e671e1f35cdbb7dc0fcea9e6f8152df98c371b3648491eaaf50a0cc6e672ed5e69f4255b9bff79532f8da101fa060d0b68ee0e86a86900", + "002895c8bd7a3537095f2e7670a909fd9502e25a6492278d2ae1b65a3f75642364dd31b5446c251174c57bccc5f40f9dfeffb959386a85b9473fabf1578be9f801", + "e3d5e49b8889cb5d655f4d4bdf16a2e3a35c88bc89f1a5c4a75aa82f93c8acc213770b1784c9bf5503f4ea127f4f928e36127d954b18cd3a5d75b1015966da1401", + "990c379fd3f47f08a6899f82f218ba9350e2a94fe046f9865b5ebef04dc734a808769bdfc057f45ea24ebc2a16363dd215c2656fee82792a34439c466a0c3fc201", + "60f194e854753e978e18455dfcd17ed6fc50dc9ecde80c9e78e9ba84238627a815f47b9a7633d6c0e963571a661c7e3896cd4fd26555df11b842466efa4de2ed00", + "12bc90a0c84c73c7b3331ac5106bc5b33202fd28428411721fb084bf5b57cd1517925c8f63265583c50ddafeed9c53c1817b1668a64480226161ec8aa43a73b101", + "ec850e2bc4ad3c96db1cb54cff954ed88566ed2046c806afb0f8218f92b66c9a2a51f2e948b36c5a0137781b82a401639e58301c790d2fad02c17de493bd9f7801" + ] + }, + { + "address": "kaVexneJnxkAbJMmmStgksNmJnZLC426Cm", + "bitcoin_address": "1FvmRnMsPnDJarJham71cgYy8PeBo7NkZo", + "secret": "af9e2a6f2298c2e47f1d77aa23707fdd2963fa83ec431bf48a8b9d15de8a790b", + "public": "029453f88f667c4f636d2461e03fdb8edd01376bf04c0f67ecdac93c38eb869f47", + "signatures": [ + "821915081c72f5b5c953d31cae7d74e65f4156aff94befb9fe18f3b6b4436102488d841a3112eeeb9cbaf1e07450fba1e76714983d5bb40cdbd4581c3a42a71700", + "2295b3fe78e5f199f8eff8648ddedb640dea47b46db10ee38a8942941ae1f70b25da39268774726427c3e77df81e338a91d1a1228053b417c33a9ea01e35854100", + "ebcb5e094ab5ff2c05ce9e6731d879379a59cde87168fda1c066cf8439bde9e53c463a4fecbc1e7eb72f65bd39ecfcc0e67f57dee9e866766e39ee3431e0337c01", + "afaec530e77e9e2906857324943441e574548873d1448348b4a754267d68217707bd6a5074ec510e6144f0dde0dfc8bdaf7e4e7dd58cdd83cae5454a7d0cac0f00", + "61f7f2667cec398d5f03b4d59abab20a7da2f9989efa068659f884bed748f49a449cc53a84a1d7ecb717902d4600c63cd2a4baeb16504563bf5b417157b43c5600", + "7ec0f56f2bb9cd8219ea83a4ac71477ce20061ac77889568f4e26633c68cd35b1cc2177e801eace67e7e11ec23c4d68a7fa324e6c32496cecbe0745eae3fbb3f00", + "25fc127004c1ea09e9f0b0c5bcb62ee8425b2a45484160ba0cdec8c3834ac2707963c59ff546e96f2912107cf0f808fdfc2c56562e19f9398ea37c888dcdfeeb00", + "9db1af6c0c87542eb3af726044951cf603faab78865862314283c48f608aa35846d660253b7d09f77a5b6873f3f77597e8f67f1cc02df53a7072da9cb7fe867a00", + "4c0308e93abf3ac49235e2d97b35f7ea80d18e7bd8da96cabc24c324e97705cd34094509727518ea807c20fc0b54b5d5ad0984d39c5c417b67db098563737d5701", + "6031dd2e342edf16e3d6de88a462a4bccab609efc48deb8c7f1d4d31de655c845e0513a38e2146043eaeb03f0bddd77d583e0ba55dd01379570f0c3116d2215d00" + ] + }, + { + "address": "JAiiQdrBFFSAgY2NxbU4PgKSzzycdjAJN9", + "bitcoin_address": "1BY1xYyAKLFRB6K9QRjToS6q7oY2bkrQV1", + "secret": "2e6a21b2b939aae41056675f2aa47fa9015ee2472864b0da10cb0b3ab81c7d83", + "public": "028022f636b47fd06b43abed097bd3c0fadf44689936cc5cef4e40291281964aae", + "signatures": [ + "ed6a323988302ae35f6bf4344d0feeaf6ca2cc98924c61d89d2baac4756f84af157c96fab9ccbf05ac1f3bbda3ab26c01bd0de2ea5d7516f1740f21990c0582700", + "816166e485e7a1fc98f013bcba8c86929b81d2b4ee98b116146bbfffc51405d61bd43d91a03969f08a062a74dee64eda518555a2f71ab2fe54606b11e010d23701", + "fa66344d7212ab12eefcdc2e30bead3eb015d9e328a09ee342a60fb50fdb1ab91db7ad1b0391a2c5e483435e177d2190dc9624212b02b9c4a8ebb6d8e23e5add00", + "92e6d0c388cc9bc4a2a42c7cf7d4eee0e9969ee2673d1b3f3cfa049cb069e361255f0e5e3fb1ad08eabadaf8338b990b9a3c03775e20499952144653c7d4c56701", + "491cd9ddb98909e25c019f93f75f42a3f3be73628ad5c822e619eb63d2bd47022d38afa0b1017529cc5afbcb8ffad74cdd216ba9dfd934b48b1d5a5f47f581da01", + "5407be85be4c256f186dd2b552c47d3a5a50bfb6bba489f9c3dfe3d95b7213372fb5a884beedd1ae250066ac2b264a5d60fd8520798ae0f990c1459bc3f79f6a00", + "35ab96ef9cf604e2ce83b7a2475700435426789bb56b2a4e3e39f2fbf84692f85b4501acb8129ff57f769a9ef1d5826509ff86474fd12e9882b204e956d7832b01", + "b4598b238badb2b0b06c6bc3f37ee59ad802cd45990646c1fc2ac157821ce159497fe4b0cb90dff620b1516952007b12af295aea98d3dae4d5b16820f17145a800", + "971802ee62ad7818279facc0c549f6a54da277b69d55e01fb02d557ce93788f32eddbed9fc62fcb68fe0429fa615369cb0fcf9dde3d5305477348acefd19e0cf01", + "4afc9fb67f058d08575ba3eea93fb6e6309cccca16e359197a6aa838c9be7c065138af45c012aca1f74914402b8c3d84f7094daf6300c9045db74e7ab1c3fa6701" + ] + }, + { + "address": "Z6XPgNGMRjR3dVjcm4A5CBqLS3aqVQcVaA", + "bitcoin_address": "1ExwcRbu3Z7B1Bh2kEJLqWR3UtSspxL3rr", + "secret": "0deaeda9c4f6391c54bb1ec5d16a31474b297f33d4e7af256286cea76e4fc40e", + "public": "024945c67ebb6749835872e06e9fe8d3f0fe13c154a5681764072daaebfc9f6c60", + "signatures": [ + "e8148d32e2bace9e7c8e6017e7229c3ce809ec88ceb83a01a2a2299fb87700576f79df74e7071e3216649de4653807a1c94193ac38f0d74d0abf25a6f8de750900", + "0ab4d582a506ccbfe351f54f676a97830fbc3efc24deb49f9410d8d80e0767e16fe6e0890c72b16774fc8aae801c698072e001b2d0c6ec2cb6637cc52517692900", + "1c6bf51244d387fae3b6409e5c42428c5a39db4178746298e29cf397b21335fb49deeb64ce486281fe6318f235213d016ef7142c7540fae3163a5de94f209ee600", + "f18778602f0cdef09fbc469c219e92c5bc52a5dcd7d873c2a4759d0938e503dc0d022341130004e45be1c7644d3ec3a338039d9c410352afce7e41dcb300728d01", + "2e0978dae226b1e70b46e88ab1fc2126fa1db334f022b0b960b3611e341b6986233ef8fc90a1a1ce28183b18a9ff5c701fbf340ddb4c45a88b1dfde74f7f39e101", + "3fe60797a43ffc78e26e55990e3eeea76e6e920e47ceb4a51a07ee22c2c0be1b7e51d098536a38537aa99d24af3c644db97337d51b65d13ccbd218b9839f179c01", + "ad77f584346779975e2fa12d3e7aaf0ea35b025298fde1f211488ed5b92d25343c86b4c2c0202748b80c2de9008fd043aa1d3f60262ec1f9f0f0e95dd4c2fa4800", + "27d66336014a5a93c5e2177ea72755fc0b858d7ab79a5976e38e5287549a6d0d0cee44bff45c3b7b89d6a1ea30cfda80c13f9a772d38bcd57c72f938db85afc101", + "9417eb0a9be763f5fb0ee8b189df8cf1a52657b87e545c28908802a7fa0c06442fd47c5ae49bd8fbc4e4985f82da6f86c2149e17fb903303420c7fe4d05a6b0500", + "421dbe10f4f49c005f3918511f9ff71ea6701ea76226cd1e6984329adbe4428745ce14e5768970e2e3fcd1408055b2f194f73cfff88aabd933bc8de4d607426f01" + ] + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0001.golden b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0001.golden new file mode 100644 index 00000000..44e07772 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0001.golden @@ -0,0 +1,185 @@ +{ + "seed": "d29yayBwcmlkZSB3YXJyaW9yIHRheGkga2ljayBhdGhsZXRlIGdvb2QgbWF6ZSBicmllZiBhZGRyZXNzIHNoaWZ0IGNyZWVr", + "keys": [ + { + "address": "2XDHP1JPEun347k6C559npPHT23V5GWeMkA", + "bitcoin_address": "16JRp1qD8WS2SV7wfRUTxAn3EmWSHveEaq", + "secret": "0e1e9ad1a0a6c688d9d04af22b2e07a13af293a05859ffb557c841daed509127", + "public": "02fbb044de5c57fae0a3e95ff02b9054ea82b54417a649088b76b4c340a38010ad", + "signatures": [ + "7d3283dcdfb1405890548d18839f6b7ecafe2087c5059e9d480e6161a79d6454213ca3da4653d39c269ecc909602f31fc7b3d6e7490d254baa166381281209be01", + "346269476c810294bf435f0567d1dbb397edef6e14e933215beb5cfbc07626c654e3012b5b56d218bb06ad9d384e19610824d80d618eb9c319ddfe206ba2655c01", + "1834af9a12d6a1f445441a23d320ab4f8a33b838c2055a3ba504c2e4b4e778fe5e2f7b1982f21129ed41eb20fa045f6bc0d248af77bf85830699826bf5b285d200", + "deee28aad8b2c995811b297d38ad4a27bbce26e7cd3a66e9ef69049a0336ccdb6a5d10c95b48cc561d1138b2eb21441bc83e7c02b7e759c8c270b17184d6f1e300", + "4b3657dff134d534749c5843eb3ddcccaa4f4c0cc7cc8d1916f002975dbc49d7731a595924b92d943a8c851f86ad78a017b35333302d51367b7029ab4750bcc301", + "5e045424c0cc976af4aed5c82418eb552b65f3daa5faed4ce7252e58edf6055c4ddde6b3769fbcde1daca74eb7681cc675cfbc2041d9b72094fd8dd0b87201fa01", + "9c5034280942f96a7dc805c436984a048a5f69b66c1dd1e8ebf07d9a34997a5f2f839a6bc4d6f17bf0f36fb3aab950dc9e5b62bee81bddabfc7d3aca80edf69b00", + "ffbda2b52e5f3e66b51feadecce7bfdad2fe28599233c5d458bad947f8760d11290a822629788ef521d39d7e0a7acb8b4bbfb7e69d3b45c88b98d594ba2bb84c00", + "0a21297c3a3b0ec4175428c78b656bfbae6864b4175fe02fa76cd9b353ca818a3ff3016c73ee471818f59d56112afbea170618e80eeb993d187bf7e4e608099f01", + "5edf4fb85781e57e15ac862da6bc40052edcb038a2716ddcbeaf99c6aa5e44037903672256d3d7959cc519fbfcbba47632f9c0648869844713e57dda74b87b9300" + ] + }, + { + "address": "Vqab1WiLJNvuijFgF1MMpvBxuq6sFUCA3T", + "bitcoin_address": "1667Prfv5W7PVYSpXEtSuv69eKmcw6drGL", + "secret": "2c7035ee76f97882a5c42f9876dd754babbf09acb0b78e05e7dcc51abfb41487", + "public": "03e775cae88d586b8df030ca149b93a71957a0a94c7e46c1d3a73b7f3c6488bea8", + "signatures": [ + "f33228d492945ea6ee40ca7b70161a9326f908f6153c2de82658047a0569f51f248cffb24033dbe9fffc6d7a9ec9745a3e52352ce3932a536fb6b4989506ee1101", + "e0509cdf76cd8a7dde14751190e8aa1272a04fe7635a51f454726e914c81e9a7744f189a3b62886bfbc33df0e5e56be6a16d555974955c124cea192cd0fed73000", + "7bb2e5b1162127af297a6cb76ab5979b1bef18bd309baa96e720aaf7188219ed58d0d520700c8415d4d5fbf75ad2d40960e63266d7db8a1c922940bb3770c46001", + "db6426d28e2345597df9aeb13b12a6921b4fcdd2c8017f33b98ad0a0062041072a1a270431d05a4af1a5f7e75eed79bbfe375682947e793011c31d4e1ac02bf800", + "01c403fd1157ebef2233dad324262fd6ccfcdb4a6537476acd9dff6490219fd214395056c03118f9543854822556667f1380bef6004b307683629ad0787c219a00", + "59eb6e47198963496cf86545e83375d5681031561de90e3e845d59317977a7aa4e70b08b87106f149139fce3514fbcf9d63d9da31a33c52a259b438050b86a7000", + "85e49ce059db04f9c567766831dad49aca85f1365d9a87e3b4cd3a948a42be82105b4d54cc47684c135b453e685b73e0472f42565d6f7d155937826cece3ff5000", + "f49bda680022309cb2480beaf3eb31dc88b6a17bb4f6afd00b75097ea8a17aee4594137fa0de216ae3e9b20846eee984e7cc4d5b68d9ea156ecef90bb371728400", + "93fe26c6153eb35fce04f0308ea84a36d4843f474c6afc4ab1ff8415b8274d1236f1d0b683b73b3098802d53e5ac2a0da06d9cd62de7cac8695e8d167baf15ab01", + "a65eaaceb3624a1e0ed73e5b04bd499b818e1636fa4f3145ba571e0d811a8ca42b8763f27a2a07b521fcb4c1f19e5e991127ca54692db641cfdf44d0bf39455600" + ] + }, + { + "address": "zAvpEnXXBKqLqUuqW4SXQKKpMSPRF78Pod", + "bitcoin_address": "156bKRXGD12qcSU8vdL3CRnYvXx5KDYJkP", + "secret": "ba66a37d7ef52c9145221b0b744afdc2a39922e512af4387fa6d109392929566", + "public": "02b2508601b986a275cde7ff449580639c8b78442ce0d87539110c5fbec4886f8e", + "signatures": [ + "8c2202d04ddc46d2fd066b440c263e00102a2c62efe4ad53bbbcfc7c119aa7a83130d56f7e7a117876a0d4285ba056ebfd2c66f8ae81272d9f0c39d0602a8cca00", + "50526c8372452645fb21a4f8b5a7cdeb4c937bc5d051beafd389911f6360514a4ec32e6d08c6227de99d7e03895385518dd5d4948b392935b7f8b69779ae1dae01", + "e4eb76d581d4f99b1904be74387ab7954b52bbd387e6f7c033083dd7024ca3c31952acb23da09ce66af2ccff81a2d59baf17cc454ad71d6bd4a109486fb4fdca01", + "84c8ec314681261c43bf9120544b9be17d2378d508ebb833a353c34216051f4d28c9713bad786d5a90b3a3b228467085dc05f4da092d6eba4c8643b0adb4e6d700", + "f46706a56fb07d67fd6cc2a4071af59863669acf2d7f1a9941f8b36bde42c47e767089a7e26eab64b5bc8a6e116044a9a5eb3eb1f2d0cb7d4f51f9e50a76ceb001", + "56e4b18df20901bfeae20cc9c9f45ad7a7a3c7d6d2506acf7571c04415308e00379fcc74cbef49823c51dad0c063f269596fa1ac434b8405cfb9d1b125b0a47500", + "0855cf0318fdc6d0c7f106630911171e7c51106e5e837df48fd117be59d92d5144d0ccba6a42791f48ba49f3388686176a2ade9f0a7d91a103b2add7ad3d682100", + "42c0522ac061f7d596462a20c5994201e1912ca4c0181ef7002570b0773181306038a5e0221b971f069599a1600d20cadaab5908d3944f885e1389b20ea16e0400", + "643bba11d65520ed42000e94d2da7800e7b595475606114d87b603c1af4276780d83db0cd39999ac96fa35cf9977ed5bc8352c2a94ea4629bb7d6ad733c73eb501", + "93b65ebc83179381e53c4010a7a63e95e2daa9ddefd4d05c342a6aa0a5891262764c21bd85cccca2a8f040a00b983836976540968e65f26ba62eaddf597d977801" + ] + }, + { + "address": "GykRXwXiz5kjHyBsrUkHRNToHWSKEEhkAd", + "bitcoin_address": "1GU13xJSdxU9xrm48UBqZ1xMrnJwAcSzCd", + "secret": "0c335f2076e58db76dde9a26dba8995028512180208c9ffc9c01928682814d91", + "public": "03a6963955bfa042116dbd4670361b989bcc0d841b96c0c402c83e7e1e23b64708", + "signatures": [ + "f9c115799f868fd84a1201021830966916a492e68a56592d5eb8dfbaad0d9c34564f420ab00996831f19db39bb94d81af763baad2d3e71f670f53e0e8003e1d301", + "a1ef2a9c00f6a4581105f586d735121f21f0236c48b1ad2d5466d392c53ad88f4bbe91493b909e48f6fa5a9ce5e7ebd93fc3c9a071bf2b760c6c771f04ed0b0601", + "394fee301cab788f7cc4af12f245a0b4765519cec1af7208409cabb06986add670f6c8641c4b40b7cd516d0283fe6c2ad872d953fb34fb9b554ac272268fb7a201", + "86493a09108cd772ed60f67ca2e5dad4c61d04e9dc24809247156400ca41e7ec31af35d01d71e24a3776673e7c825100678e9b7d060a7b5b5013160ac4f0a10e00", + "aefdfecc52c33f074351c497ffd2508d0bdb651f7b5745bdd98ae384c266f993336b6bd67d575d749db3c54bb2dad5d977958840309b954e3586e5b01fcb7b0701", + "3b032eb1fd883530a7d8f4fafd023f83da857f8c4381c1d0a055b8ffd1a3ad8b5554a1a295d188cca6ad6ab1ef9964610ea53d92cb868fc83b46a12206c70a8c01", + "e59f70fbfb3b23e75e290a0569f323ed6c82e721ba7b268b75b5833dbb3c739f4ee0d92593ccba21970fadae8904ce4e95e6edc6429377229b74f6bec34ec77201", + "b3936090c63f04f6a52720a102f1dc5ee26123758637b98e23c01dcee3d6f280266963e980439eb9bcdae68095fa5cb1d8bda02a1440be90a5e597f8c426bdb600", + "09cbc77d194f64d03a3ef27cc4716241f815e8b3b46e5ad4fa68277c5d8d1ecd72bdb8576be4e325fcbbc67aec516de0aead8f871ab9087ac53a39bf6f9db26601", + "704365c292a1d934d26956584bbe34ac0db54cf5b03ce3f9b1367805cd488ff830f0e2fe34727e8c7409fae6bd4878e10ae2b452fdf15c9a423afc79e653ea2801" + ] + }, + { + "address": "aZ9jLZm6MWpy6kF3kpjJTNo2eo4oLbeeXx", + "bitcoin_address": "1Age73SwxGVLvorS4Dbens1TeMn7GLtGvV", + "secret": "ecaef882b218b8e182f17883ed7462b4120064f26d5c7880a596e9f8bd0cff52", + "public": "0268e2cc53ec1d81dc64731495428a98db2331e9eab7ff899251931662ddd6c12b", + "signatures": [ + "b56be8c206b65c96cb8e0d174b289dc0f78d3d1657edf35eb2dbeae0260a89b96e7bd8847e206129348e0ab303f2a7f331d34fbe81d11b85aa02a6c0e9d3ee0200", + "b4bc4d5be6e24a0fb415c211f4420dc92729f0a1085126342d04fceead2ac7c1699542e02aef4e7a5b8426915a1a68beb1687669344256ac899e5332066a455201", + "4f037576467400a8b68bed9f47deac9956a1a6eb353677f10e21b5a424b2a0656efc0a949f9c0b125dc1c1208c80e708c5ab29eafdf97dd40f26172decd1726601", + "2365b10f2be2fdde0b7831bf3f9aa24fadcdf4713a6efb422a6790e353dd71c74d813e137da07a6f9e1ca515b10abfc316ba280eea0eb8d1645fbaba20c2e81800", + "cadf2560137316bb8827417e8ee322644cad64c4c1ec9aac63967f4a5ac0ae7971f5260c83d792c044332f07da13a0d573c9905f588b607486ffb00755a94f2600", + "a16edacc86031c008d0b5cba9365ca9c39ae724d030fa288d11726adf59e7e3f4060155ffea336028d03ccd08393dc27b427121fb5b63fba892171aa0d00920601", + "e85d863e3e5b30e31ca57c511614f6a53794a48a16197d2a504f6b4347e8417f73b2d1367988d687568f8b413c4d3b854daac8df95a64c22153b76e7ac03123201", + "a98e2e0361339e11417f4d8d45585e8fb3a517735793b2c4dcb7d06838ef80fc06706b99f91dbfdc7568ef720d9915169e63003b435c2e2d03557c90baca319e01", + "f2b62c93fb7d36e0bb6152ea57b7eb158fb93984f12fc7eba7151a8a4ebfeec902f2c2205a910c79288063e3b73896429f162cc253360f50aabe4372d81badff00", + "3d99597f0d9f53dbd009640fde0e7c44ff567babeb4d5eb54b7f00f50c337bc92155b9342cd817fff6291d70e614681b3d890a1249debd89a6d3e14e6641e2fc00" + ] + }, + { + "address": "2mLzdkpXtaLWvFuVvzNgZFcQgBnd2Nz6wEh", + "bitcoin_address": "12jJsGatGBVCxWF16yXDZFSDGDtNgJbowy", + "secret": "d35734c6a9df59900f8fac59396a1e1e735eb0c43443bba39ff814c9f91abd4e", + "public": "0272b067783e0ae0660364318bf3b408b12c105f6f75ad6da46bd88131f8cee2fb", + "signatures": [ + "ab9ea96f4f3638fdf6b5166d7c971b7e5aa71c042704ffb4c21657ef29cad87e2ec2c8b1d220ac68f40efbc7f9236bfb28c02762d52bf1b5677a7063682cacf600", + "e16e160405c0b410d1037fc217b32e2fcf626a27a5f50ee003065a8059bd40757e18a5f1d469009458725b936ba581a99af1183838fe7b0b3931cab941814cfb01", + "80c491a4668da1a22eb4eae950c1456a07919286656e327c0b9190c7004922ad50bb59de0620ef381cf1c10515b2f31d2850650ee65d3cf60fe44276bc7ce04f01", + "3d3f547e2644e3b8c49dc5a54882100bdb499879017f51949cf4bb8ccba9591040b1036483de48b27aba1bb7f8d73ac90a96fe787dddd233ee5406d3d8fcb4f600", + "72ccf7ebdef8e297db0a7348ff83bf6149e50daa24a29e38dd2c5f0d8ddd689f58034fcf8eafe64eacaba243dda0bfcc498743521f569301c9b19f95ea71d9ca01", + "b7347269ce29185b3ac9bf94f623307108dde70145978005d09c396d0739682028a3bbf0460eb7c848f3fd1648af5e90611e42b49901c40aa22e4f73bec0290b01", + "3658c5490f32f423ccdd10fbdb2c5ce674424c8635c1236ed88a37732f253d6212656ed16c70fbb31e9980f27ebbd34400a424d2110baf67c348c167033c7a0400", + "a4111d9b5b8ab7bbca90adb0b4c93faa45fcb03b717a6f11ac485b64ab3b0da505e2b749d971c700eafafea370c9feb66a1385943515950291fb3253b255505300", + "34e8c561770c77c2aa14f6955a1f5acfb29b7fd9ae846bb537c50f02833a35d656a8146517cb3312577a751f8fa1d3a1d48377a9ae6f3fec5fff3806f335fe3900", + "ed91dc06187be3c4688ffb6da8fe16392daf976dcc965faa4dad753a46cf2da476db8956787d98cac6af62665be2f31a9556b76d1cf4684127f90502d9a4ffd301" + ] + }, + { + "address": "2QDx8n4AqA2Zg6BjHPbvKa6jjTqn8GuvDmN", + "bitcoin_address": "1C4smDFUp8LxWU9MeunsbZ249RcWaBwTcU", + "secret": "d65af2ad4afa373ec16c002605d384c6dacc8e6f5b803eef066626f518eee964", + "public": "034591c117b23c0125cc41e78d887fb64d3ca4f4ba6c14ba9e5a03380114096ccf", + "signatures": [ + "0b4418424dc07e0ef668f9363ca9e069946c8f5f2e0e733177fc37ef9e9a0b17626fbc899ced973cd2b2794b9980bfe8004c5bd5f9f8e7545fbcf3d45387844600", + "18889e1bc48c7ec850fedb15d991145607c097c061c78eb8a88b709b01b7a996479f55f3ed9e44c8e48551d56e2292011e5e2af8820bd48e43a0a572dfd2197801", + "45e65bd3a99910aa5cde9d482bfb5ce61b138b8d3f0269b7d892e5975bea8c9b7ac6b85541000f75f7eb0998161357fb7cc54fbaee11436fbaffe77ccd0f0b7201", + "ec56ea2c59898f2885313db13dc7386d7d7339968139190905c0c8f6c1b93dc868b03b12f19efa0de748beda1727c9e7d2ad5b5f7121a4d77c38e675c70fcd6600", + "893f74090ec8b968a3576e22280c946f75fb59b6bc8b32c1f5b74485f1d555ca050285b91ee0ed5a3d3e997a7c9c2f3e680092025065f5047631de41e8b7359400", + "018748f5470e0ba9560ac9b284265fd93a7e65284cbde89cb8bd17c7bb570cc94ba0084159d0046769f2172152e53652e29c176fec65f03d8f319c1187530d1600", + "8abe93c4ad0a2860274a38adf092dde1e49ca71501840d66f1b3f515e99ba6b05f231a7fae44eaf376030f1727a0bd60d7623573b85198e6a4d995b84d89c8bb01", + "7767f6d6810a2026620886014d9197e67f73bc091b6c1356eca1eac80300f0a6080d8dbeb24785d1a53ee87612d833001b7f0368ed9699c559c7443c3148a95700", + "9740dce7801a4845fa194ad13ceab4179441f2cd708797ef1c1720bec9039d1a7adfc34098b756dfee4b02356ff86160322afc29ee603ba4a8091108ff4c619501", + "e75ac790094525f7eff99f14d92e7ec035b0134442f1ef55c6ded7af74d42a6c6f689e9fcbf2d9b3de722f9e1415e5c7dce756946e8ae8174a0866c22b8d9a8f01" + ] + }, + { + "address": "nSXnnQA2aaLHdzg9LXgyoY1bkRYyoJcPNK", + "bitcoin_address": "1GJZ4QMY3gZJz7NHtT4w5xXGfpsX6aumtz", + "secret": "3a6d13f46da4a800ef8c2e350f48e53cb601efca9c1af27f0650065d9334583b", + "public": "03865c2b491360dfe2afe6e918261b9e909cd87e53b61afa3edf4fcf47bc4f9d51", + "signatures": [ + "1d9ff908a3bbd7416efc2a9ad50ef9a3b7db795857755c79ce0457360812116f516960d1c6f97d1d8d0ac3ea2975cf2f4ffa0d08b1d35224ae9799e91b04fc2a01", + "957ae4c1a90e1465564112a513597c3bd6c8a1e341f682b8a251a0c6272e9f562a0d3d81665425e7f710fc3d20a9f8a4a28b6badd63c92922b1933fda2d8376b00", + "d791eda6f4548bb24fe5f0b1eddae7db453156187a10538fcd837fc63dc189f40359ed7cadd04c6dc65946488149854e4cb5baed743ddfd1c49247e7305d9fcb01", + "7188ed823f256af8a430f9c6e56769c3455b093fc649bfe6e779a97219b9d3673dbd5748cc3bfb8097708f997baf7b901290ba0daef661369738a5f7794e72cb00", + "5b5bd1b9b1ac663480cc4f1652151aa0a27d456392dbd7fa5c1077f14c523d200b9c677b150e4a03f68c363c987495b05cc7dbc1498f9347dd7e7b1c598f1c0b00", + "1d9535097480035b32e949d5b678ab1bc0a40f998eab8f411d8917232ac58af0022d32d709431a693639926e36ef70dcbdba6841bf8a6edf007d4b2b339b02bd00", + "f99830f86e5f4c812104bc7f7d4b0f2dea4e1afc0cc338e93f378cd82f044d4f2647771d665af37c3b83fa4ad153516a120f6177cad4c6b151bb7fbe057432b801", + "d28e2d7aa2964f048b262c9bcbb9a462196d81ffd491b36700cf1ebdcbe51a6104a97beff3265896731d03e7f98239358c14235e2480d10665573e838b6e6db000", + "97ed4c87a77ef0bd231debfe414bf1335e74be8a1d56dfc5fe7d8f611246506f1e7c6aa6395f2a0e31547d71e766358ab048581678d83b2ee2362b3e52ef7c3c01", + "d6717596c6f62d6430c475a46f6ae0e062cd667c1bbbee66cb448daef72e6ef1093011f7e398488b280ac763f3b11b93b2d643380d1e0514dbaac2d6293271c700" + ] + }, + { + "address": "25qo9WDafW5bL8J1rrfDo3zAFFmUbWM545B", + "bitcoin_address": "1MRmjS9Bf96eY2PP4QoGoLBMhdTJvTU4rK", + "secret": "03a71adfe4f3a34087b6b0f303f0678b218b386c3d129a8366f9fd40e11c1050", + "public": "03d5b421cffd4fa34d0aa36716d7b5f34c78ec362f6b2396d1104c490ecce196d0", + "signatures": [ + "2aea2918de643baa9bec04ea49f9c3bb7858b09e7d0a2dfa8ac718367951ebfe6e3825f4a5aa08f3a8ce3ac1fd021aa8dbd68f2b05ed18746a53d70cdcadb26400", + "c0475aa5ee4dc3d3264703195a145beb28731516684194fee43c9538444079670f30eb13522ad7ef654deed6a7a6a818f38d79219bdf6138461d43d8ede9aef901", + "7ac1e3195f1ef8b99084f2d97250b8dba8cd55148807f8d3437406e252938f1d78d86fa5f9b6949942ef4579fdb0a8dcbbf3cc37cbcecf51605ec4aa2922cf2500", + "af2afcacc960b2d12395e1de8668a456eb2526b250e5942db785fdf3a0b055d56015c367ed6de7efd680eeddc1a8f789ae787eda887b23a7e4f6c2f7575f10b000", + "4b9ab114829349ba27e34152b51f9d3c83198673a354a949934399088508d3d014baac7e910c367627e37a1544bab8ce1661600be92c346463497e6965551a9000", + "7e5c5d8f8f27d2c1461b6653089e7727c7a0f630ebe5012d07d75979095658ae0b5c679b3daa5ae34a528993d6c9f60319668f36e583bf607782766adc7d9fc400", + "ccd7e23d4de2f095d77d08b6e34e134521c5aeab84c9ae78c427cbdb0f72c310261444cf20d21ab84ac2ee6472b8163204323b5108adc59c6c01e72fdab6eb8100", + "f7eb4299d5b9fdecc1ea7b366b1d82713322d15390c057953d6b42ac76d0bacb36d9f3c5568bf2f5c6372d4f0fbcd630588f3c27c2309e1da4e02a09d4d6ce4201", + "384b61a3719213b153ca45d788c34738860c6353d6d15751225ae3d6dc35bc192c0189edd24f96f95898a29164291c047a1d11099d397600820e171dd813b94201", + "9392c342570352667d1d6ed8c1a8438bd8caae455e9901194f788c4fc653e04f43d328453c9818c0a1b009767e36a630ef9453a51b4aab4de80581a78119212000" + ] + }, + { + "address": "2U9tv3pcptMson7aVDj7epyVhuJBQkSTA8W", + "bitcoin_address": "1Ph4F8ZUGQpUvQYedQaXrgJwtXX63yRo1Z", + "secret": "a7832a68c6f1ce353b341c78661ec2e39291a3d02676a7804c04eae2a638a68b", + "public": "035bbcfedafcabc3f0bd26f3af4e9046d01e96e6d596e751e2a3922815f586d70e", + "signatures": [ + "d0857d3237ec891c839269dafd3df42be1e8429765673bcde990d2e760f827b9189da08b0037bd8a0423bc541798925a4396b79688cf9e329cf42881aff93d1a00", + "bd143fbef42414fc7520308c6492dde2fe442b19deb2d2c8412626c0f07526292ad3bca282cda727915408e14da782d3bff8047eec4011363a8db4ad562cba5700", + "4893755c3b2c465c3a503465a0cfc7828169fcdd52139f042ce4799dc9d0a4003cb4e40c271de767fc8df0a6f93745a591fc2dc13f6b17a12c95473c1042857a00", + "62f03a6284039b98acac22c0d64447ffd65be2101b22d104eb098e4a065d995d157226a117a6d34a2e2a053dc199b41a6e23074a8a700554c76fa45ffa4a1b8b00", + "99d7cc90fb119c8b722c0582bc097b5bb260b0a871c9c05439dad466d1c970f112cb4311efe7753d44e91dc0162c3d2befca32848767fa642b50725e02e02b1501", + "de62021fa95a4c90a5cee0b902d03119bb801ef99a6c575577b32f432be9da047e8b2a7e32e9910116219bf1c41dfafddf38f99ddeedd01ed1bed9853779e7e800", + "dfed34d6c672783dd664ec8f4444467b1e15c2e3aaefb21804545fb47398c3d3728c86c27e1507d6b14bf3c5f952d7a308f0fb5e5cb947dd0971cf37440086c700", + "4d410ada413d3af780693aab75d8280da0d9af542875f8b71f50ee194cf9829a33e23686760fb9a07f3bb37af99b1c97709c124b15c0fa89ec3f9709a1439fe801", + "a5ddc28a3ee448ca1cf28ea8ac3991ce2f1fe562d52c8a7634d58871744253f2132e8bc1e7c13a370429eefa26c6956c19cb548d5e4e663e47dca12fedd16a2300", + "3da1a98584f6ed35cbf918d514fcd5074157d91b99d84ee1267b10d40fe0d34b42d552f8ea1d09b44de9e32fc2339d1d784046d834c790c471fcb9249d4030a500" + ] + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0002.golden b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0002.golden new file mode 100644 index 00000000..ed299b7e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0002.golden @@ -0,0 +1,185 @@ +{ + "seed": "jvgFL+YrrDSJWjeXY3tJo3dek4BbeV+UzrMZ3yir9Sg=", + "keys": [ + { + "address": "JQCEabhVC6ZbsgxbmA5MHTzhifUbX2PUPR", + "bitcoin_address": "19LDYB4rBGvmvF17jiWRFsZxByvsU8fMdZ", + "secret": "e7c807f67e53438daeafd79a7c52ffeb8d80bf5eec00f281515e7c1d7ceadd13", + "public": "02661206c9ce3649dc890e58e24763dd1f102e7312cf778bf15c0838a589736c7a", + "signatures": [ + "c8d3fdfa608b495c14fd0b47d6f8408a083986ddb58336082f1b0b2aad32aaeb27954f329267c4f2387104f80451a6abf237f40b5e93dbdddf39262fc35cc07e01", + "411f4b6179671d9d13233d9dc9ae4c41982b1e7ee5beeb7389435f8351ae1dcf31d2fed790a49d66cc74c714792d2029a75dea964dc2737428efdba056b4a7f001", + "87ab0f994df1c137ef4b0cdeb657630509eedab2f3fa390de2d8ef51f605743522119933f6751f446975616a95577398e7b0c44ab997634f716bbabcea9793c300", + "77714367c993faaf9162c73cff53f78a0f2bfe6be96b71d28ef2680cab54145047f69c6b592da393aa48891f87fdc261e0dbef1ef718fc0fac80cd11b4d9089200", + "1ee6bf3930d3220d2338a50e66c0e8192bfb98d8ab19e2bab7d0fca6aaf553d95e3f4dd3063d0a6ebf1f9d34a8a0f42c69c2050ff9174ec5a93269e7d6d4c20801", + "026c0be15dc3c74994c403ded0ec0b62982a4916f6cf7acbe644f1205b5cefbb1353ded02926f8450274ae95c89892032d23fb6a03ce192ee0a4408af42332e401", + "4739117ae45320d82e2e1b41ae3f60898e9bc0258d1d7b3f90de521db1ed8e9c67e4d9ee8b5d9ccbb1e5ca76d4cc3caa7bd1dc5fe343a4792b26ff29f0d894d301", + "1c367647b6f9f5da5b1d1ebe3ca06028cc285037c3df4d52c95c832280312e9833e65fadb77fff05e5d649ca5a65b57ed33135d5e190186f376eab30c195b2f901", + "21437ae018a00fc75f3ff8ecc69055fa20f320786bfc87e5a3dfd50767f5e64a392ff9dfdbfee7b28b25bfd043e98932ae3c2019e62bebc5ee09ce0385944a0100", + "93232ce00bc5f85f28cd93237be83f861f1fdae74d53c2ad024d4036420178bb1f6df282a829ca5b7361ea348d188ca88c537878644f8e1ccf3bef0e64536d2100" + ] + }, + { + "address": "2xYA6Ty5ngQSGxUxLarPiVpGexTWa7kmZ4", + "bitcoin_address": "1LCNQc9F4vDQWbCRVj5DwPaskbFM2W7eJj", + "secret": "cb09609a37b47ab42e522acc616a8276488b255b07c7d592a03de5fc19bd3ad4", + "public": "02be247f8c246ec549cd378ce34bcbfda52a59bb2cffc92cacc26877c2d0d4e06d", + "signatures": [ + "b218b9da47c96150d6477b44c656ab5bd4e3098f0a36cc37aee30d327e4bc1d37dde4dd8a4167d0fb54dae0b56fd7d7a7aaf7f7671898b81ed0958e4f51bcc0b01", + "3efdb6bd6b772dc8039ea5ce52c9d4714a3b075463180b5a45598523da21a7b32fc6e730a2b7cd48b7e3fb04f61bc8acf07ed6b97922dd3600a837a6d6ef601301", + "fce5664c0d550e19256dd04eb20ba1ae255a855702c7cbfc22576b9057ec32875953066bb020030eaa9a8c7856cb8c2c58c6a3e4cd2dcd7895de8f6bcd5157e801", + "95fe28da7561ddccc725d2fb3aa540bcc8e4571c60b0e744f0ada9db5ec772885a0efc8de1dbee4d347b1caf601f37d8d74a075a6dc290f4960cf70c8370563401", + "b70a88c6c2a2c76df89b481f3546e2a7ca08882f70447043313156a2d5b90e8d0de40c0c27e5dbc565d6148247582b6b05410d9d69998ed4332811436c7b458101", + "fb0f74606f4e239fb7134c6bf3d91cf3a2b76c4cdb08d4c8189c6b457b0663cb7272c6673c93d94e4d7cf94bbbf3af983f541b46a3598a0efe60bfa2fea4508b01", + "3c627b20e0298231599e59d4c803b8a49bab9baba4f45a49d616d4cd06660ffb1c2b60189845cf79546322b22396f613314807e034163e66d47318b9d0d35be501", + "4363cd2d43a6c23df3304023887d7a4d291645c425aaa1afadaf96f1c1ab51b709c054741e5ae7837de4238d0587634c2e189eeb0f01f6bec00cf273a9028c0b01", + "71448bee0563d244d32a17f4683da5c20b786f831cf32bd30f05cc12e376fd9f27c9c60a1130bf9887f2249f3286e4a855232091f1a8900dbfef9b1ad863f70500", + "10ea5ad3a7699ec6de2d3402c333f2fa8ba7b186a3eb378214098a8d1e829e6a4e42505ead889f03113b1a4088b583dac42830879876a9bc74cdd53a815c379301" + ] + }, + { + "address": "zNyfR5GRMNki3HcyWe8da1vhnq1Huf1pYE", + "bitcoin_address": "1FJfHuut1ihsJKQDCb5pFXmSKwCSE9eC4g", + "secret": "1469780a7a54f01572e2a29326b8726a1e5147a2d96222b1e8220b01e7ecb428", + "public": "02e8c038377cba9acf5e6bc9d886973538b8897eb34de689c957caacabe8db839c", + "signatures": [ + "2de7268716605679f813e044d0dc9592660ec76d9fd77eb6286c3ed9a56cc8726b63b69874c186335a5acef4477771748a33d4ea4c7040b6b712aa38e975a98701", + "e320dc92764ecec970a60a0a47fe1580162f2f97438bccab0496dda3a1d985d8132a3d7c5c2eeb7f0aca5ec71a855f9121f06778150d7d0505135304fe991edc01", + "fa5edd7910235a8e57b31fced17ae73d32366642eebb7919538ba17c565e40e37f3730ffecfc7ae42207e531921b7e0ca87bdef76523640659dc7337fba57a4101", + "04c046ff48bf60c1ae74b128d71988f5ce435ee99af83cadbf14c6dd7edb1ec61051fc0ff3c18b020ec642219c72dd45b7c76f4828bc432e181b37959f82d40301", + "b676b3cc400f3362342dd1d279a7230c57dca3973f5a82486717ccbe00dcddd87bb81cadd29fb322d02b2dcc59a3d47b78cdf25ea788ecd3e9ba7cf338d248c301", + "f8adc3b7f0c241f45d8c3ca7b4add88b819ff8388c6eda817f8fb44b5d46e1cf4f1a2554f68957ba82a36996926f25292b7dbce9a37047875eab3ccccea19d1e01", + "1c5c583bc903de18d020ba9dd2494fb9249b387252c3a7967f93ce8aaebfce184cb3edefa7480b886a944d1b1712e323fecceceb70a34371eaf1d87a5172a9fb01", + "7a20e7d8587ab4e612033448e19cbf2d76309ea3914b52578d6000fdfc8243d53ea7f25c81acba7eccb9feec3d09e20fe8947656beaccbc9d63bd6ef79ef96d701", + "800f68685440c16a9fe8eadf94e703b6cf750d798c19bb21df50e0afa2ab85e10a67b1773e571e55a26bca2d9c40ca6661815ad8723c5dc077be6a125d9019b800", + "479d3e035de00b7dcf5cbf5e5ca641b8524f8dc415ec6c60170fa367b9bfd3002cb2a9f477130f105d0ae4ce2d56ac4c4d6cb8aef7244f65ca04c149f469caa700" + ] + }, + { + "address": "2JLkLasmC3aZWegxfrFBMegUwPMMaTRHezu", + "bitcoin_address": "1MArgjc5wJxZKen65SDR8Y2RHJMcgVSbRv", + "secret": "0c0290d80263d5ca9c3a0d4a8425bfb340387660feb48de1e0020853daa12616", + "public": "03491b93d73f48083311ae3c06f3ecd8c16474e795a58e3ce301ff548e9bac33ed", + "signatures": [ + "13728767950c9ce26b4b7ce9c520a7ad36044ac27fa72a7264764b15b4fdb2e3404d3cd1e716907231fda3db6d4d7b9f1055cada44d72fc3939fe892f4bbf82401", + "d257c55f64e001336df83863ce2b065efab6c60799f7b13839f7abffed5bf5dd6a108c7db8b00dd4cc313150966a88b34770c9d963609054c3f791c15ecedb1401", + "531982656772e00adf2d87834a532310a1fe018a7e44a26b110db88cd51c240e3501514398eeb26ac535613b35a2f71942f6e621598d026c18d29127a8b5c33201", + "4095c7b25fc5deaeb3ceddbfbf65cafc5b060e5a790e9cec3b9b791d2e3a556258eea375d87839bbbd3e277c53be855c51417225dc9d586568cfbce1d542da4000", + "87511d32bd897733747252c3373a17849dd6b87c68f3eec30e30f47ff75a40982546d22a33bd2398d2525ff99980aa96ac0e17ed8ea8574329d427262cfb5d2401", + "d2011487bbd4b997db6c12978637c3c042e397d17d9924d65417b2134467a9d36ed7ac74fe0727ce3727dfff6d90e1607062edd16407f93b26e466162f188fb001", + "5f65d112bc25524334e028ac597c3f9e289394a0afb2e0af6b038eee2a66a40169246279115b5b95e0c4c79e9ce738ea79636c0ae7c1f1e2178a15acf3617f6e01", + "3e87be40a4d5a3c9bf3a8c5e8aded3e311788fecafa3736495a71e06876f55055d34376352cdc8c99de89ae69e48c7dc7f845278408562c681f1aaa02860995600", + "a92ca8f889bdce1c2bb27b1808156afee9c5448cbbf9eee7941e379797261a3346258d418dae445da9c483c55b68c10285c8c5ac59b9e9690b3f0bb429b8782000", + "138752502a10679ca518c2f1c8394b0f49a258a8f92f3e07752a72700817310a08e76da5600f15d214b58b0f3fa00a5797a23e294cc76f72c3913ebf624ed2fb01" + ] + }, + { + "address": "fVQJVXDCg3xx7nSK9NtLm7xw5wfhPenak8", + "bitcoin_address": "1KPFb2EBogDiYZPxGYmZRWSSw2StoctBD3", + "secret": "7a64f76a55d52e9ebcc2fd8703153eefe458b7983e8be501cd7b53e99eb7bc38", + "public": "032849624ed86775b96a940bb4c3ea30ce87d2bbf1bd78a8dffac5d5a26a32edb2", + "signatures": [ + "ad8e2123a55c325578facac3b33a4f893b3f2afb1065b6ae51b26a4937d4ac094b89ac89036849a7474539be19af5a82a10476bc9cba60a3c29eed8e16cdd97200", + "3e3811c10b7e1644e4cbb4feb05713be87055c3692124abb51f046d3572ce88367cb91dbbd56208c0958482730cfade12f481babc35839e37c063826f5b3165900", + "c3cc2e9ba9068e6896f15e522dc64a07c2d8767a50e3c95f5d591e708101575655006f4124a433c8045248737772d4f8c49db07bb4fb7e4638592ac2901dfdac00", + "f7e7bd47eb319bc33e14d340b73340c78527587e470a92a5372ff4d4b10780a03ec02ee20ba8387d2bc1f6faa4661c94e2193009c22bd3ae3c7218b70598dfd601", + "d25814fa5075fe6f6dde48d0036638803bde3cdf6162d284cd49182488cb76985f3a27becf6ca57a04a17286fd6479ce89e6e137e47b01a347db4df0983193ba00", + "d9db8532cc2595e35e499319e2193e28024d08f845c6ab83fc069009c3e901f9051953eefa426591d56d092ab7a4b7c8e0cafe3e6704ce0bd10466589cf7e75d01", + "5a7556a143df94e47195afd3ec97fbd8e5a10d970fee7135674a5cff47da053171750083f985fb09dceb762dc97582f87ac312331ae2d2aaef9f34c536bfaa7b01", + "b7e4cb3d1dd9405fa7c4342352fd0920078ceaacea6dcfb3fa5fc5b95ec4e9550c50500507cc8584f9671c8f2c52cc7f773451d94b34adde0438e14aa433461000", + "fb48718e2d5f99114064c368f825842544968cb59a59fe3247a21b0f959397723b838a8b8a9b52690eb14a404987206f5408600e5afe1f03918a1a91fc53451501", + "13cb6373816e236bdcb07c5700078604cbb6de83324ec4f952d9ce046991818242b3730f43bbc5644448fc65097c450191a3cb4a07aaa3115bf7b01de5c0a46f00" + ] + }, + { + "address": "65uJtfRcuUQnQ77iXgusuMwUUE8X3YypDu", + "bitcoin_address": "14zRETS9JvRvJ8rJpkyupMd86tir9m7frb", + "secret": "1e83fd70b9c3c83271856870fc194779562aada020bdd771e9db16a26fe0e699", + "public": "021733c35bab05988350a1a4012f1a960c9ec09df6581d0e205de3ef8b5589a006", + "signatures": [ + "2d41e8b8bb40a4f4e7a6f3d4e62ad54a1ee0606a968e317bc453a45632384fef6768fc26faafbdfda6893b6cd397d11f25bceab298bdffa0d15beeefebd4f51a01", + "9c7b0470d72e6adc12b1a1bc3cbce3a94a6a899f7a7cd29e4103f8ed25f1ea284dc034e5a4daaa44046869093bf65e5a918532b5f7ca9f3e5cfc5fb41db1341500", + "4376eeb10daf7003a33f1e09c8b308673b51395c607bb64dc2559dfbb669ecc84ab7ce243646b4f1078988051d1c2721a1ec834852313b2f0b1d0473d703914701", + "9e4c7b2251a21ecfa279428137229e0689e5d07fd045e5937996cf2ba36bc85e28a80a8dcc0d08d71a9aaf69e0681002dbdd0e7bf996220fb113e73e5a75d7cc01", + "3ce1f8df018a64a9d076f8418f92c4766aa48e4863b4dcf9e5259f844d8e93d35d04853654e953be812d13282a996efcf7bcbab951aa315e3f8bac3b4c0fad9f01", + "2f86dc5d8c351fe522dd28c48154f9012055cf84efe1e5ee852c35e0c1beca515df764310a3261656123cbb135cedb066f1e2d15c6d3da50809108b1dfee957100", + "630ec741f809aeeb3427b0c3ad6b87d579fec9fe1783f927a9186df5059d5c1803b9d0a91d1f4d7761b374cea2ed1c336de82f0abdbeafeb718894f0b2ac253400", + "211d06f41bdba332658455ecdb19e70f13533319e25e2d9e701201c4f6eb038a22a04478802a9fdc5da0ef96b4e97fca848d142c12d831269641aa013dd3da3000", + "e35d120fb5a7ee7d644bc0b4b22a81b3eef841ec1388d0d094c3aa85322f04325b208770d47a5d9dc251e7551d63801fb502d9d10d6d5e216ccf4f456408350000", + "7fdbea3efd7bc036fec0ca9eb26e0b7a257acf779ebcec1689b206f77dab863d0508e14c3cda0411f958975646b85ea99d67246eb0e000f96f7840a29c9878cf01" + ] + }, + { + "address": "DrbwF4PMmGLwV1n6b5r1yUcnRjESsB3xER", + "bitcoin_address": "1NZRW2vLMyzWRbtn2KBv2dj73P79YJhZEj", + "secret": "b2cac97f1fc63a1e1a16d1f322f4a33c173488ba3ebf5049931103728a822624", + "public": "02fefbbfe2f400b83ae244bb3bcd2e4073335d58c35659100f2b323d887982918a", + "signatures": [ + "d412750a5c4e7fe4564bee6f221389f0ada48c6ea612f77a9b1aeb586d8dc4a7129ff3e8aab7cfb9944e344d5e2129de4730a21e20d612a2e37f097549880b5a00", + "b2fa691f873903b0154d6347be1eddf989e67f390ab1e3f1e4c8cf1470acf4804a5d55356807561d5c6c3cd9ac7ef70d54f845d0afc42734a05310ee7bab55d801", + "e21e1102033378122861e21245e0ff0752aa94d7b097a26a16b92aebc7b7291670b5f9efa09b60bd72b21c1e386779400455708ffe36518299b25c1bc4695f9100", + "52351ba65627367f19b6ad38ebfc57b2d797770aaa45a5441e61857ba0aa07f5452412d20710e6ad4e15a9353244cd69fa01d09b17d1b2539774c0c2ee477f8901", + "129d602024659785f35229d08148eeb270192b5600a4f64ebd30bf1721f40ef70312cc10cb97cbcf2dc53da1e8b10723c43bec6b380344f635130ddcc89403f000", + "e7e63d42e064530b329837dd38955731fe3cb68c7f8cfbf7bb7452df2976842b299624c6b91be28fdc3c70fe80d844104d4f35b5c5a6f550471975de4519b66400", + "800fc84bc5cc7947c1860eb2d84e0a4a16995c75ed6023b34ba69b7b3ca0da10146fa36b391e95fd48af4e1281d129b73c66b7ae12141f1db72a177efea7835301", + "5bc5e990c347f77cd4a0db7debcdc92bb6c8d8f0287b2ac7e542ece2f5df3a2834490e90bb3ebb3021f444fc6638c6361a51f92b62616eb31730e53c74d17afe01", + "5b9537851a702c03851633a514750f4050f08430a287a885312c2b0db992879c5ac20bc4725ee26a83551f220314572fd8f23e5aaccfa0df80b8e9b38f357f1100", + "ef0c38e69e2a6f90da8bf5366984a20bcd1444e46d5a96448f7c7fc2026f13150822069375ad746c3502897ecb977b78df08e3c65cb4f2c26981f34a9e0dec7701" + ] + }, + { + "address": "8UtRig63MLaLcBWz1roupZjzgNFWZjFDPC", + "bitcoin_address": "1EpVc8Up59m7mQpPs1ysrEv58xYG5Drewp", + "secret": "84401dfa69739cf31e040af784a9f2fc92d2c403b77244c0ee1fda554b26609d", + "public": "036affad9cd7bae39d491c37cffe118d5b3d23a82cb7d251bd9b0a26e02ecfad91", + "signatures": [ + "93b45998033de9db250380fce60a61e3ade7e75eaaa616752efa84756278a152260b96b3d32033a243c525e81b70c7b304ba6dda691be1f031e1db5b8e40de2501", + "2993e15ae39378a443662deb0a2389df953c1b819c760b05bc8c57e8b2a47df76af6d61d06a60d16da662ede2e0e608cdb3a12d8789a8c4fe6a21f1eae6e63f601", + "dc85027cf73b354bd47b8399a22057baf11c4c59a133a335f598c5a32e3d0b410060a0e37f14b4254def16fc8b93347ab0bfdb56325dc3f361be6a45239c5b8600", + "cff714d386410016878b11ea5a20c756e2b8eb5126cd92efd668c48d4b3d1543499aa234bccd23730bc745954cd901e645763d3f0e25472ecf5b86563b15448a00", + "3a783749b0b78225ba0e6391927e4bc8093c1c0f7d165e79241d97d77dc969aa302a4447bdcf85ec3d2807ec49148dac1bd3c34c46f50ce835c408210d449fb501", + "f1fd6960250d78d7773fc114cb8b08eadc5616fba800ecbfe6591ed4351e0da77668b8691157742ba1046c957de85db1c2337da9c852270906b5f1edf262275801", + "8559c8902387ede48f83e19e9b9fbdc6aa4b30feaa5911c02311e02e683de49230895dd2de9cbea7cbd2c87c62705e3ea669f436bd131d2e14c946040a53c47b01", + "3194e03f394b5f5f73ec5cdf98188be9cd702a4b23650d34dcbc6ba838c449c6346931eca359b9014dfeaf59e223e49977cd48b997b2b95ce612934919583ee500", + "b56a1b1db892f1b55157f4460baeb410acb9e3941375993cd9487245791c45667de87e6a27130deac8ad53930cc7f4f36f60c194a6f9738b9b76099bdd9d258f00", + "fec84af4b8fab37a828ff011beed6850e12160d08c4bb5bc41d175f40b034b25357589de2f8a2c4031be33f6cba385782143870947d2238f3071bbe6a780492a01" + ] + }, + { + "address": "2FEcDysCMv4HMzwXqUGYdpEqPPzJmAanfo9", + "bitcoin_address": "1BLvp6SoyQL7VKKe6KUt9BsXiadBuDdEKi", + "secret": "e44eac00ad22c4e17a0749103e842c381db7bfdcf5589fee225d0171b044fa19", + "public": "029f93f0c3a354d1b89f6aaa93b80ce26cf674988a9cb8042b9291b47639b621e4", + "signatures": [ + "61d574bde2ad3a35a6d7ed33b47f5885ba88536f1dbe54bf4e61a4fad6eb383640da8d0e4b6f5552172cc7d0c9db11c4c7b4e8329223ebabf3349ea1dcf07a9101", + "4f2c6bd0058643ada8225fc910ae42edadd4ed77894880594fc6a14587d56d9b5b1689780ff5ffe0550e336ce8340915a4ed2e07d5317eeb8e8d4a195b31251100", + "6f4339f187cde041b7f4eed3171066abb1ac510afe00b334cdc6dbd460cff0be41ad89604f191db6666cf50a2cde47bb6b7555e6b200d4c1ec1ea22102adcd1201", + "1d1d56be698880ed0e3edb50071838b0cdf622cc9401c63b46497d121c7a35b44aaad0415496ac0ca4e7a6efc2c28aeae509cdecccb469335cf7dede8301b86401", + "8a33f78cb1e2767147a40bb33b2aa5ae367d4e07f9d954a11489901a49edf823431b7da2d23d48958416e310e9089e00b9f2695fcf0508993e8efab888703f0e01", + "02a2752aeeba167d66f8ec9443ad8575570d766bd226d4fcfa7f1037392c33e520750a77e8b62577d8e469fb05a3d33f8e9c18fb3a02f2ee69ca8043b063031c01", + "7ae9f070f1ac3292c3fed78d8676351fb330a8cccd016876576ad3d50bb861e41963bc58a736ec0f515e3879dd36ba86fa71632dfa1627b6a5f092d228e990f301", + "a9dc1cdb26c36c56346f0cdfce899db2dbea965e695846e09623cf09185e17b8495511b6e5972cc631f71f9735102585e744144ea36e990fefdc215da688c5df01", + "70ac0d8ba64116397c25d5515e9a9abd9a80eb028dfb44bee9b3ac97b2c00e9f0e8690ffa8d0ea8aa6bf6aca24b2fba06476c88170ef621f3002da946de2a83301", + "441200b55b63ae560addc5a020b56937fd25021b23e1d951ba7c57d90ff7672a371513739db52f4294bee054fa2ef8adeb4ed38bb4d0a2e83cacfbf9828bd8d500" + ] + }, + { + "address": "CZQfJSz4sSF5t3FVzu6kyvXYDugW3aSNVu", + "bitcoin_address": "1CZ2qQqnAfH26Qsn833ECnzxgDU7csecUY", + "secret": "c7a2c3a4d66588696d0bbbdae561d44c5ebfae50965bac29a5c34be86f9f2ad0", + "public": "03e40a507b0a3a2e27734098d565f8bd1892db382c325838b4bae875453a0cf5e8", + "signatures": [ + "785c64e60448d4c3c6e1e56bd0a1743c70fdfccfa0866385db6c86cf64dec8ea76e655a5621cb0c8f2f1e3e20b8aae8fcf2efabcb0539831ec7962fe310ea92b00", + "c0a18cb45d85e65de31fac27e60c602452ccf320e93bd217e001bba8a96a2fec3c51f6e6983386310a4f3ba3e06ea8b4fb6c62ec7698d12a41bde9fe278dc8f601", + "de824e91917697141f4d1ab5174477488468ed853dbff47710805d1abecd3df9454f497eecfc98a32189e00b5ccc0019bb0a06b56f6df7c77afbb4fbb65f639e00", + "1a54dbc4c6fbc4905feb7d3cdce1143f0e5bb1836c12b6e4bbf9fbece2987f6a3fc6838fe5704fa6fe97e0be3cbf73fead915bb9a9b1fd555eb6dda4ba69082700", + "7ff1df7d20ae44dfa8d03232328d0c921dee85441065691715b6a5604c74af135ec9de99dd075360893432889b3a4cbcd65fca62bb4a4b7de9d72ac9bb90e19200", + "27bb1cf484ee097e6eb0e0d1c09611e162ffb41479d172c8fd040d89781c268732dfabfa77c1d8c21b8a2be1167c24054960273005432edfcbe82bf86c7752fa00", + "adb2af1376af5008e9e59d1d7fd09e283ff2fabb9a8e0f75fed093418576f103311064ad3228a23e34363142f5415333bf97bca296f20aa2efaf11c5696428fc01", + "37135bb0ec3ef75b4490c32cb476bf80d04a8c175480a755edf07bd87a0575dc213e25cec0cbf100114daa083875390dad119f181a4044b61c1575414d5f38cf00", + "b0af6e597e32d5a34c75d1c7bcf9dba46edf8980a0da02378a4fa80e13c5c8e6684ab741a8dcc60a4032aec17310451c21d167493e4f91157f9054142090882f00", + "df3b1d979e90dc35f5f89f98a29f041b261f1e18d9c9ab4cf323b797e7a077d45db26932095c28d3e7a2cac92ed38079c8d3f3f2bfc60173fbd2ae64d51dfc5300" + ] + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0003.golden b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0003.golden new file mode 100644 index 00000000..a3751bdf --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0003.golden @@ -0,0 +1,185 @@ +{ + "seed": "osqujzBPUMZxaJ3Do1Y7kNVJkcvcD0MeduHY9y0YTG0=", + "keys": [ + { + "address": "DC6BLZG8zpsiSa1gGefwdPzuxpUccKrbXe", + "bitcoin_address": "18MpQvmcaHrJEVX8MkAKhfv64k8UFQbsEE", + "secret": "325da6487b7076dcf1eec385918306aa041351226beb3781640eae8a432e1055", + "public": "020f3512b4c14d806f71faaa21dac57a07649f3b6871425f654e3fbc7f65be1497", + "signatures": [ + "809c24982147fa79488cfbd3940e73e2ecf2ee9e467f0e18e39fdbf18db776de60419e3535bff3cf67ba2791457afe74722744a872e3fe18d3bc37d3d8d397be00", + "b4296714ecc2176ec0322cb6a13f9bd75a34f09d5365ae5131468682d1f674412c61a0c67085ad839cb61b51e9c5a7eaddcec7de4743ade77825b2e746b4963500", + "508056bd0ffed1dfd2c6b0cc0c9c6ad26225db5c43f315a87bf8251355686ae212746fe8f679b7a9fa1686e6fd4e20dfa924ad9f0d186431bd0e5854ee58193c01", + "4bb6ffcbdf92372d6b34fd216197482fc25a39492641e74fadcb54f461998a4339480cc1d2a6f9d082b8603ed0bcbaa3981ca871f515e32ebb4ad6fce804556701", + "2b9d6fb8dc332b4c35961b916ca8a2ff62992fc841302ccd8dc199b3795e95d0750b6b359841fbb1f9deb5d28040d3a13e8deb759f8c3d5e95a7b51de70c1a7a00", + "6295a6d33266334ca84e5f27937ca2eb0ad7de6e28e89607a061c6be2d26714f3dffdac337c67840d78dfbdcdef5f175cdcc681d31bca40ef33c742da9cdbf2b01", + "fa2c67f056fefc0345e38cea031b98deb7b94c0e8b354e4e14aa8a28e7e2f88e717fbc72ac2c7336f000180be95bcf2f3c72704027e91fadb91a1cf3794d977401", + "4c2e02faaa872d69564c1ec25d6ff77893808cf4b025a8271f716497e16f9244079b7bd642877f8595c5cec0a009b5773b1627017c2ef31fefb558e3ca87d09900", + "116efeb0211296184f0c6b52b71f43b9dfb7dbca6a641b6a5daa4646b44655b3094dda11541899c235ead9ee5ed5ea9888ed68f9fdf51a77c973dc27243c055c00", + "91007e5048b024ba6ea799d14c5d907d7febcb896d8d6b37c528d59f43f0ff033ba752ad336bad95cdb162c6b2c991e06d4e2aa72769de959d536a15049c6af401" + ] + }, + { + "address": "2dJiYdLAPrgJtNxmYbmx6Yjf3J6o6tTQTd5", + "bitcoin_address": "1BbMgnfAyBkv9nZ4Zdi94xsGRQeutP5iYz", + "secret": "ca3448d20174e2bef91842c97cc89961ce108b634798e3add08349d2ebb3b7af", + "public": "0363cad05bc20e6061d1687f02cbe2c23e188f7272bd06a17f5e1035b434215d95", + "signatures": [ + "707b5c34007269e88ce9898b604a1c9c9ad31e5989f8ee6fc682a5bec4b98c3832f33d84d9efb2f3ade0b8813aa5f3305517762719278172645d842bb0a3175600", + "ccbfac78d5323f046a6585ba6b6fe674edbe1e565d33207b0f662a28176d0e1e7711309c9df63edd6e08f3a7c454d94cde4fe146cde5f4cd686a2103e788ee4700", + "60b58eb3b8020113be1ae1025f5a5d57ddb4cb27adf0471f653fc4bf5a937a805d523921ce98c3f2f3f39811ca47601b4c1a5bef7ef3ae47c87877dfe49a04bd00", + "1cdc3524c0e0a18011f5e8a627979309606c826272e1339444349c356cdbc2c05728c3aa674446b38f076641ea3c032a007a030e4069a570874545c4663667ee00", + "786aee30a6087a5687781b3ed888907d1c067148339552b90c022b21728472613aa715b75cb141839c02b3a3e7d72b58e6cf1a66733be1bdc7d9f209a0cbcf2b01", + "44e13e6d249dc2120e5920a93ff9d14b6d8b9f4f76bf3b160111e7247d816a0d673da37fed5407fb4adaf4974751d17212a88d646889f3c21d18dfcb8236847101", + "d0665523c04db55188b1285f0f6fc79693f9468446b0e2209f1573bf2f1781b16d06368f0f1d7483ec3038e64af75569cb474eff030838397e1bfa331394f26f01", + "d73c18368eaa83cc36ed1ba70424ed51b6889a1bd184e8e63b05b320f0231c876d70bfbd5e287e81ee947b1961c88790285c70b3167197f04a3cbd026b4a9af800", + "d99efa290ad64474bc2c650af2e4623d491aab54317d73a4cbadbf10f706d49447b508e2874fe41fb5d62d8676df9775d3fe533e26c3b59e8290d02473b29b5901", + "e4708608839de5df88e9d8091816566060ce16715e6488c0b376a31dd977777279a6f88316f3d2c0716d92048b8d10689b273d83dadf5d4b167799abac89b59e01" + ] + }, + { + "address": "tNP6Z6m64tN66qv8MNbpgs3hXphXY84rLm", + "bitcoin_address": "1LKXRSznDK7nZ6b5rbxeMNEkyZif6QnPxm", + "secret": "52296f8c8b894ddf388ae2b000a023b6bd48817b9139e2495997a74775f5205c", + "public": "0229a7d3b520548fc3ce2d2008368d9b00ad9ff5ef045ac9ac7f3f8f3036434917", + "signatures": [ + "4bbfb348b79a401708a6a2a420e14fd003fb4a1a705b375ab679fc22a0a41f4272459c5d5f85282fc28566934d4577ae9b1a7089869331185a5f582dfd0e94b001", + "1c5c40dfd36fe3787fb6dd38be1dae85f6a6fd4b871916cd1b95c1034429472e4934998b8bc82bf166e14aa9367dfc18331db53224a1194ec97e506005cff1cc01", + "d90f16cea7f7098d6ff350a99a75747ae4d09052434c11d60d1f3bf44366d4fc310e19b33618ec4f3be097cf01c24fbc3cb5bc9289659e5b1cea5229490979a400", + "3ea89cb88d288bfe01f48409a9de0f869ab9de596ec9d01df313f5362d33b44845e96e60146b218a085a0d55526a6418eb02c37355167b0b632268becc33731c01", + "9e497a538a113c0872cd2427795e37dc0c6062065917cce07a6f406f2bcb1d203fd2fd6b2a411287cb253a6595da66c2c253e3d9035448bf1a867fc54afa719000", + "c19122058a54edb872e7c010a2fd7fd4f2c0612f5fe9dfdb69a23c257817643f4ff5774d3714b6efa9b5a585f5b89f1bd3febc43031d10526b78ba1c65a753f400", + "d2d796df07fa14f76b3ea84efef72d4412aaa67be7ced6b4c0ab2768968878614820fd94dab1b679a64548a4854f0beb7d6ce495d59b32e7226c4aa55b04be7800", + "7f9fa76140303717d61f6fa1beb1cb1d492599e8a4e9758a76c36f9bdb0f2e165a86cd84066d094b7b5a5b1f7e6669fed39ae381f03b54862662fdfae9317ba300", + "351feefd233570aa5390987f9dad774999ba97b2c1f39affa31a80b68030a4ea2afcbc0443ad0e90d6198fb22bc99a42afd1a264cd4866e2d7ac93a9bf03a79201", + "12683e4bd838a9ccbbea355a374eeed3eaa0339055cb90040c79570736175deb5568ea3b22bb642067a2db8245e83fa3e9ff14cfa17bfdcd7538d91784a8e75200" + ] + }, + { + "address": "28Jw9pmX3U7cckrah9kEkp72nPQ1rsRVEmN", + "bitcoin_address": "1PLNr7sgASUez2eK1Qvks2EfhHte1omPes", + "secret": "324ea8f53efd2dbd840d97b8eb1a81f4446a33ca0694c9e91fe87e82f0930d43", + "public": "03dfd1e1219d411414b1dd12efca1a54e96ead409cb810020af7c92c8bc6a03d62", + "signatures": [ + "095e9e13403b7b398249ba6b07121adea43086c9dae49259955c77bd0c42c84a66f58bc0cb6fe7e471d6dfb085f3fa936a730725ba551874b90c12d1f09e463d00", + "1872730df7a78b2400ce26692298c979460552a7e1bda64c702fd10d8df1956131fdcb3c53621ccb2032585ac0e11a5d685e12e658c7f3f0d105ff9b4176c30e01", + "c048a79e93c15a2820821d0a9f5d64ed5c1560c4a791baa79320b865a636d48932ac1db2fa43a58fb9e422da818bb971aa9a25be0e13646251d28ae94c5e2ba600", + "c7e67e2222a5243970e88be22d5cb13620635e2e2e93e1d81f441a4c7298c14f29a897b38b59bad93aaaec08c5e408a374804b2418cb6044ebb3cc3029afb7e401", + "cfe3f39d79f18c868bc9cd227f8cb32ccaab48b4e6481b72f9f3e74f17b87b5e5af1033b0ee04f410ccc20fc96242a5e5292ef40f91e3caddc3ddf6e83d1912401", + "a06f1eae2fb6125574ddd35a586b2034630d672a38691b459206b8ff1ec0a6e8681ea699daf0af611faf1e17fbad60436fcd5ba7022a0401c1936b77ac6e081e01", + "9ca4ab63017ea7639c8c17195e090c7d1006289da7ea61adb27cb3d647a9f44e756791099fbd7a380b780f6818eef289e7576140620a418a0fce013de7240a2701", + "08d70e714be4493282719e96c6ff7ca063b003e595e3c1fb7925c8494b17d2aa6d17eba028e8419fc2fd76e7b1352074d711964e9b2c3818eeaa6b611f4895b301", + "af0477044a15ecc71fcbf118695030d582930842eb49c1675a969cf2575dc2eb0d14d742ee694fd6dae8ca424143a5f22e53e01cf077ca8cd95434f0ff926d7701", + "f0f6f7da0e96362162e433b3b3c445ea90f1d18b32d9cc1413248f0dc27e68c6703af07525f4dfab6e09ca83bb360d9962f8b67e271fa1bbb485b884aca6bef801" + ] + }, + { + "address": "NBhY9RijacMUvN18h11DmPVSQTfiqwVd2a", + "bitcoin_address": "1NUp6Lf4U8VnMb1T1p2xLRoVnnVnwXmxXG", + "secret": "b07bcb05916fa130aad994a1d7de445acc2c28b2acfe97c1e6fbee7c95baaf5d", + "public": "029d8e3cce3767b3ecf6f615dfe46d8ef93538f2748d4f0a116eb4f55d6812d4cc", + "signatures": [ + "96d040001d138f7e8e8facf6add8ada3f2b3cbd73a9a7ce4184de7c6c8da694964df193acceb01fd53007f5947fbc035d8e85e84fb59d352ea746a068229326001", + "67bd4e12abb98df97009a415984c1c494f00946f0fe58ec8b93fb40a05bbbd571fe50029c7de9142a2466b60e835d78c33e0185aeca77af671be437a8abeef7b00", + "f4053547b9dedb47b479966fc4f31162f7d63c749beeebed4f9d0de0e59aef85145fe85cc249a776f35f0798d4c140f75babe24db0898e8e5aa0ad094a087d5900", + "91f63bb31c6ebc767194b073b81374d6748cebf10f46d8aacad986c450641939490f6a3380186f98540c5252882ab19d8093c25275d656577a67f2b4a51b573201", + "5fa1ac1fe4fc4e07923241de99b7a3d7471ae5d601277bbe3c21cda7c5ec9db44c89674432eb551580175e8001586203f4163b9686d82378c5b027f844c0da5601", + "c4fd4007a107d2b58389eb9bef87eec5e8e6721eab888a13a19b5059aba4a329162c64e9e7bcaefb043fb1fe677b2d6434fc99a9cfb1f60067c00d98b3cc5f2c00", + "4b2c0f225d0a94279ba2f99859a730aff20ee09eb161c9f74650f4061c8919ba364504dd91ba52e0339acedad7d65a5ef9734d5aada7aff1c3b707e28431772b01", + "f28b175b0ad668f075c998e6cd1325515dd6795e506b4e7f3b1b41167f8f7fc84ddf8eb85bbe32241347fb81c22a7ba46e052817b168102f43d630ed909231df01", + "ed07e4b55f64713de65af6e2d65fe9c88c782bd9f54b0cd30fc0c95f2b4d8e48244398e72b4aeb7bbe698f3032a5cdb39329e06952683dab69802861cf3f325200", + "c042e9d6c8a0919a297843013b0da4f16f62b0fb98ce047694f50f433ae9ae9a4dbce35a715a374d54034386efed191de09cbd4d1e180c5b292f06506298a74801" + ] + }, + { + "address": "2FyNgfqHoLncq9y2Ruz29KwueL7oK9aKryi", + "bitcoin_address": "16EDnragRFzC5csxV7uLhyiK3u4mQC48x8", + "secret": "f46a54411adb3a34ed4a11e4bf01d3d87ffefcc2a2ce158f415078c20e5b01f1", + "public": "029db862d6ecaa866217c85468d7b0164208dd37087a90c5c8428524959e982d79", + "signatures": [ + "192f8833f7172283c5c9c0294baca36002429782595fdc924c987099bddc7c6065683b14dd858eaa55ef7f87441e6848130ddba06b9cda2a41e635ab072f378601", + "93e6c81c91dd59aabd9247892a73f3939f1bb0b8ad6229c08e1f308f72275a066910573dbf60ef1f3a72f31bb0848e66e14c55771f5862d9d90b230c6fc8d02d00", + "1ce3643c9c018800ff12ba0a121b98a0f858ec40c2e6a9b5fd37abe0fd6d9e7d54612e64474ed28831fc0175bc989aa9f1aaa436a635207cdfa085d6e18906b001", + "429bc18483a652f86ae32e20c917de9ef043abe922c6bdc95d76724d95aae40c7c9e273784f58255e5ea873de4826b81686789470895984c7d8aac2a13365d3500", + "f4dd8039559a894885d1cf76043a4c4bc69be4e439050d965c4e2889818f582021d0850d7e2691b941d63b79819d9d11ee443f953395a1b76a54c794125a95e901", + "6f5b2ad4c639745a02a5633dc6f336ad1f8d4e035573abb8b9d91960b2ebea7601f62bacc3eb8c89b1707dc0ca3da4d0f8faf5b34f18ff8c0c86578d5340674c00", + "e9e052fec6c7086b57d7dc12ceec2f637eba01863336e6bc5a6d6405c8721ddc13f41a526937e82725037feef805603ce6a4c97421a28e5804c74ca66434404001", + "10c5f518ffd52e5b0759565706b618401d958e994a8cc48773b4081abe5f1c693c3d33378c08e29703018226148079fcb929c47389cca503155ffb7663c3fbfc00", + "3d943c9d9290f0c01410175ebfe7d33926c309b5a6724742632e962e2492181809596d7f5b712f64e82dcfef0e5f2dfe76d85911146e9920e5ac5392da1589de01", + "67bf7d8eaf1636985fb661774a0c4b5377184b5a5ac1f6f8c6ee4edda83ddbd22f161d315e924331ff5ae0919f83b1ce1b49cff295defe5617264e21aa75f18801" + ] + }, + { + "address": "24sXyRBQRq1kYZhwhfHhLU98DZGcTeHwQNz", + "bitcoin_address": "1MHAGA4oR9J9nDxSAuQJbMdtHbV3stZ8Te", + "secret": "af178cc4704bdd222cc94016d529c5420710de96ec8926bb0a395855875163b2", + "public": "0306b389235982bd983d081f6584bb45123bb45e8055a844562b37ce7971c539f9", + "signatures": [ + "a6d3d5d20fdd1620c4a60e665272657e24fbaee36f61121cf9807f2207823bc51900b811ffb4ab32a2a03081ff4faeaa2d16d73fa82dd1814c683d53add34d8101", + "a176b6bd3ca6d38d8b38492178d78950575ae7ba22a6e4c43c30010d0b88e37f7a59d1da6430c92ce9f45276ba75cf48a4ff25f4dc73be8428ceae7943c7a79101", + "ad4287bb732b1d2dd038d3a3efff7c14a617d1fcd14d5431a5dc3264f082ed0a4aceb53231c0025fff20ace3215755d83a4380e61d1762f5b2a7139678830be500", + "394c94399fea17bdc9d5ba2ce5895c671ab755d10a7b10cf9e414b779762b5a309960d0a5c6a63490959ac2aea2b78e3a46ff404d001bfb89217daaf6aac135801", + "2656802a9978b3ebf7bce6153e7ac3ceb227121a2a030d0a18c7555c30d332e80f75e0b528ba372f44e457989a5879016b84c06b2d9ba305adad899817ef2cf201", + "e9a7e15fc35ed1b76dd33a5bd54893e8655acea9313cc3c2c4e5561b07d97d9e67e953ebfa256470c8c680bb80ba373ac03d3cec9c8a11a036665df7db9001ef01", + "0fe18385d5e354c2d53398351d94f0c4716a27e8b2ed564643939a2ffe8f0bae79a0b60e15ed1d26a57277f25440aa1ffe87da1311e735f22c76bfe183f777c001", + "96ef9eb7cb0d210642b35dc139d86ec9bb1244045faed3b3e81fe03874aabdd316fe4c261d075373282a678c57b996f9c38f9aea0fafc7f95202fd057325492101", + "7b9fa00ed2687eece3dc9ebfd517c76e49cc435048320699b7983aab895c196a25eaa9c3b423aa5a56ebd27bc197ee40ca0705ed0bc082b5bf826d9f1faacd4f01", + "163d0482069bcec72d0cd9aacb4601902e41ff7c5268f8a80e3f3f1bea5390d2592d8c24c2784b645f5c1776835614a85679da210b9e2d67fcd72462acf73d9101" + ] + }, + { + "address": "2eEijADfBZAFk5WpNhQg24DnqPPWaUwd8G7", + "bitcoin_address": "1MnkMNVD4YLrPkhnFBY29N521ZqQxamX6i", + "secret": "a3d764738e2dc9eff6c1d423362b537d2e2d8346483d6a5a034293fd9d057aea", + "public": "02e7f5c694d4f4b4ecb146a634fbd3fe450b017a0b8306f4f351dce5773e81ba8b", + "signatures": [ + "4611b93df2c55426447f5bc13cb2dc60d738bc62b90e823e25cd0607154fe0b6194df3869d33c25db8c9ad94b89443440e01d617b26d628fe090a70db05588eb00", + "a7102de3b33131aaf1462c9b37c31da6c5e8fd8bf8f6ea5821eb3aec8672a93b42bc359635a36bddd0a0fff3ab605776cf63544adfe5044dfc302d6665f7d98c01", + "2a78f73c5fe82809661e4ab087fcff0275aeb6dbb6e5200359352d708705f6855828916a6442ee15e3689113ff3a00b0cd9617fdffb429d96885a5b881b1f6d700", + "b0d5621cd30790b21e32d079eaf465bb13356aa1972d91017ce5e53aa8d1acaa06bfb3850f59edcd71b5b7a5df72d87af038f1ae4a5bf19b6628a8fb046c360a01", + "ed1fc78e0f115aa052a9d3146b057516c140365176da613af737d1641d7c70f71324a533c06189f3bbfdb1420febb09917dec38ba2bbbe5cc4bccb89eb8f82fc00", + "db6cf55a88608ae3d438cb994c490c0c99a036c4254414f0c04be67475c179c95f5d6be14f009dbe391dc6c5c078c673e2b627b9018f425490d07e87352159f401", + "b43fc4b582eb91acc18cb03caa1b8460e85364115268cb4d70236b87fa58140b0644123f8df014d3c7195b3ce081294a9a7bb2946050ae24cbb98dd643e7e30100", + "5a14a381c75753e4f1403fecbdcff1ce0a0207ceceac88a6264b68eaa164a4263e419903c61b455b5894a3e83fdabf4137fe27ef57501b252a5a40b1733c2d8e00", + "1bc9144b3cc9c33032864d23c42d58da1cda12e782fcc20ff66487b6b4eac7655f4ba61d26aa2632c9033e9b5231da547d3737ebebe86c36d7219562e04792a901", + "44fa785abbbfd89a8dcf6bca7785e1fcd52188baf3368da756b7a8fba7d6360f54a974a54db38877cf84ff45ed136c0cb36573c3a26f952eba03a77de1a49b8700" + ] + }, + { + "address": "1CRfbjpqCGsrFuU1iRWQcCEfiS9vSDGDnb", + "bitcoin_address": "1f7rzih2XrFc43jCQU7nXxTLLQmCHyhSR", + "secret": "7c4fd501bb1a2f4dbf7dbf0bb9d0134fd90935d7ae5689d2005a030ee64ff0a6", + "public": "033f24693c5e97edcab4c2fa1a3cba46354af26865b055c6b7f699cd61b0731d69", + "signatures": [ + "9f01d4332f3e069d930d98ca5f7c8f23374924c317503b2859537fe014ab351c07c36c8a6ecf6a4c8bfc571558399cf3c31b4dbaff4b1d5ab37dfb0c0b0e384601", + "7e18b44021d19c3d4d36a2fccd3139c6bcf8f7e3bf2ecd0270d3e01eff0b94ca6366ba2e8fa086a6f2ee3d5d9197a47114333942b754ea9cef3e210e528af0c500", + "8912e1fa6852554783c4d77be8e45e7a14c0a4c8b0473201813430b1ea832a700031ca373e48ae06a78cb3d95f2cc24b93c0a2eb4c02db2511e3c2db7fffe4f401", + "1591e3f7dd9b74483bd6c65846b9e59f94aa2f6dd02213c715f720e098e19f517aecaed7eba340374cd69bd39c7c9d0accd78bb9c3b6caed9704e7751a27710e00", + "9ab1221cdb071b3baa1943e1e2065f581d2a81c1d33d42f00b106c0e52c03ba5326e99bad3e1a4fe76a5fec41a29a82a366d2df1ed7b5688e1c9c591a8c937af00", + "699e98e30bd3e769bac617bb874a84137e279a420e09acb1bdc85f69d1d8132509f958813b914327aefbde00232d2fd860bf37f0aa085c2c672a3b47cabe0d9a01", + "e731c954198de65dbb56cc586274804ca0148a1a9f0ab562be25c7ca5ccb5556101dcd76b3137da7a8847bf63465fe174e537a80e7f507dcbcbe29e8f99fd61401", + "2d8790ab17a76d20e1b6d213505d08fb95b0e949eae75c4aacf7e575680179620be72cb7781037aa4e5e9656eb8b6f86eb81644dd102bd4b8259668e7eed38b401", + "ddf5b3672691bb851ada7425a749bc95fda1fc6f5cd2a14e11881cb06033543619ae8665086e22c308040b5488a2c7885e4f73e506b69c7138ff7a67f474c11300", + "a835ca7b0a5b355dd58983932cf1d4d15035a86e49df81128ecaf9fb783317115f69aa5d6d75302a0c128e3c531577f77ad0d5b6d215d25b890e941938d3bab200" + ] + }, + { + "address": "2bDMZ8tKNd9jjpaxor2mNN7eyD3tvGQvGrh", + "bitcoin_address": "1HSdmraFMePhnAwHkYFBb5YxKZQ6bxpCEZ", + "secret": "5b5ca59c4abe3a782c370365bb9b85cb64ef66ed194fa2a0fb6b66616735d9e1", + "public": "0372ffabf5e1fe4289af91fdcded36bd3841e20926f9ea1e1048c1125c2aefb7bd", + "signatures": [ + "9760ad87d8566f068df40cb8b7510cc58fd5d8417c3c24e4a640f29e4af047c13fbfa476656295689a0a4543c0235af56a2b73cc310f9433f8392e8ecd36645301", + "5136f29e66edd0961f8a21511d04230ab71639aede10447cd21783ca79af10514420c3571d364112b3236e8e2c4613a1b35d365d522d7e57578d06bad5d6dd5701", + "206af9e7a04b8ff4f34fd353ff67c74723abcf6947c897901ada314ae14d5be60939fbcdfb0a19abd7dee745d4ef41d536dba5af63ff4ed51a9527f75d7653a000", + "39a21464e465370c3303fe9615535efd132b2a9625a5b687bd48dee0529cbd7926e45514566d8800bb0d730adca3a81a70d6092be7e0cce3c990585a37954a5701", + "177e0155ab098387673b2b95627f10437aa81aca8dae9d485f0a81d3a1954bee644ee54b2fbacb76ea2e3990d5ccbad69b6048adaad9f365627c3d4d62ff44a600", + "0e1e137d69c9b30ca391eeaafcc3e6c43b4d8261fa591ef9710e666797c214b54cedbfc2057a5c4c7f30ae3328b8286ee33bc38e301003b7d96a696628948f0401", + "0f6350ba71a39d629a37b79e4deeaa785dd634d833667379b5f56425632be10a7be104ebdfcc3304e6d2e7b672066305ee894187a86b1d04be617cea14d3b86b00", + "89d2aeccb2685af100c6df043f2ac618abffc9c25aac53e459231a9f86452a89005a26d25559688e543c24c23871e2c374a62237bf2d3c308c4b4e334970038200", + "e22ff4a474f973a28d084a842a3aabac7eea8c6d7f098b8dce13a327f9b4957b625ee95f947c86c072490a2606908dd6068df998106ea2a1bfefbdae1ee59f4c00", + "98902bc39b4e4d58dbb9906384dad91b0b2ba15f9b59f47b6d1985e1e48da08f213a4e785d5a1c18da576f5d9d2a37b4a6b21c330a26d4cad23bd75f1419e2cf01" + ] + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0004.golden b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0004.golden new file mode 100644 index 00000000..fe2b5266 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0004.golden @@ -0,0 +1,185 @@ +{ + "seed": "Y292ZXIgZmF0YWwgd2F2ZSBjb21pYyBzd2VhciBldmlsIHJlZ3JldCB2aWNpb3VzIGJyaXNrIHNjcmVlbiBjbGF5IGJlZm9yZQ==", + "keys": [ + { + "address": "2gSg5K2Aq7V52tPkQFMCfgHNhkae2KsTE7x", + "bitcoin_address": "1PQt9fRE6AqAfCHGhCtwNaDf6n51uB8tQT", + "secret": "6f1d4cae19bb875ef2588591612a73972d824ff40bbc8ed709831e71764e7897", + "public": "02e28e6d645e070e698c35fbceb8a81ab5e5d4912c8957d3e065e8966d19ad8960", + "signatures": [ + "ad1d4a3a61606df19d2d56083c4754f158a3cd76e60fbf6f12ec5293fe45fd0f7053bbc931322c3b6c289ed8b69eddc4517afcc9574eb6abf85dda7aca90eb0401", + "ca7cea4a7b3b705aec86d1cd5730ccbbc3521c9b4e5916db5df089307c14d89b655ee0d17da0729f7220b6ba79f39fad2fcf4370b1c1ebb1ab8d787868090ef301", + "f485b3a381b0f88629afddaaf895ca7dbe0f173db225c5f1bfd05b80bef18e5e330b2dfa46b460eaa11a0434010a76c8c710e44e489fa879091112f9f7ce51e501", + "c3f369e6685732b3f07deb7a271f786f90b3fa8cd69f217443c9e5d05aa2e9286225f6435ae60a3b7a5206bf35166a7960bbb640a5becad2d881f3a953b6887901", + "800b70203dea088ac2fd6e6e5c8a26b831a245998d540292cb2a69bec83f15ad172b805b8670a485ada4069816efea4c50fb1603913e00331562894c7df87ad001", + "bd558108807f9fdebe5cd192230d0acb651b992fdeb54f4e9b2e5fa0a13e069f366b8442478a62032847a832cc5462aff4b7458f18eb104ed8aba8501e4470a801", + "a5604f914b5169099a990f95dcd38d9f78d145b99f5c4160118c0b6f8f8948d47f0cf1a41887efcc6f821cb72eff0b66f5b7befd824ef9ed8f3a07ca671a1b6501", + "31455eed1035e50088ec9ab7097ee54a8e9f6dd5f233f1b95f2c6cdaced59dac23118ee87da70ec88056e48ad033ba81fa8c14ea891a6bc4b65ea2e08182f2ac01", + "5cbcbdfbc91b05bba7cf8a24ab13d5872dd0b148ec6141a4eae664b03b08e6795d89bf71203a6cc2021fb3a16429992c3de07d3a8d3f4504a0c2ff48e8dac5c901", + "0a42a468246b2807cb1b1a83edb251e1a81838fefb0c2414d569b593eae8d3932bedc14a5daebe0edd1910cf64e18d0ce70dffb536eefe8b7b9c27f2a630cad101" + ] + }, + { + "address": "DwLc3z1ff7uKUgcyAR3gQhfzJUHGMXktyj", + "bitcoin_address": "1L8Wty7FnC7F589ut7KGvaLcQhDLVJuibU", + "secret": "8592f9f419cb7b0fd4216e314b17cb3b58ec944979f8f6a34e21fda09e01fb2c", + "public": "02c0b5b53873ec9cba0790588c64244579b0b23eda646d6ddea6153cb97538b3bf", + "signatures": [ + "f174e61cabae3b37f1cfe3d1abbd606621765d02ed6bfa7124dae185aef762a51f6af575745d33d4b2d1664a0d95dfc82e9010bec8830e13aec03cacd6ab158801", + "28cc5c115b8bc99e6bc9d6281877417a2d5b45806205f4c430210157794920490d11d4d0de202357df8e8603dc3c74426b98d3c30fd7963198a0ac15a6e6954e00", + "c28d5d073b95ace0e2e0fef8c34bf5288633f5d60c33d2fc5fcf427c1d70a8a9045ba9db1510b68de5cd9ba2c8709a6cbd0e8c5b57cde5a601d1737f854a4e3f00", + "2c67e279048522919862955b1afe7c32f432deda62d90219505cbfe7473a976e1968d180f7d43b2b018e7f4f265d489358afc66ce0efc1836348f065fb03197c01", + "f8ede7998f1110729adce0af5f3926a3bd8927c178e98c45ba1529943913ea337d4b6661c54914d323be43a9d7596fe7ecba2a8717981ad2d9db835b898e08f701", + "8b8b94e9962b5332f1289a299b3b99529edfd4fe17ded5c0b38d6a23364cd41759f40ee4454dc9889d207a920fd09bedeaad78885a0af853cce2d1c15472412e00", + "697b517897a92769b59d9cfc86e2ce8650a51a318bee6808a10ae9e752e8fc6a587073b92da7431ac39fb8d7e77c98de1b19ae90451df69a03dcda911587c06100", + "e79c81ec05b0bde926a1ad3310ffc62423016213895bfcbac1e120cad6db1ba872dce323156b76bfe316467c26475a3ff1468e2e285cbf0c23e2ea542c3447e901", + "4f90c8736b8081e2d354c22f5e2f7e15f5fbd230305257a3f63fa89276c21c9206716122be313ca3c8560fe86c26c09b9d6e9ecaf8c7d4bffaebe20edef7444600", + "0c3e651b2b03dcbb6cdddce3612f4d0f414e11f949d046d9befb8b34b0baafb57fd3d8968f27c994a08be0fdd6be016bd55c73b4a9fea07ed44801e3dab6086e01" + ] + }, + { + "address": "25F9ZVk6tvues2LcxpRUCCjh7yubBBUXf1o", + "bitcoin_address": "13smkxWuUN5wCB6zKMxEHDUZPFrE2Stunt", + "secret": "618adb045d65f9c1f99bd8e8ff6098aa1c2abea4c8424a9ba50d2a46c7a4340b", + "public": "03eca0e99aec7896b84c683db6eb93fff2df7cf03389720ffd214eddf15f901390", + "signatures": [ + "c19580a393f382b914baae4fb0861c4bd667914729dfc2a2ba04359c247669e55da6940023902e17d1006bfb14b71e2cd6abf4388ba0f18964f51d8b4ac272ed01", + "97920bcbb32e3b0e853a2a7369d0c777826fca18037ec9711e74fc04e31de4af309a5cc22311e13d68197ec991abb351f3cdf8e0d8c112d0774d1ed0585f93ee01", + "febf199c3d88e46fd9aad05f1c612d95dc2b14a0e81113b844fca9152964fd8407866c9348572f70f8b1a8f6d313ced36314f04a616383cc3cff9f6faabffbb401", + "e5da5885db7f22a5aecc0bb7b8573703b450ad8fd454e65f658ce3e99280495a6201bcbc756ae9f7bcaaa387819f6e7bb921ba33d142077344bac8bca489cded00", + "52086e02e21e9ca4349ef74aadba227f30062a46b150fa6ba478a238084617dd48bf5cae7823683b1dd7ed0c1190ef301a5a9235fe0636fdc32cfd4a4effe0df01", + "3ff9158189c485c5dac9ca9b588291e8c7e02e148be3ac5dc15c8d1e744483b315c6c6d078d025e9537ef2a03ec813cfaded0de7afa37f329e94b6688f566c1a01", + "369c2bf1bce93ff4324683029bc35655f45c2214f7137a2ca67da406b982a9bd53f5e3a728abe88decc966ea4d7516523986b504ddc9f6e4038a80848a81ef9301", + "e673fc1269619a2bb56d3a5ab9d5d25412e8015074585abc94ec66bd5179d8c0272b48914b95f37e8ae92a25fabe6714e79ee90ef32d0d6a02fb55b72191ae5000", + "1defb8dc62e55cf8666b6f02ba3814095c686211a5194b214ef01a655f3ad03f71fcabac8760e2be64448207dd7a94e3c6502d272aabdb1bb2fece29ec4e82da01", + "96b40f52ac8edb532955af2b023078bb10a8583e06f50cb769aa79f27b6b1d6c487c1abfa02cade78f960698439569fc8fd75f88933c745ada0bc2c6efd7611201" + ] + }, + { + "address": "DJGUeQoBFUFmCeVSGkVY6DTcDzwAn3f6KX", + "bitcoin_address": "1EcNCc18ztioyPVqYARyMDtxgjRdeTgVoY", + "secret": "4fe0e662f034a0b4937c6d8ab1c9f49e6f612e8fcfd57d332705d69b05a2bee4", + "public": "0340c46145683e5aeb80354625ac586fa8142eea1894cb2b858a162673914701e1", + "signatures": [ + "d7a1198628f61f4925a314cd3468093d3231c99defa06f40bffe364693b5a06905d47a8a380666279e7a701d952ac3d148d99cfef84b60c39239cd2669ee641401", + "cb68e677160ff64bb60f5ebaf34317dfa0a88977819f807e5fca01320a493b192841804684874177c82a269eb867d118ad9e7e785d577b217b86a694a322c94e01", + "d901fe90a9b825ccdc5a0c7f154d839961658e6b0277310ebce6e27ff94ff05459b3356686cdd942060efe49413445e86ed1be410f5bbf88f0b4e5df35f9098e00", + "2c9d4bfc9ef82226b0b71cc4d725bc0b35ae15a8635e4c5900230b942ca0303e3a4ab3d5d57a02af7acd4bea6eb9d25fb52c3d0d43da43a854a309231ea9040f00", + "d01f41a7555d7d232e34dfcbfa6dffb0e0df120aecd9f6cace922c87ccc08063437073c07000b8b799ee52bb0cc438750502455141b5033a974eb3c4c7ead62000", + "908c2b370bd5a5bf23ee6e45211dd823bbc381e3d5b67b1a0844c7148b556c6e077ff844f4a17253993992be91ef1bd2f546f2847b9a5490fac0898e7536673b00", + "3fb2652982f07cb81c9b4df36b5719f29f42b2cd63f37227727a66652a757181620b676fe314394a9161e6a9193f6fea9244107d160bc02850484ebc0a2b1bc600", + "f1c38343dbcf9f4da4860554eeefa267cb18a35aeae5c0be0d6f4e81630b507860098120ce12924e7e237f4b72d0a3eb3669e687aea9b162db21417945ee679700", + "39332bf80f31e75d34ef1300cee7dbd87b5605d0714907e08d0cc552f86baf6e6346b68501bca34feb81f776af53053eaf36c91343d15e6e76d25f79c47fd6e801", + "c183c3f38336efe21ce302b914dcb06ef151f70bac7220c318b1cd68cc5d90f90a171263f5f67ca870fcb680e0307f1d872948d7d3458010864f0a3f284136b901" + ] + }, + { + "address": "Vh9Zt9oPMjsJxNVphCjiGUxHSixS48J3dF", + "bitcoin_address": "16J2S5ANbsY6SRVCoExeqwNPAXnjMoaHbK", + "secret": "c2fde07e45562dc50c18c1e7552e03ef28639c44b2bf3a4d363314203e3d5f4f", + "public": "02d40df519e11c34b78b2124820d5dc04c6f59f465d6263b68347a9f74a98048e7", + "signatures": [ + "a2d420be32276ba19ada464ae8b29eab9b07b20be80ed9a2998d7ed9cb872b767d4ddbaa6babeebac811a6dce35915d9279cc6d3c0a813fbc82a54dada6dfed401", + "4459aa264b6e3d724abc8043de82bb8eb3f2dbbca1367d4b36327738a37c2f842d92698747c24602274588a91c8b191d17f0b82fe10b48ef01a9defb14fb07bf01", + "7c890ef0145c41edbb3d56f37919efdc817b3d5e82976fe2ca0f98460315253325c47f553e91ab6a6c0531fefe7061d9c79f1f3983e46c7cc5d21fe7d4068b7701", + "20ed571ec5dbf4a322c3b447cc8d2b454150ddedf84ba086e5735451698f99101f86f82802643c9e49673f83a988d7b8193a011ce0a3c52e84c6fccb1172f8c700", + "64325c6f0ab86cadcb791a37de986659a83df1faeacd4112216b8ef2f7f0c1337c12e6af249244ed03a460c3b12636593cba964cce2beb052308d20777343b0501", + "1ed1e4d8ea4b5d925b7bc270d5013d11c5b99992c6f22fba3699c1b7fb08b79835f7ca88c52416b191cbba7cc275d7f5d9d6d693990d85c41e4a305469d0aa1400", + "02b1d63de47256007c751b9b7854ec997bf7c543af9f3536d831f2758643885b3e22d15755247365b21a5200aaada52e603b53187ad8ee5c73306ea8cd0a7cca00", + "3b7680d15858017a6795d2c3a3e292fbacf2604c5f7db30ef2270d9b6093648411dd4f1c1868a9cf2cbd51cba1a8c68f35f3492abfa9af493db4260e04438bf201", + "c1b24bcc8d83c07ab3bee8fd90cab612421c1e2eff21f03a26f49c933d94e4734b79ae74268d591b6b58d68b214b3458412f0585e9d2f9a7ae1b17ed36b0102d00", + "c0ba9d290f95ed0068e90cf68c4b98ee935d463820fa35cd152ca085b548dc6b08035498a6f23cc28da907ff320260b9aee8bc589c481629070673d4cb1cbb0501" + ] + }, + { + "address": "Z8JM2GA3ABPuKYwufFGkhvQrD2y52NFT2s", + "bitcoin_address": "1ELdqeuKfTjo6RBVPezv1B48txYzfK8vr", + "secret": "bdccd360c259b643e5f48a52043602ae46cf5f71a4604142794b687d21d1b8eb", + "public": "03fc611f00d187b85fb2d056a6a7e03a078939b1e9ff472c3f7b9575f5b459145d", + "signatures": [ + "7f023a6462b1eac2ad7226dbe884ffcb79cc640247f720a653cf62e4bca47d8519b98c45a7f5bb348f15f75cd33f5bdad5041dae85e9ba3ff073432a77f36bab00", + "1f9b6736fdaf0bc3934c687a0915acb1488f1ba30fee969c73f7f2dd16d011f65bb030cfb3738ac7dbed8b36585151f5adf2138075fcbe61ec7c3a2e0e5a6f2101", + "7fc3dab6e22ad333206069656f10ecc9600916f1cd0b49c5cc874c42102907f33bd20b18d4bf5bfdad1456eb7c8c7cfca1a676d525314f37f92977156af808fd00", + "a7697698ee9ab3368b5c6e75dca0fddf3f2ecf0378bd73481fd49e1d4f73a8b73988ea189cd301cf35b2bf4c9c8445f0a88bc2ed1d17f2e79f46336d6172442e00", + "0f6e0373d049e5cef26325258bdbc6d052826e18e26d8a7d4e7231d4c2f7f8af7f783fc5994c609e4acee8bc6777fcc62d40ee4595a2962b061475130b1e584f01", + "5727d799b297cf70b70c7267424f842cc78ff7853c7b56f0e47af60fe73a305f7713d11b418a1c4f214cfc2d87aeb5f90654e957a1752358a8bf160de86893af01", + "6abb7a9d88d099d1160ebb9f0f76e54874447214bea3d8bbcedae00c4eee34df5da3e84fb6cb35faa42688e7075351ef22b9b8543664dec354725de47c1f83b300", + "ee5966c6140b76fd30c4241c55ebb4e6e59be0546b41a7a2618a845b56edde5d63a0644551cca495bc6d1b4c8f8ba7067c3849391bba13a4a38a1c040f5ba44500", + "0692808145227bab7af3087c5e45f0fd2a468db2970c5fe37f0dfd2eab8dfc5752f18a2475a008f439c94d178a4b335304d4369096dc7e33735f73dcfa46e0a101", + "d6aabbf59d8b2ba240e9c415f95955892c7ea91e78e5c097ae126934a3ba6d592575f48b9ad58a1e65ebdd9d0464d5bfcbd4af4b849dca17d1dc2b17013623bc01" + ] + }, + { + "address": "22GWk6z8PQVKDoRNR9Mt3YusZBqf18RBdb2", + "bitcoin_address": "12rFcZuDzUcqYVyVKJsqX9tfBoZFk3C3Tf", + "secret": "02a29f33493d777d410677a8ffb9049ebd37c08e994e48ab7664b66f02fa034d", + "public": "03c2d659597aa5b59c6f64f7b75321d824432b5a41724a74a91a667d3a183e9d2c", + "signatures": [ + "94ba8c0c74b89e5bf2ea16b610de49b6cb82dab492228f7e2a08317fd32ffc994c0c440715c24bfa144d5e8f73d6bba3f66dedddd6524946eabad7733df86f0a00", + "ac497705c165952cedb8d8060cabc5753fa0de358af047a9569c0b989931ad25357887605eac25ecfd15fbd0c64eac6ddd65af25de11dd16ef24863f20886fa801", + "7a3c728bc7aeaf467d9285eb8b5200f9a9fdf97e9cc7c5fbf4fccc8a12c2d76b7a652321bba91e9f8a30569b56b5357a7b19a6b1870399dd9ac24ba5a199986d00", + "68bdd162a269d6536d8f03cfc395f5c3fbef268a18d6d85c535af73aac08d87d77c913500ef9fb9b5d6222d084111953b8f04f14ea7a73e1aabe36ef884ce32100", + "dfa9cb7e3a83c637e8759701edab94800808e4ae0611c6dd1a753b01431a84081ec0fe95dd4b0ad18884fc307d81292806ffcf837ccfec38ecc99f32659564b501", + "2ce3a840fa0cc355e9f0ba33571580c177753bffad543ceb20785319832eb6c71414d06f9c15e06311b201f8cb595f5abe5deb471a9efc8472ec1ffbd6765b3200", + "5b87c2450e587f2ba62fedb4fe46dd8b487ff19b24632c3dedc1999035457a37088c380db077ab84fd31cb414f80c99b05444dec8e0295f337a13f079747e8c300", + "712c0e4c8b261bb86d46b458c51fa33de865414dc008229d9fe523bc97a6eaba22b0b5e70be850b833a78db5e2cd4a3c64ec8380a7566d72bcb9a986234c84e001", + "e4671df444064977c74fccc8692f11eda6a7460765e437edda902d3c5aae2dd1353c88d783dc0200d769bd420d989155cbafffda4762795343055cd3d21ac7ec00", + "8c4077f1f6e7fdf022e0ab07b55b3f6c876e73879d1af32ce281f77cc936d4ad5a86667cb593d0c142efc707eb4f8e6c6770c8c72c2d89aa1fce466875afb7dd01" + ] + }, + { + "address": "Gy7bWVonUXNhGeuba6vuf9VCMxSDopVwXC", + "bitcoin_address": "1JQF1UpSoq3ytazfH3UKcfbNH2xM7UBaWa", + "secret": "127e2ae002a0089db7c77259210be6b39559f2de9e0dbf1a16e362c73e8e539e", + "public": "02b2bd36f4f2cec30c5679311a2a918b61593c46b6cf522908daafdc337bf6c73f", + "signatures": [ + "3c7e5cd75e42e58d4ffa2ca1a6f7d27df4c29454162329ee4395137fd911f90e2b3c855f37b20fdb915057be390de611ab7b9f8a306585a98bf37c9e9f9c74d601", + "5924e1c81b54945b3f1654ee12010984c18f39cdfe438339e672bb24b3ea245f55d46a79bf6359b41f08bd5317e7f52029ebf6a11001c184a2719f6e6312f94600", + "2dea341a911245608f6b92037f2ff9389ea009dca319db7ced270d766631d30043b8a627b5237d89c12c75085c84e0ea96e1a1cbb7ec44eb9b45646763cbba2b01", + "6270ba0e3dbd54f697f440cb4ec22c6551332ec07bd8040f6367df6717470fdc3957791332a244d270046d164124c80472ebaa7978d339df19dfbdab5c109d1f01", + "25ccbc38150545974f3b9cc52ef96130246fa9a3f64e6069a762989f5f8e9d8f015bad4faf0100a6eb0078770cf32c2bd997dea56facb314c47b3cdd37cc3d4501", + "6cdb3de2d53293aca9bfd74c6621c82af5f6e7102ecc4d658189d28021371791728c859162fa51f8b1823ceb19aa3037090bf18ce50fa5cbc56e5abd728eed4500", + "8253acc32c056cc0f10941e21ff25b17b4e2ff4ada8716315852e6ce459ee3b82f45747d867ccf0188a6b3799990e72298c31670f8bde9fd788c986e1779899500", + "7ea062c2bba7b93d31073f90df27a26543b67f357992fdcfa8e3a7db368cb0f141629c1498f010f2af86f1805556ccd4758fb8fbcc28a043e8b2025066d6f8b101", + "2e1270c4031965205ba2b8a4b85bc1945c0eed13b758e02fd627f96d89758b9f2f9819f90dc9f19fbb7f27c8b91adebba02055f72cd7ee3a07481587481c975001", + "8806abc33816a9fc503bc6f560f399b4073e8c27a42ad3e78ccaa643943164f41f8f0d016f9f32b25fcd98259b8e6d9244cdace4e0a813ec78d7ca6d9a89de9401" + ] + }, + { + "address": "C8jt5AnTY8rbxTpbY8JwWkPXYfoAQ4fikt", + "bitcoin_address": "1BYbAgQnbQ8tcMXfqEC7W1ZwhhRLqefgzZ", + "secret": "6612959069c41c6ed02d7e1a2a868a241fabb65bf8361c0082c797a87eafe119", + "public": "03e0f8e7fb3d410563352dbc65fdc0a42dd4f6c3702440c63f249d76b96585bafb", + "signatures": [ + "03fbaf561b2dc8eb519fdf55b887286d29ec6685ab043adcaefd84a5525a4e406d62f5209001e0dd07a5865603d36f29575322b21575d26e5644bf19bdaf46bb00", + "a5af3b7b26b4a0ef7099775a9ab9155b9619595146e584e794f08ccef4f870ac74b1cca792622fc0932025cc88f44a2b436e1035a377aa2fe31c51ee76fdcc4901", + "28bd55dc280a0d32cfc09325ba0c10cf83b45148d3b8e5b6e71f518c731426ee670a71850ce30bffd3faff287a75f338000b5faf4d3ce8e3625dbce87b09774d00", + "61b4dfe751c918060ea390cfe695b5284fddb0e260ed4a8fbd3bd50d2de7dc49260094650012c89f5f0a93fd5a29a0aa0a23a34dbdc46b0837801e6a2b8f744600", + "6ff07926f05fb316a1eed1bc6157681063c8545aab1b05b37f6d328564659cf0621bdb4935fc4d5dacd751132a1513b2ee23acc7eb7cc395e8a27a83b26f7eaa01", + "45ba72c2a125e68610f5f453709f4cd08e3be050f053bdc9d1788e65b2da7b085d36fee291feff41430a429a87a4b9cd8d43ea005e3b9f4b099a0c2c997983e401", + "4ab3341c870bc25dc9441a6e920b11ebb47cfda4f4645e51cdcea6fa99aeb68c06b5a0e4b3b41da3ecdcc5fb162609cf1f71d49c0461cbce484fd11c0a8557b700", + "aa253e2de851ccf7d3a41096ce5c0029cb4ac90f4ebee3eeb4395a54ac50361d3d16cfa3e8b764dcd8756f8d890bd5adfc72a43347c9ca81b072dec40b75ea3901", + "ecc90584883a76a56b914f73fd1367329db16d547e692a64fc59ba4ea86e5bf93598d53f0236834c98c3751795030578ba249fcbc69da087dd632886611ab96b01", + "0b9462cbe619e461b8a72a52194d0599cd63d130f10e905a1ffe8af03aa1584311953db3006f00e7d7273036b0d9c5347c3c586a8b8eeae315dafe6f8bb2340901" + ] + }, + { + "address": "baYpCovQfbz8Q2A9q5zp2AR4Q6hhCBL5pM", + "bitcoin_address": "18KpHaQ1jtQRV3GFdY4VECfdNXLFfWRZKj", + "secret": "1ec466e5d354246ba0b60dd2de440908d7909fa5c2443b67ee2d5d151b94bc3c", + "public": "02edc9f522f60e60763359f6fa8d55760ba814552961fba4e3035c2b722a89c2fa", + "signatures": [ + "7de1174714dd3ae5dbe8e6799cacdcbd03ae68b0440b04adeb46bb1136f333e55bd410dccc8489b3d01c5e4073a956caf4388bb803cc8d0105f22a585237a0ae01", + "2864b63a0ea3bec590a1cd4be61a31e086cae999fb7c78955fa86696fb3ace04753e70d4f14c83cb20b05bb9a30528aaba1f6f5a952995343495a4fb6c05079300", + "703edaf07205c2cc3bcfd26cf1608d679458bf92861880d7856489c42c50d712460335658b68625f9083430f5338d6bf42d3ba0f144f5ab533679556df92000a01", + "d4be1600c0cb92e0b07ca0263cd57d6c909849fdbbe5178fa97d983a406839a94c8b964b06066c27d13613d6addf21e151c630bff8c38092ed00de017d1562de00", + "c842070d8c933f4fd86667ed96cae99037195a88d5033dc76b95969766ccd9ac41432953188335399e7b2224958aaf08c5262bdff78a65f9191b5fa13547915d00", + "0dffc1ef0f4b1d62b997965a884728c25702d6fce447df95a0549e4cedfafcfd056ab44346bde268b8cd848b4e61d3c0ab8939cc251a935336ebe599886bde9800", + "d59b89ada61d412d26eb7a1451ff13c1872d93250243b359a368a1dac24566b0617172f14b76091b80f49bf8b02a8beaf85a461a521f1a977bbcfca1ad81225801", + "af4db82905ab7d4038d17c6c511cff360af7140ac3a99e5f9c4165d197f45185443fd0090e7be38f3be83cb3bb6fd2ab7b5f913fbfbfa0fb8c676936e995499701", + "005009764d6b272d9049808915172c3e8e38060c6227ea8fae538bbd273cd815393c215b0c04dce8400084dc3d83de618f7bb3f2f98f30a3a930b1e3286ac50100", + "85281a5f09289a2625bd5f23012e98c16ab43596c0bec18b64f47e0c67265b8020132a12b3c9e32c95c7155122ef88da0143d629f4256beb6c77db4077c562ad01" + ] + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0005.golden b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0005.golden new file mode 100644 index 00000000..9aba370d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0005.golden @@ -0,0 +1,185 @@ +{ + "seed": "rg==", + "keys": [ + { + "address": "E1YWJLum4Zo67o4HvSHcGwgTRRS5jsbM1S", + "bitcoin_address": "1ML9qfdnZfVa8UcWmTds5PuRo9nYxJQMVq", + "secret": "28cc037e29023331566461ef67695ec84cfe2e3963b3284cd39ee3be4340cb3f", + "public": "039f1cade86afd2d1c2aab43bb91f346dce39aade4f1c4539b68b220b2deafd2db", + "signatures": [ + "582ed859fd7ac1047451c96dece2fce048a7a2769dbf7d6e26fd6d8665ca77d74de3e4fff87cc8eae6d2be699110bdd461ad3d2cd26a5f3b0a1ee57eadb8926e00", + "65147b6a8bf3b95a29d3717c77c0673e03abfb2e1a1d087686272130b3120d5425970e25ef2f2fee5c094c41d3a6a61314b73c1d505b53bce259904854da270f00", + "be54697842c0ddc05fbc4456ed2d25c52c8cb6a421d63b69c8a74717a70245a9574314b50a9da78ee7ae1456693887b662699ec495e0192d6df6acc1fad1c28701", + "93bd2264ae0770bc43304dbf03d841044b92a9a0e1bcaf02616c9fc27981efea59bc48fdecde42419d8504889f2142d1912f68c2526ea6bac7bde4cc6899818900", + "279c3f244cd708c0382585497edbb979542362842f431bbb2fb79c1e32c349b95c53b90d170f18aac97fd8cf5f7a44d3e3d4ce80d44bfdcc28fdf96404c04f2200", + "790bd0d363885beb9ff0fbc40c2731a09efe3239a5c1bef3770f20845e15456967dae17ebf7672c3520b3f2056f1c041723d8adf6035a79bfadfa3538952368900", + "f7bd0099fd178cb133e8d756dc78b4ba9f35f0eee557d5a6cae15adfd3b5274c7b41077a8b1d938d7864cef8654ec0154f6698735fbfdddabdc11baed63b180f00", + "29e7751f0cee32a72664925334dfe384347524b950776f19bb8f1f65a6e709a23f9f8970f3e3bf47536a99ed2926aa5a9275b75f3383b3d34baf662c03bfbc5f00", + "a4db1d71434b9eb07c3f75e9b6f4116a0ce972420c1873e588410fbb89dc31ac3d812e71cf4909386dd46824f6baa9c5c3b6b27a5bc7f9e5988c60fdd5ec506f01", + "fcd688f407736fcf408a7aaf27f1b2cedb72f4f9f6de248c1b1be600d1a79d8200aadeb8d330062861b4a93c948d1be588d062d02c36bae498d3d969c4194c9a01" + ] + }, + { + "address": "2TXZrhjdPPVWX3mropZdAJ7C9tfKA1H5btJ", + "bitcoin_address": "13WWScVVP7psFr9YnDhAx2ztyDd7S33ffk", + "secret": "3a6ac4318cb089dee2fe368495932155be25dc2cfb1994986cdd5a4eeb97951d", + "public": "025a9903b928ef2f66596d3fec381bd8ab02be4dd419d6147a2839f4883720c424", + "signatures": [ + "0d1ce484bdef0becc50ccd02245871e1bd28338313ce57f754c931edab9a822638f9dcc028b722e0738d5beda6ff9ebe71db9a1c432bc144608a58da7b5a73a700", + "d1c15c29c7d9cfa1312ce992120ea80ad20b79d46edd91815c4bed09f414d4244882d6fdc99d7416a35f2af2a148ebf2adcf66d35e6f2acf9fb61d23ed31714201", + "8b746e791bdb92becec684471b0463aa4191ea1735599b5c48850693f79a1b4e195d559735e0db727ba02ed790cf17d724f2c8085bbc755b3e165eb7afe52aee00", + "4b8fe3f64d924f290d451cb3b34ad3433cf0f5a1e63e2ebaeadd8c19507a8f5d558d012dd1a348a7143a995f1d6fc87d476379843271c1a3b217eb835d6c1a5401", + "06548a750b3a35ebc8408d251aeec0e2deed67e37f297120acf78391ba611ef625bd64a40e2521acc1110b9fe4fbb47b8130a70d10e7f16f8d15ebdcae50cb4501", + "75d7cfcaaa4e9f483d11087f4e1460991b96a47e3c13be1c7711dab7f9fa9cf577085bdcd8be8f852efae4cdb5ff32acbb7c62f944565e5fa2773760279efa6401", + "2ab8f885369a6671cd27ff2990a8c363a7c4a06b7f83db97421443241204a410170c37e10c8912aba3475ed773b80853dfe6d17ed7d3918191ccbaf84640a62c00", + "8590c0d45abb75fa18976c9e5c9f28aaf157a5d00611321d7ae86d1adc4ef87a560dd28f3dec5db3ab0156c19431a19d900267a36d88bee206e42c17e0586d0f00", + "c4dfa4c79fa9ebdd739a89fac870cb8d38aa52480e63c59f42aa0046dcbbea5c2fca4e64421852c8dd62ff7870ca24fe44b5513374560d4aa49f60921ac712fc01", + "8a3d9436b8230a13ad2c00173e819deb4117fc106064b044ab560c89d7f01a065d6533d1d2aad1565b22f1b69d005ece97de62c6e8c45da8f853f532ecefa24f01" + ] + }, + { + "address": "PTu4VmJMkpSZNPyReRoH8n5MG1o3gaicPs", + "bitcoin_address": "1FBNEZxpmkDa11jUDNW9qQReUAjbgtPXUk", + "secret": "a9e8dce4a111f6e752bdf29a5879c2c5f77ecd1c5f612df3e9edb8b251df803c", + "public": "026c915201c05aac2a8893115fe41615a49ed8d601bbee9867c53c7e3813f95088", + "signatures": [ + "c723e8e7ac59644eb1a9a59e6b8dc261104e7f89cad7e7e508be71a93a9ecea70c63a10f0d93eb5edfb23b0183e0a654dd042cf2420c6228818e819f8a63a4c000", + "50bf3cd499902e7350d89531941af889a0dd9bb0e0bdea2282313c99b291a6884080095a1eeb55f5a65ebbd209d889dc264bb7da5ddb7e13706a88dc532e3c5401", + "f4a9c141f072faf21151839182d55e841e48ce3d793e14ffc36088ffd76b1d650760bb36721ae64b2792cf2eed0afb0fe1d862d42ba9673348382ff3f1ca245f01", + "37a7ff5a750b8b77fe93cc01f71f4d4a324ac70fd5d1527d5ab41c1775f09087321f3da3198c38bbef0cbb886596804a22006c704f6592652aae8366a1784e9201", + "95fa2b244623e26c29ee4cf050c73cac85f1b49246790f34838d2922e4b3c90d28377d332cd9f9bf122afccc889a84930b5ec196b399c9550b1b83372ad7486e01", + "b391dc7753846b34c00091914219addb98d2c8f843d21c72c8f0b57c9292ee4642599181c94129464cbdd8704b93babe7cc0b76d281555536a93b6a17ccf042001", + "54325c4d401df59c618bc76f16c1684f3cc25aad328f5944d232a9f0a3170d8a393ec2c78c7389be320044f0770bb6c2f9b97a0c8df111425f7683753c783e7600", + "9479da56bd083cd4e8f53e492e651105659ac18682488ccf9019084d14c8fa9560873c07e85f5fc002e573ff7c5465b8167382652d088082ec8584f93db0d5d301", + "a4c4429e46ab80549c155fbf05fd7ff5d1adc497024cff628f751522ce429a825856c0c7f62a1dc92fd95d62bacecc002a6800d41ef6db5d8737dacb9d60e08601", + "fc82184adaf042736fd92e36fc42dc7e0b63125b6014916065bd3858402a4d891c8c206bc05f3a60ed6623b107ee34ea8bfb5182e5d75c33b8b5672ec5c536c100" + ] + }, + { + "address": "mkx9CqV8vnX8m6wgMiQbW8gLLnHh6vGz4N", + "bitcoin_address": "1P5u52Q7fYKEnCnyUV1fZDQts8uVdo34ns", + "secret": "ec677f802da9627a8c4a90d385ae68399bfbb69c15dea4cba08573cd81ac5a9a", + "public": "038797d2c1174dbb2e128e165c9d3814cbbebcce024c6fd459043f0dc661c7db24", + "signatures": [ + "273a38e3d7ba7ac27064fb70420911526994f497976c809803cbf933b95651f570c82ed60b0d5eee3e434754f525716ba85d1fb4f4b6ccd85680f12c178af1fe00", + "e4efd05ec215a0bccf810283ce8397f023cb79cf549e9b84cc9a879da14a1def127b603baf0756698db559d4ce57f12c84a90233eb952857e3864236bfe413f900", + "cd7bdb06aa7c5fe19a365ed29c120edc4936443b074437e048a174525fc8a49678e6e5d34355d771835c176f281341eb621d1c9912db8d04d51ef9e8289b3c6301", + "186363b97aa04417a725771ab2f53219f75bbedcca84a7720c542bcf1b7a7bac1d195cad9b52b23efc8278e0035856d1c405220164b29189ed094dec7618656600", + "c6eec9029162fad395aca44947e6cda7517f10835e5ca801462fe7a868086eef3cf8d712bdda3f4aae38b288c09a3851cf6d8f418721886a0a8e87e9fab6bf2200", + "aefb39fc91f106de7f7349b53ce3e8efa97986ce3503e8ab527af820aaae04a053cf336698cebec7d306cf5c52618ff77aca763ae5393ce8d5f45a580ef9ad8a00", + "7f2ace494c7b7ddc380da34d60ef4152f1cdf8bdfe082603d86a9d52a543e66253635ec64531f6b09d5a546549300d0df2ded35ec25e84f7b0a961f8b392423500", + "1fc025543feb8990d415283e946d3d42593e3f4259ad36de79d3211640b61c2607da58688dc13734c15beb10018238aa22cea4460deb1c0a95626699c0b58f8201", + "a08ecaa36a67fffac7189c82a72ef65a419f8ac513cf87e7d1e2780c25da17e72d21e72755f88d6fad7f5c9b21fcb5d9ff3e1cc0796d46b978e0023663fed85d00", + "58733846895c696b0dc113a50751747fdb0dcf32b43171acc591013c2c6fbd7239f707a1c5820a8b922544d2cbd3f49bdcbba5e7bf28db69035bf30b202da4b601" + ] + }, + { + "address": "ufRofY1rDAa2QQojenfxsM4X6ibkqCeEb6", + "bitcoin_address": "12wjNx51QuZhedTPmHutbtvpkGZCSfabcn", + "secret": "661e38c38e3a9a5463be99e2e57d9dd6efd5569545cc0d4eda18be36911408e4", + "public": "025b6f563fdaf60aef899c7ea420397602b1b3ff23ff7a36230cfe55fd88368b8b", + "signatures": [ + "fc478aaf82572939f34775beba8665c9fe1366969dbe69dffc17824447f45192506556092180d7f76d3a317902e33a9706fce4d9dd41cfbc29794e31d00d123501", + "53bf45832787f16e51cb6bb8468a790cd494a3719b4430b84d1d4050a487d7ce347fc6e1cc810583b681447bbbbe0c9b2a98b12552417a4c687ce4de59de5e8400", + "fce73f2e0970d1d02338d808609010351a2c3cfa41f63e7e632b32741978f598158096d5dcc54584b05e288b3522db48d01e6295a1a64750d8c971e734d0597200", + "c44114e4381adc869165fc09554859f1f920e8cb25abbd10bda4f20c34fce4665b4403b43ab653f14354ca43e1cdc78e669b5448e4b9db5424704253141b62c500", + "80f551c54136d983cccb8e656eeba08874318b0fbb1239d2d0306d49a262591e7c44cfba78775ea5153b2bea5e6c108398b17c20fd8e401929c5e36aaa3b692801", + "4c978f3ffb2986d0251e54672cc393e1bbfed047083fd3ada43544bb2beb3f9b14f79550b5251431a4993ade176063589dc0df26ff16355b65b5ad6e06d9892100", + "460dc20c24368bc2793c15df634b3da1ecf55ce3d86507514a03d9b945663cf00887da944dc845fb1ef423e7ab51fe556b7391d697e6a69400e1e676f1ac24fe00", + "c90f01c37871140f69d90b2c5338ee058b0baacf05277bd5d1945fe465cbe0670133edf40c746ac174a5926b102dea63cde0e283e7d7d6b7cbb1faed0f5ffbe101", + "1ead603fecd7f7860eaed98169f33f479e45ca8ee2aa8bd220e9e602123435c84581a5f8603b2a9d16fd5811a3e6ade670fdc5114d7300bb1e12990c5c9eef4000", + "6731612a2c6b5ec693f8c710c9633840f321e572ae0a2a0e641193bd1fa543f55acf916bc16438ab756b365cefa68d749569fc49bd75a993cf193ab3036ea9b900" + ] + }, + { + "address": "jhRanaAD1Ta8fVFa6jR7u8sMtnABK8i6Fa", + "bitcoin_address": "1KaTpAZt4WWKQ33N1gvEbRNrjVZnLeE3DZ", + "secret": "1d3da4928ba90d5bf443fd7fb56a6ebfc2a01fcc30ee33eaf8465d82b683850b", + "public": "03f3cfdd8ef2bf64c313f2feb8e9a0124bcd5d633134fd8eed177f46e957a77e96", + "signatures": [ + "813cc034cb0a590d2b264178509c874a27978e1590b39536319fba150cf16727759965f1c02ec72d01d2c76b403753460cb569739a2b4193f94184508c5733ad01", + "eb31c1e18718ea401dd5b1bbeda01886a4c40272c8f6d0d56a5ecde09df3085d513be8293fb7e47d37de19849a756ee6fc7ac73f3a8a215b2096c5f7662cf2ba01", + "a8850cdf7936d3f8339029efa5bea9c9422719c52fd31386044c0f7ab8a628622b118d80df8a5972a5e0736de5a2ddb9684fdb8d620f7a68dd72e4a09c10bc7601", + "9d6c8ca1145714afed5a3b6e2ee995375ab6262cccf0d24f22cd7067a4350ed0751dd15bbe7ebac345a4d56d75a3c850f229d3aae44dfb7916c39e07f252d37900", + "84eb2b5c4d183334cfe54dc7601217f81672985a6f2504440ea867cea0eb8446193a6f82d38a1bf7a32c3d8f2bbd3afb57767837986537a1d9b7dfd05e4552e601", + "afb88d11917ae3cc498bf982efa0e5afb1c2d23eccd20dd5494766e763673dfb664aff38e6f6482deb6cb05f38439355ca3ffa395af381cafb8353a105cd321500", + "a4f772b50f0e7ad5bfac148f58bad6bf83a98954d04d51608a9a218b9adc1e5417fb5ca3210a3f04d0dfa2ab09e44f6b667a51f6f005e8366d83032e219706bb01", + "21bcb3564cafda1143937042447b79a89bf128d881a88099654a12c5ebc05f4b6b477da247639e2080f1e0a0c0c5cd5180f902735e634026235c2f3e1a9407db01", + "18259cab8828b0a8b4fdf6b116ea053a82e1ddb71ac3b8868d8f14b4ed3b8d290dbad8a67f9ebe626ecc213db20e3fd90ebda5edb995682be0afa8f35690bebd00", + "41d91535c7fd4a9d7835149d3eec0c72b90a6d1b73a92dc91c35af16f2d35c107bf9e4c2123e09921439e161891becc5a2be9c5ddbc8b1795cc6804ed3eab34901" + ] + }, + { + "address": "77W85kDVi2ygMY6EjQffPtZQ2A5K1kJeTp", + "bitcoin_address": "1GCs6JcqPYoZ8m4qNVQHKHboPbUaRjEvKz", + "secret": "450e7d29bdee2f8a2e15ae2730152483498dd0b31dfc693ec7e4fbc6eac502fc", + "public": "024e94e6e275c8a3c6e409c91b071b70c0c1ca2ddfbfd3d08cc76c1a98ea719eec", + "signatures": [ + "647bbd3dd48454ed1ca0075cc15a39a2be0c91842dfaa57907eabaf9ca6d561219e69cdd04804ac2b83508b779a2acb71cd3bae1f6e9e8352a8b1d9240fe9dc700", + "04e7cf21fbddb4b196ddda4b75bbc92e82f7ec92fae5c824da045e352845b4a127f84d07069132fc1530b425fc64791d556733422ecf6a571425f622b58cdd1f00", + "90545da6f9a0e89c703bea93df3ce2ca7c8cb05d137659a2a3407707164913f928712322ee2067b26ebff4cf052f811e630936f0ce21affcdc7d99f21e25fbe800", + "21ed7cee0e1df586105273b54228c54a21e7621fd97592d6ba5501e2a277ef7b03282b2109dc87c2770d28c3c9b381ad82c7c79b619322a1f797b5c95d95a9ea00", + "0f4fcd6374b0b9aa05a3a702e41afea1173bac9077f8b5d037395097ac5482931775f134d59c55f546ff33211bb1ca83911c1901f2e4aa44358d3e2df97a558000", + "4b3f21d76694fe2f03012f2f4cb506e128f610ea3e8738ac94f22523bf5e1f4830e712d3902342ae2779c49cb8ab05de744540443f69900f1904f5b2e5a767b901", + "e1a91763cc1105ea763e67b9cd1c25f74d41b39f400df22003d779f2c91e4ee20ef444a3c454f8eedfc6b127c8961be3e6b25a75db3ad49451774606d35bfb2c00", + "395b880f1c233c3c12c0a7d9ce08c5e95e35873e7b5659f8a1472f9a197f59d8345bf678724bdc2f83138cff4c3ccc5de81bb074efeeb2105a4aa28e66825e6e00", + "0ea0f9b45f425ea224675d88e24c092e369a2d2a969ac0bc959d4d7b1418c10223aab768d397b7a71967e27e3eef91494260b43a9da4460ed5f973220221c6cd01", + "4142a63fc2be7e70c9da1501360b84662bd02eda9dc2d7d5e6c6217d075d1d683faa45cea9069cc8fff98348c7f2f31ea30ef5da710f27a9203d13a41b89c00601" + ] + }, + { + "address": "2fDFwpM7P6tK3krFcrhaYY2x93B7D86dCnq", + "bitcoin_address": "1KxE7DPgoZMWSgFQth4J6jEhSmrf919Mxe", + "secret": "189bd3947f4682e4bbdff3195eb88cc75c023248242fc1a2d3e37d707551e593", + "public": "02ba296ae39678461dc7a1963624b71f8038d6f74785f01d8e884c72f228cf7e88", + "signatures": [ + "89fe07b2f3da7f6e1c5de1dc60111033b8976a7e79e7fcf062c0c8ab3d7e9ea0206e68b8b01170fb5d7f491142725573625b3a006df68af15836496f00013b1900", + "62923dcc288cf2e7a118e44a4e087d13c86cc63f1f5157f0199ae98a900eb81d20702990fb9804c7d3ee668ddb80ed1cb36855ce479b54f0971ef7300373e72d01", + "59479f47a39299809c24b8e206f129d204597f2bfb416bbfbd4b8608a1d89fe33d3c1ccc4ac469393b12ef514f5c82d2e2ca780187ba1ab1e376f164649cf62501", + "d3fd138264c4b63d19341ba742456ff50b63bfb62bd7b2d70f18901a1d1478b73f03e45328e587d0f11c16c3dbd43c1ddab6c4ad989975e47093a4362287313200", + "397e578ba4e262ac884394d924650ea6b5065c72ea0ad1e917ba256875afca776055d0cfb36f4720d76f7b276da462fcd09e2f3ff791827660cd3ac139d1deb801", + "9fa423cad02fb69b578d38a059bcbe142ff273a91a042f61da0f73b72c80f8e24ed3a7cd1c8986af7de8ca603b2fd09812d14c098556fcb3879be8fd65fde9a501", + "a35ad7955b416e9db5f0070fcfcd601084ea72d313f1f5f20fe7ddda8f4e8cb0608d0a524ec33c0c7c7b9e22942cc26c13f1b5d986695ad9611aa38490dcd2d900", + "ea661e1459ead9509b69621676e1bc53ab2844c189df802caba4894d22daf93b1711c6ed4095ecf989794c5ff7f6af97f2cdb200fc4185b657a986b75910c90500", + "16064c60d7077e55795adc7c0f34ab0fdaffdedb7a128e99c0af9f1365463ffe62c8e537e4f591b0dcd3a26393f04eaa0651a9fd4f3d9152da2cc96e3b0590af01", + "98ecc21e4cc24e917150352ff2cd1df43a18fd7c81934ab5826763d300848962261ba895d13a8b5d102c1b4897cefcc5ae3bb777dfd882dbcc3a0437b1a7d9d301" + ] + }, + { + "address": "Ly5LPYccXjDtx3EA1Amb6kwZe4xL2HTCJT", + "bitcoin_address": "1cwEbutdfQrEJ8yvFA6VcumVYARuKwXf6", + "secret": "2a00b256c613cf7de4acb7b47efb7b5be2cc328012717f3d585e6eea02df6f53", + "public": "03713f5421167dd1b76aeccb351d4bcf4086edc9c9be95d4f9efc4b27bb41c93b9", + "signatures": [ + "e8b8246e1dd328a7fd59d5e5023ae736d14f03f55c71a1e164642f0abd2d46975c27ae7b4ba1cd0acb39cf55fb24e7c6146011e3bb4fa7d425693b0ee8a3fd2901", + "c92fff56058c70c86863c7b703cf245a73ef615f4985c9951b2647be5c4b543f0c840ef819c7bf0583a11627785ab310a21338597fbc8900aa2f0b21fe81f90701", + "4f319b9e8697570ca0acae7423498da1aae0b53497f5feb3752279c7416498eb4b8a0b61f9be697dbe59bf9071c4c507fc0d6f59cfa29003aba8789a2caf5cde01", + "6ca0e05d533fffd7a3514c8d0cf7be303cb901dd19171a07b9dedccdcee28c830231e465c24d2f728dc88e9d9a742923b237f69132fdd45d282bad446e60750501", + "e8a4f6ce818a4a66e9fec715a01d4412d6bc8ec64199764f6864cd1004a6a54919897cc7403ef9106a5dfc76c16d56fbfcfe6f72f762726715148a09322bd5eb01", + "f236ab0ccb778d2cb2f3b1c94ed6e2aca5c2dee17a0fbb5bd560cc463e4fc8602e60c1dba5efab13f452a6b205cc231cf65bd015183855ea00d457a5fa0bd34201", + "d0114bad79c8173035bbbb330ce157fc1c1cee17de0801ac594d2b86931f42c54cb01efe70cc49bbcbffd85f363821efda30357e819d9a71e64f092b53f18cf500", + "6830f56c0c6db89cebe1672b1ad58ab4691e72c8e7ab44430cea79f1df58924504154d1f6109526f57d53f89186c4c631755123274d53365de0fc8c74ea2ff1e00", + "c580993fc7bf98f4d75d64119ae5e3472d2108add0a3ac427470b253433d9f8d36ab1e2e2e60cda7b7701ba0a78387df04ee3679a5fe0011306d8ee29ebd102100", + "a90ad4f18a5292bbf30e6b6a9e8143573524823d3e6b0a066ed78b3e9f30be6c0285e6554e6e9a1c24a01809dc7e0d439fdb57ac054259ec10895a52a5c2873400" + ] + }, + { + "address": "fVskJWYkJekapAcR3QQvBsegn63BkRCsE", + "bitcoin_address": "1Er2JKisz7jZ4WUS2AzoiEnciKRo92rGMF", + "secret": "115c197195ed609ebb91e4d81a5fa57f0819ce9e08774a330db4fa52d97417da", + "public": "024a4807e5f3c20b777705cee1a58905355232210e84b72c74e25cffd9fcb110ed", + "signatures": [ + "f210a289f3cf7dea3476400432a8a64e7b2c62a3b12e8f3fd9c8c22d4928e5c607894263fcbd23e0538dae2deb979b555d11539034b8ff31f99fc7f51d69a30100", + "f463eb2677fa97af9666a103e110010484197271ef4e710dd792b8fe0964c9b8307c9c40fdf5633d278f3ad3fc1f00b10c42310d11135158851b6b19edbccab901", + "14e222fff75aa114b3145022a34eadc6abb64e69e7f1b905430c38b7e4e4af294c720a884a9c16f44c8386cb91cd53b2af334da27177fb4f1d282ebfeeb80aa401", + "9df1ad76f388829b069d4474c4ecf0d8bf7de01a31e287b10fcc883c4fa714441490fb088d0586402cfdda4202e4f648ef9257be506daadb9803ddb84545eed200", + "9c83abbf506869f684bdec893a5d5d1291929c6b66e9fd35ebe655e1528f2b0d63563a380785345aab85e375132b7257b6b26a066b6a20c9c8ec58adea33122001", + "80b6477e48dbb5ea75eab67eb887fce8229ba9352fdf1175f6e502301be5ff0e370504d8ccf447dc76e58ebf0a8effcd3604b5f3935fefb78e6230fb1aa3df9a00", + "2bb168b7613b165187391ea14889863d43a8d967e63edee1fae608d2cfb7a7ff4939a76a1571e67481065c4e56a72d2bdd55877c474fd62dfaffcc6926a360bb00", + "eff83a7caddce6009dd76d07a5a9a09478e3300dacb39c4aca637d653ec4cdfb380bf7e83aa27fdc632467b4a64834055012601d05306ef3aa7cecc86f50ddd000", + "6f87163870bd241190f9bca7d3df36901d8139892f21a6db2575cc5b7f1cc55a21d85e68bc73fac1e2d29fe01d51fbd55741e7a727ced4947c8d6712f64dcf5801", + "7ecaa15895a85a13a2f8faeaca642e4439187f1899fadc7f954624764b29b64e0e617808ff959e0a584284f65931807817d3ae23255ee8cce74a8b65412507bb00" + ] + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0006.golden b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0006.golden new file mode 100644 index 00000000..28bcc8ec --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0006.golden @@ -0,0 +1,185 @@ +{ + "seed": "5MnQdu6vWeP9NddFiehxsGwspc8aff/Fuzs5W3c6L1I=", + "keys": [ + { + "address": "rLjV76Fayt9WU5rk19FnzWeZEbF8nWqGHH", + "bitcoin_address": "1GL7YXV85q9GDmGXThGx5bYhy26S6H5LhU", + "secret": "953b69e03457e239449ef051aee7a5fd9ad4f832bc60e8915e0f07b52598206b", + "public": "0296d12f5627840862172af9aa4a22574c427e60bfccdeef22e675b137b439b92b", + "signatures": [ + "4c9836174cf0204d88ec36d6cebf72aaabd1c5085ebba250e12e5fa21e629a9e78d71b3a0faced4cfdf037110b452acca16e2efae3a16efaa84c5132951139f600", + "e27307fdd00c852a4d209fa94502e580d7aa33c64cdf811c743c394430f1b2d361a1108937a57fe35ceba04b96498421f8210fe32cfe1223601565b918e70e9c01", + "d29f5c767b865f6311218d23cccf4dbc728a4cb4a148c7863a4475e4aae268af27e38557216a8290ba01fe1047b7400c6743388f75d999af176e3bbc1957ac2000", + "30d45245cc67ae3ca1bc840d90e3535ede9ce5008796a2c90250f7de86500da86f17b19a343ef2051d3526fd33a5894927b09234b86f58f469a3f1d018094dc401", + "826d791c834ed696f9f961f0a7f971716c66efe58a6ccce16e4b3cf834fc49d95051cc8bea2cf183a1d05b04ba9ed407648329f51224781a27bc01fc1fe75d2101", + "b0fbf1f4e21d32b4f3a6398da88e8d4dec7f20eddc4938d7fc493997254245fe257ab78edf9412fe3cc1d773e3c28b41669504baed686320abdd0edf21f2259d01", + "7515f2946fc8e43199818bb95926934d6a5be0722782ad44fbc67489019564094f378b3c57d1b11bcfe14bf2c0eae08aa9b9186f7b1c072a03ecc03ba416f33801", + "870ce446e34720816170da99f49a843537ff6cf299d7562af82fd9025deafb0b315529625a47049408d081da2b3429f555c74d7657917b8f7ba8fe0fefe0cd0f01", + "94fe3ce87ddc7f386fa597df17d53d9aa33d01a8aa2ab37a18a40128541af8874e1e05cbb6429f40710d945ae493aa033387696884788dd9ef9322030f1c246300", + "1700b3a08d9733e486dbbd26f67b48add3b43d72a952930c786ab44e5f31866f14d20319a6b1a72bdbb091d89ef7bd55ce9078c8c86aa2f0bc30e75f13b8142201" + ] + }, + { + "address": "2d94nXraZtkPD2GiSCfzugewm9cRbCVDNnm", + "bitcoin_address": "18n9xYGZhqQ7bjgSgf54KvGWVt8bjgujac", + "secret": "4f8db9121a8fb6bdbc8de701593e953b6022431d9045b914e58c0fbf109cf1cb", + "public": "029cc260c200b5893e55faa5f23baf6268e0f20e77ee1b524b37f6e1e6ca9a1814", + "signatures": [ + "96cc1e166e56335bc6f859557ef73c2b7a96e3cbca0f32d901052fa55023a88732b40ce4e45ee236ffc07e0c4d2db6c294cc7f1d3a2f39d5e6e0f11da3c2259b00", + "7478758d8006ecb8103311c394931722a03f3bcdddeada8afd37b9d93b39d67033833444097d3d979bd9913526300f6491107be0d31acad6c28591d8529e24cc01", + "db8a4f5dd1d5cd811cd08f4ac1c4effb55ee93498f7d5f4d1531c315f047ffba605861a92e5d5358a87e7763ac223c6edc2489c9a08ebdbd3d37e7728ade58f300", + "7dd0865d18a574266d0dd3b173e03c2e8cf92ae77af99a8f68b9c7db2837326c769c69968837647d5b763a13f1caa9cef07804cbd814140d66607b0d151014c900", + "7f97f9fa0d45f1eda3e985b3e64b4656ef38480644c355b644e01dd772aa7c374db2e37f819d008d2da57d564fce1c0544e17206f3200dd12161777428c383c401", + "7a1aa12c91e34842ab1b8cdfc3e4d46d2f1a8af0267ff74aeb24a942d78fcd544438341e30c91c161689491514bb1d19e6881758007b25f0e6a87be044ea8c3d00", + "b823e93c1fa6e3391910ca4e461c58e51118e76470dc88506f183f6661f8ff0f03e4e4f1c58c06ff40446dccc0b9a9bb65b7793589e8402860f0d60f368659ca00", + "36751c77d88427b43ef8b68f15a2cdb48225a98e506d40fbb09f442cd513621615fb62d138933d7b88812f054be3c21ce1a626162abcc705bd45d4299c5ed15800", + "0932a2f7eedb5f7b9fc67602c1379254682892da2af0b5b8ac06d417b5136b756b96c281c4ab3735b9e3f8195747128b4cb46a704702b42d54c99e2b79ea98db00", + "9a7b5f8c7a78eaae1fc9c6ec63372297748a3e977a3b06919ececd3859e0ff5973c2fe2effedc1b01888f87d1ebfeb7b96dfb5dd6a9c96f804dfe56e9504c0dd01" + ] + }, + { + "address": "gVpAMGVd271pzHcNZiMzU7FDNqUiP78BwT", + "bitcoin_address": "1KhP54Cd5pfE492oqWxKxNxiJ7FEinv6hU", + "secret": "1a59b0065001a05a93d72d5939fddb148c5cfb775a0e2a27a99c6d54372939ca", + "public": "036de1827a8524f166854bc7b85510d17ebe0369fe828d8f8c40e930569dce118d", + "signatures": [ + "0dd770f09abc025ea1f3bc25b8910f85ddc5bd2adbfde66d247607a069405bb10cc60ee15cf03524dd5c15365214401b0d911110ac2ec6d530850c097bd543cd00", + "69b432114a086fb15dc22d85340d605bb73e81dcc48b2d3ac776fc84686e19304850f09c69d54dae0b30704a7693a33956303c5118cde508295927599e13cc6501", + "0f43fcde4a728d8c8a354aaaf12bf7585f52cbef863d99c63c9a0308ea53a5a32af018116c1669667ac5a62acadc0ef198dbac3d72821ea300b5459de615b91e00", + "af29eb64035e6e7282927df51f1506e5b0d12db63fdd567a23bd386e086d1559770b918ae23d51a73cf6059c8475f611c786b81c6b15233a2b707cdffa71af6600", + "7ee7e341312c1c2fbc6179f325a58cb592b740353431679e178213cdfd0cc0726247a34b9379559fa091eaf45e5b4e39e7687eb83729f409c6cdba842bba197601", + "18aa13d884feab6eb0d57fc85500cc714a49b45ca1529f4cc6eb5c6521e0126c027679f19d06d629789480342209ffcec217e0620d632cfb82afdae61c53c14500", + "3256f3bae51169f46403562616cf71988324e86bfdb7e7c24f431fbd4451ed29302dd9762a2a296f9cbb58dc757c2d0757fce4601977547c6a54a30dfe56c9f000", + "3214ce760c0f3dfc8463c85b4c5bf1c81759c3d45e85d8d061af54bae927ebb3297b7e30e9a24341b1a620d81a8cdc7e5bcaca4bae94e910a8dd4111bac8956601", + "bbbac8d56a6c385825c5549fe5efd900331864550d4c56f9930c3eae8e1f34ef7d6fb9c51f731aa4d501b224f37ce6ac73141f2bbfdcb881379d4d019761c59b01", + "f3fb7ea9622f83cba22743363780060afd9c6e5a46971636edccb41c90332caf6340aaf635bea94085b8cefe0533536bcc0076ab305bf0ca30dedf9e8d9ba35e01" + ] + }, + { + "address": "2TpmTjZqMDwwnmMum5CqDZjyjekoQxctUaZ", + "bitcoin_address": "15PpWQEfVTcRdygX68G2KJAyXASydjS7Ch", + "secret": "df84bb1a455c464ebb1da23257ce7e2998d6a2f92e2864a9e9adddd3f017d784", + "public": "03a9aa938ee9aec021db0717c0737973e68a39b4d0a2b0c168135a98a1a7c64dbe", + "signatures": [ + "2c64c71319bb1650d862f7d7d981947866d3249dd88f18e7955cec62343e6b5d68fa07470cf84d29731989f2c7b5132de1197cc54af7c13b0ac93b09c3779f0801", + "0023899b5ec712d998eed46bdba397be815fe1d0bf17dd1fed798a7d6cebd90e15ef600c2ef755cbfaea7705cf8f9c151b59c652775dcb8a1bf193a0f157844100", + "f291b5461df348d6b63e956b8ceff056c85dc80062fb4109f8ad4b7c92e64b5a3be753846525a0929e10223e6b50d6ab3705f259d515a4e861172171ab40bc4e00", + "3338f44cfaa47203cc6b7f40608a4a7391e3116244e7e3c2926d895bbd42d6841954685b36f65007fd768dd99b54f398de79d57355e5fd1d70f88ad83e27153000", + "a6fa07fdf20f918b7e834c258c759b8c8c701d990e879cbf3031935afc21ef882ef1e5802e4a6203a4e8be329f629185031948f46362ab8b9798990f10ded16c00", + "147ad65314e28af6c3153d74e278777184d4da1daf328f90da98f1f2049254a843d780f7ff795bc5e64960555355ea600897dcc6aeff4ad9e20b98d37702386800", + "8b6a680ec0484a272a0bfe3a22e3d2e764b78e71f0f616ca678d350b46aa8ff90d8d4c1281dea8ed555f90ca721da4960268e3376d752c772c2bf1114fb9b80900", + "a978234a0f34f7acda0716902b32a13738532ffe1f80b7f2194f5f595cc5f0f4083163aa767d6d84d40a0ec8f2ba9cd7a29e7778aadc15387201b6d3418d391500", + "5e4a552f73c260759372db4b6ab76dceab031ee738aae499b0495b214e7664a50fc03a74d2fe5c04e77edba12149b37beff9d4b247d3cacefc09696f7f67e2a801", + "838b75641e209dc77a8b72e7ae3ff0cd00df644abf5889949ccbabce2bccb3e563525b3bfed5ef54785432b87206342ead57e1b404235bc96b32980a570b25e100" + ] + }, + { + "address": "2fznUrLmmNj3vrq6kqhYTPdEcxsPF3gd2Bc", + "bitcoin_address": "1EgxcUiXQiP467VJqtHTh7MapbESARYUBm", + "secret": "49db3eb8a8973862917e151d92ad0d159a5a11de20ca3fe299f2fc4ec71a9161", + "public": "03b0f175d8daf4d0b353cd28a6d454a39cedfe58d4d9447b47bf19cdcdc985b2c8", + "signatures": [ + "ca098ae575f90a7cb8a33024977b5511b54be8207ee45e607d0a1b2b01df75053eb358c3d1afc7cd6a14d127f37217def7d617fae164ed865fbb6edcd519bd1d00", + "3a57e71e97f360e0760586b567d9a9cd54aa578348c5ccc5b8105aab532ba4396ff942cfee75b255b39a60bdf8dfdd86218301a233b113da1110de51502f8a1500", + "67b95edd21d74b9348e2f1a9b04459edb63a1f6025f967f3e9bf237b01bc1dff426287145206d285984881a76d353416b0a09092f020389a26dc6ed2083a479101", + "929c014bbc57f925525698c7d382d98b7997a46bd8ef5d6cb195fea87a7c45575c55a8e9d9578f0847fad452b39a32e25968d546cd90bc9ce4adb0d9f9d82fa200", + "763f05ac9198194298c92246ac056bf1b9f92c808260aca82fa976b803d11c8d1e2afaa965baa5ecf38d656e3ca3c2035ba18518765a7aac0bb6d9106fef6fbb00", + "3abe07f94713ca02e09662cc1127822cb7c8a2fd68ecfe859777dc818c67e94331366941b9e3131d3f8173a504982f043d985e00de6291bc48fd2e7a362f9ee601", + "5f2062b454a14402f952b1f82e275c9e94d5a803302b7d960aa8fe739157b7dc6ebc1f8b284e2a1f7b94b7622a1cbd6928a8596cd843f93cb829b919f9d1e50600", + "61803922611692eb0f4776862841583e6e31844c71f12af2e6eb1316350017f731a6be87b0dee2ed0e32ad98f72e1e86ad50a481a2b153226b532e3473020ec201", + "c08e615dc8e024d42e22553de77971c3eb19de95e178528be685c2c9fe3f64aa59541a40158a3ced9a4aa974b0fad13e57d9bc6fe182c78b5a3a9f37dbcace5a01", + "fdef54961fc0756322e658a993f3cc4e982b770483ee763fc40bfff7b37943c771e7a4f44b4bd48dee2c0a722f184f0c8faa22173c3b2f1da0a3d3ac2965f3f901" + ] + }, + { + "address": "2gQbpB4v3yXRyF6oorigjnUUQaNzM8KuQtD", + "bitcoin_address": "1HMtJ331rLQR2FhxydXRViun2tQxB7GWL1", + "secret": "60961b0cb2ff7ec60965404fed8b5dbf29edbec06bb8325b03957ea5cc191970", + "public": "02c4534d31801b121ff729abc6873ac9ce3fca7f8f87f4b4aa001a9990845bed33", + "signatures": [ + "8502a96792de276b98893482baea1d2d1b1cfd7aa6e028662400f3f59212b034270f86e8f98a38a8b3bc0452afe3c51730fe321833d97a6f2af0a75f239a565901", + "f80fbe0a4126504ea331b1eda8c0ba9c33ae9bbe43b80a109a7d4e2dc102a5be7aed8abf4ea85dfc6378f7a090317df37a2bcad54ca4982871aeb0fce5b497a001", + "e8e4ce06507f1aa72def1b965fe4a2eecbf5f3cc9533138be8db41e78768ac8445db94f136d8b373a21f5991679091914c849736fdf842d35e4ce9b66d38ce9e00", + "9d1a1454348343036699d8be3be97912e4b29428e3642344557e24f0ce7be7537e150b9895636e28947b4ee1a42ca037c392fbb9fcc419ce5f250718684d71cb01", + "60fd7de5912ab8b581be9d6c396c838ecdb497c706c38f45a6a2b730b8d1e5ac2562ece612d9debf93f453ae45136d131d08a53e6a1d393914571d1c551b1f2e01", + "ef9f454083f9a2550115585dcf1d45e3c3cafa1460b0730ceb1dae89ad07d07e67499e3ea50ab5798c16923325b7d33b70456425d124d0a7be86ed2efbd4133b00", + "6f8231bf2769af9d12d011798307d7faf9580135df840576dc57addb0d66eec33c343646d92bb2297a8d1085d953be6f96697c88e2f978f4033b7bf4ddafe73400", + "8667448f5154ef26d1e65a6d29f04c2a510fb97d7de90949b3f47a3aede8694d1fbabc3c16f64b698d1fdc2d986bd5e8df0ebe09ecab5399cfbab39a8ac80b9e01", + "4f964bb6101b0126e44e1e71abdb414e937b7668ee97074a69b628c15ac78d524fd45f39a1be141ead32df77a8ad0a62cfb6c05d5eafdf69d6c80932219c856a01", + "660763690925139272e41c09c27885b1c5d8aae87bbe2c02fd83d57f9db9c57a69aa933da8a4a37cb56dcaea20c0f742cfb00294dec4a6c66ce7dddb5669d9f101" + ] + }, + { + "address": "2FmtRamAEN3Eiw2eqroJt3nhHzgo9VxTvPK", + "bitcoin_address": "1KyXLZQK4Rg4UBsuJJqrgFFo3VwqNxAZhf", + "secret": "5127d7f0c06d335e1584ddcbf4534c8a5be109ec2e28a2f40aa5491427b7452c", + "public": "03103745843f93a49c945f4fbc0bf4ff479101c22a3ece11220cafa109280b494f", + "signatures": [ + "6f9e4d1d02cca690bf0e2ed204e32b11357588a77f8605280bcb92f148cb4003166a5aef470d4e3170e68f6be369e4444b8b04290ed5a0d564e6e5f86cda0b8701", + "7e5649e2e83de29a9058fa138d253133c7bb8d0594c3cb546ade2a026796050013926bfd1a8a7bc7f92875e2275224037932568b60dfc7bc2ae2ebc6a1b0f82501", + "b5d0be26eff1bcc5ae0d03a115baa82d52cb33c13833351362cfa2bf4c2db3075f7035d08b3ae0f850c63b87358e1bfe557678bbcc7226097c9e45310f9a5e6b00", + "74352b57c8344b32c37420f636892e592842c5e1794d2bf0369d4f4dbb005406152b7725f68726df8274246e7923b2aac6e43314569cd54863158d0f9ffdcd2500", + "366cefeba68f76d1ef460ac310d0654ba8434ea30e79b445cd7481b1356482d107a7148c2495b0d143d800024cde9364aecea0d1457a8fed1a2c1de326c2777701", + "2d0a2fa37cc5e3cb4a882d0632fe2204cc26c4340a13376e7b0805264a77a32313ae46ced96592e9a25a7773b7cdb38ed0a6ed4db445c079b5cadee8202d29b900", + "ec35429af03b64053d09c0e7e1413331e261ec2652c9a5ab268fc48c8a7449d13b4f707aaa5edc48fd78feb5018fb000f53521ed9167841b618a9a27a153567500", + "d8f999ae5e660966147c9faa1acb503ad6750ba1f5fbc14fd1806eaf6667bc3636cb000d5e02f68963b7e6af546d21d0c0f4c97eb13411a03da3870c73a685d801", + "f49df2eb22d660fad6d4f529b0c645023d4c9b37822bc728bb80a28ce5cb2898618f080208f48643efd045c130025f9f3223c568a5a2505a8b2747880af730b201", + "17d9223864ee1764545b1bd74330f3d692052f42b73ae530712ce7b3a02e0336316736ae1e054e80da778e173f9cc6e93bd865e208b41ddd6bb7b8231d0af4e700" + ] + }, + { + "address": "k46MSCkDYk6ZaHcj2ytwZamLRr5w4QUEwe", + "bitcoin_address": "1MD7YdmaLZ2Q2Xccy7XBsdS1ouo8tKkiWj", + "secret": "2b1ba25cdecc2b0c4b7938c220615929abca0d1df1d673604f8b370f145467fe", + "public": "02771a319f31f4d999adb58b1df0042a525e539d6cb4bc3721efd7ab2cfcd0a3e2", + "signatures": [ + "59851f4aa542003febf2d39ebadbd07ddd12cd41a665a8fc052ba01b1c484a6d407bdc61b449cdbeadf73f6ba5866685651b7d0249527a82f965d5a2b314c4af00", + "40f631b61815f54e0a12eaac988684f4808462f19f7b76deed56ce3f3dd2bf2827104ee2ab71c3a96773de3bef7a41df960fb98329852a42be09227a1c9ed89b00", + "f539e928d4c68938eb6eddd169a09edb46c056771185968d548b7886f5c1eb9b7895cff1df13be0d70c51bffd0c98f8fee9dafb68d5d8d3bc1b2f6a5e700c9cf00", + "d1b9277ce64f26956d65b15bac44a3ec80bd2024e098be69bfb6ec36a4718aa75fb6e8b353008a20bd4dc994ae9e7bd928c6efacfbca7d2e07861e3fcd74f51301", + "bf919b227af4075ca7864fceca4dad5a21ca9c1f124fce3b8f66f8406322fb021c85aee03128fb1b43fe0ea91ea825932b4dbd468c15ffbc8e5d36f69906f45200", + "36a6c965fbaf282058fb5fefc466d9f4df508598be400eb1f9415533554c59ac18f04007eefce37f5c8e9ef7901e65deb2a2219e2aa7ab638e4370bee9c98d5d01", + "30ea0d7dc2735767bd60d85cbfb39c19d0b4a2d7aa81157a2d647c548c7eb9082b991300b5608d13eb2bae260c4eea723f92a0c1fa82a267fa34498fcec117d000", + "91ac4a1889132a827df3d7dbee5aa95a4c9b111283cc1209c0a7ff77dbe782cf31c8f32320bb3344e06a3c114e18fa0da245f4749b11a27ab918c521637d6c8700", + "8c59fa54d45f81390b67c23659c831786376bd7d730a9af1e936f09dfb0cf11321200469f6ce4c2ebd53f7ef09069c314d9742ac540c3ae90bd4dcd805ea6e3f01", + "1055cbb78a97a410fc3663dfad3bfe21865da1854cf196d1f532ae42d9161783284210305c1abd09f77f0c36131458506d3e84dc19e87a3255e1fe220018169c01" + ] + }, + { + "address": "2GAWkAhh6ddxLGT38b2XHCuhdbRx9Jvf4pk", + "bitcoin_address": "19JtZ2B8VfUGEvVpZDc4DuKUoFAraxpq8w", + "secret": "e0c84b3bd790f03c58548657cad0a83cc302d1b75d7b6b3d8edfc21d8c2289cd", + "public": "028209201b8152ea8fd7f7711eeb82354f67cf1cf1b4082160f9f04eca421bea2e", + "signatures": [ + "2b390a37a9cb797fb637ba4ef700637108629067a6666d5e1ee23bf448fd171e0f7218eeb61ab445ebd7c14ed3998f3dcf0a3aa22b66e7d5a545a31a6829e5f501", + "871b75956dceef0b0edfe032290de7cc86347154cfdda5f589298e6aee850bbc2668a09c61d71f92ca98347c39e33d52193f61cdf125db85d463bd24b3805a4500", + "dcdc972a97aa2c3784a9d48a886d344a1db80a26e0015c54590621ac2fdc9c6e40149a4966a80b4b96a3f92cb40fb48043c359f44e58134c0addedba9257506b00", + "de090ac5cdfdb9082e682534f1486f426343c9aad870ad45291a8343524ddd67379f76bb35f75191ccd45c5286b48e4cf5049b975d07548b97fdb31d86c1fa5100", + "7bf2158c903b09045bedaceaff8f15603c762543d6854e60037529a20f401f766979df98a63a9432f6154b010deed9772ad21a15bc3a162b49bd5f11bd4d96ea01", + "ae300255bfb6443a65ede797bce0944bf7a503d38c4b161935f44ed2f7738e347040bb8309017d5d6c14161aaa0075f301d957c8a761b33284d6d535547bff9100", + "e61371336baabb089fe52ff52751e5e41f34820c4875f0a2cedb2e20cd8c1c2b638f3b0b04b199dcb2699428fbdd1e55ffcee0744d46c503ee125ea533d567d701", + "e22f88a49370f37b078fed65668cbdee44567ef3254693a9fc0aa181739acf2f3ced7c4ff5fc8204304122c3072c2e1dd8a44989cf6bd77ab4709d6fd1e3952400", + "76d6cb79f1529b03762fd3323fd381174568a05f7c799faed8be6a0080d89d9b3c607d378178b6e941e2fdbeaab235f2cdfd37fbfb9922170193d6508081148c01", + "1cc5722eb5e17c21114daba7c19ae25649ee79482ef8b681015f8d708aae2aca4b3abc6b345410f94193d4e9e8de50cda2f5a5e52befdfc9e7c81a42757eec3d01" + ] + }, + { + "address": "EzfiGbJmK9AtLocAbUUgKt5FbvkptAfLqC", + "bitcoin_address": "1Fn4KpLtjzUzupW15VS6s4TpciCkDo8av5", + "secret": "4da01bf2216bb743f5412fcb843d79ed3bc22a03ff7ca0b314255fd622d90874", + "public": "0342b3d108f4f046af97cd92244b841b6ada34f52548d944d3e22344a952e3d173", + "signatures": [ + "d320e4335cad33aee05f4149326c9975464d2b8b0f24fb0ecd68d57c19f6df3f3dd0df782322bfab34be399762e3c43c91e8e61fb2d52d9d41b63663ced9e71c01", + "ac536af52e3f49f392a5612bb227c25c3ab58c60b6d2646ca43b465d409620230a52304d22c942f28d5a6f7d2e69093e828027dd6dd5ba4af5e91a6fa423cb1000", + "922a0df5d51a5a7f64b42a2a3491842350cb37f3d3331e14cc2458e449f384f158b9d6814017cf2b8dbba0962315808163af33dc85f73339aea0db2f1249e4c901", + "19ab17f648411a76c8011199a3f648bf4678ec8086ee97bdfd09a6abac3703190d75dd1444404a97505401e5c5465cff9c73f8281ab300ea2bb473647265cf3301", + "df43f4d301309340903b862f6002d8746b622c7f8aebbbe6a3b9fac0d17e8e933a32313dc3faec39590c414d5d9dac92705e72c45be95a1e53c9476c96b35f8400", + "91af75028b21573abc40d3b7a652850202898b2692e5fc77223ea7c8bcac75f002d42a0968e9bd12cddd0f5dfe8372f441dec2108650d8892ec133428099951601", + "4ea9d6a9cd5a4298b9649a83837a1492339c53fc2db3e120003f5e3f33e13984739b7f2fdebc10ba7b465e000c2167e8b215f250379d7c864f98d16e6d9e130901", + "61ba9794787249f40c9d49e451f7605d7e7df411db3e6833f3ec6b436139583615644f11da4e650dd170c501e6f4011691c9dd1eb8371f7e06b5de59cb4767b800", + "8e3ce6420e9e3ffb84d87f4b62738114f93afc76650c184445e5e625b7470fd01f1052b3c85f629053fad8bc8e2b356885f1cb82e647254d4e5f79d86cc94f4d01", + "2966a1e0262bb90144cbcbce45fbe477f9ff135ec4aa59f8fed4225ad88c8acb4eb639cf1dfffd7f702b7c9695b427dd91274904394597bb83209f00b7403a8900" + ] + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0007.golden b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0007.golden new file mode 100644 index 00000000..647fc10a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0007.golden @@ -0,0 +1,185 @@ +{ + "seed": "cGlsbCBnZW5yZSBwYW50aGVyIGZhY3VsdHkgZ3JhY2UgZ29zcGVsIHJpYiBpY2UgcmVmbGVjdCBzbGFiIHRoZXkgamF6eg==", + "keys": [ + { + "address": "mPSsNuUTsMdvc6afNScJGAYWLTK6zjpaXr", + "bitcoin_address": "1GDwEYgaR3dGzQP5mX6rQ57hFx517D5Hzb", + "secret": "b4635dce2ea621928c61bbfb2132090c674e99b9ca6017a6c7ab33dfdbefdee8", + "public": "028e6507a815ed048711b7bc74214addda37b5197d3128419fe2cf1f46aa6f4da6", + "signatures": [ + "8669aca771dc0437ff8e12b65ad4458b4e38c1bcb1b1ff29f8182780057942b82f5877933306f93753d76c5e74d0915bbc8ab62c6a641b2bd7ccea69797f5ac700", + "97ea4fdd2fec0593c93c8d37f2e938057fb570f023e73b8b441d5eeabfc2a72764a3f851f7da5c5f3af3d969d87f86fa905cc9f1bf6472e2a749f60d6891b2d901", + "4ef65b166932549734074a92f77266c70696f2ec5d64aee324f6cc68cc6dc20b0fbdfac4d871c47bfe97f11070ef74900f9da818bd5a0f44bab01b35cd47fb7501", + "da6383da7ae60f724056a120280e8fa24abcf08c0ee32024165090edc7e472b14c81d41c9d52b637efc1c7114ab65f53890251caede1dfed2ad2beda0bb57b6c00", + "ca7d081115500cb95a9b8e4990429f2d1df284ee6088503721c100d8132c54ac1298e9b79b1546a09877e658735192292283d8396734607a90905c98c7f5b1d301", + "50906532962f9b50c8db4a9836669fd0d62f7a33d3d58b33e95cdad4ddc99f207c9f75fb0fedcda2f87ced5fc9d48e2eaef274a7395d68f31749282ca96f729100", + "e316c729311f1cb873bb245e128775948f4782f9e36e9112bea1d4c1ac8644ce2b3c4c914b1ac36c102fcef8e99391ecdd5bcfae3bafcbb002c5b0f6eba25b5c01", + "af312200f509edd20bec70328b8f88ba71a57b299b46799d15d9a8afbc7ff2a173d7f67a70b7a527e7bdca3ca0d0980cf84efbee41d2eebcea8d81d79da6843c00", + "04c2cd593c4cba96a0fe54fc119b3fd00efb82bb20bd71aed1fbbaca05a588a239f4975d39351bc085a2b8c0043a08ee09351e3594554a23b357fb5223f7769801", + "792267a2445428980b35e0d59f3f656bd4c71f0e6c4b8fd1f89930060d90ad8b26dfe4e4aeae7df72b42e7d4b5a5781c402cbeed51a23302f65c321a2d847d6801" + ] + }, + { + "address": "2Necqw9k3NCEtj9FY28Kx7NV5nSCGQ1joHi", + "bitcoin_address": "1HH6aokmmxSaajT18BaMqETUiENsrx9xVQ", + "secret": "7655913737a47a580d2c388440d9236a0283050aadc7b167f2584e9878b066b2", + "public": "02bd478e24155889b48977d6ac97fc7bdedd146fb2c983960e28d63a20a1adb6c5", + "signatures": [ + "aee5eee74330efeb184999e59b5b26516a124f6c320d9df6167cad45ff297c4f43525905e5fdf73f07f6925cb4084fca43fbfeffaff5eee81d52f53ca08d2c3e00", + "d97bdbc541dd80006dcc5e4c6001f044e20ebfae2f6410a2af7e44acb9ff4c0f68e0debc89784258f6f8d04e0d58e4342ddf0ea52dfbfcd693dfd00b6cae60a401", + "726eb4a9402228f925da2aa936b635bf1d3b587e7566620f0d5e359a0596c35d62a786f1d604d5109420e3449232622c3ea440341715119821c8392908e0db3601", + "b591beb1c89636c14a82694323df81508bfd6f209ffa768d0f2f74b27b2572aa65719c48732ea457e628ffd68fe3125801336f147968da55f8165ec020f480bc01", + "9f5ea12b545d1ca7f4ede6515e4f88e92aeb075e470d69a4a5df5b8516eafcdf762be8995c70fc788f886a7440781c95c384f7a8a4cd5e9a7e228366374ece3b01", + "f8e7277a042429076ceddc5b896f6ed69864776dc904572cb499be4672b16d0613e046fc3626a953343046c60e86114f59a24e46ef96f5b7032b8b204d18f4ad01", + "2c4b74070467fc30c8f902cffd43cfb21e7d5dce587fd1ebb07ad4374df020e240c0191cd5e68f4913d1b99a87f9c68cb59bb877296aa6a531e6bad860c0ab5300", + "00a0d16272360c4f47de24be8962cd3f3cdc13fbc8ea64aa57f138f12b9de5082ce3ee1e50906b74552dd5f99cb10d517e4aeffd308b43f680443a223363b9cd00", + "3aa6aa35b15eda95eee58a82e8a2e54780b77248e6020149407e3981a721129401319fe05da2a9e768baf195547c5180c52bd2b862af445b5b0ad50f8557aaf900", + "863ad24a59dcfd63da8c41af9334137277cbfedaed35c0c85d1424751c3cd871191ae55d8227dafbbf9596966a759c77fea4da7a2eaabf126aa47e9608cc000400" + ] + }, + { + "address": "ajzwXmj91ZKMnHeJ8LasEEzjd43fGJo2P9", + "bitcoin_address": "1PbXphU2k3egpKE8FfQBgiqDVPYs1fSdDF", + "secret": "b1410fe8b4705b209bdbce08b800017e52d34ebb5cbf62f84bfba61c146312c6", + "public": "033c8dcfced958c25c2e522a854c102da4901ab2985474183e3563b5540b4c7b00", + "signatures": [ + "24643acd511ef7d7310f30d42c6e627cd7fe33681b5a6e3752f3a29176b44c7a547dd22d421019223d0575478cd20ce96931afd3ce50bab7ec7814b07f5690a701", + "20300a8466aa41d9ca854c4cd18291d6aafb8be050db7553573493387ea56808494e4bfe7bd40670813ead46f6dceb0bc147faa7804eed7738de4588466f800300", + "8d47354f77889b8b6e5c91af0771b6c6a1f8cdc704184a635fe06ed839f054ae264189d96c05444c3412a352e5141e08adfdb9f71a6694f98b029d43dd47251101", + "a13d77d2f566e73cdf93b915f24ca8408716400261ae15997dd6ce6a7ea0372e03def52420d5951645211c59057f911215ef25f8534867da690ff90fd9f7247f00", + "0980bb01721d53f0498801b77ac4d916a89f17c243f8e6323fa0988245dfd6c74d2919c4dccf3732567349349fe83be40c0dd068e9b49517cf15d0700ab1811501", + "d8f02afe36134fa6b42a649fc5c779a2c22edf4ab828da68c5f891d99823a3a72345a4e0a0770404f890fb385bd306a4d25e92a6dd5e6d1fdaebac427c10c3c600", + "706d0784c82536a5f2b79622a8c6c73bcccf8384dd22c4b0d2a8bee0918e1492240ff03af79937797292475464e04cd0976bf3a9ce3602405f6808c9af98bfd800", + "cc27141a61bcafeb90ff4a55c25b2f80f5a4a8bf1d9b23dc56990b06ea523a91650b356d9a24b9624fe74541a117542d2f20992bf047114680c8d2169dd6404b01", + "052427033c268b9b576a93fa05513f07f5fe090aa1040d94ed116db202e064af58e2f05f9ebee6f405448ec70e41173ad39e29f8462e6a4a82c6e76e2790b94700", + "215d08a564e5fef911b8fa1b7dfb84d9d7013501efc3ab92a7ea2bce8282dd8c31db5c2bbfb44df63b8b93e6bd2099cab367ed1d9584b432c85018f816b7302a01" + ] + }, + { + "address": "KAcJer4yML3KndgxtHGs2SoGLmRTxJCynf", + "bitcoin_address": "1BY4SkiaZb6LKYs2TW2r5P7JF9SuvPjKSC", + "secret": "4a5e44f0036c42fde00ec8dc633969474fabda864e45f5035b18f4d15c8321aa", + "public": "03f7d1f72c91c5e6878c76cd1e5b84996a0c0a8ef36efb550d01f7af459606b48b", + "signatures": [ + "3a5ff4fe01d7cb3739f2976746d396eb18f1f181bd5948395d4c41e7326ade1215da758964d42ba65158bf7e03ff8c7eb7c0dfbc914eb365e1fc0ea6c02b24eb01", + "3c391bba2682abef47fdff47022a590859abb9e95fb7dbe7317f6094901189160b114cdf44b240851c939f22e1540ff3086f91340b3c3b842fea5fffcadeab6100", + "c2be33d40825d186a950a653b61cad1b16ec0429689867a82b0f44f1a6cd633d03a6e6272e0cb886f1bff6a014516cf181a2cf6e12658d6ff32d6b32d69eedc300", + "4cce6a1330e0e838aae3747ca45f35b9df835f8744fc4ea10aecc7aa0f14946c3a780554f6fb2de15ba38c067b5e13d7d88c31c9e77bf622339cdbbc3be985fe01", + "7513352f17bf50544d3b808f9be00b9263f4328ce98db10f3f8e6e601145673c0bb2ac0dbe4784a370434d45f209dbd6afe1c4c26e0e7f8eb2427b94293f91c500", + "3f3bc0a9d2979a813bc0e1d9f6f755fa0f542796c3a2db18c04c39aeeb1822842c4d1373bd524c45aa8b537b71e5848ffefc65871b3b91e753e54ea1dc66acb501", + "1ebfd245fb5b3654ccd95be0e7f4a644896c5e5ba758778d77de878f860e4d8a3a4c33f7407db1fc5734672fb046a5c02776e13c0d56eb8ff8105ba68d52cda901", + "49e5a8fbad3e381488d6ef1ff2a8d58167cd1d17edb597c8e88a24b6e5e17e8c442d4eaca8e1bc7050bbfd439a86e857a9cdf1b704d5aa2addb016eb5af77a1e00", + "36a9f46810244e5eb23e823965a83224cf2783c140f6042fb35568ce9abb33242616c0ef0b619d9034205f01b4b7155a8237c9745fe905078dc4bd2c8fb8599001", + "e016afc5f089018881eb7516cbd07e37e044565aa826d7e37c9aea005be336f158eda455c30e03eb7cfd56bb79c5895dab15ae575b18d4b1b2de8a8645529a5601" + ] + }, + { + "address": "X8yAtMRCVageKAgRixGESP5vRJoe1evT9w", + "bitcoin_address": "16oj2N9wWmv8kNhFyLVKFrUUAFtc8LQR2q", + "secret": "e2107eba690b1df6e0d3a08373921d0a19ac491bb10380e40dc6717ed11bdd16", + "public": "036a17b121be33dce4f868d591c82268cc86d765db3b86a447ea50b7d1915db8be", + "signatures": [ + "90fdd824c80b4d683ad26e8950aaa9c9459891374e6d519154e16833d9c6ee801c5d7d202c204e85530ae4ee0a38e9b115528bb3446364c945d529f9dd1d185601", + "b51a66267ef5c3373cd2d19e569d65349acbd3e1bf2e4422f5ef9fefbfbefc4c18fbd07ab1d008c887cb52c179dd15c7ad1f6a348a5bac45071b62ad4f9690a900", + "629bdb73080d5a2148d3a6d68e46c29509285edca81d9ec602a6eae1ee1fc31b4cc421a925e5c1a55f77ececbe201146afcc93ebb1376bcdc8a0950f61a3010c00", + "e392a4bde506161eac5473a3f646d3a153efb718405bc3ca96ae4d6d302c25964ac38e211ecb52564f459098f865f3b7000e58f30afc444a6b9fd6837a61b90500", + "7ac54bbdaa5a2b800904fc79cee2b55a6a2953b31292824bdfe2796228b2c97c06a0d1032adf26570c139ca5ceb7ea17d677be5e32f3d73edb61b49dd21e312a00", + "7f4e56604ebece2f589ba9cc8bdd3ceed3cae3bc7c737946c69637613a497b0a22d7bf916b70cd40fa7532cf91bff9d48c9cedc0e8fcc24c2a1d5a70ecbc51f200", + "74b00a4928e33bc6121e6eb622707487fad27282c736620892c0015b7b7db96a1e94f3a19f0da4096c8034456185107911c25a01248afdfd4a49f98f38bce89001", + "8a880ee824069f49a1f4e7d5cd76d70b44990cb8902379ae64713921bd8c0ebb4e6f63f4c3849e3fcce331f77c080120cf2409aded25bf48000c64a2515cd28401", + "4121056c8a3696b6158d8e3301e23c514a5863ecc1926db3c6ca313583098fc409d61ec72f9d3bcd0c215defe6cd5a07c4b2aa062e55c9c4e631ac3db237443e01", + "264e63e3df6bf4495d12d1df6db295b61ce99b9e477c1a3e6ac9fa413a11410455f173038160aaea178bcc71a3da7deefb70fac5f1f7fdc9dcfcf8d5d2f74ce901" + ] + }, + { + "address": "2XKCgWpkUHdPxBhzgN6RNFDQSFDpbfjTM97", + "bitcoin_address": "1GeQaUh8bPpeMtst3EY9Kq1LY1zoQ3St4U", + "secret": "bd04dd38b12d99d5d99da868871ce4c8ec3005e615043e7f6ef766bbfa041d88", + "public": "02037e40467e07e07528f1076e64429ce8efc955ac73b741f2775df7ab7c83e9dc", + "signatures": [ + "25a7ebaeaa0eba12d350cd2e022fffa3ee7d73b60bcfb1b7dc6ea3a930ab16e065a23d7caf1f79bdb390e3de2b1c09371ff22369a1b51a0ebfbee5a11d20883a01", + "d3d06e33fd3597af973851f1ef82278083f8a8a6bd58c6d33ce59264cbcd26a13daf8906cf2699c3846e64a2fd7e7dfbb092f2e4e3925157cfaea7788b8efd0900", + "e97b9b1349bd9b38912270f20c664b1f52c1ccf2dc6122c089fb6bba1c9a1864430ba63af58748de4f3c2d97172577a0b7bc659a31be9e492af81a612d3ca66601", + "5b69a9fef8e54fc5e262b62a5de331a9a7f16dcbe41f61799d367c0a4d965e8b1bbef4bce114397dba8d01b8a86a87f1ebb03ed8f3b3250d95c72963acbb7f8400", + "c34181e4a138f719197db757f12063cf844e5ce384594122b7ea668063a2dea318b00fd391471fa4a6b951f9d3cfac173ff2f4204e912f4a762f6f3eed2ee30c01", + "585ed7c1228fd22d7d481cb6e3c484c8749572050aad297aa9e406b948ec42d67430f39a4a7c46b65e876eecd8d4383aa89ce4eaff4268802cf1369663be9c4000", + "a3ba44c0e700bb0cf95efc6b0c215af840d929522d6f46efd6bd2f4b3d03bbd822139ae82e476b0d8419db6b106418286800d420fa6017ad460980e499ff547600", + "23d1eb4d7379ebdb764e6c99949a8ddd76306f351559db3e6b20aa44b5cd2b201ae1656f92dff367ef9b1608e98206fa97a61291ac28b1894d06a8267751dce000", + "9b61d09bdfca7e6c22fc89e1e60a85b94641fb2496d9259d9a277a48403551351505f6c412a67cfa2870fd43cffadb11d83c46b3abc9e2d7e335db819d775a8201", + "8da42dbeb2e06fc69ecafeb7bf9cb06f1f7c18ff16fcd0e1a3260dfe9302293e68d0408cdb6d2264a979a1eb855d503af18248beadb95ad14ced7fd4b65c516500" + ] + }, + { + "address": "WmcZyCWxhWWBXhcW1KuBf9ft1j8wzTw9EU", + "bitcoin_address": "1H1DWxZQcgnYA5ir6zNVk4N3VBxtd8qvJ8", + "secret": "47cdecfb4697492b71ea68c871fbffcd3d7ab6df36f5cb744c7530c88a775703", + "public": "0393d74aaf73d8bda3199efcc619d7bb3f26cfc95800e3a0ab5ea029182669a0e6", + "signatures": [ + "0cd5e03900cb1f6b9217a68b5456595a5e8693e247d06b59ff1df287b4c8d3bf7a39ae9e794c3ccca84fed36b447b6256df5b6886b73d1f15a47efab6ed7abd101", + "1ee6a768810935fb72d74ca1fb946786c944cb335b1cd95c33d10e1a5ac16e0e18f6a0e4102e99ddb6cfcda7faf4ab49e1a93e1133d488aa6c23ce1a5fe251f201", + "001e7e58de32386c7e5d3b64a967ab804fb147cea16b184c2644a8685922fada0f648c9223baadbde6e637be0ce26bf477d1b2922decd993e1d97bf968b7972100", + "2bc7c3a115f6fe9fabe9a0ac3729d665621e0a1ef5026c41fb65f328914b84a6228cc3491dc07a5cd5f0b6c6a9373b1aa6f4a51f1bd370b74a2827f1773fe31501", + "bd114507fae6943f5adc330ce600b1bb8f67f72bb57f2975348f91e85a5e333440bb6cfbe0b692f63e6aa1e14ddbf62078adf5f6a620dad5b88659ac89485c5600", + "4a147ee3c96cb3563c1b06b251eb947f18ebd45c13d5121745cb0c2676a1dac47e41569699501664495527228cb5d5227e77262a6fee592c2e39d4d076ba736600", + "869de9726a35885a2e1542d059e38637f07a1f7a748f85e248b10a21321fb7a90c895931eedb897d99608115cb3e95e5f3464402099b451b14ccda964585abec00", + "e04d0d2574924c2e42c0402a8586463c68f0c9817c2eab2b0ae12d7614602e5f51a1e3ca41dbed052456c8efe96101c6176af9ef79b785351623b53c8028b2e401", + "d8b3678390136043eb595c3440e891d217024abbe8bcbf8fe359bef38282298b7b3250ca4fd74036386a480529d24bd23facf4b109bc565c61c47ad3515c3d5901", + "77e465dcfb285aee33e2c07ffd22e0cbe66123fdb6d83139f26b2eb5a151e6cc3df0614f9a4687207877f573c9a776bbe8e8582ec76264e68cba2e23db6f866300" + ] + }, + { + "address": "sQsVTtmRVSBQvXB66Li2HmZFqxjJNt174d", + "bitcoin_address": "12AgUdpFuiph7U9xubxFT55GeSpESC2s7f", + "secret": "dda8c4aed2d9dd515df72e4a31c3fd05815f7ed3b2f2b2e203d12f7fc48f90ef", + "public": "020dedd0243219fec27920385309b31ea68d3418df5cba597bbba0dc794fff11f8", + "signatures": [ + "9e6b99596d5fa55c07c9daaa893ff65cd713aeb723337996c51e3a42b13bf76e04090eaa3365a5d6297065e229e21315b60e14411ad660d8a74a4c1e2ff4dc9901", + "320954de1ac17b54446863320f55e18ecbf4dd65bab9288d18f25ec163762b42132ff562af17f2b8f2c759f96b2dbe0f4642376c8e8b64164f3ee323dc26bcaf00", + "00e678398b522707f33435ad16714372447cc0dfb0857f744d86fe3cdae1f375235dd78bf6d07eb559b844971754f8199999105b76b0994501fa34c96333c4a400", + "8b8d6c37c63458744011eb7f181e9221029081910565fdb34e4e4ee70ae992df04f005ef1da8920bb820b124571093ae59b2b75e87c6de069c109c308d61314b00", + "45acf679d22c6727f187a2e2516599d1597e8ba0ec268918e2b0ccada99c85136cdecba2d94cf31137b612e87819fa2fd0efcca7aa85771c9ac9f13b00c74afa01", + "1f3b2ae803fb5605cc4d698c1787777d448eefe2deb2571975886c62bf1f83881543913b7182358d7457842be6937a3fbf142ae776180ee2a0488e568898240a00", + "19902fc27e1b56e81e2f98fb4f89b8f15a716c96dca83407917ed615674b77bf0cbf8f7de42fb19da7d40d7de49e8eed4d24d0e260c3421184688b1bdc07cca200", + "c40fb53834a3198829961133e3543d786ba2719b89a059022affd7f3820a38727523fa0dccbf645b492780af141c0ddbdb421fff18f8f97a15e2d7d18114d66c01", + "5c65768f4ccbce98584a050c845264a6a19233260e7d711c48ace814d0820c43681f2d175722518df44cd135c759f54082c9eb866c967892df43875156a9420701", + "5c91737f504558b000539d368aba1c5ea62d4b5346ecac64ffcd2b5ef820b01675a58703e39a55889d1128f678f0ee13ba0170b11fdd6a02eeab87f5485eb79901" + ] + }, + { + "address": "HAZJiBg33BdkdW3RLqg6CmUe9rTyjobvfM", + "bitcoin_address": "1KmxdNkzwDWytpEXHU3WGjdL3c8pM5o4Hv", + "secret": "2d046d99674e756338789b24c04cbbd0c022c06482f7592a19dab3d8da473135", + "public": "03c5784476d10e4110236c60af26f085d3f7bebcfae0a2cc06ddc95e8dfe01da4c", + "signatures": [ + "7ac208a7d530b1b5777b6416ca89d52e3fd4047d488cfc043dbf655cdbf535c55ae6234531e652376dc034ed3620b64fc7182a4e712569d07f4bfffda421cdff01", + "c8c0f9e69ff25a3a79fcd78efacdba7255fe22e69907fbb23164c6dacf74f0da013213ab8b072dcb11429e4de0d8a5080063b09a613fdd5ecad1028374c3a0e100", + "519ec555c35fd5669e00aab7c8a6d244361f11934b154e026194485d456c019e69eba81ccd983a62ca529ca3203e3a1e8d98e09c5b38044f1e47628f8e6deed000", + "ee211016b58172b2b28cbf34e501484126ac1f49ee1b89d8c2d4f03bdce628382e07f7f7f1fce3ea0b24e413452660a061377f8df4161fba404c48c07f96529a01", + "333d5e802b0b72c72c6bd615521cb3b557cd4ee15a58134e18c7305bb9f909223c4ef26dc3fc26c63a064f88cd1ed77c2a7bcf9a9f530fe7080ce102032b680d00", + "c251824690e71e8766f8896aa79b37054be3e0c981836a664066adde3cee3e482c240364fdcd5cb1398c7af02671f4a999a6ae5313db94f7c13a97b3b4a1b72100", + "2e674b3e7a2988f2d1cd6ea8440a13f78bc9a0dd948c1cb6b2ebc89b766af4531b31de154016462426d7b3594ac2283214d6f5f7cffdeab426fb83ac9f91882f01", + "0d923ce2a834ec22daa222c5997d439406be1e41b1ce8e10110568fceea3b64a2f8b4ca395d2b7be1d1eea8c47845e683ad9c5d26e1f58fb639c07ed8476e60600", + "ced0ca11d628b4f1eeda80ae34c312aa5140c65b781cb7848952bebf3a66c926424f8fa8b605c1542261a088290ca4e2854567be62620fc6920fea5b3d8a1d2501", + "0a83eccbd0c8df9b0f8ad166d892b84d85b2861d945539b124f657400d52c8261db09b5eea6d03e181d38af344c49e3f6356444bc7bb2a93c7662666daf0c2ff01" + ] + }, + { + "address": "KAU6CLysbrc41MdFKHNioXsJNcFQTLZSWV", + "bitcoin_address": "1EHCm7o2wF7HayRtMCXYxB4n4fgCRoQo9N", + "secret": "fd2de4b3e1284eee8ec5884d92ae5841bef651fa324b001bbf99b7a96a4ee232", + "public": "032548366a5a732e4b389f8fa5d8c0e5debe5be166de2b557fd58dc78d1693de2d", + "signatures": [ + "fd3b22598a78353042190783d3410bf0bccab1331a4e167a2f60057a5511a4425953fe8b7d7099b96f711eec98078ab44c14c4638a8055f750f79384cd5c9e2b00", + "7b6157888227e72af6d22f2964ae61a8d3dc12fc72396b5302e65d2bdfa0e54e13128e531490afe48a7b75e31461587f67f741fd78cb6b15b4da8d8b12fd44e000", + "41b4944313bbb5414956049204dc8cccb782c664cc990e31447904ee317ae75655df2780d60aee06d80a99d6cde3731024d364238cf48ece1129b9f6d9e5e6cd01", + "aa892a1e3becba91b7d2ae3aeb04309e6be4221bc972100fce3f275e6982b8b2124e21016d5edcf8d533b5dc25ccab9656927fa03d6428c4ae8c8fc01be830ef01", + "b7757db90ae36a75c0730786e121567715dfef02f0fde002c56fce4282fae3f1386007b9d6889550e26d756cdf9b22e29614e9ca8325f285e9d19737a8fd768601", + "12a0c556c743f4e10cf60d8e25cf19520b2c83ff10aa508000f9153c38c7b00f4a13bc9c453d6037ad048e3cd4484fbba37ed072698dce7dbdf8a6a153bd1b7801", + "7eba52f7fa4a007f022cefde6a293ba46166420552b06855b34419392a8e906b10005884da94e87f677183f622c0de3066a5e73e1e512107892c967fc71094de00", + "602b4fdd642fbe5630e36c80409db56bf49c672080dfacca681933d086cac6184fec501ffec1e53a0695e06fda2781e33c44f601b2047c2c9392a16f195ff3c701", + "4f09c6bfb9a839e67c39ea1b44ddb21fb4c25808b9d72e8eb2a0667c9b79464d4f2b74908d3c0307eac43bc648467cc5ff3efbb3b500d5f2d110dbac977a18b601", + "f7635143e6d3dc5ffc4918944a4dbd783c7fffced7b8db8c243677af745750b72101ba863d037c27c862a02acabcd897850f34f3b4e7c649de784c937391332c01" + ] + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0008.golden b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0008.golden new file mode 100644 index 00000000..76e249f6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0008.golden @@ -0,0 +1,185 @@ +{ + "seed": "c2xpY2UgZGVtYW5kIGR1dHkgZm9sZCBob25leSByb3lhbCBvcHRpb24gZnVlbCBmb2FtIGdob3N0IHRvb2wgd2VsY29tZQ==", + "keys": [ + { + "address": "2hBixkyUneVyeWK8HXr9S5wTuHPPjLQfVNk", + "bitcoin_address": "17uTZ2KeSJnsE782j69h8y5JDkrWKnF5vz", + "secret": "a4196da38de61394985555f95c8cb063b055f11a654806d1bc9000ca65fd48b8", + "public": "026a7c59d51fd0412c7964e85d428e8e7f462596bf55b6e92fb42dda47523fda13", + "signatures": [ + "2d324fb86d84dce6babbab85615e3fa8fcf40db5265eb12c7d2177463d414f4074f46bfea5af54d9a1e4718d6a3854ad3dd0c07218f7b337b0451677ea1f553a00", + "6eb90b199fb3777ea55a938d99eb0aa5660000bc12945cd7500bc3e465e00fee5eb0779fe7f83d04858928376bbe74faef7b10477fdb78247f5e5f45318d5d4000", + "32e36ef19c712fdd1080090d5231e8c1a756161b26da3d55c8fd86994d66d8c07ce4f774fd2e05d75ffcf9ba6a38396ea58774e6db1d8858232cb1be6a394d8901", + "9cd97b11b5fefde1a0418d6b52436c6cac206e79ebe124053bf365e5d9ed9db042a9b0fe513c3cfaf790af1bc5711b45ccc5ed0724c44e33eec62ab3bc460e4800", + "00b53304db9b47062c92c91a392e104e51cb91ece9426434f32fff31ea1fbddb5324cd9906564c603c8a36ae54f19748a281474ecc8ec788677dc15f3c5ddc1b01", + "41d8e48ebc1a724a242024ef1a2121077cff8f2bd78f27893ebbc14442854f3036094b99ab8f8c7c662005cb32b3bad03858a9d47a8d8eec0c0829d06f37d31b00", + "eaa1f2b114c70d7a04c9eda7892c615ff33b4f0f05e2e9b8b28bc0f5672c04d95f84f284912bf8222b80ce237294c163ee2ee928f0400b1602979de890b8330d01", + "3b4586cc527ab41c6c65383dee57a12000a2f3df181cfbad65511a6203666640681286b23cf890e72405023ed282d67c060433b93a0601e2c0014e7deaa1b92100", + "05ddb5df8ad91c32b933a1fe8c0ae217287f51494635f5dc46f3b8c0c58ed8e54b0f1a522ebef697d41bb7a776702fd7f81710db217346f372acf2140a0a0b7200", + "9fa9c7e922a89fe3f9beb528fc030b9ef53284144e92b95a13cfd19bce14dd9f19d5407a8c4273b6c17fd61c73178b7af32c8c217f00a131f3625cd145c08acf00" + ] + }, + { + "address": "2X1uf2u1LK2S8CC8e3VWGVLjiVhHGkPyB51", + "bitcoin_address": "1GDtCg5s4RkU1BiUE7HtXZwg25ahP9CHrm", + "secret": "46d449a4e9edcfd54dc0d21d75797421a3f0aaf6363b4fa489e3889a8dcb34d5", + "public": "03c164e6e935c29b4a93ba87cbcdabc49b8639bdc69f1e89dcffc026dfac7393c8", + "signatures": [ + "2bb7fae7a294a511468194fcbe2000cc7d4e3da84dba19226f89f446c9cd67853a1d6b9519354c9de307f10d9a375aa4f2af3601de56312b087a15317f40938001", + "b84ecbc6f15a0e377bc74efa502029ac87b55bc3d3ffc79867c41c909d34b7112ea1353b9da4024eb3f083bbbc04214f5332cb2d4d25bfb4b47ae0f95515ef9c01", + "1c9a32563e107c5d225dad141db80175d92997dd44ac7b1d0f6c2b0c5fba018373276221bf930f508ffe429ab0efd1a88cf54449d26992cb392983f0f7785dd800", + "df150b6b76ce86e688e3817fc10d16aac4da2e5723ce75181254269175e491a613e7d69f892d718d10fd5a8abc54fc266c731b33f77599c0a30b9186d6cf8dbd00", + "e869020afcdbcc8c07ee6dd356f83daa1aa5522aa3c2d9a0627c76e4745f0d0f4e3593a69a6a22ad3e5ddf7759b6d9ffa36f0c081f5462cb1cc76765da12e50600", + "3ab42e19889ca8527bc75dd3a320ffc7602371ae754c28cc61d2ad986268ab62790a940a0f9a9e7a9c1b32c0f98fd2c52c55171fb7de8f5b4f339997df46e76800", + "20a89d2aa6ebc277ad374e1ba8a8cb54bba5da83f4b0b786d71f7118c87bc73e680641af294c70a4bd5c6d837a8ae373a272e56e1ef6879ef2868c0d40f67a3e01", + "7a12400e7ba39600a1b2dfd9da749b34eff25246c83ecdea065cdf5f1df5046937cfeeab9c9096c678ad27b96ceaeca81e6cd20c00d23b7aabcaa13143649fdf00", + "389b8fab74bd3c02c51029543663f8930e3b37aba3ae08264761ec8cd77fbcbc24fa5bf47482ff4db62ece7ce5c9f8554b685379256228e208f7d65a8e33c37c00", + "351ff96e4913784381de11fda7b52abb87d4b786add98e534d215236100f44922435e0f8e8a264d720a8b49b88307be2a098c0614610a216dbe8862f5e51d4cb01" + ] + }, + { + "address": "nTsFenEp3j6vda1f5uRe4d8H7ZEXQkHEZ3", + "bitcoin_address": "16QVahwhZdYgFszL2NNgjBgdqZ85FPsgJN", + "secret": "c7bee90a73f6cffb9abcb920ee497fe7522fff3ec46b35cae5f07bf3fb0490a2", + "public": "037d3dfc78dfa302b464ef903a085fddf94251587290d965754d8530be02322743", + "signatures": [ + "8869ee2ff57bb97475d007f70279f9e3b81193259e64e2bed77957e8f6cdfcbb4ab2501d617c5ca2d1dc89233817a0b91f5a8a2d23aae07354d5ebbe97a3dd9c00", + "10af988a9c826232bafc857dbdde32c76cd6532d0213f101d4afa3994da15a261210b9ae7b69273b538fb6c3deb17cd53113f3b1cb01ac9e8604d209cc78cab900", + "6e858a10f3ddf96b2fd8d49806dca2dcb0745979e288c8a4a913e7bf6c722a531d285d2f081164d414af64bfa8ef6c8c9928ed7d25cce9bb28a698582802fa0d00", + "3b1ae90d38869d522cc70e6d4a51063bab5eceaef100cba3190c15dd63681067700cf336565409075b825e4031112e1eb0bcd209a7a0f5a99eae804b9599104601", + "4bd286c40792b96bf0d1588be470b96d2fd2e4ad7ec3d48e81fc129a95274b9b5ac15138902cab4112730ab83767dbd9845fb3157dfc89131a5e4f36fa63fc0f01", + "1270a0b3f00f41e1f10eb53fdcb5de369585bd95a0900231c7e7f03c2b0cec942adae9e17a043774bec2e40d36fa15e4c9adfb9133cb8ede06d07f840137c57601", + "8a12e03ae27a954c4f8e865fa6428ef4806c40391015962d9ed151a9cfe3a87274a3b1095b76e47aa72e01512bf5d412caca5e336c198f82db668bea7abc452f01", + "1ee1f0fcac14db2ce6203065e58f80fd7e518a56904dba875928baac48abf454513225dd572c9d3c28c11580a7b480dd8c34c24baa2a895ee5b61b0613ba507300", + "d0bd8fbb858f52de5f38029c5251941a0a2cfdf3cfaf8da684db747b4470f6943fe545e9c31a8666546d5d1b67399fa013394418f638de3fdb54d93d68347d2c00", + "cc8842288635cecfcf885db9863a870674d37285a795a326ea11ce93aff2aef0372e06054831dd776cf0d986e7e01a05070a2572bb7926635fe153a464e64e3400" + ] + }, + { + "address": "2Zj9ehnjn7c2P9AcoxbvQPBiX72yjHEJaPb", + "bitcoin_address": "17nM58J8nMbsQrffdEyJ93xC9zGMAhY3iF", + "secret": "8727e233f4165d2cf3805052e9df916b81a19d2e859c48e15576fba347d4123b", + "public": "03ec84a0cebc8c690f106fde7df91b86f7b7dd2bd6bbc15d19b6813d11bf523113", + "signatures": [ + "d878d051562f5872f20cf27067b54b677a7ed2ab44e4b88791933369e632993244d88b54060d3253e60afaffc30d8f89b6de5fedba6c90dad01ab9680ad2796a00", + "fb2f87e024946cbdeb11fca226d0efcbdb7d5c27e24b260bb1f6184bdb6446881917d5ab8e0f780fffa13b9459c6e751de391b3d7f1c61938736f8df5550534401", + "3d6b8527fb2b455a6d8565bef090728d3e0ba88b5f1a0599d296d21f268763120ab02a9f3521a96c4e93ad369080db860f6c00da586e91664e5cc410d9b6e99b00", + "baf8d8164e225bcef8a8ded4d54980af405fb6ff28281a16f64586f78a1a0d82670cdf6195f9ae7bc2a7ae9d9f5e32f81e5e6623e239005f4db8cf84ba85c10200", + "90f5ed24882e6e7dfd4eea059e3ac3d2414fb9d1cf7f58156be9e194c1d35e1b44b063a7c81c595d7e818ac6b28aa4aabfc9d8dab2d9c34310d6432dbbc5907101", + "cac8341488306402682b33e723ace25e45f599520753b65f0744cdaa64b14069255126d9d7ad18e219794165f6b723c500e72195ac535a554092444b0c9ebe6000", + "e8e3a8a6937abe48b730de30c5f486f9dc583f7054315c8c96c51e54be8a76772b476fea0543d6f825aa02fb8fb6b7b4c9350bb33889b16eb968fcfc3a64678500", + "cfd8a7cda65e598602bb91d522bb328a3a273b803b6e0e209019987487b1de7a52a87fbce1a87df47756a94ce97e3c51d6f4e66703f2c4893ab11304c407e56001", + "206e31703569b50ac2b2fe0d7d128dc53200a7f84ae74c0cd5153271e9d9d4367a9ad4d7c6b19236b836394ac40a1723468f96a35f4e813d4dc499f50feec2d300", + "7235cdbf150eaf66951644d4fc07226997c313c33eeb171f0bffc5548223317a2c6d933f970656babddba290e044a03d880eb5cb2d77d3036c3f925dd9b7a46201" + ] + }, + { + "address": "4DueLL7QCMVrwsbR5ydfJ9pnR8vahYytBz", + "bitcoin_address": "12TthuZ7jdk5tVpyBeTvPoatBok2aP6hNz", + "secret": "ae81bed68945bf50c190e743deb49273168569001e452be70725e1d4844594b4", + "public": "0295546a4287fb64ae8077ac4b8ea13768122654901492f3920541d76bd2b7acc4", + "signatures": [ + "bdbb583965e1281daa47dc4010c30251dfd30473e44348dd9111d517117f5d4b56c6ed8d137e0eb0e68634e196266c0c8de51d5250549a760c46d1198ca7795a00", + "be84724248bfbe549ec32ba7c06ab7d40f0671248b349e9b4587a248a2459cc31f0fcceb2da8a5d5715dbcd9ac92082029bec9ebef4c00a59f18a5fbecd81ab000", + "c215694fddc95dbf210c4e6291ffec12c2dc431583159efbb0ea0edec08549cd27ba5a682b07fb1cc97e6ad92cc8c41fb6755ec2fda6edae10c575f93a0b761901", + "b23e9e76c81ee93e6a27e984bff91cd9546282cc55c8c8bc06502715484fe0610692f71015579110c1f96609550e7d4b0c30ea8fe291c80c73e65915b97644ea01", + "d0e910ee5328f38fb8283e87e7e64c38a99b2cf0e3ec5da096b032d77ec7be814a110c66b1e13632ff373b56c5a307d013d636aaceefa92f9683f71ce4c7478901", + "021a0670aabb167b9e7f184501247b031cc34492e2f22565b3173aa7091ac49f64c8f2535cfa4855ebf8e4ee1e522cfc6242ee87cb75cca29623269a954f465701", + "aa9c6f5a2ade42fe2f520115508c9182fa9652880511027190d26ee56ef088134d7689ceb3dd7a1c6350b8a49817759ec15b9d3ab7f0514ad51446902b41fc2e00", + "14182c66e730a7a8c22746abbb683d2f65a4492ed644e835aa376d81d848edcb229b813c89ce41bed07b4114b7d8b558a7b53132065bdd9769c228d195a204fd00", + "4036bd33c3b8e0aeded4275d0d5928c71e808350ef1c6926987c5377cc48395870169fb2987db63a5641080a2037e9fe5881b8e38e493063727d31327d04952d00", + "8434cec2a8c8ec3daa591a4b2cfe87426b4b71d0ae5397225ff39ad01c5fe15e209ca7e4de4056a64f043b73b622ccf4d2b3d27f362cf7d7fe932c5f110d986a01" + ] + }, + { + "address": "2XUMdVGXbHaBmFBiYcfwssY5vXnQTav3BP5", + "bitcoin_address": "1HkYVzNq2SJ4qBmLsw4uTHqDn1Y4LtBa9T", + "secret": "312483999efe5e2a416a5300c9ada328cd422b8eb81d348aef76b1ab254ffa31", + "public": "028992d0ba3ec0cd066223a35fc6221c89433e373836e42ab820909dae2a7649c1", + "signatures": [ + "da51c05e697d2eca9f130713c958e0517d17a8ff829f6e6e7df581c74954b1b75d475bcbe3e96fa64048fd89cd4f5abb418efdc780ae1fd44553f9980ded225800", + "d77d1bb5711b9f08dfcf7f5cc69aa3883c34b5a38dfe428aa705ee2190c2ef6c4a1572e07348616f57f1a6133161136278c39a16a421039c1ccf6de16a02431500", + "6cef8f2474eb973aedcd8e86fbf82de5245db429408e8161343d681440c08a0730fb6f80fd42ba3f10a74a784b18e3cf7c36a2cf89bae3446f0348904527d55400", + "296ca1df8fa846a321f4ca49b76e06e2b8712bd4a7276f0651c38ef1aab9af265c411d0a76dc499073e7be7b60033db5cf2dd85858311c17dd9fb7582a954a7f01", + "3528f0101c5dc155c9d68580ab804e424a6bf81ea85bdd3864ae6eb347960aab33b20a3d4ac2763a2bb50de1b5cf11362086a5659e5859c7d6aa2d64d6a489e501", + "3c18a53e7f1a1d627435f685d3dfd4b7ae2c40ab4b43de1c559b5f8dea6c44a358fa73f0fe004fc42c1f660b711215e477a3752dcebad0af01a4d86b7b3cc91800", + "7a5d1227d136933f935dcac3198ffd462d00fa9e91d76d071d69331cdeaa98a33ca61def907610fc121daaa9d552f872090adb31d25f60023c9dba8d422c335c00", + "a3738eec0537aba0fcbc71627f588452b7401e5892939aba2119e1b063902da55fd912777e1d2bcc61944f77236efd2d7a84f3817b1a996a320f71fbbc7dc0c000", + "3afed1e7749b9bd23a97a55bf9e6aa9f9533151ffb731afa52455a00ec9f1aa9575369c0ce426d64830a6bfa708218ebd337728b914297002db298f10cba9b3e00", + "b0886b57153458794497fff860c70955b7ea80146ef30e413300527f547798e3775bd769893bec65c7cea503d4fd8703e08b6aef736027ba2feb06315f9b2b4000" + ] + }, + { + "address": "2f1gvQUSUucGZ1xtNcqDb2QqT8mR2YtJF2r", + "bitcoin_address": "1EtkQmyW3b8s1YDrAfmZKCg5wco8az78Hm", + "secret": "435d065f46be884edaf18ef9371ae6b9723e0931a45551447826368b3b1472be", + "public": "03dc267f778651a06be4b14f2a47063aacca922a218a1f984f224a8ec55f6b8da9", + "signatures": [ + "2c7ab60525daea6fd2bd2a2944d3f7ac62443f2c5f3ca4dea2252a7bc6d7a7520cf8e0e0e29167cdca142e1c6106b0f723d9caeaf181bb7ba7be3d3dd049053000", + "49dee8cb5efabb28ab2bd248482d913a7de2bce830637728e6926ca6f9607a8436eecb06aadbec7eb8fc49064a73d48de1215d2541e196f450a870565dd8562100", + "1ababc8f886af10ae76d167a93c6a6d5049c7d2b72257c6d51fb0242fb2d13a027b92c76463e3981489e665b7bff2707c577d960cadd5b392aad117f13e1218500", + "8461a17909adf7e7ba21ba08f9a351e3f059cce7b81458121e432a1b07c2353e46c874dce95d02adfa1cbdd723785eecabe93c3a65ac732e497a6a0adfc0350c00", + "3e458d37cd58a426d176f2e3acf123880f44607db8805f5cefd4c438c4eb1ed779eb69fd65dbba39d91cbefc9f54eebe9322aff7c8989f506cd1bd74a05fd66700", + "6658d5242d1fb860d4de1d54cbb6290893990a84bb139a9b79c50c20fa8f5add37af3552601645ac8fe35ad5790ebfd8fcf8b371b9f862e67e48b929bbba3f1800", + "71b2930f5e1b703e90d328f65164673a26558a3126ead81d61807354d59cf91e622d19725c201ec16fbc621feb5679957bf710fb5d54935673e8cadc4e25be1001", + "cc4c1e0fdd2301539ec0ace1eff47807af38c26c20c0b7304abfa75346472ccb38dedab61733895911e37591b35eae5be7daa554f22e75baec3f5b9b158d758900", + "5cac030ff5bb66bb091a86693a2d972540cfb61bd79869a866124dffb515f50907f7c90e99e09c04c3bdf18b7aeb5a82d5d9d983e2993c01a75571a335c8852101", + "9758a5917b51e9989f476eb9fa051a32d2ecf19ad6ddbc2aefb81ba95c16e52d3dc528db27b34ea150344458490d58868e5ca493b8ad4cf21dc356e776d0d54c01" + ] + }, + { + "address": "2QnMSr9PedSgf84NreugQJaxnaGJLHY9axQ", + "bitcoin_address": "1ELDRCnKJTidvyAtN62fKUgeAb9KSToELw", + "secret": "9e3b1370323a9aeb7ef6872489f3e33a0349235854464d656ce4b0dc00ea56be", + "public": "0255538dfa3b6c02635b667704512bfc4c3d33c48dc878d8576076e530382f34e8", + "signatures": [ + "9e40e30eb9ad0d99b592a148ba1066542651e04e90bfc30bdd98c258754ef77d500d11f51ec5eefa4a1be570d12cfc580bc55793fe430e75e31676f9b2c1bef901", + "0f19610905349de8673a6c9ed78158a899f6fd25a37efd22b9657af5b51026246669112914c6d203364456d8c1ae06d5767bc12ee51e91608bbf8b54ebf2ae2300", + "14dd6d4ebad35dff18c60df85ceefa17a03a9e0c5e2c004cc0ecd29ca8096e716333d8e24a32d0ab3cd74ac7fe917e4ebad00828c27093b6dd26eea20f0def4801", + "ca337390ff73808c302904675b4f954b6d4be500ed1cbbe1536693f3ed185edc5973e64764773763408d366d7dc80c209fb3cb323300bed542c359686548046a01", + "5bd597d9019853d5d13f89d55fdffe6a12e1f1969e786ce52aef28df44da1b04595b497136dda48e5eeca2b19741d3851c08d51b18a994f55e1c45bbadfe9d8a01", + "90d711499247f36f3280b09bb6fb9d1a9e89ac3b055bb59bead4c08945d2f9de59f0d6840314ca4641d39a80d9ebdcfc6cabc603db53cef6fd12240c576c7f0400", + "9f742e202407c4fc7462278dc4b8382ed34161faca80f3015861b8cc9cf9b1256d7017777e2fc68eeaf913725dfea2af2cdcdac76f88415dbcd2f6e65b9ef98001", + "20fd3fb2c83a63f69a7fc021d8cad22bbf9516f4b1f4053d4e032d5089d644c638eab2fdd8cbd9a7e5e2d797cfcfe6426aee8bb570c6799eef48a84fb333e24a01", + "0f4135937cde24fb32c92be875d39022920e04d76f0a99e60328556570b2250b69df184f9ea803c9cb720d441139d3369e29a4ce53252d7b71b015303d6cf22b00", + "2cea41e7728facd686876fc173ec9f3b82e243db23d284394b46ac929c254e564a58772ffc1cd1ff1940d0dc5ad7969f134471ab408acea0116c1bf2346befcc01" + ] + }, + { + "address": "Zi6vjiuB86UidJSxPnRnLuoQKNqbhKDTQX", + "bitcoin_address": "1KG4D2TG8R4XUGo5nNru95r1wNVNtJB1b5", + "secret": "a7d72f9c41978b79e61dcb6de20d05d31850bbbd5defe2e594262157292eba49", + "public": "02f947801d035fb531c1859be4045d3d6f54d4df41927277a42040c25ace724972", + "signatures": [ + "34e7d96043aaedc7b18d19a44934e9a59695bf5cb2b8ce04e845b6d5547103f046150acb03a3d08dceee0648a96d0877b7747d07d609b5bc2738eed78406571101", + "9eec6edabe7cc6c38a3c8f731aa310683f5b1b5b7f18ff597ce1cc85b69316226bdb6a853054bd0e0b07f7b6e95a14c1b331ceb47c42c7de0f64978e23c3f89401", + "024c006a48beefc070dbda72b0335726bc875143330cd5a5063b5d36bf81bfa971cf8b5bd8b0a097f9ce85b5e1e32d3516b9dc7fc18b2d07f967d2a0a85404e800", + "fae32316c3926889b4a6c351e32865c5f619e84678db65eeb9a8b97b2aa60859246e416af3844a9a8d036fc95cd583ff6d194424fdaab1a75d6302bec4d5fe2101", + "c8e1782059a35a98d0dc23ddc45a29e6ee37855e7ffc3a2db02ba548be82943d4c01190bcb22d8bde6a18545428022a5cae17efe9b1b59bcb054190016be55f800", + "67437425c618bc99fc2b111ac534a8337db17b07f05c2dc0c8699809de0c69ac5201bd0ce83d4af61df6597f0aa819c66c859b3fdf07e12739494e942dcac83901", + "7df6c5bda9dcef9a81ea470d1cf0a6c465220ff8cdc9a549021e02fa1dfbf2aa16f2434d181db5ac44ef949b0447bb56ce0ab2cf43e0ee6c7f4835267c12d48401", + "a55b5663ec5c53f034f45c199ca720198e272d25012444d6ed1e2c8dc312223a084126d0b7b0cb0dd9753fc68d3a1c3daf625203756c6c92a924aeed718680e600", + "c3a346976e04f54d750dd830fdea864495e3ae80e1a3995e5b7852db907cac1f454d95532fb7c536daf11003987065fc835414b1a19cfdd9d08f4332ae1e691901", + "53022befceb0a4f6de14ee1a6f287e75413614f4df77b0ce4c1a1e8d85f8947e7ecc9ede42ba82ee06f06b4a6dc70a25cc12fe9ecc6f1c4e31350980140144f701" + ] + }, + { + "address": "2EVQ1xmJ6A4iHeZXRtD7DawoBoxX1vRmBxq", + "bitcoin_address": "1E8ky3Yft457oH64JyNQH8DLBKBgE2cSD5", + "secret": "04ccdc4fb9e5d77140a5ab7710b4993f9accbca372d142e358301f1bf096e05c", + "public": "03fc5a8249345fbf2b876f4d0234efec9e88b6a9b3a6ea3fdaede839f0520cd2bf", + "signatures": [ + "a47efd9e820c974dd9107bbed207f6324c042a21ff0d41e323f799974ea963282fe800b1f1067d8c7753b3e666dfff01f2bb6516121fd1cc3afdb5ed2d45ffa701", + "39b2a9098ed07c55e1492ac28673dfde7a9fb683bbc5c9ce62079c7abae343764dfe618112bbcd5805226e9a45a98f8efac840d38ae4db420fdc13e6dc9f05a800", + "a7934bb9e039f1ebda681cc87c833c7158666a9cabcfde5ed95aad53f1fb529733daa506e7f65845e4a5c7891ae059d62a52885010a4113d844df2d03acd17ed01", + "d8dd518bbf0d921954a840ca9326f9eef5b17eb00e4c158c03b298426f682a55077685305337e06a1d5b0ed3d48be76e6a404eda1bbf4a0f58bd84ea0920a28b01", + "3787c025ec0a21ef202b340770fb21d9c5204d969feceaa7639316b0875f0a6875db7554b4cf67c476f32292d7415ff07eaf73d9922e2639890d15dac3fd2e0200", + "89dd0b2bef097e4a7da14f90bca131005084ed954434627ba3c9e904515120d309a0fe9ae64c5191eb483d07a294ac37be0d53153d511dcfe8a339b79db1572b00", + "b559569007407a5cca128d0a3153a8572d8e8d1c765913b23ea27036955962470abf538464d519fcfaa4caadf9322c3f0a1a432ca5d3f45bd993c6965f4e63d000", + "15ebb160d7813b01269fd09e07d62b27b1665d243ee1c1be913595bccc6fe3377b46e2f1ce0fe485a810bb98c988d70b9dcf3a377d99ebe664b88a2239ceeef800", + "1ec59aa97c2e40a0766bc470b0a2079c58f337a6c8eca1372696785446f77b1b42704bec74c429eb2a084a00e676d084b175323dd43022f99fe513c17625d0db00", + "ed37c8d62f87802a0cc8e2feaa56c9ce46681d07f31da88c958317e5616b1278043e6abb646407909ab2d7f8ea880a7d89e696052a9b01da573a967fb91f141301" + ] + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0009.golden b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0009.golden new file mode 100644 index 00000000..0c81620f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0009.golden @@ -0,0 +1,185 @@ +{ + "seed": "vWqzW+tavumliuNymgNb1scvd3DxS3kEU9EznZRyjys=", + "keys": [ + { + "address": "dxJmhYz5CYqbxaurBDKndour8bKsX2BCg2", + "bitcoin_address": "1MAstZvnBScd1L8UXFiFTrx3VZpEAaa2dp", + "secret": "103bc41600c537a83751efc3b3375224ab5e50f062d5f679ba39a69676ddf4af", + "public": "028628228b9fa099df41f59a84685964e7b5b9aa2c2517027bc97163932d3f44e1", + "signatures": [ + "673112ab3fc33c8611b71baf4f5859b11f15775c619435285c076c77406ddd5b355ec1dc1091481ecea3ec23b05857fa5756842b19433cbd16edb98b276b4f3300", + "b884b685184fd7b18465d266e5c0aa3f715ef1ebdd2c510fd1d93985ed73700e07cd8967fb4bb41baac5dfb1b5acd43542368843571a8c2328c04ecd99480fc700", + "74ab28ea8eaa8abc10a60900da86209415f9c2da7c40c4dcae9c24f4a7577607264c1fa8abc18afbdf618726c5fa4088d074b22281419fa72042204da4d101f700", + "42e5c576f3c946efdf7433f68bf8bb08bdb9a4cd96b1df6ae21c1f977452565b144a0a3431d1fd01964c016a545f70581508ada70ed2d2e2471f61adb9fae9e200", + "d94e96c42e8206c754363103c1dab199ba324ca4a84382800cf95be2bb2fec4a641352aac50919a636cf60e21f6124b0898096b2537737e132b3a591a73631de01", + "462dcbfca20d8db7933e5ce611bbeaf3445be562df729e7110fb262651efb8512186b6b19902894c2ee0dd2749612c839976b6ba56b42d091357b9f63f40400800", + "1a7f718160e4ebc415679c176b4266582cdb59d0d3cc6d5844375604313513356663f148e0813fe02a6b4e657c76cb2fd5095a78048c639e431def9a0ea1f36e01", + "0c94e5e5dfe0ce864cfbf722ebe2e567f7b3b0303eae438f1a8fae2c232b8f95344ff2b43c1c5473942eda7e2c292b11c99bba70281964ff03105a1b916155f601", + "ee890cc57362d5adfb7e664671a4073c5d126b5da52835089916e45f5ee71cb227bae34bfa070ad0920bd9106fd0bad517bd7346cd85d7042a2ba88c029eef2e00", + "0199f28e2f9497c17c59e31c863984d7d4848720c9c151b6334e2c56dee15fcf2d642e073bfb728498342d9f19ea1dc6f9a4e8af31056e850405a5009be6f6c701" + ] + }, + { + "address": "wWfAkC5DRKmBesD3ycyZPLA9WUC5hKBY8J", + "bitcoin_address": "1E7TnoD76B8VAnNahgkt3XdYme5hC2MjbW", + "secret": "ec68100218702342e62a0138e49fecf0281e97214f224f3ab2591be5094764e9", + "public": "020c1e5d0e449141cd10910c9ae064d878537bcf7a617e6f694a9f377a6528b96b", + "signatures": [ + "74dd33ff9586150eb0a6566e31da608be6cd9519c0a373a10794a3f2b0415ffa2f0b4304e895b4d9c7a6a1bbcbd0e4557800732ecf39239c193e27738f432fdf01", + "d23c6e62b777c96c1e21091fea380733c223bd68811c7bad12fcbf9a159b84992c7b011e4152d0339bbdc4ead5de4aa1a288997ef3a5ad0bdaaf79653077df7900", + "237df8d524e32e90b2e2e009b0defe40769fb341147191b2ba45aa277aadf81068fe8f206ef713e674ebaea775385b053c85be37dc2490c0c4f736a7a1feaa8301", + "83157989273570d30d0221ccff0497c8e9837d728fee2adf2b3142e8f04cef2943410fff868ec9c7e68602e083420b29706d3926c2d397e1e1587c31a60c9a3501", + "34212857e85e5dd71748f02f77941550164b4702dc55cfc835a22cb99e30ece054c53f43a3bddf4ce800bb2aecb2ecc87137acd3ca8a269af9763bc3abfed62e00", + "5348dd18e2bbc319860ddbe3b5ef9627447718252a189ea5957982acf54f0c3d4d6bc9d191cc6cf454281cb74fbdc9e05971b712119bd39332d94a4d03340d2d00", + "14f7d8da4fd890f6bdeb978a389a65d954a82037f1a59a3c22a952d1a6071a5601c460f31a6cdd5b9749412d44b8399068c9605b18c9677ab89ee3d92fb74a1200", + "4cbbb3a086dbae9049670ee8b55e31ab36fc012ab22674b4f036091bb511011a5ab11e3500a47f09b0187a407cbbbcaa3b8addd885b6b0639278903bd2d64a7b01", + "c8db912171497d49570aa43ccb6a5984f25fef8f44dcfe6edf4fae6e737082ec03d531e0f77057b47dbc5e50af5b67b74fb8915fa802f21e63c1db9125ce579300", + "d13cfe83aa0faffd130cede0acd5c6066c333474e7f2a059be3e3c27c081620d6f5fb985f4f595377332abdad3de0e27db9ccff7dbb24211b7375682c46f3d4601" + ] + }, + { + "address": "2NpdyMGSis7pKksyJdw2Lw9CkLxRXQ4mXfQ", + "bitcoin_address": "17oq2UFxc1MQKua35heEuVUfoJQzxFHgJe", + "secret": "e08ae8786cf4f17a7b6024143f7e99261b0f30f240b4a4eef241051f4b051c57", + "public": "03185a63e2d55ae868e815e5ccec398ad955f5ddf8f7f5878843810d22a95d8749", + "signatures": [ + "5d97d0bb03d8eff8cd742665a59e6cc7bee75c809f46396b607613e5e6bca6a84aa089f7cd8f53b18d6bc3068493ac1077da6f818bd65e18457d5b457549b9a501", + "66db0f30c1e6ede54bb6f70fff659935ac180bf41d62b2f3a649d8821d90e9f9452393d0ef245a4b9070a3e7a93b05fe3933ec5bfd3042ea3a644e77816e57a900", + "4dcd8b7df6aa6fddb60c9ae6781426d09f43b3f72bbc8c6e2f80e2f052bb29fb68d0541edf0bd7fc58b468850110fb3209742c3a1e4cbd0fa385adc55d76bf2301", + "b64aa7147d42e3e67617f21b5f49d0ce03dd5ff677efe922a57d783f438facb43d35df5d3f5bc6bf4418b12189bda65e791e837fab789f5765c58a4f3362758701", + "a61449bbae701565ec8b9101ffcb1e5cf8ccaf0148cc074649322d2ab07df14329b60562740b410dd042996d17f9fcf9bcf48eef01cf14439cfb7679ce49ace200", + "9ec3b65bd966d8d29037a74ecb0da1425a8bff15b82fb5aaa5ce85dfdc26a0c869d43b8073dc98d9871907908b13ed80997a11bf61724646d94525d0ca33185401", + "5764aa6b439d5eaa4ea629cc0bcd0d0bdfae933da8a4aa1beaf7ed8d6c751446784fbc57f0182c6f7bb13c33641dacfad3ca0065c1bad8c49690ba42abaf00ab01", + "1a48518590d1ad8fd92863486c10078b3c1703037cbea02e81ab17c41f52e8120b394db294c7ea4a4d8c9e5e735bd30c3a1574125e8005b80b2d429c4baa764b00", + "12e8b5c303a9d348bfbbfc7ccf5a74e9c1701482f95d818f51aefeff982e18ad0e25b86221553e6282be68cfe384ef7729cd716b3b66e48863fdebee137d2d8801", + "d9abcdf0970a1b8fd7721fd8bb7a6f2712cf331d04e300b7cb0a12caef919d2b335bef5436cb624cba1aa669df168840eb80e0f9f40c6ed180ac58fad922a4d601" + ] + }, + { + "address": "2YsC7EayfSJEMpH5tkFABZ7NxksBxUcRKFM", + "bitcoin_address": "18MyBDnkWSq1NCmaLQkq9Jb8dhdZBWmmmh", + "secret": "d609d3e43e182e23c9414e10427b1c8437d5de881836ae882819b4ccfd39ea03", + "public": "028158909c3c9e59135b6019738c31acba380d2d42cd07b3bc0e302fbfae9c3ed0", + "signatures": [ + "5de888e7d8889d800935e92430ef045b4b61896ff9b400edea6a9f184e56be5954ba6dd40388a43332cb2515553e227e936c3f39a40ae7fa254a37dfd478a89a00", + "9534f206b47c69377a9134a5a372817e68893181d5489f411a90ab47748e7fb621b840c0d2a857b7555f266611960c47814d3c9460c6f0ee33b688a7a95e0d8d01", + "fdb21218173ee37a35a864e6ee685b66ca3b3a62275499b5050ba9563203634f7f4ea6988aef0cd05b504e0a4f090a341d3cade4fc72876171a41d4a8e7900a001", + "c444d5d828e5d9551e6c85a0744655d75fdb35c90174557c442f6866130489a07f8d3e72ab8f1c4937b5b56174e83f1f0099fe8a90a2034a30ff33a58cd95b0a01", + "7b105ce2133aa4f330c7bcef90473b0433ffb8f15eff07533f31083d816a05c86e18e972ba8200db9c173eaccd57658d29e541805c467642b7c71fa3dcfa9e6d00", + "6c83b4cfaad9fe84e9fb6221c96f3e3f7a8a570d912df042c17f01877fcbc5755b52aacf432a0655461446c25ebb6668828f2c93930dc0c25cd0625204fc6f7401", + "a524aef799f60bda7106f53f7be4f6dfa23c650f0183fb6c8c7945f7a1091db10b569cf203541516404853c6f84b0c903015bc1ea4b84689f76503af90819fc801", + "64e06be4685c5f44276114ee82eadd0ac0fd2dc32e06695aea6b9bb1c4f539bf13a1dbcef6083d764d8fa1246ce72888fb242e5e2e2fd40708a1101f078f568400", + "0405169edaf9044e0730ebfadf22bdba6d29433227626eb1183b4e1fad384bee129c911097fd5b5996a045a39b75fae33f20d6610f3c160ba6c9f7fa61afddad01", + "3a4d6eac4ae0c420a2b07539deea5b9703816b8f1c63ee015e9300a89192035e4a6bfdc1c0764268b36f545ba40dc69b0de024fb89b367f74f0582c49991f1bc00" + ] + }, + { + "address": "VWBgiD8Bm82C5scBT7ouJXUdCt5WYBmwid", + "bitcoin_address": "1NJB9REAKRBoAnQ9dFrczG4yQsD8uA4B4p", + "secret": "cd6cac0f13566084bff6d1415a6cf5b481d1180dff8041f4b0cbbc3ad9c45575", + "public": "02db0ddcb741d0ea2e05d2e299a09d063456dc3370cb8ba32adbcbd5f2de195d55", + "signatures": [ + "01b8d8773c41c67426921f5668f6327f3a678119f207fbbb3ea88031fbc3928a3b516ef61495997234e59ed5548b5ed94f59f988e3de4d12f57bbfdecf2ba00000", + "1832e3ef1aa54595cfce5706271449f00f634ddf07a124673027e65bedfa3751377dc647490148c8a753c8458824edeeb7a6a1dce149a49cd57f04d26cf775bd01", + "a32e7217378671d22ee640ad993cefe1cd7d35dcb8ec8c4946a202246b8ddc837e0933dc6246bf061115e7adf77b1ea7cee2e570da6afd263c4bee68061c7a2601", + "ea42d95fdb6dab4c5df0cbb87fa8f893724d26b1784b7e19eb799f1f8a5facc34eef7b929acb300c953864ff36dfebab0e4c069174217c8ef3cfef6587f5644600", + "a281a7e62930e0ac659ef9c372ad192cf86db5f35d71c656b72b03b9b439fc8d551bbcd58b8904f8653dc4fb3698774cebca153ea664040ce0184be627d31ab001", + "83c70b8c70db7fcb8da6887a6c0d575383ceae53c28f904a31ee69ce6106317a23e6c764a23b55118cc8d52bb621ee3f9782165580d98bf4b74f10ccdac5f2a700", + "42ded223b124824f156a96ec2a3b39a98daa76eb845e365c1238a38f7b49e663286b94e55dc245221d85345497f223d1dd81aecbdec5613efe4c4ca901a3c9ee01", + "c07eed52f2b0a550e57cba0175ec37fcb71aca4ed0fc37c4528a01117c6a52665196310f3b56b8439a156c33ee67a6108cca46b7b6081c5fad30be432f2f0e8701", + "04faaea1a63d8c3fb7174d21785afdae0e8520a4bfa9e5a82f4915be48cd4180158490d079fa2b7633d4082c8f1ab2a25a9ce4e99690b08cfe95ee60a92eff8d00", + "12826d3405affe5552bbe42b5e9f1ffcbdbfe3b88b537ca1c6d52a53fce068f5482f9c9026b8e72858506d9b8d1bec3b1cda36878ce979916382e880af7715e901" + ] + }, + { + "address": "6d9MoeBRrPUSW7C88QFe8T83GKxKfd2CY2", + "bitcoin_address": "15aBq8xuAWsLY8aaC8KbGkP1M8Fq6otHtX", + "secret": "e7cba671232e76a905770b9dcfc280a0f47db8e37fd2e5cd32cf67d3d7e44c4f", + "public": "02ab3080b4ea8a74789ca7ba75577609de2961e01e583d8432f50e112ae1c6a7dc", + "signatures": [ + "0f15c8684f255ae234760053b193e2e3e799e0972f11aa7cd6ab62e29a4fba093d66356b08a0fc544a6c62c37b419e65982dacac87c445570a76cdfb3e981e2101", + "84e597668750e6c582ac72925d5f51c1ac43913f15472a13f45470d8e35ea6da6134b2d0fb356a6386a0d7bc95b4d35deeb8381d61e73ad852975e0c188364ec00", + "f2be4f437fb1a7f8e6ae876833d02a1b2407e29c393565f43cf28a6416cdc839593188c29d402479321d4cbfe92f0c70664bf19f550eba0c72c2e064727b93fc01", + "e8ea5937f15a16c93b56b60e527f14b343453a689b2fbbf98141775e7419f030190a32e8a831c4148f703f1861da656e93365cf6bb59aee628270bde6b6310a701", + "122ebc51724839413d8760e5b7e6317e7348e3c06690083baa2b5dda38cb103d3d6fbd0b924cbcdb4803a7c13de1b3a3794b464a6e2cf7ad9cc33305cb3e704401", + "e68851a6bbde68b5645eac304e0be24f3e8b51c763b0a5b3cc3b7d58b9ce1b4a3ff54a30199ad276a41015781f951f058eb20e513dbbe0097da5840821afa8eb01", + "23555eb3dcfcb3757f0ab11f822822da366baa4148448e76f4123ce944f0b4c80e1998aaf3e00b38e8efd33d8cecfab46901cce7655f37958d67d92b280e687401", + "46e956e8a6c12707ed890079afdecae1c94c5e39d3d04c312bd5477e6770e3274fb763ca342857e80358a2101e628e7d1a653f227307337cb292a005ce2f03db00", + "d3c7b3ebebd0fc24f378f1ac9a2f60bf9c96d9d88d64369f33fdb97893585b303d6cf556dbc12e991c336ac7df9e48cda650f4e5219696108f295af769cea5f601", + "9f8ba0642998c5da0c4691eae7a51a64120ab74ebce32d58fe8f0c11683ad06f232dd3f3b0b9aec0b1c53687298be5584b259bc7738ef54b247c6e436929e01200" + ] + }, + { + "address": "UBGqCZrRCWLNVUTejLUTmWs3ZjcdnanAEa", + "bitcoin_address": "1Dcp3so2H2zR5jQABLGgTD1PQN1D8ZcqMu", + "secret": "cefc013f3eef428213011a542db07a220e85b2ea978caec5c47170e2fbc52a61", + "public": "0316f70fba8d65a0f9f3e49b1cbbc3fd3ce83b62725a59ed85bc1693c98e9c0f24", + "signatures": [ + "e15da877661402d0c6c8440d05c3780591c61c5f46094258363b5ced7a3c23e565468cd9cda0a34be02efd37e49239d3b9d6f3fe64f53f359dd1dc52275f6c6900", + "b5dd04df253eab7c671b4414e1dc706f703016f9f545e4d765160fa8511e4e553ce7ffae05b9a527b84ffeca7ea531a7f8bd51add548305d3bff5273b3db6b3601", + "c3135db42f34ab5443ba8ce3e6833c24ca84100d3247fcbb71b8615dc958ee917edb1deb12bc9eb3c259d43958ee10a53e22e966ffeff4116a04714a88ee285c01", + "9183ca8eb77e2bed8c9a788fb13c0f2c834619edc7013f58ae7c7444016012ff033bfbb32494cef26f0e308aa69d4c10cc92b0a8dc3da23d883319808496dff301", + "7ccf91f8222c834c99d28f79d7f858c028150bd0f234fafbaf55a39bc1d9f1c30c39672373d94b2c66658c91f770a280882909717eb4e6020650cac801c7aa5401", + "6f7bd016f7130ce5f33f46da12046b1bc9a8fc03e5fed7165ed16b1eb96012b12ce6166c43af598e24d8eaa8e08c60923de15e55088148993cab843f7fac758001", + "1b62fdbcd1b0eeb42a2ea162ac8332607007d3e94c40d3f329fc5f06abcab57b493cbd3f4b490c5635390500c66d45f51bbd340899922aff54204a2cbbb1ac9d00", + "bba47fe6febf896cc1f9f02a34d77710a050adaa8fbbd9ef2b51bbffca08cb9a22146c0eb84099cf48b499715675417a486abe4de28f99a24a75e9bccc1e91c301", + "ec16b3721e1f05d368969b88a9cb476e8aa7c0177691bc080d5f698decf5969f5d7910d95360cd49700f191cf0f7745d01c09468a1061d28630f8b4f923fad1800", + "76a0ca994efc4714a3d1bf10c7ad81825500a2492ab5df87682acd145bfc6c1e234c1e6238254bc451ae957353531bf2bdfa7899e99c3f7eeedfcc0d3d35a9bc01" + ] + }, + { + "address": "28mhRTjG2P2fah7AJuUrBygpxhmheYy4qwi", + "bitcoin_address": "1AfeXSrnGF5tVDXedZjEfz9WkH3Pi5BdCW", + "secret": "a5bf25ae3ac443489d23aa9fa45810a36deb19fc56fb67d09ca920868ee81933", + "public": "02e2a845979adc6147886e594728f975b3121fbeae3bb5e026a2b2738c104175cf", + "signatures": [ + "459509346729140b8534d06867f7c3885a59b38ca9264ae6243e83fd71ff023631aa62a9926ebc21b164717e227813c0a84b222cf7881038d7692c208f1911d300", + "36dd71d7c43b438be226dc6bb3d1695162da774d4aa9d73621ce40f17e71d59c47129046201b7f7ff42128af0df2b8b1075d3c96135fef755cd50d78f443965800", + "e3dbb279b2df949cccd238fd7c9682024a7e86ef4be62c46c21d1a5add6d5bd75ece28373bf65ef0ef01e35873510e1bd6d632390c1d0043af57ee6fcb8e423100", + "21bb5e11f34214dd7472ddccf0e156ae8c2a3b2519022246ba77f2ba804593ee21fe5b20dde87ac0e60948400187cbef45b70ac20f44add46cfd045d87b839ba00", + "f8ae837a61c9a083e366417f0e4be2d43d490add9d34ff4c513d6222194c16232a01b51b9205946f4cd66a5ba69f1ccb6dd4ba3906ec17711547378545d1be7e01", + "0393357ff49e2de374492fdea60319320c37ccbc03e7e6b9ac42ee3422303cfe0648c75c57d3062b5c33634ab0916baa88a998505281287e99ebbb000cd2e42301", + "2900df4afc8b3a123c0ebca53ed6f6398e5172f5f9676b76efd6dd2d5c4fda68568b72fe2cfeefdeed89fa2604d7bd6b3bc9ec9cddb307832a2d4368d863bafa00", + "f10ed20af67fd8a37f4100885e08195460728c89dd5651047e658cc679237c445377114888c7f4402140f2886492038be603087cc921d1baa2ce5ba62e9e40ad00", + "8e00142a82c8259adbb209104373e52d7b3986fda2a29af86e4915706675a35b3af0b4a31002d263355d47e6072a7959d4eacacafdffc5279f6e90bab4e6a84e01", + "87f22431354dcb7f1484d18a1207365d69b69341bcbdd49dbb76ad9ce53cdd3f7c806f14e71b3f05fc1b43726b3be409cb4b06f2738553c61e2ee7713898157300" + ] + }, + { + "address": "o8KcCaEq7rUzk9jU3ej9NXz8ySGoAsM9wq", + "bitcoin_address": "16AMWy71saM3WdkKpUvXgcKbFWVkqCJRNP", + "secret": "a774d84ad42813d48f293e77fd9d872d4bc5dcf94a968fbac437811a37e0273f", + "public": "028084b66fe7cd20247fe319bbd62116732e22219ce6ac0c38b10ee7df6a5e84ef", + "signatures": [ + "1f173b3cbdf6157b181cb88ba8fde5490288b1c994eb3d15dd64109207aa330a1eb99b8061555b30addf7e5a1410b22c1791ec979e9f1e359fe67bdf1bc331b000", + "e44ee5d90f91ac62a4b08ca7adabb3f4fbf242fda2c60db76730788a1746012517b7e656078c36e6d2aed28bfb65cded94d4f776c7f3e339829668e2d24fbb8701", + "684052ce6947cf8ef9c661c317136f087f8ccdfaf8b9e9b309c6e61ea43ae09808fd5a912a45e6ac71e4833d7089e1b610dfa1a67e2e3826722a145efe7ced6501", + "673ce36127a13f491044262e8d238aaaf5dc806bed61d7999a262ab215aff64747c2440e532d8bdc6b04b889aa856e0e53f2fd1bb2bc514854e46cda7fac379f00", + "2ac98375228432233fb3d2d3e3e985bef2e46b65a906300f759f6c5588f30d21656385d9a48412387199a44eb21ec2a9da4434e981c5b6e1dc2740565a381eb601", + "acba6f64c54168e9d0a3dfc01b52326a2c2f18d3af10ca6ebbac6bfca02064147887a6cec9613dcbbcb909de55dd5870561c4d6a98683cd1bd34db16c93f6b4a01", + "9b0b680d306e8f196fb882c8ad3fe3591486b19487c5ff7c5ede4a9c86809da6586d28e62bcdafe4bf6d1f48b0714e8f876fdc9bee9c5a946db34d095fb66a3501", + "5c1a56d3fcd09a8d749ff6e69eab86c3a850d9ac4cd4aad1e650c7cf83545cf22192288535eed8d67b1bcd49ca0c4d3ec950b1eac2d1ebf52d052ad46323f76401", + "4ff012ec8b1e136eda5d7638e407985ec6ac20932a60cc9f6387cfbd07e5eb8c6b9e991876f1230008e76b9881425a10f74f731bd67b95c44fecb7239cc215df01", + "15f1b3110921e7113a3e2c0153699c4932189a9f11e08e5e780b171eb6b3dfff5ef5c2b283ef0883ce128c32323efe8ae4aa240d70113ca0103870842e65482701" + ] + }, + { + "address": "F5b64tWsytrtoTB7Gka3Y8gL8bcozi9ZwC", + "bitcoin_address": "1NmBTxNGgVNnWk4fM6vgP7cuFTmBAXSNRf", + "secret": "c9da0f4e53c8299fc289eea70a8204053f8e2d357496bf37673b7a2a09606239", + "public": "0249ea059bbf219d4e5fa61b68009dcf568a4c3b8838281066098c9c70e6302e14", + "signatures": [ + "2b6a68e36f23bb4e70e325b74df03af03507c617e1a3f2f3d9ae9de51684e69502a1d4b9d4576a58851c3c30dda5098fb5e483c387a6791d220ae360fa46db1101", + "9bf76435655fd5517083d56112a85d6390f2cdb29ef0083b72f05fc80513553d3855fd859c062c615197f85fa6ea2f64df0a08c05f6fde543aae1e5b06fb070001", + "b4b3d577b3f634171ff462e6ea1a5d7847095c9be3afe56e1ffb5910bdaf5993776a79fb0a11d31af5b8ad03fb82dd60852da5db60812fcb66c430b76e6590c900", + "aea6e04924a561febd89188d0735fccbc342d23afa7d4874a3fb7deec80e38902c85c386e2319bf165b28e07f8f2e5bc65d53124a2e18f3664f14f3156916cf000", + "de5a68867d648b90fb090b366800a458eae988401778295d6737161bc2cb403b7a6c65054ab8a63de5da6b78017dba1fb5225c6d49fa02b0a884c8139e00b6c601", + "b00a6f1b743f2ad3efd370c33bd763924615e06d9640d7473183822f8aa6be792dfca685286084a2d88027079a4eb510c49192da0355217685900c644c37a29300", + "e2c318045aefc3099a25545c35bad5c8b34a9566b5a5e3813a3ca0b9c82698e27209aa93d369b788d8567a9f77c47796060895a566c961652b606f40e73735ca01", + "707e73c79f3212dd48e2d14a807f59a4ce2cbab2d60f9bfd213f3253b4b37c962f66e7b22e16633bae7c6fd4cd25489f731b99f6a68062532f509214ca7593ef00", + "acaf82b616b71700291f97934baf5693a018f685594af570ff51e6b19bb93238174b5d5bd4fb70e7ca1c7a247b795817269e4a93c399d2e55065f9851e0c6d2501", + "7a6afd718dd5126b7a238933f0ab66a93f68bd83b0e233698706662eed4d61486eeb68af6bc69c63f30a6107584a302dd2f3d404feb35868f155b83939541e0800" + ] + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0010.golden b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0010.golden new file mode 100644 index 00000000..92582afd --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-0010.golden @@ -0,0 +1,185 @@ +{ + "seed": "58OY1/IoLeJIrfYkiwmSc3IbtSF/XwYHExUdRFPL0G4=", + "keys": [ + { + "address": "2SrJiwmXj5RmsN9DzCVzNFuQDA2ps8FToiE", + "bitcoin_address": "178VNk9bgK4XAu6ibTeE8BHTvJpm5V8ewg", + "secret": "646ffabadff7a510e36d37a6559b98c24956a62275bc6ac80fb2597985c1557f", + "public": "022b32f9b0f70ed57f356a49faa999f5bfc25f6f1863db2ee5fd2aa1cac0592877", + "signatures": [ + "6ca2305b555ad4757be898041a936b5ba013a0213c24b37abe5dd6586c1dd3e3718f1e38c72481c39d4733994ef2db85528d4307162923427b2cd3fdf67103de00", + "c33f4665e035ca0534798d866857da38b37fc7aa24ce2828d9639bd0cb88ee6e14fe150b016e1cd842a6056d2093629eb272b13b86afb71771dd8064f65a8bb800", + "fc2377a4be18e2c53fd277b136117468b7c8fd12d3abbe6561c210d6c29c56ae3afb4508d5e74ae75c697d51d578458e7b7310a6bebe4c97fbd51e9ab84f7fe000", + "40637de52a5d28d87db456c85b3854a4b73865fa3dacead32bf5d3d24349aef0680735f2083b1c4c0dc10d2f5ff8b84189ecf3c196ebe09d479587334a56145601", + "1265e4ecaea5ba5e80f7125e28fcd6a228e0899e53fce3fe5fc1087a1c931f28710662c01c1986775761f0ed677c5dd663c43b8a3db4e7c34414ccb61fc9daa801", + "02e14ddc2c85600f466297b5938bea2fce271dee37cc4e54c812c4040364e7bd3a57b5ce9839877b7742695c55c85de569aef2faeeac234cfda4246a0d21c0a801", + "614aee033e979afe8cccfbb568dc4f3b1fdb368e249f913ac12a3cd26d4746a52e87252b156dd3c572e1eec02bde554c0d5afb0ee37648aef342d8a401f3332901", + "79e3de5d0b0996e66cb2edc8a683a7ac8aff4a79ec4afab42fa4ccb4bbb0df4439c9e0ec9acc390c9b0c639f6be1d61b7ab9942113f9adeb1642724515cebe0b01", + "8c6ab61c14112eb77e0e3dc0550aa47a14c88bf51b9f3b7bdf40ee666330ab313787b54300c2f405bcca00f7f8a157426cb8b87984e091ba30c095704fdc27e700", + "c30dc8967b5c2fd418e7cebb7dc5cbacc2694da4b80e3fec197b8a8b54a9c517383a2cea7a07bbbc166f53e171d58e3a971e618c62e43a86bd8c529fea53376d00" + ] + }, + { + "address": "28EpfFX9Syr1E1DTtufp4rt6KHDKWJLUCzw", + "bitcoin_address": "1DC8sdaT7ioCFTnXR9MnWzem6XJQXhuKze", + "secret": "8597cc7736e6a039267fa3ccba8eb73360ab492282026ab8b73328da061d3256", + "public": "0276f2290c48973bd92552fbad3a9ac4ff433a8da13e13beaeaab95f164edb8ef8", + "signatures": [ + "403e2bf565bd10642a72ac10ecb868dd54f22413f1983c5dd8352ea3f5af2e3f660f790c200fc38d135f61c97169c7a6a51d77d00975e95598d47c19b7eab0c001", + "4d9011b95d86cdfcb867ee695d40417b96a1030afef22682874879a9a55b6cb108afb8963d5f89344e396b60e17ef758813a6ec4c669786184031e814c417e0801", + "7505f810db7cf603f5f370f0442cfb15211395fbcaa1876eab3015aa96e11c3d52b681d3b8758b878cd577c984bff55492ffdefd8979d28e355950fa7aa4aa3300", + "9b969732d7672397c3b85b9279a8c7e633f3d59446824ba3c77360c0a1f2d6f315d548aa2576b61285388d6fb1d6f33815cd746b85ab4baec28d3aee3ef06e6c00", + "57c1c7d20cabbf967a68356f806115a1e900211159a2a40dc6fa3420432523977443cb3bdca94911c04f9a15dbe87cae661a085aec6044e9c561df654449f36f01", + "54189224c9c02dc272dfb4474a802083e1ac372350ded7539db03bf60ab918187a2b63a8041e79e0b8bbfd2af09417f71f553972c914df8f956cab8cc4eed2a801", + "a5987f6d62982652f06f5cebfe4a83fe8918566100f9b28b65478a5100164ecc2b366f92ed006321e1300931dca8fa5661a906145fb769ea6351dee3b5215d2900", + "ead667dc0d71e3e6877da08dfa17720e80e372bddf067a6783ff723a37f004ac675d15229369aac75bdcf1875cd548b7b068a41d04b50cfd8bc5b07ddbb13d9e00", + "3dc279ce62d0ea023e13007c737635f752787ca6f5268d12e6347331eb0edb274d702d485599954ec99cea8556aca04d538c87695c2c1c9c1551288b047486f500", + "d5c31767dea1490d951cadc4bf1472ec341b83b3edcb397eb3281af60b48ad4d68ec1d3a192d05af7883a19eb955e2ce4c30db6a7387a708bb41f33d9300ac5f01" + ] + }, + { + "address": "2j5u9ieaqLQjoEru9V9sMqLPL4cncKJfpoU", + "bitcoin_address": "1PqiDh4u8eFy3K4SmekZXJp6YW6yGQ4Af3", + "secret": "720a01fccd31cc08832df230316cb89e619113d951475c97b9dc350122036cd8", + "public": "03ad8eec89298721e6f6da1ad420fe178e4e37ba6c5fbeb707375380454eda84b6", + "signatures": [ + "89272a6545cd40117f89c7e18594e5794a72445fb45752d64f9a1d606f7e69604992268952b136b192c0dafab15b9bb322401b967f18536f0f5b78c7ff75f38800", + "06b3fcef37e36255613a3805d31ca5753c1e11ed1c554d6c8c4676c78fd9c53b2a1b0d19ef37b7e8062a65d5e982fec61fd5097d49fb5198c376e914571623dd00", + "82359df3355f1823d03c0aefa5fe9f04f208cd7105f9ea310c615bc6a857f2c153f68e8b1e2ea4fc952c1dbeed02ca31a5f425aa23234ef31a1b052ab177ea1301", + "72ed2078e5bec03162cf64aca6eae363aaae0b402324dd74e7ff630f0d48c67d6e781d0f2612fae060577d827fd7987e4a0d6b6254babc3744c08a98ad85ee9c01", + "fd6d6acb517bf4b27cf1e6b03bb1f2b4213e883c4174c56b14c2ff429aace102214df6bee50df0b5707cb59e215eef0a2138fdf3d94ae01537b03ad4f20d279d00", + "491360c4d4937e2a1e9523051909639a8262bbdbc77becfdf82dedff9fb9c7710b7ac8b9b97aee6267fde5635d247e1c16a1a26a82c9727778c6eaa5b7e3d50e01", + "dc6468ceb3dd16c717549a68ce0d03cc3394891e9118663aabe2de125fea621c16de79f0864fd44b5e23c2058ed8f8e65156abd27e89bea63627afb4487e7af501", + "22ecb0f1e4b39838cb386ff2c705c22b35ee0a84d95ee5cf739a97d3a6bf51be245ae7392a89d05def89a5075b3590d2ebccbc1458371e5cf5a4aae932904d8201", + "806050af0d6b5d2b806f06927438981c648ec6ee3469fae4cfd4d64a31fdfbc57ea6347828cc15ad8092cefb59a738a61bdda7e823282472a688ec288da08e4c01", + "c7e31a146353e1273a1c0f5ba4205e743ed67da7515f1cc052d2c0c24e86445905ada83acf5ddf68b9124c8edb149cf96851f01d41b8a8515d22f0ffb8a86a9101" + ] + }, + { + "address": "2KoZQBUD99gg5jKrZLLycqJvjMvKFf2APLA", + "bitcoin_address": "1QJpA41HCC2GrxTWDb9j9FmxtyDQyPHVgi", + "secret": "5a04368aefae7f463f31da6955d7c08249460e3c90da76936b641f25f7c6ea91", + "public": "03ee8074e5474b0712267b0f66ffc17f42d130523ff4c3f78217532540c89f4609", + "signatures": [ + "aef0feb04a3a4e4318282c0b8d2bcc1f658470be785aa4a3639117035f7b5f357562f1167230ca14aee019f8c32e9c072299a8918f5a76fed3c3f54a40661f1501", + "ffea567262851e00794d58ff9bff182a19fd97862a4e0dba414ae8681ac8f03d5396550c2a867def5be17f5e38296c40c8b6a994870604ccccc2326c5709062d01", + "3d88280db03a3ba9b15929f0f9d6339c835218e60e82780b9a1becfdf674550852149d4e068f2527ae425d280bbdf70bd37ef98ce2dde4d5d3feddcd87497c7a00", + "d53f2a4c346b8c007530beb4c1a28904b0cfa876325cf9790489959f82d4ad74035d957cbbf335177912ea7278f45bf86fa8d47ed9929d78d43da6a9637bd1ea00", + "b02fc80ec2869131159c562df839971b3285ea9dbf3b1279835ade6ec0fc2110228eb443d743bfd1bca24f20308d6034f1a5654f2dc81df537f761aef1234a7701", + "bba9e94d716a041fccdd03498047d9ffaf55a28b1ba905915464255af0b883d03a109c7afde2fbcca2ec9bc2f9bccaab9e07898017d40882fd6be9d12423825b00", + "9b557e95d53b22903526cca3e17468ab029bcb478708ad88c3581f0aff4fbaf4328bb3839134933f3a252432f01573e3f8111f0bbac6c61528de302abf286ff600", + "fec6d86d9efaf625b18c0f48ac7856f1825dfe82495c167a0f44511e9cb52b5c1ac4bd6a5015feb5cabfd39a62f48da6d267da23e5a49d6a1d66c34cd9588ad201", + "1a3ad7d2f56ed736cfe7db24673bfd917bc582b3a63132828372da1def7ae91f5cf322f8d35aba104eb71004658ded222f6411e36079a17a1c7d99473bf2a8b001", + "e3faf295d743fe5e38c1517b1437bea083c4908004dacec1177e410dce94278a4477cbdc751cfb1497a5cfc9c6707ee47bd1e34fc35e0bd27411c3fe69e8186f00" + ] + }, + { + "address": "2YUgePgEgTrbACq7vrna1NXVGUzrBERj4dw", + "bitcoin_address": "15Ds5XSjPykJu1fcQ5LN6hTupgR6jJ2JU4", + "secret": "5674c557050ac9dd67cebf9629b9af676024f126e3a52e856fead1ff51521c06", + "public": "025358627a6f01a52f446cc7b643b813482ae3077cd3760385b6700d83def6cf39", + "signatures": [ + "d807b670e83a1dd3424f916a7226d44bf3c9c8cea11f6fb37fe8e96b031f95d52fe48d0a3649e7777cb003a03890c127020bb698dea5e4eba0dd4c3beaf289fd00", + "0437e62986f35dc27782a1697e282da1a7ed39032ae01bf66ed61fdca42e87821a8939036ee91a16ab7bc917d2aa74fb059a6961d8265f98fbcf209e73c3f4db00", + "54d9401e1d6e12f7ce81223ab450134e1a39c7a2077de5ce121156fd56f345f3240cf8b9803df2bf7f105d1db73d8aa1e275dc5926e9340d9c4398f9b8af929800", + "8f052c5c4b6093a88bd24c80d1bc783945ad34b71b00ddc3f5bd6c948419308954e20d8ad22636c082ea536a431c96473531899f2566b57de9d038749e71fd9f01", + "8ecf28f58913914851d5fe5a1181ae665a7d536acd8e3cffd55e1e37e1bc1b8946b1dfbd091b0945dfe944123ba3df27d596dd7866169f4878614cca58b0f4eb01", + "b2c4e3e9bd832da27a0766914652b48a3b93e66cdf558343a4fac554844b99da27d9091693cc8fc5c89f769b870f29cf56b855f29a2f7ee1130b1f51a4d11f4b00", + "2bb5c25e4cd8ad7353d64f5e3ad8c23aa213c71c60c14a207805dc03562b8b1928a1f285fba00eecaf2fe00825574c7cee09cc3eb06a510a87fe3327a2ed808100", + "b00bd2eb6cdc38d9de63fb3ac5f249cc1b65d0aaea101a096d3434563a930a837aa7bf3cc91d7a28c4fe2a0cbacb20e9cf16ddd0e2fd305053c69d0962ad434200", + "1443132e898aef931e53552c74e87a0226227a443dea6d656d02e41e2d03a27749c6f2dc39e0f1de5441d2a828f66b60c598c197bc6a32e0e670143e57802cf200", + "ee030515f8444a3f9abd4cf883fe0d56ac35e44e4a17f3a91619bcd9892649f31ecf607475aaea87b69bfb25fdc6f785aeba8c3f64eb20624ddb18020fcb8d1f00" + ] + }, + { + "address": "dVMg6FSsHo191yyMzvKAu8jNempZbKnkRS", + "bitcoin_address": "1DAVaZm9Xkty6UxvyLXTdm2pEGreEaXjCh", + "secret": "d5c59918edbc439fdc9237ea652127f3f83722895e07b82e5a5094fb628d21fd", + "public": "02697d387c359d57c492f24403a10e2ee47e54866ee381cdacbb5b7cf8ab6e1b80", + "signatures": [ + "a7e7bc206006583d3c9fcf9380c3cc9d3c405eacca2f65f8fdf1ebded73695824cb75bd9cbcd7446c19a45e907e3c3ce2bfc84d4dbe890280d9a41640a1fde7100", + "0e68259177452e77fe363f86c8dfa8f4eda29cb75400f05d1353cc5d7cfc64a36aa54a266635ba55110141a66a63c19429650d72a17f57ad18ccdfded25a264400", + "331e14a445fb114fe7960de531de1612aca3d6701dabcafddc155065e1f9322247a19bf3ff1e9804d4169e6f295215bf41642ac095a6e540e4161b44d660ea1b01", + "69bc7a31bda0c4600e66c7ac02dcfd49bf8ea99cd6f8aec851882204076b2eaa1457b47038230bbd6dca6ae72c404b73e3e2ed4fbe642b5ac9a22c214788363900", + "951cb4a095b98c49470fd3ad7befda82093ce231623ff346947e6eb078f3114020fa56918d334fc29ff724b794a7fe3698eb473efa95c053cc43b1a75c069a9201", + "48fad2b7d86a9b8b7ed87c506d7957bc32c1df1a56af9f2f2f44a382f182a6277766c39ef39fdb580a488393b90937ee0217708c3266f680b62cc980575957c701", + "40ba88d401efc157039d9b305a0ba136d7aaddf9fa97e3e8b11012532eeb8c2f72b910e96029e6a40ae73f15949c692770f95bddbbaebcbae1df67d6002f5a2a01", + "9e5889ba9f34e0dbd4e9dfa354533bf005ead72f170c00b562bb08fe40c7f6e0323b94e84d55637e5dc9b6f007240fc4fbc3bea7c8632aef1b6d10fa9c68d32400", + "7acffdee6552639aa7a1960a0c80366e72f28e74826d17cc4eb2804d516c57f67d2c015df16f5ec84b46963925b53cb3b9e8538360c66a334adba487b4a065ea01", + "11131aa556119bce1540e2820bf21925e5ee2ad16057a6ed3aca1ccb600697ae449bdd0b266838edfc8b02c82b01158035b041c3c844fc7995cc86ff5372749701" + ] + }, + { + "address": "25NJpLNrTci5BtBtLGzGzeU2ABvT9Nw4d3f", + "bitcoin_address": "1Q8x4maP4k43UCqgFFoPVyPnKkwWonqWYd", + "secret": "0d3ac7f674c3177de5555a6a0e7d97eca63651f686942111ecedbd00c586d03c", + "public": "02c18d3e9b15c91247a2c71ce8c2e27e1b008de4d17ffa388d34b35fb27f3ba1a7", + "signatures": [ + "459d02374af7e0547df8d3ac93bbbf477d9b13add08cea4a2c4a9d55e04bb9501ea2f10c8fc68cde1ad2539df321032fd2f2fe56b010a8afac91f65d63c1ab0900", + "da1e742628e40682df13b888c7b166220638af152120a18fbc3e41cfbc4a2b8c0fffda7514e1c84c0f9211e0efff55ef7699560e64bba76adee30f341f5edd5301", + "da1893f530c4fe952d2da3a56d7b5f40e29e24368c00bea9c6d1317287f646fa08d251e69052b97f7c1d4033936b00ade787de33e6fa8ef939ea4412fe96bfdb01", + "0b782c5ad45598c6678b11254821637c3aaee8c4677dcb38285793337df838924160101e905f89502d30ad3761b4894dad68b7d2601f949301ed5ae4079cbcb400", + "3355727fd4fc2342737c86fc1c01bff49cf1afe258a927064edfc48c2445582d1415b3c74fea1ad22c5d9df4bcb0a65f6e633b729dfe088b29041a013e67db6c01", + "c493605d78ca352ae5758c7b56e9d6b338411e2c78e3cf244df3f5182d55f8de32c3a8464e00de450320d6f62cbbf00719d34d9bd6262cae586befc2bcc0601300", + "833b50000dd4564746e3dd0a90023f5fc74eb443795d2f986a568196fd849fc41751145da01b8a6753867184e02da5e023b12b1638a06bc5e2821afce12c6ee200", + "fb702b3cfb5c4225e14a9f9c56e9959d6f73ad6b8cd17b127187127665e9ca035718e5c139fb2c495425bea29c9c65b2be97f4c642b0da60a37bd10d717ac9f900", + "2dedc42424ffa658049e251c9d0a690a31637f5353e5d1a0d423c1efa3c361fa47c54f642f1876b5089f7c059796579f4a556821f3aa2810678face35c8fe22401", + "6ab859b8b4cf7e047e1e0f8134655aec58c04d0ed86b909d4290c8c335fc9816591fa8236258144b5c4b44c8ce746a11b4e1cfb1b5a259c2ff3e3beeafa26c0c00" + ] + }, + { + "address": "21ryRMcQ4jvpDLv947JhNYFGhkBdPfTa7Ft", + "bitcoin_address": "14xyeb1JLKjD2eGpZB8FK6jHQsxF15urXw", + "secret": "cce2107186b602a42f83bdd37870457404daf2d327c83f02422a381628d2350b", + "public": "0240ae55709e29278c3c5df3eba50d14caf9ef73cce3329c05c56595384e801a81", + "signatures": [ + "f59f660e8a14a0ce2b5c866a077ba83529b466658293067c6d16bc3ca1bb512c1cb4923fd4011e23ab572714b7dae244cbbec5518570ca3978a04902adcc183f00", + "e4ac4e486160881d9ba88c70a3aec2c5b0df4e56b1dfaa8212be1e5ed52a2ac36495d35e71791418948689e551886704fd669b2981edb13a8b4b2f385ad301ed01", + "517f2f1532c4986176854141b4a1fd4da24f1a7824a534e1dfa7430d6c6bcff66808f8bd72223a4a8caaf636f4408744372bfe2bdab86eb7c86f862dca40a53200", + "9d597dac44c1dae6b8d940ff6fc61474f6109b07cd4cf036f1c04702c5de5c613b09c0610da9a80f386d2dab714d72b804b0f4404a59d03f8fa63dd9738ed1d301", + "67b3708f680fc77279d0c1e7e65ee6b009223f83d63be3cf3bd2f050110222ac7b069b8fa6fe51bcd18f8332e3696e89ed759eb6d3b01f6a47de09cf1f929a3801", + "c6ba13f4754a3378272eb6ef0bb8543c1c821cbac252cdb23ea3a5687e4672ab6e9f9ebba8f77c2d0805f4c72f81455ae5e91d5669c48cedef9ecc0eb7fce1fc00", + "9db0cf266b02ffc7715d53796c871f0b6cbd221d1d8e6da6dada54198348c4c446b8c2a77ae8f2734ef4209caba8173c86fbe7ea4393cc53021e1e0ff7b5940d01", + "2eaa229d2fddd9dcad651f375202e71168be4b350a1e897b1fe2f27f8660e60131129a497d90254832045c830971578e0f7c1c963b75ada05e7589679fa23c9901", + "36a806424d934f5200b94d16a531d8375bd75183e72b9fc060b3868610930b411e298110ce7d0fd6a3325d83b896cd224c9cb293054553b7a7b3035aaadc39c901", + "5d660629134419b57f48ffea9756105649061067178059caab7c4d285e6a4ba572565e9b7aa7fc8700536e25d7c0dc04ebbe6d50647af58c04e7347d9b3557c601" + ] + }, + { + "address": "2UpJ9CTUUzbSjSfByhiYG7TDuHpyuRCXmjN", + "bitcoin_address": "1DgFp47Fbn1zZfsq7AXsjghih3viLugJNZ", + "secret": "01776da713f58690c4ba654afa403ee43527a3697b32c898164b1739b1a8307e", + "public": "03b8f7b20aa8cbdb7b40de6426fcb4a5eb2517dbfbc6e532ec1612341b51a234e8", + "signatures": [ + "7fc7d6a44b4368ee439be43108306c1b78c90f401b7bf5806dea4793ed5941fe67c3fc8700751e21841c16b37f1a22d7ef354b85b39e73dbd38dac6c1d76dd8a01", + "5e634789d9dd8748ce83b5a173ec580a2e2483170f10e391b37e71fa1a0513d7407089d0e3ff410d122518b7ccaad7f39d3e6d87fc731259ab162e2e65eb2e3e00", + "15ba0d2d44d9ba95ff5477275b646d6fd129454a364feccc96eadda27666c2a9419453e2e9fe6890037dbc14d347813ba3cac14bdf11b33dc388466eeacacaa801", + "de5a67850d94ad5183c032b75255de8d125acb9ab613c3a678aa4b0bef2205fb0067b51ba705b25038619a4d99be5f9b6144beb0e758a070e0a5781d1f3d793501", + "60f137a5017662523950c544b23334d98f4ddd044d9ed1d9ae529394431f00883bb79088b7fa127a679a2998dd1bbec57aaa1e9abcb803540e520414ce69760b01", + "273cad4820707e6af38d07e847a579f297200cb567fae62c69ca68cdc0d32c5d7b365b2e8c74d74d802874fa98ba3d1d342246989d56eed0d876e4373cd82a5900", + "7ccf9b45d6368690c145d62acb788b8e1d0c555e8a8e3e3d396ba7f3cdf9fe7b3bad3bdbbc3bf26f5f07a9d7cffedd5f54fff4d06f7354fe60baae6498f0325801", + "c38ea111a10d599bee668edef517315c5a3a960fd38258578033ff9b8a92b9c2443e5dab03a7fa5596280b5aa8fda6c6cc0feb5c921d8cba90ba897d0e61c3b800", + "1268fee5962b4b33fe144373ecbbcf5a4524adec330e46144de4d5de7d7f45f64f26531869aea55eff07b8ab76a6b4c27e7e0582bc5bf2d0e31cca5c82bd60f500", + "7bcf7fd288b4f734ff16fe8c49682997126350fbd5df9537c009995a0859f8ce30c4748c4965c144c415af1f8434e4e2ec1023ca00cc793c55505c7fb4e4f94800" + ] + }, + { + "address": "kwyudpCciG9nTC98vz8b3qrQM9DP2pn9wx", + "bitcoin_address": "1Cvec3BJSb2b1k6GfSNNeYGYLQgUHwvLti", + "secret": "3bfecb42d2aa5f86043bf61ebb1ffcc52c3355e0cb5866cc6d4db80d467b5387", + "public": "021d7c5180dffb1d3e65a341525fe952d65627bb1e4d881777b278665b138419d1", + "signatures": [ + "d8fd20b09ef6f55bf0d668e9d70c42906c54551357122c363d1c8dfd427cb1fd157a47ba228f011e4654b94ac08239ffc955174c0b3123cd445c964ee81e3d3f01", + "40b439422c0be6b652784484e3f760dbe243d2e0639cc2d0b26405615142a3625c1bdd3b088e1444b6f350a01c3ea58439938d01dd0e5b7c840c81f47722b6c601", + "b79308cd0df36560badef6f66fc137a98d0ec27bd5be97b5b83ad94b7d26d94471c3b1d8814008c41524a204aadf208bef1deec1b4019720d2a751455b9d1eea01", + "5a286c751257180a33677d22ea8c66cb457436dd54babe3cdebdf932f6da769b24f99f6cbddfcdffb2d4b5a810431f412737d5bfb9f0de42808d926561b557f301", + "bd066317a372c59468c72f9aae202fe7a5f2f954058ced864b31523961068e0a1bc7e10fcee9ec16cf44580e4d3e7f6194b74dbd6bcf4cd1c5a35640b56293f601", + "cd6fef0e0329f7c11a1785c9b0788ba8be92a5d063486872ab8e85bedd9749995166dde4562ceab241e97f9441e9bb73c54eae7dc3eebea7cac286955ad9016300", + "a5656209f4e0d02c32c38322296de87bdd9688d560dd1d46025929f9a8adc3dc7cbd5127f06c58caf405c8e4c8add84e7e9319aef965e85f7c658173001b8c2f01", + "f3f53b4e7def065704eaf65ff500d33b0522524eb240ecd68d149902334d653a25ec6be35ff944478a852fbc74657d4c6e1c3caef0a525161dbc1b124920cd5000", + "14315ad0efe67c42a7c78da6b84709b22ed187d9417fd2639c88a8f5badf411b0c9ff5ff0420c05d63eb55ce98c743b8e74f73d100cf236cc30b4b397e25a13a01", + "8cd16c423b8ddb65d690651975404a6ead1c8bec450e24181e6c1f1ff914313f2744980e4a3f37977b91133c0c87430156073ef8f523a160e3f266eaa9d4e39100" + ] + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0000.golden b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0000.golden new file mode 100644 index 00000000..20d1f44e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0000.golden @@ -0,0 +1,233 @@ +{ + "seed": "c6+3UuaifzancN6Ao2shsCzQdKhOV1y5cu+QfoxW3PlejDwjsowN+gaRDmKDVkh4VSDfB1cWTcBECHzo/JfrEg==", + "base_path": "m/44'/0'/0'/0", + "child_numbers": [ + 0, + 1, + 2, + 3, + 4, + 100, + 1024, + 2147483548, + 2147483647 + ], + "keys": [ + { + "path": "m/44'/0'/0'/0/0", + "xpriv": "xprvA2q12eAxWQxXDmSEktK9kSCptc1ZAQtQxx96EAVycNkW9ej33TeW7hbiyA7jrJcNMvChVaZqEusjDBZGAa9cUuym9dikGENLXj83Joqh6DR", + "xpub": "xpub6FpMS9hrLnWpSFWhrurA7a9ZSdr3ZscGLB4h2YubAiHV2T4BazxkfVvCpRnK9URcs32BFHrwTCrSb88fTbWAgsuggBvVFrRVBN76QKDQYSx", + "identifier": "f70edef3511de54ba6a9897e7ecda543a0bb8ca7", + "depth": 5, + "child_number": 0, + "address": "2cihoL8mWTVyQ6tnbzZjbm8nZfF6WmL4aUm", + "bitcoin_address": "1PXKidZajdwhX1BGPrrbunWLXciDeCZrE7", + "secret": "49f054b4adaa7a21b74c76605caadad1dd7742c4b8ec5d6a004f05051ad7f155", + "public": "029d83f5a288f520e471fbe9888e51e96d8694ae8f5bd5d81d7409499a0ef4f951", + "signatures": [ + "acec27b5dccf5461b78aae5d8bf68f74c394cec04bc159222cd6f94495f2e1ed49477750ff0a2a9c0f5e165a3ac28c74420e786696499eafccb1e5da6718150a00", + "ca4ff31a5c0a50cb8c717db86828776e5b66649b7033ffd7d2d400481a89c8c422edc11df42f02dc93c1c4bbf9b29104bb9fcf8980d4fa01a816d37f4d7c5dda00", + "64ef245bef8c5939d1cd23d1d110a87075fd48d2f8e3c2af81fafb3a9b6038d27800aa5b1121d2a75c2adad25809e0c6b31eb4a931e9feaa2a51ad9f0d4493f300", + "63a42f72f636e10b2601c42d430aac8fc7e6b7c38652ed6cef5c695a11ac04ca5569f40fccbd7424a7a7b67e2bd19ec98ea7b789d151248650a5cb5e775034f101", + "93f72e26ec196cda5219c827445f03af5fd405994af53c46abe775c420b74d5c74018a335a8a389a2ddac6cf56c265e67cc17a92a49e2eef33e9ac5f9573257e00", + "27e92e22ac3d9fd9799bf5eaa2bd669851548f20653857756cae441a07981c1a3e5bac7c1744eb862fbcf3d09d6bf7599543f998d011e7ef25f510a865024c0e00", + "0a520c290ae22b2c2aabebcc588278670ef4d47c930f9417ce04ceb0400b829e194de1958cfbd8b9da7545d2c7c1f084684e0ecadfa290aaed67b852e05f5c1d00", + "256754c12f6886965db5b7b0f32f5f59f1bdbec0c2ee543efa7206c6d04616895667fe6c643acf2b8cf773bf2e1e9b0022a93e81e75354c2a7cbf3f62984229900", + "9a8b8603109358bc39df4c335e96862b452dc1ed4bf66d02d0a3d1f485beba9a17e20f0a2de1f3c1ef5e0cf1a01b4cf86359b467a12c16159352e59573db1cc701", + "7863fae03231a85efd730157f54c34329db9f01969fb347464ae4e615a0013395b0e75911b28c3cb71bc59935fc70147ff188159d6d0d7ea10c8ee7fa9542a6b00" + ] + }, + { + "path": "m/44'/0'/0'/0/1", + "xpriv": "xprvA2q12eAxWQxXHbRDPW3p75UFHkErnWUahEbV7SunA3VWGR4Ee7tSJti8knqWHKB8jyUExK8BS96Ph2eChg7R5WjWtZuLY62QvGkkh8smp36", + "xpub": "xpub6FpMS9hrLnWpW5VgVXapUDQyqn5MByCS4TX5uqKPiP2V9DPPBfCgrh2cc5mh3XdnJ6wRxjPHekiyVhwtBiaVrHJVkRwTiBuPSp7Q9W2KdBD", + "identifier": "7c61c196f0057e0f873e0d9d2eb7705836f5ee45", + "depth": 5, + "child_number": 1, + "address": "2QVa6rzDMsZPUQSHrz5AXjvGMtDt6CbkaNY", + "bitcoin_address": "1CLfu1S9Tzu8PhMq1UxVcWS8EZNTiVZgog", + "secret": "508b3cb81cb00dfcf58ff2b428d8f324d1371fd0e2b4ff44744ae2772cc8c8dd", + "public": "034b43b388140fe7a4889a768b4bb7ff7b6a243d639b0885b1ddb53e8dd01fd45e", + "signatures": [ + "e8f3733d3e74a9c5c8ecf7409247fb176f465555721164fd749cf6096d4d89663b81f4df98f28c05fa65645687a705909d4d952418d6544d8cee96f1f80e41f601", + "3c4bd23f292d7e845be8f26e2265c53292f2eea99a47de240cb40f265902946b04894effacf540e4cef92675506ad6b862eb3fc0527920999bbcb9794ef09cc201", + "f8b0d7104dd9c4673f4bcb20caaf59de1cee75ed7cd13f36759981e4598fe6160dfa9b8a92549ea9a08593bc32a4eaadb89d61b9642e70682cc613c8ba4c6ed301", + "1e6941031fc9909db28aba90eea57318d634a0aac0e841ad149f9439aaf219f5010481a4a4cd8764427b041f371b12d5673cc887ebe7a8cffcf8f2e6e3b687f500", + "193a958f660ce59d15529ba96dbc479c71d50b8625341b27865dfa7528701217027c890f6865a5748d6010b853cabc1c26385b46e7cfee0b07c265bfeb954ce201", + "ef5ca256e761c74078928e83b023b1407bdcb2ca79dbe72017a1b98f4bf47cb6145815afab28fc1d348ef627dbdce33b463eb8f9ada447ea23b69d29c3262a7d01", + "75f6ee3061a2ea52244686941c3640e3ce993bc1cefafe9cb7fabe43eca5e24c58b0ef6596c67947cc47f696b1f5d3ce5bda4788f1e8afedd432cd9e09e7b8db00", + "46414c7064cd891cb869475e2b9263b8c93e193fab27829c8b345c8aeeeb0fe434c761c2c2204d75cb3bb9b2b72a5cfcb66ffde9f1bd947acacc14047b855b7d00", + "23a34e10fcdc0a7533eb360cc9c0b7b52a6acea39e6d807980d35b9b20a15d022fd1e3a395b76bf28bb33450f886384bf7fe0bc89e034707e4a41fe78e91e40801", + "25d6584d4a423e80f0ff702d0db92871c0c90e54174549bb733e2042abef5a6d2b2e7a8f6b6cfe947a6bf0649dd9e759085a2e7b2eb5c3849a78a269de28820601" + ] + }, + { + "path": "m/44'/0'/0'/0/2", + "xpriv": "xprvA2q12eAxWQxXLzKSrCN8MRDg5FPH331LLyrANg3rG8TwkX7ePqwAKemX4nmevQyBxeDL2p59cz4h4Eos9DsgiVdbJ7wpaBZKesLHNTcd33r", + "xpub": "xpub6FpMS9hrLnWpZUPuxDu8iZAQdHDmSVjBiCmmB4TTpTzvdKSnwPFQsT5zv3J1YHwGDSJo1c1843rsAyiFY2bduA9s5cnZBkRBEWxxhmX1ZqX", + "identifier": "50a0807e391728d3a54e2740a8f17b1a980e1639", + "depth": 5, + "child_number": 2, + "address": "2ZgHr7QUgrQhXbpqoox7yhBdXMVGmTm5J8e", + "bitcoin_address": "18MKLDWp1SFpekExGPYzuEwtavG8GgPSDV", + "secret": "891a1172147ee629a0d933f6366a1b81ff84a55921818d1e2f036c9ac82a8616", + "public": "024652353eb6e9cf9c1134eab12a5c64c582eb02bf75de963d9f9fcbe7babfd693", + "signatures": [ + "6cf6e286baa1a26474093a3c6c42e2f7095840eef80290e62bb98763273add0f06b0dc1212efd274ffe1d8442e1b933d76965f828df3d89fbe4ac58e89fbd8b500", + "dcec3e221ba351e6d60c1524ce090f488135c8295edb2f92e4a0e6a9f8fb042900ac57deb47046cffcbdba5b745bcc3d51ca40bed3d6f27d245c11d978a17f2301", + "79c68f05d0efae09a88b9e7bdb583bad1d8a3651d12001767f494e3a6cc114a72dbad0d64f00366aed83c6f81195dec6b1d4677b59577c34aabb9ff09f9d849a00", + "27e6aec20b397500b499149ca305076214c6bfe4da41ed6568677effc1a55fdf1f62e8dca3a61dd939bec14ce73538c55bc3420ce1ec6e77ce86845e36c07a9700", + "d9965016bc515ccede7976b393db0367b5fafcb06317ced30ff7f0e92ea73ff954a01f60f4ca3636acde363fc517565c22ec7687926ed01c279e4e59f802a2e500", + "7d943c90762bbbd6bcf53280bff6cad0c43f6390e40fea1ba210ef6c8fb4e3716192f22df087dd11f3b85e3e9e4ec7bbc453e38c7250af1adae39fb79241fcc900", + "06fba7f8f52773b0be6e58678de6825e3af7b1af6d80678b5d6a0e1b617e3ac10e36593786f08036a8979b923103882e1c704c279e2d879ea85d596f92faa78c01", + "688b01c1c775af40163fe4a6fc2e8f2cc4f2ed4f4d3f5b8b6312a0801fb1aa71792ab1ac2554986a917286d96a871fad48ddc9f5382b4387657ccae4b227a8af00", + "fdabd0d96161ce2386eda2e15e168d94c8e29ad8c0287df6483bf39b69ce67aa6abb34f5838b8d5df3f744373e44b1bfa5d3182c79203f505c4bfe75791e674400", + "8e4a8637adc42b46547a3dfff627f7055dd7f6c139c05d7eee34de58f8efcbf307a04bf2338eae083ca40f9ca2d73cb5d76464a8b19d229a29ab4fb23245633801" + ] + }, + { + "path": "m/44'/0'/0'/0/3", + "xpriv": "xprvA2q12eAxWQxXPBMMcjDgb3f67M1JvKEUAKYARRVXvGDbxwb62AR9bMT1hkaTM3tszhmNycKWndqQyWJKSX1oT6yH3Syev7wRzWs8wKcbKeE", + "xpub": "xpub6FpMS9hrLnWpbfRpikkgxBbpfNqoKmxKXYTmDou9UbkaqjvEZhjQ99mVZ3pK2y6VzyiH2vZKvSy2NWPSF7Gj5HgC5aumQ9Hyq8ZM7FPv21f", + "identifier": "582f892bac496af23a343ac54d5bcd42ab701fd4", + "depth": 5, + "child_number": 3, + "address": "23w9wjEubh2MhSVdG8hxDUbnrGMSsMa5v9n", + "bitcoin_address": "193HQjDnHqtq1wDDjcMbnf4NvPVs5bKyNh", + "secret": "75709e410104ed3207ad2ffaea26186ad4c5b5ccab9ef569363b5341a853504f", + "public": "039848f2c50f50270a3c495f355e4f53be1b98c050113951ac558fe932735ac571", + "signatures": [ + "67eda47fb7fd8f924c05ffa4b488af83388c9c3b09f00295ea68a6cf3a0ca4155f88a5683c30e89b76061975174eb9112d517d5e8a272bad7042920e4549d11701", + "c584ab7853ab4410689f9836cdaef339aa09ac5178b51b9b6db2a8c7fa524fc76002a0904a5b91481cd1a9e22b1bc23df7287c5472d445731f164cad54ece62500", + "3f286b5b80e37ba3bc2691742ff744d040224366d21355e8da1652e32c357db82a915d08ede616e73bdc5f3b0acb54df3f6e00ce9388f5172766bcbee57e657601", + "e1eef50cb7606e17fa9d5545c05bed8fd061ec60f6eb819b47a48ac81b52cdfe52dd889217994aa0496556bfcb997b12e4e917029be9138277f8ed3fec829a0900", + "ba98dc7425c25004a69ca5b567ef64d646942bdaf1c260689937b2ec0561bb560e05b7a7792224f7ca07a2e96506ee7cef316343f71ae75a68165cad83fc960101", + "c029e4bd77599c7bb1e728140c37a862cb0bceb60dbb2bcdd54c79613c34dcb96c8bde1301f2462841ab1421d5dcc4d860de6bd15073b8f9fd7547dd32e0ccc501", + "aada3cd4ac7fa21ee66825699ef050ae2661e6b3a314d9e3c0247e6cc03695c770ab45bee3c240e024a2ebb0ab74733c6206b98d1c6c166f06040afb9b9c9d7c01", + "ac3f5f0e1864473f54e2a7fabe97c57a3822c2474788271f9be9d174a4e10f32766d27a15d08d96d21526f0d58ae8c595eb80e43885fe8c702718c22e528595f00", + "7b57a74853c8c26dc4cc0b7781f122265b3c3833fde655131fb9096167a7dff3258134231e6d49e9feadc127981df2ac43c309d14d5ab25aa97e5460bf5eb11701", + "813452107a16fcdd06f49d53c27a4dc2780c1889a602d6b84503ab577c39a3327bb0264cc084d8885508f2ce612e57b1691a1ad0a0b43a0f5b31002e47a6007501" + ] + }, + { + "path": "m/44'/0'/0'/0/4", + "xpriv": "xprvA2q12eAxWQxXQrjJLTq5nPtzw99kKFWoMoim8G6q4T1nb53f84UJjbwweW2jKDey1R5qfehx1ezx9Jca14q23zxjtBGCgfuX8o71spYLATA", + "xpub": "xpub6FpMS9hrLnWpdLomSVN69XqjVAzEiiEej2eMveWScnYmTsNofbnZHQGRVkCvVBhTbxYo3eUD17AwzPLhdRXWiaHX3o9yUigh6yuhSenCadt", + "identifier": "82f79f4017f2983f95e2ac5065f6ad64c0fc7859", + "depth": 5, + "child_number": 4, + "address": "2mF9Cx2re21EyUSpJkMqAwqmfanatKSqBzP", + "bitcoin_address": "1CwVV2E4dJARuddG2xinn4phErWc8cu947", + "secret": "7f71cf7d15383a84a0001712f00d0f3548cd3170538bd93c4477f152c779a2dc", + "public": "020ee1b01e2c6f5f6e63b5f4a8fe723d2a74af337935e052f26212dae66254f2a2", + "signatures": [ + "6b00e64876029d9c29f297849fd8debac0a13a83092107ad652b71c17fe4e06a6c05f1b42cc7942905af9d1935dda39ea58c2170047c064b8d06bc64dc66f49e01", + "65fda48a171cbb80f6b5e9c258f0b3731a376f8635ef5ef00429d1f57e531cd17605c03a0498038d6e5e61b8e39625e5b7b89a455bb32e222acea25160fa350600", + "ac99b084a96041970cb40cbfd996a7600b5f0a77dc2fb26fa4b1f9672ac6a4c364df5d2af171c3d306e836009ff809e51ae5e0d8f43889eba3e72d5c3de563d500", + "bd352fc2efa2be9541dfb79c193fd0a8d548e24d430475badeb242b0e3a65a7767f762a311506e914c26b65847aa1b2ed3ae3fcc5d69a1f76fad60aec1c961d200", + "1681ba18e8c21bd09463909db7662b4fb703fff721a369cdfecddadc2d839780681d01340f2165e18800c13b13c9121e68849eebeb71ce39d36c45da75db202d01", + "ee31d60332a491e56e52e7d551e47a182cca7b8c32e843ec85766ae25a8e9cfc2cd6239ecfd241f79b80e46babc80ccff9c194f35f2c3ae8367f15b14b50f2fe01", + "f0b9b8a00529c7daf7b92875568028b95309ab34c12f1cc4935a8c8f36ce4264127d1a78b859c1f8f201e04defe6d96d3b8c2b58244006ba1cb12eeb5c00c2e401", + "c8f05117147d35e693ff6f728b7f4b78036ab93473f3c6656b30e61f5cbde2450ab99069fab7c0447d7a1088ff4fd6270b6cd32ceb3977aeaba5d52038bff0b000", + "850b70dc524699ee765f3aa4dfcc205d270b408d15a1e5373fc3171c893a7e1e1c9572bdf727fd43cb09b33cdfbd95410e50dce77d96a9d2f3636442c7fdcffc00", + "ca1323f4bc710d7a5fbadc9819ff4633eafe7cdf10d208aa0cc34e5f28cd1cc47c4686bdd6893845fbfe577b60a0be11eff9cc2d2700f241afd023d3248669a600" + ] + }, + { + "path": "m/44'/0'/0'/0/100", + "xpriv": "xprvA2q12eAxWQxbeTXXVeC42RirrgfBYRYxEomtJfnKftXEsDMHhjaw6yQ6v2LJtNf6YbNhkr8fbz1RcoGr5Dc1xQS2KJHsQjRt2WCfosEwUqB", + "xpub": "xpub6FpMS9hrLnWtrwbzbfj4PZfbQiVfwtGoc2hV74BwEE4Dk1gSFGuBemiamG9FCouMdirgUwM8nCiVVbKXwq8QZQ4odedzg1HPh87qy3vZ1tj", + "identifier": "22e071b253c0858a7ee31006f1db44497330b24c", + "depth": 5, + "child_number": 100, + "address": "fwBx5CM9DYy4LLzuo55ZrPgbw62dE7xhc2", + "bitcoin_address": "14BQrB4xuaMWt5CuaXSBinDx5uZTHcvFcQ", + "secret": "a8e85c1863c14603b0ffc30840bba8fb2035897eb96d0cb34c62358022556a1c", + "public": "020814810b6dde18bb581a0a0bee982c9e620dc65e483f4a00de994d5aa655a20f", + "signatures": [ + "912dc19892e1bea87b9e71da136ea8679958528c2677f22680bd6e31b4ea2a0218fcb9cccd46bf20d83933fcd2931d077addb55a726a1175071592519f1bcf6801", + "1acb0759d578ad8fc00ce321d5182f959bbe7e0f48083449dbba2b6b34aeaa6e3d2ff7659fc95724a08cda375c839f9819e233869382cad36a82b84b1875004d01", + "a1c33184b797f1da37959b0d90b417aa8036042f4d52bebf642fc9517c35e42b4dce0a255f7f792a5a1a2ecacd2b637ad3e409099401649d61003329279920e500", + "80561236ba3dad9ed3848a10597f7d7914488fdb618cfae91c0192c266bb0caa10f72880ab18793e4d76bdb594183c73c840648bf1094a314076beff5e5cb5b400", + "05c4690986f766b29b0ee4d50374a851209b479fb8efda6cfd653545491e6f01175ae179067caff55ff232d68d536cf4a220693f024d00f3a394972ea43902c001", + "345ada413c56aebeec19de8b9b8176d054f4dfa7f68996bfcd9ea130d2ff24e10587569499e9702733b7f431cbd109c2bf83c923f485e7446c38aea2f126a38a00", + "ad6fd09fdfdebd22d708fa78174115cc1bd9f88c2318d47829bc65a6402e4d451df6047b3c3b9f8e42eb12691184ae420d66b41207d22a25ef942e9f1f6c950b00", + "270980b6148fc530cac28d52cd1809daae0c2506b42d8a5101e0ec567f4b37db78bc606d6196fdc64549127ac9785a2ab8e041c8668ba89e7f0de0d802076b5801", + "efae30be055b1d52e97cdea95a92615360a87527f4f204ba931929ace7f3abd118815b174c0b303c77ae75c706409a4ced89b7ac6df185a04220e28dd6df9d7d01", + "1072992051b0d8216786d37bc6734c8f2434973b0756f263dcac4c312bdf8afe759d8fa0c02441ae7a726216ea6382a7c6828037ced01a5814be27eddd937a8301" + ] + }, + { + "path": "m/44'/0'/0'/0/1024", + "xpriv": "xprvA2q12eAxWQyJEX5k7xHTzewcr1TMFwhBVNYkskWKh3BVnEmbkgQPHqu9To1aMFnagLRwCztBpDqwHHHc28FVHPdNnptdeoGYwA3GCKTcng1", + "xpub": "xpub6FpMS9hrLnXbT1ADDypUMntMQ3HqfQR2rbUMg8uwFNiUf36kJDidqeDdK4vUdtkWKVdepzqLFCk6ABzPqPSxM3yGCqvSZS3KqCP5JeNMFkx", + "identifier": "a73880cbdf00b123033f2b85ee7cf17b378488a5", + "depth": 5, + "child_number": 1024, + "address": "HTUVnz6XSNsbFy6VeeLzcL7HLjPHjTDFxY", + "bitcoin_address": "1GFBXwZLKv2oeBbFSsrdfMH3Ve2kNi9mon", + "secret": "836f1659c429cb969b7b671ebeccab9276e125cb2952db3f93a8962aeb607282", + "public": "02f78af41c2f1cefff5baafe81292ecad725e60b809f6d65a1bbe7daeb06aff0bb", + "signatures": [ + "2f3d93cbe48a42f96d5810cf9cbcc74413686ba09d123d4207bc0120c356398f227509088bdcf101a4e097be54209cb4f68faaad56666215917c9f6543e4cfdc00", + "72a3bbb5f96c7112ce100a16b4d4c1efb317111b3031a0ea9fd4daa5c4cc99774cc3fc0ebbe7175b75361a95841dca57e276fdd9614ffe78663f95211449835001", + "d5c8b1a2b9d08c071df90e28bf4dbff501eef5c99be1f70ca4cf345eab8b150237ed17e2f9002559f5213d87682bc0ecdbd59aba643de4829473b562e660b0be01", + "a4dd577e07c86fecf7e40e02f85ecb0bb6221411d4cf02cbbf8ab136dfd1318d3edf1dee60519782343a794c521e3124d9ee05a90ddfcf9b7fc16cf79920ce3401", + "ad172fe3a5f7bfeec318f939286c9235e7f7278992d3a1d35a4c5faeccbaf2da1dab66176c232469934644a09246c60c0a3541962ae489ac483c93a1c87539a101", + "810a1b4cdb945338f1cc721c73843e5fd083390057df2b697b6d351722b5965917c0b27d9eaad64fed91a2e6435beb79e21c2a3b49e93388787c43f64e76e73e01", + "53a99ebed90e9856fc20e2475d4d5f20e18e3124875e8695dc1e4b713da65ac87d0c0ae48b98740bbc4b5f718f713ff703c14810ad9dd7272b1da794bb5d875300", + "07afc51611b4880222bf51fa5dc9d74d8b3c0dab144af8daabd774e84f867faa059cf00131cbb0b0fc02fbb4d26f3fa15fba1a3db80143ba8b58545073ea580601", + "0c7eee0904edf49fa08299b3e80557c927992d43d5767dca41e9012c02769db63f1da42486c45514303b573d9b05fa9453ddad325ca8c95bba49a71bb10dcf6301", + "1e093ae088efeec6ab67131d892085d410faf2783baa9449d97cd2b96fc521827ec0878dbba741f37964c7d2672dfc28aa5dc5602f8bdbf0e7f0a217291e52e701" + ] + }, + { + "path": "m/44'/0'/0'/0/2147483548", + "xpriv": "xprvA2q12eB6r5VR1tz2JTcSpUwo3HAm5mqCSUBrG3AjYPbu44cw2h1Ugrea5VeHbGAi861BPrw77WxXnaQb1JCby1aLCuQQu7B1XKnsiAe23dB", + "xpub": "xpub6FpMS9hzgT3iEP4VQV9TBctXbK1FVEZ3oh7T4RaM6j8svrx5aEKjEey3vmMo8Bo8gq6iJhSjgcHHhUKgNaHhWqwR1SbZDD5mRzRYsimBWzT", + "identifier": "32384be3acb6d3a0c570bf42058b20759eda44db", + "depth": 5, + "child_number": 2147483548, + "address": "WTspYmPiH2frXjs16P5Fx93k9w6zUzwTWW", + "bitcoin_address": "15aYE8wfe38jRi3Zz5CTZtWEa4fbexi4pe", + "secret": "45da175a3f3e817bd050797e835f58c72069f36f4b0f9f622e88d362904e31c5", + "public": "02a017d8af56624f53fe32a205561e693e30b273cdb8f61e0cd021dad24fe14313", + "signatures": [ + "964ae9f497ed957ca0f87736d86b69e8a34fbe59f4f40cad5ecc84b541305ef552c1ef185d63bd318430396b98fb8ff984ff91a8dfd76e78fc3bc39a73c5ac5801", + "9bcc3a2bb921faa711bf079473a00ebe7c85246df96ece9444276263cf00312f6f2096c14fa56dc2bb5dd939e5dd4e730bc09a7bd258718ff804f64fa0178e8f00", + "92aa4918a1ab146af8d02cdd3d48312bef2d88a8884794e7900dcacebaec5e9b7fe2a952160ddcf83b80e9e89ceae3b1cfc3c9eab51559b9114959702b3a3b8800", + "d7795f4e8c7609f82809dde765077ca08eeba747ec2a4c840e019ba2af0757220f9b4bf3ce16f6d4ba22146b13d75b6052db89257a0ecc8047767be371e31ba301", + "4a434e91fdcb34b3ed6bd47d0c5f80b5e45d3f175ffc9ff3fe7bfbea91a21d793ae7cc9992516c31e3bdea7846c3aa33afe1a7e316284ad7ee636ab92142f13a00", + "4af1521ddf5c4e89e1252e462ed63b5724ac5f4169584630044f06cee2baa5bc08753e8c6bdbe6667e2986a356aa166d8eeae9a9137b0ffba2c726fd76f9ea4501", + "962dbef71ffd92af5364e22ad59d8c91bb22179bce9f8f5309458f559f7121194cebc99125a7b8cd572797af07dab35221ee6e026902d58acf6cacd4922d572500", + "9d4e0aebe271952ced323357524e2cbc35e52039cee4896a4150bc598b7db5e96154b437598507a8e96ffd9c6978931307c19166b85c9103983c123070ccbc6301", + "d9f2b64d0fbbe7e5402b5d646749983c9a8b01c2b2b9b6bb4e4fb37703dfec8b18e1cab477e861ac4297450cfba7c9256990add2f952ec843decaa1af28e591500", + "c7d0fed33f73ada6178ddce03a0df3041f0ea6183b2d81b6f5080b453c1d62ad51966844392650c875b89b7173a62bc4b4bab6fbdccab9a1c02c7a3bf63e778c01" + ] + }, + { + "path": "m/44'/0'/0'/0/2147483647", + "xpriv": "xprvA2q12eB6r5VVPAugR9USNaDLGcPfPiemKpeNCLBtPtmJ9EskkYFFGoXu6mFHVjaxncZq3m8FQSGZGcSby2rF96um9cK6mTWoAeTXt6jfpYp", + "xpub": "xpub6FpMS9hzgT3nbez9XB1SjiA4peE9oBNch3ZxzibVxEJH23CuJ5ZVpbrNx3Syf6fGU3TQ8JgpRD6raeCKo86E342pxA2YGaf4EuSP6tiKGBf", + "identifier": "7c439a5d85a11f3a24dc159fbcbe02ec7da1dd0d", + "depth": 5, + "child_number": 2147483647, + "address": "bA8WffzfznG1AZN3NuWNYLjHNhu3kU7i8w", + "bitcoin_address": "1CL3mveofmFEhwHiymrAfhnCbUcgZ53u2W", + "secret": "4fc7bfb6d55deb25ec8037e65addfc751d90e5eaec8d9f6ab832bf105e8f6c23", + "public": "02ea03d78964aca430c41b13fd755399c3753e4b92a349c2e68af42c306675bd97", + "signatures": [ + "32da805dfc2d44a4220fdd2aa5b8ed96db93a131948bf5c445332f98eb5eac5509539c71289ab0e4c4d47372cccc9e70394fb2d28a5fe5438baa8e699eecdf1100", + "f64ca831100395efacc26f4ead2f021860e9f943d63fba1c16f05a41194f4e4411d9ef5abba74cadb62ad98d475fc9fa311bc132c7dc2e6f8f2c3c181f9f48eb00", + "ccc5fa12f691ae734349f1262fa8277b4ecb25bc0000cc2f73ef499d6f055068689f90a9c574e1aa56307ba6bf7fcd817c009adbcfa2f83d217c99945ae3773f00", + "07cb73e4edf8feae163dac70856f9464847dfa61e3a350ecdf176d343d7069eb45f7666cd3b8582043ac4f9786d3a6c45f4a02f2b04fcb97cd61d413bacbad3a01", + "d31dade431b4857239d281dada66cfeb90a2d1b19f2ca46850987b8f01209120730bf77a3c947ee83cc43f5a8fc7fbd8b7fcbd7b144f1e51fc922d6a9ea64bca00", + "7f80a0f94685217a37b17c1da86e09cdb1e3448759fd0e0557ae72c41ab32d422b89857674e9a332e00c71ee784d7e7130d04f7ab5f58b15fdac778034e0a37000", + "2ac80707d9d5e828761a6502d26b5ce46f91af723bd6ad6e68ee5c054eb1a99a51d0bd9676cb8bc378b2315edf40e660bbce9c92b8a7a3c68860ea158ad59cc400", + "aa9c96145c169a6df0510942110e226a5042dcdd57c8fe1e0e30263524778009549ceeeccc4e72b0362e0cf97ee6bc0e48134caa7dcc03fcf735804b9159283601", + "0b0c6497e26417e96f28f7b4bf2a444d59c7771fbf8ce2acee1af673c2a78b3f6562326dcb6fb2006d6f63aacc37e04786c65209c5529fdf8777c04c26ccf5e400", + "f19bc8cf6031a9f3238db9a242fdc7c7ebcd90794db6b000345a59cebe8418de16721043c7751fbab4e38b12549f89ee5e6cb979d8c7803e012523a7e0fff32e00" + ] + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0001.golden b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0001.golden new file mode 100644 index 00000000..c79870b8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0001.golden @@ -0,0 +1,233 @@ +{ + "seed": "iqwBScw9PXSl6JtFECoosRVCZZlsyu87DogMj4iVAKZOw4UOaweK9OoJ00bjnD51N9Axo2rtPkTHN2VKzY2ofQ==", + "base_path": "m/44'/0'/0'/0", + "child_numbers": [ + 0, + 1, + 2, + 3, + 4, + 100, + 1024, + 2147483548, + 2147483647 + ], + "keys": [ + { + "path": "m/44'/0'/0'/0/0", + "xpriv": "xprvA3utJ1RhnU2BgJtEkEpo4RpN7Sop4WQ61HisEYV5TQDZgo3d6VQnqnh2X3XXGm3eHHYRY2HCtcmJkYc81XBoZtQSE4egW3wDxHeHFmHCQCq", + "xpub": "xpub6GuEhWxbcqaUtnxhrGMoRZm6fUeJTy7wNWeU2vth1jkYZbNme2j3Pb1WNLuZjRQcnosJAwYNxs2nAHRVcFKhSqY5LDqvFvsVpuEFxWxjYpF", + "identifier": "8a166b7b15cac9b5053d4105b55d477d80ee46a2", + "depth": 5, + "child_number": 0, + "address": "28GDT7YkX9LmEqXFMawMQ8ZH3LkxVdp3xGR", + "bitcoin_address": "1Db97EPeD5ig5m5ZcVPUSx3qE8etMZNRbt", + "secret": "24dcf62450b5abe2f6ef7df0572656ad21d2f4939ed344610f432b51ceeaa43b", + "public": "035a4b7a6fc5810bc1cf2c8f4c760c56b1adc278f1675f8853859879d73f786b6c", + "signatures": [ + "a47464ac9ed9d0c307366664b86437d394c268500fd005b01eb09db306540fdc64626eb32d1c0392f86949b3540bef8410f815bb8f480eb3f07ac4eb4779cbab01", + "8fd8f1609fbb861951313e63c020f80364f7a0778ea475f394b7f175200fde287e20c5fd5fda27eb24ec2ed9d2063e17205bafe58194a0d768157c66427983eb01", + "0fee776b483d1540b4be784c1c750618f4e1f1e959a4c89d806bfe2c6d2cc969161762004dde99f630748f4a38e3bd559940add94e559d2f9bb1fe6a06979a7701", + "9fc8718a3de0356ca5b6136694e2290996fb6ce660c714c132cd2e097a3dfbf64fbfb82def1bbe10b230668b438268e0c479931604fbc015f77e161d4b82c40600", + "36b95dc5f1d892020e4c30f23ada0f6da145bdc99884d2df00b1c0e038150cfa7507a93eb68c290ddb91d99c0d3921e6384225de5b16d2988259046de6174e0b00", + "84a0efdcdff4e4a08dcaeb2d1b9c890eafd599b06b94bb9906c1ef08be765c786ca8b1e5ef119b8acd37c8563c41fc33a8286ecdba633a4c1e139521c6f8179601", + "dc7811a647b7f905c498499171b561f14c1dea130320a044122c6ff518030d112ff7aa0ab899540e51907f26da0368a0089e34b6d80bdabca17dc2cb5caf01d000", + "71932e2d9a2a04a7e9d8ad79bc3fd23c89f6138434930df9ef15ca713389b6fe74aca1901775aa089d991f153f2b635f54735f73020cf394f3bee56e393c1a1000", + "b4d3b4b57a1c7705ea27fb304ac661c6bd0b9a3ca8fd7e0d9d6ecea05d4b81be71dfb6815f9114959609485ce85c98e12148c6ec1e821df81a56b1c196699f5100", + "60ce6964a58c8c8ef5d58de06abd6662f8d099736cc8b39a348d9312f33cebf805e9a0e7662749c3d600f728a6c8b047e5f65db7987c64e889ce47a492c0ccac00" + ] + }, + { + "path": "m/44'/0'/0'/0/1", + "xpriv": "xprvA3utJ1RhnU2BjygAvzhLMAGMbFccrPCohi7pniQMaYidnSUdpCGzHT2epZa1mtU1ZD9F9vbdmw62kxgyL2cycSLPe3ahyufbvhMwuZVdRhJ", + "xpub": "xpub6GuEhWxbcqaUxTke32ELiJD69HT7Fqvf4w3Rb6oy8tFcfEonMjbEqFM8frroBrTzHcD4pZFxH6VrUPUjknuWMhikd4YE4bwqW56G96hmEKt", + "identifier": "8da1ef59d14220db58bb239c8baed59743e950fd", + "depth": 5, + "child_number": 1, + "address": "21TT1GXFasfsE45JmucnAm4SZJZ4rYC6LtK", + "bitcoin_address": "1DutGVE7YAv3qAZYdFspHWMJiHK2KAWXqs", + "secret": "055ad0a685cf4ff39f3623c9e22c898bf22bd87a13ddf92afeee3e8417e0dcc4", + "public": "032ed823773bb41ca74369908ee73935d675e6ed930532367a11f1cd2fce59f561", + "signatures": [ + "9dcfcc86da8b1b417184feaece62430c1086f49cafef7e84aed3506fbf9a617c4055d351e371496531f858c91277b42f9c76840f968cb2c222b77222da71acf401", + "bef21d026663189e4a34a52d6e8635881ea2022e8eebc971daa76df1172cf7757985d62cc368df2c43342a8ccea6474575a5f7aca9f3d534c578d8e139a112da01", + "9901982e9cc90a9452425c3a26a7a24446d4a462379b3c073a188f60851dd1154150ef2ac886aa606c5e89b0e5b2f08df8690cfa7e49742cb79f596600ebe17501", + "a58a341683c266f93ea08e44be0a05edd647ad31464a7d1c96c68ee189c8fdc310516972faf151274875d7bc370cf2707a92d3c862cddb46aa8776ba5bdbbf0e00", + "6337fb043d2f5bd53d5c80fbb3de7644c5a097d5d6cc98bd907807a14f9ea2a0641be3d63a3d37f56fa86b6179c2515d8e6330c5383f9c9aa6429c254589083400", + "546d2d8df73078d0e6c55d17234f7418a990a17ca1c34e6b6bf911a7996abfda27dc542165ec1ff5ba8c74e4faa0334a3cceaf8893af1c8a2ad2474ff373e23001", + "07beb0ef5db2edf1ccb6cee36d6addbb2b7b7232c40b4b234ae1866364fbc3ce48ab3a74248a8db7b3149ce444decd436bc7fcde5b19a200960b72895c54231500", + "9fb255f8e98d569b806c1eb359ae3a4172792bac394801d2221b4af8b9e554b445d708912d96301a63d92853a05c1a7c6eadea38d88f163528c4e0c21114bad900", + "ded877c06dff920321f71896cc1d34f08e547135cf3c9857c41332142e4f60f1396f224a2e17aa470fd96c88b9b852b73046918a7d272db6ab6df64d9db6639900", + "de510444d9f76d90268900b11b72071f8caf7bac2034934307d5cf1ce81d0c946851fd619fe0ee48f540431e9f8c11702876a578ffc6fcaf92096f86ee13aa8a01" + ] + }, + { + "path": "m/44'/0'/0'/0/2", + "xpriv": "xprvA3utJ1RhnU2Bn248Wotp4K1TbDe14zeVv7i6aFMqyJdzuAez1BMoscrf6mzpEepqvSAvYh9Z8aydZEWkup1oznKeZmy7cJDrjnepjbBe8Bt", + "xpub": "xpub6GuEhWxbcqaUzW8bcqRpRSxC9FUVUTNMHLdhNdmTXeAymxz8Yig4RRB8x39hdNTZoUjduH1rFJz246zvnWfxk7LaHmVULWvNZX3w6Lrf9Kd", + "identifier": "e560f6ee15bb2ff1b8c6c640bc07b411ec65fa5b", + "depth": 5, + "child_number": 2, + "address": "2ZrqAonBrZmSLd48UkxNq9Yyi4fjeAGkUU3", + "bitcoin_address": "1Muqu9StkszhGsFCcqGhixQLu8H6ENDhXt", + "secret": "caf54cb27d4a749ef8e09bdd3995c8872a35aa27d16a5645d498a756dc637fc0", + "public": "02db1fe78d937f3d18cad3f5c37cdc1ed197336793b2695ef63948364a3d5b2384", + "signatures": [ + "5dd82b22468be3d982780830e04834077595aff76424eb20bf9b5033235af8ce36511422759cd9da04b50753873a30876db8d02d8a439153466bc616452b5de200", + "440cacafe7817ffd612f3e2fb07dc93e22be6360f0bc42e615343cbe20a56c752111e39759b95af532b6cc168aee141e54c6b2dde214a2c8d697ded8bebf952801", + "c23f8514de9b9e34287b49c3739850852d0e791fe881bd358586c17375b7905f10d09a2d7bd92497586447a092de6af6c897090d7152bc997777e0e5b986e0dd01", + "046cae7c89b6e4ac862bd8ee8cd101f1c0547a2cc229c759e51ed06cab25be0f6d1d88cda3558511c4a70ebdd2decdcbd4797faeb9d64678af30d438efed5d4801", + "4fd9cb549abe5a96fb18a1bece1eff73d2cc99f56f06a06d73b70c5da87dd26228991340d1ed49a0daf8502f264f1cf58add7537e67da9a68b06d6250e12811a01", + "5ef398024a53915ba3c7f839af42a5b5cdcf5028cf74fc491625548d7dc1b58b2e92b4833bcd81a167c6aaaf835aedb7555143e0abd384ee09dc4d73220e570900", + "6f50c9cd0947d68c99269e58d536850d834778fe6d002542fed79959e5f506d4685c96043d3795f74c720c3c18b8248196eae2050aeb3ffc35c05c9440bce0af01", + "d6cca29068db2690a0caeda7e63260add60f55e60d17541edfcba40f5a237cb161e9c06016c9e073e0cbc094cc0282c0bcf78e56e10b7c23d5555d3e23ba539b00", + "84051940b57eefb4ca6e1b5a6210395d4a2bc0f925e4ef7bd6e2598914ab323279b105ad977aff7cba5d60973ba997f7f748a6df8c593807a20bd5cb1d73a0d300", + "71fd4b6c72abcb8e91624b9e64a7fe285ab49b8aead40a83772a415ba27a7b4b44f563b605cb90b48adea0be18ec2c0ebcc0d1753a959ff90f126ec875fac14c00" + ] + }, + { + "path": "m/44'/0'/0'/0/3", + "xpriv": "xprvA3utJ1RhnU2BoQzYwRv84rfCWRdZehtqTuGLXVvhVcBCrMRj7JXWLdtPTkToTv2d3oayF5DFNJkwe2nydozai7BRugrf8H7uRT8eVGx6tAY", + "xpub": "xpub6GuEhWxbcqaV1u523TT8Rzbw4TU44Acgq8BwKtLK3wiBj9kseqqktSCsK3jsc3j14r57HLM8Y8D6SsvZQTgz8aoqak2UfrVRgJDjqr6Au5X", + "identifier": "70f3415f8ac7c8280dac7af3d7e6af054969552e", + "depth": 5, + "child_number": 3, + "address": "221FmrphMDnKyDZCbkDnXjKN7JJUn1Zam2X", + "bitcoin_address": "1BJE6AWjcK5Q5bsJaA1eDtt2Qbpvyub5dt", + "secret": "207abd36390cd174a12ba51b2431353921bd3ced52c2e4a41640992f2564f8b4", + "public": "03485a6c254257cd87cbf6733634edd85994372d5e9a93deec35f58bf00435fb51", + "signatures": [ + "10fd66b5fdf42ff3c91f71d46e90546809c2afc04a2e90ed0a841f25c5f9319c0e263052870bb91b701de50edaf53e2b0cafad55cbdc93c8fe29ced99c5b6c8101", + "967d8c358f830fbe7813510ab4ff613e410a7852ab63d29accfd3b2b0f0f1ebb532271f377e55956349cf858b02aabbeb284f52f78d31870c6c8d93a67e3e41700", + "54389ae0d50df748ce073fb2c860abef1b19cf4d065270ff0b0e75f812efb5846cca466f3b4d80c267a50ef39cb011cc60b681d20e1252b79f18a4e57e9cae2e01", + "c184efb5647b290b0ee63629a8ec45655ce28580e3de775744752a3f9cd0be6b1ef4bd6793a87a1e8fad4e1a94c01c808d1b521fe6c512c17576802153ae44f201", + "06c98413a53079c24a669e29574a84de2037781e189f6150ab05a5a7aa00f39004843536fe4a49b364a97a7e596d629a3f89e6c1f2f9614b482ae01e3c509b5a00", + "4e9240608a98ff817ca56f12e270cab5c3082a5400046c5c2fa22391f3d115f93695b473c3e070103a8fe215464495298c4febf401646109f994bf8be2ad77cf00", + "facf6e6e06ace4b58e1f13c081536d162c91b7713790728d28e1f9bd4c72eba5068ce3601cf71be75c47984a370a72ecdd5c5cfce266db863fb1aa26ea23c94a01", + "5bf30e9a42fdd7b41eb8a2df395ed1941e85a87cbe67307e72417fc36feb159d6a8b42ae4f20994b8648544878dd66f276f353dd4e78a0a94110aada875f6f0501", + "5b6a34165da4832f6ad0f38fa54acd238a1af25918d742ea4e090260039b981e31c006dad762ba2958a0d518cf70553b07b2c54e1f8605dd0e358ce04aca2b4401", + "c2c329354f45c576a1f7da3210145619d625127138142a95219f2712c7306d496ebd33593a2723bb1b8a38403419addc54f2df5c16d30a886b3a827a9748070300" + ] + }, + { + "path": "m/44'/0'/0'/0/4", + "xpriv": "xprvA3utJ1RhnU2Bsb8zJPExWGpDdicb4JsTaaGqoo1feiAMNqCH4XTJtqxUPHj7BVR8WNbAz8qUG2RrLcUzX227EKxLXqLh4A1KgaYwp1wtZkp", + "xpub": "xpub6GuEhWxbcqaV65DTQQmxsQkxBkT5TmbJwoCScBRHD3hLFdXRc4mZSeGxEai6uiCWmjmsn4bcSi287BhNksNQKNo7M89uM5i2jA9nfdRh3Mz", + "identifier": "23e82aa6198f7661d99d8aa561dca75a384e6d9e", + "depth": 5, + "child_number": 4, + "address": "2TV5dXNJRQL47M88fChujCbV96i5T1EB1Gq", + "bitcoin_address": "14Grmw4KjPnrr1TsnVGu9o3UwwGWjVyUsz", + "secret": "9c0fc9b6a7da9de9d86d826f1a6132d56c93253f661082be0c6f23f091257d65", + "public": "039d2980b44ab8a1b9e5f07ecd5e4b16c6ad8270961b9b22205215d27e0a62df4f", + "signatures": [ + "0832020e160fd2162e9708c575fada466ce68895398edbb7512aaa9135ca82aa541a87bc120c3a04996821044a6259d40aa71f3d4de555235b669e22331f363301", + "a07c010350295a06930ce49bb75553fb8774364386023e9793d698090125fc965c53435c474a0f7196a3b4697dc65cf28ea72857d70faffc50016e154dfc65a901", + "ff7cae86939bac1924cbb910a72f5da639e2ee15c3f7763612964eb50bc0508377518953664cbd94c44376933b184c4ca53708968ec8fea92f27350cda238c4f01", + "3a6864968d098686aa1fc91ac25786611c372743a9baca972af3e531ffc2962e0f139964be39de44084dd1af821876f09c416b6f7f53ed15f5a148d9e2d75dac00", + "3cede898ae529c1abf1bdb05773d995ce1737a6570c916a2a777f339ae9999f9449832156cbfd8232b12d8d703cad382c26854575be3e72f45eac3bb79bb306601", + "fe33b986ab25d8fbca7e5623acb3b653ca15fce88624054425b4ceee7f9003dc444a75a5170b6947bb6c8a5e2b081e2ab44fa616bd3c0074ab29798ea154efad01", + "9f8455e7805f44abb7f5f45b1984e848be9dd18f1f07ca66bdb0ed406e8de27d7bd67239c175e8e0896125b9809da37a4ede76a5393f530ccd05bf710408197c01", + "ccea7fbf812472861f4fc905f402e0fcc8865b471bf9b4931a0d7465c78181ed119f74608afe5c28fa5b0f1cdf1761c20d5721910749b562d47c8fb8693f33ed00", + "308b13adc487d8411f3ae23c40c0fc48c1c57124183b0ce7a630d383d5b77aab5a1d6d38dbc6980d0799126187c8b954867e8776271074d62f7315d4be06f65b01", + "ac8a3d33071cae8a6af50ab1a0754699aae3a6a1abd8eac139ab2aadebe95c8535f633f92abd7015fe73a79343ea22493eacdec41c8885ff6b9843a4a2de154900" + ] + }, + { + "path": "m/44'/0'/0'/0/100", + "xpriv": "xprvA3utJ1RhnU2G4CubDaaYQ72FmkiZYWYq1hAbm1MegVcYZrM6utrHYfJNbdaBiKHcQURakJhvbmnmnofQkmCvk1zCkA9NEBKjr2FSh92dcHa", + "xpub": "xpub6GuEhWxbcqaZGgz4Kc7YmExzKnZ3wyGgNv6CZPmGEq9XSegFTSAY6TcrSumcVibWVyueGeZMuWhfPTtsjSj8XtCWvZ5Nassn3KRQbGdgJoJ", + "identifier": "e4b949a1dc2473a8927f33d09c19abd389d24b5e", + "depth": 5, + "child_number": 100, + "address": "m1ohRbL32CYwZ7zzi9t7N8QNNLhHAsB7Au", + "bitcoin_address": "1MrP2kLt6q15Zw18CuVti4nKvRtgouNbcn", + "secret": "31b898bd4a4d9325ba18e9577ac91eff2ffcf2ea301cf43caf7c9200c2cc00cf", + "public": "02cb5a9063dc31f2b81b2ddc3fe167ef18ec249a89222376c2b249b1a54ab83dcf", + "signatures": [ + "26ab2847df56cc13efc308491827d48345fb5e39d9c39ed32ce87796940aaa6b63a43b659b73e7e87927536eee727fde758f5bf7f2c9ef4e4bfd9d862bdc2a5600", + "8b5e6f0b25c82f1f042f045e7752ad2853a9fb5e88e43a9ce773530dfdaa78d107e5b5bf6670f0186633306d534a1494415e3a9c99a4f16f1e1359b63cbd4ad300", + "88a50e0286d4a72b2df1fb9afc3900acb7e70919a0b7424f292a36af2e991f1f5f5bb6543dda36a3b540d89edc4cb995f72f8d8f473131cbd6b2459a0b54681301", + "80bc43871cbfb3543677cccaf021081374576157857e68902c899ee5c03bf8bd10cb9d08b1fa45f505226c24dddfa044f1c7f9035c3b072e02d52f7dc6d27adb00", + "5d160f7d0722be3825aaa0f740304e817d382443a809f4704ce7fcdc928751d65d7c31d8e0b3d1957b4ee13f86675ee7d05180d634d468e543cc710720ea427800", + "6a16c0c7f281129ef99dfa8af569dfc352886be7201ce503bbf63fca776656773e530c8844a9de139125a76c5e60985c787b710a335512fdb65db96c3607a46000", + "9ba33505dbbe668d79b456a671b1b2628aabca4148fc4ef5f07ab225bc48388059398def1950b48fb80922e7873bb629dac9b7faa44b937bbe7694267ff3716901", + "bccdf92f1f767a7fa603da832430e2c14e0c2754664a728413142ff11ca573dd1a25e9537cae8980bcc433c82224af5b720f87ebaf2f6d0015e4ae1f7ef7d50400", + "7454d9d59c53e190d3cd2fe3a0e489fa2c0a2dedf1e367bac0fd75fec2f63eb97dd25687758ddf63ca89974d18cfdf9adc0cc170943ec03b61680ff54e3d72f200", + "41edc30e77910c09d47e204e5a9a7c9f8586ed953228d3b7ee7c3a34de7654d40dc2a627d4163ea0f9b08362d8be6b20e013988deeb3f90cec55328711be860100" + ] + }, + { + "path": "m/44'/0'/0'/0/1024", + "xpriv": "xprvA3utJ1RhnU2xg8Rfs6fZSFAZXhzMivfjJYEcSUYuxAhX7wkUvhYHvqMVoQe1kc6G38FNTkSBUYkX2UpNguMKmBQxfK37qGe6mFFNxTYK8q4", + "xpub": "xpub6GuEhWxbcqbFtcW8y8CZoP7J5jpr8PPafmADErxXWWEVzk5dUErYUdfyeg9Dok3eh7tsqe352nPz5yahjJLjE8CBMRLqkRVrt8eKQBQahyp", + "identifier": "7abf462d9e4a5e79ab488d0ae27941bea8770b92", + "depth": 5, + "child_number": 1024, + "address": "t1DpPkBSe3jAgeWN2ohC6YzvqvAhnAMf8s", + "bitcoin_address": "1CC2aN4UN4rYNjhUYu2vDPa1WMior7wRL6", + "secret": "ae6bbb63d3cda20792110d882457804951d9a575368aa68b70325fdc30c69466", + "public": "02ecbaf57af5d4c143c6503a68d68759e4d5fe15d11b52ddc7d7d0118ba9bf9f5e", + "signatures": [ + "6c60b18c1954f219f0367f4bbb6fb94ba4e0cfbfed4542da9ca6cdac3fc99fb01e0f4dd6d088f7a44a8585cecbe3888cd11b3de5c80b861e763d82c4e5e0303900", + "16084357a13b1736fcedcefee739b9b6e6874d09012b92a82ee596afad34e1ab517a50bd0c89ae6d92d9eabc1efc9d85d9a3b57f9a687a68fdab45ffd249e3aa01", + "8fa028f54dcc12f8f844fd6123a4b3e0e8d95ef90ea18986246348dc9ddb9cbc5d7e584889d6f3e5218094ab0cada74029f9c3ed03b81da440906040976b4bbc00", + "5b22e8948ed706166d2e38314d3a0ea74a34008f3bd9a4a27b88d6b69902c9a52aa9f170b49ba4c42df0fcc42cb242fb88818b6c44fd1216ddc1a7f3e39af1f900", + "35a8bce0ecf08d782b359ff6118a9a0605606dffb574e2d63261a80f1503ff617e354a73248731cdeb5ca8f7daa8153b290275b3ecd3506e3b211d6debabf5aa00", + "02f6e4f91c5899bb08ccc4e201e227854303c6380e56595d7305aa66a1cd017a1b4f3e5245b22745affea6c4bce0b0e4a7f219fb41a0ec8e1865d8091118fed601", + "20f0a127e1f73b6b015e0c9770bab9d7e8b3b29f3488fe82617a751b0a399bda3825d47c2c703323d4eaea3c7c06ce2af1e4133d11aab4829a11707bffbe9d1b01", + "0133f2a093536f83e534325696059ed26cdd30cf810656393e20cf72bf7decb255754cd30de65615686ef1b661c75b7192d20f5c1326ee720e171d0ded161a8601", + "2654b2d6c7c667ac7ebb58954fbd23aedd2282ae0e65a921a09ef3beb371042c00b38edea185c34ad12dca01a2ba3977a7866d0d6dc1c223a576db682eaf774101", + "b70361cf91862a3d6bfbc75ad115117804d694f73f025367b88a67017fab285a3c35125f5a5f0298167862b0843c5a1a3c7268c1dab34a876a62208e95878f7e01" + ] + }, + { + "path": "m/44'/0'/0'/0/2147483548", + "xpriv": "xprvA3utJ1Rr88Z5TqtR5q6hcTpf54Ahy34yygYq7cz9sbbQ9JLfYNTekMQQeTLG6c73KdriT5F8TXQWhyFDyhizxRYtdDZijZso9nQdGMscirG", + "xpub": "xpub6GuEhWxjxW7NgKxtBrdhybmPd61CNVnqLuURv1PmRw8P26fp5umuJ9itVhh6X9Feq4oAC4csLm7MYadY8L2kMDATMaeQeu5thm2ijwWh2pp", + "identifier": "981492b7a357b3925207328cfd5d514224d8cae5", + "depth": 5, + "child_number": 2147483548, + "address": "a9i4AP1JjMEw3py9Vinv1eJtDnzRQrTJxw", + "bitcoin_address": "1Es8MbzTGj5tkxssjjT5ai8sSSwhCNq4Sv", + "secret": "7e53f69e43773ab6b60d14ad6f583d59a77a30bb5d01524e76e28c735fd11f88", + "public": "0225edf7c4ab0edb404ba1c0fdb906fdbf2d0219b8c23843ca37f8b6f979883526", + "signatures": [ + "df251929837e95d516453e33ffb1d5b1573698e921637010ad8bfa452dcdd57f491034f99812f83dbe2c700ea9dcf52fef388c5a206a1211066044db701ad94901", + "7104477f80044453010088d2553ab65f62b4294aed1612dd73e42e7b9a3a9fae72f30289930fbbfd8223865ed138cadf98688c9e527638583b080341e56860b500", + "8f971cb901ff7f4ffbc40704256c6426bcaf70472fc5133258b6790817f3bfec65eaeb495960f40f0fdeaa1044f6d091ffe3f713b9032b58ec22f423a6c492b201", + "52a08321316c1282edb43467a623cc246a056f8ee33c8a544efa6afc385909cb08e07c75fd004be1bd3242511801b1eb31a6f2d6362971b14cacfee37ad1872000", + "c7ff9282138aa7a1e19fbb0e56ce6f59d887febf5e106c72e50cf05fc27b857e52bb0bb5e8f013e66897a992132bc186e98cfc20324f407cfc32c96eeefb5b1d00", + "1b5236f0f76a260a2a4a4eaac5bec2b50aeb7b2788e68bd7ecbed7c096855d61667950c1709cd26ab991d433144d944d5b44882c0f20a1dc0ec75813dd1c832701", + "c5169b1143a978109ac5e986da9908d49dcd5b80c4a8ecc47f5b23b48c5b6f7c544b4cf26c51f1a982700e971a0faa09722d223ea0428b51fd6874a5a494a69600", + "999e472f9bbc1cfa378ff59590d512c17fa5de51bc1eec8201fbe936a59302140457a44dfcd5a06f6ad3a18cb1c9b9fa55f54503b52b9870f8ce447c3b2595d701", + "22518764a60a8ed53f2b4fb34395d0017f10fa5a9c0d27ec314cf22240aa866a7483c3e168de5ef30a1738e9e8950dec11542c16ce66b1257650e8e2ff93842801", + "8694ac8f49af712a5bd8646775e83f076cadfeb6330f58e80e1141ebf2ff6f6028b45dfcedcf38eb6abbf3cd01307e44876baceeae9d97b615289808c3a8cf6801" + ] + }, + { + "path": "m/44'/0'/0'/0/2147483647", + "xpriv": "xprvA3utJ1Rr88Z9q1x3sgpbonP56LzP3v9g5kqHQNRQ3LwGTejiDLu9QgT2c42v7s7K9e7MwdQ5anXRTv9WmeUZ9fN59VD5x4ordXJ6UgRoGom", + "xpub": "xpub6GuEhWxjxW7T3W2WyiMcAvKoeNpsTNsXSyktCkq1bgUFLT4rktDPxUmWTM2mcv2878JhYppyuPrwcFagvcCEquLDXctY5q5shmQa9pcQQK6", + "identifier": "f33cbc86009a5b48582384973ff281a58b57548c", + "depth": 5, + "child_number": 2147483647, + "address": "mdDsxa4FgU168HU6Sx8prk2jXGTpFvpJEC", + "bitcoin_address": "1PB7xf19Vk6biorQXYyd8W8xzRADFRBrYL", + "secret": "0dd6558bc32ed960cac50043ae5960a5c6805c85b0e20154a03d9c6f70e661bc", + "public": "0310e2e047eba8ade874979bd286a0fd84fcad215229f57287f6a87e9d4564742a", + "signatures": [ + "33f66c4f74671dfe1ec42fc4ec4352575c31a423e482dbe54c9086a8d20180425d98f2970944efe5e2ce8cfb285d63d89abb164ae128c01e03c5557ad4ea1b0201", + "c2789e9df7118056c9f383197ba4691699b59e714f7bf7df3355ce765382415e521e6e0b4fead4871da9f97b6afdf762579971385b6fc785265da76f04a313ef01", + "e0a51466735ab90dc69ba971ce1e171e78c7b40c68d429ae9a93460eea348ad32c888602c6abd22559fac74960617fe4a7c604a8215a045a68db246ce190ab3100", + "f1149e7a6979dd8e25e52dba02a36e0f277b45295919dd96b1a99ca3e153674651d9dba9330b7436b5609e06eb59fa10e348ee6a859ca938c2b71a6a4e65a0f701", + "ed8f1d50131642f73f696278aef543db7ff8949e60cb0484cc731c8890faa6f56955ed62541690db6e55a27a73932eb973888326bad1a8a78dae49df1e9eeb1e00", + "6d24a544b6758dd65f0a2452cd0e8d90b0a66a7d0572d034299601b53e5206fc5fa952186c2ab689f0dd2854426e2a6e23418a89aa28e5dfee321e7a6c2ab85300", + "33a72c923dbd609c8c900379e0b454ed8a4ad04a581716c42c455775964937c70a5f2dbfb51a39355fa2d6ad0fb29c1a74599da276a347c5aa5b3a2e50d4c49501", + "3beedf40187d3ceac5f665fb636bb6643ad329dc3c582a8e26123d0329e8a41820f9c76a251a2ebfc0fdaf56c72cb27e6129bb89d676ce4f3a1e64c8a1f7c51e01", + "27b96b58a333df384be74e33b9a168ecab5683d0d75e184dd17ff2a0afb466801eea701ce78e628a84ecdd563bf6bfacdb6c506d2875a6e28787d9d92926aa8101", + "a600a2bade62fbbcaf81abcfdab01e97293a8f26af4777e19821f2a64509a7c924203cfdca49c57343d5a66447d9dfb5e701d94d2fa24df2c671aecd333ab68e01" + ] + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0002.golden b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0002.golden new file mode 100644 index 00000000..d016bfda --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0002.golden @@ -0,0 +1,233 @@ +{ + "seed": "oBfq4P6UMze5OBu4EtwFoTovtD7AB6IyUTobrk3wJ04=", + "base_path": "m/44'/0'/0'/0", + "child_numbers": [ + 0, + 1, + 2, + 3, + 4, + 100, + 1024, + 2147483548, + 2147483647 + ], + "keys": [ + { + "path": "m/44'/0'/0'/0/0", + "xpriv": "xprvA3GKSTGBcZC5VFAn5ywQBifWWeWDQJFN1fwkgsS4utLk2kTkcqPT3qXHr3pnrytgHcDQ7vqW1gRsGK6vQAJzAm5EU4bk3QyZZ8R6zeo6Cp6", + "xpub": "xpub6GFfqxo5SvkNhjFFC1UQYrcF4gLhokyDNtsMVFqgUDsiuYnuANhhbdqmhKgCYSAGZF1TDzqruCcYdk5WwGiFmpnVSzKs2XLudbeLERazLk2", + "identifier": "1420f10654d3fd5e5603c2eb71a7d514ed7c8f20", + "depth": 5, + "child_number": 0, + "address": "29H8xrq6otYbz3wHHUNxG6Ts4vnQyX1VB2W", + "bitcoin_address": "12qRyeqWqJeFEeLvCbG7mCt5poy8UEed3d", + "secret": "3253017ef44e2bd47efcb6d9de46452e74e1ebfc51ee54de43a4e6454a4fb74c", + "public": "029e80563dd5f64674cc2c0b016a303b937c62a7454d5ce2fc95e0886d7a668f63", + "signatures": [ + "e36caac30c3982710c15a224438e7544d97218527410d73a4919880a1e13dc1e2b674e9202c0eca1088fc8446bcc8b0eeedcaf3e403e809e22a54dfa64d7c64e01", + "85a23e1b1daf33c49b33d679a535fec9bb23fe52710951ee7de0f1f91fa876fe664db739be4f05a0d9443da2c41d289a9b9109c9754f02439726074de7c47aa700", + "3842e26658daaedd7c52d63a56f81087964add74349636edc3746e268df10d7414599442a574261c9b8ee2b69cbde48c1da92d603d2ef94ec04c5dae6974aae800", + "cbf45decf872f864c1108274625a006d1f7bd72f6032b236a944cec4bc42706071d424b0bba71b8b359363df3357fa860c3a8f35c89684b70e03c6bdb72d8e6501", + "63045376a125d1d56229fabaa19f0302e2805b0a140dfdf2c6e152d2c1c35961563d035aecf2de2f0480da99727d52ee6e6867715ef9065f597e4e4922c4a1f501", + "c501e4c3c8204305fd4b51841ac211e06367349c8fff7bd0d818bbdb0d3e765f735de0eb4470b28d5d7a07a010baf998c13cabd58fbcbf8a1d29aca7f42b734501", + "a0e90771c87605e8b84b7eb0b7d34f52724f724ae9625310a56a1887a38318053740bc926665cce1f375fae44acdfdcb4ce689dc88924a7f3a0b5f4fcc2b782b01", + "85aecd792030138ca8c2e0c43bba9c1bcc9122722adda08a8af154dbedfa5fcb5210bbcf2cd34e3e3418693bfa4382030a2fa191b0f54a83d4e1387f00564dca01", + "ef31db97c3622a2efdebe6b6f6bf91f74cfe3a39618997a1b26de17355e49600541907418dfb8b6a1a115d33a01d90ce1cf9c651632398309130c89c0a8918a300", + "0d9029343f9088ed2b519f47ba01500be3620cfb9a9cfb410cc231e20bb088186e6ec82a9ccd8d9e874d35c63cc1e38004cf487eb1ebe371c0042858b1a4f18700" + ] + }, + { + "path": "m/44'/0'/0'/0/1", + "xpriv": "xprvA3GKSTGBcZC5WkEEmagWyRJSLNs2ZDaUNT5PLS1dmtDYURcviPuWC22U4jq9WMFFPNmdcmcuuFk7X35AQHF8H88dbGECRmXwK9BqBQeWLzG", + "xpub": "xpub6GFfqxo5SvkNjEJhscDXLZFAtQhWxgJKjfzz8pRFLDkXMDx5FwDkjpLwv2iUEFYf1hbiW3oZhxzwkKRFyL3RHzfS9LCbqQLZjVbtNQqVm9h", + "identifier": "cf0cf2f6dab202be41d804f49f075acef469a0a9", + "depth": 5, + "child_number": 1, + "address": "muzcUVUhcD2WSHeEYGSNS9ayNx7q5M6z6R", + "bitcoin_address": "1KsnPRkPrDb88oouVBJrgzcfWkS7zmysXL", + "secret": "8a255306583de4d6ca7d451d361d2d579464148bebe21dd0413d2e215c1e12eb", + "public": "037e5dba2ca2efdc117a6d9059a9baac4d94dcd4dfdab410d96f24d9effc64dfcf", + "signatures": [ + "f22a9618f2a0cd14f3ad37282246e44c930072b63388690957ab7d92ab2533f83d171893b49fbb5b060ab490479762f325034c00e29f06034b51ae1d0c7cb81d00", + "66967f983713ddd0938151b7397405b82fcc705d1eecec471bb6d48c01f7029f2be71767056e3c4da4018f561b86ab1243ea937187bc8289107f6c24b60998c300", + "59389ce80445b1e7a7508a6db6a591696500efde19fc94a7d1b2249a4571e7aa344e64d706a31a63fb4ba18a874e8d48cd08ea278917f46cce6584404bec639c00", + "b482167f2141f8acd65bb1a6a1b907c129a378445d13321fd1d7cbc713cf8ff9675a43285e014488c95062e18a5edde66b615656a012ee7dbbe6a77d9ce543bb01", + "de52ccf950fe50e4b2ed262a52f076d96c476b792d3b61afdccba98151046a2e01c80b8e50e3a75efa9b08e618086832c3188a56f64667837fc2e47b226d773b01", + "48b04f8e586e1338efc030c3b190c105f206312ac5b78296c42a048e3dffd67e35bca3e55bd9b1a47712d105414980700024a35502ff946b393ca890279711e300", + "4434f6fc2b0ed63a3e79206ed0f9bd19575612b8b67bd4250aaee83efa4a64b2695941c33ea2e6a3b6436674ffa7537e50d861a42ac355b14d7f71ef9cd4dfd301", + "f790c1d66bc6f37e47f1bc99741a96d285b2e88fed0f1051d5ae4fc6d8655a8f3e87c3473c2d85bbb2b0d214ce29da124dca82865f87645ac68d9550ba29e3fe00", + "bf90d4e7055649425f236706867c8abd5786568011299cd1567b2865125c2cbd17ec383f8fdb486f7e987e7dcaef9e52bbd31030dcd813cf6f369dedf37a279901", + "128c9aa4e83c02bbb6f3fa2db4afabc596faa3efc5f03af5186c3baaf593591a25f5307e47cc488f94b384264373cd4f22c264dd6cd6ea596d485c29cd77cd0300" + ] + }, + { + "path": "m/44'/0'/0'/0/2", + "xpriv": "xprvA3GKSTGBcZC5acG1Fo4meuU9FELJZkbgBpJ87Jtezr9Ywrn6QASjSYYVdT2tf72GJC4zJcKTYDRARwgTpYwhuejZs8Fz5bWoAUAs7oP7zqx", + "xpub": "xpub6GFfqxo5SvkNo6LUMpbn23QsoGAnyDKXZ3DiuhJGZBgXpf7EwhkyzLryUgUJ1mgrnjXTcd5GwHo2su59BEqJBQ5anMWhfytUYi2VJVsncNa", + "identifier": "a9586bc448073426b3346b3e1fb0574f935d04e6", + "depth": 5, + "child_number": 2, + "address": "2Vdr1t9tkGshWPXf6GqXnba3qnZSWkSuD2o", + "bitcoin_address": "1GSR81uWH9wtXqjBvPARPGYVti4wQYj1SL", + "secret": "f6ffb07409aa86ab6be4ce86802d4c7b76451a5ffc126854f10ee5fcfa17f4d9", + "public": "022546ab73d9df80dee1410befb33e34f72f26764f23c7b12d376e483371ca5c02", + "signatures": [ + "e103a997ebcaaf2199ff7724b5e873bb6dc8d6264be61bda4fe522f9a5d5298b1b93d311a31f6f03fa19b87baf9f8df948cb7059e22f2a79387ae9755f8d4a2c00", + "b8426d0d3c441ff617409a97a5202d21b8618355667e3f9ea9957fcd19cb28b20b1c76f47f19ac48664650662b7bb6a2ff3143c68e213f3ee093a31b7cddf10b01", + "34d6cfae344f9be458ecc0307a86898feca4915a58ad7d5bed83cfe247a6f18f03430e2282ea142e6aa9ef664f4f4402730e91f40a8a728785b0990c76cc945900", + "dc3cdefd0142dcec981e4d3ac57a3810c8f26e0eeb62f1ec9310cfe2cab990436f27399eb6d566a6adfb942d8d044de13ec9ed98d0212e7d2cf69bf22af9c78201", + "d8e723042b8c72e090f03e857273c61b95bb33f360a6d3c15138188f5dab05231023a1de9b9312ebca95f1eb47294f82d628964d9fa69b9f604055761685127701", + "0e58c2757592920c79f89f69684cb5047c2040c912f8d52681076a20602076d33908048ed0626d54602442c6f2093e1c4a7cded1ae5973398df0ef9a50398e5d01", + "d4591030a8ee37e9a60dc4a91f17b4f6d67bcff40494eff1ac8e3ee19d3d2b9c14b573c1ce754b104230bc5b82ef700f3403f8a857a8d7ad3872768d100deb1200", + "5ba4adb9f42503f092f1aa6e7e42f690742c64d1ce21b81d499cb0af2301c16e78574053cef08ffbec382e98b9553d3792982b870e73dc3b80fd8aa7ddac1b7a01", + "674c97a9bd52aaec6c895287139ae794127963500905945776dd4c2a1b9dbfa163e94a7f789dee088ffe1a43df97b02ad97585169ef8a04aa20da47d387a7d3200", + "8848761de19d0c50b39ca9c6c60b6c48a686dff6473cac45ae509d01df80fb1e02f263f81928dba04a049364ca4cbbfdf94928509169005410052c0a73f214cb01" + ] + }, + { + "path": "m/44'/0'/0'/0/3", + "xpriv": "xprvA3GKSTGBcZC5chbthRXvVpfX6ZxMJWQy87DPKT4drbJx1M3Qr4KpMrp33Hr3UTLNUfR64VFEbM9yHWPv1FyjGRA1e9sMNinsH6Kvz8nec2y", + "xpub": "xpub6GFfqxo5SvkNqBgMoT4vrxcFebnqhy8pVL8z7qUFQvqvt9NZPbe4uf8WtbA7j34AVXc4ndM936hssMChKcn6KanFqVyBN2P37H1rFuCC4G9", + "identifier": "27333e5c912196956d567094d2a50321e62cdd7e", + "depth": 5, + "child_number": 3, + "address": "FZFUYWGD1efpmZemofMeBt6oPdHFt53AXR", + "bitcoin_address": "14aGjx3snwxtdApsw7iEr2YFYbU1MXgd5L", + "secret": "b2c1a5fb19dfc23ac83a3e84170e193a632d5457480e9a4d0bb58bd0740ded67", + "public": "03df2d012f596d33b828208fc23968c2804f7480ccb2a38207bfeb8dfebbfbc31e", + "signatures": [ + "80ee093812a9b581d9a594f29d7857105a9a6e4e76803808ffc9c3ac7f68d07202fe2ba1927dd98ab120c5bcc58b1970e41c51759732c5e8bdd35c07d4ec0f8b01", + "27bd5df8dfa4af4c7c0620573eb56c7b61771286c411ff2585ab62586c540a206755f30b7c2b6db0a4e7f38149db6e1adea272ca059c279ece05243639abe77100", + "bcc26c8b5d99bcced80bb90e882d3417c58306580d26f890c07364850cf5c00950ab64cea7e9279f5a31cffe44df64b63cbf144140c56d70e40372938768d45400", + "c2f85c1f5ff0ffe1daf70080a59d104ebdd5b8da53cdb55c89630ba6bd9acc393308856bed317b2ae92af703656f0b179d25a1695171ebb4c1d67e1f384a530300", + "3921f54c04bd65bc2503bda849b92f6def4f4858c79bef499de3b62b2df3ec0016c803ddcde1a07efeb3de50d0e8cb3df29b2e2c07525ff417de22608c34b84c01", + "8fc415e30fcfedf19cdd8a280a176a131d04d2bd027225109e49c54a383a55cb4f9d20079cff534b813ae75b7b93ed74225184cb664dca6cc6ac391607fe7bc801", + "80760efe8dcc2741a50ced886641c61df4ab1cf0ed2c504c76db873324043c6b77c392870d172edffdff1b54de098fe4f29521bad2538d4980ddd5e08cfe096900", + "bb8a3f7b5cd5d318e292ff931e9c5051da1c7792470d257e5d05331107fc6a5963613db8ba1a89fc1058c4f75c9ec2595d0645a09f5c0bd99c8c9648ab92620901", + "421c765d5ca8aa4370d8bbd000cbaa2ea4428a617a323e928e1d248f06029e0e4c7a06dc3ac840c7ba55391fc28d8a1ea4880b01aaa2f09b74c577b94c62f61f01", + "f534a0b752aa69089b7ea22a098cf100d1cef75f9e399be8b81c9406297c717a4c4ef24fde9b7ab752dcb4ae8ca820aa86914d4af65ac86195526b023fbb765100" + ] + }, + { + "path": "m/44'/0'/0'/0/4", + "xpriv": "xprvA3GKSTGBcZC5fXpyjPNfwSb8amH55tGAjsM1RP2QcEC8UxUNUnjLEtP3d3dTxDY7fy7QZs5VPLUhfT69jDibJw48UkGVzvqFXnwF1q8TD8Q", + "xpub": "xpub6GFfqxo5SvkNt1uSqQugJaXs8o7ZVLz276GcDmS2AZj7MkoX2L3anghXUMzGCdSyMtfqFMngMY5nrLFapyDdXfzMyocSnseScRLG9D7PUxv", + "identifier": "85af0c752fd12cdbdb0d8db00418dcab8e72c6a0", + "depth": 5, + "child_number": 4, + "address": "t4p94aKVc4WmKELFhemALTXpM8nifQWmZm", + "bitcoin_address": "1DBra7Fb4jw8p4cVCT3U4wkSk8AmckSPHd", + "secret": "16547122c4e26d630874744d15e8c1cf0ab848edde8b9158c445364f795eac26", + "public": "03cca17454a589d0d849a172f631ce32239c15142e22a205517fea659d2270f9a7", + "signatures": [ + "626a9baa73232dcc0c3351cee265cac4792ae0157d21a0db577132279e882ce5175495956e9809232f74bb0e1a85dc2f8bc78be5c4ee8f01b02e6a893a65e9aa00", + "f5339b1c87857617b69dc560c451bfa35a39d8a61e1cc9f533a4644f6b76a37c0b54ee755edebcb415434c8786a80d4f5ce868fbdde34c31a0af05bd7e04acbd01", + "ade343d9126554701f6a4f790fd2e95f9900a68cd370fc55da3a292bec0d01e409f5b4d3766e22ff491195cddf2532214915fa7e30a75ece301ac7cf0a1f237d00", + "015f14829adc974fd12d2f1351a906e8df6fc39e3c5d68d710ff90a5ce07109b02d4b9a19e2552e60542b950569d6323c123aa7d1893e02034df32e937d848bb00", + "654162655a3adac3adb56e2b1a3b4d26639899a3b5d2730bbe36839ebd339bf45abc8edfaed9f667fd9422b71bfe96f1aa1d6494ae5fb48449d3c0b7d32a650c00", + "e399cc15b5ba6a943be036521119f54aebbcd6e023933d747d66239e096ffb6c45a6f78d4603e3502b4c1ab2e84077df92b8b99b3d40e5fd25053ab3fc0ec37300", + "3de1b8c700ee26cb61d63032cbc02e48550594e1ae16e2c86c6fdbd83bdea25230a03e45b8d98eeef77a237b86d0370f33e02dea724975ec9d27c6c7133e8b5301", + "ed1f8bfebd25d9db6fe3e777b8f49c3db8bab361b2c19ce73d7508ff456919c10cee56797ba5ab126f49ef282cb055345786372cf2c6c27a76c8d23bcc42630f00", + "8f7129072446ec309bcb2a66dd9931da16bf26f3a80c8c524d21383d8090716b055dad5ae7c1ad18be5593e44283ba77eb8057c14024f21ae983af16a44be6cb00", + "1fd88f3fcc15f9b78e308c4cb5bb8d1b773f6b0ca3caf93b80c6969b7fb55d64644fa035c9c190578150d949ad1e98ed6ee1d7ba6d5db130b04f927250b3e8cd01" + ] + }, + { + "path": "m/44'/0'/0'/0/100", + "xpriv": "xprvA3GKSTGBcZC9s2MDexykCvb4evpt1mVrHNMaCWRg96tYWsqpT5MNgb2BzDkbuZ6WsroYGb8PMNduJ6Z7iM3i21M3ShfJfzjEYv3sqTwKtyS", + "xpub": "xpub6GFfqxo5SvkT5WRgkzWka4XoCxfNREDhebHAztqHhSRXPgAxzcfdEPLfqVkoKtxcaoKmcchUh1EcQVMjtuzQTGj2EhjKgn5N4pAZUwSQrvu", + "identifier": "26a5764c8b6ec0a27847ee390a10e60b633994b7", + "depth": 5, + "child_number": 100, + "address": "2hZH4dE4KHwB3hoQEDEbkS8K9zqrH54ZNxE", + "bitcoin_address": "14XLtoJ7pzTfnxj5vLbZXWuiYeCp1VWejz", + "secret": "659c231424344d715b08c6e783cd5b3cf78f0d053cb12ff186387bc75f721168", + "public": "02e5be1b32814cd1e1fa7e7293092a5b08278e45133f08acd4b5520687ef0ef6bf", + "signatures": [ + "572700756ad92d2a2b553920e155211e312d932efb2c4b5f53a20d264291139a5c94a9e8b6dd573013e7f693c32e3f34f2c4bb8862976de092df02c5e4f124a700", + "19766b1040d55d3246965112ae514d550d32c77a09a5884bfe4e31fcc9f86b9b68501c324ba8946a5fd5a5ebcbbbb70c49231513f520471c6cc63ca5c572954b01", + "1a2d1af6d23cbda1a86a6cd083274b2b3e91b7147231df34332c2599b57c02b45c127e6f73b70ab966066ab3f31d1ebaf7778c1435db16f02f66e7a63ee3e62000", + "eb08f1a68cbeddf796881e37be48589ca09a986903a85f781b62be61bab9c5d664b94ef041c7e254747cf9add4021fbe629ad019bcbd7488cfc4942ec9fc107101", + "8094a14a620da3720be013e8c68d8a2cbe2d7edac442bd9646a830986d47aefa77b39d9b5a87464d13042eab0fe5a51a4152b3cf3497da2b9bdc049842384e5300", + "65e0cce292a2936a63469c0fbb7c4619d9084b14fe1267818585fa62074bd25042f95e27a7a1f5b8e5bfd54bc12d98fb273aba527a80bedc721f33d8dc9399ef00", + "2a5cebabbb8895789bbaaa3a4450b0f0da817fb65dc4b37878e16d1fb9f095c4597aeb94805a5326db5f77e0951ebe68925c405bfb596cac850189f213c3e31c00", + "6471a28909dfaaafbe15072428bb9d9fd4ccc681eff3e11c8e5616b2122bf31d532095621b3800602d5e81a8c4a7411ffcb9b0a6e892da8f5b322324020a22fb00", + "85519525e86e50ca53bd871214946997e3051b29ffdd722170a971cc6098e5be30eda098c049e6c3e3f474dd7010b28f9c2318bfc3ab5bb035943ffa8266ed2700", + "9b73a348880171d7bf924bc0915f7a6803bc97d5f0b52dc278a1bb5f15f8a7a34cc5fa980a9dc313aba6ad35c3e99a50448a5b99e12f465242be1ae471e4d71c01" + ] + }, + { + "path": "m/44'/0'/0'/0/1024", + "xpriv": "xprvA3GKSTGBcZCrUjNoT58frJFr56q1sp13QXkRuCH7sf2KXfR7inZdmupm4pNAc7bYYCbxjUdt3JS1UxpGvvec132EudHPMuyWyj48GMgbEBV", + "xpub": "xpub6GFfqxo5Svm9hDTGZ6fgDSCad8fWHGitmkg2hagjRzZJQTkGGKstKi9Ev6NrL3SRgDyRgTftq9cednzQ2H4Mk5eSc8NjGPHfZapgyUnUCvF", + "identifier": "376531168f2b6cc08ff9b51698dcb6c478989583", + "depth": 5, + "child_number": 1024, + "address": "2Wqrk4VqR4s22yEAF5fA2DwNx2NQ912xPyJ", + "bitcoin_address": "163uPUeowWktjK46M7aY5VvZdpKWN6LmP9", + "secret": "4388228b9fe7a03652347ef593e0ff75693ce6186521bbc0db97b1f83c6b67d6", + "public": "02c4c5c2af5528f59daf444ef262c728c764d5f10f83bfda7f56a1a3236a5c680b", + "signatures": [ + "fe8e38b66d7a9b697a543f32e661c28e1640bfe253ce6958a99a0baba1ec3e563e2f5126c8c605735292669878a9de41111ed5201bd004114af20b62611a248b00", + "a0e9d900837792dc4aaaff8f2b87d040c6b873a267b60c00c9e273c1bf42958e1949b222964bef3908e9668471391fda0242075b3f4b7bf704fc53681cc553c701", + "d57009e209ae9b8da23e9579ba6040674b503c146813a833d6010923452374d51da9a636c47282e59ebd148a213de55d141b745ecc824d2988cb85a09dacc8b600", + "2201280307d350d9c4022048077dc4882d61a9c003a8847541cf4b360b65d3005d5c030c925c3388496ff6be0eecfb60958620df0cf9e605aa92a3906267224a00", + "8957dd50f1ba856ac732da25d5380221d5698a0af239f1c245730c095fc0a6af6543b5a5def87c69cbd6d217715e59bb62b201065880730c2fa450e6772b323900", + "c60f87b3b8b62229d12dfb8a0a37da06e376d7516d986b33dcd9a16cde9fd54967a79e6ed868797cfc566695b57049f6dfcc3e3cb2e75cf8333ba7b67d92015b01", + "922b9af58cd2652c8b21ce82ec5d6853a004695ac6894b0198af496c04f8d88c73682f74a10cf12eb60417159278f5b6b2a75c5ad4e2afcfe21f85f1b419680400", + "5607cd076c5b6dac0d90fe3553d38df900298c2a7d959d1c17d66672500f70c35ac318e418373ff0517455f084bcc5ad7728a310664ca1c97e174275dddc16d000", + "4421d63d362f514c103e15e151745c970bf234fe0740f5e2fb2d33c6c964fb1e0d2ea06f0b1399011f0d1c18c1fd7de066f1a71a6883e37c98767ce41267fa7501", + "9f0f4dc45ce491b4b142ff963302455125a1ccb85a56ce52566c639a63fbd584200aa3d7c65791533b31bdb055ee37e65ef59ceaaf37d25b151e585061da014300" + ] + }, + { + "path": "m/44'/0'/0'/0/2147483548", + "xpriv": "xprvA3GKSTGKxDiyFcHrYLn7UASmMwmXYLXhVZPC4QqyFg1umpiRT2Rqfi5C6Rbg6Q2q1BRMihoJHHydYCG54ndoqArALmFZT5H732zvhiGWEw4", + "xpub": "xpub6GFfqxoDnbHGU6NKeNK7qJPVuyc1woFYrnJnroFap1Yted3ZzZk6DWPfwhFSZap999EbGKK9GMfdWzRUfpcwxTermfDnBSESBzKykABKr3n", + "identifier": "d84a3bb1ad1fe55bdb0354083d78350fea6afcee", + "depth": 5, + "child_number": 2147483548, + "address": "wMwH3RPiPZLq8sJEEEc3mEKsCmjcmg2zVT", + "bitcoin_address": "1LidtFLMCGUiTrEwteCSM6K7gKpw9ZBx8F", + "secret": "b0165b43487bcc15a2d94bad32b230474085505bad8b2b167ef48e5d254eb323", + "public": "0301d4ade3ce24b56c8fc345a75726cd850f5241f14d9da101a6e775cf1328baae", + "signatures": [ + "f334e7b86b34f04806fc452b7d7d08c1d6d305ba57b2cb496f010c79361c3c6a5e2395fba52d37536ed54bd8961c34ccf7e360f29ebd31e5f7b2272a184bf93800", + "e587edfdbf4354a820b69389cd7ef7d186bf88841e5b4e0b60d9ad6efde72fcf3c14fd3875a11dbaa5bc2546f17e71e1e894ca5a7738751ce9e08ed3f568eeae00", + "2476414593544a27a8f35f085ee9d3b5d4e46113c8fbc073940f9d9b8447ace10771dbb7b76ce54b23d4ddf17198f9a2988e0dfc65779cf6835591f35f7e163300", + "6f5eccac2fcdfbd30a1b840689a2714b1552bb4c993aa5fd612f506d0738f19d33ab4ca117e76f49df9f6c5c6fd7840937158e68abe7f81c00109974c9ba0a7400", + "70b4c97f451c4778a9380ddd7bf38b3a24b7c182714a16e82a48f85192da2406486e4f1822dc072ea7562ab97cadca67db46c59316bf003cd69da6f49c0fdf8100", + "1e5e999c70c8ff1c53ba55a8cd32036a358159d85e2a3d908466c8cbc085f135315ee584eef61c582f9981d57c127e2bbd27402ac326876b343037e09faa171701", + "b284942852365b8224a94b62a8a69155e4ec12951a32ff34d3908211aac9426b67bf2a992c6aad72bf69b5e8986723213797d365a7896dc57a2f59cc215ae06b01", + "4117926fa788fbce489732fd72b1506cbfc122006cd0ed9771c91f07c298c91d65d65f2ec54b7e6ec7540361e01c72f6d470380867c84b9a536888377cbc3cad01", + "033f1ca1040f82a1e6b1563f1c99d65610a8f5961e08a8e0d85fbaa4de9c0f4a3798d0e5240ea7a4ecb102a9f97f69244a60b2f85d646e0c36e5b376829fbf0300", + "db2354b85063d433b3e217123a1657309840803a3576dd29f12273f0d879b5c93684e3ee3987f6d4b226256c8838596747526d71ea0924d251c69b6af34c012f00" + ] + }, + { + "path": "m/44'/0'/0'/0/2147483647", + "xpriv": "xprvA3GKSTGKxDj3cs6xzbwxmZQ9NVMWUow4XKK4yVUvvkDdbgJXiwoAWmuqFrwu8vbAjkTAPXuoS2fV2WFwfsr5C4oXKNvDKFdMV5iWwJE4oXi", + "xpub": "xpub6GFfqxoDnbHLqMBS6dUy8hLsvXBztGeutYEfmstYV5kcUUdgGV7R4aEK7BVnriqm5EtcYpxwo8Y78miVKuXfZMwn3GdQyMU4Z8L87hRN867", + "identifier": "153d7869daf97f4f6915d067432100847db105d5", + "depth": 5, + "child_number": 2147483647, + "address": "NwvAhucFatmbHM2DHFF5rfrNkP5WYsBHHR", + "bitcoin_address": "12wJq4jGvuBa2vxEhMJMGAiuhRnzK2RaKT", + "secret": "2abcbb14ca42677698ef70c61339bcc927fa5a80cc01e22cda9751e60ce886a2", + "public": "03fa3aa875333bf2eb35e434091d84c9f7f33cec6b94176805576922178efa5ed5", + "signatures": [ + "c41d747331bd9bee7c64b0943797e0dcf88b24ec32f3fcffc8a6a712067776d014ac7c165b070e81e1c2a98677d2ae19a9f87f4ff0b07fbced37335c6c2960a700", + "b7476c7c2fb04959f50f12c326f6ae8622e0d678f551b99c8a100293833332253da0b84f0fc3eb4035b49672b053b201e9985bbe841c787503a16bde1fe7d08e00", + "f9a6a3ab7fcb39d5cbfbe2533ba1f00e4d2e55e5608b6385a049b37d0e861c4c36ed258440f1d91877de190dd2c82b29cfb5433d5bcfe35c52cbfadfd07975eb00", + "c7e63f0d1d5eb0da8e98fcdfbccfeada38413f77d54c3bd9bfab2c659245b9617cd639fe10c88554edd6333021953a4ecd870af47f1da8451a25fb5d9dba35d801", + "16b0da8cb138a5de0accfb3965e45916425d6f26a6671d0d43c4279c0d3a70534f59d15ddb53369fafa59429d6b6104b0d415ec1db9452bdaa4e312b3879e37d01", + "e0bcdaa49050f1e5e0b3a4d1a8ad25967c4045dd0b4afa51004030adbbb550c97c4595ac891660d66c0ba2fb9a0930b27d0f3749da06cf7ed0265f9cce2991a500", + "7c37b3600186fea7827248a436de54f8f9a25bf877b8d4f09b5b86beab7e84b832dcc9970586b470ba290134bbb3284620e5e69f235271a5231705809e4296da01", + "ee4e94224ab4950aa382539d19f9cce776e6a9c0208619124d9d1ee518510a012d39bc533478d6996179acc7dd71bbc92ba0511a5b209458e91015c4353f759101", + "f6a417945f65af03f0c5f9347c177e8bd88a317b931856b584248a1dead48b377f6439d06eb6d775fc1639032722ed9f3bfb1c5222ff27ecf5a863969a6ac1ef00", + "02ac73e76645b4b3e88a91fbc852f62f5fc56c42fa2fea5bd400596da10e4c5b34bb3dfbac49965028450ae6c78354e86dc8b4bb057c8a77f9dfed773d1253d201" + ] + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0003.golden b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0003.golden new file mode 100644 index 00000000..5b733aff --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0003.golden @@ -0,0 +1,233 @@ +{ + "seed": "1XoRKDU3iECa8KEMmsWvZgY4/HO8G01OfwCf1HcEKsk=", + "base_path": "m/44'/0'/0'/0", + "child_numbers": [ + 0, + 1, + 2, + 3, + 4, + 100, + 1024, + 2147483548, + 2147483647 + ], + "keys": [ + { + "path": "m/44'/0'/0'/0/0", + "xpriv": "xprvA3HG1Rk1HM9ZWtYnUqVfQmDMVwjnAhN2ybPPBUQZJvtxtR42A4kM55V4a5GdaByvnpLbkJ3EkXUDW8P9fAmeHxjWwtZfzrVmK9Zyu97GJnh", + "xpub": "xpub6GGcQwGu7ihrjNdFas2fmuA63yaGaA5tLpJyyrpAsGRwmDPAhc4bcsoYRMvtS9Gjo3nyKRXPaSYYKResdf52gjyjQTqFBVryjpAmy3fU3de", + "identifier": "cea5662776f130e1273ddedacab4cae680a2a5ad", + "depth": 5, + "child_number": 0, + "address": "Zsm4MpMhjQCuFbq5QD6U6JLP9Kufzkm3Nd", + "bitcoin_address": "1KqeLeLnrX5RgYJasgjzVgx3otpuK14HAA", + "secret": "e546cf8082daad04ec1c86b22d9b651b04aa7ccf44c8e14bb13ff13fa3a00241", + "public": "03bbd3e2a8ded9965b673844465a15737e69873ba0dada2fd97b815e7836f555c8", + "signatures": [ + "829d4f67dfa11ef7f1b7ffc089b38b639c9b54b900ddff38a61ac1f5cde778ce50594aa0490b055c69822e197e40921e97077f777d3d7facaaf5f1de33be4a5d01", + "04d485028852680d888be85847034430a6c94fb38045c248bb2177b2608e20791fdd6ad19370a452c0c96deb3ca68fb0970db3f3fa75584f1291fe20ae2a99e200", + "2634a9fdc9f9d3ce18a848a5a98c576fecaa50f86e942901ea2ccd3c513f6623480ec015e40c203e0fccb5d773347539109f2c7e970a0e6991e6d76dd246e27201", + "a95653bddacddeb94cc8e4ab9e0bd1b39af2fd86203edf76794b48d5af384c4926cb245583072ddd298a63a5c26eb161d8a5d6a2c7475620d926ba3827887a3501", + "85781fcea6cb20723f80d0a4f3ae12efffd7c5e7fcad5004fa8ed606d5afbf8668aa9fcef28d8893b2c5a6964c5957753658112310e4fe8a3e5a9418d39ca50b00", + "a85079b461ac3a825c5b4685a57478232074d3b27e91d3e369e604a78abc67c2359b3d58a18b72daf0cf1b95e410af7f4dd6f5cdfb80f7b0b6557bec5ad8b59200", + "4f4fcd11689bf808ac92aff9729dbf533213dba690cce0ffd8435360d4ff3eb148ed52a89f5819925d3d194e54b5391b4b848c8ffed88393e318a9b65285dce700", + "7547b41d7c4a136a31f19c87fefade0bea559e79334c849f1b310215284dec7f3c93458d78a14fa3413e802f0e603f974fd2fdcc3ae8038c828f1d02b6cbcab300", + "e6f7c824eb6e3705912239064d86f6d3806f01e99eb8a31fd3f341f88e74033324c38d8d24fb3f3e4734e12c13606e6303546880830c812fee95dd4d5045afc701", + "ddde7cb4b8a183dfeb2d248c3d0b6441fc1e4a2216c3118cc5e13691d67e64906f2d9994518b1e1d562b777157ed4b90bdf028d847808f16bf4a541f3ccdf1f300" + ] + }, + { + "path": "m/44'/0'/0'/0/1", + "xpriv": "xprvA3HG1Rk1HM9ZaRhphLMiu3JYQJ7rxCP4z9Nymo5MdzMHw72BKjboD9wjqU6sRDsH5hP1pZ7sSv4Qk9XEmSq7edFCmrWfNRJDsxw422RmHaP", + "xpub": "xpub6GGcQwGu7ihrnunHoMtjGBFGxKxMMf6vMNJaaBUyCKtGouMKsGv3kxGDgjpYySenqxNYcze5e7Vjt6zatxeWeKtu4GuWqTWa4gd1odVMjXb", + "identifier": "6c922284d4273e56733aba1e003edc3977cf23c3", + "depth": 5, + "child_number": 1, + "address": "6NfX1WnVYWYTFjq9PwPobH5pxFTBk68yNP", + "bitcoin_address": "1Au53LyJzrSfR8bAY3z58Kq1mrJPc85z3o", + "secret": "e1286205d53a54247708564bf9266756ac8bc7e706d81883f380725270549d45", + "public": "033bca9524546d0b523f50b7aedb2aae2f2093a04b8047a1a85de361b783d7aee5", + "signatures": [ + "56a8c378982a0e258ad3c6080288b623134648fb537355ef3d7227cbcc55ac8a1b7e340892db93a192060023c2b8ec4dcf96ebbbcb8ba05e4fc3940b7a7bcedb00", + "97e67a191af5a8b2bb429ccf8bee4fab688c8195770692d247f73f0e4c9f51563efa7b81374d2c9c5d347ad8b854af44bc28341a6e919e83e67ea7870e29e63701", + "8f06ba45b391d84872c50548664f02ce62b5bbde1848a9e7db4cb42f8d12aec57271ebecc8f37310f51e6a85eacaab694756837e1fe22620a81efadf6f5c092b01", + "c57f6bc31d00d2d929535c15d5dc0094ff0e4e5ff47b73da8c6202b493f2eedf38b8abda157df2c86165a09603801f6746ecf6e5d372e8c010dc9a510e3b5ca901", + "49c6b418de97da39a52a4b6341e315618b1b8ac01eb10d014a0f1f1c8fc09fc4099e786e739b48b78638a60b46402319ef74c2099b1147725f634a5fd0c5a81d00", + "f1f7bc12b613929688c7aba305f257711871a86af73183c1c2d3e2617897ee713c314e1ce43da65fd7f8b30335eeab6f233a21eb58a870f5c27e9bdf8263d9ae01", + "e2464daf62f399512934674e0621564e5b2d6e64a45a043b6b07b3ca5a2e4f2e060254ee412308f1b3893f7aca3ce7e0dbb2d2d2c8b983814d1ec5bfa7a9646c01", + "fdaabdabc57d93b7667edffcc97a7eff02be96ffc4a0413e94b2fd4698b3b1fd5dd6d35fbebf302902f865fa50141e545da5854a9d599758e3d86ba2374cdbbd01", + "84ad0e4490847d65facafb065cc6e0ab68bf3643f0d65782e03b9c326443f1f5234b776eebe2ca002678f73ef7afe244663ae93268e8009369eeb636637ce8f801", + "62f4e060adb4401a74b93b5d8190f06cd7dd7f214de225ae51e40a983346952d6dbaa204c4a0082841fbd2e33fc5fc58d2a10e4b6714bf006ab28785ccbc3cfd00" + ] + }, + { + "path": "m/44'/0'/0'/0/2", + "xpriv": "xprvA3HG1Rk1HM9ZdshqSaxSRufbDmTw62snFfJngXnY5mtY7QGisVYoq9HJ3VvHuoFinyyYYcJCxx38kurKjYFts5ksrGaN5qdyRD9gmkqumtZ", + "xpub": "xpub6GGcQwGu7ihrrMnJYcVSo3cKmoJRVVbdctEPUvC9e7RWzCbsR2s4NwbmtjykYNZLzTti3kTBUmnHxxdBHBGKnzfgtocK3wdfmHH39yLXCpZ", + "identifier": "7e03f8e18fbcd5df595ca46c83b593454cab67f2", + "depth": 5, + "child_number": 2, + "address": "21UNT58xQRbDoDg4zpBrbZpnnsujPVa2rBW", + "bitcoin_address": "1CVJuAUXxrCcTU9RPYLgAFL5EjQojKQjtw", + "secret": "aff94206a07ddb32a5dd1fe58c357b6b0a067aa0c3a35bc3ef1d4b268fa078be", + "public": "02301f1bd410cbaf1853be67cc73849f8f6968fb4ab6303b83d5073644d43099fc", + "signatures": [ + "67a1bf4f8e3b2ca5f483b65a00871da7e35569fb29adf7365a739638897b25b47686a72a9e8caedacf148b2b5773111153fdbe18133e32b936bde12eeae2c63101", + "4de672dd76d80f03f8ca81eabe24e3da0f34be951741e63eb4602608566054bf6aedccac298c3bc9373eb06c2507ef1e1ab6c62b9dc32a4401b88fd197a27b8701", + "633c30156bce4c7575ab7cb8f19028c2a9eb9e35752ce2a5ca88fdf86aaa705c1710380fd28a0af6a8cead20cb94118a15a6c3560ba9412c2cd8911ad87d91c401", + "24ee87c42c4f10e3f18a95a1a147119062f7a1fa05ae4ef1d33840e7c18f34566e0924def467531e6a41f327af2c9da41e52bc1dffe2db7bf586af19ef594fe700", + "0bdf3ee9088243b7ead7150d350bf4eb8994c5e71418db9b508a3a45aa32618574e5bb915a4e94dcb9ef629a364fb1d7cfb7c33975c844f5d953f50045fd08d501", + "c2c3e56f797dea29f4f383c33b0693d273e7b14bfb1249351abc2bb652c283a46415cb545dad2c94a1643a47695d5f1030c609a8149eb361352774079c719dfe00", + "27234de13b2843ed7fd32c7465efe05c6d653bca99f9f93b2a2de323564c0cba5f97e7cc6db0886d0957e38f6b08dcc7104d66b30f889448cf47a96482cb373a00", + "c7cc3e9066e2e75047a874e320318b2e91112b9da82acec38d088554fefd786a7188ce3b1d8f9d454c99b18db4f26589dfa14ca8ba19bee2fdbf9989e7b18db300", + "675fd4ee49698b8e02f94b7429c8f032cbcb277a3674315f19abbeeb2ad981a9246b2b69d6f44634a12ba1fd485e623ff0ec913fa3ad1c9298aa650dc0f2ab6801", + "a3ebf9a15729c90fc2778bbe0d56c1e6b390d8a1166ec22c5f5b01a861ad8efb61d62feb665d7de0d43412a46525c7313f28c3ea95360eae025da49327847f7b00" + ] + }, + { + "path": "m/44'/0'/0'/0/3", + "xpriv": "xprvA3HG1Rk1HM9ZexcmyDP8ZZMz6PFbsXWwHUiUE7kDwycaTNZLAWmwxhAXjpAkX4untz3rziuR9HnWLPbmyK8cLrYwgDCPjjHf94GbyzrhVxx", + "xpub": "xpub6GGcQwGu7ihrsShF5Ev8vhJieR66GzEnehe52W9qWK9ZLAtUi46CWVV1b53vWqyZ3chATPq6fSt4RFsGFotD8nHVH16GczopscBPaT21t3o", + "identifier": "0e1102e916cc2661c59798eec8f15420fb76eb51", + "depth": 5, + "child_number": 3, + "address": "2gepnUKNxZDyHWgtHjJyNc5i5599L9oRiBy", + "bitcoin_address": "12HNqf4iNCwc7HvpLBTc5pg7vQ1hhGaAXb", + "secret": "bcecf19baa5fa862972ec5b000cdff120773801141cbaa162db70357ac5daff0", + "public": "02a9697d94383ec822644e22f2cd5c80fd923aebf355a738322013718e8b171609", + "signatures": [ + "77a76dd276f05987bcd05aab42ec6819d081cabe5a977be83bc5a95af14a407869c18a4696190618216e9fb1c04c565290d9fbd6f6bb49a4ffef6078646b0c4301", + "7f5ca141ecb66b4ad9f111845b4ee623a7dbf09a8fd42c43f711736ed59aa07b5db8e8d5140f3f583e6b68d958bdef54e8f403c9e91acd6367aa979c47eae8b001", + "675f4e8fecda25404cc11ba957b5c9d9e83ad0469b7152c7d47a6d862834ea624e6f7eb3541d281ba0017cd8ca08b0dcd3d5091bab79410129f1b523912c06a500", + "1e7ac982aae371b27b606c2bbbc406a7148b10849b95e60875e7d944978afa854648d53abad685f595f0f748b7f8ffa360deab67eca95039d29548365d32343e00", + "db4e1e65bb87b291897c6a9dba93b6726057f2c7bce175415c1513762f761db3733f1dfe2c188ea5eb711887c63546d86a6ac24be6f2ccbc1fbb93d6a41f70a601", + "a3451b4f71543cdf13ae68638766bb5c8a7bcbe3d04f48b327ef7d351d41d091595aea38a17396670c6bd69998fbe177f9d03c24a6cd6770e78a154a5dbc8f8900", + "58428b88208450d4e53536823bc755f4cb0977bf8eeccb89af81ed326d2f1f631bcfd172dc2ea130ba30f1ad6afd1604a9495d2f1ec3e56f503bb92fde31da4b00", + "67a59dd5b10b43aabae60ecf7b6a917224429bb2974b390ff6b7c79d4bb6bfe5350cffe7191a09898879124e1568e81c21115aa23d97c4ce282eace242adb0d901", + "7dc46ceb7ed8d5678c8c9ab37e18a1bd55a6e0a8cc285359ada9008b8bda8f8c5cb1f7bdd3972470f4e6d397dadaf3ee9c13a345a2326d2d919cafda49de3e8400", + "ddce48242d9a4bfa9997d0ea7b40fcf1d0a32f39382aa995cd072d2504d931c445bf9afe0993dc3b08eee0c30ea1dc8ca8af6e5ed2c8e3bbf17cac31607fb0d001" + ] + }, + { + "path": "m/44'/0'/0'/0/4", + "xpriv": "xprvA3HG1Rk1HM9ZhX95VjCFwMf5QQ34Pv2PwZ2gRb83j39JeNWBtYsH3zDfbwe6P6AeVYJXCTstQLwByzyyRRkeUWufDjjX4F3zV1mKTrAeQZM", + "xpub": "xpub6GGcQwGu7ihrv1DYbkjGJVboxRsYoNkFJmxHDyXfHNgHXAqLS6BXbnY9TCdRnYVuyNHWZRgfX7SByfN5SYUyYA9n18rDAysgM3MguLrBHd3", + "identifier": "72f333c27cd0b9f5f7409aa1c4946470d43f0b25", + "depth": 5, + "child_number": 4, + "address": "rUY2s56NpcWcjSvhmpRWUqkMotrnu9ChNs", + "bitcoin_address": "1BUoNrTtSG2Q9pYCBmkFTmskrZ9tPNQF5R", + "secret": "21a7731d626de3a01361dfe6901eec68d55c9b01eb6266113ffbaae91faffb83", + "public": "021c21f64bf3ff7ca6bc9dfeda558e7b1c405d962d0ad2adce1ee7904e409cf23a", + "signatures": [ + "93f409f4c9f167abc6cfcf6d8250768fce5609157b4cc4c89f3330fda91548b6087d3b99f8a83a575b3ad106cbc9174a1b513a180c3fb81bda21a29872b7bb3400", + "20eac1bd1f10f462f1022eb1f104fdc3232ea22cfbc80e32c3e819cc9abdbfd3173f951ba8d6a13afda04689a3c8d413f19e35c053ecb015d068199194f6022000", + "152c1082e7d6cd1456b76d86b7bb0edc463e2fa618df704bbfc75ea8bddced1328dd2897ddc2d69a5e566b2b9209083f64041c8e7c1539383230f169a3a8b1e800", + "f4ff2d687c1fcf7928f19d1b467088b8e3f8d7f96acd61066cb65d85809fdeb91f980ee34fcf5ca8032f0deeb75f44140c67de7d1812cf5af406d1108984b82c00", + "619587644cda0d5d3500aecb4b843dc08b5e960b46b5fba2767b5e61d5311c621c93459cf471182b9eb6d86010ff20f96a7e6e9a177d1ce9b24cc3eb7e8c8a8800", + "8000a96f9c8a74516ebe344cde480fd68829c67e800d8b7a95b60eee7f404914528f8e2a06fd55799c1f3d62ef2c80bf3bd5cb7454bdd8ec0649ae04c397b7da01", + "a2d94d6c4932284da4009e9674058814459675672ad91954f122063c6e648de72a97f2d3d7f9b465fd2ff242c4095dff89a28367cbbb28201cc022de68ba744401", + "b6c0b29963a26c10396c5d50037ef720f9c94fa060ad4eb0690a7b0ecef2247e51eb142c1027b57fbfe32ae889b194d7e3ba3f7bb3c92c017214c8cd6b739e7301", + "c9032190015d6754c5b14b2fe6b6e52b8ec6f6789bb9d6c4a35911270b2ca20303ca345388e1257219540aa7b7e9c860a042d30bc1d4fb7ea4b204e95cc1014a00", + "4da899cf992c8640a0fcdb0c69eaab23bffb681e43992b08a72322d00a15951e5fae7bd237ecfa34e8c7b4244a68286eda3ff231a2bba39c70ef97ce8b5e083c00" + ] + }, + { + "path": "m/44'/0'/0'/0/100", + "xpriv": "xprvA3HG1Rk1HM9dwdsK7KsJLDu2uA2uQudfmwarCNNC9NKjnz9VY1vmXWCMEzQ7NRBWKWE8yGcJ1rPzdgs3m4zP5ts3dsZtExNuDpF1egqe2eo", + "xpub": "xpub6GGcQwGu7ihwA7wnDMQJhMqmTBsPpNMX9AWSzkmohhrifnUe5ZF25JWq6GQmuEQrCaMQ3MX4ejaEg7eQd8zB6mymzZFrNf8Hc2aMXx4HPEf", + "identifier": "e62af2fe925ee9090ab9d5ab41a206784206616e", + "depth": 5, + "child_number": 100, + "address": "T61SVfXmvWf1ryJKHAzeNboDH2VpeQ5S4w", + "bitcoin_address": "1Mz1sHSkZX5xJ497Sc8McSoCsugYAipcg5", + "secret": "eec980eab4f84fd49827987477f454dada3080a682bc1879a241794c0981de10", + "public": "036ffb2fc73316bbd53647f36d6b31cec659a3c849b41e9c870c6301f1d8012b74", + "signatures": [ + "ce8dba7ddbbfba68b2e6a65487c681d12c1c1c55f1afacf12e6e22a2430577a10e006beba001d8cc4f216aa0ac61ffb9e72cf6f04af8358b2c5bb2484dbb336100", + "be9a0a06044f58648b5e33b52022b09d6df4b51bd1842845ee860568de91f6fb256fbe74aea2b772622bcfda94b697a229e1ae67788fab052bc55a002f633d8901", + "6d4db7372e50d2d107bd1b6d180686c32a8e4758775ef0692d9077c6d454df926e5452140d4adff1cac58b5e3f600cb28f00be719a092df7d41637e6f033f83601", + "8349e45cec3d7c8b2d9bc088ec9c35b04f17471cfeaaade4d1224595c312c00f398562b39138e826c872a994d4e1cc1d0c4d3d529be24f1fc2e4506981be5efb00", + "69d31516fc617f32beb96e5d615d0dffb557cc6d3e25418f5634e35196761ce62f5246f4a7d720ea1cbec05de0cf8ce7380646cb2c80f545d8b39385ee587d1d00", + "80c696dde879db3bfd5b6f9e0e83e49d2d9b87cec39522b91cc54ae1fd727abd1ea1d73ec7e0fc13a71fff7b16951d8d6dcdceb7977a210b919fb5501e145ed701", + "866aa6bdbbfb094f664298fff9a6b1a43e8b9e2a272c6a6c50a6957829e6066731492a303f8da1c1636a7d4964e372026b6aea807d07562aa82a35f9c6b2d76a01", + "4308d1d3b93055e9771e08e189482f21b87268f792502dc70440eab5d3090b53379be27312b80cff008f0eb45b0959dbaa8bdd87581dfdc226b185749a192c8101", + "d785671fcf457bd03cc16882cecbf4b35498043bca5aa4c7655b52d3bb95d1ed1bc3ab26b262cb4c39742016ac0e43ab0cc4215a2f11535e8c37077e4a3517b000", + "04464f70fd4cc8bb222d839c1c884c08b54fec65d8235454bce27f3a90f44f337199d0a431359beb0c86a079a14641a85096a261ad5d8dbd71888d9eb9e7eed200" + ] + }, + { + "path": "m/44'/0'/0'/0/1024", + "xpriv": "xprvA3HG1Rk1HMALXoCekjTTkccCQi58ErroddYBfHvDU9RQWvkSdC6ureLJyufdZswA4cAuX3cYitUvkjZYCALVKLzbVV1fQoSFSszVnzYHCmQ", + "xpub": "xpub6GGcQwGu7iidkHH7rkzU7kYvxjuceKaezrTnTgKq2UxPPj5bAjRAQSenqA6A5QpE2RHu8XWSyyt3LKPKFCt15sw6ZpAmBwMstYW2SwTqWyo", + "identifier": "21a876c593439681f760d65f1d0a179d59e7f414", + "depth": 5, + "child_number": 1024, + "address": "18hnQrUuZG3GeUK9qv3dLx1HBa7GTuEpJm", + "bitcoin_address": "144y7Qqe7SEXvF8f3Vsuh1MwvHeNcGhbne", + "secret": "cd07cce4bcb1341ba633f5e88c09d6222248ce0df899b9c1a251da70cfda8dc2", + "public": "027d0363659a1d88cb0322116b3164d2d26c46b937e6b73f68342859b86844d29e", + "signatures": [ + "0186ad85999705d99ea9f1a6a26807f2338ce93f1459eccc6174f20c4944bc441203ba2026e8a84f49052aa4dbba3c729201c956b73431d4cd7b0d6f9b775e6400", + "b49efae7c8a0e551b3d3207d70e7f506fdb9d594c1f2bba77978702e02ba4fc8135f2dc8e5d6e4985fd7e41776873bd89fb12a0f9c66243f785e578d6966fecc00", + "5e8b64a0362cde44e109f3f94e5794b6ab8a29fe807d09fea95ae8222fdff46f15ec5cc0df900dd5bf425ebd791f8eb697a5fd1d1c34d2ca00319e168393ea9a00", + "4ab02611c1fb5c375ac506cd756930fcbc4d0cc7d7bf9934ea93b96f46504d5e23619d8e9c7884ffdfa814338f5c01b6da9baac2e42633f1981d43a69c3681d601", + "95f1ed4a9fe7dccd3f822ce25a75fb89b9b65e23d4815da88b8f2b2b390f1bbc7b1b7042e44d67e8ec7eb160720052c39d137996fa10f56b30d00682d237103d00", + "b07b4d93b3bfd0033bc009e011d0a5a23b77b37422c0c6d52a73ce8af332d0dd47fe090d07e47dbd7f4ae6ae10876203e72cc4193071caa609fb99be0a82199800", + "3c9c3203b5dbb41f95ff342ff6c0c19ec16eb1411f8a54cce63cf99b9385dd6b25d2b01cda781156d51f1f661969b02998ebb02c5810b76215ebbd62142adfdf01", + "08d1334b5446fab21919a4ee507a1f0a0ac97904e7b4c8d14026830d3e1c560c6d3aee1b21e50c22b8674730d1b2428832f6805257df399e8787c87c7cc942f300", + "d4a8f0e5ede6ab22bce3cd1d69a77da21078c4d5b9a291a08f3623acc0336d503a56a28ccce40ba9aa05ed733663d9c04915ffbf60b2fcb50159ad0b062ff2e401", + "a2fce2e0404e29e9bd3de6655f2c856f87b79e53157e7b97e3c93cfea8d0d801615a379fa4122aa76e1b36fe99eb596f10ac6054f028961ace622e4a2f1504f601" + ] + }, + { + "path": "m/44'/0'/0'/0/2147483548", + "xpriv": "xprvA3HG1Rk9d1gTK8tAC15DX5ZQMTgACFH5QeBVdD37MTuRYWRuhv6WSG8yeyjEYbxELJYqDnVyqbdsZ55i7Y4VgeYdDaLTeRF5RPkYxJpumHv", + "xpub": "xpub6GGcQwH3TPEkXcxdJ2cDtDW8uVWebhzvms76RbSiuoSQRJm4FTQkz4TTWEME5K2RGgNfeJnfeRWnG8VA4n5fE1zW1ddBa5m916stP7BxZSy", + "identifier": "08526f2f29d393761e59b99e17950573a1f49f57", + "depth": 5, + "child_number": 2147483548, + "address": "21rLW32R51FJWixCoykHuwpHxTaT2KH3RvT", + "bitcoin_address": "1m1AAvkcvy1zYJyngpyFcxXzRd1BLwpwH", + "secret": "7d056c93326ed177e0f190542fdb67f6aea105a4d2276bff5480e7e8a3afb619", + "public": "024709e21a7709eabac5f2e1452486689c0d154556830ec85a2b5c33574adcf825", + "signatures": [ + "1dd05061c85e905a614716da2df7e00af9dd0359adabf1b4e3c575938212ef431c3d8042310176da40f8f60a607397568af7f207abb1afa8086d3614c7a860b501", + "c9a31da674df3610a39ece0a0abf756a80b50214e43cc4c960cef1800cb6fbeb140b3a78857082823de9422d376237b12fe4280a23c000c9e147d15aec2aff4901", + "d3266a420a6d93fca467a7ec27dcb0225b4049e5b5e8235b737b0aa5cd8aadef346e0af638a9e00fdc02a30d83b2d49c182ffc3dfbff4ac33fff6766a3a672ec00", + "4a76b9ec17b547e7cfdd6d0ac9fe548f955520e3005be18f5fbe94c30feab3dd0bb518907772175df92fd28619a50f26872caa05625d4ae5a97efe1bc49adaf501", + "0d34b96d9335a1fee114bf475c2cb7690cbc7b9b24180bb95574a30c65a7e5bb2d3d37b25e28e02640cf871b74e10b0340441d6dbada2c92d232bd8e2fdf177901", + "0eda70322b92e8fdeaf61f6e7471172e226867d17661e22aa730e8de9928dc0271fdc343623886fab83174a9b7a9aec6e13d330fa52d6082cf2052b482ca483b00", + "75c35fa2eec7ede43cbb13e3194d0014cbd930bc5b232462b0aea134997526f6738db588cbe26e90425cf31694b52aceee5be17d4640cf213a867bc0a2c3e48c00", + "ce387338299c4db02dea57bedb905ab34c3c0a6a40dc788960e5a9b55ff0c3096805ff4971e8f28094e17b22ff2abe43b3d97f97fb42c4abef6bb35758f9ca1901", + "1c738b6dd5d534fb605ae16516aa5e173db6c70a2028a8bb73318c5fabf868a718cfad2b00e2439ed2920151f69691552858121b25bb8a6ccca73c90c629c7d600", + "a4da2445b4d9671e36e362124e27e7407c9643ff9b64f4363c9ed06afb008f7c39a823e0b45ce89c6c4b02fd741f5bec0b95cebf002c17f81c55fddf0c50c48a01" + ] + }, + { + "path": "m/44'/0'/0'/0/2147483647", + "xpriv": "xprvA3HG1Rk9d1gXfMqpW9Qim32CeSjQ494mo9Kk1LkKjTaEJA18KDnF2NWZkNYeHrHUPGhpbgMEya5VhiVFMW4DoQbrpeXadwcvKUrkAWSe8Uw", + "xpub": "xpub6GGcQwH3TPEpsqvHcAwj8AxwCUZtTbndANFLoj9wHo7DAxLGrm6VaAq3be7CaU6CnTsvz6y7R3c3NmE43XRuiLXAN2S2Ma4ckjkKJPpdrhn", + "identifier": "8a9bb157becf3f1ed64785d9f2636e9686a7af46", + "depth": 5, + "child_number": 2147483647, + "address": "2EFurXRnberywz4Nt8DcSBVLiXr4U35tVgn", + "bitcoin_address": "1DdtmCGDMhFeyqbgugamP9D58vE1kSQHJ4", + "secret": "5911d6dd366407c533af91013e03d5115940b2f30b9455f2bce84733b4874a62", + "public": "029efbacb3e9eef3411de18f2c238184128d9789b7f4dfd63f458ea7a3fee3546f", + "signatures": [ + "a1ed7c759396a0e771c044b90d90321a4bdfcd2fd165c1c971ffb6b53ebb20ff56d0361b992d1e3920c91e86c0aed16bf9d0e9e8417cc38f687b3c27f3eed98c00", + "46fbcd4fc661f1aaa48ed437e5d82328e78cf3bb5a35da30751f80f9496922534b17c3a1da25837fb39c6880f4a8072f0c94e6cb4cdca63884c36df72d3ede5701", + "d6deeb403063239753ef1571d84c1509f1a2dc395cd25626b0f76c0e7ec8aa1a07435eaec91fe91382116b293939592c42d546d30fcd02b7261d55b985588aaf00", + "2ec0a91ab5d1b85bff432f3d8a35308e8860f29cdd48306d1053a09e4f4d00467e0f578fc878a1e6056e4b1871b919ee6e1806df12a0b93eda867379283ae17600", + "bda18ce37b6a766d78e83ed9bf92308c1a3ef8b71edce6e788c7c068fc7d5dfd48f6669b1a9577e660484aa11e72406757fb493e6ed7e9b76bfaf07d7b64054001", + "4f51cffb686da7648f0210001911d037eee4313863bf92a048970bcc4c5d7d645add26d0f7b1dfbcef45967fecc4b1271c3bb984fae42f0e38a736b0e017c29c01", + "b31dd7d3b87aed4987aabcf1c62d42e1d48c65201a7cb76b740204c0401b63de47b8ca9d6024e262b317a7f5746af29f15942ddc17b829237471eb731a07f1c600", + "04d1f4d00420251339a35526b748f66b6f49263a6f0b2c39c43ec20a9d0de08714463f6616e2aca684eac5586aa7094082f3c5b5624c725a0a41f316c312ba8800", + "5e5c9fa694896e062820239bb351d56e49b1fe365bcad7cde4cfdd5c8bb5bf9734f89b95350a1591c0b0ef346fd66ebbc7d1ebfa33a2ea032e30b7f038577dcb01", + "f56b6b1ea2f2ad50aaccb10c08a268d9ed396c6da304234b485e91f7d29b6ed817284a4e56270a5cd57996f9d1add98f4a44783a07edf7184d0c1f8bcb6cd06b01" + ] + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0004.golden b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0004.golden new file mode 100644 index 00000000..6f2d3224 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0004.golden @@ -0,0 +1,233 @@ +{ + "seed": "yN00njU366Rfp4BBJlOxm/L1RRWyAjH2/T7fMsKN1Y976eqBVk/edfnU3RjJyUmbyl6wO8vQTiBqHvlz8DmMsw==", + "base_path": "m/44'/0'/0'/0", + "child_numbers": [ + 0, + 1, + 2, + 3, + 4, + 100, + 1024, + 2147483548, + 2147483647 + ], + "keys": [ + { + "path": "m/44'/0'/0'/0/0", + "xpriv": "xprvA3H8E2onTKbNgq3mJmNXDyPPe1qVEMWXkjQZZPjrQnNRBUSHrVSqhXsHTbEvAgsGwH7w6PkeosZzp7tSvccg9uyfyPoJ1RRYdmo3fWcQjU4", + "xpub": "xpub6GGUdYLgHh9fuK8EQnuXb7L8C3fydpEP7xLAMn9Ty7uQ4GmSQ2m6FLBmJtGvwtzGVQjA7rH4uLfLfb934yDzvXDUtk7BXTK2b5emGuiNakc", + "identifier": "eced16c4be0a13005a427373adb7b4404180dfb1", + "depth": 5, + "child_number": 0, + "address": "rZdYrnbTwaQoAKJEAb7B8ydnUt7qBpmN3N", + "bitcoin_address": "1NbkVW1zNduqkUpind4zmgVGVQRjSzpCCm", + "secret": "3017cd3a9e7e4486a145246d066699de42cdcfc69e1cff986752d7fb8abd6e9a", + "public": "03380be49544108f74d246a6bfd3ae706aaaa91dde6414bb99fd61853c01173a55", + "signatures": [ + "77ea332da724a53e188d35b3e7b58b6cd95e4c024c37984f3d2d7fc9fe0127da22e4c62724f358fd0059d0217c251926df17ccaf76d40241ed0ffa3c37ae11dd01", + "97f0eee4822064667dca3907217bccfd66a91ae5b96c30fb921c6a8f9fd2e3667b0d500ab81b9ecd3283072b85a3c0a9bddb5b7738ab00b857567eb726339b7900", + "9b5575938ce6c2903d8760cbbff8e03ed2855ee352ddab5e8a457f9afdfa9733367fe803d9fa91e72aec39a81dfde337073b7f0476bdebfb7d6c3fafb3c21b0a00", + "968e3995c811b6d24c23501766af99582135a38a1183d7810455c6e5cfc24be416148486c6ae9a7dbfd67dd924c74ab53ac83bbd20ae60342058c8f2f8d069ac00", + "0449dfbf7ec5dad030876a644b8b2ea545ce2f22c35b92c56cb05cb3d7024e695b950a944930abdbc78489367cdb19a53292cd4ffe8331e10082b83a7a30b68601", + "f8abbb910395545b73a302288e34fdd3022e406fdc03cc0861ea67e81cd3358001c161f2a947a4af8432ea227beeacb03d3195e88c679f29d0a11acb497502b700", + "7f66de636702080805cd5ef5bd6494da674a8f1d7aac2c3b5d60732fce3aa60948466502fd2e68f4b754785d06fc9d354b3be585e5900be171fbe67ba5bf91c201", + "90c997d87c56531cd9a32949b2d0f45f5e672bcdb3981d0792221c55ff3d77705f26a514b5822980bd9c662a29082e768b2b95f0396fc5d8daee55b6141c453901", + "22c146febeef4d63018296d2af2f9449f06f1b98776ff160d2677977906508040df5a18699a7ecba241d852dbdc86f148413a44d049359df898b27a91ce3289901", + "e0b9d3114367922cc3116a1d528eb58fb4b6b927e44fe459de23041ad4271cdc60ed464ca28d3362449d426d5c48fcc3402cfc50f8f309275c3bfa2c6ce5ead100" + ] + }, + { + "path": "m/44'/0'/0'/0/1", + "xpriv": "xprvA3H8E2onTKbNibZ95qntRo6YaBrtLpcrceYYDnfgnYjcc6bkan6hMxtLxchJjjnmWmzRxyHH4g17gPkBnNVqA6o1e79vrANCMqTU2k635Q5", + "xpub": "xpub6GGUdYLgHh9fw5dcBsKtnw3H8DhNkHLhysU92B5JLtGbUtvu8KQwumCpovSBdhkxzk5bF9zMTiBnyPF2quzq6Z4QDgJ91TmrLhwYHJmF4EK", + "identifier": "f59ea80827de513e69b9290033077f905365b289", + "depth": 5, + "child_number": 1, + "address": "2bWfaHaKvvRrZ5d98q89vHwE3E8kiViogmo", + "bitcoin_address": "1PPicdvYcSFY8r9nw98CdLabVyLn51usa8", + "secret": "6458c6f8e0d4a0195e16e9ec936d3048c27e8e0fc8a9e00fdcfd7197852c1c46", + "public": "03c9164fb890d0f72c7d39aaba806d4d7286f8a3bc11a66bd8bc0263cd6f865f3d", + "signatures": [ + "1b9b8984338aa1129e6c11e16e6d8c5bdfb117cfbda95fe61e7635e382d8a51c7c521b7ebb1523a94085c9a26b3e5de17577c9af7e35c5a6f6c33cc366383e8901", + "4e5d740a57374bc1c8ae883b22a0c0ec0848dc495a48f80007fd45acc39bc642770376e3f87444e20c0d296623558c62251b993a75114ec874664076fc82122900", + "531276b4715a6e95e3dcc938e28da1919dfc16a4c77c23c3ebc19e5df2ac505f55dfccc3caeb13c4049b9ad2c43598357d1700452baee869db448d31a98218a901", + "c0326a57a5f973a4d1cf46ed6f07fca45da774f6bde4f98842341adb58287b1c04de5a0cfdbc1c55754d269f62e04c97027a7b44fcc640f0ea6dbbeb9f94116001", + "2c5f4f0ebfe105ec94ec20b91547b6af449280b5d3d524d970aa650a862a454b0d477fb572f687f76d3fd302fcbd34faa8398b447b97433e7df3f028d208884d00", + "239450538c8cea088e6f4f5f4797a5ace926e3fa5afed7ce66d2df3dba4ca16920b74603bb87441b06d5782b71eb8c8743eeb79c0dcbebcdb478bdf203be878200", + "3a9e6f9b943cd2f2bf988384a7a02caa991422fa3fda02943aefcf4626ee1fc51aa346cc26eff681b46fb4942aa39800cc0d5bc5162b481a7faeb6eca26d72a601", + "4dd1c3aa9277c92681be5836315a56fd04e2aabb64d23a68daabdb33342b0a5253379f5d4ffefe7450d69f168bb45d630cc64c49d2f60438386d8c2613bf653900", + "8fc92a9d7e2e68abbfcf1a80928ce00bb658e0a08af0e6db282288a7c56449b049a9f40f0ed28b43e9b028f9cec4e9b534eb83d28692293ad1fffe386eac921101", + "373ab76dc7d70e43c8bddbbcb27edb9368275c477f42c0374548092b7dd3ee307498ff1f868c89865dcbde5903737758ac3d8079e652981ca0bbc75a7563fb3601" + ] + }, + { + "path": "m/44'/0'/0'/0/2", + "xpriv": "xprvA3H8E2onTKbNoFqjcEBrDFikE9VUXxNpz12Qs7jqR8p5xxVTpZuG9jBmYrfUphVLHnVk8FQd6hR98VVMBXawdNEW6Sfz9NiPdwfvbJ6gBUK", + "xpub": "xpub6GGUdYLgHh9g1jvCiFiraPfUnBKxwR6gMDx1fW9SyUM4qkpcN7DWhXWFQAexbkLRdS1hR8xZfc6pPJ3177CG3KrKXiXLjSafD2FVXHT53nH", + "identifier": "7477770880b9d65c0c4fae4d3235eb81dec87aee", + "depth": 5, + "child_number": 2, + "address": "ccZYserQ5WMSn6GUNqegzgUo8WxdjoYdfw", + "bitcoin_address": "1BcpVpodSJCoTLTu5DMNrzVxU9x13o192P", + "secret": "31cee729e603ef41d255d7766b0c624e55fea78f2bd7ca7696c953b6e0c15299", + "public": "03b7b3ecb0de83d9de036036767d1d389d726f9d845fdc0682e573131a924a0ed7", + "signatures": [ + "6107f8da9a5eed76dabb8a0acff73d14639fa1d5b2d09e75bdf8ae66d8a80a2635d3fb382c8250dd8e6048280fb07249285f36e7786448e866b4a4f0e946c0fb01", + "9a611c8912b10361687f811ed57fb2302cc175351234940591fd0571167bfa446e2ac49ef533216955a462fe9517d208d6fc826fe8a4ad4d33cc0de079d9f3b401", + "f07a9f8988b8fb7067263be316c60e60ec0633e8579aa4e6c4deb98b517116e91f281a48806569dad965d6badb102761fdf79053537796d824135f4aa1cfcd3001", + "af538c9af06edad1c5b900afc6d62e719ccfc3b8d6089d4ac353c8ed6d157a87182ce5c31abda72b716da930c647b9dbe87d645fc77ffadf9f81b99c11fd167600", + "0f1eff95fea2a4dbf9df50e7f77014421ef9a2cf097026f9c632b5c5219733d37c2ac602aace55f55c25ee4eb23488a47fefe10fb96f471b71522c4c4c9af56f01", + "dce2b3a015b8fb3c18945d551a9281271e7d0a3fd71a21ef89813d19a2b29b622a21157d21c995bd15dd93393b8a6183e11dd6387e06912293d445e0951a090a01", + "f7754a723dd96687579579a71a154991a76618845cc1c32c4977b46f694351b212c53840dfc63eae27dd7ef92e2981a6a02658316eeeb3efc4823a47eb03dea200", + "9c5c29c6c7c8dace214e20880634a85062897cfdd4d688e1646d5cf97ba3b5f0706fef031ea993ef9170eb4da4d89c6e29fb158070cdc4d4a54698eb82637f8d00", + "bc3b509251732baf67281353d7acd5d77ad3d28bdf09e75c3e07ab11417efab56057b0fe4c36b11d0ad2dd41113ea0c4b09203d6b41e076009592acabdb5357300", + "483668320bb682fc89bdafcf5bc7f4060d5b76ba9dbf8749d5ee48c64fad6ce75744ffc7438f3890bbb4754607318102cd9552860d3ec1760949f739f0b0001001" + ] + }, + { + "path": "m/44'/0'/0'/0/3", + "xpriv": "xprvA3H8E2onTKbNoRg5hHYVhhByazZU2nhUeGwixM14t8N2ianbpas7bkV8mNK9Gw224Gk9MtNyaZfer2w6ZRHsZUFZbBbNXXfdaAbN3JdnQcZ", + "xpub": "xpub6GGUdYLgHh9g1ukYoK5W4q8i92PxSFRL1VsKkjQgSTu1bP7kN8BN9Yocccy6MNf1Bm9tMpGJT2p23DFyi5YszMxhLzeJjSmFvD1t5M7AfL4", + "identifier": "18cf54c891fe9bbf22fa8fb87e496db343fe1886", + "depth": 5, + "child_number": 3, + "address": "26AkGJMepC1VPi4zCYsT4CPweUJAUyhnUDA", + "bitcoin_address": "13GBbEBSuYRdyRoDSmmanoMpNPtAneEDBp", + "secret": "a0aeac879d0569673e6e4bf5b73478da5e55eb3daf906262e376d0cc41b6d2ee", + "public": "026f251be2e0f62df164d592330e7ca5e498aec2847fb988059a1e0d861c3a42f7", + "signatures": [ + "d290e8dba6d5226f0a2028366857fe86203a05d568c41dcd4c204a38e49a12e75ac94d6a764b9baeb689f70fc794f1f057bb8d8b3cfc692eb54dfd02d628b70400", + "805c56a71746661734b4aef4555d8328db144daa2ecd722d7be3c7f011712a557ac158a2ff1934db9c2dde6cb446d2b0296ae40f371a89049d431ed4d679a48a00", + "2f8d3785dbbc165980fd2f4e1c9c690bcc4482087f2de9ccd705b32caaecdbdd725da8ef2f73e1974c58e20841ba375c9e1275e6938b91a004f111fc7b0628d501", + "8c3bb5c5bf65c6edf5e61f9ae5cb9210ef9f77600ac6c1826b75f5ebc45bb3ff5cc780335143226707382f43427134d86beb1a4d0cb8cc38b21f1cb83f3a026f01", + "fdee79ec8b80406e907ad81a2ed35b19205c4cf68ab8042ce878b192dee8beae52e63fc17e5361b67b6fa7c621bd844a75d3b8263bb0bd71c5faefe1dd79a04c01", + "d5bf09640e6bbfb1ccf40394bd673c1353118e99a5bce5490e6101805a180d6f77a9b643c65d9232efa9e5aeecde195f60308fe98722d34461b43b0f00ab9f6400", + "e1e5332801edc4b22d0a888c2988a137a162d82c4be137a2c109f8b4902e2960021ac9c352b345532f2b345f0be8c319ae5d7e32c2c922e412cfcaa1e2ff7d2401", + "cd9b2179f760bdf63923925fb1fe659df1f4d3e39c0f6d244442bcd55c9fc90c03b0883ee50c37be9e4f7ee325e6df15ba00f4a560de85d5dc2fb0443a80f66901", + "1f808b09cfeaf6921f01b5ab13ec3fca9f1fc5afbaf8849fe8aca747f19f277267c67d575270f717919142c3e41a6657e02861afd0e303790047c603d841e9ce01", + "f1d5848e1cd42fc0cb9968352beea6f2fc44d5f3b4bfa90c72673930881c8fa945c045fe764e287c78d52fc8876dd228584df076c568db7a82138181265e7b4500" + ] + }, + { + "path": "m/44'/0'/0'/0/4", + "xpriv": "xprvA3H8E2onTKbNqvJYZQnV4aNyPwvfp1dgwRwLQMMrRkgc8KWz2JC9LBGJa44Esg55T65smoVTLfpne7SrfVaqGsPBfD1bKQCy61fKJsjDYYP", + "xpub": "xpub6GGUdYLgHh9g4QP1fSKVRiKhwymADUMYJerwCjmTz6Db17r8ZqWPsyanRKCFGiC3nm4KnTj4SbSK6xKefq6Qcw1X5RjQhzrYfWGag8qPDNC", + "identifier": "79c3af23df9135c536423b715d23f22a57f9c571", + "depth": 5, + "child_number": 4, + "address": "vJEKjqa6dPAA2ybrLUJLVhQWtVQw8mvct1", + "bitcoin_address": "1C6qBasTzmB66WiJ5EFAtZEiSabXvsdcaZ", + "secret": "cd1f9b1813e7024017bbcc0f52d42db226bb8a09192c9763e71a9d1b3179e4db", + "public": "02db4b24121f9abe795421e4e20f2072112f041d5dc69a1c861e8435002167643b", + "signatures": [ + "5476dd869bd9d70c0802a35958298959a6be3e67a4fe10d0fb9439bff930d5931418dd67a1d00eb74303196511b0b6967777a21439de48d61c93442ffd3ceb8901", + "34f9111316f5c86d84cf96c1a2f6bb09f80369a771ba64bde0e24e6931003ed24acf3339e3caddd8643b345957bec5c52b2d56b1c18ce042685e6302c3876eb101", + "bbe837341e658d8dbd89058eba0918ba9730472309284620c685eccc3e4a06a121d733e6dd75c5345a378cddf7506676cc3148137b27a14be4d95961b6522d7e01", + "65af658239de38fd2ed7d2c81b6423fcb99a0b09b7c1459b56ed1e78fcee957706b6c8716ebc886b3936b11fe4ffa2a694e4724ba4298a0769eb0c2bab133b5b01", + "92d5a48ada4a71bea215af4fc04d8771dfe3f5c65f26d4589cc4c278f7de6cad7ff61e2764f115d5ae8b9832122003d01db7387e871258d35eade1cdd2d8d5cc01", + "3d7908f28db6f8931c7674a111177e8fd5cc6bea29bbff747f77f76249826ae5526d226b4fb3e529d513333a7885aaf3e4c933e50eb6cdee27afab4b40df109600", + "d56e3a6c800c49a6f27ee5c432cb2d30212eb6e99b5ac68ae6684f1fe70bffa205de2b76b6bf6eefb887db3905aedfeba29b81f29a454a8f0e082b2510f830ec00", + "96d2a6ca6b1cf082cd38cea755d9b41565ce85cb8e19cf54c434ba76e1fb9ccb1d5a5aabda3d3fbe2c4160a5aa0897f12ad11e6f7137b29703f3ed1ef7a3d80101", + "51f0fad103339b6e0a59fc04265776a08cf23ea151d00f2db6f5ab92f53a14cf5ffcb369a7acadd032e6e5ee5401f2d2bc5e3a824dfc8c10a9fcd96e90c1650f00", + "e012535618dc9106cf2697934cbc7c41a69a9ddd008324ca58526d6aaf4d19f32abaa781a4064abc9721b93756d0b8db4a706e5ffa8fe87a7a61a330c8d0f52e00" + ] + }, + { + "path": "m/44'/0'/0'/0/100", + "xpriv": "xprvA3H8E2onTKbT4pJjkSdHhx6YkToh7VgDu6Wg6HouEBmmKRwNYVQo3NgsMn53zWBLgJpscuJYV8H9c1um2qk4sTCngYS2HXmuTUjLg9ZEick", + "xpub": "xpub6GGUdYLgHh9kHJPCrUAJ563HJVeBWxQ5GKSGtgDWnXJkCEGX62j3bB1MD3zrd7jKoi7sAMYQ7yJ8HYM8boSoYuwvHEyMakW8pzxgpFiKiVu", + "identifier": "828583dfbc73d1f6579f06ab8e1c431c5506890b", + "depth": 5, + "child_number": 100, + "address": "2PvHdUC8bwwqrtuh7KckjZf2mjRUEvafCkw", + "bitcoin_address": "1Cu8njTUP61rp1ZGaoksrqAyFGMXavRnFV", + "secret": "4539d0bfb4b1d670d546b208909ef296f1ad4c1babf0f789e3856e7f71c1c9b4", + "public": "02bb6247c30d794a106e115700d92e8fa32ca8d00d8366ca3de555fd92f086f3ca", + "signatures": [ + "a9769b3b597c9fb5629d2e333bd95454f36b41d6f8c75726b8e22f5ea3b44acd228a78978ad0def49e7595ed5d6d2d4225d5d45e4a3508d0865583fb8c7ca8ea01", + "f593b9130a90e0970177b8c270561184dedd893ba9216847d68462ecdfcc4e001b1c4f6189a46a3456e4b2bdcccb633acba21e03346f245010cda9edb2a933e801", + "a5e07f63e8f02a19c7ed582cb8b008cdbef19c36cf0c229f53e5a15bee40127502a5986a15df1893b71450f8b1a2e5677bada96c6f6b9de561e90090c1cc3fbc01", + "1dcc43e91a90906fd55e44accaf562879313003745a1371e22a2bac9398f147431dd99a53b1d40493304212d1fd8228d477bba921f0d1eb4cdb532dcd0b8d14d00", + "77695f5854cce2b751457f76dccd337b68736de4dbf2dc1107cabad25e60b636790b7d14fe2fb57732abe80149473d728341a5d6a48a2dc5a84b59fd45f3120000", + "b4541e87bfda0eb1731c6bb5c6be9f0aeb15eb46cec6398975013824509e6bce74729e30103140ec3f78ebc6668a18a7f3b0de4030fc395ad22c551785d0e80b01", + "09f0dc662f0766782024dc5f899b837d81502adde7ca48f6ebc91e879ad446ac721bf1cbe94f1737a2cc4c47cc84d9ce48b3973cef438fad1f09aa6eeff8ae8700", + "e0f1cc9fb59a807616770e058ce2a994c29c47f709c04b98a451f90caaa016fb10da3be1673c05e255163d43c4e548d976863f2703b2999b2366014320ff3dee00", + "fe478bacc3f5445656580e40d5017fe2bbf851182d7a24231e5aea1d732d91bf6981591cb048457764396efbaa377ebc86f7f699b2e224137fd642e665bc374001", + "c5a24c112059112d7c507ebc59a916dbd76fcd8756ea63ab19dcd566fd4656b97ed1b3297fa2b151ed9eb5737b0b650ca1cd7f080aa1d9b82219db3ed2523e6801" + ] + }, + { + "path": "m/44'/0'/0'/0/1024", + "xpriv": "xprvA3H8E2onTKc9fbs4L7pUJRLp1KsMCa4LwT39ewAfofTijLtBhcardCpUmPB8cQ6Awt9KhbVrZj9mHyXs5hjVbySknvaLc4KmgcUy9Jrc2V3", + "xpub": "xpub6GGUdYLgHhASt5wXS9MUfZHYZMhqc2nCJfxkTKaHMzzhc9DLF9u7B18xcfNqjdHGKeRGxzdiQg847b3Ygo5MgNwZSRkF1vDcaX35KGqHnRh", + "identifier": "bc232161b0bfd5767544aefed783bd99cbe97170", + "depth": 5, + "child_number": 1024, + "address": "YZ8GTjPy4ikHdzhtkx8hJngeurqnhquKdE", + "bitcoin_address": "1J9n7y5cAhgtbiShjUr9HNpfnrMF9xs4f4", + "secret": "301daba6477b25fb5677b96226f9140d5b8d76e9f6f6279b764788ca441f875f", + "public": "02ca636aa2cc9197e60082a0a463e2e58e6d22ee388de19e3706b9e87adc065589", + "signatures": [ + "aab180bffea668527bcbd2795beed17b89dcd2546e45118d55e00ae5d9d755890cefbdfc069289c172ce3c16aad8bba25e9fbccdd62e62c9811928e2e5b7acbd01", + "929afd9841757d7c16b623600380630ff3696064d1f1dac892e819490017a4397c5aa4fc83274c9dbf54e83c3cb6848beffd1b3a7f8b5567b6c0b44e4eb2e56401", + "3c49fe6b08e5835ce356142f97c207603e07eba05c701d31b819468059a81dac5a1bbbf54b20c9e49ff4d7b9f2bd86437aa7268dc4ca73e893b1d1d1eadeb0b000", + "43175c9a810106cc3bdc6eb19b48a6246742b3fe0298a51c8e41811cf6a65f9f270368686e41e1c0f491690ec38eaa6da82baeec51c20775c57a3aa0702ed58b00", + "03c12b9b7ecb79d813018b926445c5f8233e54ef7fe03d8333141d86eebf3fcb71b1812d265b2657b624c97bc7cd31d85fd6d69123f98f32c21586ab9e1cf61d00", + "58b56563fc2c1c4bfdf1d79f78d394e4654280c7ada195370e2312f3400b60524ce31ad2258d5ce0389f95c2e4572ba9e338af0d0b0d4daa126d7c1d7aa9d3ce00", + "12dc315f4338b21c7288506071b5627e25c818408cf01a7879d49e8b2b8938445f68ccc6a1f75e04eb38f9e47df3ce3898d84b2e5331f20925b1e5c745d8115200", + "d4fa3f1caec18c23739a118db9b93d54795937bf0057aebf4e3ac04623ca9fa817c2fb378068d5c6e201f6f3cf69213536d5e821a713c896d367e29193766fd700", + "f822586097d506c6989340121cf5dd2febee6372dab7b09239b5d108511e68b6405effe886ad02369724c5a3ea8a8af16599985868b51d971e0a2ae62a7b367d00", + "3576fa9ef63edcf4fe96f21c70776a7bbdf5734b7ff56b2d950832982c17d1f07397aa07a3a728b51358419b3a02e2ceeaf504ef7a78f1e4913c7e41cb5e0dd300" + ] + }, + { + "path": "m/44'/0'/0'/0/2147483548", + "xpriv": "xprvA3H8E2ovnz8GVZko4C5TgCnAZNZ8VnSnHjqb9eBb5ttghhvWGf9RwDrC27w1rYChSrG99ZMAyUnaw5JfzSJvzUnSwPLj6ayaAwHvFvPTQ3u", + "xpub": "xpub6GGUdYLpdMgZi3qGADcU3Liu7QPcuFAdexmBx2bCeERfaWFepCTgV2AfsNsYA7KAmhCLct6yiNMWWE7vaE8tcq1bz3gw3brdAYqvA57bbDz", + "identifier": "ce0b9aab84a3a7c4d5c75811082444ff2a2732f7", + "depth": 5, + "child_number": 2147483548, + "address": "2cuLhdgZgr6AXhmyF6yYzKyVaWJRFcW2Azp", + "bitcoin_address": "1KnU6noEE4QwhjJAHfDpXXDruHpp2oT4WT", + "secret": "be4b0cc6786bdf2b527154a7a757cef672e048c932dd31fbf3341b5342ffe9d9", + "public": "02b262f350379dec955204ee0a19b0724cd7f42b621df634df7acb03ea1ff68c39", + "signatures": [ + "9029e98931e0d792b9bf652c33ef73959483f16d6823203df5f53c88f59f23014d8d51b6c28036805b571685e4ed9325e43fc82d25d2a114f7bf7442d223ac0601", + "d3f26186ba18177d938688cd5317c41ca5d86fc3510eb3e98c2acdc4b89af13d28965a17ef527fbe5045933d310b5041233ba2eec4aaeb475cc2d00e08398cc700", + "c658bb4c4a19460785f4b19e255f65765eb765fa655e538c6cddd5c43e7b02ee698a1118a4f3b2f60207d7a74642958899fcbe99c4e2cb70b26556866effc55f00", + "b19891f3d3b9a49fa12a10bfd736e36a532854e1d9d1bbffd3b03f89ccfd267e4fe66534b79fb70a3fdbcdb4dcf2afb59de3751ff89c0b4708d7922d714b747600", + "dc297f41a9fc48bde978701b4ad32e16aa9e9a6df1d57a00c6cb3eebfb514e434e5f9b50cf9f883f8db473da8e7ba404972f6812537a4b7374a18cce17e5c63901", + "8fad34248773028e4c7a8691604b8a5143dc7c85349b6cd2199be6ef03aa85fc13c35208b3b32eab38cf20ddfa58b518390b4baf666c56e6f87fe043e196388801", + "0973530251e80b26d0a87c2b26440843577e1608a11943f1bc346c2082825daa1f80d8166ea80df3b16fe731050287732dd0cbb9e3fa62e0d37b479f7961e32201", + "b45ce2dd43e3f44494c8e5abd3e227ba206d7b7e2b403fa60846e228eee5aa4d0901d42ad275b1080d8fe9faa6f439a8b3404ea8b0e67e1dbdc016c42e6f6a7d00", + "22841f49aa6a93d29eae4d515f582cebc724aa879e085cd3881973106f3d60734641c9319acf15468a97f7f8401e84e4b1ab701a9c80854e4dd48681c258689c01", + "d2bc23ea22a36bbc9171f775f297f6504cd446bb71f1d326a43c7b9fc293508f6ba8f789ee63482c86e4da1429500744fde5f4385ebf22cafbf456e23237de0a00" + ] + }, + { + "path": "m/44'/0'/0'/0/2147483647", + "xpriv": "xprvA3H8E2ovnz8LoiYnk1KjoapodW4awePogXF5XYXzT47zeqPiMKWyw4UKuQ6QoynTHkK18jjajz2QXEDm12VvXukKTBjXtpdDdgWmFFTQyKP", + "xpub": "xpub6GGUdYLpdMge2CdFr2rkAimYBXu5M77f3kAgKvwc1PeyXdirtrqEUrnokeuudRn1AMEc5eKH3UmrzQvVaP9pqprvhyNrdhVFaiE9TyQWBNH", + "identifier": "ca6a69e5f6f70b1b01bebc7d0f6c9d8b43e88010", + "depth": 5, + "child_number": 2147483647, + "address": "GM1wxtJF8XjgvPtadxLSVgUSAwctNnwavf", + "bitcoin_address": "1KTGyW3nE12gNvkLykGCpYXwboA2CUQ3Qz", + "secret": "91438db682c4df6e6ee82b77c46a556431ed0a2a9e47856a135fb971e0d38972", + "public": "0275679e0ccfdce20d19fcf71147a62b1646d661e95a63252613bd77b453c0e2cb", + "signatures": [ + "28097b88f1ab09c58c3499b5839b3bb0833c6fabdfbcce656ecfc2d8310a42cb6a4ba14137c98c0740061f522bd687f9de861c56bf993ece6c1752dda5bc336200", + "5f64fecf7d721b06c294915c14a81eb5165b819b0fcf41ca884749c67e3ba5484eb549437927e26f3e8921f3a9c6e5c6c327dd43da11bde202a4e08ca335547300", + "aaa6c1e0b62cc58d098efea18bbc6cb6b3d40640dedfc1e568bd0ea9ec7dcea432fdd7241a8b5414ad54fa350df478b47433d0cbaf3dec689219b06c35cd49f701", + "1ed0cf9549e60cd55e8ea0d28b355003d02f9ff00e7635d87c690165e80528b83d6e469c78bb152af49235efd290a0a25ebdb3d20fe114a6520224fb4fe7146801", + "0f0e81e9074fe1513e36bb3c2b0250e5c63b06097b483cab0535499dd78ad02225b91454f3d4b5f140ec6be8e333f0a446a1f25fb232fd4479d389781a3aec8501", + "5fc8088c87bdb5b124a25feb2429dfa959c64de695b7c409d896ae811e342e610e4addcc8d9610ec974f9572978d30352fe43cf3262a944b65893a3f87d83ba301", + "f2c1d93416b369a41cf4ba6bd2ab725c23df7b3f8e6605367150e21c6a2eb8485479e1a9acbba85922de3f07f480792a1bda9f39d68b702afbce109041425ce400", + "70d2cb7e2d68e1e59a574cb197125a501f7b926b3d0ec445b2c0968937aa33c819bf15e2c3a0f2aab0b0e50389a4bbc229590c41e78229fdad0034449f46f93601", + "5c57ec8c25e36579dc86a0cbee7b85aa0d5341b9bf40f165c70a83d5895d045236eee7238254c4e76f115c88f8e4d5b2303a4dee84f967f8340a21b2f60aa21301", + "99e170f935c8caa31e5f23c7169f57dd0ad72a521013cda7b07b423211a2c278088f31855007c00d15b63b104d4230db14e2192053bfca914482c2b47342436500" + ] + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0005.golden b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0005.golden new file mode 100644 index 00000000..9c6bc4c6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0005.golden @@ -0,0 +1,233 @@ +{ + "seed": "7TvpJyVd5yv09z4mtMYiPR87CI2RHnon1/I8CUUITkbB82Xu1l/s2n/NoEOWYIm9dWi35JHsPcg8G0cAVXbyYA==", + "base_path": "m/44'/0'/0'/0", + "child_numbers": [ + 0, + 1, + 2, + 3, + 4, + 100, + 1024, + 2147483548, + 2147483647 + ], + "keys": [ + { + "path": "m/44'/0'/0'/0/0", + "xpriv": "xprvA3GNj7biiqkjuejHkuASAcx8owhTNyE6idL5bYHnHeyS8g7u3XZRmFJKeJXgXkNYpJLDSYgkhXmUdZ5pKvuStDyy9PtoTrNm97BP5ww1f9H", + "xpub": "xpub6GFj8d8cZDK388okrvhSXktsMyXwnRwx5rFgPvhPqzWR1UT3b4sgK3coVZQdVUt8kWJxnsbMcYn4npJB9jJGZ9hS42aGPVZJPHTegDfhSX5", + "identifier": "fdd8540db0649709b16245c1130cd1e2b9bd4ca2", + "depth": 5, + "child_number": 0, + "address": "2YaKbueByqMefgp9sFHjcSPw8KQ9kP52uro", + "bitcoin_address": "1Q9D7Hn1NCBBYw7x2Ba1u6z2Jj3eUKEm1L", + "secret": "314db696368f4c796cc13fcbbff9cbb9260a70504c198e5eea89ecbc189deb5c", + "public": "021d479ebb78bbd2f914cef1423cd0762858fa0a02c1b5601d8fb43a14bfd23250", + "signatures": [ + "d7e060e06784b2004a6483069d4bb42c642446b680e479f64c3580eb1ce9a0770fbd765c4bf090a4ad45cfd0203a1676522a686a3755c3434c7d448bf336dc8201", + "1571af34e69eaa01d35d9e7a51e0c2f87e8afa58135ca8f2a83cddb49d29405628324d29539fbe91945440ba93646e0c39a149f8c7832c11e6764920303a599500", + "fa7a4ebac940c21dd7d494f9a76ec15f69031545b7b62c9d6198b05df700b85b5431245b48498a99fc24ab4fb5a83b920a391909637c7ec078074b95d122838c00", + "c4f6d7a79a3d7122b3155c17bfb626cb273e85a3547c4443a0766d05396616e85188e7a661a14f1982a3208e50ef1f77b4a437f67794bc01f0990372a9f4bdb000", + "30d641bebfc34447dccc1c248dc32d0fd05a83d193afe93987a0f85284991e4c0c0324b8fd5dd68e080986dc7cb37713c051eafcb6de9bf5d2b18be78e2e55f001", + "9d5c0d8e714ed26ca015263c3b186fc2ee3be6be5453801a0e3cb46764c21b5b254368223f35726c3c59b8ee14d6a49a9c360923569dcbaaa546adcdf2d2d67901", + "b25b523d82a0de509e002f7c0fb7bdeb1bae82f923b7ff5e72bb8a70be1d4d421f0401d52c03f0d9436aba3e1be79dcac0d3ad2dbf59aa04f9a9ab9c195099a200", + "eddeb86a96657d3d456d4eb7b14a26c473d2ab89434ff60391f2b4d184316b924fa6fd51fe4236065e63ef0fa1c71baca0d2a20f4cf95b346fab5e87bb6df29501", + "71dac11cc38d0fe44700f18eb836eeb81c3610b739aba86615f1ca8db6a54dd1044ced104737e5443071f2e4d40268891f2787654f3ab01a643dca47a6691f3e01", + "8b5019f7c1ca05e340fbf832d525ba3fd3c3bb52b58178bb335b15ecba630f08207f2e0ab813340c91783033c4cac0f9956963f7151f10c02bd128cdc545731c00" + ] + }, + { + "path": "m/44'/0'/0'/0/1", + "xpriv": "xprvA3GNj7biiqkjxgUdoN3DMTG7zHd3MgakuMjoYpx9gj5uRVMXCXwjTXWqjKGm158DSiuTMCPFzZp8VeSaAhxdWEhRfeY5Wd1eWqX5UV5NVfZ", + "xpub": "xpub6GFj8d8cZDK3BAZ6uPaDibCrYKTXm9JcGafQMDMmF4ctJHgfk5Fz1KqKad8gE1nfuFJ9qUGsc8YmVACXEBTpFxRWQGkTi1f9yxRVEQ2bhbA", + "identifier": "b5074c53d020984321dc1878d8aae494576d2170", + "depth": 5, + "child_number": 1, + "address": "2YafWS7kuRd1omKbUARrYXfQ4Qkn6k9XmYv", + "bitcoin_address": "1HWC3ok9ABgSDJG9RzQ69wf83imkoeGxuB", + "secret": "3fe1a8589b3e5d1aef622c7b2a6434539d4274a190e50c0cf506a40916ecedd6", + "public": "03b49b786630ed72ca263ed632d180060833043bfcd17b0f1dc834c202e644e314", + "signatures": [ + "8ea314518f012e5eb8be6d00e8cda65912a215bfd9f2e582be94086635b6069548b612873ea9a8d3f627986cecb8c35bb52a8e33e9b7aea3f1ac3f742dc4e78b01", + "6427ef64405576de19fd33b7bbb8b70a046122da5bf1823212753a74a2277fc4207b190280abdce97a7b2673fdb7fdada5999dac0758962812651b9a7efc690300", + "0c6c35a3029af0703b1dc5d747e0c0d47524bb443b0f63309375c879933e14714e36d2947b13ce8293bc57dd62b29a1a6f442663bf14e031ebd84cb4332bb66500", + "fe3157ed0bf3c2e4dea5ef3e426ff08f5fa6e56d716ed6d9ddb59feb6fd14a4815fe07c2151dd86864edb6744adb03e9b66e5900cd308e0ef865fa9d875bd5c800", + "6bed0f3e7dbbe68237490fff8b6050a2bff7417e450b21776ecd162e64fc4ad66ca63256a0f3e436aab9fc230aa3c41f36bda7a08f539f20fbfba13a4b4808a801", + "07fb0e9350e992d9cd6eba60d84696a70e32340daae2440fe6d51218608e86087fd8031f17291d2f31622057740202369b5ac65fd278ae0436310622ab6fb5ab00", + "6a01292bec75542036e1ef869e100bd1aadbc8c08449118509a17149e8e185491f7a416e5543b52e7071d1079a01d918f34a45422964a07813b7938cc9e33ebc01", + "7370f6c07ad340c45bccd39f5fc6e5bf21679a7644930db5437fc9be26391f04245ab6165a3d253b5190e63f6d2c16efd9881d2c847fd63e718799ed65afbd9d01", + "2c65068eebdd31c4c339754fa2628d6f4a07a4e1a8aa19ac026b7996e074495e05adabe3a943a614f48aecb6a30662853197f4991a5305c8a6acc59b04e0fe1801", + "5c6aad8d5b11753cf41d478ee1a366265fbd0c92cdbf983bcf74454b83b773907fa4f565dfb8ced61a63b1dddff76476b73fc20df079c53380c2c2eca521acc201" + ] + }, + { + "path": "m/44'/0'/0'/0/2", + "xpriv": "xprvA3GNj7biiqkk2KETbWAqAxUKxu1kwQKW8Q9RGCs8yEhwuAubWvBMSut1HPaK64781CeoJWaikH5rsPfqGgrmrVo7rRguJFAkXTTeL5Gq1Rh", + "xpub": "xpub6GFj8d8cZDK3EoJvhXhqY6R4WvrFLs3MVd524bGkXaEvmyEk4TVbziCV8iGSYjqkwjBDiEm7SpusMXDuz37JXffGuNLzTHvz7bJgTYwBTJV", + "identifier": "a8b4dfb303c14e3e3146e641c7dc14e962531732", + "depth": 5, + "child_number": 2, + "address": "24En1bJj9LsScFBHStVzP2SAKbdnXfpVQXy", + "bitcoin_address": "1GP3CZYvFjHqPVN3h49wNnqRQLmMF5jKZv", + "secret": "0aa484757b5e9eca6980f3efec09808ed492cc25f19e6c86f4116d3b65d70792", + "public": "03ecd6606e548de584712d98af3e6a58a3ccf0a8e635d3757c8d425737f546c3b3", + "signatures": [ + "a93cac6f0f9c146e1561bc4d2543813231a1c2fc4ef56f7b858c36f8d2da789815cc3204c5c069a28d3ebb8b05435b4420755abab72822cccbe7ebbaf102583800", + "8402e1e3407a2a25235ab3b0778a7cefd8e492cebf8e34b1d382f07732d9f4552f90c871c2d448f9395bf81f4b40b2d4f88a0a0bfdbaaa2154e1de8d978c4d0801", + "5a71b5c8a943ebc2b19603124c93b89d55f439d52666881b8180ce0313fa7daf4c41dabf7307bf55c8158373aac3b202ee2f32e655525afe21df0324714ba9f401", + "ec5812cbee692c014d91c069fcc702d140cc28648feb12e45c0c4cf849a7ca824b187e49676f77096dfdb6553ddddca0bf328bf21582499dfec22a82b9b6623200", + "3978a6224d19e26e577f98f55f15a1fd06a04c18fecf6d773a05369e7f4538e940fcc52e8905b7f1d63aeb1757fd82510118a90d84ab81af10ed42c73e70017501", + "ca18563c6a18b004f04c21f25096e62547006f58bfb1f727da212a6221e9901114a352ed763919f35379e27367f08f48f99666e381077af3313a40776b480ac900", + "c174c1fac8ec17b661439fac8b73879ec9cfcd902f0216848bd68058c3910ef63247caf90fe0ee59c421af3feba39586f9c0ba768feb582454f4e51fe2c2048e01", + "e5d1d19b011301e074a8ebd96b468528c1183730ddb5f4241d829f138708d56112450e903930a6c241585d602597750d0a00a60ae1dc85d7fb36bd20e4bcdc2e01", + "5d4d801278979e23e1f3f1acd6054496f19c35427fa0f2b737f44d9d280b51fc35a212af53ca174c279c8a5f3e1586b806e3b5cf5f2013929938a322a049cb7b01", + "0148fea1f1b71e557b24cc0c015b9c8281c216d2f381ac60a976d8616c7f9e6b1fef6a3da9abf728c2a3affaef5b80d56a9faedb4fb930bd8597690251cac72500" + ] + }, + { + "path": "m/44'/0'/0'/0/3", + "xpriv": "xprvA3GNj7biiqkk45bRbdg7Zrm6knfp9SFVj4CX8vKXj2YPY2v5Zo9N5A6Aa5bddfF4yKUQT2hjtyPB21MPiZs6yEsFFHDCw9kgEjtqdo7URRc", + "xpub": "xpub6GFj8d8cZDK3GZfthfD7vzhqJpWJYtyM6H87wJj9HN5NQqFE7LTccxQeRMkbd5K3NcnHPcL7xUY2ch7coo5SZMXUxVcQSsGjL4atf5yU7CP", + "identifier": "8a06d8e805a86edebadbcff61fa9b098813a85ed", + "depth": 5, + "child_number": 3, + "address": "sFeFgmtwczBk9oTZDNukxhj1w5JSGBv6ob", + "bitcoin_address": "1DapTENzEkdUMNWYfZ4UkGFzBMjA8n3243", + "secret": "c1af5ae6f9748968ff73d73de76ee8ef7ed41eca86cc25efd472e1661198b46e", + "public": "0355ba3e7c7433aa0914bfbe9215dc11699fb0b7c1eb69bad0899da66caa7b8749", + "signatures": [ + "fce5cee85c1c9620e417d9fc7e05da44ddaa21abf1abb76058d99cfb649be7701c290be3852f61c13c720bc470d89c48e4059d8501eb888f95e3c2efea72c8c800", + "50d44923d89c93185941a1bdc1c2b0607c2e206f64e7598de7e9cd6cc6f68b991a69b88c122a5ab1b502c55264cc7e60313415670860300c704d470225ce503e00", + "be98e889caa944dd81d7243f6a30341a4836b2d9859c68a2e0cc0e72ed037f7e0a212305147cd8fc9b2f82cfe1262eeab4eb6adff87c73ed8d5d60d37b6606ed00", + "1d7a310795bf283fa7f9ed8438f947a79cbd3f74a2fc213d4d903b07e526ef6e5e873c7092a688bfe67d210a9e02557873ae2de30ca66a7de31e9d9f9e8a28a900", + "3986b6647de47381aa76dcff533926d72caba39279e1fc7dc560473943befa1f515816242447f9ee934c647fc67636d3d35849741f5b6a21c55a0eccc8270ce400", + "89f266f0e8e1d04bcc1563d16fbe7289dfc7123335f8cd3699f25e5b4c9d9f0961d83f43b590289e212a026d0d121cf050241acd2e2a7d9f1c6d0f18f242424d01", + "389f96a13ea5d5e87fcce123a743c0eef88f5c4efb7f95c738ef307d98b2ae382984ae147cc687f3f9a289b05e893013436a4abb1beaeea3c141054d4280eb7300", + "3842e07635a04021536e8cc1ba2288911019f99b9647541d61c96a48363b7f0840da564743c359ee605bce970cdf3ba50fc469650adc89d77bd6f83983502d4300", + "0ee2bcbb0ca347eb19cb4559b8627c3c358582d8b62d402ef5c53f2f7189bdf56df0808499c4e174c3c64554268a9df113f61f4837817ace9763e0e4af750fd800", + "aa5a24db1ecaf438ca73060052145cfae94a744eb314dc0a38e478931c292fb15318ac610b591ba12d0a2ef08a39b6116e7f1675993f106f90c00117dad6b3fd00" + ] + }, + { + "path": "m/44'/0'/0'/0/4", + "xpriv": "xprvA3GNj7biiqkk5EtVDjwSqAfFySuCptJB9gdcXspnCQjAS1J5MvV7SyJZ6F79ySikDULgUXap7pUC3XcY8qhJpqx26Tg9Kzzm46a2irbeoyP", + "xpub": "xpub6GFj8d8cZDK3HixxKmUTCJbzXUjhEM22WuZDLGEPkkG9JodDuToMzmd2wYSUJSS6advjHwCwNZ3KDro4X9U2wbmcRMr8q52L1Ysw3ZQkypR", + "identifier": "c176f4fc33d26501bdcd164060e8d982dc06bf88", + "depth": 5, + "child_number": 4, + "address": "9R37YMw6DSow1vbfXeZDJWzFA7EmFFny13", + "bitcoin_address": "1JdwvJKkJLoswNupCuw1phpP9sP7NwKBw3", + "secret": "833579c4b80f6e704a6fce2c1d19853cc961c570d34a7d714eff7100181e468e", + "public": "03b2732ec533a140538ac9c0d7223f2bb11903a4d91e584f55a55c4a96b985e3d1", + "signatures": [ + "0ad9902a57aa8943047252e4bb9eb21f8aa18f54ed0d625c5e737ec1ed4f19941b463b232f98242a3eaff716006cd7abab186f19a4fc41e09ca5ce3341a7893601", + "622b9a74f79f259740b3c23cf3873f25fe3e85e8e3fdb721796b16f2b35dcb4e19ad1e3c38276dc0289ce835f53db9f5ac0c2354e6d593c51941494e5a191e7900", + "c105b32130961fd55ce9b15f64f16ac4671edb5c2bbb5b3c06b1f2f3de9b35f842ee2cedf6fb77e8b838b2ec7c2e18a06cf6c7225fcda55ffaa0de39809c156000", + "c2e3db378b426c9ff45bd6696aba4799b3ab9f4fa423d4e76db12e153ac596305797e91f1793e1184f69e29aac44b3cbecf311b344a9ac619fc3cc585572c6d400", + "551732a63332ab7e7a7578a9929447941e133fb1c18fd661800fd8993f6488ab6be1de6276ac87f00d3ba7d8d69c66e2059ad52dbb593a22a975935991f6b0e400", + "7f2503979c8de4eb6a749a7d6750d3af22a5aa4cbb49198a1c41c468fbbd36fc22188e2658ab2303a8eee3a694d5ac2f07466feebc07677df17ab6ced3ec1f1f00", + "0afa3f784f4d0babee1d69f0772a9aacbffc392fbf15baaf21ae22f7e7a6a3a7705be1d44a5f86dc392fefe1676b0d6ea8df1a0f45b00a4630159658e477cc3d01", + "b6e2e0e04c32c58e77fb1359ad27f0d4d9096c5057e9b9eca55d69657f0f581d34a19a905f0c296998f9b0a9465e134a77bea550d65a9047e55daab5f8ba961d01", + "fe0f51112605a7f679e9fb8d421d8b7c87e389e6d4f99b5b36300912923809a7175e58c042b955c794b0c2c4a2d96e489d09c0086cc6b96e2ff078e1cb58fcda00", + "93ebf8d2f4920797b8f3c8b1deb67869bb8e4fa34a2758b8c05a635984cd7961536a4973d6c028b1ff39d4919925777082d5a0be51f32a301ee61413782a651000" + ] + }, + { + "path": "m/44'/0'/0'/0/100", + "xpriv": "xprvA3GNj7biiqkpJ876gF26jDujBjwF8NruABocwB7oBbh7HY4cX3YghHksFBxHaNuYB5q7vbQSrUD1AUtmm1hfoE6pJvLSNrzst9kgLPTkjwt", + "xpub": "xpub6GFj8d8cZDK7WcBZnGZ76MrTjmmjXqakXQjDjZXQjwE6ALPm4arwF65M6VBNrh6JcEnhWz46nfF51spFdrLpSFWLmy7VtWC7kYVnV28p1Fi", + "identifier": "ba9c60ecb18726d309620aa3a2b55006b3e495ca", + "depth": 5, + "child_number": 100, + "address": "UiWxcuHEhNYmoTHfKrMePpbAiBBRHpEafr", + "bitcoin_address": "1J1i24JLiyfAigu3416EmsiuuqmxjPFWZD", + "secret": "84572ca17ed6bad59631ca2732d036847686147df908638a3700817da338040e", + "public": "03a5727493f19245c46f8e0d077c71808c957b3e166eca774290d221a9934fc118", + "signatures": [ + "179ddc5e87167abc25f738e7133e38b789b6963559a491f199c1e195e80c2718743db2be8998dcb0b00d598c4cde57d0687bccae83b3eb6f9200f422aa2e498701", + "a532ea3c3760c8c103f672be8501bc05830e7047e80f40a49bffed89511773094388bbac326b76adf9d79ba429d9dd6d47628d7cc348ba09946a1ee387ca270101", + "4b32403902a51454333163a247c5ab2dc6f7a4fc3e06f827f0a56aa03b1831657341136efb9e6e9dfcf06f5d2ab5efa54afcd48943bd37b7e01d91c2c845b0ff00", + "541ab0eedad363e2bcbe9205a7d95de93b422632c5418465406cdf9f0a30f9ac3175b7f0969176ef0f9b8bf607d301ed9c72ecac90ec2dfb8c782f2b4fcd0d8201", + "ab2e13040cf5bb7e9f1675e093bc000969bff30c2fa4e8b49b31c7635d5930647285f5436e67c420b259add47689a536d29fff830dd105a45078c4592fd7647b00", + "b7c794a0c118d6e0bae6773f17c3af508747b7c7286f3c99136df30dc4b6a0ee034af721108ee8a7d0e4857fb92c48e1a935f4b5a22f94728a71f2e832ecd7d900", + "df66ff07624f9d6d9937d7c7e11f3afa881ea18e199eb3177eea2ff3797ed3e5457211da0aa4dffeb98ded0e436e7102633f9b3cf5078ea5ee9a1cca18f8e5b600", + "63b2369a0872e819f4477714c93cd54fd1a1c358254119887e8efbf482002db773b9d0426886ad1f3f938b327b0ca5b8ce235a05d135a927256e05910bb11df601", + "d8abcc776286ba29b4604d75fa2eeba662e6dbc6099cbf1c25293d5abcc4171a5ead2474f6aa67ae48ec128b145a3c6992ad0a2fb0f4e928bc3100e9539233b900", + "acba638f49f243d508bda06867e528bf4129ae9839d92249ec60452cf535cc94581162a84d4b85f188ea04e5ec77928c0d38c3e9c9a14cfc167fe93b2602581701" + ] + }, + { + "path": "m/44'/0'/0'/0/1024", + "xpriv": "xprvA3GNj7biiqmWu5mZ8WRWaFXp8uQ2dtPYfobXDAdHn2VnCL8ypXacWMVRPVURUqqPoQfdmEA3fZYDZYeFKQMBzmUAEL7qYdLNRio77WnTZRE", + "xpub": "xpub6GFj8d8cZDKp7Zr2EXxWwPUYgwEX3M7Q32X81Z2uLN2m58U8N4ts49ouEnSJbvTiNDP7pm43E3FPnHXHyY1P5xAsVYsMZzDK9qhVbWL161N", + "identifier": "c4c61e4a40c7f9f21beca0bf406fd2d5f61f7813", + "depth": 5, + "child_number": 1024, + "address": "ykeskbhEiFbw1ruyHw8hVySZdFh46WcT7v", + "bitcoin_address": "1JwSn6rkhbVbAbaALucRdyc1udgR5jmurr", + "secret": "1119e1c466621c643163eb0d32d550fe468e117178355d8fef398d0ae8852cad", + "public": "030fac1cead02c766281904a1b35aeebba7f90184baab8040a9b9b7d1ec166d161", + "signatures": [ + "64d6f88e1e1b441b632114782aca58e6a616afbadd2c7478a3fb04601cb7f19d707d696fcf1fd4f7ddcf4a66b0e38d331eada63a9dbd3afd27d40ed7f30054d300", + "e208cde021870bf14e933b7d2e0be7c70db15175e84f9543bae45ec1cdd20dd6113000095220f48d1a34e4320e9c76fb81c8566f6811978d649033c1c5d43c4100", + "b22d80a636b4893ed29d8e1401749e5c3729158a664cf03f4e75387ed38119ad750b2c3e4973e0adfda00ba044517961d9ae8318763a2673b97fe135d5e46c4b01", + "5dc8731b62ddfc72d0e241c664bbcec659bdc8216b112b71f8f1a3f78f6f424b68936ffae9717431ea82b8c60dc710e20e664247e79c0b00a3307ccbe2b163c400", + "0c737736f1007a83fd7636d04c40b2f5ced22928a87f8b9a5163124d080cfc5159591a36b7e4e5cb7795c02fc1e7a8639157035092bd27cfe73c80d6d4a5dca901", + "960dbf471671abfa00615ca5b00d7ba9872f3ea1fc159f4ab6568c67b51dc5fe3ce32960ec9ed234e4466f5871f4a561c1c9d23ac3a6179f6a877a01a74084a500", + "3bb6614b5c72cbec01c3c23bb7d57cda1cf7ccfe969c3f41b8c47c2f645c03fc36424f590f6ef8d59c74220f0258512c17174f03e9e098c7941f9144f77dd6de01", + "5657bcc6fb327900f852b8471493b6be5798cd90dcde324a5020a0178cab0fe47b148834a9bebeff220f566f44eaaf5ab2d749fd64dd85078ef2d3883e14889e00", + "fd410bee29e489db02ff8eafd6481c88a6fcace2f10359913a57130ec51e09a34748c17e4d3e58d3143cd70a57b2bfaeec23054eb84ef8bc0290961206ed611201", + "594e49b5fef7b33d887f8e43f8fabe303d5279b1bfce0ef89d74ecce30102131739c024e91eb8612cabaed7fb5db57a97f6080ae0f0a80eb12ebbc4d9865c06101" + ] + }, + { + "path": "m/44'/0'/0'/0/2147483548", + "xpriv": "xprvA3GNj7bs4WHdgpoHJESpgz8s4LiYhso3CcgyUf4bacMjniGcnx9NiJx8SUmHF1FhyUbTUA3mR85wB7PSYrohTAGwrSoigDVQm3PqLGfzkNf", + "xpub": "xpub6GFj8d8ktsqvuJskQFyq485bcNZ37LWtZqcaH3UD8wtifWbmLVTdG7GcHjYfkodEnNaNZ5Zdjq5NSMDbnyFdNn5t9TyVLX4n43HBnyPgy3A", + "identifier": "ce46cd786a7db52b8c4b0393b98d5c99cc1b8f9f", + "depth": 5, + "child_number": 2147483548, + "address": "efNnfCmEzWQ6n1RyE1Cmstofd8apNNbt8K", + "bitcoin_address": "1Koh1yDa83bxFsXv961q8FKEkYnxw2FBZk", + "secret": "ec5dc914b132a6225895acc582e62edeb5286c0a6eb24afacf35cb7f7adc3c56", + "public": "02cbb81bd5c8679b01000c1494429a46e7394ac0e6607812ba4375a8d965193cee", + "signatures": [ + "f6c703865ad6f1922363e6c1723dc7d6d21a4b5674fd88e8a94de1ba7b812dab58083f41f963d836575586b43244e8aa6ba47dbfb066d9f0073e8a9901e94bc600", + "b6a063bcf6db68da669b139ba87cd5baf9a60c202cdcdacfedb7a75db4246e8e6dfe34dfb01b1234401a8dd727197aa7d1201ed89155a425e8a6b56f76b58e1300", + "c46af51d1931c2a080b78f3db83e31732850eeb5b1bd537a9cc5fffa8406cc1b6ae2b6b00fd10e2f21f640b31283492378490e4bb074fbdd1cc9006c9789561a01", + "edf26dc0040f80db022b26934969ea7a4596505d73cb25d1dfaab919cd4b66376664ddab98515020ccc4d4bdb20ce5166920253dcf15d9931439680c80c8524b00", + "fe25e894ba76d725b069d0dc8a7915eec010c0d6ca51fe5b3e803e43b01adaf372207fe5e0cabd8a688565808bde78fa3bd0bfb247548f3f31d7c8fa0e977ed700", + "04ee143872624acdd9381d75667d46b678f2e11f01e8ac5e93baac073e6adbde2d02316d8ff058f4e4fe077dd8eec9d070866b9260f100464931a5e806afb9bc00", + "37dc1399610b75d0a36a03b326d78980220386b36d818e585f2779c7d56c88930fd95eec064a4914455e2b16e8f3f5e3ccfad9b37c5eab8eb556ba878a5a490f01", + "d48a1d425e597309cc34997808edfbc984bfbb598814bcd729bc0711586854cf62610a0f414a8d20e236cdf25ee17ef83906cb3b8229d352ae1374511a80ede001", + "f8c993d6da7f0197ed3ce7cb8292684cef38f3a181e767c81ee96ec99dc4f0fa3db0b1d2532acedd64d7c5ee44d622e24a1e94adb77928cb92cc3f466ea0191800", + "32e74fcabfdaae98e207e1456f945f55e6617f29900bfc36d8aa0ca559d4a8f42d9e8254c3f2b159bdcde4bcec76d0229ef37c23fd7e31a88eafd7996f6ca6ea00" + ] + }, + { + "path": "m/44'/0'/0'/0/2147483647", + "xpriv": "xprvA3GNj7bs4WHi3YRrdrvaTXAhPHJKABeSpnxjnLZV5XszfG52KomH11VB367v27DrpHUpH1tYGycTftUbqfQtrn4QbVMnVXWHqmvuG24heAo", + "xpub": "xpub6GFj8d8ktsr1G2WKjtTapf7RwK8oZeNJC1tLaiy6dsQyY4QAsM5XYooetKWXv8YM1AJKNtksPiSxLPvMKkD2s6uU9zNSmX6F1HmLUhYzYvM", + "identifier": "5ad2c9dc53a924e7a8d021083f32f403f77c4592", + "depth": 5, + "child_number": 2147483647, + "address": "2BTCXCxX9Jqmod8rMUUgjvJVxctDjFuBKSH", + "bitcoin_address": "19HEL7FSC9x28Wc1yRQeMK73ukHS8oCMUc", + "secret": "e07a0b7085afd77758cb2e5f6df147cf7c50d185fa23ce2f5969c36778f103f3", + "public": "02086edeba828baa10aefa06b4ecaa90628332f488abdf2bfaf4fe9d9c9c96c702", + "signatures": [ + "84b9ff4c5941be83e5cd6cfe7114efbde0a4f50962e5e6faf9baadbfbce32d7540110564fff1eb7d320ba61231f850657443f77712f993b409adb5270ab3af1d01", + "4e09492a5267274bc7b7487f0d1b83b40406e1f89eb6f1acea9948020f208b5469646b3dfaf3d4cb4b05c2753b14476f8904c7df96a95914f87f61f85a45a80801", + "9629aafdbb44a07d1dd88e38e320250ad339e1e93407b099fb1c4972c6722f745173aa85826ea84eb0ca82ed8d6f7a0d29c9053bc01abab2d20f64e8d6bf175c00", + "f3d689dba1a1dc8024a4bab90a1ac632452e9345414a824e6e67d7bca99c31fc610c6cb33cd447db126c9abf7d6ec637b25a3bcbb0046f7565c1cecf20ba52df00", + "a38267b7067cbccabd8a0fdc4b7c1e03b90bc9068a4ea36a526d61063938a3a94b1169c3c8690e1e54d3682e6c9c8b8c5980a1c090276300cb0eaa762a10245d00", + "3955e6cd8b57dbffdd4d92d6568dd39275fa7d6fd4612c35c401243c37f38bbe6594bbf51f5e6d6fc6499f027e063d61c83e82abcf87968469860e567c5a43d501", + "b3632753440f5eaf2efb47af9cf9a6954942447a3bbcd19f4c499694d24928fc61020972ae69c14335bb48085eefa64b12589da6e436dd280542d0acd3f22abd01", + "a8b937fab10fdfc0405aed6e5d4e378ae9f6dcf53236c6d5d57a1677d1da258b4690702a5d59a43c2fd22fa50fdf9838b6b558869d138c169a44d14ec1ea8ea700", + "05ce6e9bc2c4620553d4e175a8735cfcd618dbe1aeb355ae36c9279212a2cb410dffa73b5a3f699bb23cacd9a307c1aa6f011a8dfcac527d5eb1dedb040ad09e00", + "d724bea2dba9f10600d5b2a33f237f250c5d725cd169b39904a909fe83e351a6595c2fd4de07a70309f18fb89b2a473c8985c6a4277d29413c029741d94c5adb01" + ] + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0006.golden b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0006.golden new file mode 100644 index 00000000..60ef73bf --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0006.golden @@ -0,0 +1,233 @@ +{ + "seed": "7NGJd2MwBTrtEw8eTt0ogvY2o3JrDviXmib0PCRKhfY=", + "base_path": "m/44'/0'/0'/0", + "child_numbers": [ + 0, + 1, + 2, + 3, + 4, + 100, + 1024, + 2147483548, + 2147483647 + ], + "keys": [ + { + "path": "m/44'/0'/0'/0/0", + "xpriv": "xprvA3ske3kp7x6Eu1JtGodt2qAthvMYzi6P6t7rQXRULntDMUvjjqEF91uN1Nf3qWS3vWPdFJiJjKr4y1RVCrDYyYz3pbkJC6TfZFETLQgRNnT", + "xpub": "xpub6Gs73ZHhxKeY7VPMNqAtPy7dFxC3QApEU73TCuq5u8RCEHFtHNYVgpDqrgDCggcPis4H3ReqPAgvv7BCSaqvvTaGsk4sFbd63sFRF5j6z8y", + "identifier": "c58c3b5b77d294009c51a40410986b1c60714536", + "depth": 5, + "child_number": 0, + "address": "4nbe4MfkZnxRWUfuebhST8CNk6TkWL7iZT", + "bitcoin_address": "1K1Y7GjpQLHV5Z6KP83B8ZVR94f7sqtAaR", + "secret": "a9021583cceede72400fa11c68dd7fbebd7d25db1cefa95caf880debe18cac37", + "public": "03f5656aa88fa3843fe8081c3f0e5de40901eee7fdc3e28e348fe671a83ff2db9d", + "signatures": [ + "ef96baa4903c05ae96ca69a7bb66953b12536295e911f0834784d978e57963174adf2caff4f6113eaa4288e676b0d34a6c6770ae68617cf597fb8ebac74b07b201", + "09d4275ac7143d3c40856455f9680cd96b4c1641aae36f88620bc1c86f833f6d4cc0d7bf47d569243b392a49371d00f60bc0e5dc73b3ffe6bc65af1fe986a67c01", + "57f93892393e50c9cca9cfb4709e57495ab4ad662214dcb4b645bd6507cbba87303d3efc7ec68a312be9b64a8d001079b384e5c28e9ecb265c3b235a893eff8300", + "be5326d9004544b338b803945687d20fa15c74f5f7786e15adabc92e0c10ece00afd36c326058fb20546ff7252f81658aa501a370cf394968b706b8f219e5bb600", + "7b420059eec1eb72c7733f18a1a3c1bb4b54c39e521531244e7d2105559d89b465d2cbd2a74f26c070437cdc7b265bdeeba92657aa02f11fa70023cc5fbddf8501", + "002e94c28cdc7f757ac1c7d2c58b4a337244e15dab7fc405e0a34f56ba0109eb0a6dbc9f1f107ce87781f9d2e898a53253d0ecb7f6713a9d40b07f1d5cb6b61101", + "852fa1b2b4fb0d653333202ff22327089bb8939d1391e067673697269fb60d3016399f14c5152a95d7c0e763dd98862e5880402b755c6b773461fc7c1574d4aa00", + "ec679fa05b7819049eee38a79d1e2d2834bb3c6ecdc4663d5a5922ae529b9e5f7dcf72260064604c0a25a1ce4af012788b3142820b47ce5e7a21639b1e715fb700", + "72cbe795e12040beedb889fa3594d1ccbcbb1996c24a2cc05120e20b908786db512c86fd0a8affd96c7e520c51c645535fdfeefe42ec88d4d0e3a43dfac60c2801", + "0762ed0d2de5c408b0dc7097e51c7ff1136baeaa858c886fc04534c60fe166e20280aca9d8d9e3347a42f07ee3c68c5eaa2d34a6b449e7acab4941e49467ee3c01" + ] + }, + { + "path": "m/44'/0'/0'/0/1", + "xpriv": "xprvA3ske3kp7x6ExaVsZiMa4Cky9Qce8f4sNu1vjjNhBJ2pvXcytyPyGyKBgCENR8U29KxQATDvAvs95QYAz33NjqRp24sNRawZJFZ2VZHRQN7", + "xpub": "xpub6Gs73ZHhxKeYB4aLfjtaRLhhhST8Y7nik7wXY7nJjdZooKx8SWiDpmdfXURKo78WmJCni29xj9Ch8tHU6yDE9tywMGAKs1YVnQMiugujnv6", + "identifier": "336508b18c4bd6bd3d325e2daa8467fc6bab0648", + "depth": 5, + "child_number": 1, + "address": "WVfZHMzFzrKpojtbuaZzAXVt9UcXeCXpWa", + "bitcoin_address": "15gkVkGDYpV7sCmrWS58ttpPfG9ChcK6bG", + "secret": "0c564eab8e71ee5e7c11622d7d32e55a905fae294e8f89f0009afff67f0c4a42", + "public": "02a4e5a1a75d3fd9ba13a8d2f0aa6e9191b5b16c5d2491e7e9fd1787eea377316f", + "signatures": [ + "b391d7f28e3c0d7386352006c286151ad35ef42618dd84145adb36eb825cf8ab31486298fe3f36f38d8dc2821acefc0458ba72ad9d6d1202e6d95d56fe90cc4900", + "5c0b4ccd8fd6f4a3c82008c4fc7cf5764f4a5c450d0426649996347006e0fe5e7cdf314915bcce0e6044cac756e4973b6e6b391bc4e7d8ac4f311fad7f50ba1100", + "6ba217be6daf3f8d5c4b4b17b6de354023306bf00e458e83c5f9a067d234a4855f5f1ca35c2ec79273055ac336bbd2825b5d8ddb96a53843689bf7124577548f00", + "85e9fea422e90e042712070edada0f8dcea79c4311a4c93b587dfbb01b40d5834a1ec488e7574e6912c458c45185a5a8b311dd119aba5de5ad6de741de12abd600", + "c6f1d09cddca12bd522b327cc946dbcf50f2192ed7b983600252bfbb056cffa6062a9b3768792dc5d4f1a76657cdfc2c4644a6158a07c08389fe85bedc69b1c501", + "7b9554ed0f83645741750a2c456d9e4fc7d8b06a89f79d00fe52f52b9f12f3355237d6a0b816985126dedf62b8f4e2127325d31cdacf612560805a1bb6bb3c3301", + "facd95016afcbddc8b59b068b0e1eb5fcfa750aa448667c214d5ac430ae4623936b1eca8e164ad8d2321ed6fc007a0a82292749af325b8a489417e2402a7304101", + "cbd5a7e70f98033509f306f9316df7a7b3d31b1ec8c4fcbeed4a010f9454b6751dd57e8e027a3b06deb9a0de13b6d91b39e5582a371f7f419a90c6587774d56900", + "b70a20b7bd5defe372fb54acf458b553b98845f2f7e3b2a2299762ce2a846ec3010402ae36141842484e083afe454ed8f38489ee48705e1545027e0849bdf9a801", + "7811db2e23b117f56d352992822979a0767b36920af644108fea3d41336daf6e1375ec8553f53e5d9e3a38a37715fe5cbe5fef8cf649cbf832f19d74e864876901" + ] + }, + { + "path": "m/44'/0'/0'/0/2", + "xpriv": "xprvA3ske3kp7x6Eyrm2HZ1a5thnW6iuA2AvGjx94kvNkdTekBmQWt2PWoTu9T7DZiofBe1Rv1wdb4zXRD4yhrHxD9tEsh4LU9x6uugXF4XrnTq", + "xpub": "xpub6Gs73ZHhxKeYCLqVPaYaT2eX48ZPZUtmdxsjs9KzJxzdcz6Z4RLe4bnNzjcuKtVgMMwgPvRuRQEqsaSWCvfgwp3P4fZWF3kWzHaBh2cpXWK", + "identifier": "302b31d074ed971e0acbbaaeab28f2da4c85a404", + "depth": 5, + "child_number": 2, + "address": "dZetczK1iadBpfyUBQCff9NXyLQPcdBfbH", + "bitcoin_address": "15PhBRPAmX98iaL2H5wPEsbjSmRmfBgAcP", + "secret": "43b69da1add1ab2a5411ca18189393d7e34a119011db0963ec35f90f7d0d4420", + "public": "0306cdba7432a07cf12beb82ac637f1a9d1d47224d364e90fc0d87e7f488503b67", + "signatures": [ + "9a56e0cc5921a22bd9bd07a1823e82e5e220489874af119f4ed3defe3fccd46c2534bff81ea1262efa49c69d1c039626a18c82983851961e424f81113a321aa500", + "14082821a64b00a5b95660f1d040e7f620b9a8ace9582a8e64995219927ab95a5da6f6a2c8a591c9d7fa31ce63e9483224a61f20a48075111b59d36627acfda200", + "2c3b302688b34b5c4dc4b24b033b7c83ff6faf0275848ecf9e7a185f319a2df86648896b0f1df079da77b0a2fb1d245b4bb71a87be804248f22545f9305b5e3801", + "b1b54c9f6a4bfce4265396c4950e7213e1da9395fc6841d915fe937d52f8f6313b39cc88df6116d218786ff3660981f9c3dd219b679e278fff16301081b09c9c01", + "cbcdc57de4d89293de62262613a00bad4b551216fbdd1d2319d0178ce3296d6741f83e3b32cde8c449c6e49adca31c3e47a4fec75955da7ea4f6f74d4b321b3901", + "34334c4e24d9eea7295a17d1795a73131020a5900d54dc56dfc870dffbbe03234ef88fe4fab25407296ecb148b0792753aeaf4fc8cde40a47f56f3ed14c4888100", + "d5d61e68d8d45c3265da6a4b2120c0c1aad2f468a4b305ac3eecdf719154c8057afd5ee7b0e1ab8f7bb441164089e37c2fd6b44084a121c31f39e15f40000a6900", + "27996e3880e7cf9ed3f29ce49099c0c43379387fd29318cb607351f9646d4e917893f9dd0f7d93f4940174d05aa69c2699947bf54fac17e54239ac2c57d5ebbd00", + "98176b24153c5fe06fd07260b556b6c4e8153d9dc509cb1202326997f17f6ca0398ba1ac787c9e66c9ee73f62932c567c883e635405eb2960ef4c210d883666b00", + "d9ba5aa10a469e6d492121548dd0553fcb62ef44d7cd418de7a4742405f7633315cc38e0c145aa6645e494547e96f822c53aa5d710493678ca0f5e4643188bfb00" + ] + }, + { + "path": "m/44'/0'/0'/0/3", + "xpriv": "xprvA3ske3kp7x6F3T1TyEy9vNoHGmnQyg1P5jW1NCtpGDEnpDarfYpifEyxpT6fF29RhNANTCZg18ywotQyxtusJ8zjor31diEFsi3UyHePQhW", + "xpub": "xpub6Gs73ZHhxKeYFw5w5GWAHWk1pocuP8jESxRcAbJRpYmmh1v1D68yD3JSfhzWLBsc2FWU8bUtCKqUYVEpqr7Ka7jVCTMBKRdnVxvYoUcgaTj", + "identifier": "2f1b1e4f7fdc377e1a67b1d89bded4fe2360a413", + "depth": 5, + "child_number": 3, + "address": "X53w9siTY5ci67heRVXi45JzbcMYxHrqHq", + "bitcoin_address": "15J5FEfLRyGnQnDJZ1XXroYTckdDqsUnjd", + "secret": "a0e3116c07e1166033b792a1105a16216057aab5a0825b713f98ca74406dacc3", + "public": "028ee768128b5c7946fe352d5139d1f17dd0a4608feedca87464f74aaeb492eb76", + "signatures": [ + "ac5d5451a035a2790a0778d45bc5076a5c65b3282f7820a66cf38ca285c2eac67276ae51952c3d99bcc9017f092a6e87374b87e8b2afcd3ee3d618b09ec3e42100", + "3d904a9e035e6264426c09c3171429870735cf7885c15c1d8690413b30b4b0bc1a92c27994e28fb79d082858c437bdc7d0a3636a24a24281b19d3e51e5ef62a400", + "18f2c10fb503db7b9f3396860a0528e9b8154c980cfa0ac06be501d663ee850b0a75a370f38df7336babc4d57bc6bbd1717eeefe1cca3d90b6e22644a515fff300", + "1ab8dcc63deb688fe912ecc93b109103181c5691cc4a56fddf09361358e548226e289d9b651c745f56d1251b974e782614dbee4b6f6c6e00f63b828574a2333e00", + "367a14851a36102ac21ddda4764591fcac85789f8975169cc604924f4f291cfd7c87abd8d093a51c0f1054330da7809b9c42feb8d551c1ccb6774735cf11dd5001", + "cb632238f71fd71defff4cb3dfaa9c2de70d84b7d3a9d6f36182b0ee2018953c31a0c5f238533c59b35e48066433d74b23d3199a8c1cd7e5f30821f5f32cd94400", + "925c55b0f544540485ca25aab48b4e394298728f824bde1c720dc3f0a92c86bf3c41130f205009c93c09d703e0a6eb11b78e964ff3a6febee58e9b2115e61ba500", + "7bc00a724fecefda0aa31bb2e33976015f07261580fadb812909150e606e03d479f8eb100f82ba5e9fe860ef960ce6703b8c7c02c6ef80dec5534fa56c79771e01", + "22ff8b491dc8ec7a615262a1073a55ea424b39d9e11fb43b868692ad6cf947b047f8355d2a49fba69c5f24240819d6819e20c9de4caa48e5bc90bbf39a0c118c01", + "75dfd640146ee948ca1cc56481e6af4ab32e9234b03dd30f64a4b4310f5c2e4904fd95090f28036597e4763991225483b05310ea708f5940ce2dc26ed39bf92201" + ] + }, + { + "path": "m/44'/0'/0'/0/4", + "xpriv": "xprvA3ske3kp7x6F6E7RaAMebbgdb5yQ2euAkJ5eDhNxFXg4TKqYTCZMhhfqBxXrL8ZbBcpEbox61br59E8RfKUkzNA5mry7Qp65rph745GRZR2", + "xpub": "xpub6Gs73ZHhxKeYJiBtgBtexjdN97otS7d27X1F25nZosD3L8AgzjscFVzK3G6V3eV1YzAmpdjCWdD9TcKsVabzay38dppwRgxRGvmH7wbcarS", + "identifier": "eae1036b9422f8b198d75c6a426e3a0a3b005f3d", + "depth": 5, + "child_number": 4, + "address": "2YtMNHowkj9MCcAwKEGRXxgBbAQuZEWxpkJ", + "bitcoin_address": "1NQvg6G2vcpuLXioVuZH2gDSHSTR5ndxUz", + "secret": "46778f731d2dfa2c57bfa0ac2e22173fbd3eee3066d9c36f263933571f93e0d6", + "public": "0393f22fdfd0376e584bf4728c093b09bfd7969bbb16b722904667b4d04b5270da", + "signatures": [ + "e6e5af47c544c1c90f96027fc6336c4fca7906ae83be00eb8631e3459bf011a136ab2b7249984efa3d894473ac1af08d9625de08cda34eb0488835efa71064d100", + "e4f778b5f8ba30dabeb0cb94c96037aae10a072b34c93a56a648580aeff6b13d636b5953f0822a6f8cde141a0c928aff993174f8acb49d143aa9f8e2c4e78be001", + "00a9d12c7e7d4e8a09c618b7193590e49fd88973e58188491dd248f6329ff9eb6b6a0885d4004f9c16b079bc61136c3cbfc3c1775f1430b9ef4968e7c7df07dc00", + "3a6ef460e8a063ec75cd1c7a5c1ae33ef120697c9ea2b9249468678a8775c5ba4cbb79d210888ce3a689b6ab858dcd991c93ea40605f4a5652e7f92a686a936a00", + "b889fb65186bf2d45854c696a68698cee64ba2c87ddc5840c11ff9192cda167a1371c7723b7f9dbc39337d49409def3ef644456c4bf806939705ab6ed61d419300", + "e1d27a23ae3f7608755198874d857d071ee5cd6287ee8502a46525fd68b147486b0e9498293d484b8958bae0c28caf3bfcebb1c804c1d03a5854ac186af4b7d700", + "c3dd2307ba2c962c2cb859eb5e19c657492ac2052b7a908aaeaf22c4715a725d3e240bf3811cf6a81c713c39f439c48b32cbab2b4155311044a2096e75fe02cb00", + "98b1c3aa6d639b032fd35a5d9976bb3de03d6d606b45dbb6dbc7baf4454799372ead374e8921ac3ecb202a8ad462364722c60e804627bc513008df3fdffa08f200", + "146a74d85572bef2b5f2cda85365b950aeae52d5a3755c714dbb17be88993df7183c19a79a2d94a3bacd7810bfeec6c63e8f0c669763c373f4249fc203271cd100", + "6222b9392b994ac4bbf6186f48ffe69b75a5cc128f42aa96d9362ff283d8cac03e88107618c82f301b1adac201e14361b63d0cf954e68f782290068add23e24b01" + ] + }, + { + "path": "m/44'/0'/0'/0/100", + "xpriv": "xprvA3ske3kp7x6KJcuzix2pcecb237YdRJsePthBdTgZsCWKSnNZYuvgFdBLeaYGfMuMSvPDoqAgxfZ7AcNxaZDtgoQr7DqUGm8SNVn64YatQp", + "xpub": "xpub6Gs73ZHhxKecX6zTpyZpynZKa4x32t2j1cpHz1sJ8CjVCF7X76EBE3wfButL1pNHQNKrxPeh7kYNmQcWc2u4HbDvnLDJAgfQhKSCApJ6TMJ", + "identifier": "54809c20e30f6d5f938038222b9b3a170ee255c9", + "depth": 5, + "child_number": 100, + "address": "ka9oFSHGTPFX5izfEFWWDnR2iJEAUtKbni", + "bitcoin_address": "18hoq5un6ooBfLqS3pFATqwHCguHy7wTKA", + "secret": "24bd035d9ad1a9ec7f70f8fbfb27807a71e11fa15cc294b10172997c9d7371e1", + "public": "02491e87f22f23844be126889cc64244cdd8c88458323c3745f67b899273067fee", + "signatures": [ + "ff90d992e8fc20b7c2930554cf5d100bdf2155c28e7910f47a06f9024968927606e0859aa1328819e95f86810d29b76a12891b6cedc65b375d23dab69cdc4e9300", + "9705e6531e72823537c3dcd3f8a1c1d83dba7f8f3b9bbedffafd162002bd38ad7b2f1ca7af643de58733791ffd2f434f3e88339b036adcfc6d271f96cceaafe601", + "b243a826978ffb16713b4846845b2e2a3dc48f3c7fa2a1b43554bbb7cd493c602cbc64604d312a6be1de74d76493f8b30dd78dc732c709253048197721c2e20100", + "4956054d070835a4933633c9783755402714408c325788685099dc43d01f24f81412aafda7c0a47238a26feaeb2acbd652238276e49662a502f44c613876af2501", + "7f73db11f586410ecfec75afadc097750547b6f75e644ab3b5d37cef58d245255066f70b0ec6ff02ef1ee14ccdd8b0ba9ff32eed95deeccd374490a6a50cf21f00", + "bf2e9124ad3f5e7c9171709bedd013770cd51af35742e11ee6028ab55176430470a2d87ac0486fd6aa99c94e4ba7fcba53d5dc5568bedb9b6a78facc35aae38601", + "147285e699fbeec01f6cc1d7c45b2aacc6cd04fd152c40c5ecda5589ef31b2093a8c4db237e4cbb6b6ac3af2ad6bd3caa2d0177ae42757896f52617e057a3efd01", + "c83d260746b3b4316825f0c2d3f3c3e5bbba2de4a4dfa979962c6458265fa5612f3358d44d8e66a0fc90ba2ff4fdc8f47eec640b7503eb39d1a0590985771b9600", + "c421f3e56193750c61efe9d08daa5994baf40d2a7b02b7e3de8970122857e9f92d3123e8cb9b3751b744935675ccf1c654fbbbeb06b6c7cef953234520da799200", + "acf046b9f4ccce4bb45592edbed7debd8bc674a55ee625ec7e095a4486f79bbe0bd1c23431f02f3bcb9bff59228b689cfd3aa0e385e6620dcd832d5b5968670a00" + ] + }, + { + "path": "m/44'/0'/0'/0/1024", + "xpriv": "xprvA3ske3kp7x71uLp5Hrvco4j4Z6uWGyQdBoXBYm615YiftCXgYSzFDNajjhWy7s2npUUJYd7RL2kZkBaqyDkg859q1jArmgQkyt2iqEW3TC6", + "xpub": "xpub6Gs73ZHhxKfK7ptYPtTdACfo78jzgS8UZ2SnM9VcdtFekzrq5zJVmAuDayFfTwLzhoVu3PTfWjB49MKWDJPUSgPQRtvR5tWRKCVGvq7ZvgT", + "identifier": "4b281a6080a6cf4c5bb7744b0fc8193b2cc4e33c", + "depth": 5, + "child_number": 1024, + "address": "28VSxfzirpgUZzUDeQ3Pi2JL9k82YzhYiwu", + "bitcoin_address": "17rPio7PeZT3MmRFkYDfBPuUspyNWfczAh", + "secret": "6bfc970f6b94633f88632088b6d7623649dc76e11a4e838deaafdd9ec1596551", + "public": "02c8ebfe0c19cd00e425a6585a8952fb3b316f6903451f16105b5e814c1711db6e", + "signatures": [ + "641a92be23941fecf623bfb0a8bde25a9ff0884ef429b9d687b6bbe55e0a54321ea387d577486b654a307113134e9dc482fbde12731f26fefcb561dee610401b01", + "281e501300fed31c9571b3952ff8263086adfd0d9395b8299097d96cb2f983194ba6a8aceca55c888edbf67802d61ca47360eae610aa5f6d48e4363ac462092200", + "8b319845613e1ba23eb2c20af4a2cd46f986ba1e9e7fa32a4f7e8be3c1dfa93275b97df750fa0d5ce95a343c0d14723b45c751441f59a1bf0cbe3e663d62a44701", + "f2b5c0e8976129e3d02831a6b8ebeca1b4045b4053d2253799d70a6094d40f6b3656baff1c8f8cdd21f99e81df618ca720b83cf87734d948c0e666cb5ad63d7200", + "ac7e319c51f7f7a98c056c6329af3dc97ec334cc780f2637e80f8e7c41529ea55eae5a061ee708ca0ec8388798027e5621bac2a21a12ce290a6011c5678c0b0801", + "c8fb759986eaa695ce98654437d530cd6688272cfe451f48995dbd27551d28cf2a004f526144ebd07bbb2eaee701fa4e687a0a5da345116cbe6bd1a298a9f69200", + "0f46fed007b5e79eef13637abf0f8ac03935eb487bb6ac34ec5fad79c31cceca4962a08ed34e8bea3548219238299bb382ab19a9c571206ac2fd52fade8eb07401", + "82823e1da544c968c5ca1949545d4e0c386312ce0ebdd7c44804b288163c8bf31cc903f40e39248adfb58b3b91d1851f98283d07085ea67447e2cddf5b2d99ce01", + "00275761cff7f37876971c4d8d21e72b6c13cca6ce5a424bca459a0147746a616a166461406e571e20ecbdd7cfcbea78756a1f741d9b236f85096ab71e0fa6e601", + "4e8861b0c4d82b8d8bb760638b33395b6552f8c4de4d6e906bd07f0f4da3d00a3b5b7c9278696fdfcaffb50a0415fa5dac6dc9718ec12123f83e89870437cf0501" + ] + }, + { + "path": "m/44'/0'/0'/0/2147483548", + "xpriv": "xprvA3ske3kxTcd8gvCEBVn6e98QHF9NPVMAfZigcr2vMimJR4TsTgoPucffcXSsEaXeWe8fvdYtdBqnjAEjmEsjf48hE7z9mcn2X9W45wYvY2x", + "xpub": "xpub6Gs73ZHrHzBRuQGhHXK71H58qGyrnx522neHRESXv4JHHro21E7eTQz9TmSfEoxyyGEFNZWYLmBwzbnS5T5kbXCmCxWfdd2Lz3djGUwv9fX", + "identifier": "2bb826880f9946a1e8e1c881f86fb07d651a4528", + "depth": 5, + "child_number": 2147483548, + "address": "18eV7TkZnHYCP32178vhmAX4uJJHj34n51", + "bitcoin_address": "14zAfFYNnLXVhTd3XZeqPmAXJnx61MNS8X", + "secret": "f080cd13387227fce2276e2128456ba407e2c377ad0b4f89e3d37c427c429de3", + "public": "026853b22ac4904bd323e38394b691fc09bdfe5f32ee5594aea55b74001e88980a", + "signatures": [ + "4222ddb4c8d4a1f57acc92e4ffcb9ac55158fc17478b3633aa5991a806cc77020e4333b4d3a97cd6faf4ef3170c61e2318e0814c3fe36a4529285e159c5a69c201", + "518428fc8bf42b95c8d920ac47f76775f8aa1baad5b77fcce3f4bda7317aa506299235117683ec09f80044a6bc97638c0cc652b1b5b6ca183c9cd00fb1f69f0c01", + "a5a2e27cb524330db78f405c6ea4d450844dd7a819448c81f2716c0a604938bc0657bed68695784cfbc6ba8bc34bdd40f59b1d953aefcf395b2649d80c87114c00", + "ec0874e98fd3ba43f67240a8b2d727a76f079f560a95b864f9a3ba94807a6534040a5a66c7da214a2035dc9656059697462cc22483fd90fa6e7642a343248a9200", + "1aa49d3202492ebc9d3bb5bd975ddfd18ac295399168bfe506a108a17d97c3b72bbea4bb7a9408d5fbd84218bf19ee0608a11349ee524e78dc23d6749efe2ba300", + "7e15363240e879107720c0ff8a8db7efca51e7728fcd679890a5214201e432b30a09962d78fd3f2f223415273c5d44facc94092ea2a90723f007b31f3c99c79000", + "9dafc0a558e385d3ffe7b109fa771646a7b18717e147bbbd38a88934d783081a51acb510fc1e9d1a118c7489118689297c7be923c9360fc97f98c084fa7ea2d401", + "32ae8658615934be6b58a18aaf6d2603a973bfd7124b1d5aa024d7ecf02e852351bee90b5108a98598ba3871277057738542c8ed09e73f90ba06783d365aee4d01", + "88538ddfd4a209a8d9a8c683e3dafef106f7d3ecc6fb2017845338fbef13331543842e62be4ad3d37047690453c88ae5a0cf029c03f6e9fcfbec42edfbe9315001", + "1abd946a75d4a91ead75b4bfa04dfcffc009e9cff0e2ecf281483aec60a20a247f23ac8daa499a433eb161ad73c8109421e38dfa9dbed32e8b343bd4ee3f72b001" + ] + }, + { + "path": "m/44'/0'/0'/0/2147483647", + "xpriv": "xprvA3ske3kxTcdD4JiDb8eqZG4MdM55HEDPp2yUDxM6j6zUoYtreG7r43rH36MVJwnZdPHo1x9Gf1oweJSZjKTovGxtP5LvLk1eiB6mC2z2Cc4", + "xpub": "xpub6Gs73ZHrHzBWGnnghABqvQ16BNuZggwFBFu52LkiHSXTgME1BoS6brAktMfbhTMUPCfQC3HzVtpGbzoRtQgiMGN4TztKaBcArMPzktDChSC", + "identifier": "1200bcbd3702e5c4698b9d9f51090aa155c051e6", + "depth": 5, + "child_number": 2147483647, + "address": "2JatuRBuxcpRbw9DRGFwgKBvdC4QVE38qk2", + "bitcoin_address": "12eC3gNZRtPTk4vd6yVHxsqS7XaYv7qgZR", + "secret": "749aea338e40cee8140b3b926b5159e9480bea522c8e007c6886bfd5820061ea", + "public": "0299b748cee8d69924bb79df20f6d9c4345ef880e0f7794d6e6db578417371cbca", + "signatures": [ + "18a3f0ccd93cc59081bc4cbd7eafc20defe429bbbbb9fbb3963d29ea3b1eae1f074a725d09f9e7f43c862cc3081d0d8e89157776c04e7a4637ca9e48c7b60ec001", + "388e6011005b1418f2fff3ad35ee5e7db92d6e42b28ccafe5e51d06334883a2b5522f85ae3c78df499c69e36dfcb3bc862bdf655ae14b8076a4de2c45e954f0d01", + "cb2a830d76c8e4b6baee3652f2d66b80e1162befa742ad8351fa6baab5341f66405efb0d1d06d136035142d5d028e3b82c70a96455a60aeec66ca2875aa4309600", + "5e6a567a87938cbfcf92fb623626deabc135b4073c7171dbeeb3a8a595901b3b52b01baea121b06f2e536971a435faca63ad40eb9deac26e787d1293f836a67800", + "fa4409981808850b3ffed571d9b5994be31ea11ace4e33362693fb686cc963881d1a703aee71f6d4d2ffde4b0a3e42532ca4fdacbc582da28b6b742f64c469c100", + "54b3f74d6875036dfbfb1eb48cc4eb769c59bf141c71983e5a21124b870c6a783e372806c19c61b781dc9d735b5525e365b8469040003aae89bdc1f3bcf77ac101", + "4da9dacc842f789b6ea7a12b9a2cb7317d610e77786360647945b29927b07c1f34991c4cffe53010f470c37eb267ce470b4f1e118fdf1d37ee4620366ab4a63901", + "2f5cb0678372198ddff1ef4d3b42b644f457814e1d5c2a664209725143f9a61c48e86223003146f0d38abaadf09bb56b43d0f04edb7743d99b72a42d15e267b800", + "a3c853ac8e20d77cbf8c584c612c722c66b67b2b080fd1a65ab9bd8648eb77c047be072d23bab8d3183b7376928b761f418d6dc14d703c9ef74bc508d5f02c7901", + "1179c6dd84b39f98b079686100f9dd22c6cb8c9be2ab9498fd3d43f58047d5c53e58858a583065a2a5b2e028a1d7b5ff0d61520eb20fde9d78143e2c8250df0500" + ] + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0007.golden b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0007.golden new file mode 100644 index 00000000..59b105a6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0007.golden @@ -0,0 +1,233 @@ +{ + "seed": "zvlj08VEYR+WAKhGKWSIzXvI4kYdyEkDerOUA6wpW/k6hdNy4aaLimJ8RmUzUCJVHwaZO0jxIB+5KkmEts2usw==", + "base_path": "m/44'/0'/0'/0", + "child_numbers": [ + 0, + 1, + 2, + 3, + 4, + 100, + 1024, + 2147483548, + 2147483647 + ], + "keys": [ + { + "path": "m/44'/0'/0'/0/0", + "xpriv": "xprvA36SKN3dXZZ56EF4htbFGb2AeDdGwo7f4rzqwGtqUjKbD3Y8Rs24eaViCeQ5KoME5dCKJmM53hm5Zee9Y1BWK8NDkxyhDUFnmoRkWeDoij9", + "xpub": "xpub6G5nisaXMw7NJiKXov8FdixuCFTmMFqWS5vSjfJT34ra5qsGyQLKCNpC3vhMaBYDG39wR5zDnQYxQ6ozTv3FgZnBmnyMB5PSwncxzoVM3sJ", + "identifier": "85c54b21bf861e041248d0dd1bb90820d98e4d1a", + "depth": 5, + "child_number": 0, + "address": "yaSgtpLMYd5mzJqDk7UkGMTf6AcSmAWiza", + "bitcoin_address": "1DCKDhtfmxq94WWkTQVbzyTBvu1HDNvLTj", + "secret": "64be0f848111158a76926ffb2ff5bc567cd38f736cff5e9e9f38515c1b886583", + "public": "030baa2ae103ef794c6a17fdbdd7c857e47a21da8603c84bde57564b4c70389235", + "signatures": [ + "ae2e6861f69f3b20fbeda6803aed5f8477a3199574072b8217f77720ba8984777f0cdce63f5d850f6977390f8a565b2e2d5ec17207032a265e687c458d191d2e00", + "46fe1471b269064c1a7179996f8c7027ae3f57e4cefa0bd7e1119c573ec7f3f9226dc51bb4b47ac7cfbb3f63c9c02db728987f368924d3986c2481428c1e3c4d01", + "b907d1246631153ff98218f8ffcfdbe3f5f402a66aa76c2dabd519721a76f2f41d5f2d655320e97fcf1a41353f02d1797bcb9b3a32187d64eee09711354a347a01", + "c9ca5dc9b86aa631d703ebf5992a68804dd8ba2a7b0c9c0306da0fd85c2452310a6e024a39021140c575c04c0353e217206e8808cf7b6b6f3467ab82444dd25201", + "792012aa3c5f767c463645c3755f8260500a9612047a53600c00092d5059704901997c314d3a55f50e64c9fdb3715c1501b99be1887438c7e10314785233fdd401", + "2212ef8f4a163edc76abc76bc7df30a125efcbf6d8d63046ed4d0a8b8fbf0b1f1b841a94faf6dce43151b67c1cf8105eb3548524f62738c6d5d04da0f0c80a0e00", + "694a0f4f884fdfaac2673c3a7ec49dfa03ce53dfc997ddb1239e71a1e8d0e8042b80eb582fdb2f8f66746ba4f7014b8dc2bba2f1f164c8805c61615048c990bd00", + "35d2b0ac99c0aafd0489f1ac1d5625757c33164e2e6422106608ff8c7b29ec6a39d889601bc1131fe886a161632bfe2098719bb25211ba95da277573a0bb7c6800", + "46e28cd8943120fd064d72b19223bcf7c4e5147b874bba9d76e579682f4d21d50a5491306c1f8adfa7216ddebb84ab603b42f06c5279e82425c723b9794da91d00", + "2d5a3ec04d2d0e29dde337e7be325ace2707757e337c7e4d290ad512f5a5eff8197a445679e691b0123aeedc9cf1139fd770e24dfa20c5b3d97d849b1990085301" + ] + }, + { + "path": "m/44'/0'/0'/0/1", + "xpriv": "xprvA36SKN3dXZZ578rQzf2AxU7ofvSMttLghRFuDu7vFC2s8Lma5n8iUyDTDffyoGdGL4wkQYWJdczQLfdwER5r9rKp8kuVy8sa9MvEMgexnQN", + "xpub": "xpub6G5nisaXMw7NKcvt6gZBKc4YDxGrJM4Y4eBW2HXXoXZr196idKSy2mXw4y1rVJg8tn19QMCZq2itYuox8pUDtYUMxuyqgz8nkjX2spJ6srK", + "identifier": "ab2f8aef674f93333689c7c6fed5b98c37f7d670", + "depth": 5, + "child_number": 1, + "address": "h6zQwEN5Lc4qjWat5mt4f1T81fBM2W9L5d", + "bitcoin_address": "1Gc9W8UEnbTUutr53teGRM7UmMGm2QdraJ", + "secret": "a32a0b77820cbb5222ef74dff39d95dbb74eb40e4cd0bfc419b0fc17f1e3887d", + "public": "03d3ac17e2629c0976575f76c7257609eb02b0f3b61639e73b125a2c930a77daa6", + "signatures": [ + "8248e6dff8ceeb9424b58852991e1645a4d369b05e3df3266155a9217845c4944e4acea9efbcca76d6a902bbd9eb902f72dc892f0637a99218db5bde879c39ce01", + "5d015559999621ab5b06e7cee281fdc36d4172518b0be09a971e4754e4ec08776810d1cb43f4f6933a1f75c332f6d0bb6c37bfd8702123ee7290d8a96d76a89200", + "cc1dcfb5ab1442a6aa682f2c0c6a013f819403d78fbbaed8d97889565af7794f7592a35321dd8c5a79f7737fb46ca9eb74a029d6a3135ccda157c392051ba21e00", + "06c496ed3435da2da30adc5b746c8a081adce7a8b9e34e0cc8a9feac5fbf9ec720cbbfa38dc85df107a1876791ba386e6299ef8cdeb208fc801d2ed15d99b12301", + "8257ed264fdbe5d1c5707a01ab2adbd755e7f1b41f1312e4897147b4bf020c280253881d3586c981e5d0d16aeb3262fb1345e3cfffe2aae45b120499cff7f72200", + "75bb1c6b007c652a19e621d4f91b46d14a92f71786ae02e11571cfaf310a7a376ce301685c0be5457297dd988fcccc692ce0d40966ea144f0999b25844ad3a2e00", + "88a89e4904c48e3875c1c919fa6270db45130bddb5046f4de10644e764b849d81e367599487ea59acac9610e67bcc79fd3be602fb9445084bb1eac69148da21e00", + "65d7e15c2a9bc9d975fea59dad15352049b020039ae9aeb90df41ee70e7f2d4a0c9038fccd55788efa2f235b1481d9768c25e97e2797baf6f0146dc3f1c5c8f101", + "230895aff0622b60f2efe5d11fece62cc5dfae03b99dce4f0f5e811759afbc07523eccadaa3aa4b0cf7c162c4bf8a1a4896cf4b8332951dc76ef17abc3c0b32201", + "ef66f4d53e8a5144c563e131075c25a04ccbb90fa3a2e00a2fa969469804d1e63f1fb0ab7ecf89749b4530b3e760df11393009bfaff34636460eada2c87e0f9300" + ] + }, + { + "path": "m/44'/0'/0'/0/2", + "xpriv": "xprvA36SKN3dXZZ5C6i1AUPTzJ1dQj89dAvAYXj5tDxHj2ypewHxvNajT7VRBmh5zDUDpmZ3Go1xkRQ8oeE8hKpQMCRiN6nVWPAyieWEZeHZrxP", + "xpub": "xpub6G5nisaXMw7NQanUGVvUMRxMxkxe2de1ukeggcMuHNWoXjd7Tutyzuou34ca8XcQGbbpJdNQoaHgaM1MXWpTMdqdGewtoK4qqMZRay34qzN", + "identifier": "c15e3e18be167abeaf058d05d306e8caddb0b5a0", + "depth": 5, + "child_number": 2, + "address": "22Dy3CYVAVjsxrKfaSRiLdYF1YcfPEzUsWw", + "bitcoin_address": "1JdSK7U3CvrEG6qykx8GtezqKGtfNBeu6g", + "secret": "a23a41f2307d18e9f26ddca64857929b27c3a3aa656d593ddf55980c63bca48a", + "public": "039b5ba2c172368c94ec9ccaa95d6ef21ba58fa634ca166eb025da0a80cc2b7049", + "signatures": [ + "11b7870815c2d923afdbe0bc188892dae43245c14167c29c27204ebe2bf41e2a70c0b33137b9eb31ae5b225377c2c0e447ed171600b5b7e22e44f8b544ae2b6600", + "4ce06ef06c9bc2c504f19fa7fa9ee412a033b5c17e6ecb8bd63511cfd5abffee09a11950deb1fc9116a78d8b6a4ef8d23a066a3e853d2f420f6a52fbfced871200", + "723d9e20fe6269abc8a4efbe83851cff7d4d8ad25e9dc6f54692e28b46c961451b8e071dce1e25090119e69098a82e61160c36a0044ff9bb7848d296e6a45c0500", + "9369245343725ef3f372e6fe6bfcb14cf980fa658da57fde467dc18f8b5da2753e611642d6523e31d810bc9deedebd7e23c276b866c5cbdb0a8f212f216c3ce600", + "7a315c1620b878e488dba804ae50fe69c3d9b91825b05080ae89080715fd70976d4644f73629392a1c9378b08a2b9898f845255777783d3a097b7aeaecba2c1f01", + "6d64a01666c4ece9fdd20154ce033dfbea84ce0bd311812dcf27adceb2044b5c77cc0dbf8ec72bb3e1662b59cf40ae7070faf38139bed246e34c3423883b915400", + "35dc0231b6337fb3e5f450bfbe82799fda44fde1714c20236d34a814d8f0388a13bc101bd53491ad6e2bd41ff3a39e0c4aaca5f8cc8685056c99b72fe3a11b9b01", + "f5be29fb9d8dbc29767127c5ef71e3a59b0c05c84c5f5392dabff9430377588018f63d772573ce5342e47bd5b5096ddcde103c4c1023ceb314b06072ad25354a00", + "f289f20ef5d6ec0e9acc2f58db78477cd9649338d0389f9374303bf75f628adb202cea2dab29c8475035c5bae2416b89e71400e1b63b83974179f6420e6a05d700", + "dd9b1f1b11c6a29b04d24aa9f68bf9b25cf21d04d48ff3a785d71a73b84676262d351c84d7e70700c3c876b66a157980f73da3feeaa725b94b144928d2d3b66701" + ] + }, + { + "path": "m/44'/0'/0'/0/3", + "xpriv": "xprvA36SKN3dXZZ5CaFsiNyiNZDAWHCD1XijgYyPUYcSU38Wk9HFk6oTdehVaDszELGt2u9ZxFd4cLekHCgY2Kb61YMfZVdQKVBPMzSAABB4zn9", + "xpub": "xpub6G5nisaXMw7NR4LLpQWijh9u4K2hQzSb3mtzGw242NfVcwcQHe7iBT1yRWqETv3m38oQxkRvUCyybo8EfSkm69vNkYg1QRdUHKuQ6w7LyfV", + "identifier": "b5f64d9e2075154ed2f7cbdc976e69eccc3a6e3a", + "depth": 5, + "child_number": 3, + "address": "2E2QQPR5ZmFaKFZP8rvibJmquRPBwTwxQFd", + "bitcoin_address": "1Hb8NAhdHwSiLhoUb5TVUYnUwUSQnCF7G3", + "secret": "6202419dccbad7368b29e0862c5f1d7d18820cc7ba9262dd949fdddd061f7e69", + "public": "035f22cb7b8dae0ea3419f66df05aab375c42cace1ca3e785f5b305f07400243f8", + "signatures": [ + "ed750c25e28f4caad0ece22f6b48163df00834894756bd1498191591aafab8cf513e9cfc06c85b81353d74a2ee00d7f18a5ac0e13fb9240dcafcc1ecbf07e61501", + "1baa492d0d2929c32843e4eb1a396e3f3d21957b7d8f3952420d6ab4d73f466165fc1fd41247c73952e21c62596ae519fc5a4e8bc183ee08103f5c7d76bb4ca600", + "1bcda28e0164653841fba9ba72f3516866976390ae5fbb3c41a31e1e5d52f8693912c7537d68f2f09333698c3440e727a0da1ba80757a0f1f0b764523bcef21e01", + "08f7278074917c906e61880b5d50f186d1bc5f80984a39531d0d37c002d858176e1ecac7cefcc72da4ea634a97e64898437a905eaac1f0f82871cf02711be4aa00", + "0b77d2cae7669ea1c1b9012bfbae2665a8fdd0cafc5cb181b5e1a51895a9ebb31f73d994049da7779368cfff21a25d69745dab98ad2c3a751df872b298dc48fa00", + "d4a1b80939238fb1219fb18a467e835eb1a8bce03b86c593e6ee9c0ccbdbad5c3f4ee89b3fb4174d6e8031811529017490e96d663d79eb5c584d697bfe21e79400", + "3c241111843434352beabedb4b22e812a160ac8db6f7a6dfa5e930692f51bd0f2f3f12fd65b34c41658b82f0e9496abbb7f80b34249ab8931f329632e44daab601", + "cacbd9c16a8f8e6af585e24619ac6bb938030202649be3f99268bbdecb40ed845f894168bbcae6ed3910eacb962339b90ebe60ec4718e7ee9e225b66aae19a7401", + "1c130ab8a0b088c8fd336eadcf584b21289c9272557e9efbdc536d62d587d4e441e7d641ec99cab855a93e72c0dc2059e00409319bcd6df568ce582eda4ec36201", + "925221e4938f4f73b3d846d6edfb1240f43f8d32ef7b98557d3764fc9b44b1134b0c6ca11ceb6d1331410a7f060db77a929b248ebe88ecda25e96fb6526b6b4c01" + ] + }, + { + "path": "m/44'/0'/0'/0/4", + "xpriv": "xprvA36SKN3dXZZ5H4FpV613xXfDowioVdS2dbQs7zes4ytEQhMLLuH2jubuvFctv8H8j3qtJjn57w6rAnNNLzvjRJ13meTASbxYG56WHYYa6ZM", + "xpub": "xpub6G5nisaXMw7NVYLHb7Y4KfbxMyZHu69szpLTvP4UdKRDHVgUtSbHHhvPmWrRhNhHXhBMEH6gySXJvMTQCED9c2dNkXt59CavT1BmS3sryFa", + "identifier": "965e64ad95508fc97170841c20133c253a29ef07", + "depth": 5, + "child_number": 4, + "address": "24zfb5vcRf4aDzZtDNHsLx8MRhmn4YJUEhW", + "bitcoin_address": "1Ei5SLPEp9zRY4fNJLV8BtKGvYM7FyYtR7", + "secret": "22d2a270b93942de0ccc9a6ec1e972bff0eff3c4830831b837d34b2601a47a0b", + "public": "023d8910e592648d7a7dee8cd9ad381e743cdc093d8473ebc31e3255291916b436", + "signatures": [ + "c80d23f351db74e8c7fa33626ac4567ef43c221c3f1bf8a4f0d7fcd28cdf74c71fbd2c38c0ed28020086747499b990ba3658e38a7fd09a02c8b00e4df250468d01", + "129f77de0dbbbe810d2aaa90108aeccd2c3e3b3a5276c50c3f21e5b054b535432184dab8c3682f97750d5bb762009286aa0a5fa6c19eaed9a4e84c8c7abbb66301", + "2647d4cf223ff1bc72cef3f27be461994b32ed420abee5aba3987b1aae410f9b651af066942b90e1f0b86f642c0238e55e71c8979f93a83e1e127c9eecd96ba500", + "bf6a3284ead814c794a03328804810e9ce8c72cda89e4a4baef8704e16ec4ea170fa208d33994e44eb6b99447ce672511c5660bdec1144b5829188f2977d67c600", + "1ab557cfd027657d051df6e9c5d6bce61222d324ac34e157161392b5d33641f61ff0a3c95b317497f006fe1b21401247e7094ec707d86e3ffea913b45ea3067001", + "743a6453f9579df49389010757aa56c3d5820d2a2d82797e895bfd6b7756754775e76b960d08f321132d38eca7e89fc2e204c05201f9a5ceca6126e3b958054101", + "05e1751299791cb02b3e66d3965d421cb26e7f362e8522fe87ef819864d2a33700603e8cbb0381ca4272c244bea2666784e65c2dfad3123fd3a7c6b8ef83b24601", + "935cc99ae62db2082ff0e021fad8685e5a9fb2931c94cb561d514e802a715815294a5397ba76a9b6e98c6e54cdfbf6818d704b403fac528c0e6d0d565ea64f0101", + "5ffe54b7f15698a74d536a2f21cec631a099c8a684668020752138faa772864569da6ced47dcbe013f433515ccdcdc4ab987d44ad7c571a77ef3d7ac9b459c1e00", + "2bf865e15f9ac8bcdc4e8f37b2b779b8d67d111c785ea5298765652e4268f9b75360d920f017be24fb7d0800bfbb3e71f0fbfdf0ea0690e4a6188822108ac32f01" + ] + }, + { + "path": "m/44'/0'/0'/0/100", + "xpriv": "xprvA36SKN3dXZZ9VnpyRWE5ocWkjB3TpfiRyjNi4miJ6yMDM1KuvfsVy9dy3tGVLbdyhx3t2e8bhLcNokmFQeayXwxDSfofC5eXsdNAtkfutRb", + "xpub": "xpub6G5nisaXMw7SiGuSXXm6AkTVHCsxE8SHLxJJsA7ufJtCDof4UDBkWwxSu9i6xaygxpsA3oT4imP1UwcYq36NYs768cnGRUffse4nqVMiAJF", + "identifier": "81e9f0c69091b26bdab7e9cc3597218c5c65795e", + "depth": 5, + "child_number": 100, + "address": "2FJPZTBduyndudos8RVPcNUP7NeEN19TNSG", + "bitcoin_address": "1CqvRDi3nBQKJjH7m5vZRmZ8TzfEk7214p", + "secret": "e872043093d649db24be5adb03ee798ca7c8a4529adda857556546978263dde9", + "public": "031e984f536d4acf675514b6a7d113e48d023fdc8e6903002fea2de0258492fcdf", + "signatures": [ + "7888edd4201c7e50d516bf9ad0a2484dc36e0745c2992c679a76683579ddbb8e021761033b2a02eaee4a0e2e0cfa40e3a6e5b5ac183c42ceb341990d4aeae80f01", + "16c86a72d19b8b4ae86327ece22dbc8e8781c144df15cf8ee68e6fdfab8d2b5e68318d8bfa4da79feff828109d2bdd93e9f68a1f1a0200009ce1491d067ccd6400", + "87aa955c19d104d94361eb544ca1d19d5e8b4ccb9a5e6d7bebe57e49d38d5ac11d83eacfaa1a8df800899048f323517135d7859fb61c64c7157cf4d4f1f4432b00", + "702fc5f299af68132ba5ba150061bda5c3bb7f97d1f6332c608fa243eb0d49507a6b363f17de706809e0e9b501ad06cf2f1150a315a36d2f702ae50335c0e1c300", + "5968377134bfe1a3cdd837c02ab430523287f47e295537beb1127da98277baef437ba19933294e2430fd58e4b42bd22e04c3d2a77f0e16707cafa5ffc6e47d4a00", + "d1fcbb01bbe266c647ec1e3f91f66983cba70c5c1d497ad721e546dfa8b7ede00ea92a7043069a5fcc8fbb14ba96b1474ea6659260f6c7c9d8657bbf0f7fef8d00", + "b02e170a4196c55ae521187b7a23e24a232585186aa2eaeae39bcad42958aa882ad4caa701aecf89f91911ff1a14d1327cb1e0ea11aa9271b07b48e41ef47f0300", + "6b600587a4f1356e66938678d9fbde994c10f36a92a1c2ed1b1a4ef22d24b99a62bddaa80667cc4a0149b0992b564fe43ab6524df6937c10334ce39ffab33e7001", + "2bb000bf5071d1dc374b56fb4672b5629181ac86a80707151094815b56a992313181c8482738a324b2a1d900f834e763527c4638df11aafe6f84b73c15fa385d00", + "17688109a3dcdc2ba72ffd2c25cf609d08650762152d569679ad333c0ad802901055cb23786a02726179bcdc704ccaa42e0e00b859b31fc6675bef60968123aa01" + ] + }, + { + "path": "m/44'/0'/0'/0/1024", + "xpriv": "xprvA36SKN3dXZZr5rrGqcxAKegKFiySa7sQYEk1ZYRAxbLih1w5csoYNwh3nrcagiFV4FBxP75XFnaobw3mw7eDY8heGHakpwbxXqKqfZ9bWnm", + "xpub": "xpub6G5nisaXMw89JLvjweVAgnd3okovyabFuTfcMvpnWvshZpGEAR7nvk1Xe7avFSWWSc5KdLsPPcayEJV5NMSVn6RfTBtCai86M3HxyFmqrup", + "identifier": "a5be07cbed614ed137e1ab3f79f4e1e395453534", + "depth": 5, + "child_number": 1024, + "address": "2fvLV4QM1gsRWHG8LsDGTye3hWbv6eYWPH", + "bitcoin_address": "1G7N9CaExgLC1E3Yr6y99qrnheLE4vF8HZ", + "secret": "af05a28f240b790d0a2e0b3fd3a864d1a91e6a854a8bf671debc53dda8546419", + "public": "02a73c78801e3056b83a5a75e7d13bcd49d5ed4c1952e4b010010f03912578462f", + "signatures": [ + "68b881e663c25e80e26e8c30e349a28a4eb1f15b9ab45055bb72a6cdbbf6929c7c9f80bdc44def0810979b9eff6dddf2bdc40399d3e729f2530245a59b97a56c00", + "b820055de945b3aa08098f483fd8882813226cc49504db2586d153e3dc2c46f21c42aca0389351db531220ccb3e741efcc03031c272b24857aa093bd35223e2c01", + "1df1a4a74896bfa01c0f91cf8da52ca0d634d8516e7128013bb2cf71d7aab484080d5c50b7d12a4674e5ddaa9372064ebc303f46c2b3f6ebc42ea09889aaf89900", + "e9f26497605e201b13e616aa7577f70b5c3da3410656ac9496526810003d273941ab74b11e57f3b19c48149ec4046493c0fa2cc2de178fa78bb85f93c395b9bc01", + "51346b2aab4108b41f3edfc3e10137b5fbd4ab8b308576e77ceacedc876af09c19413ebc53c9a71cb0d71755bc776b7e9d33c53d6ae4537a5b9016dcbc747ed000", + "bb6123caa1ea40cc29f956f2387eeac14e18b97fb06f2b665d4bc82716ab56625e1b97e0dd2ae4c83e092f1abdbcbe5ad30ae9d693a1a8f3296e2e17048963e800", + "f5d2869eb7aab39715a1f83f8b807505bb0ef552423e96c4318ba9cb9e4cf3112dd4adf40e51eb3dad5b5f2a9afbe35dfa3779442a37971e646b351b4bf3ff4300", + "cc1b72f6aebb57ca0ced63d36c477cb5fa6ec49b7f8d66fc42f6752d0b53e47a1ccd1a608d0b93ffaae16fa45ab7e11550bd5d48af5b1bd3955360e77f2fb3de00", + "2f951940c8b831b75faea9974ff8ffe6881528fc138ec823939483cecb0a12943f36b690bb04ae142d332ec06787da03943a9f6bf34d693e2e27090bdfdd2e8701", + "395eca1f2c4ad09f52b10c2b2021a28cfd0d28379c5fb06907796666cbefa0ed133b368fad09823fc4f57612e967856a63138fa8d504097f28e8b63c58a576b300" + ] + }, + { + "path": "m/44'/0'/0'/0/2147483548", + "xpriv": "xprvA36SKN3msE5xsSYdt83qJv8MBVktQqEff9oZ9JHbDxyhxUtStX9Rw3rppmQHo8xatgkr5aobDXa45LkBdAJmSgQb7DADpCeEqqLkxr9X2om", + "xpub": "xpub6G5nisafhbeG5vd6z9aqg455jXbNpHxX2Nj9wghCnJWgqHDbS4TgUrBJg5Xu3WRsVL5w24jokNb8RpCRabhcyUVJ91WsWrcHyKsgbGButva", + "identifier": "ddecc92d14294885d3b62a5b83006b71da75fa91", + "depth": 5, + "child_number": 2147483548, + "address": "kc2jKoqPfrsDG5sdJ38VtxiEXrzQxGnFZs", + "bitcoin_address": "1MERzZgGRLfTSibQZrvzzw4WeGeQ7bRvzQ", + "secret": "1ecca2ba397754b6e0ebe8ec48b46f55ea63b33ffe2a9fce2e60f36870f2eb8c", + "public": "03b726c46139741c19757c9447da0465976c9dd98dc3a4137a0ab209868ebd9cf2", + "signatures": [ + "e93e3d8cfcda69a92b15f6d47b66af2518c3f15e21035371736dc140dc724b723d2aa447ff8b10f02dcc701d8a999945786420bca244fc506e9db6df5fd5575401", + "fb09024f53658c78218225e2232e67ed930edbc40aa275358f330fd9dec2342967e882f386eccffa52016d34c9dadec040632243385af5e0dff3d3b3cc7c6bd201", + "5e94f85e9f7add65978ed662750931e1a5460f5efd493ab337c5b143dbc06df805c852f4e4e968bf9e7e408c2dd650acea89ae0a8259c07ba8ddf6653ec9296b01", + "15338fa498d968b26a7954fd31494edee46d556c0715da39a729f434aa9068e01d13eba4a7244b6d3cdca0cd9c00428efc15c20c14f661f437987dd764bae25c00", + "7d85634d72135f52572eb94d48cdb3ae8fd069390e8a823e462314abcc545e68211dab9e2c67d02dd9ac16fb70d9b0d0fe421c2a4b7951691cc4c7620a2e192100", + "ed4f5ea73f06b7f690f74a6b65cd3205559754ba10db89935bfde2245904c66046d14174518f692390be5c0c299da933f606e26f6d6c86d2665b014e3d21401f00", + "eea1e2320e7524009595f17837944dbe51e8ee4bf88b13e5237d97e82baff108774c66d5048bca55fa7cec9cda732722207eaf87ced7d520be4afeaca1aa4e4701", + "f866fbfc1d88f039d804773304e7063b7c6ba8ba2146924f2f9f2d25f65f9b4f595777296b626ac833b9b7237861644921d4bad67aa77047b3d077de3dd379da01", + "469d6f529d4c5db3ff45f7e4270aa888551f5816c33ec8279058b2de6dc49c9b39f1d1ac80edba63eb0f519f808f06536414c727a6a87da8acdbcfbe072d8ce001", + "efcba60fcd06fa5e2df9f18426af7a4068fc1eff10217a528fa678031510404a6703ef80e805df7af869b227739d80af81c6b7ecd72461fded4244cc30f3fa0c00" + ] + }, + { + "path": "m/44'/0'/0'/0/2147483647", + "xpriv": "xprvA36SKN3msE63EF5qh23NaBa3YF3vQNHzKNxs1S7UMpKCBY5d8XoP3KbFoffT8wR4kuVHVH7BMrP4UWLbhwxyG8a1yEFVyVkMxBtNj2ArRJ9", + "xpub": "xpub6G5nisafhbeLSjAJo3aNwKWn6GtQoq1qgbtTopX5v9rB4LQmg57db7ujexCBDeAqfbimVaxCf7b67Dw1CwYMPKjFJ5G9YQSZXBGbJ4F7xqN", + "identifier": "0cd5648a22ebdb0b19bc6a582af6c3785ae77f2b", + "depth": 5, + "child_number": 2147483647, + "address": "oMwM8oqPV9iQMXVcJKSg4ERS1AXbDmgW9u", + "bitcoin_address": "12Ark6AJEihnbWJNCgGXCei5fYHZMakkh9", + "secret": "10a5ebc558c11f26cf354497156ce7221b2dce61f041c7dfe2ab2dfb14b81c2d", + "public": "02d6198f51baa8f580c5ab1f692cc5eab2e78e78b06152dd38caebae1af6db5c48", + "signatures": [ + "7d3021706c7f03484ef7d2ebb64f72b886bcbd2ffad01db8e88ec68f20a1484b2c78ced7b1c559e3ec21ad75532deffeaa5a7e27079fd418747da64f8814d1cf00", + "1a11a97a537fae4c6e41fe3fcb3651d1f0d60d36d61d7f03185eddc433c00f3c3777445c6ee415e5df81bf59e014614f88a5ca6753a0b3928fe1c4c786ca11d900", + "0cd4eae51114c1503473e41e448bd5f7439115ba8cd07007db0c67e7eb07445343748f7354abb6cb95f1559ee2e90a0d55fee9b59bc737810d9b261e4ba0b9c900", + "4d75498343b976923b35ad7f4a3a24471c84c134b78a5f65f974421dc4aca3694ca097d5e4381c57c6e918a80a9147c5615c929d0741133fe4c8d0d528f2789001", + "8d3e6e24f4663dd754e4cfd40b99c6ed703acaec5812a7fbc39a4c12f56d657539d65dab36176a058acae3e767f02f221229d9a230f8a62a83e7df004df323bf00", + "e00bc1d700b80c41770b692644cda8eda56fad2fe9a11af08a1b6f58c58ce9fc3d491e754f76bfbd5b315c3f034b8ab0621eb0322e700c9b3497137e14e4c51600", + "664602c3c2176eaa1b216c7b2f79a7340d5439f0f79cadea686b1859d16b85d13ec3be26c8383e18ea8fff39a1dbf71ea98b89bd9efbcd2dcc20a70ff762643701", + "b4ecd6481452d09e08c9f86b7a447114dcbd54be4f20156d6cdf6fa7f5dcf29c010d8b27ff22225bdf89151eb43ea62db46aa79a2fb6a39acad05af1435805b701", + "ed215fa63e85c11625cd25a980813b13787872ce938b9317a0026a903a5651cf61f181abba4639abf3cf09442b43e25549833fb1cc53e36ff9bcac01bc40f80801", + "484338e0ecd1aa2bd83c0b104993617bc22eca40375330a64d513b5d07f4b97c2b827bcf5f0c97c2cbdc505ad242a50d84129df358b32f0c260e6abd8b5adbd501" + ] + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0008.golden b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0008.golden new file mode 100644 index 00000000..d93b6ba5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0008.golden @@ -0,0 +1,233 @@ +{ + "seed": "nHWmElaBKmYqH+jR4NdOBArvxqs87xM58UsUcEDbBBw=", + "base_path": "m/44'/0'/0'/0", + "child_numbers": [ + 0, + 1, + 2, + 3, + 4, + 100, + 1024, + 2147483548, + 2147483647 + ], + "keys": [ + { + "path": "m/44'/0'/0'/0/0", + "xpriv": "xprvA2pXopDD7PUbN3BHKXP5fSTB6A86JAT1m42CTrUbEsRDLQnMnFLdMinM1MPg6ppV2vcHPm9vbQytujqCD5upLyKvqFu5nQf5fbKJL1v7yNi", + "xpub": "xpub6FotDKk6wm2taXFkRYv62aPueBxahdAs8GwoGEtCoCxCDD7WKnesuX6preNGY1FvTCPiBagHSJQYXobVvDviVc75nMZguD2w7rgHbh45prZ", + "identifier": "fab50406299adc01bf4c7213a928db4feefb8780", + "depth": 5, + "child_number": 0, + "address": "TqdqsoxpBcMdeh1AZmHZAiF9cE58kDKbgv", + "bitcoin_address": "1Prcn9iToif1KegfM1a3NT81CNjr1chADu", + "secret": "93c5de921924b273c1c8bb2a852c85a0ab4b4e2c5a8d50173133e63fe1d9235a", + "public": "0393f621e6b4a650d6c506e2453839a5479220750c82b694b79388d1719bddcd43", + "signatures": [ + "2d286b10c27c2680b835b8426d994cca0f1a39385c0742eb6666b4daf1318ef67992de4ca699c7d0ddb9849d30082b479a60fbd09c1056fbe863ea0eecf03fc000", + "ae3aac7e46ec47053d9b0e57081e4a3ec216e48eb9507a59088532ccab2ead8d046312e031d3805c995b8e1d57c4ee9f5548a5ede1a73e738d3ad6b3c16c8c5700", + "19b1507a7561d2e21372f60db56e44725fc908dc8f0f9f681a927d68fbf8f8ff113916b05891b328c04e9ededd6345c52faaa37f766e6e9bc4c07daa25da573a00", + "ba679afd2fd61833d19d2dcc12cf3c5684288ad86a8c05899e774d4ba84f055a7982867106a99b28d77846af3c81e8f5f9459024dd0b9001cf3684b40eebf3df01", + "349ec6a71395c1763ff4bf5379d78b32af681672f3d8cb28d7a5fb69c0472e181dccd90ef8d80e2c090ffd82b1319dffea3af7c8ed71f738813e00b2e69dd6a701", + "d8b8d0cadc3f724c209db34d3ad48cfb4e8e9a506e8a16c69a91782440237f594891bc7635911d7f9b64338bcb87d8968c26c7d07d9bf6b71d84b3d0e72e719001", + "8b281b8ab4e0d9814f4af77c8e4a683ee9b4469977219160c7d8d6ead1d528ed728b177ba72331f7be191d12659b2256dca6871862a2fce1f456353b54e5726b01", + "56910275de01632dccdc8f7fcd511a035b93a0ea40ee3c960a6aa02e3e50122a0e24b4fb112a2d9cf53ebaf967c9649ace51d5b8588ce05f815034a0d4f7100d00", + "17e98213da8a2ca177634e20b9551e4b2cd831d62cc0001613cc6e5b3168ae092d6085e441147008935dfc743764d8315b79a50653d4a6871eb60a94a93d3c6c01", + "b6e176dfe29dd5b046b53a5bda8db08ae79d2b7d155c77f144dbdfa81cb9907d10453473249406e4067ed23a1ecf787e5a93a89260dc8f28a2e2559fdd5cc98101" + ] + }, + { + "path": "m/44'/0'/0'/0/1", + "xpriv": "xprvA2pXopDD7PUbQpsbg9eNjtEnsHWsCqcuJG1YvenDPHToFoE3tVTH9VmmiRNutw1cWqKdTadhz7rpYRiUBkZTC8Moq71L97k9xPS9QYUr3ad", + "xpub": "xpub6FotDKk6wm2tdJx4nBBP72BXRKMMcJLkfUw9j3Bpwczn8bZCS2mXhJ6FZhXECd3Y5GNeZZc4RX6BTw923jV8dPVS5FNELFwTRBixw4HtU6u", + "identifier": "a96bc332ca5d782f2fffc07c0f027b898eac57b2", + "depth": 5, + "child_number": 1, + "address": "5AM94DUGV5EdCD9DZSZdjDKbb3qntYJJnn", + "bitcoin_address": "1GSpHtYVMt9Z37t5magUMFmj9JC2PxK9tr", + "secret": "9b2a1fa82b9777c37c94e6fdd45d4ff0867074becce18fcc0ce8462d357c5126", + "public": "032dbb551459b62da261a484811c463bb7e91d1cf40460e3dac74df282d44c4b0a", + "signatures": [ + "ed1e043460c8e02d010717ff6f37609f53718459bb9949669d07ca849270c55e1bf3471a9b03b9137cdf71f7306f2f1b7a43a98915cb8a694a88d38e5a7d114101", + "e0564265d563770bc70f89c83e8d69588c9d7add30ed8735563af4e866999fd47f50560e59f889f4895b7de788da08c42b787480e78c0e1a00dcaa53006185cf01", + "12c489523fd28ceb4f8a95834002c8ee6b0034ea79bd5fb6704eec42385de9e13b0f4de671cc587a2aee534ef61ef251599df4eb7f8c9130b8f1e8093b71fe5f01", + "7f7d78519769a9aeb506062f08af3e82b051a1969b4d68ce4d2033b3ccfcf75a6e146f650e62172720ebc0896a8bbb00c01075993da5b48f456956e5cd815b1300", + "7965a268ae9f6e1ba388488511cd7e984b661a70777c0bf6c7456b41167a24a00d9c44b1995cd4d9a9f405e79ef6e9b72d68c1639efb9197fa9ea09ee56b586701", + "562944d11309059dfa6613344484331550747f1b09c2df15aec2723b575f5af91a280eab71be9efbcd4f5c968d6de4debaf36f2e4982cb1b0646ba12f023e51400", + "893c520478f042a957ad5c099c99ed8f28b4139603d3d48caeb569def8f641f53b14dce5424bed587cdb5183590477edf16b72b5d7f573031f3839f30472b7c301", + "26bd42cafff01e71a03f986c3908399266b67641ad2ed451b18cc9bc69b0432d73ba9265c415fbde8f925ee913002c0695cfd041001e26923fa677a1d5ba856700", + "83408f4bb423c82effea6e848aad1dc4b72037f05fdc32717f84e5cbcc6d139e48f46b63709ad64d4b5d90be88f3a7680da6b3438a078e5decd132431279d69001", + "cf2416d725b4d03b9481028784e539a57fb2316fa1a8ddc938f2717b524f7ea77264ac7f1adcf3eee8de5c5918079593e615c38a61d40fe6de89a44d798616ca01" + ] + }, + { + "path": "m/44'/0'/0'/0/2", + "xpriv": "xprvA2pXopDD7PUbSHkEDXaq1PVJMyaYidocMWTqsLCvxFsZq6UG86RiR49V9kJm6fyAHDBBV8gmE1qH1ZUwGKjf7oQzhr7A94iZfKx6ZKZPFDg", + "xpub": "xpub6FotDKk6wm2temphKZ7qNXS2v1R386XTijPSficYWbQYhtoQfdjxxrTy12AXGPi9NHMtxoQDfkpWSbBcTZJ2NVg7YYzrXiQZACaax6LLgFy", + "identifier": "ca5a5e74565b2cc11e5910b60947642aaffab324", + "depth": 5, + "child_number": 2, + "address": "2iWWUMZtEqXMhd8hwEVL1thqUMwJZnTtUPa", + "bitcoin_address": "1KSwkhL9miH97Qg2gh98j2kt3h1W7DRbzF", + "secret": "84d6bd376b119b4c487f2c534239c28d2bb2bc0f0a703c46cad2f1d0a5ed8e0b", + "public": "02f1d165488990533211bf90a0ceea782559c555012f947524ef1f8aa76e3de4c7", + "signatures": [ + "ec7517c6986865267288498a75e25e0d928d51792563458222daa35106aa4a8212eb7d84e9030773b2be265ff2c60f45bf3cc5aafa5c5b17ef0adbe6da4da86700", + "a6dbb94ed5a611f6354a6ce8305ed8b2483eb7d7c383d55098003d30632a58f1281a655bf3586ab85a6a81b71e21bab06208d448e095ff471f50dd3da2c2757601", + "cef2819bcb5114baa09e878876e7e78299e845aba1db7b48fd62945ca1813fc8064b733e3dac9af20ddffb10ebb4278ba62fcaaf7238ff1bb58266a5a0f5402d01", + "3b204db561b8babe97bd5558ca922e25269fab7dcc20ed030d0e3e9e3aed7bac71ceb1deb9360788e4e7450b1969734d601eaa7f1eb95c98562137eee7d2bc7800", + "88dc45af941a7d2a95728df4ad19f4c3ebe336462cf89cce88c0dfdd90794e63415d50d87525a6a1c37a178be4bd980c0e0016f8830dd20cd063e152d1e71f9200", + "a6e1769716670f9ca1068ad886d29fd4b0a4beed5df59a0a196a68adfabfeef56d36e358ad16eef91f4c0e42a9846d1e7defc4b90fb9394ad00a3463a0945a9e01", + "7faa0b00d510581a7f033cbe67df4bc35d5ab84b7a889cd8d6d05af040050dc34faa313795693f6f1e5b9cdb467c2265f73166c725ddd99ca7e238001fb07f0e01", + "6cb7e096f3becfbfe0ae5b7bd8819ea44b6b3eab1b58fd2e061f8154a176ead12734b5ba6db0e0890b1b4e33cf01846ee2afbf7512ffe45c2f8da7d1f3b3637801", + "d319990859e3bbc428025d1945522105bc4c7eb00df15f5037daf68b91e935115f33445c0e13cd1d78ca9a2f96e21f5dd8a2d544049ed666c5bea442506cf8d701", + "3b01502e91da42e53eab14a356162b0b765e7c7cc10b2a41d5c8dfb44075e192478757306af98e1e1a44c2e110eb21e59838a0a875eec402e3fe9f09395fbd9501" + ] + }, + { + "path": "m/44'/0'/0'/0/3", + "xpriv": "xprvA2pXopDD7PUbUPzRVG3vjkWs7bdzwT5JvVi3khGh9R63tEsgBGMbsoyDQwkhtajWadgx5Jw85LjKHLAfPZLTKwQdtDXpvB2oYteJEmcNQhw", + "xpub": "xpub6FotDKk6wm2tgt4tbHaw6tTbfdUVLuoAHideZ5gJhkd2m3CpiofrRcHhGDB9GghQufCCRozLHnKjHno27JBCV3WMTivzmnBBTBMCdWURgsK", + "identifier": "91fe12a6ad44fde230e26eb5cf25b1a735db9b7c", + "depth": 5, + "child_number": 3, + "address": "wcXaUmVijU2NweTprXDWw4xW4Ypy3SFYT7", + "bitcoin_address": "1EJwM7CfBeDPHMj8UaScQVRW13EwjatSsZ", + "secret": "e33ceb092795e1ca4fbdca896343e73897b108ffacd642711b760bf0cc7d0ebf", + "public": "0316b74ff54c8a99a0268cc3a20c71984159bf87226a67928e481abe46ea968881", + "signatures": [ + "74e6d91632c0349608c06650a36974aca4568aad1284ba8e2697d38c9fe3b62a081f8eaced03b176412613510c34ac66575a14450e49eee41c95685c2244de9e01", + "85614aa67b1b27015c0b7bf3f50820ef13e0693efd2cf05c2a8eaaa28e96a69a4597c782cb411b0dcf667be341904bc46dbeb79b9f4234a4cb671aaf4569319b00", + "3fa82976c181200de4fd683c0a5de3d7435ac8311d26b92b159870b794b6366e33fb95037365a6b26e3773e469d8c3a42cb717d7a960c823a463a71aeb38c50201", + "0a2797595672349391b664cccb425f9665f09b6cf5079d285112cc006677d2874e3d074e708a5cac9bed2d782176802574290094f847b6b826c6de7f09ee003401", + "dda3337ae37a4b998b0a40e2c71f6580a887935c7c50e0f9c0ff7aa28eb3d32679d053683539661e342db42287b715f7942f95fc9233ebd165357513e6da5ffc00", + "ab463cea2e4e6cc1e07ca745d219babdfaaf22feba5560c15606dc9bb1c27720599ac64af0ac37f854b1c16f932cd283f0accbdb595b363c0e7913018ed23aee01", + "babfcc56a0bbef4495a3ce00fd09c707098067cc64ef09e27f0e9f911dd5ab835aae4523687682c186ca8315cf5f37645f44da82f3ad2d495002e7a1fb10814d00", + "c17f4a9d1ec093a01ce84d7aff063cd9f5a7aa4c8be5a776038f22e073e4d57d4d5607a97772e21d6a6756a99e5d1b85fcb351f71fec66e5dc047f579c233cba00", + "c5e9477d09a9182645e6b949e931208abc498ee831a9d8a1789bbae52e8a6df2767b79452113aa96bbd19dcb4f35e4550cb787b0a404452eef67fcab2e11118b00", + "34ab82ac3c865b7b2426bbdfe60142489a02e129b05bd6bc14443c6bfaa5190f659dd38bbd84fbd26497e3bebf6ad5a2f119c515fddd655c3d1ca6fcebe5419400" + ] + }, + { + "path": "m/44'/0'/0'/0/4", + "xpriv": "xprvA2pXopDD7PUbY8rvdSYb1XLyAo8HwLU3Pmc6wgvXMj29bWGsak2uS9wb7bwFk9v2HX83PcsW82iavzsVGiKMSLRqK1uV71FQa3b8DSefyx2", + "xpub": "xpub6FotDKk6wm2tkcwPjU5bNfHhipxnLoBtkzXhk5L8v4Z8UJc28HM9yxG4xrCoY8FZS32Le1rDquH7uiPwJJJWwJxaJVNRrP6dvZRsFg8Xn9v", + "identifier": "bc418bc8c364db529e22eda04e2ecb890aa86c64", + "depth": 5, + "child_number": 4, + "address": "WSetNApuhRCEn38KrT9Tyr5iu4moGp4KHL", + "bitcoin_address": "1JAQZHNa12F1g9wZQr6VHZXf8sGzsTZzCT", + "secret": "e08911a642319a4185e0b8b442c799a0b716bb29b8db97de205accd58fbed8b7", + "public": "027c22016e9d01ce4e9ab33e6a1fb8b2afd17606e4a6d57fba50149dca21a3eb14", + "signatures": [ + "848ab82159c31fd248b31da3ca57ab4af7084b0bee7e8a047126042dd540791a1e37241f09c681ec5dc05709d0725fa04d24d874f20346e969d5ecb88c349a7a01", + "35ffd3532c1310add7515093de79e7e5d62eff3a849a5a867635e676349718b547ac045cf445942da1b76d2c99b21e8241cba7cbfc17590364d02a49dedec6b501", + "2875d87fb0af2a89456f0aefd46759b0960724f5c79dc5a496880faddaeebeb4314aa8e5e618e5752567ace990dcc2f5e8c10956c0a3337066f47ef9fbb7f50001", + "773b5677af94346829f332e094777b1f6700681267e5f0305099a479b691b9e3700c43e3acf8a11c211e261599ed2e885c41635c02e7b2657f8a32617aaff21701", + "5b778d013cfb3c9e8d05ab24428084d584817baf8d23b6b147238fc40f16550011ad1a70b790d9fbb8b9d3336126ca968d04c2670bf01d9a1fdf77bb737ce48701", + "8b4daa7b3b1ecebf576f255533ab9b9afe7fd9fe1bd6305bf3ef68f6d3e80b6957ef81758bae291f16bd74f5edbe1e2f7fd00a8a17af074c37e1d9d3e85cf1e700", + "24a645417e8483aee61607835293525a23a24cadef18d9bd70b6a48c8600ffd5077d9da75d7309e569487857eebf9101d08eb94673daee27348aeeb482375c1001", + "0ac599329b8051c7cf80d0722b0037090dc5ec51cfcecc9b0b01e60e0a22ddcc249df69a19c06f7eb4f3da00bf38ad7adfc92de44f0cdefedc7330419d30f5b901", + "0bd61b6842f3d562c0f41a58d96cf8e39d0b025e92ca1606a61688bfa4f6eec44a3c31145ec53a0efc7e654d301b99de1a68d0e9420e138d9d45fa95f983fedb01", + "02245cb018f2608797c942f693bf7f1e84452912bffccb3168f70a34e54df0c91ada356f931089f1f1f31c5e44bce85c7b2dea42abcc178c71d80c169122567c00" + ] + }, + { + "path": "m/44'/0'/0'/0/100", + "xpriv": "xprvA2pXopDD7PUfjGzDG4TA5wwBPMUJo48HeEjbdGB6MtjBgnqj8r9tqKq4fZSYnWqyGC96GDtRNX7FD2GXTnTCG189AWq1nsECeF1KsWhTHXp", + "xpub": "xpub6FotDKk6wm2xwm4gN5zAT5suwPJoCWr91TfCReahvEGAZbAsgPU9P89YWrRKdXwGF3FCiDG3hfTeZrkXMTcXavKo1LeA5YMgtJr5kndwYME", + "identifier": "b2bcc35293358ae99dd840be4f1204ee02615fd1", + "depth": 5, + "child_number": 100, + "address": "mZUFtTnc2JgrW5r96Js6tB7V41VXBN56mb", + "bitcoin_address": "1HJ5QdPwHqcEekbvjeGiv1NxFC1H8F7fbF", + "secret": "e681d653c210cd5b54d112615a057ae450c01ffdbe6c4577bb90a8c874ec7542", + "public": "03e71a70a458c24304e1636a9c77dbd509c20373a32a5987495009e8ebb8a3c0d9", + "signatures": [ + "3c584158820e8637ac0cf3ec826c423bf16bb9e27486ad1767b9cc5fe148d0a7009ee1c300ab06fdfe636439ab2c69e731dc6b5b4e98329edcffb1a3f1dc45c001", + "7999c7641d7ff5bd4a11c4d1fff5249905a9d7d43295d0eb52a8777007682ce7278ce91f12fe763bdeb670ef382c60d8c8600591fee2f23809ab67c729a9157000", + "5aa47375bf3bedde4d74cd7740b9ecf5dff2d9ec8231e92810ff40d68abbf8c417d9bdbe2e2a24f3d32263fabb2b56057da82431c8354dfba57500d878409c3001", + "6e788c56822bad4419a968138bfe501ce45a2747be9806b0f054eadb2c2a2a7028e893d68a8c4230c11b00a6a8623ffa98b69769585aef69d2123752a074d52801", + "abbb60deb4ba734dfcfd2315481843211c35b85f13e955b72968f6746ee1e62170dea96826d11e9cf611a47197669567fcb44e5e7c0cdfe856c1c41ea2ae233a00", + "58f8337d845f81b90625c61ba9f06e3cf68b4a928ba649930f647283150d0cef601b90668ce20d49bc994eb6877b071eb7a2905ca82c75ce928e6873f437b16500", + "18de55e263931d5eae6ba9ddef39ff4b9b6e8c60b9ef47682cc0fe99c1c9cf1d4cfa0fac94711fbacb9071d2396d8f0c2f4dbdccd3e0d4196dbbb4a1a1936b9c01", + "2246ca24ae5f011d3d20ae97d11761085b7ff8897d1695fa15e23bdc730671fb5d07da27c30f6dfdd6341dc320e006c8deb357a6673dc4efcb8b9575ec44eae900", + "36e900bfc907beed2418e1d8093235649db4590f42d50fe41ba81aed592dee323f1987b34a18ddebfdf752b5329b4b9b58494ca2db7e21cad4f85fc7ef0581c600", + "8e8498b20949e99559d8eb1944a404874b6a95641589f8b7db6c735419824461043af32b8500be87bd0a12ae7f1c58a1aac3b051ba0bd9211a48d7c112197d4f00" + ] + }, + { + "path": "m/44'/0'/0'/0/1024", + "xpriv": "xprvA2pXopDD7PVNLiv8wzWHF4gGWvtn2QWnasfs9b9wihomJZX38uE15gBS7EieoAm2kSkxaGcpzVmDaMMNys8ftd5q1ufW54VB81tyTGWgRYR", + "xpub": "xpub6FotDKk6wm3fZCzc423HcCd14xjGRsEdx6bTwyZZH3LkBMrBgSYFdUVuxXQbwb1G7raQhKrLzfxjpxuzfBrEbnuWcHQeQqm3waNwrpSAxsN", + "identifier": "ad894b6ea83033a70248b8209e279e1da9e34c10", + "depth": 5, + "child_number": 1024, + "address": "2TGnVnPxxwb6n7dfAEJcmTrTPteDcJAFHX5", + "bitcoin_address": "1GpaNb2cDc4oes9ZEkewFv4r12ZgyqZiJu", + "secret": "16a0a114eac88cb3abc32f88d122099e3f74ff5b4e35f129b0ff873fabc0f480", + "public": "02f106b5eee64deedb2ec5370c3db51ce36bd29d549b6c7e2a83f227fffb33afd9", + "signatures": [ + "3e22e0d0fd7ff86bbc3d02564244f9e39c39487d345980b661f7095624827e6d1ee5272e27e50dba112327e64c4f663cfd9613ac59d26f8dccfbed83c98501bd00", + "134a01839b7c7f054eb5dbccc73280bd6dceb345f3cff9ee674d55466d68c9555ce5e15ced0ba933d2e63342467364b5f589d2b7e779ab479c33866006a60ca300", + "161163debc5f456527ddf8977e27b0d86876eb1e0788e7e8235108cbb97b5fe86bdcd88863badb47241cef067d248830038ecd5dc502c444be577e92bd49cf4800", + "d81ae0a207483b337110ce8ff69cc8498c27c63d2545b742a09cb36561b9905c132fc7112701e8abe43cf68f23f69eb7ae745cd80f1d20322b95faf367d96edb00", + "17bd6c461cc46b6e71b9e4aea049bed26e144dfe81e1c81f9eb2064ba414783b2986321ebb04956ef96bc9d155ecb5a55baa6d700bae58bb34ecabe6da38391401", + "b4d7917c5e8c1133c5a91c732586ee5a48f5587d7603d97288232240619630cc257c46dcd99a8d3a616e3d5610b4b9504c3fc4b478b6731335fca74cf1bb8c9f00", + "2c38acd89da2d000f66187572f756c6b59ba0fa81b96dea95201e560c5266b182941181b15060907847a6cca905172f7f52798cc106f1b7d4998b4ce98270e2600", + "3fdb7c6de121c12befce96cc39d8320b458d70f2ab3e18c1160e59ede98f38a47303f8027fc8ff66c00340af03949027a31d3bbed47afbcc91f54c4c2480281700", + "2b9b0f82253574f00ff0563624c4b59c141f078d91c218998f3dfb3599e44a0a39709703d66d2c795851c17d0715dcffc1425c407bb6a3e45b4e975f2e48151400", + "f721ed0389977b9039d628812a71ea14be2912060b03d7e20bbf3108a69a7e344978e37220e00cbc41fed65cf0da36e9d1c6360373ff62c8f3d53bbbda5759f701" + ] + }, + { + "path": "m/44'/0'/0'/0/2147483548", + "xpriv": "xprvA2pXopDMT41V8fUpy8fLh6xo2TSS8bX3msTEr41kfQQ1MgByWNrFuW72jQUfo7eMsunQ3tZMK8Xk5vc5kQ7HJ2zJGACs23HCF9Z7E5ecEgd", + "xpub": "xpub6FotDKkFHRZnM9ZJ5ACM4EuXaVGvY4Eu96NqeSRNDjvzEUX83vAWTJRWagPWvefW6YJoADmGud5WvMrAdopeNcLiimUxihAXTE3srsMGGJC", + "identifier": "52f6e6858ce99ab8d3607f57457832103e8f01e3", + "depth": 5, + "child_number": 2147483548, + "address": "QBdP49hnURgF4bYEY1Pf8TMHL3EUh3cxcy", + "bitcoin_address": "18ZgBgCcYpJcwqaaThHNaQ75MU9P37ubjE", + "secret": "52f3a4ba64d18077679d43a86ba132934c2551a487dd9e7a9943ca638547de53", + "public": "02c6efdee572366c75effe5a05f8fcb0255b43f944c8eb51e5439484aa27ae0786", + "signatures": [ + "92baebdc8135e8dbabacd894f209e9d1cf044f3920c4d031ee79885f44677eb0086ac874aa8c93378742af64d57fec501419a696282693f7d62aba2dc6e9d6a200", + "107578b6d5d69fec7a5607e42f4bd8225fbd04cd423e13d9bcbadbb914f68e37691ad4be2fda8993f4c8bc4affdeb8cc7bf783788bfaadb46700ce99c06a96e500", + "d724277ab98223fd633f99aa1cc9c2299d5fd673b08531701de71a4dec784de840c4cf4fa0d615a5e83aa3eb6ff6efbe778891b5ecc5e64657ef2d9f0b153c6801", + "26a31756db4d6010bdf9081853c68a25f09b902811acf45a1c3a84ec8cdfc9b46a75af21748990609ae0fcb764bbd34a9ab6800cc017aad7591fb0624999976e00", + "48bb88cb592b16729d375a7050fff061bf6754b2a3b1196872db0bfea960552548dad75b9f6533909c6ede0848f39fe574d58a998de989bc2b9c99c5c560f0b301", + "113045e845812e8e89980c06926797e7bec9be7141528b27627f766f32a432235944fe94970e5b4d0a16350f616f2027df99d58fd819ea81a53bc70a2d0b369801", + "4e4bae11d8ac020de91c3d4131436c83a1bc9d47b609c2f1fcf648055a1cbdc028c65ac550f8722a3660901b6053e83d3ba5dd8e88f163a4049d6aa876b20e5f00", + "2d9fb1e77056cd081190e559cf9eb056fb46e3ae9af83dd0f3a9ed478e2e4cc1572df86c9f57d76adfb6c959d7e2b0f259383abb203d5d2cbc25bc9322f0112b00", + "79a626acfa484ab7f4637e9e04faf84aaf166643d83575a78a3ecb279b9e9a6f0d288a37d601af73889a82499defec67d627d38a2c3dc80c21a95ed0978d336401", + "a174fbf2300af6b5055068da3564ec481deba65bc458f633d530a377629a661d735147777844e8cd78a9d2962ff0e6d682445b3d60b7120fe535585cc5ba05a201" + ] + }, + { + "path": "m/44'/0'/0'/0/2147483647", + "xpriv": "xprvA2pXopDMT41ZVkAsQz42EAN4wKdBcgtvwz4dmw4wM4BfkKrSjYF8rDaayTfLfnZMcZbtfLWmVbe5pgoHh7raRdPcLfoE2cS26kAFXqYqdD2", + "xpub": "xpub6FotDKkFHRZriEFLX1b2bJJoVMTg29cnKCzEaKUYuPied8BbH5ZPQ1u4piyNgLWPUCmvTLVAaBJeN12KRcifzfW33Z8UBpKS46vU8Wj4t2R", + "identifier": "f68411f8fd8d8b1d2b22a13cb2df1f0b671d9d6b", + "depth": 5, + "child_number": 2147483647, + "address": "2iBq8iWqoDHztPjm77xbTDLxmTGDPPULEn5", + "bitcoin_address": "1PUTSbAXGURy2149kqSSzuu6JeDdqunBCm", + "secret": "89e4154fc3fc53a9574948037c269c4c41c3bfc8993c6e63f72e69220a1d261b", + "public": "02aed491f8c8ac1f34f3f2d23e2d22262cbee81bbe390f4bac7f4cc393c184880c", + "signatures": [ + "45b4cf0dec6a7b40c3c8d21debf276aeb055894cf9361a5a8e4b2fea6091b2572b7503c7a1f33f791cac9e54fe56c5afb981f10d51fd06c2c491d4db40ab45c800", + "bde43265626e5c7ca1e9024bc57290cd00813101c50d9ff3fc6f32074cb5f58f45d2f63189733d7a3d903348297548b188499cc665b5c246f2d61962d46efd2001", + "97cdfe39614062c153f1cd1a882f0ee4b8d9da9e76fdcc17b97da7c72c69e8b66c938bf42c14416f4b075e74883905c561e3081a514213c1fbd112b088b6fc8701", + "bcf7023226ef7c859491d3fe682650c784b450dcf23f0d9f5b9379d49b540b391636ad18d9671862203e0a7159eee84fc37a2a1ce951e837b22f6640e5aabd4f00", + "d8cae4d0dda542822987f5052d75ca0245ffadeaa586f3120aed84c1e8528c0d2ae6b0c6969c4a7cf035259aa9dcd93329276d7922c111a67810eae50c3181ed01", + "60009a2ecca2c45b5417c081ba5d0f0151fee0559824ce4ba35040012da916b42bb6d4d9befd0d7c50fb77f76abe416668bc9dd81d36a19a70be59311aad748401", + "5a713679c46cebc0cd3541a976013a0c87607e367f372544c8d4a614dc39bbcd518da08310b8289a5c47b69ab143b7fe336361af17afc6ebfbe405dc0eb4262400", + "c885035bd79f0d650d7804c0584aaa534b0050175c64fcf40e3dd72d8dda93421a7eae924e41137b1db2e21cb715a6f5a18d480c3c73ecc41e01541ca06749f401", + "b4d4445b724e290076b4edc725e528bbd8e124d50dc4cb0312d33ac24c813dfb0b1212a9417d34df16e11781118858557d937e17bba92aee7593c174e0d2aef801", + "95fddd785a113b37eebe27d2f496af93f0c3fd43cfcc2d1b3997ee41cb0ea83c04c3597a6244f17277c430d6c65a2a8e39ad4d8edbb18ea87405ccf96764809a00" + ] + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0009.golden b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0009.golden new file mode 100644 index 00000000..40ee334f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testdata/seed-bip32-0009.golden @@ -0,0 +1,233 @@ +{ + "seed": "QoO+EC/Fy+5nnhFNhp+1aGc40PgOZLgtEGrHyRsnxZU=", + "base_path": "m/44'/0'/0'/0", + "child_numbers": [ + 0, + 1, + 2, + 3, + 4, + 100, + 1024, + 2147483548, + 2147483647 + ], + "keys": [ + { + "path": "m/44'/0'/0'/0/0", + "xpriv": "xprvA4JhKSdQQ7CvhX85y8tWMmwH5rKsJHJQ5P7jb8iMv5BuPR7vqvorcKzyUa6TcL6HgrgfFEg4pDSTo3ZKyK9Dxvwnh3ZCfXhgQjNzRKdF3sa", + "xpub": "xpub6HJ3ixAJEUmDv1CZ5ARWiut1dtAMhk2FSc3LPX7yUQitGDT5PU87A8KTKq2CfiSUkXG72Tb1bMUjqyV7Zir1vnDaJNwd9sbuhc9Z8fPt588", + "identifier": "247f3ffca231bc338c46eb4a3baaab1bd111e866", + "depth": 5, + "child_number": 0, + "address": "H2LvJRsGmexXvgPtYzhhSUDr14cTJWpCbz", + "bitcoin_address": "14KymPTyGyyUehvqJh66HoMH7MtKV5j9RE", + "secret": "9cc29b58a871649f3f7f87403674e805c8cfaaf57b4e877c4eca7f2ca08cb6cd", + "public": "028f1510484f246592668317fce7a66f64dd1e59aa717b1a6cfa5251c8e32039d0", + "signatures": [ + "3a6e4e6cade31656d899f1d2de25c6167ab99b46b97431b29f6b790aad6db7b864b1f33ff38e83bbcaae0381f2261679ba7db09813ab6d80b28041bbdbf955c201", + "f1c82f9553639842e26554c4c76c50150ff179bc158e8e743332c319d0421b404babef0f40e17cfaf288627121c8faa70a7c1944b8635f1bb2193003cead0b8a01", + "992693f305348c561558a6502f52467f69871dfa980df9953ab19409467ed9a73f52e5bcef4d0ded94897fbd10ec07ef717f9a25a16065cc2795765481ea329701", + "c24d4b744ba367aa5d1c53d0efafd33738357505b3ffba0ab92d5b31af8afa1203b960c64b149771d40e97472aee12536b69deb0467b636f1a75a3d046650f4f01", + "e078c1f3b843be82a9b68b12bb3d00ea6b74291e11c001752e25cc4268e0553455b2fc318681f8e93a4d9960f4ff614ff6046c17836bd64c8d575bcdadaa524301", + "76fb53ccb4d854def019930b2d2f63d5f8d614b6ad44cc6484616e5ebe51bba82989982eb2df93e3e2a569e3f4de4010c00113899fd2764fc2aa627e89cf1a6800", + "c408b9f1e7fdf8d4064c492e357c9c32c87537c4477c2f666e56a11053a0578477124071edd764fbf885c53429add8157490c6d9b55f6d7e4761d1bbb0eba0ec01", + "65f32c78d15c257bc71276643247b0a45ab943f775590e65bae699a5cf6a0fec41b8fa247ed9d862fe67efc2ff67835f0dca156b1fdb8371e3929151c829568401", + "afaceae48c8fa7dee3aa9160d6ae1ca7aa1e6f0fa2d5310ad96e432499d9355f32579ffa9da4c3d201b5f6956040bbf66c054d67b264b04da432dc08061180ab01", + "c7a72b144fe9255c751dcba73996fec8e00d135802d4b546ead9c3e32b15e9c433b1e7efb2a270c8430bd394b1d085201ea3c3a6008ec8e4f61f8937eff1523500" + ] + }, + { + "path": "m/44'/0'/0'/0/1", + "xpriv": "xprvA4JhKSdQQ7CvkZFZs2pd7kgRCPgSFS17QyumgtPUQdLwC6ci71nPdUdFPdCaJhvknoZvUXznRm8W763iZp4e8pMguHV3ivkKRUAsGpJavsb", + "xpub": "xpub6HJ3ixAJEUmDy3L2y4MdUtd9kRWvetixnCqNVGo5xxsv4twreZ6eBGwjEvjf2Cy2RwFK3sVSSDQhsvMG9Nj7zkfYNdwzaHKsiZmhWeEyMNG", + "identifier": "4401008bb500bf9fb43b5278aa2efa5d5fa600d0", + "depth": 5, + "child_number": 1, + "address": "221SN2x3fVsjbZE6Uy1akayVSsSxbSrfXrQ", + "bitcoin_address": "17Ca9g5gERKFzvDGdxB8JyTuE2JWxTdVwK", + "secret": "1e6959b0f1f247f4d6f6b0adbf7e7923d35971133b762b8ab867f83a079e991e", + "public": "03685dfd3ed4ffbfb5559c2a2c5a1a3f2e5122c754281e089d3f2bfc54e69cef87", + "signatures": [ + "73f9f3e1ecba45a72e7c09a78a5b91ecbbd27625c4b0f7950abb61c49247f6f60e03e92d5177b3e42a935646cba78ee523f258cd293e19861bbe7ab86a7540a400", + "002d1d2bed281e7772625cc973a9de2d474439ed76b029cff0e62791b9fd59ff6ebd8946cd0cc0efe76bfa2b4c89b709669d0c9160a3bc08af58dd971c2d4a1c00", + "de213b04463d58c333ed6bdbf7a23bdcc1cd56c3544c62218d50b4c4c32d270e574a97bdd48c458f1adc7c058fd7db0a5970ed50a62ecd389d94a0e43f7bc20600", + "a550eabf4cd94405b420c521ec0ff846744bb4af8efdcc04e43592809afb0d7e2995f29c17272ab8fe07707034d4c19fa5e952485feeeae1725a0bbe8913ad1100", + "ba716326c11426a0bac159b5f0dbc8c56d4dcbddad7ec9e7f6cfce11e10a9c7417c37fa1553ac2150131082b8a3675a944c153d4cfc44a5cd92e4283f8d3b9f600", + "21968341e2754a540eb19d572e89b2511855089c2064b6575d187ffc4e808c6c2f4ec331b8d932943160c429cb19aeee705c2863802311c4d87e36825f66d76700", + "c36f06fd86ac422c103ecc31f2cb0d3986e6323b72e620999b5cc01344aa58cc3db3ed9398574445f204ec5a38c2aab5d5d841e18c9859a7f1eb5e29762683b001", + "44e2ddd7370a56b05438f31a8660a735533508630d8ccd2abac12d434fde101c4ca2895712863ba012f2cae89941a2d2078ac3de28465e832aaa20caf1aec23e01", + "34155ddec94466e7a5786d5d27fef794cbebebcbe50486761dd37d93c8fa9b1c1d9f63732fa90ca9fdc86c710d01218bf308f02f75756e20299ebc4316d1f71500", + "9eaafc935db0629162046eaa66388c9eca60854be581901ccb005f04cdb52fa04e30e9a4aa3c1c249eacf35beadaaca9b5a1d4caa1b6009ca5192bb3887457d800" + ] + }, + { + "path": "m/44'/0'/0'/0/2", + "xpriv": "xprvA4JhKSdQQ7Cvnuwvs56Hg2WnLWgEADwFNtaJtxEDLNrvH6m8EuRnR8EZZtFAvP8i6cxSnySZDFbpUp5T7KePpSubK3Mxd1wE7EjTLZ8Q7sv", + "xpub": "xpub6HJ3ixAJEUmE1Q2Py6dJ3ATWtYWiZgf6k7VuhLdptiPu9u6GnSk2xvZ3RA6YNvCNrxGkTfuUh188dWJhtVvJXGZM7jcf5Fn751T5BWUrdJP", + "identifier": "3ccd1ae177d549d2ec43b5027a3f6f8d5eb0fe2e", + "depth": 5, + "child_number": 2, + "address": "shXCYh4ZyQSBfSQe19tVUdeNvPmNvmHFVj", + "bitcoin_address": "16YVFTQVn61dL2JDf8c4rsSYMm2juqZ6w7", + "secret": "09261875a89f6304f0c9addb5e3ed61e0149aff5590deaa8779ebf8e665e03f8", + "public": "02753d2682845b36ae569a6a16eb15dc5e8fcd85bffabe1db428c00a10c0db238a", + "signatures": [ + "5604db204c65e8470187cf8ca3de8be4bfa59da40f46a10b62832c05176cc25976d4fa2ec41c03bc650d1e4aa5f8b2d7618e90ded3120c30dbdbf0f029fd5aa900", + "edc20dbf3ddb758da5a9e5315fa1a223ed917203a07f89aa6c87053d64e952c21d4f840fc4cdb233d6ba8aacf81ac843f7a56150a80f7dbb42ab8b2bc0c06fba00", + "5012b0ac4cb79c0911763ad90db1dc659c9e0ad394a51af7c85f4935be9a4de147c0effdbafd222f068a1bd0b66555085336ad3098ef3a5d0b1175097f8012d901", + "087f1963d741dd3ff222b9514cc0d906ca02992bed39643462457dcdefa3bc8639d8b6e746d18209edc63a66af0a880b90c63acde5b5fa898b47398238b8777b00", + "b4ed47f9eca987d3d0008b952caaa99b982914bb7be07d5f131ffa674f3d933d07a6927fa01a22bdaafe2f7a21788c6f47d878b23de39c5d0632515b17c9ee9601", + "1b3d5b0d5ad2030f535c35459ac56e19267692ff843b44ea7c1b0c74bce9bdd57f9cdbf37ffecc5ed79906bed5738e2ce768579c523103ee6134811a4317736801", + "3b0cc7c9cdc06e897b20b40e518d86a67b189eb40697ed6fd58e2f09e27f36245d497eef6bb6c28f4247cc7fd3c6cc789bd11aa63e1e0d9827014bf52301e82600", + "17461cf3e03e5cdc95dac2bc1e7e1328ad0d6655043620d31a27679028db2df64c27e1edb23b26e6b6ac29c59c63d87cc523d6c1810fbc4f1d6602e17981292501", + "33608650edeff9d7e4eacb3b77b594ba0954bf34120ca543d34718fe10f1ce7463e8bdf8fa5652641b6adbdc4aacad59e975243502dbfe7906c621408e7fa45b00", + "26595a9943df3b7c57baee922e90061b27faceba12f0c7c2925f65ee1fe4aedf49ec4c0fd58aa69bc2a3c6feae7f8c743bb14d63182cfaedc51a7d4bd503887000" + ] + }, + { + "path": "m/44'/0'/0'/0/3", + "xpriv": "xprvA4JhKSdQQ7Cvs1kCwCFxbPdUDyv6cKAbVw1KSdopuz6ZP31N97tVMq7iAY5bZpeexuCVDM1pHYgJbqPmvVGgBQyZ37m7Bkt8dE9veHYtfcj", + "xpub": "xpub6HJ3ixAJEUmE5Vpg3DnxxXaCn1kb1mtSs9vvF2DSUKdYFqLWgfCjudSC1oj9hWiz5VpNNz2NB265XjrJjHsAx4EcJNdrpB6ZwApfV1LAXTQ", + "identifier": "af93344b591975a41e130ca4cd1b79a58b82f8e7", + "depth": 5, + "child_number": 3, + "address": "bRjURMXshhfasXNyu6Q1LCMYADsSTRKD2p", + "bitcoin_address": "1H1MbW9sqYwzgkc88KuJiF9BUhhLGghjQk", + "secret": "430384666da1bffae02d1a5e6776a75e5ca35fd4fdb8d48a572a8738627dfc52", + "public": "02944634e732d294cf72390a11819daad59f509d99bf316f70f038cb2442d1097f", + "signatures": [ + "f8371112885d06e38f94b2c011e5edddb819ea54cc8f877b10d5f2abbf080df64b4ea64ce63928ea5cc76c34165edd10b84a33892eb5b263d202297aa7e098c700", + "2e0eb74ca891faea2a0b2338674ad56573e96c61b7256a29928600a90c91a52542f69a648f5d28b7b8a99bbb99628b57cdb6405a807949c901e678a24f55b76100", + "5ec42c90386ce51cb942bd686448307bb2e8da409150c1c45686967c89596368187824c244dbad18f8f7b81e2bff74e34e37686e3cc7c61a4e14f6460851f28500", + "bfc87b1f60c12a3e242b51a1ae4d9885baa325e8e97c4d9dce90efc9d2dd79a8703245b7152276fea5c4831c14abd16d3f94b3f2368d5a205c60d81489f7ca9101", + "72c8326c35603a98fd07f71ca2083e087d4f803348b8906a9b479f9cf41604d77cf47493fee2b7fe81dddce4daae656ab7ece379b3156ebc1bd5f2ce8ea9bf4600", + "ff6fcb6834ea1e90cb5712b9ec13c74e1a2adb139184c7d9369514abddc0338970636620d93beb5e50cffac45059807f146c14d3adbfcd76a0d82d387eef6d7301", + "90612212c1e92db794dca964daa1a2375715680f7e771afc847c5f49fe140b7474b6b2d472d2e2f9661d049f247c93be45d48e702221dd0a7a285427731553a101", + "8d12a3266361efd01a6e8f8401fd9bd29689cadadafa21cbabdfe6927617eecf2cee93f554ba9d77c849e45b119d29ff3c8d128acab83cd72acc485e12e06de801", + "40f3a5476aa0d2002bfd49e7d917705f21c9667fc51886fadd8e8433801b8279309160ca6fe295759ec7c4bdfd76836e6f2b7effe3035f628eb2e7576b23731b01", + "6b98b1526f9f4aecea2a952dcaff250b279bea49a61bc90c502e108b8ce008884bab5f19ceaa06626e55876753a44e80458695294478da81dbdcf2c174289c0a01" + ] + }, + { + "path": "m/44'/0'/0'/0/4", + "xpriv": "xprvA4JhKSdQQ7CvucHsNZtZwGhPoJyXgB1M6yTBh6ecCzj4qMUe1NkebERpThccdLCuxuWhJsyNraVGbrv5nA1zmjxPjpf99jhKfkMwaPeQ5Yp", + "xpub": "xpub6HJ3ixAJEUmE86NLUbRaJQe8MLp25djCUCNnVV4DmLG3i9onYv4u92kJK2JF7kCav5bnhmx1YmyYQZ3apL67rGp8T2fgKkZWQcy7oGnTuwy", + "identifier": "78227668af2f756d60f8a4cfe98ceb08820d6936", + "depth": 5, + "child_number": 4, + "address": "25jmhUgi71TKZVNPpaxT5umyXEiuYcojYmS", + "bitcoin_address": "1BxDNX5QS1vczcmSq1bBiq8mrfCXaUMbpf", + "secret": "015b641efb18f90c08dec4490c8b10edbe51ee7bcbd4a1dffd8bbf90dff890e3", + "public": "03e26ae8ce501f7f3f3f7915abf518db3ab8a78466ec3aa49d6c0f825733a80d6d", + "signatures": [ + "2d9126ba49e9882a0249697254faec9d6cbcb97ade9063c21c97a7b253321c1e79da33e3f5729bde9cadeec373ce0dcd5e51cc726fcdb194b278368ec9324d8e01", + "1419446f7a125efa9acc5606b3836bb1db7a6a1343c3da33afcfffcd1698e84274d664412a46466880ecf9591df1c6830be7bcfd597e959546b9ceff766c37fa01", + "a9b2b0edcbd0b8f0f394839ad11bd1baf23a064e5fc5ed9bf1acd9e95a92a31b5bedbfa0c4709f0733e1cdfd1da45a2c42e9b5bfa210d13295bc2108e9158baf00", + "8139315815d8077e5bacaec3490b3cf67850df73cec67b19442d2ea886f7b28760771ea211a2a9caf4be71b407c8ec4202f25f0cefd37f36b40c3e285986114501", + "9bd80bce5f14158376d459cab7b9673ab0dc8c3ee5d11746a12edf4e2fcec9ab7ae7394b36addc324f07a99ac0ee5f663b8e7e6682790e320797dc37c119b4aa01", + "6ac99c416d57d5b34d4021b866e47f97d70f1dd6f46ba09b11665633383eeaa809b7911a401f053020490426980977790a179fee4bd1cd39e86607c08992dc0c01", + "3d4c7d74a54b18185b5c21373dd55d7b1a3e33179280cd98a4189372af8eadbd7435b828bcc25b0e0f2c5705354e1dcc1c2aad94261784eed7f53ccd0082cbac01", + "ec1bc2a6b562b84b9fa935dab32f0bd3ee443fff22344c7b5c79f9e58a694c1e5f17e6eadb7c760be1eec9cb9c42c34af60cd91d4afbb20538178ec4ad9057eb01", + "9b97e3d14c54c524e4824141660cc407e3ed461d97fa97a7e45609b9708e32ed3115cbd008c7ed074d0ed4bb7c4000d659ac82b86c9c8b951268e0bda5896ca101", + "e6839674c06402169066ccb53d70184cba2b07c3005506c919685480427367c27258eb87a44ba22b7f65ac66cabb9cd7b15bccebfb9193479f8a62f96113f96700" + ] + }, + { + "path": "m/44'/0'/0'/0/100", + "xpriv": "xprvA4JhKSdQQ7D18rfBxChUMfhdkD4e7XtLYKutEHAn4uZ8MzR8YykkGEkuCtxUJPmjynAFE4ju3jFhysqhCtYzdoEWBke5bMnMvJCcaCSdQRk", + "xpub": "xpub6HJ3ixAJEUmJMLjf4EEUioeNJEu8WzcBuYqV2faPdF67EnkH6X4zp35P4ChGc9v3pRQ6dqxAX1TZkjMm2bi7cbtU59igRGmHbgSSrvZnyFN", + "identifier": "25803aac87eaf1641445a637e8c475101240b561", + "depth": 5, + "child_number": 100, + "address": "ZkS8VRWpnb3af4kNzM35i7xZbdQTAJaYQb", + "bitcoin_address": "14RHccsHZ4AEjFLrSujrF75wZJ5NmdUxBp", + "secret": "53959039f3067e1b0754f0494af00058df9838db8fc11314676ec5130b2eef0a", + "public": "03b825195ea0169aa16889509aa6ece904b9e016deb2c743baa43f48c961c024db", + "signatures": [ + "fd17c5ac47e1abea30de46abdc4b09907af112d45005537c56b479106bea59c40a282a7aaea447b36bdd1b631fca5c41519e3500084c0f2b3bc8db7b4e6c50cf01", + "dac190c6d3aee7f3a033fe83ab281ca5395d5b5f6ffadf65649a239886d26bdf5b20392fdc39e6a3e65f270dcbd509804b93872e144ce9ef10aa97e936fb9da101", + "4cb35288a0e08b8e6e961dda795522b77225986bc08efc1d18d223b33b928a6f20411fdfa5481a0928df6eb246e70fe9b7b63f0e97d170e442a65d47caaf3a1301", + "b58e2aeaececacbf02d78f9fc789c2d38fd75d93a25863ee7a37fdb9f03050446406ea7e601b135a850c4ef23848602a863f3eb986a4f6a7babb9f6df1054bd300", + "ebe476f6227291c1a1bc0a6e7eece6e875beb6fa9bc683b2f7cdb4daea3341c6471cb4e798ef07a4fe534c3827b7711f3999318c4d14212d3457a3facf8e82b301", + "0f91120f69fe48dfc62d1c2cc7e3100dbfc2b12d35c0b4e99a3dc821f15ce9ed33e4ed341c8897e51a4777d345fed73f5bb15d46825d75637a9c8ae8bb36457a01", + "9b81ad6cbdee36fd0406301209d84501784a90adc7fd5641df5ea8580b5dc8aa17751d5451baeedb104174aeccc42808ebc2de9fc9db9c9ded32be7c2ad03c3200", + "7f99bb1d1b66d6ef16aabfad3e4ed8c5697320927097248d4958bc6e75a279ce7bfe4508edf5da4e80e8de655d08720e516cbb4f8a33221284a4c320f9b88bda01", + "b14387c2c0f93b90cd8663fada9d14d7592eab30cc6bd468aa517fdd1fff7755099040e5db4db6bdad4a115df461298a45e7589bb0130548ce43eb8acc04bbb700", + "e8c7f60462bec7cdc889ccf6157746c6bcc67f7eae8278b10383466b9b6d553555a466d986228a8a60741f63af27fc42e9b5c4106b8746f5457aa96ebd92dd9700" + ] + }, + { + "path": "m/44'/0'/0'/0/1024", + "xpriv": "xprvA4JhKSdQQ7Dhj6pZ97qS54SfkEHdBZguQEHKGEhShwLhaEsJ2d1aJ2ihe1E2yothEPS7kQ9S523z578agvAVT7uXqzdUoNQXZr7JrgH2jB2", + "xpub": "xpub6HJ3ixAJEUmzwau2F9NSSCPQJG87b2QkmTCv4d74GGsgT3CSaAKpqq3BVJjoj9q5k95Ka9XBHnLH7ptU7HRcCu8oU5K726KHFSSkApSNj2z", + "identifier": "a22478122f973b0e4f5d253ee3fe1ef6b5074ded", + "depth": 5, + "child_number": 1024, + "address": "2EHn6xNgZ9a67bPtAtRB7dCAJHiECwcaiPT", + "bitcoin_address": "1FnL9zMw2An8qhcrkNPV6kYpqVSQUsnUwa", + "secret": "9384c058c07447b7d020e0377dc614bf982de7114a4302a63579deb86402187d", + "public": "03da800849098e0c5abcdd9dea1bda611c8195106caa13d6caf3b402da9d920613", + "signatures": [ + "c48302c51a3ebbfdc669beaa18308babff89878aab899d2e94044041dd6da0a83964e6df8b32075956fb99e75c0333a7455a51c47e89297419b687697424f5f901", + "879a9e17a7312be700afdb63190419cf03a9322d89899ff2a05362cb163bad123e4c86ef82f1c327945e14552f697c1dceb64a1e967a69d6a2110ac4621305f800", + "c8224dba96b555f027bc78f54b963131ca08b2b17bad31ca9cba2bc743a199273465320a8624a775f0d0aff9af8e2a557fa500e931ef85853bcdc729ce53839001", + "4338280a69f6457156acead6f706c1c0dba83c7426ec915ef38f7d303e7f87ad7c3facdab2ee1bc5118d938f8b807c6dbf9f262ba8790747aeac8994cb9f18e300", + "407f018d1ed39b66b1da788c09b77714882645c11769886d6a6c301d44a6c7705ded9b89eb88c4428910db0dc954d59b0f6dcc6f5d6c9c190fc34e2b1a50df3b00", + "1a2b9516ef295ecd74b6a48164434400ff2388eabadb4f59b14e8637020bbdf4135455b5f7e0ac9ce067af72403cf4aa76e8f7d0e34c19af4e1496c22d9d332e00", + "eaacbd9193997d7636cbe1751968b78d854775b472ab313b30f3f5eb4d517f0318799693869ddb37b0c99bb039c370bcfc4778afd739e22ec2f54433641d529c01", + "c7ed254b9606ed22ab3e29ee8b314d530b014a39273dda507558f427181bf8100a9aad6e260850f5087e736d7631f81efcfbf736c304ecfb79d2b436f993f30f00", + "9c64358cf53300c867b8b6f3fc44e94b67d6e85dc657326afa6c31479801b9941b29ccd4dee36e053946c912a37aa4ef5852bd81270bb7b1ced0ca327ab596a501", + "3deb6f7e9e63b44916c82aa96040565367172b9b849f68b0b670d4b5e0a5d6b843eee7c874b361f35677ac3ac40fb7db5cfc98ec962a63156476743bf3707d4d00" + ] + }, + { + "path": "m/44'/0'/0'/0/2147483548", + "xpriv": "xprvA4JhKSdYjmjpWDp7fZngLn3555skaePuCd6G8ofrS3ppbJJ2fUS866kp21BWiJC3P5ZBPaSMh1tgMTCXhYNnczDhqYvVkXZWWzGx3zsHKEV", + "xpub": "xpub6HJ3ixASa9J7ihtambKghuyod7iEz77kZr1rwC5TzPMoU6dBD1kNdu5HsEmmezbSvgHkdPgreN7gkafQK5HjcnBZZNnii56p43hUG84SYhM", + "identifier": "b3fd3ce3d75e5662398e140dc02aec463cc21406", + "depth": 5, + "child_number": 2147483548, + "address": "dUR6iUdRVM81inzyjmaExNoNcb7fdTNetX", + "bitcoin_address": "1HQhKcVu8yaE2dsgkH4pd1JqUmJUtNs14P", + "secret": "e70c0cb188ad34c1ec4d1ce7e01f3ac8791315905915b41ff8b612e092d27742", + "public": "02296e39bece343f378b32dd954343e8c80c51c7726c6e7dc3b6378bd287b9bec5", + "signatures": [ + "68ba65a993100d2986635e1996faac09dfe4966f4d5855249c6c0d8b9df4b989052ff41da4f27dec238ab791649bf362f5f8721debeac99d1cf66a26d4cf7a1701", + "db1458848613f5956c066f4293923520882014c9550a99c2da07da22939879d0537b77a0ef5609d7a6beb15fcb1ccfcf12ce8252f0ac152924b931a8678eb65900", + "8522f9b4add8e423f018e6285a68b206e9165d3e08d83a16a8e72f743b4a15317ae9245bdcf386e0f8a6c72c2b3a264cdafcca5cbe099284225203ab33347c3e00", + "41936e1a7075e1b989b3e3eb7b996a2218c825a4633aa5df7b89bf8f86dc29c87876552beac3e5df7f60ad9c95133b23db7378f4363586aad925a79fe4df85ff00", + "55454771d9798d3c8609bc8530f03f63e6803a335e6fe749da635734da0eb45b1b099a704f86ec2686e4948d8ffa98eed122427668e80be9c2e73d1c9c91d39100", + "96ff23d27aeeb35c7e7516d16e49dc142d0feaef8ae437ffd62f279ed52f983b371d05e755cedfe2f1a2a7d6cf05c3b54caa96b162ebaef05e86abcf8fc4db2000", + "40d9d294f9156ce35c05df860981605904673ad97cfeb896f3a5036e94fe702b7680e0cb524b0937f37a268ea1847a46c3b3cf813935edc07b83a2649790178901", + "2ba1620ff7f0446eb23df59d6246bf3dc01bfb0495fa8b094af2becb51be13e103def7fd1a7d6cb99943f647a6b68a0898a5f0645ad6c622af58deef647bf48c01", + "260e1376304047fd67787f763ae8400314835712de5b262c259f1f27da60895a3ba1806a460113e528016dab34761e664c297c683f43b8dd1f5098d78faae90401", + "d012b216822fe71605c8876e5d5c3b1a243db5f0310554d2ee39171d175b0ef7645094206b9c4c410891ae8f3456ea5d8aaf06b4af104c22932797a5bb48703801" + ] + }, + { + "path": "m/44'/0'/0'/0/2147483647", + "xpriv": "xprvA4JhKSdYjmjtqdazBVcXirTdn2EzTedKT76LVbGngDH1cNFnSAFc7WQf5vVoL4QfcFzUATAfXkS4cvD4ZFcZTLZFrkEYgQoCq1gWRg39eGF", + "xpub": "xpub6HJ3ixASa9JC47fTHX9Y5zQNL45Us7MApL1wHygQEYozVAavyhZrfJj8wDnHqvVZSyHs3LePrZ3VptmQtNE9JxTMRGMuffRuhCELR72qpKp", + "identifier": "f0336f412f5acb38268e89f793b638b7f685cce0", + "depth": 5, + "child_number": 2147483647, + "address": "2VrywEebQKtq1exXLgReUtNFJiqfbbgFZgK", + "bitcoin_address": "1Nu4nn5M6qG3ZgyaSo5JaGop27m6vdDurR", + "secret": "a1787c17f19360c572d70b615a651083f22d38c35c281cc66b23cbdecd206436", + "public": "03ca4c73d0f2092822c6ab230c42b43580f752a3379be413a07d76f2e7ec9a9f07", + "signatures": [ + "88e77c3681c9485b92222613cc676aa57c9029438969aa80d28905d32ccf5f4a27433a8b46853fe7093faae1b861f505b83c9c9655ee774c7ea38fdff6627e6c01", + "dde2e5c5b977f5be5681d9e66d353589267c03e20c11b970508883c45ae29dcc565e2dc47bd4b3408ea2a223343270f906cb0dda7fdade0b8ea65035771f10fc01", + "c99f20bda63d4af58a835b7a42ef70155334bab3e9621efdec7ee4c75a6331450a6adb5744ad5d9e852d8d21d8fdcb4dd25397c2e58cf46014f329f74f8414ec00", + "5f9634525bb5340d16747d05a072e958b577b96c1798697b30e2e0fefe9800557284dc0711a29db56ce3726cf779bda24b0b79e7e9783fba2a5f0dab41fae13501", + "4d80ca47a02aab0875fefffb8fa51af5f26a3e93b2671f2961bcbadbd511dde164178f2c2ed58c8d9d6561e879c376fbdbde8b8d2d44f2cabb53bba45686e45000", + "052e91dee950a22d52df20cd392bc2ac22ee01501cc0d6a9b0a29dd28cb0338e705c4ebf9c0b84611ffe0ece3373e4732cb3a151924807e4fdbe153bc11faaa401", + "bec9ae7d66eccea4c3bc9baa514beb23ccd3fe0960df2cb28e75dd5fc999b3f17c621ad8ea56284d7e458e1a6a91a5a32b1545da3dc471634409c26e845ac3d801", + "420d755f280476a7ddfaa11be6bef78f228badf2962299d949a5bc3e7355629e39e449896bc6debce53bf8d6b85ad4a8d32a64a339e7f0d9d80d380e16e719fc00", + "932e98f53317d68cd591097ba5a48cbf59b04fffefa40b6bd141a3b3ed7786353a9c687c1cacfabc393c38027dd35508746b3a79ebe2c5884c50e97a432e204700", + "8acd8d53a958922f1db3cb29b7c3c5679adaaa1edb4fe3e654ecbb32dd4ad9591c34d59ec4bf3d4784b475f550e27f6632b9326687a199a007e0d9f102475bb300" + ] + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testsuite.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testsuite.go new file mode 100644 index 00000000..70e6cfc8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testsuite.go @@ -0,0 +1,527 @@ +/* +Package testsuite is the cipher testdata testsuite +*/ +package testsuite + +import ( + "bytes" + "encoding/base64" + "encoding/hex" + "errors" + "fmt" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/base58" + "github.com/SkycoinProject/skycoin/src/cipher/bip32" + secp256k1 "github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go" +) + +// InputTestDataJSON contains hashes to be signed +type InputTestDataJSON struct { + Hashes []string `json:"hashes"` +} + +// KeysTestDataJSON contains address, public key, secret key and list of signatures +type KeysTestDataJSON struct { + Address string `json:"address"` + BitcoinAddress string `json:"bitcoin_address"` + Secret string `json:"secret"` + Public string `json:"public"` + Signatures []string `json:"signatures,omitempty"` +} + +// SeedTestDataJSON contains data generated by Seed +type SeedTestDataJSON struct { + Seed string `json:"seed"` + Keys []KeysTestDataJSON `json:"keys"` +} + +// Bip32KeysTestDataJSON contains address, public key, secret key and list of signatures +type Bip32KeysTestDataJSON struct { + Path string `json:"path"` + XPriv string `json:"xpriv"` + XPub string `json:"xpub"` + Identifier string `json:"identifier"` + Depth byte `json:"depth"` + ChildNumber uint32 `json:"child_number"` + + KeysTestDataJSON +} + +// Bip32SeedTestDataJSON contains data generated by Seed +type Bip32SeedTestDataJSON struct { + Seed string `json:"seed"` + BasePath string `json:"base_path"` + ChildNumbers []uint32 `json:"child_numbers"` + Keys []Bip32KeysTestDataJSON `json:"keys"` +} + +// InputTestData contains hashes to be signed +type InputTestData struct { + Hashes []cipher.SHA256 +} + +// ToJSON converts InputTestData to InputTestDataJSON +func (d *InputTestData) ToJSON() *InputTestDataJSON { + hashes := make([]string, len(d.Hashes)) + for i, h := range d.Hashes { + hashes[i] = h.Hex() + } + + return &InputTestDataJSON{ + Hashes: hashes, + } +} + +// InputTestDataFromJSON converts InputTestDataJSON to InputTestData +func InputTestDataFromJSON(d *InputTestDataJSON) (*InputTestData, error) { + hashes := make([]cipher.SHA256, len(d.Hashes)) + for i, h := range d.Hashes { + var err error + hashes[i], err = cipher.SHA256FromHex(h) + if err != nil { + return nil, err + } + } + + return &InputTestData{ + Hashes: hashes, + }, nil +} + +// KeysTestData contains address, public key, secret key and list of signatures +type KeysTestData struct { + Address cipher.Address + BitcoinAddress cipher.BitcoinAddress + Secret cipher.SecKey + Public cipher.PubKey + Signatures []cipher.Sig +} + +// ToJSON converts KeysTestData to KeysTestDataJSON +func (k *KeysTestData) ToJSON() *KeysTestDataJSON { + sigs := make([]string, len(k.Signatures)) + for i, s := range k.Signatures { + sigs[i] = s.Hex() + } + + return &KeysTestDataJSON{ + Address: k.Address.String(), + BitcoinAddress: k.BitcoinAddress.String(), + Secret: k.Secret.Hex(), + Public: k.Public.Hex(), + Signatures: sigs, + } +} + +// KeysTestDataFromJSON converts KeysTestDataJSON to KeysTestData +func KeysTestDataFromJSON(d *KeysTestDataJSON) (*KeysTestData, error) { + addr, err := cipher.DecodeBase58Address(d.Address) + if err != nil { + return nil, err + } + + btcAddr, err := cipher.DecodeBase58BitcoinAddress(d.BitcoinAddress) + if err != nil { + return nil, err + } + + s, err := cipher.SecKeyFromHex(d.Secret) + if err != nil { + return nil, err + } + + p, err := cipher.PubKeyFromHex(d.Public) + if err != nil { + return nil, err + } + + var sigs []cipher.Sig + if d.Signatures != nil { + sigs = make([]cipher.Sig, len(d.Signatures)) + for i, s := range d.Signatures { + var err error + sigs[i], err = cipher.SigFromHex(s) + if err != nil { + return nil, err + } + } + } + + return &KeysTestData{ + Address: addr, + BitcoinAddress: btcAddr, + Secret: s, + Public: p, + Signatures: sigs, + }, nil +} + +// SeedTestData contains data generated by Seed +type SeedTestData struct { + Seed []byte + Keys []KeysTestData +} + +// ToJSON converts SeedTestData to SeedTestDataJSON +func (s *SeedTestData) ToJSON() *SeedTestDataJSON { + keys := make([]KeysTestDataJSON, len(s.Keys)) + for i, k := range s.Keys { + kj := k.ToJSON() + keys[i] = *kj + } + + return &SeedTestDataJSON{ + Seed: base64.StdEncoding.EncodeToString(s.Seed), + Keys: keys, + } +} + +// SeedTestDataFromJSON converts SeedTestDataJSON to SeedTestData +func SeedTestDataFromJSON(d *SeedTestDataJSON) (*SeedTestData, error) { + seed, err := base64.StdEncoding.DecodeString(d.Seed) + if err != nil { + return nil, err + } + + keys := make([]KeysTestData, len(d.Keys)) + for i, kj := range d.Keys { + k, err := KeysTestDataFromJSON(&kj) + if err != nil { + return nil, err + } + keys[i] = *k + } + + return &SeedTestData{ + Seed: seed, + Keys: keys, + }, nil +} + +// ValidateSeedData validates the provided SeedTestData against the current cipher library. +// inputData is required if SeedTestData contains signatures +func ValidateSeedData(seedData *SeedTestData, inputData *InputTestData) error { + keys := cipher.MustGenerateDeterministicKeyPairs(seedData.Seed, len(seedData.Keys)) + if len(seedData.Keys) != len(keys) { + return errors.New("cipher.GenerateDeterministicKeyPairs generated an unexpected number of keys") + } + + for i, s := range keys { + if err := validateKeyTestData(inputData, s, seedData.Keys[i]); err != nil { + return err + } + } + + return nil +} + +func validateKeyTestData(inputData *InputTestData, s cipher.SecKey, data KeysTestData) error { + if s == (cipher.SecKey{}) { + return errors.New("secret key is null") + } + if data.Secret != s { + return errors.New("generated secret key does not match provided secret key") + } + + p := cipher.MustPubKeyFromSecKey(s) + if p == (cipher.PubKey{}) { + return errors.New("public key is null") + } + if data.Public != p { + return errors.New("derived public key does not match provided public key") + } + + addr1 := cipher.AddressFromPubKey(p) + if addr1 == (cipher.Address{}) { + return errors.New("address is null") + } + if data.Address != addr1 { + return errors.New("derived address does not match provided address") + } + + addr2 := cipher.MustAddressFromSecKey(s) + if addr1 != addr2 { + return errors.New("cipher.AddressFromPubKey and cipher.AddressFromSecKey generated different addresses") + } + + btcAddr1 := cipher.BitcoinAddressFromPubKey(p) + if btcAddr1 == (cipher.BitcoinAddress{}) { + return errors.New("bitcoin address is null") + } + if data.BitcoinAddress != btcAddr1 { + return errors.New("derived bitcoin address does not match provided bitcoin address") + } + + btcAddr2 := cipher.MustBitcoinAddressFromSecKey(s) + if btcAddr1 != btcAddr2 { + return errors.New("cipher.BitcoinAddressFromPubKey and cipher.BitcoinAddressFromSecKey generated different addresses") + } + + validSec := secp256k1.VerifySeckey(s[:]) + if validSec != 1 { + return errors.New("secp256k1.VerifySeckey failed") + } + + validPub := secp256k1.VerifyPubkey(p[:]) + if validPub != 1 { + return errors.New("secp256k1.VerifyPubkey failed") + } + + if inputData == nil && len(data.Signatures) != 0 { + return errors.New("seed data contains signatures but input data was not provided") + } + + if inputData != nil { + if len(data.Signatures) != len(inputData.Hashes) { + return errors.New("Number of signatures in seed data does not match number of hashes in input data") + } + + for j, h := range inputData.Hashes { + sig := data.Signatures[j] + if sig == (cipher.Sig{}) { + return errors.New("provided signature is null") + } + + err := cipher.VerifyPubKeySignedHash(p, sig, h) + if err != nil { + return fmt.Errorf("cipher.VerifyPubKeySignedHash failed: %v", err) + } + + err = cipher.VerifyAddressSignedHash(addr1, sig, h) + if err != nil { + return fmt.Errorf("cipher.VerifyAddressSignedHash failed: %v", err) + } + + err = cipher.VerifySignatureRecoverPubKey(sig, h) + if err != nil { + return fmt.Errorf("cipher.VerifySignatureRecoverPubKey failed: %v", err) + } + + p2, err := cipher.PubKeyFromSig(sig, h) + if err != nil { + return fmt.Errorf("cipher.PubKeyFromSig failed: %v", err) + } + + if p != p2 { + return errors.New("public key derived from signature does not match public key derived from secret") + } + + sig2 := cipher.MustSignHash(h, s) + if sig2 == (cipher.Sig{}) { + return errors.New("created signature is null") + } + + // NOTE: signatures are not deterministic, they use a nonce, + // so we don't compare the generated sig to the provided sig + } + } + + return nil +} + +// Bip32KeysTestData contains address, public key, secret key and list of signatures +type Bip32KeysTestData struct { + Path string + XPriv *bip32.PrivateKey + KeysTestData +} + +// ToJSON converts Bip32KeysTestData to Bip32KeysTestDataJSON +func (k *Bip32KeysTestData) ToJSON() *Bip32KeysTestDataJSON { + sigs := make([]string, len(k.Signatures)) + for i, s := range k.Signatures { + sigs[i] = s.Hex() + } + + return &Bip32KeysTestDataJSON{ + Path: k.Path, + XPriv: k.XPriv.String(), + XPub: k.XPriv.PublicKey().String(), + Identifier: hex.EncodeToString(k.XPriv.Identifier()), + Depth: k.XPriv.Depth, + ChildNumber: k.XPriv.ChildNumber(), + + KeysTestDataJSON: KeysTestDataJSON{ + Address: k.Address.String(), + BitcoinAddress: k.BitcoinAddress.String(), + Secret: k.Secret.Hex(), + Public: k.Public.Hex(), + Signatures: sigs, + }, + } +} + +// Bip32KeysTestDataFromJSON converts Bip32KeysTestDataJSON to Bip32KeysTestData +func Bip32KeysTestDataFromJSON(d *Bip32KeysTestDataJSON) (*Bip32KeysTestData, error) { + addr, err := cipher.DecodeBase58Address(d.Address) + if err != nil { + return nil, err + } + + btcAddr, err := cipher.DecodeBase58BitcoinAddress(d.BitcoinAddress) + if err != nil { + return nil, err + } + + s, err := cipher.SecKeyFromHex(d.Secret) + if err != nil { + return nil, err + } + + p, err := cipher.PubKeyFromHex(d.Public) + if err != nil { + return nil, err + } + + var sigs []cipher.Sig + if d.Signatures != nil { + sigs = make([]cipher.Sig, len(d.Signatures)) + for i, s := range d.Signatures { + var err error + sigs[i], err = cipher.SigFromHex(s) + if err != nil { + return nil, err + } + } + } + + xPrivBytes, err := base58.Decode(d.XPriv) + if err != nil { + return nil, err + } + + xPriv, err := bip32.DeserializePrivateKey(xPrivBytes) + if err != nil { + return nil, err + } + + identifier, err := hex.DecodeString(d.Identifier) + if err != nil { + return nil, err + } + + if !bytes.Equal(xPriv.Identifier(), identifier) { + return nil, errors.New("xpriv identifier does not match identifier") + } + + if xPriv.Depth != d.Depth { + return nil, errors.New("xpriv depth does not match depth") + } + + if xPriv.PublicKey().String() != d.XPub { + return nil, errors.New("xpub derived from xpriv does not match xpub") + } + + if xPriv.ChildNumber() != d.ChildNumber { + return nil, errors.New("xpriv child number does not match child number") + } + + return &Bip32KeysTestData{ + Path: d.Path, + XPriv: xPriv, + + KeysTestData: KeysTestData{ + Address: addr, + BitcoinAddress: btcAddr, + Secret: s, + Public: p, + Signatures: sigs, + }, + }, nil +} + +// Bip32SeedTestData contains data generated by Seed +type Bip32SeedTestData struct { + Seed []byte + BasePath string + ChildNumbers []uint32 + Keys []Bip32KeysTestData +} + +// ToJSON converts Bip32SeedTestData to Bip32SeedTestDataJSON +func (s *Bip32SeedTestData) ToJSON() *Bip32SeedTestDataJSON { + keys := make([]Bip32KeysTestDataJSON, len(s.Keys)) + for i, k := range s.Keys { + kj := k.ToJSON() + keys[i] = *kj + } + + return &Bip32SeedTestDataJSON{ + Seed: base64.StdEncoding.EncodeToString(s.Seed), + BasePath: s.BasePath, + ChildNumbers: s.ChildNumbers, + Keys: keys, + } +} + +// Bip32SeedTestDataFromJSON converts Bip32SeedTestDataJSON to Bip32SeedTestData +func Bip32SeedTestDataFromJSON(d *Bip32SeedTestDataJSON) (*Bip32SeedTestData, error) { + seed, err := base64.StdEncoding.DecodeString(d.Seed) + if err != nil { + return nil, err + } + + keys := make([]Bip32KeysTestData, len(d.Keys)) + for i, kj := range d.Keys { + k, err := Bip32KeysTestDataFromJSON(&kj) + if err != nil { + return nil, err + } + keys[i] = *k + } + + return &Bip32SeedTestData{ + Seed: seed, + BasePath: d.BasePath, + ChildNumbers: d.ChildNumbers, + Keys: keys, + }, nil +} + +// ValidateBip32SeedData validates the provided Bip32SeedTestData against the current cipher library. +// inputData is required if Bip32SeedTestData contains signatures +func ValidateBip32SeedData(seedData *Bip32SeedTestData, inputData *InputTestData) error { + mk, err := bip32.NewPrivateKeyFromPath(seedData.Seed, seedData.BasePath) + if err != nil { + return err + } + + if len(seedData.ChildNumbers) != len(seedData.Keys) { + return errors.New("len(seedData.ChildNumbers) must equal len(seedData.Keys)") + } + + for i, n := range seedData.ChildNumbers { + k, err := mk.NewPrivateChildKey(n) + if err != nil { + return err + } + + if err := validateBip32KeyTestData(inputData, seedData.BasePath, seedData.Seed, k, n, seedData.Keys[i]); err != nil { + return err + } + } + + return nil +} + +func validateBip32KeyTestData(inputData *InputTestData, basePath string, seed []byte, s *bip32.PrivateKey, childNumber uint32, data Bip32KeysTestData) error { + path := fmt.Sprintf("%s/%d", basePath, childNumber) + pathXPriv, err := bip32.NewPrivateKeyFromPath(seed, path) + if err != nil { + return err + } + + if s.String() != pathXPriv.String() { + return errors.New("xpriv generated with NewPrivateChildKey differs from xpriv generated with NewPrivateKeyFromPath") + } + + pubKey := cipher.MustNewPubKey(s.PublicKey().Key) + secKey := cipher.MustNewSecKey(s.Key) + + if cipher.MustPubKeyFromSecKey(secKey) != pubKey { + return errors.New("pubkey derived from bip32 key does not match pubkey derived from bip32 key converted to cipher key") + } + + return validateKeyTestData(inputData, secKey, data.KeysTestData) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testsuite_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testsuite_test.go new file mode 100644 index 00000000..e848465f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cipher/testsuite/testsuite_test.go @@ -0,0 +1,111 @@ +package testsuite + +import ( + "os" + "path/filepath" + "regexp" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/util/file" +) + +const ( + testdataDir = "./testdata/" + manyAddressesFilename = "many-addresses.golden" + inputHashesFilename = "input-hashes.golden" + seedFileRegex = `^seed-\d+.golden$` + bip32SeedFileRegex = `^seed-bip32-\d+.golden$` +) + +func TestManyAddresses(t *testing.T) { + fn := filepath.Join(testdataDir, manyAddressesFilename) + + var dataJSON SeedTestDataJSON + err := file.LoadJSON(fn, &dataJSON) + require.NoError(t, err) + + data, err := SeedTestDataFromJSON(&dataJSON) + require.NoError(t, err) + + err = ValidateSeedData(data, nil) + require.NoError(t, err) +} + +func TestSeedSignatures(t *testing.T) { + fn := filepath.Join(testdataDir, inputHashesFilename) + + var inputDataJSON InputTestDataJSON + err := file.LoadJSON(fn, &inputDataJSON) + require.NoError(t, err) + + inputData, err := InputTestDataFromJSON(&inputDataJSON) + require.NoError(t, err) + + seedFiles, err := traverseFiles(testdataDir, seedFileRegex) + require.NoError(t, err) + + for _, fn := range seedFiles { + t.Run(fn, func(t *testing.T) { + fn = filepath.Join(testdataDir, fn) + + var seedDataJSON SeedTestDataJSON + err := file.LoadJSON(fn, &seedDataJSON) + require.NoError(t, err) + + seedData, err := SeedTestDataFromJSON(&seedDataJSON) + require.NoError(t, err) + + err = ValidateSeedData(seedData, inputData) + require.NoError(t, err) + }) + } +} + +func TestBip32SeedSignatures(t *testing.T) { + fn := filepath.Join(testdataDir, inputHashesFilename) + + var inputDataJSON InputTestDataJSON + err := file.LoadJSON(fn, &inputDataJSON) + require.NoError(t, err) + + inputData, err := InputTestDataFromJSON(&inputDataJSON) + require.NoError(t, err) + + seedFiles, err := traverseFiles(testdataDir, bip32SeedFileRegex) + require.NoError(t, err) + + for _, fn := range seedFiles { + t.Run(fn, func(t *testing.T) { + fn = filepath.Join(testdataDir, fn) + + var seedDataJSON Bip32SeedTestDataJSON + err := file.LoadJSON(fn, &seedDataJSON) + require.NoError(t, err) + + seedData, err := Bip32SeedTestDataFromJSON(&seedDataJSON) + require.NoError(t, err) + + err = ValidateBip32SeedData(seedData, inputData) + require.NoError(t, err) + }) + } +} + +func traverseFiles(dir string, filenameTemplate string) ([]string, error) { //nolint:unparam + files := make([]string, 0) + if err := filepath.Walk(dir, func(_ string, f os.FileInfo, _ error) error { + if !f.IsDir() { + r, err := regexp.MatchString(filenameTemplate, f.Name()) + if err == nil && r { + files = append(files, f.Name()) + } + } + return nil + }); err != nil { + return nil, err + } + + return files, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/add_private_key.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/add_private_key.go new file mode 100644 index 00000000..edde0003 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/add_private_key.go @@ -0,0 +1,133 @@ +package cli + +import ( + "fmt" + "path/filepath" + + "github.com/spf13/cobra" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/wallet" +) + +func addPrivateKeyCmd() *cobra.Command { + // TODO -- allow private key to be entered privately, same as the password can be + addPrivateKeyCmd := &cobra.Command{ + Short: "Add a private key to wallet", + Use: "addPrivateKey [wallet] [private key]", + Long: `Add a private key to wallet. + + This method only works on "collection" type wallets. + Use "skycoin-cli walletCreate -t collection" to create a "collection" type wallet. + + Use caution when using this from your shell. The private key will be recorded + if your shell's history file, unless you disable the shell history. + + Use caution when using the "-p" command. If you have command + history enabled your wallet encryption password can be recovered from the + history log. If you do not include the "-p" option you will be prompted to + enter your password after you enter your command.`, + SilenceUsage: true, + Args: cobra.ExactArgs(2), + DisableFlagsInUseLine: true, + RunE: func(c *cobra.Command, args []string) error { + walletFile := args[0] + skStr := args[1] + + password, err := c.Flags().GetString("password") + if err != nil { + return err + } + pr := NewPasswordReader([]byte(password)) + + err = AddPrivateKeyToFile(walletFile, skStr, pr) + + switch err.(type) { + case nil: + fmt.Println("success") + return nil + case WalletLoadError: + printHelp(c) + return err + default: + return err + } + }, + } + + addPrivateKeyCmd.Flags().StringP("password", "p", "", "wallet password") + + return addPrivateKeyCmd +} + +// AddPrivateKey adds a private key to a wallet.Wallet. Caller should save the wallet afterwards +func AddPrivateKey(wlt *wallet.CollectionWallet, key string) error { + sk, err := cipher.SecKeyFromHex(key) + if err != nil { + return fmt.Errorf("invalid private key: %s, must be a hex string of length 64", key) + } + + pk, err := cipher.PubKeyFromSecKey(sk) + if err != nil { + return err + } + + addr := wlt.AddressConstructor()(pk) + + entry := wallet.Entry{ + Address: addr, + Public: pk, + Secret: sk, + } + + return wlt.AddEntry(entry) +} + +// AddPrivateKeyToFile adds a private key to a wallet based on filename. +// Will save the wallet after modifying. +func AddPrivateKeyToFile(walletFile, key string, pr PasswordReader) error { + wlt, err := wallet.Load(walletFile) + if err != nil { + return WalletLoadError{err} + } + + if wlt.Type() != wallet.WalletTypeCollection { + return fmt.Errorf("only %q type wallets can have keypairs added manually", wallet.WalletTypeCollection) + } + + if pr == nil && wlt.IsEncrypted() { + return wallet.ErrMissingPassword + } + + addKey := func(w *wallet.CollectionWallet, key string) error { + return AddPrivateKey(w, key) + } + + if wlt.IsEncrypted() { + addKey = func(w *wallet.CollectionWallet, key string) error { + password, err := pr.Password() + if err != nil { + return err + } + + return wallet.GuardUpdate(w, password, func(wlt wallet.Wallet) error { + return AddPrivateKey(wlt.(*wallet.CollectionWallet), key) + }) + } + } + + if err := addKey(wlt.(*wallet.CollectionWallet), key); err != nil { + return err + } + + dir, err := filepath.Abs(filepath.Dir(walletFile)) + if err != nil { + return err + } + + if err := wallet.Save(wlt, dir); err != nil { + return WalletSaveError{err} + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/address_gen.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/address_gen.go new file mode 100644 index 00000000..1ea4c180 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/address_gen.go @@ -0,0 +1,329 @@ +package cli + +import ( + "encoding/json" + "errors" + "fmt" + "os" + "strings" + + "github.com/spf13/cobra" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/bip39" + "github.com/SkycoinProject/skycoin/src/wallet" +) + +func addressGenCmd() *cobra.Command { + addressGenCmd := &cobra.Command{ + Short: "Generate skycoin or bitcoin addresses", + Use: "addressGen", + Long: `Use caution when using the "-p" command. If you have command history enabled + your wallet encryption password can be recovered from the history log. If you + do not include the "-p" option you will be prompted to enter your password + after you enter your command.`, + SilenceUsage: true, + RunE: func(c *cobra.Command, _ []string) error { + numAddresses, err := c.Flags().GetInt("num") + if err != nil { + return err + } + if numAddresses <= 0 { + return errors.New("num must be > 0") + } + + coinName, err := c.Flags().GetString("coin") + if err != nil { + return err + } + + coinType, err := wallet.ResolveCoinType(coinName) + if err != nil { + return err + } + + encrypt, err := c.Flags().GetBool("encrypt") + if err != nil { + return err + } + + mode, err := c.Flags().GetString("mode") + if err != nil { + return nil + } + + label, err := c.Flags().GetString("label") + if err != nil { + return nil + } + + hideSecrets, err := c.Flags().GetBool("hide-secrets") + if err != nil { + return nil + } + + seed, err := resolveSeed(c) + if err != nil { + return err + } + + var password []byte + if encrypt { + switch strings.ToLower(mode) { + case "json", "wallet": + default: + return errors.New("Encrypt flag requires -mode to be json") + } + + var err error + password, err = PasswordFromTerm{}.Password() + if err != nil { + return err + } + } + + w, err := wallet.NewWallet(wallet.NewWalletFilename(), wallet.Options{ + Coin: coinType, + Label: label, + Seed: seed, + Encrypt: encrypt, + Password: password, + CryptoType: wallet.DefaultCryptoType, + GenerateN: uint64(numAddresses), + Type: wallet.WalletTypeDeterministic, + }) + if err != nil { + return err + } + + if hideSecrets { + w.Erase() + } + + rw := w.ToReadable() + + switch strings.ToLower(mode) { + case "json", "wallet": + output, err := json.MarshalIndent(rw, "", " ") + if err != nil { + return err + } + + fmt.Println(string(output)) + case "addrs", "addresses": + for _, e := range rw.GetEntries() { + fmt.Println(e.Address) + } + case "secrets": + if hideSecrets { + return errors.New("secrets mode selected but hideSecrets enabled") + } + for _, e := range rw.GetEntries() { + fmt.Println(e.Secret) + } + default: + return errors.New("invalid mode") + } + + return nil + }, + } + + addressGenCmd.Flags().IntP("num", "n", 1, "Number of addresses to generate") + addressGenCmd.Flags().StringP("coin", "c", "skycoin", "Coin type. Must be skycoin or bitcoin. If bitcoin, secret keys are in Wallet Import Format instead of hex.") + addressGenCmd.Flags().StringP("label", "l", "", "Wallet label to use when printing or writing a wallet file") + addressGenCmd.Flags().Bool("hex", false, "Use hex(sha256sum(rand(1024))) (CSPRNG-generated) as the seed if not seed is not provided") + addressGenCmd.Flags().StringP("seed", "s", "", "Seed for deterministic key generation. Will use bip39 as the seed if not provided.") + addressGenCmd.Flags().BoolP("strict-seed", `t`, false, "Seed should be a valid bip39 mnemonic seed.") + addressGenCmd.Flags().IntP("entropy", "e", 128, "Entropy of the autogenerated bip39 seed, when the seed is not provided. Can be 128 or 256") + addressGenCmd.Flags().BoolP("hide-secrets", "i", false, "Hide the secret key and seed from the output when printing a JSON wallet file") + addressGenCmd.Flags().StringP("mode", "m", "wallet", "Output mode. Options are wallet (prints a full JSON wallet), addresses (prints addresses in plain text), secrets (prints secret keys in plain text)") + addressGenCmd.Flags().BoolP("encrypt", "x", false, "Encrypt the wallet when printing a JSON wallet") + + return addressGenCmd +} + +func resolveSeed(c *cobra.Command) (string, error) { + entropy, err := c.Flags().GetInt("entropy") + if err != nil { + return "", nil + } + + switch entropy { + case 128, 256: + default: + return "", errors.New("entropy must be 128 or 256") + } + + seed, err := c.Flags().GetString("seed") + if err != nil { + return "", nil + } + + strictSeed, err := c.Flags().GetBool("strict-seed") + if err != nil { + return "", nil + } + + if seed != "" { + if strictSeed { + if err := bip39.ValidateMnemonic(seed); err != nil { + return "", fmt.Errorf("seed is not a valid bip39 seed: %v", err) + } + } + + return seed, nil + } + + useHex, err := c.Flags().GetBool("hex") + if err != nil { + return "", nil + } + + if useHex { + seed = cipher.SumSHA256(cipher.RandByte(1024)).Hex() + } else { + e, err := bip39.NewEntropy(entropy) + if err != nil { + return "", err + } + + seed, err = bip39.NewMnemonic(e) + if err != nil { + return "", err + } + } + + return seed, nil +} + +func fiberAddressGenCmd() *cobra.Command { + fiberAddressGenCmd := &cobra.Command{ + Use: "fiberAddressGen", + Short: "Generate addresses and seeds for a new fiber coin", + Long: `Addresses are written in a format that can be copied into fiber.toml + for configuring distribution addresses. Addresses along with their seeds are written to a csv file, + these seeds can be imported into the wallet to access distribution coins.`, + SilenceUsage: true, + RunE: func(c *cobra.Command, args []string) (err error) { + if len(args) > 0 { + return errors.New("this command does not take any positional arguments") + } + + fiberNumAddresses, err := c.Flags().GetInt("num") + if err != nil { + return nil + } + + entropy, err := c.Flags().GetInt("entropy") + if err != nil { + return nil + } + + addrsFilename, err := c.Flags().GetString("addrs-file") + if err != nil { + return nil + } + + seedsFilename, err := c.Flags().GetString("seeds-file") + if err != nil { + return nil + } + + overwrite, err := c.Flags().GetBool("overwrite") + if err != nil { + return nil + } + + if fiberNumAddresses < 1 { + return errors.New("num must be > 0") + } + + switch entropy { + case 128, 256: + default: + return errors.New("entropy must be 128 or 256") + } + + addrs := make([]cipher.Address, fiberNumAddresses) + seeds := make([]string, fiberNumAddresses) + + for i := 0; i < fiberNumAddresses; i++ { + e, err := bip39.NewEntropy(entropy) + if err != nil { + return err + } + + seed, err := bip39.NewMnemonic(e) + if err != nil { + return err + } + + _, seckey, err := cipher.GenerateDeterministicKeyPair([]byte(seed)) + if err != nil { + return err + } + addr := cipher.MustAddressFromSecKey(seckey) + + seeds[i] = seed + addrs[i] = addr + } + + _, err = os.Stat(addrsFilename) + if err != nil { + if !os.IsNotExist(err) { + return err + } + } else if !overwrite { + return fmt.Errorf("-addrs-file %q already exists. Use -overwrite to force writing", addrsFilename) + } + + _, err = os.Stat(seedsFilename) + if err != nil { + if !os.IsNotExist(err) { + return err + } + } else if !overwrite { + return fmt.Errorf("-seeds-file %q already exists. Use -overwrite to force writing", seedsFilename) + } + + addrsF, err := os.Create(addrsFilename) + if err != nil { + return err + } + defer func() { + cErr := addrsF.Close() + if cErr != nil { + err = cErr + } + }() + + seedsF, err := os.Create(seedsFilename) + defer func() { + cErr := seedsF.Close() + if cErr != nil { + err = cErr + } + }() + + for i, a := range addrs { + if _, err := fmt.Fprintf(addrsF, "\"%s\",\n", a); err != nil { + return err + } + if _, err := fmt.Fprintf(seedsF, "\"%s\",\"%s\"\n", a, seeds[i]); err != nil { + return err + } + } + + return nil + }, + } + + fiberAddressGenCmd.Flags().IntP("num", "n", 100, "Number of addresses to generate") + fiberAddressGenCmd.Flags().IntP("entropy", "e", 128, "Entropy of the autogenerated bip39 seeds. Can be 128 or 256") + fiberAddressGenCmd.Flags().StringP("addrs-file", "a", "addresses.txt", "Output file for the generated addresses in fiber.toml format") + fiberAddressGenCmd.Flags().StringP("seeds-file", "s", "seeds.csv", "Output file for the generated addresses and seeds in a csv") + fiberAddressGenCmd.Flags().BoolP("overwrite", "o", false, "Allow overwriting any existing addrs-file or seeds-file") + + return fiberAddressGenCmd +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/addresscount.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/addresscount.go new file mode 100644 index 00000000..92769127 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/addresscount.go @@ -0,0 +1,26 @@ +package cli + +import ( + "github.com/spf13/cobra" +) + +func addresscountCmd() *cobra.Command { + return &cobra.Command{ + Short: "Get the count of addresses with unspent outputs (coins)", + Long: "Returns the count of all addresses that currently have unspent outputs (coins) associated with them.", + Use: "addresscount", + Args: cobra.NoArgs, + DisableFlagsInUseLine: true, + SilenceUsage: true, + RunE: getAddresscount, + } +} + +func getAddresscount(_ *cobra.Command, _ []string) error { + addresscount, err := apiClient.AddressCount() + if err != nil { + return err + } + + return printJSON(addresscount) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/blocks.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/blocks.go new file mode 100644 index 00000000..8015304d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/blocks.go @@ -0,0 +1,49 @@ +package cli + +import ( + "fmt" + "strconv" + + "github.com/spf13/cobra" +) + +func blocksCmd() *cobra.Command { + blocksCmd := &cobra.Command{ + Short: "Lists the content of a single block or a range of blocks", + Use: "blocks [starting block or single block seq] [ending block seq]", + Args: cobra.RangeArgs(1, 2), + DisableFlagsInUseLine: true, + SilenceUsage: true, + RunE: getBlocks, + } + + return blocksCmd +} + +func getBlocks(_ *cobra.Command, args []string) error { + var start, end string + start = args[0] + + if len(args) == 1 { + end = start + } else { + end = args[1] + } + + s, err := strconv.ParseUint(start, 10, 64) + if err != nil { + return fmt.Errorf("invalid block seq: %v, must be unsigned integer", start) + } + + e, err := strconv.ParseUint(end, 10, 64) + if err != nil { + return fmt.Errorf("invalid block seq: %v, must be unsigned integer", end) + } + + rlt, err := apiClient.BlocksInRange(s, e) + if err != nil { + return err + } + + return printJSON(rlt) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/broadcast_rawtx.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/broadcast_rawtx.go new file mode 100644 index 00000000..8ad1a6be --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/broadcast_rawtx.go @@ -0,0 +1,29 @@ +package cli + +import ( + "fmt" + + "github.com/spf13/cobra" +) + +func broadcastTxCmd() *cobra.Command { + return &cobra.Command{ + Short: "Broadcast a raw transaction to the network", + Use: "broadcastTransaction [raw transaction]", + Args: cobra.ExactArgs(1), + DisableFlagsInUseLine: true, + SilenceUsage: true, + RunE: func(_ *cobra.Command, args []string) error { + rawtx := args[0] + + txid, err := apiClient.InjectEncodedTransaction(rawtx) + if err != nil { + return err + } + + fmt.Println(txid) + return nil + }, + } + +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/check_balance.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/check_balance.go new file mode 100644 index 00000000..5e002aac --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/check_balance.go @@ -0,0 +1,259 @@ +package cli + +import ( + "fmt" + "strconv" + + "github.com/spf13/cobra" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/readable" + "github.com/SkycoinProject/skycoin/src/util/droplet" + "github.com/SkycoinProject/skycoin/src/wallet" +) + +// Balance represents an coin and hours balance +type Balance struct { + Coins string `json:"coins"` + Hours string `json:"hours"` +} + +// AddressBalances represents an address's balance +type AddressBalances struct { + Confirmed Balance `json:"confirmed"` + Spendable Balance `json:"spendable"` + Expected Balance `json:"expected"` + Address string `json:"address"` +} + +// BalanceResult represents an set of addresses' balances +type BalanceResult struct { + Confirmed Balance `json:"confirmed"` + Spendable Balance `json:"spendable"` + Expected Balance `json:"expected"` + Addresses []AddressBalances `json:"addresses"` +} + +func walletBalanceCmd() *cobra.Command { + return &cobra.Command{ + Short: "Check the balance of a wallet", + Use: "walletBalance [wallet]", + Args: cobra.ExactArgs(1), + DisableFlagsInUseLine: true, + RunE: checkWltBalance, + } +} + +func addressBalanceCmd() *cobra.Command { + return &cobra.Command{ + Short: "Check the balance of specific addresses", + Use: "addressBalance [addresses]", + Long: `Check balance of specific addresses, join multiple addresses with space. + example: addressBalance "$addr1 $addr2 $addr3"`, + Args: cobra.MinimumNArgs(1), + DisableFlagsInUseLine: true, + SilenceUsage: true, + RunE: addrBalance, + } +} + +func checkWltBalance(c *cobra.Command, args []string) error { + w := args[0] + balRlt, err := CheckWalletBalance(apiClient, w) + switch err.(type) { + case nil: + case WalletLoadError: + printHelp(c) + return err + default: + return err + } + + return printJSON(balRlt) +} + +func addrBalance(_ *cobra.Command, args []string) error { + numArgs := len(args) + + addrs := make([]string, numArgs) + + var err error + for i := 0; i < numArgs; i++ { + addrs[i] = args[i] + if _, err = cipher.DecodeBase58Address(addrs[i]); err != nil { + return fmt.Errorf("invalid address: %v, err: %v", addrs[i], err) + } + } + + balRlt, err := GetBalanceOfAddresses(apiClient, addrs) + if err != nil { + return err + } + + return printJSON(balRlt) +} + +// PUBLIC + +// CheckWalletBalance returns the total and individual balances of addresses in a wallet file +func CheckWalletBalance(c GetOutputser, walletFile string) (*BalanceResult, error) { + wlt, err := wallet.Load(walletFile) + if err != nil { + return nil, WalletLoadError{err} + } + + var addrs []string + addresses := wlt.GetAddresses() + for _, a := range addresses { + addrs = append(addrs, a.String()) + } + + return GetBalanceOfAddresses(c, addrs) +} + +// GetBalanceOfAddresses returns the total and individual balances of a set of addresses +func GetBalanceOfAddresses(c GetOutputser, addrs []string) (*BalanceResult, error) { + outs, err := c.OutputsForAddresses(addrs) + if err != nil { + return nil, err + } + + return getBalanceOfAddresses(outs, addrs) +} + +func getBalanceOfAddresses(outs *readable.UnspentOutputsSummary, addrs []string) (*BalanceResult, error) { + addrsMap := make(map[string]struct{}, len(addrs)) + for _, a := range addrs { + addrsMap[a] = struct{}{} + } + + addrBalances := make(map[string]struct { + confirmed, spendable, expected wallet.Balance + }, len(addrs)) + + // Count confirmed balances + for _, o := range outs.HeadOutputs { + if _, ok := addrsMap[o.Address]; !ok { + return nil, fmt.Errorf("Found address %s in GetUnspentOutputs result, but this address wasn't requested", o.Address) + } + + amt, err := droplet.FromString(o.Coins) + if err != nil { + return nil, fmt.Errorf("droplet.FromString failed: %v", err) + } + + b := addrBalances[o.Address] + b.confirmed.Coins += amt + b.confirmed.Hours += o.CalculatedHours + + addrBalances[o.Address] = b + } + + // Count spendable balances + for _, o := range outs.SpendableOutputs() { + if _, ok := addrsMap[o.Address]; !ok { + return nil, fmt.Errorf("Found address %s in GetUnspentOutputs result, but this address wasn't requested", o.Address) + } + + amt, err := droplet.FromString(o.Coins) + if err != nil { + return nil, fmt.Errorf("droplet.FromString failed: %v", err) + } + + b := addrBalances[o.Address] + b.spendable.Coins += amt + b.spendable.Hours += o.CalculatedHours + + addrBalances[o.Address] = b + } + + // Count predicted balances + for _, o := range outs.ExpectedOutputs() { + if _, ok := addrsMap[o.Address]; !ok { + return nil, fmt.Errorf("Found address %s in GetUnspentOutputs result, but this address wasn't requested", o.Address) + } + + amt, err := droplet.FromString(o.Coins) + if err != nil { + return nil, fmt.Errorf("droplet.FromString failed: %v", err) + } + + b := addrBalances[o.Address] + b.expected.Coins += amt + b.expected.Hours += o.CalculatedHours + + addrBalances[o.Address] = b + } + + toBalance := func(b wallet.Balance) (Balance, error) { + coins, err := droplet.ToString(b.Coins) + if err != nil { + return Balance{}, err + } + + return Balance{ + Coins: coins, + Hours: strconv.FormatUint(b.Hours, 10), + }, nil + } + + var totalConfirmed, totalSpendable, totalExpected wallet.Balance + balRlt := &BalanceResult{ + Addresses: make([]AddressBalances, len(addrs)), + } + + for i, a := range addrs { + b := addrBalances[a] + var err error + + balRlt.Addresses[i].Address = a + + totalConfirmed, err = totalConfirmed.Add(b.confirmed) + if err != nil { + return nil, err + } + + totalSpendable, err = totalSpendable.Add(b.spendable) + if err != nil { + return nil, err + } + + totalExpected, err = totalExpected.Add(b.expected) + if err != nil { + return nil, err + } + + balRlt.Addresses[i].Confirmed, err = toBalance(b.confirmed) + if err != nil { + return nil, err + } + + balRlt.Addresses[i].Spendable, err = toBalance(b.spendable) + if err != nil { + return nil, err + } + + balRlt.Addresses[i].Expected, err = toBalance(b.expected) + if err != nil { + return nil, err + } + } + + var err error + balRlt.Confirmed, err = toBalance(totalConfirmed) + if err != nil { + return nil, err + } + + balRlt.Spendable, err = toBalance(totalSpendable) + if err != nil { + return nil, err + } + + balRlt.Expected, err = toBalance(totalExpected) + if err != nil { + return nil, err + } + + return balRlt, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/check_balance_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/check_balance_test.go new file mode 100644 index 00000000..c2cff384 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/check_balance_test.go @@ -0,0 +1,262 @@ +package cli + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/readable" + "github.com/SkycoinProject/skycoin/src/testutil" +) + +func TestGetBalanceOfAddresses(t *testing.T) { + addrs := []string{ + testutil.MakeAddress().String(), + testutil.MakeAddress().String(), + testutil.MakeAddress().String(), + } + + hashes := make([]string, 10) + for i := 0; i < len(hashes); i++ { + h := testutil.RandSHA256(t) + hashes[i] = h.Hex() + } + + cases := []struct { + name string + outs readable.UnspentOutputsSummary + addrs []string + result *BalanceResult + err error + }{ + { + name: "confirmed == spendable == expected", + outs: readable.UnspentOutputsSummary{ + HeadOutputs: readable.UnspentOutputs{ + { + Hash: hashes[0], + Address: addrs[0], + Coins: "99.900000", + CalculatedHours: 3000, + }, + { + Hash: hashes[1], + Address: addrs[0], + Coins: "0.100000", + CalculatedHours: 120000, + }, + { + Hash: hashes[2], + Address: addrs[2], + Coins: "23.111111", + CalculatedHours: 123, + }, + }, + }, + addrs: addrs, + result: &BalanceResult{ + Confirmed: Balance{ + Coins: "123.111111", + Hours: "123123", + }, + Spendable: Balance{ + Coins: "123.111111", + Hours: "123123", + }, + Expected: Balance{ + Coins: "123.111111", + Hours: "123123", + }, + Addresses: []AddressBalances{ + { + Confirmed: Balance{ + Coins: "100.000000", + Hours: "123000", + }, + Spendable: Balance{ + Coins: "100.000000", + Hours: "123000", + }, + Expected: Balance{ + Coins: "100.000000", + Hours: "123000", + }, + Address: addrs[0], + }, + { + Confirmed: Balance{ + Coins: "0.000000", + Hours: "0", + }, + Spendable: Balance{ + Coins: "0.000000", + Hours: "0", + }, + Expected: Balance{ + Coins: "0.000000", + Hours: "0", + }, + Address: addrs[1], + }, + { + Confirmed: Balance{ + Coins: "23.111111", + Hours: "123", + }, + Spendable: Balance{ + Coins: "23.111111", + Hours: "123", + }, + Expected: Balance{ + Coins: "23.111111", + Hours: "123", + }, + Address: addrs[2], + }, + }, + }, + }, + + { + name: "confirmed != spendable != expected", + outs: readable.UnspentOutputsSummary{ + HeadOutputs: readable.UnspentOutputs{ + { + Hash: hashes[0], + Address: addrs[0], + Coins: "89.900000", + CalculatedHours: 3000, + }, + { + Hash: hashes[1], + Address: addrs[0], + Coins: "0.100000", + CalculatedHours: 97000, + }, + { + Hash: hashes[5], + Address: addrs[0], + Coins: "10.000000", + CalculatedHours: 23000, + }, + { + Hash: hashes[2], + Address: addrs[2], + Coins: "1.000001", + CalculatedHours: 23, + }, + { + Hash: hashes[6], + Address: addrs[2], + Coins: "22.111110", + CalculatedHours: 100, + }, + }, + OutgoingOutputs: readable.UnspentOutputs{ + { + Hash: hashes[5], + Address: addrs[0], + Coins: "10.000000", + CalculatedHours: 23000, + }, + { + Hash: hashes[6], + Address: addrs[2], + Coins: "22.111110", + CalculatedHours: 100, + }, + }, + IncomingOutputs: readable.UnspentOutputs{ + { + Hash: hashes[3], + Address: addrs[1], + Coins: "1.000000", + CalculatedHours: 333, + }, + { + Hash: hashes[4], + Address: addrs[1], + Coins: "0.111111", + CalculatedHours: 0, + }, + { + Hash: hashes[7], + Address: addrs[2], + Coins: "44.999999", + CalculatedHours: 433, + }, + }, + }, + addrs: addrs, + result: &BalanceResult{ + Confirmed: Balance{ + Coins: "123.111111", + Hours: "123123", + }, + Spendable: Balance{ + Coins: "91.000001", + Hours: "100023", + }, + Expected: Balance{ + Coins: "137.111111", + Hours: "100789", + }, + Addresses: []AddressBalances{ + { + Confirmed: Balance{ + Coins: "100.000000", + Hours: "123000", + }, + Spendable: Balance{ + Coins: "90.000000", + Hours: "100000", + }, + Expected: Balance{ + Coins: "90.000000", + Hours: "100000", + }, + Address: addrs[0], + }, + { + Confirmed: Balance{ + Coins: "0.000000", + Hours: "0", + }, + Spendable: Balance{ + Coins: "0.000000", + Hours: "0", + }, + Expected: Balance{ + Coins: "1.111111", + Hours: "333", + }, + Address: addrs[1], + }, + { + Confirmed: Balance{ + Coins: "23.111111", + Hours: "123", + }, + Spendable: Balance{ + Coins: "1.000001", + Hours: "23", + }, + Expected: Balance{ + Coins: "46.000000", + Hours: "456", + }, + Address: addrs[2], + }, + }, + }, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + result, err := getBalanceOfAddresses(&tc.outs, tc.addrs) + require.Equal(t, tc.err, err) + require.Equal(t, tc.result, result) + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/checkdb.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/checkdb.go new file mode 100644 index 00000000..5b6b53a4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/checkdb.go @@ -0,0 +1,141 @@ +package cli + +import ( + "fmt" + "os" + "time" + + "github.com/boltdb/bolt" + "github.com/spf13/cobra" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/util/apputil" + "github.com/SkycoinProject/skycoin/src/visor" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +const ( + blockchainPubkey = "0328c576d3f420e7682058a981173a4b374c7cc5ff55bf394d3cf57059bbe6456a" +) + +// wrapDB calls dbutil.WrapDB and disables all logging +func wrapDB(db *bolt.DB) *dbutil.DB { + wdb := dbutil.WrapDB(db) + wdb.ViewLog = false + wdb.ViewTrace = false + wdb.UpdateLog = false + wdb.UpdateTrace = false + wdb.DurationLog = false + return wdb +} + +func checkDBCmd() *cobra.Command { + return &cobra.Command{ + Short: "Verify the database", + Use: "checkdb [db path]", + Long: `Checks if the given database file contains valid skycoin blockchain data. + If no argument is specificed, the default data.db in $HOME/.$COIN/ will be checked.`, + Args: cobra.MaximumNArgs(1), + DisableFlagsInUseLine: true, + SilenceUsage: true, + RunE: checkDB, + } +} + +func checkDB(_ *cobra.Command, args []string) error { + // get db path + dbPath := "" + if len(args) > 0 { + dbPath = args[0] + } + dbPath, err := resolveDBPath(cliConfig, dbPath) + if err != nil { + return err + } + + // check if this file exists + if _, err := os.Stat(dbPath); os.IsNotExist(err) { + return fmt.Errorf("db file: %v does not exist", dbPath) + } + + db, err := bolt.Open(dbPath, 0600, &bolt.Options{ + Timeout: 5 * time.Second, + ReadOnly: true, + }) + + if err != nil { + return fmt.Errorf("open db failed: %v", err) + } + pubkey, err := cipher.PubKeyFromHex(blockchainPubkey) + if err != nil { + return fmt.Errorf("decode blockchain pubkey failed: %v", err) + } + + go func() { + apputil.CatchInterrupt(quitChan) + }() + + if err := visor.CheckDatabase(wrapDB(db), pubkey, quitChan); err != nil { + if err == visor.ErrVerifyStopped { + return nil + } + return fmt.Errorf("checkdb failed: %v", err) + } + + fmt.Println("check db success") + return nil +} + +func checkDBEncodingCmd() *cobra.Command { + return &cobra.Command{ + Short: "Verify the database data encoding", + Use: "checkDBDecoding [db path]", + Long: `Verify the generated binary encoders match the dynamic encoders for database data. + If no argument is specificed, the default data.db in $HOME/.$COIN/ will be checked.`, + Args: cobra.MaximumNArgs(1), + DisableFlagsInUseLine: true, + SilenceUsage: true, + RunE: checkDBDecoding, + } +} + +func checkDBDecoding(_ *cobra.Command, args []string) error { + // get db path + dbPath := "" + if len(args) > 0 { + dbPath = args[0] + } + dbPath, err := resolveDBPath(cliConfig, dbPath) + if err != nil { + return err + } + + // check if this file exists + if _, err := os.Stat(dbPath); os.IsNotExist(err) { + return fmt.Errorf("db file: %v does not exist", dbPath) + } + + db, err := bolt.Open(dbPath, 0600, &bolt.Options{ + Timeout: 5 * time.Second, + ReadOnly: true, + }) + + if err != nil { + return fmt.Errorf("open db failed: %v", err) + } + + go func() { + apputil.CatchInterrupt(quitChan) + }() + + if err := visor.VerifyDBSkyencoderSafe(wrapDB(db), quitChan); err != nil { + if err == visor.ErrVerifyStopped { + return nil + } + return fmt.Errorf("checkDBDecoding failed: %v", err) + } + + fmt.Println("check db decoding success") + return nil + +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/cli.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/cli.go new file mode 100644 index 00000000..acd289a6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/cli.go @@ -0,0 +1,320 @@ +/* +Package cli implements the CLI cmd's methods. + +Includes methods for manipulating wallets files and interacting with the +REST API to query a skycoin node's status. +*/ +package cli + +import ( + "encoding/json" + "errors" + "flag" + "fmt" + "net/url" + "path/filepath" + "syscall" + + "os" + + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "golang.org/x/crypto/ssh/terminal" + + "github.com/SkycoinProject/skycoin/src/api" + "github.com/SkycoinProject/skycoin/src/util/file" + "github.com/SkycoinProject/skycoin/src/wallet" +) + +var ( + // Version is the CLI Version + Version = "0.27.0" +) + +const ( + walletExt = "." + wallet.WalletExt + defaultCoin = "skycoin" + defaultRPCAddress = "http://127.0.0.1:6420" + defaultDataDir = "$HOME/.$COIN/" +) + +var ( + envVarsHelp = fmt.Sprintf(`ENVIRONMENT VARIABLES: + RPC_ADDR: Address of RPC node. Must be in scheme://host format. Default "%s" + RPC_USER: Username for RPC API, if enabled in the RPC. + RPC_PASS: Password for RPC API, if enabled in the RPC. + COIN: Name of the coin. Default "%s" + DATA_DIR: Directory where everything is stored. Default "%s"`, defaultRPCAddress, defaultCoin, defaultDataDir) + + helpTemplate = fmt.Sprintf(`USAGE:{{if .Runnable}} + {{.UseLine}}{{end}}{{if .HasAvailableSubCommands}} + {{.CommandPath}} [command] [flags] [arguments...]{{end}}{{with (or .Long .Short)}} + +DESCRIPTION: + {{. | trimTrailingWhitespaces}}{{end}}{{if .HasExample}} + +EXAMPLES: +{{.Example}}{{end}}{{if .HasAvailableSubCommands}} + +COMMANDS:{{range .Commands}}{{if (or .IsAvailableCommand (eq .Name "help"))}} + {{rpad .Name .NamePadding }} {{.Short}}{{end}}{{end}}{{end}}{{if .HasAvailableLocalFlags}} + +FLAGS: +{{.LocalFlags.FlagUsages | trimTrailingWhitespaces}}{{end}}{{if .HasAvailableInheritedFlags}} + +GLOBAL FLAGS: +{{.InheritedFlags.FlagUsages | trimTrailingWhitespaces}}{{end}}{{if .HasHelpSubCommands}} + +Additional help topics:{{range .Commands}}{{if .IsAdditionalHelpTopicCommand}} + {{rpad .CommandPath .CommandPathPadding}} {{.Short}}{{end}}{{end}}{{end}}{{if .HasAvailableSubCommands}} + +Use "{{.CommandPath}} [command] --help" for more information about a command.{{end}} + +%s +`, envVarsHelp) + + // ErrWalletName is returned if the wallet file name is invalid + ErrWalletName = fmt.Errorf("error wallet file name, must have %s extension", walletExt) + // ErrAddress is returned if an address is invalid + ErrAddress = errors.New("invalid address") + // ErrJSONMarshal is returned if JSON marshaling failed + ErrJSONMarshal = errors.New("json marshal failed") +) + +var ( + cliConfig Config + apiClient *api.Client + quitChan = make(chan struct{}) +) + +// Config cli's configuration struct +type Config struct { + DataDir string `json:"data_directory"` + Coin string `json:"coin"` + RPCAddress string `json:"rpc_address"` + RPCUsername string `json:"-"` + RPCPassword string `json:"-"` +} + +// LoadConfig loads config from environment, prior to parsing CLI flags +func LoadConfig() (Config, error) { + // get coin name from env + coin := os.Getenv("COIN") + if coin == "" { + coin = defaultCoin + } + + // get rpc address from env + rpcAddr := os.Getenv("RPC_ADDR") + if rpcAddr == "" { + rpcAddr = defaultRPCAddress + } + + if _, err := url.Parse(rpcAddr); err != nil { + return Config{}, errors.New("RPC_ADDR must be in scheme://host format") + } + + rpcUser := os.Getenv("RPC_USER") + rpcPass := os.Getenv("RPC_PASS") + + home := file.UserHome() + + // get data dir dir from env + dataDir := os.Getenv("DATA_DIR") + if dataDir == "" { + dataDir = filepath.Join(home, fmt.Sprintf(".%s", coin)) + } + + if os.Getenv("WALLET_DIR") != "" { + return Config{}, errors.New("the envvar WALLET_DIR is no longer recognized by the CLI tool. Please review the updated CLI docs to learn how to specify the wallet file for your desired action") + } + if os.Getenv("WALLET_NAME") != "" { + return Config{}, errors.New("the envvar WALLET_NAME is no longer recognized by the CLI tool. Please review the updated CLI docs to learn how to specify the wallet file for your desired action") + } + + return Config{ + DataDir: dataDir, + Coin: coin, + RPCAddress: rpcAddr, + RPCUsername: rpcUser, + RPCPassword: rpcPass, + }, nil +} + +// FullDBPath returns the joined data directory and db file name path +func (c Config) FullDBPath() string { + return filepath.Join(c.DataDir, "data.db") +} + +func resolveDBPath(cfg Config, db string) (string, error) { + if db == "" { + db = cfg.FullDBPath() + } + + // If db is only the basename, use the default data dir + if filepath.Base(db) == db { + db = filepath.Join(cfg.DataDir, db) + } + + absDB, err := filepath.Abs(db) + if err != nil { + return "", fmt.Errorf("Invalid data path %s: %v", db, err) + } + return absDB, nil +} + +// NewCLI creates a cli instance +func NewCLI(cfg Config) (*cobra.Command, error) { + apiClient = api.NewClient(cfg.RPCAddress) + apiClient.SetAuth(cfg.RPCUsername, cfg.RPCPassword) + + cliConfig = cfg + + skyCLI := &cobra.Command{ + Short: fmt.Sprintf("The %s command line interface", cfg.Coin), + Use: fmt.Sprintf("%s-cli", cfg.Coin), + } + + commands := []*cobra.Command{ + addPrivateKeyCmd(), + addressBalanceCmd(), + addressGenCmd(), + fiberAddressGenCmd(), + addressOutputsCmd(), + blocksCmd(), + broadcastTxCmd(), + checkDBCmd(), + checkDBEncodingCmd(), + createRawTxnCmd(), + createRawTxnV2Cmd(), + signTxnCmd(), + decodeRawTxnCmd(), + encodeJSONTxnCmd(), + decryptWalletCmd(), + encryptWalletCmd(), + lastBlocksCmd(), + listAddressesCmd(), + listWalletsCmd(), + sendCmd(), + showConfigCmd(), + showSeedCmd(), + statusCmd(), + transactionCmd(), + verifyTransactionCmd(), + verifyAddressCmd(), + versionCmd(), + walletCreateCmd(), + walletAddAddressesCmd(), + walletKeyExportCmd(), + walletBalanceCmd(), + walletHisCmd(), + walletOutputsCmd(), + richlistCmd(), + addressTransactionsCmd(), + pendingTransactionsCmd(), + addresscountCmd(), + distributeGenesisCmd(), + } + + skyCLI.Version = Version + skyCLI.SuggestionsMinimumDistance = 1 + skyCLI.AddCommand(commands...) + + skyCLI.SetHelpTemplate(helpTemplate) + skyCLI.SetUsageTemplate(helpTemplate) + pflag.CommandLine.AddGoFlagSet(flag.CommandLine) + + return skyCLI, nil +} + +func printHelp(c *cobra.Command) { + c.Printf("See '%s %s --help'\n", c.Parent().Name(), c.Name()) +} + +func formatJSON(obj interface{}) ([]byte, error) { + d, err := json.MarshalIndent(obj, "", " ") + if err != nil { + return nil, ErrJSONMarshal + } + return d, nil +} + +func printJSON(obj interface{}) error { + d, err := formatJSON(obj) + if err != nil { + return err + } + + fmt.Println(string(d)) + + return nil +} + +// readPasswordFromTerminal promotes user to enter password and read it. +func readPasswordFromTerminal() ([]byte, error) { + // Promotes to enter the wallet password + fmt.Fprint(os.Stdout, "enter password:") + bp, err := terminal.ReadPassword(int(syscall.Stdin)) //nolint:unconvert + if err != nil { + return nil, err + } + fmt.Fprintln(os.Stdout, "") + return bp, nil +} + +// PUBLIC + +// WalletLoadError is returned if a wallet could not be loaded +type WalletLoadError struct { + error +} + +func (e WalletLoadError) Error() string { + return fmt.Sprintf("Load wallet failed: %v", e.error) +} + +// WalletSaveError is returned if a wallet could not be saved +type WalletSaveError struct { + error +} + +func (e WalletSaveError) Error() string { + return fmt.Sprintf("Save wallet failed: %v", e.error) +} + +// PasswordReader is an interface for getting password +type PasswordReader interface { + Password() ([]byte, error) +} + +// PasswordFromBytes represents an implementation of PasswordReader, +// which reads password from the bytes itself. +type PasswordFromBytes []byte + +// Password implements the PasswordReader's Password method +func (p PasswordFromBytes) Password() ([]byte, error) { + return []byte(p), nil +} + +// PasswordFromTerm reads password from terminal +type PasswordFromTerm struct{} + +// Password implements the PasswordReader's Password method +func (p PasswordFromTerm) Password() ([]byte, error) { + v, err := readPasswordFromTerminal() + if err != nil { + return nil, err + } + + return v, nil +} + +// NewPasswordReader creats a PasswordReader instance, +// reads password from the input bytes first, if it's empty, then read from terminal. +func NewPasswordReader(p []byte) PasswordReader { + if len(p) != 0 { + return PasswordFromBytes(p) + } + + return PasswordFromTerm{} +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/cli_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/cli_test.go new file mode 100644 index 00000000..9c2a90eb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/cli_test.go @@ -0,0 +1,72 @@ +package cli + +import ( + "fmt" + "os" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/testutil" +) + +func Example() { + // In cmd/skycoin-cli/skycion-cli.go: + cfg, err := LoadConfig() + if err != nil { + fmt.Println(err) + os.Exit(1) + } + + cli, err := NewCLI(cfg) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + + if err := cli.Execute(); err != nil { + fmt.Println(err) + os.Exit(1) + } +} + +func TestLoadConfig(t *testing.T) { + t.Run("set COIN", func(t *testing.T) { + val := "foocoin" + os.Setenv("COIN", val) + defer os.Unsetenv("COIN") + + cfg, err := LoadConfig() + require.NoError(t, err) + require.Equal(t, cfg.Coin, val) + }) + + t.Run("set RPC_ADDR", func(t *testing.T) { + val := "http://111.22.33.44:5555" + os.Setenv("RPC_ADDR", val) + defer os.Unsetenv("RPC_ADDR") + + cfg, err := LoadConfig() + require.NoError(t, err) + require.Equal(t, cfg.RPCAddress, val) + }) + + t.Run("set RPC_ADDR invalid", func(t *testing.T) { + val := "111.22.33.44:5555" + os.Setenv("RPC_ADDR", val) + defer os.Unsetenv("RPC_ADDR") + + _, err := LoadConfig() + testutil.RequireError(t, err, "RPC_ADDR must be in scheme://host format") + }) + + t.Run("set DATA_DIR", func(t *testing.T) { + val := "/home/foo/" + os.Setenv("DATA_DIR", val) + defer os.Unsetenv("DATA_DIR") + + cfg, err := LoadConfig() + require.NoError(t, err) + require.Equal(t, cfg.DataDir, val) + }) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/create_rawtx.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/create_rawtx.go new file mode 100644 index 00000000..723489cf --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/create_rawtx.go @@ -0,0 +1,996 @@ +package cli + +import ( + "encoding/csv" + "encoding/json" + "errors" + "fmt" + "os" + "strings" + + "github.com/spf13/cobra" + + "github.com/SkycoinProject/skycoin/src/api" + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/readable" + "github.com/SkycoinProject/skycoin/src/transaction" + "github.com/SkycoinProject/skycoin/src/util/droplet" + "github.com/SkycoinProject/skycoin/src/util/fee" + "github.com/SkycoinProject/skycoin/src/util/mathutil" + "github.com/SkycoinProject/skycoin/src/visor" + "github.com/SkycoinProject/skycoin/src/wallet" +) + +var ( + // ErrTemporaryInsufficientBalance is returned if a wallet does not have enough balance for a spend, but will have enough after unconfirmed transactions confirm + ErrTemporaryInsufficientBalance = errors.New("balance is not sufficient. Balance will be sufficient after unconfirmed transactions confirm") +) + +// SendAmount represents an amount to send to an address +type SendAmount struct { + Addr string + Coins uint64 +} + +type sendAmountJSON struct { + Addr string `json:"addr"` + Coins string `json:"coins"` +} + +func createRawTxnCmd() *cobra.Command { + createRawTxnCmd := &cobra.Command{ + Short: "Create a raw transaction that can be broadcast to the network later", + Use: "createRawTransaction [wallet] [to address] [amount]", + Long: `Create a raw transaction that can be broadcast to the network later. + + Note: The [amount] argument is the coins you will spend, with decimal formatting, e.g. 1, 1.001 or 1.000000. + + The [to address] and [amount] arguments can be replaced with the --many/-m or the --csv option. + + Use caution when using the "-p" command. If you have command history enabled + your wallet encryption password can be recovered from the history log. If you + do not include the "-p" option you will be prompted to enter your password + after you enter your command.`, + SilenceUsage: true, + Args: cobra.MinimumNArgs(1), + RunE: func(c *cobra.Command, args []string) error { + jsonOutput, err := c.Flags().GetBool("json") + if err != nil { + return err + } + + txn, err := createRawTxnCmdHandler(c, args) + switch err.(type) { + case nil: + case WalletLoadError: + printHelp(c) + return err + default: + return err + } + + rawTxn, err := txn.SerializeHex() + if err != nil { + return err + } + + if jsonOutput { + return printJSON(struct { + RawTx string `json:"rawtx"` + }{ + RawTx: rawTxn, + }) + } + + fmt.Println(rawTxn) + + return nil + }, + } + + createRawTxnCmd.Flags().StringP("from-address", "a", "", "From address in wallet") + createRawTxnCmd.Flags().StringP("change-address", "c", "", `Specify the change address. +Defaults to one of the spending addresses (deterministic wallets) or to a new change address (bip44 wallets).`) + createRawTxnCmd.Flags().StringP("many", "m", "", `use JSON string to set multiple receive addresses and coins, +example: -m '[{"addr":"$addr1", "coins": "10.2"}, {"addr":"$addr2", "coins": "20"}]'`) + createRawTxnCmd.Flags().StringP("password", "p", "", "Wallet password") + createRawTxnCmd.Flags().BoolP("json", "j", false, "Returns the results in JSON format.") + createRawTxnCmd.Flags().String("csv", "", "CSV file containing addresses and amounts to send") + + return createRawTxnCmd +} + +func createRawTxnV2Cmd() *cobra.Command { + createRawTxnCmd := &cobra.Command{ + Short: "Create a raw transaction that can be broadcast to the network later", + Use: "createRawTransactionV2 [wallet] [to address] [amount]", + Long: `Create a raw transaction that can be broadcast to the network later. + + Note: The [amount] argument is the coins you will spend, with decimal formatting, e.g. 1, 1.001 or 1.000000. + + The [to address] and [amount] arguments can be replaced with the --csv option., + + Use caution when using the "-p" command. If you have command history enabled + your wallet encryption password can be recovered from the history log. If you + do not include the "-p" option you will be prompted to enter your password + after you enter your command.`, + SilenceUsage: true, + Args: cobra.MinimumNArgs(1), + RunE: func(c *cobra.Command, args []string) error { + jsonOutput, err := c.Flags().GetBool("json") + if err != nil { + return err + } + + req, err := makeWalletCreateTxnRequest(c, args) + if err != nil { + return err + } + + rsp, err := apiClient.WalletCreateTransaction(*req) + if err != nil { + return err + } + + if jsonOutput { + return printJSON(rsp) + } + + fmt.Println(rsp.EncodedTransaction) + + return nil + }, + } + + createRawTxnCmd.Flags().StringP("from-address", "a", "", "From address in wallet") + createRawTxnCmd.Flags().StringP("change-address", "c", "", `Specify the change address. + Defaults to one of the spending addresses (deterministic wallets) or to a new change address (bip44 wallets).`) + createRawTxnCmd.Flags().String("csv", "", "CSV file containing addresses and amounts to send") + createRawTxnCmd.Flags().StringP("password", "p", "", "Wallet password") + createRawTxnCmd.Flags().BoolP("unsign", "", false, "Do not sign the transaction") + createRawTxnCmd.Flags().BoolP("json", "j", false, "Returns the results in JSON format.") + + createRawTxnCmd.Flags().BoolP("ignore-unconfirmed", "", false, "Ignore unconfirmed transactions") + createRawTxnCmd.Flags().StringP("hours-selection-type", "", transaction.HoursSelectionTypeAuto, "Hours selection type") + createRawTxnCmd.Flags().StringP("hours-selection-mode", "", transaction.HoursSelectionModeShare, "Hours selection mode") + createRawTxnCmd.Flags().StringP("hours-selection-share-factor", "", "0.5", "Hour selection share factor") + + return createRawTxnCmd +} + +func makeWalletCreateTxnRequest(c *cobra.Command, args []string) (*api.WalletCreateTransactionRequest, error) { + unsign, err := c.Flags().GetBool("unsign") + if err != nil { + return nil, err + } + + walletFile := args[0] + w, err := wallet.Load(walletFile) + if err != nil { + return nil, err + } + + wltAddr, err := fromWalletOrAddress(c, walletFile) + if err != nil { + return nil, err + } + + var addrs []string + if wltAddr.Address != "" { + addrs = append(addrs, wltAddr.Address) + } else { + for _, addr := range w.GetAddresses() { + addrs = append(addrs, addr.String()) + } + } + + ctr, err := makeCreateTransactionRequest(c, args, addrs) + if err != nil { + return nil, err + } + + req := api.WalletCreateTransactionRequest{ + Unsigned: unsign, + WalletID: w.Filename(), + CreateTransactionRequest: *ctr, + } + + if w.IsEncrypted() && !unsign { + p, err := getPassword(c) + if err != nil { + return nil, err + } + defer func() { + p = nil + }() + req.Password = string(p) + } + return &req, nil +} + +func getPassword(c *cobra.Command) ([]byte, error) { + p, err := c.Flags().GetString("password") + if err != nil { + return nil, err + } + defer func() { + p = "" + }() + + return NewPasswordReader([]byte(p)).Password() +} + +func makeCreateTransactionRequest(c *cobra.Command, args []string, fromAddrs []string) (*api.CreateTransactionRequest, error) { + hoursSelection, err := getHoursSelection(c) + if err != nil { + return nil, err + } + + iu, err := c.Flags().GetBool("ignore-unconfirmed") + if err != nil { + return nil, err + } + + var changeAddr *string + ca, err := c.Flags().GetString("change-address") + if err != nil { + return nil, err + } + if ca != "" { + changeAddr = &ca + } + + to, err := getToAddressesV2(c, args[1:]) + if err != nil { + return nil, err + } + + return &api.CreateTransactionRequest{ + IgnoreUnconfirmed: iu, + HoursSelection: *hoursSelection, + ChangeAddress: changeAddr, + Addresses: fromAddrs, + To: to, + }, nil +} + +func getToAddressesV2(c *cobra.Command, args []string) ([]api.Receiver, error) { + csvFile, err := c.Flags().GetString("csv") + if err != nil { + return nil, err + } + + if csvFile != "" { + fields, err := openCSV(csvFile) + if err != nil { + return nil, err + } + return parseReceiversFromCSV(fields) + } + + if len(args) < 2 { + return nil, fmt.Errorf("requires at least 2 arg(s), only received %d", len(args)) + } + + toAddr := args[0] + if _, err := cipher.DecodeBase58Address(toAddr); err != nil { + return nil, err + } + + coins := args[1] + if _, err := droplet.FromString(coins); err != nil { + return nil, err + } + + return []api.Receiver{{ + Address: toAddr, + Coins: coins, + }}, nil +} +func getHoursSelection(c *cobra.Command) (*api.HoursSelection, error) { + hst, err := c.Flags().GetString("hours-selection-type") + if err != nil { + return nil, err + } + + hsm, err := c.Flags().GetString("hours-selection-mode") + if err != nil { + return nil, err + } + + sf, err := c.Flags().GetString("hours-selection-share-factor") + if err != nil { + return nil, err + } + + return &api.HoursSelection{ + Type: hst, + Mode: hsm, + ShareFactor: sf, + }, nil +} + +type walletAddress struct { + Wallet string + Address string +} + +func fromWalletOrAddress(c *cobra.Command, walletFile string) (walletAddress, error) { + address, err := c.Flags().GetString("from-address") + if err != nil { + return walletAddress{}, err + } + + wltAddr := walletAddress{ + Wallet: walletFile, + } + + wltAddr.Address = address + if wltAddr.Address == "" { + return wltAddr, nil + } + + if _, err := cipher.DecodeBase58Address(wltAddr.Address); err != nil { + return walletAddress{}, fmt.Errorf("invalid address: %s", wltAddr.Address) + } + + return wltAddr, nil +} + +func getChangeAddress(wltAddr walletAddress, chgAddr string) (string, error) { + if chgAddr == "" { + switch { + case wltAddr.Address != "": + // use the from address as change address + chgAddr = wltAddr.Address + case wltAddr.Wallet != "": + // get the default wallet's coin base address + wlt, err := wallet.Load(wltAddr.Wallet) + if err != nil { + return "", WalletLoadError{err} + } + + if wlt.EntriesLen() > 0 { + chgAddr = wlt.GetEntryAt(0).Address.String() + } else { + return "", errors.New("no change address was found") + } + default: + return "", errors.New("wallet file, from address and change address are empty") + } + } + + // validate the address + _, err := cipher.DecodeBase58Address(chgAddr) + if err != nil { + return "", fmt.Errorf("invalid change address: %s", chgAddr) + } + + return chgAddr, nil +} + +func getToAddresses(c *cobra.Command, args []string) ([]SendAmount, error) { + csvFile, err := c.Flags().GetString("csv") + if err != nil { + return nil, err + } + many, err := c.Flags().GetString("many") + if err != nil { + return nil, err + } + + if csvFile != "" && many != "" { + return nil, errors.New("-csv and -m cannot be combined") + } + + if many != "" { + return parseSendAmountsFromJSON(many) + } else if csvFile != "" { + fields, err := openCSV(csvFile) + if err != nil { + return nil, err + } + return parseSendAmountsFromCSV(fields) + } + + if len(args) < 2 { + return nil, fmt.Errorf("requires at least 2 arg(s), only received %d", len(args)) + } + + toAddr := args[0] + + if _, err := cipher.DecodeBase58Address(toAddr); err != nil { + return nil, err + } + + amt, err := getAmount(args) + if err != nil { + return nil, err + } + + return []SendAmount{{ + Addr: toAddr, + Coins: amt, + }}, nil +} + +func openCSV(csvFile string) ([][]string, error) { + f, err := os.Open(csvFile) + if err != nil { + return nil, err + } + defer f.Close() + + r := csv.NewReader(f) + return r.ReadAll() +} + +func parseSendAmountsFromCSV(fields [][]string) ([]SendAmount, error) { + var sends []SendAmount + var errs []error + for i, f := range fields { + addr := f[0] + + addr = strings.TrimSpace(addr) + + if _, err := cipher.DecodeBase58Address(addr); err != nil { + err = fmt.Errorf("[row %d] Invalid address %s: %v", i, addr, err) + errs = append(errs, err) + continue + } + + coins, err := droplet.FromString(f[1]) + if err != nil { + err = fmt.Errorf("[row %d] Invalid amount %s: %v", i, f[1], err) + errs = append(errs, err) + continue + } + + sends = append(sends, SendAmount{ + Addr: addr, + Coins: coins, + }) + } + + if len(errs) > 0 { + errMsgs := make([]string, len(errs)) + for i, err := range errs { + errMsgs[i] = err.Error() + } + + errMsg := strings.Join(errMsgs, "\n") + + return nil, errors.New(errMsg) + } + + return sends, nil +} + +func parseReceiversFromCSV(fields [][]string) ([]api.Receiver, error) { + var sends []api.Receiver + var errs []error + for i, f := range fields { + addr := f[0] + + addr = strings.TrimSpace(addr) + + if _, err := cipher.DecodeBase58Address(addr); err != nil { + err = fmt.Errorf("[row %d] Invalid address %s: %v", i, addr, err) + errs = append(errs, err) + continue + } + + _, err := droplet.FromString(f[1]) + if err != nil { + err = fmt.Errorf("[row %d] Invalid amount %s: %v", i, f[1], err) + errs = append(errs, err) + continue + } + + sends = append(sends, api.Receiver{ + Address: addr, + Coins: f[1], + }) + } + + if len(errs) > 0 { + errMsgs := make([]string, len(errs)) + for i, err := range errs { + errMsgs[i] = err.Error() + } + + errMsg := strings.Join(errMsgs, "\n") + + return nil, errors.New(errMsg) + } + + return sends, nil +} + +func parseSendAmountsFromJSON(m string) ([]SendAmount, error) { + sas := []sendAmountJSON{} + + if err := json.NewDecoder(strings.NewReader(m)).Decode(&sas); err != nil { + return nil, fmt.Errorf("invalid -m flag string, err: %v", err) + } + + sendAmts := make([]SendAmount, 0, len(sas)) + + for _, sa := range sas { + amt, err := droplet.FromString(sa.Coins) + if err != nil { + return nil, fmt.Errorf("invalid coins value in -m flag string: %v", err) + } + + sendAmts = append(sendAmts, SendAmount{ + Addr: sa.Addr, + Coins: amt, + }) + } + + return sendAmts, nil +} + +func getAmount(args []string) (uint64, error) { + amount := args[1] + amt, err := droplet.FromString(amount) + if err != nil { + return 0, fmt.Errorf("invalid amount: %v", err) + } + + return amt, nil +} + +// createRawTxnArgs are encapsulated arguments for creating a transaction +type createRawTxnArgs struct { + WalletID string + Address string + ChangeAddress string + SendAmounts []SendAmount + Password PasswordReader +} + +func parseCreateRawTxnArgs(c *cobra.Command, args []string) (*createRawTxnArgs, error) { + wltAddr, err := fromWalletOrAddress(c, args[0]) + if err != nil { + return nil, err + } + + changeAddress, err := c.Flags().GetString("change-address") + if err != nil { + return nil, err + } + chgAddr, err := getChangeAddress(wltAddr, changeAddress) + if err != nil { + return nil, err + } + + toAddrs, err := getToAddresses(c, args[1:]) + if err != nil { + return nil, err + } + if err := validateSendAmounts(toAddrs); err != nil { + return nil, err + } + + password, err := c.Flags().GetString("password") + if err != nil { + return nil, err + } + pr := NewPasswordReader([]byte(password)) + + return &createRawTxnArgs{ + WalletID: wltAddr.Wallet, + Address: wltAddr.Address, + ChangeAddress: chgAddr, + SendAmounts: toAddrs, + Password: pr, + }, nil +} + +func createRawTxnCmdHandler(c *cobra.Command, args []string) (*coin.Transaction, error) { + parsedArgs, err := parseCreateRawTxnArgs(c, args) + if err != nil { + return nil, err + } + + // TODO -- load distribution params from config? Need to allow fiber chains to be used easily + // There's too many distribution parameters to put them in command line, but we could read them from a file. + // We could also have multiple hardcoded known distribution parameters for fiber coins, in the source, + // but this wouldn't work for new fiber coins that hadn't been hardcoded yet. + if parsedArgs.Address == "" { + return CreateRawTxnFromWallet(apiClient, parsedArgs.WalletID, + parsedArgs.ChangeAddress, parsedArgs.SendAmounts, + parsedArgs.Password, params.MainNetDistribution) + } + + return CreateRawTxnFromAddress(apiClient, parsedArgs.Address, + parsedArgs.WalletID, parsedArgs.ChangeAddress, parsedArgs.SendAmounts, + parsedArgs.Password, params.MainNetDistribution) +} + +func validateSendAmounts(toAddrs []SendAmount) error { + for _, arg := range toAddrs { + // validate to address + _, err := cipher.DecodeBase58Address(arg.Addr) + if err != nil { + return ErrAddress + } + + if arg.Coins == 0 { + return errors.New("Cannot send 0 coins") + } + } + + if len(toAddrs) == 0 { + return errors.New("No destination addresses") + } + + return nil +} + +// PUBLIC + +// CreateRawTxnFromWallet creates a transaction from any address or combination of addresses in a wallet +func CreateRawTxnFromWallet(c GetOutputser, walletFile, chgAddr string, toAddrs []SendAmount, pr PasswordReader, distParams params.Distribution) (*coin.Transaction, error) { + // check change address + cAddr, err := cipher.DecodeBase58Address(chgAddr) + if err != nil { + return nil, ErrAddress + } + + // check if the change address is in wallet. + wlt, err := wallet.Load(walletFile) + if err != nil { + return nil, err + } + + _, ok := wlt.GetEntry(cAddr) + if !ok { + return nil, fmt.Errorf("change address %v is not in wallet", chgAddr) + } + + switch pr.(type) { + case nil: + if wlt.IsEncrypted() { + return nil, wallet.ErrWalletEncrypted + } + case PasswordFromBytes: + p, err := pr.Password() + if err != nil { + return nil, err + } + + if !wlt.IsEncrypted() && len(p) != 0 { + return nil, wallet.ErrWalletNotEncrypted + } + } + + var password []byte + if wlt.IsEncrypted() { + var err error + password, err = pr.Password() + if err != nil { + return nil, err + } + } + + // get all address in the wallet + totalAddrs := wlt.GetAddresses() + addrStrArray := make([]string, len(totalAddrs)) + for i, a := range totalAddrs { + addrStrArray[i] = a.String() + } + + return CreateRawTxn(c, wlt, addrStrArray, chgAddr, toAddrs, password, distParams) +} + +// CreateRawTxnFromAddress creates a transaction from a specific address in a wallet +func CreateRawTxnFromAddress(c GetOutputser, addr, walletFile, chgAddr string, toAddrs []SendAmount, pr PasswordReader, distParams params.Distribution) (*coin.Transaction, error) { + // check if the address is in the default wallet. + wlt, err := wallet.Load(walletFile) + if err != nil { + return nil, err + } + + srcAddr, err := cipher.DecodeBase58Address(addr) + if err != nil { + return nil, ErrAddress + } + + _, ok := wlt.GetEntry(srcAddr) + if !ok { + return nil, fmt.Errorf("%v address is not in wallet", addr) + } + + // validate change address + cAddr, err := cipher.DecodeBase58Address(chgAddr) + if err != nil { + return nil, ErrAddress + } + + _, ok = wlt.GetEntry(cAddr) + if !ok { + return nil, fmt.Errorf("change address %v is not in wallet", chgAddr) + } + + switch pr.(type) { + case nil: + if wlt.IsEncrypted() { + return nil, wallet.ErrWalletEncrypted + } + case PasswordFromBytes: + p, err := pr.Password() + if err != nil { + return nil, err + } + + if !wlt.IsEncrypted() && len(p) != 0 { + return nil, wallet.ErrWalletNotEncrypted + } + } + + var password []byte + if wlt.IsEncrypted() { + var err error + password, err = pr.Password() + if err != nil { + return nil, err + } + } + + return CreateRawTxn(c, wlt, []string{addr}, chgAddr, toAddrs, password, distParams) +} + +// GetOutputser implements unspent output querying +type GetOutputser interface { + OutputsForAddresses([]string) (*readable.UnspentOutputsSummary, error) +} + +// CreateRawTxn creates a transaction from a set of addresses contained in a loaded wallet.Wallet +func CreateRawTxn(c GetOutputser, wlt wallet.Wallet, inAddrs []string, chgAddr string, toAddrs []SendAmount, password []byte, distParams params.Distribution) (*coin.Transaction, error) { + if err := validateSendAmounts(toAddrs); err != nil { + return nil, err + } + + // Get unspent outputs of those addresses + outputs, err := c.OutputsForAddresses(inAddrs) + if err != nil { + return nil, err + } + + inUxs, err := outputs.SpendableOutputs().ToUxArray() + if err != nil { + return nil, err + } + + txn, err := createRawTxn(outputs, wlt, chgAddr, toAddrs, password) + if err != nil { + return nil, err + } + + // filter out unspents which are not used in transaction + var inUxsFiltered coin.UxArray + for _, h := range txn.In { + for _, u := range inUxs { + if h == u.Hash() { + inUxsFiltered = append(inUxsFiltered, u) + } + } + } + + head, err := outputs.Head.ToCoinBlockHeader() + if err != nil { + return nil, err + } + + if err := visor.VerifySingleTxnSoftConstraints(*txn, head.Time, inUxsFiltered, distParams, params.UserVerifyTxn); err != nil { + return nil, err + } + if err := visor.VerifySingleTxnHardConstraints(*txn, head, inUxsFiltered, visor.TxnSigned); err != nil { + return nil, err + } + if err := visor.VerifySingleTxnUserConstraints(*txn); err != nil { + return nil, err + } + + return txn, nil +} + +func createRawTxn(uxouts *readable.UnspentOutputsSummary, wlt wallet.Wallet, chgAddr string, toAddrs []SendAmount, password []byte) (*coin.Transaction, error) { + // Calculate total required coins + var totalCoins uint64 + for _, arg := range toAddrs { + var err error + totalCoins, err = mathutil.AddUint64(totalCoins, arg.Coins) + if err != nil { + return nil, err + } + } + + spendOutputs, err := chooseSpends(uxouts, totalCoins) + if err != nil { + return nil, err + } + + txOuts, err := makeChangeOut(spendOutputs, chgAddr, toAddrs) + if err != nil { + return nil, err + } + + f := func(w wallet.Wallet) (*coin.Transaction, error) { + keys, err := getKeys(w, spendOutputs) + if err != nil { + return nil, err + } + + return NewTransaction(spendOutputs, keys, txOuts) + } + + makeTxn := func() (*coin.Transaction, error) { + return f(wlt) + } + + if wlt.IsEncrypted() { + makeTxn = func() (*coin.Transaction, error) { + var tx *coin.Transaction + if err := wallet.GuardView(wlt, password, func(w wallet.Wallet) error { + var err error + tx, err = f(w) + return err + }); err != nil { + return nil, err + } + + return tx, nil + } + } + + return makeTxn() +} + +func chooseSpends(uxouts *readable.UnspentOutputsSummary, coins uint64) ([]transaction.UxBalance, error) { + // Convert spendable unspent outputs to []transaction.UxBalance + spendableOutputs, err := readable.OutputsToUxBalances(uxouts.SpendableOutputs()) + if err != nil { + return nil, err + } + + // Choose which unspent outputs to spend + // Use the MinimizeUxOuts strategy, since this is most likely used by + // application that may need to send frequently. + // Using fewer UxOuts will leave more available for other transactions, + // instead of waiting for confirmation. + outs, err := transaction.ChooseSpendsMinimizeUxOuts(spendableOutputs, coins, 0) + if err != nil { + // If there is not enough balance in the spendable outputs, + // see if there is enough balance when including incoming outputs + if err == transaction.ErrInsufficientBalance { + expectedOutputs, otherErr := readable.OutputsToUxBalances(uxouts.ExpectedOutputs()) + if otherErr != nil { + return nil, otherErr + } + + if _, otherErr := transaction.ChooseSpendsMinimizeUxOuts(expectedOutputs, coins, 0); otherErr != nil { + return nil, err + } + + return nil, ErrTemporaryInsufficientBalance + } + + return nil, err + } + + return outs, nil +} + +func makeChangeOut(outs []transaction.UxBalance, chgAddr string, toAddrs []SendAmount) ([]coin.TransactionOutput, error) { + var totalInCoins, totalInHours, totalOutCoins uint64 + + for _, o := range outs { + totalInCoins += o.Coins + totalInHours += o.Hours + } + + if totalInHours == 0 { + return nil, fee.ErrTxnNoFee + } + + for _, to := range toAddrs { + totalOutCoins += to.Coins + } + + if totalInCoins < totalOutCoins { + return nil, transaction.ErrInsufficientBalance + } + + outAddrs := []coin.TransactionOutput{} + changeAmount := totalInCoins - totalOutCoins + + haveChange := changeAmount > 0 + nAddrs := uint64(len(toAddrs)) + changeHours, addrHours, totalOutHours := transaction.DistributeSpendHours(totalInHours, nAddrs, haveChange) + + if err := fee.VerifyTransactionFeeForHours(totalOutHours, totalInHours-totalOutHours, params.UserVerifyTxn.BurnFactor); err != nil { + return nil, err + } + + for i, to := range toAddrs { + // check if changeHours > 0, we do not need to cap addrHours when changeHours is zero + // changeHours is zero when there is no change left or all the coinhours were used in fees + // 1) if there is no change then the remaining coinhours are evenly distributed among the destination addresses + // 2) if all the coinhours are burned in fees then all addrHours are zero by default + if changeHours > 0 { + // the coinhours are capped to a maximum of incoming coins for the address + // if incoming coins < 1 then the cap is set to 1 coinhour + + spendCoinsAmt := to.Coins / 1e6 + if spendCoinsAmt == 0 { + spendCoinsAmt = 1 + } + + // allow addrHours to be less than the incoming coins of the address but not more + if addrHours[i] > spendCoinsAmt { + // cap the addrHours, move the difference to changeHours + changeHours += addrHours[i] - spendCoinsAmt + addrHours[i] = spendCoinsAmt + } + } + + outAddrs = append(outAddrs, mustMakeUtxoOutput(to.Addr, to.Coins, addrHours[i])) + } + + if haveChange { + outAddrs = append(outAddrs, mustMakeUtxoOutput(chgAddr, changeAmount, changeHours)) + } + + return outAddrs, nil +} + +func mustMakeUtxoOutput(addr string, coins, hours uint64) coin.TransactionOutput { + uo := coin.TransactionOutput{} + uo.Address = cipher.MustDecodeBase58Address(addr) + uo.Coins = coins + uo.Hours = hours + return uo +} + +func getKeys(wlt wallet.Wallet, outs []transaction.UxBalance) ([]cipher.SecKey, error) { + keys := make([]cipher.SecKey, len(outs)) + for i, o := range outs { + entry, ok := wlt.GetEntry(o.Address) + if !ok { + return nil, fmt.Errorf("%v is not in wallet", o.Address.String()) + } + + keys[i] = entry.Secret + } + return keys, nil +} + +// NewTransaction creates a transaction. The transaction should be validated against hard and soft constraints before transmission. +func NewTransaction(utxos []transaction.UxBalance, keys []cipher.SecKey, outs []coin.TransactionOutput) (*coin.Transaction, error) { + txn := coin.Transaction{} + for _, u := range utxos { + if err := txn.PushInput(u.Hash); err != nil { + return nil, err + } + } + + for _, o := range outs { + if err := txn.PushOutput(o.Address, o.Coins, o.Hours); err != nil { + return nil, err + } + } + + txn.SignInputs(keys) + + err := txn.UpdateHeader() + if err != nil { + return nil, err + } + + return &txn, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/create_rawtx_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/create_rawtx_test.go new file mode 100644 index 00000000..1528c5c9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/create_rawtx_test.go @@ -0,0 +1,600 @@ +package cli + +import ( + "errors" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/readable" + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/transaction" + "github.com/SkycoinProject/skycoin/src/util/fee" +) + +func TestMakeChangeOut(t *testing.T) { + // single destination test + uxOuts := []transaction.UxBalance{ + { + Hash: cipher.MustSHA256FromHex("f569461182b0efe9a5c666e9a35c6602b351021c1803cc740aca548cf6db4cb2"), + Address: cipher.MustDecodeBase58Address("k3rmz3PGbTxd7KL8AL5CeHrWy35C1UcWND"), + BkSeq: 10, + Coins: 400e6, + Hours: 1, + }, + { + Hash: cipher.MustSHA256FromHex("bddf0aaf80f96c144f33ac8a27764a868d37e1c11e568063ebeb1367de859566"), + Address: cipher.MustDecodeBase58Address("A2h4iWC1SDGmS6UPezatFzEUwirLJtjFUe"), + BkSeq: 11, + Coins: 300e6, + Hours: 1, + }, + } + + spendAmt := []SendAmount{{ + Addr: "2PBmUva7J8WFsyWg979cREZkU3z2pkYjNkE", + Coins: 600e6, + }} + + chgAddr := "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ" + _, err := cipher.DecodeBase58Address(chgAddr) + require.NoError(t, err) + + txOuts, err := makeChangeOut(uxOuts, chgAddr, spendAmt) + require.NoError(t, err) + require.NotEmpty(t, txOuts) + + // Should have a change output and an output to the destination in toAddrs + require.Len(t, txOuts, 2) + + chgOut := txOuts[1] + t.Logf("chgOut:%+v\n", chgOut) + require.Equal(t, chgAddr, chgOut.Address.String()) + require.Exactly(t, uint64(100e6), chgOut.Coins) + + spendOut := txOuts[0] + require.Equal(t, spendAmt[0].Addr, spendOut.Address.String()) + require.Exactly(t, spendAmt[0].Coins, spendOut.Coins) + + require.Exactly(t, uint64(1), chgOut.Hours) + require.Exactly(t, uint64(0), spendOut.Hours) + + // multiple destination test + uxOuts = []transaction.UxBalance{ + { + Hash: cipher.MustSHA256FromHex("f569461182b0efe9a5c666e9a35c6602b351021c1803cc740aca548cf6db4cb2"), + Address: cipher.MustDecodeBase58Address("k3rmz3PGbTxd7KL8AL5CeHrWy35C1UcWND"), + BkSeq: 10, + Coins: 10e6, + Hours: 8, + }, + { + Hash: cipher.MustSHA256FromHex("bddf0aaf80f96c144f33ac8a27764a868d37e1c11e568063ebeb1367de859566"), + Address: cipher.MustDecodeBase58Address("A2h4iWC1SDGmS6UPezatFzEUwirLJtjFUe"), + BkSeq: 11, + Coins: 5e6, + Hours: 16, + }, + } + + spendAmt = []SendAmount{ + { + Addr: "2PBmUva7J8WFsyWg979cREZkU3z2pkYjNkE", + Coins: 1e6, + }, + { + Addr: "2CgSQ4FbtfbP6fJqmy75WwkW2tNsKPL2zzp", + Coins: 2e6, + }} + + _, err = cipher.DecodeBase58Address(chgAddr) + require.NoError(t, err) + + txOuts, err = makeChangeOut(uxOuts, chgAddr, spendAmt) + require.NoError(t, err) + require.NotEmpty(t, txOuts) + + // Should have a change output and two output to the destination in toAddrs + require.Len(t, txOuts, 3) + + chgOut = txOuts[2] + t.Logf("chgOut:%+v\n", chgOut) + require.Equal(t, chgAddr, chgOut.Address.String()) + require.Exactly(t, uint64(12e6), chgOut.Coins) + + for i := range spendAmt { + require.Equal(t, spendAmt[i].Addr, txOuts[i].Address.String()) + require.Exactly(t, spendAmt[i].Coins, txOuts[i].Coins) + } + + require.Exactly(t, uint64(18), chgOut.Hours) + require.Exactly(t, uint64(1), txOuts[0].Hours) + require.Exactly(t, uint64(2), txOuts[1].Hours) +} + +func TestMakeChangeOutMinOneCoinHourSend(t *testing.T) { + uxOuts := []transaction.UxBalance{ + { + Hash: cipher.MustSHA256FromHex("f569461182b0efe9a5c666e9a35c6602b351021c1803cc740aca548cf6db4cb2"), + Address: cipher.MustDecodeBase58Address("k3rmz3PGbTxd7KL8AL5CeHrWy35C1UcWND"), + BkSeq: 10, + Coins: 400e6, + Hours: 200, + }, + { + Hash: cipher.MustSHA256FromHex("bddf0aaf80f96c144f33ac8a27764a868d37e1c11e568063ebeb1367de859566"), + Address: cipher.MustDecodeBase58Address("A2h4iWC1SDGmS6UPezatFzEUwirLJtjFUe"), + BkSeq: 11, + Coins: 300e6, + Hours: 100, + }, + } + + spendAmt := []SendAmount{{ + Addr: "2PBmUva7J8WFsyWg979cREZkU3z2pkYjNkE", + Coins: 0.001e6, + }} + + chgAddr := "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ" + _, err := cipher.DecodeBase58Address(chgAddr) + require.NoError(t, err) + + txOuts, err := makeChangeOut(uxOuts, chgAddr, spendAmt) + require.NoError(t, err) + require.NotEmpty(t, txOuts) + + // Should have a change output and an output to the destination in toAddrs + require.Len(t, txOuts, 2) + + chgOut := txOuts[1] + t.Logf("chgOut:%+v\n", chgOut) + require.Equal(t, chgAddr, chgOut.Address.String()) + require.Exactly(t, uint64(699.999e6), chgOut.Coins) + + spendOut := txOuts[0] + require.Equal(t, spendAmt[0].Addr, spendOut.Address.String()) + require.Exactly(t, spendAmt[0].Coins, spendOut.Coins) + + require.Exactly(t, uint64(269), chgOut.Hours) + require.Exactly(t, uint64(1), spendOut.Hours) +} + +func TestMakeChangeOutCoinHourCap(t *testing.T) { + uxOuts := []transaction.UxBalance{ + { + Hash: cipher.MustSHA256FromHex("f569461182b0efe9a5c666e9a35c6602b351021c1803cc740aca548cf6db4cb2"), + Address: cipher.MustDecodeBase58Address("k3rmz3PGbTxd7KL8AL5CeHrWy35C1UcWND"), + BkSeq: 10, + Coins: 400e6, + Hours: 2000, + }, + { + Hash: cipher.MustSHA256FromHex("bddf0aaf80f96c144f33ac8a27764a868d37e1c11e568063ebeb1367de859566"), + Address: cipher.MustDecodeBase58Address("A2h4iWC1SDGmS6UPezatFzEUwirLJtjFUe"), + BkSeq: 11, + Coins: 300e6, + Hours: 1000, + }, + } + + spendAmt := []SendAmount{{ + Addr: "2PBmUva7J8WFsyWg979cREZkU3z2pkYjNkE", + Coins: 600e6, + }} + + chgAddr := "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ" + _, err := cipher.DecodeBase58Address(chgAddr) + require.NoError(t, err) + + txOuts, err := makeChangeOut(uxOuts, chgAddr, spendAmt) + require.NoError(t, err) + require.NotEmpty(t, txOuts) + + // Should have a change output and an output to the destination in toAddrs + require.Len(t, txOuts, 2) + + chgOut := txOuts[1] + t.Logf("chgOut:%+v\n", chgOut) + require.Equal(t, chgAddr, chgOut.Address.String()) + require.Exactly(t, uint64(100e6), chgOut.Coins) + + spendOut := txOuts[0] + require.Equal(t, spendAmt[0].Addr, spendOut.Address.String()) + require.Exactly(t, spendAmt[0].Coins, spendOut.Coins) + + require.Exactly(t, uint64(2100), chgOut.Hours) + require.Exactly(t, uint64(600), spendOut.Hours) +} + +func TestMakeChangeOutOneCoinHour(t *testing.T) { + // As long as there is at least one coin hour left, creating a transaction + // will still succeed + uxOuts := []transaction.UxBalance{ + { + Hash: cipher.MustSHA256FromHex("f569461182b0efe9a5c666e9a35c6602b351021c1803cc740aca548cf6db4cb2"), + BkSeq: 10, + Address: cipher.MustDecodeBase58Address("k3rmz3PGbTxd7KL8AL5CeHrWy35C1UcWND"), + Coins: 400e6, + Hours: 0, + }, + { + Hash: cipher.MustSHA256FromHex("bddf0aaf80f96c144f33ac8a27764a868d37e1c11e568063ebeb1367de859566"), + BkSeq: 11, + Address: cipher.MustDecodeBase58Address("A2h4iWC1SDGmS6UPezatFzEUwirLJtjFUe"), + Coins: 300e6, + Hours: 1, + }, + } + + spendAmt := []SendAmount{{ + Addr: "2PBmUva7J8WFsyWg979cREZkU3z2pkYjNkE", + Coins: 600e6, + }} + + chgAddr := "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ" + _, err := cipher.DecodeBase58Address(chgAddr) + require.NoError(t, err) + + txOuts, err := makeChangeOut(uxOuts, chgAddr, spendAmt) + require.NoError(t, err) + require.NotEmpty(t, txOuts) + + // Should have a change output and an output to the destination in toAddrs + require.Len(t, txOuts, 2) + + chgOut := txOuts[1] + t.Logf("chgOut:%+v\n", chgOut) + require.Equal(t, chgAddr, chgOut.Address.String()) + require.Exactly(t, uint64(100e6), chgOut.Coins) + require.Exactly(t, uint64(0), chgOut.Hours) + + spendOut := txOuts[0] + require.Equal(t, spendAmt[0].Addr, spendOut.Address.String()) + require.Exactly(t, spendAmt[0].Coins, spendOut.Coins) + require.Exactly(t, uint64(0), spendOut.Hours) +} + +func TestMakeChangeOutInsufficientCoinHours(t *testing.T) { + // If there are no coin hours in the inputs, creating the txn will fail + // because it will not be accepted by the network + uxOuts := []transaction.UxBalance{ + { + Hash: cipher.MustSHA256FromHex("f569461182b0efe9a5c666e9a35c6602b351021c1803cc740aca548cf6db4cb2"), + BkSeq: 10, + Address: cipher.MustDecodeBase58Address("k3rmz3PGbTxd7KL8AL5CeHrWy35C1UcWND"), + Coins: 400e6, + Hours: 0, + }, + { + Hash: cipher.MustSHA256FromHex("bddf0aaf80f96c144f33ac8a27764a868d37e1c11e568063ebeb1367de859566"), + BkSeq: 11, + Address: cipher.MustDecodeBase58Address("A2h4iWC1SDGmS6UPezatFzEUwirLJtjFUe"), + Coins: 300e6, + Hours: 0, + }, + } + + spendAmt := []SendAmount{{ + Addr: "2PBmUva7J8WFsyWg979cREZkU3z2pkYjNkE", + Coins: 600e6, + }} + + chgAddr := "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ" + _, err := cipher.DecodeBase58Address(chgAddr) + require.NoError(t, err) + + _, err = makeChangeOut(uxOuts, chgAddr, spendAmt) + testutil.RequireError(t, err, fee.ErrTxnNoFee.Error()) +} + +func TestChooseSpends(t *testing.T) { + // Start with readable.UnspentOutputsSummary + // Spends should be minimized + + // Insufficient HeadOutputs + // Sufficient HeadOutputs, but insufficient after adjusting for OutgoingOutputs + // Insufficient HeadOutputs, but sufficient after adjusting for IncomingOutputs + // Sufficient HeadOutputs after adjusting for OutgoingOutputs + + var coins uint64 = 100e6 + + hashA := testutil.RandSHA256(t).Hex() + hashB := testutil.RandSHA256(t).Hex() + hashC := testutil.RandSHA256(t).Hex() + hashD := testutil.RandSHA256(t).Hex() + + addrA := testutil.MakeAddress().String() + addrB := testutil.MakeAddress().String() + addrC := testutil.MakeAddress().String() + addrD := testutil.MakeAddress().String() + + cases := []struct { + name string + err error + spendLen int + ros readable.UnspentOutputsSummary + }{ + { + "Insufficient HeadOutputs", + transaction.ErrInsufficientBalance, + 0, + readable.UnspentOutputsSummary{ + HeadOutputs: readable.UnspentOutputs{ + { + Hash: hashA, + Address: addrA, + BkSeq: 22, + Coins: "75.000000", + CalculatedHours: 100, + SourceTransaction: testutil.RandSHA256(t).Hex(), + }, + { + Hash: hashB, + Address: addrB, + BkSeq: 19, + Coins: "13.000000", + CalculatedHours: 0, + SourceTransaction: testutil.RandSHA256(t).Hex(), + }, + }, + }, + }, + + { + "Sufficient HeadOutputs, but insufficient after subtracting OutgoingOutputs", + transaction.ErrInsufficientBalance, + 0, + readable.UnspentOutputsSummary{ + HeadOutputs: readable.UnspentOutputs{ + { + Hash: hashA, + Address: addrA, + BkSeq: 22, + Coins: "75.000000", + CalculatedHours: 100, + SourceTransaction: testutil.RandSHA256(t).Hex(), + }, + { + Hash: hashB, + Address: addrB, + BkSeq: 19, + Coins: "50.000000", + CalculatedHours: 0, + SourceTransaction: testutil.RandSHA256(t).Hex(), + }, + }, + OutgoingOutputs: readable.UnspentOutputs{ + { + Hash: hashB, + Address: addrB, + BkSeq: 19, + Coins: "50.000000", + CalculatedHours: 0, + SourceTransaction: testutil.RandSHA256(t).Hex(), + }, + }, + }, + }, + + { + "Insufficient HeadOutputs, but sufficient after adding IncomingOutputs", + ErrTemporaryInsufficientBalance, + 0, + readable.UnspentOutputsSummary{ + HeadOutputs: readable.UnspentOutputs{ + { + Hash: hashA, + Address: addrA, + BkSeq: 22, + Coins: "20.000000", + CalculatedHours: 100, + SourceTransaction: testutil.RandSHA256(t).Hex(), + }, + { + Hash: hashB, + Address: addrB, + BkSeq: 19, + Coins: "30.000000", + CalculatedHours: 0, + SourceTransaction: testutil.RandSHA256(t).Hex(), + }, + }, + IncomingOutputs: readable.UnspentOutputs{ + { + Hash: hashC, + Address: addrC, + BkSeq: 134, + Coins: "40.000000", + CalculatedHours: 200, + SourceTransaction: testutil.RandSHA256(t).Hex(), + }, + { + Hash: hashD, + Address: addrD, + BkSeq: 29, + Coins: "11.000000", + CalculatedHours: 0, + SourceTransaction: testutil.RandSHA256(t).Hex(), + }, + }, + }, + }, + + { + "Sufficient HeadOutputs and still sufficient after subtracting OutgoingOutputs", + nil, + 2, + readable.UnspentOutputsSummary{ + HeadOutputs: readable.UnspentOutputs{ + { + Hash: hashA, + Address: addrA, + BkSeq: 22, + Coins: "15.000000", + CalculatedHours: 100, + SourceTransaction: testutil.RandSHA256(t).Hex(), + }, + { + Hash: hashB, + Address: addrB, + BkSeq: 19, + Coins: "90.000000", + CalculatedHours: 0, + SourceTransaction: testutil.RandSHA256(t).Hex(), + }, + { + Hash: hashC, + Address: addrC, + BkSeq: 19, + Coins: "20.000000", + CalculatedHours: 1, + SourceTransaction: testutil.RandSHA256(t).Hex(), + }, + }, + OutgoingOutputs: readable.UnspentOutputs{ + { + Hash: hashA, + Address: addrA, + BkSeq: 22, + Coins: "15.000000", + CalculatedHours: 100, + SourceTransaction: testutil.RandSHA256(t).Hex(), + }, + }, + }, + }, + + { + "Sufficient HeadOutputs and still sufficient after subtracting OutgoingOutputs but will have no coinhours", + fee.ErrTxnNoFee, + 0, + readable.UnspentOutputsSummary{ + HeadOutputs: readable.UnspentOutputs{ + { + Hash: hashA, + Address: addrA, + BkSeq: 22, + Coins: "15.000000", + CalculatedHours: 100, + SourceTransaction: testutil.RandSHA256(t).Hex(), + }, + { + Hash: hashB, + Address: addrB, + BkSeq: 19, + Coins: "90.000000", + CalculatedHours: 0, + SourceTransaction: testutil.RandSHA256(t).Hex(), + }, + { + Hash: hashC, + Address: addrC, + BkSeq: 19, + Coins: "30.000000", + CalculatedHours: 0, + SourceTransaction: testutil.RandSHA256(t).Hex(), + }, + }, + OutgoingOutputs: readable.UnspentOutputs{ + { + Hash: hashA, + Address: addrA, + BkSeq: 22, + Coins: "15.000000", + CalculatedHours: 100, + SourceTransaction: testutil.RandSHA256(t).Hex(), + }, + }, + }, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + spends, err := chooseSpends(&tc.ros, coins) + + if tc.err != nil { + testutil.RequireError(t, err, tc.err.Error()) + } else { + require.NoError(t, err) + require.Equal(t, tc.spendLen, len(spends)) + + var totalCoins uint64 + for _, ux := range spends { + totalCoins += ux.Coins + } + + require.True(t, coins <= totalCoins) + } + }) + } +} + +func TestParseSendAmountsFromCSV(t *testing.T) { + cases := []struct { + name string + fields [][]string + amts []SendAmount + err error + }{ + { + name: "valid simple case", + fields: [][]string{ + {"2Niqzo12tZ9ioZq5vwPHMVR4g7UVpp9TCmP", "123"}, + {"2UDzBKnxZf4d9pdrBJAqbtoeH641RFLYKxd", "123.456"}, + {"8LbGZ9Z9r7ELNKyrQmAbhLhLvrmLJjfotm", "123.456789"}, + {"7KU683yzoPE9rVuuFRQMZVhGwBBtwqTKT2", "0"}, + }, + amts: []SendAmount{ + { + Addr: "2Niqzo12tZ9ioZq5vwPHMVR4g7UVpp9TCmP", + Coins: 123e6, + }, + { + Addr: "2UDzBKnxZf4d9pdrBJAqbtoeH641RFLYKxd", + Coins: 123456e3, + }, + { + Addr: "8LbGZ9Z9r7ELNKyrQmAbhLhLvrmLJjfotm", + Coins: 123456789, + }, + { + Addr: "7KU683yzoPE9rVuuFRQMZVhGwBBtwqTKT2", + Coins: 0, + }, + }, + }, + + { + name: "invalid coins value", + fields: [][]string{ + {"7KU683yzoPE9rVuuFRQMZVhGwBBtwqTKT2", "0.1234567"}, + }, + err: errors.New("[row 0] Invalid amount 0.1234567: Droplet string conversion failed: Too many decimal places"), + }, + + { + name: "invalid address value", + fields: [][]string{ + {"xxx", "0.123"}, + }, + err: errors.New("[row 0] Invalid address xxx: Invalid address length"), + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + amts, err := parseSendAmountsFromCSV(tc.fields) + + if tc.err != nil { + require.Equal(t, tc.err, err) + require.Nil(t, amts) + return + } + + require.NoError(t, err) + require.Equal(t, tc.amts, amts) + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/decrypt_wallet.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/decrypt_wallet.go new file mode 100644 index 00000000..0ce1e099 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/decrypt_wallet.go @@ -0,0 +1,82 @@ +package cli + +import ( + "path/filepath" + + "github.com/spf13/cobra" + + "github.com/SkycoinProject/skycoin/src/wallet" +) + +func decryptWalletCmd() *cobra.Command { + decryptWalletCmd := &cobra.Command{ + Args: cobra.ExactArgs(1), + Use: "decryptWallet [wallet]", + Short: "Decrypt a wallet", + Long: `Decrypt an encrypted wallet. The decrypted wallet will be written + on the filesystem in place of the encrypted wallet. + + Use caution when using the "-p" command. If you have command history enabled + your wallet encryption password can be recovered from the history log. If you + do not include the "-p" option you will be prompted to enter your password + after you enter your command.`, + SilenceUsage: true, + RunE: func(c *cobra.Command, args []string) error { + w := args[0] + pr := NewPasswordReader([]byte(c.Flag("password").Value.String())) + + _, err := decryptWallet(w, pr) + switch err.(type) { + case nil: + case WalletLoadError: + printHelp(c) + return err + default: + return err + } + + return nil + }, + } + + decryptWalletCmd.Flags().StringP("password", "p", "", "wallet password") + + return decryptWalletCmd +} + +func decryptWallet(walletFile string, pr PasswordReader) (wallet.Wallet, error) { + wlt, err := wallet.Load(walletFile) + if err != nil { + return nil, WalletLoadError{err} + } + + if !wlt.IsEncrypted() { + return nil, wallet.ErrWalletNotEncrypted + } + + if pr == nil { + return nil, wallet.ErrMissingPassword + } + + wltPassword, err := pr.Password() + if err != nil { + return nil, err + } + + unlockedWlt, err := wallet.Unlock(wlt, wltPassword) + if err != nil { + return nil, err + } + + dir, err := filepath.Abs(filepath.Dir(walletFile)) + if err != nil { + return nil, err + } + + // save the wallet + if err := wallet.Save(unlockedWlt, dir); err != nil { + return nil, WalletLoadError{err} + } + + return unlockedWlt, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/distribute_genesis.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/distribute_genesis.go new file mode 100644 index 00000000..6ee184f2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/distribute_genesis.go @@ -0,0 +1,147 @@ +package cli + +import ( + "errors" + "fmt" + + "github.com/spf13/cobra" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/util/droplet" +) + +func distributeGenesisCmd() *cobra.Command { + cmd := &cobra.Command{ + Args: cobra.ExactArgs(1), + Use: "distributeGenesis [genesis address secret key]", + Short: "Distributes the genesis block coins into the configured distribution addresses", + Long: `Distributes the genesis block coins into the configured distribution addresses. + + The genesis block contains a single transaction with a single output that creates all coins + in existence. Skycoin expects the second block to be a "distribution" transaction, where + the genesis coins are split into N distribution addresses, each holding an equal amount. + + RPC_ADDR must be set, to communicate with a running Skycoin node.`, + RunE: distributeGenesisHandler, + } + + cmd.Flags().StringP("genesis-seckey", "s", "", "Genesis address secret key") + + return cmd +} + +func distributeGenesisHandler(c *cobra.Command, args []string) error { + sk, err := cipher.SecKeyFromHex(args[0]) + if err != nil { + return errors.New("invalid genesis secret key") + } + + // Obtain the genesis uxid from the node + uxID, err := getGenesisUxID() + if err != nil { + return err + } + + txn, err := createDistributionTransaction(uxID, sk, params.MainNetDistribution) + if err != nil { + return err + } + + health, err := apiClient.Health() + if err != nil { + return err + } + + // If the node is a block publisher node, we can skip the broadcast and + // avoid any broadcast related errors. Otherwise, InjectTransaction would + // require that the block publisher node be connected to another peer. + // Otherwise, inject the transaction normally, which requires the node + // to be connected to peers, or else an error is returned. + // This allows the user to use this command against a block publisher node + // during setup, or against a local node, after setting up a block publisher + // node elsewhere. + if health.BlockPublisher { + if _, err := apiClient.InjectTransactionNoBroadcast(txn); err != nil { + return err + } + } else { + if _, err := apiClient.InjectTransaction(txn); err != nil { + return err + } + } + + return nil +} + +func getGenesisUxID() (string, error) { + // Check that the only block is the genesis block + bm, err := apiClient.BlockchainMetadata() + if err != nil { + return "", err + } + if bm.Head.BkSeq != 0 { + return "", errors.New("genesis output has already been distributed") + } + + b, err := apiClient.BlockBySeq(0) + if err != nil { + return "", err + } + + // Sanity checks + if len(b.Body.Transactions) != 1 { + return "", errors.New("genesis block has multiple transactions") + } + if len(b.Body.Transactions[0].Out) != 1 { + return "", errors.New("genesis block has multiple outputs") + } + + return b.Body.Transactions[0].Out[0].Hash, nil +} + +func createDistributionTransaction(uxID string, genesisSecKey cipher.SecKey, p params.Distribution) (*coin.Transaction, error) { + // Sanity check + addrs := p.AddressesDecoded() + if p.MaxCoinSupply%uint64(len(addrs)) != 0 { + return nil, errors.New("the number of distribution addresses must divide MaxCoinSupply exactly") + } + + var txn coin.Transaction + + output, err := cipher.SHA256FromHex(uxID) + if err != nil { + return nil, fmt.Errorf("invalid uxid") + } + + if err := txn.PushInput(output); err != nil { + return nil, err + } + + coins := (p.MaxCoinSupply / uint64(len(addrs))) * droplet.Multiplier + hours := uint64(1000) + + for _, addr := range addrs { + if err := txn.PushOutput(addr, coins, hours); err != nil { + return nil, err + } + } + + seckeys := make([]cipher.SecKey, 1) + seckey := genesisSecKey.Hex() + seckeys[0] = cipher.MustSecKeyFromHex(seckey) + txn.SignInputs([]cipher.SecKey{ + genesisSecKey, + }) + + if err := txn.UpdateHeader(); err != nil { + return nil, err + } + + if err := txn.Verify(); err != nil { + return nil, err + } + + return &txn, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/encrypt_wallet.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/encrypt_wallet.go new file mode 100644 index 00000000..50547f72 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/encrypt_wallet.go @@ -0,0 +1,87 @@ +package cli + +import ( + "path/filepath" + + "github.com/spf13/cobra" + + "github.com/SkycoinProject/skycoin/src/wallet" +) + +func encryptWalletCmd() *cobra.Command { + encryptWalletCmd := &cobra.Command{ + Args: cobra.ExactArgs(1), + Short: "Encrypt wallet", + Use: "encryptWallet [wallet]", + Long: `Encrypt a decrypted wallet. The encrypted wallet file + will be written on the filesystem in place of the decrypted wallet. + + Use caution when using the "-p" command. If you have command history enabled + your wallet encryption password can be recovered from the history log. If you + do not include the "-p" option you will be prompted to enter your password + after you enter your command.`, + SilenceUsage: true, + RunE: func(c *cobra.Command, args []string) error { + w := args[0] + cryptoType, err := wallet.CryptoTypeFromString(c.Flag("crypto-type").Value.String()) + if err != nil { + printHelp(c) + return err + } + + pr := NewPasswordReader([]byte(c.Flag("password").Value.String())) + + _, err = encryptWallet(w, pr, cryptoType) + switch err.(type) { + case nil: + case WalletLoadError: + printHelp(c) + return err + default: + return err + } + + return nil + }, + } + + encryptWalletCmd.Flags().StringP("password", "p", "", "wallet password") + encryptWalletCmd.Flags().StringP("crypto-type", "x", "scrypt-chacha20poly1305", "The crypto type for wallet encryption, can be scrypt-chacha20poly1305 or sha256-xor") + return encryptWalletCmd +} + +func encryptWallet(walletFile string, pr PasswordReader, cryptoType wallet.CryptoType) (wallet.Wallet, error) { + wlt, err := wallet.Load(walletFile) + if err != nil { + return nil, WalletLoadError{err} + } + + if wlt.IsEncrypted() { + return nil, wallet.ErrWalletEncrypted + } + + if pr == nil { + return nil, wallet.ErrMissingPassword + } + + password, err := pr.Password() + if err != nil { + return nil, err + } + + if err := wallet.Lock(wlt, password, cryptoType); err != nil { + return nil, err + } + + dir, err := filepath.Abs(filepath.Dir(walletFile)) + if err != nil { + return nil, err + } + + // save the wallet + if err := wallet.Save(wlt, dir); err != nil { + return nil, WalletLoadError{err} + } + + return wlt, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/generate_addrs.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/generate_addrs.go new file mode 100644 index 00000000..3e4463d4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/generate_addrs.go @@ -0,0 +1,183 @@ +package cli + +import ( + "errors" + "fmt" + "path/filepath" + "strings" + + "github.com/spf13/cobra" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/wallet" +) + +func walletAddAddressesCmd() *cobra.Command { + walletAddAddressesCmd := &cobra.Command{ + Args: cobra.ExactArgs(1), + Use: "walletAddAddresses [wallet]", + Short: "Generate additional addresses for a deterministic, bip44 or xpub wallet", + Long: `Generate additional addresses for a deterministic, bip44 or xpub wallet. + Addresses are generated according to the wallet type's generation mechanism. + + Warning: if you generate long (over 20) sequences of empty addresses and use + a later address this can cause the wallet history scanner to miss your addresses, + if you load the wallet from seed elsewhere. In that case, you'll have to manually + generate addresses to cover the gap of unused addresses in the sequence. + + BIP44 wallets generate their addresses on the external (0'/0) chain. + + Use caution when using the "-p" command. If you have command + history enabled your wallet encryption password can be recovered from the + history log. If you do not include the "-p" option you will be prompted to + enter your password after you enter your command.`, + RunE: generateAddrs, + } + + walletAddAddressesCmd.Flags().Uint64P("num", "n", 1, "Number of addresses to generate") + walletAddAddressesCmd.Flags().StringP("password", "p", "", "wallet password") + walletAddAddressesCmd.Flags().BoolP("json", "j", false, "Returns the results in JSON format") + + return walletAddAddressesCmd +} + +func generateAddrs(c *cobra.Command, args []string) error { + // get number of address that are need to be generated. + num, err := c.Flags().GetUint64("num") + if err != nil { + return err + } + + if num == 0 { + return errors.New("-n must > 0") + } + + jsonFmt, err := c.Flags().GetBool("json") + if err != nil { + return err + } + + w := args[0] + + pr := NewPasswordReader([]byte(c.Flag("password").Value.String())) + addrs, err := GenerateAddressesInFile(w, num, pr) + + switch err.(type) { + case nil: + case WalletLoadError: + printHelp(c) + return err + default: + return err + } + + if jsonFmt { + s, err := FormatAddressesAsJSON(addrs) + if err != nil { + return err + } + fmt.Println(s) + } else { + fmt.Println(FormatAddressesAsJoinedArray(addrs)) + } + + return nil +} + +// GenerateAddressesInFile generates addresses in given wallet file +func GenerateAddressesInFile(walletFile string, num uint64, pr PasswordReader) ([]cipher.Addresser, error) { + wlt, err := wallet.Load(walletFile) + if err != nil { + return nil, WalletLoadError{err} + } + + switch pr.(type) { + case nil: + if wlt.IsEncrypted() { + return nil, wallet.ErrWalletEncrypted + } + case PasswordFromBytes: + p, err := pr.Password() + if err != nil { + return nil, err + } + + if !wlt.IsEncrypted() && len(p) != 0 { + return nil, wallet.ErrWalletNotEncrypted + } + } + + genAddrsInWallet := func(w wallet.Wallet, n uint64) ([]cipher.Addresser, error) { + return w.GenerateAddresses(n) + } + + if wlt.IsEncrypted() { + genAddrsInWallet = func(w wallet.Wallet, n uint64) ([]cipher.Addresser, error) { + password, err := pr.Password() + if err != nil { + return nil, err + } + + var addrs []cipher.Addresser + if err := wallet.GuardUpdate(w, password, func(wlt wallet.Wallet) error { + var err error + addrs, err = wlt.GenerateAddresses(n) + return err + }); err != nil { + return nil, err + } + + return addrs, nil + } + } + + addrs, err := genAddrsInWallet(wlt, num) + if err != nil { + return nil, err + } + + dir, err := filepath.Abs(filepath.Dir(walletFile)) + if err != nil { + return nil, err + } + + if err := wallet.Save(wlt, dir); err != nil { + return nil, WalletSaveError{err} + } + + return addrs, nil +} + +// FormatAddressesAsJSON converts []cipher.Address to strings and formats the array into a standard JSON object wrapper +func FormatAddressesAsJSON(addrs []cipher.Addresser) (string, error) { + d, err := formatJSON(struct { + Addresses []string `json:"addresses"` + }{ + Addresses: AddressesToStrings(addrs), + }) + + if err != nil { + return "", err + } + + return string(d), nil +} + +// FormatAddressesAsJoinedArray converts []cipher.Address to strings and concatenates them with a comma +func FormatAddressesAsJoinedArray(addrs []cipher.Addresser) string { + return strings.Join(AddressesToStrings(addrs), ",") +} + +// AddressesToStrings converts []cipher.Address to []string +func AddressesToStrings(addrs []cipher.Addresser) []string { + if addrs == nil { + return nil + } + + addrsStr := make([]string, len(addrs)) + for i, a := range addrs { + addrsStr[i] = a.String() + } + + return addrsStr +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/generate_wallet.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/generate_wallet.go new file mode 100644 index 00000000..c4f24948 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/generate_wallet.go @@ -0,0 +1,316 @@ +package cli + +import ( + "encoding/hex" + "errors" + "fmt" + "os" + "path/filepath" + + "github.com/spf13/cobra" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/bip39" + "github.com/SkycoinProject/skycoin/src/cipher/bip44" + secp256k1 "github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go" + "github.com/SkycoinProject/skycoin/src/wallet" +) + +const ( + // AlphaNumericSeedLength is the size of generated alphanumeric seeds, in bytes + AlphaNumericSeedLength = 64 +) + +func walletCreateCmd() *cobra.Command { + walletCreateCmd := &cobra.Command{ + Args: cobra.ExactArgs(1), + Use: "walletCreate [wallet]", + Short: "Create a new wallet", + Long: `Create a new wallet. + + Use caution when using the "-p" command. If you have command + history enabled your wallet encryption password can be recovered + from the history log. If you do not include the "-p" option you will + be prompted to enter your password after you enter your command. + + All results are returned in JSON format in addition to being written to the specified filename.`, + SilenceUsage: true, + RunE: generateWalletHandler, + } + + walletCreateCmd.Flags().BoolP("random", "r", false, "A random alpha numeric seed will be generated.") + walletCreateCmd.Flags().BoolP("mnemonic", "m", false, "A mnemonic seed consisting of 12 dictionary words will be generated") + walletCreateCmd.Flags().Uint64P("wordcount", "w", 12, "Number of seed words to use for mnemonic. Must be 12, 15, 18, 21 or 24") + walletCreateCmd.Flags().StringP("seed", "s", "", "Your seed") + walletCreateCmd.Flags().StringP("seed-passphrase", "", "", "Seed passphrase (bip44 wallets only)") + walletCreateCmd.Flags().Uint32P("bip44-coin", "", uint32(bip44.CoinTypeSkycoin), "BIP44 coin type") + walletCreateCmd.Flags().StringP("coin", "c", string(wallet.CoinTypeSkycoin), "Wallet address coin type (options: skycoin, bitcoin)") + walletCreateCmd.Flags().Uint64P("num", "n", 1, `Number of addresses to generate.`) + walletCreateCmd.Flags().StringP("label", "l", "", "Label used to identify your wallet.") + walletCreateCmd.Flags().StringP("type", "t", wallet.WalletTypeDeterministic, "Wallet type. Types are \"collection\", \"deterministic\", \"bip44\" or \"xpub\"") + walletCreateCmd.Flags().BoolP("encrypt", "e", false, "Create encrypted wallet.") + walletCreateCmd.Flags().StringP("crypto-type", "x", string(wallet.DefaultCryptoType), "The crypto type for wallet encryption, can be scrypt-chacha20poly1305 or sha256-xor") + walletCreateCmd.Flags().StringP("password", "p", "", "Wallet password") + walletCreateCmd.Flags().StringP("xpub", "", "", "xpub key for \"xpub\" type wallets") + + return walletCreateCmd +} + +func generateWalletHandler(c *cobra.Command, args []string) error { + wltName := args[0] + // wallet filename must have the correct extension + if filepath.Ext(wltName) != walletExt { + return ErrWalletName + } + + // check if the wallet file does exist + if _, err := os.Stat(wltName); err == nil { + return fmt.Errorf("%v already exists", wltName) + } + + // get number of address that are need to be generated + num, err := c.Flags().GetUint64("num") + if err != nil { + return err + } + if num == 0 { + return errors.New("-n must > 0") + } + + label := c.Flag("label").Value.String() + + s := c.Flag("seed").Value.String() + random, err := c.Flags().GetBool("random") + if err != nil { + return err + } + + mnemonic, err := c.Flags().GetBool("mnemonic") + if err != nil { + return err + } + + wordCount, err := c.Flags().GetUint64("wordcount") + if err != nil { + return err + } + + if !mnemonic && c.Flags().Changed("wordcount") { + return errors.New("-m must also be set when using -wordcount") + } + + encrypt, err := c.Flags().GetBool("encrypt") + if err != nil { + return err + } + + walletType, err := c.Flags().GetString("type") + if err != nil { + return err + } + if !wallet.IsValidWalletType(walletType) { + return wallet.ErrInvalidWalletType + } + + coinStr, err := c.Flags().GetString("coin") + if err != nil { + return err + } + coin, err := wallet.ResolveCoinType(coinStr) + if err != nil { + return err + } + + var bip44Coin *bip44.CoinType + if c.Flags().Changed("bip44-coin") { + bip44CoinInt, err := c.Flags().GetUint32("bip44-coin") + if err != nil { + return err + } + + c := bip44.CoinType(bip44CoinInt) + bip44Coin = &c + } + + xpub, err := c.Flags().GetString("xpub") + if err != nil { + return err + } + + var sd string + switch walletType { + case wallet.WalletTypeBip44: + var err error + sd, err = parseBip44WalletSeedOptions(s, random, mnemonic, wordCount) + if err != nil { + return err + } + + case wallet.WalletTypeDeterministic: + var err error + sd, err = parseDeterministicWalletSeedOptions(s, random, mnemonic, wordCount) + if err != nil { + return err + } + + case wallet.WalletTypeCollection: + if s != "" || random || mnemonic { + return fmt.Errorf("%q type wallets do not use seeds", walletType) + } + if c.Flags().Changed("num") { + return fmt.Errorf("%q type wallets do not support address generation", walletType) + } + num = 0 + + case wallet.WalletTypeXPub: + if s != "" || random || mnemonic { + return fmt.Errorf("%q type wallets do not use seeds", walletType) + } + + default: + return fmt.Errorf("unhandled wallet type %q", walletType) + } + + seedPassphrase, err := c.Flags().GetString("seed-passphrase") + if err != nil { + return err + } + + cryptoType, err := wallet.CryptoTypeFromString(c.Flag("crypto-type").Value.String()) + if err != nil { + return err + } + + pr := NewPasswordReader([]byte(c.Flag("password").Value.String())) + switch pr.(type) { + case PasswordFromBytes: + p, err := pr.Password() + if err != nil { + return err + } + + if !encrypt && len(p) != 0 { + return errors.New("password should not be set as we're not going to create a wallet with encryption") + } + } + + var password []byte + if encrypt { + var err error + password, err = pr.Password() + if err != nil { + return err + } + } + + opts := wallet.Options{ + Label: label, + Seed: sd, + SeedPassphrase: seedPassphrase, + Encrypt: encrypt, + CryptoType: cryptoType, + Password: password, + Type: walletType, + GenerateN: num, + Coin: coin, + Bip44Coin: bip44Coin, + XPub: xpub, + } + + wlt, err := wallet.NewWallet(filepath.Base(wltName), opts) + if err != nil { + return err + } + + if err := wallet.Save(wlt, filepath.Dir(wltName)); err != nil { + return err + } + + return printJSON(wlt.ToReadable()) +} + +// wordCountToEntropy maps a mnemonic word count to its entropy size in bits +func wordCountToEntropy(wc uint64) (int, error) { + switch wc { + case 12: + return 128, nil + case 15: + return 160, nil + case 18: + return 192, nil + case 21: + return 224, nil + case 24: + return 256, nil + default: + return 0, errors.New("word count must be 12, 15, 18, 21 or 24") + } +} + +func newMnemomic(wc uint64) (string, error) { + entropySize, err := wordCountToEntropy(wc) + if err != nil { + return "", err + } + e, err := bip39.NewEntropy(entropySize) + if err != nil { + return "", err + } + return bip39.NewMnemonic(e) +} + +func parseBip44WalletSeedOptions(s string, r, m bool, wc uint64) (string, error) { + if s != "" && (r || m) { + return "", errors.New("-r and -m can't be used with -s") + } + + if r { + return "", errors.New("-r can't be used for bip44 wallets") + } + + if m || s == "" { + var err error + s, err = newMnemomic(wc) + if err != nil { + return "", err + } + } + + if err := bip39.ValidateMnemonic(s); err != nil { + return "", fmt.Errorf("seed must be a valid bip39 mnemonic: %v", err) + } + + return s, nil +} + +func parseDeterministicWalletSeedOptions(s string, r, m bool, wc uint64) (string, error) { + if s != "" { + // 111, 101, 110 + if r || m { + return "", errors.New("seed already specified, must not use -r or -m again") + } + // 100 + return s, nil + } + + // 011 + if r && m { + return "", errors.New("for -r and -m, only one option can be used") + } + + // 010 + if r { + return MakeAlphanumericSeed(), nil + } + + // 001, 000 + return newMnemomic(wc) +} + +// PUBLIC + +// MakeAlphanumericSeed creates a random seed with AlphaNumericSeedLength bytes and hex encodes it +func MakeAlphanumericSeed() string { + seedRaw := cipher.SumSHA256(secp256k1.RandByte(AlphaNumericSeedLength)) + return hex.EncodeToString(seedRaw[:]) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/empty.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/empty.go new file mode 100644 index 00000000..a0bb99d4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/empty.go @@ -0,0 +1,2 @@ +// Package integration implements CLI integration tests +package integration diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/integration_test.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/integration_test.go new file mode 100644 index 00000000..05a44335 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/integration_test.go @@ -0,0 +1,3529 @@ +// Package integration_test implements CLI integration tests +package integration_test + +import ( + "bytes" + "encoding/csv" + "encoding/hex" + "encoding/json" + "errors" + "flag" + "fmt" + "io" + "io/ioutil" + "math/rand" + "os" + "os/exec" + "path/filepath" + "reflect" + "regexp" + "strconv" + "strings" + "sync" + "testing" + "time" + + "github.com/andreyvit/diff" + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/api" + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/bip39" + "github.com/SkycoinProject/skycoin/src/cli" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/readable" + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/util/droplet" + wh "github.com/SkycoinProject/skycoin/src/util/http" + "github.com/SkycoinProject/skycoin/src/wallet" +) + +const ( + binaryName = "skycoin-cli.test" + + testModeStable = "stable" + testModeLive = "live" + + // Number of random transactions of live transaction test. + randomLiveTransactionNum = 500 + + testFixturesDir = "testdata" + + stableWalletName = "integration-test.wlt" + stableEncryptWalletName = "integration-test-encrypted.wlt" +) + +var ( + binaryPath string + + update = flag.Bool("update", false, "update golden files") + liveTxFull = flag.Bool("live-tx-full", false, "run live transaction test against full blockchain") + testLiveWallet = flag.Bool("test-live-wallet", false, "run live wallet tests, requires wallet envvars set") + + cryptoTypes = []wallet.CryptoType{wallet.CryptoTypeScryptChacha20poly1305, wallet.CryptoTypeSha256Xor} + + validNameRegexp = regexp.MustCompile(`^[a-zA-Z0-9_\-]+$`) + stripCoverageReport = regexp.MustCompile(`PASS\ncoverage: [\d\.]+% of statements in github.com/SkycoinProject/skycoin/\.\.\.\n$`) +) + +type TestData struct { + actual interface{} + expected interface{} +} + +func init() { + rand.Seed(time.Now().Unix()) +} + +func sanitizeName(s string) (string, error) { + if s == "" { + return "", errors.New("sanitizeName name empty") + } + s = strings.Replace(s, " ", "-", -1) + if !validNameRegexp.MatchString(s) { + return "", errors.New("sanitizeName name has invalid characters") + } + return s, nil +} + +// coverprofileNames manages names for unique coverprofile outputs from invocations of the cli test binary +type coverprofileNames struct { + names map[string]struct{} + sync.Mutex +} + +func newCoverprofileNames() *coverprofileNames { + return &coverprofileNames{ + names: make(map[string]struct{}), + } +} + +func (n *coverprofileNames) makeName(name string) (string, error) { + name, err := sanitizeName(name) + if err != nil { + return "", err + } + coverprofile := fmt.Sprintf("cli-%s", name) + + coverprofile = n.add(coverprofile) + + return coverprofile, nil +} + +func (n *coverprofileNames) add(s string) string { + n.Lock() + defer n.Unlock() + + i := 1 + _, ok := n.names[fmt.Sprintf("%s.coverage.out", s)] + for ok { + x := fmt.Sprintf("%s-%d.coverage.out", s, i) + _, ok = n.names[x] + if !ok { + s = x + } + i++ + } + + s = fmt.Sprintf("%s.coverage.out", s) + n.names[s] = struct{}{} + return s +} + +var ( + cpNames = newCoverprofileNames() +) + +func execCommand(args ...string) *exec.Cmd { + // Add test flags to arguments to generate a coverage report + coverprofile, err := cpNames.makeName(args[0]) + if err != nil { + panic(err) + } + args = append(args, []string{fmt.Sprintf("--test.coverprofile=../../../coverage/%s", coverprofile)}...) + return exec.Command(binaryPath, args...) +} + +func execCommandCombinedOutput(args ...string) ([]byte, error) { + cmd := execCommand(args...) + output, err := cmd.CombinedOutput() + if err != nil { + return output, err + } + // Remove the trailing coverage statements that the test cli binary produces due to coverage mode, e.g. + // PASS + // coverage: 8.1% of statements in github.com/SkycoinProject/skycoin/... + output = stripCoverageReport.ReplaceAll(output, nil) + return output, nil +} + +func TestMain(m *testing.M) { + if !enabled() { + return + } + + abs, err := filepath.Abs(binaryName) + if err != nil { + fmt.Fprintf(os.Stderr, "get binary name absolute path failed: %v\n", err) + os.Exit(1) + } + + binaryPath = abs + + // Build cli binary file. + // Args to build the cli binary without coverage: + // args := []string{"build", "-o", binaryPath, "../../../cmd/skycoin-cli/skycoin-cli.go"} + // Compile the binary with test flags enabled to get a coverage report from the binary + args := []string{"test", "-c", "-tags", "testrunmain", "-o", binaryPath, "-coverpkg=github.com/SkycoinProject/skycoin/...", "../../../cmd/skycoin-cli/"} + if err := exec.Command("go", args...).Run(); err != nil { + fmt.Fprintf(os.Stderr, "Make %v binary failed: %v\n", binaryName, err) + os.Exit(1) + } + + ret := m.Run() + + // Remove the generated cli binary file. + if err := os.Remove(binaryPath); err != nil { + fmt.Fprintf(os.Stderr, "Delete %v failed: %v", binaryName, err) + os.Exit(1) + } + + os.Exit(ret) +} + +func createUnencryptedWallet(t *testing.T) (string, func()) { + return createTempWallet(t, "", false) +} + +func createUnencryptedWalletAt(t *testing.T, filename string) (string, func()) { + return createTempWallet(t, filename, false) +} + +func createEncryptedWallet(t *testing.T) (string, func()) { //nolint:unparam + return createTempWallet(t, "", true) +} + +// createTempWallet creates a temporary dir, and if encrypt is true, copy +// the testdata/$stableEncryptedWalletName file to the dir. If it's false, then +// copy the testdata/$stableWalletName file to the dir +// returns the temporary wallet filename, cleanup callback function, and error if any. +func createTempWallet(t *testing.T, filename string, encrypt bool) (string, func()) { + var dir string + if filename == "" { + var err error + dir, err = ioutil.TempDir("", "wallet-data-dir") + require.NoError(t, err) + } else { + dir = filepath.Dir(filename) + } + + // Copy the testdata/$stableWalletName to the temporary dir. + wltName := filepath.Base(filename) + if wltName == "" || wltName == "." { + if encrypt { + wltName = stableEncryptWalletName + } else { + wltName = stableWalletName + } + } + + walletFile := filepath.Join(dir, wltName) + f, err := os.Create(walletFile) + require.NoError(t, err) + + defer f.Close() + + rf, err := os.Open(filepath.Join(testFixturesDir, wltName)) + require.NoError(t, err) + + defer rf.Close() + + _, err = io.Copy(f, rf) + require.NoError(t, err) + + return walletFile, func() { + // Delete the temporary dir + err = os.RemoveAll(dir) + if err != nil { + t.Logf("Failed to cleanup temp wallet dir %s: %v", dir, err) + } + } +} + +// createTempWalletDir creates a temporary wallet dir, +// Returns wallet dir path and callback function to clean up the dir. +func createTempWalletDir(t *testing.T) (string, func()) { + dir, err := ioutil.TempDir("", "wallet-data-dir") + require.NoError(t, err) + + return dir, func() { + os.RemoveAll(dir) + } +} + +func loadJSON(t *testing.T, filename string, obj interface{}) { + f, err := os.Open(filename) + require.NoError(t, err) + defer f.Close() + + err = json.NewDecoder(f).Decode(obj) + require.NoError(t, err) +} + +func loadGoldenFile(t *testing.T, filename string, testData TestData) { + require.NotEmpty(t, filename, "loadGoldenFile golden filename missing") + + goldenFile := filepath.Join(testFixturesDir, filename) + + if *update { + updateGoldenFile(t, goldenFile, testData.actual) + } + + f, err := os.Open(goldenFile) + require.NoError(t, err) + defer f.Close() + + err = json.NewDecoder(f).Decode(testData.expected) + require.NoError(t, err, filename) +} + +func updateGoldenFile(t *testing.T, filename string, content interface{}) { + contentJSON, err := json.MarshalIndent(content, "", "\t") + require.NoError(t, err) + contentJSON = append(contentJSON, '\n') + err = ioutil.WriteFile(filename, contentJSON, 0644) + require.NoError(t, err) +} + +func checkGoldenFile(t *testing.T, goldenFile string, td TestData) { + loadGoldenFile(t, goldenFile, td) + require.Equal(t, reflect.Indirect(reflect.ValueOf(td.expected)).Interface(), td.actual) + checkGoldenFileObjectChanges(t, goldenFile, td) +} + +func checkGoldenFileObjectChanges(t *testing.T, goldenFile string, td TestData) { + // Serialize expected to JSON and compare to the goldenFile's contents + // This will detect field changes that could be missed otherwise + b, err := json.MarshalIndent(td.expected, "", "\t") + require.NoError(t, err) + + goldenFile = filepath.Join(testFixturesDir, goldenFile) + + f, err := os.Open(goldenFile) + require.NoError(t, err) + defer f.Close() + + c, err := ioutil.ReadAll(f) + require.NoError(t, err) + + sc := string(c) + sb := string(b) + "\n" + + require.Equal(t, sc, sb, "JSON struct output differs from golden file, was a field added to the struct?\nDiff:\n"+diff.LineDiff(sc, sb)) +} + +func mode(t *testing.T) string { + mode := os.Getenv("SKYCOIN_INTEGRATION_TEST_MODE") + switch mode { + case "": + mode = testModeStable + case testModeLive, testModeStable: + default: + t.Fatal("Invalid test mode, must be stable or live") + } + return mode +} + +func enabled() bool { + return os.Getenv("SKYCOIN_INTEGRATION_TESTS") == "1" +} + +func doStable(t *testing.T) bool { + if enabled() && mode(t) == testModeStable { + return true + } + + t.Skip("Stable tests disabled") + return false +} + +func doLive(t *testing.T) bool { + if enabled() && mode(t) == testModeLive { + return true + } + + t.Skip("Live tests disabled") + return false +} + +func doLiveWallet(t *testing.T) bool { + if *testLiveWallet { + return true + } + + t.Skip("Tests requiring wallet envvars are disabled") + return false +} + +func dbNoUnconfirmed(t *testing.T) bool { + x := os.Getenv("DB_NO_UNCONFIRMED") + if x == "" { + return false + } + + v, err := strconv.ParseBool(x) + require.NoError(t, err) + return v +} + +// requireWalletEnv checks if live wallet tests are enabled and the CLI_WALLET_FILE environment variable is set +func requireWalletEnv(t *testing.T) string { + if !doLiveWallet(t) { + t.Fatal("not doing live wallet tests, should have skipped") + } + + walletFile := os.Getenv("CLI_WALLET_FILE") + if walletFile == "" { + t.Fatal("missing CLI_WALLET_FILE environment variable") + } + + return walletFile +} + +func doLiveOrStable(t *testing.T) bool { + if enabled() { + switch mode(t) { + case testModeStable, testModeLive: + return true + } + } + + t.Skip("Live and stable tests disabled") + return false +} + +func rpcAddress() string { + rpcAddr := os.Getenv("RPC_ADDR") + if rpcAddr == "" { + rpcAddr = "http://127.0.0.1:6420" + } + + return rpcAddr +} + +func newClient() *api.Client { + c := api.NewClient(rpcAddress()) + c.SetAuth(os.Getenv("RPC_USER"), os.Getenv("RPC_PASS")) + return c +} + +func useCSRF(t *testing.T) bool { + x := os.Getenv("USE_CSRF") + if x == "" { + return false + } + + useCSRF, err := strconv.ParseBool(x) + require.NoError(t, err) + return useCSRF +} + +func doHeaderCheck(t *testing.T) bool { + x := os.Getenv("HEADER_CHECK") + if x == "" { + return false + } + + doHeaderCheck, err := strconv.ParseBool(x) + require.NoError(t, err) + return doHeaderCheck + +} + +func TestWalletAddAddresses(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + tt := []struct { + name string + encrypted bool + args []string + isUsageErr bool + expectOutput []byte + goldenFile string + }{ + { + name: "walletAddAddresses", + encrypted: false, + expectOutput: []byte("7g3M372kxwNwwQEAmrronu4anXTW8aD1XC\n"), + goldenFile: "generate-addresses.golden", + }, + { + name: "walletAddAddresses -n 2 -j", + encrypted: false, + args: []string{"-n", "2", "-j"}, + expectOutput: []byte("{\n \"addresses\": [\n \"7g3M372kxwNwwQEAmrronu4anXTW8aD1XC\",\n \"2EDapDfn1VC6P2hx4nTH2cRUkboGAE16evV\"\n ]\n}\n"), + goldenFile: "generate-addresses-2.golden", + }, + { + name: "walletAddAddresses -n -2 -j", + encrypted: false, + args: []string{"-n", "-2", "-j"}, + isUsageErr: true, + expectOutput: []byte("Error: invalid value \"-2\" for flag -n: strconv.ParseUint: parsing \"-2\": invalid syntax"), + goldenFile: "generate-addresses-2.golden", + }, + { + name: "walletAddAddresses in encrypted wallet", + encrypted: true, + args: []string{"-p", "pwd", "-j"}, + expectOutput: []byte("{\n \"addresses\": [\n \"7g3M372kxwNwwQEAmrronu4anXTW8aD1XC\"\n ]\n}\n"), + goldenFile: "generate-addresses-encrypted.golden", + }, + { + name: "walletAddAddresses in encrypted wallet with invalid password", + encrypted: true, + args: []string{"-p", "invalid password", "-j"}, + expectOutput: []byte("invalid password\n"), + }, + { + name: "walletAddAddresses in unencrypted wallet with password", + encrypted: false, + args: []string{"-p", "pwd"}, + expectOutput: []byte("wallet is not encrypted\n"), + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + walletFile, clean := createTempWallet(t, "", tc.encrypted) + defer clean() + + args := append([]string{"walletAddAddresses", walletFile}, tc.args...) + output, err := execCommandCombinedOutput(args...) + if err != nil { + require.EqualError(t, err, "exit status 1") + return + } + + if tc.isUsageErr { + require.True(t, bytes.Contains(output, tc.expectOutput)) + return + } + + require.Equal(t, tc.expectOutput, output) + + require.NoError(t, err) + + var w wallet.ReadableCollectionWallet + loadJSON(t, walletFile, &w) + + // Use loadJSON instead of loadGoldenFile because this golden file + // should not use the *update flag + goldenFile := filepath.Join(testFixturesDir, tc.goldenFile) + var expect wallet.ReadableCollectionWallet + loadJSON(t, goldenFile, &expect) + if tc.encrypted { + // wipe secrets as it's not stable + expect.Meta["secrets"] = "" + w.Meta["secrets"] = "" + } + require.Equal(t, expect, w) + }) + } +} + +func TestVerifyAddress(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + tt := []struct { + name string + addr string + err error + errMsg string + }{ + { + "valid skycoin address", + "2Kg3eRXUhY6hrDZvNGB99DKahtrPDQ1W9vN", + nil, + "", + }, + { + "invalid skycoin address", + "2KG9eRXUhx6hrDZvNGB99DKahtrPDQ1W9vn", + errors.New("exit status 1"), + "Error: Invalid checksum", + }, + { + "invalid bitcoin address", + "1Dcb9gpaZpBKmjqjCsiBsP3sBW1md2kEM2", + errors.New("exit status 1"), + "Error: Invalid checksum", + }, + } + + for _, tc := range tt { + output, err := execCommandCombinedOutput("verifyAddress", tc.addr) + if err != nil { + require.Error(t, tc.err, "%v", err) + require.Equal(t, tc.err.Error(), err.Error()) + require.Equal(t, tc.errMsg, strings.Trim(string(output), "\n")) + return + } + + require.Empty(t, output, string(output)) + } +} + +func TestDecodeRawTransaction(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + tt := []struct { + name string + rawTx string + goldenFile string + errMsg []byte + }{ + { + name: "success", + rawTx: "2601000000a1d3345ac47f897f24084b1c6b9bd6e03fc92887050d0748bdab5e639c1fdcd401000000a2a10f07e0e06cf6ba3e793b3186388a126591ee230b3f387617f1ccb6376a3f18e094bd3f7719aa8191c00764f323872f5192da393852bd85dab70b13409d2b01010000004d78de698a33abcfff22391c043b57a56bb0efbdc4a5b975bf8e7889668896bc0400000000bae12bbf671abeb1181fc85f1c01cdfee55deb97980c9c0a00000000543600000000000000373bb3675cbf3880bba3f3de7eb078925b8a72ad0095ba0a000000001c12000000000000008829025fe45b48f29795893a642bdaa89b2bb40e40d2df03000000001c12000000000000008001532c3a705e7e62bb0bb80630ecc21a87ec09c0fc9b01000000001b12000000000000", + goldenFile: "decode-raw-transaction.golden", + }, + { + name: "invalid raw transaction", + rawTx: "2601000000a1d", + errMsg: []byte("Error: invalid raw transaction: encoding/hex: odd length hex string\n"), + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + output, err := execCommandCombinedOutput("decodeRawTransaction", tc.rawTx) + if err != nil { + require.Error(t, err, "exit status 1") + require.Equal(t, tc.errMsg, output) + return + } + + require.NoError(t, err) + + var txn readable.Transaction + err = json.NewDecoder(bytes.NewReader(output)).Decode(&txn) + require.NoError(t, err) + + var expect readable.Transaction + checkGoldenFile(t, tc.goldenFile, TestData{txn, &expect}) + }) + } + +} + +func TestEncodeJSONTransaction(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + pathToGoldenFile := func(filename string) string { + return filepath.Join(testFixturesDir, filename) + } + + tt := []struct { + name string + rawTx string + errMsg []byte + args []string + }{ + { + name: "encode success", + rawTx: "2601000000a1d3345ac47f897f24084b1c6b9bd6e03fc92887050d0748bdab5e639c1fdcd401000000a2a10f07e0e06cf6ba3e793b3186388a126591ee230b3f387617f1ccb6376a3f18e094bd3f7719aa8191c00764f323872f5192da393852bd85dab70b13409d2b01010000004d78de698a33abcfff22391c043b57a56bb0efbdc4a5b975bf8e7889668896bc0400000000bae12bbf671abeb1181fc85f1c01cdfee55deb97980c9c0a00000000543600000000000000373bb3675cbf3880bba3f3de7eb078925b8a72ad0095ba0a000000001c12000000000000008829025fe45b48f29795893a642bdaa89b2bb40e40d2df03000000001c12000000000000008001532c3a705e7e62bb0bb80630ecc21a87ec09c0fc9b01000000001b12000000000000", + args: []string{"encodeJsonTransaction", pathToGoldenFile("decode-raw-transaction.golden")}, + }, + { + name: "encode recompute success", + rawTx: "b7000000006b1a69b76b2412314b2b928ad5e97c31c034be5734f9fa77f31f11b6b933b97601000000ddf4bd79f66ea9c7849c5240a27d9a4745ad4661bdac2179184447088512bb3e62c89efa4fd2cee05980c59b38ef23ddbd09bb77e54e94a0f9123d968a090d420101000000f7c183c1823266aff172928f8d06aa65531643456f97ccca6bd34d15e92fac7d01000000000421aa1694a5b04955781d91880d16c0e9c4227ae8030000000000001600000000000000", + args: []string{"encodeJsonTransaction", "--fix", pathToGoldenFile("recompute-transaction-hash.golden")}, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + output, err := execCommandCombinedOutput(tc.args...) + if err != nil { + require.Error(t, err, "exit status 1") + require.Equal(t, tc.errMsg, output) + return + } + require.NoError(t, err) + + output = bytes.Trim(output, "\n") + + require.Equal(t, tc.rawTx, string(output)) + }) + } +} + +func TestAddressGen(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + tt := []struct { + name string + args []string + err error + check func(t *testing.T, output []byte) + }{ + { + name: "addressGen --mode=wallet", + args: []string{"addressGen", "--mode=wallet"}, + check: func(t *testing.T, v []byte) { + var w wallet.ReadableDeterministicWallet + err := json.NewDecoder(bytes.NewReader(v)).Decode(&w) + require.NoError(t, err) + + // Confirms the wallet type is skycoin + require.Equal(t, wallet.CoinTypeSkycoin, wallet.CoinType(w.Meta["coin"])) + + // Confirms that the seed is consisted of 12 words + seed := w.Seed() + require.NotEmpty(t, seed) + ss := strings.Split(seed, " ") + require.Len(t, ss, 12) + }, + }, + { + name: "addressGen --mode=wallet --num 2", + args: []string{"addressGen", "--mode=wallet", "--num", "2"}, + check: func(t *testing.T, v []byte) { + var w wallet.ReadableDeterministicWallet + err := json.NewDecoder(bytes.NewReader(v)).Decode(&w) + require.NoError(t, err) + + // Confirms the wallet type is skycoin + require.Equal(t, wallet.CoinTypeSkycoin, wallet.CoinType(w.Meta["coin"])) + + // Confirms that the seed is consisted of 12 words + seed := w.Seed() + require.NotEmpty(t, seed) + ss := strings.Split(seed, " ") + require.Len(t, ss, 12) + + // Confirms that the wallet have 2 address + entries := w.GetEntries() + require.Len(t, entries, 2) + + // Confirms the addresses are generated from the seed + _, keys := cipher.MustGenerateDeterministicKeyPairsSeed([]byte(seed), 2) + for i, key := range keys { + pk := cipher.MustPubKeyFromSecKey(key) + addr := cipher.MustAddressFromSecKey(key) + require.Equal(t, addr.String(), entries[i].Address) + require.Equal(t, pk.Hex(), entries[i].Public) + require.Equal(t, key.Hex(), entries[i].Secret) + } + }, + }, + { + name: "addressGen --mode=wallet -n 2", + args: []string{"addressGen", "--mode=wallet", "-n", "2"}, + check: func(t *testing.T, v []byte) { + var w wallet.ReadableDeterministicWallet + err := json.NewDecoder(bytes.NewReader(v)).Decode(&w) + require.NoError(t, err) + + // Confirms the wallet type is skycoin + require.Equal(t, wallet.CoinTypeSkycoin, wallet.CoinType(w.Meta["coin"])) + + // Confirms that the seed is consisted of 12 words + seed := w.Seed() + require.NotEmpty(t, seed) + ss := strings.Split(seed, " ") + require.Len(t, ss, 12) + + // Confirms that the wallet have 2 address + entries := w.GetEntries() + require.Len(t, entries, 2) + + // Confirms the addresses are generated from the seed + _, keys := cipher.MustGenerateDeterministicKeyPairsSeed([]byte(seed), 2) + for i, key := range keys { + pk := cipher.MustPubKeyFromSecKey(key) + addr := cipher.MustAddressFromSecKey(key) + require.Equal(t, addr.String(), entries[i].Address) + require.Equal(t, pk.Hex(), entries[i].Public) + require.Equal(t, key.Hex(), entries[i].Secret) + } + }, + }, + { + name: "addressGen --mode=wallet --hide-secrets -n 2", + args: []string{"addressGen", "--mode=wallet", "--hide-secrets", "-n", "2"}, + check: func(t *testing.T, v []byte) { + var w wallet.ReadableDeterministicWallet + err := json.NewDecoder(bytes.NewReader(v)).Decode(&w) + require.NoError(t, err) + + // Confirms the wallet type is skycoin + require.Equal(t, wallet.CoinTypeSkycoin, wallet.CoinType(w.Meta["coin"])) + + // Confirms the secrets in Entries are hidden + require.Len(t, w.GetEntries(), 2) + for _, e := range w.GetEntries() { + require.Equal(t, e.Secret, "") + } + }, + }, + { + name: "addressGen -m=wallet -i -n 2", + args: []string{"addressGen", "-m=wallet", "-i", "-n", "2"}, + check: func(t *testing.T, v []byte) { + var w wallet.ReadableDeterministicWallet + err := json.NewDecoder(bytes.NewReader(v)).Decode(&w) + require.NoError(t, err) + + // Confirms the wallet type is skycoin + require.Equal(t, wallet.CoinTypeSkycoin, wallet.CoinType(w.Meta["coin"])) + + // Confirms the secrets in Entries are hidden + require.Len(t, w.GetEntries(), 2) + for _, e := range w.GetEntries() { + require.Equal(t, e.Secret, "") + } + }, + }, + { + name: "addressGen --mode=wallet--coin=bitcoin -n 2", + args: []string{"addressGen", "--mode=wallet", "--coin=bitcoin", "-n", "2"}, + check: func(t *testing.T, v []byte) { + var w wallet.ReadableDeterministicWallet + err := json.NewDecoder(bytes.NewReader(v)).Decode(&w) + require.NoError(t, err) + + // Confirms the wallet type is skycoin + require.Equal(t, wallet.CoinTypeBitcoin, wallet.CoinType(w.Meta["coin"])) + + entries := w.GetEntries() + require.Len(t, entries, 2) + + // Confirms the addresses are bitcoin addresses that generated from the seed + seed := w.Seed() + _, keys := cipher.MustGenerateDeterministicKeyPairsSeed([]byte(seed), 2) + for i, key := range keys { + pk := cipher.MustPubKeyFromSecKey(key) + sk := cipher.BitcoinWalletImportFormatFromSeckey(key) + address := cipher.BitcoinAddressFromPubKey(pk) + require.Equal(t, address.String(), entries[i].Address) + require.Equal(t, pk.Hex(), entries[i].Public) + require.Equal(t, sk, entries[i].Secret) + } + }, + }, + { + name: "addressGen --mode=wallet -c=btc -n 2", + args: []string{"addressGen", "--mode=wallet", "-c=btc", "-n", "2"}, + check: func(t *testing.T, v []byte) { + var w wallet.ReadableDeterministicWallet + err := json.NewDecoder(bytes.NewReader(v)).Decode(&w) + require.NoError(t, err) + + // Confirms the wallet type is skycoin + require.Equal(t, wallet.CoinTypeBitcoin, wallet.CoinType(w.Meta["coin"])) + + entries := w.GetEntries() + require.Len(t, w.GetEntries(), 2) + + // Confirms the addresses are bitcoin addresses that generated from the seed + seed := w.Seed() + _, keys := cipher.MustGenerateDeterministicKeyPairsSeed([]byte(seed), 2) + for i, key := range keys { + pk := cipher.MustPubKeyFromSecKey(key) + sk := cipher.BitcoinWalletImportFormatFromSeckey(key) + address := cipher.BitcoinAddressFromPubKey(pk) + require.Equal(t, address.String(), entries[i].Address) + require.Equal(t, pk.Hex(), entries[i].Public) + require.Equal(t, sk, entries[i].Secret) + } + }, + }, + { + name: "addressGen --mode=wallet --hex", + args: []string{"addressGen", "--mode=wallet", "--hex"}, + check: func(t *testing.T, v []byte) { + var w wallet.ReadableDeterministicWallet + err := json.NewDecoder(bytes.NewReader(v)).Decode(&w) + require.NoError(t, err) + + // Confirms the seed is a valid hex string + _, err = hex.DecodeString(w.Seed()) + require.NoError(t, err) + }, + }, + { + name: "addressGen --mode=addresses", + args: []string{"addressGen", "--mode=addresses"}, + check: func(t *testing.T, v []byte) { + // Confirms that only addresses are returned + v = bytes.Trim(v, "\n") + _, err := cipher.DecodeBase58Address(string(v)) + require.NoError(t, err) + }, + }, + { + name: "addressGen --mode=addresses --entropy=256", + args: []string{"addressGen", "--mode=addresses", "--entropy=256"}, + check: func(t *testing.T, v []byte) { + // Confirms that only addresses are returned + v = bytes.Trim(v, "\n") + _, err := cipher.DecodeBase58Address(string(v)) + require.NoError(t, err) + }, + }, + { + name: "addressGen --entropy=9", + args: []string{"addressGen", "--entropy=9"}, + check: func(t *testing.T, v []byte) { + require.Equal(t, "Error: entropy must be 128 or 256\n", string(v)) + }, + err: errors.New("exit status 1"), + }, + { + name: "addressGen --mode=wallet --seed 123", + args: []string{"addressGen", "--mode=wallet", "--seed", "123"}, + check: func(t *testing.T, v []byte) { + var w wallet.ReadableDeterministicWallet + err := json.NewDecoder(bytes.NewReader(v)).Decode(&w) + require.NoError(t, err) + + pk, sk := cipher.MustGenerateDeterministicKeyPair([]byte("123")) + addr := cipher.AddressFromPubKey(pk) + entries := w.GetEntries() + require.Len(t, entries, 1) + require.Equal(t, addr.String(), entries[0].Address) + require.Equal(t, pk.Hex(), entries[0].Public) + require.Equal(t, sk.Hex(), entries[0].Secret) + }, + }, + { + name: "addressGen --mode=wallet -s 123", + args: []string{"addressGen", "--mode=wallet", "-s", "123"}, + check: func(t *testing.T, v []byte) { + var w wallet.ReadableDeterministicWallet + err := json.NewDecoder(bytes.NewReader(v)).Decode(&w) + require.NoError(t, err) + + pk, sk := cipher.MustGenerateDeterministicKeyPair([]byte("123")) + addr := cipher.AddressFromPubKey(pk) + entries := w.GetEntries() + require.Len(t, entries, 1) + require.Equal(t, addr.String(), entries[0].Address) + require.Equal(t, pk.Hex(), entries[0].Public) + require.Equal(t, sk.Hex(), entries[0].Secret) + }, + }, + { + name: "addressGen --hide-secrets --mode=secrets", + args: []string{"addressGen", "--mode=secrets", "--hide-secrets"}, + check: func(t *testing.T, v []byte) { + require.Equal(t, "Error: secrets mode selected but hideSecrets enabled\n", string(v)) + }, + err: errors.New("exit status 1"), + }, + { + name: "addressGen --mode=secrets", + args: []string{"addressGen", "--mode=secrets"}, + check: func(t *testing.T, v []byte) { + // Confirms that only secret keys are returned + v = bytes.Trim(v, "\n") + _, err := cipher.SecKeyFromHex(string(v)) + require.NoError(t, err) + }, + }, + { + name: "addressGen --mode=secrets --coin=bitcoin", + args: []string{"addressGen", "--mode=secrets", "--coin=bitcoin"}, + check: func(t *testing.T, v []byte) { + // Confirms that only secret keys are returned + v = bytes.Trim(v, "\n") + _, err := cipher.SecKeyFromBitcoinWalletImportFormat(string(v)) + require.NoError(t, err) + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + output, err := execCommandCombinedOutput(tc.args...) + if tc.err != nil { + require.Error(t, err) + require.Equal(t, tc.err.Error(), err.Error()) + } else { + require.NoError(t, err) + } + + tc.check(t, output) + }) + } +} + +func TestFiberAddressGen(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + checkAddrsFile := func(t *testing.T, fn string, n int) []string { + b, err := ioutil.ReadFile(fn) + require.NoError(t, err) + + addrs := strings.Split(strings.TrimSpace(string(b)), "\n") + require.Equal(t, n, len(addrs)) + + rx := regexp.MustCompile(`"([a-zA-Z0-9]+)",`) + + addrsMap := make(map[string]struct{}, len(addrs)) + out := make([]string, len(addrs)) + for i, a := range addrs { + _, ok := addrsMap[a] + require.False(t, ok) + addrsMap[a] = struct{}{} + + matches := rx.FindStringSubmatch(a) + require.Len(t, matches, 2) + addr := matches[1] + + _, err := cipher.DecodeBase58Address(addr) + require.NoError(t, err) + + out[i] = addr + } + + return out + } + + checkSeedsFile := func(t *testing.T, fn string, entropy int, addrs []string) { + f, err := os.Open(fn) + require.NoError(t, err) + defer f.Close() + + r := csv.NewReader(f) + records, err := r.ReadAll() + require.NoError(t, err) + require.Len(t, records, len(addrs)) + + seedsMap := make(map[string]struct{}, len(records)) + + for i, x := range records { + require.Len(t, x, 2) + + // addr is valid and matches the addr written to the addrs file + addr := x[0] + _, err := cipher.DecodeBase58Address(addr) + require.NoError(t, err) + require.Equal(t, addrs[i], addr) + + seed := x[1] + + // no duplicate seeds + _, ok := seedsMap[seed] + require.False(t, ok) + seedsMap[seed] = struct{}{} + + // seed is a valid mnemonic + err = bip39.ValidateMnemonic(seed) + require.NoError(t, err) + + // seed entropy is as expected + switch entropy { + case 128: + require.Len(t, strings.Split(seed, " "), 12) + case 256: + require.Len(t, strings.Split(seed, " "), 24) + default: + t.Fatalf("entropy must be 128 or 256") + } + + // seed generates the correct address + pk, _ := cipher.MustGenerateDeterministicKeyPair([]byte(seed)) + regenAddr := cipher.AddressFromPubKey(pk) + require.Equal(t, addr, regenAddr.String()) + } + } + + touch := func(t *testing.T, fn string) { + f, err := os.Create(fn) + require.NoError(t, err) + defer f.Close() + err = f.Close() + require.NoError(t, err) + } + + addrsFilename := "addresses.txt" + seedsFilename := "seeds.csv" + + cases := []struct { + name string + args []string + err error + setup func(t *testing.T) + check func(t *testing.T, v []byte) + }{ + { + name: "fiberAddressGen", + args: []string{"fiberAddressGen"}, + setup: func(t *testing.T) { + testutil.RequireFileNotExists(t, addrsFilename) + testutil.RequireFileNotExists(t, seedsFilename) + }, + check: func(t *testing.T, v []byte) { + defer os.Remove(addrsFilename) + defer os.Remove(seedsFilename) + testutil.RequireFileExists(t, addrsFilename) + testutil.RequireFileExists(t, seedsFilename) + addrs := checkAddrsFile(t, addrsFilename, 100) + checkSeedsFile(t, seedsFilename, 128, addrs) + }, + }, + { + name: "fiberAddressGen --entropy=256", + args: []string{"fiberAddressGen", "--entropy=256"}, + setup: func(t *testing.T) { + testutil.RequireFileNotExists(t, addrsFilename) + testutil.RequireFileNotExists(t, seedsFilename) + }, + check: func(t *testing.T, v []byte) { + defer os.Remove(addrsFilename) + defer os.Remove(seedsFilename) + testutil.RequireFileExists(t, addrsFilename) + testutil.RequireFileExists(t, seedsFilename) + addrs := checkAddrsFile(t, addrsFilename, 100) + checkSeedsFile(t, seedsFilename, 256, addrs) + }, + }, + { + name: "fiberAddressGen -n=1", + args: []string{"fiberAddressGen", "-n=1"}, + setup: func(t *testing.T) { + testutil.RequireFileNotExists(t, addrsFilename) + testutil.RequireFileNotExists(t, seedsFilename) + }, + check: func(t *testing.T, v []byte) { + defer os.Remove(addrsFilename) + defer os.Remove(seedsFilename) + testutil.RequireFileExists(t, addrsFilename) + testutil.RequireFileExists(t, seedsFilename) + addrs := checkAddrsFile(t, addrsFilename, 1) + checkSeedsFile(t, seedsFilename, 128, addrs) + }, + }, + { + name: "fiberAddressGen can't overwrite addrs file", + args: []string{"fiberAddressGen"}, + setup: func(t *testing.T) { + testutil.RequireFileNotExists(t, addrsFilename) + testutil.RequireFileNotExists(t, seedsFilename) + touch(t, addrsFilename) + testutil.RequireFileExists(t, addrsFilename) + }, + check: func(t *testing.T, v []byte) { + defer os.Remove(addrsFilename) + defer os.Remove(seedsFilename) + testutil.RequireFileNotExists(t, seedsFilename) + require.Equal(t, "Error: -addrs-file \"addresses.txt\" already exists. Use -overwrite to force writing\n", string(v)) + }, + err: errors.New("exit status 1"), + }, + { + name: "fiberAddressGen can't overwrite seeds file", + args: []string{"fiberAddressGen"}, + setup: func(t *testing.T) { + testutil.RequireFileNotExists(t, addrsFilename) + testutil.RequireFileNotExists(t, seedsFilename) + touch(t, seedsFilename) + testutil.RequireFileExists(t, seedsFilename) + }, + check: func(t *testing.T, v []byte) { + defer os.Remove(addrsFilename) + defer os.Remove(seedsFilename) + testutil.RequireFileNotExists(t, addrsFilename) + require.Equal(t, "Error: -seeds-file \"seeds.csv\" already exists. Use -overwrite to force writing\n", string(v)) + }, + err: errors.New("exit status 1"), + }, + { + name: "fiberAddressGen --overwrite", + args: []string{"fiberAddressGen", "--overwrite"}, + setup: func(t *testing.T) { + testutil.RequireFileNotExists(t, addrsFilename) + testutil.RequireFileNotExists(t, seedsFilename) + touch(t, addrsFilename) + touch(t, seedsFilename) + testutil.RequireFileExists(t, addrsFilename) + testutil.RequireFileExists(t, seedsFilename) + }, + check: func(t *testing.T, v []byte) { + defer os.Remove(addrsFilename) + defer os.Remove(seedsFilename) + testutil.RequireFileExists(t, addrsFilename) + testutil.RequireFileExists(t, seedsFilename) + addrs := checkAddrsFile(t, addrsFilename, 100) + checkSeedsFile(t, seedsFilename, 128, addrs) + }, + }, + { + name: "fiberAddressGen --addrs-file=fooaddrs.txt --seeds-file=fooseeds.csv", + args: []string{"fiberAddressGen", "--addrs-file", "fooaddrs.txt", "--seeds-file", "fooseeds.csv"}, + setup: func(t *testing.T) { + testutil.RequireFileNotExists(t, "fooaddrs.txt") + testutil.RequireFileNotExists(t, "fooseeds.csv") + }, + check: func(t *testing.T, v []byte) { + defer os.Remove("fooaddrs.txt") + defer os.Remove("fooseeds.csv") + testutil.RequireFileExists(t, "fooaddrs.txt") + testutil.RequireFileExists(t, "fooseeds.csv") + addrs := checkAddrsFile(t, "fooaddrs.txt", 100) + checkSeedsFile(t, "fooseeds.csv", 128, addrs) + }, + }, + { + name: "fiberAddressGen positional-args-not-allowed", + args: []string{"fiberAddressGen", "foo"}, + check: func(t *testing.T, v []byte) { + testutil.RequireFileNotExists(t, addrsFilename) + testutil.RequireFileNotExists(t, seedsFilename) + require.Equal(t, "Error: this command does not take any positional arguments\n", string(v)) + }, + err: errors.New("exit status 1"), + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + if tc.setup != nil { + tc.setup(t) + } + + output, err := execCommandCombinedOutput(tc.args...) + if tc.err != nil { + require.Error(t, err) + require.Equal(t, tc.err.Error(), err.Error()) + } else { + require.NoError(t, err) + } + + tc.check(t, output) + }) + } +} + +func TestStableListWallets(t *testing.T) { + if !doStable(t) { + return + } + + walletName, clean := createUnencryptedWallet(t) + defer clean() + + output, err := execCommandCombinedOutput("listWallets", filepath.Dir(walletName)) + require.NoError(t, err, output) + + var wlts struct { + Wallets []cli.WalletEntry `json:"wallets"` + } + err = json.NewDecoder(bytes.NewReader(output)).Decode(&wlts) + require.NoError(t, err) + + var expect struct { + Wallets []cli.WalletEntry `json:"wallets"` + } + checkGoldenFile(t, "list-wallets.golden", TestData{wlts, &expect}) +} + +func TestLiveListWallets(t *testing.T) { + if !doLive(t) { + return + } + + fn := requireWalletEnv(t) + + output, err := execCommandCombinedOutput("listWallets", filepath.Dir(fn)) + require.NoError(t, err) + + var wlts struct { + Directory string `json:"directory"` + Wallets []cli.WalletEntry `json:"wallets"` + } + err = json.NewDecoder(bytes.NewReader(output)).Decode(&wlts) + require.NoError(t, err) + require.NotEmpty(t, wlts.Wallets) + require.Equal(t, filepath.Dir(fn), wlts.Directory) + + // Defaults to $DATA_DIR/wallets when no arguments are specified + output, err = execCommandCombinedOutput("listWallets") + require.NoError(t, err) + + cfg := showConfig(t) + defaultDir := filepath.Join(cfg.DataDir, "wallets") + var wlts2 struct { + Directory string `json:"directory"` + Wallets []cli.WalletEntry `json:"wallets"` + } + err = json.NewDecoder(bytes.NewReader(output)).Decode(&wlts2) + require.NoError(t, err) + require.NotEmpty(t, wlts2.Wallets) + require.Equal(t, defaultDir, wlts2.Directory) +} + +func showConfig(t *testing.T) cli.Config { + output, err := execCommandCombinedOutput("showConfig") + require.NoError(t, err) + + var ret cli.Config + err = json.NewDecoder(bytes.NewReader(output)).Decode(&ret) + require.NoError(t, err) + + return ret +} + +func TestStableListAddress(t *testing.T) { + if !doStable(t) { + return + } + + walletName, clean := createUnencryptedWallet(t) + defer clean() + + output, err := execCommandCombinedOutput("listAddresses", walletName) + require.NoError(t, err) + + var wltAddresses struct { + Addresses []string `json:"addresses"` + } + err = json.NewDecoder(bytes.NewReader(output)).Decode(&wltAddresses) + require.NoError(t, err) + + var expect struct { + Addresses []string `json:"addresses"` + } + checkGoldenFile(t, "list-addresses.golden", TestData{wltAddresses, &expect}) +} + +func TestLiveListAddresses(t *testing.T) { + if !doLive(t) { + return + } + + fn := requireWalletEnv(t) + + output, err := execCommandCombinedOutput("listAddresses", fn) + require.NoError(t, err) + + var wltAddresses struct { + Addresses []string `json:"addresses"` + } + + err = json.NewDecoder(bytes.NewReader(output)).Decode(&wltAddresses) + require.NoError(t, err) + + require.NotEmpty(t, wltAddresses.Addresses) +} + +func TestStableAddressBalance(t *testing.T) { + if !doStable(t) { + return + } + + output, err := execCommandCombinedOutput("addressBalance", "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt") + require.NoError(t, err) + + var addrBalance cli.BalanceResult + err = json.NewDecoder(bytes.NewReader(output)).Decode(&addrBalance) + require.NoError(t, err) + + var expect cli.BalanceResult + checkGoldenFile(t, "address-balance.golden", TestData{addrBalance, &expect}) +} + +func TestLiveAddressBalance(t *testing.T) { + if !doLive(t) { + return + } + + output, err := execCommandCombinedOutput("addressBalance", "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt") + require.NoError(t, err) + + var addrBalance cli.BalanceResult + err = json.NewDecoder(bytes.NewReader(output)).Decode(&addrBalance) + require.NoError(t, err) +} + +func TestStableWalletBalance(t *testing.T) { + if !doStable(t) { + return + } + + fn, clean := createUnencryptedWallet(t) + defer clean() + + output, err := execCommandCombinedOutput("walletBalance", fn) + require.NoError(t, err, output) + + var wltBalance cli.BalanceResult + err = json.NewDecoder(bytes.NewReader(output)).Decode(&wltBalance) + require.NoError(t, err) + + var expect cli.BalanceResult + checkGoldenFile(t, "wallet-balance.golden", TestData{wltBalance, &expect}) +} + +func TestLiveWalletBalance(t *testing.T) { + if !doLive(t) { + return + } + + fn := requireWalletEnv(t) + + output, err := execCommandCombinedOutput("walletBalance", fn) + require.NoError(t, err) + + var wltBalance cli.BalanceResult + err = json.NewDecoder(bytes.NewReader(output)).Decode(&wltBalance) + require.NoError(t, err) + + require.NotEmpty(t, wltBalance.Confirmed.Coins) + require.NotEmpty(t, wltBalance.Addresses) +} + +func TestStableWalletOutputs(t *testing.T) { + if !doStable(t) { + return + } + + fn, clean := createUnencryptedWallet(t) + defer clean() + + output, err := execCommandCombinedOutput("walletOutputs", fn) + require.NoError(t, err, output) + + var wltOutput cli.OutputsResult + err = json.NewDecoder(bytes.NewReader(output)).Decode(&wltOutput) + require.NoError(t, err) + + var expect cli.OutputsResult + checkGoldenFile(t, "wallet-outputs.golden", TestData{wltOutput, &expect}) +} + +func TestLiveWalletOutputs(t *testing.T) { + if !doLive(t) { + return + } + + fn := requireWalletEnv(t) + + output, err := execCommandCombinedOutput("walletOutputs", fn) + require.NoError(t, err) + + var wltOutput cli.OutputsResult + err = json.NewDecoder(bytes.NewReader(output)).Decode(&wltOutput) + require.NoError(t, err) + + require.NotEmpty(t, wltOutput.Outputs.HeadOutputs) +} + +func TestStableAddressOutputs(t *testing.T) { + if !doStable(t) { + return + } + + tt := []struct { + name string + args []string + goldenFile string + err error + errMsg string + }{ + { + name: "addressOutputs one address", + args: []string{"addressOutputs", "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt"}, + goldenFile: "address-outputs.golden", + }, + { + name: "addressOutputs two address", + args: []string{"addressOutputs", "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm"}, + goldenFile: "two-addresses-outputs.golden", + }, + { + name: "addressOutputs two address one invalid", + args: []string{"addressOutputs", "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", "badaddress"}, + err: errors.New("exit status 1"), + errMsg: "Error: invalid address: badaddress, err: Invalid address length\n", + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + output, err := execCommandCombinedOutput(tc.args...) + + if tc.err != nil { + testutil.RequireError(t, err, tc.err.Error()) + require.Equal(t, tc.errMsg, string(output)) + return + } + + require.NoError(t, err) + + var addrOutputs cli.OutputsResult + err = json.NewDecoder(bytes.NewReader(output)).Decode(&addrOutputs) + require.NoError(t, err) + + var expect cli.OutputsResult + checkGoldenFile(t, tc.goldenFile, TestData{addrOutputs, &expect}) + }) + } +} + +func TestLiveAddressOutputs(t *testing.T) { + if !doLive(t) { + return + } + + output, err := execCommandCombinedOutput("addressOutputs", "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt") + require.NoError(t, err) + + var addrOutputs cli.OutputsResult + err = json.NewDecoder(bytes.NewReader(output)).Decode(&addrOutputs) + require.NoError(t, err) +} + +func TestStableShowConfig(t *testing.T) { + if !doStable(t) { + return + } + + output, err := execCommandCombinedOutput("showConfig") + require.NoError(t, err) + + var ret cli.Config + err = json.NewDecoder(bytes.NewReader(output)).Decode(&ret) + require.NoError(t, err) + + // DataDir can't be checked perfectly without essentially + // reimplementing cli.LoadConfig to compare values + require.NotEmpty(t, ret.DataDir) + require.True(t, strings.HasSuffix(ret.DataDir, ".skycoin")) + + ret.DataDir = "IGNORED/.skycoin" + + goldenFile := "show-config.golden" + + var expect cli.Config + td := TestData{ret, &expect} + loadGoldenFile(t, goldenFile, td) + + // The RPC port is not always the same between runs of the stable integration tests, + // so use the RPC_ADDR envvar instead of the golden file value for comparison + goldenRPCAddress := expect.RPCAddress + expect.RPCAddress = rpcAddress() + + require.Equal(t, expect, ret) + + // Restore goldenfile's value before checking if JSON fields were added or removed + expect.RPCAddress = goldenRPCAddress + checkGoldenFileObjectChanges(t, goldenFile, TestData{ret, &expect}) +} + +func TestLiveShowConfig(t *testing.T) { + if !doLive(t) { + return + } + + output, err := execCommandCombinedOutput("showConfig") + require.NoError(t, err) + + var ret cli.Config + err = json.NewDecoder(bytes.NewReader(output)).Decode(&ret) + require.NoError(t, err) + + // DataDir can't be checked perfectly without essentially + // reimplementing cli.LoadConfig to compare values + require.NotEmpty(t, ret.DataDir) + require.True(t, strings.HasSuffix(ret.DataDir, ".skycoin")) + + coin := os.Getenv("COIN") + if coin == "" { + coin = "skycoin" + } + require.Equal(t, coin, ret.Coin) + + require.Equal(t, rpcAddress(), ret.RPCAddress) +} + +func TestStableStatus(t *testing.T) { + if !doStable(t) { + return + } + + output, err := execCommandCombinedOutput("status") + require.NoError(t, err) + + var ret cli.StatusResult + err = json.NewDecoder(bytes.NewReader(output)).Decode(&ret) + require.NoError(t, err) + + // TimeSinceLastBlock is not stable + ret.Status.BlockchainMetadata.TimeSinceLastBlock = wh.FromDuration(time.Duration(0)) + // Version is not stable + ret.Status.Version = readable.BuildInfo{} + // Uptime is not stable + ret.Status.Uptime = wh.FromDuration(time.Duration(0)) + // StartedAt is not stable + ret.Status.StartedAt = 0 + goldenFile := "status" + if useCSRF(t) { + goldenFile += "-csrf-enabled" + } + if !doHeaderCheck(t) { + goldenFile += "-header-check-disabled" + } + if dbNoUnconfirmed(t) { + goldenFile += "-no-unconfirmed" + } + goldenFile += ".golden" + + var expect cli.StatusResult + td := TestData{ret, &expect} + loadGoldenFile(t, goldenFile, td) + + // The RPC port is not always the same between runs of the stable integration tests, + // so use the RPC_ADDR envvar instead of the golden file value for comparison + goldenRPCAddress := expect.Config.RPCAddress + expect.Config.RPCAddress = rpcAddress() + + require.Equal(t, expect, ret) + + // Restore goldenfile's value before checking if JSON fields were added or removed + expect.Config.RPCAddress = goldenRPCAddress + checkGoldenFileObjectChanges(t, goldenFile, TestData{ret, &expect}) +} + +func TestLiveStatus(t *testing.T) { + if !doLive(t) { + return + } + + output, err := execCommandCombinedOutput("status") + require.NoError(t, err) + + var ret cli.StatusResult + err = json.NewDecoder(bytes.NewReader(output)).Decode(&ret) + require.NoError(t, err) + require.Equal(t, rpcAddress(), ret.Config.RPCAddress) +} + +func TestStableTransaction(t *testing.T) { + if !doStable(t) { + return + } + + type testCase struct { + name string + args []string + err error + errMsg string + goldenFile string + } + + tt := []testCase{ + { + name: "invalid txid", + args: []string{"abcd"}, + err: errors.New("exit status 1"), + errMsg: "Error: invalid txid\n", + goldenFile: "", + }, + { + name: "not exist", + args: []string{"540582ee4128b733f810f149e908d984a5f403ad2865108e6c1c5423aeefc759"}, + err: errors.New("exit status 1"), + errMsg: "Error: 404 Not Found\n", + goldenFile: "", + }, + { + name: "empty txid", + args: []string{""}, + err: errors.New("exit status 1"), + errMsg: "Error: txid is empty\n", + goldenFile: "", + }, + { + name: "genesis transaction", + args: []string{"d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add"}, + err: nil, + errMsg: "", + goldenFile: "genesis-transaction-cli.golden", + }, + } + + if !dbNoUnconfirmed(t) { + tt = append(tt, testCase{ + name: "unconfirmed", + args: []string{"701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947"}, + goldenFile: "unconfirmed-transaction-cli.golden", + }) + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + args := append([]string{"transaction"}, tc.args...) + o, err := execCommandCombinedOutput(args...) + if tc.err != nil { + testutil.RequireError(t, err, tc.err.Error()) + require.Equal(t, tc.errMsg, string(o)) + return + } + + require.NoError(t, err) + + var tx cli.TxnResult + err = json.NewDecoder(bytes.NewReader(o)).Decode(&tx) + require.NoError(t, err) + + var expect cli.TxnResult + checkGoldenFile(t, tc.goldenFile, TestData{tx, &expect}) + }) + } + + scanTransactions(t, true) +} + +func TestLiveTransaction(t *testing.T) { + if !doLive(t) { + return + } + + o, err := execCommandCombinedOutput("transaction", "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add") + require.NoError(t, err) + var tx cli.TxnResult + err = json.NewDecoder(bytes.NewReader(o)).Decode(&tx) + require.NoError(t, err) + + var expect cli.TxnResult + + loadGoldenFile(t, "genesis-transaction.golden", TestData{tx, &expect}) + require.Equal(t, expect.Transaction.Transaction, tx.Transaction.Transaction) + + scanTransactions(t, *liveTxFull) + + // scan pending transactions + scanPendingTransactions(t) +} + +func prepareCSVFile(t *testing.T, toAddrs [][]string) (csvFile string, teardown func(t *testing.T)) { + fn := "create_txn_test.csv" + tmpDir, err := ioutil.TempDir("", "create_raw_transaction") + require.NoError(t, err) + csvFile = filepath.Join(tmpDir, fn) + + f, err := os.Create(csvFile) + require.NoError(t, err) + defer f.Close() + w := csv.NewWriter(f) + + for _, to := range toAddrs { + err := w.Write(to) + require.NoError(t, err) + } + w.Flush() + require.NoError(t, w.Error()) + + return csvFile, func(t *testing.T) { + require.NoError(t, os.Remove(csvFile)) + } +} + +func TestLiveCreateRawTransactionV2(t *testing.T) { + if !doLive(t) { + return + } + + walletFile := requireWalletEnv(t) + w, err := wallet.Load(walletFile) + require.NoError(t, err) + addrs := w.GetAddresses() + require.Truef(t, len(addrs) >= 2, "wallet must have at least 2 addresses") + + // prepare csv file for testing + toAddrs := [][]string{ + {addrs[0].String(), "0.001"}, + {addrs[1].String(), "0.001"}, + } + csvFile, teardown := prepareCSVFile(t, toAddrs) + defer teardown(t) + + var testCases = []struct { + name string + args func(t *testing.T) []string + verify func(t *testing.T, data []byte) + }{ + { + name: "unsigned=true json=false", + args: func(t *testing.T) []string { + return []string{ + walletFile, + addrs[0].String(), // to address + "1.01", + "--unsign", + } + }, + verify: func(t *testing.T, data []byte) { + s := strings.TrimSuffix(string(data), "\n") + txn, err := coin.DeserializeTransactionHex(string(s)) + require.NoError(t, err) + require.Equal(t, 1, len(txn.Sigs)) + require.Equal(t, cipher.Sig{}, txn.Sigs[0]) + }, + }, + { + name: "unsigned=true json=true", + args: func(t *testing.T) []string { + return []string{ + walletFile, + addrs[0].String(), // to address + "1.01", + "--unsign", + "--json", + } + }, + verify: func(t *testing.T, data []byte) { + var rsp api.CreateTransactionResponse + err := json.NewDecoder(bytes.NewReader(data)).Decode(&rsp) + require.NoError(t, err) + }, + }, + { + name: "unsigned=false json=false", + args: func(t *testing.T) []string { + args := []string{ + walletFile, + addrs[0].String(), // to address + "1.01", + } + + // Require password if the wallet is encrypted + if w.IsEncrypted() { + password := os.Getenv("WALLET_PASSWORD") + if len(password) == 0 { + t.Fatal("missing WALLET_PASSWORD environment variable") + return nil + } + args = append(args, "-p", password) + } + return args + }, + verify: func(t *testing.T, data []byte) { + s := strings.TrimSuffix(string(data), "\n") + txn, err := coin.DeserializeTransactionHex(string(s)) + require.NoError(t, err) + require.Equal(t, 1, len(txn.Sigs)) + require.NotEqual(t, cipher.Sig{}, txn.Sigs[0]) + }, + }, + { + name: "unsigned=true json=false change-address", + args: func(t *testing.T) []string { + return []string{ + walletFile, + addrs[0].String(), // to address + "0.001", + "--unsign", + "--change-address", + addrs[1].String(), + } + }, + verify: func(t *testing.T, data []byte) { + s := strings.TrimSuffix(string(data), "\n") + txn, err := coin.DeserializeTransactionHex(string(s)) + require.NoError(t, err) + require.Equal(t, 1, len(txn.Sigs)) + require.Equal(t, cipher.Sig{}, txn.Sigs[0]) + require.Equal(t, 2, len(txn.Out)) + addrOutMap := make(map[string]struct{}) + for _, o := range txn.Out { + addrOutMap[o.Address.String()] = struct{}{} + } + + // Confirms that the toAddr exists in txn.Out + toAddr := addrs[1].String() + _, ok := addrOutMap[toAddr] + require.True(t, ok) + // Confirms that the change address exists in txn.Out + _, ok = addrOutMap[addrs[1].String()] + require.True(t, ok) + }, + }, + { + name: "unsigned=true json=false from-addrss", + args: func(t *testing.T) []string { + return []string{ + walletFile, + addrs[1].String(), // to address + "0.001", + "--unsign", + "--from-address", + addrs[0].String(), + } + }, + verify: func(t *testing.T, data []byte) { + s := strings.TrimSuffix(string(data), "\n") + txn, err := coin.DeserializeTransactionHex(string(s)) + require.NoError(t, err) + require.Equal(t, 1, len(txn.Sigs)) + require.Equal(t, cipher.Sig{}, txn.Sigs[0]) + // Get the uxouts of from address + uxoutsMap := getAddressOutputs(t, addrs[0].String()) + for _, in := range txn.In { + _, ok := uxoutsMap[in.String()] + require.True(t, ok) + } + }, + }, + { + name: "unsigned=true json=false -csv", + args: func(t *testing.T) []string { + return []string{ + walletFile, + "--unsign", + "--csv", + csvFile, + } + }, + verify: func(t *testing.T, data []byte) { + s := strings.TrimSuffix(string(data), "\n") + txn, err := coin.DeserializeTransactionHex(string(s)) + require.NoError(t, err) + require.Equal(t, 1, len(txn.Sigs)) + require.Equal(t, cipher.Sig{}, txn.Sigs[0]) + require.True(t, len(txn.Out) >= 2) + + // Confirms that the txn.Out contains the receiver address + addrOutMap := make(map[string]coin.TransactionOutput) + for i, o := range txn.Out { + addrOutMap[o.Address.String()] = txn.Out[i] + } + + for _, to := range toAddrs { + out, ok := addrOutMap[to[0]] + require.True(t, ok) + coins, err := droplet.FromString(to[1]) + require.NoError(t, err) + require.True(t, out.Coins >= coins) + } + }, + }, + } + + for _, tc := range testCases { + args := append([]string{"createRawTransactionV2"}, tc.args(t)...) + o, err := execCommandCombinedOutput(args...) + require.NoError(t, err) + tc.verify(t, o) + } +} + +func getAddressOutputs(t *testing.T, address string) map[string]struct{} { + output, err := execCommandCombinedOutput("addressOutputs", address) + require.NoError(t, err) + + var addrOutputs cli.OutputsResult + err = json.NewDecoder(bytes.NewReader(output)).Decode(&addrOutputs) + require.NoError(t, err) + uxoutsMap := make(map[string]struct{}) + for _, o := range addrOutputs.Outputs.HeadOutputs { + uxoutsMap[o.Hash] = struct{}{} + } + return uxoutsMap +} + +// TODO cli doesn't have command to querying pending transactions yet. +func scanPendingTransactions(t *testing.T) { +} + +// scanTransactions scans transactions against blockchain. +// If fullTest is true, scan the whole blockchain, and test every transactions, +// otherwise just test random transactions. +func scanTransactions(t *testing.T, fullTest bool) { + // Gets blockchain height through "status" command + output, err := execCommandCombinedOutput("status") + require.NoError(t, err) + + d := json.NewDecoder(bytes.NewReader(output)) + d.DisallowUnknownFields() + + var status cli.StatusResult + err = d.Decode(&status) + require.NoError(t, err) + + txids := getTxids(t, status.Status.BlockchainMetadata.Head.BkSeq) + + l := len(txids) + if !fullTest && l > randomLiveTransactionNum { + txidMap := make(map[string]struct{}) + var ids []string + for len(txidMap) < randomLiveTransactionNum { + // get random txid + txid := txids[rand.Intn(l)] + if _, ok := txidMap[txid]; !ok { + ids = append(ids, txid) + txidMap[txid] = struct{}{} + } + } + + // reassign the txids + txids = ids + } + + checkTransactions(t, txids) +} + +func checkTransactions(t *testing.T, txids []string) { + // Start goroutines to check transactions + var wg sync.WaitGroup + txC := make(chan string, 500) + nReq := 4 + if useCSRF(t) { + nReq = 1 + } + for i := 0; i < nReq; i++ { + wg.Add(1) + go func() { + defer wg.Done() + for txid := range txC { + t.Run(fmt.Sprintf("%v", txid), func(t *testing.T) { + o, err := execCommandCombinedOutput("transaction", txid) + require.NoError(t, err) + var txRlt cli.TxnResult + err = json.NewDecoder(bytes.NewReader(o)).Decode(&txRlt) + require.NoError(t, err) + require.Equal(t, txid, txRlt.Transaction.Transaction.Hash) + require.True(t, txRlt.Transaction.Status.Confirmed) + }) + } + }() + } + + for _, txid := range txids { + txC <- txid + } + close(txC) + + wg.Wait() +} + +func getTxids(t *testing.T, blockNum uint64) []string { + // p represents the number of blocks that each time we query, + // do not get all blocks in one query, which might run out of + // memory when blockchain becomes very huge. + p := 500 + n := int(blockNum / uint64(p)) + + // Collects all transactions' id + var txids []string + for i := 0; i < n; i++ { + txids = append(txids, getTxidsInBlocks(t, i*p+1, (i+1)*p)...) + } + + if (blockNum % uint64(p)) > 0 { + txids = append(txids, getTxidsInBlocks(t, n*p+1, int(blockNum)-1)...) + } + + return txids +} + +func getTxidsInBlocks(t *testing.T, start, end int) []string { + s := strconv.Itoa(start) + e := strconv.Itoa(end) + o, err := execCommandCombinedOutput("blocks", s, e) + require.NoError(t, err) + var blocks readable.Blocks + err = json.NewDecoder(bytes.NewReader(o)).Decode(&blocks) + require.NoError(t, err) + require.Len(t, blocks.Blocks, end-start+1) + + var txids []string + for _, b := range blocks.Blocks { + for _, tx := range b.Body.Transactions { + txids = append(txids, tx.Hash) + } + } + return txids +} + +func TestStableBlocks(t *testing.T) { + if !doStable(t) { + return + } + + testKnownBlocks(t) + + // Tests blocks 180~181, should only return block 180. + output, err := execCommandCombinedOutput("blocks", "180", "181") + require.NoError(t, err) + + var blocks readable.Blocks + err = json.NewDecoder(bytes.NewReader(output)).Decode(&blocks) + require.NoError(t, err) + + var expect readable.Blocks + checkGoldenFile(t, "blocks180.golden", TestData{blocks, &expect}) +} + +func TestLiveBlocks(t *testing.T) { + if !doLive(t) { + return + } + + testKnownBlocks(t) + + // These blocks were affected by the coinhour overflow issue, make sure that they can be queried + blockSeqs := []int{11685, 11707, 11710, 11709, 11705, 11708, 11711, 11706, 11699} + + for _, seq := range blockSeqs { + output, err := execCommandCombinedOutput("blocks", strconv.Itoa(seq)) + require.NoError(t, err) + var blocks readable.Blocks + err = json.NewDecoder(bytes.NewReader(output)).Decode(&blocks) + require.NoError(t, err) + } +} + +func testKnownBlocks(t *testing.T) { + tt := []struct { + name string + args []string + goldenFile string + }{ + { + "blocks 0", + []string{"blocks", "0"}, + "block0.golden", + }, + { + "blocks 0 5", + []string{"blocks", "0", "5"}, + "blocks0-5.golden", + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + output, err := execCommandCombinedOutput(tc.args...) + require.NoError(t, err) + + var blocks readable.Blocks + err = json.NewDecoder(bytes.NewReader(output)).Decode(&blocks) + require.NoError(t, err) + + var expect readable.Blocks + checkGoldenFile(t, tc.goldenFile, TestData{blocks, &expect}) + }) + } + + scanBlocks(t, "0", "180") +} + +func scanBlocks(t *testing.T, start, end string) { //nolint:unparam + outputs, err := execCommandCombinedOutput("blocks", start, end) + require.NoError(t, err) + + var blocks readable.Blocks + err = json.NewDecoder(bytes.NewReader(outputs)).Decode(&blocks) + require.NoError(t, err) + + var preBlocks readable.Block + preBlocks.Head.Hash = "0000000000000000000000000000000000000000000000000000000000000000" + for _, b := range blocks.Blocks { + require.Equal(t, b.Head.PreviousHash, preBlocks.Head.Hash) + preBlocks = b + } +} + +func TestStableLastBlocks(t *testing.T) { + if !doStable(t) { + return + } + + tt := []struct { + name string + args []string + goldenFile string + errMsg []byte + }{ + { + name: "lastBlocks 0", + args: []string{"lastBlocks", "0"}, + goldenFile: "last-blocks0.golden", + }, + { + name: "lastBlocks 1", + args: []string{"lastBlocks", "1"}, + goldenFile: "last-blocks1.golden", + }, + { + name: "lastBlocks 2", + args: []string{"lastBlocks", "2"}, + goldenFile: "last-blocks2.golden", + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + output, err := execCommandCombinedOutput(tc.args...) + + if bytes.Contains(output, []byte("Error: ")) { + require.Equal(t, string(tc.errMsg), string(output)) + return + } + + require.NoError(t, err) + + var blocks readable.Blocks + err = json.NewDecoder(bytes.NewReader(output)).Decode(&blocks) + require.NoError(t, err) + + var expect readable.Blocks + checkGoldenFile(t, tc.goldenFile, TestData{blocks, &expect}) + }) + } +} + +func TestLiveLastBlocks(t *testing.T) { + if !doLive(t) { + return + } + + tt := []struct { + name string + args []string + }{ + { + "lastBlocks 0", + []string{"lastBlocks", "0"}, + }, + { + "lastBlocks 1", + []string{"lastBlocks", "1"}, + }, + { + "lastBlocks 2", + []string{"lastBlocks", "2"}, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + output, err := execCommandCombinedOutput(tc.args...) + require.NoError(t, err) + + var blocks readable.Blocks + err = json.NewDecoder(bytes.NewReader(output)).Decode(&blocks) + require.NoError(t, err) + }) + } +} + +// TestLiveSend sends coin from specific wallet file, user should manually specify the +// wallet file by setting the CLI_WALLET_FILE environment variable +// +// Note: +// 1. This test might modify the wallet file, in order to avoid losing coins, we don't send coins to +// addresses that are not belong to the wallet, when addresses in the wallet are not sufficient, we +// will automatically generate enough addresses as coin recipient. +// 2. The wallet must must have at least 2 coins and 16 coinhours. +func TestLiveSend(t *testing.T) { + if !doLive(t) { + return + } + + fn := requireWalletEnv(t) + + // prepares wallet and confirms the wallet has at least 2 coins and 16 coin hours. + w, totalCoins, _ := prepareAndCheckWallet(t, 2e6, 16) + entries := w.GetEntries() + + if w.IsEncrypted() { + t.Skip("CLI wallet integration tests do not support encrypted wallets yet") + return + } + + tt := []struct { + name string + args func() []string + errMsg []byte + checkTxn func(t *testing.T, txid string) + }{ + { + // Send all coins to the first address to one output. + name: "send all coins to the first address", + args: func() []string { + coins, err := droplet.ToString(totalCoins) + require.NoError(t, err) + return []string{"send", fn, entries[0].Address.String(), coins} + }, + checkTxn: func(t *testing.T, txid string) { + // Confirms all coins are in the first address in one output + tx := getTransaction(t, txid) + require.Len(t, tx.Transaction.Transaction.Out, 1) + c, err := droplet.FromString(tx.Transaction.Transaction.Out[0].Coins) + require.NoError(t, err) + require.Equal(t, totalCoins, c) + }, + }, + { + // Send 0.5 coin to the second address. + // Send 0.5 coin to the third address. + // After sending, the first address should have at least 1 coin left. + name: "send to multiple address with -m option", + args: func() []string { + addrCoins := []struct { + Addr string `json:"addr"` + Coins string `json:"coins"` + }{ + { + entries[1].Address.String(), + "0.5", + }, + { + entries[2].Address.String(), + "0.5", + }, + } + + v, err := json.Marshal(addrCoins) + require.NoError(t, err) + + return []string{"send", fn, "-m", string(v)} + }, + checkTxn: func(t *testing.T, txid string) { + tx := getTransaction(t, txid) + // Confirms the second address receives 0.5 coin and 1 coinhour in this transaction + checkCoinsAndCoinhours(t, tx, entries[1].Address.String(), 5e5, 1) + // Confirms the third address receives 0.5 coin and 1 coinhour in this transaction + checkCoinsAndCoinhours(t, tx, entries[2].Address.String(), 5e5, 1) + // Confirms the first address has at least 1 coin left. + coins, _ := getAddressBalance(t, entries[0].Address.String()) + require.True(t, coins >= 1e6) + }, + }, + { + // Send 0.001 coin from the third address to the second address. + // Set the second as change address, so the 0.499 change coin will also be sent to the second address. + // After sending, the second address should have 1 coin and 1 coin hour. + name: "send with -c(change address) -a(from address) options", + args: func() []string { + return []string{"send", fn, "-c", entries[1].Address.String(), + "-a", entries[2].Address.String(), entries[1].Address.String(), "0.001"} + }, + checkTxn: func(t *testing.T, txid string) { + tx := getTransaction(t, txid) + // Confirms the second address receives 0.5 coin and 0 coinhour in this transaction + checkCoinsAndCoinhours(t, tx, entries[1].Address.String(), 5e5, 0) + // Confirms the second address have 1 coin and 1 coin hour + coins, hours := getAddressBalance(t, entries[1].Address.String()) + require.Equal(t, uint64(1e6), coins) + require.Equal(t, uint64(1), hours) + }, + }, + { + // Send 1 coin from second to the the third address, this will spend three outputs(0.2, 0.3. 0.5 coin), + // and burn out the remaining 1 coin hour. + name: "send to burn all coin hour", + args: func() []string { + return []string{"send", fn, "-a", entries[1].Address.String(), + entries[2].Address.String(), "1"} + }, + checkTxn: func(t *testing.T, txid string) { + // Confirms that the third address has 1 coin and 0 coin hour + coins, hours := getAddressBalance(t, entries[2].Address.String()) + require.Equal(t, uint64(1e6), coins) + require.Equal(t, uint64(0), hours) + }, + }, + { + // Send with 0 coin hour, this test should fail. + name: "send 0 coin hour", + args: func() []string { + return []string{"send", fn, "-a", entries[2].Address.String(), + entries[1].Address.String(), "1"} + }, + errMsg: []byte("See 'skycoin-cli send --help'\nError: Transaction has zero coinhour fee"), + checkTxn: func(t *testing.T, txid string) {}, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + output, err := execCommandCombinedOutput(tc.args()...) + + output = bytes.TrimRight(output, "\n") + + if tc.errMsg != nil { + require.Equal(t, err.Error(), "exit status 1") + require.Equal(t, tc.errMsg, output) + return + } + + require.NoError(t, err) + + // output: "txid:$txid_string" + // split the output to get txid value + v := bytes.Split(output, []byte(":")) + require.Len(t, v, 2) + txid := string(v[1]) + fmt.Println("txid:", txid) + _, err = cipher.SHA256FromHex(txid) + require.NoError(t, err) + + // Wait until transaction is confirmed. + tk := time.NewTicker(time.Second) + loop: + for { + select { + case <-time.After(30 * time.Second): + t.Fatal("Wait tx confirmation timeout") + case <-tk.C: + if isTxConfirmed(t, txid) { + break loop + } + } + } + + tc.checkTxn(t, txid) + }) + } +} + +func TestLiveSendNotEnoughDecimals(t *testing.T) { + if !doLive(t) { + return + } + + fn := requireWalletEnv(t) + + // prepares wallet and confirms the wallet has at least 2 coins and 16 coin hours. + w, _, _ := prepareAndCheckWallet(t, 2e6, 16) + + if w.IsEncrypted() { + t.Skip("CLI wallet integration tests do not support encrypted wallets yet") + return + } + + // Send with too small decimal value + // CLI send is a litte bit slow, almost 300ms each. so we only test 20 invalid decimal coin. + errMsg := []byte("See 'skycoin-cli send --help'\nError: Transaction violates soft constraint: invalid amount, too many decimal places") + for i := uint64(1); i < uint64(20); i++ { + v, err := droplet.ToString(i) + require.NoError(t, err) + name := fmt.Sprintf("send %v", v) + t.Run(name, func(t *testing.T) { + output, err := execCommandCombinedOutput("send", fn, w.GetEntryAt(0).Address.String(), v) + require.Error(t, err) + require.Equal(t, err.Error(), "exit status 1") + output = bytes.TrimRight(output, "\n") + require.Equal(t, errMsg, output) + }) + } + +} + +// TestLiveCreateAndBroadcastRawTransaction does almost the same procedure as TestLiveSend. +// Create raw transaction with command arguments the same as TestLiveSend, then broadcast the +// created raw transaction. After the transaction is confirmed, run the same transaction check +// function like in TestLiveSend. +func TestLiveCreateAndBroadcastRawTransaction(t *testing.T) { + if !doLive(t) { + return + } + + fn := requireWalletEnv(t) + + // prepares wallet and confirms the wallet has at least 2 coins and 2 coin hours. + w, totalCoins, _ := prepareAndCheckWallet(t, 2e6, 2) + + if w.IsEncrypted() { + t.Skip("CLI wallet integration tests do not support encrypted wallets yet") + return + } + + var tmpCSVFile string + + defer func() { + if tmpCSVFile != "" { + err := os.Remove(tmpCSVFile) + require.NoError(t, err) + } + }() + + tt := []struct { + name string + args func() []string + errMsg string + checkTxn func(t *testing.T, txid string) + }{ + { + // Send all coins to the first address to one output. + name: "send all coins to the first address", + args: func() []string { + coins, err := droplet.ToString(totalCoins) + require.NoError(t, err) + return []string{"createRawTransaction", fn, w.GetEntryAt(0).Address.String(), coins} + }, + checkTxn: func(t *testing.T, txid string) { + // Confirms all coins are in the first address in one output + tx := getTransaction(t, txid) + require.Len(t, tx.Transaction.Transaction.Out, 1) + c, err := droplet.FromString(tx.Transaction.Transaction.Out[0].Coins) + require.NoError(t, err) + require.Equal(t, totalCoins, c) + }, + }, + { + // Send 0.5 coin to the second address. + // Send 0.5 coin to the third address. + // After sending, the first address should have at least 1 coin left. + name: "send to multiple address with -m option", + args: func() []string { + addrCoins := []struct { + Addr string `json:"addr"` + Coins string `json:"coins"` + }{ + { + w.GetEntryAt(1).Address.String(), + "0.5", + }, + { + w.GetEntryAt(2).Address.String(), + "0.5", + }, + } + + v, err := json.Marshal(addrCoins) + require.NoError(t, err) + + return []string{"createRawTransaction", fn, "-m", string(v)} + }, + checkTxn: func(t *testing.T, txid string) { + // Confirms the first address has at least 1 coin left. + coins, _ := getAddressBalance(t, w.GetEntryAt(0).Address.String()) + require.True(t, coins >= 1e6) + }, + }, + { + // Send 0.5 coin to the second address. + // Send 0.5 coin to the third address. + // After sending, the first address should have at least 1 coin left. + name: "send to multiple address with --csv option", + args: func() []string { + fields := [][]string{ + {w.GetEntryAt(1).Address.String(), "0.5"}, + {w.GetEntryAt(2).Address.String(), "0.5"}, + } + + f, err := ioutil.TempFile("", "createrawtxn") + require.NoError(t, err) + defer f.Close() + + w := csv.NewWriter(f) + + err = w.WriteAll(fields) + require.NoError(t, err) + + w.Flush() + err = w.Error() + require.NoError(t, err) + + tmpCSVFile = f.Name() + + return []string{"createRawTransaction", fn, "--csv", tmpCSVFile} + }, + checkTxn: func(t *testing.T, txid string) { + // Confirms the first address has at least 1 coin left. + coins, _ := getAddressBalance(t, w.GetEntryAt(0).Address.String()) + require.True(t, coins >= 1e6) + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + // Create raw transaction first + output, err := execCommandCombinedOutput(tc.args()...) + if err != nil { + t.Fatalf("err: %v, output: %v", err, string(output)) + return + } + require.NoError(t, err) + output = bytes.TrimRight(output, "\n") + if bytes.Contains(output, []byte("Error:")) { + require.Equal(t, tc.errMsg, string(output)) + return + } + + // Broadcast transaction + output, err = execCommandCombinedOutput("broadcastTransaction", string(output)) + require.NoError(t, err, string(output)) + + txid := string(bytes.TrimRight(output, "\n")) + fmt.Println("txid:", txid) + _, err = cipher.SHA256FromHex(txid) + require.NoError(t, err) + + // Wait until transaction is confirmed. + tk := time.NewTicker(time.Second) + loop: + for { + select { + case <-time.After(30 * time.Second): + t.Fatal("Wait tx confirmation timeout") + case <-tk.C: + if isTxConfirmed(t, txid) { + break loop + } + } + } + + tc.checkTxn(t, txid) + }) + } + + // Send with too small decimal value + errMsg := "Error: Transaction violates soft constraint: invalid amount, too many decimal places" + for i := uint64(1); i < uint64(20); i++ { + v, err := droplet.ToString(i) + require.NoError(t, err) + name := fmt.Sprintf("send %v", v) + t.Run(name, func(t *testing.T) { + output, err := execCommandCombinedOutput("createRawTransaction", fn, w.GetEntryAt(0).Address.String(), v) + require.Error(t, err) + output = bytes.Trim(output, "\n") + require.Equal(t, errMsg, string(output)) + }) + } +} + +func getTransaction(t *testing.T, txid string) *cli.TxnResult { + output, err := execCommandCombinedOutput("transaction", txid) + if err != nil { + t.Log(string(output)) + return nil + } + + require.NoError(t, err) + + var tx cli.TxnResult + err = json.NewDecoder(bytes.NewReader(output)).Decode(&tx) + require.NoError(t, err) + + return &tx +} + +func isTxConfirmed(t *testing.T, txid string) bool { + tx := getTransaction(t, txid) + require.NotNil(t, tx) + require.NotNil(t, tx.Transaction) + require.NotNil(t, tx.Transaction.Status) + return tx.Transaction.Status.Confirmed +} + +// checkCoinhours checks if the address coinhours in transaction are correct +func checkCoinsAndCoinhours(t *testing.T, tx *cli.TxnResult, addr string, coins, coinhours uint64) { //nolint:unparam + addrCoinhoursMap := make(map[string][]readable.TransactionOutput) + for _, o := range tx.Transaction.Transaction.Out { + addrCoinhoursMap[o.Address] = append(addrCoinhoursMap[o.Address], o) + } + + os, ok := addrCoinhoursMap[addr] + if !ok { + t.Fatalf("transaction doesn't have receiver of address: %v", addr) + } + + var totalCoins, totalHours uint64 + for _, o := range os { + c, err := droplet.FromString(o.Coins) + if err != nil { + t.Fatalf("%v", err) + } + totalCoins += c + totalHours += o.Hours + } + + require.Equal(t, coins, totalCoins) + require.Equal(t, coinhours, totalHours) +} + +// prepareAndCheckWallet prepares wallet for live testing. +// Returns wallet.Wallet, total coin, total hours. +// Confirms that the wallet meets the minimal requirements of coins and coinhours. +func prepareAndCheckWallet(t *testing.T, miniCoins, miniCoinHours uint64) (wallet.Wallet, uint64, uint64) { //nolint:unparam + walletFile := requireWalletEnv(t) + // Checks if the wallet does exist + if _, err := os.Stat(walletFile); os.IsNotExist(err) { + t.Fatalf("Wallet file: %v does not exist", walletFile) + } + + // Loads the wallet + w, err := wallet.Load(walletFile) + if err != nil { + t.Fatalf("Load wallet failed: %v", err) + } + + if w.EntriesLen() < 3 { + // Generates addresses + _, err = w.GenerateAddresses(uint64(3 - w.EntriesLen())) + if err != nil { + t.Fatalf("Wallet generateAddress failed: %v", err) + } + } + + outputs := getWalletOutputs(t, walletFile) + // Confirms the wallet is not empty. + if len(outputs) == 0 { + t.Fatalf("Wallet %v has no coin", walletFile) + } + + var totalCoins uint64 + var totalCoinhours uint64 + for _, output := range outputs { + coins, err := droplet.FromString(output.Coins) + if err != nil { + t.Fatalf("%v", err) + } + + totalCoins += coins + totalCoinhours += output.CalculatedHours + } + + // Confirms the coins meet minimal coins requirement + if totalCoins < miniCoins { + t.Fatalf("Wallet must have at least %v coins", miniCoins) + } + + if totalCoinhours < miniCoinHours { + t.Fatalf("Wallet must have at least %v coinhours", miniCoinHours) + } + + if err := wallet.Save(w, filepath.Dir(walletFile)); err != nil { + t.Fatalf("%v", err) + } + return w, totalCoins, totalCoinhours +} + +func getAddressBalance(t *testing.T, addr string) (uint64, uint64) { + output, err := execCommandCombinedOutput("addressBalance", addr) + require.NoError(t, err, string(output)) + + var addrBalance cli.BalanceResult + err = json.NewDecoder(bytes.NewReader(output)).Decode(&addrBalance) + require.NoError(t, err) + coins, err := droplet.FromString(addrBalance.Confirmed.Coins) + require.NoError(t, err) + + hours, err := strconv.ParseUint(addrBalance.Confirmed.Hours, 10, 64) + require.NoError(t, err) + return coins, hours +} + +func getWalletOutputs(t *testing.T, walletFile string) readable.UnspentOutputs { + output, err := execCommandCombinedOutput("walletOutputs", walletFile) + require.NoError(t, err, string(output)) + + var wltOutput cli.OutputsResult + err = json.NewDecoder(bytes.NewReader(output)).Decode(&wltOutput) + require.NoError(t, err) + + return wltOutput.Outputs.HeadOutputs +} + +func TestStableWalletHistory(t *testing.T) { + if !doStable(t) { + return + } + + fn, clean := createUnencryptedWallet(t) + defer clean() + + output, err := execCommandCombinedOutput("walletHistory", fn) + require.NoError(t, err, output) + + var history []cli.AddrHistory + err = json.NewDecoder(bytes.NewReader(output)).Decode(&history) + require.NoError(t, err) + + var expect []cli.AddrHistory + checkGoldenFile(t, "wallet-history.golden", TestData{history, &expect}) +} + +func TestLiveWalletHistory(t *testing.T) { + if !doLive(t) { + return + } + + fn := requireWalletEnv(t) + + output, err := execCommandCombinedOutput("walletHistory", fn) + require.NoError(t, err) + var his []cli.AddrHistory + err = json.NewDecoder(bytes.NewReader(output)).Decode(&his) + require.NoError(t, err) +} + +func TestStableCheckDB(t *testing.T) { + if !doStable(t) { + return + } + + tt := []struct { + name string + dbPath string + result string + errMsg string + }{ + { + name: "no signature", + dbPath: "../../visor/testdata/data.db.nosig", + errMsg: "Error: checkdb failed: Signature not found for block seq=1000 hash=71852c1a8ab5e470bd14e5fce8e1116697151181a188d4262b545542fb3d526c\n", + }, + { + name: "invalid database", + dbPath: "../../visor/testdata/data.db.garbage", + errMsg: "Error: open db failed: invalid database\n", + }, + { + name: "valid database", + dbPath: "../../api/integration/testdata/blockchain-180.db", + result: "check db success\n", + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + output, err := execCommandCombinedOutput("checkdb", tc.dbPath) + if err != nil { + t.Log(string(output)) + require.Equal(t, tc.errMsg, string(output)) + return + } + require.NoError(t, err) + require.Equal(t, tc.result, string(output)) + }) + } +} + +func TestVersion(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + // Gets version in json format. + output, err := execCommandCombinedOutput("version", "-j") + require.NoError(t, err) + + var ver = struct { + Skycoin string `json:"skycoin"` + Cli string `json:"cli"` + RPC string `json:"rpc"` + Wallet string `json:"wallet"` + }{} + err = json.NewDecoder(bytes.NewReader(output)).Decode(&ver) + require.NoError(t, err) + require.True(t, ver.Skycoin != "") + require.True(t, ver.Cli != "") + require.True(t, ver.RPC != "") + require.True(t, ver.Wallet != "") + + // Gets version without json format. + output, err = execCommandCombinedOutput("version") + require.NoError(t, err) + + // Confirms the result contains 4 version componments + output = bytes.TrimRight(output, "\n") + vers := bytes.Split(output, []byte("\n")) + require.Len(t, vers, 4) +} + +func TestStableWalletCreateXPubFlow(t *testing.T) { + if !doStable(t) { + return + } + + // The flow to create an xpub wallet is: + // - Create a bip44 wallet + // - Export an xpub key from the bip44 wallet + // - Create an xpub wallet from the xpub key + + dir, clean := createTempWalletDir(t) + defer clean() + + bip44Filename := filepath.Join(dir, "bip44.wlt") + + // Create a bip44 wallet + args := []string{"walletCreate", bip44Filename, "-t", "bip44", "-n", "10"} + _, err := execCommandCombinedOutput(args...) + require.NoError(t, err) + + // Export the xpub key from the bip44 wallet subpath 0'/0 + args = []string{"walletKeyExport", bip44Filename, "-k", "xpub", "--path", "0/0"} + output, err := execCommandCombinedOutput(args...) + require.NoError(t, err) + + xpub := strings.TrimSpace(string(output)) + + xpubFilename := filepath.Join(dir, "xpub.wlt") + + // Create an xpub wallet + args = []string{"walletCreate", xpubFilename, "-t", "xpub", "--xpub", xpub, "-n", "10"} + _, err = execCommandCombinedOutput(args...) + require.NoError(t, err) + + // Compare the entries of both wallets: they should match + w, err := wallet.Load(bip44Filename) + require.NoError(t, err) + + w2, err := wallet.Load(xpubFilename) + require.NoError(t, err) + + for i, e := range w.GetEntries() { + e2 := w2.GetEntryAt(i) + require.Equal(t, e.Public, e2.Public) + require.Equal(t, e.Address, e2.Address) + require.False(t, e.Secret.Null()) + require.True(t, e2.Secret.Null()) + require.Equal(t, e.ChildNumber, uint32(i)) + require.Equal(t, e.ChildNumber, e2.ChildNumber) + require.Equal(t, e.Change, e2.Change) + } +} + +func TestStableWalletCreate(t *testing.T) { + if !doStable(t) { + return + } + + defaultFilename := "skycoin-cli-integration-test.wlt" + + tt := []struct { + name string + filename string + args []string + setup func(t *testing.T, filename string) func() + errMsg string + errMsgFunc func(filename string) string + checkWallet func(t *testing.T, w wallet.Wallet) + }{ + { + name: "generate wallet with -r option", + args: []string{"-r", "-t", wallet.WalletTypeDeterministic}, + checkWallet: func(t *testing.T, w wallet.Wallet) { + require.Equal(t, defaultFilename, w.Filename()) + + // Confirms the seed is a valid hex string + _, err := hex.DecodeString(w.Seed()) + require.NoError(t, err) + + // Confirms the label is empty + require.Empty(t, w.Label()) + }, + }, + { + name: "generate wallet with -r option bip44", + args: []string{"-r", "-t", wallet.WalletTypeBip44}, + errMsg: "Error: -r can't be used for bip44 wallets\n", + }, + { + name: "generate wallet with -m option", + args: []string{"-m"}, + checkWallet: func(t *testing.T, w wallet.Wallet) { + require.Equal(t, defaultFilename, w.Filename()) + + // Confirms the seed has 12 words + seed := w.Seed() + words := strings.Split(seed, " ") + require.Len(t, words, 12) + + err := bip39.ValidateMnemonic(seed) + require.NoError(t, err) + + // Confirms the label is empty + require.Empty(t, w.Label()) + }, + }, + { + name: "generate wallet with -s option", + args: []string{"-t", wallet.WalletTypeDeterministic, "-s", "great duck trophy inhale dad pluck include maze smart mechanic ring merge"}, + checkWallet: func(t *testing.T, w wallet.Wallet) { + require.Equal(t, defaultFilename, w.Filename()) + // Confirms the label is empty + require.Empty(t, w.Label()) + + require.Equal(t, "great duck trophy inhale dad pluck include maze smart mechanic ring merge", w.Seed()) + require.Equal(t, "2amA8sxKJhNRp3wfWrE5JfTEUjr9S3C2BaU", w.GetEntryAt(0).Address.String()) + require.Equal(t, "02b4a4b63f2f8ba56f9508712815eca3c088693333715eaf7a73275d8928e1be5a", w.GetEntryAt(0).Public.Hex()) + require.Equal(t, "f4a281d094a6e9e95a84c23701a7d01a0e413c838758e94ad86a10b9b83e0434", w.GetEntryAt(0).Secret.Hex()) + }, + }, + { + name: "generate wallet with -s option bip44", + args: []string{"-t", wallet.WalletTypeBip44, "-s", "great duck trophy inhale dad pluck include maze smart mechanic ring merge"}, + checkWallet: func(t *testing.T, w wallet.Wallet) { + require.Equal(t, defaultFilename, w.Filename()) + // Confirms the label is empty + require.Empty(t, w.Label()) + + require.Equal(t, "great duck trophy inhale dad pluck include maze smart mechanic ring merge", w.Seed()) + require.Equal(t, "skPFvAokn63RTHh8MR8cZuHUpzZiutFeks", w.GetEntryAt(0).Address.String()) + require.Equal(t, "0381a3a0ed879eae12a612d24c73c39ff1d9f3c238e10ecf29c318db11e84e1143", w.GetEntryAt(0).Public.Hex()) + require.Equal(t, "7519c63c890d593a11eeebfe4b4552f3d8a01094c086262e7c68a3e7adc61677", w.GetEntryAt(0).Secret.Hex()) + }, + }, + { + name: "generate wallet with -s option and seed-passphrase bip44", + args: []string{"-t", wallet.WalletTypeBip44, "--seed-passphrase", "foobar", "-s", "great duck trophy inhale dad pluck include maze smart mechanic ring merge"}, + checkWallet: func(t *testing.T, w wallet.Wallet) { + require.Equal(t, defaultFilename, w.Filename()) + // Confirms the label is empty + require.Empty(t, w.Label()) + + require.Equal(t, "foobar", w.SeedPassphrase()) + require.Equal(t, "great duck trophy inhale dad pluck include maze smart mechanic ring merge", w.Seed()) + require.Equal(t, "29bFTouyAtgRhdhHqiC6kccom3avjBpfnxS", w.GetEntryAt(0).Address.String()) + require.Equal(t, "02dbaefd35105e27ac7428505186844dcb9472021a5fdfb057c106722f3396bdf6", w.GetEntryAt(0).Public.Hex()) + require.Equal(t, "c2edb45b4c5c7828d6b879a163cb2bf016746e9c03efe5df24e9ded878b0b772", w.GetEntryAt(0).Secret.Hex()) + }, + }, + { + name: "generate wallet with -s option and seed-passphrase deterministic", + args: []string{"-t", wallet.WalletTypeDeterministic, "--seed-passphrase", "foobar", "-s", "great duck trophy inhale dad pluck include maze smart mechanic ring merge"}, + errMsg: "Error: seedPassphrase is only used for \"bip44\" wallets\n", + }, + { + name: "generate wallet with -n option, bip44", + args: []string{"-n", "5", "-t", wallet.WalletTypeBip44}, + checkWallet: func(t *testing.T, w wallet.Wallet) { + require.Equal(t, defaultFilename, w.Filename()) + require.Equal(t, wallet.WalletTypeBip44, w.Type()) + // Confirms the label is empty + require.Empty(t, w.Label()) + // Confirms wallet has 5 address entries + require.Len(t, w.(*wallet.Bip44Wallet).ExternalEntries, 5) + require.Len(t, w.GetEntries(), 5) + }, + }, + { + name: "generate wallet with -n option", + args: []string{"-n", "5"}, + checkWallet: func(t *testing.T, w wallet.Wallet) { + require.Equal(t, defaultFilename, w.Filename()) + require.Equal(t, wallet.WalletTypeDeterministic, w.Type()) + // Confirms the label is empty + require.Empty(t, w.Label()) + // Confirms wallet has 5 address entries + require.Len(t, w.GetEntries(), 5) + }, + }, + { + name: "generate wallet with -l option", + args: []string{"-l", "integration-cli"}, + checkWallet: func(t *testing.T, w wallet.Wallet) { + require.Equal(t, defaultFilename, w.Filename()) + label := w.Label() + require.Equal(t, "integration-cli", label) + }, + }, + { + name: "generate wallet with duplicate wallet name", + args: []string{}, + filename: stableWalletName, + setup: func(t *testing.T, filename string) func() { + _, clean := createUnencryptedWalletAt(t, filename) + return clean + }, + errMsgFunc: func(filename string) string { + return fmt.Sprintf("Error: %s already exists\n", filename) + }, + }, + { + name: "encrypt=true", + args: []string{"-e", "-p", "pwd"}, + checkWallet: func(t *testing.T, w wallet.Wallet) { + require.Equal(t, defaultFilename, w.Filename()) + // Confirms the wallet is encrypted + require.True(t, w.IsEncrypted()) + require.Empty(t, w.Seed()) + require.Empty(t, w.LastSeed()) + + // Confirms the secrets in address entries are empty + for _, e := range w.GetEntries() { + require.Equal(t, cipher.SecKey{}, e.Secret) + } + }, + }, + { + name: "encrypt=false password=pwd", + args: []string{"-p", "pwd"}, + errMsg: "Error: password should not be set as we're not going to create a wallet with encryption\n", + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + dir, clean := createTempWalletDir(t) + defer clean() + + if tc.filename == "" { + tc.filename = defaultFilename + } + + walletName := filepath.Join(dir, tc.filename) + + if tc.setup != nil { + clean := tc.setup(t, walletName) + defer clean() + } + + if tc.errMsg != "" && tc.errMsgFunc != nil { + t.Fatal("errMsg and errMsgFunc can't be set together") + } + + errMsg := tc.errMsg + if tc.errMsgFunc != nil { + errMsg = tc.errMsgFunc(walletName) + } + + // Run command with arguments + args := append([]string{"walletCreate", walletName}, tc.args...) + output, err := execCommandCombinedOutput(args...) + if err != nil { + require.EqualError(t, err, "exit status 1") + require.Equal(t, []byte(errMsg), output) + return + } + + require.Empty(t, errMsg, "the command did not return an error, but we expected one") + + // os.Stdout should match the wallet written on disk + contents, err := ioutil.ReadFile(walletName) + require.NoError(t, err) + require.Equal(t, append(contents, '\n'), output) + + w, err := wallet.Load(walletName) + require.NoError(t, err) + + if !w.IsEncrypted() { + // Confirms all entries and lastSeed are derived from seed. + checkWalletEntriesAndLastSeed(t, w) + } + + // Checks the wallet with provided checking method. + require.NotNil(t, w) + require.NotNil(t, tc.checkWallet) + tc.checkWallet(t, w) + }) + } +} + +// checkWalletEntriesAndLastSeed confirms the wallet entries and lastSeed are derivied +// from the seed. +func checkWalletEntriesAndLastSeed(t *testing.T, w wallet.Wallet) { + switch w.Type() { + case wallet.WalletTypeDeterministic: + checkWalletEntriesAndLastSeedDeterministic(t, w) + case wallet.WalletTypeBip44: + checkWalletEntriesAndLastSeedBip44(t, w) + case wallet.WalletTypeCollection: + checkWalletEntriesAndLastSeedCollection(t, w) + default: + t.Fatalf("unknown wallet type %q", w.Type()) + } +} + +func checkWalletEntriesAndLastSeedDeterministic(t *testing.T, w wallet.Wallet) { + seed := w.Seed() + require.NotEmpty(t, seed) + + newSeed, seckeys := cipher.MustGenerateDeterministicKeyPairsSeed([]byte(seed), w.EntriesLen()) + require.Len(t, seckeys, w.EntriesLen()) + for i, sk := range seckeys { + require.Equal(t, w.GetEntryAt(i).Secret, sk) + pk := cipher.MustPubKeyFromSecKey(sk) + require.Equal(t, w.GetEntryAt(i).Public, pk) + } + + lastSeed := w.LastSeed() + require.NotEmpty(t, lastSeed) + require.Equal(t, lastSeed, hex.EncodeToString(newSeed)) + + require.Empty(t, w.SeedPassphrase()) +} + +func checkWalletEntriesAndLastSeedBip44(t *testing.T, w wallet.Wallet) { + seed := w.Seed() + require.NotEmpty(t, seed) + // bip44 wallet seed must be a valid bip39 mnemonic + err := bip39.ValidateMnemonic(seed) + require.NoError(t, err) + + for _, e := range w.GetEntries() { + require.False(t, e.Secret.Null()) + require.False(t, e.Public.Null()) + } + + // lastSeed is only for "deterministic" type wallet + require.Empty(t, w.LastSeed()) +} + +func checkWalletEntriesAndLastSeedCollection(t *testing.T, w wallet.Wallet) { + require.Empty(t, w.Seed()) + require.Empty(t, w.SeedPassphrase()) + require.Empty(t, w.LastSeed()) +} + +// TestLiveGUIInjectTransaction does almost the same procedure as TestCreateAndBroadcastRawTransaction. +// The only difference is we broadcast the raw transaction through the gui /injectTransaction api. +func TestLiveGUIInjectTransaction(t *testing.T) { + if !doLive(t) { + return + } + + fn := requireWalletEnv(t) + require.NotEmpty(t, fn) + + c := newClient() + // prepares wallet and confirms the wallet has at least 2 coins and 2 coin hours. + w, totalCoins, _ := prepareAndCheckWallet(t, 2e6, 2) + + if w.IsEncrypted() { + t.Skip("CLI wallet integration tests do not support encrypted wallets yet") + return + } + + tt := []struct { + name string + args func() []string + errMsg []byte + checkTxn func(t *testing.T, txid string) + }{ + { + // Send all coins to the first address to one output. + name: "send all coins to the first address", + args: func() []string { + coins, err := droplet.ToString(totalCoins) + require.NoError(t, err) + return []string{"createRawTransaction", fn, w.GetEntryAt(0).Address.String(), coins} + }, + checkTxn: func(t *testing.T, txid string) { + // Confirms all coins are in the first address in one output + tx := getTransaction(t, txid) + require.Len(t, tx.Transaction.Transaction.Out, 1) + c, err := droplet.FromString(tx.Transaction.Transaction.Out[0].Coins) + require.NoError(t, err) + require.Equal(t, totalCoins, c) + }, + }, + { + // Send 0.5 coin to the second address. + // Send 0.5 coin to the third address. + // After sending, the first address should have at least 1 coin left. + name: "send to multiple address with -m option", + args: func() []string { + addrCoins := []struct { + Addr string `json:"addr"` + Coins string `json:"coins"` + }{ + { + w.GetEntryAt(1).Address.String(), + "0.5", + }, + { + w.GetEntryAt(2).Address.String(), + "0.5", + }, + } + + v, err := json.Marshal(addrCoins) + require.NoError(t, err) + + return []string{"createRawTransaction", fn, "-m", string(v)} + }, + checkTxn: func(t *testing.T, txid string) { + // Confirms the first address has at least 1 coin left. + coins, _ := getAddressBalance(t, w.GetEntryAt(0).Address.String()) + require.True(t, coins >= 1e6) + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + // Create raw transaction first + output, err := execCommandCombinedOutput(tc.args()...) + if err != nil { + t.Fatalf("err: %v, output: %v", err, string(output)) + return + } + + require.NoError(t, err) + output = bytes.TrimRight(output, "\n") + if bytes.Contains(output, []byte("Error:")) { + require.Equal(t, tc.errMsg, output) + return + } + + // Broadcast raw transaction with gui /injectTransaction + txid, err := c.InjectEncodedTransaction(string(output)) + require.NoError(t, err) + + txid = strings.TrimRight(txid, "\n") + t.Logf("txid: %s", txid) + _, err = cipher.SHA256FromHex(txid) + require.NoError(t, err) + + // Wait until transaction is confirmed. + tk := time.NewTicker(time.Second) + loop: + for { + select { + case <-time.After(30 * time.Second): + t.Fatal("Wait tx confirmation timeout") + case <-tk.C: + if isTxConfirmed(t, txid) { + break loop + } + } + } + + tc.checkTxn(t, txid) + }) + } +} + +func TestEncryptWallet(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + tt := []struct { + name string + args []string + setup func(t *testing.T) (string, func()) + errMsg []byte + errWithHelp bool + checkWallet func(t *testing.T, w wallet.Wallet) + }{ + { + name: "wallet is not encrypted", + args: []string{"-p", "pwd"}, + setup: createUnencryptedWallet, + checkWallet: func(t *testing.T, w wallet.Wallet) { + require.True(t, w.IsEncrypted()) + require.Empty(t, w.Seed()) + require.Empty(t, w.LastSeed()) + + // Confirms that secrets in address entries are empty + for _, e := range w.GetEntries() { + require.Equal(t, cipher.SecKey{}, e.Secret) + } + }, + }, + { + name: "wallet is encrypted", + args: []string{"-p", "pwd"}, + setup: createEncryptedWallet, + errMsg: []byte("Error: wallet is encrypted\n"), + }, + { + name: "wallet doesn't exist", + args: []string{"-p", "pwd"}, + setup: func(t *testing.T) (string, func()) { + return "not-exist.wlt", func() {} + }, + errWithHelp: true, + errMsg: []byte("not-exist.wlt\" doesn't exist"), + }, + } + + for _, tc := range tt { + for _, ct := range cryptoTypes { + name := fmt.Sprintf("name=%v crypto type=%v", tc.name, ct) + t.Run(name, func(t *testing.T) { + walletFile, clean := tc.setup(t) + defer clean() + args := append([]string{"encryptWallet", walletFile, "-x", string(ct)}, tc.args[:]...) + output, err := execCommandCombinedOutput(args...) + if err != nil { + require.EqualError(t, err, "exit status 1") + if tc.errWithHelp { + require.True(t, bytes.Contains(output, tc.errMsg), string(output)) + } else { + require.Equal(t, tc.errMsg, output) + } + return + } + + w, err := wallet.Load(walletFile) + require.NoError(t, err) + tc.checkWallet(t, w) + }) + } + } +} + +func TestDecryptWallet(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + tt := []struct { + name string + args []string + setup func(t *testing.T) (string, func()) + errMsg []byte + errWithHelp bool + checkWallet func(t *testing.T, w wallet.Wallet) + }{ + { + name: "wallet is encrypted", + args: []string{"-p", "pwd"}, + setup: createEncryptedWallet, + checkWallet: func(t *testing.T, w wallet.Wallet) { + require.False(t, w.IsEncrypted()) + require.Empty(t, w.CryptoType()) + require.Empty(t, w.Secrets()) + require.NotEmpty(t, w.Seed()) + require.NotEmpty(t, w.LastSeed()) + + for _, e := range w.GetEntries() { + require.False(t, e.Secret.Null()) + } + }, + }, + { + name: "wallet is not encrypted", + args: []string{"-p", "pwd"}, + setup: createUnencryptedWallet, + errMsg: []byte("Error: wallet is not encrypted\n"), + }, + { + name: "invalid password", + args: []string{"-p", "wrong password"}, + setup: createEncryptedWallet, + errMsg: []byte("Error: invalid password\n"), + }, + { + name: "wallet doesn't exist", + args: []string{"-p", "pwd"}, + setup: func(t *testing.T) (string, func()) { + return "not-exist.wlt", func() {} + }, + errWithHelp: true, + errMsg: []byte("not-exist.wlt\" doesn't exist"), + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + walletFile, clean := tc.setup(t) + defer clean() + args := append([]string{"decryptWallet", walletFile}, tc.args...) + output, err := execCommandCombinedOutput(args...) + if err != nil { + require.EqualError(t, err, "exit status 1") + if tc.errWithHelp { + require.True(t, bytes.Contains(output, tc.errMsg), string(output)) + } else { + require.Equal(t, tc.errMsg, output) + } + return + } + + w, err := wallet.Load(walletFile) + require.NoError(t, err) + tc.checkWallet(t, w) + }) + } +} + +func TestWalletShowSeed(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + tt := []struct { + name string + args []string + setup func(t *testing.T) (string, func()) + errWithHelp bool + errMsg []byte + expectOutput []byte + }{ + { + name: "unencrypted wallet", + setup: createUnencryptedWallet, + expectOutput: []byte("exchange stage green marine palm tobacco decline shadow cereal chapter lamp copy\n"), + }, + { + name: "unencrypted wallet with -j option", + args: []string{"-j"}, + setup: createUnencryptedWallet, + expectOutput: []byte("{\n \"seed\": \"exchange stage green marine palm tobacco decline shadow cereal chapter lamp copy\"\n}\n"), + }, + { + name: "encrypted wallet", + setup: createEncryptedWallet, + args: []string{"-p", "pwd"}, + expectOutput: []byte("exchange stage green marine palm tobacco decline shadow cereal chapter lamp copy\n"), + }, + { + name: "encrypted wallet with -j option", + setup: createEncryptedWallet, + args: []string{"-p", "pwd", "-j"}, + expectOutput: []byte("{\n \"seed\": \"exchange stage green marine palm tobacco decline shadow cereal chapter lamp copy\"\n}\n"), + }, + { + name: "encrypted wallet with invalid password", + setup: createEncryptedWallet, + args: []string{"-p", "wrong password"}, + errMsg: []byte("Error: invalid password\n"), + }, + { + name: "wallet doesn't exist", + setup: func(t *testing.T) (string, func()) { + return "not-exist.wlt", func() {} + }, + errWithHelp: true, + errMsg: []byte("not-exist.wlt\" doesn't exist"), + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + wltFilename, clean := tc.setup(t) + defer clean() + args := append([]string{"showSeed", wltFilename}, tc.args...) + output, err := execCommandCombinedOutput(args...) + if err != nil { + require.EqualError(t, err, "exit status 1") + if tc.errWithHelp { + require.True(t, bytes.Contains(output, tc.errMsg), string(output)) + } else { + require.Equal(t, tc.errMsg, output) + } + return + } + + require.Equal(t, tc.expectOutput, output) + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/address-balance.golden b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/address-balance.golden new file mode 100644 index 00000000..3000ea6e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/address-balance.golden @@ -0,0 +1,31 @@ +{ + "confirmed": { + "coins": "63083.000000", + "hours": "38823396" + }, + "spendable": { + "coins": "63083.000000", + "hours": "38823396" + }, + "expected": { + "coins": "63083.000000", + "hours": "38823396" + }, + "addresses": [ + { + "confirmed": { + "coins": "63083.000000", + "hours": "38823396" + }, + "spendable": { + "coins": "63083.000000", + "hours": "38823396" + }, + "expected": { + "coins": "63083.000000", + "hours": "38823396" + }, + "address": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt" + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/address-outputs.golden b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/address-outputs.golden new file mode 100644 index 00000000..2ed45db6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/address-outputs.golden @@ -0,0 +1,48 @@ +{ + "outputs": { + "head": { + "seq": 180, + "block_hash": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "previous_block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "timestamp": 1431574528, + "fee": 2265261, + "version": 0, + "tx_body_hash": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "ux_hash": "058d1d0a22be7b9f5567a236866836a87d922760581832cfb8bfbd8b337d64b1" + }, + "head_outputs": [ + { + "hash": "e5596ef0ba04ad9e0adbe0355a24c6bef249654906f917b68f8f0cf072508674", + "time": 1429382678, + "block_seq": 121, + "src_tx": "da82deafc15c36e7dc9cd95663e0dc910ae626ee543147ac7bd8682be00f7baf", + "address": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "62000.000000", + "hours": 378646, + "calculated_hours": 38127173 + }, + { + "hash": "3f9712cab0d3aeb217f1751fa19e53d75f814b4218866d4e70d63f32271d2023", + "time": 1429364452, + "block_seq": 120, + "src_tx": "d1569ca879f98450a920a2b427ab0e1d21342308fb6b4ea5031ee6e718217183", + "address": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "38.000000", + "hours": 480, + "calculated_hours": 23808 + }, + { + "hash": "3408638af298419b14a49e8e9dd69e97c9a06827d74edf9f410a870662360b31", + "time": 1429364072, + "block_seq": 118, + "src_tx": "a83e09e976b038d86491d8c029aec84a6313dc33e692da6ce50a2858e50c4666", + "address": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1045.000000", + "hours": 30769, + "calculated_hours": 672415 + } + ], + "outgoing_outputs": [], + "incoming_outputs": [] + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/block0.golden b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/block0.golden new file mode 100644 index 00000000..88dad6b8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/block0.golden @@ -0,0 +1,37 @@ +{ + "blocks": [ + { + "header": { + "seq": 0, + "block_hash": "0551a1e5af999fe8fff529f6f2ab341e1e33db95135eef1b2be44fe6981349f3", + "previous_block_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": 1426562704, + "fee": 0, + "version": 0, + "tx_body_hash": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "ux_hash": "0000000000000000000000000000000000000000000000000000000000000000" + }, + "body": { + "txns": [ + { + "length": 0, + "type": 0, + "txid": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "sigs": [], + "inputs": [], + "outputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000 + } + ] + } + ] + }, + "size": 86 + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/blocks0-5.golden b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/blocks0-5.golden new file mode 100644 index 00000000..7139777a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/blocks0-5.golden @@ -0,0 +1,836 @@ +{ + "blocks": [ + { + "header": { + "seq": 0, + "block_hash": "0551a1e5af999fe8fff529f6f2ab341e1e33db95135eef1b2be44fe6981349f3", + "previous_block_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": 1426562704, + "fee": 0, + "version": 0, + "tx_body_hash": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "ux_hash": "0000000000000000000000000000000000000000000000000000000000000000" + }, + "body": { + "txns": [ + { + "length": 0, + "type": 0, + "txid": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "sigs": [], + "inputs": [], + "outputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000 + } + ] + } + ] + }, + "size": 86 + }, + { + "header": { + "seq": 1, + "block_hash": "baf3b622f043bbe3ef480416251a6545d07f173e5969dde2b63c4a12956d38fd", + "previous_block_hash": "0551a1e5af999fe8fff529f6f2ab341e1e33db95135eef1b2be44fe6981349f3", + "timestamp": 1427926392, + "fee": 99999999999900, + "version": 0, + "tx_body_hash": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "ux_hash": "ecc66d67289ecf8b5c5d2758a8f07ef08373a61a4d4e2736905ac2aaa427655f" + }, + "body": { + "txns": [ + { + "length": 3846, + "type": 0, + "txid": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "inner_hash": "0f7019627886818d2501af189bbac18e21b8e959891c5b2726f89e29355aa10a", + "sigs": [ + "be602113fe288f750001ab65f254ceedd8b05b1becc456a0a52a0bea10b8280e38d950933992ad3265e1f81d197036fa634b316f08b3b319ffce081aa43f3bb600" + ], + "inputs": [ + "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0" + ], + "outputs": [ + { + "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "26f585cb96f35307f0af5b9aee004a29b7795695f4c5c836104e2fbbf429a3ce", + "dst": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "18a43b8b69bbf12a9e49e6f9783ba258397e6567301aeed9e901a1e4fed9fef9", + "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5a69ef09b5de21b117cac62141a8de4eade7558c42f0ba8b50996f5ec7867c5d", + "dst": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "aef761a12e3d0fa9c4a8db62b8bab1015c32931b7e3a7fc9a77282cec218f79d", + "dst": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "445a4082da251fa161e4705d115fe2018ca15a5f92e8a0950793405410e6be12", + "dst": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "dst": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "368a609ee90ca15bbbd297af07dc6705131764476d54bef641017ffcd0885e65", + "dst": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "13afe1586015c4d7312f89d123153279e4961eb0d53a4d036847d5d989ba90dc", + "dst": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f625cf04412199c16e073dbb500e66c23cfe69043578b4a2d879a329aac563ec", + "dst": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b2da50a08756c34d059a04812451cf3296f73ba87f8cca38473ac8f051ab6d1e", + "dst": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "135c28698e80e3b2a737d59c16c79684c3fb3ec5cec59f466a39f4ac3c73968e", + "dst": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "df63056cf3ae21efa86d241876ad0194387317585dc9e4fcd80954b47d59b57a", + "dst": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4628f4cfdbf1eb7cccc25d461c46cc29e90cffb5d6277e0de641f7701d60c308", + "dst": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "47e4706dc4d80a70b20c889476fb0627ca6d5bdaa790f4ceba44a689d31b2dcc", + "dst": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b64bc50d370a06df117eb543ca051239c985cfc4b6aa527c51b700de32c7fc41", + "dst": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "390bc4c045fa9f289957b7eca529bfadac96a7dd074bcfbdd3b09e99413b8202", + "dst": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6aa162f7fc09598c4dc8f5fab7fb2383f28c3840937a001acd9f37136e1691b2", + "dst": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e440cf4c896735d3299a871f988c134f404fb2065d1f20c87c9c9bc5fa582e09", + "dst": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "eea791e84a53e4d99485519c5d2c3146b0a2ad080cf92904ae7b28c2d9a6e3ca", + "dst": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "01048ad6a538256d9a8c6c9c6321ca1a01b31cbf08e74fd4ff0f141bf97eb8ce", + "dst": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc5f1f1ddc8cb23df3d42f1e5a1dda9d356846fe930ae4484bc1eeb1b3b2c95b", + "dst": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f03087245a6b64bb69cd5866a1887ae595a9e1a86e196754984840eaf6d3eb9c", + "dst": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "239bdba27dabd52f7450f7d8521c9a7e5ac74093ae3f6f2348bf40ac9a6db7a5", + "dst": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d60879e562b65f97d40bec7309d4490ba0a8c80e2349ecb2e3505aaa50ea1e47", + "dst": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "66e685901492c94942522c346759c711ee2e78a059ef274e77a6ab433409683c", + "dst": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b497992663f99f9902deaaf487b00655820003015ea92091628f4a6e8aeb5854", + "dst": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc40377012004566712fa860e74db97305091cc163e95435e04556c70d32f9c5", + "dst": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "73304622e33994bc2d4ade2cab78d28e1b65185e60ad3c781ecfb5cbc8159136", + "dst": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fed15e8506d0e0898510311850b8863ef6d9a499215ae8823a1e3fb9c8140ab2", + "dst": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "12034bc455d0821813d7eb9afed1ed1a8f19b6f29826ef4a057b4aa0b4228817", + "dst": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fc444cdb2598f44209a41ea20afdc9065ebe51b7cd5f65bb1c0f7a7b427ce7b1", + "dst": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "618d242d95d33e2d7316612a164d89859b85f1287f0d5bed4dcb561cf478f706", + "dst": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "07f70fd4108ef4d2fde3b85411728c1f7bd3a135d2062c5a30a46cc885463780", + "dst": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "af9bcf6ba63a08e699bc101aa362f135343aaf78a56e9f88d118fca0e1ce5c08", + "dst": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6b3530bb930ed10bbc4c307663aba4377c08443498a0a2cf023b1be72f378ae1", + "dst": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fd6da5199e528958e68ee8dd003b727d4d840754ea7c1e0c05e4f0e504c9b2cd", + "dst": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "131f07f5b40f365fb537b863e4aa5ef0efcd77b7fa2ff321d90eeb743ac43678", + "dst": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ffbdfdbf3427d04f445c33e867845bec1ee64a9dfe0d0fa8284547c2226fdfa9", + "dst": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b53c7188ebf4d630790ff63275679ba48009e31af6e4fe15806619216caa750", + "dst": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b4c6639b49402c2753f83c7fb7d3ffa65da74e47fef2b781933ff55b14d09bcd", + "dst": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c956289db079c00d2f80c590d3c8ca26c37da534fe5f65e799b3982ceca493c", + "dst": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "550d2a8d3047cdae0c05a61cc3de43e758b123a6955fa067d3ac375f7d0dbadc", + "dst": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78740d5bf49989936d315bf641949232aace582e03de57db8abff940f7d51bd1", + "dst": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9f2c83c5165826de1077f428ad39d41473e32ed64cd83180d49e7d8e5db996d0", + "dst": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "883be4d7173c235933294ab8dcae8cc76609166eaa1c1f07e9b51d551c979709", + "dst": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6384ed19650d384c29db4c3a39a1ca855058fab758075be2dee759dd9e6faae1", + "dst": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", + "dst": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c238e82f3a4beee1be7b5b464e8553404f6927d5ab93c3d649d362c01097782", + "dst": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dad4991bfa5c51eb176f28c1b3f86661e02579905e6e07c997df22004e06244a", + "dst": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4ba91512c168281f41d3934b927d0d86a3136a31cc345b635095928f8e5f013c", + "dst": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c416f5e604eeada9ae8e520a429d8f19d4230626769e7121007e01353730784f", + "dst": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7b8787fd4076c27d074d2a4761377a1aa26c843c432e3b7e6b0ebf1e29528188", + "dst": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "38f22b194f04d85a6b545b37df06195edeb8503798b229ddeaa946018150c05c", + "dst": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "246377a036ad5444bcd5f47ac9e55fec7c85fc40644df593038d360554a809f7", + "dst": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c6d5e543ff5f2c2526728d588fb21753db5b7e05b8b275aa5e9b24d29350afb0", + "dst": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "98e223e6e2240fef83082d3daa86e46f10e0c71f3f74489ba95db0951a166f53", + "dst": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c8971ca91f8e21c556f647940073db003f7dd5582ae55d4ebca602d5e8e91a6e", + "dst": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dfa7822c05f54116c9fc3b2cde1ecb4667f47a2d8771fe886e832c223cdc4e82", + "dst": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6d37c0c4b6fcbac1e53a46c9c2dc5d3c3b36312c53f25b2baacc785ea77a11f7", + "dst": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9ba5e31610f0545666f102465efa8caa48ad3fb5b8abd5ae802f4a71e3f7de3b", + "dst": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "3ca365aace71e24b04d6f2ffbf7171468c5e71783858c710cae539c5e43e0c0e", + "dst": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c858f2db2a20ac562d32f8fb2a3a11039849a6e44d2bec30befb2e173532a9a3", + "dst": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1550a76598693b950346397e0e825bbb2805edde38b0d0240e50050829b7b1dd", + "dst": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "466340ab7733abb23ab24d877c673fe089c273f11808fbbd6f33a91da92ee96c", + "dst": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "401d4c0c1060ebbb4b9fb3859c2eb47789f94086f4deb01234bf46f7cdc81247", + "dst": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2c0e3aa084f5fec45f99b3f125ce7d50c6da526ef5165df5f22ba603147c3fc2", + "dst": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2e724d83e35235c23c0bb16ae9b708a5bba3c23b186b05d4b8c606f6bb4b311", + "dst": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4f30eae8c49eb268fe364eaf5ee0788da6e2f6adc2f83cd82e96a4bfe98496f5", + "dst": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8753d5775c22477a8ef74eeebf61d7de30be702e70118f552cc18ad963ffe950", + "dst": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efa2007c561dcbf7c83a6bbdd2ef75e7cca76b05330a8b948ba0dd94dee949f7", + "dst": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b379d1b8ff0153c63ee69c40a7155b97fa42ab570f68ff847d457316c4d8ab9", + "dst": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cc84f93adce16699d9e84ef32f55333402431b58dc50c17084bcb8b33f382f88", + "dst": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f38f0760769c19075034f70b059abf4d1bfa6d01e1e8c369a99900ed1eaeca6d", + "dst": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8d55f76bb0b3dd222cf85a7193501c0f4071b446f56dbd1da355b1625993325a", + "dst": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efde499c7e4444bc602b7bf5ed50e95a18ce8ec9a06ba9d850a05bb7a25ecb3a", + "dst": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2a4d631d5dc90e397d85f13410d1a6d877dcaf592a0e2be2e727443ac74b5bd5", + "dst": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e936299a21240744f6edbab493449323f920bbe15dcf294463e5a2ace10f27b0", + "dst": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "44e17f4bd29411a1614457171c06183e364bf6ff80a201717b2dfc0748e9ebe3", + "dst": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1941e5cc5e38dd92427580af699b1f410be7b29ff17d3d0ff3d046bfba0aaabf", + "dst": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ff6c0f27fcf92f3b4a3871b801c3116847fe47a7e3bafcadd4855d06012091ad", + "dst": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cd6c4b785e60757fad0e6fd4874b729ea7703fe7ee9560e1283d2eb71fc75321", + "dst": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "745eaff456a390c3868742a039e72c2a93ff8eee10417dbe848d533b89facc04", + "dst": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2f3f050c9ef31bf5c3b14c1c71699c4f4b38aa18479531194d12e6277416516", + "dst": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0b95850edabed70762768ac1695c5d7f230cccaa8de06657cda42cafba36374f", + "dst": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7c767d3a06db1ac0e1809ebe29a7d9689143259f4651837de54423e287c20490", + "dst": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78b07e8fe1366e173f2eeb75c35cd53baf0f6100de50ae12b4ffe7d0d7ba4298", + "dst": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5010eb25f6e1ed725fb901ae1e945e545ae846d7be8a135333d2d41102c33328", + "dst": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "178a33e64826cd2039b8538b74e6de513966acab45ab79d77dc9392018a65ffb", + "dst": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "044dc539d063250dc654b2bf0986a9044b4eea05e1284c11a2b313acd8dc3498", + "dst": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9fd5ea38f383291566def44b6fb932414f97123952578fe0cfb9a30eb075a099", + "dst": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "be5930e9cc35801433bcd21db84da7d4f1d8e744feca16a2c6fb00c81ce93e51", + "dst": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8cd999cd193d315e5f1c6f74c230c12e6abe6847924f6e89d988e09ca413f52e", + "dst": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0cff53628eb0e984c134b68cbe4b1bb7721a05adaa32e93b9df489a9a7a176cf", + "dst": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "a5ef046e84be9ff2485dde49afe6073811286761afac3bbd588b6e4130930479", + "dst": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cdee5f84c4f08098ac740e3a260ced14c1e199e126aa5291ec079b281a7dc407", + "dst": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6a24135f8496e7a37dcf7164218bb3aa530319f3b2bf3c7a1a9cc1bd17831328", + "dst": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "693c7f970b34ce5882e62430f4c9c28957159a257d27d4e21a61fd95c6b97464", + "dst": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c008a613cef129c180dbcc7213f2d41a14d245d06a3844d63d9beac963145385", + "dst": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "439cdfd03972fb4bb5da54208cf8098ee78228c487ce9e84623f5f83e17a7d68", + "dst": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "hours": 1 + } + ] + } + ] + }, + "size": 3846 + }, + { + "header": { + "seq": 2, + "block_hash": "01723bc4dc90f1cb857a94fe5e3bb50c02e6689fd998f8147c9cae07fbfa63af", + "previous_block_hash": "baf3b622f043bbe3ef480416251a6545d07f173e5969dde2b63c4a12956d38fd", + "timestamp": 1427927651, + "fee": 0, + "version": 0, + "tx_body_hash": "312a269b8248e389c61571cc13f4ad13b7d53b64853d990ddc301a58e7071889", + "ux_hash": "163a4a92e3ea23475a854215a8813b327f724e374df4b50ac414b94ec57b3c3e" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "312a269b8248e389c61571cc13f4ad13b7d53b64853d990ddc301a58e7071889", + "inner_hash": "4daff2831f5bc2877a98a49b0ef75f8ff01bcb35082fd4018c77707dfca31849", + "sigs": [ + "f4482e0781e0d94c8c4773940e1f811405681844a9dc3c1938243442e1cbd5463d5e251880abbf8ff1ed85b4b2659e83ee30f06cc4c5dc9913aa6a9630fbe3de01" + ], + "inputs": [ + "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76" + ], + "outputs": [ + { + "uxid": "0cd548e03bd13bca8647cd13f6baef0c65fd03081aeb6dc3695536e5bc6018ae", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999990.000000", + "hours": 1 + }, + { + "uxid": "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 3, + "block_hash": "35c3ebbe6feaeeab27ac77c1712051787bdd4bbfb5cdcdebc81f8aac98a2f3f3", + "previous_block_hash": "01723bc4dc90f1cb857a94fe5e3bb50c02e6689fd998f8147c9cae07fbfa63af", + "timestamp": 1427927671, + "fee": 0, + "version": 0, + "tx_body_hash": "a6a709e9388a4d67a47d262b11da5f804eddd9d67acc4a3e450f7a567bdc1619", + "ux_hash": "bd8c7dc7aadb8cd70e8ba97fb71b5ca77c9be157932930bc547a30bb095bc6c7" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "a6a709e9388a4d67a47d262b11da5f804eddd9d67acc4a3e450f7a567bdc1619", + "inner_hash": "ea6adee3180c7f9d73d1e693822d5d1c2bba85067f89a873355bc771a078faa1", + "sigs": [ + "ce8fd47e2044ed17998f92621e90329f673a746c802d67f639ca083705dd199f6ee346781497b44132434922879244d819694b5903093f784570c55d293ab4af01" + ], + "inputs": [ + "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a" + ], + "outputs": [ + { + "uxid": "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 4, + "block_hash": "415e47348a1e642cb2e31d00ee500747d3aed0336aabfff7d783ed21465251c7", + "previous_block_hash": "35c3ebbe6feaeeab27ac77c1712051787bdd4bbfb5cdcdebc81f8aac98a2f3f3", + "timestamp": 1428793611, + "fee": 1852, + "version": 0, + "tx_body_hash": "c24b92898381fbebe59a457924184f4cce1e7166e140ca75aea5baf854c1ab75", + "ux_hash": "58519fbe20c1ca9db0fb922f5b32808f1d9aed249c266f2d4a14ca2597d80817" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "c24b92898381fbebe59a457924184f4cce1e7166e140ca75aea5baf854c1ab75", + "inner_hash": "43dd65d5644ec5214a901ac94e530cbedb83d2174cf402c7b24697cfe55e1de7", + "sigs": [ + "434a7a0b624fda393c1caa57ac9787f69da3d8854d0ec6f69f0da1c96c9b683d787064b644e9ac3dd4dd8466c22c1547cff89c2552420f5efcfd1eacb1a2eac301" + ], + "inputs": [ + "0cd548e03bd13bca8647cd13f6baef0c65fd03081aeb6dc3695536e5bc6018ae" + ], + "outputs": [ + { + "uxid": "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999980.000000", + "hours": 3704 + }, + { + "uxid": "98b3e6e6d4ed36159b7dbf5f305174fc0c255d2d97528b35a67d50b9968e2b2f", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 5, + "block_hash": "114fe60587a158428a47e0f9571d764f495912c299aa4e67fc88004cf21b0c24", + "previous_block_hash": "415e47348a1e642cb2e31d00ee500747d3aed0336aabfff7d783ed21465251c7", + "timestamp": 1428798821, + "fee": 2036, + "version": 0, + "tx_body_hash": "0579e7727627cd9815a8a8b5e1df86124f45a4132cc0dbd00d2f110e4f409b69", + "ux_hash": "70439be07958c0dfa9932bfa108d7dad20a37db7ae6db4e06a3225443d4b5481" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "0579e7727627cd9815a8a8b5e1df86124f45a4132cc0dbd00d2f110e4f409b69", + "inner_hash": "fe123ca954a82bb1ce2cc9ef9c56d6b649a4cbaf5b17394b0ffda651ed32327e", + "sigs": [ + "056ed0f74367fb1370d7e98689953983d9cf34eb6669854f1645c8a16c93d85075661e7d4f6df0ce5ca8eb9852eff6a12fbac2caafee03bb8c616f847c61416800", + "8aaa7f320a7b01169d3217a600100cb27c55e4ce56cd3455814f56d8e4e65be746e0e20e776087af6f19361f0b898edc2123a5f9bd35d24ef8b8669ca85b142601" + ], + "inputs": [ + "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70" + ], + "outputs": [ + { + "uxid": "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999890.000000", + "hours": 4073 + }, + { + "uxid": "dc63c680f408c4e646037966189383a5d50eda34e666c2a0c75c0c6bf13b71a1", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "100.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 317 + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/blocks180.golden b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/blocks180.golden new file mode 100644 index 00000000..cccffcd4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/blocks180.golden @@ -0,0 +1,47 @@ +{ + "blocks": [ + { + "header": { + "seq": 180, + "block_hash": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "previous_block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "timestamp": 1431574528, + "fee": 2265261, + "version": 0, + "tx_body_hash": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "ux_hash": "058d1d0a22be7b9f5567a236866836a87d922760581832cfb8bfbd8b337d64b1" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "inner_hash": "d5b18a0c0c454e56fe1f7d0c64236d633f65717c04f08cd943f5669b4cc34667", + "sigs": [ + "2fac42571bb301783e46e804069c73c8226b637ae6385fec793e3a3860feaa6918058c55f461cef38341670c5c2da230d2241f267dbde6fc0528a6fb24362b3b00" + ], + "inputs": [ + "c39acd3494113650c1a6a7809287af7b12a78bbd97126d4585dd1715e2cb5a66" + ], + "outputs": [ + { + "uxid": "75692aeff988ce0da734c474dbef3a1ce19a5a6823bbcd36acb856c83262261e", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "hours": 377543 + }, + { + "uxid": "a4b70476ea1e079ebd3503b52eee32d490515457fce6a5aa075770b598a9d14f", + "dst": "CDD8GoJUHEvBm1pD3BQ3hEC2KcJNhvUzpu", + "coins": "1000.000000", + "hours": 377543 + } + ] + } + ] + }, + "size": 220 + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/decode-raw-transaction.golden b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/decode-raw-transaction.golden new file mode 100644 index 00000000..6ad734be --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/decode-raw-transaction.golden @@ -0,0 +1,38 @@ +{ + "length": 294, + "type": 0, + "txid": "a121fe93d0ddebc50e6916adebb524b5b4f087b7a35904b35586f908e3b6b09f", + "inner_hash": "a1d3345ac47f897f24084b1c6b9bd6e03fc92887050d0748bdab5e639c1fdcd4", + "sigs": [ + "a2a10f07e0e06cf6ba3e793b3186388a126591ee230b3f387617f1ccb6376a3f18e094bd3f7719aa8191c00764f323872f5192da393852bd85dab70b13409d2b01" + ], + "inputs": [ + "4d78de698a33abcfff22391c043b57a56bb0efbdc4a5b975bf8e7889668896bc" + ], + "outputs": [ + { + "uxid": "cf3a56d79a41112dbb1b2e78a61007071cfe23f1ea5acb7674c0d5e0e432c2ce", + "dst": "2JCPnb1212XWQn8GUsQyv4HuB5VrgGHzb7N", + "coins": "177.999000", + "hours": 13908 + }, + { + "uxid": "5e8289922005ac75828e14768d9d510c4c874bd25dff882aa7a9debc2a1fe573", + "dst": "PE2qwUxTxe9RpdTnMcJtrP98riLW83nx5d", + "coins": "180.000000", + "hours": 4636 + }, + { + "uxid": "d6e8ced2161776befded43ac5a6ef7faf92585e541df03bed0a5cf453b020db8", + "dst": "wnhsTd3oXoKNRyLWj893pScqWXPMNg85RM", + "coins": "65.000000", + "hours": 4636 + }, + { + "uxid": "cfd0f09c8e0b849162e5d684a9ab079550849b1f9fd463aeae9489d640622bcd", + "dst": "tWPDM36ex9zLjJw1aPMfYTVPbYgkL2Xp9V", + "coins": "27.000000", + "hours": 4635 + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/generate-addresses-2.golden b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/generate-addresses-2.golden new file mode 100644 index 00000000..25e3a866 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/generate-addresses-2.golden @@ -0,0 +1,29 @@ +{ + "meta": { + "coin": "skycoin", + "filename": "integration-test.wlt", + "label": "integration-test", + "lastSeed": "0ba2094a20d5fd2a8bed063fc4bbd3d7d2d8cedd07317086780043937310a1f3", + "seed": "exchange stage green marine palm tobacco decline shadow cereal chapter lamp copy", + "tm": "1518271871", + "type": "deterministic", + "version": "0.1" + }, + "entries": [ + { + "address": "2Kg3eRXUhY6hrDZvNGB99DKahtrPDQ1W9vN", + "public_key": "03aefe8fc5952f67aca014ae4da6e7eba1321542be02d2d6f718c666750bf4c630", + "secret_key": "f1877ae49e2233db10460d3c971b2aaccc04d771629bc98ee7a1dafca9baed8e" + }, + { + "address": "7g3M372kxwNwwQEAmrronu4anXTW8aD1XC", + "public_key": "0319527fa74053b148d7efe973c0ee734e49f52a11417232e582b8c51e389d638a", + "secret_key": "f46d3e7661a1daef6229f83b641f9666bcfce4f9f2bd1a0161b35ac8d8ff8a8b" + }, + { + "address": "2EDapDfn1VC6P2hx4nTH2cRUkboGAE16evV", + "public_key": "0259a2d466c3d021d78eb09ffc8b2f4a84ce5c13264a25c9069c149f9be99c8eb0", + "secret_key": "356a6d77c5322cee36d12ad6c91a9135c403a25273ea64b30db264a5aa1f8314" + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/generate-addresses-encrypted.golden b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/generate-addresses-encrypted.golden new file mode 100644 index 00000000..b8e5e555 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/generate-addresses-encrypted.golden @@ -0,0 +1,28 @@ +{ + "meta": { + "coin": "skycoin", + "cryptoType": "scrypt-chacha20poly1305", + "encrypted": "true", + "filename": "integration-test-encrypted.wlt", + "label": "integration-test", + "lastSeed": "", + "secrets": "", + "seed": "", + "seedPassphrase": "", + "tm": "1518271871", + "type": "deterministic", + "version": "0.4" + }, + "entries": [ + { + "address": "2Kg3eRXUhY6hrDZvNGB99DKahtrPDQ1W9vN", + "public_key": "03aefe8fc5952f67aca014ae4da6e7eba1321542be02d2d6f718c666750bf4c630", + "secret_key": "" + }, + { + "address": "7g3M372kxwNwwQEAmrronu4anXTW8aD1XC", + "public_key": "0319527fa74053b148d7efe973c0ee734e49f52a11417232e582b8c51e389d638a", + "secret_key": "" + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/generate-addresses.golden b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/generate-addresses.golden new file mode 100644 index 00000000..f12b147d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/generate-addresses.golden @@ -0,0 +1,24 @@ +{ + "meta": { + "coin": "skycoin", + "filename": "integration-test.wlt", + "label": "integration-test", + "lastSeed": "f4ee62d76b32106664da3be08ffcab6944a8826bf82f4e8be6c9e790169b1a95", + "seed": "exchange stage green marine palm tobacco decline shadow cereal chapter lamp copy", + "tm": "1518271871", + "type": "deterministic", + "version": "0.1" + }, + "entries": [ + { + "address": "2Kg3eRXUhY6hrDZvNGB99DKahtrPDQ1W9vN", + "public_key": "03aefe8fc5952f67aca014ae4da6e7eba1321542be02d2d6f718c666750bf4c630", + "secret_key": "f1877ae49e2233db10460d3c971b2aaccc04d771629bc98ee7a1dafca9baed8e" + }, + { + "address": "7g3M372kxwNwwQEAmrronu4anXTW8aD1XC", + "public_key": "0319527fa74053b148d7efe973c0ee734e49f52a11417232e582b8c51e389d638a", + "secret_key": "f46d3e7661a1daef6229f83b641f9666bcfce4f9f2bd1a0161b35ac8d8ff8a8b" + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/genesis-transaction-cli.golden b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/genesis-transaction-cli.golden new file mode 100644 index 00000000..eec09db1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/genesis-transaction-cli.golden @@ -0,0 +1,28 @@ +{ + "transaction": { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 181, + "block_seq": 0 + }, + "time": 1426562704, + "txn": { + "timestamp": 1426562704, + "length": 0, + "type": 0, + "txid": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "sigs": [], + "inputs": [], + "outputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000 + } + ] + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/genesis-transaction.golden b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/genesis-transaction.golden new file mode 100644 index 00000000..06f23bb6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/genesis-transaction.golden @@ -0,0 +1,28 @@ +{ + "transaction": { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 181, + "block_seq": 0 + }, + "time": 1426562704, + "txn": { + "length": 0, + "type": 0, + "txid": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": 1426562704, + "sigs": [], + "inputs": [], + "outputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000 + } + ] + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/integration-test-encrypted.wlt b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/integration-test-encrypted.wlt new file mode 100644 index 00000000..307c3d73 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/integration-test-encrypted.wlt @@ -0,0 +1,22 @@ +{ + "meta": { + "coin": "skycoin", + "cryptoType": "scrypt-chacha20poly1305", + "encrypted": "true", + "filename": "integration-test-encrypted.wlt", + "label": "integration-test", + "lastSeed": "", + "secrets": "dgB7Im4iOjEwNDg1NzYsInIiOjgsInAiOjEsImtleUxlbiI6MzIsInNhbHQiOiJidHVibVZ2eEhWNHVKc0szcHFwUE5xY3VoL1VvRjRYbjQ5N0IzLzhYUFhJPSIsIm5vbmNlIjoiSEZNd1VwYUNnYUk3eFo2SiJ9BceIdIv3aGRAsANPVAm6gvrgJd2jZxJLazBwd2yQhTTWXxYVReGEsL/fzYZyDbJNvJgGZpTJsQ0R2yVgjlRbr5Km6x4yiGk8riXWiQ1Tpcfjmst7vDzjq/lUrcci/lwuGwVNf+TsmhzyD/uvV/4yR8oPtZHgPDBoMIkB/NPawNkXkcP1D6lA5LAddWHkKt/SCRxF3YdKW64LjojqExUukYSLJenxFHkTbEB/QBLb/dfZXZolLYevIKbPH/Rt7qiwOj8bvfwPPlIRf101VCvqLW8q8fcfYzvidQyjz7CfW8wh6mqMmXW4Wp+I14BQIleuBlkd35Fz2etKMMiyyltYn5FaixbP2WHFHBBg+Yfm5OzYt5K7b0cG8kDfAN1PHyYc30o=", + "seed": "", + "tm": "1518271871", + "type": "deterministic", + "version": "0.3" + }, + "entries": [ + { + "address": "2Kg3eRXUhY6hrDZvNGB99DKahtrPDQ1W9vN", + "public_key": "03aefe8fc5952f67aca014ae4da6e7eba1321542be02d2d6f718c666750bf4c630", + "secret_key": "" + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/integration-test.wlt b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/integration-test.wlt new file mode 100644 index 00000000..7cd53c28 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/integration-test.wlt @@ -0,0 +1,19 @@ +{ + "meta": { + "coin": "skycoin", + "filename": "integration-test.wlt", + "label": "integration-test", + "lastSeed": "1c0ff9dd77fb5dd079078c3098e61a9d99965e8d55121cc3fb576af61d6d450a", + "seed": "exchange stage green marine palm tobacco decline shadow cereal chapter lamp copy", + "tm": "1518271871", + "type": "deterministic", + "version": "0.1" + }, + "entries": [ + { + "address": "2Kg3eRXUhY6hrDZvNGB99DKahtrPDQ1W9vN", + "public_key": "03aefe8fc5952f67aca014ae4da6e7eba1321542be02d2d6f718c666750bf4c630", + "secret_key": "f1877ae49e2233db10460d3c971b2aaccc04d771629bc98ee7a1dafca9baed8e" + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/last-blocks0.golden b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/last-blocks0.golden new file mode 100644 index 00000000..b5b27b9c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/last-blocks0.golden @@ -0,0 +1,3 @@ +{ + "blocks": [] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/last-blocks1.golden b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/last-blocks1.golden new file mode 100644 index 00000000..cccffcd4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/last-blocks1.golden @@ -0,0 +1,47 @@ +{ + "blocks": [ + { + "header": { + "seq": 180, + "block_hash": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "previous_block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "timestamp": 1431574528, + "fee": 2265261, + "version": 0, + "tx_body_hash": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "ux_hash": "058d1d0a22be7b9f5567a236866836a87d922760581832cfb8bfbd8b337d64b1" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "inner_hash": "d5b18a0c0c454e56fe1f7d0c64236d633f65717c04f08cd943f5669b4cc34667", + "sigs": [ + "2fac42571bb301783e46e804069c73c8226b637ae6385fec793e3a3860feaa6918058c55f461cef38341670c5c2da230d2241f267dbde6fc0528a6fb24362b3b00" + ], + "inputs": [ + "c39acd3494113650c1a6a7809287af7b12a78bbd97126d4585dd1715e2cb5a66" + ], + "outputs": [ + { + "uxid": "75692aeff988ce0da734c474dbef3a1ce19a5a6823bbcd36acb856c83262261e", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "hours": 377543 + }, + { + "uxid": "a4b70476ea1e079ebd3503b52eee32d490515457fce6a5aa075770b598a9d14f", + "dst": "CDD8GoJUHEvBm1pD3BQ3hEC2KcJNhvUzpu", + "coins": "1000.000000", + "hours": 377543 + } + ] + } + ] + }, + "size": 220 + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/last-blocks2.golden b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/last-blocks2.golden new file mode 100644 index 00000000..b8e7f487 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/last-blocks2.golden @@ -0,0 +1,90 @@ +{ + "blocks": [ + { + "header": { + "seq": 179, + "block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "previous_block_hash": "bb943b37f989326b057903ccc6eb1fa58a5d35e38706ae1ba81e0a6100bacf26", + "timestamp": 1431339429, + "fee": 33129894, + "version": 0, + "tx_body_hash": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "ux_hash": "c99075adc48450a9bf04b8b06defba39fc9cb029fbac413d57ee9fea241d84b4" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "inner_hash": "db98f515ce6c3d99fd7c39a6ac59ab498b1a2cc8fc6a13377ac7d3d463898e7c", + "sigs": [ + "1ca18424c9a313e9c253aecaec3c532c35c60e454f026a3d2794c772bc74a19809d53f8862962e865dd822dd054cd7f32b89b810968d95c9db6a9a0c1095390601" + ], + "inputs": [ + "8e55f10a0615a0737e6906132e09ac08a206971ba4b656f004acc7f4b7889bc8" + ], + "outputs": [ + { + "uxid": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "hours": 5521648 + }, + { + "uxid": "01f9c1d6c83dbc1c993357436cdf7f214acd0bfa107ff7f1466d1b18ec03563e", + "dst": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "10050.000000", + "hours": 5521648 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 180, + "block_hash": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "previous_block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "timestamp": 1431574528, + "fee": 2265261, + "version": 0, + "tx_body_hash": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "ux_hash": "058d1d0a22be7b9f5567a236866836a87d922760581832cfb8bfbd8b337d64b1" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "inner_hash": "d5b18a0c0c454e56fe1f7d0c64236d633f65717c04f08cd943f5669b4cc34667", + "sigs": [ + "2fac42571bb301783e46e804069c73c8226b637ae6385fec793e3a3860feaa6918058c55f461cef38341670c5c2da230d2241f267dbde6fc0528a6fb24362b3b00" + ], + "inputs": [ + "c39acd3494113650c1a6a7809287af7b12a78bbd97126d4585dd1715e2cb5a66" + ], + "outputs": [ + { + "uxid": "75692aeff988ce0da734c474dbef3a1ce19a5a6823bbcd36acb856c83262261e", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "hours": 377543 + }, + { + "uxid": "a4b70476ea1e079ebd3503b52eee32d490515457fce6a5aa075770b598a9d14f", + "dst": "CDD8GoJUHEvBm1pD3BQ3hEC2KcJNhvUzpu", + "coins": "1000.000000", + "hours": 377543 + } + ] + } + ] + }, + "size": 220 + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/list-addresses.golden b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/list-addresses.golden new file mode 100644 index 00000000..3f998267 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/list-addresses.golden @@ -0,0 +1,5 @@ +{ + "addresses": [ + "2Kg3eRXUhY6hrDZvNGB99DKahtrPDQ1W9vN" + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/list-wallets.golden b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/list-wallets.golden new file mode 100644 index 00000000..13e0c7fc --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/list-wallets.golden @@ -0,0 +1,9 @@ +{ + "wallets": [ + { + "name": "integration-test.wlt", + "label": "integration-test", + "address_num": 1 + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/recompute-transaction-hash.golden b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/recompute-transaction-hash.golden new file mode 100644 index 00000000..bfa2e74b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/recompute-transaction-hash.golden @@ -0,0 +1,20 @@ +{ + "length": 183, + "type": 0, + "txid": "9b102b8a9882cd5dc2df8955fc1b8a1a75e11b9de61d272313c4da822920872b", + "inner_hash": "6b1a69b76b2412314b2b928ad5e97c31c034be5734f9fa77f31f11b6b933b976", + "sigs": [ + "ddf4bd79f66ea9c7849c5240a27d9a4745ad4661bdac2179184447088512bb3e62c89efa4fd2cee05980c59b38ef23ddbd09bb77e54e94a0f9123d968a090d4201" + ], + "inputs": [ + "f7c183c1823266aff172928f8d06aa65531643456f97ccca6bd34d15e92fac7d" + ], + "outputs": [ + { + "uxid": "d1e30a79ebaac4948c69ce8f61714320f996193544a815b58b6837bade5d86c3", + "dst": "2fRQzhdNP2QMG75GkZnm44H649QBcj2mZY", + "coins": "0.001000", + "hours": 22 + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/show-config.golden b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/show-config.golden new file mode 100644 index 00000000..806277df --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/show-config.golden @@ -0,0 +1,5 @@ +{ + "data_directory": "IGNORED/.skycoin", + "coin": "skycoin", + "rpc_address": "http://127.0.0.1:1024" +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/status-csrf-enabled-header-check-disabled-no-unconfirmed.golden b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/status-csrf-enabled-header-check-disabled-no-unconfirmed.golden new file mode 100644 index 00000000..d445102c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/status-csrf-enabled-header-check-disabled-no-unconfirmed.golden @@ -0,0 +1,50 @@ +{ + "status": { + "blockchain": { + "head": { + "seq": 180, + "block_hash": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "previous_block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "timestamp": 1431574528, + "fee": 2265261, + "version": 0, + "tx_body_hash": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "ux_hash": "058d1d0a22be7b9f5567a236866836a87d922760581832cfb8bfbd8b337d64b1" + }, + "unspents": 218, + "unconfirmed": 0, + "time_since_last_block": "0s" + }, + "version": { + "version": "", + "commit": "", + "branch": "" + }, + "coin": "skycoin", + "user_agent": "skycoin:0.27.0", + "open_connections": 0, + "outgoing_connections": 0, + "incoming_connections": 0, + "uptime": "0s", + "csrf_enabled": true, + "header_check_enabled": false, + "csp_enabled": true, + "wallet_api_enabled": true, + "gui_enabled": false, + "block_publisher": false, + "user_verify_transaction": { + "burn_factor": 10, + "max_transaction_size": 32768, + "max_decimals": 3 + }, + "unconfirmed_verify_transaction": { + "burn_factor": 10, + "max_transaction_size": 32768, + "max_decimals": 3 + }, + "started_at": 0 + }, + "cli_config": { + "webrpc_address": "http://127.0.0.1:1024" + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/status-csrf-enabled-header-check-disabled.golden b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/status-csrf-enabled-header-check-disabled.golden new file mode 100644 index 00000000..5f9c8b6e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/status-csrf-enabled-header-check-disabled.golden @@ -0,0 +1,61 @@ +{ + "status": { + "blockchain": { + "head": { + "seq": 180, + "block_hash": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "previous_block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "timestamp": 1431574528, + "fee": 2265261, + "version": 0, + "tx_body_hash": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "ux_hash": "058d1d0a22be7b9f5567a236866836a87d922760581832cfb8bfbd8b337d64b1" + }, + "unspents": 218, + "unconfirmed": 1, + "time_since_last_block": "0s" + }, + "version": { + "version": "", + "commit": "", + "branch": "" + }, + "coin": "skycoin", + "user_agent": "skycoin:0.27.0", + "open_connections": 0, + "outgoing_connections": 0, + "incoming_connections": 0, + "uptime": "0s", + "csrf_enabled": true, + "header_check_enabled": false, + "csp_enabled": true, + "wallet_api_enabled": true, + "gui_enabled": false, + "block_publisher": false, + "user_verify_transaction": { + "burn_factor": 10, + "max_transaction_size": 32768, + "max_decimals": 3 + }, + "unconfirmed_verify_transaction": { + "burn_factor": 10, + "max_transaction_size": 32768, + "max_decimals": 3 + }, + "started_at": 0, + "fiber": { + "name": "skycoin", + "display_name": "Skycoin", + "ticker": "SKY", + "coin_hours_display_name": "Coin Hours", + "coin_hours_display_name_singular": "Coin Hour", + "coin_hours_ticker": "SCH", + "explorer_url": "https://explorer.skycoin.com", + "version_url": "https://version.skycoin.com/skycoin/version.txt", + "bip44_coin": 8000 + } + }, + "cli_config": { + "webrpc_address": "http://127.0.0.1:1024" + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/status-no-unconfirmed.golden b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/status-no-unconfirmed.golden new file mode 100644 index 00000000..a3724a20 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/status-no-unconfirmed.golden @@ -0,0 +1,61 @@ +{ + "status": { + "blockchain": { + "head": { + "seq": 180, + "block_hash": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "previous_block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "timestamp": 1431574528, + "fee": 2265261, + "version": 0, + "tx_body_hash": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "ux_hash": "058d1d0a22be7b9f5567a236866836a87d922760581832cfb8bfbd8b337d64b1" + }, + "unspents": 218, + "unconfirmed": 0, + "time_since_last_block": "0s" + }, + "version": { + "version": "", + "commit": "", + "branch": "" + }, + "coin": "skycoin", + "user_agent": "skycoin:0.27.0", + "open_connections": 0, + "outgoing_connections": 0, + "incoming_connections": 0, + "uptime": "0s", + "csrf_enabled": false, + "header_check_enabled": true, + "csp_enabled": true, + "wallet_api_enabled": true, + "gui_enabled": false, + "block_publisher": false, + "user_verify_transaction": { + "burn_factor": 10, + "max_transaction_size": 32768, + "max_decimals": 3 + }, + "unconfirmed_verify_transaction": { + "burn_factor": 10, + "max_transaction_size": 32768, + "max_decimals": 3 + }, + "started_at": 0, + "fiber": { + "name": "skycoin", + "display_name": "Skycoin", + "ticker": "SKY", + "coin_hours_display_name": "Coin Hours", + "coin_hours_display_name_singular": "Coin Hour", + "coin_hours_ticker": "SCH", + "explorer_url": "https://explorer.skycoin.com", + "version_url": "https://version.skycoin.com/skycoin/version.txt", + "bip44_coin": 8000 + } + }, + "cli_config": { + "webrpc_address": "http://127.0.0.1:1024" + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/status.golden b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/status.golden new file mode 100644 index 00000000..057da3f7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/status.golden @@ -0,0 +1,61 @@ +{ + "status": { + "blockchain": { + "head": { + "seq": 180, + "block_hash": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "previous_block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "timestamp": 1431574528, + "fee": 2265261, + "version": 0, + "tx_body_hash": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "ux_hash": "058d1d0a22be7b9f5567a236866836a87d922760581832cfb8bfbd8b337d64b1" + }, + "unspents": 218, + "unconfirmed": 1, + "time_since_last_block": "0s" + }, + "version": { + "version": "", + "commit": "", + "branch": "" + }, + "coin": "skycoin", + "user_agent": "skycoin:0.27.0", + "open_connections": 0, + "outgoing_connections": 0, + "incoming_connections": 0, + "uptime": "0s", + "csrf_enabled": false, + "header_check_enabled": true, + "csp_enabled": true, + "wallet_api_enabled": true, + "gui_enabled": false, + "block_publisher": false, + "user_verify_transaction": { + "burn_factor": 10, + "max_transaction_size": 32768, + "max_decimals": 3 + }, + "unconfirmed_verify_transaction": { + "burn_factor": 10, + "max_transaction_size": 32768, + "max_decimals": 3 + }, + "started_at": 0, + "fiber": { + "name": "skycoin", + "display_name": "Skycoin", + "ticker": "SKY", + "coin_hours_display_name": "Coin Hours", + "coin_hours_display_name_singular": "Coin Hour", + "coin_hours_ticker": "SCH", + "explorer_url": "https://explorer.skycoin.com", + "version_url": "https://version.skycoin.com/skycoin/version.txt", + "bip44_coin": 8000 + } + }, + "cli_config": { + "webrpc_address": "http://127.0.0.1:1024" + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/two-addresses-outputs.golden b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/two-addresses-outputs.golden new file mode 100644 index 00000000..05f79304 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/two-addresses-outputs.golden @@ -0,0 +1,58 @@ +{ + "outputs": { + "head": { + "seq": 180, + "block_hash": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "previous_block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "timestamp": 1431574528, + "fee": 2265261, + "version": 0, + "tx_body_hash": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "ux_hash": "058d1d0a22be7b9f5567a236866836a87d922760581832cfb8bfbd8b337d64b1" + }, + "head_outputs": [ + { + "hash": "e5596ef0ba04ad9e0adbe0355a24c6bef249654906f917b68f8f0cf072508674", + "time": 1429382678, + "block_seq": 121, + "src_tx": "da82deafc15c36e7dc9cd95663e0dc910ae626ee543147ac7bd8682be00f7baf", + "address": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "62000.000000", + "hours": 378646, + "calculated_hours": 38127173 + }, + { + "hash": "3f9712cab0d3aeb217f1751fa19e53d75f814b4218866d4e70d63f32271d2023", + "time": 1429364452, + "block_seq": 120, + "src_tx": "d1569ca879f98450a920a2b427ab0e1d21342308fb6b4ea5031ee6e718217183", + "address": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "38.000000", + "hours": 480, + "calculated_hours": 23808 + }, + { + "hash": "3408638af298419b14a49e8e9dd69e97c9a06827d74edf9f410a870662360b31", + "time": 1429364072, + "block_seq": 118, + "src_tx": "a83e09e976b038d86491d8c029aec84a6313dc33e692da6ce50a2858e50c4666", + "address": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1045.000000", + "hours": 30769, + "calculated_hours": 672415 + }, + { + "hash": "439cdfd03972fb4bb5da54208cf8098ee78228c487ce9e84623f5f83e17a7d68", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + } + ], + "outgoing_outputs": [], + "incoming_outputs": [] + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/unconfirmed-transaction-cli.golden b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/unconfirmed-transaction-cli.golden new file mode 100644 index 00000000..e302e7b5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/unconfirmed-transaction-cli.golden @@ -0,0 +1,38 @@ +{ + "transaction": { + "status": { + "confirmed": false, + "unconfirmed": true, + "height": 0, + "block_seq": 0 + }, + "time": 1535637620, + "txn": { + "timestamp": 1535637620, + "length": 220, + "type": 0, + "txid": "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947", + "inner_hash": "f8293dbfdddcc56a97664655ceee650715d35a0dda32a9f0ce0e2e99d4899124", + "sigs": [ + "3981061c7275ae9cc936e902a5367fdd87ef779bbdb31e1e10d325d17a129abb34f6e597ceeaf67bb051774b41c58276004f6a63cb81de61d4693bc7a5536f3200" + ], + "inputs": [ + "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20" + ], + "outputs": [ + { + "uxid": "8f9c09c37e0c636178e4229e2e8212c067ef0a8c501be9e2757a97b980d7a98a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "605700.000000", + "hours": 5716263 + }, + { + "uxid": "32a060b2e2025cceb40f3f982c887952d3358d468db1719dd892eab575c14c14", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10000.000000", + "hours": 5716263 + } + ] + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/wallet-balance.golden b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/wallet-balance.golden new file mode 100644 index 00000000..861022d4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/wallet-balance.golden @@ -0,0 +1,31 @@ +{ + "confirmed": { + "coins": "0.000000", + "hours": "0" + }, + "spendable": { + "coins": "0.000000", + "hours": "0" + }, + "expected": { + "coins": "0.000000", + "hours": "0" + }, + "addresses": [ + { + "confirmed": { + "coins": "0.000000", + "hours": "0" + }, + "spendable": { + "coins": "0.000000", + "hours": "0" + }, + "expected": { + "coins": "0.000000", + "hours": "0" + }, + "address": "2Kg3eRXUhY6hrDZvNGB99DKahtrPDQ1W9vN" + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/wallet-history.golden b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/wallet-history.golden new file mode 100644 index 00000000..fe51488c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/wallet-history.golden @@ -0,0 +1 @@ +[] diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/wallet-outputs.golden b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/wallet-outputs.golden new file mode 100644 index 00000000..798a9480 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/integration/testdata/wallet-outputs.golden @@ -0,0 +1,17 @@ +{ + "outputs": { + "head": { + "seq": 180, + "block_hash": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "previous_block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "timestamp": 1431574528, + "fee": 2265261, + "version": 0, + "tx_body_hash": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "ux_hash": "058d1d0a22be7b9f5567a236866836a87d922760581832cfb8bfbd8b337d64b1" + }, + "head_outputs": [], + "outgoing_outputs": [], + "incoming_outputs": [] + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/last_blocks.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/last_blocks.go new file mode 100644 index 00000000..e5395496 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/last_blocks.go @@ -0,0 +1,38 @@ +package cli + +import ( + "fmt" + "strconv" + + "github.com/spf13/cobra" +) + +func lastBlocksCmd() *cobra.Command { + return &cobra.Command{ + Short: "Displays the content of the most recently N generated blocks", + Use: "lastBlocks [numberOfBlocks]", + Args: cobra.ExactArgs(1), + DisableFlagsInUseLine: true, + SilenceUsage: true, + RunE: getLastBlocks, + } +} + +func getLastBlocks(_ *cobra.Command, args []string) error { + num := args[0] + if num == "" { + num = "1" + } + + n, err := strconv.ParseUint(num, 10, 64) + if err != nil { + return fmt.Errorf("invalid block number, %s", err) + } + + blocks, err := apiClient.LastBlocks(n) + if err != nil { + return err + } + + return printJSON(blocks) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/list_addrs.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/list_addrs.go new file mode 100644 index 00000000..9c3d4f2e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/list_addrs.go @@ -0,0 +1,38 @@ +package cli + +import ( + "fmt" + + "github.com/spf13/cobra" + + "github.com/SkycoinProject/skycoin/src/wallet" +) + +func listAddressesCmd() *cobra.Command { + return &cobra.Command{ + Short: "Lists all addresses in a given wallet", + Use: "listAddresses [wallet]", + Args: cobra.ExactArgs(1), + DisableFlagsInUseLine: true, + SilenceUsage: true, + RunE: listAddresses, + } +} + +func listAddresses(_ *cobra.Command, args []string) error { + wlt, err := wallet.Load(args[0]) + if err != nil { + return WalletLoadError{err} + } + + addrs := wlt.GetAddresses() + + s, err := FormatAddressesAsJSON(addrs) + if err != nil { + return err + } + + fmt.Println(s) + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/list_wallets.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/list_wallets.go new file mode 100644 index 00000000..880a2e68 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/list_wallets.go @@ -0,0 +1,81 @@ +package cli + +import ( + "io/ioutil" + "path/filepath" + "strings" + + "github.com/spf13/cobra" + + "github.com/SkycoinProject/skycoin/src/wallet" +) + +// WalletEntry represents an enty in a wallet file +type WalletEntry struct { + Name string `json:"name"` + Label string `json:"label"` + AddressNum int `json:"address_num"` +} + +func listWalletsCmd() *cobra.Command { + return &cobra.Command{ + Short: "Lists all wallets stored in the wallet directory", + Use: "listWallets [directory]", + Long: `Lists all wallets stored in the wallet directory. + + The [wallet dir] argument is optional. If not provided, defaults to $DATA_DIR/wallets`, + DisableFlagsInUseLine: true, + SilenceUsage: true, + Args: cobra.MaximumNArgs(1), + RunE: listWallets, + } +} + +func listWallets(_ *cobra.Command, args []string) error { + var wlts struct { + Directory string `json:"directory"` + Wallets []WalletEntry `json:"wallets"` + } + + wlts.Wallets = []WalletEntry{} + + dir := filepath.Join(cliConfig.DataDir, "wallets") + if len(args) > 0 { + dir = args[0] + } + + var err error + dir, err = filepath.Abs(dir) + if err != nil { + return err + } + + wlts.Directory = dir + + entries, err := ioutil.ReadDir(dir) + if err != nil { + return err + } + + for _, e := range entries { + if e.Mode().IsRegular() { + name := e.Name() + if !strings.HasSuffix(name, walletExt) { + continue + } + + path := filepath.Join(dir, name) + w, err := wallet.Load(path) + if err != nil { + return WalletLoadError{err} + } + wlts.Wallets = append(wlts.Wallets, WalletEntry{ + Name: name, + Label: w.Label(), + AddressNum: w.EntriesLen(), + }) + } + } + + return printJSON(wlts) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/outputs.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/outputs.go new file mode 100644 index 00000000..7c8ff8a5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/outputs.go @@ -0,0 +1,95 @@ +package cli + +import ( + "fmt" + + "github.com/spf13/cobra" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/readable" + "github.com/SkycoinProject/skycoin/src/wallet" +) + +func walletOutputsCmd() *cobra.Command { + return &cobra.Command{ + Short: "Display outputs of specific wallet", + Use: "walletOutputs [wallet]", + DisableFlagsInUseLine: true, + SilenceUsage: true, + Args: cobra.ExactArgs(1), + RunE: getWalletOutputsCmd, + } +} + +func addressOutputsCmd() *cobra.Command { + return &cobra.Command{ + Short: "Display outputs of specific addresses", + Use: "addressOutputs [address list]", + Long: `Display outputs of specific addresses, join multiple addresses with space, + example: addressOutputs $addr1 $addr2 $addr3`, + Args: cobra.MinimumNArgs(1), + DisableFlagsInUseLine: true, + SilenceUsage: true, + RunE: getAddressOutputsCmd, + } +} + +// OutputsResult the output json format +type OutputsResult struct { + Outputs readable.UnspentOutputsSummary `json:"outputs"` +} + +func getWalletOutputsCmd(_ *cobra.Command, args []string) error { + outputs, err := GetWalletOutputsFromFile(apiClient, args[0]) + if err != nil { + return err + } + + return printJSON(OutputsResult{ + Outputs: *outputs, + }) +} + +func getAddressOutputsCmd(_ *cobra.Command, args []string) error { + addrs := make([]string, len(args)) + + var err error + for i := 0; i < len(args); i++ { + addrs[i] = args[i] + if _, err = cipher.DecodeBase58Address(addrs[i]); err != nil { + return fmt.Errorf("invalid address: %v, err: %v", addrs[i], err) + } + } + + outputs, err := apiClient.OutputsForAddresses(addrs) + if err != nil { + return err + } + + return printJSON(OutputsResult{ + Outputs: *outputs, + }) +} + +// PUBLIC + +// GetWalletOutputsFromFile returns unspent outputs associated with all addresses in a wallet file +func GetWalletOutputsFromFile(c GetOutputser, walletFile string) (*readable.UnspentOutputsSummary, error) { + wlt, err := wallet.Load(walletFile) + if err != nil { + return nil, err + } + + return GetWalletOutputs(c, wlt) +} + +// GetWalletOutputs returns unspent outputs associated with all addresses in a wallet.Wallet +func GetWalletOutputs(c GetOutputser, wlt wallet.Wallet) (*readable.UnspentOutputsSummary, error) { + cipherAddrs := wlt.GetAddresses() + addrs := make([]string, len(cipherAddrs)) + for i := range cipherAddrs { + addrs[i] = cipherAddrs[i].String() + } + + return c.OutputsForAddresses(addrs) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/richlist.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/richlist.go new file mode 100644 index 00000000..891343fe --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/richlist.go @@ -0,0 +1,58 @@ +package cli + +import ( + "fmt" + "strconv" + + "github.com/spf13/cobra" + + "github.com/SkycoinProject/skycoin/src/api" +) + +func richlistCmd() *cobra.Command { + return &cobra.Command{ + Short: "Get skycoin richlist", + Long: "Returns top N address (default 20) balances (based on unspent outputs). Optionally include distribution addresses (exluded by default).", + Use: "richlist [top N addresses (20 default)] [include distribution addresses (false default)]", + Args: cobra.MaximumNArgs(2), + DisableFlagsInUseLine: true, + SilenceUsage: true, + RunE: getRichlist, + } +} + +func getRichlist(_ *cobra.Command, args []string) error { + // default values + num := "20" + dist := "false" + + switch len(args) { + case 1: + num = args[0] + case 2: + num = args[0] + dist = args[1] + } + + n, err := strconv.Atoi(num) + if err != nil { + return fmt.Errorf("invalid number of addresses, %s", err) + } + + d, err := strconv.ParseBool(dist) + if err != nil { + return fmt.Errorf("invalid (bool) flag for include distribution addresses, %s", err) + } + + params := &api.RichlistParams{ + N: n, + IncludeDistribution: d, + } + + richlist, err := apiClient.Richlist(params) + if err != nil { + return err + } + + return printJSON(richlist) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/send.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/send.go new file mode 100644 index 00000000..a4a90578 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/send.go @@ -0,0 +1,67 @@ +package cli + +import ( + "fmt" + + "github.com/spf13/cobra" +) + +func sendCmd() *cobra.Command { + sendCmd := &cobra.Command{ + Args: cobra.MinimumNArgs(1), + Short: "Send skycoin from a wallet or an address to a recipient address", + Use: "send [wallet] [to address] [amount]", + Long: `Send skycoin from a wallet or an address to a recipient address. + + Note: the [amount] argument is the coins you will spend, 1 coins = 1e6 droplets. + + The [to address] and [amount] arguments can be replaced with the --many/-m option. + + If you are sending from a wallet without specifying an address, + the transaction will use one or more of the addresses within the wallet. + + Use caution when using the “-p†command. If you have command history enabled + your wallet encryption password can be recovered from the history log. + If you do not include the “-p†option you will be prompted to enter your password + after you enter your command.`, + SilenceUsage: true, + RunE: func(c *cobra.Command, args []string) error { + rawTxn, err := createRawTxnCmdHandler(c, args) + if err != nil { + printHelp(c) + return err + } + + txid, err := apiClient.InjectTransaction(rawTxn) + if err != nil { + return err + } + + jsonOutput, err := c.Flags().GetBool("json") + if err != nil { + return err + } + if jsonOutput { + return printJSON(struct { + Txid string `json:"txid"` + }{ + Txid: txid, + }) + } + + fmt.Printf("txid:%s\n", txid) + return nil + }, + } + + sendCmd.Flags().StringP("from-address", "a", "", "From address in wallet") + sendCmd.Flags().StringP("change-address", "c", "", `Specify the change address. +Defaults to one of the spending addresses (deterministic wallets) or to a new change address (bip44 wallets).`) + sendCmd.Flags().StringP("many", "m", "", `use JSON string to set multiple receive addresses and coins, +example: -m '[{"addr":"$addr1", "coins": "10.2"}, {"addr":"$addr2", "coins": "20"}]'`) + sendCmd.Flags().StringP("password", "p", "", "Wallet password") + sendCmd.Flags().BoolP("json", "j", false, "Returns the results in JSON format.") + sendCmd.Flags().String("csv", "", "CSV file containing addresses and amounts to send") + + return sendCmd +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/show_seed.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/show_seed.go new file mode 100644 index 00000000..96670b49 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/show_seed.go @@ -0,0 +1,115 @@ +package cli + +import ( + "fmt" + + "github.com/spf13/cobra" + + "github.com/SkycoinProject/skycoin/src/wallet" +) + +func showSeedCmd() *cobra.Command { + showSeedCmd := &cobra.Command{ + Args: cobra.ExactArgs(1), + Use: "showSeed [wallet]", + Short: "Show wallet seed and seed passphrase", + Long: `Print the seed and seed passphrase from a wallet. + + Use caution when using the "-p" command. If you have command history enabled + your wallet encryption password can be recovered from the history log. If you + do not include the "-p" option you will be prompted to enter your password + after you enter your command.`, + SilenceUsage: true, + RunE: func(c *cobra.Command, args []string) error { + w := args[0] + + password, err := c.Flags().GetString("password") + if err != nil { + return err + } + + jsonOutput, err := c.Flags().GetBool("json") + if err != nil { + return err + } + + pr := NewPasswordReader([]byte(password)) + seed, seedPassphrase, err := getSeed(w, pr) + switch err.(type) { + case nil: + case WalletLoadError: + printHelp(c) + return err + default: + return err + } + + if jsonOutput { + v := struct { + Seed string `json:"seed"` + SeedPassphrase string `json:"seed_passphrase,omitempty"` + }{ + Seed: seed, + SeedPassphrase: seedPassphrase, + } + + return printJSON(v) + } + + fmt.Println(seed) + if seedPassphrase != "" { + fmt.Println(seedPassphrase) + } + return nil + }, + } + + showSeedCmd.Flags().StringP("password", "p", "", "Wallet password") + showSeedCmd.Flags().BoolP("json", "j", false, "Returns the results in JSON format.") + + return showSeedCmd +} + +func getSeed(walletFile string, pr PasswordReader) (string, string, error) { + wlt, err := wallet.Load(walletFile) + if err != nil { + return "", "", WalletLoadError{err} + } + + switch pr.(type) { + case nil: + if wlt.IsEncrypted() { + return "", "", wallet.ErrWalletEncrypted + } + case PasswordFromBytes: + p, err := pr.Password() + if err != nil { + return "", "", err + } + + if !wlt.IsEncrypted() && len(p) != 0 { + return "", "", wallet.ErrWalletNotEncrypted + } + } + + if !wlt.IsEncrypted() { + return wlt.Seed(), wlt.SeedPassphrase(), nil + } + + password, err := pr.Password() + if err != nil { + return "", "", err + } + + var seed string + var seedPassphrase string + if err := wallet.GuardView(wlt, password, func(w wallet.Wallet) error { + seed = w.Seed() + seedPassphrase = w.SeedPassphrase() + return nil + }); err != nil { + return "", "", err + } + + return seed, seedPassphrase, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/status.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/status.go new file mode 100644 index 00000000..816bccf7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/status.go @@ -0,0 +1,52 @@ +package cli + +import ( + cobra "github.com/spf13/cobra" + + "github.com/SkycoinProject/skycoin/src/api" +) + +// StatusResult is printed by cli status command +type StatusResult struct { + Status api.HealthResponse `json:"status"` + Config ConfigStatus `json:"cli_config"` +} + +// ConfigStatus contains the configuration parameters loaded by the cli +type ConfigStatus struct { + RPCAddress string `json:"webrpc_address"` +} + +func statusCmd() *cobra.Command { + return &cobra.Command{ + Use: "status", + Short: "Check the status of current Skycoin node", + DisableFlagsInUseLine: true, + SilenceUsage: true, + Args: cobra.NoArgs, + RunE: func(_ *cobra.Command, _ []string) error { + status, err := apiClient.Health() + if err != nil { + return err + } + + return printJSON(StatusResult{ + Status: *status, + Config: ConfigStatus{ + RPCAddress: cliConfig.RPCAddress, + }, + }) + }, + } +} + +func showConfigCmd() *cobra.Command { + return &cobra.Command{ + Use: "showConfig", + Short: "Show cli configuration", + DisableFlagsInUseLine: true, + RunE: func(_ *cobra.Command, _ []string) error { + return printJSON(cliConfig) + }, + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/transaction.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/transaction.go new file mode 100644 index 00000000..84b91830 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/transaction.go @@ -0,0 +1,405 @@ +package cli + +import ( + "encoding/json" + "errors" + "fmt" + "os" + "strconv" + + "github.com/SkycoinProject/skycoin/src/util/droplet" + "github.com/SkycoinProject/skycoin/src/wallet" + + "github.com/SkycoinProject/skycoin/src/api" + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/readable" + + "github.com/spf13/cobra" +) + +// TxnResult wraps readable.TransactionWithStatus +type TxnResult struct { + Transaction *readable.TransactionWithStatus `json:"transaction"` +} + +func transactionCmd() *cobra.Command { + return &cobra.Command{ + Short: "Show detail info of specific transaction", + Use: "transaction [transaction id]", + DisableFlagsInUseLine: true, + SilenceUsage: true, + Args: cobra.ExactArgs(1), + RunE: func(_ *cobra.Command, args []string) error { + txid := args[0] + if txid == "" { + return errors.New("txid is empty") + } + + // validate the txid + _, err := cipher.SHA256FromHex(txid) + if err != nil { + return errors.New("invalid txid") + } + + txn, err := apiClient.Transaction(txid) + if err != nil { + return err + } + + return printJSON(TxnResult{ + Transaction: txn, + }) + }, + } +} + +func decodeRawTxnCmd() *cobra.Command { + return &cobra.Command{ + Short: "Decode raw transaction", + Use: "decodeRawTransaction [raw transaction]", + DisableFlagsInUseLine: true, + SilenceUsage: true, + Args: cobra.ExactArgs(1), + RunE: func(_ *cobra.Command, args []string) error { + txn, err := coin.DeserializeTransactionHex(args[0]) + if err != nil { + return fmt.Errorf("invalid raw transaction: %v", err) + } + + // Assume the transaction is not malformed and if it has no inputs + // that it is the genesis block's transaction + isGenesis := len(txn.In) == 0 + rTxn, err := readable.NewTransaction(txn, isGenesis) + if err != nil { + return err + } + + return printJSON(rTxn) + }, + } +} + +func encodeJSONTxnCmd() *cobra.Command { + cmd := &cobra.Command{ + Short: "Encode JSON transaction", + Use: "encodeJsonTransaction [file path or -]", + DisableFlagsInUseLine: true, + SilenceUsage: true, + Args: cobra.ExactArgs(1), + RunE: func(c *cobra.Command, args []string) error { + jsonOutput, err := c.Flags().GetBool("json") + if err != nil { + return err + } + + jsonFilePath := args[0] + var jsonFile *os.File + if jsonFilePath == "-" { + jsonFile = os.Stdin + err = nil + jsonFilePath = "" + } else { + jsonFile, err = os.Open(jsonFilePath) + } + if err != nil { + return fmt.Errorf("open file failed %s: %v", jsonFilePath, err) + } + var rTxn readable.Transaction + err = json.NewDecoder(jsonFile).Decode(&rTxn) + if err != nil { + return fmt.Errorf("invalid JSON transaction: %v", err) + } + + // fixHashes recomputes the txn hashes + // the recomputation of hash is needed when txn info for e.g. the sig is changed + fixHashes, err := c.Flags().GetBool("fix") + if err != nil { + return err + } + + if fixHashes { + err = recomputeHashes(&rTxn) + if err != nil { + return err + } + } + + txn, err := readableToCreatedTransaction(&rTxn).ToTransaction() + if err != nil { + return err + } + rawTxn, err := txn.SerializeHex() + if err != nil { + return err + } + if jsonOutput { + return printJSON(struct { + RawTx string `json:"rawtx"` + }{ + RawTx: rawTxn, + }) + } + fmt.Println(rawTxn) + return nil + }, + } + cmd.Flags().BoolP("json", "j", false, "Returns the results in JSON format.") + cmd.Flags().BoolP("fix", "f", false, "Recompute transaction inner and outer hashes") + return cmd +} + +func readableToCreatedTransaction(rTxn *readable.Transaction) *api.CreatedTransaction { + inputs := make([]api.CreatedTransactionInput, len(rTxn.In)) + outputs := make([]api.CreatedTransactionOutput, len(rTxn.Out)) + for i, rIn := range rTxn.In { + inputs[i] = api.CreatedTransactionInput{ + UxID: rIn, + } + } + for i, rOut := range rTxn.Out { + outputs[i] = api.CreatedTransactionOutput{ + UxID: rOut.Hash, + Address: rOut.Address, + Coins: rOut.Coins, + Hours: strconv.FormatUint(rOut.Hours, 10), + } + } + cTxn := api.CreatedTransaction{ + Length: rTxn.Length, + Type: rTxn.Type, + TxID: rTxn.Hash, + InnerHash: rTxn.InnerHash, + Fee: "", + Sigs: rTxn.Sigs[:], + In: inputs, + Out: outputs, + } + return &cTxn +} + +func recomputeHashes(rTxn *readable.Transaction) error { + t := coin.Transaction{} + + t.Length = rTxn.Length + t.Type = rTxn.Type + + var err error + + sigs := make([]cipher.Sig, len(rTxn.Sigs)) + for i, s := range rTxn.Sigs { + sigs[i], err = cipher.SigFromHex(s) + if err != nil { + return err + } + } + + t.Sigs = sigs + + in := make([]cipher.SHA256, len(rTxn.In)) + for i, UxID := range rTxn.In { + in[i], err = cipher.SHA256FromHex(UxID) + if err != nil { + return err + } + } + + t.In = in + + out := make([]coin.TransactionOutput, len(rTxn.Out)) + for i, o := range rTxn.Out { + addr, err := cipher.DecodeBase58Address(o.Address) + if err != nil { + return err + } + + coins, err := droplet.FromString(o.Coins) + if err != nil { + return err + } + + out[i] = coin.TransactionOutput{ + Address: addr, + Coins: coins, + Hours: o.Hours, + } + } + + t.Out = out + + // recompute inner hash + rTxn.InnerHash = t.HashInner().Hex() + t.InnerHash, err = cipher.SHA256FromHex(rTxn.InnerHash) + if err != nil { + return err + } + + // recompute txid + rTxn.Hash = t.Hash().Hex() + + return nil +} + +func addressTransactionsCmd() *cobra.Command { + return &cobra.Command{ + Short: "Show detail for transaction associated with one or more specified addresses", + Use: "addressTransactions [address list]", + Long: `Display transactions for specific addresses, separate multiple addresses with a space, + example: addressTransactions addr1 addr2 addr3`, + DisableFlagsInUseLine: true, + SilenceUsage: true, + RunE: getAddressTransactionsCmd, + } +} + +func getAddressTransactionsCmd(c *cobra.Command, args []string) error { + // Build the list of addresses from the command line arguments + addrs := make([]string, len(args)) + var err error + for i := 0; i < len(args); i++ { + addrs[i] = args[i] + if _, err = cipher.DecodeBase58Address(addrs[i]); err != nil { + return fmt.Errorf("invalid address: %v, err: %v", addrs[i], err) + } + } + + // If one or more addresses have been provided, request their transactions - otherwise report an error + if len(addrs) > 0 { + outputs, err := apiClient.TransactionsVerbose(addrs) + if err != nil { + return err + } + + return printJSON(outputs) + } + + return fmt.Errorf("at least one address must be specified. Example: %s addr1 addr2 addr3", c.Name()) +} + +func verifyTransactionCmd() *cobra.Command { + return &cobra.Command{ + Short: "Verify if the specific transaction is spendable", + Use: "verifyTransaction [encoded transaction]", + DisableFlagsInUseLine: true, + SilenceUsage: true, + Args: cobra.MaximumNArgs(1), + RunE: func(_ *cobra.Command, args []string) error { + encodedTxn := args[0] + if encodedTxn == "" { + return errors.New("transaction is empty") + } + + _, err := apiClient.VerifyTransaction(api.VerifyTransactionRequest{ + EncodedTransaction: encodedTxn, + }) + if err != nil { + return err + } + + fmt.Println("transaction is spendable") + + return nil + }, + } +} + +func pendingTransactionsCmd() *cobra.Command { + pendingTxnsCmd := &cobra.Command{ + Short: "Get all unconfirmed transactions", + Use: "pendingTransactions", + DisableFlagsInUseLine: true, + SilenceUsage: true, + Args: cobra.NoArgs, + RunE: func(c *cobra.Command, _ []string) error { + isVerbose, err := c.Flags().GetBool("verbose") + if err != nil { + return err + } + + if isVerbose { + pendingTxns, err := apiClient.PendingTransactionsVerbose() + if err != nil { + return err + } + + return printJSON(pendingTxns) + } + + pendingTxns, err := apiClient.PendingTransactions() + if err != nil { + return err + } + + return printJSON(pendingTxns) + }, + } + + pendingTxnsCmd.Flags().BoolP("verbose", "v", false, + `Require the transaction inputs to include the owner address, coins, hours and calculated hours. + The hours are the original hours the output was created with. + The calculated hours are calculated based upon the current system time, and provide an approximate + coin hour value of the output if it were to be confirmed at that instant.`) + + return pendingTxnsCmd +} + +func signTxnCmd() *cobra.Command { + signTxnCmd := &cobra.Command{ + Short: "Sign an unsigned transaction with specific wallet", + Use: "signTransaction [wallet] [raw transaction]", + DisableFlagsInUseLine: true, + SilenceUsage: true, + Args: cobra.ExactArgs(2), + RunE: func(c *cobra.Command, args []string) error { + id := args[0] + rawTxn := args[1] + + // Decode the raw transaction to see if the transaction already signed + txn, err := coin.DeserializeTransactionHex(rawTxn) + if err != nil { + return err + } + + emptySig := cipher.Sig{} + if len(txn.Sigs) > 0 && txn.Sigs[0] != emptySig { + return fmt.Errorf("Transaction already signed") + } + + // Check if wallet is encrypted + req := api.WalletSignTransactionRequest{ + WalletID: id, + EncodedTransaction: rawTxn, + } + + // Load wallet to check if the wallet is encrypted + w, err := wallet.Load(id) + if err != nil { + return err + } + + // Read wallet password from terminal if it is encrypted + if w.IsEncrypted() { + v, err := readPasswordFromTerminal() + if err != nil { + return err + } + req.Password = string(v) + defer func() { + // Wipe out the password from memory + v = []byte{} + req.Password = "" + }() + } + + // Send transaction signing request + signedTxn, err := apiClient.WalletSignTransaction(req) + if err != nil { + return err + } + + return printJSON(signedTxn) + }, + } + + return signTxnCmd +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/verify_address.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/verify_address.go new file mode 100644 index 00000000..f2f2bef9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/verify_address.go @@ -0,0 +1,21 @@ +package cli + +import ( + "github.com/spf13/cobra" + + "github.com/SkycoinProject/skycoin/src/cipher" +) + +func verifyAddressCmd() *cobra.Command { + return &cobra.Command{ + Short: "Verify a skycoin address", + Use: "verifyAddress [skycoin address]", + Args: cobra.ExactArgs(1), + DisableFlagsInUseLine: true, + SilenceUsage: true, + RunE: func(_ *cobra.Command, args []string) error { + _, err := cipher.DecodeBase58Address(args[0]) + return err + }, + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/version.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/version.go new file mode 100644 index 00000000..7cb5af17 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/version.go @@ -0,0 +1,50 @@ +package cli + +import ( + "fmt" + "reflect" + + "github.com/spf13/cobra" +) + +func versionCmd() *cobra.Command { + versionCmd := &cobra.Command{ + Use: "version", + Short: "List the current version of Skycoin components", + Args: cobra.NoArgs, + SilenceUsage: true, + RunE: func(c *cobra.Command, _ []string) error { + var ver = struct { + Skycoin string `json:"skycoin"` + Cli string `json:"cli"` + RPC string `json:"rpc"` + Wallet string `json:"wallet"` + }{ + Version, + Version, + Version, + Version, + } + + jsonOutput, err := c.Flags().GetBool("json") + if err != nil { + return err + } + if jsonOutput { + return printJSON(ver) + } + + v := reflect.ValueOf(ver) + t := reflect.TypeOf(ver) + for i := 0; i < v.NumField(); i++ { + fmt.Printf("%s:%v\n", t.Field(i).Tag.Get("json"), v.Field(i).Interface()) + } + + return nil + }, + } + + versionCmd.Flags().BoolP("json", "j", false, "Returns the results in JSON format") + + return versionCmd +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/wallet_history.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/wallet_history.go new file mode 100644 index 00000000..3f1d9f69 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/wallet_history.go @@ -0,0 +1,249 @@ +package cli + +import ( + "errors" + "fmt" + + "time" + + "sort" + + cobra "github.com/spf13/cobra" + + "github.com/SkycoinProject/skycoin/src/api" + "github.com/SkycoinProject/skycoin/src/readable" + "github.com/SkycoinProject/skycoin/src/util/droplet" + "github.com/SkycoinProject/skycoin/src/wallet" +) + +// AddrHistory represents a transactional event for an address +type AddrHistory struct { + BlockSeq uint64 `json:"-"` + Txid string `json:"txid"` + Address string `json:"address"` + Amount string `json:"amount"` + Timestamp time.Time `json:"timestamp"` + Status int `json:"status"` + + coins uint64 +} + +type byTime []AddrHistory + +func (obt byTime) Less(i, j int) bool { + return obt[i].Timestamp.Unix() < obt[j].Timestamp.Unix() +} + +func (obt byTime) Swap(i, j int) { + obt[i], obt[j] = obt[j], obt[i] +} + +func (obt byTime) Len() int { + return len(obt) +} + +func walletHisCmd() *cobra.Command { + walletHisCmd := &cobra.Command{ + Short: "Display the transaction history of specific wallet. Requires skycoin node rpc.", + Use: "walletHistory [wallet]", + SilenceUsage: true, + Args: cobra.ExactArgs(1), + RunE: walletHistoryAction, + } + + return walletHisCmd +} + +func walletHistoryAction(c *cobra.Command, args []string) error { + w := args[0] + + // Get all addresses in the wallet + addrs, err := getAddresses(w) + if err != nil { + return err + } + + if len(addrs) == 0 { + return errors.New("Wallet is empty") + } + + // Get all the addresses' historical uxouts + totalAddrHis := []AddrHistory{} + for _, addr := range addrs { + uxouts, err := apiClient.AddressUxOuts(addr) + if err != nil { + return err + } + + addrHis, err := makeAddrHisArray(apiClient, addr, uxouts) + if err != nil { + return err + } + totalAddrHis = append(totalAddrHis, addrHis...) + } + + // Sort the uxouts by time ascending + sort.Sort(byTime(totalAddrHis)) + + return printJSON(totalAddrHis) +} + +func makeAddrHisArray(c *api.Client, addr string, uxOuts []readable.SpentOutput) ([]AddrHistory, error) { + if len(uxOuts) == 0 { + return nil, nil + } + + var addrHis, spentHis, realHis []AddrHistory + var spentBlkSeqMap = map[uint64]bool{} + + for _, u := range uxOuts { + amount, err := droplet.ToString(u.Coins) + if err != nil { + return nil, err + } + + addrHis = append(addrHis, AddrHistory{ + BlockSeq: u.SrcBkSeq, + Txid: u.SrcTx, + Address: addr, + Amount: amount, + Timestamp: time.Unix(int64(u.Time), 0).UTC(), + Status: 1, + coins: u.Coins, + }) + + // the SpentBlockSeq will be 0 if the uxout has not been spent yet. + if u.SpentBlockSeq != 0 { + spentBlkSeqMap[u.SpentBlockSeq] = true + spentHis = append(spentHis, AddrHistory{ + BlockSeq: u.SpentBlockSeq, + Address: addr, + Txid: u.SpentTxnID, + Amount: "-" + amount, + Status: 1, + coins: u.Coins, + }) + } + } + + if len(spentBlkSeqMap) > 0 { + spentBlkSeq := make([]uint64, 0, len(spentBlkSeqMap)) + for seq := range spentBlkSeqMap { + spentBlkSeq = append(spentBlkSeq, seq) + } + + getBlkTime, err := createBlkTimeFinder(c, spentBlkSeq) + if err != nil { + return nil, err + } + + for i, his := range spentHis { + spentHis[i].Timestamp = time.Unix(getBlkTime(his.BlockSeq), 0).UTC() + } + } + + type historyRecord struct { + received []AddrHistory + spent []AddrHistory + } + + // merge history in the same transaction. + hisMap := map[string]historyRecord{} + for _, his := range addrHis { + hr := hisMap[his.Txid] + hr.received = append(hr.received, his) + hisMap[his.Txid] = hr + } + for _, his := range spentHis { + hr := hisMap[his.Txid] + hr.spent = append(hr.spent, his) + hisMap[his.Txid] = hr + } + + for txid, hs := range hisMap { + var receivedCoins, spentCoins, coins uint64 + for _, h := range hs.received { + receivedCoins += h.coins + } + for _, h := range hs.spent { + spentCoins += h.coins + } + + isNegative := spentCoins > receivedCoins + + if spentCoins > receivedCoins { + coins = spentCoins - receivedCoins + } else { + coins = receivedCoins - spentCoins + } + + amount, err := droplet.ToString(coins) + if err != nil { + return nil, err + } + + if isNegative { + amount = "-" + amount + } + + var his AddrHistory + if len(hs.received) > 0 { + his = hs.received[0] + } else { + his = hs.spent[0] + } + + realHis = append(realHis, AddrHistory{ + BlockSeq: his.BlockSeq, + Txid: txid, + Address: addr, + Amount: amount, + Timestamp: his.Timestamp, + Status: 1, + }) + } + + return realHis, nil +} + +func createBlkTimeFinder(c *api.Client, ss []uint64) (func(uint64) int64, error) { + // get spent blocks + blocks := make([]*readable.Block, 0, len(ss)) + for _, s := range ss { + block, err := c.BlockBySeq(s) + if err != nil { + return nil, err + } + + blocks = append(blocks, block) + } + + if len(blocks) == 0 { + return nil, fmt.Errorf("found no block") + } + + return func(seq uint64) int64 { + for _, b := range blocks { + if seq == b.Head.BkSeq { + return int64(b.Head.Time) + } + } + panic("block not found") + }, nil +} + +func getAddresses(f string) ([]string, error) { + wlt, err := wallet.Load(f) + if err != nil { + return nil, err + } + + addrs := wlt.GetAddresses() + + strAddrs := make([]string, len(addrs)) + for i, a := range addrs { + strAddrs[i] = a.String() + } + + return strAddrs, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/cli/wallet_key_export.go b/vendor/github.com/SkycoinProject/skycoin/src/cli/wallet_key_export.go new file mode 100644 index 00000000..5208019d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/cli/wallet_key_export.go @@ -0,0 +1,159 @@ +package cli + +import ( + "errors" + "fmt" + "strconv" + "strings" + + "github.com/spf13/cobra" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/bip32" + "github.com/SkycoinProject/skycoin/src/wallet" +) + +func walletKeyExportCmd() *cobra.Command { + walletKeyExportCmd := &cobra.Command{ + Args: cobra.ExactArgs(1), + RunE: walletKeyExportHandler, + Use: "walletKeyExport [wallet]", + Short: "Export a specific key from an HD wallet", + Long: `This command prints the xpub or xprv key for a given + HDNode in a bip44 wallet. The HDNode path is specified with --path. + This path is the portion of the bip44 path. + + Example: -k xpub --path=0 prints the account 0 xpub + Example: -k xpub --path=0/0 prints the account 0, external chain xpub + Example: -k xprv --path=0/1 prints the account 0, change chain xprv + Example: -k pub --path=0/1/9 prints the account 0, external chain child 9 public key + Example: -k prv --path=0/1/8 prints the account 0, change chain child 8 private key + + The bip32 path node apostrophe is implicit for the first element of the path. + + Use caution when using the "-p" command. If you have command + history enabled your wallet encryption password can be recovered + from the history log. If you do not include the "-p" option you will + be prompted to enter your password after you enter your command.`, + } + + walletKeyExportCmd.Flags().StringP("key", "k", "xpub", "key type (\"xpub\", \"xprv\", \"pub\", \"prv\")") + walletKeyExportCmd.Flags().StringP("path", "p", "0/0", "bip44 account'/change subpath") + + return walletKeyExportCmd +} + +func walletKeyExportHandler(c *cobra.Command, args []string) error { + keyType, err := c.Flags().GetString("key") + if err != nil { + return err + } + if err := validateKeyType(keyType); err != nil { + return err + } + + w, err := wallet.Load(args[0]) + if err != nil { + return err + } + + switch w.Type() { + case wallet.WalletTypeBip44: + default: + return fmt.Errorf("support wallet types: %q", wallet.WalletTypeBip44) + } + + wb := w.(*wallet.Bip44Wallet) + + coin, err := wb.CoinHDNode() + if err != nil { + return err + } + + path, err := c.Flags().GetString("path") + if err != nil { + return err + } + + nodes, err := parsePath(path) + if err != nil { + return err + } + if len(nodes) > 3 { + return errors.New("path can have at most 3 elements") + } + + acct, err := coin.Account(nodes[0]) + if err != nil { + return err + } + + if len(nodes) == 1 { + return printKey(keyType, acct.PrivateKey) + } + + change, err := acct.NewPrivateChildKey(nodes[1]) + if err != nil { + return err + } + + if len(nodes) == 2 { + return printKey(keyType, change) + } + + child, err := change.NewPrivateChildKey(nodes[2]) + if err != nil { + return err + } + + if len(nodes) == 3 { + return printKey(keyType, child) + } + + return nil +} + +func validateKeyType(kt string) error { + switch kt { + case "xpub", "xprv", "pub", "prv": + default: + return errors.New("key must be \"xpub\", \"xprv\", \"pub\" or \"prv\"") + } + + return nil +} + +func printKey(kt string, k *bip32.PrivateKey) error { + if err := validateKeyType(kt); err != nil { + return err + } + + switch kt { + case "xpub": + fmt.Println(k.PublicKey().String()) + case "xprv": + fmt.Println(k.String()) + case "pub": + fmt.Println(cipher.MustNewPubKey(k.PublicKey().Key).Hex()) + case "prv": + fmt.Println(cipher.MustNewSecKey(k.Key).Hex()) + default: + panic("unhandled key type") + } + + return nil +} + +func parsePath(p string) ([]uint32, error) { + pts := strings.Split(p, "/") + idx := make([]uint32, len(pts)) + for i, c := range pts { + x, err := strconv.ParseUint(c, 10, 32) + if err != nil { + return nil, fmt.Errorf("invalid path node number %q at position %d", c, i) + } + idx[i] = uint32(x) + } + + return idx, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/coin/block.go b/vendor/github.com/SkycoinProject/skycoin/src/coin/block.go new file mode 100644 index 00000000..00a9a898 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/coin/block.go @@ -0,0 +1,236 @@ +/* +Package coin defines the core blockchain datastructures. + +This package should not have any dependencies except for go stdlib and cipher. +*/ +package coin + +import ( + "fmt" + "log" + + "github.com/SkycoinProject/skycoin/src/cipher" +) + +//go:generate skyencoder -struct BlockHeader -unexported +//go:generate skyencoder -struct BlockBody -unexported + +// MaxBlockTransactions is the maximum number of transactions in a block (see the maxlen struct tag value applied to BlockBody.Transactions) +const MaxBlockTransactions = 65535 + +// Block represents the block struct +type Block struct { + Head BlockHeader + Body BlockBody +} + +// HashPair including current block hash and previous block hash. +type HashPair struct { + Hash cipher.SHA256 + PrevHash cipher.SHA256 +} + +// BlockHeader records the block header +type BlockHeader struct { + Version uint32 + + Time uint64 + BkSeq uint64 // Increment every block + Fee uint64 // Fee in block + + PrevHash cipher.SHA256 // Hash of header of previous block + BodyHash cipher.SHA256 // Hash of transaction block + + UxHash cipher.SHA256 // XOR of sha256 of elements in unspent output set +} + +// BlockBody represents the block body +type BlockBody struct { + Transactions Transactions `enc:",maxlen=65535"` +} + +// SignedBlock signed block +type SignedBlock struct { + Block + Sig cipher.Sig +} + +// VerifySignature verifies that the block is signed by pubkey +func (b SignedBlock) VerifySignature(pubkey cipher.PubKey) error { + return cipher.VerifyPubKeySignedHash(pubkey, b.Sig, b.HashHeader()) +} + +// NewBlock creates new block. +func NewBlock(prev Block, currentTime uint64, uxHash cipher.SHA256, txns Transactions, calc FeeCalculator) (*Block, error) { + if len(txns) == 0 { + return nil, fmt.Errorf("Refusing to create block with no transactions") + } + + fee, err := txns.Fees(calc) + if err != nil { + // This should have been caught earlier + return nil, fmt.Errorf("Invalid transaction fees: %v", err) + } + + body := BlockBody{txns} + head := NewBlockHeader(prev.Head, uxHash, currentTime, fee, body) + return &Block{ + Head: head, + Body: body, + }, nil +} + +// NewGenesisBlock creates genesis block +func NewGenesisBlock(genesisAddr cipher.Address, genesisCoins, timestamp uint64) (*Block, error) { + txn := Transaction{} + if err := txn.PushOutput(genesisAddr, genesisCoins, genesisCoins); err != nil { + return nil, err + } + body := BlockBody{Transactions: Transactions{txn}} + prevHash := cipher.SHA256{} + bodyHash := body.Hash() + head := BlockHeader{ + Time: timestamp, + BodyHash: bodyHash, + PrevHash: prevHash, + BkSeq: 0, + Version: 0, + Fee: 0, + UxHash: cipher.SHA256{}, + } + b := &Block{ + Head: head, + Body: body, + } + + return b, nil +} + +// HashHeader return hash of block head. +func (b Block) HashHeader() cipher.SHA256 { + return b.Head.Hash() +} + +// Time return the head time of the block. +func (b Block) Time() uint64 { + return b.Head.Time +} + +// Seq return the head seq of the block. +func (b Block) Seq() uint64 { + return b.Head.BkSeq +} + +// Size returns the size of the Block's Transactions, in bytes +func (b Block) Size() (uint32, error) { + return b.Body.Size() +} + +// NewBlockHeader creates block header +func NewBlockHeader(prev BlockHeader, uxHash cipher.SHA256, currentTime, fee uint64, body BlockBody) BlockHeader { + if currentTime <= prev.Time { + log.Panic("Time can only move forward") + } + bodyHash := body.Hash() + prevHash := prev.Hash() + return BlockHeader{ + BodyHash: bodyHash, + Version: prev.Version, + PrevHash: prevHash, + Time: currentTime, + BkSeq: prev.BkSeq + 1, + Fee: fee, + UxHash: uxHash, + } +} + +// Hash return hash of block header +func (bh *BlockHeader) Hash() cipher.SHA256 { + return cipher.SumSHA256(bh.Bytes()) +} + +// Bytes serialize the blockheader and return the byte value. +func (bh *BlockHeader) Bytes() []byte { + buf, err := encodeBlockHeader(bh) + if err != nil { + log.Panicf("encodeBlockHeader failed: %v", err) + } + return buf +} + +// Hash returns the merkle hash of contained transactions +func (bb BlockBody) Hash() cipher.SHA256 { + hashes := make([]cipher.SHA256, len(bb.Transactions)) + for i := range bb.Transactions { + hashes[i] = bb.Transactions[i].Hash() + } + // Merkle hash of transactions + return cipher.Merkle(hashes) +} + +// Size returns the size of Transactions, in bytes +func (bb BlockBody) Size() (uint32, error) { + // We can't use length of self.Bytes() because it has a length prefix + // Need only the sum of transaction sizes + return bb.Transactions.Size() +} + +// Bytes serialize block body, and return the byte value. +func (bb *BlockBody) Bytes() []byte { + buf, err := encodeBlockBody(bb) + if err != nil { + log.Panicf("encodeBlockBody failed: %v", err) + } + return buf +} + +// CreateUnspents creates the expected outputs for a transaction. +func CreateUnspents(bh BlockHeader, txn Transaction) UxArray { + var h cipher.SHA256 + // The genesis block uses the null hash as the SrcTransaction [FIXME hardfork] + if bh.BkSeq != 0 { + h = txn.Hash() + } + uxo := make(UxArray, len(txn.Out)) + for i := range txn.Out { + uxo[i] = UxOut{ + Head: UxHead{ + Time: bh.Time, + BkSeq: bh.BkSeq, + }, + Body: UxBody{ + SrcTransaction: h, + Address: txn.Out[i].Address, + Coins: txn.Out[i].Coins, + Hours: txn.Out[i].Hours, + }, + } + } + return uxo +} + +// CreateUnspent creates single unspent output +func CreateUnspent(bh BlockHeader, txn Transaction, outIndex int) (UxOut, error) { + if outIndex < 0 || outIndex >= len(txn.Out) { + return UxOut{}, fmt.Errorf("Transaction out index overflows transaction outputs") + } + + var h cipher.SHA256 + // The genesis block uses the null hash as the SrcTransaction [FIXME hardfork] + if bh.BkSeq != 0 { + h = txn.Hash() + } + + return UxOut{ + Head: UxHead{ + Time: bh.Time, + BkSeq: bh.BkSeq, + }, + Body: UxBody{ + SrcTransaction: h, + Address: txn.Out[outIndex].Address, + Coins: txn.Out[outIndex].Coins, + Hours: txn.Out[outIndex].Hours, + }, + }, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/coin/block_body_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/coin/block_body_skyencoder.go new file mode 100644 index 00000000..26cb15e0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/coin/block_body_skyencoder.go @@ -0,0 +1,407 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package coin + +import ( + "errors" + "math" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +// encodeSizeBlockBody computes the size of an encoded object of type BlockBody +func encodeSizeBlockBody(obj *BlockBody) uint64 { + i0 := uint64(0) + + // obj.Transactions + i0 += 4 + for _, x1 := range obj.Transactions { + i1 := uint64(0) + + // x1.Length + i1 += 4 + + // x1.Type + i1++ + + // x1.InnerHash + i1 += 32 + + // x1.Sigs + i1 += 4 + { + i2 := uint64(0) + + // x2 + i2 += 65 + + i1 += uint64(len(x1.Sigs)) * i2 + } + + // x1.In + i1 += 4 + { + i2 := uint64(0) + + // x2 + i2 += 32 + + i1 += uint64(len(x1.In)) * i2 + } + + // x1.Out + i1 += 4 + { + i2 := uint64(0) + + // x2.Address.Version + i2++ + + // x2.Address.Key + i2 += 20 + + // x2.Coins + i2 += 8 + + // x2.Hours + i2 += 8 + + i1 += uint64(len(x1.Out)) * i2 + } + + i0 += i1 + } + + return i0 +} + +// encodeBlockBody encodes an object of type BlockBody to a buffer allocated to the exact size +// required to encode the object. +func encodeBlockBody(obj *BlockBody) ([]byte, error) { + n := encodeSizeBlockBody(obj) + buf := make([]byte, n) + + if err := encodeBlockBodyToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeBlockBodyToBuffer encodes an object of type BlockBody to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeBlockBodyToBuffer(buf []byte, obj *BlockBody) error { + if uint64(len(buf)) < encodeSizeBlockBody(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Transactions maxlen check + if len(obj.Transactions) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // obj.Transactions length check + if uint64(len(obj.Transactions)) > math.MaxUint32 { + return errors.New("obj.Transactions length exceeds math.MaxUint32") + } + + // obj.Transactions length + e.Uint32(uint32(len(obj.Transactions))) + + // obj.Transactions + for _, x := range obj.Transactions { + + // x.Length + e.Uint32(x.Length) + + // x.Type + e.Uint8(x.Type) + + // x.InnerHash + e.CopyBytes(x.InnerHash[:]) + + // x.Sigs maxlen check + if len(x.Sigs) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // x.Sigs length check + if uint64(len(x.Sigs)) > math.MaxUint32 { + return errors.New("x.Sigs length exceeds math.MaxUint32") + } + + // x.Sigs length + e.Uint32(uint32(len(x.Sigs))) + + // x.Sigs + for _, x := range x.Sigs { + + // x + e.CopyBytes(x[:]) + + } + + // x.In maxlen check + if len(x.In) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // x.In length check + if uint64(len(x.In)) > math.MaxUint32 { + return errors.New("x.In length exceeds math.MaxUint32") + } + + // x.In length + e.Uint32(uint32(len(x.In))) + + // x.In + for _, x := range x.In { + + // x + e.CopyBytes(x[:]) + + } + + // x.Out maxlen check + if len(x.Out) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // x.Out length check + if uint64(len(x.Out)) > math.MaxUint32 { + return errors.New("x.Out length exceeds math.MaxUint32") + } + + // x.Out length + e.Uint32(uint32(len(x.Out))) + + // x.Out + for _, x := range x.Out { + + // x.Address.Version + e.Uint8(x.Address.Version) + + // x.Address.Key + e.CopyBytes(x.Address.Key[:]) + + // x.Coins + e.Uint64(x.Coins) + + // x.Hours + e.Uint64(x.Hours) + + } + + } + + return nil +} + +// decodeBlockBody decodes an object of type BlockBody from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeBlockBody(buf []byte, obj *BlockBody) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Transactions + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Transactions = make([]Transaction, length) + + for z1 := range obj.Transactions { + { + // obj.Transactions[z1].Length + i, err := d.Uint32() + if err != nil { + return 0, err + } + obj.Transactions[z1].Length = i + } + + { + // obj.Transactions[z1].Type + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Transactions[z1].Type = i + } + + { + // obj.Transactions[z1].InnerHash + if len(d.Buffer) < len(obj.Transactions[z1].InnerHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Transactions[z1].InnerHash[:], d.Buffer[:len(obj.Transactions[z1].InnerHash)]) + d.Buffer = d.Buffer[len(obj.Transactions[z1].InnerHash):] + } + + { + // obj.Transactions[z1].Sigs + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Transactions[z1].Sigs = make([]cipher.Sig, length) + + for z3 := range obj.Transactions[z1].Sigs { + { + // obj.Transactions[z1].Sigs[z3] + if len(d.Buffer) < len(obj.Transactions[z1].Sigs[z3]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Transactions[z1].Sigs[z3][:], d.Buffer[:len(obj.Transactions[z1].Sigs[z3])]) + d.Buffer = d.Buffer[len(obj.Transactions[z1].Sigs[z3]):] + } + + } + } + } + + { + // obj.Transactions[z1].In + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Transactions[z1].In = make([]cipher.SHA256, length) + + for z3 := range obj.Transactions[z1].In { + { + // obj.Transactions[z1].In[z3] + if len(d.Buffer) < len(obj.Transactions[z1].In[z3]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Transactions[z1].In[z3][:], d.Buffer[:len(obj.Transactions[z1].In[z3])]) + d.Buffer = d.Buffer[len(obj.Transactions[z1].In[z3]):] + } + + } + } + } + + { + // obj.Transactions[z1].Out + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Transactions[z1].Out = make([]TransactionOutput, length) + + for z3 := range obj.Transactions[z1].Out { + { + // obj.Transactions[z1].Out[z3].Address.Version + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Transactions[z1].Out[z3].Address.Version = i + } + + { + // obj.Transactions[z1].Out[z3].Address.Key + if len(d.Buffer) < len(obj.Transactions[z1].Out[z3].Address.Key) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Transactions[z1].Out[z3].Address.Key[:], d.Buffer[:len(obj.Transactions[z1].Out[z3].Address.Key)]) + d.Buffer = d.Buffer[len(obj.Transactions[z1].Out[z3].Address.Key):] + } + + { + // obj.Transactions[z1].Out[z3].Coins + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Transactions[z1].Out[z3].Coins = i + } + + { + // obj.Transactions[z1].Out[z3].Hours + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Transactions[z1].Out[z3].Hours = i + } + + } + } + } + } + } + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeBlockBodyExact decodes an object of type BlockBody from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeBlockBodyExact(buf []byte, obj *BlockBody) error { + if n, err := decodeBlockBody(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/coin/block_body_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/coin/block_body_skyencoder_test.go new file mode 100644 index 00000000..6cf1acda --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/coin/block_body_skyencoder_test.go @@ -0,0 +1,421 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package coin + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +func newEmptyBlockBodyForEncodeTest() *BlockBody { + var obj BlockBody + return &obj +} + +func newRandomBlockBodyForEncodeTest(t *testing.T, rand *mathrand.Rand) *BlockBody { + var obj BlockBody + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenBlockBodyForEncodeTest(t *testing.T, rand *mathrand.Rand) *BlockBody { + var obj BlockBody + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilBlockBodyForEncodeTest(t *testing.T, rand *mathrand.Rand) *BlockBody { + var obj BlockBody + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderBlockBody(t *testing.T, obj *BlockBody) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeBlockBody(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeBlockBody() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeBlockBody(obj) + if err != nil { + t.Fatalf("encodeBlockBody failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeBlockBody produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeBlockBody()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeBlockBodyToBuffer(data3, obj); err != nil { + t.Fatalf("encodeBlockBodyToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 BlockBody + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 BlockBody + if n, err := decodeBlockBody(data2, &obj3); err != nil { + t.Fatalf("decodeBlockBody failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeBlockBody bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeBlockBody()") + } + + // Decode, excess buffer + var obj4 BlockBody + n, err := decodeBlockBody(data3, &obj4) + if err != nil { + t.Fatalf("decodeBlockBody failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeBlockBody bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeBlockBody bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeBlockBody()") + } + + // DecodeExact + var obj5 BlockBody + if err := decodeBlockBodyExact(data2, &obj5); err != nil { + t.Fatalf("decodeBlockBody failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeBlockBody()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeBlockBody(data4, &obj3); err != nil { + t.Fatalf("decodeBlockBody failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeBlockBody bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderBlockBody(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *BlockBody + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptyBlockBodyForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomBlockBodyForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenBlockBodyForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilBlockBodyForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderBlockBody(t, tc.obj) + }) + } +} + +func decodeBlockBodyExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj BlockBody + if _, err := decodeBlockBody(buf, &obj); err == nil { + t.Fatal("decodeBlockBody: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeBlockBody: expected error %q, got %q", expectedErr, err) + } +} + +func decodeBlockBodyExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj BlockBody + if err := decodeBlockBodyExact(buf, &obj); err == nil { + t.Fatal("decodeBlockBodyExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeBlockBodyExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderBlockBodyDecodeErrors(t *testing.T, k int, tag string, obj *BlockBody) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeBlockBody(obj) + buf, err := encodeBlockBody(obj) + if err != nil { + t.Fatalf("encodeBlockBody failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeBlockBodyExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeBlockBodyExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeBlockBodyExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeBlockBodyExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeBlockBodyExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderBlockBodyDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptyBlockBodyForEncodeTest() + fullObj := newRandomBlockBodyForEncodeTest(t, rand) + testSkyencoderBlockBodyDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderBlockBodyDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/coin/block_header_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/coin/block_header_skyencoder.go new file mode 100644 index 00000000..f91f5275 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/coin/block_header_skyencoder.go @@ -0,0 +1,168 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package coin + +import "github.com/SkycoinProject/skycoin/src/cipher/encoder" + +// encodeSizeBlockHeader computes the size of an encoded object of type BlockHeader +func encodeSizeBlockHeader(obj *BlockHeader) uint64 { + i0 := uint64(0) + + // obj.Version + i0 += 4 + + // obj.Time + i0 += 8 + + // obj.BkSeq + i0 += 8 + + // obj.Fee + i0 += 8 + + // obj.PrevHash + i0 += 32 + + // obj.BodyHash + i0 += 32 + + // obj.UxHash + i0 += 32 + + return i0 +} + +// encodeBlockHeader encodes an object of type BlockHeader to a buffer allocated to the exact size +// required to encode the object. +func encodeBlockHeader(obj *BlockHeader) ([]byte, error) { + n := encodeSizeBlockHeader(obj) + buf := make([]byte, n) + + if err := encodeBlockHeaderToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeBlockHeaderToBuffer encodes an object of type BlockHeader to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeBlockHeaderToBuffer(buf []byte, obj *BlockHeader) error { + if uint64(len(buf)) < encodeSizeBlockHeader(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Version + e.Uint32(obj.Version) + + // obj.Time + e.Uint64(obj.Time) + + // obj.BkSeq + e.Uint64(obj.BkSeq) + + // obj.Fee + e.Uint64(obj.Fee) + + // obj.PrevHash + e.CopyBytes(obj.PrevHash[:]) + + // obj.BodyHash + e.CopyBytes(obj.BodyHash[:]) + + // obj.UxHash + e.CopyBytes(obj.UxHash[:]) + + return nil +} + +// decodeBlockHeader decodes an object of type BlockHeader from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeBlockHeader(buf []byte, obj *BlockHeader) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Version + i, err := d.Uint32() + if err != nil { + return 0, err + } + obj.Version = i + } + + { + // obj.Time + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Time = i + } + + { + // obj.BkSeq + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.BkSeq = i + } + + { + // obj.Fee + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Fee = i + } + + { + // obj.PrevHash + if len(d.Buffer) < len(obj.PrevHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.PrevHash[:], d.Buffer[:len(obj.PrevHash)]) + d.Buffer = d.Buffer[len(obj.PrevHash):] + } + + { + // obj.BodyHash + if len(d.Buffer) < len(obj.BodyHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.BodyHash[:], d.Buffer[:len(obj.BodyHash)]) + d.Buffer = d.Buffer[len(obj.BodyHash):] + } + + { + // obj.UxHash + if len(d.Buffer) < len(obj.UxHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.UxHash[:], d.Buffer[:len(obj.UxHash)]) + d.Buffer = d.Buffer[len(obj.UxHash):] + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeBlockHeaderExact decodes an object of type BlockHeader from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeBlockHeaderExact(buf []byte, obj *BlockHeader) error { + if n, err := decodeBlockHeader(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/coin/block_header_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/coin/block_header_skyencoder_test.go new file mode 100644 index 00000000..784c38f4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/coin/block_header_skyencoder_test.go @@ -0,0 +1,421 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package coin + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +func newEmptyBlockHeaderForEncodeTest() *BlockHeader { + var obj BlockHeader + return &obj +} + +func newRandomBlockHeaderForEncodeTest(t *testing.T, rand *mathrand.Rand) *BlockHeader { + var obj BlockHeader + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenBlockHeaderForEncodeTest(t *testing.T, rand *mathrand.Rand) *BlockHeader { + var obj BlockHeader + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilBlockHeaderForEncodeTest(t *testing.T, rand *mathrand.Rand) *BlockHeader { + var obj BlockHeader + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderBlockHeader(t *testing.T, obj *BlockHeader) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeBlockHeader(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeBlockHeader() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeBlockHeader(obj) + if err != nil { + t.Fatalf("encodeBlockHeader failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeBlockHeader produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeBlockHeader()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeBlockHeaderToBuffer(data3, obj); err != nil { + t.Fatalf("encodeBlockHeaderToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 BlockHeader + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 BlockHeader + if n, err := decodeBlockHeader(data2, &obj3); err != nil { + t.Fatalf("decodeBlockHeader failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeBlockHeader bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeBlockHeader()") + } + + // Decode, excess buffer + var obj4 BlockHeader + n, err := decodeBlockHeader(data3, &obj4) + if err != nil { + t.Fatalf("decodeBlockHeader failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeBlockHeader bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeBlockHeader bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeBlockHeader()") + } + + // DecodeExact + var obj5 BlockHeader + if err := decodeBlockHeaderExact(data2, &obj5); err != nil { + t.Fatalf("decodeBlockHeader failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeBlockHeader()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeBlockHeader(data4, &obj3); err != nil { + t.Fatalf("decodeBlockHeader failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeBlockHeader bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderBlockHeader(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *BlockHeader + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptyBlockHeaderForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomBlockHeaderForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenBlockHeaderForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilBlockHeaderForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderBlockHeader(t, tc.obj) + }) + } +} + +func decodeBlockHeaderExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj BlockHeader + if _, err := decodeBlockHeader(buf, &obj); err == nil { + t.Fatal("decodeBlockHeader: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeBlockHeader: expected error %q, got %q", expectedErr, err) + } +} + +func decodeBlockHeaderExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj BlockHeader + if err := decodeBlockHeaderExact(buf, &obj); err == nil { + t.Fatal("decodeBlockHeaderExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeBlockHeaderExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderBlockHeaderDecodeErrors(t *testing.T, k int, tag string, obj *BlockHeader) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeBlockHeader(obj) + buf, err := encodeBlockHeader(obj) + if err != nil { + t.Fatalf("encodeBlockHeader failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeBlockHeaderExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeBlockHeaderExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeBlockHeaderExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeBlockHeaderExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeBlockHeaderExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderBlockHeaderDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptyBlockHeaderForEncodeTest() + fullObj := newRandomBlockHeaderForEncodeTest(t, rand) + testSkyencoderBlockHeaderDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderBlockHeaderDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/coin/block_test.go b/vendor/github.com/SkycoinProject/skycoin/src/coin/block_test.go new file mode 100644 index 00000000..d32879ee --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/coin/block_test.go @@ -0,0 +1,204 @@ +package coin + +import ( + "errors" + "fmt" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/testutil" +) + +var ( + genPublic, genSecret = cipher.GenerateKeyPair() + genAddress = cipher.AddressFromPubKey(genPublic) + _genTime uint64 = 1000 + _genCoins uint64 = 1000e6 + _genCoinHours uint64 = 1000 * 1000 +) + +func tNow() uint64 { + return uint64(time.Now().UTC().Unix()) +} + +func feeCalc(t *Transaction) (uint64, error) { + return 0, nil +} + +func badFeeCalc(t *Transaction) (uint64, error) { + return 0, errors.New("Bad") +} + +func makeNewBlock(t *testing.T, uxHash cipher.SHA256) *Block { + body := BlockBody{ + Transactions: Transactions{Transaction{}}, + } + + prev := Block{ + Body: body, + Head: BlockHeader{ + Version: 0x02, + Time: 100, + BkSeq: 0, + Fee: 10, + PrevHash: cipher.SHA256{}, + BodyHash: body.Hash(), + }} + b, err := NewBlock(prev, 100+20, uxHash, Transactions{Transaction{}}, feeCalc) + require.NoError(t, err) + return b +} + +func addTransactionToBlock(t *testing.T, b *Block) Transaction { + txn := makeTransaction(t) + b.Body.Transactions = append(b.Body.Transactions, txn) + return txn +} + +func TestNewBlock(t *testing.T) { + // TODO -- update this test for newBlock changes + prev := Block{Head: BlockHeader{Version: 0x02, Time: 100, BkSeq: 98}} + uxHash := testutil.RandSHA256(t) + txns := Transactions{Transaction{}} + // invalid txn fees panics + _, err := NewBlock(prev, 133, uxHash, txns, badFeeCalc) + require.EqualError(t, err, fmt.Sprintf("Invalid transaction fees: Bad")) + + // no txns panics + _, err = NewBlock(prev, 133, uxHash, nil, feeCalc) + require.EqualError(t, err, "Refusing to create block with no transactions") + + _, err = NewBlock(prev, 133, uxHash, Transactions{}, feeCalc) + require.EqualError(t, err, "Refusing to create block with no transactions") + + // valid block is fine + fee := uint64(121) + currentTime := uint64(133) + b, err := NewBlock(prev, currentTime, uxHash, txns, func(t *Transaction) (uint64, error) { + return fee, nil + }) + require.NoError(t, err) + require.Equal(t, b.Body.Transactions, txns) + require.Equal(t, b.Head.Fee, fee*uint64(len(txns))) + require.Equal(t, b.Body, BlockBody{Transactions: txns}) + require.Equal(t, b.Head.PrevHash, prev.HashHeader()) + require.Equal(t, b.Head.Time, currentTime) + require.Equal(t, b.Head.BkSeq, prev.Head.BkSeq+1) + require.Equal(t, b.Head.UxHash, uxHash) +} + +func TestBlockHashHeader(t *testing.T) { + uxHash := testutil.RandSHA256(t) + b := makeNewBlock(t, uxHash) + require.Equal(t, b.HashHeader(), b.Head.Hash()) + require.NotEqual(t, b.HashHeader(), cipher.SHA256{}) +} + +func TestBlockBodyHash(t *testing.T) { + uxHash := testutil.RandSHA256(t) + b := makeNewBlock(t, uxHash) + hb := b.Body.Hash() + hashes := b.Body.Transactions.Hashes() + txn := addTransactionToBlock(t, b) + require.NotEqual(t, hb, b.Body.Hash()) + hashes = append(hashes, txn.Hash()) + require.Equal(t, b.Body.Hash(), cipher.Merkle(hashes)) +} + +func TestNewGenesisBlock(t *testing.T) { + gb, err := NewGenesisBlock(genAddress, _genCoins, _genTime) + require.NoError(t, err) + + require.Equal(t, cipher.SHA256{}, gb.Head.PrevHash) + require.Equal(t, _genTime, gb.Head.Time) + require.Equal(t, uint64(0), gb.Head.BkSeq) + require.Equal(t, uint32(0), gb.Head.Version) + require.Equal(t, uint64(0), gb.Head.Fee) + require.Equal(t, cipher.SHA256{}, gb.Head.UxHash) + + require.Equal(t, 1, len(gb.Body.Transactions)) + txn := gb.Body.Transactions[0] + require.Len(t, txn.In, 0) + require.Len(t, txn.Sigs, 0) + require.Len(t, txn.Out, 1) + + require.Equal(t, genAddress, txn.Out[0].Address) + require.Equal(t, _genCoins, txn.Out[0].Coins) + require.Equal(t, _genCoins, txn.Out[0].Hours) +} + +func TestCreateUnspent(t *testing.T) { + txn := Transaction{} + err := txn.PushOutput(genAddress, 11e6, 255) + require.NoError(t, err) + bh := BlockHeader{ + Time: tNow(), + BkSeq: uint64(1), + } + + tt := []struct { + name string + txIndex int + err error + }{ + { + "ok", + 0, + nil, + }, + { + "index overflow", + 10, + errors.New("Transaction out index overflows transaction outputs"), + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + uxout, err := CreateUnspent(bh, txn, tc.txIndex) + require.Equal(t, tc.err, err) + if err != nil { + return + } + requireUnspent(t, bh, txn, tc.txIndex, uxout) + }) + } +} + +func TestCreateUnspents(t *testing.T) { + txn := Transaction{} + err := txn.PushOutput(genAddress, 11e6, 255) + require.NoError(t, err) + bh := BlockHeader{ + Time: tNow(), + BkSeq: uint64(1), + } + uxouts := CreateUnspents(bh, txn) + require.Equal(t, len(uxouts), 1) + requireValidUnspents(t, bh, txn, uxouts) +} + +func requireUnspent(t *testing.T, bh BlockHeader, txn Transaction, txIndex int, ux UxOut) { + require.Equal(t, bh.Time, ux.Head.Time) + require.Equal(t, bh.BkSeq, ux.Head.BkSeq) + require.Equal(t, txn.Hash(), ux.Body.SrcTransaction) + require.Equal(t, txn.Out[txIndex].Address, ux.Body.Address) + require.Equal(t, txn.Out[txIndex].Coins, ux.Body.Coins) + require.Equal(t, txn.Out[txIndex].Hours, ux.Body.Hours) +} + +func requireValidUnspents(t *testing.T, bh BlockHeader, txn Transaction, + uxo UxArray) { + require.Equal(t, len(txn.Out), len(uxo)) + for i, ux := range uxo { + require.Equal(t, bh.Time, ux.Head.Time) + require.Equal(t, bh.BkSeq, ux.Head.BkSeq) + require.Equal(t, txn.Hash(), ux.Body.SrcTransaction) + require.Equal(t, txn.Out[i].Address, ux.Body.Address) + require.Equal(t, txn.Out[i].Coins, ux.Body.Coins) + require.Equal(t, txn.Out[i].Hours, ux.Body.Hours) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/coin/outputs.go b/vendor/github.com/SkycoinProject/skycoin/src/coin/outputs.go new file mode 100644 index 00000000..457e5eb2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/coin/outputs.go @@ -0,0 +1,327 @@ +package coin + +import ( + "bytes" + "errors" + "fmt" + "log" + "sort" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/util/mathutil" +) + +/* + Unspent Outputs +*/ + +/* +- hash must only depend on factors known to sender +-- hash cannot depend on block executed +-- hash cannot depend on sequence number +-- hash may depend on nonce + +- hash must depend only on factors known to sender +-- needed to minimize divergence during block chain forks +- it should be difficult to create outputs with duplicate ids + +- Uxhash cannot depend on time or block it was created +- time is still needed for +*/ + +/* + For each transaction, keep track of + - order created + - order spent (for rollbacks) +*/ + +//go:generate skyencoder -struct UxHead -unexported +//go:generate skyencoder -struct UxBody -unexported + +// UxOut represents uxout +type UxOut struct { + Head UxHead + Body UxBody //hashed part + //Meta UxMeta +} + +// UxHead metadata (not hashed) +type UxHead struct { + Time uint64 //time of block it was created in + BkSeq uint64 //block it was created in, used to calculate depth + // SpSeq uint64 //block it was spent in +} + +// UxBody uxbody +type UxBody struct { + SrcTransaction cipher.SHA256 // Inner Hash of Transaction + Address cipher.Address // Address of receiver + Coins uint64 // Number of coins + Hours uint64 // Coin hours +} + +// Hash returns the hash of UxBody +func (uo *UxOut) Hash() cipher.SHA256 { + return uo.Body.Hash() +} + +// SnapshotHash returns hash of UxBody + UxHead +func (uo *UxOut) SnapshotHash() cipher.SHA256 { + n1 := encodeSizeUxBody(&uo.Body) + n2 := encodeSizeUxHead(&uo.Head) + buf := make([]byte, n1+n2) + + if err := encodeUxBodyToBuffer(buf[:n1], &uo.Body); err != nil { + log.Panicf("encodeUxBodyToBuffer failed: %v", err) + } + if err := encodeUxHeadToBuffer(buf[n1:], &uo.Head); err != nil { + log.Panicf("encodeUxHeadToBuffer failed: %v", err) + } + + return cipher.SumSHA256(buf) +} + +// Hash returns hash of uxbody +func (ub *UxBody) Hash() cipher.SHA256 { + buf, err := encodeUxBody(ub) + if err != nil { + log.Panicf("encodeUxBody failed: %v", err) + } + return cipher.SumSHA256(buf) +} + +/* + Make independent of block rate? + Then need creation time of output + Creation time of transaction cant be hashed +*/ + +// ErrAddEarnedCoinHoursAdditionOverflow is returned by UxOut.CoinHours() if during the addition of base coin +// hours to additional earned coin hours, the value would overflow a uint64. +// Callers may choose to ignore this errors and use 0 as the coinhours value instead. +// This affects one existing spent output, spent in block 13277. +var ErrAddEarnedCoinHoursAdditionOverflow = errors.New("UxOut.CoinHours addition of earned coin hours overflow") + +// CoinHours Calculate coinhour balance of output. t is the current unix utc time. +func (uo *UxOut) CoinHours(t uint64) (uint64, error) { + if t < uo.Head.Time { + log.Printf("Calculating coin hours with t < head time") + return uo.Body.Hours, nil + } + + seconds := t - uo.Head.Time // number of seconds + + // Calculate whole coin seconds + wholeCoins := uo.Body.Coins / 1e6 + wholeCoinSeconds, err := mathutil.MultUint64(seconds, wholeCoins) + if err != nil { + err := fmt.Errorf("UxOut.CoinHours: Calculating whole coin seconds overflows uint64 seconds=%d coins=%d uxid=%s", seconds, wholeCoins, uo.Hash().Hex()) + log.Printf("%v", err) + return 0, err + } + + // Calculate remainder droplet seconds + remainderDroplets := uo.Body.Coins % 1e6 + dropletSeconds, err := mathutil.MultUint64(seconds, remainderDroplets) + if err != nil { + err := fmt.Errorf("UxOut.CoinHours: Calculating droplet seconds overflows uint64 seconds=%d droplets=%d uxid=%s", seconds, remainderDroplets, uo.Hash().Hex()) + log.Printf("%v", err) + return 0, err + } + + // Add coinSeconds and seconds earned by droplets, rounded off + coinSeconds := wholeCoinSeconds + dropletSeconds/1e6 + + coinHours := coinSeconds / 3600 // coin hours + totalHours, err := mathutil.AddUint64(uo.Body.Hours, coinHours) // starting+earned + if err != nil { + log.Printf("%v uxid=%s", ErrAddEarnedCoinHoursAdditionOverflow, uo.Hash().Hex()) + return 0, ErrAddEarnedCoinHoursAdditionOverflow + } + return totalHours, nil +} + +// UxHashSet set mapping from UxHash to a placeholder value +type UxHashSet map[cipher.SHA256]struct{} + +// UxArray Array of Outputs +// Used by unspent output pool, spent tests +type UxArray []UxOut + +// Hashes returns Array of hashes for the Ux in the UxArray +func (ua UxArray) Hashes() []cipher.SHA256 { + hashes := make([]cipher.SHA256, len(ua)) + for i, ux := range ua { + hashes[i] = ux.Hash() + } + return hashes +} + +// HasDupes checks the UxArray for outputs which have the same hash +func (ua UxArray) HasDupes() bool { + m := make(UxHashSet, len(ua)) + for i := range ua { + h := ua[i].Hash() + if _, ok := m[h]; ok { + return true + } + m[h] = struct{}{} + } + return false +} + +// Set returns the UxArray as a hash to struct{} map to be used as a set. +// Should only be used for membership detection +func (ua UxArray) Set() UxHashSet { + m := make(UxHashSet, len(ua)) + for i := range ua { + m[ua[i].Hash()] = struct{}{} + } + return m +} + +// Sort sorts UxArray +func (ua UxArray) Sort() { + sort.Sort(ua) +} + +// Len returns length of UxArray +func (ua UxArray) Len() int { + return len(ua) +} + +// Less checks if UxArray[i] < UxArray[j] +func (ua UxArray) Less(i, j int) bool { + hash1 := ua[i].Hash() + hash2 := ua[j].Hash() + return bytes.Compare(hash1[:], hash2[:]) < 0 +} + +// Swap swaps value of UxArray[i] and UxArray[j] +func (ua UxArray) Swap(i, j int) { + ua[i], ua[j] = ua[j], ua[i] +} + +// Coins returns the total coins +func (ua UxArray) Coins() (uint64, error) { + var coins uint64 + for _, ux := range ua { + var err error + coins, err = mathutil.AddUint64(coins, ux.Body.Coins) + if err != nil { + return 0, errors.New("UxArray.Coins addition overflow") + } + } + + return coins, nil +} + +// CoinHours returns the total coin hours +func (ua UxArray) CoinHours(headTime uint64) (uint64, error) { + var hours uint64 + for _, ux := range ua { + uxHours, err := ux.CoinHours(headTime) + if err != nil { + return 0, err + } + + hours, err = mathutil.AddUint64(hours, uxHours) + if err != nil { + return 0, errors.New("UxArray.CoinHours addition overflow") + } + } + return hours, nil +} + +// AddressUxOuts maps address with uxarray +type AddressUxOuts map[cipher.Address]UxArray + +// NewAddressUxOuts creates address uxouts map +func NewAddressUxOuts(uxs UxArray) AddressUxOuts { + uxo := make(AddressUxOuts) + for _, ux := range uxs { + uxo[ux.Body.Address] = append(uxo[ux.Body.Address], ux) + } + return uxo +} + +// Keys returns the Address keys +func (auo AddressUxOuts) Keys() []cipher.Address { + addrs := make([]cipher.Address, len(auo)) + i := 0 + for k := range auo { + addrs[i] = k + i++ + } + return addrs +} + +// Flatten converts an AddressUxOuts map to a UxArray +func (auo AddressUxOuts) Flatten() UxArray { + oxs := make(UxArray, 0, len(auo)) + for _, uxs := range auo { + for i := range uxs { + oxs = append(oxs, uxs[i]) + } + } + return oxs +} + +// Sub returns a new set of unspents, with unspents found in other removed. +// No address's unspent set will be empty +// Depreciate this: only visor uses it +func (auo AddressUxOuts) Sub(other AddressUxOuts) AddressUxOuts { + ox := make(AddressUxOuts, len(auo)) + for a, uxs := range auo { + if suxs, ok := other[a]; ok { + ouxs := uxs.Sub(suxs) + if len(ouxs) > 0 { + ox[a] = ouxs + } + } else { + ox[a] = uxs + } + } + return ox +} + +// Add returns a new unspents, with merged unspents +func (auo AddressUxOuts) Add(other AddressUxOuts) AddressUxOuts { + ox := make(AddressUxOuts, len(auo)) + for a, o := range auo { + ox[a] = o + } + + for a, uxs := range other { + if suxs, ok := ox[a]; ok { + ox[a] = suxs.Add(uxs) + } else { + ox[a] = uxs + } + } + return ox +} + +// Sub returns a new UxArray with elements in other removed from self +// Deprecate +func (ua UxArray) Sub(other UxArray) UxArray { + uxa := make(UxArray, 0) + m := other.Set() + for i := range ua { + if _, ok := m[ua[i].Hash()]; !ok { + uxa = append(uxa, ua[i]) + } + } + return uxa +} + +// Add returns a new UxArray with merged elements +func (ua UxArray) Add(other UxArray) UxArray { + m := ua.Set() + for i := range other { + if _, ok := m[other[i].Hash()]; !ok { + ua = append(ua, other[i]) + } + } + return ua +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/coin/outputs_test.go b/vendor/github.com/SkycoinProject/skycoin/src/coin/outputs_test.go new file mode 100644 index 00000000..b1485c5e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/coin/outputs_test.go @@ -0,0 +1,577 @@ +package coin + +import ( + "bytes" + "errors" + "math" + "sort" + "strings" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/testutil" +) + +func makeUxBody(t *testing.T) UxBody { + body, _ := makeUxBodyWithSecret(t) + return body +} + +func makeUxOut(t *testing.T) UxOut { + ux, _ := makeUxOutWithSecret(t) + return ux +} + +func makeUxBodyWithSecret(t *testing.T) (UxBody, cipher.SecKey) { + p, s := cipher.GenerateKeyPair() + return UxBody{ + SrcTransaction: testutil.RandSHA256(t), + Address: cipher.AddressFromPubKey(p), + Coins: 1e6, + Hours: 100, + }, s +} + +func makeUxOutWithSecret(t *testing.T) (UxOut, cipher.SecKey) { + body, sec := makeUxBodyWithSecret(t) + return UxOut{ + Head: UxHead{ + Time: 100, + BkSeq: 2, + }, + Body: body, + }, sec +} + +func TestUxBodyHash(t *testing.T) { + uxb := makeUxBody(t) + h := uxb.Hash() + assert.NotEqual(t, h, cipher.SHA256{}) +} + +func TestUxOutHash(t *testing.T) { + uxb := makeUxBody(t) + uxo := UxOut{Body: uxb} + assert.Equal(t, uxb.Hash(), uxo.Hash()) + // Head should not affect hash + uxo.Head = UxHead{0, 1} + assert.Equal(t, uxb.Hash(), uxo.Hash()) +} + +func TestUxOutSnapshotHash(t *testing.T) { + ux := makeUxOut(t) + h := ux.SnapshotHash() + // snapshot hash should be dependent on every field in body and head + ux2 := ux + ux2.Head.Time = 20 + assert.NotEqual(t, ux2.SnapshotHash(), h) + ux2 = ux + ux2.Head.BkSeq = 4 + assert.NotEqual(t, ux2.SnapshotHash(), h) + ux2 = ux + ux2.Body.SrcTransaction = testutil.RandSHA256(t) + assert.NotEqual(t, ux2.SnapshotHash(), h) + ux2 = ux + ux2.Body.Address = makeAddress() + assert.NotEqual(t, ux2.SnapshotHash(), h) + ux2 = ux + ux2.Body.Coins = ux.Body.Coins * 2 + assert.NotEqual(t, ux2.SnapshotHash(), h) + ux2 = ux + ux2.Body.Hours = ux.Body.Hours * 2 + assert.NotEqual(t, ux2.SnapshotHash(), h) +} + +func TestUxOutCoinHours(t *testing.T) { + uxo := makeUxOut(t) + + // Less than 1 hour passed + now := uint64(100) + uxo.Head.Time + hours, err := uxo.CoinHours(now) + require.NoError(t, err) + require.Equal(t, hours, uxo.Body.Hours) + + // 1 hours passed + now = uint64(3600) + uxo.Head.Time + hours, err = uxo.CoinHours(now) + require.NoError(t, err) + require.Equal(t, hours, uxo.Body.Hours+(uxo.Body.Coins/1e6)) + + // 6 hours passed + now = uint64(3600*6) + uxo.Head.Time + hours, err = uxo.CoinHours(now) + require.NoError(t, err) + require.Equal(t, hours, uxo.Body.Hours+(uxo.Body.Coins/1e6)*6) + + // Time is backwards (treated as no hours passed) + now = uxo.Head.Time / 2 + hours, err = uxo.CoinHours(now) + require.NoError(t, err) + require.Equal(t, hours, uxo.Body.Hours) + + // 1 hour has passed, output has 1.5 coins, should gain 1 coinhour + uxo.Body.Coins = 1e6 + 5e5 + now = uint64(3600) + uxo.Head.Time + hours, err = uxo.CoinHours(now) + require.NoError(t, err) + require.Equal(t, uxo.Body.Hours+1, hours) + + // 2 hours have passed, output has 1.5 coins, should gain 3 coin hours + uxo.Body.Coins = 1e6 + 5e5 + now = uint64(3600*2) + uxo.Head.Time + hours, err = uxo.CoinHours(now) + require.NoError(t, err) + require.Equal(t, uxo.Body.Hours+3, hours, "%d != %d", uxo.Body.Hours+3, hours) + + // 1 second has passed, output has 3600 coins, should gain 1 coin hour + uxo.Body.Coins = 3600e6 + now = uint64(1) + uxo.Head.Time + hours, err = uxo.CoinHours(now) + require.NoError(t, err) + require.Equal(t, uxo.Body.Hours+1, hours) + + // 1000000 hours minus 1 second have passed, output has 1 droplet, should gain 0 coin hour + uxo.Body.Coins = 1 + now = uint64(1000000*3600-1) + uxo.Head.Time + hours, err = uxo.CoinHours(now) + require.NoError(t, err) + require.Equal(t, uxo.Body.Hours, hours) + + // 1000000 hours have passed, output has 1 droplet, should gain 1 coin hour + uxo.Body.Coins = 1 + now = uint64(1000000*3600) + uxo.Head.Time + hours, err = uxo.CoinHours(now) + require.NoError(t, err) + require.Equal(t, uxo.Body.Hours+1, hours) + + // 1000000 hours plus 1 second have passed, output has 1 droplet, should gain 1 coin hour + uxo.Body.Coins = 1 + now = uint64(1000000*3600+1) + uxo.Head.Time + hours, err = uxo.CoinHours(now) + require.NoError(t, err) + require.Equal(t, uxo.Body.Hours+1, hours) + + // No hours passed, using initial coin hours + uxo.Body.Coins = _genCoins + uxo.Body.Hours = _genCoinHours + hours, err = uxo.CoinHours(uxo.Head.Time) + require.NoError(t, err) + require.Equal(t, hours, uxo.Body.Hours) + + // One hour passed, using initial coin hours + hours, err = uxo.CoinHours(uxo.Head.Time + 3600) + require.NoError(t, err) + require.Equal(t, hours, uxo.Body.Hours+(_genCoins/1e6)) + + // No hours passed and no hours to begin with + uxo.Body.Hours = 0 + hours, err = uxo.CoinHours(uxo.Head.Time) + require.NoError(t, err) + require.Equal(t, hours, uint64(0)) + + // Centuries have passed, time-based calculation overflows uint64 + // when calculating the whole coin seconds + uxo.Body.Coins = 2e6 + _, err = uxo.CoinHours(math.MaxUint64) + require.Error(t, err) + require.True(t, strings.HasPrefix(err.Error(), "UxOut.CoinHours: Calculating whole coin seconds overflows uint64 seconds=18446744073709551515 coins=2 uxid=")) + + // Centuries have passed, time-based calculation overflows uint64 + // when calculating the droplet seconds + uxo.Body.Coins = 1e6 + 1e5 + _, err = uxo.CoinHours(math.MaxUint64) + require.Error(t, err) + require.True(t, strings.HasPrefix(err.Error(), "UxOut.CoinHours: Calculating droplet seconds overflows uint64 seconds=18446744073709551515 droplets=100000 uxid=")) + + // Output would overflow if given more hours, has reached its limit + uxo.Body.Coins = 3600e6 + uxo.Body.Hours = math.MaxUint64 - 1 + _, err = uxo.CoinHours(uxo.Head.Time + 1000) + testutil.RequireError(t, err, ErrAddEarnedCoinHoursAdditionOverflow.Error()) +} + +func makeUxArray(t *testing.T, n int) UxArray { + uxa := make(UxArray, n) + for i := 0; i < len(uxa); i++ { + uxa[i] = makeUxOut(t) + } + return uxa +} + +func TestUxArrayCoins(t *testing.T) { + uxa := makeUxArray(t, 4) + + n, err := uxa.Coins() + require.NoError(t, err) + require.Equal(t, uint64(4e6), n) + + uxa[2].Body.Coins = math.MaxUint64 - 1e6 + _, err = uxa.Coins() + require.Equal(t, err, errors.New("UxArray.Coins addition overflow")) +} + +func TestUxArrayCoinHours(t *testing.T) { + uxa := makeUxArray(t, 4) + + n, err := uxa.CoinHours(uxa[0].Head.Time) + require.NoError(t, err) + require.Equal(t, uint64(400), n) + + // 1 hour later + n, err = uxa.CoinHours(uxa[0].Head.Time + 3600) + require.NoError(t, err) + require.Equal(t, uint64(404), n) + + // 1.5 hours later + n, err = uxa.CoinHours(uxa[0].Head.Time + 3600 + 1800) + require.NoError(t, err) + require.Equal(t, uint64(404), n) + + // 2 hours later + n, err = uxa.CoinHours(uxa[0].Head.Time + 3600 + 4600) + require.NoError(t, err) + require.Equal(t, uint64(408), n) + + uxa[2].Body.Hours = math.MaxUint64 - 100 + _, err = uxa.CoinHours(uxa[0].Head.Time) + require.Equal(t, errors.New("UxArray.CoinHours addition overflow"), err) + + _, err = uxa.CoinHours(uxa[0].Head.Time * 1000000000000) + require.Equal(t, ErrAddEarnedCoinHoursAdditionOverflow, err) +} + +func TestUxArrayHashArray(t *testing.T) { + uxa := makeUxArray(t, 4) + hashes := uxa.Hashes() + assert.Equal(t, len(hashes), len(uxa)) + for i, h := range hashes { + assert.Equal(t, h, uxa[i].Hash()) + } +} + +func TestUxArrayHasDupes(t *testing.T) { + uxa := makeUxArray(t, 4) + assert.False(t, uxa.HasDupes()) + uxa[0] = uxa[1] + assert.True(t, uxa.HasDupes()) +} + +func TestUxArrayRemoveDupes(t *testing.T) { + uxa := makeUxArray(t, 4) + assert.False(t, uxa.HasDupes()) + assert.Equal(t, uxa, uxa.removeDupes()) + uxa[0] = uxa[1] + assert.True(t, uxa.HasDupes()) + uxb := uxa.removeDupes() + assert.False(t, uxb.HasDupes()) + assert.Equal(t, len(uxb), 3) + assert.Equal(t, uxb[0], uxa[0]) + assert.Equal(t, uxb[1], uxa[2]) + assert.Equal(t, uxb[2], uxa[3]) +} + +func TestUxArraySub(t *testing.T) { + uxa := makeUxArray(t, 4) + uxb := makeUxArray(t, 4) + uxc := append(uxa[:1], uxb...) + uxc = append(uxc, uxa[1:2]...) + + uxd := uxc.Sub(uxa) + assert.Equal(t, uxd, uxb) + + uxd = uxc.Sub(uxb) + assert.Equal(t, len(uxd), 2) + assert.Equal(t, uxd, uxa[:2]) + + // No intersection + uxd = uxa.Sub(uxb) + assert.Equal(t, uxa, uxd) + uxd = uxb.Sub(uxa) + assert.Equal(t, uxd, uxb) +} + +func manualUxArrayIsSorted(uxa UxArray) bool { + isSorted := true + for i := 0; i < len(uxa)-1; i++ { + hi := uxa[i].Hash() + hj := uxa[i+1].Hash() + if bytes.Compare(hi[:], hj[:]) > 0 { + isSorted = false + } + } + return isSorted +} + +func TestUxArraySorting(t *testing.T) { + uxa := make(UxArray, 4) + for i := 0; i < len(uxa); i++ { + uxa[i] = makeUxOut(t) + } + isSorted := manualUxArrayIsSorted(uxa) + assert.Equal(t, sort.IsSorted(uxa), isSorted) + // Make sure uxa is not sorted + if isSorted { + uxa[0], uxa[1] = uxa[1], uxa[0] + } + assert.False(t, manualUxArrayIsSorted(uxa)) + assert.False(t, sort.IsSorted(uxa)) + uxb := make(UxArray, 4) + for i, ux := range uxa { + uxb[i] = ux + } + sort.Sort(uxa) + assert.True(t, sort.IsSorted(uxa)) + assert.True(t, manualUxArrayIsSorted(uxa)) + assert.False(t, sort.IsSorted(uxb)) + uxb.Sort() + assert.Equal(t, uxa, uxb) + assert.True(t, sort.IsSorted(uxb)) + assert.True(t, manualUxArrayIsSorted(uxb)) +} + +func TestUxArrayLen(t *testing.T) { + uxa := make(UxArray, 4) + assert.Equal(t, len(uxa), uxa.Len()) + assert.Equal(t, 4, uxa.Len()) +} + +func TestUxArrayLess(t *testing.T) { + uxa := make(UxArray, 2) + uxa[0] = makeUxOut(t) + uxa[1] = makeUxOut(t) + h := make([]cipher.SHA256, 2) + h[0] = uxa[0].Hash() + h[1] = uxa[1].Hash() + assert.Equal(t, uxa.Less(0, 1), bytes.Compare(h[0][:], h[1][:]) < 0) + assert.Equal(t, uxa.Less(1, 0), bytes.Compare(h[0][:], h[1][:]) > 0) +} + +func TestUxArraySwap(t *testing.T) { + uxa := make(UxArray, 2) + uxx := makeUxOut(t) + uxy := makeUxOut(t) + uxa[0] = uxx + uxa[1] = uxy + uxa.Swap(0, 1) + assert.Equal(t, uxa[0], uxy) + assert.Equal(t, uxa[1], uxx) + uxa.Swap(0, 1) + assert.Equal(t, uxa[0], uxx) + assert.Equal(t, uxa[1], uxy) + uxa.Swap(1, 0) + assert.Equal(t, uxa[1], uxx) + assert.Equal(t, uxa[0], uxy) +} + +func TestAddressUxOutsKeys(t *testing.T) { + unspents := make(AddressUxOuts) + ux := makeUxOut(t) + ux2 := makeUxOut(t) + ux3 := makeUxOut(t) + unspents[ux.Body.Address] = UxArray{ux} + unspents[ux2.Body.Address] = UxArray{ux2} + unspents[ux3.Body.Address] = UxArray{ux3} + keys := unspents.Keys() + assert.Equal(t, len(keys), 3) + dupes := make(map[cipher.Address]byte, 3) + for _, k := range keys { + dupes[k] = byte(1) + assert.True(t, k == ux.Body.Address || k == ux2.Body.Address || k == ux3.Body.Address) + } + assert.Equal(t, len(keys), len(dupes)) +} + +func TestAddressUxOutsMerge(t *testing.T) { + unspents := make(AddressUxOuts) + unspents2 := make(AddressUxOuts) + ux := makeUxOut(t) + ux2 := makeUxOut(t) + ux3 := makeUxOut(t) + ux4 := makeUxOut(t) + ux3.Body.Address = ux.Body.Address + + unspents[ux.Body.Address] = UxArray{ux} + unspents[ux2.Body.Address] = UxArray{ux2} + unspents2[ux3.Body.Address] = UxArray{ux3} + unspents2[ux4.Body.Address] = UxArray{ux4} + + // Valid merge + keys := []cipher.Address{ux.Body.Address, ux2.Body.Address, ux4.Body.Address} + merged := unspents.Merge(unspents2, keys) + assert.Equal(t, len(unspents), 2) + assert.Equal(t, len(unspents2), 2) + assert.Equal(t, len(merged), 3) + assert.Equal(t, merged[ux.Body.Address], UxArray{ux, ux3}) + assert.Equal(t, merged[ux2.Body.Address], UxArray{ux2}) + assert.Equal(t, merged[ux4.Body.Address], UxArray{ux4}) + + // Duplicates should not be merged + unspents[ux4.Body.Address] = UxArray{ux4} + unspents[ux.Body.Address] = UxArray{ux, ux3} + merged = unspents.Merge(unspents2, keys) + assert.Equal(t, len(merged), 3) + assert.Equal(t, merged[ux.Body.Address], UxArray{ux, ux3}) + assert.Equal(t, merged[ux2.Body.Address], UxArray{ux2}) + assert.Equal(t, merged[ux4.Body.Address], UxArray{ux4}) + + // Missing keys should not be merged + merged = unspents.Merge(unspents2, []cipher.Address{}) + assert.Equal(t, len(merged), 0) + merged = unspents.Merge(unspents2, []cipher.Address{ux4.Body.Address}) + assert.Equal(t, len(merged), 1) + assert.Equal(t, merged[ux4.Body.Address], UxArray{ux4}) +} + +func TestAddressUxOutsSub(t *testing.T) { + up := make(AddressUxOuts) + up2 := make(AddressUxOuts) + uxs := makeUxArray(t, 4) + + uxs[1].Body.Address = uxs[0].Body.Address + up[uxs[0].Body.Address] = UxArray{uxs[0], uxs[1]} + up[uxs[2].Body.Address] = UxArray{uxs[2]} + up[uxs[3].Body.Address] = UxArray{uxs[3]} + + up2[uxs[0].Body.Address] = UxArray{uxs[0]} + up2[uxs[2].Body.Address] = UxArray{uxs[2]} + + up3 := up.Sub(up2) + // One address should have been removed, because no elements + assert.Equal(t, len(up3), 2) + _, ok := up3[uxs[2].Body.Address] + assert.False(t, ok) + // Ux3 should be untouched + ux3 := up3[uxs[3].Body.Address] + assert.Equal(t, ux3, UxArray{uxs[3]}) + // Ux0,Ux1 should be missing Ux0 + ux1 := up3[uxs[0].Body.Address] + assert.Equal(t, ux1, UxArray{uxs[1]}) + + // Originals should be unmodified + assert.Equal(t, len(up), 3) + assert.Equal(t, len(up[uxs[0].Body.Address]), 2) + assert.Equal(t, len(up[uxs[2].Body.Address]), 1) + assert.Equal(t, len(up[uxs[3].Body.Address]), 1) + assert.Equal(t, len(up2), 2) + assert.Equal(t, len(up2[uxs[0].Body.Address]), 1) + assert.Equal(t, len(up2[uxs[2].Body.Address]), 1) +} + +func TestAddressUxOutsAdd(t *testing.T) { + up := make(AddressUxOuts) + up2 := make(AddressUxOuts) + uxs := makeUxArray(t, 4) + + uxs[1].Body.Address = uxs[0].Body.Address + up[uxs[0].Body.Address] = UxArray{uxs[0]} + up[uxs[2].Body.Address] = UxArray{uxs[2]} + up[uxs[3].Body.Address] = UxArray{uxs[3]} + + up2[uxs[0].Body.Address] = UxArray{uxs[1]} + up2[uxs[2].Body.Address] = UxArray{uxs[2]} + + up3 := up.Add(up2) + require.Equal(t, 3, len(up3)) + require.Equal(t, len(up3[uxs[0].Body.Address]), 2) + require.Equal(t, up3[uxs[0].Body.Address], UxArray{uxs[0], uxs[1]}) + require.Equal(t, up3[uxs[2].Body.Address], UxArray{uxs[2]}) + require.Equal(t, up3[uxs[3].Body.Address], UxArray{uxs[3]}) + require.Equal(t, up3[uxs[1].Body.Address], UxArray{uxs[0], uxs[1]}) + + // Originals should be unmodified + assert.Equal(t, len(up), 3) + assert.Equal(t, len(up[uxs[0].Body.Address]), 1) + assert.Equal(t, len(up[uxs[2].Body.Address]), 1) + assert.Equal(t, len(up[uxs[3].Body.Address]), 1) + assert.Equal(t, len(up2), 2) + assert.Equal(t, len(up2[uxs[0].Body.Address]), 1) + assert.Equal(t, len(up2[uxs[2].Body.Address]), 1) +} + +func TestAddressUxOutsFlatten(t *testing.T) { + up := make(AddressUxOuts) + uxs := makeUxArray(t, 3) + uxs[2].Body.Address = uxs[1].Body.Address + emptyAddr := makeAddress() + + // An empty array + up[emptyAddr] = UxArray{} + // 1 element array + up[uxs[0].Body.Address] = UxArray{uxs[0]} + // 2 element array + up[uxs[1].Body.Address] = UxArray{uxs[1], uxs[2]} + + flat := up.Flatten() + assert.Equal(t, len(flat), 3) + // emptyAddr should not be in the array + for _, ux := range flat { + assert.NotEqual(t, ux.Body.Address, emptyAddr) + } + if flat[0].Body.Address == uxs[0].Body.Address { + assert.Equal(t, flat[0], uxs[0]) + assert.Equal(t, flat[0].Body.Address, uxs[0].Body.Address) + assert.Equal(t, flat[0+1], uxs[1]) + assert.Equal(t, flat[1+1], uxs[2]) + assert.Equal(t, flat[0+1].Body.Address, uxs[1].Body.Address) + assert.Equal(t, flat[1+1].Body.Address, uxs[2].Body.Address) + } else { + assert.Equal(t, flat[0], uxs[1]) + assert.Equal(t, flat[1], uxs[2]) + assert.Equal(t, flat[0].Body.Address, uxs[1].Body.Address) + assert.Equal(t, flat[1].Body.Address, uxs[2].Body.Address) + assert.Equal(t, flat[2], uxs[0]) + assert.Equal(t, flat[2].Body.Address, uxs[0].Body.Address) + } +} + +func TestNewAddressUxOuts(t *testing.T) { + uxs := makeUxArray(t, 6) + uxs[1].Body.Address = uxs[0].Body.Address + uxs[3].Body.Address = uxs[2].Body.Address + uxs[4].Body.Address = uxs[2].Body.Address + uxo := NewAddressUxOuts(uxs) + assert.Equal(t, len(uxo), 3) + assert.Equal(t, uxo[uxs[0].Body.Address], UxArray{ + uxs[0], uxs[1], + }) + assert.Equal(t, uxo[uxs[3].Body.Address], UxArray{ + uxs[2], uxs[3], uxs[4], + }) + assert.Equal(t, uxo[uxs[5].Body.Address], UxArray{ + uxs[5], + }) +} + +/* + Utility Functions +*/ + +// Returns a copy of self with duplicates removed +// Is this needed? +func (ua UxArray) removeDupes() UxArray { + m := make(UxHashSet, len(ua)) + deduped := make(UxArray, 0, len(ua)) + for i := range ua { + h := ua[i].Hash() + if _, ok := m[h]; !ok { + deduped = append(deduped, ua[i]) + m[h] = struct{}{} + } + } + return deduped +} + +// Combines two AddressUxOuts where they overlap with keys +// Remove? +func (auo AddressUxOuts) Merge(other AddressUxOuts, + keys []cipher.Address) AddressUxOuts { + final := make(AddressUxOuts, len(keys)) + for _, a := range keys { + row := append(auo[a], other[a]...) + final[a] = row.removeDupes() + } + return final +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/coin/transaction_inputs_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/coin/transaction_inputs_skyencoder.go new file mode 100644 index 00000000..af07767d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/coin/transaction_inputs_skyencoder.go @@ -0,0 +1,135 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package coin + +import ( + "errors" + "math" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +// encodeSizeTransactionInputs computes the size of an encoded object of type transactionInputs +func encodeSizeTransactionInputs(obj *transactionInputs) uint64 { + i0 := uint64(0) + + // obj.In + i0 += 4 + { + i1 := uint64(0) + + // x1 + i1 += 32 + + i0 += uint64(len(obj.In)) * i1 + } + + return i0 +} + +// encodeTransactionInputs encodes an object of type transactionInputs to a buffer allocated to the exact size +// required to encode the object. +func encodeTransactionInputs(obj *transactionInputs) ([]byte, error) { + n := encodeSizeTransactionInputs(obj) + buf := make([]byte, n) + + if err := encodeTransactionInputsToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeTransactionInputsToBuffer encodes an object of type transactionInputs to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeTransactionInputsToBuffer(buf []byte, obj *transactionInputs) error { + if uint64(len(buf)) < encodeSizeTransactionInputs(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.In maxlen check + if len(obj.In) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // obj.In length check + if uint64(len(obj.In)) > math.MaxUint32 { + return errors.New("obj.In length exceeds math.MaxUint32") + } + + // obj.In length + e.Uint32(uint32(len(obj.In))) + + // obj.In + for _, x := range obj.In { + + // x + e.CopyBytes(x[:]) + + } + + return nil +} + +// decodeTransactionInputs decodes an object of type transactionInputs from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeTransactionInputs(buf []byte, obj *transactionInputs) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.In + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.In = make([]cipher.SHA256, length) + + for z1 := range obj.In { + { + // obj.In[z1] + if len(d.Buffer) < len(obj.In[z1]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.In[z1][:], d.Buffer[:len(obj.In[z1])]) + d.Buffer = d.Buffer[len(obj.In[z1]):] + } + + } + } + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeTransactionInputsExact decodes an object of type transactionInputs from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeTransactionInputsExact(buf []byte, obj *transactionInputs) error { + if n, err := decodeTransactionInputs(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/coin/transaction_inputs_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/coin/transaction_inputs_skyencoder_test.go new file mode 100644 index 00000000..0614758c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/coin/transaction_inputs_skyencoder_test.go @@ -0,0 +1,421 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package coin + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +func newEmptyTransactionInputsForEncodeTest() *transactionInputs { + var obj transactionInputs + return &obj +} + +func newRandomTransactionInputsForEncodeTest(t *testing.T, rand *mathrand.Rand) *transactionInputs { + var obj transactionInputs + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenTransactionInputsForEncodeTest(t *testing.T, rand *mathrand.Rand) *transactionInputs { + var obj transactionInputs + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilTransactionInputsForEncodeTest(t *testing.T, rand *mathrand.Rand) *transactionInputs { + var obj transactionInputs + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderTransactionInputs(t *testing.T, obj *transactionInputs) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeTransactionInputs(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeTransactionInputs() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeTransactionInputs(obj) + if err != nil { + t.Fatalf("encodeTransactionInputs failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeTransactionInputs produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeTransactionInputs()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeTransactionInputsToBuffer(data3, obj); err != nil { + t.Fatalf("encodeTransactionInputsToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 transactionInputs + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 transactionInputs + if n, err := decodeTransactionInputs(data2, &obj3); err != nil { + t.Fatalf("decodeTransactionInputs failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeTransactionInputs bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeTransactionInputs()") + } + + // Decode, excess buffer + var obj4 transactionInputs + n, err := decodeTransactionInputs(data3, &obj4) + if err != nil { + t.Fatalf("decodeTransactionInputs failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeTransactionInputs bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeTransactionInputs bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeTransactionInputs()") + } + + // DecodeExact + var obj5 transactionInputs + if err := decodeTransactionInputsExact(data2, &obj5); err != nil { + t.Fatalf("decodeTransactionInputs failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeTransactionInputs()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeTransactionInputs(data4, &obj3); err != nil { + t.Fatalf("decodeTransactionInputs failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeTransactionInputs bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderTransactionInputs(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *transactionInputs + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptyTransactionInputsForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomTransactionInputsForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenTransactionInputsForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilTransactionInputsForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderTransactionInputs(t, tc.obj) + }) + } +} + +func decodeTransactionInputsExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj transactionInputs + if _, err := decodeTransactionInputs(buf, &obj); err == nil { + t.Fatal("decodeTransactionInputs: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeTransactionInputs: expected error %q, got %q", expectedErr, err) + } +} + +func decodeTransactionInputsExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj transactionInputs + if err := decodeTransactionInputsExact(buf, &obj); err == nil { + t.Fatal("decodeTransactionInputsExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeTransactionInputsExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderTransactionInputsDecodeErrors(t *testing.T, k int, tag string, obj *transactionInputs) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeTransactionInputs(obj) + buf, err := encodeTransactionInputs(obj) + if err != nil { + t.Fatalf("encodeTransactionInputs failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeTransactionInputsExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeTransactionInputsExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeTransactionInputsExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeTransactionInputsExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeTransactionInputsExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderTransactionInputsDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptyTransactionInputsForEncodeTest() + fullObj := newRandomTransactionInputsForEncodeTest(t, rand) + testSkyencoderTransactionInputsDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderTransactionInputsDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/coin/transaction_outputs_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/coin/transaction_outputs_skyencoder.go new file mode 100644 index 00000000..21697577 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/coin/transaction_outputs_skyencoder.go @@ -0,0 +1,179 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package coin + +import ( + "errors" + "math" + + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +// encodeSizeTransactionOutputs computes the size of an encoded object of type transactionOutputs +func encodeSizeTransactionOutputs(obj *transactionOutputs) uint64 { + i0 := uint64(0) + + // obj.Out + i0 += 4 + { + i1 := uint64(0) + + // x1.Address.Version + i1++ + + // x1.Address.Key + i1 += 20 + + // x1.Coins + i1 += 8 + + // x1.Hours + i1 += 8 + + i0 += uint64(len(obj.Out)) * i1 + } + + return i0 +} + +// encodeTransactionOutputs encodes an object of type transactionOutputs to a buffer allocated to the exact size +// required to encode the object. +func encodeTransactionOutputs(obj *transactionOutputs) ([]byte, error) { + n := encodeSizeTransactionOutputs(obj) + buf := make([]byte, n) + + if err := encodeTransactionOutputsToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeTransactionOutputsToBuffer encodes an object of type transactionOutputs to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeTransactionOutputsToBuffer(buf []byte, obj *transactionOutputs) error { + if uint64(len(buf)) < encodeSizeTransactionOutputs(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Out maxlen check + if len(obj.Out) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // obj.Out length check + if uint64(len(obj.Out)) > math.MaxUint32 { + return errors.New("obj.Out length exceeds math.MaxUint32") + } + + // obj.Out length + e.Uint32(uint32(len(obj.Out))) + + // obj.Out + for _, x := range obj.Out { + + // x.Address.Version + e.Uint8(x.Address.Version) + + // x.Address.Key + e.CopyBytes(x.Address.Key[:]) + + // x.Coins + e.Uint64(x.Coins) + + // x.Hours + e.Uint64(x.Hours) + + } + + return nil +} + +// decodeTransactionOutputs decodes an object of type transactionOutputs from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeTransactionOutputs(buf []byte, obj *transactionOutputs) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Out + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Out = make([]TransactionOutput, length) + + for z1 := range obj.Out { + { + // obj.Out[z1].Address.Version + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Out[z1].Address.Version = i + } + + { + // obj.Out[z1].Address.Key + if len(d.Buffer) < len(obj.Out[z1].Address.Key) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Out[z1].Address.Key[:], d.Buffer[:len(obj.Out[z1].Address.Key)]) + d.Buffer = d.Buffer[len(obj.Out[z1].Address.Key):] + } + + { + // obj.Out[z1].Coins + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Out[z1].Coins = i + } + + { + // obj.Out[z1].Hours + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Out[z1].Hours = i + } + + } + } + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeTransactionOutputsExact decodes an object of type transactionOutputs from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeTransactionOutputsExact(buf []byte, obj *transactionOutputs) error { + if n, err := decodeTransactionOutputs(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/coin/transaction_outputs_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/coin/transaction_outputs_skyencoder_test.go new file mode 100644 index 00000000..02d90d45 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/coin/transaction_outputs_skyencoder_test.go @@ -0,0 +1,421 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package coin + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +func newEmptyTransactionOutputsForEncodeTest() *transactionOutputs { + var obj transactionOutputs + return &obj +} + +func newRandomTransactionOutputsForEncodeTest(t *testing.T, rand *mathrand.Rand) *transactionOutputs { + var obj transactionOutputs + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenTransactionOutputsForEncodeTest(t *testing.T, rand *mathrand.Rand) *transactionOutputs { + var obj transactionOutputs + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilTransactionOutputsForEncodeTest(t *testing.T, rand *mathrand.Rand) *transactionOutputs { + var obj transactionOutputs + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderTransactionOutputs(t *testing.T, obj *transactionOutputs) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeTransactionOutputs(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeTransactionOutputs() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeTransactionOutputs(obj) + if err != nil { + t.Fatalf("encodeTransactionOutputs failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeTransactionOutputs produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeTransactionOutputs()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeTransactionOutputsToBuffer(data3, obj); err != nil { + t.Fatalf("encodeTransactionOutputsToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 transactionOutputs + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 transactionOutputs + if n, err := decodeTransactionOutputs(data2, &obj3); err != nil { + t.Fatalf("decodeTransactionOutputs failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeTransactionOutputs bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeTransactionOutputs()") + } + + // Decode, excess buffer + var obj4 transactionOutputs + n, err := decodeTransactionOutputs(data3, &obj4) + if err != nil { + t.Fatalf("decodeTransactionOutputs failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeTransactionOutputs bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeTransactionOutputs bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeTransactionOutputs()") + } + + // DecodeExact + var obj5 transactionOutputs + if err := decodeTransactionOutputsExact(data2, &obj5); err != nil { + t.Fatalf("decodeTransactionOutputs failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeTransactionOutputs()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeTransactionOutputs(data4, &obj3); err != nil { + t.Fatalf("decodeTransactionOutputs failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeTransactionOutputs bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderTransactionOutputs(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *transactionOutputs + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptyTransactionOutputsForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomTransactionOutputsForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenTransactionOutputsForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilTransactionOutputsForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderTransactionOutputs(t, tc.obj) + }) + } +} + +func decodeTransactionOutputsExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj transactionOutputs + if _, err := decodeTransactionOutputs(buf, &obj); err == nil { + t.Fatal("decodeTransactionOutputs: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeTransactionOutputs: expected error %q, got %q", expectedErr, err) + } +} + +func decodeTransactionOutputsExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj transactionOutputs + if err := decodeTransactionOutputsExact(buf, &obj); err == nil { + t.Fatal("decodeTransactionOutputsExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeTransactionOutputsExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderTransactionOutputsDecodeErrors(t *testing.T, k int, tag string, obj *transactionOutputs) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeTransactionOutputs(obj) + buf, err := encodeTransactionOutputs(obj) + if err != nil { + t.Fatalf("encodeTransactionOutputs failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeTransactionOutputsExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeTransactionOutputsExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeTransactionOutputsExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeTransactionOutputsExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeTransactionOutputsExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderTransactionOutputsDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptyTransactionOutputsForEncodeTest() + fullObj := newRandomTransactionOutputsForEncodeTest(t, rand) + testSkyencoderTransactionOutputsDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderTransactionOutputsDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/coin/transaction_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/coin/transaction_skyencoder.go new file mode 100644 index 00000000..538f1c97 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/coin/transaction_skyencoder.go @@ -0,0 +1,357 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package coin + +import ( + "errors" + "math" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +// encodeSizeTransaction computes the size of an encoded object of type Transaction +func encodeSizeTransaction(obj *Transaction) uint64 { + i0 := uint64(0) + + // obj.Length + i0 += 4 + + // obj.Type + i0++ + + // obj.InnerHash + i0 += 32 + + // obj.Sigs + i0 += 4 + { + i1 := uint64(0) + + // x1 + i1 += 65 + + i0 += uint64(len(obj.Sigs)) * i1 + } + + // obj.In + i0 += 4 + { + i1 := uint64(0) + + // x1 + i1 += 32 + + i0 += uint64(len(obj.In)) * i1 + } + + // obj.Out + i0 += 4 + { + i1 := uint64(0) + + // x1.Address.Version + i1++ + + // x1.Address.Key + i1 += 20 + + // x1.Coins + i1 += 8 + + // x1.Hours + i1 += 8 + + i0 += uint64(len(obj.Out)) * i1 + } + + return i0 +} + +// encodeTransaction encodes an object of type Transaction to a buffer allocated to the exact size +// required to encode the object. +func encodeTransaction(obj *Transaction) ([]byte, error) { + n := encodeSizeTransaction(obj) + buf := make([]byte, n) + + if err := encodeTransactionToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeTransactionToBuffer encodes an object of type Transaction to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeTransactionToBuffer(buf []byte, obj *Transaction) error { + if uint64(len(buf)) < encodeSizeTransaction(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Length + e.Uint32(obj.Length) + + // obj.Type + e.Uint8(obj.Type) + + // obj.InnerHash + e.CopyBytes(obj.InnerHash[:]) + + // obj.Sigs maxlen check + if len(obj.Sigs) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // obj.Sigs length check + if uint64(len(obj.Sigs)) > math.MaxUint32 { + return errors.New("obj.Sigs length exceeds math.MaxUint32") + } + + // obj.Sigs length + e.Uint32(uint32(len(obj.Sigs))) + + // obj.Sigs + for _, x := range obj.Sigs { + + // x + e.CopyBytes(x[:]) + + } + + // obj.In maxlen check + if len(obj.In) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // obj.In length check + if uint64(len(obj.In)) > math.MaxUint32 { + return errors.New("obj.In length exceeds math.MaxUint32") + } + + // obj.In length + e.Uint32(uint32(len(obj.In))) + + // obj.In + for _, x := range obj.In { + + // x + e.CopyBytes(x[:]) + + } + + // obj.Out maxlen check + if len(obj.Out) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // obj.Out length check + if uint64(len(obj.Out)) > math.MaxUint32 { + return errors.New("obj.Out length exceeds math.MaxUint32") + } + + // obj.Out length + e.Uint32(uint32(len(obj.Out))) + + // obj.Out + for _, x := range obj.Out { + + // x.Address.Version + e.Uint8(x.Address.Version) + + // x.Address.Key + e.CopyBytes(x.Address.Key[:]) + + // x.Coins + e.Uint64(x.Coins) + + // x.Hours + e.Uint64(x.Hours) + + } + + return nil +} + +// decodeTransaction decodes an object of type Transaction from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeTransaction(buf []byte, obj *Transaction) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Length + i, err := d.Uint32() + if err != nil { + return 0, err + } + obj.Length = i + } + + { + // obj.Type + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Type = i + } + + { + // obj.InnerHash + if len(d.Buffer) < len(obj.InnerHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.InnerHash[:], d.Buffer[:len(obj.InnerHash)]) + d.Buffer = d.Buffer[len(obj.InnerHash):] + } + + { + // obj.Sigs + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Sigs = make([]cipher.Sig, length) + + for z1 := range obj.Sigs { + { + // obj.Sigs[z1] + if len(d.Buffer) < len(obj.Sigs[z1]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Sigs[z1][:], d.Buffer[:len(obj.Sigs[z1])]) + d.Buffer = d.Buffer[len(obj.Sigs[z1]):] + } + + } + } + } + + { + // obj.In + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.In = make([]cipher.SHA256, length) + + for z1 := range obj.In { + { + // obj.In[z1] + if len(d.Buffer) < len(obj.In[z1]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.In[z1][:], d.Buffer[:len(obj.In[z1])]) + d.Buffer = d.Buffer[len(obj.In[z1]):] + } + + } + } + } + + { + // obj.Out + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Out = make([]TransactionOutput, length) + + for z1 := range obj.Out { + { + // obj.Out[z1].Address.Version + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Out[z1].Address.Version = i + } + + { + // obj.Out[z1].Address.Key + if len(d.Buffer) < len(obj.Out[z1].Address.Key) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Out[z1].Address.Key[:], d.Buffer[:len(obj.Out[z1].Address.Key)]) + d.Buffer = d.Buffer[len(obj.Out[z1].Address.Key):] + } + + { + // obj.Out[z1].Coins + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Out[z1].Coins = i + } + + { + // obj.Out[z1].Hours + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Out[z1].Hours = i + } + + } + } + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeTransactionExact decodes an object of type Transaction from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeTransactionExact(buf []byte, obj *Transaction) error { + if n, err := decodeTransaction(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/coin/transaction_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/coin/transaction_skyencoder_test.go new file mode 100644 index 00000000..1048aa4d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/coin/transaction_skyencoder_test.go @@ -0,0 +1,421 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package coin + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +func newEmptyTransactionForEncodeTest() *Transaction { + var obj Transaction + return &obj +} + +func newRandomTransactionForEncodeTest(t *testing.T, rand *mathrand.Rand) *Transaction { + var obj Transaction + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenTransactionForEncodeTest(t *testing.T, rand *mathrand.Rand) *Transaction { + var obj Transaction + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilTransactionForEncodeTest(t *testing.T, rand *mathrand.Rand) *Transaction { + var obj Transaction + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderTransaction(t *testing.T, obj *Transaction) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeTransaction(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeTransaction() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeTransaction(obj) + if err != nil { + t.Fatalf("encodeTransaction failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeTransaction produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeTransaction()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeTransactionToBuffer(data3, obj); err != nil { + t.Fatalf("encodeTransactionToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 Transaction + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 Transaction + if n, err := decodeTransaction(data2, &obj3); err != nil { + t.Fatalf("decodeTransaction failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeTransaction bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeTransaction()") + } + + // Decode, excess buffer + var obj4 Transaction + n, err := decodeTransaction(data3, &obj4) + if err != nil { + t.Fatalf("decodeTransaction failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeTransaction bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeTransaction bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeTransaction()") + } + + // DecodeExact + var obj5 Transaction + if err := decodeTransactionExact(data2, &obj5); err != nil { + t.Fatalf("decodeTransaction failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeTransaction()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeTransaction(data4, &obj3); err != nil { + t.Fatalf("decodeTransaction failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeTransaction bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderTransaction(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *Transaction + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptyTransactionForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomTransactionForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenTransactionForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilTransactionForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderTransaction(t, tc.obj) + }) + } +} + +func decodeTransactionExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj Transaction + if _, err := decodeTransaction(buf, &obj); err == nil { + t.Fatal("decodeTransaction: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeTransaction: expected error %q, got %q", expectedErr, err) + } +} + +func decodeTransactionExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj Transaction + if err := decodeTransactionExact(buf, &obj); err == nil { + t.Fatal("decodeTransactionExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeTransactionExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderTransactionDecodeErrors(t *testing.T, k int, tag string, obj *Transaction) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeTransaction(obj) + buf, err := encodeTransaction(obj) + if err != nil { + t.Fatalf("encodeTransaction failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeTransactionExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeTransactionExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeTransactionExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeTransactionExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeTransactionExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderTransactionDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptyTransactionForEncodeTest() + fullObj := newRandomTransactionForEncodeTest(t, rand) + testSkyencoderTransactionDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderTransactionDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/coin/transactions.go b/vendor/github.com/SkycoinProject/skycoin/src/coin/transactions.go new file mode 100644 index 00000000..5d340aca --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/coin/transactions.go @@ -0,0 +1,788 @@ +package coin + +import ( + "bytes" + "encoding/hex" + "errors" + "fmt" + "log" + "math" + "sort" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/util/mathutil" +) + +var ( + // DebugLevel1 checks for extremely unlikely conditions (10e-40) + DebugLevel1 = true + // DebugLevel2 enable checks for impossible conditions + DebugLevel2 = true +) + +//go:generate skyencoder -struct Transaction -unexported +//go:generate skyencoder -struct transactionInputs +//go:generate skyencoder -struct transactionOutputs + +type transactionInputs struct { + In []cipher.SHA256 `enc:",maxlen=65535"` +} + +type transactionOutputs struct { + Out []TransactionOutput `enc:",maxlen=65535"` +} + +/* +Transaction with N inputs, M ouputs is +- 32 bytes constant +- 32+65 bytes per input +- 21+8+8 bytes per output + +Skycoin Transactions are +- 97 bytes per input + 37 bytes per output + 37 bytes +Bitcoin Transactions are +- 180 bytes per input + 34 bytes per output + 10 bytes + +Sigs is the array of signatures +- the Nth signature is the authorization to spend the Nth output consumed in transaction +- the hash signed is SHA256sum of transaction inner hash and the hash of output being spent + +The inner hash is SHA256 hash of the serialization of Input and Output array +The outer hash is the hash of the whole transaction serialization +*/ + +// Transaction transaction struct +type Transaction struct { + Length uint32 // length prefix + Type uint8 // transaction type + InnerHash cipher.SHA256 // inner hash SHA256 of In[],Out[] + + Sigs []cipher.Sig `enc:",maxlen=65535"` // list of signatures, 64+1 bytes each + In []cipher.SHA256 `enc:",maxlen=65535"` // ouputs being spent + Out []TransactionOutput `enc:",maxlen=65535"` // ouputs being created +} + +// TransactionOutput hash output/name is function of Hash +type TransactionOutput struct { + Address cipher.Address // address to send to + Coins uint64 // amount to be sent in coins + Hours uint64 // amount to be sent in coin hours +} + +// Verify attempts to determine if the transaction is well formed. +// Verify cannot check transaction signatures, it needs the address from unspents +// Verify cannot check if outputs being spent exist +// Verify cannot check if the transaction would create or destroy coins +// or if the inputs have the required coin base +func (txn *Transaction) Verify() error { + return txn.verify(true) +} + +// VerifyUnsigned attempts to determine if the transaction is well formed, +// but requires the transaction to have at least one null signature. +// Verify cannot check transaction signatures, it needs the address from unspents +// Verify cannot check if outputs being spent exist +// Verify cannot check if the transaction would create or destroy coins +// or if the inputs have the required coin base +func (txn *Transaction) VerifyUnsigned() error { + return txn.verify(false) +} + +func (txn *Transaction) verify(signed bool) error { + if len(txn.In) == 0 { + return errors.New("No inputs") + } + if len(txn.Out) == 0 { + return errors.New("No outputs") + } + + // Check signature index fields + if len(txn.Sigs) != len(txn.In) { + return errors.New("Invalid number of signatures") + } + if len(txn.Sigs) > math.MaxUint16 { + return errors.New("Too many signatures and inputs") + } + + if len(txn.Out) > math.MaxUint16 { + return errors.New("Too many ouptuts") + } + + // Check duplicate inputs + uxOuts := make(map[cipher.SHA256]struct{}, len(txn.In)) + for i := range txn.In { + uxOuts[txn.In[i]] = struct{}{} + } + if len(uxOuts) != len(txn.In) { + return errors.New("Duplicate spend") + } + + if txn.Type != 0 { + return errors.New("transaction type invalid") + } + + // Prevent zero coin outputs + // Artificial restriction to prevent spam + for _, txo := range txn.Out { + if txo.Coins == 0 { + return errors.New("Zero coin output") + } + } + + // Check output coin integer overflow + coins := uint64(0) + for _, to := range txn.Out { + var err error + coins, err = mathutil.AddUint64(coins, to.Coins) + if err != nil { + return errors.New("Output coins overflow") + } + } + + // Check that Size and Hash can be computed + txnSize, txnHash, err := txn.SizeHash() + if err != nil { + return err + } + + // Check txn Size set correctly + if txn.Length != txnSize { + return errors.New("Incorrect transaction length") + } + + // Check for duplicate potential outputs + outputs := make(map[cipher.SHA256]struct{}, len(txn.Out)) + uxb := UxBody{ + SrcTransaction: txnHash, + } + for _, to := range txn.Out { + uxb.Coins = to.Coins + uxb.Hours = to.Hours + uxb.Address = to.Address + outputs[uxb.Hash()] = struct{}{} + } + if len(outputs) != len(txn.Out) { + return errors.New("Duplicate output in transaction") + } + + // Check inner hash + innerHash, err := txn.hashInner() + if err != nil { + return fmt.Errorf("HashInner failed: %v", err) + } + + if innerHash != txn.InnerHash { + return errors.New("InnerHash does not match computed hash") + } + + // Validate signatures + for i, sig := range txn.Sigs { + if sig.Null() { + // Check that signed transactions do not have any null signatures + if signed { + return errors.New("Unsigned input in transaction") + } + // Ignore null signatures if the transaction is unsigned + continue + } + + hash := cipher.AddSHA256(txn.InnerHash, txn.In[i]) + if err := cipher.VerifySignatureRecoverPubKey(sig, hash); err != nil { + return err + } + } + + // Check that unsigned transactions have at least one non-null signature + if !signed { + if !txn.hasNullSignature() { + return errors.New("Unsigned transaction must contain a null signature") + } + } + + return nil +} + +func (txn Transaction) verifyInputSignaturesPrelude(uxIn UxArray) error { + if len(txn.In) != len(uxIn) { + return errors.New("txn.In != uxIn") + } + if len(txn.In) != len(txn.Sigs) { + return errors.New("txn.In != txn.Sigs") + } + if txn.InnerHash != txn.HashInner() { + return errors.New("Invalid Tx Inner Hash") + } + for i := range txn.In { + if txn.In[i] != uxIn[i].Hash() { + return errors.New("Ux hash mismatch") + } + } + return nil +} + +// VerifyInputSignatures verifies the inputs and signatures +func (txn Transaction) VerifyInputSignatures(uxIn UxArray) error { + if err := txn.verifyInputSignaturesPrelude(uxIn); err != nil { + if DebugLevel2 { + log.Panic(err) + } + return err + } + + // Check signatures against unspent address + for i := range txn.In { + if txn.Sigs[i].Null() { + return errors.New("Unsigned input in transaction") + } + + hash := cipher.AddSHA256(txn.InnerHash, txn.In[i]) // use inner hash, not outer hash + err := cipher.VerifyAddressSignedHash(uxIn[i].Body.Address, txn.Sigs[i], hash) + if err != nil { + return errors.New("Signature not valid for output being spent") + } + } + + return nil +} + +// VerifyPartialInputSignatures verifies the inputs and signatures for signatures that are not null +func (txn Transaction) VerifyPartialInputSignatures(uxIn UxArray) error { + if err := txn.verifyInputSignaturesPrelude(uxIn); err != nil { + if DebugLevel2 { + log.Panic(err) + } + return err + } + + // Check signatures against unspent address for signatures that are not null + for i := range txn.In { + if txn.Sigs[i].Null() { + continue + } + hash := cipher.AddSHA256(txn.InnerHash, txn.In[i]) // use inner hash, not outer hash + err := cipher.VerifyAddressSignedHash(uxIn[i].Body.Address, txn.Sigs[i], hash) + if err != nil { + return errors.New("Signature not valid for output being spent") + } + } + + return nil +} + +// PushInput adds a unspent output hash to the inputs of a Transaction. +func (txn *Transaction) PushInput(uxOut cipher.SHA256) error { + if len(txn.In) >= math.MaxUint16 { + return errors.New("Max transaction inputs reached") + } + txn.In = append(txn.In, uxOut) + return nil +} + +// UxID compute transaction output id +func (txOut TransactionOutput) UxID(txID cipher.SHA256) cipher.SHA256 { + var x UxBody + x.Coins = txOut.Coins + x.Hours = txOut.Hours + x.Address = txOut.Address + x.SrcTransaction = txID + return x.Hash() +} + +// PushOutput Adds a TransactionOutput, sending coins & hours to an Address +func (txn *Transaction) PushOutput(dst cipher.Address, coins, hours uint64) error { + if len(txn.Out) >= math.MaxUint16 { + return errors.New("Max transaction outputs reached") + } + txn.Out = append(txn.Out, TransactionOutput{ + Address: dst, + Coins: coins, + Hours: hours, + }) + return nil +} + +// SignInput signs a specific input in the transaction. +// InnerHash should already be set to a valid value. +// Returns an error if the input is already signed +func (txn *Transaction) SignInput(key cipher.SecKey, index int) error { + if index < 0 || index >= len(txn.In) { + return errors.New("Signature index out of range") + } + + if len(txn.Sigs) == 0 { + txn.Sigs = make([]cipher.Sig, len(txn.In)) + } + if len(txn.In) != len(txn.Sigs) { + return errors.New("Number of signatures does not match number of inputs") + } + + if !txn.Sigs[index].Null() { + return errors.New("Input already signed") + } + + h := cipher.AddSHA256(txn.InnerHash, txn.In[index]) + txn.Sigs[index] = cipher.MustSignHash(h, key) + + return nil +} + +// SignInputs signs all inputs in the transaction +func (txn *Transaction) SignInputs(keys []cipher.SecKey) { + if len(keys) != len(txn.In) { + log.Panic("Invalid number of keys") + } + if len(keys) > math.MaxUint16 { + log.Panic("Too many keys") + } + if len(keys) == 0 { + log.Panic("No keys") + } + if len(txn.Sigs) > 0 && txn.hasNonNullSignature() { + log.Panic("Transaction has been signed") + } + + txn.InnerHash = txn.HashInner() // update hash + + sigs := make([]cipher.Sig, len(txn.In)) + for i, k := range keys { + h := cipher.AddSHA256(txn.InnerHash, txn.In[i]) // hash to sign + sigs[i] = cipher.MustSignHash(h, k) + } + txn.Sigs = sigs +} + +// Size returns the encoded byte size of the transaction +func (txn *Transaction) Size() (uint32, error) { + buf, err := txn.Serialize() + if err != nil { + return 0, err + } + return mathutil.IntToUint32(len(buf)) +} + +// IsFullyUnsigned returns true if the transaction is not signed for any input. +// Unsigned transactions have a full signature array, but the signatures are null. +// Returns true if the signatures array is empty. +func (txn *Transaction) IsFullyUnsigned() bool { + for _, s := range txn.Sigs { + if !s.Null() { + return false + } + } + + return true +} + +// IsFullySigned returns true if the transaction is fully signed. +// Returns true if the signatures array is empty. +func (txn *Transaction) IsFullySigned() bool { + if len(txn.Sigs) == 0 { + return false + } + + for _, s := range txn.Sigs { + if s.Null() { + return false + } + } + + return true +} + +// hasNonNullSignature returns true if the transaction has at least one non-null signature +func (txn *Transaction) hasNonNullSignature() bool { + for _, s := range txn.Sigs { + if !s.Null() { + return true + } + } + + return false +} + +// hasNullSignature returns true if the transaction has at least one null signature +func (txn *Transaction) hasNullSignature() bool { + for _, s := range txn.Sigs { + if s.Null() { + return true + } + } + + return false +} + +// Hash an entire Transaction struct, including the TransactionHeader +func (txn *Transaction) Hash() cipher.SHA256 { + b, err := txn.Serialize() + if err != nil { + log.Panicf("Hash: txn.Serialize failed: %v", err) + } + return cipher.SumSHA256(b) +} + +// SizeHash returns the encoded size and the hash of it (avoids duplicate encoding) +func (txn *Transaction) SizeHash() (uint32, cipher.SHA256, error) { + b, err := txn.Serialize() + if err != nil { + return 0, cipher.SHA256{}, err + } + s, err := mathutil.IntToUint32(len(b)) + if err != nil { + return 0, cipher.SHA256{}, err + } + return s, cipher.SumSHA256(b), nil +} + +// UpdateHeader saves the txn body hash to TransactionHeader.Hash +func (txn *Transaction) UpdateHeader() error { + s, err := txn.Size() + if err != nil { + return err + } + txn.Length = s + txn.Type = byte(0x00) + txn.InnerHash = txn.HashInner() + return nil +} + +// HashInner hashes only the Transaction Inputs & Outputs +// This is what is signed +// Client hashes the inner hash with hash of output being spent and signs it with private key +func (txn *Transaction) HashInner() cipher.SHA256 { + h, err := txn.hashInner() + if err != nil { + log.Panicf("hashInner failed: %v", err) + } + return h +} + +func (txn *Transaction) hashInner() (cipher.SHA256, error) { + txnInputs := &transactionInputs{ + In: txn.In, + } + txnOutputs := &transactionOutputs{ + Out: txn.Out, + } + n1 := encodeSizeTransactionInputs(txnInputs) + n2 := encodeSizeTransactionOutputs(txnOutputs) + buf := make([]byte, n1+n2) + + if err := encodeTransactionInputsToBuffer(buf[:n1], txnInputs); err != nil { + return cipher.SHA256{}, fmt.Errorf("encodeTransactionInputsToBuffer failed: %v", err) + } + + if err := encodeTransactionOutputsToBuffer(buf[n1:], txnOutputs); err != nil { + return cipher.SHA256{}, fmt.Errorf("encodeTransactionOutputsToBuffer failed: %v", err) + } + + return cipher.SumSHA256(buf), nil +} + +// MustSerialize serializes the transaction to bytes, panics on error. +// Serialization can fail if the transaction has too many elements in its arrays +func (txn *Transaction) MustSerialize() []byte { + b, err := encodeTransaction(txn) + if err != nil { + log.Panicf("encodeTransaction failed: %v", err) + } + return b +} + +// Serialize serializes the transaction to bytes. +// Serialization can fail if the transaction has too many elements in its arrays +func (txn *Transaction) Serialize() ([]byte, error) { + return encodeTransaction(txn) +} + +// MustSerializeHex serializes the transaction to a hex string, panics on error. +// Serialization can fail if the transaction has too many elements in its arrays +func (txn *Transaction) MustSerializeHex() string { + return hex.EncodeToString(txn.MustSerialize()) +} + +// SerializeHex serializes the transaction to a hex string. +// Serialization can fail if the transaction has too many elements in its arrays +func (txn *Transaction) SerializeHex() (string, error) { + b, err := txn.Serialize() + if err != nil { + return "", err + } + return hex.EncodeToString(b), nil +} + +// MustDeserializeTransaction deserializes a transaction, panics on error +func MustDeserializeTransaction(b []byte) Transaction { + txn, err := DeserializeTransaction(b) + if err != nil { + log.Panicf("Failed to deserialize transaction: %v", err) + } + return txn +} + +// DeserializeTransaction deserializes a transaction +func DeserializeTransaction(b []byte) (Transaction, error) { + txn := Transaction{} + if err := decodeTransactionExact(b, &txn); err != nil { + return Transaction{}, fmt.Errorf("Invalid transaction: %v", err) + } + return txn, nil +} + +// MustDeserializeTransactionHex deserializes a transaction hex string, panics on error +func MustDeserializeTransactionHex(s string) Transaction { + txn, err := DeserializeTransactionHex(s) + if err != nil { + log.Panicf("Failed to deserialize transaction: %v", err) + } + return txn +} + +// DeserializeTransactionHex deserializes a transaction hex string +func DeserializeTransactionHex(s string) (Transaction, error) { + b, err := hex.DecodeString(s) + if err != nil { + return Transaction{}, err + } + return DeserializeTransaction(b) +} + +// OutputHours returns the coin hours sent as outputs. This does not include the fee. +func (txn *Transaction) OutputHours() (uint64, error) { + hours := uint64(0) + for i := range txn.Out { + var err error + hours, err = mathutil.AddUint64(hours, txn.Out[i].Hours) + if err != nil { + return 0, errors.New("Transaction output hours overflow") + } + } + return hours, nil +} + +// Transactions transaction slice +type Transactions []Transaction + +// Fees calculates all the fees in Transactions +func (txns Transactions) Fees(calc FeeCalculator) (uint64, error) { + total := uint64(0) + for i := range txns { + fee, err := calc(&txns[i]) + if err != nil { + return 0, err + } + + total, err = mathutil.AddUint64(total, fee) + if err != nil { + return 0, errors.New("Transactions fee totals overflow") + } + } + return total, nil +} + +// Hashes caculate transactions hashes +func (txns Transactions) Hashes() []cipher.SHA256 { + hashes := make([]cipher.SHA256, len(txns)) + for i := range txns { + hashes[i] = txns[i].Hash() + } + return hashes +} + +// Size returns the sum of contained Transactions' sizes. It is not the size if +// serialized, since that would have a length prefix. +func (txns Transactions) Size() (uint32, error) { + var size uint32 + for i := range txns { + s, err := txns[i].Size() + if err != nil { + return 0, err + } + + size, err = mathutil.AddUint32(size, s) + if err != nil { + return 0, err + } + } + + return size, nil +} + +// TruncateBytesTo returns the first n transactions whose total size is less than or equal to size +func (txns Transactions) TruncateBytesTo(size uint32) (Transactions, error) { + var total uint32 + for i := range txns { + pending, err := txns[i].Size() + if err != nil { + return nil, err + } + + pendingTotal, err := mathutil.AddUint32(total, pending) + if err != nil { + return txns[:i], nil + } + + if pendingTotal > size { + return txns[:i], nil + } + + total = pendingTotal + } + + return txns, nil +} + +// SortableTransactions allows sorting transactions by fee & hash +type SortableTransactions struct { + Transactions Transactions + Fees []uint64 + Hashes []cipher.SHA256 +} + +// FeeCalculator given a transaction, return its fee or an error if the fee cannot be calculated +type FeeCalculator func(*Transaction) (uint64, error) + +// SortTransactions returns transactions sorted by fee per kB, and sorted by lowest hash if tied. +// Transactions that fail in fee computation are excluded +func SortTransactions(txns Transactions, feeCalc FeeCalculator) (Transactions, error) { + sorted, err := NewSortableTransactions(txns, feeCalc) + if err != nil { + return nil, err + } + sorted.Sort() + return sorted.Transactions, nil +} + +// NewSortableTransactions returns an array of txns that can be sorted by fee. +// On creation, fees are calculated, and if any txns have invalid fee, there are removed from consideration +func NewSortableTransactions(txns Transactions, feeCalc FeeCalculator) (*SortableTransactions, error) { + newTxns := make(Transactions, len(txns)) + fees := make([]uint64, len(txns)) + hashes := make([]cipher.SHA256, len(txns)) + j := 0 + for i := range txns { + fee, err := feeCalc(&txns[i]) + if err != nil { + continue + } + + size, hash, err := txns[i].SizeHash() + if err != nil { + return nil, err + } + + // Calculate fee priority based on fee per kb + feeKB, err := mathutil.MultUint64(fee, 1024) + + // If the fee * 1024 would exceed math.MaxUint64, set it to math.MaxUint64 so that + // this transaction can still be processed + if err != nil { + feeKB = math.MaxUint64 + } + + newTxns[j] = txns[i] + hashes[j] = hash + fees[j] = feeKB / uint64(size) + j++ + } + + return &SortableTransactions{ + Transactions: newTxns[:j], + Fees: fees[:j], + Hashes: hashes[:j], + }, nil +} + +// Sort sorts by tx fee, and then by hash if fee equal +func (txns SortableTransactions) Sort() { + sort.Sort(txns) +} + +// Len returns length of transactions +func (txns SortableTransactions) Len() int { + return len(txns.Transactions) +} + +// Less default sorting is fees descending, hash ascending if fees equal +func (txns SortableTransactions) Less(i, j int) bool { + if txns.Fees[i] == txns.Fees[j] { + // If fees match, hashes are sorted ascending + return bytes.Compare(txns.Hashes[i][:], txns.Hashes[j][:]) < 0 + } + // Fees are sorted descending + return txns.Fees[i] > txns.Fees[j] +} + +// Swap swaps txns +func (txns SortableTransactions) Swap(i, j int) { + txns.Transactions[i], txns.Transactions[j] = txns.Transactions[j], txns.Transactions[i] + txns.Fees[i], txns.Fees[j] = txns.Fees[j], txns.Fees[i] + txns.Hashes[i], txns.Hashes[j] = txns.Hashes[j], txns.Hashes[i] +} + +// VerifyTransactionCoinsSpending checks that coins are not destroyed or created by the transaction +func VerifyTransactionCoinsSpending(uxIn UxArray, uxOut UxArray) error { + coinsIn := uint64(0) + for i := range uxIn { + var err error + coinsIn, err = mathutil.AddUint64(coinsIn, uxIn[i].Body.Coins) + if err != nil { + return errors.New("Transaction input coins overflow") + } + } + + coinsOut := uint64(0) + for i := range uxOut { + var err error + coinsOut, err = mathutil.AddUint64(coinsOut, uxOut[i].Body.Coins) + if err != nil { + return errors.New("Transaction output coins overflow") + } + } + + if coinsIn < coinsOut { + return errors.New("Insufficient coins") + } + if coinsIn > coinsOut { + return errors.New("Transactions may not destroy coins") + } + + return nil +} + +// VerifyTransactionHoursSpending checks that hours are not created by the transaction +func VerifyTransactionHoursSpending(headTime uint64, uxIn UxArray, uxOut UxArray) error { + hoursIn := uint64(0) + for i := range uxIn { + uxHours, err := uxIn[i].CoinHours(headTime) + if err != nil { + // If the error was specifically an overflow when adding the + // earned coin hours to the base coin hours, treat the uxHours as 0. + // Block 13277 spends an input which overflows in this way, + // so the block will not sync if an error is returned. + if err == ErrAddEarnedCoinHoursAdditionOverflow { + uxHours = 0 + } else { + return err + } + } + + hoursIn, err = mathutil.AddUint64(hoursIn, uxHours) + if err != nil { + return errors.New("Transaction input hours overflow") + } + } + + hoursOut := uint64(0) + for i := range uxOut { + // NOTE: addition of hours is not checked for overflow here because + // this would invalidate existing blocks which had overflowed hours. + // Hours overflow checks are handled as a "soft" constraint in the network + // until those blocks are repaired. + hoursOut += uxOut[i].Body.Hours + } + + if hoursIn < hoursOut { + return errors.New("Insufficient coin hours") + } + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/coin/transactions_test.go b/vendor/github.com/SkycoinProject/skycoin/src/coin/transactions_test.go new file mode 100644 index 00000000..adee28d3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/coin/transactions_test.go @@ -0,0 +1,1159 @@ +package coin + +import ( + "bytes" + "encoding/hex" + "errors" + "math" + "sort" + "strings" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" + "github.com/SkycoinProject/skycoin/src/testutil" + _require "github.com/SkycoinProject/skycoin/src/testutil/require" + "github.com/SkycoinProject/skycoin/src/util/mathutil" +) + +func makeTransactionFromUxOuts(t *testing.T, uxs []UxOut, secs []cipher.SecKey) Transaction { + require.Equal(t, len(uxs), len(secs)) + + txn := Transaction{} + + err := txn.PushOutput(makeAddress(), 1e6, 50) + require.NoError(t, err) + err = txn.PushOutput(makeAddress(), 5e6, 50) + require.NoError(t, err) + + for _, ux := range uxs { + err = txn.PushInput(ux.Hash()) + require.NoError(t, err) + } + + txn.SignInputs(secs) + + err = txn.UpdateHeader() + require.NoError(t, err) + return txn +} + +func makeTransactionFromUxOut(t *testing.T, ux UxOut, s cipher.SecKey) Transaction { + return makeTransactionFromUxOuts(t, []UxOut{ux}, []cipher.SecKey{s}) +} + +func makeTransaction(t *testing.T) Transaction { + ux, s := makeUxOutWithSecret(t) + return makeTransactionFromUxOut(t, ux, s) +} + +func makeTransactionMultipleInputs(t *testing.T, n int) (Transaction, []cipher.SecKey) { + uxs := make([]UxOut, n) + secs := make([]cipher.SecKey, n) + for i := 0; i < n; i++ { + ux, s := makeUxOutWithSecret(t) + uxs[i] = ux + secs[i] = s + } + return makeTransactionFromUxOuts(t, uxs, secs), secs +} + +func makeTransactions(t *testing.T, n int) Transactions { //nolint:unparam + txns := make(Transactions, n) + for i := range txns { + txns[i] = makeTransaction(t) + } + return txns +} + +func makeAddress() cipher.Address { + p, _ := cipher.GenerateKeyPair() + return cipher.AddressFromPubKey(p) +} + +func copyTransaction(txn Transaction) Transaction { + txo := Transaction{} + txo.Length = txn.Length + txo.Type = txn.Type + txo.InnerHash = txn.InnerHash + txo.Sigs = make([]cipher.Sig, len(txn.Sigs)) + copy(txo.Sigs, txn.Sigs) + txo.In = make([]cipher.SHA256, len(txn.In)) + copy(txo.In, txn.In) + txo.Out = make([]TransactionOutput, len(txn.Out)) + copy(txo.Out, txn.Out) + return txo +} + +func TestTransactionVerify(t *testing.T) { + // Mismatch header hash + txn := makeTransaction(t) + txn.InnerHash = cipher.SHA256{} + testutil.RequireError(t, txn.Verify(), "InnerHash does not match computed hash") + + // No inputs + txn = makeTransaction(t) + txn.In = make([]cipher.SHA256, 0) + err := txn.UpdateHeader() + require.NoError(t, err) + testutil.RequireError(t, txn.Verify(), "No inputs") + + // No outputs + txn = makeTransaction(t) + txn.Out = make([]TransactionOutput, 0) + err = txn.UpdateHeader() + require.NoError(t, err) + testutil.RequireError(t, txn.Verify(), "No outputs") + + // Invalid number of sigs + txn = makeTransaction(t) + txn.Sigs = make([]cipher.Sig, 0) + err = txn.UpdateHeader() + require.NoError(t, err) + testutil.RequireError(t, txn.Verify(), "Invalid number of signatures") + txn.Sigs = make([]cipher.Sig, 20) + err = txn.UpdateHeader() + require.NoError(t, err) + testutil.RequireError(t, txn.Verify(), "Invalid number of signatures") + + // Too many sigs & inputs + txn = makeTransaction(t) + txn.Sigs = make([]cipher.Sig, math.MaxUint16+1) + txn.In = make([]cipher.SHA256, math.MaxUint16+1) + testutil.RequireError(t, txn.Verify(), "Too many signatures and inputs") + + // Duplicate inputs + ux, s := makeUxOutWithSecret(t) + txn = makeTransactionFromUxOut(t, ux, s) + err = txn.PushInput(txn.In[0]) + require.NoError(t, err) + txn.Sigs = nil + txn.SignInputs([]cipher.SecKey{s, s}) + err = txn.UpdateHeader() + require.NoError(t, err) + testutil.RequireError(t, txn.Verify(), "Duplicate spend") + + // Duplicate outputs + txn = makeTransaction(t) + to := txn.Out[0] + err = txn.PushOutput(to.Address, to.Coins, to.Hours) + require.NoError(t, err) + err = txn.UpdateHeader() + require.NoError(t, err) + testutil.RequireError(t, txn.Verify(), "Duplicate output in transaction") + + // Invalid signature, empty + txn = makeTransaction(t) + txn.Sigs[0] = cipher.Sig{} + testutil.RequireError(t, txn.Verify(), "Unsigned input in transaction") + + // Invalid signature, not empty + // A stable invalid signature must be used because random signatures could appear valid + // Note: Transaction.Verify() only checks that the signature is a minimally valid signature + badSig := "9a0f86874a4d9541f58a1de4db1c1b58765a868dc6f027445d0a2a8a7bddd1c45ea559fcd7bef45e1b76ccdaf8e50bbebd952acbbea87d1cb3f7a964bc89bf1ed5" + txn = makeTransaction(t) + txn.Sigs[0] = cipher.MustSigFromHex(badSig) + testutil.RequireError(t, txn.Verify(), "Failed to recover pubkey from signature") + + // We can't check here for other invalid signatures: + // - Signatures signed by someone else, spending coins they don't own + // - Signatures signing a different message + // This must be done by blockchain tests, because we need the address + // from the unspent being spent + // The verification here only checks that the signature is valid at all + + // Output coins are 0 + txn = makeTransaction(t) + txn.Out[0].Coins = 0 + err = txn.UpdateHeader() + require.NoError(t, err) + testutil.RequireError(t, txn.Verify(), "Zero coin output") + + // Output coin overflow + txn = makeTransaction(t) + txn.Out[0].Coins = math.MaxUint64 - 3e6 + err = txn.UpdateHeader() + require.NoError(t, err) + testutil.RequireError(t, txn.Verify(), "Output coins overflow") + + // Output coins are not multiples of 1e6 (valid, decimal restriction is not enforced here) + txn = makeTransaction(t) + txn.Out[0].Coins += 10 + err = txn.UpdateHeader() + require.NoError(t, err) + txn.Sigs = nil + txn.SignInputs([]cipher.SecKey{genSecret}) + require.NotEqual(t, txn.Out[0].Coins%1e6, uint64(0)) + require.NoError(t, txn.Verify()) + + // Valid + txn = makeTransaction(t) + txn.Out[0].Coins = 10e6 + txn.Out[1].Coins = 1e6 + err = txn.UpdateHeader() + require.NoError(t, err) + require.NoError(t, txn.Verify()) +} + +func TestTransactionVerifyUnsigned(t *testing.T) { + txn, _ := makeTransactionMultipleInputs(t, 2) + err := txn.VerifyUnsigned() + testutil.RequireError(t, err, "Unsigned transaction must contain a null signature") + + // Invalid signature, not empty + // A stable invalid signature must be used because random signatures could appear valid + // Note: Transaction.Verify() only checks that the signature is a minimally valid signature + badSig := "9a0f86874a4d9541f58a1de4db1c1b58765a868dc6f027445d0a2a8a7bddd1c45ea559fcd7bef45e1b76ccdaf8e50bbebd952acbbea87d1cb3f7a964bc89bf1ed5" + txn, _ = makeTransactionMultipleInputs(t, 2) + txn.Sigs[0] = cipher.Sig{} + txn.Sigs[1] = cipher.MustSigFromHex(badSig) + testutil.RequireError(t, txn.VerifyUnsigned(), "Failed to recover pubkey from signature") + + txn.Sigs = nil + err = txn.VerifyUnsigned() + testutil.RequireError(t, err, "Invalid number of signatures") + + // Transaction is unsigned if at least 1 signature is null + txn, _ = makeTransactionMultipleInputs(t, 3) + require.True(t, len(txn.Sigs) > 1) + txn.Sigs[0] = cipher.Sig{} + err = txn.VerifyUnsigned() + require.NoError(t, err) + + // Transaction is unsigned if all signatures are null + for i := range txn.Sigs { + txn.Sigs[i] = cipher.Sig{} + } + err = txn.VerifyUnsigned() + require.NoError(t, err) +} + +func TestTransactionVerifyInput(t *testing.T) { + // Invalid uxIn args + txn := makeTransaction(t) + _require.PanicsWithLogMessage(t, "txn.In != uxIn", func() { + _ = txn.VerifyInputSignatures(nil) //nolint:errcheck + }) + _require.PanicsWithLogMessage(t, "txn.In != uxIn", func() { + _ = txn.VerifyInputSignatures(UxArray{}) //nolint:errcheck + }) + _require.PanicsWithLogMessage(t, "txn.In != uxIn", func() { + _ = txn.VerifyInputSignatures(make(UxArray, 3)) //nolint:errcheck + }) + + // txn.In != txn.Sigs + ux, s := makeUxOutWithSecret(t) + txn = makeTransactionFromUxOut(t, ux, s) + txn.Sigs = []cipher.Sig{} + _require.PanicsWithLogMessage(t, "txn.In != txn.Sigs", func() { + _ = txn.VerifyInputSignatures(UxArray{ux}) //nolint:errcheck + }) + + ux, s = makeUxOutWithSecret(t) + txn = makeTransactionFromUxOut(t, ux, s) + txn.Sigs = append(txn.Sigs, cipher.Sig{}) + _require.PanicsWithLogMessage(t, "txn.In != txn.Sigs", func() { + _ = txn.VerifyInputSignatures(UxArray{ux}) //nolint:errcheck + }) + + // txn.InnerHash != txn.HashInner() + ux, s = makeUxOutWithSecret(t) + txn = makeTransactionFromUxOut(t, ux, s) + txn.InnerHash = cipher.SHA256{} + _require.PanicsWithLogMessage(t, "Invalid Tx Inner Hash", func() { + _ = txn.VerifyInputSignatures(UxArray{ux}) //nolint:errcheck + }) + + // txn.In does not match uxIn hashes + ux, s = makeUxOutWithSecret(t) + txn = makeTransactionFromUxOut(t, ux, s) + _require.PanicsWithLogMessage(t, "Ux hash mismatch", func() { + _ = txn.VerifyInputSignatures(UxArray{UxOut{}}) //nolint:errcheck + }) + + // Unsigned txn + ux, s = makeUxOutWithSecret(t) + txn = makeTransactionFromUxOut(t, ux, s) + txn.Sigs[0] = cipher.Sig{} + err := txn.VerifyInputSignatures(UxArray{ux}) + testutil.RequireError(t, err, "Unsigned input in transaction") + + // Signature signed by someone else + ux, _ = makeUxOutWithSecret(t) + _, s2 := makeUxOutWithSecret(t) + txn = makeTransactionFromUxOut(t, ux, s2) + err = txn.VerifyInputSignatures(UxArray{ux}) + testutil.RequireError(t, err, "Signature not valid for output being spent") + + // Valid + ux, s = makeUxOutWithSecret(t) + txn = makeTransactionFromUxOut(t, ux, s) + err = txn.VerifyInputSignatures(UxArray{ux}) + require.NoError(t, err) +} + +func TestTransactionPushInput(t *testing.T) { + txn := &Transaction{} + ux := makeUxOut(t) + require.NoError(t, txn.PushInput(ux.Hash())) + require.Equal(t, len(txn.In), 1) + require.Equal(t, txn.In[0], ux.Hash()) + txn.In = append(txn.In, make([]cipher.SHA256, math.MaxUint16)...) + ux = makeUxOut(t) + err := txn.PushInput(ux.Hash()) + testutil.RequireError(t, err, "Max transaction inputs reached") +} + +func TestTransactionPushOutput(t *testing.T) { + txn := &Transaction{} + a := makeAddress() + err := txn.PushOutput(a, 100, 150) + require.NoError(t, err) + require.Equal(t, len(txn.Out), 1) + require.Equal(t, txn.Out[0], TransactionOutput{ + Address: a, + Coins: 100, + Hours: 150, + }) + for i := 1; i < 20; i++ { + a := makeAddress() + err := txn.PushOutput(a, uint64(i*100), uint64(i*50)) + require.NoError(t, err) + require.Equal(t, len(txn.Out), i+1) + require.Equal(t, txn.Out[i], TransactionOutput{ + Address: a, + Coins: uint64(i * 100), + Hours: uint64(i * 50), + }) + } + + txn.Out = append(txn.Out, make([]TransactionOutput, math.MaxUint16-len(txn.Out))...) + err = txn.PushOutput(a, 999, 999) + testutil.RequireError(t, err, "Max transaction outputs reached") +} + +func TestTransactionSignInput(t *testing.T) { + txn, seckeys := makeTransactionMultipleInputs(t, 3) + require.True(t, txn.IsFullySigned()) + + // Input is already signed + err := txn.SignInput(seckeys[0], 0) + testutil.RequireError(t, err, "Input already signed") + require.True(t, txn.IsFullySigned()) + + // Input is not signed + txn.Sigs[1] = cipher.Sig{} + require.False(t, txn.IsFullySigned()) + err = txn.SignInput(seckeys[1], 1) + require.NoError(t, err) + require.True(t, txn.IsFullySigned()) + err = txn.SignInput(seckeys[1], 1) + testutil.RequireError(t, err, "Input already signed") + + // Transaction has no sigs; sigs array is initialized + txn.Sigs = nil + require.False(t, txn.IsFullySigned()) + err = txn.SignInput(seckeys[2], 2) + require.NoError(t, err) + require.False(t, txn.IsFullySigned()) + require.Len(t, txn.Sigs, 3) + require.True(t, txn.Sigs[0].Null()) + require.True(t, txn.Sigs[1].Null()) + require.False(t, txn.Sigs[2].Null()) + + // SignInputs on a partially signed transaction fails + require.Panics(t, func() { + txn.SignInputs(seckeys) + }) + + // Signing the rest of the inputs individually works + err = txn.SignInput(seckeys[1], 1) + require.NoError(t, err) + require.False(t, txn.IsFullySigned()) + err = txn.SignInput(seckeys[0], 0) + require.NoError(t, err) + require.True(t, txn.IsFullySigned()) + + // Can use SignInputs on allocated array of empty sigs + txn.Sigs = make([]cipher.Sig, 3) + txn.SignInputs(seckeys) + require.True(t, txn.IsFullySigned()) +} + +func TestTransactionSignInputs(t *testing.T) { + txn := &Transaction{} + // Panics if txns already signed + txn.Sigs = append(txn.Sigs, cipher.Sig{}) + require.Panics(t, func() { txn.SignInputs([]cipher.SecKey{}) }) + // Panics if not enough keys + txn = &Transaction{} + ux, s := makeUxOutWithSecret(t) + err := txn.PushInput(ux.Hash()) + require.NoError(t, err) + ux2, s2 := makeUxOutWithSecret(t) + err = txn.PushInput(ux2.Hash()) + require.NoError(t, err) + err = txn.PushOutput(makeAddress(), 40, 80) + require.NoError(t, err) + require.Equal(t, len(txn.Sigs), 0) + require.Panics(t, func() { txn.SignInputs([]cipher.SecKey{s}) }) + require.Equal(t, len(txn.Sigs), 0) + // Valid signing + h := txn.HashInner() + require.NotPanics(t, func() { txn.SignInputs([]cipher.SecKey{s, s2}) }) + require.Equal(t, len(txn.Sigs), 2) + h2 := txn.HashInner() + require.Equal(t, h2, h) + p := cipher.MustPubKeyFromSecKey(s) + a := cipher.AddressFromPubKey(p) + p = cipher.MustPubKeyFromSecKey(s2) + a2 := cipher.AddressFromPubKey(p) + require.NoError(t, cipher.VerifyAddressSignedHash(a, txn.Sigs[0], cipher.AddSHA256(h, txn.In[0]))) + require.NoError(t, cipher.VerifyAddressSignedHash(a2, txn.Sigs[1], cipher.AddSHA256(h, txn.In[1]))) + require.Error(t, cipher.VerifyAddressSignedHash(a, txn.Sigs[1], h)) + require.Error(t, cipher.VerifyAddressSignedHash(a2, txn.Sigs[0], h)) +} + +func TestTransactionHash(t *testing.T) { + txn := makeTransaction(t) + h := txn.Hash() + h2 := txn.HashInner() + require.NotEqual(t, h, cipher.SHA256{}) + require.NotEqual(t, h2, h) +} + +func TestTransactionUpdateHeader(t *testing.T) { + txn := makeTransaction(t) + h := txn.InnerHash + txn.InnerHash = cipher.SHA256{} + err := txn.UpdateHeader() + require.NoError(t, err) + require.NotEqual(t, txn.InnerHash, cipher.SHA256{}) + require.Equal(t, txn.InnerHash, h) + require.Equal(t, txn.InnerHash, txn.HashInner()) +} + +func TestTransactionHashInner(t *testing.T) { + txn := makeTransaction(t) + + require.NotEqual(t, cipher.SHA256{}, txn.HashInner()) + + // If txn.In is changed, inner hash should change + txn2 := copyTransaction(txn) + ux := makeUxOut(t) + txn2.In[0] = ux.Hash() + require.NotEqual(t, txn, txn2) + require.Equal(t, txn2.In[0], ux.Hash()) + require.NotEqual(t, txn.HashInner(), txn2.HashInner()) + + // If txn.Out is changed, inner hash should change + txn2 = copyTransaction(txn) + a := makeAddress() + txn2.Out[0].Address = a + require.NotEqual(t, txn, txn2) + require.Equal(t, txn2.Out[0].Address, a) + require.NotEqual(t, txn.HashInner(), txn2.HashInner()) + + // If txn.Head is changed, inner hash should not change + txn2 = copyTransaction(txn) + txn.Sigs = append(txn.Sigs, cipher.Sig{}) + require.Equal(t, txn.HashInner(), txn2.HashInner()) +} + +func TestTransactionSerialization(t *testing.T) { + txn := makeTransaction(t) + b, err := txn.Serialize() + require.NoError(t, err) + txn2, err := DeserializeTransaction(b) + require.NoError(t, err) + require.Equal(t, txn, txn2) + + // Check reserializing deserialized txn + b2, err := txn2.Serialize() + require.NoError(t, err) + txn3, err := DeserializeTransaction(b2) + require.NoError(t, err) + require.Equal(t, txn2, txn3) + + // Check hex encode/decode followed by deserialize + s := hex.EncodeToString(b) + sb, err := hex.DecodeString(s) + require.NoError(t, err) + txn4, err := DeserializeTransaction(sb) + require.NoError(t, err) + require.Equal(t, txn2, txn4) + + // Invalid deserialization + require.Panics(t, func() { + MustDeserializeTransaction([]byte{0x04}) + }) + + // SerializeHex + x, err := txn.SerializeHex() + require.NoError(t, err) + txn5, err := DeserializeTransactionHex(x) + require.NoError(t, err) + require.Equal(t, txn, txn5) + + // Invalid hex deserialization + require.Panics(t, func() { + MustDeserializeTransactionHex("foo") + }) + + ss, err := txn.Serialize() + require.NoError(t, err) + require.Equal(t, ss, txn.MustSerialize()) + sshh, err := txn.SerializeHex() + require.NoError(t, err) + require.Equal(t, sshh, txn.MustSerializeHex()) +} + +func TestTransactionOutputHours(t *testing.T) { + txn := Transaction{} + err := txn.PushOutput(makeAddress(), 1e6, 100) + require.NoError(t, err) + err = txn.PushOutput(makeAddress(), 1e6, 200) + require.NoError(t, err) + err = txn.PushOutput(makeAddress(), 1e6, 500) + require.NoError(t, err) + err = txn.PushOutput(makeAddress(), 1e6, 0) + require.NoError(t, err) + hours, err := txn.OutputHours() + require.NoError(t, err) + require.Equal(t, hours, uint64(800)) + + err = txn.PushOutput(makeAddress(), 1e6, math.MaxUint64-700) + require.NoError(t, err) + _, err = txn.OutputHours() + testutil.RequireError(t, err, "Transaction output hours overflow") +} + +func TestTransactionsSize(t *testing.T) { + txns := makeTransactions(t, 10) + var size uint32 + for _, txn := range txns { + encodedLen, err := mathutil.IntToUint32(len(encoder.Serialize(&txn))) + require.NoError(t, err) + size, err = mathutil.AddUint32(size, encodedLen) + require.NoError(t, err) + } + + require.NotEqual(t, size, 0) + s, err := txns.Size() + require.NoError(t, err) + require.Equal(t, s, size) +} + +func TestTransactionsHashes(t *testing.T) { + txns := make(Transactions, 4) + for i := 0; i < len(txns); i++ { + txns[i] = makeTransaction(t) + } + hashes := txns.Hashes() + require.Equal(t, len(hashes), 4) + for i, h := range hashes { + require.Equal(t, h, txns[i].Hash()) + } +} + +func TestTransactionsTruncateBytesTo(t *testing.T) { + txns := makeTransactions(t, 10) + var trunc uint32 + for i := 0; i < len(txns)/2; i++ { + size, err := txns[i].Size() + require.NoError(t, err) + trunc, err = mathutil.AddUint32(trunc, size) + require.NoError(t, err) + } + + // Truncating halfway + txns2, err := txns.TruncateBytesTo(trunc) + require.NoError(t, err) + require.Equal(t, len(txns2), len(txns)/2) + totalSize, err := txns2.Size() + require.NoError(t, err) + require.Equal(t, totalSize, trunc) + + // Stepping into next boundary has same cutoff, must exceed + trunc++ + txns2, err = txns.TruncateBytesTo(trunc) + require.NoError(t, err) + require.Equal(t, len(txns2), len(txns)/2) + totalSize, err = txns2.Size() + require.NoError(t, err) + require.Equal(t, totalSize, trunc-1) + + // Moving to 1 before next level + size5, err := txns[5].Size() + require.NoError(t, err) + require.True(t, size5 >= 2) + trunc, err = mathutil.AddUint32(trunc, size5-2) + require.NoError(t, err) + txns2, err = txns.TruncateBytesTo(trunc) + require.NoError(t, err) + require.Equal(t, len(txns2), len(txns)/2) + + totalSize, err = txns2.Size() + require.NoError(t, err) + size5, err = txns[5].Size() + require.NoError(t, err) + require.Equal(t, totalSize, trunc-size5+1) + + // Moving to next level + trunc++ + txns2, err = txns.TruncateBytesTo(trunc) + require.NoError(t, err) + require.Equal(t, len(txns2), len(txns)/2+1) + size, err := txns2.Size() + require.NoError(t, err) + require.Equal(t, size, trunc) + + // Truncating to full available amt + trunc, err = txns.Size() + require.NoError(t, err) + txns2, err = txns.TruncateBytesTo(trunc) + require.NoError(t, err) + require.Equal(t, txns, txns2) + size, err = txns2.Size() + require.NoError(t, err) + require.Equal(t, size, trunc) + + // Truncating over amount + trunc++ + txns2, err = txns.TruncateBytesTo(trunc) + require.NoError(t, err) + require.Equal(t, txns, txns2) + size, err = txns2.Size() + require.NoError(t, err) + require.Equal(t, size, trunc-1) + + // Truncating to 0 + trunc = 0 + txns2, err = txns.TruncateBytesTo(0) + require.NoError(t, err) + require.Equal(t, len(txns2), 0) + size, err = txns2.Size() + require.NoError(t, err) + require.Equal(t, size, trunc) +} + +func TestVerifyTransactionCoinsSpending(t *testing.T) { + // Input coins overflow + // Insufficient coins + // Destroy coins + + type ux struct { + coins uint64 + hours uint64 + } + + cases := []struct { + name string + inUxs []ux + outUxs []ux + err error + }{ + { + name: "Input coins overflow", + inUxs: []ux{ + { + coins: math.MaxUint64 - 1e6 + 1, + hours: 10, + }, + { + coins: 1e6, + hours: 0, + }, + }, + err: errors.New("Transaction input coins overflow"), + }, + + { + name: "Output coins overflow", + inUxs: []ux{ + { + coins: 10e6, + hours: 10, + }, + }, + outUxs: []ux{ + { + coins: math.MaxUint64 - 10e6 + 1, + hours: 0, + }, + { + coins: 20e6, + hours: 1, + }, + }, + err: errors.New("Transaction output coins overflow"), + }, + + { + name: "Insufficient coins", + inUxs: []ux{ + { + coins: 10e6, + hours: 10, + }, + { + coins: 15e6, + hours: 10, + }, + }, + outUxs: []ux{ + { + coins: 20e6, + hours: 1, + }, + { + coins: 10e6, + hours: 1, + }, + }, + err: errors.New("Insufficient coins"), + }, + + { + name: "Destroyed coins", + inUxs: []ux{ + { + coins: 10e6, + hours: 10, + }, + { + coins: 15e6, + hours: 10, + }, + }, + outUxs: []ux{ + { + coins: 5e6, + hours: 1, + }, + { + coins: 10e6, + hours: 1, + }, + }, + err: errors.New("Transactions may not destroy coins"), + }, + + { + name: "valid", + inUxs: []ux{ + { + coins: 10e6, + hours: 10, + }, + { + coins: 15e6, + hours: 10, + }, + }, + outUxs: []ux{ + { + coins: 10e6, + hours: 11, + }, + { + coins: 10e6, + hours: 1, + }, + { + coins: 5e6, + hours: 0, + }, + }, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + var uxIn, uxOut UxArray + + for _, ch := range tc.inUxs { + uxIn = append(uxIn, UxOut{ + Body: UxBody{ + Coins: ch.coins, + Hours: ch.hours, + }, + }) + } + + for _, ch := range tc.outUxs { + uxOut = append(uxOut, UxOut{ + Body: UxBody{ + Coins: ch.coins, + Hours: ch.hours, + }, + }) + } + + err := VerifyTransactionCoinsSpending(uxIn, uxOut) + require.Equal(t, tc.err, err) + }) + } +} + +func TestVerifyTransactionHoursSpending(t *testing.T) { + // Input hours overflow + // Insufficient hours + // NOTE: does not check for hours overflow, that had to be moved to soft constraints + // NOTE: if uxIn.CoinHours() fails during the addition of earned hours to base hours, + // the error is ignored and treated as 0 hours + + type ux struct { + coins uint64 + hours uint64 + } + + cases := []struct { + name string + inUxs []ux + outUxs []ux + headTime uint64 + err string + }{ + { + name: "Input hours overflow", + inUxs: []ux{ + { + coins: 3e6, + hours: math.MaxUint64 - 1e6 + 1, + }, + { + coins: 1e6, + hours: 1e6, + }, + }, + err: "Transaction input hours overflow", + }, + + { + name: "Insufficient coin hours", + inUxs: []ux{ + { + coins: 10e6, + hours: 10, + }, + { + coins: 15e6, + hours: 10, + }, + }, + outUxs: []ux{ + { + coins: 15e6, + hours: 10, + }, + { + coins: 10e6, + hours: 11, + }, + }, + err: "Insufficient coin hours", + }, + + { + name: "coin hours time calculation overflow", + inUxs: []ux{ + { + coins: 10e6, + hours: 10, + }, + { + coins: 15e6, + hours: 10, + }, + }, + outUxs: []ux{ + { + coins: 10e6, + hours: 11, + }, + { + coins: 10e6, + hours: 1, + }, + { + coins: 5e6, + hours: 0, + }, + }, + headTime: math.MaxUint64, + err: "UxOut.CoinHours: Calculating whole coin seconds overflows uint64 seconds=18446744073709551615 coins=10 uxid=", + }, + + { + name: "Invalid (coin hours overflow when adding earned hours, which is treated as 0, and now enough coin hours)", + headTime: 1e6, + inUxs: []ux{ + { + coins: 10e6, + hours: math.MaxUint64, + }, + }, + outUxs: []ux{ + { + coins: 10e6, + hours: 1, + }, + }, + err: "Insufficient coin hours", + }, + + { + name: "Valid (coin hours overflow when adding earned hours, which is treated as 0, but not sending any hours)", + headTime: 1e6, + inUxs: []ux{ + { + coins: 10e6, + hours: math.MaxUint64, + }, + }, + outUxs: []ux{ + { + coins: 10e6, + hours: 0, + }, + }, + }, + + { + name: "Valid (base inputs have insufficient coin hours, but have sufficient after adjusting coinhours by headTime)", + inUxs: []ux{ + { + coins: 10e6, + hours: 10, + }, + { + coins: 15e6, + hours: 10, + }, + }, + outUxs: []ux{ + { + coins: 15e6, + hours: 10, + }, + { + coins: 10e6, + hours: 11, + }, + }, + headTime: 1492707255, + }, + + { + name: "valid", + inUxs: []ux{ + { + coins: 10e6, + hours: 10, + }, + { + coins: 15e6, + hours: 10, + }, + }, + outUxs: []ux{ + { + coins: 10e6, + hours: 11, + }, + { + coins: 10e6, + hours: 1, + }, + { + coins: 5e6, + hours: 0, + }, + }, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + var uxIn, uxOut UxArray + + for _, ch := range tc.inUxs { + uxIn = append(uxIn, UxOut{ + Body: UxBody{ + Coins: ch.coins, + Hours: ch.hours, + }, + }) + } + + for _, ch := range tc.outUxs { + uxOut = append(uxOut, UxOut{ + Body: UxBody{ + Coins: ch.coins, + Hours: ch.hours, + }, + }) + } + + err := VerifyTransactionHoursSpending(tc.headTime, uxIn, uxOut) + if tc.err == "" { + require.NoError(t, err) + } else { + require.Error(t, err) + require.True(t, strings.HasPrefix(err.Error(), tc.err)) + } + }) + } +} + +func TestTransactionsFees(t *testing.T) { + calc := func(txn *Transaction) (uint64, error) { + return 1, nil + } + + var txns Transactions + + // Nil txns + fee, err := txns.Fees(calc) + require.NoError(t, err) + require.Equal(t, uint64(0), fee) + + txns = append(txns, Transaction{}) + txns = append(txns, Transaction{}) + + // 2 transactions, calc() always returns 1 + fee, err = txns.Fees(calc) + require.NoError(t, err) + require.Equal(t, uint64(2), fee) + + // calc error + failingCalc := func(txn *Transaction) (uint64, error) { + return 0, errors.New("bad calc") + } + _, err = txns.Fees(failingCalc) + testutil.RequireError(t, err, "bad calc") + + // summing of calculated fees overflows + overflowCalc := func(txn *Transaction) (uint64, error) { + return math.MaxUint64, nil + } + + _, err = txns.Fees(overflowCalc) + testutil.RequireError(t, err, "Transactions fee totals overflow") +} + +func TestSortTransactions(t *testing.T) { + n := 6 + var txns Transactions + for i := 0; i < n; i++ { + txn := Transaction{} + err := txn.PushOutput(makeAddress(), 1e6, uint64(i*1e3)) + require.NoError(t, err) + err = txn.UpdateHeader() + require.NoError(t, err) + txns = append(txns, txn) + } + + hashSortedTxns := append(Transactions{}, txns...) + + sort.Slice(hashSortedTxns, func(i, j int) bool { + ihash := hashSortedTxns[i].Hash() + jhash := hashSortedTxns[j].Hash() + return bytes.Compare(ihash[:], jhash[:]) < 0 + }) + + cases := []struct { + name string + feeCalc FeeCalculator + txns Transactions + sortedTxns Transactions + }{ + { + name: "already sorted", + txns: Transactions{txns[0], txns[1]}, + sortedTxns: Transactions{txns[0], txns[1]}, + feeCalc: func(txn *Transaction) (uint64, error) { + return 1e8 - txn.Out[0].Hours, nil + }, + }, + + { + name: "reverse sorted", + txns: Transactions{txns[1], txns[0]}, + sortedTxns: Transactions{txns[0], txns[1]}, + feeCalc: func(txn *Transaction) (uint64, error) { + return 1e8 - txn.Out[0].Hours, nil + }, + }, + + { + name: "hash tiebreaker", + txns: Transactions{hashSortedTxns[1], hashSortedTxns[0]}, + sortedTxns: Transactions{hashSortedTxns[0], hashSortedTxns[1]}, + feeCalc: func(txn *Transaction) (uint64, error) { + return 1e8, nil + }, + }, + + { + name: "invalid fee multiplication is capped", + txns: Transactions{txns[1], txns[2], txns[0]}, + sortedTxns: Transactions{txns[2], txns[0], txns[1]}, + feeCalc: func(txn *Transaction) (uint64, error) { + if txn.Hash() == txns[2].Hash() { + return math.MaxUint64 / 2, nil + } + return 1e8 - txn.Out[0].Hours, nil + }, + }, + + { + name: "failed fee calc is filtered", + txns: Transactions{txns[1], txns[2], txns[0]}, + sortedTxns: Transactions{txns[0], txns[1]}, + feeCalc: func(txn *Transaction) (uint64, error) { + if txn.Hash() == txns[2].Hash() { + return 0, errors.New("fee calc failed") + } + return 1e8 - txn.Out[0].Hours, nil + }, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + txns, err := SortTransactions(tc.txns, tc.feeCalc) + require.NoError(t, err) + require.Equal(t, tc.sortedTxns, txns) + }) + } +} + +func TestTransactionSignedUnsigned(t *testing.T) { + txn, _ := makeTransactionMultipleInputs(t, 2) + require.True(t, txn.IsFullySigned()) + require.True(t, txn.hasNonNullSignature()) + require.False(t, txn.IsFullyUnsigned()) + require.False(t, txn.hasNullSignature()) + + txn.Sigs[1] = cipher.Sig{} + require.False(t, txn.IsFullySigned()) + require.True(t, txn.hasNonNullSignature()) + require.False(t, txn.IsFullyUnsigned()) + require.True(t, txn.hasNullSignature()) + + txn.Sigs[0] = cipher.Sig{} + require.False(t, txn.IsFullySigned()) + require.False(t, txn.hasNonNullSignature()) + require.True(t, txn.IsFullyUnsigned()) + require.True(t, txn.hasNullSignature()) + + txn.Sigs = nil + require.False(t, txn.IsFullySigned()) + require.False(t, txn.hasNonNullSignature()) + require.True(t, txn.IsFullyUnsigned()) + require.False(t, txn.hasNullSignature()) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/coin/ux_body_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/coin/ux_body_skyencoder.go new file mode 100644 index 00000000..f5e4026a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/coin/ux_body_skyencoder.go @@ -0,0 +1,138 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package coin + +import "github.com/SkycoinProject/skycoin/src/cipher/encoder" + +// encodeSizeUxBody computes the size of an encoded object of type UxBody +func encodeSizeUxBody(obj *UxBody) uint64 { + i0 := uint64(0) + + // obj.SrcTransaction + i0 += 32 + + // obj.Address.Version + i0++ + + // obj.Address.Key + i0 += 20 + + // obj.Coins + i0 += 8 + + // obj.Hours + i0 += 8 + + return i0 +} + +// encodeUxBody encodes an object of type UxBody to a buffer allocated to the exact size +// required to encode the object. +func encodeUxBody(obj *UxBody) ([]byte, error) { + n := encodeSizeUxBody(obj) + buf := make([]byte, n) + + if err := encodeUxBodyToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeUxBodyToBuffer encodes an object of type UxBody to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeUxBodyToBuffer(buf []byte, obj *UxBody) error { + if uint64(len(buf)) < encodeSizeUxBody(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.SrcTransaction + e.CopyBytes(obj.SrcTransaction[:]) + + // obj.Address.Version + e.Uint8(obj.Address.Version) + + // obj.Address.Key + e.CopyBytes(obj.Address.Key[:]) + + // obj.Coins + e.Uint64(obj.Coins) + + // obj.Hours + e.Uint64(obj.Hours) + + return nil +} + +// decodeUxBody decodes an object of type UxBody from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeUxBody(buf []byte, obj *UxBody) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.SrcTransaction + if len(d.Buffer) < len(obj.SrcTransaction) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.SrcTransaction[:], d.Buffer[:len(obj.SrcTransaction)]) + d.Buffer = d.Buffer[len(obj.SrcTransaction):] + } + + { + // obj.Address.Version + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Address.Version = i + } + + { + // obj.Address.Key + if len(d.Buffer) < len(obj.Address.Key) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Address.Key[:], d.Buffer[:len(obj.Address.Key)]) + d.Buffer = d.Buffer[len(obj.Address.Key):] + } + + { + // obj.Coins + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Coins = i + } + + { + // obj.Hours + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Hours = i + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeUxBodyExact decodes an object of type UxBody from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeUxBodyExact(buf []byte, obj *UxBody) error { + if n, err := decodeUxBody(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/coin/ux_body_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/coin/ux_body_skyencoder_test.go new file mode 100644 index 00000000..6f01f3b9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/coin/ux_body_skyencoder_test.go @@ -0,0 +1,421 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package coin + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +func newEmptyUxBodyForEncodeTest() *UxBody { + var obj UxBody + return &obj +} + +func newRandomUxBodyForEncodeTest(t *testing.T, rand *mathrand.Rand) *UxBody { + var obj UxBody + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenUxBodyForEncodeTest(t *testing.T, rand *mathrand.Rand) *UxBody { + var obj UxBody + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilUxBodyForEncodeTest(t *testing.T, rand *mathrand.Rand) *UxBody { + var obj UxBody + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderUxBody(t *testing.T, obj *UxBody) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeUxBody(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeUxBody() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeUxBody(obj) + if err != nil { + t.Fatalf("encodeUxBody failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeUxBody produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeUxBody()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeUxBodyToBuffer(data3, obj); err != nil { + t.Fatalf("encodeUxBodyToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 UxBody + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 UxBody + if n, err := decodeUxBody(data2, &obj3); err != nil { + t.Fatalf("decodeUxBody failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeUxBody bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeUxBody()") + } + + // Decode, excess buffer + var obj4 UxBody + n, err := decodeUxBody(data3, &obj4) + if err != nil { + t.Fatalf("decodeUxBody failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeUxBody bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeUxBody bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeUxBody()") + } + + // DecodeExact + var obj5 UxBody + if err := decodeUxBodyExact(data2, &obj5); err != nil { + t.Fatalf("decodeUxBody failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeUxBody()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeUxBody(data4, &obj3); err != nil { + t.Fatalf("decodeUxBody failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeUxBody bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderUxBody(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *UxBody + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptyUxBodyForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomUxBodyForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenUxBodyForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilUxBodyForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderUxBody(t, tc.obj) + }) + } +} + +func decodeUxBodyExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj UxBody + if _, err := decodeUxBody(buf, &obj); err == nil { + t.Fatal("decodeUxBody: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeUxBody: expected error %q, got %q", expectedErr, err) + } +} + +func decodeUxBodyExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj UxBody + if err := decodeUxBodyExact(buf, &obj); err == nil { + t.Fatal("decodeUxBodyExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeUxBodyExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderUxBodyDecodeErrors(t *testing.T, k int, tag string, obj *UxBody) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeUxBody(obj) + buf, err := encodeUxBody(obj) + if err != nil { + t.Fatalf("encodeUxBody failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeUxBodyExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeUxBodyExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeUxBodyExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeUxBodyExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeUxBodyExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderUxBodyDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptyUxBodyForEncodeTest() + fullObj := newRandomUxBodyForEncodeTest(t, rand) + testSkyencoderUxBodyDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderUxBodyDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/coin/ux_head_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/coin/ux_head_skyencoder.go new file mode 100644 index 00000000..5563be78 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/coin/ux_head_skyencoder.go @@ -0,0 +1,93 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package coin + +import "github.com/SkycoinProject/skycoin/src/cipher/encoder" + +// encodeSizeUxHead computes the size of an encoded object of type UxHead +func encodeSizeUxHead(obj *UxHead) uint64 { + i0 := uint64(0) + + // obj.Time + i0 += 8 + + // obj.BkSeq + i0 += 8 + + return i0 +} + +// encodeUxHead encodes an object of type UxHead to a buffer allocated to the exact size +// required to encode the object. +func encodeUxHead(obj *UxHead) ([]byte, error) { + n := encodeSizeUxHead(obj) + buf := make([]byte, n) + + if err := encodeUxHeadToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeUxHeadToBuffer encodes an object of type UxHead to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeUxHeadToBuffer(buf []byte, obj *UxHead) error { + if uint64(len(buf)) < encodeSizeUxHead(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Time + e.Uint64(obj.Time) + + // obj.BkSeq + e.Uint64(obj.BkSeq) + + return nil +} + +// decodeUxHead decodes an object of type UxHead from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeUxHead(buf []byte, obj *UxHead) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Time + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Time = i + } + + { + // obj.BkSeq + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.BkSeq = i + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeUxHeadExact decodes an object of type UxHead from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeUxHeadExact(buf []byte, obj *UxHead) error { + if n, err := decodeUxHead(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/coin/ux_head_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/coin/ux_head_skyencoder_test.go new file mode 100644 index 00000000..8792d519 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/coin/ux_head_skyencoder_test.go @@ -0,0 +1,421 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package coin + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +func newEmptyUxHeadForEncodeTest() *UxHead { + var obj UxHead + return &obj +} + +func newRandomUxHeadForEncodeTest(t *testing.T, rand *mathrand.Rand) *UxHead { + var obj UxHead + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenUxHeadForEncodeTest(t *testing.T, rand *mathrand.Rand) *UxHead { + var obj UxHead + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilUxHeadForEncodeTest(t *testing.T, rand *mathrand.Rand) *UxHead { + var obj UxHead + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderUxHead(t *testing.T, obj *UxHead) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeUxHead(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeUxHead() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeUxHead(obj) + if err != nil { + t.Fatalf("encodeUxHead failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeUxHead produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeUxHead()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeUxHeadToBuffer(data3, obj); err != nil { + t.Fatalf("encodeUxHeadToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 UxHead + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 UxHead + if n, err := decodeUxHead(data2, &obj3); err != nil { + t.Fatalf("decodeUxHead failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeUxHead bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeUxHead()") + } + + // Decode, excess buffer + var obj4 UxHead + n, err := decodeUxHead(data3, &obj4) + if err != nil { + t.Fatalf("decodeUxHead failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeUxHead bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeUxHead bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeUxHead()") + } + + // DecodeExact + var obj5 UxHead + if err := decodeUxHeadExact(data2, &obj5); err != nil { + t.Fatalf("decodeUxHead failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeUxHead()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeUxHead(data4, &obj3); err != nil { + t.Fatalf("decodeUxHead failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeUxHead bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderUxHead(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *UxHead + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptyUxHeadForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomUxHeadForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenUxHeadForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilUxHeadForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderUxHead(t, tc.obj) + }) + } +} + +func decodeUxHeadExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj UxHead + if _, err := decodeUxHead(buf, &obj); err == nil { + t.Fatal("decodeUxHead: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeUxHead: expected error %q, got %q", expectedErr, err) + } +} + +func decodeUxHeadExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj UxHead + if err := decodeUxHeadExact(buf, &obj); err == nil { + t.Fatal("decodeUxHeadExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeUxHeadExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderUxHeadDecodeErrors(t *testing.T, k int, tag string, obj *UxHead) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeUxHead(obj) + buf, err := encodeUxHead(obj) + if err != nil { + t.Fatalf("encodeUxHead failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeUxHeadExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeUxHeadExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeUxHeadExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeUxHeadExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeUxHeadExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderUxHeadDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptyUxHeadForEncodeTest() + fullObj := newRandomUxHeadForEncodeTest(t, rand) + testSkyencoderUxHeadDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderUxHeadDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/consensus/blockstat.go b/vendor/github.com/SkycoinProject/skycoin/src/consensus/blockstat.go new file mode 100644 index 00000000..2d853848 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/consensus/blockstat.go @@ -0,0 +1,627 @@ +//nolint +// 20160901 - Initial version by user johnstuartmill, +// public key 02fb4acf944c84d48341e3c1cb14d707034a68b7f931d6be6d732bec03597d6ff6 +// 20161025 - Code revision by user johnstuartmill. +package consensus + +import ( + "bytes" + "container/heap" + "fmt" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go" +) + +//////////////////////////////////////////////////////////////////////////////// +// +// +// +//////////////////////////////////////////////////////////////////////////////// +// How many (hash,signer_pubkey) pairs to acquire for decision-making. +// This also limits forwarded traffic, because the messages in excess +// of this limit are discarded hence not forwarded: +var Cfg_consensus_max_candidate_messages = 10 + +// +//////////////////////////////////////////////////////////////////////////////// +var all_zero_hash = cipher.SHA256{} +var all_zero_sig = cipher.Sig{} + +//////////////////////////////////////////////////////////////////////////////// +// +// BlockStat +// +//////////////////////////////////////////////////////////////////////////////// +type BlockStat struct { + priority int // Mandatory item for an element of container/heap + index int // Mandatory item for an element of container/heap + + // [JSM:] For a given block sequence number (or 'seqno'), we + // want + // + // map: hash -> set + // + // The 'pubkey' is recovered from '(sig,hash)' pair. Also, we + // want the number of unique 'pubkey', which is the number of + // independent block-makers. It shows how reliable the averaging + // would be. + // + // [JSM:] We need to put an upper limit to the + // ConcensusParticipant's bandwidth requirement in order to + // prevent a certain kind of attack on the network. As an + // implementation of that requirement, we stop collecting (hence, + // stop propagating) the blocks with the same sequence number + // after we have observed a sufficient number of builders. + // + // [JSM:] The hash that has largest number of unique pubkeys is + // selected as the block for the given seqno. + + // [JSM:] This approach is to guard against what can be called an + // "amplification attack": A node/pubkey with many subscribers + // publishes a block that says "Earth is flat". The above pubkey + // is (and has been) trusted by many, but at the moment the pubkey + // has been compelled, say, under a threat of burning on a steak, + // to publish a clearly-wrong block. You, as a listening pubkey, + // have N1 nodes as publisher; + // each of them is connected, or have a route, to the + // above pubkey that is being coersed. Meanwhile, there are N2 + // pubkeys that published "Earth is round" block. If you neglect + // to check the origin of the block [i.e. who signed it], and if + // it happens that N1 >> N2 (e.g. 1000 >> 100), then you would + // conclude, quite incorrectly, that the network agrees that + // "Earth is flat". If, however, you take into account the origin + // of the block, you would see that all N1 blocks are merely + // duplicates sent out with the intention to manipulate network + // consensus, while all N2 messages came from unique + // signers. Therefore you conclude that you have only one block + // "Earth is flat" and many blocks "Earth is round", e.g. 1 << + // 100. So you chose "Earth is round" block. The idea of this + // approach (or a guard, if you will) can be expressesd as + // follows: "Q: Can one billion peasants be all wrong + // simultaneously? A: Yes, if they learn what they should think + // from the same wall-glued newspaper." + // + // (Side node: this approach has several useful side-effects + // that we shall not discuss here.) + + hash2info map[cipher.SHA256]HashCandidate + + // FOR NOW this is just a label and is used to + // set/read. Invariant: all Blocks stored/referenced here have + // same seqno. + seqno uint64 + + // After the class instance was used to select Block for + // consensus, we do not update the stats. + frozen bool + + // This is to limit traffic due to forwarding. A side-effect is + // limited statistics. See'Cfg_consensus_max_candidate_messages'. + // Explanation: every node in the network is allowed to make (and + // publish) blocks, but we do not wish to receive all of these + // messages. + accept_count int + + // + // BEG debugging/diagnostics + // + debug_pubkey2count map[cipher.PubKey]int + debug_count int + + // The number of events that would have qualified to be utilized, + // but were rejected due to 'frozen == true' + debug_reject_count int + + // Ignored due to limitations on how much we want to accept and forward + debug_neglect_count int + + debug_usage int + // + // END debugging/diagnostics + // +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockStat) is_consistent() bool { + for _, info := range self.hash2info { + if !info.is_consistent() { + return false + } + } + // TODO 1: Need to extract pubkey from 'self.hash2info' and from + // 'self.debug_pubkey2count', and make sure they are the same. + + // TODO 2: make sure all debug counters are consistent. + return true +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockStat) Init() { + self.priority = 0 + self.index = -1 + + self.hash2info = make(map[cipher.SHA256]HashCandidate) + self.seqno = 0 + self.frozen = false + self.accept_count = 0 + // + self.debug_pubkey2count = make(map[cipher.PubKey]int) + self.debug_count = 0 + self.debug_reject_count = 0 + self.debug_neglect_count = 0 + self.debug_usage = 0 +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockStat) GetSeqno() uint64 { + return self.seqno +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockStat) Clear() { + + for i, info := range self.hash2info { + info.Clear() + delete(self.hash2info, i) + } + self.seqno = 0 + self.frozen = false + self.accept_count = 0 + // + for i, _ := range self.debug_pubkey2count { + delete(self.debug_pubkey2count, i) + } + self.debug_count = 0 + self.debug_reject_count = 0 + // NOTE: 'self.debug_usage' is kept as-is +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockStat) try_add_hash_and_sig( + hash cipher.SHA256, + sig cipher.Sig) int { + + if self.frozen { + // To get a more accurate number of rejects, one would need to + // do as below, except insertion/updating. However, we do not + // want to incurr a calculation in order to get a more + // accurate debug numbers. So we simply: + self.debug_reject_count += 1 + return 3 + } + + // 2016090* ROBUSTNESS: We need to put a limit on the number of + // (signer_pubkey,hash) pairs that we process and forward. One + // reason is to prevent an attack in which the attacker launches a + // large number of nodes each of which make valid blocks, thus + // causing large traffic that can potentially degrade the network + // performance. Example: when we receive, say 63 + // (signer_pubkey,hash) pairs for a given seqno, we stop listening + // for the updates. Say, the breakdown is: hash H1 from 50 + // signers, hash H2 from 10, hash H3 from 2 and hash H4 from 1. + // We make a local decision to choose H1. + if self.accept_count >= Cfg_consensus_max_candidate_messages { + self.debug_neglect_count += 1 + return 1 // same as skip + } + + // 20160913 Remember that we move those BlockStat that are old + // enought (seqno difference is used as a measure of time + // difference) to BlockChain, so that the storage requerement for + // each node is now smaller. Yet we keep the limits to avoid + // excessive forwarding. + + // At the end of the function, one of them must be 'true'. + action_update := false + action_skip := false + action_insert := false + + var info HashCandidate + + if true { + var have bool + + info, have = self.hash2info[hash] + + if !have { + info = HashCandidate{} + info.Init() + action_insert = true + } else { + if _, saw := info.sig2none[sig]; saw { + action_skip = true + } else { + action_update = true + } + } + } + + if action_insert || action_update { + + if sig == all_zero_sig || hash == all_zero_hash { // Hack + return 4 // <<<<<<<< + } + + // PERFORMANCE: This is an expensive call: + signer_pubkey, err := cipher.PubKeyFromSig(sig, hash) + if err != nil { + return 4 // <<<<<<<< + } + + // Now do the check that we could not do prior to + // obtaining 'signer_pubkey': + if _, have := info.pubkey2sig[signer_pubkey]; have { + // WARNING: ROBUSTNESS: The pubkey 'signer_pubkey' has + // already published data with the same hash and same + // seqno. This is not a duplicate data: the duplicates + // have been intercepted earlier bsaged in (hash,sig) + // pair; instead, the pubkey signed the block again and + // published the result. So this can be a bug/mistake or + // an attempt to artificially increase the traffic on our + // network. + self.debug_reject_count += 1 + + action_update = false + action_skip = true + action_insert = false + + fmt.Printf("WARNING: %p, Detected malicious publish from"+ + " pubkey=%s for hash=%s sig=%s\n", &info, + signer_pubkey.Hex()[:8], hash.Hex()[:8], sig.Hex()[:8]) + } + + // These bools could have change, see above: + if action_insert || action_update { + if false { + fmt.Printf("Calling %p->ObserveSigAndPubkey(sig=%s,"+ + " signer_pubkey=%s), hash=%s\n", &info, + sig.Hex()[:8], signer_pubkey.Hex()[:8], hash.Hex()[:8]) + } + info.ObserveSigAndPubkey(sig, signer_pubkey) + self.accept_count += 1 + } + } + + if action_insert { + self.hash2info[hash] = info + } + + self.debug_count += 1 + self.debug_usage += 1 + + //if !(action_update || action_skip || action_insert) { + // panic("Inconsistent BlockStat::try_add_hash_and_sig()") + // return -1 + //} + + if action_update || action_insert { + return 0 + } + + if action_skip { + return 1 + } + + return -1 +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockStat) GetBestHashPubkeySig() ( + cipher.SHA256, + cipher.PubKey, + cipher.Sig) { + + var best_n int = -1 + + var best_h cipher.SHA256 + + for hash, info := range self.hash2info { + n := len(info.pubkey2sig) + + if best_n < n { + best_n = n + best_h = hash + } else if best_n == n { + // Resolve ties by comparing hashes: + if bytes.Compare(best_h[:], hash[:]) < 0 { + // Updating 'best_n' is unnecessary, but keep it here + // to help avoiding cut-and-paste errors: + best_n = n + best_h = hash + } + } + } + + if best_n <= 0 { + return cipher.SHA256{}, cipher.PubKey{}, cipher.Sig{} // <<<<<<<< + } + + var best_p cipher.PubKey + var best_s cipher.Sig + + // Resolve ties (if any) by comparing signatures. Do not use + // pubkey for this purpose as we do not want, for example, to have + // same pubkey sign most of blocks. + + // NOTE 1: We want a deterministic algo here, so that each + // ConsensusParticipant across the network would choose same + // (hash,sig) to go to blockchain. + + // NOTE 2: A simplified version of consensus can be imagined, in + // which ConsensusParticipant rejects a hash if it saw it already; + // this results in local blockchains with same transactions [when + // consensus id reached] but *different* signers. Which is not + // good from general entropy considerations. + initialized := false + + for pubkey, sig := range self.hash2info[best_h].pubkey2sig { + if initialized { + if bytes.Compare(best_s[:], sig[:]) < 0 { + best_p = pubkey + best_s = sig + } + } else { + best_p = pubkey + best_s = sig + + initialized = true + } + } + + return best_h, best_p, best_s +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockStat) Print() { + + hash, _, _ := self.GetBestHashPubkeySig() + fmt.Printf("BlockStat={count(hash)=%d,count(pubkey)=%d,count(event)=%d"+ + ",accept_count=%d,seqno=%d,debug_usage=%d,frozen=%t,"+ + "debug_reject_count=%d,debug_neglect_count=%d,best_hash=%s}", + len(self.hash2info), + len(self.debug_pubkey2count), + self.debug_count, + self.accept_count, + self.seqno, + self.debug_usage, + self.frozen, + self.debug_reject_count, + self.debug_neglect_count, + hash.Hex()[:8]) +} + +//////////////////////////////////////////////////////////////////////////////// +type PriorityQueue []*BlockStat // Contained in BlockStatQueue + +// NOTE: a shallow copy (of the slice) is made here +func (pq PriorityQueue) Len() int { + return len(pq) +} + +// NOTE: a shallow copy (of the slice) is made here +func (pq PriorityQueue) Less(i int, j int) bool { + return pq[i].priority < pq[j].priority +} + +// NOTE: a shallow copy (of the slice) is made here +func (pq PriorityQueue) Swap(i int, j int) { + pq[i], pq[j] = pq[j], pq[i] + pq[i].index = i + pq[j].index = j +} +func (pq *PriorityQueue) Push(x interface{}) { + n := len(*pq) + item := x.(*BlockStat) + item.index = n + *pq = append(*pq, item) +} +func (pq *PriorityQueue) Pop() interface{} { + old := *pq + n := len(old) + item := old[n-1] + item.index = -1 // for safety + *pq = old[0 : n-1] + return item +} + +// update modifies the priority and value of an Item in the queue. +func (pq *PriorityQueue) update_priority(item *BlockStat, priority int) { + item.priority = priority + heap.Fix(pq, item.index) +} + +//////////////////////////////////////////////////////////////////////////////// +// +// BlockStatQueue +// +//////////////////////////////////////////////////////////////////////////////// +type BlockStatQueue struct { + // BlockStatQueue is a wrapper around a priority queue; the latter + // is prioretized by Block seqno. The wrapper provides setters and + // getters. The setters trim queue size as appropriate. + queue PriorityQueue +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockStatQueue) is_consistent() bool { + // TODO: implement. + return true +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockStatQueue) Len() int { + return len(self.queue) +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockStatQueue) Print() { + n := len(self.queue) + fmt.Printf("BlockStatQueue={n=%d", n) + + for i := 0; i < n; i++ { + fmt.Print(",") + self.queue[i].Print() + } + + fmt.Printf("}") +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockStatQueue) try_append_to_BlockStatQueue( + blockPtr *BlockBase) int { + + // Use a superficial, quick test here. A thorough check will be + // done later in this function. + if secp256k1.VerifySignatureValidity(blockPtr.Sig[:]) != 1 { + return 4 // Error + } + + if blockPtr.Sig == all_zero_sig || blockPtr.Hash == all_zero_hash { // Hack + return 4 // <<<<<<<< + } + + // At the end of the function, one of them must be 'true'. + action_update := false + action_skip := false + action_insert := false + + var update_index int = -1 + + n := len(self.queue) + if n > 0 { + f := self.queue[0] + l := self.queue[n-1] + // ROBUSTNESS Set a max to what 'f - l' can be. For example, + // if the limit is 100 and the queue has only one block with + // seqno 7, then do not accept blocks with seqno >= + // 107. This is to prevent Memory Overflow attack. + + if blockPtr.Seqno < f.seqno { + // TODO: Accept, unless 'f.seqno - 1' is already in the + // (consented) blockchain; otherwise reject/ignore. FOR + // NOW, accept unless queue length would be too large. + + // + // + // TODO: evaluae -------------------- URGENT !!!!! + // + // + already_in_blockchain := false + // + // + // + // + if already_in_blockchain { + fmt.Print("DEBUG Already in blockchain. Ignoring block.\n") + action_skip = true + } else if l.seqno-blockPtr.Seqno > + Cfg_consensus_candidate_max_seqno_gap { + fmt.Printf("DEBUG proposed=%d, first=%d, last=%d. Too far"+ + " behind. Ignoring block.\n", + blockPtr.Seqno, f.seqno, l.seqno) + action_skip = true + } else { + action_insert = true + } + + } else if blockPtr.Seqno > l.seqno { + // TODO: Accept, unless 'blockPtr.seqno > l.seqno' is + // large, e.g. the perceived block is way ahead of the + // last block in the queue. FOR NOW, accept unless queue + // length would be too large. + if blockPtr.Seqno-f.seqno > + Cfg_consensus_candidate_max_seqno_gap { + fmt.Printf("DEBUG proposed=%d, first=%d, last=%d. Too far"+ + " ahead. Ignoring block.\n", + blockPtr.Seqno, f.seqno, l.seqno) + action_skip = true + } else { + action_insert = true + } + } else { + // The 'blockPtr.seqno' is in between, so we need to insert + // a new or find the element with same seqno and update it. + + // PERFORMANCE TODO: Avoid linear search by using a + // lookup, or using other properties of Heap object. If + // n/a, use Binary Search. + S := blockPtr.Seqno + found := false + for i := range self.queue { + s := self.queue[i].seqno + if s < S { + // keep searching + } else if s == S { + found = true + action_update = true + update_index = i + break + } else if s > S { + break + } + } + if !found { + action_insert = true + } + } + } else { + // The queue is empty, so insert the block. + action_insert = true + } + n = -1 // guard + + //if !(action_update || action_skip || action_insert) { + // panic("Inconsistent") + // return -1 + //} + + var status_code int = 1 + + if !action_skip { + + // TAG Consensus: if we receive 100 copies of a Block (or + // Block's hash) that originated from the same block maker, + // then the statistical significance of them is not higher + // than that of only 1 copy. The significance is roughly + // proportional to sqrt of the number of different [ideally, + // independent-thinking] signers for a Block with the same + // hash and same seqno. + + should_forward_to_subscribers := false + + if action_update { + + res := self.queue[update_index]. + try_add_hash_and_sig(blockPtr.Hash, blockPtr.Sig) + if res == 0 { + should_forward_to_subscribers = true + } + + } else if action_insert { + + bs := BlockStat{} + bs.Init() + bs.seqno = blockPtr.Seqno + res := bs.try_add_hash_and_sig(blockPtr.Hash, blockPtr.Sig) + + if res == 0 { + // Keep these two together: + heap.Push(&self.queue, &bs) + self.queue.update_priority(&bs, int(blockPtr.Seqno)) + // TODO: Above, try to remove the cast. + + should_forward_to_subscribers = true + } + } + + if should_forward_to_subscribers { + status_code = 0 + } + + } + + return status_code +} + +//////////////////////////////////////////////////////////////////////////////// diff --git a/vendor/github.com/SkycoinProject/skycoin/src/consensus/connection_manager.go b/vendor/github.com/SkycoinProject/skycoin/src/consensus/connection_manager.go new file mode 100644 index 00000000..e8a2cf3b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/consensus/connection_manager.go @@ -0,0 +1,25 @@ +//nolint +// 20160901 - Initial version by user johnstuartmill, +// public key 02fb4acf944c84d48341e3c1cb14d707034a68b7f931d6be6d732bec03597d6ff6 +// 20161025 - Code revision by user johnstuartmill. +package consensus + +//"github.com/SkycoinProject/skycoin/src/cipher" + +//////////////////////////////////////////////////////////////////////////////// +type ConnectionManagerInterface interface { + SendBlockToAllMySubscriber(blockPtr *BlockBase) + + Print() // For debugging + + // IMPORTANT: When connection manager (i.e. an implementation of + // this interface) receives a message with 'BlockBase', the + // manager should call + // + // ConsensusParticipant.OnBlockHeaderArrived(blockPtr *BlockBase) + // + // function. This is not currently enforced, but is required for the + // consensus to work properly. +} + +//////////////////////////////////////////////////////////////////////////////// diff --git a/vendor/github.com/SkycoinProject/skycoin/src/consensus/consensus.go b/vendor/github.com/SkycoinProject/skycoin/src/consensus/consensus.go new file mode 100644 index 00000000..eb790bb0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/consensus/consensus.go @@ -0,0 +1,257 @@ +//nolint +// 20160901 - Initial version by user johnstuartmill, +// public key 02fb4acf944c84d48341e3c1cb14d707034a68b7f931d6be6d732bec03597d6ff6 +// 20161025 - Code revision by user johnstuartmill. +package consensus + +import ( + "fmt" + + "github.com/SkycoinProject/skycoin/src/cipher" +) + +//////////////////////////////////////////////////////////////////////////////// +// +// +// +//////////////////////////////////////////////////////////////////////////////// +var Cfg_debug_block_duplicate bool = false +var Cfg_debug_block_out_of_sequence bool = true +var Cfg_debug_block_accepted bool = false +var Cfg_debug_HashCandidate bool = false + +// How many blocks we hold in memory. Older blocks are expected (not +// implemented yest as of 20160920) to be written to disk. +var Cfg_blockchain_tail_length int = 100 + +// To limit memory use and prevent some mild attacks: +var Cfg_consensus_candidate_max_seqno_gap uint64 = 10 + +// When to decide on selecting the best hash from BlockStat +// so that it can be moved to BlockChain: +var Cfg_consensus_waiting_time_as_seqno_diff uint64 = 7 + +// How many (hash,signer_pubkey) pairs to acquire for decision-making. +// This also limits forwarded traffic, because the messages in excess +// of this limit are discarded hence not forwarded: +//var Cfg_consensus_max_candidate_messages = 10 + +// +//////////////////////////////////////////////////////////////////////////////// +//var all_zero_hash = cipher.SHA256{} +//var all_zero_sig = cipher.Sig{} + +//////////////////////////////////////////////////////////////////////////////// +// +// BlockBase +// +//////////////////////////////////////////////////////////////////////////////// +type BlockBase struct { + Sig cipher.Sig + Hash cipher.SHA256 + Seqno uint64 +} + +//func (self *BlockBase) GetSig() cipher.Sig { return self.Sig } +//func (self *BlockBase) GetHash() cipher.SHA256 { return self.Hash } +//func (self *BlockBase) GetSeqno() uint64 { return self.Seqno } + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockBase) Init( + sig cipher.Sig, + hash cipher.SHA256, + seqno uint64) { + + self.Sig = sig + self.Hash = hash + self.Seqno = seqno +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockBase) Print() { + fmt.Printf("BlockBase={Sig=%s,Hash=%s,Seqno=%d}", + self.Sig.Hex()[:8], self.Hash.Hex()[:8], self.Seqno) +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockBase) String() string { + return fmt.Sprintf("BlockBase={Sig=%s,Hash=%s,Seqno=%d}", + self.Sig.Hex()[:8], self.Hash.Hex()[:8], self.Seqno) +} + +//////////////////////////////////////////////////////////////////////////////// +// +// BlockchainTail is the most recent part of blockchain that is held in memory +// +//////////////////////////////////////////////////////////////////////////////// +type BlockchainTail struct { + // The tail of Blockchain that we keep. + // PERFORMANCE: TODO: Use a fixed-length double-ended queue + + blockPtr_slice []*BlockBase + // This is for a lookup of content + hash_to_blockPtr_map map[cipher.SHA256]*BlockBase +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockchainTail) Init() { + self.hash_to_blockPtr_map = make(map[cipher.SHA256]*BlockBase) +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockchainTail) is_consistent() bool { + // TODO Validate + // blockPtr_slice + // and + // hash_to_blockPtr_map + // against each other + return true +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockchainTail) append_nocheck(blockPtr *BlockBase) { + n := len(self.blockPtr_slice) + if n+1 > Cfg_blockchain_tail_length { + // Trim the size: + b0p := self.blockPtr_slice[0] + delete(self.hash_to_blockPtr_map, b0p.Hash) // pop 1 of 2 + b0p = nil + self.blockPtr_slice[0] = nil + self.blockPtr_slice = self.blockPtr_slice[1:] // pop 2 of 2 + } + // Append + self.hash_to_blockPtr_map[blockPtr.Hash] = blockPtr // push 1 of 2 + self.blockPtr_slice = append(self.blockPtr_slice, blockPtr) // push 2 of 2 +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockchainTail) try_append_to_BlockchainTail(blockPtr *BlockBase) int { + n := len(self.blockPtr_slice) + if n > 0 { + // Step 1 of 2: check for presence: + _, have := self.hash_to_blockPtr_map[blockPtr.Hash] + if have { + if Cfg_debug_block_duplicate { + // Duplicate hash detected. Silently ignore it. We + // expect to have this condition often enough. + fmt.Printf("Block is duplicate so ignored.\n") + } + return 1 // Duplicate hash + } + // Step 2 of 2: check for sequence numbers: + curr := self.blockPtr_slice[n-1].Seqno // Most recent + next := curr + 1 + prop := blockPtr.Seqno + if prop < next { // uint cmp + if Cfg_debug_block_out_of_sequence { + fmt.Printf("Block's seqno is too low (%d vs %d), block"+ + " ignored.\n", prop, curr) + } + return 2 // SeqNo too low + } else if prop > next { // uint cmp + if Cfg_debug_block_out_of_sequence { + fmt.Printf("Block's seqno is too high (%d vs %d), block"+ + " ignored.\n", prop, curr) + } + return 3 // SeqNo too high + } + } + self.append_nocheck(blockPtr) + if Cfg_debug_block_accepted { + fmt.Printf("Block is accepted, len(blockchain)=%d.\n", + len(self.blockPtr_slice)) + } + return 0 // Inserted +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockchainTail) GetNextSeqNo() uint64 { + n := len(self.blockPtr_slice) + if n > 0 { + return 1 + self.blockPtr_slice[n-1].Seqno + } + return 1 +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockchainTail) Print() { + n := len(self.blockPtr_slice) + fmt.Printf("BlockchainTail={n=%d", n) + + for i := 0; i < n; i++ { + fmt.Print(",") + self.blockPtr_slice[i].Print() + } + fmt.Printf("}") +} + +//////////////////////////////////////////////////////////////////////////////// +// +// HashCandidate +// +//////////////////////////////////////////////////////////////////////////////// +type HashCandidate struct { + pubkey2sig map[cipher.PubKey]cipher.Sig // Primary data + sig2none map[cipher.Sig]byte // Lookup without (expensive) pubkey recovery +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *HashCandidate) Init() { + self.pubkey2sig = make(map[cipher.PubKey]cipher.Sig) + self.sig2none = make(map[cipher.Sig]byte) +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *HashCandidate) ObserveSigAndPubkey( + sig cipher.Sig, + pubkey cipher.PubKey) { + + if Cfg_debug_HashCandidate { + for k, v := range self.pubkey2sig { + fmt.Printf("HashCandidate %p pubkey2sig: pubkey=%s sig=%s\n", + self, k.Hex()[:8], v.Hex()[:8]) + } + for k, _ := range self.sig2none { + fmt.Printf("HashCandidate %p sig2none: sig=%s\n", self, k.Hex()[:8]) + } + } + + self.pubkey2sig[pubkey] = sig + self.sig2none[sig] = byte('1') + + n1 := len(self.pubkey2sig) + n2 := len(self.sig2none) + if n1 != n2 { + fmt.Printf("Inconsistent HashCandidate: n1=%d n2=%d\n", n1, n2) + panic("Oops") + } + +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *HashCandidate) Clear() { + for i, _ := range self.pubkey2sig { + delete(self.pubkey2sig, i) + } + for i, _ := range self.sig2none { + delete(self.sig2none, i) + } +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *HashCandidate) is_consistent() bool { + // TODO: implement + // NOTE: sig <- (hash,pubkey) is not deterministic, + // so + // len(self.pubkey2sig) + // len(self.sig2none) + // are not necessarily the same, even if same 'hash' was signed. + // The code of class BlockStat prevents calling + // ObserveSigAndPubkey() using same 'pubkey' and different 'sig', so + // the two lengths should be the same. TODO: move this detection + // to this class. + + return true +} + +//////////////////////////////////////////////////////////////////////////////// diff --git a/vendor/github.com/SkycoinProject/skycoin/src/consensus/consensus_test.go b/vendor/github.com/SkycoinProject/skycoin/src/consensus/consensus_test.go new file mode 100644 index 00000000..a5abc921 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/consensus/consensus_test.go @@ -0,0 +1,208 @@ +//nolint +// 20160901 - Initial version by user johnstuartmill, +// public key 02fb4acf944c84d48341e3c1cb14d707034a68b7f931d6be6d732bec03597d6ff6 +// 20161025 - Code revision by user johnstuartmill. +package consensus + +import ( + "testing" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go" +) + +//////////////////////////////////////////////////////////////////////////////// +func TestBlockchainTail_01(t *testing.T) { + bq := BlockchainTail{} + bq.Init() + if !bq.is_consistent() { + t.Log("BlockchainTail::is_consistent()") + t.Fail() + } +} + +//////////////////////////////////////////////////////////////////////////////// +func TestBlockchainTail_02(t *testing.T) { + + bq := BlockchainTail{} + bq.Init() + + // Use more than configured length to ensure some elements are + // removed: + n := Cfg_blockchain_tail_length * 2 + + for i := 0; i < n; i++ { + x := secp256k1.RandByte(888) // Random data. + h := cipher.SumSHA256(x) // Its hash. + + b := BlockBase{Hash: h, Seqno: uint64(i)} // OK to leave '.sig' empty + + bq.append_nocheck(&b) + } + + if len(bq.blockPtr_slice) != Cfg_blockchain_tail_length { + t.Log("BlockchainTail::append_nocheck() incorrect append or remove.") + t.Fail() + } + + if !bq.is_consistent() { + t.Log("BlockchainTail::is_consistent()") + t.Fail() + } +} + +//////////////////////////////////////////////////////////////////////////////// +func TestBlockchainTail_03(t *testing.T) { + + bq := BlockchainTail{} + bq.Init() + + h1 := cipher.SumSHA256(secp256k1.RandByte(888)) + b1 := BlockBase{Hash: h1, Seqno: 1} // OK to leave '.sig' empty + + r1 := bq.try_append_to_BlockchainTail(&b1) + if r1 != 0 { + t.Log("BlockchainTail::try_append_to_BlockchainTail(): initial insert failed.") + t.Fail() + } + if bq.GetNextSeqNo() != b1.Seqno+1 { + t.Log("BlockchainTail::GetNextSeqNo() failed.") + t.Fail() + } + + r1dup := bq.try_append_to_BlockchainTail(&b1) + if r1dup != 1 { + t.Log("BlockchainTail::try_append_to_BlockchainTail(): duplicate hash not detected.") + t.Fail() + } + + h2 := cipher.SumSHA256(secp256k1.RandByte(888)) + b2 := BlockBase{Hash: h2, Seqno: 2} // OK to leave '.sig' empty + + r2 := bq.try_append_to_BlockchainTail(&b2) + if r2 != 0 { + t.Log("BlockchainTail::try_append_to_BlockchainTail(): next insert failed.") + t.Fail() + } + if bq.GetNextSeqNo() != b2.Seqno+1 { + t.Log("BlockchainTail::GetNextSeqNo() failed.") + t.Fail() + } + + h3 := cipher.SumSHA256(secp256k1.RandByte(888)) + b3 := BlockBase{Hash: h3, Seqno: 0} // OK to leave '.sig' empty + + r3 := bq.try_append_to_BlockchainTail(&b3) + if r3 != 2 { + t.Log("BlockchainTail::try_append_to_BlockchainTail(): low seqno not detected. ret=", r3) + t.Fail() + } + + b3.Seqno = 4 + r4 := bq.try_append_to_BlockchainTail(&b3) + if r4 != 3 { + t.Log("BlockchainTail::try_append_to_BlockchainTail(): high seqno not detected.") + t.Fail() + } + +} + +//////////////////////////////////////////////////////////////////////////////// +func TestBlockStat_01(t *testing.T) { + bs := BlockStat{} + bs.Init() + + _, seckey := cipher.GenerateKeyPair() + hash := cipher.SumSHA256(secp256k1.RandByte(888)) + sig := cipher.MustSignHash(hash, seckey) + + var r int = -1 + + r = bs.try_add_hash_and_sig(hash, cipher.Sig{}) + if r != 4 { + t.Log("BlockStat::try_add_hash_and_sig() failed to detect invalid signature.") + t.Fail() + } + r = bs.try_add_hash_and_sig(cipher.SHA256{}, sig) + if r != 4 { + t.Log("BlockStat::try_add_hash_and_sig() failed to detect invalid hash and signature.") + t.Fail() + } + r = bs.try_add_hash_and_sig(cipher.SHA256{}, cipher.Sig{}) + if r != 4 { + t.Log("BlockStat::try_add_hash_and_sig() failed to detect invalid hash and signature.") + t.Fail() + } + + //signer_pubkey, err := cipher.PubKeyFromSig(cipher.Sig{}, cipher.SHA256{}) + //if err != nil { + //fmt.Printf("Got pubkey='%s' from all-zero sig and all-zero hash.\n", signer_pubkey.Hex()) + //} + + bs.frozen = true + r2 := bs.try_add_hash_and_sig(hash, sig) + if r2 != 3 { + t.Log("BlockStat::try_add_hash_and_sig() failed to detect frozen.") + t.Fail() + } + bs.frozen = false + + r3 := bs.try_add_hash_and_sig(hash, sig) + if r3 != 0 { + t.Log("BlockStat::try_add_hash_and_sig() failed to add.") + t.Fail() + } + + sig2 := cipher.MustSignHash(hash, seckey) // Redo signing. + r4 := bs.try_add_hash_and_sig(hash, sig2) + if r4 != 1 { + t.Log("BlockStat::try_add_hash_and_sig() failed to detect duplicate (hash,pubkey).") + t.Fail() + } + + r5 := bs.try_add_hash_and_sig(hash, sig) + if r5 != 1 { + t.Log("BlockStat::try_add_hash_and_sig() failed to detect duplicate (hash,sig).") + t.Fail() + } + +} + +//////////////////////////////////////////////////////////////////////////////// +func TestBlockStat_02(t *testing.T) { + bs := BlockStat{} + bs.Init() + + hash1 := cipher.SumSHA256(secp256k1.RandByte(888)) + n1 := 3 + + for i := 0; i < n1; i++ { + _, seckey := cipher.GenerateKeyPair() + sig := cipher.MustSignHash(hash1, seckey) + bs.try_add_hash_and_sig(hash1, sig) + } + + hash2 := cipher.SumSHA256(secp256k1.RandByte(888)) + n2 := 2 + + for i := 0; i < n2; i++ { + _, seckey := cipher.GenerateKeyPair() + sig := cipher.MustSignHash(hash2, seckey) + bs.try_add_hash_and_sig(hash2, sig) + } + + hash3 := cipher.SumSHA256(secp256k1.RandByte(888)) + n3 := 1 + + for i := 0; i < n3; i++ { + _, seckey := cipher.GenerateKeyPair() + sig := cipher.MustSignHash(hash3, seckey) + bs.try_add_hash_and_sig(hash3, sig) + } + + best_hash, _, _ := bs.GetBestHashPubkeySig() + if best_hash != hash1 { + t.Log("BlockStat::try_add_hash_and_sig() or BlockStat::GetBestHashPubkeySig() issue.") + t.Fail() + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/consensus/example/README.md b/vendor/github.com/SkycoinProject/skycoin/src/consensus/example/README.md new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/consensus/example/README.md @@ -0,0 +1 @@ + diff --git a/vendor/github.com/SkycoinProject/skycoin/src/consensus/example/example.go b/vendor/github.com/SkycoinProject/skycoin/src/consensus/example/example.go new file mode 100644 index 00000000..d1630d78 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/consensus/example/example.go @@ -0,0 +1,768 @@ +// +build ignore + +// 20160901 - Initial version by user johnstuartmill, +// public key 02fb4acf944c84d48341e3c1cb14d707034a68b7f931d6be6d732bec03597d6ff6 +// 20161025 - Code revision by user johnstuartmill. +package main + +// +// WARNING: WARNING: WARNING: Do NOT use this code for obtaining any +// research results. This file is only an illustration. A realistic +// simulation would require to have (i) nonzero latencies for event +// propagation and (ii) an event queue inside the implementation of +// MeshNetworkInterface. +// + +import ( + "flag" + "fmt" + mathrand "math/rand" + "os" + "sort" + + // + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/consensus" +) + +var Cfg_print_config bool = true +var Cfg_debug_connect_request bool = false +var Cfg_debug_node_final_state bool = false +var Cfg_debug_node_summary bool = false +var Cfg_debug_show_block_maker bool = false + +var Cfg_simu_topology_is_random bool = true + +var Cfg_simu_num_node int = 100 +var Cfg_simu_num_blockmaker int = 10 +var Cfg_simu_prob_malicious float64 = 0.0 +var Cfg_simu_prob_duplicate float64 = 0.0 + +var Cfg_simu_num_block_round int = 10 +var Cfg_simu_fanout_per_node int = 3 + +// Will be reset later, based on values of other parameters: +var Cfg_simu_num_iter int = 0 + +//////////////////////////////////////////////////////////////////////////////// +type MinimalConnectionManager struct { + theNodePtr *consensus.ConsensusParticipant + // + publisher_key_list []*MinimalConnectionManager + subscriber_key_list []*MinimalConnectionManager +} + +func (self *MinimalConnectionManager) GetNode() *consensus.ConsensusParticipant { + return self.theNodePtr +} +func (self *MinimalConnectionManager) RegisterPublisher(key *MinimalConnectionManager) bool { + + self.publisher_key_list = append(self.publisher_key_list, key) + return true +} +func (self *MinimalConnectionManager) SendBlockToAllMySubscriber(blockPtr *consensus.BlockBase) { + for _, p := range self.subscriber_key_list { + p.GetNode().OnBlockHeaderArrived(blockPtr) + } +} +func (self *MinimalConnectionManager) RequestConnectionToAllMyPublisher() { + for _, p := range self.publisher_key_list { + p.OnSubscriberConnectionRequest(self) + } +} +func (self *MinimalConnectionManager) OnSubscriberConnectionRequest(other *MinimalConnectionManager) { + self.subscriber_key_list = append(self.subscriber_key_list, other) +} +func (self *MinimalConnectionManager) Print() { + detail := false + + fmt.Printf("ConnectionManager={publisher={n=%d", + len(self.publisher_key_list)) + + if detail { + for _, val := range self.publisher_key_list { + fmt.Printf(",%v", val) + } + } else { + fmt.Printf(",...") + } + fmt.Printf("}") + + fmt.Printf(",subscriber={n=%d", len(self.subscriber_key_list)) + if detail { + for _, val := range self.subscriber_key_list { + fmt.Printf(",%v", val) + } + } else { + fmt.Printf(",...") + } + fmt.Printf("}") +} + +//////////////////////////////////////////////////////////////////////////////// +// +// +// +//////////////////////////////////////////////////////////////////////////////// +func pretty_print_flags(prefix string, detail bool) { + if detail { + + max1 := 0 + max2 := 0 + + flag.VisitAll(func(f *flag.Flag) { + len1 := len(f.Name) + len2 := len(fmt.Sprintf("%v", f.Value)) + if max1 < len1 { + max1 = len1 + } + if max2 < len2 { + max2 = len2 + } + }) + + format := fmt.Sprintf(" --%%-%ds %%%dv %%s\n", max1, max2) + format = "%s" + format + + flag.VisitAll(func(f *flag.Flag) { + fmt.Printf(format, prefix, f.Name, f.Value, f.Usage) + }) + + } else { + + flag.VisitAll(func(f *flag.Flag) { + fmt.Printf("%s--%s=%v\n", prefix, f.Name, f.Value) + }) + + } +} + +//////////////////////////////////////////////////////////////////////////////// +func cmd_line_args_process() { + + var ip *int = nil + var qp *uint64 = nil + var dp *float64 = nil + var bp *bool = nil + + // + // Simulation parameters + // + ip = &Cfg_simu_num_node + flag.IntVar(ip, "simu-num-nodes", *ip, "Number of nodes in the network.") + + ip = &Cfg_simu_num_blockmaker + flag.IntVar(ip, "simu-num-blockmaker", *ip, + "Number of nodes in the network that make blocks.") + + dp = &Cfg_simu_prob_malicious + flag.Float64Var(dp, "simu-prob-malicious", *dp, + "Probability that a node temporarily joins a malicious group that"+ + " publishes same block in order to cause a fork of the blockchain.") + + dp = &Cfg_simu_prob_duplicate + flag.Float64Var(dp, "simu-prob-duplicate", *dp, + "Probability that a node sends a duplicate message with same hash but"+ + " different signature. (Duplicate (hash,sig) pairs are easily"+ + " detected and discarded.)") + + ip = &Cfg_simu_num_block_round + flag.IntVar(ip, "simu-num-rounds", *ip, + "Number of block rounds. When all them are published and the"+ + " resulting messages propagate, the simulation ends.") + + ip = &Cfg_simu_fanout_per_node + flag.IntVar(ip, "simu-fanout-per-node", *ip, + "Number of incoming (and outgoing) connections to (and from) each"+ + " node.") + + bp = &Cfg_debug_connect_request + flag.BoolVar(bp, "debug-connect-request", *bp, "") + + bp = &Cfg_print_config + flag.BoolVar(bp, "print-config", *bp, "") + + bp = &Cfg_debug_node_final_state + flag.BoolVar(bp, "debug-node-final-state", *bp, "") + + bp = &Cfg_debug_node_summary + flag.BoolVar(bp, "debug-node-summary", *bp, "") + + bp = &Cfg_debug_show_block_maker + flag.BoolVar(bp, "debug-show-block-maker", *bp, "") + + bp = &Cfg_simu_topology_is_random + flag.BoolVar(bp, "simu-topology-is-random", *bp, + "Connect nodes randomly or place them in one circle.") + + // + // Consensus parameters + // + + bp = &consensus.Cfg_debug_block_duplicate + flag.BoolVar(bp, "debug-block-duplicate", *bp, "") + + bp = &consensus.Cfg_debug_block_out_of_sequence + flag.BoolVar(bp, "debug-block-out-of-sequence", *bp, "") + + bp = &consensus.Cfg_debug_block_accepted + flag.BoolVar(bp, "debug-block-accepted", *bp, "") + + bp = &consensus.Cfg_debug_HashCandidate + flag.BoolVar(bp, "debug-hash-candidate", *bp, "") + + ip = &consensus.Cfg_blockchain_tail_length + flag.IntVar(ip, "blockchain-tail-length", *ip, + "Blocks held in memory. This limits memory usage.") + + qp = &consensus.Cfg_consensus_candidate_max_seqno_gap + flag.Uint64Var(qp, "consensus-candidate-max-seqno-gap", *qp, + "Proposed blocks (or consensus candidates) are ignored if theie seqno"+ + " is too high or too low w.r.t. what is stored. This limits memory"+ + " use and helps prevents some mild attacks.") + + qp = &consensus.Cfg_consensus_waiting_time_as_seqno_diff + flag.Uint64Var(qp, "consensus-waiting-time-as-seqno-diff", *qp, + "When to decide on selecting the best hash from BlockStat"+ + " so that it can be moved to blockchain.") + + ip = &consensus.Cfg_consensus_max_candidate_messages + flag.IntVar(ip, "consensus-max-candidate-messages", *ip, + "How many (hash,signer_pubkey) pairs to acquire for decision-making."+ + " This also limits forwarded traffic, because the messages in excess"+ + " of this limit are discarded hence not forwarded.") + + // + // + // + show := flag.Bool("show", false, "Show current parameter values and exit.") + + // + // + flag.Parse() + // + // + + if Cfg_simu_num_node < Cfg_simu_num_blockmaker { + fmt.Printf("Invalid input: --simu-num-nodes=%d < --simu-num-blockmaker="+ + "%d. Exiting.\n", Cfg_simu_num_node, Cfg_simu_num_blockmaker) + os.Exit(1) + } + + if Cfg_simu_prob_malicious < 0. || 1 < Cfg_simu_prob_malicious { + fmt.Printf("Invalid input: --simu-prob-malicious=%g is outside"+ + " [0 .. 1] range. Exiting.\n", Cfg_simu_prob_malicious) + os.Exit(1) + } + + if Cfg_simu_prob_duplicate < 0. || 1 < Cfg_simu_prob_duplicate { + fmt.Printf("Invalid input: --simu-prob-duplicate=%g is outside"+ + " [0 .. 1] range. Exiting.\n", Cfg_simu_prob_malicious) + os.Exit(1) + } + + // + // Derived parameters + // + + // Most likely we do not need that many. However, we keep the + // number high so it would not interfere with message propagation + // by premature exit from the vent loop. Yet we keep it finite to + // prevent an infinite run that can be caused by a bug: + + Cfg_simu_num_iter = 10 * // '10' is a heuristic + Cfg_simu_num_node * Cfg_simu_num_blockmaker * + Cfg_simu_num_block_round * Cfg_simu_fanout_per_node + + if *show { + pretty_print_flags("", true) + os.Exit(1) + } else { + if Cfg_print_config { + pretty_print_flags("FILE_Config.txt|", false) + } + } +} + +//////////////////////////////////////////////////////////////////////////////// +// +// +// +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +// The body of this function lends itself to something like +// +// ConsensusParticipant::BuildAndPropagateNewBlock() +// +// Before doing so, ConsensusParticipant would need to accumulate +// transactions, possibly negotiate with others as to who makes blocks +// etc. FOR NOW, any node can make (and publish) blocks. +// +func propagate_hash_from_node( + h cipher.SHA256, + nodePtr *consensus.ConsensusParticipant, + external_use bool, + external_seqno uint64) { + + // + // WARNING: Do NOT use this code for obtaining any research + // results. This file is only an illustration. A realistic + // simulation require to have nonzero latencies for event + // propagation and to have an event queueu inside the + // implementation of MeshNetworkInterface. + // + + o := external_seqno // HACK for DEBUGGING + if !external_use { + o = nodePtr.GetNextBlockSeqNo() // So that blocks are ordered. + } + + b := consensus.BlockBase{} + b.Init( + nodePtr.SignatureOf(h), // Signature of hash. + h, + o) + + nodePtr.OnBlockHeaderArrived(&b) +} + +//////////////////////////////////////////////////////////////////////////////// +func print_stat(X []*MinimalConnectionManager, + iter int) { + + n := 0 + for i, _ := range X { + n += X[i].GetNode().Incoming_block_count + } + + msg_per_node_per_round := + float64(n) / float64(Cfg_simu_num_node*Cfg_simu_num_block_round) + + msg_per_node_per_round_per_link := msg_per_node_per_round / + float64(Cfg_simu_fanout_per_node) + + msg_per_node_per_round_per_blockmaker := msg_per_node_per_round / + float64(Cfg_simu_num_blockmaker) + + // Print for viewing: + fmt.Printf( + "MSG_STAT iter %d\n"+ + "MSG_STAT msg_count_all %d\n"+ + "MSG_STAT num_node %d\n"+ + "MSG_STAT num_blockmaker %d\n"+ + "MSG_STAT num_block_round %d\n"+ + "MSG_STAT fanout_per_node %d\n"+ + "MSG_STAT max_candidate_messages %d (This limits the effect of"+ + " having large num_blockmaker)\n"+ + "MSG_STAT msg_per_node_per_round %.3f\n"+ + "MSG_STAT msg_per_node_per_round_per_link %.3f\n"+ + "MSG_STAT msg_per_node_per_round_per_blockmaker %.3f\n", + iter, n, Cfg_simu_num_node, Cfg_simu_num_blockmaker, + Cfg_simu_num_block_round, Cfg_simu_fanout_per_node, + consensus.Cfg_consensus_max_candidate_messages, + msg_per_node_per_round, + msg_per_node_per_round_per_link, + msg_per_node_per_round_per_blockmaker) + +} + +//////////////////////////////////////////////////////////////////////////////// +func Simulate_compare_node_StateQueue( + X []*MinimalConnectionManager, + global_seqno2h map[uint64]cipher.SHA256, + global_seqno2h_alt map[uint64]cipher.SHA256, +) { + // + // Step 1 of 3: for each observed seqno, find the histogram of + // 'best' hash. The historgam is formed by summing over nodes. + // + type QQQ map[uint64]map[cipher.SHA256]int + xxx := make(QQQ) // Access: [seqno][hash]=count + type ZZZ []QQQ // Access: [node][seqno][hash]=count + + ni := len(X) + + zzz := make(ZZZ, ni) + + for i := 0; i < ni; i++ { // Nodes + nj := X[i].GetNode().Get_block_stat_queue_Len() + + zzz[i] = make(map[uint64]map[cipher.SHA256]int) + + for j := 0; j < nj; j++ { // Elements in node's BlockStatQueue + + // 'bs' a pointer: + bs := X[i].GetNode().Get_block_stat_queue_element_at(j) + seqno := bs.GetSeqno() + hash, _, _ := bs.GetBestHashPubkeySig() + + if _, have := xxx[seqno]; !have { + xxx[seqno] = make(map[cipher.SHA256]int) + } + xxx[seqno][hash]++ + + if _, have := zzz[i][seqno]; !have { + zzz[i][seqno] = make(map[cipher.SHA256]int) + } + zzz[i][seqno][hash]++ + } + } + // + // Step 2 of 3. For each seqno, find the most-frequently observed + // hash. Also, find the ratio of blocks accepted to blocks + // published. + // + yyy := make(map[uint64]cipher.SHA256) // Access: [seqno]=hash + + var accept_count int = 0 + var total_count int = 0 + + for seqno, hash2count := range xxx { + var best_count int = 0 + var sum_count int = 0 + var best_hash cipher.SHA256 // undef + + initialized := false + + for hash, count := range hash2count { + if initialized { + if best_count < count { + best_count = count + best_hash = hash + } + } else { + initialized = true + + best_count = count + best_hash = hash + } + sum_count += count + } + + if initialized { + yyy[seqno] = best_hash + + // Here all 'seqno' contribute equally: + accept_count += best_count + total_count += sum_count + } + } + + if true { + keys := []int{} + for seqno, _ := range yyy { + keys = append(keys, int(seqno)) + } + + sort.Ints(keys) + + for _, key := range keys { + seqno := uint64(key) + + // Most-frequently accepted (across nodes) for the given seqno: + best_hash := yyy[seqno] + + prescribed := best_hash == global_seqno2h[seqno] + malicious := best_hash == global_seqno2h_alt[seqno] + + fmt.Printf("CONSENSUS: seqno=%d best_hash=%s prescribed=%t"+ + " malicious=%t\n", seqno, best_hash.Hex()[:8], prescribed, + malicious) + } + + } + fmt.Printf("CONSENSUS: total_count=%d accept_count=%d, accept_ratio=%f\n", + total_count, accept_count, float32(accept_count)/float32(total_count)) + + for i, zzz_i := range zzz { + join_count := 0 // How many have selected the most popular hash. + other_count := 0 // How many have selected NOT the most popular. + prescribed_count := 0 // How many have selected the intended hash. + malicious_count := 0 // How many have selected the malicious hash. + + for seqno, hash2count := range zzz_i { + + // Most-frequently accepted (across nodes) for the given seqno: + best_hash := yyy[seqno] + prescribed := global_seqno2h[seqno] + malicious := global_seqno2h_alt[seqno] + + for hash, count := range hash2count { + if hash == best_hash { + join_count += count + } else { + other_count += count + } + + if hash == prescribed { + prescribed_count += count + } + if hash == malicious { + malicious_count += count + } + } + } + + fmt.Printf("NODE i=%d join_count=%d other_count=%d prescribed_count="+ + "%d malicious_count=%d\n", + i, join_count, other_count, prescribed_count, malicious_count) + } +} + +//////////////////////////////////////////////////////////////////////////////// +func get_random_index_subset(N int, S int) []int { + // N - population size + // S - subset size + + if N < 0 { + N = 0 + } + if S < 0 { + S = 0 + } + if S > N { + S = N + } + + index_map := make(map[int]int, S) + if 2*S < N { + // Include at random + for i := 0; i < 3*S; i++ { // '3' is a heuristic + if len(index_map) >= S { + break + } + index_map[mathrand.Intn(N)] = 1 + } + } else { + // Fill up + for i := 0; i < N; i++ { + index_map[i] = 1 + } + n := N - S + // Exclude at random + for i := 0; i < 3*n; i++ { // '3' is a heuristic + if len(index_map) <= S { + break + } + delete(index_map, mathrand.Intn(N)) + } + } + + keys := []int{} + + for k, _ := range index_map { + keys = append(keys, k) + } + + return keys +} + +//////////////////////////////////////////////////////////////////////////////// +// +// main +// +//////////////////////////////////////////////////////////////////////////////// +func main() { + + cmd_line_args_process() + + // PERFORMANCE: + cipher.DebugLevel1 = false + cipher.DebugLevel2 = false + + var X []*MinimalConnectionManager + + var hack_global_seqno uint64 = 0 + + seed := "hdhdhdkjashfy7273" + _, SecKeyArray := + cipher.GenerateDeterministicKeyPairsSeed([]byte(seed), Cfg_simu_num_node) + + for i := 0; i < Cfg_simu_num_node; i++ { + cm := MinimalConnectionManager{} + // Reason for mutual registration: (1) when conn man receives + // messages, it needs to notify the node; (2) when node has + // processed a mesage, it might need to use conn man to send + // some data out. + nodePtr := consensus.NewConsensusParticipantPtr(&cm) + s := SecKeyArray[i] + nodePtr.SetPubkeySeckey(cipher.PubKeyFromSecKey(s), s) + + cm.theNodePtr = nodePtr + + X = append(X, &cm) + } + if false { + fmt.Printf("Got %d nodes\n", len(X)) + } + + if Cfg_simu_topology_is_random { + + fmt.Printf("CONFIG Topology: connecting %d nodes randomly with approx"+ + " %d nearest-neighbors in and approx %d nearest-neighbors out.\n", + Cfg_simu_num_node, Cfg_simu_fanout_per_node, + Cfg_simu_fanout_per_node) + + for i, _ := range X { + cm := X[i] + for g := 0; g < Cfg_simu_fanout_per_node; g++ { + j := mathrand.Intn(Cfg_simu_num_node) + if i != j { + cm.RegisterPublisher(X[j]) + } + } + } + } else { + + fmt.Printf("CONFIG Topology: connecting %d nodes via one (thick)"+ + " circle with approx %d nearest-neighbors in and approx %d "+ + "nearest-neighbors out.\n", + Cfg_simu_num_node, Cfg_simu_fanout_per_node, + Cfg_simu_fanout_per_node) + + n := len(X) + for i := 0; i < n; i++ { + + cm := X[i] + + c_left := int(Cfg_simu_fanout_per_node / 2) + c_right := Cfg_simu_fanout_per_node - c_left + + for c := 0; c < c_left; c++ { + j := (i - 1 - c + n) % n + cm.RegisterPublisher(X[j]) + } + + for c := 0; c < c_right; c++ { + j := (i + 1 + c) % n + cm.RegisterPublisher(X[j]) + } + } + } + + // Connect. PROD: This should request connections. The + // connections can be accepted, rejected or never answered. Such + // replies are asynchronous. SIMU: we connect synchronously. + for i, _ := range X { + X[i].RequestConnectionToAllMyPublisher() + } + + global_seqno2h := make(map[uint64]cipher.SHA256) + global_seqno2h_alt := make(map[uint64]cipher.SHA256) + + iter := 0 + block_round := 0 + done_processing_messages := false + for ; iter < Cfg_simu_num_iter; iter++ { + + if true { + if block_round < Cfg_simu_num_block_round { + + // NOTE: Propagating blocks from here is a + // simplification/HACK: it implies that we have + // knowledge of when messaging due to previous + // activity (blocks and connections) has + // stopped. Again, we make blocks from here for + // debugging and testing only. + + //x := secp256k1.RandByte(888) // Random data in SIMU. + x := make([]byte, 888) + mathrand.Read(x) + + h := cipher.SumSHA256(x) // Its hash. + + //x_alt := secp256k1.RandByte(888) // Random data in SIMU. + x_alt := make([]byte, 888) + mathrand.Read(x) + h_alt := cipher.SumSHA256(x_alt) // Its hash. + + global_seqno2h[hack_global_seqno] = h + global_seqno2h_alt[hack_global_seqno] = h_alt + + indices := get_random_index_subset(Cfg_simu_num_node, + Cfg_simu_num_blockmaker) + + if Cfg_debug_show_block_maker { + fmt.Printf("block_round=%d, Random indices of block-"+ + "makers: %v\n", block_round, indices) + } + + n_forkers := int(Cfg_simu_prob_malicious * float64(len(indices))) + + for i := 0; i < len(indices); i++ { + // TODO: Have many nodes send same block, and a few nodes + // send a different block. Research the conditions under + // which the block published by the majority would + // dominate the other one. + index := indices[i] + nodePtr := X[index].GetNode() + + malicious := (i < n_forkers) + duplicate := (mathrand.Float64() < Cfg_simu_prob_duplicate) + + ph := &h + if malicious { + ph = &h_alt + } + + rep := 1 + if duplicate { + rep = 2 + } + + // + // WARNING: In a reslistic simulation, one would + // need to remove the assumption of knowing global + // properties such as 'hack_global_seqno' + // + if malicious { + fmt.Printf(">>>>>> NODE (index,pubkey)=(%d,%s) is"+ + " publishing ALTERNATIVE block\n", index, + nodePtr.Pubkey.Hex()[:8]) + } + + for j := 0; j < rep; j++ { + // Signing same hash multiple times produces different + // signatures (for a good reason). We do it + // here to test if malicious re-publishing is + // detected properly. + propagate_hash_from_node(*ph, nodePtr, true, + hack_global_seqno) + } + } + + hack_global_seqno += 1 + block_round += 1 + } else { + done_processing_messages = true + break // <<<<<<<< + } + } + } + + zzz := "done" + if !done_processing_messages { + zzz = "***NOT done***" + } + + fmt.Printf("Done (i) making Blocks, %s (ii) processing responses."+ + " See stats on the next few lines. Used iterations=%d, unused"+ + " iterations=%d. Exiting the event loop now.\n", + zzz, iter, Cfg_simu_num_iter-iter) + + print_stat(X, iter) + + if Cfg_debug_node_final_state { + for i, _ := range X { + fmt.Printf("FILE_FinalState.txt|NODE i=%d ", i) + X[i].GetNode().Print() + fmt.Printf("\n") + } + } + + if Cfg_debug_node_summary { + Simulate_compare_node_StateQueue(X, global_seqno2h, global_seqno2h_alt) + } +} + +//////////////////////////////////////////////////////////////////////////////// diff --git a/vendor/github.com/SkycoinProject/skycoin/src/consensus/example/example_gnet.go b/vendor/github.com/SkycoinProject/skycoin/src/consensus/example/example_gnet.go new file mode 100644 index 00000000..3193d1eb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/consensus/example/example_gnet.go @@ -0,0 +1,1043 @@ +// +build ignore + +// 20160901 - Initial version by user johnstuartmill, +// public key 02fb4acf944c84d48341e3c1cb14d707034a68b7f931d6be6d732bec03597d6ff6 +// 20161025 - Code revision by user johnstuartmill. +package main + +// +// WARNING: WARNING: WARNING: Do NOT use this code for obtaining any +// research results. This file is only an illustration. A realistic +// simulation would require to have (i) nonzero latencies for event +// propagation and (ii) an event queue inside the implementation of +// MeshNetworkInterface. +// + +import ( + "flag" + "fmt" + "log" + mathrand "math/rand" + "os" + "sort" + "time" + + "github.com/SkycoinProject/skycoin/src/daemon/gnet" + // + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/consensus" +) + +var Cfg_print_config bool = true +var Cfg_debug_connect_request bool = false +var Cfg_debug_node_final_state bool = false +var Cfg_debug_node_summary bool = false +var Cfg_debug_show_block_maker bool = false + +var Cfg_simu_topology_is_random bool = true + +var Cfg_simu_num_node int = 10 +var Cfg_simu_num_blockmaker int = 2 +var Cfg_simu_prob_malicious float64 = 0.0 +var Cfg_simu_prob_duplicate float64 = 0.0 + +var Cfg_simu_num_block_round int = 10 +var Cfg_simu_fanout_per_node int = 3 + +// Will be reset later, based on values of other parameters: +var Cfg_simu_num_iter int = 0 + +var common_channel uint16 = 3 + +//////////////////////////////////////////////////////////////////////////////// +func pretty_print_flags(prefix string, detail bool) { + if detail { + + max1 := 0 + max2 := 0 + + flag.VisitAll(func(f *flag.Flag) { + len1 := len(f.Name) + len2 := len(fmt.Sprintf("%v", f.Value)) + if max1 < len1 { + max1 = len1 + } + if max2 < len2 { + max2 = len2 + } + }) + + format := fmt.Sprintf(" --%%-%ds %%%dv %%s\n", max1, max2) + format = "%s" + format + + flag.VisitAll(func(f *flag.Flag) { + fmt.Printf(format, prefix, f.Name, f.Value, f.Usage) + }) + + } else { + + flag.VisitAll(func(f *flag.Flag) { + fmt.Printf("%s--%s=%v\n", prefix, f.Name, f.Value) + }) + + } +} + +//////////////////////////////////////////////////////////////////////////////// +func cmd_line_args_process() { + + var ip *int = nil + var qp *uint64 = nil + var dp *float64 = nil + var bp *bool = nil + + // + // Simulation parameters + // + ip = &Cfg_simu_num_node + flag.IntVar(ip, "simu-num-nodes", *ip, "Number of nodes in the network.") + + ip = &Cfg_simu_num_blockmaker + flag.IntVar(ip, "simu-num-blockmaker", *ip, + "Number of nodes in the network that make blocks.") + + dp = &Cfg_simu_prob_malicious + flag.Float64Var(dp, "simu-prob-malicious", *dp, + "Probability that a node temporarily joins a malicious group that"+ + " publishes same block in order to cause a fork of the blockchain.") + + dp = &Cfg_simu_prob_duplicate + flag.Float64Var(dp, "simu-prob-duplicate", *dp, + "Probability that a node sends a duplicate message with same hash but"+ + " different signature. (Duplicate (hash,sig) pairs are easily"+ + " detected and discarded.)") + + ip = &Cfg_simu_num_block_round + flag.IntVar(ip, "simu-num-rounds", *ip, + "Number of block rounds. When all them are published and the"+ + " resulting messages propagate, the simulation ends.") + + ip = &Cfg_simu_fanout_per_node + flag.IntVar(ip, "simu-fanout-per-node", *ip, + "Number of incoming (and outgoing) connections to (and from) each"+ + " node.") + + bp = &Cfg_debug_connect_request + flag.BoolVar(bp, "debug-connect-request", *bp, "") + + bp = &Cfg_print_config + flag.BoolVar(bp, "print-config", *bp, "") + + bp = &Cfg_debug_node_final_state + flag.BoolVar(bp, "debug-node-final-state", *bp, "") + + bp = &Cfg_debug_node_summary + flag.BoolVar(bp, "debug-node-summary", *bp, "") + + bp = &Cfg_debug_show_block_maker + flag.BoolVar(bp, "debug-show-block-maker", *bp, "") + + bp = &Cfg_simu_topology_is_random + flag.BoolVar(bp, "simu-topology-is-random", *bp, + "Connect nodes randomly or place them in one circle.") + + // + // Consensus parameters + // + + bp = &consensus.Cfg_debug_block_duplicate + flag.BoolVar(bp, "debug-block-duplicate", *bp, "") + + bp = &consensus.Cfg_debug_block_out_of_sequence + flag.BoolVar(bp, "debug-block-out-of-sequence", *bp, "") + + bp = &consensus.Cfg_debug_block_accepted + flag.BoolVar(bp, "debug-block-accepted", *bp, "") + + bp = &consensus.Cfg_debug_HashCandidate + flag.BoolVar(bp, "debug-hash-candidate", *bp, "") + + ip = &consensus.Cfg_blockchain_tail_length + flag.IntVar(ip, "blockchain-tail-length", *ip, + "Blocks held in memory. This limits memory usage.") + + qp = &consensus.Cfg_consensus_candidate_max_seqno_gap + flag.Uint64Var(qp, "consensus-candidate-max-seqno-gap", *qp, + "Proposed blocks (or consensus candidates) are ignored if theie seqno"+ + " is too high or too low w.r.t. what is stored. This limits memory"+ + " use and helps prevents some mild attacks.") + + qp = &consensus.Cfg_consensus_waiting_time_as_seqno_diff + flag.Uint64Var(qp, "consensus-waiting-time-as-seqno-diff", *qp, + "When to decide on selecting the best hash from BlockStat"+ + " so that it can be moved to blockchain.") + + ip = &consensus.Cfg_consensus_max_candidate_messages + flag.IntVar(ip, "consensus-max-candidate-messages", *ip, + "How many (hash,signer_pubkey) pairs to acquire for decision-making."+ + " This also limits forwarded traffic, because the messages in excess"+ + " of this limit are discarded hence not forwarded.") + + // + // + // + show := flag.Bool("show", false, "Show current parameter values and exit.") + + // + // + flag.Parse() + // + // + + if Cfg_simu_num_node < Cfg_simu_num_blockmaker { + fmt.Printf("Invalid input: --simu-num-nodes=%d < --simu-num-blockmaker="+ + "%d. Exiting.\n", Cfg_simu_num_node, Cfg_simu_num_blockmaker) + os.Exit(1) + } + + if Cfg_simu_prob_malicious < 0. || 1 < Cfg_simu_prob_malicious { + fmt.Printf("Invalid input: --simu-prob-malicious=%g is outside"+ + " [0 .. 1] range. Exiting.\n", Cfg_simu_prob_malicious) + os.Exit(1) + } + + if Cfg_simu_prob_duplicate < 0. || 1 < Cfg_simu_prob_duplicate { + fmt.Printf("Invalid input: --simu-prob-duplicate=%g is outside"+ + " [0 .. 1] range. Exiting.\n", Cfg_simu_prob_malicious) + os.Exit(1) + } + + // + // Derived parameters + // + + // Most likely we do not need that many. However, we keep the + // number high so it would not interfere with message propagation + // by premature exit from the vent loop. Yet we keep it finite to + // prevent an infinite run that can be caused by a bug: + + Cfg_simu_num_iter = 10 * // '10' is a heuristic + Cfg_simu_num_node * Cfg_simu_num_blockmaker * + Cfg_simu_num_block_round * Cfg_simu_fanout_per_node + + if *show { + pretty_print_flags("", true) + os.Exit(1) + } else { + if Cfg_print_config { + pretty_print_flags("FILE_Config.txt|", false) + } + } +} + +//////////////////////////////////////////////////////////////////////////////// +// +// +// +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +// The body of this function lends itself to something like +// +// ConsensusParticipant::BuildAndPropagateNewBlock() +// +// Before doing so, ConsensusParticipant would need to accumulate +// transactions, possibly negotiate with others as to who makes blocks +// etc. FOR NOW, any node can make (and publish) blocks. +// +func propagate_hash_from_node( + h cipher.SHA256, + nodePtr *consensus.ConsensusParticipant, + external_use bool, + external_seqno uint64) { + + // + // WARNING: Do NOT use this code for obtaining any research + // results. This file is only an illustration. A realistic + // simulation require to have nonzero latencies for event + // propagation and to have an event queueu inside the + // implementation of MeshNetworkInterface. + // + + o := external_seqno // HACK for DEBUGGING + if !external_use { + o = nodePtr.GetNextBlockSeqNo() // So that blocks are ordered. + } + + b := consensus.BlockBase{} + b.Init( + nodePtr.SignatureOf(h), // Signature of hash. + h, + o) + + nodePtr.OnBlockHeaderArrived(&b) +} + +//////////////////////////////////////////////////////////////////////////////// +// MESSAGE +type BlockBaseWrapper struct { + consensus.BlockBase +} + +func (self *BlockBaseWrapper) String() string { + return fmt.Sprintf("BlockBaseWrapper={Sig=%s,Hash=%s,Seqno=%d}", + self.Sig.Hex()[:8], self.Hash.Hex()[:8], self.Seqno) +} +func (self *BlockBaseWrapper) Handle(context *gnet.MessageContext, closure interface{}) error { + + if false { + fmt.Printf("@@@ consensus.BlockBase Handle: context={%v} closure={%v} data={%v}\n", context, closure, self) + } + + arg := closure.(*PoolOwner) + arg.DataCallback(context, self) + return nil +} + +//array of messages to register +var messageMap map[string](interface{}) = map[string](interface{}){ + "id01": BlockBaseWrapper{}, //message id, message type +} + +//////////////////////////////////////////////////////////////////////////////// +// +// +// +//////////////////////////////////////////////////////////////////////////////// +type PoolOwner struct { + pCMan *MinimalConnectionManager + + pDispatcherManager *gnet.DispatcherManager + pDispatcher *gnet.Dispatcher + pConnectionPool *gnet.ConnectionPool + // + isConnSolicited map[string]bool // Addr -> bool + // + key_list []string // To preserve the order. + key_map map[string]byte // To avoid duplicates. + // + debug_num_id int + debug_nickname string +} + +func (self *PoolOwner) Shutdown() { + self.pConnectionPool.Shutdown() +} + +func (self *PoolOwner) Init(pCMan *MinimalConnectionManager, listen_port uint16, num_id int, nickname string) { + + config := gnet.NewConfig() + config.Port = uint16(listen_port) + + cp := gnet.NewConnectionPool(config) + + dm := gnet.NewDispatcherManager() + + self.isConnSolicited = make(map[string]bool) + + cp.Config.MessageCallback = dm.OnMessage + cp.Config.ConnectCallback = self.OnConnect + cp.Config.DisconnectCallback = self.OnDisconnect + + d := dm.NewDispatcher(cp, common_channel, self) + d.RegisterMessages(messageMap) + + self.pCMan = pCMan + self.pDispatcherManager = dm + self.pDispatcher = d + self.key_map = make(map[string]byte) + self.pConnectionPool = cp + + self.debug_num_id = num_id + self.debug_nickname = nickname +} + +func (self *PoolOwner) Run() { + + cp := self.pConnectionPool // alias + + if cp.Config.Port != 0 { + if err := cp.StartListen(); err != nil { + log.Panic(err) + } + go cp.AcceptConnections() + } + + go func() { + for true { + // [JSM] 20161025 The 'Sleep' below is a workaround of + // unresolve concurrency issues in file gnet/pool.go + // class ConnectionPool. + time.Sleep(time.Millisecond * 1) + cp.HandleMessages() + } + }() + +} +func (self *PoolOwner) DataCallback(context *gnet.MessageContext, xxx *BlockBaseWrapper) { + + if self.isConnSolicited[context.Conn.Addr()] { + + var msg consensus.BlockBase + msg.Sig = xxx.Sig + msg.Hash = xxx.Hash + msg.Seqno = xxx.Seqno + + self.pCMan.GetNode().OnBlockHeaderArrived(&msg) + + } else { + // Ignoring + } +} +func (self *PoolOwner) OnConnect(c *gnet.Connection, is_solicited bool) { + self.isConnSolicited[c.Addr()] = is_solicited + + if false { + for channel, pDispatcher := range self.pDispatcherManager.Dispatchers { + // (BTW, pDispatcher.ReceivingObject is '&PoolOwner') + + // Each channel (or subscription subject) might require + // specific action to be taken on connect, such as request + // initial values from solicited, authenticate the client + // from unsolicited one etc. + _ = channel + _ = pDispatcher + } + } +} +func (self *PoolOwner) OnDisconnect(c *gnet.Connection, reason gnet.DisconnectReason) { + + if false { + for channel, pDispatcher := range self.pDispatcherManager.Dispatchers { + // (BTW, pDispatcher.ReceivingObject is '&PoolOwner') + + // Each channel (or subscription subject) might require + // specific action to be taken on disconnect, such as + // reconnect, clean up etc. + _ = channel + _ = pDispatcher + } + } + + delete(self.isConnSolicited, c.Addr()) +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *PoolOwner) RequestConnectionToKeys() { + for _, key := range self.key_list { + go func(arg string) { + _, err := self.BlockingConnectToUrl(arg) + if err != nil { + log.Panic(err) + } + }(key) + } +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *PoolOwner) RegisterKey(key string) bool { + + if _, have := self.key_map[key]; have { + return false // Let caller handle his issues. + } + + self.key_list = append(self.key_list, key) + self.key_map[key] = byte('1') + + return true + +} +func (self *PoolOwner) GetListenPort() uint16 { + return self.pDispatcher.Pool.Config.Port +} +func (self *PoolOwner) BlockingConnectTo(IPAddress string, port uint16) (*gnet.Connection, error) { + url := fmt.Sprintf("%s:%d", IPAddress, port) + conn, err := self.pDispatcher.Pool.Connect(url) + return conn, err +} +func (self *PoolOwner) BlockingConnectToUrl(url string) (*gnet.Connection, error) { + conn, err := self.pDispatcher.Pool.Connect(url) + return conn, err +} +func (self *PoolOwner) BroadcastMessage(msg gnet.Message) error { + return self.pDispatcher.BroadcastMessage(common_channel, msg) +} +func (self *PoolOwner) Print() { + detail := true + + fmt.Printf("PoolOwner={%d,%s,keys={n=%d", + self.debug_num_id, self.debug_nickname, len(self.key_list)) + + if detail { + for _, val := range self.key_list { + fmt.Printf(",%s", val) + } + } else { + fmt.Printf(",...") + } + fmt.Printf("}}") +} + +//////////////////////////////////////////////////////////////////////////////// +func print_stat(X []*MinimalConnectionManager, iter int) { + + n := 0 + for i, _ := range X { + n += X[i].GetNode().Incoming_block_count + } + + msg_per_node_per_round := + float64(n) / float64(Cfg_simu_num_node*Cfg_simu_num_block_round) + + msg_per_node_per_round_per_link := msg_per_node_per_round / + float64(Cfg_simu_fanout_per_node) + + msg_per_node_per_round_per_blockmaker := msg_per_node_per_round / + float64(Cfg_simu_num_blockmaker) + + // Print for viewing: + fmt.Printf( + "MSG_STAT iter %d\n"+ + "MSG_STAT msg_count_all %d\n"+ + "MSG_STAT num_node %d\n"+ + "MSG_STAT num_blockmaker %d\n"+ + "MSG_STAT num_block_round %d\n"+ + "MSG_STAT fanout_per_node %d\n"+ + "MSG_STAT max_candidate_messages %d (This limits the effect of"+ + " having large num_blockmaker)\n"+ + "MSG_STAT msg_per_node_per_round %.3f\n"+ + "MSG_STAT msg_per_node_per_round_per_link %.3f\n"+ + "MSG_STAT msg_per_node_per_round_per_blockmaker %.3f\n", + iter, n, Cfg_simu_num_node, Cfg_simu_num_blockmaker, + Cfg_simu_num_block_round, Cfg_simu_fanout_per_node, + consensus.Cfg_consensus_max_candidate_messages, + msg_per_node_per_round, + msg_per_node_per_round_per_link, + msg_per_node_per_round_per_blockmaker) + +} + +//////////////////////////////////////////////////////////////////////////////// +func Simulate_compare_node_StateQueue( + X []*MinimalConnectionManager, + global_seqno2h map[uint64]cipher.SHA256, + global_seqno2h_alt map[uint64]cipher.SHA256, +) { + // + // Step 1 of 3: for each observed seqno, find the histogram of + // 'best' hash. The historgam is formed by summing over nodes. + // + type QQQ map[uint64]map[cipher.SHA256]int + xxx := make(QQQ) // Access: [seqno][hash]=count + type ZZZ []QQQ // Access: [node][seqno][hash]=count + + ni := len(X) + + zzz := make(ZZZ, ni) + + for i := 0; i < ni; i++ { // Nodes + nj := X[i].GetNode().Get_block_stat_queue_Len() + + zzz[i] = make(map[uint64]map[cipher.SHA256]int) + + for j := 0; j < nj; j++ { // Elements in node's BlockStatQueue + + // 'bs' a pointer: + bs := X[i].GetNode().Get_block_stat_queue_element_at(j) + seqno := bs.GetSeqno() + hash, _, _ := bs.GetBestHashPubkeySig() + + if _, have := xxx[seqno]; !have { + xxx[seqno] = make(map[cipher.SHA256]int) + } + xxx[seqno][hash]++ + + if _, have := zzz[i][seqno]; !have { + zzz[i][seqno] = make(map[cipher.SHA256]int) + } + zzz[i][seqno][hash]++ + } + } + // + // Step 2 of 3. For each seqno, find the most-frequently observed + // hash. Also, find the ratio of blocks accepted to blocks + // published. + // + yyy := make(map[uint64]cipher.SHA256) // Access: [seqno]=hash + + var accept_count int = 0 + var total_count int = 0 + + for seqno, hash2count := range xxx { + var best_count int = 0 + var sum_count int = 0 + var best_hash cipher.SHA256 // undef + + initialized := false + + for hash, count := range hash2count { + if initialized { + if best_count < count { + best_count = count + best_hash = hash + } + } else { + initialized = true + + best_count = count + best_hash = hash + } + sum_count += count + } + + if initialized { + yyy[seqno] = best_hash + + // Here all 'seqno' contribute equally: + accept_count += best_count + total_count += sum_count + } + } + + if true { + keys := []int{} + for seqno, _ := range yyy { + keys = append(keys, int(seqno)) + } + + sort.Ints(keys) + + for _, key := range keys { + seqno := uint64(key) + + // Most-frequently accepted (across nodes) for the given seqno: + best_hash := yyy[seqno] + + prescribed := best_hash == global_seqno2h[seqno] + malicious := best_hash == global_seqno2h_alt[seqno] + + fmt.Printf("CONSENSUS: seqno=%d best_hash=%s prescribed=%t"+ + " malicious=%t\n", seqno, best_hash.Hex()[:8], prescribed, + malicious) + } + + } + fmt.Printf("CONSENSUS: total_count=%d accept_count=%d, accept_ratio=%f\n", + total_count, accept_count, float32(accept_count)/float32(total_count)) + + for i, zzz_i := range zzz { + join_count := 0 // How many have selected the most popular hash. + other_count := 0 // How many have selected NOT the most popular. + prescribed_count := 0 // How many have selected the intended hash. + malicious_count := 0 // How many have selected the malicious hash. + + for seqno, hash2count := range zzz_i { + + // Most-frequently accepted (across nodes) for the given seqno: + best_hash := yyy[seqno] + prescribed := global_seqno2h[seqno] + malicious := global_seqno2h_alt[seqno] + + for hash, count := range hash2count { + if hash == best_hash { + join_count += count + } else { + other_count += count + } + + if hash == prescribed { + prescribed_count += count + } + if hash == malicious { + malicious_count += count + } + } + } + + fmt.Printf("NODE i=%d join_count=%d other_count=%d prescribed_count="+ + "%d malicious_count=%d\n", + i, join_count, other_count, prescribed_count, malicious_count) + } +} + +//////////////////////////////////////////////////////////////////////////////// +type MinimalConnectionManager struct { + theNodePtr *consensus.ConsensusParticipant + + // MinimalConnectionManager solicit a conn to them; receive data + // from them but do not send anything + publishers PoolOwner + + // MinimalConnectionManager accept + // connections. MinimalConnectionManager send data to them; does + // not receive anything; ignores all incoming data + subscribers PoolOwner +} + +func (self *MinimalConnectionManager) Init(listen_port uint16, num_id int, nickname string) { + self.publishers.Init(self, 0, num_id, nickname+";recv_from_pub") + self.subscribers.Init(self, listen_port, num_id, nickname+";send_to_sub") +} +func (self *MinimalConnectionManager) Run() { + self.publishers.Run() + self.subscribers.Run() +} +func (self *MinimalConnectionManager) ShutdownPublishing() { + self.subscribers.Shutdown() +} +func (self *MinimalConnectionManager) ShutdownSubscribing() { + self.publishers.Shutdown() +} +func (self *MinimalConnectionManager) GetListenPort() uint16 { + return self.subscribers.pDispatcher.Pool.Config.Port +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *MinimalConnectionManager) GetNode() *consensus.ConsensusParticipant { + return self.theNodePtr +} +func (self *MinimalConnectionManager) RegisterPublisher(key string) bool { + return self.publishers.RegisterKey(key) +} +func (self *MinimalConnectionManager) SendBlockToAllMySubscriber(xxx *consensus.BlockBase) { + var msg BlockBaseWrapper + msg.Sig = xxx.Sig + msg.Hash = xxx.Hash + msg.Seqno = xxx.Seqno + + self.subscribers.pDispatcher.BroadcastMessage(common_channel, &msg) +} +func (self *MinimalConnectionManager) RequestConnectionToAllMyPublisher() { + self.publishers.RequestConnectionToKeys() + + // NOTE: The node does not request connection to subscriber; + // instead, the subscriber request connection to Node. +} +func (self *MinimalConnectionManager) OnSubscriberConnectionRequest(key string) { + fmt.Printf(">>>>>>>>>>>>>>>> GOT HERE. Please cooment this line out >>>>>>>>>>>>>>>>>>>>>>>>>\n") + + // FOR NOW accept all connection request. TODO: check for black + // list, latency table etc. + var acceptable = true + if acceptable { + self.subscribers.RegisterKey(key) + } +} +func (self *MinimalConnectionManager) Print() { + fmt.Printf("ConnectionManager={Pub={") + self.publishers.Print() + fmt.Printf("},Sub={") + self.subscribers.Print() + fmt.Printf("}}") +} + +//////////////////////////////////////////////////////////////////////////////// +// +// +// +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +func get_random_index_subset(N int, S int) []int { + // N - population size + // S - subset size + + if N < 0 { + N = 0 + } + if S < 0 { + S = 0 + } + if S > N { + S = N + } + + index_map := make(map[int]int, S) + if 2*S < N { + // Include at random + for i := 0; i < 3*S; i++ { // '3' is a heuristic + if len(index_map) >= S { + break + } + index_map[mathrand.Intn(N)] = 1 + } + } else { + // Fill up + for i := 0; i < N; i++ { + index_map[i] = 1 + } + n := N - S + // Exclude at random + for i := 0; i < 3*n; i++ { // '3' is a heuristic + if len(index_map) <= S { + break + } + delete(index_map, mathrand.Intn(N)) + } + } + + keys := []int{} + + for k, _ := range index_map { + keys = append(keys, k) + } + + return keys +} + +//////////////////////////////////////////////////////////////////////////////// +// +// main +// +//////////////////////////////////////////////////////////////////////////////// +func main() { + + cmd_line_args_process() + + // PERFORMANCE: + cipher.DebugLevel1 = false + cipher.DebugLevel2 = false + + var X []*MinimalConnectionManager + + var hack_global_seqno uint64 = 0 + + seed := "hdhdhdkjashfy7273" + _, SecKeyArray := + cipher.GenerateDeterministicKeyPairsSeed([]byte(seed), Cfg_simu_num_node) + + for i := 0; i < Cfg_simu_num_node; i++ { + var cm MinimalConnectionManager + cm.Init(6060+uint16(i), i, "fox") + + // Reason for mutual registration: (1) when conn man receives + // messages, it needs to notify the node; (2) when node has + // processed a mesage, it might need to use conn man to send + // some data out. + nodePtr := consensus.NewConsensusParticipantPtr(&cm) + s := SecKeyArray[i] + nodePtr.SetPubkeySeckey(cipher.PubKeyFromSecKey(s), s) + + cm.theNodePtr = nodePtr + + X = append(X, &cm) + } + if false { + fmt.Printf("Got %d nodes\n", len(X)) + } + + if Cfg_simu_topology_is_random { + + fmt.Printf("CONFIG Topology: connecting %d nodes randomly with approx"+ + " %d nearest-neighbors in and approx %d nearest-neighbors out.\n", + Cfg_simu_num_node, Cfg_simu_fanout_per_node, + Cfg_simu_fanout_per_node) + + n := len(X) + + for i := 0; i < n; i++ { + + cm := X[i] + + indices := + get_random_index_subset(Cfg_simu_num_node, Cfg_simu_fanout_per_node) + for _, j := range indices { + if i != j { + cm.RegisterPublisher(fmt.Sprintf("127.0.0.1:%d", X[j].GetListenPort())) + fmt.Printf("TOPOLOGY: port %d solicits conn to port %d\n", cm.GetListenPort(), X[j].GetListenPort()) + + } + } + } + } else { + + fmt.Printf("CONFIG Topology: connecting %d nodes via one (thick)"+ + " circle with approx %d nearest-neighbors in and approx %d "+ + "nearest-neighbors out.\n", + Cfg_simu_num_node, Cfg_simu_fanout_per_node, + Cfg_simu_fanout_per_node) + + n := len(X) + + for i := 0; i < n; i++ { + + cm := X[i] + + c_left := int(Cfg_simu_fanout_per_node / 2) + c_right := Cfg_simu_fanout_per_node - c_left + + for c := 0; c < c_left; c++ { + j := (i - 1 - c + n) % n + cm.RegisterPublisher(fmt.Sprintf("127.0.0.1:%d", X[j].GetListenPort())) + } + + for c := 0; c < c_right; c++ { + j := (i + 1 + c) % n + cm.RegisterPublisher(fmt.Sprintf("127.0.0.1:%d", X[j].GetListenPort())) + } + } + } + + // Start GoRoutines related to connectivity + for i, _ := range X { + X[i].Run() + } + + fmt.Printf("Waiting for start ...\n") + time.Sleep(time.Millisecond * 10) + + // Connect. PROD: This should request connections. The + // connections can be accepted, rejected or never answered. Such + // replies are asynchronous. SIMU: we connect synchronously. + for i, _ := range X { + X[i].RequestConnectionToAllMyPublisher() + } + + fmt.Printf("Waiting for connections ...\n") + time.Sleep(time.Second * 1) + + global_seqno2h := make(map[uint64]cipher.SHA256) + global_seqno2h_alt := make(map[uint64]cipher.SHA256) + + iter := 0 + block_round := 0 + done_processing_messages := false + for ; iter < Cfg_simu_num_iter; iter++ { + + if false { + fmt.Printf("Iteration %d\n", iter) + } + + //fmt.Printf("Waiting for messages to propagate ...\n") + time.Sleep(time.Millisecond * 100) + + if true { + if block_round < Cfg_simu_num_block_round { + + if true { + t := time.Now() + fmt.Printf("wall_time=%02d:%02d:%02d"+ + " block_round=%d\n", t.Hour(), t.Minute(), t.Second(), + block_round) + } + + // NOTE: Propagating blocks from here is a + // simplification/HACK: it implies that we have + // knowledge of when messaging due to previous + // activity (blocks and connections) has + // stopped. Again, we make blocks from here for + // debugging and testing only. + + //x := secp256k1.RandByte(888) // Random data in SIMU. + x := make([]byte, 888) + mathrand.Read(x) + + h := cipher.SumSHA256(x) // Its hash. + + //x_alt := secp256k1.RandByte(888) // Random data in SIMU. + x_alt := make([]byte, 888) + mathrand.Read(x) + h_alt := cipher.SumSHA256(x_alt) // Its hash. + + global_seqno2h[hack_global_seqno] = h + global_seqno2h_alt[hack_global_seqno] = h_alt + + indices := get_random_index_subset(Cfg_simu_num_node, + Cfg_simu_num_blockmaker) + + if Cfg_debug_show_block_maker { + fmt.Printf("block_round=%d, Random indices of block-"+ + "makers: %v\n", block_round, indices) + } + + n_forkers := int(Cfg_simu_prob_malicious * float64(len(indices))) + + for i := 0; i < len(indices); i++ { + // TODO: Have many nodes send same block, and a few nodes + // send a different block. Research the conditions under + // which the block published by the majority would + // dominate the other one. + index := indices[i] + nodePtr := X[index].GetNode() + + malicious := (i < n_forkers) + duplicate := (mathrand.Float64() < Cfg_simu_prob_duplicate) + + ph := &h + if malicious { + ph = &h_alt + } + + rep := 1 + if duplicate { + rep = 2 + } + + // + // WARNING: In a reslistic simulation, one would + // need to remove the assumption of knowing global + // properties such as 'hack_global_seqno' + // + if malicious { + fmt.Printf(">>>>>> NODE (index,pubkey)=(%d,%s) is"+ + " publishing ALTERNATIVE block\n", index, + nodePtr.Pubkey.Hex()[:8]) + } + + for j := 0; j < rep; j++ { + // Signing same hash multiple times produces different + // signatures (for a good reason). We do it + // here to test if malicious re-publishing is + // detected properly. + propagate_hash_from_node(*ph, nodePtr, true, + hack_global_seqno) + } + } + + hack_global_seqno += 1 + block_round += 1 + } else { + done_processing_messages = true + break // <<<<<<<< + } + } + } + + fmt.Printf("Waiting to finish ...\n") + time.Sleep(time.Millisecond * 500) + + zzz := "done" + if !done_processing_messages { + zzz = "***NOT done***" + } + + if false { + // [JSM] Do not call these FOR NOW: ConnectionPool does not + // implement shutdown correctly. + for i, _ := range X { + X[i].ShutdownPublishing() + } + for i, _ := range X { + X[i].ShutdownSubscribing() + } + } + + fmt.Printf("Done (i) making Blocks, %s (ii) processing responses."+ + " See stats on the next few lines. Used iterations=%d, unused"+ + " iterations=%d. Exiting the event loop now.\n", + zzz, iter, Cfg_simu_num_iter-iter) + + print_stat(X, iter) + + if Cfg_debug_node_final_state { + for i, _ := range X { + fmt.Printf("FILE_FinalState.txt|NODE i=%d ", i) + X[i].GetNode().Print() + fmt.Printf("\n") + } + } + + if Cfg_debug_node_summary { + Simulate_compare_node_StateQueue(X, global_seqno2h, global_seqno2h_alt) + } +} + +//////////////////////////////////////////////////////////////////////////////// diff --git a/vendor/github.com/SkycoinProject/skycoin/src/consensus/example/example_minimal.go b/vendor/github.com/SkycoinProject/skycoin/src/consensus/example/example_minimal.go new file mode 100644 index 00000000..0ebd72e2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/consensus/example/example_minimal.go @@ -0,0 +1,166 @@ +// +build ignore + +// 20160901 - Initial version by user johnstuartmill, +// public key 02fb4acf944c84d48341e3c1cb14d707034a68b7f931d6be6d732bec03597d6ff6 +// 20161025 - Code revision by user johnstuartmill. +package main + +import ( + "fmt" + mathrand "math/rand" + + // + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/secp256k1-go" + "github.com/SkycoinProject/skycoin/src/consensus" +) + +var Cfg_simu_num_node int = 5 +var Cfg_simu_fanout_per_node int = 2 + +//////////////////////////////////////////////////////////////////////////////// +// +// +// +//////////////////////////////////////////////////////////////////////////////// +type MinimalConnectionManager struct { + theNodePtr *consensus.ConsensusParticipant + // + publisher_key_list []*MinimalConnectionManager + subscriber_key_list []*MinimalConnectionManager +} + +func (self *MinimalConnectionManager) GetNode() *consensus.ConsensusParticipant { + return self.theNodePtr +} +func (self *MinimalConnectionManager) RegisterPublisher(key *MinimalConnectionManager) bool { + + self.publisher_key_list = append(self.publisher_key_list, key) + return true +} +func (self *MinimalConnectionManager) SendBlockToAllMySubscriber(blockPtr *consensus.BlockBase) { + for _, p := range self.subscriber_key_list { + p.GetNode().OnBlockHeaderArrived(blockPtr) + } +} +func (self *MinimalConnectionManager) RequestConnectionToAllMyPublisher() { + for _, p := range self.publisher_key_list { + p.OnSubscriberConnectionRequest(self) + } +} +func (self *MinimalConnectionManager) OnSubscriberConnectionRequest(other *MinimalConnectionManager) { + self.subscriber_key_list = append(self.subscriber_key_list, other) +} +func (self *MinimalConnectionManager) Print() { + detail := false + + fmt.Printf("ConnectionManager={publisher={n=%d", + len(self.publisher_key_list)) + + if detail { + for _, val := range self.publisher_key_list { + fmt.Printf(",%v", val) + } + } else { + fmt.Printf(",...") + } + fmt.Printf("}") + + fmt.Printf(",subscriber={n=%d", len(self.subscriber_key_list)) + if detail { + for _, val := range self.subscriber_key_list { + fmt.Printf(",%v", val) + } + } else { + fmt.Printf(",...") + } + fmt.Printf("}") +} + +//////////////////////////////////////////////////////////////////////////////// +// +// main +// +//////////////////////////////////////////////////////////////////////////////// +func main() { + + var X []*MinimalConnectionManager + + // Create nodes + for i := 0; i < Cfg_simu_num_node; i++ { + cm := MinimalConnectionManager{} + // Reason for mutual registration: (1) when conn man receives + // messages, it needs to notify the node; (2) when node has + // processed a mesage, it might need to use conn man to send + // some data out. + nodePtr := consensus.NewConsensusParticipantPtr(&cm) + cm.theNodePtr = nodePtr + + X = append(X, &cm) + } + + // Contemplate connecting nodes into a thick circle: + n := len(X) + for i := 0; i < n; i++ { + + cm := X[i] + + c_left := int(Cfg_simu_fanout_per_node / 2) + c_right := Cfg_simu_fanout_per_node - c_left + + for c := 0; c < c_left; c++ { + j := (i - 1 - c + n) % n + cm.RegisterPublisher(X[j]) + } + + for c := 0; c < c_right; c++ { + j := (i + 1 + c) % n + cm.RegisterPublisher(X[j]) + } + } + + // + // Request connections + // + for i := 0; i < n; i++ { + X[i].RequestConnectionToAllMyPublisher() + } + + { + // + // Choose a node to be a block-maker + // + index := mathrand.Intn(Cfg_simu_num_node) + nodePtr := X[index].GetNode() + + // + // Make a block (actually, only a header) + // + x := secp256k1.RandByte(888) // Random data. + h := cipher.SumSHA256(x) // Its hash. + b := consensus.BlockBase{} + b.Init( + nodePtr.SignatureOf(h), + h, + 0) + + // + // Send it to subscribers. The subscribers are also publishers; + // they send (forward, to be exact) the header to thire respective + // listeners etc. + // + nodePtr.OnBlockHeaderArrived(&b) + } + + // + // Print the state of each node for a review or debugging. + // + for i, _ := range X { + fmt.Printf("FILE_FinalState.txt|NODE i=%d ", i) + X[i].GetNode().Print() + fmt.Printf("\n") + } + +} + +//////////////////////////////////////////////////////////////////////////////// diff --git a/vendor/github.com/SkycoinProject/skycoin/src/consensus/participant.go b/vendor/github.com/SkycoinProject/skycoin/src/consensus/participant.go new file mode 100644 index 00000000..113ed6d0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/consensus/participant.go @@ -0,0 +1,180 @@ +//nolint +// 20160901 - Initial version by user johnstuartmill, +// public key 02fb4acf944c84d48341e3c1cb14d707034a68b7f931d6be6d732bec03597d6ff6 +// 20161025 - Code revision by user johnstuartmill. +package consensus + +import ( + "fmt" + + "github.com/SkycoinProject/skycoin/src/cipher" +) + +//////////////////////////////////////////////////////////////////////////////// +// +// Struct ConsensusParticipant is inteneded to extend (or be contained in) +// github.com/SkycoinProject/skycoin/src/mesh*/node struct Node, so that +// Node can participate in consensus. +// +//////////////////////////////////////////////////////////////////////////////// +type ConsensusParticipant struct { + Pubkey cipher.PubKey // Who we are + Seckey cipher.SecKey // For signing + + pConnectionManager ConnectionManagerInterface + + // The tail of Blockchain that I keep. + block_queue BlockchainTail + + // Candidates Blocks. + block_stat_queue BlockStatQueue + + Incoming_block_count int +} + +func (self *ConsensusParticipant) GetConnectionManager() ConnectionManagerInterface { + return self.pConnectionManager +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *ConsensusParticipant) GetNextBlockSeqNo() uint64 { + return self.block_queue.GetNextSeqNo() +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *ConsensusParticipant) SetPubkeySeckey( + pubkey cipher.PubKey, + seckey cipher.SecKey) { + + self.Pubkey, self.Seckey = pubkey, seckey + //self.pConnectionManager.SetPubkey(pubkey) +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *ConsensusParticipant) Print() { + fmt.Printf("ConsensusParticipant={pubkey=%s,block_msg_count=%d,", + self.Pubkey.Hex()[:8], self.Incoming_block_count) + + self.pConnectionManager.Print() + + fmt.Printf(",block_queue={") + self.block_queue.Print() + fmt.Printf("}") + + fmt.Printf(",block_stat_queue={") + self.block_stat_queue.Print() + fmt.Printf("}") + + fmt.Printf("}") +} + +//////////////////////////////////////////////////////////////////////////////// +func NewConsensusParticipantPtr(pMan ConnectionManagerInterface) *ConsensusParticipant { + + node := ConsensusParticipant{ + pConnectionManager: pMan, + block_queue: BlockchainTail{}, + Incoming_block_count: 0, + } + node.block_queue.Init() + //node.block_stat_queue.Init() + + // In PROD: each reads/loads the keys. In case the class does not + // expect to sign anything, SecKey should not be stored. + + // In SIMU: generate random keys. + node.SetPubkeySeckey(cipher.GenerateKeyPair()) + + return &node +} + +//////////////////////////////////////////////////////////////////////////////// +// Reasons for this function: 1st, we want to minimize exposure of +// SecKey, even in same process space. 2nd, functions Sign and +// SignHash already exists, so want keep search/browse/jump-to-tag +// unambiguous. +func (self *ConsensusParticipant) SignatureOf(hash cipher.SHA256) cipher.Sig { + + // PERFORMANCE: This is expensive when cipher.DebugLevel2 or + // cipher.DebugLevel1 are true: + return cipher.MustSignHash(hash, self.Seckey) +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *ConsensusParticipant) Get_block_stat_queue_Len() int { + return self.block_stat_queue.Len() +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *ConsensusParticipant) Get_block_stat_queue_element_at( + j int) *BlockStat { + + return self.block_stat_queue.queue[j] // A pointer, BTW +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *ConsensusParticipant) OnBlockHeaderArrived(blockPtr *BlockBase) { + + self.Incoming_block_count += 1 // TODO: move this to try_add_hash_and_sig + + res1 := self.block_stat_queue.try_append_to_BlockStatQueue(blockPtr) + if res1 == 0 { + self.harvest_ripe_BlockStat() + self.pConnectionManager.SendBlockToAllMySubscriber(blockPtr) + } +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *ConsensusParticipant) harvest_ripe_BlockStat() { + + // POLICY: The BlockStat entries that have much smaller seqno + // than the most recent one, 'blockPtr.seqno', are converted + // to Blocks and appended to blockchain. + n := len(self.block_stat_queue.queue) + if n == 0 { + return + } + + top_seqno := self.block_stat_queue.queue[n-1].seqno + + for i := 0; i < n; i++ { + statPtr := self.block_stat_queue.queue[i] + if statPtr.seqno+ + Cfg_consensus_waiting_time_as_seqno_diff <= top_seqno { + + if !statPtr.frozen { + // + // BEG updating local blockchain + // + + hash, _, sig := statPtr.GetBestHashPubkeySig() + + blockPtr := &BlockBase{ + Sig: sig, + Hash: hash, + Seqno: statPtr.seqno, + } + res := self.block_queue.try_append_to_BlockchainTail(blockPtr) + if res == 0 { + // TODO: 'frozen' items should be removed and the 'best' + // moved to BlockchainTail. + statPtr.frozen = true + } else { + // Appending did not work. Need to examine 'res' + // and log the reason why. + blockPtr = nil + } + // + // END updating local blockchain + // + + } + + } else { + break // The rest are not ripe yet + } + } + +} + +//////////////////////////////////////////////////////////////////////////////// diff --git a/vendor/github.com/SkycoinProject/skycoin/src/consensus/public_broadcast_channel/public_broadcast_channel.go b/vendor/github.com/SkycoinProject/skycoin/src/consensus/public_broadcast_channel/public_broadcast_channel.go new file mode 100644 index 00000000..8fa44fcb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/consensus/public_broadcast_channel/public_broadcast_channel.go @@ -0,0 +1,2 @@ +//nolint +package public_broadcast_channel diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/announce_blocks_message_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/announce_blocks_message_skyencoder.go new file mode 100644 index 00000000..ca165cac --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/announce_blocks_message_skyencoder.go @@ -0,0 +1,78 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package daemon + +import "github.com/SkycoinProject/skycoin/src/cipher/encoder" + +// encodeSizeAnnounceBlocksMessage computes the size of an encoded object of type AnnounceBlocksMessage +func encodeSizeAnnounceBlocksMessage(obj *AnnounceBlocksMessage) uint64 { + i0 := uint64(0) + + // obj.MaxBkSeq + i0 += 8 + + return i0 +} + +// encodeAnnounceBlocksMessage encodes an object of type AnnounceBlocksMessage to a buffer allocated to the exact size +// required to encode the object. +func encodeAnnounceBlocksMessage(obj *AnnounceBlocksMessage) ([]byte, error) { + n := encodeSizeAnnounceBlocksMessage(obj) + buf := make([]byte, n) + + if err := encodeAnnounceBlocksMessageToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeAnnounceBlocksMessageToBuffer encodes an object of type AnnounceBlocksMessage to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeAnnounceBlocksMessageToBuffer(buf []byte, obj *AnnounceBlocksMessage) error { + if uint64(len(buf)) < encodeSizeAnnounceBlocksMessage(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.MaxBkSeq + e.Uint64(obj.MaxBkSeq) + + return nil +} + +// decodeAnnounceBlocksMessage decodes an object of type AnnounceBlocksMessage from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeAnnounceBlocksMessage(buf []byte, obj *AnnounceBlocksMessage) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.MaxBkSeq + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.MaxBkSeq = i + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeAnnounceBlocksMessageExact decodes an object of type AnnounceBlocksMessage from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeAnnounceBlocksMessageExact(buf []byte, obj *AnnounceBlocksMessage) error { + if n, err := decodeAnnounceBlocksMessage(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/announce_blocks_message_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/announce_blocks_message_skyencoder_test.go new file mode 100644 index 00000000..f5b81167 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/announce_blocks_message_skyencoder_test.go @@ -0,0 +1,421 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package daemon + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +func newEmptyAnnounceBlocksMessageForEncodeTest() *AnnounceBlocksMessage { + var obj AnnounceBlocksMessage + return &obj +} + +func newRandomAnnounceBlocksMessageForEncodeTest(t *testing.T, rand *mathrand.Rand) *AnnounceBlocksMessage { + var obj AnnounceBlocksMessage + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenAnnounceBlocksMessageForEncodeTest(t *testing.T, rand *mathrand.Rand) *AnnounceBlocksMessage { + var obj AnnounceBlocksMessage + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilAnnounceBlocksMessageForEncodeTest(t *testing.T, rand *mathrand.Rand) *AnnounceBlocksMessage { + var obj AnnounceBlocksMessage + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderAnnounceBlocksMessage(t *testing.T, obj *AnnounceBlocksMessage) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeAnnounceBlocksMessage(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeAnnounceBlocksMessage() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeAnnounceBlocksMessage(obj) + if err != nil { + t.Fatalf("encodeAnnounceBlocksMessage failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeAnnounceBlocksMessage produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeAnnounceBlocksMessage()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeAnnounceBlocksMessageToBuffer(data3, obj); err != nil { + t.Fatalf("encodeAnnounceBlocksMessageToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 AnnounceBlocksMessage + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 AnnounceBlocksMessage + if n, err := decodeAnnounceBlocksMessage(data2, &obj3); err != nil { + t.Fatalf("decodeAnnounceBlocksMessage failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeAnnounceBlocksMessage bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeAnnounceBlocksMessage()") + } + + // Decode, excess buffer + var obj4 AnnounceBlocksMessage + n, err := decodeAnnounceBlocksMessage(data3, &obj4) + if err != nil { + t.Fatalf("decodeAnnounceBlocksMessage failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeAnnounceBlocksMessage bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeAnnounceBlocksMessage bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeAnnounceBlocksMessage()") + } + + // DecodeExact + var obj5 AnnounceBlocksMessage + if err := decodeAnnounceBlocksMessageExact(data2, &obj5); err != nil { + t.Fatalf("decodeAnnounceBlocksMessage failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeAnnounceBlocksMessage()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeAnnounceBlocksMessage(data4, &obj3); err != nil { + t.Fatalf("decodeAnnounceBlocksMessage failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeAnnounceBlocksMessage bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderAnnounceBlocksMessage(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *AnnounceBlocksMessage + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptyAnnounceBlocksMessageForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomAnnounceBlocksMessageForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenAnnounceBlocksMessageForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilAnnounceBlocksMessageForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderAnnounceBlocksMessage(t, tc.obj) + }) + } +} + +func decodeAnnounceBlocksMessageExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj AnnounceBlocksMessage + if _, err := decodeAnnounceBlocksMessage(buf, &obj); err == nil { + t.Fatal("decodeAnnounceBlocksMessage: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeAnnounceBlocksMessage: expected error %q, got %q", expectedErr, err) + } +} + +func decodeAnnounceBlocksMessageExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj AnnounceBlocksMessage + if err := decodeAnnounceBlocksMessageExact(buf, &obj); err == nil { + t.Fatal("decodeAnnounceBlocksMessageExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeAnnounceBlocksMessageExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderAnnounceBlocksMessageDecodeErrors(t *testing.T, k int, tag string, obj *AnnounceBlocksMessage) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeAnnounceBlocksMessage(obj) + buf, err := encodeAnnounceBlocksMessage(obj) + if err != nil { + t.Fatalf("encodeAnnounceBlocksMessage failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeAnnounceBlocksMessageExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeAnnounceBlocksMessageExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeAnnounceBlocksMessageExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeAnnounceBlocksMessageExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeAnnounceBlocksMessageExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderAnnounceBlocksMessageDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptyAnnounceBlocksMessageForEncodeTest() + fullObj := newRandomAnnounceBlocksMessageForEncodeTest(t, rand) + testSkyencoderAnnounceBlocksMessageDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderAnnounceBlocksMessageDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/announce_txns_message_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/announce_txns_message_skyencoder.go new file mode 100644 index 00000000..e8406f49 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/announce_txns_message_skyencoder.go @@ -0,0 +1,135 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package daemon + +import ( + "errors" + "math" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +// encodeSizeAnnounceTxnsMessage computes the size of an encoded object of type AnnounceTxnsMessage +func encodeSizeAnnounceTxnsMessage(obj *AnnounceTxnsMessage) uint64 { + i0 := uint64(0) + + // obj.Transactions + i0 += 4 + { + i1 := uint64(0) + + // x1 + i1 += 32 + + i0 += uint64(len(obj.Transactions)) * i1 + } + + return i0 +} + +// encodeAnnounceTxnsMessage encodes an object of type AnnounceTxnsMessage to a buffer allocated to the exact size +// required to encode the object. +func encodeAnnounceTxnsMessage(obj *AnnounceTxnsMessage) ([]byte, error) { + n := encodeSizeAnnounceTxnsMessage(obj) + buf := make([]byte, n) + + if err := encodeAnnounceTxnsMessageToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeAnnounceTxnsMessageToBuffer encodes an object of type AnnounceTxnsMessage to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeAnnounceTxnsMessageToBuffer(buf []byte, obj *AnnounceTxnsMessage) error { + if uint64(len(buf)) < encodeSizeAnnounceTxnsMessage(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Transactions maxlen check + if len(obj.Transactions) > 256 { + return encoder.ErrMaxLenExceeded + } + + // obj.Transactions length check + if uint64(len(obj.Transactions)) > math.MaxUint32 { + return errors.New("obj.Transactions length exceeds math.MaxUint32") + } + + // obj.Transactions length + e.Uint32(uint32(len(obj.Transactions))) + + // obj.Transactions + for _, x := range obj.Transactions { + + // x + e.CopyBytes(x[:]) + + } + + return nil +} + +// decodeAnnounceTxnsMessage decodes an object of type AnnounceTxnsMessage from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeAnnounceTxnsMessage(buf []byte, obj *AnnounceTxnsMessage) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Transactions + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 256 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Transactions = make([]cipher.SHA256, length) + + for z1 := range obj.Transactions { + { + // obj.Transactions[z1] + if len(d.Buffer) < len(obj.Transactions[z1]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Transactions[z1][:], d.Buffer[:len(obj.Transactions[z1])]) + d.Buffer = d.Buffer[len(obj.Transactions[z1]):] + } + + } + } + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeAnnounceTxnsMessageExact decodes an object of type AnnounceTxnsMessage from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeAnnounceTxnsMessageExact(buf []byte, obj *AnnounceTxnsMessage) error { + if n, err := decodeAnnounceTxnsMessage(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/announce_txns_message_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/announce_txns_message_skyencoder_test.go new file mode 100644 index 00000000..7875c8ef --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/announce_txns_message_skyencoder_test.go @@ -0,0 +1,421 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package daemon + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +func newEmptyAnnounceTxnsMessageForEncodeTest() *AnnounceTxnsMessage { + var obj AnnounceTxnsMessage + return &obj +} + +func newRandomAnnounceTxnsMessageForEncodeTest(t *testing.T, rand *mathrand.Rand) *AnnounceTxnsMessage { + var obj AnnounceTxnsMessage + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenAnnounceTxnsMessageForEncodeTest(t *testing.T, rand *mathrand.Rand) *AnnounceTxnsMessage { + var obj AnnounceTxnsMessage + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilAnnounceTxnsMessageForEncodeTest(t *testing.T, rand *mathrand.Rand) *AnnounceTxnsMessage { + var obj AnnounceTxnsMessage + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderAnnounceTxnsMessage(t *testing.T, obj *AnnounceTxnsMessage) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeAnnounceTxnsMessage(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeAnnounceTxnsMessage() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeAnnounceTxnsMessage(obj) + if err != nil { + t.Fatalf("encodeAnnounceTxnsMessage failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeAnnounceTxnsMessage produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeAnnounceTxnsMessage()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeAnnounceTxnsMessageToBuffer(data3, obj); err != nil { + t.Fatalf("encodeAnnounceTxnsMessageToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 AnnounceTxnsMessage + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 AnnounceTxnsMessage + if n, err := decodeAnnounceTxnsMessage(data2, &obj3); err != nil { + t.Fatalf("decodeAnnounceTxnsMessage failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeAnnounceTxnsMessage bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeAnnounceTxnsMessage()") + } + + // Decode, excess buffer + var obj4 AnnounceTxnsMessage + n, err := decodeAnnounceTxnsMessage(data3, &obj4) + if err != nil { + t.Fatalf("decodeAnnounceTxnsMessage failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeAnnounceTxnsMessage bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeAnnounceTxnsMessage bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeAnnounceTxnsMessage()") + } + + // DecodeExact + var obj5 AnnounceTxnsMessage + if err := decodeAnnounceTxnsMessageExact(data2, &obj5); err != nil { + t.Fatalf("decodeAnnounceTxnsMessage failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeAnnounceTxnsMessage()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeAnnounceTxnsMessage(data4, &obj3); err != nil { + t.Fatalf("decodeAnnounceTxnsMessage failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeAnnounceTxnsMessage bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderAnnounceTxnsMessage(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *AnnounceTxnsMessage + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptyAnnounceTxnsMessageForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomAnnounceTxnsMessageForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenAnnounceTxnsMessageForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilAnnounceTxnsMessageForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderAnnounceTxnsMessage(t, tc.obj) + }) + } +} + +func decodeAnnounceTxnsMessageExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj AnnounceTxnsMessage + if _, err := decodeAnnounceTxnsMessage(buf, &obj); err == nil { + t.Fatal("decodeAnnounceTxnsMessage: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeAnnounceTxnsMessage: expected error %q, got %q", expectedErr, err) + } +} + +func decodeAnnounceTxnsMessageExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj AnnounceTxnsMessage + if err := decodeAnnounceTxnsMessageExact(buf, &obj); err == nil { + t.Fatal("decodeAnnounceTxnsMessageExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeAnnounceTxnsMessageExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderAnnounceTxnsMessageDecodeErrors(t *testing.T, k int, tag string, obj *AnnounceTxnsMessage) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeAnnounceTxnsMessage(obj) + buf, err := encodeAnnounceTxnsMessage(obj) + if err != nil { + t.Fatalf("encodeAnnounceTxnsMessage failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeAnnounceTxnsMessageExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeAnnounceTxnsMessageExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeAnnounceTxnsMessageExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeAnnounceTxnsMessageExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeAnnounceTxnsMessageExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderAnnounceTxnsMessageDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptyAnnounceTxnsMessageForEncodeTest() + fullObj := newRandomAnnounceTxnsMessageForEncodeTest(t, rand) + testSkyencoderAnnounceTxnsMessageDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderAnnounceTxnsMessageDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/announced_txns.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/announced_txns.go new file mode 100644 index 00000000..3ca38bdc --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/announced_txns.go @@ -0,0 +1,44 @@ +package daemon + +import ( + "sync" + "time" + + "github.com/SkycoinProject/skycoin/src/cipher" +) + +type announcedTxnsCache struct { + sync.Mutex + cache map[cipher.SHA256]int64 +} + +func newAnnouncedTxnsCache() *announcedTxnsCache { + return &announcedTxnsCache{ + cache: make(map[cipher.SHA256]int64), + } +} + +func (c *announcedTxnsCache) add(txns []cipher.SHA256) { + c.Lock() + defer c.Unlock() + + t := time.Now().UTC().UnixNano() + for _, txn := range txns { + c.cache[txn] = t + } +} + +func (c *announcedTxnsCache) flush() map[cipher.SHA256]int64 { + c.Lock() + defer c.Unlock() + + if len(c.cache) == 0 { + return nil + } + + cache := c.cache + + c.cache = make(map[cipher.SHA256]int64) + + return cache +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/connections.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/connections.go new file mode 100644 index 00000000..dd94678a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/connections.go @@ -0,0 +1,554 @@ +package daemon + +import ( + "errors" + "fmt" + "sync" + "time" + + "github.com/sirupsen/logrus" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/util/iputil" + "github.com/SkycoinProject/skycoin/src/util/useragent" +) + +// ConnectionState connection state in the state machine +// Connections have three states: "pending", "connected" and "introduced" +// A connection in the "pending" state has been selected to establish a TCP connection, +// but the connection has not been established yet. +// Only outgoing connections will ever be in the "pending" state; +// incoming connections begin at the "connected" state. +// A connection in the "connected" state has established a TCP connection, +// but has not completed the introduction handshake. +// A connection in the "introduced" state has completed the introduction handshake. +type ConnectionState string + +const ( + // ConnectionStatePending prior to establishing a connection + ConnectionStatePending ConnectionState = "pending" + // ConnectionStateConnected connected, but not introduced + ConnectionStateConnected ConnectionState = "connected" + // ConnectionStateIntroduced connection has introduced itself + ConnectionStateIntroduced ConnectionState = "introduced" +) + +var ( + // ErrConnectionNotExist connection does not exist when performing an operation that requires it to exist + ErrConnectionNotExist = errors.New("Connection does not exist") + // ErrConnectionExists connection exists in Connections + ErrConnectionExists = errors.New("Connection exists") + // ErrConnectionIPMirrorExists connection exists for a given base IP and mirror + ErrConnectionIPMirrorExists = errors.New("Connection exists with this base IP and mirror") + // ErrConnectionStateNotConnected connect state is not "connected" + ErrConnectionStateNotConnected = errors.New("Connection state is not \"connected\"") + // ErrConnectionGnetIDMismatch gnet ID in argument does not match gnet ID on record + ErrConnectionGnetIDMismatch = errors.New("Connection gnet ID does not match") + // ErrConnectionAlreadyIntroduced attempted to make invalid state transition from introduced state + ErrConnectionAlreadyIntroduced = errors.New("Connection is already in introduced state") + // ErrConnectionAlreadyConnected attempted to make invalid state transition from connected state + ErrConnectionAlreadyConnected = errors.New("Connection is already in connected state") + // ErrInvalidGnetID invalid gnet ID value used as argument + ErrInvalidGnetID = errors.New("Invalid gnet ID") +) + +// ConnectionDetails connection data managed by daemon +type ConnectionDetails struct { + State ConnectionState + Outgoing bool + ConnectedAt time.Time + Mirror uint32 + ListenPort uint16 + ProtocolVersion int32 + Height uint64 + UserAgent useragent.Data + UnconfirmedVerifyTxn params.VerifyTxn + GenesisHash cipher.SHA256 +} + +// HasIntroduced returns true if the connection has introduced +func (c ConnectionDetails) HasIntroduced() bool { + switch c.State { + case ConnectionStateIntroduced: + return true + default: + return false + } +} + +type connection struct { + Addr string + ConnectionDetails + gnetID uint64 +} + +// ListenAddr returns the addr that connection listens on, if available +func (c *connection) ListenAddr() string { + if c.ListenPort == 0 { + return "" + } + + ip, _, err := iputil.SplitAddr(c.Addr) + if err != nil { + logger.Critical().WithError(err).WithField("addr", c.Addr).Error("connection.ListenAddr addr could not be split") + return "" + } + + return fmt.Sprintf("%s:%d", ip, c.ListenPort) +} + +// Connections manages a collection of Connection +type Connections struct { + conns map[string]*connection + mirrors map[uint32]map[string]uint16 + ipCounts map[string]int + gnetIDs map[uint64]string + listenAddrs map[string][]string + sync.Mutex +} + +// NewConnections creates Connections +func NewConnections() *Connections { + return &Connections{ + conns: make(map[string]*connection, 32), + mirrors: make(map[uint32]map[string]uint16, 32), + ipCounts: make(map[string]int, 32), + gnetIDs: make(map[uint64]string, 32), + listenAddrs: make(map[string][]string, 32), + } +} + +// pending adds a new pending outgoing connection +func (c *Connections) pending(addr string) (*connection, error) { + c.Lock() + defer c.Unlock() + + ip, port, err := iputil.SplitAddr(addr) + if err != nil { + logger.Critical().WithField("addr", addr).WithError(err).Error("Connections.pending called with invalid addr") + return nil, err + } + + if _, ok := c.conns[addr]; ok { + return nil, ErrConnectionExists + } + + c.ipCounts[ip]++ + + conn := &connection{ + Addr: addr, + ConnectionDetails: ConnectionDetails{ + State: ConnectionStatePending, + Outgoing: true, + ListenPort: port, + }, + } + + c.conns[addr] = conn + c.listenAddrs[addr] = append(c.listenAddrs[addr], addr) + + logger.WithField("addr", addr).Debug("Connections.pending") + + return c.conns[addr], nil +} + +// connected the connection has connected +func (c *Connections) connected(addr string, gnetID uint64) (*connection, error) { + c.Lock() + defer c.Unlock() + + fields := logrus.Fields{ + "addr": addr, + "gnetID": gnetID, + } + + if gnetID == 0 { + logger.Critical().WithFields(fields).WithError(ErrInvalidGnetID).Error("Connections.connected called with invalid gnetID") + return nil, ErrInvalidGnetID + } + + ip, _, err := iputil.SplitAddr(addr) + if err != nil { + logger.Critical().WithFields(fields).WithError(err).Error("Connections.connected called with invalid addr") + return nil, err + } + + conn := c.conns[addr] + + if conn == nil { + c.ipCounts[ip]++ + + conn = &connection{ + Addr: addr, + } + + c.conns[addr] = conn + } else { + fields := logrus.Fields{ + "addr": addr, + "gnetID": gnetID, + "state": conn.State, + "outgoing": conn.Outgoing, + "connGnetID": conn.gnetID, + } + + switch conn.State { + case ConnectionStatePending: + case ConnectionStateConnected: + logger.Critical().WithFields(fields).Error("Connections.connected called on already connected connection") + return nil, ErrConnectionAlreadyConnected + case ConnectionStateIntroduced: + logger.Critical().WithFields(fields).Error("Connections.connected called on already introduced connection") + return nil, ErrConnectionAlreadyIntroduced + default: + logger.WithFields(fields).Panic("Connection state invalid") + } + } + + c.gnetIDs[gnetID] = addr + conn.gnetID = gnetID + conn.ConnectedAt = time.Now().UTC() + conn.State = ConnectionStateConnected + + fields["outgoing"] = conn.Outgoing + + logger.WithFields(fields).Debug("Connections.connected") + + return conn, nil +} + +// introduced the connection has introduced itself +func (c *Connections) introduced(addr string, gnetID uint64, m *IntroductionMessage) (*connection, error) { + c.Lock() + defer c.Unlock() + + fields := logrus.Fields{ + "addr": addr, + "gnetID": gnetID, + } + + if gnetID == 0 { + logger.Critical().WithFields(fields).WithError(ErrInvalidGnetID).Error("Connections.introduced called with invalid gnetID") + return nil, ErrInvalidGnetID + } + + ip, _, err := iputil.SplitAddr(addr) + if err != nil { + logger.Critical().WithFields(fields).WithError(err).Error("Connections.introduced called with invalid addr") + return nil, err + } + + conn := c.conns[addr] + if conn == nil { + return nil, ErrConnectionNotExist + } + + fields["outgoing"] = conn.Outgoing + + errorFields := logrus.Fields{ + "state": conn.State, + "connGnetID": conn.gnetID, + } + + switch conn.State { + case ConnectionStatePending: + logger.Critical().WithFields(fields).WithFields(errorFields).Error("Connections.introduced called on pending connection") + return nil, ErrConnectionStateNotConnected + case ConnectionStateConnected: + if gnetID != conn.gnetID { + logger.Critical().WithFields(fields).WithFields(errorFields).Error("Connections.introduced called with different gnet ID") + return nil, ErrConnectionGnetIDMismatch + } + case ConnectionStateIntroduced: + logger.Critical().WithFields(fields).WithFields(errorFields).Error("Connections.introduced called on already introduced connection") + return nil, ErrConnectionAlreadyIntroduced + default: + logger.WithFields(fields).WithFields(errorFields).Panic("invalid connection state") + } + + if err := c.canUpdateMirror(ip, m.Mirror); err != nil { + logger.WithFields(fields).WithFields(errorFields).WithField("mirror", m.Mirror).WithError(err).Debug("canUpdateMirror failed") + return nil, err + } + + // For outgoing connections, which are created by pending, + // the listen port is set from the addr's port number. + // Since we are connecting to it, it is presumed to be that peer's open listening port. + // A misbehaving peer could report a different ListenPort in their IntroductionMessage, + // but it shouldn't affect our records. + if conn.Outgoing && conn.ListenPort != m.ListenPort { + logger.Critical().WithFields(fields).WithFields(logrus.Fields{ + "connListenPort": conn.ListenPort, + "introListenPort": m.ListenPort, + }).Warning("Outgoing connection's ListenPort does not match reported IntroductionMessage ListenPort") + } + + listenPort := conn.ListenPort + if !conn.Outgoing { + listenPort = m.ListenPort + } + + if err := c.updateMirror(ip, m.Mirror, listenPort); err != nil { + logger.WithFields(fields).WithField("mirror", m.Mirror).WithError(err).Panic("updateMirror failed, but shouldn't") + } + + conn.State = ConnectionStateIntroduced + conn.Mirror = m.Mirror + conn.ProtocolVersion = m.ProtocolVersion + conn.ListenPort = listenPort + conn.UserAgent = m.UserAgent + conn.UnconfirmedVerifyTxn = m.UnconfirmedVerifyTxn + conn.GenesisHash = m.GenesisHash + + if !conn.Outgoing { + listenAddr := conn.ListenAddr() + c.listenAddrs[listenAddr] = append(c.listenAddrs[listenAddr], addr) + } + + logger.WithFields(fields).Debug("Connections.introduced") + + return conn, nil +} + +// get returns a connection by address +func (c *Connections) get(addr string) *connection { + c.Lock() + defer c.Unlock() + + return c.conns[addr] +} + +func (c *Connections) getByListenAddr(listenAddr string) []*connection { + c.Lock() + defer c.Unlock() + + addrs := c.listenAddrs[listenAddr] + if len(addrs) == 0 { + return nil + } + + conns := make([]*connection, len(addrs)) + for i, a := range addrs { + conns[i] = c.conns[a] + } + + return conns +} + +func (c *Connections) getByGnetID(gnetID uint64) *connection { + c.Lock() + defer c.Unlock() + + if gnetID == 0 { + return nil + } + + addr := c.gnetIDs[gnetID] + if addr == "" { + return nil + } + + return c.conns[addr] +} + +// modify modifies a connection. +// It is unsafe to modify the Mirror value with this method +func (c *Connections) modify(addr string, gnetID uint64, f func(c *ConnectionDetails)) error { + conn := c.conns[addr] + if conn == nil { + return ErrConnectionNotExist + } + + if conn.gnetID != gnetID { + return ErrConnectionGnetIDMismatch + } + + // copy and modify + cd := conn.ConnectionDetails + + f(&cd) + + // compare to original + if cd.Mirror != conn.ConnectionDetails.Mirror { + logger.WithFields(logrus.Fields{ + "addr": addr, + "gnetID": gnetID, + }).Panic("Connections.modify connection Mirror was changed") + } + + if cd.ListenPort != conn.ConnectionDetails.ListenPort { + logger.WithFields(logrus.Fields{ + "addr": addr, + "gnetID": gnetID, + }).Panic("Connections.modify connection ListenPort was changed") + } + + conn.ConnectionDetails = cd + + return nil +} + +// SetHeight sets the height for a connection +func (c *Connections) SetHeight(addr string, gnetID uint64, height uint64) error { + c.Lock() + defer c.Unlock() + + return c.modify(addr, gnetID, func(c *ConnectionDetails) { + c.Height = height + }) +} + +func (c *Connections) updateMirror(ip string, mirror uint32, port uint16) error { + x := c.mirrors[mirror] + if x == nil { + x = make(map[string]uint16, 2) + } + + if _, ok := x[ip]; ok { + return ErrConnectionIPMirrorExists + } + + x[ip] = port + c.mirrors[mirror] = x + + return nil +} + +// canUpdateMirror returns false if a connection already exists with the same base IP and mirror value. +// This prevents duplicate connections to/from a single client. +func (c *Connections) canUpdateMirror(ip string, mirror uint32) error { + x := c.mirrors[mirror] + if x == nil { + return nil + } + + if _, ok := x[ip]; ok { + return ErrConnectionIPMirrorExists + } + + return nil +} + +// IPCount returns the number of connections for a given base IP (without port) +func (c *Connections) IPCount(ip string) int { + c.Lock() + defer c.Unlock() + return c.ipCounts[ip] +} + +// Len returns number of connections +func (c *Connections) Len() int { + c.Lock() + defer c.Unlock() + return len(c.conns) +} + +// OutgoingLen returns number of outgoing connections +func (c *Connections) OutgoingLen() int { + c.Lock() + defer c.Unlock() + n := 0 + for _, conn := range c.conns { + if conn.Outgoing { + n++ + } + } + return n +} + +// PendingLen returns the number of status pending connections +func (c *Connections) PendingLen() int { + c.Lock() + defer c.Unlock() + n := 0 + for _, conn := range c.conns { + if conn.State == ConnectionStatePending { + n++ + } + } + return n +} + +// remove removes connection. Returns an error if the addr is invalid. +// If a connection with this address does not exist, nothing happens. +func (c *Connections) remove(addr string, gnetID uint64) error { + c.Lock() + defer c.Unlock() + + ip, _, err := iputil.SplitAddr(addr) + if err != nil { + logger.Critical().WithError(err).Error("Connections.remove called with invalid addr") + return err + } + + conn := c.conns[addr] + if conn == nil { + return ErrConnectionNotExist + } + + fields := logrus.Fields{ + "addr": addr, + "connGnetID": conn.gnetID, + "gnetID": gnetID, + "listenPort": conn.ListenPort, + } + + if conn.gnetID != gnetID { + logger.Critical().WithFields(fields).Warning("Connections.remove gnetID does not match") + return ErrConnectionGnetIDMismatch + } + + x, ok := c.mirrors[conn.Mirror] + if ok { + if x[ip] != conn.ListenPort { + logger.Critical().WithFields(fields).Warning("Indexed IP+Mirror value found but the ListenPort doesn't match") + } + + delete(x, ip) + } + + if len(x) == 0 { + delete(c.mirrors, conn.Mirror) + } + + if c.ipCounts[ip] > 0 { + c.ipCounts[ip]-- + } else { + logger.Critical().WithFields(fields).Warning("ipCount was already 0 when removing existing address") + } + + listenAddr := conn.ListenAddr() + if listenAddr != "" { + addrs := c.listenAddrs[listenAddr] + for i, a := range addrs { + if a == conn.Addr { + addrs = append(addrs[:i], addrs[i+1:]...) + break + } + } + if len(addrs) == 0 { + delete(c.listenAddrs, listenAddr) + } else { + c.listenAddrs[listenAddr] = addrs + } + } + + delete(c.gnetIDs, conn.gnetID) + delete(c.conns, addr) + + return nil +} + +// all returns a copy of all connections +func (c *Connections) all() []connection { + c.Lock() + defer c.Unlock() + + conns := make([]connection, 0, len(c.conns)) + for _, c := range c.conns { + conns = append(conns, *c) + } + + return conns +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/connections_test.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/connections_test.go new file mode 100644 index 00000000..88db3a58 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/connections_test.go @@ -0,0 +1,513 @@ +package daemon + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/util/useragent" +) + +var userAgent = useragent.MustParse("skycoin:0.24.1(foo)") + +func getMirrorPort(c *Connections, ip string, mirror uint32) uint16 { + c.Lock() + defer c.Unlock() + + x := c.mirrors[mirror] + if x == nil { + return 0 + } + + return x[ip] +} + +func TestConnectionsOutgoingFlow(t *testing.T) { + conns := NewConnections() + + ip := "127.0.0.1" + port := uint16(6060) + addr := fmt.Sprintf("%s:%d", ip, port) + + all := conns.all() + require.Empty(t, all) + + require.Equal(t, 0, conns.IPCount(ip)) + require.Equal(t, 0, conns.OutgoingLen()) + require.Equal(t, 0, conns.PendingLen()) + require.Equal(t, 0, conns.Len()) + require.Empty(t, conns.mirrors) + + // Flow: pending, connected, introduced + + c, err := conns.pending(addr) + require.NoError(t, err) + + require.True(t, c.Outgoing) + require.Equal(t, addr, c.Addr) + require.Equal(t, port, c.ListenPort) + require.Equal(t, ConnectionStatePending, c.State) + require.Equal(t, 1, conns.IPCount(ip)) + require.Equal(t, 1, conns.OutgoingLen()) + require.Equal(t, 1, conns.PendingLen()) + require.Equal(t, 1, conns.Len()) + require.Empty(t, c.Mirror) + require.Empty(t, conns.mirrors) + require.False(t, c.HasIntroduced()) + require.Equal(t, addr, c.ListenAddr()) + + all = conns.all() + require.Equal(t, []connection{*c}, all) + + _, err = conns.pending(addr) + require.Equal(t, ErrConnectionExists, err) + require.Equal(t, 1, conns.IPCount(ip)) + require.Equal(t, 1, conns.OutgoingLen()) + require.Equal(t, 1, conns.PendingLen()) + require.Equal(t, 1, conns.Len()) + require.Empty(t, conns.mirrors) + require.False(t, c.HasIntroduced()) + require.Equal(t, addr, c.ListenAddr()) + + all = conns.all() + require.Equal(t, []connection{*c}, all) + + _, err = conns.introduced(addr, 1, &IntroductionMessage{ + UserAgent: userAgent, + }) + require.Equal(t, ErrConnectionStateNotConnected, err) + require.Equal(t, 1, conns.PendingLen()) + + c, err = conns.connected(addr, 1) + require.NoError(t, err) + + require.True(t, c.Outgoing) + require.Equal(t, addr, c.Addr) + require.Equal(t, port, c.ListenPort) + require.Equal(t, ConnectionStateConnected, c.State) + require.Equal(t, 1, conns.IPCount(ip)) + require.Equal(t, 1, conns.OutgoingLen()) + require.Equal(t, 0, conns.PendingLen()) + require.Equal(t, 1, conns.Len()) + require.Empty(t, c.Mirror) + require.Empty(t, conns.mirrors) + require.False(t, c.HasIntroduced()) + require.Equal(t, addr, c.ListenAddr()) + + all = conns.all() + require.Equal(t, []connection{*c}, all) + + m := &IntroductionMessage{ + // use a different port to make sure we don't overwrite the true listen port + ListenPort: port + 1, + Mirror: 1111, + ProtocolVersion: 2, + UserAgent: userAgent, + } + + c, err = conns.introduced(addr, 1, m) + require.NoError(t, err) + + require.True(t, c.Outgoing) + require.Equal(t, addr, c.Addr) + require.Equal(t, port, c.ListenPort) + require.Equal(t, ConnectionStateIntroduced, c.State) + require.Equal(t, 1, conns.IPCount(ip)) + require.Equal(t, 1, conns.OutgoingLen()) + require.Equal(t, 0, conns.PendingLen()) + require.Equal(t, 1, conns.Len()) + require.Equal(t, m.Mirror, c.Mirror) + require.Equal(t, m.ProtocolVersion, c.ProtocolVersion) + require.Len(t, conns.mirrors, 1) + require.Equal(t, port, getMirrorPort(conns, ip, c.Mirror)) + require.True(t, c.HasIntroduced()) + require.Equal(t, addr, c.ListenAddr()) + require.Equal(t, userAgent, c.UserAgent) + + all = conns.all() + require.Equal(t, []connection{*c}, all) + + require.Equal(t, c, conns.get(c.Addr)) + require.Equal(t, c, conns.getByGnetID(c.gnetID)) + require.Equal(t, []*connection{c}, conns.getByListenAddr(c.ListenAddr())) + + err = conns.remove(addr, 1) + require.NoError(t, err) + + require.Equal(t, 0, conns.IPCount(ip)) + require.Equal(t, 0, conns.OutgoingLen()) + require.Equal(t, 0, conns.PendingLen()) + require.Equal(t, 0, conns.Len()) + require.Empty(t, conns.mirrors) + + all = conns.all() + require.Empty(t, all) + + require.Nil(t, conns.getByGnetID(c.gnetID)) + require.Nil(t, conns.getByListenAddr(c.ListenAddr())) + require.Nil(t, conns.get(c.Addr)) +} + +func TestConnectionsIncomingFlow(t *testing.T) { + conns := NewConnections() + + ip := "127.0.0.1" + port := uint16(6060) + addr := fmt.Sprintf("%s:%d", ip, port) + + all := conns.all() + require.Empty(t, all) + + require.Equal(t, 0, conns.IPCount(ip)) + require.Equal(t, 0, conns.OutgoingLen()) + require.Equal(t, 0, conns.PendingLen()) + require.Equal(t, 0, conns.Len()) + require.Empty(t, conns.mirrors) + + // Flow: connected, introduced + + c, err := conns.connected(addr, 1) + require.NoError(t, err) + + require.False(t, c.Outgoing) + require.Equal(t, addr, c.Addr) + require.Empty(t, c.ListenPort) + require.Equal(t, ConnectionStateConnected, c.State) + require.Equal(t, 1, conns.IPCount(ip)) + require.Equal(t, 0, conns.OutgoingLen()) + require.Equal(t, 0, conns.PendingLen()) + require.Equal(t, 1, conns.Len()) + require.Empty(t, c.Mirror) + require.Empty(t, conns.mirrors) + require.False(t, c.HasIntroduced()) + require.Empty(t, c.ListenAddr()) + require.Empty(t, conns.listenAddrs) + + all = conns.all() + require.Equal(t, []connection{*c}, all) + + m := &IntroductionMessage{ + // use a different port to make sure that we use the self-reported listen port for incoming connections + ListenPort: port + 1, + Mirror: 1111, + ProtocolVersion: 2, + UserAgent: userAgent, + UnconfirmedVerifyTxn: params.VerifyTxn{ + BurnFactor: 4, + MaxTransactionSize: 1111, + MaxDropletPrecision: 2, + }, + } + + c, err = conns.introduced(addr, 1, m) + require.NoError(t, err) + + require.False(t, c.Outgoing) + require.Equal(t, addr, c.Addr) + require.Equal(t, m.ListenPort, c.ListenPort) + require.Equal(t, ConnectionStateIntroduced, c.State) + require.Equal(t, 1, conns.IPCount(ip)) + require.Equal(t, 0, conns.OutgoingLen()) + require.Equal(t, 0, conns.PendingLen()) + require.Equal(t, 1, conns.Len()) + require.Equal(t, m.Mirror, c.Mirror) + require.Equal(t, m.ProtocolVersion, c.ProtocolVersion) + require.Len(t, conns.mirrors, 1) + require.Equal(t, m.ListenPort, getMirrorPort(conns, ip, c.Mirror)) + require.True(t, c.HasIntroduced()) + require.Equal(t, fmt.Sprintf("%s:%d", ip, m.ListenPort), c.ListenAddr()) + require.Equal(t, userAgent, c.UserAgent) + require.Equal(t, uint32(4), c.UnconfirmedVerifyTxn.BurnFactor) + require.Equal(t, uint32(1111), c.UnconfirmedVerifyTxn.MaxTransactionSize) + require.Equal(t, uint8(2), c.UnconfirmedVerifyTxn.MaxDropletPrecision) + + all = conns.all() + require.Equal(t, []connection{*c}, all) + + err = conns.remove(addr, 1) + require.NoError(t, err) + + require.Equal(t, 0, conns.IPCount(ip)) + require.Equal(t, 0, conns.OutgoingLen()) + require.Equal(t, 0, conns.PendingLen()) + require.Equal(t, 0, conns.Len()) + require.Empty(t, conns.mirrors) + + all = conns.all() + require.Empty(t, all) + + require.Nil(t, conns.getByGnetID(c.gnetID)) + require.Nil(t, conns.getByListenAddr(c.ListenAddr())) + require.Nil(t, conns.get(c.Addr)) +} + +func TestConnectionsMultiple(t *testing.T) { + conns := NewConnections() + + addr1 := "127.0.0.1:6060" + addr2 := "127.0.0.1:6061" + + _, err := conns.pending(addr1) + require.NoError(t, err) + + _, err = conns.pending(addr2) + require.NoError(t, err) + + require.Equal(t, 2, conns.OutgoingLen()) + require.Equal(t, 2, conns.PendingLen()) + require.Equal(t, 2, conns.IPCount("127.0.0.1")) + + _, err = conns.connected(addr1, 1) + require.NoError(t, err) + require.Equal(t, 1, conns.PendingLen()) + + _, err = conns.connected(addr2, 2) + require.NoError(t, err) + require.Equal(t, 0, conns.PendingLen()) + + _, err = conns.introduced(addr1, 1, &IntroductionMessage{ + Mirror: 6, + ListenPort: 6060, + ProtocolVersion: 2, + UserAgent: userAgent, + }) + require.NoError(t, err) + require.Equal(t, 0, conns.PendingLen()) + require.Equal(t, 1, len(conns.mirrors)) + + // introduction fails if a base IP + mirror is already in use + _, err = conns.introduced(addr2, 2, &IntroductionMessage{ + Mirror: 6, + ListenPort: 6061, + ProtocolVersion: 2, + UserAgent: userAgent, + }) + require.Equal(t, ErrConnectionIPMirrorExists, err) + require.Equal(t, 0, conns.PendingLen()) + + c := conns.get(addr2) + require.Equal(t, ConnectionStateConnected, c.State) + require.Equal(t, c, conns.getByGnetID(2)) + require.Equal(t, []*connection{c}, conns.getByListenAddr("127.0.0.1:6061")) + + _, err = conns.introduced(addr2, 2, &IntroductionMessage{ + Mirror: 7, + ListenPort: 6061, + ProtocolVersion: 2, + UserAgent: userAgent, + }) + require.NoError(t, err) + require.Equal(t, 2, len(conns.mirrors)) + require.Equal(t, 2, conns.OutgoingLen()) + require.Equal(t, 0, conns.PendingLen()) + require.Equal(t, 2, conns.Len()) + require.Equal(t, 2, conns.IPCount("127.0.0.1")) + c = conns.get(addr2) + require.Equal(t, ConnectionStateIntroduced, c.State) + require.Equal(t, c, conns.getByGnetID(2)) + require.Equal(t, []*connection{c}, conns.getByListenAddr("127.0.0.1:6061")) + + // Add another connection with a different base IP but same mirror value + addr3 := "127.1.1.1:12345" + _, err = conns.connected(addr3, 3) + require.NoError(t, err) + + _, err = conns.introduced(addr3, 3, &IntroductionMessage{ + Mirror: 6, + ListenPort: 6060, + ProtocolVersion: 2, + UserAgent: userAgent, + }) + require.NoError(t, err) + + require.Equal(t, 2, len(conns.mirrors)) + require.Equal(t, 2, len(conns.mirrors[6])) + require.Equal(t, uint16(6060), getMirrorPort(conns, "127.0.0.1", 6)) + require.Equal(t, uint16(6061), getMirrorPort(conns, "127.0.0.1", 7)) + require.Equal(t, uint16(6060), getMirrorPort(conns, "127.1.1.1", 6)) + + require.Equal(t, 2, conns.OutgoingLen()) + require.Equal(t, 0, conns.PendingLen()) + require.Equal(t, 3, conns.Len()) + require.Equal(t, 2, conns.IPCount("127.0.0.1")) + require.Equal(t, 1, conns.IPCount("127.1.1.1")) + + err = conns.remove(addr1, 2) + require.Equal(t, ErrConnectionGnetIDMismatch, err) + require.Equal(t, 3, conns.Len()) + + err = conns.remove(addr1, 1) + require.NoError(t, err) + err = conns.remove(addr2, 2) + require.NoError(t, err) + err = conns.remove(addr3, 3) + require.NoError(t, err) + require.Empty(t, conns.mirrors) + require.Equal(t, 0, conns.Len()) + + err = conns.remove(addr1, 1) + require.Equal(t, ErrConnectionNotExist, err) +} + +func TestConnectionsMultipleSameListenPort(t *testing.T) { + conns := NewConnections() + + addr1 := "127.0.0.1:6060" + addr2 := "127.0.0.1:51414" + + c, err := conns.pending(addr1) + require.NoError(t, err) + require.Equal(t, []*connection{c}, conns.getByListenAddr(addr1)) + + c2, err := conns.connected(addr2, 2) + require.NoError(t, err) + require.Equal(t, []*connection{c}, conns.getByListenAddr(addr1)) + + _, err = conns.introduced(addr2, 2, &IntroductionMessage{ + Mirror: 6, + ListenPort: 6060, + ProtocolVersion: 2, + UserAgent: userAgent, + }) + require.NoError(t, err) + + listenAddrConns := conns.getByListenAddr(addr1) + require.Len(t, listenAddrConns, 2) + require.True(t, *listenAddrConns[0] == *c || *listenAddrConns[0] == *c2) + if *listenAddrConns[0] == *c { + require.Equal(t, c2, listenAddrConns[1]) + } else if *listenAddrConns[0] == *c2 { + require.Equal(t, c, listenAddrConns[1]) + } + + err = conns.remove(addr1, 0) + require.NoError(t, err) + + listenAddrConns = conns.getByListenAddr(addr1) + require.Len(t, listenAddrConns, 1) + require.Equal(t, c2, listenAddrConns[0]) + + err = conns.remove(addr2, 2) + require.NoError(t, err) + require.Len(t, conns.getByListenAddr(addr1), 0) + + err = conns.remove(addr2, 2) + require.Equal(t, ErrConnectionNotExist, err) + + require.Len(t, conns.listenAddrs, 0) +} + +func TestConnectionsErrors(t *testing.T) { + conns := NewConnections() + + _, err := conns.pending("foo") + testutil.RequireError(t, err, "address foo: missing port in address") + + _, err = conns.connected("foo", 1) + testutil.RequireError(t, err, "address foo: missing port in address") + + _, err = conns.introduced("foo", 1, &IntroductionMessage{}) + testutil.RequireError(t, err, "address foo: missing port in address") + + err = conns.remove("foo", 0) + testutil.RequireError(t, err, "address foo: missing port in address") + + _, err = conns.introduced("127.0.0.1:6060", 1, &IntroductionMessage{}) + require.Equal(t, ErrConnectionNotExist, err) + + _, err = conns.connected("127.0.0.1:6060", 0) + require.Equal(t, ErrInvalidGnetID, err) + + _, err = conns.introduced("127.0.0.1:6060", 0, &IntroductionMessage{}) + require.Equal(t, ErrInvalidGnetID, err) +} + +func TestConnectionsSetHeight(t *testing.T) { + conns := NewConnections() + addr := "127.0.0.1:6060" + height := uint64(1010) + + err := conns.SetHeight(addr, 1, height) + require.Equal(t, ErrConnectionNotExist, err) + + c, err := conns.connected(addr, 1) + require.NoError(t, err) + require.Empty(t, c.Height) + + err = conns.SetHeight(addr, 1, height) + require.NoError(t, err) + + err = conns.SetHeight(addr, 2, height) + require.Equal(t, ErrConnectionGnetIDMismatch, err) + + c = conns.get(addr) + require.NotNil(t, c) + require.Equal(t, height, c.Height) +} + +func TestConnectionsModifyMirrorPanics(t *testing.T) { + conns := NewConnections() + addr := "127.0.0.1:6060" + + _, err := conns.connected(addr, 1) + require.NoError(t, err) + + // modifying mirror value causes panic + require.Panics(t, func() { + conns.modify(addr, 1, func(c *ConnectionDetails) { //nolint:errcheck + c.Mirror++ + }) + }) + + // modifying ListenPort causes panic + require.Panics(t, func() { + conns.modify(addr, 1, func(c *ConnectionDetails) { //nolint:errcheck + c.ListenPort = 999 + }) + }) +} + +func TestConnectionsStateTransitionErrors(t *testing.T) { + conns := NewConnections() + addr := "127.0.0.1:6060" + + _, err := conns.pending(addr) + require.NoError(t, err) + + // pending -> pending fails + _, err = conns.pending(addr) + require.Equal(t, ErrConnectionExists, err) + + // pending -> introduced fails + _, err = conns.introduced(addr, 1, &IntroductionMessage{}) + require.Equal(t, ErrConnectionStateNotConnected, err) + + _, err = conns.connected(addr, 1) + require.NoError(t, err) + + // connected -> connected fails + _, err = conns.connected(addr, 1) + require.Equal(t, ErrConnectionAlreadyConnected, err) + + // connected -> introduced fails if gnet ID does not match + _, err = conns.introduced(addr, 2, &IntroductionMessage{}) + require.Equal(t, ErrConnectionGnetIDMismatch, err) + + _, err = conns.introduced(addr, 1, &IntroductionMessage{}) + require.NoError(t, err) + + // introduced -> connected fails + _, err = conns.connected(addr, 1) + require.Equal(t, ErrConnectionAlreadyIntroduced, err) + + // introduced -> pending fails + _, err = conns.pending(addr) + require.Equal(t, ErrConnectionExists, err) + + // introduced -> introduced fails + _, err = conns.introduced(addr, 1, &IntroductionMessage{}) + require.Equal(t, ErrConnectionAlreadyIntroduced, err) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/daemon.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/daemon.go new file mode 100644 index 00000000..a2cfbde7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/daemon.go @@ -0,0 +1,1798 @@ +/* +Package daemon controls the networking layer of the skycoin daemon +*/ +package daemon + +import ( + "errors" + "fmt" + "math/rand" + "reflect" + "sort" + "strings" + "sync" + "time" + + "github.com/sirupsen/logrus" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/daemon/gnet" + "github.com/SkycoinProject/skycoin/src/daemon/pex" + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/util/elapse" + "github.com/SkycoinProject/skycoin/src/util/fee" + "github.com/SkycoinProject/skycoin/src/util/iputil" + "github.com/SkycoinProject/skycoin/src/util/logging" + "github.com/SkycoinProject/skycoin/src/util/useragent" + "github.com/SkycoinProject/skycoin/src/visor" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +var ( + // ErrNetworkingDisabled is returned if networking is disabled + ErrNetworkingDisabled = errors.New("Networking is disabled") + // ErrNoPeerAcceptsTxn is returned if no peer will propagate a transaction broadcasted with BroadcastUserTransaction + ErrNoPeerAcceptsTxn = errors.New("No peer will propagate this transaction") + + logger = logging.MustGetLogger("daemon") +) + +// IsBroadcastFailure returns true if an error indicates that a broadcast operation failed +func IsBroadcastFailure(err error) bool { + switch err { + case ErrNetworkingDisabled, + gnet.ErrPoolEmpty, + gnet.ErrNoMatchingConnections, + gnet.ErrNoReachableConnections, + gnet.ErrNoAddresses: + return true + default: + return false + } +} + +const ( + daemonRunDurationThreshold = time.Millisecond * 200 +) + +// Config subsystem configurations +type Config struct { + Daemon DaemonConfig + Messages MessagesConfig + Pool PoolConfig + Pex pex.Config +} + +// NewConfig returns a Config with defaults set +func NewConfig() Config { + return Config{ + Daemon: NewDaemonConfig(), + Pool: NewPoolConfig(), + Pex: pex.NewConfig(), + Messages: NewMessagesConfig(), + } +} + +// preprocess preprocess for config +func (cfg *Config) preprocess() (Config, error) { + config := *cfg + if config.Daemon.LocalhostOnly { + if config.Daemon.Address == "" { + local, err := iputil.LocalhostIP() + if err != nil { + logger.WithError(err).Panic("Failed to obtain localhost IP") + } + config.Daemon.Address = local + } else { + if !iputil.IsLocalhost(config.Daemon.Address) { + logger.WithField("addr", config.Daemon.Address).Panic("Invalid address for localhost-only") + } + } + config.Pex.AllowLocalhost = true + } + config.Pool.port = config.Daemon.Port + config.Pool.address = config.Daemon.Address + + if config.Daemon.DisableNetworking { + logger.Info("Networking is disabled") + config.Pex.Disabled = true + config.Daemon.DisableIncomingConnections = true + config.Daemon.DisableOutgoingConnections = true + } else { + if config.Daemon.DisableIncomingConnections { + logger.Info("Incoming connections are disabled.") + } + if config.Daemon.DisableOutgoingConnections { + logger.Info("Outgoing connections are disabled.") + } + } + + if config.Daemon.MaxConnections < config.Daemon.MaxOutgoingConnections { + return Config{}, errors.New("MaxOutgoingConnections cannot be more than MaxConnections") + } + + if config.Daemon.MaxPendingConnections > config.Daemon.MaxOutgoingConnections { + config.Daemon.MaxPendingConnections = config.Daemon.MaxOutgoingConnections + } + + config.Pool.MaxConnections = config.Daemon.MaxConnections + config.Pool.MaxOutgoingConnections = config.Daemon.MaxOutgoingConnections + config.Pool.MaxIncomingMessageLength = int(config.Daemon.MaxIncomingMessageLength) + config.Pool.MaxOutgoingMessageLength = int(config.Daemon.MaxOutgoingMessageLength) + + // MaxOutgoingMessageLength must be able to fit a GiveBlocksMessage with at least one maximum-sized block, + // otherwise it cannot send certain blocks. + // Blocks are the largest object sent over the network, so MaxBlockTransactionsSize is used as an upper limit + maxSizeGBM := maxSizeGiveBlocksMessage(config.Daemon.MaxBlockTransactionsSize) + if config.Daemon.MaxOutgoingMessageLength < maxSizeGBM { + return Config{}, fmt.Errorf("MaxOutgoingMessageLength must be >= %d", maxSizeGBM) + } + + userAgent, err := config.Daemon.UserAgent.Build() + if err != nil { + return Config{}, err + } + if userAgent == "" { + return Config{}, errors.New("user agent is required") + } + config.Daemon.userAgent = userAgent + + return config, nil +} + +// maxSizeGiveBlocksMessage return the encoded size of a GiveBlocksMessage +// with a single signed block of the largest possible size +func maxSizeGiveBlocksMessage(maxBlockSize uint32) uint64 { + size := uint64(4) // message type prefix + size += encodeSizeGiveBlocksMessage(&GiveBlocksMessage{}) // size of an empty GiveBlocksMessage + size += encodeSizeSignedBlock(&coin.SignedBlock{}) // size of an empty SignedBlock + size += uint64(maxBlockSize) // maximum size of all transactions in a block + return size +} + +// DaemonConfig configuration for the Daemon +type DaemonConfig struct { //nolint:golint + // Protocol version. TODO -- manage version better + ProtocolVersion int32 + // Minimum accepted protocol version + MinProtocolVersion int32 + // IP Address to serve on. Leave empty for automatic assignment + Address string + // BlockchainPubkey blockchain pubkey string + BlockchainPubkey cipher.PubKey + // GenesisHash genesis block hash + GenesisHash cipher.SHA256 + // TCP/UDP port for connections + Port int + // Directory where application data is stored + DataDirectory string + // How often to check and initiate an outgoing connection to a trusted connection if needed + OutgoingTrustedRate time.Duration + // How often to check and initiate an outgoing connection if needed + OutgoingRate time.Duration + // How often to re-attempt to fill any missing private (aka required) connections + PrivateRate time.Duration + // Maximum number of connections + MaxConnections int + // Number of outgoing connections to maintain + MaxOutgoingConnections int + // Maximum number of connections to try at once + MaxPendingConnections int + // How long to wait for a version packet + IntroductionWait time.Duration + // How often to check for peers that have decided to stop communicating + CullInvalidRate time.Duration + // How often to update the database with transaction announcement timestamps + FlushAnnouncedTxnsRate time.Duration + // How many connections are allowed from the same base IP + IPCountsMax int + // Disable all networking activity + DisableNetworking bool + // Don't make outgoing connections + DisableOutgoingConnections bool + // Don't allow incoming connections + DisableIncomingConnections bool + // Run on localhost and only connect to localhost peers + LocalhostOnly bool + // Log ping and pong messages + LogPings bool + // How often to request blocks from peers + BlocksRequestRate time.Duration + // How often to announce our blocks to peers + BlocksAnnounceRate time.Duration + // How many blocks to request in a GetBlocksMessage + GetBlocksRequestCount uint64 + // Maximum number of blocks to respond with to a GetBlocksMessage + MaxGetBlocksResponseCount uint64 + // Max announce txns hash number + MaxTxnAnnounceNum int + // How often new blocks are created by the signing node, in seconds + BlockCreationInterval uint64 + // How often to check the unconfirmed pool for transactions that become valid + UnconfirmedRefreshRate time.Duration + // How often to remove transactions that become permanently invalid from the unconfirmed pool + UnconfirmedRemoveInvalidRate time.Duration + // Default "trusted" peers + DefaultConnections []string + // User agent (sent in introduction messages) + UserAgent useragent.Data + userAgent string // parsed from UserAgent in preprocess() + // Transaction verification parameters for unconfirmed transactions + UnconfirmedVerifyTxn params.VerifyTxn + // Random nonce value for detecting self-connection in introduction messages + Mirror uint32 + // Maximum size of incoming messages + MaxIncomingMessageLength uint64 + // Maximum size of incoming messages + MaxOutgoingMessageLength uint64 + // Maximum total size of transactions in a block + MaxBlockTransactionsSize uint32 +} + +// NewDaemonConfig creates daemon config +func NewDaemonConfig() DaemonConfig { + return DaemonConfig{ + ProtocolVersion: 2, + MinProtocolVersion: 2, + Address: "", + Port: 6677, + OutgoingRate: time.Second * 5, + OutgoingTrustedRate: time.Millisecond * 100, + PrivateRate: time.Second * 5, + MaxConnections: 128, + MaxOutgoingConnections: 8, + MaxPendingConnections: 8, + IntroductionWait: time.Second * 30, + CullInvalidRate: time.Second * 3, + FlushAnnouncedTxnsRate: time.Second * 3, + IPCountsMax: 3, + DisableNetworking: false, + DisableOutgoingConnections: false, + DisableIncomingConnections: false, + LocalhostOnly: false, + LogPings: true, + BlocksRequestRate: time.Second * 60, + BlocksAnnounceRate: time.Second * 60, + GetBlocksRequestCount: 20, + MaxGetBlocksResponseCount: 20, + MaxTxnAnnounceNum: 16, + BlockCreationInterval: 10, + UnconfirmedRefreshRate: time.Minute, + UnconfirmedRemoveInvalidRate: time.Minute, + Mirror: rand.New(rand.NewSource(time.Now().UTC().UnixNano())).Uint32(), + UnconfirmedVerifyTxn: params.UserVerifyTxn, + MaxOutgoingMessageLength: 256 * 1024, + MaxIncomingMessageLength: 1024 * 1024, + MaxBlockTransactionsSize: 32768, + } +} + +//go:generate mockery -name daemoner -case underscore -inpkg -testonly + +// daemoner Daemon interface +type daemoner interface { + Disconnect(addr string, r gnet.DisconnectReason) error + DaemonConfig() DaemonConfig + sendMessage(addr string, msg gnet.Message) error + broadcastMessage(msg gnet.Message) ([]uint64, error) + disconnectNow(addr string, r gnet.DisconnectReason) error + addPeers(addrs []string) int + recordPeerHeight(addr string, gnetID, height uint64) + getSignedBlocksSince(seq, count uint64) ([]coin.SignedBlock, error) + headBkSeq() (uint64, bool, error) + executeSignedBlock(b coin.SignedBlock) error + filterKnownUnconfirmed(txns []cipher.SHA256) ([]cipher.SHA256, error) + getKnownUnconfirmed(txns []cipher.SHA256) (coin.Transactions, error) + requestBlocksFromAddr(addr string) error + announceAllValidTxns() error + pexConfig() pex.Config + injectTransaction(txn coin.Transaction) (bool, *visor.ErrTxnViolatesSoftConstraint, error) + recordMessageEvent(m asyncMessage, c *gnet.MessageContext) error + connectionIntroduced(addr string, gnetID uint64, m *IntroductionMessage) (*connection, error) + sendRandomPeers(addr string) error +} + +// Daemon stateful properties of the daemon +type Daemon struct { + // Daemon configuration + config DaemonConfig + + // Components + Messages *Messages + pool *Pool + pex *pex.Pex + visor *visor.Visor + + // Cache of announced transactions that are flushed to the database periodically + announcedTxns *announcedTxnsCache + // Cache of connection metadata + connections *Connections + // connect, disconnect, message, error events channel + events chan interface{} + // quit channel + quit chan struct{} + // done channel + done chan struct{} +} + +// New returns a Daemon with primitives allocated +func New(config Config, v *visor.Visor) (*Daemon, error) { + config, err := config.preprocess() + if err != nil { + return nil, err + } + + pex, err := pex.New(config.Pex) + if err != nil { + return nil, err + } + + d := &Daemon{ + config: config.Daemon, + Messages: NewMessages(config.Messages), + pex: pex, + visor: v, + + announcedTxns: newAnnouncedTxnsCache(), + connections: NewConnections(), + events: make(chan interface{}, config.Pool.EventChannelSize), + quit: make(chan struct{}), + done: make(chan struct{}), + } + + d.pool, err = NewPool(config.Pool, d) + if err != nil { + return nil, err + } + + d.Messages.Config.Register() + + return d, nil +} + +// ConnectEvent generated when a client connects +type ConnectEvent struct { + GnetID uint64 + Addr string + Solicited bool +} + +// DisconnectEvent generated when a connection terminated +type DisconnectEvent struct { + GnetID uint64 + Addr string + Reason gnet.DisconnectReason +} + +// ConnectFailureEvent represent a failure to connect/dial a connection, with context +type ConnectFailureEvent struct { + Addr string + Solicited bool + Error error +} + +// messageEvent encapsulates a deserialized message from the network +type messageEvent struct { + Message asyncMessage + Context *gnet.MessageContext +} + +// Shutdown terminates all subsystems safely +func (dm *Daemon) Shutdown() { + defer logger.Info("Daemon shutdown complete") + + // close daemon run loop first to avoid creating new connection after + // the connection pool is shutdown. + logger.Info("Stopping the daemon run loop") + close(dm.quit) + + logger.Info("Shutting down Pool") + dm.pool.Shutdown() + + logger.Info("Shutting down Pex") + dm.pex.Shutdown() + + <-dm.done +} + +// Run main loop for peer/connection management +func (dm *Daemon) Run() error { + defer logger.Info("Daemon closed") + defer close(dm.done) + + logger.Infof("Daemon UserAgent is %s", dm.config.userAgent) + logger.Infof("Daemon unconfirmed BurnFactor is %d", dm.config.UnconfirmedVerifyTxn.BurnFactor) + logger.Infof("Daemon unconfirmed MaxTransactionSize is %d", dm.config.UnconfirmedVerifyTxn.MaxTransactionSize) + logger.Infof("Daemon unconfirmed MaxDropletPrecision is %d", dm.config.UnconfirmedVerifyTxn.MaxDropletPrecision) + + errC := make(chan error, 5) + var wg sync.WaitGroup + + wg.Add(1) + go func() { + defer wg.Done() + if err := dm.pex.Run(); err != nil { + logger.WithError(err).Error("daemon.Pex.Run failed") + errC <- err + } + }() + + wg.Add(1) + go func() { + defer wg.Done() + if dm.config.DisableIncomingConnections { + if err := dm.pool.RunOffline(); err != nil { + logger.WithError(err).Error("daemon.Pool.RunOffline failed") + errC <- err + } + } else { + if err := dm.pool.Run(); err != nil { + logger.WithError(err).Error("daemon.Pool.Run failed") + errC <- err + } + } + }() + + blockInterval := time.Duration(dm.config.BlockCreationInterval) + blockCreationTicker := time.NewTicker(time.Second * blockInterval) + if !dm.visor.Config.IsBlockPublisher { + blockCreationTicker.Stop() + } + + unconfirmedRefreshTicker := time.NewTicker(dm.config.UnconfirmedRefreshRate) + defer unconfirmedRefreshTicker.Stop() + unconfirmedRemoveInvalidTicker := time.NewTicker(dm.config.UnconfirmedRemoveInvalidRate) + defer unconfirmedRemoveInvalidTicker.Stop() + blocksRequestTicker := time.NewTicker(dm.config.BlocksRequestRate) + defer blocksRequestTicker.Stop() + blocksAnnounceTicker := time.NewTicker(dm.config.BlocksAnnounceRate) + defer blocksAnnounceTicker.Stop() + + // outgoingTrustedConnectionsTicker is used to maintain at least one connection to a trusted peer. + // This may be configured at a very frequent rate, so if no trusted connections could be reached, + // there could be a lot of churn. + // The additional outgoingTrustedConnectionsTicker parameters are used to + // skip ticks of the outgoingTrustedConnectionsTicker in the event of total failure. + // outgoingTrustedConnectionsTickerSkipDuration is the minimum time to wait between + // ticks in the event of total failure. + outgoingTrustedConnectionsTicker := time.NewTicker(dm.config.OutgoingTrustedRate) + defer outgoingTrustedConnectionsTicker.Stop() + outgoingTrustedConnectionsTickerSkipDuration := time.Second * 5 + outgoingTrustedConnectionsTickerSkip := false + var outgoingTrustedConnectionsTickerSkipStart time.Time + + privateConnectionsTicker := time.NewTicker(dm.config.PrivateRate) + defer privateConnectionsTicker.Stop() + cullInvalidTicker := time.NewTicker(dm.config.CullInvalidRate) + defer cullInvalidTicker.Stop() + outgoingConnectionsTicker := time.NewTicker(dm.config.OutgoingRate) + defer outgoingConnectionsTicker.Stop() + requestPeersTicker := time.NewTicker(dm.pex.Config.RequestRate) + defer requestPeersTicker.Stop() + clearStaleConnectionsTicker := time.NewTicker(dm.pool.Config.ClearStaleRate) + defer clearStaleConnectionsTicker.Stop() + idleCheckTicker := time.NewTicker(dm.pool.Config.IdleCheckRate) + defer idleCheckTicker.Stop() + + flushAnnouncedTxnsTicker := time.NewTicker(dm.config.FlushAnnouncedTxnsRate) + defer flushAnnouncedTxnsTicker.Stop() + + // Connect to all trusted peers on startup to try to ensure a connection establishes quickly. + // The number of connections to default peers is restricted; + // if multiple connections succeed, extra connections beyond the limit will be disconnected. + if !dm.config.DisableOutgoingConnections { + wg.Add(1) + go func() { + defer wg.Done() + dm.connectToTrustedPeers() + }() + } + + var setupErr error + elapser := elapse.NewElapser(daemonRunDurationThreshold, logger) + + // Process SendResults in a separate goroutine, otherwise SendResults + // will fill up much faster than can be processed by the daemon run loop + // dm.handleMessageSendResult must take care not to perform any operation + // that would violate thread safety, since it is not serialized by the daemon run loop + wg.Add(1) + go func() { + defer wg.Done() + elapser := elapse.NewElapser(daemonRunDurationThreshold, logger) + loop: + for { + elapser.CheckForDone() + select { + case <-dm.quit: + break loop + + case r := <-dm.pool.Pool.SendResults: + // Process message sending results + elapser.Register("dm.Pool.Pool.SendResults") + if dm.config.DisableNetworking { + logger.Error("There should be nothing in SendResults") + return + } + dm.handleMessageSendResult(r) + } + } + }() + +loop: + for { + elapser.CheckForDone() + select { + case <-dm.quit: + break loop + + case <-cullInvalidTicker.C: + // Remove connections that failed to complete the handshake + elapser.Register("cullInvalidTicker") + if !dm.config.DisableNetworking { + dm.cullInvalidConnections() + } + + case <-requestPeersTicker.C: + // Request peers via PEX + elapser.Register("requestPeersTicker") + if dm.pex.Config.Disabled { + continue + } + + if dm.pex.IsFull() { + continue + } + + m := NewGetPeersMessage() + if _, err := dm.broadcastMessage(m); err != nil { + logger.WithError(err).Error("Broadcast GetPeersMessage failed") + continue + } + + case <-clearStaleConnectionsTicker.C: + // Remove connections that haven't said anything in a while + elapser.Register("clearStaleConnectionsTicker") + if !dm.config.DisableNetworking { + conns, err := dm.pool.getStaleConnections() + if err != nil { + logger.WithError(err).Error("getStaleConnections failed") + continue + } + + for _, addr := range conns { + if err := dm.Disconnect(addr, ErrDisconnectIdle); err != nil { + logger.WithError(err).WithField("addr", addr).Error("Disconnect") + } + } + } + + case <-idleCheckTicker.C: + // Sends pings as needed + elapser.Register("idleCheckTicker") + if !dm.config.DisableNetworking { + dm.pool.sendPings() + } + + case <-outgoingConnectionsTicker.C: + // Fill up our outgoing connections + elapser.Register("outgoingConnectionsTicker") + dm.connectToRandomPeer() + + case <-outgoingTrustedConnectionsTicker.C: + // Try to maintain at least one trusted connection + elapser.Register("outgoingTrustedConnectionsTicker") + // If connecting to a trusted peer totally fails, make sure to wait longer between further attempts + if outgoingTrustedConnectionsTickerSkip { + if time.Since(outgoingTrustedConnectionsTickerSkipStart) < outgoingTrustedConnectionsTickerSkipDuration { + continue + } + } + + if err := dm.maybeConnectToTrustedPeer(); err != nil && err != ErrNetworkingDisabled { + logger.Critical().WithError(err).Error("maybeConnectToTrustedPeer") + outgoingTrustedConnectionsTickerSkip = true + outgoingTrustedConnectionsTickerSkipStart = time.Now() + } else { + outgoingTrustedConnectionsTickerSkip = false + } + + case <-privateConnectionsTicker.C: + // Always try to stay connected to our private peers + // TODO (also, connect to all of them on start) + elapser.Register("privateConnectionsTicker") + if !dm.config.DisableOutgoingConnections { + dm.makePrivateConnections() + } + + case r := <-dm.events: + elapser.Register("dm.event") + if dm.config.DisableNetworking { + logger.Critical().Error("Networking is disabled, there should be no events") + } else { + dm.handleEvent(r) + } + + case <-flushAnnouncedTxnsTicker.C: + elapser.Register("flushAnnouncedTxnsTicker") + txns := dm.announcedTxns.flush() + + if err := dm.visor.SetTransactionsAnnounced(txns); err != nil { + logger.WithError(err).Error("Failed to set unconfirmed txn announce time") + } + + case <-blockCreationTicker.C: + // Create blocks, if block publisher + elapser.Register("blockCreationTicker.C") + if dm.visor.Config.IsBlockPublisher { + sb, err := dm.createAndPublishBlock() + if err != nil { + logger.WithError(err).Error("Failed to create and publish block") + continue + } + + // Not a critical error, but we want it visible in logs + head := sb.Block.Head + logger.Critical().WithFields(logrus.Fields{ + "version": head.Version, + "seq": head.BkSeq, + "time": head.Time, + }).Info("Created and published a new block") + } + + case <-unconfirmedRefreshTicker.C: + elapser.Register("unconfirmedRefreshTicker") + // Get the transactions that turn to valid + validTxns, err := dm.visor.RefreshUnconfirmed() + if err != nil { + logger.WithError(err).Error("dm.Visor.RefreshUnconfirmed failed") + continue + } + // Announce these transactions + if err := dm.announceTxnHashes(validTxns); err != nil { + logger.WithError(err).Warning("announceTxnHashes failed") + } + + case <-unconfirmedRemoveInvalidTicker.C: + elapser.Register("unconfirmedRemoveInvalidTicker") + // Remove transactions that become invalid (violating hard constraints) + removedTxns, err := dm.visor.RemoveInvalidUnconfirmed() + if err != nil { + logger.WithError(err).Error("dm.Visor.RemoveInvalidUnconfirmed failed") + continue + } + if len(removedTxns) > 0 { + logger.Infof("Remove %d txns from pool that began violating hard constraints", len(removedTxns)) + } + + case <-blocksRequestTicker.C: + elapser.Register("blocksRequestTicker") + if err := dm.requestBlocks(); err != nil { + logger.WithError(err).Warning("requestBlocks failed") + } + + case <-blocksAnnounceTicker.C: + elapser.Register("blocksAnnounceTicker") + if err := dm.announceBlocks(); err != nil { + logger.WithError(err).Warning("announceBlocks failed") + } + + case setupErr = <-errC: + logger.WithError(setupErr).Error("read from errc") + break loop + } + } + + if setupErr != nil { + return setupErr + } + + wg.Wait() + + return nil +} + +// Connects to a given peer. Returns an error if no connection attempt was +// made. If the connection attempt itself fails, the error is sent to +// the connectionErrors channel. +func (dm *Daemon) connectToPeer(p pex.Peer) error { + if dm.config.DisableOutgoingConnections { + return errors.New("Outgoing connections disabled") + } + + a, _, err := iputil.SplitAddr(p.Addr) + if err != nil { + logger.Critical().WithField("addr", p.Addr).WithError(err).Warning("PEX gave us an invalid peer") + return errors.New("Invalid peer") + } + + if dm.config.LocalhostOnly && !iputil.IsLocalhost(a) { + return errors.New("Not localhost") + } + + if c := dm.connections.get(p.Addr); c != nil { + return errors.New("Already connected to this peer") + } + + cnt := dm.connections.IPCount(a) + if !dm.config.LocalhostOnly && cnt != 0 { + return errors.New("Already connected to a peer with this base IP") + } + + logger.WithField("addr", p.Addr).Debug("Establishing outgoing connection") + + if _, err := dm.connections.pending(p.Addr); err != nil { + logger.Critical().WithError(err).WithField("addr", p.Addr).Error("dm.connections.pending failed") + return err + } + + go func() { + if err := dm.pool.Pool.Connect(p.Addr); err != nil { + dm.events <- ConnectFailureEvent{ + Addr: p.Addr, + Solicited: true, + Error: err, + } + } + }() + return nil +} + +// Connects to all private peers +func (dm *Daemon) makePrivateConnections() { + if dm.config.DisableOutgoingConnections { + return + } + + peers := dm.pex.Private() + for _, p := range peers { + logger.WithField("addr", p.Addr).Info("Private peer attempt") + if err := dm.connectToPeer(p); err != nil { + logger.WithField("addr", p.Addr).WithError(err).Debug("Did not connect to private peer") + } + } +} + +// connectToTrustedPeers tries to connect to all trusted peers +func (dm *Daemon) connectToTrustedPeers() { + if dm.config.DisableOutgoingConnections { + return + } + + logger.Info("Connect to trusted peers") + // Make connections to all trusted peers to try to ensure a connection + // MaxDefaultPeerOutgoingConnections limits will be enforced in gnet + // after connections have been established, so not all trusted peers will be connected to. + peers := dm.pex.TrustedPublic() + for _, p := range peers { + if err := dm.connectToPeer(p); err != nil { + logger.WithError(err).WithField("addr", p.Addr).Warning("connect to trusted peer failed") + } + } +} + +// maybeConnectToTrustedPeer tries to connect to one trusted peer if there are no trusted connections +func (dm *Daemon) maybeConnectToTrustedPeer() error { + if dm.config.DisableOutgoingConnections { + return ErrNetworkingDisabled + } + + peers := dm.pex.TrustedPublic() + for _, p := range peers { + // Don't make a connection if we have a trusted peer connection + if len(dm.connections.getByListenAddr(p.Addr)) != 0 { + return nil + } + } + + connected := false + for _, p := range peers { + if err := dm.connectToPeer(p); err != nil { + logger.WithError(err).WithField("addr", p.Addr).Warning("maybeConnectToTrustedPeer: connectToPeer failed") + continue + } + connected = true + break + } + + if !connected { + return errors.New("Could not connect to any trusted peer") + } + + return nil +} + +// connectToRandomPeer attempts to connect to a random peer. If it fails, the peer is removed. +func (dm *Daemon) connectToRandomPeer() { + if dm.config.DisableOutgoingConnections { + return + } + if dm.connections.OutgoingLen() >= dm.config.MaxOutgoingConnections { + return + } + if dm.connections.PendingLen() >= dm.config.MaxPendingConnections { + return + } + if dm.connections.Len() >= dm.config.MaxConnections { + return + } + + // Make a connection to a random (public) peer + peers := dm.pex.RandomPublic(dm.config.MaxOutgoingConnections - dm.connections.OutgoingLen()) + for _, p := range peers { + if err := dm.connectToPeer(p); err != nil { + logger.WithError(err).WithField("addr", p.Addr).Warning("connectToPeer failed") + } + } + + // TODO -- don't reset if not needed? + if len(peers) == 0 { + dm.pex.ResetAllRetryTimes() + } +} + +// Removes connections who haven't sent a version after connecting +func (dm *Daemon) cullInvalidConnections() { + now := time.Now().UTC() + for _, c := range dm.connections.all() { + if c.State != ConnectionStateConnected { + continue + } + + if c.ConnectedAt.Add(dm.config.IntroductionWait).Before(now) { + logger.WithField("addr", c.Addr).Info("Disconnecting peer for not sending a version") + if err := dm.Disconnect(c.Addr, ErrDisconnectIntroductionTimeout); err != nil { + logger.WithError(err).WithField("addr", c.Addr).Error("Disconnect") + } + } + } +} + +func (dm *Daemon) isTrustedPeer(addr string) bool { + peer, ok := dm.pex.GetPeer(addr) + if !ok { + return false + } + + return peer.Trusted +} + +// recordMessageEvent records an asyncMessage to the messageEvent chan. Do not access +// messageEvent directly. +func (dm *Daemon) recordMessageEvent(m asyncMessage, c *gnet.MessageContext) error { + dm.events <- messageEvent{ + Message: m, + Context: c, + } + return nil +} + +func (dm *Daemon) handleEvent(e interface{}) { + switch x := e.(type) { + case messageEvent: + dm.onMessageEvent(x) + case ConnectEvent: + dm.onConnectEvent(x) + case DisconnectEvent: + dm.onDisconnectEvent(x) + case ConnectFailureEvent: + dm.onConnectFailure(x) + default: + logger.WithFields(logrus.Fields{ + "type": fmt.Sprintf("%T", e), + "value": fmt.Sprintf("%+v", e), + }).Panic("Invalid object in events queue") + } +} + +func (dm *Daemon) onMessageEvent(e messageEvent) { + // If the connection does not exist or the gnet ID is different, abort message processing + // This can occur because messageEvents for a given connection may occur + // after that connection has disconnected. + c := dm.connections.get(e.Context.Addr) + if c == nil { + logger.WithFields(logrus.Fields{ + "addr": e.Context.Addr, + "messageType": fmt.Sprintf("%T", e.Message), + }).Info("onMessageEvent no connection found") + return + } + + if c.gnetID != e.Context.ConnID { + logger.WithFields(logrus.Fields{ + "addr": e.Context.Addr, + "connGnetID": c.gnetID, + "contextGnetID": e.Context.ConnID, + "messageType": fmt.Sprintf("%T", e.Message), + }).Info("onMessageEvent connection gnetID does not match") + return + } + + // The first message received must be INTR, DISC or GIVP + if !c.HasIntroduced() { + switch e.Message.(type) { + case *IntroductionMessage, *DisconnectMessage, *GivePeersMessage: + default: + logger.WithFields(logrus.Fields{ + "addr": e.Context.Addr, + "messageType": fmt.Sprintf("%T", e.Message), + }).Info("needsIntro but first message is not INTR, DISC or GIVP") + if err := dm.Disconnect(e.Context.Addr, ErrDisconnectNoIntroduction); err != nil { + logger.WithError(err).WithField("addr", e.Context.Addr).Error("Disconnect") + } + return + } + } + + e.Message.process(dm) +} + +func (dm *Daemon) onConnectEvent(e ConnectEvent) { + fields := logrus.Fields{ + "addr": e.Addr, + "outgoing": e.Solicited, + "gnetID": e.GnetID, + } + logger.WithFields(fields).Info("onConnectEvent") + + // Update the connections state machine first + c, err := dm.connections.connected(e.Addr, e.GnetID) + if err != nil { + logger.Critical().WithError(err).WithFields(fields).Error("connections.Connected failed") + if err := dm.Disconnect(e.Addr, ErrDisconnectUnexpectedError); err != nil { + logger.WithError(err).WithFields(fields).Error("Disconnect") + } + return + } + + // The connection should already be known as outgoing/solicited due to an earlier connections.pending call. + // If they do not match, there is e.Addr flaw in the concept or implementation of the state machine. + if c.Outgoing != e.Solicited { + logger.Critical().WithFields(fields).Warning("Connection.Outgoing does not match ConnectEvent.Solicited state") + } + + if dm.ipCountMaxed(e.Addr) { + logger.WithFields(fields).Info("Max connections for this IP address reached, disconnecting") + if err := dm.Disconnect(e.Addr, ErrDisconnectIPLimitReached); err != nil { + logger.WithError(err).WithFields(fields).Error("Disconnect") + } + return + } + + logger.WithFields(fields).Debug("Sending introduction message") + + if err := dm.sendMessage(e.Addr, NewIntroductionMessage( + dm.config.Mirror, + dm.config.ProtocolVersion, + dm.pool.Pool.Config.Port, + dm.config.BlockchainPubkey, + dm.config.userAgent, + dm.config.UnconfirmedVerifyTxn, + dm.config.GenesisHash, + )); err != nil { + logger.WithFields(fields).WithError(err).Error("Send IntroductionMessage failed") + return + } +} + +func (dm *Daemon) onDisconnectEvent(e DisconnectEvent) { + fields := logrus.Fields{ + "addr": e.Addr, + "reason": e.Reason, + "gnetID": e.GnetID, + } + logger.WithFields(fields).Info("onDisconnectEvent") + + if err := dm.connections.remove(e.Addr, e.GnetID); err != nil { + logger.WithError(err).WithFields(fields).Error("connections.Remove failed") + return + } + + // TODO -- blacklist peer for certain reasons, not just remove + switch e.Reason { + case ErrDisconnectIntroductionTimeout, + ErrDisconnectBlockchainPubkeyNotMatched, + ErrDisconnectInvalidExtraData, + ErrDisconnectInvalidUserAgent: + if !dm.isTrustedPeer(e.Addr) { + dm.pex.RemovePeer(e.Addr) + } + case ErrDisconnectNoIntroduction, + ErrDisconnectVersionNotSupported, + ErrDisconnectSelf: + dm.pex.IncreaseRetryTimes(e.Addr) + default: + switch e.Reason.Error() { + case "read failed: EOF": + dm.pex.IncreaseRetryTimes(e.Addr) + } + } +} + +func (dm *Daemon) onConnectFailure(c ConnectFailureEvent) { + // Remove the pending connection from connections and update the retry times in pex + logger.WithField("addr", c.Addr).WithError(c.Error).Debug("onConnectFailure") + + // onConnectFailure should only trigger for "pending" connections which have gnet ID 0; + // connections in any other state will have a nonzero gnet ID. + // if the connection is in a different state, the gnet ID will not match, the connection + // won't be removed and we'll receive an error. + // If this happens, it is a bug, and the connections state may be corrupted. + if err := dm.connections.remove(c.Addr, 0); err != nil { + logger.Critical().WithField("addr", c.Addr).WithError(err).Error("connections.remove") + } + + if strings.HasSuffix(c.Error.Error(), "connect: connection refused") { + dm.pex.IncreaseRetryTimes(c.Addr) + } +} + +// onGnetDisconnect triggered when a gnet.Connection terminates +func (dm *Daemon) onGnetDisconnect(addr string, gnetID uint64, reason gnet.DisconnectReason) { + dm.events <- DisconnectEvent{ + GnetID: gnetID, + Addr: addr, + Reason: reason, + } +} + +// onGnetConnect Triggered when a gnet.Connection connects +func (dm *Daemon) onGnetConnect(addr string, gnetID uint64, solicited bool) { + dm.events <- ConnectEvent{ + GnetID: gnetID, + Addr: addr, + Solicited: solicited, + } +} + +// onGnetConnectFailure triggered when a gnet.Connection fails to connect +func (dm *Daemon) onGnetConnectFailure(addr string, solicited bool, err error) { + dm.events <- ConnectFailureEvent{ + Addr: addr, + Solicited: solicited, + Error: err, + } +} + +// Returns whether the ipCount maximum has been reached. +// Always false when using LocalhostOnly config. +func (dm *Daemon) ipCountMaxed(addr string) bool { + ip, _, err := iputil.SplitAddr(addr) + if err != nil { + logger.Critical().WithField("addr", addr).Error("ipCountMaxed called with invalid addr") + return true + } + + return !dm.config.LocalhostOnly && dm.connections.IPCount(ip) >= dm.config.IPCountsMax +} + +// When an async message send finishes, its result is handled by this. +// This method must take care to perform only thread-safe actions, since it is called +// outside of the daemon run loop +func (dm *Daemon) handleMessageSendResult(r gnet.SendResult) { + if r.Error != nil { + var lg logrus.FieldLogger + if r.Error == gnet.ErrMsgExceedsMaxLen { + lg = logger.Critical() + } else { + lg = logger + } + + lg.WithError(r.Error).WithFields(logrus.Fields{ + "addr": r.Addr, + "msgType": reflect.TypeOf(r.Message), + }).Warning("Failed to send message") + return + } + + if m, ok := r.Message.(SendingTxnsMessage); ok { + dm.announcedTxns.add(m.GetFiltered()) + } + + if m, ok := r.Message.(*DisconnectMessage); ok { + if err := dm.disconnectNow(r.Addr, m.reason); err != nil { + logger.WithError(err).WithField("addr", r.Addr).Warning("disconnectNow") + } + } +} + +// requestBlocks sends a GetBlocksMessage to all connections +func (dm *Daemon) requestBlocks() error { + if dm.config.DisableNetworking { + return ErrNetworkingDisabled + } + + headSeq, ok, err := dm.visor.HeadBkSeq() + if err != nil { + return err + } + if !ok { + return errors.New("Cannot request blocks, there is no head block") + } + + m := NewGetBlocksMessage(headSeq, dm.config.GetBlocksRequestCount) + + if _, err := dm.broadcastMessage(m); err != nil { + logger.WithError(err).Debug("Broadcast GetBlocksMessage failed") + return err + } + + return nil +} + +// announceBlocks sends an AnnounceBlocksMessage to all connections +func (dm *Daemon) announceBlocks() error { + if dm.config.DisableNetworking { + return ErrNetworkingDisabled + } + + headSeq, ok, err := dm.visor.HeadBkSeq() + if err != nil { + return err + } + if !ok { + return errors.New("Cannot announce blocks, there is no head block") + } + + m := NewAnnounceBlocksMessage(headSeq) + + if _, err := dm.broadcastMessage(m); err != nil { + logger.WithError(err).Debug("Broadcast AnnounceBlocksMessage failed") + return err + } + + return nil +} + +// createAndPublishBlock creates a block from unconfirmed transactions and sends it to the network. +// Will panic if not running as a block publisher. +// Will not create a block if outgoing connections are disabled. +// If the block was created but the broadcast failed, the error will be non-nil but the +// SignedBlock value will not be empty. +// TODO -- refactor this method -- it should either always create a block and maybe broadcast it, +// or use a database transaction to rollback block publishing if broadcast failed (however, this will cause a slow DB write) +func (dm *Daemon) createAndPublishBlock() (*coin.SignedBlock, error) { + if dm.config.DisableNetworking { + return nil, ErrNetworkingDisabled + } + + sb, err := dm.visor.CreateAndExecuteBlock() + if err != nil { + return nil, err + } + + err = dm.broadcastBlock(sb) + + return &sb, err +} + +// ResendUnconfirmedTxns resends all unconfirmed transactions and returns the hashes that were successfully rebroadcast. +// It does not return an error if broadcasting fails. +func (dm *Daemon) ResendUnconfirmedTxns() ([]cipher.SHA256, error) { + if dm.config.DisableNetworking { + return nil, ErrNetworkingDisabled + } + + txns, err := dm.visor.GetAllUnconfirmedTransactions() + if err != nil { + return nil, err + } + + var txids []cipher.SHA256 + for i := range txns { + txnHash := txns[i].Transaction.Hash() + logger.WithField("txid", txnHash.Hex()).Debug("Rebroadcast transaction") + if _, err := dm.BroadcastTransaction(txns[i].Transaction); err == nil { + txids = append(txids, txnHash) + } + } + + return txids, nil +} + +// BroadcastTransaction broadcasts a single transaction to all peers. +func (dm *Daemon) BroadcastTransaction(txn coin.Transaction) ([]uint64, error) { + if dm.config.DisableNetworking { + return nil, ErrNetworkingDisabled + } + + m := NewGiveTxnsMessage(coin.Transactions{txn}, dm.config.MaxOutgoingMessageLength) + if len(m.Transactions) != 1 { + logger.Critical().Error("NewGiveTxnsMessage truncated its only transaction") + } + + ids, err := dm.broadcastMessage(m) + if err != nil { + logger.WithError(err).Error("Broadcast GiveTxnsMessage failed") + return nil, err + } + + logger.Debugf("BroadcastTransaction to %d conns", len(ids)) + + return ids, nil +} + +// BroadcastUserTransaction broadcasts a single transaction to all peers. +// Returns an error if no peers that would propagate the transaction could be reached. +func (dm *Daemon) BroadcastUserTransaction(txn coin.Transaction, head *coin.SignedBlock, inputs coin.UxArray) error { + ids, err := dm.BroadcastTransaction(txn) + if err != nil { + return err + } + + accepts, err := checkBroadcastTxnRecipients(dm.connections, ids, txn, head, inputs) + if err != nil { + logger.WithError(err).Error("BroadcastUserTransaction") + return err + } + + logger.Debugf("BroadcastUserTransaction transaction propagated by %d/%d conns", accepts, len(ids)) + + return nil +} + +// checkBroadcastTxnRecipients checks whether or not the recipients of a txn broadcast would accept the transaction as valid, +// based upon their reported txn verification parameters. +// If no recipient would accept the txn, an error is returned. +// The number of recipients that claim to accept the transaction is returned. +func checkBroadcastTxnRecipients(connections *Connections, ids []uint64, txn coin.Transaction, head *coin.SignedBlock, inputs coin.UxArray) (int, error) { + // Check if the connections will accept our transaction as valid. + // Clients v24 and earlier do not propagate soft-invalid transactions. + // Clients v24 and earlier do not advertise a user agent. + // Clients v24 and earlier do not advertise their transaction verification parameters, + // but will use defaults of BurnFactor=2, MaxTransactionSize=32768, MaxDropletPrecision=3. + // If none of the connections will propagate our transaction, return an error. + accepts := 0 + + for _, id := range ids { + c := connections.getByGnetID(id) + if c == nil { + continue + } + + if !c.HasIntroduced() { + continue + } + + // If the peer has not set their user agent, they are v24 or earlier. + // v24 and earlier will not propagate a transaction that does not pass soft-validation. + // Check if our transaction would pass their soft-validation, using the hardcoded defaults + // that are used by v24 and earlier. + if c.UserAgent.Empty() { + if err := verifyUserTxnAgainstPeer(txn, head, inputs, params.VerifyTxn{ + BurnFactor: 2, + MaxTransactionSize: 32 * 1024, + MaxDropletPrecision: 3, + }); err != nil { + logger.WithFields(logrus.Fields{ + "addr": c.Addr, + "gnetID": c.gnetID, + }).Debug("Peer will not propagate this transaction") + continue + } + } + + accepts++ + } + + if accepts == 0 { + return 0, ErrNoPeerAcceptsTxn + } + + return accepts, nil +} + +// verifyUserTxnAgainstPeer returns an error if a user-created transaction would not pass soft-validation +// according to a peer's reported verification parameters +func verifyUserTxnAgainstPeer(txn coin.Transaction, head *coin.SignedBlock, inputs coin.UxArray, verifyParams params.VerifyTxn) error { + // Check the droplet precision + for _, o := range txn.Out { + if err := params.DropletPrecisionCheck(verifyParams.MaxDropletPrecision, o.Coins); err != nil { + return err + } + } + + // Check the txn size + txnSize, err := txn.Size() + if err != nil { + logger.Critical().WithError(err).Error("txn.Size failed unexpectedly") + return err + } + + if txnSize > verifyParams.MaxTransactionSize { + return visor.ErrTxnExceedsMaxBlockSize + } + + // Check the coinhour burn fee + f, err := fee.TransactionFee(&txn, head.Time(), inputs) + if err != nil { + return err + } + + if err := fee.VerifyTransactionFee(&txn, f, verifyParams.BurnFactor); err != nil { + return err + } + + return nil +} + +// Disconnect sends a DisconnectMessage to a peer. After the DisconnectMessage is sent, the peer is disconnected. +// This allows all pending messages to be sent. Any message queued after a DisconnectMessage is unlikely to be sent +// to the peer (but possible). +func (dm *Daemon) Disconnect(addr string, r gnet.DisconnectReason) error { + logger.WithFields(logrus.Fields{ + "addr": addr, + "reason": r, + }).Debug("Sending DisconnectMessage") + return dm.sendMessage(addr, NewDisconnectMessage(r)) +} + +// Implements private daemoner interface methods: + +// requestBlocksFromAddr sends a GetBlocksMessage to one connected address +func (dm *Daemon) requestBlocksFromAddr(addr string) error { + if dm.config.DisableNetworking { + return ErrNetworkingDisabled + } + + headSeq, ok, err := dm.visor.HeadBkSeq() + if err != nil { + return err + } + if !ok { + return errors.New("Cannot request blocks from addr, there is no head block") + } + + m := NewGetBlocksMessage(headSeq, dm.config.GetBlocksRequestCount) + return dm.sendMessage(addr, m) +} + +// broadcastBlock sends a signed block to all connections +func (dm *Daemon) broadcastBlock(sb coin.SignedBlock) error { + if dm.config.DisableNetworking { + return ErrNetworkingDisabled + } + + m := NewGiveBlocksMessage([]coin.SignedBlock{sb}, dm.config.MaxOutgoingMessageLength) + if len(m.Blocks) != 1 { + logger.Critical().Error("NewGiveBlocksMessage truncated its only block") + } + + _, err := dm.broadcastMessage(m) + return err +} + +// DaemonConfig returns the daemon config +func (dm *Daemon) DaemonConfig() DaemonConfig { + return dm.config +} + +// connectionIntroduced transfers a connection to the "introduced" state in the connections state machine +// and updates other state +func (dm *Daemon) connectionIntroduced(addr string, gnetID uint64, m *IntroductionMessage) (*connection, error) { + c, err := dm.connections.introduced(addr, gnetID, m) + if err != nil { + return nil, err + } + + listenAddr := c.ListenAddr() + + fields := logrus.Fields{ + "addr": addr, + "gnetID": m.c.ConnID, + "connGnetID": c.gnetID, + "listenPort": m.ListenPort, + "listenAddr": listenAddr, + } + + if c.Outgoing { + // For successful outgoing connections, mark the peer as having an incoming port in the pex peerlist + // The peer should already be in the peerlist, since we use the peerlist to choose an outgoing connection to make + if err := dm.pex.SetHasIncomingPort(listenAddr, true); err != nil { + logger.Critical().WithError(err).WithFields(fields).Error("pex.SetHasIncomingPort failed") + return nil, err + } + } else { + // For successful incoming connections, add the peer to the peer list, with their self-reported listen port + if err := dm.pex.AddPeer(listenAddr); err != nil { + logger.Critical().WithError(err).WithFields(fields).Error("pex.AddPeer failed") + return nil, err + } + } + + if err := dm.pex.SetUserAgent(listenAddr, c.UserAgent); err != nil { + logger.Critical().WithError(err).WithFields(fields).Error("pex.SetUserAgent failed") + return nil, err + } + + dm.pex.ResetRetryTimes(listenAddr) + + return c, nil +} + +// sendRandomPeers sends a random sample of peers to another peer +func (dm *Daemon) sendRandomPeers(addr string) error { + peers := dm.pex.RandomExchangeable(dm.pex.Config.ReplyCount) + if len(peers) == 0 { + logger.Debug("sendRandomPeers: no peers to send in reply") + return errors.New("No peers available") + } + + m := NewGivePeersMessage(peers, dm.config.MaxOutgoingMessageLength) + + return dm.sendMessage(addr, m) +} + +// announceAllValidTxns broadcasts valid unconfirmed transactions +func (dm *Daemon) announceAllValidTxns() error { + if dm.config.DisableNetworking { + return ErrNetworkingDisabled + } + + // Get valid unconfirmed transaction hashes + hashes, err := dm.visor.GetAllValidUnconfirmedTxHashes() + if err != nil { + return err + } + + return dm.announceTxnHashes(hashes) +} + +// announceTxnHashes announces transaction hashes, splitting them into chunks if they exceed MaxTxnAnnounceNum +func (dm *Daemon) announceTxnHashes(hashes []cipher.SHA256) error { + if dm.config.DisableNetworking { + return ErrNetworkingDisabled + } + + // Divide hashes into multiple sets of max size + hashesSet := divideHashes(hashes, dm.config.MaxTxnAnnounceNum) + + for _, hs := range hashesSet { + m := NewAnnounceTxnsMessage(hs, dm.config.MaxOutgoingMessageLength) + if len(m.Transactions) != len(hs) { + logger.Critical().Error("NewAnnounceTxnsMessage truncated hashes that were already split up") + } + if _, err := dm.broadcastMessage(m); err != nil { + logger.WithError(err).Debug("Broadcast AnnounceTxnsMessage failed") + return err + } + } + + return nil +} + +func divideHashes(hashes []cipher.SHA256, n int) [][]cipher.SHA256 { + if len(hashes) == 0 { + return [][]cipher.SHA256{} + } + + var j int + var hashesArray [][]cipher.SHA256 + + if len(hashes) > n { + for i := range hashes { + if len(hashes[j:i]) == n { + hs := make([]cipher.SHA256, n) + copy(hs, hashes[j:i]) + hashesArray = append(hashesArray, hs) + j = i + } + } + } + + hs := make([]cipher.SHA256, len(hashes)-j) + copy(hs, hashes[j:]) + hashesArray = append(hashesArray, hs) + return hashesArray +} + +// sendMessage sends a Message to a Connection and pushes the result onto the SendResults channel. +func (dm *Daemon) sendMessage(addr string, msg gnet.Message) error { + return dm.pool.Pool.SendMessage(addr, msg) +} + +// broadcastMessage sends a Message to all introduced connections in the Pool. +// Returns the gnet IDs of connections that broadcast succeeded for. +// Note that a connection could still fail to receive the message under certain network conditions, +// there is no guarantee that a message was broadcast. +func (dm *Daemon) broadcastMessage(msg gnet.Message) ([]uint64, error) { + if dm.config.DisableNetworking { + return nil, ErrNetworkingDisabled + } + + conns := dm.connections.all() + var addrs []string + for _, c := range conns { + if c.HasIntroduced() { + addrs = append(addrs, c.Addr) + } + } + + return dm.pool.Pool.BroadcastMessage(msg, addrs) +} + +// disconnectNow disconnects from a peer immediately without sending a DisconnectMessage. Any pending messages +// will not be sent to the peer. +func (dm *Daemon) disconnectNow(addr string, r gnet.DisconnectReason) error { + return dm.pool.Pool.Disconnect(addr, r) +} + +// pexConfig returns the pex config +func (dm *Daemon) pexConfig() pex.Config { + return dm.pex.Config +} + +// addPeers adds peers to the pex +func (dm *Daemon) addPeers(addrs []string) int { + return dm.pex.AddPeers(addrs) +} + +// recordPeerHeight records the height of specific peer +func (dm *Daemon) recordPeerHeight(addr string, gnetID, height uint64) { + if err := dm.connections.SetHeight(addr, gnetID, height); err != nil { + logger.Critical().WithError(err).WithField("addr", addr).Error("connections.SetHeight failed") + } +} + +// getSignedBlocksSince returns N signed blocks since given seq +func (dm *Daemon) getSignedBlocksSince(seq, count uint64) ([]coin.SignedBlock, error) { + return dm.visor.GetSignedBlocksSince(seq, count) +} + +// headBkSeq returns the head block sequence +func (dm *Daemon) headBkSeq() (uint64, bool, error) { + return dm.visor.HeadBkSeq() +} + +// executeSignedBlock executes the signed block +func (dm *Daemon) executeSignedBlock(b coin.SignedBlock) error { + return dm.visor.ExecuteSignedBlock(b) +} + +// filterKnownUnconfirmed returns unconfirmed txn hashes with known ones removed +func (dm *Daemon) filterKnownUnconfirmed(txns []cipher.SHA256) ([]cipher.SHA256, error) { + return dm.visor.FilterKnownUnconfirmed(txns) +} + +// getKnownUnconfirmed returns unconfirmed txn hashes with known ones removed +func (dm *Daemon) getKnownUnconfirmed(txns []cipher.SHA256) (coin.Transactions, error) { + return dm.visor.GetKnownUnconfirmed(txns) +} + +// injectTransaction records a coin.Transaction to the UnconfirmedTxnPool if the txn is not +// already in the blockchain. +// The bool return value is whether or not the transaction was already in the pool. +// If the transaction violates hard constraints, it is rejected, and error will not be nil. +// If the transaction only violates soft constraints, it is still injected, and the soft constraint violation is returned. +func (dm *Daemon) injectTransaction(txn coin.Transaction) (bool, *visor.ErrTxnViolatesSoftConstraint, error) { + return dm.visor.InjectForeignTransaction(txn) +} + +/* Connection management API */ + +// Connection a connection's state within the daemon +type Connection struct { + Addr string + Pex pex.Peer + Gnet GnetConnectionDetails + ConnectionDetails +} + +// GnetConnectionDetails connection data from gnet +type GnetConnectionDetails struct { + ID uint64 + LastSent time.Time + LastReceived time.Time +} + +func newConnection(dc *connection, gc *gnet.Connection, pp *pex.Peer) Connection { + c := Connection{} + + if dc != nil { + c.Addr = dc.Addr + c.ConnectionDetails = dc.ConnectionDetails + } + + if gc != nil { + c.Gnet = GnetConnectionDetails{ + ID: gc.ID, + LastSent: gc.LastSent, + LastReceived: gc.LastReceived, + } + } + + if pp != nil { + c.Pex = *pp + } + + return c +} + +// newConnection creates a Connection from daemon.connection, gnet.Connection and pex.Peer +func (dm *Daemon) newConnection(c *connection) (*Connection, error) { + if c == nil { + return nil, nil + } + + gc, err := dm.pool.Pool.GetConnection(c.Addr) + if err != nil { + return nil, err + } + + var pp *pex.Peer + listenAddr := c.ListenAddr() + if listenAddr != "" { + p, ok := dm.pex.GetPeer(listenAddr) + if ok { + pp = &p + } + } + + cc := newConnection(c, gc, pp) + return &cc, nil +} + +// GetConnections returns solicited (outgoing) connections +func (dm *Daemon) GetConnections(f func(c Connection) bool) ([]Connection, error) { + if dm.pool.Pool == nil { + return nil, nil + } + + cs := dm.connections.all() + + conns := make([]Connection, 0) + + for _, c := range cs { + cc, err := dm.newConnection(&c) + if err != nil { + return nil, err + } + + ccc := *cc + + if !f(ccc) { + continue + } + + conns = append(conns, ccc) + } + + // Sort connnections by IP address + sort.Slice(conns, func(i, j int) bool { + return strings.Compare(conns[i].Addr, conns[j].Addr) < 0 + }) + + return conns, nil +} + +// GetDefaultConnections returns the default hardcoded connection addresses +func (dm *Daemon) GetDefaultConnections() []string { + conns := make([]string, len(dm.config.DefaultConnections)) + copy(conns[:], dm.config.DefaultConnections[:]) + return conns +} + +// GetConnection returns a *Connection of specific address +func (dm *Daemon) GetConnection(addr string) (*Connection, error) { + c := dm.connections.get(addr) + if c == nil { + return nil, nil + } + + return dm.newConnection(c) +} + +// DisconnectByGnetID disconnects a connection by gnet ID +func (dm *Daemon) DisconnectByGnetID(gnetID uint64) error { + c := dm.connections.getByGnetID(gnetID) + if c == nil { + return ErrConnectionNotExist + } + + return dm.Disconnect(c.Addr, ErrDisconnectRequestedByOperator) +} + +// GetTrustConnections returns all trusted connections +func (dm *Daemon) GetTrustConnections() []string { + return dm.pex.Trusted().ToAddrs() +} + +// GetExchgConnection returns all connections to peers found through peer exchange +func (dm *Daemon) GetExchgConnection() []string { + return dm.pex.RandomExchangeable(0).ToAddrs() +} + +/* Peer Blockchain Status API */ + +// BlockchainProgress is the current blockchain syncing status +type BlockchainProgress struct { + // Our current blockchain length + Current uint64 + // Our best guess at true blockchain length + Highest uint64 + // Individual blockchain length reports from peers + Peers []PeerBlockchainHeight +} + +// newBlockchainProgress creates BlockchainProgress from the local head blockchain sequence number +// and a list of remote peers +func newBlockchainProgress(headSeq uint64, conns []connection) *BlockchainProgress { + peers := newPeerBlockchainHeights(conns) + + return &BlockchainProgress{ + Current: headSeq, + Highest: EstimateBlockchainHeight(headSeq, peers), + Peers: peers, + } +} + +// PeerBlockchainHeight records blockchain height for an address +type PeerBlockchainHeight struct { + Address string + Height uint64 +} + +func newPeerBlockchainHeights(conns []connection) []PeerBlockchainHeight { + peers := make([]PeerBlockchainHeight, 0, len(conns)) + for _, c := range conns { + if c.State != ConnectionStatePending { + peers = append(peers, PeerBlockchainHeight{ + Address: c.Addr, + Height: c.Height, + }) + } + } + return peers +} + +// EstimateBlockchainHeight estimates the blockchain sync height. +// The highest height reported amongst all peers, and including the node itself, is returned. +func EstimateBlockchainHeight(headSeq uint64, peers []PeerBlockchainHeight) uint64 { + for _, c := range peers { + if c.Height > headSeq { + headSeq = c.Height + } + } + return headSeq +} + +// GetBlockchainProgress returns a *BlockchainProgress +func (dm *Daemon) GetBlockchainProgress(headSeq uint64) *BlockchainProgress { + conns := dm.connections.all() + return newBlockchainProgress(headSeq, conns) +} + +// InjectBroadcastTransaction injects transaction to the unconfirmed pool and broadcasts it. +// If the transaction violates either hard or soft constraints, it is neither injected nor broadcast. +// If the broadcast fails (due to no connections), the transaction is not injected. +// However, the broadcast may fail in practice, without returning an error, +// so this is not foolproof. +// This method is to be used by user-initiated transaction injections. +// For transactions received over the network, use daemon.injectTransaction and check the result to +// decide on repropagation. +func (dm *Daemon) InjectBroadcastTransaction(txn coin.Transaction) error { + return dm.visor.WithUpdateTx("daemon.InjectBroadcastTransaction", func(tx *dbutil.Tx) error { + _, head, inputs, err := dm.visor.InjectUserTransactionTx(tx, txn) + if err != nil { + logger.WithError(err).Error("InjectUserTransactionTx failed") + return err + } + + if err := dm.BroadcastUserTransaction(txn, head, inputs); err != nil { + logger.WithError(err).Error("BroadcastUserTransaction failed") + return err + } + + return nil + }) +} + +// InjectTransaction injects transaction to the unconfirmed pool but does not broadcast it. +// If the transaction violates either hard or soft constraints, it is not injected. +// This method is to be used by user-initiated transaction injections. +// For transactions received over the network, use daemon.injectTransaction and check the result to +// decide on repropagation. +func (dm *Daemon) InjectTransaction(txn coin.Transaction) error { + _, _, _, err := dm.visor.InjectUserTransaction(txn) + return err +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/daemon_test.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/daemon_test.go new file mode 100644 index 00000000..e23734b4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/daemon_test.go @@ -0,0 +1,342 @@ +package daemon + +import ( + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/util/fee" + "github.com/SkycoinProject/skycoin/src/util/useragent" + "github.com/SkycoinProject/skycoin/src/visor" +) + +func TestDivideHashes(t *testing.T) { + hashes := make([]cipher.SHA256, 10) + for i := 0; i < 10; i++ { + hashes[i] = cipher.SumSHA256(cipher.RandByte(512)) + } + + testCases := []struct { + name string + init []cipher.SHA256 + n int + array [][]cipher.SHA256 + }{ + { + "has one odd", + hashes[:], + 3, + [][]cipher.SHA256{ + []cipher.SHA256{ + hashes[0], + hashes[1], + hashes[2], + }, + []cipher.SHA256{ + hashes[3], + hashes[4], + hashes[5], + }, + []cipher.SHA256{ + hashes[6], + hashes[7], + hashes[8], + }, + []cipher.SHA256{ + hashes[9], + }, + }, + }, + { + "only one value", + hashes[:1], + 1, + [][]cipher.SHA256{ + []cipher.SHA256{ + hashes[0], + }, + }, + }, + { + "empty value", + hashes[:0], + 0, + [][]cipher.SHA256{}, + }, + { + "with 3 value", + hashes[:3], + 3, + [][]cipher.SHA256{ + []cipher.SHA256{ + hashes[0], + hashes[1], + hashes[2], + }, + }, + }, + { + "with 8 value", + hashes[:8], + 3, + [][]cipher.SHA256{ + []cipher.SHA256{ + hashes[0], + hashes[1], + hashes[2], + }, + []cipher.SHA256{ + hashes[3], + hashes[4], + hashes[5], + }, + []cipher.SHA256{ + hashes[6], + hashes[7], + }, + }, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + rlt := divideHashes(tc.init, tc.n) + require.Equal(t, tc.array, rlt) + }) + } +} + +func TestVerifyUserTxnAgainstPeer(t *testing.T) { + now := uint64(time.Now().UTC().Unix()) + + cases := []struct { + name string + err error + txn coin.Transaction + head *coin.SignedBlock + inputs coin.UxArray + verifyParams params.VerifyTxn + }{ + { + name: "invalid droplet precision", + err: params.ErrInvalidDecimals, + txn: coin.Transaction{ + Out: []coin.TransactionOutput{ + { + Coins: 111100, + }, + }, + }, + verifyParams: params.VerifyTxn{ + MaxDropletPrecision: 3, + }, + }, + + { + name: "invalid txn size", + err: visor.ErrTxnExceedsMaxBlockSize, + txn: coin.Transaction{ + Out: []coin.TransactionOutput{ + { + Coins: 1e6, + }, + }, + }, + verifyParams: params.VerifyTxn{ + MaxDropletPrecision: 3, + MaxTransactionSize: 1, + }, + }, + + { + name: "invalid burn fee", + err: fee.ErrTxnInsufficientFee, + txn: coin.Transaction{ + Out: []coin.TransactionOutput{ + { + Coins: 1e6, + Hours: 100, + }, + }, + }, + head: &coin.SignedBlock{ + Block: coin.Block{ + Head: coin.BlockHeader{ + Time: now, + }, + }, + }, + inputs: coin.UxArray{ + { + Head: coin.UxHead{ + Time: now, + }, + Body: coin.UxBody{ + Coins: 1e6, + Hours: 150, + }, + }, + }, + verifyParams: params.VerifyTxn{ + MaxDropletPrecision: 3, + MaxTransactionSize: 99999999, + BurnFactor: 2, + }, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + err := verifyUserTxnAgainstPeer(tc.txn, tc.head, tc.inputs, tc.verifyParams) + require.Equal(t, tc.err, err) + }) + } +} + +func TestCheckBroadcastTxnRecipients(t *testing.T) { + // contains a connection not introduced and a connection without user agent + connections := NewConnections() + + // one connection connected but not introduced + _, err := connections.connected("1.1.1.1:9999", 3) + require.NoError(t, err) + + // one connection introduced without user agent + _, err = connections.connected("2.2.2.2:9999", 1) + require.NoError(t, err) + _, err = connections.introduced("2.2.2.2:9999", 1, &IntroductionMessage{ + Mirror: 6666, + ListenPort: 9999, + ProtocolVersion: 2, + }) + require.NoError(t, err) + + // contains a connection not introduced, a connection without user agent + // and a connection with user agent + connections2 := NewConnections() + + // one connection connected but not introduced + _, err = connections2.connected("1.1.1.1:9999", 3) + require.NoError(t, err) + + // one connection introduced without user agent + _, err = connections2.connected("2.2.2.2:9999", 1) + require.NoError(t, err) + _, err = connections2.introduced("2.2.2.2:9999", 1, &IntroductionMessage{ + Mirror: 6666, + ListenPort: 9999, + ProtocolVersion: 2, + }) + require.NoError(t, err) + + // one connection introduced with user agent + _, err = connections2.connected("3.3.3.3:9999", 2) + require.NoError(t, err) + _, err = connections2.introduced("3.3.3.3:9999", 2, &IntroductionMessage{ + Mirror: 7777, + ListenPort: 9999, + ProtocolVersion: 2, + UserAgent: useragent.MustParse("skycoin:0.25.1"), + UnconfirmedVerifyTxn: params.VerifyTxn{ + MaxDropletPrecision: 4, // the default precision for unspecified peers is 3 + MaxTransactionSize: 32768, + BurnFactor: 2, + }, + }) + require.NoError(t, err) + + cases := []struct { + name string + err error + accepts int + connections *Connections + ids []uint64 + txn coin.Transaction + head *coin.SignedBlock + inputs coin.UxArray + }{ + { + name: "accepted by connection with no user agent", + err: nil, + accepts: 1, + connections: connections, + ids: []uint64{1, 2, 999}, // includes unknown gnet id to make sure it doesn't crash on bad input + txn: coin.Transaction{ + Out: []coin.TransactionOutput{ + { + Coins: 1e6, + }, + }, + }, + head: &coin.SignedBlock{}, + inputs: coin.UxArray{ + { + Body: coin.UxBody{ + Coins: 1e6, + Hours: 100, + }, + }, + }, + }, + + { + name: "not accepted by connection with no user agent", + err: ErrNoPeerAcceptsTxn, + accepts: 0, + connections: connections, + ids: []uint64{1, 2}, + txn: coin.Transaction{ + Out: []coin.TransactionOutput{ + { + Coins: 1e2, + }, + }, + }, + head: &coin.SignedBlock{}, + inputs: coin.UxArray{ + { + Body: coin.UxBody{ + Coins: 1e2, + Hours: 100, + }, + }, + }, + }, + + { + name: "connections contains a connection that specifies user agent, which will propagate a txn even if soft-invalid", + err: nil, + accepts: 1, + connections: connections2, + ids: []uint64{1, 2, 3}, + txn: coin.Transaction{ + Out: []coin.TransactionOutput{ + { + Coins: 1e1, + }, + }, + }, + head: &coin.SignedBlock{}, + inputs: coin.UxArray{ + { + Body: coin.UxBody{ + Coins: 1e1, + Hours: 100, + }, + }, + }, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + accepts, err := checkBroadcastTxnRecipients(tc.connections, tc.ids, tc.txn, tc.head, tc.inputs) + require.Equal(t, tc.err, err) + require.Equal(t, tc.accepts, accepts) + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/disconnect_message_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/disconnect_message_skyencoder.go new file mode 100644 index 00000000..3e8ed070 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/disconnect_message_skyencoder.go @@ -0,0 +1,118 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package daemon + +import ( + "errors" + "math" + + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +// encodeSizeDisconnectMessage computes the size of an encoded object of type DisconnectMessage +func encodeSizeDisconnectMessage(obj *DisconnectMessage) uint64 { + i0 := uint64(0) + + // obj.ReasonCode + i0 += 2 + + // obj.Reserved + i0 += 4 + uint64(len(obj.Reserved)) + + return i0 +} + +// encodeDisconnectMessage encodes an object of type DisconnectMessage to a buffer allocated to the exact size +// required to encode the object. +func encodeDisconnectMessage(obj *DisconnectMessage) ([]byte, error) { + n := encodeSizeDisconnectMessage(obj) + buf := make([]byte, n) + + if err := encodeDisconnectMessageToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeDisconnectMessageToBuffer encodes an object of type DisconnectMessage to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeDisconnectMessageToBuffer(buf []byte, obj *DisconnectMessage) error { + if uint64(len(buf)) < encodeSizeDisconnectMessage(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.ReasonCode + e.Uint16(obj.ReasonCode) + + // obj.Reserved length check + if uint64(len(obj.Reserved)) > math.MaxUint32 { + return errors.New("obj.Reserved length exceeds math.MaxUint32") + } + + // obj.Reserved length + e.Uint32(uint32(len(obj.Reserved))) + + // obj.Reserved copy + e.CopyBytes(obj.Reserved) + + return nil +} + +// decodeDisconnectMessage decodes an object of type DisconnectMessage from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeDisconnectMessage(buf []byte, obj *DisconnectMessage) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.ReasonCode + i, err := d.Uint16() + if err != nil { + return 0, err + } + obj.ReasonCode = i + } + + { + // obj.Reserved + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length != 0 { + obj.Reserved = make([]byte, length) + + copy(obj.Reserved[:], d.Buffer[:length]) + d.Buffer = d.Buffer[length:] + } + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeDisconnectMessageExact decodes an object of type DisconnectMessage from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeDisconnectMessageExact(buf []byte, obj *DisconnectMessage) error { + if n, err := decodeDisconnectMessage(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/disconnect_message_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/disconnect_message_skyencoder_test.go new file mode 100644 index 00000000..f19ef035 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/disconnect_message_skyencoder_test.go @@ -0,0 +1,421 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package daemon + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +func newEmptyDisconnectMessageForEncodeTest() *DisconnectMessage { + var obj DisconnectMessage + return &obj +} + +func newRandomDisconnectMessageForEncodeTest(t *testing.T, rand *mathrand.Rand) *DisconnectMessage { + var obj DisconnectMessage + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenDisconnectMessageForEncodeTest(t *testing.T, rand *mathrand.Rand) *DisconnectMessage { + var obj DisconnectMessage + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilDisconnectMessageForEncodeTest(t *testing.T, rand *mathrand.Rand) *DisconnectMessage { + var obj DisconnectMessage + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderDisconnectMessage(t *testing.T, obj *DisconnectMessage) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeDisconnectMessage(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeDisconnectMessage() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeDisconnectMessage(obj) + if err != nil { + t.Fatalf("encodeDisconnectMessage failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeDisconnectMessage produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeDisconnectMessage()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeDisconnectMessageToBuffer(data3, obj); err != nil { + t.Fatalf("encodeDisconnectMessageToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 DisconnectMessage + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 DisconnectMessage + if n, err := decodeDisconnectMessage(data2, &obj3); err != nil { + t.Fatalf("decodeDisconnectMessage failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeDisconnectMessage bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeDisconnectMessage()") + } + + // Decode, excess buffer + var obj4 DisconnectMessage + n, err := decodeDisconnectMessage(data3, &obj4) + if err != nil { + t.Fatalf("decodeDisconnectMessage failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeDisconnectMessage bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeDisconnectMessage bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeDisconnectMessage()") + } + + // DecodeExact + var obj5 DisconnectMessage + if err := decodeDisconnectMessageExact(data2, &obj5); err != nil { + t.Fatalf("decodeDisconnectMessage failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeDisconnectMessage()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeDisconnectMessage(data4, &obj3); err != nil { + t.Fatalf("decodeDisconnectMessage failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeDisconnectMessage bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderDisconnectMessage(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *DisconnectMessage + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptyDisconnectMessageForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomDisconnectMessageForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenDisconnectMessageForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilDisconnectMessageForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderDisconnectMessage(t, tc.obj) + }) + } +} + +func decodeDisconnectMessageExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj DisconnectMessage + if _, err := decodeDisconnectMessage(buf, &obj); err == nil { + t.Fatal("decodeDisconnectMessage: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeDisconnectMessage: expected error %q, got %q", expectedErr, err) + } +} + +func decodeDisconnectMessageExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj DisconnectMessage + if err := decodeDisconnectMessageExact(buf, &obj); err == nil { + t.Fatal("decodeDisconnectMessageExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeDisconnectMessageExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderDisconnectMessageDecodeErrors(t *testing.T, k int, tag string, obj *DisconnectMessage) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeDisconnectMessage(obj) + buf, err := encodeDisconnectMessage(obj) + if err != nil { + t.Fatalf("encodeDisconnectMessage failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeDisconnectMessageExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeDisconnectMessageExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeDisconnectMessageExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeDisconnectMessageExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeDisconnectMessageExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderDisconnectMessageDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptyDisconnectMessageForEncodeTest() + fullObj := newRandomDisconnectMessageForEncodeTest(t, rand) + testSkyencoderDisconnectMessageDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderDisconnectMessageDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/errors.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/errors.go new file mode 100644 index 00000000..8cb21b5c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/errors.go @@ -0,0 +1,112 @@ +package daemon + +import ( + "errors" + + "github.com/SkycoinProject/skycoin/src/daemon/gnet" +) + +var ( + // ErrDisconnectVersionNotSupported version is below minimum supported version + ErrDisconnectVersionNotSupported gnet.DisconnectReason = errors.New("Version is below minimum supported version") + // ErrDisconnectIntroductionTimeout timeout + ErrDisconnectIntroductionTimeout gnet.DisconnectReason = errors.New("Introduction timeout") + // ErrDisconnectIsBlacklisted is blacklisted + ErrDisconnectIsBlacklisted gnet.DisconnectReason = errors.New("Blacklisted") + // ErrDisconnectSelf self connnect + ErrDisconnectSelf gnet.DisconnectReason = errors.New("Self connect") + // ErrDisconnectConnectedTwice connect twice + ErrDisconnectConnectedTwice gnet.DisconnectReason = errors.New("Already connected") + // ErrDisconnectIdle idle + ErrDisconnectIdle gnet.DisconnectReason = errors.New("Idle") + // ErrDisconnectNoIntroduction no introduction + ErrDisconnectNoIntroduction gnet.DisconnectReason = errors.New("First message was not an Introduction") + // ErrDisconnectIPLimitReached ip limit reached + ErrDisconnectIPLimitReached gnet.DisconnectReason = errors.New("Maximum number of connections for this IP was reached") + // ErrDisconnectUnexpectedError this is returned when a seemingly impossible error is encountered, e.g. net.Conn.Addr() returns an invalid ip:port + ErrDisconnectUnexpectedError gnet.DisconnectReason = errors.New("Unexpected error") + // ErrDisconnectMaxOutgoingConnectionsReached is returned when connection pool size is greater than the maximum allowed + ErrDisconnectMaxOutgoingConnectionsReached gnet.DisconnectReason = errors.New("Maximum outgoing connections was reached") + // ErrDisconnectBlockchainPubkeyNotMatched is returned when the blockchain pubkey in introduction does not match + ErrDisconnectBlockchainPubkeyNotMatched gnet.DisconnectReason = errors.New("Blockchain pubkey does not match") + // ErrDisconnectBlockchainPubkeyNotProvided is returned when the blockchain pubkey in introduction is not provided + ErrDisconnectBlockchainPubkeyNotProvided gnet.DisconnectReason = errors.New("Blockchain pubkey is not provided") + // ErrDisconnectInvalidExtraData is returned when extra field can't be parsed + ErrDisconnectInvalidExtraData gnet.DisconnectReason = errors.New("Invalid extra data in message") + // ErrDisconnectReceivedDisconnect received a DisconnectMessage + ErrDisconnectReceivedDisconnect gnet.DisconnectReason = errors.New("Received DisconnectMessage") + // ErrDisconnectInvalidUserAgent is returned if the peer provides an invalid user agent + ErrDisconnectInvalidUserAgent gnet.DisconnectReason = errors.New("Invalid user agent") + // ErrDisconnectRequestedByOperator the operator of the node requested a disconnect + ErrDisconnectRequestedByOperator gnet.DisconnectReason = errors.New("Disconnect requested by the node operator") + // ErrDisconnectPeerlistFull the peerlist is full + ErrDisconnectPeerlistFull gnet.DisconnectReason = errors.New("Peerlist is full") + // ErrDisconnectInvalidBurnFactor invalid burn factor in introduction message + ErrDisconnectInvalidBurnFactor gnet.DisconnectReason = errors.New("Invalid burn factor in introduction message") + // ErrDisconnectInvalidMaxTransactionSize invalid max transaction size in introduction message + ErrDisconnectInvalidMaxTransactionSize gnet.DisconnectReason = errors.New("Invalid max transaction size in introduction message") + // ErrDisconnectInvalidMaxDropletPrecision invalid max droplet precision in introduction message + ErrDisconnectInvalidMaxDropletPrecision gnet.DisconnectReason = errors.New("Invalid max droplet precision in introduction message") + + // ErrDisconnectUnknownReason used when mapping an unknown reason code to an error. Is not sent over the network. + ErrDisconnectUnknownReason gnet.DisconnectReason = errors.New("Unknown DisconnectReason") + + disconnectReasonCodes = map[gnet.DisconnectReason]uint16{ + ErrDisconnectUnknownReason: 0, + + ErrDisconnectVersionNotSupported: 1, + ErrDisconnectIntroductionTimeout: 2, + ErrDisconnectIsBlacklisted: 3, + ErrDisconnectSelf: 4, + ErrDisconnectConnectedTwice: 5, + ErrDisconnectIdle: 6, + ErrDisconnectNoIntroduction: 7, + ErrDisconnectIPLimitReached: 8, + ErrDisconnectUnexpectedError: 9, + ErrDisconnectMaxOutgoingConnectionsReached: 10, + ErrDisconnectBlockchainPubkeyNotMatched: 11, + ErrDisconnectInvalidExtraData: 12, + ErrDisconnectReceivedDisconnect: 13, + ErrDisconnectInvalidUserAgent: 14, + ErrDisconnectRequestedByOperator: 15, + ErrDisconnectPeerlistFull: 16, + ErrDisconnectInvalidBurnFactor: 17, + ErrDisconnectInvalidMaxTransactionSize: 18, + ErrDisconnectInvalidMaxDropletPrecision: 19, + + // gnet codes are registered here, but they are not sent in a DISC + // message by gnet. Only daemon sends a DISC packet. + // If gnet chooses to disconnect it will not send a DISC packet. + gnet.ErrDisconnectSetReadDeadlineFailed: 1001, + gnet.ErrDisconnectInvalidMessageLength: 1002, + gnet.ErrDisconnectMalformedMessage: 1003, + gnet.ErrDisconnectUnknownMessage: 1004, + gnet.ErrDisconnectShutdown: 1005, + gnet.ErrDisconnectMessageDecodeUnderflow: 1006, + gnet.ErrDisconnectTruncatedMessageID: 1007, + } + + disconnectCodeReasons map[uint16]gnet.DisconnectReason +) + +func init() { + disconnectCodeReasons = make(map[uint16]gnet.DisconnectReason, len(disconnectReasonCodes)) + + for r, c := range disconnectReasonCodes { + disconnectCodeReasons[c] = r + } +} + +// DisconnectReasonToCode maps a gnet.DisconnectReason to a 16-byte code +func DisconnectReasonToCode(r gnet.DisconnectReason) uint16 { + return disconnectReasonCodes[r] +} + +// DisconnectCodeToReason maps a disconnect code to a gnet.DisconnectReason +func DisconnectCodeToReason(c uint16) gnet.DisconnectReason { + r, ok := disconnectCodeReasons[c] + if !ok { + return ErrDisconnectUnknownReason + } + return r +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/errors_test.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/errors_test.go new file mode 100644 index 00000000..a40f5af6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/errors_test.go @@ -0,0 +1,29 @@ +package daemon + +import ( + "errors" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/daemon/gnet" +) + +func TestDisconnectReasonCode(t *testing.T) { + c := DisconnectReasonToCode(ErrDisconnectIdle) + require.NotEqual(t, uint16(0), c) + + r := DisconnectCodeToReason(c) + require.Equal(t, ErrDisconnectIdle, r) + + // unknown reason is fine + c = DisconnectReasonToCode(gnet.DisconnectReason(errors.New("foo"))) + require.Equal(t, uint16(0), c) + + r = DisconnectCodeToReason(c) + require.Equal(t, ErrDisconnectUnknownReason, r) + + // unknown code is fine + r = DisconnectCodeToReason(999) + require.Equal(t, ErrDisconnectUnknownReason, r) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/get_blocks_message_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/get_blocks_message_skyencoder.go new file mode 100644 index 00000000..0ddfa8ea --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/get_blocks_message_skyencoder.go @@ -0,0 +1,93 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package daemon + +import "github.com/SkycoinProject/skycoin/src/cipher/encoder" + +// encodeSizeGetBlocksMessage computes the size of an encoded object of type GetBlocksMessage +func encodeSizeGetBlocksMessage(obj *GetBlocksMessage) uint64 { + i0 := uint64(0) + + // obj.LastBlock + i0 += 8 + + // obj.RequestedBlocks + i0 += 8 + + return i0 +} + +// encodeGetBlocksMessage encodes an object of type GetBlocksMessage to a buffer allocated to the exact size +// required to encode the object. +func encodeGetBlocksMessage(obj *GetBlocksMessage) ([]byte, error) { + n := encodeSizeGetBlocksMessage(obj) + buf := make([]byte, n) + + if err := encodeGetBlocksMessageToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeGetBlocksMessageToBuffer encodes an object of type GetBlocksMessage to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeGetBlocksMessageToBuffer(buf []byte, obj *GetBlocksMessage) error { + if uint64(len(buf)) < encodeSizeGetBlocksMessage(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.LastBlock + e.Uint64(obj.LastBlock) + + // obj.RequestedBlocks + e.Uint64(obj.RequestedBlocks) + + return nil +} + +// decodeGetBlocksMessage decodes an object of type GetBlocksMessage from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeGetBlocksMessage(buf []byte, obj *GetBlocksMessage) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.LastBlock + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.LastBlock = i + } + + { + // obj.RequestedBlocks + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.RequestedBlocks = i + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeGetBlocksMessageExact decodes an object of type GetBlocksMessage from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeGetBlocksMessageExact(buf []byte, obj *GetBlocksMessage) error { + if n, err := decodeGetBlocksMessage(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/get_blocks_message_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/get_blocks_message_skyencoder_test.go new file mode 100644 index 00000000..2179f03d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/get_blocks_message_skyencoder_test.go @@ -0,0 +1,421 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package daemon + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +func newEmptyGetBlocksMessageForEncodeTest() *GetBlocksMessage { + var obj GetBlocksMessage + return &obj +} + +func newRandomGetBlocksMessageForEncodeTest(t *testing.T, rand *mathrand.Rand) *GetBlocksMessage { + var obj GetBlocksMessage + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenGetBlocksMessageForEncodeTest(t *testing.T, rand *mathrand.Rand) *GetBlocksMessage { + var obj GetBlocksMessage + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilGetBlocksMessageForEncodeTest(t *testing.T, rand *mathrand.Rand) *GetBlocksMessage { + var obj GetBlocksMessage + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderGetBlocksMessage(t *testing.T, obj *GetBlocksMessage) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeGetBlocksMessage(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeGetBlocksMessage() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeGetBlocksMessage(obj) + if err != nil { + t.Fatalf("encodeGetBlocksMessage failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeGetBlocksMessage produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeGetBlocksMessage()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeGetBlocksMessageToBuffer(data3, obj); err != nil { + t.Fatalf("encodeGetBlocksMessageToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 GetBlocksMessage + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 GetBlocksMessage + if n, err := decodeGetBlocksMessage(data2, &obj3); err != nil { + t.Fatalf("decodeGetBlocksMessage failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeGetBlocksMessage bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeGetBlocksMessage()") + } + + // Decode, excess buffer + var obj4 GetBlocksMessage + n, err := decodeGetBlocksMessage(data3, &obj4) + if err != nil { + t.Fatalf("decodeGetBlocksMessage failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeGetBlocksMessage bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeGetBlocksMessage bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeGetBlocksMessage()") + } + + // DecodeExact + var obj5 GetBlocksMessage + if err := decodeGetBlocksMessageExact(data2, &obj5); err != nil { + t.Fatalf("decodeGetBlocksMessage failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeGetBlocksMessage()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeGetBlocksMessage(data4, &obj3); err != nil { + t.Fatalf("decodeGetBlocksMessage failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeGetBlocksMessage bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderGetBlocksMessage(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *GetBlocksMessage + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptyGetBlocksMessageForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomGetBlocksMessageForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenGetBlocksMessageForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilGetBlocksMessageForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderGetBlocksMessage(t, tc.obj) + }) + } +} + +func decodeGetBlocksMessageExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj GetBlocksMessage + if _, err := decodeGetBlocksMessage(buf, &obj); err == nil { + t.Fatal("decodeGetBlocksMessage: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeGetBlocksMessage: expected error %q, got %q", expectedErr, err) + } +} + +func decodeGetBlocksMessageExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj GetBlocksMessage + if err := decodeGetBlocksMessageExact(buf, &obj); err == nil { + t.Fatal("decodeGetBlocksMessageExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeGetBlocksMessageExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderGetBlocksMessageDecodeErrors(t *testing.T, k int, tag string, obj *GetBlocksMessage) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeGetBlocksMessage(obj) + buf, err := encodeGetBlocksMessage(obj) + if err != nil { + t.Fatalf("encodeGetBlocksMessage failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeGetBlocksMessageExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeGetBlocksMessageExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeGetBlocksMessageExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeGetBlocksMessageExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeGetBlocksMessageExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderGetBlocksMessageDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptyGetBlocksMessageForEncodeTest() + fullObj := newRandomGetBlocksMessageForEncodeTest(t, rand) + testSkyencoderGetBlocksMessageDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderGetBlocksMessageDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/get_txns_message_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/get_txns_message_skyencoder.go new file mode 100644 index 00000000..e6ae83cf --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/get_txns_message_skyencoder.go @@ -0,0 +1,135 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package daemon + +import ( + "errors" + "math" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +// encodeSizeGetTxnsMessage computes the size of an encoded object of type GetTxnsMessage +func encodeSizeGetTxnsMessage(obj *GetTxnsMessage) uint64 { + i0 := uint64(0) + + // obj.Transactions + i0 += 4 + { + i1 := uint64(0) + + // x1 + i1 += 32 + + i0 += uint64(len(obj.Transactions)) * i1 + } + + return i0 +} + +// encodeGetTxnsMessage encodes an object of type GetTxnsMessage to a buffer allocated to the exact size +// required to encode the object. +func encodeGetTxnsMessage(obj *GetTxnsMessage) ([]byte, error) { + n := encodeSizeGetTxnsMessage(obj) + buf := make([]byte, n) + + if err := encodeGetTxnsMessageToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeGetTxnsMessageToBuffer encodes an object of type GetTxnsMessage to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeGetTxnsMessageToBuffer(buf []byte, obj *GetTxnsMessage) error { + if uint64(len(buf)) < encodeSizeGetTxnsMessage(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Transactions maxlen check + if len(obj.Transactions) > 256 { + return encoder.ErrMaxLenExceeded + } + + // obj.Transactions length check + if uint64(len(obj.Transactions)) > math.MaxUint32 { + return errors.New("obj.Transactions length exceeds math.MaxUint32") + } + + // obj.Transactions length + e.Uint32(uint32(len(obj.Transactions))) + + // obj.Transactions + for _, x := range obj.Transactions { + + // x + e.CopyBytes(x[:]) + + } + + return nil +} + +// decodeGetTxnsMessage decodes an object of type GetTxnsMessage from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeGetTxnsMessage(buf []byte, obj *GetTxnsMessage) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Transactions + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 256 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Transactions = make([]cipher.SHA256, length) + + for z1 := range obj.Transactions { + { + // obj.Transactions[z1] + if len(d.Buffer) < len(obj.Transactions[z1]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Transactions[z1][:], d.Buffer[:len(obj.Transactions[z1])]) + d.Buffer = d.Buffer[len(obj.Transactions[z1]):] + } + + } + } + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeGetTxnsMessageExact decodes an object of type GetTxnsMessage from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeGetTxnsMessageExact(buf []byte, obj *GetTxnsMessage) error { + if n, err := decodeGetTxnsMessage(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/get_txns_message_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/get_txns_message_skyencoder_test.go new file mode 100644 index 00000000..79e9ed94 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/get_txns_message_skyencoder_test.go @@ -0,0 +1,421 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package daemon + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +func newEmptyGetTxnsMessageForEncodeTest() *GetTxnsMessage { + var obj GetTxnsMessage + return &obj +} + +func newRandomGetTxnsMessageForEncodeTest(t *testing.T, rand *mathrand.Rand) *GetTxnsMessage { + var obj GetTxnsMessage + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenGetTxnsMessageForEncodeTest(t *testing.T, rand *mathrand.Rand) *GetTxnsMessage { + var obj GetTxnsMessage + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilGetTxnsMessageForEncodeTest(t *testing.T, rand *mathrand.Rand) *GetTxnsMessage { + var obj GetTxnsMessage + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderGetTxnsMessage(t *testing.T, obj *GetTxnsMessage) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeGetTxnsMessage(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeGetTxnsMessage() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeGetTxnsMessage(obj) + if err != nil { + t.Fatalf("encodeGetTxnsMessage failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeGetTxnsMessage produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeGetTxnsMessage()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeGetTxnsMessageToBuffer(data3, obj); err != nil { + t.Fatalf("encodeGetTxnsMessageToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 GetTxnsMessage + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 GetTxnsMessage + if n, err := decodeGetTxnsMessage(data2, &obj3); err != nil { + t.Fatalf("decodeGetTxnsMessage failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeGetTxnsMessage bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeGetTxnsMessage()") + } + + // Decode, excess buffer + var obj4 GetTxnsMessage + n, err := decodeGetTxnsMessage(data3, &obj4) + if err != nil { + t.Fatalf("decodeGetTxnsMessage failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeGetTxnsMessage bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeGetTxnsMessage bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeGetTxnsMessage()") + } + + // DecodeExact + var obj5 GetTxnsMessage + if err := decodeGetTxnsMessageExact(data2, &obj5); err != nil { + t.Fatalf("decodeGetTxnsMessage failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeGetTxnsMessage()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeGetTxnsMessage(data4, &obj3); err != nil { + t.Fatalf("decodeGetTxnsMessage failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeGetTxnsMessage bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderGetTxnsMessage(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *GetTxnsMessage + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptyGetTxnsMessageForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomGetTxnsMessageForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenGetTxnsMessageForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilGetTxnsMessageForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderGetTxnsMessage(t, tc.obj) + }) + } +} + +func decodeGetTxnsMessageExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj GetTxnsMessage + if _, err := decodeGetTxnsMessage(buf, &obj); err == nil { + t.Fatal("decodeGetTxnsMessage: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeGetTxnsMessage: expected error %q, got %q", expectedErr, err) + } +} + +func decodeGetTxnsMessageExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj GetTxnsMessage + if err := decodeGetTxnsMessageExact(buf, &obj); err == nil { + t.Fatal("decodeGetTxnsMessageExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeGetTxnsMessageExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderGetTxnsMessageDecodeErrors(t *testing.T, k int, tag string, obj *GetTxnsMessage) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeGetTxnsMessage(obj) + buf, err := encodeGetTxnsMessage(obj) + if err != nil { + t.Fatalf("encodeGetTxnsMessage failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeGetTxnsMessageExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeGetTxnsMessageExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeGetTxnsMessageExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeGetTxnsMessageExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeGetTxnsMessageExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderGetTxnsMessageDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptyGetTxnsMessageForEncodeTest() + fullObj := newRandomGetTxnsMessageForEncodeTest(t, rand) + testSkyencoderGetTxnsMessageDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderGetTxnsMessageDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/give_blocks_message_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/give_blocks_message_skyencoder.go new file mode 100644 index 00000000..eaa84a60 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/give_blocks_message_skyencoder.go @@ -0,0 +1,579 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package daemon + +import ( + "errors" + "math" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" + "github.com/SkycoinProject/skycoin/src/coin" +) + +// encodeSizeGiveBlocksMessage computes the size of an encoded object of type GiveBlocksMessage +func encodeSizeGiveBlocksMessage(obj *GiveBlocksMessage) uint64 { + i0 := uint64(0) + + // obj.Blocks + i0 += 4 + for _, x1 := range obj.Blocks { + i1 := uint64(0) + + // x1.Block.Head.Version + i1 += 4 + + // x1.Block.Head.Time + i1 += 8 + + // x1.Block.Head.BkSeq + i1 += 8 + + // x1.Block.Head.Fee + i1 += 8 + + // x1.Block.Head.PrevHash + i1 += 32 + + // x1.Block.Head.BodyHash + i1 += 32 + + // x1.Block.Head.UxHash + i1 += 32 + + // x1.Block.Body.Transactions + i1 += 4 + for _, x2 := range x1.Block.Body.Transactions { + i2 := uint64(0) + + // x2.Length + i2 += 4 + + // x2.Type + i2++ + + // x2.InnerHash + i2 += 32 + + // x2.Sigs + i2 += 4 + { + i3 := uint64(0) + + // x3 + i3 += 65 + + i2 += uint64(len(x2.Sigs)) * i3 + } + + // x2.In + i2 += 4 + { + i3 := uint64(0) + + // x3 + i3 += 32 + + i2 += uint64(len(x2.In)) * i3 + } + + // x2.Out + i2 += 4 + { + i3 := uint64(0) + + // x3.Address.Version + i3++ + + // x3.Address.Key + i3 += 20 + + // x3.Coins + i3 += 8 + + // x3.Hours + i3 += 8 + + i2 += uint64(len(x2.Out)) * i3 + } + + i1 += i2 + } + + // x1.Sig + i1 += 65 + + i0 += i1 + } + + return i0 +} + +// encodeGiveBlocksMessage encodes an object of type GiveBlocksMessage to a buffer allocated to the exact size +// required to encode the object. +func encodeGiveBlocksMessage(obj *GiveBlocksMessage) ([]byte, error) { + n := encodeSizeGiveBlocksMessage(obj) + buf := make([]byte, n) + + if err := encodeGiveBlocksMessageToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeGiveBlocksMessageToBuffer encodes an object of type GiveBlocksMessage to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeGiveBlocksMessageToBuffer(buf []byte, obj *GiveBlocksMessage) error { + if uint64(len(buf)) < encodeSizeGiveBlocksMessage(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Blocks maxlen check + if len(obj.Blocks) > 128 { + return encoder.ErrMaxLenExceeded + } + + // obj.Blocks length check + if uint64(len(obj.Blocks)) > math.MaxUint32 { + return errors.New("obj.Blocks length exceeds math.MaxUint32") + } + + // obj.Blocks length + e.Uint32(uint32(len(obj.Blocks))) + + // obj.Blocks + for _, x := range obj.Blocks { + + // x.Block.Head.Version + e.Uint32(x.Block.Head.Version) + + // x.Block.Head.Time + e.Uint64(x.Block.Head.Time) + + // x.Block.Head.BkSeq + e.Uint64(x.Block.Head.BkSeq) + + // x.Block.Head.Fee + e.Uint64(x.Block.Head.Fee) + + // x.Block.Head.PrevHash + e.CopyBytes(x.Block.Head.PrevHash[:]) + + // x.Block.Head.BodyHash + e.CopyBytes(x.Block.Head.BodyHash[:]) + + // x.Block.Head.UxHash + e.CopyBytes(x.Block.Head.UxHash[:]) + + // x.Block.Body.Transactions maxlen check + if len(x.Block.Body.Transactions) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // x.Block.Body.Transactions length check + if uint64(len(x.Block.Body.Transactions)) > math.MaxUint32 { + return errors.New("x.Block.Body.Transactions length exceeds math.MaxUint32") + } + + // x.Block.Body.Transactions length + e.Uint32(uint32(len(x.Block.Body.Transactions))) + + // x.Block.Body.Transactions + for _, x := range x.Block.Body.Transactions { + + // x.Length + e.Uint32(x.Length) + + // x.Type + e.Uint8(x.Type) + + // x.InnerHash + e.CopyBytes(x.InnerHash[:]) + + // x.Sigs maxlen check + if len(x.Sigs) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // x.Sigs length check + if uint64(len(x.Sigs)) > math.MaxUint32 { + return errors.New("x.Sigs length exceeds math.MaxUint32") + } + + // x.Sigs length + e.Uint32(uint32(len(x.Sigs))) + + // x.Sigs + for _, x := range x.Sigs { + + // x + e.CopyBytes(x[:]) + + } + + // x.In maxlen check + if len(x.In) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // x.In length check + if uint64(len(x.In)) > math.MaxUint32 { + return errors.New("x.In length exceeds math.MaxUint32") + } + + // x.In length + e.Uint32(uint32(len(x.In))) + + // x.In + for _, x := range x.In { + + // x + e.CopyBytes(x[:]) + + } + + // x.Out maxlen check + if len(x.Out) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // x.Out length check + if uint64(len(x.Out)) > math.MaxUint32 { + return errors.New("x.Out length exceeds math.MaxUint32") + } + + // x.Out length + e.Uint32(uint32(len(x.Out))) + + // x.Out + for _, x := range x.Out { + + // x.Address.Version + e.Uint8(x.Address.Version) + + // x.Address.Key + e.CopyBytes(x.Address.Key[:]) + + // x.Coins + e.Uint64(x.Coins) + + // x.Hours + e.Uint64(x.Hours) + + } + + } + + // x.Sig + e.CopyBytes(x.Sig[:]) + + } + + return nil +} + +// decodeGiveBlocksMessage decodes an object of type GiveBlocksMessage from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeGiveBlocksMessage(buf []byte, obj *GiveBlocksMessage) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Blocks + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 128 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Blocks = make([]coin.SignedBlock, length) + + for z1 := range obj.Blocks { + { + // obj.Blocks[z1].Block.Head.Version + i, err := d.Uint32() + if err != nil { + return 0, err + } + obj.Blocks[z1].Block.Head.Version = i + } + + { + // obj.Blocks[z1].Block.Head.Time + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Blocks[z1].Block.Head.Time = i + } + + { + // obj.Blocks[z1].Block.Head.BkSeq + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Blocks[z1].Block.Head.BkSeq = i + } + + { + // obj.Blocks[z1].Block.Head.Fee + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Blocks[z1].Block.Head.Fee = i + } + + { + // obj.Blocks[z1].Block.Head.PrevHash + if len(d.Buffer) < len(obj.Blocks[z1].Block.Head.PrevHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Blocks[z1].Block.Head.PrevHash[:], d.Buffer[:len(obj.Blocks[z1].Block.Head.PrevHash)]) + d.Buffer = d.Buffer[len(obj.Blocks[z1].Block.Head.PrevHash):] + } + + { + // obj.Blocks[z1].Block.Head.BodyHash + if len(d.Buffer) < len(obj.Blocks[z1].Block.Head.BodyHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Blocks[z1].Block.Head.BodyHash[:], d.Buffer[:len(obj.Blocks[z1].Block.Head.BodyHash)]) + d.Buffer = d.Buffer[len(obj.Blocks[z1].Block.Head.BodyHash):] + } + + { + // obj.Blocks[z1].Block.Head.UxHash + if len(d.Buffer) < len(obj.Blocks[z1].Block.Head.UxHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Blocks[z1].Block.Head.UxHash[:], d.Buffer[:len(obj.Blocks[z1].Block.Head.UxHash)]) + d.Buffer = d.Buffer[len(obj.Blocks[z1].Block.Head.UxHash):] + } + + { + // obj.Blocks[z1].Block.Body.Transactions + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Blocks[z1].Block.Body.Transactions = make([]coin.Transaction, length) + + for z5 := range obj.Blocks[z1].Block.Body.Transactions { + { + // obj.Blocks[z1].Block.Body.Transactions[z5].Length + i, err := d.Uint32() + if err != nil { + return 0, err + } + obj.Blocks[z1].Block.Body.Transactions[z5].Length = i + } + + { + // obj.Blocks[z1].Block.Body.Transactions[z5].Type + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Blocks[z1].Block.Body.Transactions[z5].Type = i + } + + { + // obj.Blocks[z1].Block.Body.Transactions[z5].InnerHash + if len(d.Buffer) < len(obj.Blocks[z1].Block.Body.Transactions[z5].InnerHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Blocks[z1].Block.Body.Transactions[z5].InnerHash[:], d.Buffer[:len(obj.Blocks[z1].Block.Body.Transactions[z5].InnerHash)]) + d.Buffer = d.Buffer[len(obj.Blocks[z1].Block.Body.Transactions[z5].InnerHash):] + } + + { + // obj.Blocks[z1].Block.Body.Transactions[z5].Sigs + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Blocks[z1].Block.Body.Transactions[z5].Sigs = make([]cipher.Sig, length) + + for z7 := range obj.Blocks[z1].Block.Body.Transactions[z5].Sigs { + { + // obj.Blocks[z1].Block.Body.Transactions[z5].Sigs[z7] + if len(d.Buffer) < len(obj.Blocks[z1].Block.Body.Transactions[z5].Sigs[z7]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Blocks[z1].Block.Body.Transactions[z5].Sigs[z7][:], d.Buffer[:len(obj.Blocks[z1].Block.Body.Transactions[z5].Sigs[z7])]) + d.Buffer = d.Buffer[len(obj.Blocks[z1].Block.Body.Transactions[z5].Sigs[z7]):] + } + + } + } + } + + { + // obj.Blocks[z1].Block.Body.Transactions[z5].In + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Blocks[z1].Block.Body.Transactions[z5].In = make([]cipher.SHA256, length) + + for z7 := range obj.Blocks[z1].Block.Body.Transactions[z5].In { + { + // obj.Blocks[z1].Block.Body.Transactions[z5].In[z7] + if len(d.Buffer) < len(obj.Blocks[z1].Block.Body.Transactions[z5].In[z7]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Blocks[z1].Block.Body.Transactions[z5].In[z7][:], d.Buffer[:len(obj.Blocks[z1].Block.Body.Transactions[z5].In[z7])]) + d.Buffer = d.Buffer[len(obj.Blocks[z1].Block.Body.Transactions[z5].In[z7]):] + } + + } + } + } + + { + // obj.Blocks[z1].Block.Body.Transactions[z5].Out + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Blocks[z1].Block.Body.Transactions[z5].Out = make([]coin.TransactionOutput, length) + + for z7 := range obj.Blocks[z1].Block.Body.Transactions[z5].Out { + { + // obj.Blocks[z1].Block.Body.Transactions[z5].Out[z7].Address.Version + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Blocks[z1].Block.Body.Transactions[z5].Out[z7].Address.Version = i + } + + { + // obj.Blocks[z1].Block.Body.Transactions[z5].Out[z7].Address.Key + if len(d.Buffer) < len(obj.Blocks[z1].Block.Body.Transactions[z5].Out[z7].Address.Key) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Blocks[z1].Block.Body.Transactions[z5].Out[z7].Address.Key[:], d.Buffer[:len(obj.Blocks[z1].Block.Body.Transactions[z5].Out[z7].Address.Key)]) + d.Buffer = d.Buffer[len(obj.Blocks[z1].Block.Body.Transactions[z5].Out[z7].Address.Key):] + } + + { + // obj.Blocks[z1].Block.Body.Transactions[z5].Out[z7].Coins + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Blocks[z1].Block.Body.Transactions[z5].Out[z7].Coins = i + } + + { + // obj.Blocks[z1].Block.Body.Transactions[z5].Out[z7].Hours + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Blocks[z1].Block.Body.Transactions[z5].Out[z7].Hours = i + } + + } + } + } + } + } + } + + { + // obj.Blocks[z1].Sig + if len(d.Buffer) < len(obj.Blocks[z1].Sig) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Blocks[z1].Sig[:], d.Buffer[:len(obj.Blocks[z1].Sig)]) + d.Buffer = d.Buffer[len(obj.Blocks[z1].Sig):] + } + + } + } + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeGiveBlocksMessageExact decodes an object of type GiveBlocksMessage from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeGiveBlocksMessageExact(buf []byte, obj *GiveBlocksMessage) error { + if n, err := decodeGiveBlocksMessage(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/give_blocks_message_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/give_blocks_message_skyencoder_test.go new file mode 100644 index 00000000..0190251c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/give_blocks_message_skyencoder_test.go @@ -0,0 +1,421 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package daemon + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +func newEmptyGiveBlocksMessageForEncodeTest() *GiveBlocksMessage { + var obj GiveBlocksMessage + return &obj +} + +func newRandomGiveBlocksMessageForEncodeTest(t *testing.T, rand *mathrand.Rand) *GiveBlocksMessage { + var obj GiveBlocksMessage + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenGiveBlocksMessageForEncodeTest(t *testing.T, rand *mathrand.Rand) *GiveBlocksMessage { + var obj GiveBlocksMessage + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilGiveBlocksMessageForEncodeTest(t *testing.T, rand *mathrand.Rand) *GiveBlocksMessage { + var obj GiveBlocksMessage + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderGiveBlocksMessage(t *testing.T, obj *GiveBlocksMessage) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeGiveBlocksMessage(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeGiveBlocksMessage() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeGiveBlocksMessage(obj) + if err != nil { + t.Fatalf("encodeGiveBlocksMessage failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeGiveBlocksMessage produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeGiveBlocksMessage()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeGiveBlocksMessageToBuffer(data3, obj); err != nil { + t.Fatalf("encodeGiveBlocksMessageToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 GiveBlocksMessage + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 GiveBlocksMessage + if n, err := decodeGiveBlocksMessage(data2, &obj3); err != nil { + t.Fatalf("decodeGiveBlocksMessage failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeGiveBlocksMessage bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeGiveBlocksMessage()") + } + + // Decode, excess buffer + var obj4 GiveBlocksMessage + n, err := decodeGiveBlocksMessage(data3, &obj4) + if err != nil { + t.Fatalf("decodeGiveBlocksMessage failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeGiveBlocksMessage bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeGiveBlocksMessage bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeGiveBlocksMessage()") + } + + // DecodeExact + var obj5 GiveBlocksMessage + if err := decodeGiveBlocksMessageExact(data2, &obj5); err != nil { + t.Fatalf("decodeGiveBlocksMessage failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeGiveBlocksMessage()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeGiveBlocksMessage(data4, &obj3); err != nil { + t.Fatalf("decodeGiveBlocksMessage failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeGiveBlocksMessage bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderGiveBlocksMessage(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *GiveBlocksMessage + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptyGiveBlocksMessageForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomGiveBlocksMessageForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenGiveBlocksMessageForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilGiveBlocksMessageForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderGiveBlocksMessage(t, tc.obj) + }) + } +} + +func decodeGiveBlocksMessageExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj GiveBlocksMessage + if _, err := decodeGiveBlocksMessage(buf, &obj); err == nil { + t.Fatal("decodeGiveBlocksMessage: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeGiveBlocksMessage: expected error %q, got %q", expectedErr, err) + } +} + +func decodeGiveBlocksMessageExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj GiveBlocksMessage + if err := decodeGiveBlocksMessageExact(buf, &obj); err == nil { + t.Fatal("decodeGiveBlocksMessageExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeGiveBlocksMessageExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderGiveBlocksMessageDecodeErrors(t *testing.T, k int, tag string, obj *GiveBlocksMessage) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeGiveBlocksMessage(obj) + buf, err := encodeGiveBlocksMessage(obj) + if err != nil { + t.Fatalf("encodeGiveBlocksMessage failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeGiveBlocksMessageExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeGiveBlocksMessageExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeGiveBlocksMessageExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeGiveBlocksMessageExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeGiveBlocksMessageExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderGiveBlocksMessageDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptyGiveBlocksMessageForEncodeTest() + fullObj := newRandomGiveBlocksMessageForEncodeTest(t, rand) + testSkyencoderGiveBlocksMessageDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderGiveBlocksMessageDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/give_peers_message_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/give_peers_message_skyencoder.go new file mode 100644 index 00000000..af71acb6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/give_peers_message_skyencoder.go @@ -0,0 +1,149 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package daemon + +import ( + "errors" + "math" + + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +// encodeSizeGivePeersMessage computes the size of an encoded object of type GivePeersMessage +func encodeSizeGivePeersMessage(obj *GivePeersMessage) uint64 { + i0 := uint64(0) + + // obj.Peers + i0 += 4 + { + i1 := uint64(0) + + // x1.IP + i1 += 4 + + // x1.Port + i1 += 2 + + i0 += uint64(len(obj.Peers)) * i1 + } + + return i0 +} + +// encodeGivePeersMessage encodes an object of type GivePeersMessage to a buffer allocated to the exact size +// required to encode the object. +func encodeGivePeersMessage(obj *GivePeersMessage) ([]byte, error) { + n := encodeSizeGivePeersMessage(obj) + buf := make([]byte, n) + + if err := encodeGivePeersMessageToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeGivePeersMessageToBuffer encodes an object of type GivePeersMessage to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeGivePeersMessageToBuffer(buf []byte, obj *GivePeersMessage) error { + if uint64(len(buf)) < encodeSizeGivePeersMessage(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Peers maxlen check + if len(obj.Peers) > 512 { + return encoder.ErrMaxLenExceeded + } + + // obj.Peers length check + if uint64(len(obj.Peers)) > math.MaxUint32 { + return errors.New("obj.Peers length exceeds math.MaxUint32") + } + + // obj.Peers length + e.Uint32(uint32(len(obj.Peers))) + + // obj.Peers + for _, x := range obj.Peers { + + // x.IP + e.Uint32(x.IP) + + // x.Port + e.Uint16(x.Port) + + } + + return nil +} + +// decodeGivePeersMessage decodes an object of type GivePeersMessage from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeGivePeersMessage(buf []byte, obj *GivePeersMessage) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Peers + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 512 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Peers = make([]IPAddr, length) + + for z1 := range obj.Peers { + { + // obj.Peers[z1].IP + i, err := d.Uint32() + if err != nil { + return 0, err + } + obj.Peers[z1].IP = i + } + + { + // obj.Peers[z1].Port + i, err := d.Uint16() + if err != nil { + return 0, err + } + obj.Peers[z1].Port = i + } + + } + } + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeGivePeersMessageExact decodes an object of type GivePeersMessage from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeGivePeersMessageExact(buf []byte, obj *GivePeersMessage) error { + if n, err := decodeGivePeersMessage(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/give_peers_message_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/give_peers_message_skyencoder_test.go new file mode 100644 index 00000000..b67e6e64 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/give_peers_message_skyencoder_test.go @@ -0,0 +1,421 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package daemon + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +func newEmptyGivePeersMessageForEncodeTest() *GivePeersMessage { + var obj GivePeersMessage + return &obj +} + +func newRandomGivePeersMessageForEncodeTest(t *testing.T, rand *mathrand.Rand) *GivePeersMessage { + var obj GivePeersMessage + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenGivePeersMessageForEncodeTest(t *testing.T, rand *mathrand.Rand) *GivePeersMessage { + var obj GivePeersMessage + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilGivePeersMessageForEncodeTest(t *testing.T, rand *mathrand.Rand) *GivePeersMessage { + var obj GivePeersMessage + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderGivePeersMessage(t *testing.T, obj *GivePeersMessage) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeGivePeersMessage(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeGivePeersMessage() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeGivePeersMessage(obj) + if err != nil { + t.Fatalf("encodeGivePeersMessage failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeGivePeersMessage produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeGivePeersMessage()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeGivePeersMessageToBuffer(data3, obj); err != nil { + t.Fatalf("encodeGivePeersMessageToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 GivePeersMessage + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 GivePeersMessage + if n, err := decodeGivePeersMessage(data2, &obj3); err != nil { + t.Fatalf("decodeGivePeersMessage failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeGivePeersMessage bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeGivePeersMessage()") + } + + // Decode, excess buffer + var obj4 GivePeersMessage + n, err := decodeGivePeersMessage(data3, &obj4) + if err != nil { + t.Fatalf("decodeGivePeersMessage failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeGivePeersMessage bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeGivePeersMessage bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeGivePeersMessage()") + } + + // DecodeExact + var obj5 GivePeersMessage + if err := decodeGivePeersMessageExact(data2, &obj5); err != nil { + t.Fatalf("decodeGivePeersMessage failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeGivePeersMessage()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeGivePeersMessage(data4, &obj3); err != nil { + t.Fatalf("decodeGivePeersMessage failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeGivePeersMessage bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderGivePeersMessage(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *GivePeersMessage + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptyGivePeersMessageForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomGivePeersMessageForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenGivePeersMessageForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilGivePeersMessageForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderGivePeersMessage(t, tc.obj) + }) + } +} + +func decodeGivePeersMessageExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj GivePeersMessage + if _, err := decodeGivePeersMessage(buf, &obj); err == nil { + t.Fatal("decodeGivePeersMessage: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeGivePeersMessage: expected error %q, got %q", expectedErr, err) + } +} + +func decodeGivePeersMessageExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj GivePeersMessage + if err := decodeGivePeersMessageExact(buf, &obj); err == nil { + t.Fatal("decodeGivePeersMessageExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeGivePeersMessageExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderGivePeersMessageDecodeErrors(t *testing.T, k int, tag string, obj *GivePeersMessage) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeGivePeersMessage(obj) + buf, err := encodeGivePeersMessage(obj) + if err != nil { + t.Fatalf("encodeGivePeersMessage failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeGivePeersMessageExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeGivePeersMessageExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeGivePeersMessageExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeGivePeersMessageExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeGivePeersMessageExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderGivePeersMessageDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptyGivePeersMessageForEncodeTest() + fullObj := newRandomGivePeersMessageForEncodeTest(t, rand) + testSkyencoderGivePeersMessageDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderGivePeersMessageDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/give_txns_message_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/give_txns_message_skyencoder.go new file mode 100644 index 00000000..3524fc12 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/give_txns_message_skyencoder.go @@ -0,0 +1,408 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package daemon + +import ( + "errors" + "math" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" + "github.com/SkycoinProject/skycoin/src/coin" +) + +// encodeSizeGiveTxnsMessage computes the size of an encoded object of type GiveTxnsMessage +func encodeSizeGiveTxnsMessage(obj *GiveTxnsMessage) uint64 { + i0 := uint64(0) + + // obj.Transactions + i0 += 4 + for _, x1 := range obj.Transactions { + i1 := uint64(0) + + // x1.Length + i1 += 4 + + // x1.Type + i1++ + + // x1.InnerHash + i1 += 32 + + // x1.Sigs + i1 += 4 + { + i2 := uint64(0) + + // x2 + i2 += 65 + + i1 += uint64(len(x1.Sigs)) * i2 + } + + // x1.In + i1 += 4 + { + i2 := uint64(0) + + // x2 + i2 += 32 + + i1 += uint64(len(x1.In)) * i2 + } + + // x1.Out + i1 += 4 + { + i2 := uint64(0) + + // x2.Address.Version + i2++ + + // x2.Address.Key + i2 += 20 + + // x2.Coins + i2 += 8 + + // x2.Hours + i2 += 8 + + i1 += uint64(len(x1.Out)) * i2 + } + + i0 += i1 + } + + return i0 +} + +// encodeGiveTxnsMessage encodes an object of type GiveTxnsMessage to a buffer allocated to the exact size +// required to encode the object. +func encodeGiveTxnsMessage(obj *GiveTxnsMessage) ([]byte, error) { + n := encodeSizeGiveTxnsMessage(obj) + buf := make([]byte, n) + + if err := encodeGiveTxnsMessageToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeGiveTxnsMessageToBuffer encodes an object of type GiveTxnsMessage to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeGiveTxnsMessageToBuffer(buf []byte, obj *GiveTxnsMessage) error { + if uint64(len(buf)) < encodeSizeGiveTxnsMessage(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Transactions maxlen check + if len(obj.Transactions) > 256 { + return encoder.ErrMaxLenExceeded + } + + // obj.Transactions length check + if uint64(len(obj.Transactions)) > math.MaxUint32 { + return errors.New("obj.Transactions length exceeds math.MaxUint32") + } + + // obj.Transactions length + e.Uint32(uint32(len(obj.Transactions))) + + // obj.Transactions + for _, x := range obj.Transactions { + + // x.Length + e.Uint32(x.Length) + + // x.Type + e.Uint8(x.Type) + + // x.InnerHash + e.CopyBytes(x.InnerHash[:]) + + // x.Sigs maxlen check + if len(x.Sigs) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // x.Sigs length check + if uint64(len(x.Sigs)) > math.MaxUint32 { + return errors.New("x.Sigs length exceeds math.MaxUint32") + } + + // x.Sigs length + e.Uint32(uint32(len(x.Sigs))) + + // x.Sigs + for _, x := range x.Sigs { + + // x + e.CopyBytes(x[:]) + + } + + // x.In maxlen check + if len(x.In) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // x.In length check + if uint64(len(x.In)) > math.MaxUint32 { + return errors.New("x.In length exceeds math.MaxUint32") + } + + // x.In length + e.Uint32(uint32(len(x.In))) + + // x.In + for _, x := range x.In { + + // x + e.CopyBytes(x[:]) + + } + + // x.Out maxlen check + if len(x.Out) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // x.Out length check + if uint64(len(x.Out)) > math.MaxUint32 { + return errors.New("x.Out length exceeds math.MaxUint32") + } + + // x.Out length + e.Uint32(uint32(len(x.Out))) + + // x.Out + for _, x := range x.Out { + + // x.Address.Version + e.Uint8(x.Address.Version) + + // x.Address.Key + e.CopyBytes(x.Address.Key[:]) + + // x.Coins + e.Uint64(x.Coins) + + // x.Hours + e.Uint64(x.Hours) + + } + + } + + return nil +} + +// decodeGiveTxnsMessage decodes an object of type GiveTxnsMessage from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeGiveTxnsMessage(buf []byte, obj *GiveTxnsMessage) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Transactions + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 256 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Transactions = make([]coin.Transaction, length) + + for z1 := range obj.Transactions { + { + // obj.Transactions[z1].Length + i, err := d.Uint32() + if err != nil { + return 0, err + } + obj.Transactions[z1].Length = i + } + + { + // obj.Transactions[z1].Type + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Transactions[z1].Type = i + } + + { + // obj.Transactions[z1].InnerHash + if len(d.Buffer) < len(obj.Transactions[z1].InnerHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Transactions[z1].InnerHash[:], d.Buffer[:len(obj.Transactions[z1].InnerHash)]) + d.Buffer = d.Buffer[len(obj.Transactions[z1].InnerHash):] + } + + { + // obj.Transactions[z1].Sigs + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Transactions[z1].Sigs = make([]cipher.Sig, length) + + for z3 := range obj.Transactions[z1].Sigs { + { + // obj.Transactions[z1].Sigs[z3] + if len(d.Buffer) < len(obj.Transactions[z1].Sigs[z3]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Transactions[z1].Sigs[z3][:], d.Buffer[:len(obj.Transactions[z1].Sigs[z3])]) + d.Buffer = d.Buffer[len(obj.Transactions[z1].Sigs[z3]):] + } + + } + } + } + + { + // obj.Transactions[z1].In + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Transactions[z1].In = make([]cipher.SHA256, length) + + for z3 := range obj.Transactions[z1].In { + { + // obj.Transactions[z1].In[z3] + if len(d.Buffer) < len(obj.Transactions[z1].In[z3]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Transactions[z1].In[z3][:], d.Buffer[:len(obj.Transactions[z1].In[z3])]) + d.Buffer = d.Buffer[len(obj.Transactions[z1].In[z3]):] + } + + } + } + } + + { + // obj.Transactions[z1].Out + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Transactions[z1].Out = make([]coin.TransactionOutput, length) + + for z3 := range obj.Transactions[z1].Out { + { + // obj.Transactions[z1].Out[z3].Address.Version + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Transactions[z1].Out[z3].Address.Version = i + } + + { + // obj.Transactions[z1].Out[z3].Address.Key + if len(d.Buffer) < len(obj.Transactions[z1].Out[z3].Address.Key) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Transactions[z1].Out[z3].Address.Key[:], d.Buffer[:len(obj.Transactions[z1].Out[z3].Address.Key)]) + d.Buffer = d.Buffer[len(obj.Transactions[z1].Out[z3].Address.Key):] + } + + { + // obj.Transactions[z1].Out[z3].Coins + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Transactions[z1].Out[z3].Coins = i + } + + { + // obj.Transactions[z1].Out[z3].Hours + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Transactions[z1].Out[z3].Hours = i + } + + } + } + } + } + } + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeGiveTxnsMessageExact decodes an object of type GiveTxnsMessage from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeGiveTxnsMessageExact(buf []byte, obj *GiveTxnsMessage) error { + if n, err := decodeGiveTxnsMessage(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/give_txns_message_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/give_txns_message_skyencoder_test.go new file mode 100644 index 00000000..42de5b15 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/give_txns_message_skyencoder_test.go @@ -0,0 +1,421 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package daemon + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +func newEmptyGiveTxnsMessageForEncodeTest() *GiveTxnsMessage { + var obj GiveTxnsMessage + return &obj +} + +func newRandomGiveTxnsMessageForEncodeTest(t *testing.T, rand *mathrand.Rand) *GiveTxnsMessage { + var obj GiveTxnsMessage + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenGiveTxnsMessageForEncodeTest(t *testing.T, rand *mathrand.Rand) *GiveTxnsMessage { + var obj GiveTxnsMessage + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilGiveTxnsMessageForEncodeTest(t *testing.T, rand *mathrand.Rand) *GiveTxnsMessage { + var obj GiveTxnsMessage + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderGiveTxnsMessage(t *testing.T, obj *GiveTxnsMessage) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeGiveTxnsMessage(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeGiveTxnsMessage() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeGiveTxnsMessage(obj) + if err != nil { + t.Fatalf("encodeGiveTxnsMessage failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeGiveTxnsMessage produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeGiveTxnsMessage()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeGiveTxnsMessageToBuffer(data3, obj); err != nil { + t.Fatalf("encodeGiveTxnsMessageToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 GiveTxnsMessage + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 GiveTxnsMessage + if n, err := decodeGiveTxnsMessage(data2, &obj3); err != nil { + t.Fatalf("decodeGiveTxnsMessage failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeGiveTxnsMessage bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeGiveTxnsMessage()") + } + + // Decode, excess buffer + var obj4 GiveTxnsMessage + n, err := decodeGiveTxnsMessage(data3, &obj4) + if err != nil { + t.Fatalf("decodeGiveTxnsMessage failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeGiveTxnsMessage bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeGiveTxnsMessage bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeGiveTxnsMessage()") + } + + // DecodeExact + var obj5 GiveTxnsMessage + if err := decodeGiveTxnsMessageExact(data2, &obj5); err != nil { + t.Fatalf("decodeGiveTxnsMessage failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeGiveTxnsMessage()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeGiveTxnsMessage(data4, &obj3); err != nil { + t.Fatalf("decodeGiveTxnsMessage failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeGiveTxnsMessage bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderGiveTxnsMessage(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *GiveTxnsMessage + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptyGiveTxnsMessageForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomGiveTxnsMessageForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenGiveTxnsMessageForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilGiveTxnsMessageForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderGiveTxnsMessage(t, tc.obj) + }) + } +} + +func decodeGiveTxnsMessageExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj GiveTxnsMessage + if _, err := decodeGiveTxnsMessage(buf, &obj); err == nil { + t.Fatal("decodeGiveTxnsMessage: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeGiveTxnsMessage: expected error %q, got %q", expectedErr, err) + } +} + +func decodeGiveTxnsMessageExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj GiveTxnsMessage + if err := decodeGiveTxnsMessageExact(buf, &obj); err == nil { + t.Fatal("decodeGiveTxnsMessageExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeGiveTxnsMessageExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderGiveTxnsMessageDecodeErrors(t *testing.T, k int, tag string, obj *GiveTxnsMessage) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeGiveTxnsMessage(obj) + buf, err := encodeGiveTxnsMessage(obj) + if err != nil { + t.Fatalf("encodeGiveTxnsMessage failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeGiveTxnsMessageExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeGiveTxnsMessageExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeGiveTxnsMessageExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeGiveTxnsMessageExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeGiveTxnsMessageExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderGiveTxnsMessageDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptyGiveTxnsMessageForEncodeTest() + fullObj := newRandomGiveTxnsMessageForEncodeTest(t, rand) + testSkyencoderGiveTxnsMessageDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderGiveTxnsMessageDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/gnet/README.md b/vendor/github.com/SkycoinProject/skycoin/src/daemon/gnet/README.md new file mode 100644 index 00000000..df437742 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/gnet/README.md @@ -0,0 +1,7 @@ +gnet +==== + +[![GoDoc](http://godoc.org/github.com//skycoin/gnet?status.png)](http://godoc.org/github.com/skycoin/gnet) + +[Godoc generated documentation](https://godoc.org/github.com/skycoin/gnet) + diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/gnet/dispatcher.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/gnet/dispatcher.go new file mode 100644 index 00000000..f8787026 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/gnet/dispatcher.go @@ -0,0 +1,209 @@ +package gnet + +import ( + "errors" + "fmt" + "math" + "net" + "reflect" + "time" + + "github.com/sirupsen/logrus" + + "github.com/SkycoinProject/skycoin/src/cipher/encoder" + "github.com/SkycoinProject/skycoin/src/util/mathutil" +) + +var ( + // ErrMsgExceedsMaxLen is returned if trying to send a message that exceeds the configured max length + ErrMsgExceedsMaxLen = errors.New("Message exceeds max message length") +) + +// SendResult result of a single message send +type SendResult struct { + Addr string + Message Message + Error error +} + +func newSendResult(addr string, m Message, err error) SendResult { + return SendResult{ + Addr: addr, + Message: m, + Error: err, + } +} + +// Serializes a Message over a net.Conn +func sendMessage(conn net.Conn, msg Message, timeout time.Duration, maxMsgLength int) error { + m, err := EncodeMessage(msg) + if err != nil { + return err + } + if len(m) > maxMsgLength { + return ErrMsgExceedsMaxLen + } + return sendByteMessage(conn, m, timeout) +} + +// msgIDStringSafe formats msgID bytes to a string that is safe for logging (e.g. not impacted by ascii control chars) +func msgIDStringSafe(msgID [4]byte) string { + x := fmt.Sprintf("%q", msgID) + return x[1 : len(x)-1] // trim quotes that are added by %q formatting +} + +// Event handler that is called after a Connection sends a complete message +func convertToMessage(id uint64, msg []byte, debugPrint bool) (Message, error) { + msgID := [4]byte{} + if len(msg) < len(msgID) { + logger.WithError(ErrDisconnectTruncatedMessageID).WithField("connID", id).Warning() + return nil, ErrDisconnectTruncatedMessageID + } + + copy(msgID[:], msg[:len(msgID)]) + + if debugPrint { + logger.WithField("msgID", msgIDStringSafe(msgID)).Debug("Received message") + } + + msg = msg[len(msgID):] + t, ok := MessageIDReverseMap[msgID] + if !ok { + logger.WithError(ErrDisconnectUnknownMessage).WithFields(logrus.Fields{ + "msgID": msgIDStringSafe(msgID), + "connID": id, + }).Warning() + return nil, ErrDisconnectUnknownMessage + } + + if debugPrint { + logger.WithFields(logrus.Fields{ + "connID": id, + "messageType": fmt.Sprintf("%v", t), + }).Debugf("convertToMessage") + } + + v := reflect.New(t) + m, ok := (v.Interface()).(Message) + if !ok { + // This occurs only when the user registers an interface that does not + // match the Message interface. They should have known about this + // earlier via a call to VerifyMessages + logger.Panic("Message obtained from map does not match Message interface") + return nil, errors.New("MessageIdMaps contain non-Message") + } + + used, err := deserializeMessage(msg, v) + if err != nil { + logger.Critical().WithError(err).WithFields(logrus.Fields{ + "connID": id, + "messageType": fmt.Sprintf("%v", t), + }).Warning("deserializeMessage failed") + return nil, ErrDisconnectMalformedMessage + } + + if used != uint64(len(msg)) { + logger.WithError(ErrDisconnectMessageDecodeUnderflow).WithFields(logrus.Fields{ + "connID": id, + "messageType": fmt.Sprintf("%v", t), + }).Warning() + return nil, ErrDisconnectMessageDecodeUnderflow + } + + return m, nil +} + +// Wraps Serializer.Decode and traps panics as an error +func deserializeMessage(msg []byte, v reflect.Value) (n uint64, err error) { + defer func() { + if r := recover(); r != nil { + logger.Critical().Warningf("Recovering from deserializer panic: %v", r) + switch x := r.(type) { + case string: + err = errors.New(x) + case error: + err = x + default: + err = errors.New("Message deserialization failed") + } + } + }() + + iface := v.Interface() + x, ok := iface.(Serializer) + if !ok { + return 0, errors.New("deserializeMessage object does not have Serializer interface") + } + + return x.Decode(msg) +} + +// EncodeMessage packs a Message into []byte containing length, id and data +func EncodeMessage(msg Serializer) ([]byte, error) { + t := reflect.ValueOf(msg).Elem().Type() + + // Lookup message ID + msgID, succ := MessageIDMap[t] + if !succ { + logger.Panicf("Attempted to serialize message struct not in MessageIDMap: %v", msg) + } + if uint64(len(msgID)) > math.MaxUint32 { + return nil, errors.New("Message ID length exceeds math.MaxUint32") + } + + // Compute size of encoded Message object + bMsgLen := msg.EncodeSize() + if bMsgLen > math.MaxUint32 { + return nil, errors.New("Message length exceeds math.MaxUint32") + } + + // Compute message + message ID length + bLen, err := mathutil.AddUint32(uint32(bMsgLen), uint32(len(msgID))) + if err != nil { + return nil, err + } + + // Serialize total message length + bLenPrefix := encoder.SerializeUint32(bLen) + if uint64(len(bLenPrefix)) > math.MaxUint32 { + return nil, errors.New("Message length prefix length exceeds math.MaxUint32") + } + + mLen, err := mathutil.AddUint32(bLen, uint32(len(bLenPrefix))) + if err != nil { + return nil, err + } + + // Allocate message bytes + m := make([]byte, mLen) + + // Write the total message length to the buffer + copy(m[:], bLenPrefix[:]) + + // Write the message ID to the buffer + copy(m[len(bLenPrefix):], msgID[:]) + + // Encode the message into the message buffer + if err := msg.Encode(m[len(bLenPrefix)+len(msgID):]); err != nil { + return nil, err + } + + return m, nil +} + +// Sends []byte over a net.Conn +var sendByteMessage = func(conn net.Conn, msg []byte, timeout time.Duration) error { + deadline := time.Time{} + if timeout != 0 { + deadline = time.Now().Add(timeout) + } + if err := conn.SetWriteDeadline(deadline); err != nil { + return err + } + if _, err := conn.Write(msg); err != nil { + return &WriteError{ + Err: err, + } + } + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/gnet/dispatcher_test.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/gnet/dispatcher_test.go new file mode 100644 index 00000000..4b56e938 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/gnet/dispatcher_test.go @@ -0,0 +1,246 @@ +package gnet + +import ( + "bytes" + "errors" + "net" + "reflect" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/testutil" +) + +var ( + _sendByteMessage = sendByteMessage +) + +func resetHandler() { + sendByteMessage = _sendByteMessage +} + +func TestMsgIDStringSafe(t *testing.T) { + var id [4]byte + require.Equal(t, "\\x00\\x00\\x00\\x00", msgIDStringSafe(id)) + + id = [4]byte{'F', 'O', 'O', 'B'} + + require.Equal(t, "FOOB", msgIDStringSafe(id)) + + id = [4]byte{200, 2, '\n', '\t'} + + require.Equal(t, "\\xc8\\x02\\n\\t", msgIDStringSafe(id)) + + id = [4]byte{'\'', '\\', ' ', '"'} + + require.Equal(t, "'\\\\ \\\"", msgIDStringSafe(id)) +} + +func assertIsMessage(t *testing.T, x interface{}) { + _, ok := x.(Message) + require.True(t, ok) +} + +func TestConvertToMessage(t *testing.T) { + assertIsMessage(t, &ByteMessage{}) + EraseMessages() + resetHandler() + RegisterMessage(BytePrefix, ByteMessage{}) + VerifyMessages() + c := &Connection{} + b := make([]byte, 0) + b = append(b, BytePrefix[:]...) + b = append(b, byte(7)) + m, err := convertToMessage(c.ID, b, testing.Verbose()) + require.NoError(t, err) + require.NotNil(t, m) + if m == nil { + t.Fatalf("ConvertToMessage failed") + } + bm := m.(*ByteMessage) + require.Equal(t, bm.X, byte(7)) +} + +func TestConvertToMessageNoMessageID(t *testing.T) { + EraseMessages() + resetHandler() + c := &Connection{} + b := []byte{} + m, err := convertToMessage(c.ID, b, testing.Verbose()) + require.Nil(t, m) + require.Error(t, err) + require.Equal(t, ErrDisconnectTruncatedMessageID, err) +} + +func TestConvertToMessageUnknownMessage(t *testing.T) { + EraseMessages() + resetHandler() + c := &Connection{} + b := MessagePrefix{'C', 'C', 'C', 'C'} + m, err := convertToMessage(c.ID, b[:], testing.Verbose()) + require.Error(t, err) + require.Equal(t, ErrDisconnectUnknownMessage, err) + require.Nil(t, m) +} + +func TestConvertToMessageBadDeserialize(t *testing.T) { + EraseMessages() + resetHandler() + RegisterMessage(DummyPrefix, DummyMessage{}) + RegisterMessage(BytePrefix, ByteMessage{}) + VerifyMessages() + c := &Connection{} + // Test with too many bytes + b := append(DummyPrefix[:], []byte{0, 1, 1, 1}...) + m, err := convertToMessage(c.ID, b, testing.Verbose()) + require.Error(t, err) + require.Nil(t, m) + + // Test with not enough bytes + b = append([]byte{}, BytePrefix[:]...) + m, err = convertToMessage(c.ID, b, testing.Verbose()) + require.Error(t, err) + require.Equal(t, ErrDisconnectMalformedMessage, err) + require.Nil(t, m) +} + +func TestConvertToMessageNotMessage(t *testing.T) { + EraseMessages() + resetHandler() + RegisterMessage(NothingPrefix, Nothing{}) + // don't verify messages + c := &Connection{} + require.Panics(t, func() { + _, _ = convertToMessage(c.ID, NothingPrefix[:], testing.Verbose()) //nolint:errcheck + }) +} + +func TestDeserializeMessageTrapsPanic(t *testing.T) { + resetHandler() + EraseMessages() + p := 7 + m := &PointerMessage{Ptr: &p} + b := []byte{4, 4, 4, 4, 4, 4, 4, 4} + _, err := deserializeMessage(b, reflect.ValueOf(m)) + require.Error(t, err) + require.Equal(t, "Decode error: kind ptr not handled", err.Error()) +} + +func TestEncodeMessage(t *testing.T) { + resetHandler() + EraseMessages() + RegisterMessage(BytePrefix, ByteMessage{}) + VerifyMessages() + m := NewByteMessage(7) + b, err := EncodeMessage(m) + require.NoError(t, err) + require.True(t, bytes.Equal(b, []byte{5, 0, 0, 0, 'B', 'Y', 'T', 'E', 7})) +} + +func TestEncodeMessageUnknownMessage(t *testing.T) { + resetHandler() + EraseMessages() + require.Panics(t, func() { + _, _ = EncodeMessage(&DummyMessage{}) //nolint:errcheck + }) +} + +func TestSendByteMessage(t *testing.T) { + resetHandler() + b := []byte{1} + c := NewCaptureConn() + err := sendByteMessage(c, b, 0) + require.NoError(t, err) + require.True(t, bytes.Equal(c.(*CaptureConn).Wrote, b)) + require.True(t, c.(*CaptureConn).WriteDeadlineSet) +} + +func TestSendByteMessageWithTimeout(t *testing.T) { + resetHandler() + b := []byte{1} + c := NewCaptureConn() + err := sendByteMessage(c, b, time.Minute) + require.NoError(t, err) + require.True(t, bytes.Equal(c.(*CaptureConn).Wrote, b)) + require.True(t, c.(*CaptureConn).WriteDeadlineSet) +} + +func TestSendByteMessageWriteFailed(t *testing.T) { + resetHandler() + c := &FailingWriteConn{} + err := sendByteMessage(c, nil, 0) + require.Error(t, err) +} + +func TestSendByteMessageWriteDeadlineFailed(t *testing.T) { + resetHandler() + c := &FailingWriteDeadlineConn{} + err := sendByteMessage(c, nil, 0) + require.Error(t, err) +} + +func TestSendMessage(t *testing.T) { + resetHandler() + EraseMessages() + RegisterMessage(BytePrefix, ByteMessage{}) + VerifyMessages() + m := NewByteMessage(7) + sendByteMessage = func(conn net.Conn, msg []byte, tm time.Duration) error { + expect := []byte{5, 0, 0, 0, 'B', 'Y', 'T', 'E', 7} + require.True(t, bytes.Equal(msg, expect)) + return nil + } + err := sendMessage(nil, m, 0, 1024) + require.NoError(t, err) + + err = sendMessage(nil, m, 0, 1) + testutil.RequireError(t, err, "Message exceeds max message length") +} + +/* Helpers */ + +func failingSendByteMessage(conn net.Conn, m []byte, tm time.Duration) error { + return errors.New("send byte message failed") +} + +type CaptureConn struct { + Wrote []byte + WriteDeadlineSet bool + net.Conn +} + +func NewCaptureConn() net.Conn { + return &CaptureConn{Wrote: nil, WriteDeadlineSet: false} +} + +func (cc *CaptureConn) Write(b []byte) (int, error) { + cc.Wrote = b + return len(b), nil +} + +func (cc *CaptureConn) SetWriteDeadline(t time.Time) error { + cc.WriteDeadlineSet = true + return nil +} + +type FailingWriteDeadlineConn struct { + net.Conn +} + +func (c *FailingWriteDeadlineConn) SetWriteDeadline(t time.Time) error { + return errors.New("failed") +} + +type FailingWriteConn struct { + net.Conn +} + +func (c *FailingWriteConn) Write(b []byte) (int, error) { + return 0, errors.New("failed") +} + +func (c *FailingWriteConn) SetWriteDeadline(t time.Time) error { + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/gnet/message.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/gnet/message.go new file mode 100644 index 00000000..a67aa39d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/gnet/message.go @@ -0,0 +1,140 @@ +package gnet + +import ( + "reflect" +) + +const messagePrefixLength = 4 + +// MessagePrefix message prefix identifies a message +type MessagePrefix [messagePrefixLength]byte + +// MessagePrefixFromString creates MessagePrefix from string +func MessagePrefixFromString(prefix string) MessagePrefix { + if len(prefix) == 0 || len(prefix) > 4 { + logger.Panicf("Invalid prefix %s", prefix) + } + p := MessagePrefix{} + for i, c := range prefix { + p[i] = byte(c) + } + for i := len(prefix); i < 4; i++ { + p[i] = 0x00 + } + return p +} + +// Serializer serialization interface +type Serializer interface { + EncodeSize() uint64 + Encode([]byte) error + Decode([]byte) (uint64, error) +} + +// Handler message handler interface +type Handler interface { + // State is user-defined application state that is attached to the Dispatcher. + // If a non-nil error is returned, the connection will be disconnected. + Handle(context *MessageContext, state interface{}) error +} + +// Message message interface +type Message interface { + Handler + Serializer +} + +// MessageContext message context +type MessageContext struct { + ConnID uint64 // connection message was received from + Addr string +} + +// NewMessageContext creates MessageContext +func NewMessageContext(conn *Connection) *MessageContext { + if conn.Conn != nil { + return &MessageContext{ConnID: conn.ID, Addr: conn.Addr()} + } + return &MessageContext{ConnID: conn.ID} +} + +// MessageIDMap maps message types to their ids +var MessageIDMap = make(map[reflect.Type]MessagePrefix) + +// MessageIDReverseMap maps message ids to their types +var MessageIDReverseMap = make(map[MessagePrefix]reflect.Type) + +var registeredMsgsCount = 0 + +// RegisterMessage registers a message struct for recognition by the message handlers. +func RegisterMessage(prefix MessagePrefix, msg interface{}) { + t := reflect.TypeOf(msg) + id := MessagePrefix{} + copy(id[:], prefix[:]) + _, exists := MessageIDReverseMap[id] + if exists { + logger.Panicf("Attempted to register message prefix %s twice", string(id[:])) + } + _, exists = MessageIDMap[t] + if exists { + logger.Panicf("Attempts to register message type %v twice", t) + } + MessageIDMap[t] = id + MessageIDReverseMap[id] = t + + registeredMsgsCount++ +} + +// VerifyMessages calls logger.Panic if message registration violates sanity checks +func VerifyMessages() { + if registeredMsgsCount != len(MessageIDMap) { + logger.Panic("MessageIDMap was altered without using RegisterMessage") + } + if registeredMsgsCount != len(MessageIDReverseMap) { + logger.Panic("MessageIDReverseMap was altered without using RegisterMessage") + } + + for t, k := range MessageIDMap { + // No empty prefixes allowed + if k[0] == 0x00 { + logger.Panic("No empty message prefixes allowed") + } + // No non-null bytes allowed after a nul byte + hasEmpty := false + for _, b := range k { + if b == 0x00 { + hasEmpty = true + } else if hasEmpty { + logger.Panic("No non-null bytes allowed after a nul byte") + } + } + // All characters must be non-whitespace printable ascii chars/digits + // No punctation + for _, b := range k { + if !((b >= '0' && b <= '9') || (b >= 'A' && b <= 'Z') || + (b >= 'a' && b <= 'z') || b == 0x00) { + logger.Panicf("Invalid prefix byte %v", b) + } + } + + // Confirm that all registered messages support the Message interface + // This should only be untrue if the user modified the message map + // directly + mptr := reflect.PtrTo(t) + if !mptr.Implements(reflect.TypeOf((*Message)(nil)).Elem()) { + logger.Panicf("Invalid message at ID %s: Message must implement the gnet.Message interface", string(k[:])) + } + } + if len(MessageIDMap) != len(MessageIDReverseMap) { + logger.Panic("MessageIdMap mismatch") + } + // No empty prefixes + // All prefixes must be 0 padded +} + +// EraseMessages wipes all recorded message types +func EraseMessages() { + MessageIDMap = make(map[reflect.Type]MessagePrefix) + MessageIDReverseMap = make(map[MessagePrefix]reflect.Type) + registeredMsgsCount = 0 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/gnet/message_test.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/gnet/message_test.go new file mode 100644 index 00000000..19b78d92 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/gnet/message_test.go @@ -0,0 +1,253 @@ +package gnet + +import ( + "errors" + "reflect" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +func TestNewMessageContext(t *testing.T) { + c := &Connection{} + mc := NewMessageContext(c) + require.Equal(t, mc.ConnID, c.ID) +} + +func TestRegisterMessage(t *testing.T) { + EraseMessages() + RegisterMessage(DummyPrefix, DummyMessage{}) + require.Equal(t, len(MessageIDMap), 1) + require.Equal(t, len(MessageIDReverseMap), 1) + require.NotNil(t, MessageIDReverseMap[DummyPrefix]) + + RegisterMessage(ErrorPrefix, ErrorMessage{}) + require.Equal(t, len(MessageIDMap), 2) + require.Equal(t, len(MessageIDReverseMap), 2) + require.NotNil(t, MessageIDReverseMap[ErrorPrefix]) +} + +func TestEraseMessages(t *testing.T) { + EraseMessages() + RegisterMessage(DummyPrefix, DummyMessage{}) + require.Equal(t, len(MessageIDMap), 1) + require.Equal(t, len(MessageIDReverseMap), 1) + EraseMessages() + require.Equal(t, len(MessageIDMap), 0) + require.Equal(t, len(MessageIDReverseMap), 0) +} + +func TestVerifyMessages(t *testing.T) { + // VerifyMessages either no-ops or panics. Make sure it doesnt panic + EraseMessages() + RegisterMessage(DummyPrefix, DummyMessage{}) + RegisterMessage(ErrorPrefix, ErrorMessage{}) + require.NotPanics(t, VerifyMessages) +} + +func TestVerifyMessagesDuplicateRegistered(t *testing.T) { + EraseMessages() + RegisterMessage(DummyPrefix, DummyMessage{}) + require.Panics(t, func() { RegisterMessage(DummyPrefix, DummyMessage{}) }) + require.Panics(t, func() { RegisterMessage(BytePrefix, DummyMessage{}) }) +} + +func TestVerifyMessagesNotAMessage(t *testing.T) { + EraseMessages() + RegisterMessage(NothingPrefix, Nothing{}) + require.Panics(t, VerifyMessages) +} + +func TestVerifyMessagesBadPrefix(t *testing.T) { + EraseMessages() + // Can't be all null + RegisterMessage(MessagePrefix{0x00, 0x00, 0x00, 0x00}, DummyMessage{}) + require.Panics(t, VerifyMessages) + EraseMessages() + // Can't start with nul + RegisterMessage(MessagePrefix{0x00, 'A', 'A', 'A'}, DummyMessage{}) + require.Panics(t, VerifyMessages) + EraseMessages() + // Can't have non nul after nul + RegisterMessage(MessagePrefix{'A', 0x00, 'A', 'A'}, DummyMessage{}) + require.Panics(t, VerifyMessages) + EraseMessages() + // Can't have invalid ascii bytes + RegisterMessage(MessagePrefix{'A', 'A', 'A', '\n'}, DummyMessage{}) + require.Panics(t, VerifyMessages) + EraseMessages() + RegisterMessage(MessagePrefix{'A', 'A', 'A', '@'}, DummyMessage{}) + require.Panics(t, VerifyMessages) + EraseMessages() + RegisterMessage(MessagePrefix{'A', 'A', 'A', ' '}, DummyMessage{}) + require.Panics(t, VerifyMessages) + EraseMessages() + RegisterMessage(MessagePrefix{'A', 'A', 'A', '{'}, DummyMessage{}) + require.Panics(t, VerifyMessages) + EraseMessages() + RegisterMessage(MessagePrefix{'A', 'A', 'A', '`'}, DummyMessage{}) + require.Panics(t, VerifyMessages) + EraseMessages() + RegisterMessage(MessagePrefix{'A', 'A', 'A', '['}, DummyMessage{}) + require.Panics(t, VerifyMessages) + EraseMessages() + RegisterMessage(MessagePrefix{'A', 'A', 'A', '/'}, DummyMessage{}) + require.Panics(t, VerifyMessages) + EraseMessages() + RegisterMessage(MessagePrefix{'A', 'A', 'A', ':'}, DummyMessage{}) + require.Panics(t, VerifyMessages) + EraseMessages() + // Some valid messages + RegisterMessage(MessagePrefix{'1', '9', 'A', 'z'}, DummyMessage{}) + require.NotPanics(t, VerifyMessages) + EraseMessages() +} + +func TestVerifyMessagesCorruptMap(t *testing.T) { + // MessageIdMap circumvented + EraseMessages() + mtype := reflect.TypeOf(DummyMessage{}) + MessageIDMap[mtype] = DummyPrefix + require.Panics(t, VerifyMessages) + delete(MessageIDMap, mtype) + // MessageIdReverseMap circumvented + EraseMessages() + MessageIDReverseMap[DummyPrefix] = mtype + require.Panics(t, VerifyMessages) + delete(MessageIDReverseMap, DummyPrefix) +} + +func TestMessagePrefixFromString(t *testing.T) { + EraseMessages() + require.Panics(t, func() { MessagePrefixFromString("") }) + require.Panics(t, func() { MessagePrefixFromString("xxxxx") }) + require.Equal(t, MessagePrefixFromString("abcd"), MessagePrefix{'a', 'b', 'c', 'd'}) + require.Equal(t, MessagePrefixFromString("abc"), MessagePrefix{'a', 'b', 'c', 0x00}) + require.Equal(t, MessagePrefixFromString("ab"), MessagePrefix{'a', 'b', 0x00, 0x00}) + require.Equal(t, MessagePrefixFromString("a"), MessagePrefix{'a', 0x00, 0x00, 0x00}) +} + +/* Helpers */ + +type Nothing struct{} + +var NothingPrefix = MessagePrefix{'N', 'O', 'T', 'H'} + +type DummyMessage struct{} + +var DummyPrefix = MessagePrefix{'D', 'U', 'M', 'Y'} + +// EncodeSize implements gnet.Serializer +func (dm *DummyMessage) EncodeSize() uint64 { + return uint64(encoder.Size(dm)) +} + +// Encode implements gnet.Serializer +func (dm *DummyMessage) Encode(buf []byte) error { + buf2 := encoder.Serialize(dm) + if len(buf) < len(buf2) { + return errors.New("Not enough buffer data to encode") + } + copy(buf[:], buf2[:]) + return nil +} + +// Decode implements gnet.Serializer +func (dm *DummyMessage) Decode(buf []byte) (uint64, error) { + return encoder.DeserializeRaw(buf, dm) +} + +func (dm *DummyMessage) Handle(context *MessageContext, x interface{}) error { + return nil +} + +type ErrorMessage struct{} + +var ( + ErrorPrefix = MessagePrefix{'E', 'R', 'R', 0x00} + ErrErrorMessageHandler = errors.New("Bad") +) + +// EncodeSize implements gnet.Serializer +func (em *ErrorMessage) EncodeSize() uint64 { + return uint64(encoder.Size(em)) +} + +// Encode implements gnet.Serializer +func (em *ErrorMessage) Encode(buf []byte) error { + buf2 := encoder.Serialize(em) + if len(buf) < len(buf2) { + return errors.New("Not enough buffer data to encode") + } + copy(buf[:], buf2[:]) + return nil +} + +// Decode implements gnet.Serializer +func (em *ErrorMessage) Decode(buf []byte) (uint64, error) { + return encoder.DeserializeRaw(buf, em) +} + +func (em *ErrorMessage) Handle(context *MessageContext, x interface{}) error { + return ErrErrorMessageHandler +} + +type ByteMessage struct { + X byte +} + +var BytePrefix = MessagePrefix{'B', 'Y', 'T', 'E'} + +// EncodeSize implements gnet.Serializer +func (bm *ByteMessage) EncodeSize() uint64 { + return uint64(encoder.Size(bm)) +} + +// Encode implements gnet.Serializer +func (bm *ByteMessage) Encode(buf []byte) error { + buf2 := encoder.Serialize(bm) + if len(buf) < len(buf2) { + return errors.New("Not enough buffer data to encode") + } + copy(buf[:], buf2[:]) + return nil +} + +// Decode implements gnet.Serializer +func (bm *ByteMessage) Decode(buf []byte) (uint64, error) { + return encoder.DeserializeRaw(buf, bm) +} + +func (bm *ByteMessage) Handle(c *MessageContext, x interface{}) error { + return nil +} + +func NewByteMessage(x byte) Message { + return &ByteMessage{X: x} +} + +type PointerMessage struct { + Ptr *int +} + +// EncodeSize implements gnet.Serializer +func (m *PointerMessage) EncodeSize() uint64 { + return uint64(encoder.Size(m)) +} + +// Encode implements gnet.Serializer +func (m *PointerMessage) Encode(buf []byte) error { + buf2 := encoder.Serialize(m) + if len(buf) < len(buf2) { + return errors.New("Not enough buffer data to encode") + } + copy(buf[:], buf2[:]) + return nil +} + +// Decode implements gnet.Serializer +func (m *PointerMessage) Decode(buf []byte) (uint64, error) { + return encoder.DeserializeRaw(buf, m) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/gnet/pool.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/gnet/pool.go new file mode 100644 index 00000000..7142c39a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/gnet/pool.go @@ -0,0 +1,1066 @@ +/* +Package gnet is the core networking library +*/ +package gnet + +import ( + "bufio" + "bytes" + "errors" + "fmt" + "net" + "reflect" + "sync" + "time" + + "io" + + "github.com/sirupsen/logrus" + + "github.com/SkycoinProject/skycoin/src/cipher/encoder" + "github.com/SkycoinProject/skycoin/src/daemon/strand" + "github.com/SkycoinProject/skycoin/src/util/elapse" + "github.com/SkycoinProject/skycoin/src/util/logging" +) + +// DisconnectReason is passed to ConnectionPool's DisconnectCallback +type DisconnectReason error + +const ( + receiveMessageDurationThreshold = 500 * time.Millisecond + readLoopDurationThreshold = 10 * time.Second + sendInMsgChanDurationThreshold = 5 * time.Second + sendLoopDurationThreshold = 500 * time.Millisecond +) + +var ( + // ErrDisconnectSetReadDeadlineFailed set read deadline failed + ErrDisconnectSetReadDeadlineFailed DisconnectReason = errors.New("SetReadDeadline failed") + // ErrDisconnectInvalidMessageLength invalid message length + ErrDisconnectInvalidMessageLength DisconnectReason = errors.New("Invalid message length") + // ErrDisconnectMalformedMessage malformed message + ErrDisconnectMalformedMessage DisconnectReason = errors.New("Malformed message body") + // ErrDisconnectUnknownMessage unknown message + ErrDisconnectUnknownMessage DisconnectReason = errors.New("Unknown message ID") + // ErrDisconnectShutdown shutting down the client + ErrDisconnectShutdown DisconnectReason = errors.New("Shutdown") + // ErrDisconnectMessageDecodeUnderflow message data did not fully decode to a message object + ErrDisconnectMessageDecodeUnderflow DisconnectReason = errors.New("Message data did not fully decode to a message object") + // ErrDisconnectTruncatedMessageID message data was too short to contain a message ID + ErrDisconnectTruncatedMessageID DisconnectReason = errors.New("Message data was too short to contain a message ID") + + // ErrConnectionPoolClosed error message indicates the connection pool is closed + ErrConnectionPoolClosed = errors.New("Connection pool is closed") + // ErrWriteQueueFull write queue is full + ErrWriteQueueFull = errors.New("Write queue full") + // ErrNoReachableConnections when broadcasting a message, no connections were available to send a message to + ErrNoReachableConnections = errors.New("All pool connections are unreachable at this time") + // ErrNoMatchingConnections when broadcasting a message, no connections were found for the provided addresses + ErrNoMatchingConnections = errors.New("No connections found for broadcast addresses") + // ErrPoolEmpty when broadcasting a message, the connection pool was empty + ErrPoolEmpty = errors.New("Connection pool is empty after filtering connections") + // ErrConnectionExists connection exists + ErrConnectionExists = errors.New("Connection exists") + // ErrMaxIncomingConnectionsReached max incoming connections reached + ErrMaxIncomingConnectionsReached = errors.New("Max incoming connections reached") + // ErrMaxOutgoingConnectionsReached max outgoing connections reached + ErrMaxOutgoingConnectionsReached = errors.New("Max outgoing connections reached") + // ErrMaxOutgoingDefaultConnectionsReached max outgoing default connections reached + ErrMaxOutgoingDefaultConnectionsReached = errors.New("Max outgoing default connections reached") + // ErrNoAddresses no addresses were provided to BroadcastMessage + ErrNoAddresses = errors.New("No addresses provided") + + // Logger + logger = logging.MustGetLogger("gnet") +) + +// ReadError connection read error +type ReadError struct { + Err error +} + +func (e ReadError) Error() string { + return fmt.Sprintf("read failed: %v", e.Err) +} + +// WriteError connection read error +type WriteError struct { + Err error +} + +func (e WriteError) Error() string { + return fmt.Sprintf("write failed: %v", e.Err) +} + +// Config gnet config +type Config struct { + // Address to listen on. Leave empty for arbitrary assignment + Address string + // Port to listen on. Set to 0 for arbitrary assignment + Port uint16 + // Maximum total connections. Must be >= MaxOutgoingConnections + MaxDefaultPeerOutgoingConnections. + MaxConnections int + // Maximum outgoing connections + MaxOutgoingConnections int + // Maximum allowed default outgoing connection number + MaxDefaultPeerOutgoingConnections int + // Messages greater than length are rejected and the sender disconnected + MaxIncomingMessageLength int + // Messages greater than length are not sent and an error is reported in a SendResult + MaxOutgoingMessageLength int + // Timeout is the timeout for dialing new connections. Use a + // timeout of 0 to ignore timeout. + DialTimeout time.Duration + // Timeout for reading from a connection. Set to 0 to default to the + // system's timeout + ReadTimeout time.Duration + // Timeout for writing to a connection. Set to 0 to default to the + // system's timeout + WriteTimeout time.Duration + // Message sent event buffers + SendResultsSize int + // Individual connections' send queue size. This should be increased + // if send volume per connection is high, so as not to block + ConnectionWriteQueueSize int + // Triggered on client disconnect + DisconnectCallback DisconnectCallback + // Triggered on client connect + ConnectCallback ConnectCallback + // Triggered on client connect failure + ConnectFailureCallback ConnectFailureCallback + // Print debug logs + DebugPrint bool + // Default "trusted" peers + DefaultConnections []string + // Default connections map + defaultConnections map[string]struct{} +} + +// NewConfig returns a Config with defaults set +func NewConfig() Config { + return Config{ + Address: "", + Port: 0, + MaxConnections: 128, + MaxOutgoingMessageLength: 256 * 1024, + MaxIncomingMessageLength: 1024 * 1024, + MaxDefaultPeerOutgoingConnections: 1, + DialTimeout: time.Second * 30, + ReadTimeout: time.Second * 30, + WriteTimeout: time.Second * 30, + SendResultsSize: 2048, + ConnectionWriteQueueSize: 128, + DisconnectCallback: nil, + ConnectCallback: nil, + DebugPrint: false, + defaultConnections: make(map[string]struct{}), + } +} + +const ( + // Byte size of the length prefix in message, sizeof(int32) + messageLengthPrefixSize = 4 +) + +// Connection is stored by the ConnectionPool +type Connection struct { + // Key in ConnectionPool.Pool + ID uint64 + // TCP connection + Conn net.Conn + // Message buffer + Buffer *bytes.Buffer + // Reference back to ConnectionPool container + ConnectionPool *ConnectionPool + // Last time a message was fully parsed and handled + LastReceived time.Time + // Last time a message was sent to the connection + LastSent time.Time + // Message send queue. + WriteQueue chan Message + Solicited bool +} + +// NewConnection creates a new Connection tied to a ConnectionPool +func NewConnection(pool *ConnectionPool, id uint64, conn net.Conn, writeQueueSize int, solicited bool) *Connection { + return &Connection{ + ID: id, + Conn: conn, + Buffer: &bytes.Buffer{}, + ConnectionPool: pool, + LastReceived: Now(), + LastSent: Now(), + WriteQueue: make(chan Message, writeQueueSize), + Solicited: solicited, + } +} + +// Addr returns remote address +func (conn *Connection) Addr() string { + return conn.Conn.RemoteAddr().String() +} + +// String returns connection address +func (conn *Connection) String() string { + return conn.Addr() +} + +// Close close the connection and write queue +func (conn *Connection) Close() error { + err := conn.Conn.Close() + close(conn.WriteQueue) + conn.Buffer = &bytes.Buffer{} + return err +} + +// DisconnectCallback triggered on client disconnect +type DisconnectCallback func(addr string, id uint64, reason DisconnectReason) + +// ConnectCallback triggered on client connect +type ConnectCallback func(addr string, id uint64, solicited bool) + +// ConnectFailureCallback trigger on client connect failure +type ConnectFailureCallback func(addr string, solicited bool, err error) + +// ConnectionPool connection pool +type ConnectionPool struct { + // Configuration parameters + Config Config + // Channel for async message sending + SendResults chan SendResult + // All connections, indexed by ConnId + pool map[uint64]*Connection + // All connections, indexed by address + addresses map[string]*Connection + // connected default peer connections + defaultOutgoingConnections map[string]struct{} + // connected outgoing connections + outgoingConnections map[string]struct{} + // User-defined state to be passed into message handlers + messageState interface{} + // Connection ID counter + connID uint64 + // Listening connection + listener net.Listener + listenerLock sync.Mutex + // operations channel + reqC chan strand.Request + // quit channel + quit chan struct{} + done chan struct{} + strandDone chan struct{} + wg sync.WaitGroup +} + +// NewConnectionPool creates a new ConnectionPool that will listen on +// Config.Port upon StartListen. State is an application defined object that +// will be passed to a Message's Handle(). +func NewConnectionPool(c Config, state interface{}) (*ConnectionPool, error) { + for _, p := range c.DefaultConnections { + c.defaultConnections[p] = struct{}{} + } + + if c.MaxConnections < c.MaxOutgoingConnections+c.MaxDefaultPeerOutgoingConnections { + return nil, errors.New("MaxConnections must be >= MaxOutgoingConnections + MaxDefaultPeerOutgoingConnections") + } + + return &ConnectionPool{ + Config: c, + pool: make(map[uint64]*Connection), + addresses: make(map[string]*Connection), + defaultOutgoingConnections: make(map[string]struct{}), + outgoingConnections: make(map[string]struct{}), + SendResults: make(chan SendResult, c.SendResultsSize), + messageState: state, + quit: make(chan struct{}), + done: make(chan struct{}), + strandDone: make(chan struct{}), + reqC: make(chan strand.Request), + }, nil +} + +// Run starts the connection pool +func (pool *ConnectionPool) Run() error { + defer close(pool.done) + defer logger.Info("Connection pool closed") + + // The strand processing goroutine must be started before any error can be + // returned from Run(), otherwise the Shutdown() call will block if an error occurred + pool.wg.Add(1) + go func() { + defer pool.wg.Done() + pool.processStrand() + }() + + // start the connection accept loop + addr := fmt.Sprintf("%s:%v", pool.Config.Address, pool.Config.Port) + logger.Infof("Listening for connections on %s...", addr) + + ln, err := net.Listen("tcp", addr) + if err != nil { + return err + } + + pool.listenerLock.Lock() + pool.listener = ln + pool.listenerLock.Unlock() + +loop: + for { + conn, err := ln.Accept() + if err != nil { + // When Accept() returns with a non-nil error, we check the quit + // channel to see if we should continue or quit + select { + case <-pool.quit: + break loop + default: + // without the default case the select will block. + logger.Error(err.Error()) + continue + } + } + + pool.wg.Add(1) + go func() { + defer pool.wg.Done() + if err := pool.handleConnection(conn, false); err != nil { + logger.WithFields(logrus.Fields{ + "addr": conn.RemoteAddr(), + "outgoing": false, + }).WithError(err).Error("pool.handleConnection") + } + }() + } + pool.wg.Wait() + return nil +} + +// RunOffline runs the pool in offline mode. No connections will be accepted, +// but strand requests are processed. +func (pool *ConnectionPool) RunOffline() error { + defer close(pool.done) + pool.processStrand() + return nil +} + +func (pool *ConnectionPool) processStrand() { + defer close(pool.strandDone) + for { + select { + case <-pool.quit: + return + case req := <-pool.reqC: + if err := req.Func(); err != nil { + logger.WithField("operation", req.Name).WithError(err).Error("strand req.Func failed") + } + } + } +} + +// Shutdown gracefully shutdown the connection pool +func (pool *ConnectionPool) Shutdown() { + logger.Info("ConnectionPool.Shutdown called") + close(pool.quit) + logger.Info("ConnectionPool.Shutdown closed pool.quit") + + // Wait for all strand() calls to finish + logger.Info("ConnectionPool.Shutdown waiting for strandDone") + <-pool.strandDone + + logger.Info("ConnectionPool.Shutdown closing the listener") + + // Close to listener to prevent new connections + pool.listenerLock.Lock() + if pool.listener != nil { + if err := pool.listener.Close(); err != nil { + logger.WithError(err).Warning("pool.listener.Close error") + } + } + pool.listener = nil + pool.listenerLock.Unlock() + + logger.Info("ConnectionPool.Shutdown disconnecting all connections") + + // In readData, reader.Read() sometimes blocks instead of returning an error when the + // listener is closed. + // Directly close all connections before closing the listener. + // TODO -- could conn.Close() block too? + pool.disconnectAll() + + if len(pool.pool) != 0 { + logger.Critical().Warning("pool.pool is not empty after calling pool.disconnectAll()") + } + if len(pool.addresses) != 0 { + logger.Critical().Warning("pool.addresses is not empty after calling pool.disconnectAll()") + } + + logger.Info("ConnectionPool.Shutdown waiting for done") + + <-pool.done +} + +// strand ensures all read and write action of pool's member variable are in one thread +func (pool *ConnectionPool) strand(name string, f func() error) error { + name = fmt.Sprintf("daemon.gnet.ConnectionPool.%s", name) + return strand.Strand(logger, pool.reqC, name, f, pool.quit, ErrConnectionPoolClosed) +} + +// ListeningAddress returns the address on which the ConnectionPool listens on +func (pool *ConnectionPool) ListeningAddress() (net.Addr, error) { + if pool.listener == nil { + return nil, errors.New("Not listening, call StartListen first") + } + return pool.listener.Addr(), nil +} + +func (pool *ConnectionPool) canConnect(a string, solicited bool) error { + if pool.isConnExist(a) { + return ErrConnectionExists + } + + if solicited { + if _, ok := pool.Config.defaultConnections[a]; ok && pool.isMaxOutgoingDefaultConnectionsReached() { + return ErrMaxOutgoingDefaultConnectionsReached + } else if pool.isMaxOutgoingConnectionsReached() { + return ErrMaxOutgoingConnectionsReached + } + } else if pool.isMaxIncomingConnectionsReached() { + return ErrMaxIncomingConnectionsReached + } + + return nil +} + +// newConnection creates a new Connection around a net.Conn. Trying to make a connection +// to an address that is already connected will failed. +func (pool *ConnectionPool) newConnection(conn net.Conn, solicited bool) (*Connection, error) { + a := conn.RemoteAddr().String() + + if err := pool.canConnect(a, solicited); err != nil { + return nil, err + } + + if solicited { + pool.outgoingConnections[a] = struct{}{} + + if _, ok := pool.Config.defaultConnections[a]; ok { + pool.defaultOutgoingConnections[a] = struct{}{} + l := len(pool.defaultOutgoingConnections) + logger.WithField("addr", a).Debugf("%d/%d outgoing default connections in use", l, pool.Config.MaxDefaultPeerOutgoingConnections) + } + } + + // ID must start at 1; in case connID overflows back to 0, force it to 1 + pool.connID++ + if pool.connID == 0 { + pool.connID = 1 + } + + nc := NewConnection(pool, pool.connID, conn, pool.Config.ConnectionWriteQueueSize, solicited) + + pool.pool[nc.ID] = nc + pool.addresses[a] = nc + + return nc, nil +} + +// Creates a Connection and begins its read and write loop +func (pool *ConnectionPool) handleConnection(conn net.Conn, solicited bool) error { + defer logger.WithField("addr", conn.RemoteAddr()).Debug("Connection closed") + addr := conn.RemoteAddr().String() + + c, err := func() (c *Connection, err error) { + // TODO -- when limits in newConnection() are reached, should we allow the peer + // to be added anyway, so that we can disconnect it normally and send a disconnect packet? + // It would have to allowed to complete the handshake, otherwise the DISC packet will be ignored + // Or we would have to permit a DISC packet before an INTR + // But the read/write loop would still need to be started + // A ConnectEvent would need to be triggered, or else the DisconnectEvent gnet ID will not match the + // pending connection's zero gnet ID. + defer func() { + if err != nil { + if closeErr := conn.Close(); closeErr != nil { + logger.WithError(closeErr).WithField("addr", addr).Error("handleConnection conn.Close") + } + } + }() + + err = pool.strand("handleConnection", func() error { + var err error + c, err = pool.newConnection(conn, solicited) + if err != nil { + return err + } + + if pool.Config.ConnectCallback != nil { + pool.Config.ConnectCallback(c.Addr(), c.ID, solicited) + } + + return nil + }) + + return + }() + + // TODO -- this error is not fully propagated back to a caller of Connect() so the daemon state + // can get stuck in pending + if err != nil { + logger.WithError(err).WithField("addr", conn.RemoteAddr()).Debug("handleConnection: newConnection failed") + if pool.Config.ConnectFailureCallback != nil { + pool.Config.ConnectFailureCallback(addr, solicited, err) + } + return err + } + + msgC := make(chan []byte, 32) + + type methodErr struct { + method string + err error + } + errC := make(chan methodErr, 3) + + var wg sync.WaitGroup + wg.Add(1) + qc := make(chan struct{}) + go func() { + defer wg.Done() + if err := pool.readLoop(c, msgC, qc); err != nil { + errC <- methodErr{ + method: "readLoop", + err: err, + } + } + }() + + wg.Add(1) + go func() { + defer wg.Done() + if err := pool.sendLoop(c, pool.Config.WriteTimeout, pool.Config.MaxOutgoingMessageLength, qc); err != nil { + errC <- methodErr{ + method: "sendLoop", + err: err, + } + } + }() + + wg.Add(1) + go func() { + defer wg.Done() + elapser := elapse.NewElapser(receiveMessageDurationThreshold, logger) + defer elapser.CheckForDone() + + for msg := range msgC { + elapser.Register(fmt.Sprintf("pool.receiveMessage address=%s", addr)) + if err := pool.receiveMessage(c, msg); err != nil { + errC <- methodErr{ + method: "receiveMessage", + err: err, + } + return + } + elapser.CheckForDone() + } + }() + + select { + case <-pool.quit: + if err := conn.Close(); err != nil { + logger.WithError(err).WithField("addr", addr).Error("conn.Close") + } + case mErr := <-errC: + err = mErr.err + logger.WithError(mErr.err).WithFields(logrus.Fields{ + "addr": addr, + "method": mErr.method, + }).Error("handleConnection failure") + + // This Disconnect does not send a DISC packet because it is inside gnet. + // A DISC packet is not useful at this point, because the error is most likely + // that the connection is unreachable. + // However, it may also be that the connection sent data that could not be deserialized + // to a message. + if err := pool.Disconnect(c.Addr(), mErr.err); err != nil { + logger.WithError(err).WithField("addr", addr).Error("Disconnect") + } + } + close(qc) + + wg.Wait() + + return err +} + +func (pool *ConnectionPool) readLoop(conn *Connection, msgChan chan []byte, qc chan struct{}) error { + defer close(msgChan) + // read data from connection + reader := bufio.NewReader(conn.Conn) + buf := make([]byte, 1024) + + elapser := elapse.NewElapser(readLoopDurationThreshold, logger) + sendInMsgChanElapser := elapse.NewElapser(sendInMsgChanDurationThreshold, logger) + + defer elapser.CheckForDone() + defer sendInMsgChanElapser.CheckForDone() + + for { + elapser.Register(fmt.Sprintf("readLoop addr=%s", conn.Addr())) + deadline := time.Time{} + if pool.Config.ReadTimeout != 0 { + deadline = time.Now().Add(pool.Config.ReadTimeout) + } + if err := conn.Conn.SetReadDeadline(deadline); err != nil { + return ErrDisconnectSetReadDeadlineFailed + } + data, err := readData(reader, buf) + if err != nil { + return err + } + + if data == nil { + continue + } + + // write data to buffer + if _, err := conn.Buffer.Write(data); err != nil { + return err + } + // decode data + datas, err := decodeData(conn.Buffer, pool.Config.MaxIncomingMessageLength) + if err != nil { + return err + } + for _, d := range datas { + // use select to avoid the goroutine leak, + // because if msgChan has no receiver this goroutine will leak + select { + case <-qc: + return nil + case <-pool.quit: + return nil + case msgChan <- d: + default: + return errors.New("readLoop msgChan is closed or full") + } + } + sendInMsgChanElapser.CheckForDone() + } +} + +func (pool *ConnectionPool) sendLoop(conn *Connection, timeout time.Duration, maxMsgLength int, qc chan struct{}) error { + elapser := elapse.NewElapser(sendLoopDurationThreshold, logger) + defer elapser.CheckForDone() + + for { + elapser.CheckForDone() + select { + case <-pool.quit: + return nil + case <-qc: + return nil + case m := <-conn.WriteQueue: + elapser.Register(fmt.Sprintf("conn.WriteQueue address=%s", conn.Addr())) + if m == nil { + continue + } + + err := sendMessage(conn.Conn, m, timeout, maxMsgLength) + + // Update last sent before writing to SendResult, + // this allows a write to SendResult to be used as a sync marker, + // since no further action in this block will happen after the write. + if err == nil { + if err := pool.updateLastSent(conn.Addr(), Now()); err != nil { + logger.WithField("addr", conn.Addr()).WithError(err).Warning("updateLastSent failed") + } + } + + sr := newSendResult(conn.Addr(), m, err) + select { + case <-qc: + return nil + case pool.SendResults <- sr: + default: + logger.WithField("addr", conn.Addr()).Warning("SendResults queue full") + } + + if err != nil { + return err + } + } + } +} + +func readData(reader io.Reader, buf []byte) ([]byte, error) { + c, err := reader.Read(buf) + if err != nil { + return nil, &ReadError{ + Err: err, + } + } + if c == 0 { + return nil, nil + } + data := make([]byte, c) + copy(data, buf) + return data, nil +} + +// decode data from buffer. +func decodeData(buf *bytes.Buffer, maxMsgLength int) ([][]byte, error) { + dataArray := [][]byte{} + for buf.Len() > messageLengthPrefixSize { + prefix := buf.Bytes()[:messageLengthPrefixSize] + // decode message length + tmpLength, _, err := encoder.DeserializeUint32(prefix) + if err != nil { + // encoder.DeserializeAtomic should only return an error if there wasn't + // enough data in buf to read the integer, but the prefix buf length + // is already ensured to be long enough + logger.Panicf("encoder.DeserializeUint32 failed unexpectedly: %v", err) + } + + length := int(tmpLength) + + // Disconnect if we received an invalid length + if length < messagePrefixLength { + logger.WithFields(logrus.Fields{ + "length": length, + "messagePrefixLength": messagePrefixLength, + }).Warningf("decodeData: length < messagePrefixLength") + return [][]byte{}, ErrDisconnectInvalidMessageLength + } + + if length > maxMsgLength { + logger.WithFields(logrus.Fields{ + "length": length, + "maxMsgLength": maxMsgLength, + }).Warning("decodeData: length > maxMsgLength") + return [][]byte{}, ErrDisconnectInvalidMessageLength + } + + if buf.Len()-messageLengthPrefixSize < length { + return [][]byte{}, nil + } + + buf.Next(messageLengthPrefixSize) // strip the length prefix + data := make([]byte, length) + _, err = buf.Read(data) + if err != nil { + return [][]byte{}, err + } + + dataArray = append(dataArray, data) + } + return dataArray, nil +} + +// isConnExist check if the connection of address does exist +func (pool *ConnectionPool) isConnExist(addr string) bool { + _, ok := pool.addresses[addr] + return ok +} + +func (pool *ConnectionPool) isMaxIncomingConnectionsReached() bool { + return len(pool.pool) >= (pool.Config.MaxConnections - pool.Config.MaxOutgoingConnections - pool.Config.MaxDefaultPeerOutgoingConnections) +} + +func (pool *ConnectionPool) isMaxOutgoingConnectionsReached() bool { + return len(pool.outgoingConnections) >= pool.Config.MaxOutgoingConnections +} + +func (pool *ConnectionPool) isMaxOutgoingDefaultConnectionsReached() bool { + return len(pool.defaultOutgoingConnections) >= pool.Config.MaxDefaultPeerOutgoingConnections +} + +func (pool *ConnectionPool) updateLastSent(addr string, t time.Time) error { + return pool.strand("updateLastSent", func() error { + if conn, ok := pool.addresses[addr]; ok { + conn.LastSent = t + } + return nil + }) +} + +func (pool *ConnectionPool) updateLastRecv(addr string, t time.Time) error { + return pool.strand("updateLastRecv", func() error { + if conn, ok := pool.addresses[addr]; ok { + conn.LastReceived = t + } + return nil + }) +} + +// GetConnection returns a connection copy if exist +func (pool *ConnectionPool) GetConnection(addr string) (*Connection, error) { + var conn *Connection + if err := pool.strand("GetConnection", func() error { + if c, ok := pool.addresses[addr]; ok { + // copy connection + cc := *c + conn = &cc + } + return nil + }); err != nil { + return nil, err + } + + return conn, nil +} + +// Connect to an address +func (pool *ConnectionPool) Connect(address string) error { + if err := pool.strand("canConnect", func() error { + return pool.canConnect(address, true) + }); err != nil { + return err + } + + logger.WithField("addr", address).Debugf("Making TCP connection") + conn, err := net.DialTimeout("tcp", address, pool.Config.DialTimeout) + if err != nil { + return err + } + + pool.wg.Add(1) + go func() { + defer pool.wg.Done() + if err := pool.handleConnection(conn, true); err != nil { + logger.WithFields(logrus.Fields{ + "addr": conn.RemoteAddr(), + "outgoing": true, + }).WithError(err).Error("pool.handleConnection") + } + }() + return nil +} + +// Disconnect removes a connection from the pool by address and invokes DisconnectCallback +func (pool *ConnectionPool) Disconnect(addr string, r DisconnectReason) error { + return pool.strand("Disconnect", func() error { + logger.WithFields(logrus.Fields{ + "addr": addr, + "reason": r, + }).Debug("Disconnecting") + + // checks if the address is default node address + isDefaultOutgoingConn := false + if _, ok := pool.Config.defaultConnections[addr]; ok { + if _, ok := pool.outgoingConnections[addr]; ok { + isDefaultOutgoingConn = true + } + } + + conn := pool.disconnect(addr, r) + + if conn == nil { + return errors.New("Disconnect: connection does not exist") + } + + if isDefaultOutgoingConn { + l := len(pool.defaultOutgoingConnections) + logger.Debugf("%d/%d default connections in use", l, pool.Config.MaxDefaultPeerOutgoingConnections) + } + + if pool.Config.DisconnectCallback != nil { + pool.Config.DisconnectCallback(addr, conn.ID, r) + } + + return nil + }) +} + +func (pool *ConnectionPool) disconnect(addr string, r DisconnectReason) *Connection { + conn, ok := pool.addresses[addr] + if !ok { + return nil + } + + fields := logrus.Fields{ + "addr": addr, + "id": conn.ID, + } + + delete(pool.pool, conn.ID) + delete(pool.addresses, addr) + delete(pool.defaultOutgoingConnections, addr) + delete(pool.outgoingConnections, addr) + if err := conn.Close(); err != nil { + logger.WithError(err).WithFields(fields).Error("conn.Close") + } + + logger.WithFields(fields).WithField("reason", r).Debug("Closed connection and removed from pool") + + return conn +} + +// disconnectAll disconnects all connections. Only safe to call in Shutdown() +func (pool *ConnectionPool) disconnectAll() { + for _, conn := range pool.pool { + addr := conn.Addr() + pool.disconnect(addr, ErrDisconnectShutdown) + } +} + +// GetConnections returns an copy of pool connections +func (pool *ConnectionPool) GetConnections() ([]Connection, error) { + conns := []Connection{} + if err := pool.strand("GetConnections", func() error { + for _, conn := range pool.pool { + conns = append(conns, *conn) + } + return nil + }); err != nil { + return nil, err + } + return conns, nil +} + +// Size returns the pool size +func (pool *ConnectionPool) Size() (l int, err error) { + err = pool.strand("Size", func() error { + l = len(pool.pool) + return nil + }) + return +} + +// SendMessage sends a Message to a Connection +func (pool *ConnectionPool) SendMessage(addr string, msg Message) error { + if pool.Config.DebugPrint { + logger.WithField("msgType", reflect.TypeOf(msg)).Debug("SendMessage") + } + + return pool.strand("SendMessage", func() error { + if conn, ok := pool.addresses[addr]; ok { + select { + case conn.WriteQueue <- msg: + default: + logger.Critical().WithField("addr", addr).Info("Write queue full") + return ErrWriteQueueFull + } + } else { + return fmt.Errorf("Tried to send %T to %s, but we are not connected", msg, addr) + } + return nil + }) +} + +// BroadcastMessage sends a Message to all connections specified in addrs. +// If a connection does not exist for a given address, it is skipped. +// If no messages were written to any connection, an error is returned. +// Returns the gnet IDs of connections that the message was queued for sending to. +// Note that actual sending can still fail later, if the connection drops before the message is sent. +func (pool *ConnectionPool) BroadcastMessage(msg Message, addrs []string) ([]uint64, error) { + if pool.Config.DebugPrint { + logger.WithField("msgType", reflect.TypeOf(msg)).Debug("BroadcastMessage") + } + + if len(addrs) == 0 { + return nil, ErrNoAddresses + } + + queuedConns := make([]uint64, 0, len(addrs)) + + if err := pool.strand("BroadcastMessage", func() error { + if len(pool.pool) == 0 { + return ErrPoolEmpty + } + + fullWriteQueue := 0 + foundConns := 0 + + for _, addr := range addrs { + if conn, ok := pool.addresses[addr]; ok { + foundConns++ + select { + case conn.WriteQueue <- msg: + queuedConns = append(queuedConns, conn.ID) + default: + logger.Critical().WithFields(logrus.Fields{ + "addr": conn.Addr(), + "id": conn.ID, + }).Info("Write queue full") + fullWriteQueue++ + } + } + } + + if foundConns == 0 { + return ErrNoMatchingConnections + } + + if fullWriteQueue == foundConns { + return ErrNoReachableConnections + } + + return nil + }); err != nil { + return nil, err + } + + return queuedConns, nil +} + +// Unpacks incoming bytes to a Message and calls the message handler. If +// the bytes cannot be converted to a Message, the error is returned as the +// first return value. Otherwise, error will be nil and DisconnectReason will +// be the value returned from the message handler. +func (pool *ConnectionPool) receiveMessage(c *Connection, msg []byte) error { + m, err := convertToMessage(c.ID, msg, pool.Config.DebugPrint) + if err != nil { + return err + } + if err := pool.updateLastRecv(c.Addr(), Now()); err != nil { + return err + } + return m.Handle(NewMessageContext(c), pool.messageState) +} + +// SendPings sends a ping if our last message sent was over pingRate ago +func (pool *ConnectionPool) SendPings(rate time.Duration, msg Message) error { + now := time.Now().UTC() + var addrs []string + if err := pool.strand("SendPings", func() error { + for _, conn := range pool.pool { + if conn.LastSent.Add(rate).Before(now) { + addrs = append(addrs, conn.Addr()) + } + } + return nil + }); err != nil { + return err + } + + for _, a := range addrs { + if err := pool.SendMessage(a, msg); err != nil { + return err + } + } + + return nil +} + +// GetStaleConnections returns connections that have been idle for longer than idleLimit +func (pool *ConnectionPool) GetStaleConnections(idleLimit time.Duration) ([]string, error) { + now := Now() + var idleConns []string + if err := pool.strand("GetStaleConnections", func() error { + for _, conn := range pool.pool { + if conn.LastReceived.Add(idleLimit).Before(now) { + idleConns = append(idleConns, conn.Addr()) + } + } + return nil + }); err != nil { + return nil, err + } + + return idleConns, nil +} + +// Now returns the current UTC time +func Now() time.Time { + return time.Now().UTC() +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/gnet/pool_test.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/gnet/pool_test.go new file mode 100644 index 00000000..16213234 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/gnet/pool_test.go @@ -0,0 +1,1383 @@ +package gnet + +import ( + "bytes" + "errors" + "fmt" + "net" + "strings" + "sync" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/util/logging" +) + +const ( + addr = "127.0.0.1:50823" + port = 50823 + address = "127.0.0.1" + silenceLogger = false +) + +func init() { + if silenceLogger { + logging.Disable() + } +} + +func newTestConfig() Config { + cfg := NewConfig() + cfg.Port = uint16(port) + cfg.Address = address + cfg.MaxConnections = 24 + cfg.MaxOutgoingConnections = 8 + cfg.MaxDefaultPeerOutgoingConnections = 8 + return cfg +} + +func TestNewConnectionPool(t *testing.T) { + cfg := newTestConfig() + cfg.MaxConnections = 108 + cfg.DialTimeout = time.Duration(777) + + p, err := NewConnectionPool(cfg, nil) + require.NoError(t, err) + require.Equal(t, cfg, p.Config) + require.Equal(t, cfg.Port, p.Config.Port) + require.Equal(t, cfg.Address, p.Config.Address) + require.NotNil(t, p.pool) + require.Equal(t, 0, len(p.pool)) + require.NotNil(t, p.addresses) + require.Equal(t, 0, len(p.addresses)) + require.Equal(t, uint64(0), p.connID) +} + +func TestNewConnection(t *testing.T) { + cfg := newTestConfig() + cfg.ConnectionWriteQueueSize = 101 + p, err := NewConnectionPool(cfg, nil) + require.NoError(t, err) + + q := make(chan struct{}) + go func() { + defer close(q) + err := p.Run() + require.NoError(t, err) + }() + + wait() + conn, err := net.Dial("tcp", addr) + require.NoError(t, err) + wait() + + err = p.strand("", func() error { + c := p.addresses[conn.LocalAddr().String()] + require.Equal(t, c, p.pool[p.connID]) + require.Equal(t, uint64(1), p.connID) + require.Equal(t, c.Addr(), conn.LocalAddr().String()) + require.Equal(t, cfg.ConnectionWriteQueueSize, cap(c.WriteQueue)) + require.NotNil(t, c.Buffer) + require.Equal(t, 0, c.Buffer.Len()) + require.Equal(t, p, c.ConnectionPool) + require.False(t, c.LastSent.IsZero()) + require.False(t, c.LastReceived.IsZero()) + return nil + }) + require.NoError(t, err) + + p.Shutdown() + <-q +} + +func TestNewConnectionAlreadyConnected(t *testing.T) { + cfg := newTestConfig() + p, err := NewConnectionPool(cfg, nil) + require.NoError(t, err) + + cc := make(chan *Connection, 1) + p.Config.ConnectCallback = func(addr string, id uint64, solicited bool) { + require.False(t, solicited) + cc <- p.pool[1] + } + + q := make(chan struct{}) + go func() { + defer close(q) + err := p.Run() + require.NoError(t, err) + }() + wait() + + conn, err := net.Dial("tcp", addr) + require.NoError(t, err) + + c := <-cc + require.NotNil(t, c) + + ac := p.addresses[conn.LocalAddr().String()] + require.NotNil(t, ac) + require.Equal(t, c.ID, ac.ID) + + _, err = p.newConnection(c.Conn, true) + require.Error(t, err) + require.Equal(t, ErrConnectionExists, err) + + p.Shutdown() + <-q +} + +func TestAcceptConnections(t *testing.T) { + cfg := newTestConfig() + p, err := NewConnectionPool(cfg, nil) + require.NoError(t, err) + + cc := make(chan *Connection, 1) + var wasSolicited *bool + p.Config.ConnectCallback = func(addr string, id uint64, solicited bool) { + wasSolicited = &solicited + require.False(t, solicited) + cc <- p.pool[1] + } + + q := make(chan struct{}) + go func() { + defer close(q) + err := p.Run() + require.NoError(t, err) + }() + wait() + + conn, err := net.Dial("tcp", addr) + require.NoError(t, err) + + c := <-cc + require.NotNil(t, c) + + require.Len(t, p.addresses, 1) + require.Len(t, p.pool, 1) + + require.Equal(t, conn.RemoteAddr().String(), c.Conn.LocalAddr().String()) + require.Equal(t, conn.LocalAddr().String(), c.Conn.RemoteAddr().String()) + + require.NotNil(t, wasSolicited) + require.False(t, *wasSolicited) + + p.Shutdown() + <-q +} + +func TestStartListenFailed(t *testing.T) { + cfg := newTestConfig() + p, err := NewConnectionPool(cfg, nil) + require.NoError(t, err) + q := make(chan struct{}) + go func() { + defer close(q) + err := p.Run() + require.NoError(t, err) + }() + wait() + + pp, err := NewConnectionPool(cfg, nil) + require.NoError(t, err) + err = pp.Run() + require.Error(t, err) + require.True(t, strings.HasSuffix(err.Error(), "bind: address already in use")) + + p.Shutdown() + <-q +} + +func TestStopListen(t *testing.T) { + cfg := newTestConfig() + p, err := NewConnectionPool(cfg, nil) + require.NoError(t, err) + + q := make(chan struct{}) + go func() { + defer close(q) + err := p.Run() + require.NoError(t, err) + }() + wait() + + _, err = net.Dial("tcp", addr) + require.NoError(t, err) + wait() + + err = p.strand("", func() error { + require.Equal(t, len(p.pool), 1) + return nil + }) + require.NoError(t, err) + + p.Shutdown() + <-q + + require.Nil(t, p.listener) +} + +func TestHandleConnection(t *testing.T) { + cfg := newTestConfig() + + p, err := NewConnectionPool(cfg, nil) + require.NoError(t, err) + + // Unsolicited + cc := make(chan *Connection, 1) + var wasSolicited *bool + p.Config.ConnectCallback = func(addr string, id uint64, solicited bool) { + wasSolicited = &solicited + cc <- p.pool[1] + } + + q := make(chan struct{}) + go func() { + defer close(q) + err := p.Run() + require.NoError(t, err) + }() + wait() + + conn, err := net.Dial("tcp", addr) + require.NoError(t, err) + + var c *Connection + waitTimeout := time.Second * 3 + select { + case c = <-cc: + case <-time.After(waitTimeout): + t.Fatal("Timed out waiting for connection") + } + require.NotNil(t, c) + + var exist bool + err = p.strand("isConnExist", func() error { + exist = p.isConnExist(conn.LocalAddr().String()) + return nil + }) + require.NoError(t, err) + require.True(t, exist) + + dc := p.disconnect(conn.LocalAddr().String(), ErrDisconnectUnknownMessage) + require.NotNil(t, dc) + + require.NotNil(t, wasSolicited) + require.False(t, *wasSolicited) + + // Solicited + wasSolicited = nil + p.Config.ConnectCallback = func(addr string, id uint64, s bool) { + wasSolicited = &s + cc <- p.pool[2] + } + + done := make(chan struct{}) + go func() { + defer close(done) + err = p.handleConnection(conn, true) + require.NotEqual(t, ErrConnectionExists, err) + require.NotEqual(t, ErrMaxIncomingConnectionsReached, err) + require.NotEqual(t, ErrMaxOutgoingConnectionsReached, err) + require.NotEqual(t, ErrMaxOutgoingDefaultConnectionsReached, err) + }() + + c = nil + select { + case c = <-cc: + case <-time.After(waitTimeout): + t.Fatal("Timed out waiting for connection") + } + require.NotNil(t, c) + require.Equal(t, addr, c.Addr()) + + p.Shutdown() + + select { + case <-done: + case <-time.After(waitTimeout): + t.Fatal("Timed out waiting for done") + } + + select { + case <-q: + case <-time.After(waitTimeout): + t.Fatal("Timed out waiting for quit") + } +} + +func TestConnect(t *testing.T) { + cfg := newTestConfig() + p, err := NewConnectionPool(cfg, nil) + require.NoError(t, err) + + q := make(chan struct{}) + go func() { + defer close(q) + err := p.Run() + require.NoError(t, err) + }() + wait() + + err = p.Connect(addr) + require.NoError(t, err) + wait() + + // If already connected, should return same connection + err = p.Connect(addr) + require.Equal(t, ErrConnectionExists, err) + wait() + + delete(p.addresses, addr) + + p.Shutdown() + <-q + + // Pool is shutdown, connect should fail + wc := make(chan struct{}) + var connectErr error + go func() { + defer close(wc) + connectErr = p.Connect(addr) + }() + + <-wc + + require.Error(t, connectErr) +} + +func TestConnectNoTimeout(t *testing.T) { + cfg := newTestConfig() + cfg.DialTimeout = 0 + cfg.Port++ + + p, err := NewConnectionPool(cfg, nil) + require.NoError(t, err) + + q := make(chan struct{}) + go func() { + defer close(q) + err := p.Run() + require.NoError(t, err) + }() + wait() + + p.Shutdown() + <-q + + err = p.Connect(addr) + wait() + + require.Error(t, err) +} + +func TestDisconnect(t *testing.T) { + cfg := newTestConfig() + p, err := NewConnectionPool(cfg, nil) + require.NoError(t, err) + + // Setup a callback to capture the connection pointer so we can get the address + cc := make(chan *Connection, 1) + p.Config.ConnectCallback = func(addr string, id uint64, solicited bool) { + cc <- p.pool[1] + } + + q := make(chan struct{}) + go func() { + defer close(q) + err := p.Run() + require.NoError(t, err) + }() + wait() + + _, err = net.Dial("tcp", addr) + require.NoError(t, err) + + c := <-cc + require.NotNil(t, c) + + var cAddr string + err = p.strand("", func() error { + cAddr = c.Addr() + return nil + }) + require.NoError(t, err) + + err = p.strand("", func() error { + p.Config.DisconnectCallback = func(addr string, id uint64, reason DisconnectReason) { + require.Equal(t, cAddr, addr) + } + return nil + }) + require.NoError(t, err) + + err = p.Disconnect(c.Addr(), ErrDisconnectMalformedMessage) + require.NoError(t, err) + + err = p.strand("", func() error { + p.Config.DisconnectCallback = func(addr string, id uint64, reason DisconnectReason) { + t.Fatal("disconnect unknown connection should not see this") + } + return nil + }) + require.NoError(t, err) + + err = p.Disconnect("", nil) + require.Equal(t, errors.New("Disconnect: connection does not exist"), err) + + p.Shutdown() + <-q +} + +func TestConnectionClose(t *testing.T) { + c := &Connection{ + Conn: NewDummyConn(addr), + Buffer: &bytes.Buffer{}, + WriteQueue: make(chan Message), + } + + c.Buffer.WriteByte(7) + require.Equal(t, c.Buffer.Len(), 1) + c.Close() + + select { + case <-c.WriteQueue: + case <-time.After(time.Millisecond): + t.Fatalf("WriteQueue should be closed") + } + + require.Equal(t, c.Buffer.Len(), 0) +} + +type fakeConn struct { + net.Conn + addr string +} + +func (f fakeConn) RemoteAddr() net.Addr { + return fakeAddr{ + addr: f.addr, + } +} + +type fakeAddr struct { + net.Addr + addr string +} + +func (f fakeAddr) String() string { + return f.addr +} + +func TestGetConnections(t *testing.T) { + cfg := newTestConfig() + p, err := NewConnectionPool(cfg, nil) + require.NoError(t, err) + + c := &Connection{ + ID: 1, + Conn: fakeConn{addr: "1.2.3.4"}, + } + d := &Connection{ + ID: 2, + Conn: fakeConn{addr: "2.3.4.5"}, + } + e := &Connection{ + ID: 3, + Conn: fakeConn{addr: "3.4.5.6"}, + } + + p.pool[c.ID] = c + p.pool[d.ID] = d + p.pool[e.ID] = e + + q := make(chan struct{}) + go func() { + defer close(q) + err := p.Run() + require.NoError(t, err) + }() + wait() + + conns, err := p.GetConnections() + require.NoError(t, err) + require.Equal(t, len(conns), 3) + + m := make(map[uint64]*Connection, 3) + for i, c := range conns { + m[c.ID] = &conns[i] + } + + require.Equal(t, len(m), 3) + for i := 1; i <= 3; i++ { + require.Equal(t, m[uint64(i)], p.pool[uint64(i)]) + } + + p.Shutdown() + <-q +} + +func TestConnectionReadLoopReadError(t *testing.T) { + cfg := newTestConfig() + p, err := NewConnectionPool(cfg, nil) + require.NoError(t, err) + + cc := make(chan *Connection, 1) + p.Config.ConnectCallback = func(addr string, id uint64, solicited bool) { + cc <- p.addresses[addr] + } + + q := make(chan struct{}) + go func() { + defer close(q) + err := p.Run() + require.NoError(t, err) + }() + + wait() + + readDataErr := "read failed: failed" + + disconnectCalled := make(chan struct{}) + p.Config.DisconnectCallback = func(addr string, id uint64, reason DisconnectReason) { + defer close(disconnectCalled) + require.Equal(t, readDataErr, reason.Error()) + } + + // 1: + // Use a mock net.Conn that captures SetReadDeadline + // and throws an error on Read + reconn := NewReadErrorConn() + go func() { + err := p.handleConnection(reconn, false) + require.Equal(t, readDataErr, err.Error()) + }() + + <-cc + + wait() + + require.True(t, reconn.(*ReadErrorConn).GetReadDeadlineSet() != time.Time{}) + reconn.Close() + + select { + case <-disconnectCalled: + case <-time.After(time.Second * 10): + t.Fatal("wait for disconnectCalled timed out") + } + + p.Shutdown() + <-q +} + +func TestConnectionReadLoopSetReadDeadlineFailed(t *testing.T) { + cfg := newTestConfig() + p, err := NewConnectionPool(cfg, nil) + require.NoError(t, err) + + cc := make(chan *Connection, 1) + p.Config.ConnectCallback = func(addr string, id uint64, solicited bool) { + cc <- p.addresses[addr] + } + + q := make(chan struct{}) + go func() { + defer close(q) + err := p.Run() + require.NoError(t, err) + }() + + wait() + + // 2: + // Use a mock net.Conn that fails on SetReadDeadline + disconnectCalled := make(chan struct{}) + p.Config.DisconnectCallback = func(addr string, id uint64, reason DisconnectReason) { + defer close(disconnectCalled) + require.Equal(t, ErrDisconnectSetReadDeadlineFailed, reason) + } + + rdfconn := &ReadDeadlineFailedConn{} + go func() { + err := p.handleConnection(rdfconn, false) + require.Equal(t, ErrDisconnectSetReadDeadlineFailed, err) + }() + + <-cc + + rdfconn.Close() + + <-disconnectCalled + + p.Shutdown() + <-q +} + +func TestConnectionReadLoopInvalidMessageLength(t *testing.T) { + cfg := newTestConfig() + cfg.MaxIncomingMessageLength = 1 + p, err := NewConnectionPool(cfg, nil) + require.NoError(t, err) + + cc := make(chan *Connection, 1) + p.Config.ConnectCallback = func(addr string, id uint64, solicited bool) { + cc <- p.addresses[addr] + } + + q := make(chan struct{}) + go func() { + defer close(q) + err := p.Run() + require.NoError(t, err) + }() + + wait() + + // 3: + // Use a mock net.Conn that returns some bytes on Read + // Look for these bytes copied into the eventChannel + disconnectCalled := make(chan struct{}) + p.Config.DisconnectCallback = func(addr string, id uint64, reason DisconnectReason) { + defer close(disconnectCalled) + require.Equal(t, ErrDisconnectInvalidMessageLength, reason) + } + + raconn := newReadAlwaysConn() + go func() { + err := p.handleConnection(raconn, false) + require.Equal(t, ErrDisconnectInvalidMessageLength, err) + }() + + <-cc + + wait() + raconn.stop() + wait() + raconn.Close() + + <-disconnectCalled + + p.Shutdown() + <-q +} + +func TestConnectionReadLoopTerminates(t *testing.T) { + cfg := newTestConfig() + p, err := NewConnectionPool(cfg, nil) + require.NoError(t, err) + + cc := make(chan *Connection, 1) + p.Config.ConnectCallback = func(addr string, id uint64, solicited bool) { + cc <- p.addresses[addr] + } + + q := make(chan struct{}) + go func() { + defer close(q) + err := p.Run() + require.NoError(t, err) + }() + + wait() + + readDataErr := "read failed: done" + + // 4: Use a mock net.Conn that successfully returns 0 bytes when read + rnconn := newReadNothingConn() + disconnectCalled := make(chan struct{}) + p.Config.DisconnectCallback = func(addr string, id uint64, reason DisconnectReason) { + defer close(disconnectCalled) + require.Equal(t, readDataErr, reason.Error()) + } + go func() { + err := p.handleConnection(rnconn, false) + require.Equal(t, readDataErr, err.Error()) + }() + + <-cc + + wait() + rnconn.stop() + wait() + rnconn.Close() + + <-disconnectCalled + + p.Shutdown() + <-q +} + +func TestProcessConnectionBuffers(t *testing.T) { + assertIsMessage(t, &DummyMessage{}) + assertIsMessage(t, &ErrorMessage{}) + + resetHandler() + EraseMessages() + RegisterMessage(DummyPrefix, DummyMessage{}) + RegisterMessage(ErrorPrefix, ErrorMessage{}) + VerifyMessages() + cfg := newTestConfig() + p, err := NewConnectionPool(cfg, nil) + require.NoError(t, err) + + // Setup a callback to capture the connection pointer so we can get the address + cc := make(chan *Connection, 1) + p.Config.ConnectCallback = func(addr string, id uint64, solicited bool) { + cc <- p.addresses[addr] + } + + p.Config.DisconnectCallback = func(addr string, id uint64, reason DisconnectReason) { + t.Fatalf("Unexpected disconnect address=%s reason=%v", addr, reason) + } + + q := make(chan struct{}) + go func() { + defer close(q) + err := p.Run() + require.NoError(t, err) + }() + wait() + + conn, err := net.Dial("tcp", addr) + require.NoError(t, err) + + c := <-cc + require.NotNil(t, c) + + // Write DummyMessage + _, err = conn.Write([]byte{4, 0, 0, 0}) + require.NoError(t, err) + _, err = conn.Write([]byte{'D', 'U', 'M', 'Y'}) + require.NoError(t, err) + + wait() + + err = p.strand("", func() error { + require.NotEqual(t, c.LastReceived, time.Time{}) + return nil + }) + require.NoError(t, err) + + // Push multiple messages, the first causing an error, and confirm that + // the remaining messages were unprocessed. + t.Logf("Pushing multiple messages, first one causing an error") + + disconnectCalled := make(chan struct{}) + p.Config.DisconnectCallback = func(addr string, id uint64, reason DisconnectReason) { + defer close(disconnectCalled) + require.Equal(t, reason, ErrErrorMessageHandler) + } + + _, err = conn.Write([]byte{4, 0, 0, 0, 'E', 'R', 'R', 0x00}) + require.NoError(t, err) + + select { + case <-disconnectCalled: + case <-time.After(time.Second * 2): + t.Fatal("disconnect did not happen, would block") + } + + p.Config.DisconnectCallback = func(addr string, id uint64, reason DisconnectReason) { + fmt.Println(reason) + t.Fatal("should not see this") + } + + _, err = conn.Write([]byte{4, 0, 0, 0, 'D', 'U', 'M', 'Y'}) + require.NoError(t, err) + + wait() + + conn, err = net.Dial("tcp", addr) + require.NoError(t, err) + + c = <-cc + require.NotNil(t, c) + + disconnectCalled = make(chan struct{}) + p.Config.DisconnectCallback = func(addr string, id uint64, reason DisconnectReason) { + defer close(disconnectCalled) + require.Equal(t, c.Addr(), addr) + require.Equal(t, reason, ErrDisconnectInvalidMessageLength) + require.Nil(t, p.pool[1]) + require.Nil(t, p.pool[2]) + } + + // Sending a length of < messagePrefixLength should cause a disconnect + t.Logf("Pushing message with too small length") + + _, err = conn.Write([]byte{messagePrefixLength - 1, 0, 0, 0, 'B', 'Y', 'T', 'E'}) + require.NoError(t, err) + + select { + case <-disconnectCalled: + case <-time.After(time.Second * 2): + t.Fatal("disconnect did not happen, would block") + } + + // Sending a length > MaxIncomingMessageLength should cause a disconnect + conn, err = net.Dial("tcp", addr) + require.NoError(t, err) + + c = <-cc + require.NotNil(t, c) + + t.Logf("Pushing message with too large length") + p.Config.MaxIncomingMessageLength = 4 + p.Config.MaxOutgoingMessageLength = 4 + disconnectCalled = make(chan struct{}) + p.Config.DisconnectCallback = func(addr string, id uint64, r DisconnectReason) { + defer close(disconnectCalled) + require.Equal(t, ErrDisconnectInvalidMessageLength, r) + } + + _, err = conn.Write([]byte{5, 0, 0, 0, 'B', 'Y', 'T', 'E'}) + require.NoError(t, err) + + <-disconnectCalled + + err = p.strand("", func() error { + require.Nil(t, p.pool[1]) + require.Nil(t, p.pool[2]) + require.Nil(t, p.pool[3]) + return nil + }) + require.NoError(t, err) + + p.Shutdown() + <-q +} + +func TestConnectionWriteLoop(t *testing.T) { + resetHandler() + EraseMessages() + RegisterMessage(BytePrefix, ByteMessage{}) + VerifyMessages() + + cfg := newTestConfig() + p, err := NewConnectionPool(cfg, nil) + require.NoError(t, err) + + // Setup a callback to capture the connection pointer so we can get the address + cc := make(chan *Connection, 1) + p.Config.ConnectCallback = func(addr string, id uint64, solicited bool) { + cc <- p.pool[1] + } + + disconnectErr := make(chan DisconnectReason, 1) + p.Config.DisconnectCallback = func(addr string, id uint64, reason DisconnectReason) { + fmt.Printf("DisconnectCallback called, address=%s reason=%v\n", addr, reason) + disconnectErr <- reason + } + + q := make(chan struct{}) + go func() { + defer close(q) + err := p.Run() + require.NoError(t, err) + }() + + wait() + + conn, err := net.Dial("tcp", addr) + require.NoError(t, err) + + wait() + + // Go's internals seem to be blocking on network read, write something to + // the connection to hopefully avoid this + _, err = conn.Write([]byte{0}) + require.NoError(t, err) + + c := <-cc + require.NotNil(t, c) + + m := NewByteMessage(88) + // Send a successful message to b + err = p.SendMessage(c.Addr(), m) + require.NoError(t, err) + + var sr SendResult + select { + case sr = <-p.SendResults: + case <-time.After(time.Second * 2): + t.Fatal("No send results, would block") + } + + require.Len(t, p.SendResults, 0) + + require.Equal(t, sr.Message, m) + require.Equal(t, sr.Addr, c.Addr()) + require.Nil(t, sr.Error) + + err = p.strand("", func() error { + c = p.pool[c.ID] + return nil + }) + require.NoError(t, err) + require.NotNil(t, c) + + lastSent := c.LastSent + require.False(t, lastSent.IsZero()) + + // Send a failed message to c + sendByteMessage = failingSendByteMessage + + err = p.SendMessage(c.Addr(), m) + require.NoError(t, err) + + select { + case sr = <-p.SendResults: + case <-time.After(time.Second * 2): + t.Fatal("No send results, would block") + } + require.Equal(t, sr.Message, m) + require.Equal(t, sr.Addr, c.Addr()) + require.NotNil(t, sr.Error) + + reason := <-disconnectErr + require.NotNil(t, reason) + require.Equal(t, errors.New("send byte message failed"), reason) + + // c.LastSent should not have changed + require.Equal(t, lastSent, c.LastSent) + + p.Shutdown() + <-q +} + +func TestPoolSendMessageOK(t *testing.T) { + resetHandler() + EraseMessages() + RegisterMessage(BytePrefix, ByteMessage{}) + VerifyMessages() + + cfg := newTestConfig() + cfg.WriteTimeout = time.Second + cfg.SendResultsSize = 1 + cfg.ConnectionWriteQueueSize = 8 + p, err := NewConnectionPool(cfg, nil) + require.NoError(t, err) + + // Setup a callback to capture the connection pointer so we can get the address + cc := make(chan *Connection, 1) + p.Config.ConnectCallback = func(addr string, id uint64, solicited bool) { + cc <- p.pool[1] + } + + q := make(chan struct{}) + go func() { + defer close(q) + err := p.Run() + require.NoError(t, err) + }() + wait() + + _, err = net.Dial("tcp", addr) + require.NoError(t, err) + + c := <-cc + m := NewByteMessage(88) + err = p.SendMessage(c.Addr(), m) + require.NoError(t, err) + + p.Shutdown() + <-q +} + +func TestPoolSendMessageWriteQueueFull(t *testing.T) { + resetHandler() + EraseMessages() + RegisterMessage(BytePrefix, ByteMessage{}) + VerifyMessages() + + cfg := newTestConfig() + cfg.WriteTimeout = time.Second + cfg.SendResultsSize = 1 + cfg.ConnectionWriteQueueSize = 0 + p, err := NewConnectionPool(cfg, nil) + require.NoError(t, err) + + // Setup a callback to capture the connection pointer so we can get the address + cc := make(chan *Connection, 1) + p.Config.ConnectCallback = func(addr string, id uint64, solicited bool) { + cc <- p.pool[1] + } + + q := make(chan struct{}) + go func() { + defer close(q) + err := p.Run() + require.NoError(t, err) + }() + wait() + + _, err = net.Dial("tcp", addr) + require.NoError(t, err) + + c := <-cc + + // Send messages faster than can be processed to trigger ErrWriteQueueFull + attempts := 100 + gotErr := false + var once sync.Once + m := NewByteMessage(88) + addr := c.Addr() + var wg sync.WaitGroup + wg.Add(attempts) + for i := 0; i < attempts; i++ { + go func() { + defer wg.Done() + err := p.SendMessage(addr, m) + if err == ErrWriteQueueFull { + once.Do(func() { + gotErr = true + }) + } + }() + } + + wg.Wait() + + require.True(t, gotErr) + + p.Shutdown() + <-q +} + +func TestPoolBroadcastMessage(t *testing.T) { + resetHandler() + EraseMessages() + RegisterMessage(BytePrefix, ByteMessage{}) + VerifyMessages() + + cfg := newTestConfig() + cfg.ConnectionWriteQueueSize = 1 + p, err := NewConnectionPool(cfg, nil) + require.NoError(t, err) + + ready := make(chan struct{}) + var i int + var counterLock sync.Mutex + p.Config.ConnectCallback = func(addr string, id uint64, solicited bool) { + counterLock.Lock() + defer counterLock.Unlock() + i++ + if i == 2 { + close(ready) + } + } + + q := make(chan struct{}) + go func() { + defer close(q) + err := p.Run() + require.NoError(t, err) + }() + wait() + + conn1, err := net.Dial("tcp", addr) + require.NoError(t, err) + + // Go's internals seem to be blocking on network read, write something to + // the connection to hopefully avoid this + _, err = conn1.Write([]byte{0}) + require.NoError(t, err) + + conn2, err := net.Dial("tcp", addr) + require.NoError(t, err) + + // Go's internals seem to be blocking on network read, write something to + // the connection to hopefully avoid this + _, err = conn2.Write([]byte{0}) + require.NoError(t, err) + + <-ready + + var addrs []string + err = p.strand("addresses", func() error { + for a := range p.addresses { + addrs = append(addrs, a) + } + return nil + }) + require.NoError(t, err) + require.NotEmpty(t, addrs) + + m := NewByteMessage(88) + n, err := p.BroadcastMessage(m, addrs) + require.NoError(t, err) + require.Equal(t, 2, len(n)) + + _, err = p.BroadcastMessage(m, []string{}) + require.Equal(t, ErrNoAddresses, err) + + _, err = p.BroadcastMessage(m, []string{"1.1.1.1"}) + require.Equal(t, ErrNoMatchingConnections, err) + + // Spam the connections with so much data that their write queue overflows, + // which will cause ErrNoReachableConnections + attempts := 1000 + gotErr := false + var once sync.Once + var wg sync.WaitGroup + wg.Add(attempts) + for i := 0; i < attempts; i++ { + go func() { + defer wg.Done() + _, err := p.BroadcastMessage(m, addrs) + if err == ErrNoReachableConnections { + once.Do(func() { + gotErr = true + }) + } + }() + } + + wg.Wait() + + require.True(t, gotErr) + + p.Shutdown() + <-q +} + +func TestPoolReceiveMessage(t *testing.T) { + wait() + resetHandler() + EraseMessages() + RegisterMessage(BytePrefix, ByteMessage{}) + RegisterMessage(ErrorPrefix, ErrorMessage{}) + VerifyMessages() + + cfg := newTestConfig() + p, err := NewConnectionPool(cfg, nil) + require.NoError(t, err) + + q := make(chan struct{}) + go func() { + defer close(q) + err := p.Run() + require.NoError(t, err) + }() + wait() + + c := NewConnection(p, 1, NewDummyConn(addr), 10, true) + + // Valid message received + b := make([]byte, 0) + b = append(b, BytePrefix[:]...) + b = append(b, byte(7)) + err = p.receiveMessage(c, b) + require.NoError(t, err) + require.False(t, c.LastReceived.IsZero()) + + // Invalid byte message received + b = []byte{1} + err = p.receiveMessage(c, b) + require.Error(t, err) + + // Valid message, but handler returns a DisconnectReason + b = make([]byte, 0) + b = append(b, ErrorPrefix[:]...) + err = p.receiveMessage(c, b) + require.Equal(t, err, ErrErrorMessageHandler) + + p.Shutdown() + <-q +} + +// Helpers + +func wait() { + time.Sleep(time.Millisecond * 150) +} + +type DummyAddr struct { + addr string +} + +func NewDummyAddr(addr string) *DummyAddr { + return &DummyAddr{ + addr: addr, + } +} + +func (da *DummyAddr) Network() string { + return da.addr +} + +func (da *DummyAddr) String() string { + return da.Network() +} + +type DummyConn struct { + net.Conn + addr string +} + +func NewDummyConn(addr string) net.Conn { + return &DummyConn{addr: addr} +} + +func (dc *DummyConn) RemoteAddr() net.Addr { + return NewDummyAddr(dc.addr) +} + +func (dc *DummyConn) LocalAddr() net.Addr { + return dc.RemoteAddr() +} + +func (dc *DummyConn) Close() error { + return nil +} + +func (dc *DummyConn) Read(b []byte) (int, error) { + return 0, nil +} + +func (dc *DummyConn) SetWriteDeadline(t time.Time) error { + return nil +} + +func (dc *DummyConn) Write(b []byte) (int, error) { + return len(b), nil +} + +type ReadErrorConn struct { + net.Conn + ReadDeadlineSet time.Time + sync.Mutex +} + +func NewReadErrorConn() net.Conn { + return &ReadErrorConn{} +} + +func (rec *ReadErrorConn) RemoteAddr() net.Addr { + return NewDummyAddr(addr) +} + +func (rec *ReadErrorConn) SetReadDeadline(t time.Time) error { + rec.Lock() + defer rec.Unlock() + rec.ReadDeadlineSet = t + return nil +} + +func (rec *ReadErrorConn) GetReadDeadlineSet() time.Time { + rec.Lock() + defer rec.Unlock() + return rec.ReadDeadlineSet +} + +func (rec *ReadErrorConn) Read(b []byte) (int, error) { + return 0, errors.New("failed") +} + +func (rec *ReadErrorConn) Close() error { + return nil +} + +type ReadDeadlineFailedConn struct { + net.Conn +} + +func (c *ReadDeadlineFailedConn) Read(b []byte) (int, error) { + return 0, nil +} + +func (c *ReadDeadlineFailedConn) SetReadDeadline(t time.Time) error { + return errors.New("Failed") +} + +func (c *ReadDeadlineFailedConn) RemoteAddr() net.Addr { + return NewDummyAddr(addr) +} + +func (c *ReadDeadlineFailedConn) Close() error { + return nil +} + +type readAlwaysConn struct { + net.Conn + stopReading chan struct{} +} + +func newReadAlwaysConn() *readAlwaysConn { + return &readAlwaysConn{ + stopReading: make(chan struct{}), + } +} + +func (c *readAlwaysConn) RemoteAddr() net.Addr { + return NewDummyAddr(addr) +} + +func (c *readAlwaysConn) Close() error { + return nil +} + +func (c *readAlwaysConn) Read(b []byte) (int, error) { + select { + case <-c.stopReading: + return 0, errors.New("done") + default: + } + + if len(b) == 0 { + return 0, nil + } + + b[0] = byte(88) + + return 1, nil +} + +func (c *readAlwaysConn) SetReadDeadline(t time.Time) error { + return nil +} + +func (c *readAlwaysConn) stop() { + close(c.stopReading) +} + +type readNothingConn struct { + net.Conn + stopReading chan struct{} +} + +func newReadNothingConn() *readNothingConn { + return &readNothingConn{ + stopReading: make(chan struct{}), + } +} + +func (c *readNothingConn) Read(b []byte) (int, error) { + select { + case <-c.stopReading: + return 0, errors.New("done") + default: + } + + time.Sleep(time.Millisecond * 2) + return 0, nil +} + +func (c *readNothingConn) SetReadDeadline(t time.Time) error { + return nil +} + +func (c *readNothingConn) RemoteAddr() net.Addr { + return NewDummyAddr(addr) +} + +func (c *readNothingConn) Close() error { + return nil +} + +func (c *readNothingConn) stop() { + close(c.stopReading) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/introduction_message_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/introduction_message_skyencoder.go new file mode 100644 index 00000000..5c210d02 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/introduction_message_skyencoder.go @@ -0,0 +1,162 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package daemon + +import ( + "errors" + "math" + + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +// encodeSizeIntroductionMessage computes the size of an encoded object of type IntroductionMessage +func encodeSizeIntroductionMessage(obj *IntroductionMessage) uint64 { + i0 := uint64(0) + + // obj.Mirror + i0 += 4 + + // obj.ListenPort + i0 += 2 + + // obj.ProtocolVersion + i0 += 4 + + // omitempty + if len(obj.Extra) != 0 { + + // obj.Extra + i0 += 4 + uint64(len(obj.Extra)) + + } + + return i0 +} + +// encodeIntroductionMessage encodes an object of type IntroductionMessage to a buffer allocated to the exact size +// required to encode the object. +func encodeIntroductionMessage(obj *IntroductionMessage) ([]byte, error) { + n := encodeSizeIntroductionMessage(obj) + buf := make([]byte, n) + + if err := encodeIntroductionMessageToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeIntroductionMessageToBuffer encodes an object of type IntroductionMessage to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeIntroductionMessageToBuffer(buf []byte, obj *IntroductionMessage) error { + if uint64(len(buf)) < encodeSizeIntroductionMessage(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Mirror + e.Uint32(obj.Mirror) + + // obj.ListenPort + e.Uint16(obj.ListenPort) + + // obj.ProtocolVersion + e.Int32(obj.ProtocolVersion) + + // omitempty + if len(obj.Extra) != 0 { + + // obj.Extra length check + if uint64(len(obj.Extra)) > math.MaxUint32 { + return errors.New("obj.Extra length exceeds math.MaxUint32") + } + + // obj.Extra length + e.Uint32(uint32(len(obj.Extra))) + + // obj.Extra copy + e.CopyBytes(obj.Extra) + + } + + return nil +} + +// decodeIntroductionMessage decodes an object of type IntroductionMessage from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeIntroductionMessage(buf []byte, obj *IntroductionMessage) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Mirror + i, err := d.Uint32() + if err != nil { + return 0, err + } + obj.Mirror = i + } + + { + // obj.ListenPort + i, err := d.Uint16() + if err != nil { + return 0, err + } + obj.ListenPort = i + } + + { + // obj.ProtocolVersion + i, err := d.Int32() + if err != nil { + return 0, err + } + obj.ProtocolVersion = i + } + + { + // obj.Extra + + if len(d.Buffer) == 0 { + return uint64(len(buf) - len(d.Buffer)), nil + } + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length != 0 { + obj.Extra = make([]byte, length) + + copy(obj.Extra[:], d.Buffer[:length]) + d.Buffer = d.Buffer[length:] + } + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeIntroductionMessageExact decodes an object of type IntroductionMessage from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeIntroductionMessageExact(buf []byte, obj *IntroductionMessage) error { + if n, err := decodeIntroductionMessage(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/introduction_message_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/introduction_message_skyencoder_test.go new file mode 100644 index 00000000..3612afdb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/introduction_message_skyencoder_test.go @@ -0,0 +1,421 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package daemon + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +func newEmptyIntroductionMessageForEncodeTest() *IntroductionMessage { + var obj IntroductionMessage + return &obj +} + +func newRandomIntroductionMessageForEncodeTest(t *testing.T, rand *mathrand.Rand) *IntroductionMessage { + var obj IntroductionMessage + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenIntroductionMessageForEncodeTest(t *testing.T, rand *mathrand.Rand) *IntroductionMessage { + var obj IntroductionMessage + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilIntroductionMessageForEncodeTest(t *testing.T, rand *mathrand.Rand) *IntroductionMessage { + var obj IntroductionMessage + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderIntroductionMessage(t *testing.T, obj *IntroductionMessage) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeIntroductionMessage(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeIntroductionMessage() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeIntroductionMessage(obj) + if err != nil { + t.Fatalf("encodeIntroductionMessage failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeIntroductionMessage produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeIntroductionMessage()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeIntroductionMessageToBuffer(data3, obj); err != nil { + t.Fatalf("encodeIntroductionMessageToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 IntroductionMessage + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 IntroductionMessage + if n, err := decodeIntroductionMessage(data2, &obj3); err != nil { + t.Fatalf("decodeIntroductionMessage failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeIntroductionMessage bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeIntroductionMessage()") + } + + // Decode, excess buffer + var obj4 IntroductionMessage + n, err := decodeIntroductionMessage(data3, &obj4) + if err != nil { + t.Fatalf("decodeIntroductionMessage failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeIntroductionMessage bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeIntroductionMessage bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeIntroductionMessage()") + } + + // DecodeExact + var obj5 IntroductionMessage + if err := decodeIntroductionMessageExact(data2, &obj5); err != nil { + t.Fatalf("decodeIntroductionMessage failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeIntroductionMessage()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeIntroductionMessage(data4, &obj3); err != nil { + t.Fatalf("decodeIntroductionMessage failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeIntroductionMessage bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderIntroductionMessage(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *IntroductionMessage + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptyIntroductionMessageForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomIntroductionMessageForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenIntroductionMessageForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilIntroductionMessageForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderIntroductionMessage(t, tc.obj) + }) + } +} + +func decodeIntroductionMessageExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj IntroductionMessage + if _, err := decodeIntroductionMessage(buf, &obj); err == nil { + t.Fatal("decodeIntroductionMessage: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeIntroductionMessage: expected error %q, got %q", expectedErr, err) + } +} + +func decodeIntroductionMessageExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj IntroductionMessage + if err := decodeIntroductionMessageExact(buf, &obj); err == nil { + t.Fatal("decodeIntroductionMessageExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeIntroductionMessageExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderIntroductionMessageDecodeErrors(t *testing.T, k int, tag string, obj *IntroductionMessage) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeIntroductionMessage(obj) + buf, err := encodeIntroductionMessage(obj) + if err != nil { + t.Fatalf("encodeIntroductionMessage failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeIntroductionMessageExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeIntroductionMessageExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeIntroductionMessageExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeIntroductionMessageExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeIntroductionMessageExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderIntroductionMessageDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptyIntroductionMessageForEncodeTest() + fullObj := newRandomIntroductionMessageForEncodeTest(t, rand) + testSkyencoderIntroductionMessageDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderIntroductionMessageDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/ip_addr_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/ip_addr_skyencoder.go new file mode 100644 index 00000000..21ca8c30 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/ip_addr_skyencoder.go @@ -0,0 +1,93 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package daemon + +import "github.com/SkycoinProject/skycoin/src/cipher/encoder" + +// encodeSizeIPAddr computes the size of an encoded object of type IPAddr +func encodeSizeIPAddr(obj *IPAddr) uint64 { + i0 := uint64(0) + + // obj.IP + i0 += 4 + + // obj.Port + i0 += 2 + + return i0 +} + +// encodeIPAddr encodes an object of type IPAddr to a buffer allocated to the exact size +// required to encode the object. +func encodeIPAddr(obj *IPAddr) ([]byte, error) { + n := encodeSizeIPAddr(obj) + buf := make([]byte, n) + + if err := encodeIPAddrToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeIPAddrToBuffer encodes an object of type IPAddr to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeIPAddrToBuffer(buf []byte, obj *IPAddr) error { + if uint64(len(buf)) < encodeSizeIPAddr(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.IP + e.Uint32(obj.IP) + + // obj.Port + e.Uint16(obj.Port) + + return nil +} + +// decodeIPAddr decodes an object of type IPAddr from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeIPAddr(buf []byte, obj *IPAddr) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.IP + i, err := d.Uint32() + if err != nil { + return 0, err + } + obj.IP = i + } + + { + // obj.Port + i, err := d.Uint16() + if err != nil { + return 0, err + } + obj.Port = i + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeIPAddrExact decodes an object of type IPAddr from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeIPAddrExact(buf []byte, obj *IPAddr) error { + if n, err := decodeIPAddr(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/ip_addr_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/ip_addr_skyencoder_test.go new file mode 100644 index 00000000..6988eac2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/ip_addr_skyencoder_test.go @@ -0,0 +1,421 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package daemon + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +func newEmptyIPAddrForEncodeTest() *IPAddr { + var obj IPAddr + return &obj +} + +func newRandomIPAddrForEncodeTest(t *testing.T, rand *mathrand.Rand) *IPAddr { + var obj IPAddr + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenIPAddrForEncodeTest(t *testing.T, rand *mathrand.Rand) *IPAddr { + var obj IPAddr + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilIPAddrForEncodeTest(t *testing.T, rand *mathrand.Rand) *IPAddr { + var obj IPAddr + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderIPAddr(t *testing.T, obj *IPAddr) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeIPAddr(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeIPAddr() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeIPAddr(obj) + if err != nil { + t.Fatalf("encodeIPAddr failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeIPAddr produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeIPAddr()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeIPAddrToBuffer(data3, obj); err != nil { + t.Fatalf("encodeIPAddrToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 IPAddr + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 IPAddr + if n, err := decodeIPAddr(data2, &obj3); err != nil { + t.Fatalf("decodeIPAddr failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeIPAddr bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeIPAddr()") + } + + // Decode, excess buffer + var obj4 IPAddr + n, err := decodeIPAddr(data3, &obj4) + if err != nil { + t.Fatalf("decodeIPAddr failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeIPAddr bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeIPAddr bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeIPAddr()") + } + + // DecodeExact + var obj5 IPAddr + if err := decodeIPAddrExact(data2, &obj5); err != nil { + t.Fatalf("decodeIPAddr failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeIPAddr()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeIPAddr(data4, &obj3); err != nil { + t.Fatalf("decodeIPAddr failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeIPAddr bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderIPAddr(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *IPAddr + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptyIPAddrForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomIPAddrForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenIPAddrForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilIPAddrForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderIPAddr(t, tc.obj) + }) + } +} + +func decodeIPAddrExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj IPAddr + if _, err := decodeIPAddr(buf, &obj); err == nil { + t.Fatal("decodeIPAddr: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeIPAddr: expected error %q, got %q", expectedErr, err) + } +} + +func decodeIPAddrExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj IPAddr + if err := decodeIPAddrExact(buf, &obj); err == nil { + t.Fatal("decodeIPAddrExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeIPAddrExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderIPAddrDecodeErrors(t *testing.T, k int, tag string, obj *IPAddr) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeIPAddr(obj) + buf, err := encodeIPAddr(obj) + if err != nil { + t.Fatalf("encodeIPAddr failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeIPAddrExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeIPAddrExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeIPAddrExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeIPAddrExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeIPAddrExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderIPAddrDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptyIPAddrForEncodeTest() + fullObj := newRandomIPAddrForEncodeTest(t, rand) + testSkyencoderIPAddrDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderIPAddrDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/messages.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/messages.go new file mode 100644 index 00000000..77bde5b3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/messages.go @@ -0,0 +1,1390 @@ +package daemon + +import ( + "encoding/binary" + "errors" + "fmt" + "net" + "strings" + + "github.com/sirupsen/logrus" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/daemon/gnet" + "github.com/SkycoinProject/skycoin/src/daemon/pex" + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/util/iputil" + "github.com/SkycoinProject/skycoin/src/util/useragent" +) + +// Message represent a packet to be serialized over the network by +// the gnet encoder. +// They must implement the gnet.Message interface +// All concurrent daemon write operations are synchronized by the daemon's +// DaemonLoop(). +// Message do this by caching the gnet.MessageContext received in Handle() +// and placing itself on the messageEvent channel. +// When the message is retrieved from the messageEvent channel, its process() +// method is called. + +// MessageConfig config contains a gnet.Message's 4byte prefix and a +// reference interface +type MessageConfig struct { + Prefix gnet.MessagePrefix + Message interface{} +} + +// NewMessageConfig creates message config +func NewMessageConfig(prefix string, m interface{}) MessageConfig { + return MessageConfig{ + Message: m, + Prefix: gnet.MessagePrefixFromString(prefix), + } +} + +//go:generate skyencoder -unexported -struct IntroductionMessage +//go:generate skyencoder -unexported -struct GivePeersMessage +//go:generate skyencoder -unexported -struct GetBlocksMessage +//go:generate skyencoder -unexported -struct GiveBlocksMessage +//go:generate skyencoder -unexported -struct AnnounceBlocksMessage +//go:generate skyencoder -unexported -struct GetTxnsMessage +//go:generate skyencoder -unexported -struct GiveTxnsMessage +//go:generate skyencoder -unexported -struct AnnounceTxnsMessage +//go:generate skyencoder -unexported -struct DisconnectMessage +//go:generate skyencoder -unexported -struct IPAddr +//go:generate skyencoder -unexported -output-path . -package daemon -struct SignedBlock github.com/SkycoinProject/skycoin/src/coin +//go:generate skyencoder -unexported -output-path . -package daemon -struct Transaction github.com/SkycoinProject/skycoin/src/coin + +// Creates and populates the message configs +func getMessageConfigs() []MessageConfig { + return []MessageConfig{ + NewMessageConfig("INTR", IntroductionMessage{}), + NewMessageConfig("GETP", GetPeersMessage{}), + NewMessageConfig("GIVP", GivePeersMessage{}), + NewMessageConfig("PING", PingMessage{}), + NewMessageConfig("PONG", PongMessage{}), + NewMessageConfig("GETB", GetBlocksMessage{}), + NewMessageConfig("GIVB", GiveBlocksMessage{}), + NewMessageConfig("ANNB", AnnounceBlocksMessage{}), + NewMessageConfig("GETT", GetTxnsMessage{}), + NewMessageConfig("GIVT", GiveTxnsMessage{}), + NewMessageConfig("ANNT", AnnounceTxnsMessage{}), + NewMessageConfig("DISC", DisconnectMessage{}), + } +} + +// MessagesConfig slice of MessageConfig +type MessagesConfig struct { + // Message ID prefices + Messages []MessageConfig +} + +// NewMessagesConfig creates messages config +func NewMessagesConfig() MessagesConfig { + return MessagesConfig{ + Messages: getMessageConfigs(), + } +} + +// Register registers our Messages with gnet +func (msc *MessagesConfig) Register() { + for _, mc := range msc.Messages { + gnet.RegisterMessage(mc.Prefix, mc.Message) + } + gnet.VerifyMessages() +} + +// Messages messages struct +type Messages struct { + Config MessagesConfig +} + +// NewMessages creates Messages +func NewMessages(c MessagesConfig) *Messages { + return &Messages{ + Config: c, + } +} + +// IPAddr compact representation of IP:Port +type IPAddr struct { + IP uint32 + Port uint16 +} + +// NewIPAddr returns an IPAddr from an ip:port string. +func NewIPAddr(addr string) (ipaddr IPAddr, err error) { + ips, port, err := iputil.SplitAddr(addr) + if err != nil { + return + } + + // TODO -- support ipv6 + ipb := net.ParseIP(ips).To4() + if ipb == nil { + err = errors.New("Ignoring IPv6 address") + return + } + + ip := binary.BigEndian.Uint32(ipb) + ipaddr.IP = ip + ipaddr.Port = port + return +} + +// String returns IPAddr as "ip:port" +func (ipa IPAddr) String() string { + ipb := make([]byte, 4) + binary.BigEndian.PutUint32(ipb, ipa.IP) + return fmt.Sprintf("%s:%d", net.IP(ipb).String(), ipa.Port) +} + +// asyncMessage messages that perform an action when received must implement this interface. +// process() is called after the message is pulled off of messageEvent channel. +// Messages should place themselves on the messageEvent channel in their +// Handle() method required by gnet. +type asyncMessage interface { + process(d daemoner) +} + +// GetPeersMessage sent to request peers +type GetPeersMessage struct { + addr string `enc:"-"` +} + +// NewGetPeersMessage creates GetPeersMessage +func NewGetPeersMessage() *GetPeersMessage { + return &GetPeersMessage{} +} + +// EncodeSize implements gnet.Serializer +func (gpm *GetPeersMessage) EncodeSize() uint64 { + return 0 +} + +// Encode implements gnet.Serializer +func (gpm *GetPeersMessage) Encode(buf []byte) error { + return nil +} + +// Decode implements gnet.Serializer +func (gpm *GetPeersMessage) Decode(buf []byte) (uint64, error) { + return 0, nil +} + +// Handle handles message +func (gpm *GetPeersMessage) Handle(mc *gnet.MessageContext, daemon interface{}) error { + gpm.addr = mc.Addr + return daemon.(daemoner).recordMessageEvent(gpm, mc) +} + +// process Notifies the Pex instance that peers were requested +func (gpm *GetPeersMessage) process(d daemoner) { + if d.pexConfig().Disabled { + return + } + + if err := d.sendRandomPeers(gpm.addr); err != nil { + logger.WithField("addr", gpm.addr).WithError(err).Error("SendRandomPeers failed") + } +} + +// GivePeersMessage sent in response to GetPeersMessage +type GivePeersMessage struct { + Peers []IPAddr `enc:",maxlen=512"` + c *gnet.MessageContext `enc:"-"` +} + +// NewGivePeersMessage []*pex.Peer is converted to []IPAddr for binary transmission +// If the size of the message would exceed maxMsgLength, the IPAddr slice is truncated. +func NewGivePeersMessage(peers []pex.Peer, maxMsgLength uint64) *GivePeersMessage { + if len(peers) > 512 { + peers = peers[:512] + } + + ipaddrs := make([]IPAddr, 0, len(peers)) + for _, ps := range peers { + ipaddr, err := NewIPAddr(ps.Addr) + if err != nil { + logger.WithError(err).WithField("addr", ps.Addr).Warning("GivePeersMessage skipping invalid address") + continue + } + ipaddrs = append(ipaddrs, ipaddr) + } + + m := &GivePeersMessage{ + Peers: ipaddrs, + } + truncateGivePeersMessage(m, maxMsgLength) + return m +} + +// truncateGivePeersMessage truncates the blocks in GivePeersMessage to fit inside of MaxOutgoingMessageLength +func truncateGivePeersMessage(m *GivePeersMessage, maxMsgLength uint64) { + // The message length will include a 4 byte message type prefix. + // Panic if the prefix can't fit, otherwise we can't adjust the uint64 safely + if maxMsgLength < 4 { + logger.Panic("maxMsgLength must be >= 4") + } + + maxMsgLength -= 4 + + // Measure the current message size, if it fits, return + n := m.EncodeSize() + if n <= maxMsgLength { + return + } + + // Measure the size of an empty message + var mm GivePeersMessage + size := mm.EncodeSize() + + // Measure the size of the peers, advancing the slice index until it reaches capacity + index := -1 + for i, ip := range m.Peers { + x := encodeSizeIPAddr(&ip) + if size+x > maxMsgLength { + break + } + size += x + index = i + } + + m.Peers = m.Peers[:index+1] + + if len(m.Peers) == 0 { + logger.Critical().Error("truncateGivePeersMessage truncated peers to an empty slice") + } +} + +// EncodeSize implements gnet.Serializer +func (gpm *GivePeersMessage) EncodeSize() uint64 { + return encodeSizeGivePeersMessage(gpm) +} + +// Encode implements gnet.Serializer +func (gpm *GivePeersMessage) Encode(buf []byte) error { + return encodeGivePeersMessageToBuffer(buf, gpm) +} + +// Decode implements gnet.Serializer +func (gpm *GivePeersMessage) Decode(buf []byte) (uint64, error) { + return decodeGivePeersMessage(buf, gpm) +} + +// GetPeers is required by the pex.GivePeersMessage interface. +// It returns the peers contained in the message as an array of "ip:port" +// strings. +func (gpm *GivePeersMessage) GetPeers() []string { + peers := make([]string, len(gpm.Peers)) + for i, ipaddr := range gpm.Peers { + peers[i] = ipaddr.String() + } + return peers +} + +// Handle handle message +func (gpm *GivePeersMessage) Handle(mc *gnet.MessageContext, daemon interface{}) error { + gpm.c = mc + return daemon.(daemoner).recordMessageEvent(gpm, mc) +} + +// process Notifies the Pex instance that peers were received +func (gpm *GivePeersMessage) process(d daemoner) { + if d.pexConfig().Disabled { + return + } + + peers := gpm.GetPeers() + + if len(peers) == 0 { + return + } + + // Cap the number of peers printed in the log to prevent log spam abuse + peersToFmt := peers + if len(peersToFmt) > 30 { + peersToFmt = peersToFmt[:30] + } + peersStr := strings.Join(peersToFmt, ", ") + if len(peers) != len(peersToFmt) { + peersStr += fmt.Sprintf(" and %d more", len(peers)-len(peersToFmt)) + } + + logger.WithFields(logrus.Fields{ + "addr": gpm.c.Addr, + "gnetID": gpm.c.ConnID, + "peers": peersStr, + "count": len(peers), + }).Debug("Received peers via PEX") + + d.addPeers(peers) +} + +// IntroductionMessage is sent on first connect by both parties +type IntroductionMessage struct { + c *gnet.MessageContext `enc:"-"` + UserAgent useragent.Data `enc:"-"` + UnconfirmedVerifyTxn params.VerifyTxn `enc:"-"` + GenesisHash cipher.SHA256 `enc:"-"` + + // Mirror is a random value generated on client startup that is used to identify self-connections + Mirror uint32 + // ListenPort is the port that this client is listening on + ListenPort uint16 + // Protocol version + ProtocolVersion int32 + + // Extra is extra bytes added to the struct to accommodate multiple versions of this packet. + // Currently it contains the blockchain pubkey and user agent but will accept a client that does not provide it. + // If any of this data is provided, it must include a valid blockchain pubkey and a valid user agent string (maxlen=256). + // Contents of extra: + // ExtraByte uint32 // length prefix of []byte + // Pubkey cipher.Pubkey // blockchain pubkey + // BurnFactor uint32 // burn factor for announced txns + // MaxTxnSize uint32 // max txn size for announced txns + // MaxDropletPrecision uint8 // maximum number of decimal places for announced txns + // UserAgent string `enc:",maxlen=256"` + // GenesisHash cipher.SHA256 // genesis block hash + Extra []byte `enc:",omitempty"` +} + +// NewIntroductionMessage creates introduction message +func NewIntroductionMessage(mirror uint32, version int32, port uint16, pubkey cipher.PubKey, userAgent string, verifyParams params.VerifyTxn, genesisHash cipher.SHA256) *IntroductionMessage { + return &IntroductionMessage{ + Mirror: mirror, + ProtocolVersion: version, + ListenPort: port, + Extra: newIntroductionMessageExtra(pubkey, userAgent, verifyParams, genesisHash), + } +} + +func newIntroductionMessageExtra(pubkey cipher.PubKey, userAgent string, verifyParams params.VerifyTxn, genesisHash cipher.SHA256) []byte { + if len(userAgent) > useragent.MaxLen { + logger.WithFields(logrus.Fields{ + "userAgent": userAgent, + "maxLen": useragent.MaxLen, + }).Panic("user agent exceeds max len") + } + if userAgent == "" { + logger.Panic("user agent is required") + } + useragent.MustParse(userAgent) + + if err := verifyParams.Validate(); err != nil { + logger.Panic(err) + } + + userAgentSerialized := encoder.SerializeString(userAgent) + verifyParamsSerialized := encoder.Serialize(verifyParams) + + extra := make([]byte, len(pubkey)+len(userAgentSerialized)+len(verifyParamsSerialized)+len(genesisHash)) + + copy(extra[:len(pubkey)], pubkey[:]) + i := len(pubkey) + copy(extra[i:], verifyParamsSerialized) + i += len(verifyParamsSerialized) + copy(extra[i:], userAgentSerialized) + i += len(userAgentSerialized) + copy(extra[i:i+len(genesisHash)], genesisHash[:]) + + return extra +} + +// EncodeSize implements gnet.Serializer +func (intro *IntroductionMessage) EncodeSize() uint64 { + return encodeSizeIntroductionMessage(intro) +} + +// Encode implements gnet.Serializer +func (intro *IntroductionMessage) Encode(buf []byte) error { + return encodeIntroductionMessageToBuffer(buf, intro) +} + +// Decode implements gnet.Serializer +func (intro *IntroductionMessage) Decode(buf []byte) (uint64, error) { + return decodeIntroductionMessage(buf, intro) +} + +// Handle records message event in daemon +func (intro *IntroductionMessage) Handle(mc *gnet.MessageContext, daemon interface{}) error { + intro.c = mc + return daemon.(daemoner).recordMessageEvent(intro, mc) +} + +// process an event queued by Handle() +func (intro *IntroductionMessage) process(d daemoner) { + addr := intro.c.Addr + + fields := logrus.Fields{ + "addr": addr, + "gnetID": intro.c.ConnID, + "listenPort": intro.ListenPort, + } + + logger.WithFields(fields).Debug("IntroductionMessage.process") + + if err := intro.Verify(d.DaemonConfig(), logrus.Fields{ + "addr": addr, + "gnetID": intro.c.ConnID, + }); err != nil { + if err := d.Disconnect(addr, err); err != nil { + logger.WithError(err).WithFields(fields).Warning("Disconnect") + } + return + } + + if _, err := d.connectionIntroduced(addr, intro.c.ConnID, intro); err != nil { + logger.WithError(err).WithFields(fields).Warning("connectionIntroduced failed") + var reason gnet.DisconnectReason + switch err { + // It is hypothetically possible that a message would get processed after + // a disconnect event for a given connection. + // In this case, drop the packet. + // Do not perform a disconnect, since this would operate on the new connection. + // This should be prevented by an earlier check in daemon.onMessageEvent() + case ErrConnectionGnetIDMismatch, ErrConnectionStateNotConnected, ErrConnectionAlreadyIntroduced: + logger.Critical().WithError(err).WithFields(fields).Warning("IntroductionMessage.process connection state out of order") + return + case ErrConnectionNotExist: + return + case ErrConnectionIPMirrorExists: + reason = ErrDisconnectConnectedTwice + case pex.ErrPeerlistFull: + reason = ErrDisconnectPeerlistFull + // Send more peers before disconnecting + logger.WithFields(fields).Debug("Sending peers before disconnecting due to peer list full") + if err := d.sendRandomPeers(addr); err != nil { + logger.WithError(err).WithFields(fields).Warning("sendRandomPeers failed") + } + default: + reason = ErrDisconnectUnexpectedError + } + + if err := d.Disconnect(addr, reason); err != nil { + logger.WithError(err).WithFields(fields).Warning("Disconnect") + } + + return + } + + // Request blocks immediately after they're confirmed + if err := d.requestBlocksFromAddr(addr); err != nil { + logger.WithError(err).WithFields(fields).Warning("requestBlocksFromAddr") + } else { + logger.WithFields(fields).Debug("Requested blocks") + } + + // Announce unconfirmed txns + if err := d.announceAllValidTxns(); err != nil { + logger.WithError(err).Warning("announceAllValidTxns failed") + } +} + +// Verify checks if the introduction message is valid returning the appropriate error +func (intro *IntroductionMessage) Verify(dc DaemonConfig, logFields logrus.Fields) error { + // Disconnect if this is a self connection (we have the same mirror value) + if intro.Mirror == dc.Mirror { + logger.WithFields(logFields).WithField("mirror", intro.Mirror).Info("Remote mirror value matches ours") + return ErrDisconnectSelf + } + + // Disconnect if peer version is not within the supported range + if intro.ProtocolVersion < dc.MinProtocolVersion { + logger.WithFields(logFields).WithFields(logrus.Fields{ + "protocolVersion": intro.ProtocolVersion, + "minProtocolVersion": dc.MinProtocolVersion, + }).Info("protocol version below minimum supported protocol version") + return ErrDisconnectVersionNotSupported + } + + logger.WithFields(logFields).WithField("protocolVersion", intro.ProtocolVersion).Debug("Peer protocol version accepted") + + // v24 does not send blockchain pubkey or user agent + // v25 sends blockchain pubkey and user agent + // v24 and v25 check the blockchain pubkey and user agent, would accept message with no Pubkey and user agent + // v26 would check the blockchain pubkey and reject if not matched or not provided, and parses a user agent + // v26 adds genesis hash + // v27 would require and check the genesis hash + extraLen := len(intro.Extra) + if extraLen == 0 { + logger.WithFields(logFields).Warning("Blockchain pubkey is not provided") + return ErrDisconnectBlockchainPubkeyNotProvided + } + + var bcPubKey cipher.PubKey + if extraLen < len(bcPubKey) { + logger.WithFields(logFields).Warning("Extra data length does not meet the minimum requirement") + return ErrDisconnectInvalidExtraData + } + copy(bcPubKey[:], intro.Extra[:len(bcPubKey)]) + + if dc.BlockchainPubkey != bcPubKey { + logger.WithFields(logFields).WithFields(logrus.Fields{ + "pubkey": bcPubKey.Hex(), + "daemonPubkey": dc.BlockchainPubkey.Hex(), + }).Warning("Blockchain pubkey does not match") + return ErrDisconnectBlockchainPubkeyNotMatched + } + + i := len(bcPubKey) + if extraLen < i+9 { + logger.WithFields(logFields).Warning("IntroductionMessage transaction verification parameters could not be deserialized: not enough data") + return ErrDisconnectInvalidExtraData + } + if err := encoder.DeserializeRawExact(intro.Extra[i:i+9], &intro.UnconfirmedVerifyTxn); err != nil { + // This should not occur due to the previous length check + logger.Critical().WithError(err).WithFields(logFields).Warning("unconfirmedVerifyTxn params could not be deserialized") + return ErrDisconnectInvalidExtraData + } + i += 9 + + if err := intro.UnconfirmedVerifyTxn.Validate(); err != nil { + logger.WithError(err).WithFields(logFields).WithFields(logrus.Fields{ + "burnFactor": intro.UnconfirmedVerifyTxn.BurnFactor, + "maxTransactionSize": intro.UnconfirmedVerifyTxn.MaxTransactionSize, + "maxDropletPrecision": intro.UnconfirmedVerifyTxn.MaxDropletPrecision, + }).Warning("Invalid unconfirmedVerifyTxn params") + switch err { + case params.ErrInvalidBurnFactor: + return ErrDisconnectInvalidBurnFactor + case params.ErrInvalidMaxTransactionSize: + return ErrDisconnectInvalidMaxTransactionSize + case params.ErrInvalidMaxDropletPrecision: + return ErrDisconnectInvalidMaxDropletPrecision + default: + return ErrDisconnectUnexpectedError + } + } + + userAgentSerialized := intro.Extra[i:] + userAgent, userAgentLen, err := encoder.DeserializeString(userAgentSerialized, useragent.MaxLen) + if err != nil { + logger.WithError(err).WithFields(logFields).Warning("Extra data user agent string could not be deserialized") + return ErrDisconnectInvalidExtraData + } + + intro.UserAgent, err = useragent.Parse(useragent.Sanitize(userAgent)) + if err != nil { + logger.WithError(err).WithFields(logFields).WithField("userAgent", userAgent).Warning("User agent is invalid") + return ErrDisconnectInvalidUserAgent + } + i += int(userAgentLen) + + remainingLen := extraLen - i + if remainingLen > 0 && remainingLen < len(intro.GenesisHash) { + logger.WithFields(logFields).Warning("Extra data genesis hash could not be deserialized: not enough data") + return ErrDisconnectInvalidExtraData + } + copy(intro.GenesisHash[:], intro.Extra[i:]) + + return nil +} + +// PingMessage Sent to keep a connection alive. A PongMessage is sent in reply. +type PingMessage struct { + c *gnet.MessageContext `enc:"-"` +} + +// EncodeSize implements gnet.Serializer +func (ping *PingMessage) EncodeSize() uint64 { + return 0 +} + +// Encode implements gnet.Serializer +func (ping *PingMessage) Encode(buf []byte) error { + return nil +} + +// Decode implements gnet.Serializer +func (ping *PingMessage) Decode(buf []byte) (uint64, error) { + return 0, nil +} + +// Handle implements the Messager interface +func (ping *PingMessage) Handle(mc *gnet.MessageContext, daemon interface{}) error { + ping.c = mc + return daemon.(daemoner).recordMessageEvent(ping, mc) +} + +// process Sends a PongMessage to the sender of PingMessage +func (ping *PingMessage) process(d daemoner) { + fields := logrus.Fields{ + "addr": ping.c.Addr, + "gnetID": ping.c.ConnID, + } + + if d.DaemonConfig().LogPings { + logger.WithFields(fields).Debug("Replying to ping") + } + if err := d.sendMessage(ping.c.Addr, &PongMessage{}); err != nil { + logger.WithFields(fields).WithError(err).Error("Send PongMessage failed") + } +} + +// PongMessage Sent in reply to a PingMessage. No action is taken when this is received. +type PongMessage struct { +} + +// EncodeSize implements gnet.Serializer +func (pong *PongMessage) EncodeSize() uint64 { + return 0 +} + +// Encode implements gnet.Serializer +func (pong *PongMessage) Encode(buf []byte) error { + return nil +} + +// Decode implements gnet.Serializer +func (pong *PongMessage) Decode(buf []byte) (uint64, error) { + return 0, nil +} + +// Handle handles message +func (pong *PongMessage) Handle(mc *gnet.MessageContext, daemon interface{}) error { + // There is nothing to do; gnet updates Connection.LastMessage internally + // when this is received + if daemon.(daemoner).DaemonConfig().LogPings { + logger.WithFields(logrus.Fields{ + "addr": mc.Addr, + "gnetID": mc.ConnID, + }).Debug("Received pong") + } + return nil +} + +// DisconnectMessage sent to a peer before disconnecting, indicating the reason for disconnect +type DisconnectMessage struct { + c *gnet.MessageContext `enc:"-"` + reason gnet.DisconnectReason `enc:"-"` + + // Error code + ReasonCode uint16 + + // Reserved for future use + Reserved []byte +} + +// NewDisconnectMessage creates message sent to reject previously received message +func NewDisconnectMessage(reason gnet.DisconnectReason) *DisconnectMessage { + return &DisconnectMessage{ + reason: reason, + ReasonCode: DisconnectReasonToCode(reason), + Reserved: nil, + } +} + +// EncodeSize implements gnet.Serializer +func (dm *DisconnectMessage) EncodeSize() uint64 { + return encodeSizeDisconnectMessage(dm) +} + +// Encode implements gnet.Serializer +func (dm *DisconnectMessage) Encode(buf []byte) error { + return encodeDisconnectMessageToBuffer(buf, dm) +} + +// Decode implements gnet.Serializer +func (dm *DisconnectMessage) Decode(buf []byte) (uint64, error) { + return decodeDisconnectMessage(buf, dm) +} + +// Handle an event queued by Handle() +func (dm *DisconnectMessage) Handle(mc *gnet.MessageContext, daemon interface{}) error { + dm.c = mc + return daemon.(daemoner).recordMessageEvent(dm, mc) +} + +// process disconnect message by reflexively disconnecting +func (dm *DisconnectMessage) process(d daemoner) { + logger.WithFields(logrus.Fields{ + "addr": dm.c.Addr, + "gnetID": dm.c.ConnID, + "code": dm.ReasonCode, + "reason": DisconnectCodeToReason(dm.ReasonCode), + }).Infof("DisconnectMessage received") + + if err := d.disconnectNow(dm.c.Addr, ErrDisconnectReceivedDisconnect); err != nil { + logger.WithError(err).WithField("addr", dm.c.Addr).Warning("disconnectNow") + } +} + +// GetBlocksMessage sent to request blocks since LastBlock +type GetBlocksMessage struct { + LastBlock uint64 + RequestedBlocks uint64 + c *gnet.MessageContext `enc:"-"` +} + +// NewGetBlocksMessage creates GetBlocksMessage +func NewGetBlocksMessage(lastBlock, requestedBlocks uint64) *GetBlocksMessage { + return &GetBlocksMessage{ + LastBlock: lastBlock, + RequestedBlocks: requestedBlocks, + } +} + +// EncodeSize implements gnet.Serializer +func (gbm *GetBlocksMessage) EncodeSize() uint64 { + return encodeSizeGetBlocksMessage(gbm) +} + +// Encode implements gnet.Serializer +func (gbm *GetBlocksMessage) Encode(buf []byte) error { + return encodeGetBlocksMessageToBuffer(buf, gbm) +} + +// Decode implements gnet.Serializer +func (gbm *GetBlocksMessage) Decode(buf []byte) (uint64, error) { + return decodeGetBlocksMessage(buf, gbm) +} + +// Handle handles message +func (gbm *GetBlocksMessage) Handle(mc *gnet.MessageContext, daemon interface{}) error { + gbm.c = mc + return daemon.(daemoner).recordMessageEvent(gbm, mc) +} + +// process should send number to be requested, with request +func (gbm *GetBlocksMessage) process(d daemoner) { + dc := d.DaemonConfig() + if dc.DisableNetworking { + return + } + + fields := logrus.Fields{ + "addr": gbm.c.Addr, + "gnetID": gbm.c.ConnID, + } + + // Record this as this peer's highest block + d.recordPeerHeight(gbm.c.Addr, gbm.c.ConnID, gbm.LastBlock) + + // Cap the number of requested blocks (TODO - necessary since we have size limits enforced later?) + requestedBlocks := gbm.RequestedBlocks + if requestedBlocks > dc.MaxGetBlocksResponseCount { + logger.WithFields(logrus.Fields{ + "requestedBlocks": requestedBlocks, + "maxRequestedBlocks": dc.MaxGetBlocksResponseCount, + }).WithFields(fields).Debug("GetBlocksMessage.RequestedBlocks value exceeds configured limit, reducing") + requestedBlocks = dc.MaxGetBlocksResponseCount + } + + // Fetch and return signed blocks since LastBlock + blocks, err := d.getSignedBlocksSince(gbm.LastBlock, requestedBlocks) + if err != nil { + logger.WithFields(fields).WithError(err).Error("getSignedBlocksSince failed") + return + } + + if len(blocks) == 0 { + return + } + + logger.WithFields(fields).Debugf("GetBlocksMessage: replying with %d blocks after block %d", len(blocks), gbm.LastBlock) + + m := NewGiveBlocksMessage(blocks, dc.MaxOutgoingMessageLength) + if len(m.Blocks) != len(blocks) { + logger.WithField("startBlockSeq", blocks[0].Head.BkSeq).WithFields(fields).Warningf("NewGiveBlocksMessage truncated %d blocks to %d blocks", len(blocks), len(m.Blocks)) + } + + if err := d.sendMessage(gbm.c.Addr, m); err != nil { + logger.WithFields(fields).WithError(err).Error("Send GiveBlocksMessage failed") + } +} + +// GiveBlocksMessage sent in response to GetBlocksMessage, or unsolicited +type GiveBlocksMessage struct { + Blocks []coin.SignedBlock `enc:",maxlen=128"` + c *gnet.MessageContext `enc:"-"` +} + +// NewGiveBlocksMessage creates GiveBlocksMessage. +// If the size of message would exceed maxMsgLength, the block slice is truncated. +func NewGiveBlocksMessage(blocks []coin.SignedBlock, maxMsgLength uint64) *GiveBlocksMessage { + if len(blocks) > 128 { + blocks = blocks[:128] + } + m := &GiveBlocksMessage{ + Blocks: blocks, + } + truncateGiveBlocksMessage(m, maxMsgLength) + return m +} + +// truncateGiveBlocksMessage truncates the blocks in GiveBlocksMessage to fit inside of MaxOutgoingMessageLength +func truncateGiveBlocksMessage(m *GiveBlocksMessage, maxMsgLength uint64) { + // The message length will include a 4 byte message type prefix. + // Panic if the prefix can't fit, otherwise we can't adjust the uint64 safely + if maxMsgLength < 4 { + logger.Panic("maxMsgLength must be >= 4") + } + + maxMsgLength -= 4 + + // Measure the current message size, if it fits, return + n := m.EncodeSize() + if n <= maxMsgLength { + return + } + + // Measure the size of an empty message + var mm GiveBlocksMessage + size := mm.EncodeSize() + + // Measure the size of the blocks, advancing the slice index until it reaches capacity + index := -1 + for i, b := range m.Blocks { + x := encodeSizeSignedBlock(&b) + if size+x > maxMsgLength { + break + } + size += x + index = i + } + + m.Blocks = m.Blocks[:index+1] + + if len(m.Blocks) == 0 { + logger.Critical().Error("truncateGiveBlocksMessage truncated blocks to an empty slice") + } +} + +// EncodeSize implements gnet.Serializer +func (m *GiveBlocksMessage) EncodeSize() uint64 { + return encodeSizeGiveBlocksMessage(m) +} + +// Encode implements gnet.Serializer +func (m *GiveBlocksMessage) Encode(buf []byte) error { + return encodeGiveBlocksMessageToBuffer(buf, m) +} + +// Decode implements gnet.Serializer +func (m *GiveBlocksMessage) Decode(buf []byte) (uint64, error) { + return decodeGiveBlocksMessage(buf, m) +} + +// Handle handle message +func (m *GiveBlocksMessage) Handle(mc *gnet.MessageContext, daemon interface{}) error { + m.c = mc + return daemon.(daemoner).recordMessageEvent(m, mc) +} + +// process process message +func (m *GiveBlocksMessage) process(d daemoner) { + if d.DaemonConfig().DisableNetworking { + logger.Critical().Info("Visor disabled, ignoring GiveBlocksMessage") + return + } + + // These DB queries are not performed in a transaction for performance reasons. + // It is not necessary that the blocks be executed together in a single transaction. + + processed := 0 + maxSeq, ok, err := d.headBkSeq() + if err != nil { + logger.WithError(err).Error("d.headBkSeq failed") + return + } + if !ok { + logger.Error("No HeadBkSeq found, cannot execute blocks") + return + } + + for _, b := range m.Blocks { + // To minimize waste when receiving multiple responses from peers + // we only break out of the loop if the block itself is invalid. + // E.g. if we request 20 blocks since 0 from 2 peers, and one peer + // replies with 15 and the other 20, if we did not do this check and + // the reply with 15 was received first, we would toss the one with 20 + // even though we could process it at the time. + if b.Seq() <= maxSeq { + continue + } + + err := d.executeSignedBlock(b) + if err == nil { + logger.Critical().WithField("seq", b.Block.Head.BkSeq).Info("Added new block") + processed++ + } else { + logger.Critical().WithError(err).WithField("seq", b.Block.Head.BkSeq).Error("Failed to execute received block") + // Blocks must be received in order, so if one fails its assumed + // the rest are failing + break + } + } + if processed == 0 { + return + } + + headBkSeq, ok, err := d.headBkSeq() + if err != nil { + logger.WithError(err).Error("d.headBkSeq failed") + return + } + if !ok { + logger.Error("No HeadBkSeq found after executing blocks, will not announce blocks") + return + } + + if headBkSeq < maxSeq { + logger.Critical().Warning("HeadBkSeq decreased after executing blocks") + } else if headBkSeq-maxSeq != uint64(processed) { + logger.Critical().Warning("HeadBkSeq increased by %d but we processed %s blocks", headBkSeq-maxSeq, processed) + } + + // Announce our new blocks to peers + abm := NewAnnounceBlocksMessage(headBkSeq) + if _, err := d.broadcastMessage(abm); err != nil { + logger.WithError(err).Warning("Broadcast AnnounceBlocksMessage failed") + } + + // Request more blocks + gbm := NewGetBlocksMessage(headBkSeq, d.DaemonConfig().GetBlocksRequestCount) + if _, err := d.broadcastMessage(gbm); err != nil { + logger.WithError(err).Warning("Broadcast GetBlocksMessage failed") + } +} + +// AnnounceBlocksMessage tells a peer our highest known BkSeq. The receiving peer can choose +// to send GetBlocksMessage in response +type AnnounceBlocksMessage struct { + MaxBkSeq uint64 + c *gnet.MessageContext `enc:"-"` +} + +// NewAnnounceBlocksMessage creates message +func NewAnnounceBlocksMessage(seq uint64) *AnnounceBlocksMessage { + return &AnnounceBlocksMessage{ + MaxBkSeq: seq, + } +} + +// EncodeSize implements gnet.Serializer +func (abm *AnnounceBlocksMessage) EncodeSize() uint64 { + return encodeSizeAnnounceBlocksMessage(abm) +} + +// Encode implements gnet.Serializer +func (abm *AnnounceBlocksMessage) Encode(buf []byte) error { + return encodeAnnounceBlocksMessageToBuffer(buf, abm) +} + +// Decode implements gnet.Serializer +func (abm *AnnounceBlocksMessage) Decode(buf []byte) (uint64, error) { + return decodeAnnounceBlocksMessage(buf, abm) +} + +// Handle handles message +func (abm *AnnounceBlocksMessage) Handle(mc *gnet.MessageContext, daemon interface{}) error { + abm.c = mc + return daemon.(daemoner).recordMessageEvent(abm, mc) +} + +// process process message +func (abm *AnnounceBlocksMessage) process(d daemoner) { + if d.DaemonConfig().DisableNetworking { + return + } + + fields := logrus.Fields{ + "addr": abm.c.Addr, + "gnetID": abm.c.ConnID, + } + + headBkSeq, ok, err := d.headBkSeq() + if err != nil { + logger.WithError(err).Error("AnnounceBlocksMessage d.headBkSeq failed") + return + } + if !ok { + logger.Error("AnnounceBlocksMessage no head block, cannot process AnnounceBlocksMessage") + return + } + + if headBkSeq >= abm.MaxBkSeq { + return + } + + // TODO: Should this be block get request for current sequence? + // If client is not caught up, won't attempt to get block + m := NewGetBlocksMessage(headBkSeq, d.DaemonConfig().GetBlocksRequestCount) + if err := d.sendMessage(abm.c.Addr, m); err != nil { + logger.WithError(err).WithFields(fields).Error("Send GetBlocksMessage") + } +} + +// SendingTxnsMessage send transaction message interface +type SendingTxnsMessage interface { + GetFiltered() []cipher.SHA256 +} + +// AnnounceTxnsMessage tells a peer that we have these transactions +type AnnounceTxnsMessage struct { + Transactions []cipher.SHA256 `enc:",maxlen=256"` + c *gnet.MessageContext `enc:"-"` +} + +// NewAnnounceTxnsMessage creates announce txns message. +// If the size of the message would exceed maxMsgLength, the hashes slice is truncated. +func NewAnnounceTxnsMessage(txns []cipher.SHA256, maxMsgLength uint64) *AnnounceTxnsMessage { + if len(txns) > 256 { + txns = txns[:256] + } + m := &AnnounceTxnsMessage{ + Transactions: txns, + } + hashes := truncateAnnounceTxnsHashes(m, maxMsgLength) + m.Transactions = hashes + return m +} + +// truncateAnnounceTxnsHashes truncates the hashes in AnnounceTxnsMessage to fit inside of MaxOutgoingMessageLength +func truncateAnnounceTxnsHashes(m *AnnounceTxnsMessage, maxMsgLength uint64) []cipher.SHA256 { + // The message length will include a 4 byte message type prefix. + // Panic if the prefix can't fit, otherwise we can't adjust the uint64 safely + if maxMsgLength < 4 { + logger.Panic("maxMsgLength must be >= 4") + } + + maxMsgLength -= 4 + + // Measure the current message size, if it fits, return + n := m.EncodeSize() + if n <= maxMsgLength { + return m.Transactions + } + + // Measure the size of an empty message + var mm AnnounceTxnsMessage + size := mm.EncodeSize() + + if maxMsgLength < size { + logger.Panic("maxMsgLength must be <= 4 + sizeof(empty AnnounceTxnsMessage)") + } + + maxMsgLength -= size + + hashes := truncateSHA256Slice(m.Transactions, maxMsgLength) + + if len(hashes) == 0 { + logger.Critical().Error("truncateAnnounceTxnsHashes truncated hashes to an empty slice") + } + + return hashes +} + +func truncateSHA256Slice(hashes []cipher.SHA256, maxLength uint64) []cipher.SHA256 { + if len(hashes) == 0 { + return hashes + } + + size := len(hashes[0]) + + n := maxLength / uint64(size) + + if n > uint64(len(hashes)) { + return hashes + } + + return hashes[:n] +} + +// EncodeSize implements gnet.Serializer +func (atm *AnnounceTxnsMessage) EncodeSize() uint64 { + return encodeSizeAnnounceTxnsMessage(atm) +} + +// Encode implements gnet.Serializer +func (atm *AnnounceTxnsMessage) Encode(buf []byte) error { + return encodeAnnounceTxnsMessageToBuffer(buf, atm) +} + +// Decode implements gnet.Serializer +func (atm *AnnounceTxnsMessage) Decode(buf []byte) (uint64, error) { + return decodeAnnounceTxnsMessage(buf, atm) +} + +// GetFiltered returns txns +func (atm *AnnounceTxnsMessage) GetFiltered() []cipher.SHA256 { + return atm.Transactions +} + +// Handle handle message +func (atm *AnnounceTxnsMessage) Handle(mc *gnet.MessageContext, daemon interface{}) error { + atm.c = mc + return daemon.(daemoner).recordMessageEvent(atm, mc) +} + +// process process message +func (atm *AnnounceTxnsMessage) process(d daemoner) { + dc := d.DaemonConfig() + if dc.DisableNetworking { + return + } + + fields := logrus.Fields{ + "addr": atm.c.Addr, + "gnetID": atm.c.ConnID, + } + + unknown, err := d.filterKnownUnconfirmed(atm.Transactions) + if err != nil { + logger.WithError(err).Error("AnnounceTxnsMessage d.filterKnownUnconfirmed failed") + return + } + + if len(unknown) == 0 { + return + } + + m := NewGetTxnsMessage(unknown, dc.MaxOutgoingMessageLength) + if len(m.Transactions) != len(unknown) { + logger.Warningf("NewGetTxnsMessage truncated %d hashes to %d hashes", len(unknown), len(m.Transactions)) + } + + if err := d.sendMessage(atm.c.Addr, m); err != nil { + logger.WithFields(fields).WithError(err).Error("Send GetTxnsMessage failed") + } +} + +// GetTxnsMessage request transactions of given hash +type GetTxnsMessage struct { + Transactions []cipher.SHA256 `enc:",maxlen=256"` + c *gnet.MessageContext `enc:"-"` +} + +// NewGetTxnsMessage creates GetTxnsMessage. +// If the size of the message would exceed maxMsgLength, the hashes slice is truncated. +func NewGetTxnsMessage(txns []cipher.SHA256, maxMsgLength uint64) *GetTxnsMessage { + if len(txns) > 256 { + txns = txns[:256] + } + m := &GetTxnsMessage{ + Transactions: txns, + } + hashes := truncateGetTxnsHashes(m, maxMsgLength) + m.Transactions = hashes + return m +} + +// truncateGetTxnsHashes truncates the hashes in GetTxnsMessage to fit inside of MaxOutgoingMessageLength +func truncateGetTxnsHashes(m *GetTxnsMessage, maxMsgLength uint64) []cipher.SHA256 { + // The message length will include a 4 byte message type prefix. + // Panic if the prefix can't fit, otherwise we can't adjust the uint64 safely + if maxMsgLength < 4 { + logger.Panic("maxMsgLength must be >= 4") + } + + maxMsgLength -= 4 + + // Measure the current message size, if it fits, return + n := m.EncodeSize() + if n <= maxMsgLength { + return m.Transactions + } + + // Measure the size of an empty message + var mm GetTxnsMessage + size := mm.EncodeSize() + + if maxMsgLength < size { + logger.Panic("maxMsgLength must be <= 4 + sizeof(empty GetTxnsMessage)") + } + + maxMsgLength -= size + + hashes := truncateSHA256Slice(m.Transactions, maxMsgLength) + + if len(hashes) == 0 { + logger.Critical().Error("truncateGetTxnsHashes truncated hashes to an empty slice") + } + + return hashes +} + +// EncodeSize implements gnet.Serializer +func (gtm *GetTxnsMessage) EncodeSize() uint64 { + return encodeSizeGetTxnsMessage(gtm) +} + +// Encode implements gnet.Serializer +func (gtm *GetTxnsMessage) Encode(buf []byte) error { + return encodeGetTxnsMessageToBuffer(buf, gtm) +} + +// Decode implements gnet.Serializer +func (gtm *GetTxnsMessage) Decode(buf []byte) (uint64, error) { + return decodeGetTxnsMessage(buf, gtm) +} + +// Handle handle message +func (gtm *GetTxnsMessage) Handle(mc *gnet.MessageContext, daemon interface{}) error { + gtm.c = mc + return daemon.(daemoner).recordMessageEvent(gtm, mc) +} + +// process process message +func (gtm *GetTxnsMessage) process(d daemoner) { + dc := d.DaemonConfig() + if dc.DisableNetworking { + return + } + + fields := logrus.Fields{ + "addr": gtm.c.Addr, + "gnetID": gtm.c.ConnID, + } + + // Locate all txns from the unconfirmed pool + known, err := d.getKnownUnconfirmed(gtm.Transactions) + if err != nil { + logger.WithError(err).Error("GetTxnsMessage d.getKnownUnconfirmed failed") + return + } + if len(known) == 0 { + return + } + + // Reply to sender with GiveTxnsMessage + m := NewGiveTxnsMessage(known, dc.MaxOutgoingMessageLength) + if len(m.Transactions) != len(known) { + logger.Warningf("NewGiveTxnsMessage truncated %d hashes to %d hashes", len(known), len(m.Transactions)) + } + + if err := d.sendMessage(gtm.c.Addr, m); err != nil { + logger.WithError(err).WithFields(fields).Error("Send GiveTxnsMessage") + } +} + +// GiveTxnsMessage tells the transaction of given hashes +type GiveTxnsMessage struct { + Transactions []coin.Transaction `enc:",maxlen=256"` + c *gnet.MessageContext `enc:"-"` +} + +// NewGiveTxnsMessage creates GiveTxnsMessage. +// If the size of the message would exceed maxMsgLength, the transactions slice is truncated. +func NewGiveTxnsMessage(txns []coin.Transaction, maxMsgLength uint64) *GiveTxnsMessage { + if len(txns) > 256 { + txns = txns[:256] + } + m := &GiveTxnsMessage{ + Transactions: txns, + } + truncateGiveTxnsMessage(m, maxMsgLength) + return m +} + +// truncateGiveTxnsMessage truncates the transactions in GiveTxnsMessage to fit inside of MaxOutgoingMessageLength +func truncateGiveTxnsMessage(m *GiveTxnsMessage, maxMsgLength uint64) { + // The message length will include a 4 byte message type prefix. + // Panic if the prefix can't fit, otherwise we can't adjust the uint64 safely + if maxMsgLength < 4 { + logger.Panic("maxMsgLength must be >= 4") + } + + maxMsgLength -= 4 + + // Measure the current message size, if it fits, return + n := m.EncodeSize() + if n <= maxMsgLength { + return + } + + // Measure the size of an empty message + var mm GiveTxnsMessage + size := mm.EncodeSize() + + // Measure the size of the txns, advancing the slice index until it reaches capacity + index := -1 + for i, txn := range m.Transactions { + x := encodeSizeTransaction(&txn) + if size+x > maxMsgLength { + break + } + size += x + index = i + } + + m.Transactions = m.Transactions[:index+1] + + if len(m.Transactions) == 0 { + logger.Critical().Error("truncateGiveTxnsMessage truncated txns to an empty slice") + } +} + +// EncodeSize implements gnet.Serializer +func (gtm *GiveTxnsMessage) EncodeSize() uint64 { + return encodeSizeGiveTxnsMessage(gtm) +} + +// Encode implements gnet.Serializer +func (gtm *GiveTxnsMessage) Encode(buf []byte) error { + return encodeGiveTxnsMessageToBuffer(buf, gtm) +} + +// Decode implements gnet.Serializer +func (gtm *GiveTxnsMessage) Decode(buf []byte) (uint64, error) { + return decodeGiveTxnsMessage(buf, gtm) +} + +// GetFiltered returns transactions hashes +func (gtm *GiveTxnsMessage) GetFiltered() []cipher.SHA256 { + return coin.Transactions(gtm.Transactions).Hashes() +} + +// Handle handle message +func (gtm *GiveTxnsMessage) Handle(mc *gnet.MessageContext, daemon interface{}) error { + gtm.c = mc + return daemon.(daemoner).recordMessageEvent(gtm, mc) +} + +// process process message +func (gtm *GiveTxnsMessage) process(d daemoner) { + dc := d.DaemonConfig() + if dc.DisableNetworking { + return + } + + hashes := make([]cipher.SHA256, 0, len(gtm.Transactions)) + // Update unconfirmed pool with these transactions + for _, txn := range gtm.Transactions { + // Only announce transactions that are new to us, so that peers can't spam relays + // It is not necessary to inject all of the transactions inside a database transaction, + // since each is independent + known, softErr, err := d.injectTransaction(txn) + if err != nil { + logger.WithError(err).WithField("txid", txn.Hash().Hex()).Warning("Failed to record transaction") + continue + } else if softErr != nil { + logger.WithError(softErr).WithField("txid", txn.Hash().Hex()).Warning("Transaction soft violation") + // Allow soft txn violations to rebroadcast + } else if known { + logger.WithField("txid", txn.Hash().Hex()).Debug("Duplicate transaction") + continue + } + + hashes = append(hashes, txn.Hash()) + } + + if len(hashes) == 0 { + return + } + + // Announce these transactions to peers + m := NewAnnounceTxnsMessage(hashes, dc.MaxOutgoingMessageLength) + if len(m.Transactions) != len(hashes) { + logger.Warningf("NewAnnounceTxnsMessage truncated %d hashes to %d hashes", len(hashes), len(m.Transactions)) + } + + if ids, err := d.broadcastMessage(m); err != nil { + logger.WithError(err).Warning("Broadcast AnnounceTxnsMessage failed") + } else { + logger.Debugf("Announced %d transactions to %d peers", len(hashes), len(ids)) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/messages_benchmark_test.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/messages_benchmark_test.go new file mode 100644 index 00000000..0ef54e79 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/messages_benchmark_test.go @@ -0,0 +1,237 @@ +package daemon + +import ( + "testing" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" + "github.com/SkycoinProject/skycoin/src/coin" +) + +var getPeersMessageObj = GetPeersMessage{} + +func BenchmarkDeserializeRawGetPeersMessage(b *testing.B) { + byt := encoder.Serialize(getPeersMessageObj) + result := &GetPeersMessage{} + + b.ResetTimer() + for i := 0; i < b.N; i++ { + encoder.DeserializeRaw(byt, result) //nolint:errcheck + } +} + +func BenchmarkSerializeGetPeersMessage(b *testing.B) { + b.ResetTimer() + for i := 0; i < b.N; i++ { + encoder.Serialize(&getPeersMessageObj) + } +} + +var givePeersMessageObj = GivePeersMessage{ + Peers: []IPAddr{ + { + IP: 1234, + Port: 1234, + }, + { + IP: 5678, + Port: 5678, + }, + { + IP: 9876, + Port: 9876, + }, + }, +} + +func BenchmarkDeserializeRawGivePeersMessage(b *testing.B) { + byt := encoder.Serialize(givePeersMessageObj) + result := &GivePeersMessage{} + + b.ResetTimer() + for i := 0; i < b.N; i++ { + encoder.DeserializeRaw(byt, result) //nolint:errcheck + } +} + +func BenchmarkSerializeGivePeersMessage(b *testing.B) { + b.ResetTimer() + for i := 0; i < b.N; i++ { + encoder.Serialize(&givePeersMessageObj) + } +} + +var introPubKey = cipher.MustPubKeyFromHex("03cd7dfcd8c3452d1bb5d9d9e34dd95d6848cb9f66c2aad127b60578f4be7498f2") + +var introMessageObj = IntroductionMessage{ + Mirror: 1234, + ListenPort: 5678, + ProtocolVersion: 1, + Extra: introPubKey[:], +} + +func BenchmarkDeserializeRawIntroductionMessage(b *testing.B) { + byt := encoder.Serialize(introMessageObj) + result := &IntroductionMessage{} + + b.ResetTimer() + for i := 0; i < b.N; i++ { + encoder.DeserializeRaw(byt, result) //nolint:errcheck + } +} + +func BenchmarkSerializeIntroductionMessage(b *testing.B) { + b.ResetTimer() + for i := 0; i < b.N; i++ { + encoder.Serialize(&introMessageObj) + } +} + +var giveBlocksMessageObj = GiveBlocksMessage{ + Blocks: []coin.SignedBlock{ + { + Block: coin.Block{ + Body: coin.BlockBody{ + Transactions: []coin.Transaction{ + { + Sigs: make([]cipher.Sig, 3), + In: make([]cipher.SHA256, 3), + Out: make([]coin.TransactionOutput, 3), + }, + { + Sigs: make([]cipher.Sig, 3), + In: make([]cipher.SHA256, 3), + Out: make([]coin.TransactionOutput, 3), + }, + { + Sigs: make([]cipher.Sig, 3), + In: make([]cipher.SHA256, 3), + Out: make([]coin.TransactionOutput, 3), + }, + }, + }, + }, + }, + { + Block: coin.Block{ + Body: coin.BlockBody{ + Transactions: []coin.Transaction{ + { + Sigs: make([]cipher.Sig, 3), + In: make([]cipher.SHA256, 3), + Out: make([]coin.TransactionOutput, 3), + }, + { + Sigs: make([]cipher.Sig, 3), + In: make([]cipher.SHA256, 3), + Out: make([]coin.TransactionOutput, 3), + }, + { + Sigs: make([]cipher.Sig, 3), + In: make([]cipher.SHA256, 3), + Out: make([]coin.TransactionOutput, 3), + }, + }, + }, + }, + }, + { + Block: coin.Block{ + Body: coin.BlockBody{ + Transactions: []coin.Transaction{ + { + Sigs: make([]cipher.Sig, 3), + In: make([]cipher.SHA256, 3), + Out: make([]coin.TransactionOutput, 3), + }, + { + Sigs: make([]cipher.Sig, 3), + In: make([]cipher.SHA256, 3), + Out: make([]coin.TransactionOutput, 3), + }, + { + Sigs: make([]cipher.Sig, 3), + In: make([]cipher.SHA256, 3), + Out: make([]coin.TransactionOutput, 3), + }, + }, + }, + }, + }, + }, +} + +func BenchmarkDeserializeRawGiveBlocksMessage(b *testing.B) { + byt := encoder.Serialize(giveBlocksMessageObj) + result := &GiveBlocksMessage{} + + b.ResetTimer() + for i := 0; i < b.N; i++ { + encoder.DeserializeRaw(byt, result) //nolint:errcheck + } +} + +func BenchmarkSerializeGiveBlocksMessage(b *testing.B) { + b.ResetTimer() + for i := 0; i < b.N; i++ { + encoder.Serialize(&giveBlocksMessageObj) + } +} + +var announceTxnsMessageObj = AnnounceTxnsMessage{ + Transactions: make([]cipher.SHA256, 3), +} + +func BenchmarkDeserializeRawAnnounceTxnsMessage(b *testing.B) { + byt := encoder.Serialize(announceTxnsMessageObj) + result := &AnnounceTxnsMessage{} + + b.ResetTimer() + for i := 0; i < b.N; i++ { + encoder.DeserializeRaw(byt, result) //nolint:errcheck + } +} + +func BenchmarkSerializeAnnounceTxnsMessage(b *testing.B) { + b.ResetTimer() + for i := 0; i < b.N; i++ { + encoder.Serialize(&announceTxnsMessageObj) + } +} + +var giveTxnsMessageObj = GiveTxnsMessage{ + Transactions: []coin.Transaction{ + { + Sigs: make([]cipher.Sig, 3), + In: make([]cipher.SHA256, 3), + Out: make([]coin.TransactionOutput, 3), + }, + { + Sigs: make([]cipher.Sig, 3), + In: make([]cipher.SHA256, 3), + Out: make([]coin.TransactionOutput, 3), + }, + { + Sigs: make([]cipher.Sig, 3), + In: make([]cipher.SHA256, 3), + Out: make([]coin.TransactionOutput, 3), + }, + }, +} + +func BenchmarkDeserializeRawGiveTxnsMessage(b *testing.B) { + byt := encoder.Serialize(giveTxnsMessageObj) + result := &GiveTxnsMessage{} + + b.ResetTimer() + for i := 0; i < b.N; i++ { + encoder.DeserializeRaw(byt, result) //nolint:errcheck + } +} + +func BenchmarkSerializeGiveTxnsMessage(b *testing.B) { + b.ResetTimer() + for i := 0; i < b.N; i++ { + encoder.Serialize(&giveTxnsMessageObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/messages_test.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/messages_test.go new file mode 100644 index 00000000..168a3c10 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/messages_test.go @@ -0,0 +1,1093 @@ +package daemon + +import ( + "io/ioutil" + "os" + "path/filepath" + "testing" + + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/daemon/gnet" + "github.com/SkycoinProject/skycoin/src/daemon/pex" + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/util/useragent" +) + +func TestIntroductionMessage(t *testing.T) { + defer gnet.EraseMessages() + setupMsgEncoding() + + pubkey, _ := cipher.GenerateKeyPair() + pubkey2, _ := cipher.GenerateKeyPair() + genesisHash := testutil.RandSHA256(t) + + invalidGenesisHashExtra := newIntroductionMessageExtra(pubkey, "skycoin:0.26.0", params.VerifyTxn{ + BurnFactor: 4, + MaxTransactionSize: 32768, + MaxDropletPrecision: 3, + }, genesisHash) + invalidGenesisHashExtra = invalidGenesisHashExtra[:len(invalidGenesisHashExtra)-2] + + type daemonMockValue struct { + protocolVersion uint32 + minProtocolVersion uint32 + mirror uint32 + recordMessageEventErr error + pubkey cipher.PubKey + disconnectReason gnet.DisconnectReason + disconnectErr error + connectionIntroduced *connection + connectionIntroducedErr error + requestBlocksFromAddrErr error + announceAllTxnsErr error + sendRandomPeersErr error + } + + tt := []struct { + name string + addr string + gnetID uint64 + mockValue daemonMockValue + userAgent useragent.Data + unconfirmedVerifyTxn params.VerifyTxn + intro *IntroductionMessage + }{ + { + name: "INTR message without extra bytes", + addr: "121.121.121.121:6000", + mockValue: daemonMockValue{ + mirror: 10000, + protocolVersion: 1, + disconnectReason: ErrDisconnectBlockchainPubkeyNotProvided, + }, + intro: &IntroductionMessage{ + Mirror: 10001, + ListenPort: 6000, + ProtocolVersion: 1, + }, + }, + { + name: "INTR message with pubkey but nothing else", + addr: "121.121.121.121:6000", + mockValue: daemonMockValue{ + mirror: 10000, + protocolVersion: 1, + pubkey: pubkey, + disconnectReason: ErrDisconnectInvalidExtraData, + }, + intro: &IntroductionMessage{ + Mirror: 10001, + ListenPort: 6000, + ProtocolVersion: 1, + Extra: pubkey[:], + }, + }, + { + name: "INTR message with pubkey but empty user agent", + addr: "121.121.121.121:6000", + mockValue: daemonMockValue{ + mirror: 10000, + protocolVersion: 1, + pubkey: pubkey, + disconnectReason: ErrDisconnectInvalidUserAgent, + }, + intro: &IntroductionMessage{ + Mirror: 10001, + ListenPort: 6000, + ProtocolVersion: 1, + Extra: append(pubkey[:], []byte{5, 0, 0, 0, 32, 32, 32, 32, 1, 0, 0, 0, 0}...), + }, + }, + { + name: "INTR message with all extra fields", + addr: "121.121.121.121:6000", + mockValue: daemonMockValue{ + mirror: 10000, + protocolVersion: 1, + pubkey: pubkey, + connectionIntroduced: &connection{ + Addr: "121.121.121.121:6000", + ConnectionDetails: ConnectionDetails{ + ListenPort: 6000, + UserAgent: useragent.Data{ + Coin: "skycoin", + Version: "0.26.0", + }, + UnconfirmedVerifyTxn: params.VerifyTxn{ + BurnFactor: 4, + MaxTransactionSize: 32768, + MaxDropletPrecision: 3, + }, + }, + }, + }, + userAgent: useragent.Data{ + Coin: "skycoin", + Version: "0.26.0", + }, + unconfirmedVerifyTxn: params.VerifyTxn{ + BurnFactor: 4, + MaxTransactionSize: 32768, + MaxDropletPrecision: 3, + }, + intro: &IntroductionMessage{ + Mirror: 10001, + ListenPort: 6000, + ProtocolVersion: 1, + Extra: newIntroductionMessageExtra(pubkey, "skycoin:0.26.0", params.VerifyTxn{ + BurnFactor: 4, + MaxTransactionSize: 32768, + MaxDropletPrecision: 3, + }, genesisHash), + }, + }, + { + name: "INTR message with all extra fields and additional data", + addr: "121.121.121.121:6000", + mockValue: daemonMockValue{ + mirror: 10000, + protocolVersion: 1, + pubkey: pubkey, + connectionIntroduced: &connection{ + Addr: "121.121.121.121:6000", + ConnectionDetails: ConnectionDetails{ + ListenPort: 6000, + UserAgent: useragent.Data{ + Coin: "skycoin", + Version: "0.26.0", + }, + UnconfirmedVerifyTxn: params.VerifyTxn{ + BurnFactor: 4, + MaxTransactionSize: 32768, + MaxDropletPrecision: 3, + }, + }, + }, + }, + userAgent: useragent.Data{ + Coin: "skycoin", + Version: "0.26.0", + }, + unconfirmedVerifyTxn: params.VerifyTxn{ + BurnFactor: 4, + MaxTransactionSize: 32768, + MaxDropletPrecision: 3, + }, + intro: &IntroductionMessage{ + Mirror: 10001, + ListenPort: 6000, + ProtocolVersion: 1, + Extra: append(newIntroductionMessageExtra(pubkey, "skycoin:0.26.0", params.VerifyTxn{ + BurnFactor: 4, + MaxTransactionSize: 32768, + MaxDropletPrecision: 3, + }, genesisHash), []byte("additional data")...), + }, + }, + { + name: "INTR message with extra fields but invalid genesis hash data", + addr: "121.121.121.121:6000", + mockValue: daemonMockValue{ + mirror: 10000, + protocolVersion: 1, + pubkey: pubkey, + disconnectReason: ErrDisconnectInvalidExtraData, + }, + userAgent: useragent.Data{ + Coin: "skycoin", + Version: "0.26.0", + }, + unconfirmedVerifyTxn: params.VerifyTxn{ + BurnFactor: 4, + MaxTransactionSize: 32768, + MaxDropletPrecision: 3, + }, + intro: &IntroductionMessage{ + Mirror: 10001, + ListenPort: 6000, + ProtocolVersion: 1, + Extra: invalidGenesisHashExtra, + }, + }, + { + name: "INTR message with different pubkey", + addr: "121.121.121.121:6000", + mockValue: daemonMockValue{ + mirror: 10000, + protocolVersion: 1, + pubkey: pubkey, + disconnectReason: ErrDisconnectBlockchainPubkeyNotMatched, + }, + intro: &IntroductionMessage{ + Mirror: 10001, + ListenPort: 6000, + ProtocolVersion: 1, + Extra: newIntroductionMessageExtra(pubkey2, "skycoin:0.26.0", params.VerifyTxn{ + BurnFactor: 4, + MaxTransactionSize: 32768, + MaxDropletPrecision: 3, + }, genesisHash), + }, + }, + { + name: "INTR message with invalid pubkey", + addr: "121.121.121.121:6000", + mockValue: daemonMockValue{ + mirror: 10000, + protocolVersion: 1, + pubkey: pubkey, + disconnectReason: ErrDisconnectInvalidExtraData, + }, + intro: &IntroductionMessage{ + Mirror: 10001, + ListenPort: 6000, + ProtocolVersion: 1, + Extra: []byte("invalid pubkey"), + }, + }, + { + name: "INTR message with pubkey, malformed user agent bytes", + addr: "121.121.121.121:6000", + mockValue: daemonMockValue{ + mirror: 10000, + protocolVersion: 1, + pubkey: pubkey, + disconnectReason: ErrDisconnectInvalidExtraData, + }, + intro: &IntroductionMessage{ + Mirror: 10001, + ListenPort: 6000, + ProtocolVersion: 1, + Extra: append(pubkey[:], []byte{5, 0, 0, 0, 32, 32, 32, 32, 1, 1, 2, 3}...), // 3 bytes for useragent len prefix is invalid + }, + }, + { + name: "INTR message with pubkey, invalid user agent after parsing", + addr: "121.121.121.121:6000", + mockValue: daemonMockValue{ + mirror: 10000, + protocolVersion: 1, + pubkey: pubkey, + disconnectReason: ErrDisconnectInvalidUserAgent, + }, + intro: &IntroductionMessage{ + Mirror: 10001, + ListenPort: 6000, + ProtocolVersion: 1, + Extra: append(append(pubkey[:], []byte{5, 0, 0, 0, 32, 32, 32, 32, 1}...), encoder.SerializeString("skycoin:0241")...), + }, + }, + { + name: "INTR message with pubkey, invalid burn factor", + addr: "121.121.121.121:6000", + mockValue: daemonMockValue{ + mirror: 10000, + protocolVersion: 1, + pubkey: pubkey, + disconnectReason: ErrDisconnectInvalidBurnFactor, + }, + intro: &IntroductionMessage{ + Mirror: 10001, + ListenPort: 6000, + ProtocolVersion: 1, + Extra: append(append(pubkey[:], []byte{1, 0, 0, 0, 32, 32, 32, 32, 1}...), encoder.SerializeString("skycoin:0.24.1")...), + }, + }, + { + name: "INTR message with pubkey, invalid max transaction size", + addr: "121.121.121.121:6000", + mockValue: daemonMockValue{ + mirror: 10000, + protocolVersion: 1, + pubkey: pubkey, + disconnectReason: ErrDisconnectInvalidMaxTransactionSize, + }, + intro: &IntroductionMessage{ + Mirror: 10001, + ListenPort: 6000, + ProtocolVersion: 1, + Extra: append(append(pubkey[:], []byte{2, 0, 0, 0, 1, 0, 0, 0, 1}...), encoder.SerializeString("skycoin:0.24.1")...), + }, + }, + { + name: "INTR message with pubkey, invalid max droplet precision", + addr: "121.121.121.121:6000", + mockValue: daemonMockValue{ + mirror: 10000, + protocolVersion: 1, + pubkey: pubkey, + disconnectReason: ErrDisconnectInvalidMaxDropletPrecision, + }, + intro: &IntroductionMessage{ + Mirror: 10001, + ListenPort: 6000, + ProtocolVersion: 1, + Extra: append(append(pubkey[:], []byte{2, 0, 0, 0, 32, 32, 32, 32, 8}...), encoder.SerializeString("skycoin:0.24.1")...), + }, + }, + { + name: "Disconnect self connection", + addr: "12.12.12.12:6000", + mockValue: daemonMockValue{ + mirror: 10000, + disconnectReason: ErrDisconnectSelf, + }, + intro: &IntroductionMessage{ + Mirror: 10000, + }, + }, + { + name: "ProtocolVersion below minimum supported version", + mockValue: daemonMockValue{ + mirror: 10000, + protocolVersion: 1, + minProtocolVersion: 2, + disconnectReason: ErrDisconnectVersionNotSupported, + }, + intro: &IntroductionMessage{ + Mirror: 10001, + ProtocolVersion: 0, + }, + }, + { + name: "incoming connection", + addr: "121.121.121.121:12345", + mockValue: daemonMockValue{ + mirror: 10000, + protocolVersion: 1, + pubkey: pubkey, + connectionIntroduced: &connection{ + Addr: "121.121.121.121:12345", + ConnectionDetails: ConnectionDetails{ + ListenPort: 6000, + UserAgent: useragent.Data{ + Coin: "skycoin", + Version: "0.24.1", + Remark: "foo", + }, + }, + }, + }, + userAgent: useragent.Data{ + Coin: "skycoin", + Version: "0.24.1", + Remark: "foo", + }, + unconfirmedVerifyTxn: params.VerifyTxn{ + BurnFactor: 4, + MaxTransactionSize: 32768, + MaxDropletPrecision: 3, + }, + intro: &IntroductionMessage{ + Mirror: 10001, + ProtocolVersion: 1, + ListenPort: 6000, + Extra: newIntroductionMessageExtra(pubkey, "skycoin:0.24.1(foo)", params.VerifyTxn{ + BurnFactor: 4, + MaxTransactionSize: 32768, + MaxDropletPrecision: 3, + }, genesisHash), + }, + }, + { + name: "Connect twice", + addr: "121.121.121.121:6000", + gnetID: 2, + mockValue: daemonMockValue{ + mirror: 10000, + protocolVersion: 1, + pubkey: pubkey, + disconnectReason: ErrDisconnectConnectedTwice, + connectionIntroducedErr: ErrConnectionIPMirrorExists, + connectionIntroduced: &connection{ + Addr: "121.121.121.121:12345", + ConnectionDetails: ConnectionDetails{ + ListenPort: 6000, + UserAgent: useragent.Data{ + Coin: "skycoin", + Version: "0.26.0", + Remark: "foo", + }, + }, + }, + }, + userAgent: useragent.Data{ + Coin: "skycoin", + Version: "0.26.0", + Remark: "foo", + }, + unconfirmedVerifyTxn: params.VerifyTxn{ + BurnFactor: 4, + MaxTransactionSize: 32768, + MaxDropletPrecision: 3, + }, + intro: &IntroductionMessage{ + Mirror: 10001, + ProtocolVersion: 1, + ListenPort: 6000, + Extra: newIntroductionMessageExtra(pubkey, "skycoin:0.26.0(foo)", params.VerifyTxn{ + BurnFactor: 4, + MaxTransactionSize: 32768, + MaxDropletPrecision: 3, + }, genesisHash), + }, + }, + { + name: "peer list full", + addr: "121.121.121.121:12345", + mockValue: daemonMockValue{ + mirror: 10000, + protocolVersion: 1, + pubkey: pubkey, + disconnectReason: ErrDisconnectPeerlistFull, + connectionIntroducedErr: pex.ErrPeerlistFull, + connectionIntroduced: &connection{ + Addr: "121.121.121.121:12345", + ConnectionDetails: ConnectionDetails{ + ListenPort: 6000, + UserAgent: useragent.Data{ + Coin: "skycoin", + Version: "0.26.0", + Remark: "foo", + }, + }, + }, + }, + userAgent: useragent.Data{ + Coin: "skycoin", + Version: "0.26.0", + Remark: "foo", + }, + unconfirmedVerifyTxn: params.VerifyTxn{ + BurnFactor: 4, + MaxTransactionSize: 32768, + MaxDropletPrecision: 3, + }, + intro: &IntroductionMessage{ + Mirror: 10001, + ProtocolVersion: 1, + ListenPort: 6000, + Extra: newIntroductionMessageExtra(pubkey, "skycoin:0.26.0(foo)", params.VerifyTxn{ + BurnFactor: 4, + MaxTransactionSize: 32768, + MaxDropletPrecision: 3, + }, genesisHash), + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + mc := &gnet.MessageContext{ + Addr: tc.addr, + ConnID: tc.gnetID, + } + tc.intro.c = mc + + d := &mockDaemoner{} + d.On("DaemonConfig").Return(DaemonConfig{ + ProtocolVersion: int32(tc.mockValue.protocolVersion), + MinProtocolVersion: int32(tc.mockValue.minProtocolVersion), + UserAgent: useragent.Data{ + Coin: "skycoin", + Version: "0.24.1", + }, + Mirror: tc.mockValue.mirror, + BlockchainPubkey: tc.mockValue.pubkey, + }) + d.On("recordMessageEvent", tc.intro, mc).Return(tc.mockValue.recordMessageEventErr) + d.On("Disconnect", tc.addr, tc.mockValue.disconnectReason).Return(tc.mockValue.disconnectErr) + d.On("connectionIntroduced", tc.addr, tc.gnetID, mock.MatchedBy(func(m *IntroductionMessage) bool { + t.Logf("connectionIntroduced mock.MatchedBy unconfirmedBurnFactor=%d", m.UnconfirmedVerifyTxn.BurnFactor) + if m == nil { + return false + } + + if tc.userAgent != m.UserAgent { + return false + } + if tc.unconfirmedVerifyTxn != m.UnconfirmedVerifyTxn { + return false + } + + return true + })).Return(tc.mockValue.connectionIntroduced, tc.mockValue.connectionIntroducedErr) + d.On("requestBlocksFromAddr", tc.addr).Return(tc.mockValue.requestBlocksFromAddrErr) + d.On("announceAllValidTxns").Return(tc.mockValue.announceAllTxnsErr) + d.On("sendRandomPeers", tc.addr).Return(tc.mockValue.sendRandomPeersErr) + + err := tc.intro.Handle(mc, d) + require.NoError(t, err) + + tc.intro.process(d) + + if tc.mockValue.disconnectReason != nil { + d.AssertCalled(t, "Disconnect", tc.addr, tc.mockValue.disconnectReason) + } else { + d.AssertNotCalled(t, "Disconnect", mock.Anything, mock.Anything) + require.Equal(t, genesisHash, tc.intro.GenesisHash) + } + }) + } +} + +func TestMessageEncodeDecode(t *testing.T) { + update := false + + introPubKey := cipher.MustPubKeyFromHex("03cd7dfcd8c3452d1bb5d9d9e34dd95d6848cb9f66c2aad127b60578f4be7498f2") + introGenesisHash := cipher.MustSHA256FromHex("9afa0004c0ae04fae7c48e3bc0a324c51100de9508ae6048ebdb6652dc94f0e2") + + cases := []struct { + goldenFile string + obj interface{} + msg interface{} + }{ + { + goldenFile: "intro-msg.golden", + obj: &IntroductionMessage{}, + msg: &IntroductionMessage{ + Mirror: 99998888, + ListenPort: 8888, + ProtocolVersion: 12341234, + }, + }, + { + goldenFile: "intro-msg-extra.golden", + obj: &IntroductionMessage{}, + msg: &IntroductionMessage{ + Mirror: 99998888, + ListenPort: 8888, + ProtocolVersion: 12341234, + Extra: newIntroductionMessageExtra(introPubKey, "skycoin:0.26.0(foo)", params.VerifyTxn{ + BurnFactor: 2, + MaxTransactionSize: 32768, + MaxDropletPrecision: 3, + }, introGenesisHash), + }, + }, + { + goldenFile: "get-peers-msg.golden", + obj: &GetPeersMessage{}, + msg: &GetPeersMessage{}, + }, + { + goldenFile: "give-peers-msg.golden", + obj: &GivePeersMessage{}, + msg: &GivePeersMessage{ + Peers: []IPAddr{ + { + IP: 12345678, + Port: 1234, + }, + { + IP: 87654321, + Port: 4321, + }, + }, + }, + }, + { + goldenFile: "ping-msg.golden", + obj: &PingMessage{}, + msg: &PingMessage{}, + }, + { + goldenFile: "pong-msg.golden", + obj: &PongMessage{}, + msg: &PongMessage{}, + }, + { + goldenFile: "get-blocks-msg.golden", + obj: &GetBlocksMessage{}, + msg: &GetBlocksMessage{ + LastBlock: 999988887777, + RequestedBlocks: 888899997777, + }, + }, + { + goldenFile: "give-blocks-msg.golden", + obj: &GiveBlocksMessage{}, + msg: &GiveBlocksMessage{ + Blocks: []coin.SignedBlock{ + { + Sig: cipher.MustSigFromHex("8cf145e9ef4a4a5254bc57798a7a61dfed238768f94edc5635175c6b91bccd8ec1555da603c5e31b018e135b82b1525be8a92973c468a74b5b40b8da189cb465eb"), + Block: coin.Block{ + Head: coin.BlockHeader{ + Version: 1, + Time: 1538036613, + BkSeq: 9999999999, + Fee: 1234123412341234, + PrevHash: cipher.MustSHA256FromHex("59cb7d0e2ce8a03d1054afcc28a22fe864a8813460d241db38c59d10e7c29132"), + BodyHash: cipher.MustSHA256FromHex("6d421469409591f0c3112884c8cf10f8bca5d8ab87c9c30dea2ea73b6751bbf9"), + UxHash: cipher.MustSHA256FromHex("6ea6a972cf06d25908b29953aeddb68c3b6f3a9903e8f964dc89b0abc0645dea"), + }, + Body: coin.BlockBody{ + Transactions: coin.Transactions{ + { + Length: 43214321, + Type: 1, + InnerHash: cipher.MustSHA256FromHex("cbedf8ef0bda91afc6a180eea0dddf8e3a986b6b6f87f70e8bffc63c6fbaa4e6"), + Sigs: []cipher.Sig{ + cipher.MustSigFromHex("1cfd7a4db3a52a85d2a86708695112b6520acc8dc83c86e8da67915199fdf04964c168543598ab07c2b99c292899890891950364c2bf66f1aaa6d6a66a5c9a73ff"), + cipher.MustSigFromHex("442167c6b3d13957bc32f83182c7f4fda0bb6bde893a41a6a04cdd8eecee0048d03a57eb2af04ea6050e1f418769c94c7f12fad9287dc650e6b307fdfce6b42a59"), + }, + In: []cipher.SHA256{ + cipher.MustSHA256FromHex("536f0a1a915fadfa3a2720a0615641827ff67394d2b2149d6db63b8c619e14af"), + cipher.MustSHA256FromHex("64ba5f01f90f97f84999f13aeaa75fed8d5b3e4a3a4a093dedf4795969e8bd27"), + }, + Out: []coin.TransactionOutput{ + { + Address: cipher.MustDecodeBase58Address("23FF4fshzD8tZk2d88P22WATfzUpNQF1x85"), + Coins: 987987987, + Hours: 789789789, + }, + { + Address: cipher.MustDecodeBase58Address("29V2iRpZAqHiFZHHRqaZLArZZuTcZM5owqT"), + Coins: 123123, + Hours: 321321, + }, + }, + }, + { + Length: 98769876, + Type: 0, + InnerHash: cipher.MustSHA256FromHex("46856af925fde9a1652d39eea479dd92589a741451a0228402e399fae02f8f3d"), + Sigs: []cipher.Sig{ + cipher.MustSigFromHex("92e289792200518df9a82cf9dddd1f334bf0d47fb0ed4ff70c25403f39577af5ab24ef2d02a11cf6b76e6bd017457ad60d6ca85c0567c21f5c62599c93ee98e18c"), + cipher.MustSigFromHex("e995da86ed87640ecb44e624074ba606b781aa0cbeb24e8c27ff30becf7181175479c0d74d93fe1e8692bba628b5cf532ca80fed4135148d84e6ecc2a762a10b19"), + }, + In: []cipher.SHA256{ + cipher.MustSHA256FromHex("69b14a7ee184f24b95659d6887101ef7c921fa7977d95c73fbc0c4d0d22671bc"), + cipher.MustSHA256FromHex("3a050b4ec33ec9ad2c789f24655ab1c8f7691d3a1c3d0e05cc14b022b4c360ea"), + }, + Out: []coin.TransactionOutput{ + { + Address: cipher.MustDecodeBase58Address("XvvjeyGcTBVXDXmfJoTUseFiqHvm12C6oQ"), + Coins: 15, + Hours: 1237882, + }, + { + Address: cipher.MustDecodeBase58Address("fQXVLq9fbCC9XVxDKLAGDLXmQYjPy59j22"), + Coins: 2102123, + Hours: 1003, + }, + }, + }, + }, + }, + }, + }, + { + Sig: cipher.MustSigFromHex("8015c8776de577d89c29d1cbd1d558ba4855dec94ba58f6c67d55ece5c85708b9906bd0b72b451e27008f3938fcec42c1a28ddac336ae8206d8e6443b95dde966c"), + Block: coin.Block{ + Head: coin.BlockHeader{ + Version: 0, + Time: 1427248825, + BkSeq: 100, + Fee: 120939323123, + PrevHash: cipher.MustSHA256FromHex("04d40b5d27c539ab9d98934628604baef7dbfb1c35ddf9c0f96a67f6b061fa26"), + BodyHash: cipher.MustSHA256FromHex("9a67fbb00216ae99f334d4efa2c9c42a25aac5d1a5bbb2058fe5705cfe0e30ea"), + UxHash: cipher.MustSHA256FromHex("58981d30da11be3c8e9dd8fdb7b51b48ba13dc0214cf211251308985bf089f76"), + }, + Body: coin.BlockBody{ + Transactions: coin.Transactions{ + { + Length: 128, + Type: 99, + InnerHash: cipher.MustSHA256FromHex("e943fd54a8071bb0ae92800c23c5a26443b5e5bf9b9321cefcdd9e80f518c37e"), + Sigs: []cipher.Sig{ + cipher.MustSigFromHex("cff49d1d450db812d42748d4f7001e03a1dd2b98afcbb62eca1b3b1fa137e5095a0368250aabd3976008afe61471ecd31ed99185c3df49269d9aada4ca1dd2eecb"), + cipher.MustSigFromHex("1313e5a80d6d9386fe2dffa13afba7277402f029d411e60f99b3806fee547d6157ca2d8d6407df3e858d6f3f58902f460412611282a0dec2468e41a2c5a39cc93e"), + }, + In: []cipher.SHA256{ + cipher.MustSHA256FromHex("6a76c83b7b75075e2e34405e21d5e8d37adb69e4e6487a6179944ea7e04bc7db"), + cipher.MustSHA256FromHex("a7555179a255e6a7dddb6121bd4c2259f75ebc321345be26b690f34094012f95"), + }, + Out: []coin.TransactionOutput{ + { + Address: cipher.MustDecodeBase58Address("2RmSTGbj5qaFT1WvKGz4SobaT4xSb9GvaCh"), + Coins: 12301923233, + Hours: 39932, + }, + { + Address: cipher.MustDecodeBase58Address("uA8XQnNzS4kit9DFzybyVSpWDEDy62MXur"), + Coins: 9945924, + Hours: 9030300895893902, + }, + }, + }, + { + Length: 1304, + Type: 255, + InnerHash: cipher.MustSHA256FromHex("d92057e9a4874aa876b7fd20074d78a4d890c2d3af483a10206f243308586763"), + Sigs: []cipher.Sig{ + cipher.MustSigFromHex("394d53cc0bfeef11cc94bf39316d555549cf1a1afd14920be7d065e7940cc60752b8ade8c37991307a5681b06e0445c1c19ceb0e6611fd4593dcc65d18975c87be"), + cipher.MustSigFromHex("50ad670bc672558c235653b6396135352bfbc8eec575de3cffce65d5a07076082f9694880eb6b1e708eb8fb39d21a96dd99615b5759fc917c3fdd4d9845489119b"), + }, + In: []cipher.SHA256{ + cipher.MustSHA256FromHex("f37057407a6b5b103218abdfc5b5527f8abcc229256c912ec81ac6d72b68454e"), + cipher.MustSHA256FromHex("9cd1fccddb5895ab77cd419802430e16a1e05f0f796d026fc69961c5c308b766"), + }, + Out: []coin.TransactionOutput{ + { + Address: cipher.MustDecodeBase58Address("MNf67cWXYmSizin4XUtGnFfQQzxkvNqCEH"), + Coins: 1, + Hours: 1, + }, + { + Address: cipher.MustDecodeBase58Address("HEkH8R1Uc58mAjZqGM15cqF4QMqG4mu4ry"), + Coins: 1, + Hours: 0, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + { + goldenFile: "announce-blocks-msg.golden", + obj: &AnnounceBlocksMessage{}, + msg: &AnnounceBlocksMessage{ + MaxBkSeq: 50000, + }, + }, + { + goldenFile: "announce-txns-msg.golden", + obj: &AnnounceTxnsMessage{}, + msg: &AnnounceTxnsMessage{ + Transactions: []cipher.SHA256{ + cipher.MustSHA256FromHex("23dc4b68c0fc790989bb82f04b9d5174baab6f0f6808ed35be9b93cb73c69108"), + cipher.MustSHA256FromHex("2be4b0155c1ab9613007fe522e3b12bac4be79800a19bc8cd8ca343868caa583"), + }, + }, + }, + { + goldenFile: "get-txns-msg.golden", + obj: &GetTxnsMessage{}, + msg: &GetTxnsMessage{ + Transactions: []cipher.SHA256{ + cipher.MustSHA256FromHex("335b63b0f335c6aee5e7e1b3c62dd09bb6074e38b48e2469e294a019d5ae5aa1"), + cipher.MustSHA256FromHex("619a367f4e5dee741348366899237ddc920335fc847ccafdf2d32ed57bb7b385"), + }, + }, + }, + { + goldenFile: "give-txns-msg.golden", + obj: &GiveTxnsMessage{}, + msg: &GiveTxnsMessage{ + Transactions: coin.Transactions{ + { + Length: 256, + Type: 0, + InnerHash: cipher.MustSHA256FromHex("1773d8901df96bba4c6d65499e11e6ec73a9978c611d1463898ffbc2b49773fc"), + Sigs: []cipher.Sig{ + cipher.MustSigFromHex("a711880ae54d1b6b9adade2ef1e743d6d539a78b0cecf1af08107e467956de80ef1d49fb5e896c9d0870ef8bf8a4d328ca0ecf7c1956866867ec56064e68f8a374"), + cipher.MustSigFromHex("f9890ddd93f9479e364261ebc647326d2fd57e50b7728795adbf507c956f9eb44f77207b528700c4cef338290cdfc17f814dc3d94e3d711e92492ecc7b8abef808"), + }, + In: []cipher.SHA256{ + cipher.MustSHA256FromHex("703f84ee0702b44fc89ce573a239d5fbf185bf5d4e7fc8f4930262bcda1e8fb0"), + cipher.MustSHA256FromHex("c9e904862da01f2d7676c12c4342dde36d9a9a9d25be5351e2b57fae6f426bb9"), + }, + Out: []coin.TransactionOutput{ + { + Address: cipher.MustDecodeBase58Address("29VEn56iRr2TpVVpPoPxUJPfFWuhbLSBRdU"), + Coins: 1111111111111111111, + Hours: 9999999999999999999, + }, + { + Address: cipher.MustDecodeBase58Address("2bqs99tysFtfs8QPT81kpZWnzTT1rWd8xtQ"), + Coins: 9922581002, + Hours: 9932900022223334, + }, + }, + }, + { + Length: 13043, + Type: 128, + InnerHash: cipher.MustSHA256FromHex("a9da3e4acb1892a000c1b658a64d4e420d0c381862928ab820fb3f3a534a9674"), + Sigs: []cipher.Sig{ + cipher.MustSigFromHex("7bbbdfd58c0533aed95f18d9413e0e0517892350eaf132eadf7a9a03d4a974ca0bc074abc001f86a34cf66c10f832dbcca20c2c67b5e8517f4ff0e1d0123fecb21"), + cipher.MustSigFromHex("68732b78ac3a4e2fe146b8819c8b1c0b126a0188008c9c7c98fee965beba039778010ff7b0379dadeeadbbc42f9541ce4ad3c8cec12108d3aa58aca583bddd0df0"), + }, + In: []cipher.SHA256{ + cipher.MustSHA256FromHex("766d6f6ed56599a91759c75466e3f09b9d6d5995b58dd5bbfba5af10b1a8cdea"), + cipher.MustSHA256FromHex("2c7989f47524721bb2c7a7f967208c9b1c01829c9a55addf22d066e5c55ab3ac"), + }, + Out: []coin.TransactionOutput{ + { + Address: cipher.MustDecodeBase58Address("24iFsYHzVfYXo8cvWg1jhetpTMNvHH7j6AX"), + Coins: 1123103123, + Hours: 123000, + }, + { + Address: cipher.MustDecodeBase58Address("JV5xJ33po1Bj3dXZT3SYA3ZmnTibREFxxd"), + Coins: 999999, + Hours: 9043285343, + }, + }, + }, + }, + }, + }, + } + + if update { + for _, tc := range cases { + t.Run(tc.goldenFile, func(t *testing.T) { + fn := filepath.Join("testdata/", tc.goldenFile) + + f, err := os.Create(fn) + require.NoError(t, err) + defer f.Close() + + b := encoder.Serialize(tc.msg) + _, err = f.Write(b) + require.NoError(t, err) + }) + } + } + + for _, tc := range cases { + t.Run(tc.goldenFile, func(t *testing.T) { + fn := filepath.Join("testdata/", tc.goldenFile) + + f, err := os.Open(fn) + require.NoError(t, err) + defer f.Close() + + d, err := ioutil.ReadAll(f) + require.NoError(t, err) + + err = encoder.DeserializeRawExact(d, tc.obj) + require.NoError(t, err) + + require.Equal(t, tc.msg, tc.obj) + + d2 := encoder.Serialize(tc.msg) + require.Equal(t, d, d2) + }) + } +} + +func TestTruncateGivePeersMessage(t *testing.T) { + maxLen := uint64(1024) + m := &GivePeersMessage{} + + // Empty message, no truncation + prevLen := len(m.Peers) + truncateGivePeersMessage(m, maxLen) + require.Equal(t, prevLen, len(m.Peers)) + + n := encodeSizeGivePeersMessage(m) + require.True(t, n <= maxLen) + + // One peer, no truncation + m.Peers = append(m.Peers, IPAddr{}) + prevLen = len(m.Peers) + truncateGivePeersMessage(m, maxLen) + require.Equal(t, prevLen, len(m.Peers)) + + n = encodeSizeGivePeersMessage(m) + require.True(t, n <= maxLen) + + // Too many peers, truncated + n = encodeSizeIPAddr(&IPAddr{}) + m.Peers = make([]IPAddr, (maxLen/n)*2) + prevLen = len(m.Peers) + truncateGivePeersMessage(m, maxLen) + require.True(t, len(m.Peers) < prevLen) + require.NotEmpty(t, m.Peers) + + n = encodeSizeGivePeersMessage(m) + require.True(t, n <= maxLen) +} + +func TestTruncateGiveBlocksMessage(t *testing.T) { + maxLen := uint64(1024) + m := &GiveBlocksMessage{} + + // Empty message, no truncation + prevLen := len(m.Blocks) + truncateGiveBlocksMessage(m, maxLen) + require.Equal(t, prevLen, len(m.Blocks)) + + n := encodeSizeGiveBlocksMessage(m) + require.True(t, n <= maxLen) + + // One block, no truncation + m.Blocks = append(m.Blocks, coin.SignedBlock{}) + prevLen = len(m.Blocks) + truncateGiveBlocksMessage(m, maxLen) + require.Equal(t, prevLen, len(m.Blocks)) + + n = encodeSizeGiveBlocksMessage(m) + require.True(t, n <= maxLen) + + // Too many blocks, truncated + n = encodeSizeSignedBlock(&coin.SignedBlock{}) + m.Blocks = make([]coin.SignedBlock, (maxLen/n)*2) + prevLen = len(m.Blocks) + truncateGiveBlocksMessage(m, maxLen) + require.True(t, len(m.Blocks) < prevLen) + require.NotEmpty(t, m.Blocks) + + n = encodeSizeGiveBlocksMessage(m) + require.True(t, n <= maxLen) +} + +func TestTruncateGiveTransactionsMessage(t *testing.T) { + maxLen := uint64(1024) + m := &GiveTxnsMessage{} + + // Empty message, no truncation + prevLen := len(m.Transactions) + truncateGiveTxnsMessage(m, maxLen) + require.Equal(t, prevLen, len(m.Transactions)) + + n := encodeSizeGiveTxnsMessage(m) + require.True(t, n <= maxLen) + + // One block, no truncation + m.Transactions = append(m.Transactions, coin.Transaction{}) + prevLen = len(m.Transactions) + truncateGiveTxnsMessage(m, maxLen) + require.Equal(t, prevLen, len(m.Transactions)) + + n = encodeSizeGiveTxnsMessage(m) + require.True(t, n <= maxLen) + + // Too many transactions, truncated + n = encodeSizeTransaction(&coin.Transaction{}) + m.Transactions = make([]coin.Transaction, (maxLen/n)*2) + prevLen = len(m.Transactions) + truncateGiveTxnsMessage(m, maxLen) + require.True(t, len(m.Transactions) < prevLen) + require.NotEmpty(t, m.Transactions) + + n = encodeSizeGiveTxnsMessage(m) + require.True(t, n <= maxLen) +} + +func TestTruncateAnnounceTxnsHashes(t *testing.T) { + maxLen := uint64(1024) + m := &AnnounceTxnsMessage{} + + // Empty message, no truncation + prevLen := len(m.Transactions) + hashes := truncateAnnounceTxnsHashes(m, maxLen) + require.Equal(t, prevLen, len(hashes)) + + m.Transactions = hashes + n := encodeSizeAnnounceTxnsMessage(m) + require.True(t, n <= maxLen, "n=%d maxLen=%d", n, maxLen) + + // One block, no truncation + m.Transactions = append(m.Transactions, cipher.SHA256{}) + prevLen = len(m.Transactions) + hashes = truncateAnnounceTxnsHashes(m, maxLen) + require.Equal(t, prevLen, len(hashes)) + + m.Transactions = hashes + n = encodeSizeAnnounceTxnsMessage(m) + require.True(t, n <= maxLen, "n=%d maxLen=%d", n, maxLen) + + // Too many transactions, truncated + n = uint64(len(cipher.SHA256{})) + m.Transactions = make([]cipher.SHA256, (maxLen/n)*2) + prevLen = len(m.Transactions) + hashes = truncateAnnounceTxnsHashes(m, maxLen) + require.True(t, len(hashes) < prevLen) + require.NotEmpty(t, hashes) + + m.Transactions = hashes + n = encodeSizeAnnounceTxnsMessage(m) + require.True(t, n <= maxLen, "n=%d maxLen=%d", n, maxLen) +} + +func TestTruncateGetTxnsHashes(t *testing.T) { + maxLen := uint64(1024) + m := &GetTxnsMessage{} + + // Empty message, no truncation + prevLen := len(m.Transactions) + hashes := truncateGetTxnsHashes(m, maxLen) + require.Equal(t, prevLen, len(hashes)) + + m.Transactions = hashes + n := encodeSizeGetTxnsMessage(m) + require.True(t, n <= maxLen, "n=%d maxLen=%d", n, maxLen) + + // One block, no truncation + m.Transactions = append(m.Transactions, cipher.SHA256{}) + prevLen = len(m.Transactions) + hashes = truncateGetTxnsHashes(m, maxLen) + require.Equal(t, prevLen, len(hashes)) + + m.Transactions = hashes + n = encodeSizeGetTxnsMessage(m) + require.True(t, n <= maxLen, "n=%d maxLen=%d", n, maxLen) + + // Too many transactions, truncated + n = uint64(len(cipher.SHA256{})) + m.Transactions = make([]cipher.SHA256, (maxLen/n)*2) + prevLen = len(m.Transactions) + hashes = truncateGetTxnsHashes(m, maxLen) + require.True(t, len(hashes) < prevLen) + require.NotEmpty(t, hashes) + + m.Transactions = hashes + n = encodeSizeGetTxnsMessage(m) + require.True(t, n <= maxLen, "n=%d maxLen=%d", n, maxLen) +} + +func TestGetBlocksMessageProcess(t *testing.T) { + d := &mockDaemoner{} + + m := &GetBlocksMessage{ + LastBlock: 7, + // request more blocks than MaxGetBlocksResponseCount to verify capping + RequestedBlocks: 100, + c: &gnet.MessageContext{ + ConnID: 10, + Addr: "127.0.0.1:1234", + }, + } + + config := DaemonConfig{ + DisableNetworking: false, + MaxGetBlocksResponseCount: 20, + MaxOutgoingMessageLength: 1024, + } + + // Have getSignedBlocksSince return a lot of blocks to verify truncation + blocks := make([]coin.SignedBlock, 256) + + gbm := NewGiveBlocksMessage(blocks, config.MaxOutgoingMessageLength) + require.True(t, len(gbm.Blocks) < len(blocks), "blocks should be truncated") + require.NotEmpty(t, gbm.Blocks) + + d.On("DaemonConfig").Return(config) + d.On("recordPeerHeight", "127.0.0.1:1234", uint64(10), uint64(7)).Return() + d.On("getSignedBlocksSince", uint64(7), uint64(20)).Return(blocks, nil) + d.On("sendMessage", "127.0.0.1:1234", gbm).Return(nil) + + m.process(d) + + d.AssertExpectations(t) +} + +func setupMsgEncoding() { + gnet.EraseMessages() + var messagesConfig = NewMessagesConfig() + messagesConfig.Register() +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/mock_daemoner_test.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/mock_daemoner_test.go new file mode 100644 index 00000000..49b16202 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/mock_daemoner_test.go @@ -0,0 +1,347 @@ +// Code generated by mockery v1.0.0. DO NOT EDIT. + +package daemon + +import cipher "github.com/SkycoinProject/skycoin/src/cipher" +import coin "github.com/SkycoinProject/skycoin/src/coin" +import gnet "github.com/SkycoinProject/skycoin/src/daemon/gnet" +import mock "github.com/stretchr/testify/mock" +import pex "github.com/SkycoinProject/skycoin/src/daemon/pex" +import visor "github.com/SkycoinProject/skycoin/src/visor" + +// mockDaemoner is an autogenerated mock type for the daemoner type +type mockDaemoner struct { + mock.Mock +} + +// DaemonConfig provides a mock function with given fields: +func (_m *mockDaemoner) DaemonConfig() DaemonConfig { + ret := _m.Called() + + var r0 DaemonConfig + if rf, ok := ret.Get(0).(func() DaemonConfig); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(DaemonConfig) + } + + return r0 +} + +// Disconnect provides a mock function with given fields: addr, r +func (_m *mockDaemoner) Disconnect(addr string, r gnet.DisconnectReason) error { + ret := _m.Called(addr, r) + + var r0 error + if rf, ok := ret.Get(0).(func(string, gnet.DisconnectReason) error); ok { + r0 = rf(addr, r) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// addPeers provides a mock function with given fields: addrs +func (_m *mockDaemoner) addPeers(addrs []string) int { + ret := _m.Called(addrs) + + var r0 int + if rf, ok := ret.Get(0).(func([]string) int); ok { + r0 = rf(addrs) + } else { + r0 = ret.Get(0).(int) + } + + return r0 +} + +// announceAllValidTxns provides a mock function with given fields: +func (_m *mockDaemoner) announceAllValidTxns() error { + ret := _m.Called() + + var r0 error + if rf, ok := ret.Get(0).(func() error); ok { + r0 = rf() + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// broadcastMessage provides a mock function with given fields: msg +func (_m *mockDaemoner) broadcastMessage(msg gnet.Message) ([]uint64, error) { + ret := _m.Called(msg) + + var r0 []uint64 + if rf, ok := ret.Get(0).(func(gnet.Message) []uint64); ok { + r0 = rf(msg) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]uint64) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(gnet.Message) error); ok { + r1 = rf(msg) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// connectionIntroduced provides a mock function with given fields: addr, gnetID, m +func (_m *mockDaemoner) connectionIntroduced(addr string, gnetID uint64, m *IntroductionMessage) (*connection, error) { + ret := _m.Called(addr, gnetID, m) + + var r0 *connection + if rf, ok := ret.Get(0).(func(string, uint64, *IntroductionMessage) *connection); ok { + r0 = rf(addr, gnetID, m) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*connection) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, uint64, *IntroductionMessage) error); ok { + r1 = rf(addr, gnetID, m) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// disconnectNow provides a mock function with given fields: addr, r +func (_m *mockDaemoner) disconnectNow(addr string, r gnet.DisconnectReason) error { + ret := _m.Called(addr, r) + + var r0 error + if rf, ok := ret.Get(0).(func(string, gnet.DisconnectReason) error); ok { + r0 = rf(addr, r) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// executeSignedBlock provides a mock function with given fields: b +func (_m *mockDaemoner) executeSignedBlock(b coin.SignedBlock) error { + ret := _m.Called(b) + + var r0 error + if rf, ok := ret.Get(0).(func(coin.SignedBlock) error); ok { + r0 = rf(b) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// filterKnownUnconfirmed provides a mock function with given fields: txns +func (_m *mockDaemoner) filterKnownUnconfirmed(txns []cipher.SHA256) ([]cipher.SHA256, error) { + ret := _m.Called(txns) + + var r0 []cipher.SHA256 + if rf, ok := ret.Get(0).(func([]cipher.SHA256) []cipher.SHA256); ok { + r0 = rf(txns) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]cipher.SHA256) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func([]cipher.SHA256) error); ok { + r1 = rf(txns) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// getKnownUnconfirmed provides a mock function with given fields: txns +func (_m *mockDaemoner) getKnownUnconfirmed(txns []cipher.SHA256) (coin.Transactions, error) { + ret := _m.Called(txns) + + var r0 coin.Transactions + if rf, ok := ret.Get(0).(func([]cipher.SHA256) coin.Transactions); ok { + r0 = rf(txns) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(coin.Transactions) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func([]cipher.SHA256) error); ok { + r1 = rf(txns) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// getSignedBlocksSince provides a mock function with given fields: seq, count +func (_m *mockDaemoner) getSignedBlocksSince(seq uint64, count uint64) ([]coin.SignedBlock, error) { + ret := _m.Called(seq, count) + + var r0 []coin.SignedBlock + if rf, ok := ret.Get(0).(func(uint64, uint64) []coin.SignedBlock); ok { + r0 = rf(seq, count) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]coin.SignedBlock) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(uint64, uint64) error); ok { + r1 = rf(seq, count) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// headBkSeq provides a mock function with given fields: +func (_m *mockDaemoner) headBkSeq() (uint64, bool, error) { + ret := _m.Called() + + var r0 uint64 + if rf, ok := ret.Get(0).(func() uint64); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(uint64) + } + + var r1 bool + if rf, ok := ret.Get(1).(func() bool); ok { + r1 = rf() + } else { + r1 = ret.Get(1).(bool) + } + + var r2 error + if rf, ok := ret.Get(2).(func() error); ok { + r2 = rf() + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// injectTransaction provides a mock function with given fields: txn +func (_m *mockDaemoner) injectTransaction(txn coin.Transaction) (bool, *visor.ErrTxnViolatesSoftConstraint, error) { + ret := _m.Called(txn) + + var r0 bool + if rf, ok := ret.Get(0).(func(coin.Transaction) bool); ok { + r0 = rf(txn) + } else { + r0 = ret.Get(0).(bool) + } + + var r1 *visor.ErrTxnViolatesSoftConstraint + if rf, ok := ret.Get(1).(func(coin.Transaction) *visor.ErrTxnViolatesSoftConstraint); ok { + r1 = rf(txn) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*visor.ErrTxnViolatesSoftConstraint) + } + } + + var r2 error + if rf, ok := ret.Get(2).(func(coin.Transaction) error); ok { + r2 = rf(txn) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// pexConfig provides a mock function with given fields: +func (_m *mockDaemoner) pexConfig() pex.Config { + ret := _m.Called() + + var r0 pex.Config + if rf, ok := ret.Get(0).(func() pex.Config); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(pex.Config) + } + + return r0 +} + +// recordMessageEvent provides a mock function with given fields: m, c +func (_m *mockDaemoner) recordMessageEvent(m asyncMessage, c *gnet.MessageContext) error { + ret := _m.Called(m, c) + + var r0 error + if rf, ok := ret.Get(0).(func(asyncMessage, *gnet.MessageContext) error); ok { + r0 = rf(m, c) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// recordPeerHeight provides a mock function with given fields: addr, gnetID, height +func (_m *mockDaemoner) recordPeerHeight(addr string, gnetID uint64, height uint64) { + _m.Called(addr, gnetID, height) +} + +// requestBlocksFromAddr provides a mock function with given fields: addr +func (_m *mockDaemoner) requestBlocksFromAddr(addr string) error { + ret := _m.Called(addr) + + var r0 error + if rf, ok := ret.Get(0).(func(string) error); ok { + r0 = rf(addr) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// sendMessage provides a mock function with given fields: addr, msg +func (_m *mockDaemoner) sendMessage(addr string, msg gnet.Message) error { + ret := _m.Called(addr, msg) + + var r0 error + if rf, ok := ret.Get(0).(func(string, gnet.Message) error); ok { + r0 = rf(addr, msg) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// sendRandomPeers provides a mock function with given fields: addr +func (_m *mockDaemoner) sendRandomPeers(addr string) error { + ret := _m.Called(addr) + + var r0 error + if rf, ok := ret.Get(0).(func(string) error); ok { + r0 = rf(addr) + } else { + r0 = ret.Error(0) + } + + return r0 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/pex/README.md b/vendor/github.com/SkycoinProject/skycoin/src/daemon/pex/README.md new file mode 100644 index 00000000..2dc91726 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/pex/README.md @@ -0,0 +1,8 @@ +pex +=== + +Tools for implementing peer exchange (PEX) with Go + +[![GoDoc](http://godoc.org/github.com//skycoin/pex?status.png)](http://godoc.org/github.com/SkycoinProject/skycoin/src/daemon/pex) + +[Godoc generated documentation](http://godoc.org/github.com/SkycoinProject/skycoin/src/daemon/pex) diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/pex/peerlist.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/pex/peerlist.go new file mode 100644 index 00000000..bcea692c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/pex/peerlist.go @@ -0,0 +1,417 @@ +package pex + +import ( + "encoding/json" + "fmt" + "io" + "math/rand" + "os" + "time" + + "github.com/sirupsen/logrus" + + "github.com/SkycoinProject/skycoin/src/util/file" + "github.com/SkycoinProject/skycoin/src/util/useragent" +) + +// Peers peer list +type Peers []Peer + +// ToAddrs returns the address list +func (ps Peers) ToAddrs() []string { + addrs := make([]string, 0, len(ps)) + for _, p := range ps { + addrs = append(addrs, p.Addr) + } + return addrs +} + +// peerlist is a map of addresses to *PeerStates +type peerlist struct { + peers map[string]*Peer +} + +func newPeerlist() peerlist { + return peerlist{ + peers: make(map[string]*Peer), + } +} + +// Filter peers filter +type Filter func(peer Peer) bool + +// loadCachedPeersFile loads peers from the cached peers.json file +func loadCachedPeersFile(path string) (map[string]*Peer, error) { + peersJSON := make(map[string]PeerJSON) + err := file.LoadJSON(path, &peersJSON) + + if os.IsNotExist(err) { + logger.WithField("path", path).Info("File does not exist") + return nil, nil + } else if err == io.EOF { + logger.WithField("path", path).Error("Corrupt or empty file") + return nil, nil + } + + if err != nil { + logger.WithField("path", path).WithError(err).Error("Failed to load peers file") + return nil, err + } + + peers := make(map[string]*Peer, len(peersJSON)) + for addr, peerJSON := range peersJSON { + fields := logrus.Fields{ + "addr": addr, + "path": path, + } + + a, err := validateAddress(addr, true) + + if err != nil { + logger.WithError(err).WithFields(fields).Error("Invalid address in peers JSON file") + continue + } + + peer, err := newPeerFromJSON(peerJSON) + if err != nil { + logger.WithError(err).WithFields(fields).Error("newPeerFromJSON failed") + continue + } + + if a != peer.Addr { + fields["peerAddr"] = peer.Addr + logger.WithFields(fields).Error("Address key does not match Peer.Addr") + continue + } + + peers[a] = peer + } + + return peers, nil +} + +func (pl *peerlist) setPeers(peers []Peer) { + for _, p := range peers { + np := p + pl.peers[p.Addr] = &np + } +} + +func (pl *peerlist) hasPeer(addr string) bool { + p, ok := pl.peers[addr] + return ok && p != nil +} + +func (pl *peerlist) addPeer(addr string) { + if p, ok := pl.peers[addr]; ok && p != nil { + p.Seen() + return + } + + peer := NewPeer(addr) + pl.peers[addr] = peer +} + +func (pl *peerlist) addPeers(addrs []string) { + for _, addr := range addrs { + pl.addPeer(addr) + } +} + +func (pl *peerlist) seen(addr string) { + if p, ok := pl.peers[addr]; ok && p != nil { + p.Seen() + } +} + +// getCanTryPeers returns all peers that are triable(retried times blew exponential backoff times) +// and are able to pass the filters. +func (pl *peerlist) getCanTryPeers(flts []Filter) Peers { + ps := make(Peers, 0) + flts = append([]Filter{canTry}, flts...) +loop: + for _, p := range pl.peers { + for i := range flts { + if !flts[i](*p) { + continue loop + } + } + + ps = append(ps, *p) + } + + return ps +} + +// getPeers returns all peers that can pass the filters. +func (pl *peerlist) getPeers(flts []Filter) Peers { + ps := make(Peers, 0) +loop: + for _, p := range pl.peers { + for i := range flts { + if !flts[i](*p) { + continue loop + } + } + + ps = append(ps, *p) + } + + return ps +} + +// filters +func isPrivate(p Peer) bool { + return p.Private +} + +func isPublic(p Peer) bool { + return !p.Private +} + +func isTrusted(p Peer) bool { + return p.Trusted +} + +func hasIncomingPort(p Peer) bool { + return p.HasIncomingPort +} + +func canTry(p Peer) bool { + return p.CanTry() +} + +// isExchangeable filters exchangeable peers +var isExchangeable = []Filter{hasIncomingPort, isPublic} + +// removePeer removes peer +func (pl *peerlist) removePeer(addr string) { + delete(pl.peers, addr) +} + +// SetPrivate sets specific peer as private +func (pl *peerlist) setPrivate(addr string, private bool) error { + if p, ok := pl.peers[addr]; ok { + p.Private = private + return nil + } + + return fmt.Errorf("set peer.Private failed: %v does not exist in peer list", addr) +} + +// setTrusted sets peer as trusted peer +func (pl *peerlist) setTrusted(addr string, trusted bool) error { + if p, ok := pl.peers[addr]; ok { + p.Trusted = trusted + return nil + } + + return fmt.Errorf("set peer.Trusted failed: %v does not exist in peer list", addr) +} + +// setAllUntrusted unsets the trusted field on all peers +func (pl *peerlist) setAllUntrusted() { + for _, p := range pl.peers { + p.Trusted = false + } +} + +// setHasIncomingPort marks the peer's port as being publicly accessible +func (pl *peerlist) setHasIncomingPort(addr string, hasIncomingPort bool) error { + if p, ok := pl.peers[addr]; ok { + p.HasIncomingPort = hasIncomingPort + p.Seen() + return nil + } + + return fmt.Errorf("set peer.HasIncomingPort failed: %v does not exist in peer list", addr) +} + +// setUserAgent sets a peer's user agent +func (pl *peerlist) setUserAgent(addr string, userAgent useragent.Data) error { + if p, ok := pl.peers[addr]; ok { + p.UserAgent = userAgent + p.Seen() + return nil + } + + return fmt.Errorf("set peer.UserAgent failed: %v does not exist in peer list", addr) +} + +// len returns number of peers +func (pl *peerlist) len() int { + return len(pl.peers) +} + +// getPeer returns peer for a given address +func (pl *peerlist) getPeer(addr string) (Peer, bool) { + p, ok := pl.peers[addr] + if ok { + return *p, true + } + return Peer{}, false +} + +// clearOld removes public, untrusted peers that haven't been seen in timeAgo seconds +func (pl *peerlist) clearOld(timeAgo time.Duration) { + t := time.Now().UTC() + for addr, peer := range pl.peers { + lastSeen := time.Unix(peer.LastSeen, 0) + if !peer.Private && !peer.Trusted && t.Sub(lastSeen) > timeAgo { + delete(pl.peers, addr) + } + } +} + +// Returns n random peers, or all of the peers, whichever is lower. +// If count is 0, all of the peers are returned, shuffled. +func (pl *peerlist) random(count int, flts []Filter) Peers { + keys := pl.getCanTryPeers(flts).ToAddrs() + if len(keys) == 0 { + return Peers{} + } + + max := count + if max == 0 || max > len(keys) { + max = len(keys) + } + + ps := make(Peers, max) + perm := rand.Perm(len(keys)) + for i, j := range perm[:max] { + ps[i] = *pl.peers[keys[j]] + } + return ps +} + +// save saves known peers to disk as a newline delimited list of addresses to +// +func (pl *peerlist) save(fn string) error { + // filter the peers that has retrytime > MaxPeerRetryTimes + peers := make(map[string]PeerJSON) + for k, p := range pl.peers { + if p.RetryTimes <= MaxPeerRetryTimes { + peers[k] = newPeerJSON(*p) + } + } + + if err := file.SaveJSON(fn, peers, 0600); err != nil { + return fmt.Errorf("save peer list failed: %s", err) + } + return nil +} + +// increaseRetryTimes increases retry times +func (pl *peerlist) increaseRetryTimes(addr string) { + if p, ok := pl.peers[addr]; ok { + p.IncreaseRetryTimes() + p.Seen() + } +} + +// resetRetryTimes reset retry times +func (pl *peerlist) resetRetryTimes(addr string) { + if p, ok := pl.peers[addr]; ok { + p.ResetRetryTimes() + p.Seen() + } +} + +// resetAllRetryTimes reset all peers' retry times +func (pl *peerlist) resetAllRetryTimes() { + logger.Info("Reset all peer's retry times") + for _, p := range pl.peers { + p.ResetRetryTimes() + } +} + +func (pl *peerlist) findOldestUntrustedPeer() *Peer { + var oldest *Peer + + for _, p := range pl.peers { + if p.Trusted || p.Private { + continue + } + + if oldest == nil || p.LastSeen < oldest.LastSeen { + oldest = p + } + } + + if oldest != nil { + p := *oldest + return &p + } + + return nil +} + +// PeerJSON is for saving and loading peers to disk. Some fields are strange, +// to be backwards compatible due to variable name changes +type PeerJSON struct { + Addr string // An address of the form ip:port + // Unix timestamp when this peer was last seen. + // This could be a time.Time string or an int64 timestamp + LastSeen interface{} + Private bool // Whether it should omitted from public requests + Trusted bool // Whether this peer is trusted + HasIncomePort *bool `json:"HasIncomePort,omitempty"` // Whether this peer has incoming port [DEPRECATED] + HasIncomingPort *bool // Whether this peer has incoming port + UserAgent useragent.Data +} + +// newPeerJSON returns a PeerJSON from a Peer +func newPeerJSON(p Peer) PeerJSON { + return PeerJSON{ + Addr: p.Addr, + LastSeen: p.LastSeen, + Private: p.Private, + Trusted: p.Trusted, + HasIncomingPort: &p.HasIncomingPort, + UserAgent: p.UserAgent, + } +} + +// newPeerFromJSON converts a PeerJSON to a Peer +func newPeerFromJSON(p PeerJSON) (*Peer, error) { + hasIncomingPort := false + if p.HasIncomingPort != nil { + hasIncomingPort = *p.HasIncomingPort + } else if p.HasIncomePort != nil { + hasIncomingPort = *p.HasIncomePort + } + + // LastSeen could be a RFC3339Nano timestamp or an int64 unix timestamp + var lastSeen int64 + switch p.LastSeen.(type) { + case string: + lastSeenTime, err := time.Parse(time.RFC3339Nano, p.LastSeen.(string)) + if err != nil { + return nil, err + } + lastSeen = lastSeenTime.Unix() + case json.Number: + lastSeenNum := p.LastSeen.(json.Number) + var err error + lastSeen, err = lastSeenNum.Int64() + if err != nil { + return nil, err + } + default: + return nil, fmt.Errorf("Invalid type %T for LastSeen field", p.LastSeen) + } + + addr, err := validateAddress(p.Addr, true) + if err != nil { + return nil, err + } + + return &Peer{ + Addr: addr, + LastSeen: lastSeen, + Private: p.Private, + Trusted: p.Trusted, + HasIncomingPort: hasIncomingPort, + UserAgent: p.UserAgent, + }, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/pex/peerlist_test.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/pex/peerlist_test.go new file mode 100644 index 00000000..f5d49aac --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/pex/peerlist_test.go @@ -0,0 +1,632 @@ +package pex + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "os" + "strings" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/util/file" +) + +var testPeers = []string{ + "112.32.32.14:7200", + "112.32.32.15:7200", + "112.32.32.16:7200", + "112.32.32.17:7200", +} + +var wrongPortPeer = "112.32.32.14:1" + +/* Peer tests */ + +func TestNewPeer(t *testing.T) { + p := NewPeer(testPeers[0]) + require.NotEqual(t, p.LastSeen, 0) + require.Equal(t, p.Addr, testPeers[0]) + require.False(t, p.Private) +} + +func TestPeerSeen(t *testing.T) { + p := NewPeer(testPeers[0]) + x := p.LastSeen + time.Sleep(time.Second) + p.Seen() + require.NotEqual(t, x, p.LastSeen) + if p.LastSeen < x { + t.Fail() + } +} + +func TestPeerString(t *testing.T) { + p := NewPeer(testPeers[0]) + require.Equal(t, testPeers[0], p.String()) +} + +func TestLoadPeersFromFile(t *testing.T) { + tt := []struct { + name string + noFile bool + emptyFile bool + ps []string + expectPeers map[string]*Peer + err error + }{ + { + "no file", + true, + false, + testPeers[0:0], + map[string]*Peer{}, + nil, + }, + { + "one addr", + false, + false, + testPeers[:1], + map[string]*Peer{ + testPeers[0]: NewPeer(testPeers[0]), + }, + nil, + }, + { + "two addr", + false, + false, + testPeers[:2], + map[string]*Peer{ + testPeers[0]: NewPeer(testPeers[0]), + testPeers[1]: NewPeer(testPeers[1]), + }, + nil, + }, + { + "empty peer list file", + false, + true, + testPeers[0:0], + map[string]*Peer{}, + nil, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + f, removeFile := preparePeerlistFile(t) + if !tc.emptyFile { + persistPeers(t, f, tc.ps) + } + + if tc.noFile { + // remove file immediately + removeFile() + } else { + defer removeFile() + } + + peers, err := loadCachedPeersFile(f) + require.Equal(t, tc.err, err) + require.Equal(t, len(tc.expectPeers), len(peers)) + for k, v := range tc.expectPeers { + p, ok := peers[k] + require.True(t, ok) + peersEqualWithSeenAllowedDiff(t, *v, *p) + } + }) + } +} + +func TestPeerlistSetPeers(t *testing.T) { + tt := []struct { + name string + peers []Peer + expect map[string]Peer + }{ + { + "empty peers", + []Peer{}, + map[string]Peer{}, + }, + { + "one peer", + []Peer{*NewPeer(testPeers[0])}, + map[string]Peer{ + testPeers[0]: *NewPeer(testPeers[0]), + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pl := newPeerlist() + pl.setPeers(tc.peers) + require.Equal(t, len(tc.expect), len(pl.peers)) + for k, v := range tc.expect { + p, ok := pl.peers[k] + require.True(t, ok) + peersEqualWithSeenAllowedDiff(t, v, *p) + } + }) + } +} + +func TestPeerlistAddPeer(t *testing.T) { + tt := []struct { + name string + initPeers []Peer + addPeer string + dup bool + expectPeers map[string]*Peer + }{ + { + "add peer to empty peer list", + []Peer{}, + testPeers[0], + false, + map[string]*Peer{ + testPeers[0]: NewPeer(testPeers[0]), + }, + }, + { + "add peer to none empty peer list", + []Peer{*NewPeer(testPeers[0])}, + testPeers[1], + false, + map[string]*Peer{ + testPeers[0]: NewPeer(testPeers[0]), + testPeers[1]: NewPeer(testPeers[1]), + }, + }, + { + "add dup peer", + []Peer{{Addr: testPeers[0]}}, + testPeers[0], + true, + map[string]*Peer{ + testPeers[0]: NewPeer(testPeers[0]), + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pl := newPeerlist() + // init the peers + pl.setPeers(tc.initPeers) + + if tc.dup { + // sleep a second so that LastSeen is diff + time.Sleep(time.Second) + } + + // add peer + pl.addPeer(tc.addPeer) + + require.Equal(t, len(tc.expectPeers), len(pl.peers)) + for k, v := range tc.expectPeers { + p, ok := pl.peers[k] + require.True(t, ok) + if tc.dup { + require.True(t, p.LastSeen > v.LastSeen) + continue + } + + peersEqualWithSeenAllowedDiff(t, *v, *p) + } + }) + } +} + +func TestPeerlistAddPeers(t *testing.T) { + tt := []struct { + name string + initPeers []Peer + addPeers []string + expectPeers map[string]*Peer + }{ + { + "add one peer to empty list", + []Peer{}, + testPeers[:1], + map[string]*Peer{ + testPeers[0]: NewPeer(testPeers[0]), + }, + }, + { + "add two peer to none empty list", + []Peer{*NewPeer(testPeers[0])}, + testPeers[1:3], + map[string]*Peer{ + testPeers[0]: NewPeer(testPeers[0]), + testPeers[1]: NewPeer(testPeers[1]), + testPeers[2]: NewPeer(testPeers[2]), + }, + }, + { + "add dup peers", + []Peer{*NewPeer(testPeers[0])}, + testPeers[:3], + map[string]*Peer{ + testPeers[0]: NewPeer(testPeers[0]), + testPeers[1]: NewPeer(testPeers[1]), + testPeers[2]: NewPeer(testPeers[2]), + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pl := newPeerlist() + // init peers + pl.setPeers(tc.initPeers) + + // add peers + pl.addPeers(tc.addPeers) + + require.Equal(t, len(tc.expectPeers), len(pl.peers)) + for k, v := range tc.expectPeers { + p, ok := pl.peers[k] + require.True(t, ok) + peersEqualWithSeenAllowedDiff(t, *v, *p) + } + }) + } +} + +func TestPeerListSetTrusted(t *testing.T) { + tt := []struct { + name string + initPeers []Peer + peer string + trust bool + err error + }{ + { + "set trust true", + []Peer{*NewPeer(testPeers[0])}, + testPeers[0], + true, + nil, + }, + { + "set trust false", + []Peer{*NewPeer(testPeers[0])}, + testPeers[0], + false, + nil, + }, + { + "set failed", + []Peer{*NewPeer(testPeers[1])}, + testPeers[0], + false, + fmt.Errorf("set peer.Trusted failed: %v does not exist in peer list", testPeers[0]), + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pl := newPeerlist() + + // init peer + pl.setPeers(tc.initPeers) + + err := pl.setTrusted(tc.peer, tc.trust) + require.Equal(t, tc.err, err) + if err != nil { + return + } + + p, ok := pl.peers[tc.peer] + require.True(t, ok) + require.Equal(t, tc.trust, p.Trusted) + }) + } +} + +func TestPeerlistFindOldestUntrustedPeer(t *testing.T) { + peer1 := Peer{ + Addr: "1.1.1.1:6060", + LastSeen: time.Now().UTC().Unix() - 60*60*24*2, + } + peer2 := Peer{ + Addr: "2.2.2.2:6060", + LastSeen: time.Now().UTC().Unix() - 60*60*24*7, + } + peer3 := Peer{ + Addr: "3.3.3.3:6060", + LastSeen: time.Now().UTC().Unix() - 60, + } + trustedPeer := Peer{ + Addr: "4.4.4.4:6060", + LastSeen: time.Now().UTC().Unix() - 60*60*24*30, + Trusted: true, + } + privatePeer := Peer{ + Addr: "5.5.5.5:6060", + LastSeen: time.Now().UTC().Unix() - 60*60*24*30, + Private: true, + } + + cases := []struct { + name string + initPeers []Peer + expect *Peer + }{ + { + name: "empty peerlist", + initPeers: []Peer{}, + expect: nil, + }, + + { + name: "no untrusted public peers", + initPeers: []Peer{ + trustedPeer, + privatePeer, + }, + expect: nil, + }, + + { + name: "one peer", + initPeers: []Peer{ + peer1, + }, + expect: &peer1, + }, + + { + name: "3 peers ignore trusted", + initPeers: []Peer{ + peer1, + trustedPeer, + peer2, + peer3, + }, + expect: &peer2, + }, + + { + name: "3 peers ignore private", + initPeers: []Peer{ + peer1, + privatePeer, + peer2, + peer3, + }, + expect: &peer2, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + pl := newPeerlist() + pl.setPeers(tc.initPeers) + + p := pl.findOldestUntrustedPeer() + require.Equal(t, tc.expect, p) + }) + } +} + +func TestPeerlistClearOld(t *testing.T) { + tt := []struct { + name string + initPeers []Peer + timeAgo time.Duration + expectPeers map[string]Peer + }{ + { + "no old peers", + []Peer{ + {Addr: testPeers[0], LastSeen: time.Now().UTC().Unix() - 100}, + }, + 110 * time.Second, + map[string]Peer{ + testPeers[0]: {Addr: testPeers[0], LastSeen: time.Now().UTC().Unix() - 100}, + }, + }, + { + "clear one old peer", + []Peer{ + {Addr: testPeers[0], LastSeen: time.Now().UTC().Unix() - 100}, + {Addr: testPeers[1], LastSeen: time.Now().UTC().Unix() - 110}, + {Addr: testPeers[2], LastSeen: time.Now().UTC().Unix() - 120}, + }, + 111 * time.Second, + map[string]Peer{ + testPeers[0]: {Addr: testPeers[0], LastSeen: time.Now().UTC().Unix() - 100}, + testPeers[1]: {Addr: testPeers[1], LastSeen: time.Now().UTC().Unix() - 110}, + }, + }, + { + "clear two old peers", + []Peer{ + {Addr: testPeers[0], LastSeen: time.Now().UTC().Unix() - 100}, + {Addr: testPeers[1], LastSeen: time.Now().UTC().Unix() - 110}, + {Addr: testPeers[2], LastSeen: time.Now().UTC().Unix() - 120}, + }, + 101 * time.Second, + map[string]Peer{ + testPeers[0]: {Addr: testPeers[0], LastSeen: time.Now().UTC().Unix() - 100}, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pl := newPeerlist() + pl.setPeers(tc.initPeers) + + pl.clearOld(tc.timeAgo) + require.Equal(t, len(pl.peers), len(tc.expectPeers)) + for _, p := range tc.expectPeers { + v, ok := pl.peers[p.Addr] + require.True(t, ok) + peersEqualWithSeenAllowedDiff(t, *v, p) + } + }) + } +} + +func TestPeerlistSave(t *testing.T) { + tt := []struct { + name string + peers []Peer + expect map[string]Peer + }{ + { + "save all", + []Peer{ + {Addr: testPeers[0]}, + {Addr: testPeers[1]}, + }, + map[string]Peer{ + testPeers[0]: {Addr: testPeers[0]}, + testPeers[1]: {Addr: testPeers[1]}, + }, + }, + { + "save one peer", + []Peer{ + {Addr: testPeers[0], RetryTimes: MaxPeerRetryTimes + 1}, + {Addr: testPeers[1]}, + }, + map[string]Peer{ + testPeers[1]: {Addr: testPeers[1]}, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pl := newPeerlist() + pl.setPeers(tc.peers) + + f, removeFile := preparePeerlistFile(t) + defer removeFile() + require.NoError(t, pl.save(f)) + + psMap, err := loadCachedPeersFile(f) + require.NoError(t, err) + for k, v := range tc.expect { + p, ok := psMap[k] + require.True(t, ok) + peersEqualWithSeenAllowedDiff(t, v, *p) + } + }) + } +} + +func TestPeerCanTry(t *testing.T) { + testData := []struct { + LastSeen int64 + RetryTimes int + CanTry bool + }{ + { + time.Now().UTC().Add(time.Duration(100) * time.Second * -1).Unix(), + 1, + true, + }, + } + + for _, d := range testData { + p := Peer{ + LastSeen: d.LastSeen, + RetryTimes: d.RetryTimes, + } + require.Equal(t, d.CanTry, p.CanTry()) + } +} + +func TestPeerJSONParsing(t *testing.T) { + // The serialized peer json format changed, + // this tests that the old format can still parse. + oldFormat := `{ + "Addr": "11.22.33.44:6000", + "LastSeen": "2017-09-24T06:42:18.999999999Z", + "Private": true, + "Trusted": true, + "HasIncomePort": true + }` + + newFormat := `{ + "Addr": "11.22.33.44:6000", + "LastSeen": 1506235338, + "Private": true, + "Trusted": true, + "HasIncomingPort": true + }` + + check := func(p *Peer) { + require.Equal(t, "11.22.33.44:6000", p.Addr) + require.True(t, p.Private) + require.True(t, p.Trusted) + require.True(t, p.HasIncomingPort) + require.Equal(t, int64(1506235338), p.LastSeen) + } + + load := func(s string) PeerJSON { + var pj PeerJSON + dec := json.NewDecoder(strings.NewReader(s)) + dec.UseNumber() + err := dec.Decode(&pj) + require.NoError(t, err) + return pj + } + + pj := load(oldFormat) + p, err := newPeerFromJSON(pj) + require.NoError(t, err) + check(p) + + pj = load(newFormat) + p, err = newPeerFromJSON(pj) + require.NoError(t, err) + check(p) +} + +func peersEqualWithSeenAllowedDiff(t *testing.T, expected Peer, actual Peer) { + require.WithinDuration(t, time.Unix(expected.LastSeen, 0), time.Unix(actual.LastSeen, 0), 1*time.Second) + expected.LastSeen = actual.LastSeen + require.Equal(t, expected, actual) +} + +// preparePeerlistFile makes peers.json in temporary dir, +func preparePeerlistFile(t *testing.T) (string, func()) { + f, err := ioutil.TempFile("", PeerCacheFilename) + require.NoError(t, err) + + return f.Name(), func() { + os.Remove(f.Name()) + } +} + +func preparePeerlistDir(t *testing.T) (string, func()) { + f, err := ioutil.TempDir("", "peerlist") + require.NoError(t, err) + + return f, func() { + os.Remove(f) + } +} + +func persistPeers(t *testing.T, fn string, peers []string) { + t.Helper() + peersMap := make(map[string]*Peer, len(peers)) + for _, p := range peers { + peersMap[p] = NewPeer(p) + } + + if err := file.SaveJSON(fn, peersMap, 0600); err != nil { + panic(fmt.Sprintf("save peer list failed: %v", err)) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/pex/pex.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/pex/pex.go new file mode 100644 index 00000000..5e267e3a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/pex/pex.go @@ -0,0 +1,761 @@ +// Package pex is a toolkit for implementing a peer exchange system +package pex + +import ( + "errors" + "fmt" + "io/ioutil" + "math" + "math/rand" + "net" + "net/http" + "os" + "path/filepath" + "regexp" + "strconv" + "strings" + "sync" + "time" + + "github.com/cenkalti/backoff" + "github.com/sirupsen/logrus" + + "github.com/SkycoinProject/skycoin/src/util/logging" + "github.com/SkycoinProject/skycoin/src/util/useragent" +) + +//TODO: +// - keep track of last time the peer was connected to +// - last time peer was connected to is more important than "seen" +// - peer "seen" means something else than use here +// - save last time connected to, use 0 for never +// - only transmit peers that have active or recent connections + +const ( + // DefaultPeerListURL is the default URL to download remote peers list from, if enabled + DefaultPeerListURL = "https://downloads.skycoin.com/blockchain/peers.txt" + // PeerCacheFilename filename for disk-cached peers + PeerCacheFilename = "peers.json" + // oldPeerCacheFilename previous filename for disk-cached peers. The cache loader will fall back onto this filename if it can't load peers.json + oldPeerCacheFilename = "peers.txt" + // MaxPeerRetryTimes is the maximum number of times to retry a peer + MaxPeerRetryTimes = 10 +) + +var ( + // ErrPeerlistFull is returned when the Pex is at a maximum + ErrPeerlistFull = errors.New("Peer list full") + // ErrInvalidAddress is returned when an address appears malformed + ErrInvalidAddress = errors.New("Invalid address") + // ErrNoLocalhost is returned if a localhost addresses are not allowed + ErrNoLocalhost = errors.New("Localhost address is not allowed") + // ErrNotExternalIP is returned if an IP address is not a global unicast address + ErrNotExternalIP = errors.New("IP is not a valid external IP") + // ErrPortTooLow is returned if a port is less than 1024 + ErrPortTooLow = errors.New("Port must be >= 1024") + // ErrBlacklistedAddress returned when attempting to add a blacklisted peer + ErrBlacklistedAddress = errors.New("Blacklisted address") + + // Logging. See http://godoc.org/github.com/op/go-logging for + // instructions on how to include this log's output + logger = logging.MustGetLogger("pex") + // Default rng + rnum = rand.New(rand.NewSource(time.Now().Unix())) + // For removing inadvertent whitespace from addresses + whitespaceFilter = regexp.MustCompile(`\s`) +) + +// validateAddress returns a sanitized address if valid, otherwise an error +func validateAddress(ipPort string, allowLocalhost bool) (string, error) { + ipPort = whitespaceFilter.ReplaceAllString(ipPort, "") + pts := strings.Split(ipPort, ":") + if len(pts) != 2 { + return "", ErrInvalidAddress + } + + ip := net.ParseIP(pts[0]) + if ip == nil { + return "", ErrInvalidAddress + } else if ip.IsLoopback() { + if !allowLocalhost { + return "", ErrNoLocalhost + } + } else if !ip.IsGlobalUnicast() { + return "", ErrNotExternalIP + } + + port, err := strconv.ParseUint(pts[1], 10, 16) + if err != nil { + return "", ErrInvalidAddress + } + + if port < 1024 { + return "", ErrPortTooLow + } + + return ipPort, nil +} + +// Peer represents a known peer +type Peer struct { + Addr string // An address of the form ip:port + LastSeen int64 // Unix timestamp when this peer was last seen + Private bool // Whether it should omitted from public requests + Trusted bool // Whether this peer is trusted + HasIncomingPort bool // Whether this peer has accessible public port + UserAgent useragent.Data // Peer's last reported user agent + RetryTimes int `json:"-"` // records the retry times +} + +// NewPeer returns a *Peer initialized by an address string of the form ip:port +func NewPeer(address string) *Peer { + p := &Peer{ + Addr: address, + Private: false, + Trusted: false, + } + p.Seen() + return p +} + +// Seen marks the peer as seen +func (peer *Peer) Seen() { + peer.LastSeen = time.Now().UTC().Unix() +} + +// IncreaseRetryTimes adds the retry times +func (peer *Peer) IncreaseRetryTimes() { + peer.RetryTimes++ + logger.WithFields(logrus.Fields{ + "addr": peer.Addr, + "retryTimes": peer.RetryTimes, + }).Debug("Increase retry times") +} + +// ResetRetryTimes resets the retry time +func (peer *Peer) ResetRetryTimes() { + peer.RetryTimes = 0 +} + +// CanTry returns whether this peer is tryable base on the exponential backoff algorithm +func (peer *Peer) CanTry() bool { + // Exponential backoff + mod := (math.Exp2(float64(peer.RetryTimes)) - 1) * 5 + if mod == 0 { + return true + } + + // Random time elapsed + now := time.Now().UTC().Unix() + t := rnum.Int63n(int64(mod)) + return now-peer.LastSeen > t +} + +// String returns the peer address +func (peer *Peer) String() string { + return peer.Addr +} + +// Config pex config +type Config struct { + // Folder where peers database should be saved + DataDirectory string + // Maximum number of peers to keep account of in the PeerList + Max int + // Cull peers after they havent been seen in this much time + Expiration time.Duration + // Cull expired peers on this interval + CullRate time.Duration + // clear old peers on this interval + ClearOldRate time.Duration + // How often to clear expired blacklist entries + UpdateBlacklistRate time.Duration + // How often to request peers via PEX + RequestRate time.Duration + // How many peers to send back in response to a peers request + ReplyCount int + // Localhost peers are allowed in the peerlist + AllowLocalhost bool + // Disable exchanging of peers. Peers are still loaded from disk + Disabled bool + // Whether the network is disabled + NetworkDisabled bool + // Download peers list from remote host + DownloadPeerList bool + // Download peers list from this URL + PeerListURL string + // Set all peers as untrusted (even if loaded from DefaultConnections) + DisableTrustedPeers bool + // Load peers from this file on disk. NOTE: this is different from the peers file cache in the data directory + CustomPeersFile string + // Default "trusted" connections + DefaultConnections []string +} + +// NewConfig creates default pex config. +func NewConfig() Config { + return Config{ + DataDirectory: "./", + Max: 65535, + Expiration: time.Hour * 24 * 7, + CullRate: time.Minute * 10, + ClearOldRate: time.Minute * 10, + UpdateBlacklistRate: time.Minute, + RequestRate: time.Minute, + ReplyCount: 30, + AllowLocalhost: false, + Disabled: false, + NetworkDisabled: false, + DownloadPeerList: false, + PeerListURL: DefaultPeerListURL, + DisableTrustedPeers: false, + CustomPeersFile: "", + } +} + +// Pex manages a set of known peers and controls peer acquisition +type Pex struct { + sync.RWMutex + // All known peers + peerlist peerlist + Config Config + quit chan struct{} + done chan struct{} +} + +// New creates pex +func New(cfg Config) (*Pex, error) { + pex := &Pex{ + Config: cfg, + peerlist: newPeerlist(), + quit: make(chan struct{}), + done: make(chan struct{}), + } + + // Load peers from disk + if err := pex.loadCache(); err != nil { + logger.Critical().WithError(err).Error("pex.loadCache failed") + return nil, err + } + + // Unset trusted status from any existing peers, regenerate + // them from the DefaultConnections + pex.setAllUntrusted() + + // Load default hardcoded peers, mark them as trusted + for _, addr := range cfg.DefaultConnections { + // Default peers will mark as trusted peers. + if err := pex.AddPeer(addr); err != nil { + logger.Critical().WithError(err).Error("Add default peer failed") + return nil, err + } + if err := pex.setTrusted(addr); err != nil { + logger.Critical().WithError(err).Error("pex.setTrusted for default peer failed") + return nil, err + } + } + + if cfg.DisableTrustedPeers { + // Unset trusted status from any existing peers + pex.setAllUntrusted() + } + + // Add custom peers + if cfg.CustomPeersFile != "" { + if err := pex.loadCustom(cfg.CustomPeersFile); err != nil { + logger.Critical().WithError(err).WithField("file", cfg.CustomPeersFile).Error("Failed to load custom peers file") + return nil, err + } + } + + // Save peers to disk + if err := pex.save(); err != nil { + return nil, err + } + + // Download peers from remote peers list if networking is enabled + if pex.Config.DownloadPeerList && !pex.Config.NetworkDisabled { + go func() { + if err := pex.downloadPeers(); err != nil { + logger.WithError(err).Error("Failed to download peers list") + } + }() + } + + return pex, nil +} + +// Run starts the pex service +func (px *Pex) Run() error { + logger.Info("Pex.Run started") + defer logger.Info("Pex.Run stopped") + defer close(px.done) + + defer func() { + // Save the peerlist + logger.Info("Save peerlist") + if err := px.save(); err != nil { + logger.WithError(err).Error("Save peerlist failed") + } + }() + + clearOldTicker := time.NewTicker(px.Config.ClearOldRate) + + for { + select { + case <-clearOldTicker.C: + // Remove peers we haven't seen in a while + if !px.Config.Disabled && !px.Config.NetworkDisabled { + func() { + px.Lock() + defer px.Unlock() + px.peerlist.clearOld(px.Config.Expiration) + }() + } + case <-px.quit: + return nil + } + } +} + +// Shutdown notifies the pex service to exist +func (px *Pex) Shutdown() { + logger.Info("Shutting down pex") + defer logger.Info("Pex shutdown") + close(px.quit) + <-px.done +} + +func (px *Pex) downloadPeers() error { + body, err := backoffDownloadText(px.Config.PeerListURL) + if err != nil { + logger.WithError(err).WithField("url", px.Config.PeerListURL).Error("Failed to download peers") + return err + } + + peers := parseRemotePeerList(body) + logger.WithField("url", px.Config.PeerListURL).Infof("Downloaded peers list, got %d peers", len(peers)) + + n := px.AddPeers(peers) + logger.WithField("url", px.Config.PeerListURL).Infof("Added %d/%d peers from downloaded peers list", n, len(peers)) + + return nil +} + +func (px *Pex) loadCache() error { + px.Lock() + defer px.Unlock() + + fp := filepath.Join(px.Config.DataDirectory, PeerCacheFilename) + peers, err := loadCachedPeersFile(fp) + + if err != nil { + return err + } + + // If the PeerCacheFilename peers.json file does not exist, try to load the old peers.txt file + if peers == nil { + logger.Infof("Peer cache %s not found, falling back on %s", PeerCacheFilename, oldPeerCacheFilename) + + fp := filepath.Join(px.Config.DataDirectory, oldPeerCacheFilename) + peers, err = loadCachedPeersFile(fp) + if err != nil { + return err + } + + if peers == nil { + logger.Infof("Fallback peer cache %s not found", oldPeerCacheFilename) + return nil + } + } + + // remove invalid peers and limit the max number of peers to pex.Config.Max + var validPeers []Peer + for addr, p := range peers { + if _, err := validateAddress(addr, px.Config.AllowLocalhost); err != nil { + logger.WithError(err).Error("Invalid peer address") + continue + } + + validPeers = append(validPeers, *p) + if px.Config.Max > 0 && len(validPeers) >= px.Config.Max { + break + } + } + + px.peerlist.setPeers(validPeers) + return nil +} + +func (px *Pex) loadCustom(fn string) error { + px.Lock() + defer px.Unlock() + + f, err := os.Open(fn) + if err != nil { + return err + } + + defer f.Close() + + data, err := ioutil.ReadAll(f) + if err != nil { + return err + } + + peers, err := parseLocalPeerList(string(data), px.Config.AllowLocalhost) + if err != nil { + return err + } + + logger.Infof("Loaded %d peers from %s", len(peers), fn) + + px.peerlist.addPeers(peers) + return nil +} + +// SavePeers persists the peerlist +func (px *Pex) save() error { + px.Lock() + defer px.Unlock() + + fn := filepath.Join(px.Config.DataDirectory, PeerCacheFilename) + return px.peerlist.save(fn) +} + +// AddPeer adds a peer to the peer list, given an address. If the peer list is +// full, it will try to remove an old peer to make room. +// If no room can be made, ErrPeerlistFull is returned +func (px *Pex) AddPeer(addr string) error { + px.Lock() + defer px.Unlock() + + cleanAddr, err := validateAddress(addr, px.Config.AllowLocalhost) + if err != nil { + logger.WithError(err).WithField("addr", addr).Error("Invalid address") + return ErrInvalidAddress + } + + if px.peerlist.hasPeer(cleanAddr) { + px.peerlist.seen(cleanAddr) + return nil + } + + if px.isFull() { + oldestPeer := px.peerlist.findOldestUntrustedPeer() + if oldestPeer == nil || time.Now().UTC().Unix()-oldestPeer.LastSeen < 60*60*24 { + return ErrPeerlistFull + } + + px.peerlist.removePeer(oldestPeer.Addr) + + if px.isFull() { + // This can happen if the node is run with a peers.json file that has more peers + // than the max peerlist size, then the peers.json file isn't truncated to the max peerlist size. + // It is not an error. + // The max is a soft limit; exceeding the max will not crash the program. + logger.Critical().Error("AddPeer: after removing the worst peer, the peerlist was still full") + } + } + + px.peerlist.addPeer(cleanAddr) + return nil +} + +// AddPeers add multiple peers at once. Any errors will be logged, but not returned +// Returns the number of peers that were added without error. Note that +// adding a duplicate peer will not cause an error. +func (px *Pex) AddPeers(addrs []string) int { + px.Lock() + defer px.Unlock() + + if px.Config.Max > 0 && px.peerlist.len() >= px.Config.Max { + logger.Warning("Add peers failed, peer list is full") + return 0 + } + + // validate the addresses + var validAddrs []string + for _, addr := range addrs { + a, err := validateAddress(addr, px.Config.AllowLocalhost) + if err != nil { + logger.WithField("addr", addr).WithError(err).Info("Add peers sees an invalid address") + continue + } + validAddrs = append(validAddrs, a) + } + addrs = validAddrs + + // Shuffle the addresses before capping them + rand.Shuffle(len(addrs), func(i, j int) { + addrs[i], addrs[j] = addrs[j], addrs[i] + }) + + if px.Config.Max > 0 { + rcap := px.Config.Max - px.peerlist.len() + if len(addrs) > rcap { + addrs = addrs[:rcap] + } + } + + px.peerlist.addPeers(addrs) + return len(addrs) +} + +// SetPrivate updates peer's private value +func (px *Pex) SetPrivate(addr string, private bool) error { + px.Lock() + defer px.Unlock() + + cleanAddr, err := validateAddress(addr, px.Config.AllowLocalhost) + if err != nil { + logger.WithError(err).WithField("addr", addr).Error("Invalid address") + return ErrInvalidAddress + } + + return px.peerlist.setPrivate(cleanAddr, private) +} + +// setTrusted marks a peer as a default peer by setting its trusted flag to true +func (px *Pex) setTrusted(addr string) error { + px.Lock() + defer px.Unlock() + + cleanAddr, err := validateAddress(addr, px.Config.AllowLocalhost) + if err != nil { + logger.WithError(err).WithField("addr", addr).Error("Invalid address") + return ErrInvalidAddress + } + + return px.peerlist.setTrusted(cleanAddr, true) +} + +// setAllUntrusted unsets the trusted field on all peers +func (px *Pex) setAllUntrusted() { + px.Lock() + defer px.Unlock() + + px.peerlist.setAllUntrusted() +} + +// SetHasIncomingPort sets if the peer has public port +func (px *Pex) SetHasIncomingPort(addr string, hasPublicPort bool) error { + px.Lock() + defer px.Unlock() + + cleanAddr, err := validateAddress(addr, px.Config.AllowLocalhost) + if err != nil { + logger.WithError(err).WithField("addr", addr).Error("Invalid address") + return ErrInvalidAddress + } + + return px.peerlist.setHasIncomingPort(cleanAddr, hasPublicPort) +} + +// SetUserAgent sets the peer's user agent +func (px *Pex) SetUserAgent(addr string, userAgent useragent.Data) error { + px.Lock() + defer px.Unlock() + + if !userAgent.Empty() { + if _, err := userAgent.Build(); err != nil { + return err + } + } + + cleanAddr, err := validateAddress(addr, px.Config.AllowLocalhost) + if err != nil { + logger.WithError(err).WithField("addr", addr).Error("Invalid address") + return ErrInvalidAddress + } + + return px.peerlist.setUserAgent(cleanAddr, userAgent) +} + +// RemovePeer removes peer +func (px *Pex) RemovePeer(addr string) { + px.Lock() + defer px.Unlock() + px.peerlist.removePeer(addr) +} + +// GetPeer returns peer of given address +func (px *Pex) GetPeer(addr string) (Peer, bool) { + px.RLock() + defer px.RUnlock() + return px.peerlist.getPeer(addr) +} + +// Trusted returns trusted peers +func (px *Pex) Trusted() Peers { + px.RLock() + defer px.RUnlock() + return px.peerlist.getPeers([]Filter{isTrusted}) +} + +// Private returns private peers +func (px *Pex) Private() Peers { + px.RLock() + defer px.RUnlock() + return px.peerlist.getCanTryPeers([]Filter{isPrivate}) +} + +// TrustedPublic returns trusted public peers +func (px *Pex) TrustedPublic() Peers { + px.RLock() + defer px.RUnlock() + return px.peerlist.getCanTryPeers([]Filter{isPublic, isTrusted}) +} + +// RandomPublic returns N random public untrusted peers +func (px *Pex) RandomPublic(n int) Peers { + px.RLock() + defer px.RUnlock() + return px.peerlist.random(n, []Filter{func(p Peer) bool { + return !p.Private + }}) +} + +// RandomExchangeable returns N random exchangeable peers +func (px *Pex) RandomExchangeable(n int) Peers { + px.RLock() + defer px.RUnlock() + return px.peerlist.random(n, isExchangeable) +} + +// IncreaseRetryTimes increases retry times +func (px *Pex) IncreaseRetryTimes(addr string) { + px.Lock() + defer px.Unlock() + px.peerlist.increaseRetryTimes(addr) +} + +// ResetRetryTimes reset retry times +func (px *Pex) ResetRetryTimes(addr string) { + px.Lock() + defer px.Unlock() + px.peerlist.resetRetryTimes(addr) +} + +// ResetAllRetryTimes reset all peers' retry times +func (px *Pex) ResetAllRetryTimes() { + px.Lock() + defer px.Unlock() + px.peerlist.resetAllRetryTimes() +} + +// IsFull returns whether the peer list is full +func (px *Pex) IsFull() bool { + px.RLock() + defer px.RUnlock() + return px.isFull() +} + +func (px *Pex) isFull() bool { + return px.Config.Max > 0 && px.peerlist.len() >= px.Config.Max +} + +// downloadText downloads a text format file from url. +// Returns the raw response body as a string. +// TODO -- move to util, add backoff options +func downloadText(url string) (string, error) { + resp, err := http.Get(url) //nolint:gosec + if err != nil { + return "", err + } + defer resp.Body.Close() + + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return "", err + } + + return string(body), nil +} + +func backoffDownloadText(url string) (string, error) { + var body string + + b := backoff.NewExponentialBackOff() + + notify := func(err error, wait time.Duration) { + logger.WithError(err).WithField("waitTime", wait).Error("waiting to retry downloadText") + } + + operation := func() error { + logger.WithField("url", url).Info("Trying to download peers list") + var err error + body, err = downloadText(url) + return err + } + + if err := backoff.RetryNotify(operation, b, notify); err != nil { + logger.WithField("url", url).WithError(err).Info("Gave up dowloading peers list") + return "", err + } + + logger.WithField("url", url).Info("Peers list downloaded") + + return body, nil +} + +// parseRemotePeerList parses a remote peers.txt file +// The peers list format is newline separated list of ip:port strings +// Any lines that don't parse to an ip:port are skipped, otherwise they return an error +// Localhost ip:port addresses are ignored +// NOTE: this does not parse the cached peers.json file in the data directory, which is a JSON file +// and is loaded by loadCachedPeersFile +func parseRemotePeerList(body string) []string { + var peers []string + for _, addr := range strings.Split(body, "\n") { + addr = whitespaceFilter.ReplaceAllString(addr, "") + if addr == "" { + continue + } + + // Never allow localhost addresses from the remote peers list + a, err := validateAddress(addr, false) + if err != nil { + err = fmt.Errorf("Peers list has invalid address %s: %v", addr, err) + logger.WithError(err).Error() + continue + } + + peers = append(peers, a) + } + + return peers +} + +// parseLocalPeerList parses a local peers.txt file +// The peers list format is newline separated list of ip:port strings +// Empty lines and lines that begin with # are treated as comment lines +// Otherwise, the line is parsed as an ip:port +// If the line fails to parse, an error is returned +// Localhost addresses are allowed if allowLocalhost is true +// NOTE: this does not parse the cached peers.json file in the data directory, which is a JSON file +// and is loaded by loadCachedPeersFile +func parseLocalPeerList(body string, allowLocalhost bool) ([]string, error) { + var peers []string + for _, addr := range strings.Split(body, "\n") { + addr = whitespaceFilter.ReplaceAllString(addr, "") + if addr == "" { + continue + } + + if strings.HasPrefix(addr, "#") { + continue + } + + a, err := validateAddress(addr, allowLocalhost) + if err != nil { + err = fmt.Errorf("Peers list has invalid address %s: %v", addr, err) + logger.WithError(err).Error() + return nil, err + } + + peers = append(peers, a) + } + + return peers, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/pex/pex_test.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/pex/pex_test.go new file mode 100644 index 00000000..eb62a94e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/pex/pex_test.go @@ -0,0 +1,1610 @@ +package pex + +import ( + "fmt" + "io/ioutil" + "os" + "path/filepath" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/util/file" +) + +func TestValidateAddress(t *testing.T) { + cases := []struct { + addr string + allowLocalhost bool + err error + cleanAddr string + }{ + { + addr: "", + allowLocalhost: false, + err: ErrInvalidAddress, + }, + { + addr: "112.32.32.14:100112.32.32.14:101", + allowLocalhost: false, + err: ErrInvalidAddress, + }, + { + addr: "112.32.32.14", + allowLocalhost: false, + err: ErrInvalidAddress, + }, + { + addr: "112", + allowLocalhost: false, + err: ErrInvalidAddress, + }, + { + addr: "112.32", + allowLocalhost: false, + err: ErrInvalidAddress, + }, + { + addr: "112.32.32", + allowLocalhost: false, + err: ErrInvalidAddress, + }, + { + addr: "112.32.32.14000", + allowLocalhost: false, + err: ErrInvalidAddress, + }, + { + addr: "112.32.32.14:66666", + allowLocalhost: false, + err: ErrInvalidAddress, + }, + { + addr: "0.0.0.0:8888", + allowLocalhost: false, + err: ErrNotExternalIP, + }, + { + addr: ":8888", + allowLocalhost: false, + err: ErrInvalidAddress, + }, + { + addr: "224.1.1.1:8888", + allowLocalhost: false, + err: ErrNotExternalIP, + }, + { + addr: "112.32.32.14:0", + allowLocalhost: false, + err: ErrPortTooLow, + }, + { + addr: "112.32.32.14:1", + allowLocalhost: false, + err: ErrPortTooLow, + }, + { + addr: "112.32.32.14:10", + allowLocalhost: false, + err: ErrPortTooLow, + }, + { + addr: "112.32.32.14:100", + allowLocalhost: false, + err: ErrPortTooLow, + }, + { + addr: "112.32.32.14:1000", + allowLocalhost: false, + err: ErrPortTooLow, + }, + { + addr: "112.32.32.14:1023", + allowLocalhost: false, + err: ErrPortTooLow, + }, + { + addr: "112.32.32.14:65536", + allowLocalhost: false, + err: ErrInvalidAddress, + }, + { + addr: "112.32.32.14:1024", + allowLocalhost: false, + }, + { + addr: "112.32.32.14:10000", + allowLocalhost: false, + }, + { + addr: "112.32.32.14:65535", + allowLocalhost: false, + }, + { + addr: "127.0.0.1:8888", + allowLocalhost: true, + }, + { + addr: "127.0.0.1:8888", + allowLocalhost: false, + err: ErrNoLocalhost, + }, + { + addr: "11.22.33.44:8080", + allowLocalhost: false, + }, + { + addr: " 11.22.33.44:8080\n", + allowLocalhost: false, + cleanAddr: "11.22.33.44:8080", + }, + } + + for _, tc := range cases { + name := fmt.Sprintf("%+v", tc) + t.Run(name, func(t *testing.T) { + cleanAddr, err := validateAddress(tc.addr, tc.allowLocalhost) + require.Equal(t, tc.err, err) + + if err == nil { + if tc.cleanAddr == "" { + require.Equal(t, tc.addr, cleanAddr) + } else { + require.Equal(t, tc.cleanAddr, cleanAddr) + } + } + }) + } +} + +func TestNewPex(t *testing.T) { + dir, err := ioutil.TempDir("", "peerlist") + require.NoError(t, err) + defer os.Remove(dir) + + config := NewConfig() + config.DataDirectory = dir + config.DefaultConnections = testPeers[:] + + // Add a peer and register it as a default peer. + // It will be marked as "trusted" + // in the peers cache file, but the next time it is loaded, + // it will be reset to untrusted because it is not in the + // cfg.DefaultConnections + addr := "11.22.33.44:5566" + config.DefaultConnections = append(config.DefaultConnections, addr) + + _, err = New(config) + require.NoError(t, err) + + // check if peers are saved to disk + peers, err := loadCachedPeersFile(filepath.Join(dir, PeerCacheFilename)) + require.NoError(t, err) + + require.Equal(t, len(testPeers)+1, len(peers)) + + for _, p := range append(testPeers, addr) { + v, ok := peers[p] + require.True(t, ok) + require.True(t, v.Trusted) + } + + // Recreate pex with the extra peer removed from DefaultConnections + config.DefaultConnections = config.DefaultConnections[:len(config.DefaultConnections)-1] + _, err = New(config) + require.NoError(t, err) + + peers, err = loadCachedPeersFile(filepath.Join(dir, PeerCacheFilename)) + require.NoError(t, err) + + require.Equal(t, len(testPeers)+1, len(peers)) + + for _, p := range testPeers { + v, ok := peers[p] + require.True(t, ok) + require.True(t, v.Trusted) + } + + v, ok := peers[addr] + require.True(t, ok) + require.False(t, v.Trusted) +} + +func TestNewPexDisableTrustedPeers(t *testing.T) { + dir, err := ioutil.TempDir("", "peerlist") + require.NoError(t, err) + defer os.Remove(dir) + + config := NewConfig() + config.DataDirectory = dir + config.DefaultConnections = testPeers[:] + config.DisableTrustedPeers = true + + _, err = New(config) + require.NoError(t, err) + + // check if peers are saved to disk + peers, err := loadCachedPeersFile(filepath.Join(dir, PeerCacheFilename)) + require.NoError(t, err) + + for _, p := range testPeers { + v, ok := peers[p] + require.True(t, ok) + require.False(t, v.Trusted) + } +} + +func TestNewPexLoadCustomPeers(t *testing.T) { + dir, err := ioutil.TempDir("", "peerlist") + require.NoError(t, err) + defer os.Remove(dir) + + fn, err := os.Create(filepath.Join(dir, "custom-peers.txt")) + require.NoError(t, err) + defer fn.Close() + + _, err = fn.Write([]byte(`123.45.67.89:2020 +34.34.21.21:12222 +`)) + require.NoError(t, err) + + err = fn.Close() + require.NoError(t, err) + + config := NewConfig() + config.DataDirectory = dir + config.DefaultConnections = nil + config.CustomPeersFile = fn.Name() + + _, err = New(config) + require.NoError(t, err) + + // check if peers are saved to disk + peers, err := loadCachedPeersFile(filepath.Join(dir, PeerCacheFilename)) + require.NoError(t, err) + + expectedPeers := []string{ + "123.45.67.89:2020", + "34.34.21.21:12222", + } + + for _, p := range expectedPeers { + v, ok := peers[p] + require.True(t, ok) + require.False(t, v.Trusted) + } + + require.Len(t, peers, len(expectedPeers)) +} + +func TestPexLoadPeers(t *testing.T) { + tt := []struct { + name string + filename string + peers []Peer + max int + expectN int + expectPeers []Peer + }{ + { + name: "load all", + filename: PeerCacheFilename, + peers: []Peer{ + Peer{Addr: testPeers[0]}, + Peer{Addr: testPeers[1]}, + }, + max: 2, + expectN: 2, + expectPeers: []Peer{ + Peer{Addr: testPeers[0]}, + Peer{Addr: testPeers[1]}, + }, + }, + { + name: "reach max", + filename: PeerCacheFilename, + peers: []Peer{ + Peer{Addr: testPeers[0]}, + Peer{Addr: testPeers[1]}, + Peer{Addr: testPeers[2]}, + }, + max: 2, + expectN: 2, + expectPeers: []Peer{ + Peer{Addr: testPeers[0]}, + Peer{Addr: testPeers[1]}, + Peer{Addr: testPeers[2]}, + }, + }, + { + name: "including invalid addr", + filename: PeerCacheFilename, + peers: []Peer{ + Peer{Addr: wrongPortPeer}, + Peer{Addr: testPeers[1]}, + Peer{Addr: testPeers[2]}, + }, + max: 2, + expectN: 2, + expectPeers: []Peer{ + Peer{Addr: testPeers[1]}, + Peer{Addr: testPeers[2]}, + }, + }, + { + name: "load all, fallback on oldPeerCacheFilename", + filename: oldPeerCacheFilename, + peers: []Peer{ + Peer{Addr: testPeers[0]}, + Peer{Addr: testPeers[1]}, + }, + max: 2, + expectN: 2, + expectPeers: []Peer{ + Peer{Addr: testPeers[0]}, + Peer{Addr: testPeers[1]}, + }, + }, + { + name: "no peers file", + filename: "foo.json", + peers: []Peer{ + Peer{Addr: testPeers[0]}, + Peer{Addr: testPeers[1]}, + }, + max: 2, + expectN: 0, + expectPeers: nil, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + dir, err := ioutil.TempDir("", "peerlist") + require.NoError(t, err) + defer os.Remove(dir) + + // write peers to file + fn := filepath.Join(dir, tc.filename) + defer os.Remove(fn) + + peersMap := make(map[string]Peer) + for _, p := range tc.peers { + peersMap[p.Addr] = p + } + + err = file.SaveJSON(fn, peersMap, 0600) + require.NoError(t, err) + + cfg := NewConfig() + cfg.DataDirectory = dir + cfg.Max = tc.max + + px := Pex{ + peerlist: newPeerlist(), + Config: cfg, + } + + err = px.loadCache() + require.NoError(t, err) + + require.Len(t, px.peerlist.peers, tc.expectN) + + psm := make(map[string]Peer) + for _, p := range tc.expectPeers { + psm[p.Addr] = p + } + + for _, p := range px.peerlist.peers { + v, ok := psm[p.Addr] + require.True(t, ok) + require.Equal(t, v, *p) + } + }) + } +} + +func TestPexAddPeer(t *testing.T) { + now := time.Now().UTC().Unix() + + tt := []struct { + name string + peers []Peer + max int + finalLen int + peer string + err error + removedPeer string + check func(px *Pex) + }{ + { + name: "ok", + peers: []Peer{ + { + Addr: testPeers[0], + LastSeen: now, + }, + }, + max: 2, + peer: testPeers[1], + err: nil, + finalLen: 2, + }, + { + name: "invalid peer", + peers: []Peer{ + { + Addr: testPeers[0], + LastSeen: now, + }, + }, + max: 2, + peer: wrongPortPeer, + err: ErrInvalidAddress, + finalLen: 1, + }, + { + name: "peer known", + peers: []Peer{ + { + Addr: testPeers[0], + LastSeen: now, + }, + { + Addr: testPeers[1], + LastSeen: now - 60, + }, + }, + max: 2, + peer: testPeers[1], + err: nil, + finalLen: 2, + check: func(px *Pex) { + p := px.peerlist.peers[testPeers[1]] + require.NotNil(t, p) + // Peer should have been marked as seen + require.True(t, p.LastSeen > now-60) + }, + }, + { + name: "reach max", + peers: []Peer{ + { + Addr: testPeers[0], + LastSeen: now, + }, + { + Addr: testPeers[1], + LastSeen: now, + }, + }, + max: 2, + peer: testPeers[3], + err: ErrPeerlistFull, + finalLen: 2, + }, + { + name: "reach max but kicked old peer", + peers: []Peer{ + { + Addr: testPeers[0], + LastSeen: now, + }, + { + Addr: testPeers[1], + LastSeen: now - 60*60*24*2, + }, + }, + max: 2, + peer: testPeers[3], + err: nil, + finalLen: 2, + removedPeer: testPeers[1], + }, + { + name: "no max", + peers: []Peer{ + { + Addr: testPeers[0], + LastSeen: now, + }, + { + Addr: testPeers[1], + LastSeen: now, + }, + }, + max: 0, + peer: testPeers[3], + err: nil, + finalLen: 3, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + // create temp peer list file + dir, removeDir := preparePeerlistDir(t) + defer removeDir() + + // create px config + cfg := NewConfig() + cfg.Max = tc.max + cfg.DataDirectory = dir + cfg.DefaultConnections = []string{} + + // create px instance and load peers + px, err := New(cfg) + require.NoError(t, err) + + px.peerlist.setPeers(tc.peers) + + err = px.AddPeer(tc.peer) + require.Equal(t, tc.err, err) + require.Equal(t, tc.finalLen, len(px.peerlist.peers)) + + if tc.check != nil { + tc.check(px) + } + + if err != nil { + return + } + + // check if the peer is in the peer list + _, ok := px.peerlist.peers[tc.peer] + require.True(t, ok) + + if tc.removedPeer != "" { + _, ok := px.peerlist.peers[tc.removedPeer] + require.False(t, ok) + } + }) + } +} + +func TestPexAddPeers(t *testing.T) { + tt := []struct { + name string + peers []string + max int + addPeers []string + addN int + expectPeers []string + }{ + { + "ok", + testPeers[:1], + 5, + testPeers[1:3], + 2, + testPeers[1:3], + }, + { + "almost full", + testPeers[:1], + 2, + testPeers[1:3], + 1, + testPeers[1:2], + }, + { + "already full", + testPeers[:2], + 2, + testPeers[2:3], + 0, + testPeers[0:0], + }, + { + "including invalid address", + testPeers[:1], + 2, + []string{testPeers[1], wrongPortPeer}, + 1, + testPeers[1:2], + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + // create temp peer list file + dir, removeDir := preparePeerlistDir(t) + defer removeDir() + + // create px config + cfg := NewConfig() + cfg.Max = tc.max + cfg.DataDirectory = dir + cfg.DefaultConnections = tc.peers + + // create px instance and load peers + px, err := New(cfg) + require.NoError(t, err) + + n := px.AddPeers(tc.addPeers) + require.Equal(t, tc.addN, n) + + for _, p := range tc.expectPeers { + _, ok := px.peerlist.peers[p] + require.True(t, ok) + } + }) + } +} + +func TestPexTrustedPublic(t *testing.T) { + tt := []struct { + name string + peers []Peer + expect []Peer + }{ + { + + "none peer", + []Peer{ + Peer{Addr: testPeers[0]}, + Peer{Addr: testPeers[1], Trusted: true, Private: true}, + }, + []Peer{}, + }, + { + + "one trusted public peer", + []Peer{ + Peer{Addr: testPeers[0], Trusted: true, Private: false}, + Peer{Addr: testPeers[1], Trusted: true, Private: true}, + }, + []Peer{ + Peer{Addr: testPeers[0], Trusted: true, Private: false}, + }, + }, + { + + "all trust peer", + []Peer{ + Peer{Addr: testPeers[0], Trusted: true, Private: false}, + Peer{Addr: testPeers[1], Trusted: true, Private: false}, + }, + []Peer{ + Peer{Addr: testPeers[0], Trusted: true, Private: false}, + Peer{Addr: testPeers[1], Trusted: true, Private: false}, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pex := &Pex{ + peerlist: newPeerlist(), + } + + pex.peerlist.setPeers(tc.peers) + + // get trusted public peers + peers := pex.TrustedPublic() + + require.Equal(t, len(tc.expect), len(peers)) + pm := make(map[string]Peer) + for _, p := range peers { + pm[p.Addr] = p + } + + for _, p := range tc.expect { + v, ok := pm[p.Addr] + require.True(t, ok) + peersEqualWithSeenAllowedDiff(t, p, v) + } + }) + } +} + +func TestPexRandomExchangeable(t *testing.T) { + tt := []struct { + name string + peers []Peer + n int + expectN int + expectPeers []Peer + }{ + { + name: "n=0 exchangeable=0", + peers: []Peer{ + Peer{Addr: testPeers[0], Private: true, HasIncomingPort: true}, + Peer{Addr: testPeers[1], Private: true, HasIncomingPort: true}, + Peer{Addr: testPeers[2], Private: true, HasIncomingPort: true}, + }, + n: 0, + expectN: 0, + expectPeers: []Peer{}, + }, + { + name: "n=0 exchangeable=1", + peers: []Peer{ + Peer{Addr: testPeers[0], Private: false, HasIncomingPort: true}, + Peer{Addr: testPeers[1], Private: true, HasIncomingPort: true}, + Peer{Addr: testPeers[2], Private: true, HasIncomingPort: true}, + }, + n: 0, + expectN: 1, + expectPeers: []Peer{ + Peer{Addr: testPeers[0], Private: false, HasIncomingPort: true}, + }, + }, + { + name: "n=0 exchangeable=2", + peers: []Peer{ + Peer{Addr: testPeers[0], Private: false, HasIncomingPort: true}, + Peer{Addr: testPeers[1], Private: false, HasIncomingPort: true}, + Peer{Addr: testPeers[2], Private: true, HasIncomingPort: true}, + }, + n: 0, + expectN: 2, + expectPeers: []Peer{ + Peer{Addr: testPeers[0], Private: false, HasIncomingPort: true}, + Peer{Addr: testPeers[1], Private: false, HasIncomingPort: true}, + }, + }, + { + name: "n=1 exchangeable=0", + peers: []Peer{ + Peer{Addr: testPeers[0], Private: true, HasIncomingPort: true}, + Peer{Addr: testPeers[1], Private: true, HasIncomingPort: true}, + Peer{Addr: testPeers[2], Private: true, HasIncomingPort: true}, + }, + n: 1, + expectN: 0, + expectPeers: []Peer{}, + }, + { + name: "n=1 exchangeable=1", + peers: []Peer{ + Peer{Addr: testPeers[0], Private: false, HasIncomingPort: true}, + Peer{Addr: testPeers[1], Private: false, HasIncomingPort: false}, + Peer{Addr: testPeers[2], Private: true, HasIncomingPort: true}, + }, + n: 1, + expectN: 1, + expectPeers: []Peer{ + Peer{Addr: testPeers[0], Private: false, HasIncomingPort: true}, + }, + }, + { + name: "n=1 exchangeable=2", + peers: []Peer{ + Peer{Addr: testPeers[0], Private: false, HasIncomingPort: true}, + Peer{Addr: testPeers[1], Private: false, HasIncomingPort: true}, + Peer{Addr: testPeers[2], Private: true, HasIncomingPort: true}, + }, + n: 1, + expectN: 1, + expectPeers: []Peer{ + Peer{Addr: testPeers[0], Private: false, HasIncomingPort: true}, + Peer{Addr: testPeers[1], Private: false, HasIncomingPort: true}, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pex := &Pex{ + peerlist: newPeerlist(), + } + + pex.peerlist.setPeers(tc.peers) + + peers := pex.RandomExchangeable(tc.n) + require.Len(t, peers, tc.expectN) + + // map expectPeers peers + psm := make(map[string]Peer) + for _, p := range tc.expectPeers { + psm[p.Addr] = p + } + + for _, p := range peers { + v, ok := psm[p.Addr] + require.True(t, ok) + peersEqualWithSeenAllowedDiff(t, p, v) + } + }) + } +} + +func TestPeerRandomPublic(t *testing.T) { + tt := []struct { + name string + peers []Peer + n int + expectN int + }{ + { + "0 peer", + []Peer{}, + 1, + 0, + }, + { + "1 peer", + []Peer{ + Peer{Addr: testPeers[0]}, + }, + 1, + 1, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pex := &Pex{ + peerlist: newPeerlist(), + } + + pex.peerlist.setPeers(tc.peers) + + peers := pex.RandomPublic(tc.n) + require.Len(t, peers, tc.expectN) + }) + } +} + +func TestPexRandomPublic(t *testing.T) { + tt := []struct { + name string + peers []Peer + n int + expectN int + expectPeers []Peer + }{ + { + "n=0 public=0", + []Peer{ + Peer{Addr: testPeers[0], Private: true}, + Peer{Addr: testPeers[1], Private: true}, + Peer{Addr: testPeers[2], Private: true}, + }, + 0, + 0, + []Peer{}, + }, + { + "n=0 public=2", + []Peer{ + Peer{Addr: testPeers[0], Private: false}, + Peer{Addr: testPeers[1], Private: false}, + Peer{Addr: testPeers[2], Private: true}, + }, + 0, + 2, + []Peer{ + Peer{Addr: testPeers[0], Private: false}, + Peer{Addr: testPeers[1], Private: false}, + }, + }, + { + "n=1 public=0", + []Peer{ + Peer{Addr: testPeers[0], Private: true}, + Peer{Addr: testPeers[1], Private: true}, + Peer{Addr: testPeers[2], Private: true}, + }, + 1, + 0, + []Peer{}, + }, + { + "n=1 public=2", + []Peer{ + Peer{Addr: testPeers[0], Private: false}, + Peer{Addr: testPeers[1], Private: false}, + Peer{Addr: testPeers[2], Private: true}, + }, + 1, + 1, + []Peer{ + Peer{Addr: testPeers[0], Private: false}, + Peer{Addr: testPeers[1], Private: false}, + }, + }, + { + "n=2 public=0", + []Peer{ + Peer{Addr: testPeers[0], Private: true}, + Peer{Addr: testPeers[1], Private: true}, + Peer{Addr: testPeers[2], Private: true}, + }, + 2, + 0, + []Peer{}, + }, + { + "n=2 public=1", + []Peer{ + Peer{Addr: testPeers[0], Private: false}, + Peer{Addr: testPeers[1], Private: true}, + Peer{Addr: testPeers[2], Private: true}, + }, + 2, + 1, + []Peer{ + Peer{Addr: testPeers[0], Private: false}, + }, + }, + { + "n=2 public=2", + []Peer{ + Peer{Addr: testPeers[0], Private: false}, + Peer{Addr: testPeers[1], Private: false}, + Peer{Addr: testPeers[2], Private: true}, + }, + 2, + 2, + []Peer{ + Peer{Addr: testPeers[0], Private: false}, + Peer{Addr: testPeers[1], Private: false}, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pex := &Pex{ + peerlist: newPeerlist(), + } + + pex.peerlist.setPeers(tc.peers) + + // get N random public + peers := pex.RandomPublic(tc.n) + + require.Len(t, peers, tc.expectN) + + // map the peers + psm := make(map[string]Peer) + for _, p := range tc.expectPeers { + psm[p.Addr] = p + } + + // check if the returned peers are in the expectPeers + for _, p := range peers { + v, ok := psm[p.Addr] + require.True(t, ok) + peersEqualWithSeenAllowedDiff(t, p, v) + } + }) + } +} + +func TestPexTrusted(t *testing.T) { + tt := []struct { + name string + peers []Peer + expect []Peer + }{ + { + + "no trust peer", + []Peer{ + Peer{Addr: testPeers[0]}, + Peer{Addr: testPeers[1]}, + }, + []Peer{}, + }, + { + + "one trust peer", + []Peer{ + Peer{Addr: testPeers[0], Trusted: true}, + Peer{Addr: testPeers[1]}, + }, + []Peer{ + Peer{Addr: testPeers[0], Trusted: true}, + }, + }, + { + + "all trust peer", + []Peer{ + Peer{Addr: testPeers[0], Trusted: true}, + Peer{Addr: testPeers[1], Trusted: true}, + }, + []Peer{ + Peer{Addr: testPeers[0], Trusted: true}, + Peer{Addr: testPeers[1], Trusted: true}, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pex := &Pex{ + peerlist: newPeerlist(), + } + + pex.peerlist.setPeers(tc.peers) + + peers := pex.Trusted() + require.Equal(t, len(tc.expect), len(peers)) + + pm := make(map[string]Peer) + for _, p := range peers { + pm[p.Addr] = p + } + + for _, p := range tc.expect { + v, ok := pm[p.Addr] + require.True(t, ok) + peersEqualWithSeenAllowedDiff(t, p, v) + } + }) + } +} + +func TestPexPrivate(t *testing.T) { + tt := []struct { + name string + peers []Peer + expect []Peer + }{ + { + + "no private peer", + []Peer{ + Peer{Addr: testPeers[0]}, + Peer{Addr: testPeers[1]}, + }, + []Peer{}, + }, + { + + "one private peer", + []Peer{ + Peer{Addr: testPeers[0], Private: true}, + Peer{Addr: testPeers[1]}, + }, + []Peer{ + Peer{Addr: testPeers[0], Private: true}, + }, + }, + { + + "all trust peer", + []Peer{ + Peer{Addr: testPeers[0], Private: true}, + Peer{Addr: testPeers[1], Private: true}, + }, + []Peer{ + Peer{Addr: testPeers[0], Private: true}, + Peer{Addr: testPeers[1], Private: true}, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pex := &Pex{ + peerlist: newPeerlist(), + } + + pex.peerlist.setPeers(tc.peers) + + peers := pex.Private() + require.Equal(t, len(tc.expect), len(peers)) + + pm := make(map[string]Peer) + for _, p := range peers { + pm[p.Addr] = p + } + + for _, p := range tc.expect { + v, ok := pm[p.Addr] + require.True(t, ok) + peersEqualWithSeenAllowedDiff(t, p, v) + } + }) + } +} + +func TestPexResetAllRetryTimes(t *testing.T) { + tt := []struct { + name string + peers []Peer + expect []Peer + }{ + { + "all", + []Peer{ + Peer{Addr: testPeers[0], RetryTimes: 1}, + Peer{Addr: testPeers[1], RetryTimes: 2}, + }, + []Peer{ + Peer{Addr: testPeers[0]}, + Peer{Addr: testPeers[1]}, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pex := &Pex{ + peerlist: newPeerlist(), + } + + pex.peerlist.setPeers(tc.peers) + + pex.ResetAllRetryTimes() + + for _, p := range tc.expect { + v, ok := pex.peerlist.peers[p.Addr] + require.True(t, ok) + require.Equal(t, p, *v) + } + }) + } +} + +func TestPexIncreaseRetryTimes(t *testing.T) { + tt := []struct { + name string + peers []Peer + addr string + expect map[string]Peer + }{ + { + "addr not exist", + []Peer{ + Peer{Addr: testPeers[0]}, + Peer{Addr: testPeers[1]}, + }, + testPeers[2], + map[string]Peer{ + testPeers[0]: Peer{Addr: testPeers[0]}, + testPeers[1]: Peer{Addr: testPeers[1]}, + }, + }, + { + "ok", + []Peer{ + Peer{Addr: testPeers[0]}, + Peer{Addr: testPeers[1]}, + }, + testPeers[0], + map[string]Peer{ + testPeers[0]: Peer{Addr: testPeers[0], LastSeen: time.Now().UTC().Unix(), RetryTimes: 1}, + testPeers[1]: Peer{Addr: testPeers[1]}, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pex := &Pex{ + peerlist: newPeerlist(), + } + + pex.peerlist.setPeers(tc.peers) + + pex.IncreaseRetryTimes(tc.addr) + + require.Equal(t, len(tc.expect), len(pex.peerlist.peers)) + for k, v := range tc.expect { + p, ok := pex.peerlist.peers[k] + require.True(t, ok) + if p.LastSeen != 0 { + require.InDelta(t, v.LastSeen, p.LastSeen, 2) + p.LastSeen = 0 + v.LastSeen = 0 + } + require.Equal(t, v, *p) + } + }) + } +} + +func TestPexResetRetryTimes(t *testing.T) { + tt := []struct { + name string + peers []Peer + addr string + expect []Peer + }{ + { + "no peer need reset", + []Peer{*NewPeer(testPeers[0]), *NewPeer(testPeers[1])}, + testPeers[2], + []Peer{*NewPeer(testPeers[0]), *NewPeer(testPeers[1])}, + }, + { + "reset one", + []Peer{ + Peer{Addr: testPeers[0], LastSeen: time.Now().UTC().Unix(), RetryTimes: 10}, + Peer{Addr: testPeers[1], RetryTimes: 2}, + }, + testPeers[0], + []Peer{ + Peer{Addr: testPeers[0], LastSeen: time.Now().UTC().Unix()}, + Peer{Addr: testPeers[1], RetryTimes: 2}, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pex := &Pex{ + peerlist: newPeerlist(), + } + + pex.peerlist.setPeers(tc.peers) + + pex.ResetRetryTimes(tc.addr) + + for _, p := range tc.expect { + v, ok := pex.peerlist.peers[p.Addr] + require.True(t, ok) + require.Equal(t, p, *v) + } + }) + } +} + +func TestPexRemovePeer(t *testing.T) { + tt := []struct { + name string + initPeers []Peer + removePeer string + expect map[string]*Peer + }{ + { + "remove from empty peer list", + []Peer{}, + testPeers[0], + map[string]*Peer{}, + }, + { + "remove one", + []Peer{*NewPeer(testPeers[0]), *NewPeer(testPeers[1])}, + testPeers[0], + map[string]*Peer{ + testPeers[1]: NewPeer(testPeers[1]), + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pex := &Pex{ + peerlist: newPeerlist(), + } + + pex.peerlist.setPeers(tc.initPeers) + + pex.RemovePeer(tc.removePeer) + + require.Equal(t, len(tc.expect), len(pex.peerlist.peers)) + for k, v := range tc.expect { + p, ok := pex.peerlist.peers[k] + require.True(t, ok) + require.Equal(t, *v, *p) + } + }) + } +} + +func TestPexSetPrivate(t *testing.T) { + tt := []struct { + name string + initPeer []Peer + peer string + private bool + err error + }{ + { + "set private true", + []Peer{*NewPeer(testPeers[0])}, + testPeers[0], + true, + nil, + }, + { + "set private false", + []Peer{*NewPeer(testPeers[0])}, + testPeers[0], + false, + nil, + }, + { + "set failed", + []Peer{*NewPeer(testPeers[1])}, + testPeers[0], + false, + fmt.Errorf("set peer.Private failed: %v does not exist in peer list", testPeers[0]), + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pex := &Pex{ + peerlist: newPeerlist(), + } + + pex.peerlist.setPeers(tc.initPeer) + + err := pex.SetPrivate(tc.peer, tc.private) + require.Equal(t, tc.err, err) + if err != nil { + return + } + p, ok := pex.peerlist.peers[tc.peer] + require.True(t, ok) + + require.Equal(t, tc.private, p.Private) + }) + } +} + +func TestPexSetTrusted(t *testing.T) { + tt := []struct { + name string + initPeers []Peer + peer string + err error + }{ + { + "set trust true", + []Peer{*NewPeer(testPeers[0])}, + testPeers[0], + nil, + }, + { + "set failed", + []Peer{*NewPeer(testPeers[1])}, + testPeers[0], + fmt.Errorf("set peer.Trusted failed: %v does not exist in peer list", testPeers[0]), + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pex := &Pex{ + peerlist: newPeerlist(), + } + + // init peer + pex.peerlist.setPeers(tc.initPeers) + + err := pex.setTrusted(tc.peer) + require.Equal(t, tc.err, err) + if err != nil { + return + } + + p, ok := pex.peerlist.peers[tc.peer] + require.True(t, ok) + require.True(t, p.Trusted) + }) + } +} + +func TestPexSetHasIncomingPort(t *testing.T) { + tt := []struct { + name string + initPeers []Peer + peer string + hasIncomingPort bool + err error + }{ + { + "set has incoming port true", + []Peer{*NewPeer(testPeers[0])}, + testPeers[0], + true, + nil, + }, + { + "set has incoming port false", + []Peer{*NewPeer(testPeers[0])}, + testPeers[0], + false, + nil, + }, + { + "set failed", + []Peer{*NewPeer(testPeers[1])}, + testPeers[0], + false, + fmt.Errorf("set peer.HasIncomingPort failed: %v does not exist in peer list", testPeers[0]), + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pex := &Pex{ + peerlist: newPeerlist(), + } + + pex.peerlist.setPeers(tc.initPeers) + + err := pex.SetHasIncomingPort(tc.peer, tc.hasIncomingPort) + require.Equal(t, tc.err, err) + if err != nil { + return + } + + p, ok := pex.peerlist.peers[tc.peer] + require.True(t, ok) + require.Equal(t, tc.hasIncomingPort, p.HasIncomingPort) + }) + } +} + +func TestPexGetPeerByAddr(t *testing.T) { + tt := []struct { + name string + initPeers []Peer + addr string + find bool + peer Peer + }{ + { + "ok", + []Peer{ + *NewPeer(testPeers[0]), + *NewPeer(testPeers[1]), + }, + testPeers[0], + true, + *NewPeer(testPeers[0]), + }, + { + "not exist", + []Peer{ + *NewPeer(testPeers[0]), + *NewPeer(testPeers[1]), + }, + testPeers[2], + false, + Peer{}, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pex := &Pex{ + peerlist: newPeerlist(), + } + + pex.peerlist.setPeers(tc.initPeers) + + p, ok := pex.GetPeer(tc.addr) + require.Equal(t, tc.find, ok) + if ok { + require.Equal(t, tc.peer, p) + } + }) + } +} + +func TestPexIsFull(t *testing.T) { + pex := &Pex{ + peerlist: newPeerlist(), + Config: Config{Max: 0}, + } + + require.False(t, pex.IsFull()) + + err := pex.AddPeer("11.22.33.44:5555") + require.NoError(t, err) + require.False(t, pex.IsFull()) + + pex.Config.Max = 2 + require.False(t, pex.IsFull()) + err = pex.AddPeer("33.44.55.66:5555") + require.NoError(t, err) + require.True(t, pex.IsFull()) + + pex.Config.Max = 1 + require.True(t, pex.IsFull()) +} + +func TestParseRemotePeerList(t *testing.T) { + body := `11.22.33.44:5555 +66.55.44.33:2020 +# comment + +127.0.0.1:8080 + 54.54.32.32:7899 +11.33.11.33 +22.44.22.44:99 +` + + peers := parseRemotePeerList(body) + require.Len(t, peers, 3) + require.Equal(t, []string{ + "11.22.33.44:5555", + "66.55.44.33:2020", + "54.54.32.32:7899", + }, peers) +} + +func TestParseLocalPeerList(t *testing.T) { + cases := []struct { + name string + body string + peers []string + allowLocalhost bool + err error + }{ + { + name: "valid, no localhost", + body: `11.22.33.44:5555 +66.55.44.33:2020 +# comment + + 54.54.32.32:7899 +`, + peers: []string{ + "11.22.33.44:5555", + "66.55.44.33:2020", + "54.54.32.32:7899", + }, + allowLocalhost: false, + }, + + { + name: "valid, localhost", + body: `11.22.33.44:5555 +66.55.44.33:2020 +# comment + +127.0.0.1:8080 + 54.54.32.32:7899 +`, + peers: []string{ + "11.22.33.44:5555", + "66.55.44.33:2020", + "127.0.0.1:8080", + "54.54.32.32:7899", + }, + allowLocalhost: true, + }, + + { + name: "invalid, contains localhost but no localhost allowed", + body: `11.22.33.44:5555 +66.55.44.33:2020 +# comment + +127.0.0.1:8080 + 54.54.32.32:7899 +`, + err: fmt.Errorf("Peers list has invalid address 127.0.0.1:8080: %v", ErrNoLocalhost), + allowLocalhost: false, + }, + + { + name: "invalid, bad address", + body: `11.22.33.44:5555 +66.55.44.33:2020 +# comment + + 54.54.32.32:99 +`, + err: fmt.Errorf("Peers list has invalid address 54.54.32.32:99: %v", ErrPortTooLow), + allowLocalhost: false, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + peers, err := parseLocalPeerList(tc.body, tc.allowLocalhost) + if tc.err != nil { + require.Equal(t, tc.err, err) + return + } + + require.NoError(t, err) + require.Equal(t, tc.peers, peers) + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/pool.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/pool.go new file mode 100644 index 00000000..9ecb9c7f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/pool.go @@ -0,0 +1,124 @@ +package daemon + +import ( + "time" + + "github.com/SkycoinProject/skycoin/src/daemon/gnet" +) + +// PoolConfig pool config +type PoolConfig struct { + // Timeout when trying to connect to new peers through the pool + DialTimeout time.Duration + // How often to process message buffers and generate events + MessageHandlingRate time.Duration + // How long to wait before sending another ping + PingRate time.Duration + // How long a connection can idle before considered stale + IdleLimit time.Duration + // How often to check for needed pings + IdleCheckRate time.Duration + // How often to check for stale connections + ClearStaleRate time.Duration + // Buffer size for gnet.ConnectionPool's network Read events + EventChannelSize int + // Maximum number of connections + MaxConnections int + // Maximum number of outgoing connections + MaxOutgoingConnections int + // Maximum number of outgoing connections to peers in the DefaultConnections list to maintain + MaxDefaultPeerOutgoingConnections int + // Default "trusted" peers + DefaultConnections []string + // Maximum length of incoming messages in bytes + MaxIncomingMessageLength int + // Maximum length of outgoing messages in bytes + MaxOutgoingMessageLength int + // These should be assigned by the controlling daemon + address string + port int +} + +// NewPoolConfig creates pool config +func NewPoolConfig() PoolConfig { + return PoolConfig{ + port: 6677, + address: "", + DialTimeout: time.Second * 30, + MessageHandlingRate: time.Millisecond * 50, + PingRate: 5 * time.Second, + IdleLimit: 60 * time.Second, + IdleCheckRate: 1 * time.Second, + ClearStaleRate: 1 * time.Second, + EventChannelSize: 4096, + MaxConnections: 128, + MaxOutgoingConnections: 8, + MaxDefaultPeerOutgoingConnections: 1, + MaxOutgoingMessageLength: 256 * 1024, + MaxIncomingMessageLength: 1024 * 1024, + } +} + +// Pool maintains config and pool +type Pool struct { + Config PoolConfig + Pool *gnet.ConnectionPool +} + +// NewPool creates pool +func NewPool(cfg PoolConfig, d *Daemon) (*Pool, error) { + gnetCfg := gnet.NewConfig() + gnetCfg.DialTimeout = cfg.DialTimeout + gnetCfg.Port = uint16(cfg.port) + gnetCfg.Address = cfg.address + gnetCfg.ConnectCallback = d.onGnetConnect + gnetCfg.DisconnectCallback = d.onGnetDisconnect + gnetCfg.ConnectFailureCallback = d.onGnetConnectFailure + gnetCfg.MaxConnections = cfg.MaxConnections + gnetCfg.MaxOutgoingConnections = cfg.MaxOutgoingConnections + gnetCfg.MaxDefaultPeerOutgoingConnections = cfg.MaxDefaultPeerOutgoingConnections + gnetCfg.DefaultConnections = cfg.DefaultConnections + gnetCfg.MaxIncomingMessageLength = cfg.MaxIncomingMessageLength + gnetCfg.MaxOutgoingMessageLength = cfg.MaxOutgoingMessageLength + + pool, err := gnet.NewConnectionPool(gnetCfg, d) + if err != nil { + return nil, err + } + + return &Pool{ + Config: cfg, + Pool: pool, + }, nil +} + +// Shutdown closes all connections and stops listening +func (pool *Pool) Shutdown() { + if pool == nil { + return + } + pool.Pool.Shutdown() +} + +// Run starts listening on the configured Port +func (pool *Pool) Run() error { + logger.Infof("daemon.Pool listening on port %d", pool.Config.port) + return pool.Pool.Run() +} + +// RunOffline runs the pool without a listener. This is necessary to process strand requests. +func (pool *Pool) RunOffline() error { + return pool.Pool.RunOffline() +} + +// sendPings send a ping if our last message sent was over pingRate ago +func (pool *Pool) sendPings() { + if err := pool.Pool.SendPings(pool.Config.PingRate, &PingMessage{}); err != nil { + logger.WithError(err).Error("sendPings failed") + } +} + +// getStaleConnections returns connections that have been idle for longer than idleLimit +func (pool *Pool) getStaleConnections() ([]string, error) { + return pool.Pool.GetStaleConnections(pool.Config.IdleLimit) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/signed_block_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/signed_block_skyencoder.go new file mode 100644 index 00000000..57e768b1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/signed_block_skyencoder.go @@ -0,0 +1,528 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package daemon + +import ( + "errors" + "math" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" + "github.com/SkycoinProject/skycoin/src/coin" +) + +// encodeSizeSignedBlock computes the size of an encoded object of type SignedBlock +func encodeSizeSignedBlock(obj *coin.SignedBlock) uint64 { + i0 := uint64(0) + + // obj.Block.Head.Version + i0 += 4 + + // obj.Block.Head.Time + i0 += 8 + + // obj.Block.Head.BkSeq + i0 += 8 + + // obj.Block.Head.Fee + i0 += 8 + + // obj.Block.Head.PrevHash + i0 += 32 + + // obj.Block.Head.BodyHash + i0 += 32 + + // obj.Block.Head.UxHash + i0 += 32 + + // obj.Block.Body.Transactions + i0 += 4 + for _, x1 := range obj.Block.Body.Transactions { + i1 := uint64(0) + + // x1.Length + i1 += 4 + + // x1.Type + i1++ + + // x1.InnerHash + i1 += 32 + + // x1.Sigs + i1 += 4 + { + i2 := uint64(0) + + // x2 + i2 += 65 + + i1 += uint64(len(x1.Sigs)) * i2 + } + + // x1.In + i1 += 4 + { + i2 := uint64(0) + + // x2 + i2 += 32 + + i1 += uint64(len(x1.In)) * i2 + } + + // x1.Out + i1 += 4 + { + i2 := uint64(0) + + // x2.Address.Version + i2++ + + // x2.Address.Key + i2 += 20 + + // x2.Coins + i2 += 8 + + // x2.Hours + i2 += 8 + + i1 += uint64(len(x1.Out)) * i2 + } + + i0 += i1 + } + + // obj.Sig + i0 += 65 + + return i0 +} + +// encodeSignedBlock encodes an object of type SignedBlock to a buffer allocated to the exact size +// required to encode the object. +func encodeSignedBlock(obj *coin.SignedBlock) ([]byte, error) { + n := encodeSizeSignedBlock(obj) + buf := make([]byte, n) + + if err := encodeSignedBlockToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeSignedBlockToBuffer encodes an object of type SignedBlock to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeSignedBlockToBuffer(buf []byte, obj *coin.SignedBlock) error { + if uint64(len(buf)) < encodeSizeSignedBlock(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Block.Head.Version + e.Uint32(obj.Block.Head.Version) + + // obj.Block.Head.Time + e.Uint64(obj.Block.Head.Time) + + // obj.Block.Head.BkSeq + e.Uint64(obj.Block.Head.BkSeq) + + // obj.Block.Head.Fee + e.Uint64(obj.Block.Head.Fee) + + // obj.Block.Head.PrevHash + e.CopyBytes(obj.Block.Head.PrevHash[:]) + + // obj.Block.Head.BodyHash + e.CopyBytes(obj.Block.Head.BodyHash[:]) + + // obj.Block.Head.UxHash + e.CopyBytes(obj.Block.Head.UxHash[:]) + + // obj.Block.Body.Transactions maxlen check + if len(obj.Block.Body.Transactions) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // obj.Block.Body.Transactions length check + if uint64(len(obj.Block.Body.Transactions)) > math.MaxUint32 { + return errors.New("obj.Block.Body.Transactions length exceeds math.MaxUint32") + } + + // obj.Block.Body.Transactions length + e.Uint32(uint32(len(obj.Block.Body.Transactions))) + + // obj.Block.Body.Transactions + for _, x := range obj.Block.Body.Transactions { + + // x.Length + e.Uint32(x.Length) + + // x.Type + e.Uint8(x.Type) + + // x.InnerHash + e.CopyBytes(x.InnerHash[:]) + + // x.Sigs maxlen check + if len(x.Sigs) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // x.Sigs length check + if uint64(len(x.Sigs)) > math.MaxUint32 { + return errors.New("x.Sigs length exceeds math.MaxUint32") + } + + // x.Sigs length + e.Uint32(uint32(len(x.Sigs))) + + // x.Sigs + for _, x := range x.Sigs { + + // x + e.CopyBytes(x[:]) + + } + + // x.In maxlen check + if len(x.In) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // x.In length check + if uint64(len(x.In)) > math.MaxUint32 { + return errors.New("x.In length exceeds math.MaxUint32") + } + + // x.In length + e.Uint32(uint32(len(x.In))) + + // x.In + for _, x := range x.In { + + // x + e.CopyBytes(x[:]) + + } + + // x.Out maxlen check + if len(x.Out) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // x.Out length check + if uint64(len(x.Out)) > math.MaxUint32 { + return errors.New("x.Out length exceeds math.MaxUint32") + } + + // x.Out length + e.Uint32(uint32(len(x.Out))) + + // x.Out + for _, x := range x.Out { + + // x.Address.Version + e.Uint8(x.Address.Version) + + // x.Address.Key + e.CopyBytes(x.Address.Key[:]) + + // x.Coins + e.Uint64(x.Coins) + + // x.Hours + e.Uint64(x.Hours) + + } + + } + + // obj.Sig + e.CopyBytes(obj.Sig[:]) + + return nil +} + +// decodeSignedBlock decodes an object of type SignedBlock from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeSignedBlock(buf []byte, obj *coin.SignedBlock) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Block.Head.Version + i, err := d.Uint32() + if err != nil { + return 0, err + } + obj.Block.Head.Version = i + } + + { + // obj.Block.Head.Time + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Block.Head.Time = i + } + + { + // obj.Block.Head.BkSeq + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Block.Head.BkSeq = i + } + + { + // obj.Block.Head.Fee + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Block.Head.Fee = i + } + + { + // obj.Block.Head.PrevHash + if len(d.Buffer) < len(obj.Block.Head.PrevHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Block.Head.PrevHash[:], d.Buffer[:len(obj.Block.Head.PrevHash)]) + d.Buffer = d.Buffer[len(obj.Block.Head.PrevHash):] + } + + { + // obj.Block.Head.BodyHash + if len(d.Buffer) < len(obj.Block.Head.BodyHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Block.Head.BodyHash[:], d.Buffer[:len(obj.Block.Head.BodyHash)]) + d.Buffer = d.Buffer[len(obj.Block.Head.BodyHash):] + } + + { + // obj.Block.Head.UxHash + if len(d.Buffer) < len(obj.Block.Head.UxHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Block.Head.UxHash[:], d.Buffer[:len(obj.Block.Head.UxHash)]) + d.Buffer = d.Buffer[len(obj.Block.Head.UxHash):] + } + + { + // obj.Block.Body.Transactions + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Block.Body.Transactions = make([]coin.Transaction, length) + + for z3 := range obj.Block.Body.Transactions { + { + // obj.Block.Body.Transactions[z3].Length + i, err := d.Uint32() + if err != nil { + return 0, err + } + obj.Block.Body.Transactions[z3].Length = i + } + + { + // obj.Block.Body.Transactions[z3].Type + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Block.Body.Transactions[z3].Type = i + } + + { + // obj.Block.Body.Transactions[z3].InnerHash + if len(d.Buffer) < len(obj.Block.Body.Transactions[z3].InnerHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Block.Body.Transactions[z3].InnerHash[:], d.Buffer[:len(obj.Block.Body.Transactions[z3].InnerHash)]) + d.Buffer = d.Buffer[len(obj.Block.Body.Transactions[z3].InnerHash):] + } + + { + // obj.Block.Body.Transactions[z3].Sigs + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Block.Body.Transactions[z3].Sigs = make([]cipher.Sig, length) + + for z5 := range obj.Block.Body.Transactions[z3].Sigs { + { + // obj.Block.Body.Transactions[z3].Sigs[z5] + if len(d.Buffer) < len(obj.Block.Body.Transactions[z3].Sigs[z5]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Block.Body.Transactions[z3].Sigs[z5][:], d.Buffer[:len(obj.Block.Body.Transactions[z3].Sigs[z5])]) + d.Buffer = d.Buffer[len(obj.Block.Body.Transactions[z3].Sigs[z5]):] + } + + } + } + } + + { + // obj.Block.Body.Transactions[z3].In + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Block.Body.Transactions[z3].In = make([]cipher.SHA256, length) + + for z5 := range obj.Block.Body.Transactions[z3].In { + { + // obj.Block.Body.Transactions[z3].In[z5] + if len(d.Buffer) < len(obj.Block.Body.Transactions[z3].In[z5]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Block.Body.Transactions[z3].In[z5][:], d.Buffer[:len(obj.Block.Body.Transactions[z3].In[z5])]) + d.Buffer = d.Buffer[len(obj.Block.Body.Transactions[z3].In[z5]):] + } + + } + } + } + + { + // obj.Block.Body.Transactions[z3].Out + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Block.Body.Transactions[z3].Out = make([]coin.TransactionOutput, length) + + for z5 := range obj.Block.Body.Transactions[z3].Out { + { + // obj.Block.Body.Transactions[z3].Out[z5].Address.Version + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Block.Body.Transactions[z3].Out[z5].Address.Version = i + } + + { + // obj.Block.Body.Transactions[z3].Out[z5].Address.Key + if len(d.Buffer) < len(obj.Block.Body.Transactions[z3].Out[z5].Address.Key) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Block.Body.Transactions[z3].Out[z5].Address.Key[:], d.Buffer[:len(obj.Block.Body.Transactions[z3].Out[z5].Address.Key)]) + d.Buffer = d.Buffer[len(obj.Block.Body.Transactions[z3].Out[z5].Address.Key):] + } + + { + // obj.Block.Body.Transactions[z3].Out[z5].Coins + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Block.Body.Transactions[z3].Out[z5].Coins = i + } + + { + // obj.Block.Body.Transactions[z3].Out[z5].Hours + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Block.Body.Transactions[z3].Out[z5].Hours = i + } + + } + } + } + } + } + } + + { + // obj.Sig + if len(d.Buffer) < len(obj.Sig) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Sig[:], d.Buffer[:len(obj.Sig)]) + d.Buffer = d.Buffer[len(obj.Sig):] + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeSignedBlockExact decodes an object of type SignedBlock from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeSignedBlockExact(buf []byte, obj *coin.SignedBlock) error { + if n, err := decodeSignedBlock(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/signed_block_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/signed_block_skyencoder_test.go new file mode 100644 index 00000000..bfe2b78e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/signed_block_skyencoder_test.go @@ -0,0 +1,422 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package daemon + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" + "github.com/SkycoinProject/skycoin/src/coin" +) + +func newEmptySignedBlockForEncodeTest() *coin.SignedBlock { + var obj coin.SignedBlock + return &obj +} + +func newRandomSignedBlockForEncodeTest(t *testing.T, rand *mathrand.Rand) *coin.SignedBlock { + var obj coin.SignedBlock + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenSignedBlockForEncodeTest(t *testing.T, rand *mathrand.Rand) *coin.SignedBlock { + var obj coin.SignedBlock + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilSignedBlockForEncodeTest(t *testing.T, rand *mathrand.Rand) *coin.SignedBlock { + var obj coin.SignedBlock + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderSignedBlock(t *testing.T, obj *coin.SignedBlock) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeSignedBlock(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeSignedBlock() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeSignedBlock(obj) + if err != nil { + t.Fatalf("encodeSignedBlock failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeSignedBlock produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeSignedBlock()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeSignedBlockToBuffer(data3, obj); err != nil { + t.Fatalf("encodeSignedBlockToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 coin.SignedBlock + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 coin.SignedBlock + if n, err := decodeSignedBlock(data2, &obj3); err != nil { + t.Fatalf("decodeSignedBlock failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeSignedBlock bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeSignedBlock()") + } + + // Decode, excess buffer + var obj4 coin.SignedBlock + n, err := decodeSignedBlock(data3, &obj4) + if err != nil { + t.Fatalf("decodeSignedBlock failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeSignedBlock bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeSignedBlock bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeSignedBlock()") + } + + // DecodeExact + var obj5 coin.SignedBlock + if err := decodeSignedBlockExact(data2, &obj5); err != nil { + t.Fatalf("decodeSignedBlock failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeSignedBlock()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeSignedBlock(data4, &obj3); err != nil { + t.Fatalf("decodeSignedBlock failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeSignedBlock bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderSignedBlock(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *coin.SignedBlock + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptySignedBlockForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomSignedBlockForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenSignedBlockForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilSignedBlockForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderSignedBlock(t, tc.obj) + }) + } +} + +func decodeSignedBlockExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj coin.SignedBlock + if _, err := decodeSignedBlock(buf, &obj); err == nil { + t.Fatal("decodeSignedBlock: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeSignedBlock: expected error %q, got %q", expectedErr, err) + } +} + +func decodeSignedBlockExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj coin.SignedBlock + if err := decodeSignedBlockExact(buf, &obj); err == nil { + t.Fatal("decodeSignedBlockExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeSignedBlockExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderSignedBlockDecodeErrors(t *testing.T, k int, tag string, obj *coin.SignedBlock) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeSignedBlock(obj) + buf, err := encodeSignedBlock(obj) + if err != nil { + t.Fatalf("encodeSignedBlock failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeSignedBlockExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeSignedBlockExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeSignedBlockExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeSignedBlockExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeSignedBlockExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderSignedBlockDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptySignedBlockForEncodeTest() + fullObj := newRandomSignedBlockForEncodeTest(t, rand) + testSkyencoderSignedBlockDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderSignedBlockDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/strand/strand.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/strand/strand.go new file mode 100644 index 00000000..5bdfbc67 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/strand/strand.go @@ -0,0 +1,135 @@ +/* +Package strand is a utility for linearizing method calls, similar to locking. + +The strand method is functionally similar to a lock, but operates on a queue +of method calls. +*/ +package strand + +import ( + "time" + + "github.com/sirupsen/logrus" + + "github.com/SkycoinProject/skycoin/src/util/logging" +) + +const ( + // logDurationThreshold is how long to wait before reporting a function call's time + logDurationThreshold = time.Millisecond * 100 + // writeWait is how long to wait to write to a request channel before logging the delay + logQueueRequestWaitThreshold = time.Second * 1 +) + +var ( + // Debug enables debug logging + Debug = false +) + +// Request is sent to the channel provided to Strand +type Request struct { + Name string + Func func() error +} + +// Strand linearizes concurrent method calls through a single channel, +// to avoid concurrency issues when conflicting methods are called from +// multiple goroutines. +// Methods passed to Strand() will block until completed. +// Strand accepts a quit channel and will return quitErr if the quit +// channel closes. +func Strand(logger *logging.Logger, c chan Request, name string, f func() error, quit chan struct{}, quitErr error) error { + if Debug { + logger.WithField("operation", name).Debug("Strand precall") + } + + done := make(chan struct{}) + var err error + + req := Request{ + Name: name, + Func: func() error { + defer close(done) + + // TODO: record time statistics in a data structure and expose stats via an API + // logger.Debugf("%s begin", name) + + t := time.Now() + + // Log function duration at an exponential time interval, + // this will notify us of any long running functions to look at. + go func() { + threshold := logDurationThreshold + t := time.NewTimer(threshold) + defer t.Stop() + + for { + t0 := time.Now() + select { + case <-quit: + return + case <-done: + return + case <-t.C: + logger.WithFields(logrus.Fields{ + "operation": name, + "threshold": threshold, + }).Warning("Strand operation exceeded threshold") + threshold *= 10 + t.Reset(threshold) + } + t1 := time.Now() + logger.WithField("elapsed", t1.Sub(t0)).Info() + } + }() + + if Debug { + logger.WithField("operation", name).Debug("Stranding") + } + + err = f() + + // Notify us if the function call took too long + elapsed := time.Since(t) + if elapsed > logDurationThreshold { + logger.WithFields(logrus.Fields{ + "operation": name, + "elapsed": elapsed, + }).Warning() + } else if Debug { + logger.WithFields(logrus.Fields{ + "operation": name, + "elapsed": elapsed, + }).Debug() + } + + return err + }, + } + + // Log a message if waiting too long to write due to a full queue + t := time.Now() +loop: + for { + select { + case <-quit: + return quitErr + case c <- req: + break loop + case <-time.After(logQueueRequestWaitThreshold): + logger.Warningf("Waited %s while trying to write %s to the strand request channel", time.Since(t), req.Name) + } + } + + t = time.Now() + for { + select { + case <-quit: + return quitErr + case <-done: + return err + case <-time.After(logQueueRequestWaitThreshold): + logger.Warningf("Waited %s while waiting for %s to be done or quit", time.Since(t), req.Name) + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/announce-blocks-msg.golden b/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/announce-blocks-msg.golden new file mode 100644 index 00000000..f3f11cfa Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/announce-blocks-msg.golden differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/announce-txns-msg.golden b/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/announce-txns-msg.golden new file mode 100644 index 00000000..3ecbd103 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/announce-txns-msg.golden differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/get-blocks-msg.golden b/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/get-blocks-msg.golden new file mode 100644 index 00000000..375a53cb Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/get-blocks-msg.golden differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/get-peers-msg.golden b/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/get-peers-msg.golden new file mode 100644 index 00000000..e69de29b diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/get-txns-msg.golden b/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/get-txns-msg.golden new file mode 100644 index 00000000..0a34e926 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/get-txns-msg.golden differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/give-blocks-msg.golden b/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/give-blocks-msg.golden new file mode 100644 index 00000000..726b8f5e Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/give-blocks-msg.golden differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/give-peers-msg.golden b/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/give-peers-msg.golden new file mode 100644 index 00000000..bfb63a68 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/give-peers-msg.golden differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/give-txns-msg.golden b/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/give-txns-msg.golden new file mode 100644 index 00000000..cee5b302 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/give-txns-msg.golden differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/intro-msg-extra.golden b/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/intro-msg-extra.golden new file mode 100644 index 00000000..e35db5b5 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/intro-msg-extra.golden differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/intro-msg.golden b/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/intro-msg.golden new file mode 100644 index 00000000..f2b19513 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/intro-msg.golden differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/ping-msg.golden b/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/ping-msg.golden new file mode 100644 index 00000000..e69de29b diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/pong-msg.golden b/vendor/github.com/SkycoinProject/skycoin/src/daemon/testdata/pong-msg.golden new file mode 100644 index 00000000..e69de29b diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/transaction_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/transaction_skyencoder.go new file mode 100644 index 00000000..1db55f86 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/transaction_skyencoder.go @@ -0,0 +1,358 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package daemon + +import ( + "errors" + "math" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" + "github.com/SkycoinProject/skycoin/src/coin" +) + +// encodeSizeTransaction computes the size of an encoded object of type Transaction +func encodeSizeTransaction(obj *coin.Transaction) uint64 { + i0 := uint64(0) + + // obj.Length + i0 += 4 + + // obj.Type + i0++ + + // obj.InnerHash + i0 += 32 + + // obj.Sigs + i0 += 4 + { + i1 := uint64(0) + + // x1 + i1 += 65 + + i0 += uint64(len(obj.Sigs)) * i1 + } + + // obj.In + i0 += 4 + { + i1 := uint64(0) + + // x1 + i1 += 32 + + i0 += uint64(len(obj.In)) * i1 + } + + // obj.Out + i0 += 4 + { + i1 := uint64(0) + + // x1.Address.Version + i1++ + + // x1.Address.Key + i1 += 20 + + // x1.Coins + i1 += 8 + + // x1.Hours + i1 += 8 + + i0 += uint64(len(obj.Out)) * i1 + } + + return i0 +} + +// encodeTransaction encodes an object of type Transaction to a buffer allocated to the exact size +// required to encode the object. +func encodeTransaction(obj *coin.Transaction) ([]byte, error) { + n := encodeSizeTransaction(obj) + buf := make([]byte, n) + + if err := encodeTransactionToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeTransactionToBuffer encodes an object of type Transaction to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeTransactionToBuffer(buf []byte, obj *coin.Transaction) error { + if uint64(len(buf)) < encodeSizeTransaction(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Length + e.Uint32(obj.Length) + + // obj.Type + e.Uint8(obj.Type) + + // obj.InnerHash + e.CopyBytes(obj.InnerHash[:]) + + // obj.Sigs maxlen check + if len(obj.Sigs) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // obj.Sigs length check + if uint64(len(obj.Sigs)) > math.MaxUint32 { + return errors.New("obj.Sigs length exceeds math.MaxUint32") + } + + // obj.Sigs length + e.Uint32(uint32(len(obj.Sigs))) + + // obj.Sigs + for _, x := range obj.Sigs { + + // x + e.CopyBytes(x[:]) + + } + + // obj.In maxlen check + if len(obj.In) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // obj.In length check + if uint64(len(obj.In)) > math.MaxUint32 { + return errors.New("obj.In length exceeds math.MaxUint32") + } + + // obj.In length + e.Uint32(uint32(len(obj.In))) + + // obj.In + for _, x := range obj.In { + + // x + e.CopyBytes(x[:]) + + } + + // obj.Out maxlen check + if len(obj.Out) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // obj.Out length check + if uint64(len(obj.Out)) > math.MaxUint32 { + return errors.New("obj.Out length exceeds math.MaxUint32") + } + + // obj.Out length + e.Uint32(uint32(len(obj.Out))) + + // obj.Out + for _, x := range obj.Out { + + // x.Address.Version + e.Uint8(x.Address.Version) + + // x.Address.Key + e.CopyBytes(x.Address.Key[:]) + + // x.Coins + e.Uint64(x.Coins) + + // x.Hours + e.Uint64(x.Hours) + + } + + return nil +} + +// decodeTransaction decodes an object of type Transaction from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeTransaction(buf []byte, obj *coin.Transaction) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Length + i, err := d.Uint32() + if err != nil { + return 0, err + } + obj.Length = i + } + + { + // obj.Type + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Type = i + } + + { + // obj.InnerHash + if len(d.Buffer) < len(obj.InnerHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.InnerHash[:], d.Buffer[:len(obj.InnerHash)]) + d.Buffer = d.Buffer[len(obj.InnerHash):] + } + + { + // obj.Sigs + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Sigs = make([]cipher.Sig, length) + + for z1 := range obj.Sigs { + { + // obj.Sigs[z1] + if len(d.Buffer) < len(obj.Sigs[z1]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Sigs[z1][:], d.Buffer[:len(obj.Sigs[z1])]) + d.Buffer = d.Buffer[len(obj.Sigs[z1]):] + } + + } + } + } + + { + // obj.In + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.In = make([]cipher.SHA256, length) + + for z1 := range obj.In { + { + // obj.In[z1] + if len(d.Buffer) < len(obj.In[z1]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.In[z1][:], d.Buffer[:len(obj.In[z1])]) + d.Buffer = d.Buffer[len(obj.In[z1]):] + } + + } + } + } + + { + // obj.Out + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Out = make([]coin.TransactionOutput, length) + + for z1 := range obj.Out { + { + // obj.Out[z1].Address.Version + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Out[z1].Address.Version = i + } + + { + // obj.Out[z1].Address.Key + if len(d.Buffer) < len(obj.Out[z1].Address.Key) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Out[z1].Address.Key[:], d.Buffer[:len(obj.Out[z1].Address.Key)]) + d.Buffer = d.Buffer[len(obj.Out[z1].Address.Key):] + } + + { + // obj.Out[z1].Coins + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Out[z1].Coins = i + } + + { + // obj.Out[z1].Hours + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Out[z1].Hours = i + } + + } + } + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeTransactionExact decodes an object of type Transaction from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeTransactionExact(buf []byte, obj *coin.Transaction) error { + if n, err := decodeTransaction(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/daemon/transaction_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/daemon/transaction_skyencoder_test.go new file mode 100644 index 00000000..a2040bde --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/daemon/transaction_skyencoder_test.go @@ -0,0 +1,422 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package daemon + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" + "github.com/SkycoinProject/skycoin/src/coin" +) + +func newEmptyTransactionForEncodeTest() *coin.Transaction { + var obj coin.Transaction + return &obj +} + +func newRandomTransactionForEncodeTest(t *testing.T, rand *mathrand.Rand) *coin.Transaction { + var obj coin.Transaction + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenTransactionForEncodeTest(t *testing.T, rand *mathrand.Rand) *coin.Transaction { + var obj coin.Transaction + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilTransactionForEncodeTest(t *testing.T, rand *mathrand.Rand) *coin.Transaction { + var obj coin.Transaction + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderTransaction(t *testing.T, obj *coin.Transaction) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeTransaction(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeTransaction() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeTransaction(obj) + if err != nil { + t.Fatalf("encodeTransaction failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeTransaction produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeTransaction()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeTransactionToBuffer(data3, obj); err != nil { + t.Fatalf("encodeTransactionToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 coin.Transaction + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 coin.Transaction + if n, err := decodeTransaction(data2, &obj3); err != nil { + t.Fatalf("decodeTransaction failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeTransaction bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeTransaction()") + } + + // Decode, excess buffer + var obj4 coin.Transaction + n, err := decodeTransaction(data3, &obj4) + if err != nil { + t.Fatalf("decodeTransaction failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeTransaction bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeTransaction bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeTransaction()") + } + + // DecodeExact + var obj5 coin.Transaction + if err := decodeTransactionExact(data2, &obj5); err != nil { + t.Fatalf("decodeTransaction failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeTransaction()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeTransaction(data4, &obj3); err != nil { + t.Fatalf("decodeTransaction failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeTransaction bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderTransaction(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *coin.Transaction + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptyTransactionForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomTransactionForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenTransactionForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilTransactionForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderTransaction(t, tc.obj) + }) + } +} + +func decodeTransactionExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj coin.Transaction + if _, err := decodeTransaction(buf, &obj); err == nil { + t.Fatal("decodeTransaction: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeTransaction: expected error %q, got %q", expectedErr, err) + } +} + +func decodeTransactionExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj coin.Transaction + if err := decodeTransactionExact(buf, &obj); err == nil { + t.Fatal("decodeTransactionExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeTransactionExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderTransactionDecodeErrors(t *testing.T, k int, tag string, obj *coin.Transaction) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeTransaction(obj) + buf, err := encodeTransaction(obj) + if err != nil { + t.Fatalf("encodeTransaction failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeTransactionExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeTransactionExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeTransactionExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeTransactionExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeTransactionExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderTransactionDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptyTransactionForEncodeTest() + fullObj := newRandomTransactionForEncodeTest(t, rand) + testSkyencoderTransactionDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderTransactionDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/fiber/config.go b/vendor/github.com/SkycoinProject/skycoin/src/fiber/config.go new file mode 100644 index 00000000..ed76effd --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/fiber/config.go @@ -0,0 +1,177 @@ +/* +Package fiber provides configuration definitions and utilities for managing fiber coins +*/ +package fiber + +import ( + "fmt" + "strings" + + "github.com/spf13/viper" + + "github.com/SkycoinProject/skycoin/src/cipher/bip44" +) + +// Config records fiber coin parameters +type Config struct { + Node NodeConfig `mapstructure:"node"` + Params ParamsConfig `mapstructure:"params"` +} + +// NodeConfig configures the default CLI options for the skycoin node. +// These parameters are loaded via cmd/skycoin/skycoin.go into src/SkycoinProject/skycoin.go. +type NodeConfig struct { + // Port is the default port that the wire protocol communicates over + Port int `mapstructure:"port"` + // WebInterfacePort is the default port that the web/gui interface serves on + WebInterfacePort int `mapstructure:"web_interface_port"` + // GenesisSignatureStr is a hex-encoded signature of the genesis block input + GenesisSignatureStr string `mapstructure:"genesis_signature_str"` + // GenesisAddressStr is the skycoin address that the genesis coins were sent to in the genesis block + GenesisAddressStr string `mapstructure:"genesis_address_str"` + // BlockchainPubkeyStr is a hex-encoded public key used to validate published blocks + BlockchainPubkeyStr string `mapstructure:"blockchain_pubkey_str"` + // BlockchainSeckey is a hex-encoded secret key required for block publishing. + // It must correspond to BlockchainPubkeyStr + BlockchainSeckeyStr string `mapstructure:"blockchain_seckey_str"` + // GenesisTimestamp is the timestamp of the genesis block + GenesisTimestamp uint64 `mapstructure:"genesis_timestamp"` + // GenesisCoinVolume is the total number of coins in the genesis block + GenesisCoinVolume uint64 `mapstructure:"genesis_coin_volume"` + // DefaultConnections are the default "trusted" connections a node will try to connect to for bootstrapping + DefaultConnections []string `mapstructure:"default_connections"` + // PeerlistURL is a URL pointing to a newline-separated list of ip:ports that are used for bootstrapping (but they are not "trusted") + PeerListURL string `mapstructure:"peer_list_url"` + + // UnconfirmedBurnFactor is the burn factor to apply when verifying unconfirmed transactions + UnconfirmedBurnFactor uint32 `mapstructure:"unconfirmed_burn_factor"` + // UnconfirmedMaxTransactionSize is the maximum size of an unconfirmed transaction + UnconfirmedMaxTransactionSize uint32 `mapstructure:"unconfirmed_max_transaction_size"` + // UnconfirmedMaxDropletPrecision is the maximum number of decimals allowed in an unconfirmed transaction + UnconfirmedMaxDropletPrecision uint8 `mapstructure:"unconfirmed_max_decimals"` + // CreateBlockBurnFactor is the burn factor to apply to transactions when publishing blocks + CreateBlockBurnFactor uint32 `mapstructure:"create_block_burn_factor"` + // CreateBlockMaxTransactionSize is the maximum size of an transaction when publishing blocks + CreateBlockMaxTransactionSize uint32 `mapstructure:"create_block_max_transaction_size"` + // CreateBlockMaxDropletPrecision is the maximum number of decimals allowed in a transaction when publishing blocks + CreateBlockMaxDropletPrecision uint8 `mapstructure:"create_block_max_decimals"` + // MaxBlockTransactionsSize is the maximum total size of transactions in a block when publishing a block + MaxBlockTransactionsSize uint32 `mapstructure:"max_block_transactions_size"` + + // DisplayName is the display name of the coin in the wallet e.g. Skycoin + DisplayName string `mapstructure:"display_name"` + // Ticker is the coin's price ticker, e.g. SKY + Ticker string `mapstructure:"ticker"` + // CoinHoursName is the name of the coinhour asset type, e.g. Coin Hours + CoinHoursName string `mapstructure:"coin_hours_display_name"` + // CoinHoursNameSingular is the singular form of the name of the coinhour asset type, e.g. Coin Hour + CoinHoursNameSingular string `mapstructure:"coin_hours_display_name_singular"` + // CoinHoursTicker is the name of the coinhour asset type's price ticker, e.g. SCH (Skycoin Coin Hours) + CoinHoursTicker string `mapstructure:"coin_hours_ticker"` + // ExplorerURL is the URL of the public explorer + ExplorerURL string `mapstructure:"explorer_url"` + // VersionURL is the URL for wallet to check the latest version number + VersionURL string `mapstructure:"version_url"` + // Bip44Coin is the default "coin" value of the bip44 path + Bip44Coin bip44.CoinType `mapstructure:"bip44_coin"` + + // These fields are set by cmd/newcoin and are not configured in the fiber.toml file + CoinName string + DataDirectory string +} + +// ParamsConfig are the parameters used to generate params/params.go. +// These parameters are exposed in an importable package `params` because they +// may need to be imported by libraries that would not know the node's configured CLI options. +type ParamsConfig struct { + // MaxCoinSupply is the maximum supply of coins + MaxCoinSupply uint64 `mapstructure:"max_coin_supply"` + // InitialUnlockedCount is the initial number of unlocked addresses + InitialUnlockedCount uint64 `mapstructure:"initial_unlocked_count"` + // UnlockAddressRate is the number of addresses to unlock per unlock time interval + UnlockAddressRate uint64 `mapstructure:"unlock_address_rate"` + // UnlockTimeInterval is the distribution address unlock time interval, measured in seconds. + // Once the InitialUnlockedCount is exhausted, UnlockAddressRate addresses will be unlocked per UnlockTimeInterval + UnlockTimeInterval uint64 `mapstructure:"unlock_time_interval"` + // UserMaxDropletPrecision represents the decimal precision of droplets + UserMaxDropletPrecision uint64 `mapstructure:"user_max_decimals"` + // UserMaxTransactionSize is max size of a user-created transaction (typically equal to the max size of a block) + UserMaxTransactionSize int `mapstructure:"user_max_transaction_size"` + // DistributionAddresses are addresses that received coins from the genesis address in the first block, + // used to calculate current and max supply and do distribution timelocking + DistributionAddresses []string `mapstructure:"distribution_addresses"` + // UserBurnFactor inverse fraction of coinhours that must be burned, this value is used when creating transactions + UserBurnFactor uint64 `mapstructure:"user_burn_factor"` +} + +// NewConfig loads blockchain config parameters from a config file +// default file is: fiber.toml in the project root +// JSON, toml or yaml file can be used (toml preferred). +func NewConfig(configName, appDir string) (Config, error) { + // set viper parameters + // check that file is of supported type + confNameSplit := strings.Split(configName, ".") + fileType := confNameSplit[len(confNameSplit)-1] + switch fileType { + case "toml", "json", "yaml", "yml": + viper.SetConfigType(confNameSplit[len(confNameSplit)-1]) + default: + return Config{}, fmt.Errorf("invalid blockchain config file type: %s", fileType) + } + + configName = configName[:len(configName)-(len(fileType)+1)] + viper.SetConfigName(configName) + + viper.AddConfigPath(appDir) + viper.AddConfigPath(".") + + // set defaults + setDefaults() + + params := Config{} + + if err := viper.ReadInConfig(); err != nil { + return params, err + } + + if err := viper.Unmarshal(¶ms); err != nil { + return params, err + } + + return params, nil +} + +func setDefaults() { + // node defaults + viper.SetDefault("node.genesis_coin_volume", 100e12) + viper.SetDefault("node.port", 6000) + viper.SetDefault("node.web_interface_port", 6420) + viper.SetDefault("node.unconfirmed_burn_factor", 10) + viper.SetDefault("node.unconfirmed_max_transaction_size", 32*1024) + viper.SetDefault("node.unconfirmed_max_decimals", 3) + viper.SetDefault("node.create_block_burn_factor", 10) + viper.SetDefault("node.create_block_max_transaction_size", 32*1024) + viper.SetDefault("node.create_block_max_decimals", 3) + viper.SetDefault("node.max_block_transactions_size", 32*1024) + viper.SetDefault("node.display_name", "Skycoin") + viper.SetDefault("node.ticker", "SKY") + viper.SetDefault("node.coin_hours_display_name", "Coin Hours") + viper.SetDefault("node.coin_hours_display_name_singular", "Coin Hour") + viper.SetDefault("node.coin_hours_ticker", "SCH") + viper.SetDefault("node.explorer_url", "https://explorer.skycoin.com") + viper.SetDefault("node.version_url", "https://version.skycoin.com/skycoin/version.txt") + viper.SetDefault("node.bip44_coin", bip44.CoinTypeSkycoin) + + // build defaults + viper.SetDefault("build.commit", "") + viper.SetDefault("build.branch", "") + + // params defaults + viper.SetDefault("params.max_coin_supply", 1e8) + viper.SetDefault("params.initial_unlocked_count", 25) + viper.SetDefault("params.unlock_address_rate", 5) + viper.SetDefault("params.unlock_time_interval", 60*60*24*365) + viper.SetDefault("params.user_max_decimals", 3) + viper.SetDefault("params.user_burn_factor", 10) + viper.SetDefault("params.user_max_transaction_size", 32*1024) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/fiber/config_test.go b/vendor/github.com/SkycoinProject/skycoin/src/fiber/config_test.go new file mode 100644 index 00000000..9bda26d2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/fiber/config_test.go @@ -0,0 +1,60 @@ +package fiber + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher/bip44" +) + +// TODO(therealssj): write better tests +func TestNewConfig(t *testing.T) { + coinConfig, err := NewConfig("test.fiber.toml", "./testdata") + require.NoError(t, err) + require.Equal(t, Config{ + Node: NodeConfig{ + GenesisSignatureStr: "eb10468d10054d15f2b6f8946cd46797779aa20a7617ceb4be884189f219bc9a164e56a5b9f7bec392a804ff3740210348d73db77a37adb542a8e08d429ac92700", + GenesisAddressStr: "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + BlockchainPubkeyStr: "0328c576d3f420e7682058a981173a4b374c7cc5ff55bf394d3cf57059bbe6456a", + BlockchainSeckeyStr: "", + GenesisTimestamp: 1426562704, + GenesisCoinVolume: 100e12, + DefaultConnections: []string{ + "118.178.135.93:6000", + "47.88.33.156:6000", + "104.237.142.206:6000", + "176.58.126.224:6000", + "172.104.85.6:6000", + "139.162.7.132:6000", + }, + Port: 6000, + PeerListURL: "https://downloads.skycoin.com/blockchain/peers.txt", + WebInterfacePort: 6420, + UnconfirmedBurnFactor: 10, + UnconfirmedMaxTransactionSize: 777, + UnconfirmedMaxDropletPrecision: 3, + CreateBlockBurnFactor: 9, + CreateBlockMaxTransactionSize: 1234, + CreateBlockMaxDropletPrecision: 4, + MaxBlockTransactionsSize: 1111, + DisplayName: "Testcoin", + Ticker: "TST", + CoinHoursName: "Testcoin Hours", + CoinHoursNameSingular: "Testcoin Hour", + CoinHoursTicker: "TCH", + ExplorerURL: "https://explorer.testcoin.com", + VersionURL: "https://version.testcoin.com/testcoin/version.txt", + Bip44Coin: bip44.CoinTypeSkycoin, + }, + Params: ParamsConfig{ + MaxCoinSupply: 1e8, + UnlockAddressRate: 5, + InitialUnlockedCount: 25, + UnlockTimeInterval: 60 * 60 * 24 * 365, + UserBurnFactor: 3, + UserMaxTransactionSize: 999, + UserMaxDropletPrecision: 2, + }, + }, coinConfig) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/fiber/testdata/test.fiber.toml b/vendor/github.com/SkycoinProject/skycoin/src/fiber/testdata/test.fiber.toml new file mode 100644 index 00000000..459a238b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/fiber/testdata/test.fiber.toml @@ -0,0 +1,38 @@ +# fiber configuration +# Defaults are shown, commented out +# Some values have no defaults and must be filled in +[node] +genesis_signature_str = "eb10468d10054d15f2b6f8946cd46797779aa20a7617ceb4be884189f219bc9a164e56a5b9f7bec392a804ff3740210348d73db77a37adb542a8e08d429ac92700" +genesis_address_str = "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6" +blockchain_pubkey_str = "0328c576d3f420e7682058a981173a4b374c7cc5ff55bf394d3cf57059bbe6456a" +blockchain_seckey_str = "" +genesis_timestamp = 1426562704 +default_connections = [ + "118.178.135.93:6000", + "47.88.33.156:6000", + "104.237.142.206:6000", + "176.58.126.224:6000", + "172.104.85.6:6000", + "139.162.7.132:6000", +] +launch_browser = true +peer_list_url = "https://downloads.skycoin.com/blockchain/peers.txt" +unconfirmed_burn_factor = 10 +unconfirmed_max_transaction_size = 777 +unconfirmed_max_decimals = 3 +create_block_burn_factor = 9 +create_block_max_transaction_size = 1234 +create_block_max_decimals = 4 +max_block_transactions_size = 1111 +display_name = "Testcoin" +ticker = "TST" +coin_hours_display_name = "Testcoin Hours" +coin_hours_display_name_singular = "Testcoin Hour" +coin_hours_ticker = "TCH" +explorer_url = "https://explorer.testcoin.com" +version_url = "https://version.testcoin.com/testcoin/version.txt" + +[params] +user_burn_factor = 3 +user_max_transaction_size = 999 +user_max_decimals = 2 diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/.angular-cli.json b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/.angular-cli.json new file mode 100644 index 00000000..8fcfda2a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/.angular-cli.json @@ -0,0 +1,65 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "project": { + "name": "desktopwallet" + }, + "apps": [ + { + "root": "src", + "outDir": "dist", + "assets": [ + "assets", + "favicon.ico", + "app/current-skycoin.json" + ], + "index": "index.html", + "main": "main.ts", + "polyfills": "polyfills.ts", + "test": "test.ts", + "tsconfig": "tsconfig.app.json", + "testTsconfig": "tsconfig.spec.json", + "prefix": "app", + "styles": [ + "../node_modules/font-awesome/css/font-awesome.css", + "assets/fonts/material-icons/material-icons.css", + "styles.scss" + ], + "scripts": [ + "assets/scripts/qrcode.min.js" + ], + "environmentSource": "environments/environment.ts", + "environments": { + "dev": "environments/environment.ts", + "prod": "environments/environment.prod.ts" + } + } + ], + "e2e": { + "protractor": { + "config": "./protractor.conf.js" + } + }, + "lint": [ + { + "project": "src/tsconfig.app.json", + "exclude": "**/node_modules/**" + }, + { + "project": "src/tsconfig.spec.json", + "exclude": "**/node_modules/**" + }, + { + "project": "e2e/tsconfig.e2e.json", + "exclude": "**/node_modules/**" + } + ], + "test": { + "karma": { + "config": "./karma.conf.js" + } + }, + "defaults": { + "styleExt": "sass", + "component": {} + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/.editorconfig b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/.editorconfig new file mode 100644 index 00000000..6e87a003 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/.editorconfig @@ -0,0 +1,13 @@ +# Editor configuration, see http://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +max_line_length = off +trim_trailing_whitespace = false diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/.gitignore b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/.gitignore new file mode 100755 index 00000000..30c55b61 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/.gitignore @@ -0,0 +1,41 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/tmp +/out-tsc + +# dependencies +/node_modules + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json + +# misc +/.sass-cache +/connect.lock +/coverage +/libpeerconnection.log +npm-debug.log +testem.log +/typings + +# e2e +/e2e/*.js +/e2e/*.map + +# System Files +.DS_Store +Thumbs.db diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/README.md b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/README.md new file mode 100644 index 00000000..da9265bd --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/README.md @@ -0,0 +1,71 @@ +# Skycoin desktop client + +The Skycoin wallet ships with a web interface which can be ran from the browser and/or Electron. + +The project contains both the source (src) and target (dist) files of this web interface. + +## Prerequisites + +The Skycoin web interface requires Node 8.10.0 or higher, together with NPM 5.6 or higher. + +## Installation + +This project is generated using Angular CLI, therefore it is adviced to first run `npm install -g @angular/cli`. + +Dependencies are managed with NPM 5, to install these run `npm install`. + +You will only have to run this again, if any dependencies have been changed in the `package-lock.json` file. + +## Compiling new target files + +After pulling the latest code, you might first have to update your dependencies, in case someone else has updated them. +You should always do this when compiling new production files: + +``` +rm -rf node_modules +npm install +``` + +This will remove the current dependencies, and install them from the `package-lock.json`. + +To compile new target files, you will have to run: `npm run build`. + +## Development server + +Run `npm start` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. + +Please note that you will most likely receive CORS errors as there's a difference between the port number of the source and destination. + +As a work-around, the development server will create a proxy from `http://localhost:4200/api` to `http://127.0.0.1:6420/`. + +You can route all calls to this address by changing the url property on the ApiService class. + +## Swaplab integration + +The wallet has a section for buying coins using the Swaplab service and, during development, it is possible to configure its operation, +in order to test its different parts without having to make a real exchange. The configuration is done by modifying the properties of +the `swaplab` object in [environment.ts](/src/gui/static/src/environment/environment.ts). + +If you set `swaplab.activateTestMode` to `true`, all operations made with the Swaplab integration will be faked. When creating a new +operation or opening an old one using the history, the system will show the operation progressing every few seconds, from the state in +which the user is expected to make the initial deposit to the moment in which the operation is completed. +If `swaplabTests.activateTestMode` is `false`, the integration will work as it should and you will be able to make real exchange transactions. + +Also `swaplab` has a property called `endStatusInError`. If you set it to `true` and `swaplabTests.activateTestMode` is also `true`, +all the faked operations will end in an error, instead of success. + +## Purchase API (teller) + +Please note that at the moment the Purchase API (teller) is both offline and not supporting CORS headers. + +While event.skycoin.com is not working, we will have to run the purchase API locally. + +Similar as the solution for the above CORS issue, you can circumvent CORS issues by changing the url property to '/teller/' + +## Style guide + +As an Angular application, we try to follow the [Angular style guide](https://angular.io/guide/styleguide). + +## Translations + +You can find information about how to work with translation files in the [Translations README](/src/gui/static/src/assets/i18n/README.md). diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/0.d5967d50848818a3b5b3.chunk.js b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/0.d5967d50848818a3b5b3.chunk.js new file mode 100644 index 00000000..228c54da --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/0.d5967d50848818a3b5b3.chunk.js @@ -0,0 +1 @@ +webpackJsonp([0],{dXVM:function(e,t){e.exports={common:{"coin-id":"SKY","coin-hours":"Coin Hours",usd:"USD",loading:"Loading...",new:"New",load:"Load"},errors:{error:"Error","fetch-version":"Unable to fetch latest release version from Github","incorrect-password":"Incorrect password","error-decrypting":"Error decrypting the wallet","api-disabled":"API disabled","no-wallet":"Wallet does not exist","no-outputs":"No unspent outputs","window-size":"The window is too narrow for the content"},title:{language:"Select Language",wallets:"Wallets",send:"Send",history:"History","buy-coin":"Buy Skycoin",network:"Networking",blockchain:"Blockchain",outputs:"Outputs",transactions:"Transactions","pending-txs":"Pending Transactions",backup:"Backup Wallet",explorer:"Skycoin Explorer",seed:"Wallet Seed",qrcode:"QR Code",reset:"Reset Password",exchange:"Exchange","select-address":"Select Address","order-history":"Order history"},header:{"syncing-blocks":"Syncing blocks",update1:"Wallet update",update2:"available.",synchronizing:"The wallet is synchronizing. Data you see may not be updated.","pending-txs1":"There are some","pending-txs2":"pending transactions.","pending-txs3":"Data you see may not be updated.",errors:{"no-connections":"No connections active, your client is not connected to any other nodes!","no-backend1":"Cannot reach backend. Please restart the app and/or seek help on our","no-backend2":"Telegram.","no-backend3":"",csrf:"Security vulnerability: CSRF is not working, please exit immediately."}},password:{title:"Enter Password",label:"Password","confirm-label":"Confirm password",button:"Proceed","reset-link":"I forgot my password"},buy:{"deposit-address":"Choose an address to generate a BTC deposit link for:","select-address":"Select address",generate:"Generate","deposit-location":"Deposit Location","deposit-location-desc":"Choose a wallet where you'd like us to deposit your Skycoin after we receive your Bitcoin.","make-choice":"Make a choice","wallets-desc":"Each time a new wallet and address are selected, a new BTC address is generated. A single Skycoin address can have up to 5 BTC addresses assigned to it.",send:"Send Bitcoin","send-desc":"Send Bitcoin to the address below. Once received, we will deposit the Skycoin to a new address in the wallet selected above at the current rate of {{ rate }} SKY/BTC.","fraction-warning":"Only send multiple of the SKY/BTC rate! Skycoin is sent in whole number; fractional SKY is not sent!",receive:"Receive Sky","receive-desc":"After receiving your Bitcoin, we'll send you your Skycoin. It may take anywhere between 20 minutes and an hour to receive your SKY.","status-button":"Status:","check-status-button":"Check Status","new-order-button":"New Order"},wizard:{"wallet-desc":'If you don\'t have a Skycoin wallet, use the generated seed to create a new one. If you already have a wallet, toggle over to "Load Wallet" and enter your seed.',"encrypt-desc":"Increase security of your wallet by encrypting it. By entering a password below, your wallet will be encrypted. Only those with the password will be able access the wallet and remove funds.","hardware-wallet-link":"Using a hardware wallet?","finish-button":"Finish","back-button":"Back",confirm:{title:"Safeguard your seed!",desc:"We want to make sure that you wrote down your seed and stored it in a safe place. If you forget your seed, you WILL NOT be able to recover your Skycoin wallet!",checkbox:"It\u2019s safe, I swear.",button:"Continue"}},wallet:{"new-address":"New Address","new-addresses":"New Addresses","show-empty":"Show Empty","hide-empty":"Hide Empty",encrypt:"Encrypt Wallet",decrypt:"Decrypt Wallet","decrypt-warning":"Warning: for security reasons, it is not recommended to keep the wallets unencrypted. Caution is advised.",delete:"Delete Wallet",edit:"Edit Wallet",add:"Add Wallet",load:"Load Wallet","encryption-enabled":"Encryption enabled","encryption-disabled":"Encryption disabled","hw-security-warning":'Possible security risk. Access the hardware wallet options (by pressing the "Hardware Wallet" button below the wallets list) while the device is connected for more information.',wallet:"Wallet","hardware-wallet":"Hardware Wallet","delete-confirmation":'WARNING: The wallet "{{ name }}" will be removed from the list. To add it again, you will have to reconnect the device and open the hardware wallet options (by pressing the "Hardware Wallet" button below the wallets list). Do you want to continue?',"delete-confirmation-check":"Yeah, I want to delete the wallet.","max-hardware-wallets-error":"You have already reached the max number of addresses that can be added to the hardware wallet.","add-many-confirmation":"WARNING: If you add too many addresses without using the previous ones or if you use the last ones and not the first ones, some addresses may not be recovered automatically if you try to restore the wallet using the seed (you will have to add them manually). Do you want to continue?",new:{"create-title":"Create Wallet","load-title":"Load Wallet","encrypt-title":"Encrypt Wallet","name-label":"Name","seed-label":"Seed","confirm-seed-label":"Confirm seed","seed-warning":"Remember this seed! Keep it in a safe place. If you forget your seed, you will not be able to recover your wallet!","create-button":"Create","load-button":"Load","cancel-button":"Cancel","12-words":"12 words","24-words":"24 words","generate-12-seed":"Generate 12 word seed","generate-24-seed":"Generate 24 word seed",encrypt:"Encrypt wallet","encrypt-warning":"We suggest that you encrypt each one of your wallets with a password. If you forget your password, you can reset it with your seed. Make sure you have your seed saved somewhere safe before encrypting your wallet.","unconventional-seed-title":"Possible error","unconventional-seed-text":"You introduced an unconventional seed. If you did it for any special reason, you can continue (only recommended for advanced users). However, if your intention is to use a normal system seed, you must delete all the additional text and special characters.","unconventional-seed-check":"Continue with the unconventional seed."},rename:{title:"Rename Wallet","name-label":"Name","cancel-button":"Cancel","rename-button":"Rename"},"add-addresses":{title:"Select quantity","name-quantity":"How many addresses to create","cancel-button":"Cancel","create-button":"Create"},address:{show:"Press to show",copy:"Copy","copy-address":"Copy address",copied:"Copied!",confirm:"Confirm address",outputs:"Unspent outputs",history:"History"}},send:{"synchronizing-warning":"The wallet is still synchronizing the data, so the balance shown may be incorrect. Are you sure you want to continue?","from-label":"Send from","to-label":"Send to","amount-label":"Amount","notes-label":"Notes","wallet-label":"Wallet","addresses-label":"Addresses","invalid-amount":"Please enter a valid amount","addresses-help":"Limit the addresses from where the coins and hours could be sent","all-addresses":"All the addresses of the selected wallet","outputs-label":"Unspent outputs","outputs-help":"Limit the unspent outputs from where the coins and hours could be sent. Only the outputs from the selected addresses are shown","all-outputs":"All the outputs of the selected addresses","available-msg-part1":"With your current selection you can send up to","available-msg-part2":"and","available-msg-part3":"(at least","available-msg-part4":"must be used for the transaction fee).","change-address-label":"Custom change address","change-address-select":"Select","change-address-help":'Address to receive change. If it\'s not provided, it will be chosen automatically. Click on the "Select" link to choose an address from one of your wallets',"destinations-label":"Destinations","destinations-help1":"Destination addresses and their coins","destinations-help2":"Destination addresses, their coins and coin hours","hours-allocation-label":"Automatic coin hours allocation","options-label":"Options","value-label":"Coin hours share factor","value-help":"The higher the value, the more coin hours will be sent to outputs","preview-button":"Preview","send-button":"Send","back-button":"Back",simple:"Simple",advanced:"Advanced","select-wallet":"Select Wallet"},reset:{"wallet-label":"Wallet","seed-label":"Wallet seed","password-label":"New password (leave empty if you want the wallet not to be encrypted)","confirm-label":"Confirm new password","reset-button":"Reset"},tx:{transaction:"Transaction","confirm-transaction":"Confirm Transaction",from:"From",to:"To",date:"Date",status:"Status",coins:"Coins",hours:"Hours",id:"Tx ID","show-more":"Show more","hours-moved":"moved","hours-sent":"sent","hours-received":"received","hours-burned":"burned",inputs:"Inputs",outputs:"Outputs",confirmed:"Confirmed",pending:"Pending","current-rate":"Calculated at the current rate"},backup:{"wallet-directory":"Wallet Directory:","seed-warning":"BACKUP YOUR SEED. ON PAPER. IN A SAFE PLACE. As long as you have your seed, you can recover your coins.",desc:"Use the table below to get seeds from your encrypted wallets.
To get seeds from unencrypted wallets, open the folder above, open the .wlt files in a text editor and recover the seeds.","close-button":"Close",wallet:"Wallet Label",filename:"Filename",seed:"Seed","show-seed":"Show seed","no-wallets":"No encrypted wallets"},blockchain:{blocks:"Number of blocks",time:"Timestamp of last block",hash:"Hash of last block","current-supply":"Current SKY supply","total-supply":"Total SKY supply","current-coinhour-supply":"Current Coin Hours supply","total-coinhour-supply":"Total Coin Hours supply"},network:{peer:"Peer",source:"Source","block-height":"Block height","block-height-short":"Block","last-seen":"Last seen","last-received":"Last received","last-sent":"Last sent",in:"Incoming",out:"Outgoing",sources:{default:"Default peer",exchange:"Peer exchange"}},"pending-txs":{timestamp:"Timestamp",txid:"Transaction ID",none:"No pending transactions",my:"Mine",all:"All"},history:{"tx-detail":"Transaction Detail",moving:"Internally moving",moved:"Internally moved",sending:"Sending",sent:"Sent",received:"Received",receiving:"Receiving",pending:"Pending","no-txs":"You have no transaction history","no-txs-filter":"There are no transactions matching the current filter criteria","no-filter":"No filter active (press to select wallets/addresses)",filter:"Active filter: ",filters:"Active filters: ","all-addresses":"All addresses"},teller:{done:"Completed","waiting-confirm":"Waiting for confirmation","waiting-deposit":"Waiting for Bitcoin deposit","waiting-send":"Waiting to send Skycoin",unknown:"Unknown"},confirmation:{"header-text":"Confirmation","confirm-button":"Yes","cancel-button":"No",close:"Close"},service:{api:{"server-error":"Server error"},wallet:{"not-enough-hours":"Not enough available Coin Hours to perform the transaction!"}},"hardware-wallet":{general:{"default-wallet-name":"New hardware wallet","error-disconnected":"Unable to perform the operation. The hardware wallet is not connected.","simple-error":"Error, Unable to perform the operation.","generic-error":"Unable to perform the operation. Make sure you have connected a valid hardware wallet and that it is not waiting for input.","generic-error-internet":"Unable to perform the operation. Make sure you have connected a valid hardware wallet that is not waiting for input and that you have a connection to the internet/node.","error-incorrect-wallet":"Unable to perform the operation. The connected hardware wallet is different from the expected one.","error-incorrect-pin":"Unable to perform the operation. The PIN you have entered is not correct.",confirm:"Please, confirm the operation in the hardware wallet.","confirm-and-more":"Please, confirm the operation in the hardware wallet and follow the instructions.",close:"Close",cancel:"Cancel",continue:"Continue",completed:"Operation completed successfully.",refused:"The operation failed or was canceled."},errors:{"too-many-inputs":"The transaction has too many inputs and can not be processed. Please contact technical support.","too-many-outputs":"The transaction has too many outputs and can not be processed. Please contact technical support."},"security-warning":{title:"Security warning",text:'The last time this hardware wallet was connected, one or more security warnings were found. We recommend you to open the hardware wallet options (by pressing the "Hardware Wallet" button below the wallets list) while the device is connected and solve the security problems before continuing.',check:"I understand the risks and want to continue",continue:"Continue",cancel:"Cancel"},options:{connecting:"Connecting...",disconnected:"No hardware wallet detected. Please connect a hardware wallet to use this option.","unconfigured-detected-title":"Unconfigured hardware wallet","unconfigured-detected":'A seedless hardware wallet has been detected. Select "Configure automatically" if you want to configure it as a brand new wallet and start using it immediately, or select "Restore backup" if you want to configure it with a previously created seed backup and thus be able to access your funds again.',"configured-detected":"Hardware wallet detected. The device is identified in the wallets list as:","security-warnings-title":"Security warnings","security-warning-title":"Security warning","backup-warning":'You should backup the hardware wallet seed or you could lose access to the funds in case of problems. To do this, select the "Create a backup" option.',"pin-warning":'The connected hardware wallet does not have a PIN. The PIN code protects the hardware wallet in case of loss, theft and hacks. To create a PIN code, select the "Create PIN code" option.',options:"Options:","configure-automatically":"Configure automatically","restore-backup":"Restore backup","create-backup":"Create a backup",wipe:"Wipe the device","confirm-seed":"Confirm seed","create-pin":"Create PIN code","change-pin":"Change PIN code","forgotten-pin1":"If you can not access the wallet because you have forgotten the PIN, you can wipe the hardware wallet and then restore it with the seed by clicking","forgotten-pin2":"here."},"generate-seed":{text:"Before proceeding, you can select the number of words you want the seed to have. The seed is a list of words that can be used to recover access to the coins in case of problems. Both values are safe, so if you do not have a special reason for selecting one or the other, you can leave the default value.",configuring:"Configuring..."},"restore-seed":{text:"Before proceeding, please select the number of words that the seed you want to recover has.","check-text":"You can use this option to enter a seed and check if it is equal to the one in the hardware wallet. Before start, select the number of words the seed you want to check has.",warning:"WARNING: to avoid potential problems, use only seeds created with a hardware wallet from the same brand/model.","error-wrong-word":"Error: The retyped word does not match the one requested by the hardware wallet.","error-invalid-seed":"Error: The seed is not valid. Please be sure to enter the correct words in the correct order.","error-wrong-seed":"Error: The seed is valid but does not match the one in the device."},added:{title:"New Hardware Wallet",configuring:"New hardware wallet detected. Configuring...",done:"Done",added1:"The connected hardware wallet has been added to the wallets list with the following name:",added2:"Now you can check the balance and the addresses of the hardware wallet even when it is not connected. Additionally, you can change the name of the wallet or remove it from the wallets list, if you wish."},wipe:{warning:"WARNING: All the data in the hardware wallet will be deleted. If you do not have a backup, you will not be able to access your funds again.","confirm-delete":"Also remove from the wallets list"},"create-backup":{warning:'WARNING: You can only use this option to backup your hardware wallet seed once. If you decide to continue, you will have to write down a group of words (it is recommended to do it on paper and not on a computer) that will appear on the screen of the hardware wallet and store the list in a safe place. Anyone with access to the word list (the "seed") will be able access the wallet balance, so extreme caution is advised.',instructions:"Write down the word list that appear on the screen of the hardware wallet. Make sure you respect the order and write each word correctly."},"seed-word":{title:"Enter word",info1:"Enter the word indicated in the device",info2:"You will be asked to enter the words of your backup seed in random order, plus a few additional words.",word:"Requested word","error-invalid-word":"The entered word is not valid.","error-loading-words":"Loading the word list. Please wait."},"change-pin":{"pin-mismatch":"Unable to perform the operation. Two PINs you have entered do not match."},"enter-pin":{title:"Enter PIN","title-change-current":"Enter the current PIN","title-change-new":"Enter the new PIN","title-change-confirm":"Confirm the new PIN",instructions:"The PIN layout is displayed on the hardware wallet screen.","instructions-tx":"Enter the PIN to confirm and sign the transaction.","instructions-change":"Please enter a hard-to-guess PIN of between 4 and 8 numbers.",help:"Need help?"},"pin-help":{title:"Help",part1:"When it is necessary to enter the PIN to continue, the hardware wallet screen will display a matrix of 9 boxes with numbers in random order (the order changes each time) and you will be asked to enter the PIN in the software wallet using a matrix of 9 buttons that simply show the symbol #.",part2:'To enter the PIN, look at the position of the PIN numbers in numbers matrix on the screen of the hardware wallet and press the corresponding buttons in the software wallet. For example, if the PIN is "23" and the number 2 is in the upper left, number 3 in the middle of the hardware wallet numbers matrix, press the upper left and middle button in that order in the software wallet.',part3:'If you wish, you can also use the numpad on your keyboard to enter the PIN. However, as in the previous example, if the PIN is "23", you can not simply type "23" with the numpad, but you will have to press the keys that are in the position where the numbers 2 and 3 are shown on the screen of the hardware wallet.'},"create-tx":{title:"Create transaction"},"confirm-address":{title:"Confirm address",instructions:"Please confirm on the hardware wallet if the address is:","short-confirmation":"Address confirmed.",confirmation:'Address confirmed. For security, you can re-show the address in the hardware wallet using the "Confirm address" option, in the menu that you can display by pressing the button at the right of the address balance.'}},"time-from-now":{"few-seconds":"a few seconds ago",minute:"one minute ago",minutes:"{{time}} minutes ago",hour:"one hour ago",hours:"{{time}} hours ago",day:"one day ago",days:"{{time}} days ago"},exchange:{"you-send":"You send","you-get":"You get (approx.)","to-address":"To {{coin}} address",price:"Exchange rate","time-15":"Exchange time","exchange-button":"Exchange","min-amount":"Minimum amount:","max-amount":"Maximum amount:","agree-1":"I agree with","agree-2":"Terms of Use","agree-3":"and","agree-4":"Privacy Policy","powered-by":"Powered by","need-help":"Need help?","support-portal":"Support portal",history:"Order history","order-not-found":"Order not found",status:"Status",exchanging:"Exchanging {{from}} for {{to}}",select:"Select",offline:"Exchange is temporarily offline","problem-connecting":"Unable to connect with the service. Please check your Internet connection and try again later.","invalid-address":"Invalid address.",statuses:{"user-waiting":"Waiting for deposit. Please send {{amount}} {{from}} to the exchange address shown below","user-waiting-info":"The system is waiting for you to make the deposit into the exchange address. The exchange process will start after the deposit is detected and confirmed in the blockchain. If you have already made the deposit, it should be detected shortly.","market-waiting-confirmations":"Waiting for transaction confirmations","market-waiting-confirmations-info":"The deposit has already been detected and the system is waiting for it to be confirmed in the blockchain.","market-confirmed":"Transaction accepted","market-confirmed-info":"The transaction has already been confirmed in the blockchain. Preparing to make the exchange soon.","market-exchanged":"Traded {{from}} for {{to}}","market-exchanged-info":"The exchange has been made. The funds will be transferred to your address in a moment.","market-withdraw-waiting":"Sending {{to}} to your address","market-withdraw-waiting-info":"The process for sending the coins to your address has been initiated.",complete:"Exchange completed!","complete-info":"The funds have been successfully sent to your address.",error:"Error occurred","error-info":"There was an error in the operation, you can find more information below. If you need help, please save all the operation data shown below and contact technical support using the link in the lower right part of this page."},"history-window":{address:"Address",date:"Date"},details:{"exchange-addr":"Exchange address","exchange-addr-tag":"Payment ID or Destination Tag which must be used for the transaction","tx-id":"Transaction ID","order-id":"Order ID","initial-price":"Initial exchange rate","error-msg":"Error message",details:"Details","start-date":"Start date",back:"Back","back-alert":'The operation is still in progress. Do you really want to return to the form? You can see the progress of this operation again by pressing the "Order history" button'}}}}}); \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/1.bf6ae8acc706c3217da3.chunk.js b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/1.bf6ae8acc706c3217da3.chunk.js new file mode 100644 index 00000000..8d077f5c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/1.bf6ae8acc706c3217da3.chunk.js @@ -0,0 +1 @@ +webpackJsonp([1],{ODm5:function(e,t){e.exports={common:{"coin-id":"SKY","coin-hours":"\u5e01\u65f6",usd:"\u7f8e\u5143",loading:"\u52a0\u8f7d\u4e2d...",new:"\u65b0",load:"\u52a0\u8f7d"},errors:{error:"\u9519\u8bef","fetch-version":"\u65e0\u6cd5\u4eceGithub\u83b7\u53d6\u6700\u65b0\u7248\u672c","incorrect-password":"\u5bc6\u7801\u9519\u8bef","error-decrypting":"\u89e3\u5bc6\u94b1\u5305\u65f6\u51fa\u9519","api-disabled":"API\u7981\u7528","no-wallet":"\u65e0\u53ef\u652f\u4ed8\u94b1\u5305","no-outputs":"\u65e0\u672a\u4ea4\u6613\u8f93\u51fa","window-size":"\u7a97\u53e3\u592a\u7a84\uff0c\u5185\u5bb9\u653e\u4e0d\u4e0b"},title:{language:"\u9009\u62e9\u8bed\u8a00",wallets:"\u94b1\u5305",send:"\u53d1\u9001",history:"\u5386\u53f2","buy-coin":"\u4e70 Skycoin",network:"\u7f51\u7edc",blockchain:"\u533a\u5757\u94fe",outputs:"\u672a\u4ea4\u6613\u8f93\u51fa",transactions:"\u4ea4\u6613","pending-txs":"\u5f85\u5904\u7406\u4ea4\u6613",backup:"\u5907\u4efd\u94b1\u5305",explorer:"Skycoin Explorer",seed:"\u94b1\u5305\u79cd\u5b50",qrcode:"QR\u4ee3\u7801",reset:"\u91cd\u7f6e\u5bc6\u7801",exchange:"\u4ea4\u6613","select-address":"\u9009\u62e9\u5730\u5740","order-history":"\u8ba2\u5355\u5386\u53f2"},header:{"syncing-blocks":"\u533a\u5757\u540c\u6b65\u4e2d",update1:"\u94b1\u5305\u66f4\u65b0",update2:"\u53ef\u83b7\u53d6",synchronizing:"\u94b1\u5305\u6b63\u5728\u540c\u6b65\u3002\u4f60\u770b\u5230\u7684\u6570\u636e\u53ef\u80fd\u4e0d\u662f\u6700\u65b0\u7684\u3002","pending-txs1":"\u8fd9\u91cc\u6709\u4e00\u4e9b","pending-txs2":"\u5f85\u5904\u7406\u4ea4\u6613.","pending-txs3":"\u4f60\u770b\u5230\u7684\u6570\u636e\u53ef\u80fd\u4e0d\u662f\u6700\u65b0\u7684\u3002",errors:{"no-connections":"\u6ca1\u6709\u8fde\u63a5\uff0c\u4f60\u7684\u5ba2\u6237\u7aef\u6ca1\u6709\u8fde\u63a5\u5230\u4efb\u4f55\u5176\u4ed6\u8282\u70b9","no-backend1":"\u4e0d\u80fd\u5230\u8fbe\u540e\u7aef\u3002\u8bf7\u91cd\u65b0\u542f\u52a8\u5e94\u7528\u7a0b\u5e8f\u6216\u5bfb\u6c42\u6211\u4eec\u7684\u5e2e\u52a9","no-backend2":"Telegram","no-backend3":"",csrf:"\u5b89\u5168\u6f0f\u6d1e: CSRF\u672a\u5de5\u4f5c\uff0c\u8bf7\u7acb\u5373\u9000\u51fa\u3002"}},password:{title:"\u8f93\u5165\u5bc6\u7801",label:"\u5bc6\u7801","confirm-label":"\u786e\u8ba4\u5bc6\u7801",button:"\u7ee7\u7eed","reset-link":"\u6211\u5fd8\u8bb0\u4e86\u5bc6\u7801"},buy:{"deposit-address":"\u9009\u62e9\u4e00\u4e2a\u5730\u5740\u6765\u751f\u6210BTC\u5145\u503c\u94fe\u63a5\uff0c\u7528\u4e8e:","select-address":"\u9009\u62e9\u5730\u5740",generate:"\u751f\u6210","deposit-location":"\u5145\u503c\u4f4d\u7f6e","deposit-location-desc":"\u9009\u62e9\u4e00\u4e2a\u94b1\u5305\uff0c\u4ee5\u5728\u6211\u4eec\u6536\u5230\u4f60\u7684\u6bd4\u7279\u5e01\u540e\u5145\u503cSkycoin\u5230\u8be5\u94b1\u5305","make-choice":"\u505a\u9009\u62e9","wallets-desc":"\u6bcf\u5f53\u9009\u62e9\u4e00\u4e2a\u65b0\u7684\u94b1\u5305\u548c\u5730\u5740\uff0c\u4e00\u4e2a\u65b0\u7684BTC\u5730\u5740\u5c06\u4f1a\u751f\u6210\u3002\u4e00\u4e2a\u72ec\u7acb\u7684Skycoin\u5730\u5740\u6700\u591a\u53ef\u7ed1\u5b9a5\u4e2aBTC\u5730\u5740\u3002",send:"\u53d1\u9001Bitcoin","send-desc":"\u53d1\u9001Bitcoin\u81f3\u5982\u4e0b\u5730\u5740\u3002\u4e00\u65e6\u6536\u5230\uff0c\u6211\u4eec\u5c06\u4f1a\u6309\u5f53\u524d\u6c47\u7387: {{ rate }} SKY/BTC\u5145\u503cSkycoin\u5230\u9009\u4e2d\u94b1\u5305\u7684\u4e00\u4e2a\u65b0\u5730\u5740\u3002","fraction-warning":"\u8bf7\u6309SKY/BTC\u6c47\u7387\u7684\u500d\u6570\u53d1\u9001BTC! Skycoin\u662f\u4ee5\u6574\u6570\u53d1\u9001; SKY\u7684\u5c0f\u6570\u4f4d\u5c06\u4e0d\u4f1a\u53d1\u9001",receive:"\u63a5\u6536Sky","receive-desc":"\u6536\u5230\u4f60\u7684\u6bd4\u7279\u5e01\u540e\uff0c\u6211\u4eec\u5c06\u53d1\u9001Skycoin\u7ed9\u4f60\u3002\u4f60\u53ef\u80fd\u9700\u898120\u5206\u949f\u5230\u4e00\u4e2a\u5c0f\u65f6\u624d\u80fd\u6536\u5230\u8fd9\u4e9bSKY\u3002","status-button":"\u72b6\u6001:","check-status-button":"\u67e5\u770b\u72b6\u6001","new-order-button":"\u65b0\u8ba2\u5355"},wizard:{"wallet-desc":'\u5982\u679c\u4f60\u6ca1\u6709Skycoin\u94b1\u5305\uff0c\u8bf7\u4f7f\u7528\u751f\u6210\u7684\u79cd\u5b50\u6765\u521b\u5efa\u4e00\u4e2a\u65b0\u94b1\u5305\u3002\u5982\u679c\u4f60\u5df2\u7ecf\u6709\u4e00\u4e2a\u94b1\u5305\uff0c\u5207\u6362\u5230"\u52a0\u8f7d\u94b1\u5305"\u5e76\u8f93\u5165\u4f60\u7684\u79cd\u5b50\u3002',"encrypt-desc":"\u901a\u8fc7\u52a0\u5bc6\u6765\u589e\u52a0\u94b1\u5305\u7684\u5b89\u5168\u6027\u3002\u8f93\u5165\u5bc6\u7801\u540e\uff0c\u4f60\u7684\u94b1\u5305\u4f1a\u88ab\u52a0\u5bc6\u3002\u53ea\u6709\u8f93\u5165\u5bc6\u7801\u624d\u53ef\u4ee5\u8bbf\u95ee\u7684\u94b1\u5305\u6216\u79fb\u52a8\u8d44\u91d1\u3002","hardware-wallet-link":"\u4f7f\u7528\u786c\u4ef6\u94b1\u5305\uff1f","finish-button":"\u5b8c\u6210","back-button":"\u540e\u9000",confirm:{title:"\u4fdd\u62a4\u4f60\u7684\u79cd\u5b50!",desc:"\u8bf7\u786e\u4fdd\u4f60\u5df2\u7ecf\u5199\u4e0b\u4f60\u7684\u79cd\u5b50\u5e76\u5c06\u5b83\u50a8\u5b58\u5728\u4e86\u4e00\u4e2a\u5b89\u5168\u7684\u5730\u65b9\u3002\u5982\u679c\u4f60\u5fd8\u8bb0\u4e86\u79cd\u5b50\uff0c\u4f60\u5c06\u65e0\u6cd5\u6062\u590d\u4f60\u7684Skycoin\u94b1\u5305",checkbox:"\u5b83\u5f88\u5b89\u5168\uff0c\u6211\u53d1\u8a93\u3002",button:"\u7ee7\u7eed"}},wallet:{"new-address":"\u65b0\u5730\u5740","new-addresses":"\u65b0\u5730\u5740","show-empty":"\u5c55\u793a\u7a7a\u5730\u5740","hide-empty":"\u9690\u85cf\u7a7a\u5730\u5740",encrypt:"\u52a0\u5bc6\u94b1\u5305",decrypt:"\u89e3\u5bc6\u94b1\u5305","decrypt-warning":"\u8b66\u544a: \u51fa\u4e8e\u5b89\u5168\u8003\u8651\uff0c\u5efa\u8bae\u5c06\u94b1\u5305\u52a0\u5bc6\u3002\u5efa\u8bae\u8c28\u614e\u4e00\u70b9\u3002",delete:"\u5220\u9664\u94b1\u5305",edit:"\u7f16\u8f91\u94b1\u5305",add:"\u6dfb\u52a0\u94b1\u5305",load:"\u52a0\u8f7d\u94b1\u5305","encryption-enabled":"\u52a0\u5bc6\u5df2\u542f\u7528","encryption-disabled":"\u52a0\u5bc6\u5df2\u7981\u7528","hw-security-warning":'\u53ef\u80fd\u7684\u5b89\u5168\u98ce\u9669\u3002\u5f53\u786c\u4ef6\u8bbe\u5907\u5df2\u8fde\u63a5\u65f6(\u70b9\u51fb\u94b1\u5305\u5217\u8868\u4e0b\u7684"\u786c\u4ef6\u94b1\u5305"\u6309\u94ae)\u8bbf\u95ee\u786c\u4ef6\u94b1\u5305\u9009\u9879\u4ee5\u83b7\u53d6\u66f4\u591a\u4fe1\u606f',wallet:"\u94b1\u5305","hardware-wallet":"\u786c\u4ef6\u94b1\u5305","delete-confirmation":'\u8b66\u544a: \u94b1\u5305"{{ name }}"\u5c06\u4ece\u5217\u8868\u4e2d\u5220\u9664\u3002\u82e5\u60f3\u91cd\u65b0\u6dfb\u52a0\uff0c\u9700\u91cd\u65b0\u8fde\u63a5\u8bbe\u5907\u5e76\u6253\u5f00\u786c\u4ef6\u94b1\u5305\u7684\u9009\u9879\u5217\u8868(\u70b9\u51fb\u94b1\u5305\u5217\u8868\u4e0b\u7684"\u786c\u4ef6\u94b1\u5305"\u6309\u94ae)\u3002\u4f60\u60f3\u7ee7\u7eed\u5417\uff1f',"delete-confirmation-check":"\u662f\u7684\uff0c\u6211\u60f3\u8981\u5220\u9664\u94b1\u5305\u3002","max-hardware-wallets-error":"\u4f60\u7684\u786c\u4ef6\u94b1\u5305\u91cc\u7684\u5730\u5740\u5df2\u7ecf\u8fbe\u5230\u5141\u8bb8\u7684\u6700\u5927\u503c\u3002","add-many-confirmation":"\u8b66\u544a: \u5982\u679c\u4f60\u5728\u4e0d\u4f7f\u7528\u524d\u4e00\u4e2a\u5730\u5740\u7684\u60c5\u51b5\u4e0b\u6dfb\u52a0\u592a\u591a\u5730\u5740\uff0c\u6216\u8005\u5982\u679c\u4f60\u4f7f\u7528\u7684\u662f\u6700\u540e\u4e00\u4e2a\u5730\u5740\u800c\u4e0d\u662f\u7b2c\u4e00\u4e2a\u5730\u5740\uff0c\u90a3\u4e48\u5982\u679c\u4f60\u5c1d\u8bd5\u4f7f\u7528\u79cd\u5b50\u6062\u590d\u94b1\u5305\uff0c\u6709\u4e9b\u5730\u5740\u5c06\u53ef\u80fd\u65e0\u6cd5\u81ea\u52a8\u6062\u590d\uff08\u4f60\u5fc5\u987b\u624b\u52a8\u6dfb\u52a0\u5b83\u4eec\uff09\u3002 \u4f60\u60f3\u7ee7\u7eed\u5417\uff1f",new:{"create-title":"\u521b\u5efa\u94b1\u5305","load-title":"\u52a0\u8f7d\u94b1\u5305","encrypt-title":"\u52a0\u5bc6\u94b1\u5305","name-label":"\u540d\u79f0","seed-label":"\u79cd\u5b50","confirm-seed-label":"\u786e\u8ba4\u79cd\u5b50","seed-warning":"\u8bb0\u4f4f\u79cd\u5b50! \u628a\u5b83\u4fdd\u5b58\u5728\u5b89\u5168\u7684\u5730\u65b9\u3002 \u5982\u679c\u4f60\u5fd8\u8bb0\u4e86\u4f60\u7684\u79cd\u5b50\uff0c\u4f60\u5c06\u65e0\u6cd5\u627e\u56de\u4f60\u7684\u94b1\u5305!","create-button":"\u521b\u5efa","load-button":"\u52a0\u8f7d","cancel-button":"\u5220\u9664","12-words":"12\u5b57","24-words":"24\u5b57","generate-12-seed":"\u751f\u621012\u5b57\u79cd\u5b50","generate-24-seed":"\u751f\u621024\u5b57\u79cd\u5b50",encrypt:"\u52a0\u5bc6\u94b1\u5305","encrypt-warning":"\u6211\u4eec\u5efa\u8bae\u4f60\u4e3a\u6bcf\u4e2a\u94b1\u5305\u8bbe\u7f6e\u4e00\u4e2a\u72ec\u7acb\u7684\u5bc6\u7801\u3002\u5982\u679c\u4f60\u5fd8\u8bb0\u5bc6\u7801\uff0c\u4f60\u53ef\u4ee5\u901a\u8fc7\u79cd\u5b50\u91cd\u7f6e\u94b1\u5305\u3002\u5728\u52a0\u5bc6\u4f60\u7684\u94b1\u5305\u4e4b\u524d\uff0c\u786e\u4fdd\u4f60\u7684\u79cd\u5b50\u4fdd\u5b58\u5728\u5b89\u5168\u7684\u5730\u65b9\u3002","unconventional-seed-title":"\u53ef\u80fd\u9519\u8bef","unconventional-seed-text":"\u4f60\u5f15\u8fdb\u4e86\u4e00\u79cd\u975e\u4f20\u7edf\u7684\u79cd\u5b50\u3002\u5982\u679c\u4f60\u51fa\u4e8e\u4efb\u4f55\u7279\u6b8a\u539f\u56e0\u8fd9\u6837\u505a\uff0c\u4f60\u53ef\u4ee5\u7ee7\u7eed(\u53ea\u63a8\u8350\u9ad8\u7ea7\u7528\u6237)\u3002\u4f46\u662f\uff0c\u5982\u679c\u4f60\u6253\u7b97\u4f7f\u7528\u666e\u901a\u7684\u7cfb\u7edf\u79cd\u5b50\uff0c\u5219\u5fc5\u987b\u5220\u9664\u6240\u6709\u9644\u52a0\u6587\u672c\u548c\u7279\u6b8a\u5b57\u7b26\u3002","unconventional-seed-check":"\u7ee7\u7eed\u4f7f\u7528\u975e\u4f20\u7edf\u79cd\u5b50\u3002"},rename:{title:"\u91cd\u547d\u540d\u94b1\u5305","name-label":"\u547d\u540d","cancel-button":"\u53d6\u6d88","rename-button":"\u91cd\u547d\u540d"},"add-addresses":{title:"\u9009\u62e9\u6570\u91cf","name-quantity":"\u521b\u5efa\u591a\u5c11\u5730\u5740","cancel-button":"\u53d6\u6d88","create-button":"\u521b\u5efa"},address:{show:"\u70b9\u51fb\u663e\u793a",copy:"\u590d\u5236","copy-address":"\u590d\u5236\u5730\u5740",copied:"\u5df2\u590d\u5236!",confirm:"\u786e\u8ba4\u5730\u5740",outputs:"\u672a\u4ea4\u6613\u8f93\u51fa",history:"\u5386\u53f2"}},send:{"synchronizing-warning":"\u94b1\u5305\u4ecd\u5728\u540c\u6b65\u6570\u636e\uff0c\u6240\u4ee5\u663e\u793a\u7684\u4f59\u989d\u53ef\u80fd\u4e0d\u6b63\u786e\u3002\u4f60\u786e\u5b9a\u8981\u7ee7\u7eed\u5417\uff1f","from-label":"\u53d1\u9001\u81ea","to-label":"\u53d1\u9001\u81f3","amount-label":"\u603b\u989d","notes-label":"\u6807\u6ce8","wallet-label":"\u94b1\u5305","addresses-label":"\u5730\u5740","invalid-amount":"\u8bf7\u8f93\u5165\u4e00\u4e2a\u6709\u6548\u6570\u503c","addresses-help":"\u9650\u5b9a\u6e90\u53d1\u9001\u5730\u5740","all-addresses":"\u6240\u6709\u5730\u5740(\u6240\u9009\u94b1\u5305\u7684)","outputs-label":"\u672a\u4ea4\u6613\u8f93\u51fa","outputs-help":"\u9650\u5b9a\u672a\u4ea4\u6613\u8f93\u51fa","all-outputs":"\u6240\u6709\u672a\u4ea4\u6613\u8f93\u51fa(\u6240\u9009\u5730\u5740\u7684)","available-msg-part1":"\u6839\u636e\u4f60\u5f53\u524d\u7684\u9009\u62e9\uff0c\u4f60\u6700\u591a\u53ef\u4ee5\u53d1\u9001","available-msg-part2":"\u548c","available-msg-part3":"(\u81f3\u5c11","available-msg-part4":"\u5c06\u4f5c\u4e3a\u5fc5\u987b\u7684\u4ea4\u6613\u624b\u7eed\u8d39)\u3002","change-address-label":"\u81ea\u5b9a\u4e49\u627e\u96f6\u5730\u5740","change-address-select":"\u9009\u62e9","change-address-help":'\u81ea\u5b9a\u4e49\u627e\u96f6\u5730\u5740\u3002\u5982\u679c\u4e0d\u63d0\u4f9b\uff0c\u94b1\u5305\u5c06\u4f1a\u81ea\u52a8\u9009\u62e9\u3002\u70b9\u51fb"\u9009\u62e9" \u6765\u9009\u62e9\u4e00\u4e2a\u5730\u5740',"destinations-label":"\u76ee\u6807\u5730\u5740","destinations-help1":"\u76ee\u6807\u5730\u5740\u548c\u5373\u5c06\u53d1\u9001\u7684\u5e01","destinations-help2":"\u76ee\u6807\u5730\u5740\u548c\u5373\u5c06\u53d1\u9001\u7684\u5e01\u4ee5\u53ca\u5e01\u65f6","hours-allocation-label":"\u81ea\u52a8\u5206\u914d\u5e01\u65f6","options-label":"\u9009\u9879","value-label":"\u5e01\u65f6\u5206\u53d1\u56e0\u5b50","value-help":"\u5206\u53d1\u56e0\u5b50\u503c\u8d8a\u9ad8\uff0c\u8d8a\u591a\u5e01\u65f6\u5c06\u88ab\u53d1\u9001","preview-button":"\u9884\u89c8","send-button":"\u53d1\u9001","back-button":"\u540e\u9000",simple:"\u7b80\u6613",advanced:"\u9ad8\u7ea7\u7684","select-wallet":"\u9009\u62e9\u94b1\u5305"},reset:{"wallet-label":"\u94b1\u5305","seed-label":"\u94b1\u5305\u79cd\u5b50","password-label":"\u65b0\u5bc6\u7801 (\u5982\u679c\u4f60\u4e0d\u5e0c\u671b\u94b1\u5305\u52a0\u5bc6\uff0c\u8bf7\u5c06\u5bc6\u7801\u7559\u7a7a)","confirm-label":"\u786e\u8ba4\u65b0\u5bc6\u7801","reset-button":"\u91cd\u7f6e"},tx:{transaction:"\u4ea4\u6613","confirm-transaction":"\u786e\u8ba4\u4ea4\u6613",from:"\u6765\u81ea",to:"\u5230",date:"\u65e5\u671f",status:"\u72b6\u6001",coins:"\u5e01",hours:"\u5e01\u65f6",id:"\u4ea4\u6613ID","show-more":"\u5c55\u793a\u66f4\u591a","hours-moved":"\u5df2\u8f6c\u79fb","hours-sent":"\u5df2\u53d1\u9001","hours-received":"\u5df2\u63a5\u6536","hours-burned":"\u5df2\u71c3\u70e7",inputs:"\u8f93\u5165",outputs:"\u8f93\u51fa",confirmed:"\u5df2\u786e\u8ba4",pending:"\u5f85\u5904\u7406","current-rate":"\u6309\u5f53\u524d\u6c47\u7387\u8ba1\u7b97"},backup:{"wallet-directory":"\u94b1\u5305\u76ee\u5f55:","seed-warning":"\u5728\u7eb8\u4e0a\u5907\u4efd\u4f60\u7684\u79cd\u5b50\uff0c\u5e76\u4fdd\u5b58\u5728\u4e00\u4e2a\u5b89\u5168\u7684\u5730\u65b9\u3002\u53ea\u8981\u6709\u79cd\u5b50\uff0c\u4f60\u5c31\u53ef\u4ee5\u627e\u56de\u4f60\u7684\u5e01\u3002",desc:"\u4f7f\u7528\u4e0b\u8868\u4ece\u52a0\u5bc6\u7684\u94b1\u5305\u4e2d\u5f97\u5230\u79cd\u5b50\u3002
\u4e3a\u4e86\u4ece\u672a\u52a0\u5bc6\u7684\u94b1\u5305\u4e2d\u83b7\u5f97\u79cd\u5b50\uff0c\u6253\u5f00\u4e0a\u9762\u7684\u6587\u4ef6\u5939,\u5728\u6587\u672c\u7f16\u8f91\u5668\u4e2d\u6253\u5f00.wlt\u6587\u4ef6\u5e76\u6062\u590d\u79cd\u5b50\u3002","close-button":"Close",wallet:"\u94b1\u5305",filename:"\u6587\u4ef6\u540d",seed:"\u79cd\u5b50","show-seed":"\u663e\u793a\u79cd\u5b50","no-wallets":"\u672a\u52a0\u5bc6\u94b1\u5305"},blockchain:{blocks:"\u533a\u5757\u6570\u91cf",time:"\u4e0a\u4e00\u4e2a\u533a\u5757\u7684\u65f6\u95f4\u6233",hash:"\u4e0a\u4e00\u4e2a\u533a\u5757\u7684\u54c8\u5e0c\u503c","current-supply":"\u76ee\u524dSKY\u4f9b\u5e94\u91cf","total-supply":"SKY\u7684\u603b\u4f9b\u5e94\u91cf","current-coinhour-supply":"\u76ee\u524d\u5e01\u65f6\u4f9b\u5e94\u91cf","total-coinhour-supply":"\u5e01\u65f6\u603b\u4f9b\u5e94\u91cf"},network:{peer:"\u8282\u70b9",source:"\u8282\u70b9\u6765\u6e90","block-height":"\u533a\u5757\u9ad8\u5ea6","block-height-short":"\u533a\u5757","last-seen":"\u4e0a\u4e00\u6b21\u51fa\u73b0","last-received":"\u4e0a\u4e00\u6b21\u63a5\u6536","last-sent":"\u4e0a\u4e00\u6b21\u53d1\u9001",in:"\u8fdb\u6765\u7684",out:"\u51fa\u53bb\u7684",sources:{default:"\u9ed8\u8ba4\u8282\u70b9",exchange:"\u4ea4\u6362\u8282\u70b9"}},"pending-txs":{timestamp:"\u65f6\u95f4\u6233",txid:"\u4ea4\u6613ID",none:"\u65e0\u5f85\u5904\u7406\u4ea4\u6613",my:"\u6211\u7684",all:"\u5168\u90e8"},history:{"tx-detail":"\u4ea4\u6613\u660e\u7ec6",moving:"\u5185\u90e8\u8f6c\u8d26\u4e2d",moved:"\u5df2\u5185\u90e8\u8f6c\u8d26",sending:"\u53d1\u9001\u4e2d",sent:"\u5df2\u53d1\u9001",received:"\u5df2\u63a5\u6536",receiving:"\u63a5\u6536\u4e2d",pending:"\u5f85\u5904\u7406","no-txs":"\u4f60\u6ca1\u6709\u5386\u53f2\u4ea4\u6613","no-txs-filter":"\u6ca1\u6709\u4e0e\u5f53\u524d\u7b5b\u9009\u6761\u4ef6\u5339\u914d\u7684\u4ea4\u6613","no-filter":"\u672a\u7ecf\u7b5b\u9009 (\u70b9\u51fb\u9009\u62e9\u94b1\u5305/\u5730\u5740)",filter:"\u5df2\u7b5b\u9009: ",filters:"\u5df2\u7b5b\u9009: ","all-addresses":"\u6240\u6709\u5730\u5740"},teller:{done:"\u5b8c\u6210","waiting-confirm":"\u7b49\u5f85\u786e\u8ba4","waiting-deposit":"\u7b49\u5f85\u6bd4\u7279\u5e01\u5145\u503c","waiting-send":"\u7b49\u5f85\u53d1\u9001Skycoin",unknown:"\u672a\u77e5"},confirmation:{"header-text":"\u786e\u8ba4","confirm-button":"\u662f","cancel-button":"\u5426",close:"\u5173\u95ed"},service:{api:{"server-error":"\u670d\u52a1\u5668\u9519\u8bef"},wallet:{"not-enough-hours":"\u6ca1\u6709\u8db3\u591f\u7684\u5e01\u65f6\u6765\u6267\u884c\u4ea4\u6613"}},"hardware-wallet":{general:{"default-wallet-name":"\u65b0\u786c\u4ef6\u94b1\u5305","error-disconnected":"\u65e0\u6cd5\u6267\u884c\u8be5\u64cd\u4f5c\u3002\u786c\u4ef6\u94b1\u5305\u672a\u8fde\u63a5\u3002","simple-error":"\u9519\u8bef\uff0c\u65e0\u6cd5\u6267\u884c\u64cd\u4f5c\u3002","generic-error":"\u65e0\u6cd5\u6267\u884c\u8be5\u64cd\u4f5c\u3002\u786e\u4fdd\u4f60\u5df2\u7ecf\u8fde\u63a5\u4e86\u4e00\u4e2a\u6709\u6548\u7684\u786c\u4ef6\u94b1\u5305\uff0c\u5e76\u4e14\u5b83\u6ca1\u6709\u5728\u7b49\u5f85\u8f93\u5165\u3002","generic-error-internet":"\u65e0\u6cd5\u6267\u884c\u8be5\u64cd\u4f5c\u3002\u786e\u4fdd\u4f60\u5df2\u7ecf\u8fde\u63a5\u4e86\u4e00\u4e2a\u6709\u6548\u7684\u786c\u4ef6\u94b1\u5305\uff0c\u5b83\u4e0d\u5728\u7b49\u5f85\u8f93\u5165\uff0c\u5e76\u4e14\u4f60\u5df2\u7ecf\u8fde\u63a5\u5230\u7f51\u7edc/\u8282\u70b9","error-incorrect-wallet":"\u65e0\u6cd5\u6267\u884c\u8be5\u64cd\u4f5c\u3002\u6240\u8fde\u63a5\u7684\u786c\u4ef6\u94b1\u5305\u4e0e\u9884\u671f\u4e0d\u540c\u3002","error-incorrect-pin":"\u65e0\u6cd5\u6267\u884c\u8be5\u64cd\u4f5c\u3002\u4f60\u8f93\u5165\u7684\u5bc6\u7801\u4e0d\u6b63\u786e\u3002",confirm:"\u8bf7\u5728\u786c\u4ef6\u94b1\u5305\u4e2d\u786e\u8ba4\u64cd\u4f5c\u3002","confirm-and-more":"\u8bf7\u5728\u786c\u4ef6\u94b1\u5305\u4e2d\u786e\u8ba4\u64cd\u4f5c\u5e76\u6309\u9075\u5faa\u6307\u793a\u3002",close:"\u5173\u95ed",cancel:"\u53d6\u6d88",continue:"\u7ee7\u7eed",completed:"\u64cd\u4f5c\u5b8c\u6210\u3002",refused:"\u64cd\u4f5c\u5931\u8d25\u6216\u88ab\u53d6\u6d88\u3002"},errors:{"too-many-inputs":"\u6b64\u7b14\u4ea4\u6613\u6709\u592a\u591a\u7684\u8f93\u5165\uff0c\u65e0\u6cd5\u5904\u7406\u3002\u8bf7\u8054\u7cfb\u6280\u672f\u652f\u6301\u3002","too-many-outputs":"\u6b64\u7b14\u4ea4\u6613\u6709\u592a\u591a\u7684\u8f93\u51fa\uff0c\u65e0\u6cd5\u5904\u7406\uff0c\u8bf7\u8054\u7cfb\u6280\u672f\u652f\u6301\u3002"},"security-warning":{title:"\u5b89\u5168\u8b66\u544a",text:'\u4e0a\u6b21\u8fde\u63a5\u6b64\u786c\u4ef6\u94b1\u5305\u65f6\uff0c\u53d1\u73b0\u4e00\u4e2a\u6216\u591a\u4e2a\u5b89\u5168\u8b66\u544a\u3002\u6211\u4eec\u5efa\u8bae\u4f60\u6253\u5f00\u786c\u4ef6\u94b1\u5305\u9009\u9879(\u70b9\u51fb\u94b1\u5305\u5217\u8868\u4e0b\u7684"\u786c\u4ef6\u94b1\u5305"\u6309\u94ae)\u5e76\u4fdd\u6301\u8bbe\u5907\u5df2\u8fde\u63a5\uff0c\u5728\u7ee7\u7eed\u4e4b\u524d\uff0c\u89e3\u51b3\u5b89\u5168\u95ee\u9898',check:"\u6211\u660e\u767d\u5176\u4e2d\u7684\u98ce\u9669\uff0c\u5e76\u5e0c\u671b\u7ee7\u7eed\u4e0b\u53bb",continue:"\u7ee7\u7eed",cancel:"\u53d6\u6d88"},options:{connecting:"\u8fde\u63a5...",disconnected:"\u6ca1\u6709\u68c0\u6d4b\u5230\u786c\u4ef6\u94b1\u5305\u3002\u8bf7\u8fde\u63a5\u786c\u4ef6\u94b1\u5305\u540e\u4f7f\u7528\u6b64\u9009\u9879\u3002","unconfigured-detected-title":"\u672a\u914d\u7f6e\u7684\u786c\u4ef6\u94b1\u5305","unconfigured-detected":'\u68c0\u6d4b\u5230\u65e0\u79cd\u5b50\u7684\u786c\u4ef6\u94b1\u5305\u3002\u9009\u62e9"\u81ea\u52a8\u914d\u7f6e"\u5982\u679c\u4f60\u60f3\u5c06\u5176\u914d\u7f6e\u4e3a\u5168\u65b0\u7684\u94b1\u5305\u5e76\u7acb\u5373\u5f00\u59cb\u4f7f\u7528\u5b83\uff0c\u6216\u9009\u62e9"\u6062\u590d\u5907\u4efd"\u5982\u679c\u4f60\u60f3\u4f7f\u7528\u5148\u524d\u521b\u5efa\u7684\u5907\u4efd\u79cd\u5b50\u5bf9\u5176\u8fdb\u884c\u914d\u7f6e\uff0c\u4ece\u800c\u80fd\u591f\u518d\u6b21\u8bbf\u95ee\u4f60\u7684\u8d44\u4ea7\u3002',"configured-detected":"\u68c0\u6d4b\u5230\u786c\u4ef6\u94b1\u5305\u3002\u8be5\u8bbe\u5907\u5728\u94b1\u5305\u5217\u8868\u4e2d\u88ab\u8bc6\u522b\u4e3a:","security-warnings-title":"\u5b89\u5168\u8b66\u544a","security-warning-title":"\u5b89\u5168\u8b66\u544a","backup-warning":'\u4f60\u5e94\u8be5\u5907\u4efd\u786c\u4ef6\u94b1\u5305\u79cd\u5b50\uff0c\u5426\u5219\u4e07\u4e00\u51fa\u73b0\u95ee\u9898\uff0c\u4f60\u53ef\u80fd\u5c06\u65e0\u6cd5\u8bbf\u95ee\u4f60\u7684\u8d44\u91d1\uff0c\u8981\u505a\u5230\u8fd9\u4e00\u70b9\u3002\u9009\u62e9"\u521b\u5efa\u4e00\u4e2a\u5907\u4efd"\u9009\u9879\u3002',"pin-warning":'\u5f53\u524d\u8fde\u63a5\u7684\u786c\u4ef6\u94b1\u5305\u672a\u8bbe\u7f6e\u5bc6\u7801\u3002\u5bc6\u7801\u53ef\u4fdd\u62a4\u786c\u4ef6\u94b1\u5305\uff0c\u4ee5\u9632\u4e22\u5931\u3001\u76d7\u7a83\u548c\u9ed1\u5ba2\u5165\u4fb5\u3002\u8981\u521b\u5efa\u4e00\u4e2a\u5bc6\u7801\uff0c\u9009\u62e9"\u521b\u5efaPIN\u7801"\u9009\u9879\u3002',options:"\u9009\u9879:","configure-automatically":"\u81ea\u52a8\u914d\u7f6e","restore-backup":"\u6062\u590d\u5907\u4efd","create-backup":"\u521b\u5efa\u5907\u4efd",wipe:"\u5220\u9664\u8bbe\u5907","confirm-seed":"\u786e\u8ba4\u79cd\u5b50","create-pin":"\u521b\u5efa\u5bc6\u7801","change-pin":"\u66f4\u6539\u5bc6\u7801","forgotten-pin1":"\u5982\u679c\u4f60\u56e0\u4e3a\u5fd8\u8bb0\u5bc6\u7801\u800c\u65e0\u6cd5\u8fdb\u5165\u94b1\u5305\uff0c\u4f60\u53ef\u4ee5\u5220\u9664\u786c\u4ef6\u94b1\u5305\uff0c\u7136\u540e\u901a\u8fc7\u79cd\u5b50","forgotten-pin2":"\u6062\u590d"},"generate-seed":{text:"\u5728\u7ee7\u7eed\u4e4b\u524d\uff0c\u4f60\u53ef\u4ee5\u9009\u62e9\u751f\u6210\u79cd\u5b50\u7684\u5355\u8bcd\u6570\u3002\u79cd\u5b50\u662f\u4e00\u4e2a\u5355\u8bcd\u5217\u8868\uff0c\u51fa\u73b0\u95ee\u9898\u540e\u53ef\u4ee5\u7528\u6765\u6062\u590d\u8bbf\u95ee\u4f60\u7684\u5e01\u3002\u6240\u6709\u9009\u9879\u90fd\u662f\u5b89\u5168\u7684\uff0c\u5982\u679c\u4f60\u6ca1\u6709\u7279\u6b8a\u539f\u56e0\u5fc5\u987b\u9009\u62e9\u67d0\u4e00\u9879\uff0c\u4f60\u53ef\u4ee5\u4f7f\u7528\u9ed8\u8ba4\u503c\u3002",configuring:"\u914d\u7f6e..."},"restore-seed":{text:"\u5728\u7ee7\u7eed\u524d\uff0c\u8bf7\u9009\u62e9\u4f60\u60f3\u8981\u6062\u590d\u79cd\u5b50\u7684\u5355\u8bcd\u6570\u91cf\u3002","check-text":"\u4f60\u53ef\u4ee5\u4f7f\u7528\u6b64\u9009\u9879\u8f93\u5165\u79cd\u5b50\uff0c\u5e76\u68c0\u67e5\u5b83\u662f\u5426\u4e0e\u786c\u4ef6\u94b1\u5305\u4e2d\u7684\u4e00\u81f4\u3002\u5728\u5f00\u59cb\u4e4b\u524d\uff0c\u9009\u62e9\u4f60\u60f3\u8981\u68c0\u67e5\u7684\u79cd\u5b50\u7684\u5355\u8bcd\u6570\u3002",warning:"\u8b66\u544a: \u4e3a\u4e86\u907f\u514d\u53ef\u80fd\u51fa\u73b0\u7684\u95ee\u9898\uff0c\u8bf7\u4ec5\u4f7f\u7528\u540c\u4e00\u54c1\u724c/\u578b\u53f7\u7684\u786c\u4ef6\u94b1\u5305\u521b\u5efa\u79cd\u5b50\u3002","error-wrong-word":"\u9519\u8bef: \u91cd\u65b0\u952e\u5165\u7684\u5355\u8bcd\u4e0e\u786c\u4ef6\u94b1\u5305\u6240\u8bf7\u6c42\u7684\u4e0d\u5339\u914d\u3002","error-invalid-seed":"\u9519\u8bef: \u79cd\u5b50\u65e0\u6548\u3002\u8bf7\u52a1\u5fc5\u6309\u6b63\u786e\u7684\u987a\u5e8f\u8f93\u5165\u6b63\u786e\u7684\u5355\u8bcd\u3002","error-wrong-seed":"\u9519\u8bef: \u79cd\u5b50\u662f\u6709\u6548\u7684\uff0c\u4f46\u4e0e\u8bbe\u5907\u4e2d\u7684\u79cd\u5b50\u4e0d\u5339\u914d\u3002"},added:{title:"\u65b0\u786c\u4ef6\u94b1\u5305",configuring:"\u68c0\u6d4b\u5230\u65b0\u7684\u786c\u4ef6\u94b1\u5305\u3002\u914d\u7f6e...",done:"\u5df2\u5b8c\u6210",added1:"\u5df2\u8fde\u63a5\u7684\u786c\u4ef6\u7684\u94b1\u5305\u5df2\u7ecf\u7528\u5982\u4e0b\u540d\u5b57\u88ab\u6dfb\u52a0\u5230\u94b1\u5305\u5217\u8868:",added2:"\u73b0\u5728\u4f60\u53ef\u4ee5\u67e5\u770b\u786c\u4ef6\u94b1\u5305\u4e2d\u7684\u4f59\u989d\u548c\u5730\u5740\u4e86\uff0c\u5373\u4f7f\u786c\u4ef6\u94b1\u5305\u5e76\u672a\u8fde\u63a5\u3002\u6b64\u5916\u5982\u679c\u4f60\u613f\u610f\uff0c\u4f60\u8fd8\u53ef\u4ee5\u66f4\u6539\u94b1\u5305\u540d\u79f0\u6216\u4ece\u5c06\u5176\u4ece\u94b1\u5305\u5217\u8868\u5220\u9664\u3002"},wipe:{warning:"\u8b66\u544a: \u786c\u4ef6\u94b1\u5305\u4e2d\u7684\u6240\u6709\u6570\u636e\u5c06\u88ab\u5220\u9664\u3002\u5982\u679c\u6ca1\u6709\u5907\u4efd\uff0c\u4f60\u5c06\u65e0\u6cd5\u518d\u6b21\u8bbf\u95ee\u4f60\u7684\u8d44\u91d1\u3002","confirm-delete":"\u8fd8\u662f\u5c06\u5176\u4ece\u94b1\u5305\u5217\u8868\u4e2d\u5220\u9664"},"create-backup":{warning:'\u8b66\u544a: \u4f60\u53ea\u80fd\u4f7f\u7528\u6b64\u9009\u9879\u5907\u4efd\u4f60\u7684\u786c\u4ef6\u94b1\u5305\u79cd\u5b50\u4e00\u6b21\u3002\u5982\u679c\u4f60\u51b3\u5b9a\u7ee7\u7eed\uff0c\u4f60\u5c06\u4e0d\u5f97\u4e0d\u5199\u4e0b\u4e00\u7ec4\u5355\u8bcd(\u5efa\u8bae\u5199\u5728\u7eb8\u4e0a\uff0c\u800c\u4e0d\u662f\u7535\u8111\u4e0a)\uff0c\u8fd9\u4e9b\u5355\u8bcd\u5c06\u51fa\u73b0\u5728\u786c\u4ef6\u94b1\u5305\u7684\u5c4f\u5e55\u4e0a\uff0c\u5e76\u5c06\u5176\u5b58\u50a8\u5728\u4e00\u4e2a\u5b89\u5168\u7684\u5730\u65b9\u3002\u4efb\u4f55\u53ef\u4ee5\u8bbf\u95ee\u5355\u8bcd\u5217\u8868("\u79cd\u5b50")\u7684\u4eba\u90fd\u53ef\u4ee5\u8bbf\u95ee\u94b1\u5305\u4f59\u989d\uff0c\u56e0\u6b64\u5efa\u8bae\u8bf7\u683c\u5916\u8c28\u614e\u3002',instructions:"\u5199\u4e0b\u51fa\u73b0\u5728\u786c\u4ef6\u94b1\u5305\u5c4f\u5e55\u4e0a\u7684\u5355\u8bcd\u5217\u8868\u3002\u4e00\u5b9a\u8981\u6309\u987a\u5e8f\u5e76\u628a\u6bcf\u4e2a\u5355\u8bcd\u90fd\u5199\u5bf9\u3002"},"seed-word":{title:"\u8f93\u5165\u5b57",info1:"\u8f93\u5165\u8bbe\u5907\u4e2d\u663e\u793a\u7684\u5b57",info2:"\u4f60\u5c06\u88ab\u8981\u6c42\u4ee5\u968f\u673a\u7684\u987a\u5e8f\u8f93\u5165\u4f60\u5907\u4efd\u7684\u79cd\u5b50\uff0c\u52a0\u4e0a\u4e00\u4e9b\u989d\u5916\u7684\u5b57\u3002",word:"\u8981\u6c42\u7684\u5b57","error-invalid-word":"\u8f93\u5165\u5b57\u65e0\u6548\u3002","error-loading-words":"\u6b63\u5728\u52a0\u8f7d\u5b57\u5217\u8868\u3002\u8bf7\u7a0d\u7b49\u3002"},"change-pin":{"pin-mismatch":"\u65e0\u6cd5\u6267\u884c\u64cd\u4f5c\u3002\u4f60\u8f93\u5165\u7684\u4e24\u4e2a\u5bc6\u7801\u4e0d\u5339\u914d"},"enter-pin":{title:"\u8f93\u5165\u5bc6\u7801","title-change-current":"\u8f93\u5165\u5f53\u524d\u5bc6\u7801","title-change-new":"\u8f93\u5165\u65b0\u7684\u5bc6\u7801","title-change-confirm":"\u786e\u8ba4\u65b0\u7684\u5bc6\u7801",instructions:" \u5bc6\u7801\u5df2\u663e\u793a\u5728\u786c\u4ef6\u94b1\u5305\u7684\u5c4f\u5e55\u4e0a\u3002","instructions-tx":"\u8fdb\u5165\u5bc6\u7801\u4ee5\u786e\u8ba4\u5e76\u7b7e\u7f72\u4ea4\u6613\u3002","instructions-change":"\u8bf7\u8f93\u5165\u4e00\u4e2a4\u52308\u4e2a\u6570\u5b57\u4e4b\u95f4\u7684\u96be\u4ee5\u88ab\u731c\u4e2d\u7684\u5bc6\u7801\u3002",help:"\u9700\u8981\u5e2e\u52a9\uff1f"},"pin-help":{title:"\u5e2e\u52a9",part1:"\u5f53\u9700\u8981\u8f93\u5165\u5bc6\u7801\u624d\u80fd\u7ee7\u7eed\u65f6\uff0c\u786c\u4ef6\u94b1\u5305\u5c4f\u5e55\u4f1a\u663e\u793a\u4e00\u4e2a\u77e9\u9635\uff0c\u77e9\u9635\u75319\u4e2a\u968f\u673a\u6392\u5217\u7684\u5757\u7ec4\u6210(\u6bcf\u6b21\u987a\u5e8f\u90fd\u4f1a\u6539\u53d8)\uff0c\u4f60\u5c06\u88ab\u8981\u6c42\u5728\u8f6f\u4ef6\u94b1\u5305\u4e2d\u8f93\u5165\u5bc6\u7801\uff0c\u4f7f\u7528\u4e00\u4e2a\u77e9\u9635\uff0c\u6b64\u77e9\u9635\u5305\u542b9\u4e2a\u6309\u94ae\uff0c\u53ea\u663e\u793a\u7b26\u53f7#\u3002",part2:'\u8981\u8f93\u5165\u5bc6\u7801\uff0c\u8bf7\u5728\u786c\u4ef6\u94b1\u5305\u5c4f\u5e55\u4e0a\u4ee5\u6570\u5b57\u77e9\u9635\u67e5\u770b\u5bc6\u7801\u7684\u4f4d\u7f6e\uff0c\u7136\u540e\u70b9\u51fb\u8f6f\u4ef6\u94b1\u5305\u4e2d\u7684\u76f8\u5e94\u6309\u94ae\u3002\u4f8b\u5982\uff0c\u5982\u679c\u5bc6\u7801\u4e3a"23"\u4e14\u6570\u5b572\u4f4d\u4e8e\u786c\u4ef6\u94b1\u5305\u6570\u5b57\u77e9\u9635\u7684\u5de6\u4e0a\u89d2\uff0c\u6570\u5b573\u4f4d\u4e8e\u786c\u4ef6\u94b1\u5305\u6570\u5b57\u77e9\u9635\u7684\u6b63\u4e2d\u95f4\uff0c\u5219\u6309\u987a\u5e8f\u70b9\u51fb\u8f6f\u4ef6\u94b1\u5305\u4e2d\u7684\u5de6\u4e0a\u89d2\u548c\u4e2d\u95f4\u6309\u94ae\u3002',part3:'\u5982\u679c\u4f60\u613f\u610f\uff0c\u8fd8\u53ef\u4ee5\u4f7f\u7528\u952e\u76d8\u4e0a\u7684\u5c0f\u952e\u76d8\u8f93\u5165\u5bc6\u7801\u3002\u4f46\u662f\uff0c\u5982\u4e4b\u524d\u793a\u4f8b\u6240\u793a\uff0c\u5982\u679c\u5bc6\u7801\u662f"23"\uff0c\u4f60\u4e0d\u80fd\u7b80\u5355\u5730\u7528\u5c0f\u952e\u76d8\u952e\u5165"23"\uff0c\u800c\u662f\u5fc5\u987b\u9009\u62e9\u70b9\u51fb\u786c\u4ef6\u94b1\u5305\u5c4f\u5e55\u4e0a2\u548c3\u5bf9\u5e94\u4f4d\u7f6e\u7684\u503c\u3002'},"create-tx":{title:"\u521b\u5efa\u4ea4\u6613"},"confirm-address":{title:"\u786e\u8ba4\u5730\u5740",instructions:"\u8bf7\u5728\u786c\u4ef6\u94b1\u5305\u4e0a\u786e\u8ba4\uff0c\u5982\u679c\u5730\u5740\u4e3a:","short-confirmation":"\u5730\u5740\u5df2\u786e\u8ba4",confirmation:'\u5730\u5740\u5df2\u786e\u8ba4\u3002\u4e3a\u4e86\u5b89\u5168, \u9009\u62e9 "\u786e\u8ba4\u5730\u5740" \u9009\u9879\u53ef\u4ee5\u5728\u786c\u4ef6\u94b1\u5305\u4e0a\u518d\u6b21\u663e\u793a\u5730\u5740\uff0c\u5728\u83dc\u5355\u4e2d\u53ef\u70b9\u51fb\u5730\u5740\u4f59\u989d\u53f3\u4fa7\u7684\u6309\u94ae\u663e\u793a\u3002'}},"time-from-now":{"few-seconds":"\u51e0\u79d2\u949f\u4e4b\u524d",minute:"\u4e00\u5206\u949f\u4e4b\u524d",minutes:"{{time}} \u5206\u949f\u4e4b\u524d",hour:"\u4e00\u5c0f\u65f6\u4e4b\u524d",hours:"{{time}} \u5c0f\u65f6\u4e4b\u524d",day:"\u4e00\u5929\u4e4b\u524d",days:"{{time}} \u5929\u4e4b\u524d"},exchange:{"you-send":"\u4f60\u53d1\u9001","you-get":"\u4f60\u6536\u5230 (\u5927\u7ea6)","to-address":"\u5230 {{coin}} \u5730\u5740",price:"\u4ea4\u6613\u6c47\u7387","time-15":"\u4ea4\u6613\u65f6\u95f4","exchange-button":"\u4ea4\u6613","min-amount":"\u6700\u5c0f\u6570\u989d:","max-amount":"\u6700\u5927\u6570\u989d:","agree-1":"\u6211\u540c\u610f","agree-2":"\u4f7f\u7528\u6761\u6b3e","agree-3":"\u548c","agree-4":"\u9690\u79c1\u653f\u7b56","powered-by":"\u6280\u672f\u652f\u6301","need-help":"\u9700\u8981\u5e2e\u52a9?","support-portal":"\u5e2e\u52a9\u5165\u53e3",history:"\u8ba2\u5355\u5386\u53f2","order-not-found":"\u8ba2\u5355\u672a\u627e\u5230",status:"\u72b6\u6001",exchanging:"{{from}}\u4ea4\u6613{{to}}",select:"\u9009\u62e9",offline:"\u4ea4\u6613\u6682\u65f6\u4e0b\u7ebf","problem-connecting":"\u672a\u80fd\u8fde\u63a5\u5230\u670d\u52a1\u5668\u3002\u8bf7\u68c0\u67e5\u4f60\u7684\u7f51\u7edc\u8fde\u63a5\u5e76\u7a0d\u540e\u518d\u8bd5\u3002","invalid-address":"\u65e0\u6548\u5730\u5740\u3002",statuses:{"user-waiting":"\u7b49\u5f85\u5145\u503c\u3002\u8bf7\u5c06{{amount}} {{from}}\u53d1\u9001\u5230\u4e0b\u9762\u663e\u793a\u7684\u4ea4\u6613\u5730\u5740","user-waiting-info":"\u7cfb\u7edf\u6b63\u5728\u7b49\u5f85\u4f60\u5145\u503c\u5230\u4ea4\u6613\u5730\u5740\u3002\u4ea4\u6613\u5c06\u5728\u7cfb\u7edf\u68c0\u6d4b\u5230\u4f60\u7684\u5145\u503c\u5e76\u5728\u533a\u5757\u94fe\u4e2d\u786e\u8ba4\u540e\u5f00\u59cb\u3002\u5982\u679c\u4f60\u5df2\u7ecf\u5145\u503c\uff0c\u5e94\u8be5\u5f88\u5feb\u5c31\u4f1a\u68c0\u6d4b\u5230\u3002","market-waiting-confirmations":"\u7b49\u5f85\u94fe\u4e0a\u4ea4\u6613\u786e\u8ba4","market-waiting-confirmations-info":"\u5df2\u7ecf\u68c0\u6d4b\u5230\u5145\u503c\uff0c\u7b49\u5f85\u533a\u5757\u94fe\u4e2d\u88ab\u786e\u8ba4\u3002","market-confirmed":"\u94fe\u4e0a\u4ea4\u6613\u5df2\u63a5\u53d7","market-confirmed-info":"\u94fe\u4e0a\u4ea4\u6613\u5df2\u7ecf\u5728\u533a\u5757\u94fe\u4e0a\u786e\u8ba4\u3002\u51c6\u5907\u9a6c\u4e0a\u6267\u884c\u5151\u6362\u3002","market-exchanged":"\u5b8c\u6210{{from}}\u5230{{to}}\u7684\u5151\u6362","market-exchanged-info":"\u5151\u6362\u5df2\u7ecf\u5b8c\u6210\u3002\u8d44\u91d1\u5c06\u5f88\u5feb\u53d1\u9001\u5230\u4f60\u7684\u5730\u5740\u3002","market-withdraw-waiting":"\u6b63\u5728\u53d1\u9001{{to}}\u5230\u4f60\u7684\u5730\u5740","market-withdraw-waiting-info":"\u53d1\u9001{{to}}\u5230\u4f60\u5730\u5740\u7684\u8fdb\u7a0b\u5df2\u542f\u52a8",complete:"\u4ea4\u6613\u5df2\u5b8c\u6210!","complete-info":"\u8d44\u91d1\u5df2\u7ecf\u6210\u529f\u53d1\u9001\u5230\u4f60\u7684\u5730\u5740\u3002",error:"\u53d1\u751f\u9519\u8bef","error-info":"\u8fd0\u8f6c\u8fc7\u7a0b\u4e2d\u51fa\u73b0\u9519\u8bef\uff0c\u4f60\u53ef\u4ee5\u5728\u4e0b\u9762\u627e\u5230\u66f4\u591a\u4fe1\u606f\u3002\u5982\u679c\u4f60\u9700\u8981\u5e2e\u52a9\uff0c\u8bf7\u4fdd\u5b58\u4e0b\u9762\u663e\u793a\u7684\u6240\u6709\u6570\u636e\u5e76\u4f7f\u7528\u9875\u9762\u53f3\u4e0b\u89d2\u7684\u5e2e\u52a9\u94fe\u63a5\u6765\u8054\u7cfb\u6280\u672f\u652f\u6301\u3002"},"history-window":{address:"\u5730\u5740",date:"\u65e5\u671f"},details:{"exchange-addr":"\u4ea4\u6613\u5730\u5740","exchange-addr-tag":"\u652f\u4ed8ID\u6216\u4ea4\u6613\u5fc5\u987b\u7528\u5230\u7684\u76ee\u6807\u6807\u7b7e","tx-id":"\u4ea4\u6613ID","order-id":"\u8ba2\u5355ID","initial-price":"\u521d\u59cb\u6c47\u7387","error-msg":"\u9519\u8bef\u4fe1\u606f ",details:"\u8be6\u60c5","start-date":"\u5f00\u59cb\u65e5\u671f",back:"\u8fd4\u56de","back-alert":'\u64cd\u4f5c\u6b63\u5728\u6267\u884c\u3002\u4f60\u771f\u7684\u60f3\u8981\u8fd4\u56de\u5230\u8868\u683c\u5417\uff1f\u4f60\u53ef\u4ee5\u901a\u8fc7\u70b9\u51fb"\u8ba2\u5355\u5386\u53f2"\u518d\u6b21\u770b\u5230\u6267\u884c\u8fc7\u7a0b'}}}}}); \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/2.af5e2fa6c65ff6f39739.chunk.js b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/2.af5e2fa6c65ff6f39739.chunk.js new file mode 100644 index 00000000..1c8cc19d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/2.af5e2fa6c65ff6f39739.chunk.js @@ -0,0 +1 @@ +webpackJsonp([2],{"P+VX":function(e,n){e.exports={common:{"coin-id":"SKY","coin-hours":"CH",loading:"\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430...",new:"\u041d\u043e\u0432\u044b\u0439",load:"\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c"},errors:{"fetch-version":"\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0441 Github","incorrect-password":"\u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c","api-disabled":"API \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d","no-wallet":"\u041a\u043e\u0448\u0435\u043b\u0451\u043a \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442","no-outputs":"\u041d\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u0440\u0435\u0434\u0441\u0442\u0432"},title:{wallets:"\u041a\u043e\u0448\u0435\u043b\u044c\u043a\u0438",send:"\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c",history:"\u0418\u0441\u0442\u043e\u0440\u0438\u044f","buy-coin":"\u041a\u0443\u043f\u0438\u0442\u044c Skycoin",network:"\u0421\u0435\u0442\u044c",blockchain:"\u0411\u043b\u043e\u043a\u0447\u0435\u0439\u043d",outputs:"\u0412\u044b\u0445\u043e\u0434\u044b (Outputs)",transactions:"\u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438","pending-txs":"\u041d\u0435\u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0451\u043d\u043d\u044b\u0435 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438",backup:"\u0420\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0435 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435",explorer:"Skycoin \u044d\u043a\u0441\u043f\u043b\u043e\u0440\u0435\u0440",seed:"\u0424\u0440\u0430\u0437\u0430 \u0432\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f",qrcode:"QR-\u043a\u043e\u0434"},header:{"syncing-blocks":"\u0418\u0434\u0451\u0442 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0431\u043b\u043e\u043a\u043e\u0432...",update1:"\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430",update2:"\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e.","pending-txs1":"\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442","pending-txs2":"\u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438, \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0438\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.","pending-txs3":"\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439. \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c \u0447\u0442\u043e \u0443 \u0432\u0430\u0441 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441 \u0441\u0435\u0442\u044c\u044e.",errors:{"no-connections":"\u041d\u0435\u0442 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439, \u0432\u0430\u0448 \u043a\u043b\u0438\u0435\u043d\u0442 \u043d\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d \u043a \u0434\u0440\u0443\u0433\u0438\u043c \u0443\u0437\u043b\u0430\u043c!","no-backend1":"\u041d\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0441\u0435\u0440\u0432\u0438\u0441\u0443. \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438\u043b\u0438 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0441\u0435\u044c \u0437\u0430 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432 \u043d\u0430\u0448\u0435\u0439 \u0433\u0440\u0443\u043f\u043f\u0435","no-backend2":"\u0432 \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c\u043c\u0435.","no-backend3":"",csrf:"\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438: CSRF \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442."}},password:{title:"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043f\u0430\u0440\u043e\u043b\u044c",label:"\u041f\u0430\u0440\u043e\u043b\u044c","confirm-label":"\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u043f\u0430\u0440\u043e\u043b\u044c",button:"\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c"},buy:{"deposit-address":"\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043a\u043e\u0448\u0435\u043b\u0451\u043a \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u0435\u043f\u043e\u0437\u0438\u0442\u043d\u043e\u0433\u043e \u0430\u0434\u0440\u0435\u0441\u0430:","select-address":"\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0430\u0434\u0440\u0435\u0441",generate:"\u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c","deposit-location":"\u0410\u0434\u0440\u0435\u0441 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f","deposit-location-desc":"\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043a\u043e\u0448\u0435\u043b\u0451\u043a \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f Skycoin, \u043f\u043e\u0441\u043b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u0435\u043f\u043e\u0437\u0438\u0442\u0430.","make-choice":"\u0421\u0434\u0435\u043b\u0430\u0439\u0442\u0435 \u0432\u044b\u0431\u043e\u0440","wallets-desc":"\u041f\u0440\u0438 \u0432\u044b\u0431\u043e\u0440\u0435 \u0430\u0434\u0440\u0435\u0441\u0430, \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u0434\u043b\u044f \u0434\u0435\u043f\u043e\u0437\u0438\u0442\u0430. \u041e\u0434\u0438\u043d \u0430\u0434\u0440\u0435\u0441 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u0451\u043d \u043a \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u043c\u0443 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0430\u0434\u0440\u0435\u0441\u043e\u0432.",send:"\u041f\u043e\u0448\u043b\u0438\u0442\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u0443\u044e \u043a\u0440\u0438\u043f\u0442\u043e\u0432\u0430\u043b\u044e\u0442\u0443","send-desc":"\u041e\u0442\u043f\u0440\u0430\u0432\u044c\u0442\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u0443\u044e \u0432\u0430\u043c\u0438 \u043a\u0440\u0438\u043f\u0442\u043e\u0432\u0430\u043b\u044e\u0442\u0443 \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u044b\u0439 \u043d\u0438\u0436\u0435. \u041f\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044e \u0438 \u043f\u043e\u0441\u043b\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0435\u043d\u0438\u044f \u0431\u043b\u043e\u043a\u043e\u0432, \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 Skycoin \u043d\u0430 \u0443\u043a\u0430\u0437\u0430\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u043f\u043e \u043a\u0443\u0440\u0441\u0443 {{ rate }} Skycoin/Selected Coin.","fraction-warning":"\u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u043e\u0432\u0430\u043d\u043e \u043f\u043e\u0441\u044b\u043b\u0430\u0442\u044c \u0446\u0435\u043b\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.",receive:"\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c Skycoin","receive-desc":"\u041f\u043e\u0441\u043b\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u043a\u0440\u0438\u043f\u0442\u0430\u0432\u0430\u043b\u044e\u0442\u044b, \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 Skycoin. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043d\u044f\u0442\u044c \u043e\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0441\u0435\u043a\u0443\u043d\u0434 \u0434\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0434\u043d\u0435\u0439, \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u043e\u043f\u043b\u0430\u0442\u044b \u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0441\u0435\u0442\u0438.","status-button":"\u0421\u0442\u0430\u0442\u0443\u0441:","check-status-button":"\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0441\u0442\u0430\u0442\u0443\u0441","new-order-button":"\u041d\u043e\u0432\u044b\u0439 \u0437\u0430\u043a\u0430\u0437",refresh:"\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c","available-now":"\u0414\u043e\u0441\u0442\u0443\u043f\u043d\u043e:","choose-preference":"\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0441\u043f\u043e\u0441\u043e\u0431 \u043e\u043f\u043b\u0430\u0442\u044b. \u0418\u043c\u0435\u0439\u0442\u0435 \u0432 \u0432\u0438\u0434\u0443, \u0447\u0442\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u044b.",choose:"\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0432\u0430\u0448\u0443 \u043b\u044e\u0431\u0438\u043c\u0443\u044e \u043a\u0440\u0438\u043f\u0442\u0443 ;)","send-coin":"\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c","send-coin-text-1":"\u043d\u0430 \u0430\u0434\u0440\u0435\u0441 \u043d\u0438\u0436\u0435. \u041f\u043e\u0441\u043b\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0439 \u043d\u0430 \u0431\u043b\u043e\u043a\u0447\u0435\u0439\u043d\u0435, \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 Skycoin \u043d\u0430 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0432\u0430\u043c\u0438 \u043a\u043e\u0448\u0435\u043b\u0451\u043a \u043f\u043e \u043a\u0443\u0440\u0441\u0443"},wizard:{"wallet-desc":'\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043d\u0435\u0442 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430 Skycoin, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0444\u0440\u0430\u0437\u0443 \u0434\u043b\u044f \u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f. \u0415\u0441\u043b\u0438 \u0444\u0440\u0430\u0437\u0430 \u0443 \u0432\u0430\u0441 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c, \u043d\u0430\u0436\u043c\u0438\u0442\u0435 "\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430" \u0438 \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u0432\u0430\u0448\u0443 \u0444\u0440\u0430\u0437\u0443.',"encrypt-desc":"\u0414\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u0442\u0438, \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c \u0434\u043b\u044f \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0421\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u043f\u0430\u0440\u043e\u043b\u044f. \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0432\u044b \u0435\u0433\u043e \u043f\u043e\u043c\u043d\u0438\u0442\u0435.","finish-button":"\u0417\u0430\u043a\u043e\u043d\u0447\u0438\u0442\u044c","back-button":"\u041d\u0430\u0437\u0430\u0434",confirm:{title:"\u0414\u0435\u0440\u0436\u0438\u0442\u0435 \u0441\u0432\u043e\u044e \u0444\u0440\u0430\u0437\u0443 \u0432 \u0441\u043e\u0445\u0440\u0430\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435!",desc:"\u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0432\u044b \u0437\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0444\u0440\u0430\u0437\u0443 \u0432\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u0434\u0435\u0440\u0436\u0438\u0442\u0435 \u0435\u0451 \u0432 \u043d\u0430\u0434\u0451\u0436\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435. \u041f\u0440\u0438 \u0443\u0442\u0435\u0440\u0435 \u0444\u0440\u0430\u0437\u044b \u0432\u044b \u043f\u043e\u0442\u0435\u0440\u044f\u0435\u0442\u0435 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u0430\u0448\u0435\u043c\u0443 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0443 Skycoin!",checkbox:"\u041a\u043b\u044f\u043d\u0443\u0441\u044c. \u042f \u0437\u0430\u043f\u0438\u0441\u0430\u043b.",button:"\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c"}},wallet:{"new-address":"\u041d\u043e\u0432\u044b\u0439 \u0430\u0434\u0440\u0435\u0441","show-empty":"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0443\u0441\u0442\u044b\u0435","hide-empty":"\u0421\u043a\u0440\u044b\u0442\u044c \u043f\u0443\u0441\u0442\u044b\u0435",encrypt:"\u0417\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0448\u0435\u043b\u0451\u043a",decrypt:"\u0420\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0448\u0435\u043b\u0451\u043a",edit:"\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0432\u043e\u0430\u0442\u044c",add:"\u041d\u043e\u0432\u044b\u0439 \u043a\u043e\u0448\u0435\u043b\u0451\u043a",load:"\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c","encryption-enabled":"\u0417\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d","encryption-disabled":"\u0411\u0435\u0437 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f",wallet:"\u041a\u043e\u0448\u0435\u043b\u0451\u043a",new:{"create-title":"\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043e\u0448\u0435\u043b\u0451\u043a","load-title":"\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0448\u0435\u043b\u0451\u043a","encrypt-title":"\u0428\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0448\u0435\u043b\u0451\u043a","name-label":"\u0418\u043c\u044f \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430","seed-label":"\u0424\u0440\u0430\u0437\u0430 \u0432\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f","confirm-seed-label":"\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u0444\u0440\u0430\u0437\u0443","seed-warning":"\u0417\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u0435 \u044d\u0442\u0430 \u0444\u0440\u0430\u0437\u0443 \u0438\u043b\u0438 \u0437\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u0438 \u0434\u0435\u0440\u0436\u0438\u0442\u0435 \u0432 \u043d\u0430\u0434\u0435\u0436\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435, \u0432 \u0434\u0430\u043b\u0438 \u043e\u0442 \u0447\u0443\u0436\u0438\u0445 \u0433\u043b\u0430\u0437. \u041f\u0440\u0438 \u043f\u043e\u0442\u0435\u0440\u0435 \u0444\u0440\u0430\u0437\u044b \u0432\u044b \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c Skycoin \u043a\u043e\u0448\u0435\u043b\u0451\u043a!","create-button":"\u0421\u043e\u0437\u0434\u0430\u0442\u044c","load-button":"\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c","cancel-button":"\u041e\u0442\u043c\u0435\u043d\u0430","12-words":"12 \u0441\u043b\u043e\u0432","24-words":"24 \u0441\u043b\u043e\u0432\u0430","generate-12-seed":"\u0421\u0433\u0435\u043d\u0438\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0440\u0430\u0437\u0443 \u0438\u0437 12 \u0441\u043b\u043e\u0432","generate-24-seed":"\u0421\u0433\u0435\u043d\u0438\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0440\u0430\u0437\u0443 \u0438\u0437 24 \u0441\u043b\u043e\u0432",encrypt:"\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435","encrypt-warning":"\u041c\u044b \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0432\u0430\u0448\u0438 \u043a\u0430\u0448\u0435\u043b\u044c\u043a\u0438 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043d\u0430\u0434\u0451\u0436\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u043e\u043b\u044f. \u0422\u0430\u043a \u0436\u0435 \u0443\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0444\u0440\u0430\u0437\u0430 \u0432\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u0438 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u043d\u0430\u0434\u0451\u0436\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435."},rename:{title:"\u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430","name-label":"\u0418\u043c\u044f","cancel-button":"\u041e\u0442\u043c\u0435\u043d\u0430","rename-button":"\u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c"},address:{copy:"\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c","copy-address":"\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0430\u0434\u0440\u0435\u0441",copied:"\u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u043e!",outputs:"\u041d\u0435\u043f\u043e\u0442\u0440\u0430\u0447\u0435\u043d\u044b\u0435 \u0432\u044b\u0445\u043e\u0434\u044b (Unspent Outputs)"}},send:{"from-label":"\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0441","to-label":"\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u0430","amount-label":"\u0421\u0443\u043c\u043c\u0430","notes-label":"\u0417\u0430\u043c\u0435\u0442\u043a\u0438","wallet-label":"\u041a\u043e\u0448\u0435\u043b\u0451\u043a","addresses-label":"\u0410\u0434\u0440\u0435\u0441","addresses-help":"\u0410\u0434\u0440\u0435\u0441 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f","change-address-label":"\u0410\u0434\u0440\u0435\u0441 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043e\u0441\u0442\u0430\u0442\u043a\u0430","change-address-help":"\u0410\u0434\u0440\u0435\u0441 \u0434\u043b\u044f \u0441\u0434\u0430\u0447\u0438. \u0415\u0441\u043b\u0438 \u0432\u044b \u0435\u0433\u043e \u043d\u0435 \u0443\u043a\u0430\u0436\u0438\u0442\u0435, \u0442\u043e \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0431\u0440\u0430\u043d \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438","destinations-label":"\u0410\u0434\u0440\u0435\u0441\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0435\u0439","destinations-help1":"\u0410\u0434\u0440\u0435\u0441\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u0441\u0443\u043c\u043c\u0430 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f","destinations-help2":"\u0410\u0434\u0440\u0435\u0441\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0435\u0439, \u0441\u0443\u043c\u043c\u0430 Skycoin & CH \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f","hours-allocation-label":"\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u0434\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0447\u0430\u0441\u044b (CH)","options-label":"\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e","value-label":"\u0424\u0430\u043a\u0442\u043e\u0440 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0447\u0430\u0441\u043e\u0432 (CH)","value-help":"\u0427\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0444\u0430\u043a\u0442\u043e\u0440, \u0442\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 CH \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0435\u0439","preview-button":"\u041f\u0440\u0435\u0434\u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440","send-button":"\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c","back-button":"\u041d\u0430\u0437\u0430\u0434",simple:"\u041e\u0431\u044b\u0447\u043d\u044b\u0439",advanced:"\u041f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0439"},tx:{transaction:"\u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f","confirm-transaction":"\u041f\u043e\u0434\u0442\u0435\u0440\u0434\u0438\u0442\u0435 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044e",from:"\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044c",to:"\u041f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044c",date:"\u0414\u0430\u0442\u0430",status:"\u0421\u0442\u0430\u0442\u0443\u0441",coins:"\u0421\u0443\u043c\u043c\u0430",hours:"\u0427\u0430\u0441\u044b",id:"TX ID","show-more":"\u0418\u043d\u0444\u043e","hours-sent":"\u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c","hours-burned":"\u0441\u0436\u0438\u0433\u0430\u0435\u043c",inputs:"\u0412\u0445\u043e\u0434\u044b",outputs:"\u0412\u044b\u0445\u043e\u0434\u044b",confirmed:"\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0430",pending:"\u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435","current-rate":"\u041f\u043e \u0442\u0435\u043a\u0443\u0449\u0435\u043c\u0443 \u043a\u0443\u0440\u0441\u0443"},backup:{"wallet-directory":"\u041f\u0430\u043f\u043a\u0430 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430:","seed-warning":"\u0414\u0415\u0420\u0416\u0418\u0422\u0415 \u0424\u0420\u0410\u0417\u0423 \u0412\u041e\u0421\u0422\u0410\u041d\u041e\u0412\u041b\u0415\u041d\u0418\u042f \u0412 \u041d\u0410\u0414\u0401\u0416\u041d\u041e\u041c \u041c\u0415\u0421\u0422\u0415. \u041d\u0410 \u0411\u0423\u041c\u0410\u0413\u0415. \u041e\u0424\u0424\u041b\u0410\u0419\u041d. \u0415\u0441\u043b\u0438 \u0432\u044b \u0434\u0435\u0440\u0436\u0438\u0442\u0435 \u0444\u0440\u0430\u0437\u0443 \u0432 \u043d\u0430\u0434\u0451\u0436\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435, \u0438 \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0441\u043c\u043e\u0433 \u0435\u0451 \u043f\u043e\u0434\u0433\u043b\u044f\u0434\u0435\u0442\u044c - \u0432\u0430\u0448\u044b \u0442\u043e\u043a\u0435\u043d\u044b \u0432 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438.",desc:"\u0418\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043d\u0438\u0436\u0435 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0444\u0440\u0430\u0437\u044b \u0434\u043b\u044f \u0432\u0430\u0448\u0438\u0445 \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u043e\u0432.
\u0414\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0444\u0440\u0430\u0437 \u0432\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430\u0445 \u0431\u0435\u0437 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043e\u0442\u043a\u0440\u043e\u0439\u0442\u0435 \u043f\u0430\u043f\u043a\u0443 \u0443\u043a\u0430\u0437\u0430\u043d\u0443\u044e \u0432\u044b\u0448\u0435 \u0438 \u043d\u0430\u0439\u0434\u0438\u0442\u0435 \u0432 \u043d\u0435\u0439 \u0444\u0430\u0439\u043b\u044b \u0441 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c .wlt. \u0424\u0440\u0430\u0437\u0430 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u043d\u0438\u0445. \u041e\u0442\u043a\u0440\u043e\u0439\u0442\u0435 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043b\u044e\u0431\u043e\u0433\u043e (\u043d\u0430\u0434\u0451\u0436\u043d\u043e\u0433\u043e) \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430","close-button":"\u0417\u0430\u043a\u0440\u044b\u0442\u044c",wallet:"\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430",filename:"\u0418\u043c\u044f \u0444\u0430\u0439\u043b\u0430",seed:"\u0424\u0440\u0430\u0437\u0430","show-seed":"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0444\u0440\u0430\u0437\u0443","no-wallets":"\u041a\u043e\u0448\u0435\u043b\u044c\u043a\u043e\u0432 \u0441 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043d\u0435\u0442"},blockchain:{blocks:"\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u043b\u043e\u043a\u043e\u0432",time:"\u0412\u0440\u0435\u043c\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0431\u043b\u043e\u043a\u0430",hash:"\u0425\u044d\u0448 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0431\u043b\u043e\u043a\u0430","current-supply":"\u0412\u0441\u0435\u0433\u043e Skycoin \u0432 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438","total-supply":"\u0412\u0441\u0435\u0433\u043e Skycoin \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442","current-coinhour-supply":"\u0412\u0441\u0435\u0433\u043e CH \u0432 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438","total-coinhour-supply":"\u0412\u0441\u0435\u0433\u043e CH \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442"},network:{peer:"\u041f\u0438\u0440 (Peer)",source:"\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a","block-height":"\u0412\u044b\u0441\u043e\u0442\u0430 \u0431\u043b\u043e\u043a\u0430","last-seen":"\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0431\u043b\u043e\u043a","last-received":"\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u044b\u0439","last-sent":"\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u044b\u0439",in:"\u0412\u0445\u043e\u0434\u044f\u0449\u0438\u0435",out:"\u0418\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0435",sources:{default:"\u041f\u0438\u0440 \u043f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e",exchange:"\u041e\u0431\u043c\u0435\u043d\u0430 \u043f\u0438\u0440\u0430\u043c\u0438"}},"pending-txs":{timestamp:"\u041c\u0435\u0442\u043a\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438",txid:"ID \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438",none:"\u041d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e \u0442\u0440\u0430\u043d\u0430\u0437\u043a\u0446\u0438\u0439 \u0436\u0434\u0443\u0449\u0438\u0445 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0439",my:"\u041c\u043e\u0439",all:"\u0412\u0441\u0435"},history:{"tx-detail":"\u0414\u0435\u0442\u0430\u043b\u0438 \u043e \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438",sending:"\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c",sent:"\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e",received:"\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043e",receiving:"\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c",pending:"\u041e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f","no-txs":"\u0423 \u0432\u0430\u0441 \u043d\u0435\u0442 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439"},teller:{done:"\u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043e","waiting-confirm":"\u041e\u0436\u0438\u0434\u0430\u0435\u043c \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0439","waiting-deposit":"\u041e\u0436\u0438\u0434\u0430\u0435\u043c \u0434\u0435\u043f\u043e\u0437\u0438\u0442","waiting-send":"\u041f\u043e\u0441\u044b\u043b\u0430\u0435\u043c Skycoin",unknown:"\u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e"}}}}); \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/3.b1328f7fc5fe260edda4.chunk.js b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/3.b1328f7fc5fe260edda4.chunk.js new file mode 100644 index 00000000..73fef923 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/3.b1328f7fc5fe260edda4.chunk.js @@ -0,0 +1 @@ +webpackJsonp([3],{"0v8u":function(e,t){e.exports={common:{"coin-id":"SKY","coin-hours":"Coin Hours",usd:"USD",loading:"Loading...",new:"New",load:"Load"},errors:{error:"Error","fetch-version":"Unable to fetch latest release version from Github","incorrect-password":"Incorrect password","error-decrypting":"Error decrypting the wallet","api-disabled":"API disabled","no-wallet":"Wallet does not exist","no-outputs":"No unspent outputs","window-size":"The window is too narrow for the content"},title:{language:"Select Language",wallets:"Wallets",send:"Send",history:"History","buy-coin":"Buy Skycoin",network:"Networking",blockchain:"Blockchain",outputs:"Outputs",transactions:"Transactions","pending-txs":"Pending Transactions",backup:"Backup Wallet",explorer:"Skycoin Explorer",seed:"Wallet Seed",qrcode:"QR Code",reset:"Reset Password",exchange:"Exchange","select-address":"Select Address","order-history":"Order history"},header:{"syncing-blocks":"Syncing blocks",update1:"Wallet update",update2:"available.",synchronizing:"The wallet is synchronizing. Data you see may not be updated.","pending-txs1":"There are some","pending-txs2":"pending transactions.","pending-txs3":"Data you see may not be updated.",errors:{"no-connections":"No connections active, your client is not connected to any other nodes!","no-backend1":"Cannot reach backend. Please restart the app and/or seek help on our","no-backend2":"Telegram.","no-backend3":"",csrf:"Security vulnerability: CSRF is not working, please exit immediately."}},password:{title:"Enter Password",label:"Password","confirm-label":"Confirm password",button:"Proceed","reset-link":"I forgot my password"},buy:{"deposit-address":"Choose an address to generate a BTC deposit link for:","select-address":"Select address",generate:"Generate","deposit-location":"Deposit Location","deposit-location-desc":"Choose a wallet where you'd like us to deposit your Skycoin after we receive your Bitcoin.","make-choice":"Make a choice","wallets-desc":"Each time a new wallet and address are selected, a new BTC address is generated. A single Skycoin address can have up to 5 BTC addresses assigned to it.",send:"Send Bitcoin","send-desc":"Send Bitcoin to the address below. Once received, we will deposit the Skycoin to a new address in the wallet selected above at the current rate of {{ rate }} SKY/BTC.","fraction-warning":"Only send multiple of the SKY/BTC rate! Skycoin is sent in whole number; fractional SKY is not sent!",receive:"Receive Sky","receive-desc":"After receiving your Bitcoin, we'll send you your Skycoin. It may take anywhere between 20 minutes and an hour to receive your SKY.","status-button":"Status:","check-status-button":"Check Status","new-order-button":"New Order"},wizard:{"wallet-desc":'If you don\'t have a Skycoin wallet, use the generated seed to create a new one. If you already have a wallet, toggle over to "Load Wallet" and enter your seed.',"encrypt-desc":"Increase security of your wallet by encrypting it. By entering a password below, your wallet will be encrypted. Only those with the password will be able access the wallet and remove funds.","hardware-wallet-link":"Using a hardware wallet?","finish-button":"Finish","back-button":"Back",confirm:{title:"Safeguard your seed!",desc:"We want to make sure that you wrote down your seed and stored it in a safe place. If you forget your seed, you WILL NOT be able to recover your Skycoin wallet!",checkbox:"It\u2019s safe, I swear.",button:"Continue"}},wallet:{"new-address":"New Address","new-addresses":"New Addresses","show-empty":"Show Empty","hide-empty":"Hide Empty",encrypt:"Encrypt Wallet",decrypt:"Decrypt Wallet","decrypt-warning":"Warning: for security reasons, it is not recommended to keep the wallets unencrypted. Caution is advised.",delete:"Delete Wallet",edit:"Edit Wallet",add:"Add Wallet",load:"Load Wallet","encryption-enabled":"Encryption enabled","encryption-disabled":"Encryption disabled","hw-security-warning":'Possible security risk. Access the hardware wallet options (by pressing the "Hardware Wallet" button below the wallets list) while the device is connected for more information.',wallet:"Wallet","hardware-wallet":"Hardware Wallet","delete-confirmation":'WARNING: The wallet "{{ name }}" will be removed from the list. To add it again, you will have to reconnect the device and open the hardware wallet options (by pressing the "Hardware Wallet" button below the wallets list). Do you want to continue?',"delete-confirmation-check":"Yeah, I want to delete the wallet.","max-hardware-wallets-error":"You have already reached the max number of addresses that can be added to the hardware wallet.","add-many-confirmation":"WARNING: If you add too many addresses without using the previous ones or if you use the last ones and not the first ones, some addresses may not be recovered automatically if you try to restore the wallet using the seed (you will have to add them manually). Do you want to continue?",new:{"create-title":"Create Wallet","load-title":"Load Wallet","encrypt-title":"Encrypt Wallet","name-label":"Name","seed-label":"Seed","confirm-seed-label":"Confirm seed","seed-warning":"Remember this seed! Keep it in a safe place. If you forget your seed, you will not be able to recover your wallet!","create-button":"Create","load-button":"Load","cancel-button":"Cancel","12-words":"12 words","24-words":"24 words","generate-12-seed":"Generate 12 word seed","generate-24-seed":"Generate 24 word seed",encrypt:"Encrypt wallet","encrypt-warning":"We suggest that you encrypt each one of your wallets with a password. If you forget your password, you can reset it with your seed. Make sure you have your seed saved somewhere safe before encrypting your wallet.","unconventional-seed-title":"Possible error","unconventional-seed-text":"You introduced an unconventional seed. If you did it for any special reason, you can continue (only recommended for advanced users). However, if your intention is to use a normal system seed, you must delete all the additional text and special characters.","unconventional-seed-check":"Continue with the unconventional seed."},rename:{title:"Rename Wallet","name-label":"Name","cancel-button":"Cancel","rename-button":"Rename"},"add-addresses":{title:"Select quantity","name-quantity":"How many addresses to create","cancel-button":"Cancel","create-button":"Create"},address:{show:"Press to show",copy:"Copy","copy-address":"Copy address",copied:"Copied!",confirm:"Confirm address",outputs:"Unspent outputs",history:"History"}},send:{"synchronizing-warning":"The wallet is still synchronizing the data, so the balance shown may be incorrect. Are you sure you want to continue?","from-label":"Send from","to-label":"Send to","amount-label":"Amount","notes-label":"Notes","wallet-label":"Wallet","addresses-label":"Addresses","invalid-amount":"Please enter a valid amount","addresses-help":"Limit the addresses from where the coins and hours could be sent","all-addresses":"All the addresses of the selected wallet","outputs-label":"Unspent outputs","outputs-help":"Limit the unspent outputs from where the coins and hours could be sent. Only the outputs from the selected addresses are shown","all-outputs":"All the outputs of the selected addresses","available-msg-part1":"With your current selection you can send up to","available-msg-part2":"and","available-msg-part3":"(at least","available-msg-part4":"must be used for the transaction fee).","change-address-label":"Custom change address","change-address-select":"Select","change-address-help":'Address to receive change. If it\'s not provided, it will be chosen automatically. Click on the "Select" link to choose an address from one of your wallets',"destinations-label":"Destinations","destinations-help1":"Destination addresses and their coins","destinations-help2":"Destination addresses, their coins and coin hours","hours-allocation-label":"Automatic coin hours allocation","options-label":"Options","value-label":"Coin hours share factor","value-help":"The higher the value, the more coin hours will be sent to outputs","preview-button":"Preview","send-button":"Send","back-button":"Back",simple:"Simple",advanced:"Advanced","select-wallet":"Select Wallet"},reset:{"wallet-label":"Wallet","seed-label":"Wallet seed","password-label":"New password (leave empty if you want the wallet not to be encrypted)","confirm-label":"Confirm new password","reset-button":"Reset"},tx:{transaction:"Transaction","confirm-transaction":"Confirm Transaction",from:"From",to:"To",date:"Date",status:"Status",coins:"Coins",hours:"Hours",id:"Tx ID","show-more":"Show more","hours-moved":"moved","hours-sent":"sent","hours-received":"received","hours-burned":"burned",inputs:"Inputs",outputs:"Outputs",confirmed:"Confirmed",pending:"Pending","current-rate":"Calculated at the current rate"},backup:{"wallet-directory":"Wallet Directory:","seed-warning":"BACKUP YOUR SEED. ON PAPER. IN A SAFE PLACE. As long as you have your seed, you can recover your coins.",desc:"Use the table below to get seeds from your encrypted wallets.
To get seeds from unencrypted wallets, open the folder above, open the .wlt files in a text editor and recover the seeds.","close-button":"Close",wallet:"Wallet Label",filename:"Filename",seed:"Seed","show-seed":"Show seed","no-wallets":"No encrypted wallets"},blockchain:{blocks:"Number of blocks",time:"Timestamp of last block",hash:"Hash of last block","current-supply":"Current SKY supply","total-supply":"Total SKY supply","current-coinhour-supply":"Current Coin Hours supply","total-coinhour-supply":"Total Coin Hours supply"},network:{peer:"Peer",source:"Source","block-height":"Block height","block-height-short":"Block","last-seen":"Last seen","last-received":"Last received","last-sent":"Last sent",in:"Incoming",out:"Outgoing",sources:{default:"Default peer",exchange:"Peer exchange"}},"pending-txs":{timestamp:"Timestamp",txid:"Transaction ID",none:"No pending transactions",my:"Mine",all:"All"},history:{"tx-detail":"Transaction Detail",moving:"Internally moving",moved:"Internally moved",sending:"Sending",sent:"Sent",received:"Received",receiving:"Receiving",pending:"Pending","no-txs":"You have no transaction history","no-txs-filter":"There are no transactions matching the current filter criteria","no-filter":"No filter active (press to select wallets/addresses)",filter:"Active filter: ",filters:"Active filters: ","all-addresses":"All addresses"},teller:{done:"Completed","waiting-confirm":"Waiting for confirmation","waiting-deposit":"Waiting for Bitcoin deposit","waiting-send":"Waiting to send Skycoin",unknown:"Unknown"},confirmation:{"header-text":"Confirmation","confirm-button":"Yes","cancel-button":"No",close:"Close"},service:{api:{"server-error":"Server error"},wallet:{"not-enough-hours":"Not enough available Coin Hours to perform the transaction!"}},"hardware-wallet":{general:{"default-wallet-name":"New hardware wallet","error-disconnected":"Unable to perform the operation. The hardware wallet is not connected.","simple-error":"Error, Unable to perform the operation.","generic-error":"Unable to perform the operation. Make sure you have connected a valid hardware wallet and that it is not waiting for input.","generic-error-internet":"Unable to perform the operation. Make sure you have connected a valid hardware wallet that is not waiting for input and that you have a connection to the internet/node.","error-incorrect-wallet":"Unable to perform the operation. The connected hardware wallet is different from the expected one.","error-incorrect-pin":"Unable to perform the operation. The PIN you have entered is not correct.",confirm:"Please, confirm the operation in the hardware wallet.","confirm-and-more":"Please, confirm the operation in the hardware wallet and follow the instructions.",close:"Close",cancel:"Cancel",continue:"Continue",completed:"Operation completed successfully.",refused:"The operation failed or was canceled."},errors:{"too-many-inputs":"The transaction has too many inputs and can not be processed. Please contact technical support.","too-many-outputs":"The transaction has too many outputs and can not be processed. Please contact technical support."},"security-warning":{title:"Security warning",text:'The last time this hardware wallet was connected, one or more security warnings were found. We recommend you to open the hardware wallet options (by pressing the "Hardware Wallet" button below the wallets list) while the device is connected and solve the security problems before continuing.',check:"I understand the risks and want to continue",continue:"Continue",cancel:"Cancel"},options:{connecting:"Connecting...",disconnected:"No hardware wallet detected. Please connect a hardware wallet to use this option.","unconfigured-detected-title":"Unconfigured hardware wallet","unconfigured-detected":'A seedless hardware wallet has been detected. Select "Configure automatically" if you want to configure it as a brand new wallet and start using it immediately, or select "Restore backup" if you want to configure it with a previously created seed backup and thus be able to access your funds again.',"configured-detected":"Hardware wallet detected. The device is identified in the wallets list as:","security-warnings-title":"Security warnings","security-warning-title":"Security warning","backup-warning":'You should backup the hardware wallet seed or you could lose access to the funds in case of problems. To do this, select the "Create a backup" option.',"pin-warning":'The connected hardware wallet does not have a PIN. The PIN code protects the hardware wallet in case of loss, theft and hacks. To create a PIN code, select the "Create PIN code" option.',options:"Options:","configure-automatically":"Configure automatically","restore-backup":"Restore backup","create-backup":"Create a backup",wipe:"Wipe the device","confirm-seed":"Confirm seed","create-pin":"Create PIN code","change-pin":"Change PIN code","forgotten-pin1":"If you can not access the wallet because you have forgotten the PIN, you can wipe the hardware wallet and then restore it with the seed by clicking","forgotten-pin2":"here."},"generate-seed":{text:"Before proceeding, you can select the number of words you want the seed to have. The seed is a list of words that can be used to recover access to the coins in case of problems. Both values are safe, so if you do not have a special reason for selecting one or the other, you can leave the default value.",configuring:"Configuring..."},"restore-seed":{text:"Before proceeding, please select the number of words that the seed you want to recover has.","check-text":"You can use this option to enter a seed and check if it is equal to the one in the hardware wallet. Before start, select the number of words the seed you want to check has.",warning:"WARNING: to avoid potential problems, use only seeds created with a hardware wallet from the same brand/model.","error-wrong-word":"Error: The retyped word does not match the one requested by the hardware wallet.","error-invalid-seed":"Error: The seed is not valid. Please be sure to enter the correct words in the correct order.","error-wrong-seed":"Error: The seed is valid but does not match the one in the device."},added:{title:"New Hardware Wallet",configuring:"New hardware wallet detected. Configuring...",done:"Done",added1:"The connected hardware wallet has been added to the wallets list with the following name:",added2:"Now you can check the balance and the addresses of the hardware wallet even when it is not connected. Additionally, you can change the name of the wallet or remove it from the wallets list, if you wish."},wipe:{warning:"WARNING: All the data in the hardware wallet will be deleted. If you do not have a backup, you will not be able to access your funds again.","confirm-delete":"Also remove from the wallets list"},"create-backup":{warning:'WARNING: You can only use this option to backup your hardware wallet seed once. If you decide to continue, you will have to write down a group of words (it is recommended to do it on paper and not on a computer) that will appear on the screen of the hardware wallet and store the list in a safe place. Anyone with access to the word list (the "seed") will be able access the wallet balance, so extreme caution is advised.',instructions:"Write down the word list that appear on the screen of the hardware wallet. Make sure you respect the order and write each word correctly."},"seed-word":{title:"Enter word",info1:"Enter the word indicated in the device",info2:"You will be asked to enter the words of your backup seed in random order, plus a few additional words.",word:"Requested word","error-invalid-word":"The entered word is not valid.","error-loading-words":"Loading the word list. Please wait."},"change-pin":{"pin-mismatch":"Unable to perform the operation. Two PINs you have entered do not match."},"enter-pin":{title:"Enter PIN","title-change-current":"Enter the current PIN","title-change-new":"Enter the new PIN","title-change-confirm":"Confirm the new PIN",instructions:"The PIN layout is displayed on the hardware wallet screen.","instructions-tx":"Enter the PIN to confirm and sign the transaction.","instructions-change":"Please enter a hard-to-guess PIN of between 4 and 8 numbers.",help:"Need help?"},"pin-help":{title:"Help",part1:"When it is necessary to enter the PIN to continue, the hardware wallet screen will display a matrix of 9 boxes with numbers in random order (the order changes each time) and you will be asked to enter the PIN in the software wallet using a matrix of 9 buttons that simply show the symbol #.",part2:'To enter the PIN, look at the position of the PIN numbers in numbers matrix on the screen of the hardware wallet and press the corresponding buttons in the software wallet. For example, if the PIN is "23" and the number 2 is in the upper left, number 3 in the middle of the hardware wallet numbers matrix, press the upper left and middle button in that order in the software wallet.',part3:'If you wish, you can also use the numpad on your keyboard to enter the PIN. However, as in the previous example, if the PIN is "23", you can not simply type "23" with the numpad, but you will have to press the keys that are in the position where the numbers 2 and 3 are shown on the screen of the hardware wallet.'},"create-tx":{title:"Create transaction"},"confirm-address":{title:"Confirm address",instructions:"Please confirm on the hardware wallet if the address is:","short-confirmation":"Address confirmed.",confirmation:'Address confirmed. For security, you can re-show the address in the hardware wallet using the "Confirm address" option, in the menu that you can display by pressing the button at the right of the address balance.'}},"time-from-now":{"few-seconds":"a few seconds ago",minute:"one minute ago",minutes:"{{time}} minutes ago",hour:"one hour ago",hours:"{{time}} hours ago",day:"one day ago",days:"{{time}} days ago"},exchange:{"you-send":"You send","you-get":"You get (approx.)","to-address":"To {{coin}} address",price:"Exchange rate","time-15":"Exchange time","exchange-button":"Exchange","min-amount":"Minimum amount:","max-amount":"Maximum amount:","agree-1":"I agree with","agree-2":"Terms of Use","agree-3":"and","agree-4":"Privacy Policy","powered-by":"Powered by","need-help":"Need help?","support-portal":"Support portal",history:"Order history","order-not-found":"Order not found",status:"Status",exchanging:"Exchanging {{from}} for {{to}}",select:"Select",offline:"Exchange is temporarily offline","problem-connecting":"Unable to connect with the service. Please check your Internet connection and try again later.","invalid-address":"Invalid address.",statuses:{"user-waiting":"Waiting for deposit. Please send {{amount}} {{from}} to the exchange address shown below","user-waiting-info":"The system is waiting for you to make the deposit into the exchange address. The exchange process will start after the deposit is detected and confirmed in the blockchain. If you have already made the deposit, it should be detected shortly.","market-waiting-confirmations":"Waiting for transaction confirmations","market-waiting-confirmations-info":"The deposit has already been detected and the system is waiting for it to be confirmed in the blockchain.","market-confirmed":"Transaction accepted","market-confirmed-info":"The transaction has already been confirmed in the blockchain. Preparing to make the exchange soon.","market-exchanged":"Traded {{from}} for {{to}}","market-exchanged-info":"The exchange has been made. The funds will be transferred to your address in a moment.","market-withdraw-waiting":"Sending {{to}} to your address","market-withdraw-waiting-info":"The process for sending the coins to your address has been initiated.",complete:"Exchange completed!","complete-info":"The funds have been successfully sent to your address.",error:"Error occurred","error-info":"There was an error in the operation, you can find more information below. If you need help, please save all the operation data shown below and contact technical support using the link in the lower right part of this page."},"history-window":{address:"Address",date:"Date"},details:{"exchange-addr":"Exchange address","exchange-addr-tag":"Payment ID or Destination Tag which must be used for the transaction","tx-id":"Transaction ID","order-id":"Order ID","initial-price":"Initial exchange rate","error-msg":"Error message",details:"Details","start-date":"Start date",back:"Back","back-alert":'The operation is still in progress. Do you really want to return to the form? You can see the progress of this operation again by pressing the "Order history" button'}}}}}); \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/3rdpartylicenses.txt b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/3rdpartylicenses.txt new file mode 100644 index 00000000..4041b949 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/3rdpartylicenses.txt @@ -0,0 +1,362 @@ +moment@2.21.0 +MIT +Copyright (c) JS Foundation and other contributors + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +webpack@3.11.0 +MIT +Copyright JS Foundation and other contributors + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +base64-js@1.2.3 +MIT +The MIT License (MIT) + +Copyright (c) 2014 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +buffer@4.9.1 +MIT +The MIT License (MIT) + +Copyright (c) Feross Aboukhadijeh, and other contributors. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +base-x@3.0.5 +MIT +The MIT License (MIT) + +Copyright (c) 2018 base-x contributors +Copyright (c) 2014-2018 The Bitcoin Core developers + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +@angular/core@5.2.0 +MIT +MIT + +safe-buffer@5.1.1 +MIT +The MIT License (MIT) + +Copyright (c) Feross Aboukhadijeh + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +@ngx-translate/core@9.1.1 +MIT +MIT + +hammerjs@2.0.8 +MIT +The MIT License (MIT) + +Copyright (C) 2011-2014 by Jorik Tangelder (Eight Media) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +isarray@1.0.0 +MIT +MIT + +ieee754@1.1.8 +BSD-3-Clause +Copyright (c) 2008, Fair Oaks Labs, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of Fair Oaks Labs, Inc. nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +bignumber.js@7.2.1 +MIT +MIT + +@angular/common@5.2.0 +MIT +MIT + +@angular/platform-browser@5.2.0 +MIT +MIT + +@angular/http@5.2.0 +MIT +MIT + +@angular/cdk@5.0.4 +MIT +The MIT License + +Copyright (c) 2017 Google LLC. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +@angular/material@5.0.4 +MIT +The MIT License + +Copyright (c) 2017 Google LLC. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +@angular/forms@5.2.0 +MIT +MIT + +@angular/animations@5.2.0 +MIT +MIT + +@angular/router@5.2.0 +MIT +MIT + +@angular/platform-browser-dynamic@5.2.0 +MIT +MIT + +core-js@2.5.3 +MIT +Copyright (c) 2014-2017 Denis Pushkarev + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +zone.js@0.8.20 +MIT +The MIT License + +Copyright (c) 2016 Google, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +bootstrap@4.0.0-beta.3 +MIT +The MIT License (MIT) + +Copyright (c) 2011-2017 Twitter, Inc. +Copyright (c) 2011-2017 The Bootstrap Authors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/4.7f8f58ff3f30291666bf.chunk.js b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/4.7f8f58ff3f30291666bf.chunk.js new file mode 100644 index 00000000..c6151504 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/4.7f8f58ff3f30291666bf.chunk.js @@ -0,0 +1 @@ +webpackJsonp([4],{"/YBz":function(e,a){e.exports={common:{"coin-id":"SKY","coin-hours":"Coin Hours",usd:"USD",loading:"Cargando...",new:"Nueva",load:"Cargar"},errors:{error:"Error","fetch-version":"No ha sido posible verificar la \xfaltima versi\xf3n desde Github","incorrect-password":"Contrase\xf1a incorrecta","error-decrypting":"Error al desencriptar la billetera","api-disabled":"API desabilitada","no-wallet":"La billetera no existe","no-outputs":"No hay salidas no gastadas","window-size":"La ventana es demasiado estrecha para el contenido"},title:{language:"Seleccionar Lenguaje",wallets:"Billeteras",send:"Enviar",history:"Historial","buy-coin":"Comprar Skycoins",network:"Red",blockchain:"Blockchain",outputs:"Salidas",transactions:"Transacciones","pending-txs":"Transacciones Pendientes",backup:"Respaldar Billetera",explorer:"Explorador de Skycoin",seed:"Semilla de la Billetera",qrcode:"C\xf3digo QR",reset:"Restablecer contrase\xf1a",exchange:"Intercambiar","select-address":"Seleccionar Direcci\xf3n","order-history":"Historial de \xf3rdenes"},header:{"syncing-blocks":"Sincronizando bloques",update1:"La actualizaci\xf3n",update2:"est\xe1 disponible.",synchronizing:"El nodo est\xe1 sincronizando. Los datos mostrados pueden estar desactualizados.","pending-txs1":"Hay una o m\xe1s","pending-txs2":"transacciones pendientes.","pending-txs3":"Los datos mostrados pueden estar desactualizados.",errors:{"no-connections":"Sin conexiones activas, \xa1el cliente no est\xe1 conectado a otros nodos!","no-backend1":"Sin acceso al servidor. Por favor, reinicie la aplicaci\xf3n y/o cont\xe1ctenos v\xeda","no-backend2":"Telegram.","no-backend3":"",csrf:"Vulnerabilidad de seguridad: CSRF no funciona. Por favor, salga de inmediato."}},password:{title:"Introduzca Su Contrase\xf1a",label:"Contrase\xf1a","confirm-label":"Confirmar contrase\xf1a",button:"Continuar","reset-link":"He olvidado mi contrase\xf1a"},buy:{"deposit-address":"Seleccione una direcci\xf3n para la cual generar un enlace de dep\xf3sito BTC:","select-address":"Seleccione una direcci\xf3n",generate:"Generar","deposit-location":"Localizaci\xf3n de Dep\xf3sito","deposit-location-desc":"Seleccione la billetera en la que desea que le depositemos sus Skycoins despu\xe9s de recibir los Bitcoins.","make-choice":"Realice una selecci\xf3n","wallets-desc":"Una nueva direcci\xf3n BTC es generada cada vez que se selecciona una nueva billetera y direcci\xf3n. Una \xfanica direcci\xf3n de Skycoin puede tener asignadas hasta 5 direcciones BTC.",send:"Enviar Bitcoins","send-desc":"Env\xede Bitcoins a la direcci\xf3n abajo indicada. Al recibirlos, le depositaremos los Skycoins en una nueva direcci\xf3n en la billetera seleccionada m\xe1s arriba, a la tasa de cambio actual de {{ rate }} SKY/BTC.","fraction-warning":"\xa1Env\xede s\xf3lo m\xfaltiplos de la tasa SKY/BTC! Los Skycoins son enviados en n\xfameros enteros, \xa1no se env\xedan fracciones de SKY!",receive:"Recibir SKY","receive-desc":"Despu\xe9s de recibir los Bitcoins, le enviaremos sus Skycoins. El tiempo de espera para recibir sus SKY puede ser de entre 20 minutos y una hora.","status-button":"Estatus:","check-status-button":"Revisar Estatus","new-order-button":"Nueva Orden"},wizard:{"wallet-desc":'Si no tiene una billetera, use la semilla generada autom\xe1ticamente para crear una nueva. Si ya tiene una billetera, seleccione "Cargar" e introduzca su semilla.',"encrypt-desc":"Incremente la seguridad de su billetera encript\xe1ndola. Al introducir una contrase\xf1a m\xe1s abajo, su billetera ser\xe1 encriptada. S\xf3lo quien tenga la contrase\xf1a podr\xe1 acceder a la billetera y retirar fondos.","hardware-wallet-link":"\xbfUtilizando una billetera de hardware?","finish-button":"Finalizar","back-button":"Volver",confirm:{title:"\xa1Resguarde su semilla!",desc:"Queremos asegurarnos de que ha anotado su semilla y la ha almacenado en un lugar seguro. \xa1Si olvida su semilla, NO podr\xe1 recuperar su billetera!",checkbox:"Est\xe1 segura, lo garantizo.",button:"Continuar"}},wallet:{"new-address":"Nueva Direcci\xf3n","new-addresses":"Nuevas Direcciones","show-empty":"Mostrar Vac\xedas","hide-empty":"Ocultar Vac\xedas",encrypt:"Encriptar Billetera",decrypt:"Desencriptar Billetera","decrypt-warning":"Advertencia: por razones de seguridad, no se recomienda mantener las carteras desencriptadas. Se aconseja precauci\xf3n.",delete:"Borrar Billetera",edit:"Editar Billetera",add:"Agregar Billetera",load:"Cargar Billetera","encryption-enabled":"Encriptado habilitado","encryption-disabled":"Encriptado deshabilitado","hw-security-warning":'Posible riesgo de seguridad. Acceda a las opciones de la billetera de hardware (presionando el bot\xf3n "Billetera de Hardware" debajo de la lista de billeteras) mientras el dispositivo est\xe1 conectado, para m\xe1s informaci\xf3n.',wallet:"Billetera","hardware-wallet":"Billetera de Hardware","delete-confirmation":'ADVERTENCIA: la billetera "{{ name }}" ser\xe1 removida de la lista. Para agregarla nuevamente, deber\xe1 volver a conectar el dispositivo y abrir las opciones de la billetera del hardware (presionando el bot\xf3n "Billetera de hardware" debajo de la lista de las billeteras). \xbfDesea continuar?',"delete-confirmation-check":"S\xed, quiero borrar la billetera.","max-hardware-wallets-error":"Ya ha alcanzado el n\xfamero m\xe1ximo de direcciones que se puede agregar a la billetera de hardware.","add-many-confirmation":"ADVERTENCIA: si agrega demasiadas direcciones sin usar las anteriores o si usa las \xfaltimas y no las primeras, es posible que algunas direcciones no se recuperen autom\xe1ticamente si intenta restaurar la billetera con la semilla (tendr\xe1 que agregarlas manualmente). \xbfDesea continuar?",new:{"create-title":"Crear Billetera","load-title":"Cargar Billetera","encrypt-title":"Encriptar la billetera","name-label":"Nombre","seed-label":"Semilla","confirm-seed-label":"Confirmar semilla","seed-warning":"\xa1Recuerde esta semilla! Mant\xe9ngala en un lugar seguro. \xa1Si olvida su semilla, no podr\xe1 recuperar la billetera!","create-button":"Crear","load-button":"Cargar","cancel-button":"Cancelar","12-words":"12 palabras","24-words":"24 palabras","generate-12-seed":"Generar una semilla de 12 palabras","generate-24-seed":"Generar una semilla de 24 palabras",encrypt:"Encriptar billetera","encrypt-warning":"Le sugerimos que encripte con una contrase\xf1a cada una de sus billeteras. Si olvida su contrase\xf1a, puede restaurarla con la semilla. Aseg\xfarese de guardar su semilla en un lugar seguro antes de encriptar la billetera.","unconventional-seed-title":"Posible error","unconventional-seed-text":"Usted introdujo una semilla no convencional. Si lo hizo por alguna raz\xf3n en especial, puede continuar (s\xf3lo recomendable para usuarios avanzados). Sin embargo, si su intenci\xf3n es utilizar una semilla normal del sistema, usted debe borrar los textos y/o caracteres especiales adicionales.","unconventional-seed-check":"Continuar con la semilla no convencional."},rename:{title:"Renombrar Billetera","name-label":"Nombre","cancel-button":"Cancelar","rename-button":"Renombrar"},"add-addresses":{title:"Seleccionar cantidad","name-quantity":"Cantidad de direcciones a crear","cancel-button":"Cancelar","create-button":"Crear"},address:{show:"Presione para mostrar",copy:"Copiar","copy-address":"Copiar Direcci\xf3n",copied:"\xa1Copiado!",confirm:"Confirmar Direcci\xf3n",outputs:"Salidas No Gastadas",history:"Historial"}},send:{"synchronizing-warning":"La billetera todav\xeda est\xe1 sincronizando los datos, por lo que el saldo que se muestra puede ser incorrecto. \xbfSeguro de que desea continuar?","from-label":"Enviar desde","to-label":"Enviar a","amount-label":"Cantidad","notes-label":"Notas","wallet-label":"Billetera","addresses-label":"Direcci\xf3n","invalid-amount":"Por favor introduzca una cantidad v\xe1lida","addresses-help":"Limite las direcciones desde donde se podr\xedan enviar las monedas y las horas","all-addresses":"Todas las direcciones de la billetera seleccionada","outputs-label":"Salidas no gastadas","outputs-help":"Limite las salidas no gastadas desde donde se podr\xedan enviar las monedas y las horas. Solo se muestran las salidas de las direcciones seleccionadas.","all-outputs":"Todas las salidas no gastadas de las direcciones seleccionadas","available-msg-part1":"Con su selecci\xf3n actual puede enviar hasta","available-msg-part2":"y","available-msg-part3":"(al menos","available-msg-part4":"deben ser utilizadas para la tarifa de transacci\xf3n).","change-address-label":"Direcci\xf3n de retorno personalizada","change-address-select":"Seleccionar","change-address-help":'Direcci\xf3n para recibir el cambio. Si no se proporciona, ser\xe1 elegida autom\xe1ticamente. Haga clic en el enlace "Seleccionar" para elegir una direcci\xf3n de una de sus billeteras',"destinations-label":"Destinos","destinations-help1":"Direcciones de destino y sus monedas","destinations-help2":"Direcciones de destino, sus monedas y coin hours","hours-allocation-label":"Distribuci\xf3n autom\xe1tica de coin hours","options-label":"Opciones","value-label":"Factor de distribuci\xf3n de las coin hours","value-help":"Mientras mayor sea el valor, m\xe1s coin hours se enviar\xe1n a las salidas","preview-button":"Preview","send-button":"Enviar","back-button":"Volver",simple:"Simple",advanced:"Advanzado","select-wallet":"Seleccionar Billetera"},reset:{"wallet-label":"Billetera","seed-label":"Semilla de la billetera","password-label":"Nueva contrase\xf1a (deje en blanco si desea que la billetera no est\xe9 encriptada)","confirm-label":"Confirme la contrase\xf1a","reset-button":"Restaurar"},tx:{transaction:"Transacci\xf3n","confirm-transaction":"Confirmar Transacci\xf3n",from:"Desde",to:"A",date:"Fecha",status:"Estatus",coins:"Monedas",hours:"Horas",id:"Tx ID","show-more":"Mostrar m\xe1s","hours-moved":"movida(s)","hours-sent":"enviada(s)","hours-received":"recibida(s)","hours-burned":"quemada(s)",inputs:"Entradas",outputs:"Salidas",confirmed:"Confirmada",pending:"Pendiente","current-rate":"Calculado a la tasa actual"},backup:{"wallet-directory":"Directorio de la Billetera:","seed-warning":"RESPALDE SU SEMILLA. EN PAPEL. EN UN LUGAR SEGURO. Mientras tenga su semilla, podr\xe1 recuperar las monedas.",desc:"Use la tabla de m\xe1s abajo para obtener las semillas de sus billeteras encriptadas.
Para obtener las semillas de las billeteras no encriptadas, abra el directorio de m\xe1s arriba, abra los archivos .wlt en un editor de texto y recupere las semillas.","close-button":"Cerrar",wallet:"Nombre de la Billetera",filename:"Archivo",seed:"Semilla","show-seed":"Mostrar semilla","no-wallets":"No hay billeteras encriptadas"},blockchain:{blocks:"Cantidad de bloques",time:"Fecha del \xfaltimo bloque",hash:"Hash del \xfaltimo bloque","current-supply":"Suministro de SKY actual","total-supply":"Suministro de SKY total","current-coinhour-supply":"Suministro de Coin Hours actual","total-coinhour-supply":"Suministro de Coin Hours total"},network:{peer:"Par",source:"Fuente","block-height":"Altura del bloque","block-height-short":"Bloque","last-seen":"\xdaltima vez visto","last-received":"\xdaltima recepci\xf3n","last-sent":"\xdaltimo env\xedo",in:"Entrante",out:"Saliente",sources:{default:"Par por defecto",exchange:"Intercambio de pares"}},"pending-txs":{timestamp:"Fecha",txid:"ID de la transacci\xf3n",none:"Actualmente no hay transacciones pendientes",my:"M\xedas",all:"Todas"},history:{"tx-detail":"Detalles de la Transacci\xf3n",moving:"Moviendo internamente",moved:"Movida internamente",sending:"Enviando",sent:"Enviada",received:"Recibida",receiving:"Recibiendo",pending:"Pendiente","no-txs":"Usted no tiene historial de transacciones","no-txs-filter":"No hay transacciones que coincidan con los criterios de filtro actuales","no-filter":"Sin filtros activos (Presione para seleccionar billeteras/direcciones)",filter:"Filtro activo: ",filters:"Filtros activo: ","all-addresses":"Todas las direcciones"},teller:{done:"Completado","waiting-confirm":"Esperando confirmaci\xf3n","waiting-deposit":"Esperando dep\xf3sito de Bitcoins","waiting-send":"Esperando para env\xedar Skycoins",unknown:"Desconocido"},confirmation:{"header-text":"Confirmaci\xf3n","confirm-button":"S\xed","cancel-button":"No",close:"Cerrar"},service:{api:{"server-error":"Error de servidor"},wallet:{"not-enough-hours":"\xa1No cuenta con suficientes Coin Hours para realizar la operaci\xf3n!"}},"hardware-wallet":{general:{"default-wallet-name":"Nueva billetera de hardware","error-disconnected":"No se puede realizar la operaci\xf3n. La billetera de hardware no est\xe1 conectada.","simple-error":"Error, no se puede realizar la operaci\xf3n.","generic-error":"No se puede realizar la operaci\xf3n. Aseg\xfarese de haber conectado una billetera de hardware v\xe1lida y de que no est\xe9 esperando por alguna confirmaci\xf3n o respuesta.","generic-error-internet":"No se puede realizar la operaci\xf3n. Aseg\xfarese de haber conectado una billetera de hardware v\xe1lida que no est\xe9 esperando por alguna confirmaci\xf3n o respuesta y de que su equipo cuente con conexi\xf3n a internet y al nodo.","error-incorrect-wallet":"No se puede realizar la operaci\xf3n. La billetera de hardware conectada es diferente a la esperada.","error-incorrect-pin":"No se puede realizar la operaci\xf3n. El PIN que ha introducido no es correcto.",confirm:"Por favor, confirme la operaci\xf3n en la billetera de hardware.","confirm-and-more":"Por favor, confirme la operaci\xf3n en la billetera de hardware y siga las instrucciones.",close:"Cerrar",cancel:"Cancelar",continue:"Continuar",completed:"La operaci\xf3n se realiz\xf3 con \xe9xito.",refused:"La operaci\xf3n fall\xf3 o fue cancelada."},errors:{"too-many-inputs":"La transacci\xf3n tiene demasiadas entradas y no se puede procesar. Por favor, p\xf3ngase en contacto con el soporte t\xe9cnico.","too-many-outputs":"La transacci\xf3n tiene demasiadas salidas y no se puede procesar. Por favor, p\xf3ngase en contacto con el soporte t\xe9cnico."},"security-warning":{title:"Advertencia de seguridad",text:'La \xfaltima vez que se conect\xf3 esta billetera de hardware, se encontraron una o m\xe1s advertencias de seguridad. Le recomendamos que abra las opciones de billetera de hardware (presionando el bot\xf3n "Billetera de hardware" debajo de la lista de billeteras) mientras el dispositivo est\xe1 conectado y resuelva los problemas de seguridad antes de continuar.',check:"Entiendo los riesgos y deseo continuar.",continue:"Continuar",cancel:"Cancelar"},options:{connecting:"Conectando...",disconnected:"Billetera de hardware no detectada. Por favor, conecte una billetera de hardware para usar esta opci\xf3n.","unconfigured-detected-title":"Billetera de hardware no configurada","unconfigured-detected":'Se ha detectado una billetera de hardware sin semilla. Seleccione "Configurar autom\xe1ticamente" si desea configurarla como una billetera nueva y comenzar a usarla inmediatamente, o seleccione "Restaurar una copia de seguridad" si desea configurarla con la copia de seguridad de una semilla creada anteriormente y as\xed poder acceder a sus fondos de nuevo.',"configured-detected":"Billetera de hardware detectada. El dispositivo se identifica en la lista de billeteras como:","security-warnings-title":"Advertencias de seguridad","security-warning-title":"Advertencia de seguridad","backup-warning":'Debe hacer una copia de seguridad de la semilla de la billetera de hardware o podr\xeda perder acceso a los fondos en caso de problemas. Para hacer esto, seleccione la opci\xf3n "Crear copia de seguridad".',"pin-warning":'La billetera de hardware conectada no tiene un PIN. El c\xf3digo PIN protege la billetera de hardware en caso de p\xe9rdida, robo y pirateo. Para crear un c\xf3digo PIN, seleccione la opci\xf3n "Crear c\xf3digo PIN".',options:"Opciones:","configure-automatically":"Configurar autom\xe1ticamente","restore-backup":"Restaurar una copia de seguridad","create-backup":"Crear copia de seguridad",wipe:"Borrar el dispositivo","confirm-seed":"Confirmar la semilla","create-pin":"Crear c\xf3digo PIN","change-pin":"Cambiar el c\xf3digo PIN","forgotten-pin1":"Si no puede acceder a la billetera porque ha olvidado el PIN, puede borrar la billetera del hardware y luego restaurarla con la semilla haciendo clic","forgotten-pin2":"aqu\xed."},"generate-seed":{text:"Antes de continuar, puede seleccionar el n\xfamero de palabras que desea que tenga la semilla. La semilla es una lista de palabras que se pueden usar para recuperar el acceso a las monedas en caso de problemas. Ambos valores son seguros, por lo que si no tiene una raz\xf3n especial para seleccionar uno u otro, puede dejar el valor predeterminado.",configuring:"Configurando..."},"restore-seed":{text:"Antes de continuar, por favor seleccione la cantidad de palabras de la semilla que desea recuperar.","check-text":"Puede usar esta opci\xf3n para ingresar una semilla y verificar si es igual a la de la billetera de hardware. Antes de comenzar, seleccione el n\xfamero de palabras de la semilla que desea verificar.",warning:"ADVERTENCIA: para evitar posibles problemas, use solo semillas creadas con una billetera de hardware de la misma marca/modelo.","error-wrong-word":"Error: la palabra introducida no coincide con la solicitada por la billetera de hardware.","error-invalid-seed":"Error: La semilla no es v\xe1lida. Por favor, aseg\xfarese de ingresar las palabras correctas en el orden correcto.","error-wrong-seed":"Error: la semilla es v\xe1lida pero no coincide con la del dispositivo."},added:{title:"Nueva Billetera de Hardware",configuring:"Nueva billetera de hardware detectada. Configurando...",done:"Hecho",added1:"La billetera de hardware conectada se ha agregado a la lista de billeteras con el siguiente nombre:",added2:"Ahora puede consultar el saldo y las direcciones de la billetera de hardware incluso cuando no est\xe1 conectada. Adem\xe1s, puede cambiar el nombre de la billetera o eliminarla de la lista de billeteras, si lo desea."},wipe:{warning:"ADVERTENCIA: Todos los datos en la billetera de hardware ser\xe1n eliminados. Si no tiene una copia de seguridad, no podr\xe1 volver a acceder a sus fondos.","confirm-delete":"Quitar tambi\xe9n de la lista de billeteras."},"create-backup":{warning:'ADVERTENCIA: Solo puede usar esta opci\xf3n para hacer una copia de seguridad de la semilla de su billetera de hardware una vez. Si decide continuar, tendr\xe1 que escribir un grupo de palabras (se recomienda hacerlo en papel y no en una computadora) que aparecer\xe1n en la pantalla de la billetera de hardware y almacenar la lista en un lugar seguro. Cualquier persona con acceso a la lista de palabras (la "semilla") podr\xe1 acceder a los fondos de la cartera, por lo que se recomienda extremar las precauciones.',instructions:"Escriba la lista de palabras que aparecen en la pantalla de la billetera de hardware. Aseg\xfarate de respetar el orden y escribir cada palabra correctamente."},"seed-word":{title:"Ingresar palabra",info1:"Introduzca la palabra indicada en el dispositivo",info2:"Se le pedir\xe1 que ingrese las palabras de su semilla de respaldo en orden aleatorio, m\xe1s algunas palabras adicionales.",word:"Palabra solicitada","error-invalid-word":"La palabra introducida no es v\xe1lida.","error-loading-words":"Cargando la lista de palabras. Por favor espere."},"change-pin":{"pin-mismatch":"No se puede realizar la operaci\xf3n. Los dos PIN que ha introducido no coinciden."},"enter-pin":{title:"Ingresar PIN","title-change-current":"Ingrese el PIN actual","title-change-new":"Ingrese el nuevo PIN","title-change-confirm":"Confirme el nuevo PIN",instructions:"El patr\xf3n de n\xfameros del PIN se muestra en la pantalla de la billetera de hardware.","instructions-tx":"Introduzca el PIN para confirmar y firmar la transacci\xf3n.","instructions-change":"Ingrese un PIN dif\xedcil de adivinar de entre 4 y 8 n\xfameros.",help:"\xbfNecesita ayuda?"},"pin-help":{title:"Ayuda",part1:"Cuando sea necesario ingresar el PIN para continuar, la pantalla de la billetera del hardware mostrar\xe1 una matriz de 9 casillas con n\xfameros en orden aleatorio (el orden cambia cada vez) y se le pedir\xe1 que ingrese el PIN en la billetera de software usando una matriz de 9 botones que simplemente muestran el s\xedmbolo #.",part2:'Para ingresar el PIN, mire la posici\xf3n de los n\xfameros del PIN en la matriz de n\xfameros en la pantalla de la billetera de hardware y presione los botones correspondientes en la billetera de software. Por ejemplo, si el PIN es "23", el n\xfamero 2 est\xe1 en la esquina superior izquierda y el n\xfamero 3 en el centro de la matriz de n\xfameros de billetera de hardware, presione los botones superior izquierdo y central, en ese orden, en la billetera de software.',part3:'Si lo desea, tambi\xe9n puede usar el teclado num\xe9rico para ingresar el PIN. Sin embargo, como en el ejemplo anterior, si el PIN es "23", no puede simplemente escribir "23" con el teclado num\xe9rico, sino que deber\xe1 presionar las teclas que est\xe1n en la posici\xf3n donde est\xe1n los n\xfameros 2 y 3 en la pantalla de la billetera de hardware.'},"create-tx":{title:"Crear transacci\xf3n"},"confirm-address":{title:"Confirmar direcci\xf3n",instructions:"Por favor confirme en la billetera de hardware si la direcci\xf3n es:","short-confirmation":"Direcci\xf3n confirmada.",confirmation:'Direcci\xf3n confirmada. Por seguridad, puede volver a mostrar la direcci\xf3n en la billetera de hardware usando la opci\xf3n "Confirmar direcci\xf3n", en el men\xfa que puede mostrar presionando el bot\xf3n a la derecha del balance de la direccion.'}},"time-from-now":{"few-seconds":"hace pocos segundos",minute:"hace un minuto",minutes:"hace {{time}} minutos",hour:"hace una hora",hours:"hace {{time}} horas",day:"hace un d\xeda",days:"hace {{time}} d\xedas"},exchange:{"you-send":"Usted env\xeda","you-get":"Usted recibe (aprox.)","to-address":"A la direcci\xf3n de {{coin}}",price:"Tasa de cambio","time-15":"Duraci\xf3n del intercambio","exchange-button":"Intercambiar","min-amount":"Monto minimo:","max-amount":"Monto maximo:","agree-1":"Acepto los","agree-2":"T\xe9rminos de Uso","agree-3":"y la ","agree-4":"Pol\xedtica de Privacidad","powered-by":"Manejado por","need-help":"\xbfNecesita ayuda?","support-portal":"Portal de soporte",history:"Historial de \xf3rdenes","order-not-found":"Orden no encontrada",status:"Estado",exchanging:"Intercambiando {{from}} por {{to}}",select:"Seleccionar",offline:"El servicio est\xe1 temporalmente offline","problem-connecting":"No se puede conectar con el servicio. Por favor, compruebe su conexi\xf3n a Internet y vuelva a intentarlo m\xe1s tarde.","invalid-address":"Direcci\xf3n inv\xe1lida.",statuses:{"user-waiting":"Esperando el deposito. Por favor, env\xede {{amount}} {{from}} a la direcci\xf3n de intercambio indicada m\xe1s abajo","user-waiting-info":"El sistema est\xe1 a la espera de que realice el dep\xf3sito en la direcci\xf3n de intercambio. El proceso de intercambio comenzar\xe1 despu\xe9s de que se detecte el dep\xf3sito y sea confirmado en la cadena de bloques. Si ya ha realizado el dep\xf3sito, deber\xeda ser detectado en breve.","market-waiting-confirmations":"Esperando las confirmaciones de la transacci\xf3n","market-waiting-confirmations-info":"El dep\xf3sito ya ha sido detectado y el sistema est\xe1 esperando que sea confirmado en la cadena de bloques.","market-confirmed":"Transacci\xf3n aceptada","market-confirmed-info":"La transacci\xf3n ya ha sido confirmada en la cadena de bloques. Haciendo los preparativos para realizar el intercambio pronto.","market-exchanged":"{{from}} intercambiado por {{to}}","market-exchanged-info":"El intercambio se ha realizado. Los fondos ser\xe1n transferidos a su direcci\xf3n en un momento.","market-withdraw-waiting":"Enviando {{to}} a su direcci\xf3n","market-withdraw-waiting-info":"Se ha iniciado el proceso para enviar las monedas a su direcci\xf3n.",complete:"\xa1Intercambio completado!","complete-info":"Los fondos han sido enviados con \xe9xito a su direcci\xf3n.",error:"Se produjo un error","error-info":"Hubo un error en la operaci\xf3n, puede encontrar m\xe1s informaci\xf3n m\xe1s abajo. Si necesita ayuda, por favor guarde todos los datos de operaci\xf3n que se muestran m\xe1s abajo y comun\xedquese con soporte t\xe9cnico utilizando el enlace que se encuentra en la parte inferior derecha de esta p\xe1gina."},"history-window":{address:"Direcci\xf3n",date:"Fecha"},details:{"exchange-addr":"Direcci\xf3n de intercambio","exchange-addr-tag":"Payment ID o Destination Tag que debe usarse para la transacci\xf3n","tx-id":"ID de la transacci\xf3n","order-id":"ID de la orden","initial-price":"Tasa de cambio inicial","error-msg":"Mensaje de error",details:"Detalles","start-date":"Fecha de inicio",back:"Volver","back-alert":'La operaci\xf3n a\xfan est\xe1 en progreso. \xbfRealmente desea volver al formulario? Puede ver el progreso de esta operaci\xf3n nuevamente presionando el bot\xf3n "Historial de pedidos"'}}}}}); \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/5.a2cdc3b5d1d15440fa16.chunk.js b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/5.a2cdc3b5d1d15440fa16.chunk.js new file mode 100644 index 00000000..ebd2ddab --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/5.a2cdc3b5d1d15440fa16.chunk.js @@ -0,0 +1 @@ +webpackJsonp([5],{TKku:function(e,t){e.exports={common:{"coin-id":"SKY","coin-hours":"Coin Hours",usd:"USD",loading:"Loading...",new:"New",load:"Load",success:"Success",warning:"Warning","changes-made":"The changes have been made."},errors:{error:"Error","fetch-version":"Unable to fetch latest release version from Github","incorrect-password":"Incorrect password","error-decrypting":"Error decrypting the wallet","api-disabled":"API disabled","no-wallet":"Wallet does not exist","no-outputs":"No unspent outputs","window-size":"The window is too narrow for the content"},title:{language:"Select Language",wallets:"Wallets",send:"Send",history:"History","buy-coin":"Buy Skycoin",network:"Networking",blockchain:"Blockchain",outputs:"Outputs",transactions:"Transactions","pending-txs":"Pending Transactions",backup:"Backup Wallet",explorer:"Skycoin Explorer",seed:"Wallet Seed",reset:"Reset Password",exchange:"Exchange","select-address":"Select Address","order-history":"Order history"},header:{"syncing-blocks":"Syncing blocks",update1:"Wallet update",update2:"available.",synchronizing:"The wallet is synchronizing. Data you see may not be updated.","pending-txs1":"There are some","pending-txs2":"pending transactions.","pending-txs3":"Data you see may not be updated.",errors:{"no-connections":"No connections active, your client is not connected to any other nodes!","no-backend1":"Cannot reach backend. Please restart the app and/or seek help on our","no-backend2":"Telegram.","no-backend3":"",csrf:"Security vulnerability: CSRF is not working, please exit immediately."}},password:{title:"Enter Password",label:"Password","confirm-label":"Confirm password",button:"Proceed","reset-link":"I forgot my password"},buy:{"deposit-address":"Choose an address to generate a BTC deposit link for:","select-address":"Select address",generate:"Generate","deposit-location":"Deposit Location","deposit-location-desc":"Choose a wallet where you'd like us to deposit your Skycoin after we receive your Bitcoin.","make-choice":"Make a choice","wallets-desc":"Each time a new wallet and address are selected, a new BTC address is generated. A single Skycoin address can have up to 5 BTC addresses assigned to it.",send:"Send Bitcoin","send-desc":"Send Bitcoin to the address below. Once received, we will deposit the Skycoin to a new address in the wallet selected above at the current rate of {{ rate }} SKY/BTC.","fraction-warning":"Only send multiple of the SKY/BTC rate! Skycoin is sent in whole number; fractional SKY is not sent!",receive:"Receive Sky","receive-desc":"After receiving your Bitcoin, we'll send you your Skycoin. It may take anywhere between 20 minutes and an hour to receive your SKY.","status-button":"Status:","check-status-button":"Check Status","new-order-button":"New Order"},wizard:{"wallet-desc":'If you don\'t have a Skycoin wallet, use the generated seed to create a new one. If you already have a wallet, toggle over to "Load Wallet" and enter your seed.',"encrypt-desc":"Increase security of your wallet by encrypting it. By entering a password below, your wallet will be encrypted. Only those with the password will be able access the wallet and remove funds.","hardware-wallet-link":"Using a Skywallet?","finish-button":"Finish","back-button":"Back",confirm:{title:"Safeguard your seed!",desc:"We want to make sure that you wrote down your seed and stored it in a safe place. If you forget your seed, you WILL NOT be able to recover your Skycoin wallet!",checkbox:"It\u2019s safe, I swear.",button:"Continue"}},wallet:{"new-address":"New Address","new-addresses":"New Addresses","show-empty":"Show Empty","hide-empty":"Hide Empty",encrypt:"Encrypt Wallet",decrypt:"Decrypt Wallet","decrypt-warning":"Warning: for security reasons, it is not recommended to keep the wallets unencrypted. Caution is advised.",delete:"Delete Wallet",edit:"Edit Wallet",add:"Add Wallet",load:"Load Wallet","encryption-enabled":"Encryption enabled","encryption-disabled":"Encryption disabled","hw-security-warning":'Possible security risk. Access the Skywallet options (by pressing the "Skywallet" button below the wallets list) while the device is connected for more information.',wallet:"Wallet","hardware-wallet":"Skywallet","delete-confirmation":'WARNING: The wallet "{{ name }}" will be removed from the list. To add it again, you will have to reconnect the device and open the Skywallet options (by pressing the "Skywallet" button below the wallets list). Do you want to continue?',"delete-confirmation-check":"Yeah, I want to delete the wallet.","max-hardware-wallets-error":"You have already reached the max number of addresses that can be added to the Skywallet.","add-many-confirmation":"WARNING: If you add too many addresses without using the previous ones or if you use the last ones and not the first ones, some addresses may not be recovered automatically if you try to restore the wallet using the seed (you will have to add them manually). Do you want to continue?",new:{"create-title":"Create Wallet","load-title":"Load Wallet","encrypt-title":"Encrypt Wallet","name-label":"Name","words-number":"How many word the seed has","seed-label":"Seed","confirm-seed-label":"Confirm seed","seed-warning":"Remember this seed! Keep it in a safe place. If you forget your seed, you will not be able to recover your wallet!","create-button":"Create","load-button":"Load","cancel-button":"Cancel","12-words":"12 words","24-words":"24 words","generate-12-seed":"Generate 12 word seed","generate-24-seed":"Generate 24 word seed",encrypt:"Encrypt wallet","encrypt-warning":"We suggest that you encrypt each one of your wallets with a password. If you forget your password, you can reset it with your seed. Make sure you have your seed saved somewhere safe before encrypting your wallet.","unconventional-seed-title":"Possible error","unconventional-seed-text":"You introduced an unconventional seed. If you did it for any special reason, you can continue (only recommended for advanced users). However, if your intention is to use a normal system seed, you must delete all the additional text and special characters.","unconventional-seed-check":"Continue with the unconventional seed.","synchronizing-warning-title":"Warning","synchronizing-warning-text":"The wallet is still synchronizing and some addresses may not be restored. If some addresses are not restored, please wait for the wallet to be fully synchronized and add them again manually.","synchronizing-warning-continue":"Continue","synchronizing-warning-cancel":"Cancel","wallet-created":"The wallet has been added to the list.",seed:{"enter-seed":"Press here to enter your seed.","change-seed":"Press to change","confirm-seed":"Press here to confirm your seed.","confirmed-seed":"Seed confirmed.","use-custom-seed":"Press here if you want to enter the seed manually.","use-normal-seed":"Press here if you want to enter the seed using the recommended method.","custom-seed-warning-title":"Warning","custom-seed-warning-text":"This option is only recommended for advanced users. Making mistakes with the seed could cause you to lose access to the funds in case of a problem.","custom-seed-warning-text-recovering":"To avoid possible problems, this option should only be used if you want to recover an unconventional seed.","custom-seed-warning-check":"I understand the risks and want to continue","custom-seed-warning-cancel":"Cancel","custom-seed-warning-continue":"Continue","incorrect-word":"The word you have entered does not match the requested one.","invalid-seed":"The seed you have entered is not valid. Please try again.","enter-word":"Enter the word #{{number}}","new-seed-help":"You must enter the words of the seed that was generated by the system, to confirm it.","recover-seed-help":"Please be sure to enter the correct words in the correct order."}},rename:{title:"Rename Wallet","name-label":"Name","cancel-button":"Cancel","rename-button":"Rename"},"add-addresses":{title:"Select quantity","name-quantity":"How many addresses to create","cancel-button":"Cancel","create-button":"Create",error:"There was an unexpected error. Please try again."},address:{show:"Press to show",copy:"Copy","copy-address":"Copy address",copied:"Copied!",confirm:"Confirm address",outputs:"Unspent outputs",history:"History"}},qr:{title:"QR Code","title-read-only":"QR Code",data:"QR Data:",address:"Address:","request-link":"Request specific amount",amount:"Request amount:",hours:"Request hours:",message:"Message:",invalid:"(invalid value)",copied:"The text has been copied to the clipboard."},send:{"synchronizing-warning":"The wallet is still synchronizing the data, so the balance shown may be incorrect. Are you sure you want to continue?","from-label":"Send from","to-label":"Send to","amount-label":"Amount","personal-note-label":"Personal note","personal-note-help":"Use this field to add a text for allowing you to identify the transaction in the future. This text is saved locally, so it will only be visible from this computer","wallet-label":"Wallet","addresses-label":"Addresses","invalid-amount":"Please enter a valid amount","convert-confirmation":"Do you also want the already introduced amount to be converted from {{from}} to {{to}}?","convert-confirmation-plural":"Do you also want the already introduced amounts to be converted from {{from}} to {{to}}?","send-all-available-coins":"send all","no-wallet-selected":"You must select a wallet first.","precision-error-warning":"A precision error was detected during conversion. Please check the amount that will be sent.","invaid-amount-warning":"An invalid value was detected during conversion. Please check the amount that will be sent.","precision-errors-warning":"Precision errors were detected during conversion. Please check the amount that will be sent.","invaid-amounts-warning":"Invalid values were detected during conversion. Please check the amount that will be sent.","multiple-problems-warning":"Some values were not converted because they were invalid or could have been converted with precision errors. Please check the amount that will be sent.","no-coins-left":"There are no coins left to send.","addresses-help":"Limit the addresses from where the coins and hours could be sent","all-addresses":"All the addresses of the selected wallet","outputs-label":"Unspent outputs","outputs-help":"Limit the unspent outputs from where the coins and hours could be sent. Only the outputs from the selected addresses are shown","all-outputs":"All the outputs of the selected addresses","available-msg-part1":"With your current selection you can send up to","available-msg-part2":"and","available-msg-part3":"(at least","available-msg-part4":"must be used for the transaction fee).","change-address-label":"Custom change address","change-address-select":"Select","change-address-help":'Address to receive change. If it\'s not provided, it will be chosen automatically. Click on the "Select" link to choose an address from one of your wallets',"destinations-label":"Destinations","destinations-help1":"Destination addresses and their coins","destinations-help2":"Destination addresses, their coins and coin hours","hours-allocation-label":"Automatic coin hours allocation","options-label":"Options","value-label":"Coin hours share factor","value-help":"The higher the value, the more coin hours will be sent to the recipients and less will be retained","preview-button":"Preview","send-button":"Send","back-button":"Back",simple:"Simple",advanced:"Advanced","select-wallet":"Select Wallet","error-saving-note":"The transaction was successfully sent, but it was not possible to save the note.",sent:"Transaction successfully sent.",total:"Total:","bulk-send":{title:"Bulk Send",indications:'To send to multiple destinations in a quick way, type each address, coin amount and hour amount (optional) on a line, separated by a comma. Example: if you want to send 10 coins and 5 hours to the "xyz" address, type "xyz,10,5"; if you want the hours to be calculated automatically, type "xyz,10". Decimal values must be separated with a dot.',process:"Process","error-no-data":"There is no text to process.","error-inconsistent-data":"If you set how many hours you want to send to a destinations, you must do so for all destinations.","error-invalid-data":"The entered text has an invalid format."}},reset:{"wallet-label":"Wallet","seed-label":"Wallet seed","password-label":"New password (leave empty if you want the wallet not to be encrypted)","confirm-label":"Confirm new password","reset-button":"Reset",done:"Password successfully changed."},tx:{transaction:"Transaction","confirm-transaction":"Confirm Transaction",from:"From",to:"To",date:"Date",status:"Status",coins:"Coins",hours:"Hours",id:"Tx ID",note:"Note","without-note":"Without note","show-more":"Show more","hours-moved":"moved","hours-sent":"sent","hours-received":"received","hours-burned":"burned",inputs:"Inputs",outputs:"Outputs",confirmed:"Confirmed",pending:"Pending","current-rate":"Calculated at the current rate"},"edit-note":{title:"Edit note","cancel-button":"Cancel","change-button":"Change"},backup:{"wallet-directory":"Wallet Directory:","seed-warning":"BACKUP YOUR SEED. ON PAPER. IN A SAFE PLACE. As long as you have your seed, you can recover your coins.",desc:"Use the table below to get seeds from your encrypted wallets.
To get seeds from unencrypted wallets, open the folder above, open the .wlt files in a text editor and recover the seeds.","close-button":"Close",wallet:"Wallet Label",filename:"Filename",seed:"Seed","show-seed":"Show seed","no-wallets":"No encrypted wallets"},blockchain:{blocks:"Number of blocks",time:"Timestamp of last block",hash:"Hash of last block","current-supply":"Current SKY supply","total-supply":"Total SKY supply","current-coinhour-supply":"Current Coin Hours supply","total-coinhour-supply":"Total Coin Hours supply"},network:{peer:"Peer",source:"Source","block-height":"Block height","block-height-short":"Block","last-seen":"Last seen","last-received":"Last received","last-sent":"Last sent",in:"Incoming",out:"Outgoing",sources:{default:"Default peer",exchange:"Peer exchange"}},"pending-txs":{timestamp:"Timestamp",txid:"Transaction ID",none:"No pending transactions",my:"Mine",all:"All"},history:{"tx-detail":"Transaction Detail",moving:"Internally moving",moved:"Internally moved",sending:"Sending",sent:"Sent",received:"Received",receiving:"Receiving",pending:"Pending",note:"Note","no-txs":"You have no transaction history","no-txs-filter":"There are no transactions matching the current filter criteria","no-filter":"No filter active (press to select wallets/addresses)",filter:"Active filter: ",filters:"Active filters: ","all-addresses":"All addresses"},teller:{done:"Completed","waiting-confirm":"Waiting for confirmation","waiting-deposit":"Waiting for Bitcoin deposit","waiting-send":"Waiting to send Skycoin",unknown:"Unknown"},confirmation:{"header-text":"Confirmation","confirm-button":"Yes","cancel-button":"No",close:"Close"},service:{api:{"server-error":"Server error"},wallet:{"not-enough-hours":"Not enough available Coin Hours to perform the transaction!"}},"hardware-wallet":{general:{"default-wallet-name":"New Skywallet","error-disconnected":"Unable to perform the operation. The Skywallet is not connected.","simple-error":"Error. Unable to perform the operation.","generic-error":"Unable to perform the operation. Make sure you have connected a valid Skywallet and that it is not waiting for input.","generic-error-internet":"Unable to perform the operation. Make sure you have connected a valid Skywallet that is not waiting for input and that you have a connection to the internet/node.","error-incorrect-wallet":"Unable to perform the operation. The connected Skywallet is different from the expected one.","error-incorrect-pin":"Unable to perform the operation. The PIN you have entered is incorrect.",confirm:"Please confirm the operation on the Skywallet.","confirm-and-more":"Please confirm the operation on the Skywallet and follow the instructions displayed.",follow:"Please follow the instructions displayed on the Skywallet.",close:"Close",cancel:"Cancel",continue:"Continue",completed:"Operation completed successfully.",refused:"The operation failed or was canceled.","name-updated":"The name used to identify this Skywallet in the wallet list has been updated to match the one shown on the device."},errors:{"too-many-inputs-outputs":"The transaction has too many inputs or outputs for the Skywallet. Please try again creating several smaller transactions, each one with a smaller number of recipients (if the current transaction has many) or coins.","daemon-connection":"Problem connecting to the Skywallet service.",timeout:"The operation was canceled due to inactivity. Please try again.","invalid-address-generated":"There was a problem with the address generator and the operation had to be canceled.","invalid-address":"Invalid address.","not-in-bootloader-mode":"To use this option the Skywallet must be in bootloader mode."},"security-warning":{title:"Security warning",text:"The last time this Skywallet was connected, one or more security warnings were found. We recommend that you open the Skywallet options (by pressing the link below) while the device is connected and solve the security problems before continuing.",link:"Open the Skywallet options window.",check:"I understand the risks and want to continue",continue:"Continue",cancel:"Cancel"},options:{connecting:"Connecting...",disconnected:"No Skywallet detected. Please connect a Skywallet to use this option.","unconfigured-detected-title":"Unconfigured Skywallet","unconfigured-detected":'A seedless Skywallet has been detected. Select "Configure automatically" if you want to configure it as a brand new wallet and start using it. Select "Restore backup" if you want to configure the Skywallet with a previously created seed backup.',"configured-detected":"Skywallet detected. The device is identified in the wallets list as:","security-warnings-title":"Security warnings","security-warning-title":"Security warning","unchecked-version-warning":"It was not possible to verify if the firmware of your Skywallet is up to date. This could be due to problems with your internet connection or because the service is under maintenance.","outdated-version-warning":'The firmware of your Skywallet is outdated. We recommend you to update it as soon as possible to ensure safety. To do this, select the "Update firmware" option.',"backup-warning":'You should backup the Skywallet seed or you could lose access to the funds in case of problems. To do this, select the "Create a backup" option.',"pin-warning":'The connected Skywallet does not have a PIN. The PIN code protects the Skywallet from unauthorized parties accessing the device. To create a PIN code, select the "Create PIN code" option.',options:"Options:","update-firmware":"Update firmware","configure-automatically":"Configure automatically","restore-backup":"Restore backup","create-backup":"Create a backup",wipe:"Wipe the device","confirm-seed":"Confirm seed","create-pin":"Create PIN code","change-pin":"Change PIN code","delete-pin":"Delete PIN code","forgotten-pin1":"If you cannot access the wallet because you have forgotten the PIN, you can wipe the Skywallet and then restore it with the seed by clicking","forgotten-pin2":"here.","firmware-version":"Device firmware version:"},"update-firmware-warning":{title:"Outdated Firmware",text:"WARNING: the firmware in your Skywallet is outdated. To stay safe, it is recommended to update it.",cancel:"Cancel",update:"Update"},"update-firmware":{"title-connecting":"Connecting...","title-update":"Update Firmware","title-install":"Install Firmware","text-downloading":"Checking device and downloading files...","text-bootloader":"WARNING: if you have already configured this device, before continuing you must have a backup of your seed or you could permanently lose access to the funds.","text-not-bootloader":"To update the firmware of your Skywallet you must connect it in bootloader mode (connect it to the computer while pressing the two physical buttons of the device). WARNING: if you have already configured this device, before continuing you must have a backup of your seed or you could permanently lose access to the funds.","text-no-firmware":"Welcome. The currently connected Skywallet does not have a firmware installed. A firmware will now be installed so you can start using the device. NOTE: if you have already configured this device and want to recover the funds, you will need your seed.",check:"I understand the risks and want to continue",follow:"The firmware update has been sent to the Skywallet. Please continue the process on the device.","connection-error":"It was not possible to download the firmware. This could be due to problems with your internet connection or because the service is under maintenance.",timeout:"The operation was canceled due to inactivity. Please disconnect the device, reconnect it and try again.",finished:"Your device has been configured correctly. Please unplug it before continuing."},"generate-seed":{text:"Before proceeding, you can select the number of words you want the seed to have. The seed is a list of words that can be used to recover access to the coins in case of problems. Both values are safe, so if you do not have a special reason for selecting one or the other, you can leave the default value.",configuring:"Configuring..."},"restore-seed":{text:"Before proceeding, please select the number of words that the seed you want to recover has.","check-text":"You can use this option to enter a seed and check if it is equal to the one in the Skywallet. Before start, select the number of words the seed you want to check has.",warning:"WARNING: to avoid potential problems, use only seeds created with a Skywallet.","error-wrong-word":"Error: The retyped word does not match the one requested by the Skywallet.","error-invalid-seed":"Error: The seed is not valid. Please be sure to enter the correct words in the correct order.","error-wrong-seed":"Error: The seed is valid but does not match the one in the device.","correct-seed":"The seed is valid and matches the one in the device."},added:{title:"New Skywallet",configuring:"New Skywallet detected. Configuring...",done:"Done",added1:"The connected Skywallet has been added to the wallets list with the following name:",added2:"Now you can check the balance and the addresses of the Skywallet even when it is not connected. Additionally, you can change the name of the wallet or remove it from the wallets list, if you wish.","characters-warning":"If you use non-standard English characters, the name may not be displayed correctly on the device.",ok:"Ok"},wipe:{warning:"WARNING: All the data on the Skywallet will be deleted. If you do not have a backup, you will not be able to access your funds again.","confirm-delete":"Also remove from the wallets list"},"create-backup":{warning:'WARNING: You can only create a backup of your Skywallet seed once. If you decide to continue, you will have to write down a group of words (it is recommended to do it on paper and not on a computer) that will appear on the screen of the Skywallet and store the list in a safe place. Anyone with access to the word list (the "seed") will be able access the wallet funds, so extreme caution is advised.',instructions:"Write down the word list that appear on the screen of the Skywallet. Make sure you respect the order and write each word correctly."},"seed-word":{title:"Enter word",info1:"Enter the word shown on the device",info2:"You will be asked to enter the words of your backup seed in random order. Also, additional random words could be requested.",word:"Requested word","error-invalid-word":"The entered word is not valid.","error-loading-words":"Loading the word list. Please wait."},"change-pin":{"pin-mismatch":"Unable to perform the operation. The PINs you have entered do not match."},"remove-pin":{warning:"WARNING: It is not recommended to remove the PIN code from your Skywallet, as it will be vulnerable to being used by unauthorized parties in case of loss or theft.",check:"I understand the risks and want to continue"},"enter-pin":{title:"Enter PIN","title-change-current":"Enter the current PIN","title-change-new":"Enter the new PIN","title-change-confirm":"Confirm the new PIN",instructions:"The PIN layout is displayed on the Skywallet screen.","instructions-tx":"Enter the PIN to confirm and sign the transaction.","instructions-change":"Please enter a secure PIN consisting of 4 to 8 numbers.",help:"Need help?"},"pin-help":{title:"Help",part1:"When it is necessary to enter the PIN to continue, the Skywallet screen will display a matrix of 9 boxes with numbers in random order (the order changes each time) and you will be asked to enter the PIN in the software wallet using a matrix of 9 buttons that simply show the symbol \u2022.",part2:'To enter the PIN, look at the position of the PIN numbers in numbers matrix on the screen of the Skywallet and press the corresponding buttons in the software wallet. For example, if the PIN is "23" and the number 2 is in the upper left, number 3 in the middle of the Skywallet numbers matrix, press the upper left and middle button in that order in the software wallet.',part3:'If you wish, you can also use the numpad on your keyboard to enter the PIN. However, as in the previous example, if the PIN is "23", you can not simply type "23" with the numpad, but you will have to press the keys that are in the position where the numbers 2 and 3 are shown on the screen of the Skywallet. Taking into account the previous example, you would have to press the "7" and "5" keys, because those are the keys that you are in the same position as the numbers shown by the Skywallet.'},"create-tx":{title:"Create transaction","upper-text":"Please confirm the operation in the Skywallet after verifying if the following data matches EXACTLY with the transaction you wish to send and with those shown by the Skywallet:","lower-text":"If any data does not correspond to what the Skywallet shows or the transaction you wish to send, cancel the operation on your Skywallet.","send-p1":"and","send-p2":"to"},"confirm-address":{title:"Confirm address",instructions:"Please confirm on the Skywallet if the address is:","short-confirmation":"Address confirmed.",confirmation:'Address confirmed. For security, you can re-show the address in the Skywallet using the "Confirm address" option, in the menu that you can display by pressing the button at the right of the address balance.'}},"time-from-now":{"few-seconds":"a few seconds ago",minute:"one minute ago",minutes:"{{time}} minutes ago",hour:"one hour ago",hours:"{{time}} hours ago",day:"one day ago",days:"{{time}} days ago"},exchange:{"you-send":"You send","you-get":"You get (approx.)","to-address":"To {{coin}} address",price:"Exchange rate","time-15":"Exchange time","exchange-button":"Exchange","min-amount":"Minimum amount:","max-amount":"Maximum amount:","agree-1":"I agree with","agree-2":"Terms of Use","agree-3":"and","agree-4":"Privacy Policy","powered-by":"Powered by","need-help":"Need help?","support-portal":"Support portal",history:"Order history","order-not-found":"Order not found",status:"Status",exchanging:"Exchanging {{from}} for {{to}}",select:"Select",offline:"Exchange is temporarily offline","problem-connecting":"Unable to connect with the service. Please check your Internet connection and try again later.","invalid-address":"Invalid address.",statuses:{"user-waiting":"Waiting for deposit. Please send {{amount}} {{from}} to the exchange address shown below","user-waiting-info":"The system is waiting for you to make the deposit into the exchange address. The exchange process will start after the deposit is detected and confirmed in the blockchain. If you have already made the deposit, it should be detected shortly.","market-waiting-confirmations":"Waiting for transaction confirmations","market-waiting-confirmations-info":"The deposit has already been detected and the system is waiting for it to be confirmed in the blockchain.","market-confirmed":"Transaction accepted","market-confirmed-info":"The transaction has already been confirmed in the blockchain. Preparing to make the exchange soon.","market-exchanged":"Traded {{from}} for {{to}}","market-exchanged-info":"The exchange has been made. The funds will be transferred to your address in a moment.","market-withdraw-waiting":"Sending {{to}} to your address","market-withdraw-waiting-info":"The process for sending the coins to your address has been initiated.",complete:"Exchange completed!","complete-info":"The funds have been successfully sent to your address.",error:"Error occurred","error-info":"There was an error in the operation, you can find more information below. If you need help, please save all the operation data shown below and contact technical support using the link in the lower right part of this page.","user-deposit-timeout":"Order canceled due to inactivity","user-deposit-timeout-info":"The system has canceled the order because no deposit was detected, please open a new order. If you need help, please save all the operation data shown below and contact technical support using the link in the lower right part of this page."},"history-window":{address:"Address",date:"Date"},details:{"exchange-addr":"Exchange address (valid for this exchange operation only)","exchange-addr-tag":"Payment ID or Destination Tag which must be used for the transaction","tx-id":"Transaction ID","order-id":"Order ID","initial-price":"Initial exchange rate","error-msg":"Error message",details:"Details","start-date":"Start date",back:"Back","back-alert":'The operation is still in progress. Do you really want to return to the form? You can see the progress of this operation again by pressing the "Order history" button'}}}}}); \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/6.86e4e580e25082578bb8.chunk.js b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/6.86e4e580e25082578bb8.chunk.js new file mode 100644 index 00000000..cae7ef32 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/6.86e4e580e25082578bb8.chunk.js @@ -0,0 +1 @@ +webpackJsonp([6],{flj1:function(e,a){e.exports={list:["abandon","ability","able","about","above","absent","absorb","abstract","absurd","abuse","access","accident","account","accuse","achieve","acid","acoustic","acquire","across","act","action","actor","actress","actual","adapt","add","addict","address","adjust","admit","adult","advance","advice","aerobic","affair","afford","afraid","again","age","agent","agree","ahead","aim","air","airport","aisle","alarm","album","alcohol","alert","alien","all","alley","allow","almost","alone","alpha","already","also","alter","always","amateur","amazing","among","amount","amused","analyst","anchor","ancient","anger","angle","angry","animal","ankle","announce","annual","another","answer","antenna","antique","anxiety","any","apart","apology","appear","apple","approve","april","arch","arctic","area","arena","argue","arm","armed","armor","army","around","arrange","arrest","arrive","arrow","art","artefact","artist","artwork","ask","aspect","assault","asset","assist","assume","asthma","athlete","atom","attack","attend","attitude","attract","auction","audit","august","aunt","author","auto","autumn","average","avocado","avoid","awake","aware","away","awesome","awful","awkward","axis","baby","bachelor","bacon","badge","bag","balance","balcony","ball","bamboo","banana","banner","bar","barely","bargain","barrel","base","basic","basket","battle","beach","bean","beauty","because","become","beef","before","begin","behave","behind","believe","below","belt","bench","benefit","best","betray","better","between","beyond","bicycle","bid","bike","bind","biology","bird","birth","bitter","black","blade","blame","blanket","blast","bleak","bless","blind","blood","blossom","blouse","blue","blur","blush","board","boat","body","boil","bomb","bone","bonus","book","boost","border","boring","borrow","boss","bottom","bounce","box","boy","bracket","brain","brand","brass","brave","bread","breeze","brick","bridge","brief","bright","bring","brisk","broccoli","broken","bronze","broom","brother","brown","brush","bubble","buddy","budget","buffalo","build","bulb","bulk","bullet","bundle","bunker","burden","burger","burst","bus","business","busy","butter","buyer","buzz","cabbage","cabin","cable","cactus","cage","cake","call","calm","camera","camp","can","canal","cancel","candy","cannon","canoe","canvas","canyon","capable","capital","captain","car","carbon","card","cargo","carpet","carry","cart","case","cash","casino","castle","casual","cat","catalog","catch","category","cattle","caught","cause","caution","cave","ceiling","celery","cement","census","century","cereal","certain","chair","chalk","champion","change","chaos","chapter","charge","chase","chat","cheap","check","cheese","chef","cherry","chest","chicken","chief","child","chimney","choice","choose","chronic","chuckle","chunk","churn","cigar","cinnamon","circle","citizen","city","civil","claim","clap","clarify","claw","clay","clean","clerk","clever","click","client","cliff","climb","clinic","clip","clock","clog","close","cloth","cloud","clown","club","clump","cluster","clutch","coach","coast","coconut","code","coffee","coil","coin","collect","color","column","combine","come","comfort","comic","common","company","concert","conduct","confirm","congress","connect","consider","control","convince","cook","cool","copper","copy","coral","core","corn","correct","cost","cotton","couch","country","couple","course","cousin","cover","coyote","crack","cradle","craft","cram","crane","crash","crater","crawl","crazy","cream","credit","creek","crew","cricket","crime","crisp","critic","crop","cross","crouch","crowd","crucial","cruel","cruise","crumble","crunch","crush","cry","crystal","cube","culture","cup","cupboard","curious","current","curtain","curve","cushion","custom","cute","cycle","dad","damage","damp","dance","danger","daring","dash","daughter","dawn","day","deal","debate","debris","decade","december","decide","decline","decorate","decrease","deer","defense","define","defy","degree","delay","deliver","demand","demise","denial","dentist","deny","depart","depend","deposit","depth","deputy","derive","describe","desert","design","desk","despair","destroy","detail","detect","develop","device","devote","diagram","dial","diamond","diary","dice","diesel","diet","differ","digital","dignity","dilemma","dinner","dinosaur","direct","dirt","disagree","discover","disease","dish","dismiss","disorder","display","distance","divert","divide","divorce","dizzy","doctor","document","dog","doll","dolphin","domain","donate","donkey","donor","door","dose","double","dove","draft","dragon","drama","drastic","draw","dream","dress","drift","drill","drink","drip","drive","drop","drum","dry","duck","dumb","dune","during","dust","dutch","duty","dwarf","dynamic","eager","eagle","early","earn","earth","easily","east","easy","echo","ecology","economy","edge","edit","educate","effort","egg","eight","either","elbow","elder","electric","elegant","element","elephant","elevator","elite","else","embark","embody","embrace","emerge","emotion","employ","empower","empty","enable","enact","end","endless","endorse","enemy","energy","enforce","engage","engine","enhance","enjoy","enlist","enough","enrich","enroll","ensure","enter","entire","entry","envelope","episode","equal","equip","era","erase","erode","erosion","error","erupt","escape","essay","essence","estate","eternal","ethics","evidence","evil","evoke","evolve","exact","example","excess","exchange","excite","exclude","excuse","execute","exercise","exhaust","exhibit","exile","exist","exit","exotic","expand","expect","expire","explain","expose","express","extend","extra","eye","eyebrow","fabric","face","faculty","fade","faint","faith","fall","false","fame","family","famous","fan","fancy","fantasy","farm","fashion","fat","fatal","father","fatigue","fault","favorite","feature","february","federal","fee","feed","feel","female","fence","festival","fetch","fever","few","fiber","fiction","field","figure","file","film","filter","final","find","fine","finger","finish","fire","firm","first","fiscal","fish","fit","fitness","fix","flag","flame","flash","flat","flavor","flee","flight","flip","float","flock","floor","flower","fluid","flush","fly","foam","focus","fog","foil","fold","follow","food","foot","force","forest","forget","fork","fortune","forum","forward","fossil","foster","found","fox","fragile","frame","frequent","fresh","friend","fringe","frog","front","frost","frown","frozen","fruit","fuel","fun","funny","furnace","fury","future","gadget","gain","galaxy","gallery","game","gap","garage","garbage","garden","garlic","garment","gas","gasp","gate","gather","gauge","gaze","general","genius","genre","gentle","genuine","gesture","ghost","giant","gift","giggle","ginger","giraffe","girl","give","glad","glance","glare","glass","glide","glimpse","globe","gloom","glory","glove","glow","glue","goat","goddess","gold","good","goose","gorilla","gospel","gossip","govern","gown","grab","grace","grain","grant","grape","grass","gravity","great","green","grid","grief","grit","grocery","group","grow","grunt","guard","guess","guide","guilt","guitar","gun","gym","habit","hair","half","hammer","hamster","hand","happy","harbor","hard","harsh","harvest","hat","have","hawk","hazard","head","health","heart","heavy","hedgehog","height","hello","helmet","help","hen","hero","hidden","high","hill","hint","hip","hire","history","hobby","hockey","hold","hole","holiday","hollow","home","honey","hood","hope","horn","horror","horse","hospital","host","hotel","hour","hover","hub","huge","human","humble","humor","hundred","hungry","hunt","hurdle","hurry","hurt","husband","hybrid","ice","icon","idea","identify","idle","ignore","ill","illegal","illness","image","imitate","immense","immune","impact","impose","improve","impulse","inch","include","income","increase","index","indicate","indoor","industry","infant","inflict","inform","inhale","inherit","initial","inject","injury","inmate","inner","innocent","input","inquiry","insane","insect","inside","inspire","install","intact","interest","into","invest","invite","involve","iron","island","isolate","issue","item","ivory","jacket","jaguar","jar","jazz","jealous","jeans","jelly","jewel","job","join","joke","journey","joy","judge","juice","jump","jungle","junior","junk","just","kangaroo","keen","keep","ketchup","key","kick","kid","kidney","kind","kingdom","kiss","kit","kitchen","kite","kitten","kiwi","knee","knife","knock","know","lab","label","labor","ladder","lady","lake","lamp","language","laptop","large","later","latin","laugh","laundry","lava","law","lawn","lawsuit","layer","lazy","leader","leaf","learn","leave","lecture","left","leg","legal","legend","leisure","lemon","lend","length","lens","leopard","lesson","letter","level","liar","liberty","library","license","life","lift","light","like","limb","limit","link","lion","liquid","list","little","live","lizard","load","loan","lobster","local","lock","logic","lonely","long","loop","lottery","loud","lounge","love","loyal","lucky","luggage","lumber","lunar","lunch","luxury","lyrics","machine","mad","magic","magnet","maid","mail","main","major","make","mammal","man","manage","mandate","mango","mansion","manual","maple","marble","march","margin","marine","market","marriage","mask","mass","master","match","material","math","matrix","matter","maximum","maze","meadow","mean","measure","meat","mechanic","medal","media","melody","melt","member","memory","mention","menu","mercy","merge","merit","merry","mesh","message","metal","method","middle","midnight","milk","million","mimic","mind","minimum","minor","minute","miracle","mirror","misery","miss","mistake","mix","mixed","mixture","mobile","model","modify","mom","moment","monitor","monkey","monster","month","moon","moral","more","morning","mosquito","mother","motion","motor","mountain","mouse","move","movie","much","muffin","mule","multiply","muscle","museum","mushroom","music","must","mutual","myself","mystery","myth","naive","name","napkin","narrow","nasty","nation","nature","near","neck","need","negative","neglect","neither","nephew","nerve","nest","net","network","neutral","never","news","next","nice","night","noble","noise","nominee","noodle","normal","north","nose","notable","note","nothing","notice","novel","now","nuclear","number","nurse","nut","oak","obey","object","oblige","obscure","observe","obtain","obvious","occur","ocean","october","odor","off","offer","office","often","oil","okay","old","olive","olympic","omit","once","one","onion","online","only","open","opera","opinion","oppose","option","orange","orbit","orchard","order","ordinary","organ","orient","original","orphan","ostrich","other","outdoor","outer","output","outside","oval","oven","over","own","owner","oxygen","oyster","ozone","pact","paddle","page","pair","palace","palm","panda","panel","panic","panther","paper","parade","parent","park","parrot","party","pass","patch","path","patient","patrol","pattern","pause","pave","payment","peace","peanut","pear","peasant","pelican","pen","penalty","pencil","people","pepper","perfect","permit","person","pet","phone","photo","phrase","physical","piano","picnic","picture","piece","pig","pigeon","pill","pilot","pink","pioneer","pipe","pistol","pitch","pizza","place","planet","plastic","plate","play","please","pledge","pluck","plug","plunge","poem","poet","point","polar","pole","police","pond","pony","pool","popular","portion","position","possible","post","potato","pottery","poverty","powder","power","practice","praise","predict","prefer","prepare","present","pretty","prevent","price","pride","primary","print","priority","prison","private","prize","problem","process","produce","profit","program","project","promote","proof","property","prosper","protect","proud","provide","public","pudding","pull","pulp","pulse","pumpkin","punch","pupil","puppy","purchase","purity","purpose","purse","push","put","puzzle","pyramid","quality","quantum","quarter","question","quick","quit","quiz","quote","rabbit","raccoon","race","rack","radar","radio","rail","rain","raise","rally","ramp","ranch","random","range","rapid","rare","rate","rather","raven","raw","razor","ready","real","reason","rebel","rebuild","recall","receive","recipe","record","recycle","reduce","reflect","reform","refuse","region","regret","regular","reject","relax","release","relief","rely","remain","remember","remind","remove","render","renew","rent","reopen","repair","repeat","replace","report","require","rescue","resemble","resist","resource","response","result","retire","retreat","return","reunion","reveal","review","reward","rhythm","rib","ribbon","rice","rich","ride","ridge","rifle","right","rigid","ring","riot","ripple","risk","ritual","rival","river","road","roast","robot","robust","rocket","romance","roof","rookie","room","rose","rotate","rough","round","route","royal","rubber","rude","rug","rule","run","runway","rural","sad","saddle","sadness","safe","sail","salad","salmon","salon","salt","salute","same","sample","sand","satisfy","satoshi","sauce","sausage","save","say","scale","scan","scare","scatter","scene","scheme","school","science","scissors","scorpion","scout","scrap","screen","script","scrub","sea","search","season","seat","second","secret","section","security","seed","seek","segment","select","sell","seminar","senior","sense","sentence","series","service","session","settle","setup","seven","shadow","shaft","shallow","share","shed","shell","sheriff","shield","shift","shine","ship","shiver","shock","shoe","shoot","shop","short","shoulder","shove","shrimp","shrug","shuffle","shy","sibling","sick","side","siege","sight","sign","silent","silk","silly","silver","similar","simple","since","sing","siren","sister","situate","six","size","skate","sketch","ski","skill","skin","skirt","skull","slab","slam","sleep","slender","slice","slide","slight","slim","slogan","slot","slow","slush","small","smart","smile","smoke","smooth","snack","snake","snap","sniff","snow","soap","soccer","social","sock","soda","soft","solar","soldier","solid","solution","solve","someone","song","soon","sorry","sort","soul","sound","soup","source","south","space","spare","spatial","spawn","speak","special","speed","spell","spend","sphere","spice","spider","spike","spin","spirit","split","spoil","sponsor","spoon","sport","spot","spray","spread","spring","spy","square","squeeze","squirrel","stable","stadium","staff","stage","stairs","stamp","stand","start","state","stay","steak","steel","stem","step","stereo","stick","still","sting","stock","stomach","stone","stool","story","stove","strategy","street","strike","strong","struggle","student","stuff","stumble","style","subject","submit","subway","success","such","sudden","suffer","sugar","suggest","suit","summer","sun","sunny","sunset","super","supply","supreme","sure","surface","surge","surprise","surround","survey","suspect","sustain","swallow","swamp","swap","swarm","swear","sweet","swift","swim","swing","switch","sword","symbol","symptom","syrup","system","table","tackle","tag","tail","talent","talk","tank","tape","target","task","taste","tattoo","taxi","teach","team","tell","ten","tenant","tennis","tent","term","test","text","thank","that","theme","then","theory","there","they","thing","this","thought","three","thrive","throw","thumb","thunder","ticket","tide","tiger","tilt","timber","time","tiny","tip","tired","tissue","title","toast","tobacco","today","toddler","toe","together","toilet","token","tomato","tomorrow","tone","tongue","tonight","tool","tooth","top","topic","topple","torch","tornado","tortoise","toss","total","tourist","toward","tower","town","toy","track","trade","traffic","tragic","train","transfer","trap","trash","travel","tray","treat","tree","trend","trial","tribe","trick","trigger","trim","trip","trophy","trouble","truck","true","truly","trumpet","trust","truth","try","tube","tuition","tumble","tuna","tunnel","turkey","turn","turtle","twelve","twenty","twice","twin","twist","two","type","typical","ugly","umbrella","unable","unaware","uncle","uncover","under","undo","unfair","unfold","unhappy","uniform","unique","unit","universe","unknown","unlock","until","unusual","unveil","update","upgrade","uphold","upon","upper","upset","urban","urge","usage","use","used","useful","useless","usual","utility","vacant","vacuum","vague","valid","valley","valve","van","vanish","vapor","various","vast","vault","vehicle","velvet","vendor","venture","venue","verb","verify","version","very","vessel","veteran","viable","vibrant","vicious","victory","video","view","village","vintage","violin","virtual","virus","visa","visit","visual","vital","vivid","vocal","voice","void","volcano","volume","vote","voyage","wage","wagon","wait","walk","wall","walnut","want","warfare","warm","warrior","wash","wasp","waste","water","wave","way","wealth","weapon","wear","weasel","weather","web","wedding","weekend","weird","welcome","west","wet","whale","what","wheat","wheel","when","where","whip","whisper","wide","width","wife","wild","will","win","window","wine","wing","wink","winner","winter","wire","wisdom","wise","wish","witness","wolf","woman","wonder","wood","wool","word","work","world","worry","worth","wrap","wreck","wrestle","wrist","write","wrong","yard","year","yellow","you","young","youth","zebra","zero","zone","zoo"]}}}); \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/MaterialIcons-Regular.012cf6a10129e2275d79.woff b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/MaterialIcons-Regular.012cf6a10129e2275d79.woff new file mode 100644 index 00000000..b648a3ee Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/MaterialIcons-Regular.012cf6a10129e2275d79.woff differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/MaterialIcons-Regular.570eb83859dc23dd0eec.woff2 b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/MaterialIcons-Regular.570eb83859dc23dd0eec.woff2 new file mode 100644 index 00000000..9fa21125 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/MaterialIcons-Regular.570eb83859dc23dd0eec.woff2 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/MaterialIcons-Regular.a37b0c01c0baf1888ca8.ttf b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/MaterialIcons-Regular.a37b0c01c0baf1888ca8.ttf new file mode 100644 index 00000000..7015564a Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/MaterialIcons-Regular.a37b0c01c0baf1888ca8.ttf differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/MaterialIcons-Regular.e79bfd88537def476913.eot b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/MaterialIcons-Regular.e79bfd88537def476913.eot new file mode 100644 index 00000000..70508eba Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/MaterialIcons-Regular.e79bfd88537def476913.eot differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-Bold.42363955889f2f20c527.woff b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-Bold.42363955889f2f20c527.woff new file mode 100644 index 00000000..780de6d6 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-Bold.42363955889f2f20c527.woff differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-Bold.6ccafc6fabc0cc8a971a.woff2 b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-Bold.6ccafc6fabc0cc8a971a.woff2 new file mode 100644 index 00000000..72a32ab2 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-Bold.6ccafc6fabc0cc8a971a.woff2 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-BoldItalic.923dce74069362d168fe.woff b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-BoldItalic.923dce74069362d168fe.woff new file mode 100644 index 00000000..20ec4ab2 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-BoldItalic.923dce74069362d168fe.woff differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-BoldItalic.c414dad20c4e3020221c.woff2 b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-BoldItalic.c414dad20c4e3020221c.woff2 new file mode 100644 index 00000000..642a2d44 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-BoldItalic.c414dad20c4e3020221c.woff2 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-Light.4be01e4a68be8bf590da.woff b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-Light.4be01e4a68be8bf590da.woff new file mode 100644 index 00000000..a9946092 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-Light.4be01e4a68be8bf590da.woff differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-Light.770b27ec05c2f97a1a27.woff2 b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-Light.770b27ec05c2f97a1a27.woff2 new file mode 100644 index 00000000..b3238fa2 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-Light.770b27ec05c2f97a1a27.woff2 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-LightItalic.39e68da05bf8b4a77aa2.woff b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-LightItalic.39e68da05bf8b4a77aa2.woff new file mode 100644 index 00000000..7cc63b7e Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-LightItalic.39e68da05bf8b4a77aa2.woff differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-LightItalic.d10a437db5d8e2a52b4a.woff2 b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-LightItalic.d10a437db5d8e2a52b4a.woff2 new file mode 100644 index 00000000..3f438f80 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-LightItalic.d10a437db5d8e2a52b4a.woff2 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-Regular.21b4caaaedc00594e7bd.woff2 b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-Regular.21b4caaaedc00594e7bd.woff2 new file mode 100644 index 00000000..46f89cfb Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-Regular.21b4caaaedc00594e7bd.woff2 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-Regular.98d953e74f174cf013b4.woff b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-Regular.98d953e74f174cf013b4.woff new file mode 100644 index 00000000..40c056ea Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-Regular.98d953e74f174cf013b4.woff differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-RegularItalic.9947360f79b09132fd21.woff b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-RegularItalic.9947360f79b09132fd21.woff new file mode 100644 index 00000000..ddc9c014 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-RegularItalic.9947360f79b09132fd21.woff differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-RegularItalic.9eabbc2e01a7e17bb57d.woff2 b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-RegularItalic.9eabbc2e01a7e17bb57d.woff2 new file mode 100644 index 00000000..08d7a518 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/Skycoin-RegularItalic.9eabbc2e01a7e17bb57d.woff2 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/bip39-word-list.json b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/bip39-word-list.json new file mode 100644 index 00000000..c4956547 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/bip39-word-list.json @@ -0,0 +1,2049 @@ +{ "list": ["abandon", +"ability", +"able", +"about", +"above", +"absent", +"absorb", +"abstract", +"absurd", +"abuse", +"access", +"accident", +"account", +"accuse", +"achieve", +"acid", +"acoustic", +"acquire", +"across", +"act", +"action", +"actor", +"actress", +"actual", +"adapt", +"add", +"addict", +"address", +"adjust", +"admit", +"adult", +"advance", +"advice", +"aerobic", +"affair", +"afford", +"afraid", +"again", +"age", +"agent", +"agree", +"ahead", +"aim", +"air", +"airport", +"aisle", +"alarm", +"album", +"alcohol", +"alert", +"alien", +"all", +"alley", +"allow", +"almost", +"alone", +"alpha", +"already", +"also", +"alter", +"always", +"amateur", +"amazing", +"among", +"amount", +"amused", +"analyst", +"anchor", +"ancient", +"anger", +"angle", +"angry", +"animal", +"ankle", +"announce", +"annual", +"another", +"answer", +"antenna", +"antique", +"anxiety", +"any", +"apart", +"apology", +"appear", +"apple", +"approve", +"april", +"arch", +"arctic", +"area", +"arena", +"argue", +"arm", +"armed", +"armor", +"army", +"around", +"arrange", +"arrest", +"arrive", +"arrow", +"art", +"artefact", +"artist", +"artwork", +"ask", +"aspect", +"assault", +"asset", +"assist", +"assume", +"asthma", +"athlete", +"atom", +"attack", +"attend", +"attitude", +"attract", +"auction", +"audit", +"august", +"aunt", +"author", +"auto", +"autumn", +"average", +"avocado", +"avoid", +"awake", +"aware", +"away", +"awesome", +"awful", +"awkward", +"axis", +"baby", +"bachelor", +"bacon", +"badge", +"bag", +"balance", +"balcony", +"ball", +"bamboo", +"banana", +"banner", +"bar", +"barely", +"bargain", +"barrel", +"base", +"basic", +"basket", +"battle", +"beach", +"bean", +"beauty", +"because", +"become", +"beef", +"before", +"begin", +"behave", +"behind", +"believe", +"below", +"belt", +"bench", +"benefit", +"best", +"betray", +"better", +"between", +"beyond", +"bicycle", +"bid", +"bike", +"bind", +"biology", +"bird", +"birth", +"bitter", +"black", +"blade", +"blame", +"blanket", +"blast", +"bleak", +"bless", +"blind", +"blood", +"blossom", +"blouse", +"blue", +"blur", +"blush", +"board", +"boat", +"body", +"boil", +"bomb", +"bone", +"bonus", +"book", +"boost", +"border", +"boring", +"borrow", +"boss", +"bottom", +"bounce", +"box", +"boy", +"bracket", +"brain", +"brand", +"brass", +"brave", +"bread", +"breeze", +"brick", +"bridge", +"brief", +"bright", +"bring", +"brisk", +"broccoli", +"broken", +"bronze", +"broom", +"brother", +"brown", +"brush", +"bubble", +"buddy", +"budget", +"buffalo", +"build", +"bulb", +"bulk", +"bullet", +"bundle", +"bunker", +"burden", +"burger", +"burst", +"bus", +"business", +"busy", +"butter", +"buyer", +"buzz", +"cabbage", +"cabin", +"cable", +"cactus", +"cage", +"cake", +"call", +"calm", +"camera", +"camp", +"can", +"canal", +"cancel", +"candy", +"cannon", +"canoe", +"canvas", +"canyon", +"capable", +"capital", +"captain", +"car", +"carbon", +"card", +"cargo", +"carpet", +"carry", +"cart", +"case", +"cash", +"casino", +"castle", +"casual", +"cat", +"catalog", +"catch", +"category", +"cattle", +"caught", +"cause", +"caution", +"cave", +"ceiling", +"celery", +"cement", +"census", +"century", +"cereal", +"certain", +"chair", +"chalk", +"champion", +"change", +"chaos", +"chapter", +"charge", +"chase", +"chat", +"cheap", +"check", +"cheese", +"chef", +"cherry", +"chest", +"chicken", +"chief", +"child", +"chimney", +"choice", +"choose", +"chronic", +"chuckle", +"chunk", +"churn", +"cigar", +"cinnamon", +"circle", +"citizen", +"city", +"civil", +"claim", +"clap", +"clarify", +"claw", +"clay", +"clean", +"clerk", +"clever", +"click", +"client", +"cliff", +"climb", +"clinic", +"clip", +"clock", +"clog", +"close", +"cloth", +"cloud", +"clown", +"club", +"clump", +"cluster", +"clutch", +"coach", +"coast", +"coconut", +"code", +"coffee", +"coil", +"coin", +"collect", +"color", +"column", +"combine", +"come", +"comfort", +"comic", +"common", +"company", +"concert", +"conduct", +"confirm", +"congress", +"connect", +"consider", +"control", +"convince", +"cook", +"cool", +"copper", +"copy", +"coral", +"core", +"corn", +"correct", +"cost", +"cotton", +"couch", +"country", +"couple", +"course", +"cousin", +"cover", +"coyote", +"crack", +"cradle", +"craft", +"cram", +"crane", +"crash", +"crater", +"crawl", +"crazy", +"cream", +"credit", +"creek", +"crew", +"cricket", +"crime", +"crisp", +"critic", +"crop", +"cross", +"crouch", +"crowd", +"crucial", +"cruel", +"cruise", +"crumble", +"crunch", +"crush", +"cry", +"crystal", +"cube", +"culture", +"cup", +"cupboard", +"curious", +"current", +"curtain", +"curve", +"cushion", +"custom", +"cute", +"cycle", +"dad", +"damage", +"damp", +"dance", +"danger", +"daring", +"dash", +"daughter", +"dawn", +"day", +"deal", +"debate", +"debris", +"decade", +"december", +"decide", +"decline", +"decorate", +"decrease", +"deer", +"defense", +"define", +"defy", +"degree", +"delay", +"deliver", +"demand", +"demise", +"denial", +"dentist", +"deny", +"depart", +"depend", +"deposit", +"depth", +"deputy", +"derive", +"describe", +"desert", +"design", +"desk", +"despair", +"destroy", +"detail", +"detect", +"develop", +"device", +"devote", +"diagram", +"dial", +"diamond", +"diary", +"dice", +"diesel", +"diet", +"differ", +"digital", +"dignity", +"dilemma", +"dinner", +"dinosaur", +"direct", +"dirt", +"disagree", +"discover", +"disease", +"dish", +"dismiss", +"disorder", +"display", +"distance", +"divert", +"divide", +"divorce", +"dizzy", +"doctor", +"document", +"dog", +"doll", +"dolphin", +"domain", +"donate", +"donkey", +"donor", +"door", +"dose", +"double", +"dove", +"draft", +"dragon", +"drama", +"drastic", +"draw", +"dream", +"dress", +"drift", +"drill", +"drink", +"drip", +"drive", +"drop", +"drum", +"dry", +"duck", +"dumb", +"dune", +"during", +"dust", +"dutch", +"duty", +"dwarf", +"dynamic", +"eager", +"eagle", +"early", +"earn", +"earth", +"easily", +"east", +"easy", +"echo", +"ecology", +"economy", +"edge", +"edit", +"educate", +"effort", +"egg", +"eight", +"either", +"elbow", +"elder", +"electric", +"elegant", +"element", +"elephant", +"elevator", +"elite", +"else", +"embark", +"embody", +"embrace", +"emerge", +"emotion", +"employ", +"empower", +"empty", +"enable", +"enact", +"end", +"endless", +"endorse", +"enemy", +"energy", +"enforce", +"engage", +"engine", +"enhance", +"enjoy", +"enlist", +"enough", +"enrich", +"enroll", +"ensure", +"enter", +"entire", +"entry", +"envelope", +"episode", +"equal", +"equip", +"era", +"erase", +"erode", +"erosion", +"error", +"erupt", +"escape", +"essay", +"essence", +"estate", +"eternal", +"ethics", +"evidence", +"evil", +"evoke", +"evolve", +"exact", +"example", +"excess", +"exchange", +"excite", +"exclude", +"excuse", +"execute", +"exercise", +"exhaust", +"exhibit", +"exile", +"exist", +"exit", +"exotic", +"expand", +"expect", +"expire", +"explain", +"expose", +"express", +"extend", +"extra", +"eye", +"eyebrow", +"fabric", +"face", +"faculty", +"fade", +"faint", +"faith", +"fall", +"false", +"fame", +"family", +"famous", +"fan", +"fancy", +"fantasy", +"farm", +"fashion", +"fat", +"fatal", +"father", +"fatigue", +"fault", +"favorite", +"feature", +"february", +"federal", +"fee", +"feed", +"feel", +"female", +"fence", +"festival", +"fetch", +"fever", +"few", +"fiber", +"fiction", +"field", +"figure", +"file", +"film", +"filter", +"final", +"find", +"fine", +"finger", +"finish", +"fire", +"firm", +"first", +"fiscal", +"fish", +"fit", +"fitness", +"fix", +"flag", +"flame", +"flash", +"flat", +"flavor", +"flee", +"flight", +"flip", +"float", +"flock", +"floor", +"flower", +"fluid", +"flush", +"fly", +"foam", +"focus", +"fog", +"foil", +"fold", +"follow", +"food", +"foot", +"force", +"forest", +"forget", +"fork", +"fortune", +"forum", +"forward", +"fossil", +"foster", +"found", +"fox", +"fragile", +"frame", +"frequent", +"fresh", +"friend", +"fringe", +"frog", +"front", +"frost", +"frown", +"frozen", +"fruit", +"fuel", +"fun", +"funny", +"furnace", +"fury", +"future", +"gadget", +"gain", +"galaxy", +"gallery", +"game", +"gap", +"garage", +"garbage", +"garden", +"garlic", +"garment", +"gas", +"gasp", +"gate", +"gather", +"gauge", +"gaze", +"general", +"genius", +"genre", +"gentle", +"genuine", +"gesture", +"ghost", +"giant", +"gift", +"giggle", +"ginger", +"giraffe", +"girl", +"give", +"glad", +"glance", +"glare", +"glass", +"glide", +"glimpse", +"globe", +"gloom", +"glory", +"glove", +"glow", +"glue", +"goat", +"goddess", +"gold", +"good", +"goose", +"gorilla", +"gospel", +"gossip", +"govern", +"gown", +"grab", +"grace", +"grain", +"grant", +"grape", +"grass", +"gravity", +"great", +"green", +"grid", +"grief", +"grit", +"grocery", +"group", +"grow", +"grunt", +"guard", +"guess", +"guide", +"guilt", +"guitar", +"gun", +"gym", +"habit", +"hair", +"half", +"hammer", +"hamster", +"hand", +"happy", +"harbor", +"hard", +"harsh", +"harvest", +"hat", +"have", +"hawk", +"hazard", +"head", +"health", +"heart", +"heavy", +"hedgehog", +"height", +"hello", +"helmet", +"help", +"hen", +"hero", +"hidden", +"high", +"hill", +"hint", +"hip", +"hire", +"history", +"hobby", +"hockey", +"hold", +"hole", +"holiday", +"hollow", +"home", +"honey", +"hood", +"hope", +"horn", +"horror", +"horse", +"hospital", +"host", +"hotel", +"hour", +"hover", +"hub", +"huge", +"human", +"humble", +"humor", +"hundred", +"hungry", +"hunt", +"hurdle", +"hurry", +"hurt", +"husband", +"hybrid", +"ice", +"icon", +"idea", +"identify", +"idle", +"ignore", +"ill", +"illegal", +"illness", +"image", +"imitate", +"immense", +"immune", +"impact", +"impose", +"improve", +"impulse", +"inch", +"include", +"income", +"increase", +"index", +"indicate", +"indoor", +"industry", +"infant", +"inflict", +"inform", +"inhale", +"inherit", +"initial", +"inject", +"injury", +"inmate", +"inner", +"innocent", +"input", +"inquiry", +"insane", +"insect", +"inside", +"inspire", +"install", +"intact", +"interest", +"into", +"invest", +"invite", +"involve", +"iron", +"island", +"isolate", +"issue", +"item", +"ivory", +"jacket", +"jaguar", +"jar", +"jazz", +"jealous", +"jeans", +"jelly", +"jewel", +"job", +"join", +"joke", +"journey", +"joy", +"judge", +"juice", +"jump", +"jungle", +"junior", +"junk", +"just", +"kangaroo", +"keen", +"keep", +"ketchup", +"key", +"kick", +"kid", +"kidney", +"kind", +"kingdom", +"kiss", +"kit", +"kitchen", +"kite", +"kitten", +"kiwi", +"knee", +"knife", +"knock", +"know", +"lab", +"label", +"labor", +"ladder", +"lady", +"lake", +"lamp", +"language", +"laptop", +"large", +"later", +"latin", +"laugh", +"laundry", +"lava", +"law", +"lawn", +"lawsuit", +"layer", +"lazy", +"leader", +"leaf", +"learn", +"leave", +"lecture", +"left", +"leg", +"legal", +"legend", +"leisure", +"lemon", +"lend", +"length", +"lens", +"leopard", +"lesson", +"letter", +"level", +"liar", +"liberty", +"library", +"license", +"life", +"lift", +"light", +"like", +"limb", +"limit", +"link", +"lion", +"liquid", +"list", +"little", +"live", +"lizard", +"load", +"loan", +"lobster", +"local", +"lock", +"logic", +"lonely", +"long", +"loop", +"lottery", +"loud", +"lounge", +"love", +"loyal", +"lucky", +"luggage", +"lumber", +"lunar", +"lunch", +"luxury", +"lyrics", +"machine", +"mad", +"magic", +"magnet", +"maid", +"mail", +"main", +"major", +"make", +"mammal", +"man", +"manage", +"mandate", +"mango", +"mansion", +"manual", +"maple", +"marble", +"march", +"margin", +"marine", +"market", +"marriage", +"mask", +"mass", +"master", +"match", +"material", +"math", +"matrix", +"matter", +"maximum", +"maze", +"meadow", +"mean", +"measure", +"meat", +"mechanic", +"medal", +"media", +"melody", +"melt", +"member", +"memory", +"mention", +"menu", +"mercy", +"merge", +"merit", +"merry", +"mesh", +"message", +"metal", +"method", +"middle", +"midnight", +"milk", +"million", +"mimic", +"mind", +"minimum", +"minor", +"minute", +"miracle", +"mirror", +"misery", +"miss", +"mistake", +"mix", +"mixed", +"mixture", +"mobile", +"model", +"modify", +"mom", +"moment", +"monitor", +"monkey", +"monster", +"month", +"moon", +"moral", +"more", +"morning", +"mosquito", +"mother", +"motion", +"motor", +"mountain", +"mouse", +"move", +"movie", +"much", +"muffin", +"mule", +"multiply", +"muscle", +"museum", +"mushroom", +"music", +"must", +"mutual", +"myself", +"mystery", +"myth", +"naive", +"name", +"napkin", +"narrow", +"nasty", +"nation", +"nature", +"near", +"neck", +"need", +"negative", +"neglect", +"neither", +"nephew", +"nerve", +"nest", +"net", +"network", +"neutral", +"never", +"news", +"next", +"nice", +"night", +"noble", +"noise", +"nominee", +"noodle", +"normal", +"north", +"nose", +"notable", +"note", +"nothing", +"notice", +"novel", +"now", +"nuclear", +"number", +"nurse", +"nut", +"oak", +"obey", +"object", +"oblige", +"obscure", +"observe", +"obtain", +"obvious", +"occur", +"ocean", +"october", +"odor", +"off", +"offer", +"office", +"often", +"oil", +"okay", +"old", +"olive", +"olympic", +"omit", +"once", +"one", +"onion", +"online", +"only", +"open", +"opera", +"opinion", +"oppose", +"option", +"orange", +"orbit", +"orchard", +"order", +"ordinary", +"organ", +"orient", +"original", +"orphan", +"ostrich", +"other", +"outdoor", +"outer", +"output", +"outside", +"oval", +"oven", +"over", +"own", +"owner", +"oxygen", +"oyster", +"ozone", +"pact", +"paddle", +"page", +"pair", +"palace", +"palm", +"panda", +"panel", +"panic", +"panther", +"paper", +"parade", +"parent", +"park", +"parrot", +"party", +"pass", +"patch", +"path", +"patient", +"patrol", +"pattern", +"pause", +"pave", +"payment", +"peace", +"peanut", +"pear", +"peasant", +"pelican", +"pen", +"penalty", +"pencil", +"people", +"pepper", +"perfect", +"permit", +"person", +"pet", +"phone", +"photo", +"phrase", +"physical", +"piano", +"picnic", +"picture", +"piece", +"pig", +"pigeon", +"pill", +"pilot", +"pink", +"pioneer", +"pipe", +"pistol", +"pitch", +"pizza", +"place", +"planet", +"plastic", +"plate", +"play", +"please", +"pledge", +"pluck", +"plug", +"plunge", +"poem", +"poet", +"point", +"polar", +"pole", +"police", +"pond", +"pony", +"pool", +"popular", +"portion", +"position", +"possible", +"post", +"potato", +"pottery", +"poverty", +"powder", +"power", +"practice", +"praise", +"predict", +"prefer", +"prepare", +"present", +"pretty", +"prevent", +"price", +"pride", +"primary", +"print", +"priority", +"prison", +"private", +"prize", +"problem", +"process", +"produce", +"profit", +"program", +"project", +"promote", +"proof", +"property", +"prosper", +"protect", +"proud", +"provide", +"public", +"pudding", +"pull", +"pulp", +"pulse", +"pumpkin", +"punch", +"pupil", +"puppy", +"purchase", +"purity", +"purpose", +"purse", +"push", +"put", +"puzzle", +"pyramid", +"quality", +"quantum", +"quarter", +"question", +"quick", +"quit", +"quiz", +"quote", +"rabbit", +"raccoon", +"race", +"rack", +"radar", +"radio", +"rail", +"rain", +"raise", +"rally", +"ramp", +"ranch", +"random", +"range", +"rapid", +"rare", +"rate", +"rather", +"raven", +"raw", +"razor", +"ready", +"real", +"reason", +"rebel", +"rebuild", +"recall", +"receive", +"recipe", +"record", +"recycle", +"reduce", +"reflect", +"reform", +"refuse", +"region", +"regret", +"regular", +"reject", +"relax", +"release", +"relief", +"rely", +"remain", +"remember", +"remind", +"remove", +"render", +"renew", +"rent", +"reopen", +"repair", +"repeat", +"replace", +"report", +"require", +"rescue", +"resemble", +"resist", +"resource", +"response", +"result", +"retire", +"retreat", +"return", +"reunion", +"reveal", +"review", +"reward", +"rhythm", +"rib", +"ribbon", +"rice", +"rich", +"ride", +"ridge", +"rifle", +"right", +"rigid", +"ring", +"riot", +"ripple", +"risk", +"ritual", +"rival", +"river", +"road", +"roast", +"robot", +"robust", +"rocket", +"romance", +"roof", +"rookie", +"room", +"rose", +"rotate", +"rough", +"round", +"route", +"royal", +"rubber", +"rude", +"rug", +"rule", +"run", +"runway", +"rural", +"sad", +"saddle", +"sadness", +"safe", +"sail", +"salad", +"salmon", +"salon", +"salt", +"salute", +"same", +"sample", +"sand", +"satisfy", +"satoshi", +"sauce", +"sausage", +"save", +"say", +"scale", +"scan", +"scare", +"scatter", +"scene", +"scheme", +"school", +"science", +"scissors", +"scorpion", +"scout", +"scrap", +"screen", +"script", +"scrub", +"sea", +"search", +"season", +"seat", +"second", +"secret", +"section", +"security", +"seed", +"seek", +"segment", +"select", +"sell", +"seminar", +"senior", +"sense", +"sentence", +"series", +"service", +"session", +"settle", +"setup", +"seven", +"shadow", +"shaft", +"shallow", +"share", +"shed", +"shell", +"sheriff", +"shield", +"shift", +"shine", +"ship", +"shiver", +"shock", +"shoe", +"shoot", +"shop", +"short", +"shoulder", +"shove", +"shrimp", +"shrug", +"shuffle", +"shy", +"sibling", +"sick", +"side", +"siege", +"sight", +"sign", +"silent", +"silk", +"silly", +"silver", +"similar", +"simple", +"since", +"sing", +"siren", +"sister", +"situate", +"six", +"size", +"skate", +"sketch", +"ski", +"skill", +"skin", +"skirt", +"skull", +"slab", +"slam", +"sleep", +"slender", +"slice", +"slide", +"slight", +"slim", +"slogan", +"slot", +"slow", +"slush", +"small", +"smart", +"smile", +"smoke", +"smooth", +"snack", +"snake", +"snap", +"sniff", +"snow", +"soap", +"soccer", +"social", +"sock", +"soda", +"soft", +"solar", +"soldier", +"solid", +"solution", +"solve", +"someone", +"song", +"soon", +"sorry", +"sort", +"soul", +"sound", +"soup", +"source", +"south", +"space", +"spare", +"spatial", +"spawn", +"speak", +"special", +"speed", +"spell", +"spend", +"sphere", +"spice", +"spider", +"spike", +"spin", +"spirit", +"split", +"spoil", +"sponsor", +"spoon", +"sport", +"spot", +"spray", +"spread", +"spring", +"spy", +"square", +"squeeze", +"squirrel", +"stable", +"stadium", +"staff", +"stage", +"stairs", +"stamp", +"stand", +"start", +"state", +"stay", +"steak", +"steel", +"stem", +"step", +"stereo", +"stick", +"still", +"sting", +"stock", +"stomach", +"stone", +"stool", +"story", +"stove", +"strategy", +"street", +"strike", +"strong", +"struggle", +"student", +"stuff", +"stumble", +"style", +"subject", +"submit", +"subway", +"success", +"such", +"sudden", +"suffer", +"sugar", +"suggest", +"suit", +"summer", +"sun", +"sunny", +"sunset", +"super", +"supply", +"supreme", +"sure", +"surface", +"surge", +"surprise", +"surround", +"survey", +"suspect", +"sustain", +"swallow", +"swamp", +"swap", +"swarm", +"swear", +"sweet", +"swift", +"swim", +"swing", +"switch", +"sword", +"symbol", +"symptom", +"syrup", +"system", +"table", +"tackle", +"tag", +"tail", +"talent", +"talk", +"tank", +"tape", +"target", +"task", +"taste", +"tattoo", +"taxi", +"teach", +"team", +"tell", +"ten", +"tenant", +"tennis", +"tent", +"term", +"test", +"text", +"thank", +"that", +"theme", +"then", +"theory", +"there", +"they", +"thing", +"this", +"thought", +"three", +"thrive", +"throw", +"thumb", +"thunder", +"ticket", +"tide", +"tiger", +"tilt", +"timber", +"time", +"tiny", +"tip", +"tired", +"tissue", +"title", +"toast", +"tobacco", +"today", +"toddler", +"toe", +"together", +"toilet", +"token", +"tomato", +"tomorrow", +"tone", +"tongue", +"tonight", +"tool", +"tooth", +"top", +"topic", +"topple", +"torch", +"tornado", +"tortoise", +"toss", +"total", +"tourist", +"toward", +"tower", +"town", +"toy", +"track", +"trade", +"traffic", +"tragic", +"train", +"transfer", +"trap", +"trash", +"travel", +"tray", +"treat", +"tree", +"trend", +"trial", +"tribe", +"trick", +"trigger", +"trim", +"trip", +"trophy", +"trouble", +"truck", +"true", +"truly", +"trumpet", +"trust", +"truth", +"try", +"tube", +"tuition", +"tumble", +"tuna", +"tunnel", +"turkey", +"turn", +"turtle", +"twelve", +"twenty", +"twice", +"twin", +"twist", +"two", +"type", +"typical", +"ugly", +"umbrella", +"unable", +"unaware", +"uncle", +"uncover", +"under", +"undo", +"unfair", +"unfold", +"unhappy", +"uniform", +"unique", +"unit", +"universe", +"unknown", +"unlock", +"until", +"unusual", +"unveil", +"update", +"upgrade", +"uphold", +"upon", +"upper", +"upset", +"urban", +"urge", +"usage", +"use", +"used", +"useful", +"useless", +"usual", +"utility", +"vacant", +"vacuum", +"vague", +"valid", +"valley", +"valve", +"van", +"vanish", +"vapor", +"various", +"vast", +"vault", +"vehicle", +"velvet", +"vendor", +"venture", +"venue", +"verb", +"verify", +"version", +"very", +"vessel", +"veteran", +"viable", +"vibrant", +"vicious", +"victory", +"video", +"view", +"village", +"vintage", +"violin", +"virtual", +"virus", +"visa", +"visit", +"visual", +"vital", +"vivid", +"vocal", +"voice", +"void", +"volcano", +"volume", +"vote", +"voyage", +"wage", +"wagon", +"wait", +"walk", +"wall", +"walnut", +"want", +"warfare", +"warm", +"warrior", +"wash", +"wasp", +"waste", +"water", +"wave", +"way", +"wealth", +"weapon", +"wear", +"weasel", +"weather", +"web", +"wedding", +"weekend", +"weird", +"welcome", +"west", +"wet", +"whale", +"what", +"wheat", +"wheel", +"when", +"where", +"whip", +"whisper", +"wide", +"width", +"wife", +"wild", +"will", +"win", +"window", +"wine", +"wing", +"wink", +"winner", +"winter", +"wire", +"wisdom", +"wise", +"wish", +"witness", +"wolf", +"woman", +"wonder", +"wood", +"wool", +"word", +"work", +"world", +"worry", +"worth", +"wrap", +"wreck", +"wrestle", +"wrist", +"write", +"wrong", +"yard", +"year", +"yellow", +"you", +"young", +"youth", +"zebra", +"zero", +"zone", +"zoo"] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/error-alert/big-error-icon.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/error-alert/big-error-icon.png new file mode 100644 index 00000000..bcbda0c2 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/error-alert/big-error-icon.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/error-alert/index.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/error-alert/index.html new file mode 100644 index 00000000..29d9dc9f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/error-alert/index.html @@ -0,0 +1,89 @@ + + + + + + + + +
+
+ +
+
+
+
+ + + + diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.eot b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.eot new file mode 100644 index 00000000..70508eba Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.eot differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.ijmap b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.ijmap new file mode 100644 index 00000000..d9f1d259 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.ijmap @@ -0,0 +1 @@ +{"icons":{"e84d":{"name":"3d Rotation"},"eb3b":{"name":"Ac Unit"},"e190":{"name":"Access Alarm"},"e191":{"name":"Access Alarms"},"e192":{"name":"Access Time"},"e84e":{"name":"Accessibility"},"e914":{"name":"Accessible"},"e84f":{"name":"Account Balance"},"e850":{"name":"Account Balance Wallet"},"e851":{"name":"Account Box"},"e853":{"name":"Account Circle"},"e60e":{"name":"Adb"},"e145":{"name":"Add"},"e439":{"name":"Add A Photo"},"e193":{"name":"Add Alarm"},"e003":{"name":"Add Alert"},"e146":{"name":"Add Box"},"e147":{"name":"Add Circle"},"e148":{"name":"Add Circle Outline"},"e567":{"name":"Add Location"},"e854":{"name":"Add Shopping Cart"},"e39d":{"name":"Add To Photos"},"e05c":{"name":"Add To Queue"},"e39e":{"name":"Adjust"},"e630":{"name":"Airline Seat Flat"},"e631":{"name":"Airline Seat Flat Angled"},"e632":{"name":"Airline Seat Individual Suite"},"e633":{"name":"Airline Seat Legroom Extra"},"e634":{"name":"Airline Seat Legroom Normal"},"e635":{"name":"Airline Seat Legroom Reduced"},"e636":{"name":"Airline Seat Recline Extra"},"e637":{"name":"Airline Seat Recline Normal"},"e195":{"name":"Airplanemode Active"},"e194":{"name":"Airplanemode Inactive"},"e055":{"name":"Airplay"},"eb3c":{"name":"Airport Shuttle"},"e855":{"name":"Alarm"},"e856":{"name":"Alarm Add"},"e857":{"name":"Alarm Off"},"e858":{"name":"Alarm On"},"e019":{"name":"Album"},"eb3d":{"name":"All Inclusive"},"e90b":{"name":"All Out"},"e859":{"name":"Android"},"e85a":{"name":"Announcement"},"e5c3":{"name":"Apps"},"e149":{"name":"Archive"},"e5c4":{"name":"Arrow Back"},"e5db":{"name":"Arrow Downward"},"e5c5":{"name":"Arrow Drop Down"},"e5c6":{"name":"Arrow Drop Down Circle"},"e5c7":{"name":"Arrow Drop Up"},"e5c8":{"name":"Arrow Forward"},"e5d8":{"name":"Arrow Upward"},"e060":{"name":"Art Track"},"e85b":{"name":"Aspect Ratio"},"e85c":{"name":"Assessment"},"e85d":{"name":"Assignment"},"e85e":{"name":"Assignment Ind"},"e85f":{"name":"Assignment Late"},"e860":{"name":"Assignment Return"},"e861":{"name":"Assignment Returned"},"e862":{"name":"Assignment Turned In"},"e39f":{"name":"Assistant"},"e3a0":{"name":"Assistant Photo"},"e226":{"name":"Attach File"},"e227":{"name":"Attach Money"},"e2bc":{"name":"Attachment"},"e3a1":{"name":"Audiotrack"},"e863":{"name":"Autorenew"},"e01b":{"name":"Av Timer"},"e14a":{"name":"Backspace"},"e864":{"name":"Backup"},"e19c":{"name":"Battery Alert"},"e1a3":{"name":"Battery Charging Full"},"e1a4":{"name":"Battery Full"},"e1a5":{"name":"Battery Std"},"e1a6":{"name":"Battery Unknown"},"eb3e":{"name":"Beach Access"},"e52d":{"name":"Beenhere"},"e14b":{"name":"Block"},"e1a7":{"name":"Bluetooth"},"e60f":{"name":"Bluetooth Audio"},"e1a8":{"name":"Bluetooth Connected"},"e1a9":{"name":"Bluetooth Disabled"},"e1aa":{"name":"Bluetooth Searching"},"e3a2":{"name":"Blur Circular"},"e3a3":{"name":"Blur Linear"},"e3a4":{"name":"Blur Off"},"e3a5":{"name":"Blur On"},"e865":{"name":"Book"},"e866":{"name":"Bookmark"},"e867":{"name":"Bookmark Border"},"e228":{"name":"Border All"},"e229":{"name":"Border Bottom"},"e22a":{"name":"Border Clear"},"e22b":{"name":"Border Color"},"e22c":{"name":"Border Horizontal"},"e22d":{"name":"Border Inner"},"e22e":{"name":"Border Left"},"e22f":{"name":"Border Outer"},"e230":{"name":"Border Right"},"e231":{"name":"Border Style"},"e232":{"name":"Border Top"},"e233":{"name":"Border Vertical"},"e06b":{"name":"Branding Watermark"},"e3a6":{"name":"Brightness 1"},"e3a7":{"name":"Brightness 2"},"e3a8":{"name":"Brightness 3"},"e3a9":{"name":"Brightness 4"},"e3aa":{"name":"Brightness 5"},"e3ab":{"name":"Brightness 6"},"e3ac":{"name":"Brightness 7"},"e1ab":{"name":"Brightness Auto"},"e1ac":{"name":"Brightness High"},"e1ad":{"name":"Brightness Low"},"e1ae":{"name":"Brightness Medium"},"e3ad":{"name":"Broken Image"},"e3ae":{"name":"Brush"},"e6dd":{"name":"Bubble Chart"},"e868":{"name":"Bug Report"},"e869":{"name":"Build"},"e43c":{"name":"Burst Mode"},"e0af":{"name":"Business"},"eb3f":{"name":"Business Center"},"e86a":{"name":"Cached"},"e7e9":{"name":"Cake"},"e0b0":{"name":"Call"},"e0b1":{"name":"Call End"},"e0b2":{"name":"Call Made"},"e0b3":{"name":"Call Merge"},"e0b4":{"name":"Call Missed"},"e0e4":{"name":"Call Missed Outgoing"},"e0b5":{"name":"Call Received"},"e0b6":{"name":"Call Split"},"e06c":{"name":"Call To Action"},"e3af":{"name":"Camera"},"e3b0":{"name":"Camera Alt"},"e8fc":{"name":"Camera Enhance"},"e3b1":{"name":"Camera Front"},"e3b2":{"name":"Camera Rear"},"e3b3":{"name":"Camera Roll"},"e5c9":{"name":"Cancel"},"e8f6":{"name":"Card Giftcard"},"e8f7":{"name":"Card Membership"},"e8f8":{"name":"Card Travel"},"eb40":{"name":"Casino"},"e307":{"name":"Cast"},"e308":{"name":"Cast Connected"},"e3b4":{"name":"Center Focus Strong"},"e3b5":{"name":"Center Focus Weak"},"e86b":{"name":"Change History"},"e0b7":{"name":"Chat"},"e0ca":{"name":"Chat Bubble"},"e0cb":{"name":"Chat Bubble Outline"},"e5ca":{"name":"Check"},"e834":{"name":"Check Box"},"e835":{"name":"Check Box Outline Blank"},"e86c":{"name":"Check Circle"},"e5cb":{"name":"Chevron Left"},"e5cc":{"name":"Chevron Right"},"eb41":{"name":"Child Care"},"eb42":{"name":"Child Friendly"},"e86d":{"name":"Chrome Reader Mode"},"e86e":{"name":"Class"},"e14c":{"name":"Clear"},"e0b8":{"name":"Clear All"},"e5cd":{"name":"Close"},"e01c":{"name":"Closed Caption"},"e2bd":{"name":"Cloud"},"e2be":{"name":"Cloud Circle"},"e2bf":{"name":"Cloud Done"},"e2c0":{"name":"Cloud Download"},"e2c1":{"name":"Cloud Off"},"e2c2":{"name":"Cloud Queue"},"e2c3":{"name":"Cloud Upload"},"e86f":{"name":"Code"},"e3b6":{"name":"Collections"},"e431":{"name":"Collections Bookmark"},"e3b7":{"name":"Color Lens"},"e3b8":{"name":"Colorize"},"e0b9":{"name":"Comment"},"e3b9":{"name":"Compare"},"e915":{"name":"Compare Arrows"},"e30a":{"name":"Computer"},"e638":{"name":"Confirmation Number"},"e0d0":{"name":"Contact Mail"},"e0cf":{"name":"Contact Phone"},"e0ba":{"name":"Contacts"},"e14d":{"name":"Content Copy"},"e14e":{"name":"Content Cut"},"e14f":{"name":"Content Paste"},"e3ba":{"name":"Control Point"},"e3bb":{"name":"Control Point Duplicate"},"e90c":{"name":"Copyright"},"e150":{"name":"Create"},"e2cc":{"name":"Create New Folder"},"e870":{"name":"Credit Card"},"e3be":{"name":"Crop"},"e3bc":{"name":"Crop 16 9"},"e3bd":{"name":"Crop 3 2"},"e3bf":{"name":"Crop 5 4"},"e3c0":{"name":"Crop 7 5"},"e3c1":{"name":"Crop Din"},"e3c2":{"name":"Crop Free"},"e3c3":{"name":"Crop Landscape"},"e3c4":{"name":"Crop Original"},"e3c5":{"name":"Crop Portrait"},"e437":{"name":"Crop Rotate"},"e3c6":{"name":"Crop Square"},"e871":{"name":"Dashboard"},"e1af":{"name":"Data Usage"},"e916":{"name":"Date Range"},"e3c7":{"name":"Dehaze"},"e872":{"name":"Delete"},"e92b":{"name":"Delete Forever"},"e16c":{"name":"Delete Sweep"},"e873":{"name":"Description"},"e30b":{"name":"Desktop Mac"},"e30c":{"name":"Desktop Windows"},"e3c8":{"name":"Details"},"e30d":{"name":"Developer Board"},"e1b0":{"name":"Developer Mode"},"e335":{"name":"Device Hub"},"e1b1":{"name":"Devices"},"e337":{"name":"Devices Other"},"e0bb":{"name":"Dialer Sip"},"e0bc":{"name":"Dialpad"},"e52e":{"name":"Directions"},"e52f":{"name":"Directions Bike"},"e532":{"name":"Directions Boat"},"e530":{"name":"Directions Bus"},"e531":{"name":"Directions Car"},"e534":{"name":"Directions Railway"},"e566":{"name":"Directions Run"},"e533":{"name":"Directions Subway"},"e535":{"name":"Directions Transit"},"e536":{"name":"Directions Walk"},"e610":{"name":"Disc Full"},"e875":{"name":"Dns"},"e612":{"name":"Do Not Disturb"},"e611":{"name":"Do Not Disturb Alt"},"e643":{"name":"Do Not Disturb Off"},"e644":{"name":"Do Not Disturb On"},"e30e":{"name":"Dock"},"e7ee":{"name":"Domain"},"e876":{"name":"Done"},"e877":{"name":"Done All"},"e917":{"name":"Donut Large"},"e918":{"name":"Donut Small"},"e151":{"name":"Drafts"},"e25d":{"name":"Drag Handle"},"e613":{"name":"Drive Eta"},"e1b2":{"name":"Dvr"},"e3c9":{"name":"Edit"},"e568":{"name":"Edit Location"},"e8fb":{"name":"Eject"},"e0be":{"name":"Email"},"e63f":{"name":"Enhanced Encryption"},"e01d":{"name":"Equalizer"},"e000":{"name":"Error"},"e001":{"name":"Error Outline"},"e926":{"name":"Euro Symbol"},"e56d":{"name":"Ev Station"},"e878":{"name":"Event"},"e614":{"name":"Event Available"},"e615":{"name":"Event Busy"},"e616":{"name":"Event Note"},"e903":{"name":"Event Seat"},"e879":{"name":"Exit To App"},"e5ce":{"name":"Expand Less"},"e5cf":{"name":"Expand More"},"e01e":{"name":"Explicit"},"e87a":{"name":"Explore"},"e3ca":{"name":"Exposure"},"e3cb":{"name":"Exposure Neg 1"},"e3cc":{"name":"Exposure Neg 2"},"e3cd":{"name":"Exposure Plus 1"},"e3ce":{"name":"Exposure Plus 2"},"e3cf":{"name":"Exposure Zero"},"e87b":{"name":"Extension"},"e87c":{"name":"Face"},"e01f":{"name":"Fast Forward"},"e020":{"name":"Fast Rewind"},"e87d":{"name":"Favorite"},"e87e":{"name":"Favorite Border"},"e06d":{"name":"Featured Play List"},"e06e":{"name":"Featured Video"},"e87f":{"name":"Feedback"},"e05d":{"name":"Fiber Dvr"},"e061":{"name":"Fiber Manual Record"},"e05e":{"name":"Fiber New"},"e06a":{"name":"Fiber Pin"},"e062":{"name":"Fiber Smart Record"},"e2c4":{"name":"File Download"},"e2c6":{"name":"File Upload"},"e3d3":{"name":"Filter"},"e3d0":{"name":"Filter 1"},"e3d1":{"name":"Filter 2"},"e3d2":{"name":"Filter 3"},"e3d4":{"name":"Filter 4"},"e3d5":{"name":"Filter 5"},"e3d6":{"name":"Filter 6"},"e3d7":{"name":"Filter 7"},"e3d8":{"name":"Filter 8"},"e3d9":{"name":"Filter 9"},"e3da":{"name":"Filter 9 Plus"},"e3db":{"name":"Filter B And W"},"e3dc":{"name":"Filter Center Focus"},"e3dd":{"name":"Filter Drama"},"e3de":{"name":"Filter Frames"},"e3df":{"name":"Filter Hdr"},"e152":{"name":"Filter List"},"e3e0":{"name":"Filter None"},"e3e2":{"name":"Filter Tilt Shift"},"e3e3":{"name":"Filter Vintage"},"e880":{"name":"Find In Page"},"e881":{"name":"Find Replace"},"e90d":{"name":"Fingerprint"},"e5dc":{"name":"First Page"},"eb43":{"name":"Fitness Center"},"e153":{"name":"Flag"},"e3e4":{"name":"Flare"},"e3e5":{"name":"Flash Auto"},"e3e6":{"name":"Flash Off"},"e3e7":{"name":"Flash On"},"e539":{"name":"Flight"},"e904":{"name":"Flight Land"},"e905":{"name":"Flight Takeoff"},"e3e8":{"name":"Flip"},"e882":{"name":"Flip To Back"},"e883":{"name":"Flip To Front"},"e2c7":{"name":"Folder"},"e2c8":{"name":"Folder Open"},"e2c9":{"name":"Folder Shared"},"e617":{"name":"Folder Special"},"e167":{"name":"Font Download"},"e234":{"name":"Format Align Center"},"e235":{"name":"Format Align Justify"},"e236":{"name":"Format Align Left"},"e237":{"name":"Format Align Right"},"e238":{"name":"Format Bold"},"e239":{"name":"Format Clear"},"e23a":{"name":"Format Color Fill"},"e23b":{"name":"Format Color Reset"},"e23c":{"name":"Format Color Text"},"e23d":{"name":"Format Indent Decrease"},"e23e":{"name":"Format Indent Increase"},"e23f":{"name":"Format Italic"},"e240":{"name":"Format Line Spacing"},"e241":{"name":"Format List Bulleted"},"e242":{"name":"Format List Numbered"},"e243":{"name":"Format Paint"},"e244":{"name":"Format Quote"},"e25e":{"name":"Format Shapes"},"e245":{"name":"Format Size"},"e246":{"name":"Format Strikethrough"},"e247":{"name":"Format Textdirection L To R"},"e248":{"name":"Format Textdirection R To L"},"e249":{"name":"Format Underlined"},"e0bf":{"name":"Forum"},"e154":{"name":"Forward"},"e056":{"name":"Forward 10"},"e057":{"name":"Forward 30"},"e058":{"name":"Forward 5"},"eb44":{"name":"Free Breakfast"},"e5d0":{"name":"Fullscreen"},"e5d1":{"name":"Fullscreen Exit"},"e24a":{"name":"Functions"},"e927":{"name":"G Translate"},"e30f":{"name":"Gamepad"},"e021":{"name":"Games"},"e90e":{"name":"Gavel"},"e155":{"name":"Gesture"},"e884":{"name":"Get App"},"e908":{"name":"Gif"},"eb45":{"name":"Golf Course"},"e1b3":{"name":"Gps Fixed"},"e1b4":{"name":"Gps Not Fixed"},"e1b5":{"name":"Gps Off"},"e885":{"name":"Grade"},"e3e9":{"name":"Gradient"},"e3ea":{"name":"Grain"},"e1b8":{"name":"Graphic Eq"},"e3eb":{"name":"Grid Off"},"e3ec":{"name":"Grid On"},"e7ef":{"name":"Group"},"e7f0":{"name":"Group Add"},"e886":{"name":"Group Work"},"e052":{"name":"Hd"},"e3ed":{"name":"Hdr Off"},"e3ee":{"name":"Hdr On"},"e3f1":{"name":"Hdr Strong"},"e3f2":{"name":"Hdr Weak"},"e310":{"name":"Headset"},"e311":{"name":"Headset Mic"},"e3f3":{"name":"Healing"},"e023":{"name":"Hearing"},"e887":{"name":"Help"},"e8fd":{"name":"Help Outline"},"e024":{"name":"High Quality"},"e25f":{"name":"Highlight"},"e888":{"name":"Highlight Off"},"e889":{"name":"History"},"e88a":{"name":"Home"},"eb46":{"name":"Hot Tub"},"e53a":{"name":"Hotel"},"e88b":{"name":"Hourglass Empty"},"e88c":{"name":"Hourglass Full"},"e902":{"name":"Http"},"e88d":{"name":"Https"},"e3f4":{"name":"Image"},"e3f5":{"name":"Image Aspect Ratio"},"e0e0":{"name":"Import Contacts"},"e0c3":{"name":"Import Export"},"e912":{"name":"Important Devices"},"e156":{"name":"Inbox"},"e909":{"name":"Indeterminate Check Box"},"e88e":{"name":"Info"},"e88f":{"name":"Info Outline"},"e890":{"name":"Input"},"e24b":{"name":"Insert Chart"},"e24c":{"name":"Insert Comment"},"e24d":{"name":"Insert Drive File"},"e24e":{"name":"Insert Emoticon"},"e24f":{"name":"Insert Invitation"},"e250":{"name":"Insert Link"},"e251":{"name":"Insert Photo"},"e891":{"name":"Invert Colors"},"e0c4":{"name":"Invert Colors Off"},"e3f6":{"name":"Iso"},"e312":{"name":"Keyboard"},"e313":{"name":"Keyboard Arrow Down"},"e314":{"name":"Keyboard Arrow Left"},"e315":{"name":"Keyboard Arrow Right"},"e316":{"name":"Keyboard Arrow Up"},"e317":{"name":"Keyboard Backspace"},"e318":{"name":"Keyboard Capslock"},"e31a":{"name":"Keyboard Hide"},"e31b":{"name":"Keyboard Return"},"e31c":{"name":"Keyboard Tab"},"e31d":{"name":"Keyboard Voice"},"eb47":{"name":"Kitchen"},"e892":{"name":"Label"},"e893":{"name":"Label Outline"},"e3f7":{"name":"Landscape"},"e894":{"name":"Language"},"e31e":{"name":"Laptop"},"e31f":{"name":"Laptop Chromebook"},"e320":{"name":"Laptop Mac"},"e321":{"name":"Laptop Windows"},"e5dd":{"name":"Last Page"},"e895":{"name":"Launch"},"e53b":{"name":"Layers"},"e53c":{"name":"Layers Clear"},"e3f8":{"name":"Leak Add"},"e3f9":{"name":"Leak Remove"},"e3fa":{"name":"Lens"},"e02e":{"name":"Library Add"},"e02f":{"name":"Library Books"},"e030":{"name":"Library Music"},"e90f":{"name":"Lightbulb Outline"},"e919":{"name":"Line Style"},"e91a":{"name":"Line Weight"},"e260":{"name":"Linear Scale"},"e157":{"name":"Link"},"e438":{"name":"Linked Camera"},"e896":{"name":"List"},"e0c6":{"name":"Live Help"},"e639":{"name":"Live Tv"},"e53f":{"name":"Local Activity"},"e53d":{"name":"Local Airport"},"e53e":{"name":"Local Atm"},"e540":{"name":"Local Bar"},"e541":{"name":"Local Cafe"},"e542":{"name":"Local Car Wash"},"e543":{"name":"Local Convenience Store"},"e556":{"name":"Local Dining"},"e544":{"name":"Local Drink"},"e545":{"name":"Local Florist"},"e546":{"name":"Local Gas Station"},"e547":{"name":"Local Grocery Store"},"e548":{"name":"Local Hospital"},"e549":{"name":"Local Hotel"},"e54a":{"name":"Local Laundry Service"},"e54b":{"name":"Local Library"},"e54c":{"name":"Local Mall"},"e54d":{"name":"Local Movies"},"e54e":{"name":"Local Offer"},"e54f":{"name":"Local Parking"},"e550":{"name":"Local Pharmacy"},"e551":{"name":"Local Phone"},"e552":{"name":"Local Pizza"},"e553":{"name":"Local Play"},"e554":{"name":"Local Post Office"},"e555":{"name":"Local Printshop"},"e557":{"name":"Local See"},"e558":{"name":"Local Shipping"},"e559":{"name":"Local Taxi"},"e7f1":{"name":"Location City"},"e1b6":{"name":"Location Disabled"},"e0c7":{"name":"Location Off"},"e0c8":{"name":"Location On"},"e1b7":{"name":"Location Searching"},"e897":{"name":"Lock"},"e898":{"name":"Lock Open"},"e899":{"name":"Lock Outline"},"e3fc":{"name":"Looks"},"e3fb":{"name":"Looks 3"},"e3fd":{"name":"Looks 4"},"e3fe":{"name":"Looks 5"},"e3ff":{"name":"Looks 6"},"e400":{"name":"Looks One"},"e401":{"name":"Looks Two"},"e028":{"name":"Loop"},"e402":{"name":"Loupe"},"e16d":{"name":"Low Priority"},"e89a":{"name":"Loyalty"},"e158":{"name":"Mail"},"e0e1":{"name":"Mail Outline"},"e55b":{"name":"Map"},"e159":{"name":"Markunread"},"e89b":{"name":"Markunread Mailbox"},"e322":{"name":"Memory"},"e5d2":{"name":"Menu"},"e252":{"name":"Merge Type"},"e0c9":{"name":"Message"},"e029":{"name":"Mic"},"e02a":{"name":"Mic None"},"e02b":{"name":"Mic Off"},"e618":{"name":"Mms"},"e253":{"name":"Mode Comment"},"e254":{"name":"Mode Edit"},"e263":{"name":"Monetization On"},"e25c":{"name":"Money Off"},"e403":{"name":"Monochrome Photos"},"e7f2":{"name":"Mood"},"e7f3":{"name":"Mood Bad"},"e619":{"name":"More"},"e5d3":{"name":"More Horiz"},"e5d4":{"name":"More Vert"},"e91b":{"name":"Motorcycle"},"e323":{"name":"Mouse"},"e168":{"name":"Move To Inbox"},"e02c":{"name":"Movie"},"e404":{"name":"Movie Creation"},"e43a":{"name":"Movie Filter"},"e6df":{"name":"Multiline Chart"},"e405":{"name":"Music Note"},"e063":{"name":"Music Video"},"e55c":{"name":"My Location"},"e406":{"name":"Nature"},"e407":{"name":"Nature People"},"e408":{"name":"Navigate Before"},"e409":{"name":"Navigate Next"},"e55d":{"name":"Navigation"},"e569":{"name":"Near Me"},"e1b9":{"name":"Network Cell"},"e640":{"name":"Network Check"},"e61a":{"name":"Network Locked"},"e1ba":{"name":"Network Wifi"},"e031":{"name":"New Releases"},"e16a":{"name":"Next Week"},"e1bb":{"name":"Nfc"},"e641":{"name":"No Encryption"},"e0cc":{"name":"No Sim"},"e033":{"name":"Not Interested"},"e06f":{"name":"Note"},"e89c":{"name":"Note Add"},"e7f4":{"name":"Notifications"},"e7f7":{"name":"Notifications Active"},"e7f5":{"name":"Notifications None"},"e7f6":{"name":"Notifications Off"},"e7f8":{"name":"Notifications Paused"},"e90a":{"name":"Offline Pin"},"e63a":{"name":"Ondemand Video"},"e91c":{"name":"Opacity"},"e89d":{"name":"Open In Browser"},"e89e":{"name":"Open In New"},"e89f":{"name":"Open With"},"e7f9":{"name":"Pages"},"e8a0":{"name":"Pageview"},"e40a":{"name":"Palette"},"e925":{"name":"Pan Tool"},"e40b":{"name":"Panorama"},"e40c":{"name":"Panorama Fish Eye"},"e40d":{"name":"Panorama Horizontal"},"e40e":{"name":"Panorama Vertical"},"e40f":{"name":"Panorama Wide Angle"},"e7fa":{"name":"Party Mode"},"e034":{"name":"Pause"},"e035":{"name":"Pause Circle Filled"},"e036":{"name":"Pause Circle Outline"},"e8a1":{"name":"Payment"},"e7fb":{"name":"People"},"e7fc":{"name":"People Outline"},"e8a2":{"name":"Perm Camera Mic"},"e8a3":{"name":"Perm Contact Calendar"},"e8a4":{"name":"Perm Data Setting"},"e8a5":{"name":"Perm Device Information"},"e8a6":{"name":"Perm Identity"},"e8a7":{"name":"Perm Media"},"e8a8":{"name":"Perm Phone Msg"},"e8a9":{"name":"Perm Scan Wifi"},"e7fd":{"name":"Person"},"e7fe":{"name":"Person Add"},"e7ff":{"name":"Person Outline"},"e55a":{"name":"Person Pin"},"e56a":{"name":"Person Pin Circle"},"e63b":{"name":"Personal Video"},"e91d":{"name":"Pets"},"e0cd":{"name":"Phone"},"e324":{"name":"Phone Android"},"e61b":{"name":"Phone Bluetooth Speaker"},"e61c":{"name":"Phone Forwarded"},"e61d":{"name":"Phone In Talk"},"e325":{"name":"Phone Iphone"},"e61e":{"name":"Phone Locked"},"e61f":{"name":"Phone Missed"},"e620":{"name":"Phone Paused"},"e326":{"name":"Phonelink"},"e0db":{"name":"Phonelink Erase"},"e0dc":{"name":"Phonelink Lock"},"e327":{"name":"Phonelink Off"},"e0dd":{"name":"Phonelink Ring"},"e0de":{"name":"Phonelink Setup"},"e410":{"name":"Photo"},"e411":{"name":"Photo Album"},"e412":{"name":"Photo Camera"},"e43b":{"name":"Photo Filter"},"e413":{"name":"Photo Library"},"e432":{"name":"Photo Size Select Actual"},"e433":{"name":"Photo Size Select Large"},"e434":{"name":"Photo Size Select Small"},"e415":{"name":"Picture As Pdf"},"e8aa":{"name":"Picture In Picture"},"e911":{"name":"Picture In Picture Alt"},"e6c4":{"name":"Pie Chart"},"e6c5":{"name":"Pie Chart Outlined"},"e55e":{"name":"Pin Drop"},"e55f":{"name":"Place"},"e037":{"name":"Play Arrow"},"e038":{"name":"Play Circle Filled"},"e039":{"name":"Play Circle Outline"},"e906":{"name":"Play For Work"},"e03b":{"name":"Playlist Add"},"e065":{"name":"Playlist Add Check"},"e05f":{"name":"Playlist Play"},"e800":{"name":"Plus One"},"e801":{"name":"Poll"},"e8ab":{"name":"Polymer"},"eb48":{"name":"Pool"},"e0ce":{"name":"Portable Wifi Off"},"e416":{"name":"Portrait"},"e63c":{"name":"Power"},"e336":{"name":"Power Input"},"e8ac":{"name":"Power Settings New"},"e91e":{"name":"Pregnant Woman"},"e0df":{"name":"Present To All"},"e8ad":{"name":"Print"},"e645":{"name":"Priority High"},"e80b":{"name":"Public"},"e255":{"name":"Publish"},"e8ae":{"name":"Query Builder"},"e8af":{"name":"Question Answer"},"e03c":{"name":"Queue"},"e03d":{"name":"Queue Music"},"e066":{"name":"Queue Play Next"},"e03e":{"name":"Radio"},"e837":{"name":"Radio Button Checked"},"e836":{"name":"Radio Button Unchecked"},"e560":{"name":"Rate Review"},"e8b0":{"name":"Receipt"},"e03f":{"name":"Recent Actors"},"e91f":{"name":"Record Voice Over"},"e8b1":{"name":"Redeem"},"e15a":{"name":"Redo"},"e5d5":{"name":"Refresh"},"e15b":{"name":"Remove"},"e15c":{"name":"Remove Circle"},"e15d":{"name":"Remove Circle Outline"},"e067":{"name":"Remove From Queue"},"e417":{"name":"Remove Red Eye"},"e928":{"name":"Remove Shopping Cart"},"e8fe":{"name":"Reorder"},"e040":{"name":"Repeat"},"e041":{"name":"Repeat One"},"e042":{"name":"Replay"},"e059":{"name":"Replay 10"},"e05a":{"name":"Replay 30"},"e05b":{"name":"Replay 5"},"e15e":{"name":"Reply"},"e15f":{"name":"Reply All"},"e160":{"name":"Report"},"e8b2":{"name":"Report Problem"},"e56c":{"name":"Restaurant"},"e561":{"name":"Restaurant Menu"},"e8b3":{"name":"Restore"},"e929":{"name":"Restore Page"},"e0d1":{"name":"Ring Volume"},"e8b4":{"name":"Room"},"eb49":{"name":"Room Service"},"e418":{"name":"Rotate 90 Degrees Ccw"},"e419":{"name":"Rotate Left"},"e41a":{"name":"Rotate Right"},"e920":{"name":"Rounded Corner"},"e328":{"name":"Router"},"e921":{"name":"Rowing"},"e0e5":{"name":"Rss Feed"},"e642":{"name":"Rv Hookup"},"e562":{"name":"Satellite"},"e161":{"name":"Save"},"e329":{"name":"Scanner"},"e8b5":{"name":"Schedule"},"e80c":{"name":"School"},"e1be":{"name":"Screen Lock Landscape"},"e1bf":{"name":"Screen Lock Portrait"},"e1c0":{"name":"Screen Lock Rotation"},"e1c1":{"name":"Screen Rotation"},"e0e2":{"name":"Screen Share"},"e623":{"name":"Sd Card"},"e1c2":{"name":"Sd Storage"},"e8b6":{"name":"Search"},"e32a":{"name":"Security"},"e162":{"name":"Select All"},"e163":{"name":"Send"},"e811":{"name":"Sentiment Dissatisfied"},"e812":{"name":"Sentiment Neutral"},"e813":{"name":"Sentiment Satisfied"},"e814":{"name":"Sentiment Very Dissatisfied"},"e815":{"name":"Sentiment Very Satisfied"},"e8b8":{"name":"Settings"},"e8b9":{"name":"Settings Applications"},"e8ba":{"name":"Settings Backup Restore"},"e8bb":{"name":"Settings Bluetooth"},"e8bd":{"name":"Settings Brightness"},"e8bc":{"name":"Settings Cell"},"e8be":{"name":"Settings Ethernet"},"e8bf":{"name":"Settings Input Antenna"},"e8c0":{"name":"Settings Input Component"},"e8c1":{"name":"Settings Input Composite"},"e8c2":{"name":"Settings Input Hdmi"},"e8c3":{"name":"Settings Input Svideo"},"e8c4":{"name":"Settings Overscan"},"e8c5":{"name":"Settings Phone"},"e8c6":{"name":"Settings Power"},"e8c7":{"name":"Settings Remote"},"e1c3":{"name":"Settings System Daydream"},"e8c8":{"name":"Settings Voice"},"e80d":{"name":"Share"},"e8c9":{"name":"Shop"},"e8ca":{"name":"Shop Two"},"e8cb":{"name":"Shopping Basket"},"e8cc":{"name":"Shopping Cart"},"e261":{"name":"Short Text"},"e6e1":{"name":"Show Chart"},"e043":{"name":"Shuffle"},"e1c8":{"name":"Signal Cellular 4 Bar"},"e1cd":{"name":"Signal Cellular Connected No Internet 4 Bar"},"e1ce":{"name":"Signal Cellular No Sim"},"e1cf":{"name":"Signal Cellular Null"},"e1d0":{"name":"Signal Cellular Off"},"e1d8":{"name":"Signal Wifi 4 Bar"},"e1d9":{"name":"Signal Wifi 4 Bar Lock"},"e1da":{"name":"Signal Wifi Off"},"e32b":{"name":"Sim Card"},"e624":{"name":"Sim Card Alert"},"e044":{"name":"Skip Next"},"e045":{"name":"Skip Previous"},"e41b":{"name":"Slideshow"},"e068":{"name":"Slow Motion Video"},"e32c":{"name":"Smartphone"},"eb4a":{"name":"Smoke Free"},"eb4b":{"name":"Smoking Rooms"},"e625":{"name":"Sms"},"e626":{"name":"Sms Failed"},"e046":{"name":"Snooze"},"e164":{"name":"Sort"},"e053":{"name":"Sort By Alpha"},"eb4c":{"name":"Spa"},"e256":{"name":"Space Bar"},"e32d":{"name":"Speaker"},"e32e":{"name":"Speaker Group"},"e8cd":{"name":"Speaker Notes"},"e92a":{"name":"Speaker Notes Off"},"e0d2":{"name":"Speaker Phone"},"e8ce":{"name":"Spellcheck"},"e838":{"name":"Star"},"e83a":{"name":"Star Border"},"e839":{"name":"Star Half"},"e8d0":{"name":"Stars"},"e0d3":{"name":"Stay Current Landscape"},"e0d4":{"name":"Stay Current Portrait"},"e0d5":{"name":"Stay Primary Landscape"},"e0d6":{"name":"Stay Primary Portrait"},"e047":{"name":"Stop"},"e0e3":{"name":"Stop Screen Share"},"e1db":{"name":"Storage"},"e8d1":{"name":"Store"},"e563":{"name":"Store Mall Directory"},"e41c":{"name":"Straighten"},"e56e":{"name":"Streetview"},"e257":{"name":"Strikethrough S"},"e41d":{"name":"Style"},"e5d9":{"name":"Subdirectory Arrow Left"},"e5da":{"name":"Subdirectory Arrow Right"},"e8d2":{"name":"Subject"},"e064":{"name":"Subscriptions"},"e048":{"name":"Subtitles"},"e56f":{"name":"Subway"},"e8d3":{"name":"Supervisor Account"},"e049":{"name":"Surround Sound"},"e0d7":{"name":"Swap Calls"},"e8d4":{"name":"Swap Horiz"},"e8d5":{"name":"Swap Vert"},"e8d6":{"name":"Swap Vertical Circle"},"e41e":{"name":"Switch Camera"},"e41f":{"name":"Switch Video"},"e627":{"name":"Sync"},"e628":{"name":"Sync Disabled"},"e629":{"name":"Sync Problem"},"e62a":{"name":"System Update"},"e8d7":{"name":"System Update Alt"},"e8d8":{"name":"Tab"},"e8d9":{"name":"Tab Unselected"},"e32f":{"name":"Tablet"},"e330":{"name":"Tablet Android"},"e331":{"name":"Tablet Mac"},"e420":{"name":"Tag Faces"},"e62b":{"name":"Tap And Play"},"e564":{"name":"Terrain"},"e262":{"name":"Text Fields"},"e165":{"name":"Text Format"},"e0d8":{"name":"Textsms"},"e421":{"name":"Texture"},"e8da":{"name":"Theaters"},"e8db":{"name":"Thumb Down"},"e8dc":{"name":"Thumb Up"},"e8dd":{"name":"Thumbs Up Down"},"e62c":{"name":"Time To Leave"},"e422":{"name":"Timelapse"},"e922":{"name":"Timeline"},"e425":{"name":"Timer"},"e423":{"name":"Timer 10"},"e424":{"name":"Timer 3"},"e426":{"name":"Timer Off"},"e264":{"name":"Title"},"e8de":{"name":"Toc"},"e8df":{"name":"Today"},"e8e0":{"name":"Toll"},"e427":{"name":"Tonality"},"e913":{"name":"Touch App"},"e332":{"name":"Toys"},"e8e1":{"name":"Track Changes"},"e565":{"name":"Traffic"},"e570":{"name":"Train"},"e571":{"name":"Tram"},"e572":{"name":"Transfer Within A Station"},"e428":{"name":"Transform"},"e8e2":{"name":"Translate"},"e8e3":{"name":"Trending Down"},"e8e4":{"name":"Trending Flat"},"e8e5":{"name":"Trending Up"},"e429":{"name":"Tune"},"e8e6":{"name":"Turned In"},"e8e7":{"name":"Turned In Not"},"e333":{"name":"Tv"},"e169":{"name":"Unarchive"},"e166":{"name":"Undo"},"e5d6":{"name":"Unfold Less"},"e5d7":{"name":"Unfold More"},"e923":{"name":"Update"},"e1e0":{"name":"Usb"},"e8e8":{"name":"Verified User"},"e258":{"name":"Vertical Align Bottom"},"e259":{"name":"Vertical Align Center"},"e25a":{"name":"Vertical Align Top"},"e62d":{"name":"Vibration"},"e070":{"name":"Video Call"},"e071":{"name":"Video Label"},"e04a":{"name":"Video Library"},"e04b":{"name":"Videocam"},"e04c":{"name":"Videocam Off"},"e338":{"name":"Videogame Asset"},"e8e9":{"name":"View Agenda"},"e8ea":{"name":"View Array"},"e8eb":{"name":"View Carousel"},"e8ec":{"name":"View Column"},"e42a":{"name":"View Comfy"},"e42b":{"name":"View Compact"},"e8ed":{"name":"View Day"},"e8ee":{"name":"View Headline"},"e8ef":{"name":"View List"},"e8f0":{"name":"View Module"},"e8f1":{"name":"View Quilt"},"e8f2":{"name":"View Stream"},"e8f3":{"name":"View Week"},"e435":{"name":"Vignette"},"e8f4":{"name":"Visibility"},"e8f5":{"name":"Visibility Off"},"e62e":{"name":"Voice Chat"},"e0d9":{"name":"Voicemail"},"e04d":{"name":"Volume Down"},"e04e":{"name":"Volume Mute"},"e04f":{"name":"Volume Off"},"e050":{"name":"Volume Up"},"e0da":{"name":"Vpn Key"},"e62f":{"name":"Vpn Lock"},"e1bc":{"name":"Wallpaper"},"e002":{"name":"Warning"},"e334":{"name":"Watch"},"e924":{"name":"Watch Later"},"e42c":{"name":"Wb Auto"},"e42d":{"name":"Wb Cloudy"},"e42e":{"name":"Wb Incandescent"},"e436":{"name":"Wb Iridescent"},"e430":{"name":"Wb Sunny"},"e63d":{"name":"Wc"},"e051":{"name":"Web"},"e069":{"name":"Web Asset"},"e16b":{"name":"Weekend"},"e80e":{"name":"Whatshot"},"e1bd":{"name":"Widgets"},"e63e":{"name":"Wifi"},"e1e1":{"name":"Wifi Lock"},"e1e2":{"name":"Wifi Tethering"},"e8f9":{"name":"Work"},"e25b":{"name":"Wrap Text"},"e8fa":{"name":"Youtube Searched For"},"e8ff":{"name":"Zoom In"},"e900":{"name":"Zoom Out"},"e56b":{"name":"Zoom Out Map"}}} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.svg b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.svg new file mode 100644 index 00000000..a449327e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.svg @@ -0,0 +1,2373 @@ + + + + + +Created by FontForge 20151118 at Mon Feb 8 11:58:02 2016 + By shyndman +Copyright 2015 Google, Inc. All Rights Reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.ttf b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.ttf new file mode 100644 index 00000000..7015564a Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.ttf differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.woff b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.woff new file mode 100644 index 00000000..b648a3ee Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.woff differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.woff2 b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.woff2 new file mode 100644 index 00000000..9fa21125 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.woff2 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/material-icons/material-icons.css b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/material-icons/material-icons.css new file mode 100644 index 00000000..2270c09d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/material-icons/material-icons.css @@ -0,0 +1,36 @@ +@font-face { + font-family: 'Material Icons'; + font-style: normal; + font-weight: 400; + src: url(MaterialIcons-Regular.eot); /* For IE6-8 */ + src: local('Material Icons'), + local('MaterialIcons-Regular'), + url(MaterialIcons-Regular.woff2) format('woff2'), + url(MaterialIcons-Regular.woff) format('woff'), + url(MaterialIcons-Regular.ttf) format('truetype'); +} + +.material-icons { + font-family: 'Material Icons'; + font-weight: normal; + font-style: normal; + font-size: 24px; /* Preferred icon size */ + display: inline-block; + line-height: 1; + text-transform: none; + letter-spacing: normal; + word-wrap: normal; + white-space: nowrap; + direction: ltr; + + /* Support for all WebKit browsers. */ + -webkit-font-smoothing: antialiased; + /* Support for Safari and Chrome. */ + text-rendering: optimizeLegibility; + + /* Support for Firefox. */ + -moz-osx-font-smoothing: grayscale; + + /* Support for IE. */ + font-feature-settings: 'liga'; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Bold.woff b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Bold.woff new file mode 100644 index 00000000..780de6d6 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Bold.woff differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Bold.woff2 b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Bold.woff2 new file mode 100644 index 00000000..72a32ab2 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Bold.woff2 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-BoldItalic.woff b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-BoldItalic.woff new file mode 100644 index 00000000..20ec4ab2 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-BoldItalic.woff differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-BoldItalic.woff2 b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-BoldItalic.woff2 new file mode 100644 index 00000000..642a2d44 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-BoldItalic.woff2 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Light.woff b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Light.woff new file mode 100644 index 00000000..a9946092 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Light.woff differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Light.woff2 b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Light.woff2 new file mode 100644 index 00000000..b3238fa2 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Light.woff2 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-LightItalic.woff b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-LightItalic.woff new file mode 100644 index 00000000..7cc63b7e Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-LightItalic.woff differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-LightItalic.woff2 b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-LightItalic.woff2 new file mode 100644 index 00000000..3f438f80 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-LightItalic.woff2 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Regular.woff b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Regular.woff new file mode 100644 index 00000000..40c056ea Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Regular.woff differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Regular.woff2 b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Regular.woff2 new file mode 100644 index 00000000..46f89cfb Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Regular.woff2 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-RegularItalic.woff b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-RegularItalic.woff new file mode 100644 index 00000000..ddc9c014 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-RegularItalic.woff differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-RegularItalic.woff2 b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-RegularItalic.woff2 new file mode 100644 index 00000000..08d7a518 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-RegularItalic.woff2 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/header.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/header.png new file mode 100644 index 00000000..be1002a4 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/header.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/README.md b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/README.md new file mode 100644 index 00000000..22bccbd4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/README.md @@ -0,0 +1,273 @@ +This folder contains the GUI translation files. To maintain order and be able +to easily make any necessary updates to the translation files after updating +the main text file, please follow its instructions if you are working with +its contents. + +# Contents of this folder + +The contents of this folder are: + +- `README.md`: this file. + +- `check.js`: file with the script for detecting if a translation file has errors +or should be updated. + +- `en.json`: main file with all the texts of the application, in English. It should +only be modified when changing the texts of the application (add, modify and +delete). This means that the file must not be modified while creating a new +ranslation or modifying an existing one. + +- Various `xx.json` files: files with the translated versions of the texts of +`en.json`. + +- Various `xx_base.json` files: files with copies of `en.json` made the last time the +corresponding `xx.json` file was modified. + +Normally there is no need to modify the first two files. + +For more information about the `xx.json` and `xx_base.json`, please check the +[Add a new translation](#add-a-new-translation) and +[Update a translation](#update-a-translation) sections. + +# About the meaning of "xx" in this file + +Several parts of this file uses "xx" as part of file names or scripts, like +`xx.json` and `xx_base.json`. In fact, no file in this folder should be called +`xx.json` or `xx_base.json`, the "xx" part must be replaces with the two +characters code of the language. For example, if you are working with the Chinese +translation, the files will be `zh.json` and `zh_base.json`, instead of `xx.json` +and `xx_base.json`. The same if true for the scripts, if you are working with the +Chinese translation, instead of running `node check.js xx` you must run +`node check.js zh`. + +# Add a new translation + +First you must create in this folder two copies of the `en.json` file. The first +copy must be called `xx.json`, where the `xx` part must be the two characters code +of the new language. For example, for Chinese the name of the file should be +`zh.json`; for Spanish, `es.json`; for French, `fr.json`, etc. + +The second copy of `en.json` must be renamed to `xx_base.json`, where the `xx` part +must be the two characters code of the new language. This means that if the first +copy is named `zh.json`, the second one should be named `zh_base.json`. + +It is not necessary to follow a specific standard for the two characters code, but +it must be limited to two letters and be a recognizable code for the language. + +After creating the two files, simply translate the texts in `xx.json`. Please make +sure you do not modify the structure of `xx.json`, just modify the texts. + +The `xx_base.json` file must not be modified in any way, as it is used only as a way +to know what the state of `en.json` was the last time the `xx.json` file was +modified. This copy will be compared in the future with `en.json`, to verify if +there were modifications to `en.json` since the last time the translation file was +modified and if an update is needed. + +If the `xx.json` and `xx_base.json` files do not have the same elements, the +automatic tests could fail when uploading the changes to the repository, preventing +the changes from being accepted, so, again, it is important not to modify the +structure of `xx.json`, but only its contents. + +After doing all this, the translation will be ready, but will not be available in +the GUI until adding it to the code. + +# Verify the translation files + +This folder includes a script that is capable of automatically checking the +translation files, to detect problems and know what should be updated. + +For using it, your computer must have `Node.js` installed. + +## Checking for problems + +For detecting basic problems on the translation files, open a command line window +in this folder and run `node check.js`. This will check the following: + +- The `en.json` must exist, as it is the main language file for the app. + +- For every `xx.json` file (except `en.json`) an `xx_base.json` file must exist +and viceversa. + +- A `xx.json` file and its corresponding `xx_base.json` file must have the exact +same elements (only the content of that elements could be different), as the +`xx.json` is suposed to be the translation of the contents of `xx_base.json`. + +As you can see, this only checks for errors that could be made while creating or +modifying the `xx.json` and `xx_base.json` files, and does not check if any +translation needs to be updated. + +At the end of the script excecution, the console will display the list of all +errors found, if any. This check could be done automatically when making changes +to the repository, to reject updates with problems, so it is good idea to run it +manually before uploading changes. + +Note: at this time the script does not check if the elements of the files are +in the same order, but this could be added in the future, so it is recomended +not to change the order of the elements. + +## Checking if a language file needs to be updated + +To detect if an specific language needs updating, run `node check.js xx`, +where xx is the two characters code of the language you want to check. If you +want to check all languages, run `node check.js all`. + +By doing this, the script will perform all the checks described in the +[Checking for problems](#checking-for-problems) section, plus this: + +- The `en.json` and `xx_base.json` should have the same elements. If `en.json` +has elements that `xx_base.json` does not contain, it means that, since the +last time the translation file was updated, new texts have been added to the +application. If `xx_base.json` has elements that `en.json` does not contain, +it means that, since the last time the translation file was updated, some texts +have been removed from the application. Both cases mean that the translation +file should be updated. + +- The elements of `en.json` and `xx_base.json` should have the same content. +If any element have different content, it means that since the last time the +translation file was updated, some texts of the applications have been changed. +This means that the translation file should be updated. + +At the end of the script excecution, the console will display the list of all +errors found, if any. + +# Update a translation + +Before updating a translation file, you should follow the steps of the +[Checking if a language file needs to be updated](#Checking-if-a-language-file-needs-to-be-updated) +section. By doing so you will quikly know exactly what texts must be added, +deleted or edited. + +After doing that, make all the required modifications in the `xx.json` file, +this means adding, deleting and modifying all the elements indicated by the +script. Please be sure to modify only what is required and to add any new +element in the same position that it is in the `en.json` file. This process +is manual, so be sure check all the changes before finishing. + +After doing the modifications in `xx.json`, delete the `xx_base.json` file, +create a copy of `en.json` and rename it `xx_base.json`. The objetive is to +simply update the `xx_base.json` file to the current state of `en.json`. +this will make possible to check in the future if more updates are nedded, +due to new changes in `en.json`. + +Once all the changes are made, check again the language file as indicated +in the +[Checking if a language file needs to be updated](#Checking-if-a-language-file-needs-to-be-updated) +section. The script should not return errors. If the script returns errors, +please solve them before continuing. + +# How to edit the translation files + +The translation files are in json format (.json files). It is possible to +open these files in a text editor and edit them like normal text files. +However, the json files are used for coding and have a very strict format. +Because of this, **editing the files manually is not recommended** unless +you know exactly what you are doing. + +If you do not know the json format, this section includes useful +information to be able to edit the files easily. + +## Which application should be used for editing the files + +There are several application that allow editing json files, including +some text editors. However, it is recommended to use the Json Editor app +for Google Chrome. Among the advantages of this application are that it +is multiplatform, it allows editing the contents without having to +directly modify the json code and has a relatively simple interface. You +can add it to your Chrome browser from here: +https://chrome.google.com/webstore/detail/json-editor/lhkmoheomjbkfloacpgllgjcamhihfaj + +The app looks like this: + +![app](app1.png) + +As you can see, you can load/save files on the upper-right corner of +the app. The left part shows the source code and the right part shows +a tree view of the elements of the file and its contents. You can +ignore the source code and work with the tree view only. + +![app](app2.png) + +As you will not be editing the soutce code, you can hide it by presing +and draging the 3-dot button (1). While editing the file, you can use +the arrows (2) to expand/contract the different sections in which the +elements are organized. Once you find an item that you want to edit, +click on the content and modify the text (3). Please, do not make any +changes to the name of the element (4). + +You can use the 6-dot buttons (5) to move the elements to a different +location, but please avoid doing it, as that could alter the order of +the file in a way that would make it stop working. Also, as you will +not be working with the source code, avoid using the arrow +buttons (6). + +## Special codes + +Some texts in the language files have special codes that are not +shown in the user interface of the wallet, but serve special purposes. +The codes are: + +- **\\"**: due to how json files work, it is not possible to write +double quotes directly in the texts, the ccorrect way to add double +quotes to a json file is **\\"** (note that the 2 characters must not +be separated by a white space). If you use the Json Editor app for +Google Chrome, you can write double quotes normally and the app will +automatically add the **\\** character behind them, but that is just +a convenience for when you are writing, you could still find the +**\\"** code in files you are editing and have to work with it. + +- **{{ }}**: any text block similar to **{{ something }}** is a +special identifier that the code will replace with a different value +when the app is running. For example, if you find a text like "Your +balance is {{ value }} coins", the application will show something +like "Your balance is 21 coins". In that example the "21" is a value +that the app has to calculate, so it is not possible to add it directly +into the language file. If you find a **{{ }}** text block, please do +not translate it, just move the whole **{{ }}** text block to where the +value should be displayed. If you want to leave a while space before the +value, simply add a white space before the **{{ }}** text block, and do +the same after it if you want a white space after the value. + +- **\
**: this code means "new line". It is just a way to tell +the code that the text after it should be added in a new line. + +# Make a translation available in the application + +Although creating the translation files is the most important step, it is +necessary to make some additional changes before a translation is +available in the application. + +The first thing to do is to add a bitmap in +[src/gui/static/src/assets/img/lang](src/gui/static/src/assets/img/lang), +with the flag that will be used to identify the language. The bitmap +should be a .png file with transparent background and a size of 64x64 +pixels. However, the flag does not have to occupy all the space of the +bitmap, but it should be 64 pixels wide and only 42 pixels high, +centered. Please use as a reference the flags that are already in +the folder. + +After adding the flag, you must modify the +[src/gui/static/src/app/app.config.ts](src/gui/static/src/app/app.config.ts) +file. In particular, you must add a new entry to the `languages` array, +with the data about the language. The object you must add is similar +to this: + +``` +{ + code: 'en', + name: 'English', + iconName: 'en.png' +} +``` + +The properties are: + +- `code`: 2 letter code that was assigned to the language. It must match +the name given to the translation file. + +- `name`: Name of the language. + +- `iconName`: Name of the file with the flag, which was added in the +previous step. + +Please use as a reference the data of the languages that have already +been added to the `languages` array. diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/app1.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/app1.png new file mode 100644 index 00000000..67c75016 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/app1.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/app2.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/app2.png new file mode 100644 index 00000000..6cabfe68 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/app2.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/check.js b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/check.js new file mode 100644 index 00000000..b70f022d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/check.js @@ -0,0 +1,230 @@ +'use strict' + +const fs = require('fs'); + +///////////////////////////////////////////// +// Initial configuration +///////////////////////////////////////////// + +console.log('Starting to check the language files.', '\n'); + +// Load the current English file. +if (!fs.existsSync('en.json')) { + exitWithError('Unable to find the English language file.'); +} +let currentData = JSON.parse(fs.readFileSync('en.json', 'utf8')); + +// 2 charaters code of the languages that will be checked. +const langs = []; +// If false, the code will only verify the differences in the elements (ignoring its contents) of the +// base files and the files with the translations. If not, the code will also verify the differences +// in the elements and contents of the base files and the current English file. +let checkFull = false; + +// If a param was send, it must be "all" or the 2 charaters code of the language that must be checked. +// If a param is provided, checkFull is set to true. +if (process.argv.length > 2) { + if (process.argv.length > 3) { + exitWithError('Invalid number of parameters.'); + } + + if (process.argv[2] != 'all') { + if (process.argv[2].length !== 2) { + exitWithError('You can only send as parameter to this script the 2-letter code of one of the language files in this folder, or "all".'); + } + langs.push(process.argv[2]); + } + + checkFull = true; +} + +// If no language code was send as param, the code will check all languages. +if (langs.length === 0) { + let localFiles = fs.readdirSync('./'); + + const langFiles = []; + const langFilesMap = new Map(); + const baseLangFilesMap = new Map(); + localFiles.forEach(file => { + if (file.length === 12 && file.endsWith('_base.json')) { + langs.push(file.substring(0, 2)); + baseLangFilesMap.set(file.substring(0, 2), true); + } + if (file !== 'en.json' && file.length === 7 && file.endsWith('.json')) { + langFiles.push(file.substring(0, 2)); + langFilesMap.set(file.substring(0, 2), true); + } + }); + + langs.forEach(lang => { + if (!langFilesMap.has(lang)) { + exitWithError('The \"' + lang + '_base.json\" base file does not have its corresponding language file.'); + } + }); + + langFiles.forEach(lang => { + if (!baseLangFilesMap.has(lang)) { + exitWithError('The \"' + lang + '.json\" file does not have its corresponding base file.'); + } + }); + + if (langs.length === 0) { + exitWithError('No language files to check.'); + } +} + +console.log('Checking the following languages:'); +langs.forEach(lang => { + console.log(lang); +}); +console.log(''); + +///////////////////////////////////////////// +// Verifications +///////////////////////////////////////////// + +// The following arrays will contain the list of elements with problems. Each element of the +// arrays contains a "lang" property with the language identifier and a "elements" array with +// the path of the problematic elements. + +// Elements that are present in a base file but not in its corresponding translation file. +const baseFileOnly = []; +// Elements that are present in a translation file but not in its corresponding base file. +const translatedFileOnly = []; +// Elements that are present in the English file but not in the currently checked base translation file. +const enOnly = []; +// Elements that are present in the currently checked base translation file but not in the English file. +const translatedOnly = []; +// Elements that have different values in the currently checked base translation file and the English file. +const different = []; + +function addNewLangToArray(array, lang) { + array.push({ + lang: lang, + elements: [] + }); +} + +langs.forEach(lang => { + addNewLangToArray(baseFileOnly, lang); + addNewLangToArray(translatedFileOnly, lang); + addNewLangToArray(enOnly, lang); + addNewLangToArray(translatedOnly, lang); + addNewLangToArray(different, lang); + + // Try to load the translation file and its corresponding base file. + if (!fs.existsSync(lang + '.json')) { + exitWithError('Unable to find the ' + lang + '.json file.'); + } + let translationData = JSON.parse(fs.readFileSync(lang + '.json', 'utf8')); + + if (!fs.existsSync(lang + '_base.json')) { + exitWithError('Unable to find the ' + lang + '_base.json language file.'); + } + let baseTranslationData = JSON.parse(fs.readFileSync(lang + '_base.json', 'utf8')); + + // Check the differences in the elements of the translation file and its base file. + checkElement('', '', baseTranslationData, translationData, baseFileOnly, true); + checkElement('', '', translationData, baseTranslationData, translatedFileOnly, true); + + // Check the differences in the elements and content of the base translation file the English file. + if (checkFull) { + checkElement('', '', currentData, baseTranslationData, enOnly, false); + checkElement('', '', baseTranslationData, currentData, translatedOnly, true); + } +}); + + +// Check recursively if the elements and content of two language objects are the same. +// +// path: path of the currently checked element. As this function works with nested elements, +// the path is the name of all the parents, separated by a dot. +// key: name of the current element. +// fist: first element for the comparation. +// second: second element for the comparation. +// arrayForMissingElements: array in which the list of "fist" elements that are not in "second" +// will be added. +// ignoreDifferences: if false, each time the content of an element in "fist" is different to the +// same element in "second" that element will be added to the "different" array. +function checkElement(path, key, fist, second, arrayForMissingElements, ignoreDifferences) { + let pathPrefix = ''; + if (path.length > 0) { + pathPrefix = '.'; + } + + // This means that, at some point, the code found an element in the "first" branch that is + // not in the "second" branch. + if (second === undefined || second === null) { + arrayForMissingElements[arrayForMissingElements.length - 1].elements.push(path + pathPrefix + key); + return; + } + + if (typeof fist !== 'object') { + // If the current element is a string, compare the contents, but ony if ignoreDifferences + // is true. + if (!ignoreDifferences && fist != second) { + different[different.length - 1].elements.push(path + pathPrefix + key); + } + } else { + // If the current element is an object, check the childs. + Object.keys(fist).forEach(currentKey => { + checkElement(path + pathPrefix + key, currentKey, fist[currentKey], second[currentKey], arrayForMissingElements, ignoreDifferences); + }); + } +} + +///////////////////////////////////////////// +// Results processing +///////////////////////////////////////////// + +// Becomes true if any of the verifications failed. +let failedValidation = false; + +// If "failedValidation" is false, writes to the console the header of the error list +// and updates the value of "failedValidation" to true. +function updateErrorSumary() { + if (!failedValidation) { + failedValidation = true; + console.log('The following problems were found:', '\n'); + } +} + +// Checks all arrays for errors. This loop is for the languages. +for (let i = 0; i < baseFileOnly.length; i++) { + + // This loop if for checking all the arrays. + [baseFileOnly, translatedFileOnly, enOnly, translatedOnly, different].forEach((array, idx) => { + // If the array has elements, it means that errors were found. + if (array[i].elements.length > 0) { + updateErrorSumary(); + + // Show the appropriate error text according to the current array. + if (idx === 0) { + console.log('The \"' + baseFileOnly[i].lang + '_base.json\" base file has elements that are not present in \"' + baseFileOnly[i].lang + '.json\":'); + } else if (idx === 1) { + console.log("\"" + translatedFileOnly[i].lang + '.json\" has elements that are not present in the \"' + baseFileOnly[i].lang + '_base.json\" base file:'); + } else if (idx === 2) { + console.log('The \"en.json\" file has elements that are not present in the \"' + enOnly[i].lang + '_base.json\" base file:'); + } else if (idx === 3) { + console.log('The \"' + translatedOnly[i].lang + '_base.json\" base file has elements that are not present in \"en.json\":'); + } else if (idx === 4) { + console.log('The \"' + different[i].lang + '_base.json\" base file has values that do not match the ones in \"en.json\":'); + } + // Show all the elements with errors. + array[i].elements.forEach(element => console.log(element)); + console.log(''); + } + }); +} + +// If no error was detected, show a success message on the console. If not, exit with an error code. +if (!failedValidation) { + console.log('The verification passed without problems.'); +} else { + process.exit(1); +} + +function exitWithError(errorMessage) { + console.log('Error: ' + errorMessage) + process.exit(1); +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/en.json b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/en.json new file mode 100644 index 00000000..2026efdb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/en.json @@ -0,0 +1,626 @@ +{ + "common": { + "coin-id": "SKY", + "coin-hours": "Coin Hours", + "usd": "USD", + "loading": "Loading...", + "new": "New", + "load": "Load", + "success": "Success", + "warning": "Warning", + "changes-made": "The changes have been made." + }, + + "errors": { + "error": "Error", + "fetch-version": "Unable to fetch latest release version from Github", + "incorrect-password": "Incorrect password", + "error-decrypting": "Error decrypting the wallet", + "api-disabled": "API disabled", + "no-wallet": "Wallet does not exist", + "no-outputs": "No unspent outputs", + "window-size": "The window is too narrow for the content" + }, + + "title": { + "language": "Select Language", + "wallets": "Wallets", + "send": "Send", + "history": "History", + "buy-coin": "Buy Skycoin", + "network": "Networking", + "blockchain": "Blockchain", + "outputs": "Outputs", + "transactions": "Transactions", + "pending-txs": "Pending Transactions", + "backup": "Backup Wallet", + "explorer": "Skycoin Explorer", + "seed": "Wallet Seed", + "reset": "Reset Password", + "exchange": "Exchange", + "select-address": "Select Address", + "order-history": "Order history" + }, + + "header": { + "syncing-blocks": "Syncing blocks", + "update1": "Wallet update", + "update2": "available.", + "synchronizing": "The wallet is synchronizing. Data you see may not be updated.", + "pending-txs1": "There are some", + "pending-txs2": "pending transactions.", + "pending-txs3": "Data you see may not be updated.", + + "errors": { + "no-connections": "No connections active, your client is not connected to any other nodes!", + "no-backend1": "Cannot reach backend. Please restart the app and/or seek help on our", + "no-backend2": "Telegram.", + "no-backend3": "", + "csrf": "Security vulnerability: CSRF is not working, please exit immediately." + } + }, + + "password": { + "title": "Enter Password", + "label": "Password", + "confirm-label": "Confirm password", + "button": "Proceed", + "reset-link": "I forgot my password" + }, + + "buy": { + "deposit-address": "Choose an address to generate a BTC deposit link for:", + "select-address": "Select address", + "generate": "Generate", + "deposit-location": "Deposit Location", + "deposit-location-desc": "Choose a wallet where you'd like us to deposit your Skycoin after we receive your Bitcoin.", + "make-choice": "Make a choice", + "wallets-desc": "Each time a new wallet and address are selected, a new BTC address is generated. A single Skycoin address can have up to 5 BTC addresses assigned to it.", + "send": "Send Bitcoin", + "send-desc": "Send Bitcoin to the address below. Once received, we will deposit the Skycoin to a new address in the wallet selected above at the current rate of {{ rate }} SKY/BTC.", + "fraction-warning": "Only send multiple of the SKY/BTC rate! Skycoin is sent in whole number; fractional SKY is not sent!", + "receive": "Receive Sky", + "receive-desc": "After receiving your Bitcoin, we'll send you your Skycoin. It may take anywhere between 20 minutes and an hour to receive your SKY.", + "status-button": "Status:", + "check-status-button": "Check Status", + "new-order-button": "New Order" + }, + + "wizard": { + "wallet-desc": "If you don't have a Skycoin wallet, use the generated seed to create a new one. If you already have a wallet, toggle over to \"Load Wallet\" and enter your seed.", + "encrypt-desc": "Increase security of your wallet by encrypting it. By entering a password below, your wallet will be encrypted. Only those with the password will be able access the wallet and remove funds.", + "hardware-wallet-link": "Using a Skywallet?", + "finish-button": "Finish", + "back-button": "Back", + + "confirm": { + "title": "Safeguard your seed!", + "desc": "We want to make sure that you wrote down your seed and stored it in a safe place. If you forget your seed, you WILL NOT be able to recover your Skycoin wallet!", + "checkbox": "It’s safe, I swear.", + "button": "Continue" + } + }, + + "wallet": { + "new-address": "New Address", + "new-addresses": "New Addresses", + "show-empty": "Show Empty", + "hide-empty": "Hide Empty", + "encrypt": "Encrypt Wallet", + "decrypt": "Decrypt Wallet", + "decrypt-warning": "Warning: for security reasons, it is not recommended to keep the wallets unencrypted. Caution is advised.", + "delete": "Delete Wallet", + "edit": "Edit Wallet", + "add": "Add Wallet", + "load": "Load Wallet", + "encryption-enabled": "Encryption enabled", + "encryption-disabled": "Encryption disabled", + "hw-security-warning": "Possible security risk. Access the Skywallet options (by pressing the \"Skywallet\" button below the wallets list) while the device is connected for more information.", + "wallet": "Wallet", + "hardware-wallet": "Skywallet", + "delete-confirmation": "WARNING: The wallet \"{{ name }}\" will be removed from the list. To add it again, you will have to reconnect the device and open the Skywallet options (by pressing the \"Skywallet\" button below the wallets list). Do you want to continue?", + "delete-confirmation-check": "Yeah, I want to delete the wallet.", + "max-hardware-wallets-error": "You have already reached the max number of addresses that can be added to the Skywallet.", + "add-many-confirmation": "WARNING: If you add too many addresses without using the previous ones or if you use the last ones and not the first ones, some addresses may not be recovered automatically if you try to restore the wallet using the seed (you will have to add them manually). Do you want to continue?", + + "new": { + "create-title": "Create Wallet", + "load-title": "Load Wallet", + "encrypt-title": "Encrypt Wallet", + "name-label": "Name", + "words-number": "How many word the seed has", + "seed-label": "Seed", + "confirm-seed-label": "Confirm seed", + "seed-warning": "Remember this seed! Keep it in a safe place. If you forget your seed, you will not be able to recover your wallet!", + "create-button": "Create", + "load-button": "Load", + "cancel-button": "Cancel", + "12-words": "12 words", + "24-words": "24 words", + "generate-12-seed": "Generate 12 word seed", + "generate-24-seed": "Generate 24 word seed", + "encrypt": "Encrypt wallet", + "encrypt-warning": "We suggest that you encrypt each one of your wallets with a password. If you forget your password, you can reset it with your seed. Make sure you have your seed saved somewhere safe before encrypting your wallet.", + "unconventional-seed-title": "Possible error", + "unconventional-seed-text": "You introduced an unconventional seed. If you did it for any special reason, you can continue (only recommended for advanced users). However, if your intention is to use a normal system seed, you must delete all the additional text and special characters.", + "unconventional-seed-check": "Continue with the unconventional seed.", + "synchronizing-warning-title": "Warning", + "synchronizing-warning-text": "The wallet is still synchronizing and some addresses may not be restored. If some addresses are not restored, please wait for the wallet to be fully synchronized and add them again manually.", + "synchronizing-warning-continue": "Continue", + "synchronizing-warning-cancel": "Cancel", + "wallet-created": "The wallet has been added to the list.", + + "seed": { + "enter-seed": "Press here to enter your seed.", + "change-seed": "Press to change", + "confirm-seed": "Press here to confirm your seed.", + "confirmed-seed": "Seed confirmed.", + "use-custom-seed": "Press here if you want to enter the seed manually.", + "use-normal-seed": "Press here if you want to enter the seed using the recommended method.", + "custom-seed-warning-title": "Warning", + "custom-seed-warning-text": "This option is only recommended for advanced users. Making mistakes with the seed could cause you to lose access to the funds in case of a problem.", + "custom-seed-warning-text-recovering": "To avoid possible problems, this option should only be used if you want to recover an unconventional seed.", + "custom-seed-warning-check": "I understand the risks and want to continue", + "custom-seed-warning-cancel": "Cancel", + "custom-seed-warning-continue": "Continue", + "incorrect-word": "The word you have entered does not match the requested one.", + "invalid-seed": "The seed you have entered is not valid. Please try again.", + "enter-word": "Enter the word #{{number}}", + "new-seed-help": "You must enter the words of the seed that was generated by the system, to confirm it.", + "recover-seed-help": "Please be sure to enter the correct words in the correct order." + } + }, + + "rename": { + "title": "Rename Wallet", + "name-label": "Name", + "cancel-button": "Cancel", + "rename-button": "Rename" + }, + + "add-addresses": { + "title": "Select quantity", + "name-quantity": "How many addresses to create", + "cancel-button": "Cancel", + "create-button": "Create", + "error": "There was an unexpected error. Please try again." + }, + + "address": { + "show": "Press to show", + "copy": "Copy", + "copy-address": "Copy address", + "copied": "Copied!", + "confirm": "Confirm address", + "outputs": "Unspent outputs", + "history": "History" + } + }, + + "qr": { + "title": "QR Code", + "title-read-only": "QR Code", + "data": "QR Data:", + "address": "Address:", + "request-link": "Request specific amount", + "amount": "Request amount:", + "hours": "Request hours:", + "message": "Message:", + "invalid": "(invalid value)", + "copied": "The text has been copied to the clipboard." + }, + + "send": { + "synchronizing-warning": "The wallet is still synchronizing the data, so the balance shown may be incorrect. Are you sure you want to continue?", + "from-label": "Send from", + "to-label": "Send to", + "amount-label": "Amount", + "personal-note-label": "Personal note", + "personal-note-help": "Use this field to add a text for allowing you to identify the transaction in the future. This text is saved locally, so it will only be visible from this computer", + "wallet-label": "Wallet", + "addresses-label": "Addresses", + "invalid-amount": "Please enter a valid amount", + "convert-confirmation": "Do you also want the already introduced amount to be converted from {{from}} to {{to}}?", + "convert-confirmation-plural": "Do you also want the already introduced amounts to be converted from {{from}} to {{to}}?", + "send-all-available-coins": "send all", + "no-wallet-selected": "You must select a wallet first.", + "precision-error-warning": "A precision error was detected during conversion. Please check the amount that will be sent.", + "invaid-amount-warning": "An invalid value was detected during conversion. Please check the amount that will be sent.", + "precision-errors-warning": "Precision errors were detected during conversion. Please check the amount that will be sent.", + "invaid-amounts-warning": "Invalid values were detected during conversion. Please check the amount that will be sent.", + "multiple-problems-warning": "Some values were not converted because they were invalid or could have been converted with precision errors. Please check the amount that will be sent.", + "no-coins-left": "There are no coins left to send.", + "addresses-help": "Limit the addresses from where the coins and hours could be sent", + "all-addresses": "All the addresses of the selected wallet", + "outputs-label": "Unspent outputs", + "outputs-help": "Limit the unspent outputs from where the coins and hours could be sent. Only the outputs from the selected addresses are shown", + "all-outputs": "All the outputs of the selected addresses", + "available-msg-part1": "With your current selection you can send up to", + "available-msg-part2": "and", + "available-msg-part3": "(at least", + "available-msg-part4": "must be used for the transaction fee).", + "change-address-label": "Custom change address", + "change-address-select": "Select", + "change-address-help": "Address to receive change. If it's not provided, it will be chosen automatically. Click on the \"Select\" link to choose an address from one of your wallets", + "destinations-label": "Destinations", + "destinations-help1": "Destination addresses and their coins", + "destinations-help2": "Destination addresses, their coins and coin hours", + "hours-allocation-label": "Automatic coin hours allocation", + "options-label": "Options", + "value-label": "Coin hours share factor", + "value-help": "The higher the value, the more coin hours will be sent to the recipients and less will be retained", + "preview-button": "Preview", + "send-button": "Send", + "back-button": "Back", + "simple": "Simple", + "advanced": "Advanced", + "select-wallet": "Select Wallet", + "error-saving-note": "The transaction was successfully sent, but it was not possible to save the note.", + "sent": "Transaction successfully sent.", + "total": "Total:", + + "bulk-send": { + "title": "Bulk Send", + "indications": "To send to multiple destinations in a quick way, type each address, coin amount and hour amount (optional) on a line, separated by a comma. Example: if you want to send 10 coins and 5 hours to the \"xyz\" address, type \"xyz,10,5\"; if you want the hours to be calculated automatically, type \"xyz,10\". Decimal values must be separated with a dot.", + "process": "Process", + "error-no-data": "There is no text to process.", + "error-inconsistent-data": "If you set how many hours you want to send to a destinations, you must do so for all destinations.", + "error-invalid-data": "The entered text has an invalid format." + } + }, + + "reset": { + "wallet-label": "Wallet", + "seed-label": "Wallet seed", + "password-label": "New password (leave empty if you want the wallet not to be encrypted)", + "confirm-label": "Confirm new password", + "reset-button": "Reset", + "done": "Password successfully changed." + }, + + "tx": { + "transaction": "Transaction", + "confirm-transaction": "Confirm Transaction", + "from": "From", + "to": "To", + "date": "Date", + "status": "Status", + "coins": "Coins", + "hours": "Hours", + "id": "Tx ID", + "note": "Note", + "without-note": "Without note", + "show-more": "Show more", + "hours-moved": "moved", + "hours-sent": "sent", + "hours-received": "received", + "hours-burned": "burned", + "inputs": "Inputs", + "outputs": "Outputs", + "confirmed": "Confirmed", + "pending": "Pending", + "current-rate": "Calculated at the current rate" + }, + + "edit-note": { + "title": "Edit note", + "cancel-button": "Cancel", + "change-button": "Change" + }, + + "backup": { + "wallet-directory": "Wallet Directory:", + "seed-warning": "BACKUP YOUR SEED. ON PAPER. IN A SAFE PLACE. As long as you have your seed, you can recover your coins.", + "desc": "Use the table below to get seeds from your encrypted wallets.
To get seeds from unencrypted wallets, open the folder above, open the .wlt files in a text editor and recover the seeds.", + "close-button": "Close", + "wallet": "Wallet Label", + "filename": "Filename", + "seed": "Seed", + "show-seed": "Show seed", + "no-wallets": "No encrypted wallets" + }, + + "blockchain": { + "blocks": "Number of blocks", + "time": "Timestamp of last block", + "hash": "Hash of last block", + "current-supply": "Current SKY supply", + "total-supply": "Total SKY supply", + "current-coinhour-supply": "Current Coin Hours supply", + "total-coinhour-supply": "Total Coin Hours supply" + }, + + "network": { + "peer": "Peer", + "source": "Source", + "block-height": "Block height", + "block-height-short": "Block", + "last-seen": "Last seen", + "last-received": "Last received", + "last-sent": "Last sent", + "in": "Incoming", + "out": "Outgoing", + + "sources": { + "default": "Default peer", + "exchange": "Peer exchange" + } + }, + + "pending-txs": { + "timestamp": "Timestamp", + "txid": "Transaction ID", + "none": "No pending transactions", + "my": "Mine", + "all": "All" + }, + + "history": { + "tx-detail": "Transaction Detail", + "moving": "Internally moving", + "moved": "Internally moved", + "sending": "Sending", + "sent": "Sent", + "received": "Received", + "receiving": "Receiving", + "pending": "Pending", + "note": "Note", + "no-txs": "You have no transaction history", + "no-txs-filter": "There are no transactions matching the current filter criteria", + "no-filter": "No filter active (press to select wallets/addresses)", + "filter": "Active filter: ", + "filters": "Active filters: ", + "all-addresses": "All addresses" + }, + + "teller": { + "done": "Completed", + "waiting-confirm": "Waiting for confirmation", + "waiting-deposit": "Waiting for Bitcoin deposit", + "waiting-send": "Waiting to send Skycoin", + "unknown": "Unknown" + }, + + "confirmation" : { + "header-text": "Confirmation", + "confirm-button": "Yes", + "cancel-button": "No", + "close": "Close" + }, + + "service": { + "api" : { + "server-error": "Server error" + }, + "wallet": { + "not-enough-hours": "Not enough available Coin Hours to perform the transaction!" + } + }, + + "hardware-wallet": { + "general" : { + "default-wallet-name": "New Skywallet", + "error-disconnected": "Unable to perform the operation. The Skywallet is not connected.", + "simple-error": "Error. Unable to perform the operation.", + "generic-error": "Unable to perform the operation. Make sure you have connected a valid Skywallet and that it is not waiting for input.", + "generic-error-internet": "Unable to perform the operation. Make sure you have connected a valid Skywallet that is not waiting for input and that you have a connection to the internet/node.", + "error-incorrect-wallet": "Unable to perform the operation. The connected Skywallet is different from the expected one.", + "error-incorrect-pin": "Unable to perform the operation. The PIN you have entered is incorrect.", + "confirm": "Please confirm the operation on the Skywallet.", + "confirm-and-more": "Please confirm the operation on the Skywallet and follow the instructions displayed.", + "follow": "Please follow the instructions displayed on the Skywallet.", + "close": "Close", + "cancel": "Cancel", + "continue": "Continue", + "completed": "Operation completed successfully.", + "refused": "The operation failed or was canceled.", + "name-updated": "The name used to identify this Skywallet in the wallet list has been updated to match the one shown on the device." + }, + "errors": { + "too-many-inputs-outputs": "The transaction has too many inputs or outputs for the Skywallet. Please try again creating several smaller transactions, each one with a smaller number of recipients (if the current transaction has many) or coins.", + "daemon-connection": "Problem connecting to the Skywallet service.", + "timeout": "The operation was canceled due to inactivity. Please try again.", + "invalid-address-generated": "There was a problem with the address generator and the operation had to be canceled.", + "invalid-address": "Invalid address.", + "not-in-bootloader-mode": "To use this option the Skywallet must be in bootloader mode." + }, + "security-warning" : { + "title": "Security warning", + "text": "The last time this Skywallet was connected, one or more security warnings were found. We recommend that you open the Skywallet options (by pressing the link below) while the device is connected and solve the security problems before continuing.", + "link": "Open the Skywallet options window.", + "check": "I understand the risks and want to continue", + "continue": "Continue", + "cancel": "Cancel" + }, + "options" : { + "connecting": "Connecting...", + "disconnected": "No Skywallet detected. Please connect a Skywallet to use this option.", + "unconfigured-detected-title": "Unconfigured Skywallet", + "unconfigured-detected": "A seedless Skywallet has been detected. Select \"Configure automatically\" if you want to configure it as a brand new wallet and start using it. Select \"Restore backup\" if you want to configure the Skywallet with a previously created seed backup.", + "configured-detected": "Skywallet detected. The device is identified in the wallets list as:", + "security-warnings-title": "Security warnings", + "security-warning-title": "Security warning", + "unchecked-version-warning": "It was not possible to verify if the firmware of your Skywallet is up to date. This could be due to problems with your internet connection or because the service is under maintenance.", + "outdated-version-warning": "The firmware of your Skywallet is outdated. We recommend you to update it as soon as possible to ensure safety. To do this, select the \"Update firmware\" option.", + "backup-warning": "You should backup the Skywallet seed or you could lose access to the funds in case of problems. To do this, select the \"Create a backup\" option.", + "pin-warning": "The connected Skywallet does not have a PIN. The PIN code protects the Skywallet from unauthorized parties accessing the device. To create a PIN code, select the \"Create PIN code\" option.", + "options": "Options:", + "update-firmware": "Update firmware", + "configure-automatically": "Configure automatically", + "restore-backup": "Restore backup", + "create-backup": "Create a backup", + "wipe": "Wipe the device", + "confirm-seed": "Confirm seed", + "create-pin": "Create PIN code", + "change-pin": "Change PIN code", + "delete-pin": "Delete PIN code", + "forgotten-pin1": "If you cannot access the wallet because you have forgotten the PIN, you can wipe the Skywallet and then restore it with the seed by clicking", + "forgotten-pin2": "here.", + "firmware-version": "Device firmware version:" + }, + "update-firmware-warning" : { + "title": "Outdated Firmware", + "text": "WARNING: the firmware in your Skywallet is outdated. To stay safe, it is recommended to update it.", + "cancel": "Cancel", + "update": "Update" + }, + "update-firmware" : { + "title-connecting": "Connecting...", + "title-update": "Update Firmware", + "title-install": "Install Firmware", + "text-downloading": "Checking device and downloading files...", + "text-bootloader": "WARNING: if you have already configured this device, before continuing you must have a backup of your seed or you could permanently lose access to the funds.", + "text-not-bootloader": "To update the firmware of your Skywallet you must connect it in bootloader mode (connect it to the computer while pressing the two physical buttons of the device). WARNING: if you have already configured this device, before continuing you must have a backup of your seed or you could permanently lose access to the funds.", + "text-no-firmware": "Welcome. The currently connected Skywallet does not have a firmware installed. A firmware will now be installed so you can start using the device. NOTE: if you have already configured this device and want to recover the funds, you will need your seed.", + "check": "I understand the risks and want to continue", + "follow": "The firmware update has been sent to the Skywallet. Please continue the process on the device.", + "connection-error": "It was not possible to download the firmware. This could be due to problems with your internet connection or because the service is under maintenance.", + "timeout": "The operation was canceled due to inactivity. Please disconnect the device, reconnect it and try again.", + "finished": "Your device has been configured correctly. Please unplug it before continuing." + }, + "generate-seed" : { + "text": "Before proceeding, you can select the number of words you want the seed to have. The seed is a list of words that can be used to recover access to the coins in case of problems. Both values are safe, so if you do not have a special reason for selecting one or the other, you can leave the default value.", + "configuring": "Configuring..." + }, + "restore-seed" : { + "text": "Before proceeding, please select the number of words that the seed you want to recover has.", + "check-text": "You can use this option to enter a seed and check if it is equal to the one in the Skywallet. Before start, select the number of words the seed you want to check has.", + "warning" : "WARNING: to avoid potential problems, use only seeds created with a Skywallet.", + "error-wrong-word": "Error: The retyped word does not match the one requested by the Skywallet.", + "error-invalid-seed": "Error: The seed is not valid. Please be sure to enter the correct words in the correct order.", + "error-wrong-seed": "Error: The seed is valid but does not match the one in the device.", + "correct-seed": "The seed is valid and matches the one in the device." + }, + "added" : { + "title": "New Skywallet", + "configuring": "New Skywallet detected. Configuring...", + "done": "Done", + "added1": "The connected Skywallet has been added to the wallets list with the following name:", + "added2": "Now you can check the balance and the addresses of the Skywallet even when it is not connected. Additionally, you can change the name of the wallet or remove it from the wallets list, if you wish.", + "characters-warning": "If you use non-standard English characters, the name may not be displayed correctly on the device.", + "ok": "Ok" + }, + "wipe" : { + "warning": "WARNING: All the data on the Skywallet will be deleted. If you do not have a backup, you will not be able to access your funds again.", + "confirm-delete": "Also remove from the wallets list" + }, + "create-backup" : { + "warning": "WARNING: You can only create a backup of your Skywallet seed once. If you decide to continue, you will have to write down a group of words (it is recommended to do it on paper and not on a computer) that will appear on the screen of the Skywallet and store the list in a safe place. Anyone with access to the word list (the \"seed\") will be able access the wallet funds, so extreme caution is advised.", + "instructions": "Write down the word list that appear on the screen of the Skywallet. Make sure you respect the order and write each word correctly." + }, + "seed-word" : { + "title": "Enter word", + "info1": "Enter the word shown on the device", + "info2": "You will be asked to enter the words of your backup seed in random order. Also, additional random words could be requested.", + "word": "Requested word", + "error-invalid-word": "The entered word is not valid.", + "error-loading-words": "Loading the word list. Please wait." + }, + "change-pin" : { + "pin-mismatch": "Unable to perform the operation. The PINs you have entered do not match." + }, + "remove-pin" : { + "warning": "WARNING: It is not recommended to remove the PIN code from your Skywallet, as it will be vulnerable to being used by unauthorized parties in case of loss or theft.", + "check": "I understand the risks and want to continue" + }, + "enter-pin" : { + "title": "Enter PIN", + "title-change-current": "Enter the current PIN", + "title-change-new": "Enter the new PIN", + "title-change-confirm": "Confirm the new PIN", + "instructions": "The PIN layout is displayed on the Skywallet screen.", + "instructions-tx": "Enter the PIN to confirm and sign the transaction.", + "instructions-change": "Please enter a secure PIN consisting of 4 to 8 numbers.", + "help": "Need help?" + }, + "pin-help" : { + "title": "Help", + "part1": "When it is necessary to enter the PIN to continue, the Skywallet screen will display a matrix of 9 boxes with numbers in random order (the order changes each time) and you will be asked to enter the PIN in the software wallet using a matrix of 9 buttons that simply show the symbol •.", + "part2": "To enter the PIN, look at the position of the PIN numbers in numbers matrix on the screen of the Skywallet and press the corresponding buttons in the software wallet. For example, if the PIN is \"23\" and the number 2 is in the upper left, number 3 in the middle of the Skywallet numbers matrix, press the upper left and middle button in that order in the software wallet.", + "part3": "If you wish, you can also use the numpad on your keyboard to enter the PIN. However, as in the previous example, if the PIN is \"23\", you can not simply type \"23\" with the numpad, but you will have to press the keys that are in the position where the numbers 2 and 3 are shown on the screen of the Skywallet. Taking into account the previous example, you would have to press the \"7\" and \"5\" keys, because those are the keys that you are in the same position as the numbers shown by the Skywallet." + }, + "create-tx" : { + "title": "Create transaction", + "upper-text": "Please confirm the operation in the Skywallet after verifying if the following data matches EXACTLY with the transaction you wish to send and with those shown by the Skywallet:", + "lower-text": "If any data does not correspond to what the Skywallet shows or the transaction you wish to send, cancel the operation on your Skywallet.", + "send-p1": "and", + "send-p2": "to" + }, + "confirm-address" : { + "title": "Confirm address", + "instructions": "Please confirm on the Skywallet if the address is:", + "short-confirmation": "Address confirmed.", + "confirmation": "Address confirmed. For security, you can re-show the address in the Skywallet using the \"Confirm address\" option, in the menu that you can display by pressing the button at the right of the address balance." + } + }, + + "time-from-now": { + "few-seconds": "a few seconds ago", + "minute": "one minute ago", + "minutes": "{{time}} minutes ago", + "hour": "one hour ago", + "hours": "{{time}} hours ago", + "day": "one day ago", + "days": "{{time}} days ago" + }, + + "exchange": { + "you-send": "You send", + "you-get": "You get (approx.)", + "to-address": "To {{coin}} address", + "price": "Exchange rate", + "time-15": "Exchange time", + "exchange-button": "Exchange", + "min-amount": "Minimum amount:", + "max-amount": "Maximum amount:", + "agree-1": "I agree with", + "agree-2": "Terms of Use", + "agree-3": "and", + "agree-4": "Privacy Policy", + "powered-by": "Powered by", + "need-help": "Need help?", + "support-portal": "Support portal", + "history": "Order history", + "order-not-found": "Order not found", + "status": "Status", + "exchanging": "Exchanging {{from}} for {{to}}", + "select": "Select", + "offline": "Exchange is temporarily offline", + "problem-connecting": "Unable to connect with the service. Please check your Internet connection and try again later.", + "invalid-address": "Invalid address.", + "statuses": { + "user-waiting": "Waiting for deposit. Please send {{amount}} {{from}} to the exchange address shown below", + "user-waiting-info": "The system is waiting for you to make the deposit into the exchange address. The exchange process will start after the deposit is detected and confirmed in the blockchain. If you have already made the deposit, it should be detected shortly.", + "market-waiting-confirmations": "Waiting for transaction confirmations", + "market-waiting-confirmations-info": "The deposit has already been detected and the system is waiting for it to be confirmed in the blockchain.", + "market-confirmed": "Transaction accepted", + "market-confirmed-info": "The transaction has already been confirmed in the blockchain. Preparing to make the exchange soon.", + "market-exchanged": "Traded {{from}} for {{to}}", + "market-exchanged-info": "The exchange has been made. The funds will be transferred to your address in a moment.", + "market-withdraw-waiting": "Sending {{to}} to your address", + "market-withdraw-waiting-info": "The process for sending the coins to your address has been initiated.", + "complete": "Exchange completed!", + "complete-info": "The funds have been successfully sent to your address.", + "error": "Error occurred", + "error-info": "There was an error in the operation, you can find more information below. If you need help, please save all the operation data shown below and contact technical support using the link in the lower right part of this page.", + "user-deposit-timeout": "Order canceled due to inactivity", + "user-deposit-timeout-info": "The system has canceled the order because no deposit was detected, please open a new order. If you need help, please save all the operation data shown below and contact technical support using the link in the lower right part of this page." + }, + "history-window": { + "address": "Address", + "date": "Date" + }, + "details": { + "exchange-addr": "Exchange address (valid for this exchange operation only)", + "exchange-addr-tag": "Payment ID or Destination Tag which must be used for the transaction", + "tx-id": "Transaction ID", + "order-id": "Order ID", + "initial-price": "Initial exchange rate", + "error-msg": "Error message", + "details": "Details", + "start-date": "Start date", + "back": "Back", + "back-alert": "The operation is still in progress. Do you really want to return to the form? You can see the progress of this operation again by pressing the \"Order history\" button" + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/es.json b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/es.json new file mode 100644 index 00000000..8f9f20f1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/es.json @@ -0,0 +1,506 @@ +{ + "common": { + "coin-id": "SKY", + "coin-hours": "Coin Hours", + "usd": "USD", + "loading": "Cargando...", + "new": "Nueva", + "load": "Cargar" + }, + + "errors": { + "error": "Error", + "fetch-version": "No ha sido posible verificar la última versión desde Github", + "incorrect-password": "Contraseña incorrecta", + "error-decrypting": "Error al desencriptar la billetera", + "api-disabled": "API desabilitada", + "no-wallet": "La billetera no existe", + "no-outputs": "No hay salidas no gastadas", + "window-size": "La ventana es demasiado estrecha para el contenido" + }, + + "title": { + "language": "Seleccionar Lenguaje", + "wallets": "Billeteras", + "send": "Enviar", + "history": "Historial", + "buy-coin": "Comprar Skycoins", + "network": "Red", + "blockchain": "Blockchain", + "outputs": "Salidas", + "transactions": "Transacciones", + "pending-txs": "Transacciones Pendientes", + "backup": "Respaldar Billetera", + "explorer": "Explorador de Skycoin", + "seed": "Semilla de la Billetera", + "qrcode": "Código QR", + "reset": "Restablecer contraseña", + "exchange": "Intercambiar", + "select-address": "Seleccionar Dirección", + "order-history": "Historial de órdenes" + }, + + "header": { + "syncing-blocks": "Sincronizando bloques", + "update1": "La actualización", + "update2": "está disponible.", + "synchronizing": "El nodo está sincronizando. Los datos mostrados pueden estar desactualizados.", + "pending-txs1": "Hay una o más", + "pending-txs2": "transacciones pendientes.", + "pending-txs3": "Los datos mostrados pueden estar desactualizados.", + + "errors": { + "no-connections": "Sin conexiones activas, ¡el cliente no está conectado a otros nodos!", + "no-backend1": "Sin acceso al servidor. Por favor, reinicie la aplicación y/o contáctenos vía", + "no-backend2": "Telegram.", + "no-backend3": "", + "csrf": "Vulnerabilidad de seguridad: CSRF no funciona. Por favor, salga de inmediato." + } + }, + + "password": { + "title": "Introduzca Su Contraseña", + "label": "Contraseña", + "confirm-label": "Confirmar contraseña", + "button": "Continuar", + "reset-link": "He olvidado mi contraseña" + }, + + "buy": { + "deposit-address": "Seleccione una dirección para la cual generar un enlace de depósito BTC:", + "select-address": "Seleccione una dirección", + "generate": "Generar", + "deposit-location": "Localización de Depósito", + "deposit-location-desc": "Seleccione la billetera en la que desea que le depositemos sus Skycoins después de recibir los Bitcoins.", + "make-choice": "Realice una selección", + "wallets-desc": "Una nueva dirección BTC es generada cada vez que se selecciona una nueva billetera y dirección. Una única dirección de Skycoin puede tener asignadas hasta 5 direcciones BTC.", + "send": "Enviar Bitcoins", + "send-desc": "Envíe Bitcoins a la dirección abajo indicada. Al recibirlos, le depositaremos los Skycoins en una nueva dirección en la billetera seleccionada más arriba, a la tasa de cambio actual de {{ rate }} SKY/BTC.", + "fraction-warning": "¡Envíe sólo múltiplos de la tasa SKY/BTC! Los Skycoins son enviados en números enteros, ¡no se envían fracciones de SKY!", + "receive": "Recibir SKY", + "receive-desc": "Después de recibir los Bitcoins, le enviaremos sus Skycoins. El tiempo de espera para recibir sus SKY puede ser de entre 20 minutos y una hora.", + "status-button": "Estatus:", + "check-status-button": "Revisar Estatus", + "new-order-button": "Nueva Orden" + }, + + "wizard": { + "wallet-desc": "Si no tiene una billetera, use la semilla generada automáticamente para crear una nueva. Si ya tiene una billetera, seleccione \"Cargar\" e introduzca su semilla.", + "encrypt-desc": "Incremente la seguridad de su billetera encriptándola. Al introducir una contraseña más abajo, su billetera será encriptada. Sólo quien tenga la contraseña podrá acceder a la billetera y retirar fondos.", + "hardware-wallet-link": "¿Utilizando una billetera de hardware?", + "finish-button": "Finalizar", + "back-button": "Volver", + + "confirm": { + "title": "¡Resguarde su semilla!", + "desc": "Queremos asegurarnos de que ha anotado su semilla y la ha almacenado en un lugar seguro. ¡Si olvida su semilla, NO podrá recuperar su billetera!", + "checkbox": "Está segura, lo garantizo.", + "button": "Continuar" + } + }, + + "wallet": { + "new-address": "Nueva Dirección", + "new-addresses": "Nuevas Direcciones", + "show-empty": "Mostrar Vacías", + "hide-empty": "Ocultar Vacías", + "encrypt": "Encriptar Billetera", + "decrypt": "Desencriptar Billetera", + "decrypt-warning": "Advertencia: por razones de seguridad, no se recomienda mantener las carteras desencriptadas. Se aconseja precaución.", + "delete" : "Borrar Billetera", + "edit": "Editar Billetera", + "add": "Agregar Billetera", + "load": "Cargar Billetera", + "encryption-enabled": "Encriptado habilitado", + "encryption-disabled": "Encriptado deshabilitado", + "hw-security-warning": "Posible riesgo de seguridad. Acceda a las opciones de la billetera de hardware (presionando el botón \"Billetera de Hardware\" debajo de la lista de billeteras) mientras el dispositivo está conectado, para más información.", + "wallet": "Billetera", + "hardware-wallet": "Billetera de Hardware", + "delete-confirmation": "ADVERTENCIA: la billetera \"{{ name }}\" será removida de la lista. Para agregarla nuevamente, deberá volver a conectar el dispositivo y abrir las opciones de la billetera del hardware (presionando el botón \"Billetera de hardware\" debajo de la lista de las billeteras). ¿Desea continuar?", + "delete-confirmation-check": "Sí, quiero borrar la billetera.", + "max-hardware-wallets-error": "Ya ha alcanzado el número máximo de direcciones que se puede agregar a la billetera de hardware.", + "add-many-confirmation": "ADVERTENCIA: si agrega demasiadas direcciones sin usar las anteriores o si usa las últimas y no las primeras, es posible que algunas direcciones no se recuperen automáticamente si intenta restaurar la billetera con la semilla (tendrá que agregarlas manualmente). ¿Desea continuar?", + + "new": { + "create-title": "Crear Billetera", + "load-title": "Cargar Billetera", + "encrypt-title": "Encriptar la billetera", + "name-label": "Nombre", + "seed-label": "Semilla", + "confirm-seed-label": "Confirmar semilla", + "seed-warning": "¡Recuerde esta semilla! Manténgala en un lugar seguro. ¡Si olvida su semilla, no podrá recuperar la billetera!", + "create-button": "Crear", + "load-button": "Cargar", + "cancel-button": "Cancelar", + "12-words": "12 palabras", + "24-words": "24 palabras", + "generate-12-seed": "Generar una semilla de 12 palabras", + "generate-24-seed": "Generar una semilla de 24 palabras", + "encrypt": "Encriptar billetera", + "encrypt-warning": "Le sugerimos que encripte con una contraseña cada una de sus billeteras. Si olvida su contraseña, puede restaurarla con la semilla. Asegúrese de guardar su semilla en un lugar seguro antes de encriptar la billetera.", + "unconventional-seed-title": "Posible error", + "unconventional-seed-text": "Usted introdujo una semilla no convencional. Si lo hizo por alguna razón en especial, puede continuar (sólo recomendable para usuarios avanzados). Sin embargo, si su intención es utilizar una semilla normal del sistema, usted debe borrar los textos y/o caracteres especiales adicionales.", + "unconventional-seed-check": "Continuar con la semilla no convencional." + }, + + "rename": { + "title": "Renombrar Billetera", + "name-label": "Nombre", + "cancel-button": "Cancelar", + "rename-button": "Renombrar" + }, + + "add-addresses": { + "title": "Seleccionar cantidad", + "name-quantity": "Cantidad de direcciones a crear", + "cancel-button": "Cancelar", + "create-button": "Crear" + }, + + "address": { + "show": "Presione para mostrar", + "copy": "Copiar", + "copy-address": "Copiar Dirección", + "copied": "¡Copiado!", + "confirm": "Confirmar Dirección", + "outputs": "Salidas No Gastadas", + "history": "Historial" + } + }, + + "send": { + "synchronizing-warning": "La billetera todavía está sincronizando los datos, por lo que el saldo que se muestra puede ser incorrecto. ¿Seguro de que desea continuar?", + "from-label": "Enviar desde", + "to-label": "Enviar a", + "amount-label": "Cantidad", + "notes-label": "Notas", + "wallet-label": "Billetera", + "addresses-label": "Dirección", + "invalid-amount": "Por favor introduzca una cantidad válida", + "addresses-help": "Limite las direcciones desde donde se podrían enviar las monedas y las horas", + "all-addresses": "Todas las direcciones de la billetera seleccionada", + "outputs-label": "Salidas no gastadas", + "outputs-help": "Limite las salidas no gastadas desde donde se podrían enviar las monedas y las horas. Solo se muestran las salidas de las direcciones seleccionadas.", + "all-outputs": "Todas las salidas no gastadas de las direcciones seleccionadas", + "available-msg-part1": "Con su selección actual puede enviar hasta", + "available-msg-part2": "y", + "available-msg-part3": "(al menos", + "available-msg-part4": "deben ser utilizadas para la tarifa de transacción).", + "change-address-label": "Dirección de retorno personalizada", + "change-address-select": "Seleccionar", + "change-address-help": "Dirección para recibir el cambio. Si no se proporciona, será elegida automáticamente. Haga clic en el enlace \"Seleccionar\" para elegir una dirección de una de sus billeteras", + "destinations-label": "Destinos", + "destinations-help1": "Direcciones de destino y sus monedas", + "destinations-help2": "Direcciones de destino, sus monedas y coin hours", + "hours-allocation-label": "Distribución automática de coin hours", + "options-label": "Opciones", + "value-label": "Factor de distribución de las coin hours", + "value-help": "Mientras mayor sea el valor, más coin hours se enviarán a las salidas", + "preview-button": "Preview", + "send-button": "Enviar", + "back-button": "Volver", + "simple": "Simple", + "advanced": "Advanzado", + "select-wallet": "Seleccionar Billetera" + }, + + "reset": { + "wallet-label": "Billetera", + "seed-label": "Semilla de la billetera", + "password-label": "Nueva contraseña (deje en blanco si desea que la billetera no esté encriptada)", + "confirm-label": "Confirme la contraseña", + "reset-button": "Restaurar" + }, + + "tx": { + "transaction": "Transacción", + "confirm-transaction": "Confirmar Transacción", + "from": "Desde", + "to": "A", + "date": "Fecha", + "status": "Estatus", + "coins": "Monedas", + "hours": "Horas", + "id": "Tx ID", + "show-more": "Mostrar más", + "hours-moved": "movida(s)", + "hours-sent": "enviada(s)", + "hours-received": "recibida(s)", + "hours-burned": "quemada(s)", + "inputs": "Entradas", + "outputs": "Salidas", + "confirmed": "Confirmada", + "pending": "Pendiente", + "current-rate": "Calculado a la tasa actual" + }, + + "backup": { + "wallet-directory": "Directorio de la Billetera:", + "seed-warning": "RESPALDE SU SEMILLA. EN PAPEL. EN UN LUGAR SEGURO. Mientras tenga su semilla, podrá recuperar las monedas.", + "desc": "Use la tabla de más abajo para obtener las semillas de sus billeteras encriptadas.
Para obtener las semillas de las billeteras no encriptadas, abra el directorio de más arriba, abra los archivos .wlt en un editor de texto y recupere las semillas.", + "close-button": "Cerrar", + "wallet": "Nombre de la Billetera", + "filename": "Archivo", + "seed": "Semilla", + "show-seed": "Mostrar semilla", + "no-wallets": "No hay billeteras encriptadas" + }, + + "blockchain": { + "blocks": "Cantidad de bloques", + "time": "Fecha del último bloque", + "hash": "Hash del último bloque", + "current-supply": "Suministro de SKY actual", + "total-supply": "Suministro de SKY total", + "current-coinhour-supply": "Suministro de Coin Hours actual", + "total-coinhour-supply": "Suministro de Coin Hours total" + }, + + "network": { + "peer": "Par", + "source": "Fuente", + "block-height": "Altura del bloque", + "block-height-short": "Bloque", + "last-seen": "Última vez visto", + "last-received": "Última recepción", + "last-sent": "Último envío", + "in": "Entrante", + "out": "Saliente", + + "sources": { + "default": "Par por defecto", + "exchange": "Intercambio de pares" + } + }, + + "pending-txs": { + "timestamp": "Fecha", + "txid": "ID de la transacción", + "none": "Actualmente no hay transacciones pendientes", + "my": "Mías", + "all": "Todas" + }, + + "history": { + "tx-detail": "Detalles de la Transacción", + "moving": "Moviendo internamente", + "moved": "Movida internamente", + "sending": "Enviando", + "sent": "Enviada", + "received": "Recibida", + "receiving": "Recibiendo", + "pending": "Pendiente", + "no-txs": "Usted no tiene historial de transacciones", + "no-txs-filter": "No hay transacciones que coincidan con los criterios de filtro actuales", + "no-filter": "Sin filtros activos (Presione para seleccionar billeteras/direcciones)", + "filter": "Filtro activo: ", + "filters": "Filtros activo: ", + "all-addresses": "Todas las direcciones" + }, + + "teller": { + "done": "Completado", + "waiting-confirm": "Esperando confirmación", + "waiting-deposit": "Esperando depósito de Bitcoins", + "waiting-send": "Esperando para envíar Skycoins", + "unknown": "Desconocido" + }, + + "confirmation" : { + "header-text": "Confirmación", + "confirm-button": "Sí", + "cancel-button": "No", + "close": "Cerrar" + }, + + "service": { + "api" : { + "server-error": "Error de servidor" + }, + "wallet": { + "not-enough-hours": "¡No cuenta con suficientes Coin Hours para realizar la operación!" + } + }, + + "hardware-wallet": { + "general" : { + "default-wallet-name": "Nueva billetera de hardware", + "error-disconnected": "No se puede realizar la operación. La billetera de hardware no está conectada.", + "simple-error": "Error, no se puede realizar la operación.", + "generic-error": "No se puede realizar la operación. Asegúrese de haber conectado una billetera de hardware válida y de que no esté esperando por alguna confirmación o respuesta.", + "generic-error-internet": "No se puede realizar la operación. Asegúrese de haber conectado una billetera de hardware válida que no esté esperando por alguna confirmación o respuesta y de que su equipo cuente con conexión a internet y al nodo.", + "error-incorrect-wallet": "No se puede realizar la operación. La billetera de hardware conectada es diferente a la esperada.", + "error-incorrect-pin": "No se puede realizar la operación. El PIN que ha introducido no es correcto.", + "confirm": "Por favor, confirme la operación en la billetera de hardware.", + "confirm-and-more": "Por favor, confirme la operación en la billetera de hardware y siga las instrucciones.", + "close": "Cerrar", + "cancel": "Cancelar", + "continue": "Continuar", + "completed": "La operación se realizó con éxito.", + "refused": "La operación falló o fue cancelada." + }, + "errors": { + "too-many-inputs": "La transacción tiene demasiadas entradas y no se puede procesar. Por favor, póngase en contacto con el soporte técnico.", + "too-many-outputs": "La transacción tiene demasiadas salidas y no se puede procesar. Por favor, póngase en contacto con el soporte técnico." + }, + "security-warning" : { + "title": "Advertencia de seguridad", + "text": "La última vez que se conectó esta billetera de hardware, se encontraron una o más advertencias de seguridad. Le recomendamos que abra las opciones de billetera de hardware (presionando el botón \"Billetera de hardware\" debajo de la lista de billeteras) mientras el dispositivo está conectado y resuelva los problemas de seguridad antes de continuar.", + "check": "Entiendo los riesgos y deseo continuar.", + "continue": "Continuar", + "cancel": "Cancelar" + }, + "options" : { + "connecting": "Conectando...", + "disconnected": "Billetera de hardware no detectada. Por favor, conecte una billetera de hardware para usar esta opción.", + "unconfigured-detected-title": "Billetera de hardware no configurada", + "unconfigured-detected": "Se ha detectado una billetera de hardware sin semilla. Seleccione \"Configurar automáticamente\" si desea configurarla como una billetera nueva y comenzar a usarla inmediatamente, o seleccione \"Restaurar una copia de seguridad\" si desea configurarla con la copia de seguridad de una semilla creada anteriormente y así poder acceder a sus fondos de nuevo.", + "configured-detected": "Billetera de hardware detectada. El dispositivo se identifica en la lista de billeteras como:", + "security-warnings-title": "Advertencias de seguridad", + "security-warning-title": "Advertencia de seguridad", + "backup-warning": "Debe hacer una copia de seguridad de la semilla de la billetera de hardware o podría perder acceso a los fondos en caso de problemas. Para hacer esto, seleccione la opción \"Crear copia de seguridad\".", + "pin-warning": "La billetera de hardware conectada no tiene un PIN. El código PIN protege la billetera de hardware en caso de pérdida, robo y pirateo. Para crear un código PIN, seleccione la opción \"Crear código PIN\".", + "options": "Opciones:", + "configure-automatically": "Configurar automáticamente", + "restore-backup": "Restaurar una copia de seguridad", + "create-backup": "Crear copia de seguridad", + "wipe": "Borrar el dispositivo", + "confirm-seed": "Confirmar la semilla", + "create-pin": "Crear código PIN", + "change-pin": "Cambiar el código PIN", + "forgotten-pin1": "Si no puede acceder a la billetera porque ha olvidado el PIN, puede borrar la billetera del hardware y luego restaurarla con la semilla haciendo clic", + "forgotten-pin2": "aquí." + }, + "generate-seed" : { + "text": "Antes de continuar, puede seleccionar el número de palabras que desea que tenga la semilla. La semilla es una lista de palabras que se pueden usar para recuperar el acceso a las monedas en caso de problemas. Ambos valores son seguros, por lo que si no tiene una razón especial para seleccionar uno u otro, puede dejar el valor predeterminado.", + "configuring": "Configurando..." + }, + "restore-seed" : { + "text": "Antes de continuar, por favor seleccione la cantidad de palabras de la semilla que desea recuperar.", + "check-text": "Puede usar esta opción para ingresar una semilla y verificar si es igual a la de la billetera de hardware. Antes de comenzar, seleccione el número de palabras de la semilla que desea verificar.", + "warning" : "ADVERTENCIA: para evitar posibles problemas, use solo semillas creadas con una billetera de hardware de la misma marca/modelo.", + "error-wrong-word": "Error: la palabra introducida no coincide con la solicitada por la billetera de hardware.", + "error-invalid-seed": "Error: La semilla no es válida. Por favor, asegúrese de ingresar las palabras correctas en el orden correcto.", + "error-wrong-seed": "Error: la semilla es válida pero no coincide con la del dispositivo." + }, + "added" : { + "title": "Nueva Billetera de Hardware", + "configuring": "Nueva billetera de hardware detectada. Configurando...", + "done": "Hecho", + "added1": "La billetera de hardware conectada se ha agregado a la lista de billeteras con el siguiente nombre:", + "added2": "Ahora puede consultar el saldo y las direcciones de la billetera de hardware incluso cuando no está conectada. Además, puede cambiar el nombre de la billetera o eliminarla de la lista de billeteras, si lo desea." + }, + "wipe" : { + "warning": "ADVERTENCIA: Todos los datos en la billetera de hardware serán eliminados. Si no tiene una copia de seguridad, no podrá volver a acceder a sus fondos.", + "confirm-delete": "Quitar también de la lista de billeteras." + }, + "create-backup" : { + "warning": "ADVERTENCIA: Solo puede usar esta opción para hacer una copia de seguridad de la semilla de su billetera de hardware una vez. Si decide continuar, tendrá que escribir un grupo de palabras (se recomienda hacerlo en papel y no en una computadora) que aparecerán en la pantalla de la billetera de hardware y almacenar la lista en un lugar seguro. Cualquier persona con acceso a la lista de palabras (la \"semilla\") podrá acceder a los fondos de la cartera, por lo que se recomienda extremar las precauciones.", + "instructions": "Escriba la lista de palabras que aparecen en la pantalla de la billetera de hardware. Asegúrate de respetar el orden y escribir cada palabra correctamente." + }, + "seed-word" : { + "title": "Ingresar palabra", + "info1": "Introduzca la palabra indicada en el dispositivo", + "info2": "Se le pedirá que ingrese las palabras de su semilla de respaldo en orden aleatorio, más algunas palabras adicionales.", + "word": "Palabra solicitada", + "error-invalid-word": "La palabra introducida no es válida.", + "error-loading-words": "Cargando la lista de palabras. Por favor espere." + }, + "change-pin" : { + "pin-mismatch": "No se puede realizar la operación. Los dos PIN que ha introducido no coinciden." + }, + "enter-pin" : { + "title": "Ingresar PIN", + "title-change-current": "Ingrese el PIN actual", + "title-change-new": "Ingrese el nuevo PIN", + "title-change-confirm": "Confirme el nuevo PIN", + "instructions": "El patrón de números del PIN se muestra en la pantalla de la billetera de hardware.", + "instructions-tx": "Introduzca el PIN para confirmar y firmar la transacción.", + "instructions-change": "Ingrese un PIN difícil de adivinar de entre 4 y 8 números.", + "help": "¿Necesita ayuda?" + }, + "pin-help" : { + "title": "Ayuda", + "part1": "Cuando sea necesario ingresar el PIN para continuar, la pantalla de la billetera del hardware mostrará una matriz de 9 casillas con números en orden aleatorio (el orden cambia cada vez) y se le pedirá que ingrese el PIN en la billetera de software usando una matriz de 9 botones que simplemente muestran el símbolo #.", + "part2": "Para ingresar el PIN, mire la posición de los números del PIN en la matriz de números en la pantalla de la billetera de hardware y presione los botones correspondientes en la billetera de software. Por ejemplo, si el PIN es \"23\", el número 2 está en la esquina superior izquierda y el número 3 en el centro de la matriz de números de billetera de hardware, presione los botones superior izquierdo y central, en ese orden, en la billetera de software.", + "part3": "Si lo desea, también puede usar el teclado numérico para ingresar el PIN. Sin embargo, como en el ejemplo anterior, si el PIN es \"23\", no puede simplemente escribir \"23\" con el teclado numérico, sino que deberá presionar las teclas que están en la posición donde están los números 2 y 3 en la pantalla de la billetera de hardware." + }, + "create-tx" : { + "title": "Crear transacción" + }, + "confirm-address" : { + "title": "Confirmar dirección", + "instructions": "Por favor confirme en la billetera de hardware si la dirección es:", + "short-confirmation": "Dirección confirmada.", + "confirmation": "Dirección confirmada. Por seguridad, puede volver a mostrar la dirección en la billetera de hardware usando la opción \"Confirmar dirección\", en el menú que puede mostrar presionando el botón a la derecha del balance de la direccion." + } + }, + + "time-from-now": { + "few-seconds": "hace pocos segundos", + "minute": "hace un minuto", + "minutes": "hace {{time}} minutos", + "hour": "hace una hora", + "hours": "hace {{time}} horas", + "day": "hace un día", + "days": "hace {{time}} días" + }, + + "exchange": { + "you-send": "Usted envía", + "you-get": "Usted recibe (aprox.)", + "to-address": "A la dirección de {{coin}}", + "price": "Tasa de cambio", + "time-15": "Duración del intercambio", + "exchange-button": "Intercambiar", + "min-amount": "Monto minimo:", + "max-amount": "Monto maximo:", + "agree-1": "Acepto los", + "agree-2": "Términos de Uso", + "agree-3": "y la ", + "agree-4": "Política de Privacidad", + "powered-by": "Manejado por", + "need-help": "¿Necesita ayuda?", + "support-portal": "Portal de soporte", + "history": "Historial de órdenes", + "order-not-found": "Orden no encontrada", + "status": "Estado", + "exchanging": "Intercambiando {{from}} por {{to}}", + "select": "Seleccionar", + "offline": "El servicio está temporalmente offline", + "problem-connecting": "No se puede conectar con el servicio. Por favor, compruebe su conexión a Internet y vuelva a intentarlo más tarde.", + "invalid-address": "Dirección inválida.", + "statuses": { + "user-waiting": "Esperando el deposito. Por favor, envíe {{amount}} {{from}} a la dirección de intercambio indicada más abajo", + "user-waiting-info": "El sistema está a la espera de que realice el depósito en la dirección de intercambio. El proceso de intercambio comenzará después de que se detecte el depósito y sea confirmado en la cadena de bloques. Si ya ha realizado el depósito, debería ser detectado en breve.", + "market-waiting-confirmations": "Esperando las confirmaciones de la transacción", + "market-waiting-confirmations-info": "El depósito ya ha sido detectado y el sistema está esperando que sea confirmado en la cadena de bloques.", + "market-confirmed": "Transacción aceptada", + "market-confirmed-info": "La transacción ya ha sido confirmada en la cadena de bloques. Haciendo los preparativos para realizar el intercambio pronto.", + "market-exchanged": "{{from}} intercambiado por {{to}}", + "market-exchanged-info": "El intercambio se ha realizado. Los fondos serán transferidos a su dirección en un momento.", + "market-withdraw-waiting": "Enviando {{to}} a su dirección", + "market-withdraw-waiting-info": "Se ha iniciado el proceso para enviar las monedas a su dirección.", + "complete": "¡Intercambio completado!", + "complete-info": "Los fondos han sido enviados con éxito a su dirección.", + "error": "Se produjo un error", + "error-info": "Hubo un error en la operación, puede encontrar más información más abajo. Si necesita ayuda, por favor guarde todos los datos de operación que se muestran más abajo y comuníquese con soporte técnico utilizando el enlace que se encuentra en la parte inferior derecha de esta página." + }, + "history-window": { + "address": "Dirección", + "date": "Fecha" + }, + "details": { + "exchange-addr": "Dirección de intercambio", + "exchange-addr-tag": "Payment ID o Destination Tag que debe usarse para la transacción", + "tx-id": "ID de la transacción", + "order-id": "ID de la orden", + "initial-price": "Tasa de cambio inicial", + "error-msg": "Mensaje de error", + "details": "Detalles", + "start-date": "Fecha de inicio", + "back": "Volver", + "back-alert": "La operación aún está en progreso. ¿Realmente desea volver al formulario? Puede ver el progreso de esta operación nuevamente presionando el botón \"Historial de pedidos\"" + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/es_base.json b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/es_base.json new file mode 100644 index 00000000..402d23ce --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/es_base.json @@ -0,0 +1,506 @@ +{ + "common": { + "coin-id": "SKY", + "coin-hours": "Coin Hours", + "usd": "USD", + "loading": "Loading...", + "new": "New", + "load": "Load" + }, + + "errors": { + "error": "Error", + "fetch-version": "Unable to fetch latest release version from Github", + "incorrect-password": "Incorrect password", + "error-decrypting": "Error decrypting the wallet", + "api-disabled": "API disabled", + "no-wallet": "Wallet does not exist", + "no-outputs": "No unspent outputs", + "window-size": "The window is too narrow for the content" + }, + + "title": { + "language": "Select Language", + "wallets": "Wallets", + "send": "Send", + "history": "History", + "buy-coin": "Buy Skycoin", + "network": "Networking", + "blockchain": "Blockchain", + "outputs": "Outputs", + "transactions": "Transactions", + "pending-txs": "Pending Transactions", + "backup": "Backup Wallet", + "explorer": "Skycoin Explorer", + "seed": "Wallet Seed", + "qrcode": "QR Code", + "reset": "Reset Password", + "exchange": "Exchange", + "select-address": "Select Address", + "order-history": "Order history" + }, + + "header": { + "syncing-blocks": "Syncing blocks", + "update1": "Wallet update", + "update2": "available.", + "synchronizing": "The wallet is synchronizing. Data you see may not be updated.", + "pending-txs1": "There are some", + "pending-txs2": "pending transactions.", + "pending-txs3": "Data you see may not be updated.", + + "errors": { + "no-connections": "No connections active, your client is not connected to any other nodes!", + "no-backend1": "Cannot reach backend. Please restart the app and/or seek help on our", + "no-backend2": "Telegram.", + "no-backend3": "", + "csrf": "Security vulnerability: CSRF is not working, please exit immediately." + } + }, + + "password": { + "title": "Enter Password", + "label": "Password", + "confirm-label": "Confirm password", + "button": "Proceed", + "reset-link": "I forgot my password" + }, + + "buy": { + "deposit-address": "Choose an address to generate a BTC deposit link for:", + "select-address": "Select address", + "generate": "Generate", + "deposit-location": "Deposit Location", + "deposit-location-desc": "Choose a wallet where you'd like us to deposit your Skycoin after we receive your Bitcoin.", + "make-choice": "Make a choice", + "wallets-desc": "Each time a new wallet and address are selected, a new BTC address is generated. A single Skycoin address can have up to 5 BTC addresses assigned to it.", + "send": "Send Bitcoin", + "send-desc": "Send Bitcoin to the address below. Once received, we will deposit the Skycoin to a new address in the wallet selected above at the current rate of {{ rate }} SKY/BTC.", + "fraction-warning": "Only send multiple of the SKY/BTC rate! Skycoin is sent in whole number; fractional SKY is not sent!", + "receive": "Receive Sky", + "receive-desc": "After receiving your Bitcoin, we'll send you your Skycoin. It may take anywhere between 20 minutes and an hour to receive your SKY.", + "status-button": "Status:", + "check-status-button": "Check Status", + "new-order-button": "New Order" + }, + + "wizard": { + "wallet-desc": "If you don't have a Skycoin wallet, use the generated seed to create a new one. If you already have a wallet, toggle over to \"Load Wallet\" and enter your seed.", + "encrypt-desc": "Increase security of your wallet by encrypting it. By entering a password below, your wallet will be encrypted. Only those with the password will be able access the wallet and remove funds.", + "hardware-wallet-link": "Using a hardware wallet?", + "finish-button": "Finish", + "back-button": "Back", + + "confirm": { + "title": "Safeguard your seed!", + "desc": "We want to make sure that you wrote down your seed and stored it in a safe place. If you forget your seed, you WILL NOT be able to recover your Skycoin wallet!", + "checkbox": "It’s safe, I swear.", + "button": "Continue" + } + }, + + "wallet": { + "new-address": "New Address", + "new-addresses": "New Addresses", + "show-empty": "Show Empty", + "hide-empty": "Hide Empty", + "encrypt": "Encrypt Wallet", + "decrypt": "Decrypt Wallet", + "decrypt-warning": "Warning: for security reasons, it is not recommended to keep the wallets unencrypted. Caution is advised.", + "delete": "Delete Wallet", + "edit": "Edit Wallet", + "add": "Add Wallet", + "load": "Load Wallet", + "encryption-enabled": "Encryption enabled", + "encryption-disabled": "Encryption disabled", + "hw-security-warning": "Possible security risk. Access the hardware wallet options (by pressing the \"Hardware Wallet\" button below the wallets list) while the device is connected for more information.", + "wallet": "Wallet", + "hardware-wallet": "Hardware Wallet", + "delete-confirmation": "WARNING: The wallet \"{{ name }}\" will be removed from the list. To add it again, you will have to reconnect the device and open the hardware wallet options (by pressing the \"Hardware Wallet\" button below the wallets list). Do you want to continue?", + "delete-confirmation-check": "Yeah, I want to delete the wallet.", + "max-hardware-wallets-error": "You have already reached the max number of addresses that can be added to the hardware wallet.", + "add-many-confirmation": "WARNING: If you add too many addresses without using the previous ones or if you use the last ones and not the first ones, some addresses may not be recovered automatically if you try to restore the wallet using the seed (you will have to add them manually). Do you want to continue?", + + "new": { + "create-title": "Create Wallet", + "load-title": "Load Wallet", + "encrypt-title": "Encrypt Wallet", + "name-label": "Name", + "seed-label": "Seed", + "confirm-seed-label": "Confirm seed", + "seed-warning": "Remember this seed! Keep it in a safe place. If you forget your seed, you will not be able to recover your wallet!", + "create-button": "Create", + "load-button": "Load", + "cancel-button": "Cancel", + "12-words": "12 words", + "24-words": "24 words", + "generate-12-seed": "Generate 12 word seed", + "generate-24-seed": "Generate 24 word seed", + "encrypt": "Encrypt wallet", + "encrypt-warning": "We suggest that you encrypt each one of your wallets with a password. If you forget your password, you can reset it with your seed. Make sure you have your seed saved somewhere safe before encrypting your wallet.", + "unconventional-seed-title": "Possible error", + "unconventional-seed-text": "You introduced an unconventional seed. If you did it for any special reason, you can continue (only recommended for advanced users). However, if your intention is to use a normal system seed, you must delete all the additional text and special characters.", + "unconventional-seed-check": "Continue with the unconventional seed." + }, + + "rename": { + "title": "Rename Wallet", + "name-label": "Name", + "cancel-button": "Cancel", + "rename-button": "Rename" + }, + + "add-addresses": { + "title": "Select quantity", + "name-quantity": "How many addresses to create", + "cancel-button": "Cancel", + "create-button": "Create" + }, + + "address": { + "show": "Press to show", + "copy": "Copy", + "copy-address": "Copy address", + "copied": "Copied!", + "confirm": "Confirm address", + "outputs": "Unspent outputs", + "history": "History" + } + }, + + "send": { + "synchronizing-warning": "The wallet is still synchronizing the data, so the balance shown may be incorrect. Are you sure you want to continue?", + "from-label": "Send from", + "to-label": "Send to", + "amount-label": "Amount", + "notes-label": "Notes", + "wallet-label": "Wallet", + "addresses-label": "Addresses", + "invalid-amount": "Please enter a valid amount", + "addresses-help": "Limit the addresses from where the coins and hours could be sent", + "all-addresses": "All the addresses of the selected wallet", + "outputs-label": "Unspent outputs", + "outputs-help": "Limit the unspent outputs from where the coins and hours could be sent. Only the outputs from the selected addresses are shown", + "all-outputs": "All the outputs of the selected addresses", + "available-msg-part1": "With your current selection you can send up to", + "available-msg-part2": "and", + "available-msg-part3": "(at least", + "available-msg-part4": "must be used for the transaction fee).", + "change-address-label": "Custom change address", + "change-address-select": "Select", + "change-address-help": "Address to receive change. If it's not provided, it will be chosen automatically. Click on the \"Select\" link to choose an address from one of your wallets", + "destinations-label": "Destinations", + "destinations-help1": "Destination addresses and their coins", + "destinations-help2": "Destination addresses, their coins and coin hours", + "hours-allocation-label": "Automatic coin hours allocation", + "options-label": "Options", + "value-label": "Coin hours share factor", + "value-help": "The higher the value, the more coin hours will be sent to outputs", + "preview-button": "Preview", + "send-button": "Send", + "back-button": "Back", + "simple": "Simple", + "advanced": "Advanced", + "select-wallet": "Select Wallet" + }, + + "reset": { + "wallet-label": "Wallet", + "seed-label": "Wallet seed", + "password-label": "New password (leave empty if you want the wallet not to be encrypted)", + "confirm-label": "Confirm new password", + "reset-button": "Reset" + }, + + "tx": { + "transaction": "Transaction", + "confirm-transaction": "Confirm Transaction", + "from": "From", + "to": "To", + "date": "Date", + "status": "Status", + "coins": "Coins", + "hours": "Hours", + "id": "Tx ID", + "show-more": "Show more", + "hours-moved": "moved", + "hours-sent": "sent", + "hours-received": "received", + "hours-burned": "burned", + "inputs": "Inputs", + "outputs": "Outputs", + "confirmed": "Confirmed", + "pending": "Pending", + "current-rate": "Calculated at the current rate" + }, + + "backup": { + "wallet-directory": "Wallet Directory:", + "seed-warning": "BACKUP YOUR SEED. ON PAPER. IN A SAFE PLACE. As long as you have your seed, you can recover your coins.", + "desc": "Use the table below to get seeds from your encrypted wallets.
To get seeds from unencrypted wallets, open the folder above, open the .wlt files in a text editor and recover the seeds.", + "close-button": "Close", + "wallet": "Wallet Label", + "filename": "Filename", + "seed": "Seed", + "show-seed": "Show seed", + "no-wallets": "No encrypted wallets" + }, + + "blockchain": { + "blocks": "Number of blocks", + "time": "Timestamp of last block", + "hash": "Hash of last block", + "current-supply": "Current SKY supply", + "total-supply": "Total SKY supply", + "current-coinhour-supply": "Current Coin Hours supply", + "total-coinhour-supply": "Total Coin Hours supply" + }, + + "network": { + "peer": "Peer", + "source": "Source", + "block-height": "Block height", + "block-height-short": "Block", + "last-seen": "Last seen", + "last-received": "Last received", + "last-sent": "Last sent", + "in": "Incoming", + "out": "Outgoing", + + "sources": { + "default": "Default peer", + "exchange": "Peer exchange" + } + }, + + "pending-txs": { + "timestamp": "Timestamp", + "txid": "Transaction ID", + "none": "No pending transactions", + "my": "Mine", + "all": "All" + }, + + "history": { + "tx-detail": "Transaction Detail", + "moving": "Internally moving", + "moved": "Internally moved", + "sending": "Sending", + "sent": "Sent", + "received": "Received", + "receiving": "Receiving", + "pending": "Pending", + "no-txs": "You have no transaction history", + "no-txs-filter": "There are no transactions matching the current filter criteria", + "no-filter": "No filter active (press to select wallets/addresses)", + "filter": "Active filter: ", + "filters": "Active filters: ", + "all-addresses": "All addresses" + }, + + "teller": { + "done": "Completed", + "waiting-confirm": "Waiting for confirmation", + "waiting-deposit": "Waiting for Bitcoin deposit", + "waiting-send": "Waiting to send Skycoin", + "unknown": "Unknown" + }, + + "confirmation" : { + "header-text": "Confirmation", + "confirm-button": "Yes", + "cancel-button": "No", + "close": "Close" + }, + + "service": { + "api" : { + "server-error": "Server error" + }, + "wallet": { + "not-enough-hours": "Not enough available Coin Hours to perform the transaction!" + } + }, + + "hardware-wallet": { + "general" : { + "default-wallet-name": "New hardware wallet", + "error-disconnected": "Unable to perform the operation. The hardware wallet is not connected.", + "simple-error": "Error, Unable to perform the operation.", + "generic-error": "Unable to perform the operation. Make sure you have connected a valid hardware wallet and that it is not waiting for input.", + "generic-error-internet": "Unable to perform the operation. Make sure you have connected a valid hardware wallet that is not waiting for input and that you have a connection to the internet/node.", + "error-incorrect-wallet": "Unable to perform the operation. The connected hardware wallet is different from the expected one.", + "error-incorrect-pin": "Unable to perform the operation. The PIN you have entered is not correct.", + "confirm": "Please, confirm the operation in the hardware wallet.", + "confirm-and-more": "Please, confirm the operation in the hardware wallet and follow the instructions.", + "close": "Close", + "cancel": "Cancel", + "continue": "Continue", + "completed": "Operation completed successfully.", + "refused": "The operation failed or was canceled." + }, + "errors": { + "too-many-inputs": "The transaction has too many inputs and can not be processed. Please contact technical support.", + "too-many-outputs": "The transaction has too many outputs and can not be processed. Please contact technical support." + }, + "security-warning" : { + "title": "Security warning", + "text": "The last time this hardware wallet was connected, one or more security warnings were found. We recommend you to open the hardware wallet options (by pressing the \"Hardware Wallet\" button below the wallets list) while the device is connected and solve the security problems before continuing.", + "check": "I understand the risks and want to continue", + "continue": "Continue", + "cancel": "Cancel" + }, + "options" : { + "connecting": "Connecting...", + "disconnected": "No hardware wallet detected. Please connect a hardware wallet to use this option.", + "unconfigured-detected-title": "Unconfigured hardware wallet", + "unconfigured-detected": "A seedless hardware wallet has been detected. Select \"Configure automatically\" if you want to configure it as a brand new wallet and start using it immediately, or select \"Restore backup\" if you want to configure it with a previously created seed backup and thus be able to access your funds again.", + "configured-detected": "Hardware wallet detected. The device is identified in the wallets list as:", + "security-warnings-title": "Security warnings", + "security-warning-title": "Security warning", + "backup-warning": "You should backup the hardware wallet seed or you could lose access to the funds in case of problems. To do this, select the \"Create a backup\" option.", + "pin-warning": "The connected hardware wallet does not have a PIN. The PIN code protects the hardware wallet in case of loss, theft and hacks. To create a PIN code, select the \"Create PIN code\" option.", + "options": "Options:", + "configure-automatically": "Configure automatically", + "restore-backup": "Restore backup", + "create-backup": "Create a backup", + "wipe": "Wipe the device", + "confirm-seed": "Confirm seed", + "create-pin": "Create PIN code", + "change-pin": "Change PIN code", + "forgotten-pin1": "If you can not access the wallet because you have forgotten the PIN, you can wipe the hardware wallet and then restore it with the seed by clicking", + "forgotten-pin2": "here." + }, + "generate-seed" : { + "text": "Before proceeding, you can select the number of words you want the seed to have. The seed is a list of words that can be used to recover access to the coins in case of problems. Both values are safe, so if you do not have a special reason for selecting one or the other, you can leave the default value.", + "configuring": "Configuring..." + }, + "restore-seed" : { + "text": "Before proceeding, please select the number of words that the seed you want to recover has.", + "check-text": "You can use this option to enter a seed and check if it is equal to the one in the hardware wallet. Before start, select the number of words the seed you want to check has.", + "warning" : "WARNING: to avoid potential problems, use only seeds created with a hardware wallet from the same brand/model.", + "error-wrong-word": "Error: The retyped word does not match the one requested by the hardware wallet.", + "error-invalid-seed": "Error: The seed is not valid. Please be sure to enter the correct words in the correct order.", + "error-wrong-seed": "Error: The seed is valid but does not match the one in the device." + }, + "added" : { + "title": "New Hardware Wallet", + "configuring": "New hardware wallet detected. Configuring...", + "done": "Done", + "added1": "The connected hardware wallet has been added to the wallets list with the following name:", + "added2": "Now you can check the balance and the addresses of the hardware wallet even when it is not connected. Additionally, you can change the name of the wallet or remove it from the wallets list, if you wish." + }, + "wipe" : { + "warning": "WARNING: All the data in the hardware wallet will be deleted. If you do not have a backup, you will not be able to access your funds again.", + "confirm-delete": "Also remove from the wallets list" + }, + "create-backup" : { + "warning": "WARNING: You can only use this option to backup your hardware wallet seed once. If you decide to continue, you will have to write down a group of words (it is recommended to do it on paper and not on a computer) that will appear on the screen of the hardware wallet and store the list in a safe place. Anyone with access to the word list (the \"seed\") will be able access the wallet balance, so extreme caution is advised.", + "instructions": "Write down the word list that appear on the screen of the hardware wallet. Make sure you respect the order and write each word correctly." + }, + "seed-word" : { + "title": "Enter word", + "info1": "Enter the word indicated in the device", + "info2": "You will be asked to enter the words of your backup seed in random order, plus a few additional words.", + "word": "Requested word", + "error-invalid-word": "The entered word is not valid.", + "error-loading-words": "Loading the word list. Please wait." + }, + "change-pin" : { + "pin-mismatch": "Unable to perform the operation. Two PINs you have entered do not match." + }, + "enter-pin" : { + "title": "Enter PIN", + "title-change-current": "Enter the current PIN", + "title-change-new": "Enter the new PIN", + "title-change-confirm": "Confirm the new PIN", + "instructions": "The PIN layout is displayed on the hardware wallet screen.", + "instructions-tx": "Enter the PIN to confirm and sign the transaction.", + "instructions-change": "Please enter a hard-to-guess PIN of between 4 and 8 numbers.", + "help": "Need help?" + }, + "pin-help" : { + "title": "Help", + "part1": "When it is necessary to enter the PIN to continue, the hardware wallet screen will display a matrix of 9 boxes with numbers in random order (the order changes each time) and you will be asked to enter the PIN in the software wallet using a matrix of 9 buttons that simply show the symbol #.", + "part2": "To enter the PIN, look at the position of the PIN numbers in numbers matrix on the screen of the hardware wallet and press the corresponding buttons in the software wallet. For example, if the PIN is \"23\" and the number 2 is in the upper left, number 3 in the middle of the hardware wallet numbers matrix, press the upper left and middle button in that order in the software wallet.", + "part3": "If you wish, you can also use the numpad on your keyboard to enter the PIN. However, as in the previous example, if the PIN is \"23\", you can not simply type \"23\" with the numpad, but you will have to press the keys that are in the position where the numbers 2 and 3 are shown on the screen of the hardware wallet." + }, + "create-tx" : { + "title": "Create transaction" + }, + "confirm-address" : { + "title": "Confirm address", + "instructions": "Please confirm on the hardware wallet if the address is:", + "short-confirmation": "Address confirmed.", + "confirmation": "Address confirmed. For security, you can re-show the address in the hardware wallet using the \"Confirm address\" option, in the menu that you can display by pressing the button at the right of the address balance." + } + }, + + "time-from-now": { + "few-seconds": "a few seconds ago", + "minute": "one minute ago", + "minutes": "{{time}} minutes ago", + "hour": "one hour ago", + "hours": "{{time}} hours ago", + "day": "one day ago", + "days": "{{time}} days ago" + }, + + "exchange": { + "you-send": "You send", + "you-get": "You get (approx.)", + "to-address": "To {{coin}} address", + "price": "Exchange rate", + "time-15": "Exchange time", + "exchange-button": "Exchange", + "min-amount": "Minimum amount:", + "max-amount": "Maximum amount:", + "agree-1": "I agree with", + "agree-2": "Terms of Use", + "agree-3": "and", + "agree-4": "Privacy Policy", + "powered-by": "Powered by", + "need-help": "Need help?", + "support-portal": "Support portal", + "history": "Order history", + "order-not-found": "Order not found", + "status": "Status", + "exchanging": "Exchanging {{from}} for {{to}}", + "select": "Select", + "offline": "Exchange is temporarily offline", + "problem-connecting": "Unable to connect with the service. Please check your Internet connection and try again later.", + "invalid-address": "Invalid address.", + "statuses": { + "user-waiting": "Waiting for deposit. Please send {{amount}} {{from}} to the exchange address shown below", + "user-waiting-info": "The system is waiting for you to make the deposit into the exchange address. The exchange process will start after the deposit is detected and confirmed in the blockchain. If you have already made the deposit, it should be detected shortly.", + "market-waiting-confirmations": "Waiting for transaction confirmations", + "market-waiting-confirmations-info": "The deposit has already been detected and the system is waiting for it to be confirmed in the blockchain.", + "market-confirmed": "Transaction accepted", + "market-confirmed-info": "The transaction has already been confirmed in the blockchain. Preparing to make the exchange soon.", + "market-exchanged": "Traded {{from}} for {{to}}", + "market-exchanged-info": "The exchange has been made. The funds will be transferred to your address in a moment.", + "market-withdraw-waiting": "Sending {{to}} to your address", + "market-withdraw-waiting-info": "The process for sending the coins to your address has been initiated.", + "complete": "Exchange completed!", + "complete-info": "The funds have been successfully sent to your address.", + "error": "Error occurred", + "error-info": "There was an error in the operation, you can find more information below. If you need help, please save all the operation data shown below and contact technical support using the link in the lower right part of this page." + }, + "history-window": { + "address": "Address", + "date": "Date" + }, + "details": { + "exchange-addr": "Exchange address", + "exchange-addr-tag": "Payment ID or Destination Tag which must be used for the transaction", + "tx-id": "Transaction ID", + "order-id": "Order ID", + "initial-price": "Initial exchange rate", + "error-msg": "Error message", + "details": "Details", + "start-date": "Start date", + "back": "Back", + "back-alert": "The operation is still in progress. Do you really want to return to the form? You can see the progress of this operation again by pressing the \"Order history\" button" + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/ru.json b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/ru.json new file mode 100644 index 00000000..69cd50e5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/ru.json @@ -0,0 +1,250 @@ +{ + "common": { + "coin-id": "SKY", + "coin-hours": "CH", + "loading": "Загрузка...", + "new": "Ðовый", + "load": "Импортировать" + }, + + "errors": { + "fetch-version": "Ðе удалоÑÑŒ получить поÑледнюю верÑию Ñ Github", + "incorrect-password": "Ðеверный пароль", + "api-disabled": "API выключен", + "no-wallet": "Кошелёк не ÑущеÑтвует", + "no-outputs": "Ðе доÑтаточно ÑредÑтв" + }, + + "title": { + "wallets": "Кошельки", + "send": "Отправить", + "history": "ИÑториÑ", + "buy-coin": "Купить Skycoin", + "network": "Сеть", + "blockchain": "Блокчейн", + "outputs": "Выходы (Outputs)", + "transactions": "Транзакции", + "pending-txs": "Ðеподтверждённые транзакции", + "backup": "Резервное копирование", + "explorer": "Skycoin ÑкÑплорер", + "seed": "Фраза воÑтановлениÑ", + "qrcode": "QR-код" + }, + + "header": { + "syncing-blocks": "Идёт ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¾Ð²...", + "update1": "Обновление кошелька", + "update2": "доÑтупно.", + "pending-txs1": "СущеÑтвует", + "pending-txs2": "транзакции, требующие подтверждениÑ.", + "pending-txs3": "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ‚ быть не актуальной. УбедитеÑÑŒ что у Ð²Ð°Ñ Ð¿Ñ€Ð¸ÑутÑтвует Ñоединение Ñ Ñетью.", + + "errors": { + "no-connections": "Ðет активных Ñоединений, ваш клиент не подключен к другим узлам!", + "no-backend1": "Ðет доÑтупа к ÑервиÑу. ПерезапуÑтите приложение или обратитÑеь за помощью в нашей группе", + "no-backend2": "в телеграмме.", + "no-backend3": "", + "csrf": "Возможные уÑзвимоÑти безопаÑноÑти: CSRF не работает." + } + }, + + "password": { + "title": "Введите пароль", + "label": "Пароль", + "confirm-label": "Подтвердите пароль", + "button": "Продолжить" + }, + + "buy": { + "deposit-address": "Выберите кошелёк Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ð¸ депозитного адреÑа:", + "select-address": "Выберите адреÑ", + "generate": "Сгенерировать", + "deposit-location": "ÐÐ´Ñ€ÐµÑ Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ", + "deposit-location-desc": "Выберите кошелёк Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Skycoin, поÑле уÑпешно отправленного депозита.", + "make-choice": "Сделайте выбор", + "wallets-desc": "При выборе адреÑа, каждый раз генерируетÑÑ Ð½Ð¾Ð²Ñ‹Ð¹ Ð°Ð´Ñ€ÐµÑ Ð´Ð»Ñ Ð´ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð°. Один Ð°Ð´Ñ€ÐµÑ Ð¼Ð¾Ð¶ÐµÑ‚ быть прикреплён к ограниченному количеÑтву адреÑов.", + "send": "Пошлите выбранную криптовалюту", + "send-desc": "Отправьте выбранную вами криптовалюту на Ð°Ð´Ñ€ÐµÑ ÑƒÐºÐ°Ð·Ð°Ð½Ñ‹Ð¹ ниже. По получению и поÑле доÑтаточного Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶ÐµÐ½Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¾Ð², вы получите Skycoin на указаный Ð°Ð´Ñ€ÐµÑ Ð¿Ð¾ курÑу {{ rate }} Skycoin/Selected Coin.", + "fraction-warning": "Рекомендовано поÑылать целые значениÑ.", + "receive": "Получить Skycoin", + "receive-desc": "ПоÑле Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð¾Ð¹ криптавалюты, вы получите Skycoin. Это может занÑÑ‚ÑŒ от неÑкольких Ñекунд до неÑкольких дней, в завиÑимоÑти от выбранного ÑпоÑоба оплаты и загруженноÑти Ñети.", + "status-button": "СтатуÑ:", + "check-status-button": "Проверить ÑтатуÑ", + "new-order-button": "Ðовый заказ", + "refresh": "Обновить", + "available-now": "ДоÑтупно:", + "choose-preference": "Выберите ÑпоÑоб оплаты. Имейте в виду, что некоторые ÑпоÑобы могут быть временно отключены.", + "choose": "Выберите вашу любимую крипту ;)", + "send-coin":"Отправить", + "send-coin-text-1": "на Ð°Ð´Ñ€ÐµÑ Ð½Ð¸Ð¶Ðµ. ПоÑле доÑтаточного количеÑтва подтверждений на блокчейне, вы получите Skycoin на выбранный вами кошелёк по курÑу" + }, + + "wizard": { + "wallet-desc": "ЕÑли у Ð²Ð°Ñ Ð½ÐµÑ‚ кошелька Skycoin, иÑпользуйте Ñгенерированную фразу Ð´Ð»Ñ ÐµÐ³Ð¾ ÑозданиÑ. ЕÑли фраза у Ð²Ð°Ñ ÑƒÐ¶Ðµ еÑÑ‚ÑŒ, нажмите \"Импортирование кошелька\" и введите вашу фразу.", + "encrypt-desc": "Ð”Ð»Ñ Ð±Ð¾Ð»ÑŒÑˆÐµÐ¹ безопаÑти, рекомендуем добавить пароль Ð´Ð»Ñ ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ. СредÑтва можно будет отправлÑÑ‚ÑŒ только при наличии паролÑ. УбедитеÑÑŒ, что вы его помните.", + "finish-button": "Закончить", + "back-button": "Ðазад", + + "confirm": { + "title": "Держите Ñвою фразу в Ñохраном меÑте!", + "desc": "УбедитеÑÑŒ, что вы запиÑали фразу воÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ держите её в надёжном меÑте. При утере фразы вы потерÑете доÑтуп к вашему кошельку Skycoin!", + "checkbox": "КлÑнуÑÑŒ. Я запиÑал.", + "button": "Продолжить" + } + }, + + "wallet": { + "new-address": "Ðовый адреÑ", + "show-empty": "Показать пуÑтые", + "hide-empty": "Скрыть пуÑтые", + "encrypt": "Зашифровать кошелёк", + "decrypt": "РаÑшифровать кошелёк", + "edit": "Редактирвоать", + "add": "Ðовый кошелёк", + "load": "Импортировать", + "encryption-enabled": "Зашифрован", + "encryption-disabled": "Без шифрованиÑ", + "wallet": "Кошелёк", + + "new": { + "create-title": "Создать кошелёк", + "load-title": "Импортировать кошелёк", + "encrypt-title": "Шифровать кошелёк", + "name-label": "Ð˜Ð¼Ñ ÐºÐ¾ÑˆÐµÐ»ÑŒÐºÐ°", + "seed-label": "Фраза воÑтановлениÑ", + "confirm-seed-label": "Подтвердите фразу", + "seed-warning": "Запомните Ñта фразу или запишите и держите в надежном меÑте, в дали от чужих глаз. При потере фразы вы не Ñможете воÑтановить Skycoin кошелёк!", + "create-button": "Создать", + "load-button": "Импортировать", + "cancel-button": "Отмена", + "12-words": "12 Ñлов", + "24-words": "24 Ñлова", + "generate-12-seed": "Сгенирировать фразу из 12 Ñлов", + "generate-24-seed": "Сгенирировать фразу из 24 Ñлов", + "encrypt": "Включить шифрование", + "encrypt-warning": "Мы рекомендуем шифровать вÑе ваши кашельки при помощи надёжного паролÑ. Так же убедитеÑÑŒ, что фраза воÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ð¸Ñана и хранитÑÑ Ð² надёжном меÑте." + }, + + "rename": { + "title": "Переименование кошелька", + "name-label": "ИмÑ", + "cancel-button": "Отмена", + "rename-button": "Переименовать" + }, + + "address": { + "copy": "Копировать", + "copy-address": "Копировать адреÑ", + "copied": "Скопировано!", + "outputs": "Ðепотраченые выходы (Unspent Outputs)" + } + }, + + "send": { + "from-label": "Отправить Ñ", + "to-label": "Получить на", + "amount-label": "Сумма", + "notes-label": "Заметки", + "wallet-label": "Кошелёк", + "addresses-label": "ÐдреÑ", + "addresses-help": "ÐÐ´Ñ€ÐµÑ ÐºÐ¾ÑˆÐµÐ»ÑŒÐºÐ° Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ", + "change-address-label": "ÐÐ´Ñ€ÐµÑ Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¾Ñтатка", + "change-address-help": "ÐÐ´Ñ€ÐµÑ Ð´Ð»Ñ Ñдачи. ЕÑли вы его не укажите, то он будет выбран автоматичеÑки", + "destinations-label": "ÐдреÑа получателей", + "destinations-help1": "ÐдреÑа получателей и Ñумма Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ", + "destinations-help2": "ÐдреÑа получателей, Ñумма Skycoin & CH Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ", + "hours-allocation-label": "ÐвтоматичеÑки подÑчитывать чаÑÑ‹ (CH)", + "options-label": "Дополнительно", + "value-label": "Фактор отправки чаÑов (CH)", + "value-help": "Чем больше фактор, тем больше CH будет отправлено вмеÑте Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸ÐµÐ¹", + "preview-button": "ПредпроÑмотр", + "send-button": "Отправить", + "back-button": "Ðазад", + "simple": "Обычный", + "advanced": "Продвинутый" + }, + + "tx": { + "transaction": "ТранзакциÑ", + "confirm-transaction": "Подтердите транзакцию", + "from": "Отправитель", + "to": "Получатель", + "date": "Дата", + "status": "СтатуÑ", + "coins": "Сумма", + "hours": "ЧаÑÑ‹", + "id": "TX ID", + "show-more": "Инфо", + "hours-sent": "отправлÑем", + "hours-burned": "Ñжигаем", + "inputs": "Входы", + "outputs": "Выходы", + "confirmed": "Подтверждена", + "pending": "Ожидание", + "current-rate": "По текущему курÑу" + }, + + "backup": { + "wallet-directory": "Папка кошелька:", + "seed-warning": "ДЕРЖИТЕ ФРÐЗУ ВОСТÐÐОВЛЕÐИЯ Ð’ ÐÐДÐЖÐОМ МЕСТЕ. ÐРБУМÐГЕ. ОФФЛÐЙÐ. ЕÑли вы держите фразу в надёжном меÑте, и никто не Ñмог её подглÑдеть - вашы токены в безопаÑноÑти.", + "desc": "Из таблицы ниже вы можете получить фразы Ð´Ð»Ñ Ð²Ð°ÑˆÐ¸Ñ… зашифрованных кошельков.
Ð”Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ñ„Ñ€Ð°Ð· воÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð² кошельках без шифрованиÑ, откройте папку указаную выше и найдите в ней файлы Ñ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸ÐµÐ¼ .wlt. Фраза хранитÑÑ Ð² них. Откройте при помощи любого (надёжного) текÑтового редактора", + "close-button": "Закрыть", + "wallet": "Ðазвание кошелька", + "filename": "Ð˜Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°", + "seed": "Фраза", + "show-seed": "Показать фразу", + "no-wallets": "Кошельков Ñ ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸ÐµÐ¼ нет" + }, + + "blockchain": { + "blocks": "КоличеÑтво блоков", + "time": "Ð’Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ñледнего блока", + "hash": "Ð¥Ñш поÑледнего блока", + "current-supply": "Ð’Ñего Skycoin в обращении", + "total-supply": "Ð’Ñего Skycoin ÑущеÑтвует", + "current-coinhour-supply": "Ð’Ñего CH в обращении", + "total-coinhour-supply": "Ð’Ñего CH ÑущеÑтвует" + }, + + "network": { + "peer": "Пир (Peer)", + "source": "ИÑточник", + "block-height": "Ð’Ñ‹Ñота блока", + "last-seen": "ПоÑледний блок", + "last-received": "ПоÑледний полученый", + "last-sent": "ПоÑледний отправленый", + "in": "ВходÑщие", + "out": "ИÑходÑщие", + + "sources": { + "default": "Пир по-умолчанию", + "exchange": "Обмена пирами" + } + }, + + "pending-txs": { + "timestamp": "Метка времени", + "txid": "ID транзакции", + "none": "Ðе найдено траназкций ждущих подтверждений", + "my": "Мой", + "all": "Ð’Ñе" + }, + + "history": { + "tx-detail": "Детали о транзакции", + "sending": "ОтправлÑем", + "sent": "Отправлено", + "received": "Получено", + "receiving": "Получаем", + "pending": "ОжидаетÑÑ", + "no-txs": "У Ð²Ð°Ñ Ð½ÐµÑ‚ иÑтории транзакций" + }, + + "teller": { + "done": "Завершено", + "waiting-confirm": "Ожидаем подтверждений", + "waiting-deposit": "Ожидаем депозит", + "waiting-send": "ПоÑылаем Skycoin", + "unknown": "ÐеизвеÑтно" + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/zh.json b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/zh.json new file mode 100644 index 00000000..9990b312 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/zh.json @@ -0,0 +1,506 @@ +{ + "common": { + "coin-id": "SKY", + "coin-hours": "å¸æ—¶", + "usd": "美元", + "loading": "加载中...", + "new": "æ–°", + "load": "加载" + }, + + "errors": { + "error": "错误", + "fetch-version": "无法从Github获å–最新版本", + "incorrect-password": "密ç é”™è¯¯", + "error-decrypting": "解密钱包时出错", + "api-disabled": "APIç¦ç”¨", + "no-wallet": "æ— å¯æ”¯ä»˜é’±åŒ…", + "no-outputs": "无未交易输出", + "window-size": "窗å£å¤ªçª„,内容放ä¸ä¸‹" + }, + + "title": { + "language": "选择语言", + "wallets": "钱包", + "send": "å‘é€", + "history": "历å²", + "buy-coin": "ä¹° Skycoin", + "network": "网络", + "blockchain": "区å—链", + "outputs": "未交易输出", + "transactions": "交易", + "pending-txs": "待处ç†äº¤æ˜“", + "backup": "备份钱包", + "explorer": "Skycoin Explorer", + "seed": "钱包ç§å­", + "qrcode": "QR代ç ", + "reset": "é‡ç½®å¯†ç ", + "exchange": "交易", + "select-address": "选择地å€", + "order-history": "订å•åŽ†å²" + }, + + "header": { + "syncing-blocks": "区å—åŒæ­¥ä¸­", + "update1": "钱包更新", + "update2": "å¯èŽ·å–", + "synchronizing": "钱包正在åŒæ­¥ã€‚你看到的数æ®å¯èƒ½ä¸æ˜¯æœ€æ–°çš„。", + "pending-txs1": "这里有一些", + "pending-txs2": "待处ç†äº¤æ˜“.", + "pending-txs3": "你看到的数æ®å¯èƒ½ä¸æ˜¯æœ€æ–°çš„。", + + "errors": { + "no-connections": "没有连接,你的客户端没有连接到任何其他节点", + "no-backend1": "ä¸èƒ½åˆ°è¾¾åŽç«¯ã€‚请é‡æ–°å¯åŠ¨åº”用程åºæˆ–寻求我们的帮助", + "no-backend2": "Telegram", + "no-backend3": "", + "csrf": "安全æ¼æ´ž: CSRF未工作,请立å³é€€å‡ºã€‚" + } + }, + + "password": { + "title": "输入密ç ", + "label": "密ç ", + "confirm-label": "确认密ç ", + "button": "继续", + "reset-link": "我忘记了密ç " + }, + + "buy": { + "deposit-address": "选择一个地å€æ¥ç”ŸæˆBTC充值链接,用于:", + "select-address": "选择地å€", + "generate": "生æˆ", + "deposit-location": "充值ä½ç½®", + "deposit-location-desc": "选择一个钱包,以在我们收到你的比特å¸åŽå……值Skycoin到该钱包", + "make-choice": "åšé€‰æ‹©", + "wallets-desc": "æ¯å½“选择一个新的钱包和地å€ï¼Œä¸€ä¸ªæ–°çš„BTC地å€å°†ä¼šç”Ÿæˆã€‚一个独立的Skycoin地å€æœ€å¤šå¯ç»‘定5个BTC地å€ã€‚", + "send": "å‘é€Bitcoin", + "send-desc": "å‘é€Bitcoin至如下地å€ã€‚一旦收到,我们将会按当å‰æ±‡çŽ‡: {{ rate }} SKY/BTC充值Skycoin到选中钱包的一个新地å€ã€‚", + "fraction-warning": "请按SKY/BTC汇率的å€æ•°å‘é€BTC! Skycoin是以整数å‘é€; SKYçš„å°æ•°ä½å°†ä¸ä¼šå‘é€", + "receive": "接收Sky", + "receive-desc": "收到你的比特å¸åŽï¼Œæˆ‘们将å‘é€Skycoin给你。你å¯èƒ½éœ€è¦20分钟到一个å°æ—¶æ‰èƒ½æ”¶åˆ°è¿™äº›SKY。", + "status-button": "状æ€:", + "check-status-button": "查看状æ€", + "new-order-button": "新订å•" + }, + + "wizard": { + "wallet-desc": "如果你没有Skycoin钱包,请使用生æˆçš„ç§å­æ¥åˆ›å»ºä¸€ä¸ªæ–°é’±åŒ…。如果你已ç»æœ‰ä¸€ä¸ªé’±åŒ…,切æ¢åˆ°\"加载钱包\"并输入你的ç§å­ã€‚", + "encrypt-desc": "通过加密æ¥å¢žåŠ é’±åŒ…的安全性。输入密ç åŽï¼Œä½ çš„钱包会被加密。åªæœ‰è¾“入密ç æ‰å¯ä»¥è®¿é—®çš„钱包或移动资金。", + "hardware-wallet-link": "使用硬件钱包?", + "finish-button": "完æˆ", + "back-button": "åŽé€€", + + "confirm": { + "title": "ä¿æŠ¤ä½ çš„ç§å­!", + "desc": "请确ä¿ä½ å·²ç»å†™ä¸‹ä½ çš„ç§å­å¹¶å°†å®ƒå‚¨å­˜åœ¨äº†ä¸€ä¸ªå®‰å…¨çš„地方。如果你忘记了ç§å­ï¼Œä½ å°†æ— æ³•æ¢å¤ä½ çš„Skycoin钱包", + "checkbox": "它很安全,我å‘誓。", + "button": "继续" + } + }, + + "wallet": { + "new-address": "新地å€", + "new-addresses": "新地å€", + "show-empty": "展示空地å€", + "hide-empty": "éšè—空地å€", + "encrypt": "加密钱包", + "decrypt": "解密钱包", + "decrypt-warning": "警告: 出于安全考虑,建议将钱包加密。建议谨慎一点。", + "delete": "删除钱包", + "edit": "编辑钱包", + "add": "添加钱包", + "load": "加载钱包", + "encryption-enabled": "加密已å¯ç”¨", + "encryption-disabled": "加密已ç¦ç”¨", + "hw-security-warning": "å¯èƒ½çš„安全风险。当硬件设备已连接时(点击钱包列表下的\"硬件钱包\"按钮)访问硬件钱包选项以获å–更多信æ¯", + "wallet": "钱包", + "hardware-wallet": "硬件钱包", + "delete-confirmation": "警告: 钱包\"{{ name }}\"将从列表中删除。若想é‡æ–°æ·»åŠ ï¼Œéœ€é‡æ–°è¿žæŽ¥è®¾å¤‡å¹¶æ‰“开硬件钱包的选项列表(点击钱包列表下的\"硬件钱包\"按钮)。你想继续å—?", + "delete-confirmation-check": "是的,我想è¦åˆ é™¤é’±åŒ…。", + "max-hardware-wallets-error": "你的硬件钱包里的地å€å·²ç»è¾¾åˆ°å…许的最大值。", + "add-many-confirmation": "警告: 如果你在ä¸ä½¿ç”¨å‰ä¸€ä¸ªåœ°å€çš„情况下添加太多地å€ï¼Œæˆ–者如果你使用的是最åŽä¸€ä¸ªåœ°å€è€Œä¸æ˜¯ç¬¬ä¸€ä¸ªåœ°å€ï¼Œé‚£ä¹ˆå¦‚果你å°è¯•ä½¿ç”¨ç§å­æ¢å¤é’±åŒ…,有些地å€å°†å¯èƒ½æ— æ³•è‡ªåŠ¨æ¢å¤ï¼ˆä½ å¿…须手动添加它们)。 你想继续å—?", + + "new": { + "create-title": "创建钱包", + "load-title": "加载钱包", + "encrypt-title": "加密钱包", + "name-label": "å称", + "seed-label": "ç§å­", + "confirm-seed-label": "确认ç§å­", + "seed-warning": "è®°ä½ç§å­! 把它ä¿å­˜åœ¨å®‰å…¨çš„地方。 如果你忘记了你的ç§å­ï¼Œä½ å°†æ— æ³•æ‰¾å›žä½ çš„钱包!", + "create-button": "创建", + "load-button": "加载", + "cancel-button": "删除", + "12-words": "12å­—", + "24-words": "24å­—", + "generate-12-seed": "生æˆ12å­—ç§å­", + "generate-24-seed": "生æˆ24å­—ç§å­", + "encrypt": "加密钱包", + "encrypt-warning": "我们建议你为æ¯ä¸ªé’±åŒ…设置一个独立的密ç ã€‚如果你忘记密ç ï¼Œä½ å¯ä»¥é€šè¿‡ç§å­é‡ç½®é’±åŒ…。在加密你的钱包之å‰ï¼Œç¡®ä¿ä½ çš„ç§å­ä¿å­˜åœ¨å®‰å…¨çš„地方。", + "unconventional-seed-title": "å¯èƒ½é”™è¯¯", + "unconventional-seed-text": "你引进了一ç§éžä¼ ç»Ÿçš„ç§å­ã€‚如果你出于任何特殊原因这样åšï¼Œä½ å¯ä»¥ç»§ç»­(åªæŽ¨è高级用户)。但是,如果你打算使用普通的系统ç§å­ï¼Œåˆ™å¿…须删除所有附加文本和特殊字符。", + "unconventional-seed-check": "继续使用éžä¼ ç»Ÿç§å­ã€‚" + }, + + "rename": { + "title": "é‡å‘½å钱包", + "name-label": "命å", + "cancel-button": "å–消", + "rename-button": "é‡å‘½å" + }, + + "add-addresses": { + "title": "选择数é‡", + "name-quantity": "创建多少地å€", + "cancel-button": "å–消", + "create-button": "创建" + }, + + "address": { + "show": "点击显示", + "copy": "å¤åˆ¶", + "copy-address": "å¤åˆ¶åœ°å€", + "copied": "å·²å¤åˆ¶!", + "confirm": "确认地å€", + "outputs": "未交易输出", + "history": "历å²" + } + }, + + "send": { + "synchronizing-warning":"钱包ä»åœ¨åŒæ­¥æ•°æ®ï¼Œæ‰€ä»¥æ˜¾ç¤ºçš„ä½™é¢å¯èƒ½ä¸æ­£ç¡®ã€‚你确定è¦ç»§ç»­å—?", + "from-label": "å‘é€è‡ª", + "to-label": "å‘é€è‡³", + "amount-label": "总é¢", + "notes-label": "标注", + "wallet-label": "钱包", + "addresses-label": "地å€", + "invalid-amount": "请输入一个有效数值", + "addresses-help": "é™å®šæºå‘é€åœ°å€", + "all-addresses": "所有地å€(所选钱包的)", + "outputs-label": "未交易输出", + "outputs-help": "é™å®šæœªäº¤æ˜“输出", + "all-outputs": "所有未交易输出(所选地å€çš„)", + "available-msg-part1": "æ ¹æ®ä½ å½“å‰çš„选择,你最多å¯ä»¥å‘é€", + "available-msg-part2": "å’Œ", + "available-msg-part3": "(至少", + "available-msg-part4": "将作为必须的交易手续费)。", + "change-address-label": "自定义找零地å€", + "change-address-select": "选择", + "change-address-help": "自定义找零地å€ã€‚如果ä¸æ供,钱包将会自动选择。点击\"选择\" æ¥é€‰æ‹©ä¸€ä¸ªåœ°å€", + "destinations-label": "目标地å€", + "destinations-help1": "目标地å€å’Œå³å°†å‘é€çš„å¸", + "destinations-help2": "目标地å€å’Œå³å°†å‘é€çš„å¸ä»¥åŠå¸æ—¶", + "hours-allocation-label": "自动分é…å¸æ—¶", + "options-label": "选项", + "value-label": "å¸æ—¶åˆ†å‘å› å­", + "value-help": "分å‘å› å­å€¼è¶Šé«˜ï¼Œè¶Šå¤šå¸æ—¶å°†è¢«å‘é€", + "preview-button": "预览", + "send-button": "å‘é€", + "back-button": "åŽé€€", + "simple": "简易", + "advanced": "高级的", + "select-wallet": "选择钱包" + }, + + "reset": { + "wallet-label": "钱包", + "seed-label": "钱包ç§å­", + "password-label": "æ–°å¯†ç  (如果你ä¸å¸Œæœ›é’±åŒ…加密,请将密ç ç•™ç©º)", + "confirm-label": "确认新密ç ", + "reset-button": "é‡ç½®" + }, + + "tx": { + "transaction": "交易", + "confirm-transaction": "确认交易", + "from": "æ¥è‡ª", + "to": "到", + "date": "日期", + "status": "状æ€", + "coins": "å¸", + "hours": "å¸æ—¶", + "id": "交易ID", + "show-more": "展示更多", + "hours-moved": "已转移", + "hours-sent": "å·²å‘é€", + "hours-received": "已接收", + "hours-burned": "已燃烧", + "inputs": "输入", + "outputs": "输出", + "confirmed": "已确认", + "pending": "待处ç†", + "current-rate": "按当å‰æ±‡çŽ‡è®¡ç®—" + }, + + "backup": { + "wallet-directory": "钱包目录:", + "seed-warning": "在纸上备份你的ç§å­ï¼Œå¹¶ä¿å­˜åœ¨ä¸€ä¸ªå®‰å…¨çš„地方。åªè¦æœ‰ç§å­ï¼Œä½ å°±å¯ä»¥æ‰¾å›žä½ çš„å¸ã€‚", + "desc": "使用下表从加密的钱包中得到ç§å­ã€‚
为了从未加密的钱包中获得ç§å­ï¼Œæ‰“开上é¢çš„文件夹,在文本编辑器中打开.wlt文件并æ¢å¤ç§å­ã€‚", + "close-button": "Close", + "wallet": "钱包", + "filename": "文件å", + "seed": "ç§å­", + "show-seed": "显示ç§å­", + "no-wallets": "未加密钱包" + }, + + "blockchain": { + "blocks": "区å—æ•°é‡", + "time": "上一个区å—的时间戳", + "hash": "上一个区å—的哈希值", + "current-supply": "ç›®å‰SKY供应é‡", + "total-supply": "SKY的总供应é‡", + "current-coinhour-supply": "ç›®å‰å¸æ—¶ä¾›åº”é‡", + "total-coinhour-supply": "å¸æ—¶æ€»ä¾›åº”é‡" + }, + + "network": { + "peer": "节点", + "source": "节点æ¥æº", + "block-height": "区å—高度", + "block-height-short": "区å—", + "last-seen": "上一次出现", + "last-received": "上一次接收", + "last-sent": "上一次å‘é€", + "in": "è¿›æ¥çš„", + "out": "出去的", + + "sources": { + "default": "默认节点", + "exchange": "交æ¢èŠ‚点" + } + }, + + "pending-txs": { + "timestamp": "时间戳", + "txid": "交易ID", + "none": "无待处ç†äº¤æ˜“", + "my": "我的", + "all": "全部" + }, + + "history": { + "tx-detail": "交易明细", + "moving": "内部转账中", + "moved": "已内部转账", + "sending": "å‘é€ä¸­", + "sent": "å·²å‘é€", + "received": "已接收", + "receiving": "接收中", + "pending": "待处ç†", + "no-txs": "你没有历å²äº¤æ˜“", + "no-txs-filter": "没有与当å‰ç­›é€‰æ¡ä»¶åŒ¹é…的交易", + "no-filter": "未ç»ç­›é€‰ (点击选择钱包/地å€)", + "filter": "已筛选: ", + "filters": "已筛选: ", + "all-addresses": "所有地å€" + }, + + "teller": { + "done": "完æˆ", + "waiting-confirm": "等待确认", + "waiting-deposit": "等待比特å¸å……值", + "waiting-send": "等待å‘é€Skycoin", + "unknown": "未知" + }, + + "confirmation" : { + "header-text": "确认", + "confirm-button": "是", + "cancel-button": "å¦", + "close": "关闭" + }, + + "service": { + "api" : { + "server-error": "æœåŠ¡å™¨é”™è¯¯" + }, + "wallet": { + "not-enough-hours": "没有足够的å¸æ—¶æ¥æ‰§è¡Œäº¤æ˜“" + } + }, + + "hardware-wallet": { + "general": { + "default-wallet-name": "新硬件钱包", + "error-disconnected": "无法执行该æ“作。硬件钱包未连接。", + "simple-error": "错误,无法执行æ“作。", + "generic-error": "无法执行该æ“作。确ä¿ä½ å·²ç»è¿žæŽ¥äº†ä¸€ä¸ªæœ‰æ•ˆçš„硬件钱包,并且它没有在等待输入。", + "generic-error-internet": "无法执行该æ“作。确ä¿ä½ å·²ç»è¿žæŽ¥äº†ä¸€ä¸ªæœ‰æ•ˆçš„硬件钱包,它ä¸åœ¨ç­‰å¾…输入,并且你已ç»è¿žæŽ¥åˆ°ç½‘络/节点", + "error-incorrect-wallet": "无法执行该æ“作。所连接的硬件钱包与预期ä¸åŒã€‚", + "error-incorrect-pin": "无法执行该æ“作。你输入的密ç ä¸æ­£ç¡®ã€‚", + "confirm": "请在硬件钱包中确认æ“作。", + "confirm-and-more": "请在硬件钱包中确认æ“作并按éµå¾ªæŒ‡ç¤ºã€‚", + "close": "关闭", + "cancel": "å–消", + "continue": "继续", + "completed": "æ“作完æˆã€‚", + "refused": "æ“作失败或被å–消。" + }, + "errors": { + "too-many-inputs": "此笔交易有太多的输入,无法处ç†ã€‚请è”系技术支æŒã€‚", + "too-many-outputs": "此笔交易有太多的输出,无法处ç†ï¼Œè¯·è”系技术支æŒã€‚" + }, + "security-warning": { + "title": "安全警告", + "text": "上次连接此硬件钱包时,å‘现一个或多个安全警告。我们建议你打开硬件钱包选项(点击钱包列表下的\"硬件钱包\"按钮)并ä¿æŒè®¾å¤‡å·²è¿žæŽ¥ï¼Œåœ¨ç»§ç»­ä¹‹å‰ï¼Œè§£å†³å®‰å…¨é—®é¢˜", + "check": "我明白其中的风险,并希望继续下去", + "continue": "继续", + "cancel": "å–消" + }, + "options": { + "connecting": "连接...", + "disconnected": "没有检测到硬件钱包。请连接硬件钱包åŽä½¿ç”¨æ­¤é€‰é¡¹ã€‚", + "unconfigured-detected-title": "未é…置的硬件钱包", + "unconfigured-detected": "检测到无ç§å­çš„硬件钱包。选择\"自动é…ç½®\"如果你想将其é…置为全新的钱包并立å³å¼€å§‹ä½¿ç”¨å®ƒï¼Œæˆ–选择\"æ¢å¤å¤‡ä»½\"如果你想使用先å‰åˆ›å»ºçš„备份ç§å­å¯¹å…¶è¿›è¡Œé…置,从而能够å†æ¬¡è®¿é—®ä½ çš„资产。", + "configured-detected": "检测到硬件钱包。该设备在钱包列表中被识别为:", + "security-warnings-title": "安全警告", + "security-warning-title": "安全警告", + "backup-warning": "你应该备份硬件钱包ç§å­ï¼Œå¦åˆ™ä¸‡ä¸€å‡ºçŽ°é—®é¢˜ï¼Œä½ å¯èƒ½å°†æ— æ³•è®¿é—®ä½ çš„资金,è¦åšåˆ°è¿™ä¸€ç‚¹ã€‚选择\"创建一个备份\"选项。", + "pin-warning": "当å‰è¿žæŽ¥çš„硬件钱包未设置密ç ã€‚密ç å¯ä¿æŠ¤ç¡¬ä»¶é’±åŒ…,以防丢失ã€ç›—窃和黑客入侵。è¦åˆ›å»ºä¸€ä¸ªå¯†ç ï¼Œé€‰æ‹©\"创建PINç \"选项。", + "options": "选项:", + "configure-automatically": "自动é…ç½®", + "restore-backup": "æ¢å¤å¤‡ä»½", + "create-backup": "创建备份", + "wipe": "删除设备", + "confirm-seed": "确认ç§å­", + "create-pin": "创建密ç ", + "change-pin": "更改密ç ", + "forgotten-pin1": "如果你因为忘记密ç è€Œæ— æ³•è¿›å…¥é’±åŒ…,你å¯ä»¥åˆ é™¤ç¡¬ä»¶é’±åŒ…,然åŽé€šè¿‡ç§å­", + "forgotten-pin2": "æ¢å¤" + }, + "generate-seed" : { + "text": "在继续之å‰ï¼Œä½ å¯ä»¥é€‰æ‹©ç”Ÿæˆç§å­çš„å•è¯æ•°ã€‚ç§å­æ˜¯ä¸€ä¸ªå•è¯åˆ—表,出现问题åŽå¯ä»¥ç”¨æ¥æ¢å¤è®¿é—®ä½ çš„å¸ã€‚所有选项都是安全的,如果你没有特殊原因必须选择æŸä¸€é¡¹ï¼Œä½ å¯ä»¥ä½¿ç”¨é»˜è®¤å€¼ã€‚", + "configuring": "é…ç½®..." + }, + "restore-seed" : { + "text": "在继续å‰ï¼Œè¯·é€‰æ‹©ä½ æƒ³è¦æ¢å¤ç§å­çš„å•è¯æ•°é‡ã€‚", + "check-text": "ä½ å¯ä»¥ä½¿ç”¨æ­¤é€‰é¡¹è¾“å…¥ç§å­ï¼Œå¹¶æ£€æŸ¥å®ƒæ˜¯å¦ä¸Žç¡¬ä»¶é’±åŒ…中的一致。在开始之å‰ï¼Œé€‰æ‹©ä½ æƒ³è¦æ£€æŸ¥çš„ç§å­çš„å•è¯æ•°ã€‚", + "warning" : "警告: 为了é¿å…å¯èƒ½å‡ºçŽ°çš„问题,请仅使用åŒä¸€å“牌/åž‹å·çš„硬件钱包创建ç§å­ã€‚", + "error-wrong-word": "错误: é‡æ–°é”®å…¥çš„å•è¯ä¸Žç¡¬ä»¶é’±åŒ…所请求的ä¸åŒ¹é…。", + "error-invalid-seed": "错误: ç§å­æ— æ•ˆã€‚请务必按正确的顺åºè¾“入正确的å•è¯ã€‚", + "error-wrong-seed": "错误: ç§å­æ˜¯æœ‰æ•ˆçš„,但与设备中的ç§å­ä¸åŒ¹é…。" + }, + "added": { + "title": "新硬件钱包", + "configuring": "检测到新的硬件钱包。é…ç½®...", + "done": "已完æˆ", + "added1": "已连接的硬件的钱包已ç»ç”¨å¦‚下å字被添加到钱包列表:", + "added2": "现在你å¯ä»¥æŸ¥çœ‹ç¡¬ä»¶é’±åŒ…中的余é¢å’Œåœ°å€äº†ï¼Œå³ä½¿ç¡¬ä»¶é’±åŒ…并未连接。此外如果你愿æ„,你还å¯ä»¥æ›´æ”¹é’±åŒ…å称或从将其从钱包列表删除。" + }, + "wipe": { + "warning": "警告: 硬件钱包中的所有数æ®å°†è¢«åˆ é™¤ã€‚如果没有备份,你将无法å†æ¬¡è®¿é—®ä½ çš„资金。", + "confirm-delete": "还是将其从钱包列表中删除" + }, + "create-backup": { + "warning": "警告: ä½ åªèƒ½ä½¿ç”¨æ­¤é€‰é¡¹å¤‡ä»½ä½ çš„硬件钱包ç§å­ä¸€æ¬¡ã€‚如果你决定继续,你将ä¸å¾—ä¸å†™ä¸‹ä¸€ç»„å•è¯(建议写在纸上,而ä¸æ˜¯ç”µè„‘上),这些å•è¯å°†å‡ºçŽ°åœ¨ç¡¬ä»¶é’±åŒ…çš„å±å¹•ä¸Šï¼Œå¹¶å°†å…¶å­˜å‚¨åœ¨ä¸€ä¸ªå®‰å…¨çš„地方。任何å¯ä»¥è®¿é—®å•è¯åˆ—表(\"ç§å­\")的人都å¯ä»¥è®¿é—®é’±åŒ…ä½™é¢ï¼Œå› æ­¤å»ºè®®è¯·æ ¼å¤–谨慎。", + "instructions": "写下出现在硬件钱包å±å¹•ä¸Šçš„å•è¯åˆ—表。一定è¦æŒ‰é¡ºåºå¹¶æŠŠæ¯ä¸ªå•è¯éƒ½å†™å¯¹ã€‚" + }, + "seed-word": { + "title": "输入字", + "info1": "输入设备中显示的字", + "info2": "你将被è¦æ±‚以éšæœºçš„顺åºè¾“入你备份的ç§å­ï¼ŒåŠ ä¸Šä¸€äº›é¢å¤–的字。", + "word": "è¦æ±‚çš„å­—", + "error-invalid-word": "输入字无效。", + "error-loading-words": "正在加载字列表。请ç¨ç­‰ã€‚" + }, + "change-pin" : { + "pin-mismatch":"无法执行æ“作。你输入的两个密ç ä¸åŒ¹é…" + }, + "enter-pin" : { + "title": "输入密ç ", + "title-change-current": "输入当å‰å¯†ç ", + "title-change-new": "输入新的密ç ", + "title-change-confirm": "确认新的密ç ", + "instructions": " 密ç å·²æ˜¾ç¤ºåœ¨ç¡¬ä»¶é’±åŒ…çš„å±å¹•ä¸Šã€‚", + "instructions-tx": "进入密ç ä»¥ç¡®è®¤å¹¶ç­¾ç½²äº¤æ˜“。", + "instructions-change": "请输入一个4到8个数字之间的难以被猜中的密ç ã€‚", + "help": "需è¦å¸®åŠ©ï¼Ÿ" + }, + "pin-help" : { + "title": "帮助", + "part1": "当需è¦è¾“入密ç æ‰èƒ½ç»§ç»­æ—¶ï¼Œç¡¬ä»¶é’±åŒ…å±å¹•ä¼šæ˜¾ç¤ºä¸€ä¸ªçŸ©é˜µï¼ŒçŸ©é˜µç”±9个éšæœºæŽ’列的å—组æˆ(æ¯æ¬¡é¡ºåºéƒ½ä¼šæ”¹å˜),你将被è¦æ±‚在软件钱包中输入密ç ï¼Œä½¿ç”¨ä¸€ä¸ªçŸ©é˜µï¼Œæ­¤çŸ©é˜µåŒ…å«9个按钮,åªæ˜¾ç¤ºç¬¦å·#。", + "part2": "è¦è¾“入密ç ï¼Œè¯·åœ¨ç¡¬ä»¶é’±åŒ…å±å¹•ä¸Šä»¥æ•°å­—矩阵查看密ç çš„ä½ç½®ï¼Œç„¶åŽç‚¹å‡»è½¯ä»¶é’±åŒ…中的相应按钮。例如,如果密ç ä¸º\"23\"且数字2ä½äºŽç¡¬ä»¶é’±åŒ…数字矩阵的左上角,数字3ä½äºŽç¡¬ä»¶é’±åŒ…数字矩阵的正中间,则按顺åºç‚¹å‡»è½¯ä»¶é’±åŒ…中的左上角和中间按钮。", + "part3": "如果你愿æ„,还å¯ä»¥ä½¿ç”¨é”®ç›˜ä¸Šçš„å°é”®ç›˜è¾“入密ç ã€‚但是,如之å‰ç¤ºä¾‹æ‰€ç¤ºï¼Œå¦‚果密ç æ˜¯\"23\",你ä¸èƒ½ç®€å•åœ°ç”¨å°é”®ç›˜é”®å…¥\"23\",而是必须选择点击硬件钱包å±å¹•ä¸Š2å’Œ3对应ä½ç½®çš„值。" + }, + "create-tx" : { + "title": "创建交易" + }, + "confirm-address" : { + "title": "确认地å€", + "instructions": "请在硬件钱包上确认,如果地å€ä¸º:", + "short-confirmation": "地å€å·²ç¡®è®¤", + "confirmation": "地å€å·²ç¡®è®¤ã€‚为了安全, 选择 \"确认地å€\" 选项å¯ä»¥åœ¨ç¡¬ä»¶é’±åŒ…上å†æ¬¡æ˜¾ç¤ºåœ°å€ï¼Œåœ¨èœå•ä¸­å¯ç‚¹å‡»åœ°å€ä½™é¢å³ä¾§çš„按钮显示。" + } + }, + + "time-from-now": { + "few-seconds": "几秒钟之å‰", + "minute": "一分钟之å‰", + "minutes": "{{time}} 分钟之å‰", + "hour": "一å°æ—¶ä¹‹å‰", + "hours": "{{time}} å°æ—¶ä¹‹å‰", + "day": "一天之å‰", + "days": "{{time}} 天之å‰" + }, + + "exchange": { + "you-send": "ä½ å‘é€", + "you-get": "你收到 (大约)", + "to-address": "到 {{coin}} 地å€", + "price": "交易汇率", + "time-15": "交易时间", + "exchange-button": "交易", + "min-amount": "最å°æ•°é¢:", + "max-amount": "最大数é¢:", + "agree-1": "我åŒæ„", + "agree-2": "使用æ¡æ¬¾", + "agree-3": "å’Œ", + "agree-4": "éšç§æ”¿ç­–", + "powered-by": "技术支æŒ", + "need-help": "需è¦å¸®åŠ©?", + "support-portal": "帮助入å£", + "history": "订å•åŽ†å²", + "order-not-found": "订å•æœªæ‰¾åˆ°", + "status": "状æ€", + "exchanging": "{{from}}交易{{to}}", + "select": "选择", + "offline": "交易暂时下线", + "problem-connecting": "未能连接到æœåŠ¡å™¨ã€‚请检查你的网络连接并ç¨åŽå†è¯•ã€‚", + "invalid-address": "无效地å€ã€‚", + "statuses": { + "user-waiting": "等待充值。请将{{amount}} {{from}}å‘é€åˆ°ä¸‹é¢æ˜¾ç¤ºçš„交易地å€", + "user-waiting-info": "系统正在等待你充值到交易地å€ã€‚交易将在系统检测到你的充值并在区å—链中确认åŽå¼€å§‹ã€‚如果你已ç»å……值,应该很快就会检测到。", + "market-waiting-confirmations": "等待链上交易确认", + "market-waiting-confirmations-info": "å·²ç»æ£€æµ‹åˆ°å……值,等待区å—链中被确认。", + "market-confirmed": "链上交易已接å—", + "market-confirmed-info": "链上交易已ç»åœ¨åŒºå—链上确认。准备马上执行兑æ¢ã€‚", + "market-exchanged": "完æˆ{{from}}到{{to}}çš„å…‘æ¢", + "market-exchanged-info": "å…‘æ¢å·²ç»å®Œæˆã€‚资金将很快å‘é€åˆ°ä½ çš„地å€ã€‚", + "market-withdraw-waiting": "正在å‘é€{{to}}到你的地å€", + "market-withdraw-waiting-info": "å‘é€{{to}}到你地å€çš„进程已å¯åŠ¨", + "complete": "交易已完æˆ!", + "complete-info": "资金已ç»æˆåŠŸå‘é€åˆ°ä½ çš„地å€ã€‚", + "error": "å‘生错误", + "error-info": "è¿è½¬è¿‡ç¨‹ä¸­å‡ºçŽ°é”™è¯¯ï¼Œä½ å¯ä»¥åœ¨ä¸‹é¢æ‰¾åˆ°æ›´å¤šä¿¡æ¯ã€‚如果你需è¦å¸®åŠ©ï¼Œè¯·ä¿å­˜ä¸‹é¢æ˜¾ç¤ºçš„所有数æ®å¹¶ä½¿ç”¨é¡µé¢å³ä¸‹è§’的帮助链接æ¥è”系技术支æŒã€‚" + }, + "history-window": { + "address": "地å€", + "date": "日期" + }, + "details": { + "exchange-addr": "交易地å€", + "exchange-addr-tag": "支付ID或交易必须用到的目标标签", + "tx-id": "交易ID", + "order-id": "订å•ID", + "initial-price": "åˆå§‹æ±‡çŽ‡", + "error-msg": "é”™è¯¯ä¿¡æ¯ ", + "details": "详情", + "start-date": "开始日期", + "back": "返回", + "back-alert": "æ“作正在执行。你真的想è¦è¿”回到表格å—?你å¯ä»¥é€šè¿‡ç‚¹å‡»\"订å•åŽ†å²\"å†æ¬¡çœ‹åˆ°æ‰§è¡Œè¿‡ç¨‹" + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/zh_base.json b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/zh_base.json new file mode 100644 index 00000000..402d23ce --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/i18n/zh_base.json @@ -0,0 +1,506 @@ +{ + "common": { + "coin-id": "SKY", + "coin-hours": "Coin Hours", + "usd": "USD", + "loading": "Loading...", + "new": "New", + "load": "Load" + }, + + "errors": { + "error": "Error", + "fetch-version": "Unable to fetch latest release version from Github", + "incorrect-password": "Incorrect password", + "error-decrypting": "Error decrypting the wallet", + "api-disabled": "API disabled", + "no-wallet": "Wallet does not exist", + "no-outputs": "No unspent outputs", + "window-size": "The window is too narrow for the content" + }, + + "title": { + "language": "Select Language", + "wallets": "Wallets", + "send": "Send", + "history": "History", + "buy-coin": "Buy Skycoin", + "network": "Networking", + "blockchain": "Blockchain", + "outputs": "Outputs", + "transactions": "Transactions", + "pending-txs": "Pending Transactions", + "backup": "Backup Wallet", + "explorer": "Skycoin Explorer", + "seed": "Wallet Seed", + "qrcode": "QR Code", + "reset": "Reset Password", + "exchange": "Exchange", + "select-address": "Select Address", + "order-history": "Order history" + }, + + "header": { + "syncing-blocks": "Syncing blocks", + "update1": "Wallet update", + "update2": "available.", + "synchronizing": "The wallet is synchronizing. Data you see may not be updated.", + "pending-txs1": "There are some", + "pending-txs2": "pending transactions.", + "pending-txs3": "Data you see may not be updated.", + + "errors": { + "no-connections": "No connections active, your client is not connected to any other nodes!", + "no-backend1": "Cannot reach backend. Please restart the app and/or seek help on our", + "no-backend2": "Telegram.", + "no-backend3": "", + "csrf": "Security vulnerability: CSRF is not working, please exit immediately." + } + }, + + "password": { + "title": "Enter Password", + "label": "Password", + "confirm-label": "Confirm password", + "button": "Proceed", + "reset-link": "I forgot my password" + }, + + "buy": { + "deposit-address": "Choose an address to generate a BTC deposit link for:", + "select-address": "Select address", + "generate": "Generate", + "deposit-location": "Deposit Location", + "deposit-location-desc": "Choose a wallet where you'd like us to deposit your Skycoin after we receive your Bitcoin.", + "make-choice": "Make a choice", + "wallets-desc": "Each time a new wallet and address are selected, a new BTC address is generated. A single Skycoin address can have up to 5 BTC addresses assigned to it.", + "send": "Send Bitcoin", + "send-desc": "Send Bitcoin to the address below. Once received, we will deposit the Skycoin to a new address in the wallet selected above at the current rate of {{ rate }} SKY/BTC.", + "fraction-warning": "Only send multiple of the SKY/BTC rate! Skycoin is sent in whole number; fractional SKY is not sent!", + "receive": "Receive Sky", + "receive-desc": "After receiving your Bitcoin, we'll send you your Skycoin. It may take anywhere between 20 minutes and an hour to receive your SKY.", + "status-button": "Status:", + "check-status-button": "Check Status", + "new-order-button": "New Order" + }, + + "wizard": { + "wallet-desc": "If you don't have a Skycoin wallet, use the generated seed to create a new one. If you already have a wallet, toggle over to \"Load Wallet\" and enter your seed.", + "encrypt-desc": "Increase security of your wallet by encrypting it. By entering a password below, your wallet will be encrypted. Only those with the password will be able access the wallet and remove funds.", + "hardware-wallet-link": "Using a hardware wallet?", + "finish-button": "Finish", + "back-button": "Back", + + "confirm": { + "title": "Safeguard your seed!", + "desc": "We want to make sure that you wrote down your seed and stored it in a safe place. If you forget your seed, you WILL NOT be able to recover your Skycoin wallet!", + "checkbox": "It’s safe, I swear.", + "button": "Continue" + } + }, + + "wallet": { + "new-address": "New Address", + "new-addresses": "New Addresses", + "show-empty": "Show Empty", + "hide-empty": "Hide Empty", + "encrypt": "Encrypt Wallet", + "decrypt": "Decrypt Wallet", + "decrypt-warning": "Warning: for security reasons, it is not recommended to keep the wallets unencrypted. Caution is advised.", + "delete": "Delete Wallet", + "edit": "Edit Wallet", + "add": "Add Wallet", + "load": "Load Wallet", + "encryption-enabled": "Encryption enabled", + "encryption-disabled": "Encryption disabled", + "hw-security-warning": "Possible security risk. Access the hardware wallet options (by pressing the \"Hardware Wallet\" button below the wallets list) while the device is connected for more information.", + "wallet": "Wallet", + "hardware-wallet": "Hardware Wallet", + "delete-confirmation": "WARNING: The wallet \"{{ name }}\" will be removed from the list. To add it again, you will have to reconnect the device and open the hardware wallet options (by pressing the \"Hardware Wallet\" button below the wallets list). Do you want to continue?", + "delete-confirmation-check": "Yeah, I want to delete the wallet.", + "max-hardware-wallets-error": "You have already reached the max number of addresses that can be added to the hardware wallet.", + "add-many-confirmation": "WARNING: If you add too many addresses without using the previous ones or if you use the last ones and not the first ones, some addresses may not be recovered automatically if you try to restore the wallet using the seed (you will have to add them manually). Do you want to continue?", + + "new": { + "create-title": "Create Wallet", + "load-title": "Load Wallet", + "encrypt-title": "Encrypt Wallet", + "name-label": "Name", + "seed-label": "Seed", + "confirm-seed-label": "Confirm seed", + "seed-warning": "Remember this seed! Keep it in a safe place. If you forget your seed, you will not be able to recover your wallet!", + "create-button": "Create", + "load-button": "Load", + "cancel-button": "Cancel", + "12-words": "12 words", + "24-words": "24 words", + "generate-12-seed": "Generate 12 word seed", + "generate-24-seed": "Generate 24 word seed", + "encrypt": "Encrypt wallet", + "encrypt-warning": "We suggest that you encrypt each one of your wallets with a password. If you forget your password, you can reset it with your seed. Make sure you have your seed saved somewhere safe before encrypting your wallet.", + "unconventional-seed-title": "Possible error", + "unconventional-seed-text": "You introduced an unconventional seed. If you did it for any special reason, you can continue (only recommended for advanced users). However, if your intention is to use a normal system seed, you must delete all the additional text and special characters.", + "unconventional-seed-check": "Continue with the unconventional seed." + }, + + "rename": { + "title": "Rename Wallet", + "name-label": "Name", + "cancel-button": "Cancel", + "rename-button": "Rename" + }, + + "add-addresses": { + "title": "Select quantity", + "name-quantity": "How many addresses to create", + "cancel-button": "Cancel", + "create-button": "Create" + }, + + "address": { + "show": "Press to show", + "copy": "Copy", + "copy-address": "Copy address", + "copied": "Copied!", + "confirm": "Confirm address", + "outputs": "Unspent outputs", + "history": "History" + } + }, + + "send": { + "synchronizing-warning": "The wallet is still synchronizing the data, so the balance shown may be incorrect. Are you sure you want to continue?", + "from-label": "Send from", + "to-label": "Send to", + "amount-label": "Amount", + "notes-label": "Notes", + "wallet-label": "Wallet", + "addresses-label": "Addresses", + "invalid-amount": "Please enter a valid amount", + "addresses-help": "Limit the addresses from where the coins and hours could be sent", + "all-addresses": "All the addresses of the selected wallet", + "outputs-label": "Unspent outputs", + "outputs-help": "Limit the unspent outputs from where the coins and hours could be sent. Only the outputs from the selected addresses are shown", + "all-outputs": "All the outputs of the selected addresses", + "available-msg-part1": "With your current selection you can send up to", + "available-msg-part2": "and", + "available-msg-part3": "(at least", + "available-msg-part4": "must be used for the transaction fee).", + "change-address-label": "Custom change address", + "change-address-select": "Select", + "change-address-help": "Address to receive change. If it's not provided, it will be chosen automatically. Click on the \"Select\" link to choose an address from one of your wallets", + "destinations-label": "Destinations", + "destinations-help1": "Destination addresses and their coins", + "destinations-help2": "Destination addresses, their coins and coin hours", + "hours-allocation-label": "Automatic coin hours allocation", + "options-label": "Options", + "value-label": "Coin hours share factor", + "value-help": "The higher the value, the more coin hours will be sent to outputs", + "preview-button": "Preview", + "send-button": "Send", + "back-button": "Back", + "simple": "Simple", + "advanced": "Advanced", + "select-wallet": "Select Wallet" + }, + + "reset": { + "wallet-label": "Wallet", + "seed-label": "Wallet seed", + "password-label": "New password (leave empty if you want the wallet not to be encrypted)", + "confirm-label": "Confirm new password", + "reset-button": "Reset" + }, + + "tx": { + "transaction": "Transaction", + "confirm-transaction": "Confirm Transaction", + "from": "From", + "to": "To", + "date": "Date", + "status": "Status", + "coins": "Coins", + "hours": "Hours", + "id": "Tx ID", + "show-more": "Show more", + "hours-moved": "moved", + "hours-sent": "sent", + "hours-received": "received", + "hours-burned": "burned", + "inputs": "Inputs", + "outputs": "Outputs", + "confirmed": "Confirmed", + "pending": "Pending", + "current-rate": "Calculated at the current rate" + }, + + "backup": { + "wallet-directory": "Wallet Directory:", + "seed-warning": "BACKUP YOUR SEED. ON PAPER. IN A SAFE PLACE. As long as you have your seed, you can recover your coins.", + "desc": "Use the table below to get seeds from your encrypted wallets.
To get seeds from unencrypted wallets, open the folder above, open the .wlt files in a text editor and recover the seeds.", + "close-button": "Close", + "wallet": "Wallet Label", + "filename": "Filename", + "seed": "Seed", + "show-seed": "Show seed", + "no-wallets": "No encrypted wallets" + }, + + "blockchain": { + "blocks": "Number of blocks", + "time": "Timestamp of last block", + "hash": "Hash of last block", + "current-supply": "Current SKY supply", + "total-supply": "Total SKY supply", + "current-coinhour-supply": "Current Coin Hours supply", + "total-coinhour-supply": "Total Coin Hours supply" + }, + + "network": { + "peer": "Peer", + "source": "Source", + "block-height": "Block height", + "block-height-short": "Block", + "last-seen": "Last seen", + "last-received": "Last received", + "last-sent": "Last sent", + "in": "Incoming", + "out": "Outgoing", + + "sources": { + "default": "Default peer", + "exchange": "Peer exchange" + } + }, + + "pending-txs": { + "timestamp": "Timestamp", + "txid": "Transaction ID", + "none": "No pending transactions", + "my": "Mine", + "all": "All" + }, + + "history": { + "tx-detail": "Transaction Detail", + "moving": "Internally moving", + "moved": "Internally moved", + "sending": "Sending", + "sent": "Sent", + "received": "Received", + "receiving": "Receiving", + "pending": "Pending", + "no-txs": "You have no transaction history", + "no-txs-filter": "There are no transactions matching the current filter criteria", + "no-filter": "No filter active (press to select wallets/addresses)", + "filter": "Active filter: ", + "filters": "Active filters: ", + "all-addresses": "All addresses" + }, + + "teller": { + "done": "Completed", + "waiting-confirm": "Waiting for confirmation", + "waiting-deposit": "Waiting for Bitcoin deposit", + "waiting-send": "Waiting to send Skycoin", + "unknown": "Unknown" + }, + + "confirmation" : { + "header-text": "Confirmation", + "confirm-button": "Yes", + "cancel-button": "No", + "close": "Close" + }, + + "service": { + "api" : { + "server-error": "Server error" + }, + "wallet": { + "not-enough-hours": "Not enough available Coin Hours to perform the transaction!" + } + }, + + "hardware-wallet": { + "general" : { + "default-wallet-name": "New hardware wallet", + "error-disconnected": "Unable to perform the operation. The hardware wallet is not connected.", + "simple-error": "Error, Unable to perform the operation.", + "generic-error": "Unable to perform the operation. Make sure you have connected a valid hardware wallet and that it is not waiting for input.", + "generic-error-internet": "Unable to perform the operation. Make sure you have connected a valid hardware wallet that is not waiting for input and that you have a connection to the internet/node.", + "error-incorrect-wallet": "Unable to perform the operation. The connected hardware wallet is different from the expected one.", + "error-incorrect-pin": "Unable to perform the operation. The PIN you have entered is not correct.", + "confirm": "Please, confirm the operation in the hardware wallet.", + "confirm-and-more": "Please, confirm the operation in the hardware wallet and follow the instructions.", + "close": "Close", + "cancel": "Cancel", + "continue": "Continue", + "completed": "Operation completed successfully.", + "refused": "The operation failed or was canceled." + }, + "errors": { + "too-many-inputs": "The transaction has too many inputs and can not be processed. Please contact technical support.", + "too-many-outputs": "The transaction has too many outputs and can not be processed. Please contact technical support." + }, + "security-warning" : { + "title": "Security warning", + "text": "The last time this hardware wallet was connected, one or more security warnings were found. We recommend you to open the hardware wallet options (by pressing the \"Hardware Wallet\" button below the wallets list) while the device is connected and solve the security problems before continuing.", + "check": "I understand the risks and want to continue", + "continue": "Continue", + "cancel": "Cancel" + }, + "options" : { + "connecting": "Connecting...", + "disconnected": "No hardware wallet detected. Please connect a hardware wallet to use this option.", + "unconfigured-detected-title": "Unconfigured hardware wallet", + "unconfigured-detected": "A seedless hardware wallet has been detected. Select \"Configure automatically\" if you want to configure it as a brand new wallet and start using it immediately, or select \"Restore backup\" if you want to configure it with a previously created seed backup and thus be able to access your funds again.", + "configured-detected": "Hardware wallet detected. The device is identified in the wallets list as:", + "security-warnings-title": "Security warnings", + "security-warning-title": "Security warning", + "backup-warning": "You should backup the hardware wallet seed or you could lose access to the funds in case of problems. To do this, select the \"Create a backup\" option.", + "pin-warning": "The connected hardware wallet does not have a PIN. The PIN code protects the hardware wallet in case of loss, theft and hacks. To create a PIN code, select the \"Create PIN code\" option.", + "options": "Options:", + "configure-automatically": "Configure automatically", + "restore-backup": "Restore backup", + "create-backup": "Create a backup", + "wipe": "Wipe the device", + "confirm-seed": "Confirm seed", + "create-pin": "Create PIN code", + "change-pin": "Change PIN code", + "forgotten-pin1": "If you can not access the wallet because you have forgotten the PIN, you can wipe the hardware wallet and then restore it with the seed by clicking", + "forgotten-pin2": "here." + }, + "generate-seed" : { + "text": "Before proceeding, you can select the number of words you want the seed to have. The seed is a list of words that can be used to recover access to the coins in case of problems. Both values are safe, so if you do not have a special reason for selecting one or the other, you can leave the default value.", + "configuring": "Configuring..." + }, + "restore-seed" : { + "text": "Before proceeding, please select the number of words that the seed you want to recover has.", + "check-text": "You can use this option to enter a seed and check if it is equal to the one in the hardware wallet. Before start, select the number of words the seed you want to check has.", + "warning" : "WARNING: to avoid potential problems, use only seeds created with a hardware wallet from the same brand/model.", + "error-wrong-word": "Error: The retyped word does not match the one requested by the hardware wallet.", + "error-invalid-seed": "Error: The seed is not valid. Please be sure to enter the correct words in the correct order.", + "error-wrong-seed": "Error: The seed is valid but does not match the one in the device." + }, + "added" : { + "title": "New Hardware Wallet", + "configuring": "New hardware wallet detected. Configuring...", + "done": "Done", + "added1": "The connected hardware wallet has been added to the wallets list with the following name:", + "added2": "Now you can check the balance and the addresses of the hardware wallet even when it is not connected. Additionally, you can change the name of the wallet or remove it from the wallets list, if you wish." + }, + "wipe" : { + "warning": "WARNING: All the data in the hardware wallet will be deleted. If you do not have a backup, you will not be able to access your funds again.", + "confirm-delete": "Also remove from the wallets list" + }, + "create-backup" : { + "warning": "WARNING: You can only use this option to backup your hardware wallet seed once. If you decide to continue, you will have to write down a group of words (it is recommended to do it on paper and not on a computer) that will appear on the screen of the hardware wallet and store the list in a safe place. Anyone with access to the word list (the \"seed\") will be able access the wallet balance, so extreme caution is advised.", + "instructions": "Write down the word list that appear on the screen of the hardware wallet. Make sure you respect the order and write each word correctly." + }, + "seed-word" : { + "title": "Enter word", + "info1": "Enter the word indicated in the device", + "info2": "You will be asked to enter the words of your backup seed in random order, plus a few additional words.", + "word": "Requested word", + "error-invalid-word": "The entered word is not valid.", + "error-loading-words": "Loading the word list. Please wait." + }, + "change-pin" : { + "pin-mismatch": "Unable to perform the operation. Two PINs you have entered do not match." + }, + "enter-pin" : { + "title": "Enter PIN", + "title-change-current": "Enter the current PIN", + "title-change-new": "Enter the new PIN", + "title-change-confirm": "Confirm the new PIN", + "instructions": "The PIN layout is displayed on the hardware wallet screen.", + "instructions-tx": "Enter the PIN to confirm and sign the transaction.", + "instructions-change": "Please enter a hard-to-guess PIN of between 4 and 8 numbers.", + "help": "Need help?" + }, + "pin-help" : { + "title": "Help", + "part1": "When it is necessary to enter the PIN to continue, the hardware wallet screen will display a matrix of 9 boxes with numbers in random order (the order changes each time) and you will be asked to enter the PIN in the software wallet using a matrix of 9 buttons that simply show the symbol #.", + "part2": "To enter the PIN, look at the position of the PIN numbers in numbers matrix on the screen of the hardware wallet and press the corresponding buttons in the software wallet. For example, if the PIN is \"23\" and the number 2 is in the upper left, number 3 in the middle of the hardware wallet numbers matrix, press the upper left and middle button in that order in the software wallet.", + "part3": "If you wish, you can also use the numpad on your keyboard to enter the PIN. However, as in the previous example, if the PIN is \"23\", you can not simply type \"23\" with the numpad, but you will have to press the keys that are in the position where the numbers 2 and 3 are shown on the screen of the hardware wallet." + }, + "create-tx" : { + "title": "Create transaction" + }, + "confirm-address" : { + "title": "Confirm address", + "instructions": "Please confirm on the hardware wallet if the address is:", + "short-confirmation": "Address confirmed.", + "confirmation": "Address confirmed. For security, you can re-show the address in the hardware wallet using the \"Confirm address\" option, in the menu that you can display by pressing the button at the right of the address balance." + } + }, + + "time-from-now": { + "few-seconds": "a few seconds ago", + "minute": "one minute ago", + "minutes": "{{time}} minutes ago", + "hour": "one hour ago", + "hours": "{{time}} hours ago", + "day": "one day ago", + "days": "{{time}} days ago" + }, + + "exchange": { + "you-send": "You send", + "you-get": "You get (approx.)", + "to-address": "To {{coin}} address", + "price": "Exchange rate", + "time-15": "Exchange time", + "exchange-button": "Exchange", + "min-amount": "Minimum amount:", + "max-amount": "Maximum amount:", + "agree-1": "I agree with", + "agree-2": "Terms of Use", + "agree-3": "and", + "agree-4": "Privacy Policy", + "powered-by": "Powered by", + "need-help": "Need help?", + "support-portal": "Support portal", + "history": "Order history", + "order-not-found": "Order not found", + "status": "Status", + "exchanging": "Exchanging {{from}} for {{to}}", + "select": "Select", + "offline": "Exchange is temporarily offline", + "problem-connecting": "Unable to connect with the service. Please check your Internet connection and try again later.", + "invalid-address": "Invalid address.", + "statuses": { + "user-waiting": "Waiting for deposit. Please send {{amount}} {{from}} to the exchange address shown below", + "user-waiting-info": "The system is waiting for you to make the deposit into the exchange address. The exchange process will start after the deposit is detected and confirmed in the blockchain. If you have already made the deposit, it should be detected shortly.", + "market-waiting-confirmations": "Waiting for transaction confirmations", + "market-waiting-confirmations-info": "The deposit has already been detected and the system is waiting for it to be confirmed in the blockchain.", + "market-confirmed": "Transaction accepted", + "market-confirmed-info": "The transaction has already been confirmed in the blockchain. Preparing to make the exchange soon.", + "market-exchanged": "Traded {{from}} for {{to}}", + "market-exchanged-info": "The exchange has been made. The funds will be transferred to your address in a moment.", + "market-withdraw-waiting": "Sending {{to}} to your address", + "market-withdraw-waiting-info": "The process for sending the coins to your address has been initiated.", + "complete": "Exchange completed!", + "complete-info": "The funds have been successfully sent to your address.", + "error": "Error occurred", + "error-info": "There was an error in the operation, you can find more information below. If you need help, please save all the operation data shown below and contact technical support using the link in the lower right part of this page." + }, + "history-window": { + "address": "Address", + "date": "Date" + }, + "details": { + "exchange-addr": "Exchange address", + "exchange-addr-tag": "Payment ID or Destination Tag which must be used for the transaction", + "tx-id": "Transaction ID", + "order-id": "Order ID", + "initial-price": "Initial exchange rate", + "error-msg": "Error message", + "details": "Details", + "start-date": "Start date", + "back": "Back", + "back-alert": "The operation is still in progress. Do you really want to return to the form? You can see the progress of this operation again by pressing the \"Order history\" button" + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/alert-red.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/alert-red.png new file mode 100644 index 00000000..17118ad3 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/alert-red.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/big-error-icon.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/big-error-icon.png new file mode 100644 index 00000000..bcbda0c2 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/big-error-icon.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/chevron-right-grey.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/chevron-right-grey.png new file mode 100644 index 00000000..d0404586 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/chevron-right-grey.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/close-grey.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/close-grey.png new file mode 100644 index 00000000..2f0ec3b6 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/close-grey.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/delete-grey.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/delete-grey.png new file mode 100644 index 00000000..42ea9346 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/delete-grey.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/delete-red.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/delete-red.png new file mode 100644 index 00000000..62175e3d Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/delete-red.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/edit-blue.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/edit-blue.png new file mode 100644 index 00000000..de88a9af Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/edit-blue.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/edit-grey.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/edit-grey.png new file mode 100644 index 00000000..a5cf11e2 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/edit-grey.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/header.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/header.png new file mode 100644 index 00000000..d73c2734 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/header.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/hw-gold.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/hw-gold.png new file mode 100644 index 00000000..af36aa93 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/hw-gold.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/lang/en.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/lang/en.png new file mode 100644 index 00000000..bb03eaaa Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/lang/en.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/lang/es.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/lang/es.png new file mode 100644 index 00000000..4590656a Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/lang/es.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/lang/ru.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/lang/ru.png new file mode 100644 index 00000000..61c27f9c Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/lang/ru.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/lang/zh.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/lang/zh.png new file mode 100644 index 00000000..ba5615b5 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/lang/zh.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/load-gold.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/load-gold.png new file mode 100644 index 00000000..4d1cbf7f Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/load-gold.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/lock-gold.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/lock-gold.png new file mode 100644 index 00000000..fc53863c Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/lock-gold.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/lock-grey.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/lock-grey.png new file mode 100644 index 00000000..3f835e7d Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/lock-grey.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/logo-white.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/logo-white.png new file mode 100644 index 00000000..8b714cf3 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/logo-white.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/minus-grey.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/minus-grey.png new file mode 100644 index 00000000..b81e568e Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/minus-grey.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/minus-red.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/minus-red.png new file mode 100644 index 00000000..6686a98c Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/minus-red.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/money-gold.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/money-gold.png new file mode 100644 index 00000000..649fc3b1 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/money-gold.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/otc-background.jpg b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/otc-background.jpg new file mode 100644 index 00000000..03a84019 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/otc-background.jpg differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/plus-gold.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/plus-gold.png new file mode 100644 index 00000000..854692e1 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/plus-gold.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/plus-green.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/plus-green.png new file mode 100644 index 00000000..ab020791 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/plus-green.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/plus-grey.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/plus-grey.png new file mode 100644 index 00000000..35dbfff5 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/plus-grey.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/qr-code-black.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/qr-code-black.png new file mode 100644 index 00000000..f9a2fabe Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/qr-code-black.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/send-black.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/send-black.png new file mode 100644 index 00000000..9f277422 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/send-black.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/send-blue.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/send-blue.png new file mode 100644 index 00000000..4226468c Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/send-blue.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/send-gold.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/send-gold.png new file mode 100644 index 00000000..59645e7d Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/send-gold.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/send-white.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/send-white.png new file mode 100644 index 00000000..16261a2f Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/send-white.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/size-alert.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/size-alert.png new file mode 100644 index 00000000..49b639c0 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/size-alert.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/transactions-black.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/transactions-black.png new file mode 100644 index 00000000..413f2235 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/transactions-black.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/unlock-gold.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/unlock-gold.png new file mode 100644 index 00000000..3ecf4ae4 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/unlock-gold.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/unlock-grey.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/unlock-grey.png new file mode 100644 index 00000000..61a31772 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/unlock-grey.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/wallet-black.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/wallet-black.png new file mode 100644 index 00000000..cdb2ec80 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/img/wallet-black.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/logo-white.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/logo-white.png new file mode 100644 index 00000000..cd615cf8 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/logo-white.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/scripts/qrcode.min.js b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/scripts/qrcode.min.js new file mode 100644 index 00000000..993e88f3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/assets/scripts/qrcode.min.js @@ -0,0 +1 @@ +var QRCode;!function(){function a(a){this.mode=c.MODE_8BIT_BYTE,this.data=a,this.parsedData=[];for(var b=[],d=0,e=this.data.length;e>d;d++){var f=this.data.charCodeAt(d);f>65536?(b[0]=240|(1835008&f)>>>18,b[1]=128|(258048&f)>>>12,b[2]=128|(4032&f)>>>6,b[3]=128|63&f):f>2048?(b[0]=224|(61440&f)>>>12,b[1]=128|(4032&f)>>>6,b[2]=128|63&f):f>128?(b[0]=192|(1984&f)>>>6,b[1]=128|63&f):b[0]=f,this.parsedData=this.parsedData.concat(b)}this.parsedData.length!=this.data.length&&(this.parsedData.unshift(191),this.parsedData.unshift(187),this.parsedData.unshift(239))}function b(a,b){this.typeNumber=a,this.errorCorrectLevel=b,this.modules=null,this.moduleCount=0,this.dataCache=null,this.dataList=[]}function i(a,b){if(void 0==a.length)throw new Error(a.length+"/"+b);for(var c=0;c=f;f++){var h=0;switch(b){case d.L:h=l[f][0];break;case d.M:h=l[f][1];break;case d.Q:h=l[f][2];break;case d.H:h=l[f][3]}if(h>=e)break;c++}if(c>l.length)throw new Error("Too long data");return c}function s(a){var b=encodeURI(a).toString().replace(/\%[0-9a-fA-F]{2}/g,"a");return b.length+(b.length!=a?3:0)}a.prototype={getLength:function(){return this.parsedData.length},write:function(a){for(var b=0,c=this.parsedData.length;c>b;b++)a.put(this.parsedData[b],8)}},b.prototype={addData:function(b){var c=new a(b);this.dataList.push(c),this.dataCache=null},isDark:function(a,b){if(0>a||this.moduleCount<=a||0>b||this.moduleCount<=b)throw new Error(a+","+b);return this.modules[a][b]},getModuleCount:function(){return this.moduleCount},make:function(){this.makeImpl(!1,this.getBestMaskPattern())},makeImpl:function(a,c){this.moduleCount=4*this.typeNumber+17,this.modules=new Array(this.moduleCount);for(var d=0;d=7&&this.setupTypeNumber(a),null==this.dataCache&&(this.dataCache=b.createData(this.typeNumber,this.errorCorrectLevel,this.dataList)),this.mapData(this.dataCache,c)},setupPositionProbePattern:function(a,b){for(var c=-1;7>=c;c++)if(!(-1>=a+c||this.moduleCount<=a+c))for(var d=-1;7>=d;d++)-1>=b+d||this.moduleCount<=b+d||(this.modules[a+c][b+d]=c>=0&&6>=c&&(0==d||6==d)||d>=0&&6>=d&&(0==c||6==c)||c>=2&&4>=c&&d>=2&&4>=d?!0:!1)},getBestMaskPattern:function(){for(var a=0,b=0,c=0;8>c;c++){this.makeImpl(!0,c);var d=f.getLostPoint(this);(0==c||a>d)&&(a=d,b=c)}return b},createMovieClip:function(a,b,c){var d=a.createEmptyMovieClip(b,c),e=1;this.make();for(var f=0;f=g;g++)for(var h=-2;2>=h;h++)this.modules[d+g][e+h]=-2==g||2==g||-2==h||2==h||0==g&&0==h?!0:!1}},setupTypeNumber:function(a){for(var b=f.getBCHTypeNumber(this.typeNumber),c=0;18>c;c++){var d=!a&&1==(1&b>>c);this.modules[Math.floor(c/3)][c%3+this.moduleCount-8-3]=d}for(var c=0;18>c;c++){var d=!a&&1==(1&b>>c);this.modules[c%3+this.moduleCount-8-3][Math.floor(c/3)]=d}},setupTypeInfo:function(a,b){for(var c=this.errorCorrectLevel<<3|b,d=f.getBCHTypeInfo(c),e=0;15>e;e++){var g=!a&&1==(1&d>>e);6>e?this.modules[e][8]=g:8>e?this.modules[e+1][8]=g:this.modules[this.moduleCount-15+e][8]=g}for(var e=0;15>e;e++){var g=!a&&1==(1&d>>e);8>e?this.modules[8][this.moduleCount-e-1]=g:9>e?this.modules[8][15-e-1+1]=g:this.modules[8][15-e-1]=g}this.modules[this.moduleCount-8][8]=!a},mapData:function(a,b){for(var c=-1,d=this.moduleCount-1,e=7,g=0,h=this.moduleCount-1;h>0;h-=2)for(6==h&&h--;;){for(var i=0;2>i;i++)if(null==this.modules[d][h-i]){var j=!1;g>>e));var k=f.getMask(b,d,h-i);k&&(j=!j),this.modules[d][h-i]=j,e--,-1==e&&(g++,e=7)}if(d+=c,0>d||this.moduleCount<=d){d-=c,c=-c;break}}}},b.PAD0=236,b.PAD1=17,b.createData=function(a,c,d){for(var e=j.getRSBlocks(a,c),g=new k,h=0;h8*l)throw new Error("code length overflow. ("+g.getLengthInBits()+">"+8*l+")");for(g.getLengthInBits()+4<=8*l&&g.put(0,4);0!=g.getLengthInBits()%8;)g.putBit(!1);for(;;){if(g.getLengthInBits()>=8*l)break;if(g.put(b.PAD0,8),g.getLengthInBits()>=8*l)break;g.put(b.PAD1,8)}return b.createBytes(g,e)},b.createBytes=function(a,b){for(var c=0,d=0,e=0,g=new Array(b.length),h=new Array(b.length),j=0;j=0?p.get(q):0}}for(var r=0,m=0;mm;m++)for(var j=0;jm;m++)for(var j=0;j=0;)b^=f.G15<=0;)b^=f.G18<>>=1;return b},getPatternPosition:function(a){return f.PATTERN_POSITION_TABLE[a-1]},getMask:function(a,b,c){switch(a){case e.PATTERN000:return 0==(b+c)%2;case e.PATTERN001:return 0==b%2;case e.PATTERN010:return 0==c%3;case e.PATTERN011:return 0==(b+c)%3;case e.PATTERN100:return 0==(Math.floor(b/2)+Math.floor(c/3))%2;case e.PATTERN101:return 0==b*c%2+b*c%3;case e.PATTERN110:return 0==(b*c%2+b*c%3)%2;case e.PATTERN111:return 0==(b*c%3+(b+c)%2)%2;default:throw new Error("bad maskPattern:"+a)}},getErrorCorrectPolynomial:function(a){for(var b=new i([1],0),c=0;a>c;c++)b=b.multiply(new i([1,g.gexp(c)],0));return b},getLengthInBits:function(a,b){if(b>=1&&10>b)switch(a){case c.MODE_NUMBER:return 10;case c.MODE_ALPHA_NUM:return 9;case c.MODE_8BIT_BYTE:return 8;case c.MODE_KANJI:return 8;default:throw new Error("mode:"+a)}else if(27>b)switch(a){case c.MODE_NUMBER:return 12;case c.MODE_ALPHA_NUM:return 11;case c.MODE_8BIT_BYTE:return 16;case c.MODE_KANJI:return 10;default:throw new Error("mode:"+a)}else{if(!(41>b))throw new Error("type:"+b);switch(a){case c.MODE_NUMBER:return 14;case c.MODE_ALPHA_NUM:return 13;case c.MODE_8BIT_BYTE:return 16;case c.MODE_KANJI:return 12;default:throw new Error("mode:"+a)}}},getLostPoint:function(a){for(var b=a.getModuleCount(),c=0,d=0;b>d;d++)for(var e=0;b>e;e++){for(var f=0,g=a.isDark(d,e),h=-1;1>=h;h++)if(!(0>d+h||d+h>=b))for(var i=-1;1>=i;i++)0>e+i||e+i>=b||(0!=h||0!=i)&&g==a.isDark(d+h,e+i)&&f++;f>5&&(c+=3+f-5)}for(var d=0;b-1>d;d++)for(var e=0;b-1>e;e++){var j=0;a.isDark(d,e)&&j++,a.isDark(d+1,e)&&j++,a.isDark(d,e+1)&&j++,a.isDark(d+1,e+1)&&j++,(0==j||4==j)&&(c+=3)}for(var d=0;b>d;d++)for(var e=0;b-6>e;e++)a.isDark(d,e)&&!a.isDark(d,e+1)&&a.isDark(d,e+2)&&a.isDark(d,e+3)&&a.isDark(d,e+4)&&!a.isDark(d,e+5)&&a.isDark(d,e+6)&&(c+=40);for(var e=0;b>e;e++)for(var d=0;b-6>d;d++)a.isDark(d,e)&&!a.isDark(d+1,e)&&a.isDark(d+2,e)&&a.isDark(d+3,e)&&a.isDark(d+4,e)&&!a.isDark(d+5,e)&&a.isDark(d+6,e)&&(c+=40);for(var k=0,e=0;b>e;e++)for(var d=0;b>d;d++)a.isDark(d,e)&&k++;var l=Math.abs(100*k/b/b-50)/5;return c+=10*l}},g={glog:function(a){if(1>a)throw new Error("glog("+a+")");return g.LOG_TABLE[a]},gexp:function(a){for(;0>a;)a+=255;for(;a>=256;)a-=255;return g.EXP_TABLE[a]},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)},h=0;8>h;h++)g.EXP_TABLE[h]=1<h;h++)g.EXP_TABLE[h]=g.EXP_TABLE[h-4]^g.EXP_TABLE[h-5]^g.EXP_TABLE[h-6]^g.EXP_TABLE[h-8];for(var h=0;255>h;h++)g.LOG_TABLE[g.EXP_TABLE[h]]=h;i.prototype={get:function(a){return this.num[a]},getLength:function(){return this.num.length},multiply:function(a){for(var b=new Array(this.getLength()+a.getLength()-1),c=0;cf;f++)for(var g=c[3*f+0],h=c[3*f+1],i=c[3*f+2],k=0;g>k;k++)e.push(new j(h,i));return e},j.getRsBlockTable=function(a,b){switch(b){case d.L:return j.RS_BLOCK_TABLE[4*(a-1)+0];case d.M:return j.RS_BLOCK_TABLE[4*(a-1)+1];case d.Q:return j.RS_BLOCK_TABLE[4*(a-1)+2];case d.H:return j.RS_BLOCK_TABLE[4*(a-1)+3];default:return void 0}},k.prototype={get:function(a){var b=Math.floor(a/8);return 1==(1&this.buffer[b]>>>7-a%8)},put:function(a,b){for(var c=0;b>c;c++)this.putBit(1==(1&a>>>b-c-1))},getLengthInBits:function(){return this.length},putBit:function(a){var b=Math.floor(this.length/8);this.buffer.length<=b&&this.buffer.push(0),a&&(this.buffer[b]|=128>>>this.length%8),this.length++}};var l=[[17,14,11,7],[32,26,20,14],[53,42,32,24],[78,62,46,34],[106,84,60,44],[134,106,74,58],[154,122,86,64],[192,152,108,84],[230,180,130,98],[271,213,151,119],[321,251,177,137],[367,287,203,155],[425,331,241,177],[458,362,258,194],[520,412,292,220],[586,450,322,250],[644,504,364,280],[718,560,394,310],[792,624,442,338],[858,666,482,382],[929,711,509,403],[1003,779,565,439],[1091,857,611,461],[1171,911,661,511],[1273,997,715,535],[1367,1059,751,593],[1465,1125,805,625],[1528,1190,868,658],[1628,1264,908,698],[1732,1370,982,742],[1840,1452,1030,790],[1952,1538,1112,842],[2068,1628,1168,898],[2188,1722,1228,958],[2303,1809,1283,983],[2431,1911,1351,1051],[2563,1989,1423,1093],[2699,2099,1499,1139],[2809,2213,1579,1219],[2953,2331,1663,1273]],o=function(){var a=function(a,b){this._el=a,this._htOption=b};return a.prototype.draw=function(a){function g(a,b){var c=document.createElementNS("http://www.w3.org/2000/svg",a);for(var d in b)b.hasOwnProperty(d)&&c.setAttribute(d,b[d]);return c}var b=this._htOption,c=this._el,d=a.getModuleCount();Math.floor(b.width/d),Math.floor(b.height/d),this.clear();var h=g("svg",{viewBox:"0 0 "+String(d)+" "+String(d),width:"100%",height:"100%",fill:b.colorLight});h.setAttributeNS("http://www.w3.org/2000/xmlns/","xmlns:xlink","http://www.w3.org/1999/xlink"),c.appendChild(h),h.appendChild(g("rect",{fill:b.colorDark,width:"1",height:"1",id:"template"}));for(var i=0;d>i;i++)for(var j=0;d>j;j++)if(a.isDark(i,j)){var k=g("use",{x:String(i),y:String(j)});k.setAttributeNS("http://www.w3.org/1999/xlink","href","#template"),h.appendChild(k)}},a.prototype.clear=function(){for(;this._el.hasChildNodes();)this._el.removeChild(this._el.lastChild)},a}(),p="svg"===document.documentElement.tagName.toLowerCase(),q=p?o:m()?function(){function a(){this._elImage.src=this._elCanvas.toDataURL("image/png"),this._elImage.style.display="block",this._elCanvas.style.display="none"}function d(a,b){var c=this;if(c._fFail=b,c._fSuccess=a,null===c._bSupportDataURI){var d=document.createElement("img"),e=function(){c._bSupportDataURI=!1,c._fFail&&_fFail.call(c)},f=function(){c._bSupportDataURI=!0,c._fSuccess&&c._fSuccess.call(c)};return d.onabort=e,d.onerror=e,d.onload=f,d.src="data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==",void 0}c._bSupportDataURI===!0&&c._fSuccess?c._fSuccess.call(c):c._bSupportDataURI===!1&&c._fFail&&c._fFail.call(c)}if(this._android&&this._android<=2.1){var b=1/window.devicePixelRatio,c=CanvasRenderingContext2D.prototype.drawImage;CanvasRenderingContext2D.prototype.drawImage=function(a,d,e,f,g,h,i,j){if("nodeName"in a&&/img/i.test(a.nodeName))for(var l=arguments.length-1;l>=1;l--)arguments[l]=arguments[l]*b;else"undefined"==typeof j&&(arguments[1]*=b,arguments[2]*=b,arguments[3]*=b,arguments[4]*=b);c.apply(this,arguments)}}var e=function(a,b){this._bIsPainted=!1,this._android=n(),this._htOption=b,this._elCanvas=document.createElement("canvas"),this._elCanvas.width=b.width,this._elCanvas.height=b.height,a.appendChild(this._elCanvas),this._el=a,this._oContext=this._elCanvas.getContext("2d"),this._bIsPainted=!1,this._elImage=document.createElement("img"),this._elImage.style.display="none",this._el.appendChild(this._elImage),this._bSupportDataURI=null};return e.prototype.draw=function(a){var b=this._elImage,c=this._oContext,d=this._htOption,e=a.getModuleCount(),f=d.width/e,g=d.height/e,h=Math.round(f),i=Math.round(g);b.style.display="none",this.clear();for(var j=0;e>j;j++)for(var k=0;e>k;k++){var l=a.isDark(j,k),m=k*f,n=j*g;c.strokeStyle=l?d.colorDark:d.colorLight,c.lineWidth=1,c.fillStyle=l?d.colorDark:d.colorLight,c.fillRect(m,n,f,g),c.strokeRect(Math.floor(m)+.5,Math.floor(n)+.5,h,i),c.strokeRect(Math.ceil(m)-.5,Math.ceil(n)-.5,h,i)}this._bIsPainted=!0},e.prototype.makeImage=function(){this._bIsPainted&&d.call(this,a)},e.prototype.isPainted=function(){return this._bIsPainted},e.prototype.clear=function(){this._oContext.clearRect(0,0,this._elCanvas.width,this._elCanvas.height),this._bIsPainted=!1},e.prototype.round=function(a){return a?Math.floor(1e3*a)/1e3:a},e}():function(){var a=function(a,b){this._el=a,this._htOption=b};return a.prototype.draw=function(a){for(var b=this._htOption,c=this._el,d=a.getModuleCount(),e=Math.floor(b.width/d),f=Math.floor(b.height/d),g=[''],h=0;d>h;h++){g.push("");for(var i=0;d>i;i++)g.push('');g.push("")}g.push("
"),c.innerHTML=g.join("");var j=c.childNodes[0],k=(b.width-j.offsetWidth)/2,l=(b.height-j.offsetHeight)/2;k>0&&l>0&&(j.style.margin=l+"px "+k+"px")},a.prototype.clear=function(){this._el.innerHTML=""},a}();QRCode=function(a,b){if(this._htOption={width:256,height:256,typeNumber:4,colorDark:"#000000",colorLight:"#ffffff",correctLevel:d.H},"string"==typeof b&&(b={text:b}),b)for(var c in b)this._htOption[c]=b[c];"string"==typeof a&&(a=document.getElementById(a)),this._android=n(),this._el=a,this._oQRCode=null,this._oDrawing=new q(this._el,this._htOption),this._htOption.text&&this.makeCode(this._htOption.text)},QRCode.prototype.makeCode=function(a){this._oQRCode=new b(r(a,this._htOption.correctLevel),this._htOption.correctLevel),this._oQRCode.addData(a),this._oQRCode.make(),this._el.title=a,this._oDrawing.draw(this._oQRCode),this.makeImage()},QRCode.prototype.makeImage=function(){"function"==typeof this._oDrawing.makeImage&&(!this._android||this._android>=3)&&this._oDrawing.makeImage()},QRCode.prototype.clear=function(){this._oDrawing.clear()},QRCode.CorrectLevel=d}(); \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/favicon.ico b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/favicon.ico new file mode 100644 index 00000000..cc325fd3 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/favicon.ico differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/fontawesome-webfont.674f50d287a8c48dc19b.eot b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/fontawesome-webfont.674f50d287a8c48dc19b.eot new file mode 100644 index 00000000..e9f60ca9 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/fontawesome-webfont.674f50d287a8c48dc19b.eot differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/fontawesome-webfont.912ec66d7572ff821749.svg b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/fontawesome-webfont.912ec66d7572ff821749.svg new file mode 100644 index 00000000..855c845e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/fontawesome-webfont.912ec66d7572ff821749.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/fontawesome-webfont.af7ae505a9eed503f8b8.woff2 b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/fontawesome-webfont.af7ae505a9eed503f8b8.woff2 new file mode 100644 index 00000000..4d13fc60 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/fontawesome-webfont.af7ae505a9eed503f8b8.woff2 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/fontawesome-webfont.b06871f281fee6b241d6.ttf b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/fontawesome-webfont.b06871f281fee6b241d6.ttf new file mode 100644 index 00000000..35acda2f Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/fontawesome-webfont.b06871f281fee6b241d6.ttf differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/fontawesome-webfont.fee66e712a8a08eef580.woff b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/fontawesome-webfont.fee66e712a8a08eef580.woff new file mode 100644 index 00000000..400014a4 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/fontawesome-webfont.fee66e712a8a08eef580.woff differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/header.03fb33b04c982a1a804d.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/header.03fb33b04c982a1a804d.png new file mode 100644 index 00000000..d73c2734 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/header.03fb33b04c982a1a804d.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/header.e11f7c6852766b9319d6.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/header.e11f7c6852766b9319d6.png new file mode 100644 index 00000000..be1002a4 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/header.e11f7c6852766b9319d6.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/index.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/index.html new file mode 100644 index 00000000..6f468ee8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/index.html @@ -0,0 +1,25 @@ +Skycoin
\ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/inline.2fc97466d3eec1b646d4.bundle.js b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/inline.2fc97466d3eec1b646d4.bundle.js new file mode 100644 index 00000000..e28bc7c1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/inline.2fc97466d3eec1b646d4.bundle.js @@ -0,0 +1 @@ +!function(e){var n=window.webpackJsonp;window.webpackJsonp=function(r,c,a){for(var f,u,i,d=0,l=[];d12?n:n+12:"sanje"===t?n+12:void 0},meridiem:function(n,t,e){return n<4?"rati":n<12?"sokalli":n<16?"donparam":n<20?"sanje":"rati"}})}(e("PJh5"))},"+3/4":function(n,t,e){"use strict";e.d(t,"a",function(){return r});var l=e("TToO"),r=function(n){function t(t){n.call(this),this.scheduler=t}return Object(l.__extends)(t,n),t.create=function(n){return new t(n)},t.dispatch=function(n){n.subscriber.complete()},t.prototype._subscribe=function(n){var e=this.scheduler;if(e)return e.schedule(t.dispatch,0,{subscriber:n});n.complete()},t}(e("YaPU").a)},"+7/x":function(n,t,e){!function(n){"use strict";var t={1:"\u0be7",2:"\u0be8",3:"\u0be9",4:"\u0bea",5:"\u0beb",6:"\u0bec",7:"\u0bed",8:"\u0bee",9:"\u0bef",0:"\u0be6"},e={"\u0be7":"1","\u0be8":"2","\u0be9":"3","\u0bea":"4","\u0beb":"5","\u0bec":"6","\u0bed":"7","\u0bee":"8","\u0bef":"9","\u0be6":"0"};n.defineLocale("ta",{months:"\u0b9c\u0ba9\u0bb5\u0bb0\u0bbf_\u0baa\u0bbf\u0baa\u0bcd\u0bb0\u0bb5\u0bb0\u0bbf_\u0bae\u0bbe\u0bb0\u0bcd\u0b9a\u0bcd_\u0b8f\u0baa\u0bcd\u0bb0\u0bb2\u0bcd_\u0bae\u0bc7_\u0b9c\u0bc2\u0ba9\u0bcd_\u0b9c\u0bc2\u0bb2\u0bc8_\u0b86\u0b95\u0bb8\u0bcd\u0b9f\u0bcd_\u0b9a\u0bc6\u0baa\u0bcd\u0b9f\u0bc6\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b85\u0b95\u0bcd\u0b9f\u0bc7\u0bbe\u0baa\u0bb0\u0bcd_\u0ba8\u0bb5\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b9f\u0bbf\u0b9a\u0bae\u0bcd\u0baa\u0bb0\u0bcd".split("_"),monthsShort:"\u0b9c\u0ba9\u0bb5\u0bb0\u0bbf_\u0baa\u0bbf\u0baa\u0bcd\u0bb0\u0bb5\u0bb0\u0bbf_\u0bae\u0bbe\u0bb0\u0bcd\u0b9a\u0bcd_\u0b8f\u0baa\u0bcd\u0bb0\u0bb2\u0bcd_\u0bae\u0bc7_\u0b9c\u0bc2\u0ba9\u0bcd_\u0b9c\u0bc2\u0bb2\u0bc8_\u0b86\u0b95\u0bb8\u0bcd\u0b9f\u0bcd_\u0b9a\u0bc6\u0baa\u0bcd\u0b9f\u0bc6\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b85\u0b95\u0bcd\u0b9f\u0bc7\u0bbe\u0baa\u0bb0\u0bcd_\u0ba8\u0bb5\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b9f\u0bbf\u0b9a\u0bae\u0bcd\u0baa\u0bb0\u0bcd".split("_"),weekdays:"\u0b9e\u0bbe\u0baf\u0bbf\u0bb1\u0bcd\u0bb1\u0bc1\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0ba4\u0bbf\u0b99\u0bcd\u0b95\u0b9f\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0b9a\u0bc6\u0bb5\u0bcd\u0bb5\u0bbe\u0baf\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0baa\u0bc1\u0ba4\u0ba9\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0bb5\u0bbf\u0baf\u0bbe\u0bb4\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0bb5\u0bc6\u0bb3\u0bcd\u0bb3\u0bbf\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0b9a\u0ba9\u0bbf\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8".split("_"),weekdaysShort:"\u0b9e\u0bbe\u0baf\u0bbf\u0bb1\u0bc1_\u0ba4\u0bbf\u0b99\u0bcd\u0b95\u0bb3\u0bcd_\u0b9a\u0bc6\u0bb5\u0bcd\u0bb5\u0bbe\u0baf\u0bcd_\u0baa\u0bc1\u0ba4\u0ba9\u0bcd_\u0bb5\u0bbf\u0baf\u0bbe\u0bb4\u0ba9\u0bcd_\u0bb5\u0bc6\u0bb3\u0bcd\u0bb3\u0bbf_\u0b9a\u0ba9\u0bbf".split("_"),weekdaysMin:"\u0b9e\u0bbe_\u0ba4\u0bbf_\u0b9a\u0bc6_\u0baa\u0bc1_\u0bb5\u0bbf_\u0bb5\u0bc6_\u0b9a".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, HH:mm",LLLL:"dddd, D MMMM YYYY, HH:mm"},calendar:{sameDay:"[\u0b87\u0ba9\u0bcd\u0bb1\u0bc1] LT",nextDay:"[\u0ba8\u0bbe\u0bb3\u0bc8] LT",nextWeek:"dddd, LT",lastDay:"[\u0ba8\u0bc7\u0bb1\u0bcd\u0bb1\u0bc1] LT",lastWeek:"[\u0b95\u0b9f\u0ba8\u0bcd\u0ba4 \u0bb5\u0bbe\u0bb0\u0bae\u0bcd] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0b87\u0bb2\u0bcd",past:"%s \u0bae\u0bc1\u0ba9\u0bcd",s:"\u0b92\u0bb0\u0bc1 \u0b9a\u0bbf\u0bb2 \u0bb5\u0bbf\u0ba8\u0bbe\u0b9f\u0bbf\u0b95\u0bb3\u0bcd",ss:"%d \u0bb5\u0bbf\u0ba8\u0bbe\u0b9f\u0bbf\u0b95\u0bb3\u0bcd",m:"\u0b92\u0bb0\u0bc1 \u0ba8\u0bbf\u0bae\u0bbf\u0b9f\u0bae\u0bcd",mm:"%d \u0ba8\u0bbf\u0bae\u0bbf\u0b9f\u0b99\u0bcd\u0b95\u0bb3\u0bcd",h:"\u0b92\u0bb0\u0bc1 \u0bae\u0ba3\u0bbf \u0ba8\u0bc7\u0bb0\u0bae\u0bcd",hh:"%d \u0bae\u0ba3\u0bbf \u0ba8\u0bc7\u0bb0\u0bae\u0bcd",d:"\u0b92\u0bb0\u0bc1 \u0ba8\u0bbe\u0bb3\u0bcd",dd:"%d \u0ba8\u0bbe\u0b9f\u0bcd\u0b95\u0bb3\u0bcd",M:"\u0b92\u0bb0\u0bc1 \u0bae\u0bbe\u0ba4\u0bae\u0bcd",MM:"%d \u0bae\u0bbe\u0ba4\u0b99\u0bcd\u0b95\u0bb3\u0bcd",y:"\u0b92\u0bb0\u0bc1 \u0bb5\u0bb0\u0bc1\u0b9f\u0bae\u0bcd",yy:"%d \u0b86\u0ba3\u0bcd\u0b9f\u0bc1\u0b95\u0bb3\u0bcd"},dayOfMonthOrdinalParse:/\d{1,2}\u0bb5\u0ba4\u0bc1/,ordinal:function(n){return n+"\u0bb5\u0ba4\u0bc1"},preparse:function(n){return n.replace(/[\u0be7\u0be8\u0be9\u0bea\u0beb\u0bec\u0bed\u0bee\u0bef\u0be6]/g,function(n){return e[n]})},postformat:function(n){return n.replace(/\d/g,function(n){return t[n]})},meridiemParse:/\u0baf\u0bbe\u0bae\u0bae\u0bcd|\u0bb5\u0bc8\u0b95\u0bb1\u0bc8|\u0b95\u0bbe\u0bb2\u0bc8|\u0ba8\u0ba3\u0bcd\u0baa\u0b95\u0bb2\u0bcd|\u0b8e\u0bb1\u0bcd\u0baa\u0bbe\u0b9f\u0bc1|\u0bae\u0bbe\u0bb2\u0bc8/,meridiem:function(n,t,e){return n<2?" \u0baf\u0bbe\u0bae\u0bae\u0bcd":n<6?" \u0bb5\u0bc8\u0b95\u0bb1\u0bc8":n<10?" \u0b95\u0bbe\u0bb2\u0bc8":n<14?" \u0ba8\u0ba3\u0bcd\u0baa\u0b95\u0bb2\u0bcd":n<18?" \u0b8e\u0bb1\u0bcd\u0baa\u0bbe\u0b9f\u0bc1":n<22?" \u0bae\u0bbe\u0bb2\u0bc8":" \u0baf\u0bbe\u0bae\u0bae\u0bcd"},meridiemHour:function(n,t){return 12===n&&(n=0),"\u0baf\u0bbe\u0bae\u0bae\u0bcd"===t?n<2?n:n+12:"\u0bb5\u0bc8\u0b95\u0bb1\u0bc8"===t||"\u0b95\u0bbe\u0bb2\u0bc8"===t?n:"\u0ba8\u0ba3\u0bcd\u0baa\u0b95\u0bb2\u0bcd"===t&&n>=10?n:n+12},week:{dow:0,doy:6}})}(e("PJh5"))},"+CnV":function(n,t,e){"use strict";e.d(t,"a",function(){return l});var l=function(n){var t,l=e("AMGY").a.Symbol;return"function"==typeof l?l.observable?t=l.observable:(t=l("observable"),l.observable=t):t="@@observable",t}()},"/4Bh":function(n,t,e){"use strict";t.a=function(n,t){return arguments.length>=2?function(e){return Object(o.a)(Object(l.a)(n,t),Object(r.a)(1),Object(i.a)(t))(e)}:function(t){return Object(o.a)(Object(l.a)(function(t,e,l){return n(t,e,l+1)}),Object(r.a)(1))(t)}};var l=e("E5SG"),r=e("T1Dh"),i=e("2ESx"),o=e("f9aG")},"/6P1":function(n,t,e){!function(n){"use strict";var t={ss:"sekund\u0117_sekund\u017ei\u0173_sekundes",m:"minut\u0117_minut\u0117s_minut\u0119",mm:"minut\u0117s_minu\u010di\u0173_minutes",h:"valanda_valandos_valand\u0105",hh:"valandos_valand\u0173_valandas",d:"diena_dienos_dien\u0105",dd:"dienos_dien\u0173_dienas",M:"m\u0117nuo_m\u0117nesio_m\u0117nes\u012f",MM:"m\u0117nesiai_m\u0117nesi\u0173_m\u0117nesius",y:"metai_met\u0173_metus",yy:"metai_met\u0173_metus"};function e(n,t,e,l){return t?r(e)[0]:l?r(e)[1]:r(e)[2]}function l(n){return n%10==0||n>10&&n<20}function r(n){return t[n].split("_")}function i(n,t,i,o){var s=n+" ";return 1===n?s+e(0,t,i[0],o):t?s+(l(n)?r(i)[1]:r(i)[0]):o?s+r(i)[1]:s+(l(n)?r(i)[1]:r(i)[2])}n.defineLocale("lt",{months:{format:"sausio_vasario_kovo_baland\u017eio_gegu\u017e\u0117s_bir\u017eelio_liepos_rugpj\u016b\u010dio_rugs\u0117jo_spalio_lapkri\u010dio_gruod\u017eio".split("_"),standalone:"sausis_vasaris_kovas_balandis_gegu\u017e\u0117_bir\u017eelis_liepa_rugpj\u016btis_rugs\u0117jis_spalis_lapkritis_gruodis".split("_"),isFormat:/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|MMMM?(\[[^\[\]]*\]|\s)+D[oD]?/},monthsShort:"sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),weekdays:{format:"sekmadien\u012f_pirmadien\u012f_antradien\u012f_tre\u010diadien\u012f_ketvirtadien\u012f_penktadien\u012f_\u0161e\u0161tadien\u012f".split("_"),standalone:"sekmadienis_pirmadienis_antradienis_tre\u010diadienis_ketvirtadienis_penktadienis_\u0161e\u0161tadienis".split("_"),isFormat:/dddd HH:mm/},weekdaysShort:"Sek_Pir_Ant_Tre_Ket_Pen_\u0160e\u0161".split("_"),weekdaysMin:"S_P_A_T_K_Pn_\u0160".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY [m.] MMMM D [d.]",LLL:"YYYY [m.] MMMM D [d.], HH:mm [val.]",LLLL:"YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]",l:"YYYY-MM-DD",ll:"YYYY [m.] MMMM D [d.]",lll:"YYYY [m.] MMMM D [d.], HH:mm [val.]",llll:"YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]"},calendar:{sameDay:"[\u0160iandien] LT",nextDay:"[Rytoj] LT",nextWeek:"dddd LT",lastDay:"[Vakar] LT",lastWeek:"[Pra\u0117jus\u012f] dddd LT",sameElse:"L"},relativeTime:{future:"po %s",past:"prie\u0161 %s",s:function(n,t,e,l){return t?"kelios sekund\u0117s":l?"keli\u0173 sekund\u017ei\u0173":"kelias sekundes"},ss:i,m:e,mm:i,h:e,hh:i,d:e,dd:i,M:e,MM:i,y:e,yy:i},dayOfMonthOrdinalParse:/\d{1,2}-oji/,ordinal:function(n){return n+"-oji"},week:{dow:1,doy:4}})}(e("PJh5"))},"/bsm":function(n,t,e){!function(n){"use strict";n.defineLocale("uz-latn",{months:"Yanvar_Fevral_Mart_Aprel_May_Iyun_Iyul_Avgust_Sentabr_Oktabr_Noyabr_Dekabr".split("_"),monthsShort:"Yan_Fev_Mar_Apr_May_Iyun_Iyul_Avg_Sen_Okt_Noy_Dek".split("_"),weekdays:"Yakshanba_Dushanba_Seshanba_Chorshanba_Payshanba_Juma_Shanba".split("_"),weekdaysShort:"Yak_Dush_Sesh_Chor_Pay_Jum_Shan".split("_"),weekdaysMin:"Ya_Du_Se_Cho_Pa_Ju_Sha".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"D MMMM YYYY, dddd HH:mm"},calendar:{sameDay:"[Bugun soat] LT [da]",nextDay:"[Ertaga] LT [da]",nextWeek:"dddd [kuni soat] LT [da]",lastDay:"[Kecha soat] LT [da]",lastWeek:"[O'tgan] dddd [kuni soat] LT [da]",sameElse:"L"},relativeTime:{future:"Yaqin %s ichida",past:"Bir necha %s oldin",s:"soniya",ss:"%d soniya",m:"bir daqiqa",mm:"%d daqiqa",h:"bir soat",hh:"%d soat",d:"bir kun",dd:"%d kun",M:"bir oy",MM:"%d oy",y:"bir yil",yy:"%d yil"},week:{dow:1,doy:7}})}(e("PJh5"))},"/iUD":function(n,t,e){"use strict";t.a=function(n){return"function"==typeof n}},"/mhn":function(n,t,e){!function(n){"use strict";var t={1:"\u0967",2:"\u0968",3:"\u0969",4:"\u096a",5:"\u096b",6:"\u096c",7:"\u096d",8:"\u096e",9:"\u096f",0:"\u0966"},e={"\u0967":"1","\u0968":"2","\u0969":"3","\u096a":"4","\u096b":"5","\u096c":"6","\u096d":"7","\u096e":"8","\u096f":"9","\u0966":"0"};n.defineLocale("ne",{months:"\u091c\u0928\u0935\u0930\u0940_\u092b\u0947\u092c\u094d\u0930\u0941\u0935\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u093f\u0932_\u092e\u0908_\u091c\u0941\u0928_\u091c\u0941\u0932\u093e\u0908_\u0905\u0917\u0937\u094d\u091f_\u0938\u0947\u092a\u094d\u091f\u0947\u092e\u094d\u092c\u0930_\u0905\u0915\u094d\u091f\u094b\u092c\u0930_\u0928\u094b\u092d\u0947\u092e\u094d\u092c\u0930_\u0921\u093f\u0938\u0947\u092e\u094d\u092c\u0930".split("_"),monthsShort:"\u091c\u0928._\u092b\u0947\u092c\u094d\u0930\u0941._\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u093f._\u092e\u0908_\u091c\u0941\u0928_\u091c\u0941\u0932\u093e\u0908._\u0905\u0917._\u0938\u0947\u092a\u094d\u091f._\u0905\u0915\u094d\u091f\u094b._\u0928\u094b\u092d\u0947._\u0921\u093f\u0938\u0947.".split("_"),monthsParseExact:!0,weekdays:"\u0906\u0907\u0924\u092c\u093e\u0930_\u0938\u094b\u092e\u092c\u093e\u0930_\u092e\u0919\u094d\u0917\u0932\u092c\u093e\u0930_\u092c\u0941\u0927\u092c\u093e\u0930_\u092c\u093f\u0939\u093f\u092c\u093e\u0930_\u0936\u0941\u0915\u094d\u0930\u092c\u093e\u0930_\u0936\u0928\u093f\u092c\u093e\u0930".split("_"),weekdaysShort:"\u0906\u0907\u0924._\u0938\u094b\u092e._\u092e\u0919\u094d\u0917\u0932._\u092c\u0941\u0927._\u092c\u093f\u0939\u093f._\u0936\u0941\u0915\u094d\u0930._\u0936\u0928\u093f.".split("_"),weekdaysMin:"\u0906._\u0938\u094b._\u092e\u0902._\u092c\u0941._\u092c\u093f._\u0936\u0941._\u0936.".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"A\u0915\u094b h:mm \u092c\u091c\u0947",LTS:"A\u0915\u094b h:mm:ss \u092c\u091c\u0947",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A\u0915\u094b h:mm \u092c\u091c\u0947",LLLL:"dddd, D MMMM YYYY, A\u0915\u094b h:mm \u092c\u091c\u0947"},preparse:function(n){return n.replace(/[\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u0966]/g,function(n){return e[n]})},postformat:function(n){return n.replace(/\d/g,function(n){return t[n]})},meridiemParse:/\u0930\u093e\u0924\u093f|\u092c\u093f\u0939\u093e\u0928|\u0926\u093f\u0909\u0901\u0938\u094b|\u0938\u093e\u0901\u091d/,meridiemHour:function(n,t){return 12===n&&(n=0),"\u0930\u093e\u0924\u093f"===t?n<4?n:n+12:"\u092c\u093f\u0939\u093e\u0928"===t?n:"\u0926\u093f\u0909\u0901\u0938\u094b"===t?n>=10?n:n+12:"\u0938\u093e\u0901\u091d"===t?n+12:void 0},meridiem:function(n,t,e){return n<3?"\u0930\u093e\u0924\u093f":n<12?"\u092c\u093f\u0939\u093e\u0928":n<16?"\u0926\u093f\u0909\u0901\u0938\u094b":n<20?"\u0938\u093e\u0901\u091d":"\u0930\u093e\u0924\u093f"},calendar:{sameDay:"[\u0906\u091c] LT",nextDay:"[\u092d\u094b\u0932\u093f] LT",nextWeek:"[\u0906\u0909\u0901\u0926\u094b] dddd[,] LT",lastDay:"[\u0939\u093f\u091c\u094b] LT",lastWeek:"[\u0917\u090f\u0915\u094b] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%s\u092e\u093e",past:"%s \u0905\u0917\u093e\u0921\u093f",s:"\u0915\u0947\u0939\u0940 \u0915\u094d\u0937\u0923",ss:"%d \u0938\u0947\u0915\u0947\u0923\u094d\u0921",m:"\u090f\u0915 \u092e\u093f\u0928\u0947\u091f",mm:"%d \u092e\u093f\u0928\u0947\u091f",h:"\u090f\u0915 \u0918\u0923\u094d\u091f\u093e",hh:"%d \u0918\u0923\u094d\u091f\u093e",d:"\u090f\u0915 \u0926\u093f\u0928",dd:"%d \u0926\u093f\u0928",M:"\u090f\u0915 \u092e\u0939\u093f\u0928\u093e",MM:"%d \u092e\u0939\u093f\u0928\u093e",y:"\u090f\u0915 \u092c\u0930\u094d\u0937",yy:"%d \u092c\u0930\u094d\u0937"},week:{dow:0,doy:6}})}(e("PJh5"))},"/nXB":function(n,t,e){"use strict";t.a=function(){for(var n=[],t=0;t1&&"number"==typeof n[n.length-1]&&(e=n.pop())):"number"==typeof a&&(e=n.pop()),null===s&&1===n.length&&n[0]instanceof l.a?n[0]:Object(o.a)(e)(new r.a(n,s))};var l=e("YaPU"),r=e("Veqx"),i=e("1Q68"),o=e("8D5t")},0:function(n,t,e){n.exports=e("x35b")},"0P3J":function(n,t,e){"use strict";t.a=function(){return function(n){return n.lift(new i(n))}};var l=e("TToO"),r=e("OVmG"),i=function(){function n(n){this.connectable=n}return n.prototype.call=function(n,t){var e=this.connectable;e._refCount++;var l=new o(n,e),r=t.subscribe(l);return l.closed||(l.connection=e.connect()),r},n}(),o=function(n){function t(t,e){n.call(this,t),this.connectable=e}return Object(l.__extends)(t,n),t.prototype._unsubscribe=function(){var n=this.connectable;if(n){this.connectable=null;var t=n._refCount;if(t<=0)this.connection=null;else if(n._refCount=t-1,t>1)this.connection=null;else{var e=this.connection,l=n._connection;this.connection=null,!l||e&&l!==e||l.unsubscribe()}}else this.connection=null},t}(r.a)},"0X8Q":function(n,t,e){!function(n){"use strict";n.defineLocale("vi",{months:"th\xe1ng 1_th\xe1ng 2_th\xe1ng 3_th\xe1ng 4_th\xe1ng 5_th\xe1ng 6_th\xe1ng 7_th\xe1ng 8_th\xe1ng 9_th\xe1ng 10_th\xe1ng 11_th\xe1ng 12".split("_"),monthsShort:"Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12".split("_"),monthsParseExact:!0,weekdays:"ch\u1ee7 nh\u1eadt_th\u1ee9 hai_th\u1ee9 ba_th\u1ee9 t\u01b0_th\u1ee9 n\u0103m_th\u1ee9 s\xe1u_th\u1ee9 b\u1ea3y".split("_"),weekdaysShort:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysMin:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysParseExact:!0,meridiemParse:/sa|ch/i,isPM:function(n){return/^ch$/i.test(n)},meridiem:function(n,t,e){return n<12?e?"sa":"SA":e?"ch":"CH"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [n\u0103m] YYYY",LLL:"D MMMM [n\u0103m] YYYY HH:mm",LLLL:"dddd, D MMMM [n\u0103m] YYYY HH:mm",l:"DD/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[H\xf4m nay l\xfac] LT",nextDay:"[Ng\xe0y mai l\xfac] LT",nextWeek:"dddd [tu\u1ea7n t\u1edbi l\xfac] LT",lastDay:"[H\xf4m qua l\xfac] LT",lastWeek:"dddd [tu\u1ea7n r\u1ed3i l\xfac] LT",sameElse:"L"},relativeTime:{future:"%s t\u1edbi",past:"%s tr\u01b0\u1edbc",s:"v\xe0i gi\xe2y",ss:"%d gi\xe2y",m:"m\u1ed9t ph\xfat",mm:"%d ph\xfat",h:"m\u1ed9t gi\u1edd",hh:"%d gi\u1edd",d:"m\u1ed9t ng\xe0y",dd:"%d ng\xe0y",M:"m\u1ed9t th\xe1ng",MM:"%d th\xe1ng",y:"m\u1ed9t n\u0103m",yy:"%d n\u0103m"},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:function(n){return n},week:{dow:1,doy:4}})}(e("PJh5"))},"1Bqh":function(n,t,e){"use strict";e.d(t,"a",function(){return r});var l=e("TToO"),r=function(n){function t(t,e){n.call(this),this.subject=t,this.subscriber=e,this.closed=!1}return Object(l.__extends)(t,n),t.prototype.unsubscribe=function(){if(!this.closed){this.closed=!0;var n=this.subject,t=n.observers;if(this.subject=null,t&&0!==t.length&&!n.isStopped&&!n.closed){var e=t.indexOf(this.subscriber);-1!==e&&t.splice(e,1)}}},t}(e("VwZZ").a)},"1Q68":function(n,t,e){"use strict";t.a=function(n){return n&&"function"==typeof n.schedule}},"2ESx":function(n,t,e){"use strict";t.a=function(n){return void 0===n&&(n=null),function(t){return t.lift(new i(n))}};var l=e("TToO"),r=e("OVmG"),i=function(){function n(n){this.defaultValue=n}return n.prototype.call=function(n,t){return t.subscribe(new o(n,this.defaultValue))},n}(),o=function(n){function t(t,e){n.call(this,t),this.defaultValue=e,this.isEmpty=!0}return Object(l.__extends)(t,n),t.prototype._next=function(n){this.isEmpty=!1,this.destination.next(n)},t.prototype._complete=function(){this.isEmpty&&this.destination.next(this.defaultValue),this.destination.complete()},t}(r.a)},"2pmY":function(n,t,e){!function(n){"use strict";var t={1:"\u06f1",2:"\u06f2",3:"\u06f3",4:"\u06f4",5:"\u06f5",6:"\u06f6",7:"\u06f7",8:"\u06f8",9:"\u06f9",0:"\u06f0"},e={"\u06f1":"1","\u06f2":"2","\u06f3":"3","\u06f4":"4","\u06f5":"5","\u06f6":"6","\u06f7":"7","\u06f8":"8","\u06f9":"9","\u06f0":"0"};n.defineLocale("fa",{months:"\u0698\u0627\u0646\u0648\u06cc\u0647_\u0641\u0648\u0631\u06cc\u0647_\u0645\u0627\u0631\u0633_\u0622\u0648\u0631\u06cc\u0644_\u0645\u0647_\u0698\u0648\u0626\u0646_\u0698\u0648\u0626\u06cc\u0647_\u0627\u0648\u062a_\u0633\u067e\u062a\u0627\u0645\u0628\u0631_\u0627\u06a9\u062a\u0628\u0631_\u0646\u0648\u0627\u0645\u0628\u0631_\u062f\u0633\u0627\u0645\u0628\u0631".split("_"),monthsShort:"\u0698\u0627\u0646\u0648\u06cc\u0647_\u0641\u0648\u0631\u06cc\u0647_\u0645\u0627\u0631\u0633_\u0622\u0648\u0631\u06cc\u0644_\u0645\u0647_\u0698\u0648\u0626\u0646_\u0698\u0648\u0626\u06cc\u0647_\u0627\u0648\u062a_\u0633\u067e\u062a\u0627\u0645\u0628\u0631_\u0627\u06a9\u062a\u0628\u0631_\u0646\u0648\u0627\u0645\u0628\u0631_\u062f\u0633\u0627\u0645\u0628\u0631".split("_"),weekdays:"\u06cc\u06a9\u200c\u0634\u0646\u0628\u0647_\u062f\u0648\u0634\u0646\u0628\u0647_\u0633\u0647\u200c\u0634\u0646\u0628\u0647_\u0686\u0647\u0627\u0631\u0634\u0646\u0628\u0647_\u067e\u0646\u062c\u200c\u0634\u0646\u0628\u0647_\u062c\u0645\u0639\u0647_\u0634\u0646\u0628\u0647".split("_"),weekdaysShort:"\u06cc\u06a9\u200c\u0634\u0646\u0628\u0647_\u062f\u0648\u0634\u0646\u0628\u0647_\u0633\u0647\u200c\u0634\u0646\u0628\u0647_\u0686\u0647\u0627\u0631\u0634\u0646\u0628\u0647_\u067e\u0646\u062c\u200c\u0634\u0646\u0628\u0647_\u062c\u0645\u0639\u0647_\u0634\u0646\u0628\u0647".split("_"),weekdaysMin:"\u06cc_\u062f_\u0633_\u0686_\u067e_\u062c_\u0634".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/\u0642\u0628\u0644 \u0627\u0632 \u0638\u0647\u0631|\u0628\u0639\u062f \u0627\u0632 \u0638\u0647\u0631/,isPM:function(n){return/\u0628\u0639\u062f \u0627\u0632 \u0638\u0647\u0631/.test(n)},meridiem:function(n,t,e){return n<12?"\u0642\u0628\u0644 \u0627\u0632 \u0638\u0647\u0631":"\u0628\u0639\u062f \u0627\u0632 \u0638\u0647\u0631"},calendar:{sameDay:"[\u0627\u0645\u0631\u0648\u0632 \u0633\u0627\u0639\u062a] LT",nextDay:"[\u0641\u0631\u062f\u0627 \u0633\u0627\u0639\u062a] LT",nextWeek:"dddd [\u0633\u0627\u0639\u062a] LT",lastDay:"[\u062f\u06cc\u0631\u0648\u0632 \u0633\u0627\u0639\u062a] LT",lastWeek:"dddd [\u067e\u06cc\u0634] [\u0633\u0627\u0639\u062a] LT",sameElse:"L"},relativeTime:{future:"\u062f\u0631 %s",past:"%s \u067e\u06cc\u0634",s:"\u0686\u0646\u062f \u062b\u0627\u0646\u06cc\u0647",ss:"\u062b\u0627\u0646\u06cc\u0647 d%",m:"\u06cc\u06a9 \u062f\u0642\u06cc\u0642\u0647",mm:"%d \u062f\u0642\u06cc\u0642\u0647",h:"\u06cc\u06a9 \u0633\u0627\u0639\u062a",hh:"%d \u0633\u0627\u0639\u062a",d:"\u06cc\u06a9 \u0631\u0648\u0632",dd:"%d \u0631\u0648\u0632",M:"\u06cc\u06a9 \u0645\u0627\u0647",MM:"%d \u0645\u0627\u0647",y:"\u06cc\u06a9 \u0633\u0627\u0644",yy:"%d \u0633\u0627\u0644"},preparse:function(n){return n.replace(/[\u06f0-\u06f9]/g,function(n){return e[n]}).replace(/\u060c/g,",")},postformat:function(n){return n.replace(/\d/g,function(n){return t[n]}).replace(/,/g,"\u060c")},dayOfMonthOrdinalParse:/\d{1,2}\u0645/,ordinal:"%d\u0645",week:{dow:6,doy:12}})}(e("PJh5"))},"2s1U":function(n,t,e){!function(n){"use strict";function t(n,t,e,l){var r=n+" ";switch(e){case"s":return t||l?"nekaj sekund":"nekaj sekundami";case"ss":return r+(1===n?t?"sekundo":"sekundi":2===n?t||l?"sekundi":"sekundah":n<5?t||l?"sekunde":"sekundah":"sekund");case"m":return t?"ena minuta":"eno minuto";case"mm":return r+(1===n?t?"minuta":"minuto":2===n?t||l?"minuti":"minutama":n<5?t||l?"minute":"minutami":t||l?"minut":"minutami");case"h":return t?"ena ura":"eno uro";case"hh":return r+(1===n?t?"ura":"uro":2===n?t||l?"uri":"urama":n<5?t||l?"ure":"urami":t||l?"ur":"urami");case"d":return t||l?"en dan":"enim dnem";case"dd":return r+(1===n?t||l?"dan":"dnem":2===n?t||l?"dni":"dnevoma":t||l?"dni":"dnevi");case"M":return t||l?"en mesec":"enim mesecem";case"MM":return r+(1===n?t||l?"mesec":"mesecem":2===n?t||l?"meseca":"mesecema":n<5?t||l?"mesece":"meseci":t||l?"mesecev":"meseci");case"y":return t||l?"eno leto":"enim letom";case"yy":return r+(1===n?t||l?"leto":"letom":2===n?t||l?"leti":"letoma":n<5?t||l?"leta":"leti":t||l?"let":"leti")}}n.defineLocale("sl",{months:"januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljek_torek_sreda_\u010detrtek_petek_sobota".split("_"),weekdaysShort:"ned._pon._tor._sre._\u010det._pet._sob.".split("_"),weekdaysMin:"ne_po_to_sr_\u010de_pe_so".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danes ob] LT",nextDay:"[jutri ob] LT",nextWeek:function(){switch(this.day()){case 0:return"[v] [nedeljo] [ob] LT";case 3:return"[v] [sredo] [ob] LT";case 6:return"[v] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[v] dddd [ob] LT"}},lastDay:"[v\u010deraj ob] LT",lastWeek:function(){switch(this.day()){case 0:return"[prej\u0161njo] [nedeljo] [ob] LT";case 3:return"[prej\u0161njo] [sredo] [ob] LT";case 6:return"[prej\u0161njo] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[prej\u0161nji] dddd [ob] LT"}},sameElse:"L"},relativeTime:{future:"\u010dez %s",past:"pred %s",s:t,ss:t,m:t,mm:t,h:t,hh:t,d:t,dd:t,M:t,MM:t,y:t,yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(e("PJh5"))},"3CJN":function(n,t,e){!function(n){"use strict";n.defineLocale("af",{months:"Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des".split("_"),weekdays:"Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag".split("_"),weekdaysShort:"Son_Maa_Din_Woe_Don_Vry_Sat".split("_"),weekdaysMin:"So_Ma_Di_Wo_Do_Vr_Sa".split("_"),meridiemParse:/vm|nm/i,isPM:function(n){return/^nm$/i.test(n)},meridiem:function(n,t,e){return n<12?e?"vm":"VM":e?"nm":"NM"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Vandag om] LT",nextDay:"[M\xf4re om] LT",nextWeek:"dddd [om] LT",lastDay:"[Gister om] LT",lastWeek:"[Laas] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oor %s",past:"%s gelede",s:"'n paar sekondes",ss:"%d sekondes",m:"'n minuut",mm:"%d minute",h:"'n uur",hh:"%d ure",d:"'n dag",dd:"%d dae",M:"'n maand",MM:"%d maande",y:"'n jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(n){return n+(1===n||8===n||n>=20?"ste":"de")},week:{dow:1,doy:4}})}(e("PJh5"))},"3IRH":function(n,t){n.exports=function(n){return n.webpackPolyfill||(n.deprecate=function(){},n.paths=[],n.children||(n.children=[]),Object.defineProperty(n,"loaded",{enumerable:!0,get:function(){return n.l}}),Object.defineProperty(n,"id",{enumerable:!0,get:function(){return n.i}}),n.webpackPolyfill=1),n}},"3K28":function(n,t,e){!function(n){"use strict";var t="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),e="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),l=[/^jan/i,/^feb/i,/^maart|mrt.?$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],r=/^(januari|februari|maart|april|mei|april|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;n.defineLocale("nl",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(n,l){return n?/-MMM-/.test(l)?e[n.month()]:t[n.month()]:t},monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(januari|februari|maart|mei|ju[nl]i|april|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:l,longMonthsParse:l,shortMonthsParse:l,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"zo_ma_di_wo_do_vr_za".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",ss:"%d seconden",m:"\xe9\xe9n minuut",mm:"%d minuten",h:"\xe9\xe9n uur",hh:"%d uur",d:"\xe9\xe9n dag",dd:"%d dagen",M:"\xe9\xe9n maand",MM:"%d maanden",y:"\xe9\xe9n jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(n){return n+(1===n||8===n||n>=20?"ste":"de")},week:{dow:1,doy:4}})}(e("PJh5"))},"3LKG":function(n,t,e){!function(n){"use strict";n.defineLocale("tl-ph",{months:"Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre".split("_"),monthsShort:"Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis".split("_"),weekdays:"Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado".split("_"),weekdaysShort:"Lin_Lun_Mar_Miy_Huw_Biy_Sab".split("_"),weekdaysMin:"Li_Lu_Ma_Mi_Hu_Bi_Sab".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"MM/D/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY HH:mm",LLLL:"dddd, MMMM DD, YYYY HH:mm"},calendar:{sameDay:"LT [ngayong araw]",nextDay:"[Bukas ng] LT",nextWeek:"LT [sa susunod na] dddd",lastDay:"LT [kahapon]",lastWeek:"LT [noong nakaraang] dddd",sameElse:"L"},relativeTime:{future:"sa loob ng %s",past:"%s ang nakalipas",s:"ilang segundo",ss:"%d segundo",m:"isang minuto",mm:"%d minuto",h:"isang oras",hh:"%d oras",d:"isang araw",dd:"%d araw",M:"isang buwan",MM:"%d buwan",y:"isang taon",yy:"%d taon"},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:function(n){return n},week:{dow:1,doy:4}})}(e("PJh5"))},"3MVc":function(n,t,e){!function(n){"use strict";var t={1:"\u0661",2:"\u0662",3:"\u0663",4:"\u0664",5:"\u0665",6:"\u0666",7:"\u0667",8:"\u0668",9:"\u0669",0:"\u0660"},e={"\u0661":"1","\u0662":"2","\u0663":"3","\u0664":"4","\u0665":"5","\u0666":"6","\u0667":"7","\u0668":"8","\u0669":"9","\u0660":"0"},l=function(n){return 0===n?0:1===n?1:2===n?2:n%100>=3&&n%100<=10?3:n%100>=11?4:5},r={s:["\u0623\u0642\u0644 \u0645\u0646 \u062b\u0627\u0646\u064a\u0629","\u062b\u0627\u0646\u064a\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062b\u0627\u0646\u064a\u062a\u0627\u0646","\u062b\u0627\u0646\u064a\u062a\u064a\u0646"],"%d \u062b\u0648\u0627\u0646","%d \u062b\u0627\u0646\u064a\u0629","%d \u062b\u0627\u0646\u064a\u0629"],m:["\u0623\u0642\u0644 \u0645\u0646 \u062f\u0642\u064a\u0642\u0629","\u062f\u0642\u064a\u0642\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062f\u0642\u064a\u0642\u062a\u0627\u0646","\u062f\u0642\u064a\u0642\u062a\u064a\u0646"],"%d \u062f\u0642\u0627\u0626\u0642","%d \u062f\u0642\u064a\u0642\u0629","%d \u062f\u0642\u064a\u0642\u0629"],h:["\u0623\u0642\u0644 \u0645\u0646 \u0633\u0627\u0639\u0629","\u0633\u0627\u0639\u0629 \u0648\u0627\u062d\u062f\u0629",["\u0633\u0627\u0639\u062a\u0627\u0646","\u0633\u0627\u0639\u062a\u064a\u0646"],"%d \u0633\u0627\u0639\u0627\u062a","%d \u0633\u0627\u0639\u0629","%d \u0633\u0627\u0639\u0629"],d:["\u0623\u0642\u0644 \u0645\u0646 \u064a\u0648\u0645","\u064a\u0648\u0645 \u0648\u0627\u062d\u062f",["\u064a\u0648\u0645\u0627\u0646","\u064a\u0648\u0645\u064a\u0646"],"%d \u0623\u064a\u0627\u0645","%d \u064a\u0648\u0645\u064b\u0627","%d \u064a\u0648\u0645"],M:["\u0623\u0642\u0644 \u0645\u0646 \u0634\u0647\u0631","\u0634\u0647\u0631 \u0648\u0627\u062d\u062f",["\u0634\u0647\u0631\u0627\u0646","\u0634\u0647\u0631\u064a\u0646"],"%d \u0623\u0634\u0647\u0631","%d \u0634\u0647\u0631\u0627","%d \u0634\u0647\u0631"],y:["\u0623\u0642\u0644 \u0645\u0646 \u0639\u0627\u0645","\u0639\u0627\u0645 \u0648\u0627\u062d\u062f",["\u0639\u0627\u0645\u0627\u0646","\u0639\u0627\u0645\u064a\u0646"],"%d \u0623\u0639\u0648\u0627\u0645","%d \u0639\u0627\u0645\u064b\u0627","%d \u0639\u0627\u0645"]},i=function(n){return function(t,e,i,o){var s=l(t),a=r[n][l(t)];return 2===s&&(a=a[e?0:1]),a.replace(/%d/i,t)}},o=["\u064a\u0646\u0627\u064a\u0631","\u0641\u0628\u0631\u0627\u064a\u0631","\u0645\u0627\u0631\u0633","\u0623\u0628\u0631\u064a\u0644","\u0645\u0627\u064a\u0648","\u064a\u0648\u0646\u064a\u0648","\u064a\u0648\u0644\u064a\u0648","\u0623\u063a\u0633\u0637\u0633","\u0633\u0628\u062a\u0645\u0628\u0631","\u0623\u0643\u062a\u0648\u0628\u0631","\u0646\u0648\u0641\u0645\u0628\u0631","\u062f\u064a\u0633\u0645\u0628\u0631"];n.defineLocale("ar",{months:o,monthsShort:o,weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/\u200fM/\u200fYYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0635|\u0645/,isPM:function(n){return"\u0645"===n},meridiem:function(n,t,e){return n<12?"\u0635":"\u0645"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u064b\u0627 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0628\u0639\u062f %s",past:"\u0645\u0646\u0630 %s",s:i("s"),ss:i("s"),m:i("m"),mm:i("m"),h:i("h"),hh:i("h"),d:i("d"),dd:i("d"),M:i("M"),MM:i("M"),y:i("y"),yy:i("y")},preparse:function(n){return n.replace(/[\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u0660]/g,function(n){return e[n]}).replace(/\u060c/g,",")},postformat:function(n){return n.replace(/\d/g,function(n){return t[n]}).replace(/,/g,"\u060c")},week:{dow:6,doy:12}})}(e("PJh5"))},"3a3m":function(n,t,e){"use strict";t.a=function(){return function(n){return Object(r.a)()(Object(l.a)(o)(n))}};var l=e("Jwyl"),r=e("0P3J"),i=e("g5jc");function o(){return new i.a}},"3hfc":function(n,t,e){!function(n){"use strict";function t(n,t,e){var l,r;return"m"===e?t?"\u0445\u0432\u0456\u043b\u0456\u043d\u0430":"\u0445\u0432\u0456\u043b\u0456\u043d\u0443":"h"===e?t?"\u0433\u0430\u0434\u0437\u0456\u043d\u0430":"\u0433\u0430\u0434\u0437\u0456\u043d\u0443":n+" "+(l=+n,r={ss:t?"\u0441\u0435\u043a\u0443\u043d\u0434\u0430_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434":"\u0441\u0435\u043a\u0443\u043d\u0434\u0443_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434",mm:t?"\u0445\u0432\u0456\u043b\u0456\u043d\u0430_\u0445\u0432\u0456\u043b\u0456\u043d\u044b_\u0445\u0432\u0456\u043b\u0456\u043d":"\u0445\u0432\u0456\u043b\u0456\u043d\u0443_\u0445\u0432\u0456\u043b\u0456\u043d\u044b_\u0445\u0432\u0456\u043b\u0456\u043d",hh:t?"\u0433\u0430\u0434\u0437\u0456\u043d\u0430_\u0433\u0430\u0434\u0437\u0456\u043d\u044b_\u0433\u0430\u0434\u0437\u0456\u043d":"\u0433\u0430\u0434\u0437\u0456\u043d\u0443_\u0433\u0430\u0434\u0437\u0456\u043d\u044b_\u0433\u0430\u0434\u0437\u0456\u043d",dd:"\u0434\u0437\u0435\u043d\u044c_\u0434\u043d\u0456_\u0434\u0437\u0451\u043d",MM:"\u043c\u0435\u0441\u044f\u0446_\u043c\u0435\u0441\u044f\u0446\u044b_\u043c\u0435\u0441\u044f\u0446\u0430\u045e",yy:"\u0433\u043e\u0434_\u0433\u0430\u0434\u044b_\u0433\u0430\u0434\u043e\u045e"}[e].split("_"),l%10==1&&l%100!=11?r[0]:l%10>=2&&l%10<=4&&(l%100<10||l%100>=20)?r[1]:r[2])}n.defineLocale("be",{months:{format:"\u0441\u0442\u0443\u0434\u0437\u0435\u043d\u044f_\u043b\u044e\u0442\u0430\u0433\u0430_\u0441\u0430\u043a\u0430\u0432\u0456\u043a\u0430_\u043a\u0440\u0430\u0441\u0430\u0432\u0456\u043a\u0430_\u0442\u0440\u0430\u045e\u043d\u044f_\u0447\u044d\u0440\u0432\u0435\u043d\u044f_\u043b\u0456\u043f\u0435\u043d\u044f_\u0436\u043d\u0456\u045e\u043d\u044f_\u0432\u0435\u0440\u0430\u0441\u043d\u044f_\u043a\u0430\u0441\u0442\u0440\u044b\u0447\u043d\u0456\u043a\u0430_\u043b\u0456\u0441\u0442\u0430\u043f\u0430\u0434\u0430_\u0441\u043d\u0435\u0436\u043d\u044f".split("_"),standalone:"\u0441\u0442\u0443\u0434\u0437\u0435\u043d\u044c_\u043b\u044e\u0442\u044b_\u0441\u0430\u043a\u0430\u0432\u0456\u043a_\u043a\u0440\u0430\u0441\u0430\u0432\u0456\u043a_\u0442\u0440\u0430\u0432\u0435\u043d\u044c_\u0447\u044d\u0440\u0432\u0435\u043d\u044c_\u043b\u0456\u043f\u0435\u043d\u044c_\u0436\u043d\u0456\u0432\u0435\u043d\u044c_\u0432\u0435\u0440\u0430\u0441\u0435\u043d\u044c_\u043a\u0430\u0441\u0442\u0440\u044b\u0447\u043d\u0456\u043a_\u043b\u0456\u0441\u0442\u0430\u043f\u0430\u0434_\u0441\u043d\u0435\u0436\u0430\u043d\u044c".split("_")},monthsShort:"\u0441\u0442\u0443\u0434_\u043b\u044e\u0442_\u0441\u0430\u043a_\u043a\u0440\u0430\u0441_\u0442\u0440\u0430\u0432_\u0447\u044d\u0440\u0432_\u043b\u0456\u043f_\u0436\u043d\u0456\u0432_\u0432\u0435\u0440_\u043a\u0430\u0441\u0442_\u043b\u0456\u0441\u0442_\u0441\u043d\u0435\u0436".split("_"),weekdays:{format:"\u043d\u044f\u0434\u0437\u0435\u043b\u044e_\u043f\u0430\u043d\u044f\u0434\u0437\u0435\u043b\u0430\u043a_\u0430\u045e\u0442\u043e\u0440\u0430\u043a_\u0441\u0435\u0440\u0430\u0434\u0443_\u0447\u0430\u0446\u0432\u0435\u0440_\u043f\u044f\u0442\u043d\u0456\u0446\u0443_\u0441\u0443\u0431\u043e\u0442\u0443".split("_"),standalone:"\u043d\u044f\u0434\u0437\u0435\u043b\u044f_\u043f\u0430\u043d\u044f\u0434\u0437\u0435\u043b\u0430\u043a_\u0430\u045e\u0442\u043e\u0440\u0430\u043a_\u0441\u0435\u0440\u0430\u0434\u0430_\u0447\u0430\u0446\u0432\u0435\u0440_\u043f\u044f\u0442\u043d\u0456\u0446\u0430_\u0441\u0443\u0431\u043e\u0442\u0430".split("_"),isFormat:/\[ ?[\u0412\u0432] ?(?:\u043c\u0456\u043d\u0443\u043b\u0443\u044e|\u043d\u0430\u0441\u0442\u0443\u043f\u043d\u0443\u044e)? ?\] ?dddd/},weekdaysShort:"\u043d\u0434_\u043f\u043d_\u0430\u0442_\u0441\u0440_\u0447\u0446_\u043f\u0442_\u0441\u0431".split("_"),weekdaysMin:"\u043d\u0434_\u043f\u043d_\u0430\u0442_\u0441\u0440_\u0447\u0446_\u043f\u0442_\u0441\u0431".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0433.",LLL:"D MMMM YYYY \u0433., HH:mm",LLLL:"dddd, D MMMM YYYY \u0433., HH:mm"},calendar:{sameDay:"[\u0421\u0451\u043d\u043d\u044f \u045e] LT",nextDay:"[\u0417\u0430\u045e\u0442\u0440\u0430 \u045e] LT",lastDay:"[\u0423\u0447\u043e\u0440\u0430 \u045e] LT",nextWeek:function(){return"[\u0423] dddd [\u045e] LT"},lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return"[\u0423 \u043c\u0456\u043d\u0443\u043b\u0443\u044e] dddd [\u045e] LT";case 1:case 2:case 4:return"[\u0423 \u043c\u0456\u043d\u0443\u043b\u044b] dddd [\u045e] LT"}},sameElse:"L"},relativeTime:{future:"\u043f\u0440\u0430\u0437 %s",past:"%s \u0442\u0430\u043c\u0443",s:"\u043d\u0435\u043a\u0430\u043b\u044c\u043a\u0456 \u0441\u0435\u043a\u0443\u043d\u0434",m:t,mm:t,h:t,hh:t,d:"\u0434\u0437\u0435\u043d\u044c",dd:t,M:"\u043c\u0435\u0441\u044f\u0446",MM:t,y:"\u0433\u043e\u0434",yy:t},meridiemParse:/\u043d\u043e\u0447\u044b|\u0440\u0430\u043d\u0456\u0446\u044b|\u0434\u043d\u044f|\u0432\u0435\u0447\u0430\u0440\u0430/,isPM:function(n){return/^(\u0434\u043d\u044f|\u0432\u0435\u0447\u0430\u0440\u0430)$/.test(n)},meridiem:function(n,t,e){return n<4?"\u043d\u043e\u0447\u044b":n<12?"\u0440\u0430\u043d\u0456\u0446\u044b":n<17?"\u0434\u043d\u044f":"\u0432\u0435\u0447\u0430\u0440\u0430"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0456|\u044b|\u0433\u0430)/,ordinal:function(n,t){switch(t){case"M":case"d":case"DDD":case"w":case"W":return n%10!=2&&n%10!=3||n%100==12||n%100==13?n+"-\u044b":n+"-\u0456";case"D":return n+"-\u0433\u0430";default:return n}},week:{dow:1,doy:7}})}(e("PJh5"))},"5Omq":function(n,t,e){!function(n){"use strict";n.defineLocale("se",{months:"o\u0111\u0111ajagem\xe1nnu_guovvam\xe1nnu_njuk\u010dam\xe1nnu_cuo\u014bom\xe1nnu_miessem\xe1nnu_geassem\xe1nnu_suoidnem\xe1nnu_borgem\xe1nnu_\u010dak\u010dam\xe1nnu_golggotm\xe1nnu_sk\xe1bmam\xe1nnu_juovlam\xe1nnu".split("_"),monthsShort:"o\u0111\u0111j_guov_njuk_cuo_mies_geas_suoi_borg_\u010dak\u010d_golg_sk\xe1b_juov".split("_"),weekdays:"sotnabeaivi_vuoss\xe1rga_ma\u014b\u014beb\xe1rga_gaskavahkku_duorastat_bearjadat_l\xe1vvardat".split("_"),weekdaysShort:"sotn_vuos_ma\u014b_gask_duor_bear_l\xe1v".split("_"),weekdaysMin:"s_v_m_g_d_b_L".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"MMMM D. [b.] YYYY",LLL:"MMMM D. [b.] YYYY [ti.] HH:mm",LLLL:"dddd, MMMM D. [b.] YYYY [ti.] HH:mm"},calendar:{sameDay:"[otne ti] LT",nextDay:"[ihttin ti] LT",nextWeek:"dddd [ti] LT",lastDay:"[ikte ti] LT",lastWeek:"[ovddit] dddd [ti] LT",sameElse:"L"},relativeTime:{future:"%s gea\u017ees",past:"ma\u014bit %s",s:"moadde sekunddat",ss:"%d sekunddat",m:"okta minuhta",mm:"%d minuhtat",h:"okta diimmu",hh:"%d diimmut",d:"okta beaivi",dd:"%d beaivvit",M:"okta m\xe1nnu",MM:"%d m\xe1nut",y:"okta jahki",yy:"%d jagit"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(e("PJh5"))},"5SNd":function(n,t,e){!function(n){"use strict";var t={0:"-\u0443\u043c",1:"-\u0443\u043c",2:"-\u044e\u043c",3:"-\u044e\u043c",4:"-\u0443\u043c",5:"-\u0443\u043c",6:"-\u0443\u043c",7:"-\u0443\u043c",8:"-\u0443\u043c",9:"-\u0443\u043c",10:"-\u0443\u043c",12:"-\u0443\u043c",13:"-\u0443\u043c",20:"-\u0443\u043c",30:"-\u044e\u043c",40:"-\u0443\u043c",50:"-\u0443\u043c",60:"-\u0443\u043c",70:"-\u0443\u043c",80:"-\u0443\u043c",90:"-\u0443\u043c",100:"-\u0443\u043c"};n.defineLocale("tg",{months:"\u044f\u043d\u0432\u0430\u0440_\u0444\u0435\u0432\u0440\u0430\u043b_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0435\u043b_\u043c\u0430\u0439_\u0438\u044e\u043d_\u0438\u044e\u043b_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043d\u0442\u044f\u0431\u0440_\u043e\u043a\u0442\u044f\u0431\u0440_\u043d\u043e\u044f\u0431\u0440_\u0434\u0435\u043a\u0430\u0431\u0440".split("_"),monthsShort:"\u044f\u043d\u0432_\u0444\u0435\u0432_\u043c\u0430\u0440_\u0430\u043f\u0440_\u043c\u0430\u0439_\u0438\u044e\u043d_\u0438\u044e\u043b_\u0430\u0432\u0433_\u0441\u0435\u043d_\u043e\u043a\u0442_\u043d\u043e\u044f_\u0434\u0435\u043a".split("_"),weekdays:"\u044f\u043a\u0448\u0430\u043d\u0431\u0435_\u0434\u0443\u0448\u0430\u043d\u0431\u0435_\u0441\u0435\u0448\u0430\u043d\u0431\u0435_\u0447\u043e\u0440\u0448\u0430\u043d\u0431\u0435_\u043f\u0430\u043d\u04b7\u0448\u0430\u043d\u0431\u0435_\u04b7\u0443\u043c\u044a\u0430_\u0448\u0430\u043d\u0431\u0435".split("_"),weekdaysShort:"\u044f\u0448\u0431_\u0434\u0448\u0431_\u0441\u0448\u0431_\u0447\u0448\u0431_\u043f\u0448\u0431_\u04b7\u0443\u043c_\u0448\u043d\u0431".split("_"),weekdaysMin:"\u044f\u0448_\u0434\u0448_\u0441\u0448_\u0447\u0448_\u043f\u0448_\u04b7\u043c_\u0448\u0431".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0418\u043c\u0440\u04ef\u0437 \u0441\u043e\u0430\u0442\u0438] LT",nextDay:"[\u041f\u0430\u0433\u043e\u04b3 \u0441\u043e\u0430\u0442\u0438] LT",lastDay:"[\u0414\u0438\u0440\u04ef\u0437 \u0441\u043e\u0430\u0442\u0438] LT",nextWeek:"dddd[\u0438] [\u04b3\u0430\u0444\u0442\u0430\u0438 \u043e\u044f\u043d\u0434\u0430 \u0441\u043e\u0430\u0442\u0438] LT",lastWeek:"dddd[\u0438] [\u04b3\u0430\u0444\u0442\u0430\u0438 \u0433\u0443\u0437\u0430\u0448\u0442\u0430 \u0441\u043e\u0430\u0442\u0438] LT",sameElse:"L"},relativeTime:{future:"\u0431\u0430\u044a\u0434\u0438 %s",past:"%s \u043f\u0435\u0448",s:"\u044f\u043a\u0447\u0430\u043d\u0434 \u0441\u043e\u043d\u0438\u044f",m:"\u044f\u043a \u0434\u0430\u049b\u0438\u049b\u0430",mm:"%d \u0434\u0430\u049b\u0438\u049b\u0430",h:"\u044f\u043a \u0441\u043e\u0430\u0442",hh:"%d \u0441\u043e\u0430\u0442",d:"\u044f\u043a \u0440\u04ef\u0437",dd:"%d \u0440\u04ef\u0437",M:"\u044f\u043a \u043c\u043e\u04b3",MM:"%d \u043c\u043e\u04b3",y:"\u044f\u043a \u0441\u043e\u043b",yy:"%d \u0441\u043e\u043b"},meridiemParse:/\u0448\u0430\u0431|\u0441\u0443\u0431\u04b3|\u0440\u04ef\u0437|\u0431\u0435\u0433\u043e\u04b3/,meridiemHour:function(n,t){return 12===n&&(n=0),"\u0448\u0430\u0431"===t?n<4?n:n+12:"\u0441\u0443\u0431\u04b3"===t?n:"\u0440\u04ef\u0437"===t?n>=11?n:n+12:"\u0431\u0435\u0433\u043e\u04b3"===t?n+12:void 0},meridiem:function(n,t,e){return n<4?"\u0448\u0430\u0431":n<11?"\u0441\u0443\u0431\u04b3":n<16?"\u0440\u04ef\u0437":n<19?"\u0431\u0435\u0433\u043e\u04b3":"\u0448\u0430\u0431"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0443\u043c|\u044e\u043c)/,ordinal:function(n){return n+(t[n]||t[n%10]||t[n>=100?100:null])},week:{dow:1,doy:7}})}(e("PJh5"))},"5X6E":function(n,t,e){"use strict";t.a=function(n,t){return function(e){return e.lift(new o(n,t))}};var l=e("TToO"),r=e("tZ2B"),i=e("PIsA"),o=function(){function n(n,t){this.project=n,this.resultSelector=t}return n.prototype.call=function(n,t){return t.subscribe(new s(n,this.project,this.resultSelector))},n}(),s=function(n){function t(t,e,l){n.call(this,t),this.project=e,this.resultSelector=l,this.index=0}return Object(l.__extends)(t,n),t.prototype._next=function(n){var t,e=this.index++;try{t=this.project(n,e)}catch(n){return void this.destination.error(n)}this._innerSub(t,n,e)},t.prototype._innerSub=function(n,t,e){var l=this.innerSubscription;l&&l.unsubscribe(),this.add(this.innerSubscription=Object(i.a)(this,n,t,e))},t.prototype._complete=function(){var t=this.innerSubscription;t&&!t.closed||n.prototype._complete.call(this)},t.prototype._unsubscribe=function(){this.innerSubscription=null},t.prototype.notifyComplete=function(t){this.remove(t),this.innerSubscription=null,this.isStopped&&n.prototype._complete.call(this)},t.prototype.notifyNext=function(n,t,e,l,r){this.resultSelector?this._tryNotifyNext(n,t,e,l):this.destination.next(t)},t.prototype._tryNotifyNext=function(n,t,e,l){var r;try{r=this.resultSelector(n,t,e,l)}catch(n){return void this.destination.error(n)}this.destination.next(r)},t}(r.a)},"5j66":function(n,t,e){!function(n){"use strict";n.defineLocale("km",{months:"\u1798\u1780\u179a\u17b6_\u1780\u17bb\u1798\u17d2\u1797\u17c8_\u1798\u17b8\u1793\u17b6_\u1798\u17c1\u179f\u17b6_\u17a7\u179f\u1797\u17b6_\u1798\u17b7\u1790\u17bb\u1793\u17b6_\u1780\u1780\u17d2\u1780\u178a\u17b6_\u179f\u17b8\u17a0\u17b6_\u1780\u1789\u17d2\u1789\u17b6_\u178f\u17bb\u179b\u17b6_\u179c\u17b7\u1785\u17d2\u1786\u17b7\u1780\u17b6_\u1792\u17d2\u1793\u17bc".split("_"),monthsShort:"\u1798\u1780\u179a\u17b6_\u1780\u17bb\u1798\u17d2\u1797\u17c8_\u1798\u17b8\u1793\u17b6_\u1798\u17c1\u179f\u17b6_\u17a7\u179f\u1797\u17b6_\u1798\u17b7\u1790\u17bb\u1793\u17b6_\u1780\u1780\u17d2\u1780\u178a\u17b6_\u179f\u17b8\u17a0\u17b6_\u1780\u1789\u17d2\u1789\u17b6_\u178f\u17bb\u179b\u17b6_\u179c\u17b7\u1785\u17d2\u1786\u17b7\u1780\u17b6_\u1792\u17d2\u1793\u17bc".split("_"),weekdays:"\u17a2\u17b6\u1791\u17b7\u178f\u17d2\u1799_\u1785\u17d0\u1793\u17d2\u1791_\u17a2\u1784\u17d2\u1782\u17b6\u179a_\u1796\u17bb\u1792_\u1796\u17d2\u179a\u17a0\u179f\u17d2\u1794\u178f\u17b7\u17cd_\u179f\u17bb\u1780\u17d2\u179a_\u179f\u17c5\u179a\u17cd".split("_"),weekdaysShort:"\u17a2\u17b6\u1791\u17b7\u178f\u17d2\u1799_\u1785\u17d0\u1793\u17d2\u1791_\u17a2\u1784\u17d2\u1782\u17b6\u179a_\u1796\u17bb\u1792_\u1796\u17d2\u179a\u17a0\u179f\u17d2\u1794\u178f\u17b7\u17cd_\u179f\u17bb\u1780\u17d2\u179a_\u179f\u17c5\u179a\u17cd".split("_"),weekdaysMin:"\u17a2\u17b6\u1791\u17b7\u178f\u17d2\u1799_\u1785\u17d0\u1793\u17d2\u1791_\u17a2\u1784\u17d2\u1782\u17b6\u179a_\u1796\u17bb\u1792_\u1796\u17d2\u179a\u17a0\u179f\u17d2\u1794\u178f\u17b7\u17cd_\u179f\u17bb\u1780\u17d2\u179a_\u179f\u17c5\u179a\u17cd".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u1790\u17d2\u1784\u17c3\u1793\u17c1\u17c7 \u1798\u17c9\u17c4\u1784] LT",nextDay:"[\u179f\u17d2\u17a2\u17c2\u1780 \u1798\u17c9\u17c4\u1784] LT",nextWeek:"dddd [\u1798\u17c9\u17c4\u1784] LT",lastDay:"[\u1798\u17d2\u179f\u17b7\u179b\u1798\u17b7\u1789 \u1798\u17c9\u17c4\u1784] LT",lastWeek:"dddd [\u179f\u1794\u17d2\u178f\u17b6\u17a0\u17cd\u1798\u17bb\u1793] [\u1798\u17c9\u17c4\u1784] LT",sameElse:"L"},relativeTime:{future:"%s\u1791\u17c0\u178f",past:"%s\u1798\u17bb\u1793",s:"\u1794\u17c9\u17bb\u1793\u17d2\u1798\u17b6\u1793\u179c\u17b7\u1793\u17b6\u1791\u17b8",ss:"%d \u179c\u17b7\u1793\u17b6\u1791\u17b8",m:"\u1798\u17bd\u1799\u1793\u17b6\u1791\u17b8",mm:"%d \u1793\u17b6\u1791\u17b8",h:"\u1798\u17bd\u1799\u1798\u17c9\u17c4\u1784",hh:"%d \u1798\u17c9\u17c4\u1784",d:"\u1798\u17bd\u1799\u1790\u17d2\u1784\u17c3",dd:"%d \u1790\u17d2\u1784\u17c3",M:"\u1798\u17bd\u1799\u1781\u17c2",MM:"%d \u1781\u17c2",y:"\u1798\u17bd\u1799\u1786\u17d2\u1793\u17b6\u17c6",yy:"%d \u1786\u17d2\u1793\u17b6\u17c6"},week:{dow:1,doy:4}})}(e("PJh5"))},"5vPg":function(n,t,e){!function(n){"use strict";var t={1:"\u0967",2:"\u0968",3:"\u0969",4:"\u096a",5:"\u096b",6:"\u096c",7:"\u096d",8:"\u096e",9:"\u096f",0:"\u0966"},e={"\u0967":"1","\u0968":"2","\u0969":"3","\u096a":"4","\u096b":"5","\u096c":"6","\u096d":"7","\u096e":"8","\u096f":"9","\u0966":"0"};function l(n,t,e,l){var r="";if(t)switch(e){case"s":r="\u0915\u093e\u0939\u0940 \u0938\u0947\u0915\u0902\u0926";break;case"ss":r="%d \u0938\u0947\u0915\u0902\u0926";break;case"m":r="\u090f\u0915 \u092e\u093f\u0928\u093f\u091f";break;case"mm":r="%d \u092e\u093f\u0928\u093f\u091f\u0947";break;case"h":r="\u090f\u0915 \u0924\u093e\u0938";break;case"hh":r="%d \u0924\u093e\u0938";break;case"d":r="\u090f\u0915 \u0926\u093f\u0935\u0938";break;case"dd":r="%d \u0926\u093f\u0935\u0938";break;case"M":r="\u090f\u0915 \u092e\u0939\u093f\u0928\u093e";break;case"MM":r="%d \u092e\u0939\u093f\u0928\u0947";break;case"y":r="\u090f\u0915 \u0935\u0930\u094d\u0937";break;case"yy":r="%d \u0935\u0930\u094d\u0937\u0947"}else switch(e){case"s":r="\u0915\u093e\u0939\u0940 \u0938\u0947\u0915\u0902\u0926\u093e\u0902";break;case"ss":r="%d \u0938\u0947\u0915\u0902\u0926\u093e\u0902";break;case"m":r="\u090f\u0915\u093e \u092e\u093f\u0928\u093f\u091f\u093e";break;case"mm":r="%d \u092e\u093f\u0928\u093f\u091f\u093e\u0902";break;case"h":r="\u090f\u0915\u093e \u0924\u093e\u0938\u093e";break;case"hh":r="%d \u0924\u093e\u0938\u093e\u0902";break;case"d":r="\u090f\u0915\u093e \u0926\u093f\u0935\u0938\u093e";break;case"dd":r="%d \u0926\u093f\u0935\u0938\u093e\u0902";break;case"M":r="\u090f\u0915\u093e \u092e\u0939\u093f\u0928\u094d\u092f\u093e";break;case"MM":r="%d \u092e\u0939\u093f\u0928\u094d\u092f\u093e\u0902";break;case"y":r="\u090f\u0915\u093e \u0935\u0930\u094d\u0937\u093e";break;case"yy":r="%d \u0935\u0930\u094d\u0937\u093e\u0902"}return r.replace(/%d/i,n)}n.defineLocale("mr",{months:"\u091c\u093e\u0928\u0947\u0935\u093e\u0930\u0940_\u092b\u0947\u092c\u094d\u0930\u0941\u0935\u093e\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u090f\u092a\u094d\u0930\u093f\u0932_\u092e\u0947_\u091c\u0942\u0928_\u091c\u0941\u0932\u0948_\u0911\u0917\u0938\u094d\u091f_\u0938\u092a\u094d\u091f\u0947\u0902\u092c\u0930_\u0911\u0915\u094d\u091f\u094b\u092c\u0930_\u0928\u094b\u0935\u094d\u0939\u0947\u0902\u092c\u0930_\u0921\u093f\u0938\u0947\u0902\u092c\u0930".split("_"),monthsShort:"\u091c\u093e\u0928\u0947._\u092b\u0947\u092c\u094d\u0930\u0941._\u092e\u093e\u0930\u094d\u091a._\u090f\u092a\u094d\u0930\u093f._\u092e\u0947._\u091c\u0942\u0928._\u091c\u0941\u0932\u0948._\u0911\u0917._\u0938\u092a\u094d\u091f\u0947\u0902._\u0911\u0915\u094d\u091f\u094b._\u0928\u094b\u0935\u094d\u0939\u0947\u0902._\u0921\u093f\u0938\u0947\u0902.".split("_"),monthsParseExact:!0,weekdays:"\u0930\u0935\u093f\u0935\u093e\u0930_\u0938\u094b\u092e\u0935\u093e\u0930_\u092e\u0902\u0917\u0933\u0935\u093e\u0930_\u092c\u0941\u0927\u0935\u093e\u0930_\u0917\u0941\u0930\u0942\u0935\u093e\u0930_\u0936\u0941\u0915\u094d\u0930\u0935\u093e\u0930_\u0936\u0928\u093f\u0935\u093e\u0930".split("_"),weekdaysShort:"\u0930\u0935\u093f_\u0938\u094b\u092e_\u092e\u0902\u0917\u0933_\u092c\u0941\u0927_\u0917\u0941\u0930\u0942_\u0936\u0941\u0915\u094d\u0930_\u0936\u0928\u093f".split("_"),weekdaysMin:"\u0930_\u0938\u094b_\u092e\u0902_\u092c\u0941_\u0917\u0941_\u0936\u0941_\u0936".split("_"),longDateFormat:{LT:"A h:mm \u0935\u093e\u091c\u0924\u093e",LTS:"A h:mm:ss \u0935\u093e\u091c\u0924\u093e",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u0935\u093e\u091c\u0924\u093e",LLLL:"dddd, D MMMM YYYY, A h:mm \u0935\u093e\u091c\u0924\u093e"},calendar:{sameDay:"[\u0906\u091c] LT",nextDay:"[\u0909\u0926\u094d\u092f\u093e] LT",nextWeek:"dddd, LT",lastDay:"[\u0915\u093e\u0932] LT",lastWeek:"[\u092e\u093e\u0917\u0940\u0932] dddd, LT",sameElse:"L"},relativeTime:{future:"%s\u092e\u0927\u094d\u092f\u0947",past:"%s\u092a\u0942\u0930\u094d\u0935\u0940",s:l,ss:l,m:l,mm:l,h:l,hh:l,d:l,dd:l,M:l,MM:l,y:l,yy:l},preparse:function(n){return n.replace(/[\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u0966]/g,function(n){return e[n]})},postformat:function(n){return n.replace(/\d/g,function(n){return t[n]})},meridiemParse:/\u0930\u093e\u0924\u094d\u0930\u0940|\u0938\u0915\u093e\u0933\u0940|\u0926\u0941\u092a\u093e\u0930\u0940|\u0938\u093e\u092f\u0902\u0915\u093e\u0933\u0940/,meridiemHour:function(n,t){return 12===n&&(n=0),"\u0930\u093e\u0924\u094d\u0930\u0940"===t?n<4?n:n+12:"\u0938\u0915\u093e\u0933\u0940"===t?n:"\u0926\u0941\u092a\u093e\u0930\u0940"===t?n>=10?n:n+12:"\u0938\u093e\u092f\u0902\u0915\u093e\u0933\u0940"===t?n+12:void 0},meridiem:function(n,t,e){return n<4?"\u0930\u093e\u0924\u094d\u0930\u0940":n<10?"\u0938\u0915\u093e\u0933\u0940":n<17?"\u0926\u0941\u092a\u093e\u0930\u0940":n<20?"\u0938\u093e\u092f\u0902\u0915\u093e\u0933\u0940":"\u0930\u093e\u0924\u094d\u0930\u0940"},week:{dow:0,doy:6}})}(e("PJh5"))},"6cf8":function(n,t,e){!function(n){"use strict";var t={0:"-\u0447\u04af",1:"-\u0447\u0438",2:"-\u0447\u0438",3:"-\u0447\u04af",4:"-\u0447\u04af",5:"-\u0447\u0438",6:"-\u0447\u044b",7:"-\u0447\u0438",8:"-\u0447\u0438",9:"-\u0447\u0443",10:"-\u0447\u0443",20:"-\u0447\u044b",30:"-\u0447\u0443",40:"-\u0447\u044b",50:"-\u0447\u04af",60:"-\u0447\u044b",70:"-\u0447\u0438",80:"-\u0447\u0438",90:"-\u0447\u0443",100:"-\u0447\u04af"};n.defineLocale("ky",{months:"\u044f\u043d\u0432\u0430\u0440\u044c_\u0444\u0435\u0432\u0440\u0430\u043b\u044c_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0435\u043b\u044c_\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044c_\u043e\u043a\u0442\u044f\u0431\u0440\u044c_\u043d\u043e\u044f\u0431\u0440\u044c_\u0434\u0435\u043a\u0430\u0431\u0440\u044c".split("_"),monthsShort:"\u044f\u043d\u0432_\u0444\u0435\u0432_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440_\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433_\u0441\u0435\u043d_\u043e\u043a\u0442_\u043d\u043e\u044f_\u0434\u0435\u043a".split("_"),weekdays:"\u0416\u0435\u043a\u0448\u0435\u043c\u0431\u0438_\u0414\u04af\u0439\u0448\u04e9\u043c\u0431\u04af_\u0428\u0435\u0439\u0448\u0435\u043c\u0431\u0438_\u0428\u0430\u0440\u0448\u0435\u043c\u0431\u0438_\u0411\u0435\u0439\u0448\u0435\u043c\u0431\u0438_\u0416\u0443\u043c\u0430_\u0418\u0448\u0435\u043c\u0431\u0438".split("_"),weekdaysShort:"\u0416\u0435\u043a_\u0414\u04af\u0439_\u0428\u0435\u0439_\u0428\u0430\u0440_\u0411\u0435\u0439_\u0416\u0443\u043c_\u0418\u0448\u0435".split("_"),weekdaysMin:"\u0416\u043a_\u0414\u0439_\u0428\u0439_\u0428\u0440_\u0411\u0439_\u0416\u043c_\u0418\u0448".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0411\u04af\u0433\u04af\u043d \u0441\u0430\u0430\u0442] LT",nextDay:"[\u042d\u0440\u0442\u0435\u04a3 \u0441\u0430\u0430\u0442] LT",nextWeek:"dddd [\u0441\u0430\u0430\u0442] LT",lastDay:"[\u041a\u0435\u0447\u0435 \u0441\u0430\u0430\u0442] LT",lastWeek:"[\u04e8\u0442\u043a\u0435\u043d \u0430\u043f\u0442\u0430\u043d\u044b\u043d] dddd [\u043a\u04af\u043d\u04af] [\u0441\u0430\u0430\u0442] LT",sameElse:"L"},relativeTime:{future:"%s \u0438\u0447\u0438\u043d\u0434\u0435",past:"%s \u043c\u0443\u0440\u0443\u043d",s:"\u0431\u0438\u0440\u043d\u0435\u0447\u0435 \u0441\u0435\u043a\u0443\u043d\u0434",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434",m:"\u0431\u0438\u0440 \u043c\u04af\u043d\u04e9\u0442",mm:"%d \u043c\u04af\u043d\u04e9\u0442",h:"\u0431\u0438\u0440 \u0441\u0430\u0430\u0442",hh:"%d \u0441\u0430\u0430\u0442",d:"\u0431\u0438\u0440 \u043a\u04af\u043d",dd:"%d \u043a\u04af\u043d",M:"\u0431\u0438\u0440 \u0430\u0439",MM:"%d \u0430\u0439",y:"\u0431\u0438\u0440 \u0436\u044b\u043b",yy:"%d \u0436\u044b\u043b"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0447\u0438|\u0447\u044b|\u0447\u04af|\u0447\u0443)/,ordinal:function(n){return n+(t[n]||t[n%10]||t[n>=100?100:null])},week:{dow:1,doy:7}})}(e("PJh5"))},"7LV+":function(n,t,e){!function(n){"use strict";var t="stycze\u0144_luty_marzec_kwiecie\u0144_maj_czerwiec_lipiec_sierpie\u0144_wrzesie\u0144_pa\u017adziernik_listopad_grudzie\u0144".split("_"),e="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_wrze\u015bnia_pa\u017adziernika_listopada_grudnia".split("_");function l(n){return n%10<5&&n%10>1&&~~(n/10)%10!=1}function r(n,t,e){var r=n+" ";switch(e){case"ss":return r+(l(n)?"sekundy":"sekund");case"m":return t?"minuta":"minut\u0119";case"mm":return r+(l(n)?"minuty":"minut");case"h":return t?"godzina":"godzin\u0119";case"hh":return r+(l(n)?"godziny":"godzin");case"MM":return r+(l(n)?"miesi\u0105ce":"miesi\u0119cy");case"yy":return r+(l(n)?"lata":"lat")}}n.defineLocale("pl",{months:function(n,l){return n?""===l?"("+e[n.month()]+"|"+t[n.month()]+")":/D MMMM/.test(l)?e[n.month()]:t[n.month()]:t},monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_pa\u017a_lis_gru".split("_"),weekdays:"niedziela_poniedzia\u0142ek_wtorek_\u015broda_czwartek_pi\u0105tek_sobota".split("_"),weekdaysShort:"ndz_pon_wt_\u015br_czw_pt_sob".split("_"),weekdaysMin:"Nd_Pn_Wt_\u015ar_Cz_Pt_So".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Dzi\u015b o] LT",nextDay:"[Jutro o] LT",nextWeek:function(){switch(this.day()){case 0:return"[W niedziel\u0119 o] LT";case 2:return"[We wtorek o] LT";case 3:return"[W \u015brod\u0119 o] LT";case 6:return"[W sobot\u0119 o] LT";default:return"[W] dddd [o] LT"}},lastDay:"[Wczoraj o] LT",lastWeek:function(){switch(this.day()){case 0:return"[W zesz\u0142\u0105 niedziel\u0119 o] LT";case 3:return"[W zesz\u0142\u0105 \u015brod\u0119 o] LT";case 6:return"[W zesz\u0142\u0105 sobot\u0119 o] LT";default:return"[W zesz\u0142y] dddd [o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",ss:r,m:r,mm:r,h:r,hh:r,d:"1 dzie\u0144",dd:"%d dni",M:"miesi\u0105c",MM:r,y:"rok",yy:r},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(e("PJh5"))},"7MHZ":function(n,t,e){!function(n){"use strict";var t="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),e="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),l=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],r=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;n.defineLocale("es-do",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(n,l){return n?/-MMM-/.test(l)?e[n.month()]:t[n.month()]:t},monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:l,longMonthsParse:l,shortMonthsParse:l,weekdays:"domingo_lunes_martes_mi\xe9rcoles_jueves_viernes_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._mi\xe9._jue._vie._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY h:mm A",LLLL:"dddd, D [de] MMMM [de] YYYY h:mm A"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[ma\xf1ana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",M:"un mes",MM:"%d meses",y:"un a\xf1o",yy:"%d a\xf1os"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(e("PJh5"))},"7OnE":function(n,t,e){!function(n){"use strict";var t={1:"\u0661",2:"\u0662",3:"\u0663",4:"\u0664",5:"\u0665",6:"\u0666",7:"\u0667",8:"\u0668",9:"\u0669",0:"\u0660"},e={"\u0661":"1","\u0662":"2","\u0663":"3","\u0664":"4","\u0665":"5","\u0666":"6","\u0667":"7","\u0668":"8","\u0669":"9","\u0660":"0"};n.defineLocale("ar-sa",{months:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a\u0648_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648_\u0623\u063a\u0633\u0637\u0633_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),monthsShort:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a\u0648_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648_\u0623\u063a\u0633\u0637\u0633_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0635|\u0645/,isPM:function(n){return"\u0645"===n},meridiem:function(n,t,e){return n<12?"\u0635":"\u0645"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},preparse:function(n){return n.replace(/[\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u0660]/g,function(n){return e[n]}).replace(/\u060c/g,",")},postformat:function(n){return n.replace(/\d/g,function(n){return t[n]}).replace(/,/g,"\u060c")},week:{dow:0,doy:6}})}(e("PJh5"))},"7Q8x":function(n,t,e){!function(n){"use strict";n.defineLocale("ss",{months:"Bhimbidvwane_Indlovana_Indlov'lenkhulu_Mabasa_Inkhwekhweti_Inhlaba_Kholwane_Ingci_Inyoni_Imphala_Lweti_Ingongoni".split("_"),monthsShort:"Bhi_Ina_Inu_Mab_Ink_Inh_Kho_Igc_Iny_Imp_Lwe_Igo".split("_"),weekdays:"Lisontfo_Umsombuluko_Lesibili_Lesitsatfu_Lesine_Lesihlanu_Umgcibelo".split("_"),weekdaysShort:"Lis_Umb_Lsb_Les_Lsi_Lsh_Umg".split("_"),weekdaysMin:"Li_Us_Lb_Lt_Ls_Lh_Ug".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Namuhla nga] LT",nextDay:"[Kusasa nga] LT",nextWeek:"dddd [nga] LT",lastDay:"[Itolo nga] LT",lastWeek:"dddd [leliphelile] [nga] LT",sameElse:"L"},relativeTime:{future:"nga %s",past:"wenteka nga %s",s:"emizuzwana lomcane",ss:"%d mzuzwana",m:"umzuzu",mm:"%d emizuzu",h:"lihora",hh:"%d emahora",d:"lilanga",dd:"%d emalanga",M:"inyanga",MM:"%d tinyanga",y:"umnyaka",yy:"%d iminyaka"},meridiemParse:/ekuseni|emini|entsambama|ebusuku/,meridiem:function(n,t,e){return n<11?"ekuseni":n<15?"emini":n<19?"entsambama":"ebusuku"},meridiemHour:function(n,t){return 12===n&&(n=0),"ekuseni"===t?n:"emini"===t?n>=11?n:n+12:"entsambama"===t||"ebusuku"===t?0===n?0:n+12:void 0},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:"%d",week:{dow:1,doy:4}})}(e("PJh5"))},"8D5t":function(n,t,e){"use strict";t.a=function(n){return void 0===n&&(n=Number.POSITIVE_INFINITY),Object(l.a)(r.a,null,n)};var l=e("Qnch"),r=e("lAP5")},"8v14":function(n,t,e){!function(n){"use strict";function t(n,t,e,l){var r={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[n+" Tage",n+" Tagen"],M:["ein Monat","einem Monat"],MM:[n+" Monate",n+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[n+" Jahre",n+" Jahren"]};return t?r[e][0]:r[e][1]}n.defineLocale("de-at",{months:"J\xe4nner_Februar_M\xe4rz_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"J\xe4n._Feb._M\xe4rz_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:t,mm:"%d Minuten",h:t,hh:"%d Stunden",d:t,dd:t,M:t,MM:t,y:t,yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(e("PJh5"))},"9Ocp":function(n,t,e){"use strict";t.a=function(n){return function(t){return 0===n?new o.a:t.lift(new s(n))}};var l=e("TToO"),r=e("OVmG"),i=e("pU/0"),o=e("+3/4"),s=function(){function n(n){if(this.total=n,this.total<0)throw new i.a}return n.prototype.call=function(n,t){return t.subscribe(new a(n,this.total))},n}(),a=function(n){function t(t,e){n.call(this,t),this.total=e,this.count=0}return Object(l.__extends)(t,n),t.prototype._next=function(n){var t=this.total,e=++this.count;e<=t&&(this.destination.next(n),e===t&&(this.destination.complete(),this.unsubscribe()))},t}(r.a)},ALEw:function(n,t,e){!function(n){"use strict";n.defineLocale("en-ie",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(n){var t=n%10;return n+(1==~~(n%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th")},week:{dow:1,doy:4}})}(e("PJh5"))},AMGY:function(n,t,e){"use strict";(function(n){e.d(t,"a",function(){return i});var l="undefined"!=typeof window&&window,r="undefined"!=typeof self&&"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&self,i=l||"undefined"!=typeof n&&n||r}).call(t,e("DuR2"))},Ab7C:function(n,t,e){!function(n){"use strict";n.defineLocale("mk",{months:"\u0458\u0430\u043d\u0443\u0430\u0440\u0438_\u0444\u0435\u0432\u0440\u0443\u0430\u0440\u0438_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0438\u043b_\u043c\u0430\u0458_\u0458\u0443\u043d\u0438_\u0458\u0443\u043b\u0438_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043f\u0442\u0435\u043c\u0432\u0440\u0438_\u043e\u043a\u0442\u043e\u043c\u0432\u0440\u0438_\u043d\u043e\u0435\u043c\u0432\u0440\u0438_\u0434\u0435\u043a\u0435\u043c\u0432\u0440\u0438".split("_"),monthsShort:"\u0458\u0430\u043d_\u0444\u0435\u0432_\u043c\u0430\u0440_\u0430\u043f\u0440_\u043c\u0430\u0458_\u0458\u0443\u043d_\u0458\u0443\u043b_\u0430\u0432\u0433_\u0441\u0435\u043f_\u043e\u043a\u0442_\u043d\u043e\u0435_\u0434\u0435\u043a".split("_"),weekdays:"\u043d\u0435\u0434\u0435\u043b\u0430_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0440\u0442\u043e\u043a_\u043f\u0435\u0442\u043e\u043a_\u0441\u0430\u0431\u043e\u0442\u0430".split("_"),weekdaysShort:"\u043d\u0435\u0434_\u043f\u043e\u043d_\u0432\u0442\u043e_\u0441\u0440\u0435_\u0447\u0435\u0442_\u043f\u0435\u0442_\u0441\u0430\u0431".split("_"),weekdaysMin:"\u043de_\u043fo_\u0432\u0442_\u0441\u0440_\u0447\u0435_\u043f\u0435_\u0441a".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[\u0414\u0435\u043d\u0435\u0441 \u0432\u043e] LT",nextDay:"[\u0423\u0442\u0440\u0435 \u0432\u043e] LT",nextWeek:"[\u0412\u043e] dddd [\u0432\u043e] LT",lastDay:"[\u0412\u0447\u0435\u0440\u0430 \u0432\u043e] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[\u0418\u0437\u043c\u0438\u043d\u0430\u0442\u0430\u0442\u0430] dddd [\u0432\u043e] LT";case 1:case 2:case 4:case 5:return"[\u0418\u0437\u043c\u0438\u043d\u0430\u0442\u0438\u043e\u0442] dddd [\u0432\u043e] LT"}},sameElse:"L"},relativeTime:{future:"\u043f\u043e\u0441\u043b\u0435 %s",past:"\u043f\u0440\u0435\u0434 %s",s:"\u043d\u0435\u043a\u043e\u043b\u043a\u0443 \u0441\u0435\u043a\u0443\u043d\u0434\u0438",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434\u0438",m:"\u043c\u0438\u043d\u0443\u0442\u0430",mm:"%d \u043c\u0438\u043d\u0443\u0442\u0438",h:"\u0447\u0430\u0441",hh:"%d \u0447\u0430\u0441\u0430",d:"\u0434\u0435\u043d",dd:"%d \u0434\u0435\u043d\u0430",M:"\u043c\u0435\u0441\u0435\u0446",MM:"%d \u043c\u0435\u0441\u0435\u0446\u0438",y:"\u0433\u043e\u0434\u0438\u043d\u0430",yy:"%d \u0433\u043e\u0434\u0438\u043d\u0438"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0435\u0432|\u0435\u043d|\u0442\u0438|\u0432\u0438|\u0440\u0438|\u043c\u0438)/,ordinal:function(n){var t=n%10,e=n%100;return 0===n?n+"-\u0435\u0432":0===e?n+"-\u0435\u043d":e>10&&e<20?n+"-\u0442\u0438":1===t?n+"-\u0432\u0438":2===t?n+"-\u0440\u0438":7===t||8===t?n+"-\u043c\u0438":n+"-\u0442\u0438"},week:{dow:1,doy:7}})}(e("PJh5"))},AoDM:function(n,t,e){!function(n){"use strict";n.defineLocale("pt-br",{months:"janeiro_fevereiro_mar\xe7o_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"Domingo_Segunda-feira_Ter\xe7a-feira_Quarta-feira_Quinta-feira_Sexta-feira_S\xe1bado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_S\xe1b".split("_"),weekdaysMin:"Do_2\xaa_3\xaa_4\xaa_5\xaa_6\xaa_S\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [\xe0s] HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY [\xe0s] HH:mm"},calendar:{sameDay:"[Hoje \xe0s] LT",nextDay:"[Amanh\xe3 \xe0s] LT",nextWeek:"dddd [\xe0s] LT",lastDay:"[Ontem \xe0s] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[\xdaltimo] dddd [\xe0s] LT":"[\xdaltima] dddd [\xe0s] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"h\xe1 %s",s:"poucos segundos",ss:"%d segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um m\xeas",MM:"%d meses",y:"um ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba"})}(e("PJh5"))},BEem:function(n,t,e){!function(n){"use strict";n.defineLocale("ar-tn",{months:"\u062c\u0627\u0646\u0641\u064a_\u0641\u064a\u0641\u0631\u064a_\u0645\u0627\u0631\u0633_\u0623\u0641\u0631\u064a\u0644_\u0645\u0627\u064a_\u062c\u0648\u0627\u0646_\u062c\u0648\u064a\u0644\u064a\u0629_\u0623\u0648\u062a_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),monthsShort:"\u062c\u0627\u0646\u0641\u064a_\u0641\u064a\u0641\u0631\u064a_\u0645\u0627\u0631\u0633_\u0623\u0641\u0631\u064a\u0644_\u0645\u0627\u064a_\u062c\u0648\u0627\u0646_\u062c\u0648\u064a\u0644\u064a\u0629_\u0623\u0648\u062a_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},week:{dow:1,doy:4}})}(e("PJh5"))},BX3T:function(n,t,e){"use strict";e.d(t,"a",function(){return l});var l=Array.isArray||function(n){return n&&"number"==typeof n.length}},BbgG:function(n,t,e){!function(n){"use strict";n.defineLocale("zh-tw",{months:"\u4e00\u6708_\u4e8c\u6708_\u4e09\u6708_\u56db\u6708_\u4e94\u6708_\u516d\u6708_\u4e03\u6708_\u516b\u6708_\u4e5d\u6708_\u5341\u6708_\u5341\u4e00\u6708_\u5341\u4e8c\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u661f\u671f\u65e5_\u661f\u671f\u4e00_\u661f\u671f\u4e8c_\u661f\u671f\u4e09_\u661f\u671f\u56db_\u661f\u671f\u4e94_\u661f\u671f\u516d".split("_"),weekdaysShort:"\u9031\u65e5_\u9031\u4e00_\u9031\u4e8c_\u9031\u4e09_\u9031\u56db_\u9031\u4e94_\u9031\u516d".split("_"),weekdaysMin:"\u65e5_\u4e00_\u4e8c_\u4e09_\u56db_\u4e94_\u516d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm",LLLL:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm",l:"YYYY/M/D",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm"},meridiemParse:/\u51cc\u6668|\u65e9\u4e0a|\u4e0a\u5348|\u4e2d\u5348|\u4e0b\u5348|\u665a\u4e0a/,meridiemHour:function(n,t){return 12===n&&(n=0),"\u51cc\u6668"===t||"\u65e9\u4e0a"===t||"\u4e0a\u5348"===t?n:"\u4e2d\u5348"===t?n>=11?n:n+12:"\u4e0b\u5348"===t||"\u665a\u4e0a"===t?n+12:void 0},meridiem:function(n,t,e){var l=100*n+t;return l<600?"\u51cc\u6668":l<900?"\u65e9\u4e0a":l<1130?"\u4e0a\u5348":l<1230?"\u4e2d\u5348":l<1800?"\u4e0b\u5348":"\u665a\u4e0a"},calendar:{sameDay:"[\u4eca\u5929]LT",nextDay:"[\u660e\u5929]LT",nextWeek:"[\u4e0b]ddddLT",lastDay:"[\u6628\u5929]LT",lastWeek:"[\u4e0a]ddddLT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(\u65e5|\u6708|\u9031)/,ordinal:function(n,t){switch(t){case"d":case"D":case"DDD":return n+"\u65e5";case"M":return n+"\u6708";case"w":case"W":return n+"\u9031";default:return n}},relativeTime:{future:"%s\u5167",past:"%s\u524d",s:"\u5e7e\u79d2",ss:"%d \u79d2",m:"1 \u5206\u9418",mm:"%d \u5206\u9418",h:"1 \u5c0f\u6642",hh:"%d \u5c0f\u6642",d:"1 \u5929",dd:"%d \u5929",M:"1 \u500b\u6708",MM:"%d \u500b\u6708",y:"1 \u5e74",yy:"%d \u5e74"}})}(e("PJh5"))},Bp2f:function(n,t,e){!function(n){"use strict";var t="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),e="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),l=[/^jan/i,/^feb/i,/^maart|mrt.?$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],r=/^(januari|februari|maart|april|mei|april|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;n.defineLocale("nl-be",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(n,l){return n?/-MMM-/.test(l)?e[n.month()]:t[n.month()]:t},monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(januari|februari|maart|mei|ju[nl]i|april|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:l,longMonthsParse:l,shortMonthsParse:l,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"zo_ma_di_wo_do_vr_za".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",ss:"%d seconden",m:"\xe9\xe9n minuut",mm:"%d minuten",h:"\xe9\xe9n uur",hh:"%d uur",d:"\xe9\xe9n dag",dd:"%d dagen",M:"\xe9\xe9n maand",MM:"%d maanden",y:"\xe9\xe9n jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(n){return n+(1===n||8===n||n>=20?"ste":"de")},week:{dow:1,doy:4}})}(e("PJh5"))},C7av:function(n,t,e){!function(n){"use strict";n.defineLocale("nn",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sundag_m\xe5ndag_tysdag_onsdag_torsdag_fredag_laurdag".split("_"),weekdaysShort:"sun_m\xe5n_tys_ons_tor_fre_lau".split("_"),weekdaysMin:"su_m\xe5_ty_on_to_fr_l\xf8".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[I dag klokka] LT",nextDay:"[I morgon klokka] LT",nextWeek:"dddd [klokka] LT",lastDay:"[I g\xe5r klokka] LT",lastWeek:"[F\xf8reg\xe5ande] dddd [klokka] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s sidan",s:"nokre sekund",ss:"%d sekund",m:"eit minutt",mm:"%d minutt",h:"ein time",hh:"%d timar",d:"ein dag",dd:"%d dagar",M:"ein m\xe5nad",MM:"%d m\xe5nader",y:"eit \xe5r",yy:"%d \xe5r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(e("PJh5"))},CFqe:function(n,t,e){!function(n){"use strict";n.defineLocale("el",{monthsNominativeEl:"\u0399\u03b1\u03bd\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2_\u03a6\u03b5\u03b2\u03c1\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2_\u039c\u03ac\u03c1\u03c4\u03b9\u03bf\u03c2_\u0391\u03c0\u03c1\u03af\u03bb\u03b9\u03bf\u03c2_\u039c\u03ac\u03b9\u03bf\u03c2_\u0399\u03bf\u03cd\u03bd\u03b9\u03bf\u03c2_\u0399\u03bf\u03cd\u03bb\u03b9\u03bf\u03c2_\u0391\u03cd\u03b3\u03bf\u03c5\u03c3\u03c4\u03bf\u03c2_\u03a3\u03b5\u03c0\u03c4\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2_\u039f\u03ba\u03c4\u03ce\u03b2\u03c1\u03b9\u03bf\u03c2_\u039d\u03bf\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2_\u0394\u03b5\u03ba\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2".split("_"),monthsGenitiveEl:"\u0399\u03b1\u03bd\u03bf\u03c5\u03b1\u03c1\u03af\u03bf\u03c5_\u03a6\u03b5\u03b2\u03c1\u03bf\u03c5\u03b1\u03c1\u03af\u03bf\u03c5_\u039c\u03b1\u03c1\u03c4\u03af\u03bf\u03c5_\u0391\u03c0\u03c1\u03b9\u03bb\u03af\u03bf\u03c5_\u039c\u03b1\u0390\u03bf\u03c5_\u0399\u03bf\u03c5\u03bd\u03af\u03bf\u03c5_\u0399\u03bf\u03c5\u03bb\u03af\u03bf\u03c5_\u0391\u03c5\u03b3\u03bf\u03cd\u03c3\u03c4\u03bf\u03c5_\u03a3\u03b5\u03c0\u03c4\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5_\u039f\u03ba\u03c4\u03c9\u03b2\u03c1\u03af\u03bf\u03c5_\u039d\u03bf\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5_\u0394\u03b5\u03ba\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5".split("_"),months:function(n,t){return n?"string"==typeof t&&/D/.test(t.substring(0,t.indexOf("MMMM")))?this._monthsGenitiveEl[n.month()]:this._monthsNominativeEl[n.month()]:this._monthsNominativeEl},monthsShort:"\u0399\u03b1\u03bd_\u03a6\u03b5\u03b2_\u039c\u03b1\u03c1_\u0391\u03c0\u03c1_\u039c\u03b1\u03ca_\u0399\u03bf\u03c5\u03bd_\u0399\u03bf\u03c5\u03bb_\u0391\u03c5\u03b3_\u03a3\u03b5\u03c0_\u039f\u03ba\u03c4_\u039d\u03bf\u03b5_\u0394\u03b5\u03ba".split("_"),weekdays:"\u039a\u03c5\u03c1\u03b9\u03b1\u03ba\u03ae_\u0394\u03b5\u03c5\u03c4\u03ad\u03c1\u03b1_\u03a4\u03c1\u03af\u03c4\u03b7_\u03a4\u03b5\u03c4\u03ac\u03c1\u03c4\u03b7_\u03a0\u03ad\u03bc\u03c0\u03c4\u03b7_\u03a0\u03b1\u03c1\u03b1\u03c3\u03ba\u03b5\u03c5\u03ae_\u03a3\u03ac\u03b2\u03b2\u03b1\u03c4\u03bf".split("_"),weekdaysShort:"\u039a\u03c5\u03c1_\u0394\u03b5\u03c5_\u03a4\u03c1\u03b9_\u03a4\u03b5\u03c4_\u03a0\u03b5\u03bc_\u03a0\u03b1\u03c1_\u03a3\u03b1\u03b2".split("_"),weekdaysMin:"\u039a\u03c5_\u0394\u03b5_\u03a4\u03c1_\u03a4\u03b5_\u03a0\u03b5_\u03a0\u03b1_\u03a3\u03b1".split("_"),meridiem:function(n,t,e){return n>11?e?"\u03bc\u03bc":"\u039c\u039c":e?"\u03c0\u03bc":"\u03a0\u039c"},isPM:function(n){return"\u03bc"===(n+"").toLowerCase()[0]},meridiemParse:/[\u03a0\u039c]\.?\u039c?\.?/i,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendarEl:{sameDay:"[\u03a3\u03ae\u03bc\u03b5\u03c1\u03b1 {}] LT",nextDay:"[\u0391\u03cd\u03c1\u03b9\u03bf {}] LT",nextWeek:"dddd [{}] LT",lastDay:"[\u03a7\u03b8\u03b5\u03c2 {}] LT",lastWeek:function(){switch(this.day()){case 6:return"[\u03c4\u03bf \u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03bf] dddd [{}] LT";default:return"[\u03c4\u03b7\u03bd \u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03b7] dddd [{}] LT"}},sameElse:"L"},calendar:function(n,t){var e,l=this._calendarEl[n],r=t&&t.hours();return((e=l)instanceof Function||"[object Function]"===Object.prototype.toString.call(e))&&(l=l.apply(t)),l.replace("{}",r%12==1?"\u03c3\u03c4\u03b7":"\u03c3\u03c4\u03b9\u03c2")},relativeTime:{future:"\u03c3\u03b5 %s",past:"%s \u03c0\u03c1\u03b9\u03bd",s:"\u03bb\u03af\u03b3\u03b1 \u03b4\u03b5\u03c5\u03c4\u03b5\u03c1\u03cc\u03bb\u03b5\u03c0\u03c4\u03b1",ss:"%d \u03b4\u03b5\u03c5\u03c4\u03b5\u03c1\u03cc\u03bb\u03b5\u03c0\u03c4\u03b1",m:"\u03ad\u03bd\u03b1 \u03bb\u03b5\u03c0\u03c4\u03cc",mm:"%d \u03bb\u03b5\u03c0\u03c4\u03ac",h:"\u03bc\u03af\u03b1 \u03ce\u03c1\u03b1",hh:"%d \u03ce\u03c1\u03b5\u03c2",d:"\u03bc\u03af\u03b1 \u03bc\u03ad\u03c1\u03b1",dd:"%d \u03bc\u03ad\u03c1\u03b5\u03c2",M:"\u03ad\u03bd\u03b1\u03c2 \u03bc\u03ae\u03bd\u03b1\u03c2",MM:"%d \u03bc\u03ae\u03bd\u03b5\u03c2",y:"\u03ad\u03bd\u03b1\u03c2 \u03c7\u03c1\u03cc\u03bd\u03bf\u03c2",yy:"%d \u03c7\u03c1\u03cc\u03bd\u03b9\u03b1"},dayOfMonthOrdinalParse:/\d{1,2}\u03b7/,ordinal:"%d\u03b7",week:{dow:1,doy:4}})}(e("PJh5"))},DDro:function(n,t,e){"use strict";t.a=function(){return Object(l.a)(r,[])};var l=e("/4Bh");function r(n,t,e){return n.push(t),n}},DOkx:function(n,t,e){!function(n){"use strict";function t(n,t,e,l){var r={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[n+" Tage",n+" Tagen"],M:["ein Monat","einem Monat"],MM:[n+" Monate",n+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[n+" Jahre",n+" Jahren"]};return t?r[e][0]:r[e][1]}n.defineLocale("de",{months:"Januar_Februar_M\xe4rz_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Feb._M\xe4rz_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:t,mm:"%d Minuten",h:t,hh:"%d Stunden",d:t,dd:t,M:t,MM:t,y:t,yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(e("PJh5"))},DSXN:function(n,t,e){!function(n){"use strict";n.defineLocale("sw",{months:"Januari_Februari_Machi_Aprili_Mei_Juni_Julai_Agosti_Septemba_Oktoba_Novemba_Desemba".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ago_Sep_Okt_Nov_Des".split("_"),weekdays:"Jumapili_Jumatatu_Jumanne_Jumatano_Alhamisi_Ijumaa_Jumamosi".split("_"),weekdaysShort:"Jpl_Jtat_Jnne_Jtan_Alh_Ijm_Jmos".split("_"),weekdaysMin:"J2_J3_J4_J5_Al_Ij_J1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[leo saa] LT",nextDay:"[kesho saa] LT",nextWeek:"[wiki ijayo] dddd [saat] LT",lastDay:"[jana] LT",lastWeek:"[wiki iliyopita] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s baadaye",past:"tokea %s",s:"hivi punde",ss:"sekunde %d",m:"dakika moja",mm:"dakika %d",h:"saa limoja",hh:"masaa %d",d:"siku moja",dd:"masiku %d",M:"mwezi mmoja",MM:"miezi %d",y:"mwaka mmoja",yy:"miaka %d"},week:{dow:1,doy:7}})}(e("PJh5"))},DuR2:function(n,t){var e;e=function(){return this}();try{e=e||Function("return this")()||(0,eval)("this")}catch(n){"object"==typeof window&&(e=window)}n.exports=e},E5SG:function(n,t,e){"use strict";t.a=function(n,t){var e=!1;return arguments.length>=2&&(e=!0),function(l){return l.lift(new i(n,t,e))}};var l=e("TToO"),r=e("OVmG"),i=function(){function n(n,t,e){void 0===e&&(e=!1),this.accumulator=n,this.seed=t,this.hasSeed=e}return n.prototype.call=function(n,t){return t.subscribe(new o(n,this.accumulator,this.seed,this.hasSeed))},n}(),o=function(n){function t(t,e,l,r){n.call(this,t),this.accumulator=e,this._seed=l,this.hasSeed=r,this.index=0}return Object(l.__extends)(t,n),Object.defineProperty(t.prototype,"seed",{get:function(){return this._seed},set:function(n){this.hasSeed=!0,this._seed=n},enumerable:!0,configurable:!0}),t.prototype._next=function(n){if(this.hasSeed)return this._tryNext(n);this.seed=n,this.destination.next(n)},t.prototype._tryNext=function(n){var t,e=this.index++;try{t=this.accumulator(this.seed,n,e)}catch(n){this.destination.error(n)}this.seed=t,this.destination.next(t)},t}(r.a)},EKta:function(n,t,e){"use strict";t.byteLength=function(n){return 3*n.length/4-u(n)},t.toByteArray=function(n){var t,e,l,o,s,a=n.length;o=u(n),s=new i(3*a/4-o),e=o>0?a-4:a;var c=0;for(t=0;t>16&255,s[c++]=l>>8&255,s[c++]=255&l;return 2===o?(l=r[n.charCodeAt(t)]<<2|r[n.charCodeAt(t+1)]>>4,s[c++]=255&l):1===o&&(l=r[n.charCodeAt(t)]<<10|r[n.charCodeAt(t+1)]<<4|r[n.charCodeAt(t+2)]>>2,s[c++]=l>>8&255,s[c++]=255&l),s},t.fromByteArray=function(n){for(var t,e=n.length,r=e%3,i="",o=[],s=0,a=e-r;sa?a:s+16383));return 1===r?(i+=l[(t=n[e-1])>>2],i+=l[t<<4&63],i+="=="):2===r&&(i+=l[(t=(n[e-2]<<8)+n[e-1])>>10],i+=l[t>>4&63],i+=l[t<<2&63],i+="="),o.push(i),o.join("")};for(var l=[],r=[],i="undefined"!=typeof Uint8Array?Uint8Array:Array,o="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",s=0,a=o.length;s0)throw new Error("Invalid string. Length must be a multiple of 4");return"="===n[t-2]?2:"="===n[t-1]?1:0}function c(n,t,e){for(var r,i=[],o=t;o>18&63]+l[r>>12&63]+l[r>>6&63]+l[63&r]);return i.join("")}r["-".charCodeAt(0)]=62,r["_".charCodeAt(0)]=63},ETHv:function(n,t,e){!function(n){"use strict";var t={1:"\u0967",2:"\u0968",3:"\u0969",4:"\u096a",5:"\u096b",6:"\u096c",7:"\u096d",8:"\u096e",9:"\u096f",0:"\u0966"},e={"\u0967":"1","\u0968":"2","\u0969":"3","\u096a":"4","\u096b":"5","\u096c":"6","\u096d":"7","\u096e":"8","\u096f":"9","\u0966":"0"};n.defineLocale("hi",{months:"\u091c\u0928\u0935\u0930\u0940_\u092b\u093c\u0930\u0935\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u0948\u0932_\u092e\u0908_\u091c\u0942\u0928_\u091c\u0941\u0932\u093e\u0908_\u0905\u0917\u0938\u094d\u0924_\u0938\u093f\u0924\u092e\u094d\u092c\u0930_\u0905\u0915\u094d\u091f\u0942\u092c\u0930_\u0928\u0935\u092e\u094d\u092c\u0930_\u0926\u093f\u0938\u092e\u094d\u092c\u0930".split("_"),monthsShort:"\u091c\u0928._\u092b\u093c\u0930._\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u0948._\u092e\u0908_\u091c\u0942\u0928_\u091c\u0941\u0932._\u0905\u0917._\u0938\u093f\u0924._\u0905\u0915\u094d\u091f\u0942._\u0928\u0935._\u0926\u093f\u0938.".split("_"),monthsParseExact:!0,weekdays:"\u0930\u0935\u093f\u0935\u093e\u0930_\u0938\u094b\u092e\u0935\u093e\u0930_\u092e\u0902\u0917\u0932\u0935\u093e\u0930_\u092c\u0941\u0927\u0935\u093e\u0930_\u0917\u0941\u0930\u0942\u0935\u093e\u0930_\u0936\u0941\u0915\u094d\u0930\u0935\u093e\u0930_\u0936\u0928\u093f\u0935\u093e\u0930".split("_"),weekdaysShort:"\u0930\u0935\u093f_\u0938\u094b\u092e_\u092e\u0902\u0917\u0932_\u092c\u0941\u0927_\u0917\u0941\u0930\u0942_\u0936\u0941\u0915\u094d\u0930_\u0936\u0928\u093f".split("_"),weekdaysMin:"\u0930_\u0938\u094b_\u092e\u0902_\u092c\u0941_\u0917\u0941_\u0936\u0941_\u0936".split("_"),longDateFormat:{LT:"A h:mm \u092c\u091c\u0947",LTS:"A h:mm:ss \u092c\u091c\u0947",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u092c\u091c\u0947",LLLL:"dddd, D MMMM YYYY, A h:mm \u092c\u091c\u0947"},calendar:{sameDay:"[\u0906\u091c] LT",nextDay:"[\u0915\u0932] LT",nextWeek:"dddd, LT",lastDay:"[\u0915\u0932] LT",lastWeek:"[\u092a\u093f\u091b\u0932\u0947] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u092e\u0947\u0902",past:"%s \u092a\u0939\u0932\u0947",s:"\u0915\u0941\u091b \u0939\u0940 \u0915\u094d\u0937\u0923",ss:"%d \u0938\u0947\u0915\u0902\u0921",m:"\u090f\u0915 \u092e\u093f\u0928\u091f",mm:"%d \u092e\u093f\u0928\u091f",h:"\u090f\u0915 \u0918\u0902\u091f\u093e",hh:"%d \u0918\u0902\u091f\u0947",d:"\u090f\u0915 \u0926\u093f\u0928",dd:"%d \u0926\u093f\u0928",M:"\u090f\u0915 \u092e\u0939\u0940\u0928\u0947",MM:"%d \u092e\u0939\u0940\u0928\u0947",y:"\u090f\u0915 \u0935\u0930\u094d\u0937",yy:"%d \u0935\u0930\u094d\u0937"},preparse:function(n){return n.replace(/[\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u0966]/g,function(n){return e[n]})},postformat:function(n){return n.replace(/\d/g,function(n){return t[n]})},meridiemParse:/\u0930\u093e\u0924|\u0938\u0941\u092c\u0939|\u0926\u094b\u092a\u0939\u0930|\u0936\u093e\u092e/,meridiemHour:function(n,t){return 12===n&&(n=0),"\u0930\u093e\u0924"===t?n<4?n:n+12:"\u0938\u0941\u092c\u0939"===t?n:"\u0926\u094b\u092a\u0939\u0930"===t?n>=10?n:n+12:"\u0936\u093e\u092e"===t?n+12:void 0},meridiem:function(n,t,e){return n<4?"\u0930\u093e\u0924":n<10?"\u0938\u0941\u092c\u0939":n<17?"\u0926\u094b\u092a\u0939\u0930":n<20?"\u0936\u093e\u092e":"\u0930\u093e\u0924"},week:{dow:0,doy:6}})}(e("PJh5"))},EuP9:function(n,t,e){"use strict";(function(n){var l=e("EKta"),r=e("ujcs"),i=e("sOR5");function o(){return a.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function s(n,t){if(o()=o())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+o().toString(16)+" bytes");return 0|n}function f(n,t){if(a.isBuffer(n))return n.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(n)||n instanceof ArrayBuffer))return n.byteLength;"string"!=typeof n&&(n=""+n);var e=n.length;if(0===e)return 0;for(var l=!1;;)switch(t){case"ascii":case"latin1":case"binary":return e;case"utf8":case"utf-8":case void 0:return N(n).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*e;case"hex":return e>>>1;case"base64":return F(n).length;default:if(l)return N(n).length;t=(""+t).toLowerCase(),l=!0}}function _(n,t,e){var l=n[t];n[t]=n[e],n[e]=l}function m(n,t,e,l,r){if(0===n.length)return-1;if("string"==typeof e?(l=e,e=0):e>2147483647?e=2147483647:e<-2147483648&&(e=-2147483648),e=+e,isNaN(e)&&(e=r?0:n.length-1),e<0&&(e=n.length+e),e>=n.length){if(r)return-1;e=n.length-1}else if(e<0){if(!r)return-1;e=0}if("string"==typeof t&&(t=a.from(t,l)),a.isBuffer(t))return 0===t.length?-1:g(n,t,e,l,r);if("number"==typeof t)return t&=255,a.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?r?Uint8Array.prototype.indexOf.call(n,t,e):Uint8Array.prototype.lastIndexOf.call(n,t,e):g(n,[t],e,l,r);throw new TypeError("val must be string, number or Buffer")}function g(n,t,e,l,r){var i,o=1,s=n.length,a=t.length;if(void 0!==l&&("ucs2"===(l=String(l).toLowerCase())||"ucs-2"===l||"utf16le"===l||"utf-16le"===l)){if(n.length<2||t.length<2)return-1;o=2,s/=2,a/=2,e/=2}function u(n,t){return 1===o?n[t]:n.readUInt16BE(t*o)}if(r){var c=-1;for(i=e;is&&(e=s-a),i=e;i>=0;i--){for(var d=!0,h=0;hr&&(l=r):l=r;var i=t.length;if(i%2!=0)throw new TypeError("Invalid hex string");l>i/2&&(l=i/2);for(var o=0;o>8,r.push(e%256),r.push(l);return r}(t,n.length-e),n,e,l)}function k(n,t,e){return l.fromByteArray(0===t&&e===n.length?n:n.slice(t,e))}function C(n,t,e){e=Math.min(n.length,e);for(var l=[],r=t;r239?4:u>223?3:u>191?2:1;if(r+d<=e)switch(d){case 1:u<128&&(c=u);break;case 2:128==(192&(i=n[r+1]))&&(a=(31&u)<<6|63&i)>127&&(c=a);break;case 3:o=n[r+2],128==(192&(i=n[r+1]))&&128==(192&o)&&(a=(15&u)<<12|(63&i)<<6|63&o)>2047&&(a<55296||a>57343)&&(c=a);break;case 4:o=n[r+2],s=n[r+3],128==(192&(i=n[r+1]))&&128==(192&o)&&128==(192&s)&&(a=(15&u)<<18|(63&i)<<12|(63&o)<<6|63&s)>65535&&a<1114112&&(c=a)}null===c?(c=65533,d=1):c>65535&&(l.push((c-=65536)>>>10&1023|55296),c=56320|1023&c),l.push(c),r+=d}return function(n){var t=n.length;if(t<=S)return String.fromCharCode.apply(String,n);for(var e="",l=0;lthis.length)return"";if((void 0===e||e>this.length)&&(e=this.length),e<=0)return"";if((e>>>=0)<=(t>>>=0))return"";for(n||(n="utf8");;)switch(n){case"hex":return L(this,t,e);case"utf8":case"utf-8":return C(this,t,e);case"ascii":return O(this,t,e);case"latin1":case"binary":return T(this,t,e);case"base64":return k(this,t,e);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return P(this,t,e);default:if(l)throw new TypeError("Unknown encoding: "+n);n=(n+"").toLowerCase(),l=!0}}).apply(this,arguments)},a.prototype.equals=function(n){if(!a.isBuffer(n))throw new TypeError("Argument must be a Buffer");return this===n||0===a.compare(this,n)},a.prototype.inspect=function(){var n="",e=t.INSPECT_MAX_BYTES;return this.length>0&&(n=this.toString("hex",0,e).match(/.{2}/g).join(" "),this.length>e&&(n+=" ... ")),""},a.prototype.compare=function(n,t,e,l,r){if(!a.isBuffer(n))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===e&&(e=n?n.length:0),void 0===l&&(l=0),void 0===r&&(r=this.length),t<0||e>n.length||l<0||r>this.length)throw new RangeError("out of range index");if(l>=r&&t>=e)return 0;if(l>=r)return-1;if(t>=e)return 1;if(t>>>=0,e>>>=0,l>>>=0,r>>>=0,this===n)return 0;for(var i=r-l,o=e-t,s=Math.min(i,o),u=this.slice(l,r),c=n.slice(t,e),d=0;dr)&&(e=r),n.length>0&&(e<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");l||(l="utf8");for(var i=!1;;)switch(l){case"hex":return y(this,n,t,e);case"utf8":case"utf-8":return b(this,n,t,e);case"ascii":return v(this,n,t,e);case"latin1":case"binary":return w(this,n,t,e);case"base64":return x(this,n,t,e);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return M(this,n,t,e);default:if(i)throw new TypeError("Unknown encoding: "+l);l=(""+l).toLowerCase(),i=!0}},a.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var S=4096;function O(n,t,e){var l="";e=Math.min(n.length,e);for(var r=t;rr)&&(e=r);for(var i="",o=t;oe)throw new RangeError("Trying to access beyond buffer length")}function A(n,t,e,l,r,i){if(!a.isBuffer(n))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>r||tn.length)throw new RangeError("Index out of range")}function E(n,t,e,l){t<0&&(t=65535+t+1);for(var r=0,i=Math.min(n.length-e,2);r>>8*(l?r:1-r)}function Y(n,t,e,l){t<0&&(t=4294967295+t+1);for(var r=0,i=Math.min(n.length-e,4);r>>8*(l?r:3-r)&255}function j(n,t,e,l,r,i){if(e+l>n.length)throw new RangeError("Index out of range");if(e<0)throw new RangeError("Index out of range")}function I(n,t,e,l,i){return i||j(n,0,e,4),r.write(n,t,e,l,23,4),e+4}function R(n,t,e,l,i){return i||j(n,0,e,8),r.write(n,t,e,l,52,8),e+8}a.prototype.slice=function(n,t){var e,l=this.length;if(n=~~n,t=void 0===t?l:~~t,n<0?(n+=l)<0&&(n=0):n>l&&(n=l),t<0?(t+=l)<0&&(t=0):t>l&&(t=l),t0&&(r*=256);)l+=this[n+--t]*r;return l},a.prototype.readUInt8=function(n,t){return t||D(n,1,this.length),this[n]},a.prototype.readUInt16LE=function(n,t){return t||D(n,2,this.length),this[n]|this[n+1]<<8},a.prototype.readUInt16BE=function(n,t){return t||D(n,2,this.length),this[n]<<8|this[n+1]},a.prototype.readUInt32LE=function(n,t){return t||D(n,4,this.length),(this[n]|this[n+1]<<8|this[n+2]<<16)+16777216*this[n+3]},a.prototype.readUInt32BE=function(n,t){return t||D(n,4,this.length),16777216*this[n]+(this[n+1]<<16|this[n+2]<<8|this[n+3])},a.prototype.readIntLE=function(n,t,e){n|=0,t|=0,e||D(n,t,this.length);for(var l=this[n],r=1,i=0;++i=(r*=128)&&(l-=Math.pow(2,8*t)),l},a.prototype.readIntBE=function(n,t,e){n|=0,t|=0,e||D(n,t,this.length);for(var l=t,r=1,i=this[n+--l];l>0&&(r*=256);)i+=this[n+--l]*r;return i>=(r*=128)&&(i-=Math.pow(2,8*t)),i},a.prototype.readInt8=function(n,t){return t||D(n,1,this.length),128&this[n]?-1*(255-this[n]+1):this[n]},a.prototype.readInt16LE=function(n,t){t||D(n,2,this.length);var e=this[n]|this[n+1]<<8;return 32768&e?4294901760|e:e},a.prototype.readInt16BE=function(n,t){t||D(n,2,this.length);var e=this[n+1]|this[n]<<8;return 32768&e?4294901760|e:e},a.prototype.readInt32LE=function(n,t){return t||D(n,4,this.length),this[n]|this[n+1]<<8|this[n+2]<<16|this[n+3]<<24},a.prototype.readInt32BE=function(n,t){return t||D(n,4,this.length),this[n]<<24|this[n+1]<<16|this[n+2]<<8|this[n+3]},a.prototype.readFloatLE=function(n,t){return t||D(n,4,this.length),r.read(this,n,!0,23,4)},a.prototype.readFloatBE=function(n,t){return t||D(n,4,this.length),r.read(this,n,!1,23,4)},a.prototype.readDoubleLE=function(n,t){return t||D(n,8,this.length),r.read(this,n,!0,52,8)},a.prototype.readDoubleBE=function(n,t){return t||D(n,8,this.length),r.read(this,n,!1,52,8)},a.prototype.writeUIntLE=function(n,t,e,l){n=+n,t|=0,e|=0,l||A(this,n,t,e,Math.pow(2,8*e)-1,0);var r=1,i=0;for(this[t]=255&n;++i=0&&(i*=256);)this[t+r]=n/i&255;return t+e},a.prototype.writeUInt8=function(n,t,e){return n=+n,t|=0,e||A(this,n,t,1,255,0),a.TYPED_ARRAY_SUPPORT||(n=Math.floor(n)),this[t]=255&n,t+1},a.prototype.writeUInt16LE=function(n,t,e){return n=+n,t|=0,e||A(this,n,t,2,65535,0),a.TYPED_ARRAY_SUPPORT?(this[t]=255&n,this[t+1]=n>>>8):E(this,n,t,!0),t+2},a.prototype.writeUInt16BE=function(n,t,e){return n=+n,t|=0,e||A(this,n,t,2,65535,0),a.TYPED_ARRAY_SUPPORT?(this[t]=n>>>8,this[t+1]=255&n):E(this,n,t,!1),t+2},a.prototype.writeUInt32LE=function(n,t,e){return n=+n,t|=0,e||A(this,n,t,4,4294967295,0),a.TYPED_ARRAY_SUPPORT?(this[t+3]=n>>>24,this[t+2]=n>>>16,this[t+1]=n>>>8,this[t]=255&n):Y(this,n,t,!0),t+4},a.prototype.writeUInt32BE=function(n,t,e){return n=+n,t|=0,e||A(this,n,t,4,4294967295,0),a.TYPED_ARRAY_SUPPORT?(this[t]=n>>>24,this[t+1]=n>>>16,this[t+2]=n>>>8,this[t+3]=255&n):Y(this,n,t,!1),t+4},a.prototype.writeIntLE=function(n,t,e,l){if(n=+n,t|=0,!l){var r=Math.pow(2,8*e-1);A(this,n,t,e,r-1,-r)}var i=0,o=1,s=0;for(this[t]=255&n;++i>0)-s&255;return t+e},a.prototype.writeIntBE=function(n,t,e,l){if(n=+n,t|=0,!l){var r=Math.pow(2,8*e-1);A(this,n,t,e,r-1,-r)}var i=e-1,o=1,s=0;for(this[t+i]=255&n;--i>=0&&(o*=256);)n<0&&0===s&&0!==this[t+i+1]&&(s=1),this[t+i]=(n/o>>0)-s&255;return t+e},a.prototype.writeInt8=function(n,t,e){return n=+n,t|=0,e||A(this,n,t,1,127,-128),a.TYPED_ARRAY_SUPPORT||(n=Math.floor(n)),n<0&&(n=255+n+1),this[t]=255&n,t+1},a.prototype.writeInt16LE=function(n,t,e){return n=+n,t|=0,e||A(this,n,t,2,32767,-32768),a.TYPED_ARRAY_SUPPORT?(this[t]=255&n,this[t+1]=n>>>8):E(this,n,t,!0),t+2},a.prototype.writeInt16BE=function(n,t,e){return n=+n,t|=0,e||A(this,n,t,2,32767,-32768),a.TYPED_ARRAY_SUPPORT?(this[t]=n>>>8,this[t+1]=255&n):E(this,n,t,!1),t+2},a.prototype.writeInt32LE=function(n,t,e){return n=+n,t|=0,e||A(this,n,t,4,2147483647,-2147483648),a.TYPED_ARRAY_SUPPORT?(this[t]=255&n,this[t+1]=n>>>8,this[t+2]=n>>>16,this[t+3]=n>>>24):Y(this,n,t,!0),t+4},a.prototype.writeInt32BE=function(n,t,e){return n=+n,t|=0,e||A(this,n,t,4,2147483647,-2147483648),n<0&&(n=4294967295+n+1),a.TYPED_ARRAY_SUPPORT?(this[t]=n>>>24,this[t+1]=n>>>16,this[t+2]=n>>>8,this[t+3]=255&n):Y(this,n,t,!1),t+4},a.prototype.writeFloatLE=function(n,t,e){return I(this,n,t,!0,e)},a.prototype.writeFloatBE=function(n,t,e){return I(this,n,t,!1,e)},a.prototype.writeDoubleLE=function(n,t,e){return R(this,n,t,!0,e)},a.prototype.writeDoubleBE=function(n,t,e){return R(this,n,t,!1,e)},a.prototype.copy=function(n,t,e,l){if(e||(e=0),l||0===l||(l=this.length),t>=n.length&&(t=n.length),t||(t=0),l>0&&l=this.length)throw new RangeError("sourceStart out of bounds");if(l<0)throw new RangeError("sourceEnd out of bounds");l>this.length&&(l=this.length),n.length-t=0;--r)n[r+t]=this[r+e];else if(i<1e3||!a.TYPED_ARRAY_SUPPORT)for(r=0;r>>=0,e=void 0===e?this.length:e>>>0,n||(n=0),"number"==typeof n)for(i=t;i55295&&e<57344){if(!r){if(e>56319){(t-=3)>-1&&i.push(239,191,189);continue}if(o+1===l){(t-=3)>-1&&i.push(239,191,189);continue}r=e;continue}if(e<56320){(t-=3)>-1&&i.push(239,191,189),r=e;continue}e=65536+(r-55296<<10|e-56320)}else r&&(t-=3)>-1&&i.push(239,191,189);if(r=null,e<128){if((t-=1)<0)break;i.push(e)}else if(e<2048){if((t-=2)<0)break;i.push(e>>6|192,63&e|128)}else if(e<65536){if((t-=3)<0)break;i.push(e>>12|224,e>>6&63|128,63&e|128)}else{if(!(e<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;i.push(e>>18|240,e>>12&63|128,e>>6&63|128,63&e|128)}}return i}function F(n){return l.toByteArray(function(n){if((n=function(n){return n.trim?n.trim():n.replace(/^\s+|\s+$/g,"")}(n).replace(H,"")).length<2)return"";for(;n.length%4!=0;)n+="=";return n}(n))}function B(n,t,e,l){for(var r=0;r=t.length||r>=n.length);++r)t[r+e]=n[r];return r}}).call(t,e("DuR2"))},"F+2e":function(n,t,e){!function(n){"use strict";var t={1:"\u1041",2:"\u1042",3:"\u1043",4:"\u1044",5:"\u1045",6:"\u1046",7:"\u1047",8:"\u1048",9:"\u1049",0:"\u1040"},e={"\u1041":"1","\u1042":"2","\u1043":"3","\u1044":"4","\u1045":"5","\u1046":"6","\u1047":"7","\u1048":"8","\u1049":"9","\u1040":"0"};n.defineLocale("my",{months:"\u1007\u1014\u103a\u1014\u101d\u102b\u101b\u102e_\u1016\u1031\u1016\u1031\u102c\u103a\u101d\u102b\u101b\u102e_\u1019\u1010\u103a_\u1027\u1015\u103c\u102e_\u1019\u1031_\u1007\u103d\u1014\u103a_\u1007\u1030\u101c\u102d\u102f\u1004\u103a_\u101e\u103c\u1002\u102f\u1010\u103a_\u1005\u1000\u103a\u1010\u1004\u103a\u1018\u102c_\u1021\u1031\u102c\u1000\u103a\u1010\u102d\u102f\u1018\u102c_\u1014\u102d\u102f\u101d\u1004\u103a\u1018\u102c_\u1012\u102e\u1007\u1004\u103a\u1018\u102c".split("_"),monthsShort:"\u1007\u1014\u103a_\u1016\u1031_\u1019\u1010\u103a_\u1015\u103c\u102e_\u1019\u1031_\u1007\u103d\u1014\u103a_\u101c\u102d\u102f\u1004\u103a_\u101e\u103c_\u1005\u1000\u103a_\u1021\u1031\u102c\u1000\u103a_\u1014\u102d\u102f_\u1012\u102e".split("_"),weekdays:"\u1010\u1014\u1004\u103a\u1039\u1002\u1014\u103d\u1031_\u1010\u1014\u1004\u103a\u1039\u101c\u102c_\u1021\u1004\u103a\u1039\u1002\u102b_\u1017\u102f\u1012\u1039\u1013\u101f\u1030\u1038_\u1000\u103c\u102c\u101e\u1015\u1010\u1031\u1038_\u101e\u1031\u102c\u1000\u103c\u102c_\u1005\u1014\u1031".split("_"),weekdaysShort:"\u1014\u103d\u1031_\u101c\u102c_\u1002\u102b_\u101f\u1030\u1038_\u1000\u103c\u102c_\u101e\u1031\u102c_\u1014\u1031".split("_"),weekdaysMin:"\u1014\u103d\u1031_\u101c\u102c_\u1002\u102b_\u101f\u1030\u1038_\u1000\u103c\u102c_\u101e\u1031\u102c_\u1014\u1031".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u101a\u1014\u1031.] LT [\u1019\u103e\u102c]",nextDay:"[\u1019\u1014\u1000\u103a\u1016\u103c\u1014\u103a] LT [\u1019\u103e\u102c]",nextWeek:"dddd LT [\u1019\u103e\u102c]",lastDay:"[\u1019\u1014\u1031.\u1000] LT [\u1019\u103e\u102c]",lastWeek:"[\u1015\u103c\u102e\u1038\u1001\u1032\u1037\u101e\u1031\u102c] dddd LT [\u1019\u103e\u102c]",sameElse:"L"},relativeTime:{future:"\u101c\u102c\u1019\u100a\u103a\u1037 %s \u1019\u103e\u102c",past:"\u101c\u103d\u1014\u103a\u1001\u1032\u1037\u101e\u1031\u102c %s \u1000",s:"\u1005\u1000\u1039\u1000\u1014\u103a.\u1021\u1014\u100a\u103a\u1038\u1004\u101a\u103a",ss:"%d \u1005\u1000\u1039\u1000\u1014\u1037\u103a",m:"\u1010\u1005\u103a\u1019\u102d\u1014\u1005\u103a",mm:"%d \u1019\u102d\u1014\u1005\u103a",h:"\u1010\u1005\u103a\u1014\u102c\u101b\u102e",hh:"%d \u1014\u102c\u101b\u102e",d:"\u1010\u1005\u103a\u101b\u1000\u103a",dd:"%d \u101b\u1000\u103a",M:"\u1010\u1005\u103a\u101c",MM:"%d \u101c",y:"\u1010\u1005\u103a\u1014\u103e\u1005\u103a",yy:"%d \u1014\u103e\u1005\u103a"},preparse:function(n){return n.replace(/[\u1041\u1042\u1043\u1044\u1045\u1046\u1047\u1048\u1049\u1040]/g,function(n){return e[n]})},postformat:function(n){return n.replace(/\d/g,function(n){return t[n]})},week:{dow:1,doy:4}})}(e("PJh5"))},FKXc:function(n,t,e){!function(n){"use strict";n.defineLocale("it",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"domenica_luned\xec_marted\xec_mercoled\xec_gioved\xec_venerd\xec_sabato".split("_"),weekdaysShort:"dom_lun_mar_mer_gio_ven_sab".split("_"),weekdaysMin:"do_lu_ma_me_gi_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Oggi alle] LT",nextDay:"[Domani alle] LT",nextWeek:"dddd [alle] LT",lastDay:"[Ieri alle] LT",lastWeek:function(){switch(this.day()){case 0:return"[la scorsa] dddd [alle] LT";default:return"[lo scorso] dddd [alle] LT"}},sameElse:"L"},relativeTime:{future:function(n){return(/^[0-9].+$/.test(n)?"tra":"in")+" "+n},past:"%s fa",s:"alcuni secondi",ss:"%d secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(e("PJh5"))},FRPF:function(n,t,e){!function(n){"use strict";n.defineLocale("tzm",{months:"\u2d49\u2d4f\u2d4f\u2d30\u2d62\u2d54_\u2d31\u2d55\u2d30\u2d62\u2d55_\u2d4e\u2d30\u2d55\u2d5a_\u2d49\u2d31\u2d54\u2d49\u2d54_\u2d4e\u2d30\u2d62\u2d62\u2d53_\u2d62\u2d53\u2d4f\u2d62\u2d53_\u2d62\u2d53\u2d4d\u2d62\u2d53\u2d63_\u2d56\u2d53\u2d5b\u2d5c_\u2d5b\u2d53\u2d5c\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d3d\u2d5f\u2d53\u2d31\u2d55_\u2d4f\u2d53\u2d61\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d37\u2d53\u2d4a\u2d4f\u2d31\u2d49\u2d54".split("_"),monthsShort:"\u2d49\u2d4f\u2d4f\u2d30\u2d62\u2d54_\u2d31\u2d55\u2d30\u2d62\u2d55_\u2d4e\u2d30\u2d55\u2d5a_\u2d49\u2d31\u2d54\u2d49\u2d54_\u2d4e\u2d30\u2d62\u2d62\u2d53_\u2d62\u2d53\u2d4f\u2d62\u2d53_\u2d62\u2d53\u2d4d\u2d62\u2d53\u2d63_\u2d56\u2d53\u2d5b\u2d5c_\u2d5b\u2d53\u2d5c\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d3d\u2d5f\u2d53\u2d31\u2d55_\u2d4f\u2d53\u2d61\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d37\u2d53\u2d4a\u2d4f\u2d31\u2d49\u2d54".split("_"),weekdays:"\u2d30\u2d59\u2d30\u2d4e\u2d30\u2d59_\u2d30\u2d62\u2d4f\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4f\u2d30\u2d59_\u2d30\u2d3d\u2d54\u2d30\u2d59_\u2d30\u2d3d\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4e\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d39\u2d62\u2d30\u2d59".split("_"),weekdaysShort:"\u2d30\u2d59\u2d30\u2d4e\u2d30\u2d59_\u2d30\u2d62\u2d4f\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4f\u2d30\u2d59_\u2d30\u2d3d\u2d54\u2d30\u2d59_\u2d30\u2d3d\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4e\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d39\u2d62\u2d30\u2d59".split("_"),weekdaysMin:"\u2d30\u2d59\u2d30\u2d4e\u2d30\u2d59_\u2d30\u2d62\u2d4f\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4f\u2d30\u2d59_\u2d30\u2d3d\u2d54\u2d30\u2d59_\u2d30\u2d3d\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4e\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d39\u2d62\u2d30\u2d59".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u2d30\u2d59\u2d37\u2d45 \u2d34] LT",nextDay:"[\u2d30\u2d59\u2d3d\u2d30 \u2d34] LT",nextWeek:"dddd [\u2d34] LT",lastDay:"[\u2d30\u2d5a\u2d30\u2d4f\u2d5c \u2d34] LT",lastWeek:"dddd [\u2d34] LT",sameElse:"L"},relativeTime:{future:"\u2d37\u2d30\u2d37\u2d45 \u2d59 \u2d62\u2d30\u2d4f %s",past:"\u2d62\u2d30\u2d4f %s",s:"\u2d49\u2d4e\u2d49\u2d3d",ss:"%d \u2d49\u2d4e\u2d49\u2d3d",m:"\u2d4e\u2d49\u2d4f\u2d53\u2d3a",mm:"%d \u2d4e\u2d49\u2d4f\u2d53\u2d3a",h:"\u2d59\u2d30\u2d44\u2d30",hh:"%d \u2d5c\u2d30\u2d59\u2d59\u2d30\u2d44\u2d49\u2d4f",d:"\u2d30\u2d59\u2d59",dd:"%d o\u2d59\u2d59\u2d30\u2d4f",M:"\u2d30\u2d62o\u2d53\u2d54",MM:"%d \u2d49\u2d62\u2d62\u2d49\u2d54\u2d4f",y:"\u2d30\u2d59\u2d33\u2d30\u2d59",yy:"%d \u2d49\u2d59\u2d33\u2d30\u2d59\u2d4f"},week:{dow:6,doy:12}})}(e("PJh5"))},FlzV:function(n,t,e){!function(n){"use strict";n.defineLocale("nb",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.".split("_"),monthsParseExact:!0,weekdays:"s\xf8ndag_mandag_tirsdag_onsdag_torsdag_fredag_l\xf8rdag".split("_"),weekdaysShort:"s\xf8._ma._ti._on._to._fr._l\xf8.".split("_"),weekdaysMin:"s\xf8_ma_ti_on_to_fr_l\xf8".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] HH:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[i g\xe5r kl.] LT",lastWeek:"[forrige] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"noen sekunder",ss:"%d sekunder",m:"ett minutt",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dager",M:"en m\xe5ned",MM:"%d m\xe5neder",y:"ett \xe5r",yy:"%d \xe5r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(e("PJh5"))},Fpqq:function(n,t,e){!function(n){"use strict";n.defineLocale("sv",{months:"januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"s\xf6ndag_m\xe5ndag_tisdag_onsdag_torsdag_fredag_l\xf6rdag".split("_"),weekdaysShort:"s\xf6n_m\xe5n_tis_ons_tor_fre_l\xf6r".split("_"),weekdaysMin:"s\xf6_m\xe5_ti_on_to_fr_l\xf6".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [kl.] HH:mm",LLLL:"dddd D MMMM YYYY [kl.] HH:mm",lll:"D MMM YYYY HH:mm",llll:"ddd D MMM YYYY HH:mm"},calendar:{sameDay:"[Idag] LT",nextDay:"[Imorgon] LT",lastDay:"[Ig\xe5r] LT",nextWeek:"[P\xe5] dddd LT",lastWeek:"[I] dddd[s] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"f\xf6r %s sedan",s:"n\xe5gra sekunder",ss:"%d sekunder",m:"en minut",mm:"%d minuter",h:"en timme",hh:"%d timmar",d:"en dag",dd:"%d dagar",M:"en m\xe5nad",MM:"%d m\xe5nader",y:"ett \xe5r",yy:"%d \xe5r"},dayOfMonthOrdinalParse:/\d{1,2}(e|a)/,ordinal:function(n){var t=n%10;return n+(1==~~(n%100/10)?"e":1===t?"a":2===t?"a":"e")},week:{dow:1,doy:4}})}(e("PJh5"))},Frex:function(n,t,e){!function(n){"use strict";function t(n,t,e,l){var r={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[n+" Tage",n+" Tagen"],M:["ein Monat","einem Monat"],MM:[n+" Monate",n+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[n+" Jahre",n+" Jahren"]};return t?r[e][0]:r[e][1]}n.defineLocale("de-ch",{months:"Januar_Februar_M\xe4rz_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Feb._M\xe4rz_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:t,mm:"%d Minuten",h:t,hh:"%d Stunden",d:t,dd:t,M:t,MM:t,y:t,yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(e("PJh5"))},FuaP:function(n,t,e){!function(n){"use strict";n.defineLocale("gl",{months:"xaneiro_febreiro_marzo_abril_maio_xu\xf1o_xullo_agosto_setembro_outubro_novembro_decembro".split("_"),monthsShort:"xan._feb._mar._abr._mai._xu\xf1._xul._ago._set._out._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"domingo_luns_martes_m\xe9rcores_xoves_venres_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._m\xe9r._xov._ven._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_m\xe9_xo_ve_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoxe "+(1!==this.hours()?"\xe1s":"\xe1")+"] LT"},nextDay:function(){return"[ma\xf1\xe1 "+(1!==this.hours()?"\xe1s":"\xe1")+"] LT"},nextWeek:function(){return"dddd ["+(1!==this.hours()?"\xe1s":"a")+"] LT"},lastDay:function(){return"[onte "+(1!==this.hours()?"\xe1":"a")+"] LT"},lastWeek:function(){return"[o] dddd [pasado "+(1!==this.hours()?"\xe1s":"a")+"] LT"},sameElse:"L"},relativeTime:{future:function(n){return 0===n.indexOf("un")?"n"+n:"en "+n},past:"hai %s",s:"uns segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"unha hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",M:"un mes",MM:"%d meses",y:"un ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(e("PJh5"))},"G++c":function(n,t,e){!function(n){"use strict";n.defineLocale("ms-my",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(n,t){return 12===n&&(n=0),"pagi"===t?n:"tengahari"===t?n>=11?n:n+12:"petang"===t||"malam"===t?n+12:void 0},meridiem:function(n,t,e){return n<11?"pagi":n<15?"tengahari":n<19?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",ss:"%d saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}(e("PJh5"))},GK6M:function(n,t,e){"use strict";t.a=function(n){return l=n,i};var l,r=e("fKB6");function i(){try{return l.apply(this,arguments)}catch(n){return r.a.e=n,r.a}}},GrS7:function(n,t,e){!function(n){"use strict";n.defineLocale("hy-am",{months:{format:"\u0570\u0578\u0582\u0576\u057e\u0561\u0580\u056b_\u0583\u0565\u057f\u0580\u057e\u0561\u0580\u056b_\u0574\u0561\u0580\u057f\u056b_\u0561\u057a\u0580\u056b\u056c\u056b_\u0574\u0561\u0575\u056b\u057d\u056b_\u0570\u0578\u0582\u0576\u056b\u057d\u056b_\u0570\u0578\u0582\u056c\u056b\u057d\u056b_\u0585\u0563\u0578\u057d\u057f\u0578\u057d\u056b_\u057d\u0565\u057a\u057f\u0565\u0574\u0562\u0565\u0580\u056b_\u0570\u0578\u056f\u057f\u0565\u0574\u0562\u0565\u0580\u056b_\u0576\u0578\u0575\u0565\u0574\u0562\u0565\u0580\u056b_\u0564\u0565\u056f\u057f\u0565\u0574\u0562\u0565\u0580\u056b".split("_"),standalone:"\u0570\u0578\u0582\u0576\u057e\u0561\u0580_\u0583\u0565\u057f\u0580\u057e\u0561\u0580_\u0574\u0561\u0580\u057f_\u0561\u057a\u0580\u056b\u056c_\u0574\u0561\u0575\u056b\u057d_\u0570\u0578\u0582\u0576\u056b\u057d_\u0570\u0578\u0582\u056c\u056b\u057d_\u0585\u0563\u0578\u057d\u057f\u0578\u057d_\u057d\u0565\u057a\u057f\u0565\u0574\u0562\u0565\u0580_\u0570\u0578\u056f\u057f\u0565\u0574\u0562\u0565\u0580_\u0576\u0578\u0575\u0565\u0574\u0562\u0565\u0580_\u0564\u0565\u056f\u057f\u0565\u0574\u0562\u0565\u0580".split("_")},monthsShort:"\u0570\u0576\u057e_\u0583\u057f\u0580_\u0574\u0580\u057f_\u0561\u057a\u0580_\u0574\u0575\u057d_\u0570\u0576\u057d_\u0570\u056c\u057d_\u0585\u0563\u057d_\u057d\u057a\u057f_\u0570\u056f\u057f_\u0576\u0574\u0562_\u0564\u056f\u057f".split("_"),weekdays:"\u056f\u056b\u0580\u0561\u056f\u056b_\u0565\u0580\u056f\u0578\u0582\u0577\u0561\u0562\u0569\u056b_\u0565\u0580\u0565\u0584\u0577\u0561\u0562\u0569\u056b_\u0579\u0578\u0580\u0565\u0584\u0577\u0561\u0562\u0569\u056b_\u0570\u056b\u0576\u0563\u0577\u0561\u0562\u0569\u056b_\u0578\u0582\u0580\u0562\u0561\u0569_\u0577\u0561\u0562\u0561\u0569".split("_"),weekdaysShort:"\u056f\u0580\u056f_\u0565\u0580\u056f_\u0565\u0580\u0584_\u0579\u0580\u0584_\u0570\u0576\u0563_\u0578\u0582\u0580\u0562_\u0577\u0562\u0569".split("_"),weekdaysMin:"\u056f\u0580\u056f_\u0565\u0580\u056f_\u0565\u0580\u0584_\u0579\u0580\u0584_\u0570\u0576\u0563_\u0578\u0582\u0580\u0562_\u0577\u0562\u0569".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0569.",LLL:"D MMMM YYYY \u0569., HH:mm",LLLL:"dddd, D MMMM YYYY \u0569., HH:mm"},calendar:{sameDay:"[\u0561\u0575\u057d\u0585\u0580] LT",nextDay:"[\u057e\u0561\u0572\u0568] LT",lastDay:"[\u0565\u0580\u0565\u056f] LT",nextWeek:function(){return"dddd [\u0585\u0580\u0568 \u056a\u0561\u0574\u0568] LT"},lastWeek:function(){return"[\u0561\u0576\u0581\u0561\u056e] dddd [\u0585\u0580\u0568 \u056a\u0561\u0574\u0568] LT"},sameElse:"L"},relativeTime:{future:"%s \u0570\u0565\u057f\u0578",past:"%s \u0561\u057c\u0561\u057b",s:"\u0574\u056b \u0584\u0561\u0576\u056b \u057e\u0561\u0575\u0580\u056f\u0575\u0561\u0576",ss:"%d \u057e\u0561\u0575\u0580\u056f\u0575\u0561\u0576",m:"\u0580\u0578\u057a\u0565",mm:"%d \u0580\u0578\u057a\u0565",h:"\u056a\u0561\u0574",hh:"%d \u056a\u0561\u0574",d:"\u0585\u0580",dd:"%d \u0585\u0580",M:"\u0561\u0574\u056b\u057d",MM:"%d \u0561\u0574\u056b\u057d",y:"\u057f\u0561\u0580\u056b",yy:"%d \u057f\u0561\u0580\u056b"},meridiemParse:/\u0563\u056b\u0577\u0565\u0580\u057e\u0561|\u0561\u057c\u0561\u057e\u0578\u057f\u057e\u0561|\u0581\u0565\u0580\u0565\u056f\u057e\u0561|\u0565\u0580\u0565\u056f\u0578\u0575\u0561\u0576/,isPM:function(n){return/^(\u0581\u0565\u0580\u0565\u056f\u057e\u0561|\u0565\u0580\u0565\u056f\u0578\u0575\u0561\u0576)$/.test(n)},meridiem:function(n){return n<4?"\u0563\u056b\u0577\u0565\u0580\u057e\u0561":n<12?"\u0561\u057c\u0561\u057e\u0578\u057f\u057e\u0561":n<17?"\u0581\u0565\u0580\u0565\u056f\u057e\u0561":"\u0565\u0580\u0565\u056f\u0578\u0575\u0561\u0576"},dayOfMonthOrdinalParse:/\d{1,2}|\d{1,2}-(\u056b\u0576|\u0580\u0564)/,ordinal:function(n,t){switch(t){case"DDD":case"w":case"W":case"DDDo":return 1===n?n+"-\u056b\u0576":n+"-\u0580\u0564";default:return n}},week:{dow:1,doy:7}})}(e("PJh5"))},HdCx:function(n,t,e){"use strict";t.a=function(n,t){return function(e){if("function"!=typeof n)throw new TypeError("argument is not a function. Are you looking for `mapTo()`?");return e.lift(new i(n,t))}};var l=e("TToO"),r=e("OVmG"),i=function(){function n(n,t){this.project=n,this.thisArg=t}return n.prototype.call=function(n,t){return t.subscribe(new o(n,this.project,this.thisArg))},n}(),o=function(n){function t(t,e,l){n.call(this,t),this.project=e,this.count=0,this.thisArg=l||this}return Object(l.__extends)(t,n),t.prototype._next=function(n){var t;try{t=this.project.call(this.thisArg,n,this.count++)}catch(n){return void this.destination.error(n)}this.destination.next(t)},t}(r.a)},INcR:function(n,t,e){!function(n){"use strict";var t="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),e="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_");n.defineLocale("es-us",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(n,l){return n?/-MMM-/.test(l)?e[n.month()]:t[n.month()]:t},monthsParseExact:!0,weekdays:"domingo_lunes_martes_mi\xe9rcoles_jueves_viernes_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._mi\xe9._jue._vie._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"MM/DD/YYYY",LL:"MMMM [de] D [de] YYYY",LLL:"MMMM [de] D [de] YYYY h:mm A",LLLL:"dddd, MMMM [de] D [de] YYYY h:mm A"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[ma\xf1ana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",M:"un mes",MM:"%d meses",y:"un a\xf1o",yy:"%d a\xf1os"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:0,doy:6}})}(e("PJh5"))},Jnfr:function(n,t){function e(n){return Promise.resolve().then(function(){throw new Error("Cannot find module '"+n+"'.")})}e.keys=function(){return[]},e.resolve=e,n.exports=e,e.id="Jnfr"},JwiF:function(n,t,e){!function(n){"use strict";n.defineLocale("jv",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_Nopember_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nop_Des".split("_"),weekdays:"Minggu_Senen_Seloso_Rebu_Kemis_Jemuwah_Septu".split("_"),weekdaysShort:"Min_Sen_Sel_Reb_Kem_Jem_Sep".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sp".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/enjing|siyang|sonten|ndalu/,meridiemHour:function(n,t){return 12===n&&(n=0),"enjing"===t?n:"siyang"===t?n>=11?n:n+12:"sonten"===t||"ndalu"===t?n+12:void 0},meridiem:function(n,t,e){return n<11?"enjing":n<15?"siyang":n<19?"sonten":"ndalu"},calendar:{sameDay:"[Dinten puniko pukul] LT",nextDay:"[Mbenjang pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kala wingi pukul] LT",lastWeek:"dddd [kepengker pukul] LT",sameElse:"L"},relativeTime:{future:"wonten ing %s",past:"%s ingkang kepengker",s:"sawetawis detik",ss:"%d detik",m:"setunggal menit",mm:"%d menit",h:"setunggal jam",hh:"%d jam",d:"sedinten",dd:"%d dinten",M:"sewulan",MM:"%d wulan",y:"setaun",yy:"%d taun"},week:{dow:1,doy:7}})}(e("PJh5"))},Jwyl:function(n,t,e){"use strict";var l=e("TToO"),r=e("g5jc"),i=e("YaPU"),o=(e("OVmG"),e("VwZZ")),s=e("0P3J"),a=function(n){function t(t,e){n.call(this),this.source=t,this.subjectFactory=e,this._refCount=0,this._isComplete=!1}return Object(l.__extends)(t,n),t.prototype._subscribe=function(n){return this.getSubject().subscribe(n)},t.prototype.getSubject=function(){var n=this._subject;return n&&!n.isStopped||(this._subject=this.subjectFactory()),this._subject},t.prototype.connect=function(){var n=this._connection;return n||(this._isComplete=!1,(n=this._connection=new o.a).add(this.source.subscribe(new c(this.getSubject(),this))),n.closed?(this._connection=null,n=o.a.EMPTY):this._connection=n),n},t.prototype.refCount=function(){return Object(s.a)()(this)},t}(i.a).prototype,u={operator:{value:null},_refCount:{value:0,writable:!0},_subject:{value:null,writable:!0},_connection:{value:null,writable:!0},_subscribe:{value:a._subscribe},_isComplete:{value:a._isComplete,writable:!0},getSubject:{value:a.getSubject},connect:{value:a.connect},refCount:{value:a.refCount}},c=function(n){function t(t,e){n.call(this,t),this.connectable=e}return Object(l.__extends)(t,n),t.prototype._error=function(t){this._unsubscribe(),n.prototype._error.call(this,t)},t.prototype._complete=function(){this.connectable._isComplete=!0,this._unsubscribe(),n.prototype._complete.call(this)},t.prototype._unsubscribe=function(){var n=this.connectable;if(n){this.connectable=null;var t=n._connection;n._refCount=0,n._subject=null,n._connection=null,t&&t.unsubscribe()}},t}(r.b);t.a=function(n,t){return function(e){var l;if(l="function"==typeof n?n:function(){return n},"function"==typeof t)return e.lift(new d(l,t));var r=Object.create(e,u);return r.source=e,r.subjectFactory=l,r}};var d=function(){function n(n,t){this.subjectFactory=n,this.selector=t}return n.prototype.call=function(n,t){var e=this.selector,l=this.subjectFactory(),r=e(l).subscribe(n);return r.add(t.subscribe(l)),r},n}()},LT9G:function(n,t,e){!function(n){"use strict";var t="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),e="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),l=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],r=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;n.defineLocale("es",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(n,l){return n?/-MMM-/.test(l)?e[n.month()]:t[n.month()]:t},monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:l,longMonthsParse:l,shortMonthsParse:l,weekdays:"domingo_lunes_martes_mi\xe9rcoles_jueves_viernes_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._mi\xe9._jue._vie._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[ma\xf1ana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",M:"un mes",MM:"%d meses",y:"un a\xf1o",yy:"%d a\xf1os"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(e("PJh5"))},Lgqo:function(n,t,e){!function(n){"use strict";n.defineLocale("si",{months:"\u0da2\u0db1\u0dc0\u0dcf\u0dbb\u0dd2_\u0db4\u0dd9\u0db6\u0dbb\u0dc0\u0dcf\u0dbb\u0dd2_\u0db8\u0dcf\u0dbb\u0dca\u0dad\u0dd4_\u0d85\u0db4\u0dca\u200d\u0dbb\u0dda\u0dbd\u0dca_\u0db8\u0dd0\u0dba\u0dd2_\u0da2\u0dd6\u0db1\u0dd2_\u0da2\u0dd6\u0dbd\u0dd2_\u0d85\u0d9c\u0ddd\u0dc3\u0dca\u0dad\u0dd4_\u0dc3\u0dd0\u0db4\u0dca\u0dad\u0dd0\u0db8\u0dca\u0db6\u0dbb\u0dca_\u0d94\u0d9a\u0dca\u0dad\u0ddd\u0db6\u0dbb\u0dca_\u0db1\u0ddc\u0dc0\u0dd0\u0db8\u0dca\u0db6\u0dbb\u0dca_\u0daf\u0dd9\u0dc3\u0dd0\u0db8\u0dca\u0db6\u0dbb\u0dca".split("_"),monthsShort:"\u0da2\u0db1_\u0db4\u0dd9\u0db6_\u0db8\u0dcf\u0dbb\u0dca_\u0d85\u0db4\u0dca_\u0db8\u0dd0\u0dba\u0dd2_\u0da2\u0dd6\u0db1\u0dd2_\u0da2\u0dd6\u0dbd\u0dd2_\u0d85\u0d9c\u0ddd_\u0dc3\u0dd0\u0db4\u0dca_\u0d94\u0d9a\u0dca_\u0db1\u0ddc\u0dc0\u0dd0_\u0daf\u0dd9\u0dc3\u0dd0".split("_"),weekdays:"\u0d89\u0dbb\u0dd2\u0daf\u0dcf_\u0dc3\u0db3\u0dd4\u0daf\u0dcf_\u0d85\u0d9f\u0dc4\u0dbb\u0dd4\u0dc0\u0dcf\u0daf\u0dcf_\u0db6\u0daf\u0dcf\u0daf\u0dcf_\u0db6\u0dca\u200d\u0dbb\u0dc4\u0dc3\u0dca\u0db4\u0dad\u0dd2\u0db1\u0dca\u0daf\u0dcf_\u0dc3\u0dd2\u0d9a\u0dd4\u0dbb\u0dcf\u0daf\u0dcf_\u0dc3\u0dd9\u0db1\u0dc3\u0dd4\u0dbb\u0dcf\u0daf\u0dcf".split("_"),weekdaysShort:"\u0d89\u0dbb\u0dd2_\u0dc3\u0db3\u0dd4_\u0d85\u0d9f_\u0db6\u0daf\u0dcf_\u0db6\u0dca\u200d\u0dbb\u0dc4_\u0dc3\u0dd2\u0d9a\u0dd4_\u0dc3\u0dd9\u0db1".split("_"),weekdaysMin:"\u0d89_\u0dc3_\u0d85_\u0db6_\u0db6\u0dca\u200d\u0dbb_\u0dc3\u0dd2_\u0dc3\u0dd9".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"a h:mm",LTS:"a h:mm:ss",L:"YYYY/MM/DD",LL:"YYYY MMMM D",LLL:"YYYY MMMM D, a h:mm",LLLL:"YYYY MMMM D [\u0dc0\u0dd0\u0db1\u0dd2] dddd, a h:mm:ss"},calendar:{sameDay:"[\u0d85\u0daf] LT[\u0da7]",nextDay:"[\u0dc4\u0dd9\u0da7] LT[\u0da7]",nextWeek:"dddd LT[\u0da7]",lastDay:"[\u0d8a\u0dba\u0dda] LT[\u0da7]",lastWeek:"[\u0db4\u0dc3\u0dd4\u0d9c\u0dd2\u0dba] dddd LT[\u0da7]",sameElse:"L"},relativeTime:{future:"%s\u0d9a\u0dd2\u0db1\u0dca",past:"%s\u0d9a\u0da7 \u0db4\u0dd9\u0dbb",s:"\u0dad\u0dad\u0dca\u0db4\u0dbb \u0d9a\u0dd2\u0dc4\u0dd2\u0db4\u0dba",ss:"\u0dad\u0dad\u0dca\u0db4\u0dbb %d",m:"\u0db8\u0dd2\u0db1\u0dd2\u0dad\u0dca\u0dad\u0dd4\u0dc0",mm:"\u0db8\u0dd2\u0db1\u0dd2\u0dad\u0dca\u0dad\u0dd4 %d",h:"\u0db4\u0dd0\u0dba",hh:"\u0db4\u0dd0\u0dba %d",d:"\u0daf\u0dd2\u0db1\u0dba",dd:"\u0daf\u0dd2\u0db1 %d",M:"\u0db8\u0dcf\u0dc3\u0dba",MM:"\u0db8\u0dcf\u0dc3 %d",y:"\u0dc0\u0dc3\u0dbb",yy:"\u0dc0\u0dc3\u0dbb %d"},dayOfMonthOrdinalParse:/\d{1,2} \u0dc0\u0dd0\u0db1\u0dd2/,ordinal:function(n){return n+" \u0dc0\u0dd0\u0db1\u0dd2"},meridiemParse:/\u0db4\u0dd9\u0dbb \u0dc0\u0dbb\u0dd4|\u0db4\u0dc3\u0dca \u0dc0\u0dbb\u0dd4|\u0db4\u0dd9.\u0dc0|\u0db4.\u0dc0./,isPM:function(n){return"\u0db4.\u0dc0."===n||"\u0db4\u0dc3\u0dca \u0dc0\u0dbb\u0dd4"===n},meridiem:function(n,t,e){return n>11?e?"\u0db4.\u0dc0.":"\u0db4\u0dc3\u0dca \u0dc0\u0dbb\u0dd4":e?"\u0db4\u0dd9.\u0dc0.":"\u0db4\u0dd9\u0dbb \u0dc0\u0dbb\u0dd4"}})}(e("PJh5"))},N3vo:function(n,t,e){!function(n){"use strict";n.defineLocale("cv",{months:"\u043a\u04d1\u0440\u043b\u0430\u0447_\u043d\u0430\u0440\u04d1\u0441_\u043f\u0443\u0448_\u0430\u043a\u0430_\u043c\u0430\u0439_\u04ab\u04d7\u0440\u0442\u043c\u0435_\u0443\u0442\u04d1_\u04ab\u0443\u0440\u043b\u0430_\u0430\u0432\u04d1\u043d_\u044e\u043f\u0430_\u0447\u04f3\u043a_\u0440\u0430\u0448\u0442\u0430\u0432".split("_"),monthsShort:"\u043a\u04d1\u0440_\u043d\u0430\u0440_\u043f\u0443\u0448_\u0430\u043a\u0430_\u043c\u0430\u0439_\u04ab\u04d7\u0440_\u0443\u0442\u04d1_\u04ab\u0443\u0440_\u0430\u0432\u043d_\u044e\u043f\u0430_\u0447\u04f3\u043a_\u0440\u0430\u0448".split("_"),weekdays:"\u0432\u044b\u0440\u0441\u0430\u0440\u043d\u0438\u043a\u0443\u043d_\u0442\u0443\u043d\u0442\u0438\u043a\u0443\u043d_\u044b\u0442\u043b\u0430\u0440\u0438\u043a\u0443\u043d_\u044e\u043d\u043a\u0443\u043d_\u043a\u04d7\u04ab\u043d\u0435\u0440\u043d\u0438\u043a\u0443\u043d_\u044d\u0440\u043d\u0435\u043a\u0443\u043d_\u0448\u04d1\u043c\u0430\u0442\u043a\u0443\u043d".split("_"),weekdaysShort:"\u0432\u044b\u0440_\u0442\u0443\u043d_\u044b\u0442\u043b_\u044e\u043d_\u043a\u04d7\u04ab_\u044d\u0440\u043d_\u0448\u04d1\u043c".split("_"),weekdaysMin:"\u0432\u0440_\u0442\u043d_\u044b\u0442_\u044e\u043d_\u043a\u04ab_\u044d\u0440_\u0448\u043c".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"YYYY [\u04ab\u0443\u043b\u0445\u0438] MMMM [\u0443\u0439\u04d1\u0445\u04d7\u043d] D[-\u043c\u04d7\u0448\u04d7]",LLL:"YYYY [\u04ab\u0443\u043b\u0445\u0438] MMMM [\u0443\u0439\u04d1\u0445\u04d7\u043d] D[-\u043c\u04d7\u0448\u04d7], HH:mm",LLLL:"dddd, YYYY [\u04ab\u0443\u043b\u0445\u0438] MMMM [\u0443\u0439\u04d1\u0445\u04d7\u043d] D[-\u043c\u04d7\u0448\u04d7], HH:mm"},calendar:{sameDay:"[\u041f\u0430\u044f\u043d] LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",nextDay:"[\u042b\u0440\u0430\u043d] LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",lastDay:"[\u04d6\u043d\u0435\u0440] LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",nextWeek:"[\u04aa\u0438\u0442\u0435\u0441] dddd LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",lastWeek:"[\u0418\u0440\u0442\u043d\u04d7] dddd LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",sameElse:"L"},relativeTime:{future:function(n){return n+(/\u0441\u0435\u0445\u0435\u0442$/i.exec(n)?"\u0440\u0435\u043d":/\u04ab\u0443\u043b$/i.exec(n)?"\u0442\u0430\u043d":"\u0440\u0430\u043d")},past:"%s \u043a\u0430\u044f\u043b\u043b\u0430",s:"\u043f\u04d7\u0440-\u0438\u043a \u04ab\u0435\u043a\u043a\u0443\u043d\u0442",ss:"%d \u04ab\u0435\u043a\u043a\u0443\u043d\u0442",m:"\u043f\u04d7\u0440 \u043c\u0438\u043d\u0443\u0442",mm:"%d \u043c\u0438\u043d\u0443\u0442",h:"\u043f\u04d7\u0440 \u0441\u0435\u0445\u0435\u0442",hh:"%d \u0441\u0435\u0445\u0435\u0442",d:"\u043f\u04d7\u0440 \u043a\u0443\u043d",dd:"%d \u043a\u0443\u043d",M:"\u043f\u04d7\u0440 \u0443\u0439\u04d1\u0445",MM:"%d \u0443\u0439\u04d1\u0445",y:"\u043f\u04d7\u0440 \u04ab\u0443\u043b",yy:"%d \u04ab\u0443\u043b"},dayOfMonthOrdinalParse:/\d{1,2}-\u043c\u04d7\u0448/,ordinal:"%d-\u043c\u04d7\u0448",week:{dow:1,doy:7}})}(e("PJh5"))},N4j0:function(n,t,e){"use strict";e.d(t,"a",function(){return l});var l=function(n){return n&&"number"==typeof n.length}},Nd3h:function(n,t,e){!function(n){"use strict";n.defineLocale("eo",{months:"januaro_februaro_marto_aprilo_majo_junio_julio_a\u016dgusto_septembro_oktobro_novembro_decembro".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_a\u016dg_sep_okt_nov_dec".split("_"),weekdays:"diman\u0109o_lundo_mardo_merkredo_\u0135a\u016ddo_vendredo_sabato".split("_"),weekdaysShort:"dim_lun_mard_merk_\u0135a\u016d_ven_sab".split("_"),weekdaysMin:"di_lu_ma_me_\u0135a_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D[-a de] MMMM, YYYY",LLL:"D[-a de] MMMM, YYYY HH:mm",LLLL:"dddd, [la] D[-a de] MMMM, YYYY HH:mm"},meridiemParse:/[ap]\.t\.m/i,isPM:function(n){return"p"===n.charAt(0).toLowerCase()},meridiem:function(n,t,e){return n>11?e?"p.t.m.":"P.T.M.":e?"a.t.m.":"A.T.M."},calendar:{sameDay:"[Hodia\u016d je] LT",nextDay:"[Morga\u016d je] LT",nextWeek:"dddd [je] LT",lastDay:"[Hiera\u016d je] LT",lastWeek:"[pasinta] dddd [je] LT",sameElse:"L"},relativeTime:{future:"post %s",past:"anta\u016d %s",s:"sekundoj",ss:"%d sekundoj",m:"minuto",mm:"%d minutoj",h:"horo",hh:"%d horoj",d:"tago",dd:"%d tagoj",M:"monato",MM:"%d monatoj",y:"jaro",yy:"%d jaroj"},dayOfMonthOrdinalParse:/\d{1,2}a/,ordinal:"%da",week:{dow:1,doy:7}})}(e("PJh5"))},Nlnz:function(n,t,e){!function(n){"use strict";n.defineLocale("te",{months:"\u0c1c\u0c28\u0c35\u0c30\u0c3f_\u0c2b\u0c3f\u0c2c\u0c4d\u0c30\u0c35\u0c30\u0c3f_\u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c3f_\u0c0f\u0c2a\u0c4d\u0c30\u0c3f\u0c32\u0c4d_\u0c2e\u0c47_\u0c1c\u0c42\u0c28\u0c4d_\u0c1c\u0c42\u0c32\u0c46\u0c56_\u0c06\u0c17\u0c38\u0c4d\u0c1f\u0c41_\u0c38\u0c46\u0c2a\u0c4d\u0c1f\u0c46\u0c02\u0c2c\u0c30\u0c4d_\u0c05\u0c15\u0c4d\u0c1f\u0c4b\u0c2c\u0c30\u0c4d_\u0c28\u0c35\u0c02\u0c2c\u0c30\u0c4d_\u0c21\u0c3f\u0c38\u0c46\u0c02\u0c2c\u0c30\u0c4d".split("_"),monthsShort:"\u0c1c\u0c28._\u0c2b\u0c3f\u0c2c\u0c4d\u0c30._\u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c3f_\u0c0f\u0c2a\u0c4d\u0c30\u0c3f._\u0c2e\u0c47_\u0c1c\u0c42\u0c28\u0c4d_\u0c1c\u0c42\u0c32\u0c46\u0c56_\u0c06\u0c17._\u0c38\u0c46\u0c2a\u0c4d._\u0c05\u0c15\u0c4d\u0c1f\u0c4b._\u0c28\u0c35._\u0c21\u0c3f\u0c38\u0c46.".split("_"),monthsParseExact:!0,weekdays:"\u0c06\u0c26\u0c3f\u0c35\u0c3e\u0c30\u0c02_\u0c38\u0c4b\u0c2e\u0c35\u0c3e\u0c30\u0c02_\u0c2e\u0c02\u0c17\u0c33\u0c35\u0c3e\u0c30\u0c02_\u0c2c\u0c41\u0c27\u0c35\u0c3e\u0c30\u0c02_\u0c17\u0c41\u0c30\u0c41\u0c35\u0c3e\u0c30\u0c02_\u0c36\u0c41\u0c15\u0c4d\u0c30\u0c35\u0c3e\u0c30\u0c02_\u0c36\u0c28\u0c3f\u0c35\u0c3e\u0c30\u0c02".split("_"),weekdaysShort:"\u0c06\u0c26\u0c3f_\u0c38\u0c4b\u0c2e_\u0c2e\u0c02\u0c17\u0c33_\u0c2c\u0c41\u0c27_\u0c17\u0c41\u0c30\u0c41_\u0c36\u0c41\u0c15\u0c4d\u0c30_\u0c36\u0c28\u0c3f".split("_"),weekdaysMin:"\u0c06_\u0c38\u0c4b_\u0c2e\u0c02_\u0c2c\u0c41_\u0c17\u0c41_\u0c36\u0c41_\u0c36".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[\u0c28\u0c47\u0c21\u0c41] LT",nextDay:"[\u0c30\u0c47\u0c2a\u0c41] LT",nextWeek:"dddd, LT",lastDay:"[\u0c28\u0c3f\u0c28\u0c4d\u0c28] LT",lastWeek:"[\u0c17\u0c24] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0c32\u0c4b",past:"%s \u0c15\u0c4d\u0c30\u0c3f\u0c24\u0c02",s:"\u0c15\u0c4a\u0c28\u0c4d\u0c28\u0c3f \u0c15\u0c4d\u0c37\u0c23\u0c3e\u0c32\u0c41",ss:"%d \u0c38\u0c46\u0c15\u0c28\u0c4d\u0c32\u0c41",m:"\u0c12\u0c15 \u0c28\u0c3f\u0c2e\u0c3f\u0c37\u0c02",mm:"%d \u0c28\u0c3f\u0c2e\u0c3f\u0c37\u0c3e\u0c32\u0c41",h:"\u0c12\u0c15 \u0c17\u0c02\u0c1f",hh:"%d \u0c17\u0c02\u0c1f\u0c32\u0c41",d:"\u0c12\u0c15 \u0c30\u0c4b\u0c1c\u0c41",dd:"%d \u0c30\u0c4b\u0c1c\u0c41\u0c32\u0c41",M:"\u0c12\u0c15 \u0c28\u0c46\u0c32",MM:"%d \u0c28\u0c46\u0c32\u0c32\u0c41",y:"\u0c12\u0c15 \u0c38\u0c02\u0c35\u0c24\u0c4d\u0c38\u0c30\u0c02",yy:"%d \u0c38\u0c02\u0c35\u0c24\u0c4d\u0c38\u0c30\u0c3e\u0c32\u0c41"},dayOfMonthOrdinalParse:/\d{1,2}\u0c35/,ordinal:"%d\u0c35",meridiemParse:/\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f|\u0c09\u0c26\u0c2f\u0c02|\u0c2e\u0c27\u0c4d\u0c2f\u0c3e\u0c39\u0c4d\u0c28\u0c02|\u0c38\u0c3e\u0c2f\u0c02\u0c24\u0c4d\u0c30\u0c02/,meridiemHour:function(n,t){return 12===n&&(n=0),"\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f"===t?n<4?n:n+12:"\u0c09\u0c26\u0c2f\u0c02"===t?n:"\u0c2e\u0c27\u0c4d\u0c2f\u0c3e\u0c39\u0c4d\u0c28\u0c02"===t?n>=10?n:n+12:"\u0c38\u0c3e\u0c2f\u0c02\u0c24\u0c4d\u0c30\u0c02"===t?n+12:void 0},meridiem:function(n,t,e){return n<4?"\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f":n<10?"\u0c09\u0c26\u0c2f\u0c02":n<17?"\u0c2e\u0c27\u0c4d\u0c2f\u0c3e\u0c39\u0c4d\u0c28\u0c02":n<20?"\u0c38\u0c3e\u0c2f\u0c02\u0c24\u0c4d\u0c30\u0c02":"\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f"},week:{dow:0,doy:6}})}(e("PJh5"))},Nzt2:function(n,t,e){!function(n){"use strict";n.defineLocale("he",{months:"\u05d9\u05e0\u05d5\u05d0\u05e8_\u05e4\u05d1\u05e8\u05d5\u05d0\u05e8_\u05de\u05e8\u05e5_\u05d0\u05e4\u05e8\u05d9\u05dc_\u05de\u05d0\u05d9_\u05d9\u05d5\u05e0\u05d9_\u05d9\u05d5\u05dc\u05d9_\u05d0\u05d5\u05d2\u05d5\u05e1\u05d8_\u05e1\u05e4\u05d8\u05de\u05d1\u05e8_\u05d0\u05d5\u05e7\u05d8\u05d5\u05d1\u05e8_\u05e0\u05d5\u05d1\u05de\u05d1\u05e8_\u05d3\u05e6\u05de\u05d1\u05e8".split("_"),monthsShort:"\u05d9\u05e0\u05d5\u05f3_\u05e4\u05d1\u05e8\u05f3_\u05de\u05e8\u05e5_\u05d0\u05e4\u05e8\u05f3_\u05de\u05d0\u05d9_\u05d9\u05d5\u05e0\u05d9_\u05d9\u05d5\u05dc\u05d9_\u05d0\u05d5\u05d2\u05f3_\u05e1\u05e4\u05d8\u05f3_\u05d0\u05d5\u05e7\u05f3_\u05e0\u05d5\u05d1\u05f3_\u05d3\u05e6\u05de\u05f3".split("_"),weekdays:"\u05e8\u05d0\u05e9\u05d5\u05df_\u05e9\u05e0\u05d9_\u05e9\u05dc\u05d9\u05e9\u05d9_\u05e8\u05d1\u05d9\u05e2\u05d9_\u05d7\u05de\u05d9\u05e9\u05d9_\u05e9\u05d9\u05e9\u05d9_\u05e9\u05d1\u05ea".split("_"),weekdaysShort:"\u05d0\u05f3_\u05d1\u05f3_\u05d2\u05f3_\u05d3\u05f3_\u05d4\u05f3_\u05d5\u05f3_\u05e9\u05f3".split("_"),weekdaysMin:"\u05d0_\u05d1_\u05d2_\u05d3_\u05d4_\u05d5_\u05e9".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [\u05d1]MMMM YYYY",LLL:"D [\u05d1]MMMM YYYY HH:mm",LLLL:"dddd, D [\u05d1]MMMM YYYY HH:mm",l:"D/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[\u05d4\u05d9\u05d5\u05dd \u05d1\u05be]LT",nextDay:"[\u05de\u05d7\u05e8 \u05d1\u05be]LT",nextWeek:"dddd [\u05d1\u05e9\u05e2\u05d4] LT",lastDay:"[\u05d0\u05ea\u05de\u05d5\u05dc \u05d1\u05be]LT",lastWeek:"[\u05d1\u05d9\u05d5\u05dd] dddd [\u05d4\u05d0\u05d7\u05e8\u05d5\u05df \u05d1\u05e9\u05e2\u05d4] LT",sameElse:"L"},relativeTime:{future:"\u05d1\u05e2\u05d5\u05d3 %s",past:"\u05dc\u05e4\u05e0\u05d9 %s",s:"\u05de\u05e1\u05e4\u05e8 \u05e9\u05e0\u05d9\u05d5\u05ea",ss:"%d \u05e9\u05e0\u05d9\u05d5\u05ea",m:"\u05d3\u05e7\u05d4",mm:"%d \u05d3\u05e7\u05d5\u05ea",h:"\u05e9\u05e2\u05d4",hh:function(n){return 2===n?"\u05e9\u05e2\u05ea\u05d9\u05d9\u05dd":n+" \u05e9\u05e2\u05d5\u05ea"},d:"\u05d9\u05d5\u05dd",dd:function(n){return 2===n?"\u05d9\u05d5\u05de\u05d9\u05d9\u05dd":n+" \u05d9\u05de\u05d9\u05dd"},M:"\u05d7\u05d5\u05d3\u05e9",MM:function(n){return 2===n?"\u05d7\u05d5\u05d3\u05e9\u05d9\u05d9\u05dd":n+" \u05d7\u05d5\u05d3\u05e9\u05d9\u05dd"},y:"\u05e9\u05e0\u05d4",yy:function(n){return 2===n?"\u05e9\u05e0\u05ea\u05d9\u05d9\u05dd":n%10==0&&10!==n?n+" \u05e9\u05e0\u05d4":n+" \u05e9\u05e0\u05d9\u05dd"}},meridiemParse:/\u05d0\u05d7\u05d4"\u05e6|\u05dc\u05e4\u05e0\u05d4"\u05e6|\u05d0\u05d7\u05e8\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd|\u05dc\u05e4\u05e0\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd|\u05dc\u05e4\u05e0\u05d5\u05ea \u05d1\u05d5\u05e7\u05e8|\u05d1\u05d1\u05d5\u05e7\u05e8|\u05d1\u05e2\u05e8\u05d1/i,isPM:function(n){return/^(\u05d0\u05d7\u05d4"\u05e6|\u05d0\u05d7\u05e8\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd|\u05d1\u05e2\u05e8\u05d1)$/.test(n)},meridiem:function(n,t,e){return n<5?"\u05dc\u05e4\u05e0\u05d5\u05ea \u05d1\u05d5\u05e7\u05e8":n<10?"\u05d1\u05d1\u05d5\u05e7\u05e8":n<12?e?'\u05dc\u05e4\u05e0\u05d4"\u05e6':"\u05dc\u05e4\u05e0\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd":n<18?e?'\u05d0\u05d7\u05d4"\u05e6':"\u05d0\u05d7\u05e8\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd":"\u05d1\u05e2\u05e8\u05d1"}})}(e("PJh5"))},ORgI:function(n,t,e){!function(n){"use strict";n.defineLocale("ja",{months:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u65e5\u66dc\u65e5_\u6708\u66dc\u65e5_\u706b\u66dc\u65e5_\u6c34\u66dc\u65e5_\u6728\u66dc\u65e5_\u91d1\u66dc\u65e5_\u571f\u66dc\u65e5".split("_"),weekdaysShort:"\u65e5_\u6708_\u706b_\u6c34_\u6728_\u91d1_\u571f".split("_"),weekdaysMin:"\u65e5_\u6708_\u706b_\u6c34_\u6728_\u91d1_\u571f".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm",LLLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm dddd",l:"YYYY/MM/DD",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5 HH:mm dddd"},meridiemParse:/\u5348\u524d|\u5348\u5f8c/i,isPM:function(n){return"\u5348\u5f8c"===n},meridiem:function(n,t,e){return n<12?"\u5348\u524d":"\u5348\u5f8c"},calendar:{sameDay:"[\u4eca\u65e5] LT",nextDay:"[\u660e\u65e5] LT",nextWeek:"[\u6765\u9031]dddd LT",lastDay:"[\u6628\u65e5] LT",lastWeek:"[\u524d\u9031]dddd LT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}\u65e5/,ordinal:function(n,t){switch(t){case"d":case"D":case"DDD":return n+"\u65e5";default:return n}},relativeTime:{future:"%s\u5f8c",past:"%s\u524d",s:"\u6570\u79d2",ss:"%d\u79d2",m:"1\u5206",mm:"%d\u5206",h:"1\u6642\u9593",hh:"%d\u6642\u9593",d:"1\u65e5",dd:"%d\u65e5",M:"1\u30f6\u6708",MM:"%d\u30f6\u6708",y:"1\u5e74",yy:"%d\u5e74"}})}(e("PJh5"))},OSsP:function(n,t,e){!function(n){"use strict";function t(n,t,e){return n+" "+function(n,t){return 2===t?function(n){var t={m:"v",b:"v",d:"z"};return void 0===t[n.charAt(0)]?n:t[n.charAt(0)]+n.substring(1)}(n):n}({mm:"munutenn",MM:"miz",dd:"devezh"}[e],n)}n.defineLocale("br",{months:"Genver_C'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu".split("_"),monthsShort:"Gen_C'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker".split("_"),weekdays:"Sul_Lun_Meurzh_Merc'her_Yaou_Gwener_Sadorn".split("_"),weekdaysShort:"Sul_Lun_Meu_Mer_Yao_Gwe_Sad".split("_"),weekdaysMin:"Su_Lu_Me_Mer_Ya_Gw_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h[e]mm A",LTS:"h[e]mm:ss A",L:"DD/MM/YYYY",LL:"D [a viz] MMMM YYYY",LLL:"D [a viz] MMMM YYYY h[e]mm A",LLLL:"dddd, D [a viz] MMMM YYYY h[e]mm A"},calendar:{sameDay:"[Hiziv da] LT",nextDay:"[Warc'hoazh da] LT",nextWeek:"dddd [da] LT",lastDay:"[Dec'h da] LT",lastWeek:"dddd [paset da] LT",sameElse:"L"},relativeTime:{future:"a-benn %s",past:"%s 'zo",s:"un nebeud segondenno\xf9",ss:"%d eilenn",m:"ur vunutenn",mm:t,h:"un eur",hh:"%d eur",d:"un devezh",dd:t,M:"ur miz",MM:t,y:"ur bloaz",yy:function(n){switch(function n(t){return t>9?n(t%10):t}(n)){case 1:case 3:case 4:case 5:case 9:return n+" bloaz";default:return n+" vloaz"}}},dayOfMonthOrdinalParse:/\d{1,2}(a\xf1|vet)/,ordinal:function(n){return n+(1===n?"a\xf1":"vet")},week:{dow:1,doy:4}})}(e("PJh5"))},OUMt:function(n,t,e){!function(n){"use strict";var t="janu\xe1r_febru\xe1r_marec_apr\xedl_m\xe1j_j\xfan_j\xfal_august_september_okt\xf3ber_november_december".split("_"),e="jan_feb_mar_apr_m\xe1j_j\xfan_j\xfal_aug_sep_okt_nov_dec".split("_");function l(n){return n>1&&n<5}function r(n,t,e,r){var i=n+" ";switch(e){case"s":return t||r?"p\xe1r sek\xfand":"p\xe1r sekundami";case"ss":return t||r?i+(l(n)?"sekundy":"sek\xfand"):i+"sekundami";case"m":return t?"min\xfata":r?"min\xfatu":"min\xfatou";case"mm":return t||r?i+(l(n)?"min\xfaty":"min\xfat"):i+"min\xfatami";case"h":return t?"hodina":r?"hodinu":"hodinou";case"hh":return t||r?i+(l(n)?"hodiny":"hod\xedn"):i+"hodinami";case"d":return t||r?"de\u0148":"d\u0148om";case"dd":return t||r?i+(l(n)?"dni":"dn\xed"):i+"d\u0148ami";case"M":return t||r?"mesiac":"mesiacom";case"MM":return t||r?i+(l(n)?"mesiace":"mesiacov"):i+"mesiacmi";case"y":return t||r?"rok":"rokom";case"yy":return t||r?i+(l(n)?"roky":"rokov"):i+"rokmi"}}n.defineLocale("sk",{months:t,monthsShort:e,weekdays:"nede\u013ea_pondelok_utorok_streda_\u0161tvrtok_piatok_sobota".split("_"),weekdaysShort:"ne_po_ut_st_\u0161t_pi_so".split("_"),weekdaysMin:"ne_po_ut_st_\u0161t_pi_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm"},calendar:{sameDay:"[dnes o] LT",nextDay:"[zajtra o] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nede\u013eu o] LT";case 1:case 2:return"[v] dddd [o] LT";case 3:return"[v stredu o] LT";case 4:return"[vo \u0161tvrtok o] LT";case 5:return"[v piatok o] LT";case 6:return"[v sobotu o] LT"}},lastDay:"[v\u010dera o] LT",lastWeek:function(){switch(this.day()){case 0:return"[minul\xfa nede\u013eu o] LT";case 1:case 2:return"[minul\xfd] dddd [o] LT";case 3:return"[minul\xfa stredu o] LT";case 4:case 5:return"[minul\xfd] dddd [o] LT";case 6:return"[minul\xfa sobotu o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pred %s",s:r,ss:r,m:r,mm:r,h:r,hh:r,d:r,dd:r,M:r,MM:r,y:r,yy:r},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(e("PJh5"))},OVPi:function(n,t,e){!function(n){"use strict";n.defineLocale("fo",{months:"januar_februar_mars_apr\xedl_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sunnudagur_m\xe1nadagur_t\xfdsdagur_mikudagur_h\xf3sdagur_fr\xedggjadagur_leygardagur".split("_"),weekdaysShort:"sun_m\xe1n_t\xfds_mik_h\xf3s_fr\xed_ley".split("_"),weekdaysMin:"su_m\xe1_t\xfd_mi_h\xf3_fr_le".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D. MMMM, YYYY HH:mm"},calendar:{sameDay:"[\xcd dag kl.] LT",nextDay:"[\xcd morgin kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[\xcd gj\xe1r kl.] LT",lastWeek:"[s\xed\xf0stu] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"um %s",past:"%s s\xed\xf0ani",s:"f\xe1 sekund",ss:"%d sekundir",m:"ein minutt",mm:"%d minuttir",h:"ein t\xedmi",hh:"%d t\xedmar",d:"ein dagur",dd:"%d dagar",M:"ein m\xe1na\xf0i",MM:"%d m\xe1na\xf0ir",y:"eitt \xe1r",yy:"%d \xe1r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(e("PJh5"))},OVmG:function(n,t,e){"use strict";e.d(t,"a",function(){return a});var l=e("TToO"),r=e("/iUD"),i=e("VwZZ"),o=e("t7NR"),s=e("tLDX"),a=function(n){function t(e,l,r){switch(n.call(this),this.syncErrorValue=null,this.syncErrorThrown=!1,this.syncErrorThrowable=!1,this.isStopped=!1,arguments.length){case 0:this.destination=o.a;break;case 1:if(!e){this.destination=o.a;break}if("object"==typeof e){e instanceof t?(this.syncErrorThrowable=e.syncErrorThrowable,this.destination=e,this.destination.add(this)):(this.syncErrorThrowable=!0,this.destination=new u(this,e));break}default:this.syncErrorThrowable=!0,this.destination=new u(this,e,l,r)}}return Object(l.__extends)(t,n),t.prototype[s.a]=function(){return this},t.create=function(n,e,l){var r=new t(n,e,l);return r.syncErrorThrowable=!1,r},t.prototype.next=function(n){this.isStopped||this._next(n)},t.prototype.error=function(n){this.isStopped||(this.isStopped=!0,this._error(n))},t.prototype.complete=function(){this.isStopped||(this.isStopped=!0,this._complete())},t.prototype.unsubscribe=function(){this.closed||(this.isStopped=!0,n.prototype.unsubscribe.call(this))},t.prototype._next=function(n){this.destination.next(n)},t.prototype._error=function(n){this.destination.error(n),this.unsubscribe()},t.prototype._complete=function(){this.destination.complete(),this.unsubscribe()},t.prototype._unsubscribeAndRecycle=function(){var n=this._parent,t=this._parents;return this._parent=null,this._parents=null,this.unsubscribe(),this.closed=!1,this.isStopped=!1,this._parent=n,this._parents=t,this},t}(i.a),u=function(n){function t(t,e,l,i){var s;n.call(this),this._parentSubscriber=t;var a=this;Object(r.a)(e)?s=e:e&&(s=e.next,l=e.error,i=e.complete,e!==o.a&&(a=Object.create(e),Object(r.a)(a.unsubscribe)&&this.add(a.unsubscribe.bind(a)),a.unsubscribe=this.unsubscribe.bind(this))),this._context=a,this._next=s,this._error=l,this._complete=i}return Object(l.__extends)(t,n),t.prototype.next=function(n){if(!this.isStopped&&this._next){var t=this._parentSubscriber;t.syncErrorThrowable?this.__tryOrSetError(t,this._next,n)&&this.unsubscribe():this.__tryOrUnsub(this._next,n)}},t.prototype.error=function(n){if(!this.isStopped){var t=this._parentSubscriber;if(this._error)t.syncErrorThrowable?(this.__tryOrSetError(t,this._error,n),this.unsubscribe()):(this.__tryOrUnsub(this._error,n),this.unsubscribe());else{if(!t.syncErrorThrowable)throw this.unsubscribe(),n;t.syncErrorValue=n,t.syncErrorThrown=!0,this.unsubscribe()}}},t.prototype.complete=function(){var n=this;if(!this.isStopped){var t=this._parentSubscriber;if(this._complete){var e=function(){return n._complete.call(n._context)};t.syncErrorThrowable?(this.__tryOrSetError(t,e),this.unsubscribe()):(this.__tryOrUnsub(e),this.unsubscribe())}else this.unsubscribe()}},t.prototype.__tryOrUnsub=function(n,t){try{n.call(this._context,t)}catch(n){throw this.unsubscribe(),n}},t.prototype.__tryOrSetError=function(n,t,e){try{t.call(this._context,e)}catch(t){return n.syncErrorValue=t,n.syncErrorThrown=!0,!0}return!1},t.prototype._unsubscribe=function(){var n=this._parentSubscriber;this._context=null,this._parentSubscriber=null,n.unsubscribe()},t}(a)},PIsA:function(n,t,e){"use strict";var l=e("AMGY"),r=e("N4j0"),i=e("cQXm"),o=e("dgOU"),s=e("YaPU"),a=e("etqZ"),u=e("TToO"),c=function(n){function t(t,e,l){n.call(this),this.parent=t,this.outerValue=e,this.outerIndex=l,this.index=0}return Object(u.__extends)(t,n),t.prototype._next=function(n){this.parent.notifyNext(this.outerValue,n,this.outerIndex,this.index++,this)},t.prototype._error=function(n){this.parent.notifyError(n,this),this.unsubscribe()},t.prototype._complete=function(){this.parent.notifyComplete(this),this.unsubscribe()},t}(e("OVmG").a),d=e("+CnV");t.a=function(n,t,e,u){var h=new c(n,e,u);if(h.closed)return null;if(t instanceof s.a)return t._isScalar?(h.next(t.value),h.complete(),null):(h.syncErrorThrowable=!0,t.subscribe(h));if(Object(r.a)(t)){for(var p=0,f=t.length;p>>0,l=0;l0)for(e=0;e=0?e?"+":"":"-")+Math.pow(10,Math.max(0,t-l.length)).toString().substr(1)+l}var F=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,B=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,V={},W={};function z(n,t,e,l){var r=l;"string"==typeof l&&(r=function(){return this[l]()}),n&&(W[n]=r),t&&(W[t[0]]=function(){return N(r.apply(this,arguments),t[1],t[2])}),e&&(W[e]=function(){return this.localeData().ordinal(r.apply(this,arguments),n)})}function U(n,t){return n.isValid()?(t=G(t,n.localeData()),V[t]=V[t]||function(n){var t,e,l,r=n.match(F);for(t=0,e=r.length;t=0&&B.test(n);)n=n.replace(B,l),B.lastIndex=0,e-=1;return n}var q=/\d/,J=/\d\d/,Q=/\d{3}/,K=/\d{4}/,X=/[+-]?\d{6}/,Z=/\d\d?/,$=/\d\d\d\d?/,nn=/\d\d\d\d\d\d?/,tn=/\d{1,3}/,en=/\d{1,4}/,ln=/[+-]?\d{1,6}/,rn=/\d+/,on=/[+-]?\d+/,sn=/Z|[+-]\d\d:?\d\d/gi,an=/Z|[+-]\d\d(?::?\d\d)?/gi,un=/[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i,cn={};function dn(n,t,e){cn[n]=P(t)?t:function(n,l){return n&&e?e:t}}function hn(n,t){return d(cn,n)?cn[n](t._strict,t._locale):new RegExp(pn(n.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(n,t,e,l,r){return t||e||l||r})))}function pn(n){return n.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}var fn={};function _n(n,t){var e,l=t;for("string"==typeof n&&(n=[n]),a(t)&&(l=function(n,e){e[t]=M(n)}),e=0;e68?1900:2e3)};var Ln,Pn=Dn("FullYear",!0);function Dn(n,t){return function(e){return null!=e?(En(this,n,e),r.updateOffset(this,t),this):An(this,n)}}function An(n,t){return n.isValid()?n._d["get"+(n._isUTC?"UTC":"")+t]():NaN}function En(n,t,e){n.isValid()&&!isNaN(e)&&("FullYear"===t&&Tn(n.year())&&1===n.month()&&29===n.date()?n._d["set"+(n._isUTC?"UTC":"")+t](e,n.month(),Yn(e,n.month())):n._d["set"+(n._isUTC?"UTC":"")+t](e))}function Yn(n,t){if(isNaN(n)||isNaN(t))return NaN;var e=(t%12+12)%12;return n+=(t-e)/12,1===e?Tn(n)?29:28:31-e%7%2}Ln=Array.prototype.indexOf?Array.prototype.indexOf:function(n){var t;for(t=0;t=0&&isFinite(t.getUTCFullYear())&&t.setUTCFullYear(n),t}function zn(n,t,e){var l=7+t-e;return-(7+Wn(n,0,l).getUTCDay()-t)%7+l-1}function Un(n,t,e,l,r){var i,o,s=1+7*(t-1)+(7+e-l)%7+zn(n,l,r);return s<=0?o=On(i=n-1)+s:s>On(n)?(i=n+1,o=s-On(n)):(i=n,o=s),{year:i,dayOfYear:o}}function Gn(n,t,e){var l,r,i=zn(n.year(),t,e),o=Math.floor((n.dayOfYear()-i-1)/7)+1;return o<1?l=o+qn(r=n.year()-1,t,e):o>qn(n.year(),t,e)?(l=o-qn(n.year(),t,e),r=n.year()+1):(r=n.year(),l=o),{week:l,year:r}}function qn(n,t,e){var l=zn(n,t,e),r=zn(n+1,t,e);return(On(n)-l+r)/7}z("w",["ww",2],"wo","week"),z("W",["WW",2],"Wo","isoWeek"),Y("week","w"),Y("isoWeek","W"),H("week",5),H("isoWeek",5),dn("w",Z),dn("ww",Z,J),dn("W",Z),dn("WW",Z,J),mn(["w","ww","W","WW"],function(n,t,e,l){t[l.substr(0,1)]=M(n)}),z("d",0,"do","day"),z("dd",0,0,function(n){return this.localeData().weekdaysMin(this,n)}),z("ddd",0,0,function(n){return this.localeData().weekdaysShort(this,n)}),z("dddd",0,0,function(n){return this.localeData().weekdays(this,n)}),z("e",0,0,"weekday"),z("E",0,0,"isoWeekday"),Y("day","d"),Y("weekday","e"),Y("isoWeekday","E"),H("day",11),H("weekday",11),H("isoWeekday",11),dn("d",Z),dn("e",Z),dn("E",Z),dn("dd",function(n,t){return t.weekdaysMinRegex(n)}),dn("ddd",function(n,t){return t.weekdaysShortRegex(n)}),dn("dddd",function(n,t){return t.weekdaysRegex(n)}),mn(["dd","ddd","dddd"],function(n,t,e,l){var r=e._locale.weekdaysParse(n,l,e._strict);null!=r?t.d=r:f(e).invalidWeekday=n}),mn(["d","e","E"],function(n,t,e,l){t[l]=M(n)});var Jn="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),Qn="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),Kn="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),Xn=un,Zn=un,$n=un;function nt(){function n(n,t){return t.length-n.length}var t,e,l,r,i,o=[],s=[],a=[],u=[];for(t=0;t<7;t++)e=p([2e3,1]).day(t),l=this.weekdaysMin(e,""),r=this.weekdaysShort(e,""),i=this.weekdays(e,""),o.push(l),s.push(r),a.push(i),u.push(l),u.push(r),u.push(i);for(o.sort(n),s.sort(n),a.sort(n),u.sort(n),t=0;t<7;t++)s[t]=pn(s[t]),a[t]=pn(a[t]),u[t]=pn(u[t]);this._weekdaysRegex=new RegExp("^("+u.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+a.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+s.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+o.join("|")+")","i")}function tt(){return this.hours()%12||12}function et(n,t){z(n,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),t)})}function lt(n,t){return t._meridiemParse}z("H",["HH",2],0,"hour"),z("h",["hh",2],0,tt),z("k",["kk",2],0,function(){return this.hours()||24}),z("hmm",0,0,function(){return""+tt.apply(this)+N(this.minutes(),2)}),z("hmmss",0,0,function(){return""+tt.apply(this)+N(this.minutes(),2)+N(this.seconds(),2)}),z("Hmm",0,0,function(){return""+this.hours()+N(this.minutes(),2)}),z("Hmmss",0,0,function(){return""+this.hours()+N(this.minutes(),2)+N(this.seconds(),2)}),et("a",!0),et("A",!1),Y("hour","h"),H("hour",13),dn("a",lt),dn("A",lt),dn("H",Z),dn("h",Z),dn("k",Z),dn("HH",Z,J),dn("hh",Z,J),dn("kk",Z,J),dn("hmm",$),dn("hmmss",nn),dn("Hmm",$),dn("Hmmss",nn),_n(["H","HH"],wn),_n(["k","kk"],function(n,t,e){var l=M(n);t[wn]=24===l?0:l}),_n(["a","A"],function(n,t,e){e._isPm=e._locale.isPM(n),e._meridiem=n}),_n(["h","hh"],function(n,t,e){t[wn]=M(n),f(e).bigHour=!0}),_n("hmm",function(n,t,e){var l=n.length-2;t[wn]=M(n.substr(0,l)),t[xn]=M(n.substr(l)),f(e).bigHour=!0}),_n("hmmss",function(n,t,e){var l=n.length-4,r=n.length-2;t[wn]=M(n.substr(0,l)),t[xn]=M(n.substr(l,2)),t[Mn]=M(n.substr(r)),f(e).bigHour=!0}),_n("Hmm",function(n,t,e){var l=n.length-2;t[wn]=M(n.substr(0,l)),t[xn]=M(n.substr(l))}),_n("Hmmss",function(n,t,e){var l=n.length-4,r=n.length-2;t[wn]=M(n.substr(0,l)),t[xn]=M(n.substr(l,2)),t[Mn]=M(n.substr(r))});var rt,it=Dn("Hours",!0),ot={calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:/\d{1,2}/,relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},months:In,monthsShort:Rn,week:{dow:0,doy:6},weekdays:Jn,weekdaysMin:Kn,weekdaysShort:Qn,meridiemParse:/[ap]\.?m?\.?/i},st={},at={};function ut(n){return n?n.toLowerCase().replace("_","-"):n}function ct(t){var l=null;if(!st[t]&&"undefined"!=typeof n&&n&&n.exports)try{l=rt._abbr,e("uslO")("./"+t),dt(l)}catch(n){}return st[t]}function dt(n,t){var e;return n&&((e=s(t)?pt(n):ht(n,t))?rt=e:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+n+" not found. Did you forget to load it?")),rt._abbr}function ht(n,t){if(null!==t){var e,l=ot;if(t.abbr=n,null!=st[n])L("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),l=st[n]._config;else if(null!=t.parentLocale)if(null!=st[t.parentLocale])l=st[t.parentLocale]._config;else{if(null==(e=ct(t.parentLocale)))return at[t.parentLocale]||(at[t.parentLocale]=[]),at[t.parentLocale].push({name:n,config:t}),null;l=e._config}return st[n]=new A(D(l,t)),at[n]&&at[n].forEach(function(n){ht(n.name,n.config)}),dt(n),st[n]}return delete st[n],null}function pt(n){var t;if(n&&n._locale&&n._locale._abbr&&(n=n._locale._abbr),!n)return rt;if(!i(n)){if(t=ct(n))return t;n=[n]}return function(n){for(var t,e,l,r,i=0;i0;){if(l=ct(r.slice(0,t).join("-")))return l;if(e&&e.length>=t&&k(r,e,!0)>=t-1)break;t--}i++}return rt}(n)}function ft(n){var t,e=n._a;return e&&-2===f(n).overflow&&(t=e[bn]<0||e[bn]>11?bn:e[vn]<1||e[vn]>Yn(e[yn],e[bn])?vn:e[wn]<0||e[wn]>24||24===e[wn]&&(0!==e[xn]||0!==e[Mn]||0!==e[kn])?wn:e[xn]<0||e[xn]>59?xn:e[Mn]<0||e[Mn]>59?Mn:e[kn]<0||e[kn]>999?kn:-1,f(n)._overflowDayOfYear&&(tvn)&&(t=vn),f(n)._overflowWeeks&&-1===t&&(t=Cn),f(n)._overflowWeekday&&-1===t&&(t=Sn),f(n).overflow=t),n}function _t(n,t,e){return null!=n?n:null!=t?t:e}function mt(n){var t,e,l,i,o,s=[];if(!n._d){for(l=function(n){var t=new Date(r.now());return n._useUTC?[t.getUTCFullYear(),t.getUTCMonth(),t.getUTCDate()]:[t.getFullYear(),t.getMonth(),t.getDate()]}(n),n._w&&null==n._a[vn]&&null==n._a[bn]&&function(n){var t,e,l,r,i,o,s,a;if(null!=(t=n._w).GG||null!=t.W||null!=t.E)i=1,o=4,e=_t(t.GG,n._a[yn],Gn(Pt(),1,4).year),l=_t(t.W,1),((r=_t(t.E,1))<1||r>7)&&(a=!0);else{i=n._locale._week.dow,o=n._locale._week.doy;var u=Gn(Pt(),i,o);e=_t(t.gg,n._a[yn],u.year),l=_t(t.w,u.week),null!=t.d?((r=t.d)<0||r>6)&&(a=!0):null!=t.e?(r=t.e+i,(t.e<0||t.e>6)&&(a=!0)):r=i}l<1||l>qn(e,i,o)?f(n)._overflowWeeks=!0:null!=a?f(n)._overflowWeekday=!0:(s=Un(e,l,r,i,o),n._a[yn]=s.year,n._dayOfYear=s.dayOfYear)}(n),null!=n._dayOfYear&&(o=_t(n._a[yn],l[yn]),(n._dayOfYear>On(o)||0===n._dayOfYear)&&(f(n)._overflowDayOfYear=!0),e=Wn(o,0,n._dayOfYear),n._a[bn]=e.getUTCMonth(),n._a[vn]=e.getUTCDate()),t=0;t<3&&null==n._a[t];++t)n._a[t]=s[t]=l[t];for(;t<7;t++)n._a[t]=s[t]=null==n._a[t]?2===t?1:0:n._a[t];24===n._a[wn]&&0===n._a[xn]&&0===n._a[Mn]&&0===n._a[kn]&&(n._nextDay=!0,n._a[wn]=0),n._d=(n._useUTC?Wn:function(n,t,e,l,r,i,o){var s=new Date(n,t,e,l,r,i,o);return n<100&&n>=0&&isFinite(s.getFullYear())&&s.setFullYear(n),s}).apply(null,s),i=n._useUTC?n._d.getUTCDay():n._d.getDay(),null!=n._tzm&&n._d.setUTCMinutes(n._d.getUTCMinutes()-n._tzm),n._nextDay&&(n._a[wn]=24),n._w&&"undefined"!=typeof n._w.d&&n._w.d!==i&&(f(n).weekdayMismatch=!0)}}var gt=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,yt=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,bt=/Z|[+-]\d\d(?::?\d\d)?/,vt=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],wt=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],xt=/^\/?Date\((\-?\d+)/i;function Mt(n){var t,e,l,r,i,o,s=n._i,a=gt.exec(s)||yt.exec(s);if(a){for(f(n).iso=!0,t=0,e=vt.length;t0&&f(n).unusedInput.push(o),s=s.slice(s.indexOf(e)+e.length),u+=e.length),W[i]?(e?f(n).empty=!1:f(n).unusedTokens.push(i),gn(i,e,n)):n._strict&&!e&&f(n).unusedTokens.push(i);f(n).charsLeftOver=a-u,s.length>0&&f(n).unusedInput.push(s),n._a[wn]<=12&&!0===f(n).bigHour&&n._a[wn]>0&&(f(n).bigHour=void 0),f(n).parsedDateParts=n._a.slice(0),f(n).meridiem=n._meridiem,n._a[wn]=(c=n._locale,d=n._a[wn],null==(h=n._meridiem)?d:null!=c.meridiemHour?c.meridiemHour(d,h):null!=c.isPM?((p=c.isPM(h))&&d<12&&(d+=12),p||12!==d||(d=0),d):d),mt(n),ft(n)}else St(n);else Mt(n);var c,d,h,p}function Tt(n){var t=n._i,e=n._f;return n._locale=n._locale||pt(n._l),null===t||void 0===e&&""===t?m({nullInput:!0}):("string"==typeof t&&(n._i=t=n._locale.preparse(t)),w(t)?new v(ft(t)):(u(t)?n._d=t:i(e)?function(n){var t,e,l,r,i;if(0===n._f.length)return f(n).invalidFormat=!0,void(n._d=new Date(NaN));for(r=0;rthis?this:n:m()});function Et(n,t){var e,l;if(1===t.length&&i(t[0])&&(t=t[0]),!t.length)return Pt();for(e=t[0],l=1;l(i=qn(n,l,r))&&(t=i),(function(n,t,e,l,r){var i=Un(n,t,e,l,r),o=Wn(i.year,0,i.dayOfYear);return this.year(o.getUTCFullYear()),this.month(o.getUTCMonth()),this.date(o.getUTCDate()),this}).call(this,n,t,e,l,r))}z(0,["gg",2],0,function(){return this.weekYear()%100}),z(0,["GG",2],0,function(){return this.isoWeekYear()%100}),le("gggg","weekYear"),le("ggggg","weekYear"),le("GGGG","isoWeekYear"),le("GGGGG","isoWeekYear"),Y("weekYear","gg"),Y("isoWeekYear","GG"),H("weekYear",1),H("isoWeekYear",1),dn("G",on),dn("g",on),dn("GG",Z,J),dn("gg",Z,J),dn("GGGG",en,K),dn("gggg",en,K),dn("GGGGG",ln,X),dn("ggggg",ln,X),mn(["gggg","ggggg","GGGG","GGGGG"],function(n,t,e,l){t[l.substr(0,2)]=M(n)}),mn(["gg","GG"],function(n,t,e,l){t[l]=r.parseTwoDigitYear(n)}),z("Q",0,"Qo","quarter"),Y("quarter","Q"),H("quarter",7),dn("Q",q),_n("Q",function(n,t){t[bn]=3*(M(n)-1)}),z("D",["DD",2],"Do","date"),Y("date","D"),H("date",9),dn("D",Z),dn("DD",Z,J),dn("Do",function(n,t){return n?t._dayOfMonthOrdinalParse||t._ordinalParse:t._dayOfMonthOrdinalParseLenient}),_n(["D","DD"],vn),_n("Do",function(n,t){t[vn]=M(n.match(Z)[0])});var ie=Dn("Date",!0);z("DDD",["DDDD",3],"DDDo","dayOfYear"),Y("dayOfYear","DDD"),H("dayOfYear",4),dn("DDD",tn),dn("DDDD",Q),_n(["DDD","DDDD"],function(n,t,e){e._dayOfYear=M(n)}),z("m",["mm",2],0,"minute"),Y("minute","m"),H("minute",14),dn("m",Z),dn("mm",Z,J),_n(["m","mm"],xn);var oe=Dn("Minutes",!1);z("s",["ss",2],0,"second"),Y("second","s"),H("second",15),dn("s",Z),dn("ss",Z,J),_n(["s","ss"],Mn);var se,ae=Dn("Seconds",!1);for(z("S",0,0,function(){return~~(this.millisecond()/100)}),z(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),z(0,["SSS",3],0,"millisecond"),z(0,["SSSS",4],0,function(){return 10*this.millisecond()}),z(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),z(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),z(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),z(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),z(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),Y("millisecond","ms"),H("millisecond",16),dn("S",tn,q),dn("SS",tn,J),dn("SSS",tn,Q),se="SSSS";se.length<=9;se+="S")dn(se,rn);function ue(n,t){t[kn]=M(1e3*("0."+n))}for(se="S";se.length<=9;se+="S")_n(se,ue);var ce=Dn("Milliseconds",!1);z("z",0,0,"zoneAbbr"),z("zz",0,0,"zoneName");var de=v.prototype;function he(n){return n}de.add=Xt,de.calendar=function(n,t){var e=n||Pt(),l=Bt(e,this).startOf("day"),i=r.calendarFormat(this,l)||"sameElse",o=t&&(P(t[i])?t[i].call(this,e):t[i]);return this.format(o||this.localeData().calendar(i,this,Pt(e)))},de.clone=function(){return new v(this)},de.diff=function(n,t,e){var l,r,i;if(!this.isValid())return NaN;if(!(l=Bt(n,this)).isValid())return NaN;switch(r=6e4*(l.utcOffset()-this.utcOffset()),t=j(t)){case"year":i=$t(this,l)/12;break;case"month":i=$t(this,l);break;case"quarter":i=$t(this,l)/3;break;case"second":i=(this-l)/1e3;break;case"minute":i=(this-l)/6e4;break;case"hour":i=(this-l)/36e5;break;case"day":i=(this-l-r)/864e5;break;case"week":i=(this-l-r)/6048e5;break;default:i=this-l}return e?i:x(i)},de.endOf=function(n){return void 0===(n=j(n))||"millisecond"===n?this:("date"===n&&(n="day"),this.startOf(n).add(1,"isoWeek"===n?"week":n).subtract(1,"ms"))},de.format=function(n){n||(n=this.isUtc()?r.defaultFormatUtc:r.defaultFormat);var t=U(this,n);return this.localeData().postformat(t)},de.from=function(n,t){return this.isValid()&&(w(n)&&n.isValid()||Pt(n).isValid())?Gt({to:this,from:n}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()},de.fromNow=function(n){return this.from(Pt(),n)},de.to=function(n,t){return this.isValid()&&(w(n)&&n.isValid()||Pt(n).isValid())?Gt({from:this,to:n}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()},de.toNow=function(n){return this.to(Pt(),n)},de.get=function(n){return P(this[n=j(n)])?this[n]():this},de.invalidAt=function(){return f(this).overflow},de.isAfter=function(n,t){var e=w(n)?n:Pt(n);return!(!this.isValid()||!e.isValid())&&("millisecond"===(t=j(s(t)?"millisecond":t))?this.valueOf()>e.valueOf():e.valueOf()9999?U(e,t?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):P(Date.prototype.toISOString)?t?this.toDate().toISOString():new Date(this.valueOf()+60*this.utcOffset()*1e3).toISOString().replace("Z",U(e,"Z")):U(e,t?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")},de.inspect=function(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var n="moment",t="";this.isLocal()||(n=0===this.utcOffset()?"moment.utc":"moment.parseZone",t="Z");var e="["+n+'("]',l=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY";return this.format(e+l+"-MM-DD[T]HH:mm:ss.SSS"+t+'[")]')},de.toJSON=function(){return this.isValid()?this.toISOString():null},de.toString=function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},de.unix=function(){return Math.floor(this.valueOf()/1e3)},de.valueOf=function(){return this._d.valueOf()-6e4*(this._offset||0)},de.creationData=function(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}},de.year=Pn,de.isLeapYear=function(){return Tn(this.year())},de.weekYear=function(n){return re.call(this,n,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)},de.isoWeekYear=function(n){return re.call(this,n,this.isoWeek(),this.isoWeekday(),1,4)},de.quarter=de.quarters=function(n){return null==n?Math.ceil((this.month()+1)/3):this.month(3*(n-1)+this.month()%3)},de.month=Nn,de.daysInMonth=function(){return Yn(this.year(),this.month())},de.week=de.weeks=function(n){var t=this.localeData().week(this);return null==n?t:this.add(7*(n-t),"d")},de.isoWeek=de.isoWeeks=function(n){var t=Gn(this,1,4).week;return null==n?t:this.add(7*(n-t),"d")},de.weeksInYear=function(){var n=this.localeData()._week;return qn(this.year(),n.dow,n.doy)},de.isoWeeksInYear=function(){return qn(this.year(),1,4)},de.date=ie,de.day=de.days=function(n){if(!this.isValid())return null!=n?this:NaN;var t=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=n?(n=function(n,t){return"string"!=typeof n?n:isNaN(n)?"number"==typeof(n=t.weekdaysParse(n))?n:null:parseInt(n,10)}(n,this.localeData()),this.add(n-t,"d")):t},de.weekday=function(n){if(!this.isValid())return null!=n?this:NaN;var t=(this.day()+7-this.localeData()._week.dow)%7;return null==n?t:this.add(n-t,"d")},de.isoWeekday=function(n){if(!this.isValid())return null!=n?this:NaN;if(null!=n){var t=function(n,t){return"string"==typeof n?t.weekdaysParse(n)%7||7:isNaN(n)?null:n}(n,this.localeData());return this.day(this.day()%7?t:t-7)}return this.day()||7},de.dayOfYear=function(n){var t=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==n?t:this.add(n-t,"d")},de.hour=de.hours=it,de.minute=de.minutes=oe,de.second=de.seconds=ae,de.millisecond=de.milliseconds=ce,de.utcOffset=function(n,t,e){var l,i=this._offset||0;if(!this.isValid())return null!=n?this:NaN;if(null!=n){if("string"==typeof n){if(null===(n=Ft(an,n)))return this}else Math.abs(n)<16&&!e&&(n*=60);return!this._isUTC&&t&&(l=Vt(this)),this._offset=n,this._isUTC=!0,null!=l&&this.add(l,"m"),i!==n&&(!t||this._changeInProgress?Kt(this,Gt(n-i,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,r.updateOffset(this,!0),this._changeInProgress=null)),this}return this._isUTC?i:Vt(this)},de.utc=function(n){return this.utcOffset(0,n)},de.local=function(n){return this._isUTC&&(this.utcOffset(0,n),this._isUTC=!1,n&&this.subtract(Vt(this),"m")),this},de.parseZone=function(){if(null!=this._tzm)this.utcOffset(this._tzm,!1,!0);else if("string"==typeof this._i){var n=Ft(sn,this._i);null!=n?this.utcOffset(n):this.utcOffset(0,!0)}return this},de.hasAlignedHourOffset=function(n){return!!this.isValid()&&(n=n?Pt(n).utcOffset():0,(this.utcOffset()-n)%60==0)},de.isDST=function(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},de.isLocal=function(){return!!this.isValid()&&!this._isUTC},de.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},de.isUtc=Wt,de.isUTC=Wt,de.zoneAbbr=function(){return this._isUTC?"UTC":""},de.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},de.dates=S("dates accessor is deprecated. Use date instead.",ie),de.months=S("months accessor is deprecated. Use month instead",Nn),de.years=S("years accessor is deprecated. Use year instead",Pn),de.zone=S("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",function(n,t){return null!=n?("string"!=typeof n&&(n=-n),this.utcOffset(n,t),this):-this.utcOffset()}),de.isDSTShifted=S("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",function(){if(!s(this._isDSTShifted))return this._isDSTShifted;var n={};if(y(n,this),(n=Tt(n))._a){var t=n._isUTC?p(n._a):Pt(n._a);this._isDSTShifted=this.isValid()&&k(n._a,t.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted});var pe=A.prototype;function fe(n,t,e,l){var r=pt(),i=p().set(l,t);return r[e](i,n)}function _e(n,t,e){if(a(n)&&(t=n,n=void 0),n=n||"",null!=t)return fe(n,t,e,"month");var l,r=[];for(l=0;l<12;l++)r[l]=fe(n,l,e,"month");return r}function me(n,t,e,l){"boolean"==typeof n?(a(t)&&(e=t,t=void 0),t=t||""):(e=t=n,n=!1,a(t)&&(e=t,t=void 0),t=t||"");var r,i=pt(),o=n?i._week.dow:0;if(null!=e)return fe(t,(e+o)%7,l,"day");var s=[];for(r=0;r<7;r++)s[r]=fe(t,(r+o)%7,l,"day");return s}pe.calendar=function(n,t,e){var l=this._calendar[n]||this._calendar.sameElse;return P(l)?l.call(t,e):l},pe.longDateFormat=function(n){var t=this._longDateFormat[n],e=this._longDateFormat[n.toUpperCase()];return t||!e?t:(this._longDateFormat[n]=e.replace(/MMMM|MM|DD|dddd/g,function(n){return n.slice(1)}),this._longDateFormat[n])},pe.invalidDate=function(){return this._invalidDate},pe.ordinal=function(n){return this._ordinal.replace("%d",n)},pe.preparse=he,pe.postformat=he,pe.relativeTime=function(n,t,e,l){var r=this._relativeTime[e];return P(r)?r(n,t,e,l):r.replace(/%d/i,n)},pe.pastFuture=function(n,t){var e=this._relativeTime[n>0?"future":"past"];return P(e)?e(t):e.replace(/%s/i,t)},pe.set=function(n){var t,e;for(e in n)P(t=n[e])?this[e]=t:this["_"+e]=t;this._config=n,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+"|"+/\d{1,2}/.source)},pe.months=function(n,t){return n?i(this._months)?this._months[n.month()]:this._months[(this._months.isFormat||jn).test(t)?"format":"standalone"][n.month()]:i(this._months)?this._months:this._months.standalone},pe.monthsShort=function(n,t){return n?i(this._monthsShort)?this._monthsShort[n.month()]:this._monthsShort[jn.test(t)?"format":"standalone"][n.month()]:i(this._monthsShort)?this._monthsShort:this._monthsShort.standalone},pe.monthsParse=function(n,t,e){var l,r,i;if(this._monthsParseExact)return(function(n,t,e){var l,r,i,o=n.toLocaleLowerCase();if(!this._monthsParse)for(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[],l=0;l<12;++l)i=p([2e3,l]),this._shortMonthsParse[l]=this.monthsShort(i,"").toLocaleLowerCase(),this._longMonthsParse[l]=this.months(i,"").toLocaleLowerCase();return e?"MMM"===t?-1!==(r=Ln.call(this._shortMonthsParse,o))?r:null:-1!==(r=Ln.call(this._longMonthsParse,o))?r:null:"MMM"===t?-1!==(r=Ln.call(this._shortMonthsParse,o))?r:-1!==(r=Ln.call(this._longMonthsParse,o))?r:null:-1!==(r=Ln.call(this._longMonthsParse,o))?r:-1!==(r=Ln.call(this._shortMonthsParse,o))?r:null}).call(this,n,t,e);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),l=0;l<12;l++){if(r=p([2e3,l]),e&&!this._longMonthsParse[l]&&(this._longMonthsParse[l]=new RegExp("^"+this.months(r,"").replace(".","")+"$","i"),this._shortMonthsParse[l]=new RegExp("^"+this.monthsShort(r,"").replace(".","")+"$","i")),e||this._monthsParse[l]||(i="^"+this.months(r,"")+"|^"+this.monthsShort(r,""),this._monthsParse[l]=new RegExp(i.replace(".",""),"i")),e&&"MMMM"===t&&this._longMonthsParse[l].test(n))return l;if(e&&"MMM"===t&&this._shortMonthsParse[l].test(n))return l;if(!e&&this._monthsParse[l].test(n))return l}},pe.monthsRegex=function(n){return this._monthsParseExact?(d(this,"_monthsRegex")||Vn.call(this),n?this._monthsStrictRegex:this._monthsRegex):(d(this,"_monthsRegex")||(this._monthsRegex=Bn),this._monthsStrictRegex&&n?this._monthsStrictRegex:this._monthsRegex)},pe.monthsShortRegex=function(n){return this._monthsParseExact?(d(this,"_monthsRegex")||Vn.call(this),n?this._monthsShortStrictRegex:this._monthsShortRegex):(d(this,"_monthsShortRegex")||(this._monthsShortRegex=Fn),this._monthsShortStrictRegex&&n?this._monthsShortStrictRegex:this._monthsShortRegex)},pe.week=function(n){return Gn(n,this._week.dow,this._week.doy).week},pe.firstDayOfYear=function(){return this._week.doy},pe.firstDayOfWeek=function(){return this._week.dow},pe.weekdays=function(n,t){return n?i(this._weekdays)?this._weekdays[n.day()]:this._weekdays[this._weekdays.isFormat.test(t)?"format":"standalone"][n.day()]:i(this._weekdays)?this._weekdays:this._weekdays.standalone},pe.weekdaysMin=function(n){return n?this._weekdaysMin[n.day()]:this._weekdaysMin},pe.weekdaysShort=function(n){return n?this._weekdaysShort[n.day()]:this._weekdaysShort},pe.weekdaysParse=function(n,t,e){var l,r,i;if(this._weekdaysParseExact)return(function(n,t,e){var l,r,i,o=n.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],l=0;l<7;++l)i=p([2e3,1]).day(l),this._minWeekdaysParse[l]=this.weekdaysMin(i,"").toLocaleLowerCase(),this._shortWeekdaysParse[l]=this.weekdaysShort(i,"").toLocaleLowerCase(),this._weekdaysParse[l]=this.weekdays(i,"").toLocaleLowerCase();return e?"dddd"===t?-1!==(r=Ln.call(this._weekdaysParse,o))?r:null:"ddd"===t?-1!==(r=Ln.call(this._shortWeekdaysParse,o))?r:null:-1!==(r=Ln.call(this._minWeekdaysParse,o))?r:null:"dddd"===t?-1!==(r=Ln.call(this._weekdaysParse,o))?r:-1!==(r=Ln.call(this._shortWeekdaysParse,o))?r:-1!==(r=Ln.call(this._minWeekdaysParse,o))?r:null:"ddd"===t?-1!==(r=Ln.call(this._shortWeekdaysParse,o))?r:-1!==(r=Ln.call(this._weekdaysParse,o))?r:-1!==(r=Ln.call(this._minWeekdaysParse,o))?r:null:-1!==(r=Ln.call(this._minWeekdaysParse,o))?r:-1!==(r=Ln.call(this._weekdaysParse,o))?r:-1!==(r=Ln.call(this._shortWeekdaysParse,o))?r:null}).call(this,n,t,e);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),l=0;l<7;l++){if(r=p([2e3,1]).day(l),e&&!this._fullWeekdaysParse[l]&&(this._fullWeekdaysParse[l]=new RegExp("^"+this.weekdays(r,"").replace(".",".?")+"$","i"),this._shortWeekdaysParse[l]=new RegExp("^"+this.weekdaysShort(r,"").replace(".",".?")+"$","i"),this._minWeekdaysParse[l]=new RegExp("^"+this.weekdaysMin(r,"").replace(".",".?")+"$","i")),this._weekdaysParse[l]||(i="^"+this.weekdays(r,"")+"|^"+this.weekdaysShort(r,"")+"|^"+this.weekdaysMin(r,""),this._weekdaysParse[l]=new RegExp(i.replace(".",""),"i")),e&&"dddd"===t&&this._fullWeekdaysParse[l].test(n))return l;if(e&&"ddd"===t&&this._shortWeekdaysParse[l].test(n))return l;if(e&&"dd"===t&&this._minWeekdaysParse[l].test(n))return l;if(!e&&this._weekdaysParse[l].test(n))return l}},pe.weekdaysRegex=function(n){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||nt.call(this),n?this._weekdaysStrictRegex:this._weekdaysRegex):(d(this,"_weekdaysRegex")||(this._weekdaysRegex=Xn),this._weekdaysStrictRegex&&n?this._weekdaysStrictRegex:this._weekdaysRegex)},pe.weekdaysShortRegex=function(n){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||nt.call(this),n?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(d(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=Zn),this._weekdaysShortStrictRegex&&n?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)},pe.weekdaysMinRegex=function(n){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||nt.call(this),n?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(d(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=$n),this._weekdaysMinStrictRegex&&n?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)},pe.isPM=function(n){return"p"===(n+"").toLowerCase().charAt(0)},pe.meridiem=function(n,t,e){return n>11?e?"pm":"PM":e?"am":"AM"},dt("en",{dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(n){var t=n%10;return n+(1===M(n%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th")}}),r.lang=S("moment.lang is deprecated. Use moment.locale instead.",dt),r.langData=S("moment.langData is deprecated. Use moment.localeData instead.",pt);var ge=Math.abs;function ye(n,t,e,l){var r=Gt(t,e);return n._milliseconds+=l*r._milliseconds,n._days+=l*r._days,n._months+=l*r._months,n._bubble()}function be(n){return n<0?Math.floor(n):Math.ceil(n)}function ve(n){return 4800*n/146097}function we(n){return 146097*n/4800}function xe(n){return function(){return this.as(n)}}var Me=xe("ms"),ke=xe("s"),Ce=xe("m"),Se=xe("h"),Oe=xe("d"),Te=xe("w"),Le=xe("M"),Pe=xe("y");function De(n){return function(){return this.isValid()?this._data[n]:NaN}}var Ae=De("milliseconds"),Ee=De("seconds"),Ye=De("minutes"),je=De("hours"),Ie=De("days"),Re=De("months"),He=De("years"),Ne=Math.round,Fe={ss:44,s:45,m:45,h:22,d:26,M:11},Be=Math.abs;function Ve(n){return(n>0)-(n<0)||+n}function We(){if(!this.isValid())return this.localeData().invalidDate();var n,t,e=Be(this._milliseconds)/1e3,l=Be(this._days),r=Be(this._months);t=x((n=x(e/60))/60),e%=60,n%=60;var i=x(r/12),o=r%=12,s=l,a=t,u=n,c=e?e.toFixed(3).replace(/\.?0+$/,""):"",d=this.asSeconds();if(!d)return"P0D";var h=d<0?"-":"",p=Ve(this._months)!==Ve(d)?"-":"",f=Ve(this._days)!==Ve(d)?"-":"",_=Ve(this._milliseconds)!==Ve(d)?"-":"";return h+"P"+(i?p+i+"Y":"")+(o?p+o+"M":"")+(s?f+s+"D":"")+(a||u||c?"T":"")+(a?_+a+"H":"")+(u?_+u+"M":"")+(c?_+c+"S":"")}var ze=jt.prototype;return ze.isValid=function(){return this._isValid},ze.abs=function(){var n=this._data;return this._milliseconds=ge(this._milliseconds),this._days=ge(this._days),this._months=ge(this._months),n.milliseconds=ge(n.milliseconds),n.seconds=ge(n.seconds),n.minutes=ge(n.minutes),n.hours=ge(n.hours),n.months=ge(n.months),n.years=ge(n.years),this},ze.add=function(n,t){return ye(this,n,t,1)},ze.subtract=function(n,t){return ye(this,n,t,-1)},ze.as=function(n){if(!this.isValid())return NaN;var t,e,l=this._milliseconds;if("month"===(n=j(n))||"year"===n)return e=this._months+ve(t=this._days+l/864e5),"month"===n?e:e/12;switch(t=this._days+Math.round(we(this._months)),n){case"week":return t/7+l/6048e5;case"day":return t+l/864e5;case"hour":return 24*t+l/36e5;case"minute":return 1440*t+l/6e4;case"second":return 86400*t+l/1e3;case"millisecond":return Math.floor(864e5*t)+l;default:throw new Error("Unknown unit "+n)}},ze.asMilliseconds=Me,ze.asSeconds=ke,ze.asMinutes=Ce,ze.asHours=Se,ze.asDays=Oe,ze.asWeeks=Te,ze.asMonths=Le,ze.asYears=Pe,ze.valueOf=function(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*M(this._months/12):NaN},ze._bubble=function(){var n,t,e,l,r,i=this._milliseconds,o=this._days,s=this._months,a=this._data;return i>=0&&o>=0&&s>=0||i<=0&&o<=0&&s<=0||(i+=864e5*be(we(s)+o),o=0,s=0),a.milliseconds=i%1e3,n=x(i/1e3),a.seconds=n%60,t=x(n/60),a.minutes=t%60,e=x(t/60),a.hours=e%24,s+=r=x(ve(o+=x(e/24))),o-=be(we(r)),l=x(s/12),s%=12,a.days=o,a.months=s,a.years=l,this},ze.clone=function(){return Gt(this)},ze.get=function(n){return n=j(n),this.isValid()?this[n+"s"]():NaN},ze.milliseconds=Ae,ze.seconds=Ee,ze.minutes=Ye,ze.hours=je,ze.days=Ie,ze.weeks=function(){return x(this.days()/7)},ze.months=Re,ze.years=He,ze.humanize=function(n){if(!this.isValid())return this.localeData().invalidDate();var t=this.localeData(),e=function(n,t,e){var l=Gt(n).abs(),r=Ne(l.as("s")),i=Ne(l.as("m")),o=Ne(l.as("h")),s=Ne(l.as("d")),a=Ne(l.as("M")),u=Ne(l.as("y")),c=r<=Fe.ss&&["s",r]||r0,c[4]=e,(function(n,t,e,l,r){return r.relativeTime(t||1,!!e,n,l)}).apply(null,c)}(this,!n,t);return n&&(e=t.pastFuture(+this,e)),t.postformat(e)},ze.toISOString=We,ze.toString=We,ze.toJSON=We,ze.locale=ne,ze.localeData=ee,ze.toIsoString=S("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",We),ze.lang=te,z("X",0,0,"unix"),z("x",0,0,"valueOf"),dn("x",on),dn("X",/[+-]?\d+(\.\d{1,3})?/),_n("X",function(n,t,e){e._d=new Date(1e3*parseFloat(n,10))}),_n("x",function(n,t,e){e._d=new Date(M(n))}),r.version="2.21.0",t=Pt,r.fn=de,r.min=function(){return Et("isBefore",[].slice.call(arguments,0))},r.max=function(){return Et("isAfter",[].slice.call(arguments,0))},r.now=function(){return Date.now?Date.now():+new Date},r.utc=p,r.unix=function(n){return Pt(1e3*n)},r.months=function(n,t){return _e(n,t,"months")},r.isDate=u,r.locale=dt,r.invalid=m,r.duration=Gt,r.isMoment=w,r.weekdays=function(n,t,e){return me(n,t,e,"weekdays")},r.parseZone=function(){return Pt.apply(null,arguments).parseZone()},r.localeData=pt,r.isDuration=It,r.monthsShort=function(n,t){return _e(n,t,"monthsShort")},r.weekdaysMin=function(n,t,e){return me(n,t,e,"weekdaysMin")},r.defineLocale=ht,r.updateLocale=function(n,t){if(null!=t){var e,l,r=ot;null!=(l=ct(n))&&(r=l._config),(e=new A(t=D(r,t))).parentLocale=st[n],st[n]=e,dt(n)}else null!=st[n]&&(null!=st[n].parentLocale?st[n]=st[n].parentLocale:null!=st[n]&&delete st[n]);return st[n]},r.locales=function(){return O(st)},r.weekdaysShort=function(n,t,e){return me(n,t,e,"weekdaysShort")},r.normalizeUnits=j,r.relativeTimeRounding=function(n){return void 0===n?Ne:"function"==typeof n&&(Ne=n,!0)},r.relativeTimeThreshold=function(n,t){return void 0!==Fe[n]&&(void 0===t?Fe[n]:(Fe[n]=t,"s"===n&&(Fe.ss=t-1),!0))},r.calendarFormat=function(n,t){var e=n.diff(t,"days",!0);return e<-6?"sameElse":e<-1?"lastWeek":e<0?"lastDay":e<1?"sameDay":e<2?"nextDay":e<7?"nextWeek":"sameElse"},r.prototype=de,r.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"YYYY-[W]WW",MONTH:"YYYY-MM"},r}()}).call(t,e("3IRH")(n))},QZk1:function(n,t,e){!function(n){"use strict";n.defineLocale("en-il",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(n){var t=n%10;return n+(1==~~(n%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th")}})}(e("PJh5"))},Qnch:function(n,t,e){"use strict";t.a=function(n,t,e){return void 0===e&&(e=Number.POSITIVE_INFINITY),function(l){return"number"==typeof t&&(e=t,t=null),l.lift(new o(n,t,e))}};var l=e("TToO"),r=e("PIsA"),i=e("tZ2B"),o=function(){function n(n,t,e){void 0===e&&(e=Number.POSITIVE_INFINITY),this.project=n,this.resultSelector=t,this.concurrent=e}return n.prototype.call=function(n,t){return t.subscribe(new s(n,this.project,this.resultSelector,this.concurrent))},n}(),s=function(n){function t(t,e,l,r){void 0===r&&(r=Number.POSITIVE_INFINITY),n.call(this,t),this.project=e,this.resultSelector=l,this.concurrent=r,this.hasCompleted=!1,this.buffer=[],this.active=0,this.index=0}return Object(l.__extends)(t,n),t.prototype._next=function(n){this.active0?this._next(t.shift()):0===this.active&&this.hasCompleted&&this.destination.complete()},t}(i.a)},RMhj:function(n,t,e){var l={"./en.json":["TKku",5],"./es.json":["/YBz",4],"./es_base.json":["0v8u",3],"./ru.json":["P+VX",2],"./zh.json":["ODm5",1],"./zh_base.json":["dXVM",0]};function r(n){var t=l[n];return t?e.e(t[1]).then(function(){return e(t[0])}):Promise.reject(new Error("Cannot find module '"+n+"'."))}r.keys=function(){return Object.keys(l)},r.id="RMhj",n.exports=r},Rf9G:function(n,t,e){"use strict";t.a=function(){return Object(l.a)()(this)};var l=e("3a3m")},RnJI:function(n,t,e){!function(n){"use strict";n.defineLocale("ka",{months:{standalone:"\u10d8\u10d0\u10dc\u10d5\u10d0\u10e0\u10d8_\u10d7\u10d4\u10d1\u10d4\u10e0\u10d5\u10d0\u10da\u10d8_\u10db\u10d0\u10e0\u10e2\u10d8_\u10d0\u10de\u10e0\u10d8\u10da\u10d8_\u10db\u10d0\u10d8\u10e1\u10d8_\u10d8\u10d5\u10dc\u10d8\u10e1\u10d8_\u10d8\u10d5\u10da\u10d8\u10e1\u10d8_\u10d0\u10d2\u10d5\u10d8\u10e1\u10e2\u10dd_\u10e1\u10d4\u10e5\u10e2\u10d4\u10db\u10d1\u10d4\u10e0\u10d8_\u10dd\u10e5\u10e2\u10dd\u10db\u10d1\u10d4\u10e0\u10d8_\u10dc\u10dd\u10d4\u10db\u10d1\u10d4\u10e0\u10d8_\u10d3\u10d4\u10d9\u10d4\u10db\u10d1\u10d4\u10e0\u10d8".split("_"),format:"\u10d8\u10d0\u10dc\u10d5\u10d0\u10e0\u10e1_\u10d7\u10d4\u10d1\u10d4\u10e0\u10d5\u10d0\u10da\u10e1_\u10db\u10d0\u10e0\u10e2\u10e1_\u10d0\u10de\u10e0\u10d8\u10da\u10d8\u10e1_\u10db\u10d0\u10d8\u10e1\u10e1_\u10d8\u10d5\u10dc\u10d8\u10e1\u10e1_\u10d8\u10d5\u10da\u10d8\u10e1\u10e1_\u10d0\u10d2\u10d5\u10d8\u10e1\u10e2\u10e1_\u10e1\u10d4\u10e5\u10e2\u10d4\u10db\u10d1\u10d4\u10e0\u10e1_\u10dd\u10e5\u10e2\u10dd\u10db\u10d1\u10d4\u10e0\u10e1_\u10dc\u10dd\u10d4\u10db\u10d1\u10d4\u10e0\u10e1_\u10d3\u10d4\u10d9\u10d4\u10db\u10d1\u10d4\u10e0\u10e1".split("_")},monthsShort:"\u10d8\u10d0\u10dc_\u10d7\u10d4\u10d1_\u10db\u10d0\u10e0_\u10d0\u10de\u10e0_\u10db\u10d0\u10d8_\u10d8\u10d5\u10dc_\u10d8\u10d5\u10da_\u10d0\u10d2\u10d5_\u10e1\u10d4\u10e5_\u10dd\u10e5\u10e2_\u10dc\u10dd\u10d4_\u10d3\u10d4\u10d9".split("_"),weekdays:{standalone:"\u10d9\u10d5\u10d8\u10e0\u10d0_\u10dd\u10e0\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8_\u10e1\u10d0\u10db\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8_\u10dd\u10d7\u10ee\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8_\u10ee\u10e3\u10d7\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8_\u10de\u10d0\u10e0\u10d0\u10e1\u10d9\u10d4\u10d5\u10d8_\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8".split("_"),format:"\u10d9\u10d5\u10d8\u10e0\u10d0\u10e1_\u10dd\u10e0\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1_\u10e1\u10d0\u10db\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1_\u10dd\u10d7\u10ee\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1_\u10ee\u10e3\u10d7\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1_\u10de\u10d0\u10e0\u10d0\u10e1\u10d9\u10d4\u10d5\u10e1_\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1".split("_"),isFormat:/(\u10ec\u10d8\u10dc\u10d0|\u10e8\u10d4\u10db\u10d3\u10d4\u10d2)/},weekdaysShort:"\u10d9\u10d5\u10d8_\u10dd\u10e0\u10e8_\u10e1\u10d0\u10db_\u10dd\u10d7\u10ee_\u10ee\u10e3\u10d7_\u10de\u10d0\u10e0_\u10e8\u10d0\u10d1".split("_"),weekdaysMin:"\u10d9\u10d5_\u10dd\u10e0_\u10e1\u10d0_\u10dd\u10d7_\u10ee\u10e3_\u10de\u10d0_\u10e8\u10d0".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[\u10d3\u10e6\u10d4\u10e1] LT[-\u10d6\u10d4]",nextDay:"[\u10ee\u10d5\u10d0\u10da] LT[-\u10d6\u10d4]",lastDay:"[\u10d2\u10e3\u10e8\u10d8\u10dc] LT[-\u10d6\u10d4]",nextWeek:"[\u10e8\u10d4\u10db\u10d3\u10d4\u10d2] dddd LT[-\u10d6\u10d4]",lastWeek:"[\u10ec\u10d8\u10dc\u10d0] dddd LT-\u10d6\u10d4",sameElse:"L"},relativeTime:{future:function(n){return/(\u10ec\u10d0\u10db\u10d8|\u10ec\u10e3\u10d7\u10d8|\u10e1\u10d0\u10d0\u10d7\u10d8|\u10ec\u10d4\u10da\u10d8)/.test(n)?n.replace(/\u10d8$/,"\u10e8\u10d8"):n+"\u10e8\u10d8"},past:function(n){return/(\u10ec\u10d0\u10db\u10d8|\u10ec\u10e3\u10d7\u10d8|\u10e1\u10d0\u10d0\u10d7\u10d8|\u10d3\u10e6\u10d4|\u10d7\u10d5\u10d4)/.test(n)?n.replace(/(\u10d8|\u10d4)$/,"\u10d8\u10e1 \u10e3\u10d9\u10d0\u10dc"):/\u10ec\u10d4\u10da\u10d8/.test(n)?n.replace(/\u10ec\u10d4\u10da\u10d8$/,"\u10ec\u10da\u10d8\u10e1 \u10e3\u10d9\u10d0\u10dc"):void 0},s:"\u10e0\u10d0\u10db\u10d3\u10d4\u10dc\u10d8\u10db\u10d4 \u10ec\u10d0\u10db\u10d8",ss:"%d \u10ec\u10d0\u10db\u10d8",m:"\u10ec\u10e3\u10d7\u10d8",mm:"%d \u10ec\u10e3\u10d7\u10d8",h:"\u10e1\u10d0\u10d0\u10d7\u10d8",hh:"%d \u10e1\u10d0\u10d0\u10d7\u10d8",d:"\u10d3\u10e6\u10d4",dd:"%d \u10d3\u10e6\u10d4",M:"\u10d7\u10d5\u10d4",MM:"%d \u10d7\u10d5\u10d4",y:"\u10ec\u10d4\u10da\u10d8",yy:"%d \u10ec\u10d4\u10da\u10d8"},dayOfMonthOrdinalParse:/0|1-\u10da\u10d8|\u10db\u10d4-\d{1,2}|\d{1,2}-\u10d4/,ordinal:function(n){return 0===n?n:1===n?n+"-\u10da\u10d8":n<20||n<=100&&n%20==0||n%100==0?"\u10db\u10d4-"+n:n+"-\u10d4"},week:{dow:1,doy:7}})}(e("PJh5"))},Sjoy:function(n,t,e){!function(n){"use strict";n.defineLocale("en-au",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(n){var t=n%10;return n+(1==~~(n%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th")},week:{dow:1,doy:4}})}(e("PJh5"))},T1Dh:function(n,t,e){"use strict";t.a=function(n){return function(t){return 0===n?new o.a:t.lift(new s(n))}};var l=e("TToO"),r=e("OVmG"),i=e("pU/0"),o=e("+3/4"),s=function(){function n(n){if(this.total=n,this.total<0)throw new i.a}return n.prototype.call=function(n,t){return t.subscribe(new a(n,this.total))},n}(),a=function(n){function t(t,e){n.call(this,t),this.total=e,this.ring=new Array,this.count=0}return Object(l.__extends)(t,n),t.prototype._next=function(n){var t=this.ring,e=this.total,l=this.count++;t.length0)for(var e=this.count>=this.total?this.total:this.count,l=this.ring,r=0;r=0;s--)(r=n[s])&&(o=(i<3?r(o):i>3?r(t,e,o):r(t,e))||o);return i>3&&o&&Object.defineProperty(t,e,o),o},t.__param=function(n,t){return function(e,l){t(e,l,n)}},t.__metadata=function(n,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(n,t)},t.__awaiter=function(n,t,e,l){return new(e||(e=Promise))(function(r,i){function o(n){try{a(l.next(n))}catch(n){i(n)}}function s(n){try{a(l.throw(n))}catch(n){i(n)}}function a(n){n.done?r(n.value):new e(function(t){t(n.value)}).then(o,s)}a((l=l.apply(n,t||[])).next())})},t.__generator=function(n,t){var e,l,r,i,o={label:0,sent:function(){if(1&r[0])throw r[1];return r[1]},trys:[],ops:[]};return i={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function s(i){return function(s){return function(i){if(e)throw new TypeError("Generator is already executing.");for(;o;)try{if(e=1,l&&(r=l[2&i[0]?"return":i[0]?"throw":"next"])&&!(r=r.call(l,i[1])).done)return r;switch(l=0,r&&(i=[0,r.value]),i[0]){case 0:case 1:r=i;break;case 4:return o.label++,{value:i[1],done:!1};case 5:o.label++,l=i[1],i=[0];continue;case 7:i=o.ops.pop(),o.trys.pop();continue;default:if(!(r=(r=o.trys).length>0&&r[r.length-1])&&(6===i[0]||2===i[0])){o=0;continue}if(3===i[0]&&(!r||i[1]>r[0]&&i[1]1||a(n,t)})})}function a(n,t){try{(e=r[n](t)).value instanceof s?Promise.resolve(e.value.v).then(u,c):d(i[0][2],e)}catch(n){d(i[0][3],n)}var e}function u(n){a("next",n)}function c(n){a("throw",n)}function d(n,t){n(t),i.shift(),i.length&&a(i[0][0],i[0][1])}},t.__asyncDelegator=function(n){var t,e;return t={},l("next"),l("throw",function(n){throw n}),l("return"),t[Symbol.iterator]=function(){return this},t;function l(l,r){n[l]&&(t[l]=function(t){return(e=!e)?{value:s(n[l](t)),done:"return"===l}:r?r(t):t})}},t.__asyncValues=function(n){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t=n[Symbol.asyncIterator];return t?t.call(n):"function"==typeof i?i(n):n[Symbol.iterator]()},t.__makeTemplateObject=function(n,t){return Object.defineProperty?Object.defineProperty(n,"raw",{value:t}):n.raw=t,n};var l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,t){n.__proto__=t}||function(n,t){for(var e in t)t.hasOwnProperty(e)&&(n[e]=t[e])},r=Object.assign||function(n){for(var t,e=1,l=arguments.length;e=n.length&&(n=void 0),{value:n&&n[e++],done:!n}}}}function o(n,t){var e="function"==typeof Symbol&&n[Symbol.iterator];if(!e)return n;var l,r,i=e.call(n),o=[];try{for(;(void 0===t||t-- >0)&&!(l=i.next()).done;)o.push(l.value)}catch(n){r={error:n}}finally{try{l&&!l.done&&(e=i.return)&&e.call(i)}finally{if(r)throw r.error}}return o}function s(n){return this instanceof s?(this.v=n,this):new s(n)}},To0v:function(n,t,e){!function(n){"use strict";n.defineLocale("ug-cn",{months:"\u064a\u0627\u0646\u06cb\u0627\u0631_\u0641\u06d0\u06cb\u0631\u0627\u0644_\u0645\u0627\u0631\u062a_\u0626\u0627\u067e\u0631\u06d0\u0644_\u0645\u0627\u064a_\u0626\u0649\u064a\u06c7\u0646_\u0626\u0649\u064a\u06c7\u0644_\u0626\u0627\u06cb\u063a\u06c7\u0633\u062a_\u0633\u06d0\u0646\u062a\u06d5\u0628\u0649\u0631_\u0626\u06c6\u0643\u062a\u06d5\u0628\u0649\u0631_\u0646\u0648\u064a\u0627\u0628\u0649\u0631_\u062f\u06d0\u0643\u0627\u0628\u0649\u0631".split("_"),monthsShort:"\u064a\u0627\u0646\u06cb\u0627\u0631_\u0641\u06d0\u06cb\u0631\u0627\u0644_\u0645\u0627\u0631\u062a_\u0626\u0627\u067e\u0631\u06d0\u0644_\u0645\u0627\u064a_\u0626\u0649\u064a\u06c7\u0646_\u0626\u0649\u064a\u06c7\u0644_\u0626\u0627\u06cb\u063a\u06c7\u0633\u062a_\u0633\u06d0\u0646\u062a\u06d5\u0628\u0649\u0631_\u0626\u06c6\u0643\u062a\u06d5\u0628\u0649\u0631_\u0646\u0648\u064a\u0627\u0628\u0649\u0631_\u062f\u06d0\u0643\u0627\u0628\u0649\u0631".split("_"),weekdays:"\u064a\u06d5\u0643\u0634\u06d5\u0646\u0628\u06d5_\u062f\u06c8\u0634\u06d5\u0646\u0628\u06d5_\u0633\u06d5\u064a\u0634\u06d5\u0646\u0628\u06d5_\u0686\u0627\u0631\u0634\u06d5\u0646\u0628\u06d5_\u067e\u06d5\u064a\u0634\u06d5\u0646\u0628\u06d5_\u062c\u06c8\u0645\u06d5_\u0634\u06d5\u0646\u0628\u06d5".split("_"),weekdaysShort:"\u064a\u06d5_\u062f\u06c8_\u0633\u06d5_\u0686\u0627_\u067e\u06d5_\u062c\u06c8_\u0634\u06d5".split("_"),weekdaysMin:"\u064a\u06d5_\u062f\u06c8_\u0633\u06d5_\u0686\u0627_\u067e\u06d5_\u062c\u06c8_\u0634\u06d5".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY-\u064a\u0649\u0644\u0649M-\u0626\u0627\u064a\u0646\u0649\u06adD-\u0643\u06c8\u0646\u0649",LLL:"YYYY-\u064a\u0649\u0644\u0649M-\u0626\u0627\u064a\u0646\u0649\u06adD-\u0643\u06c8\u0646\u0649\u060c HH:mm",LLLL:"dddd\u060c YYYY-\u064a\u0649\u0644\u0649M-\u0626\u0627\u064a\u0646\u0649\u06adD-\u0643\u06c8\u0646\u0649\u060c HH:mm"},meridiemParse:/\u064a\u06d0\u0631\u0649\u0645 \u0643\u06d0\u0686\u06d5|\u0633\u06d5\u06be\u06d5\u0631|\u0686\u06c8\u0634\u062a\u0649\u0646 \u0628\u06c7\u0631\u06c7\u0646|\u0686\u06c8\u0634|\u0686\u06c8\u0634\u062a\u0649\u0646 \u0643\u06d0\u064a\u0649\u0646|\u0643\u06d5\u0686/,meridiemHour:function(n,t){return 12===n&&(n=0),"\u064a\u06d0\u0631\u0649\u0645 \u0643\u06d0\u0686\u06d5"===t||"\u0633\u06d5\u06be\u06d5\u0631"===t||"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0628\u06c7\u0631\u06c7\u0646"===t?n:"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0643\u06d0\u064a\u0649\u0646"===t||"\u0643\u06d5\u0686"===t?n+12:n>=11?n:n+12},meridiem:function(n,t,e){var l=100*n+t;return l<600?"\u064a\u06d0\u0631\u0649\u0645 \u0643\u06d0\u0686\u06d5":l<900?"\u0633\u06d5\u06be\u06d5\u0631":l<1130?"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0628\u06c7\u0631\u06c7\u0646":l<1230?"\u0686\u06c8\u0634":l<1800?"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0643\u06d0\u064a\u0649\u0646":"\u0643\u06d5\u0686"},calendar:{sameDay:"[\u0628\u06c8\u06af\u06c8\u0646 \u0633\u0627\u0626\u06d5\u062a] LT",nextDay:"[\u0626\u06d5\u062a\u06d5 \u0633\u0627\u0626\u06d5\u062a] LT",nextWeek:"[\u0643\u06d0\u0644\u06d5\u0631\u0643\u0649] dddd [\u0633\u0627\u0626\u06d5\u062a] LT",lastDay:"[\u062a\u06c6\u0646\u06c8\u06af\u06c8\u0646] LT",lastWeek:"[\u0626\u0627\u0644\u062f\u0649\u0646\u0642\u0649] dddd [\u0633\u0627\u0626\u06d5\u062a] LT",sameElse:"L"},relativeTime:{future:"%s \u0643\u06d0\u064a\u0649\u0646",past:"%s \u0628\u06c7\u0631\u06c7\u0646",s:"\u0646\u06d5\u0686\u0686\u06d5 \u0633\u06d0\u0643\u0648\u0646\u062a",ss:"%d \u0633\u06d0\u0643\u0648\u0646\u062a",m:"\u0628\u0649\u0631 \u0645\u0649\u0646\u06c7\u062a",mm:"%d \u0645\u0649\u0646\u06c7\u062a",h:"\u0628\u0649\u0631 \u0633\u0627\u0626\u06d5\u062a",hh:"%d \u0633\u0627\u0626\u06d5\u062a",d:"\u0628\u0649\u0631 \u0643\u06c8\u0646",dd:"%d \u0643\u06c8\u0646",M:"\u0628\u0649\u0631 \u0626\u0627\u064a",MM:"%d \u0626\u0627\u064a",y:"\u0628\u0649\u0631 \u064a\u0649\u0644",yy:"%d \u064a\u0649\u0644"},dayOfMonthOrdinalParse:/\d{1,2}(-\u0643\u06c8\u0646\u0649|-\u0626\u0627\u064a|-\u06be\u06d5\u067e\u062a\u06d5)/,ordinal:function(n,t){switch(t){case"d":case"D":case"DDD":return n+"-\u0643\u06c8\u0646\u0649";case"w":case"W":return n+"-\u06be\u06d5\u067e\u062a\u06d5";default:return n}},preparse:function(n){return n.replace(/\u060c/g,",")},postformat:function(n){return n.replace(/,/g,"\u060c")},week:{dow:1,doy:7}})}(e("PJh5"))},Tqun:function(n,t,e){!function(n){"use strict";n.defineLocale("en-ca",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"YYYY-MM-DD",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(n){var t=n%10;return n+(1==~~(n%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th")}})}(e("PJh5"))},Uter:function(n,t,e){const l=e("X3l8").Buffer;n.exports=function(n){if(n.length>=255)throw new TypeError("Alphabet too long");const t=new Uint8Array(256);t.fill(255);for(let l=0;l>>0,c=new Uint8Array(u);for(;n[o];){let l=t[n.charCodeAt(o)];if(255===l)return;let r=0;for(let n=u-1;(0!==l||r>>0)%256>>>0,l=l/256>>>0;if(0!==l)throw new Error("Non-zero carry");a=r,o++}if(" "===n[o])return;let d=u-a;for(;d!==u&&0===c[d];)d++;const h=l.allocUnsafe(s+(u-d));h.fill(0,0,s);let p=s;for(;d!==u;)h[p++]=c[d++];return h}return{encode:function(t){if(!l.isBuffer(t))throw new TypeError("Expected Buffer");if(0===t.length)return"";let i=0,s=0,a=0;const u=t.length;for(;a!==u&&0===t[a];)a++,i++;const c=(u-a)*o+1>>>0,d=new Uint8Array(c);for(;a!==u;){let n=t[a],l=0;for(let t=c-1;(0!==n||l>>0)%e>>>0,n=n/e>>>0;if(0!==n)throw new Error("Non-zero carry");s=l,a++}let h=c-s;for(;h!==c&&0===d[h];)h++;let p=r.repeat(i);for(;h1?new t(n,l):1===r?new i.a(n[0],l):new o.a(l)},t.dispatch=function(n){var t=n.array,e=n.index,l=n.subscriber;e>=n.count?l.complete():(l.next(t[e]),l.closed||(n.index=e+1,this.schedule(n)))},t.prototype._subscribe=function(n){var e=this.array,l=e.length,r=this.scheduler;if(r)return r.schedule(t.dispatch,0,{array:e,index:0,count:l,subscriber:n});for(var i=0;i=11?n:n+12},meridiem:function(n,t,e){var l=100*n+t;return l<600?"\u51cc\u6668":l<900?"\u65e9\u4e0a":l<1130?"\u4e0a\u5348":l<1230?"\u4e2d\u5348":l<1800?"\u4e0b\u5348":"\u665a\u4e0a"},calendar:{sameDay:"[\u4eca\u5929]LT",nextDay:"[\u660e\u5929]LT",nextWeek:"[\u4e0b]ddddLT",lastDay:"[\u6628\u5929]LT",lastWeek:"[\u4e0a]ddddLT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(\u65e5|\u6708|\u5468)/,ordinal:function(n,t){switch(t){case"d":case"D":case"DDD":return n+"\u65e5";case"M":return n+"\u6708";case"w":case"W":return n+"\u5468";default:return n}},relativeTime:{future:"%s\u5185",past:"%s\u524d",s:"\u51e0\u79d2",ss:"%d \u79d2",m:"1 \u5206\u949f",mm:"%d \u5206\u949f",h:"1 \u5c0f\u65f6",hh:"%d \u5c0f\u65f6",d:"1 \u5929",dd:"%d \u5929",M:"1 \u4e2a\u6708",MM:"%d \u4e2a\u6708",y:"1 \u5e74",yy:"%d \u5e74"},week:{dow:1,doy:4}})}(e("PJh5"))},WT6e:function(n,t,e){"use strict";(function(n){e.d(t,"g",function(){return ot}),e.d(t,"V",function(){return $n}),e.d(t,"Y",function(){return nt}),e.d(t,"U",function(){return et}),e.d(t,"A",function(){return tt}),e.d(t,"c",function(){return hn}),e.d(t,"E",function(){return _n}),e.d(t,"D",function(){return mn}),e.d(t,"b",function(){return gn}),e.d(t,"d",function(){return cn}),e.d(t,"e",function(){return dn}),e.d(t,"X",function(){return Ot}),e.d(t,"P",function(){return Un}),e.d(t,"_0",function(){return qn}),e.d(t,"w",function(){return Kt}),e.d(t,"f",function(){return ne}),e.d(t,"o",function(){return Rn}),e.d(t,"n",function(){return sn}),e.d(t,"J",function(){return ee}),e.d(t,"K",function(){return te}),e.d(t,"a",function(){return _}),e.d(t,"k",function(){return m}),e.d(t,"t",function(){return y}),e.d(t,"F",function(){return g}),e.d(t,"S",function(){return b}),e.d(t,"Q",function(){return v}),e.d(t,"W",function(){return j}),e.d(t,"s",function(){return F}),e.d(t,"r",function(){return a}),e.d(t,"p",function(){return x}),e.d(t,"C",function(){return M}),e.d(t,"q",function(){return k}),e.d(t,"L",function(){return S}),e.d(t,"B",function(){return Hn}),e.d(t,"G",function(){return ct}),e.d(t,"H",function(){return at}),e.d(t,"I",function(){return ut}),e.d(t,"i",function(){return vn}),e.d(t,"j",function(){return Tn}),e.d(t,"l",function(){return dt}),e.d(t,"x",function(){return An}),e.d(t,"z",function(){return Dn}),e.d(t,"y",function(){return ht}),e.d(t,"M",function(){return mt}),e.d(t,"N",function(){return ft}),e.d(t,"O",function(){return yt}),e.d(t,"R",function(){return bt}),e.d(t,"m",function(){return wt}),e.d(t,"h",function(){return vt}),e.d(t,"u",function(){return zt}),e.d(t,"v",function(){return Ut}),e.d(t,"T",function(){return Pt}),e.d(t,"Z",function(){return Qt}),e.d(t,"_13",function(){return At}),e.d(t,"_2",function(){return yn}),e.d(t,"_1",function(){return Ln}),e.d(t,"_10",function(){return L}),e.d(t,"_16",function(){return E}),e.d(t,"_30",function(){return Y}),e.d(t,"_14",function(){return un}),e.d(t,"_15",function(){return an}),e.d(t,"_3",function(){return Qe}),e.d(t,"_4",function(){return Ke}),e.d(t,"_5",function(){return _l}),e.d(t,"_6",function(){return wi}),e.d(t,"_7",function(){return ve}),e.d(t,"_8",function(){return Hl}),e.d(t,"_9",function(){return Xe}),e.d(t,"_12",function(){return qe}),e.d(t,"_18",function(){return ol}),e.d(t,"_19",function(){return il}),e.d(t,"_21",function(){return or}),e.d(t,"_22",function(){return Sl}),e.d(t,"_25",function(){return Nl}),e.d(t,"_28",function(){return Fl}),e.d(t,"_24",function(){return ur}),e.d(t,"_26",function(){return cr}),e.d(t,"_27",function(){return ar}),e.d(t,"_29",function(){return tr}),e.d(t,"_31",function(){return hr}),e.d(t,"_32",function(){return ge}),e.d(t,"_33",function(){return _r}),e.d(t,"_17",function(){return Xt}),e.d(t,"_20",function(){return Zt}),e.d(t,"_23",function(){return $t}),e.d(t,"_11",function(){return pn});var l=e("TToO"),r=e("YaPU"),i=e("/nXB"),o=e("Rf9G"),s=e("g5jc"),a=function(){function n(n){this._desc=n,this.ngMetadataName="InjectionToken"}return n.prototype.toString=function(){return"InjectionToken "+this._desc},n}(),u="__annotations__",c="__paramaters__",d="__prop__metadata__";function h(n,t,e,l){var r=p(t);function i(n){if(this instanceof i)return r.call(this,n),this;var t=new i(n),e=function(n){return(n.hasOwnProperty(u)?n[u]:Object.defineProperty(n,u,{value:[]})[u]).push(t),n};return l&&l(e),e}return e&&(i.prototype=Object.create(e.prototype)),i.prototype.ngMetadataName=n,i.annotationCls=i,i}function p(n){return function(){for(var t=[],e=0;e ");else if("object"==typeof t){var r=[];for(var i in t)if(t.hasOwnProperty(i)){var o=t[i];r.push(i+":"+("string"==typeof o?JSON.stringify(o):Y(o)))}l="{"+r.join(", ")+"}"}return"StaticInjectorError"+(e?"("+e+")":"")+"["+l+"]: "+n.replace(J,"\n ")}function $(n,t){return new Error(Z(n,t))}var nn="ngDebugContext",tn="ngOriginalError",en="ngErrorLogger";function ln(n){return n[nn]}function rn(n){return n[tn]}function on(n){for(var t=[],e=1;e0)n._bootstrapComponents.forEach(function(n){return t.bootstrap(n)});else{if(!n.instance.ngDoBootstrap)throw new Error("The module "+Y(n.instance.constructor)+' was bootstrapped, but it does not declare "@NgModule.bootstrap" components nor a "ngDoBootstrap" method. Please define one of these.');n.instance.ngDoBootstrap(t)}this._modules.push(n)},n.prototype.onDestroy=function(n){this._destroyListeners.push(n)},Object.defineProperty(n.prototype,"injector",{get:function(){return this._injector},enumerable:!0,configurable:!0}),n.prototype.destroy=function(){if(this._destroyed)throw new Error("The platform has already been destroyed!");this._modules.slice().forEach(function(n){return n.destroy()}),this._destroyListeners.forEach(function(n){return n()}),this._destroyed=!0},Object.defineProperty(n.prototype,"destroyed",{get:function(){return this._destroyed},enumerable:!0,configurable:!0}),n}();function it(n,t){return Array.isArray(t)?t.reduce(it,n):Object(l.__assign)({},n,t)}var ot=function(){function n(n,t,e,l,s,a){var u=this;this._zone=n,this._console=t,this._injector=e,this._exceptionHandler=l,this._componentFactoryResolver=s,this._initStatus=a,this._bootstrapListeners=[],this._views=[],this._runningTick=!1,this._enforceNoNewChanges=!1,this._stable=!0,this.componentTypes=[],this.components=[],this._enforceNoNewChanges=nt(),this._zone.onMicrotaskEmpty.subscribe({next:function(){u._zone.run(function(){u.tick()})}});var c=new r.a(function(n){u._stable=u._zone.isStable&&!u._zone.hasPendingMacrotasks&&!u._zone.hasPendingMicrotasks,u._zone.runOutsideAngular(function(){n.next(u._stable),n.complete()})}),d=new r.a(function(n){var t;u._zone.runOutsideAngular(function(){t=u._zone.onStable.subscribe(function(){Hn.assertNotInAngularZone(),A(function(){u._stable||u._zone.hasPendingMacrotasks||u._zone.hasPendingMicrotasks||(u._stable=!0,n.next(!0))})})});var e=u._zone.onUnstable.subscribe(function(){Hn.assertInAngularZone(),u._stable&&(u._stable=!1,u._zone.runOutsideAngular(function(){n.next(!1)}))});return function(){t.unsubscribe(),e.unsubscribe()}});this.isStable=Object(i.a)(c,o.a.call(d))}return n.prototype.bootstrap=function(n,t){var e,l=this;if(!this._initStatus.done)throw new Error("Cannot bootstrap as there are still asynchronous initializers running. Bootstrap components in the `ngDoBootstrap` method of the root module.");e=n instanceof xn?n:this._componentFactoryResolver.resolveComponentFactory(n),this.componentTypes.push(e.componentType);var r=e instanceof Pn?null:this._injector.get(Dn),i=e.create(F.NULL,[],t||e.selector,r);i.onDestroy(function(){l._unloadComponent(i)});var o=i.injector.get(Un,null);return o&&i.injector.get(Gn).registerApplication(i.location.nativeElement,o),this._loadComponent(i),nt()&&this._console.log("Angular is running in the development mode. Call enableProdMode() to enable the production mode."),i},n.prototype.tick=function(){var t=this;if(this._runningTick)throw new Error("ApplicationRef.tick is called recursively");var e=n._tickScope();try{this._runningTick=!0,this._views.forEach(function(n){return n.detectChanges()}),this._enforceNoNewChanges&&this._views.forEach(function(n){return n.checkNoChanges()})}catch(n){this._zone.runOutsideAngular(function(){return t._exceptionHandler.handleError(n)})}finally{this._runningTick=!1,In(e)}},n.prototype.attachView=function(n){var t=n;this._views.push(t),t.attachToAppRef(this)},n.prototype.detachView=function(n){var t=n;st(this._views,t),t.detachFromAppRef()},n.prototype._loadComponent=function(n){this.attachView(n.hostView),this.tick(),this.components.push(n),this._injector.get(gn,[]).concat(this._bootstrapListeners).forEach(function(t){return t(n)})},n.prototype._unloadComponent=function(n){this.detachView(n.hostView),st(this.components,n)},n.prototype.ngOnDestroy=function(){this._views.slice().forEach(function(n){return n.destroy()})},Object.defineProperty(n.prototype,"viewCount",{get:function(){return this._views.length},enumerable:!0,configurable:!0}),n._tickScope=jn("ApplicationRef#tick()"),n}();function st(n,t){var e=n.indexOf(t);e>-1&&n.splice(e,1)}var at=function(){},ut=function(){var n={Important:1,DashCase:2};return n[n.Important]="Important",n[n.DashCase]="DashCase",n}(),ct=function(){},dt=function(n){this.nativeElement=n},ht=function(){},pt=function(){function n(){this.dirty=!0,this._results=[],this.changes=new Rn}return n.prototype.map=function(n){return this._results.map(n)},n.prototype.filter=function(n){return this._results.filter(n)},n.prototype.find=function(n){return this._results.find(n)},n.prototype.reduce=function(n,t){return this._results.reduce(n,t)},n.prototype.forEach=function(n){this._results.forEach(n)},n.prototype.some=function(n){return this._results.some(n)},n.prototype.toArray=function(){return this._results.slice()},n.prototype[D()]=function(){return this._results[D()]()},n.prototype.toString=function(){return this._results.toString()},n.prototype.reset=function(n){this._results=function n(t){return t.reduce(function(t,e){var l=Array.isArray(e)?n(e):e;return t.concat(l)},[])}(n),this.dirty=!1,this.length=this._results.length,this.last=this._results[this.length-1],this.first=this._results[0]},n.prototype.notifyOnChanges=function(){this.changes.emit(this)},n.prototype.setDirty=function(){this.dirty=!0},n.prototype.destroy=function(){this.changes.complete(),this.changes.unsubscribe()},n}(),ft=function(){},_t={factoryPathPrefix:"",factoryPathSuffix:".ngfactory"},mt=function(){function n(n,t){this._compiler=n,this._config=t||_t}return n.prototype.load=function(n){return this._compiler instanceof vn?this.loadFactory(n):this.loadAndCompile(n)},n.prototype.loadAndCompile=function(n){var t=this,l=n.split("#"),r=l[0],i=l[1];return void 0===i&&(i="default"),e("Jnfr")(r).then(function(n){return n[i]}).then(function(n){return gt(n,r,i)}).then(function(n){return t._compiler.compileModuleAsync(n)})},n.prototype.loadFactory=function(n){var t=n.split("#"),l=t[0],r=t[1],i="NgFactory";return void 0===r&&(r="default",i=""),e("Jnfr")(this._config.factoryPathPrefix+l+this._config.factoryPathSuffix).then(function(n){return n[r+i]}).then(function(n){return gt(n,l,r)})},n}();function gt(n,t,e){if(!n)throw new Error("Cannot find '"+e+"' in '"+t+"'");return n}var yt=function(){},bt=function(){},vt=function(){},wt=function(n){function t(){return null!==n&&n.apply(this,arguments)||this}return Object(l.__extends)(t,n),t}(function(n){function t(){return null!==n&&n.apply(this,arguments)||this}return Object(l.__extends)(t,n),t}(vt)),xt=function(){function n(n,t,e){this._debugContext=e,this.nativeNode=n,t&&t instanceof Mt?t.addChild(this):this.parent=null,this.listeners=[]}return Object.defineProperty(n.prototype,"injector",{get:function(){return this._debugContext.injector},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"componentInstance",{get:function(){return this._debugContext.component},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"context",{get:function(){return this._debugContext.context},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"references",{get:function(){return this._debugContext.references},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"providerTokens",{get:function(){return this._debugContext.providerTokens},enumerable:!0,configurable:!0}),n}(),Mt=function(n){function t(t,e,l){var r=n.call(this,t,e,l)||this;return r.properties={},r.attributes={},r.classes={},r.styles={},r.childNodes=[],r.nativeElement=t,r}return Object(l.__extends)(t,n),t.prototype.addChild=function(n){n&&(this.childNodes.push(n),n.parent=this)},t.prototype.removeChild=function(n){var t=this.childNodes.indexOf(n);-1!==t&&(n.parent=null,this.childNodes.splice(t,1))},t.prototype.insertChildrenAfter=function(n,t){var e,l=this,r=this.childNodes.indexOf(n);-1!==r&&((e=this.childNodes).splice.apply(e,[r+1,0].concat(t)),t.forEach(function(n){n.parent&&n.parent.removeChild(n),n.parent=l}))},t.prototype.insertBefore=function(n,t){var e=this.childNodes.indexOf(n);-1===e?this.addChild(t):(t.parent&&t.parent.removeChild(t),t.parent=this,this.childNodes.splice(e,0,t))},t.prototype.query=function(n){return this.queryAll(n)[0]||null},t.prototype.queryAll=function(n){var t=[];return kt(this,n,t),t},t.prototype.queryAllNodes=function(n){var t=[];return Ct(this,n,t),t},Object.defineProperty(t.prototype,"children",{get:function(){return this.childNodes.filter(function(n){return n instanceof t})},enumerable:!0,configurable:!0}),t.prototype.triggerEventHandler=function(n,t){this.listeners.forEach(function(e){e.name==n&&e.callback(t)})},t}(xt);function kt(n,t,e){n.childNodes.forEach(function(n){n instanceof Mt&&(t(n)&&e.push(n),kt(n,t,e))})}function Ct(n,t,e){n instanceof Mt&&n.childNodes.forEach(function(n){t(n)&&e.push(n),n instanceof Mt&&Ct(n,t,e)})}var St=new Map;function Ot(n){return St.get(n)||null}function Tt(n){St.set(n.nativeNode,n)}function Lt(n,t){var e=At(n),l=At(t);return e&&l?function(n,t,e){for(var l=n[D()](),r=t[D()]();;){var i=l.next(),o=r.next();if(i.done&&o.done)return!0;if(i.done||o.done)return!1;if(!e(i.value,o.value))return!1}}(n,t,Lt):!(e||!n||"object"!=typeof n&&"function"!=typeof n||l||!t||"object"!=typeof t&&"function"!=typeof t)||E(n,t)}var Pt=function(){function n(n){this.wrapped=n}return n.wrap=function(t){return new n(t)},n}(),Dt=function(){function n(n,t,e){this.previousValue=n,this.currentValue=t,this.firstChange=e}return n.prototype.isFirstChange=function(){return this.firstChange},n}();function At(n){return!!Et(n)&&(Array.isArray(n)||!(n instanceof Map)&&D()in n)}function Et(n){return null!==n&&("function"==typeof n||"object"==typeof n)}var Yt=function(){function n(){}return n.prototype.supports=function(n){return At(n)},n.prototype.create=function(n){return new It(n)},n}(),jt=function(n,t){return t},It=function(){function n(n){this.length=0,this._linkedRecords=null,this._unlinkedRecords=null,this._previousItHead=null,this._itHead=null,this._itTail=null,this._additionsHead=null,this._additionsTail=null,this._movesHead=null,this._movesTail=null,this._removalsHead=null,this._removalsTail=null,this._identityChangesHead=null,this._identityChangesTail=null,this._trackByFn=n||jt}return n.prototype.forEachItem=function(n){var t;for(t=this._itHead;null!==t;t=t._next)n(t)},n.prototype.forEachOperation=function(n){for(var t=this._itHead,e=this._removalsHead,l=0,r=null;t||e;){var i=!e||t&&t.currentIndex=e.length)&&(t=e.length-1),t<0)return null;var l=e[t];return l.viewContainerParent=null,pl(e,t),ce.dirtyParentQueries(l),dl(l),l}function cl(n,t,e){var l=t?Pe(t,t.def.lastRenderRootNode):n.renderElement;Ne(e,2,e.renderer.parentNode(l),e.renderer.nextSibling(l),void 0)}function dl(n){Ne(n,3,null,null,void 0)}function hl(n,t,e){t>=n.length?n.push(e):n.splice(t,0,e)}function pl(n,t){t>=n.length-1?n.pop():n.splice(t,1)}var fl=new Object;function _l(n,t,e,l,r,i){return new ml(n,t,e,l,r,i)}var ml=function(n){function t(t,e,l,r,i,o){var s=n.call(this)||this;return s.selector=t,s.componentType=e,s._inputs=r,s._outputs=i,s.ngContentSelectors=o,s.viewDefFactory=l,s}return Object(l.__extends)(t,n),Object.defineProperty(t.prototype,"inputs",{get:function(){var n=[],t=this._inputs;for(var e in t)n.push({propName:e,templateName:t[e]});return n},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"outputs",{get:function(){var n=[];for(var t in this._outputs)n.push({propName:t,templateName:this._outputs[t]});return n},enumerable:!0,configurable:!0}),t.prototype.create=function(n,t,e,l){if(!l)throw new Error("ngModule should be provided");var r=He(this.viewDefFactory),i=r.nodes[0].element.componentProvider.nodeIndex,o=ce.createRootView(n,t||[],e,r,l,fl),s=se(o,i).instance;return e&&o.renderer.setAttribute(oe(o,0).renderElement,"ng-version",w.full),new gl(o,new wl(o),s)},t}(xn),gl=function(n){function t(t,e,l){var r=n.call(this)||this;return r._view=t,r._viewRef=e,r._component=l,r._elDef=r._view.def.nodes[0],r.hostView=e,r.changeDetectorRef=e,r.instance=l,r}return Object(l.__extends)(t,n),Object.defineProperty(t.prototype,"location",{get:function(){return new dt(oe(this._view,this._elDef.nodeIndex).renderElement)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"injector",{get:function(){return new Cl(this._view,this._elDef)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"componentType",{get:function(){return this._component.constructor},enumerable:!0,configurable:!0}),t.prototype.destroy=function(){this._viewRef.destroy()},t.prototype.onDestroy=function(n){this._viewRef.onDestroy(n)},t}(function(){});function yl(n,t,e){return new bl(n,t,e)}var bl=function(){function n(n,t,e){this._view=n,this._elDef=t,this._data=e,this._embeddedViews=[]}return Object.defineProperty(n.prototype,"element",{get:function(){return new dt(this._data.renderElement)},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"injector",{get:function(){return new Cl(this._view,this._elDef)},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"parentInjector",{get:function(){for(var n=this._view,t=this._elDef.parent;!t&&n;)t=Le(n),n=n.parent;return n?new Cl(n,t):new Cl(this._view,null)},enumerable:!0,configurable:!0}),n.prototype.clear=function(){for(var n=this._embeddedViews.length-1;n>=0;n--){var t=ul(this._data,n);ce.destroyView(t)}},n.prototype.get=function(n){var t=this._embeddedViews[n];if(t){var e=new wl(t);return e.attachToViewContainerRef(this),e}return null},Object.defineProperty(n.prototype,"length",{get:function(){return this._embeddedViews.length},enumerable:!0,configurable:!0}),n.prototype.createEmbeddedView=function(n,t,e){var l=n.createEmbeddedView(t||{});return this.insert(l,e),l},n.prototype.createComponent=function(n,t,e,l,r){var i=e||this.parentInjector;r||n instanceof Pn||(r=i.get(Dn));var o=n.create(i,l,void 0,r);return this.insert(o.hostView,t),o},n.prototype.insert=function(n,t){if(n.destroyed)throw new Error("Cannot insert a destroyed View in a ViewContainer!");var e,l,r,i,o=n;return r=o._view,i=(e=this._data).viewContainer._embeddedViews,null!==(l=t)&&void 0!==l||(l=i.length),r.viewContainerParent=this._view,hl(i,l,r),function(n,t){var e=Te(t);if(e&&e!==n&&!(16&t.state)){t.state|=16;var l=e.template._projectedViews;l||(l=e.template._projectedViews=[]),l.push(t),function(n,e){if(!(4&e.flags)){t.parent.def.nodeFlags|=4,e.flags|=4;for(var l=e.parent;l;)l.childFlags|=4,l=l.parent}}(0,t.parentNodeDef)}}(e,r),ce.dirtyParentQueries(r),cl(e,l>0?i[l-1]:null,r),o.attachToViewContainerRef(this),n},n.prototype.move=function(n,t){if(n.destroyed)throw new Error("Cannot move a destroyed View in a ViewContainer!");var e,l,r,i,o,s=this._embeddedViews.indexOf(n._view);return r=t,o=(i=(e=this._data).viewContainer._embeddedViews)[l=s],pl(i,l),null==r&&(r=i.length),hl(i,r,o),ce.dirtyParentQueries(o),dl(o),cl(e,r>0?i[r-1]:null,o),n},n.prototype.indexOf=function(n){return this._embeddedViews.indexOf(n._view)},n.prototype.remove=function(n){var t=ul(this._data,n);t&&ce.destroyView(t)},n.prototype.detach=function(n){var t=ul(this._data,n);return t?new wl(t):null},n}();function vl(n){return new wl(n)}var wl=function(){function n(n){this._view=n,this._viewContainerRef=null,this._appRef=null}return Object.defineProperty(n.prototype,"rootNodes",{get:function(){return Ne(this._view,0,void 0,void 0,n=[]),n;var n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"context",{get:function(){return this._view.context},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"destroyed",{get:function(){return 0!=(128&this._view.state)},enumerable:!0,configurable:!0}),n.prototype.markForCheck=function(){Ce(this._view)},n.prototype.detach=function(){this._view.state&=-5},n.prototype.detectChanges=function(){var n=this._view.root.rendererFactory;n.begin&&n.begin();try{ce.checkAndUpdateView(this._view)}finally{n.end&&n.end()}},n.prototype.checkNoChanges=function(){ce.checkNoChangesView(this._view)},n.prototype.reattach=function(){this._view.state|=4},n.prototype.onDestroy=function(n){this._view.disposables||(this._view.disposables=[]),this._view.disposables.push(n)},n.prototype.destroy=function(){this._appRef?this._appRef.detachView(this):this._viewContainerRef&&this._viewContainerRef.detach(this._viewContainerRef.indexOf(this)),ce.destroyView(this._view)},n.prototype.detachFromAppRef=function(){this._appRef=null,dl(this._view),ce.dirtyParentQueries(this._view)},n.prototype.attachToAppRef=function(n){if(this._viewContainerRef)throw new Error("This view is already attached to a ViewContainer!");this._appRef=n},n.prototype.attachToViewContainerRef=function(n){if(this._appRef)throw new Error("This view is already attached directly to the ApplicationRef!");this._viewContainerRef=n},n}();function xl(n,t){return new Ml(n,t)}var Ml=function(n){function t(t,e){var l=n.call(this)||this;return l._parentView=t,l._def=e,l}return Object(l.__extends)(t,n),t.prototype.createEmbeddedView=function(n){return new wl(ce.createEmbeddedView(this._parentView,this._def,this._def.element.template,n))},Object.defineProperty(t.prototype,"elementRef",{get:function(){return new dt(oe(this._parentView,this._def.nodeIndex).renderElement)},enumerable:!0,configurable:!0}),t}(yt);function kl(n,t){return new Cl(n,t)}var Cl=function(){function n(n,t){this.view=n,this.elDef=t}return n.prototype.get=function(n,t){return void 0===t&&(t=F.THROW_IF_NOT_FOUND),ce.resolveDep(this.view,this.elDef,!!this.elDef&&0!=(33554432&this.elDef.flags),{flags:0,token:n,tokenKey:me(n)},t)},n}();function Sl(n,t){var e=n.def.nodes[t];if(1&e.flags){var l=oe(n,e.nodeIndex);return e.element.template?l.template:l.renderElement}if(2&e.flags)return ie(n,e.nodeIndex).renderText;if(20240&e.flags)return se(n,e.nodeIndex).instance;throw new Error("Illegal state: read nodeValue for node index "+t)}function Ol(n){return new Tl(n.renderer)}var Tl=function(){function n(n){this.delegate=n}return n.prototype.selectRootElement=function(n){return this.delegate.selectRootElement(n)},n.prototype.createElement=function(n,t){var e=Ue(t),l=this.delegate.createElement(e[1],e[0]);return n&&this.delegate.appendChild(n,l),l},n.prototype.createViewRoot=function(n){return n},n.prototype.createTemplateAnchor=function(n){var t=this.delegate.createComment("");return n&&this.delegate.appendChild(n,t),t},n.prototype.createText=function(n,t){var e=this.delegate.createText(t);return n&&this.delegate.appendChild(n,e),e},n.prototype.projectNodes=function(n,t){for(var e=0;e0,t.provider.value,t.provider.deps);if(t.outputs.length)for(var l=0;l0,l=t.provider;switch(201347067&t.flags){case 512:return ql(n,t.parent,e,l.value,l.deps);case 1024:return function(n,t,e,l,r){var i=r.length;switch(i){case 0:return l();case 1:return l(Ql(n,t,e,r[0]));case 2:return l(Ql(n,t,e,r[0]),Ql(n,t,e,r[1]));case 3:return l(Ql(n,t,e,r[0]),Ql(n,t,e,r[1]),Ql(n,t,e,r[2]));default:for(var o=Array(i),s=0;s0)u=_,mr(_)||(c=_);else for(;u&&f===u.nodeIndex+u.childCount;){var y=u.parent;y&&(y.childFlags|=u.childFlags,y.childMatchedQueries|=u.childMatchedQueries),c=(u=y)&&mr(u)?u.renderParent:u}}return{factory:null,nodeFlags:o,rootNodeFlags:s,nodeMatchedQueries:a,flags:n,nodes:t,updateDirectives:e||fe,updateRenderer:l||fe,handleEvent:function(n,e,l,r){return t[e].element.handleEvent(n,l,r)},bindingCount:r,outputCount:i,lastRenderRootNode:p}}function mr(n){return 0!=(1&n.flags)&&null===n.element.name}function gr(n,t,e){var l=t.element&&t.element.template;if(l){if(!l.lastRenderRootNode)throw new Error("Illegal State: Embedded templates without nodes are not allowed!");if(l.lastRenderRootNode&&16777216&l.lastRenderRootNode.flags)throw new Error("Illegal State: Last root node of a template can't have embedded views, at index "+t.nodeIndex+"!")}if(20224&t.flags&&0==(1&(n?n.flags:0)))throw new Error("Illegal State: StaticProvider/Directive nodes need to be children of elements or anchors, at index "+t.nodeIndex+"!");if(t.query){if(67108864&t.flags&&(!n||0==(16384&n.flags)))throw new Error("Illegal State: Content Query nodes need to be children of directives, at index "+t.nodeIndex+"!");if(134217728&t.flags&&n)throw new Error("Illegal State: View Query nodes have to be top level nodes, at index "+t.nodeIndex+"!")}if(t.childCount){var r=n?n.nodeIndex+n.childCount:e-1;if(t.nodeIndex<=r&&t.nodeIndex+t.childCount>r)throw new Error("Illegal State: childCount of node leads outside of parent, at index "+t.nodeIndex+"!")}}function yr(n,t,e,l){var r=wr(n.root,n.renderer,n,t,e);return xr(r,n.component,l),Mr(r),r}function br(n,t,e){var l=wr(n,n.renderer,null,null,t);return xr(l,e,e),Mr(l),l}function vr(n,t,e,l){var r,i=t.element.componentRendererType;return r=i?n.root.rendererFactory.createRenderer(l,i):n.root.renderer,wr(n.root,r,n,t.element.componentProvider,e)}function wr(n,t,e,l,r){var i=new Array(r.nodes.length),o=r.outputCount?new Array(r.outputCount):null;return{def:r,parent:e,viewContainerParent:null,parentNodeDef:l,context:null,component:null,nodes:i,state:13,root:n,renderer:t,oldValues:new Array(r.bindingCount),disposables:o,initIndex:-1}}function xr(n,t,e){n.component=t,n.context=e}function Mr(n){var t;De(n)&&(t=oe(n.parent,n.parentNodeDef.parent.nodeIndex).renderElement);for(var e=n.def,l=n.nodes,r=0;r0&&tl(n,t,0,e)&&(p=!0),h>1&&tl(n,t,1,l)&&(p=!0),h>2&&tl(n,t,2,r)&&(p=!0),h>3&&tl(n,t,3,i)&&(p=!0),h>4&&tl(n,t,4,o)&&(p=!0),h>5&&tl(n,t,5,s)&&(p=!0),h>6&&tl(n,t,6,a)&&(p=!0),h>7&&tl(n,t,7,u)&&(p=!0),h>8&&tl(n,t,8,c)&&(p=!0),h>9&&tl(n,t,9,d)&&(p=!0),p}(n,t,e,l,r,i,o,s,a,u,c,d);case 2:return function(n,t,e,l,r,i,o,s,a,u,c,d){var h=!1,p=t.bindings,f=p.length;if(f>0&&Me(n,t,0,e)&&(h=!0),f>1&&Me(n,t,1,l)&&(h=!0),f>2&&Me(n,t,2,r)&&(h=!0),f>3&&Me(n,t,3,i)&&(h=!0),f>4&&Me(n,t,4,o)&&(h=!0),f>5&&Me(n,t,5,s)&&(h=!0),f>6&&Me(n,t,6,a)&&(h=!0),f>7&&Me(n,t,7,u)&&(h=!0),f>8&&Me(n,t,8,c)&&(h=!0),f>9&&Me(n,t,9,d)&&(h=!0),h){var _=t.text.prefix;f>0&&(_+=fr(e,p[0])),f>1&&(_+=fr(l,p[1])),f>2&&(_+=fr(r,p[2])),f>3&&(_+=fr(i,p[3])),f>4&&(_+=fr(o,p[4])),f>5&&(_+=fr(s,p[5])),f>6&&(_+=fr(a,p[6])),f>7&&(_+=fr(u,p[7])),f>8&&(_+=fr(c,p[8])),f>9&&(_+=fr(d,p[9]));var m=ie(n,t.nodeIndex).renderText;n.renderer.setValue(m,_)}return h}(n,t,e,l,r,i,o,s,a,u,c,d);case 16384:return function(n,t,e,l,r,i,o,s,a,u,c,d){var h=se(n,t.nodeIndex),p=h.instance,f=!1,_=void 0,m=t.bindings.length;return m>0&&xe(n,t,0,e)&&(f=!0,_=Xl(n,h,t,0,e,_)),m>1&&xe(n,t,1,l)&&(f=!0,_=Xl(n,h,t,1,l,_)),m>2&&xe(n,t,2,r)&&(f=!0,_=Xl(n,h,t,2,r,_)),m>3&&xe(n,t,3,i)&&(f=!0,_=Xl(n,h,t,3,i,_)),m>4&&xe(n,t,4,o)&&(f=!0,_=Xl(n,h,t,4,o,_)),m>5&&xe(n,t,5,s)&&(f=!0,_=Xl(n,h,t,5,s,_)),m>6&&xe(n,t,6,a)&&(f=!0,_=Xl(n,h,t,6,a,_)),m>7&&xe(n,t,7,u)&&(f=!0,_=Xl(n,h,t,7,u,_)),m>8&&xe(n,t,8,c)&&(f=!0,_=Xl(n,h,t,8,c,_)),m>9&&xe(n,t,9,d)&&(f=!0,_=Xl(n,h,t,9,d,_)),_&&p.ngOnChanges(_),65536&t.flags&&re(n,256,t.nodeIndex)&&p.ngOnInit(),262144&t.flags&&p.ngDoCheck(),f}(n,t,e,l,r,i,o,s,a,u,c,d);case 32:case 64:case 128:return function(n,t,e,l,r,i,o,s,a,u,c,d){var h=t.bindings,p=!1,f=h.length;if(f>0&&Me(n,t,0,e)&&(p=!0),f>1&&Me(n,t,1,l)&&(p=!0),f>2&&Me(n,t,2,r)&&(p=!0),f>3&&Me(n,t,3,i)&&(p=!0),f>4&&Me(n,t,4,o)&&(p=!0),f>5&&Me(n,t,5,s)&&(p=!0),f>6&&Me(n,t,6,a)&&(p=!0),f>7&&Me(n,t,7,u)&&(p=!0),f>8&&Me(n,t,8,c)&&(p=!0),f>9&&Me(n,t,9,d)&&(p=!0),p){var _=ae(n,t.nodeIndex),m=void 0;switch(201347067&t.flags){case 32:m=new Array(h.length),f>0&&(m[0]=e),f>1&&(m[1]=l),f>2&&(m[2]=r),f>3&&(m[3]=i),f>4&&(m[4]=o),f>5&&(m[5]=s),f>6&&(m[6]=a),f>7&&(m[7]=u),f>8&&(m[8]=c),f>9&&(m[9]=d);break;case 64:m={},f>0&&(m[h[0].name]=e),f>1&&(m[h[1].name]=l),f>2&&(m[h[2].name]=r),f>3&&(m[h[3].name]=i),f>4&&(m[h[4].name]=o),f>5&&(m[h[5].name]=s),f>6&&(m[h[6].name]=a),f>7&&(m[h[7].name]=u),f>8&&(m[h[8].name]=c),f>9&&(m[h[9].name]=d);break;case 128:var g=e;switch(f){case 1:m=g.transform(e);break;case 2:m=g.transform(l);break;case 3:m=g.transform(l,r);break;case 4:m=g.transform(l,r,i);break;case 5:m=g.transform(l,r,i,o);break;case 6:m=g.transform(l,r,i,o,s);break;case 7:m=g.transform(l,r,i,o,s,a);break;case 8:m=g.transform(l,r,i,o,s,a,u);break;case 9:m=g.transform(l,r,i,o,s,a,u,c);break;case 10:m=g.transform(l,r,i,o,s,a,u,c,d)}}_.value=m}return p}(n,t,e,l,r,i,o,s,a,u,c,d);default:throw"unreachable"}}(n,t,l,r,i,o,s,a,u,c,d,h):function(n,t,e){switch(201347067&t.flags){case 1:return function(n,t,e){for(var l=!1,r=0;r0&&ke(n,t,0,e),h>1&&ke(n,t,1,l),h>2&&ke(n,t,2,r),h>3&&ke(n,t,3,i),h>4&&ke(n,t,4,o),h>5&&ke(n,t,5,s),h>6&&ke(n,t,6,a),h>7&&ke(n,t,7,u),h>8&&ke(n,t,8,c),h>9&&ke(n,t,9,d)}(n,t,l,r,i,o,s,a,u,c,d,h):function(n,t,e){for(var l=0;l=0;s--)(r=n[s])&&(o=(i<3?r(o):i>3?r(t,e,o):r(t,e))||o);return i>3&&o&&Object.defineProperty(t,e,o),o},f=function(){},_=function(n){function t(){return null!==n&&n.apply(this,arguments)||this}return h(t,n),t.prototype.getTranslation=function(n){return Object(r.a)({})},t}(f);_=p([Object(l.q)()],_);var m=function(n){return n&&"function"==typeof n.schedule},g="undefined"!=typeof window?window:"undefined"!=typeof n?n:"undefined"!=typeof self?self:{};function y(n,t){return n(t={exports:{}},t.exports),t.exports}var b="undefined"!=typeof window&&window,v="undefined"!=typeof self&&"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&self,w=b||"undefined"!=typeof g&&g||v,x=w;!function(){if(!w)throw new Error("RxJS could not find any global context (window, self, global)")}();var M,k={root:x},C={isFunction:function(n){return"function"==typeof n}},S={isArray:Array.isArray||function(n){return n&&"number"==typeof n.length}},O=function(n){return null!=n&&"object"==typeof n},T={errorObject:{e:{}}};function L(){try{return M.apply(this,arguments)}catch(n){return T.errorObject.e=n,T.errorObject}}var P=function(n){return M=n,L},D=g&&g.__extends||function(n,t){for(var e in t)t.hasOwnProperty(e)&&(n[e]=t[e]);function l(){this.constructor=n}n.prototype=null===t?Object.create(t):(l.prototype=t.prototype,new l)},A={UnsubscriptionError:function(n){function t(t){n.call(this),this.errors=t;var e=Error.call(this,t?t.length+" errors occurred during unsubscription:\n "+t.map(function(n,t){return t+1+") "+n.toString()}).join("\n "):"");this.name=e.name="UnsubscriptionError",this.stack=e.stack,this.message=e.message}return D(t,n),t}(Error)};function E(n){return n.reduce(function(n,t){return n.concat(t instanceof A.UnsubscriptionError?t.errors:t)},[])}var Y={Subscription:function(){function n(n){this.closed=!1,this._parent=null,this._parents=null,this._subscriptions=null,n&&(this._unsubscribe=n)}var t;return n.prototype.unsubscribe=function(){var n,t=!1;if(!this.closed){var e=this._parent,l=this._parents,r=this._unsubscribe,i=this._subscriptions;this.closed=!0,this._parent=null,this._parents=null,this._subscriptions=null;for(var o=-1,s=l?l.length:0;e;)e.remove(this),e=++o1?new t(n,l):1===r?new J.ScalarObservable(n[0],l):new K.EmptyObservable(l)},t.dispatch=function(n){var t=n.array,e=n.index,l=n.subscriber;e>=n.count?l.complete():(l.next(t[e]),l.closed||(n.index=e+1,this.schedule(n)))},t.prototype._subscribe=function(n){var e=this.array,l=e.length,r=this.scheduler;if(r)return r.schedule(t.dispatch,0,{array:e,index:0,count:l,subscriber:n});for(var i=0;idn?dn:r:r}()),this.arr=n,this.idx=t,this.len=e}return n.prototype[on.iterator]=function(){return this},n.prototype.next=function(){return this.idx=n.length?l.complete():(l.next(t[e]),n.index=e+1,this.schedule(n)))},t.prototype._subscribe=function(n){var e=this.arrayLike,l=this.scheduler,r=e.length;if(l)return l.schedule(t.dispatch,0,{arrayLike:e,index:0,length:r,subscriber:n});for(var i=0;i0?this._next(t.shift()):0===this.active&&this.hasCompleted&&this.destination.complete()},t}(On.OuterSubscriber),Dn=function(n){return n},An=function(n){return void 0===n&&(n=Number.POSITIVE_INFINITY),function(n,t,e){return void 0===e&&(e=Number.POSITIVE_INFINITY),function(l){return"number"==typeof t&&(e=t,t=null),l.lift(new Ln(n,t,e))}}(Dn,null,n)},En={concat:function(){for(var n=[],t=0;t=0;s--)(r=n[s])&&(o=(i<3?r(o):i>3?r(t,e,o):r(t,e))||o);return i>3&&o&&Object.defineProperty(t,e,o),o},jn=function(){},In=function(){function n(){}return n.prototype.handle=function(n){return n.key},n}();In=Yn([Object(l.q)()],In);var Rn=this&&this.__decorate||function(n,t,e,l){var r,i=arguments.length,o=i<3?t:null===l?l=Object.getOwnPropertyDescriptor(t,e):l;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(n,t,e,l);else for(var s=n.length-1;s>=0;s--)(r=n[s])&&(o=(i<3?r(o):i>3?r(t,e,o):r(t,e))||o);return i>3&&o&&Object.defineProperty(t,e,o),o},Hn=function(){},Nn=function(n){function t(){return null!==n&&n.apply(this,arguments)||this}return h(t,n),t.prototype.compile=function(n,t){return n},t.prototype.compileTranslations=function(n,t){return n},t}(Hn);function Fn(n,t){if(n===t)return!0;if(null===n||null===t)return!1;if(n!=n&&t!=t)return!0;var e,l,r,i=typeof n;if(i==typeof t&&"object"==i){if(!Array.isArray(n)){if(Array.isArray(t))return!1;for(l in r=Object.create(null),n){if(!Fn(n[l],t[l]))return!1;r[l]=!0}for(l in t)if(!(l in r)&&"undefined"!=typeof t[l])return!1;return!0}if(!Array.isArray(t))return!1;if((e=n.length)==t.length){for(l=0;l=0;s--)(r=n[s])&&(o=(i<3?r(o):i>3?r(t,e,o):r(t,e))||o);return i>3&&o&&Object.defineProperty(t,e,o),o},zn=function(){},Un=function(n){function t(){var t=n.apply(this,arguments)||this;return t.templateMatcher=/{{\s?([^{}\s]*)\s?}}/g,t}return h(t,n),t.prototype.interpolate=function(n,t){return"string"==typeof n?this.interpolateString(n,t):"function"==typeof n?this.interpolateFunction(n,t):n},t.prototype.getValue=function(n,t){var e=t.split(".");t="";do{t+=e.shift(),!Bn(n)||!Bn(n[t])||"object"!=typeof n[t]&&e.length?e.length?t+=".":n=void 0:(n=n[t],t="")}while(e.length);return n},t.prototype.interpolateFunction=function(n,t){return n(t)},t.prototype.interpolateString=function(n,t){var e=this;return t?n.replace(this.templateMatcher,function(n,l){var r=e.getValue(t,l);return Bn(r)?r:n}):n},t}(zn);Un=Wn([Object(l.q)()],Un);var Gn=function(){return function(){this.currentLang=this.defaultLang,this.translations={},this.langs=[],this.onTranslationChange=new l.o,this.onLangChange=new l.o,this.onDefaultLangChange=new l.o}}(),qn=this&&this.__decorate||function(n,t,e,l){var r,i=arguments.length,o=i<3?t:null===l?l=Object.getOwnPropertyDescriptor(t,e):l;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(n,t,e,l);else for(var s=n.length-1;s>=0;s--)(r=n[s])&&(o=(i<3?r(o):i>3?r(t,e,o):r(t,e))||o);return i>3&&o&&Object.defineProperty(t,e,o),o},Jn=e("TToO").__metadata,Qn=e("TToO").__param,Kn=new l.r("USE_STORE"),Xn=new l.r("USE_DEFAULT_LANG"),Zn=function(){function n(n,t,e,r,i,o,s){void 0===o&&(o=!0),void 0===s&&(s=!1),this.store=n,this.currentLoader=t,this.compiler=e,this.parser=r,this.missingTranslationHandler=i,this.useDefaultLang=o,this.isolate=s,this.pending=!1,this._onTranslationChange=new l.o,this._onLangChange=new l.o,this._onDefaultLangChange=new l.o,this._langs=[],this._translations={},this._translationRequests={}}return Object.defineProperty(n.prototype,"onTranslationChange",{get:function(){return this.isolate?this._onTranslationChange:this.store.onTranslationChange},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"onLangChange",{get:function(){return this.isolate?this._onLangChange:this.store.onLangChange},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"onDefaultLangChange",{get:function(){return this.isolate?this._onDefaultLangChange:this.store.onDefaultLangChange},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"defaultLang",{get:function(){return this.isolate?this._defaultLang:this.store.defaultLang},set:function(n){this.isolate?this._defaultLang=n:this.store.defaultLang=n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"currentLang",{get:function(){return this.isolate?this._currentLang:this.store.currentLang},set:function(n){this.isolate?this._currentLang=n:this.store.currentLang=n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"langs",{get:function(){return this.isolate?this._langs:this.store.langs},set:function(n){this.isolate?this._langs=n:this.store.langs=n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"translations",{get:function(){return this.isolate?this._translations:this.store.translations},set:function(n){this.isolate?this._translations=n:this.store.translations=n},enumerable:!0,configurable:!0}),n.prototype.setDefaultLang=function(n){var t=this;if(n!==this.defaultLang){var e=this.retrieveTranslations(n);"undefined"!=typeof e?(this.defaultLang||(this.defaultLang=n),e.pipe(Object(d.a)(1)).subscribe(function(e){t.changeDefaultLang(n)})):this.changeDefaultLang(n)}},n.prototype.getDefaultLang=function(){return this.defaultLang},n.prototype.use=function(n){var t=this;if(n===this.currentLang)return Object(r.a)(this.translations[n]);var e=this.retrieveTranslations(n);return"undefined"!=typeof e?(this.currentLang||(this.currentLang=n),e.pipe(Object(d.a)(1)).subscribe(function(e){t.changeLang(n)}),e):(this.changeLang(n),Object(r.a)(this.translations[n]))},n.prototype.retrieveTranslations=function(n){var t;return"undefined"==typeof this.translations[n]&&(this._translationRequests[n]=this._translationRequests[n]||this.getTranslation(n),t=this._translationRequests[n]),t},n.prototype.getTranslation=function(n){var t=this;return this.pending=!0,this.loadingTranslations=this.currentLoader.getTranslation(n).pipe(Object(o.a)()),this.loadingTranslations.pipe(Object(d.a)(1)).subscribe(function(e){t.translations[n]=t.compiler.compileTranslations(e,n),t.updateLangs(),t.pending=!1},function(n){t.pending=!1}),this.loadingTranslations},n.prototype.setTranslation=function(n,t,e){void 0===e&&(e=!1),t=this.compiler.compileTranslations(t,n),this.translations[n]=e&&this.translations[n]?function n(t,e){var l=Object.assign({},t);return Vn(t)&&Vn(e)&&Object.keys(e).forEach(function(r){var i,o;Vn(e[r])?r in t?l[r]=n(t[r],e[r]):Object.assign(l,((i={})[r]=e[r],i)):Object.assign(l,((o={})[r]=e[r],o))}),l}(this.translations[n],t):t,this.updateLangs(),this.onTranslationChange.emit({lang:n,translations:this.translations[n]})},n.prototype.getLangs=function(){return this.langs},n.prototype.addLangs=function(n){var t=this;n.forEach(function(n){-1===t.langs.indexOf(n)&&t.langs.push(n)})},n.prototype.updateLangs=function(){this.addLangs(Object.keys(this.translations))},n.prototype.getParsedResult=function(n,t,e){var l;if(t instanceof Array){for(var i={},o=!1,u=0,d=t;u=0;s--)(r=n[s])&&(o=(i<3?r(o):i>3?r(t,e,o):r(t,e))||o);return i>3&&o&&Object.defineProperty(t,e,o),o},nt=this&&this.__metadata||function(n,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(n,t)},tt=function(){function n(n,t,e){var l=this;this.translateService=n,this.element=t,this._ref=e,this.onTranslationChangeSub||(this.onTranslationChangeSub=this.translateService.onTranslationChange.subscribe(function(n){n.lang===l.translateService.currentLang&&l.checkNodes(!0,n.translations)})),this.onLangChangeSub||(this.onLangChangeSub=this.translateService.onLangChange.subscribe(function(n){l.checkNodes(!0,n.translations)})),this.onDefaultLangChangeSub||(this.onDefaultLangChangeSub=this.translateService.onDefaultLangChange.subscribe(function(n){l.checkNodes(!0)}))}return Object.defineProperty(n.prototype,"translate",{set:function(n){n&&(this.key=n,this.checkNodes())},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"translateParams",{set:function(n){Fn(this.currentParams,n)||(this.currentParams=n,this.checkNodes(!0))},enumerable:!0,configurable:!0}),n.prototype.ngAfterViewChecked=function(){this.checkNodes()},n.prototype.checkNodes=function(n,t){void 0===n&&(n=!1);var e=this.element.nativeElement.childNodes;e.length||(this.setContent(this.element.nativeElement,this.key),e=this.element.nativeElement.childNodes);for(var l=0;l=0;s--)(r=n[s])&&(o=(i<3?r(o):i>3?r(t,e,o):r(t,e))||o);return i>3&&o&&Object.defineProperty(t,e,o),o},lt=this&&this.__metadata||function(n,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(n,t)},rt=function(){function n(n,t){this.translate=n,this._ref=t,this.value=""}return n.prototype.updateValue=function(n,t,e){var l=this,r=function(t){l.value=void 0!==t?t:n,l.lastKey=n,l._ref.markForCheck()};if(e){var i=this.translate.getParsedResult(e,n,t);"function"==typeof i.subscribe?i.subscribe(r):r(i)}this.translate.get(n,t).subscribe(r)},n.prototype.transform=function(n){for(var t,e=this,l=[],r=1;r20?t=40===n||50===n||60===n||80===n||100===n?"fed":"ain":n>0&&(t=["","af","il","ydd","ydd","ed","ed","ed","fed","fed","fed","eg","fed","eg","eg","fed","eg","eg","fed","eg","fed"][n]),n+t},week:{dow:1,doy:4}})}(e("PJh5"))},ZUyn:function(n,t,e){!function(n){"use strict";n.defineLocale("zh-hk",{months:"\u4e00\u6708_\u4e8c\u6708_\u4e09\u6708_\u56db\u6708_\u4e94\u6708_\u516d\u6708_\u4e03\u6708_\u516b\u6708_\u4e5d\u6708_\u5341\u6708_\u5341\u4e00\u6708_\u5341\u4e8c\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u661f\u671f\u65e5_\u661f\u671f\u4e00_\u661f\u671f\u4e8c_\u661f\u671f\u4e09_\u661f\u671f\u56db_\u661f\u671f\u4e94_\u661f\u671f\u516d".split("_"),weekdaysShort:"\u9031\u65e5_\u9031\u4e00_\u9031\u4e8c_\u9031\u4e09_\u9031\u56db_\u9031\u4e94_\u9031\u516d".split("_"),weekdaysMin:"\u65e5_\u4e00_\u4e8c_\u4e09_\u56db_\u4e94_\u516d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm",LLLL:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm",l:"YYYY/M/D",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm"},meridiemParse:/\u51cc\u6668|\u65e9\u4e0a|\u4e0a\u5348|\u4e2d\u5348|\u4e0b\u5348|\u665a\u4e0a/,meridiemHour:function(n,t){return 12===n&&(n=0),"\u51cc\u6668"===t||"\u65e9\u4e0a"===t||"\u4e0a\u5348"===t?n:"\u4e2d\u5348"===t?n>=11?n:n+12:"\u4e0b\u5348"===t||"\u665a\u4e0a"===t?n+12:void 0},meridiem:function(n,t,e){var l=100*n+t;return l<600?"\u51cc\u6668":l<900?"\u65e9\u4e0a":l<1130?"\u4e0a\u5348":l<1230?"\u4e2d\u5348":l<1800?"\u4e0b\u5348":"\u665a\u4e0a"},calendar:{sameDay:"[\u4eca\u5929]LT",nextDay:"[\u660e\u5929]LT",nextWeek:"[\u4e0b]ddddLT",lastDay:"[\u6628\u5929]LT",lastWeek:"[\u4e0a]ddddLT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(\u65e5|\u6708|\u9031)/,ordinal:function(n,t){switch(t){case"d":case"D":case"DDD":return n+"\u65e5";case"M":return n+"\u6708";case"w":case"W":return n+"\u9031";default:return n}},relativeTime:{future:"%s\u5167",past:"%s\u524d",s:"\u5e7e\u79d2",ss:"%d \u79d2",m:"1 \u5206\u9418",mm:"%d \u5206\u9418",h:"1 \u5c0f\u6642",hh:"%d \u5c0f\u6642",d:"1 \u5929",dd:"%d \u5929",M:"1 \u500b\u6708",MM:"%d \u500b\u6708",y:"1 \u5e74",yy:"%d \u5e74"}})}(e("PJh5"))},ZoSI:function(n,t,e){!function(n){"use strict";n.defineLocale("pt",{months:"janeiro_fevereiro_mar\xe7o_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"Domingo_Segunda-feira_Ter\xe7a-feira_Quarta-feira_Quinta-feira_Sexta-feira_S\xe1bado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_S\xe1b".split("_"),weekdaysMin:"Do_2\xaa_3\xaa_4\xaa_5\xaa_6\xaa_S\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY HH:mm"},calendar:{sameDay:"[Hoje \xe0s] LT",nextDay:"[Amanh\xe3 \xe0s] LT",nextWeek:"dddd [\xe0s] LT",lastDay:"[Ontem \xe0s] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[\xdaltimo] dddd [\xe0s] LT":"[\xdaltima] dddd [\xe0s] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"h\xe1 %s",s:"segundos",ss:"%d segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um m\xeas",MM:"%d meses",y:"um ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(e("PJh5"))},aM0x:function(n,t,e){!function(n){"use strict";var t={1:"\u09e7",2:"\u09e8",3:"\u09e9",4:"\u09ea",5:"\u09eb",6:"\u09ec",7:"\u09ed",8:"\u09ee",9:"\u09ef",0:"\u09e6"},e={"\u09e7":"1","\u09e8":"2","\u09e9":"3","\u09ea":"4","\u09eb":"5","\u09ec":"6","\u09ed":"7","\u09ee":"8","\u09ef":"9","\u09e6":"0"};n.defineLocale("bn",{months:"\u099c\u09be\u09a8\u09c1\u09df\u09be\u09b0\u09c0_\u09ab\u09c7\u09ac\u09cd\u09b0\u09c1\u09df\u09be\u09b0\u09bf_\u09ae\u09be\u09b0\u09cd\u099a_\u098f\u09aa\u09cd\u09b0\u09bf\u09b2_\u09ae\u09c7_\u099c\u09c1\u09a8_\u099c\u09c1\u09b2\u09be\u0987_\u0986\u0997\u09b8\u09cd\u099f_\u09b8\u09c7\u09aa\u09cd\u099f\u09c7\u09ae\u09cd\u09ac\u09b0_\u0985\u0995\u09cd\u099f\u09cb\u09ac\u09b0_\u09a8\u09ad\u09c7\u09ae\u09cd\u09ac\u09b0_\u09a1\u09bf\u09b8\u09c7\u09ae\u09cd\u09ac\u09b0".split("_"),monthsShort:"\u099c\u09be\u09a8\u09c1_\u09ab\u09c7\u09ac_\u09ae\u09be\u09b0\u09cd\u099a_\u098f\u09aa\u09cd\u09b0_\u09ae\u09c7_\u099c\u09c1\u09a8_\u099c\u09c1\u09b2_\u0986\u0997_\u09b8\u09c7\u09aa\u09cd\u099f_\u0985\u0995\u09cd\u099f\u09cb_\u09a8\u09ad\u09c7_\u09a1\u09bf\u09b8\u09c7".split("_"),weekdays:"\u09b0\u09ac\u09bf\u09ac\u09be\u09b0_\u09b8\u09cb\u09ae\u09ac\u09be\u09b0_\u09ae\u0999\u09cd\u0997\u09b2\u09ac\u09be\u09b0_\u09ac\u09c1\u09a7\u09ac\u09be\u09b0_\u09ac\u09c3\u09b9\u09b8\u09cd\u09aa\u09a4\u09bf\u09ac\u09be\u09b0_\u09b6\u09c1\u0995\u09cd\u09b0\u09ac\u09be\u09b0_\u09b6\u09a8\u09bf\u09ac\u09be\u09b0".split("_"),weekdaysShort:"\u09b0\u09ac\u09bf_\u09b8\u09cb\u09ae_\u09ae\u0999\u09cd\u0997\u09b2_\u09ac\u09c1\u09a7_\u09ac\u09c3\u09b9\u09b8\u09cd\u09aa\u09a4\u09bf_\u09b6\u09c1\u0995\u09cd\u09b0_\u09b6\u09a8\u09bf".split("_"),weekdaysMin:"\u09b0\u09ac\u09bf_\u09b8\u09cb\u09ae_\u09ae\u0999\u09cd\u0997_\u09ac\u09c1\u09a7_\u09ac\u09c3\u09b9\u0983_\u09b6\u09c1\u0995\u09cd\u09b0_\u09b6\u09a8\u09bf".split("_"),longDateFormat:{LT:"A h:mm \u09b8\u09ae\u09df",LTS:"A h:mm:ss \u09b8\u09ae\u09df",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u09b8\u09ae\u09df",LLLL:"dddd, D MMMM YYYY, A h:mm \u09b8\u09ae\u09df"},calendar:{sameDay:"[\u0986\u099c] LT",nextDay:"[\u0986\u0997\u09be\u09ae\u09c0\u0995\u09be\u09b2] LT",nextWeek:"dddd, LT",lastDay:"[\u0997\u09a4\u0995\u09be\u09b2] LT",lastWeek:"[\u0997\u09a4] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u09aa\u09b0\u09c7",past:"%s \u0986\u0997\u09c7",s:"\u0995\u09df\u09c7\u0995 \u09b8\u09c7\u0995\u09c7\u09a8\u09cd\u09a1",ss:"%d \u09b8\u09c7\u0995\u09c7\u09a8\u09cd\u09a1",m:"\u098f\u0995 \u09ae\u09bf\u09a8\u09bf\u099f",mm:"%d \u09ae\u09bf\u09a8\u09bf\u099f",h:"\u098f\u0995 \u0998\u09a8\u09cd\u099f\u09be",hh:"%d \u0998\u09a8\u09cd\u099f\u09be",d:"\u098f\u0995 \u09a6\u09bf\u09a8",dd:"%d \u09a6\u09bf\u09a8",M:"\u098f\u0995 \u09ae\u09be\u09b8",MM:"%d \u09ae\u09be\u09b8",y:"\u098f\u0995 \u09ac\u099b\u09b0",yy:"%d \u09ac\u099b\u09b0"},preparse:function(n){return n.replace(/[\u09e7\u09e8\u09e9\u09ea\u09eb\u09ec\u09ed\u09ee\u09ef\u09e6]/g,function(n){return e[n]})},postformat:function(n){return n.replace(/\d/g,function(n){return t[n]})},meridiemParse:/\u09b0\u09be\u09a4|\u09b8\u0995\u09be\u09b2|\u09a6\u09c1\u09aa\u09c1\u09b0|\u09ac\u09bf\u0995\u09be\u09b2|\u09b0\u09be\u09a4/,meridiemHour:function(n,t){return 12===n&&(n=0),"\u09b0\u09be\u09a4"===t&&n>=4||"\u09a6\u09c1\u09aa\u09c1\u09b0"===t&&n<5||"\u09ac\u09bf\u0995\u09be\u09b2"===t?n+12:n},meridiem:function(n,t,e){return n<4?"\u09b0\u09be\u09a4":n<10?"\u09b8\u0995\u09be\u09b2":n<17?"\u09a6\u09c1\u09aa\u09c1\u09b0":n<20?"\u09ac\u09bf\u0995\u09be\u09b2":"\u09b0\u09be\u09a4"},week:{dow:0,doy:6}})}(e("PJh5"))},aqvp:function(n,t,e){!function(n){"use strict";function t(n,t,e){var l=n+" ";switch(e){case"ss":return l+(1===n?"sekunda":2===n||3===n||4===n?"sekunde":"sekundi");case"m":return t?"jedna minuta":"jedne minute";case"mm":return l+(1===n?"minuta":2===n||3===n||4===n?"minute":"minuta");case"h":return t?"jedan sat":"jednog sata";case"hh":return l+(1===n?"sat":2===n||3===n||4===n?"sata":"sati");case"dd":return l+(1===n?"dan":"dana");case"MM":return l+(1===n?"mjesec":2===n||3===n||4===n?"mjeseca":"mjeseci");case"yy":return l+(1===n?"godina":2===n||3===n||4===n?"godine":"godina")}}n.defineLocale("bs",{months:"januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_\u010detvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._\u010det._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010de_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju\u010der u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[pro\u0161lu] dddd [u] LT";case 6:return"[pro\u0161le] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[pro\u0161li] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",ss:t,m:t,mm:t,h:t,hh:t,d:"dan",dd:t,M:"mjesec",MM:t,y:"godinu",yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(e("PJh5"))},bXQP:function(n,t,e){!function(n){"use strict";n.defineLocale("fr-ca",{months:"janvier_f\xe9vrier_mars_avril_mai_juin_juillet_ao\xfbt_septembre_octobre_novembre_d\xe9cembre".split("_"),monthsShort:"janv._f\xe9vr._mars_avr._mai_juin_juil._ao\xfbt_sept._oct._nov._d\xe9c.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd\u2019hui \xe0] LT",nextDay:"[Demain \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[Hier \xe0] LT",lastWeek:"dddd [dernier \xe0] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|e)/,ordinal:function(n,t){switch(t){default:case"M":case"Q":case"D":case"DDD":case"d":return n+(1===n?"er":"e");case"w":case"W":return n+(1===n?"re":"e")}}})}(e("PJh5"))},c1x4:function(n,t,e){!function(n){"use strict";var t={words:{ss:["\u0441\u0435\u043a\u0443\u043d\u0434\u0430","\u0441\u0435\u043a\u0443\u043d\u0434\u0435","\u0441\u0435\u043a\u0443\u043d\u0434\u0438"],m:["\u0458\u0435\u0434\u0430\u043d \u043c\u0438\u043d\u0443\u0442","\u0458\u0435\u0434\u043d\u0435 \u043c\u0438\u043d\u0443\u0442\u0435"],mm:["\u043c\u0438\u043d\u0443\u0442","\u043c\u0438\u043d\u0443\u0442\u0435","\u043c\u0438\u043d\u0443\u0442\u0430"],h:["\u0458\u0435\u0434\u0430\u043d \u0441\u0430\u0442","\u0458\u0435\u0434\u043d\u043e\u0433 \u0441\u0430\u0442\u0430"],hh:["\u0441\u0430\u0442","\u0441\u0430\u0442\u0430","\u0441\u0430\u0442\u0438"],dd:["\u0434\u0430\u043d","\u0434\u0430\u043d\u0430","\u0434\u0430\u043d\u0430"],MM:["\u043c\u0435\u0441\u0435\u0446","\u043c\u0435\u0441\u0435\u0446\u0430","\u043c\u0435\u0441\u0435\u0446\u0438"],yy:["\u0433\u043e\u0434\u0438\u043d\u0430","\u0433\u043e\u0434\u0438\u043d\u0435","\u0433\u043e\u0434\u0438\u043d\u0430"]},correctGrammaticalCase:function(n,t){return 1===n?t[0]:n>=2&&n<=4?t[1]:t[2]},translate:function(n,e,l){var r=t.words[l];return 1===l.length?e?r[0]:r[1]:n+" "+t.correctGrammaticalCase(n,r)}};n.defineLocale("sr-cyrl",{months:"\u0458\u0430\u043d\u0443\u0430\u0440_\u0444\u0435\u0431\u0440\u0443\u0430\u0440_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0438\u043b_\u043c\u0430\u0458_\u0458\u0443\u043d_\u0458\u0443\u043b_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043f\u0442\u0435\u043c\u0431\u0430\u0440_\u043e\u043a\u0442\u043e\u0431\u0430\u0440_\u043d\u043e\u0432\u0435\u043c\u0431\u0430\u0440_\u0434\u0435\u0446\u0435\u043c\u0431\u0430\u0440".split("_"),monthsShort:"\u0458\u0430\u043d._\u0444\u0435\u0431._\u043c\u0430\u0440._\u0430\u043f\u0440._\u043c\u0430\u0458_\u0458\u0443\u043d_\u0458\u0443\u043b_\u0430\u0432\u0433._\u0441\u0435\u043f._\u043e\u043a\u0442._\u043d\u043e\u0432._\u0434\u0435\u0446.".split("_"),monthsParseExact:!0,weekdays:"\u043d\u0435\u0434\u0435\u0459\u0430_\u043f\u043e\u043d\u0435\u0434\u0435\u0459\u0430\u043a_\u0443\u0442\u043e\u0440\u0430\u043a_\u0441\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0440\u0442\u0430\u043a_\u043f\u0435\u0442\u0430\u043a_\u0441\u0443\u0431\u043e\u0442\u0430".split("_"),weekdaysShort:"\u043d\u0435\u0434._\u043f\u043e\u043d._\u0443\u0442\u043e._\u0441\u0440\u0435._\u0447\u0435\u0442._\u043f\u0435\u0442._\u0441\u0443\u0431.".split("_"),weekdaysMin:"\u043d\u0435_\u043f\u043e_\u0443\u0442_\u0441\u0440_\u0447\u0435_\u043f\u0435_\u0441\u0443".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[\u0434\u0430\u043d\u0430\u0441 \u0443] LT",nextDay:"[\u0441\u0443\u0442\u0440\u0430 \u0443] LT",nextWeek:function(){switch(this.day()){case 0:return"[\u0443] [\u043d\u0435\u0434\u0435\u0459\u0443] [\u0443] LT";case 3:return"[\u0443] [\u0441\u0440\u0435\u0434\u0443] [\u0443] LT";case 6:return"[\u0443] [\u0441\u0443\u0431\u043e\u0442\u0443] [\u0443] LT";case 1:case 2:case 4:case 5:return"[\u0443] dddd [\u0443] LT"}},lastDay:"[\u0458\u0443\u0447\u0435 \u0443] LT",lastWeek:function(){return["[\u043f\u0440\u043e\u0448\u043b\u0435] [\u043d\u0435\u0434\u0435\u0459\u0435] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u043f\u043e\u043d\u0435\u0434\u0435\u0459\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u0443\u0442\u043e\u0440\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u0435] [\u0441\u0440\u0435\u0434\u0435] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u0447\u0435\u0442\u0432\u0440\u0442\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u043f\u0435\u0442\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u0435] [\u0441\u0443\u0431\u043e\u0442\u0435] [\u0443] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"\u0437\u0430 %s",past:"\u043f\u0440\u0435 %s",s:"\u043d\u0435\u043a\u043e\u043b\u0438\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434\u0438",ss:t.translate,m:t.translate,mm:t.translate,h:t.translate,hh:t.translate,d:"\u0434\u0430\u043d",dd:t.translate,M:"\u043c\u0435\u0441\u0435\u0446",MM:t.translate,y:"\u0433\u043e\u0434\u0438\u043d\u0443",yy:t.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(e("PJh5"))},cQXm:function(n,t,e){"use strict";t.a=function(n){return n&&"function"!=typeof n.subscribe&&"function"==typeof n.then}},"ce/b":function(n,t,e){"use strict";t.a=function(){for(var n=[],t=0;t=100?100:null])},week:{dow:1,doy:7}})}(e("PJh5"))},etqZ:function(n,t,e){"use strict";e.d(t,"a",function(){return l});var l=function(n){var t=n.Symbol;if("function"==typeof t)return t.iterator||(t.iterator=t("iterator polyfill")),t.iterator;var e=n.Set;if(e&&"function"==typeof(new e)["@@iterator"])return"@@iterator";var l=n.Map;if(l)for(var r=Object.getOwnPropertyNames(l.prototype),i=0;i=2&&n<=4?t[1]:t[2]},translate:function(n,e,l){var r=t.words[l];return 1===l.length?e?r[0]:r[1]:n+" "+t.correctGrammaticalCase(n,r)}};n.defineLocale("sr",{months:"januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljak_utorak_sreda_\u010detvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sre._\u010det._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010de_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedelju] [u] LT";case 3:return"[u] [sredu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju\u010de u] LT",lastWeek:function(){return["[pro\u0161le] [nedelje] [u] LT","[pro\u0161log] [ponedeljka] [u] LT","[pro\u0161log] [utorka] [u] LT","[pro\u0161le] [srede] [u] LT","[pro\u0161log] [\u010detvrtka] [u] LT","[pro\u0161log] [petka] [u] LT","[pro\u0161le] [subote] [u] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"pre %s",s:"nekoliko sekundi",ss:t.translate,m:t.translate,mm:t.translate,h:t.translate,hh:t.translate,d:"dan",dd:t.translate,M:"mesec",MM:t.translate,y:"godinu",yy:t.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(e("PJh5"))},f9aG:function(n,t,e){"use strict";t.a=function(){for(var n=[],t=0;t=20?"ste":"de")},week:{dow:1,doy:4}})}(e("PJh5"))},gEQe:function(n,t,e){!function(n){"use strict";var t={1:"\u0ce7",2:"\u0ce8",3:"\u0ce9",4:"\u0cea",5:"\u0ceb",6:"\u0cec",7:"\u0ced",8:"\u0cee",9:"\u0cef",0:"\u0ce6"},e={"\u0ce7":"1","\u0ce8":"2","\u0ce9":"3","\u0cea":"4","\u0ceb":"5","\u0cec":"6","\u0ced":"7","\u0cee":"8","\u0cef":"9","\u0ce6":"0"};n.defineLocale("kn",{months:"\u0c9c\u0ca8\u0cb5\u0cb0\u0cbf_\u0cab\u0cc6\u0cac\u0ccd\u0cb0\u0cb5\u0cb0\u0cbf_\u0cae\u0cbe\u0cb0\u0ccd\u0c9a\u0ccd_\u0c8f\u0caa\u0ccd\u0cb0\u0cbf\u0cb2\u0ccd_\u0cae\u0cc6\u0cd5_\u0c9c\u0cc2\u0ca8\u0ccd_\u0c9c\u0cc1\u0cb2\u0cc6\u0cd6_\u0c86\u0c97\u0cb8\u0ccd\u0c9f\u0ccd_\u0cb8\u0cc6\u0caa\u0ccd\u0c9f\u0cc6\u0c82\u0cac\u0cb0\u0ccd_\u0c85\u0c95\u0ccd\u0c9f\u0cc6\u0cc2\u0cd5\u0cac\u0cb0\u0ccd_\u0ca8\u0cb5\u0cc6\u0c82\u0cac\u0cb0\u0ccd_\u0ca1\u0cbf\u0cb8\u0cc6\u0c82\u0cac\u0cb0\u0ccd".split("_"),monthsShort:"\u0c9c\u0ca8_\u0cab\u0cc6\u0cac\u0ccd\u0cb0_\u0cae\u0cbe\u0cb0\u0ccd\u0c9a\u0ccd_\u0c8f\u0caa\u0ccd\u0cb0\u0cbf\u0cb2\u0ccd_\u0cae\u0cc6\u0cd5_\u0c9c\u0cc2\u0ca8\u0ccd_\u0c9c\u0cc1\u0cb2\u0cc6\u0cd6_\u0c86\u0c97\u0cb8\u0ccd\u0c9f\u0ccd_\u0cb8\u0cc6\u0caa\u0ccd\u0c9f\u0cc6\u0c82_\u0c85\u0c95\u0ccd\u0c9f\u0cc6\u0cc2\u0cd5_\u0ca8\u0cb5\u0cc6\u0c82_\u0ca1\u0cbf\u0cb8\u0cc6\u0c82".split("_"),monthsParseExact:!0,weekdays:"\u0cad\u0cbe\u0ca8\u0cc1\u0cb5\u0cbe\u0cb0_\u0cb8\u0cc6\u0cc2\u0cd5\u0cae\u0cb5\u0cbe\u0cb0_\u0cae\u0c82\u0c97\u0cb3\u0cb5\u0cbe\u0cb0_\u0cac\u0cc1\u0ca7\u0cb5\u0cbe\u0cb0_\u0c97\u0cc1\u0cb0\u0cc1\u0cb5\u0cbe\u0cb0_\u0cb6\u0cc1\u0c95\u0ccd\u0cb0\u0cb5\u0cbe\u0cb0_\u0cb6\u0ca8\u0cbf\u0cb5\u0cbe\u0cb0".split("_"),weekdaysShort:"\u0cad\u0cbe\u0ca8\u0cc1_\u0cb8\u0cc6\u0cc2\u0cd5\u0cae_\u0cae\u0c82\u0c97\u0cb3_\u0cac\u0cc1\u0ca7_\u0c97\u0cc1\u0cb0\u0cc1_\u0cb6\u0cc1\u0c95\u0ccd\u0cb0_\u0cb6\u0ca8\u0cbf".split("_"),weekdaysMin:"\u0cad\u0cbe_\u0cb8\u0cc6\u0cc2\u0cd5_\u0cae\u0c82_\u0cac\u0cc1_\u0c97\u0cc1_\u0cb6\u0cc1_\u0cb6".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[\u0c87\u0c82\u0ca6\u0cc1] LT",nextDay:"[\u0ca8\u0cbe\u0cb3\u0cc6] LT",nextWeek:"dddd, LT",lastDay:"[\u0ca8\u0cbf\u0ca8\u0ccd\u0ca8\u0cc6] LT",lastWeek:"[\u0c95\u0cc6\u0cc2\u0ca8\u0cc6\u0caf] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0ca8\u0c82\u0ca4\u0cb0",past:"%s \u0cb9\u0cbf\u0c82\u0ca6\u0cc6",s:"\u0c95\u0cc6\u0cb2\u0cb5\u0cc1 \u0c95\u0ccd\u0cb7\u0ca3\u0c97\u0cb3\u0cc1",ss:"%d \u0cb8\u0cc6\u0c95\u0cc6\u0c82\u0ca1\u0cc1\u0c97\u0cb3\u0cc1",m:"\u0c92\u0c82\u0ca6\u0cc1 \u0ca8\u0cbf\u0cae\u0cbf\u0cb7",mm:"%d \u0ca8\u0cbf\u0cae\u0cbf\u0cb7",h:"\u0c92\u0c82\u0ca6\u0cc1 \u0c97\u0c82\u0c9f\u0cc6",hh:"%d \u0c97\u0c82\u0c9f\u0cc6",d:"\u0c92\u0c82\u0ca6\u0cc1 \u0ca6\u0cbf\u0ca8",dd:"%d \u0ca6\u0cbf\u0ca8",M:"\u0c92\u0c82\u0ca6\u0cc1 \u0ca4\u0cbf\u0c82\u0c97\u0cb3\u0cc1",MM:"%d \u0ca4\u0cbf\u0c82\u0c97\u0cb3\u0cc1",y:"\u0c92\u0c82\u0ca6\u0cc1 \u0cb5\u0cb0\u0ccd\u0cb7",yy:"%d \u0cb5\u0cb0\u0ccd\u0cb7"},preparse:function(n){return n.replace(/[\u0ce7\u0ce8\u0ce9\u0cea\u0ceb\u0cec\u0ced\u0cee\u0cef\u0ce6]/g,function(n){return e[n]})},postformat:function(n){return n.replace(/\d/g,function(n){return t[n]})},meridiemParse:/\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf|\u0cac\u0cc6\u0cb3\u0cbf\u0c97\u0ccd\u0c97\u0cc6|\u0cae\u0ca7\u0ccd\u0caf\u0cbe\u0cb9\u0ccd\u0ca8|\u0cb8\u0c82\u0c9c\u0cc6/,meridiemHour:function(n,t){return 12===n&&(n=0),"\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf"===t?n<4?n:n+12:"\u0cac\u0cc6\u0cb3\u0cbf\u0c97\u0ccd\u0c97\u0cc6"===t?n:"\u0cae\u0ca7\u0ccd\u0caf\u0cbe\u0cb9\u0ccd\u0ca8"===t?n>=10?n:n+12:"\u0cb8\u0c82\u0c9c\u0cc6"===t?n+12:void 0},meridiem:function(n,t,e){return n<4?"\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf":n<10?"\u0cac\u0cc6\u0cb3\u0cbf\u0c97\u0ccd\u0c97\u0cc6":n<17?"\u0cae\u0ca7\u0ccd\u0caf\u0cbe\u0cb9\u0ccd\u0ca8":n<20?"\u0cb8\u0c82\u0c9c\u0cc6":"\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf"},dayOfMonthOrdinalParse:/\d{1,2}(\u0ca8\u0cc6\u0cd5)/,ordinal:function(n){return n+"\u0ca8\u0cc6\u0cd5"},week:{dow:0,doy:6}})}(e("PJh5"))},gEU3:function(n,t,e){!function(n){"use strict";n.defineLocale("mi",{months:"Kohi-t\u0101te_Hui-tanguru_Pout\u016b-te-rangi_Paenga-wh\u0101wh\u0101_Haratua_Pipiri_H\u014dngoingoi_Here-turi-k\u014dk\u0101_Mahuru_Whiringa-\u0101-nuku_Whiringa-\u0101-rangi_Hakihea".split("_"),monthsShort:"Kohi_Hui_Pou_Pae_Hara_Pipi_H\u014dngoi_Here_Mahu_Whi-nu_Whi-ra_Haki".split("_"),monthsRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsStrictRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsShortRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsShortStrictRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,2}/i,weekdays:"R\u0101tapu_Mane_T\u016brei_Wenerei_T\u0101ite_Paraire_H\u0101tarei".split("_"),weekdaysShort:"Ta_Ma_T\u016b_We_T\u0101i_Pa_H\u0101".split("_"),weekdaysMin:"Ta_Ma_T\u016b_We_T\u0101i_Pa_H\u0101".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [i] HH:mm",LLLL:"dddd, D MMMM YYYY [i] HH:mm"},calendar:{sameDay:"[i teie mahana, i] LT",nextDay:"[apopo i] LT",nextWeek:"dddd [i] LT",lastDay:"[inanahi i] LT",lastWeek:"dddd [whakamutunga i] LT",sameElse:"L"},relativeTime:{future:"i roto i %s",past:"%s i mua",s:"te h\u0113kona ruarua",ss:"%d h\u0113kona",m:"he meneti",mm:"%d meneti",h:"te haora",hh:"%d haora",d:"he ra",dd:"%d ra",M:"he marama",MM:"%d marama",y:"he tau",yy:"%d tau"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(e("PJh5"))},gIN1:function(n,t,e){"use strict";t.a=function(){}},gUgh:function(n,t,e){!function(n){"use strict";n.defineLocale("tet",{months:"Janeiru_Fevereiru_Marsu_Abril_Maiu_Ju\xf1u_Jullu_Agustu_Setembru_Outubru_Novembru_Dezembru".split("_"),monthsShort:"Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),weekdays:"Domingu_Segunda_Tersa_Kuarta_Kinta_Sesta_Sabadu".split("_"),weekdaysShort:"Dom_Seg_Ters_Kua_Kint_Sest_Sab".split("_"),weekdaysMin:"Do_Seg_Te_Ku_Ki_Ses_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Ohin iha] LT",nextDay:"[Aban iha] LT",nextWeek:"dddd [iha] LT",lastDay:"[Horiseik iha] LT",lastWeek:"dddd [semana kotuk] [iha] LT",sameElse:"L"},relativeTime:{future:"iha %s",past:"%s liuba",s:"minutu balun",ss:"minutu %d",m:"minutu ida",mm:"minutu %d",h:"oras ida",hh:"oras %d",d:"loron ida",dd:"loron %d",M:"fulan ida",MM:"fulan %d",y:"tinan ida",yy:"tinan %d"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(n){var t=n%10;return n+(1==~~(n%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th")},week:{dow:1,doy:4}})}(e("PJh5"))},hPuz:function(n,t,e){!function(n){"use strict";n.defineLocale("en-gb",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(n){var t=n%10;return n+(1==~~(n%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th")},week:{dow:1,doy:4}})}(e("PJh5"))},hng5:function(n,t,e){!function(n){"use strict";n.defineLocale("bm",{months:"Zanwuyekalo_Fewuruyekalo_Marisikalo_Awirilikalo_M\u025bkalo_Zuw\u025bnkalo_Zuluyekalo_Utikalo_S\u025btanburukalo_\u0254kut\u0254burukalo_Nowanburukalo_Desanburukalo".split("_"),monthsShort:"Zan_Few_Mar_Awi_M\u025b_Zuw_Zul_Uti_S\u025bt_\u0254ku_Now_Des".split("_"),weekdays:"Kari_Nt\u025bn\u025bn_Tarata_Araba_Alamisa_Juma_Sibiri".split("_"),weekdaysShort:"Kar_Nt\u025b_Tar_Ara_Ala_Jum_Sib".split("_"),weekdaysMin:"Ka_Nt_Ta_Ar_Al_Ju_Si".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"MMMM [tile] D [san] YYYY",LLL:"MMMM [tile] D [san] YYYY [l\u025br\u025b] HH:mm",LLLL:"dddd MMMM [tile] D [san] YYYY [l\u025br\u025b] HH:mm"},calendar:{sameDay:"[Bi l\u025br\u025b] LT",nextDay:"[Sini l\u025br\u025b] LT",nextWeek:"dddd [don l\u025br\u025b] LT",lastDay:"[Kunu l\u025br\u025b] LT",lastWeek:"dddd [t\u025bm\u025bnen l\u025br\u025b] LT",sameElse:"L"},relativeTime:{future:"%s k\u0254n\u0254",past:"a b\u025b %s b\u0254",s:"sanga dama dama",ss:"sekondi %d",m:"miniti kelen",mm:"miniti %d",h:"l\u025br\u025b kelen",hh:"l\u025br\u025b %d",d:"tile kelen",dd:"tile %d",M:"kalo kelen",MM:"kalo %d",y:"san kelen",yy:"san %d"},week:{dow:1,doy:4}})}(e("PJh5"))},iNtv:function(n,t,e){!function(n){"use strict";function t(n,t,e,l){var r={s:["viensas secunds","'iensas secunds"],ss:[n+" secunds",n+" secunds"],m:["'n m\xedut","'iens m\xedut"],mm:[n+" m\xeduts",n+" m\xeduts"],h:["'n \xfeora","'iensa \xfeora"],hh:[n+" \xfeoras",n+" \xfeoras"],d:["'n ziua","'iensa ziua"],dd:[n+" ziuas",n+" ziuas"],M:["'n mes","'iens mes"],MM:[n+" mesen",n+" mesen"],y:["'n ar","'iens ar"],yy:[n+" ars",n+" ars"]};return l?r[e][0]:t?r[e][0]:r[e][1]}n.defineLocale("tzl",{months:"Januar_Fevraglh_Mar\xe7_Avr\xefu_Mai_G\xfcn_Julia_Guscht_Setemvar_Listop\xe4ts_Noemvar_Zecemvar".split("_"),monthsShort:"Jan_Fev_Mar_Avr_Mai_G\xfcn_Jul_Gus_Set_Lis_Noe_Zec".split("_"),weekdays:"S\xfaladi_L\xfane\xe7i_Maitzi_M\xe1rcuri_Xh\xfaadi_Vi\xe9ner\xe7i_S\xe1turi".split("_"),weekdaysShort:"S\xfal_L\xfan_Mai_M\xe1r_Xh\xfa_Vi\xe9_S\xe1t".split("_"),weekdaysMin:"S\xfa_L\xfa_Ma_M\xe1_Xh_Vi_S\xe1".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"D. MMMM [dallas] YYYY",LLL:"D. MMMM [dallas] YYYY HH.mm",LLLL:"dddd, [li] D. MMMM [dallas] YYYY HH.mm"},meridiemParse:/d\'o|d\'a/i,isPM:function(n){return"d'o"===n.toLowerCase()},meridiem:function(n,t,e){return n>11?e?"d'o":"D'O":e?"d'a":"D'A"},calendar:{sameDay:"[oxhi \xe0] LT",nextDay:"[dem\xe0 \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[ieiri \xe0] LT",lastWeek:"[s\xfcr el] dddd [lasteu \xe0] LT",sameElse:"L"},relativeTime:{future:"osprei %s",past:"ja%s",s:t,ss:t,m:t,mm:t,h:t,hh:t,d:t,dd:t,M:t,MM:t,y:t,yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(e("PJh5"))},"j+vx":function(n,t,e){!function(n){"use strict";var t={0:"-\u0448\u0456",1:"-\u0448\u0456",2:"-\u0448\u0456",3:"-\u0448\u0456",4:"-\u0448\u0456",5:"-\u0448\u0456",6:"-\u0448\u044b",7:"-\u0448\u0456",8:"-\u0448\u0456",9:"-\u0448\u044b",10:"-\u0448\u044b",20:"-\u0448\u044b",30:"-\u0448\u044b",40:"-\u0448\u044b",50:"-\u0448\u0456",60:"-\u0448\u044b",70:"-\u0448\u0456",80:"-\u0448\u0456",90:"-\u0448\u044b",100:"-\u0448\u0456"};n.defineLocale("kk",{months:"\u049b\u0430\u04a3\u0442\u0430\u0440_\u0430\u049b\u043f\u0430\u043d_\u043d\u0430\u0443\u0440\u044b\u0437_\u0441\u04d9\u0443\u0456\u0440_\u043c\u0430\u043c\u044b\u0440_\u043c\u0430\u0443\u0441\u044b\u043c_\u0448\u0456\u043b\u0434\u0435_\u0442\u0430\u043c\u044b\u0437_\u049b\u044b\u0440\u043a\u04af\u0439\u0435\u043a_\u049b\u0430\u0437\u0430\u043d_\u049b\u0430\u0440\u0430\u0448\u0430_\u0436\u0435\u043b\u0442\u043e\u049b\u0441\u0430\u043d".split("_"),monthsShort:"\u049b\u0430\u04a3_\u0430\u049b\u043f_\u043d\u0430\u0443_\u0441\u04d9\u0443_\u043c\u0430\u043c_\u043c\u0430\u0443_\u0448\u0456\u043b_\u0442\u0430\u043c_\u049b\u044b\u0440_\u049b\u0430\u0437_\u049b\u0430\u0440_\u0436\u0435\u043b".split("_"),weekdays:"\u0436\u0435\u043a\u0441\u0435\u043d\u0431\u0456_\u0434\u04af\u0439\u0441\u0435\u043d\u0431\u0456_\u0441\u0435\u0439\u0441\u0435\u043d\u0431\u0456_\u0441\u04d9\u0440\u0441\u0435\u043d\u0431\u0456_\u0431\u0435\u0439\u0441\u0435\u043d\u0431\u0456_\u0436\u04b1\u043c\u0430_\u0441\u0435\u043d\u0431\u0456".split("_"),weekdaysShort:"\u0436\u0435\u043a_\u0434\u04af\u0439_\u0441\u0435\u0439_\u0441\u04d9\u0440_\u0431\u0435\u0439_\u0436\u04b1\u043c_\u0441\u0435\u043d".split("_"),weekdaysMin:"\u0436\u043a_\u0434\u0439_\u0441\u0439_\u0441\u0440_\u0431\u0439_\u0436\u043c_\u0441\u043d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0411\u04af\u0433\u0456\u043d \u0441\u0430\u0493\u0430\u0442] LT",nextDay:"[\u0415\u0440\u0442\u0435\u04a3 \u0441\u0430\u0493\u0430\u0442] LT",nextWeek:"dddd [\u0441\u0430\u0493\u0430\u0442] LT",lastDay:"[\u041a\u0435\u0448\u0435 \u0441\u0430\u0493\u0430\u0442] LT",lastWeek:"[\u04e8\u0442\u043a\u0435\u043d \u0430\u043f\u0442\u0430\u043d\u044b\u04a3] dddd [\u0441\u0430\u0493\u0430\u0442] LT",sameElse:"L"},relativeTime:{future:"%s \u0456\u0448\u0456\u043d\u0434\u0435",past:"%s \u0431\u04b1\u0440\u044b\u043d",s:"\u0431\u0456\u0440\u043d\u0435\u0448\u0435 \u0441\u0435\u043a\u0443\u043d\u0434",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434",m:"\u0431\u0456\u0440 \u043c\u0438\u043d\u0443\u0442",mm:"%d \u043c\u0438\u043d\u0443\u0442",h:"\u0431\u0456\u0440 \u0441\u0430\u0493\u0430\u0442",hh:"%d \u0441\u0430\u0493\u0430\u0442",d:"\u0431\u0456\u0440 \u043a\u04af\u043d",dd:"%d \u043a\u04af\u043d",M:"\u0431\u0456\u0440 \u0430\u0439",MM:"%d \u0430\u0439",y:"\u0431\u0456\u0440 \u0436\u044b\u043b",yy:"%d \u0436\u044b\u043b"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0448\u0456|\u0448\u044b)/,ordinal:function(n){return n+(t[n]||t[n%10]||t[n>=100?100:null])},week:{dow:1,doy:7}})}(e("PJh5"))},j8cJ:function(n,t,e){!function(n){"use strict";n.defineLocale("ar-kw",{months:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648\u0632_\u063a\u0634\u062a_\u0634\u062a\u0646\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0646\u0628\u0631_\u062f\u062c\u0646\u0628\u0631".split("_"),monthsShort:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648\u0632_\u063a\u0634\u062a_\u0634\u062a\u0646\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0646\u0628\u0631_\u062f\u062c\u0646\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062a\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0627\u062d\u062f_\u0627\u062a\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},week:{dow:0,doy:12}})}(e("PJh5"))},jxEH:function(n,t,e){!function(n){"use strict";var t={ss:"sekundes_sekund\u0113m_sekunde_sekundes".split("_"),m:"min\u016btes_min\u016bt\u0113m_min\u016bte_min\u016btes".split("_"),mm:"min\u016btes_min\u016bt\u0113m_min\u016bte_min\u016btes".split("_"),h:"stundas_stund\u0101m_stunda_stundas".split("_"),hh:"stundas_stund\u0101m_stunda_stundas".split("_"),d:"dienas_dien\u0101m_diena_dienas".split("_"),dd:"dienas_dien\u0101m_diena_dienas".split("_"),M:"m\u0113ne\u0161a_m\u0113ne\u0161iem_m\u0113nesis_m\u0113ne\u0161i".split("_"),MM:"m\u0113ne\u0161a_m\u0113ne\u0161iem_m\u0113nesis_m\u0113ne\u0161i".split("_"),y:"gada_gadiem_gads_gadi".split("_"),yy:"gada_gadiem_gads_gadi".split("_")};function e(n,t,e){return e?t%10==1&&t%100!=11?n[2]:n[3]:t%10==1&&t%100!=11?n[0]:n[1]}function l(n,l,r){return n+" "+e(t[r],n,l)}function r(n,l,r){return e(t[r],n,l)}n.defineLocale("lv",{months:"janv\u0101ris_febru\u0101ris_marts_apr\u012blis_maijs_j\u016bnijs_j\u016blijs_augusts_septembris_oktobris_novembris_decembris".split("_"),monthsShort:"jan_feb_mar_apr_mai_j\u016bn_j\u016bl_aug_sep_okt_nov_dec".split("_"),weekdays:"sv\u0113tdiena_pirmdiena_otrdiena_tre\u0161diena_ceturtdiena_piektdiena_sestdiena".split("_"),weekdaysShort:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysMin:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY.",LL:"YYYY. [gada] D. MMMM",LLL:"YYYY. [gada] D. MMMM, HH:mm",LLLL:"YYYY. [gada] D. MMMM, dddd, HH:mm"},calendar:{sameDay:"[\u0160odien pulksten] LT",nextDay:"[R\u012bt pulksten] LT",nextWeek:"dddd [pulksten] LT",lastDay:"[Vakar pulksten] LT",lastWeek:"[Pag\u0101ju\u0161\u0101] dddd [pulksten] LT",sameElse:"L"},relativeTime:{future:"p\u0113c %s",past:"pirms %s",s:function(n,t){return t?"da\u017eas sekundes":"da\u017e\u0101m sekund\u0113m"},ss:l,m:r,mm:l,h:r,hh:l,d:r,dd:l,M:r,MM:l,y:r,yy:l},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(e("PJh5"))},"k+5o":function(n,t,e){!function(n){"use strict";var t={1:"'inci",5:"'inci",8:"'inci",70:"'inci",80:"'inci",2:"'nci",7:"'nci",20:"'nci",50:"'nci",3:"'\xfcnc\xfc",4:"'\xfcnc\xfc",100:"'\xfcnc\xfc",6:"'nc\u0131",9:"'uncu",10:"'uncu",30:"'uncu",60:"'\u0131nc\u0131",90:"'\u0131nc\u0131"};n.defineLocale("tr",{months:"Ocak_\u015eubat_Mart_Nisan_May\u0131s_Haziran_Temmuz_A\u011fustos_Eyl\xfcl_Ekim_Kas\u0131m_Aral\u0131k".split("_"),monthsShort:"Oca_\u015eub_Mar_Nis_May_Haz_Tem_A\u011fu_Eyl_Eki_Kas_Ara".split("_"),weekdays:"Pazar_Pazartesi_Sal\u0131_\xc7ar\u015famba_Per\u015fembe_Cuma_Cumartesi".split("_"),weekdaysShort:"Paz_Pts_Sal_\xc7ar_Per_Cum_Cts".split("_"),weekdaysMin:"Pz_Pt_Sa_\xc7a_Pe_Cu_Ct".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bug\xfcn saat] LT",nextDay:"[yar\u0131n saat] LT",nextWeek:"[gelecek] dddd [saat] LT",lastDay:"[d\xfcn] LT",lastWeek:"[ge\xe7en] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s \xf6nce",s:"birka\xe7 saniye",ss:"%d saniye",m:"bir dakika",mm:"%d dakika",h:"bir saat",hh:"%d saat",d:"bir g\xfcn",dd:"%d g\xfcn",M:"bir ay",MM:"%d ay",y:"bir y\u0131l",yy:"%d y\u0131l"},ordinal:function(n,e){switch(e){case"d":case"D":case"Do":case"DD":return n;default:if(0===n)return n+"'\u0131nc\u0131";var l=n%10;return n+(t[l]||t[n%100-l]||t[n>=100?100:null])}},week:{dow:1,doy:7}})}(e("PJh5"))},krPU:function(n,t,e){!function(n){"use strict";n.defineLocale("tzm-latn",{months:"innayr_br\u02e4ayr\u02e4_mar\u02e4s\u02e4_ibrir_mayyw_ywnyw_ywlywz_\u0263w\u0161t_\u0161wtanbir_kt\u02e4wbr\u02e4_nwwanbir_dwjnbir".split("_"),monthsShort:"innayr_br\u02e4ayr\u02e4_mar\u02e4s\u02e4_ibrir_mayyw_ywnyw_ywlywz_\u0263w\u0161t_\u0161wtanbir_kt\u02e4wbr\u02e4_nwwanbir_dwjnbir".split("_"),weekdays:"asamas_aynas_asinas_akras_akwas_asimwas_asi\u1e0dyas".split("_"),weekdaysShort:"asamas_aynas_asinas_akras_akwas_asimwas_asi\u1e0dyas".split("_"),weekdaysMin:"asamas_aynas_asinas_akras_akwas_asimwas_asi\u1e0dyas".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[asdkh g] LT",nextDay:"[aska g] LT",nextWeek:"dddd [g] LT",lastDay:"[assant g] LT",lastWeek:"dddd [g] LT",sameElse:"L"},relativeTime:{future:"dadkh s yan %s",past:"yan %s",s:"imik",ss:"%d imik",m:"minu\u1e0d",mm:"%d minu\u1e0d",h:"sa\u025ba",hh:"%d tassa\u025bin",d:"ass",dd:"%d ossan",M:"ayowr",MM:"%d iyyirn",y:"asgas",yy:"%d isgasn"},week:{dow:6,doy:12}})}(e("PJh5"))},lAP5:function(n,t,e){"use strict";t.a=function(n){return n}},lOED:function(n,t,e){!function(n){"use strict";n.defineLocale("bg",{months:"\u044f\u043d\u0443\u0430\u0440\u0438_\u0444\u0435\u0432\u0440\u0443\u0430\u0440\u0438_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0438\u043b_\u043c\u0430\u0439_\u044e\u043d\u0438_\u044e\u043b\u0438_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043f\u0442\u0435\u043c\u0432\u0440\u0438_\u043e\u043a\u0442\u043e\u043c\u0432\u0440\u0438_\u043d\u043e\u0435\u043c\u0432\u0440\u0438_\u0434\u0435\u043a\u0435\u043c\u0432\u0440\u0438".split("_"),monthsShort:"\u044f\u043d\u0440_\u0444\u0435\u0432_\u043c\u0430\u0440_\u0430\u043f\u0440_\u043c\u0430\u0439_\u044e\u043d\u0438_\u044e\u043b\u0438_\u0430\u0432\u0433_\u0441\u0435\u043f_\u043e\u043a\u0442_\u043d\u043e\u0435_\u0434\u0435\u043a".split("_"),weekdays:"\u043d\u0435\u0434\u0435\u043b\u044f_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u044f\u0434\u0430_\u0447\u0435\u0442\u0432\u044a\u0440\u0442\u044a\u043a_\u043f\u0435\u0442\u044a\u043a_\u0441\u044a\u0431\u043e\u0442\u0430".split("_"),weekdaysShort:"\u043d\u0435\u0434_\u043f\u043e\u043d_\u0432\u0442\u043e_\u0441\u0440\u044f_\u0447\u0435\u0442_\u043f\u0435\u0442_\u0441\u044a\u0431".split("_"),weekdaysMin:"\u043d\u0434_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[\u0414\u043d\u0435\u0441 \u0432] LT",nextDay:"[\u0423\u0442\u0440\u0435 \u0432] LT",nextWeek:"dddd [\u0432] LT",lastDay:"[\u0412\u0447\u0435\u0440\u0430 \u0432] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[\u0412 \u0438\u0437\u043c\u0438\u043d\u0430\u043b\u0430\u0442\u0430] dddd [\u0432] LT";case 1:case 2:case 4:case 5:return"[\u0412 \u0438\u0437\u043c\u0438\u043d\u0430\u043b\u0438\u044f] dddd [\u0432] LT"}},sameElse:"L"},relativeTime:{future:"\u0441\u043b\u0435\u0434 %s",past:"\u043f\u0440\u0435\u0434\u0438 %s",s:"\u043d\u044f\u043a\u043e\u043b\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434\u0438",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434\u0438",m:"\u043c\u0438\u043d\u0443\u0442\u0430",mm:"%d \u043c\u0438\u043d\u0443\u0442\u0438",h:"\u0447\u0430\u0441",hh:"%d \u0447\u0430\u0441\u0430",d:"\u0434\u0435\u043d",dd:"%d \u0434\u043d\u0438",M:"\u043c\u0435\u0441\u0435\u0446",MM:"%d \u043c\u0435\u0441\u0435\u0446\u0430",y:"\u0433\u043e\u0434\u0438\u043d\u0430",yy:"%d \u0433\u043e\u0434\u0438\u043d\u0438"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0435\u0432|\u0435\u043d|\u0442\u0438|\u0432\u0438|\u0440\u0438|\u043c\u0438)/,ordinal:function(n){var t=n%10,e=n%100;return 0===n?n+"-\u0435\u0432":0===e?n+"-\u0435\u043d":e>10&&e<20?n+"-\u0442\u0438":1===t?n+"-\u0432\u0438":2===t?n+"-\u0440\u0438":7===t||8===t?n+"-\u043c\u0438":n+"-\u0442\u0438"},week:{dow:1,doy:7}})}(e("PJh5"))},m7yE:function(n,t,e){!function(n){"use strict";var t="pagh_wa\u2019_cha\u2019_wej_loS_vagh_jav_Soch_chorgh_Hut".split("_");function e(n,e,l,r){var i=function(n){var e=Math.floor(n%1e3/100),l=Math.floor(n%100/10),r=n%10,i="";return e>0&&(i+=t[e]+"vatlh"),l>0&&(i+=(""!==i?" ":"")+t[l]+"maH"),r>0&&(i+=(""!==i?" ":"")+t[r]),""===i?"pagh":i}(n);switch(l){case"ss":return i+" lup";case"mm":return i+" tup";case"hh":return i+" rep";case"dd":return i+" jaj";case"MM":return i+" jar";case"yy":return i+" DIS"}}n.defineLocale("tlh",{months:"tera\u2019 jar wa\u2019_tera\u2019 jar cha\u2019_tera\u2019 jar wej_tera\u2019 jar loS_tera\u2019 jar vagh_tera\u2019 jar jav_tera\u2019 jar Soch_tera\u2019 jar chorgh_tera\u2019 jar Hut_tera\u2019 jar wa\u2019maH_tera\u2019 jar wa\u2019maH wa\u2019_tera\u2019 jar wa\u2019maH cha\u2019".split("_"),monthsShort:"jar wa\u2019_jar cha\u2019_jar wej_jar loS_jar vagh_jar jav_jar Soch_jar chorgh_jar Hut_jar wa\u2019maH_jar wa\u2019maH wa\u2019_jar wa\u2019maH cha\u2019".split("_"),monthsParseExact:!0,weekdays:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),weekdaysShort:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),weekdaysMin:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[DaHjaj] LT",nextDay:"[wa\u2019leS] LT",nextWeek:"LLL",lastDay:"[wa\u2019Hu\u2019] LT",lastWeek:"LLL",sameElse:"L"},relativeTime:{future:function(n){var t=n;return-1!==n.indexOf("jaj")?t.slice(0,-3)+"leS":-1!==n.indexOf("jar")?t.slice(0,-3)+"waQ":-1!==n.indexOf("DIS")?t.slice(0,-3)+"nem":t+" pIq"},past:function(n){var t=n;return-1!==n.indexOf("jaj")?t.slice(0,-3)+"Hu\u2019":-1!==n.indexOf("jar")?t.slice(0,-3)+"wen":-1!==n.indexOf("DIS")?t.slice(0,-3)+"ben":t+" ret"},s:"puS lup",ss:e,m:"wa\u2019 tup",mm:e,h:"wa\u2019 rep",hh:e,d:"wa\u2019 jaj",dd:e,M:"wa\u2019 jar",MM:e,y:"wa\u2019 DIS",yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(e("PJh5"))},nE8X:function(n,t,e){!function(n){"use strict";n.defineLocale("lo",{months:"\u0ea1\u0eb1\u0e87\u0e81\u0ead\u0e99_\u0e81\u0eb8\u0ea1\u0e9e\u0eb2_\u0ea1\u0eb5\u0e99\u0eb2_\u0ec0\u0ea1\u0eaa\u0eb2_\u0e9e\u0eb6\u0e94\u0eaa\u0eb0\u0e9e\u0eb2_\u0ea1\u0eb4\u0e96\u0eb8\u0e99\u0eb2_\u0e81\u0ecd\u0ea5\u0eb0\u0e81\u0ebb\u0e94_\u0eaa\u0eb4\u0e87\u0eab\u0eb2_\u0e81\u0eb1\u0e99\u0e8d\u0eb2_\u0e95\u0eb8\u0ea5\u0eb2_\u0e9e\u0eb0\u0e88\u0eb4\u0e81_\u0e97\u0eb1\u0e99\u0ea7\u0eb2".split("_"),monthsShort:"\u0ea1\u0eb1\u0e87\u0e81\u0ead\u0e99_\u0e81\u0eb8\u0ea1\u0e9e\u0eb2_\u0ea1\u0eb5\u0e99\u0eb2_\u0ec0\u0ea1\u0eaa\u0eb2_\u0e9e\u0eb6\u0e94\u0eaa\u0eb0\u0e9e\u0eb2_\u0ea1\u0eb4\u0e96\u0eb8\u0e99\u0eb2_\u0e81\u0ecd\u0ea5\u0eb0\u0e81\u0ebb\u0e94_\u0eaa\u0eb4\u0e87\u0eab\u0eb2_\u0e81\u0eb1\u0e99\u0e8d\u0eb2_\u0e95\u0eb8\u0ea5\u0eb2_\u0e9e\u0eb0\u0e88\u0eb4\u0e81_\u0e97\u0eb1\u0e99\u0ea7\u0eb2".split("_"),weekdays:"\u0ead\u0eb2\u0e97\u0eb4\u0e94_\u0e88\u0eb1\u0e99_\u0ead\u0eb1\u0e87\u0e84\u0eb2\u0e99_\u0e9e\u0eb8\u0e94_\u0e9e\u0eb0\u0eab\u0eb1\u0e94_\u0eaa\u0eb8\u0e81_\u0ec0\u0eaa\u0ebb\u0eb2".split("_"),weekdaysShort:"\u0e97\u0eb4\u0e94_\u0e88\u0eb1\u0e99_\u0ead\u0eb1\u0e87\u0e84\u0eb2\u0e99_\u0e9e\u0eb8\u0e94_\u0e9e\u0eb0\u0eab\u0eb1\u0e94_\u0eaa\u0eb8\u0e81_\u0ec0\u0eaa\u0ebb\u0eb2".split("_"),weekdaysMin:"\u0e97_\u0e88_\u0ead\u0e84_\u0e9e_\u0e9e\u0eab_\u0eaa\u0e81_\u0eaa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"\u0ea7\u0eb1\u0e99dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0e95\u0ead\u0e99\u0ec0\u0e8a\u0ebb\u0ec9\u0eb2|\u0e95\u0ead\u0e99\u0ec1\u0ea5\u0e87/,isPM:function(n){return"\u0e95\u0ead\u0e99\u0ec1\u0ea5\u0e87"===n},meridiem:function(n,t,e){return n<12?"\u0e95\u0ead\u0e99\u0ec0\u0e8a\u0ebb\u0ec9\u0eb2":"\u0e95\u0ead\u0e99\u0ec1\u0ea5\u0e87"},calendar:{sameDay:"[\u0ea1\u0eb7\u0ec9\u0e99\u0eb5\u0ec9\u0ec0\u0ea7\u0ea5\u0eb2] LT",nextDay:"[\u0ea1\u0eb7\u0ec9\u0ead\u0eb7\u0ec8\u0e99\u0ec0\u0ea7\u0ea5\u0eb2] LT",nextWeek:"[\u0ea7\u0eb1\u0e99]dddd[\u0edc\u0ec9\u0eb2\u0ec0\u0ea7\u0ea5\u0eb2] LT",lastDay:"[\u0ea1\u0eb7\u0ec9\u0ea7\u0eb2\u0e99\u0e99\u0eb5\u0ec9\u0ec0\u0ea7\u0ea5\u0eb2] LT",lastWeek:"[\u0ea7\u0eb1\u0e99]dddd[\u0ec1\u0ea5\u0ec9\u0ea7\u0e99\u0eb5\u0ec9\u0ec0\u0ea7\u0ea5\u0eb2] LT",sameElse:"L"},relativeTime:{future:"\u0ead\u0eb5\u0e81 %s",past:"%s\u0e9c\u0ec8\u0eb2\u0e99\u0ea1\u0eb2",s:"\u0e9a\u0ecd\u0ec8\u0ec0\u0e97\u0ebb\u0ec8\u0eb2\u0ec3\u0e94\u0ea7\u0eb4\u0e99\u0eb2\u0e97\u0eb5",ss:"%d \u0ea7\u0eb4\u0e99\u0eb2\u0e97\u0eb5",m:"1 \u0e99\u0eb2\u0e97\u0eb5",mm:"%d \u0e99\u0eb2\u0e97\u0eb5",h:"1 \u0e8a\u0ebb\u0ec8\u0ea7\u0ec2\u0ea1\u0e87",hh:"%d \u0e8a\u0ebb\u0ec8\u0ea7\u0ec2\u0ea1\u0e87",d:"1 \u0ea1\u0eb7\u0ec9",dd:"%d \u0ea1\u0eb7\u0ec9",M:"1 \u0ec0\u0e94\u0eb7\u0ead\u0e99",MM:"%d \u0ec0\u0e94\u0eb7\u0ead\u0e99",y:"1 \u0e9b\u0eb5",yy:"%d \u0e9b\u0eb5"},dayOfMonthOrdinalParse:/(\u0e97\u0eb5\u0ec8)\d{1,2}/,ordinal:function(n){return"\u0e97\u0eb5\u0ec8"+n}})}(e("PJh5"))},nLOz:function(n,t,e){!function(n){"use strict";n.defineLocale("gd",{months:["Am Faoilleach","An Gearran","Am M\xe0rt","An Giblean","An C\xe8itean","An t-\xd2gmhios","An t-Iuchar","An L\xf9nastal","An t-Sultain","An D\xe0mhair","An t-Samhain","An D\xf9bhlachd"],monthsShort:["Faoi","Gear","M\xe0rt","Gibl","C\xe8it","\xd2gmh","Iuch","L\xf9n","Sult","D\xe0mh","Samh","D\xf9bh"],monthsParseExact:!0,weekdays:["Did\xf2mhnaich","Diluain","Dim\xe0irt","Diciadain","Diardaoin","Dihaoine","Disathairne"],weekdaysShort:["Did","Dil","Dim","Dic","Dia","Dih","Dis"],weekdaysMin:["D\xf2","Lu","M\xe0","Ci","Ar","Ha","Sa"],longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[An-diugh aig] LT",nextDay:"[A-m\xe0ireach aig] LT",nextWeek:"dddd [aig] LT",lastDay:"[An-d\xe8 aig] LT",lastWeek:"dddd [seo chaidh] [aig] LT",sameElse:"L"},relativeTime:{future:"ann an %s",past:"bho chionn %s",s:"beagan diogan",ss:"%d diogan",m:"mionaid",mm:"%d mionaidean",h:"uair",hh:"%d uairean",d:"latha",dd:"%d latha",M:"m\xecos",MM:"%d m\xecosan",y:"bliadhna",yy:"%d bliadhna"},dayOfMonthOrdinalParse:/\d{1,2}(d|na|mh)/,ordinal:function(n){return n+(1===n?"d":n%10==2?"na":"mh")},week:{dow:1,doy:4}})}(e("PJh5"))},nS2h:function(n,t,e){!function(n){"use strict";var t="nolla yksi kaksi kolme nelj\xe4 viisi kuusi seitsem\xe4n kahdeksan yhdeks\xe4n".split(" "),e=["nolla","yhden","kahden","kolmen","nelj\xe4n","viiden","kuuden",t[7],t[8],t[9]];function l(n,l,r,i){var o="";switch(r){case"s":return i?"muutaman sekunnin":"muutama sekunti";case"ss":return i?"sekunnin":"sekuntia";case"m":return i?"minuutin":"minuutti";case"mm":o=i?"minuutin":"minuuttia";break;case"h":return i?"tunnin":"tunti";case"hh":o=i?"tunnin":"tuntia";break;case"d":return i?"p\xe4iv\xe4n":"p\xe4iv\xe4";case"dd":o=i?"p\xe4iv\xe4n":"p\xe4iv\xe4\xe4";break;case"M":return i?"kuukauden":"kuukausi";case"MM":o=i?"kuukauden":"kuukautta";break;case"y":return i?"vuoden":"vuosi";case"yy":o=i?"vuoden":"vuotta"}return function(n,l){return n<10?l?e[n]:t[n]:n}(n,i)+" "+o}n.defineLocale("fi",{months:"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kes\xe4kuu_hein\xe4kuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),monthsShort:"tammi_helmi_maalis_huhti_touko_kes\xe4_hein\xe4_elo_syys_loka_marras_joulu".split("_"),weekdays:"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),weekdaysShort:"su_ma_ti_ke_to_pe_la".split("_"),weekdaysMin:"su_ma_ti_ke_to_pe_la".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"Do MMMM[ta] YYYY",LLL:"Do MMMM[ta] YYYY, [klo] HH.mm",LLLL:"dddd, Do MMMM[ta] YYYY, [klo] HH.mm",l:"D.M.YYYY",ll:"Do MMM YYYY",lll:"Do MMM YYYY, [klo] HH.mm",llll:"ddd, Do MMM YYYY, [klo] HH.mm"},calendar:{sameDay:"[t\xe4n\xe4\xe4n] [klo] LT",nextDay:"[huomenna] [klo] LT",nextWeek:"dddd [klo] LT",lastDay:"[eilen] [klo] LT",lastWeek:"[viime] dddd[na] [klo] LT",sameElse:"L"},relativeTime:{future:"%s p\xe4\xe4st\xe4",past:"%s sitten",s:l,ss:l,m:l,mm:l,h:l,hh:l,d:l,dd:l,M:l,MM:l,y:l,yy:l},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(e("PJh5"))},ntHu:function(n,t,e){!function(n){"use strict";function t(n,t,e){var l,r;return"m"===e?t?"\u0445\u0432\u0438\u043b\u0438\u043d\u0430":"\u0445\u0432\u0438\u043b\u0438\u043d\u0443":"h"===e?t?"\u0433\u043e\u0434\u0438\u043d\u0430":"\u0433\u043e\u0434\u0438\u043d\u0443":n+" "+(l=+n,r={ss:t?"\u0441\u0435\u043a\u0443\u043d\u0434\u0430_\u0441\u0435\u043a\u0443\u043d\u0434\u0438_\u0441\u0435\u043a\u0443\u043d\u0434":"\u0441\u0435\u043a\u0443\u043d\u0434\u0443_\u0441\u0435\u043a\u0443\u043d\u0434\u0438_\u0441\u0435\u043a\u0443\u043d\u0434",mm:t?"\u0445\u0432\u0438\u043b\u0438\u043d\u0430_\u0445\u0432\u0438\u043b\u0438\u043d\u0438_\u0445\u0432\u0438\u043b\u0438\u043d":"\u0445\u0432\u0438\u043b\u0438\u043d\u0443_\u0445\u0432\u0438\u043b\u0438\u043d\u0438_\u0445\u0432\u0438\u043b\u0438\u043d",hh:t?"\u0433\u043e\u0434\u0438\u043d\u0430_\u0433\u043e\u0434\u0438\u043d\u0438_\u0433\u043e\u0434\u0438\u043d":"\u0433\u043e\u0434\u0438\u043d\u0443_\u0433\u043e\u0434\u0438\u043d\u0438_\u0433\u043e\u0434\u0438\u043d",dd:"\u0434\u0435\u043d\u044c_\u0434\u043d\u0456_\u0434\u043d\u0456\u0432",MM:"\u043c\u0456\u0441\u044f\u0446\u044c_\u043c\u0456\u0441\u044f\u0446\u0456_\u043c\u0456\u0441\u044f\u0446\u0456\u0432",yy:"\u0440\u0456\u043a_\u0440\u043e\u043a\u0438_\u0440\u043e\u043a\u0456\u0432"}[e].split("_"),l%10==1&&l%100!=11?r[0]:l%10>=2&&l%10<=4&&(l%100<10||l%100>=20)?r[1]:r[2])}function e(n){return function(){return n+"\u043e"+(11===this.hours()?"\u0431":"")+"] LT"}}n.defineLocale("uk",{months:{format:"\u0441\u0456\u0447\u043d\u044f_\u043b\u044e\u0442\u043e\u0433\u043e_\u0431\u0435\u0440\u0435\u0437\u043d\u044f_\u043a\u0432\u0456\u0442\u043d\u044f_\u0442\u0440\u0430\u0432\u043d\u044f_\u0447\u0435\u0440\u0432\u043d\u044f_\u043b\u0438\u043f\u043d\u044f_\u0441\u0435\u0440\u043f\u043d\u044f_\u0432\u0435\u0440\u0435\u0441\u043d\u044f_\u0436\u043e\u0432\u0442\u043d\u044f_\u043b\u0438\u0441\u0442\u043e\u043f\u0430\u0434\u0430_\u0433\u0440\u0443\u0434\u043d\u044f".split("_"),standalone:"\u0441\u0456\u0447\u0435\u043d\u044c_\u043b\u044e\u0442\u0438\u0439_\u0431\u0435\u0440\u0435\u0437\u0435\u043d\u044c_\u043a\u0432\u0456\u0442\u0435\u043d\u044c_\u0442\u0440\u0430\u0432\u0435\u043d\u044c_\u0447\u0435\u0440\u0432\u0435\u043d\u044c_\u043b\u0438\u043f\u0435\u043d\u044c_\u0441\u0435\u0440\u043f\u0435\u043d\u044c_\u0432\u0435\u0440\u0435\u0441\u0435\u043d\u044c_\u0436\u043e\u0432\u0442\u0435\u043d\u044c_\u043b\u0438\u0441\u0442\u043e\u043f\u0430\u0434_\u0433\u0440\u0443\u0434\u0435\u043d\u044c".split("_")},monthsShort:"\u0441\u0456\u0447_\u043b\u044e\u0442_\u0431\u0435\u0440_\u043a\u0432\u0456\u0442_\u0442\u0440\u0430\u0432_\u0447\u0435\u0440\u0432_\u043b\u0438\u043f_\u0441\u0435\u0440\u043f_\u0432\u0435\u0440_\u0436\u043e\u0432\u0442_\u043b\u0438\u0441\u0442_\u0433\u0440\u0443\u0434".split("_"),weekdays:function(n,t){var e={nominative:"\u043d\u0435\u0434\u0456\u043b\u044f_\u043f\u043e\u043d\u0435\u0434\u0456\u043b\u043e\u043a_\u0432\u0456\u0432\u0442\u043e\u0440\u043e\u043a_\u0441\u0435\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0435\u0440_\u043f\u2019\u044f\u0442\u043d\u0438\u0446\u044f_\u0441\u0443\u0431\u043e\u0442\u0430".split("_"),accusative:"\u043d\u0435\u0434\u0456\u043b\u044e_\u043f\u043e\u043d\u0435\u0434\u0456\u043b\u043e\u043a_\u0432\u0456\u0432\u0442\u043e\u0440\u043e\u043a_\u0441\u0435\u0440\u0435\u0434\u0443_\u0447\u0435\u0442\u0432\u0435\u0440_\u043f\u2019\u044f\u0442\u043d\u0438\u0446\u044e_\u0441\u0443\u0431\u043e\u0442\u0443".split("_"),genitive:"\u043d\u0435\u0434\u0456\u043b\u0456_\u043f\u043e\u043d\u0435\u0434\u0456\u043b\u043a\u0430_\u0432\u0456\u0432\u0442\u043e\u0440\u043a\u0430_\u0441\u0435\u0440\u0435\u0434\u0438_\u0447\u0435\u0442\u0432\u0435\u0440\u0433\u0430_\u043f\u2019\u044f\u0442\u043d\u0438\u0446\u0456_\u0441\u0443\u0431\u043e\u0442\u0438".split("_")};return n?e[/(\[[\u0412\u0432\u0423\u0443]\]) ?dddd/.test(t)?"accusative":/\[?(?:\u043c\u0438\u043d\u0443\u043b\u043e\u0457|\u043d\u0430\u0441\u0442\u0443\u043f\u043d\u043e\u0457)? ?\] ?dddd/.test(t)?"genitive":"nominative"][n.day()]:e.nominative},weekdaysShort:"\u043d\u0434_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),weekdaysMin:"\u043d\u0434_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0440.",LLL:"D MMMM YYYY \u0440., HH:mm",LLLL:"dddd, D MMMM YYYY \u0440., HH:mm"},calendar:{sameDay:e("[\u0421\u044c\u043e\u0433\u043e\u0434\u043d\u0456 "),nextDay:e("[\u0417\u0430\u0432\u0442\u0440\u0430 "),lastDay:e("[\u0412\u0447\u043e\u0440\u0430 "),nextWeek:e("[\u0423] dddd ["),lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return e("[\u041c\u0438\u043d\u0443\u043b\u043e\u0457] dddd [").call(this);case 1:case 2:case 4:return e("[\u041c\u0438\u043d\u0443\u043b\u043e\u0433\u043e] dddd [").call(this)}},sameElse:"L"},relativeTime:{future:"\u0437\u0430 %s",past:"%s \u0442\u043e\u043c\u0443",s:"\u0434\u0435\u043a\u0456\u043b\u044c\u043a\u0430 \u0441\u0435\u043a\u0443\u043d\u0434",ss:t,m:t,mm:t,h:"\u0433\u043e\u0434\u0438\u043d\u0443",hh:t,d:"\u0434\u0435\u043d\u044c",dd:t,M:"\u043c\u0456\u0441\u044f\u0446\u044c",MM:t,y:"\u0440\u0456\u043a",yy:t},meridiemParse:/\u043d\u043e\u0447\u0456|\u0440\u0430\u043d\u043a\u0443|\u0434\u043d\u044f|\u0432\u0435\u0447\u043e\u0440\u0430/,isPM:function(n){return/^(\u0434\u043d\u044f|\u0432\u0435\u0447\u043e\u0440\u0430)$/.test(n)},meridiem:function(n,t,e){return n<4?"\u043d\u043e\u0447\u0456":n<12?"\u0440\u0430\u043d\u043a\u0443":n<17?"\u0434\u043d\u044f":"\u0432\u0435\u0447\u043e\u0440\u0430"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0439|\u0433\u043e)/,ordinal:function(n,t){switch(t){case"M":case"d":case"DDD":case"w":case"W":return n+"-\u0439";case"D":return n+"-\u0433\u043e";default:return n}},week:{dow:1,doy:7}})}(e("PJh5"))},oCzW:function(n,t,e){!function(n){"use strict";n.defineLocale("mt",{months:"Jannar_Frar_Marzu_April_Mejju_\u0120unju_Lulju_Awwissu_Settembru_Ottubru_Novembru_Di\u010bembru".split("_"),monthsShort:"Jan_Fra_Mar_Apr_Mej_\u0120un_Lul_Aww_Set_Ott_Nov_Di\u010b".split("_"),weekdays:"Il-\u0126add_It-Tnejn_It-Tlieta_L-Erbg\u0127a_Il-\u0126amis_Il-\u0120img\u0127a_Is-Sibt".split("_"),weekdaysShort:"\u0126ad_Tne_Tli_Erb_\u0126am_\u0120im_Sib".split("_"),weekdaysMin:"\u0126a_Tn_Tl_Er_\u0126a_\u0120i_Si".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Illum fil-]LT",nextDay:"[G\u0127ada fil-]LT",nextWeek:"dddd [fil-]LT",lastDay:"[Il-biera\u0127 fil-]LT",lastWeek:"dddd [li g\u0127adda] [fil-]LT",sameElse:"L"},relativeTime:{future:"f\u2019 %s",past:"%s ilu",s:"ftit sekondi",ss:"%d sekondi",m:"minuta",mm:"%d minuti",h:"sieg\u0127a",hh:"%d sieg\u0127at",d:"\u0121urnata",dd:"%d \u0121ranet",M:"xahar",MM:"%d xhur",y:"sena",yy:"%d sni"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(e("PJh5"))},oo1B:function(n,t,e){!function(n){"use strict";n.defineLocale("ml",{months:"\u0d1c\u0d28\u0d41\u0d35\u0d30\u0d3f_\u0d2b\u0d46\u0d2c\u0d4d\u0d30\u0d41\u0d35\u0d30\u0d3f_\u0d2e\u0d3e\u0d7c\u0d1a\u0d4d\u0d1a\u0d4d_\u0d0f\u0d2a\u0d4d\u0d30\u0d3f\u0d7d_\u0d2e\u0d47\u0d2f\u0d4d_\u0d1c\u0d42\u0d7a_\u0d1c\u0d42\u0d32\u0d48_\u0d13\u0d17\u0d38\u0d4d\u0d31\u0d4d\u0d31\u0d4d_\u0d38\u0d46\u0d2a\u0d4d\u0d31\u0d4d\u0d31\u0d02\u0d2c\u0d7c_\u0d12\u0d15\u0d4d\u0d1f\u0d4b\u0d2c\u0d7c_\u0d28\u0d35\u0d02\u0d2c\u0d7c_\u0d21\u0d3f\u0d38\u0d02\u0d2c\u0d7c".split("_"),monthsShort:"\u0d1c\u0d28\u0d41._\u0d2b\u0d46\u0d2c\u0d4d\u0d30\u0d41._\u0d2e\u0d3e\u0d7c._\u0d0f\u0d2a\u0d4d\u0d30\u0d3f._\u0d2e\u0d47\u0d2f\u0d4d_\u0d1c\u0d42\u0d7a_\u0d1c\u0d42\u0d32\u0d48._\u0d13\u0d17._\u0d38\u0d46\u0d2a\u0d4d\u0d31\u0d4d\u0d31._\u0d12\u0d15\u0d4d\u0d1f\u0d4b._\u0d28\u0d35\u0d02._\u0d21\u0d3f\u0d38\u0d02.".split("_"),monthsParseExact:!0,weekdays:"\u0d1e\u0d3e\u0d2f\u0d31\u0d3e\u0d34\u0d4d\u0d1a_\u0d24\u0d3f\u0d19\u0d4d\u0d15\u0d33\u0d3e\u0d34\u0d4d\u0d1a_\u0d1a\u0d4a\u0d35\u0d4d\u0d35\u0d3e\u0d34\u0d4d\u0d1a_\u0d2c\u0d41\u0d27\u0d28\u0d3e\u0d34\u0d4d\u0d1a_\u0d35\u0d4d\u0d2f\u0d3e\u0d34\u0d3e\u0d34\u0d4d\u0d1a_\u0d35\u0d46\u0d33\u0d4d\u0d33\u0d3f\u0d2f\u0d3e\u0d34\u0d4d\u0d1a_\u0d36\u0d28\u0d3f\u0d2f\u0d3e\u0d34\u0d4d\u0d1a".split("_"),weekdaysShort:"\u0d1e\u0d3e\u0d2f\u0d7c_\u0d24\u0d3f\u0d19\u0d4d\u0d15\u0d7e_\u0d1a\u0d4a\u0d35\u0d4d\u0d35_\u0d2c\u0d41\u0d27\u0d7b_\u0d35\u0d4d\u0d2f\u0d3e\u0d34\u0d02_\u0d35\u0d46\u0d33\u0d4d\u0d33\u0d3f_\u0d36\u0d28\u0d3f".split("_"),weekdaysMin:"\u0d1e\u0d3e_\u0d24\u0d3f_\u0d1a\u0d4a_\u0d2c\u0d41_\u0d35\u0d4d\u0d2f\u0d3e_\u0d35\u0d46_\u0d36".split("_"),longDateFormat:{LT:"A h:mm -\u0d28\u0d41",LTS:"A h:mm:ss -\u0d28\u0d41",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm -\u0d28\u0d41",LLLL:"dddd, D MMMM YYYY, A h:mm -\u0d28\u0d41"},calendar:{sameDay:"[\u0d07\u0d28\u0d4d\u0d28\u0d4d] LT",nextDay:"[\u0d28\u0d3e\u0d33\u0d46] LT",nextWeek:"dddd, LT",lastDay:"[\u0d07\u0d28\u0d4d\u0d28\u0d32\u0d46] LT",lastWeek:"[\u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d",past:"%s \u0d2e\u0d41\u0d7b\u0d2a\u0d4d",s:"\u0d05\u0d7d\u0d2a \u0d28\u0d3f\u0d2e\u0d3f\u0d37\u0d19\u0d4d\u0d19\u0d7e",ss:"%d \u0d38\u0d46\u0d15\u0d4d\u0d15\u0d7b\u0d21\u0d4d",m:"\u0d12\u0d30\u0d41 \u0d2e\u0d3f\u0d28\u0d3f\u0d31\u0d4d\u0d31\u0d4d",mm:"%d \u0d2e\u0d3f\u0d28\u0d3f\u0d31\u0d4d\u0d31\u0d4d",h:"\u0d12\u0d30\u0d41 \u0d2e\u0d23\u0d3f\u0d15\u0d4d\u0d15\u0d42\u0d7c",hh:"%d \u0d2e\u0d23\u0d3f\u0d15\u0d4d\u0d15\u0d42\u0d7c",d:"\u0d12\u0d30\u0d41 \u0d26\u0d3f\u0d35\u0d38\u0d02",dd:"%d \u0d26\u0d3f\u0d35\u0d38\u0d02",M:"\u0d12\u0d30\u0d41 \u0d2e\u0d3e\u0d38\u0d02",MM:"%d \u0d2e\u0d3e\u0d38\u0d02",y:"\u0d12\u0d30\u0d41 \u0d35\u0d7c\u0d37\u0d02",yy:"%d \u0d35\u0d7c\u0d37\u0d02"},meridiemParse:/\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f|\u0d30\u0d3e\u0d35\u0d3f\u0d32\u0d46|\u0d09\u0d1a\u0d4d\u0d1a \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d|\u0d35\u0d48\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d47\u0d30\u0d02|\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f/i,meridiemHour:function(n,t){return 12===n&&(n=0),"\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f"===t&&n>=4||"\u0d09\u0d1a\u0d4d\u0d1a \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d"===t||"\u0d35\u0d48\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d47\u0d30\u0d02"===t?n+12:n},meridiem:function(n,t,e){return n<4?"\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f":n<12?"\u0d30\u0d3e\u0d35\u0d3f\u0d32\u0d46":n<17?"\u0d09\u0d1a\u0d4d\u0d1a \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d":n<20?"\u0d35\u0d48\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d47\u0d30\u0d02":"\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f"}})}(e("PJh5"))},ooba:function(n,t,e){!function(n){"use strict";n.defineLocale("ms",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(n,t){return 12===n&&(n=0),"pagi"===t?n:"tengahari"===t?n>=11?n:n+12:"petang"===t||"malam"===t?n+12:void 0},meridiem:function(n,t,e){return n<11?"pagi":n<15?"tengahari":n<19?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",ss:"%d saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}(e("PJh5"))},"pU/0":function(n,t,e){"use strict";e.d(t,"a",function(){return r});var l=e("TToO"),r=function(n){function t(){var t=n.call(this,"argument out of range");this.name=t.name="ArgumentOutOfRangeError",this.stack=t.stack,this.message=t.message}return Object(l.__extends)(t,n),t}(Error)},pfs9:function(n,t,e){!function(n){"use strict";var t={1:"\u0a67",2:"\u0a68",3:"\u0a69",4:"\u0a6a",5:"\u0a6b",6:"\u0a6c",7:"\u0a6d",8:"\u0a6e",9:"\u0a6f",0:"\u0a66"},e={"\u0a67":"1","\u0a68":"2","\u0a69":"3","\u0a6a":"4","\u0a6b":"5","\u0a6c":"6","\u0a6d":"7","\u0a6e":"8","\u0a6f":"9","\u0a66":"0"};n.defineLocale("pa-in",{months:"\u0a1c\u0a28\u0a35\u0a30\u0a40_\u0a2b\u0a3c\u0a30\u0a35\u0a30\u0a40_\u0a2e\u0a3e\u0a30\u0a1a_\u0a05\u0a2a\u0a4d\u0a30\u0a48\u0a32_\u0a2e\u0a08_\u0a1c\u0a42\u0a28_\u0a1c\u0a41\u0a32\u0a3e\u0a08_\u0a05\u0a17\u0a38\u0a24_\u0a38\u0a24\u0a70\u0a2c\u0a30_\u0a05\u0a15\u0a24\u0a42\u0a2c\u0a30_\u0a28\u0a35\u0a70\u0a2c\u0a30_\u0a26\u0a38\u0a70\u0a2c\u0a30".split("_"),monthsShort:"\u0a1c\u0a28\u0a35\u0a30\u0a40_\u0a2b\u0a3c\u0a30\u0a35\u0a30\u0a40_\u0a2e\u0a3e\u0a30\u0a1a_\u0a05\u0a2a\u0a4d\u0a30\u0a48\u0a32_\u0a2e\u0a08_\u0a1c\u0a42\u0a28_\u0a1c\u0a41\u0a32\u0a3e\u0a08_\u0a05\u0a17\u0a38\u0a24_\u0a38\u0a24\u0a70\u0a2c\u0a30_\u0a05\u0a15\u0a24\u0a42\u0a2c\u0a30_\u0a28\u0a35\u0a70\u0a2c\u0a30_\u0a26\u0a38\u0a70\u0a2c\u0a30".split("_"),weekdays:"\u0a10\u0a24\u0a35\u0a3e\u0a30_\u0a38\u0a4b\u0a2e\u0a35\u0a3e\u0a30_\u0a2e\u0a70\u0a17\u0a32\u0a35\u0a3e\u0a30_\u0a2c\u0a41\u0a27\u0a35\u0a3e\u0a30_\u0a35\u0a40\u0a30\u0a35\u0a3e\u0a30_\u0a38\u0a3c\u0a41\u0a71\u0a15\u0a30\u0a35\u0a3e\u0a30_\u0a38\u0a3c\u0a28\u0a40\u0a1a\u0a30\u0a35\u0a3e\u0a30".split("_"),weekdaysShort:"\u0a10\u0a24_\u0a38\u0a4b\u0a2e_\u0a2e\u0a70\u0a17\u0a32_\u0a2c\u0a41\u0a27_\u0a35\u0a40\u0a30_\u0a38\u0a3c\u0a41\u0a15\u0a30_\u0a38\u0a3c\u0a28\u0a40".split("_"),weekdaysMin:"\u0a10\u0a24_\u0a38\u0a4b\u0a2e_\u0a2e\u0a70\u0a17\u0a32_\u0a2c\u0a41\u0a27_\u0a35\u0a40\u0a30_\u0a38\u0a3c\u0a41\u0a15\u0a30_\u0a38\u0a3c\u0a28\u0a40".split("_"),longDateFormat:{LT:"A h:mm \u0a35\u0a1c\u0a47",LTS:"A h:mm:ss \u0a35\u0a1c\u0a47",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u0a35\u0a1c\u0a47",LLLL:"dddd, D MMMM YYYY, A h:mm \u0a35\u0a1c\u0a47"},calendar:{sameDay:"[\u0a05\u0a1c] LT",nextDay:"[\u0a15\u0a32] LT",nextWeek:"dddd, LT",lastDay:"[\u0a15\u0a32] LT",lastWeek:"[\u0a2a\u0a3f\u0a1b\u0a32\u0a47] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0a35\u0a3f\u0a71\u0a1a",past:"%s \u0a2a\u0a3f\u0a1b\u0a32\u0a47",s:"\u0a15\u0a41\u0a1d \u0a38\u0a15\u0a3f\u0a70\u0a1f",ss:"%d \u0a38\u0a15\u0a3f\u0a70\u0a1f",m:"\u0a07\u0a15 \u0a2e\u0a3f\u0a70\u0a1f",mm:"%d \u0a2e\u0a3f\u0a70\u0a1f",h:"\u0a07\u0a71\u0a15 \u0a18\u0a70\u0a1f\u0a3e",hh:"%d \u0a18\u0a70\u0a1f\u0a47",d:"\u0a07\u0a71\u0a15 \u0a26\u0a3f\u0a28",dd:"%d \u0a26\u0a3f\u0a28",M:"\u0a07\u0a71\u0a15 \u0a2e\u0a39\u0a40\u0a28\u0a3e",MM:"%d \u0a2e\u0a39\u0a40\u0a28\u0a47",y:"\u0a07\u0a71\u0a15 \u0a38\u0a3e\u0a32",yy:"%d \u0a38\u0a3e\u0a32"},preparse:function(n){return n.replace(/[\u0a67\u0a68\u0a69\u0a6a\u0a6b\u0a6c\u0a6d\u0a6e\u0a6f\u0a66]/g,function(n){return e[n]})},postformat:function(n){return n.replace(/\d/g,function(n){return t[n]})},meridiemParse:/\u0a30\u0a3e\u0a24|\u0a38\u0a35\u0a47\u0a30|\u0a26\u0a41\u0a2a\u0a39\u0a3f\u0a30|\u0a38\u0a3c\u0a3e\u0a2e/,meridiemHour:function(n,t){return 12===n&&(n=0),"\u0a30\u0a3e\u0a24"===t?n<4?n:n+12:"\u0a38\u0a35\u0a47\u0a30"===t?n:"\u0a26\u0a41\u0a2a\u0a39\u0a3f\u0a30"===t?n>=10?n:n+12:"\u0a38\u0a3c\u0a3e\u0a2e"===t?n+12:void 0},meridiem:function(n,t,e){return n<4?"\u0a30\u0a3e\u0a24":n<10?"\u0a38\u0a35\u0a47\u0a30":n<17?"\u0a26\u0a41\u0a2a\u0a39\u0a3f\u0a30":n<20?"\u0a38\u0a3c\u0a3e\u0a2e":"\u0a30\u0a3e\u0a24"},week:{dow:0,doy:6}})}(e("PJh5"))},rIuo:function(n,t,e){!function(n){"use strict";var t=["\u0796\u07ac\u0782\u07aa\u0787\u07a6\u0783\u07a9","\u078a\u07ac\u0784\u07b0\u0783\u07aa\u0787\u07a6\u0783\u07a9","\u0789\u07a7\u0783\u07a8\u0797\u07aa","\u0787\u07ad\u0795\u07b0\u0783\u07a9\u078d\u07aa","\u0789\u07ad","\u0796\u07ab\u0782\u07b0","\u0796\u07aa\u078d\u07a6\u0787\u07a8","\u0787\u07af\u078e\u07a6\u0790\u07b0\u0793\u07aa","\u0790\u07ac\u0795\u07b0\u0793\u07ac\u0789\u07b0\u0784\u07a6\u0783\u07aa","\u0787\u07ae\u0786\u07b0\u0793\u07af\u0784\u07a6\u0783\u07aa","\u0782\u07ae\u0788\u07ac\u0789\u07b0\u0784\u07a6\u0783\u07aa","\u0791\u07a8\u0790\u07ac\u0789\u07b0\u0784\u07a6\u0783\u07aa"],e=["\u0787\u07a7\u078b\u07a8\u0787\u07b0\u078c\u07a6","\u0780\u07af\u0789\u07a6","\u0787\u07a6\u0782\u07b0\u078e\u07a7\u0783\u07a6","\u0784\u07aa\u078b\u07a6","\u0784\u07aa\u0783\u07a7\u0790\u07b0\u078a\u07a6\u078c\u07a8","\u0780\u07aa\u0786\u07aa\u0783\u07aa","\u0780\u07ae\u0782\u07a8\u0780\u07a8\u0783\u07aa"];n.defineLocale("dv",{months:t,monthsShort:t,weekdays:e,weekdaysShort:e,weekdaysMin:"\u0787\u07a7\u078b\u07a8_\u0780\u07af\u0789\u07a6_\u0787\u07a6\u0782\u07b0_\u0784\u07aa\u078b\u07a6_\u0784\u07aa\u0783\u07a7_\u0780\u07aa\u0786\u07aa_\u0780\u07ae\u0782\u07a8".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/M/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0789\u0786|\u0789\u078a/,isPM:function(n){return"\u0789\u078a"===n},meridiem:function(n,t,e){return n<12?"\u0789\u0786":"\u0789\u078a"},calendar:{sameDay:"[\u0789\u07a8\u0787\u07a6\u078b\u07aa] LT",nextDay:"[\u0789\u07a7\u078b\u07a6\u0789\u07a7] LT",nextWeek:"dddd LT",lastDay:"[\u0787\u07a8\u0787\u07b0\u0794\u07ac] LT",lastWeek:"[\u078a\u07a7\u0787\u07a8\u078c\u07aa\u0788\u07a8] dddd LT",sameElse:"L"},relativeTime:{future:"\u078c\u07ac\u0783\u07ad\u078e\u07a6\u0787\u07a8 %s",past:"\u0786\u07aa\u0783\u07a8\u0782\u07b0 %s",s:"\u0790\u07a8\u0786\u07aa\u0782\u07b0\u078c\u07aa\u0786\u07ae\u0785\u07ac\u0787\u07b0",ss:"d% \u0790\u07a8\u0786\u07aa\u0782\u07b0\u078c\u07aa",m:"\u0789\u07a8\u0782\u07a8\u0793\u07ac\u0787\u07b0",mm:"\u0789\u07a8\u0782\u07a8\u0793\u07aa %d",h:"\u078e\u07a6\u0791\u07a8\u0787\u07a8\u0783\u07ac\u0787\u07b0",hh:"\u078e\u07a6\u0791\u07a8\u0787\u07a8\u0783\u07aa %d",d:"\u078b\u07aa\u0788\u07a6\u0780\u07ac\u0787\u07b0",dd:"\u078b\u07aa\u0788\u07a6\u0790\u07b0 %d",M:"\u0789\u07a6\u0780\u07ac\u0787\u07b0",MM:"\u0789\u07a6\u0790\u07b0 %d",y:"\u0787\u07a6\u0780\u07a6\u0783\u07ac\u0787\u07b0",yy:"\u0787\u07a6\u0780\u07a6\u0783\u07aa %d"},preparse:function(n){return n.replace(/\u060c/g,",")},postformat:function(n){return n.replace(/,/g,"\u060c")},week:{dow:7,doy:12}})}(e("PJh5"))},rtsW:function(n,t,e){!function(n){"use strict";var t={1:"\u0ae7",2:"\u0ae8",3:"\u0ae9",4:"\u0aea",5:"\u0aeb",6:"\u0aec",7:"\u0aed",8:"\u0aee",9:"\u0aef",0:"\u0ae6"},e={"\u0ae7":"1","\u0ae8":"2","\u0ae9":"3","\u0aea":"4","\u0aeb":"5","\u0aec":"6","\u0aed":"7","\u0aee":"8","\u0aef":"9","\u0ae6":"0"};n.defineLocale("gu",{months:"\u0a9c\u0abe\u0aa8\u0acd\u0aaf\u0ac1\u0a86\u0ab0\u0ac0_\u0aab\u0ac7\u0aac\u0acd\u0ab0\u0ac1\u0a86\u0ab0\u0ac0_\u0aae\u0abe\u0ab0\u0acd\u0a9a_\u0a8f\u0aaa\u0acd\u0ab0\u0abf\u0ab2_\u0aae\u0ac7_\u0a9c\u0ac2\u0aa8_\u0a9c\u0ac1\u0ab2\u0abe\u0a88_\u0a91\u0a97\u0ab8\u0acd\u0a9f_\u0ab8\u0aaa\u0acd\u0a9f\u0ac7\u0aae\u0acd\u0aac\u0ab0_\u0a91\u0a95\u0acd\u0a9f\u0acd\u0aac\u0ab0_\u0aa8\u0ab5\u0ac7\u0aae\u0acd\u0aac\u0ab0_\u0aa1\u0abf\u0ab8\u0ac7\u0aae\u0acd\u0aac\u0ab0".split("_"),monthsShort:"\u0a9c\u0abe\u0aa8\u0acd\u0aaf\u0ac1._\u0aab\u0ac7\u0aac\u0acd\u0ab0\u0ac1._\u0aae\u0abe\u0ab0\u0acd\u0a9a_\u0a8f\u0aaa\u0acd\u0ab0\u0abf._\u0aae\u0ac7_\u0a9c\u0ac2\u0aa8_\u0a9c\u0ac1\u0ab2\u0abe._\u0a91\u0a97._\u0ab8\u0aaa\u0acd\u0a9f\u0ac7._\u0a91\u0a95\u0acd\u0a9f\u0acd._\u0aa8\u0ab5\u0ac7._\u0aa1\u0abf\u0ab8\u0ac7.".split("_"),monthsParseExact:!0,weekdays:"\u0ab0\u0ab5\u0abf\u0ab5\u0abe\u0ab0_\u0ab8\u0acb\u0aae\u0ab5\u0abe\u0ab0_\u0aae\u0a82\u0a97\u0ab3\u0ab5\u0abe\u0ab0_\u0aac\u0ac1\u0aa7\u0acd\u0ab5\u0abe\u0ab0_\u0a97\u0ac1\u0ab0\u0ac1\u0ab5\u0abe\u0ab0_\u0ab6\u0ac1\u0a95\u0acd\u0ab0\u0ab5\u0abe\u0ab0_\u0ab6\u0aa8\u0abf\u0ab5\u0abe\u0ab0".split("_"),weekdaysShort:"\u0ab0\u0ab5\u0abf_\u0ab8\u0acb\u0aae_\u0aae\u0a82\u0a97\u0ab3_\u0aac\u0ac1\u0aa7\u0acd_\u0a97\u0ac1\u0ab0\u0ac1_\u0ab6\u0ac1\u0a95\u0acd\u0ab0_\u0ab6\u0aa8\u0abf".split("_"),weekdaysMin:"\u0ab0_\u0ab8\u0acb_\u0aae\u0a82_\u0aac\u0ac1_\u0a97\u0ac1_\u0ab6\u0ac1_\u0ab6".split("_"),longDateFormat:{LT:"A h:mm \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7",LTS:"A h:mm:ss \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7",LLLL:"dddd, D MMMM YYYY, A h:mm \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7"},calendar:{sameDay:"[\u0a86\u0a9c] LT",nextDay:"[\u0a95\u0abe\u0ab2\u0ac7] LT",nextWeek:"dddd, LT",lastDay:"[\u0a97\u0a87\u0a95\u0abe\u0ab2\u0ac7] LT",lastWeek:"[\u0aaa\u0abe\u0a9b\u0ab2\u0abe] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0aae\u0abe",past:"%s \u0aaa\u0ac7\u0ab9\u0ab2\u0abe",s:"\u0a85\u0aae\u0ac1\u0a95 \u0aaa\u0ab3\u0acb",ss:"%d \u0ab8\u0ac7\u0a95\u0a82\u0aa1",m:"\u0a8f\u0a95 \u0aae\u0abf\u0aa8\u0abf\u0a9f",mm:"%d \u0aae\u0abf\u0aa8\u0abf\u0a9f",h:"\u0a8f\u0a95 \u0a95\u0ab2\u0abe\u0a95",hh:"%d \u0a95\u0ab2\u0abe\u0a95",d:"\u0a8f\u0a95 \u0aa6\u0abf\u0ab5\u0ab8",dd:"%d \u0aa6\u0abf\u0ab5\u0ab8",M:"\u0a8f\u0a95 \u0aae\u0ab9\u0abf\u0aa8\u0acb",MM:"%d \u0aae\u0ab9\u0abf\u0aa8\u0acb",y:"\u0a8f\u0a95 \u0ab5\u0ab0\u0acd\u0ab7",yy:"%d \u0ab5\u0ab0\u0acd\u0ab7"},preparse:function(n){return n.replace(/[\u0ae7\u0ae8\u0ae9\u0aea\u0aeb\u0aec\u0aed\u0aee\u0aef\u0ae6]/g,function(n){return e[n]})},postformat:function(n){return n.replace(/\d/g,function(n){return t[n]})},meridiemParse:/\u0ab0\u0abe\u0aa4|\u0aac\u0aaa\u0acb\u0ab0|\u0ab8\u0ab5\u0abe\u0ab0|\u0ab8\u0abe\u0a82\u0a9c/,meridiemHour:function(n,t){return 12===n&&(n=0),"\u0ab0\u0abe\u0aa4"===t?n<4?n:n+12:"\u0ab8\u0ab5\u0abe\u0ab0"===t?n:"\u0aac\u0aaa\u0acb\u0ab0"===t?n>=10?n:n+12:"\u0ab8\u0abe\u0a82\u0a9c"===t?n+12:void 0},meridiem:function(n,t,e){return n<4?"\u0ab0\u0abe\u0aa4":n<10?"\u0ab8\u0ab5\u0abe\u0ab0":n<17?"\u0aac\u0aaa\u0acb\u0ab0":n<20?"\u0ab8\u0abe\u0a82\u0a9c":"\u0ab0\u0abe\u0aa4"},week:{dow:0,doy:6}})}(e("PJh5"))},rxKx:function(n,t,e){var l;!function(r,i,o,s){"use strict";var a,u=["","webkit","Moz","MS","ms","o"],c=i.createElement("div"),d="function",h=Math.round,p=Math.abs,f=Date.now;function _(n,t,e){return setTimeout(x(n,e),t)}function m(n,t,e){return!!Array.isArray(n)&&(g(n,e[t],e),!0)}function g(n,t,e){var l;if(n)if(n.forEach)n.forEach(t,e);else if(n.length!==s)for(l=0;l\s*\(/gm,"{anonymous}()@"):"Unknown Stack Trace",i=r.console&&(r.console.warn||r.console.log);return i&&i.call(r.console,l,e),n.apply(this,arguments)}}a="function"!=typeof Object.assign?function(n){if(n===s||null===n)throw new TypeError("Cannot convert undefined or null to object");for(var t=Object(n),e=1;e-1}function L(n){return n.trim().split(/\s+/g)}function P(n,t,e){if(n.indexOf&&!e)return n.indexOf(t);for(var l=0;le[t]}):l.sort()),l}function E(n,t){for(var e,l,r=t[0].toUpperCase()+t.slice(1),i=0;i1&&!e.firstMultiple?e.firstMultiple=tn(t):1===r&&(e.firstMultiple=!1);var i=e.firstInput,o=e.firstMultiple,a=o?o.center:i.center,u=t.center=en(l);t.timeStamp=f(),t.deltaTime=t.timeStamp-i.timeStamp,t.angle=sn(a,u),t.distance=on(a,u),function(n,t){var e=t.center,l=n.offsetDelta||{},r=n.prevDelta||{},i=n.prevInput||{};t.eventType!==F&&i.eventType!==B||(r=n.prevDelta={x:i.deltaX||0,y:i.deltaY||0},l=n.offsetDelta={x:e.x,y:e.y}),t.deltaX=r.x+(e.x-l.x),t.deltaY=r.y+(e.y-l.y)}(e,t),t.offsetDirection=rn(t.deltaX,t.deltaY);var c,d,h=ln(t.deltaTime,t.deltaX,t.deltaY);t.overallVelocityX=h.x,t.overallVelocityY=h.y,t.overallVelocity=p(h.x)>p(h.y)?h.x:h.y,t.scale=o?(c=o.pointers,on((d=l)[0],d[1],Z)/on(c[0],c[1],Z)):1,t.rotation=o?function(n,t){return sn(l[1],l[0],Z)+sn(n[1],n[0],Z)}(o.pointers):0,t.maxPointers=e.prevInput?t.pointers.length>e.prevInput.maxPointers?t.pointers.length:e.prevInput.maxPointers:t.pointers.length,function(n,t){var e,l,r,i,o=n.lastInterval||t,a=t.timeStamp-o.timeStamp;if(t.eventType!=V&&(a>N||o.velocity===s)){var u=t.deltaX-o.deltaX,c=t.deltaY-o.deltaY,d=ln(a,u,c);l=d.x,r=d.y,e=p(d.x)>p(d.y)?d.x:d.y,i=rn(u,c),n.lastInterval=t}else e=o.velocity,l=o.velocityX,r=o.velocityY,i=o.direction;t.velocity=e,t.velocityX=l,t.velocityY=r,t.direction=i}(e,t);var _=n.element;O(t.srcEvent.target,_)&&(_=t.srcEvent.target),t.target=_}(n,e),n.emit("hammer.input",e),n.recognize(e),n.session.prevInput=e}function tn(n){for(var t=[],e=0;e=p(t)?n<0?z:U:t<0?G:q}function on(n,t,e){e||(e=X);var l=t[e[0]]-n[e[0]],r=t[e[1]]-n[e[1]];return Math.sqrt(l*l+r*r)}function sn(n,t,e){return e||(e=X),180*Math.atan2(t[e[1]]-n[e[1]],t[e[0]]-n[e[0]])/Math.PI}$.prototype={handler:function(){},init:function(){this.evEl&&C(this.element,this.evEl,this.domHandler),this.evTarget&&C(this.target,this.evTarget,this.domHandler),this.evWin&&C(j(this.element),this.evWin,this.domHandler)},destroy:function(){this.evEl&&S(this.element,this.evEl,this.domHandler),this.evTarget&&S(this.target,this.evTarget,this.domHandler),this.evWin&&S(j(this.element),this.evWin,this.domHandler)}};var an={mousedown:F,mousemove:2,mouseup:B},un="mousedown",cn="mousemove mouseup";function dn(){this.evEl=un,this.evWin=cn,this.pressed=!1,$.apply(this,arguments)}w(dn,$,{handler:function(n){var t=an[n.type];t&F&&0===n.button&&(this.pressed=!0),2&t&&1!==n.which&&(t=B),this.pressed&&(t&B&&(this.pressed=!1),this.callback(this.manager,t,{pointers:[n],changedPointers:[n],pointerType:"mouse",srcEvent:n}))}});var hn={pointerdown:F,pointermove:2,pointerup:B,pointercancel:V,pointerout:V},pn={2:"touch",3:"pen",4:"mouse",5:"kinect"},fn="pointerdown",_n="pointermove pointerup pointercancel";function mn(){this.evEl=fn,this.evWin=_n,$.apply(this,arguments),this.store=this.manager.session.pointerEvents=[]}r.MSPointerEvent&&!r.PointerEvent&&(fn="MSPointerDown",_n="MSPointerMove MSPointerUp MSPointerCancel"),w(mn,$,{handler:function(n){var t=this.store,e=!1,l=n.type.toLowerCase().replace("ms",""),r=hn[l],i=pn[n.pointerType]||n.pointerType,o="touch"==i,s=P(t,n.pointerId,"pointerId");r&F&&(0===n.button||o)?s<0&&(t.push(n),s=t.length-1):r&(B|V)&&(e=!0),s<0||(t[s]=n,this.callback(this.manager,r,{pointers:t,changedPointers:[n],pointerType:i,srcEvent:n}),e&&t.splice(s,1))}});var gn={touchstart:F,touchmove:2,touchend:B,touchcancel:V},yn="touchstart",bn="touchstart touchmove touchend touchcancel";function vn(){this.evTarget=yn,this.evWin=bn,this.started=!1,$.apply(this,arguments)}w(vn,$,{handler:function(n){var t=gn[n.type];if(t===F&&(this.started=!0),this.started){var e=(function(n,t){var e=D(n.touches),l=D(n.changedTouches);return t&(B|V)&&(e=A(e.concat(l),"identifier",!0)),[e,l]}).call(this,n,t);t&(B|V)&&e[0].length-e[1].length==0&&(this.started=!1),this.callback(this.manager,t,{pointers:e[0],changedPointers:e[1],pointerType:"touch",srcEvent:n})}}});var wn={touchstart:F,touchmove:2,touchend:B,touchcancel:V},xn="touchstart touchmove touchend touchcancel";function Mn(){this.evTarget=xn,this.targetIds={},$.apply(this,arguments)}w(Mn,$,{handler:function(n){var t=wn[n.type],e=(function(n,t){var e=D(n.touches),l=this.targetIds;if(t&(2|F)&&1===e.length)return l[e[0].identifier]=!0,[e,e];var r,i,o=D(n.changedTouches),s=[],a=this.target;if(i=e.filter(function(n){return O(n.target,a)}),t===F)for(r=0;r-1&&l.splice(n,1)},kn)}}w(Cn,$,{handler:function(n,t,e){var l="mouse"==e.pointerType;if(!(l&&e.sourceCapabilities&&e.sourceCapabilities.firesTouchEvents)){if("touch"==e.pointerType)(function(n,t){n&F?(this.primaryTouch=t.changedPointers[0].identifier,Sn.call(this,t)):n&(B|V)&&Sn.call(this,t)}).call(this,t,e);else if(l&&(function(n){for(var t=n.srcEvent.clientX,e=n.srcEvent.clientY,l=0;l-1&&this.requireFail.splice(t,1),this},hasRequireFailures:function(){return this.requireFail.length>0},canRecognizeWith:function(n){return!!this.simultaneous[n.id]},emit:function(n){var t=this,e=this.state;function l(e){t.manager.emit(e,n)}e=Yn&&l(t.options.event+Hn(e))},tryEmit:function(n){if(this.canEmit())return this.emit(n);this.state=32},canEmit:function(){for(var n=0;nt.threshold&&r&t.direction},attrTest:function(n){return Bn.prototype.attrTest.call(this,n)&&(this.state&An||!(this.state&An)&&this.directionTest(n))},emit:function(n){this.pX=n.deltaX,this.pY=n.deltaY;var t=Nn(n.direction);t&&(n.additionalEvent=this.options.event+t),this._super.emit.call(this,n)}}),w(Wn,Bn,{defaults:{event:"pinch",threshold:0,pointers:2},getTouchAction:function(){return["none"]},attrTest:function(n){return this._super.attrTest.call(this,n)&&(Math.abs(n.scale-1)>this.options.threshold||this.state&An)},emit:function(n){1!==n.scale&&(n.additionalEvent=this.options.event+(n.scale<1?"in":"out")),this._super.emit.call(this,n)}}),w(zn,Rn,{defaults:{event:"press",pointers:1,time:251,threshold:9},getTouchAction:function(){return["auto"]},process:function(n){var t=this.options,e=n.pointers.length===t.pointers,l=n.distancet.time;if(this._input=n,!l||!e||n.eventType&(B|V)&&!r)this.reset();else if(n.eventType&F)this.reset(),this._timer=_(function(){this.state=jn,this.tryEmit()},t.time,this);else if(n.eventType&B)return jn;return 32},reset:function(){clearTimeout(this._timer)},emit:function(n){this.state===jn&&(n&&n.eventType&B?this.manager.emit(this.options.event+"up",n):(this._input.timeStamp=f(),this.manager.emit(this.options.event,this._input)))}}),w(Un,Bn,{defaults:{event:"rotate",threshold:0,pointers:2},getTouchAction:function(){return["none"]},attrTest:function(n){return this._super.attrTest.call(this,n)&&(Math.abs(n.rotation)>this.options.threshold||this.state&An)}}),w(Gn,Bn,{defaults:{event:"swipe",threshold:10,velocity:.3,direction:J|Q,pointers:1},getTouchAction:function(){return Vn.prototype.getTouchAction.call(this)},attrTest:function(n){var t,e=this.options.direction;return e&(J|Q)?t=n.overallVelocity:e&J?t=n.overallVelocityX:e&Q&&(t=n.overallVelocityY),this._super.attrTest.call(this,n)&&e&n.offsetDirection&&n.distance>this.options.threshold&&n.maxPointers==this.options.pointers&&p(t)>this.options.velocity&&n.eventType&B},emit:function(n){var t=Nn(n.offsetDirection);t&&this.manager.emit(this.options.event+t,n),this.manager.emit(this.options.event,n)}}),w(qn,Rn,{defaults:{event:"tap",pointers:1,taps:1,interval:300,time:250,threshold:9,posThreshold:10},getTouchAction:function(){return["manipulation"]},process:function(n){var t=this.options,e=n.pointers.length===t.pointers,l=n.distance1&&n<5&&1!=~~(n/10)}function r(n,t,e,r){var i=n+" ";switch(e){case"s":return t||r?"p\xe1r sekund":"p\xe1r sekundami";case"ss":return t||r?i+(l(n)?"sekundy":"sekund"):i+"sekundami";case"m":return t?"minuta":r?"minutu":"minutou";case"mm":return t||r?i+(l(n)?"minuty":"minut"):i+"minutami";case"h":return t?"hodina":r?"hodinu":"hodinou";case"hh":return t||r?i+(l(n)?"hodiny":"hodin"):i+"hodinami";case"d":return t||r?"den":"dnem";case"dd":return t||r?i+(l(n)?"dny":"dn\xed"):i+"dny";case"M":return t||r?"m\u011bs\xedc":"m\u011bs\xedcem";case"MM":return t||r?i+(l(n)?"m\u011bs\xedce":"m\u011bs\xedc\u016f"):i+"m\u011bs\xedci";case"y":return t||r?"rok":"rokem";case"yy":return t||r?i+(l(n)?"roky":"let"):i+"lety"}}n.defineLocale("cs",{months:t,monthsShort:e,monthsParse:function(n,t){var e,l=[];for(e=0;e<12;e++)l[e]=new RegExp("^"+n[e]+"$|^"+t[e]+"$","i");return l}(t,e),shortMonthsParse:function(n){var t,e=[];for(t=0;t<12;t++)e[t]=new RegExp("^"+n[t]+"$","i");return e}(e),longMonthsParse:function(n){var t,e=[];for(t=0;t<12;t++)e[t]=new RegExp("^"+n[t]+"$","i");return e}(t),weekdays:"ned\u011ble_pond\u011bl\xed_\xfater\xfd_st\u0159eda_\u010dtvrtek_p\xe1tek_sobota".split("_"),weekdaysShort:"ne_po_\xfat_st_\u010dt_p\xe1_so".split("_"),weekdaysMin:"ne_po_\xfat_st_\u010dt_p\xe1_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm",l:"D. M. YYYY"},calendar:{sameDay:"[dnes v] LT",nextDay:"[z\xedtra v] LT",nextWeek:function(){switch(this.day()){case 0:return"[v ned\u011bli v] LT";case 1:case 2:return"[v] dddd [v] LT";case 3:return"[ve st\u0159edu v] LT";case 4:return"[ve \u010dtvrtek v] LT";case 5:return"[v p\xe1tek v] LT";case 6:return"[v sobotu v] LT"}},lastDay:"[v\u010dera v] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulou ned\u011bli v] LT";case 1:case 2:return"[minul\xe9] dddd [v] LT";case 3:return"[minulou st\u0159edu v] LT";case 4:case 5:return"[minul\xfd] dddd [v] LT";case 6:return"[minulou sobotu v] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"p\u0159ed %s",s:r,ss:r,m:r,mm:r,h:r,hh:r,d:r,dd:r,M:r,MM:r,y:r,yy:r},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(e("PJh5"))},svD2:function(n,t,e){!function(n){"use strict";var t={words:{ss:["sekund","sekunda","sekundi"],m:["jedan minut","jednog minuta"],mm:["minut","minuta","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mjesec","mjeseca","mjeseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(n,t){return 1===n?t[0]:n>=2&&n<=4?t[1]:t[2]},translate:function(n,e,l){var r=t.words[l];return 1===l.length?e?r[0]:r[1]:n+" "+t.correctGrammaticalCase(n,r)}};n.defineLocale("me",{months:"januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_\u010detvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._\u010det._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010de_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sjutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju\u010de u] LT",lastWeek:function(){return["[pro\u0161le] [nedjelje] [u] LT","[pro\u0161log] [ponedjeljka] [u] LT","[pro\u0161log] [utorka] [u] LT","[pro\u0161le] [srijede] [u] LT","[pro\u0161log] [\u010detvrtka] [u] LT","[pro\u0161log] [petka] [u] LT","[pro\u0161le] [subote] [u] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"nekoliko sekundi",ss:t.translate,m:t.translate,mm:t.translate,h:t.translate,hh:t.translate,d:"dan",dd:t.translate,M:"mjesec",MM:t.translate,y:"godinu",yy:t.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(e("PJh5"))},t7NR:function(n,t,e){"use strict";e.d(t,"a",function(){return l});var l={closed:!0,next:function(n){},error:function(n){throw n},complete:function(){}}},tLDX:function(n,t,e){"use strict";e.d(t,"a",function(){return r});var l=e("AMGY").a.Symbol,r="function"==typeof l&&"function"==typeof l.for?l.for("rxSubscriber"):"@@rxSubscriber"},tZ2B:function(n,t,e){"use strict";e.d(t,"a",function(){return r});var l=e("TToO"),r=function(n){function t(){n.apply(this,arguments)}return Object(l.__extends)(t,n),t.prototype.notifyNext=function(n,t,e,l,r){this.destination.next(t)},t.prototype.notifyError=function(n,t){this.destination.error(n)},t.prototype.notifyComplete=function(n){this.destination.complete()},t}(e("OVmG").a)},tkWw:function(n,t,e){!function(n){"use strict";n.defineLocale("ar-dz",{months:"\u062c\u0627\u0646\u0641\u064a_\u0641\u064a\u0641\u0631\u064a_\u0645\u0627\u0631\u0633_\u0623\u0641\u0631\u064a\u0644_\u0645\u0627\u064a_\u062c\u0648\u0627\u0646_\u062c\u0648\u064a\u0644\u064a\u0629_\u0623\u0648\u062a_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),monthsShort:"\u062c\u0627\u0646\u0641\u064a_\u0641\u064a\u0641\u0631\u064a_\u0645\u0627\u0631\u0633_\u0623\u0641\u0631\u064a\u0644_\u0645\u0627\u064a_\u062c\u0648\u0627\u0646_\u062c\u0648\u064a\u0644\u064a\u0629_\u0623\u0648\u062a_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0627\u062d\u062f_\u0627\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u0623\u062d_\u0625\u062b_\u062b\u0644\u0627_\u0623\u0631_\u062e\u0645_\u062c\u0645_\u0633\u0628".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},week:{dow:0,doy:4}})}(e("PJh5"))},tzHd:function(n,t,e){!function(n){"use strict";n.defineLocale("fr",{months:"janvier_f\xe9vrier_mars_avril_mai_juin_juillet_ao\xfbt_septembre_octobre_novembre_d\xe9cembre".split("_"),monthsShort:"janv._f\xe9vr._mars_avr._mai_juin_juil._ao\xfbt_sept._oct._nov._d\xe9c.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd\u2019hui \xe0] LT",nextDay:"[Demain \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[Hier \xe0] LT",lastWeek:"dddd [dernier \xe0] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|)/,ordinal:function(n,t){switch(t){case"D":return n+(1===n?"er":"");default:case"M":case"Q":case"DDD":case"d":return n+(1===n?"er":"e");case"w":case"W":return n+(1===n?"re":"e")}},week:{dow:1,doy:4}})}(e("PJh5"))},uSe8:function(n,t,e){!function(n){"use strict";var t=["\u062c\u0646\u0648\u0631\u06cc","\u0641\u0631\u0648\u0631\u06cc","\u0645\u0627\u0631\u0686","\u0627\u067e\u0631\u06cc\u0644","\u0645\u0626\u06cc","\u062c\u0648\u0646","\u062c\u0648\u0644\u0627\u0626\u06cc","\u0627\u06af\u0633\u062a","\u0633\u062a\u0645\u0628\u0631","\u0627\u06a9\u062a\u0648\u0628\u0631","\u0646\u0648\u0645\u0628\u0631","\u062f\u0633\u0645\u0628\u0631"],e=["\u0627\u062a\u0648\u0627\u0631","\u067e\u06cc\u0631","\u0645\u0646\u06af\u0644","\u0628\u062f\u06be","\u062c\u0645\u0639\u0631\u0627\u062a","\u062c\u0645\u0639\u06c1","\u06c1\u0641\u062a\u06c1"];n.defineLocale("ur",{months:t,monthsShort:t,weekdays:e,weekdaysShort:e,weekdaysMin:e,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd\u060c D MMMM YYYY HH:mm"},meridiemParse:/\u0635\u0628\u062d|\u0634\u0627\u0645/,isPM:function(n){return"\u0634\u0627\u0645"===n},meridiem:function(n,t,e){return n<12?"\u0635\u0628\u062d":"\u0634\u0627\u0645"},calendar:{sameDay:"[\u0622\u062c \u0628\u0648\u0642\u062a] LT",nextDay:"[\u06a9\u0644 \u0628\u0648\u0642\u062a] LT",nextWeek:"dddd [\u0628\u0648\u0642\u062a] LT",lastDay:"[\u06af\u0630\u0634\u062a\u06c1 \u0631\u0648\u0632 \u0628\u0648\u0642\u062a] LT",lastWeek:"[\u06af\u0630\u0634\u062a\u06c1] dddd [\u0628\u0648\u0642\u062a] LT",sameElse:"L"},relativeTime:{future:"%s \u0628\u0639\u062f",past:"%s \u0642\u0628\u0644",s:"\u0686\u0646\u062f \u0633\u06cc\u06a9\u0646\u0688",ss:"%d \u0633\u06cc\u06a9\u0646\u0688",m:"\u0627\u06cc\u06a9 \u0645\u0646\u0679",mm:"%d \u0645\u0646\u0679",h:"\u0627\u06cc\u06a9 \u06af\u06be\u0646\u0679\u06c1",hh:"%d \u06af\u06be\u0646\u0679\u06d2",d:"\u0627\u06cc\u06a9 \u062f\u0646",dd:"%d \u062f\u0646",M:"\u0627\u06cc\u06a9 \u0645\u0627\u06c1",MM:"%d \u0645\u0627\u06c1",y:"\u0627\u06cc\u06a9 \u0633\u0627\u0644",yy:"%d \u0633\u0627\u0644"},preparse:function(n){return n.replace(/\u060c/g,",")},postformat:function(n){return n.replace(/,/g,"\u060c")},week:{dow:1,doy:4}})}(e("PJh5"))},ujcs:function(n,t){t.read=function(n,t,e,l,r){var i,o,s=8*r-l-1,a=(1<>1,c=-7,d=e?r-1:0,h=e?-1:1,p=n[t+d];for(d+=h,i=p&(1<<-c)-1,p>>=-c,c+=s;c>0;i=256*i+n[t+d],d+=h,c-=8);for(o=i&(1<<-c)-1,i>>=-c,c+=l;c>0;o=256*o+n[t+d],d+=h,c-=8);if(0===i)i=1-u;else{if(i===a)return o?NaN:1/0*(p?-1:1);o+=Math.pow(2,l),i-=u}return(p?-1:1)*o*Math.pow(2,i-l)},t.write=function(n,t,e,l,r,i){var o,s,a,u=8*i-r-1,c=(1<>1,h=23===r?Math.pow(2,-24)-Math.pow(2,-77):0,p=l?0:i-1,f=l?1:-1,_=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(s=isNaN(t)?1:0,o=c):(o=Math.floor(Math.log(t)/Math.LN2),t*(a=Math.pow(2,-o))<1&&(o--,a*=2),(t+=o+d>=1?h/a:h*Math.pow(2,1-d))*a>=2&&(o++,a/=2),o+d>=c?(s=0,o=c):o+d>=1?(s=(t*a-1)*Math.pow(2,r),o+=d):(s=t*Math.pow(2,d-1)*Math.pow(2,r),o=0));r>=8;n[e+p]=255&s,p+=f,s/=256,r-=8);for(o=o<0;n[e+p]=255&o,p+=f,o/=256,u-=8);n[e+p-f]|=128*_}},ulq9:function(n,t,e){!function(n){"use strict";function t(n,t,e){var l,r;return"m"===e?t?"\u043c\u0438\u043d\u0443\u0442\u0430":"\u043c\u0438\u043d\u0443\u0442\u0443":n+" "+(l=+n,r={ss:t?"\u0441\u0435\u043a\u0443\u043d\u0434\u0430_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434":"\u0441\u0435\u043a\u0443\u043d\u0434\u0443_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434",mm:t?"\u043c\u0438\u043d\u0443\u0442\u0430_\u043c\u0438\u043d\u0443\u0442\u044b_\u043c\u0438\u043d\u0443\u0442":"\u043c\u0438\u043d\u0443\u0442\u0443_\u043c\u0438\u043d\u0443\u0442\u044b_\u043c\u0438\u043d\u0443\u0442",hh:"\u0447\u0430\u0441_\u0447\u0430\u0441\u0430_\u0447\u0430\u0441\u043e\u0432",dd:"\u0434\u0435\u043d\u044c_\u0434\u043d\u044f_\u0434\u043d\u0435\u0439",MM:"\u043c\u0435\u0441\u044f\u0446_\u043c\u0435\u0441\u044f\u0446\u0430_\u043c\u0435\u0441\u044f\u0446\u0435\u0432",yy:"\u0433\u043e\u0434_\u0433\u043e\u0434\u0430_\u043b\u0435\u0442"}[e].split("_"),l%10==1&&l%100!=11?r[0]:l%10>=2&&l%10<=4&&(l%100<10||l%100>=20)?r[1]:r[2])}var e=[/^\u044f\u043d\u0432/i,/^\u0444\u0435\u0432/i,/^\u043c\u0430\u0440/i,/^\u0430\u043f\u0440/i,/^\u043c\u0430[\u0439\u044f]/i,/^\u0438\u044e\u043d/i,/^\u0438\u044e\u043b/i,/^\u0430\u0432\u0433/i,/^\u0441\u0435\u043d/i,/^\u043e\u043a\u0442/i,/^\u043d\u043e\u044f/i,/^\u0434\u0435\u043a/i];n.defineLocale("ru",{months:{format:"\u044f\u043d\u0432\u0430\u0440\u044f_\u0444\u0435\u0432\u0440\u0430\u043b\u044f_\u043c\u0430\u0440\u0442\u0430_\u0430\u043f\u0440\u0435\u043b\u044f_\u043c\u0430\u044f_\u0438\u044e\u043d\u044f_\u0438\u044e\u043b\u044f_\u0430\u0432\u0433\u0443\u0441\u0442\u0430_\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044f_\u043e\u043a\u0442\u044f\u0431\u0440\u044f_\u043d\u043e\u044f\u0431\u0440\u044f_\u0434\u0435\u043a\u0430\u0431\u0440\u044f".split("_"),standalone:"\u044f\u043d\u0432\u0430\u0440\u044c_\u0444\u0435\u0432\u0440\u0430\u043b\u044c_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0435\u043b\u044c_\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044c_\u043e\u043a\u0442\u044f\u0431\u0440\u044c_\u043d\u043e\u044f\u0431\u0440\u044c_\u0434\u0435\u043a\u0430\u0431\u0440\u044c".split("_")},monthsShort:{format:"\u044f\u043d\u0432._\u0444\u0435\u0432\u0440._\u043c\u0430\u0440._\u0430\u043f\u0440._\u043c\u0430\u044f_\u0438\u044e\u043d\u044f_\u0438\u044e\u043b\u044f_\u0430\u0432\u0433._\u0441\u0435\u043d\u0442._\u043e\u043a\u0442._\u043d\u043e\u044f\u0431._\u0434\u0435\u043a.".split("_"),standalone:"\u044f\u043d\u0432._\u0444\u0435\u0432\u0440._\u043c\u0430\u0440\u0442_\u0430\u043f\u0440._\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433._\u0441\u0435\u043d\u0442._\u043e\u043a\u0442._\u043d\u043e\u044f\u0431._\u0434\u0435\u043a.".split("_")},weekdays:{standalone:"\u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0435\u0440\u0433_\u043f\u044f\u0442\u043d\u0438\u0446\u0430_\u0441\u0443\u0431\u0431\u043e\u0442\u0430".split("_"),format:"\u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u0435\u0434\u0443_\u0447\u0435\u0442\u0432\u0435\u0440\u0433_\u043f\u044f\u0442\u043d\u0438\u0446\u0443_\u0441\u0443\u0431\u0431\u043e\u0442\u0443".split("_"),isFormat:/\[ ?[\u0412\u0432] ?(?:\u043f\u0440\u043e\u0448\u043b\u0443\u044e|\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e|\u044d\u0442\u0443)? ?\] ?dddd/},weekdaysShort:"\u0432\u0441_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),weekdaysMin:"\u0432\u0441_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),monthsParse:e,longMonthsParse:e,shortMonthsParse:e,monthsRegex:/^(\u044f\u043d\u0432\u0430\u0440[\u044c\u044f]|\u044f\u043d\u0432\.?|\u0444\u0435\u0432\u0440\u0430\u043b[\u044c\u044f]|\u0444\u0435\u0432\u0440?\.?|\u043c\u0430\u0440\u0442\u0430?|\u043c\u0430\u0440\.?|\u0430\u043f\u0440\u0435\u043b[\u044c\u044f]|\u0430\u043f\u0440\.?|\u043c\u0430[\u0439\u044f]|\u0438\u044e\u043d[\u044c\u044f]|\u0438\u044e\u043d\.?|\u0438\u044e\u043b[\u044c\u044f]|\u0438\u044e\u043b\.?|\u0430\u0432\u0433\u0443\u0441\u0442\u0430?|\u0430\u0432\u0433\.?|\u0441\u0435\u043d\u0442\u044f\u0431\u0440[\u044c\u044f]|\u0441\u0435\u043d\u0442?\.?|\u043e\u043a\u0442\u044f\u0431\u0440[\u044c\u044f]|\u043e\u043a\u0442\.?|\u043d\u043e\u044f\u0431\u0440[\u044c\u044f]|\u043d\u043e\u044f\u0431?\.?|\u0434\u0435\u043a\u0430\u0431\u0440[\u044c\u044f]|\u0434\u0435\u043a\.?)/i,monthsShortRegex:/^(\u044f\u043d\u0432\u0430\u0440[\u044c\u044f]|\u044f\u043d\u0432\.?|\u0444\u0435\u0432\u0440\u0430\u043b[\u044c\u044f]|\u0444\u0435\u0432\u0440?\.?|\u043c\u0430\u0440\u0442\u0430?|\u043c\u0430\u0440\.?|\u0430\u043f\u0440\u0435\u043b[\u044c\u044f]|\u0430\u043f\u0440\.?|\u043c\u0430[\u0439\u044f]|\u0438\u044e\u043d[\u044c\u044f]|\u0438\u044e\u043d\.?|\u0438\u044e\u043b[\u044c\u044f]|\u0438\u044e\u043b\.?|\u0430\u0432\u0433\u0443\u0441\u0442\u0430?|\u0430\u0432\u0433\.?|\u0441\u0435\u043d\u0442\u044f\u0431\u0440[\u044c\u044f]|\u0441\u0435\u043d\u0442?\.?|\u043e\u043a\u0442\u044f\u0431\u0440[\u044c\u044f]|\u043e\u043a\u0442\.?|\u043d\u043e\u044f\u0431\u0440[\u044c\u044f]|\u043d\u043e\u044f\u0431?\.?|\u0434\u0435\u043a\u0430\u0431\u0440[\u044c\u044f]|\u0434\u0435\u043a\.?)/i,monthsStrictRegex:/^(\u044f\u043d\u0432\u0430\u0440[\u044f\u044c]|\u0444\u0435\u0432\u0440\u0430\u043b[\u044f\u044c]|\u043c\u0430\u0440\u0442\u0430?|\u0430\u043f\u0440\u0435\u043b[\u044f\u044c]|\u043c\u0430[\u044f\u0439]|\u0438\u044e\u043d[\u044f\u044c]|\u0438\u044e\u043b[\u044f\u044c]|\u0430\u0432\u0433\u0443\u0441\u0442\u0430?|\u0441\u0435\u043d\u0442\u044f\u0431\u0440[\u044f\u044c]|\u043e\u043a\u0442\u044f\u0431\u0440[\u044f\u044c]|\u043d\u043e\u044f\u0431\u0440[\u044f\u044c]|\u0434\u0435\u043a\u0430\u0431\u0440[\u044f\u044c])/i,monthsShortStrictRegex:/^(\u044f\u043d\u0432\.|\u0444\u0435\u0432\u0440?\.|\u043c\u0430\u0440[\u0442.]|\u0430\u043f\u0440\.|\u043c\u0430[\u044f\u0439]|\u0438\u044e\u043d[\u044c\u044f.]|\u0438\u044e\u043b[\u044c\u044f.]|\u0430\u0432\u0433\.|\u0441\u0435\u043d\u0442?\.|\u043e\u043a\u0442\.|\u043d\u043e\u044f\u0431?\.|\u0434\u0435\u043a\.)/i,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0433.",LLL:"D MMMM YYYY \u0433., H:mm",LLLL:"dddd, D MMMM YYYY \u0433., H:mm"},calendar:{sameDay:"[\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0432] LT",nextDay:"[\u0417\u0430\u0432\u0442\u0440\u0430 \u0432] LT",lastDay:"[\u0412\u0447\u0435\u0440\u0430 \u0432] LT",nextWeek:function(n){if(n.week()===this.week())return 2===this.day()?"[\u0412\u043e] dddd [\u0432] LT":"[\u0412] dddd [\u0432] LT";switch(this.day()){case 0:return"[\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435] dddd [\u0432] LT";case 1:case 2:case 4:return"[\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439] dddd [\u0432] LT";case 3:case 5:case 6:return"[\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e] dddd [\u0432] LT"}},lastWeek:function(n){if(n.week()===this.week())return 2===this.day()?"[\u0412\u043e] dddd [\u0432] LT":"[\u0412] dddd [\u0432] LT";switch(this.day()){case 0:return"[\u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u0435] dddd [\u0432] LT";case 1:case 2:case 4:return"[\u0412 \u043f\u0440\u043e\u0448\u043b\u044b\u0439] dddd [\u0432] LT";case 3:case 5:case 6:return"[\u0412 \u043f\u0440\u043e\u0448\u043b\u0443\u044e] dddd [\u0432] LT"}},sameElse:"L"},relativeTime:{future:"\u0447\u0435\u0440\u0435\u0437 %s",past:"%s \u043d\u0430\u0437\u0430\u0434",s:"\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434",ss:t,m:t,mm:t,h:"\u0447\u0430\u0441",hh:t,d:"\u0434\u0435\u043d\u044c",dd:t,M:"\u043c\u0435\u0441\u044f\u0446",MM:t,y:"\u0433\u043e\u0434",yy:t},meridiemParse:/\u043d\u043e\u0447\u0438|\u0443\u0442\u0440\u0430|\u0434\u043d\u044f|\u0432\u0435\u0447\u0435\u0440\u0430/i,isPM:function(n){return/^(\u0434\u043d\u044f|\u0432\u0435\u0447\u0435\u0440\u0430)$/.test(n)},meridiem:function(n,t,e){return n<4?"\u043d\u043e\u0447\u0438":n<12?"\u0443\u0442\u0440\u0430":n<17?"\u0434\u043d\u044f":"\u0432\u0435\u0447\u0435\u0440\u0430"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0439|\u0433\u043e|\u044f)/,ordinal:function(n,t){switch(t){case"M":case"d":case"DDD":return n+"-\u0439";case"D":return n+"-\u0433\u043e";case"w":case"W":return n+"-\u044f";default:return n}},week:{dow:1,doy:4}})}(e("PJh5"))},uotZ:function(n,t,e){var l;!function(r){"use strict";var i,o=/^-?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?$/i,s=Math.ceil,a=Math.floor,u="[BigNumber Error] ",c=u+"Number primitive has more than 15 significant digits: ",d=1e14,h=14,p=9007199254740991,f=[1,10,100,1e3,1e4,1e5,1e6,1e7,1e8,1e9,1e10,1e11,1e12,1e13],_=1e7;function m(n){var t=0|n;return n>0||n===t?t:t-1}function g(n){for(var t,e,l=1,r=n.length,i=n[0]+"";lu^e?1:-1;for(s=(a=r.length)<(u=i.length)?a:u,o=0;oi[o]^e?1:-1;return a==u?0:a>u^e?1:-1}function b(n,t,e,l){if(ne||n!==(n<0?s(n):a(n)))throw Error(u+(l||"Argument")+("number"==typeof n?ne?" out of range: ":" not an integer: ":" not a primitive number: ")+n)}function v(n){return"[object Array]"==Object.prototype.toString.call(n)}function w(n){var t=n.c.length-1;return m(n.e/h)==t&&n.c[t]%2!=0}function x(n,t){return(n.length>1?n.charAt(0)+"."+n.slice(1):n)+(t<0?"e":"e+")+t}function M(n,t,e){var l,r;if(t<0){for(r=e+".";++t;r+=e);n=r+n}else if(++t>(l=n.length)){for(r=e,t-=l;--t;r+=e);n+=r}else t=10;d/=10,u++);return g.e=u,void(g.c=[n])}m=n+""}else{if(!o.test(m=n+""))return r(g,m,f);g.s=45==m.charCodeAt(0)?(m=m.slice(1),-1):1}(u=m.indexOf("."))>-1&&(m=m.replace(".","")),(d=m.search(/e/i))>0?(u<0&&(u=d),u+=+m.slice(d+1),m=m.substring(0,d)):u<0&&(u=m.length)}else{if(b(t,2,B.length,"Base"),m=n+"",10==t)return G(g=new V(n instanceof V?n:m),D+g.e+1,A);if(f="number"==typeof n){if(0*n!=0)return r(g,m,f,t);if(g.s=1/n<0?(m=m.slice(1),-1):1,V.DEBUG&&m.replace(/^0\.0*|\./,"").length>15)throw Error(c+n);f=!1}else g.s=45===m.charCodeAt(0)?(m=m.slice(1),-1):1;for(e=B.slice(0,t),u=d=0,_=m.length;d<_;d++)if(e.indexOf(i=m.charAt(d))<0){if("."==i){if(d>u){u=_;continue}}else if(!s&&(m==m.toUpperCase()&&(m=m.toLowerCase())||m==m.toLowerCase()&&(m=m.toUpperCase()))){s=!0,d=-1,u=0;continue}return r(g,n+"",f,t)}(u=(m=l(m,t,10,g.s)).indexOf("."))>-1?m=m.replace(".",""):u=m.length}for(d=0;48===m.charCodeAt(d);d++);for(_=m.length;48===m.charCodeAt(--_););if(m=m.slice(d,++_)){if(_-=d,f&&V.DEBUG&&_>15&&(n>p||n!==a(n)))throw Error(c+g.s*n);if((u=u-d-1)>I)g.c=g.e=null;else if(us){if(--t>0)for(a+=".";t--;a+="0");}else if((t+=i-s)>0)for(i+1==s&&(a+=".");t--;a+="0");return n.s<0&&r?"-"+a:a}function z(n,t){var e,l,r=0;for(v(n[0])&&(n=n[0]),e=new V(n[0]);++r=10;r/=10,l++);return(e=l+e*h-1)>I?n.c=n.e=null:e=10;u/=10,r++);if((i=t-r)<0)i+=h,_=(c=m[p=0])/g[r-(o=t)-1]%10|0;else if((p=s((i+1)/h))>=m.length){if(!l)break n;for(;m.length<=p;m.push(0));c=_=0,r=1,o=(i%=h)-h+1}else{for(c=u=m[p],r=1;u>=10;u/=10,r++);_=(o=(i%=h)-h+r)<0?0:c/g[r-o-1]%10|0}if(l=l||t<0||null!=m[p+1]||(o<0?c:c%g[r-o-1]),l=e<4?(_||l)&&(0==e||e==(n.s<0?3:2)):_>5||5==_&&(4==e||l||6==e&&(i>0?o>0?c/g[r-o]:0:m[p-1])%10&1||e==(n.s<0?8:7)),t<1||!m[0])return m.length=0,l?(m[0]=g[(h-(t-=n.e+1)%h)%h],n.e=-t||0):m[0]=n.e=0,n;if(0==i?(m.length=p,u=1,p--):(m.length=p+1,u=g[h-i],m[p]=o>0?a(c/g[r-o]%g[o])*u:0),l)for(;;){if(0==p){for(i=1,o=m[0];o>=10;o/=10,i++);for(o=m[0]+=u,u=1;o>=10;o/=10,u++);i!=u&&(n.e++,m[0]==d&&(m[0]=1));break}if(m[p]+=u,m[p]!=d)break;m[p--]=0,u=1}for(i=m.length;0===m[--i];m.pop());}n.e>I?n.c=n.e=null:n.e>>11))>=9e15?(e=crypto.getRandomValues(new Uint32Array(2)),t[c]=e[0],t[c+1]=e[1]):(d.push(o%1e14),c+=2);c=r/2}else{if(!crypto.randomBytes)throw R=!1,Error(u+"crypto unavailable");for(t=crypto.randomBytes(r*=7);c=9e15?crypto.randomBytes(7).copy(t,c):(d.push(o%1e14),c+=7);c=r/7}if(!R)for(;c=10;o/=10,c++);ce-1&&(null==o[r+1]&&(o[r+1]=0),o[r+1]+=o[r]/e|0,o[r]%=e)}return o.reverse()}return function(t,l,r,i,o){var s,a,u,c,d,h,p,f,_=t.indexOf("."),m=D,y=A;for(_>=0&&(c=N,N=0,t=t.replace(".",""),h=(f=new V(l)).pow(t.length-_),N=c,f.c=n(M(g(h.c),h.e,"0"),10,r,"0123456789"),f.e=f.c.length),u=c=(p=n(t,l,r,o?(s=B,"0123456789"):(s="0123456789",B))).length;0==p[--c];p.pop());if(!p[0])return s.charAt(0);if(_<0?--u:(h.c=p,h.e=u,h.s=i,p=(h=e(h,f,m,y,r)).c,d=h.r,u=h.e),_=p[a=u+m+1],c=r/2,d=d||a<0||null!=p[a+1],d=y<4?(null!=_||d)&&(0==y||y==(h.s<0?3:2)):_>c||_==c&&(4==y||d||6==y&&1&p[a-1]||y==(h.s<0?8:7)),a<1||!p[0])t=d?M(s.charAt(1),-m,s.charAt(0)):s.charAt(0);else{if(p.length=a,d)for(--r;++p[--a]>r;)p[a]=0,a||(++u,p=[1].concat(p));for(c=p.length;!p[--c];);for(_=0,t="";_<=c;t+=s.charAt(p[_++]));t=M(t,u,s.charAt(0))}return t}}(),e=function(){function n(n,t,e){var l,r,i,o,s=0,a=n.length,u=t%_,c=t/_|0;for(n=n.slice();a--;)s=((r=u*(i=n[a]%_)+(l=c*i+(o=n[a]/_|0)*u)%_*_+s)/e|0)+(l/_|0)+c*o,n[a]=r%e;return s&&(n=[s].concat(n)),n}function t(n,t,e,l){var r,i;if(e!=l)i=e>l?1:-1;else for(r=i=0;rt[r]?1:-1;break}return i}function e(n,t,e,l){for(var r=0;e--;)n[e]-=r,n[e]=(r=n[e]1;n.splice(0,1));}return function(l,r,i,o,s){var u,c,p,f,_,g,y,b,v,w,x,M,k,C,S,O,T,L=l.s==r.s?1:-1,P=l.c,D=r.c;if(!(P&&P[0]&&D&&D[0]))return new V(l.s&&r.s&&(P?!D||P[0]!=D[0]:D)?P&&0==P[0]||!D?0*L:L/0:NaN);for(v=(b=new V(L)).c=[],L=i+(c=l.e-r.e)+1,s||(s=d,c=m(l.e/h)-m(r.e/h),L=L/h|0),p=0;D[p]==(P[p]||0);p++);if(D[p]>(P[p]||0)&&c--,L<0)v.push(1),f=!0;else{for(C=P.length,O=D.length,p=0,L+=2,(_=a(s/(D[0]+1)))>1&&(D=n(D,_,s),P=n(P,_,s),O=D.length,C=P.length),k=O,x=(w=P.slice(0,O)).length;x=s/2&&S++;do{if(_=0,(u=t(D,w,O,x))<0){if(M=w[0],O!=x&&(M=M*s+(w[1]||0)),(_=a(M/S))>1)for(_>=s&&(_=s-1),y=(g=n(D,_,s)).length,x=w.length;1==t(g,w,y,x);)_--,e(g,O=10;L/=10,p++);G(b,i+(b.e=p+c*h-1)+1,o,f)}else b.e=c,b.r=+f;return b}}(),k=/^(-?)0([xbo])(?=\w[\w.]*$)/i,C=/^([^.]+)\.$/,S=/^\.([^.]+)$/,O=/^-?(Infinity|NaN)$/,T=/^\s*\+(?=[\w.])|^\s+|\s+$/g,r=function(n,t,e,l){var r,i=e?t:t.replace(T,"");if(O.test(i))n.s=isNaN(i)?null:i<0?-1:1,n.c=n.e=null;else{if(!e&&(i=i.replace(k,function(n,t,e){return r="x"==(e=e.toLowerCase())?16:"b"==e?2:8,l&&l!=r?n:t}),l&&(r=l,i=i.replace(C,"$1").replace(S,"0.$1")),t!=i))return new V(i,r);if(V.DEBUG)throw Error(u+"Not a"+(l?" base "+l:"")+" number: "+t);n.c=n.e=n.s=null}},L.absoluteValue=L.abs=function(){var n=new V(this);return n.s<0&&(n.s=1),n},L.comparedTo=function(n,t){return y(this,new V(n,t))},L.decimalPlaces=L.dp=function(n,t){var e,l,r,i=this;if(null!=n)return b(n,0,1e9),null==t?t=A:b(t,0,8),G(new V(i),n+i.e+1,t);if(!(e=i.c))return null;if(l=((r=e.length-1)-m(this.e/h))*h,r=e[r])for(;r%10==0;r/=10,l--);return l<0&&(l=0),l},L.dividedBy=L.div=function(n,t){return e(this,new V(n,t),D,A)},L.dividedToIntegerBy=L.idiv=function(n,t){return e(this,new V(n,t),0,1)},L.exponentiatedBy=L.pow=function(n,t){var e,l,r,i,o,c,d,p=this;if((n=new V(n)).c&&!n.isInteger())throw Error(u+"Exponent not an integer: "+n);if(null!=t&&(t=new V(t)),i=n.e>14,!p.c||!p.c[0]||1==p.c[0]&&!p.e&&1==p.c.length||!n.c||!n.c[0])return d=new V(Math.pow(+p.valueOf(),i?2-w(n):+n)),t?d.mod(t):d;if(o=n.s<0,t){if(t.c?!t.c[0]:!t.s)return new V(NaN);(l=!o&&p.isInteger()&&t.isInteger())&&(p=p.mod(t))}else{if(n.e>9&&(p.e>0||p.e<-1||(0==p.e?p.c[0]>1||i&&p.c[1]>=24e7:p.c[0]<8e13||i&&p.c[0]<=9999975e7)))return r=p.s<0&&w(n)?-0:0,p.e>-1&&(r=1/r),new V(o?1/r:r);N&&(r=s(N/h+2))}for(i?(e=new V(.5),c=w(n)):c=n%2,o&&(n.s=1),d=new V(P);;){if(c){if(!(d=d.times(p)).c)break;r?d.c.length>r&&(d.c.length=r):l&&(d=d.mod(t))}if(i){if(G(n=n.times(e),n.e+1,1),!n.c[0])break;i=n.e>14,c=w(n)}else{if(!(n=a(n/2)))break;c=n%2}p=p.times(p),r?p.c&&p.c.length>r&&(p.c.length=r):l&&(p=p.mod(t))}return l?d:(o&&(d=P.div(d)),t?d.mod(t):r?G(d,N,A,void 0):d)},L.integerValue=function(n){var t=new V(this);return null==n?n=A:b(n,0,8),G(t,t.e+1,n)},L.isEqualTo=L.eq=function(n,t){return 0===y(this,new V(n,t))},L.isFinite=function(){return!!this.c},L.isGreaterThan=L.gt=function(n,t){return y(this,new V(n,t))>0},L.isGreaterThanOrEqualTo=L.gte=function(n,t){return 1===(t=y(this,new V(n,t)))||0===t},L.isInteger=function(){return!!this.c&&m(this.e/h)>this.c.length-2},L.isLessThan=L.lt=function(n,t){return y(this,new V(n,t))<0},L.isLessThanOrEqualTo=L.lte=function(n,t){return-1===(t=y(this,new V(n,t)))||0===t},L.isNaN=function(){return!this.s},L.isNegative=function(){return this.s<0},L.isPositive=function(){return this.s>0},L.isZero=function(){return!!this.c&&0==this.c[0]},L.minus=function(n,t){var e,l,r,i,o=this,s=o.s;if(t=(n=new V(n,t)).s,!s||!t)return new V(NaN);if(s!=t)return n.s=-t,o.plus(n);var a=o.e/h,u=n.e/h,c=o.c,p=n.c;if(!a||!u){if(!c||!p)return c?(n.s=-t,n):new V(p?o:NaN);if(!c[0]||!p[0])return p[0]?(n.s=-t,n):new V(c[0]?o:3==A?-0:0)}if(a=m(a),u=m(u),c=c.slice(),s=a-u){for((i=s<0)?(s=-s,r=c):(u=a,r=p),r.reverse(),t=s;t--;r.push(0));r.reverse()}else for(l=(i=(s=c.length)<(t=p.length))?s:t,s=t=0;t0)for(;t--;c[e++]=0);for(t=d-1;l>s;){if(c[--l]=0;){for(e=0,f=M[r]%v,g=M[r]/v|0,i=r+(o=a);i>r;)e=((u=f*(u=x[--o]%v)+(s=g*u+(c=x[o]/v|0)*f)%v*v+y[i]+e)/b|0)+(s/v|0)+g*c,y[i--]=u%b;y[i]=e}return e?++l:y.splice(0,1),U(n,y,l)},L.negated=function(){var n=new V(this);return n.s=-n.s||null,n},L.plus=function(n,t){var e,l=this,r=l.s;if(t=(n=new V(n,t)).s,!r||!t)return new V(NaN);if(r!=t)return n.s=-t,l.minus(n);var i=l.e/h,o=n.e/h,s=l.c,a=n.c;if(!i||!o){if(!s||!a)return new V(r/0);if(!s[0]||!a[0])return a[0]?n:new V(s[0]?l:0*r)}if(i=m(i),o=m(o),s=s.slice(),r=i-o){for(r>0?(o=i,e=a):(r=-r,e=s),e.reverse();r--;e.push(0));e.reverse()}for((r=s.length)-(t=a.length)<0&&(e=a,a=s,s=e,t=r),r=0;t;)r=(s[--t]=s[t]+a[t]+r)/d|0,s[t]=d===s[t]?0:s[t]%d;return r&&(s=[r].concat(s),++o),U(n,s,o)},L.precision=L.sd=function(n,t){var e,l,r,i=this;if(null!=n&&n!==!!n)return b(n,1,1e9),null==t?t=A:b(t,0,8),G(new V(i),n,t);if(!(e=i.c))return null;if(l=(r=e.length-1)*h+1,r=e[r]){for(;r%10==0;r/=10,l--);for(r=e[0];r>=10;r/=10,l++);}return n&&i.e+1>l&&(l=i.e+1),l},L.shiftedBy=function(n){return b(n,-p,p),this.times("1e"+n)},L.squareRoot=L.sqrt=function(){var n,t,l,r,i,o=this,s=o.c,a=o.s,u=o.e,c=D+4,d=new V("0.5");if(1!==a||!s||!s[0])return new V(!a||a<0&&(!s||s[0])?NaN:s?o:1/0);if(0==(a=Math.sqrt(+o))||a==1/0?(((t=g(s)).length+u)%2==0&&(t+="0"),a=Math.sqrt(t),u=m((u+1)/2)-(u<0||u%2),l=new V(t=a==1/0?"1e"+u:(t=a.toExponential()).slice(0,t.indexOf("e")+1)+u)):l=new V(a+""),l.c[0])for((a=(u=l.e)+c)<3&&(a=0);;)if(l=d.times((i=l).plus(e(o,i,c,1))),g(i.c).slice(0,a)===(t=g(l.c)).slice(0,a)){if(l.e0&&h>0){for(a=d.substr(0,l=h%i||i);l0&&(a+=s+d.slice(l)),c&&(a="-"+a)}e=u?a+F.decimalSeparator+((o=+F.fractionGroupSize)?u.replace(new RegExp("\\d{"+o+"}\\B","g"),"$&"+F.fractionGroupSeparator):u):a}return e},L.toFraction=function(n){var t,l,r,i,o,s,a,c,d,p,_,m,y=this,b=y.c;if(null!=n&&(!(c=new V(n)).isInteger()&&(c.c||1!==c.s)||c.lt(P)))throw Error(u+"Argument "+(c.isInteger()?"out of range: ":"not an integer: ")+n);if(!b)return y.toString();for(l=new V(P),p=r=new V(P),i=d=new V(P),m=g(b),s=l.e=m.length-y.e-1,l.c[0]=f[(a=s%h)<0?h+a:a],n=!n||c.comparedTo(l)>0?s>0?l:p:c,a=I,I=1/0,c=new V(m),d.c[0]=0;_=e(c,l,0,1),1!=(o=r.plus(_.times(i))).comparedTo(n);)r=i,i=o,p=d.plus(_.times(o=p)),d=o,l=c.minus(_.times(o=l)),c=o;return o=e(n.minus(r),i,0,1),d=d.plus(o.times(p)),r=r.plus(o.times(i)),d.s=p.s=y.s,t=e(p,i,s*=2,A).minus(y).abs().comparedTo(e(d,r,s,A).minus(y).abs())<1?[p.toString(),i.toString()]:[d.toString(),r.toString()],I=a,t},L.toNumber=function(){return+this},L.toPrecision=function(n,t){return null!=n&&b(n,1,1e9),W(this,n,t,2)},L.toString=function(n){var t,e=this,r=e.s,i=e.e;return null===i?r?(t="Infinity",r<0&&(t="-"+t)):t="NaN":(t=g(e.c),null==n?t=i<=E||i>=Y?x(t,i):M(t,i,"0"):(b(n,2,B.length,"Base"),t=l(M(t,i,"0"),10,n,r,!0)),r<0&&e.c[0]&&(t="-"+t)),t},L.valueOf=L.toJSON=function(){var n,t=this,e=t.e;return null===e?t.toString():(n=g(t.c),n=e<=E||e>=Y?x(n,e):M(n,e,"0"),t.s<0?"-"+n:n)},L._isBigNumber=!0,null!=t&&V.set(t),V}()).default=i.BigNumber=i,void 0===(l=(function(){return i}).call(t,e,t,n))||(n.exports=l)}()},upln:function(n,t,e){!function(n){"use strict";function t(n){return n%100==11||n%10!=1}function e(n,e,l,r){var i=n+" ";switch(l){case"s":return e||r?"nokkrar sek\xfandur":"nokkrum sek\xfandum";case"ss":return t(n)?i+(e||r?"sek\xfandur":"sek\xfandum"):i+"sek\xfanda";case"m":return e?"m\xedn\xfata":"m\xedn\xfatu";case"mm":return t(n)?i+(e||r?"m\xedn\xfatur":"m\xedn\xfatum"):e?i+"m\xedn\xfata":i+"m\xedn\xfatu";case"hh":return t(n)?i+(e||r?"klukkustundir":"klukkustundum"):i+"klukkustund";case"d":return e?"dagur":r?"dag":"degi";case"dd":return t(n)?e?i+"dagar":i+(r?"daga":"d\xf6gum"):e?i+"dagur":i+(r?"dag":"degi");case"M":return e?"m\xe1nu\xf0ur":r?"m\xe1nu\xf0":"m\xe1nu\xf0i";case"MM":return t(n)?e?i+"m\xe1nu\xf0ir":i+(r?"m\xe1nu\xf0i":"m\xe1nu\xf0um"):e?i+"m\xe1nu\xf0ur":i+(r?"m\xe1nu\xf0":"m\xe1nu\xf0i");case"y":return e||r?"\xe1r":"\xe1ri";case"yy":return t(n)?i+(e||r?"\xe1r":"\xe1rum"):i+(e||r?"\xe1r":"\xe1ri")}}n.defineLocale("is",{months:"jan\xfaar_febr\xfaar_mars_apr\xedl_ma\xed_j\xfan\xed_j\xfal\xed_\xe1g\xfast_september_okt\xf3ber_n\xf3vember_desember".split("_"),monthsShort:"jan_feb_mar_apr_ma\xed_j\xfan_j\xfal_\xe1g\xfa_sep_okt_n\xf3v_des".split("_"),weekdays:"sunnudagur_m\xe1nudagur_\xferi\xf0judagur_mi\xf0vikudagur_fimmtudagur_f\xf6studagur_laugardagur".split("_"),weekdaysShort:"sun_m\xe1n_\xferi_mi\xf0_fim_f\xf6s_lau".split("_"),weekdaysMin:"Su_M\xe1_\xder_Mi_Fi_F\xf6_La".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd, D. MMMM YYYY [kl.] H:mm"},calendar:{sameDay:"[\xed dag kl.] LT",nextDay:"[\xe1 morgun kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[\xed g\xe6r kl.] LT",lastWeek:"[s\xed\xf0asta] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"eftir %s",past:"fyrir %s s\xed\xf0an",s:e,ss:e,m:e,mm:e,h:"klukkustund",hh:e,d:e,dd:e,M:e,MM:e,y:e,yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(e("PJh5"))},uslO:function(n,t,e){var l={"./af":"3CJN","./af.js":"3CJN","./ar":"3MVc","./ar-dz":"tkWw","./ar-dz.js":"tkWw","./ar-kw":"j8cJ","./ar-kw.js":"j8cJ","./ar-ly":"wPpW","./ar-ly.js":"wPpW","./ar-ma":"dURR","./ar-ma.js":"dURR","./ar-sa":"7OnE","./ar-sa.js":"7OnE","./ar-tn":"BEem","./ar-tn.js":"BEem","./ar.js":"3MVc","./az":"eHwN","./az.js":"eHwN","./be":"3hfc","./be.js":"3hfc","./bg":"lOED","./bg.js":"lOED","./bm":"hng5","./bm.js":"hng5","./bn":"aM0x","./bn.js":"aM0x","./bo":"w2Hs","./bo.js":"w2Hs","./br":"OSsP","./br.js":"OSsP","./bs":"aqvp","./bs.js":"aqvp","./ca":"wIgY","./ca.js":"wIgY","./cs":"ssxj","./cs.js":"ssxj","./cv":"N3vo","./cv.js":"N3vo","./cy":"ZFGz","./cy.js":"ZFGz","./da":"YBA/","./da.js":"YBA/","./de":"DOkx","./de-at":"8v14","./de-at.js":"8v14","./de-ch":"Frex","./de-ch.js":"Frex","./de.js":"DOkx","./dv":"rIuo","./dv.js":"rIuo","./el":"CFqe","./el.js":"CFqe","./en-au":"Sjoy","./en-au.js":"Sjoy","./en-ca":"Tqun","./en-ca.js":"Tqun","./en-gb":"hPuz","./en-gb.js":"hPuz","./en-ie":"ALEw","./en-ie.js":"ALEw","./en-il":"QZk1","./en-il.js":"QZk1","./en-nz":"dyB6","./en-nz.js":"dyB6","./eo":"Nd3h","./eo.js":"Nd3h","./es":"LT9G","./es-do":"7MHZ","./es-do.js":"7MHZ","./es-us":"INcR","./es-us.js":"INcR","./es.js":"LT9G","./et":"XlWM","./et.js":"XlWM","./eu":"sqLM","./eu.js":"sqLM","./fa":"2pmY","./fa.js":"2pmY","./fi":"nS2h","./fi.js":"nS2h","./fo":"OVPi","./fo.js":"OVPi","./fr":"tzHd","./fr-ca":"bXQP","./fr-ca.js":"bXQP","./fr-ch":"VK9h","./fr-ch.js":"VK9h","./fr.js":"tzHd","./fy":"g7KF","./fy.js":"g7KF","./gd":"nLOz","./gd.js":"nLOz","./gl":"FuaP","./gl.js":"FuaP","./gom-latn":"+27R","./gom-latn.js":"+27R","./gu":"rtsW","./gu.js":"rtsW","./he":"Nzt2","./he.js":"Nzt2","./hi":"ETHv","./hi.js":"ETHv","./hr":"V4qH","./hr.js":"V4qH","./hu":"xne+","./hu.js":"xne+","./hy-am":"GrS7","./hy-am.js":"GrS7","./id":"yRTJ","./id.js":"yRTJ","./is":"upln","./is.js":"upln","./it":"FKXc","./it.js":"FKXc","./ja":"ORgI","./ja.js":"ORgI","./jv":"JwiF","./jv.js":"JwiF","./ka":"RnJI","./ka.js":"RnJI","./kk":"j+vx","./kk.js":"j+vx","./km":"5j66","./km.js":"5j66","./kn":"gEQe","./kn.js":"gEQe","./ko":"eBB/","./ko.js":"eBB/","./ky":"6cf8","./ky.js":"6cf8","./lb":"z3hR","./lb.js":"z3hR","./lo":"nE8X","./lo.js":"nE8X","./lt":"/6P1","./lt.js":"/6P1","./lv":"jxEH","./lv.js":"jxEH","./me":"svD2","./me.js":"svD2","./mi":"gEU3","./mi.js":"gEU3","./mk":"Ab7C","./mk.js":"Ab7C","./ml":"oo1B","./ml.js":"oo1B","./mr":"5vPg","./mr.js":"5vPg","./ms":"ooba","./ms-my":"G++c","./ms-my.js":"G++c","./ms.js":"ooba","./mt":"oCzW","./mt.js":"oCzW","./my":"F+2e","./my.js":"F+2e","./nb":"FlzV","./nb.js":"FlzV","./ne":"/mhn","./ne.js":"/mhn","./nl":"3K28","./nl-be":"Bp2f","./nl-be.js":"Bp2f","./nl.js":"3K28","./nn":"C7av","./nn.js":"C7av","./pa-in":"pfs9","./pa-in.js":"pfs9","./pl":"7LV+","./pl.js":"7LV+","./pt":"ZoSI","./pt-br":"AoDM","./pt-br.js":"AoDM","./pt.js":"ZoSI","./ro":"wT5f","./ro.js":"wT5f","./ru":"ulq9","./ru.js":"ulq9","./sd":"fW1y","./sd.js":"fW1y","./se":"5Omq","./se.js":"5Omq","./si":"Lgqo","./si.js":"Lgqo","./sk":"OUMt","./sk.js":"OUMt","./sl":"2s1U","./sl.js":"2s1U","./sq":"V0td","./sq.js":"V0td","./sr":"f4W3","./sr-cyrl":"c1x4","./sr-cyrl.js":"c1x4","./sr.js":"f4W3","./ss":"7Q8x","./ss.js":"7Q8x","./sv":"Fpqq","./sv.js":"Fpqq","./sw":"DSXN","./sw.js":"DSXN","./ta":"+7/x","./ta.js":"+7/x","./te":"Nlnz","./te.js":"Nlnz","./tet":"gUgh","./tet.js":"gUgh","./tg":"5SNd","./tg.js":"5SNd","./th":"XzD+","./th.js":"XzD+","./tl-ph":"3LKG","./tl-ph.js":"3LKG","./tlh":"m7yE","./tlh.js":"m7yE","./tr":"k+5o","./tr.js":"k+5o","./tzl":"iNtv","./tzl.js":"iNtv","./tzm":"FRPF","./tzm-latn":"krPU","./tzm-latn.js":"krPU","./tzm.js":"FRPF","./ug-cn":"To0v","./ug-cn.js":"To0v","./uk":"ntHu","./uk.js":"ntHu","./ur":"uSe8","./ur.js":"uSe8","./uz":"XU1s","./uz-latn":"/bsm","./uz-latn.js":"/bsm","./uz.js":"XU1s","./vi":"0X8Q","./vi.js":"0X8Q","./x-pseudo":"e/KL","./x-pseudo.js":"e/KL","./yo":"YXlc","./yo.js":"YXlc","./zh-cn":"Vz2w","./zh-cn.js":"Vz2w","./zh-hk":"ZUyn","./zh-hk.js":"ZUyn","./zh-tw":"BbgG","./zh-tw.js":"BbgG"};function r(n){return e(i(n))}function i(n){var t=l[n];if(!(t+1))throw new Error("Cannot find module '"+n+"'.");return t}r.keys=function(){return Object.keys(l)},r.resolve=i,n.exports=r,r.id="uslO"},w2Hs:function(n,t,e){!function(n){"use strict";var t={1:"\u0f21",2:"\u0f22",3:"\u0f23",4:"\u0f24",5:"\u0f25",6:"\u0f26",7:"\u0f27",8:"\u0f28",9:"\u0f29",0:"\u0f20"},e={"\u0f21":"1","\u0f22":"2","\u0f23":"3","\u0f24":"4","\u0f25":"5","\u0f26":"6","\u0f27":"7","\u0f28":"8","\u0f29":"9","\u0f20":"0"};n.defineLocale("bo",{months:"\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0f44\u0f0b\u0f54\u0f7c_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f49\u0f72\u0f66\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f66\u0f74\u0f58\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f5e\u0f72\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f63\u0f94\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0fb2\u0f74\u0f42\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f51\u0f74\u0f53\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f62\u0f92\u0fb1\u0f51\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0f42\u0f74\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f42\u0f45\u0f72\u0f42\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f42\u0f49\u0f72\u0f66\u0f0b\u0f54".split("_"),monthsShort:"\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0f44\u0f0b\u0f54\u0f7c_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f49\u0f72\u0f66\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f66\u0f74\u0f58\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f5e\u0f72\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f63\u0f94\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0fb2\u0f74\u0f42\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f51\u0f74\u0f53\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f62\u0f92\u0fb1\u0f51\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0f42\u0f74\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f42\u0f45\u0f72\u0f42\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f42\u0f49\u0f72\u0f66\u0f0b\u0f54".split("_"),weekdays:"\u0f42\u0f5f\u0f60\u0f0b\u0f49\u0f72\u0f0b\u0f58\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f5f\u0fb3\u0f0b\u0f56\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f58\u0f72\u0f42\u0f0b\u0f51\u0f58\u0f62\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f63\u0fb7\u0f42\u0f0b\u0f54\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f55\u0f74\u0f62\u0f0b\u0f56\u0f74_\u0f42\u0f5f\u0f60\u0f0b\u0f54\u0f0b\u0f66\u0f44\u0f66\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f66\u0fa4\u0f7a\u0f53\u0f0b\u0f54\u0f0b".split("_"),weekdaysShort:"\u0f49\u0f72\u0f0b\u0f58\u0f0b_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b_\u0f58\u0f72\u0f42\u0f0b\u0f51\u0f58\u0f62\u0f0b_\u0f63\u0fb7\u0f42\u0f0b\u0f54\u0f0b_\u0f55\u0f74\u0f62\u0f0b\u0f56\u0f74_\u0f54\u0f0b\u0f66\u0f44\u0f66\u0f0b_\u0f66\u0fa4\u0f7a\u0f53\u0f0b\u0f54\u0f0b".split("_"),weekdaysMin:"\u0f49\u0f72\u0f0b\u0f58\u0f0b_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b_\u0f58\u0f72\u0f42\u0f0b\u0f51\u0f58\u0f62\u0f0b_\u0f63\u0fb7\u0f42\u0f0b\u0f54\u0f0b_\u0f55\u0f74\u0f62\u0f0b\u0f56\u0f74_\u0f54\u0f0b\u0f66\u0f44\u0f66\u0f0b_\u0f66\u0fa4\u0f7a\u0f53\u0f0b\u0f54\u0f0b".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[\u0f51\u0f72\u0f0b\u0f62\u0f72\u0f44] LT",nextDay:"[\u0f66\u0f44\u0f0b\u0f49\u0f72\u0f53] LT",nextWeek:"[\u0f56\u0f51\u0f74\u0f53\u0f0b\u0f55\u0fb2\u0f42\u0f0b\u0f62\u0f97\u0f7a\u0f66\u0f0b\u0f58], LT",lastDay:"[\u0f41\u0f0b\u0f66\u0f44] LT",lastWeek:"[\u0f56\u0f51\u0f74\u0f53\u0f0b\u0f55\u0fb2\u0f42\u0f0b\u0f58\u0f50\u0f60\u0f0b\u0f58] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0f63\u0f0b",past:"%s \u0f66\u0f94\u0f53\u0f0b\u0f63",s:"\u0f63\u0f58\u0f0b\u0f66\u0f44",ss:"%d \u0f66\u0f90\u0f62\u0f0b\u0f46\u0f0d",m:"\u0f66\u0f90\u0f62\u0f0b\u0f58\u0f0b\u0f42\u0f45\u0f72\u0f42",mm:"%d \u0f66\u0f90\u0f62\u0f0b\u0f58",h:"\u0f46\u0f74\u0f0b\u0f5a\u0f7c\u0f51\u0f0b\u0f42\u0f45\u0f72\u0f42",hh:"%d \u0f46\u0f74\u0f0b\u0f5a\u0f7c\u0f51",d:"\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f45\u0f72\u0f42",dd:"%d \u0f49\u0f72\u0f53\u0f0b",M:"\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f45\u0f72\u0f42",MM:"%d \u0f5f\u0fb3\u0f0b\u0f56",y:"\u0f63\u0f7c\u0f0b\u0f42\u0f45\u0f72\u0f42",yy:"%d \u0f63\u0f7c"},preparse:function(n){return n.replace(/[\u0f21\u0f22\u0f23\u0f24\u0f25\u0f26\u0f27\u0f28\u0f29\u0f20]/g,function(n){return e[n]})},postformat:function(n){return n.replace(/\d/g,function(n){return t[n]})},meridiemParse:/\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c|\u0f5e\u0f7c\u0f42\u0f66\u0f0b\u0f40\u0f66|\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f74\u0f44|\u0f51\u0f42\u0f7c\u0f44\u0f0b\u0f51\u0f42|\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c/,meridiemHour:function(n,t){return 12===n&&(n=0),"\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c"===t&&n>=4||"\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f74\u0f44"===t&&n<5||"\u0f51\u0f42\u0f7c\u0f44\u0f0b\u0f51\u0f42"===t?n+12:n},meridiem:function(n,t,e){return n<4?"\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c":n<10?"\u0f5e\u0f7c\u0f42\u0f66\u0f0b\u0f40\u0f66":n<17?"\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f74\u0f44":n<20?"\u0f51\u0f42\u0f7c\u0f44\u0f0b\u0f51\u0f42":"\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c"},week:{dow:0,doy:6}})}(e("PJh5"))},wIgY:function(n,t,e){!function(n){"use strict";n.defineLocale("ca",{months:{standalone:"gener_febrer_mar\xe7_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre".split("_"),format:"de gener_de febrer_de mar\xe7_d'abril_de maig_de juny_de juliol_d'agost_de setembre_d'octubre_de novembre_de desembre".split("_"),isFormat:/D[oD]?(\s)+MMMM/},monthsShort:"gen._febr._mar\xe7_abr._maig_juny_jul._ag._set._oct._nov._des.".split("_"),monthsParseExact:!0,weekdays:"diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte".split("_"),weekdaysShort:"dg._dl._dt._dc._dj._dv._ds.".split("_"),weekdaysMin:"dg_dl_dt_dc_dj_dv_ds".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [de] YYYY",ll:"D MMM YYYY",LLL:"D MMMM [de] YYYY [a les] H:mm",lll:"D MMM YYYY, H:mm",LLLL:"dddd D MMMM [de] YYYY [a les] H:mm",llll:"ddd D MMM YYYY, H:mm"},calendar:{sameDay:function(){return"[avui a "+(1!==this.hours()?"les":"la")+"] LT"},nextDay:function(){return"[dem\xe0 a "+(1!==this.hours()?"les":"la")+"] LT"},nextWeek:function(){return"dddd [a "+(1!==this.hours()?"les":"la")+"] LT"},lastDay:function(){return"[ahir a "+(1!==this.hours()?"les":"la")+"] LT"},lastWeek:function(){return"[el] dddd [passat a "+(1!==this.hours()?"les":"la")+"] LT"},sameElse:"L"},relativeTime:{future:"d'aqu\xed %s",past:"fa %s",s:"uns segons",ss:"%d segons",m:"un minut",mm:"%d minuts",h:"una hora",hh:"%d hores",d:"un dia",dd:"%d dies",M:"un mes",MM:"%d mesos",y:"un any",yy:"%d anys"},dayOfMonthOrdinalParse:/\d{1,2}(r|n|t|\xe8|a)/,ordinal:function(n,t){var e=1===n?"r":2===n?"n":3===n?"r":4===n?"t":"\xe8";return"w"!==t&&"W"!==t||(e="a"),n+e},week:{dow:1,doy:4}})}(e("PJh5"))},wPpW:function(n,t,e){!function(n){"use strict";var t={1:"1",2:"2",3:"3",4:"4",5:"5",6:"6",7:"7",8:"8",9:"9",0:"0"},e=function(n){return 0===n?0:1===n?1:2===n?2:n%100>=3&&n%100<=10?3:n%100>=11?4:5},l={s:["\u0623\u0642\u0644 \u0645\u0646 \u062b\u0627\u0646\u064a\u0629","\u062b\u0627\u0646\u064a\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062b\u0627\u0646\u064a\u062a\u0627\u0646","\u062b\u0627\u0646\u064a\u062a\u064a\u0646"],"%d \u062b\u0648\u0627\u0646","%d \u062b\u0627\u0646\u064a\u0629","%d \u062b\u0627\u0646\u064a\u0629"],m:["\u0623\u0642\u0644 \u0645\u0646 \u062f\u0642\u064a\u0642\u0629","\u062f\u0642\u064a\u0642\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062f\u0642\u064a\u0642\u062a\u0627\u0646","\u062f\u0642\u064a\u0642\u062a\u064a\u0646"],"%d \u062f\u0642\u0627\u0626\u0642","%d \u062f\u0642\u064a\u0642\u0629","%d \u062f\u0642\u064a\u0642\u0629"],h:["\u0623\u0642\u0644 \u0645\u0646 \u0633\u0627\u0639\u0629","\u0633\u0627\u0639\u0629 \u0648\u0627\u062d\u062f\u0629",["\u0633\u0627\u0639\u062a\u0627\u0646","\u0633\u0627\u0639\u062a\u064a\u0646"],"%d \u0633\u0627\u0639\u0627\u062a","%d \u0633\u0627\u0639\u0629","%d \u0633\u0627\u0639\u0629"],d:["\u0623\u0642\u0644 \u0645\u0646 \u064a\u0648\u0645","\u064a\u0648\u0645 \u0648\u0627\u062d\u062f",["\u064a\u0648\u0645\u0627\u0646","\u064a\u0648\u0645\u064a\u0646"],"%d \u0623\u064a\u0627\u0645","%d \u064a\u0648\u0645\u064b\u0627","%d \u064a\u0648\u0645"],M:["\u0623\u0642\u0644 \u0645\u0646 \u0634\u0647\u0631","\u0634\u0647\u0631 \u0648\u0627\u062d\u062f",["\u0634\u0647\u0631\u0627\u0646","\u0634\u0647\u0631\u064a\u0646"],"%d \u0623\u0634\u0647\u0631","%d \u0634\u0647\u0631\u0627","%d \u0634\u0647\u0631"],y:["\u0623\u0642\u0644 \u0645\u0646 \u0639\u0627\u0645","\u0639\u0627\u0645 \u0648\u0627\u062d\u062f",["\u0639\u0627\u0645\u0627\u0646","\u0639\u0627\u0645\u064a\u0646"],"%d \u0623\u0639\u0648\u0627\u0645","%d \u0639\u0627\u0645\u064b\u0627","%d \u0639\u0627\u0645"]},r=function(n){return function(t,r,i,o){var s=e(t),a=l[n][e(t)];return 2===s&&(a=a[r?0:1]),a.replace(/%d/i,t)}},i=["\u064a\u0646\u0627\u064a\u0631","\u0641\u0628\u0631\u0627\u064a\u0631","\u0645\u0627\u0631\u0633","\u0623\u0628\u0631\u064a\u0644","\u0645\u0627\u064a\u0648","\u064a\u0648\u0646\u064a\u0648","\u064a\u0648\u0644\u064a\u0648","\u0623\u063a\u0633\u0637\u0633","\u0633\u0628\u062a\u0645\u0628\u0631","\u0623\u0643\u062a\u0648\u0628\u0631","\u0646\u0648\u0641\u0645\u0628\u0631","\u062f\u064a\u0633\u0645\u0628\u0631"];n.defineLocale("ar-ly",{months:i,monthsShort:i,weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/\u200fM/\u200fYYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0635|\u0645/,isPM:function(n){return"\u0645"===n},meridiem:function(n,t,e){return n<12?"\u0635":"\u0645"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u064b\u0627 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0628\u0639\u062f %s",past:"\u0645\u0646\u0630 %s",s:r("s"),ss:r("s"),m:r("m"),mm:r("m"),h:r("h"),hh:r("h"),d:r("d"),dd:r("d"),M:r("M"),MM:r("M"),y:r("y"),yy:r("y")},preparse:function(n){return n.replace(/\u060c/g,",")},postformat:function(n){return n.replace(/\d/g,function(n){return t[n]}).replace(/,/g,"\u060c")},week:{dow:6,doy:12}})}(e("PJh5"))},wT5f:function(n,t,e){!function(n){"use strict";function t(n,t,e){var l=" ";return(n%100>=20||n>=100&&n%100==0)&&(l=" de "),n+l+{ss:"secunde",mm:"minute",hh:"ore",dd:"zile",MM:"luni",yy:"ani"}[e]}n.defineLocale("ro",{months:"ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie".split("_"),monthsShort:"ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"duminic\u0103_luni_mar\u021bi_miercuri_joi_vineri_s\xe2mb\u0103t\u0103".split("_"),weekdaysShort:"Dum_Lun_Mar_Mie_Joi_Vin_S\xe2m".split("_"),weekdaysMin:"Du_Lu_Ma_Mi_Jo_Vi_S\xe2".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[azi la] LT",nextDay:"[m\xe2ine la] LT",nextWeek:"dddd [la] LT",lastDay:"[ieri la] LT",lastWeek:"[fosta] dddd [la] LT",sameElse:"L"},relativeTime:{future:"peste %s",past:"%s \xeen urm\u0103",s:"c\xe2teva secunde",ss:t,m:"un minut",mm:t,h:"o or\u0103",hh:t,d:"o zi",dd:t,M:"o lun\u0103",MM:t,y:"un an",yy:t},week:{dow:1,doy:7}})}(e("PJh5"))},x35b:function(n,t,e){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var l=e("WT6e"),r={nodeUrl:"/api/",production:!0,tellerUrl:"https://event.skycoin.com/api/",swaplab:{apiKey:"w4bxe2tbf9beb72r",activateTestMode:!1,endStatusInError:!1}},i=(e("rxKx"),e("TToO")),o=e("YaPU"),s=function(){},a=new l.r("Location Initialized"),u=function(){},c=new l.r("appBaseHref"),d=function(){function n(t){var e=this;this._subject=new l.o,this._platformStrategy=t;var r=this._platformStrategy.getBaseHref();this._baseHref=n.stripTrailingSlash(h(r)),this._platformStrategy.onPopState(function(n){e._subject.emit({url:e.path(!0),pop:!0,type:n.type})})}return n.prototype.path=function(n){return void 0===n&&(n=!1),this.normalize(this._platformStrategy.path(n))},n.prototype.isCurrentPathEqualTo=function(t,e){return void 0===e&&(e=""),this.path()==this.normalize(t+n.normalizeQueryParams(e))},n.prototype.normalize=function(t){return n.stripTrailingSlash(function(n,t){return n&&t.startsWith(n)?t.substring(n.length):t}(this._baseHref,h(t)))},n.prototype.prepareExternalUrl=function(n){return n&&"/"!==n[0]&&(n="/"+n),this._platformStrategy.prepareExternalUrl(n)},n.prototype.go=function(n,t){void 0===t&&(t=""),this._platformStrategy.pushState(null,"",n,t)},n.prototype.replaceState=function(n,t){void 0===t&&(t=""),this._platformStrategy.replaceState(null,"",n,t)},n.prototype.forward=function(){this._platformStrategy.forward()},n.prototype.back=function(){this._platformStrategy.back()},n.prototype.subscribe=function(n,t,e){return this._subject.subscribe({next:n,error:t,complete:e})},n.normalizeQueryParams=function(n){return n&&"?"!==n[0]?"?"+n:n},n.joinWithSlash=function(n,t){if(0==n.length)return t;if(0==t.length)return n;var e=0;return n.endsWith("/")&&e++,t.startsWith("/")&&e++,2==e?n+t.substring(1):1==e?n+t:n+"/"+t},n.stripTrailingSlash=function(n){var t=n.match(/#|\?|$/),e=t&&t.index||n.length;return n.slice(0,e-("/"===n[e-1]?1:0))+n.slice(e)},n}();function h(n){return n.replace(/\/index.html$/,"")}var p=function(n){function t(t,e){var l=n.call(this)||this;return l._platformLocation=t,l._baseHref="",null!=e&&(l._baseHref=e),l}return Object(i.__extends)(t,n),t.prototype.onPopState=function(n){this._platformLocation.onPopState(n),this._platformLocation.onHashChange(n)},t.prototype.getBaseHref=function(){return this._baseHref},t.prototype.path=function(n){void 0===n&&(n=!1);var t=this._platformLocation.hash;return null==t&&(t="#"),t.length>0?t.substring(1):t},t.prototype.prepareExternalUrl=function(n){var t=d.joinWithSlash(this._baseHref,n);return t.length>0?"#"+t:t},t.prototype.pushState=function(n,t,e,l){var r=this.prepareExternalUrl(e+d.normalizeQueryParams(l));0==r.length&&(r=this._platformLocation.pathname),this._platformLocation.pushState(n,t,r)},t.prototype.replaceState=function(n,t,e,l){var r=this.prepareExternalUrl(e+d.normalizeQueryParams(l));0==r.length&&(r=this._platformLocation.pathname),this._platformLocation.replaceState(n,t,r)},t.prototype.forward=function(){this._platformLocation.forward()},t.prototype.back=function(){this._platformLocation.back()},t}(u),f=function(n){function t(t,e){var l=n.call(this)||this;if(l._platformLocation=t,null==e&&(e=l._platformLocation.getBaseHrefFromDOM()),null==e)throw new Error("No base href set. Please provide a value for the APP_BASE_HREF token or add a base element to the document.");return l._baseHref=e,l}return Object(i.__extends)(t,n),t.prototype.onPopState=function(n){this._platformLocation.onPopState(n),this._platformLocation.onHashChange(n)},t.prototype.getBaseHref=function(){return this._baseHref},t.prototype.prepareExternalUrl=function(n){return d.joinWithSlash(this._baseHref,n)},t.prototype.path=function(n){void 0===n&&(n=!1);var t=this._platformLocation.pathname+d.normalizeQueryParams(this._platformLocation.search),e=this._platformLocation.hash;return e&&n?""+t+e:t},t.prototype.pushState=function(n,t,e,l){var r=this.prepareExternalUrl(e+d.normalizeQueryParams(l));this._platformLocation.pushState(n,t,r)},t.prototype.replaceState=function(n,t,e,l){var r=this.prepareExternalUrl(e+d.normalizeQueryParams(l));this._platformLocation.replaceState(n,t,r)},t.prototype.forward=function(){this._platformLocation.forward()},t.prototype.back=function(){this._platformLocation.back()},t}(u),_={AOA:[,"Kz"],ARS:[,"$"],AUD:["A$","$"],BAM:[,"KM"],BBD:[,"$"],BDT:[,"\u09f3"],BMD:[,"$"],BND:[,"$"],BOB:[,"Bs"],BRL:["R$"],BSD:[,"$"],BWP:[,"P"],BYN:[,"\u0440."],BZD:[,"$"],CAD:["CA$","$"],CLP:[,"$"],CNY:["CN\xa5","\xa5"],COP:[,"$"],CRC:[,"\u20a1"],CUC:[,"$"],CUP:[,"$"],CZK:[,"K\u010d"],DKK:[,"kr"],DOP:[,"$"],EGP:[,"E\xa3"],ESP:[,"\u20a7"],EUR:["\u20ac"],FJD:[,"$"],FKP:[,"\xa3"],GBP:["\xa3"],GEL:[,"\u20be"],GIP:[,"\xa3"],GNF:[,"FG"],GTQ:[,"Q"],GYD:[,"$"],HKD:["HK$","$"],HNL:[,"L"],HRK:[,"kn"],HUF:[,"Ft"],IDR:[,"Rp"],ILS:["\u20aa"],INR:["\u20b9"],ISK:[,"kr"],JMD:[,"$"],JPY:["\xa5"],KHR:[,"\u17db"],KMF:[,"CF"],KPW:[,"\u20a9"],KRW:["\u20a9"],KYD:[,"$"],KZT:[,"\u20b8"],LAK:[,"\u20ad"],LBP:[,"L\xa3"],LKR:[,"Rs"],LRD:[,"$"],LTL:[,"Lt"],LVL:[,"Ls"],MGA:[,"Ar"],MMK:[,"K"],MNT:[,"\u20ae"],MUR:[,"Rs"],MXN:["MX$","$"],MYR:[,"RM"],NAD:[,"$"],NGN:[,"\u20a6"],NIO:[,"C$"],NOK:[,"kr"],NPR:[,"Rs"],NZD:["NZ$","$"],PHP:[,"\u20b1"],PKR:[,"Rs"],PLN:[,"z\u0142"],PYG:[,"\u20b2"],RON:[,"lei"],RUB:[,"\u20bd"],RUR:[,"\u0440."],RWF:[,"RF"],SBD:[,"$"],SEK:[,"kr"],SGD:[,"$"],SHP:[,"\xa3"],SRD:[,"$"],SSP:[,"\xa3"],STD:[,"Db"],SYP:[,"\xa3"],THB:[,"\u0e3f"],TOP:[,"T$"],TRY:[,"\u20ba"],TTD:[,"$"],TWD:["NT$","$"],UAH:[,"\u20b4"],USD:["$"],UYU:[,"$"],VEF:[,"Bs"],VND:["\u20ab"],XAF:["FCFA"],XCD:["EC$","$"],XOF:["CFA"],XPF:["CFPF"],ZAR:[,"R"],ZMW:[,"ZK"]},m=["en",[["a","p"],["AM","PM"]],[["AM","PM"],,],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],0,[6,0],["M/d/yy","MMM d, y","MMMM d, y","EEEE, MMMM d, y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",,"{1} 'at' {0}"],[".",",",";","%","+","-","E","\xd7","\u2030","\u221e","NaN",":"],["#,##0.###","#,##0%","\xa4#,##0.00","#E0"],"$","US Dollar",function(n){var t=Math.floor(Math.abs(n)),e=n.toString().replace(/^[^.]*\.?/,"").length;return 1===t&&0===e?1:5}],g={},y=function(){var n={Decimal:0,Percent:1,Currency:2,Scientific:3};return n[n.Decimal]="Decimal",n[n.Percent]="Percent",n[n.Currency]="Currency",n[n.Scientific]="Scientific",n}(),b=function(){var n={Zero:0,One:1,Two:2,Few:3,Many:4,Other:5};return n[n.Zero]="Zero",n[n.One]="One",n[n.Two]="Two",n[n.Few]="Few",n[n.Many]="Many",n[n.Other]="Other",n}(),v=function(){var n={Decimal:0,Group:1,List:2,PercentSign:3,PlusSign:4,MinusSign:5,Exponential:6,SuperscriptingExponent:7,PerMille:8,Infinity:9,NaN:10,TimeSeparator:11,CurrencyDecimal:12,CurrencyGroup:13};return n[n.Decimal]="Decimal",n[n.Group]="Group",n[n.List]="List",n[n.PercentSign]="PercentSign",n[n.PlusSign]="PlusSign",n[n.MinusSign]="MinusSign",n[n.Exponential]="Exponential",n[n.SuperscriptingExponent]="SuperscriptingExponent",n[n.PerMille]="PerMille",n[n.Infinity]="Infinity",n[n.NaN]="NaN",n[n.TimeSeparator]="TimeSeparator",n[n.CurrencyDecimal]="CurrencyDecimal",n[n.CurrencyGroup]="CurrencyGroup",n}();function w(n,t){var e=x(n),l=e[13][t];if("undefined"==typeof l){if(t===v.CurrencyDecimal)return e[13][v.Decimal];if(t===v.CurrencyGroup)return e[13][v.Group]}return l}function x(n){var t=n.toLowerCase().replace(/_/g,"-"),e=g[t];if(e)return e;var l=t.split("-")[0];if(e=g[l])return e;if("en"===l)return m;throw new Error('Missing locale data for the locale "'+n+'".')}var M=new l.r("UseV4Plurals"),k=function(){},C=function(n){function t(t,e){var l=n.call(this)||this;return l.locale=t,l.deprecatedPluralFn=e,l}return Object(i.__extends)(t,n),t.prototype.getPluralCategory=function(n,t){switch(this.deprecatedPluralFn?this.deprecatedPluralFn(t||this.locale,n):function(n){return x(n)[17]}(t||this.locale)(n)){case b.Zero:return"zero";case b.One:return"one";case b.Two:return"two";case b.Few:return"few";case b.Many:return"many";default:return"other"}},t}(k);function S(n,t){t=encodeURIComponent(t);for(var e=0,l=n.split(";");e-1&&(o=o.replace(V,"")),(l=o.search(/e/i))>0?(e<0&&(e=l),e+=+o.slice(l+1),o=o.substring(0,l)):e<0&&(e=o.length),l=0;o.charAt(l)===W;l++);if(l===(i=o.length))t=[0],e=1;else{for(i--;o.charAt(i)===W;)i--;for(e-=l,t=[],r=0;l<=i;l++,r++)t[r]=+o.charAt(l)}return e>B&&(t=t.splice(0,B-1),s=e-1,e=1),{digits:t,exponent:s,integerLen:e}}(i);e===y.Percent&&(d=function(n){if(0===n.digits[0])return n;var t=n.digits.length-n.integerLen;return n.exponent?n.exponent+=2:(0===t?n.digits.push(0,0):1===t&&n.digits.push(0),n.integerLen+=2),n}(d));var h=a.minInt,p=a.minFrac,f=a.maxFrac;if(l){var _=l.match(F);if(null===_)return o.error=l+" is not a valid digit info",o;var m=_[1],g=_[3],b=_[5];null!=m&&(h=K(m)),null!=g&&(p=K(g)),null!=b?f=K(b):null!=g&&p>f&&(f=p)}!function(n,t,e){if(t>e)throw new Error("The minimum number of digits after fraction ("+t+") is higher than the maximum ("+e+").");var l=n.digits,r=l.length-n.integerLen,i=Math.min(Math.max(t,r),e),o=i+n.integerLen,s=l[o];if(o>0){l.splice(Math.max(n.integerLen,o));for(var a=o;a=5)if(o-1<0){for(var c=0;c>o;c--)l.unshift(0),n.integerLen++;l.unshift(1),n.integerLen++}else l[o-1]++;for(;r=h?l.pop():d=!1),t>=10?1:0},0);p&&(l.unshift(p),n.integerLen++)}(d,p,f);var M=d.digits,k=d.integerLen,C=d.exponent,S=[];for(c=M.every(function(n){return!n});k0?S=M.splice(k,M.length):(S=M,M=[0]);var O=[];for(M.length>=a.lgSize&&O.unshift(M.splice(-a.lgSize,M.length).join(""));M.length>a.gSize;)O.unshift(M.splice(-a.gSize,M.length).join(""));M.length&&O.unshift(M.join("")),u=O.join(w(t,r?v.CurrencyGroup:v.Group)),S.length&&(u+=w(t,r?v.CurrencyDecimal:v.Decimal)+S.join("")),C&&(u+=w(t,v.Exponential)+"+"+C)}else u=w(t,v.Infinity);return u=i<0&&!c?a.negPre+u+a.negSuf:a.posPre+u+a.posSuf,e===y.Currency&&null!==r?(o.str=u.replace(q,r).replace(q,""),o):e===y.Percent?(o.str=u.replace(new RegExp(J,"g"),w(t,v.PercentSign)),o):(o.str=u,o)}function K(n){var t=parseInt(n);if(isNaN(t))throw new Error("Invalid integer literal when parsing "+n);return t}var X=function(){function n(){}return n.prototype.createSubscription=function(n,t){return n.subscribe({next:t,error:function(n){throw n}})},n.prototype.dispose=function(n){n.unsubscribe()},n.prototype.onDestroy=function(n){n.unsubscribe()},n}(),Z=new(function(){function n(){}return n.prototype.createSubscription=function(n,t){return n.then(t,function(n){throw n})},n.prototype.dispose=function(n){},n.prototype.onDestroy=function(n){},n}()),$=new X,nn=function(){function n(n){this._ref=n,this._latestValue=null,this._latestReturnedValue=null,this._subscription=null,this._obj=null,this._strategy=null}return n.prototype.ngOnDestroy=function(){this._subscription&&this._dispose()},n.prototype.transform=function(n){return this._obj?n!==this._obj?(this._dispose(),this.transform(n)):this._latestValue===this._latestReturnedValue?this._latestReturnedValue:(this._latestReturnedValue=this._latestValue,l.T.wrap(this._latestValue)):(n&&this._subscribe(n),this._latestReturnedValue=this._latestValue,this._latestValue)},n.prototype._subscribe=function(n){var t=this;this._obj=n,this._strategy=this._selectStrategy(n),this._subscription=this._strategy.createSubscription(n,function(e){return t._updateLatestValue(n,e)})},n.prototype._selectStrategy=function(t){if(Object(l._15)(t))return Z;if(Object(l._14)(t))return $;throw N(n,t)},n.prototype._dispose=function(){this._strategy.dispose(this._subscription),this._latestValue=null,this._latestReturnedValue=null,this._subscription=null,this._obj=null},n.prototype._updateLatestValue=function(n,t){n===this._obj&&(this._latestValue=t,this._ref.markForCheck())},n}(),tn=function(){function n(n){this._locale=n}return n.prototype.transform=function(t,e,l){if(rn(t))return null;var r=Q(t,l=l||this._locale,y.Decimal,e),i=r.str,o=r.error;if(o)throw N(n,o);return i},n}(),en=function(){function n(n){this._locale=n}return n.prototype.transform=function(t,e,l){if(rn(t))return null;var r=Q(t,l=l||this._locale,y.Percent,e),i=r.str,o=r.error;if(o)throw N(n,o);return i},n}(),ln=function(){function n(n){this._locale=n}return n.prototype.transform=function(t,e,l,r,i){if(void 0===l&&(l="symbol"),rn(t))return null;i=i||this._locale,"boolean"==typeof l&&(console&&console.warn&&console.warn('Warning: the currency pipe has been changed in Angular v5. The symbolDisplay option (third parameter) is now a string instead of a boolean. The accepted values are "code", "symbol" or "symbol-narrow".'),l=l?"symbol":"code");var o=e||"USD";"code"!==l&&(o=function(n,t){var e=_[n]||[],r=e[1];return"narrow"==("symbol"===l?"wide":"narrow")&&"string"==typeof r?r:e[0]||n}(o));var s=Q(t,i,y.Currency,r,o),a=s.str,u=s.error;if(u)throw N(n,u);return a},n}();function rn(n){return null==n||""===n||n!=n}var on=function(){},sn=new l.r("DocumentToken"),an=null;function un(){return an}var cn,dn={class:"className",innerHtml:"innerHTML",readonly:"readOnly",tabindex:"tabIndex"},hn={"\b":"Backspace","\t":"Tab","\x7f":"Delete","\x1b":"Escape",Del:"Delete",Esc:"Escape",Left:"ArrowLeft",Right:"ArrowRight",Up:"ArrowUp",Down:"ArrowDown",Menu:"ContextMenu",Scroll:"ScrollLock",Win:"OS"},pn={A:"1",B:"2",C:"3",D:"4",E:"5",F:"6",G:"7",H:"8",I:"9",J:"*",K:"+",M:"-",N:".",O:"/","`":"0","\x90":"NumLock"};l._10.Node&&(cn=l._10.Node.prototype.contains||function(n){return!!(16&this.compareDocumentPosition(n))});var fn,_n=function(n){function t(){return null!==n&&n.apply(this,arguments)||this}return Object(i.__extends)(t,n),t.prototype.parse=function(n){throw new Error("parse not implemented")},t.makeCurrent=function(){var n;n=new t,an||(an=n)},t.prototype.hasProperty=function(n,t){return t in n},t.prototype.setProperty=function(n,t,e){n[t]=e},t.prototype.getProperty=function(n,t){return n[t]},t.prototype.invoke=function(n,t,e){var l;(l=n)[t].apply(l,e)},t.prototype.logError=function(n){window.console&&(console.error?console.error(n):console.log(n))},t.prototype.log=function(n){window.console&&window.console.log&&window.console.log(n)},t.prototype.logGroup=function(n){window.console&&window.console.group&&window.console.group(n)},t.prototype.logGroupEnd=function(){window.console&&window.console.groupEnd&&window.console.groupEnd()},Object.defineProperty(t.prototype,"attrToPropMap",{get:function(){return dn},enumerable:!0,configurable:!0}),t.prototype.contains=function(n,t){return cn.call(n,t)},t.prototype.querySelector=function(n,t){return n.querySelector(t)},t.prototype.querySelectorAll=function(n,t){return n.querySelectorAll(t)},t.prototype.on=function(n,t,e){n.addEventListener(t,e,!1)},t.prototype.onAndCancel=function(n,t,e){return n.addEventListener(t,e,!1),function(){n.removeEventListener(t,e,!1)}},t.prototype.dispatchEvent=function(n,t){n.dispatchEvent(t)},t.prototype.createMouseEvent=function(n){var t=this.getDefaultDocument().createEvent("MouseEvent");return t.initEvent(n,!0,!0),t},t.prototype.createEvent=function(n){var t=this.getDefaultDocument().createEvent("Event");return t.initEvent(n,!0,!0),t},t.prototype.preventDefault=function(n){n.preventDefault(),n.returnValue=!1},t.prototype.isPrevented=function(n){return n.defaultPrevented||null!=n.returnValue&&!n.returnValue},t.prototype.getInnerHTML=function(n){return n.innerHTML},t.prototype.getTemplateContent=function(n){return"content"in n&&this.isTemplateElement(n)?n.content:null},t.prototype.getOuterHTML=function(n){return n.outerHTML},t.prototype.nodeName=function(n){return n.nodeName},t.prototype.nodeValue=function(n){return n.nodeValue},t.prototype.type=function(n){return n.type},t.prototype.content=function(n){return this.hasProperty(n,"content")?n.content:n},t.prototype.firstChild=function(n){return n.firstChild},t.prototype.nextSibling=function(n){return n.nextSibling},t.prototype.parentElement=function(n){return n.parentNode},t.prototype.childNodes=function(n){return n.childNodes},t.prototype.childNodesAsList=function(n){for(var t=n.childNodes,e=new Array(t.length),l=0;l0},t.prototype.tagName=function(n){return n.tagName},t.prototype.attributeMap=function(n){for(var t=new Map,e=n.attributes,l=0;l0;s||(s=n[o]=[]);var u=Xn(t)?Zone.root:Zone.current;if(0===s.length)s.push({zone:u,handler:i});else{for(var c=!1,d=0;d-1},t}(Pn),rt=["alt","control","meta","shift"],it={alt:function(n){return n.altKey},control:function(n){return n.ctrlKey},meta:function(n){return n.metaKey},shift:function(n){return n.shiftKey}},ot=function(n){function t(t){return n.call(this,t)||this}return Object(i.__extends)(t,n),t.prototype.supports=function(n){return null!=t.parseEventName(n)},t.prototype.addEventListener=function(n,e,l){var r=t.parseEventName(e),i=t.eventCallback(r.fullKey,l,this.manager.getZone());return this.manager.getZone().runOutsideAngular(function(){return un().onAndCancel(n,r.domEventName,i)})},t.parseEventName=function(n){var e=n.toLowerCase().split("."),l=e.shift();if(0===e.length||"keydown"!==l&&"keyup"!==l)return null;var r=t._normalizeKey(e.pop()),i="";if(rt.forEach(function(n){var t=e.indexOf(n);t>-1&&(e.splice(t,1),i+=n+".")}),i+=r,0!=e.length||0===r.length)return null;var o={};return o.domEventName=l,o.fullKey=i,o},t.getEventFullKey=function(n){var t="",e=un().getEventKey(n);return" "===(e=e.toLowerCase())?e="space":"."===e&&(e="dot"),rt.forEach(function(l){l!=e&&(0,it[l])(n)&&(t+=l+".")}),t+=e},t.eventCallback=function(n,e,l){return function(r){t.getEventFullKey(r)===n&&l.runGuarded(function(){return e(r)})}},t._normalizeKey=function(n){switch(n){case"esc":return"escape";default:return n}},t}(Pn),st=/^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi,at=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+\/]+=*$/i;function ut(n){return(n=String(n)).match(st)||n.match(at)?n:(Object(l.Y)()&&un().log("WARNING: sanitizing unsafe URL value "+n+" (see http://g.co/ng/security#xss)"),"unsafe:"+n)}var ct=null,dt=null;function ht(n){for(var t={},e=0,l=n.split(",");e")):this.sanitizedSomething=!0},n.prototype.endElement=function(n){var t=dt.nodeName(n).toLowerCase();yt.hasOwnProperty(t)&&!ft.hasOwnProperty(t)&&(this.buf.push(""))},n.prototype.chars=function(n){this.buf.push(St(n))},n}();function Mt(n,t){if(t&&dt.contains(n,t))throw new Error("Failed to sanitize html because the element is clobbered: "+dt.getOuterHTML(n));return t}var kt=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,Ct=/([^\#-~ |!])/g;function St(n){return n.replace(/&/g,"&").replace(kt,function(n){return"&#"+(1024*(n.charCodeAt(0)-55296)+(n.charCodeAt(1)-56320)+65536)+";"}).replace(Ct,function(n){return"&#"+n.charCodeAt(0)+";"}).replace(//g,">")}function Ot(n){dt.attributeMap(n).forEach(function(t,e){"xmlns:ns1"!==e&&0!==e.indexOf("ns1:")||dt.removeAttribute(n,e)});for(var t=0,e=dt.childNodesAsList(n);t0){var l=n.slice(0,t),r=n.slice(t+1).trim();e.set(l,r)}}),e},n.prototype.append=function(n,t){var e=this.getAll(n);null===e?this.set(n,t):e.push(t)},n.prototype.delete=function(n){var t=n.toLowerCase();this._normalizedNames.delete(t),this._headers.delete(t)},n.prototype.forEach=function(n){var t=this;this._headers.forEach(function(e,l){return n(e,t._normalizedNames.get(l),t._headers)})},n.prototype.get=function(n){var t=this.getAll(n);return null===t?null:t.length>0?t[0]:null},n.prototype.has=function(n){return this._headers.has(n.toLowerCase())},n.prototype.keys=function(){return Array.from(this._normalizedNames.values())},n.prototype.set=function(n,t){Array.isArray(t)?t.length&&this._headers.set(n.toLowerCase(),[t.join(",")]):this._headers.set(n.toLowerCase(),[t]),this.mayBeSetNormalizedName(n)},n.prototype.values=function(){return Array.from(this._headers.values())},n.prototype.toJSON=function(){var n=this,t={};return this._headers.forEach(function(e,l){var r=[];e.forEach(function(n){return r.push.apply(r,n.split(","))}),t[n._normalizedNames.get(l)]=r}),t},n.prototype.getAll=function(n){return this.has(n)&&this._headers.get(n.toLowerCase())||null},n.prototype.entries=function(){throw new Error('"entries" method is not implemented on Headers class')},n.prototype.mayBeSetNormalizedName=function(n){var t=n.toLowerCase();this._normalizedNames.has(t)||this._normalizedNames.set(t,n)},n}(),Jt=function(){function n(n){void 0===n&&(n={});var t=n.body,e=n.status,l=n.headers,r=n.statusText,i=n.type,o=n.url;this.body=null!=t?t:null,this.status=null!=e?e:null,this.headers=null!=l?l:null,this.statusText=null!=r?r:null,this.type=null!=i?i:null,this.url=null!=o?o:null}return n.prototype.merge=function(t){return new n({body:t&&null!=t.body?t.body:this.body,status:t&&null!=t.status?t.status:this.status,headers:t&&null!=t.headers?t.headers:this.headers,statusText:t&&null!=t.statusText?t.statusText:this.statusText,type:t&&null!=t.type?t.type:this.type,url:t&&null!=t.url?t.url:this.url})},n}(),Qt=function(n){function t(){return n.call(this,{status:200,statusText:"Ok",type:zt.Default,headers:new qt})||this}return Object(i.__extends)(t,n),t}(Jt),Kt=function(){};function Xt(n){if("string"!=typeof n)return n;switch(n.toUpperCase()){case"GET":return Wt.Get;case"POST":return Wt.Post;case"PUT":return Wt.Put;case"DELETE":return Wt.Delete;case"OPTIONS":return Wt.Options;case"HEAD":return Wt.Head;case"PATCH":return Wt.Patch}throw new Error('Invalid request method. The method "'+n+'" is not supported.')}var Zt=function(n){return n>=200&&n<300},$t=function(){function n(){}return n.prototype.encodeKey=function(n){return ne(n)},n.prototype.encodeValue=function(n){return ne(n)},n}();function ne(n){return encodeURIComponent(n).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/gi,"$").replace(/%2C/gi,",").replace(/%3B/gi,";").replace(/%2B/gi,"+").replace(/%3D/gi,"=").replace(/%3F/gi,"?").replace(/%2F/gi,"/")}var te=function(){function n(n,t){void 0===n&&(n=""),void 0===t&&(t=new $t),this.rawParams=n,this.queryEncoder=t,this.paramsMap=function(n){void 0===n&&(n="");var t=new Map;return n.length>0&&n.split("&").forEach(function(n){var e=n.indexOf("="),l=-1==e?[n,""]:[n.slice(0,e),n.slice(e+1)],r=l[0],i=l[1],o=t.get(r)||[];o.push(i),t.set(r,o)}),t}(n)}return n.prototype.clone=function(){var t=new n("",this.queryEncoder);return t.appendAll(this),t},n.prototype.has=function(n){return this.paramsMap.has(n)},n.prototype.get=function(n){var t=this.paramsMap.get(n);return Array.isArray(t)?t[0]:null},n.prototype.getAll=function(n){return this.paramsMap.get(n)||[]},n.prototype.set=function(n,t){if(void 0!==t&&null!==t){var e=this.paramsMap.get(n)||[];e.length=0,e.push(t),this.paramsMap.set(n,e)}else this.delete(n)},n.prototype.setAll=function(n){var t=this;n.paramsMap.forEach(function(n,e){var l=t.paramsMap.get(e)||[];l.length=0,l.push(n[0]),t.paramsMap.set(e,l)})},n.prototype.append=function(n,t){if(void 0!==t&&null!==t){var e=this.paramsMap.get(n)||[];e.push(t),this.paramsMap.set(n,e)}},n.prototype.appendAll=function(n){var t=this;n.paramsMap.forEach(function(n,e){for(var l=t.paramsMap.get(e)||[],r=0;r=200&&e.status<=299,e.statusText=t.statusText,e.headers=t.headers,e.type=t.type,e.url=t.url,e}return Object(i.__extends)(t,n),t.prototype.toString=function(){return"Response with status: "+this.status+" "+this.statusText+" for URL: "+this.url},t}(ee),re=/^\)\]\}',?\n/,ie=function(){function n(n,t,e){var l=this;this.request=n,this.response=new o.a(function(r){var i=t.build();i.open(Wt[n.method].toUpperCase(),n.url),null!=n.withCredentials&&(i.withCredentials=n.withCredentials);var o=function(){var t=1223===i.status?204:i.status,l=null;204!==t&&"string"==typeof(l="undefined"==typeof i.response?i.responseText:i.response)&&(l=l.replace(re,"")),0===t&&(t=l?200:0);var o,s=qt.fromResponseHeaderString(i.getAllResponseHeaders()),a=("responseURL"in(o=i)?o.responseURL:/^X-Request-URL:/m.test(o.getAllResponseHeaders())?o.getResponseHeader("X-Request-URL"):null)||n.url,u=new Jt({body:l,status:t,headers:s,statusText:i.statusText||"OK",url:a});null!=e&&(u=e.merge(u));var c=new le(u);if(c.ok=Zt(t),c.ok)return r.next(c),void r.complete();r.error(c)},s=function(n){var t=new Jt({body:n,type:zt.Error,status:i.status,statusText:i.statusText});null!=e&&(t=e.merge(t)),r.error(new le(t))};if(l.setDetectedContentType(n,i),null==n.headers&&(n.headers=new qt),n.headers.has("Accept")||n.headers.append("Accept","application/json, text/plain, */*"),n.headers.forEach(function(n,t){return i.setRequestHeader(t,n.join(","))}),null!=n.responseType&&null!=i.responseType)switch(n.responseType){case Gt.ArrayBuffer:i.responseType="arraybuffer";break;case Gt.Json:i.responseType="json";break;case Gt.Text:i.responseType="text";break;case Gt.Blob:i.responseType="blob";break;default:throw new Error("The selected responseType is not supported")}return i.addEventListener("load",o),i.addEventListener("error",s),i.send(l.request.getBody()),function(){i.removeEventListener("load",o),i.removeEventListener("error",s),i.abort()}})}return n.prototype.setDetectedContentType=function(n,t){if(null==n.headers||null==n.headers.get("Content-Type"))switch(n.contentType){case Ut.NONE:break;case Ut.JSON:t.setRequestHeader("content-type","application/json");break;case Ut.FORM:t.setRequestHeader("content-type","application/x-www-form-urlencoded;charset=UTF-8");break;case Ut.TEXT:t.setRequestHeader("content-type","text/plain");break;case Ut.BLOB:var e=n.blob();e.type&&t.setRequestHeader("content-type",e.type)}},n}(),oe=function(){function n(n,t){void 0===n&&(n="XSRF-TOKEN"),void 0===t&&(t="X-XSRF-TOKEN"),this._cookieName=n,this._headerName=t}return n.prototype.configureRequest=function(n){var t=un().getCookie(this._cookieName);t&&n.headers.set(this._headerName,t)},n}(),se=function(){function n(n,t,e){this._browserXHR=n,this._baseResponseOptions=t,this._xsrfStrategy=e}return n.prototype.createConnection=function(n){return this._xsrfStrategy.configureRequest(n),new ie(n,this._browserXHR,this._baseResponseOptions)},n}(),ae=function(){function n(n){void 0===n&&(n={});var t=n.method,e=n.headers,l=n.body,r=n.url,i=n.search,o=n.params,s=n.withCredentials,a=n.responseType;this.method=null!=t?Xt(t):null,this.headers=null!=e?e:null,this.body=null!=l?l:null,this.url=null!=r?r:null,this.params=this._mergeSearchParams(o||i),this.withCredentials=null!=s?s:null,this.responseType=null!=a?a:null}return Object.defineProperty(n.prototype,"search",{get:function(){return this.params},set:function(n){this.params=n},enumerable:!0,configurable:!0}),n.prototype.merge=function(t){return new n({method:t&&null!=t.method?t.method:this.method,headers:t&&null!=t.headers?t.headers:new qt(this.headers),body:t&&null!=t.body?t.body:this.body,url:t&&null!=t.url?t.url:this.url,params:t&&this._mergeSearchParams(t.params||t.search),withCredentials:t&&null!=t.withCredentials?t.withCredentials:this.withCredentials,responseType:t&&null!=t.responseType?t.responseType:this.responseType})},n.prototype._mergeSearchParams=function(n){return n?n instanceof te?n.clone():"string"==typeof n?new te(n):this._parseParams(n):this.params},n.prototype._parseParams=function(n){var t=this;void 0===n&&(n={});var e=new te;return Object.keys(n).forEach(function(l){var r=n[l];Array.isArray(r)?r.forEach(function(n){return t._appendParam(l,n,e)}):t._appendParam(l,r,e)}),e},n.prototype._appendParam=function(n,t,e){"string"!=typeof t&&(t=JSON.stringify(t)),e.append(n,t)},n}(),ue=function(n){function t(){return n.call(this,{method:Wt.Get,headers:new qt})||this}return Object(i.__extends)(t,n),t}(ae),ce=function(n){function t(t){var e=n.call(this)||this,l=t.url;e.url=t.url;var r,i=t.params||t.search;if(i&&(r="object"!=typeof i||i instanceof te?i.toString():function(n){var t=new te;return Object.keys(n).forEach(function(e){var l=n[e];l&&Array.isArray(l)?l.forEach(function(n){return t.append(e,n.toString())}):t.append(e,l.toString())}),t}(i).toString()).length>0){var o="?";-1!=e.url.indexOf("?")&&(o="&"==e.url[e.url.length-1]?"":"&"),e.url=l+o+r}return e._body=t.body,e.method=Xt(t.method),e.headers=new qt(t.headers),e.contentType=e.detectContentType(),e.withCredentials=t.withCredentials,e.responseType=t.responseType,e}return Object(i.__extends)(t,n),t.prototype.detectContentType=function(){switch(this.headers.get("content-type")){case"application/json":return Ut.JSON;case"application/x-www-form-urlencoded":return Ut.FORM;case"multipart/form-data":return Ut.FORM_DATA;case"text/plain":case"text/html":return Ut.TEXT;case"application/octet-stream":return this._body instanceof _e?Ut.ARRAY_BUFFER:Ut.BLOB;default:return this.detectContentTypeFromBody()}},t.prototype.detectContentTypeFromBody=function(){return null==this._body?Ut.NONE:this._body instanceof te?Ut.FORM:this._body instanceof pe?Ut.FORM_DATA:this._body instanceof fe?Ut.BLOB:this._body instanceof _e?Ut.ARRAY_BUFFER:this._body&&"object"==typeof this._body?Ut.JSON:Ut.TEXT},t.prototype.getBody=function(){switch(this.contentType){case Ut.JSON:case Ut.FORM:return this.text();case Ut.FORM_DATA:return this._body;case Ut.TEXT:return this.text();case Ut.BLOB:return this.blob();case Ut.ARRAY_BUFFER:return this.arrayBuffer();default:return null}},t}(ee),de=function(){},he="object"==typeof window?window:de,pe=he.FormData||de,fe=he.Blob||de,_e=he.ArrayBuffer||de;function me(n,t){return n.createConnection(t).response}function ge(n,t,e,l){return n.merge(new ae(t?{method:t.method||e,url:t.url||l,search:t.search,params:t.params,headers:t.headers,body:t.body,withCredentials:t.withCredentials,responseType:t.responseType}:{method:e,url:l}))}var ye=function(){function n(n,t){this._backend=n,this._defaultOptions=t}return n.prototype.request=function(n,t){var e;if("string"==typeof n)e=me(this._backend,new ce(ge(this._defaultOptions,t,Wt.Get,n)));else{if(!(n instanceof ce))throw new Error("First argument must be a url string or Request instance.");e=me(this._backend,n)}return e},n.prototype.get=function(n,t){return this.request(new ce(ge(this._defaultOptions,t,Wt.Get,n)))},n.prototype.post=function(n,t,e){return this.request(new ce(ge(this._defaultOptions.merge(new ae({body:t})),e,Wt.Post,n)))},n.prototype.put=function(n,t,e){return this.request(new ce(ge(this._defaultOptions.merge(new ae({body:t})),e,Wt.Put,n)))},n.prototype.delete=function(n,t){return this.request(new ce(ge(this._defaultOptions,t,Wt.Delete,n)))},n.prototype.patch=function(n,t,e){return this.request(new ce(ge(this._defaultOptions.merge(new ae({body:t})),e,Wt.Patch,n)))},n.prototype.head=function(n,t){return this.request(new ce(ge(this._defaultOptions,t,Wt.Head,n)))},n.prototype.options=function(n,t){return this.request(new ce(ge(this._defaultOptions,t,Wt.Options,n)))},n}();function be(){return new oe}function ve(n,t){return new ye(n,t)}var we=function(){},xe=function(n){function t(t,e){n.call(this),this.error=t,this.scheduler=e}return Object(i.__extends)(t,n),t.create=function(n,e){return new t(n,e)},t.dispatch=function(n){n.subscriber.error(n.error)},t.prototype._subscribe=function(n){var e=this.error,l=this.scheduler;if(n.syncErrorThrowable=!0,l)return l.schedule(t.dispatch,0,{error:e,subscriber:n});n.error(e)},t}(o.a).create;o.a.throw=xe;var Me=e("tZ2B"),ke=e("PIsA");function Ce(n){return function(t){var e=new Se(n),l=t.lift(e);return e.caught=l}}var Se=function(){function n(n){this.selector=n}return n.prototype.call=function(n,t){return t.subscribe(new Oe(n,this.selector,this.caught))},n}(),Oe=function(n){function t(t,e,l){n.call(this,t),this.selector=e,this.caught=l}return Object(i.__extends)(t,n),t.prototype.error=function(t){if(!this.isStopped){var e=void 0;try{e=this.selector(t,this.caught)}catch(t){return void n.prototype.error.call(this,t)}this._unsubscribeAndRecycle(),this.add(Object(ke.a)(this,e))}},t}(Me.a);function Te(n){return Ce(n)(this)}o.a.prototype.catch=Te,o.a.prototype._catch=Te;var Le=e("HdCx");function Pe(n,t){return Object(Le.a)(n,t)(this)}o.a.prototype.map=Pe;var De=e("YKDW"),Ae=e("uotZ"),Ee=e.n(Ae),Ye=function(){function n(n,t){this.http=n,this.translate=t,this.url=r.nodeUrl}return n.prototype.getTransactions=function(n){var t=n.map(function(n){return n.address}).join(",");return this.post("transactions",{addrs:t,verbose:!0}).map(function(n){return n.map(function(n){return{addresses:[],balance:new Ae.BigNumber(0),block:n.status.block_seq,confirmed:n.status.confirmed,timestamp:n.txn.timestamp,txid:n.txn.txid,inputs:n.txn.inputs,outputs:n.txn.outputs}})})},n.prototype.getVersion=function(){return this.get("version")},n.prototype.generateSeed=function(n){return void 0===n&&(n=128),this.get("wallet/newSeed",{entropy:n}).map(function(n){return n.seed})},n.prototype.getHealth=function(){return this.get("health")},n.prototype.getWallets=function(){return this.get("wallets").map(function(n){var t=[];return n.forEach(function(n){var e={label:n.meta.label,filename:n.meta.filename,coins:null,hours:null,addresses:[],encrypted:n.meta.encrypted};n.entries&&(e.addresses=n.entries.map(function(n){return{address:n.address,coins:null,hours:null,confirmed:!0}})),t.push(e)}),t})},n.prototype.getWalletSeed=function(n,t){return this.post("wallet/seed",{id:n.filename,password:t}).map(function(n){return n.seed})},n.prototype.postWalletCreate=function(n,t,e,l,r){var i={label:n,seed:t,scan:e,type:r};return l&&(i.password=l,i.encrypt=!0),this.post("wallet/create",i).map(function(n){return{label:n.meta.label,filename:n.meta.filename,coins:null,hours:null,addresses:n.entries.map(function(n){return{address:n.address,coins:null,hours:null,confirmed:!0}}),encrypted:n.meta.encrypted}})},n.prototype.postWalletNewAddress=function(n,t,e){var l=new Object;return l.id=n.filename,l.num=t,e&&(l.password=e),this.post("wallet/newAddress",l).map(function(n){var t=[];return n.addresses.forEach(function(n){t.push({address:n,coins:null,hours:null})}),t})},n.prototype.postWalletToggleEncryption=function(n,t){return this.post("wallet/"+(n.encrypted?"decrypt":"encrypt"),{id:n.filename,password:t})},n.prototype.get=function(n,t,e,l){var r=this;return void 0===t&&(t=null),void 0===e&&(e={}),void 0===l&&(l=!1),this.http.get(this.getUrl(n,t,l),this.returnRequestOptions(e)).map(function(n){return n.json()}).catch(function(n){return r.processConnectionError(n)})},n.prototype.getCsrf=function(){return this.get("csrf").map(function(n){return n.csrf_token})},n.prototype.post=function(n,t,e,l){var r=this;return void 0===t&&(t={}),void 0===e&&(e={}),void 0===l&&(l=!1),this.getCsrf().first().flatMap(function(i){return e.csrf=i,l&&(e.json=!0),r.http.post(r.getUrl(n,null,l),e.json||l?JSON.stringify(t):r.getQueryString(t),r.returnRequestOptions(e)).map(function(n){return n.json()}).catch(function(n){return r.processConnectionError(n)})})},n.prototype.returnRequestOptions=function(n){var t=new ae;return t.headers=this.getHeaders(n),n.csrf&&t.headers.append("X-CSRF-Token",n.csrf),t},n.prototype.getHeaders=function(n){var t=new qt;return t.append("Content-Type",n.json?"application/json":"application/x-www-form-urlencoded"),t},n.prototype.getQueryString=function(n){return void 0===n&&(n=null),n?Object.keys(n).reduce(function(t,e){return t.push(e+"="+encodeURIComponent(n[e])),t},[]).join("&"):""},n.prototype.getUrl=function(n,t,e){return void 0===t&&(t=null),void 0===e&&(e=!1),n.startsWith("/")&&(n=n.substr(1,n.length-1)),this.url+(e?"v2/":"v1/")+n+"?"+this.getQueryString(t)},n.prototype.processConnectionError=function(n,t){if(void 0===t&&(t=!1),n){if("string"==typeof n._body)return o.a.throw(n);if(n.error&&"string"==typeof n.error)return n._body=n.error,o.a.throw(n);if(n.message)return n._body=n.message,o.a.throw(n)}var e=Error(this.translate.instant(t?"hardware-wallet.errors.daemon-connection":"service.api.server-error"));return e._body=e.message,o.a.throw(e)},n}(),je=e("+3/4"),Ie=e("BX3T"),Re=function(n){function t(t,e){n.call(this),this.sources=t,this.resultSelector=e}return Object(i.__extends)(t,n),t.create=function(){for(var n=[],e=0;e=0}o.a.prototype.mergeMap=tl,o.a.prototype.flatMap=tl;var ll=e("AMGY"),rl=e("VwZZ"),il=function(n){function t(t,e){n.call(this,t,e),this.scheduler=t,this.work=e,this.pending=!1}return Object(i.__extends)(t,n),t.prototype.schedule=function(n,t){if(void 0===t&&(t=0),this.closed)return this;this.state=n,this.pending=!0;var e=this.id,l=this.scheduler;return null!=e&&(this.id=this.recycleAsyncId(l,e,t)),this.delay=t,this.id=this.id||this.requestAsyncId(l,this.id,t),this},t.prototype.requestAsyncId=function(n,t,e){return void 0===e&&(e=0),ll.a.setInterval(n.flush.bind(n,this),e)},t.prototype.recycleAsyncId=function(n,t,e){if(void 0===e&&(e=0),null!==e&&this.delay===e&&!1===this.pending)return t;ll.a.clearInterval(t)},t.prototype.execute=function(n,t){if(this.closed)return new Error("executing a cancelled action");this.pending=!1;var e=this._execute(n,t);if(e)return e;!1===this.pending&&null!=this.id&&(this.id=this.recycleAsyncId(this.scheduler,this.id,null))},t.prototype._execute=function(n,t){var e=!1,l=void 0;try{this.work(n)}catch(n){e=!0,l=!!n&&n||new Error(n)}if(e)return this.unsubscribe(),l},t.prototype._unsubscribe=function(){var n=this.id,t=this.scheduler,e=t.actions,l=e.indexOf(this);this.work=null,this.state=null,this.pending=!1,this.scheduler=null,-1!==l&&e.splice(l,1),null!=n&&(this.id=this.recycleAsyncId(t,n,null)),this.delay=null},t}(function(n){function t(t,e){n.call(this)}return Object(i.__extends)(t,n),t.prototype.schedule=function(n,t){return void 0===t&&(t=0),this},t}(rl.a)),ol=function(n){function t(){n.apply(this,arguments),this.actions=[],this.active=!1,this.scheduled=void 0}return Object(i.__extends)(t,n),t.prototype.flush=function(n){var t=this.actions;if(this.active)t.push(n);else{var e;this.active=!0;do{if(e=n.execute(n.state,n.delay))break}while(n=t.shift());if(this.active=!1,e){for(;n=t.shift();)n.unsubscribe();throw e}}},t}(function(){function n(t,e){void 0===e&&(e=n.now),this.SchedulerAction=t,this.now=e}return n.prototype.schedule=function(n,t,e){return void 0===t&&(t=0),new this.SchedulerAction(this,n).schedule(e,t)},n.now=Date.now?Date.now:function(){return+new Date},n}()),sl=new ol(il),al=e("1Q68");function ul(n){return n instanceof Date&&!isNaN(+n)}var cl=function(n){function t(t,e,l){void 0===t&&(t=0),n.call(this),this.period=-1,this.dueTime=0,el(e)?this.period=Number(e)<1?1:Number(e):Object(al.a)(e)&&(l=e),Object(al.a)(l)||(l=sl),this.scheduler=l,this.dueTime=ul(t)?+t-this.scheduler.now():t}return Object(i.__extends)(t,n),t.create=function(n,e,l){return void 0===n&&(n=0),new t(n,e,l)},t.dispatch=function(n){var t=n.index,e=n.period,l=n.subscriber;if(l.next(t),!l.closed){if(-1===e)return l.complete();n.index=t+1,this.schedule(n,e)}},t.prototype._subscribe=function(n){return this.scheduler.schedule(t.dispatch,this.dueTime,{index:0,period:this.period,subscriber:n})},t}(o.a).create;o.a.timer=cl;var dl=e("Veqx"),hl=e("etqZ"),pl=function(){function n(n){this.project=n}return n.prototype.call=function(n,t){return t.subscribe(new fl(n,this.project))},n}(),fl=function(n){function t(t,e,l){void 0===l&&(l=Object.create(null)),n.call(this,t),this.iterators=[],this.active=0,this.project="function"==typeof e?e:null,this.values=l}return Object(i.__extends)(t,n),t.prototype._next=function(n){var t=this.iterators;Object(Ie.a)(n)?t.push(new ml(n)):t.push("function"==typeof n[hl.a]?new _l(n[hl.a]()):new gl(this.destination,this,n))},t.prototype._complete=function(){var n=this.iterators,t=n.length;if(0!==t){this.active=t;for(var e=0;ethis.index},n.prototype.hasCompleted=function(){return this.array.length===this.index},n}(),gl=function(n){function t(t,e,l){n.call(this,t),this.parent=e,this.observable=l,this.stillUnsubscribed=!0,this.buffer=[],this.isComplete=!1}return Object(i.__extends)(t,n),t.prototype[hl.a]=function(){return this},t.prototype.next=function(){var n=this.buffer;return 0===n.length&&this.isComplete?{value:null,done:!0}:{value:n.shift(),done:!1}},t.prototype.hasValue=function(){return this.buffer.length>0},t.prototype.hasCompleted=function(){return 0===this.buffer.length&&this.isComplete},t.prototype.notifyComplete=function(){this.buffer.length>0?(this.isComplete=!0,this.parent.notifyInactive()):this.destination.complete()},t.prototype.notifyNext=function(n,t,e,l,r){this.buffer.push(t),this.parent.checkIterators()},t.prototype.subscribe=function(n,t){return Object(ke.a)(this,this.observable,this,t)},t}(Me.a);o.a.zip=function(){for(var n=[],t=0;t0?n.prototype.schedule.call(this,t,e):(this.delay=e,this.state=t,this.scheduler.flush(this),this)},t.prototype.execute=function(t,e){return e>0||this.closed?n.prototype.execute.call(this,t,e):this._execute(t,e)},t.prototype.requestAsyncId=function(t,e,l){return void 0===l&&(l=0),null!==l&&l>0||null===l&&this.delay>0?n.prototype.requestAsyncId.call(this,t,e,l):t.flush(this)},t}(il),vl=new(function(n){function t(){n.apply(this,arguments)}return Object(i.__extends)(t,n),t}(ol))(bl),wl=function(){function n(n,t,e){this.kind=n,this.value=t,this.error=e,this.hasValue="N"===n}return n.prototype.observe=function(n){switch(this.kind){case"N":return n.next&&n.next(this.value);case"E":return n.error&&n.error(this.error);case"C":return n.complete&&n.complete()}},n.prototype.do=function(n,t,e){switch(this.kind){case"N":return n&&n(this.value);case"E":return t&&t(this.error);case"C":return e&&e()}},n.prototype.accept=function(n,t,e){return n&&"function"==typeof n.next?this.observe(n):this.do(n,t,e)},n.prototype.toObservable=function(){switch(this.kind){case"N":return o.a.of(this.value);case"E":return o.a.throw(this.error);case"C":return o.a.empty()}throw new Error("unexpected notification kind value")},n.createNext=function(t){return"undefined"!=typeof t?new n("N",t):n.undefinedValueNotification},n.createError=function(t){return new n("E",void 0,t)},n.createComplete=function(){return n.completeNotification},n.completeNotification=new n("C"),n.undefinedValueNotification=new n("N",void 0),n}(),xl=function(n){function t(t,e,l){void 0===l&&(l=0),n.call(this,t),this.scheduler=e,this.delay=l}return Object(i.__extends)(t,n),t.dispatch=function(n){n.notification.observe(n.destination),this.unsubscribe()},t.prototype.scheduleMessage=function(n){this.add(this.scheduler.schedule(t.dispatch,this.delay,new Ml(n,this.destination)))},t.prototype._next=function(n){this.scheduleMessage(wl.createNext(n))},t.prototype._error=function(n){this.scheduleMessage(wl.createError(n))},t.prototype._complete=function(){this.scheduleMessage(wl.createComplete())},t}(Be.a),Ml=function(n,t){this.notification=n,this.destination=t},kl=e("x6VL"),Cl=e("1Bqh"),Sl=function(n){function t(t,e,l){void 0===t&&(t=Number.POSITIVE_INFINITY),void 0===e&&(e=Number.POSITIVE_INFINITY),n.call(this),this.scheduler=l,this._events=[],this._bufferSize=t<1?1:t,this._windowTime=e<1?1:e}return Object(i.__extends)(t,n),t.prototype.next=function(t){var e=this._getNow();this._events.push(new Ol(e,t)),this._trimBufferThenGetEvents(),n.prototype.next.call(this,t)},t.prototype._subscribe=function(n){var t,e=this._trimBufferThenGetEvents(),l=this.scheduler;if(this.closed)throw new kl.a;this.hasError?t=rl.a.EMPTY:this.isStopped?t=rl.a.EMPTY:(this.observers.push(n),t=new Cl.a(this,n)),l&&n.add(n=new xl(n,l));for(var r=e.length,i=0;it&&(i=Math.max(i,r-t)),i>0&&l.splice(0,i),l},t}(yl.a),Ol=function(n,t){this.time=n,this.value=t},Tl=function(n){function t(t){n.call(this),this._value=t}return Object(i.__extends)(t,n),Object.defineProperty(t.prototype,"value",{get:function(){return this.getValue()},enumerable:!0,configurable:!0}),t.prototype._subscribe=function(t){var e=n.prototype._subscribe.call(this,t);return e&&!e.closed&&t.next(this._value),e},t.prototype.getValue=function(){if(this.hasError)throw this.thrownError;if(this.closed)throw new kl.a;return this._value},t.prototype.next=function(t){n.prototype.next.call(this,this._value=t)},t}(yl.a),Ll={otcEnabled:!1,maxHardwareWalletAddresses:1,useHwWalletDaemon:!0,urlForHwWalletVersionChecking:"https://version.skycoin.com/skywallet/version.txt",hwWalletDownloadUrlAndPrefix:"https://downloads.skycoin.com/skywallet/skywallet-firmware-v",urlForVersionChecking:"https://version.skycoin.com/skycoin/version.txt",walletDownloadUrl:"https://www.skycoin.com/downloads/",uriSpecificatioPrefix:"skycoin",languages:[{code:"en",name:"English",iconName:"en.png"},{code:"zh",name:"\u4e2d\u6587",iconName:"zh.png"},{code:"es",name:"Espa\xf1ol",iconName:"es.png"}],defaultLanguage:"en"},Pl=new l.r("cdk-dir-doc"),Dl=function(){return function(n){this.value="ltr",this.change=new l.o,n&&(this.value=(n.body?n.body.dir:null)||(n.documentElement?n.documentElement.dir:null)||"ltr")}}(),Al=function(){};function El(n){return null!=n&&""+n!="false"}function Yl(n,t){return void 0===t&&(t=0),isNaN(parseFloat(n))||isNaN(Number(n))?t:Number(n)}var jl,Il,Rl="undefined"!=typeof Intl&&Intl.v8BreakIterator,Hl=function(){return function(){this.isBrowser="object"==typeof document&&!!document,this.EDGE=this.isBrowser&&/(edge)/i.test(navigator.userAgent),this.TRIDENT=this.isBrowser&&/(msie|trident)/i.test(navigator.userAgent),this.BLINK=this.isBrowser&&!(!window.chrome&&!Rl)&&!!CSS&&!this.EDGE&&!this.TRIDENT,this.WEBKIT=this.isBrowser&&/AppleWebKit/i.test(navigator.userAgent)&&!this.BLINK&&!this.EDGE&&!this.TRIDENT,this.IOS=this.isBrowser&&/iPad|iPhone|iPod/.test(navigator.userAgent)&&!window.MSStream,this.FIREFOX=this.isBrowser&&/(firefox|minefield)/i.test(navigator.userAgent),this.ANDROID=this.isBrowser&&/android/i.test(navigator.userAgent)&&!this.TRIDENT,this.SAFARI=this.isBrowser&&/safari/i.test(navigator.userAgent)&&this.WEBKIT}}();function Nl(){if(null==jl&&"undefined"!=typeof window)try{window.addEventListener("test",null,Object.defineProperty({},"passive",{get:function(){return jl=!0}}))}finally{jl=jl||!1}return jl}var Fl=["color","button","checkbox","date","datetime-local","email","file","hidden","image","month","number","password","radio","range","reset","search","submit","tel","text","time","url","week"];function Bl(){if(Il)return Il;if("object"!=typeof document||!document)return Il=new Set(Fl);var n=document.createElement("input");return Il=new Set(Fl.filter(function(t){return n.setAttribute("type",t),n.type===t}))}var Vl=function(){},Wl=new l.r("mat-sanity-checks"),zl=function(){function n(n){this._sanityChecksEnabled=n,this._hasDoneGlobalChecks=!1,this._hasCheckedHammer=!1,this._document="object"==typeof document&&document?document:null,this._window="object"==typeof window&&window?window:null,this._areChecksEnabled()&&!this._hasDoneGlobalChecks&&(this._checkDoctypeIsDefined(),this._checkThemeIsPresent(),this._hasDoneGlobalChecks=!0)}return n.prototype._areChecksEnabled=function(){return this._sanityChecksEnabled&&Object(l.Y)()&&!this._isTestEnv()},n.prototype._isTestEnv=function(){return this._window&&(this._window.__karma__||this._window.jasmine)},n.prototype._checkDoctypeIsDefined=function(){this._document&&!this._document.doctype&&console.warn("Current document does not have a doctype. This may cause some Angular Material components not to behave as expected.")},n.prototype._checkThemeIsPresent=function(){if(this._document&&"function"==typeof getComputedStyle){var n=this._document.createElement("div");n.classList.add("mat-theme-loaded-marker"),this._document.body.appendChild(n);var t=getComputedStyle(n);t&&"none"!==t.display&&console.warn("Could not find Angular Material core theme. Most Material components may not work as expected. For more info refer to the theming guide: https://material.angular.io/guide/theming"),this._document.body.removeChild(n)}},n.prototype._checkHammerIsAvailable=function(){!this._hasCheckedHammer&&this._window&&(this._areChecksEnabled()&&!this._window.Hammer&&console.warn("Could not find HammerJS. Certain Angular Material components may not work correctly."),this._hasCheckedHammer=!0)},n}();function Ul(n){return function(n){function t(){for(var t=[],e=0;e=0},n.prototype.isFocusable=function(n){return function(n){return!function(n){return function(n){return"input"==n.nodeName.toLowerCase()}(n)&&"hidden"==n.type}(n)&&(function(n){var t=n.nodeName.toLowerCase();return"input"===t||"select"===t||"button"===t||"textarea"===t}(n)||function(n){return function(n){return"a"==n.nodeName.toLowerCase()}(n)&&n.hasAttribute("href")}(n)||n.hasAttribute("contenteditable")||wr(n))}(n)&&!this.isDisabled(n)&&this.isVisible(n)},n}();function wr(n){if(!n.hasAttribute("tabindex")||void 0===n.tabIndex)return!1;var t=n.getAttribute("tabindex");return"-32768"!=t&&!(!t||isNaN(parseInt(t,10)))}function xr(n){if(!wr(n))return null;var t=parseInt(n.getAttribute("tabindex")||"",10);return isNaN(t)?-1:t}var Mr=function(){function n(n,t,e,l,r){void 0===r&&(r=!1),this._element=n,this._checker=t,this._ngZone=e,this._document=l,this._enabled=!0,r||this.attachAnchors()}return Object.defineProperty(n.prototype,"enabled",{get:function(){return this._enabled},set:function(n){this._enabled=n,this._startAnchor&&this._endAnchor&&(this._startAnchor.tabIndex=this._endAnchor.tabIndex=this._enabled?0:-1)},enumerable:!0,configurable:!0}),n.prototype.destroy=function(){this._startAnchor&&this._startAnchor.parentNode&&this._startAnchor.parentNode.removeChild(this._startAnchor),this._endAnchor&&this._endAnchor.parentNode&&this._endAnchor.parentNode.removeChild(this._endAnchor),this._startAnchor=this._endAnchor=null},n.prototype.attachAnchors=function(){var n=this;this._startAnchor||(this._startAnchor=this._createAnchor()),this._endAnchor||(this._endAnchor=this._createAnchor()),this._ngZone.runOutsideAngular(function(){n._startAnchor.addEventListener("focus",function(){n.focusLastTabbableElement()}),n._endAnchor.addEventListener("focus",function(){n.focusFirstTabbableElement()}),n._element.parentNode&&(n._element.parentNode.insertBefore(n._startAnchor,n._element),n._element.parentNode.insertBefore(n._endAnchor,n._element.nextSibling))})},n.prototype.focusInitialElementWhenReady=function(){var n=this;return new Promise(function(t){n._executeOnStable(function(){return t(n.focusInitialElement())})})},n.prototype.focusFirstTabbableElementWhenReady=function(){var n=this;return new Promise(function(t){n._executeOnStable(function(){return t(n.focusFirstTabbableElement())})})},n.prototype.focusLastTabbableElementWhenReady=function(){var n=this;return new Promise(function(t){n._executeOnStable(function(){return t(n.focusLastTabbableElement())})})},n.prototype._getRegionBoundary=function(n){for(var t=this._element.querySelectorAll("[cdk-focus-region-"+n+"], [cdkFocusRegion"+n+"], [cdk-focus-"+n+"]"),e=0;e=0;e--){var l=1===t[e].nodeType?this._getLastTabbableElement(t[e]):null;if(l)return l}return null},n.prototype._createAnchor=function(){var n=this._document.createElement("div");return n.tabIndex=this._enabled?0:-1,n.classList.add("cdk-visually-hidden"),n.classList.add("cdk-focus-trap-anchor"),n},n.prototype._executeOnStable=function(n){this._ngZone.isStable?n():this._ngZone.onStable.asObservable().pipe(Object(_r.a)(1)).subscribe(n)},n}(),kr=function(){function n(n,t,e){this._checker=n,this._ngZone=t,this._document=e}return n.prototype.create=function(n,t){return void 0===t&&(t=!1),new Mr(n,this._checker,this._ngZone,this._document,t)},n}(),Cr=function(){function n(n){this._items=n,this._activeItemIndex=-1,this._wrap=!1,this._letterKeyStream=new yl.a,this._typeaheadSubscription=rl.a.EMPTY,this._pressedLetters=[],this.tabOut=new yl.a,this.change=new yl.a}return n.prototype.withWrap=function(){return this._wrap=!0,this},n.prototype.withTypeAhead=function(n){var t=this;if(void 0===n&&(n=200),this._items.length&&this._items.some(function(n){return"function"!=typeof n.getLabel}))throw Error("ListKeyManager items in typeahead mode must implement the `getLabel` method.");return this._typeaheadSubscription.unsubscribe(),this._typeaheadSubscription=this._letterKeyStream.pipe(Ve(function(n){return t._pressedLetters.push(n)}),mr(n),Ge(function(){return t._pressedLetters.length>0}),Object(Le.a)(function(){return t._pressedLetters.join("")})).subscribe(function(n){for(var e=t._items.toArray(),l=1;l=65&&t<=90||t>=48&&t<=91)&&this._letterKeyStream.next(String.fromCharCode(t)))}this._pressedLetters=[],n.preventDefault()},Object.defineProperty(n.prototype,"activeItemIndex",{get:function(){return this._activeItemIndex},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"activeItem",{get:function(){return this._activeItem},enumerable:!0,configurable:!0}),n.prototype.setFirstItemActive=function(){this._setActiveItemByIndex(0,1)},n.prototype.setLastItemActive=function(){this._setActiveItemByIndex(this._items.length-1,-1)},n.prototype.setNextItemActive=function(){this._activeItemIndex<0?this.setFirstItemActive():this._setActiveItemByDelta(1)},n.prototype.setPreviousItemActive=function(){this._activeItemIndex<0&&this._wrap?this.setLastItemActive():this._setActiveItemByDelta(-1)},n.prototype.updateActiveItemIndex=function(n){this._activeItemIndex=n},n.prototype._setActiveItemByDelta=function(n,t){void 0===t&&(t=this._items.toArray()),this._wrap?this._setActiveInWrapMode(n,t):this._setActiveInDefaultMode(n,t)},n.prototype._setActiveInWrapMode=function(n,t){this._activeItemIndex=(this._activeItemIndex+n+t.length)%t.length,t[this._activeItemIndex].disabled?this._setActiveInWrapMode(n,t):this.setActiveItem(this._activeItemIndex)},n.prototype._setActiveInDefaultMode=function(n,t){this._setActiveItemByIndex(this._activeItemIndex+n,n,t)},n.prototype._setActiveItemByIndex=function(n,t,e){if(void 0===e&&(e=this._items.toArray()),e[n]){for(;e[n].disabled;)if(!e[n+=t])return;this.setActiveItem(n)}},n}(),Sr=function(n){function t(){return null!==n&&n.apply(this,arguments)||this}return Object(i.__extends)(t,n),t.prototype.setActiveItem=function(t){this.activeItem&&this.activeItem.setInactiveStyles(),n.prototype.setActiveItem.call(this,t),this.activeItem&&this.activeItem.setActiveStyles()},t}(Cr);function Or(n,t){return(n.getAttribute(t)||"").match(/\S+/g)||[]}var Tr=0,Lr=new Map,Pr=null,Dr=function(){function n(n){this._document=n}return n.prototype.describe=function(n,t){t.trim()&&(Lr.has(t)||this._createMessageElement(t),this._isElementDescribedByMessage(n,t)||this._addMessageReference(n,t))},n.prototype.removeDescription=function(n,t){if(t.trim()){this._isElementDescribedByMessage(n,t)&&this._removeMessageReference(n,t);var e=Lr.get(t);e&&0===e.referenceCount&&this._deleteMessageElement(t),Pr&&0===Pr.childNodes.length&&this._deleteMessagesContainer()}},n.prototype.ngOnDestroy=function(){for(var n=this._document.querySelectorAll("[cdk-describedby-host]"),t=0;t0?t._scrolled.pipe(qr(n)).subscribe(e):t._scrolled.subscribe(e);return t._scrolledCount++,function(){l.unsubscribe(),t._scrolledCount--,t._globalSubscription&&!t._scrolledCount&&(t._globalSubscription.unsubscribe(),t._globalSubscription=null)}}):Object(Fe.a)()},n.prototype.ancestorScrolled=function(n,t){var e=this.getAncestorScrollContainers(n);return this.scrolled(t).pipe(Ge(function(n){return!n||e.indexOf(n)>-1}))},n.prototype.getAncestorScrollContainers=function(n){var t=this,e=[];return this.scrollContainers.forEach(function(l,r){t._scrollableContainsElement(r,n)&&e.push(r)}),e},n.prototype._scrollableContainsElement=function(n,t){var e=t.nativeElement,l=n.getElementRef().nativeElement;do{if(e==l)return!0}while(e=e.parentElement);return!1},n.prototype._addGlobalListener=function(){var n=this;this._globalSubscription=this._ngZone.runOutsideAngular(function(){return zr(window.document,"scroll").subscribe(function(){return n._scrolled.next()})})},n}();function Kr(n,t,e){return n||new Qr(t,e)}var Xr=function(){function n(n,t){var e=this;this._change=n.isBrowser?t.runOutsideAngular(function(){return Object(Jr.a)(zr(window,"resize"),zr(window,"orientationchange"))}):Object(Fe.a)(),this._invalidateCache=this.change().subscribe(function(){return e._updateViewportSize()})}return n.prototype.ngOnDestroy=function(){this._invalidateCache.unsubscribe()},n.prototype.getViewportSize=function(){return this._viewportSize||this._updateViewportSize(),{width:this._viewportSize.width,height:this._viewportSize.height}},n.prototype.getViewportRect=function(){var n=this.getViewportScrollPosition(),t=this.getViewportSize(),e=t.width,l=t.height;return{top:n.top,left:n.left,bottom:n.top+l,right:n.left+e,height:l,width:e}},n.prototype.getViewportScrollPosition=function(){var n=document.documentElement.getBoundingClientRect();return{top:-n.top||document.body.scrollTop||window.scrollY||document.documentElement.scrollTop||0,left:-n.left||document.body.scrollLeft||window.scrollX||document.documentElement.scrollLeft||0}},n.prototype.change=function(n){return void 0===n&&(n=20),n>0?this._change.pipe(qr(n)):this._change},n.prototype._updateViewportSize=function(){this._viewportSize={width:window.innerWidth,height:window.innerHeight}},n}();function Zr(n,t,e){return n||new Xr(t,e)}var $r=function(){};function ni(){throw Error("Host already has a portal attached")}var ti=function(){function n(){}return n.prototype.attach=function(n){return null==n&&function(){throw Error("Attempting to attach a portal to a null PortalOutlet")}(),n.hasAttached()&&ni(),this._attachedHost=n,n.attach(this)},n.prototype.detach=function(){var n=this._attachedHost;null==n?function(){throw Error("Attempting to detach a portal that is not attached to a host")}():(this._attachedHost=null,n.detach())},Object.defineProperty(n.prototype,"isAttached",{get:function(){return null!=this._attachedHost},enumerable:!0,configurable:!0}),n.prototype.setAttachedHost=function(n){this._attachedHost=n},n}(),ei=function(n){function t(t,e,l){var r=n.call(this)||this;return r.component=t,r.viewContainerRef=e,r.injector=l,r}return Object(i.__extends)(t,n),t}(ti),li=function(n){function t(t,e,l){var r=n.call(this)||this;return r.templateRef=t,r.viewContainerRef=e,l&&(r.context=l),r}return Object(i.__extends)(t,n),Object.defineProperty(t.prototype,"origin",{get:function(){return this.templateRef.elementRef},enumerable:!0,configurable:!0}),t.prototype.attach=function(t,e){return void 0===e&&(e=this.context),this.context=e,n.prototype.attach.call(this,t)},t.prototype.detach=function(){return this.context=void 0,n.prototype.detach.call(this)},t}(ti),ri=function(){function n(){this._isDisposed=!1}return n.prototype.hasAttached=function(){return!!this._attachedPortal},n.prototype.attach=function(n){return n||function(){throw Error("Must provide a portal to attach")}(),this.hasAttached()&&ni(),this._isDisposed&&function(){throw Error("This PortalOutlet has already been disposed")}(),n instanceof ei?(this._attachedPortal=n,this.attachComponentPortal(n)):n instanceof li?(this._attachedPortal=n,this.attachTemplatePortal(n)):void function(){throw Error("Attempting to attach an unknown Portal type. BasePortalOutlet accepts either a ComponentPortal or a TemplatePortal.")}()},n.prototype.detach=function(){this._attachedPortal&&(this._attachedPortal.setAttachedHost(null),this._attachedPortal=null),this._invokeDisposeFn()},n.prototype.dispose=function(){this.hasAttached()&&this.detach(),this._invokeDisposeFn(),this._isDisposed=!0},n.prototype.setDisposeFn=function(n){this._disposeFn=n},n.prototype._invokeDisposeFn=function(){this._disposeFn&&(this._disposeFn(),this._disposeFn=null)},n}(),ii=function(n){function t(t,e,l,r){var i=n.call(this)||this;return i._hostDomElement=t,i._componentFactoryResolver=e,i._appRef=l,i._defaultInjector=r,i}return Object(i.__extends)(t,n),t.prototype.attachComponentPortal=function(n){var t,e=this,l=this._componentFactoryResolver.resolveComponentFactory(n.component);return n.viewContainerRef?(t=n.viewContainerRef.createComponent(l,n.viewContainerRef.length,n.injector||n.viewContainerRef.parentInjector),this.setDisposeFn(function(){return t.destroy()})):(t=l.create(n.injector||this._defaultInjector),this._appRef.attachView(t.hostView),this.setDisposeFn(function(){e._appRef.detachView(t.hostView),t.destroy()})),this._hostDomElement.appendChild(this._getComponentRootNode(t)),t},t.prototype.attachTemplatePortal=function(n){var t=this,e=n.viewContainerRef,l=e.createEmbeddedView(n.templateRef,n.context);return l.detectChanges(),l.rootNodes.forEach(function(n){return t._hostDomElement.appendChild(n)}),this.setDisposeFn(function(){var n=e.indexOf(l);-1!==n&&e.remove(n)}),l},t.prototype.dispose=function(){n.prototype.dispose.call(this),null!=this._hostDomElement.parentNode&&this._hostDomElement.parentNode.removeChild(this._hostDomElement)},t.prototype._getComponentRootNode=function(n){return n.hostView.rootNodes[0]},t}(ri),oi=function(n){function t(t,e){var l=n.call(this)||this;return l._componentFactoryResolver=t,l._viewContainerRef=e,l._isInitialized=!1,l}return Object(i.__extends)(t,n),Object.defineProperty(t.prototype,"_deprecatedPortal",{get:function(){return this.portal},set:function(n){this.portal=n},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_deprecatedPortalHost",{get:function(){return this.portal},set:function(n){this.portal=n},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"portal",{get:function(){return this._attachedPortal},set:function(t){(!this.hasAttached()||t||this._isInitialized)&&(this.hasAttached()&&n.prototype.detach.call(this),t&&n.prototype.attach.call(this,t),this._attachedPortal=t)},enumerable:!0,configurable:!0}),t.prototype.ngOnInit=function(){this._isInitialized=!0},t.prototype.ngOnDestroy=function(){n.prototype.dispose.call(this),this._attachedPortal=null},t.prototype.attachComponentPortal=function(t){t.setAttachedHost(this);var e=null!=t.viewContainerRef?t.viewContainerRef:this._viewContainerRef,l=this._componentFactoryResolver.resolveComponentFactory(t.component),r=e.createComponent(l,e.length,t.injector||e.parentInjector);return n.prototype.setDisposeFn.call(this,function(){return r.destroy()}),this._attachedPortal=t,r},t.prototype.attachTemplatePortal=function(t){var e=this;t.setAttachedHost(this);var l=this._viewContainerRef.createEmbeddedView(t.templateRef,t.context);return n.prototype.setDisposeFn.call(this,function(){return e._viewContainerRef.clear()}),this._attachedPortal=t,l},t}(ri),si=function(){},ai=function(){function n(n,t){this._parentInjector=n,this._customTokens=t}return n.prototype.get=function(n,t){var e=this._customTokens.get(n);return"undefined"!=typeof e?e:this._parentInjector.get(n,t)},n}(),ui=function(){function n(){}return n.prototype.enable=function(){},n.prototype.disable=function(){},n.prototype.attach=function(){},n}(),ci=function(){return function(n){var t=this;this.scrollStrategy=new ui,this.panelClass="",this.hasBackdrop=!1,this.backdropClass="cdk-overlay-dark-backdrop",this.direction="ltr",n&&Object.keys(n).forEach(function(e){return t[e]=n[e]})}}(),di=function(n,t,e,l){this.offsetX=e,this.offsetY=l,this.originX=n.originX,this.originY=n.originY,this.overlayX=t.overlayX,this.overlayY=t.overlayY};function hi(){return Error("Scroll strategy has already been attached.")}var pi=function(){function n(n,t){this._scrollDispatcher=n,this._ngZone=t,this._scrollSubscription=null}return n.prototype.attach=function(n){if(this._overlayRef)throw hi();this._overlayRef=n},n.prototype.enable=function(){var n=this;this._scrollSubscription||(this._scrollSubscription=this._scrollDispatcher.scrolled(0).subscribe(function(){n._ngZone.run(function(){n.disable(),n._overlayRef.hasAttached()&&n._overlayRef.detach()})}))},n.prototype.disable=function(){this._scrollSubscription&&(this._scrollSubscription.unsubscribe(),this._scrollSubscription=null)},n}(),fi=function(){function n(n){this._viewportRuler=n,this._previousHTMLStyles={top:"",left:""},this._isEnabled=!1}return n.prototype.attach=function(){},n.prototype.enable=function(){if(this._canBeEnabled()){var n=document.documentElement;this._previousScrollPosition=this._viewportRuler.getViewportScrollPosition(),this._previousHTMLStyles.left=n.style.left||"",this._previousHTMLStyles.top=n.style.top||"",n.style.left=-this._previousScrollPosition.left+"px",n.style.top=-this._previousScrollPosition.top+"px",n.classList.add("cdk-global-scrollblock"),this._isEnabled=!0}},n.prototype.disable=function(){if(this._isEnabled){var n=document.documentElement,t=document.body,e=n.style.scrollBehavior||"",l=t.style.scrollBehavior||"";this._isEnabled=!1,n.style.left=this._previousHTMLStyles.left,n.style.top=this._previousHTMLStyles.top,n.classList.remove("cdk-global-scrollblock"),n.style.scrollBehavior=t.style.scrollBehavior="auto",window.scroll(this._previousScrollPosition.left,this._previousScrollPosition.top),n.style.scrollBehavior=e,t.style.scrollBehavior=l}},n.prototype._canBeEnabled=function(){if(document.documentElement.classList.contains("cdk-global-scrollblock")||this._isEnabled)return!1;var n=document.body,t=this._viewportRuler.getViewportSize();return n.scrollHeight>t.height||n.scrollWidth>t.width},n}();function _i(n,t){return t.some(function(t){return n.bottomt.bottom||n.rightt.right})}function mi(n,t){return t.some(function(t){return n.topt.bottom||n.leftt.right})}var gi=function(){function n(n,t,e,l){this._scrollDispatcher=n,this._viewportRuler=t,this._ngZone=e,this._config=l,this._scrollSubscription=null}return n.prototype.attach=function(n){if(this._overlayRef)throw hi();this._overlayRef=n},n.prototype.enable=function(){var n=this;this._scrollSubscription||(this._scrollSubscription=this._scrollDispatcher.scrolled(this._config?this._config.scrollThrottle:0).subscribe(function(){if(n._overlayRef.updatePosition(),n._config&&n._config.autoClose){var t=n._overlayRef.overlayElement.getBoundingClientRect(),e=n._viewportRuler.getViewportSize(),l=e.width,r=e.height;_i(t,[{width:l,height:r,bottom:r,right:l,top:0,left:0}])&&(n.disable(),n._ngZone.run(function(){return n._overlayRef.detach()}))}}))},n.prototype.disable=function(){this._scrollSubscription&&(this._scrollSubscription.unsubscribe(),this._scrollSubscription=null)},n}(),yi=function(){return function(n,t,e){var l=this;this._scrollDispatcher=n,this._viewportRuler=t,this._ngZone=e,this.noop=function(){return new ui},this.close=function(){return new pi(l._scrollDispatcher,l._ngZone)},this.block=function(){return new fi(l._viewportRuler)},this.reposition=function(n){return new gi(l._scrollDispatcher,l._viewportRuler,l._ngZone,n)}}}(),bi=function(){function n(n,t,e,l,r){this._portalOutlet=n,this._pane=t,this._config=e,this._ngZone=l,this._keyboardDispatcher=r,this._backdropElement=null,this._backdropClick=new yl.a,this._attachments=new yl.a,this._detachments=new yl.a,this._keydownEvents=new yl.a,e.scrollStrategy&&e.scrollStrategy.attach(this)}return Object.defineProperty(n.prototype,"overlayElement",{get:function(){return this._pane},enumerable:!0,configurable:!0}),n.prototype.attach=function(n){var t=this,e=this._portalOutlet.attach(n);return this._config.positionStrategy&&this._config.positionStrategy.attach(this),this._updateStackingOrder(),this._updateElementSize(),this._updateElementDirection(),this._config.scrollStrategy&&this._config.scrollStrategy.enable(),this._ngZone.onStable.asObservable().pipe(Object(_r.a)(1)).subscribe(function(){t.updatePosition()}),this._togglePointerEvents(!0),this._config.hasBackdrop&&this._attachBackdrop(),this._config.panelClass&&(Array.isArray(this._config.panelClass)?this._config.panelClass.forEach(function(n){return t._pane.classList.add(n)}):this._pane.classList.add(this._config.panelClass)),this._attachments.next(),this._keyboardDispatcher.add(this),e},n.prototype.detach=function(){if(this.hasAttached()){this.detachBackdrop(),this._togglePointerEvents(!1),this._config.positionStrategy&&this._config.positionStrategy.detach&&this._config.positionStrategy.detach(),this._config.scrollStrategy&&this._config.scrollStrategy.disable();var n=this._portalOutlet.detach();return this._detachments.next(),this._keyboardDispatcher.remove(this),n}},n.prototype.dispose=function(){var n=this.hasAttached();this._config.positionStrategy&&this._config.positionStrategy.dispose(),this._config.scrollStrategy&&this._config.scrollStrategy.disable(),this.detachBackdrop(),this._keyboardDispatcher.remove(this),this._portalOutlet.dispose(),this._attachments.complete(),this._backdropClick.complete(),this._keydownEvents.complete(),n&&this._detachments.next(),this._detachments.complete()},n.prototype.hasAttached=function(){return this._portalOutlet.hasAttached()},n.prototype.backdropClick=function(){return this._backdropClick.asObservable()},n.prototype.attachments=function(){return this._attachments.asObservable()},n.prototype.detachments=function(){return this._detachments.asObservable()},n.prototype.keydownEvents=function(){return this._keydownEvents.asObservable()},n.prototype.getConfig=function(){return this._config},n.prototype.updatePosition=function(){this._config.positionStrategy&&this._config.positionStrategy.apply()},n.prototype.updateSize=function(n){this._config=Object(i.__assign)({},this._config,n),this._updateElementSize()},n.prototype.setDirection=function(n){this._config=Object(i.__assign)({},this._config,{direction:n}),this._updateElementDirection()},n.prototype._updateElementDirection=function(){this._pane.setAttribute("dir",this._config.direction)},n.prototype._updateElementSize=function(){(this._config.width||0===this._config.width)&&(this._pane.style.width=vi(this._config.width)),(this._config.height||0===this._config.height)&&(this._pane.style.height=vi(this._config.height)),(this._config.minWidth||0===this._config.minWidth)&&(this._pane.style.minWidth=vi(this._config.minWidth)),(this._config.minHeight||0===this._config.minHeight)&&(this._pane.style.minHeight=vi(this._config.minHeight)),(this._config.maxWidth||0===this._config.maxWidth)&&(this._pane.style.maxWidth=vi(this._config.maxWidth)),(this._config.maxHeight||0===this._config.maxHeight)&&(this._pane.style.maxHeight=vi(this._config.maxHeight))},n.prototype._togglePointerEvents=function(n){this._pane.style.pointerEvents=n?"auto":"none"},n.prototype._attachBackdrop=function(){var n=this;this._backdropElement=document.createElement("div"),this._backdropElement.classList.add("cdk-overlay-backdrop"),this._config.backdropClass&&this._backdropElement.classList.add(this._config.backdropClass),this._pane.parentElement.insertBefore(this._backdropElement,this._pane),this._backdropElement.addEventListener("click",function(){return n._backdropClick.next(null)}),this._ngZone.runOutsideAngular(function(){requestAnimationFrame(function(){n._backdropElement&&n._backdropElement.classList.add("cdk-overlay-backdrop-showing")})})},n.prototype._updateStackingOrder=function(){this._pane.nextSibling&&this._pane.parentNode.appendChild(this._pane)},n.prototype.detachBackdrop=function(){var n=this,t=this._backdropElement;if(t){var e=function(){t&&t.parentNode&&t.parentNode.removeChild(t),n._backdropElement==t&&(n._backdropElement=null)};t.classList.remove("cdk-overlay-backdrop-showing"),this._config.backdropClass&&t.classList.remove(this._config.backdropClass),t.addEventListener("transitionend",e),t.style.pointerEvents="none",this._ngZone.runOutsideAngular(function(){setTimeout(e,500)})}},n}();function vi(n){return"string"==typeof n?n:n+"px"}var wi=function(){function n(n,t,e,l,r){this._connectedTo=e,this._viewportRuler=l,this._document=r,this._dir="ltr",this._offsetX=0,this._offsetY=0,this.scrollables=[],this._resizeSubscription=rl.a.EMPTY,this._preferredPositions=[],this._applied=!1,this._positionLocked=!1,this._onPositionChange=new yl.a,this._origin=this._connectedTo.nativeElement,this.withFallbackPosition(n,t)}return Object.defineProperty(n.prototype,"_isRtl",{get:function(){return"rtl"===this._dir},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"onPositionChange",{get:function(){return this._onPositionChange.asObservable()},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"positions",{get:function(){return this._preferredPositions},enumerable:!0,configurable:!0}),n.prototype.attach=function(n){var t=this;this._overlayRef=n,this._pane=n.overlayElement,this._resizeSubscription.unsubscribe(),this._resizeSubscription=this._viewportRuler.change().subscribe(function(){return t.apply()})},n.prototype.dispose=function(){this._applied=!1,this._resizeSubscription.unsubscribe()},n.prototype.detach=function(){this._applied=!1,this._resizeSubscription.unsubscribe()},n.prototype.apply=function(){if(this._applied&&this._positionLocked&&this._lastConnectedPosition)this.recalculateLastPosition();else{this._applied=!0;for(var n,t,e=this._pane,l=this._origin.getBoundingClientRect(),r=e.getBoundingClientRect(),i=this._viewportRuler.getViewportSize(),o=0,s=this._preferredPositions;o-1&&this._attachedOverlays.splice(t,1),0===this._attachedOverlays.length&&this._unsubscribeFromKeydownEvents()},n.prototype._subscribeToKeydownEvents=function(){var n=this,t=zr(this._document.body,"keydown");this._keydownEventSubscription=t.pipe(Ge(function(){return!!n._attachedOverlays.length})).subscribe(function(t){n._selectOverlayFromEvent(t)._keydownEvents.next(t)})},n.prototype._unsubscribeFromKeydownEvents=function(){this._keydownEventSubscription&&(this._keydownEventSubscription.unsubscribe(),this._keydownEventSubscription=null)},n.prototype._selectOverlayFromEvent=function(n){return this._attachedOverlays.find(function(t){return t.overlayElement===n.target||t.overlayElement.contains(n.target)})||this._attachedOverlays[this._attachedOverlays.length-1]},n}();function Ci(n,t){return n||new ki(t)}var Si=function(){function n(n){this._document=n}return n.prototype.ngOnDestroy=function(){this._containerElement&&this._containerElement.parentNode&&this._containerElement.parentNode.removeChild(this._containerElement)},n.prototype.getContainerElement=function(){return this._containerElement||this._createContainer(),this._containerElement},n.prototype._createContainer=function(){var n=this._document.createElement("div");n.classList.add("cdk-overlay-container"),this._document.body.appendChild(n),this._containerElement=n},n}();function Oi(n,t){return n||new Si(t)}var Ti=0,Li=new ci,Pi=function(){function n(n,t,e,l,r,i,o,s,a){this.scrollStrategies=n,this._overlayContainer=t,this._componentFactoryResolver=e,this._positionBuilder=l,this._keyboardDispatcher=r,this._appRef=i,this._injector=o,this._ngZone=s,this._document=a}return n.prototype.create=function(n){void 0===n&&(n=Li);var t=this._createPaneElement(),e=this._createPortalOutlet(t);return new bi(e,t,n,this._ngZone,this._keyboardDispatcher)},n.prototype.position=function(){return this._positionBuilder},n.prototype._createPaneElement=function(){var n=this._document.createElement("div");return n.id="cdk-overlay-"+Ti++,n.classList.add("cdk-overlay-pane"),this._overlayContainer.getContainerElement().appendChild(n),n},n.prototype._createPortalOutlet=function(n){return new ii(n,this._componentFactoryResolver,this._appRef,this._injector)},n}(),Di=[new di({originX:"start",originY:"bottom"},{overlayX:"start",overlayY:"top"}),new di({originX:"start",originY:"top"},{overlayX:"start",overlayY:"bottom"}),new di({originX:"end",originY:"top"},{overlayX:"end",overlayY:"bottom"}),new di({originX:"end",originY:"bottom"},{overlayX:"end",overlayY:"top"})],Ai=new l.r("cdk-connected-overlay-scroll-strategy");function Ei(n){return function(){return n.scrollStrategies.reposition()}}var Yi=function(n){this.elementRef=n},ji=function(){function n(n,t,e,r,i){this._overlay=n,this._scrollStrategy=r,this._dir=i,this._hasBackdrop=!1,this._backdropSubscription=rl.a.EMPTY,this._positionSubscription=rl.a.EMPTY,this._offsetX=0,this._offsetY=0,this.scrollStrategy=this._scrollStrategy(),this.open=!1,this.backdropClick=new l.o,this.positionChange=new l.o,this.attach=new l.o,this.detach=new l.o,this._templatePortal=new li(t,e)}return Object.defineProperty(n.prototype,"offsetX",{get:function(){return this._offsetX},set:function(n){this._offsetX=n,this._position&&this._position.withOffsetX(n)},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"offsetY",{get:function(){return this._offsetY},set:function(n){this._offsetY=n,this._position&&this._position.withOffsetY(n)},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"hasBackdrop",{get:function(){return this._hasBackdrop},set:function(n){this._hasBackdrop=El(n)},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"_deprecatedOrigin",{get:function(){return this.origin},set:function(n){this.origin=n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"_deprecatedPositions",{get:function(){return this.positions},set:function(n){this.positions=n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"_deprecatedOffsetX",{get:function(){return this.offsetX},set:function(n){this.offsetX=n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"_deprecatedOffsetY",{get:function(){return this.offsetY},set:function(n){this.offsetY=n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"_deprecatedWidth",{get:function(){return this.width},set:function(n){this.width=n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"_deprecatedHeight",{get:function(){return this.height},set:function(n){this.height=n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"_deprecatedMinWidth",{get:function(){return this.minWidth},set:function(n){this.minWidth=n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"_deprecatedMinHeight",{get:function(){return this.minHeight},set:function(n){this.minHeight=n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"_deprecatedBackdropClass",{get:function(){return this.backdropClass},set:function(n){this.backdropClass=n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"_deprecatedScrollStrategy",{get:function(){return this.scrollStrategy},set:function(n){this.scrollStrategy=n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"_deprecatedOpen",{get:function(){return this.open},set:function(n){this.open=n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"_deprecatedHasBackdrop",{get:function(){return this.hasBackdrop},set:function(n){this.hasBackdrop=n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"overlayRef",{get:function(){return this._overlayRef},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"dir",{get:function(){return this._dir?this._dir.value:"ltr"},enumerable:!0,configurable:!0}),n.prototype.ngOnDestroy=function(){this._destroyOverlay()},n.prototype.ngOnChanges=function(n){(n.open||n._deprecatedOpen)&&(this.open?this._attachOverlay():this._detachOverlay())},n.prototype._createOverlay=function(){this.positions&&this.positions.length||(this.positions=Di),this._overlayRef=this._overlay.create(this._buildConfig())},n.prototype._buildConfig=function(){var n=this._position=this._createPositionStrategy(),t=new ci({positionStrategy:n,scrollStrategy:this.scrollStrategy,hasBackdrop:this.hasBackdrop});return(this.width||0===this.width)&&(t.width=this.width),(this.height||0===this.height)&&(t.height=this.height),(this.minWidth||0===this.minWidth)&&(t.minWidth=this.minWidth),(this.minHeight||0===this.minHeight)&&(t.minHeight=this.minHeight),this.backdropClass&&(t.backdropClass=this.backdropClass),t},n.prototype._createPositionStrategy=function(){var n=this.positions[0],t={originX:n.originX,originY:n.originY},e={overlayX:n.overlayX,overlayY:n.overlayY},l=this._overlay.position().connectedTo(this.origin.elementRef,t,e).withOffsetX(this.offsetX).withOffsetY(this.offsetY);return this._handlePositionChanges(l),l},n.prototype._handlePositionChanges=function(n){for(var t=this,e=1;e0&&e[0].time-l.now()<=0;)e.shift().notification.observe(r);if(e.length>0){var i=Math.max(0,e[0].time-l.now());this.schedule(n,i)}else t.active=!1},t.prototype._schedule=function(n){this.active=!0,this.add(n.schedule(t.dispatch,this.delay,{source:this,destination:this.destination,scheduler:n}))},t.prototype.scheduleNotification=function(n){if(!0!==this.errored){var t=this.scheduler,e=new Bi(t.now()+this.delay,n);this.queue.push(e),!1===this.active&&this._schedule(t)}},t.prototype._next=function(n){this.scheduleNotification(wl.createNext(n))},t.prototype._error=function(n){this.errored=!0,this.queue=[],this.destination.error(n)},t.prototype._complete=function(){this.scheduleNotification(wl.createComplete())},t}(Be.a),Bi=function(n,t){this.time=n,this.notification=t},Vi=function(n){function t(t,e){n.call(this),this.promise=t,this.scheduler=e}return Object(i.__extends)(t,n),t.create=function(n,e){return new t(n,e)},t.prototype._subscribe=function(n){var t=this,e=this.promise,l=this.scheduler;if(null==l)this._isScalar?n.closed||(n.next(this.value),n.complete()):e.then(function(e){t.value=e,t._isScalar=!0,n.closed||(n.next(e),n.complete())},function(t){n.closed||n.error(t)}).then(null,function(n){ll.a.setTimeout(function(){throw n})});else if(this._isScalar){if(!n.closed)return l.schedule(Wi,0,{value:this.value,subscriber:n})}else e.then(function(e){t.value=e,t._isScalar=!0,n.closed||n.add(l.schedule(Wi,0,{value:e,subscriber:n}))},function(t){n.closed||n.add(l.schedule(zi,0,{err:t,subscriber:n}))}).then(null,function(n){ll.a.setTimeout(function(){throw n})})},t}(o.a);function Wi(n){var t=n.subscriber;t.closed||(t.next(n.value),t.complete())}function zi(n){var t=n.subscriber;t.closed||t.error(n.err)}var Ui=Vi.create,Gi=function(){function n(){}return Object.defineProperty(n.prototype,"value",{get:function(){return this.control?this.control.value:null},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"valid",{get:function(){return this.control?this.control.valid:null},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"invalid",{get:function(){return this.control?this.control.invalid:null},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"pending",{get:function(){return this.control?this.control.pending:null},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"disabled",{get:function(){return this.control?this.control.disabled:null},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"enabled",{get:function(){return this.control?this.control.enabled:null},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"errors",{get:function(){return this.control?this.control.errors:null},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"pristine",{get:function(){return this.control?this.control.pristine:null},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"dirty",{get:function(){return this.control?this.control.dirty:null},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"touched",{get:function(){return this.control?this.control.touched:null},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"status",{get:function(){return this.control?this.control.status:null},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"untouched",{get:function(){return this.control?this.control.untouched:null},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"statusChanges",{get:function(){return this.control?this.control.statusChanges:null},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"valueChanges",{get:function(){return this.control?this.control.valueChanges:null},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"path",{get:function(){return null},enumerable:!0,configurable:!0}),n.prototype.reset=function(n){void 0===n&&(n=void 0),this.control&&this.control.reset(n)},n.prototype.hasError=function(n,t){return!!this.control&&this.control.hasError(n,t)},n.prototype.getError=function(n,t){return this.control?this.control.getError(n,t):null},n}(),qi=function(n){function t(){return null!==n&&n.apply(this,arguments)||this}return Object(i.__extends)(t,n),Object.defineProperty(t.prototype,"formDirective",{get:function(){return null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"path",{get:function(){return null},enumerable:!0,configurable:!0}),t}(Gi);function Ji(n){return null==n||0===n.length}var Qi=new l.r("NgValidators"),Ki=/^(?=.{1,254}$)(?=.{1,64}@)[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+(\.[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+)*@[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?(\.[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?)*$/,Xi=function(){function n(){}return n.min=function(n){return function(t){if(Ji(t.value)||Ji(n))return null;var e=parseFloat(t.value);return!isNaN(e)&&en?{max:{max:n,actual:t.value}}:null}},n.required=function(n){return Ji(n.value)?{required:!0}:null},n.requiredTrue=function(n){return!0===n.value?null:{required:!0}},n.email=function(n){return Ki.test(n.value)?null:{email:!0}},n.minLength=function(n){return function(t){if(Ji(t.value))return null;var e=t.value?t.value.length:0;return en?{maxlength:{requiredLength:n,actualLength:e}}:null}},n.pattern=function(t){return t?("string"==typeof t?(l="^"+t+"$",e=new RegExp(l)):(l=t.toString(),e=t),function(n){if(Ji(n.value))return null;var t=n.value;return e.test(t)?null:{pattern:{requiredPattern:l,actualValue:t}}}):n.nullValidator;var e,l},n.nullValidator=function(n){return null},n.compose=function(n){if(!n)return null;var t=n.filter(Zi);return 0==t.length?null:function(n){return no(function(n,e){return t.map(function(t){return t(n)})}(n))}},n.composeAsync=function(n){if(!n)return null;var t=n.filter(Zi);return 0==t.length?null:function(n){var e=function(n,e){return t.map(function(t){return t(n)})}(n).map($i);return Pe.call(Ne(e),no)}},n}();function Zi(n){return null!=n}function $i(n){var t=Object(l._15)(n)?Ui(n):n;if(!Object(l._14)(t))throw new Error("Expected validator to return Promise or Observable.");return t}function no(n){var t=n.reduce(function(n,t){return null!=t?Object(i.__assign)({},n,t):n},{});return 0===Object.keys(t).length?null:t}var to=new l.r("NgValueAccessor"),eo=function(){function n(n,t){this._renderer=n,this._elementRef=t,this.onChange=function(n){},this.onTouched=function(){}}return n.prototype.writeValue=function(n){this._renderer.setProperty(this._elementRef.nativeElement,"checked",n)},n.prototype.registerOnChange=function(n){this.onChange=n},n.prototype.registerOnTouched=function(n){this.onTouched=n},n.prototype.setDisabledState=function(n){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",n)},n}(),lo=new l.r("CompositionEventMode"),ro=function(){function n(n,t,e){var l;this._renderer=n,this._elementRef=t,this._compositionMode=e,this.onChange=function(n){},this.onTouched=function(){},this._composing=!1,null==this._compositionMode&&(this._compositionMode=(l=un()?un().getUserAgent():"",!/android (\d+)/.test(l.toLowerCase())))}return n.prototype.writeValue=function(n){this._renderer.setProperty(this._elementRef.nativeElement,"value",null==n?"":n)},n.prototype.registerOnChange=function(n){this.onChange=n},n.prototype.registerOnTouched=function(n){this.onTouched=n},n.prototype.setDisabledState=function(n){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",n)},n.prototype._handleInput=function(n){(!this._compositionMode||this._compositionMode&&!this._composing)&&this.onChange(n)},n.prototype._compositionStart=function(){this._composing=!0},n.prototype._compositionEnd=function(n){this._composing=!1,this._compositionMode&&this.onChange(n)},n}();function io(n){return n.validate?function(t){return n.validate(t)}:n}function oo(n){return n.validate?function(t){return n.validate(t)}:n}var so=function(){function n(n,t){this._renderer=n,this._elementRef=t,this.onChange=function(n){},this.onTouched=function(){}}return n.prototype.writeValue=function(n){this._renderer.setProperty(this._elementRef.nativeElement,"value",null==n?"":n)},n.prototype.registerOnChange=function(n){this.onChange=function(t){n(""==t?null:parseFloat(t))}},n.prototype.registerOnTouched=function(n){this.onTouched=n},n.prototype.setDisabledState=function(n){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",n)},n}();function ao(){throw new Error("unimplemented")}var uo=function(n){function t(){var t=null!==n&&n.apply(this,arguments)||this;return t._parent=null,t.name=null,t.valueAccessor=null,t._rawValidators=[],t._rawAsyncValidators=[],t}return Object(i.__extends)(t,n),Object.defineProperty(t.prototype,"validator",{get:function(){return ao()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"asyncValidator",{get:function(){return ao()},enumerable:!0,configurable:!0}),t}(Gi),co=function(){function n(){this._accessors=[]}return n.prototype.add=function(n,t){this._accessors.push([n,t])},n.prototype.remove=function(n){for(var t=this._accessors.length-1;t>=0;--t)if(this._accessors[t][1]===n)return void this._accessors.splice(t,1)},n.prototype.select=function(n){var t=this;this._accessors.forEach(function(e){t._isSameGroup(e,n)&&e[1]!==n&&e[1].fireUncheck(n.value)})},n.prototype._isSameGroup=function(n,t){return!!n[0].control&&n[0]._parent===t._control._parent&&n[1].name===t.name},n}(),ho=function(){function n(n,t,e,l){this._renderer=n,this._elementRef=t,this._registry=e,this._injector=l,this.onChange=function(){},this.onTouched=function(){}}return n.prototype.ngOnInit=function(){this._control=this._injector.get(uo),this._checkName(),this._registry.add(this._control,this)},n.prototype.ngOnDestroy=function(){this._registry.remove(this)},n.prototype.writeValue=function(n){this._state=n===this.value,this._renderer.setProperty(this._elementRef.nativeElement,"checked",this._state)},n.prototype.registerOnChange=function(n){var t=this;this._fn=n,this.onChange=function(){n(t.value),t._registry.select(t)}},n.prototype.fireUncheck=function(n){this.writeValue(n)},n.prototype.registerOnTouched=function(n){this.onTouched=n},n.prototype.setDisabledState=function(n){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",n)},n.prototype._checkName=function(){this.name&&this.formControlName&&this.name!==this.formControlName&&this._throwNameError(),!this.name&&this.formControlName&&(this.name=this.formControlName)},n.prototype._throwNameError=function(){throw new Error('\n If you define both a name and a formControlName attribute on your radio button, their values\n must match. Ex: \n ')},n}(),po=function(){function n(n,t){this._renderer=n,this._elementRef=t,this.onChange=function(n){},this.onTouched=function(){}}return n.prototype.writeValue=function(n){this._renderer.setProperty(this._elementRef.nativeElement,"value",parseFloat(n))},n.prototype.registerOnChange=function(n){this.onChange=function(t){n(""==t?null:parseFloat(t))}},n.prototype.registerOnTouched=function(n){this.onTouched=n},n.prototype.setDisabledState=function(n){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",n)},n}();function fo(n,t){return null==n?""+t:(t&&"object"==typeof t&&(t="Object"),(n+": "+t).slice(0,50))}var _o=function(){function n(n,t){this._renderer=n,this._elementRef=t,this._optionMap=new Map,this._idCounter=0,this.onChange=function(n){},this.onTouched=function(){},this._compareWith=l._16}return Object.defineProperty(n.prototype,"compareWith",{set:function(n){if("function"!=typeof n)throw new Error("compareWith must be a function, but received "+JSON.stringify(n));this._compareWith=n},enumerable:!0,configurable:!0}),n.prototype.writeValue=function(n){this.value=n;var t=this._getOptionId(n);null==t&&this._renderer.setProperty(this._elementRef.nativeElement,"selectedIndex",-1);var e=fo(t,n);this._renderer.setProperty(this._elementRef.nativeElement,"value",e)},n.prototype.registerOnChange=function(n){var t=this;this.onChange=function(e){t.value=t._getOptionValue(e),n(t.value)}},n.prototype.registerOnTouched=function(n){this.onTouched=n},n.prototype.setDisabledState=function(n){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",n)},n.prototype._registerOption=function(){return(this._idCounter++).toString()},n.prototype._getOptionId=function(n){for(var t=0,e=Array.from(this._optionMap.keys());t-1)}}else t=function(n,t){n._setSelected(!1)};this._optionMap.forEach(t)},n.prototype.registerOnChange=function(n){var t=this;this.onChange=function(e){var l=[];if(e.hasOwnProperty("selectedOptions"))for(var r=e.selectedOptions,i=0;i1?"path: '"+n.path.join(" -> ")+"'":n.path[0]?"name: '"+n.path+"'":"unspecified name attribute",new Error(t+" "+e)}function So(n){return null!=n?Xi.compose(n.map(io)):null}function Oo(n){return null!=n?Xi.composeAsync(n.map(oo)):null}var To=[eo,po,so,_o,yo,ho];function Lo(n,t){n._syncPendingControls(),t.forEach(function(n){var t=n.control;"submit"===t.updateOn&&t._pendingChange&&(n.viewToModelUpdate(t._pendingValue),t._pendingChange=!1)})}function Po(n,t){var e=n.indexOf(t);e>-1&&n.splice(e,1)}var Do=function(n){function t(){return null!==n&&n.apply(this,arguments)||this}return Object(i.__extends)(t,n),t.prototype.ngOnInit=function(){this._checkParentType(),this.formDirective.addFormGroup(this)},t.prototype.ngOnDestroy=function(){this.formDirective&&this.formDirective.removeFormGroup(this)},Object.defineProperty(t.prototype,"control",{get:function(){return this.formDirective.getFormGroup(this)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"path",{get:function(){return vo(this.name,this._parent)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"formDirective",{get:function(){return this._parent?this._parent.formDirective:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"validator",{get:function(){return So(this._validators)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"asyncValidator",{get:function(){return Oo(this._asyncValidators)},enumerable:!0,configurable:!0}),t.prototype._checkParentType=function(){},t}(qi),Ao=function(){function n(n){this._cd=n}return Object.defineProperty(n.prototype,"ngClassUntouched",{get:function(){return!!this._cd.control&&this._cd.control.untouched},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"ngClassTouched",{get:function(){return!!this._cd.control&&this._cd.control.touched},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"ngClassPristine",{get:function(){return!!this._cd.control&&this._cd.control.pristine},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"ngClassDirty",{get:function(){return!!this._cd.control&&this._cd.control.dirty},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"ngClassValid",{get:function(){return!!this._cd.control&&this._cd.control.valid},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"ngClassInvalid",{get:function(){return!!this._cd.control&&this._cd.control.invalid},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"ngClassPending",{get:function(){return!!this._cd.control&&this._cd.control.pending},enumerable:!0,configurable:!0}),n}(),Eo=function(n){function t(t){return n.call(this,t)||this}return Object(i.__extends)(t,n),t}(Ao),Yo=function(n){function t(t){return n.call(this,t)||this}return Object(i.__extends)(t,n),t}(Ao);function jo(n){var t=Ro(n)?n.validators:n;return Array.isArray(t)?So(t):t||null}function Io(n,t){var e=Ro(t)?t.asyncValidators:n;return Array.isArray(e)?Oo(e):e||null}function Ro(n){return null!=n&&!Array.isArray(n)&&"object"==typeof n}var Ho=function(){function n(n,t){this.validator=n,this.asyncValidator=t,this._onCollectionChange=function(){},this.pristine=!0,this.touched=!1,this._onDisabledChange=[]}return Object.defineProperty(n.prototype,"parent",{get:function(){return this._parent},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"valid",{get:function(){return"VALID"===this.status},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"invalid",{get:function(){return"INVALID"===this.status},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"pending",{get:function(){return"PENDING"==this.status},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"disabled",{get:function(){return"DISABLED"===this.status},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"enabled",{get:function(){return"DISABLED"!==this.status},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"dirty",{get:function(){return!this.pristine},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"untouched",{get:function(){return!this.touched},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"updateOn",{get:function(){return this._updateOn?this._updateOn:this.parent?this.parent.updateOn:"change"},enumerable:!0,configurable:!0}),n.prototype.setValidators=function(n){this.validator=jo(n)},n.prototype.setAsyncValidators=function(n){this.asyncValidator=Io(n)},n.prototype.clearValidators=function(){this.validator=null},n.prototype.clearAsyncValidators=function(){this.asyncValidator=null},n.prototype.markAsTouched=function(n){void 0===n&&(n={}),this.touched=!0,this._parent&&!n.onlySelf&&this._parent.markAsTouched(n)},n.prototype.markAsUntouched=function(n){void 0===n&&(n={}),this.touched=!1,this._pendingTouched=!1,this._forEachChild(function(n){n.markAsUntouched({onlySelf:!0})}),this._parent&&!n.onlySelf&&this._parent._updateTouched(n)},n.prototype.markAsDirty=function(n){void 0===n&&(n={}),this.pristine=!1,this._parent&&!n.onlySelf&&this._parent.markAsDirty(n)},n.prototype.markAsPristine=function(n){void 0===n&&(n={}),this.pristine=!0,this._pendingDirty=!1,this._forEachChild(function(n){n.markAsPristine({onlySelf:!0})}),this._parent&&!n.onlySelf&&this._parent._updatePristine(n)},n.prototype.markAsPending=function(n){void 0===n&&(n={}),this.status="PENDING",this._parent&&!n.onlySelf&&this._parent.markAsPending(n)},n.prototype.disable=function(n){void 0===n&&(n={}),this.status="DISABLED",this.errors=null,this._forEachChild(function(n){n.disable({onlySelf:!0})}),this._updateValue(),!1!==n.emitEvent&&(this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),this._updateAncestors(!!n.onlySelf),this._onDisabledChange.forEach(function(n){return n(!0)})},n.prototype.enable=function(n){void 0===n&&(n={}),this.status="VALID",this._forEachChild(function(n){n.enable({onlySelf:!0})}),this.updateValueAndValidity({onlySelf:!0,emitEvent:n.emitEvent}),this._updateAncestors(!!n.onlySelf),this._onDisabledChange.forEach(function(n){return n(!1)})},n.prototype._updateAncestors=function(n){this._parent&&!n&&(this._parent.updateValueAndValidity(),this._parent._updatePristine(),this._parent._updateTouched())},n.prototype.setParent=function(n){this._parent=n},n.prototype.updateValueAndValidity=function(n){void 0===n&&(n={}),this._setInitialStatus(),this._updateValue(),this.enabled&&(this._cancelExistingSubscription(),this.errors=this._runValidator(),this.status=this._calculateStatus(),"VALID"!==this.status&&"PENDING"!==this.status||this._runAsyncValidator(n.emitEvent)),!1!==n.emitEvent&&(this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),this._parent&&!n.onlySelf&&this._parent.updateValueAndValidity(n)},n.prototype._updateTreeValidity=function(n){void 0===n&&(n={emitEvent:!0}),this._forEachChild(function(t){return t._updateTreeValidity(n)}),this.updateValueAndValidity({onlySelf:!0,emitEvent:n.emitEvent})},n.prototype._setInitialStatus=function(){this.status=this._allControlsDisabled()?"DISABLED":"VALID"},n.prototype._runValidator=function(){return this.validator?this.validator(this):null},n.prototype._runAsyncValidator=function(n){var t=this;if(this.asyncValidator){this.status="PENDING";var e=$i(this.asyncValidator(this));this._asyncValidationSubscription=e.subscribe(function(e){return t.setErrors(e,{emitEvent:n})})}},n.prototype._cancelExistingSubscription=function(){this._asyncValidationSubscription&&this._asyncValidationSubscription.unsubscribe()},n.prototype.setErrors=function(n,t){void 0===t&&(t={}),this.errors=n,this._updateControlsErrors(!1!==t.emitEvent)},n.prototype.get=function(n){return function(n,t,e){return null==t?null:(t instanceof Array||(t=t.split(".")),t instanceof Array&&0===t.length?null:t.reduce(function(n,t){return n instanceof Fo?n.controls[t]||null:n instanceof Bo&&n.at(t)||null},n))}(this,n)},n.prototype.getError=function(n,t){var e=t?this.get(t):this;return e&&e.errors?e.errors[n]:null},n.prototype.hasError=function(n,t){return!!this.getError(n,t)},Object.defineProperty(n.prototype,"root",{get:function(){for(var n=this;n._parent;)n=n._parent;return n},enumerable:!0,configurable:!0}),n.prototype._updateControlsErrors=function(n){this.status=this._calculateStatus(),n&&this.statusChanges.emit(this.status),this._parent&&this._parent._updateControlsErrors(n)},n.prototype._initObservables=function(){this.valueChanges=new l.o,this.statusChanges=new l.o},n.prototype._calculateStatus=function(){return this._allControlsDisabled()?"DISABLED":this.errors?"INVALID":this._anyControlsHaveStatus("PENDING")?"PENDING":this._anyControlsHaveStatus("INVALID")?"INVALID":"VALID"},n.prototype._anyControlsHaveStatus=function(n){return this._anyControls(function(t){return t.status===n})},n.prototype._anyControlsDirty=function(){return this._anyControls(function(n){return n.dirty})},n.prototype._anyControlsTouched=function(){return this._anyControls(function(n){return n.touched})},n.prototype._updatePristine=function(n){void 0===n&&(n={}),this.pristine=!this._anyControlsDirty(),this._parent&&!n.onlySelf&&this._parent._updatePristine(n)},n.prototype._updateTouched=function(n){void 0===n&&(n={}),this.touched=this._anyControlsTouched(),this._parent&&!n.onlySelf&&this._parent._updateTouched(n)},n.prototype._isBoxedValue=function(n){return"object"==typeof n&&null!==n&&2===Object.keys(n).length&&"value"in n&&"disabled"in n},n.prototype._registerOnCollectionChange=function(n){this._onCollectionChange=n},n.prototype._setUpdateStrategy=function(n){Ro(n)&&null!=n.updateOn&&(this._updateOn=n.updateOn)},n}(),No=function(n){function t(t,e,l){void 0===t&&(t=null);var r=n.call(this,jo(e),Io(l,e))||this;return r._onChange=[],r._applyFormState(t),r._setUpdateStrategy(e),r.updateValueAndValidity({onlySelf:!0,emitEvent:!1}),r._initObservables(),r}return Object(i.__extends)(t,n),t.prototype.setValue=function(n,t){var e=this;void 0===t&&(t={}),this.value=this._pendingValue=n,this._onChange.length&&!1!==t.emitModelToViewChange&&this._onChange.forEach(function(n){return n(e.value,!1!==t.emitViewToModelChange)}),this.updateValueAndValidity(t)},t.prototype.patchValue=function(n,t){void 0===t&&(t={}),this.setValue(n,t)},t.prototype.reset=function(n,t){void 0===n&&(n=null),void 0===t&&(t={}),this._applyFormState(n),this.markAsPristine(t),this.markAsUntouched(t),this.setValue(this.value,t),this._pendingChange=!1},t.prototype._updateValue=function(){},t.prototype._anyControls=function(n){return!1},t.prototype._allControlsDisabled=function(){return this.disabled},t.prototype.registerOnChange=function(n){this._onChange.push(n)},t.prototype._clearChangeFns=function(){this._onChange=[],this._onDisabledChange=[],this._onCollectionChange=function(){}},t.prototype.registerOnDisabledChange=function(n){this._onDisabledChange.push(n)},t.prototype._forEachChild=function(n){},t.prototype._syncPendingControls=function(){return!("submit"!==this.updateOn||(this._pendingDirty&&this.markAsDirty(),this._pendingTouched&&this.markAsTouched(),!this._pendingChange)||(this.setValue(this._pendingValue,{onlySelf:!0,emitModelToViewChange:!1}),0))},t.prototype._applyFormState=function(n){this._isBoxedValue(n)?(this.value=this._pendingValue=n.value,n.disabled?this.disable({onlySelf:!0,emitEvent:!1}):this.enable({onlySelf:!0,emitEvent:!1})):this.value=this._pendingValue=n},t}(Ho),Fo=function(n){function t(t,e,l){var r=n.call(this,jo(e),Io(l,e))||this;return r.controls=t,r._initObservables(),r._setUpdateStrategy(e),r._setUpControls(),r.updateValueAndValidity({onlySelf:!0,emitEvent:!1}),r}return Object(i.__extends)(t,n),t.prototype.registerControl=function(n,t){return this.controls[n]?this.controls[n]:(this.controls[n]=t,t.setParent(this),t._registerOnCollectionChange(this._onCollectionChange),t)},t.prototype.addControl=function(n,t){this.registerControl(n,t),this.updateValueAndValidity(),this._onCollectionChange()},t.prototype.removeControl=function(n){this.controls[n]&&this.controls[n]._registerOnCollectionChange(function(){}),delete this.controls[n],this.updateValueAndValidity(),this._onCollectionChange()},t.prototype.setControl=function(n,t){this.controls[n]&&this.controls[n]._registerOnCollectionChange(function(){}),delete this.controls[n],t&&this.registerControl(n,t),this.updateValueAndValidity(),this._onCollectionChange()},t.prototype.contains=function(n){return this.controls.hasOwnProperty(n)&&this.controls[n].enabled},t.prototype.setValue=function(n,t){var e=this;void 0===t&&(t={}),this._checkAllValuesPresent(n),Object.keys(n).forEach(function(l){e._throwIfControlMissing(l),e.controls[l].setValue(n[l],{onlySelf:!0,emitEvent:t.emitEvent})}),this.updateValueAndValidity(t)},t.prototype.patchValue=function(n,t){var e=this;void 0===t&&(t={}),Object.keys(n).forEach(function(l){e.controls[l]&&e.controls[l].patchValue(n[l],{onlySelf:!0,emitEvent:t.emitEvent})}),this.updateValueAndValidity(t)},t.prototype.reset=function(n,t){void 0===n&&(n={}),void 0===t&&(t={}),this._forEachChild(function(e,l){e.reset(n[l],{onlySelf:!0,emitEvent:t.emitEvent})}),this.updateValueAndValidity(t),this._updatePristine(t),this._updateTouched(t)},t.prototype.getRawValue=function(){return this._reduceChildren({},function(n,t,e){return n[e]=t instanceof No?t.value:t.getRawValue(),n})},t.prototype._syncPendingControls=function(){var n=this._reduceChildren(!1,function(n,t){return!!t._syncPendingControls()||n});return n&&this.updateValueAndValidity({onlySelf:!0}),n},t.prototype._throwIfControlMissing=function(n){if(!Object.keys(this.controls).length)throw new Error("\n There are no form controls registered with this group yet. If you're using ngModel,\n you may want to check next tick (e.g. use setTimeout).\n ");if(!this.controls[n])throw new Error("Cannot find form control with name: "+n+".")},t.prototype._forEachChild=function(n){var t=this;Object.keys(this.controls).forEach(function(e){return n(t.controls[e],e)})},t.prototype._setUpControls=function(){var n=this;this._forEachChild(function(t){t.setParent(n),t._registerOnCollectionChange(n._onCollectionChange)})},t.prototype._updateValue=function(){this.value=this._reduceValue()},t.prototype._anyControls=function(n){var t=this,e=!1;return this._forEachChild(function(l,r){e=e||t.contains(r)&&n(l)}),e},t.prototype._reduceValue=function(){var n=this;return this._reduceChildren({},function(t,e,l){return(e.enabled||n.disabled)&&(t[l]=e.value),t})},t.prototype._reduceChildren=function(n,t){var e=n;return this._forEachChild(function(n,l){e=t(e,n,l)}),e},t.prototype._allControlsDisabled=function(){for(var n=0,t=Object.keys(this.controls);n0||this.disabled},t.prototype._checkAllValuesPresent=function(n){this._forEachChild(function(t,e){if(void 0===n[e])throw new Error("Must supply a value for form control with name: '"+e+"'.")})},t}(Ho),Bo=function(n){function t(t,e,l){var r=n.call(this,jo(e),Io(l,e))||this;return r.controls=t,r._initObservables(),r._setUpdateStrategy(e),r._setUpControls(),r.updateValueAndValidity({onlySelf:!0,emitEvent:!1}),r}return Object(i.__extends)(t,n),t.prototype.at=function(n){return this.controls[n]},t.prototype.push=function(n){this.controls.push(n),this._registerControl(n),this.updateValueAndValidity(),this._onCollectionChange()},t.prototype.insert=function(n,t){this.controls.splice(n,0,t),this._registerControl(t),this.updateValueAndValidity(),this._onCollectionChange()},t.prototype.removeAt=function(n){this.controls[n]&&this.controls[n]._registerOnCollectionChange(function(){}),this.controls.splice(n,1),this.updateValueAndValidity(),this._onCollectionChange()},t.prototype.setControl=function(n,t){this.controls[n]&&this.controls[n]._registerOnCollectionChange(function(){}),this.controls.splice(n,1),t&&(this.controls.splice(n,0,t),this._registerControl(t)),this.updateValueAndValidity(),this._onCollectionChange()},Object.defineProperty(t.prototype,"length",{get:function(){return this.controls.length},enumerable:!0,configurable:!0}),t.prototype.setValue=function(n,t){var e=this;void 0===t&&(t={}),this._checkAllValuesPresent(n),n.forEach(function(n,l){e._throwIfControlMissing(l),e.at(l).setValue(n,{onlySelf:!0,emitEvent:t.emitEvent})}),this.updateValueAndValidity(t)},t.prototype.patchValue=function(n,t){var e=this;void 0===t&&(t={}),n.forEach(function(n,l){e.at(l)&&e.at(l).patchValue(n,{onlySelf:!0,emitEvent:t.emitEvent})}),this.updateValueAndValidity(t)},t.prototype.reset=function(n,t){void 0===n&&(n=[]),void 0===t&&(t={}),this._forEachChild(function(e,l){e.reset(n[l],{onlySelf:!0,emitEvent:t.emitEvent})}),this.updateValueAndValidity(t),this._updatePristine(t),this._updateTouched(t)},t.prototype.getRawValue=function(){return this.controls.map(function(n){return n instanceof No?n.value:n.getRawValue()})},t.prototype._syncPendingControls=function(){var n=this.controls.reduce(function(n,t){return!!t._syncPendingControls()||n},!1);return n&&this.updateValueAndValidity({onlySelf:!0}),n},t.prototype._throwIfControlMissing=function(n){if(!this.controls.length)throw new Error("\n There are no form controls registered with this array yet. If you're using ngModel,\n you may want to check next tick (e.g. use setTimeout).\n ");if(!this.at(n))throw new Error("Cannot find form control at index "+n)},t.prototype._forEachChild=function(n){this.controls.forEach(function(t,e){n(t,e)})},t.prototype._updateValue=function(){var n=this;this.value=this.controls.filter(function(t){return t.enabled||n.disabled}).map(function(n){return n.value})},t.prototype._anyControls=function(n){return this.controls.some(function(t){return t.enabled&&n(t)})},t.prototype._setUpControls=function(){var n=this;this._forEachChild(function(t){return n._registerControl(t)})},t.prototype._checkAllValuesPresent=function(n){this._forEachChild(function(t,e){if(void 0===n[e])throw new Error("Must supply a value for form control at index: "+e+".")})},t.prototype._allControlsDisabled=function(){for(var n=0,t=this.controls;n0||this.disabled},t.prototype._registerControl=function(n){n.setParent(this),n._registerOnCollectionChange(this._onCollectionChange)},t}(Ho),Vo=Promise.resolve(null),Wo=function(n){function t(t,e){var r=n.call(this)||this;return r.submitted=!1,r._directives=[],r.ngSubmit=new l.o,r.form=new Fo({},So(t),Oo(e)),r}return Object(i.__extends)(t,n),t.prototype.ngAfterViewInit=function(){this._setUpdateStrategy()},Object.defineProperty(t.prototype,"formDirective",{get:function(){return this},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"control",{get:function(){return this.form},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"path",{get:function(){return[]},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"controls",{get:function(){return this.form.controls},enumerable:!0,configurable:!0}),t.prototype.addControl=function(n){var t=this;Vo.then(function(){var e=t._findContainer(n.path);n.control=e.registerControl(n.name,n.control),wo(n.control,n),n.control.updateValueAndValidity({emitEvent:!1}),t._directives.push(n)})},t.prototype.getControl=function(n){return this.form.get(n.path)},t.prototype.removeControl=function(n){var t=this;Vo.then(function(){var e=t._findContainer(n.path);e&&e.removeControl(n.name),Po(t._directives,n)})},t.prototype.addFormGroup=function(n){var t=this;Vo.then(function(){var e=t._findContainer(n.path),l=new Fo({});Mo(l,n),e.registerControl(n.name,l),l.updateValueAndValidity({emitEvent:!1})})},t.prototype.removeFormGroup=function(n){var t=this;Vo.then(function(){var e=t._findContainer(n.path);e&&e.removeControl(n.name)})},t.prototype.getFormGroup=function(n){return this.form.get(n.path)},t.prototype.updateModel=function(n,t){var e=this;Vo.then(function(){e.form.get(n.path).setValue(t)})},t.prototype.setValue=function(n){this.control.setValue(n)},t.prototype.onSubmit=function(n){return this.submitted=!0,Lo(this.form,this._directives),this.ngSubmit.emit(n),!1},t.prototype.onReset=function(){this.resetForm()},t.prototype.resetForm=function(n){void 0===n&&(n=void 0),this.form.reset(n),this.submitted=!1},t.prototype._setUpdateStrategy=function(){this.options&&null!=this.options.updateOn&&(this.form._updateOn=this.options.updateOn)},t.prototype._findContainer=function(n){return n.pop(),n.length?this.form.get(n):this.form},t}(qi),zo='\n
\n \n
\n\n In your class:\n\n this.myGroup = new FormGroup({\n firstName: new FormControl()\n });',Uo='\n
\n
\n \n
\n
\n\n In your class:\n\n this.myGroup = new FormGroup({\n person: new FormGroup({ firstName: new FormControl() })\n });',Go=function(){function n(){}return n.controlParentException=function(){throw new Error("formControlName must be used with a parent formGroup directive. You'll want to add a formGroup\n directive and pass it an existing FormGroup instance (you can create one in your class).\n\n Example:\n\n "+zo)},n.ngModelGroupException=function(){throw new Error('formControlName cannot be used with an ngModelGroup parent. It is only compatible with parents\n that also have a "form" prefix: formGroupName, formArrayName, or formGroup.\n\n Option 1: Update the parent to be formGroupName (reactive form strategy)\n\n '+Uo+'\n\n Option 2: Use ngModel instead of formControlName (template-driven strategy)\n\n \n
\n
\n \n
\n
')},n.missingFormException=function(){throw new Error("formGroup expects a FormGroup instance. Please pass one in.\n\n Example:\n\n "+zo)},n.groupParentException=function(){throw new Error("formGroupName must be used with a parent formGroup directive. You'll want to add a formGroup\n directive and pass it an existing FormGroup instance (you can create one in your class).\n\n Example:\n\n "+Uo)},n.arrayParentException=function(){throw new Error('formArrayName must be used with a parent formGroup directive. You\'ll want to add a formGroup\n directive and pass it an existing FormGroup instance (you can create one in your class).\n\n Example:\n\n \n
\n
\n
\n \n
\n
\n
\n\n In your class:\n\n this.cityArray = new FormArray([new FormControl(\'SF\')]);\n this.myGroup = new FormGroup({\n cities: this.cityArray\n });')},n.disabledAttrWarning=function(){console.warn("\n It looks like you're using the disabled attribute with a reactive form directive. If you set disabled to true\n when you set up this control in your component class, the disabled attribute will actually be set in the DOM for\n you. We recommend using this approach to avoid 'changed after checked' errors.\n \n Example: \n form = new FormGroup({\n first: new FormControl({value: 'Nancy', disabled: true}, Validators.required),\n last: new FormControl('Drew', Validators.required)\n });\n ")},n}(),qo=function(n){function t(t,e){var r=n.call(this)||this;return r._validators=t,r._asyncValidators=e,r.submitted=!1,r.directives=[],r.form=null,r.ngSubmit=new l.o,r}return Object(i.__extends)(t,n),t.prototype.ngOnChanges=function(n){this._checkFormPresent(),n.hasOwnProperty("form")&&(this._updateValidators(),this._updateDomValue(),this._updateRegistrations())},Object.defineProperty(t.prototype,"formDirective",{get:function(){return this},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"control",{get:function(){return this.form},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"path",{get:function(){return[]},enumerable:!0,configurable:!0}),t.prototype.addControl=function(n){var t=this.form.get(n.path);return wo(t,n),t.updateValueAndValidity({emitEvent:!1}),this.directives.push(n),t},t.prototype.getControl=function(n){return this.form.get(n.path)},t.prototype.removeControl=function(n){Po(this.directives,n)},t.prototype.addFormGroup=function(n){var t=this.form.get(n.path);Mo(t,n),t.updateValueAndValidity({emitEvent:!1})},t.prototype.removeFormGroup=function(n){},t.prototype.getFormGroup=function(n){return this.form.get(n.path)},t.prototype.addFormArray=function(n){var t=this.form.get(n.path);Mo(t,n),t.updateValueAndValidity({emitEvent:!1})},t.prototype.removeFormArray=function(n){},t.prototype.getFormArray=function(n){return this.form.get(n.path)},t.prototype.updateModel=function(n,t){this.form.get(n.path).setValue(t)},t.prototype.onSubmit=function(n){return this.submitted=!0,Lo(this.form,this.directives),this.ngSubmit.emit(n),!1},t.prototype.onReset=function(){this.resetForm()},t.prototype.resetForm=function(n){void 0===n&&(n=void 0),this.form.reset(n),this.submitted=!1},t.prototype._updateDomValue=function(){var n=this;this.directives.forEach(function(t){var e=n.form.get(t.path);t.control!==e&&(function(n,t){t.valueAccessor.registerOnChange(function(){return ko(t)}),t.valueAccessor.registerOnTouched(function(){return ko(t)}),t._rawValidators.forEach(function(n){n.registerOnValidatorChange&&n.registerOnValidatorChange(null)}),t._rawAsyncValidators.forEach(function(n){n.registerOnValidatorChange&&n.registerOnValidatorChange(null)}),n&&n._clearChangeFns()}(t.control,t),e&&wo(e,t),t.control=e)}),this.form._updateTreeValidity({emitEvent:!1})},t.prototype._updateRegistrations=function(){var n=this;this.form._registerOnCollectionChange(function(){return n._updateDomValue()}),this._oldForm&&this._oldForm._registerOnCollectionChange(function(){}),this._oldForm=this.form},t.prototype._updateValidators=function(){var n=So(this._validators);this.form.validator=Xi.compose([this.form.validator,n]);var t=Oo(this._asyncValidators);this.form.asyncValidator=Xi.composeAsync([this.form.asyncValidator,t])},t.prototype._checkFormPresent=function(){this.form||Go.missingFormException()},t}(qi),Jo=function(n){function t(t,e,l){var r=n.call(this)||this;return r._parent=t,r._validators=e,r._asyncValidators=l,r}return Object(i.__extends)(t,n),t.prototype._checkParentType=function(){Ko(this._parent)&&Go.groupParentException()},t}(Do),Qo=function(n){function t(t,e,l){var r=n.call(this)||this;return r._parent=t,r._validators=e,r._asyncValidators=l,r}return Object(i.__extends)(t,n),t.prototype.ngOnInit=function(){this._checkParentType(),this.formDirective.addFormArray(this)},t.prototype.ngOnDestroy=function(){this.formDirective&&this.formDirective.removeFormArray(this)},Object.defineProperty(t.prototype,"control",{get:function(){return this.formDirective.getFormArray(this)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"formDirective",{get:function(){return this._parent?this._parent.formDirective:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"path",{get:function(){return vo(this.name,this._parent)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"validator",{get:function(){return So(this._validators)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"asyncValidator",{get:function(){return Oo(this._asyncValidators)},enumerable:!0,configurable:!0}),t.prototype._checkParentType=function(){Ko(this._parent)&&Go.arrayParentException()},t}(qi);function Ko(n){return!(n instanceof Jo||n instanceof qo||n instanceof Qo)}var Xo=function(n){function t(t,e,r,i){var o=n.call(this)||this;return o._added=!1,o.update=new l.o,o._parent=t,o._rawValidators=e||[],o._rawAsyncValidators=r||[],o.valueAccessor=function(n,t){if(!t)return null;var e=void 0,l=void 0,r=void 0;return t.forEach(function(t){var i;t.constructor===ro?e=t:(i=t,To.some(function(n){return i.constructor===n})?(l&&Co(n,"More than one built-in value accessor matches form control with"),l=t):(r&&Co(n,"More than one custom value accessor matches form control with"),r=t))}),r||l||e||(Co(n,"No valid value accessor for form control with"),null)}(o,i),o}return Object(i.__extends)(t,n),Object.defineProperty(t.prototype,"isDisabled",{set:function(n){Go.disabledAttrWarning()},enumerable:!0,configurable:!0}),t.prototype.ngOnChanges=function(n){this._added||this._setUpControl(),function(n,t){if(!n.hasOwnProperty("model"))return!1;var e=n.model;return!!e.isFirstChange()||!Object(l._16)(t,e.currentValue)}(n,this.viewModel)&&(this.viewModel=this.model,this.formDirective.updateModel(this,this.model))},t.prototype.ngOnDestroy=function(){this.formDirective&&this.formDirective.removeControl(this)},t.prototype.viewToModelUpdate=function(n){this.viewModel=n,this.update.emit(n)},Object.defineProperty(t.prototype,"path",{get:function(){return vo(this.name,this._parent)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"formDirective",{get:function(){return this._parent?this._parent.formDirective:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"validator",{get:function(){return So(this._rawValidators)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"asyncValidator",{get:function(){return Oo(this._rawAsyncValidators)},enumerable:!0,configurable:!0}),t.prototype._checkParentType=function(){!(this._parent instanceof Jo)&&this._parent instanceof Do?Go.ngModelGroupException():this._parent instanceof Jo||this._parent instanceof qo||this._parent instanceof Qo||Go.controlParentException()},t.prototype._setUpControl=function(){this._checkParentType(),this.control=this.formDirective.addControl(this),this.control.disabled&&this.valueAccessor.setDisabledState&&this.valueAccessor.setDisabledState(!0),this._added=!0},t}(uo),Zo=function(){function n(){}return Object.defineProperty(n.prototype,"required",{get:function(){return this._required},set:function(n){this._required=null!=n&&!1!==n&&""+n!="false",this._onChange&&this._onChange()},enumerable:!0,configurable:!0}),n.prototype.validate=function(n){return this.required?Xi.required(n):null},n.prototype.registerOnValidatorChange=function(n){this._onChange=n},n}(),$o=function(){function n(){}return n.prototype.ngOnChanges=function(n){"maxlength"in n&&(this._createValidator(),this._onChange&&this._onChange())},n.prototype.validate=function(n){return null!=this.maxlength?this._validator(n):null},n.prototype.registerOnValidatorChange=function(n){this._onChange=n},n.prototype._createValidator=function(){this._validator=Xi.maxLength(parseInt(this.maxlength,10))},n}(),ns=function(){function n(){}return n.prototype.group=function(n,t){void 0===t&&(t=null);var e=this._reduceControls(n);return new Fo(e,null!=t?t.validator:null,null!=t?t.asyncValidator:null)},n.prototype.control=function(n,t,e){return new No(n,t,e)},n.prototype.array=function(n,t,e){var l=this,r=n.map(function(n){return l._createControl(n)});return new Bo(r,t,e)},n.prototype._reduceControls=function(n){var t=this,e={};return Object.keys(n).forEach(function(l){e[l]=t._createControl(n[l])}),e},n.prototype._createControl=function(n){return n instanceof No||n instanceof Fo||n instanceof Bo?n:Array.isArray(n)?this.control(n[0],n.length>1?n[1]:null,n.length>2?n[2]:null):this.control(n)},n}(),ts=function(){},es=function(){},ls=function(){},rs=function(){},is="*";function os(n,t){return void 0===t&&(t=null),{type:2,steps:n,options:t}}function ss(n){return{type:6,styles:n,offset:null}}function as(n){Promise.resolve(null).then(n)}var us=function(){function n(){this._onDoneFns=[],this._onStartFns=[],this._onDestroyFns=[],this._started=!1,this._destroyed=!1,this._finished=!1,this.parentPlayer=null,this.totalTime=0}return n.prototype._onFinish=function(){this._finished||(this._finished=!0,this._onDoneFns.forEach(function(n){return n()}),this._onDoneFns=[])},n.prototype.onStart=function(n){this._onStartFns.push(n)},n.prototype.onDone=function(n){this._onDoneFns.push(n)},n.prototype.onDestroy=function(n){this._onDestroyFns.push(n)},n.prototype.hasStarted=function(){return this._started},n.prototype.init=function(){},n.prototype.play=function(){this.hasStarted()||(this._onStart(),this.triggerMicrotask()),this._started=!0},n.prototype.triggerMicrotask=function(){var n=this;as(function(){return n._onFinish()})},n.prototype._onStart=function(){this._onStartFns.forEach(function(n){return n()}),this._onStartFns=[]},n.prototype.pause=function(){},n.prototype.restart=function(){},n.prototype.finish=function(){this._onFinish()},n.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.hasStarted()||this._onStart(),this.finish(),this._onDestroyFns.forEach(function(n){return n()}),this._onDestroyFns=[])},n.prototype.reset=function(){},n.prototype.setPosition=function(n){},n.prototype.getPosition=function(){return 0},n.prototype.triggerCallback=function(n){var t="start"==n?this._onStartFns:this._onDoneFns;t.forEach(function(n){return n()}),t.length=0},n}(),cs=function(){function n(n){var t=this;this._onDoneFns=[],this._onStartFns=[],this._finished=!1,this._started=!1,this._destroyed=!1,this._onDestroyFns=[],this.parentPlayer=null,this.totalTime=0,this.players=n;var e=0,l=0,r=0,i=this.players.length;0==i?as(function(){return t._onFinish()}):this.players.forEach(function(n){n.onDone(function(){++e==i&&t._onFinish()}),n.onDestroy(function(){++l==i&&t._onDestroy()}),n.onStart(function(){++r==i&&t._onStart()})}),this.totalTime=this.players.reduce(function(n,t){return Math.max(n,t.totalTime)},0)}return n.prototype._onFinish=function(){this._finished||(this._finished=!0,this._onDoneFns.forEach(function(n){return n()}),this._onDoneFns=[])},n.prototype.init=function(){this.players.forEach(function(n){return n.init()})},n.prototype.onStart=function(n){this._onStartFns.push(n)},n.prototype._onStart=function(){this.hasStarted()||(this._started=!0,this._onStartFns.forEach(function(n){return n()}),this._onStartFns=[])},n.prototype.onDone=function(n){this._onDoneFns.push(n)},n.prototype.onDestroy=function(n){this._onDestroyFns.push(n)},n.prototype.hasStarted=function(){return this._started},n.prototype.play=function(){this.parentPlayer||this.init(),this._onStart(),this.players.forEach(function(n){return n.play()})},n.prototype.pause=function(){this.players.forEach(function(n){return n.pause()})},n.prototype.restart=function(){this.players.forEach(function(n){return n.restart()})},n.prototype.finish=function(){this._onFinish(),this.players.forEach(function(n){return n.finish()})},n.prototype.destroy=function(){this._onDestroy()},n.prototype._onDestroy=function(){this._destroyed||(this._destroyed=!0,this._onFinish(),this.players.forEach(function(n){return n.destroy()}),this._onDestroyFns.forEach(function(n){return n()}),this._onDestroyFns=[])},n.prototype.reset=function(){this.players.forEach(function(n){return n.reset()}),this._destroyed=!1,this._finished=!1,this._started=!1},n.prototype.setPosition=function(n){var t=n*this.totalTime;this.players.forEach(function(n){var e=n.totalTime?Math.min(1,t/n.totalTime):1;n.setPosition(e)})},n.prototype.getPosition=function(){var n=0;return this.players.forEach(function(t){var e=t.getPosition();n=Math.min(e,n)}),n},n.prototype.beforeDestroy=function(){this.players.forEach(function(n){n.beforeDestroy&&n.beforeDestroy()})},n.prototype.triggerCallback=function(n){var t="start"==n?this._onStartFns:this._onDoneFns;t.forEach(function(n){return n()}),t.length=0},n}(),ds="!",hs=e("TILf"),ps=e("N4j0"),fs=e("cQXm"),_s=function(n){function t(t,e){if(n.call(this),this.scheduler=e,null==t)throw new Error("iterator cannot be null.");this.iterator=ys(t)}return Object(i.__extends)(t,n),t.create=function(n,e){return new t(n,e)},t.dispatch=function(n){var t=n.index,e=n.iterator,l=n.subscriber;if(n.hasError)l.error(n.error);else{var r=e.next();r.done?l.complete():(l.next(r.value),n.index=t+1,l.closed?"function"==typeof e.return&&e.return():this.schedule(n))}},t.prototype._subscribe=function(n){var e=this.iterator,l=this.scheduler;if(l)return l.schedule(t.dispatch,0,{index:0,iterator:e,subscriber:n});for(;;){var r=e.next();if(r.done){n.complete();break}if(n.next(r.value),n.closed){"function"==typeof e.return&&e.return();break}}},t}(o.a),ms=function(){function n(n,t,e){void 0===t&&(t=0),void 0===e&&(e=n.length),this.str=n,this.idx=t,this.len=e}return n.prototype[hl.a]=function(){return this},n.prototype.next=function(){return this.idxbs?bs:r:r}()),this.arr=n,this.idx=t,this.len=e}return n.prototype[hl.a]=function(){return this},n.prototype.next=function(){return this.idx=n.length?l.complete():(l.next(t[e]),n.index=e+1,this.schedule(n)))},t.prototype._subscribe=function(n){var e=this.arrayLike,l=this.scheduler,r=e.length;if(l)return l.schedule(t.dispatch,0,{arrayLike:e,index:0,length:r,subscriber:n});for(var i=0;i1?new dl.a(n,e):new je.a(e),t)}}var Os=function(){};function Ts(n){return Error("A hint was already declared for 'align=\""+n+"\"'.")}var Ls=0,Ps=function(){function n(n,t,e){this._elementRef=n,this._changeDetectorRef=t,this.color="primary",this._showAlwaysAnimate=!1,this._subscriptAnimationState="",this._hintLabel="",this._hintLabelId="mat-hint-"+Ls++,this._labelOptions=e||{},this.floatLabel=this._labelOptions.float||"auto"}return Object.defineProperty(n.prototype,"dividerColor",{get:function(){return this.color},set:function(n){this.color=n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"hideRequiredMarker",{get:function(){return this._hideRequiredMarker},set:function(n){this._hideRequiredMarker=El(n)},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"_shouldAlwaysFloat",{get:function(){return"always"===this._floatLabel&&!this._showAlwaysAnimate},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"_canLabelFloat",{get:function(){return"never"!==this._floatLabel},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"hintLabel",{get:function(){return this._hintLabel},set:function(n){this._hintLabel=n,this._processHints()},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"floatPlaceholder",{get:function(){return this._floatLabel},set:function(n){this.floatLabel=n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"floatLabel",{get:function(){return this._floatLabel},set:function(n){n!==this._floatLabel&&(this._floatLabel=n||this._labelOptions.float||"auto",this._changeDetectorRef.markForCheck())},enumerable:!0,configurable:!0}),n.prototype.ngAfterContentInit=function(){var n=this;this._validateControlChild(),this._control.controlType&&this._elementRef.nativeElement.classList.add("mat-form-field-type-"+this._control.controlType),this._control.stateChanges.pipe(Ss(null)).subscribe(function(){n._validatePlaceholders(),n._syncDescribedByIds(),n._changeDetectorRef.markForCheck()});var t=this._control.ngControl;t&&t.valueChanges&&t.valueChanges.subscribe(function(){n._changeDetectorRef.markForCheck()}),this._hintChildren.changes.pipe(Ss(null)).subscribe(function(){n._processHints(),n._changeDetectorRef.markForCheck()}),this._errorChildren.changes.pipe(Ss(null)).subscribe(function(){n._syncDescribedByIds(),n._changeDetectorRef.markForCheck()})},n.prototype.ngAfterContentChecked=function(){this._validateControlChild()},n.prototype.ngAfterViewInit=function(){this._subscriptAnimationState="enter",this._changeDetectorRef.detectChanges()},n.prototype._shouldForward=function(n){var t=this._control?this._control.ngControl:null;return t&&t[n]},n.prototype._hasPlaceholder=function(){return!(!this._control.placeholder&&!this._placeholderChild)},n.prototype._hasLabel=function(){return!!this._labelChild},n.prototype._shouldLabelFloat=function(){return this._canLabelFloat&&(this._control.shouldLabelFloat||this._control.shouldPlaceholderFloat||this._shouldAlwaysFloat)},n.prototype._hideControlPlaceholder=function(){return!this._hasLabel()||!this._shouldLabelFloat()},n.prototype._hasFloatingLabel=function(){return this._hasLabel()||this._hasPlaceholder()},n.prototype._getDisplayedMessages=function(){return this._errorChildren&&this._errorChildren.length>0&&this._control.errorState?"error":"hint"},n.prototype._animateAndLockLabel=function(){var n=this;this._hasFloatingLabel()&&this._canLabelFloat&&(this._showAlwaysAnimate=!0,this._floatLabel="always",zr(this._label.nativeElement,"transitionend").pipe(Object(_r.a)(1)).subscribe(function(){n._showAlwaysAnimate=!1}),this._changeDetectorRef.markForCheck())},n.prototype._validatePlaceholders=function(){if(this._control.placeholder&&this._placeholderChild)throw Error("Placeholder attribute and child element were both specified.")},n.prototype._processHints=function(){this._validateHints(),this._syncDescribedByIds()},n.prototype._validateHints=function(){var n,t,e=this;this._hintChildren&&this._hintChildren.forEach(function(l){if("start"==l.align){if(n||e.hintLabel)throw Ts("start");n=l}else if("end"==l.align){if(t)throw Ts("end");t=l}})},n.prototype._syncDescribedByIds=function(){if(this._control){var n=[];if("hint"===this._getDisplayedMessages()){var t=this._hintChildren?this._hintChildren.find(function(n){return"start"===n.align}):null,e=this._hintChildren?this._hintChildren.find(function(n){return"end"===n.align}):null;t?n.push(t.id):this._hintLabel&&n.push(this._hintLabelId),e&&n.push(e.id)}else this._errorChildren&&(n=this._errorChildren.map(function(n){return n.id}));this._control.setDescribedByIds(n)}},n.prototype._validateControlChild=function(){if(!this._control)throw Error("mat-form-field must contain a MatFormFieldControl.")},n}(),Ds=function(){},As=0,Es=function(){function n(n,t){this._changeDetectorRef=n,this._elementRef=t,this.showPanel=!1,this._isOpen=!1,this.displayWith=null,this.optionSelected=new l.o,this._classList={},this.id="mat-autocomplete-"+As++}return Object.defineProperty(n.prototype,"isOpen",{get:function(){return this._isOpen&&this.showPanel},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"classList",{set:function(n){var t=this;n&&n.length&&(n.split(" ").forEach(function(n){return t._classList[n.trim()]=!0}),this._elementRef.nativeElement.className="")},enumerable:!0,configurable:!0}),n.prototype.ngAfterContentInit=function(){this._keyManager=new Sr(this.options).withWrap(),this._setVisibility()},n.prototype._setScrollTop=function(n){this.panel&&(this.panel.nativeElement.scrollTop=n)},n.prototype._getScrollTop=function(){return this.panel?this.panel.nativeElement.scrollTop:0},n.prototype._setVisibility=function(){this.showPanel=!!this.options.length,this._classList["mat-autocomplete-visible"]=this.showPanel,this._classList["mat-autocomplete-hidden"]=!this.showPanel,this._changeDetectorRef.markForCheck()},n.prototype._emitSelectEvent=function(n){var t=new function(n,t){this.source=n,this.option=t}(this,n);this.optionSelected.emit(t)},n}(),Ys=new l.r("mat-autocomplete-scroll-strategy");function js(n){return function(){return n.scrollStrategies.reposition()}}var Is=function(){function n(n,t,e,l,r,i,o,s,a){this._element=n,this._overlay=t,this._viewContainerRef=e,this._zone=l,this._changeDetectorRef=r,this._scrollStrategy=i,this._dir=o,this._formField=s,this._document=a,this._panelOpen=!1,this._manuallyFloatingLabel=!1,this._escapeEventStream=new yl.a,this._onChange=function(){},this._onTouched=function(){}}return n.prototype.ngOnDestroy=function(){this._destroyPanel(),this._escapeEventStream.complete()},Object.defineProperty(n.prototype,"panelOpen",{get:function(){return this._panelOpen&&this.autocomplete.showPanel},enumerable:!0,configurable:!0}),n.prototype.openPanel=function(){this._attachOverlay(),this._floatLabel()},n.prototype.closePanel=function(){this._resetLabel(),this._panelOpen&&(this.autocomplete._isOpen=this._panelOpen=!1,this._overlayRef&&this._overlayRef.hasAttached()&&(this._overlayRef.detach(),this._closingActionsSubscription.unsubscribe()),this._changeDetectorRef.detectChanges())},Object.defineProperty(n.prototype,"panelClosingActions",{get:function(){var n=this;return Object(Jr.a)(this.optionSelections,this.autocomplete._keyManager.tabOut.pipe(Ge(function(){return n._panelOpen})),this._escapeEventStream,this._outsideClickStream,this._overlayRef?this._overlayRef.detachments().pipe(Ge(function(){return n._panelOpen})):Object(Fe.a)())},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"optionSelections",{get:function(){return Jr.a.apply(void 0,this.autocomplete.options.map(function(n){return n.onSelectionChange}))},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"activeOption",{get:function(){return this.autocomplete&&this.autocomplete._keyManager?this.autocomplete._keyManager.activeItem:null},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"_outsideClickStream",{get:function(){var n=this;return this._document?Object(Jr.a)(zr(this._document,"click"),zr(this._document,"touchend")).pipe(Ge(function(t){var e=t.target,l=n._formField?n._formField._elementRef.nativeElement:null;return n._panelOpen&&e!==n._element.nativeElement&&(!l||!l.contains(e))&&!!n._overlayRef&&!n._overlayRef.overlayElement.contains(e)})):Object(Fe.a)(null)},enumerable:!0,configurable:!0}),n.prototype.writeValue=function(n){var t=this;Promise.resolve(null).then(function(){return t._setTriggerValue(n)})},n.prototype.registerOnChange=function(n){this._onChange=n},n.prototype.registerOnTouched=function(n){this._onTouched=n},n.prototype.setDisabledState=function(n){this._element.nativeElement.disabled=n},n.prototype._handleKeydown=function(n){var t=n.keyCode;if(27===t&&this.panelOpen)this._resetActiveItem(),this._escapeEventStream.next(),n.stopPropagation();else if(this.activeOption&&13===t&&this.panelOpen)this.activeOption._selectViaInteraction(),this._resetActiveItem(),n.preventDefault();else{var e=this.autocomplete._keyManager.activeItem,l=38===t||40===t;this.panelOpen||9===t?this.autocomplete._keyManager.onKeydown(n):l&&this.openPanel(),(l||this.autocomplete._keyManager.activeItem!==e)&&this._scrollToOption()}},n.prototype._handleInput=function(n){document.activeElement===n.target&&(this._onChange(n.target.value),this.openPanel())},n.prototype._handleFocus=function(){this._element.nativeElement.readOnly||(this._attachOverlay(),this._floatLabel(!0))},n.prototype._floatLabel=function(n){void 0===n&&(n=!1),this._formField&&"auto"===this._formField.floatLabel&&(n?this._formField._animateAndLockLabel():this._formField.floatLabel="always",this._manuallyFloatingLabel=!0)},n.prototype._resetLabel=function(){this._manuallyFloatingLabel&&(this._formField.floatLabel="auto",this._manuallyFloatingLabel=!1)},n.prototype._scrollToOption=function(){var n=this.autocomplete._keyManager.activeItemIndex||0,t=48*(n+pr.countGroupLabelsBeforeOption(n,this.autocomplete.options,this.autocomplete.optionGroups)),e=this.autocomplete._getScrollTop();te+256&&this.autocomplete._setScrollTop(Math.max(0,t-256+48))},n.prototype._subscribeToClosingActions=function(){var n=this,t=this._zone.onStable.asObservable().pipe(Object(_r.a)(1)),e=this.autocomplete.options.changes.pipe(Ve(function(){return n._positionStrategy.recalculateLastPosition()}),Hi(0));return Object(Jr.a)(t,e).pipe(Object(Ri.a)(function(){return n._resetActiveItem(),n.autocomplete._setVisibility(),n.panelClosingActions}),Object(_r.a)(1)).subscribe(function(t){return n._setValueAndClose(t)})},n.prototype._destroyPanel=function(){this._overlayRef&&(this.closePanel(),this._overlayRef.dispose(),this._overlayRef=null)},n.prototype._setTriggerValue=function(n){var t=this.autocomplete&&this.autocomplete.displayWith?this.autocomplete.displayWith(n):n,e=null!=t?t:"";this._formField?this._formField._control.value=e:this._element.nativeElement.value=e},n.prototype._setValueAndClose=function(n){n&&n.source&&(this._clearPreviousSelectedOption(n.source),this._setTriggerValue(n.source.value),this._onChange(n.source.value),this._element.nativeElement.focus(),this.autocomplete._emitSelectEvent(n.source)),this.closePanel()},n.prototype._clearPreviousSelectedOption=function(n){this.autocomplete.options.forEach(function(t){t!=n&&t.selected&&t.deselect()})},n.prototype._attachOverlay=function(){if(!this.autocomplete)throw Error("Attempting to open an undefined instance of `mat-autocomplete`. Make sure that the id passed to the `matAutocomplete` is correct and that you're attempting to open it after the ngAfterContentInit hook.");this._overlayRef?this._overlayRef.updateSize({width:this._getHostWidth()}):(this._portal=new li(this.autocomplete.template,this._viewContainerRef),this._overlayRef=this._overlay.create(this._getOverlayConfig())),this._overlayRef&&!this._overlayRef.hasAttached()&&(this._overlayRef.attach(this._portal),this._closingActionsSubscription=this._subscribeToClosingActions()),this.autocomplete._setVisibility(),this.autocomplete._isOpen=this._panelOpen=!0},n.prototype._getOverlayConfig=function(){return new ci({positionStrategy:this._getOverlayPosition(),scrollStrategy:this._scrollStrategy(),width:this._getHostWidth(),direction:this._dir?this._dir.value:"ltr"})},n.prototype._getOverlayPosition=function(){return this._positionStrategy=this._overlay.position().connectedTo(this._getConnectedElement(),{originX:"start",originY:"bottom"},{overlayX:"start",overlayY:"top"}).withFallbackPosition({originX:"start",originY:"top"},{overlayX:"start",overlayY:"bottom"}),this._positionStrategy},n.prototype._getConnectedElement=function(){return this._formField?this._formField._connectionContainerRef:this._element},n.prototype._getHostWidth=function(){return this._getConnectedElement().nativeElement.getBoundingClientRect().width},n.prototype._resetActiveItem=function(){this.autocomplete._keyManager.setActiveItem(-1)},n}(),Rs=function(){},Hs=function(){},Ns=function(){},Fs=function(){},Bs=function(n){function t(t,e,l){var r=n.call(this,t)||this;return r._platform=e,r._focusMonitor=l,r._isRoundButton=r._hasHostAttributes("mat-fab","mat-mini-fab"),r._isIconButton=r._hasHostAttributes("mat-icon-button"),r._focusMonitor.monitor(r._elementRef.nativeElement,!0),r}return Object(i.__extends)(t,n),t.prototype.ngOnDestroy=function(){this._focusMonitor.stopMonitoring(this._elementRef.nativeElement)},t.prototype.focus=function(){this._getHostElement().focus()},t.prototype._getHostElement=function(){return this._elementRef.nativeElement},t.prototype._isRippleDisabled=function(){return this.disableRipple||this.disabled},t.prototype._hasHostAttributes=function(){for(var n=this,t=[],e=0;e1&&!this._isMulti)throw Error("Cannot pass multiple values into SelectionModel with single-value mode.")},n}(),Us=function(n,t){this.added=n,this.removed=t},Gs=function(){function n(){this._listeners=[]}return n.prototype.notify=function(n,t){for(var e=0,l=this._listeners;e0?this._ngZone.runOutsideAngular(function(){n._debouncer.pipe(mr(n.debounce)).subscribe(function(t){return n.event.emit(t)})}):this._debouncer.subscribe(function(t){return n.event.emit(t)}),this._observer=this._ngZone.runOutsideAngular(function(){return n._mutationObserverFactory.create(function(t){n._debouncer.next(t)})}),this._observer&&this._observer.observe(this._elementRef.nativeElement,{characterData:!0,childList:!0,subtree:!0})},n.prototype.ngOnDestroy=function(){this._observer&&this._observer.disconnect(),this._debouncer.complete()},n}(),Xs=function(){},Zs=new l.r("mat-checkbox-click-action"),$s=0,na=function(){var n={Init:0,Checked:1,Unchecked:2,Indeterminate:3};return n[n.Init]="Init",n[n.Checked]="Checked",n[n.Unchecked]="Unchecked",n[n.Indeterminate]="Indeterminate",n}(),ta=function(n){function t(t,e,r,i,o){var s=n.call(this,t)||this;return s._changeDetectorRef=e,s._focusMonitor=r,s._clickAction=o,s.ariaLabel="",s.ariaLabelledby=null,s._uniqueId="mat-checkbox-"+ ++$s,s.id=s._uniqueId,s.labelPosition="after",s.name=null,s.change=new l.o,s.indeterminateChange=new l.o,s._rippleConfig={centered:!0,radius:25,speedFactor:1.5},s.onTouched=function(){},s._currentAnimationClass="",s._currentCheckState=na.Init,s._checked=!1,s._indeterminate=!1,s._controlValueAccessorChangeFn=function(){},s.tabIndex=parseInt(i)||0,s}return Object(i.__extends)(t,n),Object.defineProperty(t.prototype,"inputId",{get:function(){return(this.id||this._uniqueId)+"-input"},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"required",{get:function(){return this._required},set:function(n){this._required=El(n)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"align",{get:function(){return"after"==this.labelPosition?"start":"end"},set:function(n){this.labelPosition="start"==n?"after":"before"},enumerable:!0,configurable:!0}),t.prototype.ngAfterViewInit=function(){var n=this;this._focusMonitor.monitor(this._inputElement.nativeElement,!1).subscribe(function(t){return n._onInputFocusChange(t)})},t.prototype.ngOnDestroy=function(){this._focusMonitor.stopMonitoring(this._inputElement.nativeElement)},Object.defineProperty(t.prototype,"checked",{get:function(){return this._checked},set:function(n){n!=this.checked&&(this._checked=n,this._changeDetectorRef.markForCheck())},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"indeterminate",{get:function(){return this._indeterminate},set:function(n){var t=n!=this._indeterminate;this._indeterminate=n,t&&(this._transitionCheckState(this._indeterminate?na.Indeterminate:this.checked?na.Checked:na.Unchecked),this.indeterminateChange.emit(this._indeterminate))},enumerable:!0,configurable:!0}),t.prototype._isRippleDisabled=function(){return this.disableRipple||this.disabled},t.prototype._onLabelTextChange=function(){this._changeDetectorRef.markForCheck()},t.prototype.writeValue=function(n){this.checked=!!n},t.prototype.registerOnChange=function(n){this._controlValueAccessorChangeFn=n},t.prototype.registerOnTouched=function(n){this.onTouched=n},t.prototype.setDisabledState=function(n){this.disabled=n,this._changeDetectorRef.markForCheck()},t.prototype._getAriaChecked=function(){return this.checked?"true":this.indeterminate?"mixed":"false"},t.prototype._transitionCheckState=function(n){var t=this._currentCheckState,e=this._elementRef.nativeElement;t!==n&&(this._currentAnimationClass.length>0&&e.classList.remove(this._currentAnimationClass),this._currentAnimationClass=this._getAnimationClassForCheckStateTransition(t,n),this._currentCheckState=n,this._currentAnimationClass.length>0&&e.classList.add(this._currentAnimationClass))},t.prototype._emitChangeEvent=function(){var n=new function(){};n.source=this,n.checked=this.checked,this._controlValueAccessorChangeFn(this.checked),this.change.emit(n)},t.prototype._onInputFocusChange=function(n){this._focusRipple||"keyboard"!==n?n||(this._removeFocusRipple(),this.onTouched()):this._focusRipple=this._ripple.launch(0,0,Object(i.__assign)({persistent:!0},this._rippleConfig))},t.prototype.toggle=function(){this.checked=!this.checked},t.prototype._onInputClick=function(n){var t=this;n.stopPropagation(),this.disabled||"noop"===this._clickAction?this.disabled||"noop"!==this._clickAction||(this._inputElement.nativeElement.checked=this.checked,this._inputElement.nativeElement.indeterminate=this.indeterminate):(this.indeterminate&&"check"!==this._clickAction&&Promise.resolve().then(function(){t._indeterminate=!1,t.indeterminateChange.emit(t._indeterminate)}),this.toggle(),this._transitionCheckState(this._checked?na.Checked:na.Unchecked),this._emitChangeEvent())},t.prototype.focus=function(){this._focusMonitor.focusVia(this._inputElement.nativeElement,"keyboard")},t.prototype._onInteractionEvent=function(n){n.stopPropagation()},t.prototype._getAnimationClassForCheckStateTransition=function(n,t){var e="";switch(n){case na.Init:if(t===na.Checked)e="unchecked-checked";else{if(t!=na.Indeterminate)return"";e="unchecked-indeterminate"}break;case na.Unchecked:e=t===na.Checked?"unchecked-checked":"unchecked-indeterminate";break;case na.Checked:e=t===na.Unchecked?"checked-unchecked":"checked-indeterminate";break;case na.Indeterminate:e=t===na.Checked?"indeterminate-checked":"indeterminate-unchecked"}return"mat-checkbox-anim-"+e},t.prototype._removeFocusRipple=function(){this._focusRipple&&(this._focusRipple.fadeOut(),this._focusRipple=null)},t}(Jl(Gl(ql(Ul(function(n){this._elementRef=n})),"accent"))),ea=function(){},la=function(n){function t(t){n.call(this),this.observableFactory=t}return Object(i.__extends)(t,n),t.create=function(n){return new t(n)},t.prototype._subscribe=function(n){return new ra(n,this.observableFactory)},t}(o.a),ra=function(n){function t(t,e){n.call(this,t),this.factory=e,this.tryDefer()}return Object(i.__extends)(t,n),t.prototype.tryDefer=function(){try{this._callFactory()}catch(n){this._error(n)}},t.prototype._callFactory=function(){var n=this.factory();n&&this.add(Object(ke.a)(this,n))},t}(Me.a),ia=la.create,oa=function(){this.role="dialog",this.panelClass="",this.hasBackdrop=!0,this.backdropClass="",this.disableClose=!1,this.width="",this.height="",this.maxWidth="80vw",this.data=null,this.direction="ltr",this.ariaDescribedBy=null,this.ariaLabel=null,this.autoFocus=!0};function sa(){throw Error("Attempting to attach dialog content after content is already attached")}var aa=function(n){function t(t,e,r,i){var o=n.call(this)||this;return o._elementRef=t,o._focusTrapFactory=e,o._changeDetectorRef=r,o._document=i,o._elementFocusedBeforeDialogWasOpened=null,o._state="enter",o._animationStateChanged=new l.o,o._ariaLabelledBy=null,o}return Object(i.__extends)(t,n),t.prototype.attachComponentPortal=function(n){return this._portalOutlet.hasAttached()&&sa(),this._savePreviouslyFocusedElement(),this._portalOutlet.attachComponentPortal(n)},t.prototype.attachTemplatePortal=function(n){return this._portalOutlet.hasAttached()&&sa(),this._savePreviouslyFocusedElement(),this._portalOutlet.attachTemplatePortal(n)},t.prototype._trapFocus=function(){this._focusTrap||(this._focusTrap=this._focusTrapFactory.create(this._elementRef.nativeElement)),this._config.autoFocus&&this._focusTrap.focusInitialElementWhenReady()},t.prototype._restoreFocus=function(){var n=this._elementFocusedBeforeDialogWasOpened;n&&"function"==typeof n.focus&&n.focus(),this._focusTrap&&this._focusTrap.destroy()},t.prototype._savePreviouslyFocusedElement=function(){var n=this;this._document&&(this._elementFocusedBeforeDialogWasOpened=this._document.activeElement,Promise.resolve().then(function(){return n._elementRef.nativeElement.focus()}))},t.prototype._onAnimationDone=function(n){"enter"===n.toState?this._trapFocus():"exit"===n.toState&&this._restoreFocus(),this._animationStateChanged.emit(n)},t.prototype._onAnimationStart=function(n){this._animationStateChanged.emit(n)},t.prototype._startExitAnimation=function(){this._state="exit",this._changeDetectorRef.markForCheck()},t}(ri),ua=0,ca=function(){function n(n,t,e){void 0===e&&(e="mat-dialog-"+ua++);var l=this;this._overlayRef=n,this._containerInstance=t,this.id=e,this.disableClose=this._containerInstance._config.disableClose,this._afterOpen=new yl.a,this._afterClosed=new yl.a,this._beforeClose=new yl.a,t._animationStateChanged.pipe(Ge(function(n){return"done"===n.phaseName&&"enter"===n.toState}),Object(_r.a)(1)).subscribe(function(){l._afterOpen.next(),l._afterOpen.complete()}),t._animationStateChanged.pipe(Ge(function(n){return"done"===n.phaseName&&"exit"===n.toState}),Object(_r.a)(1)).subscribe(function(){l._overlayRef.dispose(),l._afterClosed.next(l._result),l._afterClosed.complete(),l.componentInstance=null})}return n.prototype.close=function(n){var t=this;this._result=n,this._containerInstance._animationStateChanged.pipe(Ge(function(n){return"start"===n.phaseName}),Object(_r.a)(1)).subscribe(function(){t._beforeClose.next(n),t._beforeClose.complete(),t._overlayRef.detachBackdrop()}),this._containerInstance._startExitAnimation()},n.prototype.afterOpen=function(){return this._afterOpen.asObservable()},n.prototype.afterClosed=function(){return this._afterClosed.asObservable()},n.prototype.beforeClose=function(){return this._beforeClose.asObservable()},n.prototype.backdropClick=function(){return this._overlayRef.backdropClick()},n.prototype.keydownEvents=function(){return this._overlayRef.keydownEvents()},n.prototype.updatePosition=function(n){var t=this._getPositionStrategy();return n&&(n.left||n.right)?n.left?t.left(n.left):t.right(n.right):t.centerHorizontally(),n&&(n.top||n.bottom)?n.top?t.top(n.top):t.bottom(n.bottom):t.centerVertically(),this._overlayRef.updatePosition(),this},n.prototype.updateSize=function(n,t){return void 0===n&&(n="auto"),void 0===t&&(t="auto"),this._getPositionStrategy().width(n).height(t),this._overlayRef.updatePosition(),this},n.prototype._getPositionStrategy=function(){return this._overlayRef.getConfig().positionStrategy},n}(),da=new l.r("MatDialogData"),ha=new l.r("mat-dialog-scroll-strategy");function pa(n){return function(){return n.scrollStrategies.block()}}var fa=function(){function n(n,t,e,l,r,i){var o=this;this._overlay=n,this._injector=t,this._scrollStrategy=l,this._parentDialog=r,this._overlayContainer=i,this._openDialogsAtThisLevel=[],this._afterAllClosedAtThisLevel=new yl.a,this._afterOpenAtThisLevel=new yl.a,this._ariaHiddenElements=new Map,this.afterAllClosed=ia(function(){return o.openDialogs.length?o._afterAllClosed:o._afterAllClosed.pipe(Ss(void 0))}),!r&&e&&e.subscribe(function(){return o.closeAll()})}return Object.defineProperty(n.prototype,"openDialogs",{get:function(){return this._parentDialog?this._parentDialog.openDialogs:this._openDialogsAtThisLevel},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"afterOpen",{get:function(){return this._parentDialog?this._parentDialog.afterOpen:this._afterOpenAtThisLevel},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"_afterAllClosed",{get:function(){var n=this._parentDialog;return n?n._afterAllClosed:this._afterAllClosedAtThisLevel},enumerable:!0,configurable:!0}),n.prototype.open=function(n,t){var e=this;if((t=function(n){return Object(i.__assign)({},new oa,n)}(t)).id&&this.getDialogById(t.id))throw Error('Dialog with id "'+t.id+'" exists already. The dialog id must be unique.');var l=this._createOverlay(t),r=this._attachDialogContainer(l,t),o=this._attachDialogContent(n,r,l,t);return this.openDialogs.length||this._hideNonDialogContentFromAssistiveTechnology(),this.openDialogs.push(o),o.afterClosed().subscribe(function(){return e._removeOpenDialog(o)}),this.afterOpen.next(o),o},n.prototype.closeAll=function(){for(var n=this.openDialogs.length;n--;)this.openDialogs[n].close()},n.prototype.getDialogById=function(n){return this.openDialogs.find(function(t){return t.id===n})},n.prototype._createOverlay=function(n){var t=this._getOverlayConfig(n);return this._overlay.create(t)},n.prototype._getOverlayConfig=function(n){var t=new ci({positionStrategy:this._overlay.position().global(),scrollStrategy:this._scrollStrategy(),panelClass:n.panelClass,hasBackdrop:n.hasBackdrop,direction:n.direction,minWidth:n.minWidth,minHeight:n.minHeight,maxWidth:n.maxWidth,maxHeight:n.maxHeight});return n.backdropClass&&(t.backdropClass=n.backdropClass),t},n.prototype._attachDialogContainer=function(n,t){var e=new ei(aa,t.viewContainerRef),l=n.attach(e);return l.instance._config=t,l.instance},n.prototype._attachDialogContent=function(n,t,e,r){var i=new ca(e,t,r.id);if(r.hasBackdrop&&e.backdropClick().subscribe(function(){i.disableClose||i.close()}),e.keydownEvents().pipe(Ge(function(n){return 27===n.keyCode&&!i.disableClose})).subscribe(function(){return i.close()}),n instanceof l.O)t.attachTemplatePortal(new li(n,null,{$implicit:r.data,dialogRef:i}));else{var o=this._createInjector(r,i,t),s=t.attachComponentPortal(new ei(n,void 0,o));i.componentInstance=s.instance}return i.updateSize(r.width,r.height).updatePosition(r.position),i},n.prototype._createInjector=function(n,t,e){var l=n&&n.viewContainerRef&&n.viewContainerRef.injector,r=new WeakMap;return r.set(ca,t),r.set(aa,e),r.set(da,n.data),r.set(Dl,{value:n.direction,change:Object(Fe.a)()}),new ai(l||this._injector,r)},n.prototype._removeOpenDialog=function(n){var t=this.openDialogs.indexOf(n);t>-1&&(this.openDialogs.splice(t,1),this.openDialogs.length||(this._ariaHiddenElements.forEach(function(n,t){n?t.setAttribute("aria-hidden",n):t.removeAttribute("aria-hidden")}),this._ariaHiddenElements.clear(),this._afterAllClosed.next()))},n.prototype._hideNonDialogContentFromAssistiveTechnology=function(){var n=this._overlayContainer.getContainerElement();if(n.parentElement)for(var t=n.parentElement.children,e=t.length-1;e>-1;e--){var l=t[e];l===n||"SCRIPT"===l.nodeName||"STYLE"===l.nodeName||l.hasAttribute("aria-live")||(this._ariaHiddenElements.set(l,l.getAttribute("aria-hidden")),l.setAttribute("aria-hidden","true"))}},n}(),_a=function(){},ma=function(){},ga=function(){function n(n){this.callback=n}return n.prototype.call=function(n,t){return t.subscribe(new ya(n,this.callback))},n}(),ya=function(n){function t(t,e){n.call(this,t),this.add(new rl.a(e))}return Object(i.__extends)(t,n),t}(Be.a),ba=e("3a3m");function va(n,t){return function(n,t){return Object(nl.a)(n,t,1)}(n,t)(this)}var wa=function(){},xa=function(){},Ma=function(){function n(n){var t=this;this.normalizedNames=new Map,this.lazyUpdate=null,n?this.lazyInit="string"==typeof n?function(){t.headers=new Map,n.split("\n").forEach(function(n){var e=n.indexOf(":");if(e>0){var l=n.slice(0,e),r=l.toLowerCase(),i=n.slice(e+1).trim();t.maybeSetNormalizedName(l,r),t.headers.has(r)?t.headers.get(r).push(i):t.headers.set(r,[i])}})}:function(){t.headers=new Map,Object.keys(n).forEach(function(e){var l=n[e],r=e.toLowerCase();"string"==typeof l&&(l=[l]),l.length>0&&(t.headers.set(r,l),t.maybeSetNormalizedName(e,r))})}:this.headers=new Map}return n.prototype.has=function(n){return this.init(),this.headers.has(n.toLowerCase())},n.prototype.get=function(n){this.init();var t=this.headers.get(n.toLowerCase());return t&&t.length>0?t[0]:null},n.prototype.keys=function(){return this.init(),Array.from(this.normalizedNames.values())},n.prototype.getAll=function(n){return this.init(),this.headers.get(n.toLowerCase())||null},n.prototype.append=function(n,t){return this.clone({name:n,value:t,op:"a"})},n.prototype.set=function(n,t){return this.clone({name:n,value:t,op:"s"})},n.prototype.delete=function(n,t){return this.clone({name:n,value:t,op:"d"})},n.prototype.maybeSetNormalizedName=function(n,t){this.normalizedNames.has(t)||this.normalizedNames.set(t,n)},n.prototype.init=function(){var t=this;this.lazyInit&&(this.lazyInit instanceof n?this.copyFrom(this.lazyInit):this.lazyInit(),this.lazyInit=null,this.lazyUpdate&&(this.lazyUpdate.forEach(function(n){return t.applyUpdate(n)}),this.lazyUpdate=null))},n.prototype.copyFrom=function(n){var t=this;n.init(),Array.from(n.headers.keys()).forEach(function(e){t.headers.set(e,n.headers.get(e)),t.normalizedNames.set(e,n.normalizedNames.get(e))})},n.prototype.clone=function(t){var e=new n;return e.lazyInit=this.lazyInit&&this.lazyInit instanceof n?this.lazyInit:this,e.lazyUpdate=(this.lazyUpdate||[]).concat([t]),e},n.prototype.applyUpdate=function(n){var t=n.name.toLowerCase();switch(n.op){case"a":case"s":var e=n.value;if("string"==typeof e&&(e=[e]),0===e.length)return;this.maybeSetNormalizedName(n.name,t);var l=("a"===n.op?this.headers.get(t):void 0)||[];l.push.apply(l,e),this.headers.set(t,l);break;case"d":var r=n.value;if(r){var i=this.headers.get(t);if(!i)return;0===(i=i.filter(function(n){return-1===r.indexOf(n)})).length?(this.headers.delete(t),this.normalizedNames.delete(t)):this.headers.set(t,i)}else this.headers.delete(t),this.normalizedNames.delete(t)}},n.prototype.forEach=function(n){var t=this;this.init(),Array.from(this.normalizedNames.keys()).forEach(function(e){return n(t.normalizedNames.get(e),t.headers.get(e))})},n}(),ka=function(){function n(){}return n.prototype.encodeKey=function(n){return Ca(n)},n.prototype.encodeValue=function(n){return Ca(n)},n.prototype.decodeKey=function(n){return decodeURIComponent(n)},n.prototype.decodeValue=function(n){return decodeURIComponent(n)},n}();function Ca(n){return encodeURIComponent(n).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/gi,"$").replace(/%2C/gi,",").replace(/%3B/gi,";").replace(/%2B/gi,"+").replace(/%3D/gi,"=").replace(/%3F/gi,"?").replace(/%2F/gi,"/")}var Sa=function(){function n(n){void 0===n&&(n={});var t,e,l,r=this;if(this.updates=null,this.cloneFrom=null,this.encoder=n.encoder||new ka,n.fromString){if(n.fromObject)throw new Error("Cannot specify both fromString and fromObject.");this.map=(t=n.fromString,e=this.encoder,l=new Map,t.length>0&&t.split("&").forEach(function(n){var t=n.indexOf("="),r=-1==t?[e.decodeKey(n),""]:[e.decodeKey(n.slice(0,t)),e.decodeValue(n.slice(t+1))],i=r[0],o=r[1],s=l.get(i)||[];s.push(o),l.set(i,s)}),l)}else n.fromObject?(this.map=new Map,Object.keys(n.fromObject).forEach(function(t){var e=n.fromObject[t];r.map.set(t,Array.isArray(e)?e:[e])})):this.map=null}return n.prototype.has=function(n){return this.init(),this.map.has(n)},n.prototype.get=function(n){this.init();var t=this.map.get(n);return t?t[0]:null},n.prototype.getAll=function(n){return this.init(),this.map.get(n)||null},n.prototype.keys=function(){return this.init(),Array.from(this.map.keys())},n.prototype.append=function(n,t){return this.clone({param:n,value:t,op:"a"})},n.prototype.set=function(n,t){return this.clone({param:n,value:t,op:"s"})},n.prototype.delete=function(n,t){return this.clone({param:n,value:t,op:"d"})},n.prototype.toString=function(){var n=this;return this.init(),this.keys().map(function(t){var e=n.encoder.encodeKey(t);return n.map.get(t).map(function(t){return e+"="+n.encoder.encodeValue(t)}).join("&")}).join("&")},n.prototype.clone=function(t){var e=new n({encoder:this.encoder});return e.cloneFrom=this.cloneFrom||this,e.updates=(this.updates||[]).concat([t]),e},n.prototype.init=function(){var n=this;null===this.map&&(this.map=new Map),null!==this.cloneFrom&&(this.cloneFrom.init(),this.cloneFrom.keys().forEach(function(t){return n.map.set(t,n.cloneFrom.map.get(t))}),this.updates.forEach(function(t){switch(t.op){case"a":case"s":var e=("a"===t.op?n.map.get(t.param):void 0)||[];e.push(t.value),n.map.set(t.param,e);break;case"d":if(void 0===t.value){n.map.delete(t.param);break}var l=n.map.get(t.param)||[],r=l.indexOf(t.value);-1!==r&&l.splice(r,1),l.length>0?n.map.set(t.param,l):n.map.delete(t.param)}}),this.cloneFrom=null)},n}();function Oa(n){return"undefined"!=typeof ArrayBuffer&&n instanceof ArrayBuffer}function Ta(n){return"undefined"!=typeof Blob&&n instanceof Blob}function La(n){return"undefined"!=typeof FormData&&n instanceof FormData}var Pa=function(){function n(n,t,e,l){var r;if(this.url=t,this.body=null,this.reportProgress=!1,this.withCredentials=!1,this.responseType="json",this.method=n.toUpperCase(),function(n){switch(n){case"DELETE":case"GET":case"HEAD":case"OPTIONS":case"JSONP":return!1;default:return!0}}(this.method)||l?(this.body=void 0!==e?e:null,r=l):r=e,r&&(this.reportProgress=!!r.reportProgress,this.withCredentials=!!r.withCredentials,r.responseType&&(this.responseType=r.responseType),r.headers&&(this.headers=r.headers),r.params&&(this.params=r.params)),this.headers||(this.headers=new Ma),this.params){var i=this.params.toString();if(0===i.length)this.urlWithParams=t;else{var o=t.indexOf("?");this.urlWithParams=t+(-1===o?"?":o=200&&this.status<300}}(),Ea=function(n){function t(t){void 0===t&&(t={});var e=n.call(this,t)||this;return e.type=Da.ResponseHeader,e}return Object(i.__extends)(t,n),t.prototype.clone=function(n){return void 0===n&&(n={}),new t({headers:n.headers||this.headers,status:void 0!==n.status?n.status:this.status,statusText:n.statusText||this.statusText,url:n.url||this.url||void 0})},t}(Aa),Ya=function(n){function t(t){void 0===t&&(t={});var e=n.call(this,t)||this;return e.type=Da.Response,e.body=void 0!==t.body?t.body:null,e}return Object(i.__extends)(t,n),t.prototype.clone=function(n){return void 0===n&&(n={}),new t({body:void 0!==n.body?n.body:this.body,headers:n.headers||this.headers,status:void 0!==n.status?n.status:this.status,statusText:n.statusText||this.statusText,url:n.url||this.url||void 0})},t}(Aa),ja=function(n){function t(t){var e=n.call(this,t,0,"Unknown Error")||this;return e.name="HttpErrorResponse",e.ok=!1,e.message=e.status>=200&&e.status<300?"Http failure during parsing for "+(t.url||"(unknown url)"):"Http failure response for "+(t.url||"(unknown url)")+": "+t.status+" "+t.statusText,e.error=t.error||null,e}return Object(i.__extends)(t,n),t}(Aa);function Ia(n,t){return{body:t,headers:n.headers,observe:n.observe,params:n.params,reportProgress:n.reportProgress,responseType:n.responseType,withCredentials:n.withCredentials}}var Ra=function(){function n(n){this.handler=n}return n.prototype.request=function(n,t,e){var l,r=this;if(void 0===e&&(e={}),n instanceof Pa)l=n;else{var i;i=e.headers instanceof Ma?e.headers:new Ma(e.headers);var o=void 0;e.params&&(o=e.params instanceof Sa?e.params:new Sa({fromObject:e.params})),l=new Pa(n,t,void 0!==e.body?e.body:null,{headers:i,params:o,reportProgress:e.reportProgress,responseType:e.responseType||"json",withCredentials:e.withCredentials})}var s=va.call(Object(Fe.a)(l),function(n){return r.handler.handle(n)});if(n instanceof Pa||"events"===e.observe)return s;var a=Qe.call(s,function(n){return n instanceof Ya});switch(e.observe||"body"){case"body":switch(l.responseType){case"arraybuffer":return Pe.call(a,function(n){if(null!==n.body&&!(n.body instanceof ArrayBuffer))throw new Error("Response is not an ArrayBuffer.");return n.body});case"blob":return Pe.call(a,function(n){if(null!==n.body&&!(n.body instanceof Blob))throw new Error("Response is not a Blob.");return n.body});case"text":return Pe.call(a,function(n){if(null!==n.body&&"string"!=typeof n.body)throw new Error("Response is not a string.");return n.body});case"json":default:return Pe.call(a,function(n){return n.body})}case"response":return a;default:throw new Error("Unreachable: unhandled observe type "+e.observe+"}")}},n.prototype.delete=function(n,t){return void 0===t&&(t={}),this.request("DELETE",n,t)},n.prototype.get=function(n,t){return void 0===t&&(t={}),this.request("GET",n,t)},n.prototype.head=function(n,t){return void 0===t&&(t={}),this.request("HEAD",n,t)},n.prototype.jsonp=function(n,t){return this.request("JSONP",n,{params:(new Sa).append(t,"JSONP_CALLBACK"),observe:"body",responseType:"json"})},n.prototype.options=function(n,t){return void 0===t&&(t={}),this.request("OPTIONS",n,t)},n.prototype.patch=function(n,t,e){return void 0===e&&(e={}),this.request("PATCH",n,Ia(e,t))},n.prototype.post=function(n,t,e){return void 0===e&&(e={}),this.request("POST",n,Ia(e,t))},n.prototype.put=function(n,t,e){return void 0===e&&(e={}),this.request("PUT",n,Ia(e,t))},n}(),Ha=function(){function n(n,t){this.next=n,this.interceptor=t}return n.prototype.handle=function(n){return this.interceptor.intercept(n,this.next)},n}(),Na=new l.r("HTTP_INTERCEPTORS"),Fa=function(){function n(){}return n.prototype.intercept=function(n,t){return t.handle(n)},n}(),Ba=/^\)\]\}',?\n/,Va=function(){},Wa=function(){function n(){}return n.prototype.build=function(){return new XMLHttpRequest},n}(),za=function(){function n(n){this.xhrFactory=n}return n.prototype.handle=function(n){var t=this;if("JSONP"===n.method)throw new Error("Attempted to construct Jsonp request without JsonpClientModule installed.");return new o.a(function(e){var l=t.xhrFactory.build();if(l.open(n.method,n.urlWithParams),n.withCredentials&&(l.withCredentials=!0),n.headers.forEach(function(n,t){return l.setRequestHeader(n,t.join(","))}),n.headers.has("Accept")||l.setRequestHeader("Accept","application/json, text/plain, */*"),!n.headers.has("Content-Type")){var r=n.detectContentTypeHeader();null!==r&&l.setRequestHeader("Content-Type",r)}if(n.responseType){var i=n.responseType.toLowerCase();l.responseType="json"!==i?i:"text"}var o=n.serializeBody(),s=null,a=function(){if(null!==s)return s;var t=1223===l.status?204:l.status,e=l.statusText||"OK",r=new Ma(l.getAllResponseHeaders()),i=function(n){return"responseURL"in n&&n.responseURL?n.responseURL:/^X-Request-URL:/m.test(n.getAllResponseHeaders())?n.getResponseHeader("X-Request-URL"):null}(l)||n.url;return s=new Ea({headers:r,status:t,statusText:e,url:i})},u=function(){var t=a(),r=t.headers,i=t.status,o=t.statusText,s=t.url,u=null;204!==i&&(u="undefined"==typeof l.response?l.responseText:l.response),0===i&&(i=u?200:0);var c=i>=200&&i<300;if("json"===n.responseType&&"string"==typeof u){var d=u;u=u.replace(Ba,"");try{u=""!==u?JSON.parse(u):null}catch(n){u=d,c&&(c=!1,u={error:n,text:u})}}c?(e.next(new Ya({body:u,headers:r,status:i,statusText:o,url:s||void 0})),e.complete()):e.error(new ja({error:u,headers:r,status:i,statusText:o,url:s||void 0}))},c=function(n){var t=new ja({error:n,status:l.status||0,statusText:l.statusText||"Unknown Error"});e.error(t)},d=!1,h=function(t){d||(e.next(a()),d=!0);var r={type:Da.DownloadProgress,loaded:t.loaded};t.lengthComputable&&(r.total=t.total),"text"===n.responseType&&l.responseText&&(r.partialText=l.responseText),e.next(r)},p=function(n){var t={type:Da.UploadProgress,loaded:n.loaded};n.lengthComputable&&(t.total=n.total),e.next(t)};return l.addEventListener("load",u),l.addEventListener("error",c),n.reportProgress&&(l.addEventListener("progress",h),null!==o&&l.upload&&l.upload.addEventListener("progress",p)),l.send(o),e.next({type:Da.Sent}),function(){l.removeEventListener("error",c),l.removeEventListener("load",u),n.reportProgress&&(l.removeEventListener("progress",h),null!==o&&l.upload&&l.upload.removeEventListener("progress",p)),l.abort()}})},n}(),Ua=new l.r("XSRF_COOKIE_NAME"),Ga=new l.r("XSRF_HEADER_NAME"),qa=function(){},Ja=function(){function n(n,t,e){this.doc=n,this.platform=t,this.cookieName=e,this.lastCookieString="",this.lastToken=null,this.parseCount=0}return n.prototype.getToken=function(){if("server"===this.platform)return null;var n=this.doc.cookie||"";return n!==this.lastCookieString&&(this.parseCount++,this.lastToken=S(n,this.cookieName),this.lastCookieString=n),this.lastToken},n}(),Qa=function(){function n(n,t){this.tokenService=n,this.headerName=t}return n.prototype.intercept=function(n,t){var e=n.url.toLowerCase();if("GET"===n.method||"HEAD"===n.method||e.startsWith("http://")||e.startsWith("https://"))return t.handle(n);var l=this.tokenService.getToken();return null===l||n.headers.has(this.headerName)||(n=n.clone({headers:n.headers.set(this.headerName,l)})),t.handle(n)},n}();function Ka(n,t){return void 0===t&&(t=[]),t?t.reduceRight(function(n,t){return new Ha(n,t)},n):n}var Xa=function(){function n(){}return n.disable=function(){return{ngModule:n,providers:[{provide:Qa,useClass:Fa}]}},n.withOptions=function(t){return void 0===t&&(t={}),{ngModule:n,providers:[t.cookieName?{provide:Ua,useValue:t.cookieName}:[],t.headerName?{provide:Ga,useValue:t.headerName}:[]]}},n}(),Za=function(){};function $a(n){return Error('Unable to find icon with the name "'+n+'"')}function nu(n){return Error("The URL provided to MatIconRegistry was not trusted as a resource URL via Angular's DomSanitizer. Attempted URL was \""+n+'".')}var tu=function(n){this.url=n,this.svgElement=null},eu=function(){function n(n,t,e){this._httpClient=n,this._sanitizer=t,this._document=e,this._svgIconConfigs=new Map,this._iconSetConfigs=new Map,this._cachedIconsByUrl=new Map,this._inProgressUrlFetches=new Map,this._fontCssClassesByAlias=new Map,this._defaultFontSetClass="material-icons"}return n.prototype.addSvgIcon=function(n,t){return this.addSvgIconInNamespace("",n,t)},n.prototype.addSvgIconInNamespace=function(n,t,e){var l=iu(n,t);return this._svgIconConfigs.set(l,new tu(e)),this},n.prototype.addSvgIconSet=function(n){return this.addSvgIconSetInNamespace("",n)},n.prototype.addSvgIconSetInNamespace=function(n,t){var e=new tu(t),l=this._iconSetConfigs.get(n);return l?l.push(e):this._iconSetConfigs.set(n,[e]),this},n.prototype.registerFontClassAlias=function(n,t){return void 0===t&&(t=n),this._fontCssClassesByAlias.set(n,t),this},n.prototype.classNameForFontAlias=function(n){return this._fontCssClassesByAlias.get(n)||n},n.prototype.setDefaultFontSetClass=function(n){return this._defaultFontSetClass=n,this},n.prototype.getDefaultFontSetClass=function(){return this._defaultFontSetClass},n.prototype.getSvgIconFromUrl=function(n){var t=this,e=this._sanitizer.sanitize(l.K.RESOURCE_URL,n);if(!e)throw nu(n);var r=this._cachedIconsByUrl.get(e);return r?Object(Fe.a)(ru(r)):this._loadSvgIconFromConfig(new tu(n)).pipe(Ve(function(n){return t._cachedIconsByUrl.set(e,n)}),Object(Le.a)(function(n){return ru(n)}))},n.prototype.getNamedSvgIcon=function(n,t){void 0===t&&(t="");var e=iu(t,n),l=this._svgIconConfigs.get(e);if(l)return this._getSvgFromConfig(l);var r=this._iconSetConfigs.get(t);return r?this._getSvgFromIconSetConfigs(n,r):xe($a(e))},n.prototype._getSvgFromConfig=function(n){return n.svgElement?Object(Fe.a)(ru(n.svgElement)):this._loadSvgIconFromConfig(n).pipe(Ve(function(t){return n.svgElement=t}),Object(Le.a)(function(n){return ru(n)}))},n.prototype._getSvgFromIconSetConfigs=function(n,t){var e=this,r=this._extractIconWithNameFromAnySet(n,t);if(r)return Object(Fe.a)(r);var i=t.filter(function(n){return!n.svgElement}).map(function(n){return e._loadSvgIconSetFromConfig(n).pipe(Ce(function(t){var r=e._sanitizer.sanitize(l.K.RESOURCE_URL,n.url);return console.log("Loading icon set URL: "+r+" failed: "+t),Object(Fe.a)(null)}),Ve(function(t){t&&(n.svgElement=t)}))});return Ne(i).pipe(Object(Le.a)(function(){var l=e._extractIconWithNameFromAnySet(n,t);if(!l)throw $a(n);return l}))},n.prototype._extractIconWithNameFromAnySet=function(n,t){for(var e=t.length-1;e>=0;e--){var l=t[e];if(l.svgElement){var r=this._extractSvgIconFromSet(l.svgElement,n);if(r)return r}}return null},n.prototype._loadSvgIconFromConfig=function(n){var t=this;return this._fetchUrl(n.url).pipe(Object(Le.a)(function(n){return t._createSvgElementForSingleIcon(n)}))},n.prototype._loadSvgIconSetFromConfig=function(n){var t=this;return this._fetchUrl(n.url).pipe(Object(Le.a)(function(n){return t._svgElementFromString(n)}))},n.prototype._createSvgElementForSingleIcon=function(n){var t=this._svgElementFromString(n);return this._setSvgAttributes(t),t},n.prototype._extractSvgIconFromSet=function(n,t){var e=n.querySelector("#"+t);if(!e)return null;var l=e.cloneNode(!0);if(l.id="","svg"===l.nodeName.toLowerCase())return this._setSvgAttributes(l);if("symbol"===l.nodeName.toLowerCase())return this._setSvgAttributes(this._toSvgElement(l));var r=this._svgElementFromString("");return r.appendChild(l),this._setSvgAttributes(r)},n.prototype._svgElementFromString=function(n){if(this._document||"undefined"!=typeof document){var t=(this._document||document).createElement("DIV");t.innerHTML=n;var e=t.querySelector("svg");if(!e)throw Error(" tag not found");return e}throw new Error("MatIconRegistry could not resolve document.")},n.prototype._toSvgElement=function(n){for(var t=this._svgElementFromString(""),e=0;e-1)throw Error('Input type "'+this._type+"\" isn't supported by matInput.")},t.prototype._isNeverEmpty=function(){return this._neverEmptyInputTypes.indexOf(this._type)>-1},t.prototype._isBadInput=function(){var n=this._elementRef.nativeElement.validity;return n&&n.badInput},t.prototype._isTextarea=function(){var n=this._elementRef.nativeElement,t=this._platform.isBrowser?n.nodeName:n.name;return!!t&&"textarea"===t.toLowerCase()},Object.defineProperty(t.prototype,"empty",{get:function(){return!this._isNeverEmpty()&&!this._elementRef.nativeElement.value&&!this._isBadInput()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"shouldLabelFloat",{get:function(){return this.focused||!this.empty},enumerable:!0,configurable:!0}),t.prototype.setDescribedByIds=function(n){this._ariaDescribedby=n.join(" ")},t.prototype.onContainerClick=function(){this.focus()},t}(Ql(function(n,t,e,l){this._defaultErrorStateMatcher=n,this._parentForm=t,this._parentFormGroup=e,this.ngControl=l})),fu=function(){},_u=function(){},mu=function(){},gu=function(){},yu=function(){},bu=function(n){function t(t){var e=n.call(this)||this;return e._elementRef=t,e._hovered=new yl.a,e._highlighted=!1,e._triggersSubmenu=!1,e}return Object(i.__extends)(t,n),t.prototype.focus=function(){this._getHostElement().focus()},t.prototype.ngOnDestroy=function(){this._hovered.complete()},t.prototype._getTabIndex=function(){return this.disabled?"-1":"0"},t.prototype._getHostElement=function(){return this._elementRef.nativeElement},t.prototype._checkDisabled=function(n){this.disabled&&(n.preventDefault(),n.stopPropagation())},t.prototype._emitHoverEvent=function(){this.disabled||this._hovered.next(this)},t.prototype.getLabel=function(){var n=this._elementRef.nativeElement,t="";if(n.childNodes)for(var e=n.childNodes.length,l=0;l')}(),this._xPosition=n,this.setPositionClasses()},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"yPosition",{get:function(){return this._yPosition},set:function(n){"above"!==n&&"below"!==n&&function(){throw Error('y-position value must be either \'above\' or below\'.\n Example: ')}(),this._yPosition=n,this.setPositionClasses()},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"overlapTrigger",{get:function(){return this._overlapTrigger},set:function(n){this._overlapTrigger=El(n)},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"panelClass",{set:function(n){n&&n.length&&(this._classList=n.split(" ").reduce(function(n,t){return n[t]=!0,n},{}),this._elementRef.nativeElement.className="",this.setPositionClasses())},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"classList",{get:function(){return this.panelClass},set:function(n){this.panelClass=n},enumerable:!0,configurable:!0}),n.prototype.ngAfterContentInit=function(){var n=this;this._keyManager=new Er(this.items).withWrap().withTypeAhead(),this._tabSubscription=this._keyManager.tabOut.subscribe(function(){return n.close.emit("keydown")})},n.prototype.ngOnDestroy=function(){this._tabSubscription.unsubscribe(),this.closed.complete()},n.prototype._hovered=function(){var n=this;return this.items?this.items.changes.pipe(Ss(this.items),Object(Ri.a)(function(n){return Jr.a.apply(void 0,n.map(function(n){return n._hovered}))})):this._ngZone.onStable.asObservable().pipe(Object(_r.a)(1),Object(Ri.a)(function(){return n._hovered()}))},n.prototype._handleKeydown=function(n){switch(n.keyCode){case 27:this.closed.emit("keydown"),n.stopPropagation();break;case 37:this.parentMenu&&"ltr"===this.direction&&this.closed.emit("keydown");break;case 39:this.parentMenu&&"rtl"===this.direction&&this.closed.emit("keydown");break;default:this._keyManager.onKeydown(n)}},n.prototype.focusFirstItem=function(){this._keyManager.setFirstItemActive()},n.prototype.resetActiveItem=function(){this._keyManager.setActiveItem(-1)},n.prototype.setPositionClasses=function(n,t){void 0===n&&(n=this.xPosition),void 0===t&&(t=this.yPosition),this._classList["mat-menu-before"]="before"===n,this._classList["mat-menu-after"]="after"===n,this._classList["mat-menu-above"]="above"===t,this._classList["mat-menu-below"]="below"===t},n.prototype.setElevation=function(n){var t="mat-elevation-z"+(2+n),e=Object.keys(this._classList).find(function(n){return n.startsWith("mat-elevation-z")});e&&e!==this._previousElevation||(this._previousElevation&&(this._classList[this._previousElevation]=!1),this._classList[t]=!0,this._previousElevation=t)},n.prototype._startAnimation=function(){this._panelAnimationState="enter-start"},n.prototype._resetAnimation=function(){this._panelAnimationState="void"},n.prototype._onAnimationDone=function(n){"enter-start"===n.toState&&(this._panelAnimationState="enter")},n}(),xu=new l.r("mat-menu-scroll-strategy");function Mu(n){return function(){return n.scrollStrategies.reposition()}}var ku=function(){function n(n,t,e,r,i,o,s){this._overlay=n,this._element=t,this._viewContainerRef=e,this._scrollStrategy=r,this._parentMenu=i,this._menuItemInstance=o,this._dir=s,this._overlayRef=null,this._menuOpen=!1,this._closeSubscription=rl.a.EMPTY,this._positionSubscription=rl.a.EMPTY,this._hoverSubscription=rl.a.EMPTY,this._openedByMouse=!1,this.menuOpened=new l.o,this.onMenuOpen=this.menuOpened,this.menuClosed=new l.o,this.onMenuClose=this.menuClosed,o&&(o._triggersSubmenu=this.triggersSubmenu())}return Object.defineProperty(n.prototype,"_deprecatedMatMenuTriggerFor",{get:function(){return this.menu},set:function(n){this.menu=n},enumerable:!0,configurable:!0}),n.prototype.ngAfterContentInit=function(){var n=this;this._checkMenu(),this.menu.close.subscribe(function(t){n._destroyMenu(),"click"===t&&n._parentMenu&&n._parentMenu.closed.emit(t)}),this.triggersSubmenu()&&(this._hoverSubscription=this._parentMenu._hovered().pipe(Ge(function(t){return t===n._menuItemInstance})).subscribe(function(){n._openedByMouse=!0,n.openMenu()}))},n.prototype.ngOnDestroy=function(){this._overlayRef&&(this._overlayRef.dispose(),this._overlayRef=null),this._cleanUpSubscriptions()},Object.defineProperty(n.prototype,"menuOpen",{get:function(){return this._menuOpen},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"dir",{get:function(){return this._dir&&"rtl"===this._dir.value?"rtl":"ltr"},enumerable:!0,configurable:!0}),n.prototype.triggersSubmenu=function(){return!(!this._menuItemInstance||!this._parentMenu)},n.prototype.toggleMenu=function(){return this._menuOpen?this.closeMenu():this.openMenu()},n.prototype.openMenu=function(){var n=this;this._menuOpen||(this._createOverlay().attach(this._portal),this._closeSubscription=this._menuClosingActions().subscribe(function(){return n.closeMenu()}),this._initMenu(),this.menu instanceof wu&&this.menu._startAnimation())},n.prototype.closeMenu=function(){this.menu.close.emit()},n.prototype.focus=function(){this._element.nativeElement.focus()},n.prototype._destroyMenu=function(){this._overlayRef&&this.menuOpen&&(this._resetMenu(),this._closeSubscription.unsubscribe(),this._overlayRef.detach(),this.menu instanceof wu&&this.menu._resetAnimation())},n.prototype._initMenu=function(){if(this.menu.parentMenu=this.triggersSubmenu()?this._parentMenu:void 0,this.menu.direction=this.dir,this._setMenuElevation(),this._setIsMenuOpen(!0),this._openedByMouse){var n=this._overlayRef.overlayElement.firstElementChild;n&&(this.menu.resetActiveItem(),n.focus())}else this.menu.focusFirstItem()},n.prototype._setMenuElevation=function(){if(this.menu.setElevation){for(var n=0,t=this.menu.parentMenu;t;)n++,t=t.parentMenu;this.menu.setElevation(n)}},n.prototype._resetMenu=function(){this._setIsMenuOpen(!1),this._openedByMouse&&this.triggersSubmenu()||this.focus(),this._openedByMouse=!1},n.prototype._setIsMenuOpen=function(n){this._menuOpen=n,this._menuOpen?this.menuOpened.emit():this.menuClosed.emit(),this.triggersSubmenu()&&(this._menuItemInstance._highlighted=n)},n.prototype._checkMenu=function(){this.menu||function(){throw Error('mat-menu-trigger: must pass in an mat-menu instance.\n\n Example:\n \n ')}()},n.prototype._createOverlay=function(){if(!this._overlayRef){this._portal=new li(this.menu.templateRef,this._viewContainerRef);var n=this._getOverlayConfig();this._subscribeToPositions(n.positionStrategy),this._overlayRef=this._overlay.create(n)}return this._overlayRef},n.prototype._getOverlayConfig=function(){return new ci({positionStrategy:this._getPosition(),hasBackdrop:!this.triggersSubmenu(),backdropClass:"cdk-overlay-transparent-backdrop",direction:this.dir,scrollStrategy:this._scrollStrategy()})},n.prototype._subscribeToPositions=function(n){var t=this;this._positionSubscription=n.onPositionChange.subscribe(function(n){t.menu.setPositionClasses("start"===n.connectionPair.overlayX?"after":"before","top"===n.connectionPair.overlayY?"below":"above")})},n.prototype._getPosition=function(){var n="before"===this.menu.xPosition?["end","start"]:["start","end"],t=n[0],e=n[1],l="above"===this.menu.yPosition?["bottom","top"]:["top","bottom"],r=l[0],i=l[1],o=[r,i],s=o[0],a=o[1],u=[t,e],c=u[0],d=u[1],h=0;return this.triggersSubmenu()?(d=t="before"===this.menu.xPosition?"start":"end",e=c="end"===t?"start":"end",h="bottom"===r?8:-8):this.menu.overlapTrigger||(s="top"===r?"bottom":"top",a="top"===i?"bottom":"top"),this._overlay.position().connectedTo(this._element,{originX:t,originY:s},{overlayX:c,overlayY:r}).withDirection(this.dir).withOffsetY(h).withFallbackPosition({originX:e,originY:s},{overlayX:d,overlayY:r}).withFallbackPosition({originX:t,originY:a},{overlayX:c,overlayY:i},void 0,-h).withFallbackPosition({originX:e,originY:a},{overlayX:d,overlayY:i},void 0,-h)},n.prototype._cleanUpSubscriptions=function(){this._closeSubscription.unsubscribe(),this._positionSubscription.unsubscribe(),this._hoverSubscription.unsubscribe()},n.prototype._menuClosingActions=function(){var n=this,t=this._overlayRef.backdropClick(),e=this._overlayRef.detachments(),l=this._parentMenu?this._parentMenu.close:Object(Fe.a)(),r=this._parentMenu?this._parentMenu._hovered().pipe(Ge(function(t){return t!==n._menuItemInstance}),Ge(function(){return n._menuOpen})):Object(Fe.a)();return Object(Jr.a)(t,l,r,e)},n.prototype._handleMousedown=function(n){(function(n){return 0===n.buttons})(n)||(this._openedByMouse=!0,this.triggersSubmenu()&&n.preventDefault())},n.prototype._handleKeydown=function(n){var t=n.keyCode;this.triggersSubmenu()&&(39===t&&"ltr"===this.dir||37===t&&"rtl"===this.dir)&&this.openMenu()},n.prototype._handleClick=function(n){this.triggersSubmenu()?(n.stopPropagation(),this.openMenu()):this.toggleMenu()},n}(),Cu=function(){},Su=0,Ou=new l.r("mat-select-scroll-strategy");function Tu(n){return function(){return n.scrollStrategies.reposition()}}var Lu=function(){},Pu=function(n){function t(t,e,r,i,o,s,a,u,c,d,h,p){var f=n.call(this,o,i,a,u,d)||this;return f._viewportRuler=t,f._changeDetectorRef=e,f._ngZone=r,f._dir=s,f._parentFormField=c,f.ngControl=d,f._scrollStrategyFactory=p,f._panelOpen=!1,f._required=!1,f._scrollTop=0,f._multiple=!1,f._compareWith=function(n,t){return n===t},f._uid="mat-select-"+Su++,f._destroy=new yl.a,f._triggerFontSize=0,f._onChange=function(){},f._onTouched=function(){},f._optionIds="",f._transformOrigin="top",f._panelDoneAnimating=!1,f._scrollStrategy=f._scrollStrategyFactory(),f._offsetY=0,f._positions=[{originX:"start",originY:"top",overlayX:"start",overlayY:"top"},{originX:"start",originY:"bottom",overlayX:"start",overlayY:"bottom"}],f.focused=!1,f.controlType="mat-select",f.ariaLabel="",f.optionSelectionChanges=ia(function(){return f.options?Jr.a.apply(void 0,f.options.map(function(n){return n.onSelectionChange})):f._ngZone.onStable.asObservable().pipe(Object(_r.a)(1),Object(Ri.a)(function(){return f.optionSelectionChanges}))}),f.openedChange=new l.o,f.onOpen=f._openedStream,f.onClose=f._closedStream,f.selectionChange=new l.o,f.change=f.selectionChange,f.valueChange=new l.o,f.ngControl&&(f.ngControl.valueAccessor=f),f.tabIndex=parseInt(h)||0,f.id=f.id,f}return Object(i.__extends)(t,n),Object.defineProperty(t.prototype,"placeholder",{get:function(){return this._placeholder},set:function(n){this._placeholder=n,this.stateChanges.next()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"required",{get:function(){return this._required},set:function(n){this._required=El(n),this.stateChanges.next()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"multiple",{get:function(){return this._multiple},set:function(n){if(this._selectionModel)throw Error("Cannot change `multiple` mode of select after initialization.");this._multiple=El(n)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"compareWith",{get:function(){return this._compareWith},set:function(n){if("function"!=typeof n)throw Error("`compareWith` must be a function.");this._compareWith=n,this._selectionModel&&this._initializeSelection()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"value",{get:function(){return this._value},set:function(n){n!==this._value&&(this.writeValue(n),this._value=n)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"id",{get:function(){return this._id},set:function(n){this._id=n||this._uid,this.stateChanges.next()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_openedStream",{get:function(){return this.openedChange.pipe(Ge(function(n){return n}),Object(Le.a)(function(){}))},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_closedStream",{get:function(){return this.openedChange.pipe(Ge(function(n){return!n}),Object(Le.a)(function(){}))},enumerable:!0,configurable:!0}),t.prototype.ngOnInit=function(){this._selectionModel=new zs(this.multiple,void 0,!1),this.stateChanges.next()},t.prototype.ngAfterContentInit=function(){var n=this;this._initKeyManager(),this.options.changes.pipe(Ss(null),au(this._destroy)).subscribe(function(){n._resetOptions(),n._initializeSelection()})},t.prototype.ngDoCheck=function(){this.ngControl&&this.updateErrorState()},t.prototype.ngOnChanges=function(n){n.disabled&&this.stateChanges.next()},t.prototype.ngOnDestroy=function(){this._destroy.next(),this._destroy.complete(),this.stateChanges.complete()},t.prototype.toggle=function(){this.panelOpen?this.close():this.open()},t.prototype.open=function(){var n=this;!this.disabled&&this.options&&this.options.length&&(this._triggerRect=this.trigger.nativeElement.getBoundingClientRect(),this._triggerFontSize=parseInt(getComputedStyle(this.trigger.nativeElement)["font-size"]),this._panelOpen=!0,this._calculateOverlayPosition(),this._highlightCorrectOption(),this._changeDetectorRef.markForCheck(),this._ngZone.onStable.asObservable().pipe(Object(_r.a)(1)).subscribe(function(){n._triggerFontSize&&n.overlayDir.overlayRef&&n.overlayDir.overlayRef.overlayElement&&(n.overlayDir.overlayRef.overlayElement.style.fontSize=n._triggerFontSize+"px")}))},t.prototype.close=function(){this._panelOpen&&(this._panelOpen=!1,this._changeDetectorRef.markForCheck(),this._onTouched(),this.focus())},t.prototype.writeValue=function(n){this.options&&this._setSelectionByValue(n)},t.prototype.registerOnChange=function(n){this._onChange=n},t.prototype.registerOnTouched=function(n){this._onTouched=n},t.prototype.setDisabledState=function(n){this.disabled=n,this._changeDetectorRef.markForCheck(),this.stateChanges.next()},Object.defineProperty(t.prototype,"panelOpen",{get:function(){return this._panelOpen},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"selected",{get:function(){return this.multiple?this._selectionModel.selected:this._selectionModel.selected[0]},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"triggerValue",{get:function(){if(this.empty)return"";if(this._multiple){var n=this._selectionModel.selected.map(function(n){return n.viewValue});return this._isRtl()&&n.reverse(),n.join(", ")}return this._selectionModel.selected[0].viewValue},enumerable:!0,configurable:!0}),t.prototype._isRtl=function(){return!!this._dir&&"rtl"===this._dir.value},t.prototype._handleKeydown=function(n){this.disabled||(this.panelOpen?this._handleOpenKeydown(n):this._handleClosedKeydown(n))},t.prototype._handleClosedKeydown=function(n){var t=n.keyCode;13===t||32===t||(this.multiple||n.altKey)&&(40===t||38===t)?(n.preventDefault(),this.open()):this.multiple||this._keyManager.onKeydown(n)},t.prototype._handleOpenKeydown=function(n){var t=n.keyCode;if(36===t||35===t)n.preventDefault(),36===t?this._keyManager.setFirstItemActive():this._keyManager.setLastItemActive();else if(13!==t&&32!==t||!this._keyManager.activeItem){var e=40===t||38===t,l=this._keyManager.activeItemIndex;this._keyManager.onKeydown(n),this._multiple&&e&&n.shiftKey&&this._keyManager.activeItem&&this._keyManager.activeItemIndex!==l&&this._keyManager.activeItem._selectViaInteraction()}else n.preventDefault(),this._keyManager.activeItem._selectViaInteraction()},t.prototype._onPanelDone=function(){this.panelOpen?(this._scrollTop=0,this.openedChange.emit(!0)):(this.openedChange.emit(!1),this._panelDoneAnimating=!1,this.overlayDir.offsetX=0,this._changeDetectorRef.markForCheck())},t.prototype._onFadeInDone=function(){this._panelDoneAnimating=this.panelOpen,this._changeDetectorRef.markForCheck()},t.prototype._onFocus=function(){this.disabled||(this.focused=!0,this.stateChanges.next())},t.prototype._onBlur=function(){this.disabled||this.panelOpen||(this.focused=!1,this._onTouched(),this._changeDetectorRef.markForCheck(),this.stateChanges.next())},t.prototype._onAttached=function(){var n=this;this.overlayDir.positionChange.pipe(Object(_r.a)(1)).subscribe(function(){n._changeDetectorRef.detectChanges(),n._calculateOverlayOffsetX(),n.panel.nativeElement.scrollTop=n._scrollTop})},t.prototype._getPanelTheme=function(){return this._parentFormField?"mat-"+this._parentFormField.color:""},Object.defineProperty(t.prototype,"empty",{get:function(){return!this._selectionModel||this._selectionModel.isEmpty()},enumerable:!0,configurable:!0}),t.prototype._initializeSelection=function(){var n=this;Promise.resolve().then(function(){n._setSelectionByValue(n.ngControl?n.ngControl.value:n._value)})},t.prototype._setSelectionByValue=function(n,t){var e=this;if(void 0===t&&(t=!1),this.multiple&&n){if(!Array.isArray(n))throw Error("Value must be an array in multiple-selection mode.");this._clearSelection(),n.forEach(function(n){return e._selectValue(n,t)}),this._sortValues()}else{this._clearSelection();var l=this._selectValue(n,t);l&&this._keyManager.setActiveItem(this.options.toArray().indexOf(l))}this._changeDetectorRef.markForCheck()},t.prototype._selectValue=function(n,t){var e=this;void 0===t&&(t=!1);var r=this.options.find(function(t){try{return null!=t.value&&e._compareWith(t.value,n)}catch(n){return Object(l.Y)()&&console.warn(n),!1}});return r&&(t?r._selectViaInteraction():r.select(),this._selectionModel.select(r),this.stateChanges.next()),r},t.prototype._clearSelection=function(n){this._selectionModel.clear(),this.options.forEach(function(t){t!==n&&t.deselect()}),this.stateChanges.next()},t.prototype._initKeyManager=function(){var n=this;this._keyManager=new Sr(this.options).withTypeAhead(),this._keyManager.tabOut.pipe(au(this._destroy)).subscribe(function(){return n.close()}),this._keyManager.change.pipe(au(this._destroy)).subscribe(function(){n._panelOpen&&n.panel?n._scrollActiveOptionIntoView():n._panelOpen||n.multiple||!n._keyManager.activeItem||n._keyManager.activeItem._selectViaInteraction()})},t.prototype._resetOptions=function(){var n=this;this.optionSelectionChanges.pipe(au(Object(Jr.a)(this._destroy,this.options.changes)),Ge(function(n){return n.isUserInput})).subscribe(function(t){n._onSelect(t.source),n.multiple||n.close()}),this._setOptionIds()},t.prototype._onSelect=function(n){var t=this._selectionModel.isSelected(n);this.multiple?(this._selectionModel.toggle(n),this.stateChanges.next(),t?n.deselect():n.select(),this._keyManager.setActiveItem(this._getOptionIndex(n)),this._sortValues()):(this._clearSelection(null==n.value?void 0:n),null==n.value?this._propagateChanges(n.value):(this._selectionModel.select(n),this.stateChanges.next())),t!==this._selectionModel.isSelected(n)&&this._propagateChanges()},t.prototype._sortValues=function(){var n=this;this._multiple&&(this._selectionModel.clear(),this.options.forEach(function(t){t.selected&&n._selectionModel.select(t)}),this.stateChanges.next())},t.prototype._propagateChanges=function(n){var t;t=this.multiple?this.selected.map(function(n){return n.value}):this.selected?this.selected.value:n,this._value=t,this.valueChange.emit(t),this._onChange(t),this.selectionChange.emit(new function(n,t){this.source=n,this.value=t}(this,t)),this._changeDetectorRef.markForCheck()},t.prototype._setOptionIds=function(){this._optionIds=this.options.map(function(n){return n.id}).join(" ")},t.prototype._highlightCorrectOption=function(){this._keyManager&&(this.empty?this._keyManager.setFirstItemActive():this._keyManager.setActiveItem(this._getOptionIndex(this._selectionModel.selected[0])))},t.prototype._scrollActiveOptionIntoView=function(){var n=this._getItemHeight(),t=this._keyManager.activeItemIndex||0,e=(t+pr.countGroupLabelsBeforeOption(t,this.options,this.optionGroups))*n,l=this.panel.nativeElement.scrollTop;el+256&&(this.panel.nativeElement.scrollTop=Math.max(0,e-256+n))},t.prototype.focus=function(){this._elementRef.nativeElement.focus()},t.prototype._getOptionIndex=function(n){return this.options.reduce(function(t,e,l){return void 0===t?n===e?l:void 0:t},void 0)},t.prototype._calculateOverlayPosition=function(){var n=this._getItemHeight(),t=this._getItemCount(),e=Math.min(t*n,256),l=t*n-e,r=this.empty?0:this._getOptionIndex(this._selectionModel.selected[0]);r+=pr.countGroupLabelsBeforeOption(r,this.options,this.optionGroups);var i=e/2;this._scrollTop=this._calculateOverlayScroll(r,i,l),this._offsetY=this._calculateOverlayOffsetY(r,i,l),this._checkOverlayWithinViewport(l)},t.prototype._calculateOverlayScroll=function(n,t,e){var l=this._getItemHeight();return Math.min(Math.max(0,l*n-t+l/2),e)},Object.defineProperty(t.prototype,"_ariaLabel",{get:function(){return this.ariaLabelledby?null:this.ariaLabel||this.placeholder},enumerable:!0,configurable:!0}),t.prototype._getAriaActiveDescendant=function(){return this.panelOpen&&this._keyManager&&this._keyManager.activeItem?this._keyManager.activeItem.id:null},t.prototype._calculateOverlayOffsetX=function(){var n,t=this.overlayDir.overlayRef.overlayElement.getBoundingClientRect(),e=this._viewportRuler.getViewportSize(),l=this._isRtl(),r=this.multiple?60:32;if(this.multiple)n=44;else{var i=this._selectionModel.selected[0]||this.options.first;n=i&&i.group?32:16}l||(n*=-1);var o=0-(t.left+n-(l?r:0)),s=t.right+n-e.width+(l?0:r);o>0?n+=o+8:s>0&&(n-=s+8),this.overlayDir.offsetX=n,this.overlayDir.overlayRef.updatePosition()},t.prototype._calculateOverlayOffsetY=function(n,t,e){var l=this._getItemHeight(),r=(l-this._triggerRect.height)/2,i=Math.floor(256/l);return-1*(0===this._scrollTop?n*l:this._scrollTop===e?(n-(this._getItemCount()-i))*l+(l-(this._getItemCount()*l-256)%l):t-l/2)-r},t.prototype._checkOverlayWithinViewport=function(n){var t=this._getItemHeight(),e=this._viewportRuler.getViewportSize(),l=this._triggerRect.top-8,r=e.height-this._triggerRect.bottom-8,i=Math.abs(this._offsetY),o=Math.min(this._getItemCount()*t,256)-i-this._triggerRect.height;o>r?this._adjustPanelUp(o,r):i>l?this._adjustPanelDown(i,l,n):this._transformOrigin=this._getOriginBasedOnOption()},t.prototype._adjustPanelUp=function(n,t){var e=Math.round(n-t);this._scrollTop-=e,this._offsetY-=e,this._transformOrigin=this._getOriginBasedOnOption(),this._scrollTop<=0&&(this._scrollTop=0,this._offsetY=0,this._transformOrigin="50% bottom 0px")},t.prototype._adjustPanelDown=function(n,t,e){var l=Math.round(n-t);if(this._scrollTop+=l,this._offsetY+=l,this._transformOrigin=this._getOriginBasedOnOption(),this._scrollTop>=e)return this._scrollTop=e,this._offsetY=0,void(this._transformOrigin="50% top 0px")},t.prototype._getOriginBasedOnOption=function(){var n=this._getItemHeight(),t=(n-this._triggerRect.height)/2;return"50% "+(Math.abs(this._offsetY)-t+n/2)+"px 0px"},t.prototype._getItemCount=function(){return this.options.length+this.optionGroups.length},t.prototype._getItemHeight=function(){return 3*this._triggerFontSize},t.prototype.setDescribedByIds=function(n){this._ariaDescribedby=n.join(" ")},t.prototype.onContainerClick=function(){this.focus(),this.open()},Object.defineProperty(t.prototype,"shouldLabelFloat",{get:function(){return this._panelOpen||!this.empty},enumerable:!0,configurable:!0}),t}(ql(Jl(Ul(Ql(function(n,t,e,l,r){this._elementRef=n,this._defaultErrorStateMatcher=t,this._parentForm=e,this._parentFormGroup=l,this.ngControl=r}))))),Du=function(){},Au=20;function Eu(n){return Error('Tooltip position "'+n+'" is invalid.')}var Yu=new l.r("mat-tooltip-scroll-strategy");function ju(n){return function(){return n.scrollStrategies.reposition({scrollThrottle:Au})}}var Iu=function(){function n(n,t,e,l,r,i,o,s,a,u){var c=this;this._overlay=n,this._elementRef=t,this._scrollDispatcher=e,this._viewContainerRef=l,this._ngZone=r,this._platform=i,this._ariaDescriber=o,this._focusMonitor=s,this._scrollStrategy=a,this._dir=u,this._position="below",this._disabled=!1,this.showDelay=0,this.hideDelay=0,this._message="",this._manualListeners=new Map;var d=t.nativeElement;i.IOS?"INPUT"!==d.nodeName&&"TEXTAREA"!==d.nodeName||(d.style.webkitUserSelect=d.style.userSelect=""):(this._manualListeners.set("mouseenter",function(){return c.show()}),this._manualListeners.set("mouseleave",function(){return c.hide()}),this._manualListeners.forEach(function(n,e){return t.nativeElement.addEventListener(e,n)})),s.monitor(d,!1).subscribe(function(n){n?"program"!==n&&r.run(function(){return c.show()}):r.run(function(){return c.hide(0)})})}return Object.defineProperty(n.prototype,"position",{get:function(){return this._position},set:function(n){n!==this._position&&(this._position=n,this._tooltipInstance&&this._disposeTooltip())},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"disabled",{get:function(){return this._disabled},set:function(n){this._disabled=El(n),this._disabled&&this.hide(0)},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"_positionDeprecated",{get:function(){return this._position},set:function(n){this._position=n},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"message",{get:function(){return this._message},set:function(n){this._ariaDescriber.removeDescription(this._elementRef.nativeElement,this._message),this._message=null!=n?(""+n).trim():"",!this._message&&this._isTooltipVisible()?this.hide(0):(this._updateTooltipMessage(),this._ariaDescriber.describe(this._elementRef.nativeElement,this.message))},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"tooltipClass",{get:function(){return this._tooltipClass},set:function(n){this._tooltipClass=n,this._tooltipInstance&&this._setTooltipClass(this._tooltipClass)},enumerable:!0,configurable:!0}),n.prototype.ngOnDestroy=function(){var n=this;this._tooltipInstance&&this._disposeTooltip(),this._platform.IOS||(this._manualListeners.forEach(function(t,e){n._elementRef.nativeElement.removeEventListener(e,t)}),this._manualListeners.clear()),this._ariaDescriber.removeDescription(this._elementRef.nativeElement,this.message),this._focusMonitor.stopMonitoring(this._elementRef.nativeElement)},n.prototype.show=function(n){void 0===n&&(n=this.showDelay),!this.disabled&&this.message&&(this._tooltipInstance||this._createTooltip(),this._setTooltipClass(this._tooltipClass),this._updateTooltipMessage(),this._tooltipInstance.show(this._position,n))},n.prototype.hide=function(n){void 0===n&&(n=this.hideDelay),this._tooltipInstance&&this._tooltipInstance.hide(n)},n.prototype.toggle=function(){this._isTooltipVisible()?this.hide():this.show()},n.prototype._isTooltipVisible=function(){return!!this._tooltipInstance&&this._tooltipInstance.isVisible()},n.prototype._handleKeydown=function(n){this._isTooltipVisible()&&27===n.keyCode&&(n.stopPropagation(),this.hide(0))},n.prototype._createTooltip=function(){var n=this,t=this._createOverlay(),e=new ei(Ru,this._viewContainerRef);this._tooltipInstance=t.attach(e).instance,Object(Jr.a)(this._tooltipInstance.afterHidden(),t.detachments()).subscribe(function(){n._tooltipInstance&&n._disposeTooltip()})},n.prototype._createOverlay=function(){var n=this,t=this._getOrigin(),e=this._getOverlayPosition(),l=this._overlay.position().connectedTo(this._elementRef,t.main,e.main).withFallbackPosition(t.fallback,e.fallback),r=this._scrollDispatcher.getAncestorScrollContainers(this._elementRef);l.withScrollableContainers(r),l.onPositionChange.subscribe(function(t){n._tooltipInstance&&(t.scrollableViewProperties.isOverlayClipped&&n._tooltipInstance.isVisible()?n._ngZone.run(function(){return n.hide(0)}):n._tooltipInstance._setTransformOrigin(t.connectionPair))});var i=new ci({direction:this._dir?this._dir.value:"ltr",positionStrategy:l,panelClass:"mat-tooltip-panel",scrollStrategy:this._scrollStrategy()});return this._overlayRef=this._overlay.create(i),this._overlayRef},n.prototype._disposeTooltip=function(){this._overlayRef&&(this._overlayRef.dispose(),this._overlayRef=null),this._tooltipInstance=null},n.prototype._getOrigin=function(){var n,t=!this._dir||"ltr"==this._dir.value;if("above"==this.position||"below"==this.position)n={originX:"center",originY:"above"==this.position?"top":"bottom"};else if("left"==this.position||"before"==this.position&&t||"after"==this.position&&!t)n={originX:"start",originY:"center"};else{if(!("right"==this.position||"after"==this.position&&t||"before"==this.position&&!t))throw Eu(this.position);n={originX:"end",originY:"center"}}var e=this._invertPosition(n.originX,n.originY);return{main:n,fallback:{originX:e.x,originY:e.y}}},n.prototype._getOverlayPosition=function(){var n,t=!this._dir||"ltr"==this._dir.value;if("above"==this.position)n={overlayX:"center",overlayY:"bottom"};else if("below"==this.position)n={overlayX:"center",overlayY:"top"};else if("left"==this.position||"before"==this.position&&t||"after"==this.position&&!t)n={overlayX:"end",overlayY:"center"};else{if(!("right"==this.position||"after"==this.position&&t||"before"==this.position&&!t))throw Eu(this.position);n={overlayX:"start",overlayY:"center"}}var e=this._invertPosition(n.overlayX,n.overlayY);return{main:n,fallback:{overlayX:e.x,overlayY:e.y}}},n.prototype._updateTooltipMessage=function(){var n=this;this._tooltipInstance&&(this._tooltipInstance.message=this.message,this._tooltipInstance._markForCheck(),this._ngZone.onMicrotaskEmpty.asObservable().pipe(Object(_r.a)(1)).subscribe(function(){n._tooltipInstance&&n._overlayRef.updatePosition()}))},n.prototype._setTooltipClass=function(n){this._tooltipInstance&&(this._tooltipInstance.tooltipClass=n,this._tooltipInstance._markForCheck())},n.prototype._invertPosition=function(n,t){return"above"===this.position||"below"===this.position?"top"===t?t="bottom":"bottom"===t&&(t="top"):"end"===n?n="start":"start"===n&&(n="end"),{x:n,y:t}},n}(),Ru=function(){function n(n){this._changeDetectorRef=n,this._visibility="initial",this._closeOnInteraction=!1,this._transformOrigin="bottom",this._onHide=new yl.a}return n.prototype.show=function(n,t){var e=this;this._hideTimeoutId&&clearTimeout(this._hideTimeoutId),this._closeOnInteraction=!0,this._position=n,this._showTimeoutId=setTimeout(function(){e._visibility="visible",e._markForCheck()},t)},n.prototype.hide=function(n){var t=this;this._showTimeoutId&&clearTimeout(this._showTimeoutId),this._hideTimeoutId=setTimeout(function(){t._visibility="hidden",t._markForCheck()},n)},n.prototype.afterHidden=function(){return this._onHide.asObservable()},n.prototype.isVisible=function(){return"visible"===this._visibility},n.prototype._setTransformOrigin=function(n){var t="X"==("above"===this._position||"below"===this._position?"Y":"X")?n.overlayX:n.overlayY;if("top"===t||"bottom"===t)this._transformOrigin=t;else if("start"===t)this._transformOrigin="left";else{if("end"!==t)throw Eu(this._position);this._transformOrigin="right"}},n.prototype._animationStart=function(){this._closeOnInteraction=!1},n.prototype._animationDone=function(n){var t=this,e=n.toState;"hidden"!==e||this.isVisible()||this._onHide.next(),"visible"!==e&&"hidden"!==e||Promise.resolve().then(function(){return t._closeOnInteraction=!0})},n.prototype._handleBodyInteraction=function(){this._closeOnInteraction&&this.hide(0)},n.prototype._markForCheck=function(){this._changeDetectorRef.markForCheck()},n}(),Hu=function(){},Nu=function(){function n(){this.color="primary",this._value=0,this._bufferValue=0,this.mode="determinate"}return Object.defineProperty(n.prototype,"value",{get:function(){return this._value},set:function(n){this._value=Fu(n||0)},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"bufferValue",{get:function(){return this._bufferValue},set:function(n){this._bufferValue=Fu(n||0)},enumerable:!0,configurable:!0}),n.prototype._primaryTransform=function(){return{transform:"scaleX("+this.value/100+")"}},n.prototype._bufferTransform=function(){if("buffer"==this.mode)return{transform:"scaleX("+this.bufferValue/100+")"}},n}();function Fu(n,t,e){return void 0===t&&(t=0),void 0===e&&(e=100),Math.max(t,Math.min(e,n))}var Bu=function(){},Vu=100,Wu=function(n){function t(t,e,l){var r=n.call(this,t,e,l)||this;return r.mode="indeterminate",r}return Object(i.__extends)(t,n),t}(function(n){function t(t,e,l){var r=n.call(this,t)||this;return r._elementRef=t,r._document=l,r._value=0,r._fallbackAnimation=!1,r._elementSize=Vu,r._diameter=Vu,r.mode="determinate",r._fallbackAnimation=e.EDGE||e.TRIDENT,t.nativeElement.classList.add("mat-progress-spinner-indeterminate"+(r._fallbackAnimation?"-fallback":"")+"-animation"),r}return Object(i.__extends)(t,n),Object.defineProperty(t.prototype,"diameter",{get:function(){return this._diameter},set:function(n){this._diameter=Yl(n),this._fallbackAnimation||t.diameters.has(this._diameter)||this._attachStyleNode()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"strokeWidth",{get:function(){return this._strokeWidth||this.diameter/10},set:function(n){this._strokeWidth=Yl(n)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"value",{get:function(){return"determinate"===this.mode?this._value:0},set:function(n){this._value=Math.max(0,Math.min(100,Yl(n)))},enumerable:!0,configurable:!0}),t.prototype.ngOnChanges=function(n){(n.strokeWidth||n.diameter)&&(this._elementSize=this._diameter+Math.max(this.strokeWidth-10,0))},Object.defineProperty(t.prototype,"_circleRadius",{get:function(){return(this.diameter-10)/2},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_viewBox",{get:function(){var n=2*this._circleRadius+this.strokeWidth;return"0 0 "+n+" "+n},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_strokeCircumference",{get:function(){return 2*Math.PI*this._circleRadius},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_strokeDashOffset",{get:function(){return"determinate"===this.mode?this._strokeCircumference*(100-this._value)/100:this._fallbackAnimation&&"indeterminate"===this.mode?.2*this._strokeCircumference:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_circleStrokeWidth",{get:function(){return this.strokeWidth/this._elementSize*100},enumerable:!0,configurable:!0}),t.prototype._attachStyleNode=function(){var n=t.styleTag;n||(n=this._document.createElement("style"),this._document.head.appendChild(n),t.styleTag=n),n&&n.sheet&&n.sheet.insertRule(this._getAnimationText(),0),t.diameters.add(this.diameter)},t.prototype._getAnimationText=function(){return"\n @keyframes mat-progress-spinner-stroke-rotate-DIAMETER {\n 0% { stroke-dashoffset: START_VALUE; transform: rotate(0); }\n 12.5% { stroke-dashoffset: END_VALUE; transform: rotate(0); }\n 12.51% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(72.5deg); }\n 25% { stroke-dashoffset: START_VALUE; transform: rotateX(180deg) rotate(72.5deg); }\n\n 25.1% { stroke-dashoffset: START_VALUE; transform: rotate(270deg); }\n 37.5% { stroke-dashoffset: END_VALUE; transform: rotate(270deg); }\n 37.51% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(161.5deg); }\n 50% { stroke-dashoffset: START_VALUE; transform: rotateX(180deg) rotate(161.5deg); }\n\n 50.01% { stroke-dashoffset: START_VALUE; transform: rotate(180deg); }\n 62.5% { stroke-dashoffset: END_VALUE; transform: rotate(180deg); }\n 62.51% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(251.5deg); }\n 75% { stroke-dashoffset: START_VALUE; transform: rotateX(180deg) rotate(251.5deg); }\n\n 75.01% { stroke-dashoffset: START_VALUE; transform: rotate(90deg); }\n 87.5% { stroke-dashoffset: END_VALUE; transform: rotate(90deg); }\n 87.51% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(341.5deg); }\n 100% { stroke-dashoffset: START_VALUE; transform: rotateX(180deg) rotate(341.5deg); }\n }\n".replace(/START_VALUE/g,""+.95*this._strokeCircumference).replace(/END_VALUE/g,""+.2*this._strokeCircumference).replace(/DIAMETER/g,""+this.diameter)},t.diameters=new Set([Vu]),t.styleTag=null,t}(Gl(function(n){this._elementRef=n},"primary"))),zu=function(){},Uu=function(n){function t(t,e,r,i,o){var s=n.call(this,t)||this;return s._focusMonitor=e,s._changeDetectorRef=r,s._dir=i,s._invert=!1,s._max=100,s._min=0,s._step=1,s._thumbLabel=!1,s._tickInterval=0,s._value=null,s._vertical=!1,s.change=new l.o,s.input=new l.o,s.onTouched=function(){},s._percent=0,s._isSliding=!1,s._isActive=!1,s._tickIntervalPercent=0,s._sliderDimensions=null,s._controlValueAccessorChangeFn=function(){},s._dirChangeSubscription=rl.a.EMPTY,s.tabIndex=parseInt(o)||0,s}return Object(i.__extends)(t,n),Object.defineProperty(t.prototype,"invert",{get:function(){return this._invert},set:function(n){this._invert=El(n)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"max",{get:function(){return this._max},set:function(n){this._max=Yl(n,this._max),this._percent=this._calculatePercentage(this._value),this._changeDetectorRef.markForCheck()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"min",{get:function(){return this._min},set:function(n){this._min=Yl(n,this._min),null===this._value&&(this.value=this._min),this._percent=this._calculatePercentage(this._value),this._changeDetectorRef.markForCheck()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"step",{get:function(){return this._step},set:function(n){this._step=Yl(n,this._step),this._step%1!=0&&(this._roundLabelTo=this._step.toString().split(".").pop().length),this._changeDetectorRef.markForCheck()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"thumbLabel",{get:function(){return this._thumbLabel},set:function(n){this._thumbLabel=El(n)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_thumbLabelDeprecated",{get:function(){return this._thumbLabel},set:function(n){this._thumbLabel=n},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"tickInterval",{get:function(){return this._tickInterval},set:function(n){this._tickInterval="auto"===n?"auto":"number"==typeof n||"string"==typeof n?Yl(n,this._tickInterval):0},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_tickIntervalDeprecated",{get:function(){return this.tickInterval},set:function(n){this.tickInterval=n},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"value",{get:function(){return null===this._value&&(this.value=this._min),this._value},set:function(n){n!==this._value&&(this._value=Yl(n,this._value||0),this._percent=this._calculatePercentage(this._value),this._changeDetectorRef.markForCheck())},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"vertical",{get:function(){return this._vertical},set:function(n){this._vertical=El(n)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"displayValue",{get:function(){return this._roundLabelTo&&this.value&&this.value%1!=0?this.value.toFixed(this._roundLabelTo):this.value||0},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"percent",{get:function(){return this._clamp(this._percent)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_invertAxis",{get:function(){return this.vertical?!this.invert:this.invert},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_isMinValue",{get:function(){return 0===this.percent},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_thumbGap",{get:function(){return this.disabled?7:this._isMinValue&&!this.thumbLabel?this._isActive?10:7:0},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_trackBackgroundStyles",{get:function(){var n=this.vertical?"Y":"X";return{transform:"translate"+n+"("+(this._invertMouseCoords?"-":"")+this._thumbGap+"px) scale"+n+"("+(1-this.percent)+")"}},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_trackFillStyles",{get:function(){var n=this.vertical?"Y":"X";return{transform:"translate"+n+"("+(this._invertMouseCoords?"":"-")+this._thumbGap+"px) scale"+n+"("+this.percent+")"}},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_ticksContainerStyles",{get:function(){return{transform:"translate"+(this.vertical?"Y":"X")+"("+(this.vertical||"rtl"!=this._direction?"-":"")+this._tickIntervalPercent/2*100+"%)"}},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_ticksStyles",{get:function(){var n=100*this._tickIntervalPercent,t={backgroundSize:this.vertical?"2px "+n+"%":n+"% 2px",transform:"translateZ(0) translate"+(this.vertical?"Y":"X")+"("+(this.vertical||"rtl"!=this._direction?"":"-")+n/2+"%)"+(this.vertical||"rtl"!=this._direction?"":" rotate(180deg)")};return this._isMinValue&&this._thumbGap&&(t["padding"+(this.vertical?this._invertAxis?"Bottom":"Top":this._invertAxis?"Right":"Left")]=this._thumbGap+"px"),t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_thumbContainerStyles",{get:function(){return{transform:"translate"+(this.vertical?"Y":"X")+"(-"+100*(("rtl"!=this._direction||this.vertical?this._invertAxis:!this._invertAxis)?this.percent:1-this.percent)+"%)"}},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_invertMouseCoords",{get:function(){return"rtl"!=this._direction||this.vertical?this._invertAxis:!this._invertAxis},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_direction",{get:function(){return this._dir&&"rtl"==this._dir.value?"rtl":"ltr"},enumerable:!0,configurable:!0}),t.prototype.ngOnInit=function(){var n=this;this._focusMonitor.monitor(this._elementRef.nativeElement,!0).subscribe(function(t){n._isActive=!!t&&"keyboard"!==t,n._changeDetectorRef.detectChanges()}),this._dir&&(this._dirChangeSubscription=this._dir.change.subscribe(function(){n._changeDetectorRef.markForCheck()}))},t.prototype.ngOnDestroy=function(){this._focusMonitor.stopMonitoring(this._elementRef.nativeElement),this._dirChangeSubscription.unsubscribe()},t.prototype._onMouseenter=function(){this.disabled||(this._sliderDimensions=this._getSliderDimensions(),this._updateTickIntervalPercent())},t.prototype._onClick=function(n){if(!this.disabled){var t=this.value;this._isSliding=!1,this._focusHostElement(),this._updateValueFromPosition({x:n.clientX,y:n.clientY}),t!=this.value&&(this._emitInputEvent(),this._emitChangeEvent())}},t.prototype._onSlide=function(n){if(!this.disabled){this._isSliding||this._onSlideStart(null),n.preventDefault();var t=this.value;this._updateValueFromPosition({x:n.center.x,y:n.center.y}),t!=this.value&&this._emitInputEvent()}},t.prototype._onSlideStart=function(n){this.disabled||this._isSliding||(this._onMouseenter(),this._isSliding=!0,this._focusHostElement(),this._valueOnSlideStart=this.value,n&&(this._updateValueFromPosition({x:n.center.x,y:n.center.y}),n.preventDefault()))},t.prototype._onSlideEnd=function(){this._isSliding=!1,this._valueOnSlideStart!=this.value&&this._emitChangeEvent(),this._valueOnSlideStart=null},t.prototype._onFocus=function(){this._sliderDimensions=this._getSliderDimensions(),this._updateTickIntervalPercent()},t.prototype._onBlur=function(){this.onTouched()},t.prototype._onKeydown=function(n){if(!this.disabled){var t=this.value;switch(n.keyCode){case 33:this._increment(10);break;case 34:this._increment(-10);break;case 35:this.value=this.max;break;case 36:this.value=this.min;break;case 37:this._increment("rtl"==this._direction?1:-1);break;case 38:this._increment(1);break;case 39:this._increment("rtl"==this._direction?-1:1);break;case 40:this._increment(-1);break;default:return}t!=this.value&&(this._emitInputEvent(),this._emitChangeEvent()),this._isSliding=!0,n.preventDefault()}},t.prototype._onKeyup=function(){this._isSliding=!1},t.prototype._increment=function(n){this.value=this._clamp((this.value||0)+this.step*n,this.min,this.max)},t.prototype._updateValueFromPosition=function(n){if(this._sliderDimensions){var t=this._clamp(((this.vertical?n.y:n.x)-(this.vertical?this._sliderDimensions.top:this._sliderDimensions.left))/(this.vertical?this._sliderDimensions.height:this._sliderDimensions.width));this._invertMouseCoords&&(t=1-t);var e=this._calculateValue(t),l=Math.round((e-this.min)/this.step)*this.step+this.min;this.value=this._clamp(l,this.min,this.max)}},t.prototype._emitChangeEvent=function(){this._controlValueAccessorChangeFn(this.value),this.change.emit(this._createChangeEvent())},t.prototype._emitInputEvent=function(){this.input.emit(this._createChangeEvent())},t.prototype._updateTickIntervalPercent=function(){if(this.tickInterval&&this._sliderDimensions)if("auto"==this.tickInterval){var n=this.vertical?this._sliderDimensions.height:this._sliderDimensions.width,t=Math.ceil(30/(n*this.step/(this.max-this.min)));this._tickIntervalPercent=t*this.step/n}else this._tickIntervalPercent=this.tickInterval*this.step/(this.max-this.min)},t.prototype._createChangeEvent=function(n){void 0===n&&(n=this.value);var t=new function(){};return t.source=this,t.value=n,t},t.prototype._calculatePercentage=function(n){return((n||0)-this.min)/(this.max-this.min)},t.prototype._calculateValue=function(n){return this.min+n*(this.max-this.min)},t.prototype._clamp=function(n,t,e){return void 0===t&&(t=0),void 0===e&&(e=1),Math.max(t,Math.min(n,e))},t.prototype._getSliderDimensions=function(){return this._sliderWrapper?this._sliderWrapper.nativeElement.getBoundingClientRect():null},t.prototype._focusHostElement=function(){this._elementRef.nativeElement.focus()},t.prototype.writeValue=function(n){this.value=n},t.prototype.registerOnChange=function(n){this._controlValueAccessorChangeFn=n},t.prototype.registerOnTouched=function(n){this.onTouched=n},t.prototype.setDisabledState=function(n){this.disabled=n},t}(Jl(Gl(Ul(function(n){this._elementRef=n}),"accent"))),Gu=function(){},qu=function(){},Ju=function(n){function t(t,e){var l=n.call(this,t)||this;return l._platform=e,l}return Object(i.__extends)(t,n),t.prototype.ngAfterViewInit=function(){var n=this;Object(l.Y)()&&this._platform.isBrowser&&(this._checkToolbarMixedModes(),this._toolbarRows.changes.subscribe(function(){return n._checkToolbarMixedModes()}))},t.prototype._checkToolbarMixedModes=function(){this._toolbarRows.length&&[].slice.call(this._elementRef.nativeElement.childNodes).filter(function(n){return!(n.classList&&n.classList.contains("mat-toolbar-row"))}).filter(function(n){return n.nodeType!==Node.COMMENT_NODE}).some(function(n){return n.textContent.trim()})&&function(){throw Error("MatToolbar: Attempting to combine different toolbar modes. Either specify multiple `` elements explicitly or just place content inside of a `` for a single row.")}()},t}(Gl(function(n){this._elementRef=n})),Qu=function(){},Ku=function(n){return n[n.RequestingCurrentPin=0]="RequestingCurrentPin",n[n.RequestingNewPin=1]="RequestingNewPin",n[n.ConfirmingNewPin=2]="ConfirmingNewPin",n}({}),Xu=function(){function n(n){this.dialog=n}return Object.defineProperty(n.prototype,"requestPinComponent",{set:function(n){this.requestPinComponentInternal=n},enumerable:!0,configurable:!0}),n.prototype.resetValues=function(){this.changingPin=!1,this.signingTx=!1},n.prototype.requestPin=function(){var n=this;return this.dialog.open(this.requestPinComponentInternal,{width:"350px",autoFocus:!1,data:{changingPin:this.changingPin,changePinState:this.changePinState,signingTx:this.signingTx}}).afterClosed().map(function(t){return n.changingPin&&(n.changePinState===Ku.RequestingCurrentPin?n.changePinState=Ku.RequestingNewPin:n.changePinState===Ku.RequestingNewPin&&(n.changePinState=Ku.ConfirmingNewPin)),t})},n}(),Zu=function(){function n(n){this.dialog=n}return Object.defineProperty(n.prototype,"requestWordComponent",{set:function(n){this.requestWordComponentInternal=n},enumerable:!0,configurable:!0}),n.prototype.requestWord=function(){return this.dialog.open(this.requestWordComponentInternal,{width:"350px",data:{isForHwWallet:!0,wordNumber:0,restoringSoftwareWallet:!1}}).afterClosed().map(function(n){return n})},n}(),$u=function(n){function t(){var t=n.call(this,"Timeout has occurred");this.name=t.name="TimeoutError",this.stack=t.stack,this.message=t.message}return Object(i.__extends)(t,n),t}(Error),nc=function(){function n(n,t,e,l){this.waitFor=n,this.absoluteTimeout=t,this.scheduler=e,this.errorInstance=l}return n.prototype.call=function(n,t){return t.subscribe(new tc(n,this.absoluteTimeout,this.waitFor,this.scheduler,this.errorInstance))},n}(),tc=function(n){function t(t,e,l,r,i){n.call(this,t),this.absoluteTimeout=e,this.waitFor=l,this.scheduler=r,this.errorInstance=i,this.action=null,this.scheduleTimeout()}return Object(i.__extends)(t,n),t.dispatchTimeout=function(n){n.error(n.errorInstance)},t.prototype.scheduleTimeout=function(){var n=this.action;n?this.action=n.schedule(this,this.waitFor):this.add(this.action=this.scheduler.schedule(t.dispatchTimeout,this.waitFor,this))},t.prototype._next=function(t){this.absoluteTimeout||this.scheduleTimeout(),n.prototype._next.call(this,t)},t.prototype._unsubscribe=function(){this.action=null,this.scheduler=null,this.errorInstance=null},t}(Be.a);o.a.prototype.timeout=function(n,t){return void 0===t&&(t=sl),function(n,t){void 0===t&&(t=sl);var e=ul(n),l=e?+n-t.now():Math.abs(n);return function(n){return n.lift(new nc(l,e,t,new $u))}}(n,t)(this)};var ec,lc=function(){function n(n,t,e,l,r){this.http=n,this.apiService=t,this.hwWalletPinService=e,this.hwWalletSeedWordService=l,this.ngZone=r,this.url="http://127.0.0.1:9510/api/v1",this.hwConnected=!1,this.connectionEventSubject=new Tl(!1),this.disconnectedChecks=0,this.maxFastDisconnectedChecks=32}return Object.defineProperty(n.prototype,"connectionEvent",{get:function(){return this.connectionEventSubject.asObservable()},enumerable:!0,configurable:!0}),n.prototype.get=function(n){return this.checkResponse(this.http.get(this.url+n,this.returnRequestOptions()),n.includes("/available"))},n.prototype.post=function(n,t){return void 0===t&&(t={}),this.checkResponse(this.http.post(this.url+n,JSON.stringify(t),this.returnRequestOptions()))},n.prototype.put=function(n,t,e,l){return void 0===t&&(t=null),void 0===e&&(e=!1),void 0===l&&(l=!1),this.checkResponse(this.http.put(this.url+n,t,this.returnRequestOptions(e)),!1,l)},n.prototype.delete=function(n){return this.checkResponse(this.http.delete(this.url+n,this.returnRequestOptions()))},n.prototype.checkResponse=function(t,e,l){var r=this;return void 0===e&&(e=!1),void 0===l&&(l=!1),t.timeout(l?3e4:55e3).flatMap(function(t){var l=t.json();return l.data&&l.data.length&&(l.data=1===l.data.length?l.data[0]:l.data),e?r.ngZone.run(function(){return r.updateHwConnected(!!l.data)}):r.updateHwConnected(!0),"string"==typeof l.data&&-1!==l.data.indexOf("PinMatrixRequest")?r.hwWalletPinService.requestPin().flatMap(function(t){return t?r.post("/intermediate/pin_matrix",{pin:t}):r.put("/cancel").map(function(){return n.errorCancelled})}):"string"==typeof l.data&&-1!==l.data.indexOf("WordRequest")?r.hwWalletSeedWordService.requestWord().flatMap(function(t){return t?r.post("/intermediate/word",{word:t}):r.put("/cancel").map(function(){return n.errorCancelled})}):"string"==typeof l.data&&-1!==l.data.indexOf("ButtonRequest")?r.post("/intermediate/button"):o.a.of(l)}).catch(function(t){if(t&&t.name&&"TimeoutError"===t.name)return r.put("/cancel").subscribe(),o.a.throw({_body:n.errorTimeout});if(t&&t._body){var e=void 0;if("string"==typeof t._body)e=t._body;else if(t._body.error)e=t._body.error;else try{e=JSON.parse(t._body).error}catch(n){}if(e)return r.apiService.processConnectionError({_body:e},!0)}return o.a.throw({_body:n.errorConnectingWithTheDaemon})})},n.prototype.returnRequestOptions=function(n){void 0===n&&(n=!1);var t=new ae;return t.headers=new qt,n||t.headers.append("Content-Type","application/json"),t},n.prototype.checkHw=function(n){var t=this;this.checkHwSubscription&&this.checkHwSubscription.unsubscribe(),this.ngZone.runOutsideAngular(function(){t.checkHwSubscription=o.a.of(1).delay(n?t.hwConnected||t.disconnectedChecksthis.total&&this.destination.next(n)},t}(Be.a);e("lAP5"),e("T1Dh");var vc=function(){function n(n){this.predicate=n}return n.prototype.call=function(n,t){return t.subscribe(new wc(n,this.predicate))},n}(),wc=function(n){function t(t,e){n.call(this,t),this.predicate=e,this.index=0}return Object(i.__extends)(t,n),t.prototype._next=function(n){var t,e=this.destination;try{t=this.predicate(n,this.index++)}catch(n){return void e.error(n)}this.nextOrComplete(n,t)},t.prototype.nextOrComplete=function(n,t){var e=this.destination;Boolean(t)?e.next(n):e.complete()},t}(Be.a);e("DDro");var xc=e("Uter"),Mc=function(){function n(){}return n.encode=function(n,t,e,l,r){var i=this;if(void 0===r&&(r=0),n.length!==e.length)throw new Error("Invalid number of signatures.");var o=this.encodeSizeTransaction(n,t,e).toNumber(),s=new ArrayBuffer(o),a=new DataView(s),u=0;if(a.setUint32(u,o,!0),a.setUint8(u+=4,r),u+=1,this.convertToBytes(l).forEach(function(n){a.setUint8(u,n),u+=1}),e.length>65535)throw new Error("Too many signatures.");if(a.setUint32(u,e.length,!0),u+=4,e.forEach(function(n){i.convertToBytes(n).forEach(function(n){a.setUint8(u,n),u+=1})}),n.length>65535)throw new Error("Too many inputs.");if(a.setUint32(u,n.length,!0),u+=4,n.forEach(function(n){i.convertToBytes(n.hashIn).forEach(function(n){a.setUint8(u,n),u+=1})}),t.length>65535)throw new Error("Too many outputs.");a.setUint32(u,t.length,!0),u+=4;var c=xc("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz");return t.forEach(function(n){var t=c.decode(n.address);a.setUint8(u,t[20]),u+=1;for(var e=0;e<20;e++)a.setUint8(u,t[e]),u+=1;u=i.setUint64(a,u,new Ee.a(n.coin)),u=i.setUint64(a,u,new Ee.a(n.hour))}),this.convertToHex(s)},n.encodeSizeTransaction=function(n,t,e){var l=new Ee.a(0);return(l=(l=(l=(l=(l=(l=(l=(l=l.plus(4)).plus(1)).plus(32)).plus(4)).plus(new Ee.a(65).multipliedBy(e.length))).plus(4)).plus(new Ee.a(32).multipliedBy(n.length))).plus(4)).plus(new Ee.a(37).multipliedBy(t.length))},n.setUint64=function(n,t,e){var l=e.toString(16);l.length%2!=0&&(l="0"+l);for(var r=this.convertToBytes(l),i=r.length-1;i>=0;i--)n.setUint8(t,r[i]),t+=1;for(i=0;i<8-r.length;i++)n.setUint8(t,0),t+=1;return t},n.convertToBytes=function(n){if(n.length%2!=0)throw new Error("Invalid hex string.");for(var t=[],e=0;es[0]?i=!0:a===s[0]&&(u>s[1]?i=!0:u===s[1]&&(Ll.useHwWalletDaemon?l.rawResponse.fw_patch:l.rawResponse.patchVersion)>=s[2]&&(i=!0))}}var c=[],d=!1;Ll.useHwWalletDaemon?(l.rawResponse.needs_backup&&(c.push(Cc.NeedsBackup),d=!0),l.rawResponse.pin_protection||(c.push(Cc.NeedsPin),d=!0)):(l.rawResponse.needsBackup&&(c.push(Cc.NeedsBackup),d=!0),l.rawResponse.pinProtection||(c.push(Cc.NeedsPin),d=!0)),r?i||(c.push(Cc.OutdatedFirmware),d=!0):c.push(Cc.FirmwareVersionNotVerified);var h=!1;if(n){var p=l.rawResponse.label?l.rawResponse.label:l.rawResponse.deviceId?l.rawResponse.deviceId:l.rawResponse.device_id;n.label!==p&&(n.label=p,h=!0),n.hasHwSecurityWarnings=d,e.saveHardwareWallets()}return{features:l.rawResponse,securityWarnings:c,walletNameUpdated:h}}):null},n.prototype.deleteHardwareWallet=function(n){var t=this;return n.isHardware?this.wallets.first().map(function(e){var l=e.indexOf(n);return-1!==l&&(e.splice(l,1),t.saveHardwareWallets(),t.refreshBalances(),!0)}):null},n.prototype.folder=function(){return this.apiService.get("wallets/folderName").map(function(n){return n.address})},n.prototype.outputs=function(){var n=this;return this.addressesAsString().first().filter(function(n){return!!n}).flatMap(function(t){return n.apiService.post("outputs",{addrs:t})})},n.prototype.outputsWithWallets=function(){return o.a.zip(this.all(),this.outputs(),function(n,t){return n.map(function(n){return n.addresses=n.addresses.map(function(n){return n.outputs=t.head_outputs.filter(function(t){return t.address===n.address}),n}),n})})},n.prototype.pendingTransactions=function(){return this.pendingTxs.asObservable()},n.prototype.refreshBalances=function(){var n=this;this.wallets.first().subscribe(function(t){o.a.forkJoin(t.map(function(t){return n.retrieveWalletBalance(t).map(function(n){return t.coins=n.coins,t.hours=n.hours,t.addresses.map(function(t){var e=n.addresses.find(function(n){return n.address===t.address});t.coins=e.coins,t.hours=e.hours}),t})})).subscribe(function(t){return n.wallets.next(t)})})},n.prototype.renameWallet=function(n,t){var e=this;return this.apiService.post("wallet/update",{id:n.filename,label:t}).do(function(){n.label=t,e.updateWallet(n)})},n.prototype.toggleEncryption=function(n,t){var e=this;return this.apiService.postWalletToggleEncryption(n,t).do(function(t){n.encrypted=t.meta.encrypted,e.updateWallet(t)})},n.prototype.resetPassword=function(n,t,e){var l=this,r=new Object;return r.id=n.filename,r.seed=t,e&&(r.password=e),this.apiService.post("wallet/recover",r,{},!0).do(function(t){n.encrypted=t.data.meta.encrypted,l.updateWallet(t.data)})},n.prototype.getWalletSeed=function(n,t){return this.apiService.getWalletSeed(n,t)},n.prototype.createTransaction=function(n,t,e,l,r,i,o,s){var a=this;e&&(t=null),n.isHardware&&!i&&(i=n.addresses[0].address);var u=!!n.isHardware,c={hours_selection:r,wallet_id:n?n.filename:null,password:o,addresses:t,unspents:e,to:l,change_address:i};u||(c.unsigned=s);var d,h=this.apiService.post(u?"transaction":"wallet/transaction",c,{json:!0},u).map(function(t){var e=u?t.data:t;if(n.isHardware){if(e.transaction.inputs.length>8)throw new Error(a.translate.instant("hardware-wallet.errors.too-many-inputs-outputs"));if(e.transaction.outputs.length>8)throw new Error(a.translate.instant("hardware-wallet.errors.too-many-inputs-outputs"))}return kc({},e.transaction,{hoursBurned:new Ae.BigNumber(e.transaction.fee),encoded:e.encoded_transaction,innerHash:e.transaction.inner_hash})});return n.isHardware&&!s&&(h=h.flatMap(function(t){return d=t,a.signTransaction(n,null,t)}).map(function(n){return d.encoded=n.encoded,d})),h},n.prototype.signTransaction=function(n,t,e){if(n.isHardware){var l=[],r=[],i=[],s=[];if(e.outputs.forEach(function(n){l.push({address:n.address,coins:parseInt(new Ae.BigNumber(n.coins).multipliedBy(1e6).toFixed(0),10),hours:parseInt(n.hours,10)}),i.push({address:n.address,coin:parseInt(new Ae.BigNumber(n.coins).multipliedBy(1e6).toFixed(0),10),hour:parseInt(n.hours,10)})}),i.length>1)for(var a=l.length-1;a>=0;a--)if(i[a].address===n.addresses[0].address){i[a].address_index=0;break}var u=new Map;return n.addresses.forEach(function(n,t){return u.set(n.address,t)}),e.inputs.forEach(function(n){r.push({hash:n.uxid,secret:"",address:n.address,address_index:u.get(n.address),calculated_hours:parseInt(n.calculated_hours,10),coins:parseInt(n.coins,10)}),s.push({hashIn:n.uxid,index:u.get(n.address)})}),this.hwWalletService.signTransaction(s,i).flatMap(function(n){var t=Mc.encode(s,i,n.rawResponse,e.innerHash);return o.a.of(kc({},e,{encoded:t}))})}return this.apiService.post("wallet/transaction/sign",{wallet_id:n?n.filename:null,password:t,encoded_transaction:e.encoded},{json:!0},!0).map(function(n){return kc({},n.data.transaction,{hoursBurned:new Ae.BigNumber(n.data.transaction.fee),encoded:n.data.encoded_transaction})})},n.prototype.injectTransaction=function(n,t){var e=this;return this.apiService.post("injectTransaction",{rawtx:n},{json:!0}).flatMap(function(n){return setTimeout(function(){return e.startDataRefreshSubscription()},32),t?e.storageService.store(ec.NOTES,n,t).retryWhen(function(n){return n.delay(1e3).take(3).concat(o.a.throw(-1))}).catch(function(n){return-1===n?o.a.of(-1):n}).map(function(n){return-1!==n}):o.a.of(!1)})},n.prototype.transaction=function(n){var t=this;return this.apiService.get("transaction",{txid:n}).flatMap(function(n){return n.txn.inputs&&!n.txn.inputs.length?o.a.of(n):o.a.forkJoin(n.txn.inputs.map(function(n){return t.retrieveInputAddress(n).map(function(n){return n.owner_address})})).map(function(t){return n.txn.inputs=t,n})})},n.prototype.transactions=function(){var n,t,e=this,l=new Map;return this.wallets.first().flatMap(function(t){return n=t,e.allAddresses().first()}).flatMap(function(n){return e.addresses=n,n.map(function(n){return l.set(n.address,!0)}),e.apiService.getTransactions(n)}).flatMap(function(n){return t=n,e.storageService.get(ec.NOTES,null)}).map(function(e){var r=new Map;return Object.keys(e.data).forEach(function(n){r.set(n,e.data[n])}),t.sort(function(n,t){return t.timestamp-n.timestamp}).map(function(t){var e=t.inputs.some(function(n){return l.has(n.owner)}),i=new Map;if(t.balance=new Ae.BigNumber("0"),t.hoursSent=new Ae.BigNumber("0"),e){var o=new Map;if(t.inputs.map(function(t){l.has(t.owner)&&(i.set(t.owner,!0),n.map(function(n){n.addresses.some(function(n){return n.address===t.owner})&&n.addresses.map(function(n){return o.set(n.address,!0)})}))}),t.outputs.map(function(n){o.has(n.dst)||(t.balance=t.balance.minus(n.coins),t.hoursSent=t.hoursSent.plus(n.hours))}),t.balance.isEqualTo(0)){t.coinsMovedInternally=!0;var s=new Map;t.inputs.map(function(n){s.set(n.owner,!0)}),t.outputs.map(function(n){s.has(n.dst)||(i.set(n.dst,!0),t.balance=t.balance.plus(n.coins),t.hoursSent=t.hoursSent.plus(n.hours))})}}else t.outputs.map(function(n){l.has(n.dst)&&(i.set(n.dst,!0),t.balance=t.balance.plus(n.coins),t.hoursSent=t.hoursSent.plus(n.hours))});i.forEach(function(n,e){t.addresses.push(e)});var a=new Ae.BigNumber("0");t.inputs.map(function(n){return a=a.plus(new Ae.BigNumber(n.calculated_hours))});var u=new Ae.BigNumber("0");t.outputs.map(function(n){return u=u.plus(new Ae.BigNumber(n.hours))}),t.hoursBurned=a.minus(u);var c=r.get(t.txid);return c&&(t.note=c),t})})},n.prototype.startDataRefreshSubscription=function(){var n=this;this.dataRefreshSubscription&&this.dataRefreshSubscription.unsubscribe(),this.ngZone.runOutsideAngular(function(){n.dataRefreshSubscription=o.a.timer(0,1e4).subscribe(function(){return n.ngZone.run(function(){n.refreshBalances(),n.refreshPendingTransactions()})})})},n.prototype.saveHardwareWallets=function(){var n=this;this.wallets.first().subscribe(function(t){var e=[];t.map(function(t){t.isHardware&&e.push(n.createHardwareWalletData(t.label,t.addresses.map(function(n){return{address:n.address,confirmed:n.confirmed}}),t.hasHwSecurityWarnings,t.stopShowingHwSecurityPopup))}),n.hwWalletService.saveWalletsData(JSON.stringify(e)),n.wallets.next(t)})},n.prototype.verifyAddress=function(n){return this.apiService.post("address/verify",{address:n},{},!0).pipe(Object(Le.a)(function(){return!0}),Ce(function(){return o.a.of(!1)}))},n.prototype.getWalletUnspentOutputs=function(n){var t=n.addresses.map(function(n){return n.address}).join(",");return this.getOutputs(t)},n.prototype.createHardwareWalletData=function(n,t,e,l){return{label:n,filename:"",hasHwSecurityWarnings:e,stopShowingHwSecurityPopup:l,coins:null,hours:null,addresses:t.map(function(n){return{address:n.address,coins:null,hours:null,confirmed:n.confirmed}}),encrypted:!1,isHardware:!0}},n.prototype.loadData=function(){var n=this,t=[],e=[];this.apiService.getWallets().first().flatMap(function(l){return e=l,n.hwWalletService.hwWalletCompatibilityActivated?n.loadHardwareWallets(t):o.a.of(null)}).subscribe(function(){t=t.concat(e),n.wallets.next(t)},function(){return n.initialLoadFailed.next(!0)})},n.prototype.loadHardwareWallets=function(n){return this.hwWalletService.getSavedWalletsData().map(function(t){return t&&JSON.parse(t).map(function(t){return n.push(t)}),null})},n.prototype.retrieveInputAddress=function(n){return this.apiService.get("uxout",{uxid:n})},n.prototype.retrieveWalletBalance=function(n){var t;if(n.isHardware){var e=n.addresses.map(function(n){return n.address}).join(",");t=this.apiService.post("balance",{addrs:e})}else t=this.apiService.get("wallet/balance",{id:n.filename});return t.map(function(n){return{coins:new Ae.BigNumber(n.confirmed.coins).dividedBy(1e6),hours:new Ae.BigNumber(n.confirmed.hours),addresses:Object.keys(n.addresses).map(function(t){return{address:t,coins:new Ae.BigNumber(n.addresses[t].confirmed.coins).dividedBy(1e6),hours:new Ae.BigNumber(n.addresses[t].confirmed.hours)}})}})},n.prototype.updateWallet=function(n){var t=this;this.wallets.first().subscribe(function(e){e[e.findIndex(function(t){return t.filename===n.filename})]=n,t.wallets.next(e)})},n.prototype.refreshPendingTransactions=function(){var n=this;this.apiService.get("pendingTxs",{verbose:!0}).flatMap(function(t){return 0===t.length?o.a.of({user:[],all:[]}):n.wallets.first().map(function(n){var e=new Set;return n.forEach(function(n){n.addresses.forEach(function(n){return e.add(n.address)})}),{user:t.filter(function(n){return n.transaction.inputs.some(function(n){return e.has(n.owner)})||n.transaction.outputs.some(function(n){return e.has(n.dst)})}),all:t}})}).subscribe(function(t){return n.pendingTxs.next(t)})},n.prototype.getOutputs=function(n){return n?this.apiService.post("outputs",{addrs:n}).map(function(n){var t=[];return n.head_outputs.forEach(function(n){return t.push({address:n.address,coins:new Ae.BigNumber(n.coins),hash:n.hash,calculated_hours:new Ae.BigNumber(n.calculated_hours)})}),t}):o.a.of([])},n.prototype.sortOutputs=function(n,t){n.sort(function(n,e){return e.coins.isGreaterThan(n.coins)?t?1:-1:e.coins.isLessThan(n.coins)?t?-1:1:e.calculated_hours.isGreaterThan(n.calculated_hours)?-1:e.calculated_hours.isLessThan(n.calculated_hours)?1:0})},n.prototype.getMinRequiredOutputs=function(n,t){var e=[],l=[];if(t.forEach(function(n){n.calculated_hours.isGreaterThan(0)?e.push(n):l.push(n)}),0===e.length)return[];this.sortOutputs(e,!0);var r=[e[0]],i=new Ae.BigNumber(e[0].coins);return i.isGreaterThanOrEqualTo(n)?r:(this.sortOutputs(l,!1),l.forEach(function(t){i.isLessThan(n)&&(r.push(t),i=i.plus(t.coins))}),i.isGreaterThanOrEqualTo(n)?r:(e.splice(0,1),this.sortOutputs(e,!1),e.forEach(function(t){i.isLessThan(n)&&(r.push(t),i=i.plus(t.coins))}),r))},n}();function Oc(n){if("object"==typeof n&&(n._body?n=n._body:n+=""),-1!==n.indexOf('"error":')&&(n=JSON.parse(n).error.message),n.startsWith("400")||n.startsWith("403")){var t=n.split(" - ",2);return 2===t.length?t[1].charAt(0).toUpperCase()+t[1].slice(1):n}return n}function Tc(n,t,e){return void 0===e&&(e=null),Ll.useHwWalletDaemon||window.ipcRenderer.sendSync("hwGetDeviceConnectedSync")?(l=t.result?t.result===rc.FailedOrRefused?"hardware-wallet.general.refused":t.result===rc.WrongPin?"hardware-wallet.general.error-incorrect-pin":t.result===rc.IncorrectHardwareWallet?"hardware-wallet.general.error-incorrect-wallet":t.result===rc.DaemonError?"hardware-wallet.errors.daemon-connection":t.result===rc.InvalidAddress?"hardware-wallet.errors.invalid-address":t.result===rc.Timeout?"hardware-wallet.errors.timeout":t.result===rc.Disconnected?"hardware-wallet.general.error-disconnected":t.result===rc.NotInBootloaderMode?"hardware-wallet.errors.not-in-bootloader-mode":t.result===rc.PinMismatch?"hardware-wallet.change-pin.pin-mismatch":t.result===rc.WrongWord?"hardware-wallet.restore-seed.error-wrong-word":t.result===rc.InvalidSeed?"hardware-wallet.restore-seed.error-invalid-seed":t.result===rc.WrongSeed?"hardware-wallet.restore-seed.error-wrong-seed":e||"hardware-wallet.general.generic-error":e||"hardware-wallet.general.generic-error",n?n.instant(l):l):n?n.instant("hardware-wallet.general.error-disconnected"):"hardware-wallet.general.error-disconnected";var l}var Lc=function(){function n(){this.forceEmitEvents=!1,this.action=new l.o,this.mouseOver=!1}return n.prototype.onClick=function(){this.disabled&&!this.forceEmitEvents||(this.error="",this.action.emit())},n.prototype.focus=function(){this.button.focus()},n.prototype.setLoading=function(){this.state=0},n.prototype.setSuccess=function(){var n=this;this.state=1,setTimeout(function(){return n.state=null},3e3)},n.prototype.setError=function(n){var t=this;this.error="string"==typeof n?n:Oc(n._body),this.state=2,this.mouseOver&&setTimeout(function(){return t.tooltip.show()},50)},n.prototype.setDisabled=function(){this.disabled=!0},n.prototype.setEnabled=function(){this.disabled=!1},n.prototype.isLoading=function(){return 0===this.state},n.prototype.resetState=function(){return this.state=null,this.error="",this},n}();o.a.prototype.switchMap=function(n,t){return Object(Ri.a)(n,t)(this)},o.a.prototype.debounceTime=function(n,t){return void 0===t&&(t=sl),mr(n,t)(this)};var Pc,Dc,Ac=function(){function n(){var n=this;this.lastSearchTerm="",this.searchResultsSubject=new yl.a,this.wordList=[],this.wordMap=new Map,e.e(6).then(e.bind(null,"flj1")).then(function(t){n.wordList=t.list,n.wordList.forEach(function(t){n.wordMap.set(t,!0)}),n.searchResultsSubject.next(n.lastSearchTerm)})}return Object.defineProperty(n.prototype,"searchResults",{get:function(){var n=this;return this.searchResultsSubject.asObservable().debounceTime(100).map(function(t){return t.length>1?n.wordList.filter(function(n){return n.startsWith(t)}):[]})},enumerable:!0,configurable:!0}),n.prototype.setSearchTerm=function(n){this.lastSearchTerm=n,this.searchResultsSubject.next(n)},n.prototype.validateWord=function(n){return this.wordList.length>0?!!this.wordMap.has(n):null},n}();!function(n){n.Error="error",n.Done="done",n.Warning="warning"}(Pc||(Pc={})),function(n){n.Red="red-background",n.Green="green-background",n.Yellow="yellow-background"}(Dc||(Dc={}));var Ec=function(){},Yc=function(){function n(){this.config=new Ec,this.visible=!1}return n.prototype.show=function(){var n=this;this.visible?(this.visible=!1,setTimeout(function(){return n.visible=!0},32)):this.visible=!0},n.prototype.hide=function(){this.visible=!1},n}(),jc=function(){function n(){}return Object.defineProperty(n.prototype,"msgBarComponent",{set:function(n){this.msgBarComponentInternal=n},enumerable:!0,configurable:!0}),n.prototype.show=function(n){this.msgBarComponentInternal&&(this.msgBarComponentInternal.config=n,this.msgBarComponentInternal.show())},n.prototype.hide=function(){this.msgBarComponentInternal&&this.msgBarComponentInternal.hide()},n.prototype.showError=function(n,t){void 0===t&&(t=2e4);var e=new Ec;e.text=Oc(n),e.title="errors.error",e.icon=Pc.Error,e.color=Dc.Red,this.show(e),this.setTimer(t)},n.prototype.showWarning=function(n,t){void 0===t&&(t=2e4);var e=new Ec;e.text=Oc(n),e.title="common.warning",e.icon=Pc.Warning,e.color=Dc.Yellow,this.show(e),this.setTimer(t)},n.prototype.showDone=function(n,t){void 0===t&&(t=1e4);var e=new Ec;e.text=n,e.title="common.success",e.icon=Pc.Done,e.color=Dc.Green,this.show(e),this.setTimer(t)},n.prototype.setTimer=function(n){var t=this;void 0===n&&(n=1e4),this.timeSubscription&&this.timeSubscription.unsubscribe(),this.timeSubscription=o.a.of(1).delay(n).subscribe(function(){return t.hide()})},n}(),Ic=function(n){return n[n.None=0]="None",n[n.Spinner=1]="Spinner",n[n.Success=2]="Success",n[n.Error=3]="Error",n[n.Usb=4]="Usb",n[n.HardwareWallet=5]="HardwareWallet",n[n.Warning=6]="Warning",n[n.Confirm=7]="Confirm",n}({}),Rc=function(){function n(){this.icon=Ic.HardwareWallet,this.linkClicked=new l.o,this.icons=Ic}return n.prototype.activateLink=function(){this.linkClicked.emit()},n}(),Hc=function(){function n(n,t,e,l,r,i,o){var s=this;this.data=n,this.dialogRef=t,this.formBuilder=e,this.bip38WordList=l,this.msgBarService=r,this.translateService=i,this.msgIcons=Ic,this.sendingWord=!1,n.isForHwWallet&&(this.hwConnectionSubscription=o.walletConnectedAsyncEvent.subscribe(function(n){n||s.dialogRef.close()}))}return n.prototype.ngOnInit=function(){var n=this;this.form=this.formBuilder.group({word:["",Xi.required]}),this.valueChangeSubscription=this.form.controls.word.valueChanges.subscribe(function(t){n.bip38WordList.setSearchTerm(t.trim().toLowerCase())}),this.filteredOptions=this.bip38WordList.searchResults.map(function(n){return n})},n.prototype.ngOnDestroy=function(){this.msgBarService.hide(),this.valueChangeSubscription.unsubscribe(),this.hwConnectionSubscription&&this.hwConnectionSubscription.unsubscribe()},n.prototype.sendWord=function(){var n=this;this.sendingWord||(this.sendingWord=!0,this.msgBarService.hide(),setTimeout(function(){if(n.form.valid){var t=n.bip38WordList.validateWord(n.form.value.word.trim().toLowerCase());t?n.dialogRef.close(n.form.value.word.trim().toLowerCase()):n.msgBarService.showError(n.translateService.instant(null===t?"hardware-wallet.seed-word.error-loading-words":"hardware-wallet.seed-word.error-invalid-word"))}n.sendingWord=!1},32))},n}(),Nc=function(){function n(n,t){this.dialogRef=n,this.data=t,this.accepted=!1,this.disableDismiss=!1,this.disableDismiss=!!t.disableDismiss}return n.prototype.closeModal=function(n){this.dialogRef.close(n)},n.prototype.setAccept=function(n){this.accepted=!!n.checked},n}(),Fc=function(){return function(n){Object.assign(this,n)}}(),Bc=function(){function n(n,t){this.translate=n,this.storageService=t,this.currentLanguage=new Sl(1),this.selectedLanguageLoaded=new Sl(1),this.storageKey="lang",this.languagesInternal=[]}return Object.defineProperty(n.prototype,"languages",{get:function(){return this.languagesInternal},enumerable:!0,configurable:!0}),n.prototype.loadLanguageSettings=function(){var n=this,t=[];Ll.languages.forEach(function(e){var l=new Fc(e);n.languagesInternal.push(l),t.push(l.code)}),this.translate.addLangs(t),this.translate.setDefaultLang(Ll.defaultLanguage),this.translate.onLangChange.subscribe(function(t){return n.onLanguageChanged(t)}),this.loadCurrentLanguage()},n.prototype.changeLanguage=function(n){this.translate.use(n)},n.prototype.onLanguageChanged=function(n){this.currentLanguage.next(this.languages.find(function(t){return t.code===n.lang})),this.subscription&&this.subscription.unsubscribe(),this.subscription=this.storageService.store(ec.CLIENT,this.storageKey,n.lang).subscribe()},n.prototype.loadCurrentLanguage=function(){var n=this;this.storageService.get(ec.CLIENT,this.storageKey).subscribe(function(t){t.data&&-1!==n.translate.getLangs().indexOf(t.data)?(setTimeout(function(){n.translate.use(t.data)},16),n.selectedLanguageLoaded.next(!0)):n.selectedLanguageLoaded.next(!1)},function(){n.selectedLanguageLoaded.next(!1)})},n}(),Vc=function(){function n(n,t){this.dialogRef=n,this.languageService=t}return n.prototype.ngOnInit=function(){this.disableDismiss=this.dialogRef.disableClose,this.languages=this.languageService.languages},n.prototype.closePopup=function(n){void 0===n&&(n=null),this.dialogRef.close(n?n.code:void 0)},n}();function Wc(n,t){return n.open(Nc,{width:"450px",data:t,autoFocus:!1})}function zc(n,t){void 0===t&&(t=!1);var e=new oa;return e.width="600px",e.disableClose=t,e.autoFocus=!1,n.open(Vc,e).afterClosed()}function Uc(n){var t=document.createElement("textarea");t.style.position="fixed",t.style.left="0",t.style.top="0",t.style.opacity="0",t.value=n,document.body.appendChild(t),t.focus(),t.select(),document.execCommand("copy"),document.body.removeChild(t)}var Gc=function(){function n(n,t,e){this.apiService=n,this.dialog=t,this.msgBarService=e,this.customSeedIsNormal=!0,this.customSeedAccepted=!1,this.encrypt=!0,this.enterSeedWithAssistance=!0,this.assistedSeedConfirmed=!1,this.lastAssistedSeed="",this.numberOfAutogeneratedWords=0,this.seed=new yl.a}return n.prototype.ngOnInit=function(){this.onboarding?this.initForm(!1,null):this.initForm()},n.prototype.ngOnDestroy=function(){this.msgBarService.hide(),this.statusSubscription.unsubscribe(),this.seedValiditySubscription.unsubscribe()},Object.defineProperty(n.prototype,"isValid",{get:function(){return this.form.valid&&(!this.enterSeedWithAssistance&&(this.customSeedIsNormal||this.customSeedAccepted)||this.create&&this.enterSeedWithAssistance&&this.assistedSeedConfirmed||!this.create&&this.enterSeedWithAssistance&&this.lastAssistedSeed.length>2)},enumerable:!0,configurable:!0}),n.prototype.onCustomSeedAcceptance=function(n){this.customSeedAccepted=n.checked},n.prototype.setEncrypt=function(n){this.encrypt=n.checked,this.form.updateValueAndValidity()},n.prototype.getData=function(){return{creatingNewWallet:this.create,label:this.form.value.label,seed:this.enterSeedWithAssistance?this.lastAssistedSeed:this.form.value.seed,password:!this.onboarding&&this.encrypt?this.form.value.password:null,enterSeedWithAssistance:this.enterSeedWithAssistance,lastAssistedSeed:this.lastAssistedSeed,lastCustomSeed:this.form.value.seed,numberOfWords:this.create?this.numberOfAutogeneratedWords:this.form.value.number_of_words}},n.prototype.changeSeedType=function(){var n=this;this.msgBarService.hide(),this.enterSeedWithAssistance?Wc(this.dialog,{text:this.create?"wallet.new.seed.custom-seed-warning-text":"wallet.new.seed.custom-seed-warning-text-recovering",headerText:"wallet.new.seed.custom-seed-warning-title",checkboxText:this.create?"wallet.new.seed.custom-seed-warning-check":null,confirmButtonText:"wallet.new.seed.custom-seed-warning-continue",cancelButtonText:"wallet.new.seed.custom-seed-warning-cancel"}).afterClosed().subscribe(function(t){t&&(n.enterSeedWithAssistance=!1,n.removeConfirmations())}):(this.enterSeedWithAssistance=!0,this.removeConfirmations())},n.prototype.enterSeed=function(){this.create||(this.partialSeed=[],this.askForWord(0),this.msgBarService.hide())},n.prototype.confirmNormalSeed=function(){this.assistedSeedConfirmed||(this.partialSeed=[],this.askForWord(0),this.msgBarService.hide())},n.prototype.askForWord=function(n){var t=this;this.dialog.open(Hc,{width:"350px",data:{isForHwWallet:!1,wordNumber:n+1,restoringSoftwareWallet:!this.create}}).afterClosed().subscribe(function(e){if(e){if(t.create&&e!==t.lastAssistedSeed.split(" ")[n])return void t.msgBarService.showError("wallet.new.seed.incorrect-word");if(t.partialSeed[n]=e,n+=1,t.create&&nn.length)return null;if("full"===e.pathMatch&&(t.hasChildren()||l.length0?n[n.length-1]:null}function Bd(n,t){for(var e in n)n.hasOwnProperty(e)&&t(n[e],e)}function Vd(n){var t=pd.call(n);return dd.call(t,function(n){return!0===n})}function Wd(n){return Object(l._14)(n)?n:Object(l._15)(n)?Ui(Promise.resolve(n)):Object(Fe.a)(n)}function zd(n,t,e){return e?function(n,t){return Hd(n,t)}(n.queryParams,t.queryParams)&&function n(t,e){if(!Jd(t.segments,e.segments))return!1;if(t.numberOfChildren!==e.numberOfChildren)return!1;for(var l in e.children){if(!t.children[l])return!1;if(!n(t.children[l],e.children[l]))return!1}return!0}(n.root,t.root):function(n,t){return Object.keys(t).length<=Object.keys(n).length&&Object.keys(t).every(function(e){return t[e]===n[e]})}(n.queryParams,t.queryParams)&&function n(t,e){return function t(e,l,r){if(e.segments.length>r.length)return!!Jd(o=e.segments.slice(0,r.length),r)&&!l.hasChildren();if(e.segments.length===r.length){if(!Jd(e.segments,r))return!1;for(var i in l.children){if(!e.children[i])return!1;if(!n(e.children[i],l.children[i]))return!1}return!0}var o=r.slice(0,e.segments.length),s=r.slice(e.segments.length);return!!Jd(e.segments,o)&&!!e.children[Pd]&&t(e.children[Pd],l,s)}(t,e,e.segments)}(n.root,t.root)}var Ud=function(){function n(n,t,e){this.root=n,this.queryParams=t,this.fragment=e}return Object.defineProperty(n.prototype,"queryParamMap",{get:function(){return this._queryParamMap||(this._queryParamMap=Ad(this.queryParams)),this._queryParamMap},enumerable:!0,configurable:!0}),n.prototype.toString=function(){return Zd.serialize(this)},n}(),Gd=function(){function n(n,t){var e=this;this.segments=n,this.children=t,this.parent=null,Bd(t,function(n,t){return n.parent=e})}return n.prototype.hasChildren=function(){return this.numberOfChildren>0},Object.defineProperty(n.prototype,"numberOfChildren",{get:function(){return Object.keys(this.children).length},enumerable:!0,configurable:!0}),n.prototype.toString=function(){return $d(this)},n}(),qd=function(){function n(n,t){this.path=n,this.parameters=t}return Object.defineProperty(n.prototype,"parameterMap",{get:function(){return this._parameterMap||(this._parameterMap=Ad(this.parameters)),this._parameterMap},enumerable:!0,configurable:!0}),n.prototype.toString=function(){return eh(this)},n}();function Jd(n,t){return n.length===t.length&&n.every(function(n,e){return n.path===t[e].path})}function Qd(n,t){var e=[];return Bd(n.children,function(n,l){l===Pd&&(e=e.concat(t(n,l)))}),Bd(n.children,function(n,l){l!==Pd&&(e=e.concat(t(n,l)))}),e}var Kd=function(){},Xd=function(){function n(){}return n.prototype.parse=function(n){var t=new sh(n);return new Ud(t.parseRootSegment(),t.parseQueryParams(),t.parseFragment())},n.prototype.serialize=function(n){var t,e;return"/"+function n(t,e){if(!t.hasChildren())return $d(t);if(e){var l=t.children[Pd]?n(t.children[Pd],!1):"",r=[];return Bd(t.children,function(t,e){e!==Pd&&r.push(e+":"+n(t,!1))}),r.length>0?l+"("+r.join("//")+")":l}var i=Qd(t,function(e,l){return l===Pd?[n(t.children[Pd],!1)]:[l+":"+n(e,!1)]});return $d(t)+"/("+i.join("//")+")"}(n.root,!0)+(t=n.queryParams,(e=Object.keys(t).map(function(n){var e=t[n];return Array.isArray(e)?e.map(function(t){return nh(n)+"="+nh(t)}).join("&"):nh(n)+"="+nh(e)})).length?"?"+e.join("&"):"")+("string"==typeof n.fragment?"#"+encodeURI(n.fragment):"")},n}(),Zd=new Xd;function $d(n){return n.segments.map(function(n){return eh(n)}).join("/")}function nh(n){return encodeURIComponent(n).replace(/%40/g,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%3B/gi,";")}function th(n){return decodeURIComponent(n)}function eh(n){return""+nh(n.path)+(t=n.parameters,Object.keys(t).map(function(n){return";"+nh(n)+"="+nh(t[n])}).join(""));var t}var lh=/^[^\/()?;=&#]+/;function rh(n){var t=n.match(lh);return t?t[0]:""}var ih=/^[^=?&#]+/,oh=/^[^?&#]+/,sh=function(){function n(n){this.url=n,this.remaining=n}return n.prototype.parseRootSegment=function(){return this.consumeOptional("/"),""===this.remaining||this.peekStartsWith("?")||this.peekStartsWith("#")?new Gd([],{}):new Gd([],this.parseChildren())},n.prototype.parseQueryParams=function(){var n={};if(this.consumeOptional("?"))do{this.parseQueryParam(n)}while(this.consumeOptional("&"));return n},n.prototype.parseFragment=function(){return this.consumeOptional("#")?decodeURI(this.remaining):null},n.prototype.parseChildren=function(){if(""===this.remaining)return{};this.consumeOptional("/");var n=[];for(this.peekStartsWith("(")||n.push(this.parseSegment());this.peekStartsWith("/")&&!this.peekStartsWith("//")&&!this.peekStartsWith("/(");)this.capture("/"),n.push(this.parseSegment());var t={};this.peekStartsWith("/(")&&(this.capture("/"),t=this.parseParens(!0));var e={};return this.peekStartsWith("(")&&(e=this.parseParens(!1)),(n.length>0||Object.keys(t).length>0)&&(e[Pd]=new Gd(n,t)),e},n.prototype.parseSegment=function(){var n=rh(this.remaining);if(""===n&&this.peekStartsWith(";"))throw new Error("Empty path url segment cannot have parameters: '"+this.remaining+"'.");return this.capture(n),new qd(th(n),this.parseMatrixParams())},n.prototype.parseMatrixParams=function(){for(var n={};this.consumeOptional(";");)this.parseParam(n);return n},n.prototype.parseParam=function(n){var t=rh(this.remaining);if(t){this.capture(t);var e="";if(this.consumeOptional("=")){var l=rh(this.remaining);l&&this.capture(e=l)}n[th(t)]=th(e)}},n.prototype.parseQueryParam=function(n){var t,e=(t=this.remaining.match(ih))?t[0]:"";if(e){this.capture(e);var l="";if(this.consumeOptional("=")){var r=function(n){var t=n.match(oh);return t?t[0]:""}(this.remaining);r&&this.capture(l=r)}var i=th(e),o=th(l);if(n.hasOwnProperty(i)){var s=n[i];Array.isArray(s)||(n[i]=s=[s]),s.push(o)}else n[i]=o}},n.prototype.parseParens=function(n){var t={};for(this.capture("(");!this.consumeOptional(")")&&this.remaining.length>0;){var e=rh(this.remaining),l=this.remaining[e.length];if("/"!==l&&")"!==l&&";"!==l)throw new Error("Cannot parse url '"+this.url+"'");var r=void 0;e.indexOf(":")>-1?(r=e.substr(0,e.indexOf(":")),this.capture(r),this.capture(":")):n&&(r=Pd);var i=this.parseChildren();t[r]=1===Object.keys(i).length?i[Pd]:new Gd([],i),this.consumeOptional("//")}return t},n.prototype.peekStartsWith=function(n){return this.remaining.startsWith(n)},n.prototype.consumeOptional=function(n){return!!this.peekStartsWith(n)&&(this.remaining=this.remaining.substring(n.length),!0)},n.prototype.capture=function(n){if(!this.consumeOptional(n))throw new Error('Expected "'+n+'".')},n}(),ah=function(n){this.segmentGroup=n||null},uh=function(n){this.urlTree=n};function ch(n){return new o.a(function(t){return t.error(new ah(n))})}function dh(n){return new o.a(function(t){return t.error(new uh(n))})}function hh(n){return new o.a(function(t){return t.error(new Error("Only absolute redirects can have named outlets. redirectTo: '"+n+"'"))})}var ph=function(){function n(n,t,e,r,i){this.configLoader=t,this.urlSerializer=e,this.urlTree=r,this.config=i,this.allowRedirects=!0,this.ngModule=n.get(l.z)}return n.prototype.apply=function(){var n=this,t=this.expandSegmentGroup(this.ngModule,this.config,this.urlTree.root,Pd),e=Pe.call(t,function(t){return n.createUrlTree(t,n.urlTree.queryParams,n.urlTree.fragment)});return Te.call(e,function(t){if(t instanceof uh)return n.allowRedirects=!1,n.match(t.urlTree);if(t instanceof ah)throw n.noMatchError(t);throw t})},n.prototype.match=function(n){var t=this,e=this.expandSegmentGroup(this.ngModule,this.config,n.root,Pd),l=Pe.call(e,function(e){return t.createUrlTree(e,n.queryParams,n.fragment)});return Te.call(l,function(n){if(n instanceof ah)throw t.noMatchError(n);throw n})},n.prototype.noMatchError=function(n){return new Error("Cannot match any routes. URL Segment: '"+n.segmentGroup+"'")},n.prototype.createUrlTree=function(n,t,e){var l,r=n.segments.length>0?new Gd([],((l={})[Pd]=n,l)):n;return new Ud(r,t,e)},n.prototype.expandSegmentGroup=function(n,t,e,l){return 0===e.segments.length&&e.hasChildren()?Pe.call(this.expandChildren(n,t,e),function(n){return new Gd([],n)}):this.expandSegment(n,e,t,e.segments,l,!0)},n.prototype.expandChildren=function(n,t,e){var l=this;return function(e,r){if(0===Object.keys(e).length)return Object(Fe.a)({});var i=[],o=[],s={};Bd(e,function(e,r){var a=Pe.call(l.expandSegmentGroup(n,t,e,r),function(n){return s[r]=n});r===Pd?i.push(a):o.push(a)});var a=cd.call(Fe.a.apply(void 0,i.concat(o))),u=hd.call(a);return Pe.call(u,function(){return s})}(e.children)},n.prototype.expandSegment=function(n,t,e,l,r,i){var o=this,s=Fe.a.apply(void 0,e),a=Pe.call(s,function(s){var a=o.expandSegmentAgainstRoute(n,t,e,s,l,r,i);return Te.call(a,function(n){if(n instanceof ah)return Object(Fe.a)(null);throw n})}),u=cd.call(a),c=$e.call(u,function(n){return!!n});return Te.call(c,function(n,e){if(n instanceof Ke||"EmptyError"===n.name){if(o.noLeftoversInUrl(t,l,r))return Object(Fe.a)(new Gd([],{}));throw new ah(t)}throw n})},n.prototype.noLeftoversInUrl=function(n,t,e){return 0===t.length&&!n.children[e]},n.prototype.expandSegmentAgainstRoute=function(n,t,e,l,r,i,o){return gh(l)!==i?ch(t):void 0===l.redirectTo?this.matchSegmentAgainstRoute(n,t,l,r):o&&this.allowRedirects?this.expandSegmentAgainstRouteUsingRedirect(n,t,e,l,r,i):ch(t)},n.prototype.expandSegmentAgainstRouteUsingRedirect=function(n,t,e,l,r,i){return"**"===l.path?this.expandWildCardWithParamsAgainstRouteUsingRedirect(n,e,l,i):this.expandRegularSegmentAgainstRouteUsingRedirect(n,t,e,l,r,i)},n.prototype.expandWildCardWithParamsAgainstRouteUsingRedirect=function(n,t,e,l){var r=this,i=this.applyRedirectCommands([],e.redirectTo,{});return e.redirectTo.startsWith("/")?dh(i):tl.call(this.lineralizeSegments(e,i),function(e){var i=new Gd(e,{});return r.expandSegment(n,i,t,e,l,!1)})},n.prototype.expandRegularSegmentAgainstRouteUsingRedirect=function(n,t,e,l,r,i){var o=this,s=fh(t,l,r),a=s.consumedSegments,u=s.lastChild,c=s.positionalParamSegments;if(!s.matched)return ch(t);var d=this.applyRedirectCommands(a,l.redirectTo,c);return l.redirectTo.startsWith("/")?dh(d):tl.call(this.lineralizeSegments(l,d),function(l){return o.expandSegment(n,t,e,l.concat(r.slice(u)),i,!1)})},n.prototype.matchSegmentAgainstRoute=function(n,t,e,l){var r=this;if("**"===e.path)return e.loadChildren?Pe.call(this.configLoader.load(n.injector,e),function(n){return e._loadedConfig=n,new Gd(l,{})}):Object(Fe.a)(new Gd(l,{}));var o=fh(t,e,l),s=o.consumedSegments,a=o.lastChild;if(!o.matched)return ch(t);var u=l.slice(a),c=this.getChildConfig(n,e);return tl.call(c,function(n){var e=n.module,l=n.routes,o=function(n,t,e,l){return e.length>0&&function(n,t,e){return l.some(function(e){return mh(n,t,e)&&gh(e)!==Pd})}(n,e)?{segmentGroup:_h(new Gd(t,function(n,t){var e={};e[Pd]=t;for(var l=0,r=n;l1||!l.children[Pd])return hh(n.redirectTo);l=l.children[Pd]}},n.prototype.applyRedirectCommands=function(n,t,e){return this.applyRedirectCreatreUrlTree(t,this.urlSerializer.parse(t),n,e)},n.prototype.applyRedirectCreatreUrlTree=function(n,t,e,l){var r=this.createSegmentGroup(n,t.root,e,l);return new Ud(r,this.createQueryParams(t.queryParams,this.urlTree.queryParams),t.fragment)},n.prototype.createQueryParams=function(n,t){var e={};return Bd(n,function(n,l){if("string"==typeof n&&n.startsWith(":")){var r=n.substring(1);e[l]=t[r]}else e[l]=n}),e},n.prototype.createSegmentGroup=function(n,t,e,l){var r=this,i=this.createSegments(n,t.segments,e,l),o={};return Bd(t.children,function(t,i){o[i]=r.createSegmentGroup(n,t,e,l)}),new Gd(i,o)},n.prototype.createSegments=function(n,t,e,l){var r=this;return t.map(function(t){return t.path.startsWith(":")?r.findPosParam(n,t,l):r.findOrReturn(t,e)})},n.prototype.findPosParam=function(n,t,e){var l=e[t.path.substring(1)];if(!l)throw new Error("Cannot redirect to '"+n+"'. Cannot find '"+t.path+"'.");return l},n.prototype.findOrReturn=function(n,t){for(var e=0,l=0,r=t;l0)?{matched:!1,consumedSegments:[],lastChild:0,positionalParamSegments:{}}:{matched:!0,consumedSegments:[],lastChild:0,positionalParamSegments:{}};var l=(t.matcher||Ed)(e,n,t);return l?{matched:!0,consumedSegments:l.consumed,lastChild:l.consumed.length,positionalParamSegments:l.posParams}:{matched:!1,consumedSegments:[],lastChild:0,positionalParamSegments:{}}}function _h(n){if(1===n.numberOfChildren&&n.children[Pd]){var t=n.children[Pd];return new Gd(n.segments.concat(t.segments),t.children)}return n}function mh(n,t,e){return(!(n.hasChildren()||t.length>0)||"full"!==e.pathMatch)&&""===e.path&&void 0!==e.redirectTo}function gh(n){return n.outlet||Pd}var yh=function(){function n(n){this._root=n}return Object.defineProperty(n.prototype,"root",{get:function(){return this._root.value},enumerable:!0,configurable:!0}),n.prototype.parent=function(n){var t=this.pathFromRoot(n);return t.length>1?t[t.length-2]:null},n.prototype.children=function(n){var t=bh(n,this._root);return t?t.children.map(function(n){return n.value}):[]},n.prototype.firstChild=function(n){var t=bh(n,this._root);return t&&t.children.length>0?t.children[0].value:null},n.prototype.siblings=function(n){var t=vh(n,this._root);return t.length<2?[]:t[t.length-2].children.map(function(n){return n.value}).filter(function(t){return t!==n})},n.prototype.pathFromRoot=function(n){return vh(n,this._root).map(function(n){return n.value})},n}();function bh(n,t){if(n===t.value)return t;for(var e=0,l=t.children;e=1;){var r=e[l],o=e[l-1];if(r.routeConfig&&""===r.routeConfig.path)l--;else{if(o.component)break;l--}}return function(n){return n.reduce(function(n,t){return{params:Object(i.__assign)({},n.params,t.params),data:Object(i.__assign)({},n.data,t.data),resolve:Object(i.__assign)({},n.resolve,t._resolvedData)}},{params:{},data:{},resolve:{}})}(e.slice(l))}var Oh=function(){function n(n,t,e,l,r,i,o,s,a,u,c){this.url=n,this.params=t,this.queryParams=e,this.fragment=l,this.data=r,this.outlet=i,this.component=o,this.routeConfig=s,this._urlSegment=a,this._lastPathIndex=u,this._resolve=c}return Object.defineProperty(n.prototype,"root",{get:function(){return this._routerState.root},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"parent",{get:function(){return this._routerState.parent(this)},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"firstChild",{get:function(){return this._routerState.firstChild(this)},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"children",{get:function(){return this._routerState.children(this)},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"pathFromRoot",{get:function(){return this._routerState.pathFromRoot(this)},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"paramMap",{get:function(){return this._paramMap||(this._paramMap=Ad(this.params)),this._paramMap},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"queryParamMap",{get:function(){return this._queryParamMap||(this._queryParamMap=Ad(this.queryParams)),this._queryParamMap},enumerable:!0,configurable:!0}),n.prototype.toString=function(){return"Route(url:'"+this.url.map(function(n){return n.toString()}).join("/")+"', path:'"+(this.routeConfig?this.routeConfig.path:"")+"')"},n}(),Th=function(n){function t(t,e){var l=n.call(this,e)||this;return l.url=t,Lh(l,e),l}return Object(i.__extends)(t,n),t.prototype.toString=function(){return Ph(this._root)},t}(yh);function Lh(n,t){t.value._routerState=n,t.children.forEach(function(t){return Lh(n,t)})}function Ph(n){var t=n.children.length>0?" { "+n.children.map(Ph).join(", ")+" } ":"";return""+n.value+t}function Dh(n){if(n.snapshot){var t=n.snapshot,e=n._futureSnapshot;n.snapshot=e,Hd(t.queryParams,e.queryParams)||n.queryParams.next(e.queryParams),t.fragment!==e.fragment&&n.fragment.next(e.fragment),Hd(t.params,e.params)||n.params.next(e.params),function(n,t){if(n.length!==t.length)return!1;for(var e=0;e0&&Eh(e[0]))throw new Error("Root segment cannot have matrix parameters");var l=e.find(function(n){return"object"==typeof n&&null!=n&&n.outlets});if(l&&l!==Fd(e))throw new Error("{outlets:{}} has to be the last command")}return n.prototype.toRoot=function(){return this.isAbsolute&&1===this.commands.length&&"/"==this.commands[0]},n}(),Ih=function(n,t,e){this.segmentGroup=n,this.processChildren=t,this.index=e};function Rh(n){return"object"==typeof n&&null!=n&&n.outlets?n.outlets[Pd]:""+n}function Hh(n,t,e){if(n||(n=new Gd([],{})),0===n.segments.length&&n.hasChildren())return Nh(n,t,e);var l=function(n,t,e){for(var l=0,r=t,i={match:!1,pathIndex:0,commandIndex:0};r=e.length)return i;var o=n.segments[r],s=Rh(e[l]),a=l0&&void 0===s)break;if(s&&a&&"object"==typeof a&&void 0===a.outlets){if(!Wh(s,a,o))return i;l+=2}else{if(!Wh(s,{},o))return i;l++}r++}return{match:!0,pathIndex:r,commandIndex:l}}(n,t,e),r=e.slice(l.commandIndex);if(l.match&&l.pathIndex=2?Object(pc.a)(n,t)(this):Object(pc.a)(n)(this)}).call(l,function(n,t){return n})},n.prototype.isDeactivating=function(){return 0!==this.canDeactivateChecks.length},n.prototype.isActivating=function(){return 0!==this.canActivateChecks.length},n.prototype.setupChildRouteGuards=function(n,t,e,l){var r=this,i=xh(t);n.children.forEach(function(n){r.setupRouteGuards(n,i[n.value.outlet],e,l.concat([n.value])),delete i[n.value.outlet]}),Bd(i,function(n,t){return r.deactivateRouteAndItsChildren(n,e.getContext(t))})},n.prototype.setupRouteGuards=function(n,t,e,l){var r=n.value,i=t?t.value:null,o=e?e.getContext(n.value.outlet):null;if(i&&r.routeConfig===i.routeConfig){var s=this.shouldRunGuardsAndResolvers(i,r,r.routeConfig.runGuardsAndResolvers);s?this.canActivateChecks.push(new zh(l)):(r.data=i.data,r._resolvedData=i._resolvedData),this.setupChildRouteGuards(n,t,r.component?o?o.children:null:e,l),s&&this.canDeactivateChecks.push(new Uh(o.outlet.component,i))}else i&&this.deactivateRouteAndItsChildren(t,o),this.canActivateChecks.push(new zh(l)),this.setupChildRouteGuards(n,null,r.component?o?o.children:null:e,l)},n.prototype.shouldRunGuardsAndResolvers=function(n,t,e){switch(e){case"always":return!0;case"paramsOrQueryParamsChange":return!Ah(n,t)||!Hd(n.queryParams,t.queryParams);case"paramsChange":default:return!Ah(n,t)}},n.prototype.deactivateRouteAndItsChildren=function(n,t){var e=this,l=xh(n),r=n.value;Bd(l,function(n,l){e.deactivateRouteAndItsChildren(n,r.component?t?t.children.getContext(l):null:t)}),this.canDeactivateChecks.push(new Uh(r.component&&t&&t.outlet&&t.outlet.isActivated?t.outlet.component:null,r))},n.prototype.runCanDeactivateChecks=function(){var n=this,t=xs(this.canDeactivateChecks),e=tl.call(t,function(t){return n.runCanDeactivate(t.component,t.route)});return dd.call(e,function(n){return!0===n})},n.prototype.runCanActivateChecks=function(){var n=this,t=xs(this.canActivateChecks),e=va.call(t,function(t){return Vd(xs([n.fireChildActivationStart(t.route.parent),n.fireActivationStart(t.route),n.runCanActivateChild(t.path),n.runCanActivate(t.route)]))});return dd.call(e,function(n){return!0===n})},n.prototype.fireActivationStart=function(n){return null!==n&&this.forwardEvent&&this.forwardEvent(new Td(n)),Object(Fe.a)(!0)},n.prototype.fireChildActivationStart=function(n){return null!==n&&this.forwardEvent&&this.forwardEvent(new Sd(n)),Object(Fe.a)(!0)},n.prototype.runCanActivate=function(n){var t=this,e=n.routeConfig?n.routeConfig.canActivate:null;return e&&0!==e.length?Vd(Pe.call(xs(e),function(e){var l,r=t.getToken(e,n);return l=Wd(r.canActivate?r.canActivate(n,t.future):r(n,t.future)),$e.call(l)})):Object(Fe.a)(!0)},n.prototype.runCanActivateChild=function(n){var t=this,e=n[n.length-1],l=n.slice(0,n.length-1).reverse().map(function(n){return t.extractCanActivateChild(n)}).filter(function(n){return null!==n});return Vd(Pe.call(xs(l),function(n){return Vd(Pe.call(xs(n.guards),function(l){var r,i=t.getToken(l,n.node);return r=Wd(i.canActivateChild?i.canActivateChild(e,t.future):i(e,t.future)),$e.call(r)}))}))},n.prototype.extractCanActivateChild=function(n){var t=n.routeConfig?n.routeConfig.canActivateChild:null;return t&&0!==t.length?{node:n,guards:t}:null},n.prototype.runCanDeactivate=function(n,t){var e=this,l=t&&t.routeConfig?t.routeConfig.canDeactivate:null;if(!l||0===l.length)return Object(Fe.a)(!0);var r=tl.call(xs(l),function(l){var r,i=e.getToken(l,t);return r=Wd(i.canDeactivate?i.canDeactivate(n,t,e.curr,e.future):i(n,t,e.curr,e.future)),$e.call(r)});return dd.call(r,function(n){return!0===n})},n.prototype.runResolve=function(n,t){return Pe.call(this.resolveNode(n._resolve,n),function(e){return n._resolvedData=e,n.data=Object(i.__assign)({},n.data,Sh(n,t).resolve),null})},n.prototype.resolveNode=function(n,t){var e=this,l=Object.keys(n);if(0===l.length)return Object(Fe.a)({});if(1===l.length){var r=l[0];return Pe.call(this.getResolver(n[r],t),function(n){return(t={})[r]=n,t;var t})}var i={},o=tl.call(xs(l),function(l){return Pe.call(e.getResolver(n[l],t),function(n){return i[l]=n,n})});return Pe.call(hd.call(o),function(){return i})},n.prototype.getResolver=function(n,t){var e=this.getToken(n,t);return Wd(e.resolve?e.resolve(t,this.future):e(t,this.future))},n.prototype.getToken=function(n,t){var e=function(n){if(!n)return null;for(var t=n.parent;t;t=t.parent){var e=t.routeConfig;if(e&&e._loadedConfig)return e._loadedConfig}return null}(t);return(e?e.module.injector:this.moduleInjector).get(n)},n}(),qh=function(){},Jh=function(){function n(n,t,e,l,r){this.rootComponentType=n,this.config=t,this.urlTree=e,this.url=l,this.paramsInheritanceStrategy=r}return n.prototype.recognize=function(){try{var n=Xh(this.urlTree.root,[],[],this.config).segmentGroup,t=this.processSegmentGroup(this.config,n,Pd),e=new Oh([],Object.freeze({}),Object.freeze(this.urlTree.queryParams),this.urlTree.fragment,{},Pd,this.rootComponentType,null,this.urlTree.root,-1,{}),l=new wh(e,t),r=new Th(this.url,l);return this.inheritParamsAndData(r._root),Object(Fe.a)(r)}catch(n){return new o.a(function(t){return t.error(n)})}},n.prototype.inheritParamsAndData=function(n){var t=this,e=n.value,l=Sh(e,this.paramsInheritanceStrategy);e.params=Object.freeze(l.params),e.data=Object.freeze(l.data),n.children.forEach(function(n){return t.inheritParamsAndData(n)})},n.prototype.processSegmentGroup=function(n,t,e){return 0===t.segments.length&&t.hasChildren()?this.processChildren(n,t):this.processSegment(n,t,t.segments,e)},n.prototype.processChildren=function(n,t){var e,l=this,r=Qd(t,function(t,e){return l.processSegmentGroup(n,t,e)});return e={},r.forEach(function(n){var t=e[n.value.outlet];if(t){var l=t.url.map(function(n){return n.toString()}).join("/"),r=n.value.url.map(function(n){return n.toString()}).join("/");throw new Error("Two segments cannot have the same outlet name: '"+l+"' and '"+r+"'.")}e[n.value.outlet]=n.value}),r.sort(function(n,t){return n.value.outlet===Pd?-1:t.value.outlet===Pd?1:n.value.outlet.localeCompare(t.value.outlet)}),r},n.prototype.processSegment=function(n,t,e,l){for(var r=0,i=n;r0?Fd(e).parameters:{};r=new Oh(e,a,Object.freeze(this.urlTree.queryParams),this.urlTree.fragment,np(n),l,n.component,n,Qh(t),Kh(t)+e.length,tp(n))}else{var u=function(n,t,e){if(""===t.path){if("full"===t.pathMatch&&(n.hasChildren()||e.length>0))throw new qh;return{consumedSegments:[],lastChild:0,parameters:{}}}var l=(t.matcher||Ed)(e,n,t);if(!l)throw new qh;var r={};Bd(l.posParams,function(n,t){r[t]=n.path});var o=l.consumed.length>0?Object(i.__assign)({},r,l.consumed[l.consumed.length-1].parameters):r;return{consumedSegments:l.consumed,lastChild:l.consumed.length,parameters:o}}(t,n,e);o=u.consumedSegments,s=e.slice(u.lastChild),r=new Oh(o,u.parameters,Object.freeze(this.urlTree.queryParams),this.urlTree.fragment,np(n),l,n.component,n,Qh(t),Kh(t)+o.length,tp(n))}var c=function(n){return n.children?n.children:n.loadChildren?n._loadedConfig.routes:[]}(n),d=Xh(t,o,s,c),h=d.segmentGroup,p=d.slicedSegments;if(0===p.length&&h.hasChildren()){var f=this.processChildren(c,h);return[new wh(r,f)]}if(0===c.length&&0===p.length)return[new wh(r,[])];var _=this.processSegment(c,h,p,Pd);return[new wh(r,_)]},n}();function Qh(n){for(var t=n;t._sourceSegment;)t=t._sourceSegment;return t}function Kh(n){for(var t=n,e=t._segmentIndexShift?t._segmentIndexShift:0;t._sourceSegment;)e+=(t=t._sourceSegment)._segmentIndexShift?t._segmentIndexShift:0;return e-1}function Xh(n,t,e,l){if(e.length>0&&function(n,t,e){return l.some(function(e){return Zh(n,t,e)&&$h(e)!==Pd})}(n,e)){var r=new Gd(t,function(n,t,e,l){var r={};r[Pd]=l,l._sourceSegment=n,l._segmentIndexShift=t.length;for(var i=0,o=e;i0)||"full"!==e.pathMatch)&&""===e.path&&void 0===e.redirectTo}function $h(n){return n.outlet||Pd}function np(n){return n.data||{}}function tp(n){return n.resolve||{}}var ep=function(){},lp=function(){function n(){}return n.prototype.shouldDetach=function(n){return!1},n.prototype.store=function(n,t){},n.prototype.shouldAttach=function(n){return!1},n.prototype.retrieve=function(n){return null},n.prototype.shouldReuseRoute=function(n,t){return n.routeConfig===t.routeConfig},n}(),rp=new l.r("ROUTES"),ip=function(){function n(n,t,e,l){this.loader=n,this.compiler=t,this.onLoadStartListener=e,this.onLoadEndListener=l}return n.prototype.load=function(n,t){var e=this;this.onLoadStartListener&&this.onLoadStartListener(t);var l=this.loadModuleFactory(t.loadChildren);return Pe.call(l,function(l){e.onLoadEndListener&&e.onLoadEndListener(t);var r=l.create(n);return new Yd(Nd(r.injector.get(rp)),r)})},n.prototype.loadModuleFactory=function(n){var t=this;return"string"==typeof n?Ui(this.loader.load(n)):tl.call(Wd(n()),function(n){return n instanceof l.x?Object(Fe.a)(n):Ui(t.compiler.compileModuleAsync(n))})},n}(),op=function(){},sp=function(){function n(){}return n.prototype.shouldProcessUrl=function(n){return!0},n.prototype.extract=function(n){return n},n.prototype.merge=function(n,t){return n},n}();function ap(n){throw n}function up(n){return Object(Fe.a)(null)}var cp=function(){function n(n,t,e,r,i,o,s,a){var u=this;this.rootComponentType=n,this.urlSerializer=t,this.rootContexts=e,this.location=r,this.config=a,this.navigations=new Tl(null),this.navigationId=0,this.events=new yl.a,this.errorHandler=ap,this.navigated=!1,this.hooks={beforePreactivation:up,afterPreactivation:up},this.urlHandlingStrategy=new sp,this.routeReuseStrategy=new lp,this.onSameUrlNavigation="ignore",this.paramsInheritanceStrategy="emptyOnly",this.ngModule=i.get(l.z),this.resetConfig(a),this.currentUrlTree=new Ud(new Gd([],{}),{},null),this.rawUrlTree=this.currentUrlTree,this.configLoader=new ip(o,s,function(n){return u.triggerEvent(new kd(n))},function(n){return u.triggerEvent(new Cd(n))}),this.routerState=kh(this.currentUrlTree,this.rootComponentType),this.processNavigations()}return n.prototype.resetRootComponentType=function(n){this.rootComponentType=n,this.routerState.root.component=this.rootComponentType},n.prototype.initialNavigation=function(){this.setUpLocationChangeListener(),0===this.navigationId&&this.navigateByUrl(this.location.path(!0),{replaceUrl:!0})},n.prototype.setUpLocationChangeListener=function(){var n=this;this.locationSubscription||(this.locationSubscription=this.location.subscribe(Zone.current.wrap(function(t){var e=n.urlSerializer.parse(t.url),l="popstate"===t.type?"popstate":"hashchange";setTimeout(function(){n.scheduleNavigation(e,l,{replaceUrl:!0})},0)})))},Object.defineProperty(n.prototype,"url",{get:function(){return this.serializeUrl(this.currentUrlTree)},enumerable:!0,configurable:!0}),n.prototype.triggerEvent=function(n){this.events.next(n)},n.prototype.resetConfig=function(n){jd(n),this.config=n,this.navigated=!1},n.prototype.ngOnDestroy=function(){this.dispose()},n.prototype.dispose=function(){this.locationSubscription&&(this.locationSubscription.unsubscribe(),this.locationSubscription=null)},n.prototype.createUrlTree=function(n,t){void 0===t&&(t={});var e=t.relativeTo,r=t.queryParams,o=t.fragment,s=t.preserveQueryParams,a=t.queryParamsHandling,u=t.preserveFragment;Object(l.Y)()&&s&&console&&console.warn&&console.warn("preserveQueryParams is deprecated, use queryParamsHandling instead.");var c=e||this.routerState.root,d=u?this.currentUrlTree.fragment:o,h=null;if(a)switch(a){case"merge":h=Object(i.__assign)({},this.currentUrlTree.queryParams,r);break;case"preserve":h=this.currentUrlTree.queryParams;break;default:h=r||null}else h=s?this.currentUrlTree.queryParams:r||null;return null!==h&&(h=this.removeEmptyProps(h)),function(n,t,e,l,r){if(0===e.length)return Yh(t.root,t.root,t,l,r);var i=function(n){if("string"==typeof n[0]&&1===n.length&&"/"===n[0])return new jh(!0,0,n);var t=0,e=!1,l=n.reduce(function(n,l,r){if("object"==typeof l&&null!=l){if(l.outlets){var i={};return Bd(l.outlets,function(n,t){i[t]="string"==typeof n?n.split("/"):n}),n.concat([{outlets:i}])}if(l.segmentPath)return n.concat([l.segmentPath])}return"string"!=typeof l?n.concat([l]):0===r?(l.split("/").forEach(function(l,r){0==r&&"."===l||(0==r&&""===l?e=!0:".."===l?t++:""!=l&&n.push(l))}),n):n.concat([l])},[]);return new jh(e,t,l)}(e);if(i.toRoot())return Yh(t.root,new Gd([],{}),t,l,r);var o=function(n,e,l){if(n.isAbsolute)return new Ih(t.root,!0,0);if(-1===l.snapshot._lastPathIndex)return new Ih(l.snapshot._urlSegment,!0,0);var r=Eh(n.commands[0])?0:1;return function(t,e,i){for(var o=l.snapshot._urlSegment,s=l.snapshot._lastPathIndex+r,a=n.numberOfDoubleDots;a>s;){if(a-=s,!(o=o.parent))throw new Error("Invalid number of '../'");s=o.segments.length}return new Ih(o,!1,s-a)}()}(i,0,n),s=o.processChildren?Nh(o.segmentGroup,o.index,i.commands):Hh(o.segmentGroup,o.index,i.commands);return Yh(o.segmentGroup,s,t,l,r)}(c,this.currentUrlTree,n,h,d)},n.prototype.navigateByUrl=function(n,t){void 0===t&&(t={skipLocationChange:!1});var e=n instanceof Ud?n:this.parseUrl(n),l=this.urlHandlingStrategy.merge(e,this.rawUrlTree);return this.scheduleNavigation(l,"imperative",t)},n.prototype.navigate=function(n,t){return void 0===t&&(t={skipLocationChange:!1}),function(n){for(var t=0;t0?(this.currentQrContent+=n+"amount="+this.form.get("coins").value,n="&"):this.invalidCoins=!0);var e=this.form.get("hours").value;e&&(Number.parseInt(e).toString()===e&&Number.parseInt(e)>0?(this.currentQrContent+=n+"hours="+this.form.get("hours").value,n="&"):this.invalidHours=!0);var l=this.form.get("note").value;l&&(this.currentQrContent+=n+"message="+encodeURIComponent(l)),this.updateQrCode()},n.prototype.updateQrCode=function(){this.qr.nativeElement.innerHTML="",new QRCode(this.qr.nativeElement,{text:this.currentQrContent,width:this.defaultQrConfig.size,height:this.defaultQrConfig.size,colorDark:this.defaultQrConfig.colordark,colorLight:this.defaultQrConfig.colorlight,useSVG:this.defaultQrConfig.usesvg,correctLevel:QRCode.CorrectLevel[this.defaultQrConfig.level]})},n}(),Jp=function(){function n(n,t,e){var l=this;this.walletService=n,this.route=t,this.dialog=e,t.queryParams.subscribe(function(n){l.wallets=null,l.lastRouteParams=n,l.walletService.startDataRefreshSubscription()}),n.all().subscribe(function(){return l.loadData()})}return n.prototype.ngOnDestroy=function(){this.outputsSubscription.unsubscribe()},n.prototype.loadData=function(){var n=this,t=this.lastRouteParams.addr;this.outputsSubscription=this.walletService.outputsWithWallets().subscribe(function(e){n.wallets=e.map(function(n){return Object.assign({},n)}).map(function(n){return n.addresses=n.addresses.filter(function(n){if(n.outputs.length>0)return!t||n.address===t}),n}).filter(function(n){return n.addresses.length>0})})},n.prototype.showQrCode=function(n,t){n.stopPropagation(),qp.openDialog(this.dialog,{address:t})},n}(),Qp=function(n){function t(t,e){void 0===t&&(t=0),void 0===e&&(e=sl),n.call(this),this.period=t,this.scheduler=e,(!el(t)||t<0)&&(this.period=0),e&&"function"==typeof e.schedule||(this.scheduler=sl)}return Object(i.__extends)(t,n),t.create=function(n,e){return void 0===n&&(n=0),void 0===e&&(e=sl),new t(n,e)},t.dispatch=function(n){var t=n.subscriber,e=n.period;t.next(n.index),t.closed||(n.index+=1,this.schedule(n,e))},t.prototype._subscribe=function(n){var e=this.period;n.add(this.scheduler.schedule(t.dispatch,e,{index:0,subscriber:n,period:e}))},t}(o.a),Kp=function(){function n(n){this.blockchainService=n,this.subscriptionsGroup=[]}return n.prototype.ngOnInit=function(){var n=this;this.subscriptionsGroup.push(Qp.create(5e3).switchMap(function(){return n.blockchainService.lastBlock()}).subscribe(function(t){return n.block=t})),this.subscriptionsGroup.push(Qp.create(5e3).switchMap(function(){return n.blockchainService.coinSupply()}).subscribe(function(t){return n.coinSupply=t}))},n.prototype.ngOnDestroy=function(){this.subscriptionsGroup.forEach(function(n){return n.unsubscribe()})},n}(),Xp=function(){function n(n,t){this.data=n,this.dialogRef=t}return n.prototype.ngOnDestroy=function(){this.data.seed=null},n}(),Zp=function(){function n(n,t,e,l){var r=this;this.data=n,this.dialogRef=t,this.msgBarService=e,this.translateService=l,this.passwordSubmit=new yl.a,this.working=!1,this.subscriptions=[],this.data=Object.assign({confirm:!1,description:null,warning:!1,title:null,wallet:null},n||{}),this.translateService.get(["errors.incorrect-password","errors.api-disabled","errors.no-wallet"]).subscribe(function(n){r.errors=n})}return n.prototype.ngOnInit=function(){var n=this;this.form=new Fo({},this.validateForm.bind(this)),this.form.addControl("password",new No("")),this.form.addControl("confirm_password",new No("")),["password","confirm_password"].forEach(function(t){n.subscriptions.push(n.form.get(t).valueChanges.subscribe(function(){2===n.button.state&&n.button.resetState()}))}),this.data.confirm?this.form.get("confirm_password").enable():this.form.get("confirm_password").disable(),this.data.description&&this.dialogRef.updateSize("400px")},n.prototype.ngOnDestroy=function(){this.msgBarService.hide(),this.form.get("password").setValue(""),this.form.get("confirm_password").setValue(""),this.passwordSubmit.complete(),this.subscriptions.forEach(function(n){return n.unsubscribe()})},n.prototype.proceed=function(){this.form.valid&&!this.button.isLoading()&&(this.msgBarService.hide(),this.button.setLoading(),this.working=!0,this.passwordSubmit.next({password:this.form.get("password").value,close:this.close.bind(this),error:this.error.bind(this)}))},n.prototype.validateForm=function(){if(this.form&&this.form.get("password")&&this.form.get("confirm_password")){if(0===this.form.get("password").value.length)return{Required:!0};if(this.data.confirm&&this.form.get("password").value!==this.form.get("confirm_password").value)return{NotEqual:!0}}return null},n.prototype.close=function(){this.dialogRef.close()},n.prototype.error=function(n){if("object"==typeof n)if(n.status)switch(n.status){case 400:n=Oc(n._body);break;case 401:n=this.errors["errors.incorrect-password"];break;case 403:n=this.errors["errors.api-disabled"];break;case 404:n=this.errors["errors.no-wallet"];break;default:n=this.errors["errors.error-decrypting"]}else n=this.errors["errors.error-decrypting"];this.msgBarService.showError(n=n||this.errors["errors.error-decrypting"]),this.button.resetState(),this.working=!1},n}(),$p=function(){function n(n,t){this.walletService=n,this.dialog=t,this.wallets=[]}return n.prototype.ngOnInit=function(){var n=this;this.walletService.folder().subscribe(function(t){return n.folder=t}),this.walletSubscription=this.walletService.all().subscribe(function(t){n.wallets=t})},n.prototype.ngOnDestroy=function(){this.walletSubscription.unsubscribe()},Object.defineProperty(n.prototype,"onlyEncrypted",{get:function(){return this.wallets.filter(function(n){return n.encrypted})},enumerable:!0,configurable:!0}),n.prototype.showSeed=function(n){var t=this,e=new oa;e.data={wallet:n},this.dialog.open(Zp,e).componentInstance.passwordSubmit.subscribe(function(e){t.walletService.getWalletSeed(n,e.password).subscribe(function(n){e.close();var l=new oa;l.width="566px",l.data={seed:n},t.dialog.open(Xp,l)},function(n){return e.error(n)})})},n}(),nf=function(){function n(n,t){this.apiService=n,this.ngZone=t,this.noConnections=!1,this.automaticPeers=new Tl([]),this.loadData()}return n.prototype.automatic=function(){return this.automaticPeers.asObservable()},n.prototype.retrieveDefaultConnections=function(){return this.apiService.get("network/defaultConnections").map(function(n){return n.map(function(n,t){return{id:t+1,address:n,listen_port:6e3}})})},n.prototype.loadData=function(){var n=this;this.retrieveConnections().subscribe(function(t){return n.automaticPeers.next(t)}),this.ngZone.runOutsideAngular(function(){Qp.create(5e3).flatMap(function(){return n.retrieveConnections()}).subscribe(function(t){return n.ngZone.run(function(){n.automaticPeers.next(t)})})})},n.prototype.retrieveConnections=function(){var n=this;return this.apiService.get("network/connections").map(function(t){return null===t.connections||0===t.connections.length?(n.noConnections=!0,[]):(n.noConnections=!1,t.connections.sort(function(n,t){return n.id-t.id}))})},n}(),tf=function(){function n(n){this.networkService=n}return n.prototype.ngOnInit=function(){var n=this;this.subscription=this.networkService.retrieveDefaultConnections().subscribe(function(t){n.subscription=n.networkService.automatic().subscribe(function(e){n.peers=e.map(function(n){return n.source=t.find(function(t){return t.address===n.address})?"default":"exchange",n}).sort(function(n,t){return n.address.localeCompare(t.address)})})})},n.prototype.ngOnDestroy=function(){this.subscription.unsubscribe()},n}(),ef=function(){function n(n,t){this.httpClient=n,this.walletService=t,this.configSubject=new Tl(null),this.purchaseOrders=new Tl([]),this.purchaseUrl=r.tellerUrl,this.getConfig()}return n.prototype.all=function(){return this.purchaseOrders.asObservable()},n.prototype.config=function(){return this.configSubject.asObservable()},n.prototype.getConfig=function(){var n=this;return this.get("config").map(function(n){return{enabled:!0,sky_btc_exchange_rate:parseFloat(n.sky_btc_exchange_rate)}}).subscribe(function(t){return n.configSubject.next(t)})},n.prototype.generate=function(n){var t=this;return this.walletService.addAddress(n,1).flatMap(function(e){return t.post("bind",{skyaddr:e[0].address,coin_type:"BTC"}).map(function(t){return{coin_type:t.coin_type,deposit_address:t.deposit_address,filename:n.filename,recipient_address:e[0].address,status:"waiting_deposit"}})})},n.prototype.scan=function(n){return this.get("status?skyaddr="+n).map(function(n){if(!n.statuses||n.statuses.length>1)throw new Error("too many purchase orders found");return n.statuses[0]})},n.prototype.get=function(n){return this.httpClient.get(this.purchaseUrl+n)},n.prototype.post=function(n,t){return void 0===t&&(t={}),this.httpClient.post(this.purchaseUrl+n,t)},n}(),lf=function(){function n(n,t,e,l){this.formBuilder=n,this.purchaseService=t,this.msgBarService=e,this.walletService=l,this.subscriptionsGroup=[]}return n.prototype.ngOnInit=function(){this.initForm(),this.loadData()},n.prototype.ngOnDestroy=function(){this.subscriptionsGroup.forEach(function(n){return n.unsubscribe()})},n.prototype.checkStatus=function(){var n=this;this.button.setLoading(),this.purchaseService.scan(this.order.recipient_address).subscribe(function(t){n.button.setSuccess(),n.order.status=t.status},function(t){return n.button.setError(t)})},n.prototype.removeOrder=function(){window.localStorage.removeItem("purchaseOrder"),this.order=null},n.prototype.initForm=function(){var n=this;this.form=this.formBuilder.group({wallet:["",Xi.required]}),this.subscriptionsGroup.push(this.form.get("wallet").valueChanges.subscribe(function(t){var e=n.wallets.find(function(n){return n.filename===t});console.log("changing wallet value",t),n.purchaseService.generate(e).subscribe(function(t){return n.saveData(t)},function(t){return n.msgBarService.showError(t.toString())})}))},n.prototype.loadConfig=function(){var n=this;this.purchaseService.config().filter(function(n){return!!n&&!!n.sky_btc_exchange_rate}).first().subscribe(function(t){return n.config=t})},n.prototype.loadData=function(){var n=this;this.loadConfig(),this.loadOrder(),this.subscriptionsGroup.push(this.walletService.all().subscribe(function(t){n.wallets=t,n.order&&n.form.get("wallet").setValue(n.order.filename,{emitEvent:!1})}))},n.prototype.loadOrder=function(){var n=JSON.parse(window.localStorage.getItem("purchaseOrder"));n&&(this.order=n,this.updateOrder())},n.prototype.saveData=function(n){this.order=n,window.localStorage.setItem("purchaseOrder",JSON.stringify(n))},n.prototype.updateOrder=function(){var n=this;this.purchaseService.scan(this.order.recipient_address).first().subscribe(function(t){return n.order.status=t.status},function(n){return console.log(n)})},n}(),rf=function(){function n(n,t){this.http=n,this.ngZone=t,this.PRICE_API_ID="sky-skycoin",this.price=new Tl(null),this.updatePeriod=6e5,this.startTimer()}return n.prototype.startTimer=function(n){var t=this;void 0===n&&(n=0),this.timerSubscriptions&&this.timerSubscriptions.forEach(function(n){return n.unsubscribe()}),this.timerSubscriptions=[],this.ngZone.runOutsideAngular(function(){t.timerSubscriptions.push(o.a.timer(t.updatePeriod,t.updatePeriod).subscribe(function(){t.ngZone.run(function(){return t.lastPriceSubscription?null:t.loadPrice()})}))}),this.timerSubscriptions.push(o.a.of(1).delay(n).subscribe(function(){t.ngZone.run(function(){return t.loadPrice()})}))},n.prototype.loadPrice=function(){var n=this;this.PRICE_API_ID&&(this.lastPriceSubscription&&this.lastPriceSubscription.unsubscribe(),this.lastPriceSubscription=this.http.get("https://api.coinpaprika.com/v1/tickers/"+this.PRICE_API_ID+"?quotes=USD").subscribe(function(t){n.lastPriceSubscription=null,n.price.next(t.quotes.USD.price)},function(){return n.startTimer(3e4)}))},n}(),of=function(){function n(n,t){this.transaction=n,this.dialogRef=t}return n.prototype.closePopup=function(){this.dialogRef.close()},n}(),sf=function(){function n(n,t,e,l,r){var i=this;this.dialog=n,this.priceService=t,this.walletService=e,this.formBuilder=l,this.transactionsLoaded=!1,this.form=this.formBuilder.group({filter:[[]]}),this.routeSubscription=r.queryParams.subscribe(function(n){i.requestedAddress=n.addr?n.addr:"",i.showRequestedAddress()}),this.walletsSubscription=e.all().delay(1).flatMap(function(n){if(i.wallets)return i.walletService.transactions().first();i.wallets=[];var t=!1;return n.forEach(function(n){n.coins&&n.hours&&!t?(i.wallets.push({label:n.label,coins:n.coins.decimalPlaces(6).toString(),hours:n.hours.decimalPlaces(0).toString(),addresses:[],allAddressesSelected:!1}),n.addresses.forEach(function(n){n.coins&&n.hours&&!t?i.wallets[i.wallets.length-1].addresses.push({address:n.address,coins:n.coins.decimalPlaces(6).toString(),hours:n.hours.decimalPlaces(0).toString(),showingWholeWallet:!1}):t=!0})):t=!0}),t?(i.wallets=null,o.a.of(null)):i.walletService.transactions().first()}).subscribe(function(n){n&&(i.allTransactions=n,i.transactionsLoaded=!0,i.showRequestedAddress(),i.filterTransactions())})}return n.prototype.ngOnInit=function(){var n=this;this.priceSubscription=this.priceService.price.subscribe(function(t){return n.price=t}),this.filterSubscription=this.form.get("filter").valueChanges.subscribe(function(){return n.filterTransactions()})},n.prototype.ngOnDestroy=function(){this.priceSubscription.unsubscribe(),this.filterSubscription.unsubscribe(),this.walletsSubscription.unsubscribe(),this.routeSubscription.unsubscribe()},n.prototype.showTransaction=function(n){var t=new oa;t.width="800px",t.data=n,this.dialog.open(of,t)},n.prototype.showQrCode=function(n,t){n.stopPropagation(),qp.openDialog(this.dialog,{address:t})},n.prototype.removeFilters=function(){this.form.get("filter").setValue([])},n.prototype.filterTransactions=function(){var n=this.form.get("filter").value;if(this.wallets.forEach(function(n){n.allAddressesSelected=!1,n.addresses.forEach(function(n){return n.showingWholeWallet=!1})}),0===n.length)this.transactions=this.allTransactions;else{var t=new Map;n.forEach(function(n){n.addresses?(n.addresses.forEach(function(n){return t.set(n.address,!0)}),n.allAddressesSelected=!0,n.addresses.forEach(function(n){return n.showingWholeWallet=!0})):t.set(n.address,!0)}),this.transactions=this.allTransactions.filter(function(n){return n.inputs.some(function(n){return t.has(n.owner)})||n.outputs.some(function(n){return t.has(n.dst)})})}},n.prototype.showRequestedAddress=function(){var n,t=this;this.transactionsLoaded&&this.wallets&&0!==this.wallets.length&&null!==this.requestedAddress&&void 0!==this.requestedAddress&&(""!==this.requestedAddress?(this.wallets.forEach(function(e){var l=e.addresses.find(function(n){return n.address===t.requestedAddress});l&&(n=l)}),n&&this.form.get("filter").setValue([n])):this.form.get("filter").setValue([]),this.requestedAddress=null)},n}(),af=function(){function n(n,t){this.walletService=n,this.router=t}return n.prototype.canActivate=function(n,t){var e=this;return new Promise(function(n){e.walletService.all().first().subscribe(function(t){return 0===t.length?(e.router.navigate(["/wizard"]),n(!1)):n(!0)})})},n}(),uf=function(){function n(n){this.formBuilder=n,this.onPasswordCreated=new l.o,this.onBack=new l.o}return n.prototype.ngOnInit=function(){this.initEncryptForm()},n.prototype.initEncryptForm=function(){this.form=this.formBuilder.group({password:new No("",Xi.compose([Xi.required,Xi.minLength(2)])),confirm:new No("",Xi.compose([Xi.required,Xi.minLength(2)]))},{validator:this.passwordMatchValidator.bind(this)})},n.prototype.setEncrypt=function(n){n.checked?this.form.enable():this.form.disable()},n.prototype.emitCreatedPassword=function(){this.form.enabled&&!this.form.valid||this.button.isLoading()||(this.button.setLoading(),this.onPasswordCreated.emit(this.form.enabled?this.form.get("password").value:null))},n.prototype.emitBack=function(){this.onBack.emit()},n.prototype.resetButton=function(){this.button.resetState()},Object.defineProperty(n.prototype,"isWorking",{get:function(){return this.button.isLoading()},enumerable:!0,configurable:!0}),n.prototype.passwordMatchValidator=function(n){return n.get("password").value===n.get("confirm").value?null:{mismatch:!0}},n}(),cf=function(){function n(n,t,e,l,r){this.router=n,this.walletService=t,this.languageService=e,this.dialog=l,this.msgBarService=r,this.step=1}return n.prototype.ngOnInit=function(){var n=this;this.subscription=this.languageService.currentLanguage.subscribe(function(t){return n.language=t})},n.prototype.ngOnDestroy=function(){this.subscription.unsubscribe()},n.prototype.onLabelAndSeedCreated=function(n){this.formData=n,this.step=2},n.prototype.onPasswordCreated=function(n){this.password=n,this.createWallet()},n.prototype.onBack=function(){this.step=1},n.prototype.changelanguage=function(){var n=this;zc(this.dialog).subscribe(function(t){t&&n.languageService.changeLanguage(t)})},Object.defineProperty(n.prototype,"fill",{get:function(){return this.formData},enumerable:!0,configurable:!0}),n.prototype.createWallet=function(){var n=this;this.walletService.create(this.formData.label,this.formData.seed,100,this.password).subscribe(function(){n.router.navigate(["/wallets"])},function(t){n.msgBarService.showError(t),n.encryptForm.resetButton()})},n}(),df=function(){function n(n,t,e,l,r){var i=this;this.formBuilder=n,this.route=t,this.router=e,this.walletService=l,this.msgBarService=r,this.done=!1,this.hideBarWhenClosing=!0,this.initForm(""),this.subscription=o.a.zip(this.route.params,this.walletService.all(),function(n,t){var e=t.find(function(t){return t.filename===n.id});e?(i.wallet=e,i.initForm(e.label)):setTimeout(function(){return i.router.navigate([""],{skipLocationChange:!0})})}).subscribe()}return n.prototype.ngOnDestroy=function(){this.subscription.unsubscribe(),this.hideBarWhenClosing&&this.msgBarService.hide()},n.prototype.initForm=function(n){var t=[];t.push(this.passwordMatchValidator.bind(this)),this.form=new Fo({},t),this.form.addControl("wallet",new No(n)),this.form.addControl("seed",new No("",[Xi.required])),this.form.addControl("password",new No),this.form.addControl("confirm",new No)},n.prototype.reset=function(){var n=this;!this.form.valid||this.resetButton.isLoading()||this.done||(this.msgBarService.hide(),this.resetButton.setLoading(),this.walletService.resetPassword(this.wallet,this.form.value.seed,""!==this.form.value.password?this.form.value.password:null).subscribe(function(){n.resetButton.setSuccess(),n.resetButton.setDisabled(),n.done=!0,n.hideBarWhenClosing=!1,n.msgBarService.showDone("reset.done"),setTimeout(function(){n.router.navigate([""])},2e3)},function(t){n.resetButton.resetState(),n.msgBarService.showError(t)}))},n.prototype.passwordMatchValidator=function(){return this.form&&this.form.get("password")&&this.form.get("confirm")&&this.form.get("password").value===this.form.get("confirm").value?null:{NotEqual:!0}},n}();o.a.prototype.repeatWhen=function(n){return function(n){return function(t){return t.lift(new fc(n))}}(n)(this)};var hf=this&&this.__assign||Object.assign||function(n){for(var t,e=1,l=arguments.length;e-1},n.prototype.post=function(n,t,e){var l=this;return this.http.post(this.buildUrl(n),t,{responseType:"json",headers:new Ma(hf({"api-key":this.API_KEY,Accept:"application/json"},e))}).catch(function(n){return l.apiService.processConnectionError(n)})},n.prototype.buildUrl=function(n){return this.TEST_MODE&&"trading_pairs"!==n?this.API_ENDPOINT+"sandbox/"+n:this.API_ENDPOINT+"/"+n},n.prototype.storeOrder=function(n,t){var e=this;return this.history().catch(function(n){try{if(n._body){var t=JSON.parse(n._body);if(t&&t.error&&404===t.error.code)return o.a.of([])}}catch(n){}return o.a.throw(n)}).flatMap(function(l){return e.storeOrderEntry(l,n,t)})},n.prototype.storeOrderEntry=function(n,t,e){var l={id:t.id,pair:t.pair,fromAmount:t.fromAmount,toAmount:t.toAmount,address:t.toAddress,timestamp:zp().unix(),price:e};n.push(l);var r=JSON.stringify(n);return n.pop(),this.storageService.store(ec.CLIENT,this.STORAGE_KEY,r).do(function(){return n.push(l)})},n}(),ff=function(){function n(n,t,e){this.dialogRef=n,this.blockchainService=t,this.exchangeService=e}return n.prototype.ngOnInit=function(){var n=this;this.exchangeService.history().subscribe(function(t){return n.orders=t.reverse()},function(){return n.orders=[]})},n.prototype.closePopup=function(){this.dialogRef.close()},n.prototype.select=function(n){this.dialogRef.close(n)},n.prototype.getFromCoin=function(n){return n.split("/")[0].toUpperCase()},n.prototype.getToCoin=function(n){return n.split("/")[1].toUpperCase()},n}(),_f=function(){function n(n,t){this.exchangeService=n,this.dialog=t,this.hasHistory=!1,this.loading=!0}return n.prototype.ngOnInit=function(){var n=this;this.lastViewedSubscription=this.exchangeService.lastViewedOrderLoaded.subscribe(function(t){if(t){var e=n.exchangeService.lastViewedOrder;e&&(n.currentOrderDetails=e),setTimeout(function(){return n.lastViewedSubscription.unsubscribe()}),n.loading=!1}}),this.historySubscription=this.exchangeService.history().subscribe(function(){return n.hasHistory=!0})},n.prototype.ngOnDestroy=function(){this.lastViewedSubscription.unsubscribe(),this.historySubscription.unsubscribe()},n.prototype.showStatus=function(n){this.currentOrderDetails=n,this.hasHistory=!0},n.prototype.showHistory=function(n){var t=this;n.preventDefault();var e=new oa;e.width="566px",e.autoFocus=!1,this.dialog.open(ff,e).afterClosed().subscribe(function(n){n&&(t.currentOrderDetails=n)})},n.prototype.goBack=function(){this.currentOrderDetails=null,this.exchangeService.lastViewedOrder=null},n}(),mf=function(){};o.a.prototype.takeWhile=function(n){return function(n){return function(t){return t.lift(new vc(n))}}(n)(this)};var gf=function(){function n(n,t){this.apiService=n,this.http=t,this.fullCoinName=" ",this.coinName=" ",this.hoursName=" ",this.hoursNameSingular=" ",this.explorerUrl=" ",this.burnRateInternal=new Ee.a(.5),this.updateAvailableInternal=!1,this.lastestVersionInternal=""}return Object.defineProperty(n.prototype,"burnRate",{get:function(){return this.burnRateInternal},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"updateAvailable",{get:function(){return this.updateAvailableInternal},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"lastestVersion",{get:function(){return this.lastestVersionInternal},enumerable:!0,configurable:!0}),n.prototype.testBackend=function(){var n=this;this.apiService.get("health").subscribe(function(t){n.version=t.version,n.detectUpdateAvailable(),n.burnRateInternal=new Ee.a(t.user_verify_transaction.burn_factor),n.fullCoinName=t.fiber.display_name,n.coinName=t.fiber.ticker,n.hoursName=t.fiber.coin_hours_display_name,n.hoursNameSingular=t.fiber.coin_hours_display_name_singular,n.explorerUrl=t.fiber.explorer_url,n.explorerUrl.endsWith("/")&&(n.explorerUrl=n.explorerUrl.substr(0,n.explorerUrl.length-1)),t.csrf_enabled||(n.error=3)},function(){return n.error=2})},n.prototype.detectUpdateAvailable=function(){var n=this;Ll.urlForVersionChecking&&this.http.get(Ll.urlForVersionChecking).retryWhen(function(n){return n.delay(3e4)}).subscribe(function(t){n.lastestVersionInternal=t.text().trim(),n.lastestVersionInternal.startsWith("v")&&(n.lastestVersionInternal=n.lastestVersionInternal.substr(1)),n.updateAvailableInternal=function(t,e){for(var l=n.lastestVersionInternal.split("."),r=t.split("-"),i=r[0].split("."),o=0;o<3;o++){var s=Number(l[o]),a=Number(i[o]);if(s>a)return!0;if(s0&&t<10?this.addNumber(t.toString()):8===n.keyCode?this.removeNumber():13===n.keyCode&&this.sendPin()},t.prototype.addNumber=function(n){var t=this.form.value.pin;t.length<8&&this.form.get("pin").setValue(t+n)},t.prototype.removeNumber=function(){var n=this.form.value.pin;this.form.get("pin").setValue(n.substring(0,n.length-1))},t.prototype.sendPin=function(){this.form.valid&&this.dialogRef.close(this.form.value.pin)},t}(Kc),vf=function(n){function t(t,e,l){var r=n.call(this,l,e)||this;return r.data=t,r.dialogRef=e,r}return Object(i.__extends)(t,n),t}(Kc),wf=function(){function n(n,t,e,l,r,i,o,s,a){this.appService=n,this.languageService=t,this.bip38WordList=o,this.dialog=s,this.msgBarService=a,r.requestPinComponent=bf,i.requestWordComponent=Hc,l.signTransactionConfirmationComponent=vf,e.initialLoadFailed.subscribe(function(n){n&&window.location.assign("assets/error-alert/index.html?2")})}return n.prototype.ngOnInit=function(){var n=this;this.appService.testBackend(),this.languageService.loadLanguageSettings();var t=this.languageService.selectedLanguageLoaded.subscribe(function(e){e||zc(n.dialog,!0).subscribe(function(t){t&&n.languageService.changeLanguage(t)}),t.unsubscribe(),n.msgBarService.msgBarComponent=n.msgBar})},n}(),xf=l._7({encapsulation:2,styles:[".mat-dialog-container{box-shadow:0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12);display:block;padding:24px;border-radius:2px;box-sizing:border-box;overflow:auto;outline:0;width:100%;height:100%}@media screen and (-ms-high-contrast:active){.mat-dialog-container{outline:solid 1px}}.mat-dialog-content{display:block;margin:0 -24px;padding:0 24px;max-height:65vh;overflow:auto;-webkit-overflow-scrolling:touch;-webkit-backface-visibility:hidden;backface-visibility:hidden}.mat-dialog-title{margin:0 0 20px;display:block}.mat-dialog-actions{padding:12px 0;display:flex;flex-wrap:wrap}.mat-dialog-actions:last-child{margin-bottom:-24px}.mat-dialog-actions[align=end]{justify-content:flex-end}.mat-dialog-actions[align=center]{justify-content:center}.mat-dialog-actions .mat-button+.mat-button,.mat-dialog-actions .mat-button+.mat-raised-button,.mat-dialog-actions .mat-raised-button+.mat-button,.mat-dialog-actions .mat-raised-button+.mat-raised-button{margin-left:8px}[dir=rtl] .mat-dialog-actions .mat-button+.mat-button,[dir=rtl] .mat-dialog-actions .mat-button+.mat-raised-button,[dir=rtl] .mat-dialog-actions .mat-raised-button+.mat-button,[dir=rtl] .mat-dialog-actions .mat-raised-button+.mat-raised-button{margin-left:0;margin-right:8px}"],data:{animation:[{type:7,name:"slideDialog",definitions:[{type:0,name:"enter",styles:{type:6,styles:{transform:"none",opacity:1},offset:null},options:void 0},{type:0,name:"void",styles:{type:6,styles:{transform:"translate3d(0, 25%, 0) scale(0.9)",opacity:0},offset:null},options:void 0},{type:0,name:"exit",styles:{type:6,styles:{transform:"translate3d(0, 25%, 0)",opacity:0},offset:null},options:void 0},{type:1,expr:"* => *",animation:{type:4,styles:null,timings:"400ms cubic-bezier(0.25, 0.8, 0.25, 1)"},options:null}],options:{}}]}});function Mf(n){return l._33(0,[(n()(),l._4(0,null,null,0))],null,null)}function kf(n){return l._33(0,[l._29(402653184,1,{_portalOutlet:0}),(n()(),l._4(16777216,null,null,1,null,Mf)),l._8(2,212992,[[1,4]],0,oi,[l.j,l.R],{portal:[0,"portal"]},null)],function(n,t){n(t,2,0,"")},null)}var Cf=l._5("mat-dialog-container",aa,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"mat-dialog-container",[["class","mat-dialog-container"],["tabindex","-1"]],[[1,"role",0],[1,"aria-labelledby",0],[1,"aria-label",0],[1,"aria-describedby",0],[40,"@slideDialog",0]],[["component","@slideDialog.start"],["component","@slideDialog.done"]],function(n,t,e){var r=!0;return"component:@slideDialog.start"===t&&(r=!1!==l._22(n,1)._onAnimationStart(e)&&r),"component:@slideDialog.done"===t&&(r=!1!==l._22(n,1)._onAnimationDone(e)&&r),r},kf,xf)),l._8(1,49152,null,0,aa,[l.l,kr,l.h,[2,sn]],null,null)],null,function(n,t){n(t,0,0,null==l._22(t,1)._config?null:l._22(t,1)._config.role,null!=l._22(t,1)._config&&l._22(t,1)._config.ariaLabel?null:l._22(t,1)._ariaLabelledBy,null==l._22(t,1)._config?null:l._22(t,1)._config.ariaLabel,(null==l._22(t,1)._config?null:l._22(t,1)._config.ariaDescribedBy)||null,l._22(t,1)._state)})},{},{},[]),Sf=l._7({encapsulation:2,styles:[".mat-tooltip-panel{pointer-events:none!important}.mat-tooltip{color:#fff;border-radius:2px;margin:14px;max-width:250px;padding-left:8px;padding-right:8px}@media screen and (-ms-high-contrast:active){.mat-tooltip{outline:solid 1px}}"],data:{animation:[{type:7,name:"state",definitions:[{type:0,name:"initial, void, hidden",styles:{type:6,styles:{transform:"scale(0)"},offset:null},options:void 0},{type:0,name:"visible",styles:{type:6,styles:{transform:"scale(1)"},offset:null},options:void 0},{type:1,expr:"* => visible",animation:{type:4,styles:null,timings:"150ms cubic-bezier(0.0, 0.0, 0.2, 1)"},options:null},{type:1,expr:"* => hidden",animation:{type:4,styles:null,timings:"150ms cubic-bezier(0.4, 0.0, 1, 1)"},options:null}],options:{}}]}});function Of(n){return l._33(2,[(n()(),l._9(0,0,null,null,2,"div",[["class","mat-tooltip"]],[[4,"transform-origin",null],[24,"@state",0]],[[null,"@state.start"],[null,"@state.done"]],function(n,t,e){var l=!0,r=n.component;return"@state.start"===t&&(l=!1!==r._animationStart()&&l),"@state.done"===t&&(l=!1!==r._animationDone(e)&&l),l},null,null)),l._8(1,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),(n()(),l._31(2,null,["",""]))],function(n,t){n(t,1,0,"mat-tooltip",t.component.tooltipClass)},function(n,t){var e=t.component;n(t,0,0,e._transformOrigin,e._visibility),n(t,2,0,e.message)})}var Tf=l._5("mat-tooltip-component",Ru,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"mat-tooltip-component",[["aria-hidden","true"]],[[4,"zoom",null]],[["body","click"]],function(n,t,e){var r=!0;return"body:click"===t&&(r=!1!==l._22(n,1)._handleBodyInteraction()&&r),r},Of,Sf)),l._8(1,49152,null,0,Ru,[l.h],null,null)],null,function(n,t){n(t,0,0,"visible"===l._22(t,1)._visibility?1:null)})},{},{},[]),Lf=l._7({encapsulation:2,styles:[".mat-progress-spinner{display:block;position:relative}.mat-progress-spinner svg{position:absolute;transform:rotate(-90deg);top:0;left:0;transform-origin:center;overflow:visible}.mat-progress-spinner circle{fill:transparent;transform-origin:center;transition:stroke-dashoffset 225ms linear}.mat-progress-spinner.mat-progress-spinner-indeterminate-animation[mode=indeterminate]{animation:mat-progress-spinner-linear-rotate 2s linear infinite}.mat-progress-spinner.mat-progress-spinner-indeterminate-animation[mode=indeterminate] circle{transition-property:stroke;animation-duration:4s;animation-timing-function:cubic-bezier(.35,0,.25,1);animation-iteration-count:infinite}.mat-progress-spinner.mat-progress-spinner-indeterminate-fallback-animation[mode=indeterminate]{animation:mat-progress-spinner-stroke-rotate-fallback 10s cubic-bezier(.87,.03,.33,1) infinite}.mat-progress-spinner.mat-progress-spinner-indeterminate-fallback-animation[mode=indeterminate] circle{transition-property:stroke}@keyframes mat-progress-spinner-linear-rotate{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}@keyframes mat-progress-spinner-stroke-rotate-100{0%{stroke-dashoffset:268.60617px;transform:rotate(0)}12.5%{stroke-dashoffset:56.54867px;transform:rotate(0)}12.51%{stroke-dashoffset:56.54867px;transform:rotateX(180deg) rotate(72.5deg)}25%{stroke-dashoffset:268.60617px;transform:rotateX(180deg) rotate(72.5deg)}25.1%{stroke-dashoffset:268.60617px;transform:rotate(270deg)}37.5%{stroke-dashoffset:56.54867px;transform:rotate(270deg)}37.51%{stroke-dashoffset:56.54867px;transform:rotateX(180deg) rotate(161.5deg)}50%{stroke-dashoffset:268.60617px;transform:rotateX(180deg) rotate(161.5deg)}50.01%{stroke-dashoffset:268.60617px;transform:rotate(180deg)}62.5%{stroke-dashoffset:56.54867px;transform:rotate(180deg)}62.51%{stroke-dashoffset:56.54867px;transform:rotateX(180deg) rotate(251.5deg)}75%{stroke-dashoffset:268.60617px;transform:rotateX(180deg) rotate(251.5deg)}75.01%{stroke-dashoffset:268.60617px;transform:rotate(90deg)}87.5%{stroke-dashoffset:56.54867px;transform:rotate(90deg)}87.51%{stroke-dashoffset:56.54867px;transform:rotateX(180deg) rotate(341.5deg)}100%{stroke-dashoffset:268.60617px;transform:rotateX(180deg) rotate(341.5deg)}}@keyframes mat-progress-spinner-stroke-rotate-fallback{0%{transform:rotate(0)}25%{transform:rotate(1170deg)}50%{transform:rotate(2340deg)}75%{transform:rotate(3510deg)}100%{transform:rotate(4680deg)}}"],data:{}});function Pf(n){return l._33(2,[(n()(),l._9(0,0,null,null,1,":svg:svg",[["focusable","false"],["preserveAspectRatio","xMidYMid meet"]],[[4,"width","px"],[4,"height","px"],[1,"viewBox",0]],null,null,null,null)),(n()(),l._9(1,0,null,null,0,":svg:circle",[["cx","50%"],["cy","50%"]],[[1,"r",0],[4,"animation-name",null],[4,"stroke-dashoffset","px"],[4,"stroke-dasharray","px"],[4,"stroke-width","%"]],null,null,null,null))],null,function(n,t){var e=t.component;n(t,0,0,e._elementSize,e._elementSize,e._viewBox),n(t,1,0,e._circleRadius,"mat-progress-spinner-stroke-rotate-"+e.diameter,e._strokeDashOffset,e._strokeCircumference,e._circleStrokeWidth)})}var Df=l._7({encapsulation:2,styles:[".mat-menu-panel{min-width:112px;max-width:280px;overflow:auto;-webkit-overflow-scrolling:touch;max-height:calc(100vh - 48px);border-radius:2px;outline:0}.mat-menu-panel:not([class*=mat-elevation-z]){box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.mat-menu-panel.mat-menu-after.mat-menu-below{transform-origin:left top}.mat-menu-panel.mat-menu-after.mat-menu-above{transform-origin:left bottom}.mat-menu-panel.mat-menu-before.mat-menu-below{transform-origin:right top}.mat-menu-panel.mat-menu-before.mat-menu-above{transform-origin:right bottom}[dir=rtl] .mat-menu-panel.mat-menu-after.mat-menu-below{transform-origin:right top}[dir=rtl] .mat-menu-panel.mat-menu-after.mat-menu-above{transform-origin:right bottom}[dir=rtl] .mat-menu-panel.mat-menu-before.mat-menu-below{transform-origin:left top}[dir=rtl] .mat-menu-panel.mat-menu-before.mat-menu-above{transform-origin:left bottom}.mat-menu-panel.ng-animating{pointer-events:none}@media screen and (-ms-high-contrast:active){.mat-menu-panel{outline:solid 1px}}.mat-menu-content{padding-top:8px;padding-bottom:8px}.mat-menu-item{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;outline:0;border:none;-webkit-tap-highlight-color:transparent;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;line-height:48px;height:48px;padding:0 16px;text-align:left;text-decoration:none;position:relative}.mat-menu-item[disabled]{cursor:default}[dir=rtl] .mat-menu-item{text-align:right}.mat-menu-item .mat-icon{margin-right:16px}[dir=rtl] .mat-menu-item .mat-icon{margin-left:16px;margin-right:0}.mat-menu-item .mat-icon{vertical-align:middle}.mat-menu-item-submenu-trigger{padding-right:32px}.mat-menu-item-submenu-trigger::after{width:0;height:0;border-style:solid;border-width:5px 0 5px 5px;border-color:transparent transparent transparent currentColor;content:'';display:inline-block;position:absolute;top:50%;right:16px;transform:translateY(-50%)}[dir=rtl] .mat-menu-item-submenu-trigger{padding-right:8px;padding-left:32px}[dir=rtl] .mat-menu-item-submenu-trigger::after{right:auto;left:16px;transform:rotateY(180deg) translateY(-50%)}button.mat-menu-item{width:100%}.mat-menu-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}"],data:{animation:[{type:7,name:"transformMenu",definitions:[{type:0,name:"void",styles:{type:6,styles:{opacity:0,transform:"scale(0.01, 0.01)"},offset:null},options:void 0},{type:0,name:"enter-start",styles:{type:6,styles:{opacity:1,transform:"scale(1, 0.5)"},offset:null},options:void 0},{type:0,name:"enter",styles:{type:6,styles:{transform:"scale(1, 1)"},offset:null},options:void 0},{type:1,expr:"void => enter-start",animation:{type:4,styles:null,timings:"100ms linear"},options:null},{type:1,expr:"enter-start => enter",animation:{type:4,styles:null,timings:"300ms cubic-bezier(0.25, 0.8, 0.25, 1)"},options:null},{type:1,expr:"* => void",animation:{type:4,styles:{type:6,styles:{opacity:0},offset:null},timings:"150ms 50ms linear"},options:null}],options:{}},{type:7,name:"fadeInItems",definitions:[{type:0,name:"showing",styles:{type:6,styles:{opacity:1},offset:null},options:void 0},{type:1,expr:"void => *",animation:[{type:6,styles:{opacity:0},offset:null},{type:4,styles:null,timings:"400ms 100ms cubic-bezier(0.55, 0, 0.55, 0.2)"}],options:null}],options:{}}]}});function Af(n){return l._33(0,[(n()(),l._9(0,0,null,null,3,"div",[["class","mat-menu-panel"],["role","menu"],["tabindex","-1"]],[[24,"@transformMenu",0]],[[null,"keydown"],[null,"click"],[null,"@transformMenu.done"]],function(n,t,e){var l=!0,r=n.component;return"keydown"===t&&(l=!1!==r._handleKeydown(e)&&l),"click"===t&&(l=!1!==r.closed.emit("click")&&l),"@transformMenu.done"===t&&(l=!1!==r._onAnimationDone(e)&&l),l},null,null)),l._8(1,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),(n()(),l._9(2,0,null,null,1,"div",[["class","mat-menu-content"]],[[24,"@fadeInItems",0]],null,null,null,null)),l._21(null,0)],function(n,t){n(t,1,0,"mat-menu-panel",t.component._classList)},function(n,t){n(t,0,0,t.component._panelAnimationState),n(t,2,0,"showing")})}function Ef(n){return l._33(2,[l._29(402653184,1,{templateRef:0}),(n()(),l._4(0,[[1,2]],null,0,null,Af))],null,null)}var Yf=l._7({encapsulation:2,styles:[],data:{}});function jf(n){return l._33(2,[l._21(null,0),(n()(),l._9(1,0,null,null,1,"div",[["class","mat-menu-ripple mat-ripple"],["matRipple",""]],[[2,"mat-ripple-unbounded",null]],null,null,null,null)),l._8(2,212992,null,0,ir,[l.l,l.B,Hl,[2,rr]],{disabled:[0,"disabled"],trigger:[1,"trigger"]},null)],function(n,t){var e=t.component;n(t,2,0,e.disableRipple||e.disabled,e._getHostElement())},function(n,t){n(t,1,0,l._22(t,2).unbounded)})}var If=function(){function n(n,t,e){this.decimalPipe=n,this.blockchainService=t,this.appService=e}return n.prototype.transform=function(n,t,e){void 0===t&&(t=!0),void 0===e&&(e="");var l="";return"last"!==e&&(l=this.decimalPipe.transform(n,t?"1.0-"+this.blockchainService.currentMaxDecimals:"1.0-0"),"first"!==e&&(l+=" ")),"first"!==e&&(l+=t?this.appService.coinName:1===Number(n)||-1===Number(n)?this.appService.hoursNameSingular:this.appService.hoursName),l},n}(),Rf=l._7({encapsulation:2,styles:[".mat-icon{background-repeat:no-repeat;display:inline-block;fill:currentColor;height:24px;width:24px}"],data:{}});function Hf(n){return l._33(2,[l._21(null,0)],null,null)}var Nf=function(){function n(n,t,e){this.data=n,this.dialogRef=t,this.msgBarService=e}return n.prototype.ngOnInit=function(){this.form=new Fo({}),this.form.addControl("quantity",new No(1,[this.validateQuantity]))},n.prototype.ngOnDestroy=function(){this.msgBarService.hide()},n.prototype.closePopup=function(){this.dialogRef.close()},n.prototype.continue=function(){var n=this;this.button.isLoading()||(this.msgBarService.hide(),this.button.setLoading(),this.data(this.form.value.quantity,function(t,e){void 0===e&&(e=!1),n.button.resetState(),e?n.msgBarService.showError("wallet.add-addresses.error"):t&&n.closePopup()}))},n.prototype.validateQuantity=function(n){return n.value<1||n.value>100||Number(n.value)!==Math.round(Number(n.value))?{invalid:!0}:null},n}(),Ff=function(n){function t(t,e,l,r){var i=n.call(this,l,e)||this;return i.data=t,i.dialogRef=e,i.hwWalletService=l,i.walletService=r,i.operationSubscription=i.hwWalletService.confirmAddress(t.addressIndex).subscribe(function(){i.showResult({text:t.showCompleteConfirmation?"hardware-wallet.confirm-address.confirmation":"hardware-wallet.confirm-address.short-confirmation",icon:i.msgIcons.Success}),i.data.address.confirmed=!0,i.walletService.saveHardwareWallets()},function(n){return i.processResult(n.result)}),i}return Object(i.__extends)(t,n),t}(Kc),Bf=function(){function n(n,t,e,l,r,i,o){this.dialog=n,this.walletService=t,this.msgBarService=e,this.hwWalletService=l,this.translateService=r,this.router=i,this.apiService=o,this.confirmingIndex=null,this.creatingAddress=!1,this.preparingToEdit=!1}return n.prototype.ngOnDestroy=function(){this.msgBarService.hide(),this.editSubscription&&this.editSubscription.unsubscribe(),this.confirmSubscription&&this.confirmSubscription.unsubscribe(),this.txHistorySubscription&&this.txHistorySubscription.unsubscribe()},n.prototype.editWallet=function(){var n=this;if(this.msgBarService.hide(),this.wallet.isHardware){if(this.preparingToEdit)return;this.preparingToEdit=!0,this.editSubscription=this.hwWalletService.checkIfCorrectHwConnected(this.wallet.addresses[0].address).flatMap(function(){return n.walletService.getHwFeaturesAndUpdateData(n.wallet)}).subscribe(function(t){n.continueEditWallet(),n.preparingToEdit=!1,t.walletNameUpdated&&n.msgBarService.showWarning("hardware-wallet.general.name-updated")},function(t){n.msgBarService.showError(Tc(n.translateService,t)),n.preparingToEdit=!1})}else this.continueEditWallet()},n.prototype.newAddress=function(){var n=this;if(!this.creatingAddress)if(this.wallet.isHardware&&this.wallet.addresses.length>=Ll.maxHardwareWalletAddresses)Wc(this.dialog,{text:"wallet.max-hardware-wallets-error",headerText:"errors.error",confirmButtonText:"confirmation.close"});else if(this.msgBarService.hide(),this.wallet.isHardware)this.howManyAddresses=1,this.continueNewAddress();else{var t=new oa;t.width="566px",t.data=function(t,e){n.howManyAddresses=t;var l=0;n.wallet.addresses.forEach(function(n,t){n.coins.isGreaterThan(0)&&(l=t)}),n.wallet.addresses.length-(l+1)+t<20?(e(!0),n.continueNewAddress()):n.txHistorySubscription=n.apiService.getTransactions(n.wallet.addresses).first().subscribe(function(l){var r=new Map;l.forEach(function(n){n.outputs.forEach(function(n){r.has(n.dst)||r.set(n.dst,!0)})});var i=0;n.wallet.addresses.forEach(function(n,t){r.has(n.address)&&(i=t)}),n.wallet.addresses.length-(i+1)+t<20?(e(!0),n.continueNewAddress()):Wc(n.dialog,{text:"wallet.add-many-confirmation",headerText:"confirmation.header-text",confirmButtonText:"confirmation.confirm-button",cancelButtonText:"confirmation.cancel-button"}).afterClosed().subscribe(function(t){t?(e(!0),n.continueNewAddress()):e(!1)})},function(){return e(!1,!0)})},this.dialog.open(Nf,t)}},n.prototype.toggleEmpty=function(){this.wallet.hideEmpty=!this.wallet.hideEmpty},n.prototype.deleteWallet=function(){var n=this;this.msgBarService.hide();var t={text:this.translateService.instant("wallet.delete-confirmation",{name:this.wallet.label}),headerText:"confirmation.header-text",checkboxText:"wallet.delete-confirmation-check",confirmButtonText:"confirmation.confirm-button",cancelButtonText:"confirmation.cancel-button"};Wc(this.dialog,t).afterClosed().subscribe(function(t){t&&n.walletService.deleteHardwareWallet(n.wallet).subscribe(function(t){t&&n.walletService.all().first().subscribe(function(t){0===t.length&&setTimeout(function(){return n.router.navigate(["/wizard"])},500)})})})},n.prototype.toggleEncryption=function(){var n=this,t=new oa;t.data={confirm:!this.wallet.encrypted,title:this.wallet.encrypted?"wallet.decrypt":"wallet.encrypt"},this.wallet.encrypted?(t.data.description="wallet.decrypt-warning",t.data.warning=!0,t.data.wallet=this.wallet):t.data.description="wallet.new.encrypt-warning",this.dialog.open(Zp,t).componentInstance.passwordSubmit.subscribe(function(t){n.walletService.toggleEncryption(n.wallet,t.password).subscribe(function(){t.close(),setTimeout(function(){return n.msgBarService.showDone("common.changes-made")})},function(n){return t.error(n)})})},n.prototype.confirmAddress=function(n,t,e){var l=this;null===this.confirmingIndex&&(this.confirmingIndex=t,this.msgBarService.hide(),this.confirmSubscription&&this.confirmSubscription.unsubscribe(),this.confirmSubscription=this.hwWalletService.checkIfCorrectHwConnected(this.wallet.addresses[0].address).subscribe(function(r){var i=new function(){};i.address=n,i.addressIndex=t,i.showCompleteConfirmation=e;var o=new oa;o.width="566px",o.autoFocus=!1,o.data=i,l.dialog.open(Ff,o),l.confirmingIndex=null},function(n){l.msgBarService.showError(Tc(l.translateService,n)),l.confirmingIndex=null}))},n.prototype.copyAddress=function(n,t,e){void 0===e&&(e=500),n.stopPropagation(),t.copying||(Uc(t.address),t.copying=!0,setTimeout(function(){t.copying=!1},e))},n.prototype.showQrCode=function(n,t){n.stopPropagation(),qp.openDialog(this.dialog,{address:t})},n.prototype.continueNewAddress=function(){var n=this;if(this.creatingAddress=!0,!this.wallet.isHardware&&this.wallet.encrypted){var t=new oa;t.data={wallet:this.wallet};var e=this.dialog.open(Zp,t);e.afterClosed().subscribe(function(){return n.creatingAddress=!1}),e.componentInstance.passwordSubmit.subscribe(function(t){n.walletService.addAddress(n.wallet,n.howManyAddresses,t.password).subscribe(function(){return t.close()},function(n){return t.error(n)})})}else(this.wallet.isHardware?this.hwWalletService.checkIfCorrectHwConnected(this.wallet.addresses[0].address).flatMap(function(){return n.walletService.addAddress(n.wallet,n.howManyAddresses)}):this.walletService.addAddress(this.wallet,this.howManyAddresses)).subscribe(function(){return n.creatingAddress=!1},function(t){n.msgBarService.showError(n.wallet.isHardware?Tc(n.translateService,t):t),n.creatingAddress=!1})},n.prototype.continueEditWallet=function(){var n=new oa;n.width="566px",n.data=new $c,n.data.wallet=this.wallet,this.dialog.open(nd,n)},n}(),Vf=l._7({encapsulation:0,styles:[[".-record[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;font-size:13px;padding:21px 20px 16px;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.-record[_ngcontent-%COMP%]:not(:last-of-type){border-bottom:1px solid rgba(30,34,39,.05)}.-record[_ngcontent-%COMP%] .id-column[_ngcontent-%COMP%]{width:50px;color:rgba(30,34,39,.5);-ms-flex-negative:0;flex-shrink:0}.-record[_ngcontent-%COMP%] .address-column[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.-record[_ngcontent-%COMP%] .address-column[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{display:inline-block;height:17px;vertical-align:middle;width:17px;margin-right:10px;-ms-flex-negative:0;flex-shrink:0}.-record[_ngcontent-%COMP%] .address-column[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{display:inline-block;margin:0;vertical-align:middle;word-break:break-all}.-record[_ngcontent-%COMP%] .address-column[_ngcontent-%COMP%] p[_ngcontent-%COMP%]:hover .copy-label[_ngcontent-%COMP%]{opacity:.999!important}.-record[_ngcontent-%COMP%] .truncated-address[_ngcontent-%COMP%]{max-width:60px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block;vertical-align:middle}.-record[_ngcontent-%COMP%] .hours-column[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);width:130px;text-align:right;-ms-flex-negative:0;flex-shrink:0}.-record[_ngcontent-%COMP%] .coins-column[_ngcontent-%COMP%]{color:#1e2227;width:130px;text-align:right;-ms-flex-negative:0;flex-shrink:0}.-record[_ngcontent-%COMP%] .options-column[_ngcontent-%COMP%]{width:80px;text-align:right;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;-ms-flex-negative:0;flex-shrink:0}.-record[_ngcontent-%COMP%] .options-column[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{cursor:pointer;color:rgba(97,109,125,.5)}.-record[_ngcontent-%COMP%] .options-column[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]:hover{color:#0072ff}.-record[_ngcontent-%COMP%] > img[_ngcontent-%COMP%]{display:inline-block;margin-left:0;height:32px;width:32px}.click-to-copy[_ngcontent-%COMP%]{cursor:pointer}.-actions[_ngcontent-%COMP%]{background-color:#fefefe;border-bottom:1px solid #eff0f0;display:-webkit-box;display:-ms-flexbox;display:flex;width:100%;-webkit-box-shadow:0 4px 10px rgba(0,0,0,.03)!important;box-shadow:0 4px 10px rgba(0,0,0,.03)!important;border-top-left-radius:0!important;border-top-right-radius:0!important;z-index:100;position:relative;padding:0!important}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%]{padding-right:20px;padding-left:0}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%]:first-child{padding-left:5px}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] .-enabled-span[_ngcontent-%COMP%]{cursor:pointer}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] .-enabled-span[_ngcontent-%COMP%]:hover{color:rgba(30,34,39,.5)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:#cecfd0;font-size:12px;height:60px;margin:0 5px;cursor:pointer;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span.-img[_ngcontent-%COMP%]::before{content:'';display:inline-block;height:32px;width:32px;margin-right:5px;background-repeat:no-repeat;background-size:32px 32px}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span.-new-address[_ngcontent-%COMP%]::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAANpSURBVHgB7ZndcdswDIBBOQO4G6gTxOzfa9IJmk6QdoK6E8TeIJkg6QRtJqj72l4qZ4JyBA8QiwUk2qVoWbJFyNdc8N3pbFIS+AcCIAQgCIIgCIIgCIIgCMJTQ8GByLJsiD9n2OSJBRjh/xSvobu9wMtgZ+Z4fwaQ32qtF3AAep8AHHia5zBWiTqHfwNuBTt2A2CnOBEGeqS3CShXPLmwYMcQgQJ1iRox7UsjepkAWnUL6juUas4Bbg/7tg9tSICZn1k2ahj8AjViusTB4ICev9AjRRf+f0Z1NrdX+Iypea+YUJINzLBqQMPKGxzgx9daz3aU8wHlXNTJ4dYEtgmgPY+dziDoNK74FarZZN89TPLQeE7QeH4KbtEkaC6bcARsJLhiNvVrSN1faj2BDrgBju+ybKFKbViRlm3BZ2CARQOc6v/x62jlcfDj7e/cn+MzaOGBBogacvxl27N3d9llqAlkQzi2AosRtBYmQZUhtW98Byzdp7ggdROxlSQpZBm/jmILYCB6Agp/r4ogZ025oq17NPX+NwZIJIuMaKUNDKxcdBkFhwacBWXTpM5dcR7En9ThcrnR9t5ETwCq/2mlnNtb6AkXJ6wZDNQJRBKvAUod+8U8gW/QEyh75pfdoSoKDjeYBgLnftmz9o379Xc2t0GVCb0Dyja2oe0ucNiAysBC4+dZ+33Z8A41bu+/MIJtxHSy95wAxwRUOklBkV/OwVLEZqCDXHx3GsgeNrXdBQ4bYMAzRg/lvjSr8iutb6BIblQJ9zydCqGdUU3bUcRrgLX3FYF51S1ygtFfxe+rwOB2IXoC8DA/q5Q3T29soOx3Qc0MIuGwAeT3KxHaryw7BWYoRwAbbi+PDrqiJ4DcHkZoldB3AOp6hzjdnzTT9KDLNfhH4iJpypETYHGDeFoLT3OpO7NvxfMOG9a+poWa7FDbO7vBlhGqP7MXkVxURzGSvHDB1Jq2XMM+9J4S65rWbkirs6bEDpYUbcv6BHJOUc41PKak6ApKXR+B+gr1BxVDx+WkPDHOV6vooke8khO34nUG1DyAff9G62jf7yMfRqAHqKO0T8MERhfI4Lk9b6AHDvJxtEiaBnnDForYgtzro/04GrL6PF6k0MosUgo1n8cx+fljgNHloT6PC4IgCIIgCIIgCILw9PgL6Ap8qFzYW2UAAAAASUVORK5CYII=)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span.-hide-empty[_ngcontent-%COMP%]::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAANISURBVHgB7ZndcdswDIBBOQO4G6gTxOzfa9IJmk6QdIKmE8TewJkg6QStJ6j72p6PzgTlBvUAsVhAohqK1jm2CPkuF3x3uphyDJIgCIAggCAIgiAIgiAIgiAIzw0FB8IYM8Q/Z9jliQMY4eccn6H/eoWPxcEs8fs5QDHTWq/gAPSuAJx4XhRwqTJ1Dg8TfhQc2C2Am6AiLPRIbwqoVjy7cuAuIQEFaooWMenLInpRAK26A/UDKjPnALeHe9+HNWTAzC9jRlsmv0KLmKxxMjihl6/0SNGDn1/QO1e4a/wf2/K7UqEkG5hhtYAtK29xgp/eaj3fUc4Fyrlqk8NtCWwKoD2PgzYQDRpX/BrNbLzvHiZ56DzH6Dw/R1+REjSXTzgCNjJcMZeHb8jcX2s9hg74CV4ujFmpyhpq8qov+AIMsFiAN/0/4TtaeZx8UgSoWSzMNLYE8iEcW4HFCToH4+iVJbMHJrKslGXDd5RbAAPJFuD3/t+mUHWh9fFXYOS3MaeDysHWrLwVJPkCDgs4i9qWe/KEjyDhZIfr9Ubfe5OsADT/00a7cDPoCZ8n/GcwUCeQSLoFKHUcNosMvkNPoOx52PaHqiQ4wmAeCVyGbWPuzjEiYD6/+0HIg/FejcPthLKt29J3Fzh8QGNisVPCyY9h/8kTuVdcKNvClr67wH4WaCFlkL3XBDgU0BgkJUVhuwBHGZuFDnLxt5NI9nBb313g8AEWAmd0X+1LW7ffaH0LZXGDhVFL30mkW4Bzdw2BRTMscoLZXyPuq8jhdiFZAXiYnzfam6c3NlD2h+jNHBLh8AEU9xsZGqWtwAzVCGAj7BXJSVeyAijsYYbWSH0xZ79pcVid8eeN8EhcFk05agIsYRBPa9PoVe7P7ExkLdWhZoToLBkYoAQlztOpGoxZYLISSEZcWaZaA1dZrPeSWNey9payOmtJ7GBF0Tivf0TOKcq5gadUFK2h0vURqG/QflChrTLLqhPjsl5Fnz3ik534FW9zoPYe3Md3WifH/hC5GIEeoIHSPo0dYxfI4fk9b6EHDnI5WhZNVXk5uitlbkHh9clejsbU1+NlCa2qIuXQcj2ON0g/B5hdHup6XBAEQRAEQRAEQRCE58c/90hmWzuzaIoAAAAASUVORK5CYII=)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span.-show-empty[_ngcontent-%COMP%]::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAANpSURBVHgB7ZndcdswDIBBOQO4G6gTxOzfa9IJmk6QdoK6E8TeIJkg6QRtJqj72l4qZ4JyBA8QiwUk2qVoWbJFyNdc8N3pbFIS+AcCIAQgCIIgCIIgCIIgCMJTQ8GByLJsiD9n2OSJBRjh/xSvobu9wMtgZ+Z4fwaQ32qtF3AAep8AHHia5zBWiTqHfwNuBTt2A2CnOBEGeqS3CShXPLmwYMcQgQJ1iRox7UsjepkAWnUL6juUas4Bbg/7tg9tSICZn1k2ahj8AjViusTB4ICev9AjRRf+f0Z1NrdX+Iypea+YUJINzLBqQMPKGxzgx9daz3aU8wHlXNTJ4dYEtgmgPY+dziDoNK74FarZZN89TPLQeE7QeH4KbtEkaC6bcARsJLhiNvVrSN1faj2BDrgBju+ybKFKbViRlm3BZ2CARQOc6v/x62jlcfDj7e/cn+MzaOGBBogacvxl27N3d9llqAlkQzi2AosRtBYmQZUhtW98Byzdp7ggdROxlSQpZBm/jmILYCB6Agp/r4ogZ025oq17NPX+NwZIJIuMaKUNDKxcdBkFhwacBWXTpM5dcR7En9ThcrnR9t5ETwCq/2mlnNtb6AkXJ6wZDNQJRBKvAUod+8U8gW/QEyh75pfdoSoKDjeYBgLnftmz9o379Xc2t0GVCb0Dyja2oe0ucNiAysBC4+dZ+33Z8A41bu+/MIJtxHSy95wAxwRUOklBkV/OwVLEZqCDXHx3GsgeNrXdBQ4bYMAzRg/lvjSr8iutb6BIblQJ9zydCqGdUU3bUcRrgLX3FYF51S1ygtFfxe+rwOB2IXoC8DA/q5Q3T29soOx3Qc0MIuGwAeT3KxHaryw7BWYoRwAbbi+PDrqiJ4DcHkZoldB3AOp6hzjdnzTT9KDLNfhH4iJpypETYHGDeFoLT3OpO7NvxfMOG9a+poWa7FDbO7vBlhGqP7MXkVxURzGSvHDB1Jq2XMM+9J4S65rWbkirs6bEDpYUbcv6BHJOUc41PKak6ApKXR+B+gr1BxVDx+WkPDHOV6vooke8khO34nUG1DyAff9G62jf7yMfRqAHqKO0T8MERhfI4Lk9b6AHDvJxtEiaBnnDForYgtzro/04GrL6PF6k0MosUgo1n8cx+fljgNHloT6PC4IgCIIgCIIgCILw9PgL6Ap8qFzYW2UAAAAASUVORK5CYII=)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span.-enable-encryption[_ngcontent-%COMP%]::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAKbSURBVHgB7ZnRbdswEIZ/MhkgI7gTxKzdhz41mSAdIZ2gyQS1J0g8QdIJ6kzQvMcu1QmiEfzYAonYO1stZNaIDfdOcOH7AMMSIRK644n87wgYhmEYhmEYhmEY+4dDi8QYj6oK5967d3TbTUCnfomC/sqqSne9XrhFi7TmgEmM7z3cDV0erXm0TFUatuUIjxaI8fsVGf8F641nOs67G+rzCS2gHgFsSEIaYAsc3HUIx5dQRDUCpjGerzB+Rm3DZ6TT16Hr+PeEFID0Oe9Pz13wpwNFVCPgWyweUS90NeVPMvxtCOWq52mR7CS4r1mfmUN6FUKYQQG1CODZx7IheMl4howsydhTumwaO985oISaA7xzZ817CrXbl4z/DTuBdoHRUl+HEyihtwYkdLOGETak8rhfanDuGEqoOSBl4U8zW2za900I91lTB0q0ogN2mb13wCFagrbEhB1EXAdwwkOBxervAoKwKqTlcSitB0QdwMbXQqYLHQrWCZJOEF4DPCcwWsZjMbYXTZLEIqCWsY9Zc0ma/wMtNMU2s1an0FfItkHOI1ZslVshFwHO5TPDsjbwi24bsv0Qxm6eKKFstvsKYgmSmANSpvyq53Qp8a3yGBxFzTaqF5xBCMk1YMkB/X4YQ4jDRcmsSQdC/BdCSCsVZkwKY88xB2DPMQdAiUVStPuIOcBlau1JMCeYTP4qjW9cXVqHmAP4XK95fwA+3fn3KOAx/ME8H/iD20kHeOTKj5OjuGL2NoINf3iIJzwGMuX3gw5WIIRoPWA6jdek0z9CESq0jHohiBVbRBdB7zGAYHiuoKAXHkAQUQewZueKTX6wIQHPvHQ1iFE7G1wUSHi25oca2+4IJRl+VwFjqQKIYRiGYRiGYRiGYRjGL/wq6dJf5iBxAAAAAElFTkSuQmCC)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span.-disable-encryption[_ngcontent-%COMP%]::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAN+SURBVHgB7dlvT9pAGADw566tgAhUFJ0ijgSXidnM5t5s2YtlcS/2BfyUfoglvt5csmwMXFjYhij/W0H+lPZurQmmEKeId2SG+727o1T79Gm55zkAQRAEQRAEYTohmKS9PWn54HBhJoACQBUfAuq5+Cew3CK0Y5C2rB0fp6swQRMLQDz+TO3BeVyyXXccoWDQLhQmFQgJJiC6sbGGEIlh203HIgQSlkFVgxHQ9UoTOOMegIfJ5Aqy8ArcFoaA3xeSG436GXDENQDR6OaCfUdj7jmLEBMpUGxjODn5kcnp9crJrFfRFezFFMOs+1isSP750Fpb0047wAnXAIQiixtOSvfHFFA36JUy2XRaa1WrRn++2Wz2NK2iRVeWql0LVPvFJPc/Q3I3pO3uliGVosDBjc/kuJy7jxHMuOcCHnSUSqWMf33H+cw5xrL15wiRpMTh4QJwwi0A2CerA2MLqtddfJ9zjOyTi+45A9k/m5xwCwAl5sDzbJrN4qjfPSekOXgueRY44ZcBQ+mfz+fbI34VKplM47pzscQtAPeFDP+p39n0J5iAqc8AEQCYclMfAG7l8Hpi8wXckdMn6PbM9uksLsAIi6hxsK8F7KZH1DCiGPAc3BUlimQXSCGLLl9Uhu/fnbOuCdgGwL749c/fHmOKVGDMqQzVYi2o776pswwC0wBc3HkOF3/Jzgj/z2PMskfA7h2wtTWz3iVP3VNO+duWya+329ut/f19C25JjcfVgORb6/cO+1o6PapUBpfL42KWAQ/8CzHJ1dBwLv7lzpPvHw8OOqkxU7ajaZ2zeqUaDEfm3T0C7POYjVqRSRYw+xlE1PK5xw2rnR/nrl/BcrJo4G8RYx4YYRYARZYGSlYtl9OAEbs6bLnHLKvD+7IQYpFJVxJLYZhyIgAw5UQAgBe7LoB7gFkAnF1d93jxwxdmrWxnSewe90yrBYwwCwDFZt099gZRnEkW2OeYw96B/UUPkkZusd+EWZp6IhGqEHS5heXsCQYKpXA4tGaMtblpX/hiyZoL10qPhld+fh/OlstlJosjph2h1UQiJoOyBByZIJcK2a9/gBGmL8FCNltg+XwOc1pkr3eSBWCI9ZuaNvVa3R8OYQySHxhy7vyr58kcowrzErem6JbdIGm1yGrXLpOHK8VROT2FGZB0Xe5pw/uFgiAIgiAIgiAIgiAI4/oLaQBI2smc1O8AAAAASUVORK5CYII=)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span.-edit-wallet[_ngcontent-%COMP%]::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAMiSURBVHgB7ZnbcdNAFIbPSvYzpgJEBfaSgdeYDkwFhA5CBXFKoIIkHdABziszILkCnArwc8bSco4jT1aypGgvkjzD+R680lq3/9fZsxcBMAzDMAzDMAzzPyLghIjjeILFAh/rXAFEVIflNgDxHSC7l1JuwDMnYwCKXygQN7g5qTtGgFhKOb0Gj5yEAXG8vlKglm2OxYi4PZOzL+CJwQ0wEX/ApwmDGlAjfot131BkQu1/BMEU9y8hzwkHfJkwmAF14negPn6QMikeG0eYH35AByYMYoCJ+OdzujEhgJ6pa/OY4S/rxBPUBQo0CDc3xfPg4lec3IAlvUbACwmvMQKer1EdCSme+17KFRjSWwQ0hL3EQL7D7ckIhf2M41nTdeoiIQRxBRb0EgFt2vzvOL7Fx/kMZpHwR69DY96ajhY7j4C2Ce+dlBemkYDFSq8Lw3AKhnRqgGm2NzUBlHrQdx8f09dgSGcG2HR1hJEJQrzRd1VYzAtt6MQAW/EH2phAOQCLuV43ghMwwFX8gSYTtK5QZ2UzXfbaC1RlZrAQr1PuHcb7ucLxOIC6U5t7eI0ApWBZqnIST5QjoXo4rK5t7+G3CYj9m9LZ0hsDR3QToEL8mZRLsMSbARj+84rqfVvNE5bLtSNaJivXu4onvBmQZVDM1Erd4y+FpZMJ9bNAd/GEzyYQ6TuYD1b5mN3ahK7FE94MEIEoDEPH4zDGbmlra0If4gmfEVBoAmmarqm0MaEv8YQXA/JBir6cvdUHJSYm9Cme8GJAkBYfFp6EFmhjQt/iCS8GCFEMf5WpddVxTSYMIZ7wkwNKCRAT4nn+meuIGhPmQ4gn/EQAHDWBWS6syYRP8DR7i4YSTzhPhkgkCvhb83eSv21ijn7j/F2hOftpbFR3zb7EEyNwp2nVZlY0R8FL9CmecG4CR0Nge+iT2Nc+xRPOEVDuAQzZ0DfAAMQKrbzDWZ/zzNEUZwOUEK9aJBIShuv5lPlFsoNsjTdO5ACCy7gbgPN0/Ky10KowlHG5OlMPKoAktFyq6gsvS2I0iNlhVj+Vt8owDMMwDMMwDMMwDNPEPw5aH3llqGexAAAAAElFTkSuQmCC)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span.-btn-delete[_ngcontent-%COMP%]::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NTc3MiwgMjAxNC8wMS8xMy0xOTo0NDowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkZGMEIyRDk3NzBFMDExRTg4QjAwOEEwQTk4MTI2NjcwIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkZGMEIyRDk4NzBFMDExRTg4QjAwOEEwQTk4MTI2NjcwIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6RkYwQjJEOTU3MEUwMTFFODhCMDA4QTBBOTgxMjY2NzAiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6RkYwQjJEOTY3MEUwMTFFODhCMDA4QTBBOTgxMjY2NzAiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5XdpwRAAACxElEQVR42uyZPWsUURSGd9dYCakisdDKQomI2dJOSCoVQRSsFBE7Y6siSCJYqE1A4gcG0ySiBkVtBFHjxw/QjabQTlGI4AeYIFGIOz4Hz8IwbMaZ2ZnJneRceLhk5nLnvO+euXPPTdnzvNJybpXSMm9mgBlgBpgBZoAZYAaYAWaAGWAGmAFmgBlgBpgBqbVXtcn10JHCPJ3at2cRZzmLIzGCPUDXBdvhEtyodm/5kVD8BNyFaea46LwBBL2H7jZ8gdXwEw4R/HhC8V16aQ5uwUnmmnbSAE3597DKd7kOkzAADwh+PoF4f9sP15nHc3ENWBcQ33hGFe7D4RbFi5lbXV4Ev8KbkPt9COxNKL4R70Rav34WBsh7PxhyfxOMIrQvuKpHEC/tPOLvOJsBBPeL7ibsgxo0+6XWwCnYFlP8OeY/XojPoIraRXcNmu0F5KFTIgoeRxR/omg7wWfQD5+aGQ+bYWwxxWeaAb5M6KG78B+RiyI+l1oAAU/UAOfE51kMDcMOeBRx/EAe4nN5BQKvw9EI2fAN8R15xVTJUbx86o5FGDrL2L15xZVLBkT8zjfavNYO/Vo7eIU2IKb4YDsCl7M0oeKA+FpY7QC9hcyAqNtbeAcjIWM+6rhRMmGmEBkQY28vn7pxrfFfh5TYp6GnEBkQU3ywdrgKnQvUDrIwnpVzBS263MsARKzUGiDJ3v4pnIHPC9QO3VppHuQ5ZVdfAan3NybZ3nJ9Fob0dZgKmWODGuKkAXJw+baVvT1jpDweChnykjF1Vw34AA99f9cTFjZyjrBbxMIf3/UXpX8nzqm1tpQN+A1XYAXsBFkTxuIWNnpyfE/XlEEVvlZM4d5cUfYBchJcJeCRFuZo10x4DjPM9b3Q1WALRrRF+X/CkjVgSZTDZoAZYAaYAWaAGWAGmAFmgBlgBpgBZoAZYAaYAa60vwIMACj3FKsCfgkuAAAAAElFTkSuQmCC)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:hover{color:rgba(30,34,39,.5)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:hover.-new-address::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAM+SURBVHgB7ZnRbdswEIZ/OxnAnSAyMkDTCZpM0HSCJBMkncAU0AGSCepO0HSCJhMkfW4LMS999msBV+5RlGuLlGTJPBoBch9Aw6JESjwe745HQBAEQRAEQRAEQRCEl8YAuyJTI/zFKfbwlq6OqCRURuXdGRVN5ZGeuadnbjFWM+yA+ALIVEK/l1TOsRpwF6ZUUhKERkTiCcDMODChcoUwrkkIHxCJOAKws/4NVs050FROYmjDENxkyqzvpsGbdZ3CDAYY04AGRQFeFXU5bmAH65IUfdq+WeHVgOaZ11QuaLB36EKmzmGXT1LTD6sm8GmAXfP+4O2svuk8eMNYTYs2tu06Cawm9DGmreyDD3/GclL3Q6WwDdYNXtFgZ2XfS5LymsUw8iwBq/pZpc7M3qFq9gBP6RnyxTWMXRgOFA4mnxuf/aWuSVcvndoxx1LgWgIT51pTz6q1Rb4w940qJ6UgmrF96Wr7YPdadh2KXY/nTm3aIZJL1v63r2nb10WlbogzDlsQLgAT3lbRpRHjxRrRdaGOat7dm3AB2Nh+RY6viMdN67u3gMMGHDk93iIed2h79xZwuMHEuX6sXK2sfft6zdTCqdE13kFveHdvODSgOjDX+K2sfV987+C7vWdgBDcT8pHRcwIcAqh+5O+PB859E7FpbNdvWqnx3V6wgDhsgMa6MfozH9Pv0/9r6xKnXit3zdtd4SaOat4dRLgGLPC9cp3jGLHIPb//iEDCBZA7rsmP2fkY4p1Tc49AOAIh4/erEVqmjsHNzyJHkDi1wTFHuACM28vh7uQ+dYjT14WmW580fe15G64pR+aYxw0O4e7mEvg7RJeld/CtvU9ddmhTm07wpcRq9+wUyY0nYR/6lE7KYGrFplxDD/gEYFX+Af5MGe1Ie6trc1pdw6bYWIIkvkjQfpDJ9mrnjhnAQ2nEuvGjMKIPqB/8CeepEf+5gE1df0H9RkXDWO45bZn3yYcvB2JSanN6fn9A29uFGfSooe17ahPs+9eRgxHEwH5oXVq7P6u0ukYEdnM4uqCk5oByeN2xscWwOBfUiEh8ASyxVv2UhHFMb32NpuNxG97u7HhcEARBEARBEARBEISXxz+STv7SiHuLFAAAAABJRU5ErkJggg==)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:hover.-hide-empty::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NTc3MiwgMjAxNC8wMS8xMy0xOTo0NDowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkI5QTAxQTVDNzBERTExRTg4MkJCOEU1MUQyMjM4MDJGIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkI5QTAxQTVENzBERTExRTg4MkJCOEU1MUQyMjM4MDJGIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QjlBMDFBNUE3MERFMTFFODgyQkI4RTUxRDIyMzgwMkYiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QjlBMDFBNUI3MERFMTFFODgyQkI4RTUxRDIyMzgwMkYiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5A1duRAAACq0lEQVR42uyb3W3CMBCATdUBzAZhAmACYIKm75WgE0AHqAjqAJQJmkp9L0xQOgF0ArJBPUAlakuHhKwzzo+tGOVOugcMcXyfz5e7i2gdj0fWZLlhDRcCQAAIAAEgAASAABAAAkAACAABIABNlNuqE/w9f+T9KZcaSx1I7UmNYEyJkJpJ3UvdSt3AmN2Al4d6AeQQZehM6vjMYAxOD3QCY6nUBYC5yiOgjFpKPUidXjDeJBO4dlni2toBqF3fwc5XlRnMFV0LAOXGX4YFC3DrkdSO1BZoG8ZWBpePYM5e6ADUQj8R4zMwUBmaQKDLNDBb2G0F5hEBYZo7GADcsPNqV/tgYF5J4ZqVwRN4iADmiPEL2FVRYj4B1y4QCPPQAERIwFuBu1eVBPGEmauj4ApAgpz5xKF3JUhMmIUCgEOSoy9YOAQgIDCey9hFLHABIEZ2/93D43WrQeXIvWsBMNQ+bzxml3osGIQAoKt9XnsEsEWSrtoB6NF4j5zVX6nHgnpAYktmuXdtQVAPWHpA5CXBvloABBEEiwIqGv29igsAwuKWTyVreoFkgdw1IBcAbOcy1Sq/vNqGay8FvSwEAD+Wx6JLiS0BtxYA+qNp6hHAneXetQBYIxmaDy+YIMdrEwIAgaS+b8xtH48jJXAaShBkyPPaac1+odcQTDmcGWr2uSPjsV5DFhIAU82uxsq2tU9tda+9BpcA1HkcGRoXOySvt1WYWFs9g3uIEAGcFnhvSI5SKHBewUCufT8Ed1eFE9ZcNc1dSXy8GtvDLmFGRJAnTEuAHTEPr8l8FUNqoVhbu2wTpM88vSP0WQ2e2todVrxFJsDwDivfVq/tCGDeMAFDYjjrXWZ+Pf6NZJfepEX/F2i4EAACQAAIAAEgAASAABAAAkAACAABaKL8CzAAuPuelr6IAx8AAAAASUVORK5CYII=)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:hover.-show-empty::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAM+SURBVHgB7ZnRbdswEIZ/OxnAnSAyMkDTCZpM0HSCJBMkncAU0AGSCepO0HSCJhMkfW4LMS999msBV+5RlGuLlGTJPBoBch9Aw6JESjwe745HQBAEQRAEQRAEQRCEl8YAuyJTI/zFKfbwlq6OqCRURuXdGRVN5ZGeuadnbjFWM+yA+ALIVEK/l1TOsRpwF6ZUUhKERkTiCcDMODChcoUwrkkIHxCJOAKws/4NVs050FROYmjDENxkyqzvpsGbdZ3CDAYY04AGRQFeFXU5bmAH65IUfdq+WeHVgOaZ11QuaLB36EKmzmGXT1LTD6sm8GmAXfP+4O2svuk8eMNYTYs2tu06Cawm9DGmreyDD3/GclL3Q6WwDdYNXtFgZ2XfS5LymsUw8iwBq/pZpc7M3qFq9gBP6RnyxTWMXRgOFA4mnxuf/aWuSVcvndoxx1LgWgIT51pTz6q1Rb4w940qJ6UgmrF96Wr7YPdadh2KXY/nTm3aIZJL1v63r2nb10WlbogzDlsQLgAT3lbRpRHjxRrRdaGOat7dm3AB2Nh+RY6viMdN67u3gMMGHDk93iIed2h79xZwuMHEuX6sXK2sfft6zdTCqdE13kFveHdvODSgOjDX+K2sfV987+C7vWdgBDcT8pHRcwIcAqh+5O+PB859E7FpbNdvWqnx3V6wgDhsgMa6MfozH9Pv0/9r6xKnXit3zdtd4SaOat4dRLgGLPC9cp3jGLHIPb//iEDCBZA7rsmP2fkY4p1Tc49AOAIh4/erEVqmjsHNzyJHkDi1wTFHuACM28vh7uQ+dYjT14WmW580fe15G64pR+aYxw0O4e7mEvg7RJeld/CtvU9ddmhTm07wpcRq9+wUyY0nYR/6lE7KYGrFplxDD/gEYFX+Af5MGe1Ie6trc1pdw6bYWIIkvkjQfpDJ9mrnjhnAQ2nEuvGjMKIPqB/8CeepEf+5gE1df0H9RkXDWO45bZn3yYcvB2JSanN6fn9A29uFGfSooe17ahPs+9eRgxHEwH5oXVq7P6u0ukYEdnM4uqCk5oByeN2xscWwOBfUiEh8ASyxVv2UhHFMb32NpuNxG97u7HhcEARBEARBEARBEISXxz+STv7SiHuLFAAAAABJRU5ErkJggg==)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:hover.-enable-encryption::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAKESURBVHgB7ZnRbdswEIb/o+33jKAiddG3Ogsk1gTpBk0nqDtBnQkaT5B0groTKG0HqB6LukE0Qt6d6ELSChIqhm0IR8GB7wMEmLR00h2P1P0UoCiKoiiKoiiKouwehBbhLNmD6X0A0RDMA9uVVH/ltq8AY0pH/76hRVoLAGf772HMuf25t+bUwj7WuK1AGLQA/+p/tc5/x3rnHYm94oJ/v/mCFoieAd6RksdoAuGMDmefEZGoGcBZ/2SJ8ze279QeKR3NyB0ocWCP5ynPGPmpE5GoGcA/+9d4XOgcBcp5SmlRLD0/e5vA3GW1a2zA5q/sNTeIQLQM8KMfOoJVzjso/WsD1EnhnH7ErhvdE0Qi3hTo8HHQZlyscv6BRRB4EvaaISIRLwBMg7CNCTbnMmgZfodIxFwEk6cNSmc5NoTS/5erbEnSSh2wzex8ALpoCftKZGwh4hngBI8vfaXtWpteTAkjWghVas8VMgPEIa9qCbGiSDYDOj0nYGI5D297cQ8xxDKgKmOva92uqPkI3OZNRq2S0G46JcEfTkc8f1U2Qi4DzN241uPq/gP3oE1TltKrqbPhbQWwmEASnAK1ao3KkcRc9TZ8Fj3BmGMIIRiAsPSlw6sfEOO2XkUmEOJFFEKxpLBDS2HsOBoA7DgaAEQihnCJgWQAirDZFdMES7bGN95dWodcAMoyLHwMnUtkwUJhmlBe8zYGADStdVhx1PvT9MOG31fIXg+dDdQrP56fQgjh/YD9MztanxCTspxYkTSCEMKLoFeEYum5hLy6hxiiAVgot3nqRgnSOJvCu0GOaN8G/QaJGy2yMpmo2RuB7ZuF3eJKU6kNEEVRFEVRFEVRFEVRlHvYheXBAEeGBAAAAABJRU5ErkJggg==)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:hover.-disable-encryption::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAKZSURBVHgB7ZlRbtpAEIb/NfCeI1ClVH0ruUATnyA9QnqCNidIOEHCCUhP0OQETtsDlMdKtApHyDuxpzNrV8EGAXJnLSLPJ1liF1h7/p3dnRkDhmEYhmEYRjtxaBBK+gdA9wyd6BhEQ+7qF19N4dwcKd25eHaDBmlMAEoOPyCKJvzxYMtP58gwakqICA1A3wdXbPxXbDde6PNTTejHmws0QHAP8IZkdIk6OFy797NzBCSoB1AyOFtj/CP3jfiK3fHMycUuf8TXl9UB8NkvnYAE9QD6NnjA80Yn8PpexC6ez9f+PnnL7p8mlf+wYItX/J9HBCCYB/jZLxuCTcYLLv7FAnViiNHP5CdHIMItgQ6dltqEm03G/yMXgcbl3ugEgQgnALlhuY0xdue+1IroHQIRchPsLzf4XJ9iR1z8+37TWJo0EgfsM13sKf54bIDWe4AJgJbTegGCbTQcBhP+H64T8JUuRrsEUXVQF8AXPTq9C0lkoAlnhoUQqjmBqgDe+KgnycwQYZgW+YSaCLp7gMx8OOPhx87voYaaBxSp7EOlWxKbj8DTtM6sFWW0K6xklVxLWA2Xa6HnAZ20OjOS+x/Jg9Z1WRf/uZUx/FglSK1IoicAVVw/y8411qofw3vRElF0CiU094CSAH721HiqZpJ9KPEiAqFQ5TDBQmG0HBMALccEQCDyN8H7j6YA83Kzq5YTrHk9tnOFeRt6AmTZXXlkN9HwgjzD9PnAUuc+CgBXjfw4Oer9rPtyUwyn5PWJjIFq5EeLEZRQrgccXvNsfUJIsmzMYbZasUV5E0wvobg+1zAt7qGGqgB55raIZZagjYypXA0SwhVFpUAis+X4xaZz9U4E4pOFZHN1t1oFEMMwDMMwDMMwDMMwjL+78e87Hb4jwAAAAABJRU5ErkJggg==)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:hover.-edit-wallet::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAMSSURBVHgB7ZrRcdpAEIb/w/BOB1EHIY8Z4gQ6oIM4FWRSgU0HSQXGJaQCMCTPIRUEVxA9Z4DLrrBmJCFpdNLqxIz3mzE6nWWs/7+93TsBoCiKoiiKoijKS8TgkljaIa4wQw8fYBE894bU/o4DVpiaHYS5HAPWdkZ3c0+tYclVd7g2cwhyGQZs7C1YXBUMFnhnPkGI7g1wER8jaEK3BuSJtzTnDb7RcUtHnv8j6v1M7SB1nZAJ3RlQJP6AKSW7bap/aQNKjss2TOjGABfxMS2Z0INviuf8l0LxDJdANshil+q3uMEPe4+a+I2A8oQX0nBMMS4xgSmKBLKISuQKjviLgKKw3+MNHR/A9f9Iwn7aUen7FEUCcIsa+ImAKnN+bRd0Nx/hEgl9/En19SgqxuYJDrQfAVUT3ntz4xwJoOVxkgNFkyPtGuCa7V1NsMiO9hCOtGdAnVLHuJhg8CpzvoMj7RhQV3xMFRM4BwCTVN/+EgxoKj6mzAQWP6C+NLW2y7JVIC8z1xGfJFsd/tGRxdvMOqBHCXDs/j/6kGRAtdgmzpuKZzgS1haRCRwJg2iDFGSumtcRz8hOAV6Wpt89BKKfZiSnQ574a3OHmsgZsLGTsz6+WQ7XU8KqD/89PyY7p5F4Rs6A7MhYPNLrtrEJccITHvkYSQNGmfMVlaUpmpjQsnhGzoAeXqfODQmfmrC2CR7EM5JJMB0BB5yych0TPIlnZAxYRouU5Do8TC1KXEzwKJ6RMeDq7GbPa3IVEzyLZ2QMyCbAI37nXldmQgfiGRkDsgmQazZ/zJVHngm8huhAPCOzF9jYX8gmQRa4j5bB+SvB4hGPaV0809wAHuk+/hb8dvs82pwnJvQaRNFypLYpFM54Ec803wz1UfbUZnRmDm+Wym33Jp5pbgAnQImJZKPt7pw+5PgKjzQ3gEPaoh78aNtEyfCRFk4L2vU13zk6IhEBwwrXhNHzOhbLJdJEuWFbmCA9ImHAAwmaJc5Z7IpaT9EnvANqv5X/ZocUMmXw9CgsuJRRVRRFURRFURRFURRFKeM/oxaTpik5gaYAAAAASUVORK5CYII=)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:hover.-btn-delete::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NTc3MiwgMjAxNC8wMS8xMy0xOTo0NDowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkYwRTIyQTZCNzBFMDExRTg4ODM5RUYyOTE4Q0I1M0FGIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkYwRTIyQTZDNzBFMDExRTg4ODM5RUYyOTE4Q0I1M0FGIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6RjBFMjJBNjk3MEUwMTFFODg4MzlFRjI5MThDQjUzQUYiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6RjBFMjJBNkE3MEUwMTFFODg4MzlFRjI5MThDQjUzQUYiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4w5yWGAAACxElEQVR42uyZTUgVURiG773ZSmxl2CJXLQzbZLtaBboqCcTATUVEu2zbH0QKLcqNEP5R6MYikyLdBFHZz6KlWEnUrmihYAkpYYLd6fnwXBiG2zQzd2Y8o9+Bh8G5h7nnfe6ZmfMd847j5LZyK+S2eFMBKkAFqAAVoAJUgApQASpABagAFaACVIAKiK0tHzi0B2pjuE6dOe5IYpz5JLbEGOwpDo1wBAbgfs30258Rw0/BY5jjGv3WC2DQ7RwewgLshF9whsGPRwzfaE6twAO4wrXmrBRgpvwXqHadLsI76IInDH4tQnh3Own3uI5j4zOg3hO+9B1NMAlnKwwvMg/a/BD8Dh98Pu8kYEvE8KXxTsX16ychQO77Xp/P98EoQTu9T/UA4aX1EP6RtTOAwf3mMAYdMAPlfqldcBUOhwx/k+tfzMRr0IQ6xmEYyq0F5EtnJRQ8Dxj+UmbWAa6Fywm4DLt9un7cqPCJCnCJaOZw6z8hNyR8KrUAAV4YAdaFT7MYugNH4VnA/l1phE/lFvDcDucDzIYfhK9Na0yFFMPLq+5CkK70PZ7WuFKZAQHf86W2ZmqHa6Z2cDItIGR4bzsHg0lKKFgQfsavdoCWTM6AoMtb+AwjPn2+mX6jzISlTMyAEGt7edWNmxr/vU+J3Q3NmZgBIcN7a4fbUPeP2kEejDdkX8EUXfbNAEJs5/Aq4tr+JVyH+XI/FOw3leZpvidv6y0g9f7eKMtbzi9Dn7kdZn2u0WCEWClANi4/VbK2p4+Ux30+XabpU7RVwFd46vq7GLGwkX2ENgkLf1zn3+TWd5xja1UxC1iFIdgGrSDPhLthCxuzczxhnim9JrjsKbTx2UpW1gGyE9zEgEcq3FSRmfAalrjWYqarwQpEVAX5f8KmFbApymEVoAJUgApQASpABagAFaACVIAKUAEqQAWoAFvaXwEGAEeBGUrXm8wHAAAAAElFTkSuQmCC)}@-webkit-keyframes floatup{50%{opacity:1}100%{-webkit-transform:translateY(-20px);transform:translateY(-20px);opacity:0}}@keyframes floatup{50%{opacity:1}100%{-webkit-transform:translateY(-20px);transform:translateY(-20px);opacity:0}}.copy-label[_ngcontent-%COMP%]{color:#0072ff;opacity:0;font-size:12px;position:relative;padding-left:10px}.copy-label[_ngcontent-%COMP%]::after{content:attr(data-label);position:absolute;white-space:nowrap;top:0;left:4px;opacity:0;line-height:1}.unconfirmed-label[_ngcontent-%COMP%]{opacity:.5!important}.copying[_ngcontent-%COMP%] .copy-label[_ngcontent-%COMP%]::after{-webkit-animation:.5s ease-in-out floatup;animation:.5s ease-in-out floatup}mat-spinner[_ngcontent-%COMP%]{margin-left:7px;margin-right:12px}mat-spinner[_ngcontent-%COMP%] circle{stroke:rgba(30,34,39,.2)}"]],data:{}});function Wf(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"mat-spinner",[["class","in-button small mat-spinner mat-progress-spinner"],["mode","indeterminate"],["role","progressbar"]],[[4,"width","px"],[4,"height","px"]],null,null,Pf,Lf)),l._8(1,573440,null,0,Wu,[l.l,Hl,[2,sn]],null,null)],null,function(n,t){n(t,0,0,l._22(t,1)._elementSize,l._22(t,1)._elementSize)})}function zf(n){return l._33(0,[(n()(),l._9(0,0,null,null,24,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,12,"div",[["class","-button"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.newAddress()&&l),l},null,null)),l._8(3,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(4,{"mouse-disabled":0}),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,7,"span",[],null,null,null,null,null)),l._8(7,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(8,{"-img -new-address":0,"-disabled-span":1,"-enabled-span":2}),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Wf)),l._8(11,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(12,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,7,"div",[["class","-button"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.toggleEmpty()&&l),l},null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(18,0,null,null,4,"span",[],null,null,null,null,null)),l._8(19,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(20,{"-img":0,"-show-empty":1,"-hide-empty":2}),(n()(),l._31(21,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,"-button",n(t,4,0,e.creatingAddress)),n(t,7,0,n(t,8,0,!e.creatingAddress,e.creatingAddress,!e.creatingAddress)),n(t,11,0,e.creatingAddress),n(t,19,0,n(t,20,0,!0,e.wallet.hideEmpty,!e.wallet.hideEmpty))},function(n,t){var e=t.component;n(t,12,0,l._32(t,12,0,l._22(t,13).transform(e.wallet.isHardware?"wallet.new-address":"wallet.new-addresses"))),n(t,21,0,l._32(t,21,0,l._22(t,22).transform("wallet."+(e.wallet.hideEmpty?"show":"hide")+"-empty")))})}function Uf(n){return l._33(0,[(n()(),l._9(0,0,null,null,5,"div",[["class","-button btn-delete-wallet"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.deleteWallet()&&l),l},null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"span",[["class","-img -btn-delete -enabled-span"]],null,null,null,null,null)),(n()(),l._31(3,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,3,0,l._32(t,3,0,l._22(t,4).transform("wallet.delete")))})}function Gf(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"div",[["class","-button"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.toggleEncryption()&&l),l},null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,4,"span",[],null,null,null,null,null)),l._8(3,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(4,{"-img":0,"-enable-encryption":1,"-disable-encryption":2}),(n()(),l._31(5,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,n(t,4,0,!0,!e.wallet.encrypted,e.wallet.encrypted))},function(n,t){var e=t.component;n(t,5,0,l._32(t,5,0,l._22(t,6).transform("wallet."+(e.wallet.encrypted?"decrypt":"encrypt"))))})}function qf(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"mat-spinner",[["class","in-button small mat-spinner mat-progress-spinner"],["mode","indeterminate"],["role","progressbar"]],[[4,"width","px"],[4,"height","px"]],null,null,Pf,Lf)),l._8(1,573440,null,0,Wu,[l.l,Hl,[2,sn]],null,null)],null,function(n,t){n(t,0,0,l._22(t,1)._elementSize,l._22(t,1)._elementSize)})}function Jf(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"mat-spinner",[["class","in-text small mat-spinner mat-progress-spinner"],["mode","indeterminate"],["role","progressbar"]],[[4,"width","px"],[4,"height","px"]],null,null,Pf,Lf)),l._8(1,573440,null,0,Wu,[l.l,Hl,[2,sn]],null,null)],null,function(n,t){n(t,0,0,l._22(t,1)._elementSize,l._22(t,1)._elementSize)})}function Qf(n){return l._33(0,[(n()(),l._9(0,0,null,null,16,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,0,"img",[["class","qr-code-button"],["src","../../../../../assets/img/qr-code-black.png"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.showQrCode(e,n.parent.parent.context.$implicit.address)&&l),l},null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,11,"p",[["class","click-to-copy"]],null,[[null,"click"],[null,"mouseleave"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.copyAddress(e,n.parent.parent.context.$implicit)&&l),"mouseleave"===t&&(l=0!=(n.parent.parent.context.$implicit.copying=!1)&&l),l},null,null)),l._8(5,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(6,{copying:0}),(n()(),l._31(7,null,["\n ","\n "])),(n()(),l._4(16777216,null,null,1,null,Jf)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(11,0,null,null,3,"span",[["class","copy-label"]],[[1,"data-label",0]],null,null,null,null)),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(13,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,5,0,"click-to-copy",n(t,6,0,t.parent.parent.context.$implicit.copying)),n(t,9,0,e.confirmingIndex===t.parent.parent.context.index)},function(n,t){n(t,7,0,t.parent.parent.context.$implicit.address),n(t,11,0,l._32(t,11,0,l._22(t,12).transform("wallet.address.copied"))),n(t,13,0,l._32(t,13,0,l._22(t,14).transform("wallet.address.copy")))})}function Kf(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"mat-spinner",[["class","in-text small mat-spinner mat-progress-spinner"],["mode","indeterminate"],["role","progressbar"]],[[4,"width","px"],[4,"height","px"]],null,null,Pf,Lf)),l._8(1,573440,null,0,Wu,[l.l,Hl,[2,sn]],null,null)],null,function(n,t){n(t,0,0,l._22(t,1)._elementSize,l._22(t,1)._elementSize)})}function Xf(n){return l._33(0,[(n()(),l._9(0,0,null,null,14,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,11,"p",[["class","click-to-copy"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.confirmAddress(n.parent.parent.context.$implicit,n.parent.parent.context.index,!0)&&l),l},null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,1,"span",[["class","truncated-address"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(7,0,null,null,5,"span",[["class","copy-label unconfirmed-label"]],null,null,null,null,null)),(n()(),l._31(8,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._4(16777216,null,null,1,null,Kf)),l._8(11,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,11,0,t.component.confirmingIndex===t.parent.parent.context.index)},function(n,t){n(t,5,0,t.parent.parent.context.$implicit.address),n(t,8,0,l._32(t,8,0,l._22(t,9).transform("wallet.address.show")))})}function Zf(n){return l._33(0,[(n()(),l._9(0,0,null,null,3,"button",[["class","mat-menu-item"],["mat-menu-item",""],["role","menuitem"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(n,t,e){var r=!0,i=n.component;return"click"===t&&(r=!1!==l._22(n,1)._checkDisabled(e)&&r),"mouseenter"===t&&(r=!1!==l._22(n,1)._emitHoverEvent()&&r),"click"===t&&(r=!1!==i.copyAddress(e,n.parent.parent.context.$implicit,1e3)&&r),r},jf,Yf)),l._8(1,180224,[[1,4]],0,bu,[l.l],null,null),(n()(),l._31(2,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,0,0,l._22(t,1)._highlighted,l._22(t,1)._triggersSubmenu,l._22(t,1)._getTabIndex(),l._22(t,1).disabled.toString(),l._22(t,1).disabled||null),n(t,2,0,l._32(t,2,0,l._22(t,3).transform("wallet.address."+(t.parent.parent.context.$implicit.copying?"copied":"copy-address"))))})}function $f(n){return l._33(0,[(n()(),l._9(0,0,null,null,3,"button",[["class","mat-menu-item"],["mat-menu-item",""],["role","menuitem"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(n,t,e){var r=!0,i=n.component;return"click"===t&&(r=!1!==l._22(n,1)._checkDisabled(e)&&r),"mouseenter"===t&&(r=!1!==l._22(n,1)._emitHoverEvent()&&r),"click"===t&&(r=!1!==i.confirmAddress(n.parent.parent.context.$implicit,n.parent.parent.context.index,!n.parent.parent.context.$implicit.confirmed)&&r),r},jf,Yf)),l._8(1,180224,[[1,4]],0,bu,[l.l],null,null),(n()(),l._31(2,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,0,0,l._22(t,1)._highlighted,l._22(t,1)._triggersSubmenu,l._22(t,1)._getTabIndex(),l._22(t,1).disabled.toString(),l._22(t,1).disabled||null),n(t,2,0,l._32(t,2,0,l._22(t,3).transform("wallet.address.confirm")))})}function n_(n){return l._33(0,[(n()(),l._9(0,0,null,null,54,"div",[["class","-record"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,1,"div",[["class","id-column"]],null,null,null,null,null)),(n()(),l._31(3,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,7,"div",[["class","address-column"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Qf)),l._8(8,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Xf)),l._8(11,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,2,"div",[["class","coins-column"]],null,null,null,null,null)),(n()(),l._31(15,null,["",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(18,0,null,null,2,"div",[["class","hours-column"]],null,null,null,null,null)),(n()(),l._31(19,null,["",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(22,0,null,null,31,"div",[["class","options-column"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(24,16777216,null,null,3,"mat-icon",[["aria-haspopup","true"],["class","mat-icon"],["role","img"]],null,[[null,"mousedown"],[null,"keydown"],[null,"click"]],function(n,t,e){var r=!0;return"mousedown"===t&&(r=!1!==l._22(n,26)._handleMousedown(e)&&r),"keydown"===t&&(r=!1!==l._22(n,26)._handleKeydown(e)&&r),"click"===t&&(r=!1!==l._22(n,26)._handleClick(e)&&r),r},Hf,Rf)),l._8(25,638976,null,0,ou,[l.l,eu,[8,null]],null,null),l._8(26,1196032,null,0,ku,[Pi,l.l,l.R,xu,[2,wu],[8,null],[2,Dl]],{menu:[0,"menu"]},null),(n()(),l._31(-1,0,["more_vert"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(29,0,null,null,23,"mat-menu",[["class","compact"]],null,null,null,Ef,Df)),l._8(30,1228800,[["optionsMenu",4]],1,wu,[l.l,l.B,vu],{overlapTrigger:[0,"overlapTrigger"],panelClass:[1,"panelClass"]},null),l._29(603979776,1,{items:1}),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,Zf)),l._8(34,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,$f)),l._8(37,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(39,0,null,0,5,"button",[["class","mat-menu-item"],["mat-menu-item",""],["role","menuitem"],["routerLink","/settings/outputs"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,40)._checkDisabled(e)&&r),"mouseenter"===t&&(r=!1!==l._22(n,40)._emitHoverEvent()&&r),"click"===t&&(r=!1!==l._22(n,41).onClick()&&r),r},jf,Yf)),l._8(40,180224,[[1,4]],0,bu,[l.l],null,null),l._8(41,16384,null,0,pp,[cp,Ch,[8,null],l.G,l.l],{queryParams:[0,"queryParams"],routerLink:[1,"routerLink"]},null),l._26(42,{addr:0}),(n()(),l._31(43,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(46,0,null,0,5,"button",[["class","mat-menu-item"],["mat-menu-item",""],["role","menuitem"],["routerLink","/transactions"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,47)._checkDisabled(e)&&r),"mouseenter"===t&&(r=!1!==l._22(n,47)._emitHoverEvent()&&r),"click"===t&&(r=!1!==l._22(n,48).onClick()&&r),r},jf,Yf)),l._8(47,180224,[[1,4]],0,bu,[l.l],null,null),l._8(48,16384,null,0,pp,[cp,Ch,[8,null],l.G,l.l],{queryParams:[0,"queryParams"],routerLink:[1,"routerLink"]},null),l._26(49,{addr:0}),(n()(),l._31(50,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,8,0,!e.wallet.isHardware||t.parent.context.$implicit.confirmed),n(t,11,0,e.wallet.isHardware&&!t.parent.context.$implicit.confirmed),n(t,25,0),n(t,26,0,l._22(t,30)),n(t,30,0,!1,"compact"),n(t,34,0,!e.wallet.isHardware||t.parent.context.$implicit.confirmed),n(t,37,0,e.wallet.isHardware),n(t,41,0,n(t,42,0,t.parent.context.$implicit.address),"/settings/outputs"),n(t,48,0,n(t,49,0,t.parent.context.$implicit.address),"/transactions")},function(n,t){n(t,3,0,t.parent.context.index+1),n(t,15,0,l._32(t,15,0,l._22(t,16).transform(t.parent.context.$implicit.coins?t.parent.context.$implicit.coins.toString():0,!0,"first"))),n(t,19,0,l._32(t,19,0,l._22(t,20).transform(t.parent.context.$implicit.hours?t.parent.context.$implicit.hours.toString():0,!1,"first"))),n(t,39,0,l._22(t,40)._highlighted,l._22(t,40)._triggersSubmenu,l._22(t,40)._getTabIndex(),l._22(t,40).disabled.toString(),l._22(t,40).disabled||null),n(t,43,0,l._32(t,43,0,l._22(t,44).transform("wallet.address.outputs"))),n(t,46,0,l._22(t,47)._highlighted,l._22(t,47)._triggersSubmenu,l._22(t,47)._getTabIndex(),l._22(t,47).disabled.toString(),l._22(t,47).disabled||null),n(t,50,0,l._32(t,50,0,l._22(t,51).transform("wallet.address.history")))})}function t_(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,n_)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,3,0,!t.component.wallet.hideEmpty||t.context.$implicit.coins.isGreaterThan(0))},null)}function e_(n){return l._33(0,[(n()(),l._9(0,0,null,null,24,"div",[["class","-row -actions"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,zf)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Uf)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,0,"div",[["class","flex-fill"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Gf)),l._8(11,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(13,0,null,null,10,"div",[["class","-button"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.editWallet()&&l),l},null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(15,0,null,null,7,"span",[],null,null,null,null,null)),l._8(16,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(17,{"-img -edit-wallet":0,"-disabled-span":1,"-enabled-span":2}),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,qf)),l._8(20,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(21,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n\n"])),(n()(),l._9(26,0,null,null,4,"div",[["class","-records"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,t_)),l._8(29,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,3,0,!e.wallet.isHardware),n(t,6,0,e.wallet.isHardware),n(t,11,0,!e.wallet.isHardware),n(t,16,0,n(t,17,0,!e.preparingToEdit,e.preparingToEdit,!e.preparingToEdit)),n(t,20,0,e.preparingToEdit),n(t,29,0,e.wallet?e.wallet.addresses:l._3)},function(n,t){n(t,21,0,l._32(t,21,0,l._22(t,22).transform("wallet.edit")))})}var l_=function(){function n(n){this.appService=n}return n.prototype.transform=function(n){return"hours"===n?this.appService.hoursName:"coin"===n?this.appService.coinName:"coinFull"===n?this.appService.fullCoinName:""},n}(),r_=l._7({encapsulation:2,styles:[".mat-button,.mat-fab,.mat-icon-button,.mat-mini-fab,.mat-raised-button{box-sizing:border-box;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;outline:0;border:none;-webkit-tap-highlight-color:transparent;display:inline-block;white-space:nowrap;text-decoration:none;vertical-align:baseline;text-align:center;margin:0;min-width:88px;line-height:36px;padding:0 16px;border-radius:2px}[disabled].mat-button,[disabled].mat-fab,[disabled].mat-icon-button,[disabled].mat-mini-fab,[disabled].mat-raised-button{cursor:default}.cdk-keyboard-focused.mat-button .mat-button-focus-overlay,.cdk-keyboard-focused.mat-fab .mat-button-focus-overlay,.cdk-keyboard-focused.mat-icon-button .mat-button-focus-overlay,.cdk-keyboard-focused.mat-mini-fab .mat-button-focus-overlay,.cdk-keyboard-focused.mat-raised-button .mat-button-focus-overlay,.cdk-program-focused.mat-button .mat-button-focus-overlay,.cdk-program-focused.mat-fab .mat-button-focus-overlay,.cdk-program-focused.mat-icon-button .mat-button-focus-overlay,.cdk-program-focused.mat-mini-fab .mat-button-focus-overlay,.cdk-program-focused.mat-raised-button .mat-button-focus-overlay{opacity:1}.mat-button::-moz-focus-inner,.mat-fab::-moz-focus-inner,.mat-icon-button::-moz-focus-inner,.mat-mini-fab::-moz-focus-inner,.mat-raised-button::-moz-focus-inner{border:0}.mat-fab,.mat-mini-fab,.mat-raised-button{transform:translate3d(0,0,0);transition:background .4s cubic-bezier(.25,.8,.25,1),box-shadow 280ms cubic-bezier(.4,0,.2,1)}.mat-fab:not([class*=mat-elevation-z]),.mat-mini-fab:not([class*=mat-elevation-z]),.mat-raised-button:not([class*=mat-elevation-z]){box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.mat-fab:not([disabled]):active:not([class*=mat-elevation-z]),.mat-mini-fab:not([disabled]):active:not([class*=mat-elevation-z]),.mat-raised-button:not([disabled]):active:not([class*=mat-elevation-z]){box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}[disabled].mat-fab,[disabled].mat-mini-fab,[disabled].mat-raised-button{box-shadow:none}.mat-button .mat-button-focus-overlay,.mat-icon-button .mat-button-focus-overlay{transition:none;opacity:0}.mat-button:hover .mat-button-focus-overlay{opacity:1}.mat-fab{min-width:0;border-radius:50%;width:56px;height:56px;padding:0;flex-shrink:0}.mat-fab:not([class*=mat-elevation-z]){box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.mat-fab:not([disabled]):active:not([class*=mat-elevation-z]){box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.mat-fab .mat-button-wrapper{padding:16px 0;display:inline-block;line-height:24px}.mat-mini-fab{min-width:0;border-radius:50%;width:40px;height:40px;padding:0;flex-shrink:0}.mat-mini-fab:not([class*=mat-elevation-z]){box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.mat-mini-fab:not([disabled]):active:not([class*=mat-elevation-z]){box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.mat-mini-fab .mat-button-wrapper{padding:8px 0;display:inline-block;line-height:24px}.mat-icon-button{padding:0;min-width:0;width:40px;height:40px;flex-shrink:0;line-height:40px;border-radius:50%}.mat-icon-button .mat-icon,.mat-icon-button i{line-height:24px}.mat-button,.mat-fab,.mat-icon-button,.mat-mini-fab,.mat-raised-button{color:currentColor}.mat-button .mat-button-wrapper>*,.mat-fab .mat-button-wrapper>*,.mat-icon-button .mat-button-wrapper>*,.mat-mini-fab .mat-button-wrapper>*,.mat-raised-button .mat-button-wrapper>*{vertical-align:middle}.mat-button-focus-overlay,.mat-button-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}.mat-button-focus-overlay{background-color:rgba(0,0,0,.12);border-radius:inherit;opacity:0;transition:opacity .2s cubic-bezier(.35,0,.25,1),background-color .2s cubic-bezier(.35,0,.25,1)}@media screen and (-ms-high-contrast:active){.mat-button-focus-overlay{background-color:rgba(255,255,255,.5)}}.mat-button-ripple-round{border-radius:50%;z-index:1}@media screen and (-ms-high-contrast:active){.mat-button,.mat-fab,.mat-icon-button,.mat-mini-fab,.mat-raised-button{outline:solid 1px}}"],data:{}});function i_(n){return l._33(2,[(n()(),l._9(0,0,null,null,1,"span",[["class","mat-button-wrapper"]],null,null,null,null,null)),l._21(null,0),(n()(),l._9(2,0,null,null,1,"div",[["class","mat-button-ripple mat-ripple"],["matRipple",""]],[[2,"mat-button-ripple-round",null],[2,"mat-ripple-unbounded",null]],null,null,null,null)),l._8(3,212992,null,0,ir,[l.l,l.B,Hl,[2,rr]],{centered:[0,"centered"],disabled:[1,"disabled"],trigger:[2,"trigger"]},null),(n()(),l._9(4,0,null,null,0,"div",[["class","mat-button-focus-overlay"]],null,null,null,null,null))],function(n,t){var e=t.component;n(t,3,0,e._isIconButton,e._isRippleDisabled(),e._getHostElement())},function(n,t){var e=t.component;n(t,2,0,e._isRoundButton||e._isIconButton,l._22(t,3).unbounded)})}var o_=l._7({encapsulation:2,styles:[".mat-button,.mat-fab,.mat-icon-button,.mat-mini-fab,.mat-raised-button{box-sizing:border-box;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;outline:0;border:none;-webkit-tap-highlight-color:transparent;display:inline-block;white-space:nowrap;text-decoration:none;vertical-align:baseline;text-align:center;margin:0;min-width:88px;line-height:36px;padding:0 16px;border-radius:2px}[disabled].mat-button,[disabled].mat-fab,[disabled].mat-icon-button,[disabled].mat-mini-fab,[disabled].mat-raised-button{cursor:default}.cdk-keyboard-focused.mat-button .mat-button-focus-overlay,.cdk-keyboard-focused.mat-fab .mat-button-focus-overlay,.cdk-keyboard-focused.mat-icon-button .mat-button-focus-overlay,.cdk-keyboard-focused.mat-mini-fab .mat-button-focus-overlay,.cdk-keyboard-focused.mat-raised-button .mat-button-focus-overlay,.cdk-program-focused.mat-button .mat-button-focus-overlay,.cdk-program-focused.mat-fab .mat-button-focus-overlay,.cdk-program-focused.mat-icon-button .mat-button-focus-overlay,.cdk-program-focused.mat-mini-fab .mat-button-focus-overlay,.cdk-program-focused.mat-raised-button .mat-button-focus-overlay{opacity:1}.mat-button::-moz-focus-inner,.mat-fab::-moz-focus-inner,.mat-icon-button::-moz-focus-inner,.mat-mini-fab::-moz-focus-inner,.mat-raised-button::-moz-focus-inner{border:0}.mat-fab,.mat-mini-fab,.mat-raised-button{transform:translate3d(0,0,0);transition:background .4s cubic-bezier(.25,.8,.25,1),box-shadow 280ms cubic-bezier(.4,0,.2,1)}.mat-fab:not([class*=mat-elevation-z]),.mat-mini-fab:not([class*=mat-elevation-z]),.mat-raised-button:not([class*=mat-elevation-z]){box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.mat-fab:not([disabled]):active:not([class*=mat-elevation-z]),.mat-mini-fab:not([disabled]):active:not([class*=mat-elevation-z]),.mat-raised-button:not([disabled]):active:not([class*=mat-elevation-z]){box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}[disabled].mat-fab,[disabled].mat-mini-fab,[disabled].mat-raised-button{box-shadow:none}.mat-button .mat-button-focus-overlay,.mat-icon-button .mat-button-focus-overlay{transition:none;opacity:0}.mat-button:hover .mat-button-focus-overlay{opacity:1}.mat-fab{min-width:0;border-radius:50%;width:56px;height:56px;padding:0;flex-shrink:0}.mat-fab:not([class*=mat-elevation-z]){box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.mat-fab:not([disabled]):active:not([class*=mat-elevation-z]){box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.mat-fab .mat-button-wrapper{padding:16px 0;display:inline-block;line-height:24px}.mat-mini-fab{min-width:0;border-radius:50%;width:40px;height:40px;padding:0;flex-shrink:0}.mat-mini-fab:not([class*=mat-elevation-z]){box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.mat-mini-fab:not([disabled]):active:not([class*=mat-elevation-z]){box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.mat-mini-fab .mat-button-wrapper{padding:8px 0;display:inline-block;line-height:24px}.mat-icon-button{padding:0;min-width:0;width:40px;height:40px;flex-shrink:0;line-height:40px;border-radius:50%}.mat-icon-button .mat-icon,.mat-icon-button i{line-height:24px}.mat-button,.mat-fab,.mat-icon-button,.mat-mini-fab,.mat-raised-button{color:currentColor}.mat-button .mat-button-wrapper>*,.mat-fab .mat-button-wrapper>*,.mat-icon-button .mat-button-wrapper>*,.mat-mini-fab .mat-button-wrapper>*,.mat-raised-button .mat-button-wrapper>*{vertical-align:middle}.mat-button-focus-overlay,.mat-button-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}.mat-button-focus-overlay{background-color:rgba(0,0,0,.12);border-radius:inherit;opacity:0;transition:opacity .2s cubic-bezier(.35,0,.25,1),background-color .2s cubic-bezier(.35,0,.25,1)}@media screen and (-ms-high-contrast:active){.mat-button-focus-overlay{background-color:rgba(255,255,255,.5)}}.mat-button-ripple-round{border-radius:50%;z-index:1}@media screen and (-ms-high-contrast:active){.mat-button,.mat-fab,.mat-icon-button,.mat-mini-fab,.mat-raised-button{outline:solid 1px}}"],data:{}});function s_(n){return l._33(2,[(n()(),l._9(0,0,null,null,1,"span",[["class","mat-button-wrapper"]],null,null,null,null,null)),l._21(null,0),(n()(),l._9(2,0,null,null,1,"div",[["class","mat-button-ripple mat-ripple"],["matRipple",""]],[[2,"mat-button-ripple-round",null],[2,"mat-ripple-unbounded",null]],null,null,null,null)),l._8(3,212992,null,0,ir,[l.l,l.B,Hl,[2,rr]],{centered:[0,"centered"],disabled:[1,"disabled"],trigger:[2,"trigger"]},null),(n()(),l._9(4,0,null,null,0,"div",[["class","mat-button-focus-overlay"]],null,null,null,null,null))],function(n,t){var e=t.component;n(t,3,0,e._isIconButton,e._isRippleDisabled(),e._getHostElement())},function(n,t){var e=t.component;n(t,2,0,e._isRoundButton||e._isIconButton,l._22(t,3).unbounded)})}var a_=l._7({encapsulation:2,styles:[".mat-progress-bar{display:block;height:5px;overflow:hidden;position:relative;transition:opacity 250ms linear;width:100%}.mat-progress-bar .mat-progress-bar-element,.mat-progress-bar .mat-progress-bar-fill::after{height:100%;position:absolute;width:100%}.mat-progress-bar .mat-progress-bar-background{background-repeat:repeat-x;background-size:10px 4px;display:none}.mat-progress-bar .mat-progress-bar-buffer{transform-origin:top left;transition:transform 250ms ease}.mat-progress-bar .mat-progress-bar-secondary{display:none}.mat-progress-bar .mat-progress-bar-fill{animation:none;transform-origin:top left;transition:transform 250ms ease}.mat-progress-bar .mat-progress-bar-fill::after{animation:none;content:'';display:inline-block;left:0}.mat-progress-bar[dir=rtl],[dir=rtl] .mat-progress-bar{transform:rotateY(180deg)}.mat-progress-bar[mode=query]{transform:rotateZ(180deg)}.mat-progress-bar[mode=query][dir=rtl],[dir=rtl] .mat-progress-bar[mode=query]{transform:rotateZ(180deg) rotateY(180deg)}.mat-progress-bar[mode=indeterminate] .mat-progress-bar-fill,.mat-progress-bar[mode=query] .mat-progress-bar-fill{transition:none}.mat-progress-bar[mode=indeterminate] .mat-progress-bar-primary,.mat-progress-bar[mode=query] .mat-progress-bar-primary{-webkit-backface-visibility:hidden;backface-visibility:hidden;animation:mat-progress-bar-primary-indeterminate-translate 2s infinite linear;left:-145.166611%}.mat-progress-bar[mode=indeterminate] .mat-progress-bar-primary.mat-progress-bar-fill::after,.mat-progress-bar[mode=query] .mat-progress-bar-primary.mat-progress-bar-fill::after{-webkit-backface-visibility:hidden;backface-visibility:hidden;animation:mat-progress-bar-primary-indeterminate-scale 2s infinite linear}.mat-progress-bar[mode=indeterminate] .mat-progress-bar-secondary,.mat-progress-bar[mode=query] .mat-progress-bar-secondary{-webkit-backface-visibility:hidden;backface-visibility:hidden;animation:mat-progress-bar-secondary-indeterminate-translate 2s infinite linear;left:-54.888891%;display:block}.mat-progress-bar[mode=indeterminate] .mat-progress-bar-secondary.mat-progress-bar-fill::after,.mat-progress-bar[mode=query] .mat-progress-bar-secondary.mat-progress-bar-fill::after{-webkit-backface-visibility:hidden;backface-visibility:hidden;animation:mat-progress-bar-secondary-indeterminate-scale 2s infinite linear}.mat-progress-bar[mode=buffer] .mat-progress-bar-background{-webkit-backface-visibility:hidden;backface-visibility:hidden;animation:mat-progress-bar-background-scroll 250ms infinite linear;display:block}@keyframes mat-progress-bar-primary-indeterminate-translate{0%{transform:translateX(0)}20%{animation-timing-function:cubic-bezier(.5,0,.70173,.49582);transform:translateX(0)}59.15%{animation-timing-function:cubic-bezier(.30244,.38135,.55,.95635);transform:translateX(83.67142%)}100%{transform:translateX(200.61106%)}}@keyframes mat-progress-bar-primary-indeterminate-scale{0%{transform:scaleX(.08)}36.65%{animation-timing-function:cubic-bezier(.33473,.12482,.78584,1);transform:scaleX(.08)}69.15%{animation-timing-function:cubic-bezier(.06,.11,.6,1);transform:scaleX(.66148)}100%{transform:scaleX(.08)}}@keyframes mat-progress-bar-secondary-indeterminate-translate{0%{animation-timing-function:cubic-bezier(.15,0,.51506,.40969);transform:translateX(0)}25%{animation-timing-function:cubic-bezier(.31033,.28406,.8,.73371);transform:translateX(37.65191%)}48.35%{animation-timing-function:cubic-bezier(.4,.62704,.6,.90203);transform:translateX(84.38617%)}100%{transform:translateX(160.27778%)}}@keyframes mat-progress-bar-secondary-indeterminate-scale{0%{animation-timing-function:cubic-bezier(.15,0,.51506,.40969);transform:scaleX(.08)}19.15%{animation-timing-function:cubic-bezier(.31033,.28406,.8,.73371);transform:scaleX(.4571)}44.15%{animation-timing-function:cubic-bezier(.4,.62704,.6,.90203);transform:scaleX(.72796)}100%{transform:scaleX(.08)}}@keyframes mat-progress-bar-background-scroll{to{transform:translateX(-10px)}}"],data:{}});function u_(n){return l._33(2,[(n()(),l._9(0,0,null,null,0,"div",[["class","mat-progress-bar-background mat-progress-bar-element"]],null,null,null,null,null)),(n()(),l._9(1,0,null,null,1,"div",[["class","mat-progress-bar-buffer mat-progress-bar-element"]],null,null,null,null,null)),l._8(2,278528,null,0,R,[l.v,l.l,l.G],{ngStyle:[0,"ngStyle"]},null),(n()(),l._9(3,0,null,null,1,"div",[["class","mat-progress-bar-primary mat-progress-bar-fill mat-progress-bar-element"]],null,null,null,null,null)),l._8(4,278528,null,0,R,[l.v,l.l,l.G],{ngStyle:[0,"ngStyle"]},null),(n()(),l._9(5,0,null,null,0,"div",[["class","mat-progress-bar-secondary mat-progress-bar-fill mat-progress-bar-element"]],null,null,null,null,null))],function(n,t){var e=t.component;n(t,2,0,e._bufferTransform()),n(t,4,0,e._primaryTransform())},null)}var c_=l._7({encapsulation:2,styles:[".mat-toolbar-row,.mat-toolbar-single-row{display:flex;box-sizing:border-box;padding:0 16px;width:100%;flex-direction:row;align-items:center;white-space:nowrap}.mat-toolbar-multiple-rows{display:flex;box-sizing:border-box;flex-direction:column;width:100%}.mat-toolbar-multiple-rows{min-height:64px}.mat-toolbar-row,.mat-toolbar-single-row{height:64px}@media (max-width:600px){.mat-toolbar-multiple-rows{min-height:56px}.mat-toolbar-row,.mat-toolbar-single-row{height:56px}}"],data:{}});function d_(n){return l._33(2,[l._21(null,0),l._21(null,1)],null,null)}var h_=function(){function n(n,t,e){this.appService=n,this.languageService=t,this.dialog=e}return n.prototype.ngOnInit=function(){var n=this;this.subscription=this.languageService.currentLanguage.subscribe(function(t){return n.language=t})},n.prototype.ngOnDestroy=function(){this.subscription.unsubscribe()},n.prototype.changelanguage=function(){var n=this;zc(this.dialog).subscribe(function(t){t&&n.languageService.changeLanguage(t)})},n}(),p_=l._7({encapsulation:0,styles:[["[_nghost-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;color:#fafafa;width:100%}.buttons-left[_ngcontent-%COMP%]{display:inline-block;padding:0 10px;width:120px}.title[_ngcontent-%COMP%]{font-size:13px;font-weight:700;display:inline;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;letter-spacing:1px;line-height:50px;text-align:center}.buttons-right[_ngcontent-%COMP%]{display:inline-block;text-align:right;width:120px}.buttons-right[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{display:inline-block}button[_ngcontent-%COMP%]{height:50px;width:50px}.color-primary[_ngcontent-%COMP%]{color:#0072ff}.separator[_ngcontent-%COMP%]{width:100%;height:2px;background-color:rgba(30,34,39,.05);margin:8px 0}.flag[_ngcontent-%COMP%]{width:16px;height:16px;position:relative;top:3px}"]],data:{}});function f_(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"button",[["class","mat-menu-item"],["mat-menu-item",""],["role","menuitem"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,1)._checkDisabled(e)&&r),"mouseenter"===t&&(r=!1!==l._22(n,1)._emitHoverEvent()&&r),r},jf,Yf)),l._8(1,180224,[[1,4]],0,bu,[l.l],{disabled:[0,"disabled"]},null),(n()(),l._31(2,0,[" v"," "]))],function(n,t){n(t,1,0,!0)},function(n,t){var e=t.component;n(t,0,0,l._22(t,1)._highlighted,l._22(t,1)._triggersSubmenu,l._22(t,1)._getTabIndex(),l._22(t,1).disabled.toString(),l._22(t,1).disabled||null),n(t,2,0,e.appService.version.version)})}function __(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"div",[["class","mat-menu-item"],["mat-menu-item",""],["role","menuitem"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(n,t,e){var r=!0,i=n.component;return"click"===t&&(r=!1!==l._22(n,1)._checkDisabled(e)&&r),"mouseenter"===t&&(r=!1!==l._22(n,1)._emitHoverEvent()&&r),"click"===t&&(r=!1!==i.changelanguage()&&r),r},jf,Yf)),l._8(1,180224,[[2,4]],0,bu,[l.l],null,null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(3,0,null,0,0,"img",[["class","flag"]],[[8,"src",4]],null,null,null,null)),(n()(),l._31(4,0,["\n ","\n "]))],null,function(n,t){var e=t.component;n(t,0,0,l._22(t,1)._highlighted,l._22(t,1)._triggersSubmenu,l._22(t,1)._getTabIndex(),l._22(t,1).disabled.toString(),l._22(t,1).disabled||null),n(t,3,0,"assets/img/lang/"+e.language.iconName),n(t,4,0,e.language.name)})}function m_(n){return l._33(0,[(n()(),l._9(0,0,null,null,0,"div",[["class","buttons-left"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n"])),(n()(),l._9(2,0,null,null,1,"div",[["class","title"]],null,null,null,null,null)),(n()(),l._31(3,null,["\n ","\n"])),(n()(),l._31(-1,null,["\n"])),(n()(),l._9(5,0,null,null,79,"div",[["class","buttons-right"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(7,0,null,null,34,"mat-menu",[],null,null,null,Ef,Df)),l._8(8,1228800,[["settingsMenu",4]],1,wu,[l.l,l.B,vu],{overlapTrigger:[0,"overlapTrigger"]},null),l._29(603979776,1,{items:1}),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(11,0,null,0,5,"button",[["class","mat-menu-item"],["mat-menu-item",""],["role","menuitem"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,12)._checkDisabled(e)&&r),"mouseenter"===t&&(r=!1!==l._22(n,12)._emitHoverEvent()&&r),"click"===t&&(r=!1!==l._22(n,13).onClick()&&r),r},jf,Yf)),l._8(12,180224,[[1,4]],0,bu,[l.l],null,null),l._8(13,16384,null,0,pp,[cp,Ch,[8,null],l.G,l.l],{routerLink:[0,"routerLink"]},null),l._24(14,1),(n()(),l._31(15,0,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(18,0,null,0,5,"button",[["class","mat-menu-item"],["mat-menu-item",""],["role","menuitem"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,19)._checkDisabled(e)&&r),"mouseenter"===t&&(r=!1!==l._22(n,19)._emitHoverEvent()&&r),"click"===t&&(r=!1!==l._22(n,20).onClick()&&r),r},jf,Yf)),l._8(19,180224,[[1,4]],0,bu,[l.l],null,null),l._8(20,16384,null,0,pp,[cp,Ch,[8,null],l.G,l.l],{routerLink:[0,"routerLink"]},null),l._24(21,1),(n()(),l._31(22,0,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(25,0,null,0,5,"button",[["class","mat-menu-item"],["mat-menu-item",""],["role","menuitem"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,26)._checkDisabled(e)&&r),"mouseenter"===t&&(r=!1!==l._22(n,26)._emitHoverEvent()&&r),"click"===t&&(r=!1!==l._22(n,27).onClick()&&r),r},jf,Yf)),l._8(26,180224,[[1,4]],0,bu,[l.l],null,null),l._8(27,16384,null,0,pp,[cp,Ch,[8,null],l.G,l.l],{routerLink:[0,"routerLink"]},null),l._24(28,1),(n()(),l._31(29,0,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(32,0,null,0,5,"button",[["class","mat-menu-item"],["mat-menu-item",""],["role","menuitem"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,33)._checkDisabled(e)&&r),"mouseenter"===t&&(r=!1!==l._22(n,33)._emitHoverEvent()&&r),"click"===t&&(r=!1!==l._22(n,34).onClick()&&r),r},jf,Yf)),l._8(33,180224,[[1,4]],0,bu,[l.l],null,null),l._8(34,16384,null,0,pp,[cp,Ch,[8,null],l.G,l.l],{routerLink:[0,"routerLink"]},null),l._24(35,1),(n()(),l._31(36,0,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,f_)),l._8(40,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(43,0,null,null,20,"mat-menu",[],null,null,null,Ef,Df)),l._8(44,1228800,[["menuMenu",4]],1,wu,[l.l,l.B,vu],{overlapTrigger:[0,"overlapTrigger"]},null),l._29(603979776,2,{items:1}),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(47,0,null,0,5,"button",[["class","mat-menu-item"],["mat-menu-item",""],["role","menuitem"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,48)._checkDisabled(e)&&r),"mouseenter"===t&&(r=!1!==l._22(n,48)._emitHoverEvent()&&r),"click"===t&&(r=!1!==l._22(n,49).onClick()&&r),r},jf,Yf)),l._8(48,180224,[[2,4]],0,bu,[l.l],null,null),l._8(49,16384,null,0,pp,[cp,Ch,[8,null],l.G,l.l],{routerLink:[0,"routerLink"]},null),l._24(50,1),(n()(),l._31(51,0,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(54,0,null,0,3,"a",[["class","color-primary mat-menu-item"],["mat-menu-item",""],["rel","noreferrer nofollow"],["role","menuitem"],["target","_blank"]],[[8,"href",4],[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,55)._checkDisabled(e)&&r),"mouseenter"===t&&(r=!1!==l._22(n,55)._emitHoverEvent()&&r),r},jf,Yf)),l._8(55,180224,[[2,4]],0,bu,[l.l],null,null),(n()(),l._31(56,0,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(59,0,null,0,0,"div",[["class","separator"]],null,null,null,null,null)),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,__)),l._8(62,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(65,16777216,null,null,8,"button",[["aria-haspopup","true"],["class","mat-icon-button"],["mat-icon-button",""]],[[8,"disabled",0]],[[null,"mousedown"],[null,"keydown"],[null,"click"]],function(n,t,e){var r=!0;return"mousedown"===t&&(r=!1!==l._22(n,68)._handleMousedown(e)&&r),"keydown"===t&&(r=!1!==l._22(n,68)._handleKeydown(e)&&r),"click"===t&&(r=!1!==l._22(n,68)._handleClick(e)&&r),r},i_,r_)),l._8(66,180224,null,0,Bs,[l.l,Hl,Rr],null,null),l._8(67,16384,null,0,Fs,[],null,null),l._8(68,1196032,null,0,ku,[Pi,l.l,l.R,xu,[2,wu],[8,null],[2,Dl]],{menu:[0,"menu"]},null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(70,0,null,0,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(71,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["settings"])),(n()(),l._31(-1,0,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(75,16777216,null,null,8,"button",[["aria-haspopup","true"],["class","mat-icon-button"],["mat-icon-button",""]],[[8,"disabled",0]],[[null,"mousedown"],[null,"keydown"],[null,"click"]],function(n,t,e){var r=!0;return"mousedown"===t&&(r=!1!==l._22(n,78)._handleMousedown(e)&&r),"keydown"===t&&(r=!1!==l._22(n,78)._handleKeydown(e)&&r),"click"===t&&(r=!1!==l._22(n,78)._handleClick(e)&&r),r},i_,r_)),l._8(76,180224,null,0,Bs,[l.l,Hl,Rr],null,null),l._8(77,16384,null,0,Fs,[],null,null),l._8(78,1196032,null,0,ku,[Pi,l.l,l.R,xu,[2,wu],[8,null],[2,Dl]],{menu:[0,"menu"]},null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(80,0,null,0,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(81,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["menu"])),(n()(),l._31(-1,0,["\n "])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,8,0,!1),n(t,13,0,n(t,14,0,"/settings/network")),n(t,20,0,n(t,21,0,"/settings/blockchain")),n(t,27,0,n(t,28,0,"/settings/outputs")),n(t,34,0,n(t,35,0,"/settings/pending-transactions")),n(t,40,0,e.appService.version),n(t,44,0,!1),n(t,49,0,n(t,50,0,"/settings/backup")),n(t,62,0,e.language),n(t,68,0,l._22(t,8)),n(t,71,0),n(t,78,0,l._22(t,44)),n(t,81,0)},function(n,t){var e=t.component;n(t,3,0,e.headline),n(t,11,0,l._22(t,12)._highlighted,l._22(t,12)._triggersSubmenu,l._22(t,12)._getTabIndex(),l._22(t,12).disabled.toString(),l._22(t,12).disabled||null),n(t,15,0,l._32(t,15,0,l._22(t,16).transform("title.network"))),n(t,18,0,l._22(t,19)._highlighted,l._22(t,19)._triggersSubmenu,l._22(t,19)._getTabIndex(),l._22(t,19).disabled.toString(),l._22(t,19).disabled||null),n(t,22,0,l._32(t,22,0,l._22(t,23).transform("title.blockchain"))),n(t,25,0,l._22(t,26)._highlighted,l._22(t,26)._triggersSubmenu,l._22(t,26)._getTabIndex(),l._22(t,26).disabled.toString(),l._22(t,26).disabled||null),n(t,29,0,l._32(t,29,0,l._22(t,30).transform("title.outputs"))),n(t,32,0,l._22(t,33)._highlighted,l._22(t,33)._triggersSubmenu,l._22(t,33)._getTabIndex(),l._22(t,33).disabled.toString(),l._22(t,33).disabled||null),n(t,36,0,l._32(t,36,0,l._22(t,37).transform("title.pending-txs"))),n(t,47,0,l._22(t,48)._highlighted,l._22(t,48)._triggersSubmenu,l._22(t,48)._getTabIndex(),l._22(t,48).disabled.toString(),l._22(t,48).disabled||null),n(t,51,0,l._32(t,51,0,l._22(t,52).transform("title.backup"))),n(t,54,0,e.appService.explorerUrl,l._22(t,55)._highlighted,l._22(t,55)._triggersSubmenu,l._22(t,55)._getTabIndex(),l._22(t,55).disabled.toString(),l._22(t,55).disabled||null),n(t,56,0,l._32(t,56,0,l._22(t,57).transform("title.explorer"))),n(t,65,0,l._22(t,66).disabled||null),n(t,75,0,l._22(t,76).disabled||null)})}var g_=l._7({encapsulation:0,styles:[[".button-container[_ngcontent-%COMP%]{display:inline-block}button[_ngcontent-%COMP%]{border-radius:25px;height:50px;margin:20px 10px 0;width:160px;overflow:hidden}button.enabled[_ngcontent-%COMP%]{background-color:rgba(30,34,39,.05);-webkit-box-shadow:none;box-shadow:none;color:#1e2227}mat-icon[_ngcontent-%COMP%]{margin-left:10px;opacity:.3;line-height:20px}mat-spinner[_ngcontent-%COMP%]{display:inline-block;height:24px!important;width:24px!important;margin-left:10px;position:relative;top:-2px}"]],data:{}});function y_(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(1,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["done"]))],function(n,t){n(t,1,0)},null)}function b_(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(1,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["error"]))],function(n,t){n(t,1,0)},null)}function v_(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"mat-spinner",[["class","in-button mat-spinner mat-progress-spinner"],["mode","indeterminate"],["role","progressbar"]],[[4,"width","px"],[4,"height","px"]],null,null,Pf,Lf)),l._8(1,573440,null,0,Wu,[l.l,Hl,[2,sn]],null,null)],null,function(n,t){n(t,0,0,l._22(t,1)._elementSize,l._22(t,1)._elementSize)})}function w_(n){return l._33(0,[l._29(402653184,1,{tooltip:0}),l._29(402653184,2,{button:0}),(n()(),l._9(2,0,null,null,21,"div",[["class","button-container"]],null,[[null,"mouseenter"],[null,"mouseleave"]],function(n,t,e){var l=!0,r=n.component;return"mouseenter"===t&&(l=0!=(r.mouseOver=!0)&&l),"mouseleave"===t&&(l=0!=(r.mouseOver=!1)&&l),l},null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,16777216,null,null,18,"button",[["class","mat-button mat-raised-button"],["color","primary"],["mat-button",""],["mat-raised-button",""],["type","submit"]],[[8,"disabled",0]],[[null,"click"],[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0,i=n.component;return"longpress"===t&&(r=!1!==l._22(n,10).show()&&r),"keydown"===t&&(r=!1!==l._22(n,10)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,10).hide(1500)&&r),"click"===t&&(r=!1!==(0!==i.state?i.onClick():null)&&r),r},i_,r_)),l._8(5,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(6,{enabled:0}),l._8(7,180224,[[2,4],["button",4]],0,Bs,[l.l,Hl,Rr],{disabled:[0,"disabled"],color:[1,"color"]},null),l._8(8,16384,null,0,Hs,[],null,null),l._8(9,16384,null,0,Ns,[],null,null),l._8(10,147456,[[1,4],["tooltip",4]],0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),(n()(),l._31(-1,0,["\n "])),l._21(0,0),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,y_)),l._8(15,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,b_)),l._8(18,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,v_)),l._8(21,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n "])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,5,0,n(t,6,0,!e.disabled)),n(t,7,0,e.disabled&&!e.forceEmitEvents,"primary"),n(t,10,0,e.error?e.error:null),n(t,15,0,1===e.state),n(t,18,0,2===e.state),n(t,21,0,0===e.state)},function(n,t){n(t,4,0,l._22(t,7).disabled||null)})}var x_=l._7({encapsulation:0,styles:[[".-small-button[_ngcontent-%COMP%] button{width:unset;height:unset;padding:0 10px;min-width:100px;margin:unset;font-size:13px}.-toggle[_ngcontent-%COMP%] button{-webkit-box-shadow:unset;box-shadow:unset;background-color:rgba(0,0,0,0)!important;line-height:unset!important;min-height:26px}.-toggle[_ngcontent-%COMP%] button span{color:#171a1d;line-height:unset!important}.-toggle[_ngcontent-%COMP%] button.enabled{background-color:#171a1d!important}.-toggle[_ngcontent-%COMP%] button.enabled span{color:#fafafa}.-buttons-container[_ngcontent-%COMP%]{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;padding:5px;background:rgba(255,255,255,.1);border-radius:100px;margin:0 auto;text-align:center}.light.-buttons-container[_ngcontent-%COMP%]{background:#f1f1f1}.light[_ngcontent-%COMP%] .-toggle[_ngcontent-%COMP%] button.enabled{background-color:#fff!important}.light[_ngcontent-%COMP%] .-toggle[_ngcontent-%COMP%] button.enabled span{color:#1e2227}@media (min-width:768px) and (max-width:991px){.-buttons-container.navbar.light[_ngcontent-%COMP%]{border-radius:20px}.-buttons-container.navbar.light[_ngcontent-%COMP%] app-button[_ngcontent-%COMP%] .button-container{display:block}}.small.-buttons-container[_ngcontent-%COMP%]{padding:2px;line-height:0}.small[_ngcontent-%COMP%] .-small-button[_ngcontent-%COMP%] button{padding:0 10px;min-width:70px;font-size:9px;min-height:16px}"]],data:{}});function M_(n){return l._33(0,[(n()(),l._9(0,0,null,null,9,"div",[],[[8,"className",0]],null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"app-button",[["class","-toggle dark -small-button"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.onLeftClick()&&l),l},w_,g_)),l._8(3,49152,null,0,Lc,[],{disabled:[0,"disabled"],forceEmitEvents:[1,"forceEmitEvents"]},{action:"action"}),(n()(),l._31(4,0,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,2,"app-button",[["class","-toggle dark -small-button"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.onRightClick()&&l),l},w_,g_)),l._8(7,49152,null,0,Lc,[],{disabled:[0,"disabled"],forceEmitEvents:[1,"forceEmitEvents"]},{action:"action"}),(n()(),l._31(8,0,["",""])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,3,0,e.activeButton!==e.ButtonState.LeftButton,!0),n(t,7,0,e.activeButton!==e.ButtonState.RightButton,!0)},function(n,t){var e=t.component;n(t,0,0,l._12(1,"-buttons-container ",e.className,"")),n(t,4,0,e.leftButtonText),n(t,8,0,e.rightButtonText)})}var k_=function(){function n(n){this.navbarService=n,this.otcEnabled=Ll.otcEnabled,this.exchangeEnabled=!!r.swaplab.apiKey}return n.prototype.changeActiveComponent=function(n){this.navbarService.setActiveComponent(n)},n}(),C_=l._7({encapsulation:0,styles:[["[_nghost-%COMP%]{background-color:#fbfbfb;min-height:66px}.-buttons[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;width:100%}.-buttons[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%]{cursor:pointer;padding:0 20px}.-buttons[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{display:inline-block;float:left;height:66px;padding:17px 0;width:32px}.-buttons[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{display:inline-block;font-size:14px;height:66px;line-height:66px;margin:0 5px}.-buttons[_ngcontent-%COMP%] .-low-opacity[_ngcontent-%COMP%]{opacity:.2}.-buttons[_ngcontent-%COMP%] .-switch[_ngcontent-%COMP%]{-ms-flex-item-align:center;-ms-grid-row-align:center;align-self:center;padding:0 20px}"]],data:{}});function S_(n){return l._33(0,[(n()(),l._9(0,0,null,null,11,"div",[["class","-button -low-opacity"],["routerLink","/exchange"],["routerLinkActive","no-opacity"]],null,[[null,"click"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,1).onClick()&&r),r},null,null)),l._8(1,16384,[[7,4]],0,pp,[cp,Ch,[8,null],l.G,l.l],{routerLink:[0,"routerLink"]},null),l._8(2,1720320,null,2,mp,[cp,l.l,l.G,l.h],{routerLinkActive:[0,"routerLinkActive"]},null),l._29(603979776,7,{links:1}),l._29(603979776,8,{linksWithHrefs:1}),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,0,"img",[["src","../../../../../assets/img/money-gold.png"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(9,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,1,0,"/exchange"),n(t,2,0,"no-opacity")},function(n,t){n(t,9,0,l._32(t,9,0,l._22(t,10).transform("title.buy-coin")))})}function O_(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"div",[["class","-button"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,0,"img",[["src","../../../../../assets/img/money-gold.png"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,2,"span",[["class","secondary-color"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,5,0,l._32(t,5,0,l._22(t,6).transform("title.buy-coin")))})}function T_(n){return l._33(0,[(n()(),l._9(0,0,null,null,6,"app-double-button",[["class","-switch"],["className","light navbar"]],null,[[null,"onStateChange"]],function(n,t,e){var l=!0;return"onStateChange"===t&&(l=!1!==n.component.changeActiveComponent(e)&&l),l},M_,x_)),l._8(1,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(2,{"-switch":0,"element-disabled":1}),l._8(3,49152,null,0,Bp,[],{rightButtonText:[0,"rightButtonText"],leftButtonText:[1,"leftButtonText"],activeButton:[2,"activeButton"],className:[3,"className"]},{onStateChange:"onStateChange"}),l._25(131072,De.i,[De.j,l.h]),l._25(131072,De.i,[De.j,l.h]),l._25(131072,nn,[l.h])],function(n,t){var e=t.component;n(t,1,0,"-switch",n(t,2,0,!0,e.navbarService.switchDiabled)),n(t,3,0,l._32(t,3,0,l._22(t,4).transform(e.navbarService.rightText)),l._32(t,3,1,l._22(t,5).transform(e.navbarService.leftText)),l._32(t,3,2,l._22(t,6).transform(e.navbarService.activeComponent)),"light navbar")},null)}function L_(n){return l._33(0,[(n()(),l._9(0,0,null,null,54,"div",[["class","container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,51,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,11,"div",[["class","-button -low-opacity"],["routerLink","/wallets"],["routerLinkActive","no-opacity"]],null,[[null,"click"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,5).onClick()&&r),r},null,null)),l._8(5,16384,[[1,4]],0,pp,[cp,Ch,[8,null],l.G,l.l],{routerLink:[0,"routerLink"]},null),l._8(6,1720320,null,2,mp,[cp,l.l,l.G,l.h],{routerLinkActive:[0,"routerLinkActive"]},null),l._29(603979776,1,{links:1}),l._29(603979776,2,{linksWithHrefs:1}),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,0,"img",[["src","../../../../../assets/img/wallet-black.png"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(13,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(17,0,null,null,11,"div",[["class","-button -low-opacity"],["routerLink","/send"],["routerLinkActive","no-opacity"]],null,[[null,"click"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,18).onClick()&&r),r},null,null)),l._8(18,16384,[[3,4]],0,pp,[cp,Ch,[8,null],l.G,l.l],{routerLink:[0,"routerLink"]},null),l._8(19,1720320,null,2,mp,[cp,l.l,l.G,l.h],{routerLinkActive:[0,"routerLinkActive"]},null),l._29(603979776,3,{links:1}),l._29(603979776,4,{linksWithHrefs:1}),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(23,0,null,null,0,"img",[["src","../../../../../assets/img/send-black.png"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(25,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(26,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(30,0,null,null,11,"div",[["class","-button -low-opacity"],["routerLink","/transactions"],["routerLinkActive","no-opacity"]],null,[[null,"click"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,31).onClick()&&r),r},null,null)),l._8(31,16384,[[5,4]],0,pp,[cp,Ch,[8,null],l.G,l.l],{routerLink:[0,"routerLink"]},null),l._8(32,1720320,null,2,mp,[cp,l.l,l.G,l.h],{routerLinkActive:[0,"routerLinkActive"]},null),l._29(603979776,5,{links:1}),l._29(603979776,6,{linksWithHrefs:1}),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(36,0,null,null,0,"img",[["src","../../../../../assets/img/transactions-black.png"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(38,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(39,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(43,0,null,null,0,"div",[["class","flex-fill"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,S_)),l._8(46,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,O_)),l._8(49,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,T_)),l._8(52,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,5,0,"/wallets"),n(t,6,0,"no-opacity"),n(t,18,0,"/send"),n(t,19,0,"no-opacity"),n(t,31,0,"/transactions"),n(t,32,0,"no-opacity"),n(t,46,0,e.exchangeEnabled),n(t,49,0,e.otcEnabled),n(t,52,0,e.navbarService.switchVisible)},function(n,t){n(t,13,0,l._32(t,13,0,l._22(t,14).transform("title.wallets"))),n(t,26,0,l._32(t,26,0,l._22(t,27).transform("title.send"))),n(t,39,0,l._32(t,39,0,l._22(t,40).transform("title.history")))})}o.a.prototype.skip=function(n){return function(n){return function(t){return t.lift(new yc(n))}}(n)(this)},o.a.prototype.take=function(n){return Object(_r.a)(n)(this)};var P_=function(){function n(n,t,e,l,r){this.appService=n,this.networkService=t,this.blockchainService=e,this.priceService=l,this.walletService=r,this.addresses=[],this.querying=!0,this.synchronized=!0,this.walletDownloadUrl=Ll.walletDownloadUrl,this.subscriptionsGroup=[]}return Object.defineProperty(n.prototype,"loading",{get:function(){return!(this.current&&this.highest&&this.current===this.highest&&this.coins&&"NaN"!==this.coins&&this.hours&&"NaN"!==this.hours)},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"coins",{get:function(){var n=new Ae.BigNumber("0");return this.addresses.map(function(t){return n=n.plus(t.coins)}),n.decimalPlaces(6).toString()},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"hours",{get:function(){var n=new Ae.BigNumber("0");return this.addresses.map(function(t){return n=n.plus(t.hours)}),n.decimalPlaces(0).toString()},enumerable:!0,configurable:!0}),n.prototype.ngOnInit=function(){var n=this;this.subscriptionsGroup.push(this.blockchainService.progress.filter(function(n){return!!n}).subscribe(function(t){n.querying=!1,n.highest=t.highest,n.current=t.current,n.percentage=n.current&&n.highest?n.current/n.highest:0,n.synchronizedSubscription||(n.synchronizedSubscription=n.blockchainService.synchronized.subscribe(function(t){return n.synchronized=t}))})),this.subscriptionsGroup.push(this.priceService.price.subscribe(function(t){return n.price=t})),this.subscriptionsGroup.push(this.walletService.allAddresses().subscribe(function(t){n.addresses=t.reduce(function(n,t){return n.find(function(n){return n.address===t.address})||n.push(t),n},[])})),this.subscriptionsGroup.push(this.walletService.pendingTransactions().subscribe(function(t){n.hasPendingTxs=t.user.length>0}))},n.prototype.ngOnDestroy=function(){this.subscriptionsGroup.forEach(function(n){return n.unsubscribe()}),this.synchronizedSubscription&&this.synchronizedSubscription.unsubscribe()},n}(),D_=l._7({encapsulation:0,styles:[[".-container[_ngcontent-%COMP%]{background-color:#fbfbfb;border-bottom:2px solid rgba(30,34,39,.05)}.large-header[_ngcontent-%COMP%]{background:#0072ff;background:-webkit-gradient(linear,left top,right bottom,from(rgba(0,114,255,.7)),to(rgba(0,195,255,.7))),url(header.03fb33b04c982a1a804d.png) center center no-repeat;background:linear-gradient(to bottom right,rgba(0,114,255,.7),rgba(0,195,255,.7)),url(header.03fb33b04c982a1a804d.png) center center no-repeat;background-size:100% auto;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-flow:column;flex-flow:column;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;min-height:190px}.balance-container[_ngcontent-%COMP%]{-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:#fafafa;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;font-size:12px;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;text-align:center}.balance-container[_ngcontent-%COMP%] .balance[_ngcontent-%COMP%] .coins[_ngcontent-%COMP%]{line-height:1;margin:0 0 .5em}.balance-container[_ngcontent-%COMP%] .balance[_ngcontent-%COMP%] .coins[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{font-size:4em}.balance-container[_ngcontent-%COMP%] .dollars[_ngcontent-%COMP%]{margin:0}.hour-balance[_ngcontent-%COMP%]{text-align:center}.hour-balance[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{background-color:rgba(255,255,255,.3);border-radius:15px;color:#171a1d;display:inline-block;font-size:12px;line-height:22px;margin:1em 0 2em;padding:0 30px}.notification-bar[_ngcontent-%COMP%]{background-color:#f44a4d;color:#fbfbfb}.notification-bar[_ngcontent-%COMP%] div[_ngcontent-%COMP%]{margin:auto}.notification-bar[_ngcontent-%COMP%] div[_ngcontent-%COMP%] a[_ngcontent-%COMP%]{text-decoration:none;color:#ffebee}"]],data:{}});function A_(n){return l._33(0,[(n()(),l._9(0,0,null,null,3,"p",[["class","coins"]],null,null,null,null,null)),(n()(),l._9(1,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(2,null,["",""])),l._27(3,2)],null,function(n,t){var e=t.component;n(t,2,0,l._32(t,2,0,n(t,3,0,l._22(t.parent,0),e.percentage,"1.2-2")))})}function E_(n){return l._33(0,[(n()(),l._9(0,0,null,null,5,"p",[["class","coins"]],null,null,null,null,null)),(n()(),l._9(1,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(2,null,["",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(4,null,[" ",""])),l._25(0,If,[tn,qc,gf])],null,function(n,t){var e=t.component;n(t,2,0,l._32(t,2,0,l._22(t,3).transform(e.coins,!0,"first"))),n(t,4,0,l._32(t,4,0,l._22(t,5).transform(e.coins,!0,"last")))})}function Y_(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"p",[["class","coins"]],null,null,null,null,null)),(n()(),l._9(1,0,null,null,1,"span",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\xa0"]))],null,null)}function j_(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["",""])),l._27(2,4)],null,function(n,t){var e=t.component;n(t,1,0,l._32(t,1,0,n(t,2,0,l._22(t.parent.parent,1),e.coins*e.price,"USD","symbol","1.2-2")))})}function I_(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"span",[],null,null,null,null,null)),(n()(),l._31(-1,null,["-"]))],null,null)}function R_(n){return l._33(0,[(n()(),l._9(0,0,null,null,8,"span",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,j_)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,I_)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(7,null,["\n (",")\n "])),l._27(8,4)],function(n,t){var e=t.component;n(t,3,0,!e.loading),n(t,6,0,e.loading)},function(n,t){var e=t.component;n(t,7,0,l._32(t,7,0,n(t,8,0,l._22(t.parent,1),e.price,"USD","symbol","1.2-2")))})}function H_(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["",""])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("common.loading")))})}function N_(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"p",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n ","\n ","\n "])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){var e=t.component;n(t,1,0,l._32(t,1,0,l._22(t,2).transform("header.syncing-blocks")),e.current&&e.highest?"("+e.current+"/"+e.highest+")":"...")})}function F_(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"p",[],null,null,null,null,null)),(n()(),l._31(1,null,["",""])),l._25(0,If,[tn,qc,gf])],null,function(n,t){var e=t.component;n(t,1,0,l._32(t,1,0,l._22(t,2).transform(e.hours,!1)))})}function B_(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"mat-progress-bar",[["aria-valuemax","100"],["aria-valuemin","0"],["class","example-margin mat-progress-bar"],["color","primary"],["role","progressbar"]],[[1,"aria-valuenow",0],[1,"mode",0],[2,"mat-primary",null],[2,"mat-accent",null],[2,"mat-warn",null]],null,null,u_,a_)),l._8(1,49152,null,0,Nu,[],{color:[0,"color"],value:[1,"value"],mode:[2,"mode"]},null)],function(n,t){var e=t.component;n(t,1,0,"primary",100*e.percentage,e.querying?"query":"determinate")},function(n,t){n(t,0,0,l._22(t,1).value,l._22(t,1).mode,"primary"==l._22(t,1).color,"accent"==l._22(t,1).color,"warn"==l._22(t,1).color)})}function V_(n){return l._33(0,[(n()(),l._9(0,0,null,null,11,"mat-toolbar",[["class","notification-bar mat-toolbar"]],[[2,"mat-toolbar-multiple-rows",null],[2,"mat-toolbar-single-row",null]],null,null,d_,c_)),l._8(1,4243456,null,1,Ju,[l.l,Hl],null,null),l._29(603979776,1,{_toolbarRows:1}),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(4,0,null,0,6,"div",[],null,null,null,null,null)),(n()(),l._31(5,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(7,0,null,null,1,"a",[["rel","noreferrer nofollow"],["target","_blank"]],[[8,"href",4]],null,null,null,null)),(n()(),l._31(8,null,["v",""])),(n()(),l._31(9,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "]))],null,function(n,t){var e=t.component;n(t,0,0,l._22(t,1)._toolbarRows.length,!l._22(t,1)._toolbarRows.length),n(t,5,0,l._32(t,5,0,l._22(t,6).transform("header.update1"))),n(t,7,0,e.walletDownloadUrl),n(t,8,0,e.appService.lastestVersion),n(t,9,0,l._32(t,9,0,l._22(t,10).transform("header.update2")))})}function W_(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"div",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(3,0,null,null,2,"a",[["href","https://web.telegram.org/#/im?p=@skycoinsupport"],["rel","noreferrer nofollow"],["target","_blank"]],null,null,null,null,null)),(n()(),l._31(4,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(6,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("header.errors.no-backend1"))),n(t,4,0,l._32(t,4,0,l._22(t,5).transform("header.errors.no-backend2"))),n(t,6,0,l._32(t,6,0,l._22(t,7).transform("header.errors.no-backend3")))})}function z_(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"div",[],null,null,null,null,null)),(n()(),l._31(1,null,["",""])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("header.errors.csrf")))})}function U_(n){return l._33(0,[(n()(),l._9(0,0,null,null,9,"mat-toolbar",[["class","notification-bar mat-toolbar"]],[[2,"mat-toolbar-multiple-rows",null],[2,"mat-toolbar-single-row",null]],null,null,d_,c_)),l._8(1,4243456,null,1,Ju,[l.l,Hl],null,null),l._29(603979776,2,{_toolbarRows:1}),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,W_)),l._8(5,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,z_)),l._8(8,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n "]))],function(n,t){var e=t.component;n(t,5,0,2===e.appService.error),n(t,8,0,3===e.appService.error)},function(n,t){n(t,0,0,l._22(t,1)._toolbarRows.length,!l._22(t,1)._toolbarRows.length)})}function G_(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"mat-toolbar",[["class","notification-bar mat-toolbar"]],[[2,"mat-toolbar-multiple-rows",null],[2,"mat-toolbar-single-row",null]],null,null,d_,c_)),l._8(1,4243456,null,1,Ju,[l.l,Hl],null,null),l._29(603979776,3,{_toolbarRows:1}),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(4,0,null,0,2,"div",[],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "]))],null,function(n,t){n(t,0,0,l._22(t,1)._toolbarRows.length,!l._22(t,1)._toolbarRows.length),n(t,5,0,l._32(t,5,0,l._22(t,6).transform("header.errors.no-connections")))})}function q_(n){return l._33(0,[(n()(),l._9(0,0,null,null,8,"div",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(3,0,null,null,3,"a",[["routerLink","/settings/pending-transactions"]],[[1,"target",0],[8,"href",4]],[[null,"click"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,4).onClick(e.button,e.ctrlKey,e.metaKey,e.shiftKey)&&r),r},null,null)),l._8(4,671744,null,0,fp,[cp,Ch,u],{routerLink:[0,"routerLink"]},null),(n()(),l._31(5,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(7,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h])],function(n,t){n(t,4,0,"/settings/pending-transactions")},function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("header.pending-txs1"))),n(t,3,0,l._22(t,4).target,l._22(t,4).href),n(t,5,0,l._32(t,5,0,l._22(t,6).transform("header.pending-txs2"))),n(t,7,0,l._32(t,7,0,l._22(t,8).transform("header.pending-txs3")))})}function J_(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"div",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("header.synchronizing")))})}function Q_(n){return l._33(0,[(n()(),l._9(0,0,null,null,9,"mat-toolbar",[["class","notification-bar mat-toolbar"]],[[2,"mat-toolbar-multiple-rows",null],[2,"mat-toolbar-single-row",null]],null,null,d_,c_)),l._8(1,4243456,null,1,Ju,[l.l,Hl],null,null),l._29(603979776,4,{_toolbarRows:1}),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,q_)),l._8(5,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,J_)),l._8(8,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n "]))],function(n,t){var e=t.component;n(t,5,0,e.hasPendingTxs),n(t,8,0,!e.synchronized&&!e.hasPendingTxs)},function(n,t){n(t,0,0,l._22(t,1)._toolbarRows.length,!l._22(t,1)._toolbarRows.length)})}function K_(n){return l._33(0,[l._25(0,en,[l.w]),l._25(0,ln,[l.w]),(n()(),l._9(2,0,null,null,58,"div",[["class","-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,37,"div",[["class","large-header"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,1,"app-top-bar",[],null,null,null,m_,p_)),l._8(7,245760,null,0,h_,[gf,Bc,fa],{headline:[0,"headline"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(9,0,null,null,22,"div",[["class","balance-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(11,0,null,null,19,"div",[["class","balance"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,A_)),l._8(14,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,E_)),l._8(17,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Y_)),l._8(20,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(22,0,null,null,7,"p",[["class","dollars"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,R_)),l._8(25,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,H_)),l._8(28,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(33,0,null,null,7,"div",[["class","hour-balance"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,N_)),l._8(36,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,F_)),l._8(39,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(43,0,null,null,1,"app-nav-bar",[],null,null,null,L_,C_)),l._8(44,49152,null,0,k_,[Vp],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,B_)),l._8(47,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,V_)),l._8(50,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,U_)),l._8(53,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,G_)),l._8(56,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Q_)),l._8(59,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,7,0,e.headline),n(t,14,0,e.highest&&e.loading),n(t,17,0,!e.loading),n(t,20,0,!e.highest&&e.loading),n(t,25,0,e.price),n(t,28,0,!e.price),n(t,36,0,e.loading),n(t,39,0,!e.loading),n(t,47,0,e.loading),n(t,50,0,e.appService.updateAvailable),n(t,53,0,e.appService.error),n(t,56,0,!e.appService.error&&e.networkService.noConnections),n(t,59,0,e.hasPendingTxs||!e.synchronized)},null)}var X_=l._7({encapsulation:0,styles:[[".-width-130[_ngcontent-%COMP%]{width:130px;-ms-flex-negative:0;flex-shrink:0}.-width-250[_ngcontent-%COMP%]{width:250px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;padding-right:20px}.-headers[_ngcontent-%COMP%]{color:rgba(30,34,39,.2);display:-webkit-box;display:-ms-flexbox;display:flex;font-size:12px;font-weight:700;height:50px;line-height:50px;padding:0 130px 0 50px}.-wallets[_ngcontent-%COMP%]{margin:0 30px}.-body[_ngcontent-%COMP%]{border-radius:15px;-webkit-box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);margin:0 0 10px}.-wallet[_ngcontent-%COMP%]{background-color:#fafafa;border-bottom:1px solid rgba(30,34,39,.05);display:-webkit-box;display:-ms-flexbox;display:flex;font-size:13px;line-height:60px;height:60px;padding-left:20px;cursor:pointer}.-wallet[_ngcontent-%COMP%]:first-child{border-top-left-radius:10px;border-top-right-radius:10px}.-wallet[_ngcontent-%COMP%]:last-child{border-bottom-left-radius:10px;border-bottom-right-radius:10px}.-wallet[_ngcontent-%COMP%] .-label[_ngcontent-%COMP%]{color:#1e2227}.-wallet[_ngcontent-%COMP%] .-hours[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);text-align:right}.-wallet[_ngcontent-%COMP%] .-coins[_ngcontent-%COMP%]{color:#1e2227;text-align:right}.-wallet[_ngcontent-%COMP%] .-encryption[_ngcontent-%COMP%]{padding-left:20px}.-wallet[_ngcontent-%COMP%] .-encryption[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{border-radius:50%;background-color:#f7f7f7;display:inline-block;height:38px;margin:11px 0;padding:3px;width:38px;cursor:pointer}.-wallet[_ngcontent-%COMP%] .-expand[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:85px;margin-right:15px;-ms-flex-negative:0;flex-shrink:0}.-wallet[_ngcontent-%COMP%] .-expand[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{width:32px;height:32px}.-text-right[_ngcontent-%COMP%]{text-align:right}.action-buttons[_ngcontent-%COMP%]{margin-bottom:74px;padding:40px 0;text-align:center}.action-buttons[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{background-color:#f7f7f7;border:none;-webkit-box-shadow:none;box-shadow:none;color:rgba(30,34,39,.5);font-size:13px;margin:0 5px;min-width:140px}.action-buttons[_ngcontent-%COMP%] button[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{height:28px;margin-left:-4px;width:28px}"]],data:{}});function Z_(n){return l._33(0,[(n()(),l._9(0,16777216,null,null,2,"img",[["src","../../../../assets/img/lock-gold.png"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,1).show()&&r),"keydown"===t&&(r=!1!==l._22(n,1)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,1).hide(1500)&&r),r},null,null)),l._8(1,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._4(0,null,null,0))],function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("wallet.encryption-enabled")))},null)}function $_(n){return l._33(0,[(n()(),l._9(0,16777216,null,null,2,"img",[["src","../../../../assets/img/unlock-grey.png"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,1).show()&&r),"keydown"===t&&(r=!1!==l._22(n,1)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,1).hide(1500)&&r),r},null,null)),l._8(1,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._4(0,null,null,0))],function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("wallet.encryption-disabled")))},null)}function nm(n){return l._33(0,[(n()(),l._9(0,16777216,null,null,2,"img",[["src","../../../../assets/img/alert-red.png"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,1).show()&&r),"keydown"===t&&(r=!1!==l._22(n,1)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,1).hide(1500)&&r),r},null,null)),l._8(1,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._4(0,null,null,0))],function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("wallet.hw-security-warning")))},null)}function tm(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-wallet-detail",[],null,null,null,e_,Vf)),l._8(1,180224,null,0,Bf,[fa,Sc,jc,oc,De.j,cp,Ye],{wallet:[0,"wallet"]},null)],function(n,t){n(t,1,0,t.parent.context.$implicit)},null)}function em(n){return l._33(0,[(n()(),l._9(0,0,null,null,40,"div",[["class","-wallets"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,37,"div",[["class","-body"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,31,"div",[["class","-wallet"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.toggleWallet(n.context.$implicit)&&l),l},null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,1,"div",[["class","-width-250 -label"]],[[1,"title",0]],null,null,null,null)),(n()(),l._31(7,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(9,0,null,null,10,"div",[["class","-flex-fill -encryption"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Z_)),l._8(12,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,$_)),l._8(15,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,nm)),l._8(18,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(21,0,null,null,2,"div",[["class","-width-130 -coins"]],null,null,null,null,null)),(n()(),l._31(22,null,["",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(25,0,null,null,2,"div",[["class","-width-130 -hours"]],null,null,null,null,null)),(n()(),l._31(26,null,["",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(29,0,null,null,5,"div",[["class","-expand"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(31,0,null,null,2,"img",[["src","../../../../assets/img/chevron-right-grey.png"]],null,null,null,null,null)),l._8(32,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(33,{"rotate-270":0,"rotate-90":1}),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,tm)),l._8(38,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,12,0,t.context.$implicit.encrypted&&!t.context.$implicit.isHardware),n(t,15,0,!t.context.$implicit.encrypted&&!t.context.$implicit.isHardware),n(t,18,0,t.context.$implicit.hasHwSecurityWarnings&&t.context.$implicit.isHardware),n(t,32,0,n(t,33,0,t.context.$implicit.opened,!t.context.$implicit.opened)),n(t,38,0,t.context.$implicit.opened)},function(n,t){n(t,6,0,t.context.$implicit.label),n(t,7,0,t.context.$implicit.label),n(t,22,0,l._32(t,22,0,l._22(t,23).transform(t.context.$implicit.coins?t.context.$implicit.coins.toString():0,!0,"first"))),n(t,26,0,l._32(t,26,0,l._22(t,27).transform(t.context.$implicit.hours?t.context.$implicit.hours.toString():0,!1,"first")))})}function lm(n){return l._33(0,[(n()(),l._9(0,0,null,null,21,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,15,"div",[["class","-headers"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,2,"div",[["class","-width-250"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,0,"div",[["class","-flex-fill"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,2,"div",[["class","-width-130 -text-right"]],null,null,null,null,null)),(n()(),l._31(11,null,["",""])),l._25(0,l_,[gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,2,"div",[["class","-width-130 -text-right"]],null,null,null,null,null)),(n()(),l._31(15,null,["",""])),l._25(0,l_,[gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,em)),l._8(20,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,20,0,0===t.parent.context.$implicit?e.hardwareWallets:e.wallets)},function(n,t){n(t,5,0,l._32(t,5,0,l._22(t,6).transform(0===t.parent.context.$implicit?"wallet.hardware-wallet":"wallet.wallet"))),n(t,11,0,l._32(t,11,0,l._22(t,12).transform("coin"))),n(t,15,0,l._32(t,15,0,l._22(t,16).transform("hours")))})}function rm(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,lm)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,0===t.context.$implicit&&e.hardwareWallets.length>0||1===t.context.$implicit&&e.wallets.length>0)},null)}function im(n){return l._33(0,[(n()(),l._9(0,0,null,null,6,"button",[["class","mat-button"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.adminHwWallet()&&l),l},i_,r_)),l._8(1,180224,null,0,Bs,[l.l,Hl,Rr],null,null),l._8(2,16384,null,0,Hs,[],null,null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(4,0,null,0,0,"img",[["src","../../../../assets/img/hw-gold.png"]],null,null,null,null,null)),(n()(),l._31(5,0,[" ","\n "])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,0,0,l._22(t,1).disabled||null),n(t,5,0,l._32(t,5,0,l._22(t,6).transform("wallet.hardware-wallet")))})}function om(n){return l._33(0,[(n()(),l._9(0,0,null,null,34,"div",[["class","sky-container sky-container-grey"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"app-header",[],null,null,null,K_,D_)),l._8(3,245760,null,0,P_,[gf,nf,qc,rf,Sc],{headline:[0,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(6,0,null,null,27,"div",[["class","container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,2,null,rm)),l._8(9,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),l._24(10,2),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(12,0,null,null,20,"div",[["class","action-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,6,"button",[["class","mat-button"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.addWallet(!0)&&l),l},i_,r_)),l._8(15,180224,null,0,Bs,[l.l,Hl,Rr],null,null),l._8(16,16384,null,0,Hs,[],null,null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(18,0,null,0,0,"img",[["src","../../../../assets/img/plus-gold.png"]],null,null,null,null,null)),(n()(),l._31(19,0,[" ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(22,0,null,null,6,"button",[["class","mat-button"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.addWallet(!1)&&l),l},i_,r_)),l._8(23,180224,null,0,Bs,[l.l,Hl,Rr],null,null),l._8(24,16384,null,0,Hs,[],null,null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(26,0,null,0,0,"img",[["src","../../../../assets/img/load-gold.png"]],null,null,null,null,null)),(n()(),l._31(27,0,[" ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,im)),l._8(31,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,3,0,l._32(t,3,0,l._22(t,4).transform("title.wallets"))),n(t,9,0,n(t,10,0,0,1)),n(t,31,0,e.hwCompatibilityActivated)},function(n,t){n(t,14,0,l._22(t,15).disabled||null),n(t,19,0,l._32(t,19,0,l._22(t,20).transform("wallet.add"))),n(t,22,0,l._22(t,23).disabled||null),n(t,27,0,l._32(t,27,0,l._22(t,28).transform("wallet.load")))})}var sm=l._5("app-wallets",Np,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-wallets",[],null,null,null,om,X_)),l._8(1,245760,null,0,Np,[Sc,oc,fa,cp],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]);o.a.prototype.delay=function(n,t){return void 0===t&&(t=sl),Hi(n,t)(this)};var am=function(){function n(t,e,l,r,i){this.dialogRef=t,this.data=e,this.formBuilder=l,this.msgBarService=r,this.storageService=i,this.maxNoteChars=n.MAX_NOTE_CHARS}return n.prototype.ngOnInit=function(){this.originalNote=this.data.note?this.data.note:"",this.form=this.formBuilder.group({note:[this.data.note]})},n.prototype.ngOnDestroy=function(){this.msgBarService.hide(),this.OperationSubscription&&this.OperationSubscription.unsubscribe()},n.prototype.closePopup=function(){this.dialogRef.close()},n.prototype.changeNote=function(){var n=this;if(!this.button.isLoading()){var t=this.form.value.note?this.form.value.note.trim():"";this.originalNote!==t?(this.msgBarService.hide(),this.button.setLoading(),this.OperationSubscription=this.storageService.store(ec.NOTES,this.data.txid,t).subscribe(function(){n.dialogRef.close(t)},function(t){n.msgBarService.showError(t),n.button.resetState().setEnabled()})):this.closePopup()}},n.MAX_NOTE_CHARS=64,n}(),um=function(){function n(n,t,e,r,i,o,s,a,u,c,d){var h=this;this.formBuilder=n,this.blockchainService=t,this.walletService=e,this.dialog=r,this.msgBarService=i,this.navbarService=o,this.hwWalletService=s,this.translate=a,this.changeDetector=u,this.appService=c,this.onFormSubmitted=new l.o,this.maxNoteChars=am.MAX_NOTE_CHARS,this.transactions=[],this.busy=!1,this.doubleButtonActive=Fp,this.selectedCurrency=Fp.LeftButton,this.valueGreaterThanBalance=!1,this.subscriptionsGroup=[],this.subscriptionsGroup.push(d.price.subscribe(function(n){h.price=n,h.updateValue()}))}return n.prototype.ngOnInit=function(){var n=this;this.navbarService.showSwitch("send.simple","send.advanced"),this.initForm(),this.subscriptionsGroup.push(this.walletService.all().first().subscribe(function(t){n.wallets=t,1===t.length&&n.form.get("wallet").setValue(t[0])}))},n.prototype.ngOnDestroy=function(){this.processingSubscription&&!this.processingSubscription.closed&&this.processingSubscription.unsubscribe(),this.subscriptionsGroup.forEach(function(n){return n.unsubscribe()}),this.closeSyncCheckSubscription(),this.navbarService.hideSwitch(),this.msgBarService.hide()},n.prototype.preview=function(){this.previewTx=!0,this.checkBeforeSending(),this.changeDetector.detectChanges()},n.prototype.send=function(){this.previewTx=!1,this.checkBeforeSending()},n.prototype.changeActiveCurrency=function(n){n!==this.selectedCurrency&&(this.selectedCurrency=n,this.askIfConvertAmount(),this.updateValue(),this.form.get("amount").updateValueAndValidity())},n.prototype.askIfConvertAmount=function(){var n=this;if(this.form.get("amount").value){var t=this.form.get("amount").value.trim(),e=new Ae.BigNumber(this.form.get("amount").value.trim());if(t&&!e.isNaN()){var l,r,i=this.translate.instant("common.usd"),o=this.appService.coinName;this.selectedCurrency===Fp.LeftButton?(l=i,r=o):(l=o,r=i);var s={text:this.translate.instant("send.convert-confirmation",{from:l,to:r}),headerText:"confirmation.header-text",confirmButtonText:"confirmation.confirm-button",cancelButtonText:"confirmation.cancel-button"};Wc(this.dialog,s).afterClosed().subscribe(function(t){t&&n.convertAmount()})}}},n.prototype.convertAmount=function(){if(this.msgBarService.hide(),this.form.get("amount").value){var t,e=this.form.get("amount").value.trim(),l=new Ae.BigNumber(e);if(!e||l.isNaN())return void this.msgBarService.showWarning(this.translate.instant("send.invaid-amount-warning"));this.selectedCurrency===Fp.LeftButton?((t=l.dividedBy(this.price).decimalPlaces(this.blockchainService.currentMaxDecimals)).multipliedBy(this.price).decimalPlaces(n.MaxUsdDecimals,Ae.BigNumber.ROUND_FLOOR).isEqualTo(l)||this.msgBarService.showWarning(this.translate.instant("send.precision-error-warning")),this.form.get("amount").setValue(t.toString())):((t=l.multipliedBy(this.price).decimalPlaces(n.MaxUsdDecimals,Ae.BigNumber.ROUND_FLOOR)).dividedBy(this.price).decimalPlaces(this.blockchainService.currentMaxDecimals).isEqualTo(l)||this.msgBarService.showWarning(this.translate.instant("send.precision-error-warning")),this.form.get("amount").setValue(t.toString()))}},n.prototype.assignAll=function(){this.msgBarService.hide();var t=this.form.get("wallet").value&&this.form.get("wallet").value.coins?this.form.get("wallet").value.coins:new Ae.BigNumber(-1);t.isEqualTo(-1)?this.msgBarService.showError(this.translate.instant("send.no-wallet-selected")):(this.selectedCurrency===Fp.RightButton&&(t=t.multipliedBy(this.price).decimalPlaces(n.MaxUsdDecimals,Ae.BigNumber.ROUND_FLOOR)),this.form.get("amount").setValue(t.toString()))},n.prototype.updateValue=function(){if(this.price)if(this.form&&null===this.validateAmount(this.form.get("amount"))){var n=this.form.get("wallet").value&&this.form.get("wallet").value.coins?this.form.get("wallet").value.coins:-1;this.valueGreaterThanBalance=!1,this.selectedCurrency===Fp.LeftButton?(this.value=new Ae.BigNumber(this.form.get("amount").value).multipliedBy(this.price).decimalPlaces(2).toNumber(),n>0&&parseFloat(this.form.get("amount").value)>n&&(this.valueGreaterThanBalance=!0)):(this.value=new Ae.BigNumber(this.form.get("amount").value).dividedBy(this.price).decimalPlaces(this.blockchainService.currentMaxDecimals).toNumber(),n>0&&this.value>n&&(this.valueGreaterThanBalance=!0))}else this.value=-1;else this.value=null},n.prototype.checkBeforeSending=function(){var n=this;!this.form.valid||this.previewButton.isLoading()||this.sendButton.isLoading()||(this.closeSyncCheckSubscription(),this.syncCheckSubscription=this.blockchainService.synchronized.first().subscribe(function(t){t?n.prepareTransaction():n.showSynchronizingWarning()}))},n.prototype.showSynchronizingWarning=function(){var n=this;Wc(this.dialog,{text:"send.synchronizing-warning",headerText:"confirmation.header-text",confirmButtonText:"confirmation.confirm-button",cancelButtonText:"confirmation.cancel-button"}).afterClosed().subscribe(function(t){t&&n.prepareTransaction()})},n.prototype.prepareTransaction=function(){var n=this;if(this.msgBarService.hide(),this.previewButton.resetState(),this.sendButton.resetState(),!this.form.value.wallet.encrypted||this.form.value.wallet.isHardware||this.previewTx)!this.form.value.wallet.isHardware||this.previewTx?this.createTransaction():(this.showBusy(),this.processingSubscription=this.hwWalletService.checkIfCorrectHwConnected(this.form.value.wallet.addresses[0].address).subscribe(function(){return n.createTransaction()},function(t){return n.showError(Tc(n.translate,t))}));else{var t=new oa;t.data={wallet:this.form.value.wallet},this.dialog.open(Zp,t).componentInstance.passwordSubmit.subscribe(function(t){n.createTransaction(t)})}},n.prototype.showBusy=function(){this.previewTx?(this.previewButton.setLoading(),this.sendButton.setDisabled()):(this.sendButton.setLoading(),this.previewButton.setDisabled()),this.busy=!0,this.navbarService.disableSwitch()},n.prototype.createTransaction=function(n){var t=this;this.showBusy(),this.processingSubscription=this.walletService.createTransaction(this.form.value.wallet,this.form.value.wallet.addresses.map(function(n){return n.address}),null,[{address:this.form.value.address.trim(),coins:(this.selectedCurrency===Fp.LeftButton?this.form.value.amount:this.value.toString()).trim()}],{type:"auto",mode:"share",share_factor:"0.5"},null,n?n.password:null,this.previewTx).subscribe(function(e){n&&n.close();var l=t.form.value.note.trim();t.previewTx?(t.onFormSubmitted.emit({form:{wallet:t.form.value.wallet,address:t.form.value.address.trim(),amount:t.form.value.amount,currency:t.selectedCurrency,note:l},amount:new Ae.BigNumber(t.form.value.amount),to:[t.form.value.address.trim()],transaction:e}),t.busy=!1,t.navbarService.enableSwitch()):t.processingSubscription=t.walletService.injectTransaction(e.encoded,l).subscribe(function(n){var e=!0;l&&!n&&(t.msgBarService.showWarning(t.translate.instant("send.error-saving-note")),e=!1),t.showSuccess(e)},function(n){return t.showError(n)})},function(e){n&&n.error(e),t.showError(e&&e.result?Tc(t.translate,e):e)})},n.prototype.showSuccess=function(n){var t=this;this.busy=!1,this.navbarService.enableSwitch(),this.resetForm(),n?(this.msgBarService.showDone("send.sent"),this.sendButton.resetState()):(this.sendButton.setSuccess(),setTimeout(function(){t.sendButton.resetState()},3e3))},n.prototype.showError=function(n){this.busy=!1,this.msgBarService.showError(n),this.navbarService.enableSwitch(),this.previewButton.resetState().setEnabled(),this.sendButton.resetState().setEnabled()},n.prototype.initForm=function(){var n=this;this.form=this.formBuilder.group({wallet:["",Xi.required],address:[""],amount:["",Xi.required],note:[""]}),this.form.get("address").setValidators([this.validateAddress.bind(this)]),this.subscriptionsGroup.push(this.form.get("wallet").valueChanges.subscribe(function(t){n.form.get("amount").setValidators([Xi.required,n.validateAmountWithValue.bind(n)]),n.form.get("amount").updateValueAndValidity()})),this.subscriptionsGroup.push(this.form.get("amount").valueChanges.subscribe(function(t){n.updateValue()})),this.formData&&Object.keys(this.form.controls).forEach(function(t){n.form.get(t)&&n.form.get(t).setValue(n.formData.form[t]),n.selectedCurrency=n.formData.form.currency})},n.prototype.validateAddress=function(n){if(!n.value||0===n.value.trim().length)return{Required:!0}},n.prototype.validateAmount=function(t){var e=t.value;e=e?e.trim():e;var l=new Ae.BigNumber(e);if(!e||l.isNaN()||l.isLessThanOrEqualTo(0))return{Invalid:!0};var r=e.split(".");if(this.selectedCurrency===Fp.LeftButton){if(2===r.length&&r[1].length>this.blockchainService.currentMaxDecimals)return{Invalid:!0}}else if(2===r.length&&r[1].length>n.MaxUsdDecimals)return{Invalid:!0};return null},n.prototype.validateAmountWithValue=function(n){var t=this.validateAmount(n);if(t)return t;var e=this.form.get("wallet").value&&this.form.get("wallet").value.coins?this.form.get("wallet").value.coins:0;if(this.selectedCurrency===Fp.LeftButton){if(parseFloat(n.value)>e)return{Invalid:!0}}else if(this.updateValue(),this.value>e)return{Invalid:!0};return null},n.prototype.resetForm=function(){this.form.get("wallet").setValue(""),this.form.get("address").setValue(""),this.form.get("amount").setValue(""),this.form.get("note").setValue(""),this.selectedCurrency=Fp.LeftButton},n.prototype.closeSyncCheckSubscription=function(){this.syncCheckSubscription&&this.syncCheckSubscription.unsubscribe()},n.MaxUsdDecimals=6,n}(),cm=l._7({encapsulation:0,styles:[[".-buttons[_ngcontent-%COMP%]{text-align:center}.amount-label[_ngcontent-%COMP%]{display:inline-block}label[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{display:inline;font-size:14px;color:rgba(121,135,152,.5);vertical-align:text-bottom;padding-left:5px}"]],data:{}});function dm(n){return l._33(0,[(n()(),l._9(0,0,null,null,3,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n ","\n (",")\n "])),l._25(0,If,[tn,qc,gf]),l._25(0,If,[tn,qc,gf])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform(t.parent.context.$implicit.coins?t.parent.context.$implicit.coins.toString():0)),l._32(t,1,1,l._22(t,3).transform(t.parent.context.$implicit.hours.toString(),!1)))})}function hm(n){return l._33(0,[(n()(),l._9(0,0,null,null,6,"option",[],[[8,"disabled",0]],null,null,null,null)),l._8(1,147456,null,0,mo,[l.l,l.G,[2,_o]],{ngValue:[0,"ngValue"]},null),l._8(2,147456,null,0,bo,[l.l,l.G,[8,null]],{ngValue:[0,"ngValue"]},null),(n()(),l._31(3,null,["\n "," -\n "])),(n()(),l._4(16777216,null,null,1,null,dm)),l._8(5,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,1,0,t.context.$implicit),n(t,2,0,t.context.$implicit),n(t,5,0,t.context.$implicit.coins&&t.context.$implicit.hours)},function(n,t){n(t,0,0,!t.context.$implicit.coins||t.context.$implicit.coins.isLessThanOrEqualTo(0)),n(t,3,0,t.context.$implicit.label)})}function pm(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,hm)),l._8(3,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,3,0,t.component.wallets)},null)}function fm(n){return l._33(0,[(n()(),l._9(0,0,null,null,8,"div",[["class","coin-selector-container"]],null,null,null,null,null)),l._8(1,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(2,{"element-disabled":0}),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,3,"app-double-button",[["className","light small"]],null,[[null,"onStateChange"]],function(n,t,e){var l=!0;return"onStateChange"===t&&(l=!1!==n.component.changeActiveCurrency(e)&&l),l},M_,x_)),l._8(5,49152,null,0,Bp,[],{rightButtonText:[0,"rightButtonText"],leftButtonText:[1,"leftButtonText"],activeButton:[2,"activeButton"],className:[3,"className"]},{onStateChange:"onStateChange"}),l._25(131072,De.i,[De.j,l.h]),l._25(0,l_,[gf]),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,1,0,"coin-selector-container",n(t,2,0,e.busy)),n(t,5,0,l._32(t,5,0,l._22(t,6).transform("common.usd")),l._32(t,5,1,l._22(t,7).transform("coin")),e.selectedCurrency,"light small")},null)}function _m(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["",""])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("send.invalid-amount")))})}function mm(n){return l._33(0,[(n()(),l._9(0,0,null,null,3,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n ~ "," ","\n "])),l._27(2,2),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){var e=t.component;n(t,1,0,l._32(t,1,0,n(t,2,0,l._22(t.parent,0),e.value,"1.0-2")),l._32(t,1,1,l._22(t,3).transform("common.usd")))})}function gm(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n ~ ","\n "])),l._25(0,If,[tn,qc,gf])],null,function(n,t){var e=t.component;n(t,1,0,l._32(t,1,0,l._22(t,2).transform(e.value)))})}function ym(n){return l._33(0,[l._25(0,tn,[l.w]),l._29(402653184,1,{previewButton:0}),l._29(402653184,2,{sendButton:0}),(n()(),l._9(3,0,null,null,127,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,4).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,4).onReset()&&r),r},null,null)),l._8(4,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(6,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,27,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,2,"label",[["for","wallet"]],null,null,null,null,null)),(n()(),l._31(11,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,20,"div",[["class","-select"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,17,"select",[["formControlName","wallet"],["id","wallet"]],[[1,"disabled",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"change"],[null,"blur"]],function(n,t,e){var r=!0;return"change"===t&&(r=!1!==l._22(n,19).onChange(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,19).onTouched()&&r),r},null,null)),l._8(17,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(18,{"element-disabled":0}),l._8(19,16384,null,0,_o,[l.G,l.l],null,null),l._28(1024,null,to,function(n){return[n]},[_o]),l._8(21,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(23,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(25,0,null,null,4,"option",[["disabled",""],["hidden",""]],null,null,null,null,null)),l._8(26,147456,null,0,mo,[l.l,l.G,[2,_o]],{ngValue:[0,"ngValue"]},null),l._8(27,147456,null,0,bo,[l.l,l.G,[8,null]],{ngValue:[0,"ngValue"]},null),(n()(),l._31(28,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,pm)),l._8(32,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(37,0,null,null,12,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(39,0,null,null,2,"label",[["for","address"]],null,null,null,null,null)),(n()(),l._31(40,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(43,0,null,null,5,"input",[["formControlName","address"],["id","address"]],[[1,"disabled",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,44)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,44).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,44)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,44)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(44,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(46,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(48,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(51,0,null,null,43,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(53,0,null,null,2,"label",[["class","amount-label"],["for","amount"]],null,null,null,null,null)),(n()(),l._31(54,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,fm)),l._8(58,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(60,0,null,null,13,"div",[["class","-input-addon"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(62,0,null,null,5,"input",[["formControlName","amount"],["id","amount"]],[[1,"disabled",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,63)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,63).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,63)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,63)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(63,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(65,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(67,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(69,0,null,null,3,"span",[],null,null,null,null,null)),(n()(),l._31(70,null,["",""])),l._25(0,l_,[gf]),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(75,0,null,null,18,"div",[["class","coins-value-label"]],null,null,null,null,null)),l._8(76,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(77,{red:0}),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,_m)),l._8(80,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,mm)),l._8(83,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,gm)),l._8(86,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(88,0,null,null,4,"div",[["class","link"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.assignAll()&&l),l},null,null)),l._8(89,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(90,{"centerd-link":0}),(n()(),l._31(91,null,["(",")"])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(96,0,null,null,20,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(98,0,null,null,8,"label",[["for","note"]],null,null,null,null,null)),(n()(),l._31(99,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(101,16777216,null,null,4,"mat-icon",[["class","mat-icon"],["role","img"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,103).show()&&r),"keydown"===t&&(r=!1!==l._22(n,103)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,103).hide(1500)&&r),r},Hf,Rf)),l._8(102,638976,null,0,ou,[l.l,eu,[8,null]],null,null),l._8(103,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["help"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(108,0,null,null,7,"input",[["formControlName","note"],["id","note"]],[[1,"disabled",0],[1,"maxlength",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown.enter"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0,i=n.component;return"input"===t&&(r=!1!==l._22(n,109)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,109).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,109)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,109)._compositionEnd(e.target.value)&&r),"keydown.enter"===t&&(r=!1!==i.preview()&&r),r},null,null)),l._8(109,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._8(110,540672,null,0,$o,[],{maxlength:[0,"maxlength"]},null),l._28(1024,null,Qi,function(n){return[n]},[$o]),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(113,671744,null,0,Xo,[[3,qi],[2,Qi],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(115,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(118,0,null,null,11,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(120,0,null,null,3,"app-button",[],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.preview()&&l),l},w_,g_)),l._8(121,49152,[[1,4],["previewButton",4]],0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(122,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(125,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.send()&&l),l},w_,g_)),l._8(126,49152,[[2,4],["sendButton",4]],0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(127,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,4,0,e.form),n(t,17,0,n(t,18,0,e.busy)),n(t,21,0,"wallet"),n(t,26,0,""),n(t,27,0,""),n(t,32,0,e.wallets),n(t,46,0,"address"),n(t,58,0,e.price),n(t,65,0,"amount"),n(t,76,0,"coins-value-label",n(t,77,0,e.value>=0&&e.valueGreaterThanBalance)),n(t,80,0,e.price&&e.value<0),n(t,83,0,e.price&&e.value>=0&&e.selectedCurrency===e.doubleButtonActive.LeftButton),n(t,86,0,e.price&&e.value>=0&&e.selectedCurrency===e.doubleButtonActive.RightButton),n(t,89,0,"link",n(t,90,0,!e.price)),n(t,102,0),n(t,103,0,l._32(t,103,0,l._22(t,104).transform("send.personal-note-help"))),n(t,110,0,e.maxNoteChars),n(t,113,0,"note"),n(t,121,0,!e.form.valid),n(t,126,0,!e.form.valid)},function(n,t){var e=t.component;n(t,3,0,l._22(t,6).ngClassUntouched,l._22(t,6).ngClassTouched,l._22(t,6).ngClassPristine,l._22(t,6).ngClassDirty,l._22(t,6).ngClassValid,l._22(t,6).ngClassInvalid,l._22(t,6).ngClassPending),n(t,11,0,l._32(t,11,0,l._22(t,12).transform("send.from-label"))),n(t,16,0,e.busy?"true":null,l._22(t,23).ngClassUntouched,l._22(t,23).ngClassTouched,l._22(t,23).ngClassPristine,l._22(t,23).ngClassDirty,l._22(t,23).ngClassValid,l._22(t,23).ngClassInvalid,l._22(t,23).ngClassPending),n(t,28,0,l._32(t,28,0,l._22(t,29).transform("send.select-wallet"))),n(t,40,0,l._32(t,40,0,l._22(t,41).transform("send.to-label"))),n(t,43,0,e.busy?"true":null,l._22(t,48).ngClassUntouched,l._22(t,48).ngClassTouched,l._22(t,48).ngClassPristine,l._22(t,48).ngClassDirty,l._22(t,48).ngClassValid,l._22(t,48).ngClassInvalid,l._22(t,48).ngClassPending),n(t,54,0,l._32(t,54,0,l._22(t,55).transform("send.amount-label"))),n(t,62,0,e.busy?"true":null,l._22(t,67).ngClassUntouched,l._22(t,67).ngClassTouched,l._22(t,67).ngClassPristine,l._22(t,67).ngClassDirty,l._22(t,67).ngClassValid,l._22(t,67).ngClassInvalid,l._22(t,67).ngClassPending),n(t,70,0,l._32(t,70,0,e.selectedCurrency===e.doubleButtonActive.LeftButton?l._22(t,71).transform("coin"):l._22(t,72).transform("common.usd"))),n(t,91,0,l._32(t,91,0,l._22(t,92).transform("send.send-all-available-coins"))),n(t,99,0,l._32(t,99,0,l._22(t,100).transform("send.personal-note-label"))),n(t,108,0,e.busy?"true":null,l._22(t,110).maxlength?l._22(t,110).maxlength:null,l._22(t,115).ngClassUntouched,l._22(t,115).ngClassTouched,l._22(t,115).ngClassPristine,l._22(t,115).ngClassDirty,l._22(t,115).ngClassValid,l._22(t,115).ngClassInvalid,l._22(t,115).ngClassPending),n(t,122,0,l._32(t,122,0,l._22(t,123).transform("send.preview-button"))),n(t,127,0,l._32(t,127,0,l._22(t,128).transform("send.send-button")))})}var bm=l._7({encapsulation:2,styles:[],data:{}});function vm(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"mat-pseudo-checkbox",[["class","mat-option-pseudo-checkbox mat-pseudo-checkbox"]],[[2,"mat-pseudo-checkbox-indeterminate",null],[2,"mat-pseudo-checkbox-checked",null],[2,"mat-pseudo-checkbox-disabled",null]],null,null,Cm,km)),l._8(1,49152,null,0,sr,[],{state:[0,"state"],disabled:[1,"disabled"]},null)],function(n,t){var e=t.component;n(t,1,0,e.selected?"checked":"",e.disabled)},function(n,t){n(t,0,0,"indeterminate"===l._22(t,1).state,"checked"===l._22(t,1).state,l._22(t,1).disabled)})}function wm(n){return l._33(2,[(n()(),l._4(16777216,null,null,1,null,vm)),l._8(1,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._9(2,0,null,null,1,"span",[["class","mat-option-text"]],null,null,null,null,null)),l._21(null,0),(n()(),l._9(4,0,null,null,1,"div",[["class","mat-option-ripple mat-ripple"],["mat-ripple",""]],[[2,"mat-ripple-unbounded",null]],null,null,null,null)),l._8(5,212992,null,0,ir,[l.l,l.B,Hl,[2,rr]],{disabled:[0,"disabled"],trigger:[1,"trigger"]},null)],function(n,t){var e=t.component;n(t,1,0,e.multiple),n(t,5,0,e.disabled||e.disableRipple,e._getHostElement())},function(n,t){n(t,4,0,l._22(t,5).unbounded)})}var xm=l._7({encapsulation:2,styles:[],data:{}});function Mm(n){return l._33(2,[(n()(),l._9(0,0,null,null,1,"label",[["class","mat-optgroup-label"]],[[8,"id",0]],null,null,null,null)),(n()(),l._31(1,null,["",""])),l._21(null,0)],null,function(n,t){var e=t.component;n(t,0,0,e._labelId),n(t,1,0,e.label)})}var km=l._7({encapsulation:2,styles:[".mat-pseudo-checkbox{width:20px;height:20px;border:2px solid;border-radius:2px;cursor:pointer;display:inline-block;vertical-align:middle;box-sizing:border-box;position:relative;flex-shrink:0;transition:border-color 90ms cubic-bezier(0,0,.2,.1),background-color 90ms cubic-bezier(0,0,.2,.1)}.mat-pseudo-checkbox::after{position:absolute;opacity:0;content:'';border-bottom:2px solid currentColor;transition:opacity 90ms cubic-bezier(0,0,.2,.1)}.mat-pseudo-checkbox.mat-pseudo-checkbox-checked,.mat-pseudo-checkbox.mat-pseudo-checkbox-indeterminate{border:none}.mat-pseudo-checkbox-disabled{cursor:default}.mat-pseudo-checkbox-indeterminate::after{top:9px;left:2px;width:16px;opacity:1}.mat-pseudo-checkbox-checked::after{top:5px;left:3px;width:12px;height:5px;border-left:2px solid currentColor;transform:rotate(-45deg);opacity:1}"],data:{}});function Cm(n){return l._33(2,[],null,null)}var Sm=l._7({encapsulation:2,styles:[".mat-select{display:inline-block;width:100%;outline:0}.mat-select-trigger{display:inline-table;cursor:pointer;position:relative;box-sizing:border-box}.mat-select-disabled .mat-select-trigger{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.mat-select-value{display:table-cell;max-width:0;width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mat-select-value-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mat-select-arrow-wrapper{display:table-cell;vertical-align:middle}.mat-select-arrow{width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid;margin:0 4px}.mat-select-panel{min-width:112px;max-width:280px;overflow:auto;-webkit-overflow-scrolling:touch;padding-top:0;padding-bottom:0;max-height:256px;min-width:100%}.mat-select-panel:not([class*=mat-elevation-z]){box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}@media screen and (-ms-high-contrast:active){.mat-select-panel{outline:solid 1px}}.mat-select-panel .mat-optgroup-label,.mat-select-panel .mat-option{font-size:inherit;line-height:3em;height:3em}.mat-form-field-type-mat-select:not(.mat-form-field-disabled) .mat-form-field-flex{cursor:pointer}.mat-form-field-type-mat-select .mat-form-field-label{width:calc(100% - 18px)}.mat-select-placeholder{transition:color .4s .133s cubic-bezier(.25,.8,.25,1)}.mat-form-field-hide-placeholder .mat-select-placeholder{color:transparent;transition:none}"],data:{animation:[{type:7,name:"transformPanel",definitions:[{type:0,name:"showing",styles:{type:6,styles:{opacity:1,minWidth:"calc(100% + 32px)",transform:"scaleY(1)"},offset:null},options:void 0},{type:0,name:"showing-multiple",styles:{type:6,styles:{opacity:1,minWidth:"calc(100% + 64px)",transform:"scaleY(1)"},offset:null},options:void 0},{type:1,expr:"void => *",animation:[{type:6,styles:{opacity:0,minWidth:"100%",transform:"scaleY(0)"},offset:null},{type:4,styles:null,timings:"150ms cubic-bezier(0.25, 0.8, 0.25, 1)"}],options:null},{type:1,expr:"* => void",animation:[{type:4,styles:{type:6,styles:{opacity:0},offset:null},timings:"250ms 100ms linear"}],options:null}],options:{}},{type:7,name:"fadeInContent",definitions:[{type:0,name:"showing",styles:{type:6,styles:{opacity:1},offset:null},options:void 0},{type:1,expr:"void => showing",animation:[{type:6,styles:{opacity:0},offset:null},{type:4,styles:null,timings:"150ms 100ms cubic-bezier(0.55, 0, 0.55, 0.2)"}],options:null}],options:{}}]}});function Om(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"span",[["class","mat-select-placeholder"]],null,null,null,null,null)),(n()(),l._31(1,null,["",""]))],null,function(n,t){n(t,1,0,t.component.placeholder||"\xa0")})}function Tm(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["",""]))],null,function(n,t){n(t,1,0,t.component.triggerValue)})}function Lm(n){return l._33(0,[l._21(null,0),(n()(),l._4(0,null,null,0))],null,null)}function Pm(n){return l._33(0,[(n()(),l._9(0,0,null,null,5,"span",[["class","mat-select-value-text"]],null,null,null,null,null)),l._8(1,16384,null,0,Y,[],{ngSwitch:[0,"ngSwitch"]},null),(n()(),l._4(16777216,null,null,1,null,Tm)),l._8(3,16384,null,0,I,[l.R,l.O,Y],null,null),(n()(),l._4(16777216,null,null,1,null,Lm)),l._8(5,278528,null,0,j,[l.R,l.O,Y],{ngSwitchCase:[0,"ngSwitchCase"]},null)],function(n,t){n(t,1,0,!!t.component.customTrigger),n(t,5,0,!0)},null)}function Dm(n){return l._33(0,[(n()(),l._9(0,0,[[2,0],["panel",1]],null,3,"div",[],[[24,"@transformPanel",0],[4,"transformOrigin",null],[2,"mat-select-panel-done-animating",null],[4,"font-size","px"]],[[null,"@transformPanel.done"]],function(n,t,e){var l=!0;return"@transformPanel.done"===t&&(l=!1!==n.component._onPanelDone()&&l),l},null,null)),l._8(1,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),(n()(),l._9(2,0,null,null,1,"div",[["class","mat-select-content"]],[[24,"@fadeInContent",0]],[[null,"@fadeInContent.done"]],function(n,t,e){var l=!0;return"@fadeInContent.done"===t&&(l=!1!==n.component._onFadeInDone()&&l),l},null,null)),l._21(null,1)],function(n,t){var e=t.component;n(t,1,0,l._12(1,"mat-select-panel ",e._getPanelTheme(),""),e.panelClass)},function(n,t){var e=t.component;n(t,0,0,e.multiple?"showing-multiple":"showing",e._transformOrigin,e._panelDoneAnimating,e._triggerFontSize),n(t,2,0,"showing")})}function Am(n){return l._33(2,[l._29(402653184,1,{trigger:0}),l._29(671088640,2,{panel:0}),l._29(402653184,3,{overlayDir:0}),(n()(),l._9(3,0,[[1,0],["trigger",1]],null,9,"div",[["aria-hidden","true"],["cdk-overlay-origin",""],["class","mat-select-trigger"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.toggle()&&l),l},null,null)),l._8(4,16384,[["origin",4]],0,Yi,[l.l],null,null),(n()(),l._9(5,0,null,null,5,"div",[["class","mat-select-value"]],null,null,null,null,null)),l._8(6,16384,null,0,Y,[],{ngSwitch:[0,"ngSwitch"]},null),(n()(),l._4(16777216,null,null,1,null,Om)),l._8(8,278528,null,0,j,[l.R,l.O,Y],{ngSwitchCase:[0,"ngSwitchCase"]},null),(n()(),l._4(16777216,null,null,1,null,Pm)),l._8(10,278528,null,0,j,[l.R,l.O,Y],{ngSwitchCase:[0,"ngSwitchCase"]},null),(n()(),l._9(11,0,null,null,1,"div",[["class","mat-select-arrow-wrapper"]],null,null,null,null,null)),(n()(),l._9(12,0,null,null,0,"div",[["class","mat-select-arrow"]],null,null,null,null,null)),(n()(),l._4(16777216,null,null,1,function(n,t,e){var l=!0,r=n.component;return"backdropClick"===t&&(l=!1!==r.close()&&l),"attach"===t&&(l=!1!==r._onAttached()&&l),"detach"===t&&(l=!1!==r.close()&&l),l},Dm)),l._8(14,671744,[[3,4]],0,ji,[Pi,l.O,l.R,Ai,[2,Dl]],{_deprecatedOrigin:[0,"_deprecatedOrigin"],_deprecatedPositions:[1,"_deprecatedPositions"],_deprecatedOffsetY:[2,"_deprecatedOffsetY"],_deprecatedMinWidth:[3,"_deprecatedMinWidth"],_deprecatedBackdropClass:[4,"_deprecatedBackdropClass"],_deprecatedScrollStrategy:[5,"_deprecatedScrollStrategy"],_deprecatedOpen:[6,"_deprecatedOpen"],_deprecatedHasBackdrop:[7,"_deprecatedHasBackdrop"]},{backdropClick:"backdropClick",attach:"attach",detach:"detach"})],function(n,t){var e=t.component;n(t,6,0,e.empty),n(t,8,0,!0),n(t,10,0,!1),n(t,14,0,l._22(t,4),e._positions,e._offsetY,null==e._triggerRect?null:e._triggerRect.width,"cdk-overlay-transparent-backdrop",e._scrollStrategy,e.panelOpen,"")},null)}var Em=l._7({encapsulation:2,styles:["@keyframes mat-checkbox-fade-in-background{0%{opacity:0}50%{opacity:1}}@keyframes mat-checkbox-fade-out-background{0%,50%{opacity:1}100%{opacity:0}}@keyframes mat-checkbox-unchecked-checked-checkmark-path{0%,50%{stroke-dashoffset:22.91026}50%{animation-timing-function:cubic-bezier(0,0,.2,.1)}100%{stroke-dashoffset:0}}@keyframes mat-checkbox-unchecked-indeterminate-mixedmark{0%,68.2%{transform:scaleX(0)}68.2%{animation-timing-function:cubic-bezier(0,0,0,1)}100%{transform:scaleX(1)}}@keyframes mat-checkbox-checked-unchecked-checkmark-path{from{animation-timing-function:cubic-bezier(.4,0,1,1);stroke-dashoffset:0}to{stroke-dashoffset:-22.91026}}@keyframes mat-checkbox-checked-indeterminate-checkmark{from{animation-timing-function:cubic-bezier(0,0,.2,.1);opacity:1;transform:rotate(0)}to{opacity:0;transform:rotate(45deg)}}@keyframes mat-checkbox-indeterminate-checked-checkmark{from{animation-timing-function:cubic-bezier(.14,0,0,1);opacity:0;transform:rotate(45deg)}to{opacity:1;transform:rotate(360deg)}}@keyframes mat-checkbox-checked-indeterminate-mixedmark{from{animation-timing-function:cubic-bezier(0,0,.2,.1);opacity:0;transform:rotate(-45deg)}to{opacity:1;transform:rotate(0)}}@keyframes mat-checkbox-indeterminate-checked-mixedmark{from{animation-timing-function:cubic-bezier(.14,0,0,1);opacity:1;transform:rotate(0)}to{opacity:0;transform:rotate(315deg)}}@keyframes mat-checkbox-indeterminate-unchecked-mixedmark{0%{animation-timing-function:linear;opacity:1;transform:scaleX(1)}100%,32.8%{opacity:0;transform:scaleX(0)}}.mat-checkbox-checkmark,.mat-checkbox-mixedmark{width:calc(100% - 4px)}.mat-checkbox-background,.mat-checkbox-frame{top:0;left:0;right:0;bottom:0;position:absolute;border-radius:2px;box-sizing:border-box;pointer-events:none}.mat-checkbox{transition:background .4s cubic-bezier(.25,.8,.25,1),box-shadow 280ms cubic-bezier(.4,0,.2,1);cursor:pointer}.mat-checkbox-layout{cursor:inherit;align-items:baseline;vertical-align:middle;display:inline-flex;white-space:nowrap}.mat-checkbox-inner-container{display:inline-block;height:20px;line-height:0;margin:auto;margin-right:8px;order:0;position:relative;vertical-align:middle;white-space:nowrap;width:20px;flex-shrink:0}[dir=rtl] .mat-checkbox-inner-container{margin-left:8px;margin-right:auto}.mat-checkbox-inner-container-no-side-margin{margin-left:0;margin-right:0}.mat-checkbox-frame{background-color:transparent;transition:border-color 90ms cubic-bezier(0,0,.2,.1);border-width:2px;border-style:solid}.mat-checkbox-background{align-items:center;display:inline-flex;justify-content:center;transition:background-color 90ms cubic-bezier(0,0,.2,.1),opacity 90ms cubic-bezier(0,0,.2,.1)}.mat-checkbox-checkmark{top:0;left:0;right:0;bottom:0;position:absolute;width:100%}.mat-checkbox-checkmark-path{stroke-dashoffset:22.91026;stroke-dasharray:22.91026;stroke-width:2.66667px}.mat-checkbox-mixedmark{height:2px;opacity:0;transform:scaleX(0) rotate(0)}.mat-checkbox-label-before .mat-checkbox-inner-container{order:1;margin-left:8px;margin-right:auto}[dir=rtl] .mat-checkbox-label-before .mat-checkbox-inner-container{margin-left:auto;margin-right:8px}.mat-checkbox-checked .mat-checkbox-checkmark{opacity:1}.mat-checkbox-checked .mat-checkbox-checkmark-path{stroke-dashoffset:0}.mat-checkbox-checked .mat-checkbox-mixedmark{transform:scaleX(1) rotate(-45deg)}.mat-checkbox-indeterminate .mat-checkbox-checkmark{opacity:0;transform:rotate(45deg)}.mat-checkbox-indeterminate .mat-checkbox-checkmark-path{stroke-dashoffset:0}.mat-checkbox-indeterminate .mat-checkbox-mixedmark{opacity:1;transform:scaleX(1) rotate(0)}.mat-checkbox-unchecked .mat-checkbox-background{background-color:transparent}.mat-checkbox-disabled{cursor:default}.mat-checkbox-anim-unchecked-checked .mat-checkbox-background{animation:180ms linear 0s mat-checkbox-fade-in-background}.mat-checkbox-anim-unchecked-checked .mat-checkbox-checkmark-path{animation:180ms linear 0s mat-checkbox-unchecked-checked-checkmark-path}.mat-checkbox-anim-unchecked-indeterminate .mat-checkbox-background{animation:180ms linear 0s mat-checkbox-fade-in-background}.mat-checkbox-anim-unchecked-indeterminate .mat-checkbox-mixedmark{animation:90ms linear 0s mat-checkbox-unchecked-indeterminate-mixedmark}.mat-checkbox-anim-checked-unchecked .mat-checkbox-background{animation:180ms linear 0s mat-checkbox-fade-out-background}.mat-checkbox-anim-checked-unchecked .mat-checkbox-checkmark-path{animation:90ms linear 0s mat-checkbox-checked-unchecked-checkmark-path}.mat-checkbox-anim-checked-indeterminate .mat-checkbox-checkmark{animation:90ms linear 0s mat-checkbox-checked-indeterminate-checkmark}.mat-checkbox-anim-checked-indeterminate .mat-checkbox-mixedmark{animation:90ms linear 0s mat-checkbox-checked-indeterminate-mixedmark}.mat-checkbox-anim-indeterminate-checked .mat-checkbox-checkmark{animation:.5s linear 0s mat-checkbox-indeterminate-checked-checkmark}.mat-checkbox-anim-indeterminate-checked .mat-checkbox-mixedmark{animation:.5s linear 0s mat-checkbox-indeterminate-checked-mixedmark}.mat-checkbox-anim-indeterminate-unchecked .mat-checkbox-background{animation:180ms linear 0s mat-checkbox-fade-out-background}.mat-checkbox-anim-indeterminate-unchecked .mat-checkbox-mixedmark{animation:.3s linear 0s mat-checkbox-indeterminate-unchecked-mixedmark}.mat-checkbox-input{bottom:0;left:50%}.mat-checkbox-ripple{position:absolute;left:-15px;top:-15px;height:50px;width:50px;z-index:1;pointer-events:none}"],data:{}});function Ym(n){return l._33(2,[l._29(402653184,1,{_inputElement:0}),l._29(402653184,2,{_ripple:0}),(n()(),l._9(2,0,[["label",1]],null,14,"label",[["class","mat-checkbox-layout"]],[[1,"for",0]],null,null,null,null)),(n()(),l._9(3,0,null,null,8,"div",[["class","mat-checkbox-inner-container"]],[[2,"mat-checkbox-inner-container-no-side-margin",null]],null,null,null,null)),(n()(),l._9(4,0,[[1,0],["input",1]],null,0,"input",[["class","mat-checkbox-input cdk-visually-hidden"],["type","checkbox"]],[[8,"id",0],[8,"required",0],[8,"checked",0],[1,"value",0],[8,"disabled",0],[1,"name",0],[8,"tabIndex",0],[8,"indeterminate",0],[1,"aria-label",0],[1,"aria-labelledby",0],[1,"aria-checked",0]],[[null,"change"],[null,"click"]],function(n,t,e){var l=!0,r=n.component;return"change"===t&&(l=!1!==r._onInteractionEvent(e)&&l),"click"===t&&(l=!1!==r._onInputClick(e)&&l),l},null,null)),(n()(),l._9(5,0,null,null,1,"div",[["class","mat-checkbox-ripple mat-ripple"],["matRipple",""]],[[2,"mat-ripple-unbounded",null]],null,null,null,null)),l._8(6,212992,[[2,4]],0,ir,[l.l,l.B,Hl,[2,rr]],{centered:[0,"centered"],radius:[1,"radius"],speedFactor:[2,"speedFactor"],disabled:[3,"disabled"],trigger:[4,"trigger"]},null),(n()(),l._9(7,0,null,null,0,"div",[["class","mat-checkbox-frame"]],null,null,null,null,null)),(n()(),l._9(8,0,null,null,3,"div",[["class","mat-checkbox-background"]],null,null,null,null,null)),(n()(),l._9(9,0,null,null,1,":svg:svg",[[":xml:space","preserve"],["class","mat-checkbox-checkmark"],["focusable","false"],["version","1.1"],["viewBox","0 0 24 24"]],null,null,null,null,null)),(n()(),l._9(10,0,null,null,0,":svg:path",[["class","mat-checkbox-checkmark-path"],["d","M4.1,12.7 9,17.6 20.3,6.3"],["fill","none"],["stroke","white"]],null,null,null,null,null)),(n()(),l._9(11,0,null,null,0,"div",[["class","mat-checkbox-mixedmark"]],null,null,null,null,null)),(n()(),l._9(12,0,[["checkboxLabel",1]],null,4,"span",[["class","mat-checkbox-label"]],null,[[null,"cdkObserveContent"]],function(n,t,e){var l=!0;return"cdkObserveContent"===t&&(l=!1!==n.component._onLabelTextChange()&&l),l},null,null)),l._8(13,1196032,null,0,Ks,[Qs,l.l,l.B],null,{event:"cdkObserveContent"}),(n()(),l._9(14,0,null,null,1,"span",[["style","display:none"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\xa0"])),l._21(null,0)],function(n,t){var e=t.component;n(t,6,0,e._rippleConfig.centered,e._rippleConfig.radius,e._rippleConfig.speedFactor,e._isRippleDisabled(),l._22(t,2))},function(n,t){var e=t.component;n(t,2,0,e.inputId),n(t,3,0,!l._22(t,12).textContent||!l._22(t,12).textContent.trim()),n(t,4,1,[e.inputId,e.required,e.checked,e.value,e.disabled,e.name,e.tabIndex,e.indeterminate,e.ariaLabel,e.ariaLabelledby,e._getAriaChecked()]),n(t,5,0,l._22(t,6).unbounded)})}var jm=l._7({encapsulation:2,styles:[".mat-slider{display:inline-block;position:relative;box-sizing:border-box;padding:8px;outline:0;vertical-align:middle}.mat-slider-wrapper{position:absolute}.mat-slider-track-wrapper{position:absolute;top:0;left:0;overflow:hidden}.mat-slider-track-fill{position:absolute;transform-origin:0 0;transition:transform .4s cubic-bezier(.25,.8,.25,1),background-color .4s cubic-bezier(.25,.8,.25,1)}.mat-slider-track-background{position:absolute;transform-origin:100% 100%;transition:transform .4s cubic-bezier(.25,.8,.25,1),background-color .4s cubic-bezier(.25,.8,.25,1)}.mat-slider-ticks-container{position:absolute;left:0;top:0;overflow:hidden}.mat-slider-ticks{background-repeat:repeat;background-clip:content-box;box-sizing:border-box;opacity:0;transition:opacity .4s cubic-bezier(.25,.8,.25,1)}.mat-slider-thumb-container{position:absolute;z-index:1;transition:transform .4s cubic-bezier(.25,.8,.25,1)}.mat-slider-focus-ring{position:absolute;width:30px;height:30px;border-radius:50%;transform:scale(0);opacity:0;transition:transform .4s cubic-bezier(.25,.8,.25,1),background-color .4s cubic-bezier(.25,.8,.25,1),opacity .4s cubic-bezier(.25,.8,.25,1)}.cdk-keyboard-focused .mat-slider-focus-ring,.cdk-program-focused .mat-slider-focus-ring{transform:scale(1);opacity:1}.mat-slider:not(.mat-slider-disabled) .mat-slider-thumb,.mat-slider:not(.mat-slider-disabled) .mat-slider-thumb-label{cursor:-webkit-grab;cursor:grab}.mat-slider-sliding:not(.mat-slider-disabled) .mat-slider-thumb,.mat-slider-sliding:not(.mat-slider-disabled) .mat-slider-thumb-label,.mat-slider:not(.mat-slider-disabled) .mat-slider-thumb-label:active,.mat-slider:not(.mat-slider-disabled) .mat-slider-thumb:active{cursor:-webkit-grabbing;cursor:grabbing}.mat-slider-thumb{position:absolute;right:-10px;bottom:-10px;box-sizing:border-box;width:20px;height:20px;border:3px solid transparent;border-radius:50%;transform:scale(.7);transition:transform .4s cubic-bezier(.25,.8,.25,1),background-color .4s cubic-bezier(.25,.8,.25,1),border-color .4s cubic-bezier(.25,.8,.25,1)}.mat-slider-thumb-label{display:none;align-items:center;justify-content:center;position:absolute;width:28px;height:28px;border-radius:50%;transition:transform .4s cubic-bezier(.25,.8,.25,1),border-radius .4s cubic-bezier(.25,.8,.25,1),background-color .4s cubic-bezier(.25,.8,.25,1)}.mat-slider-thumb-label-text{z-index:1;opacity:0;transition:opacity .4s cubic-bezier(.25,.8,.25,1)}.mat-slider-sliding .mat-slider-thumb-container,.mat-slider-sliding .mat-slider-track-background,.mat-slider-sliding .mat-slider-track-fill{transition-duration:0s}.mat-slider-has-ticks .mat-slider-wrapper::after{content:'';position:absolute;border-width:0;border-style:solid;opacity:0;transition:opacity .4s cubic-bezier(.25,.8,.25,1)}.mat-slider-has-ticks.cdk-focused:not(.mat-slider-hide-last-tick) .mat-slider-wrapper::after,.mat-slider-has-ticks:hover:not(.mat-slider-hide-last-tick) .mat-slider-wrapper::after{opacity:1}.mat-slider-has-ticks.cdk-focused:not(.mat-slider-disabled) .mat-slider-ticks,.mat-slider-has-ticks:hover:not(.mat-slider-disabled) .mat-slider-ticks{opacity:1}.mat-slider-thumb-label-showing .mat-slider-focus-ring{transform:scale(0);opacity:0}.mat-slider-thumb-label-showing .mat-slider-thumb-label{display:flex}.mat-slider-axis-inverted .mat-slider-track-fill{transform-origin:100% 100%}.mat-slider-axis-inverted .mat-slider-track-background{transform-origin:0 0}.mat-slider:not(.mat-slider-disabled).cdk-focused.mat-slider-thumb-label-showing .mat-slider-thumb{transform:scale(0)}.mat-slider:not(.mat-slider-disabled).cdk-focused .mat-slider-thumb-label{border-radius:50% 50% 0}.mat-slider:not(.mat-slider-disabled).cdk-focused .mat-slider-thumb-label-text{opacity:1}.mat-slider:not(.mat-slider-disabled).cdk-mouse-focused .mat-slider-thumb,.mat-slider:not(.mat-slider-disabled).cdk-program-focused .mat-slider-thumb,.mat-slider:not(.mat-slider-disabled).cdk-touch-focused .mat-slider-thumb{border-width:2px;transform:scale(1)}.mat-slider-disabled .mat-slider-focus-ring{transform:scale(0);opacity:0}.mat-slider-disabled .mat-slider-thumb{border-width:4px;transform:scale(.5)}.mat-slider-disabled .mat-slider-thumb-label{display:none}.mat-slider-horizontal{height:48px;min-width:128px}.mat-slider-horizontal .mat-slider-wrapper{height:2px;top:23px;left:8px;right:8px}.mat-slider-horizontal .mat-slider-wrapper::after{height:2px;border-left-width:2px;right:0;top:0}.mat-slider-horizontal .mat-slider-track-wrapper{height:2px;width:100%}.mat-slider-horizontal .mat-slider-track-fill{height:2px;width:100%;transform:scaleX(0)}.mat-slider-horizontal .mat-slider-track-background{height:2px;width:100%;transform:scaleX(1)}.mat-slider-horizontal .mat-slider-ticks-container{height:2px;width:100%}.mat-slider-horizontal .mat-slider-ticks{height:2px;width:100%}.mat-slider-horizontal .mat-slider-thumb-container{width:100%;height:0;top:50%}.mat-slider-horizontal .mat-slider-focus-ring{top:-15px;right:-15px}.mat-slider-horizontal .mat-slider-thumb-label{right:-14px;top:-40px;transform:translateY(26px) scale(.01) rotate(45deg)}.mat-slider-horizontal .mat-slider-thumb-label-text{transform:rotate(-45deg)}.mat-slider-horizontal.cdk-focused .mat-slider-thumb-label{transform:rotate(45deg)}.mat-slider-vertical{width:48px;min-height:128px}.mat-slider-vertical .mat-slider-wrapper{width:2px;top:8px;bottom:8px;left:23px}.mat-slider-vertical .mat-slider-wrapper::after{width:2px;border-top-width:2px;bottom:0;left:0}.mat-slider-vertical .mat-slider-track-wrapper{height:100%;width:2px}.mat-slider-vertical .mat-slider-track-fill{height:100%;width:2px;transform:scaleY(0)}.mat-slider-vertical .mat-slider-track-background{height:100%;width:2px;transform:scaleY(1)}.mat-slider-vertical .mat-slider-ticks-container{width:2px;height:100%}.mat-slider-vertical .mat-slider-focus-ring{bottom:-15px;left:-15px}.mat-slider-vertical .mat-slider-ticks{width:2px;height:100%}.mat-slider-vertical .mat-slider-thumb-container{height:100%;width:0;left:50%}.mat-slider-vertical .mat-slider-thumb{-webkit-backface-visibility:hidden;backface-visibility:hidden}.mat-slider-vertical .mat-slider-thumb-label{bottom:-14px;left:-40px;transform:translateX(26px) scale(.01) rotate(-45deg)}.mat-slider-vertical .mat-slider-thumb-label-text{transform:rotate(45deg)}.mat-slider-vertical.cdk-focused .mat-slider-thumb-label{transform:rotate(-45deg)}[dir=rtl] .mat-slider-wrapper::after{left:0;right:auto}[dir=rtl] .mat-slider-horizontal .mat-slider-track-fill{transform-origin:100% 100%}[dir=rtl] .mat-slider-horizontal .mat-slider-track-background{transform-origin:0 0}[dir=rtl] .mat-slider-horizontal.mat-slider-axis-inverted .mat-slider-track-fill{transform-origin:0 0}[dir=rtl] .mat-slider-horizontal.mat-slider-axis-inverted .mat-slider-track-background{transform-origin:100% 100%}"],data:{}});function Im(n){return l._33(2,[l._29(402653184,1,{_sliderWrapper:0}),(n()(),l._9(1,0,[[1,0],["sliderWrapper",1]],null,16,"div",[["class","mat-slider-wrapper"]],null,null,null,null,null)),(n()(),l._9(2,0,null,null,4,"div",[["class","mat-slider-track-wrapper"]],null,null,null,null,null)),(n()(),l._9(3,0,null,null,1,"div",[["class","mat-slider-track-background"]],null,null,null,null,null)),l._8(4,278528,null,0,R,[l.v,l.l,l.G],{ngStyle:[0,"ngStyle"]},null),(n()(),l._9(5,0,null,null,1,"div",[["class","mat-slider-track-fill"]],null,null,null,null,null)),l._8(6,278528,null,0,R,[l.v,l.l,l.G],{ngStyle:[0,"ngStyle"]},null),(n()(),l._9(7,0,null,null,3,"div",[["class","mat-slider-ticks-container"]],null,null,null,null,null)),l._8(8,278528,null,0,R,[l.v,l.l,l.G],{ngStyle:[0,"ngStyle"]},null),(n()(),l._9(9,0,null,null,1,"div",[["class","mat-slider-ticks"]],null,null,null,null,null)),l._8(10,278528,null,0,R,[l.v,l.l,l.G],{ngStyle:[0,"ngStyle"]},null),(n()(),l._9(11,0,null,null,6,"div",[["class","mat-slider-thumb-container"]],null,null,null,null,null)),l._8(12,278528,null,0,R,[l.v,l.l,l.G],{ngStyle:[0,"ngStyle"]},null),(n()(),l._9(13,0,null,null,0,"div",[["class","mat-slider-focus-ring"]],null,null,null,null,null)),(n()(),l._9(14,0,null,null,0,"div",[["class","mat-slider-thumb"]],null,null,null,null,null)),(n()(),l._9(15,0,null,null,2,"div",[["class","mat-slider-thumb-label"]],null,null,null,null,null)),(n()(),l._9(16,0,null,null,1,"span",[["class","mat-slider-thumb-label-text"]],null,null,null,null,null)),(n()(),l._31(17,null,["",""]))],function(n,t){var e=t.component;n(t,4,0,e._trackBackgroundStyles),n(t,6,0,e._trackFillStyles),n(t,8,0,e._ticksContainerStyles),n(t,10,0,e._ticksStyles),n(t,12,0,e._thumbContainerStyles)},function(n,t){n(t,17,0,t.component.displayValue)})}var Rm=function(){function n(n,t){var e=this;this.dialogRef=n,this.walletService=t,this.wallets=[],this.walletService.all().first().subscribe(function(n){return e.wallets=n})}return n.prototype.closePopup=function(){this.dialogRef.close()},n.prototype.select=function(n){this.dialogRef.close(n)},n}(),Hm=function(){function n(n,t,e,l){this.dialogRef=n,this.data=t,this.formBuilder=e,this.msgBarService=l}return n.prototype.ngOnInit=function(){this.form=this.formBuilder.group({data:[this.data]})},n.prototype.ngOnDestroy=function(){this.msgBarService.hide()},n.prototype.processData=function(){try{if(0===this.form.value.data.trim().length)return void this.msgBarService.showError("send.bulk-send.error-no-data");var n=this.form.value.data.split(/\r?\n/);if(!n||0===n.length)return void this.msgBarService.showError("send.bulk-send.error-no-data");var t=(n=n.filter(function(n){return n.trim().length>0}))[0].split(",").length;if(2!==t&&3!==t)return void this.msgBarService.showError("send.bulk-send.error-invalid-data");var e=[],l=!0;if(n.forEach(function(n,r){e[r]=n.split(","),e[r].length!==t&&(l=!1)}),!l)return void this.msgBarService.showError("send.bulk-send.error-inconsistent-data");var r=[];e.forEach(function(n,t){r[t]=[],n.forEach(function(n,e){r[t][e]=n.trim()})}),this.dialogRef.close(r)}catch(n){this.msgBarService.showError("send.bulk-send.error-invalid-data")}},n}(),Nm=function(){function n(n,t,e,r,i,o,s,a,u,c,d){this.blockchainService=n,this.walletService=t,this.appService=e,this.formBuilder=r,this.dialog=i,this.msgBarService=o,this.navbarService=s,this.hwWalletService=a,this.translate=u,this.priceService=c,this.changeDetector=d,this.onFormSubmitted=new l.o,this.maxNoteChars=am.MAX_NOTE_CHARS,this.addresses=[],this.allUnspentOutputs=[],this.unspentOutputs=[],this.loadingUnspentOutputs=!1,this.availableCoins=new Ae.BigNumber(0),this.availableHours=new Ae.BigNumber(0),this.minimumFee=new Ae.BigNumber(0),this.autoHours=!0,this.autoOptions=!1,this.autoShareValue="0.5",this.busy=!1,this.doubleButtonActive=Fp,this.selectedCurrency=Fp.LeftButton,this.totalCoins=new Ae.BigNumber(0),this.totalConvertedCoins=new Ae.BigNumber(0),this.totalHours=new Ae.BigNumber(0),this.subscriptionsGroup=[],this.destinationSubscriptions=[],this.destinationHoursSubscriptions=[]}return n.prototype.ngOnInit=function(){var n=this;this.navbarService.showSwitch("send.simple","send.advanced",Fp.RightButton),this.form=this.formBuilder.group({wallet:["",Xi.required],addresses:[null],outputs:[null],changeAddress:[""],destinations:this.formBuilder.array([this.createDestinationFormGroup()],this.validateDestinations.bind(this)),note:[""]}),this.subscriptionsGroup.push(this.form.get("wallet").valueChanges.subscribe(function(t){n.wallet=t,n.closeGetOutputsSubscriptions(),n.allUnspentOutputs=[],n.unspentOutputs=[],n.loadingUnspentOutputs=!0,n.getOutputsSubscriptions=n.walletService.getWalletUnspentOutputs(t).retryWhen(function(n){return n.delay(1e3).take(10).concat(o.a.throw(""))}).subscribe(function(t){n.loadingUnspentOutputs=!1,n.allUnspentOutputs=t,n.unspentOutputs=n.filterUnspentOutputs()},function(){return n.loadingUnspentOutputs=!1}),n.addresses=t.addresses.filter(function(n){return n.coins>0}),n.form.get("addresses").setValue(null),n.form.get("outputs").setValue(null),n.updateAvailableBalance(),n.form.get("destinations").updateValueAndValidity()})),this.subscriptionsGroup.push(this.form.get("addresses").valueChanges.subscribe(function(){n.form.get("outputs").setValue(null),n.unspentOutputs=n.filterUnspentOutputs(),n.updateAvailableBalance(),n.form.get("destinations").updateValueAndValidity()})),this.subscriptionsGroup.push(this.form.get("outputs").valueChanges.subscribe(function(){n.updateAvailableBalance(),n.form.get("destinations").updateValueAndValidity()})),this.subscriptionsGroup.push(this.priceService.price.subscribe(function(t){n.price=t,n.updateValues()})),this.formData&&this.fillForm(),this.subscriptionsGroup.push(this.walletService.all().first().subscribe(function(t){n.wallets=t,1===t.length&&n.form.get("wallet").setValue(t[0])}))},n.prototype.ngOnDestroy=function(){this.processingSubscription&&!this.processingSubscription.closed&&this.processingSubscription.unsubscribe(),this.closeGetOutputsSubscriptions(),this.closeSyncCheckSubscription(),this.subscriptionsGroup.forEach(function(n){return n.unsubscribe()}),this.navbarService.hideSwitch(),this.msgBarService.hide(),this.destinationSubscriptions.forEach(function(n){return n.unsubscribe()}),this.destinationHoursSubscriptions.forEach(function(n){return n.unsubscribe()})},n.prototype.preview=function(){this.previewTx=!0,this.checkBeforeSending(),this.changeDetector.detectChanges()},n.prototype.send=function(){this.previewTx=!1,this.checkBeforeSending()},n.prototype.changeActiveCurrency=function(n){n!==this.selectedCurrency&&(this.selectedCurrency=n,this.askIfConvertAmount(),this.updateValues(),this.form.get("destinations").updateValueAndValidity())},n.prototype.askIfConvertAmount=function(){var n=this,t=0;if(this.destControls.forEach(function(n,e){var l=n.get("coins").value;l=l?l.trim():l;var r=new Ae.BigNumber(l);l&&!r.isNaN()&&(t+=1)}),0!==t){var e,l,r=this.translate.instant("common.usd"),i=this.appService.coinName;this.selectedCurrency===Fp.LeftButton?(e=r,l=i):(e=i,l=r);var o={text:this.translate.instant(1===t?"send.convert-confirmation":"send.convert-confirmation-plural",{from:e,to:l}),headerText:"confirmation.header-text",confirmButtonText:"confirmation.confirm-button",cancelButtonText:"confirmation.cancel-button"};Wc(this.dialog,o).afterClosed().subscribe(function(t){t&&n.convertAmounts()})}},n.prototype.convertAmounts=function(){var n=this;this.msgBarService.hide();var t=0,e=0;this.destControls.forEach(function(l,r){var i=l.get("coins").value;i=i?i.trim():i;var o=new Ae.BigNumber(i);if(i){if(!i||o.isNaN())return void(t+=1);var s;n.selectedCurrency===Fp.LeftButton?((s=o.dividedBy(n.price).decimalPlaces(n.blockchainService.currentMaxDecimals)).multipliedBy(n.price).decimalPlaces(um.MaxUsdDecimals,Ae.BigNumber.ROUND_FLOOR).isEqualTo(o)||(e+=1),l.get("coins").setValue(s.toString())):((s=o.multipliedBy(n.price).decimalPlaces(um.MaxUsdDecimals,Ae.BigNumber.ROUND_FLOOR)).dividedBy(n.price).decimalPlaces(n.blockchainService.currentMaxDecimals).isEqualTo(o)||(e+=1),l.get("coins").setValue(s.toString()))}}),t>0&&e>0?this.msgBarService.showWarning(this.translate.instant("send.multiple-problems-warning")):1===t?this.msgBarService.showWarning(this.translate.instant("send.invaid-amount-warning")):t>1?this.msgBarService.showWarning(this.translate.instant("send.invaid-amounts-warning")):1===e?this.msgBarService.showWarning(this.translate.instant("send.precision-error-warning")):e>1&&this.msgBarService.showWarning(this.translate.instant("send.precision-errors-warning"))},n.prototype.assignAll=function(n){this.msgBarService.hide();var t=this.form.get("wallet").value&&this.form.get("wallet").value.coins?this.form.get("wallet").value.coins:new Ae.BigNumber(-1);t.isEqualTo(-1)?this.msgBarService.showError(this.translate.instant("send.no-wallet-selected")):(this.selectedCurrency===Fp.RightButton&&(t=t.multipliedBy(this.price).decimalPlaces(um.MaxUsdDecimals,Ae.BigNumber.ROUND_FLOOR)),this.destControls.forEach(function(e,l){if(l!==n){var r=Number.parseFloat(e.get("coins").value.trim());if(!r||isNaN(r))return;t=t.minus(r)}}),(t=t.decimalPlaces(this.selectedCurrency===Fp.LeftButton?this.blockchainService.currentMaxDecimals:um.MaxUsdDecimals,Ae.BigNumber.ROUND_FLOOR)).isLessThan(0)?this.msgBarService.showError(this.translate.instant("send.no-coins-left")):this.destControls[n].get("coins").setValue(t.toString()))},n.prototype.updateValues=function(){var n=this;this.price?(this.values=[],this.totalCoins=new Ae.BigNumber(0),this.totalConvertedCoins=new Ae.BigNumber(0),this.totalHours=new Ae.BigNumber(0),this.destControls.forEach(function(t,e){var l=t.get("coins").value,r=n.getAmount(l,!0);if(r)if(n.selectedCurrency===Fp.LeftButton){var i=r.multipliedBy(n.price).decimalPlaces(2);n.totalCoins=n.totalCoins.plus(r),n.totalConvertedCoins=n.totalConvertedCoins.plus(i),n.values[e]=i.toNumber()}else i=r.dividedBy(n.price).decimalPlaces(n.blockchainService.currentMaxDecimals),n.totalCoins=n.totalCoins.plus(i),n.totalConvertedCoins=n.totalConvertedCoins.plus(r),n.values[e]=i.toNumber();else n.values[e]=-1}),this.autoHours||this.destControls.forEach(function(t,e){var l=t.get("hours").value,r=n.getAmount(l,!1);r&&(n.totalHours=n.totalHours.plus(r))})):this.values=null},n.prototype.checkBeforeSending=function(){var n=this;!this.form.valid||this.previewButton.isLoading()||this.sendButton.isLoading()||(this.closeSyncCheckSubscription(),this.syncCheckSubscription=this.blockchainService.synchronized.first().subscribe(function(t){t?n.prepareTransaction():n.showSynchronizingWarning()}))},n.prototype.showSynchronizingWarning=function(){var n=this;Wc(this.dialog,{text:"send.synchronizing-warning",headerText:"confirmation.header-text",confirmButtonText:"confirmation.confirm-button",cancelButtonText:"confirmation.cancel-button"}).afterClosed().subscribe(function(t){t&&n.prepareTransaction()})},n.prototype.prepareTransaction=function(){var n=this;if(this.msgBarService.hide(),this.previewButton.resetState(),this.sendButton.resetState(),!this.form.value.wallet.encrypted||this.form.value.wallet.isHardware||this.previewTx)!this.form.value.wallet.isHardware||this.previewTx?this.createTransaction():(this.showBusy(),this.processingSubscription=this.hwWalletService.checkIfCorrectHwConnected(this.form.value.wallet.addresses[0].address).subscribe(function(){return n.createTransaction()},function(t){return n.showError(Tc(n.translate,t))}));else{var t=new oa;t.data={wallet:this.form.value.wallet},this.dialog.open(Zp,t).componentInstance.passwordSubmit.subscribe(function(t){n.createTransaction(t)})}},n.prototype.addDestination=function(){this.form.get("destinations").push(this.createDestinationFormGroup()),this.updateValues()},n.prototype.removeDestination=function(n){this.form.get("destinations").removeAt(n),this.destinationSubscriptions[n].unsubscribe(),this.destinationSubscriptions.splice(n,1),this.destinationHoursSubscriptions[n].unsubscribe(),this.destinationHoursSubscriptions.splice(n,1),this.updateValues()},n.prototype.setShareValue=function(n){this.autoShareValue=parseFloat(n.value).toFixed(2)},n.prototype.selectChangeAddress=function(n){var t=this,e=new oa;e.width="566px",e.autoFocus=!1,this.dialog.open(Rm,e).afterClosed().subscribe(function(n){n&&t.form.get("changeAddress").setValue(n)})},n.prototype.openMultipleDestinationsPopup=function(){var n=this,t="";this.destControls.map(function(e,l){(e.get("address").value.trim().length>0||e.get("coins").value.trim().length>0||!n.autoHours&&e.get("hours").value.trim().length>0)&&(t+=e.get("address").value.replace(",",""),t+=", "+e.get("coins").value.replace(",",""),n.autoHours||(t+=", "+e.get("hours").value.replace(",","")),t+="\r\n")}),t.length>0&&(t=t.substr(0,t.length-1));var e=new oa;e.width="566px",e.data=t,this.dialog.open(Hm,e).afterClosed().subscribe(function(t){if(t){for(;n.destControls.length>0;)n.form.get("destinations").removeAt(0);t.length>0?(n.autoHours=2===t[0].length,t.forEach(function(t,e){n.addDestination(),n.destControls[e].get("address").setValue(t[0]),n.destControls[e].get("coins").setValue(t[1]),n.autoHours||n.destControls[e].get("hours").setValue(t[2])})):n.addDestination()}}),this.updateValues()},n.prototype.toggleOptions=function(n){n.stopPropagation(),n.preventDefault(),this.autoOptions=!this.autoOptions},n.prototype.setAutoHours=function(n){this.autoHours=n.checked,this.form.get("destinations").updateValueAndValidity(),this.updateValues(),this.autoHours||(this.autoOptions=!1)},n.prototype.fillForm=function(){var n=this;this.addresses=this.formData.form.wallet.addresses,["wallet","addresses","changeAddress","note"].forEach(function(t){n.form.get(t).setValue(n.formData.form[t])});for(var t=0;tthis.blockchainService.currentMaxDecimals)return null}else if(2===l.length&&l[1].length>um.MaxUsdDecimals)return null}else if("hours"===name&&!e.isEqualTo(e.decimalPlaces(0)))return null;return e},n.prototype.createDestinationFormGroup=function(){var n=this,t=this.formBuilder.group({address:"",coins:"",hours:""});return this.destinationSubscriptions.push(t.get("coins").valueChanges.subscribe(function(t){n.updateValues()})),this.destinationHoursSubscriptions.push(t.get("hours").valueChanges.subscribe(function(t){n.updateValues()})),t},n.prototype.showBusy=function(){this.previewTx?(this.previewButton.setLoading(),this.sendButton.setDisabled()):(this.sendButton.setLoading(),this.previewButton.setDisabled()),this.busy=!0,this.navbarService.disableSwitch()},n.prototype.createTransaction=function(n){var t=this;this.showBusy();var e=this.form.get("addresses").value&&this.form.get("addresses").value.length>0?this.form.get("addresses").value.map(function(n){return n.address}):null,l=this.form.get("outputs").value&&this.form.get("outputs").value.length>0?this.form.get("outputs").value.map(function(n){return n.hash}):null;this.processingSubscription=this.walletService.createTransaction(this.form.value.wallet,e||this.form.value.wallet.addresses.map(function(n){return n.address}),l,this.destinations,this.hoursSelection,this.form.get("changeAddress").value?this.form.get("changeAddress").value:null,n?n.password:null,this.previewTx).subscribe(function(e){n&&n.close();var l=t.form.value.note.trim();if(t.previewTx){var r=new Ae.BigNumber("0");t.destinations.map(function(n){return r=r.plus(n.coins)}),t.onFormSubmitted.emit({form:{wallet:t.form.get("wallet").value,addresses:t.form.get("addresses").value,changeAddress:t.form.get("changeAddress").value,destinations:t.destinations,hoursSelection:t.hoursSelection,autoOptions:t.autoOptions,allUnspentOutputs:t.loadingUnspentOutputs?null:t.allUnspentOutputs,outputs:t.form.get("outputs").value,currency:t.selectedCurrency,note:l},amount:r,to:t.destinations.map(function(n){return n.address}),transaction:e}),t.busy=!1,t.navbarService.enableSwitch()}else t.processingSubscription=t.walletService.injectTransaction(e.encoded,l).subscribe(function(n){var e=!0;l&&!n&&(t.msgBarService.showWarning(t.translate.instant("send.error-saving-note")),e=!1),t.showSuccess(e)},function(n){return t.showError(n)})},function(e){n&&n.error(e),t.showError(e&&e.result?Tc(t.translate,e):e)})},n.prototype.resetForm=function(){for(this.form.get("wallet").setValue("",{emitEvent:!1}),this.form.get("addresses").setValue(null),this.form.get("outputs").setValue(null),this.form.get("changeAddress").setValue(""),this.form.get("note").setValue(""),this.wallet=null;this.destControls.length>0;)this.form.get("destinations").removeAt(0);this.addDestination(),this.autoHours=!0,this.autoOptions=!1,this.autoShareValue="0.5",this.updateValues()},Object.defineProperty(n.prototype,"destinations",{get:function(){var n=this;return this.destControls.map(function(t,e){var l={address:t.get("address").value.trim(),coins:(n.selectedCurrency===Fp.LeftButton?t.get("coins").value:n.values[e].toString()).trim(),originalAmount:t.get("coins").value};return n.autoHours||(l.hours=t.get("hours").value),l})},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"hoursSelection",{get:function(){var n={type:"manual"};return this.autoHours&&(n={type:"auto",mode:"share",share_factor:this.autoShareValue}),n},enumerable:!0,configurable:!0}),n.prototype.updateAvailableBalance=function(){var n=this;if(this.form.get("wallet").value){this.availableCoins=new Ae.BigNumber(0),this.availableHours=new Ae.BigNumber(0);var t=this.form.get("outputs").value,e=this.form.get("addresses").value;if(t&&t.length>0)t.map(function(t){n.availableCoins=n.availableCoins.plus(t.coins),n.availableHours=n.availableHours.plus(t.calculated_hours)});else if(e&&e.length>0)e.map(function(t){n.availableCoins=n.availableCoins.plus(t.coins),n.availableHours=n.availableHours.plus(t.hours)});else if(this.form.get("wallet").value){var l=this.form.get("wallet").value;this.availableCoins=l.coins,this.availableHours=l.hours}if(this.availableCoins.isGreaterThan(0)){var r=new Ae.BigNumber(1).minus(new Ae.BigNumber(1).dividedBy(this.appService.burnRate)),i=this.availableHours.multipliedBy(r).decimalPlaces(0,Ae.BigNumber.ROUND_FLOOR);this.minimumFee=this.availableHours.minus(i),this.availableHours=i}else this.minimumFee=new Ae.BigNumber(0),this.availableHours=new Ae.BigNumber(0)}},n.prototype.filterUnspentOutputs=function(){var n=this;return 0===this.allUnspentOutputs.length?[]:this.form.get("addresses").value&&0!==this.form.get("addresses").value.length?this.allUnspentOutputs.filter(function(t){return n.form.get("addresses").value.some(function(n){return n.address===t.address})}):this.allUnspentOutputs},n.prototype.closeGetOutputsSubscriptions=function(){this.loadingUnspentOutputs=!1,this.getOutputsSubscriptions&&this.getOutputsSubscriptions.unsubscribe()},n.prototype.closeSyncCheckSubscription=function(){this.syncCheckSubscription&&this.syncCheckSubscription.unsubscribe()},n.prototype.showSuccess=function(n){var t=this;this.busy=!1,this.navbarService.enableSwitch(),this.resetForm(),n?(this.msgBarService.showDone("send.sent"),this.sendButton.resetState()):(this.sendButton.setSuccess(),setTimeout(function(){t.sendButton.resetState()},3e3))},n.prototype.showError=function(n){this.busy=!1,this.msgBarService.showError(n),this.navbarService.enableSwitch(),this.previewButton.resetState().setEnabled(),this.sendButton.resetState().setEnabled()},n}(),Fm=l._7({encapsulation:0,styles:[[".form-field[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%]{height:12px!important;width:12px!important;opacity:.5;margin:0!important;display:inline-block;position:relative;top:2px}.form-field[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%] svg{height:12px!important;width:12px!important}.-destination[_ngcontent-%COMP%]:not(:last-child){margin-bottom:5px}.-destination[_ngcontent-%COMP%] .-icons[_ngcontent-%COMP%]{text-align:right;padding-top:5px}.-destination[_ngcontent-%COMP%] .-icons[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{width:32px;cursor:pointer}mat-checkbox[_ngcontent-%COMP%]{font-size:12px}mat-select[_ngcontent-%COMP%]{background:#fff;border:2px solid rgba(0,0,0,.05);border-radius:6px}mat-select[_ngcontent-%COMP%] .mat-select-trigger{padding:10px 30px 10px 10px;display:block;font-size:11px;height:100%;line-height:20px}mat-select[_ngcontent-%COMP%] .mat-select-arrow{border:none}mat-select[_ngcontent-%COMP%] .mat-select-placeholder{color:unset!important;-webkit-transition:unset!important;transition:unset!important}mat-option[_ngcontent-%COMP%] .mat-pseudo-checkbox-checked{background:#0072ff}.-autohours[_ngcontent-%COMP%]{margin:40px 0 20px}.-autohours[_ngcontent-%COMP%] .-check[_ngcontent-%COMP%] .mat-checkbox-checkmark-path{stroke:#0072ff!important}.-autohours[_ngcontent-%COMP%] .-check[_ngcontent-%COMP%] .mat-checkbox-background, .-autohours[_ngcontent-%COMP%] .-check[_ngcontent-%COMP%] .mat-checkbox-frame{width:20px;height:20px;background:rgba(30,34,39,.05);border-radius:6px;border-color:transparent}.-autohours[_ngcontent-%COMP%] .-check[_ngcontent-%COMP%] .mat-checkbox-label{line-height:20px;font-size:13px;color:#1e2227;-webkit-box-flex:1;-ms-flex:1;flex:1}.-autohours[_ngcontent-%COMP%] .-check[_ngcontent-%COMP%] .mat-checkbox-layout{display:-webkit-box;display:-ms-flexbox;display:flex}.-autohours[_ngcontent-%COMP%] .-options-wrapper[_ngcontent-%COMP%]{margin-top:20px}.-autohours[_ngcontent-%COMP%] .-options-wrapper[_ngcontent-%COMP%] mat-slider[_ngcontent-%COMP%]{width:100%;padding:0;height:40px;border:2px solid rgba(0,0,0,.05);border-radius:6px;background:#fff}.-autohours[_ngcontent-%COMP%] .-options-wrapper[_ngcontent-%COMP%] mat-slider[_ngcontent-%COMP%] .mat-slider-thumb, .-autohours[_ngcontent-%COMP%] .-options-wrapper[_ngcontent-%COMP%] mat-slider[_ngcontent-%COMP%] .mat-slider-thumb-label{background-color:#0072ff!important;-webkit-transform:scale(1)!important;transform:scale(1)!important;border-width:0!important}.-autohours[_ngcontent-%COMP%] .-options-wrapper[_ngcontent-%COMP%] mat-slider[_ngcontent-%COMP%] .mat-slider-thumb{right:-6px;width:12px;height:32px;border-radius:3px}.-autohours[_ngcontent-%COMP%] .-options-wrapper[_ngcontent-%COMP%] mat-slider[_ngcontent-%COMP%] .mat-slider-track-background, .-autohours[_ngcontent-%COMP%] .-options-wrapper[_ngcontent-%COMP%] mat-slider[_ngcontent-%COMP%] .mat-slider-track-fill{background-color:#fff!important}.-options[_ngcontent-%COMP%]{padding-left:5px;color:#0072ff;cursor:pointer;font-size:13px}.-options[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{color:#0072ff;padding:0;display:inline;vertical-align:middle;font-size:13px}.-buttons[_ngcontent-%COMP%]{text-align:center}.-hidden[_ngcontent-%COMP%]{display:none}.-space-between[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}label[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{display:inline;font-size:14px;color:rgba(121,135,152,.5);vertical-align:text-bottom;padding-left:5px}.-available-msg[_ngcontent-%COMP%]{background-color:#f7f7f7;border:1px dotted rgba(30,34,39,.2);border-radius:6px;padding:10px;font-size:11px;text-align:center}.-available-msg[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{opacity:.7}.-available-msg[_ngcontent-%COMP%] .value[_ngcontent-%COMP%]{opacity:1!important;font-weight:700;font-size:13px}.destinations-label[_ngcontent-%COMP%]{display:inline-block}"]],data:{}});function Bm(n){return l._33(0,[(n()(),l._9(0,0,null,null,8,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,5,"option",[],[[8,"disabled",0]],null,null,null,null)),l._8(3,147456,null,0,mo,[l.l,l.G,[2,_o]],{ngValue:[0,"ngValue"]},null),l._8(4,147456,null,0,bo,[l.l,l.G,[8,null]],{ngValue:[0,"ngValue"]},null),(n()(),l._31(5,null,["\n "," - ","\n (",")\n "])),l._25(0,If,[tn,qc,gf]),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,3,0,t.context.$implicit),n(t,4,0,t.context.$implicit)},function(n,t){n(t,2,0,!t.context.$implicit.coins||t.context.$implicit.coins.isLessThanOrEqualTo(0)),n(t,5,0,t.context.$implicit.label,l._32(t,5,1,l._22(t,6).transform(t.context.$implicit.coins?t.context.$implicit.coins.toString():0)),l._32(t,5,2,l._22(t,7).transform(t.context.$implicit.hours.toString(),!1)))})}function Vm(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Bm)),l._8(3,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,3,0,t.component.wallets)},null)}function Wm(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"mat-option",[["class","mat-option"],["role","option"]],[[1,"tabindex",0],[2,"mat-selected",null],[2,"mat-option-multiple",null],[2,"mat-active",null],[8,"id",0],[1,"aria-selected",0],[1,"aria-disabled",0],[2,"mat-option-disabled",null]],[[null,"click"],[null,"keydown"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,1)._selectViaInteraction()&&r),"keydown"===t&&(r=!1!==l._22(n,1)._handleKeydown(e)&&r),r},wm,bm)),l._8(1,49152,[[3,4]],0,pr,[l.l,l.h,[2,hr],[2,cr]],{value:[0,"value"]},null),(n()(),l._31(2,0,["\n "," - ","\n (",")\n "])),l._25(0,If,[tn,qc,gf]),l._25(0,If,[tn,qc,gf])],function(n,t){n(t,1,0,t.context.$implicit)},function(n,t){n(t,0,0,l._22(t,1)._getTabIndex(),l._22(t,1).selected,l._22(t,1).multiple,l._22(t,1).active,l._22(t,1).id,l._22(t,1).selected.toString(),l._22(t,1).disabled.toString(),l._22(t,1).disabled),n(t,2,0,t.context.$implicit.address,l._32(t,2,1,l._22(t,3).transform(t.context.$implicit.coins?t.context.$implicit.coins.toString():0)),l._32(t,2,2,l._22(t,4).transform(t.context.$implicit.hours.toString(),!1)))})}function zm(n){return l._33(0,[(n()(),l._9(0,0,null,null,3,"div",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n "," - ","\n (",")\n "])),l._25(0,If,[tn,qc,gf]),l._25(0,If,[tn,qc,gf])],null,function(n,t){n(t,1,0,t.context.$implicit.address,l._32(t,1,1,l._22(t,2).transform(t.context.$implicit.coins?t.context.$implicit.coins.toString():0)),l._32(t,1,2,l._22(t,3).transform(t.context.$implicit.hours.toString(),!1)))})}function Um(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"mat-spinner",[["class","mat-spinner mat-progress-spinner"],["mode","indeterminate"],["role","progressbar"]],[[4,"width","px"],[4,"height","px"]],null,null,Pf,Lf)),l._8(1,573440,null,0,Wu,[l.l,Hl,[2,sn]],null,null)],null,function(n,t){n(t,0,0,l._22(t,1)._elementSize,l._22(t,1)._elementSize)})}function Gm(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"mat-option",[["class","mat-option"],["role","option"]],[[1,"tabindex",0],[2,"mat-selected",null],[2,"mat-option-multiple",null],[2,"mat-active",null],[8,"id",0],[1,"aria-selected",0],[1,"aria-disabled",0],[2,"mat-option-disabled",null]],[[null,"click"],[null,"keydown"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,1)._selectViaInteraction()&&r),"keydown"===t&&(r=!1!==l._22(n,1)._handleKeydown(e)&&r),r},wm,bm)),l._8(1,49152,[[6,4]],0,pr,[l.l,l.h,[2,hr],[2,cr]],{value:[0,"value"]},null),(n()(),l._31(2,0,["\n "," - ","\n (",")\n "])),l._25(0,If,[tn,qc,gf]),l._25(0,If,[tn,qc,gf])],function(n,t){n(t,1,0,t.context.$implicit)},function(n,t){n(t,0,0,l._22(t,1)._getTabIndex(),l._22(t,1).selected,l._22(t,1).multiple,l._22(t,1).active,l._22(t,1).id,l._22(t,1).selected.toString(),l._22(t,1).disabled.toString(),l._22(t,1).disabled),n(t,2,0,t.context.$implicit.hash,l._32(t,2,1,l._22(t,3).transform(t.context.$implicit.coins?t.context.$implicit.coins.toString():0)),l._32(t,2,2,l._22(t,4).transform(t.context.$implicit.calculated_hours.toString(),!1)))})}function qm(n){return l._33(0,[(n()(),l._9(0,0,null,null,3,"div",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n "," - ","\n (",")\n "])),l._25(0,If,[tn,qc,gf]),l._25(0,If,[tn,qc,gf])],null,function(n,t){n(t,1,0,t.context.$implicit.hash,l._32(t,1,1,l._22(t,2).transform(t.context.$implicit.coins?t.context.$implicit.coins.toString():0)),l._32(t,1,2,l._22(t,3).transform(t.context.$implicit.calculated_hours.toString(),!1)))})}function Jm(n){return l._33(0,[(n()(),l._9(0,0,null,null,5,"mat-select-trigger",[],null,null,null,null,null)),l._8(1,16384,[[8,4]],0,Lu,[],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,qm)),l._8(4,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,4,0,t.component.form.get("outputs").value)},null)}function Qm(n){return l._33(0,[(n()(),l._9(0,0,null,null,6,"mat-select-trigger",[],null,null,null,null,null)),l._8(1,16384,[[8,4]],0,Lu,[],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(3,0,null,null,2,"div",[],null,null,null,null,null)),(n()(),l._31(4,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,4,0,l._32(t,4,0,l._22(t,5).transform("send.all-outputs")))})}function Km(n){return l._33(0,[(n()(),l._9(0,0,null,null,116,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,39,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,8,"label",[],[[8,"htmlFor",0]],[[null,"click"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==(n.component.busy?null:l._22(n,23).open())&&r),r},null,null)),(n()(),l._31(5,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(7,16777216,null,null,4,"mat-icon",[["class","mat-icon"],["role","img"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,9).show()&&r),"keydown"===t&&(r=!1!==l._22(n,9)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,9).hide(1500)&&r),r},Hf,Rf)),l._8(8,638976,null,0,ou,[l.l,eu,[8,null]],null,null),l._8(9,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["help"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,26,"div",[["class","-select"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,23,"mat-select",[["class","mat-select"],["formControlName","addresses"],["id","addresses"],["multiple",""],["role","listbox"]],[[1,"disabled",0],[1,"id",0],[1,"tabindex",0],[1,"aria-label",0],[1,"aria-labelledby",0],[1,"aria-required",0],[1,"aria-disabled",0],[1,"aria-invalid",0],[1,"aria-owns",0],[1,"aria-multiselectable",0],[1,"aria-describedby",0],[1,"aria-activedescendant",0],[2,"mat-select-disabled",null],[2,"mat-select-invalid",null],[2,"mat-select-required",null],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown"],[null,"focus"],[null,"blur"]],function(n,t,e){var r=!0;return"keydown"===t&&(r=!1!==l._22(n,23)._handleKeydown(e)&&r),"focus"===t&&(r=!1!==l._22(n,23)._onFocus()&&r),"blur"===t&&(r=!1!==l._22(n,23)._onBlur()&&r),r},Am,Sm)),l._28(6144,null,hr,null,[Pu]),l._28(6144,null,Os,null,[Pu]),l._8(19,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(20,{"element-disabled":0}),l._8(21,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[8,null]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(23,2080768,[["selectAddresses",4]],3,Pu,[Xr,l.h,l.B,Kl,l.l,[2,Dl],[2,Wo],[2,qo],[2,Ps],[2,uo],[8,null],Ou],{placeholder:[0,"placeholder"],multiple:[1,"multiple"],compareWith:[2,"compareWith"],id:[3,"id"]},null),l._29(603979776,3,{options:1}),l._29(603979776,4,{optionGroups:1}),l._29(335544320,5,{customTrigger:0}),l._25(131072,De.i,[De.j,l.h]),l._8(28,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,1,["\n "])),(n()(),l._4(16777216,null,1,1,null,Wm)),l._8(31,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,1,["\n "])),(n()(),l._9(33,0,null,0,5,"mat-select-trigger",[],null,null,null,null,null)),l._8(34,16384,[[5,4]],0,Lu,[],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,zm)),l._8(37,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,1,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(43,0,null,null,41,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(45,0,null,null,11,"label",[],[[8,"htmlFor",0]],[[null,"click"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==(n.component.busy?null:l._22(n,67).open())&&r),r},null,null)),(n()(),l._31(46,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(48,16777216,null,null,4,"mat-icon",[["class","mat-icon"],["role","img"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,50).show()&&r),"keydown"===t&&(r=!1!==l._22(n,50)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,50).hide(1500)&&r),r},Hf,Rf)),l._8(49,638976,null,0,ou,[l.l,eu,[8,null]],null,null),l._8(50,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["help"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Um)),l._8(55,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(58,0,null,null,25,"div",[["class","-select"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(60,0,null,null,22,"mat-select",[["class","mat-select"],["formControlName","outputs"],["id","outputs"],["multiple",""],["role","listbox"]],[[1,"disabled",0],[1,"id",0],[1,"tabindex",0],[1,"aria-label",0],[1,"aria-labelledby",0],[1,"aria-required",0],[1,"aria-disabled",0],[1,"aria-invalid",0],[1,"aria-owns",0],[1,"aria-multiselectable",0],[1,"aria-describedby",0],[1,"aria-activedescendant",0],[2,"mat-select-disabled",null],[2,"mat-select-invalid",null],[2,"mat-select-required",null],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown"],[null,"focus"],[null,"blur"]],function(n,t,e){var r=!0;return"keydown"===t&&(r=!1!==l._22(n,67)._handleKeydown(e)&&r),"focus"===t&&(r=!1!==l._22(n,67)._onFocus()&&r),"blur"===t&&(r=!1!==l._22(n,67)._onBlur()&&r),r},Am,Sm)),l._28(6144,null,hr,null,[Pu]),l._28(6144,null,Os,null,[Pu]),l._8(63,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(64,{"element-disabled":0}),l._8(65,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[8,null]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(67,2080768,[["selectOutputs",4]],3,Pu,[Xr,l.h,l.B,Kl,l.l,[2,Dl],[2,Wo],[2,qo],[2,Ps],[2,uo],[8,null],Ou],{placeholder:[0,"placeholder"],multiple:[1,"multiple"],compareWith:[2,"compareWith"],id:[3,"id"]},null),l._29(603979776,6,{options:1}),l._29(603979776,7,{optionGroups:1}),l._29(603979776,8,{customTrigger:0}),l._25(131072,De.i,[De.j,l.h]),l._8(72,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,1,["\n "])),(n()(),l._4(16777216,null,1,1,null,Gm)),l._8(75,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,1,["\n "])),(n()(),l._4(16777216,null,0,1,null,Jm)),l._8(78,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,1,["\n "])),(n()(),l._4(16777216,null,0,1,null,Qm)),l._8(81,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,1,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(86,0,null,null,29,"div",[["class","form-field -available-msg"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(88,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(89,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(92,0,null,null,2,"span",[["class","value"]],null,null,null,null,null)),(n()(),l._31(93,null,["\n ","\n "])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(96,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(97,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(100,0,null,null,2,"span",[["class","value"]],null,null,null,null,null)),(n()(),l._31(101,null,["\n ","\n "])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(104,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(105,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(108,0,null,null,2,"span",[["class","value"]],null,null,null,null,null)),(n()(),l._31(109,null,["\n ","\n "])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(112,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(113,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,8,0),n(t,9,0,l._32(t,9,0,l._22(t,10).transform("send.addresses-help"))),n(t,19,0,n(t,20,0,e.busy)),n(t,21,0,"addresses"),n(t,23,0,l._32(t,23,0,l._22(t,27).transform("send.all-addresses")),"",e.addressCompare,"addresses"),n(t,31,0,e.addresses),n(t,37,0,e.form.get("addresses").value),n(t,49,0),n(t,50,0,l._32(t,50,0,l._22(t,51).transform("send.outputs-help"))),n(t,55,0,e.loadingUnspentOutputs),n(t,63,0,n(t,64,0,e.busy)),n(t,65,0,"outputs"),n(t,67,0,l._32(t,67,0,l._22(t,71).transform("send.all-outputs")),"",e.outputCompare,"outputs"),n(t,75,0,e.unspentOutputs),n(t,78,0,e.form.get("outputs").value&&e.form.get("outputs").value.length>0),n(t,81,0,!e.form.get("outputs").value||0===e.form.get("outputs").value.length)},function(n,t){var e=t.component;n(t,4,0,e.busy?"":"addresses"),n(t,5,0,l._32(t,5,0,l._22(t,6).transform("send.addresses-label"))),n(t,16,1,[e.busy?"true":null,l._22(t,23).id,l._22(t,23).tabIndex,l._22(t,23)._ariaLabel,l._22(t,23).ariaLabelledby,l._22(t,23).required.toString(),l._22(t,23).disabled.toString(),l._22(t,23).errorState,l._22(t,23).panelOpen?l._22(t,23)._optionIds:null,l._22(t,23).multiple,l._22(t,23)._ariaDescribedby||null,l._22(t,23)._getAriaActiveDescendant(),l._22(t,23).disabled,l._22(t,23).errorState,l._22(t,23).required,l._22(t,28).ngClassUntouched,l._22(t,28).ngClassTouched,l._22(t,28).ngClassPristine,l._22(t,28).ngClassDirty,l._22(t,28).ngClassValid,l._22(t,28).ngClassInvalid,l._22(t,28).ngClassPending]),n(t,45,0,e.busy?null:"outputs"),n(t,46,0,l._32(t,46,0,l._22(t,47).transform("send.outputs-label"))),n(t,60,1,[e.busy?"true":null,l._22(t,67).id,l._22(t,67).tabIndex,l._22(t,67)._ariaLabel,l._22(t,67).ariaLabelledby,l._22(t,67).required.toString(),l._22(t,67).disabled.toString(),l._22(t,67).errorState,l._22(t,67).panelOpen?l._22(t,67)._optionIds:null,l._22(t,67).multiple,l._22(t,67)._ariaDescribedby||null,l._22(t,67)._getAriaActiveDescendant(),l._22(t,67).disabled,l._22(t,67).errorState,l._22(t,67).required,l._22(t,72).ngClassUntouched,l._22(t,72).ngClassTouched,l._22(t,72).ngClassPristine,l._22(t,72).ngClassDirty,l._22(t,72).ngClassValid,l._22(t,72).ngClassInvalid,l._22(t,72).ngClassPending]),n(t,89,0,l._32(t,89,0,l._22(t,90).transform("send.available-msg-part1"))),n(t,93,0,l._32(t,93,0,l._22(t,94).transform(e.availableCoins.toString()))),n(t,97,0,l._32(t,97,0,l._22(t,98).transform("send.available-msg-part2"))),n(t,101,0,l._32(t,101,0,l._22(t,102).transform(e.availableHours.toString(),!1))),n(t,105,0,l._32(t,105,0,l._22(t,106).transform("send.available-msg-part3"))),n(t,109,0,l._32(t,109,0,l._22(t,110).transform(e.minimumFee.toString(),!1))),n(t,113,0,l._32(t,113,0,l._22(t,114).transform("send.available-msg-part4")))})}function Xm(n){return l._33(0,[(n()(),l._9(0,0,null,null,8,"div",[["class","coin-selector-container"]],null,null,null,null,null)),l._8(1,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(2,{"element-disabled":0}),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,3,"app-double-button",[["className","light small"]],null,[[null,"onStateChange"]],function(n,t,e){var l=!0;return"onStateChange"===t&&(l=!1!==n.component.changeActiveCurrency(e)&&l),l},M_,x_)),l._8(5,49152,null,0,Bp,[],{rightButtonText:[0,"rightButtonText"],leftButtonText:[1,"leftButtonText"],activeButton:[2,"activeButton"],className:[3,"className"]},{onStateChange:"onStateChange"}),l._25(131072,De.i,[De.j,l.h]),l._25(0,l_,[gf]),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,1,0,"coin-selector-container",n(t,2,0,e.busy)),n(t,5,0,l._32(t,5,0,l._22(t,6).transform("common.usd")),l._32(t,5,1,l._22(t,7).transform("coin")),e.selectedCurrency,"light small")},null)}function Zm(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["",""])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("send.invalid-amount")))})}function $m(n){return l._33(0,[(n()(),l._9(0,0,null,null,3,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n ~ "," ","\n "])),l._27(2,2),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){var e=t.component;n(t,1,0,l._32(t,1,0,n(t,2,0,l._22(t.parent.parent,0),e.values[t.parent.context.index],"1.0-2")),l._32(t,1,1,l._22(t,3).transform("common.usd")))})}function ng(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n ~ ","\n "])),l._25(0,If,[tn,qc,gf])],null,function(n,t){var e=t.component;n(t,1,0,l._32(t,1,0,l._22(t,2).transform(e.values[t.parent.context.index])))})}function tg(n){return l._33(0,[(n()(),l._9(0,0,null,null,0,"img",[["alt","plus"],["src","../../../../../assets/img/plus-green.png"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.addDestination()&&l),l},null,null))],null,null)}function eg(n){return l._33(0,[(n()(),l._9(0,0,null,null,0,"img",[["alt","minus"],["src","../../../../../assets/img/minus-grey.png"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.removeDestination(n.parent.context.index)&&l),l},null,null))],null,null)}function lg(n){return l._33(0,[(n()(),l._9(0,0,null,null,86,"div",[["class","-destination"],["formArrayName","destinations"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],null,null,null,null)),l._8(1,212992,null,0,Qo,[[3,qi],[8,null],[8,null]],{name:[0,"name"]},null),l._28(2048,null,qi,null,[Qo]),l._8(3,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,80,"div",[["class","row"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],null,null,null,null)),l._8(6,212992,null,0,Jo,[[3,qi],[8,null],[8,null]],{name:[0,"name"]},null),l._28(2048,null,qi,null,[Jo]),l._8(8,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,8,"div",[["class","col-lg-5 col-md-4"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,5,"input",[["formControlName","address"]],[[8,"id",0],[1,"disabled",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,13)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,13).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,13)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,13)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(13,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(15,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(17,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(20,0,null,null,34,"div",[["class","col-md-3"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(22,0,null,null,13,"div",[["class","-input-addon"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(24,0,null,null,5,"input",[["formControlName","coins"]],[[1,"disabled",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,25)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,25).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,25)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,25)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(25,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(27,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(29,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(31,0,null,null,3,"span",[],null,null,null,null,null)),(n()(),l._31(32,null,["",""])),l._25(0,l_,[gf]),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(37,0,null,null,16,"div",[["class","coins-value-label"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Zm)),l._8(40,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,$m)),l._8(43,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,ng)),l._8(46,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(48,0,null,null,4,"div",[["class","link"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.assignAll(n.context.index)&&l),l},null,null)),l._8(49,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(50,{"centerd-link":0}),(n()(),l._31(51,null,["(",")"])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(56,0,null,null,17,"div",[["class","col-lg-3 col-md-4"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(58,0,null,null,14,"div",[],null,null,null,null,null)),l._8(59,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(60,{"-input-addon":0,"-hidden":1}),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(62,0,null,null,5,"input",[["formControlName","hours"]],[[1,"disabled",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,63)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,63).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,63)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,63)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(63,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(65,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(67,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(69,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(70,null,["",""])),l._25(0,l_,[gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(75,0,null,null,9,"div",[["class","col-md-1 -icons"]],null,null,null,null,null)),l._8(76,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(77,{"element-disabled":0}),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,tg)),l._8(80,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,eg)),l._8(83,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,1,0,"destinations"),n(t,6,0,t.context.index),n(t,15,0,"address"),n(t,27,0,"coins"),n(t,40,0,e.price&&e.values[t.context.index]<0),n(t,43,0,e.price&&e.values[t.context.index]>=0&&e.selectedCurrency===e.doubleButtonActive.LeftButton),n(t,46,0,e.price&&e.values[t.context.index]>=0&&e.selectedCurrency===e.doubleButtonActive.RightButton),n(t,49,0,"link",n(t,50,0,!e.price)),n(t,59,0,n(t,60,0,!0,e.autoHours)),n(t,65,0,"hours"),n(t,76,0,"col-md-1 -icons",n(t,77,0,e.busy)),n(t,80,0,0===t.context.index),n(t,83,0,0!==t.context.index)},function(n,t){var e=t.component;n(t,0,0,l._22(t,3).ngClassUntouched,l._22(t,3).ngClassTouched,l._22(t,3).ngClassPristine,l._22(t,3).ngClassDirty,l._22(t,3).ngClassValid,l._22(t,3).ngClassInvalid,l._22(t,3).ngClassPending),n(t,5,0,l._22(t,8).ngClassUntouched,l._22(t,8).ngClassTouched,l._22(t,8).ngClassPristine,l._22(t,8).ngClassDirty,l._22(t,8).ngClassValid,l._22(t,8).ngClassInvalid,l._22(t,8).ngClassPending),n(t,12,0,0===t.context.index?"destination":"",e.busy?"true":null,l._22(t,17).ngClassUntouched,l._22(t,17).ngClassTouched,l._22(t,17).ngClassPristine,l._22(t,17).ngClassDirty,l._22(t,17).ngClassValid,l._22(t,17).ngClassInvalid,l._22(t,17).ngClassPending),n(t,24,0,e.busy?"true":null,l._22(t,29).ngClassUntouched,l._22(t,29).ngClassTouched,l._22(t,29).ngClassPristine,l._22(t,29).ngClassDirty,l._22(t,29).ngClassValid,l._22(t,29).ngClassInvalid,l._22(t,29).ngClassPending),n(t,32,0,l._32(t,32,0,e.selectedCurrency===e.doubleButtonActive.LeftButton?l._22(t,33).transform("coin"):l._22(t,34).transform("common.usd"))),n(t,51,0,l._32(t,51,0,l._22(t,52).transform("send.send-all-available-coins"))),n(t,62,0,e.busy?"true":null,l._22(t,67).ngClassUntouched,l._22(t,67).ngClassTouched,l._22(t,67).ngClassPristine,l._22(t,67).ngClassDirty,l._22(t,67).ngClassValid,l._22(t,67).ngClassInvalid,l._22(t,67).ngClassPending),n(t,70,0,l._32(t,70,0,l._22(t,71).transform("hours")))})}function rg(n){return l._33(0,[(n()(),l._9(0,0,null,null,9,"div",[["class","col-lg-3 col-md-4"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,6,"div",[["class","coins-value-label"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(7,null,[" ","\n "])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){var e=t.component;n(t,5,0,l._32(t,5,0,l._22(t,6).transform("send.total"))),n(t,7,0,l._32(t,7,0,l._22(t,8).transform(e.totalHours.toString(),!1)))})}function ig(n){return l._33(0,[(n()(),l._9(0,0,null,null,19,"div",[["class","row"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,0,"div",[["class","col-lg-5 col-md-4"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,11,"div",[["class","col-md-3"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,8,"div",[["class","coins-value-label"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(9,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(11,null,[" "," / "," ","\n "])),l._25(0,If,[tn,qc,gf]),l._27(13,2),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,rg)),l._8(18,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,18,0,!t.component.autoHours)},function(n,t){var e=t.component;n(t,9,0,l._32(t,9,0,l._22(t,10).transform("send.total"))),n(t,11,0,l._32(t,11,0,l._22(t,12).transform(e.totalCoins.toString())),l._32(t,11,1,n(t,13,0,l._22(t.parent,0),e.totalConvertedCoins.toString(),"1.0-2")),l._32(t,11,2,l._22(t,14).transform("common.usd")))})}function og(n){return l._33(0,[(n()(),l._9(0,0,null,null,6,"span",[["class","-options"]],null,[[null,"mousedown"],[null,"click"]],function(n,t,e){var l=!0,r=n.component;return"mousedown"===t&&(l=!1!==e.stopPropagation()&&l),"click"===t&&(l=!1!==r.toggleOptions(e)&&l),l},null,null)),(n()(),l._31(1,null,["\n "," "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(3,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(4,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(5,0,["",""])),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,4,0)},function(n,t){var e=t.component;n(t,1,0,l._32(t,1,0,l._22(t,2).transform("send.options-label"))),n(t,5,0,e.autoOptions?"keyboard_arrow_up":"keyboard_arrow_down")})}function sg(n){return l._33(0,[l._25(0,tn,[l.w]),l._29(402653184,1,{previewButton:0}),l._29(402653184,2,{sendButton:0}),(n()(),l._9(3,0,null,null,178,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,4).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,4).onReset()&&r),r},null,null)),l._8(4,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(6,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,27,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,2,"label",[["for","wallets"]],null,null,null,null,null)),(n()(),l._31(11,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,20,"div",[["class","-select"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,17,"select",[["formControlName","wallet"],["id","wallets"]],[[1,"disabled",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"change"],[null,"blur"]],function(n,t,e){var r=!0;return"change"===t&&(r=!1!==l._22(n,19).onChange(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,19).onTouched()&&r),r},null,null)),l._8(17,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(18,{"element-disabled":0}),l._8(19,16384,null,0,_o,[l.G,l.l],null,null),l._28(1024,null,to,function(n){return[n]},[_o]),l._8(21,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(23,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(25,0,null,null,4,"option",[["disabled",""],["hidden",""]],null,null,null,null,null)),l._8(26,147456,null,0,mo,[l.l,l.G,[2,_o]],{ngValue:[0,"ngValue"]},null),l._8(27,147456,null,0,bo,[l.l,l.G,[8,null]],{ngValue:[0,"ngValue"]},null),(n()(),l._31(28,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Vm)),l._8(32,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,Km)),l._8(38,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(40,0,null,null,30,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(42,0,null,null,8,"label",[["class","destinations-label"],["for","destination"]],null,null,null,null,null)),(n()(),l._31(43,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(45,16777216,null,null,4,"mat-icon",[["class","mat-icon"],["role","img"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,47).show()&&r),"keydown"===t&&(r=!1!==l._22(n,47)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,47).hide(1500)&&r),r},Hf,Rf)),l._8(46,638976,null,0,ou,[l.l,eu,[8,null]],null,null),l._8(47,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["help"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Xm)),l._8(53,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(55,0,null,null,8,"span",[["class","-options"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.openMultipleDestinationsPopup()&&l),l},null,null)),l._8(56,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(57,{"element-disabled":0}),(n()(),l._31(58,null,["\n "," "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(60,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(61,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["keyboard_arrow_down"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,lg)),l._8(66,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,ig)),l._8(69,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(72,0,null,null,28,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(74,0,null,null,18,"label",[["for","change-address"]],null,null,null,null,null)),(n()(),l._31(75,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(77,16777216,null,null,4,"mat-icon",[["class","mat-icon"],["role","img"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,79).show()&&r),"keydown"===t&&(r=!1!==l._22(n,79)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,79).hide(1500)&&r),r},Hf,Rf)),l._8(78,638976,null,0,ou,[l.l,eu,[8,null]],null,null),l._8(79,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["help"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(83,0,null,null,8,"span",[["class","-options"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.selectChangeAddress(e)&&l),l},null,null)),l._8(84,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(85,{"element-disabled":0}),(n()(),l._31(86,null,["\n "," "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(88,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(89,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["keyboard_arrow_down"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(94,0,null,null,5,"input",[["formControlName","changeAddress"],["id","change-address"]],[[1,"disabled",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,95)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,95).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,95)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,95)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(95,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(97,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(99,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(102,0,null,null,20,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(104,0,null,null,8,"label",[["for","note"]],null,null,null,null,null)),(n()(),l._31(105,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(107,16777216,null,null,4,"mat-icon",[["class","mat-icon"],["role","img"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,109).show()&&r),"keydown"===t&&(r=!1!==l._22(n,109)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,109).hide(1500)&&r),r},Hf,Rf)),l._8(108,638976,null,0,ou,[l.l,eu,[8,null]],null,null),l._8(109,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["help"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(114,0,null,null,7,"input",[["formControlName","note"],["id","note"]],[[1,"disabled",0],[1,"maxlength",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown.enter"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0,i=n.component;return"input"===t&&(r=!1!==l._22(n,115)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,115).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,115)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,115)._compositionEnd(e.target.value)&&r),"keydown.enter"===t&&(r=!1!==i.preview()&&r),r},null,null)),l._8(115,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._8(116,540672,null,0,$o,[],{maxlength:[0,"maxlength"]},null),l._28(1024,null,Qi,function(n){return[n]},[$o]),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(119,671744,null,0,Xo,[[3,qi],[2,Qi],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(121,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(124,0,null,null,56,"div",[["class","-autohours"]],null,null,null,null,null)),l._8(125,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(126,{"element-disabled":0}),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(128,0,null,null,19,"div",[["class","row"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(130,0,null,null,16,"div",[["class","col-xl-4 col-lg-5 col-md-7"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(132,0,null,null,13,"mat-checkbox",[["class","-check mat-checkbox"]],[[1,"disabled",0],[8,"id",0],[2,"mat-checkbox-indeterminate",null],[2,"mat-checkbox-checked",null],[2,"mat-checkbox-disabled",null],[2,"mat-checkbox-label-before",null]],[[null,"change"]],function(n,t,e){var l=!0;return"change"===t&&(l=!1!==n.component.setAutoHours(e)&&l),l},Ym,Em)),l._28(5120,null,to,function(n){return[n]},[ta]),l._8(134,4374528,null,0,ta,[l.l,l.h,Rr,[8,null],[2,Zs]],{checked:[0,"checked"]},{change:"change"}),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(136,0,null,0,8,"div",[["class","-space-between"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(138,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(139,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,og)),l._8(143,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(149,0,null,null,30,"div",[],null,null,null,null,null)),l._8(150,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(151,{"row -options-wrapper":0,"-hidden":1}),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(153,0,null,null,25,"div",[["class","col-md-5"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(155,0,null,null,22,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(157,0,null,null,15,"label",[["class","-space-between"],["for","value"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(159,0,null,null,8,"span",[],null,null,null,null,null)),(n()(),l._31(160,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(162,16777216,null,null,4,"mat-icon",[["class","mat-icon"],["role","img"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,164).show()&&r),"keydown"===t&&(r=!1!==l._22(n,164)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,164).hide(1500)&&r),r},Hf,Rf)),l._8(163,638976,null,0,ou,[l.l,eu,[8,null]],null,null),l._8(164,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["help"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(169,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(170,null,["",""])),l._27(171,2),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(174,0,null,null,2,"mat-slider",[["class","-slider mat-slider"],["id","value"],["max","1"],["min","0.1"],["role","slider"],["step","0.01"]],[[1,"disabled",0],[8,"tabIndex",0],[1,"aria-disabled",0],[1,"aria-valuemax",0],[1,"aria-valuemin",0],[1,"aria-valuenow",0],[1,"aria-orientation",0],[2,"mat-slider-disabled",null],[2,"mat-slider-has-ticks",null],[2,"mat-slider-horizontal",null],[2,"mat-slider-axis-inverted",null],[2,"mat-slider-sliding",null],[2,"mat-slider-thumb-label-showing",null],[2,"mat-slider-vertical",null],[2,"mat-slider-min-value",null],[2,"mat-slider-hide-last-tick",null]],[[null,"input"],[null,"focus"],[null,"blur"],[null,"click"],[null,"keydown"],[null,"keyup"],[null,"mouseenter"],[null,"slide"],[null,"slideend"],[null,"slidestart"]],function(n,t,e){var r=!0,i=n.component;return"focus"===t&&(r=!1!==l._22(n,176)._onFocus()&&r),"blur"===t&&(r=!1!==l._22(n,176)._onBlur()&&r),"click"===t&&(r=!1!==l._22(n,176)._onClick(e)&&r),"keydown"===t&&(r=!1!==l._22(n,176)._onKeydown(e)&&r),"keyup"===t&&(r=!1!==l._22(n,176)._onKeyup()&&r),"mouseenter"===t&&(r=!1!==l._22(n,176)._onMouseenter()&&r),"slide"===t&&(r=!1!==l._22(n,176)._onSlide(e)&&r),"slideend"===t&&(r=!1!==l._22(n,176)._onSlideEnd()&&r),"slidestart"===t&&(r=!1!==l._22(n,176)._onSlideStart(e)&&r),"input"===t&&(r=!1!==i.setShareValue(e)&&r),r},Im,jm)),l._28(5120,null,to,function(n){return[n]},[Uu]),l._8(176,245760,null,0,Uu,[l.l,Rr,l.h,[2,Dl],[8,null]],{max:[0,"max"],min:[1,"min"],step:[2,"step"],value:[3,"value"]},{input:"input"}),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n\n"])),(n()(),l._9(183,0,null,null,11,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(185,0,null,null,3,"app-button",[],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.preview()&&l),l},w_,g_)),l._8(186,49152,[[1,4],["previewButton",4]],0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(187,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(190,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.send()&&l),l},w_,g_)),l._8(191,49152,[[2,4],["sendButton",4]],0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(192,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,4,0,e.form),n(t,17,0,n(t,18,0,e.busy)),n(t,21,0,"wallet"),n(t,26,0,""),n(t,27,0,""),n(t,32,0,e.wallets),n(t,38,0,e.wallet),n(t,46,0),n(t,47,0,l._32(t,47,0,l._22(t,48).transform("send.destinations-help"+(e.autoHours?"1":"2")))),n(t,53,0,e.price),n(t,56,0,"-options",n(t,57,0,e.busy)),n(t,61,0),n(t,66,0,e.destControls),n(t,69,0,e.destControls.length>1),n(t,78,0),n(t,79,0,l._32(t,79,0,l._22(t,80).transform("send.change-address-help"))),n(t,84,0,"-options",n(t,85,0,e.busy)),n(t,89,0),n(t,97,0,"changeAddress"),n(t,108,0),n(t,109,0,l._32(t,109,0,l._22(t,110).transform("send.personal-note-help"))),n(t,116,0,e.maxNoteChars),n(t,119,0,"note"),n(t,125,0,"-autohours",n(t,126,0,e.busy)),n(t,134,0,e.autoHours),n(t,143,0,e.autoHours),n(t,150,0,n(t,151,0,!0,!e.autoOptions)),n(t,163,0),n(t,164,0,l._32(t,164,0,l._22(t,165).transform("send.value-help"))),n(t,176,0,"1","0.1","0.01",e.autoShareValue),n(t,186,0,!e.form.valid),n(t,191,0,!e.form.valid)},function(n,t){var e=t.component;n(t,3,0,l._22(t,6).ngClassUntouched,l._22(t,6).ngClassTouched,l._22(t,6).ngClassPristine,l._22(t,6).ngClassDirty,l._22(t,6).ngClassValid,l._22(t,6).ngClassInvalid,l._22(t,6).ngClassPending),n(t,11,0,l._32(t,11,0,l._22(t,12).transform("send.wallet-label"))),n(t,16,0,e.busy?"true":null,l._22(t,23).ngClassUntouched,l._22(t,23).ngClassTouched,l._22(t,23).ngClassPristine,l._22(t,23).ngClassDirty,l._22(t,23).ngClassValid,l._22(t,23).ngClassInvalid,l._22(t,23).ngClassPending),n(t,28,0,l._32(t,28,0,l._22(t,29).transform("send.select-wallet"))),n(t,43,0,l._32(t,43,0,l._22(t,44).transform("send.destinations-label"))),n(t,58,0,l._32(t,58,0,l._22(t,59).transform("send.bulk-send.title"))),n(t,75,0,l._32(t,75,0,l._22(t,76).transform("send.change-address-label"))),n(t,86,0,l._32(t,86,0,l._22(t,87).transform("send.change-address-select"))),n(t,94,0,e.busy?"true":null,l._22(t,99).ngClassUntouched,l._22(t,99).ngClassTouched,l._22(t,99).ngClassPristine,l._22(t,99).ngClassDirty,l._22(t,99).ngClassValid,l._22(t,99).ngClassInvalid,l._22(t,99).ngClassPending),n(t,105,0,l._32(t,105,0,l._22(t,106).transform("send.personal-note-label"))),n(t,114,0,e.busy?"true":null,l._22(t,116).maxlength?l._22(t,116).maxlength:null,l._22(t,121).ngClassUntouched,l._22(t,121).ngClassTouched,l._22(t,121).ngClassPristine,l._22(t,121).ngClassDirty,l._22(t,121).ngClassValid,l._22(t,121).ngClassInvalid,l._22(t,121).ngClassPending),n(t,132,0,e.busy?"true":null,l._22(t,134).id,l._22(t,134).indeterminate,l._22(t,134).checked,l._22(t,134).disabled,"before"==l._22(t,134).labelPosition),n(t,139,0,l._32(t,139,0,l._22(t,140).transform("send.hours-allocation-label"))),n(t,160,0,l._32(t,160,0,l._22(t,161).transform("send.value-label"))),n(t,170,0,l._32(t,170,0,n(t,171,0,l._22(t,0),e.autoShareValue,"1.0-2"))),n(t,174,1,[e.busy?"true":null,l._22(t,176).tabIndex,l._22(t,176).disabled,l._22(t,176).max,l._22(t,176).min,l._22(t,176).value,l._22(t,176).vertical?"vertical":"horizontal",l._22(t,176).disabled,l._22(t,176).tickInterval,!l._22(t,176).vertical,l._22(t,176)._invertAxis,l._22(t,176)._isSliding,l._22(t,176).thumbLabel,l._22(t,176).vertical,l._22(t,176)._isMinValue,l._22(t,176).disabled||l._22(t,176)._isMinValue&&l._22(t,176)._thumbGap&&l._22(t,176)._invertAxis]),n(t,187,0,l._32(t,187,0,l._22(t,188).transform("send.preview-button"))),n(t,192,0,l._32(t,192,0,l._22(t,193).transform("send.send-button")))})}var ag=function(){function n(){}return n.prototype.transform=function(n){return zp.unix(n).format("YYYY-MM-DD HH:mm")},n}(),ug=function(){function n(n,t){var e=this;this.priceService=n,this.dialog=t,this.showInputsOutputs=!1,this.subscription=this.priceService.price.subscribe(function(n){return e.price=n})}return Object.defineProperty(n.prototype,"hoursText",{get:function(){if(!this.transaction)return"";if(!this.isPreview){if(this.transaction.coinsMovedInternally)return"tx.hours-moved";if(this.transaction.balance.isGreaterThan(0))return"tx.hours-received"}return"tx.hours-sent"},enumerable:!0,configurable:!0}),n.prototype.ngOnInit=function(){var n=this;this.isPreview&&(this.transaction.hoursSent=new Ae.BigNumber("0"),this.transaction.outputs.filter(function(t){return n.transaction.to.find(function(n){return n===t.address})}).map(function(t){return n.transaction.hoursSent=n.transaction.hoursSent.plus(new Ae.BigNumber(t.hours))}))},n.prototype.ngOnDestroy=function(){this.subscription.unsubscribe()},n.prototype.toggleInputsOutputs=function(n){n.preventDefault(),this.showInputsOutputs=!this.showInputsOutputs},n.prototype.editNote=function(){var n=this,t=new oa;t.width="566px",t.data=this.transaction,this.dialog.open(am,t).afterClosed().subscribe(function(t){(t||""===t)&&(n.transaction.note=t)})},n}(),cg=l._7({encapsulation:0,styles:[["h4[_ngcontent-%COMP%]{font-size:14px;margin:0 0 30px}.-item[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;font-size:13px}.-item[_ngcontent-%COMP%]:not(:last-child){margin-bottom:10px}.-item[_ngcontent-%COMP%] .-number[_ngcontent-%COMP%]{padding:10px;background:#f7f7f7;-ms-flex-item-align:start;align-self:flex-start;border-radius:10px}.-item[_ngcontent-%COMP%] .-info[_ngcontent-%COMP%]{margin-left:10px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.-item[_ngcontent-%COMP%] .-info[_ngcontent-%COMP%] div[_ngcontent-%COMP%]{word-break:break-all}.-item[_ngcontent-%COMP%] .-info[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%]{padding:10px 0;margin-bottom:5px}.-data[_ngcontent-%COMP%]{font-size:12px;display:-webkit-box;display:-ms-flexbox;display:flex}.-data[_ngcontent-%COMP%]:not(:last-child){margin-bottom:5px}.-data[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:first-child{color:rgba(30,34,39,.5);display:inline-block;width:60px;-ms-flex-negative:0;flex-shrink:0}.-data[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:nth-child(2){word-break:break-word}.-data[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px;padding-left:5px;color:#0072ff;cursor:pointer}.-data[_ngcontent-%COMP%] .-grey[_ngcontent-%COMP%]{color:rgba(30,34,39,.5)}.-data.-more[_ngcontent-%COMP%]{margin-bottom:0!important}.-data.-more[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{width:auto!important;margin-top:20px;color:#0072ff;cursor:pointer}.-data.-more[_ngcontent-%COMP%] span[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{display:inline;vertical-align:middle;font-size:13px}.-tx-meta[_ngcontent-%COMP%] .-data[_ngcontent-%COMP%]{margin-bottom:10px}.-tx-price[_ngcontent-%COMP%]{text-align:center;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.-tx-price[_ngcontent-%COMP%] .-icon.-incoming[_ngcontent-%COMP%]{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.-tx-price[_ngcontent-%COMP%] .-icon[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{width:30px}.-tx-price[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{color:#1e2227;font-size:16px;font-weight:700;margin:10px 0 5px}.-tx-price[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);font-size:12px;margin:0}.-tx-price[_ngcontent-%COMP%] p[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:rgba(121,135,152,.5)}.-margin-top[_ngcontent-%COMP%]{margin-top:30px}"]],data:{}});function dg(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"h4",[],null,null,null,null,null)),(n()(),l._31(1,null,["",""])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("tx.confirm-transaction")))})}function hg(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"h4",[],null,null,null,null,null)),(n()(),l._31(1,null,["",""])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("tx.transaction")))})}function pg(n){return l._33(0,[(n()(),l._9(0,0,null,null,21,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,8,"div",[["class","-data"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(5,null,["",":"])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,[" "])),(n()(),l._9(8,0,null,null,1,"span",[],null,null,null,null,null)),(n()(),l._31(9,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,8,"div",[["class","-data"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(15,null,["",":"])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,[" "])),(n()(),l._9(18,0,null,null,1,"span",[],null,null,null,null,null)),(n()(),l._31(19,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){var e=t.component;n(t,5,0,l._32(t,5,0,l._22(t,6).transform("tx.from"))),n(t,9,0,e.transaction.from),n(t,15,0,l._32(t,15,0,l._22(t,16).transform("tx.to"))),n(t,19,0,e.transaction.to.join(", "))})}function fg(n){return l._33(0,[(n()(),l._9(0,0,null,null,23,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,9,"div",[["class","-data"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(5,null,["",":"])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,[" "])),(n()(),l._9(8,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(9,null,["",""])),l._27(10,1),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(13,0,null,null,9,"div",[["class","-data"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(15,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(16,null,["",":"])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,[" "])),(n()(),l._9(19,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(20,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){var e=t.component;n(t,5,0,l._32(t,5,0,l._22(t,6).transform("tx.date"))),n(t,9,0,l._32(t,9,0,n(t,10,0,l._22(t.parent,0),e.transaction.timestamp))),n(t,16,0,l._32(t,16,0,l._22(t,17).transform("tx.status"))),n(t,20,0,l._32(t,20,0,l._22(t,21).transform(e.transaction.confirmed?"tx.confirmed":"tx.pending")))})}function _g(n){return l._33(0,[(n()(),l._9(0,0,null,null,8,"div",[["class","-data"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(3,null,["",":"])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,[" "])),(n()(),l._9(6,0,null,null,1,"span",[],null,null,null,null,null)),(n()(),l._31(7,null,["",""])),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){var e=t.component;n(t,3,0,l._32(t,3,0,l._22(t,4).transform("tx.id"))),n(t,7,0,e.transaction.txid)})}function mg(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["",""]))],null,function(n,t){n(t,1,0,t.component.transaction.note)})}function gg(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"span",[["class","-grey"]],null,null,null,null,null)),(n()(),l._31(1,null,["",""])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("tx.without-note")))})}function yg(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.editNote()&&l),l},Hf,Rf)),l._8(1,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["edit"]))],function(n,t){n(t,1,0)},null)}function bg(n){return l._33(0,[(n()(),l._9(0,0,null,null,14,"div",[["class","-data"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(3,null,["",":"])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,mg)),l._8(7,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,gg)),l._8(10,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,yg)),l._8(13,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,7,0,e.transaction.note),n(t,10,0,!e.transaction.note),n(t,13,0,!e.isPreview)},function(n,t){n(t,3,0,l._32(t,3,0,l._22(t,4).transform("tx.note")))})}function vg(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"span",[],null,null,null,null,null)),(n()(),l._31(-1,null,["*"]))],null,null)}function wg(n){return l._33(0,[(n()(),l._9(0,16777216,null,null,7,"p",[],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,1).show()&&r),"keydown"===t&&(r=!1!==l._22(n,1)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,1).hide(1500)&&r),r},null,null)),l._8(1,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(3,null,["\n ",""])),l._27(4,4),(n()(),l._4(16777216,null,null,1,null,vg)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(0,null,null,0))],function(n,t){var e=t.component;n(t,1,0,e.isPreview?"":l._32(t,1,0,l._22(t,2).transform("tx.current-rate"))),n(t,6,0,!e.isPreview)},function(n,t){var e=t.component;n(t,3,0,l._32(t,3,0,n(t,4,0,l._22(t.parent,1),e.transaction.balance*e.price,"USD","symbol","1.2-2")))})}function xg(n){return l._33(0,[(n()(),l._9(0,0,null,null,9,"div",[["class","-data -more"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,6,"span",[],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.toggleInputsOutputs(e)&&l),l},null,null)),(n()(),l._31(3,null,["\n "," "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(5,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(6,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["keyboard_arrow_down"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,6,0)},function(n,t){n(t,3,0,l._32(t,3,0,l._22(t,4).transform("tx.show-more")))})}function Mg(n){return l._33(0,[(n()(),l._9(0,0,null,null,26,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,1,"div",[["class","-number"]],null,null,null,null,null)),(n()(),l._31(3,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,20,"div",[["class","-info"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(7,0,null,null,1,"div",[["class","-address"]],null,null,null,null,null)),(n()(),l._31(8,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,6,"div",[["class","-data"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(13,null,["",":"])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(15,null,[" ","\n "])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(18,0,null,null,6,"div",[["class","-data"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(20,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(21,null,["",":"])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(23,null,[" ","\n "])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){var e=t.component;n(t,3,0,t.context.index+1),n(t,8,0,e.isPreview?t.context.$implicit.address:t.context.$implicit.owner),n(t,13,0,l._32(t,13,0,l._22(t,14).transform("tx.coins"))),n(t,15,0,l._32(t,15,0,l._22(t,16).transform(t.context.$implicit.coins,!0,"first"))),n(t,21,0,l._32(t,21,0,l._22(t,22).transform("tx.hours"))),n(t,23,0,l._32(t,23,0,l._22(t,24).transform(t.context.$implicit.calculated_hours,!1,"first")))})}function kg(n){return l._33(0,[(n()(),l._9(0,0,null,null,26,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,1,"div",[["class","-number"]],null,null,null,null,null)),(n()(),l._31(3,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,20,"div",[["class","-info"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(7,0,null,null,1,"div",[["class","-address"]],null,null,null,null,null)),(n()(),l._31(8,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,6,"div",[["class","-data"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(13,null,["",":"])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(15,null,[" ","\n "])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(18,0,null,null,6,"div",[["class","-data"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(20,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(21,null,["",":"])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(23,null,[" ","\n "])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){var e=t.component;n(t,3,0,t.context.index+1),n(t,8,0,e.isPreview?t.context.$implicit.address:t.context.$implicit.dst),n(t,13,0,l._32(t,13,0,l._22(t,14).transform("tx.coins"))),n(t,15,0,l._32(t,15,0,l._22(t,16).transform(t.context.$implicit.coins,!0,"first"))),n(t,21,0,l._32(t,21,0,l._22(t,22).transform("tx.hours"))),n(t,23,0,l._32(t,23,0,l._22(t,24).transform(t.context.$implicit.hours,!1,"first")))})}function Cg(n){return l._33(0,[(n()(),l._9(0,0,null,null,21,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,8,"div",[["class","col-md-6 -margin-top"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,2,"h4",[],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,Mg)),l._8(9,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,8,"div",[["class","col-md-6 -margin-top"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,2,"h4",[],null,null,null,null,null)),(n()(),l._31(15,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,kg)),l._8(19,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,9,0,e.transaction.inputs),n(t,19,0,e.transaction.outputs)},function(n,t){n(t,5,0,l._32(t,5,0,l._22(t,6).transform("tx.inputs"))),n(t,15,0,l._32(t,15,0,l._22(t,16).transform("tx.outputs")))})}function Sg(n){return l._33(0,[l._25(0,ag,[]),l._25(0,ln,[l.w]),(n()(),l._9(2,0,null,null,65,"div",[["class","row"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,59,"div",[["class","col-md-12"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,dg)),l._8(7,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,hg)),l._8(10,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,47,"div",[["class","row"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,27,"div",[["class","col-md-9 -tx-meta"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,pg)),l._8(17,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,fg)),l._8(20,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(22,0,null,null,12,"div",[["class","-data"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(24,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(25,null,["",":"])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(28,0,null,null,5,"span",[],null,null,null,null,null)),(n()(),l._31(29,null,["\n "," ","\n |\n "," ","\n "])),l._25(0,If,[tn,qc,gf]),l._25(131072,De.i,[De.j,l.h]),l._25(0,If,[tn,qc,gf]),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,_g)),l._8(37,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,bg)),l._8(40,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(43,0,null,null,15,"div",[["class","col-md-3 -tx-price"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(45,0,null,null,5,"div",[["class","-icon"]],null,null,null,null,null)),l._8(46,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(47,{"-incoming":0}),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(49,0,null,null,0,"img",[["src","/assets/img/send-blue.png"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(52,0,null,null,2,"h4",[],null,null,null,null,null)),(n()(),l._31(53,null,["",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,wg)),l._8(57,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,xg)),l._8(62,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Cg)),l._8(66,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,7,0,e.isPreview),n(t,10,0,!e.isPreview),n(t,17,0,e.isPreview),n(t,20,0,!e.isPreview),n(t,37,0,!e.isPreview),n(t,40,0,e.transaction.note||!e.isPreview),n(t,46,0,"-icon",n(t,47,0,!e.isPreview&&e.transaction.balance.isGreaterThan(0)&&!e.transaction.coinsMovedInternally)),n(t,57,0,e.price),n(t,62,0,!e.showInputsOutputs),n(t,66,0,e.showInputsOutputs)},function(n,t){var e=t.component;n(t,25,0,l._32(t,25,0,l._22(t,26).transform("tx.hours"))),n(t,29,0,l._32(t,29,0,l._22(t,30).transform(e.transaction.hoursSent.toString(),!1,"first")),l._32(t,29,1,l._22(t,31).transform(e.hoursText)),l._32(t,29,2,l._22(t,32).transform(e.transaction.hoursBurned.toString(),!1,"first")),l._32(t,29,3,l._22(t,33).transform("tx.hours-burned"))),n(t,53,0,l._32(t,53,0,l._22(t,54).transform(e.transaction.balance.toString())))})}var Og=function(){function n(n,t,e,r,i){this.walletService=n,this.msgBarService=t,this.dialog=e,this.hwWalletService=r,this.translate=i,this.onBack=new l.o}return n.prototype.ngOnDestroy=function(){this.msgBarService.hide(),this.sendSubscription&&this.sendSubscription.unsubscribe()},n.prototype.back=function(){this.onBack.emit(!1)},n.prototype.send=function(){var n=this;if(!this.sendButton.isLoading())if(this.msgBarService.hide(),this.sendButton.resetState(),this.transaction.wallet.encrypted&&!this.transaction.wallet.isHardware){var t=new oa;t.data={wallet:this.transaction.wallet},this.dialog.open(Zp,t).componentInstance.passwordSubmit.subscribe(function(t){n.finishSending(t)})}else this.transaction.wallet.isHardware?(this.showBusy(),this.sendSubscription=this.hwWalletService.checkIfCorrectHwConnected(this.transaction.wallet.addresses[0].address).subscribe(function(){return n.finishSending()},function(t){return n.showError(Tc(n.translate,t))})):this.finishSending()},n.prototype.showBusy=function(){this.sendButton.setLoading(),this.backButton.setDisabled()},n.prototype.finishSending=function(n){var t=this;this.showBusy();var e=this.transaction.note.trim();this.sendSubscription=this.walletService.signTransaction(this.transaction.wallet,n?n.password:null,this.transaction).flatMap(function(l){return n&&n.close(),t.walletService.injectTransaction(l.encoded,e)}).subscribe(function(n){e&&!n?setTimeout(function(){return t.msgBarService.showWarning(t.translate.instant("send.error-saving-note"))}):setTimeout(function(){return t.msgBarService.showDone("send.sent")}),t.walletService.startDataRefreshSubscription(),t.onBack.emit(!0)},function(e){n&&n.error(e),t.showError(e&&e.result?Tc(t.translate,e):e)})},n.prototype.showError=function(n){this.msgBarService.showError(n),this.sendButton.resetState(),this.backButton.resetState().setEnabled()},n}(),Tg=l._7({encapsulation:0,styles:[[".-buttons[_ngcontent-%COMP%]{margin-top:10px;text-align:center}"]],data:{}});function Lg(n){return l._33(0,[l._29(402653184,1,{sendButton:0}),l._29(402653184,2,{backButton:0}),(n()(),l._9(2,0,null,null,1,"app-transaction-info",[],null,null,null,Sg,cg)),l._8(3,245760,null,0,ug,[rf,fa],{transaction:[0,"transaction"],isPreview:[1,"isPreview"]},null),(n()(),l._31(-1,null,["\n\n"])),(n()(),l._9(5,0,null,null,11,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(7,0,null,null,3,"app-button",[],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.back()&&l),l},w_,g_)),l._8(8,49152,[[2,4],["backButton",4]],0,Lc,[],null,{action:"action"}),(n()(),l._31(9,0,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.send()&&l),l},w_,g_)),l._8(13,49152,[[1,4],["sendButton",4]],0,Lc,[],null,{action:"action"}),(n()(),l._31(14,0,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){n(t,3,0,t.component.transaction,!0)},function(n,t){n(t,9,0,l._32(t,9,0,l._22(t,10).transform("send.back-button"))),n(t,14,0,l._32(t,14,0,l._22(t,15).transform("send.send-button")))})}var Pg=l._7({encapsulation:0,styles:[[".-buttons[_ngcontent-%COMP%]{text-align:center}.-paper[_ngcontent-%COMP%]{background-color:#fbfbfb;border-radius:10px;-webkit-box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);padding:30px;margin:30px}"]],data:{}});function Dg(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-send-form",[],null,[[null,"onFormSubmitted"]],function(n,t,e){var l=!0;return"onFormSubmitted"===t&&(l=!1!==n.component.onFormSubmitted(e)&&l),l},ym,cm)),l._8(1,245760,null,0,um,[ns,qc,Sc,fa,jc,Vp,oc,De.j,l.h,gf,rf],{formData:[0,"formData"]},{onFormSubmitted:"onFormSubmitted"})],function(n,t){n(t,1,0,t.component.formData)},null)}function Ag(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-send-form-advanced",[],null,[[null,"onFormSubmitted"]],function(n,t,e){var l=!0;return"onFormSubmitted"===t&&(l=!1!==n.component.onFormSubmitted(e)&&l),l},sg,Fm)),l._8(1,245760,null,0,Nm,[qc,Sc,gf,ns,fa,jc,Vp,oc,De.j,rf,l.h],{formData:[0,"formData"]},{onFormSubmitted:"onFormSubmitted"})],function(n,t){n(t,1,0,t.component.formData)},null)}function Eg(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-send-preview",[],null,[[null,"onBack"]],function(n,t,e){var l=!0;return"onBack"===t&&(l=!1!==n.component.onBack(e)&&l),l},Lg,Tg)),l._8(1,180224,null,0,Og,[Sc,jc,fa,oc,De.j],{transaction:[0,"transaction"]},{onBack:"onBack"})],function(n,t){n(t,1,0,t.component.transaction)},null)}function Yg(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-header",[],null,null,null,K_,D_)),l._8(1,245760,null,0,P_,[gf,nf,qc,rf,Sc],{headline:[0,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n"])),(n()(),l._9(4,0,null,null,13,"div",[["class","container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,10,"div",[["class","-paper"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Dg)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Ag)),l._8(12,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Eg)),l._8(15,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,1,0,l._32(t,1,0,l._22(t,2).transform("title.wallets"))),n(t,9,0,e.showForm&&e.activeForm===e.activeForms.LeftButton),n(t,12,0,e.showForm&&e.activeForm===e.activeForms.RightButton),n(t,15,0,!e.showForm)},null)}var jg=l._5("app-send-skycoin",Wp,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-send-skycoin",[],null,null,null,Yg,Pg)),l._8(1,180224,null,0,Wp,[Vp,l.h],null,null)],null,null)},{},{},[]),Ig=function(){this.isLoading=!0},Rg=l._7({encapsulation:0,styles:[[".-content[_ngcontent-%COMP%]{text-align:center;margin:50px 0;color:rgba(30,34,39,.5);font-size:13px}.-content[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin-top:15px}.-content[_ngcontent-%COMP%] i[_ngcontent-%COMP%]{color:rgba(30,34,39,.2);font-size:40px}.-content[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%]{display:inline-block}.-content[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%] circle{stroke:rgba(30,34,39,.2)}"]],data:{}});function Hg(n){return l._33(0,[(n()(),l._9(0,0,null,null,8,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,1,"mat-spinner",[["class","mat-spinner mat-progress-spinner"],["mode","indeterminate"],["role","progressbar"]],[[4,"width","px"],[4,"height","px"]],null,null,Pf,Lf)),l._8(3,573440,null,0,Wu,[l.l,Hl,[2,sn]],{diameter:[0,"diameter"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,2,"p",[],null,null,null,null,null)),(n()(),l._31(6,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,3,0,40)},function(n,t){n(t,2,0,l._22(t,3)._elementSize,l._22(t,3)._elementSize),n(t,6,0,l._32(t,6,0,l._22(t,7).transform("common.loading")))})}function Ng(n){return l._33(0,[(n()(),l._9(0,0,null,null,8,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,1,"i",[["class","material-icons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["announcement"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,2,"p",[],null,null,null,null,null)),(n()(),l._31(6,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){var e=t.component;n(t,6,0,l._32(t,6,0,l._22(t,7).transform(e.noDataText)))})}function Fg(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"div",[["class","-content"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Hg)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Ng)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,3,0,e.isLoading),n(t,6,0,!e.isLoading)},null)}var Bg=l._7({encapsulation:0,styles:[[".form-field[_ngcontent-%COMP%]{margin:10px 40px -20px;display:-webkit-box;display:-ms-flexbox;display:flex}.form-field[_ngcontent-%COMP%] .x-button[_ngcontent-%COMP%]{width:24px;height:24px;margin-top:10px;cursor:pointer}.bottom-line[_ngcontent-%COMP%]{border-bottom:2px solid rgba(0,0,0,.02)}mat-select[_ngcontent-%COMP%] .mat-select-trigger{padding:10px 30px 10px 10px;display:block;font-size:11px;height:100%;line-height:20px}mat-select[_ngcontent-%COMP%] .mat-select-value{font-size:13px;line-height:22px}mat-select[_ngcontent-%COMP%] .mat-select-arrow{border:none}mat-select[_ngcontent-%COMP%] .mat-select-placeholder{-webkit-transition:unset!important;transition:unset!important;color:rgba(30,34,39,.5)}mat-select[_ngcontent-%COMP%] .mat-select-placeholder::before{content:'filter_list';font-family:'Material Icons';font-weight:400;font-style:normal;font-size:13px;margin-right:10px}mat-select[_ngcontent-%COMP%] mat-select-trigger[_ngcontent-%COMP%]::before{content:'filter_list';font-family:'Material Icons';font-weight:400;font-style:normal;font-size:13px;margin-right:10px}mat-select[_ngcontent-%COMP%] .filter[_ngcontent-%COMP%]{font-size:13px;margin-left:28px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;color:rgba(30,34,39,.5)}mat-option[_ngcontent-%COMP%] .mat-pseudo-checkbox-checked{background:#0072ff}.mat-option-disabled[_ngcontent-%COMP%] .mat-pseudo-checkbox-disabled{opacity:.5}.-paper[_ngcontent-%COMP%]{background-color:#fbfbfb;border-radius:10px;-webkit-box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);margin:30px}.-transaction[_ngcontent-%COMP%]{background-color:#fafafa;border-bottom:1px solid #eff0f0;cursor:pointer;display:-webkit-box;display:-ms-flexbox;display:flex;padding:20px 12px}.-transaction[_ngcontent-%COMP%]:first-child{border-top-left-radius:15px;border-top-right-radius:15px}.-transaction[_ngcontent-%COMP%]:last-child{border-bottom-left-radius:15px;border-bottom-right-radius:15px}.-transaction[_ngcontent-%COMP%] > div[_ngcontent-%COMP%]{padding:0 8px}.-transaction[_ngcontent-%COMP%] .-icon[_ngcontent-%COMP%]{margin-top:5px}.-transaction[_ngcontent-%COMP%] .-icon[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{width:32px}.-transaction[_ngcontent-%COMP%] .-icon.-incoming[_ngcontent-%COMP%]{-webkit-transform:scaleX(-1);transform:scaleX(-1);-webkit-filter:FlipH;filter:FlipH;-ms-filter:FlipH}.-transaction[_ngcontent-%COMP%] .-icon.-pending[_ngcontent-%COMP%]{opacity:.5}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%]{-webkit-box-flex:1;-ms-flex:1;flex:1}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{color:#1e2227;font-size:13px;font-weight:700;line-height:15px;margin:0 0 8px}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{font-size:10px;line-height:12px;padding-left:5px;font-weight:300}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] .-pending[_ngcontent-%COMP%]{color:#fdb51e}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] .-timestamp[_ngcontent-%COMP%]{color:rgba(30,34,39,.5)}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] .-item[_ngcontent-%COMP%]:not(:last-child){margin-bottom:5px}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] .-item[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{display:inline-block;height:17px;vertical-align:middle;width:17px;margin-right:4px}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] .-item[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);display:inline-block;font-size:13px;line-height:15px;margin:0}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] .-item[_ngcontent-%COMP%] .note[_ngcontent-%COMP%]{color:#1e2227;word-break:break-word;display:inline}.-transaction[_ngcontent-%COMP%] .-balance[_ngcontent-%COMP%]{width:200px;text-align:right}.-transaction[_ngcontent-%COMP%] .-balance[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{color:#1e2227;font-size:13px;font-weight:700;line-height:15px;margin:0 0 8px}.-transaction[_ngcontent-%COMP%] .-balance[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);display:inline-block;font-size:13px;line-height:15px;margin:0}.-transaction[_ngcontent-%COMP%] .-balance[_ngcontent-%COMP%] p[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:rgba(121,135,152,.5)}"]],data:{}});function Vg(n){return l._33(0,[(n()(),l._9(0,0,null,null,3,"mat-option",[["class","mat-option"],["role","option"]],[[1,"tabindex",0],[2,"mat-selected",null],[2,"mat-option-multiple",null],[2,"mat-active",null],[8,"id",0],[1,"aria-selected",0],[1,"aria-disabled",0],[2,"mat-option-disabled",null]],[[null,"click"],[null,"keydown"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,1)._selectViaInteraction()&&r),"keydown"===t&&(r=!1!==l._22(n,1)._handleKeydown(e)&&r),r},wm,bm)),l._8(1,49152,[[1,4]],0,pr,[l.l,l.h,[2,hr],[2,cr]],{value:[0,"value"]},null),(n()(),l._31(2,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h])],function(n,t){n(t,1,0,t.parent.context.$implicit)},function(n,t){n(t,0,0,l._22(t,1)._getTabIndex(),l._22(t,1).selected,l._22(t,1).multiple,l._22(t,1).active,l._22(t,1).id,l._22(t,1).selected.toString(),l._22(t,1).disabled.toString(),l._22(t,1).disabled),n(t,2,0,l._32(t,2,0,l._22(t,3).transform("history.all-addresses")))})}function Wg(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"mat-option",[["class","mat-option"],["role","option"]],[[1,"tabindex",0],[2,"mat-selected",null],[2,"mat-option-multiple",null],[2,"mat-active",null],[8,"id",0],[1,"aria-selected",0],[1,"aria-disabled",0],[2,"mat-option-disabled",null]],[[null,"click"],[null,"keydown"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,1)._selectViaInteraction()&&r),"keydown"===t&&(r=!1!==l._22(n,1)._handleKeydown(e)&&r),r},wm,bm)),l._8(1,49152,[[1,4]],0,pr,[l.l,l.h,[2,hr],[2,cr]],{value:[0,"value"],disabled:[1,"disabled"]},null),(n()(),l._31(2,0,["\n "," - ","\n (",")\n "])),l._25(0,If,[tn,qc,gf]),l._25(0,If,[tn,qc,gf])],function(n,t){n(t,1,0,t.context.$implicit,t.parent.context.$implicit.allAddressesSelected)},function(n,t){n(t,0,0,l._22(t,1)._getTabIndex(),l._22(t,1).selected,l._22(t,1).multiple,l._22(t,1).active,l._22(t,1).id,l._22(t,1).selected.toString(),l._22(t,1).disabled.toString(),l._22(t,1).disabled),n(t,2,0,t.context.$implicit.address,l._32(t,2,1,l._22(t,3).transform(t.context.$implicit.coins)),l._32(t,2,2,l._22(t,4).transform(t.context.$implicit.hours,!1)))})}function zg(n){return l._33(0,[(n()(),l._9(0,0,null,null,10,"mat-optgroup",[["class","mat-optgroup"],["role","group"]],[[2,"mat-optgroup-disabled",null],[1,"aria-disabled",0],[1,"aria-labelledby",0]],null,null,Mm,xm)),l._8(1,49152,[[2,4]],0,cr,[],{label:[0,"label"]},null),l._25(0,If,[tn,qc,gf]),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,0,1,null,Vg)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,0,1,null,Wg)),l._8(9,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,1,0,l._12(3,"\n ",t.context.$implicit.label," - ",l._32(t,1,0,l._22(t,2).transform(t.context.$implicit.coins)),"\n (",l._32(t,1,0,l._22(t,3).transform(t.context.$implicit.hours,!1)),")\n ")),n(t,6,0,t.context.$implicit.addresses.length>1),n(t,9,0,t.context.$implicit.addresses)},function(n,t){n(t,0,0,l._22(t,1).disabled,l._22(t,1).disabled.toString(),l._22(t,1)._labelId)})}function Ug(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["",""])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("history.filter")))})}function Gg(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["",""])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("history.filters")))})}function qg(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["",""]))],null,function(n,t){n(t,1,0,t.parent.parent.context.$implicit.label)})}function Jg(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["",""]))],null,function(n,t){n(t,1,0,t.parent.parent.context.$implicit.address)})}function Qg(n){return l._33(0,[(n()(),l._9(0,0,null,null,9,"div",[["class","filter"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,qg)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Jg)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(7,null,["\n - ","\n (",")\n "])),l._25(0,If,[tn,qc,gf]),l._25(0,If,[tn,qc,gf])],function(n,t){n(t,3,0,t.parent.context.$implicit.label),n(t,6,0,!t.parent.context.$implicit.label)},function(n,t){n(t,7,0,l._32(t,7,0,l._22(t,8).transform(t.parent.context.$implicit.coins)),l._32(t,7,1,l._22(t,9).transform(t.parent.context.$implicit.hours,!1)))})}function Kg(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Qg)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,3,0,t.context.$implicit.label||!t.context.$implicit.showingWholeWallet)},null)}function Xg(n){return l._33(0,[(n()(),l._9(0,0,null,null,0,"img",[["class","x-button"],["src","assets/img/close-grey.png"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.removeFilters()&&l),l},null,null))],null,null)}function Zg(n){return l._33(0,[(n()(),l._9(0,0,null,null,38,"div",[["class","form-field"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,1).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,1).onReset()&&r),r},null,null)),l._8(1,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(3,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,29,"mat-select",[["class","mat-select"],["formControlName","filter"],["id","filter"],["multiple",""],["role","listbox"]],[[1,"id",0],[1,"tabindex",0],[1,"aria-label",0],[1,"aria-labelledby",0],[1,"aria-required",0],[1,"aria-disabled",0],[1,"aria-invalid",0],[1,"aria-owns",0],[1,"aria-multiselectable",0],[1,"aria-describedby",0],[1,"aria-activedescendant",0],[2,"mat-select-disabled",null],[2,"mat-select-invalid",null],[2,"mat-select-required",null],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown"],[null,"focus"],[null,"blur"]],function(n,t,e){var r=!0;return"keydown"===t&&(r=!1!==l._22(n,12)._handleKeydown(e)&&r),"focus"===t&&(r=!1!==l._22(n,12)._onFocus()&&r),"blur"===t&&(r=!1!==l._22(n,12)._onBlur()&&r),r},Am,Sm)),l._28(6144,null,hr,null,[Pu]),l._28(6144,null,Os,null,[Pu]),l._8(8,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(9,{"bottom-line":0}),l._8(10,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[8,null]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(12,2080768,null,3,Pu,[Xr,l.h,l.B,Kl,l.l,[2,Dl],[2,Wo],[2,qo],[2,Ps],[2,uo],[8,null],Ou],{placeholder:[0,"placeholder"],multiple:[1,"multiple"],id:[2,"id"]},null),l._29(603979776,1,{options:1}),l._29(603979776,2,{optionGroups:1}),l._29(335544320,3,{customTrigger:0}),l._25(131072,De.i,[De.j,l.h]),l._8(17,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,1,["\n "])),(n()(),l._4(16777216,null,1,1,null,zg)),l._8(20,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,1,["\n "])),(n()(),l._9(22,0,null,0,11,"mat-select-trigger",[],null,null,null,null,null)),l._8(23,16384,[[3,4]],0,Lu,[],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Ug)),l._8(26,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Gg)),l._8(29,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Kg)),l._8(32,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,1,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Xg)),l._8(37,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,1,0,e.form),n(t,8,0,n(t,9,0,!e.transactions||0===e.transactions.length)),n(t,10,0,"filter"),n(t,12,0,l._32(t,12,0,l._22(t,16).transform("history.no-filter")),"","filter"),n(t,20,0,e.wallets),n(t,26,0,1===e.form.get("filter").value.length),n(t,29,0,e.form.get("filter").value.length>1),n(t,32,0,e.form.get("filter").value),n(t,37,0,e.form.get("filter").value.length>0)},function(n,t){n(t,0,0,l._22(t,3).ngClassUntouched,l._22(t,3).ngClassTouched,l._22(t,3).ngClassPristine,l._22(t,3).ngClassDirty,l._22(t,3).ngClassValid,l._22(t,3).ngClassInvalid,l._22(t,3).ngClassPending),n(t,5,1,[l._22(t,12).id,l._22(t,12).tabIndex,l._22(t,12)._ariaLabel,l._22(t,12).ariaLabelledby,l._22(t,12).required.toString(),l._22(t,12).disabled.toString(),l._22(t,12).errorState,l._22(t,12).panelOpen?l._22(t,12)._optionIds:null,l._22(t,12).multiple,l._22(t,12)._ariaDescribedby||null,l._22(t,12)._getAriaActiveDescendant(),l._22(t,12).disabled,l._22(t,12).errorState,l._22(t,12).required,l._22(t,17).ngClassUntouched,l._22(t,17).ngClassTouched,l._22(t,17).ngClassPristine,l._22(t,17).ngClassDirty,l._22(t,17).ngClassValid,l._22(t,17).ngClassInvalid,l._22(t,17).ngClassPending])})}function $g(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-loading-content",[],null,null,null,Fg,Rg)),l._8(1,49152,null,0,Ig,[],{isLoading:[0,"isLoading"],noDataText:[1,"noDataText"]},null)],function(n,t){var e=t.component;n(t,1,0,!e.allTransactions,e.allTransactions&&0!==e.allTransactions.length?"history.no-txs-filter":"history.no-txs")},null)}function ny(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"h4",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n "," ","\n "])),l._25(131072,De.i,[De.j,l.h]),l._25(0,l_,[gf]),(n()(),l._9(4,0,null,null,2,"span",[["class","-timestamp"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._27(6,1),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("history.sent")),l._32(t,1,1,l._22(t,3).transform("coin"))),n(t,5,0,l._32(t,5,0,n(t,6,0,l._22(t.parent.parent.parent.parent,0),t.parent.parent.context.$implicit.timestamp)))})}function ty(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"h4",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n "," ","\n "])),l._25(131072,De.i,[De.j,l.h]),l._25(0,l_,[gf]),(n()(),l._9(4,0,null,null,2,"span",[["class","-pending"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("history.sending")),l._32(t,1,1,l._22(t,3).transform("coin"))),n(t,5,0,l._32(t,5,0,l._22(t,6).transform("history.pending")))})}function ey(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"h4",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n "," ","\n "])),l._25(131072,De.i,[De.j,l.h]),l._25(0,l_,[gf]),(n()(),l._9(4,0,null,null,2,"span",[["class","-timestamp"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._27(6,1),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("history.received")),l._32(t,1,1,l._22(t,3).transform("coin"))),n(t,5,0,l._32(t,5,0,n(t,6,0,l._22(t.parent.parent.parent.parent,0),t.parent.parent.context.$implicit.timestamp)))})}function ly(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"h4",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n "," ","\n "])),l._25(131072,De.i,[De.j,l.h]),l._25(0,l_,[gf]),(n()(),l._9(4,0,null,null,2,"span",[["class","-pending"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("history.receiving")),l._32(t,1,1,l._22(t,3).transform("coin"))),n(t,5,0,l._32(t,5,0,l._22(t,6).transform("history.pending")))})}function ry(n){return l._33(0,[(n()(),l._9(0,0,null,null,13,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,ny)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,ty)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,ey)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,ly)),l._8(12,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,3,0,t.parent.context.$implicit.balance.isLessThan(0)&&t.parent.context.$implicit.confirmed),n(t,6,0,t.parent.context.$implicit.balance.isLessThan(0)&&!t.parent.context.$implicit.confirmed),n(t,9,0,t.parent.context.$implicit.balance.isGreaterThan(0)&&t.parent.context.$implicit.confirmed),n(t,12,0,t.parent.context.$implicit.balance.isGreaterThan(0)&&!t.parent.context.$implicit.confirmed)},null)}function iy(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"h4",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n "," ","\n "])),l._25(131072,De.i,[De.j,l.h]),l._25(0,l_,[gf]),(n()(),l._9(4,0,null,null,2,"span",[["class","-timestamp"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._27(6,1),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("history.moved")),l._32(t,1,1,l._22(t,3).transform("coin"))),n(t,5,0,l._32(t,5,0,n(t,6,0,l._22(t.parent.parent.parent.parent,0),t.parent.parent.context.$implicit.timestamp)))})}function oy(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"h4",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n "," ","\n "])),l._25(131072,De.i,[De.j,l.h]),l._25(0,l_,[gf]),(n()(),l._9(4,0,null,null,2,"span",[["class","-pending"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("history.moving")),l._32(t,1,1,l._22(t,3).transform("coin"))),n(t,5,0,l._32(t,5,0,l._22(t,6).transform("history.pending")))})}function sy(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,iy)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,oy)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,3,0,t.parent.context.$implicit.confirmed),n(t,6,0,!t.parent.context.$implicit.confirmed)},null)}function ay(n){return l._33(0,[(n()(),l._9(0,0,null,null,6,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,0,"img",[["class","qr-code-button"],["src","../../../../assets/img/qr-code-black.png"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.showQrCode(e,n.context.$implicit)&&l),l},null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,1,"span",[],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,5,0,t.context.$implicit)})}function uy(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,4,"span",[],null,null,null,null,null)),(n()(),l._31(3,null,["",": "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(5,0,null,null,1,"span",[["class","note"]],null,null,null,null,null)),(n()(),l._31(6,null,["",""])),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,3,0,l._32(t,3,0,l._22(t,4).transform("history.note"))),n(t,6,0,t.parent.context.$implicit.note)})}function cy(n){return l._33(0,[(n()(),l._9(0,16777216,null,null,7,"p",[],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,1).show()&&r),"keydown"===t&&(r=!1!==l._22(n,1)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,1).hide(1500)&&r),r},null,null)),l._8(1,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(3,null,["\n ",""])),l._27(4,4),(n()(),l._9(5,0,null,null,1,"span",[],null,null,null,null,null)),(n()(),l._31(-1,null,["*"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(0,null,null,0))],function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("tx.current-rate")))},function(n,t){var e=t.component;n(t,3,0,l._32(t,3,0,n(t,4,0,l._22(t.parent.parent.parent,1),t.parent.context.$implicit.balance*e.price,"USD","symbol","1.2-2")))})}function dy(n){return l._33(0,[(n()(),l._9(0,0,null,null,36,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,33,"div",[["class","-transaction"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.showTransaction(n.context.$implicit)&&l),l},null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,5,"div",[["class","-icon"]],null,null,null,null,null)),l._8(5,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(6,{"-incoming":0,"-pending":1}),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,0,"img",[["src","/assets/img/send-blue.png"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(11,0,null,null,13,"div",[["class","-address"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,ry)),l._8(14,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,sy)),l._8(17,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,ay)),l._8(20,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,uy)),l._8(23,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(26,0,null,null,8,"div",[["class","-balance"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(28,0,null,null,2,"h4",[],null,null,null,null,null)),(n()(),l._31(29,null,["",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,cy)),l._8(33,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,5,0,"-icon",n(t,6,0,t.context.$implicit.balance.isGreaterThan(0)&&!t.context.$implicit.coinsMovedInternally,!t.context.$implicit.confirmed)),n(t,14,0,!t.context.$implicit.coinsMovedInternally),n(t,17,0,t.context.$implicit.coinsMovedInternally),n(t,20,0,t.context.$implicit.addresses),n(t,23,0,t.context.$implicit.note),n(t,33,0,e.price)},function(n,t){n(t,29,0,l._32(t,29,0,l._22(t,30).transform(t.context.$implicit.balance.toString())))})}function hy(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"div",[["class","-paper"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,dy)),l._8(3,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,3,0,t.component.transactions)},null)}function py(n){return l._33(0,[l._25(0,ag,[]),l._25(0,ln,[l.w]),(n()(),l._9(2,0,null,null,2,"app-header",[],null,null,null,K_,D_)),l._8(3,245760,null,0,P_,[gf,nf,qc,rf,Sc],{headline:[0,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n"])),(n()(),l._9(6,0,null,null,10,"div",[["class","container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Zg)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,$g)),l._8(12,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,hy)),l._8(15,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,3,0,l._32(t,3,0,l._22(t,4).transform("title.transactions"))),n(t,9,0,e.allTransactions),n(t,12,0,!e.transactions||0===e.transactions.length),n(t,15,0,e.transactions&&e.transactions.length>0)},null)}var fy=l._5("app-transaction-list",sf,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-transaction-list",[],null,null,null,py,Bg)),l._8(1,245760,null,0,sf,[fa,rf,Sc,ns,Ch],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]),_y=function(){function n(){this.statuses=["done","waiting_confirm","waiting_deposit","waiting_send"]}return n.prototype.transform=function(n){return this.statuses.find(function(t){return t===n})?"teller."+n.replace("_","-"):"teller.unknown"},n}(),my=l._7({encapsulation:0,styles:[[".-background-container[_ngcontent-%COMP%]{background-color:#fbfbfb;padding-top:30px;max-width:100%;min-height:calc(100% - 190px);overflow:hidden;position:relative}.-background-image[_ngcontent-%COMP%]{display:none}@media (min-width:768px){.-background-image[_ngcontent-%COMP%]{display:block;left:50%;width:80%;position:absolute;top:0}}@media (min-width:992px){.-background-image[_ngcontent-%COMP%]{left:40%;width:90%;max-width:850px}}@media (min-width:1200px){.-background-image[_ngcontent-%COMP%]{left:40%;width:80%;max-width:850px}}.-paper[_ngcontent-%COMP%]{background-color:#fbfbfb;border-radius:10px;-webkit-box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);padding:30px;position:relative;margin-top:30px;max-width:540px;z-index:5}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;margin-bottom:30px}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-number[_ngcontent-%COMP%]{width:60px}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-number[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{border-radius:50%;color:#fff;display:inline-block;font-size:16px;font-weight:700;height:40px;line-height:46px;text-align:center;width:40px}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%]{-webkit-box-flex:1;-ms-flex:1 1;flex:1 1}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] button{margin-left:0}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{color:#1e2227;font-size:16px;font-weight:700;margin:0;line-height:46px}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:rgba(30,34,39,.8);font-size:14px;font-weight:300;line-height:20px;margin-top:0}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%], .-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] .-status[_ngcontent-%COMP%]{background-color:#fff;border:2px solid rgba(0,0,0,.05);border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;color:rgba(30,34,39,.8);display:block;font-size:14px;line-height:20px;margin-bottom:15px;padding:10px;width:100%}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] .-coins[_ngcontent-%COMP%]{color:#0072ff}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] .form-field[_ngcontent-%COMP%]{margin-bottom:15px}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] .-subtitle[_ngcontent-%COMP%]{color:#8c8e90;font-size:12px;line-height:18px;font-weight:300;opacity:.8}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] .-wallet[_ngcontent-%COMP%]{color:rgba(30,34,39,.8);font-size:14px}"]],data:{}});function gy(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"option",[],null,null,null,null,null)),l._8(1,147456,null,0,mo,[l.l,l.G,[2,_o]],{value:[0,"value"]},null),l._8(2,147456,null,0,bo,[l.l,l.G,[8,null]],{value:[0,"value"]},null),(n()(),l._31(3,null,["\n "," - "])),(n()(),l._9(4,0,null,null,2,"span",[["class","-coins"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,1,0,t.context.$implicit.filename),n(t,2,0,t.context.$implicit.filename)},function(n,t){n(t,3,0,t.context.$implicit.label),n(t,5,0,l._32(t,5,0,l._22(t,6).transform(t.context.$implicit.coins)))})}function yy(n){return l._33(0,[(n()(),l._9(0,0,null,null,26,"div",[["class","-step"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,4,"div",[["class","-number"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,1,"span",[["class","primary-gradient-background"]],null,null,null,null,null)),(n()(),l._31(-1,null,["2"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,17,"div",[["class","-instructions flex-fill"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,2,"h3",[],null,null,null,null,null)),(n()(),l._31(11,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,3,"p",[],null,null,null,null,null)),(n()(),l._31(15,null,["",""])),l._26(16,{rate:0}),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(19,0,null,null,1,"span",[["class","-address"]],null,null,null,null,null)),(n()(),l._31(20,null,["\n ","\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(22,0,null,null,2,"span",[["class","-subtitle"]],null,null,null,null,null)),(n()(),l._31(23,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){var e=t.component;n(t,11,0,l._32(t,11,0,l._22(t,12).transform("buy.send"))),n(t,15,0,l._32(t,15,0,l._22(t,17).transform("buy.send-desc",n(t,16,0,e.config.sky_btc_exchange_rate)))),n(t,20,0,e.order.deposit_address),n(t,23,0,l._32(t,23,0,l._22(t,24).transform("buy.fraction-warning")))})}function by(n){return l._33(0,[(n()(),l._9(0,0,null,null,34,"div",[["class","-step"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,4,"div",[["class","-number"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,1,"span",[["class","primary-gradient-background"]],null,null,null,null,null)),(n()(),l._31(-1,null,["3"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,25,"div",[["class","-instructions flex-fill"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,2,"h3",[],null,null,null,null,null)),(n()(),l._31(11,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,2,"p",[],null,null,null,null,null)),(n()(),l._31(15,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(18,0,null,null,4,"span",[["class","-status"]],null,null,null,null,null)),(n()(),l._31(19,null,["\n "," ","\n "])),l._25(131072,De.i,[De.j,l.h]),l._27(21,1),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(24,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.checkStatus()&&l),l},w_,g_)),l._8(25,49152,[[1,4],["button",4]],0,Lc,[],null,{action:"action"}),(n()(),l._31(26,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(29,0,null,null,3,"app-button",[],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.removeOrder()&&l),l},w_,g_)),l._8(30,49152,[[1,4],["button",4]],0,Lc,[],null,{action:"action"}),(n()(),l._31(31,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){var e=t.component;n(t,11,0,l._32(t,11,0,l._22(t,12).transform("buy.receive"))),n(t,15,0,l._32(t,15,0,l._22(t,16).transform("buy.receive-desc"))),n(t,19,0,l._32(t,19,0,l._22(t,20).transform("buy.status-button")),l._32(t,19,1,l._22(t,22).transform(l._32(t,19,1,n(t,21,0,l._22(t.parent.parent,0),e.order.status))))),n(t,26,0,l._32(t,26,0,l._22(t,27).transform("buy.check-status-button"))),n(t,31,0,l._32(t,31,0,l._22(t,32).transform("buy.new-order-button")))})}function vy(n){return l._33(0,[(n()(),l._9(0,0,null,null,59,"div",[["class","-paper"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,1).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,1).onReset()&&r),r},null,null)),l._8(1,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(3,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,47,"div",[["class","-step"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(7,0,null,null,4,"div",[["class","-number"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(9,0,null,null,1,"span",[["class","primary-gradient-background"]],null,null,null,null,null)),(n()(),l._31(-1,null,["1"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(13,0,null,null,38,"div",[["class","-instructions flex-fill"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(15,0,null,null,2,"h3",[],null,null,null,null,null)),(n()(),l._31(16,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(19,0,null,null,2,"p",[],null,null,null,null,null)),(n()(),l._31(20,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(23,0,null,null,23,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(25,0,null,null,20,"div",[["class","-select"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(27,0,null,null,17,"select",[["class","-wallet"],["formControlName","wallet"],["id","wallet"],["required",""]],[[1,"required",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"change"],[null,"blur"]],function(n,t,e){var r=!0;return"change"===t&&(r=!1!==l._22(n,28).onChange(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,28).onTouched()&&r),r},null,null)),l._8(28,16384,null,0,_o,[l.G,l.l],null,null),l._8(29,16384,null,0,Zo,[],{required:[0,"required"]},null),l._28(1024,null,Qi,function(n){return[n]},[Zo]),l._28(1024,null,to,function(n){return[n]},[_o]),l._8(32,671744,null,0,Xo,[[3,qi],[2,Qi],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(34,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(36,0,null,null,4,"option",[["disabled",""],["selected",""]],null,null,null,null,null)),l._8(37,147456,null,0,mo,[l.l,l.G,[2,_o]],null,null),l._8(38,147456,null,0,bo,[l.l,l.G,[8,null]],null,null),(n()(),l._31(39,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,gy)),l._8(43,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(48,0,null,null,2,"span",[["class","-subtitle"]],null,null,null,null,null)),(n()(),l._31(49,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,yy)),l._8(55,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,by)),l._8(58,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,1,0,e.form),n(t,29,0,""),n(t,32,0,"wallet"),n(t,43,0,e.wallets),n(t,55,0,e.order),n(t,58,0,e.order)},function(n,t){n(t,0,0,l._22(t,3).ngClassUntouched,l._22(t,3).ngClassTouched,l._22(t,3).ngClassPristine,l._22(t,3).ngClassDirty,l._22(t,3).ngClassValid,l._22(t,3).ngClassInvalid,l._22(t,3).ngClassPending),n(t,16,0,l._32(t,16,0,l._22(t,17).transform("buy.deposit-location"))),n(t,20,0,l._32(t,20,0,l._22(t,21).transform("buy.deposit-location-desc"))),n(t,27,0,l._22(t,29).required?"":null,l._22(t,34).ngClassUntouched,l._22(t,34).ngClassTouched,l._22(t,34).ngClassPristine,l._22(t,34).ngClassDirty,l._22(t,34).ngClassValid,l._22(t,34).ngClassInvalid,l._22(t,34).ngClassPending),n(t,39,0,l._32(t,39,0,l._22(t,40).transform("buy.make-choice"))),n(t,49,0,l._32(t,49,0,l._22(t,50).transform("buy.wallets-desc")))})}function wy(n){return l._33(0,[l._25(0,_y,[]),l._29(671088640,1,{button:0}),(n()(),l._9(2,0,null,null,1,"app-header",[],null,null,null,K_,D_)),l._8(3,245760,null,0,P_,[gf,nf,qc,rf,Sc],null,null),(n()(),l._31(-1,null,["\n"])),(n()(),l._9(5,0,null,null,9,"div",[["class","-background-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(7,0,null,null,6,"div",[["class","container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,vy)),l._8(10,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,0,"img",[["class","-background-image"],["src","../../../../assets/img/otc-background.jpg"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,3,0),n(t,10,0,e.config)},null)}var xy=l._5("app-buy",lf,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-buy",[],null,null,null,wy,my)),l._8(1,245760,null,0,lf,[ns,ef,jc,Sc],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]);o.a.merge=Jr.a;var My=function(){function n(n,t,e,r,i,o,s){this.exchangeService=n,this.walletService=t,this.formBuilder=e,this.msgBarService=r,this.dialog=i,this.blockchainService=o,this.translateService=s,this.defaultFromCoin="BTC",this.defaultFromAmount="0.1",this.toCoin="SKY",this.submitted=new l.o,this.problemGettingPairs=!1,this.agreement=!1,this.subscriptionsGroup=[]}return Object.defineProperty(n.prototype,"toAmount",{get:function(){if(!this.activeTradingPair)return 0;var n=this.form.get("fromAmount").value;return isNaN(n)?0:(this.form.get("fromAmount").value*this.activeTradingPair.price).toFixed(this.blockchainService.currentMaxDecimals)},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"sendAmount",{get:function(){var n=this.form.get("fromAmount").value;return isNaN(parseFloat(n))?0:n},enumerable:!0,configurable:!0}),n.prototype.ngOnInit=function(){this.createForm(),this.loadData()},n.prototype.ngOnDestroy=function(){this.subscriptionsGroup.forEach(function(n){return n.unsubscribe()}),this.removeExchangeSubscription(),this.msgBarService.hide(),this.priceUpdateSubscription&&this.priceUpdateSubscription.unsubscribe()},n.prototype.setAgreement=function(n){this.agreement=n.checked,this.form.updateValueAndValidity()},n.prototype.selectAddress=function(){var n=this,t=new oa;t.width="566px",t.autoFocus=!1,this.dialog.open(Rm,t).afterClosed().subscribe(function(t){t&&n.form.get("toAddress").setValue(t)})},n.prototype.exchange=function(){var n=this;if(this.form.valid&&!this.exchangeButton.isLoading()){this.msgBarService.hide(),this.exchangeButton.resetState(),this.exchangeButton.setLoading(),this.exchangeButton.setDisabled();var t=parseFloat(this.form.get("fromAmount").value),e=this.form.get("toAddress").value.trim();this.removeExchangeSubscription(),this.exchangeSubscription=this.walletService.verifyAddress(e).subscribe(function(l){l?n.exchangeSubscription=n.exchangeService.exchange(n.activeTradingPair.pair,t,e,n.activeTradingPair.price).subscribe(function(t){n.submitted.emit({id:t.id,pair:t.pair,fromAmount:t.fromAmount,toAmount:t.toAmount,address:t.toAddress,timestamp:zp().unix(),price:n.activeTradingPair.price})},function(t){n.exchangeButton.resetState(),n.exchangeButton.setEnabled(),n.msgBarService.showError(t)}):n.showInvalidAddress()},function(){n.showInvalidAddress()})}},n.prototype.showInvalidAddress=function(){this.exchangeButton.resetState(),this.exchangeButton.setEnabled();var n=this.translateService.instant("exchange.invalid-address");this.msgBarService.showError(n)},n.prototype.createForm=function(){var n=this;this.form=this.formBuilder.group({fromCoin:[this.defaultFromCoin,Xi.required],fromAmount:[this.defaultFromAmount,Xi.required],toAddress:["",Xi.required]},{validator:this.validate.bind(this)}),this.subscriptionsGroup.push(this.form.get("fromCoin").valueChanges.subscribe(function(){n.updateActiveTradingPair()}))},n.prototype.loadData=function(){var n=this;this.subscriptionsGroup.push(this.exchangeService.tradingPairs().retryWhen(function(n){return n.delay(2e3).take(10).concat(o.a.throw(""))}).subscribe(function(t){n.tradingPairs=[],t.forEach(function(t){t.to===n.toCoin&&n.tradingPairs.push(t)}),n.updateActiveTradingPair(),n.updatePrices()},function(){n.problemGettingPairs=!0}))},n.prototype.updatePrices=function(){var n=this;this.priceUpdateSubscription=o.a.of(1).delay(6e4).flatMap(function(){return n.exchangeService.tradingPairs()}).retryWhen(function(n){return n.delay(6e4)}).subscribe(function(t){t.forEach(function(t){if(t.to===n.toCoin){var e=n.tradingPairs.find(function(n){return n.from===t.from});e&&(e.price=t.price)}}),n.updatePrices()})},n.prototype.updateActiveTradingPair=function(){var n=this;this.activeTradingPair=this.tradingPairs.find(function(t){return t.from===n.form.get("fromCoin").value}),!this.activeTradingPair&&this.tradingPairs.length>0&&(this.activeTradingPair=this.tradingPairs[0],this.form.get("fromCoin").setValue(this.activeTradingPair.from))},n.prototype.validate=function(n){if(!n||!this.activeTradingPair)return null;var t=n.get("fromAmount").value;if(isNaN(t))return{invalid:!0};if(tthis.activeTradingPair.max)return{max:this.activeTradingPair.max};var e=t.split(".");return e.length>1&&e[1].length>6?{decimals:!0}:this.agreement?null:{agreement:!0}},n.prototype.removeExchangeSubscription=function(){this.exchangeSubscription&&this.exchangeSubscription.unsubscribe()},n}(),ky=l._7({encapsulation:0,styles:[[".-create[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex}.-create[_ngcontent-%COMP%] .-form[_ngcontent-%COMP%]{-webkit-box-flex:.6;-ms-flex:.6;flex:.6}.-create[_ngcontent-%COMP%] .-info[_ngcontent-%COMP%]{-webkit-box-flex:.4;-ms-flex:.4;flex:.4;margin-left:40px;margin-top:5px}.form-field[_ngcontent-%COMP%]{width:100%}.form-field[_ngcontent-%COMP%] .-error[_ngcontent-%COMP%]{color:#ff004e;margin-left:20px}.form-field[_ngcontent-%COMP%] .-inputs[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex}.form-field[_ngcontent-%COMP%] .-inputs[_ngcontent-%COMP%] input[_ngcontent-%COMP%]{-webkit-box-flex:.7;-ms-flex:.7;flex:.7;border-top-right-radius:0;border-bottom-right-radius:0}.form-field[_ngcontent-%COMP%] .-inputs[_ngcontent-%COMP%] .-input[_ngcontent-%COMP%], .form-field[_ngcontent-%COMP%] .-inputs[_ngcontent-%COMP%] .-select[_ngcontent-%COMP%]{-webkit-box-flex:.3;-ms-flex:.3;flex:.3}.form-field[_ngcontent-%COMP%] .-inputs[_ngcontent-%COMP%] .-input[_ngcontent-%COMP%] input[_ngcontent-%COMP%], .form-field[_ngcontent-%COMP%] .-inputs[_ngcontent-%COMP%] .-input[_ngcontent-%COMP%] select[_ngcontent-%COMP%], .form-field[_ngcontent-%COMP%] .-inputs[_ngcontent-%COMP%] .-select[_ngcontent-%COMP%] input[_ngcontent-%COMP%], .form-field[_ngcontent-%COMP%] .-inputs[_ngcontent-%COMP%] .-select[_ngcontent-%COMP%] select[_ngcontent-%COMP%]{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.form-field[_ngcontent-%COMP%] .-not-allowed[_ngcontent-%COMP%] input[_ngcontent-%COMP%]{cursor:not-allowed}.-item[_ngcontent-%COMP%]{font-size:13px}.-item[_ngcontent-%COMP%]:not(:last-child){margin-bottom:20px}.-item[_ngcontent-%COMP%] .-key[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);margin-bottom:5px}.-item[_ngcontent-%COMP%] .-value[_ngcontent-%COMP%]{word-break:break-all}.-buttons[_ngcontent-%COMP%]{text-align:center}.-buttons[_ngcontent-%COMP%] mat-checkbox[_ngcontent-%COMP%]{margin-right:20px}.-check[_ngcontent-%COMP%] .mat-checkbox-layout{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.-check[_ngcontent-%COMP%] .mat-checkbox-checkmark-path{position:absolute;width:18px;height:8px;left:4.59px;top:9px;stroke:#0072ff!important}.-check[_ngcontent-%COMP%] .mat-checkbox-background, .-check[_ngcontent-%COMP%] .mat-checkbox-frame{top:0;left:0;right:0;bottom:0;position:absolute;-webkit-box-sizing:border-box;box-sizing:border-box;pointer-events:none;width:20px;height:20px;background:rgba(30,34,39,.05);border-radius:6px;border-color:transparent}.-check[_ngcontent-%COMP%] span{font-family:Skycoin;line-height:normal;font-size:13px;color:#1e2227}.-check[_ngcontent-%COMP%] span a{color:#0072ff;text-decoration:none}.-select-address[_ngcontent-%COMP%]{padding-left:5px;color:#0072ff;cursor:pointer}.-select-address[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{color:#0072ff;padding:0;display:inline;vertical-align:middle;font-size:13px}"]],data:{}});function Cy(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-loading-content",[],null,null,null,Fg,Rg)),l._8(1,49152,null,0,Ig,[],{isLoading:[0,"isLoading"],noDataText:[1,"noDataText"]},null)],function(n,t){var e=t.component;n(t,1,0,!e.tradingPairs&&!e.problemGettingPairs,e.problemGettingPairs?"exchange.problem-connecting":"exchange.offline")},null)}function Sy(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"span",[["class","-error"]],null,null,null,null,null)),(n()(),l._31(1,null,["\n "," ","\n "])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){var e=t.component;n(t,1,0,l._32(t,1,0,l._22(t,2).transform("exchange.min-amount")),e.form.getError("min"))})}function Oy(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"span",[["class","-error"]],null,null,null,null,null)),(n()(),l._31(1,null,["\n "," ","\n "])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){var e=t.component;n(t,1,0,l._32(t,1,0,l._22(t,2).transform("exchange.max-amount")),e.form.getError("max"))})}function Ty(n){return l._33(0,[(n()(),l._9(0,0,null,null,3,"option",[],null,null,null,null,null)),l._8(1,147456,null,0,mo,[l.l,l.G,[2,_o]],{value:[0,"value"]},null),l._8(2,147456,null,0,bo,[l.l,l.G,[8,null]],{value:[0,"value"]},null),(n()(),l._31(3,null,["",""]))],function(n,t){n(t,1,0,t.context.$implicit.from),n(t,2,0,t.context.$implicit.from)},function(n,t){n(t,3,0,t.context.$implicit.from)})}function Ly(n){return l._33(0,[(n()(),l._9(0,0,null,null,52,"div",[["class","-info"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,8,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,1,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(9,null,[""," ",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(12,0,null,null,8,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(15,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(18,0,null,null,1,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(19,null,["\u2248 "," ",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(22,0,null,null,9,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(24,0,null,null,3,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(25,null,["",""])),l._26(26,{coin:0}),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(29,0,null,null,1,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(30,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(33,0,null,null,8,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(35,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(36,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(39,0,null,null,1,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(40,null,["1 "," \u2248 "," ",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(43,0,null,null,8,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(45,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(46,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(49,0,null,null,1,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\u2248 15 minutes"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){var e=t.component;n(t,5,0,l._32(t,5,0,l._22(t,6).transform("exchange.you-send"))),n(t,9,0,e.sendAmount,e.form.get("fromCoin").value),n(t,15,0,l._32(t,15,0,l._22(t,16).transform("exchange.you-get"))),n(t,19,0,e.toAmount,e.toCoin),n(t,25,0,l._32(t,25,0,l._22(t,27).transform("exchange.to-address",n(t,26,0,e.toCoin)))),n(t,30,0,e.form.get("toAddress").value||"-"),n(t,36,0,l._32(t,36,0,l._22(t,37).transform("exchange.price"))),n(t,40,0,e.form.get("fromCoin").value,e.activeTradingPair.price.toFixed(6),e.toCoin),n(t,46,0,l._32(t,46,0,l._22(t,47).transform("exchange.time-15")))})}function Py(n){return l._33(0,[(n()(),l._9(0,0,null,null,113,"div",[["class","-create"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,107,"div",[["class","-form"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,3).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,3).onReset()&&r),r},null,null)),l._8(3,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(5,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(7,0,null,null,35,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(9,0,null,null,8,"label",[["for","fromAmount"]],null,null,null,null,null)),(n()(),l._31(10,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._4(16777216,null,null,1,null,Sy)),l._8(13,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Oy)),l._8(16,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(19,0,null,null,22,"div",[["class","-inputs"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(21,0,null,null,5,"input",[["formControlName","fromAmount"],["id","fromAmount"],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,22)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,22).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,22)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,22)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(22,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(24,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(26,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(28,0,null,null,12,"div",[["class","-select"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(30,0,null,null,9,"select",[["formControlName","fromCoin"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"change"],[null,"blur"]],function(n,t,e){var r=!0;return"change"===t&&(r=!1!==l._22(n,31).onChange(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,31).onTouched()&&r),r},null,null)),l._8(31,16384,null,0,_o,[l.G,l.l],null,null),l._28(1024,null,to,function(n){return[n]},[_o]),l._8(33,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(35,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Ty)),l._8(38,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(44,0,null,null,15,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(46,0,null,null,2,"label",[["for","toAmount"]],null,null,null,null,null)),(n()(),l._31(47,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(50,0,null,null,8,"div",[["class","-inputs -not-allowed"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(52,0,null,null,0,"input",[["id","toAmount"],["readonly",""],["type","text"]],[[8,"value",0]],null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(54,0,null,null,3,"div",[["class","-input"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(56,0,null,null,0,"input",[["readonly",""],["type","text"]],[[8,"value",0]],null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(61,0,null,null,24,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(63,0,null,null,14,"label",[["for","toAddress"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(65,0,null,null,3,"span",[],null,null,null,null,null)),(n()(),l._31(66,null,["",""])),l._26(67,{coin:0}),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(70,0,null,null,6,"span",[["class","-select-address"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.selectAddress()&&l),l},null,null)),(n()(),l._31(71,null,["\n "," "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(73,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(74,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["keyboard_arrow_down"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(79,0,null,null,5,"input",[["formControlName","toAddress"],["id","toAddress"],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,80)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,80).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,80)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,80)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(80,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(82,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(84,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(87,0,null,null,21,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(89,0,null,null,13,"mat-checkbox",[["class","-check mat-checkbox"],["type","checkbox"]],[[8,"id",0],[2,"mat-checkbox-indeterminate",null],[2,"mat-checkbox-checked",null],[2,"mat-checkbox-disabled",null],[2,"mat-checkbox-label-before",null]],[[null,"change"]],function(n,t,e){var l=!0;return"change"===t&&(l=!1!==n.component.setAgreement(e)&&l),l},Ym,Em)),l._28(5120,null,to,function(n){return[n]},[ta]),l._8(91,4374528,null,0,ta,[l.l,l.h,Rr,[8,null],[2,Zs]],null,{change:"change"}),(n()(),l._31(92,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(94,0,null,0,2,"a",[["href","https://swaplab.cc/terms"],["rel","noreferrer nofollow"],["target","_blank"]],null,null,null,null,null)),(n()(),l._31(95,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(97,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(99,0,null,0,2,"a",[["href","https://swaplab.cc/privacy"],["rel","noreferrer nofollow"],["target","_blank"]],null,null,null,null,null)),(n()(),l._31(100,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(104,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.exchange()&&l),l},w_,g_)),l._8(105,49152,[[1,4],["exchangeButton",4]],0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(106,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,Ly)),l._8(112,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,3,0,e.form),n(t,13,0,e.form.hasError("min")),n(t,16,0,e.form.hasError("max")),n(t,24,0,"fromAmount"),n(t,33,0,"fromCoin"),n(t,38,0,e.tradingPairs),n(t,74,0),n(t,82,0,"toAddress"),n(t,105,0,!e.form.valid),n(t,112,0,e.activeTradingPair)},function(n,t){var e=t.component;n(t,2,0,l._22(t,5).ngClassUntouched,l._22(t,5).ngClassTouched,l._22(t,5).ngClassPristine,l._22(t,5).ngClassDirty,l._22(t,5).ngClassValid,l._22(t,5).ngClassInvalid,l._22(t,5).ngClassPending),n(t,10,0,l._32(t,10,0,l._22(t,11).transform("exchange.you-send"))),n(t,21,0,l._22(t,26).ngClassUntouched,l._22(t,26).ngClassTouched,l._22(t,26).ngClassPristine,l._22(t,26).ngClassDirty,l._22(t,26).ngClassValid,l._22(t,26).ngClassInvalid,l._22(t,26).ngClassPending),n(t,30,0,l._22(t,35).ngClassUntouched,l._22(t,35).ngClassTouched,l._22(t,35).ngClassPristine,l._22(t,35).ngClassDirty,l._22(t,35).ngClassValid,l._22(t,35).ngClassInvalid,l._22(t,35).ngClassPending),n(t,47,0,l._32(t,47,0,l._22(t,48).transform("exchange.you-get"))),n(t,52,0,e.toAmount),n(t,56,0,e.toCoin),n(t,66,0,l._32(t,66,0,l._22(t,68).transform("exchange.to-address",n(t,67,0,e.toCoin)))),n(t,71,0,l._32(t,71,0,l._22(t,72).transform("exchange.select"))),n(t,79,0,l._22(t,84).ngClassUntouched,l._22(t,84).ngClassTouched,l._22(t,84).ngClassPristine,l._22(t,84).ngClassDirty,l._22(t,84).ngClassValid,l._22(t,84).ngClassInvalid,l._22(t,84).ngClassPending),n(t,89,0,l._22(t,91).id,l._22(t,91).indeterminate,l._22(t,91).checked,l._22(t,91).disabled,"before"==l._22(t,91).labelPosition),n(t,92,0,l._32(t,92,0,l._22(t,93).transform("exchange.agree-1"))),n(t,95,0,l._32(t,95,0,l._22(t,96).transform("exchange.agree-2"))),n(t,97,0,l._32(t,97,0,l._22(t,98).transform("exchange.agree-3"))),n(t,100,0,l._32(t,100,0,l._22(t,101).transform("exchange.agree-4"))),n(t,106,0,l._32(t,106,0,l._22(t,107).transform("exchange.exchange-button")))})}function Dy(n){return l._33(0,[l._29(671088640,1,{exchangeButton:0}),(n()(),l._4(16777216,null,null,1,null,Cy)),l._8(2,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n"])),(n()(),l._4(16777216,null,null,1,null,Py)),l._8(5,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,!e.activeTradingPair),n(t,5,0,e.activeTradingPair)},null)}var Ay=this&&this.__assign||Object.assign||function(n){for(var t,e=1,l=arguments.length;e .-img[_ngcontent-%COMP%]{width:17px;margin-right:15px}.-item[_ngcontent-%COMP%]{font-size:13px}.-item[_ngcontent-%COMP%]:not(:last-child){margin-bottom:20px}.-item[_ngcontent-%COMP%] .-key[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);margin-bottom:5px}.-item[_ngcontent-%COMP%] .-value[_ngcontent-%COMP%]{word-break:break-all}.-item[_ngcontent-%COMP%] .-value[_ngcontent-%COMP%] .info-icon[_ngcontent-%COMP%]{display:inline;font-size:14px;color:rgba(121,135,152,.5);vertical-align:text-bottom}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.-external[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{line-height:13px;height:13px;width:13px;font-size:16px;vertical-align:middle;color:#0072ff;margin-left:10px}.expand[_ngcontent-%COMP%]{color:#0072ff;cursor:pointer;font-size:13px}.expand[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{color:#0072ff;padding:0;display:inline;vertical-align:middle;font-size:13px}.buttons[_ngcontent-%COMP%]{width:100%;text-align:center;margin-top:10px}"]],data:{}});function jy(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-loading-content",[["noDataText","exchange.order-not-found"]],null,null,null,Fg,Rg)),l._8(1,49152,null,0,Ig,[],{isLoading:[0,"isLoading"],noDataText:[1,"noDataText"]},null)],function(n,t){n(t,1,0,!t.component.showError,"exchange.order-not-found")},null)}function Iy(n){return l._33(0,[(n()(),l._9(0,0,null,null,13,"div",[["class","-box"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,0,"img",[["class","qr-code-button -img"],["src","../../../../../assets/img/qr-code-black.png"]],null,[[null,"click"]],function(n,t,e){var l=!0,r=n.component;return"click"===t&&(l=!1!==r.showQrCode(r.order.exchangeTag)&&l),l},null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,8,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(7,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,1,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(11,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){var e=t.component;n(t,7,0,l._32(t,7,0,l._22(t,8).transform("exchange.details.exchange-addr-tag"))),n(t,11,0,e.order.exchangeTag)})}function Ry(n){return l._33(0,[(n()(),l._31(-1,null,["\n "])),(n()(),l._9(1,0,null,null,13,"div",[["class","-box"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(3,0,null,null,0,"div",[["class","-img"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,8,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(7,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(8,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(11,0,null,null,1,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(12,null,[""," ",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(16,0,null,null,13,"div",[["class","-box"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(18,0,null,null,0,"img",[["class","qr-code-button -img"],["src","../../../../../assets/img/qr-code-black.png"]],null,[[null,"click"]],function(n,t,e){var l=!0,r=n.component;return"click"===t&&(l=!1!==r.showQrCode(r.order.exchangeAddress)&&l),l},null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(20,0,null,null,8,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(22,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(23,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(26,0,null,null,1,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(27,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,Iy)),l._8(32,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,32,0,t.component.order.exchangeTag)},function(n,t){var e=t.component;n(t,8,0,l._32(t,8,0,l._22(t,9).transform("exchange.you-send"))),n(t,12,0,e.order.fromAmount,e.fromCoin),n(t,23,0,l._32(t,23,0,l._22(t,24).transform("exchange.details.exchange-addr"))),n(t,27,0,e.order.exchangeAddress)})}function Hy(n){return l._33(0,[(n()(),l._9(0,0,null,null,0,null,null,null,null,null,null,null))],null,null)}function Ny(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Hy)),l._8(3,540672,null,0,H,[l.R],{ngTemplateOutlet:[0,"ngTemplateOutlet"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,3,0,l._22(t.parent,55))},null)}function Fy(n){return l._33(0,[(n()(),l._9(0,0,null,null,20,"div",[["class","-box"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,0,"div",[["class","-img"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,15,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(7,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,8,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(11,null,["\n ","\n "])),(n()(),l._9(12,0,null,null,5,"a",[["class","-external"],["rel","noreferrer nofollow"],["target","_blank"]],[[8,"href",4]],null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(15,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["launch"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,15,0)},function(n,t){var e=t.component;n(t,7,0,l._32(t,7,0,l._22(t,8).transform("exchange.details.tx-id"))),n(t,11,0,e.order.toTx),n(t,12,0,e.appService.explorerUrl+"/transaction/"+e.order.toTx)})}function By(n){return l._33(0,[(n()(),l._9(0,0,null,null,13,"div",[["class","-box"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,0,"div",[["class","-img"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,8,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(7,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,1,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(11,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){var e=t.component;n(t,7,0,l._32(t,7,0,l._22(t,8).transform("exchange.details.error-msg"))),n(t,11,0,e.order.message)})}function Vy(n){return l._33(0,[(n()(),l._9(0,0,null,null,0,null,null,null,null,null,null,null))],null,null)}function Wy(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Vy)),l._8(3,540672,null,0,H,[l.R],{ngTemplateOutlet:[0,"ngTemplateOutlet"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,3,0,l._22(t.parent.parent,55))},null)}function zy(n){return l._33(0,[(n()(),l._9(0,0,null,null,67,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,14,"div",[["class","-box"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,0,"div",[["class","-img"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,9,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(9,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,2,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(13,null,["",""])),l._27(14,1),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,Wy)),l._8(19,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(21,0,null,null,14,"div",[["class","-box"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(23,0,null,null,0,"div",[["class","-img"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(25,0,null,null,9,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(27,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(28,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(31,0,null,null,2,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(32,null,[""," ",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(37,0,null,null,14,"div",[["class","-box"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(39,0,null,null,0,"div",[["class","-img"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(41,0,null,null,9,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(43,0,null,null,3,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(44,null,["",""])),l._26(45,{coin:0}),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(48,0,null,null,1,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(49,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(53,0,null,null,13,"div",[["class","-box"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(55,0,null,null,0,"div",[["class","-img"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(57,0,null,null,8,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(59,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(60,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(63,0,null,null,1,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(64,null,["1 "," \u2248 "," ",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,19,0,e.order.status!==e.statuses[0])},function(n,t){var e=t.component;n(t,9,0,l._32(t,9,0,l._22(t,10).transform("exchange.details.start-date"))),n(t,13,0,l._32(t,13,0,n(t,14,0,l._22(t.parent.parent,0),e._orderDetails.timestamp))),n(t,28,0,l._32(t,28,0,l._22(t,29).transform("exchange.you-get"))),n(t,32,0,l._32(t,32,0,l._22(t,33).transform(e.order.toAmount,!0,"first")),e.toCoin),n(t,44,0,l._32(t,44,0,l._22(t,46).transform("exchange.to-address",n(t,45,0,e.toCoin)))),n(t,49,0,e.order.toAddress),n(t,60,0,l._32(t,60,0,l._22(t,61).transform("exchange.details.initial-price"))),n(t,64,0,e.fromCoin,e._orderDetails.price,e.toCoin)})}function Uy(n){return l._33(0,[(n()(),l._9(0,0,null,null,82,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,31,"div",[["class","-wrapper"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,23,"div",[["class","-status"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,4,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(7,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(8,{"-spin":0}),l._8(9,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(10,0,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,14,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(15,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(18,0,null,null,7,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(19,null,[""," "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(21,16777216,null,null,4,"mat-icon",[["class","info-icon mat-icon"],["role","img"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,23).show()&&r),"keydown"===t&&(r=!1!==l._22(n,23)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,23).hide(1500)&&r),r},Hf,Rf)),l._8(22,638976,null,0,ou,[l.l,eu,[8,null]],null,null),l._8(23,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["help"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(29,0,null,null,3,"span",[],null,null,null,null,null)),(n()(),l._31(30,null,["",""])),l._26(31,{from:0,to:1}),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(35,0,null,null,1,"mat-progress-bar",[["aria-valuemax","100"],["aria-valuemin","0"],["class","mat-progress-bar"],["role","progressbar"]],[[1,"aria-valuenow",0],[1,"mode",0],[2,"mat-primary",null],[2,"mat-accent",null],[2,"mat-warn",null]],null,null,u_,a_)),l._8(36,49152,null,0,Nu,[],{value:[0,"value"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(38,0,null,null,43,"div",[["class","-details"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(40,0,null,null,13,"div",[["class","-box"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(42,0,null,null,0,"div",[["class","-img"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(44,0,null,null,8,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(46,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(47,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(50,0,null,null,1,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(51,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(0,[["fromInfo",2]],null,0,null,Ry)),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,Ny)),l._8(58,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,Fy)),l._8(61,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,By)),l._8(64,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(66,0,null,null,11,"div",[["class","-box"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(68,0,null,null,0,"div",[["class","-img"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(70,0,null,null,6,"span",[["class","expand"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.toggleDetails()&&l),l},null,null)),(n()(),l._31(71,null,["\n "," "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(73,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(74,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(75,0,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,zy)),l._8(80,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,7,0,n(t,8,0,"refresh"===e.statusIcon)),n(t,9,0),n(t,22,0),n(t,23,0,l._32(t,23,0,l._22(t,24).transform(e.translatedStatus.info))),n(t,36,0,e.progress),n(t,58,0,e.order.status===e.statuses[0]),n(t,61,0,e.order.status===e.statuses[5]),n(t,64,0,e.order.status===e.statuses[6]),n(t,74,0),n(t,80,0,e.expanded)},function(n,t){var e=t.component;n(t,10,0,e.statusIcon),n(t,15,0,l._32(t,15,0,l._22(t,16).transform("exchange.status"))),n(t,19,0,l._32(t,19,0,l._22(t,20).transform(e.translatedStatus.text,e.translatedStatus.params))),n(t,30,0,l._32(t,30,0,l._22(t,32).transform("exchange.exchanging",n(t,31,0,e.fromCoin,e.toCoin)))),n(t,35,0,l._22(t,36).value,l._22(t,36).mode,"primary"==l._22(t,36).color,"accent"==l._22(t,36).color,"warn"==l._22(t,36).color),n(t,47,0,l._32(t,47,0,l._22(t,48).transform("exchange.details.order-id"))),n(t,51,0,e.order.id),n(t,71,0,l._32(t,71,0,l._22(t,72).transform("exchange.details.details"))),n(t,75,0,e.expanded?"keyboard_arrow_up":"keyboard_arrow_down")})}function Gy(n){return l._33(0,[l._25(0,ag,[]),(n()(),l._4(16777216,null,null,1,null,jy)),l._8(2,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n"])),(n()(),l._4(16777216,null,null,1,null,Uy)),l._8(5,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n"])),(n()(),l._9(7,0,null,null,6,"div",[["class","buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(9,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.close()&&l),l},w_,g_)),l._8(10,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(11,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.loading),n(t,5,0,!e.loading)},function(n,t){n(t,11,0,l._32(t,11,0,l._22(t,12).transform("exchange.details.back")))})}var qy=l._7({encapsulation:0,styles:[[".-paper[_ngcontent-%COMP%]{background-color:#fbfbfb;border-radius:10px;-webkit-box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);padding:30px;margin:30px 30px 10px}.-contact[_ngcontent-%COMP%]{margin:15px 30px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.-contact[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{font-size:13px;margin:0 5px;opacity:.5;display:inline-block;vertical-align:middle}.-contact[_ngcontent-%COMP%] span[_ngcontent-%COMP%] a[_ngcontent-%COMP%]{text-decoration:none;color:#0072ff}.-contact[_ngcontent-%COMP%] .history[_ngcontent-%COMP%]{opacity:1}.-contact[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px;vertical-align:middle}.-contact[_ngcontent-%COMP%] .history-text[_ngcontent-%COMP%]{font-size:14px;opacity:1}"]],data:{}});function Jy(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-exchange-create",[],null,[[null,"submitted"]],function(n,t,e){var l=!0;return"submitted"===t&&(l=!1!==n.component.showStatus(e)&&l),l},Dy,ky)),l._8(1,245760,null,0,My,[pf,Sc,ns,jc,fa,qc,De.j],null,{submitted:"submitted"})],function(n,t){n(t,1,0)},null)}function Qy(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-exchange-status",[],null,[[null,"goBack"]],function(n,t,e){var l=!0;return"goBack"===t&&(l=!1!==n.component.goBack()&&l),l},Gy,Yy)),l._8(1,180224,null,0,Ey,[pf,fa,qc,gf],{orderDetails:[0,"orderDetails"]},{goBack:"goBack"})],function(n,t){n(t,1,0,t.component.currentOrderDetails)},null)}function Ky(n){return l._33(0,[(n()(),l._9(0,0,null,null,10,"span",[["class","history"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,7,"a",[["href","#"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.showHistory(e)&&l),l},null,null)),(n()(),l._9(3,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(4,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["history"])),(n()(),l._31(-1,null,[" "])),(n()(),l._9(7,0,null,null,2,"span",[["class","history-text"]],null,null,null,null,null)),(n()(),l._31(8,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,4,0)},function(n,t){n(t,8,0,l._32(t,8,0,l._22(t,9).transform("exchange.history")))})}function Xy(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-header",[],null,null,null,K_,D_)),l._8(1,245760,null,0,P_,[gf,nf,qc,rf,Sc],{headline:[0,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n"])),(n()(),l._9(4,0,null,null,40,"div",[["class","container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,7,"div",[["class","-paper"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Jy)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,Qy)),l._8(12,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(15,0,null,null,28,"div",[["class","-contact"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(17,0,null,null,4,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Ky)),l._8(20,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(23,0,null,null,19,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(25,0,null,null,6,"span",[],null,null,null,null,null)),(n()(),l._31(26,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(28,0,null,null,2,"a",[["href","https://swaplabcc.freshdesk.com/support/home"],["rel","noreferrer nofollow"],["target","_blank"]],null,null,null,null,null)),(n()(),l._31(29,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(33,0,null,null,1,"span",[],null,null,null,null,null)),(n()(),l._31(-1,null,["|"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(36,0,null,null,5,"span",[],null,null,null,null,null)),(n()(),l._31(37,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(39,0,null,null,1,"a",[["href","https://swaplab.cc"],["rel","noreferrer nofollow"],["target","_blank"]],null,null,null,null,null)),(n()(),l._31(-1,null,["SWAPLAB.CC"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,1,0,l._32(t,1,0,l._22(t,2).transform("title.exchange"))),n(t,9,0,!e.currentOrderDetails&&!e.loading),n(t,12,0,e.currentOrderDetails&&!e.loading),n(t,20,0,e.hasHistory)},function(n,t){n(t,26,0,l._32(t,26,0,l._22(t,27).transform("exchange.need-help"))),n(t,29,0,l._32(t,29,0,l._22(t,30).transform("exchange.support-portal"))),n(t,37,0,l._32(t,37,0,l._22(t,38).transform("exchange.powered-by")))})}var Zy=l._5("app-exchange",_f,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-exchange",[],null,null,null,Xy,qy)),l._8(1,245760,null,0,_f,[pf,fa],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]),$y=l._7({encapsulation:0,styles:[[".-paper[_ngcontent-%COMP%]{background-color:#fbfbfb;border-radius:15px;-webkit-box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);padding:20px;font-size:13px;margin:30px 30px 0}.-paper[_ngcontent-%COMP%] p[_ngcontent-%COMP%]:first-child{margin-top:0}.-paper[_ngcontent-%COMP%] p[_ngcontent-%COMP%]:last-child{margin-bottom:0}.-text-muted[_ngcontent-%COMP%]{color:rgba(30,34,39,.5)}.-text-right[_ngcontent-%COMP%]{text-align:right}.-link[_ngcontent-%COMP%]{color:#0072ff;cursor:pointer}.-label[_ngcontent-%COMP%]{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}"]],data:{}});function nb(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-loading-content",[["noDataText","backup.no-wallets"]],null,null,null,Fg,Rg)),l._8(1,49152,null,0,Ig,[],{isLoading:[0,"isLoading"],noDataText:[1,"noDataText"]},null)],function(n,t){n(t,1,0,!1,"backup.no-wallets")},null)}function tb(n){return l._33(0,[(n()(),l._9(0,0,null,null,14,"div",[["class","-row"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,1,"div",[["class","-width-250 -label"]],[[1,"title",0]],null,null,null,null)),(n()(),l._31(3,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,1,"div",[["class","-width-150"]],null,null,null,null,null)),(n()(),l._31(6,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,5,"div",[["class","-flex-fill -text-right"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,2,"span",[["class","-link"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.showSeed(n.context.$implicit)&&l),l},null,null)),(n()(),l._31(11,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,2,0,t.context.$implicit.label),n(t,3,0,t.context.$implicit.label),n(t,6,0,t.context.$implicit.filename),n(t,11,0,l._32(t,11,0,l._22(t,12).transform("backup.show-seed")))})}function eb(n){return l._33(0,[(n()(),l._9(0,0,null,null,20,"div",[["class","-table"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,11,"div",[["class","-headers"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,2,"div",[["class","-width-250"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,2,"div",[["class","-width-150"]],null,null,null,null,null)),(n()(),l._31(9,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,0,"div",[["class","-flex-fill"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(15,0,null,null,4,"div",[["class","-body"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,tb)),l._8(18,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,18,0,t.component.onlyEncrypted)},function(n,t){n(t,5,0,l._32(t,5,0,l._22(t,6).transform("backup.wallet"))),n(t,9,0,l._32(t,9,0,l._22(t,10).transform("backup.filename")))})}function lb(n){return l._33(0,[(n()(),l._9(0,0,null,null,31,"div",[["class","sky-container sky-container-grey"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"app-header",[],null,null,null,K_,D_)),l._8(3,245760,null,0,P_,[gf,nf,qc,rf,Sc],{headline:[0,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(6,0,null,null,24,"div",[["class","container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,15,"div",[["class","-paper"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,2,"p",[],null,null,null,null,null)),(n()(),l._31(11,null,[""," ",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,2,"p",[],null,null,null,null,null)),(n()(),l._31(15,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(18,0,null,null,4,"p",[["class","-text-muted"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(20,0,null,null,1,"small",[],[[8,"innerHTML",1]],null,null,null,null)),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,nb)),l._8(26,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,eb)),l._8(29,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,3,0,l._32(t,3,0,l._22(t,4).transform("title.backup"))),n(t,26,0,0===e.onlyEncrypted.length),n(t,29,0,e.onlyEncrypted.length>0)},function(n,t){var e=t.component;n(t,11,0,l._32(t,11,0,l._22(t,12).transform("backup.wallet-directory")),e.folder),n(t,15,0,l._32(t,15,0,l._22(t,16).transform("backup.seed-warning"))),n(t,20,0,l._32(t,20,0,l._22(t,21).transform("backup.desc")))})}var rb=l._5("app-backup",$p,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-backup",[],null,null,null,lb,$y)),l._8(1,245760,null,0,$p,[Sc,fa],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]),ib=l._7({encapsulation:0,styles:[[".-wrapper[_ngcontent-%COMP%]{margin:30px}.-paper[_ngcontent-%COMP%]{background-color:#fbfbfb;border-radius:15px;-webkit-box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);padding:20px;font-size:13px}.-item[_ngcontent-%COMP%]:not(:last-child){margin-bottom:20px}.-item[_ngcontent-%COMP%] .-key[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);margin-bottom:5px}.-item[_ngcontent-%COMP%] .-value[_ngcontent-%COMP%]{word-break:break-all}"]],data:{}});function ob(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-loading-content",[],null,null,null,Fg,Rg)),l._8(1,49152,null,0,Ig,[],null,null)],null,null)}function sb(n){return l._33(0,[(n()(),l._9(0,0,null,null,101,"div",[["class","container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,98,"div",[["class","row -wrapper"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,36,"div",[["class","col-md-6"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,33,"div",[["class","-paper"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,9,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(11,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,2,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(15,null,["",""])),l._27(16,1),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(19,0,null,null,9,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(21,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(22,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(25,0,null,null,2,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(26,null,["",""])),l._27(27,1),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(30,0,null,null,8,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(32,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(33,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(36,0,null,null,1,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(37,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(42,0,null,null,57,"div",[["class","col-md-6"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(44,0,null,null,54,"div",[["class","-paper"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(46,0,null,null,51,"div",[["class","row"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(48,0,null,null,23,"div",[["class","col-md-6"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(50,0,null,null,9,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(52,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(53,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(56,0,null,null,2,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(57,null,["",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(61,0,null,null,9,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(63,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(64,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(67,0,null,null,2,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(68,null,["",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(73,0,null,null,23,"div",[["class","col-md-6"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(75,0,null,null,9,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(77,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(78,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(81,0,null,null,2,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(82,null,["",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(86,0,null,null,9,"div",[["class","-item"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(88,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(n()(),l._31(89,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(92,0,null,null,2,"div",[["class","-value"]],null,null,null,null,null)),(n()(),l._31(93,null,["",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){var e=t.component;n(t,11,0,l._32(t,11,0,l._22(t,12).transform("blockchain.blocks"))),n(t,15,0,l._32(t,15,0,n(t,16,0,l._22(t.parent,0),e.block.header.seq))),n(t,22,0,l._32(t,22,0,l._22(t,23).transform("blockchain.time"))),n(t,26,0,l._32(t,26,0,n(t,27,0,l._22(t.parent,1),e.block.header.timestamp))),n(t,33,0,l._32(t,33,0,l._22(t,34).transform("blockchain.hash"))),n(t,37,0,e.block.header.block_hash),n(t,53,0,l._32(t,53,0,l._22(t,54).transform("blockchain.current-supply"))),n(t,57,0,l._32(t,57,0,l._22(t,58).transform(e.coinSupply.current_supply,!0,"first"))),n(t,64,0,l._32(t,64,0,l._22(t,65).transform("blockchain.total-supply"))),n(t,68,0,l._32(t,68,0,l._22(t,69).transform(e.coinSupply.total_supply,!0,"first"))),n(t,78,0,l._32(t,78,0,l._22(t,79).transform("blockchain.current-coinhour-supply"))),n(t,82,0,l._32(t,82,0,l._22(t,83).transform(e.coinSupply.current_coinhour_supply,!1,"first"))),n(t,89,0,l._32(t,89,0,l._22(t,90).transform("blockchain.total-coinhour-supply"))),n(t,93,0,l._32(t,93,0,l._22(t,94).transform(e.coinSupply.total_coinhour_supply,!1,"first")))})}function ab(n){return l._33(0,[l._25(0,tn,[l.w]),l._25(0,ag,[]),(n()(),l._9(2,0,null,null,11,"div",[["class","sky-container sky-container-grey"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,2,"app-header",[],null,null,null,K_,D_)),l._8(5,245760,null,0,P_,[gf,nf,qc,rf,Sc],{headline:[0,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,ob)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,sb)),l._8(12,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,5,0,l._32(t,5,0,l._22(t,6).transform("title.blockchain"))),n(t,9,0,!(e.block&&e.block.header&&e.coinSupply)),n(t,12,0,e.block&&e.block.header&&e.coinSupply)},null)}var ub=l._5("app-blockchain",Kp,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-blockchain",[],null,null,null,ab,ib)),l._8(1,245760,null,0,Kp,[qc],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]),cb=function(){function n(n){this.translateService=n}return n.prototype.transform=function(n){var t=zp().unix()-n;return t<60?this.translateService.instant("time-from-now.few-seconds"):t<120?this.translateService.instant("time-from-now.minute"):t<3600?this.translateService.instant("time-from-now.minutes",{time:Math.floor(t/60)}):t<7200?this.translateService.instant("time-from-now.hour"):t<86400?this.translateService.instant("time-from-now.hours",{time:Math.floor(t/3600)}):t<172800?this.translateService.instant("time-from-now.day"):this.translateService.instant("time-from-now.days",{time:Math.floor(t/86400)})},n}(),db=l._7({encapsulation:0,styles:[[".-last-seen[_ngcontent-%COMP%], .-port[_ngcontent-%COMP%], .-source[_ngcontent-%COMP%]{color:rgba(30,34,39,.5)}.-direction[_ngcontent-%COMP%]{width:72px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-negative:0;flex-shrink:0}.-direction[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{width:32px}.-direction[_ngcontent-%COMP%] img.-incoming[_ngcontent-%COMP%]{-webkit-transform:scaleX(-1);transform:scaleX(-1)}.-last-seen[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;font-size:12px;line-height:1;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.-last-seen[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:12px;display:inline;vertical-align:middle;padding-right:5px}.-trusted[_ngcontent-%COMP%]{display:inline;color:#0072ff;font-size:13px;vertical-align:middle}.-text-right[_ngcontent-%COMP%]{text-align:right}.-pl-0[_ngcontent-%COMP%]{padding-left:0!important}.-block-row[_ngcontent-%COMP%]{width:150px;-ms-flex-negative:0;flex-shrink:0}.-invisible[_ngcontent-%COMP%]{display:none}@media (max-width:991px){.-pl-0[_ngcontent-%COMP%]{width:160px!important}.-block-row[_ngcontent-%COMP%]{width:90px;-ms-flex-negative:0;flex-shrink:0}}"]],data:{}});function hb(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-loading-content",[],null,null,null,Fg,Rg)),l._8(1,49152,null,0,Ig,[],null,null)],null,null)}function pb(n){return l._33(0,[(n()(),l._9(0,0,null,null,46,"div",[["class","-row"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,7,"div",[["class","-direction"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,16777216,null,null,4,"img",[["src","/assets/img/send-blue.png"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,7).show()&&r),"keydown"===t&&(r=!1!==l._22(n,7)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,7).hide(1500)&&r),r},null,null)),l._8(5,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(6,{"-incoming":0}),l._8(7,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(11,0,null,null,4,"div",[["class","-width-200 -pl-0"]],null,null,null,null,null)),(n()(),l._31(12,null,["\n ",""])),(n()(),l._9(13,0,null,null,1,"span",[["class","-port"]],null,null,null,null,null)),(n()(),l._31(14,null,[":",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(17,0,null,null,2,"div",[["class","-flex-fill -source"]],null,null,null,null,null)),(n()(),l._31(18,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(21,0,null,null,1,"div",[["class","-block-row -text-right"]],null,null,null,null,null)),(n()(),l._31(22,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(24,0,null,null,21,"div",[["class","-width-200 -last-seen"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(26,0,null,null,8,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(28,16777216,null,null,4,"mat-icon",[["class","mat-icon"],["role","img"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,30).show()&&r),"keydown"===t&&(r=!1!==l._22(n,30)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,30).hide(1500)&&r),r},Hf,Rf)),l._8(29,638976,null,0,ou,[l.l,eu,[8,null]],null,null),l._8(30,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["keyboard_arrow_up"])),(n()(),l._31(33,null,["\n ","\n "])),l._25(0,cb,[De.j]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(36,0,null,null,8,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(38,16777216,null,null,4,"mat-icon",[["class","mat-icon"],["role","img"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,40).show()&&r),"keydown"===t&&(r=!1!==l._22(n,40)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,40).hide(1500)&&r),r},Hf,Rf)),l._8(39,638976,null,0,ou,[l.l,eu,[8,null]],null,null),l._8(40,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["keyboard_arrow_down"])),(n()(),l._31(43,null,["\n ","\n "])),l._25(0,cb,[De.j]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,5,0,n(t,6,0,!t.context.$implicit.outgoing)),n(t,7,0,l._32(t,7,0,l._22(t,8).transform(t.context.$implicit.outgoing?"network.out":"network.in"))),n(t,29,0),n(t,30,0,l._32(t,30,0,l._22(t,31).transform("network.last-sent"))),n(t,39,0),n(t,40,0,l._32(t,40,0,l._22(t,41).transform("network.last-received")))},function(n,t){n(t,12,0,t.context.$implicit.address.split(":")[0]),n(t,14,0,t.context.$implicit.listen_port),n(t,18,0,l._32(t,18,0,l._22(t,19).transform("network.sources."+t.context.$implicit.source))),n(t,22,0,t.context.$implicit.height),n(t,33,0,l._32(t,33,0,l._22(t,34).transform(t.context.$implicit.last_sent))),n(t,43,0,l._32(t,43,0,l._22(t,44).transform(t.context.$implicit.last_received)))})}function fb(n){return l._33(0,[(n()(),l._9(0,0,null,null,35,"div",[["class","container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,32,"div",[["class","-table"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,23,"div",[["class","-headers"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,0,"div",[["class","-direction"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,2,"div",[["class","-width-200 -pl-0"]],null,null,null,null,null)),(n()(),l._31(9,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,2,"div",[["class","-flex-fill"]],null,null,null,null,null)),(n()(),l._31(13,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,2,"div",[["class","d-lg-block -invisible -block-row -text-right"]],null,null,null,null,null)),(n()(),l._31(17,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(20,0,null,null,2,"div",[["class","d-lg-none -block-row -text-right"]],null,null,null,null,null)),(n()(),l._31(21,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(24,0,null,null,2,"div",[["class","-width-200"]],null,null,null,null,null)),(n()(),l._31(25,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(29,0,null,null,4,"div",[["class","-body"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,pb)),l._8(32,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,32,0,t.component.peers)},function(n,t){n(t,9,0,l._32(t,9,0,l._22(t,10).transform("network.peer"))),n(t,13,0,l._32(t,13,0,l._22(t,14).transform("network.source"))),n(t,17,0,l._32(t,17,0,l._22(t,18).transform("network.block-height"))),n(t,21,0,l._32(t,21,0,l._22(t,22).transform("network.block-height-short"))),n(t,25,0,l._32(t,25,0,l._22(t,26).transform("network.last-seen")))})}function _b(n){return l._33(0,[(n()(),l._9(0,0,null,null,11,"div",[["class","sky-container sky-container-grey"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"app-header",[],null,null,null,K_,D_)),l._8(3,245760,null,0,P_,[gf,nf,qc,rf,Sc],{headline:[0,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,hb)),l._8(7,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,fb)),l._8(10,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,3,0,l._32(t,3,0,l._22(t,4).transform("title.network"))),n(t,7,0,!e.peers),n(t,10,0,e.peers)},null)}var mb=l._5("app-network",tf,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-network",[],null,null,null,_b,db)),l._8(1,245760,null,0,tf,[nf],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]),gb=l._7({encapsulation:0,styles:[[".-text-right[_ngcontent-%COMP%]{text-align:right}.-grey[_ngcontent-%COMP%]{color:rgba(30,34,39,.5)}.-hash[_ngcontent-%COMP%]{margin-left:27px;word-break:break-all}.-address[_ngcontent-%COMP%]{color:rgba(30,34,39,.5)}.-address[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{width:17px;vertical-align:middle;margin-right:10px}.-label[_ngcontent-%COMP%]{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}"]],data:{}});function yb(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-loading-content",[["noDataText","errors.no-outputs"]],null,null,null,Fg,Rg)),l._8(1,49152,null,0,Ig,[],{isLoading:[0,"isLoading"],noDataText:[1,"noDataText"]},null)],function(n,t){n(t,1,0,!t.component.wallets,"errors.no-outputs")},null)}function bb(n){return l._33(0,[(n()(),l._9(0,0,null,null,12,"div",[["class","-row"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,1,"div",[["class","-flex-fill -hash"]],null,null,null,null,null)),(n()(),l._31(3,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,2,"div",[["class","-width-150 -text-right"]],null,null,null,null,null)),(n()(),l._31(6,null,["",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(9,0,null,null,2,"div",[["class","-width-150 -text-right -grey"]],null,null,null,null,null)),(n()(),l._31(10,null,["",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,3,0,t.context.$implicit.hash),n(t,6,0,l._32(t,6,0,l._22(t,7).transform(t.context.$implicit.coins,!0,"first"))),n(t,10,0,l._32(t,10,0,l._22(t,11).transform(t.context.$implicit.calculated_hours,!1,"first")))})}function vb(n){return l._33(0,[(n()(),l._9(0,0,null,null,12,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,6,"div",[["class","-row"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,3,"div",[["class","-flex-fill -address"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,0,"img",[["class","qr-code-button"],["src","../../../../../assets/img/qr-code-black.png"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.showQrCode(e,n.context.$implicit.address)&&l),l},null,null)),(n()(),l._31(7,null,["\n ","\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,bb)),l._8(11,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,11,0,t.context.$implicit.outputs)},function(n,t){n(t,7,0,t.context.$implicit.address)})}function wb(n){return l._33(0,[(n()(),l._9(0,0,null,null,21,"div",[["class","-table"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,12,"div",[["class","-headers"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,1,"div",[["class","-flex-fill -label"]],[[1,"title",0]],null,null,null,null)),(n()(),l._31(5,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(7,0,null,null,2,"div",[["class","-width-150 -text-right"]],null,null,null,null,null)),(n()(),l._31(8,null,["",""])),l._25(0,l_,[gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(11,0,null,null,2,"div",[["class","-width-150 -text-right"]],null,null,null,null,null)),(n()(),l._31(12,null,["",""])),l._25(0,l_,[gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,4,"div",[["class","-body"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,vb)),l._8(19,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,19,0,t.context.$implicit.addresses)},function(n,t){n(t,4,0,t.context.$implicit.label),n(t,5,0,t.context.$implicit.label),n(t,8,0,l._32(t,8,0,l._22(t,9).transform("coin"))),n(t,12,0,l._32(t,12,0,l._22(t,13).transform("hours")))})}function xb(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"div",[["class","container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,wb)),l._8(3,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,3,0,t.component.wallets)},null)}function Mb(n){return l._33(0,[(n()(),l._9(0,0,null,null,11,"div",[["class","sky-container sky-container-grey"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"app-header",[],null,null,null,K_,D_)),l._8(3,245760,null,0,P_,[gf,nf,qc,rf,Sc],{headline:[0,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,yb)),l._8(7,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,xb)),l._8(10,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,3,0,l._32(t,3,0,l._22(t,4).transform("title.outputs"))),n(t,7,0,!e.wallets||0===e.wallets.length||0===e.wallets[0].addresses[0].outputs.length),n(t,10,0,e.wallets&&e.wallets.length>0)},null)}var kb=l._5("app-outputs",Jp,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-outputs",[],null,null,null,Mb,gb)),l._8(1,180224,null,0,Jp,[Sc,Ch,fa],null,null)],null,null)},{},{},[]),Cb=l._7({encapsulation:0,styles:[[".-timestamp[_ngcontent-%COMP%]{color:rgba(30,34,39,.5)}.-txid[_ngcontent-%COMP%]{word-break:break-all}"]],data:{}});function Sb(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-loading-content",[["noDataText","pending-txs.none"]],null,null,null,Fg,Rg)),l._8(1,49152,null,0,Ig,[],{isLoading:[0,"isLoading"],noDataText:[1,"noDataText"]},null)],function(n,t){n(t,1,0,!t.component.transactions,"pending-txs.none")},null)}function Ob(n){return l._33(0,[(n()(),l._9(0,0,null,null,16,"div",[["class","-row"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,1,"div",[["class","-flex-fill -txid"]],null,null,null,null,null)),(n()(),l._31(3,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,2,"div",[["class","-width-150"]],null,null,null,null,null)),(n()(),l._31(6,null,["",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(9,0,null,null,2,"div",[["class","-width-150"]],null,null,null,null,null)),(n()(),l._31(10,null,["",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(13,0,null,null,2,"div",[["class","-width-150 -timestamp"]],null,null,null,null,null)),(n()(),l._31(14,null,["",""])),l._27(15,1),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,3,0,t.context.$implicit.txid),n(t,6,0,l._32(t,6,0,l._22(t,7).transform(t.context.$implicit.amount,!0,"first"))),n(t,10,0,l._32(t,10,0,l._22(t,11).transform(t.context.$implicit.hours,!1,"first"))),n(t,14,0,l._32(t,14,0,n(t,15,0,l._22(t.parent.parent,0),t.context.$implicit.timestamp)))})}function Tb(n){return l._33(0,[(n()(),l._9(0,0,null,null,29,"div",[["class","container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,26,"div",[["class","-table"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,17,"div",[["class","-headers"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,2,"div",[["class","-flex-fill"]],null,null,null,null,null)),(n()(),l._31(7,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,2,"div",[["class","-width-150"]],null,null,null,null,null)),(n()(),l._31(11,null,["",""])),l._25(0,l_,[gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,2,"div",[["class","-width-150"]],null,null,null,null,null)),(n()(),l._31(15,null,["",""])),l._25(0,l_,[gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(18,0,null,null,2,"div",[["class","-width-150"]],null,null,null,null,null)),(n()(),l._31(19,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(23,0,null,null,4,"div",[["class","-body"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Ob)),l._8(26,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,26,0,t.component.transactions)},function(n,t){n(t,7,0,l._32(t,7,0,l._22(t,8).transform("pending-txs.txid"))),n(t,11,0,l._32(t,11,0,l._22(t,12).transform("coin"))),n(t,15,0,l._32(t,15,0,l._22(t,16).transform("hours"))),n(t,19,0,l._32(t,19,0,l._22(t,20).transform("pending-txs.timestamp")))})}function Lb(n){return l._33(0,[l._25(0,ag,[]),(n()(),l._9(1,0,null,null,11,"div",[["class","sky-container sky-container-grey"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(3,0,null,null,2,"app-header",[],null,null,null,K_,D_)),l._8(4,245760,null,0,P_,[gf,nf,qc,rf,Sc],{headline:[0,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,Sb)),l._8(8,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,Tb)),l._8(11,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,4,0,l._32(t,4,0,l._22(t,5).transform("title.pending-txs"))),n(t,8,0,!e.transactions||0===e.transactions.length),n(t,11,0,e.transactions&&e.transactions.length>0)},null)}var Pb=l._5("app-pending-transactions",Up,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-pending-transactions",[],null,null,null,Lb,Cb)),l._8(1,245760,null,0,Up,[Sc,Vp],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]),Db=function(){function n(n){this.el=n,n.nativeElement.autocomplete="new-password",n.nativeElement.readOnly=!0}return n.prototype.onFocus=function(){this.el.nativeElement.readOnly=!1},n}(),Ab=l._7({encapsulation:0,styles:[[".dashed-border[_ngcontent-%COMP%]{border:1px dashed rgba(0,0,0,.25)}.show-pointer[_ngcontent-%COMP%]{cursor:pointer}.non-editable-field[_ngcontent-%COMP%]{font-size:12px;text-align:center;padding:15px;border-radius:6px;color:#171a1d}.non-editable-field[_ngcontent-%COMP%] .text-with-icon-container[_ngcontent-%COMP%]{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.non-editable-field[_ngcontent-%COMP%] .text-with-icon-container[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{margin-right:5px;opacity:1}.non-editable-field[_ngcontent-%COMP%] .text-with-icon-container[_ngcontent-%COMP%] .green[_ngcontent-%COMP%]{color:#00df80}.non-editable-field[_ngcontent-%COMP%] .text-with-icon-container[_ngcontent-%COMP%] .yellow[_ngcontent-%COMP%]{color:#ffc125}.normal-seed-field[_ngcontent-%COMP%]{font-size:14px}.seed-type-button[_ngcontent-%COMP%]{width:100%;height:10px;text-align:right}.seed-type-button[_ngcontent-%COMP%] > div[_ngcontent-%COMP%]{display:inline-block;width:32px;height:32px;position:relative;left:16px;top:-10px;background-color:#fff;border-radius:100px;cursor:pointer}.seed-type-button[_ngcontent-%COMP%] > div[_ngcontent-%COMP%] > img[_ngcontent-%COMP%]{width:32px;height:32px}.onboarding-version[_ngcontent-%COMP%]{border:1px dashed rgba(255,255,255,.5);color:#fff}.transparent-text[_ngcontent-%COMP%]{opacity:.75}.red-disclaimer-box[_ngcontent-%COMP%]{color:#ff004e;font-size:12px;padding:0 10px;line-height:1.5}.white-disclaimer-box[_ngcontent-%COMP%]{color:#fafafa;font-size:12px;padding:0 10px;line-height:1.5}label[for=seed][_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex}label[for=seed][_ngcontent-%COMP%] > span[_ngcontent-%COMP%]:last-child{-webkit-box-flex:1;-ms-flex:1;flex:1}label[for=seed][_ngcontent-%COMP%] .generators[_ngcontent-%COMP%]{text-align:right}label[for=seed][_ngcontent-%COMP%] .generators[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{cursor:pointer;color:#0072ff}label[for=seed][_ngcontent-%COMP%] .generators[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{width:13px;height:10px;font-size:13px;position:relative;top:2px}label[for=seed][_ngcontent-%COMP%] .generators[_ngcontent-%COMP%] .divider[_ngcontent-%COMP%]{padding:0 5px;color:#1e2227}label[for=seed][_ngcontent-%COMP%] .-white-text[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:#fff!important}.-passwords[_ngcontent-%COMP%]{margin-left:24px}.-passwords[_ngcontent-%COMP%] .-info[_ngcontent-%COMP%]{margin:5px 0 15px;color:rgba(30,34,39,.5);font-size:12px;line-height:1.5}.-check[_ngcontent-%COMP%] .mat-checkbox-checkmark-path{position:absolute;width:18px;height:8px;left:4.59px;top:9px;stroke:#0072ff!important}.-check[_ngcontent-%COMP%] .mat-checkbox-background, .-check[_ngcontent-%COMP%] .mat-checkbox-frame{top:0;left:0;right:0;bottom:0;position:absolute;-webkit-box-sizing:border-box;box-sizing:border-box;pointer-events:none;width:20px;height:20px;background:rgba(30,34,39,.05);border-radius:6px;border-color:transparent}.-check[_ngcontent-%COMP%] span{font-family:Skycoin;line-height:normal;font-size:14px;color:#1e2227}.-check[_ngcontent-%COMP%] span img{width:38px;height:38px;vertical-align:middle}"]],data:{}});function Eb(n){return l._33(0,[(n()(),l._9(0,0,null,null,28,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"label",[["for","number_of_words"]],null,null,null,null,null)),(n()(),l._31(3,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,21,"div",[["class","-select"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,18,"select",[["formControlName","number_of_words"],["id","number_of_words"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"change"],[null,"blur"]],function(n,t,e){var r=!0;return"change"===t&&(r=!1!==l._22(n,9).onChange(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,9).onTouched()&&r),r},null,null)),l._8(9,16384,null,0,_o,[l.G,l.l],null,null),l._28(1024,null,to,function(n){return[n]},[_o]),l._8(11,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(13,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(15,0,null,null,4,"option",[],null,null,null,null,null)),l._8(16,147456,null,0,mo,[l.l,l.G,[2,_o]],{ngValue:[0,"ngValue"]},null),l._8(17,147456,null,0,bo,[l.l,l.G,[8,null]],{ngValue:[0,"ngValue"]},null),(n()(),l._31(18,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(21,0,null,null,4,"option",[],null,null,null,null,null)),l._8(22,147456,null,0,mo,[l.l,l.G,[2,_o]],{ngValue:[0,"ngValue"]},null),l._8(23,147456,null,0,bo,[l.l,l.G,[8,null]],{ngValue:[0,"ngValue"]},null),(n()(),l._31(24,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,11,0,"number_of_words"),n(t,16,0,12),n(t,17,0,12),n(t,22,0,24),n(t,23,0,24)},function(n,t){n(t,3,0,l._32(t,3,0,l._22(t,4).transform("wallet.new.words-number"))),n(t,8,0,l._22(t,13).ngClassUntouched,l._22(t,13).ngClassTouched,l._22(t,13).ngClassPristine,l._22(t,13).ngClassDirty,l._22(t,13).ngClassValid,l._22(t,13).ngClassInvalid,l._22(t,13).ngClassPending),n(t,18,0,l._32(t,18,0,l._22(t,19).transform("wallet.new.12-words"))),n(t,24,0,l._32(t,24,0,l._22(t,25).transform("wallet.new.24-words")))})}function Yb(n){return l._33(0,[(n()(),l._9(0,0,null,null,18,"span",[["class","generators"]],null,null,null,null,null)),l._8(1,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(2,{"-white-text":0}),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,16777216,null,null,4,"span",[],null,[[null,"click"],[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0,i=n.component;return"longpress"===t&&(r=!1!==l._22(n,5).show()&&r),"keydown"===t&&(r=!1!==l._22(n,5)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,5).hide(1500)&&r),"click"===t&&(r=!1!==i.generateSeed(128)&&r),r},null,null)),l._8(5,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(7,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,1,"span",[["class","divider"]],null,null,null,null,null)),(n()(),l._31(-1,null,["|"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(13,16777216,null,null,4,"span",[],null,[[null,"click"],[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0,i=n.component;return"longpress"===t&&(r=!1!==l._22(n,14).show()&&r),"keydown"===t&&(r=!1!==l._22(n,14)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,14).hide(1500)&&r),"click"===t&&(r=!1!==i.generateSeed(256)&&r),r},null,null)),l._8(14,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(16,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,1,0,"generators",n(t,2,0,t.component.onboarding)),n(t,5,0,l._32(t,5,0,l._22(t,6).transform("wallet.new.generate-12-seed"))),n(t,14,0,l._32(t,14,0,l._22(t,15).transform("wallet.new.generate-24-seed")))},function(n,t){n(t,7,0,l._32(t,7,0,l._22(t,8).transform("wallet.new.12-words"))),n(t,16,0,l._32(t,16,0,l._22(t,17).transform("wallet.new.24-words")))})}function jb(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"span",[["class","normal-seed-field"]],null,null,null,null,null)),(n()(),l._31(1,null,["",""]))],null,function(n,t){n(t,1,0,t.component.lastAssistedSeed)})}function Ib(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"div",[],null,null,null,null,null)),l._8(1,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(2,{"transparent-text":0}),(n()(),l._31(3,null,["",""])),l._25(131072,De.i,[De.j,l.h])],function(n,t){n(t,1,0,n(t,2,0,t.component.onboarding))},function(n,t){n(t,3,0,l._32(t,3,0,l._22(t,4).transform("wallet.new.seed.change-seed")))})}function Rb(n){return l._33(0,[(n()(),l._9(0,0,null,null,10,"div",[["class","text-with-icon-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"mat-icon",[["class","yellow mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(3,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["touch_app"])),(n()(),l._9(5,0,null,null,4,"span",[],null,null,null,null,null)),l._8(6,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(7,{"transparent-text":0}),(n()(),l._31(8,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0),n(t,6,0,n(t,7,0,e.onboarding))},function(n,t){n(t,8,0,l._32(t,8,0,l._22(t,9).transform("wallet.new.seed.enter-seed")))})}function Hb(n){return l._33(0,[(n()(),l._9(0,0,null,null,27,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,12,"div",[["class","dashed-border non-editable-field"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.enterSeed()&&l),l},null,null)),l._8(3,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(4,{"onboarding-version":0,"show-pointer":1}),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,jb)),l._8(7,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Ib)),l._8(10,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Rb)),l._8(13,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,10,"div",[["class","seed-type-button"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(18,0,null,null,7,"div",[],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.changeSeedType()&&l),l},null,null)),l._8(19,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(20,{"dashed-border":0}),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(22,16777216,null,null,2,"img",[["src","../../../../assets/img/lock-gold.png"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,23).show()&&r),"keydown"===t&&(r=!1!==l._22(n,23)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,23).hide(1500)&&r),r},null,null)),l._8(23,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,"dashed-border non-editable-field",n(t,4,0,e.onboarding,!e.create)),n(t,7,0,e.create||e.lastAssistedSeed),n(t,10,0,!e.create&&e.lastAssistedSeed),n(t,13,0,!e.create&&!e.lastAssistedSeed),n(t,19,0,n(t,20,0,!e.onboarding)),n(t,23,0,l._32(t,23,0,l._22(t,24).transform("wallet.new.seed.use-custom-seed")))},null)}function Nb(n){return l._33(0,[(n()(),l._9(0,0,null,null,20,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,5,"textarea",[["formControlName","seed"],["id","seed"],["rows","2"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,3)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,3).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,3)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,3)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(3,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(5,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(7,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(9,0,null,null,10,"div",[["class","seed-type-button"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(11,0,null,null,7,"div",[],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.changeSeedType()&&l),l},null,null)),l._8(12,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(13,{"dashed-border":0}),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(15,16777216,null,null,2,"img",[["src","../../../../assets/img/unlock-grey.png"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,16).show()&&r),"keydown"===t&&(r=!1!==l._22(n,16)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,16).hide(1500)&&r),r},null,null)),l._8(16,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,5,0,"seed"),n(t,12,0,n(t,13,0,!e.onboarding)),n(t,16,0,l._32(t,16,0,l._22(t,17).transform("wallet.new.seed.use-normal-seed")))},function(n,t){n(t,2,0,l._22(t,7).ngClassUntouched,l._22(t,7).ngClassTouched,l._22(t,7).ngClassPristine,l._22(t,7).ngClassDirty,l._22(t,7).ngClassValid,l._22(t,7).ngClassInvalid,l._22(t,7).ngClassPending)})}function Fb(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"p",[],null,null,null,null,null)),l._8(1,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(2,{"red-disclaimer-box":0,"white-disclaimer-box transparent-text":1}),(n()(),l._31(3,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h])],function(n,t){var e=t.component;n(t,1,0,n(t,2,0,!e.onboarding,e.onboarding))},function(n,t){n(t,3,0,l._32(t,3,0,l._22(t,4).transform("wallet.new.seed-warning")))})}function Bb(n){return l._33(0,[(n()(),l._9(0,0,null,null,10,"div",[["class","text-with-icon-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"mat-icon",[["class","yellow mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(3,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["touch_app"])),(n()(),l._9(5,0,null,null,4,"span",[],null,null,null,null,null)),l._8(6,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(7,{"transparent-text":0}),(n()(),l._31(8,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0),n(t,6,0,n(t,7,0,e.onboarding))},function(n,t){n(t,8,0,l._32(t,8,0,l._22(t,9).transform("wallet.new.seed.confirm-seed")))})}function Vb(n){return l._33(0,[(n()(),l._9(0,0,null,null,11,"div",[["class","text-with-icon-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"mat-icon",[["class","green mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(3,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["done"])),(n()(),l._31(-1,null,[" "])),(n()(),l._9(6,0,null,null,4,"span",[],null,null,null,null,null)),l._8(7,278528,null,0,O,[l.u,l.v,l.l,l.G],{ngClass:[0,"ngClass"]},null),l._26(8,{"transparent-text":0}),(n()(),l._31(9,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0),n(t,7,0,n(t,8,0,e.onboarding))},function(n,t){n(t,9,0,l._32(t,9,0,l._22(t,10).transform("wallet.new.seed.confirmed-seed")))})}function Wb(n){return l._33(0,[(n()(),l._9(0,0,null,null,12,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,9,"div",[["class","dashed-border non-editable-field"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.confirmNormalSeed()&&l),l},null,null)),l._8(3,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(4,{"onboarding-version":0,"show-pointer":1}),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Bb)),l._8(7,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Vb)),l._8(10,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,"dashed-border non-editable-field",n(t,4,0,e.onboarding,!e.assistedSeedConfirmed)),n(t,7,0,!e.assistedSeedConfirmed),n(t,10,0,e.assistedSeedConfirmed)},null)}function zb(n){return l._33(0,[(n()(),l._9(0,0,null,null,8,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,5,"textarea",[["formControlName","confirm_seed"],["id","confirm_seed"],["rows","2"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,3)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,3).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,3)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,3)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(3,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(5,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(7,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,5,0,"confirm_seed")},function(n,t){n(t,2,0,l._22(t,7).ngClassUntouched,l._22(t,7).ngClassTouched,l._22(t,7).ngClassPristine,l._22(t,7).ngClassDirty,l._22(t,7).ngClassValid,l._22(t,7).ngClassInvalid,l._22(t,7).ngClassPending)})}function Ub(n){return l._33(0,[(n()(),l._9(0,0,null,null,11,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"label",[["for","confirm_seed"]],null,null,null,null,null)),(n()(),l._31(3,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Wb)),l._8(7,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,zb)),l._8(10,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,7,0,e.enterSeedWithAssistance),n(t,10,0,!e.enterSeedWithAssistance)},function(n,t){n(t,3,0,l._32(t,3,0,l._22(t,4).transform("wallet.new.confirm-seed-label")))})}function Gb(n){return l._33(0,[(n()(),l._9(0,0,null,null,16,"div",[["class","col-md-6"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,13,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,2,"label",[["for","password"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,6,"input",[["appDontSavePassword",""],["formControlName","password"],["id","password"],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"focus"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,9)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,9).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,9)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,9)._compositionEnd(e.target.value)&&r),"focus"===t&&(r=!1!==l._22(n,14).onFocus()&&r),r},null,null)),l._8(9,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(11,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(13,16384,null,0,Eo,[uo],null,null),l._8(14,16384,null,0,Db,[l.l],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,11,0,"password")},function(n,t){n(t,5,0,l._32(t,5,0,l._22(t,6).transform("password.label"))),n(t,8,0,l._22(t,13).ngClassUntouched,l._22(t,13).ngClassTouched,l._22(t,13).ngClassPristine,l._22(t,13).ngClassDirty,l._22(t,13).ngClassValid,l._22(t,13).ngClassInvalid,l._22(t,13).ngClassPending)})}function qb(n){return l._33(0,[(n()(),l._9(0,0,null,null,16,"div",[["class","col-md-6"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,13,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,2,"label",[["for","confirm_password"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,6,"input",[["appDontSavePassword",""],["formControlName","confirm_password"],["id","confirm_password"],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown.enter"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"focus"]],function(n,t,e){var r=!0,i=n.component;return"input"===t&&(r=!1!==l._22(n,9)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,9).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,9)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,9)._compositionEnd(e.target.value)&&r),"focus"===t&&(r=!1!==l._22(n,14).onFocus()&&r),"keydown.enter"===t&&(r=!1!==i.createWallet()&&r),r},null,null)),l._8(9,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(11,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(13,16384,null,0,Eo,[uo],null,null),l._8(14,16384,null,0,Db,[l.l],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,11,0,"confirm_password")},function(n,t){n(t,5,0,l._32(t,5,0,l._22(t,6).transform("password.confirm-label"))),n(t,8,0,l._22(t,13).ngClassUntouched,l._22(t,13).ngClassTouched,l._22(t,13).ngClassPristine,l._22(t,13).ngClassDirty,l._22(t,13).ngClassValid,l._22(t,13).ngClassInvalid,l._22(t,13).ngClassPending)})}function Jb(n){return l._33(0,[(n()(),l._9(0,0,null,null,28,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,9,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(4,0,null,null,6,"mat-checkbox",[["class","-check mat-checkbox"],["id","encrypt"],["type","checkbox"]],[[8,"id",0],[2,"mat-checkbox-indeterminate",null],[2,"mat-checkbox-checked",null],[2,"mat-checkbox-disabled",null],[2,"mat-checkbox-label-before",null]],[[null,"change"]],function(n,t,e){var l=!0;return"change"===t&&(l=!1!==n.component.setEncrypt(e)&&l),l},Ym,Em)),l._28(5120,null,to,function(n){return[n]},[ta]),l._8(6,4374528,null,0,ta,[l.l,l.h,Rr,[8,null],[2,Zs]],{id:[0,"id"],checked:[1,"checked"]},{change:"change"}),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(8,0,null,0,0,"img",[["src","../../../../../assets/img/lock-gold.png"]],null,null,null,null,null)),(n()(),l._31(9,0,[" ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(13,0,null,null,14,"div",[["class","row -passwords"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(15,0,null,null,5,"div",[["class","col-md-12"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(17,0,null,null,2,"p",[["class","-info"]],null,null,null,null,null)),(n()(),l._31(18,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Gb)),l._8(23,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,qb)),l._8(26,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,6,0,"encrypt",!0),n(t,23,0,e.encrypt),n(t,26,0,e.encrypt)},function(n,t){n(t,4,0,l._22(t,6).id,l._22(t,6).indeterminate,l._22(t,6).checked,l._22(t,6).disabled,"before"==l._22(t,6).labelPosition),n(t,9,0,l._32(t,9,0,l._22(t,10).transform("wallet.new.encrypt"))),n(t,18,0,l._32(t,18,0,l._22(t,19).transform("wallet.new.encrypt-warning")))})}function Qb(n){return l._33(0,[(n()(),l._9(0,0,null,null,22,"div",[["class","alert-box"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(3,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["error"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,15,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,2,"div",[["class","title"]],null,null,null,null,null)),(n()(),l._31(9,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,2,"div",[],null,null,null,null,null)),(n()(),l._31(13,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,4,"mat-checkbox",[["class","-check mat-checkbox"],["type","checkbox"]],[[8,"id",0],[2,"mat-checkbox-indeterminate",null],[2,"mat-checkbox-checked",null],[2,"mat-checkbox-disabled",null],[2,"mat-checkbox-label-before",null]],[[null,"change"]],function(n,t,e){var l=!0;return"change"===t&&(l=!1!==n.component.onCustomSeedAcceptance(e)&&l),l},Ym,Em)),l._28(5120,null,to,function(n){return[n]},[ta]),l._8(18,4374528,[["seedCheck",4]],0,ta,[l.l,l.h,Rr,[8,null],[2,Zs]],{checked:[0,"checked"]},{change:"change"}),(n()(),l._31(19,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,3,0),n(t,18,0,e.customSeedAccepted)},function(n,t){n(t,9,0,l._32(t,9,0,l._22(t,10).transform("wallet.new.unconventional-seed-title"))),n(t,13,0,l._32(t,13,0,l._22(t,14).transform("wallet.new.unconventional-seed-text"))),n(t,16,0,l._22(t,18).id,l._22(t,18).indeterminate,l._22(t,18).checked,l._22(t,18).disabled,"before"==l._22(t,18).labelPosition),n(t,19,0,l._32(t,19,0,l._22(t,20).transform("wallet.new.unconventional-seed-check")))})}function Kb(n){return l._33(0,[(n()(),l._9(0,0,null,null,49,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,1).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,1).onReset()&&r),r},null,null)),l._8(1,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(3,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,12,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(7,0,null,null,2,"label",[["for","label"]],null,null,null,null,null)),(n()(),l._31(8,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(11,0,null,null,5,"input",[["formControlName","label"],["id","label"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,12)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,12).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,12)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,12)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(12,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(14,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(16,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Eb)),l._8(20,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(22,0,null,null,20,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(24,0,null,null,8,"label",[["for","seed"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(26,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(27,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Yb)),l._8(31,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,Hb)),l._8(35,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,Nb)),l._8(38,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,Fb)),l._8(41,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Ub)),l._8(45,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Jb)),l._8(48,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"])),(n()(),l._4(16777216,null,null,1,null,Qb)),l._8(52,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,1,0,e.form),n(t,14,0,"label"),n(t,20,0,!e.create&&e.enterSeedWithAssistance),n(t,31,0,e.create),n(t,35,0,e.enterSeedWithAssistance),n(t,38,0,!e.enterSeedWithAssistance),n(t,41,0,e.create),n(t,45,0,e.create),n(t,48,0,!e.onboarding),n(t,52,0,e.form.valid&&!e.customSeedIsNormal)},function(n,t){n(t,0,0,l._22(t,3).ngClassUntouched,l._22(t,3).ngClassTouched,l._22(t,3).ngClassPristine,l._22(t,3).ngClassDirty,l._22(t,3).ngClassValid,l._22(t,3).ngClassInvalid,l._22(t,3).ngClassPending),n(t,8,0,l._32(t,8,0,l._22(t,9).transform("wallet.new.name-label"))),n(t,11,0,l._22(t,16).ngClassUntouched,l._22(t,16).ngClassTouched,l._22(t,16).ngClassPristine,l._22(t,16).ngClassDirty,l._22(t,16).ngClassValid,l._22(t,16).ngClassInvalid,l._22(t,16).ngClassPending),n(t,27,0,l._32(t,27,0,l._22(t,28).transform("wallet.new.seed-label")))})}var Xb=function(){function n(n){this.dialogRef=n,this.acceptSafe=!1}return n.prototype.closePopup=function(){this.dialogRef.close(this.acceptSafe)},n.prototype.setAccept=function(n){this.acceptSafe=n.checked},n}(),Zb=function(){function n(n,t,e,r){var i=this;this.dialog=n,this.router=t,this.fill=null,this.onLabelAndSeedCreated=new l.o,this.showNewForm=!0,this.doubleButtonActive=Fp.LeftButton,this.hwCompatibilityActivated=!1,this.synchronized=!0,this.hwCompatibilityActivated=e.hwWalletCompatibilityActivated,this.synchronizedSubscription=r.synchronized.subscribe(function(n){return i.synchronized=n})}return n.prototype.ngOnInit=function(){var n=this;setTimeout(function(){n.formControl.initForm(null,n.fill)}),this.fill&&(this.doubleButtonActive=this.fill.creatingNewWallet?Fp.LeftButton:Fp.RightButton,this.showNewForm=this.fill.creatingNewWallet)},n.prototype.ngOnDestroy=function(){this.synchronizedSubscription.unsubscribe()},n.prototype.changeForm=function(n){this.showNewForm=n!==Fp.RightButton,this.doubleButtonActive=n,this.fill=null,this.formControl.initForm(this.showNewForm,this.fill)},n.prototype.createWallet=function(){var n=this;this.showSafe().afterClosed().subscribe(function(t){t&&n.emitCreatedData()})},n.prototype.loadWallet=function(){var n=this;this.synchronized?this.emitCreatedData():Wc(this.dialog,{headerText:"wallet.new.synchronizing-warning-title",text:"wallet.new.synchronizing-warning-text",confirmButtonText:"wallet.new.synchronizing-warning-continue",cancelButtonText:"wallet.new.synchronizing-warning-cancel"}).afterClosed().subscribe(function(t){t&&n.emitCreatedData()})},n.prototype.useHardwareWallet=function(){var n=this,t=new oa;t.width="566px",t.autoFocus=!1,t.data=!0,this.dialog.open(ud,t).afterClosed().subscribe(function(t){t&&n.router.navigate(["/wallets"])})},n.prototype.emitCreatedData=function(){this.onLabelAndSeedCreated.emit(this.formControl.getData())},n.prototype.showSafe=function(){var n=new oa;return n.width="450px",this.dialog.open(Xb,n)},n}(),$b=l._7({encapsulation:0,styles:[[".-header[_ngcontent-%COMP%]{color:#fafafa;position:relative;margin-top:20px;margin-bottom:10px;line-height:30px;font-size:20px;text-align:center}.-description[_ngcontent-%COMP%]{line-height:25px;font-size:14px;text-align:center;color:#fafafa;mix-blend-mode:normal;opacity:.5}.hw-link[_ngcontent-%COMP%]{cursor:pointer;color:#fff;font-size:13px;line-height:20px;margin-bottom:20px}.-buttons-footer[_ngcontent-%COMP%]{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-flow:column;flex-flow:column;margin-bottom:20px}.-toggle-container[_ngcontent-%COMP%]{margin:10px auto}[_nghost-%COMP%] .-buttons-footer button{margin:2px 10px!important}.-text-align-center[_ngcontent-%COMP%]{text-align:center}label[for=seed][_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex}label[for=seed][_ngcontent-%COMP%] > span[_ngcontent-%COMP%]:last-child{-webkit-box-flex:1;-ms-flex:1;flex:1}label[for=seed][_ngcontent-%COMP%] .generators[_ngcontent-%COMP%]{text-align:right}label[for=seed][_ngcontent-%COMP%] .generators[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{cursor:pointer}label[for=seed][_ngcontent-%COMP%] .generators[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{width:13px;height:10px;font-size:13px;position:relative;top:2px}label[for=seed][_ngcontent-%COMP%] .generators[_ngcontent-%COMP%] .divider[_ngcontent-%COMP%]{padding:0 5px}"]],data:{}});function nv(n){return l._33(0,[(n()(),l._9(0,0,null,null,5,"div",[["class","row justify-content-center"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"span",[["class","hw-link"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.useHardwareWallet()&&l),l},null,null)),(n()(),l._31(3,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,3,0,l._32(t,3,0,l._22(t,4).transform("wizard.hardware-wallet-link")))})}function tv(n){return l._33(0,[l._29(402653184,1,{formControl:0}),(n()(),l._9(1,0,null,null,52,"div",[["class","onboarding-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(3,0,null,null,18,"div",[["class","row justify-content-center"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,15,"div",[["class","row-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(7,0,null,null,5,"div",[["class","-header"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(9,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(10,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,5,"div",[["class","-description"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,2,"p",[],null,null,null,null,null)),(n()(),l._31(17,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(23,0,null,null,9,"div",[["class","row justify-content-center"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(25,0,null,null,6,"div",[["class","row-container -toggle-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(27,0,null,null,3,"app-double-button",[],null,[[null,"onStateChange"]],function(n,t,e){var l=!0;return"onStateChange"===t&&(l=!1!==n.component.changeForm(e)&&l),l},M_,x_)),l._8(28,49152,null,0,Bp,[],{rightButtonText:[0,"rightButtonText"],leftButtonText:[1,"leftButtonText"],activeButton:[2,"activeButton"]},{onStateChange:"onStateChange"}),l._25(131072,De.i,[De.j,l.h]),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(34,0,null,null,7,"div",[["class","row justify-content-center"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(36,0,null,null,4,"div",[["class","row-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(38,0,null,null,1,"app-create-wallet-form",[],null,null,null,Kb,Ab)),l._8(39,245760,[[1,4],["formControl",4]],0,Gc,[Ye,fa,jc],{create:[0,"create"],onboarding:[1,"onboarding"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,nv)),l._8(44,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(46,0,null,null,6,"div",[["class","row -buttons-footer"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(48,0,null,null,3,"app-button",[["class","dark -button-min-margin"]],null,[[null,"action"]],function(n,t,e){var l=!0,r=n.component;return"action"===t&&(l=!1!==(r.showNewForm?r.createWallet():r.loadWallet())&&l),l},w_,g_)),l._8(49,49152,null,0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(50,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,28,0,l._32(t,28,0,l._22(t,29).transform("common.load")),l._32(t,28,1,l._22(t,30).transform("common.new")),e.doubleButtonActive),n(t,39,0,e.showNewForm,!0),n(t,44,0,e.hwCompatibilityActivated),n(t,49,0,!l._22(t,39).isValid)},function(n,t){n(t,10,0,l._32(t,10,0,l._22(t,11).transform("wallet.new.create-title"))),n(t,17,0,l._32(t,17,0,l._22(t,18).transform("wizard.wallet-desc"))),n(t,50,0,l._32(t,50,0,l._22(t,51).transform("wallet.new.create-button")))})}var ev=l._7({encapsulation:0,styles:[[".-header[_ngcontent-%COMP%]{color:#fafafa;position:relative;margin-top:20px;margin-bottom:10px;line-height:30px;font-size:20px;text-align:center}.-description[_ngcontent-%COMP%]{line-height:25px;font-size:14px;text-align:center;color:#fafafa;mix-blend-mode:normal;opacity:.5}.-buttons-footer[_ngcontent-%COMP%]{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-flow:column;flex-flow:column;margin-bottom:20px}.-check-container[_ngcontent-%COMP%]{margin:10px auto;text-align:center}[_nghost-%COMP%] .-buttons-footer button{margin:2px 10px!important}.-text-align-center[_ngcontent-%COMP%]{text-align:center}.-check[_ngcontent-%COMP%] .mat-checkbox-checkmark-path{position:absolute;width:18px;height:8px;left:4.59px;top:9px;stroke:#fafafa!important}.-check[_ngcontent-%COMP%] .mat-checkbox-background, .-check[_ngcontent-%COMP%] .mat-checkbox-frame{top:0;left:0;right:0;bottom:0;position:absolute;-webkit-box-sizing:border-box;box-sizing:border-box;pointer-events:none;width:20px;height:20px;background:rgba(30,34,39,.05);border-radius:6px;border-color:transparent}.-check[_ngcontent-%COMP%] span{font-family:Skycoin;line-height:normal;font-size:14px;color:#fbfbfb}.-check[_ngcontent-%COMP%] span img{width:38px;height:38px;vertical-align:middle}.-input.disable[_ngcontent-%COMP%]{background:rgba(255,255,255,.1)}.-hidden[_ngcontent-%COMP%]{display:none}"]],data:{}});function lv(n){return l._33(0,[l._29(402653184,1,{button:0}),(n()(),l._9(1,0,null,null,95,"div",[["class","onboarding-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(3,0,null,null,18,"div",[["class","row justify-content-center"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,15,"div",[["class","row-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(7,0,null,null,5,"div",[["class","-header"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(9,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(10,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,5,"div",[["class","-description"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,2,"p",[],null,null,null,null,null)),(n()(),l._31(17,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(23,0,null,null,12,"div",[["class","row justify-content-center"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(25,0,null,null,9,"div",[["class","row-container -check-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(27,0,null,null,6,"mat-checkbox",[["class","-check mat-checkbox"],["id","encrypt"],["type","checkbox"]],[[8,"id",0],[2,"mat-checkbox-indeterminate",null],[2,"mat-checkbox-checked",null],[2,"mat-checkbox-disabled",null],[2,"mat-checkbox-label-before",null]],[[null,"change"]],function(n,t,e){var l=!0;return"change"===t&&(l=!1!==n.component.setEncrypt(e)&&l),l},Ym,Em)),l._28(5120,null,to,function(n){return[n]},[ta]),l._8(29,4374528,null,0,ta,[l.l,l.h,Rr,[8,null],[2,Zs]],{id:[0,"id"],checked:[1,"checked"]},{change:"change"}),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(31,0,null,0,0,"img",[["src","../../../../../assets/img/lock-gold.png"]],null,null,null,null,null)),(n()(),l._31(32,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(37,0,null,null,43,"div",[["class","row justify-content-center"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(39,0,null,null,40,"div",[["class","row-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(41,0,null,null,37,"form",[["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,43).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,43).onReset()&&r),r},null,null)),l._8(42,16384,null,0,ts,[],null,null),l._8(43,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(45,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(47,0,null,null,14,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(49,0,null,null,2,"label",[["for","password"]],null,null,null,null,null)),(n()(),l._31(50,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(53,0,null,null,7,"input",[["class","-input"],["formControlName","password"],["id","password"],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,56)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,56).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,56)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,56)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(54,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(55,{disable:0}),l._8(56,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(58,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(60,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(63,0,null,null,14,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(65,0,null,null,2,"label",[["for","confirm"]],null,null,null,null,null)),(n()(),l._31(66,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(69,0,null,null,7,"input",[["class","-input"],["formControlName","confirm"],["id","confirm"],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown.enter"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0,i=n.component;return"input"===t&&(r=!1!==l._22(n,72)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,72).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,72)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,72)._compositionEnd(e.target.value)&&r),"keydown.enter"===t&&(r=!1!==i.emitCreatedPassword()&&r),r},null,null)),l._8(70,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(71,{disable:0}),l._8(72,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(74,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(76,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(82,0,null,null,13,"div",[["class","row -buttons-footer"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(84,0,null,null,3,"app-button",[["class","dark -button-min-margin"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.emitCreatedPassword()&&l),l},w_,g_)),l._8(85,49152,[[1,4],["button",4]],0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(86,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(89,0,null,null,5,"app-button",[["class","ghost -button-min-margin"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.emitBack()&&l),l},w_,g_)),l._8(90,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(91,{"-hidden":0}),l._8(92,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(93,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,29,0,"encrypt",!0),n(t,43,0,e.form),n(t,54,0,"-input",n(t,55,0,e.form.disabled)),n(t,58,0,"password"),n(t,70,0,"-input",n(t,71,0,e.form.disabled)),n(t,74,0,"confirm"),n(t,85,0,e.form.enabled&&!e.form.valid),n(t,90,0,"ghost -button-min-margin",n(t,91,0,e.isWorking))},function(n,t){n(t,10,0,l._32(t,10,0,l._22(t,11).transform("wallet.new.encrypt-title"))),n(t,17,0,l._32(t,17,0,l._22(t,18).transform("wizard.encrypt-desc"))),n(t,27,0,l._22(t,29).id,l._22(t,29).indeterminate,l._22(t,29).checked,l._22(t,29).disabled,"before"==l._22(t,29).labelPosition),n(t,32,0,l._32(t,32,0,l._22(t,33).transform("wallet.new.encrypt"))),n(t,41,0,l._22(t,45).ngClassUntouched,l._22(t,45).ngClassTouched,l._22(t,45).ngClassPristine,l._22(t,45).ngClassDirty,l._22(t,45).ngClassValid,l._22(t,45).ngClassInvalid,l._22(t,45).ngClassPending),n(t,50,0,l._32(t,50,0,l._22(t,51).transform("password.label"))),n(t,53,0,l._22(t,60).ngClassUntouched,l._22(t,60).ngClassTouched,l._22(t,60).ngClassPristine,l._22(t,60).ngClassDirty,l._22(t,60).ngClassValid,l._22(t,60).ngClassInvalid,l._22(t,60).ngClassPending),n(t,66,0,l._32(t,66,0,l._22(t,67).transform("password.confirm-label"))),n(t,69,0,l._22(t,76).ngClassUntouched,l._22(t,76).ngClassTouched,l._22(t,76).ngClassPristine,l._22(t,76).ngClassDirty,l._22(t,76).ngClassValid,l._22(t,76).ngClassInvalid,l._22(t,76).ngClassPending),n(t,86,0,l._32(t,86,0,l._22(t,87).transform("wizard.finish-button"))),n(t,93,0,l._32(t,93,0,l._22(t,94).transform("wizard.back-button")))})}var rv=l._7({encapsulation:0,styles:[["button[_ngcontent-%COMP%]{position:fixed;right:30px;top:10px}.flag[_ngcontent-%COMP%]{width:16px;height:16px;position:relative;top:-3px}"]],data:{}});function iv(n){return l._33(0,[(n()(),l._9(0,0,null,null,5,"button",[["class","mat-icon-button"],["mat-icon-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.changelanguage()&&l),l},i_,r_)),l._8(1,180224,null,0,Bs,[l.l,Hl,Rr],null,null),l._8(2,16384,null,0,Fs,[],null,null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(4,0,null,0,0,"img",[["class","flag"]],[[8,"src",4]],null,null,null,null)),(n()(),l._31(-1,0,["\n"]))],null,function(n,t){var e=t.component;n(t,0,0,l._22(t,1).disabled||null),n(t,4,0,"assets/img/lang/"+e.language.iconName)})}function ov(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-onboarding-create-wallet",[],null,[[null,"onLabelAndSeedCreated"]],function(n,t,e){var l=!0;return"onLabelAndSeedCreated"===t&&(l=!1!==n.component.onLabelAndSeedCreated(e)&&l),l},tv,$b)),l._8(1,245760,null,0,Zb,[fa,cp,oc,qc],{fill:[0,"fill"]},{onLabelAndSeedCreated:"onLabelAndSeedCreated"})],function(n,t){n(t,1,0,t.component.fill)},null)}function sv(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-onboarding-encrypt-wallet",[],null,[[null,"onPasswordCreated"],[null,"onBack"]],function(n,t,e){var l=!0,r=n.component;return"onPasswordCreated"===t&&(l=!1!==r.onPasswordCreated(e)&&l),"onBack"===t&&(l=!1!==r.onBack()&&l),l},lv,ev)),l._8(1,114688,[[1,4],["encryptForm",4]],0,uf,[ns],null,{onPasswordCreated:"onPasswordCreated",onBack:"onBack"})],function(n,t){n(t,1,0)},null)}function av(n){return l._33(0,[l._29(671088640,1,{encryptForm:0}),(n()(),l._4(16777216,null,null,1,null,iv)),l._8(2,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n"])),(n()(),l._4(16777216,null,null,1,null,ov)),l._8(5,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n"])),(n()(),l._4(16777216,null,null,1,null,sv)),l._8(8,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.language),n(t,5,0,1===e.step),n(t,8,0,2===e.step)},null)}var uv=l._5("app-onboarding",cf,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-onboarding",[],null,null,null,av,rv)),l._8(1,245760,null,0,cf,[cp,Sc,Bc,fa,jc],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]),cv=l._7({encapsulation:0,styles:[[".-buttons[_ngcontent-%COMP%]{text-align:center}.-paper[_ngcontent-%COMP%]{background-color:#fbfbfb;border-radius:10px;-webkit-box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);padding:30px;margin:30px}.-disabled[_ngcontent-%COMP%]{opacity:.5}"]],data:{}});function dv(n){return l._33(0,[l._29(402653184,1,{resetButton:0}),(n()(),l._9(1,0,null,null,2,"app-header",[],null,null,null,K_,D_)),l._8(2,245760,null,0,P_,[gf,nf,qc,rf,Sc],{headline:[0,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n"])),(n()(),l._9(5,0,null,null,74,"div",[["class","container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(7,0,null,null,71,"div",[["class","-paper"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(9,0,null,null,68,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,10).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,10).onReset()&&r),r},null,null)),l._8(10,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(12,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,12,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,2,"label",[["for","wallet"]],null,null,null,null,null)),(n()(),l._31(17,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(20,0,null,null,5,"input",[["class","-disabled"],["formControlName","wallet"],["id","wallet"],["readonly",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,21)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,21).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,21)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,21)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(21,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(23,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(25,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(28,0,null,null,12,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(30,0,null,null,2,"label",[["for","seed"]],null,null,null,null,null)),(n()(),l._31(31,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(34,0,null,null,5,"textarea",[["formControlName","seed"],["id","seed"],["row","2"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,35)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,35).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,35)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,35)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(35,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(37,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(39,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(42,0,null,null,12,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(44,0,null,null,2,"label",[["for","password"]],null,null,null,null,null)),(n()(),l._31(45,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(48,0,null,null,5,"input",[["formControlName","password"],["id","password"],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,49)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,49).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,49)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,49)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(49,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(51,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(53,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(56,0,null,null,12,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(58,0,null,null,2,"label",[["for","confirm"]],null,null,null,null,null)),(n()(),l._31(59,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(62,0,null,null,5,"input",[["formControlName","confirm"],["id","confirm"],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown.enter"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0,i=n.component;return"input"===t&&(r=!1!==l._22(n,63)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,63).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,63)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,63)._compositionEnd(e.target.value)&&r),"keydown.enter"===t&&(r=!1!==i.reset()&&r),r},null,null)),l._8(63,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(65,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(67,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(70,0,null,null,6,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(72,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.reset()&&l),l},w_,g_)),l._8(73,49152,[[1,4],["resetButton",4]],0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(74,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,l._32(t,2,0,l._22(t,3).transform("title.reset"))),n(t,10,0,e.form),n(t,23,0,"wallet"),n(t,37,0,"seed"),n(t,51,0,"password"),n(t,65,0,"confirm"),n(t,73,0,!e.form.valid)},function(n,t){n(t,9,0,l._22(t,12).ngClassUntouched,l._22(t,12).ngClassTouched,l._22(t,12).ngClassPristine,l._22(t,12).ngClassDirty,l._22(t,12).ngClassValid,l._22(t,12).ngClassInvalid,l._22(t,12).ngClassPending),n(t,17,0,l._32(t,17,0,l._22(t,18).transform("reset.wallet-label"))),n(t,20,0,l._22(t,25).ngClassUntouched,l._22(t,25).ngClassTouched,l._22(t,25).ngClassPristine,l._22(t,25).ngClassDirty,l._22(t,25).ngClassValid,l._22(t,25).ngClassInvalid,l._22(t,25).ngClassPending),n(t,31,0,l._32(t,31,0,l._22(t,32).transform("reset.seed-label"))),n(t,34,0,l._22(t,39).ngClassUntouched,l._22(t,39).ngClassTouched,l._22(t,39).ngClassPristine,l._22(t,39).ngClassDirty,l._22(t,39).ngClassValid,l._22(t,39).ngClassInvalid,l._22(t,39).ngClassPending),n(t,45,0,l._32(t,45,0,l._22(t,46).transform("reset.password-label"))),n(t,48,0,l._22(t,53).ngClassUntouched,l._22(t,53).ngClassTouched,l._22(t,53).ngClassPristine,l._22(t,53).ngClassDirty,l._22(t,53).ngClassValid,l._22(t,53).ngClassInvalid,l._22(t,53).ngClassPending),n(t,59,0,l._32(t,59,0,l._22(t,60).transform("reset.confirm-label"))),n(t,62,0,l._22(t,67).ngClassUntouched,l._22(t,67).ngClassTouched,l._22(t,67).ngClassPristine,l._22(t,67).ngClassDirty,l._22(t,67).ngClassValid,l._22(t,67).ngClassInvalid,l._22(t,67).ngClassPending),n(t,74,0,l._32(t,74,0,l._22(t,75).transform("reset.reset-button")))})}var hv=l._5("app-reset-password",df,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-reset-password",[],null,null,null,dv,cv)),l._8(1,180224,null,0,df,[ns,Ch,cp,Sc,jc],null,null)],null,null)},{},{},[]),pv=function(){function n(n,t,e,l){this.walletService=n,this.dialogRef=t,this.formBuilder=e,this.purchaseService=l}return n.prototype.ngOnInit=function(){this.initForm()},n.prototype.generate=function(){var n=this;this.purchaseService.generate(this.form.value.address).subscribe(function(){return n.dialogRef.close()})},n.prototype.initForm=function(){this.form=this.formBuilder.group({address:["",Xi.required]})},n}(),fv=l._7({encapsulation:0,styles:[["mat-select[_ngcontent-%COMP%]{width:100%;padding:40px 0 20px}"]],data:{}});function _v(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"mat-option",[["class","mat-option"],["role","option"]],[[1,"tabindex",0],[2,"mat-selected",null],[2,"mat-option-multiple",null],[2,"mat-active",null],[8,"id",0],[1,"aria-selected",0],[1,"aria-disabled",0],[2,"mat-option-disabled",null]],[[null,"click"],[null,"keydown"]],function(n,t,e){var r=!0;return"click"===t&&(r=!1!==l._22(n,1)._selectViaInteraction()&&r),"keydown"===t&&(r=!1!==l._22(n,1)._handleKeydown(e)&&r),r},wm,bm)),l._8(1,49152,[[1,4]],0,pr,[l.l,l.h,[2,hr],[2,cr]],{value:[0,"value"]},null),(n()(),l._31(2,0,["\n ","\n "]))],function(n,t){n(t,1,0,t.context.$implicit.address)},function(n,t){n(t,0,0,l._22(t,1)._getTabIndex(),l._22(t,1).selected,l._22(t,1).multiple,l._22(t,1).active,l._22(t,1).id,l._22(t,1).selected.toString(),l._22(t,1).disabled.toString(),l._22(t,1).disabled),n(t,2,0,t.context.$implicit.address)})}function mv(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"p",[],null,null,null,null,null)),(n()(),l._31(1,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n"])),(n()(),l._9(4,0,null,null,21,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,5).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,5).onReset()&&r),r},null,null)),l._8(5,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(7,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(9,0,null,null,15,"mat-select",[["class","input-field mat-select"],["formControlName","address"],["role","listbox"]],[[1,"id",0],[1,"tabindex",0],[1,"aria-label",0],[1,"aria-labelledby",0],[1,"aria-required",0],[1,"aria-disabled",0],[1,"aria-invalid",0],[1,"aria-owns",0],[1,"aria-multiselectable",0],[1,"aria-describedby",0],[1,"aria-activedescendant",0],[2,"mat-select-disabled",null],[2,"mat-select-invalid",null],[2,"mat-select-required",null],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown"],[null,"focus"],[null,"blur"]],function(n,t,e){var r=!0;return"keydown"===t&&(r=!1!==l._22(n,14)._handleKeydown(e)&&r),"focus"===t&&(r=!1!==l._22(n,14)._onFocus()&&r),"blur"===t&&(r=!1!==l._22(n,14)._onBlur()&&r),r},Am,Sm)),l._28(6144,null,hr,null,[Pu]),l._28(6144,null,Os,null,[Pu]),l._8(12,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[8,null]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(14,2080768,null,3,Pu,[Xr,l.h,l.B,Kl,l.l,[2,Dl],[2,Wo],[2,qo],[2,Ps],[2,uo],[8,null],Ou],{placeholder:[0,"placeholder"]},null),l._29(603979776,1,{options:1}),l._29(603979776,2,{optionGroups:1}),l._29(335544320,3,{customTrigger:0}),l._25(131072,De.i,[De.j,l.h]),l._8(19,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,1,["\n "])),(n()(),l._4(16777216,null,1,2,null,_v)),l._8(22,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),l._25(131072,nn,[l.h]),(n()(),l._31(-1,1,["\n "])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"])),(n()(),l._9(27,0,null,null,7,"div",[["class","button-line"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(29,0,null,null,4,"a",[["class","mat-raised-button"],["mat-raised-button",""]],[[1,"tabindex",0],[1,"disabled",0],[1,"aria-disabled",0]],[[null,"click"]],function(n,t,e){var r=!0,i=n.component;return"click"===t&&(r=!1!==l._22(n,30)._haltDisabledEvents(e)&&r),"click"===t&&(r=!1!==i.generate()&&r),r},s_,o_)),l._8(30,180224,null,0,Vs,[Hl,Rr,l.l],null,null),l._8(31,16384,null,0,Ns,[],null,null),(n()(),l._31(32,0,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,5,0,e.form),n(t,12,0,"address"),n(t,14,0,l._32(t,14,0,l._22(t,18).transform("buy.select-address"))),n(t,22,0,l._32(t,22,0,l._22(t,23).transform(e.walletService.allAddresses())))},function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("buy.deposit-address"))),n(t,4,0,l._22(t,7).ngClassUntouched,l._22(t,7).ngClassTouched,l._22(t,7).ngClassPristine,l._22(t,7).ngClassDirty,l._22(t,7).ngClassValid,l._22(t,7).ngClassInvalid,l._22(t,7).ngClassPending),n(t,9,1,[l._22(t,14).id,l._22(t,14).tabIndex,l._22(t,14)._ariaLabel,l._22(t,14).ariaLabelledby,l._22(t,14).required.toString(),l._22(t,14).disabled.toString(),l._22(t,14).errorState,l._22(t,14).panelOpen?l._22(t,14)._optionIds:null,l._22(t,14).multiple,l._22(t,14)._ariaDescribedby||null,l._22(t,14)._getAriaActiveDescendant(),l._22(t,14).disabled,l._22(t,14).errorState,l._22(t,14).required,l._22(t,19).ngClassUntouched,l._22(t,19).ngClassTouched,l._22(t,19).ngClassPristine,l._22(t,19).ngClassDirty,l._22(t,19).ngClassValid,l._22(t,19).ngClassInvalid,l._22(t,19).ngClassPending]),n(t,29,0,l._22(t,30).disabled?-1:0,l._22(t,30).disabled||null,l._22(t,30).disabled.toString()),n(t,32,0,l._32(t,32,0,l._22(t,33).transform("buy.generate")))})}var gv=l._5("app-add-deposit-address",pv,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-add-deposit-address",[],null,null,null,mv,fv)),l._8(1,114688,null,0,pv,[Sc,ca,ns,ef],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]),yv=function(){function n(){}return n.prototype.closePopup=function(){this.disableDismiss||this.dialog.close()},n.prototype.ngOnChanges=function(n){n.disableDismiss&&(this.dialog.disableClose=n.disableDismiss.currentValue)},n}(),bv=l._7({encapsulation:0,styles:[[".-header[_ngcontent-%COMP%]{background-color:#f7f7f7;border-top-left-radius:5px;border-top-right-radius:5px;line-height:50px;position:relative;text-align:center}.-header[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{cursor:pointer;height:32px;position:absolute;right:9px;top:9px}.-body[_ngcontent-%COMP%]{background-color:#fbfbfb;padding:0 24px}mat-dialog-content[_ngcontent-%COMP%]::after, mat-dialog-content[_ngcontent-%COMP%]::before{content:'';padding-top:24px;height:0;display:block}"]],data:{}});function vv(n){return l._33(0,[(n()(),l._9(0,0,null,null,0,"img",[["src","../../../../../assets/img/close-grey.png"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.closePopup()&&l),l},null,null))],null,null)}function wv(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"div",[["class","-header"]],null,null,null,null,null)),(n()(),l._31(1,null,["\n ","\n "])),(n()(),l._4(16777216,null,null,1,null,vv)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"])),(n()(),l._9(6,0,null,null,7,"div",[["class","-body"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,4,"mat-dialog-content",[["class","mat-dialog-content"]],null,null,null,null,null)),l._8(9,16384,null,0,_a,[],null,null),(n()(),l._31(-1,null,["\n "])),l._21(null,0),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){n(t,3,0,!t.component.disableDismiss)},function(n,t){n(t,1,0,t.component.headline)})}var xv=l._7({encapsulation:0,styles:[[".-buttons[_ngcontent-%COMP%]{text-align:center}"]],data:{}});function Mv(n){return l._33(0,[l._29(402653184,1,{formControl:0}),l._29(402653184,2,{createButton:0}),l._29(402653184,3,{cancelButton:0}),(n()(),l._9(3,0,null,null,19,"app-modal",[],null,null,null,wv,bv)),l._8(4,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"],disableDismiss:[2,"disableDismiss"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(7,0,null,0,1,"app-create-wallet-form",[],null,null,null,Kb,Ab)),l._8(8,245760,[[1,4],["formControl",4]],0,Gc,[Ye,fa,jc],{create:[0,"create"],onboarding:[1,"onboarding"]},null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(10,0,null,0,11,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,3,"app-button",[],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closePopup()&&l),l},w_,g_)),l._8(13,49152,[[3,4],["cancelButton",4]],0,Lc,[],null,{action:"action"}),(n()(),l._31(14,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(17,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.createWallet()&&l),l},w_,g_)),l._8(18,49152,[[2,4],["createButton",4]],0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(19,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,4,0,e.dialogRef,l._32(t,4,1,l._22(t,5).transform("wallet.new."+(e.data.create?"create":"load")+"-title")),e.disableDismiss),n(t,8,0,e.data.create,!1),n(t,18,0,!l._22(t,8).isValid)},function(n,t){var e=t.component;n(t,14,0,l._32(t,14,0,l._22(t,15).transform("wallet.new.cancel-button"))),n(t,19,0,l._32(t,19,0,l._22(t,20).transform("wallet.new."+(e.data.create?"create":"load")+"-button")))})}var kv=l._5("app-create-wallet",Jc,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-create-wallet",[],null,null,null,Mv,xv)),l._8(1,180224,null,0,Jc,[da,ca,Sc,fa,jc,qc],null,null)],null,null)},{},{},[]),Cv=l._7({encapsulation:0,styles:[[".content[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex}.content[_ngcontent-%COMP%] .icon-container[_ngcontent-%COMP%]{margin-right:20px}.content[_ngcontent-%COMP%] .icon-container[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%]{display:inline-block;height:36px!important;width:36px!important}.content[_ngcontent-%COMP%] .icon-container[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%] svg{height:36px!important;width:36px!important}.content[_ngcontent-%COMP%] .icon-container[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%] circle{stroke:rgba(30,34,39,.2)}.content[_ngcontent-%COMP%] .icon-container[_ngcontent-%COMP%] i[_ngcontent-%COMP%]{font-size:40px}.content[_ngcontent-%COMP%] .text-container[_ngcontent-%COMP%]{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-item-align:center;-ms-grid-row-align:center;align-self:center}.content[_ngcontent-%COMP%] .text-container[_ngcontent-%COMP%] .link[_ngcontent-%COMP%]{color:#0072ff;cursor:pointer}.content[_ngcontent-%COMP%] .text-container[_ngcontent-%COMP%] .list[_ngcontent-%COMP%]{padding:10px 0}.content[_ngcontent-%COMP%] .text-container[_ngcontent-%COMP%] .list[_ngcontent-%COMP%] .list-element[_ngcontent-%COMP%]{margin:10px 0;font-size:12px;color:#000;font-weight:700}.content[_ngcontent-%COMP%] .-red[_ngcontent-%COMP%]{color:#ff004e}.content[_ngcontent-%COMP%] .-yellow[_ngcontent-%COMP%]{color:#ffc125}.content[_ngcontent-%COMP%] .-grey[_ngcontent-%COMP%]{color:rgba(30,34,39,.2)}.content[_ngcontent-%COMP%] .-green[_ngcontent-%COMP%]{color:#00df80}.content[_ngcontent-%COMP%] .-blinking[_ngcontent-%COMP%]{-webkit-animation:1s linear infinite alert-blinking;animation:1s linear infinite alert-blinking}"]],data:{}});function Sv(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"mat-spinner",[["class","mat-spinner mat-progress-spinner"],["mode","indeterminate"],["role","progressbar"]],[[4,"width","px"],[4,"height","px"]],null,null,Pf,Lf)),l._8(1,573440,null,0,Wu,[l.l,Hl,[2,sn]],null,null)],null,function(n,t){n(t,0,0,l._22(t,1)._elementSize,l._22(t,1)._elementSize)})}function Ov(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"i",[["class","material-icons -green"]],null,null,null,null,null)),(n()(),l._31(-1,null,["done"]))],null,null)}function Tv(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"i",[["class","material-icons -red"]],null,null,null,null,null)),(n()(),l._31(-1,null,["error_outline"]))],null,null)}function Lv(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"i",[["class","material-icons -grey"]],null,null,null,null,null)),(n()(),l._31(-1,null,["usb"]))],null,null)}function Pv(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"i",[["class","material-icons -yellow"]],null,null,null,null,null)),(n()(),l._31(-1,null,["memory"]))],null,null)}function Dv(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"i",[["class","material-icons -red -blinking"]],null,null,null,null,null)),(n()(),l._31(-1,null,["error"]))],null,null)}function Av(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"i",[["class","material-icons -yellow"]],null,null,null,null,null)),(n()(),l._31(-1,null,["touch_app"]))],null,null)}function Ev(n){return l._33(0,[(n()(),l._9(0,0,null,null,22,"div",[["class","icon-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Sv)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Ov)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Tv)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Lv)),l._8(12,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Pv)),l._8(15,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Dv)),l._8(18,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Av)),l._8(21,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,e.icon==e.icons.Spinner),n(t,6,0,e.icon==e.icons.Success),n(t,9,0,e.icon==e.icons.Error),n(t,12,0,e.icon==e.icons.Usb),n(t,15,0,e.icon==e.icons.HardwareWallet),n(t,18,0,e.icon==e.icons.Warning),n(t,21,0,e.icon==e.icons.Confirm)},null)}function Yv(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,1,"span",[["class","big-text"]],null,null,null,null,null)),(n()(),l._31(3,null,["",""])),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,3,0,t.component.upperBigText)})}function jv(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["",""]))],null,function(n,t){n(t,1,0,t.component.text)})}function Iv(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"span",[["class","link"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.activateLink()&&l),l},null,null)),(n()(),l._31(1,null,["",""]))],null,function(n,t){n(t,1,0,t.component.linkText)})}function Rv(n){return l._33(0,[(n()(),l._9(0,0,null,null,14,"div",[["class","list-element"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(3,null,["\u2022 ",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,3,"span",[],null,null,null,null,null)),(n()(),l._31(7,null,[""," ",""])),l._25(131072,De.i,[De.j,l.h]),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(11,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(12,null,[""," ",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,3,0,l._32(t,3,0,l._22(t,4).transform(t.context.$implicit.coins.toString()))),n(t,7,0,l._32(t,7,0,l._22(t,8).transform("hardware-wallet.create-tx.send-p1")),l._32(t,7,1,l._22(t,9).transform(t.context.$implicit.hours.toString(),!1))),n(t,12,0,l._32(t,12,0,l._22(t,13).transform("hardware-wallet.create-tx.send-p2")),t.context.$implicit.address)})}function Hv(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"div",[["class","list"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Rv)),l._8(3,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,3,0,t.component.outputsList)},null)}function Nv(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["",""]))],null,function(n,t){n(t,1,0,t.component.lowerText)})}function Fv(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,1,"span",[["class","big-text"]],null,null,null,null,null)),(n()(),l._31(3,null,["",""])),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,3,0,t.component.lowerBigText)})}function Bv(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,1,"span",[["class","-grey"]],null,null,null,null,null)),(n()(),l._31(3,null,["",""])),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,3,0,t.component.lowerLightText)})}function Vv(n){return l._33(0,[(n()(),l._9(0,0,null,null,28,"div",[["class","content"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Ev)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,22,"div",[["class","text-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Yv)),l._8(8,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,jv)),l._8(11,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Iv)),l._8(14,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Hv)),l._8(17,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Nv)),l._8(20,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Fv)),l._8(23,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Bv)),l._8(26,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,3,0,e.icon!==e.icons.None),n(t,8,0,e.upperBigText),n(t,11,0,e.text),n(t,14,0,e.linkText),n(t,17,0,e.outputsList),n(t,20,0,e.lowerText),n(t,23,0,e.lowerBigText),n(t,26,0,e.lowerLightText)},null)}var Wv=l._7({encapsulation:0,styles:[["mat-input-container[_ngcontent-%COMP%]{width:100%}.-buttons[_ngcontent-%COMP%]{text-align:center}.info[_ngcontent-%COMP%]{margin:5px 0 25px;color:rgba(30,34,39,.5);font-size:12px;line-height:1.5}"]],data:{}});function zv(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"div",[["class","info"]],null,null,null,null,null)),(n()(),l._31(1,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("hardware-wallet.added.characters-warning")))})}function Uv(n){return l._33(0,[(n()(),l._9(0,0,null,null,39,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,zv)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,20,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,6).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,6).onReset()&&r),r},null,null)),l._8(6,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(8,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,14,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,2,"label",[["for","label"]],null,null,null,null,null)),(n()(),l._31(13,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,7,"input",[["formControlName","label"],["id","label"]],[[1,"maxlength",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown.enter"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0,i=n.component;return"input"===t&&(r=!1!==l._22(n,17)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,17).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,17)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,17)._compositionEnd(e.target.value)&&r),"keydown.enter"===t&&(r=!1!==i.rename()&&r),r},null,null)),l._8(17,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._8(18,540672,null,0,$o,[],{maxlength:[0,"maxlength"]},null),l._28(1024,null,Qi,function(n){return[n]},[$o]),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(21,671744,null,0,Xo,[[3,qi],[2,Qi],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(23,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(27,0,null,null,11,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(29,0,null,null,3,"app-button",[],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closePopup()&&l),l},w_,g_)),l._8(30,49152,null,0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(31,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(34,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.rename()&&l),l},w_,g_)),l._8(35,49152,[[1,4],["button",4]],0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(36,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,e.showCharactersWarning),n(t,6,0,e.form),n(t,18,0,e.data.wallet.isHardware?e.maxHwWalletLabelLength:null),n(t,21,0,"label"),n(t,30,0,l._22(t,35)&&l._22(t,35).isLoading()),n(t,35,0,!e.form.valid)},function(n,t){n(t,5,0,l._22(t,8).ngClassUntouched,l._22(t,8).ngClassTouched,l._22(t,8).ngClassPristine,l._22(t,8).ngClassDirty,l._22(t,8).ngClassValid,l._22(t,8).ngClassInvalid,l._22(t,8).ngClassPending),n(t,13,0,l._32(t,13,0,l._22(t,14).transform("wallet.rename.name-label"))),n(t,16,0,l._22(t,18).maxlength?l._22(t,18).maxlength:null,l._22(t,23).ngClassUntouched,l._22(t,23).ngClassTouched,l._22(t,23).ngClassPristine,l._22(t,23).ngClassDirty,l._22(t,23).ngClassValid,l._22(t,23).ngClassInvalid,l._22(t,23).ngClassPending),n(t,31,0,l._32(t,31,0,l._22(t,32).transform("wallet.rename.cancel-button"))),n(t,36,0,l._32(t,36,0,l._22(t,37).transform("wallet.rename.rename-button")))})}function Gv(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){n(t,1,0,t.component.msgIcons.Confirm,l._32(t,1,1,l._22(t,2).transform("hardware-wallet.general.confirm")))},null)}function qv(n){return l._33(0,[l._29(671088640,1,{button:0}),(n()(),l._9(1,0,null,null,9,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(2,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"],disableDismiss:[2,"disableDismiss"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,Uv)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,Gv)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.dialogRef,l._32(t,2,1,l._22(t,3).transform("wallet.rename.title")),e.button&&e.button.isLoading()||e.currentState===e.states.WaitingForConfirmation),n(t,6,0,e.currentState===e.states.Initial),n(t,9,0,e.currentState===e.states.WaitingForConfirmation)},null)}var Jv=l._5("app-change-name",nd,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-change-name",[],null,null,null,qv,Wv)),l._8(1,245760,null,0,nd,[ca,da,ns,Sc,oc,De.j,jc],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]),Qv=l._7({encapsulation:0,styles:[[".qr-container[_ngcontent-%COMP%]{text-align:center;margin-bottom:24px}.qr-container[_ngcontent-%COMP%] .qr[_ngcontent-%COMP%]{height:180px;width:180px;display:inline-block}.separator[_ngcontent-%COMP%]{background-color:rgba(30,34,39,.2);height:1px;width:100%}.data-container[_ngcontent-%COMP%]{margin:14px 0}.data-container[_ngcontent-%COMP%] .title[_ngcontent-%COMP%]{color:#171a1d}.data-container[_ngcontent-%COMP%] .data[_ngcontent-%COMP%]{color:rgba(30,34,39,.75);cursor:pointer}.data-container[_ngcontent-%COMP%] .data[_ngcontent-%COMP%] .text[_ngcontent-%COMP%]{margin-right:5px}.data-container[_ngcontent-%COMP%] .data[_ngcontent-%COMP%] .copy[_ngcontent-%COMP%]{color:rgba(30,34,39,.75);opacity:.25}.data-container[_ngcontent-%COMP%] .data[_ngcontent-%COMP%]:hover .copy[_ngcontent-%COMP%]{opacity:.75}.data-container[_ngcontent-%COMP%] .data[_ngcontent-%COMP%]:active .copy[_ngcontent-%COMP%]{opacity:1}.link[_ngcontent-%COMP%]{color:#0072ff;cursor:pointer}.link[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{padding:0;display:inline;vertical-align:middle;font-size:13px}.invalid[_ngcontent-%COMP%]{color:#ff004e}"]],data:{}});function Kv(n){return l._33(0,[(n()(),l._9(0,0,null,null,11,"div",[["class","data-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"div",[["class","title"]],null,null,null,null,null)),(n()(),l._31(3,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,4,"div",[["class","data"]],null,[[null,"click"]],function(n,t,e){var l=!0,r=n.component;return"click"===t&&(l=!1!==r.copyText(r.currentQrContent)&&l),l},null,null)),(n()(),l._9(7,0,null,null,1,"span",[["class","text"]],null,null,null,null,null)),(n()(),l._31(8,null,["",""])),(n()(),l._9(9,0,null,null,1,"span",[["class","fa copy"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\uf0c5"])),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){var e=t.component;n(t,3,0,l._32(t,3,0,l._22(t,4).transform("qr.data"))),n(t,8,0,e.currentQrContent)})}function Xv(n){return l._33(0,[(n()(),l._9(0,0,null,null,5,"div",[["class","link"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.startShowingForm()&&l),l},null,null)),(n()(),l._31(1,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(3,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(4,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["keyboard_arrow_down"]))],function(n,t){n(t,4,0)},function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("qr.request-link")))})}function Zv(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"span",[["class","invalid"]],null,null,null,null,null)),(n()(),l._31(1,null,["",""])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("qr.invalid")))})}function $v(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"span",[["class","invalid"]],null,null,null,null,null)),(n()(),l._31(1,null,["",""])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("qr.invalid")))})}function nw(n){return l._33(0,[(n()(),l._9(0,0,null,null,58,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,1).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,1).onReset()&&r),r},null,null)),l._8(1,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(3,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,17,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(7,0,null,null,5,"label",[["for","coins"]],null,null,null,null,null)),(n()(),l._31(8,null,["\n "," "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._4(16777216,null,null,1,null,Zv)),l._8(11,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,7,"input",[["formControlName","coins"],["id","coins"],["maxlength","20"]],[[1,"maxlength",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,15)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,15).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,15)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,15)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(15,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._8(16,540672,null,0,$o,[],{maxlength:[0,"maxlength"]},null),l._28(1024,null,Qi,function(n){return[n]},[$o]),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(19,671744,null,0,Xo,[[3,qi],[2,Qi],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(21,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(24,0,null,null,17,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(26,0,null,null,5,"label",[["for","hours"]],null,null,null,null,null)),(n()(),l._31(27,null,["\n "," "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._4(16777216,null,null,1,null,$v)),l._8(30,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(33,0,null,null,7,"input",[["formControlName","hours"],["id","hours"],["maxlength","20"]],[[1,"maxlength",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,34)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,34).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,34)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,34)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(34,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._8(35,540672,null,0,$o,[],{maxlength:[0,"maxlength"]},null),l._28(1024,null,Qi,function(n){return[n]},[$o]),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(38,671744,null,0,Xo,[[3,qi],[2,Qi],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(40,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(43,0,null,null,14,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(45,0,null,null,2,"label",[["for","note"]],null,null,null,null,null)),(n()(),l._31(46,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(49,0,null,null,7,"input",[["formControlName","note"],["id","note"],["maxlength","100"]],[[1,"maxlength",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,50)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,50).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,50)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,50)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(50,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._8(51,540672,null,0,$o,[],{maxlength:[0,"maxlength"]},null),l._28(1024,null,Qi,function(n){return[n]},[$o]),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(54,671744,null,0,Xo,[[3,qi],[2,Qi],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(56,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,1,0,e.form),n(t,11,0,e.invalidCoins),n(t,16,0,"20"),n(t,19,0,"coins"),n(t,30,0,e.invalidHours),n(t,35,0,"20"),n(t,38,0,"hours"),n(t,51,0,"100"),n(t,54,0,"note")},function(n,t){n(t,0,0,l._22(t,3).ngClassUntouched,l._22(t,3).ngClassTouched,l._22(t,3).ngClassPristine,l._22(t,3).ngClassDirty,l._22(t,3).ngClassValid,l._22(t,3).ngClassInvalid,l._22(t,3).ngClassPending),n(t,8,0,l._32(t,8,0,l._22(t,9).transform("qr.amount"))),n(t,14,0,l._22(t,16).maxlength?l._22(t,16).maxlength:null,l._22(t,21).ngClassUntouched,l._22(t,21).ngClassTouched,l._22(t,21).ngClassPristine,l._22(t,21).ngClassDirty,l._22(t,21).ngClassValid,l._22(t,21).ngClassInvalid,l._22(t,21).ngClassPending),n(t,27,0,l._32(t,27,0,l._22(t,28).transform("qr.hours"))),n(t,33,0,l._22(t,35).maxlength?l._22(t,35).maxlength:null,l._22(t,40).ngClassUntouched,l._22(t,40).ngClassTouched,l._22(t,40).ngClassPristine,l._22(t,40).ngClassDirty,l._22(t,40).ngClassValid,l._22(t,40).ngClassInvalid,l._22(t,40).ngClassPending),n(t,46,0,l._32(t,46,0,l._22(t,47).transform("qr.message"))),n(t,49,0,l._22(t,51).maxlength?l._22(t,51).maxlength:null,l._22(t,56).ngClassUntouched,l._22(t,56).ngClassTouched,l._22(t,56).ngClassPristine,l._22(t,56).ngClassDirty,l._22(t,56).ngClassValid,l._22(t,56).ngClassInvalid,l._22(t,56).ngClassPending)})}function tw(n){return l._33(0,[l._29(402653184,1,{qr:0}),(n()(),l._9(1,0,null,null,32,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(2,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(5,0,null,0,3,"div",[["class","qr-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(7,0,[[1,0],["qr",1]],null,0,"div",[["class","qr"],["id","qr"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(10,0,null,0,0,"div",[["class","separator"]],null,null,null,null,null)),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,Kv)),l._8(13,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(15,0,null,0,11,"div",[["class","data-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(17,0,null,null,2,"div",[["class","title"]],null,null,null,null,null)),(n()(),l._31(18,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(21,0,null,null,4,"div",[["class","data"]],null,[[null,"click"]],function(n,t,e){var l=!0,r=n.component;return"click"===t&&(l=!1!==r.copyText(r.data.address)&&l),l},null,null)),(n()(),l._9(22,0,null,null,1,"span",[["class","text"]],null,null,null,null,null)),(n()(),l._31(23,null,["",""])),(n()(),l._9(24,0,null,null,1,"span",[["class","fa copy"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\uf0c5"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,Xv)),l._8(29,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,nw)),l._8(32,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.dialogRef,l._32(t,2,1,l._22(t,3).transform(e.data.hideCoinRequestForm?"qr.title-read-only":"qr.title"))),n(t,13,0,!e.data.ignoreCoinPrefix||!e.data.hideCoinRequestForm),n(t,29,0,!e.showForm&&!e.data.hideCoinRequestForm),n(t,32,0,e.showForm)},function(n,t){var e=t.component;n(t,18,0,l._32(t,18,0,l._22(t,19).transform("qr.address"))),n(t,23,0,e.data.address)})}var ew=l._5("app-qr-code",qp,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-qr-code",[],null,null,null,tw,Qv)),l._8(1,245760,null,0,qp,[da,ca,ns,jc],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]),lw=l._7({encapsulation:0,styles:[[""]],data:{}});function rw(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"app-modal",[],null,null,null,wv,bv)),l._8(1,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(4,0,null,0,2,"app-transaction-info",[],null,null,null,Sg,cg)),l._8(5,245760,null,0,ug,[rf,fa],{transaction:[0,"transaction"],isPreview:[1,"isPreview"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n"]))],function(n,t){var e=t.component;n(t,1,0,e.dialogRef,l._32(t,1,1,l._22(t,2).transform("history.tx-detail"))),n(t,5,0,e.transaction,!1)},null)}var iw=l._5("app-transaction-detail",of,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-transaction-detail",[],null,null,null,rw,lw)),l._8(1,49152,null,0,of,[da,ca],null,null)],null,null)},{},{},[]),ow=l._7({encapsulation:0,styles:[[".-safe-description[_ngcontent-%COMP%]{font-family:Skycoin;line-height:20px;font-size:12px;color:#1e2227;mix-blend-mode:normal;opacity:.8}.-check-container[_ngcontent-%COMP%]{text-align:center;margin-top:50px}.-safe-check-text[_ngcontent-%COMP%]{font-family:Skycoin;line-height:normal;font-size:14px;color:#1e2227}.-check[_ngcontent-%COMP%] .mat-checkbox-checkmark-path{position:absolute;width:18px;height:8px;left:4.59px;top:9px;stroke:#0072ff!important}.-check[_ngcontent-%COMP%] .mat-checkbox-background, .-check[_ngcontent-%COMP%] .mat-checkbox-frame{top:0;left:0;right:0;bottom:0;position:absolute;-webkit-box-sizing:border-box;box-sizing:border-box;pointer-events:none;width:20px;height:20px;background:rgba(30,34,39,.05);border-radius:6px;border-color:transparent}.-text-center[_ngcontent-%COMP%]{text-align:center}.-no-bottom-margin[_ngcontent-%COMP%] button{margin:28px 10px 0!important}.-title[_ngcontent-%COMP%]{font-family:Skycoin;line-height:30px;font-size:14px;text-align:center;letter-spacing:.0769231em;color:#ff004e}"]],data:{}});function sw(n){return l._33(0,[(n()(),l._9(0,0,null,null,27,"app-modal",[["class","-title"]],null,null,null,wv,bv)),l._8(1,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(4,0,null,0,14,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,2,"span",[["class","-safe-description"]],null,null,null,null,null)),(n()(),l._31(7,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,7,"div",[["class","-check-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,4,"mat-checkbox",[["class","-safe-check-text -check mat-checkbox"],["id","terms"],["type","checkbox"]],[[8,"id",0],[2,"mat-checkbox-indeterminate",null],[2,"mat-checkbox-checked",null],[2,"mat-checkbox-disabled",null],[2,"mat-checkbox-label-before",null]],[[null,"change"]],function(n,t,e){var l=!0;return"change"===t&&(l=!1!==n.component.setAccept(e)&&l),l},Ym,Em)),l._28(5120,null,to,function(n){return[n]},[ta]),l._8(14,4374528,null,0,ta,[l.l,l.h,Rr,[8,null],[2,Zs]],{id:[0,"id"],checked:[1,"checked"]},{change:"change"}),(n()(),l._31(15,0,["","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(20,0,null,0,6,"div",[["class","-text-center"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(22,0,null,null,3,"app-button",[["class","primary -no-bottom-margin"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closePopup()&&l),l},w_,g_)),l._8(23,49152,null,0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(24,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,1,0,e.dialogRef,l._32(t,1,1,l._22(t,2).transform("wizard.confirm.title"))),n(t,14,0,"terms",e.acceptSafe),n(t,23,0,!e.acceptSafe)},function(n,t){n(t,7,0,l._32(t,7,0,l._22(t,8).transform("wizard.confirm.desc"))),n(t,12,0,l._22(t,14).id,l._22(t,14).indeterminate,l._22(t,14).checked,l._22(t,14).disabled,"before"==l._22(t,14).labelPosition),n(t,15,0,l._32(t,15,0,l._22(t,16).transform("wizard.confirm.checkbox"))),n(t,24,0,l._32(t,24,0,l._22(t,25).transform("wizard.confirm.button")))})}var aw=l._5("app-onboarding-safeguard",Xb,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-onboarding-safeguard",[],null,null,null,sw,ow)),l._8(1,49152,null,0,Xb,[ca],null,null)],null,null)},{},{},[]),uw=l._7({encapsulation:0,styles:[[".-buttons[_ngcontent-%COMP%]{text-align:center}.-info[_ngcontent-%COMP%]{margin:5px 0 25px;color:rgba(30,34,39,.5);font-size:12px;line-height:1.5}.-warning[_ngcontent-%COMP%]{color:#ff004e}.link[_ngcontent-%COMP%]{font-size:13px;width:100%;display:inline-block;text-align:center;text-decoration:none;color:#0072ff}"]],data:{}});function cw(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"p",[["class","-info"]],null,null,null,null,null)),l._8(1,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(2,{"-warning":0}),(n()(),l._31(3,null,["",""])),l._25(131072,De.i,[De.j,l.h])],function(n,t){n(t,1,0,"-info",n(t,2,0,t.component.data.warning))},function(n,t){var e=t.component;n(t,3,0,l._32(t,3,0,l._22(t,4).transform(e.data.description)))})}function dw(n){return l._33(0,[(n()(),l._9(0,0,null,null,13,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"label",[["for","confirm_password"]],null,null,null,null,null)),(n()(),l._31(3,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,6,"input",[["appDontSavePassword",""],["formControlName","confirm_password"],["id","confirm_password"],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown.enter"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"focus"]],function(n,t,e){var r=!0,i=n.component;return"input"===t&&(r=!1!==l._22(n,7)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,7).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,7)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,7)._compositionEnd(e.target.value)&&r),"focus"===t&&(r=!1!==l._22(n,12).onFocus()&&r),"keydown.enter"===t&&(r=!1!==i.proceed()&&r),r},null,null)),l._8(7,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(9,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(11,16384,null,0,Eo,[uo],null,null),l._8(12,16384,null,0,Db,[l.l],null,null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,9,0,"confirm_password")},function(n,t){n(t,3,0,l._32(t,3,0,l._22(t,4).transform("password.confirm-label"))),n(t,6,0,l._22(t,11).ngClassUntouched,l._22(t,11).ngClassTouched,l._22(t,11).ngClassPristine,l._22(t,11).ngClassDirty,l._22(t,11).ngClassValid,l._22(t,11).ngClassInvalid,l._22(t,11).ngClassPending)})}function hw(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"a",[["class","link"]],[[8,"href",4]],null,null,null,null)),l._8(1,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._26(2,{"element-disabled":0}),(n()(),l._31(3,null,["",""])),l._25(131072,De.i,[De.j,l.h])],function(n,t){n(t,1,0,"link",n(t,2,0,t.component.working))},function(n,t){n(t,0,0,"#/reset/"+t.component.data.wallet.filename),n(t,3,0,l._32(t,3,0,l._22(t,4).transform("password.reset-link")))})}function pw(n){return l._33(0,[l._29(402653184,1,{button:0}),(n()(),l._9(1,0,null,null,42,"app-modal",[],null,null,null,wv,bv)),l._8(2,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"],disableDismiss:[2,"disableDismiss"]},null),l._25(131072,De.i,[De.j,l.h]),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,cw)),l._8(7,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(9,0,null,0,22,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,10).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,10).onReset()&&r),r},null,null)),l._8(10,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(12,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(14,0,null,null,13,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,2,"label",[["for","password"]],null,null,null,null,null)),(n()(),l._31(17,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(20,0,null,null,6,"input",[["appDontSavePassword",""],["formControlName","password"],["id","password"],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown.enter"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"focus"]],function(n,t,e){var r=!0,i=n.component;return"input"===t&&(r=!1!==l._22(n,21)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,21).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,21)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,21)._compositionEnd(e.target.value)&&r),"focus"===t&&(r=!1!==l._22(n,26).onFocus()&&r),"keydown.enter"===t&&(r=!1!==i.proceed()&&r),r},null,null)),l._8(21,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(23,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(25,16384,null,0,Eo,[uo],null,null),l._8(26,16384,null,0,Db,[l.l],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,dw)),l._8(30,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,hw)),l._8(34,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(36,0,null,0,6,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(38,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.proceed()&&l),l},w_,g_)),l._8(39,49152,[[1,4],["button",4]],0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(40,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.dialogRef,l._32(t,2,1,e.data.title?l._22(t,3).transform(e.data.title):l._22(t,4).transform("password.title")),e.working),n(t,7,0,e.data.description),n(t,10,0,e.form),n(t,23,0,"password"),n(t,30,0,e.data.confirm),n(t,34,0,e.data.wallet),n(t,39,0,!e.form.valid)},function(n,t){n(t,9,0,l._22(t,12).ngClassUntouched,l._22(t,12).ngClassTouched,l._22(t,12).ngClassPristine,l._22(t,12).ngClassDirty,l._22(t,12).ngClassValid,l._22(t,12).ngClassInvalid,l._22(t,12).ngClassPending),n(t,17,0,l._32(t,17,0,l._22(t,18).transform("password.label"))),n(t,20,0,l._22(t,25).ngClassUntouched,l._22(t,25).ngClassTouched,l._22(t,25).ngClassPristine,l._22(t,25).ngClassDirty,l._22(t,25).ngClassValid,l._22(t,25).ngClassInvalid,l._22(t,25).ngClassPending),n(t,40,0,l._32(t,40,0,l._22(t,41).transform("password.button")))})}var fw=l._5("app-password-dialog",Zp,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-password-dialog",[],null,null,null,pw,uw)),l._8(1,245760,null,0,Zp,[da,ca,jc,De.j],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]),_w=l._7({encapsulation:0,styles:[[".-buttons[_ngcontent-%COMP%]{text-align:center}"]],data:{}});function mw(n){return l._33(0,[(n()(),l._9(0,0,null,null,21,"app-modal",[],null,null,null,wv,bv)),l._8(1,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(4,0,null,0,8,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,2,"label",[["for","seed"]],null,null,null,null,null)),(n()(),l._31(7,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,1,"textarea",[["id","seed"],["readonly",""]],null,null,null,null,null)),(n()(),l._31(11,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(14,0,null,0,6,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,3,"app-button",[],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.dialogRef.close()&&l),l},w_,g_)),l._8(17,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(18,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){n(t,1,0,t.component.dialogRef,l._32(t,1,1,l._22(t,2).transform("title.seed")))},function(n,t){var e=t.component;n(t,7,0,l._32(t,7,0,l._22(t,8).transform("backup.seed"))),n(t,11,0,e.data.seed),n(t,18,0,l._32(t,18,0,l._22(t,19).transform("backup.close-button")))})}var gw=l._5("app-seed-modal",Xp,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-seed-modal",[],null,null,null,mw,_w)),l._8(1,180224,null,0,Xp,[da,ca],null,null)],null,null)},{},{},[]),yw=l._7({encapsulation:0,styles:[["mat-input-container[_ngcontent-%COMP%]{width:100%}.-buttons[_ngcontent-%COMP%]{text-align:center}"]],data:{}});function bw(n){return l._33(0,[l._29(402653184,1,{button:0}),(n()(),l._9(1,0,null,null,37,"app-modal",[],null,null,null,wv,bv)),l._8(2,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"],disableDismiss:[2,"disableDismiss"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(5,0,null,0,19,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,6).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,6).onReset()&&r),r},null,null)),l._8(6,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(8,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,13,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,2,"label",[["for","quantity"]],null,null,null,null,null)),(n()(),l._31(13,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,6,"input",[["formControlName","quantity"],["id","quantity"],["max","100"],["min","1"],["type","number"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown.enter"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"change"]],function(n,t,e){var r=!0,i=n.component;return"input"===t&&(r=!1!==l._22(n,17)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,17).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,17)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,17)._compositionEnd(e.target.value)&&r),"change"===t&&(r=!1!==l._22(n,18).onChange(e.target.value)&&r),"input"===t&&(r=!1!==l._22(n,18).onChange(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,18).onTouched()&&r),"keydown.enter"===t&&(r=!1!==i.continue()&&r),r},null,null)),l._8(17,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._8(18,16384,null,0,so,[l.G,l.l],null,null),l._28(1024,null,to,function(n,t){return[n,t]},[ro,so]),l._8(20,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(22,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(26,0,null,0,11,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(28,0,null,null,3,"app-button",[],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closePopup()&&l),l},w_,g_)),l._8(29,49152,null,0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(30,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(33,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.continue()&&l),l},w_,g_)),l._8(34,49152,[[1,4],["button",4]],0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(35,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.dialogRef,l._32(t,2,1,l._22(t,3).transform("wallet.add-addresses.title")),l._22(t,34).isLoading()),n(t,6,0,e.form),n(t,20,0,"quantity"),n(t,29,0,l._22(t,34)&&l._22(t,34).isLoading()),n(t,34,0,!e.form.valid)},function(n,t){n(t,5,0,l._22(t,8).ngClassUntouched,l._22(t,8).ngClassTouched,l._22(t,8).ngClassPristine,l._22(t,8).ngClassDirty,l._22(t,8).ngClassValid,l._22(t,8).ngClassInvalid,l._22(t,8).ngClassPending),n(t,13,0,l._32(t,13,0,l._22(t,14).transform("wallet.add-addresses.name-quantity"))),n(t,16,0,l._22(t,22).ngClassUntouched,l._22(t,22).ngClassTouched,l._22(t,22).ngClassPristine,l._22(t,22).ngClassDirty,l._22(t,22).ngClassValid,l._22(t,22).ngClassInvalid,l._22(t,22).ngClassPending),n(t,30,0,l._32(t,30,0,l._22(t,31).transform("wallet.add-addresses.cancel-button"))),n(t,35,0,l._32(t,35,0,l._22(t,36).transform("wallet.add-addresses.create-button")))})}var vw=l._5("app-number-of-addresses",Nf,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-number-of-addresses",[],null,null,null,bw,yw)),l._8(1,245760,null,0,Nf,[da,ca,jc],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]),ww=l._7({encapsulation:0,styles:[["button[_ngcontent-%COMP%]{width:100%;text-align:left;padding:10px;border-bottom:1px solid #eff0f0}.wallet-container[_ngcontent-%COMP%]{padding-top:30px;margin:0 -10px}.wallet-container[_ngcontent-%COMP%]:first-child{padding-top:0}.wallet-container[_ngcontent-%COMP%] .title[_ngcontent-%COMP%]{color:#171a1d;border-bottom:1px solid #eff0f0;padding:0 10px;font-size:18px;line-height:32px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.wallet-container[_ngcontent-%COMP%] .address[_ngcontent-%COMP%]{font-size:13px;line-height:22px;color:#171a1d}.wallet-container[_ngcontent-%COMP%] .balance[_ngcontent-%COMP%]{font-size:12px;line-height:18px;color:#171a1d}.wallet-container[_ngcontent-%COMP%] .balance[_ngcontent-%COMP%] .grey[_ngcontent-%COMP%]{color:rgba(30,34,39,.5)}"]],data:{}});function xw(n){return l._33(0,[(n()(),l._9(0,0,null,null,19,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.select(n.context.$implicit.address)&&l),l},i_,r_)),l._8(1,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(2,16384,null,0,Hs,[],null,null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(4,0,null,0,1,"div",[["class","address"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(7,0,null,0,11,"div",[["class","balance"]],null,null,null,null,null)),(n()(),l._31(8,null,["","\n "])),l._25(0,If,[tn,qc,gf]),(n()(),l._9(10,0,null,null,2,"span",[["class","grey"]],null,null,null,null,null)),(n()(),l._31(11,null,[""," | "])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(13,null,["\n ","\n "])),l._25(0,If,[tn,qc,gf]),(n()(),l._9(15,0,null,null,2,"span",[["class","grey"]],null,null,null,null,null)),(n()(),l._31(16,null,["",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n "]))],function(n,t){n(t,1,0,"primary")},function(n,t){n(t,0,0,l._22(t,1).disabled||null),n(t,5,0,t.context.$implicit.address),n(t,8,0,l._32(t,8,0,l._22(t,9).transform(t.context.$implicit.coins.toString(),!0,"first"))),n(t,11,0,l._32(t,11,0,l._22(t,12).transform(t.context.$implicit.coins.toString(),!0,"last"))),n(t,13,0,l._32(t,13,0,l._22(t,14).transform(t.context.$implicit.hours.toString(),!1,"first"))),n(t,16,0,l._32(t,16,0,l._22(t,17).transform(t.context.$implicit.hours.toString(),!1,"last")))})}function Mw(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"div",[["class","wallet-container select-address-theme"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,1,"div",[["class","title"]],[[8,"title",0]],null,null,null,null)),(n()(),l._31(3,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,xw)),l._8(6,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,6,0,t.context.$implicit.addresses)},function(n,t){n(t,2,0,l._12(1,"",t.context.$implicit.label,"")),n(t,3,0,t.context.$implicit.label)})}function kw(n){return l._33(0,[(n()(),l._9(0,0,null,null,6,"app-modal",[],null,null,null,wv,bv)),l._8(1,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,Mw)),l._8(5,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,1,0,e.dialogRef,l._32(t,1,1,l._22(t,2).transform("title.select-address"))),n(t,5,0,e.wallets)},null)}var Cw=l._5("app-select-address",Rm,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-select-address",[],null,null,null,kw,ww)),l._8(1,49152,null,0,Rm,[ca,Sc],null,null)],null,null)},{},{},[]),Sw=l._7({encapsulation:0,styles:[[".alert-box[_ngcontent-%COMP%]{margin-top:25px}.options-label[_ngcontent-%COMP%]{color:#171a1d;margin-top:25px;margin-bottom:10px;font-weight:700}.option-buttons-container[_ngcontent-%COMP%]{margin:0 -10px}.option-buttons-container[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{width:100%;text-align:left;padding:10px;border-bottom:1px solid #eff0f0}.option-buttons-container[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:first-child{border-top:1px solid #eff0f0}.option-buttons-container[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .label[_ngcontent-%COMP%]{font-size:13px;line-height:22px;color:#171a1d}.option-buttons-container[_ngcontent-%COMP%] button[_ngcontent-%COMP%] .-red[_ngcontent-%COMP%]{color:#ff004e}.-blinking[_ngcontent-%COMP%]{-webkit-animation:1s linear infinite alert-blinking;animation:1s linear infinite alert-blinking}"]],data:{}});function Ow(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){var e=t.component;n(t,1,0,e.result.icon,l._32(t,1,1,l._22(t,2).transform(e.result.text)))},null)}function Tw(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"app-hw-message",[],null,[[null,"linkClicked"]],function(n,t,e){var l=!0;return"linkClicked"===t&&(l=!1!==n.component.wipe()&&l),l},Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"],linkText:[2,"linkText"]},{linkClicked:"linkClicked"}),l._25(131072,De.i,[De.j,l.h]),l._25(131072,De.i,[De.j,l.h]),l._25(131072,De.i,[De.j,l.h])],function(n,t){n(t,1,0,t.component.msgIcons.Error,l._32(t,1,1,l._22(t,2).transform("hardware-wallet.general.refused"))+" "+l._32(t,1,1,l._22(t,3).transform("hardware-wallet.options.forgotten-pin1")),l._32(t,1,2,l._22(t,4).transform("hardware-wallet.options.forgotten-pin2")))},null)}function Lw(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"app-hw-message",[],null,[[null,"linkClicked"]],function(n,t,e){var l=!0;return"linkClicked"===t&&(l=!1!==n.component.wipe()&&l),l},Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"],linkText:[2,"linkText"]},{linkClicked:"linkClicked"}),l._25(131072,De.i,[De.j,l.h]),l._25(131072,De.i,[De.j,l.h]),l._25(131072,De.i,[De.j,l.h])],function(n,t){n(t,1,0,t.component.msgIcons.Error,l._32(t,1,1,l._22(t,2).transform("hardware-wallet.general.error-incorrect-pin"))+" "+l._32(t,1,1,l._22(t,3).transform("hardware-wallet.options.forgotten-pin1")),l._32(t,1,2,l._22(t,4).transform("hardware-wallet.options.forgotten-pin2")))},null)}function Pw(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"],upperBigText:[2,"upperBigText"],lowerLightText:[3,"lowerLightText"]},null),l._25(131072,De.i,[De.j,l.h]),l._25(131072,De.i,[De.j,l.h]),l._25(131072,De.i,[De.j,l.h])],function(n,t){var e=t.component;n(t,1,0,e.msgIcons.HardwareWallet,l._32(t,1,1,l._22(t,2).transform("hardware-wallet.options.unconfigured-detected")),l._32(t,1,2,l._22(t,3).transform("hardware-wallet.options.unconfigured-detected-title")),l._32(t,1,3,l._22(t,4).transform("hardware-wallet.options.firmware-version"))+" "+e.firmwareVersion)},null)}function Dw(n){return l._33(0,[(n()(),l._9(0,0,null,null,3,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"],lowerBigText:[2,"lowerBigText"],lowerLightText:[3,"lowerLightText"]},null),l._25(131072,De.i,[De.j,l.h]),l._25(131072,De.i,[De.j,l.h])],function(n,t){var e=t.component;n(t,1,0,e.msgIcons.HardwareWallet,l._32(t,1,1,l._22(t,2).transform("hardware-wallet.options.configured-detected")),e.walletName,l._32(t,1,3,l._22(t,3).transform("hardware-wallet.options.firmware-version"))+" "+e.firmwareVersion)},null)}function Aw(n){return l._33(0,[(n()(),l._9(0,0,null,null,0,"br",[],null,null,null,null,null))],null,null)}function Ew(n){return l._33(0,[(n()(),l._9(0,0,null,null,8,null,null,null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"div",[],null,null,null,null,null)),(n()(),l._31(3,null,[""," ",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Aw)),l._8(7,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,7,0,t.context.index1?t.context.index+1+")":"",l._32(t,3,1,l._22(t,4).transform(t.context.$implicit)))})}function Yw(n){return l._33(0,[(n()(),l._9(0,0,null,null,15,"div",[["class","alert-box"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(3,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["error"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,8,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,2,"div",[["class","title"]],null,null,null,null,null)),(n()(),l._31(9,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Ew)),l._8(13,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0),n(t,13,0,e.securityWarnings)},function(n,t){var e=t.component;n(t,9,0,l._32(t,9,0,l._22(t,10).transform(e.securityWarnings.length>1?"hardware-wallet.options.security-warnings-title":"hardware-wallet.options.security-warning-title")))})}function jw(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.update()&&l),l},i_,r_)),l._8(1,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(2,16384,null,0,Hs,[],null,null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(4,0,null,0,2,"div",[["class","label -blinking"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "]))],function(n,t){n(t,1,0,"primary")},function(n,t){n(t,0,0,l._22(t,1).disabled||null),n(t,5,0,l._32(t,5,0,l._22(t,6).transform("hardware-wallet.options.update-firmware")))})}function Iw(n){return l._33(0,[(n()(),l._9(0,0,null,null,19,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,7,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.generateMnemonic()&&l),l},i_,r_)),l._8(3,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(4,16384,null,0,Hs,[],null,null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(6,0,null,0,2,"div",[["class","label"]],null,null,null,null,null)),(n()(),l._31(7,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(11,0,null,null,7,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.restoreMnemonic()&&l),l},i_,r_)),l._8(12,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(13,16384,null,0,Hs,[],null,null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(15,0,null,0,2,"div",[["class","label"]],null,null,null,null,null)),(n()(),l._31(16,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,3,0,"primary"),n(t,12,0,"primary")},function(n,t){n(t,2,0,l._22(t,3).disabled||null),n(t,7,0,l._32(t,7,0,l._22(t,8).transform("hardware-wallet.options.configure-automatically"))),n(t,11,0,l._22(t,12).disabled||null),n(t,16,0,l._32(t,16,0,l._22(t,17).transform("hardware-wallet.options.restore-backup")))})}function Rw(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.backup()&&l),l},i_,r_)),l._8(1,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(2,16384,null,0,Hs,[],null,null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(4,0,null,0,2,"div",[["class","label"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "]))],function(n,t){n(t,1,0,"primary")},function(n,t){n(t,0,0,l._22(t,1).disabled||null),n(t,5,0,l._32(t,5,0,l._22(t,6).transform("hardware-wallet.options.create-backup")))})}function Hw(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.confirmSeed()&&l),l},i_,r_)),l._8(1,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(2,16384,null,0,Hs,[],null,null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(4,0,null,0,2,"div",[["class","label"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "]))],function(n,t){n(t,1,0,"primary")},function(n,t){n(t,0,0,l._22(t,1).disabled||null),n(t,5,0,l._32(t,5,0,l._22(t,6).transform("hardware-wallet.options.confirm-seed")))})}function Nw(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.removePin()&&l),l},i_,r_)),l._8(1,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(2,16384,null,0,Hs,[],null,null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(4,0,null,0,2,"div",[["class","label -red"]],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "]))],function(n,t){n(t,1,0,"primary")},function(n,t){n(t,0,0,l._22(t,1).disabled||null),n(t,5,0,l._32(t,5,0,l._22(t,6).transform("hardware-wallet.options.delete-pin")))})}function Fw(n){return l._33(0,[(n()(),l._9(0,0,null,null,28,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Rw)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Hw)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,7,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.changePin()&&l),l},i_,r_)),l._8(9,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(10,16384,null,0,Hs,[],null,null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(12,0,null,0,2,"div",[["class","label"]],null,null,null,null,null)),(n()(),l._31(13,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Nw)),l._8(18,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(20,0,null,null,7,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.wipe()&&l),l},i_,r_)),l._8(21,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(22,16384,null,0,Hs,[],null,null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(24,0,null,0,2,"div",[["class","label -red"]],null,null,null,null,null)),(n()(),l._31(25,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,e.needsBackup),n(t,6,0,!e.needsBackup),n(t,9,0,"primary"),n(t,18,0,!e.needsPin),n(t,21,0,"primary")},function(n,t){var e=t.component;n(t,8,0,l._22(t,9).disabled||null),n(t,13,0,l._32(t,13,0,l._22(t,14).transform(e.needsPin?"hardware-wallet.options.create-pin":"hardware-wallet.options.change-pin"))),n(t,20,0,l._22(t,21).disabled||null),n(t,25,0,l._32(t,25,0,l._22(t,26).transform("hardware-wallet.options.wipe")))})}function Bw(n){return l._33(0,[(n()(),l._9(0,0,null,null,26,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Pw)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,Dw)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,Yw)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(11,0,null,null,2,"div",[["class","options-label"]],null,null,null,null,null)),(n()(),l._31(12,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(15,0,null,null,10,"div",[["class","option-buttons-container select-address-theme"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,jw)),l._8(18,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Iw)),l._8(21,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Fw)),l._8(24,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,e.newWalletConnected),n(t,6,0,!e.newWalletConnected),n(t,9,0,e.securityWarnings.length>0),n(t,18,0,e.outdatedFirmware),n(t,21,0,e.newWalletConnected),n(t,24,0,!e.newWalletConnected)},function(n,t){n(t,12,0,l._32(t,12,0,l._22(t,13).transform("hardware-wallet.options.options")))})}function Vw(n){return l._33(0,[(n()(),l._9(0,0,null,null,6,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal()&&l),l},w_,g_)),l._8(3,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(4,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,4,0,l._32(t,4,0,l._22(t,5).transform("hardware-wallet.general.close")))})}function Ww(n){return l._33(0,[(n()(),l._9(0,0,null,null,6,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal()&&l),l},w_,g_)),l._8(3,49152,[[1,4],["closeButton",4]],0,Lc,[],null,{action:"action"}),(n()(),l._31(4,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,4,0,l._32(t,4,0,l._22(t,5).transform("hardware-wallet.general.close")))})}function zw(n){return l._33(0,[l._29(671088640,1,{closeButton:0}),(n()(),l._9(1,0,null,null,21,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(2,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,Ow)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,Tw)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,Lw)),l._8(12,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,Bw)),l._8(15,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,Vw)),l._8(18,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,Ww)),l._8(21,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.dialogRef,l._32(t,2,1,l._22(t,3).transform("wallet.hardware-wallet"))),n(t,6,0,e.currentState===e.states.ShowingResult),n(t,9,0,e.currentState===e.states.Other&&!e.otherStateBecauseWrongPin),n(t,12,0,e.currentState===e.states.Other&&e.otherStateBecauseWrongPin),n(t,15,0,e.currentState===e.states.Finished),n(t,18,0,e.currentState===e.states.Finished),n(t,21,0,e.currentState!==e.states.Finished)},null)}var Uw=l._5("app-hw-options-dialog",ud,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-hw-options-dialog",[],null,null,null,zw,Sw)),l._8(1,180224,null,0,ud,[da,ca,oc,fa,Sc,jc],null,null)],null,null)},{},{},[]),Gw=l._7({encapsulation:0,styles:[[""]],data:{}});function qw(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"div",[["class","-check-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,4,"mat-checkbox",[["class","-check mat-checkbox"],["type","checkbox"]],[[8,"id",0],[2,"mat-checkbox-indeterminate",null],[2,"mat-checkbox-checked",null],[2,"mat-checkbox-disabled",null],[2,"mat-checkbox-label-before",null]],[[null,"change"]],function(n,t,e){var l=!0;return"change"===t&&(l=!1!==n.component.setDeleteFromList(e)&&l),l},Ym,Em)),l._28(5120,null,to,function(n){return[n]},[ta]),l._8(4,4374528,null,0,ta,[l.l,l.h,Rr,[8,null],[2,Zs]],{checked:[0,"checked"]},{change:"change"}),(n()(),l._31(5,0,["","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,4,0,t.component.deleteFromList)},function(n,t){n(t,2,0,l._22(t,4).id,l._22(t,4).indeterminate,l._22(t,4).checked,l._22(t,4).disabled,"before"==l._22(t,4).labelPosition),n(t,5,0,l._32(t,5,0,l._22(t,6).transform("hardware-wallet.wipe.confirm-delete")))})}function Jw(n){return l._33(0,[(n()(),l._9(0,0,null,null,21,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(3,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,qw)),l._8(7,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(9,0,null,null,11,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(11,0,null,null,3,"app-button",[],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal()&&l),l},w_,g_)),l._8(12,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(13,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.requestWipe()&&l),l},w_,g_)),l._8(17,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(18,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,e.msgIcons.Warning,l._32(t,3,1,l._22(t,4).transform("hardware-wallet.wipe.warning"))),n(t,7,0,e.showDeleteFromList)},function(n,t){n(t,13,0,l._32(t,13,0,l._22(t,14).transform("hardware-wallet.general.cancel"))),n(t,18,0,l._32(t,18,0,l._22(t,19).transform("hardware-wallet.general.continue")))})}function Qw(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){n(t,1,0,t.component.msgIcons.Confirm,l._32(t,1,1,l._22(t,2).transform("hardware-wallet.general.confirm")))},null)}function Kw(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){var e=t.component;n(t,1,0,e.result.icon,l._32(t,1,1,l._22(t,2).transform(e.result.text)))},null)}function Xw(n){return l._33(0,[(n()(),l._9(0,0,null,null,6,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal()&&l),l},w_,g_)),l._8(3,49152,[[1,4],["closeButton",4]],0,Lc,[],null,{action:"action"}),(n()(),l._31(4,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,4,0,l._32(t,4,0,l._22(t,5).transform("hardware-wallet.general.close")))})}function Zw(n){return l._33(0,[(n()(),l._9(0,0,null,null,10,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Qw)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,Kw)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,Xw)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,e.currentState===e.states.Processing),n(t,6,0,e.currentState===e.states.ShowingResult),n(t,9,0,e.currentState!==e.states.Processing)},null)}function $w(n){return l._33(0,[l._29(671088640,1,{closeButton:0}),(n()(),l._9(1,0,null,null,9,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(2,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"],disableDismiss:[2,"disableDismiss"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,Jw)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,Zw)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.dialogRef,l._32(t,2,1,l._22(t,3).transform("hardware-wallet.options.wipe")),e.currentState===e.states.Processing),n(t,6,0,e.currentState===e.states.Initial),n(t,9,0,e.currentState!==e.states.Initial)},null)}var nx=l._5("app-hw-wipe-dialog",Xc,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-hw-wipe-dialog",[],null,null,null,$w,Gw)),l._8(1,180224,null,0,Xc,[da,ca,oc,Sc],null,null)],null,null)},{},{},[]),tx=l._7({encapsulation:0,styles:[[".upper-text[_ngcontent-%COMP%]{margin-top:10px;margin-bottom:10px}.warning[_ngcontent-%COMP%]{margin:-20px 0 20px;color:rgba(30,34,39,.5)}"]],data:{}});function ex(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){n(t,1,0,t.component.msgIcons.Spinner,l._32(t,1,1,l._22(t,2).transform("hardware-wallet.added.configuring")))},null)}function lx(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){var e=t.component;n(t,1,0,e.result.icon,l._32(t,1,1,l._22(t,2).transform(e.result.text)))},null)}function rx(n){return l._33(0,[(n()(),l._9(0,0,null,null,35,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(3,49152,null,0,Rc,[],{icon:[0,"icon"],upperBigText:[1,"upperBigText"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(6,0,null,null,2,"div",[["class","upper-text"]],null,null,null,null,null)),(n()(),l._31(7,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,16,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,11).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,11).onReset()&&r),r},null,null)),l._8(11,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(13,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(15,0,null,null,10,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(17,0,[[2,0],["input",1]],null,7,"input",[["formControlName","label"],["id","label"]],[[1,"maxlength",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown.enter"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0,i=n.component;return"input"===t&&(r=!1!==l._22(n,18)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,18).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,18)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,18)._compositionEnd(e.target.value)&&r),"keydown.enter"===t&&(r=!1!==i.saveNameAndCloseModal()&&r),r},null,null)),l._8(18,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._8(19,540672,null,0,$o,[],{maxlength:[0,"maxlength"]},null),l._28(1024,null,Qi,function(n){return[n]},[$o]),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(22,671744,null,0,Xo,[[3,qi],[2,Qi],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(24,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(28,0,null,null,2,"div",[["class","warning"]],null,null,null,null,null)),(n()(),l._31(29,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n \n "])),(n()(),l._9(32,0,null,null,2,"div",[],null,null,null,null,null)),(n()(),l._31(33,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,e.msgIcons.Success,l._32(t,3,1,l._22(t,4).transform("hardware-wallet.added.done"))),n(t,11,0,e.form),n(t,19,0,e.maxHwWalletLabelLength),n(t,22,0,"label")},function(n,t){n(t,7,0,l._32(t,7,0,l._22(t,8).transform("hardware-wallet.added.added1"))),n(t,10,0,l._22(t,13).ngClassUntouched,l._22(t,13).ngClassTouched,l._22(t,13).ngClassPristine,l._22(t,13).ngClassDirty,l._22(t,13).ngClassValid,l._22(t,13).ngClassInvalid,l._22(t,13).ngClassPending),n(t,17,0,l._22(t,19).maxlength?l._22(t,19).maxlength:null,l._22(t,24).ngClassUntouched,l._22(t,24).ngClassTouched,l._22(t,24).ngClassPristine,l._22(t,24).ngClassDirty,l._22(t,24).ngClassValid,l._22(t,24).ngClassInvalid,l._22(t,24).ngClassPending),n(t,29,0,l._32(t,29,0,l._22(t,30).transform("hardware-wallet.added.characters-warning"))),n(t,33,0,l._32(t,33,0,l._22(t,34).transform("hardware-wallet.added.added2")))})}function ix(n){return l._33(0,[(n()(),l._9(0,0,null,null,6,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0,r=n.component;return"action"===t&&(l=!1!==(r.currentState===r.states.Finished?r.saveNameAndCloseModal():r.closeModal())&&l),l},w_,g_)),l._8(3,49152,[[1,4],["closeButton",4]],0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(4,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,e.currentState===e.states.Finished&&!e.form.valid)},function(n,t){var e=t.component;n(t,4,0,l._32(t,4,0,l._22(t,5).transform(e.currentState===e.states.Finished?"hardware-wallet.added.ok":"hardware-wallet.general.close")))})}function ox(n){return l._33(0,[l._29(671088640,1,{closeButton:0}),l._29(671088640,2,{input:0}),(n()(),l._9(2,0,null,null,15,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(3,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"],disableDismiss:[2,"disableDismiss"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,ex)),l._8(7,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,lx)),l._8(10,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,rx)),l._8(13,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,ix)),l._8(16,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,3,0,e.dialogRef,l._32(t,3,1,l._22(t,4).transform("hardware-wallet.added.title")),e.currentState===e.states.Initial||e.currentState===e.states.Finished),n(t,7,0,e.currentState===e.states.Initial),n(t,10,0,e.currentState===e.states.ShowingResult),n(t,13,0,e.currentState===e.states.Finished),n(t,16,0,e.currentState===e.states.Finished||e.currentState===e.states.ShowingResult)},null)}var sx=l._5("app-hw-added-dialog",td,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-hw-added-dialog",[],null,null,null,ox,tx)),l._8(1,180224,null,0,td,[da,ca,Sc,oc,ns,fa,jc],null,null)],null,null)},{},{},[]),ax=l._7({encapsulation:0,styles:[[".form-field[_ngcontent-%COMP%]{margin-bottom:0;margin-top:15px}"]],data:{}});function ux(n){return l._33(0,[(n()(),l._9(0,0,null,null,50,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(3,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(6,0,null,null,30,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,7).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,7).onReset()&&r),r},null,null)),l._8(7,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(9,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(11,0,null,null,24,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(13,0,null,null,21,"div",[["class","-select"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(15,0,null,null,18,"select",[["formControlName","words"],["id","words"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"change"],[null,"blur"]],function(n,t,e){var r=!0;return"change"===t&&(r=!1!==l._22(n,16).onChange(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,16).onTouched()&&r),r},null,null)),l._8(16,16384,null,0,_o,[l.G,l.l],null,null),l._28(1024,null,to,function(n){return[n]},[_o]),l._8(18,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(20,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(22,0,null,null,4,"option",[],null,null,null,null,null)),l._8(23,147456,null,0,mo,[l.l,l.G,[2,_o]],{ngValue:[0,"ngValue"]},null),l._8(24,147456,null,0,bo,[l.l,l.G,[8,null]],{ngValue:[0,"ngValue"]},null),(n()(),l._31(25,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(28,0,null,null,4,"option",[],null,null,null,null,null)),l._8(29,147456,null,0,mo,[l.l,l.G,[2,_o]],{ngValue:[0,"ngValue"]},null),l._8(30,147456,null,0,bo,[l.l,l.G,[8,null]],{ngValue:[0,"ngValue"]},null),(n()(),l._31(31,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(38,0,null,null,11,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(40,0,null,null,3,"app-button",[],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal()&&l),l},w_,g_)),l._8(41,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(42,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(45,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.startOperation()&&l),l},w_,g_)),l._8(46,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(47,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,e.msgIcons.None,l._32(t,3,1,l._22(t,4).transform("hardware-wallet.generate-seed.text"))),n(t,7,0,e.form),n(t,18,0,"words"),n(t,23,0,12),n(t,24,0,12),n(t,29,0,24),n(t,30,0,24)},function(n,t){n(t,6,0,l._22(t,9).ngClassUntouched,l._22(t,9).ngClassTouched,l._22(t,9).ngClassPristine,l._22(t,9).ngClassDirty,l._22(t,9).ngClassValid,l._22(t,9).ngClassInvalid,l._22(t,9).ngClassPending),n(t,15,0,l._22(t,20).ngClassUntouched,l._22(t,20).ngClassTouched,l._22(t,20).ngClassPristine,l._22(t,20).ngClassDirty,l._22(t,20).ngClassValid,l._22(t,20).ngClassInvalid,l._22(t,20).ngClassPending),n(t,25,0,l._32(t,25,0,l._22(t,26).transform("wallet.new.12-words"))),n(t,31,0,l._32(t,31,0,l._22(t,32).transform("wallet.new.24-words"))),n(t,42,0,l._32(t,42,0,l._22(t,43).transform("hardware-wallet.general.cancel"))),n(t,47,0,l._32(t,47,0,l._22(t,48).transform("hardware-wallet.general.continue")))})}function cx(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){n(t,1,0,t.component.msgIcons.Spinner,l._32(t,1,1,l._22(t,2).transform("hardware-wallet.generate-seed.configuring")))},null)}function dx(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){var e=t.component;n(t,1,0,e.result.icon,l._32(t,1,1,l._22(t,2).transform(e.result.text)))},null)}function hx(n){return l._33(0,[(n()(),l._9(0,0,null,null,6,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal()&&l),l},w_,g_)),l._8(3,49152,[[1,4],["closeButton",4]],0,Lc,[],null,{action:"action"}),(n()(),l._31(4,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,4,0,l._32(t,4,0,l._22(t,5).transform("hardware-wallet.general.close")))})}function px(n){return l._33(0,[l._29(671088640,1,{closeButton:0}),(n()(),l._9(1,0,null,null,15,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(2,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"],disableDismiss:[2,"disableDismiss"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,ux)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,cx)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,dx)),l._8(12,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,hx)),l._8(15,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.dialogRef,l._32(t,2,1,l._22(t,3).transform("hardware-wallet.options.configure-automatically")),e.currentState===e.states.Processing),n(t,6,0,e.currentState===e.states.Initial),n(t,9,0,e.currentState===e.states.Processing),n(t,12,0,e.currentState===e.states.ShowingResult),n(t,15,0,e.currentState!==e.states.Initial&&e.currentState!==e.states.Processing)},null)}var fx=l._5("app-hw-generate-seed-dialog",ed,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-hw-generate-seed-dialog",[],null,null,null,px,ax)),l._8(1,180224,null,0,ed,[da,ca,oc,ns],null,null)],null,null)},{},{},[]),_x=l._7({encapsulation:0,styles:[[""]],data:{}});function mx(n){return l._33(0,[(n()(),l._9(0,0,null,null,18,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(3,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(6,0,null,null,11,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,3,"app-button",[],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal()&&l),l},w_,g_)),l._8(9,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(10,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(13,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.requestBackup()&&l),l},w_,g_)),l._8(14,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(15,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,3,0,t.component.msgIcons.Warning,l._32(t,3,1,l._22(t,4).transform("hardware-wallet.create-backup.warning")))},function(n,t){n(t,10,0,l._32(t,10,0,l._22(t,11).transform("hardware-wallet.general.cancel"))),n(t,15,0,l._32(t,15,0,l._22(t,16).transform("hardware-wallet.general.continue")))})}function gx(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){n(t,1,0,t.component.msgIcons.Confirm,l._32(t,1,1,l._22(t,2).transform("hardware-wallet.create-backup.instructions")))},null)}function yx(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){var e=t.component;n(t,1,0,e.result.icon,l._32(t,1,1,l._22(t,2).transform(e.result.text)))},null)}function bx(n){return l._33(0,[(n()(),l._9(0,0,null,null,6,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal()&&l),l},w_,g_)),l._8(3,49152,[[1,4],["closeButton",4]],0,Lc,[],null,{action:"action"}),(n()(),l._31(4,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,4,0,l._32(t,4,0,l._22(t,5).transform("hardware-wallet.general.close")))})}function vx(n){return l._33(0,[(n()(),l._9(0,0,null,null,10,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,gx)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,yx)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,bx)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,e.currentState===e.states.Processing),n(t,6,0,e.currentState===e.states.ShowingResult),n(t,9,0,e.currentState!==e.states.Processing)},null)}function wx(n){return l._33(0,[l._29(671088640,1,{closeButton:0}),(n()(),l._9(1,0,null,null,9,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(2,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"],disableDismiss:[2,"disableDismiss"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,mx)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,vx)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.dialogRef,l._32(t,2,1,l._22(t,3).transform("hardware-wallet.options.create-backup")),e.currentState===e.states.Processing),n(t,6,0,e.currentState===e.states.Initial),n(t,9,0,e.currentState!==e.states.Initial)},null)}var xx=l._5("app-hw-backup-dialog",ld,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-hw-backup-dialog",[],null,null,null,wx,_x)),l._8(1,180224,null,0,ld,[da,ca,oc],null,null)],null,null)},{},{},[]),Mx=l._7({encapsulation:0,styles:[[".red-title[_ngcontent-%COMP%]{font-family:Skycoin;line-height:30px;font-size:14px;text-align:center;letter-spacing:.0769231em;color:#ff004e}.link[_ngcontent-%COMP%]{cursor:pointer;color:#0072ff}"]],data:{}});function kx(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"span",[["class","link"]],null,[[null,"click"]],function(n,t,e){var l=!0,r=n.component;return"click"===t&&(r.data.linkFunction(),l=!1!==r.closeModal(!1)&&l),l},null,null)),(n()(),l._31(1,null,["",""])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){var e=t.component;n(t,1,0,l._32(t,1,0,l._22(t,2).transform(e.data.linkText)))})}function Cx(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"div",[["class","-check-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,4,"mat-checkbox",[["class","-check e2e-confirm-checkbox mat-checkbox"],["id","terms"],["type","checkbox"]],[[8,"id",0],[2,"mat-checkbox-indeterminate",null],[2,"mat-checkbox-checked",null],[2,"mat-checkbox-disabled",null],[2,"mat-checkbox-label-before",null]],[[null,"change"]],function(n,t,e){var l=!0;return"change"===t&&(l=!1!==n.component.setAccept(e)&&l),l},Ym,Em)),l._28(5120,null,to,function(n){return[n]},[ta]),l._8(4,4374528,null,0,ta,[l.l,l.h,Rr,[8,null],[2,Zs]],{id:[0,"id"],checked:[1,"checked"]},{change:"change"}),(n()(),l._31(5,0,["","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,4,0,"terms",t.component.accepted)},function(n,t){var e=t.component;n(t,2,0,l._22(t,4).id,l._22(t,4).indeterminate,l._22(t,4).checked,l._22(t,4).disabled,"before"==l._22(t,4).labelPosition),n(t,5,0,l._32(t,5,0,l._22(t,6).transform(e.data.checkboxText)))})}function Sx(n){return l._33(0,[(n()(),l._9(0,0,null,null,3,"app-button",[],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal(!1)&&l),l},w_,g_)),l._8(1,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(2,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){var e=t.component;n(t,2,0,l._32(t,2,0,l._22(t,3).transform(e.data.cancelButtonText)))})}function Ox(n){return l._33(0,[(n()(),l._9(0,0,null,null,24,"app-modal",[["class","modal"]],[[2,"red-title",null]],null,null,wv,bv)),l._8(1,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"],disableDismiss:[2,"disableDismiss"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(4,0,null,0,5,"div",[["class","-body"]],null,null,null,null,null)),(n()(),l._31(5,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._4(16777216,null,null,1,null,kx)),l._8(8,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,Cx)),l._8(12,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._9(14,0,null,0,9,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Sx)),l._8(17,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(19,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal(!0)&&l),l},w_,g_)),l._8(20,49152,null,0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(21,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,1,0,e.dialogRef,l._32(t,1,1,l._22(t,2).transform(e.data.headerText)),e.disableDismiss),n(t,8,0,e.data.linkText&&e.data.linkFunction),n(t,12,0,e.data.checkboxText),n(t,17,0,e.data.cancelButtonText),n(t,20,0,e.data.checkboxText&&!e.accepted)},function(n,t){var e=t.component;n(t,0,0,e.data.redTitle),n(t,5,0,l._32(t,5,0,l._22(t,6).transform(e.data.text))),n(t,21,0,l._32(t,21,0,l._22(t,22).transform(e.data.confirmButtonText)))})}var Tx=l._5("app-confirmation",Nc,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-confirmation",[],null,null,null,Ox,Mx)),l._8(1,49152,null,0,Nc,[ca,da],null,null)],null,null)},{},{},[]),Lx=l._7({encapsulation:0,styles:[["mat-input-container[_ngcontent-%COMP%]{width:100%}.form-field[_ngcontent-%COMP%] input[_ngcontent-%COMP%]{font-size:25px;letter-spacing:15px;text-align:center}.form-field[_ngcontent-%COMP%] .info[_ngcontent-%COMP%]{text-align:center}.form-field[_ngcontent-%COMP%] .info[_ngcontent-%COMP%] .link[_ngcontent-%COMP%]{color:#0072ff;cursor:pointer}.num-pad-row[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex}.num-pad-row[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;height:50px;border:1px solid #eff0f0;margin:2px}.num-pad-row[_ngcontent-%COMP%] button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:#171a1d}"]],data:{}});function Px(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("hardware-wallet.enter-pin.instructions-tx")))})}function Dx(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"span",[],null,null,null,null,null)),(n()(),l._31(1,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("hardware-wallet.enter-pin.instructions-change")))})}function Ax(n){return l._33(0,[l._29(402653184,1,{closeButton:0}),(n()(),l._9(1,0,null,null,116,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(2,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(5,0,null,0,28,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,6).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,6).onReset()&&r),r},null,null)),l._8(6,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(8,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,22,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,12,"div",[["class","info"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Px)),l._8(15,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,Dx)),l._8(18,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(19,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(21,0,null,null,2,"span",[["class","link"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.openHelp()&&l),l},null,null)),(n()(),l._31(22,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(26,0,null,null,5,"input",[["formControlName","pin"],["id","pin"],["readonly",""],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,27)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,27).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,27)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,27)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(27,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(29,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(31,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(35,0,null,0,73,"div",[["class","select-address-theme"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(37,0,null,null,19,"div",[["class","num-pad-row"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(39,0,null,null,4,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.addNumber("7")&&l),l},i_,r_)),l._8(40,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(41,16384,null,0,Hs,[],null,null),(n()(),l._9(42,0,null,0,1,"span",[],null,null,null,null,null)),(n()(),l._31(43,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(45,0,null,null,4,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.addNumber("8")&&l),l},i_,r_)),l._8(46,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(47,16384,null,0,Hs,[],null,null),(n()(),l._9(48,0,null,0,1,"span",[],null,null,null,null,null)),(n()(),l._31(49,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(51,0,null,null,4,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.addNumber("9")&&l),l},i_,r_)),l._8(52,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(53,16384,null,0,Hs,[],null,null),(n()(),l._9(54,0,null,0,1,"span",[],null,null,null,null,null)),(n()(),l._31(55,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(58,0,null,null,19,"div",[["class","num-pad-row"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(60,0,null,null,4,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.addNumber("4")&&l),l},i_,r_)),l._8(61,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(62,16384,null,0,Hs,[],null,null),(n()(),l._9(63,0,null,0,1,"span",[],null,null,null,null,null)),(n()(),l._31(64,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(66,0,null,null,4,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.addNumber("5")&&l),l},i_,r_)),l._8(67,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(68,16384,null,0,Hs,[],null,null),(n()(),l._9(69,0,null,0,1,"span",[],null,null,null,null,null)),(n()(),l._31(70,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(72,0,null,null,4,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.addNumber("6")&&l),l},i_,r_)),l._8(73,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(74,16384,null,0,Hs,[],null,null),(n()(),l._9(75,0,null,0,1,"span",[],null,null,null,null,null)),(n()(),l._31(76,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(79,0,null,null,19,"div",[["class","num-pad-row"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(81,0,null,null,4,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.addNumber("1")&&l),l},i_,r_)),l._8(82,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(83,16384,null,0,Hs,[],null,null),(n()(),l._9(84,0,null,0,1,"span",[],null,null,null,null,null)),(n()(),l._31(85,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(87,0,null,null,4,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.addNumber("2")&&l),l},i_,r_)),l._8(88,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(89,16384,null,0,Hs,[],null,null),(n()(),l._9(90,0,null,0,1,"span",[],null,null,null,null,null)),(n()(),l._31(91,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(93,0,null,null,4,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.addNumber("3")&&l),l},i_,r_)),l._8(94,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(95,16384,null,0,Hs,[],null,null),(n()(),l._9(96,0,null,0,1,"span",[],null,null,null,null,null)),(n()(),l._31(97,null,["",""])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(100,0,null,null,7,"div",[["class","num-pad-row"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(102,0,null,null,4,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.removeNumber()&&l),l},i_,r_)),l._8(103,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(104,16384,null,0,Hs,[],null,null),(n()(),l._9(105,0,null,0,1,"span",[["class","material-icons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["backspace"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(110,0,null,0,6,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(112,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.sendPin()&&l),l},w_,g_)),l._8(113,49152,null,0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(114,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.dialogRef,l._32(t,2,1,l._22(t,3).transform(e.title))),n(t,6,0,e.form),n(t,15,0,e.data.signingTx),n(t,18,0,e.data.changingPin&&e.data.changePinState===e.changePinStates.RequestingNewPin),n(t,29,0,"pin"),n(t,40,0,"primary"),n(t,46,0,"primary"),n(t,52,0,"primary"),n(t,61,0,"primary"),n(t,67,0,"primary"),n(t,73,0,"primary"),n(t,82,0,"primary"),n(t,88,0,"primary"),n(t,94,0,"primary"),n(t,103,0,"primary"),n(t,113,0,!e.form.valid)},function(n,t){var e=t.component;n(t,5,0,l._22(t,8).ngClassUntouched,l._22(t,8).ngClassTouched,l._22(t,8).ngClassPristine,l._22(t,8).ngClassDirty,l._22(t,8).ngClassValid,l._22(t,8).ngClassInvalid,l._22(t,8).ngClassPending),n(t,19,0,l._32(t,19,0,l._22(t,20).transform("hardware-wallet.enter-pin.instructions"))),n(t,22,0,l._32(t,22,0,l._22(t,23).transform("hardware-wallet.enter-pin.help"))),n(t,26,0,l._22(t,31).ngClassUntouched,l._22(t,31).ngClassTouched,l._22(t,31).ngClassPristine,l._22(t,31).ngClassDirty,l._22(t,31).ngClassValid,l._22(t,31).ngClassInvalid,l._22(t,31).ngClassPending),n(t,39,0,l._22(t,40).disabled||null),n(t,43,0,e.buttonsContent),n(t,45,0,l._22(t,46).disabled||null),n(t,49,0,e.buttonsContent),n(t,51,0,l._22(t,52).disabled||null),n(t,55,0,e.buttonsContent),n(t,60,0,l._22(t,61).disabled||null),n(t,64,0,e.buttonsContent),n(t,66,0,l._22(t,67).disabled||null),n(t,70,0,e.buttonsContent),n(t,72,0,l._22(t,73).disabled||null),n(t,76,0,e.buttonsContent),n(t,81,0,l._22(t,82).disabled||null),n(t,85,0,e.buttonsContent),n(t,87,0,l._22(t,88).disabled||null),n(t,91,0,e.buttonsContent),n(t,93,0,l._22(t,94).disabled||null),n(t,97,0,e.buttonsContent),n(t,102,0,l._22(t,103).disabled||null),n(t,114,0,l._32(t,114,0,l._22(t,115).transform("hardware-wallet.general.continue")))})}var Ex=l._5("app-hw-pin-dialog",bf,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-hw-pin-dialog",[],null,[["window","keyup"]],function(n,t,e){var r=!0;return"window:keyup"===t&&(r=!1!==l._22(n,1).keyEvent(e)&&r),r},Ax,Lx)),l._8(1,245760,null,0,bf,[da,ca,ns,fa,oc],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]),Yx=l._7({encapsulation:0,styles:[[""]],data:{}});function jx(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){n(t,1,0,t.component.msgIcons.Confirm,l._32(t,1,1,l._22(t,2).transform("hardware-wallet.general.confirm")))},null)}function Ix(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){var e=t.component;n(t,1,0,e.result.icon,l._32(t,1,1,l._22(t,2).transform(e.result.text)))},null)}function Rx(n){return l._33(0,[(n()(),l._9(0,0,null,null,6,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal()&&l),l},w_,g_)),l._8(3,49152,[[1,4],["closeButton",4]],0,Lc,[],null,{action:"action"}),(n()(),l._31(4,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,4,0,l._32(t,4,0,l._22(t,5).transform("hardware-wallet.general.close")))})}function Hx(n){return l._33(0,[l._29(671088640,1,{closeButton:0}),(n()(),l._9(1,0,null,null,12,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(2,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"],disableDismiss:[2,"disableDismiss"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,jx)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,Ix)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,Rx)),l._8(12,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.dialogRef,l._32(t,2,1,l._22(t,3).transform(e.changingExistingPin?"hardware-wallet.options.change-pin":"hardware-wallet.options.create-pin")),e.currentState===e.states.Initial),n(t,6,0,e.currentState===e.states.Initial),n(t,9,0,e.currentState===e.states.ShowingResult),n(t,12,0,e.currentState!==e.states.Initial)},null)}var Nx=l._5("app-hw-change-pin-dialog",rd,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-hw-change-pin-dialog",[],null,null,null,Hx,Yx)),l._8(1,180224,null,0,rd,[da,ca,oc],null,null)],null,null)},{},{},[]),Fx=l._7({encapsulation:0,styles:[[""]],data:{}});function Bx(n){return l._33(0,[(n()(),l._9(0,0,null,null,15,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(1,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(4,0,null,0,2,"p",[],null,null,null,null,null)),(n()(),l._31(5,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(8,0,null,0,2,"p",[],null,null,null,null,null)),(n()(),l._31(9,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(12,0,null,0,2,"p",[],null,null,null,null,null)),(n()(),l._31(13,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){n(t,1,0,t.component.dialogRef,l._32(t,1,1,l._22(t,2).transform("hardware-wallet.pin-help.title")))},function(n,t){n(t,5,0,l._32(t,5,0,l._22(t,6).transform("hardware-wallet.pin-help.part1"))),n(t,9,0,l._32(t,9,0,l._22(t,10).transform("hardware-wallet.pin-help.part2"))),n(t,13,0,l._32(t,13,0,l._22(t,14).transform("hardware-wallet.pin-help.part3")))})}var Vx=l._5("app-hw-added-dialog",yf,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-hw-added-dialog",[],null,null,null,Bx,Fx)),l._8(1,49152,null,0,yf,[ca],null,null)],null,null)},{},{},[]),Wx=l._7({encapsulation:0,styles:[[".form-field[_ngcontent-%COMP%]{margin-bottom:0;margin-top:15px}.warning[_ngcontent-%COMP%]{margin-top:15px;color:#ff004e;text-align:center}"]],data:{}});function zx(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"div",[["class","warning"]],null,null,null,null,null)),(n()(),l._31(1,null,["",""])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("hardware-wallet.restore-seed.warning")))})}function Ux(n){return l._33(0,[(n()(),l._9(0,0,null,null,53,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(3,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(6,0,null,null,30,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,7).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,7).onReset()&&r),r},null,null)),l._8(7,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(9,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(11,0,null,null,24,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(13,0,null,null,21,"div",[["class","-select"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(15,0,null,null,18,"select",[["formControlName","words"],["id","words"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"change"],[null,"blur"]],function(n,t,e){var r=!0;return"change"===t&&(r=!1!==l._22(n,16).onChange(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,16).onTouched()&&r),r},null,null)),l._8(16,16384,null,0,_o,[l.G,l.l],null,null),l._28(1024,null,to,function(n){return[n]},[_o]),l._8(18,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(20,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(22,0,null,null,4,"option",[],null,null,null,null,null)),l._8(23,147456,null,0,mo,[l.l,l.G,[2,_o]],{ngValue:[0,"ngValue"]},null),l._8(24,147456,null,0,bo,[l.l,l.G,[8,null]],{ngValue:[0,"ngValue"]},null),(n()(),l._31(25,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(28,0,null,null,4,"option",[],null,null,null,null,null)),l._8(29,147456,null,0,mo,[l.l,l.G,[2,_o]],{ngValue:[0,"ngValue"]},null),l._8(30,147456,null,0,bo,[l.l,l.G,[8,null]],{ngValue:[0,"ngValue"]},null),(n()(),l._31(31,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,zx)),l._8(39,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(41,0,null,null,11,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(43,0,null,null,3,"app-button",[],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal()&&l),l},w_,g_)),l._8(44,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(45,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(48,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.startOperation()&&l),l},w_,g_)),l._8(49,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(50,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,e.msgIcons.None,l._32(t,3,1,l._22(t,4).transform(e.justCheckingSeed?"hardware-wallet.restore-seed.check-text":"hardware-wallet.restore-seed.text"))),n(t,7,0,e.form),n(t,18,0,"words"),n(t,23,0,12),n(t,24,0,12),n(t,29,0,24),n(t,30,0,24),n(t,39,0,!e.justCheckingSeed)},function(n,t){n(t,6,0,l._22(t,9).ngClassUntouched,l._22(t,9).ngClassTouched,l._22(t,9).ngClassPristine,l._22(t,9).ngClassDirty,l._22(t,9).ngClassValid,l._22(t,9).ngClassInvalid,l._22(t,9).ngClassPending),n(t,15,0,l._22(t,20).ngClassUntouched,l._22(t,20).ngClassTouched,l._22(t,20).ngClassPristine,l._22(t,20).ngClassDirty,l._22(t,20).ngClassValid,l._22(t,20).ngClassInvalid,l._22(t,20).ngClassPending),n(t,25,0,l._32(t,25,0,l._22(t,26).transform("wallet.new.12-words"))),n(t,31,0,l._32(t,31,0,l._22(t,32).transform("wallet.new.24-words"))),n(t,45,0,l._32(t,45,0,l._22(t,46).transform("hardware-wallet.general.cancel"))),n(t,50,0,l._32(t,50,0,l._22(t,51).transform("hardware-wallet.general.continue")))})}function Gx(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){var e=t.component;n(t,1,0,e.msgIcons.Confirm,l._32(t,1,1,l._22(t,2).transform(e.justCheckingSeed?"hardware-wallet.general.follow":"hardware-wallet.general.confirm-and-more")))},null)}function qx(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){var e=t.component;n(t,1,0,e.result.icon,l._32(t,1,1,l._22(t,2).transform(e.result.text)))},null)}function Jx(n){return l._33(0,[(n()(),l._9(0,0,null,null,6,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal()&&l),l},w_,g_)),l._8(3,49152,[[1,4],["closeButton",4]],0,Lc,[],null,{action:"action"}),(n()(),l._31(4,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,4,0,l._32(t,4,0,l._22(t,5).transform("hardware-wallet.general.close")))})}function Qx(n){return l._33(0,[l._29(671088640,1,{closeButton:0}),(n()(),l._9(1,0,null,null,15,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(2,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"],disableDismiss:[2,"disableDismiss"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,Ux)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,Gx)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,qx)),l._8(12,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,Jx)),l._8(15,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.dialogRef,l._32(t,2,1,l._22(t,3).transform(e.justCheckingSeed?"hardware-wallet.options.confirm-seed":"hardware-wallet.options.restore-backup")),e.currentState===e.states.Processing),n(t,6,0,e.currentState===e.states.Initial),n(t,9,0,e.currentState===e.states.Processing),n(t,12,0,e.currentState===e.states.ShowingResult),n(t,15,0,e.currentState!==e.states.Initial&&e.currentState!==e.states.Processing)},null)}var Kx=l._5("app-hw-restore-seed-dialog",id,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-hw-restore-seed-dialog",[],null,null,null,Qx,Wx)),l._8(1,180224,null,0,id,[da,ca,oc,ns],null,null)],null,null)},{},{},[]),Xx=l._7({encapsulation:0,styles:[[""]],data:{}});function Zx(n){return l._33(0,[l._29(402653184,1,{closeButton:0}),(n()(),l._9(1,0,null,null,8,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(2,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"],disableDismiss:[2,"disableDismiss"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(5,0,null,0,3,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(6,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"],outputsList:[2,"outputsList"],lowerText:[3,"lowerText"]},null),l._25(131072,De.i,[De.j,l.h]),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.dialogRef,l._32(t,2,1,l._22(t,3).transform("hardware-wallet.create-tx.title")),!0),n(t,6,0,e.msgIcons.Confirm,l._32(t,6,1,l._22(t,7).transform("hardware-wallet.create-tx.upper-text")),e.data,l._32(t,6,3,l._22(t,8).transform("hardware-wallet.create-tx.lower-text")))},null)}var $x=l._5("app-hw-confirm-tx-dialog",vf,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-hw-confirm-tx-dialog",[],null,null,null,Zx,Xx)),l._8(1,180224,null,0,vf,[da,ca,oc],null,null)],null,null)},{},{},[]),nM=l._7({encapsulation:0,styles:[[""]],data:{}});function tM(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"],lowerBigText:[2,"lowerBigText"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){var e=t.component;n(t,1,0,e.msgIcons.Confirm,l._32(t,1,1,l._22(t,2).transform("hardware-wallet.confirm-address.instructions")),e.data.address.address)},null)}function eM(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){var e=t.component;n(t,1,0,e.result.icon,l._32(t,1,1,l._22(t,2).transform(e.result.text)))},null)}function lM(n){return l._33(0,[(n()(),l._9(0,0,null,null,6,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal()&&l),l},w_,g_)),l._8(3,49152,[[1,4],["closeButton",4]],0,Lc,[],null,{action:"action"}),(n()(),l._31(4,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,4,0,l._32(t,4,0,l._22(t,5).transform("hardware-wallet.general.close")))})}function rM(n){return l._33(0,[l._29(671088640,1,{closeButton:0}),(n()(),l._9(1,0,null,null,12,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(2,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"],disableDismiss:[2,"disableDismiss"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,tM)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,eM)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,lM)),l._8(12,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.dialogRef,l._32(t,2,1,l._22(t,3).transform("hardware-wallet.confirm-address.title")),e.currentState===e.states.Initial),n(t,6,0,e.currentState===e.states.Initial),n(t,9,0,e.currentState===e.states.ShowingResult),n(t,12,0,e.currentState!==e.states.Initial)},null)}var iM=l._5("app-hw-confirm-address-dialog",Ff,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-hw-confirm-address-dialog",[],null,null,null,rM,nM)),l._8(1,180224,null,0,Ff,[da,ca,oc,Sc],null,null)],null,null)},{},{},[]),oM=l._7({encapsulation:0,styles:[[".options-container[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-ms-flex-wrap:wrap;flex-wrap:wrap}.options-container[_ngcontent-%COMP%] .button[_ngcontent-%COMP%]{width:118px;margin:20px;font-size:12px;line-height:unset;padding:0;color:unset;min-width:0}.options-container[_ngcontent-%COMP%] .button[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{width:64px;height:64px;margin:10px 0}.options-container[_ngcontent-%COMP%] .button[_ngcontent-%COMP%] .label[_ngcontent-%COMP%]{background-color:rgba(30,34,39,.05);padding:4px 10px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}"]],data:{}});function sM(n){return l._33(0,[(n()(),l._9(0,0,null,null,8,"button",[["class","button mat-button"],["color","accent"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.closePopup(n.context.$implicit)&&l),l},i_,r_)),l._8(1,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(2,16384,null,0,Hs,[],null,null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(4,0,null,0,0,"img",[],[[8,"src",4]],null,null,null,null)),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(6,0,null,0,1,"div",[["class","label"]],null,null,null,null,null)),(n()(),l._31(7,null,["",""])),(n()(),l._31(-1,0,["\n "]))],function(n,t){n(t,1,0,"accent")},function(n,t){n(t,0,0,l._22(t,1).disabled||null),n(t,4,0,"assets/img/lang/"+t.context.$implicit.iconName),n(t,7,0,t.context.$implicit.name)})}function aM(n){return l._33(0,[(n()(),l._9(0,0,null,null,9,"app-modal",[["class","e2e-language-modal"]],null,null,null,wv,bv)),l._8(1,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"],disableDismiss:[2,"disableDismiss"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(4,0,null,0,4,"div",[["class","options-container subtle-theme"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,sM)),l._8(7,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,1,0,e.dialogRef,l._32(t,1,1,l._22(t,2).transform("title.language")),e.disableDismiss),n(t,7,0,e.languages)},null)}var uM=l._5("app-select-language",Vc,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-select-language",[],null,null,null,aM,oM)),l._8(1,114688,null,0,Vc,[ca,Bc],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]),cM=l._7({encapsulation:0,styles:[["button[_ngcontent-%COMP%]{width:100%;text-align:left;padding:10px;border-bottom:1px solid #eff0f0;cursor:pointer}button[_ngcontent-%COMP%] .info[_ngcontent-%COMP%]{font-size:13px;line-height:22px;color:#171a1d}button[_ngcontent-%COMP%] .info[_ngcontent-%COMP%] div[_ngcontent-%COMP%]{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}button[_ngcontent-%COMP%] .info[_ngcontent-%COMP%] div[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px;position:relative;top:3px;margin:0 5px}button[_ngcontent-%COMP%] .info[_ngcontent-%COMP%] .grey[_ngcontent-%COMP%]{color:rgba(30,34,39,.5)}button[_ngcontent-%COMP%] .action[_ngcontent-%COMP%]{color:#0072ff}"]],data:{}});function dM(n){return l._33(0,[(n()(),l._9(0,0,null,null,26,"div",[["class","select-address-theme"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,23,"button",[["class","mat-button"],["color","primary"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.select(n.context.$implicit)&&l),l},i_,r_)),l._8(3,180224,null,0,Bs,[l.l,Hl,Rr],{color:[0,"color"]},null),l._8(4,16384,null,0,Hs,[],null,null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(6,0,null,0,18,"div",[["class","info"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,6,"div",[],null,null,null,null,null)),(n()(),l._31(9,null,[""," "," "])),(n()(),l._9(10,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(11,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["play_arrow"])),(n()(),l._31(13,null,[" \u2248"," ",""])),l._25(0,If,[tn,qc,gf]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,2,"div",[["class","grey"]],null,null,null,null,null)),(n()(),l._31(17,null,["",": ",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(20,0,null,null,3,"div",[["class","grey"]],null,null,null,null,null)),(n()(),l._31(21,null,["",": ",""])),l._25(131072,De.i,[De.j,l.h]),l._27(23,1),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,3,0,"primary"),n(t,11,0)},function(n,t){var e=t.component;n(t,2,0,l._22(t,3).disabled||null),n(t,9,0,t.context.$implicit.fromAmount,e.getFromCoin(t.context.$implicit.pair)),n(t,13,0,l._32(t,13,0,l._22(t,14).transform(t.context.$implicit.toAmount,!0,"first")),e.getToCoin(t.context.$implicit.pair)),n(t,17,0,l._32(t,17,0,l._22(t,18).transform("exchange.history-window.address")),t.context.$implicit.address),n(t,21,0,l._32(t,21,0,l._22(t,22).transform("exchange.history-window.date")),l._32(t,21,1,n(t,23,0,l._22(t.parent,0),t.context.$implicit.timestamp)))})}function hM(n){return l._33(0,[l._25(0,ag,[]),(n()(),l._9(1,0,null,null,6,"app-modal",[],null,null,null,wv,bv)),l._8(2,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,dM)),l._8(6,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.dialogRef,l._32(t,2,1,l._22(t,3).transform("title.order-history"))),n(t,6,0,e.orders)},null)}var pM=l._5("app-exchange-history",ff,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-exchange-history",[],null,null,null,hM,cM)),l._8(1,114688,null,0,ff,[ca,qc,pf],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]),fM=l._7({encapsulation:0,styles:[[""]],data:{}});function _M(n){return l._33(0,[(n()(),l._9(0,0,null,null,27,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(3,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(6,0,null,null,7,"div",[["class","-check-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(8,0,null,null,4,"mat-checkbox",[["class","-check mat-checkbox"],["type","checkbox"]],[[8,"id",0],[2,"mat-checkbox-indeterminate",null],[2,"mat-checkbox-checked",null],[2,"mat-checkbox-disabled",null],[2,"mat-checkbox-label-before",null]],[[null,"change"]],function(n,t,e){var l=!0;return"change"===t&&(l=!1!==n.component.setConfirmed(e)&&l),l},Ym,Em)),l._28(5120,null,to,function(n){return[n]},[ta]),l._8(10,4374528,null,0,ta,[l.l,l.h,Rr,[8,null],[2,Zs]],{checked:[0,"checked"]},{change:"change"}),(n()(),l._31(11,0,["","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(15,0,null,null,11,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(17,0,null,null,3,"app-button",[],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal()&&l),l},w_,g_)),l._8(18,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(19,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(22,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.requestRemoval()&&l),l},w_,g_)),l._8(23,49152,null,0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(24,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,e.msgIcons.Warning,l._32(t,3,1,l._22(t,4).transform("hardware-wallet.remove-pin.warning"))),n(t,10,0,e.confirmed),n(t,23,0,!e.confirmed)},function(n,t){n(t,8,0,l._22(t,10).id,l._22(t,10).indeterminate,l._22(t,10).checked,l._22(t,10).disabled,"before"==l._22(t,10).labelPosition),n(t,11,0,l._32(t,11,0,l._22(t,12).transform("hardware-wallet.remove-pin.check"))),n(t,19,0,l._32(t,19,0,l._22(t,20).transform("hardware-wallet.general.cancel"))),n(t,24,0,l._32(t,24,0,l._22(t,25).transform("hardware-wallet.general.continue")))})}function mM(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){n(t,1,0,t.component.msgIcons.Confirm,l._32(t,1,1,l._22(t,2).transform("hardware-wallet.general.confirm")))},null)}function gM(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){var e=t.component;n(t,1,0,e.result.icon,l._32(t,1,1,l._22(t,2).transform(e.result.text)))},null)}function yM(n){return l._33(0,[(n()(),l._9(0,0,null,null,6,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal()&&l),l},w_,g_)),l._8(3,49152,[[1,4],["closeButton",4]],0,Lc,[],null,{action:"action"}),(n()(),l._31(4,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,4,0,l._32(t,4,0,l._22(t,5).transform("hardware-wallet.general.close")))})}function bM(n){return l._33(0,[(n()(),l._9(0,0,null,null,10,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,mM)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,gM)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,yM)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,e.currentState===e.states.Processing),n(t,6,0,e.currentState===e.states.ShowingResult),n(t,9,0,e.currentState!==e.states.Processing)},null)}function vM(n){return l._33(0,[l._29(671088640,1,{closeButton:0}),(n()(),l._9(1,0,null,null,9,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(2,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"],disableDismiss:[2,"disableDismiss"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,_M)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,bM)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.dialogRef,l._32(t,2,1,l._22(t,3).transform("hardware-wallet.options.delete-pin")),e.currentState===e.states.Processing),n(t,6,0,e.currentState===e.states.Initial),n(t,9,0,e.currentState!==e.states.Initial)},null)}var wM=l._5("app-hw-remove-pin-dialog",od,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-hw-remove-pin-dialog",[],null,null,null,vM,fM)),l._8(1,180224,null,0,od,[da,ca,oc],null,null)],null,null)},{},{},[]),xM=l._7({encapsulation:0,styles:[[""]],data:{}});function MM(n){return l._33(0,[(n()(),l._9(0,0,null,null,7,"div",[["class","-check-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,4,"mat-checkbox",[["class","-check mat-checkbox"],["type","checkbox"]],[[8,"id",0],[2,"mat-checkbox-indeterminate",null],[2,"mat-checkbox-checked",null],[2,"mat-checkbox-disabled",null],[2,"mat-checkbox-label-before",null]],[[null,"change"]],function(n,t,e){var l=!0;return"change"===t&&(l=!1!==n.component.setConfirmed(e)&&l),l},Ym,Em)),l._28(5120,null,to,function(n){return[n]},[ta]),l._8(4,4374528,null,0,ta,[l.l,l.h,Rr,[8,null],[2,Zs]],{checked:[0,"checked"]},{change:"change"}),(n()(),l._31(5,0,["","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],function(n,t){n(t,4,0,t.component.confirmed)},function(n,t){n(t,2,0,l._22(t,4).id,l._22(t,4).indeterminate,l._22(t,4).checked,l._22(t,4).disabled,"before"==l._22(t,4).labelPosition),n(t,5,0,l._32(t,5,0,l._22(t,6).transform("hardware-wallet.update-firmware.check")))})}function kM(n){return l._33(0,[(n()(),l._9(0,0,null,null,21,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(3,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,MM)),l._8(7,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._9(9,0,null,null,11,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(11,0,null,null,3,"app-button",[],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal()&&l),l},w_,g_)),l._8(12,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(13,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.startUpdating()&&l),l},w_,g_)),l._8(17,49152,[[2,4],["button",4]],0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(18,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,e.deviceHasFirmware?e.msgIcons.Warning:e.msgIcons.HardwareWallet,l._32(t,3,1,l._22(t,4).transform(e.text))),n(t,7,0,e.deviceHasFirmware),n(t,17,0,e.deviceHasFirmware&&!e.confirmed)},function(n,t){n(t,13,0,l._32(t,13,0,l._22(t,14).transform("hardware-wallet.general.cancel"))),n(t,18,0,l._32(t,18,0,l._22(t,19).transform("hardware-wallet.general.continue")))})}function CM(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){n(t,1,0,t.component.msgIcons.Spinner,l._32(t,1,1,l._22(t,2).transform("hardware-wallet.update-firmware.title-connecting")))},null)}function SM(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){n(t,1,0,t.component.msgIcons.Confirm,l._32(t,1,1,l._22(t,2).transform("hardware-wallet.update-firmware.follow")))},null)}function OM(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h])],function(n,t){var e=t.component;n(t,1,0,e.result.icon,l._32(t,1,1,l._22(t,2).transform(e.result.text)))},null)}function TM(n){return l._33(0,[(n()(),l._9(0,0,null,null,6,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal()&&l),l},w_,g_)),l._8(3,49152,[[1,4],["closeButton",4]],0,Lc,[],null,{action:"action"}),(n()(),l._31(4,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "]))],null,function(n,t){n(t,4,0,l._32(t,4,0,l._22(t,5).transform("hardware-wallet.general.close")))})}function LM(n){return l._33(0,[(n()(),l._9(0,0,null,null,13,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,CM)),l._8(3,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,SM)),l._8(6,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,OM)),l._8(9,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n\n "])),(n()(),l._4(16777216,null,null,1,null,TM)),l._8(12,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "]))],function(n,t){var e=t.component;n(t,3,0,e.currentState===e.states.Connecting),n(t,6,0,e.currentState===e.states.Processing),n(t,9,0,e.currentState===e.states.ShowingResult),n(t,12,0,e.currentState!==e.states.Processing)},null)}function PM(n){return l._33(0,[l._29(671088640,1,{closeButton:0}),l._29(671088640,2,{button:0}),(n()(),l._9(2,0,null,null,9,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(3,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"],disableDismiss:[2,"disableDismiss"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,kM)),l._8(7,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._4(16777216,null,0,1,null,LM)),l._8(10,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n"]))],function(n,t){var e=t.component;n(t,3,0,e.dialogRef,l._32(t,3,1,l._22(t,4).transform(e.title)),e.currentState===e.states.Processing),n(t,7,0,e.currentState===e.states.Initial),n(t,10,0,e.currentState!==e.states.Initial)},null)}var DM=l._5("app-hw-update-firmware-dialog",sd,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-hw-update-firmware-dialog",[],null,null,null,PM,xM)),l._8(1,180224,null,0,sd,[ca,oc,jc,De.j],null,null)],null,null)},{},{},[]),AM=l._7({encapsulation:0,styles:[[""]],data:{}});function EM(n){return l._33(0,[l._29(402653184,1,{closeButton:0}),(n()(),l._9(1,0,null,null,20,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(2,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(5,0,null,0,2,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(6,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n\n "])),(n()(),l._9(9,0,null,0,11,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(11,0,null,null,3,"app-button",[],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closeModal()&&l),l},w_,g_)),l._8(12,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(13,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(16,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.update()&&l),l},w_,g_)),l._8(17,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(18,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.dialogRef,l._32(t,2,1,l._22(t,3).transform("hardware-wallet.update-firmware-warning.title"))),n(t,6,0,e.msgIcons.Warning,l._32(t,6,1,l._22(t,7).transform("hardware-wallet.update-firmware-warning.text")))},function(n,t){n(t,13,0,l._32(t,13,0,l._22(t,14).transform("hardware-wallet.update-firmware-warning.cancel"))),n(t,18,0,l._32(t,18,0,l._22(t,19).transform("hardware-wallet.update-firmware-warning.update")))})}var YM=l._5("app-hw-update-alert-dialog",ad,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-hw-update-alert-dialog",[],null,null,null,EM,AM)),l._8(1,180224,null,0,ad,[ca,oc],null,null)],null,null)},{},{},[]),jM=l._7({encapsulation:0,styles:[["mat-input-container[_ngcontent-%COMP%]{width:100%}.-buttons[_ngcontent-%COMP%]{text-align:center}mat-icon[_ngcontent-%COMP%]{display:inline;font-size:14px;color:rgba(121,135,152,.5);vertical-align:text-bottom;padding-left:5px}"]],data:{}});function IM(n){return l._33(0,[l._29(402653184,1,{button:0}),(n()(),l._9(1,0,null,null,44,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(2,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"],disableDismiss:[2,"disableDismiss"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(5,0,null,0,26,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,6).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,6).onReset()&&r),r},null,null)),l._8(6,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(8,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(10,0,null,null,20,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,8,"label",[["for","note"]],null,null,null,null,null)),(n()(),l._31(13,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._9(15,16777216,null,null,4,"mat-icon",[["class","mat-icon"],["role","img"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(n,t,e){var r=!0;return"longpress"===t&&(r=!1!==l._22(n,17).show()&&r),"keydown"===t&&(r=!1!==l._22(n,17)._handleKeydown(e)&&r),"touchend"===t&&(r=!1!==l._22(n,17).hide(1500)&&r),r},Hf,Rf)),l._8(16,638976,null,0,ou,[l.l,eu,[8,null]],null,null),l._8(17,147456,null,0,Iu,[Pi,l.l,Qr,l.R,l.B,Hl,Dr,Rr,Yu,[2,Dl]],{message:[0,"message"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["help"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(22,0,null,null,7,"input",[["formControlName","note"],["id","note"]],[[1,"maxlength",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown.enter"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0,i=n.component;return"input"===t&&(r=!1!==l._22(n,23)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,23).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,23)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,23)._compositionEnd(e.target.value)&&r),"keydown.enter"===t&&(r=!1!==i.changeNote()&&r),r},null,null)),l._8(23,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._8(24,540672,null,0,$o,[],{maxlength:[0,"maxlength"]},null),l._28(1024,null,Qi,function(n){return[n]},[$o]),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(27,671744,null,0,Xo,[[3,qi],[2,Qi],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(29,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(33,0,null,0,11,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(35,0,null,null,3,"app-button",[],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.closePopup()&&l),l},w_,g_)),l._8(36,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(37,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(40,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.changeNote()&&l),l},w_,g_)),l._8(41,49152,[[1,4],["button",4]],0,Lc,[],null,{action:"action"}),(n()(),l._31(42,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,2,0,e.dialogRef,l._32(t,2,1,l._22(t,3).transform("edit-note.title")),l._22(t,41)&&l._22(t,41).isLoading()),n(t,6,0,e.form),n(t,16,0),n(t,17,0,l._32(t,17,0,l._22(t,18).transform("send.personal-note-help"))),n(t,24,0,e.maxNoteChars),n(t,27,0,"note")},function(n,t){n(t,5,0,l._22(t,8).ngClassUntouched,l._22(t,8).ngClassTouched,l._22(t,8).ngClassPristine,l._22(t,8).ngClassDirty,l._22(t,8).ngClassValid,l._22(t,8).ngClassInvalid,l._22(t,8).ngClassPending),n(t,13,0,l._32(t,13,0,l._22(t,14).transform("send.personal-note-label"))),n(t,22,0,l._22(t,24).maxlength?l._22(t,24).maxlength:null,l._22(t,29).ngClassUntouched,l._22(t,29).ngClassTouched,l._22(t,29).ngClassPristine,l._22(t,29).ngClassDirty,l._22(t,29).ngClassValid,l._22(t,29).ngClassInvalid,l._22(t,29).ngClassPending),n(t,37,0,l._32(t,37,0,l._22(t,38).transform("edit-note.cancel-button"))),n(t,42,0,l._32(t,42,0,l._22(t,43).transform("edit-note.change-button")))})}var RM=l._5("app-change-note",am,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-change-note",[],null,null,null,IM,jM)),l._8(1,245760,null,0,am,[ca,da,ns,jc,ic],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]),HM=l._7({encapsulation:2,styles:[".mat-autocomplete-panel{min-width:112px;max-width:280px;overflow:auto;-webkit-overflow-scrolling:touch;visibility:hidden;max-width:none;max-height:256px;position:relative}.mat-autocomplete-panel:not([class*=mat-elevation-z]){box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.mat-autocomplete-panel.mat-autocomplete-visible{visibility:visible}.mat-autocomplete-panel.mat-autocomplete-hidden{visibility:hidden}"],data:{}});function NM(n){return l._33(0,[(n()(),l._9(0,0,[[2,0],["panel",1]],null,2,"div",[["class","mat-autocomplete-panel"],["role","listbox"]],[[8,"id",0]],null,null,null,null)),l._8(1,278528,null,0,O,[l.u,l.v,l.l,l.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),l._21(null,0)],function(n,t){n(t,1,0,"mat-autocomplete-panel",t.component._classList)},function(n,t){n(t,0,0,t.component.id)})}function FM(n){return l._33(2,[l._29(402653184,1,{template:0}),l._29(671088640,2,{panel:0}),(n()(),l._4(0,[[1,2]],null,0,null,NM))],null,null)}var BM=l._7({encapsulation:0,styles:[[".form-container[_ngcontent-%COMP%]{margin-top:20px}.option[_ngcontent-%COMP%]{font-size:13px;height:42px}"]],data:{}});function VM(n){return l._33(0,[(n()(),l._9(0,0,null,null,3,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"],upperBigText:[2,"upperBigText"]},null),l._25(131072,De.i,[De.j,l.h]),l._25(131072,De.i,[De.j,l.h])],function(n,t){n(t,1,0,t.component.msgIcons.None,l._32(t,1,1,l._22(t,2).transform("hardware-wallet.seed-word.info2")),l._32(t,1,2,l._22(t,3).transform("hardware-wallet.seed-word.info1")))},null)}function WM(n){return l._33(0,[(n()(),l._9(0,0,null,null,4,"app-hw-message",[],null,null,null,Vv,Cv)),l._8(1,49152,null,0,Rc,[],{icon:[0,"icon"],text:[1,"text"],upperBigText:[2,"upperBigText"]},null),l._25(131072,De.i,[De.j,l.h]),l._26(3,{number:0}),l._25(131072,De.i,[De.j,l.h])],function(n,t){var e=t.component;n(t,1,0,e.msgIcons.None,l._32(t,1,1,l._22(t,2).transform(e.data.restoringSoftwareWallet?"wallet.new.seed.recover-seed-help":"wallet.new.seed.new-seed-help")),l._32(t,1,2,l._22(t,4).transform("wallet.new.seed.enter-word",n(t,3,0,e.data.wordNumber))))},null)}function zM(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"label",[["for","word"]],null,null,null,null,null)),(n()(),l._31(1,null,["",""])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){n(t,1,0,l._32(t,1,0,l._22(t,2).transform("hardware-wallet.seed-word.word")))})}function UM(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"mat-option",[["class","option mat-option"],["role","option"]],[[1,"tabindex",0],[2,"mat-selected",null],[2,"mat-option-multiple",null],[2,"mat-active",null],[8,"id",0],[1,"aria-selected",0],[1,"aria-disabled",0],[2,"mat-option-disabled",null]],[[null,"click"],[null,"keydown"]],function(n,t,e){var r=!0,i=n.component;return"click"===t&&(r=!1!==l._22(n,1)._selectViaInteraction()&&r),"keydown"===t&&(r=!1!==l._22(n,1)._handleKeydown(e)&&r),"click"===t&&(r=!1!==i.sendWord()&&r),r},wm,bm)),l._8(1,49152,[[1,4]],0,pr,[l.l,l.h,[2,hr],[2,cr]],{value:[0,"value"]},null),(n()(),l._31(2,0,["",""]))],function(n,t){n(t,1,0,t.context.$implicit)},function(n,t){n(t,0,0,l._22(t,1)._getTabIndex(),l._22(t,1).selected,l._22(t,1).multiple,l._22(t,1).active,l._22(t,1).id,l._22(t,1).selected.toString(),l._22(t,1).disabled.toString(),l._22(t,1).disabled),n(t,2,0,t.context.$implicit)})}function GM(n){return l._33(0,[(n()(),l._9(0,0,null,null,49,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(1,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,VM)),l._8(5,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,1,null,WM)),l._8(8,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(10,0,null,0,30,"div",[["class","form-container"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,11).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,11).onReset()&&r),r},null,null)),l._8(11,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(13,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(15,0,null,null,24,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,zM)),l._8(18,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(20,16777216,null,null,8,"input",[["aria-autocomplete","list"],["autocomplete","off"],["class","mat-input-element mat-form-field-autofill-control"],["formControlName","word"],["id","word"],["matInput",""],["role","combobox"]],[[1,"aria-activedescendant",0],[1,"aria-expanded",0],[1,"aria-owns",0],[2,"mat-input-server",null],[1,"id",0],[8,"placeholder",0],[8,"disabled",0],[8,"required",0],[8,"readOnly",0],[1,"aria-describedby",0],[1,"aria-invalid",0],[1,"aria-required",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown.enter"],[null,"focusin"],[null,"blur"],[null,"input"],[null,"keydown"],[null,"compositionstart"],[null,"compositionend"],[null,"focus"]],function(n,t,e){var r=!0,i=n.component;return"focusin"===t&&(r=!1!==l._22(n,22)._handleFocus()&&r),"blur"===t&&(r=!1!==l._22(n,22)._onTouched()&&r),"input"===t&&(r=!1!==l._22(n,22)._handleInput(e)&&r),"keydown"===t&&(r=!1!==l._22(n,22)._handleKeydown(e)&&r),"input"===t&&(r=!1!==l._22(n,23)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,23).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,23)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,23)._compositionEnd(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,27)._focusChanged(!1)&&r),"focus"===t&&(r=!1!==l._22(n,27)._focusChanged(!0)&&r),"input"===t&&(r=!1!==l._22(n,27)._onInput()&&r),"keydown.enter"===t&&(r=!1!==i.sendWord()&&r),r},null,null)),l._28(6144,null,Os,null,[pu]),l._8(22,147456,null,0,Is,[l.l,Pi,l.R,l.B,l.h,Ys,[2,Dl],[8,null],[2,sn]],{autocomplete:[0,"autocomplete"]},null),l._8(23,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n,t){return[n,t]},[Is,ro]),l._8(25,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(27,933888,null,0,pu,[l.l,Hl,[2,uo],[2,Wo],[2,qo],Kl,[8,null]],{id:[0,"id"]},null),l._8(28,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(30,0,null,null,8,"mat-autocomplete",[["class","mat-autocomplete"]],null,null,null,FM,HM)),l._8(31,1097728,[["auto",4]],2,Es,[l.h,l.l],null,null),l._29(603979776,1,{options:1}),l._29(603979776,2,{optionGroups:1}),(n()(),l._31(-1,0,["\n "])),(n()(),l._4(16777216,null,0,2,null,UM)),l._8(36,802816,null,0,L,[l.R,l.O,l.u],{ngForOf:[0,"ngForOf"]},null),l._25(131072,nn,[l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(42,0,null,0,6,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(44,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.sendWord()&&l),l},w_,g_)),l._8(45,49152,null,0,Lc,[],{disabled:[0,"disabled"]},{action:"action"}),(n()(),l._31(46,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,1,0,e.dialogRef,l._32(t,1,1,l._22(t,2).transform(e.data.isForHwWallet?"hardware-wallet.seed-word.title":"wallet.new.seed-label"))),n(t,5,0,e.data.isForHwWallet),n(t,8,0,!e.data.isForHwWallet),n(t,11,0,e.form),n(t,18,0,e.data.isForHwWallet),n(t,22,0,l._22(t,31)),n(t,25,0,"word"),n(t,27,0,"word"),n(t,36,0,l._32(t,36,0,l._22(t,37).transform(e.filteredOptions))),n(t,45,0,!e.form.valid)},function(n,t){n(t,10,0,l._22(t,13).ngClassUntouched,l._22(t,13).ngClassTouched,l._22(t,13).ngClassPristine,l._22(t,13).ngClassDirty,l._22(t,13).ngClassValid,l._22(t,13).ngClassInvalid,l._22(t,13).ngClassPending),n(t,20,1,[null==l._22(t,22).activeOption?null:l._22(t,22).activeOption.id,l._22(t,22).panelOpen.toString(),null==l._22(t,22).autocomplete?null:l._22(t,22).autocomplete.id,l._22(t,27)._isServer,l._22(t,27).id,l._22(t,27).placeholder,l._22(t,27).disabled,l._22(t,27).required,l._22(t,27).readonly,l._22(t,27)._ariaDescribedby||null,l._22(t,27).errorState,l._22(t,27).required.toString(),l._22(t,28).ngClassUntouched,l._22(t,28).ngClassTouched,l._22(t,28).ngClassPristine,l._22(t,28).ngClassDirty,l._22(t,28).ngClassValid,l._22(t,28).ngClassInvalid,l._22(t,28).ngClassPending]),n(t,46,0,l._32(t,46,0,l._22(t,47).transform("hardware-wallet.general.continue")))})}var qM=l._5("app-seed-word-dialog",Hc,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-seed-word-dialog",[],null,null,null,GM,BM)),l._8(1,245760,null,0,Hc,[da,ca,ns,Ac,jc,De.j,oc],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]),JM=l._7({encapsulation:0,styles:[[".form-container[_ngcontent-%COMP%]{margin-top:20px}"]],data:{}});function QM(n){return l._33(0,[(n()(),l._9(0,0,null,null,31,"app-modal",[["class","modal"]],null,null,null,wv,bv)),l._8(1,573440,null,0,yv,[],{dialog:[0,"dialog"],headline:[1,"headline"]},null),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(4,0,null,0,2,"div",[["class","-body"]],null,null,null,null,null)),(n()(),l._31(5,null,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(8,0,null,0,14,"div",[["class","form-container"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(n,t,e){var r=!0;return"submit"===t&&(r=!1!==l._22(n,9).onSubmit(e)&&r),"reset"===t&&(r=!1!==l._22(n,9).onReset()&&r),r},null,null)),l._8(9,540672,null,0,qo,[[8,null],[8,null]],{form:[0,"form"]},null),l._28(2048,null,qi,null,[qo]),l._8(11,16384,null,0,Yo,[qi],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(13,0,null,null,8,"div",[["class","form-field"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(15,0,null,null,5,"textarea",[["formControlName","data"],["id","data"],["rows","5"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(n,t,e){var r=!0;return"input"===t&&(r=!1!==l._22(n,16)._handleInput(e.target.value)&&r),"blur"===t&&(r=!1!==l._22(n,16).onTouched()&&r),"compositionstart"===t&&(r=!1!==l._22(n,16)._compositionStart()&&r),"compositionend"===t&&(r=!1!==l._22(n,16)._compositionEnd(e.target.value)&&r),r},null,null)),l._8(16,16384,null,0,ro,[l.G,l.l,[2,lo]],null,null),l._28(1024,null,to,function(n){return[n]},[ro]),l._8(18,671744,null,0,Xo,[[3,qi],[8,null],[8,null],[2,to]],{name:[0,"name"]},null),l._28(2048,null,uo,null,[Xo]),l._8(20,16384,null,0,Eo,[uo],null,null),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n "])),(n()(),l._9(24,0,null,0,6,"div",[["class","-buttons"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(26,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(n,t,e){var l=!0;return"action"===t&&(l=!1!==n.component.processData()&&l),l},w_,g_)),l._8(27,49152,null,0,Lc,[],null,{action:"action"}),(n()(),l._31(28,0,["\n ","\n "])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,0,["\n"])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,1,0,e.dialogRef,l._32(t,1,1,l._22(t,2).transform("send.bulk-send.title"))),n(t,9,0,e.form),n(t,18,0,"data")},function(n,t){n(t,5,0,l._32(t,5,0,l._22(t,6).transform("send.bulk-send.indications"))),n(t,8,0,l._22(t,11).ngClassUntouched,l._22(t,11).ngClassTouched,l._22(t,11).ngClassPristine,l._22(t,11).ngClassDirty,l._22(t,11).ngClassValid,l._22(t,11).ngClassInvalid,l._22(t,11).ngClassPending),n(t,15,0,l._22(t,20).ngClassUntouched,l._22(t,20).ngClassTouched,l._22(t,20).ngClassPristine,l._22(t,20).ngClassDirty,l._22(t,20).ngClassValid,l._22(t,20).ngClassInvalid,l._22(t,20).ngClassPending),n(t,28,0,l._32(t,28,0,l._22(t,29).transform("send.bulk-send.process")))})}var KM=l._5("app-multiple-destinations-dialog",Hm,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-multiple-destinations-dialog",[],null,null,null,QM,JM)),l._8(1,245760,null,0,Hm,[ca,da,ns,jc],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]),XM=l._7({encapsulation:0,styles:[[".main-container[_ngcontent-%COMP%]{position:fixed;bottom:0;width:100%;z-index:1000000;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.internal-container[_ngcontent-%COMP%]{color:#fff;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;min-width:40%;max-width:90%;display:-webkit-box;display:-ms-flexbox;display:flex;padding:10px;border-top-left-radius:5px;border-top-right-radius:5px}.red-background[_ngcontent-%COMP%]{background-color:rgba(255,0,0,.7)}.green-background[_ngcontent-%COMP%]{background-color:rgba(31,177,31,.7)}.yellow-background[_ngcontent-%COMP%]{background-color:rgba(255,94,0,.7)}.icon-container[_ngcontent-%COMP%]{margin-right:10px}.text-container[_ngcontent-%COMP%]{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;margin-right:10px}.text-container[_ngcontent-%COMP%] .title[_ngcontent-%COMP%]{font-size:15px;margin-top:-1px}.text-container[_ngcontent-%COMP%] .text[_ngcontent-%COMP%]{font-size:13px;margin-top:2px}.close-container[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{cursor:pointer}"]],data:{}});function ZM(n){return l._33(0,[(n()(),l._9(0,0,null,null,3,"div",[["class","icon-container"]],null,null,null,null,null)),(n()(),l._9(1,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Hf,Rf)),l._8(2,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(3,0,["",""]))],function(n,t){n(t,2,0)},function(n,t){n(t,3,0,t.component.config.icon)})}function $M(n){return l._33(0,[(n()(),l._9(0,0,null,null,2,"div",[["class","title"]],null,null,null,null,null)),(n()(),l._31(1,null,["",""])),l._25(131072,De.i,[De.j,l.h])],null,function(n,t){var e=t.component;n(t,1,0,l._32(t,1,0,l._22(t,2).transform(e.config.title)))})}function nk(n){return l._33(0,[(n()(),l._9(0,0,null,null,22,"div",[["class","main-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(2,0,null,null,19,"div",[],[[8,"className",0]],null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,ZM)),l._8(5,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(7,0,null,null,8,"div",[["class","text-container"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._4(16777216,null,null,1,null,$M)),l._8(10,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(12,0,null,null,2,"div",[["class","text"]],null,null,null,null,null)),(n()(),l._31(13,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(17,0,null,null,3,"div",[["class","close-container"]],null,null,null,null,null)),(n()(),l._9(18,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,[[null,"click"]],function(n,t,e){var l=!0;return"click"===t&&(l=!1!==n.component.hide()&&l),l},Hf,Rf)),l._8(19,638976,null,0,ou,[l.l,eu,[8,null]],null,null),(n()(),l._31(-1,0,["close"])),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n"]))],function(n,t){var e=t.component;n(t,5,0,e.config.icon),n(t,10,0,e.config.title),n(t,19,0)},function(n,t){var e=t.component;n(t,2,0,"internal-container "+(e.config.color?e.config.color:"red-background")),n(t,13,0,l._32(t,13,0,l._22(t,14).transform(e.config.text)))})}function tk(n){return l._33(0,[(n()(),l._4(16777216,null,null,1,null,nk)),l._8(1,16384,null,0,D,[l.R,l.O],{ngIf:[0,"ngIf"]},null),(n()(),l._31(-1,null,["\n"]))],function(n,t){n(t,1,0,t.component.visible)},null)}var ek=l._7({encapsulation:0,styles:[[".size-alert[_ngcontent-%COMP%]{background-color:rgba(0,0,0,.85);position:fixed;top:0;left:0;width:100%;height:100%;z-index:10000;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;text-align:center;color:#fff}.size-alert[_ngcontent-%COMP%] > div[_ngcontent-%COMP%]{margin:0 40px;max-width:400px}mat-card[_ngcontent-%COMP%]{max-width:1000px;margin-top:80px;margin-right:auto;margin-left:auto}.logo[_ngcontent-%COMP%]{max-height:100%}.fill-remaining-space[_ngcontent-%COMP%]{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.sky-container[_ngcontent-%COMP%]{max-width:1000px;margin-top:20px;margin-right:auto;margin-left:auto}mat-toolbar[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{margin:0 20px}.search-field[_ngcontent-%COMP%]{border-radius:8px;border:none;background-color:#fff;padding:8px}.syncing[_ngcontent-%COMP%]{font-size:14px}.main-menu[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{margin-right:20px}#top-menu[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:#fbfbfb}#top-menu[_ngcontent-%COMP%] span#version[_ngcontent-%COMP%]{padding-top:12px}"]],data:{}});function lk(n){return l._33(0,[l._29(402653184,1,{msgBar:0}),(n()(),l._9(1,0,null,null,10,"div",[["class","size-alert d-md-none"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(3,0,null,null,7,"div",[],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(5,0,null,null,0,"img",[["src","assets/img/size-alert.png"]],null,null,null,null,null)),(n()(),l._31(-1,null,["\n "])),(n()(),l._9(7,0,null,null,2,"div",[],null,null,null,null,null)),(n()(),l._31(8,null,["",""])),l._25(131072,De.i,[De.j,l.h]),(n()(),l._31(-1,null,["\n "])),(n()(),l._31(-1,null,["\n"])),(n()(),l._31(-1,null,["\n"])),(n()(),l._9(13,16777216,null,null,1,"router-outlet",[],null,null,null,null,null)),l._8(14,212992,null,0,bp,[yp,l.R,l.j,[8,null],l.h],null,null),(n()(),l._31(-1,null,["\n"])),(n()(),l._9(16,0,null,null,1,"app-msg-bar",[],null,null,null,tk,XM)),l._8(17,49152,[[1,4],["msgBar",4]],0,Yc,[],null,null)],function(n,t){n(t,14,0)},function(n,t){n(t,8,0,l._32(t,8,0,l._22(t,9).transform("errors.window-size")))})}var rk=l._5("app-root",wf,function(n){return l._33(0,[(n()(),l._9(0,0,null,null,1,"app-root",[],null,null,null,lk,ek)),l._8(1,114688,null,0,wf,[gf,Bc,Sc,oc,Xu,Zu,Ac,fa,jc],null,null)],function(n,t){n(t,1,0)},null)},{},{},[]);function ik(n){switch(n.length){case 0:return new us;case 1:return n[0];default:return new cs(n)}}function ok(n,t,e,l,r,i){void 0===r&&(r={}),void 0===i&&(i={});var o=[],s=[],a=-1,u=null;if(l.forEach(function(n){var e=n.offset,l=e==a,c=l&&u||{};Object.keys(n).forEach(function(e){var l=e,s=n[e];if("offset"!==e)switch(l=t.normalizePropertyName(l,o),s){case ds:s=r[e];break;case is:s=i[e];break;default:s=t.normalizeStyleValue(e,l,s,o)}c[l]=s}),l||s.push(c),u=c,a=e}),o.length)throw new Error("Unable to animate due to the following errors:\n - "+o.join("\n - "));return s}function sk(n,t,e,l){switch(t){case"start":n.onStart(function(){return l(e&&ak(e,"start",n.totalTime))});break;case"done":n.onDone(function(){return l(e&&ak(e,"done",n.totalTime))});break;case"destroy":n.onDestroy(function(){return l(e&&ak(e,"destroy",n.totalTime))})}}function ak(n,t,e){var l=uk(n.element,n.triggerName,n.fromState,n.toState,t||n.phaseName,void 0==e?n.totalTime:e),r=n._data;return null!=r&&(l._data=r),l}function uk(n,t,e,l,r,i){return void 0===r&&(r=""),void 0===i&&(i=0),{element:n,triggerName:t,fromState:e,toState:l,phaseName:r,totalTime:i}}function ck(n,t,e){var l;return n instanceof Map?(l=n.get(t))||n.set(t,l=e):(l=n[t])||(l=n[t]=e),l}function dk(n){var t=n.indexOf(":");return[n.substring(1,t),n.substr(t+1)]}var hk=function(n,t){return!1},pk=function(n,t){return!1},fk=function(n,t,e){return[]};if("undefined"!=typeof Element){if(hk=function(n,t){return n.contains(t)},Element.prototype.matches)pk=function(n,t){return n.matches(t)};else{var _k=Element.prototype,mk=_k.matchesSelector||_k.mozMatchesSelector||_k.msMatchesSelector||_k.oMatchesSelector||_k.webkitMatchesSelector;mk&&(pk=function(n,t){return mk.apply(n,[t])})}fk=function(n,t,e){var l=[];if(e)l.push.apply(l,n.querySelectorAll(t));else{var r=n.querySelector(t);r&&l.push(r)}return l}}var gk=null,yk=!1;function bk(){return"undefined"!=typeof document?document.body:null}var vk=pk,wk=hk,xk=fk,Mk=function(){function n(){}return n.prototype.validateStyleProperty=function(n){return function(n){gk||(gk=bk()||{},yk=!!gk.style&&"WebkitAppearance"in gk.style);var t=!0;return gk.style&&!function(n){return"ebkit"==n.substring(1,6)}(n)&&!(t=n in gk.style)&&yk&&(t="Webkit"+n.charAt(0).toUpperCase()+n.substr(1)in gk.style),t}(n)},n.prototype.matchesElement=function(n,t){return vk(n,t)},n.prototype.containsElement=function(n,t){return wk(n,t)},n.prototype.query=function(n,t,e){return xk(n,t,e)},n.prototype.computeStyle=function(n,t,e){return e||""},n.prototype.animate=function(n,t,e,l,r,i){return void 0===i&&(i=[]),new us},n}(),kk=function(){function n(){}return n.NOOP=new Mk,n}(),Ck=1e3;function Sk(n){if("number"==typeof n)return n;var t=n.match(/^(-?[\.\d]+)(m?s)/);return!t||t.length<2?0:Ok(parseFloat(t[1]),t[2])}function Ok(n,t){switch(t){case"s":return n*Ck;default:return n}}function Tk(n,t,e){return n.hasOwnProperty("duration")?n:function(n,t,e){var l,r=0,i="";if("string"==typeof n){var o=n.match(/^(-?[\.\d]+)(m?s)(?:\s+(-?[\.\d]+)(m?s))?(?:\s+([-a-z]+(?:\(.+?\))?))?$/i);if(null===o)return t.push('The provided timing value "'+n+'" is invalid.'),{duration:0,delay:0,easing:""};l=Ok(parseFloat(o[1]),o[2]);var s=o[3];null!=s&&(r=Ok(Math.floor(parseFloat(s)),o[4]));var a=o[5];a&&(i=a)}else l=n;if(!e){var u=!1,c=t.length;l<0&&(t.push("Duration values below 0 are not allowed for this animation step."),u=!0),r<0&&(t.push("Delay values below 0 are not allowed for this animation step."),u=!0),u&&t.splice(c,0,'The provided timing value "'+n+'" is invalid.')}return{duration:l,delay:r,easing:i}}(n,t,e)}function Lk(n,t){return void 0===t&&(t={}),Object.keys(n).forEach(function(e){t[e]=n[e]}),t}function Pk(n,t,e){if(void 0===e&&(e={}),t)for(var l in n)e[l]=n[l];else Lk(n,e);return e}function Dk(n,t){n.style&&Object.keys(t).forEach(function(e){var l=Nk(e);n.style[l]=t[e]})}function Ak(n,t){n.style&&Object.keys(t).forEach(function(t){var e=Nk(t);n.style[e]=""})}function Ek(n){return Array.isArray(n)?1==n.length?n[0]:os(n):n}var Yk=new RegExp("{{\\s*(.+?)\\s*}}","g");function jk(n){var t=[];if("string"==typeof n){for(var e=n.toString(),l=void 0;l=Yk.exec(e);)t.push(l[1]);Yk.lastIndex=0}return t}function Ik(n,t,e){var l=n.toString(),r=l.replace(Yk,function(n,l){var r=t[l];return t.hasOwnProperty(l)||(e.push("Please provide a value for the animation param "+l),r=""),r.toString()});return r==l?n:r}function Rk(n){for(var t=[],e=n.next();!e.done;)t.push(e.value),e=n.next();return t}var Hk=/-+([a-z0-9])/g;function Nk(n){return n.replace(Hk,function(){for(var n=[],t=0;t *";case":leave":return"* => void";case":increment":return function(n,t){return parseFloat(t)>parseFloat(n)};case":decrement":return function(n,t){return parseFloat(t) *"}}(n,e);if("function"==typeof l)return void t.push(l);n=l}var r=n.match(/^(\*|[-\w]+)\s*()\s*(\*|[-\w]+)$/);if(null==r||r.length<4)return e.push('The provided transition expression "'+n+'" is not supported'),t;var i=r[1],o=r[2],s=r[3];t.push(zk(i,s)),"<"!=o[0]||i==Bk&&s==Bk||t.push(zk(s,i))}(n,r,l)}):r.push(e),r),animation:i,queryCount:t.queryCount,depCount:t.depCount,options:Kk(n.options)}},n.prototype.visitSequence=function(n,t){var e=this;return{type:2,steps:n.steps.map(function(n){return Fk(e,n,t)}),options:Kk(n.options)}},n.prototype.visitGroup=function(n,t){var e=this,l=t.currentTime,r=0,i=n.steps.map(function(n){t.currentTime=l;var i=Fk(e,n,t);return r=Math.max(r,t.currentTime),i});return t.currentTime=r,{type:3,steps:i,options:Kk(n.options)}},n.prototype.visitAnimate=function(n,t){var e,l=function(n,t){var e=null;if(n.hasOwnProperty("duration"))e=n;else if("number"==typeof n)return Xk(Tk(n,t).duration,0,"");var l=n;if(l.split(/\s+/).some(function(n){return"{"==n.charAt(0)&&"{"==n.charAt(1)})){var r=Xk(0,0,"");return r.dynamic=!0,r.strValue=l,r}return Xk((e=e||Tk(l,t)).duration,e.delay,e.easing)}(n.timings,t.errors);t.currentAnimateTimings=l;var r=n.styles?n.styles:ss({});if(5==r.type)e=this.visitKeyframes(r,t);else{var i=n.styles,o=!1;if(!i){o=!0;var s={};l.easing&&(s.easing=l.easing),i=ss(s)}t.currentTime+=l.duration+l.delay;var a=this.visitStyle(i,t);a.isEmptyStep=o,e=a}return t.currentAnimateTimings=null,{type:4,timings:l,style:e,options:null}},n.prototype.visitStyle=function(n,t){var e=this._makeStyleAst(n,t);return this._validateStyleAst(e,t),e},n.prototype._makeStyleAst=function(n,t){var e=[];Array.isArray(n.styles)?n.styles.forEach(function(n){"string"==typeof n?n==is?e.push(n):t.errors.push("The provided style string value "+n+" is not allowed."):e.push(n)}):e.push(n.styles);var l=!1,r=null;return e.forEach(function(n){if(Qk(n)){var t=n,e=t.easing;if(e&&(r=e,delete t.easing),!l)for(var i in t)if(t[i].toString().indexOf("{{")>=0){l=!0;break}}}),{type:6,styles:e,easing:r,offset:n.offset,containsDynamicStyles:l,options:null}},n.prototype._validateStyleAst=function(n,t){var e=this,l=t.currentAnimateTimings,r=t.currentTime,i=t.currentTime;l&&i>0&&(i-=l.duration+l.delay),n.styles.forEach(function(n){"string"!=typeof n&&Object.keys(n).forEach(function(l){if(e._driver.validateStyleProperty(l)){var o,s,a,u=t.collectedStyles[t.currentQuerySelector],c=u[l],d=!0;c&&(i!=r&&i>=c.startTime&&r<=c.endTime&&(t.errors.push('The CSS property "'+l+'" that exists between the times of "'+c.startTime+'ms" and "'+c.endTime+'ms" is also being animated in a parallel animation between the times of "'+i+'ms" and "'+r+'ms"'),d=!1),i=c.startTime),d&&(u[l]={startTime:i,endTime:r}),t.options&&(o=t.errors,s=t.options.params||{},(a=jk(n[l])).length&&a.forEach(function(n){s.hasOwnProperty(n)||o.push("Unable to resolve the local animation param "+n+" in the given list of values")}))}else t.errors.push('The provided animation property "'+l+'" is not a supported CSS property for animations')})})},n.prototype.visitKeyframes=function(n,t){var e=this,l={type:5,styles:[],options:null};if(!t.currentAnimateTimings)return t.errors.push("keyframes() must be placed inside of a call to animate()"),l;var r=0,i=[],o=!1,s=!1,a=0,u=n.steps.map(function(n){var l=e._makeStyleAst(n,t),u=null!=l.offset?l.offset:function(n){if("string"==typeof n)return null;var t=null;if(Array.isArray(n))n.forEach(function(n){if(Qk(n)&&n.hasOwnProperty("offset")){var e=n;t=parseFloat(e.offset),delete e.offset}});else if(Qk(n)&&n.hasOwnProperty("offset")){var e=n;t=parseFloat(e.offset),delete e.offset}return t}(l.styles),c=0;return null!=u&&(r++,c=l.offset=u),s=s||c<0||c>1,o=o||c0&&r0?r==h?1:d*r:i[r],s=o*_;t.currentTime=p+f.delay+s,f.duration=s,e._validateStyleAst(n,t),n.offset=o,l.styles.push(n)}),l},n.prototype.visitReference=function(n,t){return{type:8,animation:Fk(this,Ek(n.animation),t),options:Kk(n.options)}},n.prototype.visitAnimateChild=function(n,t){return t.depCount++,{type:9,options:Kk(n.options)}},n.prototype.visitAnimateRef=function(n,t){return{type:10,animation:this.visitReference(n.animation,t),options:Kk(n.options)}},n.prototype.visitQuery=function(n,t){var e=t.currentQuerySelector,l=n.options||{};t.queryCount++,t.currentQuery=n;var r=function(n){var t=!!n.split(/\s*,\s*/).find(function(n){return":self"==n});return t&&(n=n.replace(Uk,"")),[n=n.replace(/@\*/g,".ng-trigger").replace(/@\w+/g,function(n){return".ng-trigger-"+n.substr(1)}).replace(/:animating/g,".ng-animating"),t]}(n.selector),i=r[0],o=r[1];t.currentQuerySelector=e.length?e+" "+i:i,ck(t.collectedStyles,t.currentQuerySelector,{});var s=Fk(this,Ek(n.animation),t);return t.currentQuery=null,t.currentQuerySelector=e,{type:11,selector:i,limit:l.limit||0,optional:!!l.optional,includeSelf:o,animation:s,originalSelector:n.selector,options:Kk(n.options)}},n.prototype.visitStagger=function(n,t){t.currentQuery||t.errors.push("stagger() can only be used inside of query()");var e="full"===n.timings?{duration:0,delay:0,easing:"full"}:Tk(n.timings,t.errors,!0);return{type:12,animation:Fk(this,Ek(n.animation),t),timings:e,options:null}},n}(),Jk=function(n){this.errors=n,this.queryCount=0,this.depCount=0,this.currentTransition=null,this.currentQuery=null,this.currentQuerySelector=null,this.currentAnimateTimings=null,this.currentTime=0,this.collectedStyles={},this.options=null};function Qk(n){return!Array.isArray(n)&&"object"==typeof n}function Kk(n){var t;return n?(n=Lk(n)).params&&(n.params=(t=n.params)?Lk(t):null):n={},n}function Xk(n,t,e){return{duration:n,delay:t,easing:e}}function Zk(n,t,e,l,r,i,o,s){return void 0===o&&(o=null),void 0===s&&(s=!1),{type:1,element:n,keyframes:t,preStyleProps:e,postStyleProps:l,duration:r,delay:i,totalTime:r+i,easing:o,subTimeline:s}}var $k=function(){function n(){this._map=new Map}return n.prototype.consume=function(n){var t=this._map.get(n);return t?this._map.delete(n):t=[],t},n.prototype.append=function(n,t){var e=this._map.get(n);e||this._map.set(n,e=[]),e.push.apply(e,t)},n.prototype.has=function(n){return this._map.has(n)},n.prototype.clear=function(){this._map.clear()},n}(),nC=new RegExp(":enter","g"),tC=new RegExp(":leave","g");function eC(n,t,e,l,r,i,o,s,a,u){return void 0===i&&(i={}),void 0===o&&(o={}),void 0===u&&(u=[]),(new lC).buildKeyframes(n,t,e,l,r,i,o,s,a,u)}var lC=function(){function n(){}return n.prototype.buildKeyframes=function(n,t,e,l,r,i,o,s,a,u){void 0===u&&(u=[]),a=a||new $k;var c=new iC(n,t,a,l,r,u,[]);c.options=s,c.currentTimeline.setStyles([i],null,c.errors,s),Fk(this,e,c);var d=c.timelines.filter(function(n){return n.containsAnimation()});if(d.length&&Object.keys(o).length){var h=d[d.length-1];h.allowOnlyTimelineStyles()||h.setStyles([o],null,c.errors,s)}return d.length?d.map(function(n){return n.buildKeyframes()}):[Zk(t,[],[],[],0,0,"",!1)]},n.prototype.visitTrigger=function(n,t){},n.prototype.visitState=function(n,t){},n.prototype.visitTransition=function(n,t){},n.prototype.visitAnimateChild=function(n,t){var e=t.subInstructions.consume(t.element);if(e){var l=t.createSubContext(n.options),r=t.currentTimeline.currentTime,i=this._visitSubInstructions(e,l,l.options);r!=i&&t.transformIntoNewTimeline(i)}t.previousNode=n},n.prototype.visitAnimateRef=function(n,t){var e=t.createSubContext(n.options);e.transformIntoNewTimeline(),this.visitReference(n.animation,e),t.transformIntoNewTimeline(e.currentTimeline.currentTime),t.previousNode=n},n.prototype._visitSubInstructions=function(n,t,e){var l=t.currentTimeline.currentTime,r=null!=e.duration?Sk(e.duration):null,i=null!=e.delay?Sk(e.delay):null;return 0!==r&&n.forEach(function(n){var e=t.appendInstructionToTimeline(n,r,i);l=Math.max(l,e.duration+e.delay)}),l},n.prototype.visitReference=function(n,t){t.updateOptions(n.options,!0),Fk(this,n.animation,t),t.previousNode=n},n.prototype.visitSequence=function(n,t){var e=this,l=t.subContextCount,r=t,i=n.options;if(i&&(i.params||i.delay)&&((r=t.createSubContext(i)).transformIntoNewTimeline(),null!=i.delay)){6==r.previousNode.type&&(r.currentTimeline.snapshotCurrentStyles(),r.previousNode=rC);var o=Sk(i.delay);r.delayNextStep(o)}n.steps.length&&(n.steps.forEach(function(n){return Fk(e,n,r)}),r.currentTimeline.applyStylesToKeyframe(),r.subContextCount>l&&r.transformIntoNewTimeline()),t.previousNode=n},n.prototype.visitGroup=function(n,t){var e=this,l=[],r=t.currentTimeline.currentTime,i=n.options&&n.options.delay?Sk(n.options.delay):0;n.steps.forEach(function(o){var s=t.createSubContext(n.options);i&&s.delayNextStep(i),Fk(e,o,s),r=Math.max(r,s.currentTimeline.currentTime),l.push(s.currentTimeline)}),l.forEach(function(n){return t.currentTimeline.mergeTimelineCollectedStyles(n)}),t.transformIntoNewTimeline(r),t.previousNode=n},n.prototype._visitTiming=function(n,t){if(n.dynamic){var e=n.strValue;return Tk(t.params?Ik(e,t.params,t.errors):e,t.errors)}return{duration:n.duration,delay:n.delay,easing:n.easing}},n.prototype.visitAnimate=function(n,t){var e=t.currentAnimateTimings=this._visitTiming(n.timings,t),l=t.currentTimeline;e.delay&&(t.incrementTime(e.delay),l.snapshotCurrentStyles());var r=n.style;5==r.type?this.visitKeyframes(r,t):(t.incrementTime(e.duration),this.visitStyle(r,t),l.applyStylesToKeyframe()),t.currentAnimateTimings=null,t.previousNode=n},n.prototype.visitStyle=function(n,t){var e=t.currentTimeline,l=t.currentAnimateTimings;!l&&e.getCurrentStyleProperties().length&&e.forwardFrame();var r=l&&l.easing||n.easing;n.isEmptyStep?e.applyEmptyStep(r):e.setStyles(n.styles,r,t.errors,t.options),t.previousNode=n},n.prototype.visitKeyframes=function(n,t){var e=t.currentAnimateTimings,l=t.currentTimeline.duration,r=e.duration,i=t.createSubContext().currentTimeline;i.easing=e.easing,n.styles.forEach(function(n){i.forwardTime((n.offset||0)*r),i.setStyles(n.styles,n.easing,t.errors,t.options),i.applyStylesToKeyframe()}),t.currentTimeline.mergeTimelineCollectedStyles(i),t.transformIntoNewTimeline(l+r),t.previousNode=n},n.prototype.visitQuery=function(n,t){var e=this,l=t.currentTimeline.currentTime,r=n.options||{},i=r.delay?Sk(r.delay):0;i&&(6===t.previousNode.type||0==l&&t.currentTimeline.getCurrentStyleProperties().length)&&(t.currentTimeline.snapshotCurrentStyles(),t.previousNode=rC);var o=l,s=t.invokeQuery(n.selector,n.originalSelector,n.limit,n.includeSelf,!!r.optional,t.errors);t.currentQueryTotal=s.length;var a=null;s.forEach(function(l,r){t.currentQueryIndex=r;var s=t.createSubContext(n.options,l);i&&s.delayNextStep(i),l===t.element&&(a=s.currentTimeline),Fk(e,n.animation,s),s.currentTimeline.applyStylesToKeyframe(),o=Math.max(o,s.currentTimeline.currentTime)}),t.currentQueryIndex=0,t.currentQueryTotal=0,t.transformIntoNewTimeline(o),a&&(t.currentTimeline.mergeTimelineCollectedStyles(a),t.currentTimeline.snapshotCurrentStyles()),t.previousNode=n},n.prototype.visitStagger=function(n,t){var e=t.parentContext,l=t.currentTimeline,r=n.timings,i=Math.abs(r.duration),o=i*(t.currentQueryTotal-1),s=i*t.currentQueryIndex;switch(r.duration<0?"reverse":r.easing){case"reverse":s=o-s;break;case"full":s=e.currentStaggerTime}var a=t.currentTimeline;s&&a.delayNextStep(s);var u=a.currentTime;Fk(this,n.animation,t),t.previousNode=n,e.currentStaggerTime=l.currentTime-u+(l.startTime-e.currentTimeline.startTime)},n}(),rC={},iC=function(){function n(n,t,e,l,r,i,o,s){this._driver=n,this.element=t,this.subInstructions=e,this._enterClassName=l,this._leaveClassName=r,this.errors=i,this.timelines=o,this.parentContext=null,this.currentAnimateTimings=null,this.previousNode=rC,this.subContextCount=0,this.options={},this.currentQueryIndex=0,this.currentQueryTotal=0,this.currentStaggerTime=0,this.currentTimeline=s||new oC(this._driver,t,0),o.push(this.currentTimeline)}return Object.defineProperty(n.prototype,"params",{get:function(){return this.options.params},enumerable:!0,configurable:!0}),n.prototype.updateOptions=function(n,t){var e=this;if(n){var l=n,r=this.options;null!=l.duration&&(r.duration=Sk(l.duration)),null!=l.delay&&(r.delay=Sk(l.delay));var i=l.params;if(i){var o=r.params;o||(o=this.options.params={}),Object.keys(i).forEach(function(n){t&&o.hasOwnProperty(n)||(o[n]=Ik(i[n],o,e.errors))})}}},n.prototype._copyOptions=function(){var n={};if(this.options){var t=this.options.params;if(t){var e=n.params={};Object.keys(t).forEach(function(n){e[n]=t[n]})}}return n},n.prototype.createSubContext=function(t,e,l){void 0===t&&(t=null);var r=e||this.element,i=new n(this._driver,r,this.subInstructions,this._enterClassName,this._leaveClassName,this.errors,this.timelines,this.currentTimeline.fork(r,l||0));return i.previousNode=this.previousNode,i.currentAnimateTimings=this.currentAnimateTimings,i.options=this._copyOptions(),i.updateOptions(t),i.currentQueryIndex=this.currentQueryIndex,i.currentQueryTotal=this.currentQueryTotal,i.parentContext=this,this.subContextCount++,i},n.prototype.transformIntoNewTimeline=function(n){return this.previousNode=rC,this.currentTimeline=this.currentTimeline.fork(this.element,n),this.timelines.push(this.currentTimeline),this.currentTimeline},n.prototype.appendInstructionToTimeline=function(n,t,e){var l={duration:null!=t?t:n.duration,delay:this.currentTimeline.currentTime+(null!=e?e:0)+n.delay,easing:""},r=new sC(this._driver,n.element,n.keyframes,n.preStyleProps,n.postStyleProps,l,n.stretchStartingKeyframe);return this.timelines.push(r),l},n.prototype.incrementTime=function(n){this.currentTimeline.forwardTime(this.currentTimeline.duration+n)},n.prototype.delayNextStep=function(n){n>0&&this.currentTimeline.delayNextStep(n)},n.prototype.invokeQuery=function(n,t,e,l,r,i){var o=[];if(l&&o.push(this.element),n.length>0){n=(n=n.replace(nC,"."+this._enterClassName)).replace(tC,"."+this._leaveClassName);var s=this._driver.query(this.element,n,1!=e);0!==e&&(s=e<0?s.slice(s.length+e,s.length):s.slice(0,e)),o.push.apply(o,s)}return r||0!=o.length||i.push('`query("'+t+'")` returned zero elements. (Use `query("'+t+'", { optional: true })` if you wish to allow this.)'),o},n}(),oC=function(){function n(n,t,e,l){this._driver=n,this.element=t,this.startTime=e,this._elementTimelineStylesLookup=l,this.duration=0,this._previousKeyframe={},this._currentKeyframe={},this._keyframes=new Map,this._styleSummary={},this._pendingStyles={},this._backFill={},this._currentEmptyStepKeyframe=null,this._elementTimelineStylesLookup||(this._elementTimelineStylesLookup=new Map),this._localTimelineStyles=Object.create(this._backFill,{}),this._globalTimelineStyles=this._elementTimelineStylesLookup.get(t),this._globalTimelineStyles||(this._globalTimelineStyles=this._localTimelineStyles,this._elementTimelineStylesLookup.set(t,this._localTimelineStyles)),this._loadKeyframe()}return n.prototype.containsAnimation=function(){switch(this._keyframes.size){case 0:return!1;case 1:return this.getCurrentStyleProperties().length>0;default:return!0}},n.prototype.getCurrentStyleProperties=function(){return Object.keys(this._currentKeyframe)},Object.defineProperty(n.prototype,"currentTime",{get:function(){return this.startTime+this.duration},enumerable:!0,configurable:!0}),n.prototype.delayNextStep=function(n){var t=1==this._keyframes.size&&Object.keys(this._pendingStyles).length;this.duration||t?(this.forwardTime(this.currentTime+n),t&&this.snapshotCurrentStyles()):this.startTime+=n},n.prototype.fork=function(t,e){return this.applyStylesToKeyframe(),new n(this._driver,t,e||this.currentTime,this._elementTimelineStylesLookup)},n.prototype._loadKeyframe=function(){this._currentKeyframe&&(this._previousKeyframe=this._currentKeyframe),this._currentKeyframe=this._keyframes.get(this.duration),this._currentKeyframe||(this._currentKeyframe=Object.create(this._backFill,{}),this._keyframes.set(this.duration,this._currentKeyframe))},n.prototype.forwardFrame=function(){this.duration+=1,this._loadKeyframe()},n.prototype.forwardTime=function(n){this.applyStylesToKeyframe(),this.duration=n,this._loadKeyframe()},n.prototype._updateStyle=function(n,t){this._localTimelineStyles[n]=t,this._globalTimelineStyles[n]=t,this._styleSummary[n]={time:this.currentTime,value:t}},n.prototype.allowOnlyTimelineStyles=function(){return this._currentEmptyStepKeyframe!==this._currentKeyframe},n.prototype.applyEmptyStep=function(n){var t=this;n&&(this._previousKeyframe.easing=n),Object.keys(this._globalTimelineStyles).forEach(function(n){t._backFill[n]=t._globalTimelineStyles[n]||is,t._currentKeyframe[n]=is}),this._currentEmptyStepKeyframe=this._currentKeyframe},n.prototype.setStyles=function(n,t,e,l){var r=this;t&&(this._previousKeyframe.easing=t);var i=l&&l.params||{},o=function(n,t){var e,l={};return n.forEach(function(n){"*"===n?(e=e||Object.keys(t)).forEach(function(n){l[n]=is}):Pk(n,!1,l)}),l}(n,this._globalTimelineStyles);Object.keys(o).forEach(function(n){var t=Ik(o[n],i,e);r._pendingStyles[n]=t,r._localTimelineStyles.hasOwnProperty(n)||(r._backFill[n]=r._globalTimelineStyles.hasOwnProperty(n)?r._globalTimelineStyles[n]:is),r._updateStyle(n,t)})},n.prototype.applyStylesToKeyframe=function(){var n=this,t=this._pendingStyles,e=Object.keys(t);0!=e.length&&(this._pendingStyles={},e.forEach(function(e){n._currentKeyframe[e]=t[e]}),Object.keys(this._localTimelineStyles).forEach(function(t){n._currentKeyframe.hasOwnProperty(t)||(n._currentKeyframe[t]=n._localTimelineStyles[t])}))},n.prototype.snapshotCurrentStyles=function(){var n=this;Object.keys(this._localTimelineStyles).forEach(function(t){var e=n._localTimelineStyles[t];n._pendingStyles[t]=e,n._updateStyle(t,e)})},n.prototype.getFinalKeyframe=function(){return this._keyframes.get(this.duration)},Object.defineProperty(n.prototype,"properties",{get:function(){var n=[];for(var t in this._currentKeyframe)n.push(t);return n},enumerable:!0,configurable:!0}),n.prototype.mergeTimelineCollectedStyles=function(n){var t=this;Object.keys(n._styleSummary).forEach(function(e){var l=t._styleSummary[e],r=n._styleSummary[e];(!l||r.time>l.time)&&t._updateStyle(e,r.value)})},n.prototype.buildKeyframes=function(){var n=this;this.applyStylesToKeyframe();var t=new Set,e=new Set,l=1===this._keyframes.size&&0===this.duration,r=[];this._keyframes.forEach(function(i,o){var s=Pk(i,!0);Object.keys(s).forEach(function(n){var l=s[n];l==ds?t.add(n):l==is&&e.add(n)}),l||(s.offset=o/n.duration),r.push(s)});var i=t.size?Rk(t.values()):[],o=e.size?Rk(e.values()):[];if(l){var s=r[0],a=Lk(s);s.offset=0,a.offset=1,r=[s,a]}return Zk(this.element,r,i,o,this.duration,this.startTime,this.easing,!1)},n}(),sC=function(n){function t(t,e,l,r,i,o,s){void 0===s&&(s=!1);var a=n.call(this,t,e,o.delay)||this;return a.element=e,a.keyframes=l,a.preStyleProps=r,a.postStyleProps=i,a._stretchStartingKeyframe=s,a.timings={duration:o.duration,delay:o.delay,easing:o.easing},a}return Object(i.__extends)(t,n),t.prototype.containsAnimation=function(){return this.keyframes.length>1},t.prototype.buildKeyframes=function(){var n=this.keyframes,t=this.timings,e=t.delay,l=t.duration,r=t.easing;if(this._stretchStartingKeyframe&&e){var i=[],o=l+e,s=e/o,a=Pk(n[0],!1);a.offset=0,i.push(a);var u=Pk(n[0],!1);u.offset=aC(s),i.push(u);for(var c=n.length-1,d=1;d<=c;d++){var h=Pk(n[d],!1);h.offset=aC((e+h.offset*l)/o),i.push(h)}l=o,e=0,r="",n=i}return Zk(this.element,n,this.preStyleProps,this.postStyleProps,l,e,r,!0)},t}(oC);function aC(n,t){void 0===t&&(t=3);var e=Math.pow(10,t-1);return Math.round(n*e)/e}var uC=function(){},cC=function(n){function t(){return null!==n&&n.apply(this,arguments)||this}return Object(i.__extends)(t,n),t.prototype.normalizePropertyName=function(n,t){return Nk(n)},t.prototype.normalizeStyleValue=function(n,t,e,l){var r="",i=e.toString().trim();if(dC[t]&&0!==e&&"0"!==e)if("number"==typeof e)r="px";else{var o=e.match(/^[+-]?[\d\.]+([a-z]*)$/);o&&0==o[1].length&&l.push("Please provide a CSS unit value for "+n+":"+e)}return i+r},t}(uC),dC=function(n){var t={};return"width,height,minWidth,minHeight,maxWidth,maxHeight,left,top,bottom,right,fontSize,outlineWidth,outlineOffset,paddingTop,paddingLeft,paddingBottom,paddingRight,marginTop,marginLeft,marginBottom,marginRight,borderRadius,borderWidth,borderTopWidth,borderLeftWidth,borderRightWidth,borderBottomWidth,textIndent,perspective".split(",").forEach(function(n){return t[n]=!0}),t}();function hC(n,t,e,l,r,i,o,s,a,u,c,d){return{type:0,element:n,triggerName:t,isRemovalTransition:r,fromState:e,fromStyles:i,toState:l,toStyles:o,timelines:s,queriedElements:a,preStyleProps:u,postStyleProps:c,errors:d}}var pC={},fC=function(){function n(n,t,e){this._triggerName=n,this.ast=t,this._stateStyles=e}return n.prototype.match=function(n,t){return function(n,t,e){return n.some(function(n){return n(t,e)})}(this.ast.matchers,n,t)},n.prototype.buildStyles=function(n,t,e){var l=this._stateStyles["*"],r=this._stateStyles[n],i=l?l.buildStyles(t,e):{};return r?r.buildStyles(t,e):i},n.prototype.build=function(n,t,e,l,r,o,s,a,u){var c=[],d=this.ast.options&&this.ast.options.params||pC,h=this.buildStyles(e,s&&s.params||pC,c),p=a&&a.params||pC,f=this.buildStyles(l,p,c),_=new Set,m=new Map,g=new Map,y="void"===l,b={params:Object(i.__assign)({},d,p)},v=eC(n,t,this.ast.animation,r,o,h,f,b,u,c);if(c.length)return hC(t,this._triggerName,e,l,y,h,f,[],[],m,g,c);v.forEach(function(n){var e=n.element,l=ck(m,e,{});n.preStyleProps.forEach(function(n){return l[n]=!0});var r=ck(g,e,{});n.postStyleProps.forEach(function(n){return r[n]=!0}),e!==t&&_.add(e)});var w=Rk(_.values());return hC(t,this._triggerName,e,l,y,h,f,v,w,m,g)},n}(),_C=function(){function n(n,t){this.styles=n,this.defaultParams=t}return n.prototype.buildStyles=function(n,t){var e={},l=Lk(this.defaultParams);return Object.keys(n).forEach(function(t){var e=n[t];null!=e&&(l[t]=e)}),this.styles.styles.forEach(function(n){if("string"!=typeof n){var r=n;Object.keys(r).forEach(function(n){var i=r[n];i.length>1&&(i=Ik(i,l,t)),e[n]=i})}}),e},n}(),mC=function(){function n(n,t){var e=this;this.name=n,this.ast=t,this.transitionFactories=[],this.states={},t.states.forEach(function(n){e.states[n.name]=new _C(n.style,n.options&&n.options.params||{})}),gC(this.states,"true","1"),gC(this.states,"false","0"),t.transitions.forEach(function(t){e.transitionFactories.push(new fC(n,t,e.states))}),this.fallbackTransition=new fC(n,{type:1,animation:{type:2,steps:[],options:null},matchers:[function(n,t){return!0}],options:null,queryCount:0,depCount:0},this.states)}return Object.defineProperty(n.prototype,"containsQueries",{get:function(){return this.ast.queryCount>0},enumerable:!0,configurable:!0}),n.prototype.matchTransition=function(n,t){return this.transitionFactories.find(function(e){return e.match(n,t)})||null},n.prototype.matchStyles=function(n,t,e){return this.fallbackTransition.buildStyles(n,t,e)},n}();function gC(n,t,e){n.hasOwnProperty(t)?n.hasOwnProperty(e)||(n[e]=n[t]):n.hasOwnProperty(e)&&(n[t]=n[e])}var yC=new $k,bC=function(){function n(n,t){this._driver=n,this._normalizer=t,this._animations={},this._playersById={},this.players=[]}return n.prototype.register=function(n,t){var e=[],l=Gk(this._driver,t,e);if(e.length)throw new Error("Unable to build the animation due to the following errors: "+e.join("\n"));this._animations[n]=l},n.prototype._buildPlayer=function(n,t,e){var l=n.element,r=ok(0,this._normalizer,0,n.keyframes,t,e);return this._driver.animate(l,r,n.duration,n.delay,n.easing,[])},n.prototype.create=function(n,t,e){var l=this;void 0===e&&(e={});var r,i=[],o=this._animations[n],s=new Map;if(o?(r=eC(this._driver,t,o,"ng-enter","ng-leave",{},{},e,yC,i)).forEach(function(n){var t=ck(s,n.element,{});n.postStyleProps.forEach(function(n){return t[n]=null})}):(i.push("The requested animation doesn't exist or has already been destroyed"),r=[]),i.length)throw new Error("Unable to create the animation due to the following errors: "+i.join("\n"));s.forEach(function(n,t){Object.keys(n).forEach(function(e){n[e]=l._driver.computeStyle(t,e,is)})});var a=ik(r.map(function(n){var t=s.get(n.element);return l._buildPlayer(n,{},t)}));return this._playersById[n]=a,a.onDestroy(function(){return l.destroy(n)}),this.players.push(a),a},n.prototype.destroy=function(n){var t=this._getPlayer(n);t.destroy(),delete this._playersById[n];var e=this.players.indexOf(t);e>=0&&this.players.splice(e,1)},n.prototype._getPlayer=function(n){var t=this._playersById[n];if(!t)throw new Error("Unable to find the timeline player referenced by "+n);return t},n.prototype.listen=function(n,t,e,l){var r=uk(t,"","","");return sk(this._getPlayer(n),e,r,l),function(){}},n.prototype.command=function(n,t,e,l){if("register"!=e)if("create"!=e){var r=this._getPlayer(n);switch(e){case"play":r.play();break;case"pause":r.pause();break;case"reset":r.reset();break;case"restart":r.restart();break;case"finish":r.finish();break;case"init":r.init();break;case"setPosition":r.setPosition(parseFloat(l[0]));break;case"destroy":this.destroy(n)}}else this.create(n,t,l[0]||{});else this.register(n,l[0])},n}(),vC=[],wC={namespaceId:"",setForRemoval:null,hasAnimation:!1,removedBeforeQueried:!1},xC={namespaceId:"",setForRemoval:null,hasAnimation:!1,removedBeforeQueried:!0},MC="__ng_removed",kC=function(){function n(n,t){void 0===t&&(t=""),this.namespaceId=t;var e=n&&n.hasOwnProperty("value");if(this.value=function(n){return null!=n?n:null}(e?n.value:n),e){var l=Lk(n);delete l.value,this.options=l}else this.options={};this.options.params||(this.options.params={})}return Object.defineProperty(n.prototype,"params",{get:function(){return this.options.params},enumerable:!0,configurable:!0}),n.prototype.absorbOptions=function(n){var t=n.params;if(t){var e=this.options.params;Object.keys(t).forEach(function(n){null==e[n]&&(e[n]=t[n])})}},n}(),CC=new kC("void"),SC=new kC("DELETED"),OC=function(){function n(n,t,e){this.id=n,this.hostElement=t,this._engine=e,this.players=[],this._triggers={},this._queue=[],this._elementListeners=new Map,this._hostClassName="ng-tns-"+n,jC(t,this._hostClassName)}return n.prototype.listen=function(n,t,e,l){var r,i=this;if(!this._triggers.hasOwnProperty(t))throw new Error('Unable to listen on the animation trigger event "'+e+'" because the animation trigger "'+t+"\" doesn't exist!");if(null==e||0==e.length)throw new Error('Unable to listen on the animation trigger "'+t+'" because the provided event is undefined!');if("start"!=(r=e)&&"done"!=r)throw new Error('The provided animation trigger event "'+e+'" for the animation trigger "'+t+'" is not supported!');var o=ck(this._elementListeners,n,[]),s={name:t,phase:e,callback:l};o.push(s);var a=ck(this._engine.statesByElement,n,{});return a.hasOwnProperty(t)||(jC(n,"ng-trigger"),jC(n,"ng-trigger-"+t),a[t]=CC),function(){i._engine.afterFlush(function(){var n=o.indexOf(s);n>=0&&o.splice(n,1),i._triggers[t]||delete a[t]})}},n.prototype.register=function(n,t){return!this._triggers[n]&&(this._triggers[n]=t,!0)},n.prototype._getTrigger=function(n){var t=this._triggers[n];if(!t)throw new Error('The provided animation trigger "'+n+'" has not been registered!');return t},n.prototype.trigger=function(n,t,e,l){var r=this;void 0===l&&(l=!0);var i=this._getTrigger(t),o=new LC(this.id,t,n),s=this._engine.statesByElement.get(n);s||(jC(n,"ng-trigger"),jC(n,"ng-trigger-"+t),this._engine.statesByElement.set(n,s={}));var a=s[t],u=new kC(e,this.id);if(!(e&&e.hasOwnProperty("value"))&&a&&u.absorbOptions(a.options),s[t]=u,a){if(a===SC)return o}else a=CC;if("void"===u.value||a.value!==u.value){var c=ck(this._engine.playersByElement,n,[]);c.forEach(function(n){n.namespaceId==r.id&&n.triggerName==t&&n.queued&&n.destroy()});var d=i.matchTransition(a.value,u.value),h=!1;if(!d){if(!l)return;d=i.fallbackTransition,h=!0}return this._engine.totalQueuedPlayers++,this._queue.push({element:n,triggerName:t,transition:d,fromState:a,toState:u,player:o,isFallbackTransition:h}),h||(jC(n,"ng-animate-queued"),o.onStart(function(){IC(n,"ng-animate-queued")})),o.onDone(function(){var t=r.players.indexOf(o);t>=0&&r.players.splice(t,1);var e=r._engine.playersByElement.get(n);if(e){var l=e.indexOf(o);l>=0&&e.splice(l,1)}}),this.players.push(o),c.push(o),o}if(!function(n,t){var e=Object.keys(n),l=Object.keys(t);if(e.length!=l.length)return!1;for(var r=0;r=0){for(var l=!1,r=e;r>=0;r--)if(this.driver.containsElement(this._namespaceList[r].hostElement,t)){this._namespaceList.splice(r+1,0,n),l=!0;break}l||this._namespaceList.splice(0,0,n)}else this._namespaceList.push(n);return this.namespacesByHostElement.set(t,n),n},n.prototype.register=function(n,t){var e=this._namespaceLookup[n];return e||(e=this.createNamespace(n,t)),e},n.prototype.registerTrigger=function(n,t,e){var l=this._namespaceLookup[n];l&&l.register(t,e)&&this.totalAnimations++},n.prototype.destroy=function(n,t){var e=this;if(n){var l=this._fetchNamespace(n);this.afterFlush(function(){e.namespacesByHostElement.delete(l.hostElement),delete e._namespaceLookup[n];var t=e._namespaceList.indexOf(l);t>=0&&e._namespaceList.splice(t,1)}),this.afterFlushAnimationsDone(function(){return l.destroy(t)})}},n.prototype._fetchNamespace=function(n){return this._namespaceLookup[n]},n.prototype.fetchNamespacesByElement=function(n){var t=new Set,e=this.statesByElement.get(n);if(e)for(var l=Object.keys(e),r=0;r=0;C--)this._namespaceList[C].drainQueuedTransitions(t).forEach(function(n){var t=n.player;M.push(t);var i=n.element;if(h&&e.driver.containsElement(h,i)){var o=w.get(i),d=_.get(i),p=e._buildInstruction(n,l,d,o);if(p.errors&&p.errors.length)k.push(p);else{if(n.isFallbackTransition)return t.onStart(function(){return Ak(i,p.fromStyles)}),t.onDestroy(function(){return Dk(i,p.toStyles)}),void r.push(t);p.timelines.forEach(function(n){return n.stretchStartingKeyframe=!0}),l.append(i,p.timelines),s.push({instruction:p,player:t,element:i}),p.queriedElements.forEach(function(n){return ck(a,n,[]).push(t)}),p.preStyleProps.forEach(function(n,t){var e=Object.keys(n);if(e.length){var l=u.get(t);l||u.set(t,l=new Set),e.forEach(function(n){return l.add(n)})}}),p.postStyleProps.forEach(function(n,t){var e=Object.keys(n),l=c.get(t);l||c.set(t,l=new Set),e.forEach(function(n){return l.add(n)})})}}else t.destroy()});if(k.length){var S=[];k.forEach(function(n){S.push("@"+n.triggerName+" has failed due to:\n"),n.errors.forEach(function(n){return S.push("- "+n+"\n")})}),M.forEach(function(n){return n.destroy()}),this.reportError(S)}var O=new Map,T=new Map;s.forEach(function(n){var t=n.element;l.has(t)&&(T.set(t,t),e._beforeAnimationBuild(n.player.namespaceId,n.instruction,O))}),r.forEach(function(n){var t=n.element;e._getPreviousPlayers(t,!1,n.namespaceId,n.triggerName,null).forEach(function(n){ck(O,t,[]).push(n),n.destroy()})});var L=g.filter(function(n){return HC(n,u,c)}),P=new Map;AC(P,this.driver,b,c,is).forEach(function(n){HC(n,u,c)&&L.push(n)});var D=new Map;f.forEach(function(n,t){AC(D,e.driver,new Set(n),u,ds)}),L.forEach(function(n){var t=P.get(n),e=D.get(n);P.set(n,Object(i.__assign)({},t,e))});var A=[],E=[],Y={};s.forEach(function(n){var t=n.element,i=n.player,s=n.instruction;if(l.has(t)){if(d.has(t))return i.onDestroy(function(){return Dk(t,s.toStyles)}),void r.push(i);var a=Y;if(T.size>1){for(var u=t,c=[];u=u.parentNode;){var h=T.get(u);if(h){a=h;break}c.push(u)}c.forEach(function(n){return T.set(n,a)})}var p=e._buildAnimation(i.namespaceId,s,O,o,D,P);if(i.setRealPlayer(p),a===Y)A.push(i);else{var f=e.playersByElement.get(a);f&&f.length&&(i.parentPlayer=ik(f)),r.push(i)}}else Ak(t,s.fromStyles),i.onDestroy(function(){return Dk(t,s.toStyles)}),E.push(i),d.has(t)&&r.push(i)}),E.forEach(function(n){var t=o.get(n.element);if(t&&t.length){var e=ik(t);n.setRealPlayer(e)}}),r.forEach(function(n){n.parentPlayer?n.syncPlayerEvents(n.parentPlayer):n.destroy()});for(var j=0;j0?this.driver.animate(n.element,t,n.duration,n.delay,n.easing,e):new us},n}(),LC=function(){function n(n,t,e){this.namespaceId=n,this.triggerName=t,this.element=e,this._player=new us,this._containsRealPlayer=!1,this._queuedCallbacks={},this.destroyed=!1,this.markedForDestroy=!1,this.queued=!0}return n.prototype.setRealPlayer=function(n){var t=this;this._containsRealPlayer||(this._player=n,Object.keys(this._queuedCallbacks).forEach(function(e){t._queuedCallbacks[e].forEach(function(t){return sk(n,e,void 0,t)})}),this._queuedCallbacks={},this._containsRealPlayer=!0,this.queued=!1)},n.prototype.getRealPlayer=function(){return this._player},n.prototype.syncPlayerEvents=function(n){var t=this,e=this._player;e.triggerCallback&&n.onStart(function(){return e.triggerCallback("start")}),n.onDone(function(){return t.finish()}),n.onDestroy(function(){return t.destroy()})},n.prototype._queueEvent=function(n,t){ck(this._queuedCallbacks,n,[]).push(t)},n.prototype.onDone=function(n){this.queued&&this._queueEvent("done",n),this._player.onDone(n)},n.prototype.onStart=function(n){this.queued&&this._queueEvent("start",n),this._player.onStart(n)},n.prototype.onDestroy=function(n){this.queued&&this._queueEvent("destroy",n),this._player.onDestroy(n)},n.prototype.init=function(){this._player.init()},n.prototype.hasStarted=function(){return!this.queued&&this._player.hasStarted()},n.prototype.play=function(){!this.queued&&this._player.play()},n.prototype.pause=function(){!this.queued&&this._player.pause()},n.prototype.restart=function(){!this.queued&&this._player.restart()},n.prototype.finish=function(){this._player.finish()},n.prototype.destroy=function(){this.destroyed=!0,this._player.destroy()},n.prototype.reset=function(){!this.queued&&this._player.reset()},n.prototype.setPosition=function(n){this.queued||this._player.setPosition(n)},n.prototype.getPosition=function(){return this.queued?0:this._player.getPosition()},Object.defineProperty(n.prototype,"totalTime",{get:function(){return this._player.totalTime},enumerable:!0,configurable:!0}),n.prototype.triggerCallback=function(n){var t=this._player;t.triggerCallback&&t.triggerCallback(n)},n}();function PC(n){return n&&1===n.nodeType}function DC(n,t){var e=n.style.display;return n.style.display=null!=t?t:"none",e}function AC(n,t,e,l,r){var i=[];e.forEach(function(n){return i.push(DC(n))});var o=[];l.forEach(function(e,l){var i={};e.forEach(function(n){var e=i[n]=t.computeStyle(l,n,r);e&&0!=e.length||(l[MC]=xC,o.push(l))}),n.set(l,i)});var s=0;return e.forEach(function(n){return DC(n,i[s++])}),o}function EC(n,t){var e=new Map;if(n.forEach(function(n){return e.set(n,[])}),0==t.length)return e;var l=new Set(t),r=new Map;return t.forEach(function(n){var t=function n(t){if(!t)return 1;var i=r.get(t);if(i)return i;var o=t.parentNode;return i=e.has(o)?o:l.has(o)?1:n(o),r.set(t,i),i}(n);1!==t&&e.get(t).push(n)}),e}var YC="$$classes";function jC(n,t){if(n.classList)n.classList.add(t);else{var e=n[YC];e||(e=n[YC]={}),e[t]=!0}}function IC(n,t){if(n.classList)n.classList.remove(t);else{var e=n[YC];e&&delete e[t]}}function RC(n,t,e){ik(e).onDone(function(){return n.processLeaveNode(t)})}function HC(n,t,e){var l=e.get(n);if(!l)return!1;var r=t.get(n);return r?l.forEach(function(n){return r.add(n)}):t.set(n,l),e.delete(n),!0}var NC=function(){function n(n,t){var e=this;this._driver=n,this._triggerCache={},this.onRemovalComplete=function(n,t){},this._transitionEngine=new TC(n,t),this._timelineEngine=new bC(n,t),this._transitionEngine.onRemovalComplete=function(n,t){return e.onRemovalComplete(n,t)}}return n.prototype.registerTrigger=function(n,t,e,l,r){var i=n+"-"+l,o=this._triggerCache[i];if(!o){var s=[],a=Gk(this._driver,r,s);if(s.length)throw new Error('The animation trigger "'+l+'" has failed to build due to the following errors:\n - '+s.join("\n - "));o=function(n,t){return new mC(n,t)}(l,a),this._triggerCache[i]=o}this._transitionEngine.registerTrigger(t,l,o)},n.prototype.register=function(n,t){this._transitionEngine.register(n,t)},n.prototype.destroy=function(n,t){this._transitionEngine.destroy(n,t)},n.prototype.onInsert=function(n,t,e,l){this._transitionEngine.insertNode(n,t,e,l)},n.prototype.onRemove=function(n,t,e){this._transitionEngine.removeNode(n,t,e)},n.prototype.disableAnimations=function(n,t){this._transitionEngine.markElementAsDisabled(n,t)},n.prototype.process=function(n,t,e,l){if("@"==e.charAt(0)){var r=dk(e);this._timelineEngine.command(r[0],t,r[1],l)}else this._transitionEngine.trigger(n,t,e,l)},n.prototype.listen=function(n,t,e,l,r){if("@"==e.charAt(0)){var i=dk(e);return this._timelineEngine.listen(i[0],t,i[1],r)}return this._transitionEngine.listen(n,t,e,l,r)},n.prototype.flush=function(n){void 0===n&&(n=-1),this._transitionEngine.flush(n)},Object.defineProperty(n.prototype,"players",{get:function(){return this._transitionEngine.players.concat(this._timelineEngine.players)},enumerable:!0,configurable:!0}),n.prototype.whenRenderingDone=function(){return this._transitionEngine.whenRenderingDone()},n}(),FC=function(n){function t(t,e){var r=n.call(this)||this;return r._nextAnimationId=0,r._renderer=t.createRenderer(e.body,{id:"0",encapsulation:l.S.None,styles:[],data:{animation:[]}}),r}return Object(i.__extends)(t,n),t.prototype.build=function(n){var t=this._nextAnimationId.toString();this._nextAnimationId++;var e=Array.isArray(n)?os(n):n;return WC(this._renderer,null,t,"register",[e]),new BC(t,this._renderer)},t}(rs),BC=function(n){function t(t,e){var l=n.call(this)||this;return l._id=t,l._renderer=e,l}return Object(i.__extends)(t,n),t.prototype.create=function(n,t){return new VC(this._id,n,t||{},this._renderer)},t}(function(){}),VC=function(){function n(n,t,e,l){this.id=n,this.element=t,this._renderer=l,this.parentPlayer=null,this._started=!1,this.totalTime=0,this._command("create",e)}return n.prototype._listen=function(n,t){return this._renderer.listen(this.element,"@@"+this.id+":"+n,t)},n.prototype._command=function(n){for(var t=[],e=1;e=0&&n=11?n:n+12:"sore"===t||"malam"===t?n+12:void 0},meridiem:function(n,t,e){return n<11?"pagi":n<15?"siang":n<19?"sore":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Besok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kemarin pukul] LT",lastWeek:"dddd [lalu pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lalu",s:"beberapa detik",ss:"%d detik",m:"semenit",mm:"%d menit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}(e("PJh5"))},z3hR:function(n,t,e){!function(n){"use strict";function t(n,t,e,l){var r={m:["eng Minutt","enger Minutt"],h:["eng Stonn","enger Stonn"],d:["een Dag","engem Dag"],M:["ee Mount","engem Mount"],y:["ee Joer","engem Joer"]};return t?r[e][0]:r[e][1]}function e(n){if(n=parseInt(n,10),isNaN(n))return!1;if(n<0)return!0;if(n<10)return 4<=n&&n<=7;if(n<100){var t=n%10;return e(0===t?n/10:t)}if(n<1e4){for(;n>=10;)n/=10;return e(n)}return e(n/=1e3)}n.defineLocale("lb",{months:"Januar_Februar_M\xe4erz_Abr\xebll_Mee_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonndeg_M\xe9indeg_D\xebnschdeg_M\xebttwoch_Donneschdeg_Freideg_Samschdeg".split("_"),weekdaysShort:"So._M\xe9._D\xeb._M\xeb._Do._Fr._Sa.".split("_"),weekdaysMin:"So_M\xe9_D\xeb_M\xeb_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm [Auer]",LTS:"H:mm:ss [Auer]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm [Auer]",LLLL:"dddd, D. MMMM YYYY H:mm [Auer]"},calendar:{sameDay:"[Haut um] LT",sameElse:"L",nextDay:"[Muer um] LT",nextWeek:"dddd [um] LT",lastDay:"[G\xebschter um] LT",lastWeek:function(){switch(this.day()){case 2:case 4:return"[Leschten] dddd [um] LT";default:return"[Leschte] dddd [um] LT"}}},relativeTime:{future:function(n){return e(n.substr(0,n.indexOf(" ")))?"a "+n:"an "+n},past:function(n){return e(n.substr(0,n.indexOf(" ")))?"viru "+n:"virun "+n},s:"e puer Sekonnen",ss:"%d Sekonnen",m:t,mm:"%d Minutten",h:t,hh:"%d Stonnen",d:t,dd:"%d Deeg",M:t,MM:"%d M\xe9int",y:t,yy:"%d Joer"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(e("PJh5"))}},[0]); \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/polyfills.44742ea60435cec4c09d.bundle.js b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/polyfills.44742ea60435cec4c09d.bundle.js new file mode 100644 index 00000000..876852c8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/polyfills.44742ea60435cec4c09d.bundle.js @@ -0,0 +1 @@ +webpackJsonp([8],{"/whu":function(t,e){t.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},"0Rih":function(t,e,n){"use strict";var r=n("OzIq"),o=n("Ds5P"),i=n("R3AP"),a=n("A16L"),c=n("1aA0"),u=n("vmSO"),s=n("9GpA"),f=n("UKM+"),l=n("zgIt"),p=n("qkyc"),h=n("yYvK"),v=n("kic5");t.exports=function(t,e,n,d,y,g){var _=r[t],k=_,m=y?"set":"add",b=k&&k.prototype,w={},T=function(t){var e=b[t];i(b,t,"delete"==t?function(t){return!(g&&!f(t))&&e.call(this,0===t?0:t)}:"has"==t?function(t){return!(g&&!f(t))&&e.call(this,0===t?0:t)}:"get"==t?function(t){return g&&!f(t)?void 0:e.call(this,0===t?0:t)}:"add"==t?function(t){return e.call(this,0===t?0:t),this}:function(t,n){return e.call(this,0===t?0:t,n),this})};if("function"==typeof k&&(g||b.forEach&&!l(function(){(new k).entries().next()}))){var O=new k,D=O[m](g?{}:-0,1)!=O,E=l(function(){O.has(1)}),S=p(function(t){new k(t)}),P=!g&&l(function(){for(var t=new k,e=5;e--;)t[m](e,e);return!t.has(-0)});S||((k=e(function(e,n){s(e,k,t);var r=v(new _,e,k);return void 0!=n&&u(n,y,r[m],r),r})).prototype=b,b.constructor=k),(E||P)&&(T("delete"),T("has"),y&&T("get")),(P||D)&&T(m),g&&b.clear&&delete b.clear}else k=d.getConstructor(e,t,y,m),a(k.prototype,n),c.NEED=!0;return h(k,t),w[t]=k,o(o.G+o.W+o.F*(k!=_),w),g||d.setStrong(k,t,y),k}},1:function(t,e,n){t.exports=n("XS25")},"1aA0":function(t,e,n){var r=n("ulTY")("meta"),o=n("UKM+"),i=n("WBcL"),a=n("lDLk").f,c=0,u=Object.isExtensible||function(){return!0},s=!n("zgIt")(function(){return u(Object.preventExtensions({}))}),f=function(t){a(t,r,{value:{i:"O"+ ++c,w:{}}})},l=t.exports={KEY:r,NEED:!1,fastKey:function(t,e){if(!o(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!i(t,r)){if(!u(t))return"F";if(!e)return"E";f(t)}return t[r].i},getWeak:function(t,e){if(!i(t,r)){if(!u(t))return!0;if(!e)return!1;f(t)}return t[r].w},onFreeze:function(t){return s&&l.NEED&&u(t)&&!i(t,r)&&f(t),t}}},"2p1q":function(t,e,n){var r=n("lDLk"),o=n("fU25");t.exports=n("bUqO")?function(t,e,n){return r.f(t,e,o(1,n))}:function(t,e,n){return t[e]=n,t}},"2tFN":function(t,e,n){n("CVR+"),n("vmSu"),n("4ZU1"),n("yx1U"),n("X7aK"),n("SPtU"),n("A52B"),n("PuTd"),n("dm+7"),n("JG34"),n("Rw4K"),n("9mGU"),n("bUY0"),n("mTp7"),t.exports=n("7gX0").Reflect},"3q4u":function(t,e,n){var r=n("wCso"),o=n("DIVP"),i=r.key,a=r.map,c=r.store;r.exp({deleteMetadata:function(t,e){var n=arguments.length<3?void 0:i(arguments[2]),r=a(o(e),n,!1);if(void 0===r||!r.delete(t))return!1;if(r.size)return!0;var u=c.get(e);return u.delete(n),!!u.size||c.delete(e)}})},"4ZU1":function(t,e,n){var r=n("lDLk"),o=n("Ds5P"),i=n("DIVP"),a=n("s4j0");o(o.S+o.F*n("zgIt")(function(){Reflect.defineProperty(r.f({},1,{value:1}),1,{value:2})}),"Reflect",{defineProperty:function(t,e,n){i(t),e=a(e,!0),i(n);try{return r.f(t,e,n),!0}catch(t){return!1}}})},"7gX0":function(t,e){var n=t.exports={version:"2.5.3"};"number"==typeof __e&&(__e=n)},"7ylX":function(t,e,n){var r=n("DIVP"),o=n("twxM"),i=n("QKXm"),a=n("mZON")("IE_PROTO"),c=function(){},u=function(){var t,e=n("jhxf")("iframe"),r=i.length;for(e.style.display="none",n("d075").appendChild(e),e.src="javascript:",(t=e.contentWindow.document).open(),t.write("'],s=0;o>s;s++){a.push("");for(var h=0;o>h;h++)a.push('');a.push("")}a.push("
"),r.innerHTML=a.join("");var u=r.childNodes[0],l=(e.width-u.offsetWidth)/2,f=(e.height-u.offsetHeight)/2;l>0&&f>0&&(u.style.margin=f+"px "+l+"px")},t.prototype.clear=function(){this._el.innerHTML=""},t}();(QRCode=function(t,e){if(this._htOption={width:256,height:256,typeNumber:4,colorDark:"#000000",colorLight:"#ffffff",correctLevel:s.H},"string"==typeof e&&(e={text:e}),e)for(var r in e)this._htOption[r]=e[r];"string"==typeof t&&(t=document.getElementById(t)),this._android=n(),this._el=t,this._oQRCode=null,this._oDrawing=new c(this._el,this._htOption),this._htOption.text&&this.makeCode(this._htOption.text)}).prototype.makeCode=function(t){this._oQRCode=new e(function(t,e){for(var r=1,o=function(t){var e=encodeURI(t).toString().replace(/\%[0-9a-fA-F]{2}/g,"a");return e.length+(e.length!=t?3:0)}(t),i=0,n=g.length;n>=i;i++){var a=0;switch(e){case s.L:a=g[i][0];break;case s.M:a=g[i][1];break;case s.Q:a=g[i][2];break;case s.H:a=g[i][3]}if(a>=o)break;r++}if(r>g.length)throw new Error("Too long data");return r}(t,this._htOption.correctLevel),this._htOption.correctLevel),this._oQRCode.addData(t),this._oQRCode.make(),this._el.title=t,this._oDrawing.draw(this._oQRCode),this.makeImage()},QRCode.prototype.makeImage=function(){"function"==typeof this._oDrawing.makeImage&&(!this._android||this._android>=3)&&this._oDrawing.makeImage()},QRCode.prototype.clear=function(){this._oDrawing.clear()},QRCode.CorrectLevel=s}(); \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/styles.3072000db951801c187c.bundle.css b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/styles.3072000db951801c187c.bundle.css new file mode 100644 index 00000000..d0539769 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/dist/styles.3072000db951801c187c.bundle.css @@ -0,0 +1,9 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;src:url(fontawesome-webfont.674f50d287a8c48dc19b.eot?v=4.7.0);src:url(fontawesome-webfont.674f50d287a8c48dc19b.eot?#iefix&v=4.7.0) format('embedded-opentype'),url(fontawesome-webfont.af7ae505a9eed503f8b8.woff2?v=4.7.0) format('woff2'),url(fontawesome-webfont.fee66e712a8a08eef580.woff?v=4.7.0) format('woff'),url(fontawesome-webfont.b06871f281fee6b241d6.ttf?v=4.7.0) format('truetype'),url(fontawesome-webfont.912ec66d7572ff821749.svg?v=4.7.0#fontawesomeregular) format('svg');font-weight:400;font-style:normal}.fa{display:inline-block;font:14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:2s linear infinite fa-spin;animation:2s linear infinite fa-spin}.fa-pulse{-webkit-animation:1s steps(8) infinite fa-spin;animation:1s steps(8) infinite fa-spin}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1,-1);transform:scale(1,-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{-webkit-filter:none;filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-close:before,.fa-remove:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-repeat:before,.fa-rotate-right:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-exclamation-triangle:before,.fa-warning:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-floppy-o:before,.fa-save:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-bolt:before,.fa-flash:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-chain-broken:before,.fa-unlink:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:"\f150"}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:"\f151"}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:"\f152"}.fa-eur:before,.fa-euro:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-inr:before,.fa-rupee:before{content:"\f156"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:"\f158"}.fa-krw:before,.fa-won:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-try:before,.fa-turkish-lira:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-bank:before,.fa-institution:before,.fa-university:before{content:"\f19c"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:"\f1c5"}.fa-file-archive-o:before,.fa-file-zip-o:before{content:"\f1c6"}.fa-file-audio-o:before,.fa-file-sound-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:"\f1d0"}.fa-empire:before,.fa-ge:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-paper-plane:before,.fa-send:before{content:"\f1d8"}.fa-paper-plane-o:before,.fa-send-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-bed:before,.fa-hotel:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-y-combinator:before,.fa-yc:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-television:before,.fa-tv:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:"\f2a3"}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-sign-language:before,.fa-signing:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-address-card:before,.fa-vcard:before{content:"\f2bb"}.fa-address-card-o:before,.fa-vcard-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}@font-face{font-family:'Material Icons';font-style:normal;font-weight:400;src:url(MaterialIcons-Regular.e79bfd88537def476913.eot);src:local('Material Icons'),local('MaterialIcons-Regular'),url(MaterialIcons-Regular.570eb83859dc23dd0eec.woff2) format('woff2'),url(MaterialIcons-Regular.012cf6a10129e2275d79.woff) format('woff'),url(MaterialIcons-Regular.a37b0c01c0baf1888ca8.ttf) format('truetype')}.material-icons{font-family:'Material Icons';font-weight:400;font-style:normal;font-size:24px;display:inline-block;line-height:1;text-transform:none;letter-spacing:normal;word-wrap:normal;white-space:nowrap;direction:ltr;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;-webkit-font-feature-settings:'liga';font-feature-settings:'liga'}.-table:last-of-type{margin-bottom:30px}.-table .-headers{color:rgba(30,34,39,.2);display:-webkit-box;display:-ms-flexbox;display:flex;font-size:12px;font-weight:700;height:50px;line-height:50px;margin:0 30px}.-table .-headers>div{padding:0 20px}.-table .-body{border-radius:15px;-webkit-box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);margin:0 30px}.-table .-body .-row{font-size:13px;padding:15px 0;background:#fafafa;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.-table .-body .-row:not(:last-child){border-bottom:1px solid #eff0f0}.-table .-body .-row:first-child{border-top-left-radius:15px;border-top-right-radius:15px}.-table .-body .-row:last-child{border-bottom-left-radius:15px;border-bottom-right-radius:15px}.-table .-body .-row>div{padding:0 20px}.-table .-width-70{width:70px;-ms-flex-negative:0;flex-shrink:0}.-table .-width-150{width:150px;-ms-flex-negative:0;flex-shrink:0}.-table .-width-200{width:200px;-ms-flex-negative:0;flex-shrink:0}.-table .-width-250{width:250px;-ms-flex-negative:0;flex-shrink:0}.modal .-body{line-height:20px;font-size:13px;color:#1e2227;opacity:.8}.modal .big-text{color:#000;font-weight:700;font-size:15px}.modal .-check-container{text-align:center;margin-top:25px}.modal .-check-container .-check label{font-family:Skycoin;line-height:normal;font-size:14px;color:#1e2227}.modal .-check-container .-check .mat-checkbox-checkmark-path{position:absolute;width:18px;height:8px;left:4.59px;top:9px;stroke:#0072ff!important}.modal .-check-container .-check .mat-checkbox-background,.modal .-check-container .-check .mat-checkbox-frame{top:0;left:0;right:0;bottom:0;position:absolute;-webkit-box-sizing:border-box;box-sizing:border-box;pointer-events:none;width:20px;height:20px;background:rgba(30,34,39,.05);border-radius:6px;border-color:transparent}.modal .-buttons{text-align:center}.modal app-button button{margin-top:28px}/*! + * Bootstrap Grid v4.0.0-beta.3 (https://getbootstrap.com) + * Copyright 2011-2017 The Bootstrap Authors + * Copyright 2011-2017 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */@-ms-viewport{width:device-width}html{-webkit-box-sizing:border-box;box-sizing:border-box;-ms-overflow-style:scrollbar;height:100%}*,::after,::before{-webkit-box-sizing:inherit;box-sizing:inherit}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-1{-webkit-box-flex:0;-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.col-2{-webkit-box-flex:0;-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-webkit-box-flex:0;-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.col-5{-webkit-box-flex:0;-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.col-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-webkit-box-flex:0;-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.col-8{-webkit-box-flex:0;-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.col-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-webkit-box-flex:0;-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.col-11{-webkit-box-flex:0;-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.col-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-sm-1{-webkit-box-flex:0;-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.col-sm-2{-webkit-box-flex:0;-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-sm-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-webkit-box-flex:0;-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.col-sm-5{-webkit-box-flex:0;-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.col-sm-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-webkit-box-flex:0;-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.col-sm-8{-webkit-box-flex:0;-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.col-sm-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-webkit-box-flex:0;-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.col-sm-11{-webkit-box-flex:0;-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.col-sm-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-sm-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-sm-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-sm-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-sm-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-sm-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-sm-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-sm-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-sm-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-sm-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-sm-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-sm-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-sm-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-md-1{-webkit-box-flex:0;-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.col-md-2{-webkit-box-flex:0;-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-md-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-webkit-box-flex:0;-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.col-md-5{-webkit-box-flex:0;-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.col-md-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-webkit-box-flex:0;-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.col-md-8{-webkit-box-flex:0;-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.col-md-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-webkit-box-flex:0;-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.col-md-11{-webkit-box-flex:0;-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.col-md-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-md-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-md-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-md-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-md-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-md-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-md-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-md-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-md-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-md-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-md-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-md-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-md-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-lg-1{-webkit-box-flex:0;-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.col-lg-2{-webkit-box-flex:0;-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-lg-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-webkit-box-flex:0;-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.col-lg-5{-webkit-box-flex:0;-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.col-lg-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-webkit-box-flex:0;-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.col-lg-8{-webkit-box-flex:0;-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.col-lg-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-webkit-box-flex:0;-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.col-lg-11{-webkit-box-flex:0;-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.col-lg-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-lg-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-lg-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-lg-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-lg-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-lg-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-lg-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-lg-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-lg-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-lg-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-lg-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-lg-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-lg-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-xl-1{-webkit-box-flex:0;-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.col-xl-2{-webkit-box-flex:0;-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-xl-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-webkit-box-flex:0;-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.col-xl-5{-webkit-box-flex:0;-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.col-xl-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-webkit-box-flex:0;-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.col-xl-8{-webkit-box-flex:0;-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.col-xl-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-webkit-box-flex:0;-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.col-xl-11{-webkit-box-flex:0;-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.col-xl-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-xl-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-xl-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-xl-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-xl-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-xl-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-xl-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-xl-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-xl-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-xl-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-xl-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-xl-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-xl-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}}.flex-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.flex-sm-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-sm-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.flex-md-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-md-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.flex-lg-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-lg-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.flex-xl-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-xl-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}.d-print-block{display:none!important}@media print{.d-print-block{display:block!important}}.d-print-inline{display:none!important}@media print{.d-print-inline{display:inline!important}}.d-print-inline-block{display:none!important}@media print{.d-print-inline-block{display:inline-block!important}.d-print-none{display:none!important}}.mat-elevation-z0{-webkit-box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12);box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.mat-elevation-z1{-webkit-box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12);box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12)}.mat-elevation-z2{-webkit-box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12);box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.mat-elevation-z3{-webkit-box-shadow:0 3px 3px -2px rgba(0,0,0,.2),0 3px 4px 0 rgba(0,0,0,.14),0 1px 8px 0 rgba(0,0,0,.12);box-shadow:0 3px 3px -2px rgba(0,0,0,.2),0 3px 4px 0 rgba(0,0,0,.14),0 1px 8px 0 rgba(0,0,0,.12)}.mat-elevation-z4{-webkit-box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12);box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)}.mat-elevation-z5{-webkit-box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 5px 8px 0 rgba(0,0,0,.14),0 1px 14px 0 rgba(0,0,0,.12);box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 5px 8px 0 rgba(0,0,0,.14),0 1px 14px 0 rgba(0,0,0,.12)}.mat-elevation-z6{-webkit-box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12);box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.mat-elevation-z7{-webkit-box-shadow:0 4px 5px -2px rgba(0,0,0,.2),0 7px 10px 1px rgba(0,0,0,.14),0 2px 16px 1px rgba(0,0,0,.12);box-shadow:0 4px 5px -2px rgba(0,0,0,.2),0 7px 10px 1px rgba(0,0,0,.14),0 2px 16px 1px rgba(0,0,0,.12)}.mat-elevation-z8{-webkit-box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12);box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.mat-elevation-z9{-webkit-box-shadow:0 5px 6px -3px rgba(0,0,0,.2),0 9px 12px 1px rgba(0,0,0,.14),0 3px 16px 2px rgba(0,0,0,.12);box-shadow:0 5px 6px -3px rgba(0,0,0,.2),0 9px 12px 1px rgba(0,0,0,.14),0 3px 16px 2px rgba(0,0,0,.12)}.mat-elevation-z10{-webkit-box-shadow:0 6px 6px -3px rgba(0,0,0,.2),0 10px 14px 1px rgba(0,0,0,.14),0 4px 18px 3px rgba(0,0,0,.12);box-shadow:0 6px 6px -3px rgba(0,0,0,.2),0 10px 14px 1px rgba(0,0,0,.14),0 4px 18px 3px rgba(0,0,0,.12)}.mat-elevation-z11{-webkit-box-shadow:0 6px 7px -4px rgba(0,0,0,.2),0 11px 15px 1px rgba(0,0,0,.14),0 4px 20px 3px rgba(0,0,0,.12);box-shadow:0 6px 7px -4px rgba(0,0,0,.2),0 11px 15px 1px rgba(0,0,0,.14),0 4px 20px 3px rgba(0,0,0,.12)}.mat-elevation-z12{-webkit-box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12);box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.mat-elevation-z13{-webkit-box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 13px 19px 2px rgba(0,0,0,.14),0 5px 24px 4px rgba(0,0,0,.12);box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 13px 19px 2px rgba(0,0,0,.14),0 5px 24px 4px rgba(0,0,0,.12)}.mat-elevation-z14{-webkit-box-shadow:0 7px 9px -4px rgba(0,0,0,.2),0 14px 21px 2px rgba(0,0,0,.14),0 5px 26px 4px rgba(0,0,0,.12);box-shadow:0 7px 9px -4px rgba(0,0,0,.2),0 14px 21px 2px rgba(0,0,0,.14),0 5px 26px 4px rgba(0,0,0,.12)}.mat-elevation-z15{-webkit-box-shadow:0 8px 9px -5px rgba(0,0,0,.2),0 15px 22px 2px rgba(0,0,0,.14),0 6px 28px 5px rgba(0,0,0,.12);box-shadow:0 8px 9px -5px rgba(0,0,0,.2),0 15px 22px 2px rgba(0,0,0,.14),0 6px 28px 5px rgba(0,0,0,.12)}.mat-elevation-z16{-webkit-box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12);box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12)}.mat-elevation-z17{-webkit-box-shadow:0 8px 11px -5px rgba(0,0,0,.2),0 17px 26px 2px rgba(0,0,0,.14),0 6px 32px 5px rgba(0,0,0,.12);box-shadow:0 8px 11px -5px rgba(0,0,0,.2),0 17px 26px 2px rgba(0,0,0,.14),0 6px 32px 5px rgba(0,0,0,.12)}.mat-elevation-z18{-webkit-box-shadow:0 9px 11px -5px rgba(0,0,0,.2),0 18px 28px 2px rgba(0,0,0,.14),0 7px 34px 6px rgba(0,0,0,.12);box-shadow:0 9px 11px -5px rgba(0,0,0,.2),0 18px 28px 2px rgba(0,0,0,.14),0 7px 34px 6px rgba(0,0,0,.12)}.mat-elevation-z19{-webkit-box-shadow:0 9px 12px -6px rgba(0,0,0,.2),0 19px 29px 2px rgba(0,0,0,.14),0 7px 36px 6px rgba(0,0,0,.12);box-shadow:0 9px 12px -6px rgba(0,0,0,.2),0 19px 29px 2px rgba(0,0,0,.14),0 7px 36px 6px rgba(0,0,0,.12)}.mat-elevation-z20{-webkit-box-shadow:0 10px 13px -6px rgba(0,0,0,.2),0 20px 31px 3px rgba(0,0,0,.14),0 8px 38px 7px rgba(0,0,0,.12);box-shadow:0 10px 13px -6px rgba(0,0,0,.2),0 20px 31px 3px rgba(0,0,0,.14),0 8px 38px 7px rgba(0,0,0,.12)}.mat-elevation-z21{-webkit-box-shadow:0 10px 13px -6px rgba(0,0,0,.2),0 21px 33px 3px rgba(0,0,0,.14),0 8px 40px 7px rgba(0,0,0,.12);box-shadow:0 10px 13px -6px rgba(0,0,0,.2),0 21px 33px 3px rgba(0,0,0,.14),0 8px 40px 7px rgba(0,0,0,.12)}.mat-elevation-z22{-webkit-box-shadow:0 10px 14px -6px rgba(0,0,0,.2),0 22px 35px 3px rgba(0,0,0,.14),0 8px 42px 7px rgba(0,0,0,.12);box-shadow:0 10px 14px -6px rgba(0,0,0,.2),0 22px 35px 3px rgba(0,0,0,.14),0 8px 42px 7px rgba(0,0,0,.12)}.mat-elevation-z23{-webkit-box-shadow:0 11px 14px -7px rgba(0,0,0,.2),0 23px 36px 3px rgba(0,0,0,.14),0 9px 44px 8px rgba(0,0,0,.12);box-shadow:0 11px 14px -7px rgba(0,0,0,.2),0 23px 36px 3px rgba(0,0,0,.14),0 9px 44px 8px rgba(0,0,0,.12)}.mat-elevation-z24{-webkit-box-shadow:0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12);box-shadow:0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12)}.mat-h1,.mat-headline,.mat-typography h1{font:400 24px/32px Roboto,"Helvetica Neue",sans-serif;margin:0 0 16px}.mat-h2,.mat-title,.mat-typography h2{font:500 20px/32px Roboto,"Helvetica Neue",sans-serif;margin:0 0 16px}.mat-h3,.mat-subheading-2,.mat-typography h3{font:400 16px/28px Roboto,"Helvetica Neue",sans-serif;margin:0 0 16px}.mat-h4,.mat-subheading-1,.mat-typography h4{font:400 15px/24px Roboto,"Helvetica Neue",sans-serif;margin:0 0 16px}.mat-h5,.mat-typography h5{font-size:11.62px;font-weight:400;font-family:Roboto,"Helvetica Neue",sans-serif;line-height:20px;margin:0 0 12px}.mat-h6,.mat-typography h6{font-size:9.38px;font-weight:400;font-family:Roboto,"Helvetica Neue",sans-serif;line-height:20px;margin:0 0 12px}.mat-body-2,.mat-body-strong{font:500 14px/24px Roboto,"Helvetica Neue",sans-serif}.mat-body,.mat-body-1,.mat-typography{font:400 14px/20px Roboto,"Helvetica Neue",sans-serif}.mat-body p,.mat-body-1 p,.mat-typography p{margin:0 0 12px}.mat-caption,.mat-small{font:400 12px/20px Roboto,"Helvetica Neue",sans-serif}.mat-display-4,.mat-typography .mat-display-4{font:300 112px/112px Roboto,"Helvetica Neue",sans-serif;margin:0 0 56px;letter-spacing:-.05em}.mat-display-3,.mat-typography .mat-display-3{font:400 56px/56px Roboto,"Helvetica Neue",sans-serif;margin:0 0 64px;letter-spacing:-.02em}.mat-display-2,.mat-typography .mat-display-2{font:400 45px/48px Roboto,"Helvetica Neue",sans-serif;margin:0 0 64px;letter-spacing:-.005em}.mat-display-1,.mat-typography .mat-display-1{font:400 34px/40px Roboto,"Helvetica Neue",sans-serif;margin:0 0 64px}.mat-button,.mat-fab,.mat-icon-button,.mat-mini-fab,.mat-raised-button{font-family:Roboto,"Helvetica Neue",sans-serif;font-size:14px;font-weight:500}.mat-button-toggle,.mat-card{font-family:Roboto,"Helvetica Neue",sans-serif}.mat-card-title{font-size:24px;font-weight:400}.mat-card-content,.mat-card-header .mat-card-title,.mat-card-subtitle{font-size:14px}.mat-checkbox{font-family:Roboto,"Helvetica Neue",sans-serif}.mat-checkbox-layout .mat-checkbox-label{line-height:24px}.mat-chip{font-size:13px;line-height:18px}.mat-chip .mat-chip-remove.mat-icon{font-size:18px}.mat-table{font-family:Roboto,"Helvetica Neue",sans-serif}.mat-header-cell{font-size:12px;font-weight:500}.mat-cell{font-size:14px}.mat-calendar{font-family:Roboto,"Helvetica Neue",sans-serif}.mat-calendar-body{font-size:13px}.mat-calendar-body-label,.mat-calendar-period-button{font-size:14px;font-weight:500}.mat-calendar-table-header th{font-size:11px;font-weight:400}.mat-dialog-title{font:500 20px/32px Roboto,"Helvetica Neue",sans-serif}.mat-expansion-panel-header{font-family:Roboto,"Helvetica Neue",sans-serif;font-size:15px;font-weight:400}.mat-expansion-panel-content{font:400 14px/20px Roboto,"Helvetica Neue",sans-serif}.mat-form-field{font-family:Roboto,"Helvetica Neue",sans-serif;font-size:inherit;font-weight:400;line-height:1.125}.mat-form-field-wrapper{padding-bottom:1.25em}.mat-form-field-prefix .mat-icon,.mat-form-field-suffix .mat-icon{font-size:150%;line-height:1.125}.mat-form-field-prefix .mat-icon-button,.mat-form-field-suffix .mat-icon-button{height:1.5em;width:1.5em}.mat-form-field-prefix .mat-icon-button .mat-icon,.mat-form-field-suffix .mat-icon-button .mat-icon{height:1.125em;line-height:1.125}.mat-form-field-infix{padding:.4375em 0;border-top:.84375em solid transparent}.mat-form-field-can-float .mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label,.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label{-webkit-transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(.001px);transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(.001px);-ms-transform:translateY(-1.28125em) scale(.75);width:133.33333333%}.mat-form-field-can-float .mat-form-field-autofill-control:-webkit-autofill+.mat-form-field-label-wrapper .mat-form-field-label{-webkit-transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(.00101px);transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(.00101px);-ms-transform:translateY(-1.28124em) scale(.75);width:133.33334333%}.mat-form-field-can-float .mat-input-server[label]:not(:label-shown)+.mat-form-field-label-wrapper .mat-form-field-label{-webkit-transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(.00102px);transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(.00102px);-ms-transform:translateY(-1.28123em) scale(.75);width:133.33335333%}.mat-form-field-label-wrapper{top:-.84375em;padding-top:.84375em}.mat-form-field-label{top:1.28125em}.mat-form-field-underline{bottom:1.25em}.mat-form-field-subscript-wrapper{font-size:75%;margin-top:.54166667em;top:calc(100% - 1.66666667em)}.mat-grid-tile-footer,.mat-grid-tile-header{font-size:14px}.mat-grid-tile-footer .mat-line,.mat-grid-tile-header .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;-webkit-box-sizing:border-box;box-sizing:border-box}.mat-grid-tile-footer .mat-line:nth-child(n+2),.mat-grid-tile-header .mat-line:nth-child(n+2){font-size:12px}input.mat-input-element{margin-top:-.0625em}.mat-menu-item{font-family:Roboto,"Helvetica Neue",sans-serif;font-size:16px;font-weight:400}.mat-paginator,.mat-paginator-page-size .mat-select-trigger{font-family:Roboto,"Helvetica Neue",sans-serif;font-size:12px}.mat-radio-button,.mat-select{font-family:Roboto,"Helvetica Neue",sans-serif}.mat-select-trigger{height:1.125em}.mat-slide-toggle-content{font:400 14px/20px Roboto,"Helvetica Neue",sans-serif}.mat-slider-thumb-label-text{font-family:Roboto,"Helvetica Neue",sans-serif;font-size:12px;font-weight:500}.mat-stepper-horizontal,.mat-stepper-vertical{font-family:Roboto,"Helvetica Neue",sans-serif}.mat-step-label{font-size:14px;font-weight:400}.mat-step-label-selected{font-size:14px;font-weight:500}.mat-tab-group{font-family:Roboto,"Helvetica Neue",sans-serif}.mat-tab-label,.mat-tab-link{font-family:Roboto,"Helvetica Neue",sans-serif;font-size:14px;font-weight:500}.mat-toolbar,.mat-toolbar h1,.mat-toolbar h2,.mat-toolbar h3,.mat-toolbar h4,.mat-toolbar h5,.mat-toolbar h6{font:500 20px/32px Roboto,"Helvetica Neue",sans-serif;margin:0}.mat-tooltip{font-family:Roboto,"Helvetica Neue",sans-serif;font-size:10px;padding-top:6px;padding-bottom:6px}.mat-list-item,.mat-list-option{font-family:Roboto,"Helvetica Neue",sans-serif}.mat-list .mat-list-item,.mat-nav-list .mat-list-item,.mat-selection-list .mat-list-item{font-size:16px}.mat-list .mat-list-item .mat-line,.mat-nav-list .mat-list-item .mat-line,.mat-selection-list .mat-list-item .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;-webkit-box-sizing:border-box;box-sizing:border-box}.mat-list .mat-list-item .mat-line:nth-child(n+2),.mat-nav-list .mat-list-item .mat-line:nth-child(n+2),.mat-selection-list .mat-list-item .mat-line:nth-child(n+2){font-size:14px}.mat-list .mat-list-option,.mat-nav-list .mat-list-option,.mat-selection-list .mat-list-option{font-size:16px}.mat-list .mat-list-option .mat-line,.mat-nav-list .mat-list-option .mat-line,.mat-selection-list .mat-list-option .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;-webkit-box-sizing:border-box;box-sizing:border-box}.mat-list .mat-list-option .mat-line:nth-child(n+2),.mat-nav-list .mat-list-option .mat-line:nth-child(n+2),.mat-selection-list .mat-list-option .mat-line:nth-child(n+2){font-size:14px}.mat-list[dense] .mat-list-item,.mat-nav-list[dense] .mat-list-item,.mat-selection-list[dense] .mat-list-item{font-size:12px}.mat-list[dense] .mat-list-item .mat-line,.mat-nav-list[dense] .mat-list-item .mat-line,.mat-selection-list[dense] .mat-list-item .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;-webkit-box-sizing:border-box;box-sizing:border-box}.mat-list[dense] .mat-list-item .mat-line:nth-child(n+2),.mat-list[dense] .mat-list-option,.mat-nav-list[dense] .mat-list-item .mat-line:nth-child(n+2),.mat-nav-list[dense] .mat-list-option,.mat-selection-list[dense] .mat-list-item .mat-line:nth-child(n+2),.mat-selection-list[dense] .mat-list-option{font-size:12px}.mat-list[dense] .mat-list-option .mat-line,.mat-nav-list[dense] .mat-list-option .mat-line,.mat-selection-list[dense] .mat-list-option .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;-webkit-box-sizing:border-box;box-sizing:border-box}.mat-list[dense] .mat-list-option .mat-line:nth-child(n+2),.mat-nav-list[dense] .mat-list-option .mat-line:nth-child(n+2),.mat-selection-list[dense] .mat-list-option .mat-line:nth-child(n+2){font-size:12px}.mat-list[dense] .mat-subheader,.mat-nav-list[dense] .mat-subheader,.mat-selection-list[dense] .mat-subheader{font-family:Roboto,"Helvetica Neue",sans-serif;font-size:12px;font-weight:500}.mat-option{font-family:Roboto,"Helvetica Neue",sans-serif;font-size:16px}.mat-optgroup-label{font:500 14px/24px Roboto,"Helvetica Neue",sans-serif}.mat-simple-snackbar{font-family:Roboto,"Helvetica Neue",sans-serif;font-size:14px}.mat-simple-snackbar-action{line-height:1;font-family:inherit;font-size:inherit;font-weight:500}.mat-ripple{overflow:hidden}@media screen and (-ms-high-contrast:active){.mat-ripple{display:none}.mat-option-ripple{opacity:.5}}.mat-ripple.mat-ripple-unbounded{overflow:visible}.mat-ripple-element{position:absolute;border-radius:50%;pointer-events:none;-webkit-transition:opacity,-webkit-transform 0s cubic-bezier(0,0,.2,1);transition:opacity,-webkit-transform 0s cubic-bezier(0,0,.2,1);transition:opacity,transform 0s cubic-bezier(0,0,.2,1);transition:opacity,transform 0s cubic-bezier(0,0,.2,1),-webkit-transform 0s cubic-bezier(0,0,.2,1);-webkit-transform:scale(0);transform:scale(0)}.mat-option{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;line-height:48px;height:48px;padding:0 16px;text-align:left;text-decoration:none;position:relative;cursor:pointer;outline:0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;max-width:100%;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:rgba(0,0,0,.87)}.mat-option[disabled]{cursor:default}[dir=rtl] .mat-option{text-align:right}.mat-option .mat-icon{margin-right:16px}[dir=rtl] .mat-option .mat-icon{margin-left:16px;margin-right:0}.mat-option[aria-disabled=true]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.mat-optgroup .mat-option:not(.mat-option-multiple){padding-left:32px}[dir=rtl] .mat-optgroup .mat-option:not(.mat-option-multiple){padding-left:16px;padding-right:32px}.mat-option-text{display:inline-block;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;overflow:hidden;text-overflow:ellipsis}.mat-option-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}.mat-option-pseudo-checkbox{margin-right:8px}[dir=rtl] .mat-option-pseudo-checkbox{margin-left:8px;margin-right:0}.mat-optgroup-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;line-height:48px;height:48px;padding:0 16px;text-align:left;text-decoration:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default;color:rgba(0,0,0,.54)}.mat-optgroup-label[disabled]{cursor:default}[dir=rtl] .mat-optgroup-label{text-align:right}.mat-optgroup-label .mat-icon{margin-right:16px}[dir=rtl] .mat-optgroup-label .mat-icon{margin-left:16px;margin-right:0}.cdk-visually-hidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.cdk-global-overlay-wrapper,.cdk-overlay-container{pointer-events:none;top:0;left:0;height:100%;width:100%}.cdk-overlay-container{position:fixed;z-index:1000}.cdk-global-overlay-wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;position:absolute;z-index:1000}.cdk-overlay-pane{position:absolute;pointer-events:auto;-webkit-box-sizing:border-box;box-sizing:border-box;z-index:1000}.cdk-overlay-backdrop{position:absolute;top:0;bottom:0;left:0;right:0;z-index:1000;pointer-events:auto;-webkit-tap-highlight-color:transparent;-webkit-transition:opacity .4s cubic-bezier(.25,.8,.25,1);transition:opacity .4s cubic-bezier(.25,.8,.25,1);opacity:0}.cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:.48}.cdk-overlay-dark-backdrop{background:rgba(0,0,0,.6)}.cdk-overlay-transparent-backdrop{background:0 0}.cdk-global-scrollblock{position:fixed;width:100%;overflow-y:scroll}.mat-ripple-element{background-color:rgba(0,0,0,.1)}.mat-option:focus:not(.mat-option-disabled),.mat-option:hover:not(.mat-option-disabled){background:rgba(0,0,0,.04)}.mat-primary .mat-option.mat-selected:not(.mat-option-disabled){color:#0072ff}.mat-accent .mat-option.mat-selected:not(.mat-option-disabled){color:#ffc125}.mat-warn .mat-option.mat-selected:not(.mat-option-disabled){color:#f44336}.mat-option.mat-selected:not(.mat-option-multiple):not(.mat-option-disabled){background:rgba(0,0,0,.04)}.mat-option.mat-active{background:rgba(0,0,0,.04);color:rgba(0,0,0,.87)}.mat-option.mat-option-disabled{color:rgba(0,0,0,.38)}.mat-optgroup-disabled .mat-optgroup-label{color:rgba(0,0,0,.38)}.mat-pseudo-checkbox{color:rgba(0,0,0,.54)}.mat-pseudo-checkbox::after{color:#fafafa}.mat-accent .mat-pseudo-checkbox-checked,.mat-accent .mat-pseudo-checkbox-indeterminate,.mat-pseudo-checkbox-checked,.mat-pseudo-checkbox-indeterminate{background:#ffc125}.mat-primary .mat-pseudo-checkbox-checked,.mat-primary .mat-pseudo-checkbox-indeterminate{background:#0072ff}.mat-warn .mat-pseudo-checkbox-checked,.mat-warn .mat-pseudo-checkbox-indeterminate{background:#f44336}.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled,.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled{background:#b0b0b0}.mat-app-background{background-color:#fafafa}.mat-theme-loaded-marker{display:none}.mat-autocomplete-panel{background:#fff;color:rgba(0,0,0,.87)}.mat-autocomplete-panel .mat-option.mat-selected:not(.mat-active):not(:hover){background:#fff}.mat-autocomplete-panel .mat-option.mat-selected:not(.mat-active):not(:hover):not(.mat-option-disabled){color:rgba(0,0,0,.87)}.mat-button,.mat-icon-button{background:0 0}.mat-button.mat-primary .mat-button-focus-overlay,.mat-icon-button.mat-primary .mat-button-focus-overlay{background-color:rgba(0,114,255,.12)}.mat-button.mat-accent .mat-button-focus-overlay,.mat-icon-button.mat-accent .mat-button-focus-overlay{background-color:rgba(255,193,37,.12)}.mat-button.mat-warn .mat-button-focus-overlay,.mat-icon-button.mat-warn .mat-button-focus-overlay{background-color:rgba(244,67,54,.12)}.mat-button[disabled] .mat-button-focus-overlay,.mat-icon-button[disabled] .mat-button-focus-overlay{background-color:transparent}.mat-button.mat-primary,.mat-icon-button.mat-primary{color:#0072ff}.mat-button.mat-accent,.mat-icon-button.mat-accent{color:#ffc125}.mat-button.mat-warn,.mat-icon-button.mat-warn{color:#f44336}.mat-button.mat-accent[disabled],.mat-button.mat-primary[disabled],.mat-button.mat-warn[disabled],.mat-button[disabled][disabled],.mat-icon-button.mat-accent[disabled],.mat-icon-button.mat-primary[disabled],.mat-icon-button.mat-warn[disabled],.mat-icon-button[disabled][disabled]{color:rgba(0,0,0,.38)}.mat-fab,.mat-mini-fab,.mat-raised-button{color:rgba(0,0,0,.87);background-color:#fff}.mat-fab.mat-accent,.mat-fab.mat-primary,.mat-fab.mat-warn,.mat-mini-fab.mat-accent,.mat-mini-fab.mat-primary,.mat-mini-fab.mat-warn,.mat-raised-button.mat-accent,.mat-raised-button.mat-primary,.mat-raised-button.mat-warn{color:#fff}.mat-fab.mat-accent[disabled],.mat-fab.mat-primary[disabled],.mat-fab.mat-warn[disabled],.mat-fab[disabled][disabled],.mat-mini-fab.mat-accent[disabled],.mat-mini-fab.mat-primary[disabled],.mat-mini-fab.mat-warn[disabled],.mat-mini-fab[disabled][disabled],.mat-raised-button.mat-accent[disabled],.mat-raised-button.mat-primary[disabled],.mat-raised-button.mat-warn[disabled],.mat-raised-button[disabled][disabled]{color:rgba(0,0,0,.38);background-color:rgba(0,0,0,.12)}.mat-fab.mat-primary,.mat-mini-fab.mat-primary,.mat-raised-button.mat-primary{background-color:#0072ff}.mat-fab.mat-accent,.mat-mini-fab.mat-accent,.mat-raised-button.mat-accent{background-color:#ffc125}.mat-fab.mat-warn,.mat-mini-fab.mat-warn,.mat-raised-button.mat-warn{background-color:#f44336}.mat-fab.mat-accent .mat-ripple-element,.mat-fab.mat-primary .mat-ripple-element,.mat-fab.mat-warn .mat-ripple-element,.mat-mini-fab.mat-accent .mat-ripple-element,.mat-mini-fab.mat-primary .mat-ripple-element,.mat-mini-fab.mat-warn .mat-ripple-element,.mat-raised-button.mat-accent .mat-ripple-element,.mat-raised-button.mat-primary .mat-ripple-element,.mat-raised-button.mat-warn .mat-ripple-element{background-color:rgba(255,255,255,.2)}.mat-button.mat-primary .mat-ripple-element{background-color:rgba(0,114,255,.1)}.mat-button.mat-accent .mat-ripple-element{background-color:rgba(255,193,37,.1)}.mat-button.mat-warn .mat-ripple-element{background-color:rgba(244,67,54,.1)}.mat-icon-button.mat-primary .mat-ripple-element{background-color:rgba(0,114,255,.2)}.mat-icon-button.mat-accent .mat-ripple-element{background-color:rgba(255,193,37,.2)}.mat-icon-button.mat-warn .mat-ripple-element{background-color:rgba(244,67,54,.2)}.mat-button-toggle{color:rgba(0,0,0,.38)}.mat-button-toggle.cdk-focused .mat-button-toggle-focus-overlay{background-color:rgba(0,0,0,.06)}.mat-button-toggle-checked{background-color:#e0e0e0;color:rgba(0,0,0,.54)}.mat-button-toggle-disabled{background-color:#eee;color:rgba(0,0,0,.38)}.mat-button-toggle-disabled.mat-button-toggle-checked{background-color:#bdbdbd}.mat-card{background:#fff;color:rgba(0,0,0,.87)}.mat-card-subtitle{color:rgba(0,0,0,.54)}.mat-checkbox-frame{border-color:rgba(0,0,0,.54)}.mat-checkbox-checkmark{fill:#fafafa}.mat-checkbox-checkmark-path{stroke:#fafafa!important}.mat-checkbox-mixedmark{background-color:#fafafa}.mat-checkbox-checked.mat-primary .mat-checkbox-background,.mat-checkbox-indeterminate.mat-primary .mat-checkbox-background{background-color:#0072ff}.mat-checkbox-checked.mat-accent .mat-checkbox-background,.mat-checkbox-indeterminate.mat-accent .mat-checkbox-background{background-color:#ffc125}.mat-checkbox-checked.mat-warn .mat-checkbox-background,.mat-checkbox-indeterminate.mat-warn .mat-checkbox-background{background-color:#f44336}.mat-checkbox-disabled.mat-checkbox-checked .mat-checkbox-background,.mat-checkbox-disabled.mat-checkbox-indeterminate .mat-checkbox-background{background-color:#b0b0b0}.mat-checkbox-disabled:not(.mat-checkbox-checked) .mat-checkbox-frame{border-color:#b0b0b0}.mat-checkbox-disabled .mat-checkbox-label{color:#b0b0b0}.mat-checkbox:not(.mat-checkbox-disabled).mat-primary .mat-checkbox-ripple .mat-ripple-element{background-color:rgba(0,114,255,.26)}.mat-checkbox:not(.mat-checkbox-disabled).mat-accent .mat-checkbox-ripple .mat-ripple-element{background-color:rgba(255,193,37,.26)}.mat-checkbox:not(.mat-checkbox-disabled).mat-warn .mat-checkbox-ripple .mat-ripple-element{background-color:rgba(244,67,54,.26)}.mat-chip:not(.mat-basic-chip){background-color:#e0e0e0;color:rgba(0,0,0,.87)}.mat-chip:not(.mat-basic-chip) .mat-chip-remove{color:rgba(0,0,0,.87);opacity:.4}.mat-chip:not(.mat-basic-chip) .mat-chip-remove:hover{opacity:.54}.mat-chip.mat-chip-selected.mat-primary{background-color:#0072ff;color:#fff}.mat-chip.mat-chip-selected.mat-primary .mat-chip-remove{color:#fff;opacity:.4}.mat-chip.mat-chip-selected.mat-primary .mat-chip-remove:hover{opacity:.54}.mat-chip.mat-chip-selected.mat-warn{background-color:#f44336;color:#fff}.mat-chip.mat-chip-selected.mat-warn .mat-chip-remove{color:#fff;opacity:.4}.mat-chip.mat-chip-selected.mat-warn .mat-chip-remove:hover{opacity:.54}.mat-chip.mat-chip-selected.mat-accent{background-color:#ffc125;color:#fff}.mat-chip.mat-chip-selected.mat-accent .mat-chip-remove{color:#fff;opacity:.4}.mat-chip.mat-chip-selected.mat-accent .mat-chip-remove:hover{opacity:.54}.mat-table{background:#fff}.mat-header-row,.mat-row{border-bottom-color:rgba(0,0,0,.12)}.mat-header-cell{color:rgba(0,0,0,.54)}.mat-cell{color:rgba(0,0,0,.87)}.mat-datepicker-content{background-color:#fff;color:rgba(0,0,0,.87)}.mat-calendar-arrow{border-top-color:rgba(0,0,0,.54)}.mat-calendar-next-button,.mat-calendar-previous-button{color:rgba(0,0,0,.54)}.mat-calendar-table-header{color:rgba(0,0,0,.38)}.mat-calendar-table-header-divider::after{background:rgba(0,0,0,.12)}.mat-calendar-body-label{color:rgba(0,0,0,.54)}.mat-calendar-body-cell-content{color:rgba(0,0,0,.87);border-color:transparent}.mat-calendar-body-disabled>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected){color:rgba(0,0,0,.38)}.cdk-keyboard-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected),.cdk-program-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected),:not(.mat-calendar-body-disabled):hover>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected){background-color:rgba(0,0,0,.04)}.mat-calendar-body-selected{background-color:#0072ff;color:#fff}.mat-calendar-body-disabled>.mat-calendar-body-selected{background-color:rgba(0,114,255,.4)}.mat-calendar-body-today:not(.mat-calendar-body-selected){border-color:rgba(0,0,0,.38)}.mat-calendar-body-today.mat-calendar-body-selected{-webkit-box-shadow:inset 0 0 0 1px #fff;box-shadow:inset 0 0 0 1px #fff}.mat-calendar-body-disabled>.mat-calendar-body-today:not(.mat-calendar-body-selected){border-color:rgba(0,0,0,.18)}.mat-dialog-container,.mat-expansion-panel{background:#fff;color:rgba(0,0,0,.87)}.mat-action-row{border-top-color:rgba(0,0,0,.12)}.mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:not([aria-disabled=true]).cdk-keyboard-focused,.mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:not([aria-disabled=true]).cdk-program-focused,.mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:not([aria-disabled=true]):hover{background:rgba(0,0,0,.04)}.mat-expansion-panel-header-title{color:rgba(0,0,0,.87)}.mat-expansion-indicator::after,.mat-expansion-panel-header-description{color:rgba(0,0,0,.54)}.mat-expansion-panel-header[aria-disabled=true]{color:rgba(0,0,0,.38)}.mat-expansion-panel-header[aria-disabled=true] .mat-expansion-panel-header-description,.mat-expansion-panel-header[aria-disabled=true] .mat-expansion-panel-header-title{color:inherit}.mat-form-field-label,.mat-hint{color:rgba(0,0,0,.54)}.mat-focused .mat-form-field-label{color:#0072ff}.mat-focused .mat-form-field-label.mat-accent{color:#ffc125}.mat-focused .mat-form-field-label.mat-warn{color:#f44336}.mat-focused .mat-form-field-required-marker{color:#ffc125}.mat-form-field-underline{background-color:rgba(0,0,0,.42)}.mat-form-field-disabled .mat-form-field-underline{background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.42)),color-stop(33%,rgba(0,0,0,.42)),color-stop(0,transparent));background-image:linear-gradient(to right,rgba(0,0,0,.42) 0,rgba(0,0,0,.42) 33%,transparent 0);background-size:4px 1px;background-repeat:repeat-x}.mat-form-field-ripple{background-color:#0072ff}.mat-form-field-ripple.mat-accent{background-color:#ffc125}.mat-form-field-ripple.mat-warn{background-color:#f44336}.mat-form-field-invalid .mat-form-field-label,.mat-form-field-invalid .mat-form-field-label .mat-form-field-required-marker,.mat-form-field-invalid .mat-form-field-label.mat-accent{color:#f44336}.mat-form-field-invalid .mat-form-field-ripple{background-color:#f44336}.mat-error{color:#f44336}.mat-icon.mat-primary{color:#0072ff}.mat-icon.mat-accent{color:#ffc125}.mat-icon.mat-warn{color:#f44336}.mat-input-element:disabled{color:rgba(0,0,0,.38)}.mat-input-element{caret-color:#0072ff}.mat-input-element::-ms-input-placeholder{color:rgba(0,0,0,.42)}.mat-input-element::placeholder{color:rgba(0,0,0,.42)}.mat-input-element::-moz-placeholder{color:rgba(0,0,0,.42)}.mat-input-element::-webkit-input-placeholder{color:rgba(0,0,0,.42)}.mat-input-element:-ms-input-placeholder{color:rgba(0,0,0,.42)}.mat-accent .mat-input-element{caret-color:#ffc125}.mat-form-field-invalid .mat-input-element,.mat-warn .mat-input-element{caret-color:#f44336}.mat-list .mat-list-item,.mat-list .mat-list-option,.mat-nav-list .mat-list-item,.mat-nav-list .mat-list-option,.mat-selection-list .mat-list-item,.mat-selection-list .mat-list-option{color:rgba(0,0,0,.87)}.mat-list .mat-subheader,.mat-nav-list .mat-subheader,.mat-selection-list .mat-subheader{font-family:Roboto,"Helvetica Neue",sans-serif;font-size:14px;font-weight:500;color:rgba(0,0,0,.54)}.mat-list-item-disabled{background-color:#eee}.mat-divider{border-top-color:rgba(0,0,0,.12)}.mat-nav-list .mat-list-item{outline:0}.mat-nav-list .mat-list-item.mat-list-item-focus,.mat-nav-list .mat-list-item:hover{background:rgba(0,0,0,.04)}.mat-list-option{outline:0}.mat-list-option.mat-list-item-focus,.mat-list-option:hover{background:rgba(0,0,0,.04)}.mat-menu-panel{background:#fff}.mat-menu-item{background:0 0;color:rgba(0,0,0,.87)}.mat-menu-item[disabled]{color:rgba(0,0,0,.38)}.mat-menu-item .mat-icon:not([color]),.mat-menu-item-submenu-trigger::after{color:rgba(0,0,0,.54)}.mat-menu-item-highlighted:not([disabled]),.mat-menu-item:focus:not([disabled]),.mat-menu-item:hover:not([disabled]){background:rgba(0,0,0,.04)}.mat-paginator{background:#fff}.mat-paginator,.mat-paginator-page-size .mat-select-trigger{color:rgba(0,0,0,.54)}.mat-paginator-decrement,.mat-paginator-increment{border-top:2px solid rgba(0,0,0,.54);border-right:2px solid rgba(0,0,0,.54)}.mat-icon-button[disabled] .mat-paginator-decrement,.mat-icon-button[disabled] .mat-paginator-increment{border-color:rgba(0,0,0,.38)}.mat-progress-bar-background{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20version%3D%271.1%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20xmlns%3Axlink%3D%27http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%27%20x%3D%270px%27%20y%3D%270px%27%20enable-background%3D%27new%200%200%205%202%27%20xml%3Aspace%3D%27preserve%27%20viewBox%3D%270%200%205%202%27%20preserveAspectRatio%3D%27none%20slice%27%3E%3Ccircle%20cx%3D%271%27%20cy%3D%271%27%20r%3D%271%27%20fill%3D%27%2300c3ff%27%2F%3E%3C%2Fsvg%3E")}.mat-progress-bar-buffer{background-color:#00c3ff}.mat-progress-bar-fill::after{background-color:#0072ff}.mat-progress-bar.mat-accent .mat-progress-bar-background{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20version%3D%271.1%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20xmlns%3Axlink%3D%27http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%27%20x%3D%270px%27%20y%3D%270px%27%20enable-background%3D%27new%200%200%205%202%27%20xml%3Aspace%3D%27preserve%27%20viewBox%3D%270%200%205%202%27%20preserveAspectRatio%3D%27none%20slice%27%3E%3Ccircle%20cx%3D%271%27%20cy%3D%271%27%20r%3D%271%27%20fill%3D%27%23ffc125%27%2F%3E%3C%2Fsvg%3E")}.mat-progress-bar.mat-accent .mat-progress-bar-buffer,.mat-progress-bar.mat-accent .mat-progress-bar-fill::after{background-color:#ffc125}.mat-progress-bar.mat-warn .mat-progress-bar-background{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20version%3D%271.1%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20xmlns%3Axlink%3D%27http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%27%20x%3D%270px%27%20y%3D%270px%27%20enable-background%3D%27new%200%200%205%202%27%20xml%3Aspace%3D%27preserve%27%20viewBox%3D%270%200%205%202%27%20preserveAspectRatio%3D%27none%20slice%27%3E%3Ccircle%20cx%3D%271%27%20cy%3D%271%27%20r%3D%271%27%20fill%3D%27%23ffcdd2%27%2F%3E%3C%2Fsvg%3E")}.mat-progress-bar.mat-warn .mat-progress-bar-buffer{background-color:#ffcdd2}.mat-progress-bar.mat-warn .mat-progress-bar-fill::after{background-color:#f44336}.mat-progress-spinner circle,.mat-spinner circle{stroke:#0072ff}.mat-progress-spinner.mat-accent circle,.mat-spinner.mat-accent circle{stroke:#ffc125}.mat-progress-spinner.mat-warn circle,.mat-spinner.mat-warn circle{stroke:#f44336}.mat-radio-outer-circle{border-color:rgba(0,0,0,.54)}.mat-radio-disabled .mat-radio-outer-circle{border-color:rgba(0,0,0,.38)}.mat-radio-disabled .mat-radio-inner-circle,.mat-radio-disabled .mat-radio-ripple .mat-ripple-element{background-color:rgba(0,0,0,.38)}.mat-radio-disabled .mat-radio-label-content{color:rgba(0,0,0,.38)}.mat-radio-button.mat-primary.mat-radio-checked .mat-radio-outer-circle{border-color:#0072ff}.mat-radio-button.mat-primary .mat-radio-inner-circle{background-color:#0072ff}.mat-radio-button.mat-primary .mat-radio-ripple .mat-ripple-element{background-color:rgba(0,114,255,.26)}.mat-radio-button.mat-accent.mat-radio-checked .mat-radio-outer-circle{border-color:#ffc125}.mat-radio-button.mat-accent .mat-radio-inner-circle{background-color:#ffc125}.mat-radio-button.mat-accent .mat-radio-ripple .mat-ripple-element{background-color:rgba(255,193,37,.26)}.mat-radio-button.mat-warn.mat-radio-checked .mat-radio-outer-circle{border-color:#f44336}.mat-radio-button.mat-warn .mat-radio-inner-circle{background-color:#f44336}.mat-radio-button.mat-warn .mat-radio-ripple .mat-ripple-element{background-color:rgba(244,67,54,.26)}.mat-select-content,.mat-select-panel-done-animating{background:#fff}.mat-select-value{color:rgba(0,0,0,.87)}.mat-select-placeholder{color:rgba(0,0,0,.42)}.mat-select-disabled .mat-select-value{color:rgba(0,0,0,.38)}.mat-select-arrow{color:rgba(0,0,0,.54)}.mat-select-panel .mat-option.mat-selected:not(.mat-option-multiple){background:rgba(0,0,0,.12)}.mat-form-field.mat-focused.mat-primary .mat-select-arrow{color:#0072ff}.mat-form-field.mat-focused.mat-accent .mat-select-arrow{color:#ffc125}.mat-form-field .mat-select.mat-select-invalid .mat-select-arrow,.mat-form-field.mat-focused.mat-warn .mat-select-arrow{color:#f44336}.mat-form-field .mat-select.mat-select-disabled .mat-select-arrow{color:rgba(0,0,0,.38)}.mat-drawer-container{background-color:#fafafa;color:rgba(0,0,0,.87)}.mat-drawer{background-color:#fff;color:rgba(0,0,0,.87)}.mat-drawer.mat-drawer-push{background-color:#fff}.mat-drawer-backdrop.mat-drawer-shown{background-color:rgba(0,0,0,.6)}.mat-slide-toggle.mat-checked:not(.mat-disabled) .mat-slide-toggle-thumb{background-color:#ffc125}.mat-slide-toggle.mat-checked:not(.mat-disabled) .mat-slide-toggle-bar{background-color:rgba(255,193,37,.5)}.mat-slide-toggle:not(.mat-checked) .mat-ripple-element{background-color:rgba(0,0,0,.06)}.mat-slide-toggle .mat-ripple-element{background-color:rgba(255,193,37,.12)}.mat-slide-toggle.mat-primary.mat-checked:not(.mat-disabled) .mat-slide-toggle-thumb{background-color:#0072ff}.mat-slide-toggle.mat-primary.mat-checked:not(.mat-disabled) .mat-slide-toggle-bar{background-color:rgba(0,114,255,.5)}.mat-slide-toggle.mat-primary:not(.mat-checked) .mat-ripple-element{background-color:rgba(0,0,0,.06)}.mat-slide-toggle.mat-primary .mat-ripple-element{background-color:rgba(0,114,255,.12)}.mat-slide-toggle.mat-warn.mat-checked:not(.mat-disabled) .mat-slide-toggle-thumb{background-color:#f44336}.mat-slide-toggle.mat-warn.mat-checked:not(.mat-disabled) .mat-slide-toggle-bar{background-color:rgba(244,67,54,.5)}.mat-slide-toggle.mat-warn:not(.mat-checked) .mat-ripple-element{background-color:rgba(0,0,0,.06)}.mat-slide-toggle.mat-warn .mat-ripple-element{background-color:rgba(244,67,54,.12)}.mat-disabled .mat-slide-toggle-thumb{background-color:#bdbdbd}.mat-disabled .mat-slide-toggle-bar{background-color:rgba(0,0,0,.1)}.mat-slide-toggle-thumb{background-color:#fafafa}.mat-slide-toggle-bar{background-color:rgba(0,0,0,.38)}.mat-slider-track-background{background-color:rgba(0,0,0,.26)}.mat-primary .mat-slider-thumb,.mat-primary .mat-slider-thumb-label,.mat-primary .mat-slider-track-fill{background-color:#0072ff}.mat-primary .mat-slider-thumb-label-text{color:#fff}.mat-accent .mat-slider-thumb,.mat-accent .mat-slider-thumb-label,.mat-accent .mat-slider-track-fill{background-color:#ffc125}.mat-accent .mat-slider-thumb-label-text{color:#fff}.mat-warn .mat-slider-thumb,.mat-warn .mat-slider-thumb-label,.mat-warn .mat-slider-track-fill{background-color:#f44336}.mat-warn .mat-slider-thumb-label-text{color:#fff}.mat-slider-focus-ring{background-color:rgba(255,193,37,.2)}.cdk-focused .mat-slider-track-background,.mat-slider:hover .mat-slider-track-background{background-color:rgba(0,0,0,.38)}.mat-slider-disabled .mat-slider-thumb,.mat-slider-disabled .mat-slider-track-background,.mat-slider-disabled .mat-slider-track-fill,.mat-slider-disabled:hover .mat-slider-track-background{background-color:rgba(0,0,0,.26)}.mat-slider-min-value .mat-slider-focus-ring{background-color:rgba(0,0,0,.12)}.mat-slider-min-value.mat-slider-thumb-label-showing .mat-slider-thumb,.mat-slider-min-value.mat-slider-thumb-label-showing .mat-slider-thumb-label{background-color:rgba(0,0,0,.87)}.mat-slider-min-value.mat-slider-thumb-label-showing.cdk-focused .mat-slider-thumb,.mat-slider-min-value.mat-slider-thumb-label-showing.cdk-focused .mat-slider-thumb-label{background-color:rgba(0,0,0,.26)}.mat-slider-min-value:not(.mat-slider-thumb-label-showing) .mat-slider-thumb{border-color:rgba(0,0,0,.26);background-color:transparent}.mat-slider-min-value:not(.mat-slider-thumb-label-showing).cdk-focused .mat-slider-thumb,.mat-slider-min-value:not(.mat-slider-thumb-label-showing):hover .mat-slider-thumb{border-color:rgba(0,0,0,.38)}.mat-slider-min-value:not(.mat-slider-thumb-label-showing).cdk-focused.mat-slider-disabled .mat-slider-thumb,.mat-slider-min-value:not(.mat-slider-thumb-label-showing):hover.mat-slider-disabled .mat-slider-thumb{border-color:rgba(0,0,0,.26)}.mat-slider-has-ticks .mat-slider-wrapper::after{border-color:rgba(0,0,0,.7)}.mat-slider-horizontal .mat-slider-ticks{background-image:repeating-linear-gradient(to right,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent);background-image:-moz-repeating-linear-gradient(.0001deg,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent)}.mat-slider-vertical .mat-slider-ticks{background-image:repeating-linear-gradient(to bottom,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent)}.mat-step-header.cdk-keyboard-focused,.mat-step-header.cdk-program-focused,.mat-step-header:hover{background-color:rgba(0,0,0,.04)}.mat-step-header .mat-step-label,.mat-step-header .mat-step-optional{color:rgba(0,0,0,.38)}.mat-step-header .mat-step-icon{background-color:#0072ff;color:#fff}.mat-step-header .mat-step-icon-not-touched{background-color:rgba(0,0,0,.38);color:#fff}.mat-step-header .mat-step-label.mat-step-label-active{color:rgba(0,0,0,.87)}.mat-stepper-horizontal,.mat-stepper-vertical{background-color:#fff}.mat-stepper-vertical-line::before{border-left-color:rgba(0,0,0,.12)}.mat-stepper-horizontal-line{border-top-color:rgba(0,0,0,.12)}.mat-tab-header,.mat-tab-nav-bar{border-bottom:1px solid rgba(0,0,0,.12)}.mat-tab-group-inverted-header .mat-tab-header,.mat-tab-group-inverted-header .mat-tab-nav-bar{border-top:1px solid rgba(0,0,0,.12);border-bottom:none}.mat-tab-label,.mat-tab-link{color:rgba(0,0,0,.87)}.mat-tab-label.mat-tab-disabled,.mat-tab-link.mat-tab-disabled{color:rgba(0,0,0,.38)}.mat-tab-header-pagination-chevron{border-color:rgba(0,0,0,.87)}.mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(0,0,0,.38)}.mat-tab-group[class*=mat-background-] .mat-tab-header,.mat-tab-nav-bar[class*=mat-background-]{border-bottom:none;border-top:none}.mat-tab-group.mat-primary .mat-tab-label:focus,.mat-tab-group.mat-primary .mat-tab-link:focus,.mat-tab-nav-bar.mat-primary .mat-tab-label:focus,.mat-tab-nav-bar.mat-primary .mat-tab-link:focus{background-color:rgba(0,195,255,.3)}.mat-tab-group.mat-primary .mat-ink-bar,.mat-tab-nav-bar.mat-primary .mat-ink-bar{background-color:#0072ff}.mat-tab-group.mat-primary.mat-background-primary .mat-ink-bar,.mat-tab-nav-bar.mat-primary.mat-background-primary .mat-ink-bar{background-color:#fff}.mat-tab-group.mat-accent .mat-tab-label:focus,.mat-tab-group.mat-accent .mat-tab-link:focus,.mat-tab-nav-bar.mat-accent .mat-tab-label:focus,.mat-tab-nav-bar.mat-accent .mat-tab-link:focus{background-color:rgba(255,193,37,.3)}.mat-tab-group.mat-accent .mat-ink-bar,.mat-tab-nav-bar.mat-accent .mat-ink-bar{background-color:#ffc125}.mat-tab-group.mat-accent.mat-background-accent .mat-ink-bar,.mat-tab-nav-bar.mat-accent.mat-background-accent .mat-ink-bar{background-color:#fff}.mat-tab-group.mat-warn .mat-tab-label:focus,.mat-tab-group.mat-warn .mat-tab-link:focus,.mat-tab-nav-bar.mat-warn .mat-tab-label:focus,.mat-tab-nav-bar.mat-warn .mat-tab-link:focus{background-color:rgba(255,205,210,.3)}.mat-tab-group.mat-warn .mat-ink-bar,.mat-tab-nav-bar.mat-warn .mat-ink-bar{background-color:#f44336}.mat-tab-group.mat-warn.mat-background-warn .mat-ink-bar,.mat-tab-nav-bar.mat-warn.mat-background-warn .mat-ink-bar{background-color:#fff}.mat-tab-group.mat-background-primary .mat-tab-label:focus,.mat-tab-group.mat-background-primary .mat-tab-link:focus,.mat-tab-nav-bar.mat-background-primary .mat-tab-label:focus,.mat-tab-nav-bar.mat-background-primary .mat-tab-link:focus{background-color:rgba(0,195,255,.3)}.mat-tab-group.mat-background-primary .mat-tab-header,.mat-tab-group.mat-background-primary .mat-tab-links,.mat-tab-nav-bar.mat-background-primary .mat-tab-header,.mat-tab-nav-bar.mat-background-primary .mat-tab-links{background-color:#0072ff}.mat-tab-group.mat-background-primary .mat-tab-label,.mat-tab-group.mat-background-primary .mat-tab-link,.mat-tab-nav-bar.mat-background-primary .mat-tab-label,.mat-tab-nav-bar.mat-background-primary .mat-tab-link{color:#fff}.mat-tab-group.mat-background-primary .mat-tab-label.mat-tab-disabled,.mat-tab-group.mat-background-primary .mat-tab-link.mat-tab-disabled,.mat-tab-nav-bar.mat-background-primary .mat-tab-label.mat-tab-disabled,.mat-tab-nav-bar.mat-background-primary .mat-tab-link.mat-tab-disabled{color:rgba(255,255,255,.4)}.mat-tab-group.mat-background-primary .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-primary .mat-tab-header-pagination-chevron{border-color:#fff}.mat-tab-group.mat-background-primary .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-primary .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(255,255,255,.4)}.mat-tab-group.mat-background-primary .mat-ripple-element,.mat-tab-nav-bar.mat-background-primary .mat-ripple-element{background-color:rgba(255,255,255,.12)}.mat-tab-group.mat-background-accent .mat-tab-label:focus,.mat-tab-group.mat-background-accent .mat-tab-link:focus,.mat-tab-nav-bar.mat-background-accent .mat-tab-label:focus,.mat-tab-nav-bar.mat-background-accent .mat-tab-link:focus{background-color:rgba(255,193,37,.3)}.mat-tab-group.mat-background-accent .mat-tab-header,.mat-tab-group.mat-background-accent .mat-tab-links,.mat-tab-nav-bar.mat-background-accent .mat-tab-header,.mat-tab-nav-bar.mat-background-accent .mat-tab-links{background-color:#ffc125}.mat-tab-group.mat-background-accent .mat-tab-label,.mat-tab-group.mat-background-accent .mat-tab-link,.mat-tab-nav-bar.mat-background-accent .mat-tab-label,.mat-tab-nav-bar.mat-background-accent .mat-tab-link{color:#fff}.mat-tab-group.mat-background-accent .mat-tab-label.mat-tab-disabled,.mat-tab-group.mat-background-accent .mat-tab-link.mat-tab-disabled,.mat-tab-nav-bar.mat-background-accent .mat-tab-label.mat-tab-disabled,.mat-tab-nav-bar.mat-background-accent .mat-tab-link.mat-tab-disabled{color:rgba(255,255,255,.4)}.mat-tab-group.mat-background-accent .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-accent .mat-tab-header-pagination-chevron{border-color:#fff}.mat-tab-group.mat-background-accent .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-accent .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(255,255,255,.4)}.mat-tab-group.mat-background-accent .mat-ripple-element,.mat-tab-nav-bar.mat-background-accent .mat-ripple-element{background-color:rgba(255,255,255,.12)}.mat-tab-group.mat-background-warn .mat-tab-label:focus,.mat-tab-group.mat-background-warn .mat-tab-link:focus,.mat-tab-nav-bar.mat-background-warn .mat-tab-label:focus,.mat-tab-nav-bar.mat-background-warn .mat-tab-link:focus{background-color:rgba(255,205,210,.3)}.mat-tab-group.mat-background-warn .mat-tab-header,.mat-tab-group.mat-background-warn .mat-tab-links,.mat-tab-nav-bar.mat-background-warn .mat-tab-header,.mat-tab-nav-bar.mat-background-warn .mat-tab-links{background-color:#f44336}.mat-tab-group.mat-background-warn .mat-tab-label,.mat-tab-group.mat-background-warn .mat-tab-link,.mat-tab-nav-bar.mat-background-warn .mat-tab-label,.mat-tab-nav-bar.mat-background-warn .mat-tab-link{color:#fff}.mat-tab-group.mat-background-warn .mat-tab-label.mat-tab-disabled,.mat-tab-group.mat-background-warn .mat-tab-link.mat-tab-disabled,.mat-tab-nav-bar.mat-background-warn .mat-tab-label.mat-tab-disabled,.mat-tab-nav-bar.mat-background-warn .mat-tab-link.mat-tab-disabled{color:rgba(255,255,255,.4)}.mat-tab-group.mat-background-warn .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-warn .mat-tab-header-pagination-chevron{border-color:#fff}.mat-tab-group.mat-background-warn .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-warn .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(255,255,255,.4)}.mat-tab-group.mat-background-warn .mat-ripple-element,.mat-tab-nav-bar.mat-background-warn .mat-ripple-element{background-color:rgba(255,255,255,.12)}.mat-toolbar{background:#f5f5f5;color:rgba(0,0,0,.87)}.mat-toolbar.mat-primary{background:#0072ff;color:#fff}.mat-toolbar.mat-accent{background:#ffc125;color:#fff}.mat-toolbar.mat-warn{background:#f44336;color:#fff}.mat-tooltip{background:rgba(97,97,97,.9)}.mat-snack-bar-container{background:#323232;color:#fff}.mat-simple-snackbar-action{color:#ffc125}.select-address-theme .mat-ripple-element{background-color:rgba(0,0,0,.1)}.select-address-theme .mat-option{color:rgba(0,0,0,.87)}.select-address-theme .mat-option:focus:not(.mat-option-disabled),.select-address-theme .mat-option:hover:not(.mat-option-disabled){background:rgba(0,0,0,.04)}.mat-primary .select-address-theme .mat-option.mat-selected:not(.mat-option-disabled){color:#ddd}.mat-accent .select-address-theme .mat-option.mat-selected:not(.mat-option-disabled){color:#ffc125}.mat-warn .select-address-theme .mat-option.mat-selected:not(.mat-option-disabled){color:#f44336}.select-address-theme .mat-option.mat-selected:not(.mat-option-multiple):not(.mat-option-disabled){background:rgba(0,0,0,.04)}.select-address-theme .mat-option.mat-active{background:rgba(0,0,0,.04);color:rgba(0,0,0,.87)}.select-address-theme .mat-option.mat-option-disabled{color:rgba(0,0,0,.38)}.select-address-theme .mat-optgroup-label{color:rgba(0,0,0,.54)}.select-address-theme .mat-optgroup-disabled .mat-optgroup-label{color:rgba(0,0,0,.38)}.select-address-theme .mat-pseudo-checkbox{color:rgba(0,0,0,.54)}.select-address-theme .mat-pseudo-checkbox::after{color:#fafafa}.select-address-theme .mat-accent .mat-pseudo-checkbox-checked,.select-address-theme .mat-accent .mat-pseudo-checkbox-indeterminate,.select-address-theme .mat-pseudo-checkbox-checked,.select-address-theme .mat-pseudo-checkbox-indeterminate{background:#ffc125}.select-address-theme .mat-primary .mat-pseudo-checkbox-checked,.select-address-theme .mat-primary .mat-pseudo-checkbox-indeterminate{background:#ddd}.select-address-theme .mat-warn .mat-pseudo-checkbox-checked,.select-address-theme .mat-warn .mat-pseudo-checkbox-indeterminate{background:#f44336}.select-address-theme .mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled,.select-address-theme .mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled{background:#b0b0b0}.select-address-theme .mat-app-background{background-color:#fafafa}.select-address-theme .mat-theme-loaded-marker{display:none}.select-address-theme .mat-autocomplete-panel{background:#fff;color:rgba(0,0,0,.87)}.select-address-theme .mat-autocomplete-panel .mat-option.mat-selected:not(.mat-active):not(:hover){background:#fff}.select-address-theme .mat-autocomplete-panel .mat-option.mat-selected:not(.mat-active):not(:hover):not(.mat-option-disabled){color:rgba(0,0,0,.87)}.select-address-theme .mat-button,.select-address-theme .mat-icon-button{background:0 0}.select-address-theme .mat-button.mat-primary .mat-button-focus-overlay,.select-address-theme .mat-icon-button.mat-primary .mat-button-focus-overlay{background-color:rgba(221,221,221,.12)}.select-address-theme .mat-button.mat-accent .mat-button-focus-overlay,.select-address-theme .mat-icon-button.mat-accent .mat-button-focus-overlay{background-color:rgba(255,193,37,.12)}.select-address-theme .mat-button.mat-warn .mat-button-focus-overlay,.select-address-theme .mat-icon-button.mat-warn .mat-button-focus-overlay{background-color:rgba(244,67,54,.12)}.select-address-theme .mat-button[disabled] .mat-button-focus-overlay,.select-address-theme .mat-icon-button[disabled] .mat-button-focus-overlay{background-color:transparent}.select-address-theme .mat-button.mat-primary,.select-address-theme .mat-icon-button.mat-primary{color:#ddd}.select-address-theme .mat-button.mat-accent,.select-address-theme .mat-icon-button.mat-accent{color:#ffc125}.select-address-theme .mat-button.mat-warn,.select-address-theme .mat-icon-button.mat-warn{color:#f44336}.select-address-theme .mat-button.mat-accent[disabled],.select-address-theme .mat-button.mat-primary[disabled],.select-address-theme .mat-button.mat-warn[disabled],.select-address-theme .mat-button[disabled][disabled],.select-address-theme .mat-icon-button.mat-accent[disabled],.select-address-theme .mat-icon-button.mat-primary[disabled],.select-address-theme .mat-icon-button.mat-warn[disabled],.select-address-theme .mat-icon-button[disabled][disabled]{color:rgba(0,0,0,.38)}.select-address-theme .mat-fab,.select-address-theme .mat-mini-fab,.select-address-theme .mat-raised-button{color:rgba(0,0,0,.87);background-color:#fff}.select-address-theme .mat-fab.mat-primary,.select-address-theme .mat-mini-fab.mat-primary,.select-address-theme .mat-raised-button.mat-primary{color:#ddd;background-color:#ddd}.select-address-theme .mat-fab.mat-accent,.select-address-theme .mat-fab.mat-warn,.select-address-theme .mat-mini-fab.mat-accent,.select-address-theme .mat-mini-fab.mat-warn,.select-address-theme .mat-raised-button.mat-accent,.select-address-theme .mat-raised-button.mat-warn{color:#fff}.select-address-theme .mat-fab.mat-accent[disabled],.select-address-theme .mat-fab.mat-primary[disabled],.select-address-theme .mat-fab.mat-warn[disabled],.select-address-theme .mat-fab[disabled][disabled],.select-address-theme .mat-mini-fab.mat-accent[disabled],.select-address-theme .mat-mini-fab.mat-primary[disabled],.select-address-theme .mat-mini-fab.mat-warn[disabled],.select-address-theme .mat-mini-fab[disabled][disabled],.select-address-theme .mat-raised-button.mat-accent[disabled],.select-address-theme .mat-raised-button.mat-primary[disabled],.select-address-theme .mat-raised-button.mat-warn[disabled],.select-address-theme .mat-raised-button[disabled][disabled]{color:rgba(0,0,0,.38);background-color:rgba(0,0,0,.12)}.select-address-theme .mat-fab.mat-accent,.select-address-theme .mat-mini-fab.mat-accent,.select-address-theme .mat-raised-button.mat-accent{background-color:#ffc125}.select-address-theme .mat-fab.mat-warn,.select-address-theme .mat-mini-fab.mat-warn,.select-address-theme .mat-raised-button.mat-warn{background-color:#f44336}.select-address-theme .mat-fab.mat-primary .mat-ripple-element,.select-address-theme .mat-mini-fab.mat-primary .mat-ripple-element,.select-address-theme .mat-raised-button.mat-primary .mat-ripple-element{background-color:rgba(221,221,221,.2)}.select-address-theme .mat-fab.mat-accent .mat-ripple-element,.select-address-theme .mat-fab.mat-warn .mat-ripple-element,.select-address-theme .mat-mini-fab.mat-accent .mat-ripple-element,.select-address-theme .mat-mini-fab.mat-warn .mat-ripple-element,.select-address-theme .mat-raised-button.mat-accent .mat-ripple-element,.select-address-theme .mat-raised-button.mat-warn .mat-ripple-element{background-color:rgba(255,255,255,.2)}.select-address-theme .mat-button.mat-primary .mat-ripple-element{background-color:rgba(221,221,221,.1)}.select-address-theme .mat-button.mat-accent .mat-ripple-element{background-color:rgba(255,193,37,.1)}.select-address-theme .mat-button.mat-warn .mat-ripple-element{background-color:rgba(244,67,54,.1)}.select-address-theme .mat-icon-button.mat-primary .mat-ripple-element{background-color:rgba(221,221,221,.2)}.select-address-theme .mat-icon-button.mat-accent .mat-ripple-element{background-color:rgba(255,193,37,.2)}.select-address-theme .mat-icon-button.mat-warn .mat-ripple-element{background-color:rgba(244,67,54,.2)}.select-address-theme .mat-button-toggle{color:rgba(0,0,0,.38)}.select-address-theme .mat-button-toggle.cdk-focused .mat-button-toggle-focus-overlay{background-color:rgba(0,0,0,.06)}.select-address-theme .mat-button-toggle-checked{background-color:#e0e0e0;color:rgba(0,0,0,.54)}.select-address-theme .mat-button-toggle-disabled{background-color:#eee;color:rgba(0,0,0,.38)}.select-address-theme .mat-button-toggle-disabled.mat-button-toggle-checked{background-color:#bdbdbd}.select-address-theme .mat-card{background:#fff;color:rgba(0,0,0,.87)}.select-address-theme .mat-card-subtitle{color:rgba(0,0,0,.54)}.select-address-theme .mat-checkbox-frame{border-color:rgba(0,0,0,.54)}.select-address-theme .mat-checkbox-checkmark{fill:#fafafa}.select-address-theme .mat-checkbox-checkmark-path{stroke:#fafafa!important}.select-address-theme .mat-checkbox-mixedmark{background-color:#fafafa}.select-address-theme .mat-checkbox-checked.mat-primary .mat-checkbox-background,.select-address-theme .mat-checkbox-indeterminate.mat-primary .mat-checkbox-background{background-color:#ddd}.select-address-theme .mat-checkbox-checked.mat-accent .mat-checkbox-background,.select-address-theme .mat-checkbox-indeterminate.mat-accent .mat-checkbox-background{background-color:#ffc125}.select-address-theme .mat-checkbox-checked.mat-warn .mat-checkbox-background,.select-address-theme .mat-checkbox-indeterminate.mat-warn .mat-checkbox-background{background-color:#f44336}.select-address-theme .mat-checkbox-disabled.mat-checkbox-checked .mat-checkbox-background,.select-address-theme .mat-checkbox-disabled.mat-checkbox-indeterminate .mat-checkbox-background{background-color:#b0b0b0}.select-address-theme .mat-checkbox-disabled:not(.mat-checkbox-checked) .mat-checkbox-frame{border-color:#b0b0b0}.select-address-theme .mat-checkbox-disabled .mat-checkbox-label{color:#b0b0b0}.select-address-theme .mat-checkbox:not(.mat-checkbox-disabled).mat-primary .mat-checkbox-ripple .mat-ripple-element{background-color:rgba(221,221,221,.26)}.select-address-theme .mat-checkbox:not(.mat-checkbox-disabled).mat-accent .mat-checkbox-ripple .mat-ripple-element{background-color:rgba(255,193,37,.26)}.select-address-theme .mat-checkbox:not(.mat-checkbox-disabled).mat-warn .mat-checkbox-ripple .mat-ripple-element{background-color:rgba(244,67,54,.26)}.select-address-theme .mat-chip:not(.mat-basic-chip){background-color:#e0e0e0;color:rgba(0,0,0,.87)}.select-address-theme .mat-chip:not(.mat-basic-chip) .mat-chip-remove{color:rgba(0,0,0,.87);opacity:.4}.select-address-theme .mat-chip:not(.mat-basic-chip) .mat-chip-remove:hover{opacity:.54}.select-address-theme .mat-chip.mat-chip-selected.mat-primary{background-color:#ddd;color:#ddd}.select-address-theme .mat-chip.mat-chip-selected.mat-primary .mat-chip-remove{color:#ddd;opacity:.4}.select-address-theme .mat-chip.mat-chip-selected.mat-primary .mat-chip-remove:hover{opacity:.54}.select-address-theme .mat-chip.mat-chip-selected.mat-warn{background-color:#f44336;color:#fff}.select-address-theme .mat-chip.mat-chip-selected.mat-warn .mat-chip-remove{color:#fff;opacity:.4}.select-address-theme .mat-chip.mat-chip-selected.mat-warn .mat-chip-remove:hover{opacity:.54}.select-address-theme .mat-chip.mat-chip-selected.mat-accent{background-color:#ffc125;color:#fff}.select-address-theme .mat-chip.mat-chip-selected.mat-accent .mat-chip-remove{color:#fff;opacity:.4}.select-address-theme .mat-chip.mat-chip-selected.mat-accent .mat-chip-remove:hover{opacity:.54}.select-address-theme .mat-table{background:#fff}.select-address-theme .mat-header-row,.select-address-theme .mat-row{border-bottom-color:rgba(0,0,0,.12)}.select-address-theme .mat-header-cell{color:rgba(0,0,0,.54)}.select-address-theme .mat-cell{color:rgba(0,0,0,.87)}.select-address-theme .mat-datepicker-content{background-color:#fff;color:rgba(0,0,0,.87)}.select-address-theme .mat-calendar-arrow{border-top-color:rgba(0,0,0,.54)}.select-address-theme .mat-calendar-next-button,.select-address-theme .mat-calendar-previous-button{color:rgba(0,0,0,.54)}.select-address-theme .mat-calendar-table-header{color:rgba(0,0,0,.38)}.select-address-theme .mat-calendar-table-header-divider::after{background:rgba(0,0,0,.12)}.select-address-theme .mat-calendar-body-label{color:rgba(0,0,0,.54)}.select-address-theme .mat-calendar-body-cell-content{color:rgba(0,0,0,.87);border-color:transparent}.mat-calendar-body-disabled>.select-address-theme .mat-calendar-body-cell-content:not(.mat-calendar-body-selected){color:rgba(0,0,0,.38)}.select-address-theme .cdk-keyboard-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected),.select-address-theme .cdk-program-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected),.select-address-theme :not(.mat-calendar-body-disabled):hover>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected){background-color:rgba(0,0,0,.04)}.select-address-theme .mat-calendar-body-selected{background-color:#ddd;color:#ddd}.select-address-theme .mat-calendar-body-disabled>.mat-calendar-body-selected{background-color:rgba(221,221,221,.4)}.select-address-theme .mat-calendar-body-today:not(.mat-calendar-body-selected){border-color:rgba(0,0,0,.38)}.select-address-theme .mat-calendar-body-today.mat-calendar-body-selected{-webkit-box-shadow:inset 0 0 0 1px #ddd;box-shadow:inset 0 0 0 1px #ddd}.select-address-theme .mat-calendar-body-disabled>.mat-calendar-body-today:not(.mat-calendar-body-selected){border-color:rgba(0,0,0,.18)}.select-address-theme .mat-dialog-container,.select-address-theme .mat-expansion-panel{background:#fff;color:rgba(0,0,0,.87)}.select-address-theme .mat-action-row{border-top-color:rgba(0,0,0,.12)}.select-address-theme .mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:not([aria-disabled=true]).cdk-keyboard-focused,.select-address-theme .mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:not([aria-disabled=true]).cdk-program-focused,.select-address-theme .mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:not([aria-disabled=true]):hover{background:rgba(0,0,0,.04)}.select-address-theme .mat-expansion-panel-header-title{color:rgba(0,0,0,.87)}.select-address-theme .mat-expansion-indicator::after,.select-address-theme .mat-expansion-panel-header-description{color:rgba(0,0,0,.54)}.select-address-theme .mat-expansion-panel-header[aria-disabled=true]{color:rgba(0,0,0,.38)}.select-address-theme .mat-expansion-panel-header[aria-disabled=true] .mat-expansion-panel-header-description,.select-address-theme .mat-expansion-panel-header[aria-disabled=true] .mat-expansion-panel-header-title{color:inherit}.select-address-theme .mat-form-field-label,.select-address-theme .mat-hint{color:rgba(0,0,0,.54)}.select-address-theme .mat-focused .mat-form-field-label{color:#ddd}.select-address-theme .mat-focused .mat-form-field-label.mat-accent{color:#ffc125}.select-address-theme .mat-focused .mat-form-field-label.mat-warn{color:#f44336}.select-address-theme .mat-focused .mat-form-field-required-marker{color:#ffc125}.select-address-theme .mat-form-field-underline{background-color:rgba(0,0,0,.42)}.select-address-theme .mat-form-field-disabled .mat-form-field-underline{background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.42)),color-stop(33%,rgba(0,0,0,.42)),color-stop(0,transparent));background-image:linear-gradient(to right,rgba(0,0,0,.42) 0,rgba(0,0,0,.42) 33%,transparent 0);background-size:4px 1px;background-repeat:repeat-x}.select-address-theme .mat-form-field-ripple{background-color:#ddd}.select-address-theme .mat-form-field-ripple.mat-accent{background-color:#ffc125}.select-address-theme .mat-form-field-ripple.mat-warn{background-color:#f44336}.select-address-theme .mat-form-field-invalid .mat-form-field-label,.select-address-theme .mat-form-field-invalid .mat-form-field-label .mat-form-field-required-marker,.select-address-theme .mat-form-field-invalid .mat-form-field-label.mat-accent{color:#f44336}.select-address-theme .mat-form-field-invalid .mat-form-field-ripple{background-color:#f44336}.select-address-theme .mat-error{color:#f44336}.select-address-theme .mat-icon.mat-primary{color:#ddd}.select-address-theme .mat-icon.mat-accent{color:#ffc125}.select-address-theme .mat-icon.mat-warn{color:#f44336}.select-address-theme .mat-input-element:disabled{color:rgba(0,0,0,.38)}.select-address-theme .mat-input-element{caret-color:#ddd}.select-address-theme .mat-input-element::-ms-input-placeholder{color:rgba(0,0,0,.42)}.select-address-theme .mat-input-element::placeholder{color:rgba(0,0,0,.42)}.select-address-theme .mat-input-element::-moz-placeholder{color:rgba(0,0,0,.42)}.select-address-theme .mat-input-element::-webkit-input-placeholder{color:rgba(0,0,0,.42)}.select-address-theme .mat-input-element:-ms-input-placeholder{color:rgba(0,0,0,.42)}.select-address-theme .mat-accent .mat-input-element{caret-color:#ffc125}.select-address-theme .mat-form-field-invalid .mat-input-element,.select-address-theme .mat-warn .mat-input-element{caret-color:#f44336}.select-address-theme .mat-list .mat-list-item,.select-address-theme .mat-list .mat-list-option,.select-address-theme .mat-nav-list .mat-list-item,.select-address-theme .mat-nav-list .mat-list-option,.select-address-theme .mat-selection-list .mat-list-item,.select-address-theme .mat-selection-list .mat-list-option{color:rgba(0,0,0,.87)}.select-address-theme .mat-list .mat-subheader,.select-address-theme .mat-nav-list .mat-subheader,.select-address-theme .mat-selection-list .mat-subheader{color:rgba(0,0,0,.54)}.select-address-theme .mat-list-item-disabled{background-color:#eee}.select-address-theme .mat-divider{border-top-color:rgba(0,0,0,.12)}.select-address-theme .mat-nav-list .mat-list-item{outline:0}.select-address-theme .mat-nav-list .mat-list-item.mat-list-item-focus,.select-address-theme .mat-nav-list .mat-list-item:hover{background:rgba(0,0,0,.04)}.select-address-theme .mat-list-option{outline:0}.select-address-theme .mat-list-option.mat-list-item-focus,.select-address-theme .mat-list-option:hover{background:rgba(0,0,0,.04)}.select-address-theme .mat-menu-panel{background:#fff}.select-address-theme .mat-menu-item{background:0 0;color:rgba(0,0,0,.87)}.select-address-theme .mat-menu-item[disabled]{color:rgba(0,0,0,.38)}.select-address-theme .mat-menu-item .mat-icon:not([color]),.select-address-theme .mat-menu-item-submenu-trigger::after{color:rgba(0,0,0,.54)}.select-address-theme .mat-menu-item-highlighted:not([disabled]),.select-address-theme .mat-menu-item:focus:not([disabled]),.select-address-theme .mat-menu-item:hover:not([disabled]){background:rgba(0,0,0,.04)}.select-address-theme .mat-paginator{background:#fff}.select-address-theme .mat-paginator,.select-address-theme .mat-paginator-page-size .mat-select-trigger{color:rgba(0,0,0,.54)}.select-address-theme .mat-paginator-decrement,.select-address-theme .mat-paginator-increment{border-top:2px solid rgba(0,0,0,.54);border-right:2px solid rgba(0,0,0,.54)}.select-address-theme .mat-icon-button[disabled] .mat-paginator-decrement,.select-address-theme .mat-icon-button[disabled] .mat-paginator-increment{border-color:rgba(0,0,0,.38)}.select-address-theme .mat-progress-bar-background{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20version%3D%271.1%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20xmlns%3Axlink%3D%27http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%27%20x%3D%270px%27%20y%3D%270px%27%20enable-background%3D%27new%200%200%205%202%27%20xml%3Aspace%3D%27preserve%27%20viewBox%3D%270%200%205%202%27%20preserveAspectRatio%3D%27none%20slice%27%3E%3Ccircle%20cx%3D%271%27%20cy%3D%271%27%20r%3D%271%27%20fill%3D%27%23dddddd%27%2F%3E%3C%2Fsvg%3E")}.select-address-theme .mat-progress-bar-buffer,.select-address-theme .mat-progress-bar-fill::after{background-color:#ddd}.select-address-theme .mat-progress-bar.mat-accent .mat-progress-bar-background{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20version%3D%271.1%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20xmlns%3Axlink%3D%27http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%27%20x%3D%270px%27%20y%3D%270px%27%20enable-background%3D%27new%200%200%205%202%27%20xml%3Aspace%3D%27preserve%27%20viewBox%3D%270%200%205%202%27%20preserveAspectRatio%3D%27none%20slice%27%3E%3Ccircle%20cx%3D%271%27%20cy%3D%271%27%20r%3D%271%27%20fill%3D%27%23ffc125%27%2F%3E%3C%2Fsvg%3E")}.select-address-theme .mat-progress-bar.mat-accent .mat-progress-bar-buffer,.select-address-theme .mat-progress-bar.mat-accent .mat-progress-bar-fill::after{background-color:#ffc125}.select-address-theme .mat-progress-bar.mat-warn .mat-progress-bar-background{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20version%3D%271.1%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20xmlns%3Axlink%3D%27http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%27%20x%3D%270px%27%20y%3D%270px%27%20enable-background%3D%27new%200%200%205%202%27%20xml%3Aspace%3D%27preserve%27%20viewBox%3D%270%200%205%202%27%20preserveAspectRatio%3D%27none%20slice%27%3E%3Ccircle%20cx%3D%271%27%20cy%3D%271%27%20r%3D%271%27%20fill%3D%27%23ffcdd2%27%2F%3E%3C%2Fsvg%3E")}.select-address-theme .mat-progress-bar.mat-warn .mat-progress-bar-buffer{background-color:#ffcdd2}.select-address-theme .mat-progress-bar.mat-warn .mat-progress-bar-fill::after{background-color:#f44336}.select-address-theme .mat-progress-spinner circle,.select-address-theme .mat-spinner circle{stroke:#ddd}.select-address-theme .mat-progress-spinner.mat-accent circle,.select-address-theme .mat-spinner.mat-accent circle{stroke:#ffc125}.select-address-theme .mat-progress-spinner.mat-warn circle,.select-address-theme .mat-spinner.mat-warn circle{stroke:#f44336}.select-address-theme .mat-radio-outer-circle{border-color:rgba(0,0,0,.54)}.select-address-theme .mat-radio-disabled .mat-radio-outer-circle{border-color:rgba(0,0,0,.38)}.select-address-theme .mat-radio-disabled .mat-radio-inner-circle,.select-address-theme .mat-radio-disabled .mat-radio-ripple .mat-ripple-element{background-color:rgba(0,0,0,.38)}.select-address-theme .mat-radio-disabled .mat-radio-label-content{color:rgba(0,0,0,.38)}.select-address-theme .mat-radio-button.mat-primary.mat-radio-checked .mat-radio-outer-circle{border-color:#ddd}.select-address-theme .mat-radio-button.mat-primary .mat-radio-inner-circle{background-color:#ddd}.select-address-theme .mat-radio-button.mat-primary .mat-radio-ripple .mat-ripple-element{background-color:rgba(221,221,221,.26)}.select-address-theme .mat-radio-button.mat-accent.mat-radio-checked .mat-radio-outer-circle{border-color:#ffc125}.select-address-theme .mat-radio-button.mat-accent .mat-radio-inner-circle{background-color:#ffc125}.select-address-theme .mat-radio-button.mat-accent .mat-radio-ripple .mat-ripple-element{background-color:rgba(255,193,37,.26)}.select-address-theme .mat-radio-button.mat-warn.mat-radio-checked .mat-radio-outer-circle{border-color:#f44336}.select-address-theme .mat-radio-button.mat-warn .mat-radio-inner-circle{background-color:#f44336}.select-address-theme .mat-radio-button.mat-warn .mat-radio-ripple .mat-ripple-element{background-color:rgba(244,67,54,.26)}.select-address-theme .mat-select-content,.select-address-theme .mat-select-panel-done-animating{background:#fff}.select-address-theme .mat-select-value{color:rgba(0,0,0,.87)}.select-address-theme .mat-select-placeholder{color:rgba(0,0,0,.42)}.select-address-theme .mat-select-disabled .mat-select-value{color:rgba(0,0,0,.38)}.select-address-theme .mat-select-arrow{color:rgba(0,0,0,.54)}.select-address-theme .mat-select-panel .mat-option.mat-selected:not(.mat-option-multiple){background:rgba(0,0,0,.12)}.select-address-theme .mat-form-field.mat-focused.mat-primary .mat-select-arrow{color:#ddd}.select-address-theme .mat-form-field.mat-focused.mat-accent .mat-select-arrow{color:#ffc125}.select-address-theme .mat-form-field .mat-select.mat-select-invalid .mat-select-arrow,.select-address-theme .mat-form-field.mat-focused.mat-warn .mat-select-arrow{color:#f44336}.select-address-theme .mat-form-field .mat-select.mat-select-disabled .mat-select-arrow{color:rgba(0,0,0,.38)}.select-address-theme .mat-drawer-container{background-color:#fafafa;color:rgba(0,0,0,.87)}.select-address-theme .mat-drawer{background-color:#fff;color:rgba(0,0,0,.87)}.select-address-theme .mat-drawer.mat-drawer-push{background-color:#fff}.select-address-theme .mat-drawer-backdrop.mat-drawer-shown{background-color:rgba(0,0,0,.6)}.select-address-theme .mat-slide-toggle.mat-checked:not(.mat-disabled) .mat-slide-toggle-thumb{background-color:#ffc125}.select-address-theme .mat-slide-toggle.mat-checked:not(.mat-disabled) .mat-slide-toggle-bar{background-color:rgba(255,193,37,.5)}.select-address-theme .mat-slide-toggle:not(.mat-checked) .mat-ripple-element{background-color:rgba(0,0,0,.06)}.select-address-theme .mat-slide-toggle .mat-ripple-element{background-color:rgba(255,193,37,.12)}.select-address-theme .mat-slide-toggle.mat-primary.mat-checked:not(.mat-disabled) .mat-slide-toggle-thumb{background-color:#ddd}.select-address-theme .mat-slide-toggle.mat-primary.mat-checked:not(.mat-disabled) .mat-slide-toggle-bar{background-color:rgba(221,221,221,.5)}.select-address-theme .mat-slide-toggle.mat-primary:not(.mat-checked) .mat-ripple-element{background-color:rgba(0,0,0,.06)}.select-address-theme .mat-slide-toggle.mat-primary .mat-ripple-element{background-color:rgba(221,221,221,.12)}.select-address-theme .mat-slide-toggle.mat-warn.mat-checked:not(.mat-disabled) .mat-slide-toggle-thumb{background-color:#f44336}.select-address-theme .mat-slide-toggle.mat-warn.mat-checked:not(.mat-disabled) .mat-slide-toggle-bar{background-color:rgba(244,67,54,.5)}.select-address-theme .mat-slide-toggle.mat-warn:not(.mat-checked) .mat-ripple-element{background-color:rgba(0,0,0,.06)}.select-address-theme .mat-slide-toggle.mat-warn .mat-ripple-element{background-color:rgba(244,67,54,.12)}.select-address-theme .mat-disabled .mat-slide-toggle-thumb{background-color:#bdbdbd}.select-address-theme .mat-disabled .mat-slide-toggle-bar{background-color:rgba(0,0,0,.1)}.select-address-theme .mat-slide-toggle-thumb{background-color:#fafafa}.select-address-theme .mat-slide-toggle-bar{background-color:rgba(0,0,0,.38)}.select-address-theme .mat-slider-track-background{background-color:rgba(0,0,0,.26)}.select-address-theme .mat-primary .mat-slider-thumb,.select-address-theme .mat-primary .mat-slider-thumb-label,.select-address-theme .mat-primary .mat-slider-track-fill{background-color:#ddd}.select-address-theme .mat-primary .mat-slider-thumb-label-text{color:#ddd}.select-address-theme .mat-accent .mat-slider-thumb,.select-address-theme .mat-accent .mat-slider-thumb-label,.select-address-theme .mat-accent .mat-slider-track-fill{background-color:#ffc125}.select-address-theme .mat-accent .mat-slider-thumb-label-text{color:#fff}.select-address-theme .mat-warn .mat-slider-thumb,.select-address-theme .mat-warn .mat-slider-thumb-label,.select-address-theme .mat-warn .mat-slider-track-fill{background-color:#f44336}.select-address-theme .mat-warn .mat-slider-thumb-label-text{color:#fff}.select-address-theme .mat-slider-focus-ring{background-color:rgba(255,193,37,.2)}.select-address-theme .cdk-focused .mat-slider-track-background,.select-address-theme .mat-slider:hover .mat-slider-track-background{background-color:rgba(0,0,0,.38)}.select-address-theme .mat-slider-disabled .mat-slider-thumb,.select-address-theme .mat-slider-disabled .mat-slider-track-background,.select-address-theme .mat-slider-disabled .mat-slider-track-fill,.select-address-theme .mat-slider-disabled:hover .mat-slider-track-background{background-color:rgba(0,0,0,.26)}.select-address-theme .mat-slider-min-value .mat-slider-focus-ring{background-color:rgba(0,0,0,.12)}.select-address-theme .mat-slider-min-value.mat-slider-thumb-label-showing .mat-slider-thumb,.select-address-theme .mat-slider-min-value.mat-slider-thumb-label-showing .mat-slider-thumb-label{background-color:rgba(0,0,0,.87)}.select-address-theme .mat-slider-min-value.mat-slider-thumb-label-showing.cdk-focused .mat-slider-thumb,.select-address-theme .mat-slider-min-value.mat-slider-thumb-label-showing.cdk-focused .mat-slider-thumb-label{background-color:rgba(0,0,0,.26)}.select-address-theme .mat-slider-min-value:not(.mat-slider-thumb-label-showing) .mat-slider-thumb{border-color:rgba(0,0,0,.26);background-color:transparent}.select-address-theme .mat-slider-min-value:not(.mat-slider-thumb-label-showing).cdk-focused .mat-slider-thumb,.select-address-theme .mat-slider-min-value:not(.mat-slider-thumb-label-showing):hover .mat-slider-thumb{border-color:rgba(0,0,0,.38)}.select-address-theme .mat-slider-min-value:not(.mat-slider-thumb-label-showing).cdk-focused.mat-slider-disabled .mat-slider-thumb,.select-address-theme .mat-slider-min-value:not(.mat-slider-thumb-label-showing):hover.mat-slider-disabled .mat-slider-thumb{border-color:rgba(0,0,0,.26)}.select-address-theme .mat-slider-has-ticks .mat-slider-wrapper::after{border-color:rgba(0,0,0,.7)}.select-address-theme .mat-slider-horizontal .mat-slider-ticks{background-image:repeating-linear-gradient(to right,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent);background-image:-moz-repeating-linear-gradient(.0001deg,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent)}.select-address-theme .mat-slider-vertical .mat-slider-ticks{background-image:repeating-linear-gradient(to bottom,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent)}.select-address-theme .mat-step-header.cdk-keyboard-focused,.select-address-theme .mat-step-header.cdk-program-focused,.select-address-theme .mat-step-header:hover{background-color:rgba(0,0,0,.04)}.select-address-theme .mat-step-header .mat-step-label,.select-address-theme .mat-step-header .mat-step-optional{color:rgba(0,0,0,.38)}.select-address-theme .mat-step-header .mat-step-icon{background-color:#ddd;color:#ddd}.select-address-theme .mat-step-header .mat-step-icon-not-touched{background-color:rgba(0,0,0,.38);color:#ddd}.select-address-theme .mat-step-header .mat-step-label.mat-step-label-active{color:rgba(0,0,0,.87)}.select-address-theme .mat-stepper-horizontal,.select-address-theme .mat-stepper-vertical{background-color:#fff}.select-address-theme .mat-stepper-vertical-line::before{border-left-color:rgba(0,0,0,.12)}.select-address-theme .mat-stepper-horizontal-line{border-top-color:rgba(0,0,0,.12)}.select-address-theme .mat-tab-header,.select-address-theme .mat-tab-nav-bar{border-bottom:1px solid rgba(0,0,0,.12)}.select-address-theme .mat-tab-group-inverted-header .mat-tab-header,.select-address-theme .mat-tab-group-inverted-header .mat-tab-nav-bar{border-top:1px solid rgba(0,0,0,.12);border-bottom:none}.select-address-theme .mat-tab-label,.select-address-theme .mat-tab-link{color:rgba(0,0,0,.87)}.select-address-theme .mat-tab-label.mat-tab-disabled,.select-address-theme .mat-tab-link.mat-tab-disabled{color:rgba(0,0,0,.38)}.select-address-theme .mat-tab-header-pagination-chevron{border-color:rgba(0,0,0,.87)}.select-address-theme .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(0,0,0,.38)}.select-address-theme .mat-tab-group[class*=mat-background-] .mat-tab-header,.select-address-theme .mat-tab-nav-bar[class*=mat-background-]{border-bottom:none;border-top:none}.select-address-theme .mat-tab-group.mat-primary .mat-tab-label:focus,.select-address-theme .mat-tab-group.mat-primary .mat-tab-link:focus,.select-address-theme .mat-tab-nav-bar.mat-primary .mat-tab-label:focus,.select-address-theme .mat-tab-nav-bar.mat-primary .mat-tab-link:focus{background-color:rgba(221,221,221,.3)}.select-address-theme .mat-tab-group.mat-primary .mat-ink-bar,.select-address-theme .mat-tab-group.mat-primary.mat-background-primary .mat-ink-bar,.select-address-theme .mat-tab-nav-bar.mat-primary .mat-ink-bar,.select-address-theme .mat-tab-nav-bar.mat-primary.mat-background-primary .mat-ink-bar{background-color:#ddd}.select-address-theme .mat-tab-group.mat-accent .mat-tab-label:focus,.select-address-theme .mat-tab-group.mat-accent .mat-tab-link:focus,.select-address-theme .mat-tab-nav-bar.mat-accent .mat-tab-label:focus,.select-address-theme .mat-tab-nav-bar.mat-accent .mat-tab-link:focus{background-color:rgba(255,193,37,.3)}.select-address-theme .mat-tab-group.mat-accent .mat-ink-bar,.select-address-theme .mat-tab-nav-bar.mat-accent .mat-ink-bar{background-color:#ffc125}.select-address-theme .mat-tab-group.mat-accent.mat-background-accent .mat-ink-bar,.select-address-theme .mat-tab-nav-bar.mat-accent.mat-background-accent .mat-ink-bar{background-color:#fff}.select-address-theme .mat-tab-group.mat-warn .mat-tab-label:focus,.select-address-theme .mat-tab-group.mat-warn .mat-tab-link:focus,.select-address-theme .mat-tab-nav-bar.mat-warn .mat-tab-label:focus,.select-address-theme .mat-tab-nav-bar.mat-warn .mat-tab-link:focus{background-color:rgba(255,205,210,.3)}.select-address-theme .mat-tab-group.mat-warn .mat-ink-bar,.select-address-theme .mat-tab-nav-bar.mat-warn .mat-ink-bar{background-color:#f44336}.select-address-theme .mat-tab-group.mat-warn.mat-background-warn .mat-ink-bar,.select-address-theme .mat-tab-nav-bar.mat-warn.mat-background-warn .mat-ink-bar{background-color:#fff}.select-address-theme .mat-tab-group.mat-background-primary .mat-tab-label:focus,.select-address-theme .mat-tab-group.mat-background-primary .mat-tab-link:focus,.select-address-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-label:focus,.select-address-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-link:focus{background-color:rgba(221,221,221,.3)}.select-address-theme .mat-tab-group.mat-background-primary .mat-tab-header,.select-address-theme .mat-tab-group.mat-background-primary .mat-tab-links,.select-address-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-header,.select-address-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-links{background-color:#ddd}.select-address-theme .mat-tab-group.mat-background-primary .mat-tab-label,.select-address-theme .mat-tab-group.mat-background-primary .mat-tab-link,.select-address-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-label,.select-address-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-link{color:#ddd}.select-address-theme .mat-tab-group.mat-background-primary .mat-tab-label.mat-tab-disabled,.select-address-theme .mat-tab-group.mat-background-primary .mat-tab-link.mat-tab-disabled,.select-address-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-label.mat-tab-disabled,.select-address-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-link.mat-tab-disabled{color:rgba(221,221,221,.4)}.select-address-theme .mat-tab-group.mat-background-primary .mat-tab-header-pagination-chevron,.select-address-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-header-pagination-chevron{border-color:#ddd}.select-address-theme .mat-tab-group.mat-background-primary .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.select-address-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(221,221,221,.4)}.select-address-theme .mat-tab-group.mat-background-primary .mat-ripple-element,.select-address-theme .mat-tab-nav-bar.mat-background-primary .mat-ripple-element{background-color:rgba(221,221,221,.12)}.select-address-theme .mat-tab-group.mat-background-accent .mat-tab-label:focus,.select-address-theme .mat-tab-group.mat-background-accent .mat-tab-link:focus,.select-address-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-label:focus,.select-address-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-link:focus{background-color:rgba(255,193,37,.3)}.select-address-theme .mat-tab-group.mat-background-accent .mat-tab-header,.select-address-theme .mat-tab-group.mat-background-accent .mat-tab-links,.select-address-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-header,.select-address-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-links{background-color:#ffc125}.select-address-theme .mat-tab-group.mat-background-accent .mat-tab-label,.select-address-theme .mat-tab-group.mat-background-accent .mat-tab-link,.select-address-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-label,.select-address-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-link{color:#fff}.select-address-theme .mat-tab-group.mat-background-accent .mat-tab-label.mat-tab-disabled,.select-address-theme .mat-tab-group.mat-background-accent .mat-tab-link.mat-tab-disabled,.select-address-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-label.mat-tab-disabled,.select-address-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-link.mat-tab-disabled{color:rgba(255,255,255,.4)}.select-address-theme .mat-tab-group.mat-background-accent .mat-tab-header-pagination-chevron,.select-address-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-header-pagination-chevron{border-color:#fff}.select-address-theme .mat-tab-group.mat-background-accent .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.select-address-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(255,255,255,.4)}.select-address-theme .mat-tab-group.mat-background-accent .mat-ripple-element,.select-address-theme .mat-tab-nav-bar.mat-background-accent .mat-ripple-element{background-color:rgba(255,255,255,.12)}.select-address-theme .mat-tab-group.mat-background-warn .mat-tab-label:focus,.select-address-theme .mat-tab-group.mat-background-warn .mat-tab-link:focus,.select-address-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-label:focus,.select-address-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-link:focus{background-color:rgba(255,205,210,.3)}.select-address-theme .mat-tab-group.mat-background-warn .mat-tab-header,.select-address-theme .mat-tab-group.mat-background-warn .mat-tab-links,.select-address-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-header,.select-address-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-links{background-color:#f44336}.select-address-theme .mat-tab-group.mat-background-warn .mat-tab-label,.select-address-theme .mat-tab-group.mat-background-warn .mat-tab-link,.select-address-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-label,.select-address-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-link{color:#fff}.select-address-theme .mat-tab-group.mat-background-warn .mat-tab-label.mat-tab-disabled,.select-address-theme .mat-tab-group.mat-background-warn .mat-tab-link.mat-tab-disabled,.select-address-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-label.mat-tab-disabled,.select-address-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-link.mat-tab-disabled{color:rgba(255,255,255,.4)}.select-address-theme .mat-tab-group.mat-background-warn .mat-tab-header-pagination-chevron,.select-address-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-header-pagination-chevron{border-color:#fff}.select-address-theme .mat-tab-group.mat-background-warn .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.select-address-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(255,255,255,.4)}.select-address-theme .mat-tab-group.mat-background-warn .mat-ripple-element,.select-address-theme .mat-tab-nav-bar.mat-background-warn .mat-ripple-element{background-color:rgba(255,255,255,.12)}.select-address-theme .mat-toolbar{background:#f5f5f5;color:rgba(0,0,0,.87)}.select-address-theme .mat-toolbar.mat-primary{background:#ddd;color:#ddd}.select-address-theme .mat-toolbar.mat-accent{background:#ffc125;color:#fff}.select-address-theme .mat-toolbar.mat-warn{background:#f44336;color:#fff}.select-address-theme .mat-tooltip{background:rgba(97,97,97,.9)}.select-address-theme .mat-snack-bar-container{background:#323232;color:#fff}.select-address-theme .mat-simple-snackbar-action{color:#ffc125}.subtle-theme .mat-ripple-element{background-color:rgba(0,0,0,.1)}.subtle-theme .mat-option{color:rgba(0,0,0,.87)}.subtle-theme .mat-option:focus:not(.mat-option-disabled),.subtle-theme .mat-option:hover:not(.mat-option-disabled){background:rgba(0,0,0,.04)}.mat-primary .subtle-theme .mat-option.mat-selected:not(.mat-option-disabled){color:#fff}.mat-accent .subtle-theme .mat-option.mat-selected:not(.mat-option-disabled){color:#ccc}.mat-warn .subtle-theme .mat-option.mat-selected:not(.mat-option-disabled){color:#f44336}.subtle-theme .mat-option.mat-selected:not(.mat-option-multiple):not(.mat-option-disabled){background:rgba(0,0,0,.04)}.subtle-theme .mat-option.mat-active{background:rgba(0,0,0,.04);color:rgba(0,0,0,.87)}.subtle-theme .mat-option.mat-option-disabled{color:rgba(0,0,0,.38)}.subtle-theme .mat-optgroup-label{color:rgba(0,0,0,.54)}.subtle-theme .mat-optgroup-disabled .mat-optgroup-label{color:rgba(0,0,0,.38)}.subtle-theme .mat-pseudo-checkbox{color:rgba(0,0,0,.54)}.subtle-theme .mat-pseudo-checkbox::after{color:#fafafa}.subtle-theme .mat-accent .mat-pseudo-checkbox-checked,.subtle-theme .mat-accent .mat-pseudo-checkbox-indeterminate,.subtle-theme .mat-pseudo-checkbox-checked,.subtle-theme .mat-pseudo-checkbox-indeterminate{background:#ccc}.subtle-theme .mat-primary .mat-pseudo-checkbox-checked,.subtle-theme .mat-primary .mat-pseudo-checkbox-indeterminate{background:#fff}.subtle-theme .mat-warn .mat-pseudo-checkbox-checked,.subtle-theme .mat-warn .mat-pseudo-checkbox-indeterminate{background:#f44336}.subtle-theme .mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled,.subtle-theme .mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled{background:#b0b0b0}.subtle-theme .mat-app-background{background-color:#fafafa}.subtle-theme .mat-theme-loaded-marker{display:none}.subtle-theme .mat-autocomplete-panel{background:#fff;color:rgba(0,0,0,.87)}.subtle-theme .mat-autocomplete-panel .mat-option.mat-selected:not(.mat-active):not(:hover){background:#fff}.subtle-theme .mat-autocomplete-panel .mat-option.mat-selected:not(.mat-active):not(:hover):not(.mat-option-disabled){color:rgba(0,0,0,.87)}.subtle-theme .mat-button,.subtle-theme .mat-icon-button{background:0 0}.subtle-theme .mat-button.mat-primary .mat-button-focus-overlay,.subtle-theme .mat-icon-button.mat-primary .mat-button-focus-overlay{background-color:rgba(255,255,255,.12)}.subtle-theme .mat-button.mat-accent .mat-button-focus-overlay,.subtle-theme .mat-icon-button.mat-accent .mat-button-focus-overlay{background-color:rgba(204,204,204,.12)}.subtle-theme .mat-button.mat-warn .mat-button-focus-overlay,.subtle-theme .mat-icon-button.mat-warn .mat-button-focus-overlay{background-color:rgba(244,67,54,.12)}.subtle-theme .mat-button[disabled] .mat-button-focus-overlay,.subtle-theme .mat-icon-button[disabled] .mat-button-focus-overlay{background-color:transparent}.subtle-theme .mat-button.mat-primary,.subtle-theme .mat-icon-button.mat-primary{color:#fff}.subtle-theme .mat-button.mat-accent,.subtle-theme .mat-icon-button.mat-accent{color:#ccc}.subtle-theme .mat-button.mat-warn,.subtle-theme .mat-icon-button.mat-warn{color:#f44336}.subtle-theme .mat-button.mat-accent[disabled],.subtle-theme .mat-button.mat-primary[disabled],.subtle-theme .mat-button.mat-warn[disabled],.subtle-theme .mat-button[disabled][disabled],.subtle-theme .mat-icon-button.mat-accent[disabled],.subtle-theme .mat-icon-button.mat-primary[disabled],.subtle-theme .mat-icon-button.mat-warn[disabled],.subtle-theme .mat-icon-button[disabled][disabled]{color:rgba(0,0,0,.38)}.subtle-theme .mat-fab,.subtle-theme .mat-mini-fab,.subtle-theme .mat-raised-button{color:rgba(0,0,0,.87);background-color:#fff}.subtle-theme .mat-fab.mat-primary,.subtle-theme .mat-mini-fab.mat-primary,.subtle-theme .mat-raised-button.mat-primary{color:#fff;background-color:#fff}.subtle-theme .mat-fab.mat-accent,.subtle-theme .mat-mini-fab.mat-accent,.subtle-theme .mat-raised-button.mat-accent{color:#ccc;background-color:#ccc}.subtle-theme .mat-fab.mat-warn,.subtle-theme .mat-mini-fab.mat-warn,.subtle-theme .mat-raised-button.mat-warn{color:#fff;background-color:#f44336}.subtle-theme .mat-fab.mat-accent[disabled],.subtle-theme .mat-fab.mat-primary[disabled],.subtle-theme .mat-fab.mat-warn[disabled],.subtle-theme .mat-fab[disabled][disabled],.subtle-theme .mat-mini-fab.mat-accent[disabled],.subtle-theme .mat-mini-fab.mat-primary[disabled],.subtle-theme .mat-mini-fab.mat-warn[disabled],.subtle-theme .mat-mini-fab[disabled][disabled],.subtle-theme .mat-raised-button.mat-accent[disabled],.subtle-theme .mat-raised-button.mat-primary[disabled],.subtle-theme .mat-raised-button.mat-warn[disabled],.subtle-theme .mat-raised-button[disabled][disabled]{color:rgba(0,0,0,.38);background-color:rgba(0,0,0,.12)}.subtle-theme .mat-fab.mat-primary .mat-ripple-element,.subtle-theme .mat-mini-fab.mat-primary .mat-ripple-element,.subtle-theme .mat-raised-button.mat-primary .mat-ripple-element{background-color:rgba(255,255,255,.2)}.subtle-theme .mat-fab.mat-accent .mat-ripple-element,.subtle-theme .mat-mini-fab.mat-accent .mat-ripple-element,.subtle-theme .mat-raised-button.mat-accent .mat-ripple-element{background-color:rgba(204,204,204,.2)}.subtle-theme .mat-fab.mat-warn .mat-ripple-element,.subtle-theme .mat-mini-fab.mat-warn .mat-ripple-element,.subtle-theme .mat-raised-button.mat-warn .mat-ripple-element{background-color:rgba(255,255,255,.2)}.subtle-theme .mat-button.mat-primary .mat-ripple-element{background-color:rgba(255,255,255,.1)}.subtle-theme .mat-button.mat-accent .mat-ripple-element{background-color:rgba(204,204,204,.1)}.subtle-theme .mat-button.mat-warn .mat-ripple-element{background-color:rgba(244,67,54,.1)}.subtle-theme .mat-icon-button.mat-primary .mat-ripple-element{background-color:rgba(255,255,255,.2)}.subtle-theme .mat-icon-button.mat-accent .mat-ripple-element{background-color:rgba(204,204,204,.2)}.subtle-theme .mat-icon-button.mat-warn .mat-ripple-element{background-color:rgba(244,67,54,.2)}.subtle-theme .mat-button-toggle{color:rgba(0,0,0,.38)}.subtle-theme .mat-button-toggle.cdk-focused .mat-button-toggle-focus-overlay{background-color:rgba(0,0,0,.06)}.subtle-theme .mat-button-toggle-checked{background-color:#e0e0e0;color:rgba(0,0,0,.54)}.subtle-theme .mat-button-toggle-disabled{background-color:#eee;color:rgba(0,0,0,.38)}.subtle-theme .mat-button-toggle-disabled.mat-button-toggle-checked{background-color:#bdbdbd}.subtle-theme .mat-card{background:#fff;color:rgba(0,0,0,.87)}.subtle-theme .mat-card-subtitle{color:rgba(0,0,0,.54)}.subtle-theme .mat-checkbox-frame{border-color:rgba(0,0,0,.54)}.subtle-theme .mat-checkbox-checkmark{fill:#fafafa}.subtle-theme .mat-checkbox-checkmark-path{stroke:#fafafa!important}.subtle-theme .mat-checkbox-mixedmark{background-color:#fafafa}.subtle-theme .mat-checkbox-checked.mat-primary .mat-checkbox-background,.subtle-theme .mat-checkbox-indeterminate.mat-primary .mat-checkbox-background{background-color:#fff}.subtle-theme .mat-checkbox-checked.mat-accent .mat-checkbox-background,.subtle-theme .mat-checkbox-indeterminate.mat-accent .mat-checkbox-background{background-color:#ccc}.subtle-theme .mat-checkbox-checked.mat-warn .mat-checkbox-background,.subtle-theme .mat-checkbox-indeterminate.mat-warn .mat-checkbox-background{background-color:#f44336}.subtle-theme .mat-checkbox-disabled.mat-checkbox-checked .mat-checkbox-background,.subtle-theme .mat-checkbox-disabled.mat-checkbox-indeterminate .mat-checkbox-background{background-color:#b0b0b0}.subtle-theme .mat-checkbox-disabled:not(.mat-checkbox-checked) .mat-checkbox-frame{border-color:#b0b0b0}.subtle-theme .mat-checkbox-disabled .mat-checkbox-label{color:#b0b0b0}.subtle-theme .mat-checkbox:not(.mat-checkbox-disabled).mat-primary .mat-checkbox-ripple .mat-ripple-element{background-color:rgba(255,255,255,.26)}.subtle-theme .mat-checkbox:not(.mat-checkbox-disabled).mat-accent .mat-checkbox-ripple .mat-ripple-element{background-color:rgba(204,204,204,.26)}.subtle-theme .mat-checkbox:not(.mat-checkbox-disabled).mat-warn .mat-checkbox-ripple .mat-ripple-element{background-color:rgba(244,67,54,.26)}.subtle-theme .mat-chip:not(.mat-basic-chip){background-color:#e0e0e0;color:rgba(0,0,0,.87)}.subtle-theme .mat-chip:not(.mat-basic-chip) .mat-chip-remove{color:rgba(0,0,0,.87);opacity:.4}.subtle-theme .mat-chip:not(.mat-basic-chip) .mat-chip-remove:hover{opacity:.54}.subtle-theme .mat-chip.mat-chip-selected.mat-primary{background-color:#fff;color:#fff}.subtle-theme .mat-chip.mat-chip-selected.mat-primary .mat-chip-remove{color:#fff;opacity:.4}.subtle-theme .mat-chip.mat-chip-selected.mat-primary .mat-chip-remove:hover{opacity:.54}.subtle-theme .mat-chip.mat-chip-selected.mat-warn{background-color:#f44336;color:#fff}.subtle-theme .mat-chip.mat-chip-selected.mat-warn .mat-chip-remove{color:#fff;opacity:.4}.subtle-theme .mat-chip.mat-chip-selected.mat-warn .mat-chip-remove:hover{opacity:.54}.subtle-theme .mat-chip.mat-chip-selected.mat-accent{background-color:#ccc;color:#ccc}.subtle-theme .mat-chip.mat-chip-selected.mat-accent .mat-chip-remove{color:#ccc;opacity:.4}.subtle-theme .mat-chip.mat-chip-selected.mat-accent .mat-chip-remove:hover{opacity:.54}.subtle-theme .mat-table{background:#fff}.subtle-theme .mat-header-row,.subtle-theme .mat-row{border-bottom-color:rgba(0,0,0,.12)}.subtle-theme .mat-header-cell{color:rgba(0,0,0,.54)}.subtle-theme .mat-cell{color:rgba(0,0,0,.87)}.subtle-theme .mat-datepicker-content{background-color:#fff;color:rgba(0,0,0,.87)}.subtle-theme .mat-calendar-arrow{border-top-color:rgba(0,0,0,.54)}.subtle-theme .mat-calendar-next-button,.subtle-theme .mat-calendar-previous-button{color:rgba(0,0,0,.54)}.subtle-theme .mat-calendar-table-header{color:rgba(0,0,0,.38)}.subtle-theme .mat-calendar-table-header-divider::after{background:rgba(0,0,0,.12)}.subtle-theme .mat-calendar-body-label{color:rgba(0,0,0,.54)}.subtle-theme .mat-calendar-body-cell-content{color:rgba(0,0,0,.87);border-color:transparent}.mat-calendar-body-disabled>.subtle-theme .mat-calendar-body-cell-content:not(.mat-calendar-body-selected){color:rgba(0,0,0,.38)}.subtle-theme .cdk-keyboard-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected),.subtle-theme .cdk-program-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected),.subtle-theme :not(.mat-calendar-body-disabled):hover>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected){background-color:rgba(0,0,0,.04)}.subtle-theme .mat-calendar-body-selected{background-color:#fff;color:#fff}.subtle-theme .mat-calendar-body-disabled>.mat-calendar-body-selected{background-color:rgba(255,255,255,.4)}.subtle-theme .mat-calendar-body-today:not(.mat-calendar-body-selected){border-color:rgba(0,0,0,.38)}.subtle-theme .mat-calendar-body-today.mat-calendar-body-selected{-webkit-box-shadow:inset 0 0 0 1px #fff;box-shadow:inset 0 0 0 1px #fff}.subtle-theme .mat-calendar-body-disabled>.mat-calendar-body-today:not(.mat-calendar-body-selected){border-color:rgba(0,0,0,.18)}.subtle-theme .mat-dialog-container,.subtle-theme .mat-expansion-panel{background:#fff;color:rgba(0,0,0,.87)}.subtle-theme .mat-action-row{border-top-color:rgba(0,0,0,.12)}.subtle-theme .mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:not([aria-disabled=true]).cdk-keyboard-focused,.subtle-theme .mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:not([aria-disabled=true]).cdk-program-focused,.subtle-theme .mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:not([aria-disabled=true]):hover{background:rgba(0,0,0,.04)}.subtle-theme .mat-expansion-panel-header-title{color:rgba(0,0,0,.87)}.subtle-theme .mat-expansion-indicator::after,.subtle-theme .mat-expansion-panel-header-description{color:rgba(0,0,0,.54)}.subtle-theme .mat-expansion-panel-header[aria-disabled=true]{color:rgba(0,0,0,.38)}.subtle-theme .mat-expansion-panel-header[aria-disabled=true] .mat-expansion-panel-header-description,.subtle-theme .mat-expansion-panel-header[aria-disabled=true] .mat-expansion-panel-header-title{color:inherit}.subtle-theme .mat-form-field-label,.subtle-theme .mat-hint{color:rgba(0,0,0,.54)}.subtle-theme .mat-focused .mat-form-field-label{color:#fff}.subtle-theme .mat-focused .mat-form-field-label.mat-accent{color:#ccc}.subtle-theme .mat-focused .mat-form-field-label.mat-warn{color:#f44336}.subtle-theme .mat-focused .mat-form-field-required-marker{color:#ccc}.subtle-theme .mat-form-field-underline{background-color:rgba(0,0,0,.42)}.subtle-theme .mat-form-field-disabled .mat-form-field-underline{background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.42)),color-stop(33%,rgba(0,0,0,.42)),color-stop(0,transparent));background-image:linear-gradient(to right,rgba(0,0,0,.42) 0,rgba(0,0,0,.42) 33%,transparent 0);background-size:4px 1px;background-repeat:repeat-x}.subtle-theme .mat-form-field-ripple{background-color:#fff}.subtle-theme .mat-form-field-ripple.mat-accent{background-color:#ccc}.subtle-theme .mat-form-field-ripple.mat-warn{background-color:#f44336}.subtle-theme .mat-form-field-invalid .mat-form-field-label,.subtle-theme .mat-form-field-invalid .mat-form-field-label .mat-form-field-required-marker,.subtle-theme .mat-form-field-invalid .mat-form-field-label.mat-accent{color:#f44336}.subtle-theme .mat-form-field-invalid .mat-form-field-ripple{background-color:#f44336}.subtle-theme .mat-error{color:#f44336}.subtle-theme .mat-icon.mat-primary{color:#fff}.subtle-theme .mat-icon.mat-accent{color:#ccc}.subtle-theme .mat-icon.mat-warn{color:#f44336}.subtle-theme .mat-input-element:disabled{color:rgba(0,0,0,.38)}.subtle-theme .mat-input-element{caret-color:#fff}.subtle-theme .mat-input-element::-ms-input-placeholder{color:rgba(0,0,0,.42)}.subtle-theme .mat-input-element::placeholder{color:rgba(0,0,0,.42)}.subtle-theme .mat-input-element::-moz-placeholder{color:rgba(0,0,0,.42)}.subtle-theme .mat-input-element::-webkit-input-placeholder{color:rgba(0,0,0,.42)}.subtle-theme .mat-input-element:-ms-input-placeholder{color:rgba(0,0,0,.42)}.subtle-theme .mat-accent .mat-input-element{caret-color:#ccc}.subtle-theme .mat-form-field-invalid .mat-input-element,.subtle-theme .mat-warn .mat-input-element{caret-color:#f44336}.subtle-theme .mat-list .mat-list-item,.subtle-theme .mat-list .mat-list-option,.subtle-theme .mat-nav-list .mat-list-item,.subtle-theme .mat-nav-list .mat-list-option,.subtle-theme .mat-selection-list .mat-list-item,.subtle-theme .mat-selection-list .mat-list-option{color:rgba(0,0,0,.87)}.subtle-theme .mat-list .mat-subheader,.subtle-theme .mat-nav-list .mat-subheader,.subtle-theme .mat-selection-list .mat-subheader{color:rgba(0,0,0,.54)}.subtle-theme .mat-list-item-disabled{background-color:#eee}.subtle-theme .mat-divider{border-top-color:rgba(0,0,0,.12)}.subtle-theme .mat-nav-list .mat-list-item{outline:0}.subtle-theme .mat-nav-list .mat-list-item.mat-list-item-focus,.subtle-theme .mat-nav-list .mat-list-item:hover{background:rgba(0,0,0,.04)}.subtle-theme .mat-list-option{outline:0}.subtle-theme .mat-list-option.mat-list-item-focus,.subtle-theme .mat-list-option:hover{background:rgba(0,0,0,.04)}.subtle-theme .mat-menu-panel{background:#fff}.subtle-theme .mat-menu-item{background:0 0;color:rgba(0,0,0,.87)}.subtle-theme .mat-menu-item[disabled]{color:rgba(0,0,0,.38)}.subtle-theme .mat-menu-item .mat-icon:not([color]),.subtle-theme .mat-menu-item-submenu-trigger::after{color:rgba(0,0,0,.54)}.subtle-theme .mat-menu-item-highlighted:not([disabled]),.subtle-theme .mat-menu-item:focus:not([disabled]),.subtle-theme .mat-menu-item:hover:not([disabled]){background:rgba(0,0,0,.04)}.subtle-theme .mat-paginator{background:#fff}.subtle-theme .mat-paginator,.subtle-theme .mat-paginator-page-size .mat-select-trigger{color:rgba(0,0,0,.54)}.subtle-theme .mat-paginator-decrement,.subtle-theme .mat-paginator-increment{border-top:2px solid rgba(0,0,0,.54);border-right:2px solid rgba(0,0,0,.54)}.subtle-theme .mat-icon-button[disabled] .mat-paginator-decrement,.subtle-theme .mat-icon-button[disabled] .mat-paginator-increment{border-color:rgba(0,0,0,.38)}.subtle-theme .mat-progress-bar-background{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20version%3D%271.1%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20xmlns%3Axlink%3D%27http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%27%20x%3D%270px%27%20y%3D%270px%27%20enable-background%3D%27new%200%200%205%202%27%20xml%3Aspace%3D%27preserve%27%20viewBox%3D%270%200%205%202%27%20preserveAspectRatio%3D%27none%20slice%27%3E%3Ccircle%20cx%3D%271%27%20cy%3D%271%27%20r%3D%271%27%20fill%3D%27white%27%2F%3E%3C%2Fsvg%3E")}.subtle-theme .mat-progress-bar-buffer,.subtle-theme .mat-progress-bar-fill::after{background-color:#fff}.subtle-theme .mat-progress-bar.mat-accent .mat-progress-bar-background{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20version%3D%271.1%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20xmlns%3Axlink%3D%27http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%27%20x%3D%270px%27%20y%3D%270px%27%20enable-background%3D%27new%200%200%205%202%27%20xml%3Aspace%3D%27preserve%27%20viewBox%3D%270%200%205%202%27%20preserveAspectRatio%3D%27none%20slice%27%3E%3Ccircle%20cx%3D%271%27%20cy%3D%271%27%20r%3D%271%27%20fill%3D%27%23cccccc%27%2F%3E%3C%2Fsvg%3E")}.subtle-theme .mat-progress-bar.mat-accent .mat-progress-bar-buffer,.subtle-theme .mat-progress-bar.mat-accent .mat-progress-bar-fill::after{background-color:#ccc}.subtle-theme .mat-progress-bar.mat-warn .mat-progress-bar-background{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20version%3D%271.1%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20xmlns%3Axlink%3D%27http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%27%20x%3D%270px%27%20y%3D%270px%27%20enable-background%3D%27new%200%200%205%202%27%20xml%3Aspace%3D%27preserve%27%20viewBox%3D%270%200%205%202%27%20preserveAspectRatio%3D%27none%20slice%27%3E%3Ccircle%20cx%3D%271%27%20cy%3D%271%27%20r%3D%271%27%20fill%3D%27%23ffcdd2%27%2F%3E%3C%2Fsvg%3E")}.subtle-theme .mat-progress-bar.mat-warn .mat-progress-bar-buffer{background-color:#ffcdd2}.subtle-theme .mat-progress-bar.mat-warn .mat-progress-bar-fill::after{background-color:#f44336}.subtle-theme .mat-progress-spinner circle,.subtle-theme .mat-spinner circle{stroke:#fff}.subtle-theme .mat-progress-spinner.mat-accent circle,.subtle-theme .mat-spinner.mat-accent circle{stroke:#ccc}.subtle-theme .mat-progress-spinner.mat-warn circle,.subtle-theme .mat-spinner.mat-warn circle{stroke:#f44336}.subtle-theme .mat-radio-outer-circle{border-color:rgba(0,0,0,.54)}.subtle-theme .mat-radio-disabled .mat-radio-outer-circle{border-color:rgba(0,0,0,.38)}.subtle-theme .mat-radio-disabled .mat-radio-inner-circle,.subtle-theme .mat-radio-disabled .mat-radio-ripple .mat-ripple-element{background-color:rgba(0,0,0,.38)}.subtle-theme .mat-radio-disabled .mat-radio-label-content{color:rgba(0,0,0,.38)}.subtle-theme .mat-radio-button.mat-primary.mat-radio-checked .mat-radio-outer-circle{border-color:#fff}.subtle-theme .mat-radio-button.mat-primary .mat-radio-inner-circle{background-color:#fff}.subtle-theme .mat-radio-button.mat-primary .mat-radio-ripple .mat-ripple-element{background-color:rgba(255,255,255,.26)}.subtle-theme .mat-radio-button.mat-accent.mat-radio-checked .mat-radio-outer-circle{border-color:#ccc}.subtle-theme .mat-radio-button.mat-accent .mat-radio-inner-circle{background-color:#ccc}.subtle-theme .mat-radio-button.mat-accent .mat-radio-ripple .mat-ripple-element{background-color:rgba(204,204,204,.26)}.subtle-theme .mat-radio-button.mat-warn.mat-radio-checked .mat-radio-outer-circle{border-color:#f44336}.subtle-theme .mat-radio-button.mat-warn .mat-radio-inner-circle{background-color:#f44336}.subtle-theme .mat-radio-button.mat-warn .mat-radio-ripple .mat-ripple-element{background-color:rgba(244,67,54,.26)}.subtle-theme .mat-select-content,.subtle-theme .mat-select-panel-done-animating{background:#fff}.subtle-theme .mat-select-value{color:rgba(0,0,0,.87)}.subtle-theme .mat-select-placeholder{color:rgba(0,0,0,.42)}.subtle-theme .mat-select-disabled .mat-select-value{color:rgba(0,0,0,.38)}.subtle-theme .mat-select-arrow{color:rgba(0,0,0,.54)}.subtle-theme .mat-select-panel .mat-option.mat-selected:not(.mat-option-multiple){background:rgba(0,0,0,.12)}.subtle-theme .mat-form-field.mat-focused.mat-primary .mat-select-arrow{color:#fff}.subtle-theme .mat-form-field.mat-focused.mat-accent .mat-select-arrow{color:#ccc}.subtle-theme .mat-form-field .mat-select.mat-select-invalid .mat-select-arrow,.subtle-theme .mat-form-field.mat-focused.mat-warn .mat-select-arrow{color:#f44336}.subtle-theme .mat-form-field .mat-select.mat-select-disabled .mat-select-arrow{color:rgba(0,0,0,.38)}.subtle-theme .mat-drawer-container{background-color:#fafafa;color:rgba(0,0,0,.87)}.subtle-theme .mat-drawer{background-color:#fff;color:rgba(0,0,0,.87)}.subtle-theme .mat-drawer.mat-drawer-push{background-color:#fff}.subtle-theme .mat-drawer-backdrop.mat-drawer-shown{background-color:rgba(0,0,0,.6)}.subtle-theme .mat-slide-toggle.mat-checked:not(.mat-disabled) .mat-slide-toggle-thumb{background-color:#ccc}.subtle-theme .mat-slide-toggle.mat-checked:not(.mat-disabled) .mat-slide-toggle-bar{background-color:rgba(204,204,204,.5)}.subtle-theme .mat-slide-toggle:not(.mat-checked) .mat-ripple-element{background-color:rgba(0,0,0,.06)}.subtle-theme .mat-slide-toggle .mat-ripple-element{background-color:rgba(204,204,204,.12)}.subtle-theme .mat-slide-toggle.mat-primary.mat-checked:not(.mat-disabled) .mat-slide-toggle-thumb{background-color:#fff}.subtle-theme .mat-slide-toggle.mat-primary.mat-checked:not(.mat-disabled) .mat-slide-toggle-bar{background-color:rgba(255,255,255,.5)}.subtle-theme .mat-slide-toggle.mat-primary:not(.mat-checked) .mat-ripple-element{background-color:rgba(0,0,0,.06)}.subtle-theme .mat-slide-toggle.mat-primary .mat-ripple-element{background-color:rgba(255,255,255,.12)}.subtle-theme .mat-slide-toggle.mat-warn.mat-checked:not(.mat-disabled) .mat-slide-toggle-thumb{background-color:#f44336}.subtle-theme .mat-slide-toggle.mat-warn.mat-checked:not(.mat-disabled) .mat-slide-toggle-bar{background-color:rgba(244,67,54,.5)}.subtle-theme .mat-slide-toggle.mat-warn:not(.mat-checked) .mat-ripple-element{background-color:rgba(0,0,0,.06)}.subtle-theme .mat-slide-toggle.mat-warn .mat-ripple-element{background-color:rgba(244,67,54,.12)}.subtle-theme .mat-disabled .mat-slide-toggle-thumb{background-color:#bdbdbd}.subtle-theme .mat-disabled .mat-slide-toggle-bar{background-color:rgba(0,0,0,.1)}.subtle-theme .mat-slide-toggle-thumb{background-color:#fafafa}.subtle-theme .mat-slide-toggle-bar{background-color:rgba(0,0,0,.38)}.subtle-theme .mat-slider-track-background{background-color:rgba(0,0,0,.26)}.subtle-theme .mat-primary .mat-slider-thumb,.subtle-theme .mat-primary .mat-slider-thumb-label,.subtle-theme .mat-primary .mat-slider-track-fill{background-color:#fff}.subtle-theme .mat-primary .mat-slider-thumb-label-text{color:#fff}.subtle-theme .mat-accent .mat-slider-thumb,.subtle-theme .mat-accent .mat-slider-thumb-label,.subtle-theme .mat-accent .mat-slider-track-fill{background-color:#ccc}.subtle-theme .mat-accent .mat-slider-thumb-label-text{color:#ccc}.subtle-theme .mat-warn .mat-slider-thumb,.subtle-theme .mat-warn .mat-slider-thumb-label,.subtle-theme .mat-warn .mat-slider-track-fill{background-color:#f44336}.subtle-theme .mat-warn .mat-slider-thumb-label-text{color:#fff}.subtle-theme .mat-slider-focus-ring{background-color:rgba(204,204,204,.2)}.subtle-theme .cdk-focused .mat-slider-track-background,.subtle-theme .mat-slider:hover .mat-slider-track-background{background-color:rgba(0,0,0,.38)}.subtle-theme .mat-slider-disabled .mat-slider-thumb,.subtle-theme .mat-slider-disabled .mat-slider-track-background,.subtle-theme .mat-slider-disabled .mat-slider-track-fill,.subtle-theme .mat-slider-disabled:hover .mat-slider-track-background{background-color:rgba(0,0,0,.26)}.subtle-theme .mat-slider-min-value .mat-slider-focus-ring{background-color:rgba(0,0,0,.12)}.subtle-theme .mat-slider-min-value.mat-slider-thumb-label-showing .mat-slider-thumb,.subtle-theme .mat-slider-min-value.mat-slider-thumb-label-showing .mat-slider-thumb-label{background-color:rgba(0,0,0,.87)}.subtle-theme .mat-slider-min-value.mat-slider-thumb-label-showing.cdk-focused .mat-slider-thumb,.subtle-theme .mat-slider-min-value.mat-slider-thumb-label-showing.cdk-focused .mat-slider-thumb-label{background-color:rgba(0,0,0,.26)}.subtle-theme .mat-slider-min-value:not(.mat-slider-thumb-label-showing) .mat-slider-thumb{border-color:rgba(0,0,0,.26);background-color:transparent}.subtle-theme .mat-slider-min-value:not(.mat-slider-thumb-label-showing).cdk-focused .mat-slider-thumb,.subtle-theme .mat-slider-min-value:not(.mat-slider-thumb-label-showing):hover .mat-slider-thumb{border-color:rgba(0,0,0,.38)}.subtle-theme .mat-slider-min-value:not(.mat-slider-thumb-label-showing).cdk-focused.mat-slider-disabled .mat-slider-thumb,.subtle-theme .mat-slider-min-value:not(.mat-slider-thumb-label-showing):hover.mat-slider-disabled .mat-slider-thumb{border-color:rgba(0,0,0,.26)}.subtle-theme .mat-slider-has-ticks .mat-slider-wrapper::after{border-color:rgba(0,0,0,.7)}.subtle-theme .mat-slider-horizontal .mat-slider-ticks{background-image:repeating-linear-gradient(to right,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent);background-image:-moz-repeating-linear-gradient(.0001deg,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent)}.subtle-theme .mat-slider-vertical .mat-slider-ticks{background-image:repeating-linear-gradient(to bottom,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent)}.subtle-theme .mat-step-header.cdk-keyboard-focused,.subtle-theme .mat-step-header.cdk-program-focused,.subtle-theme .mat-step-header:hover{background-color:rgba(0,0,0,.04)}.subtle-theme .mat-step-header .mat-step-label,.subtle-theme .mat-step-header .mat-step-optional{color:rgba(0,0,0,.38)}.subtle-theme .mat-step-header .mat-step-icon{background-color:#fff;color:#fff}.subtle-theme .mat-step-header .mat-step-icon-not-touched{background-color:rgba(0,0,0,.38);color:#fff}.subtle-theme .mat-step-header .mat-step-label.mat-step-label-active{color:rgba(0,0,0,.87)}.subtle-theme .mat-stepper-horizontal,.subtle-theme .mat-stepper-vertical{background-color:#fff}.subtle-theme .mat-stepper-vertical-line::before{border-left-color:rgba(0,0,0,.12)}.subtle-theme .mat-stepper-horizontal-line{border-top-color:rgba(0,0,0,.12)}.subtle-theme .mat-tab-header,.subtle-theme .mat-tab-nav-bar{border-bottom:1px solid rgba(0,0,0,.12)}.subtle-theme .mat-tab-group-inverted-header .mat-tab-header,.subtle-theme .mat-tab-group-inverted-header .mat-tab-nav-bar{border-top:1px solid rgba(0,0,0,.12);border-bottom:none}.subtle-theme .mat-tab-label,.subtle-theme .mat-tab-link{color:rgba(0,0,0,.87)}.subtle-theme .mat-tab-label.mat-tab-disabled,.subtle-theme .mat-tab-link.mat-tab-disabled{color:rgba(0,0,0,.38)}.subtle-theme .mat-tab-header-pagination-chevron{border-color:rgba(0,0,0,.87)}.subtle-theme .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(0,0,0,.38)}.subtle-theme .mat-tab-group[class*=mat-background-] .mat-tab-header,.subtle-theme .mat-tab-nav-bar[class*=mat-background-]{border-bottom:none;border-top:none}.subtle-theme .mat-tab-group.mat-primary .mat-tab-label:focus,.subtle-theme .mat-tab-group.mat-primary .mat-tab-link:focus,.subtle-theme .mat-tab-nav-bar.mat-primary .mat-tab-label:focus,.subtle-theme .mat-tab-nav-bar.mat-primary .mat-tab-link:focus{background-color:rgba(255,255,255,.3)}.subtle-theme .mat-tab-group.mat-primary .mat-ink-bar,.subtle-theme .mat-tab-group.mat-primary.mat-background-primary .mat-ink-bar,.subtle-theme .mat-tab-nav-bar.mat-primary .mat-ink-bar,.subtle-theme .mat-tab-nav-bar.mat-primary.mat-background-primary .mat-ink-bar{background-color:#fff}.subtle-theme .mat-tab-group.mat-accent .mat-tab-label:focus,.subtle-theme .mat-tab-group.mat-accent .mat-tab-link:focus,.subtle-theme .mat-tab-nav-bar.mat-accent .mat-tab-label:focus,.subtle-theme .mat-tab-nav-bar.mat-accent .mat-tab-link:focus{background-color:rgba(204,204,204,.3)}.subtle-theme .mat-tab-group.mat-accent .mat-ink-bar,.subtle-theme .mat-tab-group.mat-accent.mat-background-accent .mat-ink-bar,.subtle-theme .mat-tab-nav-bar.mat-accent .mat-ink-bar,.subtle-theme .mat-tab-nav-bar.mat-accent.mat-background-accent .mat-ink-bar{background-color:#ccc}.subtle-theme .mat-tab-group.mat-warn .mat-tab-label:focus,.subtle-theme .mat-tab-group.mat-warn .mat-tab-link:focus,.subtle-theme .mat-tab-nav-bar.mat-warn .mat-tab-label:focus,.subtle-theme .mat-tab-nav-bar.mat-warn .mat-tab-link:focus{background-color:rgba(255,205,210,.3)}.subtle-theme .mat-tab-group.mat-warn .mat-ink-bar,.subtle-theme .mat-tab-nav-bar.mat-warn .mat-ink-bar{background-color:#f44336}.subtle-theme .mat-tab-group.mat-warn.mat-background-warn .mat-ink-bar,.subtle-theme .mat-tab-nav-bar.mat-warn.mat-background-warn .mat-ink-bar{background-color:#fff}.subtle-theme .mat-tab-group.mat-background-primary .mat-tab-label:focus,.subtle-theme .mat-tab-group.mat-background-primary .mat-tab-link:focus,.subtle-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-label:focus,.subtle-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-link:focus{background-color:rgba(255,255,255,.3)}.subtle-theme .mat-tab-group.mat-background-primary .mat-tab-header,.subtle-theme .mat-tab-group.mat-background-primary .mat-tab-links,.subtle-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-header,.subtle-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-links{background-color:#fff}.subtle-theme .mat-tab-group.mat-background-primary .mat-tab-label,.subtle-theme .mat-tab-group.mat-background-primary .mat-tab-link,.subtle-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-label,.subtle-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-link{color:#fff}.subtle-theme .mat-tab-group.mat-background-primary .mat-tab-label.mat-tab-disabled,.subtle-theme .mat-tab-group.mat-background-primary .mat-tab-link.mat-tab-disabled,.subtle-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-label.mat-tab-disabled,.subtle-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-link.mat-tab-disabled{color:rgba(255,255,255,.4)}.subtle-theme .mat-tab-group.mat-background-primary .mat-tab-header-pagination-chevron,.subtle-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-header-pagination-chevron{border-color:#fff}.subtle-theme .mat-tab-group.mat-background-primary .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.subtle-theme .mat-tab-nav-bar.mat-background-primary .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(255,255,255,.4)}.subtle-theme .mat-tab-group.mat-background-primary .mat-ripple-element,.subtle-theme .mat-tab-nav-bar.mat-background-primary .mat-ripple-element{background-color:rgba(255,255,255,.12)}.subtle-theme .mat-tab-group.mat-background-accent .mat-tab-label:focus,.subtle-theme .mat-tab-group.mat-background-accent .mat-tab-link:focus,.subtle-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-label:focus,.subtle-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-link:focus{background-color:rgba(204,204,204,.3)}.subtle-theme .mat-tab-group.mat-background-accent .mat-tab-header,.subtle-theme .mat-tab-group.mat-background-accent .mat-tab-links,.subtle-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-header,.subtle-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-links{background-color:#ccc}.subtle-theme .mat-tab-group.mat-background-accent .mat-tab-label,.subtle-theme .mat-tab-group.mat-background-accent .mat-tab-link,.subtle-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-label,.subtle-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-link{color:#ccc}.subtle-theme .mat-tab-group.mat-background-accent .mat-tab-label.mat-tab-disabled,.subtle-theme .mat-tab-group.mat-background-accent .mat-tab-link.mat-tab-disabled,.subtle-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-label.mat-tab-disabled,.subtle-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-link.mat-tab-disabled{color:rgba(204,204,204,.4)}.subtle-theme .mat-tab-group.mat-background-accent .mat-tab-header-pagination-chevron,.subtle-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-header-pagination-chevron{border-color:#ccc}.subtle-theme .mat-tab-group.mat-background-accent .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.subtle-theme .mat-tab-nav-bar.mat-background-accent .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(204,204,204,.4)}.subtle-theme .mat-tab-group.mat-background-accent .mat-ripple-element,.subtle-theme .mat-tab-nav-bar.mat-background-accent .mat-ripple-element{background-color:rgba(204,204,204,.12)}.subtle-theme .mat-tab-group.mat-background-warn .mat-tab-label:focus,.subtle-theme .mat-tab-group.mat-background-warn .mat-tab-link:focus,.subtle-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-label:focus,.subtle-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-link:focus{background-color:rgba(255,205,210,.3)}.subtle-theme .mat-tab-group.mat-background-warn .mat-tab-header,.subtle-theme .mat-tab-group.mat-background-warn .mat-tab-links,.subtle-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-header,.subtle-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-links{background-color:#f44336}.subtle-theme .mat-tab-group.mat-background-warn .mat-tab-label,.subtle-theme .mat-tab-group.mat-background-warn .mat-tab-link,.subtle-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-label,.subtle-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-link{color:#fff}.subtle-theme .mat-tab-group.mat-background-warn .mat-tab-label.mat-tab-disabled,.subtle-theme .mat-tab-group.mat-background-warn .mat-tab-link.mat-tab-disabled,.subtle-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-label.mat-tab-disabled,.subtle-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-link.mat-tab-disabled{color:rgba(255,255,255,.4)}.subtle-theme .mat-tab-group.mat-background-warn .mat-tab-header-pagination-chevron,.subtle-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-header-pagination-chevron{border-color:#fff}.subtle-theme .mat-tab-group.mat-background-warn .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.subtle-theme .mat-tab-nav-bar.mat-background-warn .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(255,255,255,.4)}.subtle-theme .mat-tab-group.mat-background-warn .mat-ripple-element,.subtle-theme .mat-tab-nav-bar.mat-background-warn .mat-ripple-element{background-color:rgba(255,255,255,.12)}.subtle-theme .mat-toolbar{background:#f5f5f5;color:rgba(0,0,0,.87)}.subtle-theme .mat-toolbar.mat-primary{background:#fff;color:#fff}.subtle-theme .mat-toolbar.mat-accent{background:#ccc;color:#ccc}.subtle-theme .mat-toolbar.mat-warn{background:#f44336;color:#fff}.subtle-theme .mat-tooltip{background:rgba(97,97,97,.9)}.subtle-theme .mat-snack-bar-container{background:#323232;color:#fff}.subtle-theme .mat-simple-snackbar-action{color:#ccc}@font-face{font-family:Skycoin;font-style:normal;font-weight:300;src:url(Skycoin-Light.770b27ec05c2f97a1a27.woff2) format("woff2"),url(Skycoin-Light.4be01e4a68be8bf590da.woff) format("woff")}@font-face{font-family:Skycoin;font-style:italic;font-weight:300;src:url(Skycoin-LightItalic.d10a437db5d8e2a52b4a.woff2) format("woff2"),url(Skycoin-LightItalic.39e68da05bf8b4a77aa2.woff) format("woff")}@font-face{font-family:Skycoin;font-style:normal;font-weight:400;src:url(Skycoin-Regular.21b4caaaedc00594e7bd.woff2) format("woff2"),url(Skycoin-Regular.98d953e74f174cf013b4.woff) format("woff")}@font-face{font-family:Skycoin;font-style:italic;font-weight:400;src:url(Skycoin-RegularItalic.9eabbc2e01a7e17bb57d.woff2) format("woff2"),url(Skycoin-RegularItalic.9947360f79b09132fd21.woff) format("woff")}@font-face{font-family:Skycoin;font-style:normal;font-weight:700;src:url(Skycoin-Bold.6ccafc6fabc0cc8a971a.woff2) format("woff2"),url(Skycoin-Bold.42363955889f2f20c527.woff) format("woff")}@font-face{font-family:Skycoin;font-style:italic;font-weight:700;src:url(Skycoin-BoldItalic.c414dad20c4e3020221c.woff2) format("woff2"),url(Skycoin-BoldItalic.923dce74069362d168fe.woff) format("woff")}a,body,button,div,h1,h2,h3,h4,h5,h6,mat-option.mat-option,mat-panel-description,mat-panel-title,option,p,select,span{font-family:Skycoin,sans-serif}body{background-color:#f7f7f7;margin:0;padding:0;height:100%}header{background:url(header.e11f7c6852766b9319d6.png) center center/cover,linear-gradient(-155deg,#686e96 0,#373b5c 100%);width:100%;height:300px}mat-dialog-container{border-radius:5px!important}.mat-dialog-container{padding:0!important}.header-container{max-width:848px;text-align:center;padding-top:40px;margin-right:auto;margin-left:auto}.header-container h1{font-size:3em;color:#fff}.button-line{margin-top:40px;text-align:right}.datatable-row-group{cursor:pointer}button.active{background-color:rgba(0,0,0,.12)}mat-spinner.in-button .mat-spinner path{stroke:#000;opacity:.3}mat-spinner.in-button{display:inline-block;margin-left:10px}mat-spinner.in-button.small,mat-spinner.in-button.small svg{height:18px!important;width:18px!important}mat-spinner.in-text{display:inline-block;height:12px!important;width:12px!important;margin:0 0 0 7px!important}mat-spinner.in-text svg{height:12px!important;width:12px!important}mat-spinner.in-text svg circle{stroke:#0072ff}snack-bar-container{background-color:rgba(255,0,0,.8)!important}mat-panel-title{width:60%;display:block;-webkit-box-flex:0!important;-ms-flex-positive:0!important;flex-grow:0!important}.sky-container{min-width:100%;min-height:100%}.sky-container.sky-container-grey{background-color:#f7f7f7}.-flex-fill,.flex-fill{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.form-field{margin-bottom:20px}.form-field label{color:#1e2227;display:block;font-size:13px;line-height:20px;margin-bottom:2px}.form-field input{border:2px solid rgba(0,0,0,.05);border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;display:block;line-height:20px;padding:10px;width:100%}.form-field .-input-addon{display:-webkit-box;display:-ms-flexbox;display:flex}.form-field .-input-addon input{border-top-right-radius:0;border-bottom-right-radius:0}.form-field .-input-addon span{border:2px;border-radius:0 6px 6px 0;background:#f1f1f1;padding:0 10px;line-height:44px;color:rgba(30,34,39,.5);font-size:14px;-ms-flex-negative:0;flex-shrink:0}.form-field select{background-color:#fff;border:2px solid rgba(0,0,0,.05);border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;display:block;line-height:20px;padding:10px;width:100%;-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-field textarea{border:2px solid rgba(0,0,0,.05);border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;display:block;line-height:20px;padding:10px;width:100%}.primary button.enabled,.primary-gradient-background{background:#0072ff;background:-webkit-gradient(linear,left top,right bottom,from(#0072ff),to(#00c3ff));background:linear-gradient(to bottom right,#0072ff,#00c3ff)}.primary button.enabled span,.primary-gradient-background span{color:#fff}.primary-color{color:#0072ff}.secondary-color{color:#ffc125}.no-opacity{opacity:1!important}.light-opacity{opacity:.2}.rotate-90{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);transform:rotate(270deg)}mat-spinner.in-button svg{height:24px!important;width:24px!important}.empty-row{padding:0 1.2rem!important;line-height:50px!important}.alert-box{color:#ff004e;font-size:12px;padding:15px;line-height:1.5;background-color:#ffdede;display:-webkit-box;display:-ms-flexbox;display:flex;margin-bottom:20px}.alert-box .title{font-size:20px}.alert-box mat-icon{margin-top:5px;margin-right:10px;-webkit-animation:1s linear infinite alert-blinking;animation:1s linear infinite alert-blinking}.alert-box mat-checkbox{margin-top:10px;display:inline-block}@-webkit-keyframes alert-blinking{50%{opacity:.2}}@keyframes alert-blinking{50%{opacity:.2}}.onboarding-container{width:100%;height:100%;overflow-x:hidden;background:#0072ff;background:-webkit-gradient(linear,left top,right bottom,from(#0072ff),to(#00c3ff));background:linear-gradient(to bottom right,#0072ff,#00c3ff)}.onboarding-container .row-container{max-width:450px;width:80%;margin:0 auto}.onboarding-container label{color:#fff}.onboarding-container input{border:2px solid rgba(0,0,0,.05);border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;display:block;line-height:20px;padding:10px;width:100%}.onboarding-container select{background-color:#fff;border:2px solid rgba(0,0,0,.05);border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;display:block;line-height:20px;padding:10px;width:100%;-webkit-appearance:none}.onboarding-container textarea{border:2px solid rgba(0,0,0,.05);border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;display:block;line-height:20px;padding:10px;width:100%}.dark button.enabled{background-color:#171a1d!important}.dark button.enabled span{color:#fff}.ghost button.enabled{background-color:rgba(0,0,0,0)!important}.ghost button.enabled span{color:#000}.-select{position:relative}.-select::after{content:'';display:block;position:absolute;top:0;right:0;background:url(/assets/img/chevron-right-grey.png) 0 0/32px 32px no-repeat;width:32px;height:32px;margin:6px;pointer-events:none;-webkit-transform:rotate(90deg);transform:rotate(90deg)}.mat-menu-panel{border-radius:5px!important;background-color:#fefefe}.mat-menu-panel .mat-menu-item{font-family:Skycoin;line-height:50px}.mat-menu-panel.compact .mat-menu-item{font-size:13px;height:35px;line-height:35px}.qr-code-button{opacity:.6;cursor:pointer}.qr-code-button:hover{opacity:1}.mat-dialog-content{max-height:90vh!important}@media (max-height:600px){.mat-dialog-content{max-height:80vh!important}}.mouse-disabled{pointer-events:none}.coin-selector-container{display:inline-block;margin-left:5px;margin-bottom:5px}.coins-value-label{font-size:10px;margin-top:1px;padding:3px 10px;background-color:#f7f7f7;border-radius:4px}.coins-value-label span{opacity:.5}.coins-value-label .link{color:#0072ff;cursor:pointer;display:inline-block;font-size:11px;margin-bottom:3px;margin-top:-5px}.coins-value-label .centerd-link{width:100%;text-align:center}.red{color:#ff004e}.element-disabled{pointer-events:none;opacity:.5} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e-proxy.config.js b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e-proxy.config.js new file mode 100644 index 00000000..2c7ad44c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e-proxy.config.js @@ -0,0 +1,14 @@ +const PROXY_CONFIG = { + "/api/*": { + "target": "http://127.0.0.1:46420", + "secure": false, + "logLevel": "debug", + "bypass": function (req) { + req.headers["host"] = '127.0.0.1:46420'; + req.headers["referer"] = 'http://127.0.0.1:46420'; + req.headers["origin"] = 'http://127.0.0.1:46420'; + } + } +}; + +module.exports = PROXY_CONFIG; diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e/onboarding.e2e-spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e/onboarding.e2e-spec.ts new file mode 100644 index 00000000..b8d63089 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e/onboarding.e2e-spec.ts @@ -0,0 +1,48 @@ +import { OnboardingCreatePage } from './onboarding.po'; + +describe('Onboarding', () => { + const page = new OnboardingCreatePage(); + + it('should display title', () => { + page.navigateTo(); + expect(page.getHeaderText()).toEqual('Create Wallet'); + }); + + it('should select language', () => { + expect(page.selectLanguage()).toEqual(true); + }); + + it('should load wallet', () => { + expect(page.loadWallet()).toEqual(true); + }); + + it('should create wallet', () => { + expect(page.createWallet()).toEqual(true); + }); + + it('should show safeguard', () => { + expect(page.getSafeguardIsShown()).toEqual(true); + }); + + it('should hide accepted safeguard', () => { + expect(page.acceptSafeguard()).toEqual(false); + }); + + it('should be able to go back from wallet encryption', () => { + expect(page.goBack()).toEqual('Create Wallet'); + page.createWallet(false); + page.acceptSafeguard(); + }); + + it('should encrypt wallet by default', () => { + expect(page.getEncryptWalletCheckbox().isSelected()).toBeTruthy(); + }); + + it('should be able to continue without encryption', () => { + expect(page.canContinueWithoutEncryption()).toEqual(true); + }); + + it('should encrypt wallet', () => { + expect(page.encryptWallet()).toEqual(true); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e/onboarding.po.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e/onboarding.po.ts new file mode 100644 index 00000000..016a208c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e/onboarding.po.ts @@ -0,0 +1,126 @@ +import { browser, by, element, protractor } from 'protractor'; + +export class OnboardingCreatePage { + navigateTo() { + return browser.get('/#/wizard'); + } + + getHeaderText() { + return element(by.css('.-header span')).getText(); + } + + selectLanguage() { + browser.sleep(1000); + + return element(by.css('.e2e-language-modal')).isPresent().then(languageSelectionIsShown => { + if (!languageSelectionIsShown) { + return true; + } + + return element.all(by.css('.e2e-language-modal .button')).first().click().then(() => { + const el = element(by.css('.e2e-language-modal')); + + return browser.wait(protractor.ExpectedConditions.invisibilityOf(el), 5000).then(() => true); + }); + }); + } + + getSafeguardIsShown() { + return element(by.css('app-onboarding-safeguard')).isPresent(); + } + + acceptSafeguard() { + return element.all(by.css('app-modal .mat-checkbox-label')).first().click().then(() => { + return element(by.buttonText('Continue')).click().then(() => { + return this.getSafeguardIsShown(); + }); + }); + } + + createWallet(goToManualSeedMode = true) { + element(by.buttonText('New')).click(); + + if (goToManualSeedMode) { + element(by.css('.seed-type-button >div')).click(); + element(by.css('.e2e-confirm-checkbox')).click(); + element(by.buttonText('Continue')).click(); + } + + const label = element(by.css('[formcontrolname="label"]')); + const seed = element(by.css('[formcontrolname="seed"]')); + const confirm = element(by.css('[formcontrolname="confirm_seed"]')); + const btnCreate = element(by.buttonText('Create')); + + label.clear(); + label.sendKeys('Test onboarding wallet'); + seed.clear(); + seed.sendKeys('test test'); + confirm.clear(); + confirm.sendKeys('test test'); + + browser.sleep(1000); + const seedValidationCheckBox = element(by.css('.-check')); + seedValidationCheckBox.click(); + + return btnCreate.isEnabled().then(status => { + if (status) { + btnCreate.click(); + } + + return status; + }); + } + + loadWallet() { + element(by.buttonText('Load')).click(); + + element(by.css('.seed-type-button >div')).click(); + element(by.buttonText('Continue')).click(); + + const label = element(by.css('[formcontrolname="label"]')); + const seed = element(by.css('[formcontrolname="seed"]')); + const btnLoad = element(by.buttonText('Create')); + + label.clear(); + label.sendKeys('Test wallet'); + seed.clear(); + seed.sendKeys('test test'); + + browser.sleep(1000); + const seedValidationCheckBox = element(by.css('.-check')); + seedValidationCheckBox.click(); + + return btnLoad.isEnabled(); + } + + goBack() { + return element(by.buttonText('Back')).click().then(() => { + return this.getHeaderText(); + }); + } + + getEncryptWalletCheckbox() { + return element(by.css('.mat-checkbox-input')); + } + + canContinueWithoutEncryption() { + return element(by.css('.mat-checkbox-label')).click().then(() => { + return element(by.buttonText('Finish')).isEnabled(); + }); + } + + encryptWallet() { + const password = element(by.css('[formcontrolname="password"]')); + const confirm = element(by.css('[formcontrolname="confirm"]')); + const button = element(by.buttonText('Finish')); + + return element(by.css('.mat-checkbox-label')).click().then(() => { + password.clear(); + password.sendKeys('password'); + confirm.clear(); + confirm.sendKeys('password'); + + return button.isEnabled(); + }); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e/send.e2e-spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e/send.e2e-spec.ts new file mode 100644 index 00000000..63f70282 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e/send.e2e-spec.ts @@ -0,0 +1,38 @@ +import { SendPage } from './send.po'; + +describe('Send', () => { + const page = new SendPage(); + + it('should display title', () => { + page.navigateTo(); + expect(page.getHeaderText()).toEqual('Wallets'); + }); + + it('should have wallets', () => { + expect(page.getWalletsCount()).toBeGreaterThan(0); + }); + + it('should have coins in wallets', () => { + expect(page.getWalletsWithCoins().then(w => w.length)).toBeGreaterThan(0); + }); + + it('should have wallets enabled', () => { + expect(page.getValidWallets().then(w => w.length)).toBeGreaterThan(0); + }); + + it('should select valid wallet', () => { + expect(page.selectValidWallet()).toBeTruthy(); + }); + + it('should not be able to send with wrong amount', () => { + expect(page.fillFormWithCoins('615701')).toBeFalsy(); + expect(page.fillFormWithCoins('0')).toBeFalsy(); + expect(page.fillFormWithCoins('-1')).toBeFalsy(); + expect(page.fillFormWithCoins('a')).toBeFalsy(); + }); + + it('should be able to send with correct amount', () => { + expect(page.fillFormWithCoins('615700')).toBeTruthy(); + expect(page.fillFormWithCoins('1')).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e/send.po.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e/send.po.ts new file mode 100644 index 00000000..e1b136df --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e/send.po.ts @@ -0,0 +1,68 @@ +import { browser, by, element } from 'protractor'; + +export class SendPage { + navigateTo() { + return browser.get('/#/send'); + } + + getHeaderText() { + return element(by.css('.title')).getText(); + } + + getWalletsCount() { + return element.all(by.css('#wallet option')).count(); + } + + getWalletsWithCoins() { + return element.all(by.tagName('#wallet option')) + .filter((opt) => { + return opt.getText().then((v) => { + return this.getCoinsFromOptionString(v) > 0; + }); + }); + } + + getValidWallets() { + return element.all(by.tagName('#wallet option')) + .filter((opt) => { + return opt.getText().then((v) => { + return opt.getAttribute('disabled').then(status => { + return status === null && this.getCoinsFromOptionString(v) > 0; + }); + }); + }); + } + + selectValidWallet() { + return this.getValidWallets().then(wallets => { + return wallets[0].click().then(() => { + return true; + }); + }); + } + + fillFormWithCoins(coins: string) { + const dest = element(by.css('[formcontrolname="address"]')); + const amount = element(by.css('[formcontrolname="amount"]')); + const btnSend = element(by.buttonText('Send')); + + dest.clear(); + amount.clear(); + + return dest.sendKeys('2e1erPpaxNVC37PkEv3n8PESNw2DNr5aJNy').then(() => { + return this.getValidWallets().then(wallets => { + return wallets[0].click().then(() => { + return amount.sendKeys(coins).then(() => { + return btnSend.isEnabled(); + }); + }); + }); + }); + } + + private getCoinsFromOptionString(option: string) { + const value = option.slice(option.indexOf('-') + 1, option.indexOf(' SKY')); + + return parseFloat(value); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e/transactions.e2e-spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e/transactions.e2e-spec.ts new file mode 100644 index 00000000..0d146955 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e/transactions.e2e-spec.ts @@ -0,0 +1,22 @@ +import { TransactionsPage } from './transactions.po'; + +describe('Transactions', () => { + const page = new TransactionsPage(); + + it('should display title', () => { + page.navigateTo(); + expect(page.getHeaderText()).toEqual('Transactions'); + }); + + it('should contain transactions', () => { + expect(page.getTransactionsCount()).toBeGreaterThan(0); + }); + + it('should show transaction detail modal', () => { + expect(page.showTransactionsModal()).toBeTruthy(); + }); + + it('should hide transaction detail modal', () => { + expect(page.hideTransactionModal()).toBeFalsy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e/transactions.po.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e/transactions.po.ts new file mode 100644 index 00000000..c0faa277 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e/transactions.po.ts @@ -0,0 +1,37 @@ +import { browser, by, element, protractor } from 'protractor'; + +export class TransactionsPage { + navigateTo() { + return browser.get('/#/transactions'); + } + + getHeaderText() { + return element(by.css('.title')).getText(); + } + + getTransactions() { + return element.all(by.css('.-transaction')); + } + + getTransactionsCount() { + return this.getTransactions().count(); + } + + getTransactionDetailIsShow() { + return element(by.css('app-transaction-detail')).isPresent(); + } + + showTransactionsModal() { + return this.getTransactions().first().click().then(() => { + return this.getTransactionDetailIsShow(); + }); + } + + hideTransactionModal() { + const el = element(by.css('app-transaction-detail .-header img')); + + return browser.wait(protractor.ExpectedConditions.visibilityOf(el), 5000).then(() => el.click().then(() => { + return this.getTransactionDetailIsShow(); + })); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e/tsconfig.e2e.json b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e/tsconfig.e2e.json new file mode 100644 index 00000000..1d9e5edf --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e/tsconfig.e2e.json @@ -0,0 +1,14 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/e2e", + "baseUrl": "./", + "module": "commonjs", + "target": "es5", + "types": [ + "jasmine", + "jasminewd2", + "node" + ] + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e/wallets.e2e-spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e/wallets.e2e-spec.ts new file mode 100644 index 00000000..57e84be3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e/wallets.e2e-spec.ts @@ -0,0 +1,90 @@ +import { WalletsPage } from './wallets.po'; + +describe('Wallets', () => { + const page = new WalletsPage(); + + it('should display title', () => { + page.navigateTo(); + expect(page.getHeaderText()).toEqual('Wallets'); + }); + + it('should show create wallet', () => { + expect(page.showAddWallet()).toEqual(true); + expect(page.getWalletModalTitle()).toEqual('Create Wallet'); + }); + + it('should validate create wallet, seed mismatch', () => { + expect(page.fillWalletForm('Test', 'seed', 'seed2')).toEqual(false); + }); + + it('should validate create wallet, empty label', () => { + expect(page.fillWalletForm('', 'seed', 'seed', false)).toEqual(false); + }); + + it('should create wallet', () => { + expect(page.fillWalletForm('Test create wallet', 'test create wallet', 'test create wallet', false)).toEqual(true); + page.waitForWalletToBeCreated(); + }); + + it('should show load wallet', () => { + expect(page.showLoadWallet()).toEqual(true); + expect(page.getWalletModalTitle()).toEqual('Load Wallet'); + }); + + it('should validate load wallet, seed', () => { + expect(page.fillWalletForm('Test', '', null)).toEqual(false); + }); + + it('should validate load wallet, empty label', () => { + expect(page.fillWalletForm('', 'seed', null, false)).toEqual(false); + }); + + it('should load wallet', () => { + expect(page.fillWalletForm('Test load wallet', 'test load wallet', null, false)).toEqual(true); + page.waitForWalletToBeCreated(); + }); + + it('should expand wallet', () => { + expect(page.expandWallet()).toEqual(true); + }); + + it('should show wallet QR modal', () => { + expect(page.showQrDialog()).toEqual(true); + }); + + it('should hide wallet QR modal', () => { + expect(page.hideQrDialog()).toEqual(false); + }); + + it('should add address to wallet', () => { + expect(page.addAddress()).toEqual(true); + }); + + it('should hide empty address', () => { + expect(page.getCountOfEmptyAddresses('.-hide-empty')).toEqual(0); + }); + + it('should show empty address', () => { + expect(page.getCountOfEmptyAddresses('.-show-empty')).toBeGreaterThan(0); + }); + + it('should show change wallet name modal', () => { + expect(page.showChangeWalletName()).toEqual(true); + }); + + it('should change wallet name', () => { + expect(page.changeWalletName()).toEqual(true); + }); + + it('should encrypt wallet', () => { + expect(page.canEncrypt()).toEqual(true); + }); + + it('should decrypt wallet', () => { + expect(page.canDecrypt()).toEqual(true); + }); + + it('should display price information', () => { + expect(page.showPriceInformation()).toEqual(true); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e/wallets.po.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e/wallets.po.ts new file mode 100644 index 00000000..5d2454cc --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/e2e/wallets.po.ts @@ -0,0 +1,205 @@ +import { browser, by, element, protractor } from 'protractor'; + +export class WalletsPage { + navigateTo() { + return browser.get('/#/wallets'); + } + + getHeaderText() { + return element(by.css('.title')).getText(); + } + + showAddWallet() { + const btnAdd = element(by.buttonText('Add Wallet')); + + return btnAdd.click().then(() => { + return element(by.css('app-create-wallet')).isPresent(); + }); + } + + showLoadWallet() { + const btnLoad = element(by.buttonText('Load Wallet')); + + return btnLoad.click().then(() => { + return element(by.css('app-create-wallet')).isPresent(); + }); + } + + getWalletModalTitle() { + return element(by.css('app-create-wallet .-header')).getText(); + } + + fillWalletForm(label: string, seed: string, confirm: string|null, goToManualSeedMode = true) { + + if (goToManualSeedMode) { + element(by.css('.seed-type-button >div')).click(); + if (confirm !== null) { + element(by.css('.e2e-confirm-checkbox')).click(); + } + element(by.buttonText('Continue')).click(); + } + + const labelEl = element(by.css('[formcontrolname="label"]')); + const seedEl = element(by.css('[formcontrolname="seed"]')); + const btn = element(by.buttonText(confirm ? 'Create' : 'Load')); + const encrypt = element(by.css('.mat-checkbox-label')); + + encrypt.click(); + labelEl.clear(); + seedEl.clear(); + labelEl.sendKeys(label); + seedEl.sendKeys(seed); + + if (confirm) { + const confirmEl = element(by.css('[formcontrolname="confirm_seed"]')); + confirmEl.clear(); + confirmEl.sendKeys(confirm); + } + + if (label !== '' && (seed === confirm || (!confirm && seed !== ''))) { + browser.sleep(1000); + const seedValidationCheckBox = element(by.css('.alert-box .mat-checkbox-inner-container')); + seedValidationCheckBox.click(); + } + + return btn.isEnabled().then(status => { + if (status) { + btn.click(); + } + + return status; + }); + } + + expandWallet() { + return this.getWalletWithName('Test create wallet').click().then(() => { + return element(by.css('app-wallet-detail')).isPresent(); + }); + } + + showQrDialog() { + return browser.sleep(1000).then(() => element(by.css('.qr-code-button')).click().then(() => { + return element(by.css('app-qr-code')).isPresent(); + })); + } + + hideQrDialog() { + return browser.sleep(1000).then(() => element(by.css('app-modal .-header img')).click().then(() => { + return element(by.css('app-qr-code')).isPresent(); + })); + } + + addAddress() { + return element.all(by.css('.-record')).count().then(originalCount => { + return element(by.css('.-new-address')).click().then(() => { + return browser.sleep(2000).then(() => { + return element(by.buttonText('Create')).click().then(() => { + return browser.sleep(2000).then(() => { + return element.all(by.css('.-record')).count().then(newCount => { + return newCount > originalCount; + }); + }); + }); + }); + }); + }); + } + + getCountOfEmptyAddresses(clickSelector: string) { + return element(by.css(clickSelector)).click().then(() => { + return element.all(by.css('.-record > div:nth-child(3)')).filter((address) => { + return address.getText().then(value => { + return value === '0'; + }); + }).count(); + }); + } + + showChangeWalletName() { + return element(by.css('.-edit-wallet')).click().then(() => { + return element(by.css('app-change-name')).isPresent(); + }); + } + + changeWalletName() { + const label = element(by.css('[formcontrolname="label"]')); + const btn = element(by.buttonText('Rename')); + + return label.clear().then(() => { + return label.sendKeys('New Wallet Name').then(() => { + return btn.click().then(() => { + return browser.sleep(1000).then(() => { + return this.getWalletWithName('New Wallet Name').isPresent(); + }); + }); + }); + }); + } + + canEncrypt() { + return element(by.css('.-enable-encryption')).click().then(() => { + const p1 = element(by.css('[formcontrolname="password"]')); + const p2 = element(by.css('[formcontrolname="confirm_password"]')); + const btn = element(by.buttonText('Proceed')); + + p1.sendKeys('password'); + p2.sendKeys('password'); + + return btn.click().then(() => { + return browser.wait( + protractor.ExpectedConditions.stalenessOf(element(by.css('app-password-dialog'))), + 30000, + 'Can not encrypt wallet', + ).then(() => { + return element(by.css('.-disable-encryption')).isPresent(); + }); + }); + }); + } + + canDecrypt() { + return element(by.css('.-disable-encryption')).click().then(() => { + const p1 = element(by.css('[formcontrolname="password"]')); + const btn = element(by.buttonText('Proceed')); + + p1.clear(); + p1.sendKeys('password'); + + return btn.click().then(() => { + return browser.wait( + protractor.ExpectedConditions.stalenessOf(element(by.css('app-password-dialog'))), + 30000, + 'Can not decrypt wallet', + ).then(() => { + return element(by.css('.-enable-encryption')).isPresent(); + }); + }); + }); + } + + showPriceInformation() { + return element(by.css('.balance p.dollars')).getText().then(text => { + return this.checkHeaderPriceFormat(text); + }); + } + + waitForWalletToBeCreated() { + browser.wait( + protractor.ExpectedConditions.stalenessOf(element(by.css('app-create-wallet'))), + 10000, + 'Wallet was not created', + ); + } + + private getWalletWithName(name: string) { + return element.all(by.css('.-wallets.ng-star-inserted')) + .filter(wallet => wallet.element(by.css('.-label')).getText().then(text => text === name)) + .first(); + } + + private checkHeaderPriceFormat(price: string) { + const reg = /^\$[0-9,]+.[0-9]{2}\s\(\$[0-9,]+.[0-9]{2}\)$/; + + return !!price.match(reg); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/karma.conf.js b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/karma.conf.js new file mode 100644 index 00000000..52084afd --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/karma.conf.js @@ -0,0 +1,36 @@ +// Karma configuration file, see link for more information +// https://karma-runner.github.io/0.13/config/configuration-file.html + +module.exports = function (config) { + config.set({ + basePath: '', + frameworks: ['jasmine', '@angular/cli'], + plugins: [ + require('karma-jasmine'), + require('karma-chrome-launcher'), + require('karma-jasmine-html-reporter'), + require('karma-coverage-istanbul-reporter'), + require('@angular/cli/plugins/karma') + ], + files: [ + { pattern: 'test-fixtures/*.json', included: false } + ], + client:{ + clearContext: false // leave Jasmine Spec Runner output visible in browser + }, + coverageIstanbulReporter: { + reports: [ 'html', 'lcovonly' ], + fixWebpackSourcePaths: true + }, + angularCli: { + environment: 'dev' + }, + reporters: ['progress', 'kjhtml'], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['Chrome'], + singleRun: false + }); +}; diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/package-lock.json b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/package-lock.json new file mode 100644 index 00000000..f8418edd --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/package-lock.json @@ -0,0 +1,11535 @@ +{ + "name": "desktopwallet", + "version": "0.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@angular-devkit/build-optimizer": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.3.2.tgz", + "integrity": "sha512-U0BCZtThq5rUfY08shHXpxe8ZhSsiYB/cJjUvAWRTs/ORrs8pbngS6xwseQws8d/vHoVrtqGD9GU9h8AmFRERQ==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "source-map": "^0.5.6", + "typescript": "~2.6.2", + "webpack-sources": "^1.0.1" + }, + "dependencies": { + "typescript": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.2.tgz", + "integrity": "sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q=", + "dev": true + } + } + }, + "@angular-devkit/core": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-0.3.2.tgz", + "integrity": "sha512-zABk/iP7YX5SVbmK4e+IX7j2d0D37MQJQiKgWdV3JzfvVJhNJzddiirtT980pIafoq+KyvTgVwXtc+vnux0oeQ==", + "dev": true, + "requires": { + "ajv": "~5.5.1", + "chokidar": "^1.7.0", + "rxjs": "^5.5.6", + "source-map": "^0.5.6" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + } + } + }, + "@angular-devkit/schematics": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-0.3.2.tgz", + "integrity": "sha512-B6zZoqvHaTJy+vVdA6EtlxnCdGMa5elCa4j9lQLC3JI8DLvMXUWkCIPVbPzJ/GSRR9nsKWpvYMYaJyfBDUqfhw==", + "dev": true, + "requires": { + "@ngtools/json-schema": "^1.1.0", + "rxjs": "^5.5.6" + } + }, + "@angular/animations": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-5.2.0.tgz", + "integrity": "sha512-JLR42YHiJppO4ruAkFxgbzghUDtHkXHkKPM8udd2qyt16T7e1OX7EEOrrmldUu59CC56tZnJ/32p4SrYmxyBSA==", + "requires": { + "tslib": "^1.7.1" + } + }, + "@angular/cdk": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-5.2.5.tgz", + "integrity": "sha512-GN8m1d+VcCE9+Bgwv06Y8YJKyZ0i9ZIq2ZPBcJYt+KVgnVVRg4JkyUNxud07LNsvzOX22DquHqmIZiC4hAG7Ag==", + "requires": { + "tslib": "^1.7.1" + } + }, + "@angular/cli": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-1.7.3.tgz", + "integrity": "sha512-19sh0SbjneG7/R/FvZBfHsHqfIqyj4LQuXdddJKMCDM97UoHQTjfgrpRvBf3a3lR79wdLXchWJBD9Yc6ifosEA==", + "dev": true, + "requires": { + "@angular-devkit/build-optimizer": "0.3.2", + "@angular-devkit/core": "0.3.2", + "@angular-devkit/schematics": "0.3.2", + "@ngtools/json-schema": "1.2.0", + "@ngtools/webpack": "1.10.2", + "@schematics/angular": "0.3.2", + "@schematics/package-update": "0.3.2", + "ajv": "^6.1.1", + "autoprefixer": "^7.2.3", + "cache-loader": "^1.2.0", + "chalk": "~2.2.0", + "circular-dependency-plugin": "^4.2.1", + "clean-css": "^4.1.11", + "common-tags": "^1.3.1", + "copy-webpack-plugin": "~4.4.1", + "core-object": "^3.1.0", + "denodeify": "^1.2.1", + "ember-cli-string-utils": "^1.0.0", + "extract-text-webpack-plugin": "^3.0.2", + "file-loader": "^1.1.5", + "fs-extra": "^4.0.0", + "glob": "^7.0.3", + "html-webpack-plugin": "^2.29.0", + "istanbul-instrumenter-loader": "^3.0.0", + "karma-source-map-support": "^1.2.0", + "less": "^2.7.2", + "less-loader": "^4.0.5", + "license-webpack-plugin": "^1.0.0", + "loader-utils": "1.1.0", + "lodash": "^4.11.1", + "memory-fs": "^0.4.1", + "minimatch": "^3.0.4", + "node-modules-path": "^1.0.0", + "node-sass": "^4.7.2", + "nopt": "^4.0.1", + "opn": "~5.1.0", + "portfinder": "~1.0.12", + "postcss": "^6.0.16", + "postcss-import": "^11.0.0", + "postcss-loader": "^2.0.10", + "postcss-url": "^7.1.2", + "raw-loader": "^0.5.1", + "resolve": "^1.1.7", + "rxjs": "^5.5.6", + "sass-loader": "^6.0.6", + "semver": "^5.1.0", + "silent-error": "^1.0.0", + "source-map-support": "^0.4.1", + "style-loader": "^0.19.1", + "stylus": "^0.54.5", + "stylus-loader": "^3.0.1", + "uglifyjs-webpack-plugin": "^1.1.8", + "url-loader": "^0.6.2", + "webpack": "~3.11.0", + "webpack-dev-middleware": "~1.12.0", + "webpack-dev-server": "~2.11.0", + "webpack-merge": "^4.1.0", + "webpack-sources": "^1.0.0", + "webpack-subresource-integrity": "^1.0.1" + } + }, + "@angular/common": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-5.2.0.tgz", + "integrity": "sha512-yMFn2isC7/XOs56/2Kzzbb1AASHiwipAPOVFtKe7TdZQClO8fJXwCnk326rzr615+CG0eSBNQWeiFGyWN2riBA==", + "requires": { + "tslib": "^1.7.1" + } + }, + "@angular/compiler": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-5.2.0.tgz", + "integrity": "sha512-RfYa4ESgjGX0T0ob/Xz00IF7nd2xZkoyRy6oKgL82q42uzB3xZUDMrFNgeGxAUs3H22IkL46/5SSPOMOTMZ0NA==", + "requires": { + "tslib": "^1.7.1" + } + }, + "@angular/compiler-cli": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-5.2.0.tgz", + "integrity": "sha512-+Kef4NjuHwLj2hRPdVo4yAtPmv+kn0Nu/ShmKfaEK4mt9aaQMFxKNt6beUuDK5iUPMB5nuTCZ4bqEFpqd+EtxQ==", + "dev": true, + "requires": { + "chokidar": "^1.4.2", + "minimist": "^1.2.0", + "reflect-metadata": "^0.1.2", + "tsickle": "^0.26.0" + } + }, + "@angular/core": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-5.2.0.tgz", + "integrity": "sha512-s2ne45DguNUubhC1YgybGECC4Tyx3G4EZCntUiRMDWWkmKXSK+6dgHMesyDo8R5Oat8VfN4Anf8l3JHS1He8kg==", + "requires": { + "tslib": "^1.7.1" + } + }, + "@angular/forms": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-5.2.0.tgz", + "integrity": "sha512-g1/SF9lY0ZwzJ0w4NXbFsTGGEuUdgtaZny8DmkaqtmA7idby3FW398X0tv25KQfVYKtL+p9Jp1Y8EI0CvrIsvw==", + "requires": { + "tslib": "^1.7.1" + } + }, + "@angular/http": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@angular/http/-/http-5.2.0.tgz", + "integrity": "sha512-V5Cl24dP3rCXTTQvDc0TIKoWqBRAa0DWAQbtr7iuDAt5a1vPGdKz5K1sEiiV6ziwX6gzjiwHjUvL+B+WbIUrQA==", + "requires": { + "tslib": "^1.7.1" + } + }, + "@angular/language-service": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-5.2.0.tgz", + "integrity": "sha512-Yj/y5XrBBXbtwnZ6HJOBl/0XS/JBvVlHb1UWw5MIrsc81k7/eFiRAIKzmGpAba+Sw0G0dO22ABZ4yJjAMsML6A==", + "dev": true + }, + "@angular/material": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-5.2.5.tgz", + "integrity": "sha512-IltfBeTJWnmZehOQNQ7KoFs7MGWuZTe0g21hIitGkusVNt1cIoTD24xKH5jwztjH19c04IgiwonpurMKM6pBCQ==", + "requires": { + "tslib": "^1.7.1" + } + }, + "@angular/platform-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-5.2.0.tgz", + "integrity": "sha512-c6cR15MfopPwGZ097HdRuAi9+R9BhA3bRRFpP2HmrSSB/BW4ZNovUYwB2QUMSYbd9s0lYTtnavqGm6DKcyF2QA==", + "requires": { + "tslib": "^1.7.1" + } + }, + "@angular/platform-browser-dynamic": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-5.2.0.tgz", + "integrity": "sha512-xG1eNoi8sm4Jcly2y98r5mqYVe3XV8sUJCtOhvGBYtvt4dKEQ5tOns6fWQ0nUbl6Vv3Y0xgGUS1JCtfut3DuaQ==", + "requires": { + "tslib": "^1.7.1" + } + }, + "@angular/router": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-5.2.0.tgz", + "integrity": "sha512-VXDXtp2A1GQEUEhXg0ZzqHdTUERLgDSo3/Mmpzt+dgLMKlXDSCykcm4gINwE5VQLGD1zQvDFCCRv3seGRNfrqA==", + "requires": { + "tslib": "^1.7.1" + } + }, + "@ngtools/json-schema": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ngtools/json-schema/-/json-schema-1.2.0.tgz", + "integrity": "sha512-pMh+HDc6mOjUO3agRfB1tInimo7hf67u+0Cska2bfXFe6oU7rSMnr5PLVtiZVgwMoBHpx/6XjBymvcnWPo2Uzg==", + "dev": true + }, + "@ngtools/webpack": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-1.10.2.tgz", + "integrity": "sha512-3u2zg2rarG3qNLSukBClGADWuq/iNn5SQtlSeAbfKzwBeyLGbF0gN1z1tVx1Bcr8YwFzR6NdRePQmJGcoqq1fg==", + "dev": true, + "requires": { + "chalk": "~2.2.0", + "enhanced-resolve": "^3.1.0", + "loader-utils": "^1.0.2", + "magic-string": "^0.22.3", + "semver": "^5.3.0", + "source-map": "^0.5.6", + "tree-kill": "^1.0.0", + "webpack-sources": "^1.1.0" + } + }, + "@ngx-translate/core": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@ngx-translate/core/-/core-9.1.1.tgz", + "integrity": "sha1-rhA5KINrip4Gn9Li52+iGYzH5ig=" + }, + "@schematics/angular": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-0.3.2.tgz", + "integrity": "sha512-Elrk0BA951s0ScFZU0AWrpUeJBYVR52DZ1QTIO5R0AhwEd1PW4olI8szPLGQlVW5Sd6H0FA/fyFLIvn2r9v6Rw==", + "dev": true, + "requires": { + "typescript": "~2.6.2" + }, + "dependencies": { + "typescript": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.2.tgz", + "integrity": "sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q=", + "dev": true + } + } + }, + "@schematics/package-update": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@schematics/package-update/-/package-update-0.3.2.tgz", + "integrity": "sha512-7aVP4994Hu8vRdTTohXkfGWEwLhrdNP3EZnWyBootm5zshWqlQojUGweZe5zwewsKcixeVOiy2YtW+aI4aGSLA==", + "dev": true, + "requires": { + "rxjs": "^5.5.6", + "semver": "^5.3.0", + "semver-intersect": "^1.1.2" + } + }, + "@types/jasmine": { + "version": "2.5.54", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-2.5.54.tgz", + "integrity": "sha512-B9YofFbUljs19g5gBKUYeLIulsh31U5AK70F41BImQRHEZQGm4GcN922UvnYwkduMqbC/NH+9fruWa/zrqvHIg==", + "dev": true + }, + "@types/jasminewd2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.3.tgz", + "integrity": "sha512-hYDVmQZT5VA2kigd4H4bv7vl/OhlympwREUemqBdOqtrYTo5Ytm12a5W5/nGgGYdanGVxj0x/VhZ7J3hOg/YKg==", + "dev": true, + "requires": { + "@types/jasmine": "*" + } + }, + "@types/node": { + "version": "6.0.96", + "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.96.tgz", + "integrity": "sha512-fsOOY6tMQ3jCB2wD51XFDmmpgm4wVKkJECdcVRqapbJEa7awJDcr+SaH8toz+4r4KW8YQ3M7ybXMoSDo1QGewA==", + "dev": true + }, + "@types/q": { + "version": "0.0.32", + "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", + "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=", + "dev": true + }, + "@types/selenium-webdriver": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.16.tgz", + "integrity": "sha512-lMC2G0ItF2xv4UCiwbJGbnJlIuUixHrioOhNGHSCsYCJ8l4t9hMCUimCytvFv7qy6AfSzRxhRHoGa+UqaqwyeA==", + "dev": true + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "accepts": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "dev": true, + "requires": { + "mime-types": "~2.1.18", + "negotiator": "0.6.1" + }, + "dependencies": { + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "dev": true + }, + "mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "dev": true, + "requires": { + "mime-db": "~1.33.0" + } + } + } + }, + "acorn": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.1.tgz", + "integrity": "sha512-D/KGiCpM/VOtTMDS+wfjywEth926WUrArrzYov4N4SI7t+3y8747dPpCmmAvrm/Z3ygqMHnyPxvYYO0yTdn/nQ==", + "dev": true + }, + "acorn-dynamic-import": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", + "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", + "dev": true, + "requires": { + "acorn": "^4.0.3" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true + } + } + }, + "adm-zip": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.13.tgz", + "integrity": "sha512-fERNJX8sOXfel6qCBCMPvZLzENBEhZTzKqg6vrOW5pvoEaQuJhRU4ndTAh6lHOxn1I6jnz2NHra56ZODM751uw==", + "dev": true + }, + "after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", + "dev": true + }, + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "ajv": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.2.1.tgz", + "integrity": "sha1-KKarxJOiq+D7TIUHrK7bQ/pVBnE=", + "dev": true, + "requires": { + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "ajv-keywords": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.1.0.tgz", + "integrity": "sha1-rCsnk5xUPpXSwG5/f1wnvkqlQ74=", + "dev": true + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "requires": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "dev": true, + "requires": { + "micromatch": "^2.1.5", + "normalize-path": "^2.0.0" + } + }, + "app-root-path": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.0.1.tgz", + "integrity": "sha1-zWLc+OT9WkF+/GZNLlsQZTxlG0Y=", + "dev": true + }, + "append-transform": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", + "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", + "dev": true, + "requires": { + "default-require-extensions": "^1.0.0" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "argparse": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", + "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" + }, + "array-flatten": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz", + "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=", + "dev": true + }, + "array-includes": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", + "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.7.0" + } + }, + "array-slice": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", + "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "arraybuffer.slice": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", + "integrity": "sha1-8zshWfBTKj8xB6JywMz70a0peco=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "dev": true, + "optional": true + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "dev": true, + "requires": { + "util": "0.10.3" + } + }, + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "dev": true, + "optional": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "async": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", + "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", + "dev": true, + "requires": { + "lodash": "^4.14.0" + } + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "dev": true + }, + "async-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "atob": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.0.3.tgz", + "integrity": "sha1-GcenYEc3dEaPILLS0DNyrX1Mv10=", + "dev": true + }, + "autoprefixer": { + "version": "7.2.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.2.6.tgz", + "integrity": "sha512-Iq8TRIB+/9eQ8rbGhcP7ct5cYb/3qjNYAR2SnzLCEcwF6rvVOax8+9+fccgXk4bEhQGjOZd5TLhsksmAdsbGqQ==", + "dev": true, + "requires": { + "browserslist": "^2.11.3", + "caniuse-lite": "^1.0.30000805", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^6.0.17", + "postcss-value-parser": "^3.2.3" + } + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "dev": true, + "optional": true + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "dev": true, + "optional": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "babel-generator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz", + "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", + "dev": true, + "requires": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.6", + "trim-right": "^1.0.1" + }, + "dependencies": { + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + } + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "base-x": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.5.tgz", + "integrity": "sha512-C3picSgzPSLE+jW3tcBzJoGwitOtazb5B+5YmAxZm2ybmTi9LNgAtDO/jjVEBZwHoXmDBZ9m/IELj3elJVRBcA==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", + "dev": true + }, + "base64-js": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.3.tgz", + "integrity": "sha512-MsAhsUW1GxCdgYSO6tAfZrNapmUKk7mWx/k5mFY/A1gBtkaCaNapTg+FExCw1r9yeaZhqx/xPg43xgTFH6KL5w==", + "dev": true + }, + "base64id": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", + "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "optional": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "dev": true, + "requires": { + "callsite": "1.0.0" + } + }, + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true + }, + "bignumber.js": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", + "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==" + }, + "binary-extensions": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", + "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", + "dev": true + }, + "blob": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", + "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=", + "dev": true + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "requires": { + "inherits": "~2.0.0" + } + }, + "blocking-proxy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-1.0.1.tgz", + "integrity": "sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", + "dev": true + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + }, + "body-parser": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "dev": true, + "requires": { + "bytes": "3.0.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.1", + "http-errors": "~1.6.2", + "iconv-lite": "0.4.19", + "on-finished": "~2.3.0", + "qs": "6.5.1", + "raw-body": "2.3.2", + "type-is": "~1.6.15" + }, + "dependencies": { + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", + "dev": true + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "dev": true, + "requires": { + "hoek": "2.x.x" + } + }, + "bootstrap": { + "version": "4.0.0-beta.3", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.0.0-beta.3.tgz", + "integrity": "sha512-/Qe1Q2d1muLEZRX2iCteMQHZBBAm6ZIjJ9FcBYK/xLr05+HvDtBOVBN+Cz7mCNZuy0zr+y5artZHM05W7mIz6g==" + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browserify-aes": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz", + "integrity": "sha512-UGnTYAnB2a3YuYKIRy1/4FB2HdM866E0qC46JXvVTYKlBlZlnvfpSfY6OKfXZAkv70eJ2a1SqzpAo5CRhZGDFg==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", + "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", + "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "2.11.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.3.tgz", + "integrity": "sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000792", + "electron-to-chromium": "^1.3.30" + } + }, + "browserstack": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.5.3.tgz", + "integrity": "sha512-AO+mECXsW4QcqC9bxwM29O7qWa7bJT94uBFzeb5brylIQwawuEziwq20dPYbins95GlWzOawgyDNdjYAo32EKg==", + "dev": true, + "requires": { + "https-proxy-agent": "^2.2.1" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "cacache": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", + "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", + "dev": true, + "requires": { + "bluebird": "^3.5.1", + "chownr": "^1.0.1", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "lru-cache": "^4.1.1", + "mississippi": "^2.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^5.2.4", + "unique-filename": "^1.1.0", + "y18n": "^4.0.0" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "cache-loader": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cache-loader/-/cache-loader-1.2.2.tgz", + "integrity": "sha512-rsGh4SIYyB9glU+d0OcHwiXHXBoUgDhHZaQ1KAbiXqfz1CDPxtTboh1gPbJ0q2qdO8a9lfcjgC5CJ2Ms32y5bw==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "mkdirp": "^0.5.1", + "neo-async": "^2.5.0", + "schema-utils": "^0.4.2" + } + }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", + "dev": true + }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "dev": true, + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + } + }, + "caniuse-lite": { + "version": "1.0.30000813", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000813.tgz", + "integrity": "sha512-A8ITSmH5SFdMFdC704ggjg+x2z5PzQmVlG8tavwnfvbC33Q1UYrj0+G+Xm0SNAnd4He36fwUE/KEWytOEchw+A==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "requires": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + }, + "dependencies": { + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true + } + } + }, + "chalk": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.2.2.tgz", + "integrity": "sha512-LvixLAQ4MYhbf7hgL4o5PeK32gJKvVzDRiSNIApDofQvyhl8adgG2lJVXn4+ekQoK7HL9RF8lqxwerpe0x2pCw==", + "dev": true, + "requires": { + "ansi-styles": "^3.1.0", + "escape-string-regexp": "^1.0.5", + "supports-color": "^4.0.0" + } + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "dev": true, + "requires": { + "anymatch": "^1.3.0", + "async-each": "^1.0.0", + "fsevents": "^1.0.0", + "glob-parent": "^2.0.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^2.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0" + } + }, + "chownr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", + "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", + "dev": true + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "circular-dependency-plugin": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-4.4.0.tgz", + "integrity": "sha512-yEFtUNUYT4jBykEX5ZOHw+5goA3glGZr9wAXIQqoyakjz5H5TeUmScnWRc52douAhb9eYzK3s7V6bXfNnjFdzg==", + "dev": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "clean-css": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.11.tgz", + "integrity": "sha1-Ls3xRaujj1R0DybO/Q/z4D4SXWo=", + "dev": true, + "requires": { + "source-map": "0.5.x" + } + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "clone": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", + "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=", + "dev": true + }, + "clone-deep": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-2.0.2.tgz", + "integrity": "sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ==", + "dev": true, + "requires": { + "for-own": "^1.0.0", + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.0", + "shallow-clone": "^1.0.0" + }, + "dependencies": { + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "codelyzer": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-4.0.2.tgz", + "integrity": "sha512-nYwOr49+IV09e7C4aXkVALRz0+XpHqZiUUcxHuDZH4xP1FBcHINyr3qvVhv5Gfm7XRmoLx32tsIhrQhW/gBcog==", + "dev": true, + "requires": { + "app-root-path": "^2.0.1", + "css-selector-tokenizer": "^0.7.0", + "cssauron": "^1.4.0", + "semver-dsl": "^1.0.1", + "source-map": "^0.5.6", + "sprintf-js": "^1.0.3" + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", + "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "dev": true, + "requires": { + "color-name": "^1.1.1" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + }, + "combine-lists": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/combine-lists/-/combine-lists-1.0.1.tgz", + "integrity": "sha1-RYwH4J4NkA/Ci3Cj/sLazR0st/Y=", + "dev": true, + "requires": { + "lodash": "^4.5.0" + } + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.12.2.tgz", + "integrity": "sha512-BFnaq5ZOGcDN7FlrtBT4xxkgIToalIIxwjxLWVJ8bGTpe1LroqMiqQXdA7ygc7CRvaYS+9zfPGFnJqFSayx+AA==", + "dev": true + }, + "common-tags": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.7.2.tgz", + "integrity": "sha512-joj9ZlUOjCrwdbmiLqafeUSgkUM74NqhLsZtSqDmhKudaIY197zTrb8JMl31fMnCUuxwFT23eC/oWvrZzDLRJQ==", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0" + } + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", + "dev": true + }, + "component-emitter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", + "integrity": "sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM=", + "dev": true + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", + "dev": true + }, + "compressible": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.13.tgz", + "integrity": "sha1-DRAgq5JLL9tNYnmHXH1tq6a6p6k=", + "dev": true, + "requires": { + "mime-db": ">= 1.33.0 < 2" + }, + "dependencies": { + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "dev": true + } + } + }, + "compression": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.2.tgz", + "integrity": "sha1-qv+81qr4VLROuygDU9WtFlH1mmk=", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "bytes": "3.0.0", + "compressible": "~2.0.13", + "debug": "2.6.9", + "on-headers": "~1.0.1", + "safe-buffer": "5.1.1", + "vary": "~1.1.2" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-gslSSJx03QKa59cIKqeJO9HQ/WZMotvYJCuaUULrLpjj8oG40kV2Z+gz82pVxlTkOADi4PJxQPPfhl1ELYrrXw==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "connect": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.5.tgz", + "integrity": "sha1-+43ee6B2OHfQ7J352sC0tA5yx9o=", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.0.6", + "parseurl": "~1.3.2", + "utils-merge": "1.0.1" + }, + "dependencies": { + "finalhandler": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.6.tgz", + "integrity": "sha1-AHrqM9Gk0+QgF/YkhIrVjSEvgU8=", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.3.1", + "unpipe": "~1.0.0" + } + } + } + }, + "connect-history-api-fallback": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", + "integrity": "sha1-sGhzk0vF40T+9hGhlqb6rgruAVo=", + "dev": true + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "^0.1.4" + } + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", + "dev": true + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "convert-source-map": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", + "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", + "dev": true + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "copy-webpack-plugin": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.4.3.tgz", + "integrity": "sha512-v4THQ24Tks2NkyOvZuFDgZVfDD9YaA9rwYLZTrWg2GHIA8lrH5DboEyeoorh5Skki+PUbgSmnsCwhMWqYrQZrA==", + "dev": true, + "requires": { + "cacache": "^10.0.1", + "find-cache-dir": "^1.0.0", + "globby": "^7.1.1", + "is-glob": "^4.0.0", + "loader-utils": "^1.1.0", + "minimatch": "^3.0.4", + "p-limit": "^1.0.0", + "serialize-javascript": "^1.4.0" + }, + "dependencies": { + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + } + } + }, + "core-js": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", + "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=" + }, + "core-object": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/core-object/-/core-object-3.1.5.tgz", + "integrity": "sha512-sA2/4+/PZ/KV6CKgjrVrrUVBKCkdDO02CUlQ0YKTQoYUwPYNOtOAcWlbYhd5v/1JqYaA6oZ4sDlOU4ppVw6Wbg==", + "dev": true, + "requires": { + "chalk": "^2.0.0" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cosmiconfig": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", + "integrity": "sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==", + "dev": true, + "requires": { + "is-directory": "^0.3.1", + "js-yaml": "^3.4.3", + "minimist": "^1.2.0", + "object-assign": "^4.1.0", + "os-homedir": "^1.0.1", + "parse-json": "^2.2.0", + "require-from-string": "^1.1.0" + } + }, + "create-ecdh": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", + "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", + "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", + "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", + "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", + "requires": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "dev": true, + "optional": true, + "requires": { + "boom": "2.x.x" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "css-parse": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.7.0.tgz", + "integrity": "sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs=", + "dev": true + }, + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dev": true, + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "css-selector-tokenizer": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz", + "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=", + "dev": true, + "requires": { + "cssesc": "^0.1.0", + "fastparse": "^1.1.1", + "regexpu-core": "^1.0.0" + } + }, + "css-what": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", + "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=", + "dev": true + }, + "cssauron": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz", + "integrity": "sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg=", + "dev": true, + "requires": { + "through": "X.X.X" + } + }, + "cssesc": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", + "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", + "dev": true + }, + "cuint": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", + "integrity": "sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs=", + "dev": true + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "requires": { + "array-find-index": "^1.0.1" + } + }, + "custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", + "dev": true + }, + "cyclist": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", + "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", + "dev": true + }, + "d": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "dev": true, + "requires": { + "es5-ext": "^0.10.9" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", + "dev": true + }, + "default-require-extensions": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", + "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", + "dev": true, + "requires": { + "strip-bom": "^2.0.0" + } + }, + "define-properties": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", + "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "dev": true, + "requires": { + "foreach": "^2.0.5", + "object-keys": "^1.0.8" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "del": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", + "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", + "dev": true, + "requires": { + "globby": "^6.1.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "p-map": "^1.1.1", + "pify": "^3.0.0", + "rimraf": "^2.2.8" + }, + "dependencies": { + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "denodeify": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", + "integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE=", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "detect-node": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.3.tgz", + "integrity": "sha1-ogM8CcyOFY03dI+951B4Mr1s4Sc=", + "dev": true + }, + "di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", + "dev": true + }, + "diff": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.4.0.tgz", + "integrity": "sha512-QpVuMTEoJMF7cKzi6bvWhRulU1fZqZnvyVQgNhPaxxuTYwyjn/j1v9falseQ/uXWwPnO56RBfwtg4h/EQXmucA==", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", + "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "dir-glob": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", + "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "path-type": "^3.0.0" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "dns-packet": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "dev": true, + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "dom-converter": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.1.4.tgz", + "integrity": "sha1-pF71cnuJDJv/5tfIduexnLDhfzs=", + "dev": true, + "requires": { + "utila": "~0.3" + }, + "dependencies": { + "utila": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", + "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=", + "dev": true + } + } + }, + "dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", + "dev": true, + "requires": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "dom-serializer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", + "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "dev": true, + "requires": { + "domelementtype": "~1.1.1", + "entities": "~1.1.1" + }, + "dependencies": { + "domelementtype": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", + "dev": true + } + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "domelementtype": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", + "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", + "dev": true + }, + "domhandler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz", + "integrity": "sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "duplexify": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.4.tgz", + "integrity": "sha512-JzYSLYMhoVVBe8+mbHQ4KgpvHpm0DZpJuL8PY93Vyv1fW7jYJ90LoXa1di/CVbJM+TgMs91rbDapE/RNIfnJsA==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "optional": true, + "requires": { + "jsbn": "~0.1.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "ejs": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.7.tgz", + "integrity": "sha1-zIcsFoiArjxxiXYv1f/ACJbJUYo=", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.36", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.36.tgz", + "integrity": "sha1-Dqv3Gp6+qQE/scw1o5DgaGJPJ+g=", + "dev": true + }, + "elliptic": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", + "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "ember-cli-string-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ember-cli-string-utils/-/ember-cli-string-utils-1.1.0.tgz", + "integrity": "sha1-ObZ3/CgF9VFzc1N2/O8njqpEUqE=", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "encodeurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", + "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=", + "dev": true + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "engine.io": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-1.8.3.tgz", + "integrity": "sha1-jef5eJXSDTm4X4ju7nd7K9QrE9Q=", + "dev": true, + "requires": { + "accepts": "1.3.3", + "base64id": "1.0.0", + "cookie": "0.3.1", + "debug": "2.3.3", + "engine.io-parser": "1.3.2", + "ws": "1.1.2" + }, + "dependencies": { + "accepts": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", + "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=", + "dev": true, + "requires": { + "mime-types": "~2.1.11", + "negotiator": "0.6.1" + } + }, + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + } + } + }, + "engine.io-client": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.8.3.tgz", + "integrity": "sha1-F5jtk0USRkU9TG9jXXogH+lA1as=", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "2.3.3", + "engine.io-parser": "1.3.2", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parsejson": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "1.1.2", + "xmlhttprequest-ssl": "1.5.3", + "yeast": "0.1.2" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + } + } + }, + "engine.io-parser": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.3.2.tgz", + "integrity": "sha1-k3sHnwAH0Ik+xW1GyyILjLQ1Igo=", + "dev": true, + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "0.0.6", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.4", + "has-binary": "0.1.7", + "wtf-8": "1.0.0" + } + }, + "enhanced-resolve": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", + "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "object-assign": "^4.0.1", + "tapable": "^0.2.7" + } + }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "dev": true + }, + "entities": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", + "dev": true + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.10.0.tgz", + "integrity": "sha512-/uh/DhdqIOSkAWifU+8nG78vlQxdLckUdI/sPgy0VhuXi2qJ7T8czBmqIYtLQVpCIFYafChnsRsB5pyb1JdmCQ==", + "dev": true, + "requires": { + "es-to-primitive": "^1.1.1", + "function-bind": "^1.1.1", + "has": "^1.0.1", + "is-callable": "^1.1.3", + "is-regex": "^1.0.4" + } + }, + "es-to-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", + "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "dev": true, + "requires": { + "is-callable": "^1.1.1", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.1" + } + }, + "es5-ext": { + "version": "0.10.39", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.39.tgz", + "integrity": "sha512-AlaXZhPHl0po/uxMx1tyrlt1O86M6D5iVaDH8UgLfgek4kXTX6vzsRfJQWC2Ku+aG8pkw1XWzh9eTkwfVrsD5g==", + "dev": true, + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.1" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-set": "~0.1.5", + "es6-symbol": "~3.1.1", + "event-emitter": "~0.3.5" + } + }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "dev": true + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "dev": true, + "requires": { + "es6-promise": "^4.0.3" + } + }, + "es6-set": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-symbol": "3.1.1", + "event-emitter": "~0.3.5" + } + }, + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "es6-weak-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", + "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.14", + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "escope": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "dev": true, + "requires": { + "es6-map": "^0.1.3", + "es6-weak-map": "^2.0.1", + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "eventemitter3": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", + "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=", + "dev": true + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "dev": true + }, + "eventsource": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", + "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", + "dev": true, + "requires": { + "original": ">=0.0.5" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + } + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expand-braces": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/expand-braces/-/expand-braces-0.1.2.tgz", + "integrity": "sha1-SIsdHSRRyz06axks/AMPRMWFX+o=", + "dev": true, + "requires": { + "array-slice": "^0.2.3", + "array-unique": "^0.2.1", + "braces": "^0.1.2" + }, + "dependencies": { + "braces": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-0.1.5.tgz", + "integrity": "sha1-wIVxEIUpHYt1/ddOqw+FlygHEeY=", + "dev": true, + "requires": { + "expand-range": "^0.1.0" + } + }, + "expand-range": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-0.1.1.tgz", + "integrity": "sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ=", + "dev": true, + "requires": { + "is-number": "^0.1.1", + "repeat-string": "^0.2.2" + } + }, + "is-number": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-0.1.1.tgz", + "integrity": "sha1-aaevEWlj1HIG7JvZtIoUIW8eOAY=", + "dev": true + }, + "repeat-string": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-0.2.2.tgz", + "integrity": "sha1-x6jTI2BoNiBZp+RlH8aITosftK4=", + "dev": true + } + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "^2.1.0" + } + }, + "express": { + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.2.tgz", + "integrity": "sha1-41xt/i1kt9ygpc1PIXgb4ymeB2w=", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "array-flatten": "1.1.1", + "body-parser": "1.18.2", + "content-disposition": "0.5.2", + "content-type": "~1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.1", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.1.0", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.2", + "qs": "6.5.1", + "range-parser": "~1.2.0", + "safe-buffer": "5.1.1", + "send": "0.16.1", + "serve-static": "1.13.1", + "setprototypeof": "1.1.0", + "statuses": "~1.3.1", + "type-is": "~1.6.15", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", + "dev": true + } + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "extract-text-webpack-plugin": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz", + "integrity": "sha512-bt/LZ4m5Rqt/Crl2HiKuAl/oqg0psx1tsTLkvWbJen1CtD+fftkZhMaQ9HOtY2gWsl2Wq+sABmMVi9z3DhKWQQ==", + "dev": true, + "requires": { + "async": "^2.4.1", + "loader-utils": "^1.1.0", + "schema-utils": "^0.3.0", + "webpack-sources": "^1.0.1" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "schema-utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", + "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "dev": true, + "requires": { + "ajv": "^5.0.0" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "fastparse": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", + "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=", + "dev": true + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "file-loader": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.11.tgz", + "integrity": "sha512-TGR4HU7HUsGg6GCOPJnFk06RhWgEWFLAGWiT6rcD+GRC2keU3s9RGJ+b3Z6/U73jwwNb2gKLJ7YCrp+jvU4ALg==", + "dev": true, + "requires": { + "loader-utils": "^1.0.2", + "schema-utils": "^0.4.5" + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fileset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", + "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "dev": true, + "requires": { + "glob": "^7.0.3", + "minimatch": "^3.0.3" + } + }, + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "dev": true, + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^1.1.3", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + } + }, + "finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.3.1", + "unpipe": "~1.0.0" + } + }, + "find-cache-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^2.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "flush-write-stream": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.2.tgz", + "integrity": "sha1-yBuQ2HRnZvGmCaRoCZRsRd2K5Bc=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.4" + } + }, + "font-awesome": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz", + "integrity": "sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM=" + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "dev": true, + "optional": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-access": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", + "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", + "dev": true, + "requires": { + "null-check": "^1.0.0" + } + }, + "fs-extra": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz", + "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.3.0", + "node-pre-gyp": "^0.6.39" + }, + "dependencies": { + "abbrev": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "ajv": { + "version": "4.11.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "asn1": { + "version": "0.2.3", + "bundled": true, + "dev": true, + "optional": true + }, + "assert-plus": { + "version": "0.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "bundled": true, + "dev": true, + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "aws4": { + "version": "1.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "balanced-match": { + "version": "0.4.2", + "bundled": true, + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "block-stream": { + "version": "0.0.9", + "bundled": true, + "dev": true, + "requires": { + "inherits": "~2.0.0" + } + }, + "boom": { + "version": "2.10.1", + "bundled": true, + "dev": true, + "requires": { + "hoek": "2.x.x" + } + }, + "brace-expansion": { + "version": "1.1.7", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^0.4.1", + "concat-map": "0.0.1" + } + }, + "buffer-shims": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "caseless": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true + }, + "co": { + "version": "4.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "cryptiles": { + "version": "2.0.5", + "bundled": true, + "dev": true, + "requires": { + "boom": "2.x.x" + } + }, + "dashdash": { + "version": "1.14.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "^1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "debug": { + "version": "2.6.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.4.2", + "bundled": true, + "dev": true, + "optional": true + }, + "delayed-stream": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsbn": "~0.1.0" + } + }, + "extend": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "extsprintf": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "bundled": true, + "dev": true, + "optional": true + }, + "form-data": { + "version": "2.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "fstream": { + "version": "1.0.11", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, + "fstream-ignore": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fstream": "^1.0.0", + "inherits": "2", + "minimatch": "^3.0.0" + } + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "getpass": { + "version": "0.1.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "^1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.11", + "bundled": true, + "dev": true + }, + "har-schema": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "har-validator": { + "version": "4.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ajv": "^4.9.1", + "har-schema": "^1.0.5" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "hawk": { + "version": "3.1.3", + "bundled": true, + "dev": true, + "requires": { + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" + } + }, + "hoek": { + "version": "2.16.3", + "bundled": true, + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "^0.2.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.4", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "isstream": { + "version": "0.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "jodid25519": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsbn": "~0.1.0" + } + }, + "jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "bundled": true, + "dev": true, + "optional": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsonify": "~0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "jsonify": { + "version": "0.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "jsprim": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.0.2", + "json-schema": "0.2.3", + "verror": "1.3.6" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "mime-db": { + "version": "1.27.0", + "bundled": true, + "dev": true + }, + "mime-types": { + "version": "2.1.15", + "bundled": true, + "dev": true, + "requires": { + "mime-db": "~1.27.0" + } + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "node-pre-gyp": { + "version": "0.6.39", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "hawk": "3.1.3", + "mkdirp": "^0.5.1", + "nopt": "^4.0.1", + "npmlog": "^4.0.2", + "rc": "^1.1.7", + "request": "2.81.0", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^2.2.1", + "tar-pack": "^3.4.0" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npmlog": { + "version": "4.1.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "performance-now": { + "version": "0.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "1.0.7", + "bundled": true, + "dev": true + }, + "punycode": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true + }, + "qs": { + "version": "6.4.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "~0.4.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.2.9", + "bundled": true, + "dev": true, + "requires": { + "buffer-shims": "~1.0.0", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~1.0.0", + "util-deprecate": "~1.0.1" + } + }, + "request": { + "version": "2.81.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aws-sign2": "~0.6.0", + "aws4": "^1.2.1", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~2.1.1", + "har-validator": "~4.2.1", + "hawk": "~3.1.3", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "oauth-sign": "~0.8.1", + "performance-now": "^0.2.0", + "qs": "~6.4.0", + "safe-buffer": "^5.0.1", + "stringstream": "~0.0.4", + "tough-cookie": "~2.3.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.0.0" + } + }, + "rimraf": { + "version": "2.6.1", + "bundled": true, + "dev": true, + "requires": { + "glob": "^7.0.5" + } + }, + "safe-buffer": { + "version": "5.0.1", + "bundled": true, + "dev": true + }, + "semver": { + "version": "5.3.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sntp": { + "version": "1.0.9", + "bundled": true, + "dev": true, + "requires": { + "hoek": "2.x.x" + } + }, + "sshpk": { + "version": "1.13.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jodid25519": "^1.0.0", + "jsbn": "~0.1.0", + "tweetnacl": "~0.14.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "stringstream": { + "version": "0.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "2.2.1", + "bundled": true, + "dev": true, + "requires": { + "block-stream": "*", + "fstream": "^1.0.2", + "inherits": "2" + } + }, + "tar-pack": { + "version": "3.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^2.2.0", + "fstream": "^1.0.10", + "fstream-ignore": "^1.0.5", + "once": "^1.3.3", + "readable-stream": "^2.1.4", + "rimraf": "^2.5.1", + "tar": "^2.2.1", + "uid-number": "^0.0.6" + } + }, + "tough-cookie": { + "version": "2.3.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "punycode": "^1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "bundled": true, + "dev": true, + "optional": true + }, + "uid-number": { + "version": "0.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "uuid": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "verror": { + "version": "1.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "extsprintf": "1.0.2" + } + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + } + } + }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "requires": { + "globule": "^1.0.0" + } + }, + "get-caller-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=" + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "^2.0.0" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + } + }, + "globule": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz", + "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==", + "requires": { + "glob": "~7.1.1", + "lodash": "~4.17.10", + "minimatch": "~3.0.2" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + } + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, + "hammerjs": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz", + "integrity": "sha1-BO93hiz/K7edMPdpIJWTAiK/YPE=" + }, + "handle-thing": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz", + "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=", + "dev": true + }, + "handlebars": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", + "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", + "dev": true, + "requires": { + "async": "^1.4.0", + "optimist": "^0.6.1", + "source-map": "^0.4.4", + "uglify-js": "^2.6" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true, + "optional": true + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "optional": true, + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + } + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true, + "optional": true, + "requires": { + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "optional": true + } + } + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "optional": true, + "requires": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + } + } + } + }, + "har-schema": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", + "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", + "dev": true, + "optional": true + }, + "har-validator": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", + "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", + "dev": true, + "optional": true, + "requires": { + "ajv": "^4.9.1", + "har-schema": "^1.0.5" + }, + "dependencies": { + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true, + "optional": true, + "requires": { + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" + } + } + } + }, + "has": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "dev": true, + "requires": { + "function-bind": "^1.0.2" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-binary": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz", + "integrity": "sha1-aOYesWIQyVRaClzOBqhzkS/h5ow=", + "dev": true, + "requires": { + "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + } + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", + "dev": true + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", + "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", + "dev": true, + "requires": { + "inherits": "^2.0.1" + } + }, + "hash.js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" + } + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "dev": true, + "optional": true, + "requires": { + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" + } + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "dev": true + }, + "homedir-polyfill": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", + "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hosted-git-info": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", + "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==" + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "dev": true + }, + "html-minifier": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.10.tgz", + "integrity": "sha512-5c8iAyeIGAiuFhVjJ0qy1lgvyQxxuZgjeOuMnoK/wjEyy8DF3xKUnE9pO+6H7VMir976K6SGlZV8ZEmIOea/Zg==", + "dev": true, + "requires": { + "camel-case": "3.0.x", + "clean-css": "4.1.x", + "commander": "2.14.x", + "he": "1.1.x", + "ncname": "1.0.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.3.x" + }, + "dependencies": { + "commander": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz", + "integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw==", + "dev": true + } + } + }, + "html-webpack-plugin": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-2.30.1.tgz", + "integrity": "sha1-f5xCG36pHsRg9WUn1430hO51N9U=", + "dev": true, + "requires": { + "bluebird": "^3.4.7", + "html-minifier": "^3.2.3", + "loader-utils": "^0.2.16", + "lodash": "^4.17.3", + "pretty-error": "^2.0.2", + "toposort": "^1.0.0" + }, + "dependencies": { + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + } + } + }, + "htmlparser2": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz", + "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=", + "dev": true, + "requires": { + "domelementtype": "1", + "domhandler": "2.1", + "domutils": "1.1", + "readable-stream": "1.0" + }, + "dependencies": { + "domutils": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz", + "integrity": "sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU=", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "dev": true, + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": ">= 1.3.1 < 2" + }, + "dependencies": { + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", + "dev": true + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", + "dev": true + } + } + }, + "http-parser-js": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", + "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=", + "dev": true + }, + "http-proxy": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.16.2.tgz", + "integrity": "sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I=", + "dev": true, + "requires": { + "eventemitter3": "1.x.x", + "requires-port": "1.x.x" + } + }, + "http-proxy-middleware": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz", + "integrity": "sha1-ZC6ISIUdZvCdTxJJEoRtuutBuDM=", + "dev": true, + "requires": { + "http-proxy": "^1.16.2", + "is-glob": "^3.1.0", + "lodash": "^4.17.2", + "micromatch": "^2.3.11" + }, + "dependencies": { + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "^0.2.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "https-proxy-agent": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", + "dev": true, + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", + "dev": true + }, + "ieee754": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", + "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "ignore": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", + "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", + "dev": true + }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "dev": true, + "optional": true + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", + "dev": true + }, + "import-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", + "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", + "dev": true, + "requires": { + "pkg-dir": "^2.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "in-publish": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", + "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=" + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "requires": { + "repeating": "^2.0.0" + } + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "internal-ip": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-1.2.0.tgz", + "integrity": "sha1-rp+/k7mEh4eF1QqN4bNWlWBYz1w=", + "dev": true, + "requires": { + "meow": "^3.3.0" + } + }, + "interpret": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", + "dev": true + }, + "invariant": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", + "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "ipaddr.js": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", + "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "requires": { + "builtin-modules": "^1.0.0" + } + }, + "is-callable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", + "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", + "dev": true + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "^2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-odd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", + "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", + "dev": true, + "requires": { + "is-number": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", + "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "dev": true, + "requires": { + "is-path-inside": "^1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-symbol": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", + "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isbinaryfile": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.2.tgz", + "integrity": "sha1-Sj6XTsDLqQBNP8bN5yCeppNopiE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "istanbul-api": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.2.1.tgz", + "integrity": "sha512-oFCwXvd65amgaPCzqrR+a2XjanS1MvpXN6l/MlMUTv6uiA1NOgGX+I0uyq8Lg3GDxsxPsaP1049krz3hIJ5+KA==", + "dev": true, + "requires": { + "async": "^2.1.4", + "fileset": "^2.0.2", + "istanbul-lib-coverage": "^1.1.1", + "istanbul-lib-hook": "^1.1.0", + "istanbul-lib-instrument": "^1.9.1", + "istanbul-lib-report": "^1.1.2", + "istanbul-lib-source-maps": "^1.2.2", + "istanbul-reports": "^1.1.3", + "js-yaml": "^3.7.0", + "mkdirp": "^0.5.1", + "once": "^1.4.0" + } + }, + "istanbul-instrumenter-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-3.0.0.tgz", + "integrity": "sha512-alLSEFX06ApU75sm5oWcaVNaiss/bgMRiWTct3g0P0ZZTKjR+6QiCcuVOKDI1kWJgwHEnIXsv/dWm783kPpmtw==", + "dev": true, + "requires": { + "convert-source-map": "^1.5.0", + "istanbul-lib-instrument": "^1.7.3", + "loader-utils": "^1.1.0", + "schema-utils": "^0.3.0" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "schema-utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", + "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "dev": true, + "requires": { + "ajv": "^5.0.0" + } + } + } + }, + "istanbul-lib-coverage": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz", + "integrity": "sha512-0+1vDkmzxqJIn5rcoEqapSB4DmPxE31EtI2dF2aCkV5esN9EWHxZ0dwgDClivMXJqE7zaYQxq30hj5L0nlTN5Q==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.1.0.tgz", + "integrity": "sha512-U3qEgwVDUerZ0bt8cfl3dSP3S6opBoOtk3ROO5f2EfBr/SRiD9FQqzwaZBqFORu8W7O0EXpai+k7kxHK13beRg==", + "dev": true, + "requires": { + "append-transform": "^0.4.0" + } + }, + "istanbul-lib-instrument": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.9.1.tgz", + "integrity": "sha512-RQmXeQ7sphar7k7O1wTNzVczF9igKpaeGQAG9qR2L+BS4DCJNTI9nytRmIVYevwO0bbq+2CXvJmYDuz0gMrywA==", + "dev": true, + "requires": { + "babel-generator": "^6.18.0", + "babel-template": "^6.16.0", + "babel-traverse": "^6.18.0", + "babel-types": "^6.18.0", + "babylon": "^6.18.0", + "istanbul-lib-coverage": "^1.1.1", + "semver": "^5.3.0" + } + }, + "istanbul-lib-report": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.2.tgz", + "integrity": "sha512-UTv4VGx+HZivJQwAo1wnRwe1KTvFpfi/NYwN7DcsrdzMXwpRT/Yb6r4SBPoHWj4VuQPakR32g4PUUeyKkdDkBA==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^1.1.1", + "mkdirp": "^0.5.1", + "path-parse": "^1.0.5", + "supports-color": "^3.1.2" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.2.tgz", + "integrity": "sha512-8BfdqSfEdtip7/wo1RnrvLpHVEd8zMZEDmOFEnpC6dg0vXflHt9nvoAyQUzig2uMSXfF2OBEYBV3CVjIL9JvaQ==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "istanbul-lib-coverage": "^1.1.1", + "mkdirp": "^0.5.1", + "rimraf": "^2.6.1", + "source-map": "^0.5.3" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "istanbul-reports": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.1.3.tgz", + "integrity": "sha512-ZEelkHh8hrZNI5xDaKwPMFwDsUf5wIEI2bXAFGp1e6deR2mnEKBPhLJEgr4ZBt8Gi6Mj38E/C8kcy9XLggVO2Q==", + "dev": true, + "requires": { + "handlebars": "^4.0.3" + } + }, + "jasmine": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz", + "integrity": "sha1-awicChFXax8W3xG4AUbZHU6Lij4=", + "dev": true, + "requires": { + "exit": "^0.1.2", + "glob": "^7.0.6", + "jasmine-core": "~2.8.0" + }, + "dependencies": { + "jasmine-core": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz", + "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=", + "dev": true + } + } + }, + "jasmine-core": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.6.4.tgz", + "integrity": "sha1-3skmzQqfoof7bbXHVfpIfnTOysU=", + "dev": true + }, + "jasmine-spec-reporter": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-4.1.1.tgz", + "integrity": "sha1-Wm1Yq11hvqcwn7wnkjlRF1axtYg=", + "dev": true, + "requires": { + "colors": "1.1.2" + } + }, + "jasminewd2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz", + "integrity": "sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4=", + "dev": true + }, + "js-base64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz", + "integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==" + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "js-yaml": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", + "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^2.6.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "optional": true + }, + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + }, + "json-loader": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", + "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "optional": true, + "requires": { + "jsonify": "~0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true, + "optional": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "jszip": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.2.2.tgz", + "integrity": "sha512-NmKajvAFQpbg3taXQXr/ccS2wcucR1AZ+NtyWp2Nq7HHVsXhcJFR8p0Baf32C2yVvBylFWVeKf+WI2AnvlPhpA==", + "dev": true, + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "set-immediate-shim": "~1.0.1" + }, + "dependencies": { + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "karma": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/karma/-/karma-1.7.1.tgz", + "integrity": "sha512-k5pBjHDhmkdaUccnC7gE3mBzZjcxyxYsYVaqiL2G5AqlfLyBO5nw2VdNK+O16cveEPd/gIOWULH7gkiYYwVNHg==", + "dev": true, + "requires": { + "bluebird": "^3.3.0", + "body-parser": "^1.16.1", + "chokidar": "^1.4.1", + "colors": "^1.1.0", + "combine-lists": "^1.0.0", + "connect": "^3.6.0", + "core-js": "^2.2.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.0", + "expand-braces": "^0.1.1", + "glob": "^7.1.1", + "graceful-fs": "^4.1.2", + "http-proxy": "^1.13.0", + "isbinaryfile": "^3.0.0", + "lodash": "^3.8.0", + "log4js": "^0.6.31", + "mime": "^1.3.4", + "minimatch": "^3.0.2", + "optimist": "^0.6.1", + "qjobs": "^1.1.4", + "range-parser": "^1.2.0", + "rimraf": "^2.6.0", + "safe-buffer": "^5.0.1", + "socket.io": "1.7.3", + "source-map": "^0.5.3", + "tmp": "0.0.31", + "useragent": "^2.1.12" + }, + "dependencies": { + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "dev": true + } + } + }, + "karma-chrome-launcher": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.1.1.tgz", + "integrity": "sha1-IWh5xorATY1RQOmWGboEtZr9Rs8=", + "dev": true, + "requires": { + "fs-access": "^1.0.0", + "which": "^1.2.1" + } + }, + "karma-cli": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/karma-cli/-/karma-cli-1.0.1.tgz", + "integrity": "sha1-rmw8WKMTodALRRZMRVubhs4X+WA=", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "karma-coverage-istanbul-reporter": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-1.3.3.tgz", + "integrity": "sha512-MFkB6bh11J8nKygUdqyHb9sMz17XoBRYR4tiNxnSpi/UtDk0wk8eRGa0jRSJaILgCl4xyq1TL6Jidww1OWly/Q==", + "dev": true, + "requires": { + "istanbul-api": "^1.1.14", + "minimatch": "^3.0.4" + } + }, + "karma-jasmine": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-1.1.1.tgz", + "integrity": "sha1-b+hA51oRYAydkehLM8RY4cRqNSk=", + "dev": true + }, + "karma-jasmine-html-reporter": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-0.2.2.tgz", + "integrity": "sha1-SKjl7xiAdhfuK14zwRlMNbQ5Ukw=", + "dev": true, + "requires": { + "karma-jasmine": "^1.0.2" + } + }, + "karma-read-json": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/karma-read-json/-/karma-read-json-1.1.0.tgz", + "integrity": "sha1-4M40XFrmOKNqWgXcGmoELczaseQ=", + "dev": true + }, + "karma-source-map-support": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.2.0.tgz", + "integrity": "sha1-G/gee7SwiWJ6s1LsQXnhF8QGpUA=", + "dev": true, + "requires": { + "source-map-support": "^0.4.1" + } + }, + "killable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.0.tgz", + "integrity": "sha1-2ouEvUfeU5WHj5XWTQLyRJ/gXms=", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "dev": true, + "requires": { + "set-getter": "^0.1.0" + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "^1.0.0" + } + }, + "less": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/less/-/less-2.7.3.tgz", + "integrity": "sha512-KPdIJKWcEAb02TuJtaLrhue0krtRLoRoo7x6BNJIBelO00t/CCdJQUnHW5V34OnHMWzIktSalJxRO+FvytQlCQ==", + "dev": true, + "requires": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "mime": "^1.2.11", + "mkdirp": "^0.5.0", + "promise": "^7.1.1", + "request": "2.81.0", + "source-map": "^0.5.3" + } + }, + "less-loader": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-4.0.6.tgz", + "integrity": "sha512-WPFY3NMJGJna8kIxtgSu6AVG7K6uRPdfE2J7vpQqFWMN/RkOosV09rOVUt3wghNClWH2Pg7YumD1dHiv1Thfug==", + "dev": true, + "requires": { + "clone": "^2.1.1", + "loader-utils": "^1.1.0", + "pify": "^3.0.0" + } + }, + "license-webpack-plugin": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-1.2.3.tgz", + "integrity": "sha512-+sie46vNe5L48N94LEzEvreJqAdi+N3x3mXUx+iujuAmftWdJUh68RSDPgWK3DRJuu50dwiyH7MdVAx95zfKQA==", + "dev": true, + "requires": { + "ejs": "^2.5.7" + } + }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "requires": { + "immediate": "~3.0.5" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + } + } + }, + "loader-runner": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", + "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=", + "dev": true + }, + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "lodash.tail": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz", + "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=", + "dev": true + }, + "log4js": { + "version": "0.6.38", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-0.6.38.tgz", + "integrity": "sha1-LElBFmldb7JUgJQ9P8hy5mKlIv0=", + "dev": true, + "requires": { + "readable-stream": "~1.0.2", + "semver": "~4.3.3" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "semver": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "loglevel": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.1.tgz", + "integrity": "sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=", + "dev": true + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, + "loose-envify": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "dev": true, + "requires": { + "js-tokens": "^3.0.0" + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", + "dev": true + }, + "lru-cache": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "magic-string": { + "version": "0.22.4", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.4.tgz", + "integrity": "sha512-kxBL06p6iO2qPBHsqGK2b3cRwiRGpnmSuVWNhwHcMX7qJOUr1HvricYP1LZOCdkQBUp0jiWg2d6WJwR3vYgByw==", + "dev": true, + "requires": { + "vlq": "^0.2.1" + } + }, + "make-dir": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.2.0.tgz", + "integrity": "sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "make-error": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.2.tgz", + "integrity": "sha512-l9ra35l5VWLF24y75Tg8XgfGLX0ueRhph118WKM6H5denx4bB5QF59+4UAm9oJ2qsPQZas/CQUDdtDdfvYHBdQ==", + "dev": true + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "md5.js": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", + "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + }, + "dependencies": { + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + } + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "mime-db": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=", + "dev": true + }, + "mime-types": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "dev": true, + "requires": { + "mime-db": "~1.30.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", + "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "mississippi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", + "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^2.0.1", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mixin-object": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", + "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", + "dev": true, + "requires": { + "for-in": "^0.1.3", + "is-extendable": "^0.1.1" + }, + "dependencies": { + "for-in": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", + "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=", + "dev": true + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + } + } + }, + "moment": { + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.21.0.tgz", + "integrity": "sha512-TCZ36BjURTeFTM/CwRcViQlfkMvL1/vFISuNLO5GkcVm1+QHfbSiNqZuWeMFjj1/3+uAjXswgRk30j1kkLYJBQ==" + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "nan": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.8.0.tgz", + "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", + "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-odd": "^2.0.0", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "ncname": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ncname/-/ncname-1.0.0.tgz", + "integrity": "sha1-W1etGLHKCShk72Kwse2BlPODtxw=", + "dev": true, + "requires": { + "xml-char-classes": "^1.0.0" + } + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", + "dev": true + }, + "neo-async": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.5.0.tgz", + "integrity": "sha512-nJmSswG4As/MkRq7QZFuH/sf/yuv8ODdMZrY4Bedjp77a5MK4A6s7YbBB64c9u79EBUOfXUXBvArmvzTD0X+6g==", + "dev": true + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "requires": { + "lower-case": "^1.1.1" + } + }, + "node-forge": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.1.tgz", + "integrity": "sha1-naYR6giYL0uUIGs760zJZl8gwwA=", + "dev": true + }, + "node-gyp": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", + "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", + "requires": { + "fstream": "^1.0.0", + "glob": "^7.0.3", + "graceful-fs": "^4.1.2", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1 || 2 || 3 || 4", + "osenv": "0", + "request": "^2.87.0", + "rimraf": "2", + "semver": "~5.3.0", + "tar": "^2.0.0", + "which": "1" + }, + "dependencies": { + "ajv": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "mime-db": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" + }, + "mime-types": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "requires": { + "mime-db": "1.40.0" + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "requires": { + "abbrev": "1" + } + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" + }, + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + } + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + } + } + }, + "node-libs-browser": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", + "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^1.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.0", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.10.3", + "vm-browserify": "0.0.4" + } + }, + "node-modules-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/node-modules-path/-/node-modules-path-1.0.1.tgz", + "integrity": "sha1-QAlrCM560OoUaAhjr0ScfHWl0cg=", + "dev": true + }, + "node-sass": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.12.0.tgz", + "integrity": "sha512-A1Iv4oN+Iel6EPv77/HddXErL2a+gZ4uBeZUy+a8O35CFYTXhgA8MgLCWBtwpGZdCvTvQ9d+bQxX/QC36GDPpQ==", + "requires": { + "async-foreach": "^0.1.3", + "chalk": "^1.1.1", + "cross-spawn": "^3.0.0", + "gaze": "^1.0.0", + "get-stdin": "^4.0.1", + "glob": "^7.0.3", + "in-publish": "^2.0.0", + "lodash": "^4.17.11", + "meow": "^3.7.0", + "mkdirp": "^0.5.1", + "nan": "^2.13.2", + "node-gyp": "^3.8.0", + "npmlog": "^4.0.0", + "request": "^2.88.0", + "sass-graph": "^2.2.4", + "stdout-stream": "^1.4.0", + "true-case-path": "^1.0.2" + }, + "dependencies": { + "ajv": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, + "mime-db": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" + }, + "mime-types": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "requires": { + "mime-db": "1.40.0" + } + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + } + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + } + } + }, + "nopt": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "dev": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "requires": { + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "nth-check": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", + "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", + "dev": true, + "requires": { + "boolbase": "~1.0.0" + } + }, + "null-check": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", + "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=", + "dev": true + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + } + } + }, + "object-keys": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", + "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "obuf": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.1.tgz", + "integrity": "sha1-EEEktsYCxnlogaBCVB0220OlJk4=", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "opn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.1.0.tgz", + "integrity": "sha512-iPNl7SyM8L30Rm1sjGdLLheyHVw5YXVfi3SKWJzBI7efxRwHojfRFjwE/OLM6qp9xJYMgab8WicTU1cPoY+Hpg==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", + "dev": true + } + } + }, + "options": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", + "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=", + "dev": true + }, + "original": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.0.tgz", + "integrity": "sha1-kUf5P6FpbQS+YeAb1QuurKZWvTs=", + "dev": true, + "requires": { + "url-parse": "1.0.x" + }, + "dependencies": { + "url-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.0.5.tgz", + "integrity": "sha1-CFSGBCKv3P7+tsllxmLUgAFpkns=", + "dev": true, + "requires": { + "querystringify": "0.0.x", + "requires-port": "1.0.x" + } + } + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "requires": { + "lcid": "^1.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", + "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-map": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "dev": true + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "pako": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", + "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", + "dev": true + }, + "parallel-transform": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", + "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", + "dev": true, + "requires": { + "cyclist": "~0.2.2", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "dev": true, + "requires": { + "no-case": "^2.2.0" + } + }, + "parse-asn1": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", + "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", + "dev": true, + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "parsejson": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.3.tgz", + "integrity": "sha1-q343WfIJ7OmUN5c/fQ8fZK4OZKs=", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pbkdf2": { + "version": "3.0.14", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", + "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "performance-now": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", + "dev": true, + "optional": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + }, + "portfinder": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.13.tgz", + "integrity": "sha1-uzLs2HwnEErm7kS1o8y/Drsa7ek=", + "dev": true, + "requires": { + "async": "^1.5.2", + "debug": "^2.2.0", + "mkdirp": "0.5.x" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "6.0.19", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.19.tgz", + "integrity": "sha512-f13HRz0HtVwVaEuW6J6cOUCBLFtymhgyLPV7t4QEk2UD3twRI9IluDcQNdzQdBpiixkXj2OmzejhhTbSbDxNTg==", + "dev": true, + "requires": { + "chalk": "^2.3.1", + "source-map": "^0.6.1", + "supports-color": "^5.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-import": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-11.1.0.tgz", + "integrity": "sha512-5l327iI75POonjxkXgdRCUS+AlzAdBx4pOvMEhTKTCjb1p8IEeVR9yx3cPbmN7LIWJLbfnIXxAhoB4jpD0c/Cw==", + "dev": true, + "requires": { + "postcss": "^6.0.1", + "postcss-value-parser": "^3.2.3", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + } + }, + "postcss-load-config": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-1.2.0.tgz", + "integrity": "sha1-U56a/J3chiASHr+djDZz4M5Q0oo=", + "dev": true, + "requires": { + "cosmiconfig": "^2.1.0", + "object-assign": "^4.1.0", + "postcss-load-options": "^1.2.0", + "postcss-load-plugins": "^2.3.0" + } + }, + "postcss-load-options": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-load-options/-/postcss-load-options-1.2.0.tgz", + "integrity": "sha1-sJixVZ3awt8EvAuzdfmaXP4rbYw=", + "dev": true, + "requires": { + "cosmiconfig": "^2.1.0", + "object-assign": "^4.1.0" + } + }, + "postcss-load-plugins": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz", + "integrity": "sha1-dFdoEWWZrKLwCfrUJrABdQSdjZI=", + "dev": true, + "requires": { + "cosmiconfig": "^2.1.1", + "object-assign": "^4.1.0" + } + }, + "postcss-loader": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.1.1.tgz", + "integrity": "sha512-f0J/DWE/hyO9/LH0WHpXkny/ZZ238sSaG3p1SRBtVZnFWUtD7GXIEgHoBg8cnAeRbmEvUxHQptY46zWfwNYj/w==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "postcss": "^6.0.0", + "postcss-load-config": "^1.2.0", + "schema-utils": "^0.4.0" + } + }, + "postcss-url": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/postcss-url/-/postcss-url-7.3.1.tgz", + "integrity": "sha512-Ya5KIjGptgz0OtrVYfi2UbLxVAZ6Emc4Of+Grx4Sf1deWlRpFwLr8FrtkUxfqh+XiZIVkXbjQrddE10ESpNmdA==", + "dev": true, + "requires": { + "mime": "^1.4.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.0", + "postcss": "^6.0.1", + "xxhashjs": "^0.2.1" + } + }, + "postcss-value-parser": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", + "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "pretty-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", + "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", + "dev": true, + "requires": { + "renderkid": "^2.0.1", + "utila": "~0.4" + } + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, + "optional": true, + "requires": { + "asap": "~2.0.3" + } + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "protractor": { + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.4.2.tgz", + "integrity": "sha512-zlIj64Cr6IOWP7RwxVeD8O4UskLYPoyIcg0HboWJL9T79F1F0VWtKkGTr/9GN6BKL+/Q/GmM7C9kFVCfDbP5sA==", + "dev": true, + "requires": { + "@types/q": "^0.0.32", + "@types/selenium-webdriver": "^3.0.0", + "blocking-proxy": "^1.0.0", + "browserstack": "^1.5.1", + "chalk": "^1.1.3", + "glob": "^7.0.3", + "jasmine": "2.8.0", + "jasminewd2": "^2.1.0", + "optimist": "~0.6.0", + "q": "1.4.1", + "saucelabs": "^1.5.0", + "selenium-webdriver": "3.6.0", + "source-map-support": "~0.4.0", + "webdriver-js-extender": "2.1.0", + "webdriver-manager": "^12.0.6" + }, + "dependencies": { + "ajv": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "requires": { + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "mime-db": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", + "dev": true + }, + "mime-types": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "dev": true, + "requires": { + "mime-db": "1.40.0" + } + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + } + }, + "uuid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", + "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==", + "dev": true + }, + "webdriver-manager": { + "version": "12.1.7", + "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.7.tgz", + "integrity": "sha512-XINj6b8CYuUYC93SG3xPkxlyUc3IJbD6Vvo75CVGuG9uzsefDzWQrhz0Lq8vbPxtb4d63CZdYophF8k8Or/YiA==", + "dev": true, + "requires": { + "adm-zip": "^0.4.9", + "chalk": "^1.1.1", + "del": "^2.2.0", + "glob": "^7.0.3", + "ini": "^1.3.4", + "minimist": "^1.2.0", + "q": "^1.4.1", + "request": "^2.87.0", + "rimraf": "^2.5.2", + "semver": "^5.3.0", + "xml2js": "^0.4.17" + } + } + } + }, + "proxy-addr": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", + "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.6.0" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "psl": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.3.0.tgz", + "integrity": "sha512-avHdspHO+9rQTLbv1RO+MPYeP/SzsCoxofjVnHanETfQhTJrmB0HlDoW+EiN/R+C0BZ+gERab9NY0lPN2TxNag==" + }, + "public-encrypt": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", + "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.4.0.tgz", + "integrity": "sha512-2kmNR9ry+Pf45opRVirpNuIFotsxUGLaYqxIwuR77AYrYRMuFCz9eryHBS52L360O+NcR383CL4QYlMKPq4zYA==", + "dev": true, + "requires": { + "duplexify": "^3.5.3", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "q": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", + "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", + "dev": true + }, + "qjobs": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.1.5.tgz", + "integrity": "sha1-ZZ3p8s+NzCehSBJ28gU3cnI4LnM=", + "dev": true + }, + "qs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", + "dev": true, + "optional": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "querystringify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-0.0.4.tgz", + "integrity": "sha1-DPf4T5Rj/wrlHExLFC2VvjdyTZw=", + "dev": true + }, + "randomatic": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "randombytes": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", + "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", + "dev": true + }, + "raw-body": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "dev": true, + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "unpipe": "1.0.0" + } + }, + "raw-loader": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz", + "integrity": "sha1-DD0L6u2KAclm2Xh793goElKpeao=", + "dev": true + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "dev": true, + "requires": { + "pify": "^2.3.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "dependencies": { + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + } + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "^2.0.0" + } + } + } + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.0.3", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "minimatch": "^3.0.2", + "readable-stream": "^2.0.2", + "set-immediate-shim": "^1.0.1" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "reflect-metadata": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.10.tgz", + "integrity": "sha1-tPg3BEFqytiZiMmxVjXUfgO5NEo=", + "dev": true + }, + "regenerate": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", + "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "^0.1.3" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexpu-core": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", + "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", + "dev": true, + "requires": { + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "dev": true + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "renderkid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.1.tgz", + "integrity": "sha1-iYyr/Ivt5Le5ETWj/9Mj5YwNsxk=", + "dev": true, + "requires": { + "css-select": "^1.1.0", + "dom-converter": "~0.1", + "htmlparser2": "~3.3.0", + "strip-ansi": "^3.0.0", + "utila": "~0.3" + }, + "dependencies": { + "utila": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", + "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=", + "dev": true + } + } + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "requires": { + "is-finite": "^1.0.0" + } + }, + "request": { + "version": "2.81.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", + "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", + "dev": true, + "optional": true, + "requires": { + "aws-sign2": "~0.6.0", + "aws4": "^1.2.1", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~2.1.1", + "har-validator": "~4.2.1", + "hawk": "~3.1.3", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "oauth-sign": "~0.8.1", + "performance-now": "^0.2.0", + "qs": "~6.4.0", + "safe-buffer": "^5.0.1", + "stringstream": "~0.0.4", + "tough-cookie": "~2.3.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.0.0" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-from-string": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", + "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", + "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", + "dev": true, + "requires": { + "path-parse": "^1.0.5" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "requires": { + "align-text": "^0.1.1" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "requires": { + "glob": "^7.0.5" + } + }, + "ripemd160": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", + "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", + "dev": true, + "requires": { + "hash-base": "^2.0.0", + "inherits": "^2.0.1" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "rxjs": { + "version": "5.5.6", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.6.tgz", + "integrity": "sha512-v4Q5HDC0FHAQ7zcBX7T2IL6O5ltl1a2GX4ENjPXg6SjDY69Cmx9v4113C99a4wGF16ClPv5Z8mghuYorVkg/kg==", + "requires": { + "symbol-observable": "1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "sass-graph": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", + "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", + "requires": { + "glob": "^7.0.0", + "lodash": "^4.0.0", + "scss-tokenizer": "^0.2.3", + "yargs": "^7.0.0" + } + }, + "sass-loader": { + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-6.0.7.tgz", + "integrity": "sha512-JoiyD00Yo1o61OJsoP2s2kb19L1/Y2p3QFcCdWdF6oomBGKVYuZyqHWemRBfQ2uGYsk+CH3eCguXNfpjzlcpaA==", + "dev": true, + "requires": { + "clone-deep": "^2.0.1", + "loader-utils": "^1.0.1", + "lodash.tail": "^4.1.1", + "neo-async": "^2.5.0", + "pify": "^3.0.0" + } + }, + "saucelabs": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.5.0.tgz", + "integrity": "sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ==", + "dev": true, + "requires": { + "https-proxy-agent": "^2.2.1" + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "schema-utils": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.5.tgz", + "integrity": "sha512-yYrjb9TX2k/J1Y5UNy3KYdZq10xhYcF8nMpAW6o3hy6Q8WSIEf9lJHG/ePnOBfziPM3fvQwfOwa13U/Fh8qTfA==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + } + }, + "scss-tokenizer": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", + "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "requires": { + "js-base64": "^2.1.8", + "source-map": "^0.4.2" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selenium-webdriver": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz", + "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==", + "dev": true, + "requires": { + "jszip": "^3.1.3", + "rimraf": "^2.5.4", + "tmp": "0.0.30", + "xml2js": "^0.4.17" + }, + "dependencies": { + "tmp": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", + "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.1" + } + } + } + }, + "selfsigned": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.2.tgz", + "integrity": "sha1-tESVgNmZKbZbEKSDiTAaZZIIh1g=", + "dev": true, + "requires": { + "node-forge": "0.7.1" + } + }, + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" + }, + "semver-dsl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/semver-dsl/-/semver-dsl-1.0.1.tgz", + "integrity": "sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA=", + "dev": true, + "requires": { + "semver": "^5.3.0" + } + }, + "semver-intersect": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/semver-intersect/-/semver-intersect-1.3.1.tgz", + "integrity": "sha1-j6hKnhAovSOeRTDRo+GB5pjYhLo=", + "dev": true, + "requires": { + "semver": "^5.0.0" + } + }, + "send": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz", + "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.1", + "destroy": "~1.0.4", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.3.1" + }, + "dependencies": { + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.4.0.tgz", + "integrity": "sha1-fJWFFNtqwkQ6irwGLcn3iGp/YAU=", + "dev": true + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + } + }, + "serve-static": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz", + "integrity": "sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ==", + "dev": true, + "requires": { + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "set-getter": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz", + "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=", + "dev": true, + "requires": { + "to-object-path": "^0.3.0" + } + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "sha.js": { + "version": "2.4.10", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.10.tgz", + "integrity": "sha512-vnwmrFDlOExK4Nm16J2KMWHLrp14lBrjxMxBJpu++EnsuBmpiYaM/MEs46Vxxm/4FvdP5yTwuCTO9it5FSjrqA==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shallow-clone": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-1.0.0.tgz", + "integrity": "sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==", + "dev": true, + "requires": { + "is-extendable": "^0.1.1", + "kind-of": "^5.0.0", + "mixin-object": "^2.0.1" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "silent-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/silent-error/-/silent-error-1.1.0.tgz", + "integrity": "sha1-IglwbxyFCp8dENDYQJGLRvJuG8k=", + "dev": true, + "requires": { + "debug": "^2.2.0" + } + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "snapdragon": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.1.tgz", + "integrity": "sha1-4StUh/re0+PeoKyR6UAL91tAE3A=", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^2.0.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + } + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "dev": true, + "optional": true, + "requires": { + "hoek": "2.x.x" + } + }, + "socket.io": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-1.7.3.tgz", + "integrity": "sha1-uK+cq6AJSeVo42nxMn6pvp6iRhs=", + "dev": true, + "requires": { + "debug": "2.3.3", + "engine.io": "1.8.3", + "has-binary": "0.1.7", + "object-assign": "4.1.0", + "socket.io-adapter": "0.5.0", + "socket.io-client": "1.7.3", + "socket.io-parser": "2.3.1" + }, + "dependencies": { + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + }, + "object-assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", + "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=", + "dev": true + } + } + }, + "socket.io-adapter": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz", + "integrity": "sha1-y21LuL7IHhB4uZZ3+c7QBGBmu4s=", + "dev": true, + "requires": { + "debug": "2.3.3", + "socket.io-parser": "2.3.1" + }, + "dependencies": { + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + } + } + }, + "socket.io-client": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-1.7.3.tgz", + "integrity": "sha1-sw6GqhDV7zVGYBwJzeR2Xjgdo3c=", + "dev": true, + "requires": { + "backo2": "1.0.2", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "2.3.3", + "engine.io-client": "1.8.3", + "has-binary": "0.1.7", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseuri": "0.0.5", + "socket.io-parser": "2.3.1", + "to-array": "0.1.4" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + } + } + }, + "socket.io-parser": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.3.1.tgz", + "integrity": "sha1-3VMgJRA85Clpcya+/WQAX8/ltKA=", + "dev": true, + "requires": { + "component-emitter": "1.1.2", + "debug": "2.2.0", + "isarray": "0.0.1", + "json3": "3.3.2" + }, + "dependencies": { + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "0.7.1" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + } + } + }, + "sockjs": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", + "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "dev": true, + "requires": { + "faye-websocket": "^0.10.0", + "uuid": "^3.0.1" + } + }, + "sockjs-client": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.4.tgz", + "integrity": "sha1-W6vjhrd15M8U51IJEUUmVAFsixI=", + "dev": true, + "requires": { + "debug": "^2.6.6", + "eventsource": "0.1.6", + "faye-websocket": "~0.11.0", + "inherits": "^2.0.1", + "json3": "^3.3.2", + "url-parse": "^1.1.8" + }, + "dependencies": { + "faye-websocket": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", + "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + } + } + }, + "source-list-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", + "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", + "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==", + "dev": true, + "requires": { + "atob": "^2.0.0", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "^0.5.6" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "spdx-correct": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", + "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", + "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==" + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", + "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==" + }, + "spdy": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz", + "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=", + "dev": true, + "requires": { + "debug": "^2.6.8", + "handle-thing": "^1.2.5", + "http-deceiver": "^1.2.7", + "safe-buffer": "^5.0.1", + "select-hose": "^2.0.0", + "spdy-transport": "^2.0.18" + } + }, + "spdy-transport": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.0.20.tgz", + "integrity": "sha1-c15yBUxIayNU/onnAiVgBKOazk0=", + "dev": true, + "requires": { + "debug": "^2.6.8", + "detect-node": "^2.0.3", + "hpack.js": "^2.1.6", + "obuf": "^1.1.1", + "readable-stream": "^2.2.9", + "safe-buffer": "^5.0.1", + "wbuf": "^1.7.2" + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", + "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "tweetnacl": "~0.14.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "ssri": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.2.4.tgz", + "integrity": "sha512-UnEAgMZa15973iH7cUi0AHjJn1ACDIkaMyZILoqwN6yzt+4P81I8tBc5Hl+qwi5auMplZtPQsHrPBR5vJLcQtQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.1" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "dev": true + }, + "stdout-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", + "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", + "requires": { + "readable-stream": "^2.0.1" + } + }, + "stream-browserify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.2.tgz", + "integrity": "sha512-mc1dbFhGBxvTM3bIWmAAINbqiuAk9TATcfIQC8P+/+HJefgaiTlMn2dHvkX8qlI12KeYKSQ1Ua9RrIqrn1VPoA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.0.tgz", + "integrity": "sha512-sZOFxI/5xw058XIRHl4dU3dZ+TTOIGJR78Dvo0oEAejIt4ou27k+3ne1zYmCV+v7UucbxIFQuOgnkTVHh8YPnw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.3", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "dev": true, + "optional": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "requires": { + "get-stdin": "^4.0.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "style-loader": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.19.1.tgz", + "integrity": "sha512-IRE+ijgojrygQi3rsqT0U4dd+UcPCqcVvauZpCnQrGAlEe+FUIyrK93bUDScamesjP08JlQNsFJU+KmPedP5Og==", + "dev": true, + "requires": { + "loader-utils": "^1.0.2", + "schema-utils": "^0.3.0" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "schema-utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", + "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "dev": true, + "requires": { + "ajv": "^5.0.0" + } + } + } + }, + "stylus": { + "version": "0.54.5", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.5.tgz", + "integrity": "sha1-QrlWCTHKcJDOhRWnmLqeaqPW3Hk=", + "dev": true, + "requires": { + "css-parse": "1.7.x", + "debug": "*", + "glob": "7.0.x", + "mkdirp": "0.5.x", + "sax": "0.5.x", + "source-map": "0.1.x" + }, + "dependencies": { + "glob": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", + "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "sax": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", + "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=", + "dev": true + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "stylus-loader": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-3.0.2.tgz", + "integrity": "sha512-+VomPdZ6a0razP+zinir61yZgpw2NfljeSsdUF5kJuEzlo3khXhY19Fn6l8QQz1GRJGtMCo8nG5C04ePyV7SUA==", + "dev": true, + "requires": { + "loader-utils": "^1.0.2", + "lodash.clonedeep": "^4.5.0", + "when": "~3.6.x" + } + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "^2.0.0" + } + }, + "symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=" + }, + "tapable": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", + "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=", + "dev": true + }, + "tar": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", + "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", + "requires": { + "block-stream": "*", + "fstream": "^1.0.12", + "inherits": "2" + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dev": true, + "requires": { + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" + } + }, + "thunky": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.2.tgz", + "integrity": "sha1-qGLgGOP7HqLsP85dVWBc9X8kc3E=", + "dev": true + }, + "time-stamp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.0.0.tgz", + "integrity": "sha1-lcakRTDhW6jW9KPsuMOj+sRto1c=", + "dev": true + }, + "timers-browserify": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.6.tgz", + "integrity": "sha512-HQ3nbYRAowdVd0ckGFvmJPPCOH/CHleFN/Y0YQCX1DVaB7t+KFvisuyN09fuP8Jtp1CpfSh8O8bMkHbdbPe6Pw==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "tmp": { + "version": "0.0.31", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz", + "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.1" + } + }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", + "dev": true + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + } + } + }, + "toposort": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.6.tgz", + "integrity": "sha1-wxdI5V0hDv/AD9zcfW5o19e7nOw=", + "dev": true + }, + "tough-cookie": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", + "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", + "dev": true, + "optional": true, + "requires": { + "punycode": "^1.4.1" + } + }, + "tree-kill": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.0.tgz", + "integrity": "sha512-DlX6dR0lOIRDFxI0mjL9IYg6OTncLm/Zt+JiBhE5OlFcAR8yc9S7FFXU9so0oda47frdM/JFsk7UjNt9vscKcg==", + "dev": true + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "true-case-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", + "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", + "requires": { + "glob": "^7.1.2" + } + }, + "ts-node": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-3.2.2.tgz", + "integrity": "sha1-u9KOOK9Kqj6WB2xGbhsiAZfBo84=", + "dev": true, + "requires": { + "arrify": "^1.0.0", + "chalk": "^2.0.0", + "diff": "^3.1.0", + "make-error": "^1.1.1", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.0", + "tsconfig": "^6.0.0", + "v8flags": "^3.0.0", + "yn": "^2.0.0" + } + }, + "tsconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-6.0.0.tgz", + "integrity": "sha1-aw6DdgA9evGGT434+J3QBZ/80DI=", + "dev": true, + "requires": { + "strip-bom": "^3.0.0", + "strip-json-comments": "^2.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "tsickle": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/tsickle/-/tsickle-0.26.0.tgz", + "integrity": "sha512-eWJ2CUfttGK0LqF9iJ/Avnxbj4M+fCyJ50Zag3wm73Fut1hsasPRHKxKdrMWVj4BMHnQNx7TO+DdNmLmJTSuNw==", + "dev": true, + "requires": { + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map": "^0.5.6", + "source-map-support": "^0.4.2" + } + }, + "tslib": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.8.1.tgz", + "integrity": "sha1-aUavLR1lGnsYY7Ux1uWvpBqkTqw=" + }, + "tslint": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.7.0.tgz", + "integrity": "sha1-wl4NDJL6EgHCvDDoROCOaCtPNVI=", + "dev": true, + "requires": { + "babel-code-frame": "^6.22.0", + "colors": "^1.1.2", + "commander": "^2.9.0", + "diff": "^3.2.0", + "glob": "^7.1.1", + "minimatch": "^3.0.4", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.7.1", + "tsutils": "^2.8.1" + } + }, + "tsutils": { + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.18.0.tgz", + "integrity": "sha512-y0CUDPPb0ygkUkmK8kAeLibag7OEAO0dxbtqAhzP+5w/VY5JdGnPiafhYxzRzWzkAGQGPJV99xrxngJYVLtrMg==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "optional": true + }, + "type-is": { + "version": "1.6.15", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", + "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.15" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "typescript": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.4.2.tgz", + "integrity": "sha1-+DlfhdRZJ2BnyYiqQYN6j4KHCEQ=", + "dev": true + }, + "uglify-js": { + "version": "3.3.13", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.13.tgz", + "integrity": "sha512-7rdn/bDOG1ElSTPdh7AI5TCjLv63ZD4k8BBadN3ssIkhlaQL2c0yRxmXCyOYhZK0wZTgGgUSnYQ4CGu+Jos5cA==", + "dev": true, + "requires": { + "commander": "~2.14.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz", + "integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true, + "optional": true + }, + "uglifyjs-webpack-plugin": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.2.tgz", + "integrity": "sha512-CG/NvzXfemUAm5Y4Guh5eEaJYHtkG7kKNpXEJHp9QpxsFVB5/qKvYWoMaq4sa99ccZ0hM3MK8vQV9XPZB4357A==", + "dev": true, + "requires": { + "cacache": "^10.0.1", + "find-cache-dir": "^1.0.0", + "schema-utils": "^0.4.2", + "serialize-javascript": "^1.4.0", + "source-map": "^0.6.1", + "uglify-es": "^3.3.4", + "webpack-sources": "^1.1.0", + "worker-farm": "^1.5.2" + }, + "dependencies": { + "commander": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", + "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "uglify-es": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", + "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", + "dev": true, + "requires": { + "commander": "~2.13.0", + "source-map": "~0.6.1" + } + } + } + }, + "ultron": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", + "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=", + "dev": true + }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" + } + } + } + }, + "unique-filename": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.0.tgz", + "integrity": "sha1-0F8v5AMlYIcfMOk8vnNe6iAVFPM=", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.0.tgz", + "integrity": "sha1-22Z258fMBimHj/GWCXx4hVrp9Ks=", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "universalify": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", + "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "upath": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.0.4.tgz", + "integrity": "sha512-d4SJySNBXDaQp+DPrziv3xGS6w3d2Xt69FijJr86zMPBy23JEloMCEOUBBzuN7xCtjLCnmB9tI/z7SBCahHBOw==", + "dev": true + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "requires": { + "punycode": "^2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + } + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-loader": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-0.6.2.tgz", + "integrity": "sha512-h3qf9TNn53BpuXTTcpC+UehiRrl0Cv45Yr/xWayApjw6G8Bg2dGke7rIwDQ39piciWCWrC+WiqLjOh3SUp9n0Q==", + "dev": true, + "requires": { + "loader-utils": "^1.0.2", + "mime": "^1.4.1", + "schema-utils": "^0.3.0" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "schema-utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", + "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "dev": true, + "requires": { + "ajv": "^5.0.0" + } + } + } + }, + "url-parse": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.2.0.tgz", + "integrity": "sha512-DT1XbYAfmQP65M/mE6OALxmXzZ/z1+e5zk2TcSKe/KiYbNGZxgtttzC0mR/sjopbpOXcbniq7eIKmocJnUWlEw==", + "dev": true, + "requires": { + "querystringify": "~1.0.0", + "requires-port": "~1.0.0" + }, + "dependencies": { + "querystringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-1.0.0.tgz", + "integrity": "sha1-YoYkIRLFtxL6ZU5SZlK/ahP/Bcs=", + "dev": true + } + } + }, + "use": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/use/-/use-2.0.2.tgz", + "integrity": "sha1-riig1y+TvyJCKhii43mZMRLeyOg=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "lazy-cache": "^2.0.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "useragent": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.2.1.tgz", + "integrity": "sha1-z1k+9PLRdYdei7ZY6pLhik/QbY4=", + "dev": true, + "requires": { + "lru-cache": "2.2.x", + "tmp": "0.0.x" + }, + "dependencies": { + "lru-cache": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.2.4.tgz", + "integrity": "sha1-bGWGGb7PFAMdDQtZSxYELOTcBj0=", + "dev": true + } + } + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.0.tgz", + "integrity": "sha512-qC0vMFX6q6ee8JaoTF2Om1uL8KAV1ATUjVaHRxLiPJkIsp8JZl6ZjG0MIB+twZFLbi1vXj30rqj4zlqYiOS9xg==", + "dev": true + }, + "v8flags": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.0.1.tgz", + "integrity": "sha1-3Oj8N5wX2fLJ6e142JzgAFKxt2s=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "validate-npm-package-license": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", + "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "vlq": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz", + "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==", + "dev": true + }, + "vm-browserify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "dev": true, + "requires": { + "indexof": "0.0.1" + } + }, + "void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "dev": true + }, + "watchpack": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.5.0.tgz", + "integrity": "sha512-RSlipNQB1u48cq0wH/BNfCu1tD/cJ8ydFIkNYhp9o+3d+8unClkIovpW5qpFPgmL9OE48wfAnlZydXByWP82AA==", + "dev": true, + "requires": { + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.1.tgz", + "integrity": "sha512-SO5lYHA3vO6gz66erVvedSCkp7AKWdv6VcQ2N4ysXfPxdAlxAMMAdwegGGcv1Bqwm7naF1hNdk5d6AAIEHV2nQ==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "kind-of": "^6.0.2", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "chokidar": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.2.tgz", + "integrity": "sha512-l32Hw3wqB0L2kGVmSbK/a+xXLDrUEsc84pSgMkmwygHvD7ubRsP/vxxHa5BtB6oix1XLLVCHyYMsckRXxThmZw==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.0", + "braces": "^2.3.0", + "fsevents": "^1.0.0", + "glob-parent": "^3.1.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^2.1.1", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0", + "upath": "^1.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.9.tgz", + "integrity": "sha512-SlIz6sv5UPaAVVFRKodKjCg48EbNoIhgetzfK/Cy0v5U52Z6zB136M8tp0UC9jM53LYbmIRihJszvvqpKkfm9g==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + } + } + }, + "wbuf": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.2.tgz", + "integrity": "sha1-1pe5nx9ZUS3ydRvkJ2nBWAtYAf4=", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "webdriver-js-extender": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz", + "integrity": "sha512-lcUKrjbBfCK6MNsh7xaY2UAUmZwe+/ib03AjVOpFobX4O7+83BUveSrLfU0Qsyb1DaKJdQRbuU+kM9aZ6QUhiQ==", + "dev": true, + "requires": { + "@types/selenium-webdriver": "^3.0.0", + "selenium-webdriver": "^3.0.1" + } + }, + "webpack": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.11.0.tgz", + "integrity": "sha512-3kOFejWqj5ISpJk4Qj/V7w98h9Vl52wak3CLiw/cDOfbVTq7FeoZ0SdoHHY9PYlHr50ZS42OfvzE2vB4nncKQg==", + "dev": true, + "requires": { + "acorn": "^5.0.0", + "acorn-dynamic-import": "^2.0.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "async": "^2.1.2", + "enhanced-resolve": "^3.4.0", + "escope": "^3.6.0", + "interpret": "^1.0.0", + "json-loader": "^0.5.4", + "json5": "^0.5.1", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "mkdirp": "~0.5.0", + "node-libs-browser": "^2.0.0", + "source-map": "^0.5.3", + "supports-color": "^4.2.1", + "tapable": "^0.2.7", + "uglifyjs-webpack-plugin": "^0.4.6", + "watchpack": "^1.4.0", + "webpack-sources": "^1.0.1", + "yargs": "^8.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + } + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "requires": { + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" + } + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true, + "requires": { + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" + }, + "dependencies": { + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "requires": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + } + } + } + }, + "uglifyjs-webpack-plugin": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", + "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", + "dev": true, + "requires": { + "source-map": "^0.5.6", + "uglify-js": "^2.8.29", + "webpack-sources": "^1.0.1" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yargs": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", + "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", + "dev": true, + "requires": { + "camelcase": "^4.1.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "read-pkg-up": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^7.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + } + } + }, + "yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + } + } + } + } + }, + "webpack-core": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz", + "integrity": "sha1-/FcViMhVjad76e+23r3Fo7FyvcI=", + "dev": true, + "requires": { + "source-list-map": "~0.1.7", + "source-map": "~0.4.1" + }, + "dependencies": { + "source-list-map": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz", + "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=", + "dev": true + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "webpack-dev-middleware": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz", + "integrity": "sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A==", + "dev": true, + "requires": { + "memory-fs": "~0.4.1", + "mime": "^1.5.0", + "path-is-absolute": "^1.0.0", + "range-parser": "^1.0.3", + "time-stamp": "^2.0.0" + } + }, + "webpack-dev-server": { + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.11.2.tgz", + "integrity": "sha512-zrPoX97bx47vZiAXfDrkw8pe9QjJ+lunQl3dypojyWwWr1M5I2h0VSrMPfTjopHQPRNn+NqfjcMmhoLcUJe2gA==", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "array-includes": "^3.0.3", + "bonjour": "^3.5.0", + "chokidar": "^2.0.0", + "compression": "^1.5.2", + "connect-history-api-fallback": "^1.3.0", + "debug": "^3.1.0", + "del": "^3.0.0", + "express": "^4.16.2", + "html-entities": "^1.2.0", + "http-proxy-middleware": "~0.17.4", + "import-local": "^1.0.0", + "internal-ip": "1.2.0", + "ip": "^1.1.5", + "killable": "^1.0.0", + "loglevel": "^1.4.1", + "opn": "^5.1.0", + "portfinder": "^1.0.9", + "selfsigned": "^1.9.1", + "serve-index": "^1.7.2", + "sockjs": "0.3.19", + "sockjs-client": "1.1.4", + "spdy": "^3.4.1", + "strip-ansi": "^3.0.0", + "supports-color": "^5.1.0", + "webpack-dev-middleware": "1.12.2", + "yargs": "6.6.0" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.1.tgz", + "integrity": "sha512-SO5lYHA3vO6gz66erVvedSCkp7AKWdv6VcQ2N4ysXfPxdAlxAMMAdwegGGcv1Bqwm7naF1hNdk5d6AAIEHV2nQ==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "kind-of": "^6.0.2", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "chokidar": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.2.tgz", + "integrity": "sha512-l32Hw3wqB0L2kGVmSbK/a+xXLDrUEsc84pSgMkmwygHvD7ubRsP/vxxHa5BtB6oix1XLLVCHyYMsckRXxThmZw==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.0", + "braces": "^2.3.0", + "fsevents": "^1.0.0", + "glob-parent": "^3.1.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^2.1.1", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0", + "upath": "^1.0.0" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.9.tgz", + "integrity": "sha512-SlIz6sv5UPaAVVFRKodKjCg48EbNoIhgetzfK/Cy0v5U52Z6zB136M8tp0UC9jM53LYbmIRihJszvvqpKkfm9g==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "supports-color": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yargs": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^4.2.0" + } + }, + "yargs-parser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "dev": true, + "requires": { + "camelcase": "^3.0.0" + } + } + } + }, + "webpack-merge": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.1.2.tgz", + "integrity": "sha512-/0QYwW/H1N/CdXYA2PNPVbsxO3u2Fpz34vs72xm03SRfg6bMNGfMJIQEpQjKRvkG2JvT6oRJFpDtSrwbX8Jzvw==", + "dev": true, + "requires": { + "lodash": "^4.17.5" + }, + "dependencies": { + "lodash": { + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", + "dev": true + } + } + }, + "webpack-sources": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz", + "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "webpack-subresource-integrity": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.0.4.tgz", + "integrity": "sha1-j6yKfo61n8ahZ2ioXJ2U7n+dDts=", + "dev": true, + "requires": { + "webpack-core": "^0.6.8" + } + }, + "websocket-driver": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", + "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", + "dev": true, + "requires": { + "http-parser-js": ">=0.4.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", + "dev": true + }, + "when": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/when/-/when-3.6.4.tgz", + "integrity": "sha1-RztRfsFZ4rhQBUl6E5g/CVQS404=", + "dev": true + }, + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true + }, + "worker-farm": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.5.4.tgz", + "integrity": "sha512-ITyClEvcfv0ozqJl1vmWFWhvI+OIrkbInYqkEPE50wFPXj8J9Gd3FYf8+CkZJXJJsQBYe+2DvmoK9Zhx5w8W+w==", + "dev": true, + "requires": { + "errno": "~0.1.7", + "xtend": "~4.0.1" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "ws": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.2.tgz", + "integrity": "sha1-iiRPoFJAHgjJiGz0SoUYnh/UBn8=", + "dev": true, + "requires": { + "options": ">=0.0.5", + "ultron": "1.0.x" + } + }, + "wtf-8": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wtf-8/-/wtf-8-1.0.0.tgz", + "integrity": "sha1-OS2LotDxw00e4tYw8V0O+2jhBIo=", + "dev": true + }, + "xml-char-classes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/xml-char-classes/-/xml-char-classes-1.0.0.tgz", + "integrity": "sha1-ZGV4SKIP/F31g6Qq2KJ3tFErvE0=", + "dev": true + }, + "xml2js": { + "version": "0.4.22", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.22.tgz", + "integrity": "sha512-MWTbxAQqclRSTnehWWe5nMKzI3VmJ8ltiJEco8akcC6j3miOhjjfzKum5sId+CWhfxdOs/1xauYr8/ZDBtQiRw==", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "util.promisify": "~1.0.0", + "xmlbuilder": "~11.0.0" + } + }, + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true + }, + "xmlhttprequest-ssl": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz", + "integrity": "sha1-GFqIjATspGw+QHDZn3tJ3jUomS0=", + "dev": true + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + }, + "xxhashjs": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/xxhashjs/-/xxhashjs-0.2.2.tgz", + "integrity": "sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==", + "dev": true, + "requires": { + "cuint": "^0.2.2" + } + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + }, + "yargs": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", + "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + } + } + }, + "yargs-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", + "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", + "requires": { + "camelcase": "^3.0.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + } + } + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", + "dev": true + }, + "yn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", + "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", + "dev": true + }, + "zone.js": { + "version": "0.8.20", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.8.20.tgz", + "integrity": "sha512-FXlA37ErSXCMy5RNBcGFgCI/Zivqzr0D19GuvDxhcYIJc7xkFp6c29DKyODJu0Zo+EMyur/WPPgcBh1EHjB9jA==" + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/package.json b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/package.json new file mode 100644 index 00000000..d3d16282 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/package.json @@ -0,0 +1,62 @@ +{ + "name": "desktopwallet", + "version": "0.0.0", + "license": "MIT", + "scripts": { + "ng": "ng", + "start": "ng serve --proxy-config proxy.config.js --delete-output-path false", + "build": "ng build --prod", + "build-travis": "ng build --prod --output-path=$BUILD_UI_TRAVIS_DIR", + "test": "ng test --watch=false", + "lint": "ng lint", + "e2e": "ng e2e --proxy-config proxy.config.js --delete-output-path false", + "e2e-choose-config": "ng e2e --proxy-config $E2E_PROXY_CONFIG --delete-output-path false" + }, + "private": true, + "dependencies": { + "@angular/animations": "^5.2.0", + "@angular/cdk": "^5.2.0", + "@angular/common": "^5.2.0", + "@angular/compiler": "^5.2.0", + "@angular/core": "^5.2.0", + "@angular/forms": "^5.2.0", + "@angular/http": "^5.2.0", + "@angular/material": "^5.2.0", + "@angular/platform-browser": "^5.2.0", + "@angular/platform-browser-dynamic": "^5.2.0", + "@angular/router": "^5.2.0", + "@ngx-translate/core": "^9.1.1", + "bootstrap": "^4.0.0-beta.2", + "core-js": "^2.4.1", + "font-awesome": "^4.7.0", + "hammerjs": "^2.0.8", + "moment": "^2.21.0", + "rxjs": "^5.5.2", + "zone.js": "^0.8.14", + "bignumber.js": "^7.2.1", + "base-x": "3.0.5", + "node-sass": "4.12.0" + }, + "devDependencies": { + "@angular/cli": "^1.7.3", + "@angular/compiler-cli": "^5.2.0", + "@angular/language-service": "^5.2.0", + "@types/jasmine": "~2.5.53", + "@types/jasminewd2": "~2.0.2", + "@types/node": "~6.0.60", + "codelyzer": "~4.0.1", + "jasmine-core": "~2.6.2", + "jasmine-spec-reporter": "~4.1.0", + "karma": "~1.7.0", + "karma-chrome-launcher": "~2.1.1", + "karma-cli": "~1.0.1", + "karma-coverage-istanbul-reporter": "^1.2.1", + "karma-jasmine": "~1.1.0", + "karma-jasmine-html-reporter": "^0.2.2", + "karma-read-json": "^1.1.0", + "protractor": "~5.4.2", + "ts-node": "~3.2.0", + "tslint": "~5.7.0", + "typescript": "~2.4.2" + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/protractor.conf.js b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/protractor.conf.js new file mode 100644 index 00000000..98b71523 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/protractor.conf.js @@ -0,0 +1,31 @@ +// Protractor configuration file, see link for more information +// https://github.com/angular/protractor/blob/master/lib/config.ts + +const { SpecReporter } = require('jasmine-spec-reporter'); + +exports.config = { + allScriptsTimeout: 60000, + specs: [ + './e2e/**/*.e2e-spec.ts' + ], + capabilities: { + 'browserName': 'chrome', + chromeOptions: { + args: ['--no-sandbox', '--headless', '--disable-gpu', 'window-size=1920,1080'] + } + }, + directConnect: true, + baseUrl: 'http://localhost:4200/', + framework: 'jasmine', + jasmineNodeOpts: { + showColors: true, + defaultTimeoutInterval: 60000, + print: function() {} + }, + onPrepare() { + require('ts-node').register({ + project: 'e2e/tsconfig.e2e.json' + }); + jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); + } +}; diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/proxy.config.js b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/proxy.config.js new file mode 100644 index 00000000..5728e827 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/proxy.config.js @@ -0,0 +1,22 @@ +const PROXY_CONFIG = { + "/api/*": { + "target": "http://127.0.0.1:6420", + "secure": false, + "logLevel": "debug", + "bypass": function (req) { + req.headers["host"] = '127.0.0.1:6420'; + req.headers["referer"] = 'http://127.0.0.1:6420'; + req.headers["origin"] = 'http://127.0.0.1:6420'; + } +}, + "/teller/*": { + "target": "http://127.0.0.1:7071", + "pathRewrite": { + "^/teller" : "api/" + }, + "secure": true, + "logLevel": "debug" + } +}; + +module.exports = PROXY_CONFIG; diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/app.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/app.component.html new file mode 100644 index 00000000..4d1109aa --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/app.component.html @@ -0,0 +1,8 @@ +
+
+ +
{{ 'errors.window-size' | translate }}
+
+
+ + \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/app.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/app.component.scss new file mode 100644 index 00000000..17e9b186 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/app.component.scss @@ -0,0 +1,72 @@ +$white: #FBFBFB; + +.size-alert { + background-color: rgba(0, 0, 0, 0.85); + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 10000; + display: inline-flex; + align-items: center; + justify-content: center; + text-align: center; + color: white; + + > div { + margin: 0px 40px; + max-width: 400px; + } +} + +mat-card { + max-width: 1000px; + margin-top: 80px; + margin-right: auto; + margin-left: auto; +} + +.logo { + max-height: 100%; +} + +.fill-remaining-space { + flex: 1 1 auto; +} + +.sky-container { + max-width: 1000px; + margin-top: 20px; + margin-right: auto; + margin-left: auto; +} + +mat-toolbar span { + margin: 0 20px; +} + +.search-field { + border-radius: 8px; + border: none; + background-color: #fff; + padding: 8px; +} + +.syncing { + font-size: 14px; +} + +.main-menu button { + margin-right: 20px; +} + +#top-menu { + span { + color: $white; + + &#version { + padding-top: 12px; + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/app.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/app.component.spec.ts new file mode 100644 index 00000000..cd85da1c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/app.component.spec.ts @@ -0,0 +1,32 @@ +import { TestBed, async } from '@angular/core/testing'; + +import { AppComponent } from './app.component'; + +describe('AppComponent', () => { + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ + AppComponent, + ], + }).compileComponents(); + })); + + it('should create the app', async(() => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.debugElement.componentInstance; + expect(app).toBeTruthy(); + })); + + it(`should have as title 'app'`, async(() => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.debugElement.componentInstance; + expect(app.title).toEqual('app'); + })); + + it('should render title in a h1 tag', async(() => { + const fixture = TestBed.createComponent(AppComponent); + fixture.detectChanges(); + const compiled = fixture.debugElement.nativeElement; + expect(compiled.querySelector('h1').textContent).toContain('Welcome to app!'); + })); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/app.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/app.component.ts new file mode 100644 index 00000000..1c021a87 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/app.component.ts @@ -0,0 +1,68 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import 'rxjs/add/operator/takeWhile'; +import { MatDialog } from '@angular/material'; + +import { AppService } from './services/app.service'; +import { WalletService } from './services/wallet.service'; +import { HwWalletService } from './services/hw-wallet.service'; +import { HwPinDialogComponent } from './components/layout/hardware-wallet/hw-pin-dialog/hw-pin-dialog.component'; +import { Bip39WordListService } from './services/bip39-word-list.service'; +import { HwConfirmTxDialogComponent } from './components/layout/hardware-wallet/hw-confirm-tx-dialog/hw-confirm-tx-dialog.component'; +import { HwWalletPinService } from './services/hw-wallet-pin.service'; +import { HwWalletSeedWordService } from './services/hw-wallet-seed-word.service'; +import { LanguageService } from './services/language.service'; +import { openChangeLanguageModal } from './utils'; +import { MsgBarComponent } from './components/layout/msg-bar/msg-bar.component'; +import { MsgBarService } from './services/msg-bar.service'; +import { SeedWordDialogComponent } from './components/layout/seed-word-dialog/seed-word-dialog.component'; + +@Component({ + selector: 'app-root', + templateUrl: './app.component.html', + styleUrls: ['./app.component.scss'], +}) +export class AppComponent implements OnInit { + @ViewChild('msgBar') msgBar: MsgBarComponent; + + constructor( + private appService: AppService, + private languageService: LanguageService, + walletService: WalletService, + hwWalletService: HwWalletService, + hwWalletPinService: HwWalletPinService, + hwWalletSeedWordService: HwWalletSeedWordService, + private bip38WordList: Bip39WordListService, + private dialog: MatDialog, + private msgBarService: MsgBarService, + ) { + hwWalletPinService.requestPinComponent = HwPinDialogComponent; + hwWalletSeedWordService.requestWordComponent = SeedWordDialogComponent; + hwWalletService.signTransactionConfirmationComponent = HwConfirmTxDialogComponent; + + walletService.initialLoadFailed.subscribe(failed => { + if (failed) { + // The "?2" part indicates that error number 2 should be displayed. + window.location.assign('assets/error-alert/index.html?2'); + } + }); + } + + ngOnInit() { + this.appService.testBackend(); + this.languageService.loadLanguageSettings(); + + const subscription = this.languageService.selectedLanguageLoaded.subscribe(selectedLanguageLoaded => { + if (!selectedLanguageLoaded) { + openChangeLanguageModal(this.dialog, true).subscribe(response => { + if (response) { + this.languageService.changeLanguage(response); + } + }); + } + + subscription.unsubscribe(); + + this.msgBarService.msgBarComponent = this.msgBar; + }); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/app.config.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/app.config.ts new file mode 100644 index 00000000..e19fa0dc --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/app.config.ts @@ -0,0 +1,35 @@ +export const AppConfig = { + otcEnabled: false, + maxHardwareWalletAddresses: 1, + useHwWalletDaemon: true, + urlForHwWalletVersionChecking: 'https://version.skycoin.com/skywallet/version.txt', + hwWalletDownloadUrlAndPrefix: 'https://downloads.skycoin.com/skywallet/skywallet-firmware-v', + + urlForVersionChecking: 'https://version.skycoin.com/skycoin/version.txt', + walletDownloadUrl: 'https://www.skycoin.com/downloads/', + + /** + * This wallet uses the Skycoin URI Specification (based on BIP-21) when creating QR codes and + * requesting coins. This variable defines the prefix that will be used for creating QR codes + * and URLs. IT MUST BE UNIQUE FOR EACH COIN. + */ + uriSpecificatioPrefix: 'skycoin', + + languages: [{ + code: 'en', + name: 'English', + iconName: 'en.png', + }, + { + code: 'zh', + name: '中文', + iconName: 'zh.png', + }, + { + code: 'es', + name: 'Español', + iconName: 'es.png', + }, + ], + defaultLanguage: 'en', +}; diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/app.datatypes.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/app.datatypes.ts new file mode 100644 index 00000000..c61c3b58 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/app.datatypes.ts @@ -0,0 +1,158 @@ +import { BigNumber } from 'bignumber.js'; +/** + * Internal Objects + */ + +export class Address { + address: string; + coins: BigNumber = new BigNumber('0'); + hours: BigNumber = new BigNumber('0'); + copying?: boolean; // Optional parameter indicating whether the address is being copied to clipboard + outputs?: any; + confirmed?: boolean; // Optional parameter for hardware wallets only +} + +export class PurchaseOrder { + coin_type: string; + filename: string; + deposit_address: string; + recipient_address: string; + status?: string; +} + +export class TellerConfig { + enabled: boolean; + sky_btc_exchange_rate: number; +} + +export class Transaction { + balance: BigNumber = new BigNumber('0'); + inputs: any[]; + outputs: any[]; + txid: string; + hoursSent?: BigNumber; + hoursBurned?: BigNumber; + coinsMovedInternally?: boolean; + note?: string; +} + +export class PreviewTransaction extends Transaction { + from: string; + to: string[]; + encoded: string; + innerHash: string; + wallet?: Wallet; +} + +export class NormalTransaction extends Transaction { + addresses: string[]; + timestamp: number; + block: number; + confirmed: boolean; +} + +export class Version { + version: string; +} + +export class Wallet { + label: string; + filename: string; + coins: BigNumber = new BigNumber('0'); + hours: BigNumber = new BigNumber('0'); + addresses: Address[]; + encrypted: boolean; + hideEmpty?: boolean; + opened?: boolean; + isHardware?: boolean; + hasHwSecurityWarnings?: boolean; + stopShowingHwSecurityPopup?: boolean; +} + +export class Connection { + id: number; + address: string; + listen_port: number; + source?: string; +} + +export class TradingPair { + from: string; + to: string; + price: number; + pair: string; + min: number; + max: number; +} + +export class ExchangeOrder { + pair: string; + fromAmount: number|null; + toAmount: number; + toAddress: string; + toTag: string|null; + refundAddress: string|null; + refundTag: string|null; + id: string; + exchangeAddress: string; + exchangeTag: string|null; + toTx?: string|null; + status: string; + message?: string; +} + +export class StoredExchangeOrder { + id: string; + pair: string; + fromAmount: number; + toAmount: number; + address: string; + timestamp: number; + price: number; +} + +export interface Output { + address: string; + coins: BigNumber; + hash: string; + calculated_hours: BigNumber; +} + +export interface ConfirmationData { + text: string; + headerText: string; + checkboxText?: string; + confirmButtonText: string; + cancelButtonText?: string; + redTitle?: boolean; + disableDismiss?: boolean; + linkText?: string; + linkFunction?(): void; +} + +/** + * Response Objects + */ + +export class GetWalletsResponseWallet { + meta: GetWalletsResponseMeta; + entries: GetWalletsResponseEntry[]; +} + +export class PostWalletNewAddressResponse { + addresses: string[]; +} + +/** + * Response Embedded Objects + */ + +export class GetWalletsResponseMeta { + label: string; + filename: string; + encrypted: boolean; +} + +export class GetWalletsResponseEntry { + address: string; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/app.module.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/app.module.ts new file mode 100644 index 00000000..7b959544 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/app.module.ts @@ -0,0 +1,344 @@ +import { BrowserModule } from '@angular/platform-browser'; +import { NgModule } from '@angular/core'; +import { AppComponent } from './app.component'; +import { HttpModule } from '@angular/http'; +import { ApiService } from './services/api.service'; +import { WalletService } from './services/wallet.service'; +import { WalletsComponent } from './components/pages/wallets/wallets.component'; +import { CreateWalletComponent } from './components/pages/wallets/create-wallet/create-wallet.component'; +import { ReactiveFormsModule } from '@angular/forms'; +import { SendSkycoinComponent } from './components/pages/send-skycoin/send-skycoin.component'; +import { DateFromNowPipe } from './pipes/date-from-now.pipe'; +import { RouterModule } from '@angular/router'; +import { BlockchainService } from './services/blockchain.service'; +import { DateTimePipe } from './pipes/date-time.pipe'; +import { PendingTransactionsComponent } from './components/pages/settings/pending-transactions/pending-transactions.component'; +import { OutputsComponent } from './components/pages/settings/outputs/outputs.component'; +import { BlockchainComponent } from './components/pages/settings/blockchain/blockchain.component'; +import { BackupComponent } from './components/pages/settings/backup/backup.component'; +import { NetworkComponent } from './components/pages/settings/network/network.component'; +import { NetworkService } from './services/network.service'; +import { ChangeNameComponent } from './components/pages/wallets/change-name/change-name.component'; +import { ButtonComponent } from './components/layout/button/button.component'; +import { QrCodeComponent } from './components/layout/qr-code/qr-code.component'; +import { BuyComponent } from './components/pages/buy/buy.component'; +import { AddDepositAddressComponent } from './components/pages/buy/add-deposit-address/add-deposit-address.component'; +import { PurchaseService } from './services/purchase.service'; +import { TellerStatusPipe } from './pipes/teller-status.pipe'; +import { HeaderComponent } from './components/layout/header/header.component'; +import { TopBarComponent } from './components/layout/header/top-bar/top-bar.component'; +import { PriceService } from './services/price.service'; +import { TransactionListComponent } from './components/pages/transaction-list/transaction-list.component'; +import { TransactionDetailComponent } from './components/pages/transaction-list/transaction-detail/transaction-detail.component'; +import { NavBarComponent } from './components/layout/header/nav-bar/nav-bar.component'; +import { WalletDetailComponent } from './components/pages/wallets/wallet-detail/wallet-detail.component'; +import { ModalComponent } from './components/layout/modal/modal.component'; +import { PasswordDialogComponent } from './components/layout/password-dialog/password-dialog.component'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCardModule } from '@angular/material/card'; +import { MatDialogModule } from '@angular/material/dialog'; +import { MatExpansionModule } from '@angular/material/expansion'; +import { MatGridListModule } from '@angular/material/grid-list'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { MatListModule } from '@angular/material/list'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatProgressBarModule } from '@angular/material/progress-bar'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { MatSelectModule } from '@angular/material/select'; +import { MatTabsModule } from '@angular/material/tabs'; +import { MatToolbarModule } from '@angular/material/toolbar'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { MatCheckboxModule } from '@angular/material/checkbox'; +import { MatSliderModule, MatAutocompleteModule } from '@angular/material'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { HttpClientModule } from '@angular/common/http'; +import { AppService } from './services/app.service'; +import { WizardGuardService } from './services/wizard-guard.service'; +import { OnboardingCreateWalletComponent } from './components/pages/onboarding/onboarding-create-wallet/onboarding-create-wallet.component'; +import { OnboardingEncryptWalletComponent } from './components/pages/onboarding/onboarding-encrypt-wallet/onboarding-encrypt-wallet.component'; +import { OnboardingSafeguardComponent } from './components/pages/onboarding/onboarding-create-wallet/onboarding-safeguard/onboarding-safeguard.component'; +import { DoubleButtonComponent } from './components/layout/double-button/double-button.component'; +import { SeedModalComponent } from './components/pages/settings/backup/seed-modal/seed-modal.component'; +import { OnboardingComponent } from './components/pages/onboarding/onboarding.component'; +import { DontsavepasswordDirective } from './directives/dontsavepassword.directive'; +import { SendFormComponent } from './components/pages/send-skycoin/send-form/send-form.component'; +import { SendVerifyComponent } from './components/pages/send-skycoin/send-preview/send-preview.component'; +import { TransactionInfoComponent } from './components/pages/send-skycoin/send-preview/transaction-info/transaction-info.component'; +import { SendFormAdvancedComponent } from './components/pages/send-skycoin/send-form-advanced/send-form-advanced.component'; +import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; +import { AppTranslateLoader } from './app.translate-loader'; +import { NavBarService } from './services/nav-bar.service'; +import { LoadingContentComponent } from './components/layout/loading-content/loading-content.component'; +import { NumberOfAddressesComponent } from './components/pages/wallets/number-of-addresses/number-of-addresses'; +import { SelectAddressComponent } from './components/pages/send-skycoin/send-form-advanced/select-address/select-address'; +import { CreateWalletFormComponent } from './components/pages/wallets/create-wallet/create-wallet-form/create-wallet-form.component'; +import { ResetPasswordComponent } from './components/pages/reset-password/reset-password.component'; +import { ExchangeComponent } from './components/pages/exchange/exchange.component'; +import { ExchangeService } from './services/exchange.service'; +import { ExchangeCreateComponent } from './components/pages/exchange/exchange-create/exchange-create.component'; +import { ExchangeStatusComponent } from './components/pages/exchange/exchange-status/exchange-status.component'; +import { HwWalletService } from './services/hw-wallet.service'; +import { HwOptionsDialogComponent } from './components/layout/hardware-wallet/hw-options-dialog/hw-options-dialog.component'; +import { HwWipeDialogComponent } from './components/layout/hardware-wallet/hw-wipe-dialog/hw-wipe-dialog.component'; +import { HwAddedDialogComponent } from './components/layout/hardware-wallet/hw-added-dialog/hw-added-dialog.component'; +import { HwGenerateSeedDialogComponent } from './components/layout/hardware-wallet/hw-generate-seed-dialog/hw-generate-seed-dialog.component'; +import { HwBackupDialogComponent } from './components/layout/hardware-wallet/hw-backup-dialog/hw-backup-dialog.component'; +import { ConfirmationComponent } from './components/layout/confirmation/confirmation.component'; +import { HwMessageComponent } from './components/layout/hardware-wallet/hw-message/hw-message.component'; +import { HwPinDialogComponent } from './components/layout/hardware-wallet/hw-pin-dialog/hw-pin-dialog.component'; +import { HwChangePinDialogComponent } from './components/layout/hardware-wallet/hw-change-pin-dialog/hw-change-pin-dialog.component'; +import { HwPinHelpDialogComponent } from './components/layout/hardware-wallet/hw-pin-help-dialog/hw-pin-help-dialog.component'; +import { HwRestoreSeedDialogComponent } from './components/layout/hardware-wallet/hw-restore-seed-dialog/hw-restore-seed-dialog.component'; +import { Bip39WordListService } from './services/bip39-word-list.service'; +import { HwDialogBaseComponent } from './components/layout/hardware-wallet/hw-dialog-base.component'; +import { HwConfirmTxDialogComponent } from './components/layout/hardware-wallet/hw-confirm-tx-dialog/hw-confirm-tx-dialog.component'; +import { HwConfirmAddressDialogComponent } from './components/layout/hardware-wallet/hw-confirm-address-dialog/hw-confirm-address-dialog.component'; +import { HwWalletDaemonService } from './services/hw-wallet-daemon.service'; +import { HwWalletPinService } from './services/hw-wallet-pin.service'; +import { HwWalletSeedWordService } from './services/hw-wallet-seed-word.service'; +import { LanguageService } from './services/language.service'; +import { SelectLanguageComponent } from './components/layout/select-language/select-language.component'; +import { ExchangeHistoryComponent } from './components/pages/exchange/exchange-history/exchange-history.component'; +import { StorageService } from './services/storage.service'; +import { CommonTextPipe } from './pipes/common-text.pipe'; +import { AmountPipe } from './pipes/amount.pipe'; +import { DecimalPipe } from '@angular/common'; +import { HwRemovePinDialogComponent } from './components/layout/hardware-wallet/hw-remove-pin-dialog/hw-remove-pin-dialog.component'; +import { HwUpdateFirmwareDialogComponent } from './components/layout/hardware-wallet/hw-update-firmware-dialog/hw-update-firmware-dialog.component'; +import { HwUpdateAlertDialogComponent } from './components/layout/hardware-wallet/hw-update-alert-dialog/hw-update-alert-dialog.component'; +import { ChangeNoteComponent } from './components/pages/send-skycoin/send-preview/transaction-info/change-note/change-note.component'; +import { MsgBarComponent } from './components/layout/msg-bar/msg-bar.component'; +import { MsgBarService } from './services/msg-bar.service'; +import { SeedWordDialogComponent } from './components/layout/seed-word-dialog/seed-word-dialog.component'; +import { MultipleDestinationsDialogComponent } from './components/layout/multiple-destinations-dialog/multiple-destinations-dialog.component'; + + +const ROUTES = [ + { + path: '', + redirectTo: 'wallets', + pathMatch: 'full', + }, + { + path: 'wallets', + component: WalletsComponent, + canActivate: [WizardGuardService], + }, + { + path: 'send', + component: SendSkycoinComponent, + canActivate: [WizardGuardService], + }, + { + path: 'transactions', + component: TransactionListComponent, + canActivate: [WizardGuardService], + }, + { + path: 'buy', + component: BuyComponent, + canActivate: [WizardGuardService], + }, + { + path: 'exchange', + component: ExchangeComponent, + canActivate: [WizardGuardService], + }, + { + path: 'settings', + children: [ + { + path: 'backup', + component: BackupComponent, + }, + { + path: 'blockchain', + component: BlockchainComponent, + }, + { + path: 'network', + component: NetworkComponent, + }, + { + path: 'outputs', + component: OutputsComponent, + }, + { + path: 'pending-transactions', + component: PendingTransactionsComponent, + }, + ], + canActivate: [WizardGuardService], + }, + { + path: 'wizard', + component: OnboardingComponent, + }, + { + path: 'reset/:id', + component: ResetPasswordComponent, + }, +]; + +@NgModule({ + declarations: [ + AddDepositAddressComponent, + AppComponent, + BackupComponent, + BlockchainComponent, + BuyComponent, + ButtonComponent, + ChangeNameComponent, + CreateWalletComponent, + DateFromNowPipe, + DateTimePipe, + HeaderComponent, + NetworkComponent, + OutputsComponent, + PendingTransactionsComponent, + QrCodeComponent, + SendSkycoinComponent, + TellerStatusPipe, + TopBarComponent, + TransactionDetailComponent, + TransactionListComponent, + WalletsComponent, + NavBarComponent, + WalletDetailComponent, + ModalComponent, + OnboardingCreateWalletComponent, + OnboardingEncryptWalletComponent, + OnboardingSafeguardComponent, + DoubleButtonComponent, + PasswordDialogComponent, + SeedModalComponent, + OnboardingComponent, + DontsavepasswordDirective, + SendFormComponent, + SendVerifyComponent, + TransactionInfoComponent, + SendFormAdvancedComponent, + LoadingContentComponent, + NumberOfAddressesComponent, + SelectAddressComponent, + CreateWalletFormComponent, + ResetPasswordComponent, + ExchangeComponent, + ExchangeCreateComponent, + ExchangeStatusComponent, + HwOptionsDialogComponent, + HwWipeDialogComponent, + HwAddedDialogComponent, + HwGenerateSeedDialogComponent, + HwBackupDialogComponent, + ConfirmationComponent, + HwMessageComponent, + HwPinDialogComponent, + HwChangePinDialogComponent, + HwPinHelpDialogComponent, + HwRestoreSeedDialogComponent, + HwDialogBaseComponent, + HwConfirmTxDialogComponent, + HwConfirmAddressDialogComponent, + SelectLanguageComponent, + ExchangeHistoryComponent, + CommonTextPipe, + AmountPipe, + HwRemovePinDialogComponent, + HwUpdateFirmwareDialogComponent, + HwUpdateAlertDialogComponent, + ChangeNoteComponent, + MsgBarComponent, + SeedWordDialogComponent, + MultipleDestinationsDialogComponent, + ], + entryComponents: [ + AddDepositAddressComponent, + CreateWalletComponent, + ChangeNameComponent, + QrCodeComponent, + SendSkycoinComponent, + TransactionDetailComponent, + OnboardingSafeguardComponent, + PasswordDialogComponent, + SeedModalComponent, + NumberOfAddressesComponent, + SelectAddressComponent, + HwOptionsDialogComponent, + HwWipeDialogComponent, + HwAddedDialogComponent, + HwGenerateSeedDialogComponent, + HwBackupDialogComponent, + ConfirmationComponent, + HwPinDialogComponent, + HwChangePinDialogComponent, + HwPinHelpDialogComponent, + HwRestoreSeedDialogComponent, + HwConfirmTxDialogComponent, + HwConfirmAddressDialogComponent, + SelectLanguageComponent, + ExchangeHistoryComponent, + HwRemovePinDialogComponent, + HwUpdateFirmwareDialogComponent, + HwUpdateAlertDialogComponent, + ChangeNoteComponent, + SeedWordDialogComponent, + MultipleDestinationsDialogComponent, + ], + imports: [ + BrowserModule, + HttpModule, + HttpClientModule, + MatButtonModule, + MatCardModule, + MatDialogModule, + MatExpansionModule, + MatGridListModule, + MatIconModule, + MatInputModule, + MatListModule, + MatMenuModule, + MatProgressBarModule, + MatProgressSpinnerModule, + MatSelectModule, + MatTabsModule, + MatToolbarModule, + MatTooltipModule, + MatCheckboxModule, + MatSliderModule, + MatAutocompleteModule, + NoopAnimationsModule, + ReactiveFormsModule, + RouterModule.forRoot(ROUTES, { useHash: true }), + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useClass: AppTranslateLoader, + }, + }), + ], + providers: [ + ApiService, + AppService, + BlockchainService, + ExchangeService, + NavBarService, + NetworkService, + PriceService, + PurchaseService, + WalletService, + WizardGuardService, + HwWalletService, + Bip39WordListService, + HwWalletDaemonService, + HwWalletPinService, + HwWalletSeedWordService, + LanguageService, + StorageService, + MsgBarService, + DecimalPipe, + ], + bootstrap: [AppComponent], +}) +export class AppModule { } diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/app.theme.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/app.theme.scss new file mode 100644 index 00000000..77b57e36 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/app.theme.scss @@ -0,0 +1,83 @@ +@import '~@angular/material/theming'; +// Plus imports for other components in your app. + +// Include the common styles for Angular Material. We include this here so that you only +// have to load a single css file for Angular Material in your app. +// Be sure that you only ever include this mixin once! +@include mat-core(); + +// Define the palettes for your theme using the Material Design palettes available in palette.scss +// (imported above). For each palette, you can optionally specify a default, lighter, and darker +// hue. + +$mat-skycoin-primary: ( + 100: #00C3FF, + 500: #0072FF, + contrast: ( + 100: white, + 500: white, + ) +); + +$mat-skycoin-accent: ( + 500: #FFC125, + contrast: ( + 500: white + ) +); + +$candy-app-primary: mat-palette($mat-skycoin-primary, 500, 100, 500); +$candy-app-accent: mat-palette($mat-skycoin-accent, 500, 500, 500); + +// The warn palette is optional (defaults to red). +$candy-app-warn: mat-palette($mat-red); + +// Create the theme object (a Sass map containing all of the palettes). +$candy-app-theme: mat-light-theme($candy-app-primary, $candy-app-accent, $candy-app-warn); + +// Include theme styles for core and each component used in your app. +// Alternatively, you can import and @include the theme mixins for each component +// that you are using. +@include angular-material-theme($candy-app-theme); + +$mat-select-address-primary: ( + 100: #ddd, + 500: #ddd, + contrast: ( + 100: #ddd, + 500: #ddd, + ) +); + +$select-address-primary: mat-palette($mat-select-address-primary); +$select-address-theme: mat-light-theme($select-address-primary, $candy-app-accent); + +.select-address-theme { + @include angular-material-theme($select-address-theme); +} + +$mat-subtle-primary: ( + 100: white, + 500: white, + contrast: ( + 100: white, + 500: white, + ) +); + +$mat-subtle-accent: ( + 100: #cccccc, + 500: #cccccc, + contrast: ( + 100: #cccccc, + 500: #cccccc, + ) +); + +$subtle-primary: mat-palette($mat-subtle-primary); +$subtle-accent: mat-palette($mat-subtle-accent); +$subtle-theme: mat-light-theme($subtle-primary, $subtle-accent); + +.subtle-theme { + @include angular-material-theme($subtle-theme); +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/app.translate-loader.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/app.translate-loader.ts new file mode 100644 index 00000000..ac8cc67f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/app.translate-loader.ts @@ -0,0 +1,9 @@ +import { TranslateLoader } from '@ngx-translate/core'; +import { Observable } from 'rxjs/Observable'; +import 'rxjs/add/observable/fromPromise'; + +export class AppTranslateLoader implements TranslateLoader { + getTranslation(lang: string): Observable { + return Observable.fromPromise(System.import(`../assets/i18n/${lang}.json`)); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/button/button.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/button/button.component.html new file mode 100644 index 00000000..b18bae86 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/button/button.component.html @@ -0,0 +1,22 @@ +
+ +
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/button/button.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/button/button.component.scss new file mode 100644 index 00000000..c5a6c82e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/button/button.component.scss @@ -0,0 +1,34 @@ +@import '../../../../theme/variables'; + +.button-container { + display: inline-block; +} + +button { + border-radius: 25px; + height: 50px; + margin: 20px 10px 0; + width: 160px; + overflow: hidden; +} + +button.enabled { + background-color: rgba(30, 34, 39, 0.05); + box-shadow: none; + color: #1e2227; +} + +mat-icon { + margin-left: 10px; + opacity: 0.3; + line-height: 20px; +} + +mat-spinner { + display: inline-block; + height: 24px !important; + width: 24px !important; + margin-left: 10px; + position: relative; + top: -2px; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/button/button.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/button/button.component.spec.ts new file mode 100644 index 00000000..061a0d29 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/button/button.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ButtonComponent } from './button.component'; + +describe('ButtonComponent', () => { + let component: ButtonComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ButtonComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ButtonComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/button/button.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/button/button.component.ts new file mode 100644 index 00000000..5d8e2a3b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/button/button.component.ts @@ -0,0 +1,68 @@ +import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core'; +import { parseResponseMessage } from '../../../utils/errors'; +import { MatTooltip } from '@angular/material'; + +@Component({ + selector: 'app-button', + templateUrl: 'button.component.html', + styleUrls: ['button.component.scss'], +}) +export class ButtonComponent { + @Input() disabled: any; + @Input() forceEmitEvents = false; + @Output() action = new EventEmitter(); + @ViewChild('tooltip') tooltip: MatTooltip; + @ViewChild('button') button: HTMLButtonElement; + + error: string; + state: number; + mouseOver = false; + + onClick() { + if (!this.disabled || this.forceEmitEvents) { + this.error = ''; + this.action.emit(); + } + } + + focus() { + this.button.focus(); + } + + setLoading() { + this.state = 0; + } + + setSuccess() { + this.state = 1; + setTimeout(() => this.state = null, 3000); + } + + setError(error: any) { + this.error = typeof error === 'string' ? error : parseResponseMessage(error['_body']); + this.state = 2; + + if (this.mouseOver) { + setTimeout(() => this.tooltip.show(), 50); + } + } + + setDisabled() { + this.disabled = true; + } + + setEnabled() { + this.disabled = false; + } + + isLoading() { + return this.state === 0; + } + + resetState() { + this.state = null; + this.error = ''; + + return this; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/confirmation/confirmation.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/confirmation/confirmation.component.html new file mode 100644 index 00000000..1b02cce4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/confirmation/confirmation.component.html @@ -0,0 +1,24 @@ + +
+ {{ data.text | translate }} + {{ data.linkText | translate }} +
+ +
+ {{ data.checkboxText | translate }} + +
+ +
+ + {{ data.cancelButtonText | translate }} + + + {{ data.confirmButtonText | translate }} + +
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/confirmation/confirmation.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/confirmation/confirmation.component.scss new file mode 100644 index 00000000..75367122 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/confirmation/confirmation.component.scss @@ -0,0 +1,15 @@ +@import '../../../../theme/variables'; + +.red-title { + font-family: Skycoin; + line-height: 30px; + font-size: 14px; + text-align: center; + letter-spacing: 0.0769231em; + color: $red; +} + +.link { + cursor: pointer; + color: $gradient-blue-dark; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/confirmation/confirmation.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/confirmation/confirmation.component.spec.ts new file mode 100644 index 00000000..ff17ec2f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/confirmation/confirmation.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ConfirmationComponent } from './confirmation.component'; + +describe('ConfirmationComponent', () => { + let component: ConfirmationComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ConfirmationComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ConfirmationComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/confirmation/confirmation.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/confirmation/confirmation.component.ts new file mode 100644 index 00000000..7abb6964 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/confirmation/confirmation.component.ts @@ -0,0 +1,28 @@ +import { Component, Inject } from '@angular/core'; +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material'; +import { ConfirmationData } from '../../../app.datatypes'; + +@Component({ + selector: 'app-confirmation', + templateUrl: './confirmation.component.html', + styleUrls: ['./confirmation.component.scss'], +}) +export class ConfirmationComponent { + accepted = false; + disableDismiss = false; + + constructor( + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data: ConfirmationData, + ) { + this.disableDismiss = !!data.disableDismiss; + } + + closeModal(isConfirmed: boolean) { + this.dialogRef.close(isConfirmed); + } + + setAccept(event) { + this.accepted = event.checked ? true : false; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/double-button/double-button.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/double-button/double-button.component.html new file mode 100644 index 00000000..6a4591a1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/double-button/double-button.component.html @@ -0,0 +1,14 @@ +
+ {{ leftButtonText }} + {{ rightButtonText }} +
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/double-button/double-button.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/double-button/double-button.component.scss new file mode 100644 index 00000000..c0335bf6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/double-button/double-button.component.scss @@ -0,0 +1,75 @@ +@import '../../../../theme/variables'; + +.-small-button ::ng-deep button { + width: unset; + height: unset; + padding: 0 10px 0 10px; + min-width: 100px; + margin: unset; + font-size: 13px; +} + +.-toggle ::ng-deep button { + box-shadow: unset; + background-color: $transparent !important; + line-height: unset !important; + min-height: 26px; + span { + color: $black; + line-height: unset !important; + } +} + +.-toggle ::ng-deep button.enabled { + background-color: $black !important; + span { + color: $white; + } +} + +.-buttons-container { + width: fit-content; + padding: 5px; + background: rgba(255, 255, 255, 0.1); + border-radius: 100px; + margin: 0px auto; + text-align: center; +} + +.light { + &.-buttons-container { + background: #f1f1f1; + } + + .-toggle ::ng-deep button.enabled { + background-color: #fff !important; + + span { + color: $grey-dark; + } + } +} + +@media (min-width: 768px) and (max-width: 991px) { + .-buttons-container.navbar.light { + border-radius: 20px; + + app-button ::ng-deep .button-container { + display: block; + } + } +} + +.small { + &.-buttons-container { + padding: 2px; + line-height: 0px; + } + + .-small-button ::ng-deep button { + padding: 0 10px 0 10px; + min-width: 70px; + font-size: 9px; + min-height: 16px; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/double-button/double-button.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/double-button/double-button.component.spec.ts new file mode 100644 index 00000000..7718bbcb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/double-button/double-button.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { DoubleButtonComponent } from './double-button.component'; + +describe('DoubleButtonComponent', () => { + let component: DoubleButtonComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ DoubleButtonComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DoubleButtonComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/double-button/double-button.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/double-button/double-button.component.ts new file mode 100644 index 00000000..1f9cffe5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/double-button/double-button.component.ts @@ -0,0 +1,32 @@ +import { Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core'; + +export enum DoubleButtonActive { RightButton, LeftButton } + +@Component({ + selector: 'app-double-button', + templateUrl: './double-button.component.html', + styleUrls: ['./double-button.component.scss'], + encapsulation: ViewEncapsulation.Emulated, +}) +export class DoubleButtonComponent { + @Input() rightButtonText: any; + @Input() leftButtonText: any; + @Input() activeButton: DoubleButtonActive; + @Input() className = ''; + @Output() onStateChange = new EventEmitter(); + ButtonState = DoubleButtonActive; + + onRightClick() { + if (this.activeButton === DoubleButtonActive.LeftButton) { + this.activeButton = DoubleButtonActive.RightButton; + this.onStateChange.emit(DoubleButtonActive.RightButton); + } + } + + onLeftClick() { + if (this.activeButton === DoubleButtonActive.RightButton) { + this.activeButton = DoubleButtonActive.LeftButton; + this.onStateChange.emit(DoubleButtonActive.LeftButton); + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-added-dialog/hw-added-dialog.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-added-dialog/hw-added-dialog.component.html new file mode 100644 index 00000000..65c509f8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-added-dialog/hw-added-dialog.component.html @@ -0,0 +1,37 @@ + + + + + +
+ +
{{ 'hardware-wallet.added.added1' | translate }}
+
+
+ +
+
+
{{ 'hardware-wallet.added.characters-warning' | translate }}
+ +
{{ 'hardware-wallet.added.added2' | translate }}
+
+ +
+ + {{ (currentState === states.Finished ? 'hardware-wallet.added.ok' : 'hardware-wallet.general.close') | translate }} + +
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-added-dialog/hw-added-dialog.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-added-dialog/hw-added-dialog.component.scss new file mode 100644 index 00000000..62b0af06 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-added-dialog/hw-added-dialog.component.scss @@ -0,0 +1,11 @@ +@import '../../../../../theme/_variables.scss'; + +.upper-text { + margin-top: 10px; + margin-bottom: 10px; +} + +.warning { + margin: -20px 0 20px; + color: $grey; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-added-dialog/hw-added-dialog.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-added-dialog/hw-added-dialog.component.spec.ts new file mode 100644 index 00000000..b5718ae4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-added-dialog/hw-added-dialog.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HwAddedDialogComponent } from './hw-added-dialog.component'; + +describe('HwAddedDialogComponent', () => { + let component: HwAddedDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ HwAddedDialogComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(HwAddedDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-added-dialog/hw-added-dialog.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-added-dialog/hw-added-dialog.component.ts new file mode 100644 index 00000000..0e1e34b1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-added-dialog/hw-added-dialog.component.ts @@ -0,0 +1,97 @@ +import { Component, Inject, OnDestroy, ViewChild, ElementRef } from '@angular/core'; +import { MatDialogRef, MAT_DIALOG_DATA, MatDialog, MatDialogConfig } from '@angular/material/dialog'; +import { WalletService } from '../../../../services/wallet.service'; +import { HwWalletService, OperationResults } from '../../../../services/hw-wallet.service'; +import { ChildHwDialogParams } from '../hw-options-dialog/hw-options-dialog.component'; +import { HwDialogBaseComponent } from '../hw-dialog-base.component'; +import { FormGroup, FormBuilder, Validators } from '@angular/forms'; +import { Wallet } from '../../../../app.datatypes'; +import { ChangeNameComponent, ChangeNameData } from '../../../pages/wallets/change-name/change-name.component'; +import { MsgBarService } from '../../../../services/msg-bar.service'; + +@Component({ + selector: 'app-hw-added-dialog', + templateUrl: './hw-added-dialog.component.html', + styleUrls: ['./hw-added-dialog.component.scss'], +}) +export class HwAddedDialogComponent extends HwDialogBaseComponent implements OnDestroy { + @ViewChild('input') input: ElementRef; + wallet: Wallet; + form: FormGroup; + maxHwWalletLabelLength = HwWalletService.maxLabelLength; + + private initialLabel: string; + + constructor( + @Inject(MAT_DIALOG_DATA) public data: ChildHwDialogParams, + public dialogRef: MatDialogRef, + private walletService: WalletService, + hwWalletService: HwWalletService, + private formBuilder: FormBuilder, + private dialog: MatDialog, + private msgBarService: MsgBarService, + ) { + super(hwWalletService, dialogRef); + this.operationSubscription = this.walletService.createHardwareWallet().subscribe(wallet => { + this.operationSubscription = this.walletService.getHwFeaturesAndUpdateData(wallet).subscribe(() => { + this.wallet = wallet; + this.initialLabel = wallet.label; + + this.form = this.formBuilder.group({ + label: [wallet.label, Validators.required], + }); + + this.closeIfHwDisconnected = false; + this.currentState = this.states.Finished; + this.data.requestOptionsComponentRefresh(); + + setTimeout(() => this.input.nativeElement.focus()); + }, err => this.processError(err)); + }, err => this.processError(err)); + } + + private processError(err: any) { + if (err.result && err.result === OperationResults.Disconnected) { + this.closeModal(); + + return; + } + + let errorMsg = 'hardware-wallet.general.generic-error-internet'; + + if (err['_body']) { + errorMsg = err['_body']; + } + this.showResult({ + text: errorMsg, + icon: this.msgIcons.Error, + }); + this.data.requestOptionsComponentRefresh(errorMsg); + } + + ngOnDestroy() { + super.ngOnDestroy(); + this.msgBarService.hide(); + } + + saveNameAndCloseModal() { + if (this.form.value.label === this.initialLabel) { + this.closeModal(); + } else { + this.msgBarService.hide(); + + const config = new MatDialogConfig(); + config.width = '400px'; + config.data = new ChangeNameData(); + (config.data as ChangeNameData).wallet = this.wallet; + (config.data as ChangeNameData).newName = this.form.value.label; + this.dialog.open(ChangeNameComponent, config).afterClosed().subscribe(result => { + if (result && !result.errorMsg) { + this.closeModal(); + } else if (result.errorMsg) { + this.msgBarService.showError(result.errorMsg); + } + }); + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-backup-dialog/hw-backup-dialog.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-backup-dialog/hw-backup-dialog.component.html new file mode 100644 index 00000000..d690d9eb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-backup-dialog/hw-backup-dialog.component.html @@ -0,0 +1,35 @@ + +
+ + +
+ + {{ 'hardware-wallet.general.cancel' | translate }} + + + {{ 'hardware-wallet.general.continue' | translate }} + +
+
+ +
+ + + + +
+ + {{ 'hardware-wallet.general.close' | translate }} + +
+
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-backup-dialog/hw-backup-dialog.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-backup-dialog/hw-backup-dialog.component.scss new file mode 100644 index 00000000..e69de29b diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-backup-dialog/hw-backup-dialog.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-backup-dialog/hw-backup-dialog.component.spec.ts new file mode 100644 index 00000000..10473f02 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-backup-dialog/hw-backup-dialog.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HwBackupDialogComponent } from './hw-backup-dialog.component'; + +describe('HwBackupDialogComponent', () => { + let component: HwBackupDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ HwBackupDialogComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(HwBackupDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-backup-dialog/hw-backup-dialog.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-backup-dialog/hw-backup-dialog.component.ts new file mode 100644 index 00000000..8d56af66 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-backup-dialog/hw-backup-dialog.component.ts @@ -0,0 +1,35 @@ +import { Component, Inject } from '@angular/core'; +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { HwWalletService } from '../../../../services/hw-wallet.service'; +import { ChildHwDialogParams } from '../hw-options-dialog/hw-options-dialog.component'; +import { HwDialogBaseComponent } from '../hw-dialog-base.component'; + +@Component({ + selector: 'app-hw-backup-dialog', + templateUrl: './hw-backup-dialog.component.html', + styleUrls: ['./hw-backup-dialog.component.scss'], +}) +export class HwBackupDialogComponent extends HwDialogBaseComponent { + constructor( + @Inject(MAT_DIALOG_DATA) public data: ChildHwDialogParams, + public dialogRef: MatDialogRef, + private hwWalletService: HwWalletService, + ) { + super(hwWalletService, dialogRef); + } + + requestBackup() { + this.currentState = this.states.Processing; + + this.operationSubscription = this.hwWalletService.backup().subscribe( + () => { + this.showResult({ + text: 'hardware-wallet.general.completed', + icon: this.msgIcons.Success, + }); + this.data.requestOptionsComponentRefresh(null, true); + }, + err => this.processResult(err.result), + ); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-change-pin-dialog/hw-change-pin-dialog.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-change-pin-dialog/hw-change-pin-dialog.component.html new file mode 100644 index 00000000..2bcf68ee --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-change-pin-dialog/hw-change-pin-dialog.component.html @@ -0,0 +1,20 @@ + + + + + +
+ + {{ 'hardware-wallet.general.close' | translate }} + +
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-change-pin-dialog/hw-change-pin-dialog.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-change-pin-dialog/hw-change-pin-dialog.component.scss new file mode 100644 index 00000000..e69de29b diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-change-pin-dialog/hw-change-pin-dialog.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-change-pin-dialog/hw-change-pin-dialog.component.spec.ts new file mode 100644 index 00000000..c27ded44 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-change-pin-dialog/hw-change-pin-dialog.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HwChangePinDialogComponent } from './hw-change-pin-dialog.component'; + +describe('HwChangePinDialogComponent', () => { + let component: HwChangePinDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ HwChangePinDialogComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(HwChangePinDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-change-pin-dialog/hw-change-pin-dialog.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-change-pin-dialog/hw-change-pin-dialog.component.ts new file mode 100644 index 00000000..456dd85e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-change-pin-dialog/hw-change-pin-dialog.component.ts @@ -0,0 +1,42 @@ +import { Component, Inject } from '@angular/core'; +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { HwWalletService } from '../../../../services/hw-wallet.service'; +import { ChildHwDialogParams } from '../hw-options-dialog/hw-options-dialog.component'; +import { HwDialogBaseComponent } from '../hw-dialog-base.component'; +import { AppConfig } from '../../../../app.config'; + +@Component({ + selector: 'app-hw-change-pin-dialog', + templateUrl: './hw-change-pin-dialog.component.html', + styleUrls: ['./hw-change-pin-dialog.component.scss'], +}) +export class HwChangePinDialogComponent extends HwDialogBaseComponent { + changingExistingPin: boolean; + + constructor( + @Inject(MAT_DIALOG_DATA) public data: ChildHwDialogParams, + public dialogRef: MatDialogRef, + private hwWalletService: HwWalletService, + ) { + super(hwWalletService, dialogRef); + + this.changingExistingPin = data.walletHasPin; + + this.operationSubscription = this.hwWalletService.getFeatures().flatMap(features => { + if (!AppConfig.useHwWalletDaemon) { + return this.hwWalletService.changePin(features.rawResponse.pinProtection); + } else { + return this.hwWalletService.changePin(features.rawResponse.pin_protection); + } + }).subscribe( + () => { + this.showResult({ + text: 'hardware-wallet.general.completed', + icon: this.msgIcons.Success, + }); + this.data.requestOptionsComponentRefresh(null, true); + }, + err => this.processResult(err.result), + ); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-confirm-address-dialog/hw-confirm-address-dialog.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-confirm-address-dialog/hw-confirm-address-dialog.component.html new file mode 100644 index 00000000..7f018a20 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-confirm-address-dialog/hw-confirm-address-dialog.component.html @@ -0,0 +1,18 @@ + + + + + +
+ + {{ 'hardware-wallet.general.close' | translate }} + +
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-confirm-address-dialog/hw-confirm-address-dialog.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-confirm-address-dialog/hw-confirm-address-dialog.component.scss new file mode 100644 index 00000000..e69de29b diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-confirm-address-dialog/hw-confirm-address-dialog.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-confirm-address-dialog/hw-confirm-address-dialog.component.spec.ts new file mode 100644 index 00000000..4ec1fa3e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-confirm-address-dialog/hw-confirm-address-dialog.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HwConfirmAddressDialogComponent } from './hw-confirm-address-dialog.component'; + +describe('HwConfirmAddressDialogComponent', () => { + let component: HwConfirmAddressDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ HwConfirmAddressDialogComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(HwConfirmAddressDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-confirm-address-dialog/hw-confirm-address-dialog.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-confirm-address-dialog/hw-confirm-address-dialog.component.ts new file mode 100644 index 00000000..be7ff353 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-confirm-address-dialog/hw-confirm-address-dialog.component.ts @@ -0,0 +1,39 @@ +import { Component, Inject } from '@angular/core'; +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { HwWalletService } from '../../../../services/hw-wallet.service'; +import { HwDialogBaseComponent } from '../hw-dialog-base.component'; +import { Address } from '../../../../app.datatypes'; +import { WalletService } from '../../../../services/wallet.service'; + +export class AddressConfirmationParams { + address: Address; + addressIndex: number; + showCompleteConfirmation: boolean; +} + +@Component({ + selector: 'app-hw-confirm-address-dialog', + templateUrl: './hw-confirm-address-dialog.component.html', + styleUrls: ['./hw-confirm-address-dialog.component.scss'], +}) +export class HwConfirmAddressDialogComponent extends HwDialogBaseComponent { + constructor( + @Inject(MAT_DIALOG_DATA) public data: AddressConfirmationParams, + public dialogRef: MatDialogRef, + private hwWalletService: HwWalletService, + private walletService: WalletService, + ) { + super(hwWalletService, dialogRef); + this.operationSubscription = this.hwWalletService.confirmAddress(data.addressIndex).subscribe( + () => { + this.showResult({ + text: data.showCompleteConfirmation ? 'hardware-wallet.confirm-address.confirmation' : 'hardware-wallet.confirm-address.short-confirmation', + icon: this.msgIcons.Success, + }); + this.data.address.confirmed = true; + this.walletService.saveHardwareWallets(); + }, + err => this.processResult(err.result), + ); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-confirm-tx-dialog/hw-confirm-tx-dialog.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-confirm-tx-dialog/hw-confirm-tx-dialog.component.html new file mode 100644 index 00000000..278f33f1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-confirm-tx-dialog/hw-confirm-tx-dialog.component.html @@ -0,0 +1,8 @@ + + + diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-confirm-tx-dialog/hw-confirm-tx-dialog.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-confirm-tx-dialog/hw-confirm-tx-dialog.component.scss new file mode 100644 index 00000000..e69de29b diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-confirm-tx-dialog/hw-confirm-tx-dialog.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-confirm-tx-dialog/hw-confirm-tx-dialog.component.spec.ts new file mode 100644 index 00000000..340205d9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-confirm-tx-dialog/hw-confirm-tx-dialog.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HwConfirmTxDialogComponent } from './hw-confirm-tx-dialog.component'; + +describe('HwConfirmTxDialogComponent', () => { + let component: HwConfirmTxDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ HwConfirmTxDialogComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(HwConfirmTxDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-confirm-tx-dialog/hw-confirm-tx-dialog.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-confirm-tx-dialog/hw-confirm-tx-dialog.component.ts new file mode 100644 index 00000000..6b373b32 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-confirm-tx-dialog/hw-confirm-tx-dialog.component.ts @@ -0,0 +1,20 @@ +import { Component, Inject } from '@angular/core'; +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { HwWalletService, TxData } from '../../../../services/hw-wallet.service'; +import { HwDialogBaseComponent } from '../hw-dialog-base.component'; + +@Component({ + selector: 'app-hw-confirm-tx-dialog', + templateUrl: './hw-confirm-tx-dialog.component.html', + styleUrls: ['./hw-confirm-tx-dialog.component.scss'], +}) +export class HwConfirmTxDialogComponent extends HwDialogBaseComponent { + + constructor( + @Inject(MAT_DIALOG_DATA) public data: TxData[], + public dialogRef: MatDialogRef, + hwWalletService: HwWalletService, + ) { + super(hwWalletService, dialogRef); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-dialog-base.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-dialog-base.component.ts new file mode 100644 index 00000000..a0876604 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-dialog-base.component.ts @@ -0,0 +1,89 @@ +import { Component, OnDestroy, ViewChild } from '@angular/core'; +import { MatDialogRef } from '@angular/material/dialog'; +import { ISubscription } from 'rxjs/Subscription'; +import { MessageIcons } from './hw-message/hw-message.component'; +import { HwWalletService, OperationResults } from '../../../services/hw-wallet.service'; +import { ButtonComponent } from '../button/button.component'; +import { getHardwareWalletErrorMsg } from '../../../utils/errors'; + +export class ResultProcessingResponse { + text: String; + icon: MessageIcons; +} + +export enum States { + Connecting, + Initial, + Processing, + ShowingResult, + Finished, + Other, +} + +@Component({ + template: '', +}) +export class HwDialogBaseComponent implements OnDestroy { + @ViewChild('closeButton') closeButton: ButtonComponent; + + closeIfHwDisconnected = true; + + msgIcons = MessageIcons; + currentState: States = States.Initial; + states = States; + result: ResultProcessingResponse; + + protected operationSubscription: ISubscription; + private hwConnectionSubscription: ISubscription; + + constructor( + private _hwWalletService: HwWalletService, + public _dialogRef: MatDialogRef, + ) { + this.hwConnectionSubscription = this._hwWalletService.walletConnectedAsyncEvent.subscribe(connected => { + this.hwConnectionChanged(connected); + if (!connected && this.closeIfHwDisconnected) { + this.closeModal(); + } + }); + } + + ngOnDestroy() { + if (this.operationSubscription && !this.operationSubscription.closed) { + this.operationSubscription.unsubscribe(); + } + this.hwConnectionSubscription.unsubscribe(); + } + + closeModal() { + this._dialogRef.close(); + } + + hwConnectionChanged(connected: boolean) { + + } + + protected processResult(result: OperationResults, genericError: string = null) { + if (result && result === OperationResults.Disconnected && this.closeIfHwDisconnected) { + this.closeModal(); + } else if (result) { + this.showResult({ + text: getHardwareWalletErrorMsg(null, {result: result}, genericError), + icon: MessageIcons.Error, + }); + } + } + + protected showResult(result: ResultProcessingResponse, focusButton = true) { + if (result) { + this.currentState = States.ShowingResult; + this.result = result; + + setTimeout(() => { + if (this.closeButton && focusButton) { + this.closeButton.focus(); + } + }); + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-generate-seed-dialog/hw-generate-seed-dialog.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-generate-seed-dialog/hw-generate-seed-dialog.component.html new file mode 100644 index 00000000..519c8379 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-generate-seed-dialog/hw-generate-seed-dialog.component.html @@ -0,0 +1,44 @@ + +
+ + +
+
+
+ +
+
+
+ +
+ + {{ 'hardware-wallet.general.cancel' | translate }} + + + {{ 'hardware-wallet.general.continue' | translate }} + +
+
+ + + + + +
+ + {{ 'hardware-wallet.general.close' | translate }} + +
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-generate-seed-dialog/hw-generate-seed-dialog.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-generate-seed-dialog/hw-generate-seed-dialog.component.scss new file mode 100644 index 00000000..71c4849e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-generate-seed-dialog/hw-generate-seed-dialog.component.scss @@ -0,0 +1,4 @@ +.form-field { + margin-bottom: 0px; + margin-top: 15px; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-generate-seed-dialog/hw-generate-seed-dialog.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-generate-seed-dialog/hw-generate-seed-dialog.component.spec.ts new file mode 100644 index 00000000..60d2b856 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-generate-seed-dialog/hw-generate-seed-dialog.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HwGenerateSeedDialogComponent } from './hw-generate-seed-dialog.component'; + +describe('HwGenerateSeedDialogComponent', () => { + let component: HwGenerateSeedDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ HwGenerateSeedDialogComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(HwGenerateSeedDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-generate-seed-dialog/hw-generate-seed-dialog.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-generate-seed-dialog/hw-generate-seed-dialog.component.ts new file mode 100644 index 00000000..1e89a3b9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-generate-seed-dialog/hw-generate-seed-dialog.component.ts @@ -0,0 +1,40 @@ +import { Component, Inject } from '@angular/core'; +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { HwWalletService } from '../../../../services/hw-wallet.service'; +import { ChildHwDialogParams } from '../hw-options-dialog/hw-options-dialog.component'; +import { HwDialogBaseComponent } from '../hw-dialog-base.component'; +import { FormGroup, FormBuilder, Validators } from '@angular/forms'; + +@Component({ + selector: 'app-hw-generate-seed-dialog', + templateUrl: './hw-generate-seed-dialog.component.html', + styleUrls: ['./hw-generate-seed-dialog.component.scss'], +}) +export class HwGenerateSeedDialogComponent extends HwDialogBaseComponent { + form: FormGroup; + + constructor( + @Inject(MAT_DIALOG_DATA) public data: ChildHwDialogParams, + public dialogRef: MatDialogRef, + private hwWalletService: HwWalletService, + formBuilder: FormBuilder, + ) { + super(hwWalletService, dialogRef); + + this.form = formBuilder.group({ + words: [24, Validators.required], + }); + } + + startOperation() { + this.currentState = this.states.Processing; + + this.operationSubscription = this.hwWalletService.generateMnemonic(this.form.controls['words'].value).subscribe( + () => { + this.data.requestOptionsComponentRefresh(); + this.closeModal(); + }, + err => this.processResult(err.result), + ); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-message/hw-message.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-message/hw-message.component.html new file mode 100644 index 00000000..66aefaa2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-message/hw-message.component.html @@ -0,0 +1,32 @@ +
+
+ + done + error_outline + usb + memory + error + touch_app +
+
+
+ {{ upperBigText }} +
+ {{ text }} + {{ linkText }} +
+
+ • {{ output.coins.toString() | amount }} + {{ 'hardware-wallet.create-tx.send-p1' | translate }} {{ output.hours.toString() | amount:false }} + {{ 'hardware-wallet.create-tx.send-p2' | translate }} {{ output.address }} +
+
+ {{ lowerText }} +
+ {{ lowerBigText }} +
+
+ {{ lowerLightText }} +
+
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-message/hw-message.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-message/hw-message.component.scss new file mode 100644 index 00000000..56bd874e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-message/hw-message.component.scss @@ -0,0 +1,70 @@ +@import '../../../../../theme/variables'; + +.content { + display: flex; + + .icon-container { + margin-right: 20px; + + mat-spinner { + display: inline-block; + + height: 36px !important; + width: 36px !important; + + ::ng-deep svg { + height: 36px !important; + width: 36px !important; + } + + ::ng-deep circle { + stroke: $grey-light; + } + } + + i { + font-size: 40px; + } + } + + .text-container { + flex-grow: 1; + align-self: center; + + .link { + color: $blue; + cursor: pointer; + } + + .list { + padding: 10px 0; + + .list-element { + margin: 10px 0; + font-size: 12px; + color: #000000; + font-weight: bold; + } + } + } + + .-red { + color: $red; + } + + .-yellow { + color: $yellow; + } + + .-grey { + color: $grey-light; + } + + .-green { + color: $green; + } + + .-blinking { + animation: alert-blinking 1s linear infinite; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-message/hw-message.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-message/hw-message.component.spec.ts new file mode 100644 index 00000000..3d58fe8e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-message/hw-message.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HwMessageComponent } from './hw-message.component'; + +describe('HwMessageComponent', () => { + let component: HwMessageComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ HwMessageComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(HwMessageComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-message/hw-message.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-message/hw-message.component.ts new file mode 100644 index 00000000..7ba234c8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-message/hw-message.component.ts @@ -0,0 +1,36 @@ +import { Component, Input, Output, EventEmitter } from '@angular/core'; +import { TxData } from '../../../../services/hw-wallet.service'; + +export enum MessageIcons { + None, + Spinner, + Success, + Error, + Usb, + HardwareWallet, + Warning, + Confirm, +} + +@Component({ + selector: 'app-hw-message', + templateUrl: './hw-message.component.html', + styleUrls: ['./hw-message.component.scss'], +}) +export class HwMessageComponent { + @Input() icon: MessageIcons = MessageIcons.HardwareWallet; + @Input() text: string; + @Input() outputsList: TxData[]; + @Input() lowerText: string; + @Input() linkText: string; + @Input() upperBigText: string; + @Input() lowerBigText: string; + @Input() lowerLightText: string; + @Output() linkClicked = new EventEmitter(); + + icons = MessageIcons; + + activateLink() { + this.linkClicked.emit(); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-options-dialog/hw-options-dialog.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-options-dialog/hw-options-dialog.component.html new file mode 100644 index 00000000..c9a98c64 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-options-dialog/hw-options-dialog.component.html @@ -0,0 +1,91 @@ + + + + + + + +
+ + + + +
+ error +
+
{{ (securityWarnings.length > 1 ? 'hardware-wallet.options.security-warnings-title' : 'hardware-wallet.options.security-warning-title') | translate}}
+ +
{{ securityWarnings.length > 1 ? ((i + 1) + ')') : '' }} {{ warning | translate}}
+
+
+
+
+ +
{{ 'hardware-wallet.options.options' | translate }}
+
+ +
+ + +
+
+ + + + + +
+
+
+ +
+ + {{ 'hardware-wallet.general.close' | translate }} + +
+ +
+ + {{ 'hardware-wallet.general.close' | translate }} + +
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-options-dialog/hw-options-dialog.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-options-dialog/hw-options-dialog.component.scss new file mode 100644 index 00000000..96dab871 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-options-dialog/hw-options-dialog.component.scss @@ -0,0 +1,41 @@ +@import '../../../../../theme/variables'; + +.alert-box { + margin-top: 25px; +} + +.options-label { + color: $black; + margin-top: 25px; + margin-bottom: 10px; + font-weight: bold; +} + +.option-buttons-container { + margin: 0 -10px; + + button { + width: 100%; + text-align: left; + padding: 10px 10px; + border-bottom: 1px solid #eff0f0; + + &:first-child { + border-top: 1px solid #eff0f0; + } + + .label { + font-size: 13px; + line-height: 22px; + color: $black; + } + + .-red { + color: $red; + } + } +} + +.-blinking { + animation: alert-blinking 1s linear infinite; +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-options-dialog/hw-options-dialog.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-options-dialog/hw-options-dialog.component.spec.ts new file mode 100644 index 00000000..90b95d7c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-options-dialog/hw-options-dialog.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HwOptionsDialogComponent } from './hw-options-dialog.component'; + +describe('HwOptionsDialogComponent', () => { + let component: HwOptionsDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ HwOptionsDialogComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(HwOptionsDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-options-dialog/hw-options-dialog.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-options-dialog/hw-options-dialog.component.ts new file mode 100644 index 00000000..e2d5f4ce --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-options-dialog/hw-options-dialog.component.ts @@ -0,0 +1,343 @@ +import { Component, OnDestroy, Inject } from '@angular/core'; +import { MatDialogRef, MatDialogConfig, MatDialog, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { HwWalletService, OperationResults } from '../../../../services/hw-wallet.service'; +import { HwWipeDialogComponent } from '../hw-wipe-dialog/hw-wipe-dialog.component'; +import { ISubscription } from 'rxjs/Subscription'; +import { WalletService, HwSecurityWarnings, HwFeaturesResponse } from '../../../../services/wallet.service'; +import { HwAddedDialogComponent } from '../hw-added-dialog/hw-added-dialog.component'; +import { HwGenerateSeedDialogComponent } from '../hw-generate-seed-dialog/hw-generate-seed-dialog.component'; +import { HwBackupDialogComponent } from '../hw-backup-dialog/hw-backup-dialog.component'; +import { Wallet } from '../../../../app.datatypes'; +import { HwChangePinDialogComponent } from '../hw-change-pin-dialog/hw-change-pin-dialog.component'; +import { HwRestoreSeedDialogComponent } from '../hw-restore-seed-dialog/hw-restore-seed-dialog.component'; +import { Observable } from 'rxjs/Observable'; +import { HwDialogBaseComponent } from '../hw-dialog-base.component'; +import { HwWalletDaemonService } from '../../../../services/hw-wallet-daemon.service'; +import { HwRemovePinDialogComponent } from '../hw-remove-pin-dialog/hw-remove-pin-dialog.component'; +import { HwUpdateFirmwareDialogComponent } from '../hw-update-firmware-dialog/hw-update-firmware-dialog.component'; +import { HwUpdateAlertDialogComponent } from '../hw-update-alert-dialog/hw-update-alert-dialog.component'; +import { MsgBarService } from '../../../../services/msg-bar.service'; + +export interface ChildHwDialogParams { + wallet: Wallet; + walletHasPin: boolean; + requestOptionsComponentRefresh: any; +} + +@Component({ + selector: 'app-hw-options-dialog', + templateUrl: './hw-options-dialog.component.html', + styleUrls: ['./hw-options-dialog.component.scss'], +}) +export class HwOptionsDialogComponent extends HwDialogBaseComponent implements OnDestroy { + + closeIfHwDisconnected = false; + + newWalletConnected = false; + otherStateBecauseWrongPin = false; + walletName = ''; + customErrorMsg = ''; + firmwareVersion = ''; + + securityWarnings: string[] = []; + firmwareVersionNotVerified: boolean; + outdatedFirmware: boolean; + needsBackup: boolean; + needsPin: boolean; + + private dialogSubscription: ISubscription; + + private completeRecheckRequested = false; + private recheckSecurityOnlyRequested = false; + private showErrorRequested = false; + private wallet: Wallet; + + constructor( + @Inject(MAT_DIALOG_DATA) private onboarding: boolean, + public dialogRef: MatDialogRef, + private hwWalletService: HwWalletService, + private dialog: MatDialog, + private walletService: WalletService, + private msgBarService: MsgBarService, + ) { + super(hwWalletService, dialogRef); + + this.checkWallet(true); + } + + ngOnDestroy() { + super.ngOnDestroy(); + this.removeDialogSubscription(); + this.removeOperationSubscription(); + this.msgBarService.hide(); + } + + hwConnectionChanged(connected: boolean) { + this.checkWallet(true); + } + + update() { + this.openUpdateDialog(); + } + + generateMnemonic() { + this.openDialog(HwGenerateSeedDialogComponent); + } + + restoreMnemonic() { + this.openDialog(HwRestoreSeedDialogComponent); + } + + changePin() { + this.openDialog(HwChangePinDialogComponent); + } + + removePin() { + this.openDialog(HwRemovePinDialogComponent); + } + + backup() { + this.openDialog(HwBackupDialogComponent); + } + + wipe() { + this.openDialog(HwWipeDialogComponent); + } + + confirmSeed() { + this.openDialog(HwRestoreSeedDialogComponent); + } + + private openDialog(dialogType) { + this.customErrorMsg = ''; + + this.removeDialogSubscription(); + const config = new MatDialogConfig(); + config.width = '450px'; + config.autoFocus = false; + + config.data = { + wallet: this.wallet, + walletHasPin: !this.needsPin, + requestOptionsComponentRefresh: ((error: string = null, recheckSecurityOnly: boolean = false) => { + if (!error) { + if (!recheckSecurityOnly) { + this.completeRecheckRequested = true; + } else { + this.recheckSecurityOnlyRequested = true; + } + } else { + this.showErrorRequested = true; + this.customErrorMsg = error; + } + }), + }; + + this.dialogSubscription = this.dialog.open(dialogType, config) + .afterClosed().subscribe(() => { + if (this.completeRecheckRequested) { + this.checkWallet(); + } else if (this.recheckSecurityOnlyRequested) { + this.updateSecurityWarningsAndData(false, true).subscribe(); + } else if (this.showErrorRequested) { + this.showError(); + } + this.completeRecheckRequested = false; + this.recheckSecurityOnlyRequested = false; + this.showErrorRequested = false; + }); + } + + private removeDialogSubscription() { + if (this.dialogSubscription) { + this.dialogSubscription.unsubscribe(); + } + } + + private updateSecurityWarningsAndData(dontUpdateWallet = false, waitForResetingCurrentWarnings = false): Observable { + if (!waitForResetingCurrentWarnings) { + this.securityWarnings = []; + } + + return this.walletService.getHwFeaturesAndUpdateData(!dontUpdateWallet ? this.wallet : null).map(response => { + if (waitForResetingCurrentWarnings) { + this.securityWarnings = []; + } + + if (response.securityWarnings.includes(HwSecurityWarnings.FirmwareVersionNotVerified)) { + this.firmwareVersionNotVerified = true; + this.securityWarnings.push('hardware-wallet.options.unchecked-version-warning'); + } else { + this.firmwareVersionNotVerified = false; + } + + if (response.securityWarnings.includes(HwSecurityWarnings.OutdatedFirmware)) { + this.outdatedFirmware = true; + this.securityWarnings.push('hardware-wallet.options.outdated-version-warning'); + } else { + this.outdatedFirmware = false; + } + + if (!dontUpdateWallet && response.securityWarnings.includes(HwSecurityWarnings.NeedsBackup)) { + this.needsBackup = true; + this.securityWarnings.push('hardware-wallet.options.backup-warning'); + } else { + this.needsBackup = false; + } + + if (!dontUpdateWallet && response.securityWarnings.includes(HwSecurityWarnings.NeedsPin)) { + this.needsPin = true; + this.securityWarnings.push('hardware-wallet.options.pin-warning'); + } else { + this.needsPin = false; + } + + if (!dontUpdateWallet) { + this.walletName = this.wallet.label; + } + + if (response.walletNameUpdated) { + this.msgBarService.showWarning('hardware-wallet.general.name-updated'); + } + + this.firmwareVersion = response.features.fw_major + '.' + response.features.fw_minor + '.' + response.features.fw_patch; + + return response; + }); + } + + private checkWallet(suggestToUpdate = false) { + this.wallet = null; + this.showResult({ + text: 'hardware-wallet.options.connecting', + icon: this.msgIcons.Spinner, + }, false); + + this.removeOperationSubscription(); + + this.operationSubscription = this.hwWalletService.getDeviceConnected().subscribe(connected => { + if (!connected) { + this.showResult({ + text: 'hardware-wallet.options.disconnected', + icon: this.msgIcons.Usb, + }); + } else { + this.operationSubscription = this.hwWalletService.getFeatures(false).subscribe(result => { + if (result.rawResponse.bootloader_mode) { + this.openUpdateDialog(); + } else { + this.continueCheckingWallet(suggestToUpdate); + } + }, () => this.continueCheckingWallet(suggestToUpdate)); + } + }, err => { + if (err['_body'] && err['_body'] === HwWalletDaemonService.errorConnectingWithTheDaemon) { + this.showResult({ + text: 'hardware-wallet.errors.daemon-connection', + icon: this.msgIcons.Error, + }); + } else { + this.showError(); + } + }); + } + + private continueCheckingWallet(suggestToUpdate) { + this.operationSubscription = this.hwWalletService.getAddresses(1, 0).subscribe( + response => { + this.operationSubscription = this.walletService.wallets.first().subscribe(wallets => { + const alreadySaved = wallets.some(wallet => { + const found = wallet.addresses[0].address === response.rawResponse[0] && wallet.isHardware; + if (found) { + this.wallet = wallet; + this.walletName = wallet.label; + } + + return found; + }); + if (alreadySaved) { + this.operationSubscription = this.updateSecurityWarningsAndData().subscribe(result => { + if (suggestToUpdate && result.securityWarnings.find(warning => warning === HwSecurityWarnings.OutdatedFirmware)) { + this.openUpdateWarning(); + } + + if (!this.onboarding) { + this.currentState = this.states.Finished; + this.newWalletConnected = false; + } else { + this.hwWalletService.showOptionsWhenPossible = true; + this.dialogRef.close(true); + } + }); + } else { + this.openDialog(HwAddedDialogComponent); + } + }); + }, + err => { + if (err.result && err.result === OperationResults.Timeout) { + this.operationSubscription = this.hwWalletService.getFeatures(false).subscribe(result => { + if (result.rawResponse.bootloader_mode) { + this.openUpdateDialog(); + } else { + this.showError(); + } + }, () => this.showError()); + } else if (err.result && err.result === OperationResults.WithoutSeed) { + this.currentState = this.states.Finished; + this.newWalletConnected = true; + + this.operationSubscription = this.updateSecurityWarningsAndData(true).subscribe(result => { + if (suggestToUpdate && result.securityWarnings.find(warning => warning === HwSecurityWarnings.OutdatedFirmware)) { + this.openUpdateWarning(); + } + }); + } else if (err.result && err.result === OperationResults.FailedOrRefused) { + this.currentState = this.states.Other; + this.otherStateBecauseWrongPin = false; + } else if (err.result && err.result === OperationResults.WrongPin) { + this.currentState = this.states.Other; + this.otherStateBecauseWrongPin = true; + } else { + this.processResult(err.result); + } + }, + ); + } + + private removeOperationSubscription() { + if (this.operationSubscription) { + this.operationSubscription.unsubscribe(); + } + } + + private openUpdateWarning() { + const config = new MatDialogConfig(); + config.width = '450px'; + config.autoFocus = false; + + this.dialog.open(HwUpdateAlertDialogComponent, config).afterClosed().subscribe(update => { + if (update) { + this.openUpdateDialog(); + } + }); + } + + private openUpdateDialog() { + const config = new MatDialogConfig(); + config.width = '450px'; + config.autoFocus = false; + + this.dialog.open(HwUpdateFirmwareDialogComponent, config); + + this.closeModal(); + } + + private showError() { + this.showResult({ + text: this.customErrorMsg ? this.customErrorMsg : 'hardware-wallet.general.generic-error', + icon: this.msgIcons.Error, + }); + this.customErrorMsg = ''; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-pin-dialog/hw-pin-dialog.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-pin-dialog/hw-pin-dialog.component.html new file mode 100644 index 00000000..b7fcacca --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-pin-dialog/hw-pin-dialog.component.html @@ -0,0 +1,45 @@ + +
+
+
+ + {{ 'hardware-wallet.enter-pin.instructions-tx' | translate }} + + + {{ 'hardware-wallet.enter-pin.instructions-change' | translate }} + + {{ 'hardware-wallet.enter-pin.instructions' | translate }} + {{ 'hardware-wallet.enter-pin.help' | translate }} +
+ +
+
+
+
+ + + +
+
+ + + +
+
+ + + +
+
+ +
+
+
+ + {{ 'hardware-wallet.general.continue' | translate }} + +
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-pin-dialog/hw-pin-dialog.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-pin-dialog/hw-pin-dialog.component.scss new file mode 100644 index 00000000..304cbb1e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-pin-dialog/hw-pin-dialog.component.scss @@ -0,0 +1,37 @@ +@import '../../../../../theme/variables'; + +mat-input-container { + width: 100%; +} + +.form-field { + input { + font-size: 25px; + letter-spacing: 15px; + text-align: center; + } + + .info { + text-align: center; + + .link { + color: $blue; + cursor: pointer; + } + } +} + +.num-pad-row { + display: flex; + + button { + flex-grow: 1; + height: 50px; + border: #eff0f0 solid 1px; + margin: 2px; + + span { + color: $black; + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-pin-dialog/hw-pin-dialog.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-pin-dialog/hw-pin-dialog.component.spec.ts new file mode 100644 index 00000000..35b64252 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-pin-dialog/hw-pin-dialog.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HwPinDialogComponent } from './hw-pin-dialog.component'; + +describe('HwPinDialogComponent', () => { + let component: HwPinDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ HwPinDialogComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(HwPinDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-pin-dialog/hw-pin-dialog.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-pin-dialog/hw-pin-dialog.component.ts new file mode 100644 index 00000000..671bab9a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-pin-dialog/hw-pin-dialog.component.ts @@ -0,0 +1,88 @@ +import { Component, OnInit, HostListener, Inject } from '@angular/core'; +import { FormBuilder, Validators, FormGroup } from '@angular/forms'; +import { MatDialogRef, MatDialog, MatDialogConfig, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { HwWalletService } from '../../../../services/hw-wallet.service'; +import { HwPinHelpDialogComponent } from '../hw-pin-help-dialog/hw-pin-help-dialog.component'; +import { HwDialogBaseComponent } from '../hw-dialog-base.component'; +import { ChangePinStates } from '../../../../services/hw-wallet-pin.service'; + +export interface HwPinDialogParams { + signingTx: boolean; + changingPin: boolean; + changePinState: ChangePinStates; +} + +@Component({ + selector: 'app-hw-pin-dialog', + templateUrl: './hw-pin-dialog.component.html', + styleUrls: ['./hw-pin-dialog.component.scss'], +}) +export class HwPinDialogComponent extends HwDialogBaseComponent implements OnInit { + form: FormGroup; + changePinStates = ChangePinStates; + buttonsContent = '•'; + + constructor( + @Inject(MAT_DIALOG_DATA) public data: HwPinDialogParams, + public dialogRef: MatDialogRef, + private formBuilder: FormBuilder, + private dialog: MatDialog, + hwWalletService: HwWalletService, + ) { + super(hwWalletService, dialogRef); + } + + ngOnInit() { + this.form = this.formBuilder.group({ + pin: ['', Validators.compose([Validators.required, Validators.minLength(4)])], + }); + } + + get title(): string { + if (!this.data.changingPin) { + return 'hardware-wallet.enter-pin.title'; + } else if (this.data.changePinState === ChangePinStates.RequestingNewPin) { + return 'hardware-wallet.enter-pin.title-change-new'; + } else if (this.data.changePinState === ChangePinStates.ConfirmingNewPin) { + return 'hardware-wallet.enter-pin.title-change-confirm'; + } else { + return 'hardware-wallet.enter-pin.title-change-current'; + } + } + + openHelp() { + this.dialog.open(HwPinHelpDialogComponent, { + width: '450px', + }); + } + + @HostListener('window:keyup', ['$event']) + keyEvent(event: KeyboardEvent) { + const key = parseInt(event.key, 10); + if (key > 0 && key < 10) { + this.addNumber(key.toString()); + } else if (event.keyCode === 8) { + this.removeNumber(); + } else if (event.keyCode === 13) { + this.sendPin(); + } + } + + addNumber(number: string) { + const currentValue: string = this.form.value.pin; + if (currentValue.length < 8) { + this.form.get('pin').setValue(currentValue + number); + } + } + + removeNumber() { + const currentValue: string = this.form.value.pin; + this.form.get('pin').setValue(currentValue.substring(0, currentValue.length - 1)); + } + + sendPin() { + if (this.form.valid) { + this.dialogRef.close(this.form.value.pin); + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-pin-help-dialog/hw-pin-help-dialog.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-pin-help-dialog/hw-pin-help-dialog.component.html new file mode 100644 index 00000000..d3a014f1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-pin-help-dialog/hw-pin-help-dialog.component.html @@ -0,0 +1,5 @@ + +

{{ 'hardware-wallet.pin-help.part1' | translate }}

+

{{ 'hardware-wallet.pin-help.part2' | translate }}

+

{{ 'hardware-wallet.pin-help.part3' | translate }}

+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-pin-help-dialog/hw-pin-help-dialog.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-pin-help-dialog/hw-pin-help-dialog.component.scss new file mode 100644 index 00000000..e69de29b diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-pin-help-dialog/hw-pin-help-dialog.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-pin-help-dialog/hw-pin-help-dialog.component.spec.ts new file mode 100644 index 00000000..f5ade55b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-pin-help-dialog/hw-pin-help-dialog.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HwPinHelpDialogComponent } from './hw-pin-help-dialog.component'; + +describe('HwPinHelpDialogComponent', () => { + let component: HwPinHelpDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ HwPinHelpDialogComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(HwPinHelpDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-pin-help-dialog/hw-pin-help-dialog.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-pin-help-dialog/hw-pin-help-dialog.component.ts new file mode 100644 index 00000000..76730c76 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-pin-help-dialog/hw-pin-help-dialog.component.ts @@ -0,0 +1,14 @@ +import { Component } from '@angular/core'; +import { MatDialogRef } from '@angular/material/dialog'; + +@Component({ + selector: 'app-hw-added-dialog', + templateUrl: './hw-pin-help-dialog.component.html', + styleUrls: ['./hw-pin-help-dialog.component.scss'], +}) +export class HwPinHelpDialogComponent { + + constructor( + public dialogRef: MatDialogRef, + ) { } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-remove-pin-dialog/hw-remove-pin-dialog.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-remove-pin-dialog/hw-remove-pin-dialog.component.html new file mode 100644 index 00000000..0876141f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-remove-pin-dialog/hw-remove-pin-dialog.component.html @@ -0,0 +1,42 @@ + +
+ + +
+ {{ 'hardware-wallet.remove-pin.check' | translate }} + +
+ +
+ + {{ 'hardware-wallet.general.cancel' | translate }} + + + {{ 'hardware-wallet.general.continue' | translate }} + +
+
+ +
+ + + +
+ + {{ 'hardware-wallet.general.close' | translate }} + +
+
+
\ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-remove-pin-dialog/hw-remove-pin-dialog.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-remove-pin-dialog/hw-remove-pin-dialog.component.scss new file mode 100644 index 00000000..e69de29b diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-remove-pin-dialog/hw-remove-pin-dialog.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-remove-pin-dialog/hw-remove-pin-dialog.component.spec.ts new file mode 100644 index 00000000..eb316b55 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-remove-pin-dialog/hw-remove-pin-dialog.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HwRemovePinDialogComponent } from './hw-remove-pin-dialog.component'; + +describe('HwRemovePinDialogComponent', () => { + let component: HwRemovePinDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ HwRemovePinDialogComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(HwRemovePinDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-remove-pin-dialog/hw-remove-pin-dialog.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-remove-pin-dialog/hw-remove-pin-dialog.component.ts new file mode 100644 index 00000000..dd8298e8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-remove-pin-dialog/hw-remove-pin-dialog.component.ts @@ -0,0 +1,41 @@ +import { Component, Inject } from '@angular/core'; +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { HwWalletService } from '../../../../services/hw-wallet.service'; +import { ChildHwDialogParams } from '../hw-options-dialog/hw-options-dialog.component'; +import { HwDialogBaseComponent } from '../hw-dialog-base.component'; + +@Component({ + selector: 'app-hw-remove-pin-dialog', + templateUrl: './hw-remove-pin-dialog.component.html', + styleUrls: ['./hw-remove-pin-dialog.component.scss'], +}) +export class HwRemovePinDialogComponent extends HwDialogBaseComponent { + confirmed = false; + + constructor( + @Inject(MAT_DIALOG_DATA) public data: ChildHwDialogParams, + public dialogRef: MatDialogRef, + private hwWalletService: HwWalletService, + ) { + super(hwWalletService, dialogRef); + } + + setConfirmed(event) { + this.confirmed = event.checked; + } + + requestRemoval() { + this.currentState = this.states.Processing; + + this.operationSubscription = this.hwWalletService.removePin().subscribe( + () => { + this.showResult({ + text: 'hardware-wallet.general.completed', + icon: this.msgIcons.Success, + }); + this.data.requestOptionsComponentRefresh(null, true); + }, + err => this.processResult(err.result), + ); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-restore-seed-dialog/hw-restore-seed-dialog.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-restore-seed-dialog/hw-restore-seed-dialog.component.html new file mode 100644 index 00000000..0ce4ede2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-restore-seed-dialog/hw-restore-seed-dialog.component.html @@ -0,0 +1,51 @@ + + +
+ + +
+
+
+ +
+
+
+ +
{{ 'hardware-wallet.restore-seed.warning' | translate }}
+ +
+ + {{ 'hardware-wallet.general.cancel' | translate }} + + + {{ 'hardware-wallet.general.continue' | translate }} + +
+
+ + + + + +
+ + {{ 'hardware-wallet.general.close' | translate }} + +
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-restore-seed-dialog/hw-restore-seed-dialog.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-restore-seed-dialog/hw-restore-seed-dialog.component.scss new file mode 100644 index 00000000..0f3a026e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-restore-seed-dialog/hw-restore-seed-dialog.component.scss @@ -0,0 +1,11 @@ +@import '../../../../../theme/variables'; +.form-field { + margin-bottom: 0px; + margin-top: 15px; +} + +.warning { + margin-top: 15px; + color: $red; + text-align: center; +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-restore-seed-dialog/hw-restore-seed-dialog.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-restore-seed-dialog/hw-restore-seed-dialog.component.spec.ts new file mode 100644 index 00000000..4a116aee --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-restore-seed-dialog/hw-restore-seed-dialog.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HwRestoreSeedDialogComponent } from './hw-restore-seed-dialog.component'; + +describe('HwRestoreSeedDialogComponent', () => { + let component: HwRestoreSeedDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ HwRestoreSeedDialogComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(HwRestoreSeedDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-restore-seed-dialog/hw-restore-seed-dialog.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-restore-seed-dialog/hw-restore-seed-dialog.component.ts new file mode 100644 index 00000000..4c408dcd --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-restore-seed-dialog/hw-restore-seed-dialog.component.ts @@ -0,0 +1,50 @@ +import { Component, Inject } from '@angular/core'; +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { HwWalletService } from '../../../../services/hw-wallet.service'; +import { ChildHwDialogParams } from '../hw-options-dialog/hw-options-dialog.component'; +import { HwDialogBaseComponent } from '../hw-dialog-base.component'; +import { FormGroup, FormBuilder, Validators } from '@angular/forms'; + +@Component({ + selector: 'app-hw-restore-seed-dialog', + templateUrl: './hw-restore-seed-dialog.component.html', + styleUrls: ['./hw-restore-seed-dialog.component.scss'], +}) +export class HwRestoreSeedDialogComponent extends HwDialogBaseComponent { + form: FormGroup; + justCheckingSeed: boolean; + + constructor( + @Inject(MAT_DIALOG_DATA) public data: ChildHwDialogParams, + public dialogRef: MatDialogRef, + private hwWalletService: HwWalletService, + formBuilder: FormBuilder, + ) { + super(hwWalletService, dialogRef); + + this.form = formBuilder.group({ + words: [24, Validators.required], + }); + + this.justCheckingSeed = !!this.data.wallet; + } + + startOperation() { + this.currentState = this.states.Processing; + + this.operationSubscription = this.hwWalletService.recoverMnemonic(this.form.controls['words'].value, this.justCheckingSeed).subscribe( + () => { + if (!this.justCheckingSeed) { + this.data.requestOptionsComponentRefresh(); + this.closeModal(); + } else { + this.showResult({ + text: 'hardware-wallet.restore-seed.correct-seed', + icon: this.msgIcons.Success, + }); + } + }, + err => this.processResult(err.result, 'hardware-wallet.general.simple-error'), + ); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-update-alert-dialog/hw-update-alert-dialog.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-update-alert-dialog/hw-update-alert-dialog.component.html new file mode 100644 index 00000000..609d6a63 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-update-alert-dialog/hw-update-alert-dialog.component.html @@ -0,0 +1,15 @@ + + + +
+ + {{ 'hardware-wallet.update-firmware-warning.cancel' | translate }} + + + {{ 'hardware-wallet.update-firmware-warning.update' | translate }} + +
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-update-alert-dialog/hw-update-alert-dialog.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-update-alert-dialog/hw-update-alert-dialog.component.scss new file mode 100644 index 00000000..e69de29b diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-update-alert-dialog/hw-update-alert-dialog.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-update-alert-dialog/hw-update-alert-dialog.component.spec.ts new file mode 100644 index 00000000..924da47b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-update-alert-dialog/hw-update-alert-dialog.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HwUpdateAlertDialogComponent } from './hw-update-alert-dialog.component'; + +describe('HwUpdateAlertDialogComponent', () => { + let component: HwUpdateAlertDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ HwUpdateAlertDialogComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(HwUpdateAlertDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-update-alert-dialog/hw-update-alert-dialog.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-update-alert-dialog/hw-update-alert-dialog.component.ts new file mode 100644 index 00000000..621cfbc8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-update-alert-dialog/hw-update-alert-dialog.component.ts @@ -0,0 +1,23 @@ +import { Component } from '@angular/core'; +import { MatDialogRef } from '@angular/material/dialog'; +import { HwWalletService } from '../../../../services/hw-wallet.service'; +import { HwDialogBaseComponent } from '../hw-dialog-base.component'; + +@Component({ + selector: 'app-hw-update-alert-dialog', + templateUrl: './hw-update-alert-dialog.component.html', + styleUrls: ['./hw-update-alert-dialog.component.scss'], +}) +export class HwUpdateAlertDialogComponent extends HwDialogBaseComponent { + + constructor( + public dialogRef: MatDialogRef, + hwWalletService: HwWalletService, + ) { + super(hwWalletService, dialogRef); + } + + update() { + this._dialogRef.close(true); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-update-firmware-dialog/hw-update-firmware-dialog.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-update-firmware-dialog/hw-update-firmware-dialog.component.html new file mode 100644 index 00000000..cfc8b1f5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-update-firmware-dialog/hw-update-firmware-dialog.component.html @@ -0,0 +1,48 @@ + +
+ + +
+ {{ 'hardware-wallet.update-firmware.check' | translate }} + +
+ +
+ + {{ 'hardware-wallet.general.cancel' | translate }} + + + {{ 'hardware-wallet.general.continue' | translate }} + +
+
+ +
+ + + + + + +
+ + {{ 'hardware-wallet.general.close' | translate }} + +
+
+
\ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-update-firmware-dialog/hw-update-firmware-dialog.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-update-firmware-dialog/hw-update-firmware-dialog.component.scss new file mode 100644 index 00000000..e69de29b diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-update-firmware-dialog/hw-update-firmware-dialog.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-update-firmware-dialog/hw-update-firmware-dialog.component.spec.ts new file mode 100644 index 00000000..163e1cf6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-update-firmware-dialog/hw-update-firmware-dialog.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HwUpdateFirmwareDialogComponent } from './hw-update-firmware-dialog.component'; + +describe('HwUpdateFirmwareDialogComponent', () => { + let component: HwUpdateFirmwareDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ HwUpdateFirmwareDialogComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(HwUpdateFirmwareDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-update-firmware-dialog/hw-update-firmware-dialog.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-update-firmware-dialog/hw-update-firmware-dialog.component.ts new file mode 100644 index 00000000..b19dbc62 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-update-firmware-dialog/hw-update-firmware-dialog.component.ts @@ -0,0 +1,153 @@ +import { Component, ViewChild, OnDestroy } from '@angular/core'; +import { MatDialogRef } from '@angular/material/dialog'; +import { HwWalletService, OperationResults } from '../../../../services/hw-wallet.service'; +import { HwDialogBaseComponent } from '../hw-dialog-base.component'; +import { ButtonComponent } from '../../button/button.component'; +import { getHardwareWalletErrorMsg } from '../../../../utils/errors'; +import { TranslateService } from '@ngx-translate/core'; +import { MsgBarService } from '../../../../services/msg-bar.service'; +import { ISubscription } from 'rxjs/Subscription'; +import { Observable } from 'rxjs/Observable'; + +@Component({ + selector: 'app-hw-update-firmware-dialog', + templateUrl: './hw-update-firmware-dialog.component.html', + styleUrls: ['./hw-update-firmware-dialog.component.scss'], +}) +export class HwUpdateFirmwareDialogComponent extends HwDialogBaseComponent implements OnDestroy { + + closeIfHwDisconnected = false; + + @ViewChild('button') button: ButtonComponent; + + currentState = this.states.Connecting; + confirmed = false; + + deviceInBootloaderMode = false; + deviceHasFirmware = true; + + private checkDeviceSubscription: ISubscription; + + get title(): string { + if (this.currentState === this.states.Connecting) { + return 'hardware-wallet.update-firmware.title-connecting'; + } else if (this.deviceHasFirmware) { + return 'hardware-wallet.update-firmware.title-update'; + } + + return 'hardware-wallet.update-firmware.title-install'; + } + + get text(): string { + if (!this.deviceHasFirmware) { + return 'hardware-wallet.update-firmware.text-no-firmware'; + } + + if (this.deviceInBootloaderMode) { + return 'hardware-wallet.update-firmware.text-bootloader'; + } + + return 'hardware-wallet.update-firmware.text-not-bootloader'; + } + + constructor( + public dialogRef: MatDialogRef, + private hwWalletService: HwWalletService, + private msgBarService: MsgBarService, + private translateService: TranslateService, + ) { + super(hwWalletService, dialogRef); + this.checkDevice(false); + } + + ngOnDestroy() { + super.ngOnDestroy(); + this.msgBarService.hide(); + this.closeCheckDeviceSubscription(); + } + + setConfirmed(event) { + this.confirmed = event.checked; + } + + startUpdating() { + this.msgBarService.hide(); + this.showResult({ + text: 'hardware-wallet.update-firmware.text-downloading', + icon: this.msgIcons.Spinner, + }); + + this.closeCheckDeviceSubscription(); + + this.operationSubscription = this.hwWalletService.updateFirmware(() => this.currentState = this.states.Processing).subscribe( + () => { + this.showResult({ + text: 'hardware-wallet.update-firmware.finished', + icon: this.msgIcons.Success, + }); + }, + err => { + if (err.result !== null && err.result !== undefined && err.result === OperationResults.Success) { + this.showResult({ + text: 'hardware-wallet.update-firmware.finished', + icon: this.msgIcons.Success, + }); + } else if (err.result && err.result === OperationResults.Timeout) { + this.showResult({ + text: 'hardware-wallet.update-firmware.timeout', + icon: this.msgIcons.Error, + }); + } else { + if (err.result) { + const errorMsg = getHardwareWalletErrorMsg(this.translateService, err); + setTimeout(() => { + this.msgBarService.showError(errorMsg); + }); + } else { + setTimeout(() => { + this.msgBarService.showError(err); + }); + } + + this.checkDevice(false); + + this.currentState = this.states.Initial; + } + }, + ); + } + + private checkDevice(delay = true) { + this.closeCheckDeviceSubscription(); + + this.checkDeviceSubscription = Observable.of(0).delay(delay ? 1000 : 0).flatMap(() => this.hwWalletService.getFeatures(false)).subscribe(response => { + this.deviceInBootloaderMode = response.rawResponse.bootloader_mode; + if (this.deviceInBootloaderMode) { + this.deviceHasFirmware = response.rawResponse.firmware_present; + } else { + this.deviceHasFirmware = true; + } + + if (this.currentState === this.states.Connecting) { + this.currentState = this.states.Initial; + } + + this.checkDevice(); + }, () => { + this.deviceInBootloaderMode = false; + this.deviceHasFirmware = true; + + if (this.currentState === this.states.Connecting) { + this.currentState = this.states.Initial; + } + + this.checkDevice(); + }); + } + + private closeCheckDeviceSubscription() { + if (this.checkDeviceSubscription) { + this.checkDeviceSubscription.unsubscribe(); + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-wipe-dialog/hw-wipe-dialog.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-wipe-dialog/hw-wipe-dialog.component.html new file mode 100644 index 00000000..9d4a5834 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-wipe-dialog/hw-wipe-dialog.component.html @@ -0,0 +1,43 @@ + +
+ + +
+ {{ 'hardware-wallet.wipe.confirm-delete' | translate }} + +
+ +
+ + {{ 'hardware-wallet.general.cancel' | translate }} + + + {{ 'hardware-wallet.general.continue' | translate }} + +
+
+ +
+ + + + +
+ + {{ 'hardware-wallet.general.close' | translate }} + +
+
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-wipe-dialog/hw-wipe-dialog.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-wipe-dialog/hw-wipe-dialog.component.scss new file mode 100644 index 00000000..e69de29b diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-wipe-dialog/hw-wipe-dialog.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-wipe-dialog/hw-wipe-dialog.component.spec.ts new file mode 100644 index 00000000..b2ee2076 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-wipe-dialog/hw-wipe-dialog.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HwWipeDialogComponent } from './hw-wipe-dialog.component'; + +describe('HwWipeDialogComponent', () => { + let component: HwWipeDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ HwWipeDialogComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(HwWipeDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-wipe-dialog/hw-wipe-dialog.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-wipe-dialog/hw-wipe-dialog.component.ts new file mode 100644 index 00000000..31942cf7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/hardware-wallet/hw-wipe-dialog/hw-wipe-dialog.component.ts @@ -0,0 +1,52 @@ +import { Component, Inject } from '@angular/core'; +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { HwWalletService } from '../../../../services/hw-wallet.service'; +import { WalletService } from '../../../../services/wallet.service'; +import { ChildHwDialogParams } from '../hw-options-dialog/hw-options-dialog.component'; +import { HwDialogBaseComponent } from '../hw-dialog-base.component'; + +@Component({ + selector: 'app-hw-wipe-dialog', + templateUrl: './hw-wipe-dialog.component.html', + styleUrls: ['./hw-wipe-dialog.component.scss'], +}) +export class HwWipeDialogComponent extends HwDialogBaseComponent { + showDeleteFromList = true; + deleteFromList = true; + + constructor( + @Inject(MAT_DIALOG_DATA) public data: ChildHwDialogParams, + public dialogRef: MatDialogRef, + private hwWalletService: HwWalletService, + private walletService: WalletService, + ) { + super(hwWalletService, dialogRef); + + if (!data.wallet) { + this.showDeleteFromList = false; + this.deleteFromList = false; + } + } + + setDeleteFromList(event) { + this.deleteFromList = event.checked; + } + + requestWipe() { + this.currentState = this.states.Processing; + + this.operationSubscription = this.hwWalletService.wipe().subscribe( + () => { + this.showResult({ + text: 'hardware-wallet.general.completed', + icon: this.msgIcons.Success, + }); + this.data.requestOptionsComponentRefresh(); + if (this.deleteFromList) { + this.walletService.deleteHardwareWallet(this.data.wallet).subscribe(); + } + }, + err => this.processResult(err.result), + ); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/header.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/header.component.html new file mode 100644 index 00000000..55f2ef24 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/header.component.html @@ -0,0 +1,62 @@ +
+
+ +
+
+

{{ percentage | percent:'1.2-2' }}

+

{{ coins | amount:true:'first' }} {{ coins | amount:true:'last' }}

+

 

+

+ + {{ (coins * price) | currency:'USD':'symbol':'1.2-2' }} + - + ({{ price | currency:'USD':'symbol':'1.2-2' }}) + + {{ 'common.loading' | translate }} +

+
+
+
+

+ {{ 'header.syncing-blocks' | translate }} + {{ current && highest ? '(' + current + '/' + highest + ')' : '...' }} +

+

{{ hours | amount:false }}

+
+
+ + + +
+ {{ 'header.update1' | translate }} + v{{ appService.lastestVersion }} + {{ 'header.update2' | translate }} +
+
+ +
+ {{ 'header.errors.no-backend1' | translate }} + {{ 'header.errors.no-backend2' | translate }} + {{ 'header.errors.no-backend3' | translate }} +
+
{{ 'header.errors.csrf' | translate }}
+
+ +
{{ 'header.errors.no-connections' | translate }}
+
+ +
+ {{ 'header.pending-txs1' | translate }} + {{ 'header.pending-txs2' | translate }} + {{ 'header.pending-txs3' | translate }} +
+
+ {{ 'header.synchronizing' | translate }} +
+
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/header.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/header.component.scss new file mode 100644 index 00000000..a07d3d1d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/header.component.scss @@ -0,0 +1,73 @@ +@import '../../../../theme/variables'; + +.-container { + background-color: #fbfbfb; + border-bottom: 2px solid rgba(30, 34, 39, 0.05); +} + +.large-header { + background: $gradient-blue-dark; /* For browsers that do not support gradients */ + background: -webkit-linear-gradient(left top, $gradient-blue-dark-transparent, $gradient-blue-light-transparent), url('../../../../assets/img/header.png') center center no-repeat; /* For Safari 5.1 to 6.0 */ + background: -o-linear-gradient(bottom right, $gradient-blue-dark-transparent, $gradient-blue-light-transparent), url('../../../../assets/img/header.png') center center no-repeat; /* For Opera 11.1 to 12.0 */ + background: -moz-linear-gradient(bottom right, $gradient-blue-dark-transparent, $gradient-blue-light-transparent), url('../../../../assets/img/header.png') center center no-repeat; /* For Firefox 3.6 to 15 */ + background: linear-gradient(to bottom right, $gradient-blue-dark-transparent, $gradient-blue-light-transparent), url('../../../../assets/img/header.png') center center no-repeat; /* Standard syntax */ + background-size: 100% auto; + display: flex; + flex-flow: column; + align-items: stretch; + min-height: 190px; +} + +.balance-container { + align-items: center; + color: $white; + display: flex; + flex: 1 1 auto; + font-size: 12px; + justify-content: center; + text-align: center; + + .balance { + .coins { + line-height: 1; + margin: 0 0 0.5em; + + span { + font-size: 4em; + } + } + } + + .dollars { + margin: 0; + } +} + +.hour-balance { + text-align: center; + + p { + background-color: rgba(255, 255, 255, 0.3); + border-radius: 15px; + color: $black; + display: inline-block; + font-size: 12px; + line-height: 22px; + margin: 1em 0 2em; + padding: 0 30px; + } +} + +.notification-bar { + background-color: #F44A4D; + color:#FBFBFB; + + div { + margin: auto; + + a { + text-decoration: none; + color: #FFEBEE; + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/header.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/header.component.spec.ts new file mode 100644 index 00000000..89380b40 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/header.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HeaderComponent } from './header.component'; + +describe('HeaderComponent', () => { + let component: HeaderComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ HeaderComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(HeaderComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/header.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/header.component.ts new file mode 100644 index 00000000..cccb8605 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/header.component.ts @@ -0,0 +1,101 @@ +import { Component, Input, OnDestroy, OnInit } from '@angular/core'; +import { PriceService } from '../../../services/price.service'; +import { ISubscription } from 'rxjs/Subscription'; +import { WalletService } from '../../../services/wallet.service'; +import { BlockchainService } from '../../../services/blockchain.service'; +import { AppService } from '../../../services/app.service'; +import 'rxjs/add/operator/skip'; +import 'rxjs/add/operator/take'; +import { BigNumber } from 'bignumber.js'; +import { NetworkService } from '../../../services/network.service'; +import { AppConfig } from '../../../app.config'; + +@Component({ + selector: 'app-header', + templateUrl: './header.component.html', + styleUrls: ['./header.component.scss'], +}) +export class HeaderComponent implements OnInit, OnDestroy { + @Input() headline: string; + + addresses = []; + current: number; + highest: number; + percentage: number; + querying = true; + hasPendingTxs: boolean; + price: number; + synchronized = true; + walletDownloadUrl = AppConfig.walletDownloadUrl; + + private subscriptionsGroup: ISubscription[] = []; + private synchronizedSubscription: ISubscription; + // This should be deleted. View the comment in the constructor. + // private fetchVersionError: string; + + get loading() { + return !this.current || !this.highest || this.current !== this.highest || !this.coins || this.coins === 'NaN' || !this.hours || this.hours === 'NaN'; + } + + get coins() { + let coins = new BigNumber('0'); + this.addresses.map(addr => coins = coins.plus(addr.coins)); + + return coins.decimalPlaces(6).toString(); + } + + get hours() { + let hours = new BigNumber('0'); + this.addresses.map(addr => hours = hours.plus(addr.hours)); + + return hours.decimalPlaces(0).toString(); + } + + constructor( + public appService: AppService, + public networkService: NetworkService, + private blockchainService: BlockchainService, + private priceService: PriceService, + private walletService: WalletService, + ) { } + + ngOnInit() { + this.subscriptionsGroup.push(this.blockchainService.progress + .filter(response => !!response) + .subscribe(response => { + this.querying = false; + this.highest = response.highest; + this.current = response.current; + this.percentage = this.current && this.highest ? (this.current / this.highest) : 0; + + // Adding the code here prevents the warning from flashing if the wallet is synchronized. Also, adding the + // subscription to this.subscription causes problems. + if (!this.synchronizedSubscription) { + this.synchronizedSubscription = this.blockchainService.synchronized.subscribe(value => this.synchronized = value); + } + })); + + this.subscriptionsGroup.push(this.priceService.price.subscribe(price => this.price = price)); + + this.subscriptionsGroup.push(this.walletService.allAddresses().subscribe(addresses => { + this.addresses = addresses.reduce((array, item) => { + if (!array.find(addr => addr.address === item.address)) { + array.push(item); + } + + return array; + }, []); + })); + + this.subscriptionsGroup.push(this.walletService.pendingTransactions().subscribe(txs => { + this.hasPendingTxs = txs.user.length > 0; + })); + } + + ngOnDestroy() { + this.subscriptionsGroup.forEach(sub => sub.unsubscribe()); + if (this.synchronizedSubscription) { + this.synchronizedSubscription.unsubscribe(); + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/nav-bar/nav-bar.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/nav-bar/nav-bar.component.html new file mode 100644 index 00000000..2a06b306 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/nav-bar/nav-bar.component.html @@ -0,0 +1,35 @@ +
+
+
+ + {{ 'title.wallets' | translate }} +
+
+ + {{ 'title.send' | translate }} +
+
+ + {{ 'title.history' | translate }} +
+
+
+ + {{ 'title.buy-coin' | translate }} +
+
+ + {{ 'title.buy-coin' | translate }} +
+ +
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/nav-bar/nav-bar.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/nav-bar/nav-bar.component.scss new file mode 100644 index 00000000..ebd1b58d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/nav-bar/nav-bar.component.scss @@ -0,0 +1,41 @@ +@import '../../../../../theme/variables'; + +:host { + background-color: #fbfbfb; + min-height: 66px; +} + +.-buttons { + display: flex; + width: 100%; + + .-button { + cursor: pointer; + padding: 0 20px; + + img { + display: inline-block; + float: left; + height: 66px; + padding: 17px 0; + width: 32px; + } + + span { + display: inline-block; + font-size: 14px; + height: 66px; + line-height: 66px; + margin: 0 5px; + } + } + + .-low-opacity { + opacity: 0.2; + } + + .-switch { + align-self: center; + padding: 0 20px; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/nav-bar/nav-bar.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/nav-bar/nav-bar.component.spec.ts new file mode 100644 index 00000000..98bcd493 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/nav-bar/nav-bar.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { NavBarComponent } from './nav-bar.component'; + +describe('NavBarComponent', () => { + let component: NavBarComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ NavBarComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(NavBarComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/nav-bar/nav-bar.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/nav-bar/nav-bar.component.ts new file mode 100644 index 00000000..1cdee46e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/nav-bar/nav-bar.component.ts @@ -0,0 +1,22 @@ +import { Component } from '@angular/core'; +import { AppConfig } from '../../../../app.config'; +import { NavBarService } from '../../../../services/nav-bar.service'; +import { environment } from '../../../../../environments/environment'; + +@Component({ + selector: 'app-nav-bar', + templateUrl: './nav-bar.component.html', + styleUrls: ['./nav-bar.component.scss'], +}) +export class NavBarComponent { + otcEnabled = AppConfig.otcEnabled; + exchangeEnabled = !!environment.swaplab.apiKey; + + constructor( + public navbarService: NavBarService, + ) { } + + changeActiveComponent(value) { + this.navbarService.setActiveComponent(value); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/top-bar/top-bar.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/top-bar/top-bar.component.html new file mode 100644 index 00000000..e50c4e6c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/top-bar/top-bar.component.html @@ -0,0 +1,30 @@ +
+
+ {{ headline }} +
+
+ + + + + + + + + + + {{ 'title.explorer' | translate }} +
+
+ + {{ language.name }} +
+
+ + + +
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/top-bar/top-bar.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/top-bar/top-bar.component.scss new file mode 100644 index 00000000..5f21efb2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/top-bar/top-bar.component.scss @@ -0,0 +1,56 @@ +@import '../../../../../theme/variables'; + +:host { + display: flex; + color: $white; + width: 100%; +} + +.buttons-left { + display: inline-block; + padding: 0 10px; + width: 120px; +} + +.title { + font-size: $font-size-standard; + font-weight: 700; + display: inline; + flex: 1 1 auto; + letter-spacing: $letter-spacing-wide; + line-height: 50px; + text-align: center; +} + +.buttons-right { + display: inline-block; + text-align: right; + width: 120px; + + button { + display: inline-block; + } +} + +button { + height: 50px; + width: 50px; +} + +.color-primary { + color: #0072FF; +} + +.separator { + width: 100%; + height: 2px; + background-color: $grey-very-light; + margin: 8px 0px; +} + +.flag { + width: 16px; + height: 16px; + position: relative; + top: 3px; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/top-bar/top-bar.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/top-bar/top-bar.component.spec.ts new file mode 100644 index 00000000..2028774e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/top-bar/top-bar.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { TopBarComponent } from './top-bar.component'; + +describe('TopBarComponent', () => { + let component: TopBarComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ TopBarComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(TopBarComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/top-bar/top-bar.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/top-bar/top-bar.component.ts new file mode 100644 index 00000000..7874a8e2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/header/top-bar/top-bar.component.ts @@ -0,0 +1,43 @@ +import { Component, Input, OnInit, OnDestroy } from '@angular/core'; +import { Subscription } from 'rxjs/Subscription'; +import { AppService } from '../../../../services/app.service'; +import { LanguageData, LanguageService } from '../../../../services/language.service'; +import { openChangeLanguageModal } from '../../../../utils'; +import { MatDialog } from '@angular/material'; + +@Component({ + selector: 'app-top-bar', + templateUrl: './top-bar.component.html', + styleUrls: ['./top-bar.component.scss'], +}) +export class TopBarComponent implements OnInit, OnDestroy { + @Input() headline: string; + + language: LanguageData; + + private subscription: Subscription; + + constructor( + public appService: AppService, + private languageService: LanguageService, + private dialog: MatDialog, + ) {} + + ngOnInit() { + this.subscription = this.languageService.currentLanguage + .subscribe(lang => this.language = lang); + } + + ngOnDestroy() { + this.subscription.unsubscribe(); + } + + changelanguage() { + openChangeLanguageModal(this.dialog) + .subscribe(response => { + if (response) { + this.languageService.changeLanguage(response); + } + }); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/loading-content/loading-content.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/loading-content/loading-content.component.html new file mode 100644 index 00000000..0c170845 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/loading-content/loading-content.component.html @@ -0,0 +1,10 @@ +
+
+ +

{{ 'common.loading' | translate }}

+
+
+ announcement +

{{ noDataText | translate }}

+
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/loading-content/loading-content.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/loading-content/loading-content.component.scss new file mode 100644 index 00000000..796f89ab --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/loading-content/loading-content.component.scss @@ -0,0 +1,25 @@ +@import '../../../../theme/variables'; + +.-content { + text-align: center; + margin: 50px 0; + color: $grey; + font-size: 13px; + + p { + margin-top: 15px; + } + + i { + color: $grey-light; + font-size: 40px; + } + + mat-spinner { + display: inline-block; + + ::ng-deep circle { + stroke: $grey-light; + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/loading-content/loading-content.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/loading-content/loading-content.component.spec.ts new file mode 100644 index 00000000..b845f362 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/loading-content/loading-content.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { LoadingContentComponent } from './loading-content.component'; + +describe('LoadingContentComponent', () => { + let component: LoadingContentComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ LoadingContentComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(LoadingContentComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/loading-content/loading-content.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/loading-content/loading-content.component.ts new file mode 100644 index 00000000..7416bb98 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/loading-content/loading-content.component.ts @@ -0,0 +1,11 @@ +import { Component, Input } from '@angular/core'; + +@Component({ + selector: 'app-loading-content', + templateUrl: './loading-content.component.html', + styleUrls: ['./loading-content.component.scss'], +}) +export class LoadingContentComponent { + @Input() isLoading = true; + @Input() noDataText: string; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/modal/modal.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/modal/modal.component.html new file mode 100644 index 00000000..8b71cbfe --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/modal/modal.component.html @@ -0,0 +1,9 @@ +
+ {{ headline }} + +
+
+ + + +
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/modal/modal.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/modal/modal.component.scss new file mode 100644 index 00000000..dec47c92 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/modal/modal.component.scss @@ -0,0 +1,35 @@ +.-header { + background-color: #f7f7f7; + border-top-left-radius: 5px; + border-top-right-radius: 5px; + line-height: 50px; + position: relative; + text-align: center; + + img { + cursor: pointer; + height: 32px; + position: absolute; + right: 9px; + top: 9px; + } +} + +.-body { + background-color: #fbfbfb; + padding: 0px 24px; +} + +mat-dialog-content::before { + content: ''; + padding-top: 24px; + height: 0px; + display: block; +} + +mat-dialog-content::after { + content: ''; + padding-top: 24px; + height: 0px; + display: block; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/modal/modal.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/modal/modal.component.spec.ts new file mode 100644 index 00000000..e5724549 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/modal/modal.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ModalComponent } from './modal.component'; + +describe('ModalComponent', () => { + let component: ModalComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ModalComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ModalComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/modal/modal.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/modal/modal.component.ts new file mode 100644 index 00000000..e5f2b4c1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/modal/modal.component.ts @@ -0,0 +1,25 @@ +import { Component, Input, OnChanges, SimpleChanges } from '@angular/core'; +import { MatDialogRef } from '@angular/material/dialog'; + +@Component({ + selector: 'app-modal', + templateUrl: './modal.component.html', + styleUrls: ['./modal.component.scss'], +}) +export class ModalComponent implements OnChanges { + @Input() dialog: MatDialogRef; + @Input() headline: string; + @Input() disableDismiss: boolean; + + closePopup() { + if (!this.disableDismiss) { + this.dialog.close(); + } + } + + ngOnChanges(changes: SimpleChanges) { + if (changes.disableDismiss) { + this.dialog.disableClose = changes.disableDismiss.currentValue; + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/msg-bar/msg-bar.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/msg-bar/msg-bar.component.html new file mode 100644 index 00000000..652ac1e2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/msg-bar/msg-bar.component.html @@ -0,0 +1,10 @@ +
+
+
{{ config.icon }}
+
+
{{ config.title | translate }}
+
{{ config.text | translate }}
+
+
close
+
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/msg-bar/msg-bar.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/msg-bar/msg-bar.component.scss new file mode 100644 index 00000000..26933342 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/msg-bar/msg-bar.component.scss @@ -0,0 +1,59 @@ +@import '../../../../theme/variables'; + +.main-container { + position: fixed; + bottom: 0px; + width: 100%; + z-index: 1000000; + display: flex; + flex-direction: row; + justify-content: center; +} + +.internal-container { + color: white; + width: fit-content; + min-width: 40%; + max-width: 90%; + display: flex; + padding: 10px; + border-top-left-radius: 5px; + border-top-right-radius: 5px; +} + +.red-background { + background-color: rgba(255, 0, 0, 0.7); +} + +.green-background { + background-color: rgba(31, 177, 31, 0.7); +} + +.yellow-background { + background-color: rgba(255, 94, 0, 0.7); +} + +.icon-container { + margin-right: 10px; +} + +.text-container { + flex-grow: 1; + margin-right: 10px; + + .title { + font-size: 15px; + margin-top: -1px; + } + + .text { + font-size: 13px; + margin-top: 2px; + } +} + +.close-container { + mat-icon { + cursor: pointer; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/msg-bar/msg-bar.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/msg-bar/msg-bar.component.spec.ts new file mode 100644 index 00000000..bfe072b7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/msg-bar/msg-bar.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { MsgBarComponent } from './msg-bar.component'; + +describe('MsgBarComponent', () => { + let component: MsgBarComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ MsgBarComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(MsgBarComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/msg-bar/msg-bar.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/msg-bar/msg-bar.component.ts new file mode 100644 index 00000000..aa94f505 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/msg-bar/msg-bar.component.ts @@ -0,0 +1,45 @@ +import { Component } from '@angular/core'; + +export enum MsgBarIcons { + Error = 'error', + Done = 'done', + Warning = 'warning', +} + +export enum MsgBarColors { + Red = 'red-background', + Green = 'green-background', + Yellow = 'yellow-background', +} + +export class MsgBarConfig { + title?: string; + text: string; + icon?: MsgBarIcons; + color?: MsgBarColors; +} + +@Component({ + selector: 'app-msg-bar', + templateUrl: './msg-bar.component.html', + styleUrls: ['./msg-bar.component.scss'], +}) +export class MsgBarComponent { + config = new MsgBarConfig(); + visible = false; + + constructor() { } + + show() { + if (this.visible) { + this.visible = false; + setTimeout(() => this.visible = true, 32); + } else { + this.visible = true; + } + } + + hide() { + this.visible = false; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/multiple-destinations-dialog/multiple-destinations-dialog.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/multiple-destinations-dialog/multiple-destinations-dialog.component.html new file mode 100644 index 00000000..cd12de95 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/multiple-destinations-dialog/multiple-destinations-dialog.component.html @@ -0,0 +1,15 @@ + +
+ {{ 'send.bulk-send.indications' | translate }} +
+
+
+ +
+
+
+ + {{ 'send.bulk-send.process' | translate }} + +
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/multiple-destinations-dialog/multiple-destinations-dialog.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/multiple-destinations-dialog/multiple-destinations-dialog.component.scss new file mode 100644 index 00000000..f8e227cd --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/multiple-destinations-dialog/multiple-destinations-dialog.component.scss @@ -0,0 +1,3 @@ +.form-container { + margin-top: 20px; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/multiple-destinations-dialog/multiple-destinations-dialog.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/multiple-destinations-dialog/multiple-destinations-dialog.component.spec.ts new file mode 100644 index 00000000..85ad3e28 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/multiple-destinations-dialog/multiple-destinations-dialog.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { MultipleDestinationsDialogComponent } from './multiple-destinations-dialog.component'; + +describe('MultipleDestinationsDialogComponent', () => { + let component: MultipleDestinationsDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ MultipleDestinationsDialogComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(MultipleDestinationsDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/multiple-destinations-dialog/multiple-destinations-dialog.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/multiple-destinations-dialog/multiple-destinations-dialog.component.ts new file mode 100644 index 00000000..4b0b74ff --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/multiple-destinations-dialog/multiple-destinations-dialog.component.ts @@ -0,0 +1,83 @@ +import { Component, OnInit, OnDestroy, Inject } from '@angular/core'; +import { FormBuilder, FormGroup } from '@angular/forms'; +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { MsgBarService } from '../../../services/msg-bar.service'; + +@Component({ + selector: 'app-multiple-destinations-dialog', + templateUrl: './multiple-destinations-dialog.component.html', + styleUrls: ['./multiple-destinations-dialog.component.scss'], +}) +export class MultipleDestinationsDialogComponent implements OnInit, OnDestroy { + form: FormGroup; + + constructor( + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) private data: string, + private formBuilder: FormBuilder, + private msgBarService: MsgBarService, + ) { } + + ngOnInit() { + this.form = this.formBuilder.group({ + data: [this.data], + }); + } + + ngOnDestroy() { + this.msgBarService.hide(); + } + + processData() { + try { + if ((this.form.value.data as string).trim().length === 0) { + this.msgBarService.showError('send.bulk-send.error-no-data'); + + return; + } + + let entries = (this.form.value.data as string).split(/\r?\n/); + if (!entries || entries.length === 0) { + this.msgBarService.showError('send.bulk-send.error-no-data'); + + return; + } + + entries = entries.filter(entry => entry.trim().length > 0); + + const firstElementParts = entries[0].split(',').length; + if (firstElementParts !== 2 && firstElementParts !== 3) { + this.msgBarService.showError('send.bulk-send.error-invalid-data'); + + return; + } + + const splitedEntries = []; + let consistentNumberOfParts = true; + entries.forEach((entry: string, i: number) => { + splitedEntries[i] = entry.split(','); + if (splitedEntries[i].length !== firstElementParts) { + consistentNumberOfParts = false; + } + }); + + if (!consistentNumberOfParts) { + this.msgBarService.showError('send.bulk-send.error-inconsistent-data'); + + return; + } + + const response = []; + splitedEntries.forEach((entry, i) => { + response[i] = []; + (entry as string[]).forEach((part, j) => { + response[i][j] = part.trim(); + }); + }); + + this.dialogRef.close(response); + } catch (e) { + this.msgBarService.showError('send.bulk-send.error-invalid-data'); + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/password-dialog/password-dialog.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/password-dialog/password-dialog.component.html new file mode 100644 index 00000000..8f9ac685 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/password-dialog/password-dialog.component.html @@ -0,0 +1,19 @@ + +

{{ data.description | translate }}

+
+
+ + +
+
+ + +
+
+ {{ 'password.reset-link' | translate }} +
+ + {{ 'password.button' | translate }} + +
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/password-dialog/password-dialog.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/password-dialog/password-dialog.component.scss new file mode 100644 index 00000000..ec05c939 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/password-dialog/password-dialog.component.scss @@ -0,0 +1,25 @@ +@import '../../../../theme/variables'; + +.-buttons { + text-align: center; +} + +.-info { + margin: 5px 0 25px; + color: $grey; + font-size: 12px; + line-height: 1.5; +} + +.-warning { + color: $red; +} + +.link { + font-size: 13px; + width: 100%; + display: inline-block; + text-align: center; + text-decoration: none; + color: $gradient-blue-dark; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/password-dialog/password-dialog.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/password-dialog/password-dialog.component.spec.ts new file mode 100644 index 00000000..a8d40a1a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/password-dialog/password-dialog.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { PasswordDialogComponent } from './password-dialog.component'; + +describe('PasswordDialogComponent', () => { + let component: PasswordDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ PasswordDialogComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(PasswordDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/password-dialog/password-dialog.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/password-dialog/password-dialog.component.ts new file mode 100644 index 00000000..05c65d3c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/password-dialog/password-dialog.component.ts @@ -0,0 +1,145 @@ +import { Component, Inject, OnDestroy, OnInit, ViewChild } from '@angular/core'; +import { MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { MatDialogRef } from '@angular/material'; +import { FormControl, FormGroup } from '@angular/forms'; +import { ButtonComponent } from '../button/button.component'; +import { parseResponseMessage } from '../../../utils/errors'; +import { Subject } from 'rxjs/Subject'; +import { ISubscription } from 'rxjs/Subscription'; +import { TranslateService } from '@ngx-translate/core'; +import { MsgBarService } from '../../../services/msg-bar.service'; + +@Component({ + selector: 'app-password-dialog', + templateUrl: './password-dialog.component.html', + styleUrls: ['./password-dialog.component.scss'], +}) +export class PasswordDialogComponent implements OnInit, OnDestroy { + @ViewChild('button') button: ButtonComponent; + form: FormGroup; + passwordSubmit = new Subject(); + working = false; + + private subscriptions: ISubscription[] = []; + private errors: any; + + constructor( + @Inject(MAT_DIALOG_DATA) public data: any, + public dialogRef: MatDialogRef, + private msgBarService: MsgBarService, + private translateService: TranslateService, + ) { + this.data = Object.assign({ + confirm: false, + description: null, + warning: false, + title: null, + wallet: null, + }, data || {}); + + this.translateService.get(['errors.incorrect-password', 'errors.api-disabled', 'errors.no-wallet']).subscribe(res => { + this.errors = res; + }); + } + + ngOnInit() { + this.form = new FormGroup({}, this.validateForm.bind(this)); + this.form.addControl('password', new FormControl('')); + this.form.addControl('confirm_password', new FormControl('')); + + ['password', 'confirm_password'].forEach(control => { + this.subscriptions.push(this.form.get(control).valueChanges.subscribe(() => { + if (this.button.state === 2) { + this.button.resetState(); + } + })); + }); + + if (this.data.confirm) { + this.form.get('confirm_password').enable(); + } else { + this.form.get('confirm_password').disable(); + } + + if (this.data.description) { + this.dialogRef.updateSize('400px'); + } + } + + ngOnDestroy() { + this.msgBarService.hide(); + + this.form.get('password').setValue(''); + this.form.get('confirm_password').setValue(''); + + this.passwordSubmit.complete(); + + this.subscriptions.forEach(sub => sub.unsubscribe()); + } + + proceed() { + if (!this.form.valid || this.button.isLoading()) { + return; + } + + this.msgBarService.hide(); + + this.button.setLoading(); + this.working = true; + + this.passwordSubmit.next({ + password: this.form.get('password').value, + close: this.close.bind(this), + error: this.error.bind(this), + }); + } + + private validateForm() { + if (this.form && this.form.get('password') && this.form.get('confirm_password')) { + if (this.form.get('password').value.length === 0) { + return { Required: true }; + } + + if (this.data.confirm && this.form.get('password').value !== this.form.get('confirm_password').value) { + return { NotEqual: true }; + } + } + + return null; + } + + private close() { + this.dialogRef.close(); + } + + private error(error: any) { + if (typeof error === 'object') { + if (error.status) { + switch (error.status) { + case 400: + error = parseResponseMessage(error['_body']); + break; + case 401: + error = this.errors['errors.incorrect-password']; + break; + case 403: + error = this.errors['errors.api-disabled']; + break; + case 404: + error = this.errors['errors.no-wallet']; + break; + default: + error = this.errors['errors.error-decrypting']; + } + } else { + error = this.errors['errors.error-decrypting']; + } + } + + error = error ? error : this.errors['errors.error-decrypting']; + + this.msgBarService.showError(error); + this.button.resetState(); + this.working = false; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/qr-code/qr-code.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/qr-code/qr-code.component.html new file mode 100644 index 00000000..a6b48dd7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/qr-code/qr-code.component.html @@ -0,0 +1,36 @@ + +
+
+
+
+
+
{{ 'qr.data' | translate }}
+
{{ currentQrContent }}
+
+
+
{{ 'qr.address' | translate }}
+
{{ data.address }}
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/qr-code/qr-code.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/qr-code/qr-code.component.scss new file mode 100644 index 00000000..8706bf28 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/qr-code/qr-code.component.scss @@ -0,0 +1,68 @@ +@import '../../../../theme/variables'; + +.qr-container { + text-align: center; + margin-bottom: 24px; + + .qr { + height: 180px; + width: 180px; + display: inline-block; + } +} + +.separator { + background-color: $grey-light; + height: 1px; + width: 100%; +} + +.data-container { + margin: 14px 0; + + .title { + color: $black; + } + + .data { + color: $grey-semi-dark; + cursor: pointer; + + .text { + margin-right: 5px; + } + + .copy { + color: $grey-semi-dark; + opacity: 0.25; + } + } + + .data:hover { + .copy { + opacity: 0.75; + } + } + + .data:active { + .copy { + opacity: 1; + } + } +} + +.link { + color: $gradient-blue-dark; + cursor: pointer; + + mat-icon { + padding: 0; + display: inline; + vertical-align: middle; + font-size: 13px; + } +} + +.invalid { + color: $red; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/qr-code/qr-code.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/qr-code/qr-code.component.spec.ts new file mode 100644 index 00000000..2943ac08 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/qr-code/qr-code.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { QrCodeComponent } from './qr-code.component'; + +describe('QrCodeComponent', () => { + let component: QrCodeComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ QrCodeComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(QrCodeComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/qr-code/qr-code.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/qr-code/qr-code.component.ts new file mode 100644 index 00000000..8f569e5c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/qr-code/qr-code.component.ts @@ -0,0 +1,147 @@ +import { Component, Inject, OnInit, ViewChild, OnDestroy, ElementRef } from '@angular/core'; +import { MAT_DIALOG_DATA, MatDialog, MatDialogConfig } from '@angular/material/dialog'; +import { MatDialogRef } from '@angular/material'; +import { FormGroup, FormBuilder } from '@angular/forms'; +import { ISubscription } from 'rxjs/Subscription'; +import { Subject } from 'rxjs/Subject'; +import { copyTextToClipboard } from '../../../utils'; +import { AppConfig } from '../../../app.config'; +import { MsgBarService } from '../../../services/msg-bar.service'; + +declare const QRCode: any; + +class DefaultQrConfig { + readonly size = 180; + readonly level = 'M'; + readonly colordark = '#000000'; + readonly colorlight = '#ffffff'; + readonly usesvg = false; +} + +export interface QrDialogConfig { + address: string; + ignoreCoinPrefix?: boolean; + hideCoinRequestForm?: boolean; +} + +@Component({ + selector: 'app-qr-code', + templateUrl: './qr-code.component.html', + styleUrls: ['./qr-code.component.scss'], +}) +export class QrCodeComponent implements OnInit, OnDestroy { + @ViewChild('qr') qr: ElementRef; + + form: FormGroup; + currentQrContent: string; + showForm = false; + invalidCoins = false; + invalidHours = false; + + private defaultQrConfig = new DefaultQrConfig(); + private subscriptionsGroup: ISubscription[] = []; + private updateQrEvent: Subject = new Subject(); + + static openDialog(dialog: MatDialog, config: QrDialogConfig) { + const dialogConfig = new MatDialogConfig(); + dialogConfig.data = config; + dialogConfig.width = '390px'; + dialog.open(QrCodeComponent, dialogConfig); + } + + constructor( + @Inject(MAT_DIALOG_DATA) public data: QrDialogConfig, + public dialogRef: MatDialogRef, + public formBuilder: FormBuilder, + private msgBarService: MsgBarService, + ) { } + + ngOnInit() { + this.initForm(); + this.updateQrContent(); + } + + ngOnDestroy() { + this.subscriptionsGroup.forEach(sub => sub.unsubscribe()); + this.msgBarService.hide(); + } + + startShowingForm() { + this.showForm = true; + } + + copyText(text) { + copyTextToClipboard(text); + this.msgBarService.showDone('qr.copied', 4000); + } + + private initForm() { + this.form = this.formBuilder.group({ + coins: [''], + hours: [''], + note: [''], + }); + + this.subscriptionsGroup.push(this.form.get('coins').valueChanges.subscribe(this.reportValueChanged.bind(this))); + this.subscriptionsGroup.push(this.form.get('hours').valueChanges.subscribe(this.reportValueChanged.bind(this))); + this.subscriptionsGroup.push(this.form.get('note').valueChanges.subscribe(this.reportValueChanged.bind(this))); + + this.subscriptionsGroup.push(this.updateQrEvent.debounceTime(500).subscribe(() => { + this.updateQrContent(); + })); + } + + private reportValueChanged() { + this.updateQrEvent.next(true); + } + + private updateQrContent() { + this.currentQrContent = (!this.data.ignoreCoinPrefix ? (AppConfig.uriSpecificatioPrefix.toLowerCase() + ':') : '') + this.data.address; + + this.invalidCoins = false; + this.invalidHours = false; + + let nextSeparator = '?'; + + const coins = this.form.get('coins').value; + if (coins) { + if (Number.parseFloat(coins).toString() === coins && Number.parseFloat(coins) > 0) { + this.currentQrContent += nextSeparator + 'amount=' + this.form.get('coins').value; + nextSeparator = '&'; + } else { + this.invalidCoins = true; + } + } + + const hours = this.form.get('hours').value; + if (hours) { + if (Number.parseInt(hours).toString() === hours && Number.parseInt(hours) > 0) { + this.currentQrContent += nextSeparator + 'hours=' + this.form.get('hours').value; + nextSeparator = '&'; + } else { + this.invalidHours = true; + } + } + + const note = this.form.get('note').value; + if (note) { + this.currentQrContent += nextSeparator + 'message=' + encodeURIComponent(note); + } + + this.updateQrCode(); + } + + private updateQrCode() { + (this.qr.nativeElement as HTMLDivElement).innerHTML = ''; + + const qrcode = new QRCode(this.qr.nativeElement, { + text: this.currentQrContent, + width: this.defaultQrConfig.size, + height: this.defaultQrConfig.size, + colorDark: this.defaultQrConfig.colordark, + colorLight: this.defaultQrConfig.colorlight, + useSVG: this.defaultQrConfig.usesvg, + correctLevel: QRCode.CorrectLevel[this.defaultQrConfig.level], + }); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/seed-word-dialog/seed-word-dialog.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/seed-word-dialog/seed-word-dialog.component.html new file mode 100644 index 00000000..2c76d07c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/seed-word-dialog/seed-word-dialog.component.html @@ -0,0 +1,28 @@ + + + +
+
+ + + + {{option}} + +
+
+
+ + {{ 'hardware-wallet.general.continue' | translate }} + +
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/seed-word-dialog/seed-word-dialog.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/seed-word-dialog/seed-word-dialog.component.scss new file mode 100644 index 00000000..cc2cde49 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/seed-word-dialog/seed-word-dialog.component.scss @@ -0,0 +1,8 @@ +.form-container { + margin-top: 20px; +} + +.option { + font-size: 13px; + height: 42px; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/seed-word-dialog/seed-word-dialog.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/seed-word-dialog/seed-word-dialog.component.spec.ts new file mode 100644 index 00000000..cc7cb0a0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/seed-word-dialog/seed-word-dialog.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SeedWordDialogComponent } from './seed-word-dialog.component'; + +describe('SeedWordDialogComponent', () => { + let component: SeedWordDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SeedWordDialogComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SeedWordDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/seed-word-dialog/seed-word-dialog.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/seed-word-dialog/seed-word-dialog.component.ts new file mode 100644 index 00000000..3e6e0341 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/seed-word-dialog/seed-word-dialog.component.ts @@ -0,0 +1,92 @@ +import { Component, OnInit, OnDestroy, Inject } from '@angular/core'; +import { FormBuilder, Validators, FormGroup } from '@angular/forms'; +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { Observable } from 'rxjs/Observable'; +import { TranslateService } from '@ngx-translate/core'; +import { ISubscription } from 'rxjs/Subscription'; +import { Bip39WordListService } from '../../../services/bip39-word-list.service'; +import { MsgBarService } from '../../../services/msg-bar.service'; +import { HwWalletService } from '../../../services/hw-wallet.service'; +import { MessageIcons } from '../hardware-wallet/hw-message/hw-message.component'; + +export class SeedWordDialogParams { + isForHwWallet: boolean; + wordNumber: number; + restoringSoftwareWallet: false; +} + +@Component({ + selector: 'app-seed-word-dialog', + templateUrl: './seed-word-dialog.component.html', + styleUrls: ['./seed-word-dialog.component.scss'], +}) +export class SeedWordDialogComponent implements OnInit, OnDestroy { + form: FormGroup; + filteredOptions: Observable; + msgIcons = MessageIcons; + + private sendingWord = false; + private valueChangeSubscription: ISubscription; + private hwConnectionSubscription: ISubscription; + + constructor( + @Inject(MAT_DIALOG_DATA) public data: SeedWordDialogParams, + public dialogRef: MatDialogRef, + private formBuilder: FormBuilder, + private bip38WordList: Bip39WordListService, + private msgBarService: MsgBarService, + private translateService: TranslateService, + hwWalletService: HwWalletService, + ) { + if (data.isForHwWallet) { + this.hwConnectionSubscription = hwWalletService.walletConnectedAsyncEvent.subscribe(connected => { + if (!connected) { + this.dialogRef.close(); + } + }); + } + } + + ngOnInit() { + this.form = this.formBuilder.group({ + word: ['', Validators.required], + }); + + this.valueChangeSubscription = this.form.controls.word.valueChanges.subscribe(value => { + this.bip38WordList.setSearchTerm(value.trim().toLowerCase()); + }); + + this.filteredOptions = this.bip38WordList.searchResults.map(value => value); + } + + ngOnDestroy() { + this.msgBarService.hide(); + this.valueChangeSubscription.unsubscribe(); + if (this.hwConnectionSubscription) { + this.hwConnectionSubscription.unsubscribe(); + } + } + + sendWord() { + if (!this.sendingWord) { + this.sendingWord = true; + this.msgBarService.hide(); + + setTimeout(() => { + if (this.form.valid) { + const validation = this.bip38WordList.validateWord(this.form.value.word.trim().toLowerCase()); + if (validation) { + this.dialogRef.close((this.form.value.word as string).trim().toLowerCase()); + } else { + if (validation === null) { + this.msgBarService.showError(this.translateService.instant('hardware-wallet.seed-word.error-loading-words')); + } else { + this.msgBarService.showError(this.translateService.instant('hardware-wallet.seed-word.error-invalid-word')); + } + } + } + this.sendingWord = false; + }, 32); + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/select-language/select-language.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/select-language/select-language.component.html new file mode 100644 index 00000000..5e827cad --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/select-language/select-language.component.html @@ -0,0 +1,8 @@ + +
+ +
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/select-language/select-language.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/select-language/select-language.component.scss new file mode 100644 index 00000000..ffb243cb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/select-language/select-language.component.scss @@ -0,0 +1,32 @@ +@import '../../../../theme/_variables'; + +.options-container { + display: flex; + align-items: center; + justify-content: center; + flex-wrap: wrap; + + .button { + width: 118px; + margin: 20px; + font-size: 12px; + line-height: unset; + padding: 0; + color: unset; + min-width: 0px; + + img { + width: 64px; + height: 64px; + margin: 10px 0px; + } + + .label { + background-color: $grey-very-light; + padding: 4px 10px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/select-language/select-language.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/select-language/select-language.component.spec.ts new file mode 100644 index 00000000..a84635e2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/select-language/select-language.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SelectLanguageComponent } from './select-language.component'; + +describe('SelectLanguageComponent', () => { + let component: SelectLanguageComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SelectLanguageComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SelectLanguageComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/select-language/select-language.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/select-language/select-language.component.ts new file mode 100644 index 00000000..efe31b37 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/layout/select-language/select-language.component.ts @@ -0,0 +1,29 @@ +import { Component, OnInit } from '@angular/core'; +import { MatDialogRef } from '@angular/material/dialog'; + +import { LanguageData, LanguageService } from '../../../services/language.service'; + +@Component({ + selector: 'app-select-language', + templateUrl: './select-language.component.html', + styleUrls: ['./select-language.component.scss'], +}) +export class SelectLanguageComponent implements OnInit { + + languages: LanguageData[]; + disableDismiss: boolean; + + constructor( + public dialogRef: MatDialogRef, + private languageService: LanguageService, + ) { } + + ngOnInit() { + this.disableDismiss = this.dialogRef.disableClose; + this.languages = this.languageService.languages; + } + + closePopup(language: LanguageData = null) { + this.dialogRef.close(language ? language.code : undefined); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/buy/add-deposit-address/add-deposit-address.component.css b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/buy/add-deposit-address/add-deposit-address.component.css new file mode 100644 index 00000000..91222aaf --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/buy/add-deposit-address/add-deposit-address.component.css @@ -0,0 +1,4 @@ +mat-select { + width: 100%; + padding: 40px 0 20px; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/buy/add-deposit-address/add-deposit-address.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/buy/add-deposit-address/add-deposit-address.component.html new file mode 100644 index 00000000..11ad098b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/buy/add-deposit-address/add-deposit-address.component.html @@ -0,0 +1,11 @@ +

{{ 'buy.deposit-address' | translate }}

+
+ + + {{ address.address }} + + +
+ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/buy/add-deposit-address/add-deposit-address.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/buy/add-deposit-address/add-deposit-address.component.spec.ts new file mode 100644 index 00000000..be225b44 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/buy/add-deposit-address/add-deposit-address.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { AddDepositAddressComponent } from './add-deposit-address.component'; + +describe('AddDepositAddressComponent', () => { + let component: AddDepositAddressComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ AddDepositAddressComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(AddDepositAddressComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/buy/add-deposit-address/add-deposit-address.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/buy/add-deposit-address/add-deposit-address.component.ts new file mode 100644 index 00000000..8283d405 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/buy/add-deposit-address/add-deposit-address.component.ts @@ -0,0 +1,36 @@ +import { Component, OnInit } from '@angular/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { WalletService } from '../../../../services/wallet.service'; +import { PurchaseService } from '../../../../services/purchase.service'; +import { MatDialogRef } from '@angular/material/dialog'; + +@Component({ + selector: 'app-add-deposit-address', + templateUrl: './add-deposit-address.component.html', + styleUrls: ['./add-deposit-address.component.css'], +}) +export class AddDepositAddressComponent implements OnInit { + + form: FormGroup; + + constructor( + public walletService: WalletService, + private dialogRef: MatDialogRef, + private formBuilder: FormBuilder, + private purchaseService: PurchaseService, + ) {} + + ngOnInit() { + this.initForm(); + } + + generate() { + this.purchaseService.generate(this.form.value.address).subscribe(() => this.dialogRef.close()); + } + + private initForm() { + this.form = this.formBuilder.group({ + address: ['', Validators.required], + }); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/buy/buy.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/buy/buy.component.html new file mode 100644 index 00000000..97bfaa5d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/buy/buy.component.html @@ -0,0 +1,59 @@ + +
+
+
+
+
+ 1 +
+
+

{{ 'buy.deposit-location' | translate }}

+

{{ 'buy.deposit-location-desc' | translate }}

+
+
+ +
+
+ {{ 'buy.wallets-desc' | translate }} +
+
+
+
+ 2 +
+
+

{{ 'buy.send' | translate }}

+

{{ 'buy.send-desc' | translate:{rate: config.sky_btc_exchange_rate} }}

+ + {{ order.deposit_address }} + + {{ 'buy.fraction-warning' | translate }} +
+
+
+
+ 3 +
+
+

{{ 'buy.receive' | translate }}

+

{{ 'buy.receive-desc' | translate }}

+ + {{ 'buy.status-button' | translate }} {{ order.status | tellerStatus | translate }} + + + {{ 'buy.check-status-button' | translate }} + + + {{ 'buy.new-order-button' | translate }} + +
+
+
+ +
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/buy/buy.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/buy/buy.component.scss new file mode 100644 index 00000000..82020723 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/buy/buy.component.scss @@ -0,0 +1,129 @@ +.-background-container { + background-color: #fbfbfb; + padding-top: 30px; + max-width: 100%; + min-height: calc(100% - 190px); + overflow: hidden; + position: relative; +} + +.-background-image { + display: none; +} + +@media (min-width: 768px) { + .-background-image { + display: block; + left: 50%; + width: 80%; + position: absolute; + top: 0; + } +} + +@media (min-width: 992px) { + .-background-image { + left: 40%; + width: 90%; + max-width: 850px; + } +} + +@media (min-width: 1200px) { + .-background-image { + left: 40%; + width: 80%; + max-width: 850px; + } +} + +.-paper { + background-color: #fbfbfb; + border-radius: 10px; + box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.01), 1px 1px 2px 2px rgba(0, 0, 0, 0.01); + padding: 30px; + position: relative; + margin-top: 30px; + max-width: 540px; + z-index: 5; + + .-step { + display: flex; + margin-bottom: 30px; + + .-number { + width: 60px; + + span { + border-radius: 50%; + color: white; + display: inline-block; + font-size: 16px; + font-weight: 700; + height: 40px; + line-height: 46px; + text-align: center; + width: 40px; + } + } + + .-instructions { + flex: 1 1; + + ::ng-deep button { + margin-left: 0; + } + + h3 { + color: #1E2227; + font-size: 16px; + font-weight: 700; + margin: 0; + line-height: 46px; + } + + p { + color: rgba(30, 34, 39, 0.8); + font-size: 14px; + font-weight: 300; + line-height: 20px; + margin-top: 0; + } + + .-address, .-status { + background-color: white; + border: 2px solid rgba(0, 0, 0, 0.05); + border-radius: 6px; + box-sizing: border-box; + color: rgba(30, 34, 39, 0.8); + display: block; + font-size: 14px; + line-height: 20px; + margin-bottom: 15px; + padding: 10px 10px; + width: 100%; + } + + .-coins { + color: #0072FF; + } + + .form-field { + margin-bottom: 15px; + } + + .-subtitle { + color: #8C8E90; + font-size: 12px; + line-height: 18px; + font-weight: 300; + opacity: 0.8; + } + + .-wallet { + color: rgba(30, 34, 39, 0.8); + font-size: 14px; + } + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/buy/buy.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/buy/buy.component.spec.ts new file mode 100644 index 00000000..1d0cca4c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/buy/buy.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BuyComponent } from './buy.component'; + +describe('BuyComponent', () => { + let component: BuyComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ BuyComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BuyComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/buy/buy.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/buy/buy.component.ts new file mode 100644 index 00000000..f22a5e85 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/buy/buy.component.ts @@ -0,0 +1,112 @@ +import { Component, OnDestroy, OnInit, ViewChild } from '@angular/core'; +import { PurchaseService } from '../../../services/purchase.service'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { WalletService } from '../../../services/wallet.service'; +import { Address, PurchaseOrder, Wallet } from '../../../app.datatypes'; +import { ButtonComponent } from '../../layout/button/button.component'; +import { ISubscription } from 'rxjs/Subscription'; +import { MsgBarService } from '../../../services/msg-bar.service'; + +@Component({ + selector: 'app-buy', + templateUrl: './buy.component.html', + styleUrls: ['./buy.component.scss'], +}) +export class BuyComponent implements OnInit, OnDestroy { + @ViewChild('button') button: ButtonComponent; + + address: Address; + config: any; + form: FormGroup; + order: PurchaseOrder; + wallets: Wallet[]; + + private subscriptionsGroup: ISubscription[] = []; + + constructor( + private formBuilder: FormBuilder, + private purchaseService: PurchaseService, + private msgBarService: MsgBarService, + private walletService: WalletService, + ) {} + + ngOnInit() { + this.initForm(); + this.loadData(); + } + + ngOnDestroy() { + this.subscriptionsGroup.forEach(sub => sub.unsubscribe()); + } + + checkStatus() { + this.button.setLoading(); + this.purchaseService.scan(this.order.recipient_address).subscribe( + response => { + this.button.setSuccess(); + this.order.status = response.status; + }, + error => this.button.setError(error), + ); + } + + removeOrder() { + window.localStorage.removeItem('purchaseOrder'); + this.order = null; + } + + private initForm() { + this.form = this.formBuilder.group({ + wallet: ['', Validators.required], + }); + + this.subscriptionsGroup.push(this.form.get('wallet').valueChanges.subscribe(filename => { + const wallet = this.wallets.find(wlt => wlt.filename === filename); + console.log('changing wallet value', filename); + this.purchaseService.generate(wallet).subscribe( + order => this.saveData(order), + error => this.msgBarService.showError(error.toString()), + ); + })); + } + + private loadConfig() { + this.purchaseService.config() + .filter(config => !!config && !!config.sky_btc_exchange_rate) + .first() + .subscribe(config => this.config = config); + } + + private loadData() { + this.loadConfig(); + this.loadOrder(); + + this.subscriptionsGroup.push(this.walletService.all().subscribe(wallets => { + this.wallets = wallets; + + if (this.order) { + this.form.get('wallet').setValue(this.order.filename, { emitEvent: false }); + } + })); + } + + private loadOrder() { + const order: PurchaseOrder = JSON.parse(window.localStorage.getItem('purchaseOrder')); + if (order) { + this.order = order; + this.updateOrder(); + } + } + + private saveData(order: PurchaseOrder) { + this.order = order; + window.localStorage.setItem('purchaseOrder', JSON.stringify(order)); + } + + private updateOrder() { + this.purchaseService.scan(this.order.recipient_address).first().subscribe( + response => this.order.status = response.status, + error => console.log(error), + ); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-create/exchange-create.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-create/exchange-create.component.html new file mode 100644 index 00000000..b0adc425 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-create/exchange-create.component.html @@ -0,0 +1,91 @@ + + +
+
+
+ +
+ +
+ +
+
+
+
+ +
+ +
+ +
+
+
+
+ + +
+ +
+ + {{ 'exchange.agree-1' | translate }} + + {{ 'exchange.agree-2' | translate }} + + {{ 'exchange.agree-3' | translate }} + + {{ 'exchange.agree-4' | translate }} + + + + + {{ 'exchange.exchange-button' | translate }} + +
+
+ +
+
+
{{ 'exchange.you-send' | translate }}
+
{{ sendAmount }} {{ form.get('fromCoin').value }}
+
+ +
+
{{ 'exchange.you-get' | translate }}
+
≈ {{ toAmount }} {{ toCoin }}
+
+ +
+
{{ 'exchange.to-address' | translate:{coin: toCoin} }}
+
{{ form.get('toAddress').value || '-' }}
+
+ +
+
{{ 'exchange.price' | translate }}
+
1 {{ form.get('fromCoin').value }} ≈ {{ activeTradingPair.price.toFixed(6) }} {{ toCoin }}
+
+ +
+
{{ 'exchange.time-15' | translate }}
+
≈ 15 minutes
+
+
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-create/exchange-create.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-create/exchange-create.component.scss new file mode 100644 index 00000000..4328a6e6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-create/exchange-create.component.scss @@ -0,0 +1,131 @@ +@import '../../../../../theme/variables'; + +.-create { + display: flex; + + .-form { + flex: .6; + } + + .-info { + flex: .4; + margin-left: 40px; + margin-top: 5px; + } +} + +.form-field { + width: 100%; + + .-error { + color: $red; + margin-left: 20px; + } + + .-inputs { + display: flex; + + input { + flex: .7; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + + .-select, .-input { + flex: .3; + + select, input { + border-left: 0; + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + } + } + + .-not-allowed { + input { + cursor: not-allowed; + } + } +} + +.-item { + font-size: 13px; + + &:not(:last-child) { + margin-bottom: 20px; + } + + .-key { + color: $grey; + margin-bottom: 5px; + } + + .-value { + word-break: break-all; + } +} + +.-buttons { + text-align: center; + + mat-checkbox { + margin-right: 20px; + } +} + +.-check ::ng-deep { + .mat-checkbox-layout { + align-items: center; + } + + .mat-checkbox-checkmark-path { + position: absolute; + width: 18px; + height: 8px; + left: 4.59px; + top: 9px; + stroke: $gradient-blue-dark !important; + } + + .mat-checkbox-background, .mat-checkbox-frame { + top: 0; + left: 0; + right: 0; + bottom: 0; + position: absolute; + box-sizing: border-box; + pointer-events: none; + width: 20px; + height: 20px; + background: rgba(30, 34, 39, 0.05); + border-radius: 6px; + border-color: transparent; + } + + span { + font-family: Skycoin; + line-height: normal; + font-size: 13px; + color: $grey-dark; + + a { + color: $blue; + text-decoration: none; + } + } +} + +.-select-address { + padding-left: 5px; + color: $blue; + cursor: pointer; + + mat-icon { + color: $blue; + padding: 0; + display: inline; + vertical-align: middle; + font-size: 13px; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-create/exchange-create.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-create/exchange-create.component.spec.ts new file mode 100644 index 00000000..c1f9d924 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-create/exchange-create.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ExchangeCreateComponent } from './exchange-create.component'; + +describe('ExchangeCreateComponent', () => { + let component: ExchangeCreateComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ExchangeCreateComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ExchangeCreateComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-create/exchange-create.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-create/exchange-create.component.ts new file mode 100644 index 00000000..f2710a5c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-create/exchange-create.component.ts @@ -0,0 +1,260 @@ +import { + Component, + EventEmitter, + OnDestroy, + OnInit, + Output, + ViewChild, +} from '@angular/core'; +import * as moment from 'moment'; +import { ButtonComponent } from '../../../layout/button/button.component'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { ExchangeService } from '../../../../services/exchange.service'; +import { ExchangeOrder, TradingPair, StoredExchangeOrder } from '../../../../app.datatypes'; +import { ISubscription } from 'rxjs/Subscription'; +import 'rxjs/add/observable/merge'; +import { MatDialog, MatDialogConfig } from '@angular/material'; +import { SelectAddressComponent } from '../../send-skycoin/send-form-advanced/select-address/select-address'; +import { WalletService } from '../../../../services/wallet.service'; +import { Observable } from 'rxjs/Observable'; +import 'rxjs/add/operator/switchMap'; +import { BlockchainService } from '../../../../services/blockchain.service'; +import { TranslateService } from '@ngx-translate/core'; +import { MsgBarService } from '../../../../services/msg-bar.service'; + +@Component({ + selector: 'app-exchange-create', + templateUrl: './exchange-create.component.html', + styleUrls: ['./exchange-create.component.scss'], +}) +export class ExchangeCreateComponent implements OnInit, OnDestroy { + readonly defaultFromCoin = 'BTC'; + readonly defaultFromAmount = '0.1'; + readonly toCoin = 'SKY'; + + @ViewChild('exchangeButton') exchangeButton: ButtonComponent; + @Output() submitted = new EventEmitter(); + form: FormGroup; + tradingPairs: TradingPair[]; + activeTradingPair: TradingPair; + problemGettingPairs = false; + + private agreement = false; + private subscriptionsGroup: ISubscription[] = []; + private exchangeSubscription: ISubscription; + private priceUpdateSubscription: ISubscription; + + get toAmount() { + if (!this.activeTradingPair) { + return 0; + } + + const fromAmount = this.form.get('fromAmount').value; + if (isNaN(fromAmount)) { + return 0; + } else { + return (this.form.get('fromAmount').value * this.activeTradingPair.price).toFixed(this.blockchainService.currentMaxDecimals); + } + } + + get sendAmount() { + const val = this.form.get('fromAmount').value; + + return isNaN(parseFloat(val)) ? 0 : val; + } + + constructor( + private exchangeService: ExchangeService, + private walletService: WalletService, + private formBuilder: FormBuilder, + private msgBarService: MsgBarService, + private dialog: MatDialog, + private blockchainService: BlockchainService, + private translateService: TranslateService, + ) { } + + ngOnInit() { + this.createForm(); + this.loadData(); + } + + ngOnDestroy() { + this.subscriptionsGroup.forEach(sub => sub.unsubscribe()); + this.removeExchangeSubscription(); + this.msgBarService.hide(); + + if (this.priceUpdateSubscription) { + this.priceUpdateSubscription.unsubscribe(); + } + } + + setAgreement(event) { + this.agreement = event.checked; + this.form.updateValueAndValidity(); + } + + selectAddress() { + const config = new MatDialogConfig(); + config.width = '566px'; + config.autoFocus = false; + + this.dialog.open(SelectAddressComponent, config).afterClosed().subscribe(address => { + if (address) { + this.form.get('toAddress').setValue(address); + } + }); + } + + exchange() { + if (!this.form.valid || this.exchangeButton.isLoading()) { + return; + } + + this.msgBarService.hide(); + + this.exchangeButton.resetState(); + this.exchangeButton.setLoading(); + this.exchangeButton.setDisabled(); + + const amount = parseFloat(this.form.get('fromAmount').value); + + const toAddress = (this.form.get('toAddress').value as string).trim(); + + this.removeExchangeSubscription(); + this.exchangeSubscription = this.walletService.verifyAddress(toAddress).subscribe(addressIsValid => { + if (addressIsValid) { + this.exchangeSubscription = this.exchangeService.exchange( + this.activeTradingPair.pair, + amount, + toAddress, + this.activeTradingPair.price, + ).subscribe((order: ExchangeOrder) => { + this.submitted.emit({ + id: order.id, + pair: order.pair, + fromAmount: order.fromAmount, + toAmount: order.toAmount, + address: order.toAddress, + timestamp: moment().unix(), + price: this.activeTradingPair.price, + }); + }, err => { + this.exchangeButton.resetState(); + this.exchangeButton.setEnabled(); + this.msgBarService.showError(err); + }); + } else { + this.showInvalidAddress(); + } + }, () => { + this.showInvalidAddress(); + }); + } + + private showInvalidAddress() { + this.exchangeButton.resetState(); + this.exchangeButton.setEnabled(); + + const errMsg = this.translateService.instant('exchange.invalid-address'); + this.msgBarService.showError(errMsg); + } + + private createForm() { + this.form = this.formBuilder.group({ + fromCoin: [this.defaultFromCoin, Validators.required], + fromAmount: [this.defaultFromAmount, Validators.required], + toAddress: ['', Validators.required], + }, { + validator: this.validate.bind(this), + }); + + this.subscriptionsGroup.push(this.form.get('fromCoin').valueChanges.subscribe(() => { + this.updateActiveTradingPair(); + })); + } + + private loadData() { + this.subscriptionsGroup.push(this.exchangeService.tradingPairs() + .retryWhen(errors => errors.delay(2000).take(10).concat(Observable.throw(''))) + .subscribe(pairs => { + this.tradingPairs = []; + + pairs.forEach(pair => { + if (pair.to === this.toCoin) { + this.tradingPairs.push(pair); + } + }); + + this.updateActiveTradingPair(); + this.updatePrices(); + }, () => { + this.problemGettingPairs = true; + }), + ); + } + + private updatePrices() { + this.priceUpdateSubscription = Observable.of(1).delay(60000).flatMap(() => this.exchangeService.tradingPairs()) + .retryWhen(errors => errors.delay(60000)) + .subscribe(pairs => { + pairs.forEach(pair => { + if (pair.to === this.toCoin) { + const alreadySavedPair = this.tradingPairs.find(oldPair => oldPair.from === pair.from); + if (alreadySavedPair) { + alreadySavedPair.price = pair.price; + } + } + }); + this.updatePrices(); + }); + } + + private updateActiveTradingPair() { + this.activeTradingPair = this.tradingPairs.find(p => { + return p.from === this.form.get('fromCoin').value; + }); + + if (!this.activeTradingPair && this.tradingPairs.length > 0) { + this.activeTradingPair = this.tradingPairs[0]; + this.form.get('fromCoin').setValue(this.activeTradingPair.from); + } + } + + private validate(group: FormGroup) { + if (!group || !this.activeTradingPair) { + return null; + } + + const fromAmount = group.get('fromAmount').value; + + if (isNaN(fromAmount)) { + return { invalid: true }; + } + + if (fromAmount < this.activeTradingPair.min || fromAmount === '') { + return { min: this.activeTradingPair.min }; + } + + if (fromAmount > this.activeTradingPair.max) { + return { max: this.activeTradingPair.max }; + } + + const parts = (fromAmount as string).split('.'); + + if (parts.length > 1 && parts[1].length > 6) { + return { decimals: true }; + } + + if (!this.agreement) { + return { agreement: true }; + } + + return null; + } + + private removeExchangeSubscription() { + if (this.exchangeSubscription) { + this.exchangeSubscription.unsubscribe(); + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-history/exchange-history.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-history/exchange-history.component.html new file mode 100644 index 00000000..1578fe45 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-history/exchange-history.component.html @@ -0,0 +1,11 @@ + +
+ +
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-history/exchange-history.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-history/exchange-history.component.scss new file mode 100644 index 00000000..c4c38072 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-history/exchange-history.component.scss @@ -0,0 +1,38 @@ +@import '../../../../../theme/variables'; + +button { + width: 100%; + text-align: left; + padding: 10px 10px; + border-bottom: 1px solid #eff0f0; + cursor: pointer; + + .info { + font-size: 13px; + line-height: 22px; + color: $black; + + div { + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + + mat-icon { + font-size: 16px; + width: 16px; + height: 16px; + position: relative; + top: 3px; + margin: 0px 5px; + } + } + + .grey { + color: $grey; + } + } + + .action { + color: $blue; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-history/exchange-history.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-history/exchange-history.component.spec.ts new file mode 100644 index 00000000..18304bfd --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-history/exchange-history.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ExchangeHistoryComponent } from './exchange-history.component'; + +describe('ExchangeHistoryComponent', () => { + let component: ExchangeHistoryComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ExchangeHistoryComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ExchangeHistoryComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-history/exchange-history.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-history/exchange-history.component.ts new file mode 100644 index 00000000..f01f6078 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-history/exchange-history.component.ts @@ -0,0 +1,43 @@ +import { Component, OnInit } from '@angular/core'; +import { StoredExchangeOrder, Wallet } from '../../../../app.datatypes'; +import { MatDialogRef } from '@angular/material'; +import { ExchangeService } from '../../../../services/exchange.service'; +import { BlockchainService } from '../../../../services/blockchain.service'; + +@Component({ + selector: 'app-exchange-history', + templateUrl: './exchange-history.component.html', + styleUrls: ['./exchange-history.component.scss'], +}) +export class ExchangeHistoryComponent implements OnInit { + orders: StoredExchangeOrder[]; + + constructor( + public dialogRef: MatDialogRef, + public blockchainService: BlockchainService, + private exchangeService: ExchangeService, + ) { } + + ngOnInit() { + this.exchangeService.history().subscribe( + (orders: StoredExchangeOrder[]) => this.orders = orders.reverse(), + () => this.orders = [], + ); + } + + closePopup() { + this.dialogRef.close(); + } + + select(value) { + this.dialogRef.close(value); + } + + getFromCoin(pair: string) { + return pair.split('/')[0].toUpperCase(); + } + + getToCoin(pair: string) { + return pair.split('/')[1].toUpperCase(); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-status/exchange-status.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-status/exchange-status.component.html new file mode 100644 index 00000000..c3ae2c8e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-status/exchange-status.component.html @@ -0,0 +1,132 @@ + + + +
+
+ {{ statusIcon }} +
+
{{ 'exchange.status' | translate }}
+
{{ translatedStatus.text | translate:translatedStatus.params }} help
+
+
+ {{ 'exchange.exchanging' | translate:{from: fromCoin, to: toCoin} }} +
+ + + +
+
+
+
+
{{ 'exchange.details.order-id' | translate }}
+
{{ order.id }}
+
+
+ + +
+
+
+
{{ 'exchange.you-send' | translate }}
+
{{ order.fromAmount }} {{ fromCoin }}
+
+
+ +
+ +
+
{{ 'exchange.details.exchange-addr' | translate }}
+
{{ order.exchangeAddress }}
+
+
+ +
+ +
+
{{ 'exchange.details.exchange-addr-tag' | translate }}
+
{{ order.exchangeTag }}
+
+
+
+ + + + + +
+
+
+
{{ 'exchange.details.tx-id' | translate }}
+
+ {{ order.toTx }} + + launch + +
+
+
+ +
+
+
+
{{ 'exchange.details.error-msg' | translate }}
+
{{ order.message }}
+
+
+ +
+
+ + {{ 'exchange.details.details' | translate }} {{ expanded ? 'keyboard_arrow_up' : 'keyboard_arrow_down' }} + +
+ + +
+
+
+
{{ 'exchange.details.start-date' | translate }}
+
{{ _orderDetails.timestamp | dateTime }}
+
+
+ + + + + +
+
+
+
{{ 'exchange.you-get' | translate }}
+
{{ order.toAmount | amount:true:'first' }} {{ toCoin }}
+
+
+ +
+
+
+
{{ 'exchange.to-address' | translate:{coin: toCoin} }}
+
{{ order.toAddress }}
+
+
+ +
+
+
+
{{ 'exchange.details.initial-price' | translate }}
+
1 {{ fromCoin }} ≈ {{ _orderDetails.price }} {{ toCoin }}
+
+
+
+
+
+ +
+ + {{ 'exchange.details.back' | translate }} + +
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-status/exchange-status.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-status/exchange-status.component.scss new file mode 100644 index 00000000..139fe9a6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-status/exchange-status.component.scss @@ -0,0 +1,119 @@ +@import '../../../../../theme/variables'; + +.-wrapper { + font-size: 13px; + display: flex; + justify-content: space-between; + align-items: center; + + .-status { + display: flex; + align-items: center; + + mat-icon { + margin-right: 15px; + width: 18px; + height: 18px; + font-size: 18px; + + &.-spin { + animation: spin 1s infinite linear; + } + } + + .-value { + padding-right: 30px; + word-break: normal; + } + } +} + +mat-progress-bar { + margin: 30px -30px; + width: calc(100% + 60px); + + ::ng-deep .mat-progress-bar-buffer { + background-color: $blue; + opacity: .3; + } +} + +.-details { + .-box { + display: flex; + align-items: center; + + &:not(:last-child) { + margin-bottom: 20px; + } + + > .-img { + width: 17px; + margin-right: 15px; + } + } +} + +.-item { + font-size: 13px; + + &:not(:last-child) { + margin-bottom: 20px; + } + + .-key { + color: $grey; + margin-bottom: 5px; + } + + .-value { + word-break: break-all; + + .info-icon { + display: inline; + font-size: 14px; + color: lighten($grey, 40%); + vertical-align: text-bottom; + } + } +} + +@keyframes spin { + 0% { + transform: rotate(0deg); + } + + 100% { + transform: rotate(359deg); + } +} + +.-external mat-icon { + line-height: 13px; + height: 13px; + width: 13px; + font-size: 16px; + vertical-align: middle; + color: $blue; + margin-left: 10px; +} + +.expand { + color: $blue; + cursor: pointer; + font-size: 13px; + + mat-icon { + color: $blue; + padding: 0; + display: inline; + vertical-align: middle; + font-size: 13px; + } +} + +.buttons { + width: 100%; + text-align: center; + margin-top: 10px; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-status/exchange-status.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-status/exchange-status.component.spec.ts new file mode 100644 index 00000000..88e8eee4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-status/exchange-status.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ExchangeStatusComponent } from './exchange-status.component'; + +describe('ExchangeStatusComponent', () => { + let component: ExchangeStatusComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ExchangeStatusComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ExchangeStatusComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-status/exchange-status.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-status/exchange-status.component.ts new file mode 100644 index 00000000..2c97e210 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange-status/exchange-status.component.ts @@ -0,0 +1,171 @@ +import { Component, Input, OnDestroy, Output, EventEmitter } from '@angular/core'; +import { ExchangeOrder, StoredExchangeOrder, ConfirmationData } from '../../../../app.datatypes'; +import { ExchangeService } from '../../../../services/exchange.service'; +import { QrCodeComponent, QrDialogConfig } from '../../../layout/qr-code/qr-code.component'; +import { MatDialog, MatDialogConfig } from '@angular/material'; +import { ISubscription } from 'rxjs/Subscription'; +import { Observable } from 'rxjs/Observable'; +import { showConfirmationModal } from '../../../../utils'; +import { BlockchainService } from '../../../../services/blockchain.service'; +import { environment } from '../../../../../environments/environment'; +import { AppService } from '../../../../services/app.service'; + +@Component({ + selector: 'app-exchange-status', + templateUrl: './exchange-status.component.html', + styleUrls: ['./exchange-status.component.scss'], +}) +export class ExchangeStatusComponent implements OnDestroy { + private readonly TEST_MODE = environment.swaplab.activateTestMode; + private readonly TEST_ERROR = environment.swaplab.endStatusInError; + readonly statuses = [ + 'user_waiting', + 'market_waiting_confirmations', + 'market_confirmed', + 'market_exchanged', + 'market_withdraw_waiting', + 'complete', + 'error', + 'user_deposit_timeout', + ]; + + loading = true; + showError = false; + expanded = false; + + private subscription: ISubscription; + private testStatusIndex = 0; + private order: ExchangeOrder; + + _orderDetails: StoredExchangeOrder; + @Input() set orderDetails(val: StoredExchangeOrder) { + const oldOrderDetails = this._orderDetails; + this._orderDetails = val; + + if (val !== null && (!oldOrderDetails || oldOrderDetails.id !== val.id)) { + this.exchangeService.lastViewedOrder = this._orderDetails; + this.testStatusIndex = 0; + this.loading = true; + this.getStatus(); + } + } + + @Output() goBack = new EventEmitter(); + + get fromCoin() { + return this.order.pair.split('/')[0].toUpperCase(); + } + + get toCoin() { + return this.order.pair.split('/')[1].toUpperCase(); + } + + get translatedStatus() { + const status = this.order.status.replace(/_/g, '-'); + const params = { + from: this.fromCoin, + amount: this.order.fromAmount, + to: this.toCoin, + }; + + return { + text: `exchange.statuses.${status}`, + info: `exchange.statuses.${status}-info`, + params, + }; + } + + get statusIcon() { + if (this.order.status === this.statuses[5]) { + return 'done'; + } + + if (this.order.status === this.statuses[6] || this.order.status === this.statuses[7]) { + return 'close'; + } + + return 'refresh'; + } + + get progress() { + let index = this.statuses.indexOf(this.order.status); + + index = Math.min(index, 5) + 1; + + return Math.ceil((100 / 6) * index); + } + + constructor( + private exchangeService: ExchangeService, + private dialog: MatDialog, + public blockchainService: BlockchainService, + public appService: AppService, + ) { } + + ngOnDestroy() { + this.subscription.unsubscribe(); + } + + showQrCode(address) { + const config: QrDialogConfig = { + address: address, + hideCoinRequestForm: true, + ignoreCoinPrefix: true, + }; + QrCodeComponent.openDialog(this.dialog, config); + } + + toggleDetails() { + this.expanded = !this.expanded; + } + + close() { + if (this.loading || this.exchangeService.isOrderFinished(this.order)) { + this.goBack.emit(); + } else { + const confirmationData: ConfirmationData = { + text: 'exchange.details.back-alert', + headerText: 'confirmation.header-text', + confirmButtonText: 'confirmation.confirm-button', + cancelButtonText: 'confirmation.cancel-button', + }; + + showConfirmationModal(this.dialog, confirmationData).afterClosed().subscribe(confirmationResult => { + if (confirmationResult) { + this.goBack.emit(); + } + }); + } + } + + private getStatus(delay = 0) { + if (this.subscription) { + this.subscription.unsubscribe(); + } + + const fromAmount = this._orderDetails.fromAmount; + + if (this.TEST_MODE && this.TEST_ERROR && this.testStatusIndex === this.statuses.length - 2) { + this.testStatusIndex = this.statuses.length - 1; + } + + this.subscription = Observable.of(0).delay(delay).flatMap(() => { + return this.exchangeService.status( + !this.TEST_MODE ? this._orderDetails.id : '4729821d-390d-4ef8-a31e-2465d82a142f', + !this.TEST_MODE ? null : this.statuses[this.testStatusIndex++], + ); + }).subscribe(order => { + this.order = { ...order, fromAmount }; + this._orderDetails.id = order.id; + this.exchangeService.lastViewedOrder = this._orderDetails; + + if (!this.exchangeService.isOrderFinished(order)) { + this.getStatus(this.TEST_MODE ? 3000 : 30000); + } else { + this.exchangeService.lastViewedOrder = null; + } + + this.loading = false; + }, () => this.showError = true); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange.component.html new file mode 100644 index 00000000..e7003ce1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange.component.html @@ -0,0 +1,35 @@ + +
+
+ + + +
+
+ +
+ + {{ 'exchange.need-help' | translate }} + + {{ 'exchange.support-portal' | translate }} + + + | + + {{ 'exchange.powered-by' | translate }} + SWAPLAB.CC + +
+
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange.component.scss new file mode 100644 index 00000000..e73682ae --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange.component.scss @@ -0,0 +1,44 @@ +@import '../../../../theme/variables'; + +.-paper { + background-color: #fbfbfb; + border-radius: 10px; + box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.01), 1px 1px 2px 2px rgba(0, 0, 0, 0.01); + padding: 30px; + margin: 30px 30px 10px; +} + +.-contact { + margin: 15px 30px; + display: flex; + justify-content: space-between; + + span { + font-size: 13px; + margin: 0 5px; + opacity: .5; + display: inline-block; + vertical-align: middle; + + a { + text-decoration: none; + color: $blue; + } + } + + .history { + opacity: 1; + } + + mat-icon { + font-size: 18px; + width: 18px; + height: 18px; + vertical-align: middle; + } + + .history-text { + font-size: 14px; + opacity: 1; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange.component.spec.ts new file mode 100644 index 00000000..cb854be8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ExchangeComponent } from './exchange.component'; + +describe('ExchangeComponent', () => { + let component: ExchangeComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ExchangeComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ExchangeComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange.component.ts new file mode 100644 index 00000000..79247a5e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/exchange/exchange.component.ts @@ -0,0 +1,70 @@ +import { Component, OnInit, OnDestroy } from '@angular/core'; +import { StoredExchangeOrder } from '../../../app.datatypes'; +import { ExchangeService } from '../../../services/exchange.service'; +import { MatDialog, MatDialogConfig } from '@angular/material'; +import { ExchangeHistoryComponent } from './exchange-history/exchange-history.component'; +import { ISubscription } from 'rxjs/Subscription'; + +@Component({ + selector: 'app-exchange', + templateUrl: './exchange.component.html', + styleUrls: ['./exchange.component.scss'], +}) +export class ExchangeComponent implements OnInit, OnDestroy { + currentOrderDetails: StoredExchangeOrder; + hasHistory = false; + loading = true; + + private lastViewedSubscription: ISubscription; + private historySubscription: ISubscription; + + constructor( + private exchangeService: ExchangeService, + private dialog: MatDialog, + ) { } + + ngOnInit() { + this.lastViewedSubscription = this.exchangeService.lastViewedOrderLoaded.subscribe(response => { + if (response) { + const lastViewedOrder = this.exchangeService.lastViewedOrder; + if (lastViewedOrder) { + this.currentOrderDetails = lastViewedOrder; + } + + setTimeout(() => this.lastViewedSubscription.unsubscribe()); + this.loading = false; + } + }); + + this.historySubscription = this.exchangeService.history().subscribe(() => this.hasHistory = true); + } + + ngOnDestroy() { + this.lastViewedSubscription.unsubscribe(); + this.historySubscription.unsubscribe(); + } + + showStatus(order) { + this.currentOrderDetails = order; + this.hasHistory = true; + } + + showHistory(event) { + event.preventDefault(); + + const config = new MatDialogConfig(); + config.width = '566px'; + config.autoFocus = false; + + this.dialog.open(ExchangeHistoryComponent, config).afterClosed().subscribe((oldOrder: StoredExchangeOrder) => { + if (oldOrder) { + this.currentOrderDetails = oldOrder; + } + }); + } + + goBack() { + this.currentOrderDetails = null; + this.exchangeService.lastViewedOrder = null; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-create-wallet.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-create-wallet.component.html new file mode 100644 index 00000000..c3d2a45c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-create-wallet.component.html @@ -0,0 +1,36 @@ +
+
+
+
+ {{ 'wallet.new.create-title' | translate }} +
+
+

{{ 'wizard.wallet-desc' | translate }}

+
+
+
+
+
+ +
+
+
+
+ +
+
+
+ {{ 'wizard.hardware-wallet-link' | translate }} +
+ +
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-create-wallet.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-create-wallet.component.scss new file mode 100644 index 00000000..dd9c17cb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-create-wallet.component.scss @@ -0,0 +1,75 @@ +@import '../../../../../theme/variables'; + +.-header { + color: $white; + position: relative; + margin-top: 20px; + margin-bottom: 10px; + line-height: 30px; + font-size: 20px; + text-align: center; +} + +.-description { + line-height: 25px; + font-size: 14px; + text-align: center; + + color: $white; + mix-blend-mode: normal; + opacity: 0.5; +} + +.hw-link { + cursor: pointer; + color: white; + font-size: 13px; + line-height: 20px; + margin-bottom: 20px; +} + +.-buttons-footer { + align-items: center; + flex-flow: column; + margin-bottom: 20px; +} + +.-toggle-container{ + margin: 10px auto; +} + +:host ::ng-deep .-buttons-footer button{ + margin: 2px 10px !important; +} + +.-text-align-center{ + text-align: center; +} + +label[for=seed] { + display: flex; + + > span:last-child { + flex: 1; + } + + .generators { + text-align: right; + + span { + cursor: pointer; + } + + mat-icon { + width: 13px; + height: 10px; + font-size: 13px; + position: relative; + top: 2px; + } + + .divider { + padding: 0 5px; + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-create-wallet.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-create-wallet.component.spec.ts new file mode 100644 index 00000000..e93dc61a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-create-wallet.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { OnboardingCreateWalletComponent } from './onboarding-create-wallet.component'; + +describe('OnboardingCreateWalletComponent', () => { + let component: OnboardingCreateWalletComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ OnboardingCreateWalletComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(OnboardingCreateWalletComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-create-wallet.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-create-wallet.component.ts new file mode 100644 index 00000000..c3b1aa0e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-create-wallet.component.ts @@ -0,0 +1,111 @@ +import { Component, EventEmitter, Input, OnInit, Output, ViewChild, OnDestroy } from '@angular/core'; +import { MatDialog, MatDialogConfig } from '@angular/material/dialog'; +import { DoubleButtonActive } from '../../../layout/double-button/double-button.component'; +import { OnboardingSafeguardComponent } from './onboarding-safeguard/onboarding-safeguard.component'; +import { MatDialogRef } from '@angular/material'; +import { CreateWalletFormComponent, WalletFormData } from '../../wallets/create-wallet/create-wallet-form/create-wallet-form.component'; +import { HwOptionsDialogComponent } from '../../../layout/hardware-wallet/hw-options-dialog/hw-options-dialog.component'; +import { Router } from '@angular/router'; +import { HwWalletService } from '../../../../services/hw-wallet.service'; +import { ISubscription } from 'rxjs/Subscription'; +import { BlockchainService } from '../../../../services/blockchain.service'; +import { ConfirmationData } from '../../../../app.datatypes'; +import { showConfirmationModal } from '../../../../utils'; + +@Component({ + selector: 'app-onboarding-create-wallet', + templateUrl: './onboarding-create-wallet.component.html', + styleUrls: ['./onboarding-create-wallet.component.scss'], +}) +export class OnboardingCreateWalletComponent implements OnInit, OnDestroy { + @ViewChild('formControl') formControl: CreateWalletFormComponent; + @Input() fill: WalletFormData = null; + @Output() onLabelAndSeedCreated = new EventEmitter(); + + showNewForm = true; + doubleButtonActive = DoubleButtonActive.LeftButton; + hwCompatibilityActivated = false; + + private synchronized = true; + private synchronizedSubscription: ISubscription; + + constructor( + private dialog: MatDialog, + private router: Router, + hwWalletService: HwWalletService, + blockchainService: BlockchainService, + ) { + this.hwCompatibilityActivated = hwWalletService.hwWalletCompatibilityActivated; + this.synchronizedSubscription = blockchainService.synchronized.subscribe(value => this.synchronized = value); + } + + ngOnInit() { + setTimeout(() => { this.formControl.initForm(null, this.fill); }); + if (this.fill) { + this.doubleButtonActive = this.fill.creatingNewWallet ? DoubleButtonActive.LeftButton : DoubleButtonActive.RightButton; + this.showNewForm = this.fill.creatingNewWallet; + } + } + + ngOnDestroy() { + this.synchronizedSubscription.unsubscribe(); + } + + changeForm(newState) { + newState === DoubleButtonActive.RightButton ? this.showNewForm = false : this.showNewForm = true; + + this.doubleButtonActive = newState; + this.fill = null; + this.formControl.initForm(this.showNewForm, this.fill); + } + + createWallet() { + this.showSafe().afterClosed().subscribe(result => { + if (result) { + this.emitCreatedData(); + } + }); + } + + loadWallet() { + if (this.synchronized) { + this.emitCreatedData(); + } else { + const confirmationData: ConfirmationData = { + headerText: 'wallet.new.synchronizing-warning-title', + text: 'wallet.new.synchronizing-warning-text', + confirmButtonText: 'wallet.new.synchronizing-warning-continue', + cancelButtonText: 'wallet.new.synchronizing-warning-cancel', + }; + + showConfirmationModal(this.dialog, confirmationData).afterClosed().subscribe(confirmationResult => { + if (confirmationResult) { + this.emitCreatedData(); + } + }); + } + } + + useHardwareWallet() { + const config = new MatDialogConfig(); + config.width = '566px'; + config.autoFocus = false; + config.data = true; + this.dialog.open(HwOptionsDialogComponent, config).afterClosed().subscribe(result => { + if (result) { + this.router.navigate(['/wallets']); + } + }); + } + + private emitCreatedData() { + this.onLabelAndSeedCreated.emit(this.formControl.getData()); + } + + private showSafe(): MatDialogRef { + const config = new MatDialogConfig(); + config.width = '450px'; + + return this.dialog.open(OnboardingSafeguardComponent, config); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-safeguard/onboarding-safeguard.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-safeguard/onboarding-safeguard.component.html new file mode 100644 index 00000000..980e9081 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-safeguard/onboarding-safeguard.component.html @@ -0,0 +1,15 @@ + +
+ {{ 'wizard.confirm.desc' | translate }} +
+ {{ 'wizard.confirm.checkbox' | translate }} + +
+
+
+ + {{ 'wizard.confirm.button' | translate }} + +
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-safeguard/onboarding-safeguard.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-safeguard/onboarding-safeguard.component.scss new file mode 100644 index 00000000..555a015d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-safeguard/onboarding-safeguard.component.scss @@ -0,0 +1,65 @@ +.-safe-description { + font-family: Skycoin; + line-height: 20px; + font-size: 12px; + + color: #1E2227; + mix-blend-mode: normal; + opacity: 0.8; +} + +.-check-container { + text-align: center; + margin-top: 50px; +} + +.-safe-check-text { + font-family: Skycoin; + line-height: normal; + font-size: 14px; + + color: #1E2227; +} + +.-check ::ng-deep { + .mat-checkbox-checkmark-path { + position: absolute; + width: 18px; + height: 8px; + left: 4.59px; + top: 9px; + stroke: #0072FF !important; + } + + .mat-checkbox-background, .mat-checkbox-frame { + top: 0; + left: 0; + right: 0; + bottom: 0; + position: absolute; + box-sizing: border-box; + pointer-events: none; + width: 20px; + height: 20px; + background: rgba(30, 34, 39, 0.05); + border-radius: 6px; + border-color: transparent; + } +} + +.-text-center { + text-align: center; +} + +.-no-bottom-margin ::ng-deep button { + margin: 28px 10px 0 10px !important; +} + +.-title { + font-family: Skycoin; + line-height: 30px; + font-size: 14px; + text-align: center; + letter-spacing: 0.0769231em; + color: #FF004E; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-safeguard/onboarding-safeguard.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-safeguard/onboarding-safeguard.component.spec.ts new file mode 100644 index 00000000..39e10978 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-safeguard/onboarding-safeguard.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { OnboardingSafeguardComponent } from './onboarding-safeguard.component'; + +describe('OnboardingSafeguardComponent', () => { + let component: OnboardingSafeguardComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ OnboardingSafeguardComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(OnboardingSafeguardComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-safeguard/onboarding-safeguard.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-safeguard/onboarding-safeguard.component.ts new file mode 100644 index 00000000..d4c7049a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-safeguard/onboarding-safeguard.component.ts @@ -0,0 +1,23 @@ +import { Component } from '@angular/core'; +import { MatDialogRef } from '@angular/material/dialog'; + +@Component({ + selector: 'app-onboarding-safeguard', + templateUrl: './onboarding-safeguard.component.html', + styleUrls: ['./onboarding-safeguard.component.scss'], +}) +export class OnboardingSafeguardComponent { + public acceptSafe = false; + + constructor( + public dialogRef: MatDialogRef, + ) { } + + closePopup() { + this.dialogRef.close(this.acceptSafe); + } + + setAccept(event) { + this.acceptSafe = event.checked; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-encrypt-wallet/onboarding-encrypt-wallet.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-encrypt-wallet/onboarding-encrypt-wallet.component.html new file mode 100644 index 00000000..1ddda637 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-encrypt-wallet/onboarding-encrypt-wallet.component.html @@ -0,0 +1,43 @@ +
+
+
+
+ {{ 'wallet.new.encrypt-title' | translate }} +
+
+

{{ 'wizard.encrypt-desc' | translate }}

+
+
+
+
+
+ + + {{ 'wallet.new.encrypt' | translate }} + +
+
+
+
+
+
+ + +
+
+ + +
+
+
+
+ +
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-encrypt-wallet/onboarding-encrypt-wallet.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-encrypt-wallet/onboarding-encrypt-wallet.component.scss new file mode 100644 index 00000000..1536dcfc --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-encrypt-wallet/onboarding-encrypt-wallet.component.scss @@ -0,0 +1,87 @@ +@import '../../../../../theme/variables'; + +.-header { + color: $white; + position: relative; + margin-top: 20px; + margin-bottom: 10px; + line-height: 30px; + font-size: 20px; + text-align: center; +} + +.-description { + line-height: 25px; + font-size: 14px; + text-align: center; + + color: $white; + mix-blend-mode: normal; + opacity: 0.5; +} + +.-buttons-footer { + align-items: center; + flex-flow: column; + margin-bottom: 20px; +} + +.-check-container { + margin: 10px auto; + text-align: center; +} + +:host ::ng-deep .-buttons-footer button { + margin: 2px 10px !important; +} + +.-text-align-center { + text-align: center; +} + +.-check ::ng-deep { + .mat-checkbox-checkmark-path { + position: absolute; + width: 18px; + height: 8px; + left: 4.59px; + top: 9px; + stroke: $white !important; + } + + .mat-checkbox-background, .mat-checkbox-frame { + top: 0; + left: 0; + right: 0; + bottom: 0; + position: absolute; + box-sizing: border-box; + pointer-events: none; + width: 20px; + height: 20px; + background: rgba(30, 34, 39, 0.05); + border-radius: 6px; + border-color: transparent; + } + span { + font-family: Skycoin; + line-height: normal; + font-size: 14px; + + color: #FBFBFB; + + img { + width: 38px; + height: 38px; + vertical-align: middle; + } + } +} + +.-input.disable{ + background: rgba(255, 255, 255, 0.1); +} + +.-hidden { + display: none; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-encrypt-wallet/onboarding-encrypt-wallet.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-encrypt-wallet/onboarding-encrypt-wallet.component.spec.ts new file mode 100644 index 00000000..ae851bb1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-encrypt-wallet/onboarding-encrypt-wallet.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { OnboardingEncryptWalletComponent } from './onboarding-encrypt-wallet.component'; + +describe('OnboardingEncryptWalletComponent', () => { + let component: OnboardingEncryptWalletComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ OnboardingEncryptWalletComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(OnboardingEncryptWalletComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-encrypt-wallet/onboarding-encrypt-wallet.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-encrypt-wallet/onboarding-encrypt-wallet.component.ts new file mode 100644 index 00000000..5a42b8bd --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-encrypt-wallet/onboarding-encrypt-wallet.component.ts @@ -0,0 +1,69 @@ +import { Component, EventEmitter, OnInit, Output, ViewChild } from '@angular/core'; +import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'; +import { ButtonComponent } from '../../../layout/button/button.component'; + +@Component({ + selector: 'app-onboarding-encrypt-wallet', + templateUrl: './onboarding-encrypt-wallet.component.html', + styleUrls: ['./onboarding-encrypt-wallet.component.scss'], +}) +export class OnboardingEncryptWalletComponent implements OnInit { + @ViewChild('button') button: ButtonComponent; + @Output() onPasswordCreated = new EventEmitter(); + @Output() onBack = new EventEmitter(); + form: FormGroup; + + constructor( + private formBuilder: FormBuilder, + ) { } + + ngOnInit() { + this.initEncryptForm(); + } + + initEncryptForm() { + this.form = this.formBuilder.group({ + password: new FormControl('', Validators.compose([Validators.required, Validators.minLength(2)])), + confirm: new FormControl('', + Validators.compose([ + Validators.required, + Validators.minLength(2), + ]), + ), + }, + { + validator: this.passwordMatchValidator.bind(this), + }); + } + + setEncrypt(event) { + event.checked ? this.form.enable() : this.form.disable(); + } + + emitCreatedPassword() { + if ((this.form.enabled && !this.form.valid) || this.button.isLoading()) { + return; + } + + this.button.setLoading(); + + this.onPasswordCreated.emit(this.form.enabled ? this.form.get('password').value : null); + } + + emitBack() { + this.onBack.emit(); + } + + resetButton() { + this.button.resetState(); + } + + get isWorking() { + return this.button.isLoading(); + } + + private passwordMatchValidator(g: FormGroup) { + return g.get('password').value === g.get('confirm').value + ? null : { mismatch: true }; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding.component.html new file mode 100644 index 00000000..e23d1aad --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding.component.html @@ -0,0 +1,16 @@ + + + + + diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding.component.scss new file mode 100644 index 00000000..4459db3d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding.component.scss @@ -0,0 +1,12 @@ +button { + position: fixed; + right: 30px; + top: 10px; +} + +.flag { + width: 16px; + height: 16px; + position: relative; + top: -3px; +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding.component.spec.ts new file mode 100644 index 00000000..b41b460f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { OnboardingComponent } from './onboarding.component'; + +describe('OnboardingComponent', () => { + let component: OnboardingComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ OnboardingComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(OnboardingComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding.component.ts new file mode 100644 index 00000000..38c46c90 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding.component.ts @@ -0,0 +1,80 @@ +import { Component, OnInit, OnDestroy, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; +import { WalletService } from '../../../services/wallet.service'; +import { LanguageData, LanguageService } from '../../../services/language.service'; +import { ISubscription } from 'rxjs/Subscription'; +import { openChangeLanguageModal } from '../../../utils'; +import { MatDialog } from '@angular/material'; +import { WalletFormData } from '../wallets/create-wallet/create-wallet-form/create-wallet-form.component'; +import { MsgBarService } from '../../../services/msg-bar.service'; +import { OnboardingEncryptWalletComponent } from './onboarding-encrypt-wallet/onboarding-encrypt-wallet.component'; + +@Component({ + selector: 'app-onboarding', + templateUrl: './onboarding.component.html', + styleUrls: ['./onboarding.component.scss'], +}) +export class OnboardingComponent implements OnInit, OnDestroy { + @ViewChild('encryptForm') encryptForm: OnboardingEncryptWalletComponent; + + step = 1; + formData: WalletFormData; + password: string|null; + language: LanguageData; + + private subscription: ISubscription; + + constructor( + private router: Router, + private walletService: WalletService, + private languageService: LanguageService, + private dialog: MatDialog, + private msgBarService: MsgBarService, + ) { } + + ngOnInit() { + this.subscription = this.languageService.currentLanguage + .subscribe(lang => this.language = lang); + } + + ngOnDestroy() { + this.subscription.unsubscribe(); + } + + onLabelAndSeedCreated(data: WalletFormData) { + this.formData = data, + this.step = 2; + } + + onPasswordCreated(password: string|null) { + this.password = password; + + this.createWallet(); + } + + onBack() { + this.step = 1; + } + + changelanguage() { + openChangeLanguageModal(this.dialog) + .subscribe(response => { + if (response) { + this.languageService.changeLanguage(response); + } + }); + } + + get fill() { + return this.formData; + } + + private createWallet() { + this.walletService.create(this.formData.label, this.formData.seed, 100, this.password).subscribe(() => { + this.router.navigate(['/wallets']); + }, e => { + this.msgBarService.showError(e); + this.encryptForm.resetButton(); + }); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/reset-password/reset-password.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/reset-password/reset-password.component.html new file mode 100644 index 00000000..73828752 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/reset-password/reset-password.component.html @@ -0,0 +1,28 @@ + +
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + {{ 'reset.reset-button' | translate }} + +
+
+
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/reset-password/reset-password.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/reset-password/reset-password.component.scss new file mode 100644 index 00000000..0823d4ea --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/reset-password/reset-password.component.scss @@ -0,0 +1,15 @@ +.-buttons { + text-align: center; +} + +.-paper { + background-color: #fbfbfb; + border-radius: 10px; + box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.01), 1px 1px 2px 2px rgba(0, 0, 0, 0.01); + padding: 30px; + margin: 30px; +} + +.-disabled { + opacity: 0.5; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/reset-password/reset-password.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/reset-password/reset-password.component.spec.ts new file mode 100644 index 00000000..a5d70a21 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/reset-password/reset-password.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ResetPasswordComponent } from './reset-password.component'; + +describe('ResetPasswordComponent', () => { + let component: ResetPasswordComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ResetPasswordComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ResetPasswordComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/reset-password/reset-password.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/reset-password/reset-password.component.ts new file mode 100644 index 00000000..11cb7072 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/reset-password/reset-password.component.ts @@ -0,0 +1,98 @@ +import { Component, OnDestroy, ViewChild } from '@angular/core'; +import { ISubscription } from 'rxjs/Subscription'; +import { ButtonComponent } from '../../layout/button/button.component'; +import { FormGroup, FormBuilder, FormControl, Validators } from '@angular/forms'; +import { Params, ActivatedRoute, Router } from '@angular/router'; +import { Observable } from 'rxjs/Observable'; +import { WalletService } from '../../../services/wallet.service'; +import { Wallet } from '../../../app.datatypes'; +import { MsgBarService } from '../../../services/msg-bar.service'; + +@Component({ + selector: 'app-reset-password', + templateUrl: './reset-password.component.html', + styleUrls: ['./reset-password.component.scss'], +}) +export class ResetPasswordComponent implements OnDestroy { + @ViewChild('resetButton') resetButton: ButtonComponent; + + form: FormGroup; + + private subscription: ISubscription; + private wallet: Wallet; + private done = false; + private hideBarWhenClosing = true; + + constructor( + public formBuilder: FormBuilder, + private route: ActivatedRoute, + private router: Router, + private walletService: WalletService, + private msgBarService: MsgBarService, + ) { + this.initForm(''); + this.subscription = Observable.zip(this.route.params, this.walletService.all(), (params: Params, wallets: Wallet[]) => { + const wallet = wallets.find(w => w.filename === params['id']); + if (!wallet) { + setTimeout(() => this.router.navigate([''], {skipLocationChange: true})); + + return; + } + + this.wallet = wallet; + this.initForm(wallet.label); + }).subscribe(); + } + + ngOnDestroy() { + this.subscription.unsubscribe(); + if (this.hideBarWhenClosing) { + this.msgBarService.hide(); + } + } + + initForm(walletName: string) { + const validators = []; + validators.push(this.passwordMatchValidator.bind(this)); + + this.form = new FormGroup({}, validators); + this.form.addControl('wallet', new FormControl(walletName)); + this.form.addControl('seed', new FormControl('', [Validators.required])); + this.form.addControl('password', new FormControl()); + this.form.addControl('confirm', new FormControl()); + } + + reset() { + if (!this.form.valid || this.resetButton.isLoading() || this.done) { + return; + } + + this.msgBarService.hide(); + this.resetButton.setLoading(); + + this.walletService.resetPassword(this.wallet, this.form.value.seed, this.form.value.password !== '' ? this.form.value.password : null) + .subscribe(() => { + this.resetButton.setSuccess(); + this.resetButton.setDisabled(); + this.done = true; + + this.hideBarWhenClosing = false; + this.msgBarService.showDone('reset.done'); + + setTimeout(() => { + this.router.navigate(['']); + }, 2000); + }, error => { + this.resetButton.resetState(); + this.msgBarService.showError(error); + }); + } + + private passwordMatchValidator() { + if (this.form && this.form.get('password') && this.form.get('confirm')) { + return this.form.get('password').value === this.form.get('confirm').value ? null : { NotEqual: true }; + } else { + return { NotEqual: true }; + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/select-address/select-address.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/select-address/select-address.html new file mode 100644 index 00000000..6f745d35 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/select-address/select-address.html @@ -0,0 +1,13 @@ + +
+
{{ wallet.label }}
+ +
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/select-address/select-address.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/select-address/select-address.scss new file mode 100644 index 00000000..e0e52038 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/select-address/select-address.scss @@ -0,0 +1,44 @@ +@import '../../../../../../theme/variables'; + +button { + width: 100%; + text-align: left; + padding: 10px 10px; + border-bottom: 1px solid #eff0f0; +} + +.wallet-container { + padding-top: 30px; + margin: 0px -10px; + + &:first-child { + padding-top: 0px; + } + + .title { + color: $black; + border-bottom: 1px solid #eff0f0; + padding: 0px 10px; + font-size: 18px; + line-height: 32px; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + } + + .address { + font-size: 13px; + line-height: 22px; + color: $black; + } + + .balance { + font-size: 12px; + line-height: 18px; + color: $black; + + .grey { + color: $grey; + } + } +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/select-address/select-address.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/select-address/select-address.spec.ts new file mode 100644 index 00000000..64ab6118 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/select-address/select-address.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SelectAddressComponent } from './select-address'; + +describe('SelectAddressComponent', () => { + let component: SelectAddressComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SelectAddressComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SelectAddressComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/select-address/select-address.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/select-address/select-address.ts new file mode 100644 index 00000000..37ca511a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/select-address/select-address.ts @@ -0,0 +1,29 @@ +import { Component } from '@angular/core'; +import { MatDialogRef } from '@angular/material/dialog'; +import { WalletService } from '../../../../../services/wallet.service'; +import { Wallet } from '../../../../../app.datatypes'; + +@Component({ + selector: 'app-select-address', + templateUrl: './select-address.html', + styleUrls: ['./select-address.scss'], +}) +export class SelectAddressComponent { + + wallets: Wallet[] = []; + + constructor( + public dialogRef: MatDialogRef, + public walletService: WalletService, + ) { + this.walletService.all().first().subscribe(wallets => this.wallets = wallets); + } + + closePopup() { + this.dialogRef.close(); + } + + select(value: string) { + this.dialogRef.close(value); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/send-form-advanced.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/send-form-advanced.component.html new file mode 100644 index 00000000..f6697066 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/send-form-advanced.component.html @@ -0,0 +1,222 @@ +
+
+ +
+ +
+
+ + +
+ +
+ + + {{ addr.address }} - {{ (addr.coins ? addr.coins.toString() : 0) | amount }} + ({{ addr.hours.toString() | amount:false }}) + + +
+ {{ address.address }} - {{ (address.coins ? address.coins.toString() : 0) | amount }} + ({{ address.hours.toString() | amount:false }}) +
+
+
+
+
+ +
+ +
+ + + {{ out.hash }} - {{ (out.coins ? out.coins.toString() : 0) | amount }} + ({{ out.calculated_hours.toString() | amount:false }}) + + +
+ {{ out.hash }} - {{ (out.coins ? out.coins.toString() : 0) | amount }} + ({{ out.calculated_hours.toString() | amount:false }}) +
+
+ +
{{ 'send.all-outputs' | translate }}
+
+
+
+
+
+ {{ 'send.available-msg-part1' | translate }} + + {{ availableCoins.toString() | amount }} + + {{ 'send.available-msg-part2' | translate }} + + {{ availableHours.toString() | amount:false }} + + {{ 'send.available-msg-part3' | translate }} + + {{ minimumFee.toString() | amount:false }} + + {{ 'send.available-msg-part4' | translate }} +
+
+ +
+ +
+ +
+ + {{ 'send.bulk-send.title' | translate }} keyboard_arrow_down + + +
+
+
+ +
+
+
+ + {{ selectedCurrency === doubleButtonActive.LeftButton ? ('coin' | commonText) : ('common.usd' | translate) }} +
+
+ {{ 'send.invalid-amount' | translate }} + + ~ {{ values[i] | number:'1.0-2' }} {{ 'common.usd' | translate }} + + + ~ {{ values[i] | amount }} + + +
+
+
+
+ + {{ 'hours' | commonText }} +
+
+
+ plus + minus +
+
+
+
+
+
+
+ {{ 'send.total' | translate }} {{ totalCoins.toString() | amount }} / {{ totalConvertedCoins.toString() | number:'1.0-2' }} {{ 'common.usd' | translate }} +
+
+
+
+ {{ 'send.total' | translate }} {{ totalHours.toString() | amount:false }} +
+
+
+
+ +
+ + +
+ +
+ + +
+ +
+
+
+ +
+ {{ 'send.hours-allocation-label' | translate }} + + {{ 'send.options-label' | translate }} {{ autoOptions ? 'keyboard_arrow_up' : 'keyboard_arrow_down' }} + +
+
+
+
+ +
+
+
+ + +
+
+
+
+
+ +
+ + {{ 'send.preview-button' | translate }} + + + {{ 'send.send-button' | translate }} + +
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/send-form-advanced.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/send-form-advanced.component.scss new file mode 100644 index 00000000..fc62598d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/send-form-advanced.component.scss @@ -0,0 +1,186 @@ +@import '../../../../../theme/variables'; + +.form-field { + mat-spinner { + height: 12px !important; + width: 12px !important; + opacity: 0.5; + margin: 0 !important; + display: inline-block; + position: relative; + top: 2px; + margin-left: 8px; + + ::ng-deep svg { + height: 12px !important; + width: 12px !important; + } + } +} + +.-destination { + &:not(:last-child) { + margin-bottom: 5px; + } + + .-icons { + text-align: right; + padding-top: 5px; + + img { + width: 32px; + cursor: pointer; + } + } +} + +mat-checkbox { + font-size: 12px; +} + +mat-select { + background: white; + border: 2px solid rgba(0, 0, 0, 0.05); + border-radius: 6px; + + ::ng-deep .mat-select-trigger { + padding: 10px 30px 10px 10px; + display: block; + font-size: 11px; + height: 100%; + line-height: 20px; + } + + ::ng-deep .mat-select-arrow { + border: none; + } + + ::ng-deep .mat-select-placeholder { + color: unset !important; + transition: unset !important; + } +} + +mat-option ::ng-deep .mat-pseudo-checkbox-checked { + background: $gradient-blue-dark; +} + +.-autohours { + margin: 40px 0 20px; + + .-check ::ng-deep { + .mat-checkbox-checkmark-path { + stroke: $gradient-blue-dark !important; + } + + .mat-checkbox-background, .mat-checkbox-frame { + width: 20px; + height: 20px; + background: rgba(30, 34, 39, 0.05); + border-radius: 6px; + border-color: transparent; + } + + .mat-checkbox-label { + line-height: 20px; + font-size: 13px; + color: $grey-dark; + flex: 1; + } + + .mat-checkbox-layout { + display: flex; + } + } + + .-options-wrapper { + margin-top: 20px; + + mat-slider { + width: 100%; + padding: 0; + height: 40px; + border: 2px solid rgba(0, 0, 0, 0.05); + border-radius: 6px; + background: white; + + ::ng-deep { + .mat-slider-thumb, .mat-slider-thumb-label { + background-color: $gradient-blue-dark !important; + transform: scale(1) !important; + border-width: 0 !important; + } + + .mat-slider-thumb { + right: -6px; + width: 12px; + height: 32px; + border-radius: 3px; + } + + .mat-slider-track-fill, .mat-slider-track-background { + background-color: white !important; + } + } + } + } +} + +.-options { + padding-left: 5px; + color: $gradient-blue-dark; + cursor: pointer; + font-size: 13px; + + mat-icon { + color: $gradient-blue-dark; + padding: 0; + display: inline; + vertical-align: middle; + font-size: 13px; + } +} + +.-buttons { + text-align: center; +} + +.-hidden { + display: none; +} + +.-space-between { + display: flex; + justify-content: space-between; +} + +label mat-icon { + display: inline; + font-size: 14px; + color: lighten($grey, 40%); + vertical-align: text-bottom; + padding-left: 5px; +} + +.-available-msg { + background-color: $grey-lightest; + border: 1px dotted $grey-light; + border-radius: 6px; + padding: 10px; + font-size: 11px; + text-align: center; + + span { + opacity: 0.7; + } + + .value { + opacity: 1 !important; + font-weight: bold; + font-size: 13px; + } +} + +.destinations-label { + display: inline-block; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/send-form-advanced.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/send-form-advanced.component.spec.ts new file mode 100644 index 00000000..057bc477 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/send-form-advanced.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SendFormAdvancedComponent } from './send-form-advanced.component'; + +describe('SendFormAdvancedComponent', () => { + let component: SendFormAdvancedComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SendFormAdvancedComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SendFormAdvancedComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/send-form-advanced.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/send-form-advanced.component.ts new file mode 100644 index 00000000..66990561 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/send-form-advanced.component.ts @@ -0,0 +1,895 @@ +import { Component, EventEmitter, Input, OnDestroy, OnInit, Output, ViewChild, ChangeDetectorRef } from '@angular/core'; +import { WalletService } from '../../../../services/wallet.service'; +import { FormArray, FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { MatDialog, MatDialogConfig } from '@angular/material'; +import { PasswordDialogComponent } from '../../../layout/password-dialog/password-dialog.component'; +import { ButtonComponent } from '../../../layout/button/button.component'; +import { getHardwareWalletErrorMsg } from '../../../../utils/errors'; +import { ISubscription } from 'rxjs/Subscription'; +import { NavBarService } from '../../../../services/nav-bar.service'; +import { SelectAddressComponent } from './select-address/select-address'; +import { BigNumber } from 'bignumber.js'; +import { Output as UnspentOutput, Wallet, Address, ConfirmationData } from '../../../../app.datatypes'; +import { Observable } from 'rxjs/Observable'; +import 'rxjs/add/operator/retryWhen'; +import 'rxjs/add/operator/concat'; +import { BlockchainService } from '../../../../services/blockchain.service'; +import { showConfirmationModal } from '../../../../utils'; +import { AppService } from '../../../../services/app.service'; +import { HwWalletService } from '../../../../services/hw-wallet.service'; +import { TranslateService } from '@ngx-translate/core'; +import { DoubleButtonActive } from '../../../layout/double-button/double-button.component'; +import { PriceService } from '../../../../services/price.service'; +import { SendFormComponent } from '../send-form/send-form.component'; +import { ChangeNoteComponent } from '../send-preview/transaction-info/change-note/change-note.component'; +import { MsgBarService } from '../../../../services/msg-bar.service'; +import { MultipleDestinationsDialogComponent } from '../../../layout/multiple-destinations-dialog/multiple-destinations-dialog.component'; + +@Component({ + selector: 'app-send-form-advanced', + templateUrl: './send-form-advanced.component.html', + styleUrls: ['./send-form-advanced.component.scss'], +}) +export class SendFormAdvancedComponent implements OnInit, OnDestroy { + @ViewChild('previewButton') previewButton: ButtonComponent; + @ViewChild('sendButton') sendButton: ButtonComponent; + @Input() formData: any; + @Output() onFormSubmitted = new EventEmitter(); + + maxNoteChars = ChangeNoteComponent.MAX_NOTE_CHARS; + form: FormGroup; + wallet: Wallet; + addresses = []; + allUnspentOutputs: UnspentOutput[] = []; + unspentOutputs: UnspentOutput[] = []; + loadingUnspentOutputs = false; + availableCoins = new BigNumber(0); + availableHours = new BigNumber(0); + minimumFee = new BigNumber(0); + autoHours = true; + autoOptions = false; + autoShareValue = '0.5'; + previewTx: boolean; + busy = false; + doubleButtonActive = DoubleButtonActive; + selectedCurrency = DoubleButtonActive.LeftButton; + values: number[]; + price: number; + wallets: Wallet[]; + totalCoins = new BigNumber(0); + totalConvertedCoins = new BigNumber(0); + totalHours = new BigNumber(0); + + private subscriptionsGroup: ISubscription[] = []; + private getOutputsSubscriptions: ISubscription; + private destinationSubscriptions: ISubscription[] = []; + private destinationHoursSubscriptions: ISubscription[] = []; + private syncCheckSubscription: ISubscription; + private processingSubscription: ISubscription; + + constructor( + public blockchainService: BlockchainService, + public walletService: WalletService, + private appService: AppService, + private formBuilder: FormBuilder, + private dialog: MatDialog, + private msgBarService: MsgBarService, + private navbarService: NavBarService, + private hwWalletService: HwWalletService, + private translate: TranslateService, + private priceService: PriceService, + private changeDetector: ChangeDetectorRef, + ) { } + + ngOnInit() { + this.navbarService.showSwitch('send.simple', 'send.advanced', DoubleButtonActive.RightButton); + + this.form = this.formBuilder.group({ + wallet: ['', Validators.required], + addresses: [null], + outputs: [null], + changeAddress: [''], + destinations: this.formBuilder.array( + [this.createDestinationFormGroup()], + this.validateDestinations.bind(this), + ), + note: [''], + }); + + this.subscriptionsGroup.push(this.form.get('wallet').valueChanges.subscribe(wallet => { + this.wallet = wallet; + + this.closeGetOutputsSubscriptions(); + this.allUnspentOutputs = []; + this.unspentOutputs = []; + this.loadingUnspentOutputs = true; + + this.getOutputsSubscriptions = this.walletService.getWalletUnspentOutputs(wallet) + .retryWhen(errors => errors.delay(1000).take(10).concat(Observable.throw(''))) + .subscribe( + result => { + this.loadingUnspentOutputs = false; + this.allUnspentOutputs = result; + this.unspentOutputs = this.filterUnspentOutputs(); + }, + () => this.loadingUnspentOutputs = false, + ); + + this.addresses = wallet.addresses.filter(addr => addr.coins > 0); + this.form.get('addresses').setValue(null); + this.form.get('outputs').setValue(null); + + this.updateAvailableBalance(); + this.form.get('destinations').updateValueAndValidity(); + })); + + this.subscriptionsGroup.push(this.form.get('addresses').valueChanges.subscribe(() => { + this.form.get('outputs').setValue(null); + this.unspentOutputs = this.filterUnspentOutputs(); + + this.updateAvailableBalance(); + this.form.get('destinations').updateValueAndValidity(); + })); + + this.subscriptionsGroup.push(this.form.get('outputs').valueChanges.subscribe(() => { + this.updateAvailableBalance(); + this.form.get('destinations').updateValueAndValidity(); + })); + + this.subscriptionsGroup.push(this.priceService.price.subscribe(price => { + this.price = price; + this.updateValues(); + })); + + if (this.formData) { + this.fillForm(); + } + + this.subscriptionsGroup.push(this.walletService.all().first().subscribe(wallets => { + this.wallets = wallets; + if (wallets.length === 1) { + this.form.get('wallet').setValue(wallets[0]); + } + })); + } + + ngOnDestroy() { + if (this.processingSubscription && !this.processingSubscription.closed) { + this.processingSubscription.unsubscribe(); + } + this.closeGetOutputsSubscriptions(); + this.closeSyncCheckSubscription(); + this.subscriptionsGroup.forEach(sub => sub.unsubscribe()); + this.navbarService.hideSwitch(); + this.msgBarService.hide(); + this.destinationSubscriptions.forEach(s => s.unsubscribe()); + this.destinationHoursSubscriptions.forEach(s => s.unsubscribe()); + } + + preview() { + this.previewTx = true; + this.checkBeforeSending(); + this.changeDetector.detectChanges(); + } + + send() { + this.previewTx = false; + this.checkBeforeSending(); + } + + changeActiveCurrency(value) { + if (value !== this.selectedCurrency) { + this.selectedCurrency = value; + this.askIfConvertAmount(); + this.updateValues(); + (this.form.get('destinations') as FormArray).updateValueAndValidity(); + } + } + + private askIfConvertAmount() { + let validAmounts = 0; + this.destControls.forEach((dest, i) => { + let value: string = dest.get('coins').value; + value = value ? value.trim() : value; + const currentValue = new BigNumber(value); + + if (!value || currentValue.isNaN()) { + return; + } + + validAmounts += 1; + }); + if (validAmounts === 0) { + return; + } + + const usd = this.translate.instant('common.usd'); + const currentCoin = this.appService.coinName; + let fromText: string; + let toText: string; + if (this.selectedCurrency === DoubleButtonActive.LeftButton) { + fromText = usd; + toText = currentCoin; + } else { + fromText = currentCoin; + toText = usd; + } + + const confirmationData: ConfirmationData = { + text: this.translate.instant(validAmounts === 1 ? 'send.convert-confirmation' : 'send.convert-confirmation-plural', {from: fromText, to: toText}), + headerText: 'confirmation.header-text', + confirmButtonText: 'confirmation.confirm-button', + cancelButtonText: 'confirmation.cancel-button', + }; + + showConfirmationModal(this.dialog, confirmationData).afterClosed().subscribe(confirmationResult => { + if (confirmationResult) { + this.convertAmounts(); + } + }); + } + + private convertAmounts() { + this.msgBarService.hide(); + + let invalidValues = 0; + let valuesWithPrecisionErrors = 0; + this.destControls.forEach((dest, i) => { + let value: string = dest.get('coins').value; + value = value ? value.trim() : value; + const currentValue = new BigNumber(value); + + if (value) { + if (!value || currentValue.isNaN()) { + invalidValues += 1; + + return; + } + + if (this.selectedCurrency === DoubleButtonActive.LeftButton) { + const newValue = currentValue.dividedBy(this.price).decimalPlaces(this.blockchainService.currentMaxDecimals); + const recoveredValue = newValue.multipliedBy(this.price).decimalPlaces(SendFormComponent.MaxUsdDecimals, BigNumber.ROUND_FLOOR); + if (!recoveredValue.isEqualTo(currentValue)) { + valuesWithPrecisionErrors += 1; + } + + dest.get('coins').setValue(newValue.toString()); + } else { + const newValue = currentValue.multipliedBy(this.price).decimalPlaces(SendFormComponent.MaxUsdDecimals, BigNumber.ROUND_FLOOR); + const recoveredValue = newValue.dividedBy(this.price).decimalPlaces(this.blockchainService.currentMaxDecimals); + if (!recoveredValue.isEqualTo(currentValue)) { + valuesWithPrecisionErrors += 1; + } + + dest.get('coins').setValue(newValue.toString()); + } + } + }); + + if (invalidValues > 0 && valuesWithPrecisionErrors > 0) { + this.msgBarService.showWarning(this.translate.instant('send.multiple-problems-warning')); + } else if (invalidValues === 1) { + this.msgBarService.showWarning(this.translate.instant('send.invaid-amount-warning')); + } else if (invalidValues > 1) { + this.msgBarService.showWarning(this.translate.instant('send.invaid-amounts-warning')); + } else if (valuesWithPrecisionErrors === 1) { + this.msgBarService.showWarning(this.translate.instant('send.precision-error-warning')); + } else if (valuesWithPrecisionErrors > 1) { + this.msgBarService.showWarning(this.translate.instant('send.precision-errors-warning')); + } + } + + assignAll(index: number) { + this.msgBarService.hide(); + + let availableCoins: BigNumber = this.form.get('wallet').value && this.form.get('wallet').value.coins ? this.form.get('wallet').value.coins : new BigNumber(-1); + if ((availableCoins as BigNumber).isEqualTo(-1)) { + this.msgBarService.showError(this.translate.instant('send.no-wallet-selected')); + + return; + } + + if (this.selectedCurrency === DoubleButtonActive.RightButton) { + availableCoins = availableCoins.multipliedBy(this.price).decimalPlaces(SendFormComponent.MaxUsdDecimals, BigNumber.ROUND_FLOOR); + } + + this.destControls.forEach((dest, i) => { + if (i !== index) { + const value = Number.parseFloat((dest.get('coins').value as string).trim()); + if (!value || isNaN(value)) { + return; + } else { + availableCoins = availableCoins.minus(value); + } + } + }); + + if (this.selectedCurrency === DoubleButtonActive.LeftButton) { + availableCoins = availableCoins.decimalPlaces(this.blockchainService.currentMaxDecimals, BigNumber.ROUND_FLOOR); + } else { + availableCoins = availableCoins.decimalPlaces(SendFormComponent.MaxUsdDecimals, BigNumber.ROUND_FLOOR); + } + + if (availableCoins.isLessThan(0)) { + this.msgBarService.showError(this.translate.instant('send.no-coins-left')); + } else { + this.destControls[index].get('coins').setValue(availableCoins.toString()); + } + } + + private updateValues() { + if (!this.price) { + this.values = null; + + return; + } + + this.values = []; + this.totalCoins = new BigNumber(0); + this.totalConvertedCoins = new BigNumber(0); + this.totalHours = new BigNumber(0); + + this.destControls.forEach((dest, i) => { + const stringValue: string = dest.get('coins').value; + const value = this.getAmount(stringValue, true); + if (!value) { + this.values[i] = -1; + + return; + } + + if (this.selectedCurrency === DoubleButtonActive.LeftButton) { + const convertedValue = value.multipliedBy(this.price).decimalPlaces(2); + + this.totalCoins = this.totalCoins.plus(value); + this.totalConvertedCoins = this.totalConvertedCoins.plus(convertedValue); + + this.values[i] = convertedValue.toNumber(); + } else { + const convertedValue = value.dividedBy(this.price).decimalPlaces(this.blockchainService.currentMaxDecimals); + + this.totalCoins = this.totalCoins.plus(convertedValue); + this.totalConvertedCoins = this.totalConvertedCoins.plus(value); + + this.values[i] = convertedValue.toNumber(); + } + }); + + if (!this.autoHours) { + this.destControls.forEach((dest, i) => { + const stringValue: string = dest.get('hours').value; + const value = this.getAmount(stringValue, false); + if (!value) { + return; + } + + this.totalHours = this.totalHours.plus(value); + }); + } + } + + private checkBeforeSending() { + if (!this.form.valid || this.previewButton.isLoading() || this.sendButton.isLoading()) { + return; + } + + this.closeSyncCheckSubscription(); + this.syncCheckSubscription = this.blockchainService.synchronized.first().subscribe(synchronized => { + if (synchronized) { + this.prepareTransaction(); + } else { + this.showSynchronizingWarning(); + } + }); + } + + private showSynchronizingWarning() { + const confirmationData: ConfirmationData = { + text: 'send.synchronizing-warning', + headerText: 'confirmation.header-text', + confirmButtonText: 'confirmation.confirm-button', + cancelButtonText: 'confirmation.cancel-button', + }; + + showConfirmationModal(this.dialog, confirmationData).afterClosed().subscribe(confirmationResult => { + if (confirmationResult) { + this.prepareTransaction(); + } + }); + } + + private prepareTransaction() { + this.msgBarService.hide(); + this.previewButton.resetState(); + this.sendButton.resetState(); + + if (this.form.value.wallet.encrypted && !this.form.value.wallet.isHardware && !this.previewTx) { + const config = new MatDialogConfig(); + config.data = { + wallet: this.form.value.wallet, + }; + + this.dialog.open(PasswordDialogComponent, config).componentInstance.passwordSubmit + .subscribe(passwordDialog => { + this.createTransaction(passwordDialog); + }); + } else { + if (!this.form.value.wallet.isHardware || this.previewTx) { + this.createTransaction(); + } else { + this.showBusy(); + this.processingSubscription = this.hwWalletService.checkIfCorrectHwConnected((this.form.value.wallet as Wallet).addresses[0].address).subscribe( + () => this.createTransaction(), + err => this.showError(getHardwareWalletErrorMsg(this.translate, err)), + ); + } + } + } + + addDestination() { + const destinations = this.form.get('destinations') as FormArray; + destinations.push(this.createDestinationFormGroup()); + this.updateValues(); + } + + removeDestination(index) { + const destinations = this.form.get('destinations') as FormArray; + destinations.removeAt(index); + + this.destinationSubscriptions[index].unsubscribe(); + this.destinationSubscriptions.splice(index, 1); + this.destinationHoursSubscriptions[index].unsubscribe(); + this.destinationHoursSubscriptions.splice(index, 1); + this.updateValues(); + } + + setShareValue(event) { + this.autoShareValue = parseFloat(event.value).toFixed(2); + } + + selectChangeAddress(event) { + const config = new MatDialogConfig(); + config.width = '566px'; + config.autoFocus = false; + this.dialog.open(SelectAddressComponent, config).afterClosed().subscribe(response => { + if (response) { + this.form.get('changeAddress').setValue(response); + } + }); + } + + openMultipleDestinationsPopup() { + + let currentString = ''; + this.destControls.map((destControl, i) => { + if ((destControl.get('address').value as string).trim().length > 0 || + (destControl.get('coins').value as string).trim().length > 0 || + (!this.autoHours && (destControl.get('hours').value as string).trim().length > 0)) { + + currentString += (destControl.get('address').value as string).replace(',', ''); + currentString += ', ' + (destControl.get('coins').value as string).replace(',', ''); + if (!this.autoHours) { + currentString += ', ' + (destControl.get('hours').value as string).replace(',', ''); + } + currentString += '\r\n'; + } + }); + if (currentString.length > 0) { + currentString = currentString.substr(0, currentString.length - 1); + } + + const config = new MatDialogConfig(); + config.width = '566px'; + config.data = currentString; + this.dialog.open(MultipleDestinationsDialogComponent, config).afterClosed().subscribe((response: string[][]) => { + if (response) { + while (this.destControls.length > 0) { + (this.form.get('destinations') as FormArray).removeAt(0); + } + + if (response.length > 0) { + this.autoHours = response[0].length === 2; + + response.forEach((entry, i) => { + this.addDestination(); + this.destControls[i].get('address').setValue(entry[0]); + this.destControls[i].get('coins').setValue(entry[1]); + if (!this.autoHours) { + this.destControls[i].get('hours').setValue(entry[2]); + } + }); + } else { + this.addDestination(); + } + } + }); + + this.updateValues(); + } + + toggleOptions(event) { + event.stopPropagation(); + event.preventDefault(); + + this.autoOptions = !this.autoOptions; + } + + setAutoHours(event) { + this.autoHours = event.checked; + this.form.get('destinations').updateValueAndValidity(); + this.updateValues(); + + if (!this.autoHours) { + this.autoOptions = false; + } + } + + private fillForm() { + this.addresses = this.formData.form.wallet.addresses; + + ['wallet', 'addresses', 'changeAddress', 'note'].forEach(name => { + this.form.get(name).setValue(this.formData.form[name]); + }); + + for (let i = 0; i < this.formData.form.destinations.length - 1; i++) { + this.addDestination(); + } + + this.destControls.forEach((destControl, i) => { + ['address', 'hours'].forEach(name => { + destControl.get(name).setValue(this.formData.form.destinations[i][name]); + }); + destControl.get('coins').setValue(this.formData.form.destinations[i].originalAmount); + }); + + if (this.formData.form.hoursSelection.type === 'auto') { + this.autoShareValue = this.formData.form.hoursSelection.share_factor; + this.autoHours = true; + } else { + this.autoHours = false; + } + + this.autoOptions = this.formData.form.autoOptions; + + if (this.formData.form.allUnspentOutputs) { + this.closeGetOutputsSubscriptions(); + + this.allUnspentOutputs = this.formData.form.allUnspentOutputs; + this.unspentOutputs = this.filterUnspentOutputs(); + + this.form.get('outputs').setValue(this.formData.form.outputs); + } + + this.selectedCurrency = this.formData.form.currency; + + this.updateValues(); + } + + addressCompare(a, b) { + return a && b && a.address === b.address; + } + + outputCompare(a, b) { + return a && b && a.hash === b.hash; + } + + get destControls() { + return (this.form.get('destinations') as FormArray).controls; + } + + private validateDestinations() { + if (!this.form) { + return { Required: true }; + } + + const invalidInput = this.destControls.find(control => { + if (!control.get('address').value || (control.get('address').value as string).trim().length === 0) { + return true; + } + + const checkControls = ['coins']; + + if (!this.autoHours) { + checkControls.push('hours'); + } + + return checkControls.map(name => { + const stringValue: string = control.get(name).value; + + return this.getAmount(stringValue, name === 'coins') === null; + }).find(e => e === true); + }); + + if (invalidInput) { + return { Invalid: true }; + } + + this.updateAvailableBalance(); + + let destinationsCoins = new BigNumber(0); + if (this.selectedCurrency === DoubleButtonActive.LeftButton) { + this.destControls.map(control => destinationsCoins = destinationsCoins.plus(control.value.coins)); + } else { + this.updateValues(); + this.values.map(value => destinationsCoins = destinationsCoins.plus(value)); + } + let destinationsHours = new BigNumber(0); + if (!this.autoHours) { + this.destControls.map(control => destinationsHours = destinationsHours.plus(control.value.hours)); + } + + if (destinationsCoins.isGreaterThan(this.availableCoins) || destinationsHours.isGreaterThan(this.availableHours)) { + return { Invalid: true }; + } + + return null; + } + + private getAmount(stringValue: string, checkingCoins: boolean): BigNumber { + stringValue = stringValue ? stringValue.trim() : stringValue; + const value = new BigNumber(stringValue); + + if (!stringValue || value.isNaN() || value.isLessThanOrEqualTo(0)) { + return null; + } + + if (checkingCoins) { + const parts = stringValue.split('.'); + + if (this.selectedCurrency === DoubleButtonActive.LeftButton) { + if (parts.length === 2 && parts[1].length > this.blockchainService.currentMaxDecimals) { + return null; + } + } else { + if (parts.length === 2 && parts[1].length > SendFormComponent.MaxUsdDecimals) { + return null; + } + } + } else if (name === 'hours') { + if (!value.isEqualTo(value.decimalPlaces(0))) { + return null; + } + } + + return value; + } + + private createDestinationFormGroup() { + const group = this.formBuilder.group({ + address: '', + coins: '', + hours: '', + }); + + this.destinationSubscriptions.push(group.get('coins').valueChanges.subscribe(value => { + this.updateValues(); + })); + + this.destinationHoursSubscriptions.push(group.get('hours').valueChanges.subscribe(value => { + this.updateValues(); + })); + + return group; + } + + private showBusy() { + if (this.previewTx) { + this.previewButton.setLoading(); + this.sendButton.setDisabled(); + } else { + this.sendButton.setLoading(); + this.previewButton.setDisabled(); + } + this.busy = true; + this.navbarService.disableSwitch(); + } + + private createTransaction(passwordDialog?: any) { + this.showBusy(); + + const selectedAddresses = this.form.get('addresses').value && (this.form.get('addresses').value as Address[]).length > 0 ? + this.form.get('addresses').value.map(addr => addr.address) : null; + + const selectedOutputs = this.form.get('outputs').value && (this.form.get('outputs').value as UnspentOutput[]).length > 0 ? + this.form.get('outputs').value.map(addr => addr.hash) : null; + + this.processingSubscription = this.walletService.createTransaction( + this.form.value.wallet, + selectedAddresses ? selectedAddresses : (this.form.value.wallet as Wallet).addresses.map(address => address.address), + selectedOutputs, + this.destinations, + this.hoursSelection, + this.form.get('changeAddress').value ? this.form.get('changeAddress').value : null, + passwordDialog ? passwordDialog.password : null, + this.previewTx, + ).subscribe(transaction => { + if (passwordDialog) { + passwordDialog.close(); + } + + const note = this.form.value.note.trim(); + if (!this.previewTx) { + this.processingSubscription = this.walletService.injectTransaction(transaction.encoded, note) + .subscribe(noteSaved => { + let showDone = true; + if (note && !noteSaved) { + this.msgBarService.showWarning(this.translate.instant('send.error-saving-note')); + showDone = false; + } + + this.showSuccess(showDone); + }, error => this.showError(error)); + } else { + let amount = new BigNumber('0'); + this.destinations.map(destination => amount = amount.plus(destination.coins)); + + this.onFormSubmitted.emit({ + form: { + wallet: this.form.get('wallet').value, + addresses: this.form.get('addresses').value, + changeAddress: this.form.get('changeAddress').value, + destinations: this.destinations, + hoursSelection: this.hoursSelection, + autoOptions: this.autoOptions, + allUnspentOutputs: this.loadingUnspentOutputs ? null : this.allUnspentOutputs, + outputs: this.form.get('outputs').value, + currency: this.selectedCurrency, + note: note, + }, + amount: amount, + to: this.destinations.map(d => d.address), + transaction, + }); + this.busy = false; + this.navbarService.enableSwitch(); + } + }, error => { + if (passwordDialog) { + passwordDialog.error(error); + } + + if (error && error.result) { + this.showError(getHardwareWalletErrorMsg(this.translate, error)); + } else { + this.showError(error); + } + }); + } + + private resetForm() { + this.form.get('wallet').setValue('', { emitEvent: false }); + this.form.get('addresses').setValue(null); + this.form.get('outputs').setValue(null); + this.form.get('changeAddress').setValue(''); + this.form.get('note').setValue(''); + + this.wallet = null; + + while (this.destControls.length > 0) { + (this.form.get('destinations') as FormArray).removeAt(0); + } + + this.addDestination(); + + this.autoHours = true; + this.autoOptions = false; + this.autoShareValue = '0.5'; + this.updateValues(); + } + + private get destinations() { + return this.destControls.map((destControl, i) => { + const destination = { + address: ((destControl.get('address').value) as string).trim(), + coins: ((this.selectedCurrency === DoubleButtonActive.LeftButton ? destControl.get('coins').value : this.values[i].toString()) as string).trim(), + originalAmount: destControl.get('coins').value, + }; + + if (!this.autoHours) { + destination['hours'] = destControl.get('hours').value; + } + + return destination; + }); + } + + private get hoursSelection() { + let hoursSelection = { + type: 'manual', + }; + + if (this.autoHours) { + hoursSelection = { + type: 'auto', + mode: 'share', + share_factor: this.autoShareValue, + }; + } + + return hoursSelection; + } + + private updateAvailableBalance() { + if (this.form.get('wallet').value) { + this.availableCoins = new BigNumber(0); + this.availableHours = new BigNumber(0); + + const outputs: UnspentOutput[] = this.form.get('outputs').value; + const addresses: Address[] = this.form.get('addresses').value; + + if (outputs && outputs.length > 0) { + outputs.map(control => { + this.availableCoins = this.availableCoins.plus(control.coins); + this.availableHours = this.availableHours.plus(control.calculated_hours); + }); + } else if (addresses && addresses.length > 0) { + addresses.map(control => { + this.availableCoins = this.availableCoins.plus(control.coins); + this.availableHours = this.availableHours.plus(control.hours); + }); + } else if (this.form.get('wallet').value) { + const wallet: Wallet = this.form.get('wallet').value; + this.availableCoins = wallet.coins; + this.availableHours = wallet.hours; + } + + if (this.availableCoins.isGreaterThan(0)) { + const unburnedHoursRatio = new BigNumber(1).minus(new BigNumber(1).dividedBy(this.appService.burnRate)); + const sendableHours = this.availableHours.multipliedBy(unburnedHoursRatio).decimalPlaces(0, BigNumber.ROUND_FLOOR); + this.minimumFee = this.availableHours.minus(sendableHours); + this.availableHours = sendableHours; + } else { + this.minimumFee = new BigNumber(0); + this.availableHours = new BigNumber(0); + } + } + } + + private filterUnspentOutputs(): UnspentOutput[] { + if (this.allUnspentOutputs.length === 0) { + return []; + } else if (!this.form.get('addresses').value || (this.form.get('addresses').value as Address[]).length === 0) { + return this.allUnspentOutputs; + } else { + return this.allUnspentOutputs.filter(out => (this.form.get('addresses').value as Address[]).some(addr => addr.address === out.address)); + } + } + + private closeGetOutputsSubscriptions() { + this.loadingUnspentOutputs = false; + + if (this.getOutputsSubscriptions) { + this.getOutputsSubscriptions.unsubscribe(); + } + } + + private closeSyncCheckSubscription() { + if (this.syncCheckSubscription) { + this.syncCheckSubscription.unsubscribe(); + } + } + + private showSuccess(showDone: boolean) { + this.busy = false; + this.navbarService.enableSwitch(); + this.resetForm(); + + if (showDone) { + this.msgBarService.showDone('send.sent'); + this.sendButton.resetState(); + } else { + this.sendButton.setSuccess(); + setTimeout(() => { + this.sendButton.resetState(); + }, 3000); + } + } + + private showError(error) { + this.busy = false; + this.msgBarService.showError(error); + this.navbarService.enableSwitch(); + this.previewButton.resetState().setEnabled(); + this.sendButton.resetState().setEnabled(); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form/send-form.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form/send-form.component.html new file mode 100644 index 00000000..10527b1d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form/send-form.component.html @@ -0,0 +1,64 @@ +
+
+ +
+ +
+
+
+ + +
+
+ +
+ +
+
+ + {{ selectedCurrency === doubleButtonActive.LeftButton ? ('coin' | commonText) : ('common.usd' | translate) }} +
+
+ {{ 'send.invalid-amount' | translate }} + + ~ {{ value | number:'1.0-2' }} {{ 'common.usd' | translate }} + + + ~ {{ value | amount }} + + +
+
+
+ + +
+
+ + {{ 'send.preview-button' | translate }} + + + {{ 'send.send-button' | translate }} + +
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form/send-form.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form/send-form.component.scss new file mode 100644 index 00000000..7f865104 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form/send-form.component.scss @@ -0,0 +1,17 @@ +@import '../../../../../theme/variables'; + +.-buttons { + text-align: center; +} + +.amount-label { + display: inline-block; +} + +label mat-icon { + display: inline; + font-size: 14px; + color: lighten($grey, 40%); + vertical-align: text-bottom; + padding-left: 5px; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form/send-form.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form/send-form.component.spec.ts new file mode 100644 index 00000000..40e927e0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form/send-form.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SendFormComponent } from './send-form.component'; + +describe('SendFormComponent', () => { + let component: SendFormComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SendFormComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SendFormComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form/send-form.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form/send-form.component.ts new file mode 100644 index 00000000..eb5c9b6c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form/send-form.component.ts @@ -0,0 +1,491 @@ +import { Component, EventEmitter, Input, OnDestroy, OnInit, Output, ViewChild, ChangeDetectorRef } from '@angular/core'; +import { WalletService } from '../../../../services/wallet.service'; +import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'; +import 'rxjs/add/operator/delay'; +import 'rxjs/add/operator/filter'; +import { ButtonComponent } from '../../../layout/button/button.component'; +import { PasswordDialogComponent } from '../../../layout/password-dialog/password-dialog.component'; +import { MatDialog, MatDialogConfig } from '@angular/material'; +import { getHardwareWalletErrorMsg } from '../../../../utils/errors'; +import { ISubscription } from 'rxjs/Subscription'; +import { NavBarService } from '../../../../services/nav-bar.service'; +import { BigNumber } from 'bignumber.js'; +import { Wallet, ConfirmationData } from '../../../../app.datatypes'; +import { HwWalletService } from '../../../../services/hw-wallet.service'; +import { TranslateService } from '@ngx-translate/core'; +import { BlockchainService } from '../../../../services/blockchain.service'; +import { showConfirmationModal } from '../../../../utils'; +import { DoubleButtonActive } from '../../../layout/double-button/double-button.component'; +import { PriceService } from '../../../../services/price.service'; +import { ChangeNoteComponent } from '../send-preview/transaction-info/change-note/change-note.component'; +import { MsgBarService } from '../../../../services/msg-bar.service'; +import { AppService } from '../../../../services/app.service'; + +@Component({ + selector: 'app-send-form', + templateUrl: './send-form.component.html', + styleUrls: ['./send-form.component.scss'], +}) +export class SendFormComponent implements OnInit, OnDestroy { + + public static readonly MaxUsdDecimals = 6; + + @ViewChild('previewButton') previewButton: ButtonComponent; + @ViewChild('sendButton') sendButton: ButtonComponent; + @Input() formData: any; + @Output() onFormSubmitted = new EventEmitter(); + + maxNoteChars = ChangeNoteComponent.MAX_NOTE_CHARS; + form: FormGroup; + transactions = []; + previewTx: boolean; + busy = false; + doubleButtonActive = DoubleButtonActive; + selectedCurrency = DoubleButtonActive.LeftButton; + value: number; + valueGreaterThanBalance = false; + price: number; + wallets: Wallet[]; + + private subscriptionsGroup: ISubscription[] = []; + private processingSubscription: ISubscription; + private syncCheckSubscription: ISubscription; + + constructor( + public formBuilder: FormBuilder, + public blockchainService: BlockchainService, + private walletService: WalletService, + private dialog: MatDialog, + private msgBarService: MsgBarService, + private navbarService: NavBarService, + private hwWalletService: HwWalletService, + private translate: TranslateService, + private changeDetector: ChangeDetectorRef, + private appService: AppService, + priceService: PriceService, + ) { + this.subscriptionsGroup.push(priceService.price.subscribe(price => { + this.price = price; + this.updateValue(); + })); + } + + ngOnInit() { + this.navbarService.showSwitch('send.simple', 'send.advanced'); + this.initForm(); + this.subscriptionsGroup.push(this.walletService.all().first().subscribe(wallets => { + this.wallets = wallets; + + if (wallets.length === 1) { + this.form.get('wallet').setValue(wallets[0]); + } + })); + } + + ngOnDestroy() { + if (this.processingSubscription && !this.processingSubscription.closed) { + this.processingSubscription.unsubscribe(); + } + this.subscriptionsGroup.forEach(sub => sub.unsubscribe()); + this.closeSyncCheckSubscription(); + this.navbarService.hideSwitch(); + this.msgBarService.hide(); + } + + preview() { + this.previewTx = true; + this.checkBeforeSending(); + this.changeDetector.detectChanges(); + } + + send() { + this.previewTx = false; + this.checkBeforeSending(); + } + + changeActiveCurrency(value) { + if (value !== this.selectedCurrency) { + this.selectedCurrency = value; + this.askIfConvertAmount(); + this.updateValue(); + this.form.get('amount').updateValueAndValidity(); + } + } + + private askIfConvertAmount() { + + if (!this.form.get('amount').value) { + return; + } + const value = (this.form.get('amount').value as string).trim(); + const currentValue = new BigNumber((this.form.get('amount').value as string).trim()); + if (!value || currentValue.isNaN()) { + return; + } + + const usd = this.translate.instant('common.usd'); + const currentCoin = this.appService.coinName; + let fromText: string; + let toText: string; + if (this.selectedCurrency === DoubleButtonActive.LeftButton) { + fromText = usd; + toText = currentCoin; + } else { + fromText = currentCoin; + toText = usd; + } + + const confirmationData: ConfirmationData = { + text: this.translate.instant('send.convert-confirmation', {from: fromText, to: toText}), + headerText: 'confirmation.header-text', + confirmButtonText: 'confirmation.confirm-button', + cancelButtonText: 'confirmation.cancel-button', + }; + + showConfirmationModal(this.dialog, confirmationData).afterClosed().subscribe(confirmationResult => { + if (confirmationResult) { + this.convertAmount(); + } + }); + } + + private convertAmount() { + this.msgBarService.hide(); + + if (this.form.get('amount').value) { + const value = (this.form.get('amount').value as string).trim(); + const currentValue = new BigNumber(value); + + if (!value || currentValue.isNaN()) { + this.msgBarService.showWarning(this.translate.instant('send.invaid-amount-warning')); + + return; + } + + if (this.selectedCurrency === DoubleButtonActive.LeftButton) { + const newValue = currentValue.dividedBy(this.price).decimalPlaces(this.blockchainService.currentMaxDecimals); + const recoveredValue = newValue.multipliedBy(this.price).decimalPlaces(SendFormComponent.MaxUsdDecimals, BigNumber.ROUND_FLOOR); + if (!recoveredValue.isEqualTo(currentValue)) { + this.msgBarService.showWarning(this.translate.instant('send.precision-error-warning')); + } + + this.form.get('amount').setValue(newValue.toString()); + } else { + const newValue = currentValue.multipliedBy(this.price).decimalPlaces(SendFormComponent.MaxUsdDecimals, BigNumber.ROUND_FLOOR); + const recoveredValue = newValue.dividedBy(this.price).decimalPlaces(this.blockchainService.currentMaxDecimals); + if (!recoveredValue.isEqualTo(currentValue)) { + this.msgBarService.showWarning(this.translate.instant('send.precision-error-warning')); + } + + this.form.get('amount').setValue(newValue.toString()); + } + } + } + + assignAll() { + this.msgBarService.hide(); + + let availableCoins: BigNumber = this.form.get('wallet').value && this.form.get('wallet').value.coins ? this.form.get('wallet').value.coins : new BigNumber(-1); + if ((availableCoins as BigNumber).isEqualTo(-1)) { + this.msgBarService.showError(this.translate.instant('send.no-wallet-selected')); + + return; + } + + if (this.selectedCurrency === DoubleButtonActive.RightButton) { + availableCoins = availableCoins.multipliedBy(this.price).decimalPlaces(SendFormComponent.MaxUsdDecimals, BigNumber.ROUND_FLOOR); + } + + this.form.get('amount').setValue(availableCoins.toString()); + } + + private updateValue() { + if (!this.price) { + this.value = null; + + return; + } + if (!this.form || this.validateAmount(this.form.get('amount') as FormControl) !== null) { + this.value = -1; + + return; + } + + const coinsInWallet = this.form.get('wallet').value && this.form.get('wallet').value.coins ? this.form.get('wallet').value.coins : -1; + + this.valueGreaterThanBalance = false; + if (this.selectedCurrency === DoubleButtonActive.LeftButton) { + this.value = new BigNumber(this.form.get('amount').value).multipliedBy(this.price).decimalPlaces(2).toNumber(); + if (coinsInWallet > 0 && parseFloat(this.form.get('amount').value) > coinsInWallet) { + this.valueGreaterThanBalance = true; + } + } else { + this.value = new BigNumber(this.form.get('amount').value).dividedBy(this.price).decimalPlaces(this.blockchainService.currentMaxDecimals).toNumber(); + if (coinsInWallet > 0 && this.value > coinsInWallet) { + this.valueGreaterThanBalance = true; + } + } + } + + private checkBeforeSending() { + if (!this.form.valid || this.previewButton.isLoading() || this.sendButton.isLoading()) { + return; + } + + this.closeSyncCheckSubscription(); + this.syncCheckSubscription = this.blockchainService.synchronized.first().subscribe(synchronized => { + if (synchronized) { + this.prepareTransaction(); + } else { + this.showSynchronizingWarning(); + } + }); + } + + private showSynchronizingWarning() { + const confirmationData: ConfirmationData = { + text: 'send.synchronizing-warning', + headerText: 'confirmation.header-text', + confirmButtonText: 'confirmation.confirm-button', + cancelButtonText: 'confirmation.cancel-button', + }; + + showConfirmationModal(this.dialog, confirmationData).afterClosed().subscribe(confirmationResult => { + if (confirmationResult) { + this.prepareTransaction(); + } + }); + } + + private prepareTransaction() { + this.msgBarService.hide(); + this.previewButton.resetState(); + this.sendButton.resetState(); + + if (this.form.value.wallet.encrypted && !this.form.value.wallet.isHardware && !this.previewTx) { + const config = new MatDialogConfig(); + config.data = { + wallet: this.form.value.wallet, + }; + + this.dialog.open(PasswordDialogComponent, config).componentInstance.passwordSubmit + .subscribe(passwordDialog => { + this.createTransaction(passwordDialog); + }); + } else { + if (!this.form.value.wallet.isHardware || this.previewTx) { + this.createTransaction(); + } else { + this.showBusy(); + this.processingSubscription = this.hwWalletService.checkIfCorrectHwConnected((this.form.value.wallet as Wallet).addresses[0].address).subscribe( + () => this.createTransaction(), + err => this.showError(getHardwareWalletErrorMsg(this.translate, err)), + ); + } + } + } + + private showBusy() { + if (this.previewTx) { + this.previewButton.setLoading(); + this.sendButton.setDisabled(); + } else { + this.sendButton.setLoading(); + this.previewButton.setDisabled(); + } + this.busy = true; + this.navbarService.disableSwitch(); + } + + private createTransaction(passwordDialog?: any) { + this.showBusy(); + + this.processingSubscription = this.walletService.createTransaction( + this.form.value.wallet, + (this.form.value.wallet as Wallet).addresses.map(address => address.address), + null, + [{ + address: (this.form.value.address as string).trim(), + coins: ((this.selectedCurrency === DoubleButtonActive.LeftButton ? this.form.value.amount : this.value.toString()) as string).trim(), + }], + { + type: 'auto', + mode: 'share', + share_factor: '0.5', + }, + null, + passwordDialog ? passwordDialog.password : null, + this.previewTx, + ).subscribe(transaction => { + if (passwordDialog) { + passwordDialog.close(); + } + + const note = this.form.value.note.trim(); + if (!this.previewTx) { + this.processingSubscription = this.walletService.injectTransaction(transaction.encoded, note) + .subscribe(noteSaved => { + let showDone = true; + if (note && !noteSaved) { + this.msgBarService.showWarning(this.translate.instant('send.error-saving-note')); + showDone = false; + } + + this.showSuccess(showDone); + }, error => this.showError(error)); + } else { + this.onFormSubmitted.emit({ + form: { + wallet: this.form.value.wallet, + address: (this.form.value.address as string).trim(), + amount: this.form.value.amount, + currency: this.selectedCurrency, + note: note, + }, + amount: new BigNumber(this.form.value.amount), + to: [(this.form.value.address as string).trim()], + transaction, + }); + this.busy = false; + this.navbarService.enableSwitch(); + } + }, + error => { + if (passwordDialog) { + passwordDialog.error(error); + } + + if (error && error.result) { + this.showError(getHardwareWalletErrorMsg(this.translate, error)); + } else { + this.showError(error); + } + }, + ); + } + + private showSuccess(showDone: boolean) { + this.busy = false; + this.navbarService.enableSwitch(); + this.resetForm(); + + if (showDone) { + this.msgBarService.showDone('send.sent'); + this.sendButton.resetState(); + } else { + this.sendButton.setSuccess(); + setTimeout(() => { + this.sendButton.resetState(); + }, 3000); + } + } + + private showError(error) { + this.busy = false; + this.msgBarService.showError(error); + this.navbarService.enableSwitch(); + this.previewButton.resetState().setEnabled(); + this.sendButton.resetState().setEnabled(); + } + + private initForm() { + this.form = this.formBuilder.group({ + wallet: ['', Validators.required], + address: [''], + amount: ['', Validators.required], + note: [''], + }); + + this.form.get('address').setValidators([ + this.validateAddress.bind(this), + ]); + + this.subscriptionsGroup.push(this.form.get('wallet').valueChanges.subscribe(value => { + this.form.get('amount').setValidators([ + Validators.required, + this.validateAmountWithValue.bind(this), + ]); + + this.form.get('amount').updateValueAndValidity(); + })); + + this.subscriptionsGroup.push(this.form.get('amount').valueChanges.subscribe(value => { + this.updateValue(); + })); + + if (this.formData) { + Object.keys(this.form.controls).forEach(control => { + if (this.form.get(control)) { + this.form.get(control).setValue(this.formData.form[control]); + } + + this.selectedCurrency = this.formData.form.currency; + }); + } + } + + private validateAddress(addressControl: FormControl) { + if (!addressControl.value || (addressControl.value as string).trim().length === 0) { + return { Required: true }; + } + } + + private validateAmount(amountControl: FormControl) { + let stringValue: string = amountControl.value; + stringValue = stringValue ? stringValue.trim() : stringValue; + const value = new BigNumber(stringValue); + + if (!stringValue || value.isNaN() || value.isLessThanOrEqualTo(0)) { + return { Invalid: true }; + } + + const parts = stringValue.split('.'); + + if (this.selectedCurrency === DoubleButtonActive.LeftButton) { + if (parts.length === 2 && parts[1].length > this.blockchainService.currentMaxDecimals) { + return { Invalid: true }; + } + } else { + if (parts.length === 2 && parts[1].length > SendFormComponent.MaxUsdDecimals) { + return { Invalid: true }; + } + } + + return null; + } + + private validateAmountWithValue(amountControl: FormControl) { + const firstValidation = this.validateAmount(amountControl); + if (firstValidation) { + return firstValidation; + } + + const coinsInWallet = this.form.get('wallet').value && this.form.get('wallet').value.coins ? this.form.get('wallet').value.coins : 0; + if (this.selectedCurrency === DoubleButtonActive.LeftButton) { + if (parseFloat(amountControl.value) > coinsInWallet) { + return { Invalid: true }; + } + } else { + this.updateValue(); + if (this.value > coinsInWallet) { + return { Invalid: true }; + } + } + + return null; + } + + private resetForm() { + this.form.get('wallet').setValue(''); + this.form.get('address').setValue(''); + this.form.get('amount').setValue(''); + this.form.get('note').setValue(''); + this.selectedCurrency = DoubleButtonActive.LeftButton; + } + + private closeSyncCheckSubscription() { + if (this.syncCheckSubscription) { + this.syncCheckSubscription.unsubscribe(); + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/send-preview.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/send-preview.component.html new file mode 100644 index 00000000..0ba12a6d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/send-preview.component.html @@ -0,0 +1,9 @@ + + +
+ {{ 'send.back-button' | translate }} + {{ 'send.send-button' | translate }} +
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/send-preview.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/send-preview.component.scss new file mode 100644 index 00000000..4bf1cca6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/send-preview.component.scss @@ -0,0 +1,4 @@ +.-buttons { + margin-top: 10px; + text-align: center; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/send-preview.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/send-preview.component.spec.ts new file mode 100644 index 00000000..63db5082 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/send-preview.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SendVerifyComponent } from './send-preview.component'; + +describe('SendVerifyComponent', () => { + let component: SendVerifyComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SendVerifyComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SendVerifyComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/send-preview.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/send-preview.component.ts new file mode 100644 index 00000000..643883a6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/send-preview.component.ts @@ -0,0 +1,125 @@ +import { Component, EventEmitter, Input, OnDestroy, Output, ViewChild } from '@angular/core'; +import { WalletService } from '../../../../services/wallet.service'; +import { ButtonComponent } from '../../../layout/button/button.component'; +import { MatDialogConfig, MatDialog } from '@angular/material'; +import { getHardwareWalletErrorMsg } from '../../../../utils/errors'; +import { PreviewTransaction, Wallet } from '../../../../app.datatypes'; +import { ISubscription } from 'rxjs/Subscription'; +import { PasswordDialogComponent } from '../../../layout/password-dialog/password-dialog.component'; +import { HwWalletService } from '../../../../services/hw-wallet.service'; +import { TranslateService } from '@ngx-translate/core'; +import { MsgBarService } from '../../../../services/msg-bar.service'; + +@Component({ + selector: 'app-send-preview', + templateUrl: './send-preview.component.html', + styleUrls: ['./send-preview.component.scss'], +}) +export class SendVerifyComponent implements OnDestroy { + @ViewChild('sendButton') sendButton: ButtonComponent; + @ViewChild('backButton') backButton: ButtonComponent; + @Input() transaction: PreviewTransaction; + @Output() onBack = new EventEmitter(); + + private sendSubscription: ISubscription; + + constructor( + private walletService: WalletService, + private msgBarService: MsgBarService, + private dialog: MatDialog, + private hwWalletService: HwWalletService, + private translate: TranslateService, + ) {} + + ngOnDestroy() { + this.msgBarService.hide(); + + if (this.sendSubscription) { + this.sendSubscription.unsubscribe(); + } + } + + back() { + this.onBack.emit(false); + } + + send() { + if (this.sendButton.isLoading()) { + return; + } + + this.msgBarService.hide(); + this.sendButton.resetState(); + + if (this.transaction.wallet.encrypted && !this.transaction.wallet.isHardware) { + const config = new MatDialogConfig(); + config.data = { + wallet: this.transaction.wallet, + }; + + this.dialog.open(PasswordDialogComponent, config).componentInstance.passwordSubmit + .subscribe(passwordDialog => { + this.finishSending(passwordDialog); + }); + } else { + if (!this.transaction.wallet.isHardware) { + this.finishSending(); + } else { + this.showBusy(); + this.sendSubscription = this.hwWalletService.checkIfCorrectHwConnected(this.transaction.wallet.addresses[0].address).subscribe( + () => this.finishSending(), + err => this.showError(getHardwareWalletErrorMsg(this.translate, err)), + ); + } + } + } + + private showBusy() { + this.sendButton.setLoading(); + this.backButton.setDisabled(); + } + + private finishSending(passwordDialog?: any) { + this.showBusy(); + + const note = this.transaction.note.trim(); + + this.sendSubscription = this.walletService.signTransaction( + this.transaction.wallet, + passwordDialog ? passwordDialog.password : null, + this.transaction, + ).flatMap(result => { + if (passwordDialog) { + passwordDialog.close(); + } + + return this.walletService.injectTransaction(result.encoded, note); + }).subscribe(noteSaved => { + if (note && !noteSaved) { + setTimeout(() => this.msgBarService.showWarning(this.translate.instant('send.error-saving-note'))); + } else { + setTimeout(() => this.msgBarService.showDone('send.sent')); + } + + this.walletService.startDataRefreshSubscription(); + + this.onBack.emit(true); + }, error => { + if (passwordDialog) { + passwordDialog.error(error); + } + + if (error && error.result) { + this.showError(getHardwareWalletErrorMsg(this.translate, error)); + } else { + this.showError(error); + } + }); + } + + private showError(error) { + this.msgBarService.showError(error); + this.sendButton.resetState(); + this.backButton.resetState().setEnabled(); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/change-note/change-note.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/change-note/change-note.component.html new file mode 100644 index 00000000..cd31574c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/change-note/change-note.component.html @@ -0,0 +1,19 @@ + +
+
+ + +
+
+
+ + {{ 'edit-note.cancel-button' | translate }} + + + {{ 'edit-note.change-button' | translate }} + +
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/change-note/change-note.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/change-note/change-note.component.scss new file mode 100644 index 00000000..1d1c0825 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/change-note/change-note.component.scss @@ -0,0 +1,17 @@ +@import '../../../../../../../theme/variables'; + +mat-input-container { + width: 100%; +} + +.-buttons { + text-align: center; +} + +mat-icon { + display: inline; + font-size: 14px; + color: lighten($grey, 40%); + vertical-align: text-bottom; + padding-left: 5px; +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/change-note/change-note.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/change-note/change-note.component.spec.ts new file mode 100644 index 00000000..d4ed704f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/change-note/change-note.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ChangeNoteComponent } from './change-note.component'; + +describe('ChangeNoteComponent', () => { + let component: ChangeNoteComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ChangeNoteComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ChangeNoteComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/change-note/change-note.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/change-note/change-note.component.ts new file mode 100644 index 00000000..88c48c22 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/change-note/change-note.component.ts @@ -0,0 +1,76 @@ +import { Component, OnInit, Inject, ViewChild, OnDestroy } from '@angular/core'; +import { FormBuilder, Validators, FormGroup } from '@angular/forms'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { ISubscription } from 'rxjs/Subscription'; +import { ButtonComponent } from '../../../../../layout/button/button.component'; +import { Transaction } from '../../../../../../app.datatypes'; +import { StorageService, StorageType } from '../../../../../../services/storage.service'; +import { MsgBarService } from '../../../../../../services/msg-bar.service'; + +@Component({ + selector: 'app-change-note', + templateUrl: './change-note.component.html', + styleUrls: ['./change-note.component.scss'], +}) +export class ChangeNoteComponent implements OnInit, OnDestroy { + + public static readonly MAX_NOTE_CHARS = 64; + + @ViewChild('button') button: ButtonComponent; + form: FormGroup; + maxNoteChars = ChangeNoteComponent.MAX_NOTE_CHARS; + + private OperationSubscription: ISubscription; + private originalNote: string; + + constructor( + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) private data: Transaction, + private formBuilder: FormBuilder, + private msgBarService: MsgBarService, + private storageService: StorageService, + ) {} + + ngOnInit() { + this.originalNote = this.data.note ? this.data.note : ''; + + this.form = this.formBuilder.group({ + note: [this.data.note], + }); + } + + ngOnDestroy() { + this.msgBarService.hide(); + if (this.OperationSubscription) { + this.OperationSubscription.unsubscribe(); + } + } + + closePopup() { + this.dialogRef.close(); + } + + changeNote() { + if (this.button.isLoading()) { + return; + } + + const newNote = this.form.value.note ? this.form.value.note.trim() : ''; + + if (this.originalNote === newNote) { + this.closePopup(); + + return; + } + + this.msgBarService.hide(); + this.button.setLoading(); + + this.OperationSubscription = this.storageService.store(StorageType.NOTES, this.data.txid, newNote).subscribe(() => { + this.dialogRef.close(newNote); + }, error => { + this.msgBarService.showError(error); + this.button.resetState().setEnabled(); + }); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/transaction-info.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/transaction-info.component.html new file mode 100644 index 00000000..85b7ec50 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/transaction-info.component.html @@ -0,0 +1,92 @@ +
+
+

{{ 'tx.confirm-transaction' | translate }}

+

{{ 'tx.transaction' | translate }}

+
+
+ +
+ {{ 'tx.from' | translate }}: {{ transaction.from }} +
+
+ {{ 'tx.to' | translate }}: {{ transaction.to.join(', ') }} +
+
+ +
+ {{ 'tx.date' | translate }}: {{ transaction.timestamp | dateTime }} +
+
+ {{ 'tx.status' | translate }}: {{ (transaction.confirmed ? 'tx.confirmed' : 'tx.pending') | translate }} +
+
+
+ {{ 'tx.hours' | translate }}: + + {{ transaction.hoursSent.toString() | amount:false:'first' }} {{ hoursText | translate }} + | + {{ transaction.hoursBurned.toString() | amount:false:'first' }} {{ 'tx.hours-burned' | translate }} + +
+
+ {{ 'tx.id' | translate }}: {{ transaction.txid }} +
+
+ {{ 'tx.note' | translate }}: + {{ transaction.note }} + {{ 'tx.without-note' | translate }} + edit +
+
+ +
+
+ +
+

{{ transaction.balance.toString() | amount }}

+

+ {{ transaction.balance * price | currency:'USD':'symbol':'1.2-2' }}* +

+
+
+
+ + {{ 'tx.show-more' | translate }} keyboard_arrow_down + +
+
+ +
+

{{ 'tx.inputs' | translate }}

+ +
+
{{ i + 1 }}
+
+
{{ isPreview ? input.address : input.owner }}
+
+ {{ 'tx.coins' | translate }}: {{ input.coins | amount:true:'first' }} +
+
+ {{ 'tx.hours' | translate }}: {{ input.calculated_hours | amount:false:'first' }} +
+
+
+
+
+

{{ 'tx.outputs' | translate }}

+ +
+
{{ i + 1 }}
+
+
{{ isPreview ? output.address : output.dst }}
+
+ {{ 'tx.coins' | translate }}: {{ output.coins | amount:true:'first' }} +
+
+ {{ 'tx.hours' | translate }}: {{ output.hours | amount:false:'first' }} +
+
+
+
+
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/transaction-info.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/transaction-info.component.scss new file mode 100644 index 00000000..48f09427 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/transaction-info.component.scss @@ -0,0 +1,128 @@ +@import '../../../../../../theme/variables'; + +h4 { + font-size: 14px; + margin: 0 0 30px; +} + +.-item { + display: flex; + font-size: 13px; + + &:not(:last-child) { + margin-bottom: 10px; + } + + .-number { + padding: 10px; + background: $grey-lightest; + align-self: flex-start; + border-radius: 10px; + } + + .-info { + margin-left: 10px; + display: flex; + flex-direction: column; + + div { + word-break: break-all; + } + + .-address { + padding: 10px 0; + margin-bottom: 5px; + } + } +} + +.-data { + font-size: 12px; + display: flex; + + &:not(:last-child) { + margin-bottom: 5px; + } + + span:first-child { + color: $grey; + display: inline-block; + width: 60px; + flex-shrink: 0; + } + span:nth-child(2) { + word-break: break-word; + } + + mat-icon { + font-size: 20px; + padding-left: 5px; + color: $gradient-blue-dark; + cursor: pointer; + } + + .-grey { + color: $grey; + } + + &.-more { + margin-bottom: 0 !important; + + span { + width: auto !important; + margin-top: 20px; + color: $gradient-blue-dark; + cursor: pointer; + + mat-icon { + display: inline; + vertical-align: middle; + font-size: 13px; + } + } + } +} + +.-tx-meta { + .-data { + margin-bottom: 10px; + } +} + +.-tx-price { + text-align: center; + display: flex; + flex-direction: column; + justify-content: center; + + .-icon { + &.-incoming { + transform: rotate(180deg); + } + + img { + width: 30px; + } + } + + h4 { + color: $grey-dark; + font-size: 16px; + font-weight: 700; + margin: 10px 0 5px; + } + + p { + color: $grey; + font-size: 12px; + margin: 0; + + span { + color: lighten($grey, 40%); + } + } +} + +.-margin-top { + margin-top: 30px; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/transaction-info.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/transaction-info.component.spec.ts new file mode 100644 index 00000000..1637b8ca --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/transaction-info.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { TransactionInfoComponent } from './transaction-info.component'; + +describe('TransactionInfoComponent', () => { + let component: TransactionInfoComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ TransactionInfoComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(TransactionInfoComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/transaction-info.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/transaction-info.component.ts new file mode 100644 index 00000000..ccddb660 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/transaction-info.component.ts @@ -0,0 +1,71 @@ +import { Component, Input, OnDestroy, OnInit } from '@angular/core'; +import { PreviewTransaction, Transaction } from '../../../../../app.datatypes'; +import { PriceService } from '../../../../../services/price.service'; +import { ISubscription } from 'rxjs/Subscription'; +import { BigNumber } from 'bignumber.js'; +import { MatDialogConfig, MatDialog } from '@angular/material'; +import { ChangeNoteComponent } from './change-note/change-note.component'; + +@Component({ + selector: 'app-transaction-info', + templateUrl: './transaction-info.component.html', + styleUrls: ['./transaction-info.component.scss'], +}) +export class TransactionInfoComponent implements OnInit, OnDestroy { + @Input() transaction: Transaction; + @Input() isPreview: boolean; + price: number; + showInputsOutputs = false; + + private subscription: ISubscription; + + constructor(private priceService: PriceService, private dialog: MatDialog) { + this.subscription = this.priceService.price.subscribe(price => this.price = price); + } + + get hoursText(): string { + if (!this.transaction) { + return ''; + } + + if (!this.isPreview) { + if ((this.transaction as any).coinsMovedInternally) { + return 'tx.hours-moved'; + } else if (this.transaction.balance.isGreaterThan(0)) { + return 'tx.hours-received'; + } + } + + return 'tx.hours-sent'; + } + + ngOnInit() { + if (this.isPreview) { + this.transaction.hoursSent = new BigNumber('0'); + this.transaction.outputs + .filter(o => ( this.transaction).to.find(addr => addr === o.address)) + .map(o => this.transaction.hoursSent = this.transaction.hoursSent.plus(new BigNumber(o.hours))); + } + } + + ngOnDestroy() { + this.subscription.unsubscribe(); + } + + toggleInputsOutputs(event) { + event.preventDefault(); + + this.showInputsOutputs = !this.showInputsOutputs; + } + + editNote() { + const config = new MatDialogConfig(); + config.width = '566px'; + config.data = this.transaction; + this.dialog.open(ChangeNoteComponent, config).afterClosed().subscribe(newNote => { + if (newNote || newNote === '') { + this.transaction.note = newNote; + } + }); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-skycoin.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-skycoin.component.html new file mode 100644 index 00000000..1acadd88 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-skycoin.component.html @@ -0,0 +1,20 @@ + +
+
+ + + +
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-skycoin.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-skycoin.component.scss new file mode 100644 index 00000000..c253bbfa --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-skycoin.component.scss @@ -0,0 +1,11 @@ +.-buttons { + text-align: center; +} + +.-paper { + background-color: #fbfbfb; + border-radius: 10px; + box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.01), 1px 1px 2px 2px rgba(0, 0, 0, 0.01); + padding: 30px; + margin: 30px; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-skycoin.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-skycoin.component.spec.ts new file mode 100644 index 00000000..97248ad1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-skycoin.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SendSkycoinComponent } from './send-skycoin.component'; + +describe('SendSkycoinComponent', () => { + let component: SendSkycoinComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SendSkycoinComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SendSkycoinComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-skycoin.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-skycoin.component.ts new file mode 100644 index 00000000..fa2b0841 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-skycoin.component.ts @@ -0,0 +1,59 @@ +import { Component, OnDestroy, ChangeDetectorRef } from '@angular/core'; +import { NavBarService } from '../../../services/nav-bar.service'; +import { ISubscription } from 'rxjs/Subscription'; +import { DoubleButtonActive } from '../../layout/double-button/double-button.component'; + +@Component({ + selector: 'app-send-skycoin', + templateUrl: './send-skycoin.component.html', + styleUrls: ['./send-skycoin.component.scss'], +}) +export class SendSkycoinComponent implements OnDestroy { + showForm = true; + formData: any; + activeForm: DoubleButtonActive; + activeForms = DoubleButtonActive; + + private subscription: ISubscription; + + constructor( + navbarService: NavBarService, + private changeDetector: ChangeDetectorRef, + ) { + navbarService.setActiveComponent(DoubleButtonActive.LeftButton); + this.subscription = navbarService.activeComponent.subscribe(value => { + this.activeForm = value; + this.formData = null; + }); + } + + ngOnDestroy() { + this.subscription.unsubscribe(); + } + + onFormSubmitted(data) { + this.formData = data; + this.showForm = false; + } + + onBack(deleteFormData) { + if (deleteFormData) { + this.formData = null; + } + + this.showForm = true; + this.changeDetector.detectChanges(); + } + + get transaction() { + const transaction = this.formData.transaction; + + transaction.wallet = this.formData.form.wallet; + transaction.from = this.formData.form.wallet.label; + transaction.to = this.formData.to; + transaction.balance = this.formData.amount; + transaction.note = this.formData.form.note; + + return transaction; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/backup/backup.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/backup/backup.component.html new file mode 100644 index 00000000..2af4b72e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/backup/backup.component.html @@ -0,0 +1,36 @@ +
+ + +
+
+

{{ 'backup.wallet-directory' | translate }} {{ folder }}

+

{{ 'backup.seed-warning' | translate }}

+

+ +

+
+ + + +
+
+
{{ 'backup.wallet' | translate }}
+
{{ 'backup.filename' | translate }}
+
+
+
+
+
{{ wallet.label }}
+
{{ wallet.filename }}
+
+ {{ 'backup.show-seed' | translate }} +
+
+
+
+
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/backup/backup.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/backup/backup.component.scss new file mode 100644 index 00000000..99c14b94 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/backup/backup.component.scss @@ -0,0 +1,39 @@ +@import '../../../../../theme/variables'; + +.-paper { + background-color: #fbfbfb; + border-radius: 15px; + box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.01), 1px 1px 2px 2px rgba(0, 0, 0, 0.01); + padding: 20px; + font-size: $font-size-standard; + margin: 30px 30px 0; + + p { + &:first-child { + margin-top: 0; + } + + &:last-child { + margin-bottom: 0; + } + } +} + +.-text-muted { + color: $grey; +} + +.-text-right { + text-align: right; +} + +.-link { + color: $blue; + cursor: pointer; +} + +.-label { + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/backup/backup.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/backup/backup.component.spec.ts new file mode 100644 index 00000000..e7e4b77c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/backup/backup.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BackupComponent } from './backup.component'; + +describe('BackupComponent', () => { + let component: BackupComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ BackupComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BackupComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/backup/backup.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/backup/backup.component.ts new file mode 100644 index 00000000..a6b845c9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/backup/backup.component.ts @@ -0,0 +1,58 @@ +import { Component, OnDestroy, OnInit } from '@angular/core'; +import { WalletService } from '../../../../services/wallet.service'; +import { Wallet } from '../../../../app.datatypes'; +import { MatDialog, MatDialogConfig } from '@angular/material'; +import { SeedModalComponent } from './seed-modal/seed-modal.component'; +import { PasswordDialogComponent } from '../../../layout/password-dialog/password-dialog.component'; + +@Component({ + selector: 'app-backup', + templateUrl: './backup.component.html', + styleUrls: ['./backup.component.scss'], +}) +export class BackupComponent implements OnInit, OnDestroy { + folder: string; + wallets: Wallet[] = []; + + private walletSubscription; + + constructor( + public walletService: WalletService, + private dialog: MatDialog, + ) {} + + ngOnInit() { + this.walletService.folder().subscribe(folder => this.folder = folder); + + this.walletSubscription = this.walletService.all().subscribe(wallets => { + this.wallets = wallets; + }); + } + + ngOnDestroy() { + this.walletSubscription.unsubscribe(); + } + + get onlyEncrypted() { + return this.wallets.filter(wallet => wallet.encrypted); + } + + showSeed(wallet: Wallet) { + const initialConfig = new MatDialogConfig(); + initialConfig.data = { + wallet: wallet, + }; + + this.dialog.open(PasswordDialogComponent, initialConfig).componentInstance.passwordSubmit + .subscribe(passwordDialog => { + this.walletService.getWalletSeed(wallet, passwordDialog.password).subscribe(seed => { + passwordDialog.close(); + const config = new MatDialogConfig(); + config.width = '566px'; + config.data = { seed }; + + this.dialog.open(SeedModalComponent, config); + }, err => passwordDialog.error(err)); + }); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/backup/seed-modal/seed-modal.component.css b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/backup/seed-modal/seed-modal.component.css new file mode 100644 index 00000000..079dcb65 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/backup/seed-modal/seed-modal.component.css @@ -0,0 +1,3 @@ +.-buttons { + text-align: center; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/backup/seed-modal/seed-modal.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/backup/seed-modal/seed-modal.component.html new file mode 100644 index 00000000..12e41214 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/backup/seed-modal/seed-modal.component.html @@ -0,0 +1,11 @@ + +
+ + +
+
+ + {{ 'backup.close-button' | translate }} + +
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/backup/seed-modal/seed-modal.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/backup/seed-modal/seed-modal.component.spec.ts new file mode 100644 index 00000000..e269ec54 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/backup/seed-modal/seed-modal.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SeedModalComponent } from './seed-modal.component'; + +describe('SeedModalComponent', () => { + let component: SeedModalComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SeedModalComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SeedModalComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/backup/seed-modal/seed-modal.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/backup/seed-modal/seed-modal.component.ts new file mode 100644 index 00000000..749726e2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/backup/seed-modal/seed-modal.component.ts @@ -0,0 +1,18 @@ +import { Component, Inject, OnDestroy } from '@angular/core'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material'; + +@Component({ + selector: 'app-seed-modal', + templateUrl: './seed-modal.component.html', + styleUrls: ['./seed-modal.component.css'], +}) +export class SeedModalComponent implements OnDestroy { + constructor( + @Inject(MAT_DIALOG_DATA) public data: any, + public dialogRef: MatDialogRef, + ) {} + + ngOnDestroy() { + this.data.seed = null; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/blockchain/blockchain.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/blockchain/blockchain.component.html new file mode 100644 index 00000000..58d3c1ea --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/blockchain/blockchain.component.html @@ -0,0 +1,52 @@ +
+ + + + +
+
+
+
+
+
{{ 'blockchain.blocks' | translate }}
+
{{ block.header.seq | number }}
+
+
+
{{ 'blockchain.time' | translate }}
+
{{ block.header.timestamp | dateTime }}
+
+
+
{{ 'blockchain.hash' | translate }}
+
{{ block.header.block_hash }}
+
+
+
+
+
+
+
+
+
{{ 'blockchain.current-supply' | translate }}
+
{{ coinSupply.current_supply | amount:true:'first' }}
+
+
+
{{ 'blockchain.total-supply' | translate }}
+
{{ coinSupply.total_supply | amount:true:'first' }}
+
+
+
+
+
{{ 'blockchain.current-coinhour-supply' | translate }}
+
{{ coinSupply.current_coinhour_supply | amount:false:'first' }}
+
+
+
{{ 'blockchain.total-coinhour-supply' | translate }}
+
{{ coinSupply.total_coinhour_supply | amount:false:'first' }}
+
+
+
+
+
+
+
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/blockchain/blockchain.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/blockchain/blockchain.component.scss new file mode 100644 index 00000000..eeb33169 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/blockchain/blockchain.component.scss @@ -0,0 +1,28 @@ +@import '../../../../../theme/variables'; + +.-wrapper { + margin: 30px; +} + +.-paper { + background-color: #fbfbfb; + border-radius: 15px; + box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.01), 1px 1px 2px 2px rgba(0, 0, 0, 0.01); + padding: 20px; + font-size: $font-size-standard; +} + +.-item { + &:not(:last-child) { + margin-bottom: 20px; + } + + .-key { + color: $grey; + margin-bottom: 5px; + } + + .-value { + word-break: break-all; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/blockchain/blockchain.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/blockchain/blockchain.component.spec.ts new file mode 100644 index 00000000..e868709a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/blockchain/blockchain.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BlockchainComponent } from './blockchain.component'; + +describe('BlockchainComponent', () => { + let component: BlockchainComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ BlockchainComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BlockchainComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/blockchain/blockchain.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/blockchain/blockchain.component.ts new file mode 100644 index 00000000..9d7ac7a7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/blockchain/blockchain.component.ts @@ -0,0 +1,38 @@ +import { Component, OnInit, OnDestroy } from '@angular/core'; +import 'rxjs/add/operator/switchMap'; +import { IntervalObservable } from 'rxjs/observable/IntervalObservable'; +import { ISubscription } from 'rxjs/Subscription'; +import { BlockchainService } from '../../../../services/blockchain.service'; + +@Component({ + selector: 'app-blockchain', + templateUrl: './blockchain.component.html', + styleUrls: ['./blockchain.component.scss'], +}) +export class BlockchainComponent implements OnInit, OnDestroy { + block: any; + coinSupply: any; + + private subscriptionsGroup: ISubscription[] = []; + + constructor( + private blockchainService: BlockchainService, + ) { } + + ngOnInit() { + this.subscriptionsGroup.push(IntervalObservable + .create(5000) + .switchMap(() => this.blockchainService.lastBlock()) + .subscribe(block => this.block = block)); + + this.subscriptionsGroup.push(IntervalObservable + .create(5000) + .switchMap(() => this.blockchainService.coinSupply()) + .subscribe(coinSupply => this.coinSupply = coinSupply), + ); + } + + ngOnDestroy() { + this.subscriptionsGroup.forEach(sub => sub.unsubscribe()); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/network/network.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/network/network.component.html new file mode 100644 index 00000000..821ec877 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/network/network.component.html @@ -0,0 +1,41 @@ +
+ + + + +
+
+
+
+
{{ 'network.peer' | translate }}
+
{{ 'network.source' | translate }}
+
{{ 'network.block-height' | translate }}
+
{{ 'network.block-height-short' | translate }}
+
{{ 'network.last-seen' | translate }}
+
+
+
+
+ +
+
+ {{ peer.address.split(':')[0] }}:{{ peer.listen_port }} +
+
{{ ('network.sources.' + peer.source) | translate }}
+
{{ peer.height }}
+
+
+ keyboard_arrow_up + {{ peer.last_sent | dateFromNow }} +
+
+ keyboard_arrow_down + {{ peer.last_received | dateFromNow }} +
+
+
+
+
+
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/network/network.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/network/network.component.scss new file mode 100644 index 00000000..1b409027 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/network/network.component.scss @@ -0,0 +1,71 @@ +@import '../../../../../theme/variables'; + +.-port, .-last-seen, .-source { + color: $grey; +} + +.-direction { + width: 72px; + display: flex; + justify-content: center; + align-items: center; + flex-shrink: 0; + + img { + width: 32px; + + &.-incoming { + transform: scaleX(-1); + } + } +} + +.-last-seen { + display: flex; + flex-direction: column; + font-size: 12px; + line-height: 1; + justify-content: center; + + mat-icon { + font-size: 12px; + display: inline; + vertical-align: middle; + padding-right: 5px; + } +} + +.-trusted { + display: inline; + color: $blue; + font-size: 13px; + vertical-align: middle; +} + +.-text-right { + text-align: right; +} + +.-pl-0 { + padding-left: 0 !important; +} + +.-block-row { + width: 150px; + flex-shrink: 0; +} + +.-invisible { + display: none; +} + +@media (max-width: $max-sm-width) { + .-pl-0 { + width: 160px !important; + } + + .-block-row { + width: 90px; + flex-shrink: 0; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/network/network.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/network/network.component.spec.ts new file mode 100644 index 00000000..c1175d10 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/network/network.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { NetworkComponent } from './network.component'; + +describe('NetworkComponent', () => { + let component: NetworkComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ NetworkComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(NetworkComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/network/network.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/network/network.component.ts new file mode 100644 index 00000000..00469f9a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/network/network.component.ts @@ -0,0 +1,34 @@ +import { Component, OnDestroy, OnInit } from '@angular/core'; +import { NetworkService } from '../../../../services/network.service'; +import { ISubscription } from 'rxjs/Subscription'; + +@Component({ + selector: 'app-network', + templateUrl: './network.component.html', + styleUrls: ['./network.component.scss'], +}) +export class NetworkComponent implements OnInit, OnDestroy { + peers: any; + + private subscription: ISubscription; + + constructor( + public networkService: NetworkService, + ) { } + + ngOnInit() { + this.subscription = this.networkService.retrieveDefaultConnections().subscribe(trusted => { + this.subscription = this.networkService.automatic().subscribe(peers => { + this.peers = peers.map(peer => { + peer.source = trusted.find(p => p.address === peer.address) ? 'default' : 'exchange'; + + return peer; + }).sort((a, b) => a.address.localeCompare(b.address)); + }); + }); + } + + ngOnDestroy() { + this.subscription.unsubscribe(); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/outputs/outputs.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/outputs/outputs.component.html new file mode 100644 index 00000000..ebb061a2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/outputs/outputs.component.html @@ -0,0 +1,34 @@ +
+ + + + +
+
+
+
{{ wallet.label }}
+
{{ 'coin' | commonText }}
+
{{ 'hours' | commonText }}
+
+
+ +
+
+ + {{ address.address }} +
+
+
+
{{ output.hash }}
+
{{ output.coins | amount:true:'first' }}
+
{{ output.calculated_hours | amount:false:'first' }}
+
+
+
+
+
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/outputs/outputs.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/outputs/outputs.component.scss new file mode 100644 index 00000000..6280660c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/outputs/outputs.component.scss @@ -0,0 +1,30 @@ +@import '../../../../../theme/variables'; + +.-text-right { + text-align: right; +} + +.-grey { + color: $grey; +} + +.-hash { + margin-left: 27px; + word-break: break-all; +} + +.-address { + color: $grey; + + img { + width: 17px; + vertical-align: middle; + margin-right: 10px; + } +} + +.-label { + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/outputs/outputs.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/outputs/outputs.component.spec.ts new file mode 100644 index 00000000..6f43161b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/outputs/outputs.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { OutputsComponent } from './outputs.component'; + +describe('OutputsComponent', () => { + let component: OutputsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ OutputsComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(OutputsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/outputs/outputs.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/outputs/outputs.component.ts new file mode 100644 index 00000000..b7c41ac6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/outputs/outputs.component.ts @@ -0,0 +1,61 @@ +import { Component, OnDestroy } from '@angular/core'; +import { WalletService } from '../../../../services/wallet.service'; +import { ActivatedRoute } from '@angular/router'; +import { ISubscription } from 'rxjs/Subscription'; +import { MatDialog, MatDialogConfig } from '@angular/material'; +import { QrCodeComponent, QrDialogConfig } from '../../../layout/qr-code/qr-code.component'; + +@Component({ + selector: 'app-outputs', + templateUrl: './outputs.component.html', + styleUrls: ['./outputs.component.scss'], +}) +export class OutputsComponent implements OnDestroy { + wallets: any[]|null; + + private outputsSubscription: ISubscription; + private lastRouteParams: any; + + constructor( + public walletService: WalletService, + private route: ActivatedRoute, + private dialog: MatDialog, + ) { + route.queryParams.subscribe(params => { + this.wallets = null; + this.lastRouteParams = params; + this.walletService.startDataRefreshSubscription(); + }); + walletService.all().subscribe(() => this.loadData()); + } + + ngOnDestroy() { + this.outputsSubscription.unsubscribe(); + } + + loadData() { + const addr = this.lastRouteParams['addr']; + + this.outputsSubscription = this.walletService.outputsWithWallets().subscribe(wallets => { + this.wallets = wallets + .map(wallet => Object.assign({}, wallet)) + .map(wallet => { + wallet.addresses = wallet.addresses.filter(address => { + if (address.outputs.length > 0) { + return addr ? address.address === addr : true; + } + }); + + return wallet; + }) + .filter(wallet => wallet.addresses.length > 0); + }); + } + + showQrCode(event: any, address: string) { + event.stopPropagation(); + + const config: QrDialogConfig = { address }; + QrCodeComponent.openDialog(this.dialog, config); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/pending-transactions/pending-transactions.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/pending-transactions/pending-transactions.component.html new file mode 100644 index 00000000..ff49d255 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/pending-transactions/pending-transactions.component.html @@ -0,0 +1,28 @@ +
+ + + + +
+
+
+
{{ 'pending-txs.txid' | translate }}
+
{{ 'coin' | commonText }}
+
{{ 'hours' | commonText }}
+
{{ 'pending-txs.timestamp' | translate }}
+
+
+
+
{{ tx.txid }}
+
{{ tx.amount | amount:true:'first' }}
+
{{ tx.hours | amount:false:'first' }}
+
{{ tx.timestamp | dateTime }}
+
+
+
+
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/pending-transactions/pending-transactions.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/pending-transactions/pending-transactions.component.scss new file mode 100644 index 00000000..49ea86a6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/pending-transactions/pending-transactions.component.scss @@ -0,0 +1,9 @@ +@import '../../../../../theme/variables'; + +.-timestamp { + color: $grey; +} + +.-txid { + word-break: break-all; +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/pending-transactions/pending-transactions.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/pending-transactions/pending-transactions.component.spec.ts new file mode 100644 index 00000000..9b19aaac --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/pending-transactions/pending-transactions.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { PendingTransactionsComponent } from './pending-transactions.component'; + +describe('PendingTransactionsComponent', () => { + let component: PendingTransactionsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ PendingTransactionsComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(PendingTransactionsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/pending-transactions/pending-transactions.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/pending-transactions/pending-transactions.component.ts new file mode 100644 index 00000000..acee2c40 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/settings/pending-transactions/pending-transactions.component.ts @@ -0,0 +1,75 @@ +import { Component, OnDestroy, OnInit } from '@angular/core'; +import { WalletService } from '../../../../services/wallet.service'; +import * as moment from 'moment'; +import { ISubscription } from 'rxjs/Subscription'; +import { NavBarService } from '../../../../services/nav-bar.service'; +import { DoubleButtonActive } from '../../../layout/double-button/double-button.component'; +import { BigNumber } from 'bignumber.js'; + +@Component({ + selector: 'app-pending-transactions', + templateUrl: './pending-transactions.component.html', + styleUrls: ['./pending-transactions.component.scss'], +}) +export class PendingTransactionsComponent implements OnInit, OnDestroy { + transactions = null; + + private transactionsSubscription: ISubscription; + private navbarSubscription: ISubscription; + + constructor( + public walletService: WalletService, + private navbarService: NavBarService, + ) { + this.navbarSubscription = this.navbarService.activeComponent.subscribe(value => { + this.startCheckingTransactions(value); + }); + } + + ngOnInit() { + this.navbarService.showSwitch('pending-txs.my', 'pending-txs.all'); + } + + ngOnDestroy() { + this.removeTransactionsSubscription(); + this.navbarSubscription.unsubscribe(); + this.navbarService.hideSwitch(); + } + + private startCheckingTransactions(value) { + this.transactions = null; + + this.removeTransactionsSubscription(); + + this.transactionsSubscription = this.walletService.pendingTransactions().subscribe(transactions => { + this.transactions = this.mapTransactions(value === DoubleButtonActive.LeftButton ? transactions.user : transactions.all); + }); + + this.walletService.startDataRefreshSubscription(); + } + + private mapTransactions(transactions) { + return transactions.map(transaction => { + transaction.transaction.timestamp = moment(transaction.received).unix(); + + return transaction.transaction; + }) + .map(transaction => { + let amount = new BigNumber('0'); + transaction.outputs.map(output => amount = amount.plus(output.coins)); + transaction.amount = amount.decimalPlaces(6).toString(); + + let hours = new BigNumber('0'); + transaction.outputs.map(output => hours = hours.plus(output.hours)); + transaction.hours = hours.decimalPlaces(0).toString(); + + return transaction; + }); + } + + private removeTransactionsSubscription() { + if (this.transactionsSubscription) { + this.transactionsSubscription.unsubscribe(); + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-detail/transaction-detail.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-detail/transaction-detail.component.html new file mode 100644 index 00000000..d2c9377a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-detail/transaction-detail.component.html @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-detail/transaction-detail.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-detail/transaction-detail.component.scss new file mode 100644 index 00000000..e69de29b diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-detail/transaction-detail.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-detail/transaction-detail.component.spec.ts new file mode 100644 index 00000000..45138c8f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-detail/transaction-detail.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { TransactionDetailComponent } from './transaction-detail.component'; + +describe('TransactionDetailComponent', () => { + let component: TransactionDetailComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ TransactionDetailComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(TransactionDetailComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-detail/transaction-detail.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-detail/transaction-detail.component.ts new file mode 100644 index 00000000..60591d83 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-detail/transaction-detail.component.ts @@ -0,0 +1,19 @@ +import { Component, Inject } from '@angular/core'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { NormalTransaction } from '../../../../app.datatypes'; + +@Component({ + selector: 'app-transaction-detail', + templateUrl: './transaction-detail.component.html', + styleUrls: ['./transaction-detail.component.scss'], +}) +export class TransactionDetailComponent { + constructor( + @Inject(MAT_DIALOG_DATA) public transaction: NormalTransaction, + public dialogRef: MatDialogRef, + ) {} + + closePopup() { + this.dialogRef.close(); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-list.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-list.component.html new file mode 100644 index 00000000..3bcfb1d0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-list.component.html @@ -0,0 +1,97 @@ + +
+
+ + + + {{ 'history.all-addresses' | translate }} + + + {{ address.address }} - {{ address.coins | amount }} + ({{ address.hours | amount:false }}) + + + + {{ 'history.filter' | translate }} + {{ 'history.filters' | translate }} + +
+ {{ filter.label }} + {{ filter.address }} + - {{ filter.coins | amount }} + ({{ filter.hours | amount:false }}) +
+
+
+
+ +
+ + + +
+ +
+
+ +
+
+ +

+ {{ 'history.sent' | translate }} {{ 'coin' | commonText }} + {{ transaction.timestamp | dateTime }} +

+

+ {{ 'history.sending' | translate }} {{ 'coin' | commonText }} + {{ 'history.pending' | translate }} +

+

+ {{ 'history.received' | translate }} {{ 'coin' | commonText }} + {{ transaction.timestamp | dateTime }} +

+

+ {{ 'history.receiving' | translate }} {{ 'coin' | commonText }} + {{ 'history.pending' | translate }} +

+
+ +

+ {{ 'history.moved' | translate }} {{ 'coin' | commonText }} + {{ transaction.timestamp | dateTime }} +

+

+ {{ 'history.moving' | translate }} {{ 'coin' | commonText }} + {{ 'history.pending' | translate }} +

+
+
+ + {{ address }} +
+
+ {{ 'history.note' | translate }}: {{ transaction.note }} +
+
+
+

{{ transaction.balance.toString() | amount }}

+

+ {{ transaction.balance * price | currency:'USD':'symbol':'1.2-2' }}* +

+
+
+
+
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-list.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-list.component.scss new file mode 100644 index 00000000..b98301c8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-list.component.scss @@ -0,0 +1,209 @@ +@import '../../../../theme/variables'; + +.form-field { + margin: 10px 40px; + margin-bottom: -20px; + display: flex; + + .x-button { + width: 24px; + height: 24px; + margin-top: 10px; + cursor: pointer; + } +} + +.bottom-line { + border-bottom: 2px solid rgba(0, 0, 0, 0.02); +} + +mat-select { + ::ng-deep .mat-select-trigger { + padding: 10px 30px 10px 10px; + display: block; + font-size: 11px; + height: 100%; + line-height: 20px; + } + + ::ng-deep .mat-select-value { + font-size: 13px; + line-height: 22px; + } + + ::ng-deep .mat-select-arrow { + border: none; + } + + ::ng-deep .mat-select-placeholder { + transition: unset !important; + color: $grey; + + &::before { + content: 'filter_list'; + font-family: 'Material Icons'; + font-weight: normal; + font-style: normal; + font-size: 13px; + margin-right: 10px; + } + } + + mat-select-trigger::before { + content: 'filter_list'; + font-family: 'Material Icons'; + font-weight: normal; + font-style: normal; + font-size: 13px; + margin-right: 10px; + } + + .filter { + font-size: 13px; + margin-left: 28px; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + color: $grey; + } +} + +mat-option ::ng-deep .mat-pseudo-checkbox-checked { + background: $gradient-blue-dark; +} + +.mat-option-disabled { + ::ng-deep .mat-pseudo-checkbox-disabled { + opacity: 0.5; + } +} + +.-paper { + background-color: #fbfbfb; + border-radius: 10px; + box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.01), 1px 1px 2px 2px rgba(0, 0, 0, 0.01); + margin: 30px; +} + +.-transaction { + background-color: $white; + border-bottom: 1px solid #eff0f0; + cursor: pointer; + display: flex; + padding: 20px 12px; + + &:first-child { + border-top-left-radius: 15px; + border-top-right-radius: 15px; + } + + &:last-child { + border-bottom-left-radius: 15px; + border-bottom-right-radius: 15px; + } + + > div { + padding: 0 8px; + } + + .-icon { + margin-top: 5px; + + img { + width: 32px; + } + + &.-incoming { + -moz-transform: scaleX(-1); + -o-transform: scaleX(-1); + -webkit-transform: scaleX(-1); + transform: scaleX(-1); + filter: FlipH; + -ms-filter: "FlipH"; + } + + &.-pending { + opacity: 0.5; + } + } + + .-address { + flex: 1; + + h4 { + color: #1e2227; + font-size: 13px; + font-weight: 700; + line-height: 15px; + margin: 0 0 8px 0; + + span { + font-size: 10px; + line-height: 12px; + padding-left: 5px; + font-weight: 300; + } + + .-pending { + color: #FDB51E; + } + + .-timestamp { + color: $grey; + } + } + + .-item { + &:not(:last-child) { + margin-bottom: 5px; + } + + img { + display: inline-block; + height: 17px; + vertical-align: middle; + width: 17px; + margin-right: 4px; + } + + span { + color: rgba(30, 34, 39, 0.5); + display: inline-block; + font-size: 13px; + line-height: 15px; + margin: 0; + } + + .note { + color: #1e2227; + word-break: break-word; + display: inline; + } + } + } + + .-balance { + width: 200px; + text-align: right; + + h4 { + color: #1e2227; + font-size: 13px; + font-weight: 700; + line-height: 15px; + margin: 0 0 8px 0; + } + + p { + color: rgba(30, 34, 39, 0.5); + display: inline-block; + font-size: 13px; + line-height: 15px; + margin: 0; + + span { + color: lighten($grey, 40%); + } + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-list.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-list.component.spec.ts new file mode 100644 index 00000000..2b4a9a0a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-list.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { TransactionListComponent } from './transaction-list.component'; + +describe('TransactionListComponent', () => { + let component: TransactionListComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ TransactionListComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(TransactionListComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-list.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-list.component.ts new file mode 100644 index 00000000..2c5686e5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-list.component.ts @@ -0,0 +1,204 @@ +import { Component, OnDestroy, OnInit } from '@angular/core'; +import { WalletService } from '../../../services/wallet.service'; +import { PriceService } from '../../../services/price.service'; +import { ISubscription } from 'rxjs/Subscription'; +import { MatDialog, MatDialogConfig } from '@angular/material/dialog'; +import { TransactionDetailComponent } from './transaction-detail/transaction-detail.component'; +import { NormalTransaction } from '../../../app.datatypes'; +import { QrCodeComponent, QrDialogConfig } from '../../layout/qr-code/qr-code.component'; +import { FormGroup, FormBuilder } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; +import { Observable } from 'rxjs/Observable'; + +export class Wallet { + label: string; + coins: string; + hours: string; + addresses: Address[]; + allAddressesSelected: boolean; +} + +export class Address { + address: string; + coins: string; + hours: string; + showingWholeWallet: boolean; +} + +@Component({ + selector: 'app-transaction-list', + templateUrl: './transaction-list.component.html', + styleUrls: ['./transaction-list.component.scss'], +}) +export class TransactionListComponent implements OnInit, OnDestroy { + allTransactions: NormalTransaction[]; + transactions: NormalTransaction[]; + wallets: Wallet[]; + form: FormGroup; + + private price: number; + private requestedAddress: string; + private transactionsLoaded = false; + private priceSubscription: ISubscription; + private filterSubscription: ISubscription; + private walletsSubscription: ISubscription; + private routeSubscription: ISubscription; + + constructor( + private dialog: MatDialog, + private priceService: PriceService, + private walletService: WalletService, + private formBuilder: FormBuilder, + route: ActivatedRoute, + ) { + + this.form = this.formBuilder.group({ + filter: [[]], + }); + + this.routeSubscription = route.queryParams.subscribe(params => { + this.requestedAddress = params['addr'] ? params['addr'] : ''; + this.showRequestedAddress(); + }); + + this.walletsSubscription = walletService.all().delay(1).flatMap(wallets => { + if (!this.wallets) { + this.wallets = []; + let incompleteData = false; + + // A local copy of the data is created to avoid problems after updating the + // wallet addresses while updating the balance. + wallets.forEach(wallet => { + if (!wallet.coins || !wallet.hours || incompleteData) { + incompleteData = true; + + return; + } + + this.wallets.push({ + label: wallet.label, + coins: wallet.coins.decimalPlaces(6).toString(), + hours: wallet.hours.decimalPlaces(0).toString(), + addresses: [], + allAddressesSelected: false, + }); + + wallet.addresses.forEach(address => { + if (!address.coins || !address.hours || incompleteData) { + incompleteData = true; + + return; + } + + this.wallets[this.wallets.length - 1].addresses.push({ + address: address.address, + coins: address.coins.decimalPlaces(6).toString(), + hours: address.hours.decimalPlaces(0).toString(), + showingWholeWallet: false, + }); + }); + }); + + if (incompleteData) { + this.wallets = null; + + return Observable.of(null); + } else { + return this.walletService.transactions().first(); + } + } else { + return this.walletService.transactions().first(); + } + }).subscribe(transactions => { + if (transactions) { + this.allTransactions = transactions; + + this.transactionsLoaded = true; + this.showRequestedAddress(); + + this.filterTransactions(); + } + }); + } + + ngOnInit() { + this.priceSubscription = this.priceService.price.subscribe(price => this.price = price); + this.filterSubscription = this.form.get('filter').valueChanges.subscribe(() => this.filterTransactions()); + } + + ngOnDestroy() { + this.priceSubscription.unsubscribe(); + this.filterSubscription.unsubscribe(); + this.walletsSubscription.unsubscribe(); + this.routeSubscription.unsubscribe(); + } + + showTransaction(transaction: NormalTransaction) { + const config = new MatDialogConfig(); + config.width = '800px'; + config.data = transaction; + this.dialog.open(TransactionDetailComponent, config); + } + + showQrCode(event: any, address: string) { + event.stopPropagation(); + + const config: QrDialogConfig = { address }; + QrCodeComponent.openDialog(this.dialog, config); + } + + removeFilters() { + this.form.get('filter').setValue([]); + } + + private filterTransactions() { + const selectedfilters: (Wallet|Address)[] = this.form.get('filter').value; + this.wallets.forEach(wallet => { + wallet.allAddressesSelected = false; + wallet.addresses.forEach(address => address.showingWholeWallet = false); + }); + + if (selectedfilters.length === 0) { + this.transactions = this.allTransactions; + } else { + const selectedAddresses: Map = new Map(); + selectedfilters.forEach(filter => { + if ((filter as Wallet).addresses) { + (filter as Wallet).addresses.forEach(address => selectedAddresses.set(address.address, true)); + (filter as Wallet).allAddressesSelected = true; + (filter as Wallet).addresses.forEach(address => address.showingWholeWallet = true); + } else { + selectedAddresses.set((filter as Address).address, true); + } + }); + + this.transactions = this.allTransactions.filter(tx => + tx.inputs.some(input => selectedAddresses.has(input.owner)) || tx.outputs.some(output => selectedAddresses.has(output.dst)), + ); + } + } + + private showRequestedAddress() { + if (!this.transactionsLoaded || !this.wallets || this.wallets.length === 0 || this.requestedAddress === null || this.requestedAddress === undefined) { + return; + } + + if (this.requestedAddress !== '') { + let addressFound: Address; + this.wallets.forEach(wallet => { + const found = wallet.addresses.find(address => address.address === this.requestedAddress); + if (found) { + addressFound = found; + } + }); + + if (addressFound) { + this.form.get('filter').setValue([addressFound]); + } + } else { + this.form.get('filter').setValue([]); + } + + this.requestedAddress = null; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/change-name/change-name.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/change-name/change-name.component.html new file mode 100644 index 00000000..5d342076 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/change-name/change-name.component.html @@ -0,0 +1,26 @@ + + +
+ {{ 'hardware-wallet.added.characters-warning' | translate }} +
+
+
+ + +
+
+
+ + {{ 'wallet.rename.cancel-button' | translate }} + + + {{ 'wallet.rename.rename-button' | translate }} + +
+
+ + +
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/change-name/change-name.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/change-name/change-name.component.scss new file mode 100644 index 00000000..f1214bdc --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/change-name/change-name.component.scss @@ -0,0 +1,16 @@ +@import '../../../../../theme/variables'; + +mat-input-container { + width: 100%; +} + +.-buttons { + text-align: center; +} + +.info { + margin: 5px 0 25px; + color: $grey; + font-size: 12px; + line-height: 1.5; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/change-name/change-name.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/change-name/change-name.component.spec.ts new file mode 100644 index 00000000..fae378f6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/change-name/change-name.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ChangeNameComponent } from './change-name.component'; + +describe('ChangeNameComponent', () => { + let component: ChangeNameComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ChangeNameComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ChangeNameComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/change-name/change-name.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/change-name/change-name.component.ts new file mode 100644 index 00000000..0e4d59b6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/change-name/change-name.component.ts @@ -0,0 +1,152 @@ +import { Component, OnInit, Inject, ViewChild, OnDestroy } from '@angular/core'; +import { WalletService } from '../../../../services/wallet.service'; +import { FormBuilder, Validators, FormGroup } from '@angular/forms'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { Wallet } from '../../../../app.datatypes'; +import { ButtonComponent } from '../../../layout/button/button.component'; +import { MessageIcons } from '../../../layout/hardware-wallet/hw-message/hw-message.component'; +import { HwWalletService } from '../../../../services/hw-wallet.service'; +import { TranslateService } from '@ngx-translate/core'; +import { getHardwareWalletErrorMsg } from '../../../../utils/errors'; +import { ISubscription } from 'rxjs/Subscription'; +import { MsgBarService } from '../../../../services/msg-bar.service'; + +enum States { + Initial, + WaitingForConfirmation, +} + +export class ChangeNameData { + wallet: Wallet; + newName: string; +} + +export class ChangeNameErrorResponse { + errorMsg: string; +} + +@Component({ + selector: 'app-change-name', + templateUrl: './change-name.component.html', + styleUrls: ['./change-name.component.scss'], +}) +export class ChangeNameComponent implements OnInit, OnDestroy { + @ViewChild('button') button: ButtonComponent; + form: FormGroup; + currentState: States = States.Initial; + states = States; + msgIcons = MessageIcons; + maxHwWalletLabelLength = HwWalletService.maxLabelLength; + showCharactersWarning = false; + + private newLabel: string; + private hwConnectionSubscription: ISubscription; + private operationSubscription: ISubscription; + + constructor( + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) private data: ChangeNameData, + private formBuilder: FormBuilder, + private walletService: WalletService, + private hwWalletService: HwWalletService, + private translateService: TranslateService, + private msgBarService: MsgBarService, + ) {} + + ngOnInit() { + if (!this.data.newName) { + this.form = this.formBuilder.group({ + label: [this.data.wallet.label, Validators.required], + }); + } else { + this.finishRenaming(this.data.newName); + } + + if (this.data.wallet.isHardware) { + this.showCharactersWarning = true; + + this.hwConnectionSubscription = this.hwWalletService.walletConnectedAsyncEvent.subscribe(connected => { + if (!connected) { + this.closePopup(); + } + }); + } + } + + ngOnDestroy() { + this.msgBarService.hide(); + if (this.hwConnectionSubscription) { + this.hwConnectionSubscription.unsubscribe(); + } + if (this.operationSubscription) { + this.operationSubscription.unsubscribe(); + } + } + + closePopup() { + this.dialogRef.close(); + } + + rename() { + if (!this.form.valid || this.button.isLoading()) { + return; + } + + this.msgBarService.hide(); + this.button.setLoading(); + + this.finishRenaming(this.form.value.label); + } + + private finishRenaming(newLabel) { + this.newLabel = newLabel; + + if (!this.data.wallet.isHardware) { + this.operationSubscription = this.walletService.renameWallet(this.data.wallet, this.newLabel) + .subscribe(() => { + this.dialogRef.close(this.newLabel); + setTimeout(() => this.msgBarService.showDone('common.changes-made')); + }, e => { + this.msgBarService.showError(e); + if (this.button) { + this.button.resetState(); + } + }); + } else { + if (this.data.newName) { + this.currentState = States.WaitingForConfirmation; + } + + this.operationSubscription = this.hwWalletService.checkIfCorrectHwConnected(this.data.wallet.addresses[0].address) + .flatMap(() => { + this.currentState = States.WaitingForConfirmation; + + return this.hwWalletService.changeLabel(this.newLabel); + }) + .subscribe( + () => { + this.data.wallet.label = this.newLabel; + this.walletService.saveHardwareWallets(); + this.dialogRef.close(this.newLabel); + + if (!this.data.newName) { + setTimeout(() => this.msgBarService.showDone('common.changes-made')); + } + }, + err => { + if (this.data.newName) { + const response = new ChangeNameErrorResponse(); + response.errorMsg = getHardwareWalletErrorMsg(this.translateService, err); + this.dialogRef.close(response); + } else { + this.msgBarService.showError(getHardwareWalletErrorMsg(this.translateService, err)); + this.currentState = States.Initial; + if (this.button) { + this.button.resetState(); + } + } + }, + ); + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet-form/create-wallet-form.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet-form/create-wallet-form.component.html new file mode 100644 index 00000000..9808a5fb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet-form/create-wallet-form.component.html @@ -0,0 +1,110 @@ +
+
+ + +
+
+ +
+ +
+
+
+ + + +
+ {{ lastAssistedSeed }} +
{{ 'wallet.new.seed.change-seed' | translate }}
+
+ touch_app{{ 'wallet.new.seed.enter-seed' | translate }} +
+
+
+
+ +
+
+
+ + + +
+
+ +
+
+
+ +

+ {{ 'wallet.new.seed-warning' | translate}} +

+
+
+ + +
+
+ touch_app{{ 'wallet.new.seed.confirm-seed' | translate }} +
+
+ done {{ 'wallet.new.seed.confirmed-seed' | translate }} +
+
+
+ + + + +
+
+
+ + {{ 'wallet.new.encrypt' | translate }} + +
+
+
+

{{ 'wallet.new.encrypt-warning' | translate }}

+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+
+ error +
+
{{ 'wallet.new.unconventional-seed-title' | translate}}
+
{{ 'wallet.new.unconventional-seed-text' | translate}}
+ + {{ 'wallet.new.unconventional-seed-check' | translate}} + +
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet-form/create-wallet-form.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet-form/create-wallet-form.component.scss new file mode 100644 index 00000000..6d887fa8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet-form/create-wallet-form.component.scss @@ -0,0 +1,171 @@ +@import '../../../../../../theme/_variables.scss'; + +.dashed-border { + border: rgba(0, 0, 0, 0.25) dashed 1px; +} + +.show-pointer { + cursor: pointer; +} + +.non-editable-field { + font-size: 12px; + text-align: center; + padding: 15px; + border-radius: 6px; + color: $black; + + .text-with-icon-container { + display: inline-flex; + align-items: center; + + mat-icon { + margin-right: 5px; + opacity: 1; + } + + .green { + color: $green; + } + + .yellow { + color: $yellow; + } + } +} + +.normal-seed-field { + font-size: 14px; +} + +.seed-type-button { + width: 100%; + height: 10px; + text-align: right; + + > div { + display: inline-block; + width: 32px; + height: 32px; + position: relative; + left: 16px; + top: -10px; + background-color: white; + border-radius: 100px; + cursor: pointer; + + > img { + width: 32px; + height: 32px; + } + } +} + +.onboarding-version { + border: rgba(255, 255, 255, 0.5) dashed 1px; + color: #fff; +} + +.transparent-text { + opacity: 0.75; +} + +.red-disclaimer-box { + color: $red; + font-size: 12px; + padding: 0 10px; + line-height: 1.5; +} + +.white-disclaimer-box { + color: $white; + font-size: 12px; + padding: 0 10px; + line-height: 1.5; +} + +label[for=seed] { + display: flex; + + > span:last-child { + flex: 1; + } + + .generators { + text-align: right; + + span { + cursor: pointer; + color: $blue; + } + + mat-icon { + width: 13px; + height: 10px; + font-size: 13px; + position: relative; + top: 2px; + } + + .divider { + padding: 0 5px; + color: $grey-dark; + } + } + + .-white-text { + span { + color: white !important; + } + } +} + +.-passwords { + margin-left: 24px; + + .-info { + margin: 5px 0 15px; + color: $grey; + font-size: 12px; + line-height: 1.5; + } +} + +.-check ::ng-deep { + .mat-checkbox-checkmark-path { + position: absolute; + width: 18px; + height: 8px; + left: 4.59px; + top: 9px; + stroke: $gradient-blue-dark !important; + } + + .mat-checkbox-background, .mat-checkbox-frame { + top: 0; + left: 0; + right: 0; + bottom: 0; + position: absolute; + box-sizing: border-box; + pointer-events: none; + width: 20px; + height: 20px; + background: rgba(30, 34, 39, 0.05); + border-radius: 6px; + border-color: transparent; + } + span { + font-family: Skycoin; + line-height: normal; + font-size: 14px; + + color: $grey-dark; + + img { + width: 38px; + height: 38px; + vertical-align: middle; + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet-form/create-wallet-form.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet-form/create-wallet-form.component.spec.ts new file mode 100644 index 00000000..591a9c50 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet-form/create-wallet-form.component.spec.ts @@ -0,0 +1,24 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { CreateWalletFormComponent } from './create-wallet-form.component'; + +describe('CreateWalletFormComponent', () => { + let component: CreateWalletFormComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ CreateWalletFormComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(CreateWalletFormComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet-form/create-wallet-form.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet-form/create-wallet-form.component.ts new file mode 100644 index 00000000..cf5e89ba --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet-form/create-wallet-form.component.ts @@ -0,0 +1,317 @@ +import { Component, OnInit, OnDestroy, Input } from '@angular/core'; +import { FormControl, FormGroup, Validators } from '@angular/forms'; +import { ISubscription } from 'rxjs/Subscription'; +import { ApiService } from '../../../../../services/api.service'; +import { Subject } from 'rxjs/Subject'; +import 'rxjs/add/operator/switchMap'; +import { Observable } from 'rxjs/Observable'; +import { MatDialog, MatDialogConfig } from '@angular/material'; +import { SeedWordDialogComponent } from '../../../../layout/seed-word-dialog/seed-word-dialog.component'; +import { ConfirmationData } from '../../../../../app.datatypes'; +import { showConfirmationModal } from '../../../../../utils'; +import { MsgBarService } from '../../../../../services/msg-bar.service'; + +export class WalletFormData { + creatingNewWallet: boolean; + label: string; + seed: string; + password: string; + enterSeedWithAssistance: boolean; + lastAssistedSeed: string; + lastCustomSeed: string; + numberOfWords: number; +} + +@Component({ + selector: 'app-create-wallet-form', + templateUrl: './create-wallet-form.component.html', + styleUrls: ['./create-wallet-form.component.scss'], +}) +export class CreateWalletFormComponent implements OnInit, OnDestroy { + @Input() create: boolean; + @Input() onboarding: boolean; + + form: FormGroup; + customSeedIsNormal = true; + customSeedAccepted = false; + encrypt = true; + enterSeedWithAssistance = true; + assistedSeedConfirmed = false; + lastAssistedSeed = ''; + numberOfAutogeneratedWords = 0; + + private seed: Subject = new Subject(); + private statusSubscription: ISubscription; + private seedValiditySubscription: ISubscription; + + private partialSeed: string[]; + + constructor( + private apiService: ApiService, + private dialog: MatDialog, + private msgBarService: MsgBarService, + ) { } + + ngOnInit() { + if (!this.onboarding) { + this.initForm(); + } else { + this.initForm(false, null); + } + } + + ngOnDestroy() { + this.msgBarService.hide(); + this.statusSubscription.unsubscribe(); + this.seedValiditySubscription.unsubscribe(); + } + + get isValid(): boolean { + return this.form.valid && + ( + (!this.enterSeedWithAssistance && (this.customSeedIsNormal || this.customSeedAccepted)) || + (this.create && this.enterSeedWithAssistance && this.assistedSeedConfirmed) || + (!this.create && this.enterSeedWithAssistance && this.lastAssistedSeed.length > 2) + ); + } + + onCustomSeedAcceptance(event) { + this.customSeedAccepted = event.checked; + } + + setEncrypt(event) { + this.encrypt = event.checked; + this.form.updateValueAndValidity(); + } + + getData(): WalletFormData { + return { + creatingNewWallet: this.create, + label: this.form.value.label, + seed: this.enterSeedWithAssistance ? this.lastAssistedSeed : this.form.value.seed, + password: !this.onboarding && this.encrypt ? this.form.value.password : null, + enterSeedWithAssistance: this.enterSeedWithAssistance, + lastAssistedSeed: this.lastAssistedSeed, + lastCustomSeed: this.form.value.seed, + numberOfWords: !this.create ? this.form.value.number_of_words : this.numberOfAutogeneratedWords, + }; + } + + changeSeedType() { + this.msgBarService.hide(); + + if (!this.enterSeedWithAssistance) { + this.enterSeedWithAssistance = true; + this.removeConfirmations(); + } else { + const confirmationData: ConfirmationData = { + text: this.create ? 'wallet.new.seed.custom-seed-warning-text' : 'wallet.new.seed.custom-seed-warning-text-recovering', + headerText: 'wallet.new.seed.custom-seed-warning-title', + checkboxText: this.create ? 'wallet.new.seed.custom-seed-warning-check' : null, + confirmButtonText: 'wallet.new.seed.custom-seed-warning-continue', + cancelButtonText: 'wallet.new.seed.custom-seed-warning-cancel', + }; + + showConfirmationModal(this.dialog, confirmationData).afterClosed().subscribe(confirmationResult => { + if (confirmationResult) { + this.enterSeedWithAssistance = false; + this.removeConfirmations(); + } + }); + } + } + + enterSeed() { + if (!this.create) { + this.partialSeed = []; + this.askForWord(0); + this.msgBarService.hide(); + } + } + + confirmNormalSeed() { + if (!this.assistedSeedConfirmed) { + this.partialSeed = []; + this.askForWord(0); + this.msgBarService.hide(); + } + } + + private askForWord(wordIndex: number) { + this.dialog.open(SeedWordDialogComponent, { + width: '350px', + data: { + isForHwWallet: false, + wordNumber: wordIndex + 1, + restoringSoftwareWallet: !this.create, + }, + }).afterClosed().subscribe(word => { + if (word) { + if (this.create) { + const lastSeedWords = this.lastAssistedSeed.split(' '); + if (word !== lastSeedWords[wordIndex]) { + this.msgBarService.showError('wallet.new.seed.incorrect-word'); + + return; + } + } + + this.partialSeed[wordIndex] = word; + wordIndex += 1; + + if ((this.create && wordIndex < this.numberOfAutogeneratedWords) || (!this.create && wordIndex < this.form.controls['number_of_words'].value)) { + this.askForWord(wordIndex); + } else { + if (this.create) { + this.assistedSeedConfirmed = true; + } else { + let enteredSeed = ''; + this.partialSeed.forEach(currentWord => enteredSeed += currentWord + ' '); + enteredSeed = enteredSeed.substr(0, enteredSeed.length - 1); + + this.apiService.post('wallet/seed/verify', {seed: enteredSeed}, {}, true) + .subscribe(() => this.lastAssistedSeed = enteredSeed, () => this.msgBarService.showError('wallet.new.seed.invalid-seed')); + } + } + } + }); + } + + initForm(create: boolean = null, data: WalletFormData = null) { + this.msgBarService.hide(); + + create = create !== null ? create : this.create; + + this.lastAssistedSeed = ''; + this.enterSeedWithAssistance = true; + + const validators = []; + if (create) { + validators.push(this.seedMatchValidator.bind(this)); + } + if (!this.onboarding) { + validators.push(this.validatePasswords.bind(this)); + } + validators.push(this.mustHaveSeed.bind(this)); + + this.form = new FormGroup({}, validators); + this.form.addControl('label', new FormControl(data ? data.label : '', [Validators.required])); + this.form.addControl('seed', new FormControl(data ? data.lastCustomSeed : '')); + this.form.addControl('confirm_seed', new FormControl(data ? data.lastCustomSeed : '')); + this.form.addControl('password', new FormControl()); + this.form.addControl('confirm_password', new FormControl()); + this.form.addControl('number_of_words', new FormControl(!this.create && data && data.numberOfWords ? data.numberOfWords : 12)); + + this.removeConfirmations(false); + + if (create && !data) { + this.generateSeed(128); + } + + if (data) { + setTimeout(() => { this.seed.next(data['seed']); }); + this.customSeedAccepted = true; + this.enterSeedWithAssistance = data.enterSeedWithAssistance; + this.lastAssistedSeed = data.lastAssistedSeed; + this.assistedSeedConfirmed = true; + + if (this.create) { + this.numberOfAutogeneratedWords = data.numberOfWords; + } + } + + if (this.statusSubscription && !this.statusSubscription.closed) { + this.statusSubscription.unsubscribe(); + } + this.statusSubscription = this.form.statusChanges.subscribe(() => { + this.customSeedAccepted = false; + this.seed.next(this.form.get('seed').value); + }); + + this.subscribeToSeedValidation(); + } + + generateSeed(entropy: number) { + if (entropy === 128) { + this.numberOfAutogeneratedWords = 12; + } else { + this.numberOfAutogeneratedWords = 24; + } + + this.apiService.generateSeed(entropy).subscribe(seed => { + this.lastAssistedSeed = seed; + this.form.get('seed').setValue(seed); + this.removeConfirmations(); + }); + } + + private removeConfirmations(cleanSecondSeedField = true) { + this.customSeedAccepted = false; + this.assistedSeedConfirmed = false; + if (cleanSecondSeedField) { + this.form.get('confirm_seed').setValue(''); + } + this.form.updateValueAndValidity(); + } + + private subscribeToSeedValidation() { + if (this.seedValiditySubscription) { + this.seedValiditySubscription.unsubscribe(); + } + + this.seedValiditySubscription = this.seed.asObservable().switchMap(seed => { + if ((!this.seedMatchValidator() || !this.create) && !this.enterSeedWithAssistance) { + return this.apiService.post('wallet/seed/verify', {seed}, {}, true); + } else { + return Observable.of(0); + } + }).subscribe(() => { + this.customSeedIsNormal = true; + }, error => { + if (error.status && error.status === 422) { + this.customSeedIsNormal = false; + } else { + this.customSeedIsNormal = true; + } + this.subscribeToSeedValidation(); + }); + } + + private validatePasswords() { + if (this.encrypt && this.form && this.form.get('password') && this.form.get('confirm_password')) { + if (this.form.get('password').value) { + if (this.form.get('password').value !== this.form.get('confirm_password').value) { + return { NotEqual: true }; + } + } else { + return { Required: true }; + } + } + + return null; + } + + private mustHaveSeed() { + if (!this.enterSeedWithAssistance) { + if ((this.form.get('seed').value as string) === '') { + return { Required: true }; + } else { + return null; + } + } + } + + private seedMatchValidator() { + if (this.enterSeedWithAssistance) { + return null; + } + + if (this.form && this.form.get('seed') && this.form.get('confirm_seed')) { + return this.form.get('seed').value === this.form.get('confirm_seed').value ? null : { NotEqual: true }; + } else { + this.customSeedIsNormal = true; + + return { NotEqual: true }; + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet.component.html new file mode 100644 index 00000000..90cbcf64 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet.component.html @@ -0,0 +1,11 @@ + + +
+ + {{ 'wallet.new.cancel-button' | translate }} + + + {{ 'wallet.new.' + (data.create ? 'create' : 'load') + '-button' | translate }} + +
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet.component.scss new file mode 100644 index 00000000..1f8d001c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet.component.scss @@ -0,0 +1,5 @@ +@import '../../../../../theme/variables'; + +.-buttons { + text-align: center; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet.component.spec.ts new file mode 100644 index 00000000..4ccb5dba --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { CreateWalletComponent } from './create-wallet.component'; + +describe('CreateWalletComponent', () => { + let component: CreateWalletComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ CreateWalletComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(CreateWalletComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet.component.ts new file mode 100644 index 00000000..45dd4dd0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet.component.ts @@ -0,0 +1,93 @@ +import { Component, Inject, ViewChild, OnDestroy } from '@angular/core'; +import { WalletService } from '../../../../services/wallet.service'; +import { MatDialogRef, MatDialog } from '@angular/material/dialog'; +import { ButtonComponent } from '../../../layout/button/button.component'; +import { MAT_DIALOG_DATA } from '@angular/material'; +import { CreateWalletFormComponent } from './create-wallet-form/create-wallet-form.component'; +import { ISubscription } from 'rxjs/Subscription'; +import { BlockchainService } from '../../../../services/blockchain.service'; +import { ConfirmationData } from '../../../../app.datatypes'; +import { showConfirmationModal } from '../../../../utils'; +import { MsgBarService } from '../../../../services/msg-bar.service'; + +@Component({ + selector: 'app-create-wallet', + templateUrl: './create-wallet.component.html', + styleUrls: ['./create-wallet.component.scss'], +}) +export class CreateWalletComponent implements OnDestroy { + @ViewChild('formControl') formControl: CreateWalletFormComponent; + @ViewChild('createButton') createButton: ButtonComponent; + @ViewChild('cancelButton') cancelButton: ButtonComponent; + + scan: Number; + disableDismiss = false; + + private synchronized = true; + private synchronizedSubscription: ISubscription; + + constructor( + @Inject(MAT_DIALOG_DATA) public data, + public dialogRef: MatDialogRef, + private walletService: WalletService, + private dialog: MatDialog, + private msgBarService: MsgBarService, + blockchainService: BlockchainService, + ) { + this.synchronizedSubscription = blockchainService.synchronized.subscribe(value => this.synchronized = value); + } + + ngOnDestroy() { + this.synchronizedSubscription.unsubscribe(); + this.msgBarService.hide(); + } + + closePopup() { + this.dialogRef.close(); + } + + createWallet() { + if (!this.formControl.isValid || this.createButton.isLoading()) { + return; + } + + this.msgBarService.hide(); + + if (this.synchronized || this.data.create) { + this.continueCreating(); + } else { + const confirmationData: ConfirmationData = { + headerText: 'wallet.new.synchronizing-warning-title', + text: 'wallet.new.synchronizing-warning-text', + confirmButtonText: 'wallet.new.synchronizing-warning-continue', + cancelButtonText: 'wallet.new.synchronizing-warning-cancel', + }; + + showConfirmationModal(this.dialog, confirmationData).afterClosed().subscribe(confirmationResult => { + if (confirmationResult) { + this.continueCreating(); + } + }); + } + } + + private continueCreating() { + const data = this.formControl.getData(); + + this.createButton.resetState(); + this.createButton.setLoading(); + this.cancelButton.setDisabled(); + this.disableDismiss = true; + + this.walletService.create(data.label, data.seed, this.scan, data.password) + .subscribe(() => { + setTimeout(() => this.msgBarService.showDone('wallet.new.wallet-created')); + this.dialogRef.close(); + }, e => { + this.msgBarService.showError(e); + this.createButton.resetState(); + this.cancelButton.disabled = false; + this.disableDismiss = false; + }); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/number-of-addresses/number-of-addresses.css b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/number-of-addresses/number-of-addresses.css new file mode 100644 index 00000000..6be7dae0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/number-of-addresses/number-of-addresses.css @@ -0,0 +1,7 @@ +mat-input-container { + width: 100%; +} + +.-buttons { + text-align: center; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/number-of-addresses/number-of-addresses.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/number-of-addresses/number-of-addresses.html new file mode 100644 index 00000000..04f56458 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/number-of-addresses/number-of-addresses.html @@ -0,0 +1,16 @@ + +
+
+ + +
+
+
+ + {{ 'wallet.add-addresses.cancel-button' | translate }} + + + {{ 'wallet.add-addresses.create-button' | translate }} + +
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/number-of-addresses/number-of-addresses.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/number-of-addresses/number-of-addresses.spec.ts new file mode 100644 index 00000000..b89ac343 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/number-of-addresses/number-of-addresses.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { NumberOfAddressesComponent } from './number-of-addresses'; + +describe('NumberOfAddressesComponent', () => { + let component: NumberOfAddressesComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ NumberOfAddressesComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(NumberOfAddressesComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/number-of-addresses/number-of-addresses.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/number-of-addresses/number-of-addresses.ts new file mode 100644 index 00000000..6e939612 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/number-of-addresses/number-of-addresses.ts @@ -0,0 +1,62 @@ +import { Component, OnInit, Inject, ViewChild, OnDestroy } from '@angular/core'; +import { FormBuilder, FormGroup, FormControl } from '@angular/forms'; +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { ButtonComponent } from '../../../layout/button/button.component'; +import { MsgBarService } from '../../../../services/msg-bar.service'; + +@Component({ + selector: 'app-number-of-addresses', + templateUrl: './number-of-addresses.html', + styleUrls: ['./number-of-addresses.css'], +}) +export class NumberOfAddressesComponent implements OnInit, OnDestroy { + @ViewChild('button') button: ButtonComponent; + form: FormGroup; + + constructor( + @Inject(MAT_DIALOG_DATA) private data: any, + public dialogRef: MatDialogRef, + private msgBarService: MsgBarService, + ) {} + + ngOnInit() { + this.form = new FormGroup({}); + this.form.addControl('quantity', new FormControl(1, [this.validateQuantity])); + } + + ngOnDestroy() { + this.msgBarService.hide(); + } + + closePopup() { + this.dialogRef.close(); + } + + continue() { + if (this.button.isLoading()) { + return; + } + + this.msgBarService.hide(); + this.button.setLoading(); + + this.data(this.form.value.quantity, (close, endedWithError = false) => { + this.button.resetState(); + if (!endedWithError) { + if (close) { + this.closePopup(); + } + } else { + this.msgBarService.showError('wallet.add-addresses.error'); + } + }); + } + + private validateQuantity(control: FormControl) { + if (control.value < 1 || control.value > 100 || Number(control.value) !== Math.round(Number(control.value))) { + return { invalid: true }; + } + + return null; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/wallet-detail/wallet-detail.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/wallet-detail/wallet-detail.component.html new file mode 100644 index 00000000..c20b7c4c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/wallet-detail/wallet-detail.component.html @@ -0,0 +1,78 @@ +
+ +
+ + + {{ (wallet.isHardware ? 'wallet.new-address' : 'wallet.new-addresses') | translate }} + +
+
+ + {{ 'wallet.' + (wallet.hideEmpty ? 'show' : 'hide') + '-empty' | translate }} + +
+
+
+ {{ 'wallet.delete' | translate }} +
+
+
+ + {{ 'wallet.' + (wallet.encrypted ? 'decrypt' : 'encrypt') | translate }} + +
+
+ + + {{ 'wallet.edit' | translate }} + +
+
+ +
+ +
+
{{ i + 1 }}
+
+ + +

+ {{ address.address }} + + + {{ 'wallet.address.copy' | translate }} + +

+
+ +

+ {{ address.address }} + + {{ 'wallet.address.show' | translate }} + + +

+
+
+
{{ (address.coins ? address.coins.toString() : 0) | amount:true:'first' }}
+
{{ (address.hours ? address.hours.toString() : 0) | amount:false:'first' }}
+
+ more_vert + + + + + + +
+
+
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/wallet-detail/wallet-detail.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/wallet-detail/wallet-detail.component.scss new file mode 100644 index 00000000..52287c2e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/wallet-detail/wallet-detail.component.scss @@ -0,0 +1,252 @@ +@import '../../../../../theme/variables'; + +.-record { + display: flex; + font-size: $font-size-standard; + padding: 21px 20px 16px 20px; + align-items: center; + + &:not(:last-of-type) { + border-bottom: 1px solid rgba(30, 34, 39, 0.05); + } + + .id-column { + width: 50px; + color: $grey; + flex-shrink: 0; + } + + .address-column { + color: $grey; + flex: 1 1 auto; + display: flex; + align-items: center; + + img { + display: inline-block; + height: 17px; + vertical-align: middle; + width: 17px; + margin-right: 10px; + flex-shrink: 0; + } + + p { + display: inline-block; + margin: 0; + vertical-align: middle; + word-break: break-all; + + &:hover .copy-label { + opacity: .999 !important; + } + } + } + + .truncated-address { + max-width: 60px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + display: inline-block; + vertical-align: middle; + } + + .hours-column { + color: $grey; + width: 130px; + text-align: right; + flex-shrink: 0; + } + + .coins-column { + color: $grey-dark; + width: 130px; + text-align: right; + flex-shrink: 0; + } + + .options-column { + width: 80px; + text-align: right; + display: flex; + justify-content: flex-end; + flex-shrink: 0; + + mat-icon { + cursor: pointer; + color: lighten($grey, 30%); + + &:hover { + color: $blue; + } + } + } + + > img { + display: inline-block; + margin-left: 0; + height: $row-detail-size; + width: $row-detail-size; + } +} + +.click-to-copy { + cursor: pointer; +} + +.-actions { + background-color: #fefefe; + border-bottom: 1px solid #eff0f0; + display: flex; + width: 100%; + box-shadow: 0 4px 10px rgba(0, 0, 0, 0.03) !important; + border-top-left-radius: 0 !important; + border-top-right-radius: 0 !important; + z-index: 100; + position: relative; + padding: 0px !important; + + .-button { + padding-right: 20px; + padding-left: 0px; + + &:first-child { + padding-left: 5px; + } + + .-enabled-span { + cursor: pointer; + + &:hover { + color: $grey; + } + } + + span { + color: #CECFD0; + font-size: 12px; + height: 60px; + margin: 0 5px; + cursor: pointer; + display: flex; + align-items: center; + + &.-img::before { + content: ''; + display: inline-block; + height: 32px; + width: 32px; + margin-right: 5px; + background-repeat: no-repeat; + background-size: 32px 32px; + } + + &.-new-address::before { + background-image: url(../../../../../assets/img/plus-grey.png); + } + + &.-hide-empty::before { + background-image: url(../../../../../assets/img/minus-grey.png); + } + + &.-show-empty::before { + background-image: url(../../../../../assets/img/plus-grey.png); + } + + &.-enable-encryption::before { + background-image: url(../../../../../assets/img/lock-grey.png); + } + + &.-disable-encryption::before { + background-image: url(../../../../../assets/img/unlock-grey.png); + } + + &.-edit-wallet::before { + background-image: url(../../../../../assets/img/edit-grey.png); + } + + &.-btn-delete::before { + background-image: url(../../../../../assets/img/delete-grey.png); + } + + &:hover { + color: $grey; + + &.-new-address::before { + background-image: url(../../../../../assets/img/plus-green.png); + } + + &.-hide-empty::before { + background-image: url(../../../../../assets/img/minus-red.png); + } + + &.-show-empty::before { + background-image: url(../../../../../assets/img/plus-green.png); + } + + &.-enable-encryption::before { + background-image: url(../../../../../assets/img/lock-gold.png); + } + + &.-disable-encryption::before { + background-image: url(../../../../../assets/img/unlock-gold.png); + } + + &.-edit-wallet::before { + background-image: url(../../../../../assets/img/edit-blue.png); + } + + &.-btn-delete::before { + background-image: url(../../../../../assets/img/delete-red.png); + } + } + } + } +} + +@keyframes floatup { + 50% { + opacity: 1; + } + + 100% { + transform: translateY(-20px); + opacity: 0; + } +} + +.copy-label { + color: $blue; + opacity: 0; + font-size: 12px; + position: relative; + padding-left: 10px; + + &::after { + content: attr(data-label); + position: absolute; + white-space: nowrap; + top: 0; + left: 4px; + opacity: 0; + line-height: 1; + } +} + +.unconfirmed-label { + opacity: 0.5 !important; +} + +.copying .copy-label::after { + animation: floatup .5s ease-in-out; +} + +mat-spinner { + margin-left: 7px; + margin-right: 12px; + + ::ng-deep circle { + stroke: $grey-light; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/wallet-detail/wallet-detail.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/wallet-detail/wallet-detail.component.spec.ts new file mode 100644 index 00000000..32c805e4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/wallet-detail/wallet-detail.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { WalletDetailComponent } from './wallet-detail.component'; + +describe('WalletDetailComponent', () => { + let component: WalletDetailComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ WalletDetailComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(WalletDetailComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/wallet-detail/wallet-detail.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/wallet-detail/wallet-detail.component.ts new file mode 100644 index 00000000..410b51bb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/wallet-detail/wallet-detail.component.ts @@ -0,0 +1,332 @@ +import { Component, Input, OnDestroy, OnInit } from '@angular/core'; +import { Wallet, ConfirmationData } from '../../../../app.datatypes'; +import { WalletService } from '../../../../services/wallet.service'; +import { MatDialog, MatDialogConfig, MatDialogRef } from '@angular/material/dialog'; +import { ChangeNameComponent, ChangeNameData } from '../change-name/change-name.component'; +import { QrCodeComponent, QrDialogConfig } from '../../../layout/qr-code/qr-code.component'; +import { PasswordDialogComponent } from '../../../layout/password-dialog/password-dialog.component'; +import { getHardwareWalletErrorMsg } from '../../../../utils/errors'; +import { NumberOfAddressesComponent } from '../number-of-addresses/number-of-addresses'; +import { TranslateService } from '@ngx-translate/core'; +import { HwWalletService } from '../../../../services/hw-wallet.service'; +import { Observable } from 'rxjs/Observable'; +import { showConfirmationModal, copyTextToClipboard } from '../../../../utils'; +import { AppConfig } from '../../../../app.config'; +import { Router } from '@angular/router'; +import { HwConfirmAddressDialogComponent, AddressConfirmationParams } from '../../../layout/hardware-wallet/hw-confirm-address-dialog/hw-confirm-address-dialog.component'; +import { MsgBarService } from '../../../../services/msg-bar.service'; +import { ISubscription } from 'rxjs/Subscription'; +import { ApiService } from '../../../../services/api.service'; + +@Component({ + selector: 'app-wallet-detail', + templateUrl: './wallet-detail.component.html', + styleUrls: ['./wallet-detail.component.scss'], +}) +export class WalletDetailComponent implements OnDestroy { + @Input() wallet: Wallet; + + confirmingIndex = null; + creatingAddress = false; + preparingToEdit = false; + + private howManyAddresses: number; + private editSubscription: ISubscription; + private confirmSubscription: ISubscription; + private txHistorySubscription: ISubscription; + + constructor( + private dialog: MatDialog, + private walletService: WalletService, + private msgBarService: MsgBarService, + private hwWalletService: HwWalletService, + private translateService: TranslateService, + private router: Router, + private apiService: ApiService, + ) { } + + ngOnDestroy() { + this.msgBarService.hide(); + if (this.editSubscription) { + this.editSubscription.unsubscribe(); + } + if (this.confirmSubscription) { + this.confirmSubscription.unsubscribe(); + } + if (this.txHistorySubscription) { + this.txHistorySubscription.unsubscribe(); + } + } + + editWallet() { + this.msgBarService.hide(); + + if (this.wallet.isHardware) { + if (this.preparingToEdit) { + return; + } + + this.preparingToEdit = true; + this.editSubscription = this.hwWalletService.checkIfCorrectHwConnected(this.wallet.addresses[0].address) + .flatMap(() => this.walletService.getHwFeaturesAndUpdateData(this.wallet)) + .subscribe( + response => { + this.continueEditWallet(); + this.preparingToEdit = false; + + if (response.walletNameUpdated) { + this.msgBarService.showWarning('hardware-wallet.general.name-updated'); + } + }, + err => { + this.msgBarService.showError(getHardwareWalletErrorMsg(this.translateService, err)); + this.preparingToEdit = false; + }, + ); + } else { + this.continueEditWallet(); + } + } + + newAddress() { + if (this.creatingAddress) { + return; + } + + if (this.wallet.isHardware && this.wallet.addresses.length >= AppConfig.maxHardwareWalletAddresses) { + const confirmationData: ConfirmationData = { + text: 'wallet.max-hardware-wallets-error', + headerText: 'errors.error', + confirmButtonText: 'confirmation.close', + }; + showConfirmationModal(this.dialog, confirmationData); + + return; + } + + this.msgBarService.hide(); + + if (!this.wallet.isHardware) { + const maxAddressesGap = 20; + + const config = new MatDialogConfig(); + config.width = '566px'; + config.data = (howManyAddresses, callback) => { + this.howManyAddresses = howManyAddresses; + + let lastWithBalance = 0; + this.wallet.addresses.forEach((address, i) => { + if (address.coins.isGreaterThan(0)) { + lastWithBalance = i; + } + }); + + if ((this.wallet.addresses.length - (lastWithBalance + 1)) + howManyAddresses < maxAddressesGap) { + callback(true); + this.continueNewAddress(); + } else { + this.txHistorySubscription = this.apiService.getTransactions(this.wallet.addresses).first().subscribe(transactions => { + const AddressesWithTxs = new Map(); + + transactions.forEach(transaction => { + transaction.outputs.forEach(output => { + if (!AddressesWithTxs.has(output.dst)) { + AddressesWithTxs.set(output.dst, true); + } + }); + }); + + let lastWithTxs = 0; + this.wallet.addresses.forEach((address, i) => { + if (AddressesWithTxs.has(address.address)) { + lastWithTxs = i; + } + }); + + if ((this.wallet.addresses.length - (lastWithTxs + 1)) + howManyAddresses < maxAddressesGap) { + callback(true); + this.continueNewAddress(); + } else { + const confirmationData: ConfirmationData = { + text: 'wallet.add-many-confirmation', + headerText: 'confirmation.header-text', + confirmButtonText: 'confirmation.confirm-button', + cancelButtonText: 'confirmation.cancel-button', + }; + + showConfirmationModal(this.dialog, confirmationData).afterClosed().subscribe(confirmationResult => { + if (confirmationResult) { + callback(true); + this.continueNewAddress(); + } else { + callback(false); + } + }); + } + }, () => callback(false, true)); + } + }; + + this.dialog.open(NumberOfAddressesComponent, config); + } else { + this.howManyAddresses = 1; + this.continueNewAddress(); + } + } + + toggleEmpty() { + this.wallet.hideEmpty = !this.wallet.hideEmpty; + } + + deleteWallet() { + this.msgBarService.hide(); + + const confirmationData: ConfirmationData = { + text: this.translateService.instant('wallet.delete-confirmation', {name: this.wallet.label}), + headerText: 'confirmation.header-text', + checkboxText: 'wallet.delete-confirmation-check', + confirmButtonText: 'confirmation.confirm-button', + cancelButtonText: 'confirmation.cancel-button', + }; + + showConfirmationModal(this.dialog, confirmationData).afterClosed().subscribe(confirmationResult => { + if (confirmationResult) { + this.walletService.deleteHardwareWallet(this.wallet).subscribe(result => { + if (result) { + this.walletService.all().first().subscribe(wallets => { + if (wallets.length === 0) { + setTimeout(() => this.router.navigate(['/wizard']), 500); + } + }); + } + }); + } + }); + } + + toggleEncryption() { + const config = new MatDialogConfig(); + config.data = { + confirm: !this.wallet.encrypted, + title: this.wallet.encrypted ? 'wallet.decrypt' : 'wallet.encrypt', + }; + + if (!this.wallet.encrypted) { + config.data['description'] = 'wallet.new.encrypt-warning'; + } else { + config.data['description'] = 'wallet.decrypt-warning'; + config.data['warning'] = true; + config.data['wallet'] = this.wallet; + } + + this.dialog.open(PasswordDialogComponent, config).componentInstance.passwordSubmit + .subscribe(passwordDialog => { + this.walletService.toggleEncryption(this.wallet, passwordDialog.password).subscribe(() => { + passwordDialog.close(); + setTimeout(() => this.msgBarService.showDone('common.changes-made')); + }, e => passwordDialog.error(e)); + }); + } + + confirmAddress(address, addressIndex, showCompleteConfirmation) { + if (this.confirmingIndex !== null) { + return; + } + + this.confirmingIndex = addressIndex; + this.msgBarService.hide(); + + if (this.confirmSubscription) { + this.confirmSubscription.unsubscribe(); + } + + this.confirmSubscription = this.hwWalletService.checkIfCorrectHwConnected(this.wallet.addresses[0].address).subscribe(response => { + const data = new AddressConfirmationParams(); + data.address = address; + data.addressIndex = addressIndex; + data.showCompleteConfirmation = showCompleteConfirmation; + + const config = new MatDialogConfig(); + config.width = '566px'; + config.autoFocus = false; + config.data = data; + this.dialog.open(HwConfirmAddressDialogComponent, config); + + this.confirmingIndex = null; + }, err => { + this.msgBarService.showError(getHardwareWalletErrorMsg(this.translateService, err)); + this.confirmingIndex = null; + }); + } + + copyAddress(event, address, duration = 500) { + event.stopPropagation(); + + if (address.copying) { + return; + } + + copyTextToClipboard(address.address); + address.copying = true; + + setTimeout(function() { + address.copying = false; + }, duration); + } + + showQrCode(event, address: string) { + event.stopPropagation(); + + const config: QrDialogConfig = { address }; + QrCodeComponent.openDialog(this.dialog, config); + } + + private continueNewAddress() { + this.creatingAddress = true; + + if (!this.wallet.isHardware && this.wallet.encrypted) { + const config = new MatDialogConfig(); + config.data = { + wallet: this.wallet, + }; + + const dialogRef = this.dialog.open(PasswordDialogComponent, config); + dialogRef.afterClosed().subscribe(() => this.creatingAddress = false); + dialogRef.componentInstance.passwordSubmit + .subscribe(passwordDialog => { + this.walletService.addAddress(this.wallet, this.howManyAddresses, passwordDialog.password) + .subscribe(() => passwordDialog.close(), error => passwordDialog.error(error)); + }); + } else { + + let procedure: Observable; + + if (this.wallet.isHardware ) { + procedure = this.hwWalletService.checkIfCorrectHwConnected(this.wallet.addresses[0].address).flatMap( + () => this.walletService.addAddress(this.wallet, this.howManyAddresses), + ); + } else { + procedure = this.walletService.addAddress(this.wallet, this.howManyAddresses); + } + + procedure.subscribe(() => this.creatingAddress = false, + err => { + if (!this.wallet.isHardware ) { + this.msgBarService.showError(err); + } else { + this.msgBarService.showError(getHardwareWalletErrorMsg(this.translateService, err)); + } + this.creatingAddress = false; + }, + ); + } + } + + private continueEditWallet() { + const config = new MatDialogConfig(); + config.width = '566px'; + config.data = new ChangeNameData(); + (config.data as ChangeNameData).wallet = this.wallet; + this.dialog.open(ChangeNameComponent, config); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/wallets.component.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/wallets.component.html new file mode 100644 index 00000000..97277956 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/wallets.component.html @@ -0,0 +1,54 @@ +
+ + +
+
+ +
+
{{ (i === 0 ? 'wallet.hardware-wallet' : 'wallet.wallet') | translate }}
+
+
{{ 'coin' | commonText }}
+
{{ 'hours' | commonText }}
+
+ +
+
+
+
{{ wallet.label }}
+
+ + + +
+
{{ (wallet.coins ? wallet.coins.toString() : 0) | amount:true:'first' }}
+
{{ (wallet.hours ? wallet.hours.toString() : 0) | amount:false:'first' }}
+
+ +
+
+ +
+
+
+
+ +
+ + + +
+
+
diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/wallets.component.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/wallets.component.scss new file mode 100644 index 00000000..c0474d37 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/wallets.component.scss @@ -0,0 +1,125 @@ +@import '../../../../theme/variables'; + +.-width-130 { + width: 130px; + flex-shrink: 0; +} + +.-width-250 { + width: 250px; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + padding-right: 20px; +} + +.-headers { + color: $grey-light; + display: flex; + font-size: 12px; + font-weight: 700; + height: 50px; + line-height: 50px; + padding: 0 130px 0 50px; +} + +.-wallets { + margin: 0 30px; +} + +.-body { + border-radius: 15px; + box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.01), 1px 1px 2px 2px rgba(0, 0, 0, 0.01); + margin: 0; + margin-bottom: 10px; +} + +.-wallet { + background-color: $white; + border-bottom: 1px solid rgba(30, 34, 39, 0.05); + display: flex; + font-size: $font-size-standard; + line-height: 60px; + height: 60px; + padding-left: 20px; + cursor: pointer; + + &:first-child { + border-top-left-radius: 10px; + border-top-right-radius: 10px; + } + + &:last-child { + border-bottom-left-radius: 10px; + border-bottom-right-radius: 10px; + } + + .-label { + color: $grey-dark; + } + + .-hours { + color: $grey; + text-align: right; + } + + .-coins { + color: $grey-dark; + text-align: right; + } + + .-encryption { + padding-left: 20px; + + img { + border-radius: 50%; + background-color: $grey-lightest; + display: inline-block; + height: 38px; + margin: 11px 0; + padding: 3px; + width: 38px; + cursor: pointer; + } + } + + .-expand { + display: flex; + justify-content: flex-end; + align-items: center; + width: 85px; + margin-right: 15px; + flex-shrink: 0; + + img { + width: $row-detail-size; + height: $row-detail-size; + } + } +} + +.-text-right { + text-align: right; +} + +.action-buttons { + margin-bottom: 74px; + padding: 40px 0 40px; + text-align: center; + + button { + background-color: $grey-lightest; + border: none; + box-shadow: none; + color: $grey; + font-size: 13px; + margin: 0 5px; + min-width: 140px; + + img { + height: 28px; + margin-left: -4px; + width: 28px; + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/wallets.component.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/wallets.component.spec.ts new file mode 100644 index 00000000..07abc901 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/wallets.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { WalletsComponent } from './wallets.component'; + +describe('WalletsComponent', () => { + let component: WalletsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ WalletsComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(WalletsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/wallets.component.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/wallets.component.ts new file mode 100644 index 00000000..de2b831a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/components/pages/wallets/wallets.component.ts @@ -0,0 +1,103 @@ +import { Component, OnDestroy, OnInit } from '@angular/core'; +import { WalletService } from '../../../services/wallet.service'; +import { MatDialog, MatDialogConfig } from '@angular/material/dialog'; +import { CreateWalletComponent } from './create-wallet/create-wallet.component'; +import { Wallet, ConfirmationData } from '../../../app.datatypes'; +import { HwOptionsDialogComponent } from '../../layout/hardware-wallet/hw-options-dialog/hw-options-dialog.component'; +import { ISubscription } from 'rxjs/Subscription'; +import { Router } from '@angular/router'; +import { HwWalletService } from '../../../services/hw-wallet.service'; +import { showConfirmationModal } from '../../../utils'; + +@Component({ + selector: 'app-wallets', + templateUrl: './wallets.component.html', + styleUrls: ['./wallets.component.scss'], +}) +export class WalletsComponent implements OnInit, OnDestroy { + + hwCompatibilityActivated = false; + + wallets: Wallet[] = []; + hardwareWallets: Wallet[] = []; + + private subscription: ISubscription; + + constructor( + private walletService: WalletService, + private hwWalletService: HwWalletService, + private dialog: MatDialog, + private router: Router, + ) { + this.hwCompatibilityActivated = this.hwWalletService.hwWalletCompatibilityActivated; + + this.subscription = this.walletService.all().subscribe(wallets => { + this.wallets = []; + this.hardwareWallets = []; + wallets.forEach(value => { + if (!value.isHardware) { + this.wallets.push(value); + } else { + this.hardwareWallets.push(value); + } + }); + }); + } + + ngOnInit(): void { + if (this.hwWalletService.showOptionsWhenPossible) { + setTimeout(() => { + this.hwWalletService.showOptionsWhenPossible = false; + this.adminHwWallet(); + }); + } + } + + ngOnDestroy() { + this.subscription.unsubscribe(); + } + + addWallet(create) { + const config = new MatDialogConfig(); + config.width = '566px'; + config.data = { create }; + this.dialog.open(CreateWalletComponent, config); + } + + adminHwWallet() { + const config = new MatDialogConfig(); + config.width = '566px'; + config.autoFocus = false; + this.dialog.open(HwOptionsDialogComponent, config).afterClosed().subscribe(() => { + this.walletService.all().first().subscribe(wallets => { + if (wallets.length === 0) { + setTimeout(() => this.router.navigate(['/wizard']), 500); + } + }); + }); + } + + toggleWallet(wallet: Wallet) { + if (wallet.isHardware && wallet.hasHwSecurityWarnings && !wallet.stopShowingHwSecurityPopup && !wallet.opened) { + const confirmationData: ConfirmationData = { + headerText: 'hardware-wallet.security-warning.title', + text: 'hardware-wallet.security-warning.text', + checkboxText: 'hardware-wallet.security-warning.check', + confirmButtonText: 'hardware-wallet.security-warning.continue', + cancelButtonText: 'hardware-wallet.security-warning.cancel', + linkText: 'hardware-wallet.security-warning.link', + linkFunction: this.adminHwWallet.bind(this), + }; + + showConfirmationModal(this.dialog, confirmationData).afterClosed().subscribe(confirmationResult => { + if (confirmationResult) { + wallet.stopShowingHwSecurityPopup = true; + this.walletService.saveHardwareWallets(); + wallet.opened = true; + } + }); + } else { + wallet.opened = !wallet.opened; + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/directives/dontsavepassword.directive.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/directives/dontsavepassword.directive.spec.ts new file mode 100644 index 00000000..e79cd8ae --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/directives/dontsavepassword.directive.spec.ts @@ -0,0 +1,8 @@ +import { DontsavepasswordDirective } from './dontsavepassword.directive'; + +describe('DontsavepasswordDirective', () => { + it('should create an instance', () => { + const directive = new DontsavepasswordDirective(null); + expect(directive).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/directives/dontsavepassword.directive.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/directives/dontsavepassword.directive.ts new file mode 100644 index 00000000..3fc58807 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/directives/dontsavepassword.directive.ts @@ -0,0 +1,17 @@ +import { Directive, ElementRef, HostListener } from '@angular/core'; + +@Directive({ + selector: '[appDontSavePassword]', +}) +export class DontsavepasswordDirective { + constructor( + private el: ElementRef, + ) { + el.nativeElement.autocomplete = 'new-password'; + el.nativeElement.readOnly = true; + } + + @HostListener('focus') onFocus() { + this.el.nativeElement.readOnly = false; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/amount.pipe.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/amount.pipe.spec.ts new file mode 100644 index 00000000..c03aa55c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/amount.pipe.spec.ts @@ -0,0 +1,8 @@ +import { AmountPipe } from './amount.pipe'; + +describe('AmountPipe', () => { + it('create an instance', () => { + const pipe = new AmountPipe(null, null, null); + expect(pipe).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/amount.pipe.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/amount.pipe.ts new file mode 100644 index 00000000..89d8ae2d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/amount.pipe.ts @@ -0,0 +1,35 @@ +import { Pipe, PipeTransform } from '@angular/core'; +import { DecimalPipe } from '@angular/common'; +import { BlockchainService } from '../services/blockchain.service'; +import { AppService } from '../services/app.service'; + +@Pipe({ + name: 'amount', + pure: false, +}) +export class AmountPipe implements PipeTransform { + + constructor( + private decimalPipe: DecimalPipe, + private blockchainService: BlockchainService, + private appService: AppService, + ) { } + + transform(value: any, showingCoins = true, partToReturn = '') { + let firstPart: string; + let response = ''; + + if (partToReturn !== 'last') { + firstPart = this.decimalPipe.transform(value, showingCoins ? ('1.0-' + this.blockchainService.currentMaxDecimals) : '1.0-0'); + response = firstPart; + if (partToReturn !== 'first') { + response += ' '; + } + } + if (partToReturn !== 'first') { + response += showingCoins ? this.appService.coinName : (Number(value) === 1 || Number(value) === -1 ? this.appService.hoursNameSingular : this.appService.hoursName); + } + + return response; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/common-text.pipe.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/common-text.pipe.spec.ts new file mode 100644 index 00000000..e4ee5fa7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/common-text.pipe.spec.ts @@ -0,0 +1,8 @@ +import { CommonTextPipe } from './common-text.pipe'; + +describe('CommonTextPipe', () => { + it('create an instance', () => { + const pipe = new CommonTextPipe(null); + expect(pipe).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/common-text.pipe.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/common-text.pipe.ts new file mode 100644 index 00000000..8ac5f195 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/common-text.pipe.ts @@ -0,0 +1,25 @@ +import { Pipe, PipeTransform } from '@angular/core'; +import { AppService } from '../services/app.service'; + +@Pipe({ + name: 'commonText', + pure: false, +}) +export class CommonTextPipe implements PipeTransform { + + constructor( + private appService: AppService, + ) { } + + transform(value: any) { + if (value === 'hours') { + return this.appService.hoursName; + } else if (value === 'coin') { + return this.appService.coinName; + } else if (value === 'coinFull') { + return this.appService.fullCoinName; + } + + return ''; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/date-from-now.pipe.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/date-from-now.pipe.spec.ts new file mode 100644 index 00000000..39de2012 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/date-from-now.pipe.spec.ts @@ -0,0 +1,8 @@ +import { DateFromNowPipe } from './date-from-now.pipe'; + +describe('DateFromNowPipe', () => { + it('create an instance', () => { + const pipe = new DateFromNowPipe(null); + expect(pipe).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/date-from-now.pipe.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/date-from-now.pipe.ts new file mode 100644 index 00000000..bc7ac503 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/date-from-now.pipe.ts @@ -0,0 +1,33 @@ +import { Pipe, PipeTransform } from '@angular/core'; +import * as moment from 'moment'; +import { TranslateService } from '@ngx-translate/core'; + +@Pipe({ + name: 'dateFromNow', + pure: false, +}) +export class DateFromNowPipe implements PipeTransform { + constructor( + public translateService: TranslateService, + ) { } + + transform(value: any) { + const diff: number = moment().unix() - value; + + if (diff < 60) { + return this.translateService.instant('time-from-now.few-seconds'); + } else if (diff < 120) { + return this.translateService.instant('time-from-now.minute'); + } else if (diff < 3600) { + return this.translateService.instant('time-from-now.minutes', { time: Math.floor(diff / 60) }); + } else if (diff < 7200) { + return this.translateService.instant('time-from-now.hour'); + } else if (diff < 86400) { + return this.translateService.instant('time-from-now.hours', { time: Math.floor(diff / 3600) }); + } else if (diff < 172800) { + return this.translateService.instant('time-from-now.day'); + } + + return this.translateService.instant('time-from-now.days', { time: Math.floor(diff / 86400) }); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/date-time.pipe.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/date-time.pipe.spec.ts new file mode 100644 index 00000000..f43d9e8f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/date-time.pipe.spec.ts @@ -0,0 +1,8 @@ +import { DateTimePipe } from './date-time.pipe'; + +describe('DateTimePipe', () => { + it('create an instance', () => { + const pipe = new DateTimePipe(); + expect(pipe).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/date-time.pipe.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/date-time.pipe.ts new file mode 100644 index 00000000..2c2b355a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/date-time.pipe.ts @@ -0,0 +1,11 @@ +import { Pipe, PipeTransform } from '@angular/core'; +import * as moment from 'moment'; + +@Pipe({ + name: 'dateTime', +}) +export class DateTimePipe implements PipeTransform { + transform(value: any) { + return moment.unix(value).format('YYYY-MM-DD HH:mm'); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/teller-status.pipe.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/teller-status.pipe.spec.ts new file mode 100644 index 00000000..081e158c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/teller-status.pipe.spec.ts @@ -0,0 +1,8 @@ +import { TellerStatusPipe } from './teller-status.pipe'; + +describe('TellerStatusPipe', () => { + it('create an instance', () => { + const pipe = new TellerStatusPipe(); + expect(pipe).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/teller-status.pipe.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/teller-status.pipe.ts new file mode 100644 index 00000000..27bcfdb8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/pipes/teller-status.pipe.ts @@ -0,0 +1,14 @@ +import { Pipe, PipeTransform } from '@angular/core'; + +@Pipe({ + name: 'tellerStatus', +}) +export class TellerStatusPipe implements PipeTransform { + private statuses = ['done', 'waiting_confirm', 'waiting_deposit', 'waiting_send']; + + transform(value: any): any { + return this.statuses.find(status => status === value) + ? 'teller.' + value.replace('_', '-') + : 'teller.unknown'; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/api.service.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/api.service.spec.ts new file mode 100644 index 00000000..9d17c0fb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/api.service.spec.ts @@ -0,0 +1,15 @@ +import { TestBed, inject } from '@angular/core/testing'; + +import { ApiService } from './api.service'; + +describe('ApiService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [ApiService], + }); + }); + + it('should be created', inject([ApiService], (service: ApiService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/api.service.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/api.service.ts new file mode 100644 index 00000000..59928d9c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/api.service.ts @@ -0,0 +1,221 @@ +import { Injectable } from '@angular/core'; +import { Http, RequestOptions, Headers } from '@angular/http'; +import { Observable } from 'rxjs/Observable'; +import { environment } from '../../environments/environment'; +import 'rxjs/add/observable/throw'; +import 'rxjs/add/operator/catch'; +import 'rxjs/add/operator/map'; +import { TranslateService } from '@ngx-translate/core'; +import { BigNumber } from 'bignumber.js'; + +import { + Address, GetWalletsResponseEntry, GetWalletsResponseWallet, NormalTransaction, + PostWalletNewAddressResponse, Version, Wallet, +} from '../app.datatypes'; + +@Injectable() +export class ApiService { + private url = environment.nodeUrl; + + constructor( + private http: Http, + private translate: TranslateService, + ) { } + + getTransactions(addresses: Address[]): Observable { + const formattedAddresses = addresses.map(a => a.address).join(','); + + return this.post('transactions', {addrs: formattedAddresses, verbose: true}) + .map(transactions => transactions.map(transaction => ({ + addresses: [], + balance: new BigNumber(0), + block: transaction.status.block_seq, + confirmed: transaction.status.confirmed, + timestamp: transaction.txn.timestamp, + txid: transaction.txn.txid, + inputs: transaction.txn.inputs, + outputs: transaction.txn.outputs, + }))); + } + + getVersion(): Observable { + return this.get('version'); + } + + generateSeed(entropy: number = 128): Observable { + return this.get('wallet/newSeed', { entropy }).map(response => response.seed); + } + + getHealth() { + return this.get('health'); + } + + getWallets(): Observable { + return this.get('wallets') + .map((response: GetWalletsResponseWallet[]) => { + const wallets: Wallet[] = []; + response.forEach(wallet => { + const processedWallet: Wallet = { + label: wallet.meta.label, + filename: wallet.meta.filename, + coins: null, + hours: null, + addresses: [], + encrypted: wallet.meta.encrypted, + }; + + if (wallet.entries) { + processedWallet.addresses = wallet.entries.map((entry: GetWalletsResponseEntry) => { + return { + address: entry.address, + coins: null, + hours: null, + confirmed: true, + }; + }); + } + + wallets.push(processedWallet); + }); + + return wallets; + }); + } + + getWalletSeed(wallet: Wallet, password: string): Observable { + return this.post('wallet/seed', { id: wallet.filename, password }) + .map(response => response.seed); + } + + postWalletCreate(label: string, seed: string, scan: number, password: string, type: string): Observable { + const params = { label, seed, scan, type }; + + if (password) { + params['password'] = password; + params['encrypt'] = true; + } + + return this.post('wallet/create', params) + .map(response => ({ + label: response.meta.label, + filename: response.meta.filename, + coins: null, + hours: null, + addresses: response.entries.map(entry => ({ address: entry.address, coins: null, hours: null, confirmed: true })), + encrypted: response.meta.encrypted, + })); + } + + postWalletNewAddress(wallet: Wallet, num: number, password?: string): Observable { + const params = new Object(); + params['id'] = wallet.filename; + params['num'] = num; + if (password) { + params['password'] = password; + } + + return this.post('wallet/newAddress', params) + .map((response: PostWalletNewAddressResponse) => { + const result: Address[] = []; + response.addresses.forEach(value => { + result.push({ address: value, coins: null, hours: null }); + }); + + return result; + }); + } + + postWalletToggleEncryption(wallet: Wallet, password: string) { + return this.post('wallet/' + (wallet.encrypted ? 'decrypt' : 'encrypt'), { id: wallet.filename, password }); + } + + get(url, params = null, options: any = {}, useV2 = false) { + return this.http.get(this.getUrl(url, params, useV2), this.returnRequestOptions(options)) + .map((res: any) => res.json()) + .catch((error: any) => this.processConnectionError(error)); + } + + getCsrf() { + return this.get('csrf').map(response => response.csrf_token); + } + + post(url, params = {}, options: any = {}, useV2 = false) { + return this.getCsrf().first().flatMap(csrf => { + options.csrf = csrf; + + if (useV2) { + options.json = true; + } + + return this.http.post( + this.getUrl(url, null, useV2), + options.json || useV2 ? JSON.stringify(params) : this.getQueryString(params), + this.returnRequestOptions(options), + ) + .map((res: any) => res.json()) + .catch((error: any) => this.processConnectionError(error)); + }); + } + + returnRequestOptions(additionalOptions) { + const options = new RequestOptions(); + + options.headers = this.getHeaders(additionalOptions); + + if (additionalOptions.csrf) { + options.headers.append('X-CSRF-Token', additionalOptions.csrf); + } + + return options; + } + + private getHeaders(options) { + const headers = new Headers(); + headers.append('Content-Type', options.json ? 'application/json' : 'application/x-www-form-urlencoded'); + + return headers; + } + + private getQueryString(parameters = null) { + if (!parameters) { + return ''; + } + + return Object.keys(parameters).reduce((array, key) => { + array.push(key + '=' + encodeURIComponent(parameters[key])); + + return array; + }, []).join('&'); + } + + private getUrl(url, options = null, useV2 = false) { + if ((url as string).startsWith('/')) { + url = (url as string).substr(1, (url as string).length - 1); + } + + return this.url + (useV2 ? 'v2/' : 'v1/') + url + '?' + this.getQueryString(options); + } + + processConnectionError(error: any, connectingToHwWalletDaemon = false): Observable { + if (error) { + if (typeof error['_body'] === 'string') { + + return Observable.throw(error); + } + + if (error.error && typeof error.error === 'string') { + error['_body'] = error.error; + + return Observable.throw(error); + } else if (error.message) { + error['_body'] = error.message; + + return Observable.throw(error); + } + } + const err = Error(this.translate.instant(connectingToHwWalletDaemon ? 'hardware-wallet.errors.daemon-connection' : 'service.api.server-error')); + err['_body'] = err.message; + + return Observable.throw(err); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/app.service.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/app.service.spec.ts new file mode 100644 index 00000000..a7ce783a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/app.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed, inject } from '@angular/core/testing'; + +import { AppService } from './app.service'; +import { Http } from '@angular/http'; + +describe('AppService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [AppService, Http], + }); + }); + + it('should be created', inject([AppService], (service: AppService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/app.service.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/app.service.ts new file mode 100644 index 00000000..7eb5ca00 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/app.service.ts @@ -0,0 +1,76 @@ +import { Injectable } from '@angular/core'; +import { ApiService } from './api.service'; +import { Version } from '../app.datatypes'; +import BigNumber from 'bignumber.js'; +import { Http, Response } from '@angular/http'; +import { shouldUpgradeVersion } from '../utils/semver'; +import { AppConfig } from '../app.config'; + +@Injectable() +export class AppService { + error: number; + version: Version; + fullCoinName = ' '; + coinName = ' '; + hoursName = ' '; + hoursNameSingular = ' '; + explorerUrl = ' '; + + get burnRate() { + return this.burnRateInternal; + } + private burnRateInternal = new BigNumber(0.5); + + get updateAvailable(): boolean { + return this.updateAvailableInternal; + } + private updateAvailableInternal = false; + + get lastestVersion(): string { + return this.lastestVersionInternal; + } + private lastestVersionInternal = ''; + + constructor( + private apiService: ApiService, + private http: Http, + ) {} + + testBackend() { + this.apiService.get('health').subscribe(response => { + this.version = response.version; + this.detectUpdateAvailable(); + this.burnRateInternal = new BigNumber(response.user_verify_transaction.burn_factor); + + this.fullCoinName = response.fiber.display_name; + this.coinName = response.fiber.ticker; + this.hoursName = response.fiber.coin_hours_display_name; + this.hoursNameSingular = response.fiber.coin_hours_display_name_singular; + this.explorerUrl = response.fiber.explorer_url; + + if (this.explorerUrl.endsWith('/')) { + this.explorerUrl = this.explorerUrl.substr(0, this.explorerUrl.length - 1); + } + + if (!response.csrf_enabled) { + this.error = 3; + } + }, + () => this.error = 2, + ); + } + + private detectUpdateAvailable() { + if (AppConfig.urlForVersionChecking) { + this.http.get(AppConfig.urlForVersionChecking) + .retryWhen(errors => errors.delay(30000)) + .subscribe((response: Response) => { + this.lastestVersionInternal = response.text().trim(); + if (this.lastestVersionInternal.startsWith('v')) { + this.lastestVersionInternal = this.lastestVersionInternal.substr(1); + } + this.updateAvailableInternal = shouldUpgradeVersion(this.version.version, this.lastestVersionInternal); + }); + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/bip39-word-list.service.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/bip39-word-list.service.ts new file mode 100644 index 00000000..f677861c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/bip39-word-list.service.ts @@ -0,0 +1,48 @@ +import { Subject } from 'rxjs/Subject'; +import { Observable } from 'rxjs/Observable'; +import 'rxjs/add/operator/debounceTime'; + +export class Bip39WordListService { + + get searchResults(): Observable { + return this.searchResultsSubject.asObservable().debounceTime(100).map(searchTerm => { + if (searchTerm.length > 1) { + return this.wordList.filter(option => option.startsWith(searchTerm)); + } else { + return []; + } + }); + } + + private lastSearchTerm = ''; + private searchResultsSubject: Subject = new Subject(); + private wordList: string[] = []; + private wordMap: Map = new Map(); + + constructor() { + System.import(`../../assets/bip39-word-list.json`).then (result => { + this.wordList = result.list; + this.wordList.forEach(word => { + this.wordMap.set(word, true); + }); + this.searchResultsSubject.next(this.lastSearchTerm); + }); + } + + setSearchTerm(value: string) { + this.lastSearchTerm = value; + this.searchResultsSubject.next(value); + } + + validateWord(word: string): boolean | null { + if (this.wordList.length > 0) { + if (!this.wordMap.has(word)) { + return false; + } + + return true; + } else { + return null; + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/blockchain.service.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/blockchain.service.spec.ts new file mode 100644 index 00000000..12065ef9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/blockchain.service.spec.ts @@ -0,0 +1,15 @@ +import { TestBed, inject } from '@angular/core/testing'; + +import { BlockchainService } from './blockchain.service'; + +describe('BlockchainService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [BlockchainService], + }); + }); + + it('should be created', inject([BlockchainService], (service: BlockchainService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/blockchain.service.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/blockchain.service.ts new file mode 100644 index 00000000..c176b96e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/blockchain.service.ts @@ -0,0 +1,83 @@ +import { Injectable, NgZone } from '@angular/core'; +import { ApiService } from './api.service'; +import { Observable } from 'rxjs/Observable'; +import { BehaviorSubject } from 'rxjs/BehaviorSubject'; +import { WalletService } from './wallet.service'; +import 'rxjs/add/observable/timer'; +import 'rxjs/add/operator/retryWhen'; +import 'rxjs/add/operator/concat'; +import 'rxjs/add/operator/exhaustMap'; + +@Injectable() +export class BlockchainService { + private progressSubject: BehaviorSubject = new BehaviorSubject(null); + private synchronizedSubject: BehaviorSubject = new BehaviorSubject(false); + private refreshedBalance = false; + private lastCurrentBlock = 0; + private lastHighestBlock = 0; + private maxDecimals = 6; + + get progress() { + return this.progressSubject.asObservable(); + } + + get currentMaxDecimals(): number { + return this.maxDecimals; + } + + get synchronized() { + return this.synchronizedSubject.asObservable(); + } + + constructor( + private apiService: ApiService, + private walletService: WalletService, + private ngZone: NgZone, + ) { + this.apiService.get('health').retryWhen(errors => errors.delay(1000).take(10).concat(Observable.throw(''))) + .subscribe ((response: any) => this.maxDecimals = response.user_verify_transaction.max_decimals); + + this.ngZone.runOutsideAngular(() => { + Observable.timer(0, 2000) + .exhaustMap(() => this.getBlockchainProgress()) + .retryWhen(errors => errors.delay(2000)) + .subscribe( + response => this.ngZone.run(() => { + if (!response.current || !response.highest || response.current < this.lastCurrentBlock || response.highest < this.lastHighestBlock) { + return; + } + + this.lastCurrentBlock = response.current; + this.lastHighestBlock = response.highest; + + this.progressSubject.next(response); + + if (!this.refreshedBalance) { + this.walletService.refreshBalances(); + this.refreshedBalance = true; + } + + if (response.current === response.highest && !this.synchronizedSubject.value) { + this.synchronizedSubject.next(true); + this.walletService.refreshBalances(); + } else if (response.current !== response.highest && this.synchronizedSubject.value) { + this.synchronizedSubject.next(false); + } + }), + error => console.log(error), + ); + }); + } + + lastBlock() { + return this.apiService.get('last_blocks', { num: 1 }).map(blocks => blocks.blocks[0]); + } + + getBlockchainProgress() { + return this.apiService.get('blockchain/progress'); + } + + coinSupply() { + return this.apiService.get('coinSupply'); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/exchange.service.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/exchange.service.spec.ts new file mode 100644 index 00000000..1ecf3b76 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/exchange.service.spec.ts @@ -0,0 +1,15 @@ +import { TestBed, inject } from '@angular/core/testing'; + +import { ExchangeService } from './exchange.service'; + +describe('SwaplabService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [ExchangeService], + }); + }); + + it('should be created', inject([ExchangeService], (service: ExchangeService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/exchange.service.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/exchange.service.ts new file mode 100644 index 00000000..8a5cfa27 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/exchange.service.ts @@ -0,0 +1,151 @@ +import { Injectable } from '@angular/core'; +import { HttpClient, HttpHeaders, HttpErrorResponse } from '@angular/common/http'; +import { Observable } from 'rxjs/Observable'; +import { + ExchangeOrder, + StoredExchangeOrder, + TradingPair, +} from '../app.datatypes'; +import { StorageService, StorageType } from './storage.service'; +import * as moment from 'moment'; +import 'rxjs/add/operator/repeatWhen'; +import { BehaviorSubject } from 'rxjs/BehaviorSubject'; +import { ISubscription } from 'rxjs/Subscription'; +import { ApiService } from './api.service'; +import { environment } from '../../environments/environment'; + +@Injectable() +export class ExchangeService { + private readonly API_ENDPOINT = 'https://swaplab.cc/api/v3'; + private readonly STORAGE_KEY = 'exchange-orders'; + private readonly LAST_VIEWED_STORAGE_KEY = 'last-viewed-order'; + private readonly API_KEY = environment.swaplab.apiKey; + private readonly TEST_MODE = environment.swaplab.activateTestMode; + + lastViewedOrderLoaded: BehaviorSubject = new BehaviorSubject(false); + + private saveLastViewedSubscription: ISubscription; + private _lastViewedOrder: StoredExchangeOrder; + + set lastViewedOrder(order) { + this._lastViewedOrder = order; + + if (this.saveLastViewedSubscription) { + this.saveLastViewedSubscription.unsubscribe(); + } + this.saveLastViewedSubscription = this.storageService.store(StorageType.CLIENT, this.LAST_VIEWED_STORAGE_KEY, JSON.stringify(order)).subscribe(); + } + + get lastViewedOrder() { + return this._lastViewedOrder; + } + + constructor( + private http: HttpClient, + private storageService: StorageService, + private apiService: ApiService, + ) { + storageService.get(StorageType.CLIENT, this.LAST_VIEWED_STORAGE_KEY).subscribe(result => { + this.lastViewedOrder = JSON.parse(result.data); + this.lastViewedOrderLoaded.next(true); + }, () => { + this.lastViewedOrderLoaded.next(true); + }); + } + + tradingPairs(): Observable { + return this.post('trading_pairs').map(data => data.result); + } + + exchange(pair: string, fromAmount: number, toAddress: string, price: number): Observable { + let response: ExchangeOrder; + + return this.post('orders', { pair, fromAmount, toAddress }) + .flatMap(data => { + response = data.result; + + return this.storeOrder(response, price); + }).map(() => response); + } + + status(id: string, devForceState?: string): Observable { + if (this.TEST_MODE && !devForceState) { + devForceState = 'user_waiting'; + } + + return this.post('orders/status', { id }, this.TEST_MODE ? { status: devForceState } : null) + .retryWhen((err) => { + return err.flatMap(response => { + if (response instanceof HttpErrorResponse && response.status === 404) { + return Observable.throw(response); + } + + return Observable.of(response); + }).delay(3000); + }).map(data => data.result); + } + + history() { + return this.storageService.get(StorageType.CLIENT, this.STORAGE_KEY) + .map((res) => JSON.parse(res.data)); + } + + isOrderFinished(order: ExchangeOrder) { + return ['complete', 'error', 'user_deposit_timeout'].indexOf(order.status) > -1; + } + + private post(url: string, body?: any, headers?: any): Observable { + return this.http.post(this.buildUrl(url), body, { + responseType: 'json', + headers: new HttpHeaders({ + 'api-key': this.API_KEY, + 'Accept': 'application/json', + ...headers, + }), + }).catch((error: any) => this.apiService.processConnectionError(error)); + } + + private buildUrl(url: string) { + if (!this.TEST_MODE || url === 'trading_pairs') { + return `${this.API_ENDPOINT}/${url}`; + } + + return `${this.API_ENDPOINT}sandbox/${url}`; + } + + private storeOrder(order: ExchangeOrder, price: number) { + return this.history() + .catch(err => { + try { + if (err['_body']) { + const errorBody = JSON.parse(err['_body']); + if (errorBody && errorBody.error && errorBody.error.code === 404) { + return Observable.of([]); + } + } + } catch (e) {} + + return Observable.throw(err); + }) + .flatMap((oldOrders: StoredExchangeOrder[]) => this.storeOrderEntry(oldOrders, order, price)); + } + + private storeOrderEntry(orders: StoredExchangeOrder[], order: ExchangeOrder, price: number): Observable { + const newOrder = { + id: order.id, + pair: order.pair, + fromAmount: order.fromAmount, + toAmount: order.toAmount, + address: order.toAddress, + timestamp: moment().unix(), + price: price, + }; + + orders.push(newOrder); + const data = JSON.stringify(orders); + orders.pop(); + + return this.storageService.store(StorageType.CLIENT, this.STORAGE_KEY, data) + .do(() => orders.push(newOrder)); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/hw-wallet-daemon-tests.service.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/hw-wallet-daemon-tests.service.ts new file mode 100644 index 00000000..e5c320b3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/hw-wallet-daemon-tests.service.ts @@ -0,0 +1,254 @@ +// This is a version of HwWalletDaemonService that uses a queue to ensure that +// only one operation is carried out at a time. It may be good for testing in +// some circunstances as it allow to see the exact request order without having +// to worry about racing conditions, but to use it in production it needs more +// testing, to be sure that to be sure that the queue is not going to get stuck +// because of some error. This testing has to be done after solving the problems +// that make the firmware respond extremely slow after some calls. + +/* +import { Injectable, NgZone } from '@angular/core'; +import { ApiService } from './api.service'; +import { Http, RequestOptions, Headers } from '@angular/http'; +import { Observable } from 'rxjs/Observable'; +import { HwWalletPinService } from './hw-wallet-pin.service'; +import { HwWalletSeedWordService } from './hw-wallet-seed-word.service'; +import { ISubscription } from 'rxjs/Subscription'; +import { BehaviorSubject } from 'rxjs/BehaviorSubject'; +import 'rxjs/add/operator/timeout'; +import { Subject } from 'rxjs/Subject'; + +@Injectable() +export class HwWalletDaemonService { + + public static readonly errorCancelled = 'Cancelled'; + public static readonly errorConnectingWithTheDaemon = 'Error connecting with the hw wallet service'; + public static readonly errorTimeout = 'The operation was canceled due to inactivity'; + private readonly url = 'http://127.0.0.1:9510/api/v1'; + + private checkHwSubscription: ISubscription; + private hwConnected = false; + private connectionEventSubject = new BehaviorSubject(false); + private waiting = false; + private busy = false; + private queueDelay = 32; + private requestQueue: { + operation: Observable + subject: Subject; + }[] = []; + + get connectionEvent() { + return this.connectionEventSubject.asObservable(); + } + + constructor( + private http: Http, + private apiService: ApiService, + private hwWalletPinService: HwWalletPinService, + private hwWalletSeedWordService: HwWalletSeedWordService, + private ngZone: NgZone, + ) { } + + get(route: string) { + const trigger = new Subject(); + this.requestQueue.push({ + subject: trigger, + operation: trigger.flatMap(() => this.checkResponse(this.http.get( + this.url + route, + this.returnRequestOptions(), + ), route.includes('/available'))), + }); + + setTimeout(() => this.tryToRunNextRequest(), this.queueDelay); + + return this.requestQueue[this.requestQueue.length - 1].operation; + } + + post(route: string, params = {}) { + const trigger = new Subject(); + this.requestQueue.push({ + subject: trigger, + operation: trigger.flatMap(() => this.checkResponse(this.http.post( + this.url + route, + JSON.stringify(params), + this.returnRequestOptions(), + ))), + }); + + setTimeout(() => this.tryToRunNextRequest(), this.queueDelay); + + return this.requestQueue[this.requestQueue.length - 1].operation; + } + + put(route: string, params: any = null, sendMultipartFormData = false, smallTimeout = false) { + const trigger = new Subject(); + this.requestQueue.push({ + subject: trigger, + operation: trigger.flatMap(() => this.checkResponse(this.http.put( + this.url + route, + params, + this.returnRequestOptions(sendMultipartFormData), + ), false, smallTimeout)), + }); + + setTimeout(() => this.tryToRunNextRequest(), this.queueDelay); + + return this.requestQueue[this.requestQueue.length - 1].operation; + } + + delete(route: string) { + const trigger = new Subject(); + this.requestQueue.push({ + subject: trigger, + operation: trigger.flatMap(() => this.checkResponse(this.http.delete( + this.url + route, + this.returnRequestOptions(), + ))), + }); + + setTimeout(() => this.tryToRunNextRequest(), this.queueDelay); + + return this.requestQueue[this.requestQueue.length - 1].operation; + } + + private tryToRunNextRequest() { + if (!this.busy) { + if (this.requestQueue.length > 0) { + this.runNextRequest(); + } + } + } + + private runNextRequest() { + this.prepareToStart(); + this.requestQueue[0].subject.next(1); + this.requestQueue[0].subject.complete(); + } + + private prepareToStart() { + if (this.busy) { + throw new Error('The service is busy.'); + } + this.busy = true; + } + + private checkResponse(response: Observable, checkingConnected = false, smallTimeout = false) { + return response + .timeout(smallTimeout ? 30000 : 50000) + .flatMap((res: any) => { + if (!this.waiting) { + this.waiting = true; + setTimeout(() => { + this.waiting = false; + this.busy = false; + this.requestQueue.shift(); + this.tryToRunNextRequest(); + }, this.queueDelay); + } + + const finalResponse = res.json(); + + if (checkingConnected) { + this.ngZone.run(() => this.updateHwConnected(!!finalResponse.data)); + } else { + this.updateHwConnected(true); + } + + if (typeof finalResponse.data === 'string' && (finalResponse.data as string).indexOf('PinMatrixRequest') !== -1) { + return this.hwWalletPinService.requestPin().flatMap(pin => { + if (!pin) { + return this.put('/cancel').map(() => HwWalletDaemonService.errorCancelled); + } + + return this.post('/intermediate/pin_matrix', {pin: pin}); + }); + } + + if (typeof finalResponse.data === 'string' && (finalResponse.data as string).indexOf('WordRequest') !== -1) { + return this.hwWalletSeedWordService.requestWord().flatMap(word => { + if (!word) { + return this.put('/cancel').map(() => HwWalletDaemonService.errorCancelled); + } + + return this.post('/intermediate/word', {word: word}); + }); + } + + return Observable.of(finalResponse); + }) + .catch((error: any) => { + if (!this.waiting) { + this.waiting = true; + setTimeout(() => { + this.waiting = false; + this.busy = false; + this.requestQueue.shift(); + this.tryToRunNextRequest(); + }, this.queueDelay); + } + + if (error && error.name && error.name === 'TimeoutError') { + this.put('/cancel').subscribe(); + + return Observable.throw({_body: HwWalletDaemonService.errorTimeout }); + } + + if (error && error._body) { + let errorContent: string; + + if (error._body.error) { + errorContent = error._body.error; + } else { + try { + errorContent = JSON.parse(error._body).error; + } catch (e) {} + } + + if (errorContent) { + return this.apiService.processConnectionError(error, true); + } + } + + return Observable.throw({_body: HwWalletDaemonService.errorConnectingWithTheDaemon }); + }); + } + + private returnRequestOptions(sendMultipartFormData = false) { + const options = new RequestOptions(); + options.headers = new Headers(); + if (!sendMultipartFormData) { + options.headers.append('Content-Type', 'application/json'); + } + + return options; + } + + checkHw(wait: boolean) { + if (this.checkHwSubscription) { + this.checkHwSubscription.unsubscribe(); + } + + this.ngZone.runOutsideAngular(() => { + this.checkHwSubscription = Observable.of(1) + .delay(wait ? (this.hwConnected ? 2000 : 10000) : 0) + .flatMap(() => this.get('/available')) + .subscribe( + null, + () => this.ngZone.run(() => this.updateHwConnected(false)), + ); + }); + } + + private updateHwConnected(connected: boolean) { + if (connected && !this.hwConnected) { + this.hwConnected = true; + this.connectionEventSubject.next(this.hwConnected); + } else if (!connected && this.hwConnected) { + this.hwConnected = false; + this.connectionEventSubject.next(this.hwConnected); + } + this.checkHw(true); + } + +} +*/ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/hw-wallet-daemon.service.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/hw-wallet-daemon.service.spec.ts new file mode 100644 index 00000000..899e9f48 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/hw-wallet-daemon.service.spec.ts @@ -0,0 +1,15 @@ +import { TestBed, inject } from '@angular/core/testing'; + +import { HwWalletDaemonService } from './hw-wallet-daemon.service'; + +describe('HwWalletDaemonService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [HwWalletDaemonService], + }); + }); + + it('should be created', inject([HwWalletDaemonService], (service: HwWalletDaemonService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/hw-wallet-daemon.service.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/hw-wallet-daemon.service.ts new file mode 100644 index 00000000..bd29b324 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/hw-wallet-daemon.service.ts @@ -0,0 +1,186 @@ +import { Injectable, NgZone } from '@angular/core'; +import { ApiService } from './api.service'; +import { Http, RequestOptions, Headers } from '@angular/http'; +import { Observable } from 'rxjs/Observable'; +import { HwWalletPinService } from './hw-wallet-pin.service'; +import { HwWalletSeedWordService } from './hw-wallet-seed-word.service'; +import { ISubscription } from 'rxjs/Subscription'; +import { BehaviorSubject } from 'rxjs/BehaviorSubject'; +import 'rxjs/add/operator/timeout'; + +@Injectable() +export class HwWalletDaemonService { + + public static readonly errorCancelled = 'Cancelled'; + public static readonly errorConnectingWithTheDaemon = 'Error connecting with the hw wallet service'; + public static readonly errorTimeout = 'The operation was canceled due to inactivity'; + private readonly url = 'http://127.0.0.1:9510/api/v1'; + + private checkHwSubscription: ISubscription; + private hwConnected = false; + private connectionEventSubject = new BehaviorSubject(false); + private disconnectedChecks = 0; + + private readonly maxFastDisconnectedChecks = 32; + + get connectionEvent() { + return this.connectionEventSubject.asObservable(); + } + + constructor( + private http: Http, + private apiService: ApiService, + private hwWalletPinService: HwWalletPinService, + private hwWalletSeedWordService: HwWalletSeedWordService, + private ngZone: NgZone, + ) { } + + get(route: string) { + return this.checkResponse(this.http.get( + this.url + route, + this.returnRequestOptions(), + ), route.includes('/available')); + } + + post(route: string, params = {}) { + return this.checkResponse(this.http.post( + this.url + route, + JSON.stringify(params), + this.returnRequestOptions(), + )); + } + + put(route: string, params: any = null, sendMultipartFormData = false, smallTimeout = false) { + return this.checkResponse(this.http.put( + this.url + route, + params, + this.returnRequestOptions(sendMultipartFormData), + ), false, smallTimeout); + } + + delete(route: string) { + return this.checkResponse(this.http.delete( + this.url + route, + this.returnRequestOptions(), + )); + } + + private checkResponse(response: Observable, checkingConnected = false, smallTimeout = false) { + return response + .timeout(smallTimeout ? 30000 : 55000) + .flatMap((res: any) => { + const finalResponse = res.json(); + + if (finalResponse.data && finalResponse.data.length) { + if (finalResponse.data.length === 1) { + finalResponse.data = finalResponse.data[0]; + } else { + finalResponse.data = finalResponse.data; + } + } + + if (checkingConnected) { + this.ngZone.run(() => this.updateHwConnected(!!finalResponse.data)); + } else { + this.updateHwConnected(true); + } + + if (typeof finalResponse.data === 'string' && (finalResponse.data as string).indexOf('PinMatrixRequest') !== -1) { + return this.hwWalletPinService.requestPin().flatMap(pin => { + if (!pin) { + return this.put('/cancel').map(() => HwWalletDaemonService.errorCancelled); + } + + return this.post('/intermediate/pin_matrix', {pin: pin}); + }); + } + + if (typeof finalResponse.data === 'string' && (finalResponse.data as string).indexOf('WordRequest') !== -1) { + return this.hwWalletSeedWordService.requestWord().flatMap(word => { + if (!word) { + return this.put('/cancel').map(() => HwWalletDaemonService.errorCancelled); + } + + return this.post('/intermediate/word', {word: word}); + }); + } + + if (typeof finalResponse.data === 'string' && (finalResponse.data as string).indexOf('ButtonRequest') !== -1) { + return this.post('/intermediate/button'); + } + + return Observable.of(finalResponse); + }) + .catch((error: any) => { + if (error && error.name && error.name === 'TimeoutError') { + this.put('/cancel').subscribe(); + + return Observable.throw({_body: HwWalletDaemonService.errorTimeout }); + } + + if (error && error._body) { + let errorContent: string; + + if (typeof error._body === 'string') { + errorContent = error._body; + } else if (error._body.error) { + errorContent = error._body.error; + } else { + try { + errorContent = JSON.parse(error._body).error; + } catch (e) {} + } + + if (errorContent) { + return this.apiService.processConnectionError({_body: errorContent}, true); + } + } + + return Observable.throw({_body: HwWalletDaemonService.errorConnectingWithTheDaemon }); + }); + } + + private returnRequestOptions(sendMultipartFormData = false) { + const options = new RequestOptions(); + options.headers = new Headers(); + if (!sendMultipartFormData) { + options.headers.append('Content-Type', 'application/json'); + } + + return options; + } + + checkHw(wait: boolean) { + if (this.checkHwSubscription) { + this.checkHwSubscription.unsubscribe(); + } + + this.ngZone.runOutsideAngular(() => { + this.checkHwSubscription = Observable.of(1) + .delay(wait ? (this.hwConnected || this.disconnectedChecks < this.maxFastDisconnectedChecks ? 2000 : 10000) : 0) + .flatMap(() => this.get('/available')) + .subscribe( + null, + () => this.ngZone.run(() => this.updateHwConnected(false)), + ); + }); + } + + private updateHwConnected(connected: boolean) { + if (connected) { + this.disconnectedChecks = 0; + } else { + this.disconnectedChecks += 1; + } + + if (connected && !this.hwConnected) { + this.hwConnected = true; + this.connectionEventSubject.next(this.hwConnected); + } else if (!connected && this.hwConnected) { + this.hwConnected = false; + this.connectionEventSubject.next(this.hwConnected); + } + this.checkHw(true); + } + +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/hw-wallet-pin.service.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/hw-wallet-pin.service.spec.ts new file mode 100644 index 00000000..fe16df94 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/hw-wallet-pin.service.spec.ts @@ -0,0 +1,15 @@ +import { TestBed, inject } from '@angular/core/testing'; + +import { HwWalletPinService } from './hw-wallet-pin.service'; + +describe('HwWalletPinService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [HwWalletPinService], + }); + }); + + it('should be created', inject([HwWalletPinService], (service: HwWalletPinService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/hw-wallet-pin.service.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/hw-wallet-pin.service.ts new file mode 100644 index 00000000..03417c42 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/hw-wallet-pin.service.ts @@ -0,0 +1,56 @@ +import { Injectable } from '@angular/core'; +import { MatDialog, MatDialogConfig } from '@angular/material'; +import { HwPinDialogParams } from '../components/layout/hardware-wallet/hw-pin-dialog/hw-pin-dialog.component'; +import { Observable } from 'rxjs/Observable'; + +export enum ChangePinStates { + RequestingCurrentPin, + RequestingNewPin, + ConfirmingNewPin, +} + +@Injectable() +export class HwWalletPinService { + + // Set on AppComponent to avoid a circular reference. + private requestPinComponentInternal; + set requestPinComponent(value) { + this.requestPinComponentInternal = value; + } + + // Values to be sent to HwPinDialogComponent + changingPin: boolean; + signingTx: boolean; + changePinState: ChangePinStates; + + constructor( + private dialog: MatDialog, + ) {} + + resetValues() { + this.changingPin = false; + this.signingTx = false; + } + + requestPin(): Observable { + return this.dialog.open(this.requestPinComponentInternal, { + width: '350px', + autoFocus: false, + data : { + changingPin: this.changingPin, + changePinState: this.changePinState, + signingTx: this.signingTx, + }, + }).afterClosed().map(pin => { + if (this.changingPin) { + if (this.changePinState === ChangePinStates.RequestingCurrentPin) { + this.changePinState = ChangePinStates.RequestingNewPin; + } else if (this.changePinState === ChangePinStates.RequestingNewPin) { + this.changePinState = ChangePinStates.ConfirmingNewPin; + } + } + + return pin; + }); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/hw-wallet-seed-word.service.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/hw-wallet-seed-word.service.ts new file mode 100644 index 00000000..2ccb5d9f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/hw-wallet-seed-word.service.ts @@ -0,0 +1,30 @@ +import { Injectable } from '@angular/core'; +import { MatDialog, MatDialogConfig } from '@angular/material'; +import { Observable } from 'rxjs/Observable'; + +@Injectable() +export class HwWalletSeedWordService { + + // Set on AppComponent to avoid a circular reference. + private requestWordComponentInternal; + set requestWordComponent(value) { + this.requestWordComponentInternal = value; + } + + constructor( + private dialog: MatDialog, + ) {} + + requestWord(): Observable { + return this.dialog.open(this.requestWordComponentInternal, { + width: '350px', + data: { + isForHwWallet: true, + wordNumber: 0, + restoringSoftwareWallet: false, + }, + }).afterClosed().map(word => { + return word; + }); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/hw-wallet.service.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/hw-wallet.service.spec.ts new file mode 100644 index 00000000..ebf58f6c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/hw-wallet.service.spec.ts @@ -0,0 +1,15 @@ +import { TestBed, inject } from '@angular/core/testing'; + +import { HwWalletService } from './hw-wallet.service'; + +describe('HwWalletService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [HwWalletService], + }); + }); + + it('should be created', inject([HwWalletService], (service: HwWalletService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/hw-wallet.service.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/hw-wallet.service.ts new file mode 100644 index 00000000..755b2f1b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/hw-wallet.service.ts @@ -0,0 +1,768 @@ +// NOTE: some code for using the hw wallet js library was left here only for precaution and should be deleted soon. + +import { Injectable } from '@angular/core'; +import { Observable } from 'rxjs/Observable'; +import { Subscriber } from 'rxjs/Subscriber'; +import { Subject } from 'rxjs/Subject'; +import { TranslateService } from '@ngx-translate/core'; +import { AppConfig } from '../app.config'; +import { MatDialog, MatDialogConfig, MatDialogRef } from '@angular/material'; +import { HwWalletDaemonService } from './hw-wallet-daemon.service'; +import { HwWalletPinService, ChangePinStates } from './hw-wallet-pin.service'; +import { HwWalletSeedWordService } from './hw-wallet-seed-word.service'; +import BigNumber from 'bignumber.js'; +import { StorageService, StorageType } from './storage.service'; +import { ISubscription } from 'rxjs/Subscription'; +import { Http, ResponseContentType } from '@angular/http'; +import { ApiService } from './api.service'; + +export enum OperationResults { + Success, + FailedOrRefused, + PinMismatch, + WithoutSeed, + WrongPin, + IncorrectHardwareWallet, + WrongWord, + InvalidSeed, + WrongSeed, + UndefinedError, + Disconnected, + DaemonError, + InvalidAddress, + Timeout, + NotInBootloaderMode, +} + +export class TxData { + address: string; + coins: BigNumber; + hours: BigNumber; +} + +export class OperationResult { + result: OperationResults; + rawResponse: any; +} + +export interface Input { + hashIn: string; + index: number; +} + +export interface Output { + address: string; + coin: number; + hour: number; + address_index?: number; +} + +interface EventData { + event: string; + successTexts?: string[]; +} + +@Injectable() +export class HwWalletService { + + public static readonly maxLabelLength = 32; + + private readonly storageKey = 'hw-wallets'; + + showOptionsWhenPossible = false; + + private requestSequence = 0; + + private eventsObservers = new Map>(); + private walletConnectedSubject: Subject = new Subject(); + + private savingDataSubscription: ISubscription; + + private signTransactionDialog: MatDialogRef<{}, any>; + + // Set on AppComponent to avoid a circular reference. + private signTransactionConfirmationComponentInternal; + set signTransactionConfirmationComponent(value) { + this.signTransactionConfirmationComponentInternal = value; + } + + constructor( + private translate: TranslateService, + private dialog: MatDialog, + private hwWalletDaemonService: HwWalletDaemonService, + private hwWalletPinService: HwWalletPinService, + private hwWalletSeedWordService: HwWalletSeedWordService, + private storageService: StorageService, + private apiService: ApiService, + private http: Http) { + + if (this.hwWalletCompatibilityActivated) { + if (!AppConfig.useHwWalletDaemon) { + window['ipcRenderer'].on('hwConnectionEvent', (event, connected) => { + if (!connected) { + this.eventsObservers.forEach((value, key) => { + this.dispatchError(key, OperationResults.Disconnected, this.translate.instant('hardware-wallet.general.error-disconnected')); + }); + } + this.walletConnectedSubject.next(connected); + }); + } else { + hwWalletDaemonService.connectionEvent.subscribe(connected => { + this.walletConnectedSubject.next(connected); + }); + } + + if (!AppConfig.useHwWalletDaemon) { + window['ipcRenderer'].on('hwPinRequested', (event) => { + this.hwWalletPinService.requestPin().subscribe(pin => { + if (!pin) { + this.cancelAllOperations(); + window['ipcRenderer'].send('hwCancelPin'); + } else { + window['ipcRenderer'].send('hwSendPin', pin); + } + }); + }); + window['ipcRenderer'].on('hwSeedWordRequested', (event) => { + this.hwWalletSeedWordService.requestWord().subscribe(word => { + if (!word) { + this.cancelAllOperations(); + window['ipcRenderer'].send('hwCancelLastAction'); + } + window['ipcRenderer'].send('hwSendSeedWord', word); + }); + }); + + window['ipcRenderer'].on('hwSignTransactionResponse', (event, requestId, result) => { + this.closeTransactionDialog(); + this.dispatchEvent(requestId, result, true); + }); + + const data: EventData[] = [ + { event: 'hwChangePinResponse', successTexts: ['PIN changed'] }, + { event: 'hwGenerateMnemonicResponse', successTexts: ['operation completed'] }, + { event: 'hwRecoverMnemonicResponse', successTexts: ['Device recovered', 'The seed is valid and matches the one in the device'] }, + { event: 'hwBackupDeviceResponse', successTexts: ['operation completed'] }, + { event: 'hwWipeResponse', successTexts: ['operation completed'] }, + { event: 'hwChangeLabelResponse', successTexts: ['Settings applied'] }, + { event: 'hwCancelLastActionResponse' }, + { event: 'hwGetAddressesResponse' }, + { event: 'hwGetFeaturesResponse' }, + { event: 'hwSignMessageResponse' }, + ]; + + data.forEach(item => { + window['ipcRenderer'].on(item.event, (event, requestId, result) => { + const success = item.successTexts + ? typeof result === 'string' && item.successTexts.some(text => (result as string).includes(text)) + : true; + + this.dispatchEvent(requestId, result, success); + }); + }); + } + } + } + + get hwWalletCompatibilityActivated(): boolean { + if (!AppConfig.useHwWalletDaemon) { + return window['isElectron'] && window['ipcRenderer'].sendSync('hwCompatibilityActivated'); + } else { + return true; + } + } + + get walletConnectedAsyncEvent(): Observable { + return this.walletConnectedSubject.asObservable(); + } + + getDeviceConnected(): Observable { + if (!AppConfig.useHwWalletDaemon) { + return Observable.of(window['ipcRenderer'].sendSync('hwGetDeviceConnectedSync')); + } else { + return this.hwWalletDaemonService.get('/available').map(response => { + return response.data; + }); + } + } + + getSavedWalletsData(): Observable { + return this.storageService.get(StorageType.CLIENT, this.storageKey) + .map(result => result.data) + .catch(err => { + try { + if (err['_body']) { + const errorBody = JSON.parse(err['_body']); + if (errorBody && errorBody.error && errorBody.error.code === 404) { + return Observable.of(null); + } + } + } catch (e) {} + + return Observable.throw(err); + }); + } + + saveWalletsData(walletsData: string) { + if (this.savingDataSubscription) { + this.savingDataSubscription.unsubscribe(); + } + + this.savingDataSubscription = this.storageService.store(StorageType.CLIENT, this.storageKey, walletsData).subscribe(); + } + + cancelLastAction(): Observable { + if (!AppConfig.useHwWalletDaemon) { + const requestId = this.createRandomIdAndPrepare(); + window['ipcRenderer'].send('hwCancelLastAction', requestId); + + return this.createRequestResponse(requestId); + } else { + this.prepare(); + + return this.processDaemonResponse( + this.hwWalletDaemonService.put('/cancel', null, false, true), + ); + } + } + + getAddresses(addressN: number, startIndex: number): Observable { + return this.cancelLastAction().flatMap(() => { + if (!AppConfig.useHwWalletDaemon) { + const requestId = this.createRandomIdAndPrepare(); + window['ipcRenderer'].send('hwGetAddresses', requestId, addressN, startIndex, false); + + return this.createRequestResponse(requestId); + } else { + this.prepare(); + + const params = { + address_n: addressN, + start_index: startIndex, + confirm_address: false, + }; + + return this.processDaemonResponse( + this.hwWalletDaemonService.post( + '/generate_addresses', + params, + ), null, true, + ); + } + }).flatMap(response => { + return this.verifyAddresses(response.rawResponse, 0) + .catch(() => Observable.throw({ _body: this.translate.instant('hardware-wallet.errors.invalid-address-generated') })) + .map(() => response); + }); + } + + private verifyAddresses(addresses: string[], currentIndex: number): Observable { + const params = { + address: addresses[currentIndex], + }; + + return this.apiService.post('address/verify', params, {}, true).flatMap(() => { + if (currentIndex !== addresses.length - 1) { + return this.verifyAddresses(addresses, currentIndex + 1); + } else { + return Observable.of(0); + } + }); + } + + confirmAddress(index: number): Observable { + return this.cancelLastAction().flatMap(() => { + if (!AppConfig.useHwWalletDaemon) { + const requestId = this.createRandomIdAndPrepare(); + window['ipcRenderer'].send('hwGetAddresses', requestId, 1, index, true); + + return this.createRequestResponse(requestId); + } else { + this.prepare(); + + const params = { + address_n: 1, + start_index: index, + confirm_address: true, + }; + + return this.processDaemonResponse( + this.hwWalletDaemonService.post( + '/generate_addresses', + params, + ), null, true, + ); + } + }); + } + + getFeatures(cancelPreviousOperation = true): Observable { + + let cancel: Observable; + if (cancelPreviousOperation) { + cancel = this.cancelLastAction(); + } else { + cancel = Observable.of(0); + } + + return cancel.flatMap(() => { + if (!AppConfig.useHwWalletDaemon) { + const requestId = this.createRandomIdAndPrepare(); + window['ipcRenderer'].send('hwGetFeatures', requestId); + + return this.createRequestResponse(requestId); + } else { + this.prepare(); + + return this.processDaemonResponse( + this.hwWalletDaemonService.get('/features'), + ); + } + }); + } + + updateFirmware(downloadCompleteCallback: () => any): Observable { + if (!AppConfig.useHwWalletDaemon) { + // Unimplemented. + return null; + } else { + this.prepare(); + + return this.getFeatures(false).flatMap(result => { + if (!result.rawResponse.bootloader_mode) { + const response: OperationResult = { + result: OperationResults.NotInBootloaderMode, + rawResponse: null, + }; + + return Observable.throw(response); + } + + return this.http.get(AppConfig.urlForHwWalletVersionChecking) + .catch(() => Observable.throw({ _body: this.translate.instant('hardware-wallet.update-firmware.connection-error') })) + .map((res: any) => res.text()) + .flatMap((res: any) => { + let lastestFirmwareVersion: string = res.trim(); + if (lastestFirmwareVersion.toLowerCase().startsWith('v')) { + lastestFirmwareVersion = lastestFirmwareVersion.substr(1, lastestFirmwareVersion.length - 1); + } + + return this.http.get(AppConfig.hwWalletDownloadUrlAndPrefix + lastestFirmwareVersion + '.bin', { responseType: ResponseContentType.Blob }) + .map(firmwareResponse => firmwareResponse.blob()) + .catch(() => Observable.throw({ _body: this.translate.instant('hardware-wallet.update-firmware.connection-error') })) + .flatMap(firmware => { + downloadCompleteCallback(); + const data = new FormData(); + data.set('file', (firmware as Blob)); + + return this.processDaemonResponse( + this.hwWalletDaemonService.put('/firmware_update', data, true), + ); + }); + }); + }); + } + } + + changePin(changingCurrentPin: boolean): Observable { + return this.cancelLastAction().flatMap(() => { + let requestId = 0; + if (!AppConfig.useHwWalletDaemon) { + requestId = this.createRandomIdAndPrepare(); + } else { + this.prepare(); + } + + this.hwWalletPinService.changingPin = true; + if (changingCurrentPin) { + this.hwWalletPinService.changePinState = ChangePinStates.RequestingCurrentPin; + } else { + this.hwWalletPinService.changePinState = ChangePinStates.RequestingNewPin; + } + + if (!AppConfig.useHwWalletDaemon) { + window['ipcRenderer'].send('hwChangePin', requestId); + + return this.createRequestResponse(requestId); + } else { + return this.processDaemonResponse( + this.hwWalletDaemonService.post('/configure_pin_code'), + ['PIN changed'], + ); + } + }); + } + + removePin(): Observable { + return this.cancelLastAction().flatMap(() => { + if (!AppConfig.useHwWalletDaemon) { + // Unimplemented. + return null; + } else { + this.prepare(); + + const params = {}; + params['remove_pin'] = true; + + return this.processDaemonResponse( + this.hwWalletDaemonService.post( + '/configure_pin_code', + params, + ), + ['PIN removed'], + ); + } + }); + } + + generateMnemonic(wordCount: number): Observable { + return this.cancelLastAction().flatMap(() => { + if (!AppConfig.useHwWalletDaemon) { + const requestId = this.createRandomIdAndPrepare(); + window['ipcRenderer'].send('hwGenerateMnemonic', requestId, wordCount); + + return this.createRequestResponse(requestId); + } else { + this.prepare(); + + const params = {}; + params['word_count'] = wordCount; + params['use_passphrase'] = false; + + return this.processDaemonResponse( + this.hwWalletDaemonService.post( + '/generate_mnemonic', + params, + ), + ['Mnemonic successfully configured'], + ); + } + }); + } + + recoverMnemonic(wordCount: number, dryRun: boolean): Observable { + return this.cancelLastAction().flatMap(() => { + if (!AppConfig.useHwWalletDaemon) { + const requestId = this.createRandomIdAndPrepare(); + window['ipcRenderer'].send('hwRecoverMnemonic', requestId, wordCount, dryRun); + + return this.createRequestResponse(requestId); + } else { + this.prepare(); + + const params = {}; + params['word_count'] = wordCount; + params['use_passphrase'] = false; + params['dry_run'] = dryRun; + + return this.processDaemonResponse( + this.hwWalletDaemonService.post( + '/recovery', + params, + ), + ['Device recovered', 'The seed is valid and matches the one in the device'], + ); + } + }); + } + + backup(): Observable { + return this.cancelLastAction().flatMap(() => { + if (!AppConfig.useHwWalletDaemon) { + const requestId = this.createRandomIdAndPrepare(); + window['ipcRenderer'].send('hwBackupDevice', requestId); + + return this.createRequestResponse(requestId); + } else { + this.prepare(); + + return this.processDaemonResponse( + this.hwWalletDaemonService.post( + '/backup', + ), + ['Device backed up!'], + ); + } + }); + } + + wipe(): Observable { + return this.cancelLastAction().flatMap(() => { + if (!AppConfig.useHwWalletDaemon) { + const requestId = this.createRandomIdAndPrepare(); + window['ipcRenderer'].send('hwWipe', requestId); + + return this.createRequestResponse(requestId); + } else { + this.prepare(); + + return this.processDaemonResponse( + this.hwWalletDaemonService.delete('/wipe'), + ['Device wiped'], + ); + } + }); + } + + changeLabel(label: string): Observable { + return this.cancelLastAction().flatMap(() => { + if (!AppConfig.useHwWalletDaemon) { + const requestId = this.createRandomIdAndPrepare(); + window['ipcRenderer'].send('hwChangeLabel', requestId, label); + + return this.createRequestResponse(requestId); + } else { + this.prepare(); + + return this.processDaemonResponse( + this.hwWalletDaemonService.post('/apply_settings', {label: label}), + ['Settings applied'], + ); + } + }); + } + + signTransaction(inputs: Input[], outputs: Output[]): Observable { + const previewData: TxData[] = []; + outputs.forEach(output => { + if (output.address_index === undefined || output.address_index === null) { + const currentOutput = new TxData(); + currentOutput.address = output.address; + currentOutput.coins = new BigNumber(output.coin).dividedBy(1000000); + currentOutput.hours = new BigNumber(output.hour); + + previewData.push(currentOutput); + } + }); + + this.signTransactionDialog = this.dialog.open(this.signTransactionConfirmationComponentInternal, { + width: '560px', + data: previewData, + }); + + return this.cancelLastAction().flatMap(() => { + if (!AppConfig.useHwWalletDaemon) { + const requestId = this.createRandomIdAndPrepare(); + this.hwWalletPinService.signingTx = true; + window['ipcRenderer'].send('hwSignTransaction', requestId, inputs, outputs); + + return this.createRequestResponse(requestId); + } else { + this.prepare(); + + const params = { + transaction_inputs: (inputs as any[]).map(val => { + return { + index: val.index, + hash: val.hashIn, + }; + }), + transaction_outputs : (outputs as any[]).map(val => { + return { + address_index: val.address_index, + address: val.address, + coins: new BigNumber(val.coin).dividedBy(1000000).toFixed(6), + hours: val.hour.toString(), + }; + }), + }; + + return this.processDaemonResponse( + this.hwWalletDaemonService.post( + '/transaction_sign', + params, + ), null, true, + ).map(response => { + this.closeTransactionDialog(); + + return response; + }).catch(error => { + this.closeTransactionDialog(); + + return Observable.throw(error); + }); + } + }); + } + + checkIfCorrectHwConnected(firstAddress: string): Observable { + return this.getAddresses(1, 0).flatMap( + response => { + if (response.rawResponse[0] !== firstAddress) { + return Observable.throw({ + result: OperationResults.IncorrectHardwareWallet, + rawResponse: '', + }); + } + + return Observable.of(true); + }, + ).catch(error => { + if (error.result && error.result === OperationResults.WithoutSeed) { + return Observable.throw({ + result: OperationResults.IncorrectHardwareWallet, + rawResponse: '', + }); + } + + return Observable.throw(error); + }); + } + + private closeTransactionDialog() { + if (this.signTransactionDialog) { + this.signTransactionDialog.close(); + this.signTransactionDialog = null; + } + } + + private processDaemonResponse(daemonResponse: Observable, successTexts: string[] = null, responseShouldBeArray = false) { + return daemonResponse.catch((error: any) => { + return Observable.throw(this.dispatchEvent(0, error['_body'], false, true)); + }).flatMap(result => { + if (result !== HwWalletDaemonService.errorCancelled) { + if (responseShouldBeArray && result.data && typeof result.data === 'string') { + result.data = [result.data]; + } + + const response = this.dispatchEvent(0, + result.data ? result.data : null, + !successTexts ? true : typeof result.data === 'string' && successTexts.some(text => (result.data as string).includes(text)), + true); + + if (response.result === OperationResults.Success) { + return Observable.of(response); + } else { + return Observable.throw(response); + } + } else { + return Observable.throw(this.dispatchEvent(0, 'canceled by user', false, true)); + } + }); + } + + private createRequestResponse(requestId: number): Observable { + return new Observable(observer => { + this.eventsObservers.set(requestId, observer); + }); + } + + private createRandomIdAndPrepare(): number { + this.prepare(); + + return this.requestSequence++; + } + + private prepare() { + this.hwWalletPinService.changingPin = false; + this.hwWalletPinService.signingTx = false; + } + + private dispatchEvent(requestId: number, rawResponse: any, success: boolean, justReturnTheEvent = false) { + if (this.eventsObservers.has(requestId) || justReturnTheEvent) { + if ((!rawResponse || !rawResponse.error) && success) { + const response: OperationResult = { + result: OperationResults.Success, + rawResponse: rawResponse, + }; + + if (justReturnTheEvent) { + return response; + } else { + this.eventsObservers.get(requestId).next(response); + } + } else { + let responseContent: string = rawResponse.error ? rawResponse.error : rawResponse; + if (typeof responseContent !== 'string') { + responseContent = ''; + } + let result: OperationResults; + + if (responseContent.includes('failed or refused')) { + result = OperationResults.FailedOrRefused; + } else if (responseContent.includes('PIN invalid')) { + result = OperationResults.WrongPin; + } else if (responseContent.includes('canceled by user')) { + result = OperationResults.FailedOrRefused; + } else if (responseContent.includes('cancelled by user')) { + result = OperationResults.FailedOrRefused; + } else if (responseContent.includes('Expected WordAck after Button')) { + result = OperationResults.FailedOrRefused; + } else if (responseContent.includes('Wrong word retyped')) { + result = OperationResults.WrongWord; + } else if (responseContent.includes('PIN mismatch')) { + result = OperationResults.PinMismatch; + } else if (responseContent.includes('Mnemonic not set')) { + result = OperationResults.WithoutSeed; + } else if (responseContent.includes('Mnemonic required')) { + result = OperationResults.WithoutSeed; + } else if (responseContent.includes('Invalid seed, are words in correct order?')) { + result = OperationResults.InvalidSeed; + } else if (responseContent.includes('The seed is valid but does not match the one in the device')) { + result = OperationResults.WrongSeed; + } else if (responseContent.includes('Invalid base58 character')) { + result = OperationResults.InvalidAddress; + } else if (responseContent.includes('Invalid address length')) { + result = OperationResults.InvalidAddress; + } else if (responseContent.toLocaleLowerCase().includes('LIBUSB'.toLocaleLowerCase())) { + result = OperationResults.DaemonError; + } else if (responseContent.toLocaleLowerCase().includes('hidapi'.toLocaleLowerCase())) { + result = OperationResults.Disconnected; + if (AppConfig.useHwWalletDaemon) { + setTimeout(() => this.hwWalletDaemonService.checkHw(false)); + } + } else if (responseContent.toLocaleLowerCase().includes('device disconnected'.toLocaleLowerCase())) { + result = OperationResults.Disconnected; + if (AppConfig.useHwWalletDaemon) { + setTimeout(() => this.hwWalletDaemonService.checkHw(false)); + } + } else if (responseContent.toLocaleLowerCase().includes('no device connected'.toLocaleLowerCase())) { + result = OperationResults.Disconnected; + if (AppConfig.useHwWalletDaemon) { + setTimeout(() => this.hwWalletDaemonService.checkHw(false)); + } + } else if (responseContent.includes(HwWalletDaemonService.errorConnectingWithTheDaemon)) { + result = OperationResults.DaemonError; + } else if (responseContent.includes(HwWalletDaemonService.errorTimeout)) { + result = OperationResults.Timeout; + } else if (responseContent.includes('MessageType_Success')) { + result = OperationResults.Success; + } else { + result = OperationResults.UndefinedError; + } + + const response: OperationResult = { + result: result, + rawResponse: responseContent, + }; + + if (justReturnTheEvent) { + return response; + } else { + this.eventsObservers.get(requestId).error(response); + } + } + if (!justReturnTheEvent) { + this.eventsObservers.get(requestId).complete(); + this.eventsObservers.delete(requestId); + } + } + } + + private dispatchError(requestId: number, result: OperationResults, error: String) { + if (this.eventsObservers.has(requestId)) { + this.eventsObservers.get(requestId).error({ + result: result, + rawResponse: error, + }); + this.eventsObservers.delete(requestId); + } + } + + private cancelAllOperations() { + this.eventsObservers.forEach((value, key) => { + this.dispatchEvent(key, 'failed or refused', false); + }); + } + +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/language.service.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/language.service.spec.ts new file mode 100644 index 00000000..44ad56c1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/language.service.spec.ts @@ -0,0 +1,15 @@ +import { TestBed, inject } from '@angular/core/testing'; + +import { LanguageService } from './language.service'; + +describe('LanguageService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [LanguageService], + }); + }); + + it('should be created', inject([LanguageService], (service: LanguageService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/language.service.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/language.service.ts new file mode 100644 index 00000000..6f5fc82c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/language.service.ts @@ -0,0 +1,80 @@ +import { Injectable } from '@angular/core'; +import { TranslateService, LangChangeEvent } from '@ngx-translate/core'; +import { ReplaySubject } from 'rxjs/ReplaySubject'; + +import { AppConfig } from '../app.config'; +import { ISubscription } from 'rxjs/Subscription'; +import { StorageService, StorageType } from './storage.service'; + +export class LanguageData { + code: string; + name: string; + iconName: string; + + constructor(langObj) { + Object.assign(this, langObj); + } +} + +@Injectable() +export class LanguageService { + currentLanguage = new ReplaySubject(1); + selectedLanguageLoaded = new ReplaySubject(1); + + private readonly storageKey = 'lang'; + private subscription: ISubscription; + private languagesInternal: LanguageData[] = []; + + get languages(): LanguageData[] { + return this.languagesInternal; + } + + constructor( + private translate: TranslateService, + private storageService: StorageService, + ) { } + + loadLanguageSettings() { + + const langs: string[] = []; + AppConfig.languages.forEach(lang => { + const LangObj = new LanguageData(lang); + this.languagesInternal.push(LangObj); + langs.push(LangObj.code); + }); + + this.translate.addLangs(langs); + this.translate.setDefaultLang(AppConfig.defaultLanguage); + + this.translate.onLangChange + .subscribe((event: LangChangeEvent) => this.onLanguageChanged(event)); + + this.loadCurrentLanguage(); + } + + changeLanguage(langCode: string) { + this.translate.use(langCode); + } + + private onLanguageChanged(event: LangChangeEvent) { + this.currentLanguage.next(this.languages.find(val => val.code === event.lang)); + + if (this.subscription) { + this.subscription.unsubscribe(); + } + this.subscription = this.storageService.store(StorageType.CLIENT, this.storageKey, event.lang).subscribe(); + } + + private loadCurrentLanguage() { + this.storageService.get(StorageType.CLIENT, this.storageKey).subscribe(response => { + if (response.data && this.translate.getLangs().indexOf(response.data) !== -1) { + setTimeout(() => { this.translate.use(response.data); }, 16); + this.selectedLanguageLoaded.next(true); + } else { + this.selectedLanguageLoaded.next(false); + } + }, () => { + this.selectedLanguageLoaded.next(false); + }); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/msg-bar.service.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/msg-bar.service.spec.ts new file mode 100644 index 00000000..f610035b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/msg-bar.service.spec.ts @@ -0,0 +1,15 @@ +import { TestBed, inject } from '@angular/core/testing'; + +import { MsgBarService } from './msg-bar.service'; + +describe('MsgBarService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [MsgBarService], + }); + }); + + it('should be created', inject([MsgBarService], (service: MsgBarService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/msg-bar.service.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/msg-bar.service.ts new file mode 100644 index 00000000..e8d23d02 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/msg-bar.service.ts @@ -0,0 +1,70 @@ +import { Injectable } from '@angular/core'; +import { MsgBarConfig, MsgBarComponent, MsgBarIcons, MsgBarColors } from '../components/layout/msg-bar/msg-bar.component'; +import { parseResponseMessage } from '../utils/errors'; +import { ISubscription } from 'rxjs/Subscription'; +import { Observable } from 'rxjs/Observable'; + +@Injectable() +export class MsgBarService { + + private timeSubscription: ISubscription; + + private msgBarComponentInternal: MsgBarComponent; + set msgBarComponent(value: MsgBarComponent) { + this.msgBarComponentInternal = value; + } + + show(config: MsgBarConfig) { + if (this.msgBarComponentInternal) { + this.msgBarComponentInternal.config = config; + this.msgBarComponentInternal.show(); + } + } + + hide() { + if (this.msgBarComponentInternal) { + this.msgBarComponentInternal.hide(); + } + } + + showError(body: string, duration = 20000) { + const config = new MsgBarConfig(); + config.text = parseResponseMessage(body); + config.title = 'errors.error'; + config.icon = MsgBarIcons.Error; + config.color = MsgBarColors.Red; + + this.show(config); + this.setTimer(duration); + } + + showWarning(body: string, duration = 20000) { + const config = new MsgBarConfig(); + config.text = parseResponseMessage(body); + config.title = 'common.warning'; + config.icon = MsgBarIcons.Warning; + config.color = MsgBarColors.Yellow; + + this.show(config); + this.setTimer(duration); + } + + showDone(body: string, duration = 10000) { + const config = new MsgBarConfig(); + config.text = body; + config.title = 'common.success'; + config.icon = MsgBarIcons.Done; + config.color = MsgBarColors.Green; + + this.show(config); + this.setTimer(duration); + } + + private setTimer(duration = 10000) { + if (this.timeSubscription) { + this.timeSubscription.unsubscribe(); + } + + this.timeSubscription = Observable.of(1).delay(duration).subscribe(() => this.hide()); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/nav-bar.service.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/nav-bar.service.spec.ts new file mode 100644 index 00000000..f7c58619 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/nav-bar.service.spec.ts @@ -0,0 +1,15 @@ +import { TestBed, inject } from '@angular/core/testing'; + +import { NavBarService } from './nav-bar.service'; + +describe('NavBarService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [NavBarService], + }); + }); + + it('should be created', inject([NavBarService], (service: NavBarService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/nav-bar.service.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/nav-bar.service.ts new file mode 100644 index 00000000..8d3edfc1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/nav-bar.service.ts @@ -0,0 +1,36 @@ +import { Injectable } from '@angular/core'; +import { BehaviorSubject } from 'rxjs/BehaviorSubject'; +import { DoubleButtonActive } from '../components/layout/double-button/double-button.component'; + +@Injectable() +export class NavBarService { + switchVisible = false; + activeComponent = new BehaviorSubject(1); + leftText: string; + rightText: string; + switchDiabled = false; + + setActiveComponent(value) { + this.activeComponent.next(value); + } + + showSwitch(leftText, rightText, selectedButton = DoubleButtonActive.LeftButton) { + this.setActiveComponent(selectedButton); + this.switchDiabled = false; + this.switchVisible = true; + this.leftText = leftText; + this.rightText = rightText; + } + + hideSwitch() { + this.switchVisible = false; + } + + enableSwitch() { + this.switchDiabled = false; + } + + disableSwitch() { + this.switchDiabled = true; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/network.service.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/network.service.spec.ts new file mode 100644 index 00000000..dc00e8ac --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/network.service.spec.ts @@ -0,0 +1,15 @@ +import { TestBed, inject } from '@angular/core/testing'; + +import { NetworkService } from './network.service'; + +describe('NetworkService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [NetworkService], + }); + }); + + it('should be created', inject([NetworkService], (service: NetworkService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/network.service.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/network.service.ts new file mode 100644 index 00000000..833b212b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/network.service.ts @@ -0,0 +1,63 @@ +import { Injectable, NgZone } from '@angular/core'; +import { ApiService } from './api.service'; +import { Subject } from 'rxjs/Subject'; +import { BehaviorSubject } from 'rxjs/BehaviorSubject'; +import { Observable } from 'rxjs/Observable'; +import { IntervalObservable } from 'rxjs/observable/IntervalObservable'; +import 'rxjs/add/operator/mergeMap'; +import { Connection } from '../app.datatypes'; + +@Injectable() +export class NetworkService { + noConnections = false; + + private automaticPeers: Subject = new BehaviorSubject([]); + + constructor( + private apiService: ApiService, + private ngZone: NgZone, + ) { + this.loadData(); + } + + automatic(): Observable { + return this.automaticPeers.asObservable(); + } + + retrieveDefaultConnections(): Observable { + return this.apiService.get('network/defaultConnections') + .map(output => output.map((address, index) => ({ + id: index + 1, + address: address, + listen_port: 6000, + }))); + } + + private loadData(): void { + this.retrieveConnections().subscribe(connections => this.automaticPeers.next(connections)); + + this.ngZone.runOutsideAngular(() => { + IntervalObservable + .create(5000) + .flatMap(() => this.retrieveConnections()) + .subscribe(connections => this.ngZone.run(() => { + this.automaticPeers.next(connections); + })); + }); + } + + private retrieveConnections(): Observable { + return this.apiService.get('network/connections') + .map(response => { + if (response.connections === null || response.connections.length === 0) { + this.noConnections = true; + + return []; + } + + this.noConnections = false; + + return response.connections.sort((a, b) => a.id - b.id); + }); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/price.service.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/price.service.spec.ts new file mode 100644 index 00000000..88103507 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/price.service.spec.ts @@ -0,0 +1,15 @@ +import { TestBed, inject } from '@angular/core/testing'; + +import { PriceService } from './price.service'; + +describe('PriceService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [PriceService], + }); + }); + + it('should be created', inject([PriceService], (service: PriceService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/price.service.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/price.service.ts new file mode 100644 index 00000000..b850fc9a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/price.service.ts @@ -0,0 +1,61 @@ +import { Injectable, NgZone } from '@angular/core'; +import { Subject } from 'rxjs/Subject'; +import { BehaviorSubject } from 'rxjs/BehaviorSubject'; +import { Observable } from 'rxjs/Observable'; +import { HttpClient } from '@angular/common/http'; +import { ISubscription } from 'rxjs/Subscription'; + +@Injectable() +export class PriceService { + readonly PRICE_API_ID = 'sky-skycoin'; + + price: Subject = new BehaviorSubject(null); + + private readonly updatePeriod = 10 * 60 * 1000; + private lastPriceSubscription: ISubscription; + private timerSubscriptions: ISubscription[]; + + constructor( + private http: HttpClient, + private ngZone: NgZone, + ) { + this.startTimer(); + } + + private startTimer(firstConnectionDelay = 0) { + if (this.timerSubscriptions) { + this.timerSubscriptions.forEach(sub => sub.unsubscribe()); + } + + this.timerSubscriptions = []; + + this.ngZone.runOutsideAngular(() => { + this.timerSubscriptions.push(Observable.timer(this.updatePeriod, this.updatePeriod) + .subscribe(() => { + this.ngZone.run(() => !this.lastPriceSubscription ? this.loadPrice() : null ); + })); + }); + + this.timerSubscriptions.push( + Observable.of(1).delay(firstConnectionDelay).subscribe(() => { + this.ngZone.run(() => this.loadPrice()); + })); + } + + private loadPrice() { + if (!this.PRICE_API_ID) { + return; + } + + if (this.lastPriceSubscription) { + this.lastPriceSubscription.unsubscribe(); + } + + this.lastPriceSubscription = this.http.get(`https://api.coinpaprika.com/v1/tickers/${this.PRICE_API_ID}?quotes=USD`) + .subscribe((response: any) => { + this.lastPriceSubscription = null; + this.price.next(response.quotes.USD.price); + }, + () => this.startTimer(30000)); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/purchase.service.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/purchase.service.spec.ts new file mode 100644 index 00000000..b69d48a0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/purchase.service.spec.ts @@ -0,0 +1,15 @@ +import { TestBed, inject } from '@angular/core/testing'; + +import { PurchaseService } from './purchase.service'; + +describe('PurchaseService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [PurchaseService], + }); + }); + + it('should be created', inject([PurchaseService], (service: PurchaseService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/purchase.service.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/purchase.service.ts new file mode 100644 index 00000000..f8d52d75 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/purchase.service.ts @@ -0,0 +1,71 @@ +import { Injectable } from '@angular/core'; +import { Subject } from 'rxjs/Subject'; +import { BehaviorSubject } from 'rxjs/BehaviorSubject'; +import { PurchaseOrder, TellerConfig, Wallet } from '../app.datatypes'; +import { WalletService } from './wallet.service'; +import { HttpClient } from '@angular/common/http'; +import { environment } from '../../environments/environment'; +import { Observable } from 'rxjs/Observable'; + +@Injectable() +export class PurchaseService { + private configSubject: Subject = new BehaviorSubject(null); + private purchaseOrders: Subject = new BehaviorSubject([]); + private purchaseUrl = environment.tellerUrl; + + constructor( + private httpClient: HttpClient, + private walletService: WalletService, + ) { + this.getConfig(); + } + + all() { + return this.purchaseOrders.asObservable(); + } + + config(): Observable { + return this.configSubject.asObservable(); + } + + getConfig() { + return this.get('config') + .map((response: any) => ({ + enabled: true, + sky_btc_exchange_rate: parseFloat(response.sky_btc_exchange_rate), + })) + .subscribe(response => this.configSubject.next(response)); + } + + generate(wallet: Wallet): Observable { + return this.walletService.addAddress(wallet, 1).flatMap(address => { + return this.post('bind', { skyaddr: address[0].address, coin_type: 'BTC' }) + .map(response => ({ + coin_type: response.coin_type, + deposit_address: response.deposit_address, + filename: wallet.filename, + recipient_address: address[0].address, + status: 'waiting_deposit', + })); + }); + } + + scan(address: string) { + return this.get('status?skyaddr=' + address) + .map((response: any) => { + if (!response.statuses || response.statuses.length > 1) { + throw new Error('too many purchase orders found'); + } + + return response.statuses[0]; + }); + } + + private get(url): any { + return this.httpClient.get(this.purchaseUrl + url); + } + + private post(url, parameters = {}): any { + return this.httpClient.post(this.purchaseUrl + url, parameters); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/storage.service.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/storage.service.spec.ts new file mode 100644 index 00000000..a7d2fefe --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/storage.service.spec.ts @@ -0,0 +1,15 @@ +import { TestBed, inject } from '@angular/core/testing'; + +import { StorageService } from './storage.service'; + +describe('StorageService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [StorageService], + }); + }); + + it('should be created', inject([StorageService], (service: StorageService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/storage.service.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/storage.service.ts new file mode 100644 index 00000000..3acb5b87 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/storage.service.ts @@ -0,0 +1,33 @@ +import { Injectable } from '@angular/core'; +import { ApiService } from './api.service'; + +export enum StorageType { + CLIENT = 'client', + NOTES = 'txid', +} + +@Injectable() +export class StorageService { + + constructor( + private apiService: ApiService, + ) { } + + get(type: StorageType, key: string) { + const params = { type }; + + if (key) { + params.key = key; + } + + return this.apiService.get('data', params, { }, true); + } + + store(type: StorageType, key: string, value: string) { + return this.apiService.post('data', { + type: type, + key: key, + val: value, + }, {}, true); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/wallet.service.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/wallet.service.spec.ts new file mode 100644 index 00000000..d111e258 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/wallet.service.spec.ts @@ -0,0 +1,15 @@ +import { TestBed, inject } from '@angular/core/testing'; + +import { WalletService } from './wallet.service'; + +describe('WalletService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [WalletService], + }); + }); + + it('should be created', inject([WalletService], (service: WalletService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/wallet.service.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/wallet.service.ts new file mode 100644 index 00000000..0ab90a91 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/wallet.service.ts @@ -0,0 +1,935 @@ +import { Injectable, NgZone } from '@angular/core'; +import { ApiService } from './api.service'; +import { Subject } from 'rxjs/Subject'; +import { Observable } from 'rxjs/Observable'; +import 'rxjs/add/observable/forkJoin'; +import 'rxjs/add/observable/of'; +import 'rxjs/add/operator/do'; +import 'rxjs/add/operator/filter'; +import 'rxjs/add/operator/first'; +import 'rxjs/add/operator/mergeMap'; +import 'rxjs/add/observable/timer'; +import 'rxjs/add/observable/zip'; +import { Address, NormalTransaction, PreviewTransaction, Wallet, Output } from '../app.datatypes'; +import { ReplaySubject } from 'rxjs/ReplaySubject'; +import { Subscription } from 'rxjs/Subscription'; +import { BehaviorSubject } from 'rxjs/BehaviorSubject'; +import { BigNumber } from 'bignumber.js'; +import { HwWalletService } from './hw-wallet.service'; +import { TranslateService } from '@ngx-translate/core'; +import { catchError, map } from 'rxjs/operators'; +import { AppConfig } from '../app.config'; +import { Http } from '@angular/http'; +import { StorageService, StorageType } from './storage.service'; +import { shouldUpgradeVersion } from '../utils/semver'; +import { TxEncoder } from '../utils/tx-encoder'; + +export enum HwSecurityWarnings { + NeedsBackup, + NeedsPin, + FirmwareVersionNotVerified, + OutdatedFirmware, +} + +export interface HwFeaturesResponse { + features: any; + securityWarnings: HwSecurityWarnings[]; + walletNameUpdated: boolean; +} + +export interface PendingTransactions { + user: any[]; + all: any[]; +} + +@Injectable() +export class WalletService { + + addresses: Address[]; + wallets: Subject = new ReplaySubject(1); + pendingTxs: Subject = new ReplaySubject(1); + dataRefreshSubscription: Subscription; + + initialLoadFailed: BehaviorSubject = new BehaviorSubject(false); + + constructor( + private apiService: ApiService, + private hwWalletService: HwWalletService, + private translate: TranslateService, + private ngZone: NgZone, + private http: Http, + private storageService: StorageService, + ) { + this.loadData(); + this.startDataRefreshSubscription(); + } + + addressesAsString(): Observable { + return this.allAddresses().map(addrs => addrs.map(addr => addr.address)).map(addrs => addrs.join(',')); + } + + addAddress(wallet: Wallet, num: number, password?: string) { + if (!wallet.isHardware) { + return this.apiService.postWalletNewAddress(wallet, num, password) + .do(addresses => { + addresses.forEach(value => wallet.addresses.push(value)); + this.refreshBalances(); + }); + } else { + return this.hwWalletService.getAddresses(num, wallet.addresses.length).flatMap(response => { + (response.rawResponse as any[]).forEach(value => wallet.addresses.push({ + address: value, + coins: null, + hours: null, + })); + this.saveHardwareWallets(); + this.refreshBalances(); + + return Observable.of(response.rawResponse); + }); + } + } + + all(): Observable { + return this.wallets.asObservable(); + } + + allAddresses(): Observable { + return this.all().map(wallets => wallets.reduce((array, wallet) => array.concat(wallet.addresses), [])); + } + + create(label, seed, scan, password) { + seed = seed.replace(/(\n|\r\n)$/, ''); + + return this.apiService.postWalletCreate(label ? label : 'undefined', seed, scan ? scan : 100, password, 'deterministic') + .do(wallet => { + console.log(wallet); + this.wallets.first().subscribe(wallets => { + wallets.push(wallet); + this.wallets.next(wallets); + this.refreshBalances(); + }); + }); + } + + createHardwareWallet(): Observable { + let addresses: string[]; + let lastAddressWithTx = 0; + const addressesMap: Map = new Map(); + const addressesWithTxMap: Map = new Map(); + + return this.hwWalletService.getAddresses(AppConfig.maxHardwareWalletAddresses, 0).flatMap(response => { + addresses = response.rawResponse; + addresses.forEach(address => { + addressesMap.set(address, true); + }); + + const addressesString = addresses.join(','); + + return this.apiService.post('transactions', { addrs: addressesString }); + }).flatMap(response => { + response.forEach(tx => { + tx.txn.outputs.forEach(output => { + if (addressesMap.has(output.dst)) { + addressesWithTxMap.set(output.dst, true); + } + }); + }); + + addresses.forEach((address, i) => { + if (addressesWithTxMap.has(address)) { + lastAddressWithTx = i; + } + }); + + return this.wallets.first().map(wallets => { + const newWallet = this.createHardwareWalletData( + this.translate.instant('hardware-wallet.general.default-wallet-name'), + addresses.slice(0, lastAddressWithTx + 1).map(add => { + return { address: add, confirmed: false }; + }), true, false, + ); + + let lastHardwareWalletIndex = wallets.length - 1; + for (let i = 0; i < wallets.length; i++) { + if (!wallets[i].isHardware) { + lastHardwareWalletIndex = i - 1; + break; + } + } + wallets.splice(lastHardwareWalletIndex + 1, 0, newWallet); + this.saveHardwareWallets(); + this.refreshBalances(); + + return newWallet; + }); + }); + } + + getHwFeaturesAndUpdateData(wallet: Wallet): Observable { + if (!wallet || wallet.isHardware) { + + let lastestFirmwareVersion: string; + + return this.http.get(AppConfig.urlForHwWalletVersionChecking) + .catch(() => Observable.of(null)) + .flatMap((res: any) => { + if (res) { + lastestFirmwareVersion = res.text(); + } else { + lastestFirmwareVersion = null; + } + + return this.hwWalletService.getFeatures(); + }) + .map(result => { + let lastestFirmwareVersionReaded = false; + let firmwareUpdated = false; + + if (lastestFirmwareVersion) { + lastestFirmwareVersion = lastestFirmwareVersion.trim(); + const versionParts = lastestFirmwareVersion.split('.'); + + if (versionParts.length === 3) { + lastestFirmwareVersionReaded = true; + + const numVersionParts = versionParts.map(value => Number.parseInt(value.replace(/\D/g, ''))); + + const devMajorVersion = !AppConfig.useHwWalletDaemon ? result.rawResponse.majorVersion : result.rawResponse.fw_major; + const devMinorVersion = !AppConfig.useHwWalletDaemon ? result.rawResponse.minorVersion : result.rawResponse.fw_minor; + const devPatchVersion = !AppConfig.useHwWalletDaemon ? result.rawResponse.patchVersion : result.rawResponse.fw_patch; + + if (devMajorVersion > numVersionParts[0]) { + firmwareUpdated = true; + } else { + if (devMajorVersion === numVersionParts[0]) { + if (devMinorVersion > numVersionParts[1]) { + firmwareUpdated = true; + } else { + if (devMinorVersion === numVersionParts[1] && devPatchVersion >= numVersionParts[2]) { + firmwareUpdated = true; + } + } + } + } + } + } + + const warnings: HwSecurityWarnings[] = []; + let hasHwSecurityWarnings = false; + + if (!AppConfig.useHwWalletDaemon) { + if (result.rawResponse.needsBackup) { + warnings.push(HwSecurityWarnings.NeedsBackup); + hasHwSecurityWarnings = true; + } + if (!result.rawResponse.pinProtection) { + warnings.push(HwSecurityWarnings.NeedsPin); + hasHwSecurityWarnings = true; + } + } else { + if (result.rawResponse.needs_backup) { + warnings.push(HwSecurityWarnings.NeedsBackup); + hasHwSecurityWarnings = true; + } + if (!result.rawResponse.pin_protection) { + warnings.push(HwSecurityWarnings.NeedsPin); + hasHwSecurityWarnings = true; + } + } + + if (!lastestFirmwareVersionReaded) { + warnings.push(HwSecurityWarnings.FirmwareVersionNotVerified); + } else { + if (!firmwareUpdated) { + warnings.push(HwSecurityWarnings.OutdatedFirmware); + hasHwSecurityWarnings = true; + } + } + + let walletNameUpdated = false; + + if (wallet) { + const deviceLabel = result.rawResponse.label ? result.rawResponse.label : (result.rawResponse.deviceId ? result.rawResponse.deviceId : result.rawResponse.device_id); + if (wallet.label !== deviceLabel) { + wallet.label = deviceLabel; + walletNameUpdated = true; + } + wallet.hasHwSecurityWarnings = hasHwSecurityWarnings; + this.saveHardwareWallets(); + } + + const response = { + features: result.rawResponse, + securityWarnings: warnings, + walletNameUpdated: walletNameUpdated, + }; + + return response; + }); + } else { + return null; + } + } + + deleteHardwareWallet(wallet: Wallet): Observable { + if (wallet.isHardware) { + return this.wallets.first().map(wallets => { + const index = wallets.indexOf(wallet); + if (index !== -1) { + wallets.splice(index, 1); + + this.saveHardwareWallets(); + this.refreshBalances(); + + return true; + } + + return false; + }); + } + + return null; + } + + folder(): Observable { + return this.apiService.get('wallets/folderName').map(response => response.address); + } + + outputs(): Observable { + return this.addressesAsString() + .first() + .filter(addresses => !!addresses) + .flatMap(addresses => this.apiService.post('outputs', {addrs: addresses})); + } + + outputsWithWallets(): Observable { + return Observable.zip(this.all(), this.outputs(), (wallets, outputs) => { + return wallets.map(wallet => { + wallet.addresses = wallet.addresses.map(address => { + address.outputs = outputs.head_outputs.filter(output => output.address === address.address); + + return address; + }); + + return wallet; + }); + }); + } + + pendingTransactions(): Observable { + return this.pendingTxs.asObservable(); + } + + refreshBalances() { + this.wallets.first().subscribe(wallets => { + Observable.forkJoin(wallets.map(wallet => this.retrieveWalletBalance(wallet).map(response => { + wallet.coins = response.coins; + wallet.hours = response.hours; + wallet.addresses.map(address => { + const balance = response.addresses.find(addr => addr.address === address.address); + address.coins = balance.coins; + address.hours = balance.hours; + }); + + return wallet; + }))) + .subscribe(newWallets => this.wallets.next(newWallets)); + }); + } + + renameWallet(wallet: Wallet, label: string): Observable { + return this.apiService.post('wallet/update', { id: wallet.filename, label: label }) + .do(() => { + wallet.label = label; + this.updateWallet(wallet); + }); + } + + toggleEncryption(wallet: Wallet, password: string): Observable { + return this.apiService.postWalletToggleEncryption(wallet, password) + .do(w => { + wallet.encrypted = w.meta.encrypted; + this.updateWallet(w); + }); + } + + resetPassword(wallet: Wallet, seed: string, password: string): Observable { + const params = new Object(); + params['id'] = wallet.filename; + params['seed'] = seed; + if (password) { + params['password'] = password; + } + + return this.apiService.post('wallet/recover', params, {}, true).do(w => { + wallet.encrypted = w.data.meta.encrypted; + this.updateWallet(w.data); + }); + } + + getWalletSeed(wallet: Wallet, password: string): Observable { + return this.apiService.getWalletSeed(wallet, password); + } + + createTransaction( + wallet: Wallet|null, + addresses: string[]|null, + unspents: string[]|null, + destinations: any[], + hoursSelection: any, + changeAddress: string|null, + password: string|null, + unsigned: boolean): Observable { + + if (unspents) { + addresses = null; + } + + if (wallet.isHardware && !changeAddress) { + changeAddress = wallet.addresses[0].address; + } + + const useV2Endpoint = !!wallet.isHardware; + + const params = { + hours_selection: hoursSelection, + wallet_id: wallet ? wallet.filename : null, + password: password, + addresses: addresses, + unspents: unspents, + to: destinations, + change_address: changeAddress, + }; + + if (!useV2Endpoint) { + params['unsigned'] = unsigned; + } + + let response: Observable = this.apiService.post( + useV2Endpoint ? 'transaction' : 'wallet/transaction', + params, + { + json: true, + }, + useV2Endpoint, + ).map(transaction => { + const data = useV2Endpoint ? transaction.data : transaction; + + if (wallet.isHardware) { + if (data.transaction.inputs.length > 8) { + throw new Error(this.translate.instant('hardware-wallet.errors.too-many-inputs-outputs')); + } + if (data.transaction.outputs.length > 8) { + throw new Error(this.translate.instant('hardware-wallet.errors.too-many-inputs-outputs')); + } + } + + return { + ...data.transaction, + hoursBurned: new BigNumber(data.transaction.fee), + encoded: data.encoded_transaction, + innerHash: data.transaction.inner_hash, + }; + }); + + if (wallet.isHardware && !unsigned) { + let unsignedTx: PreviewTransaction; + + response = response.flatMap(transaction => { + unsignedTx = transaction; + + return this.signTransaction(wallet, null, transaction); + }).map(signedTx => { + unsignedTx.encoded = signedTx.encoded; + + return unsignedTx; + }); + } + + return response; + } + + signTransaction( + wallet: Wallet, + password: string|null, + transaction: PreviewTransaction): Observable { + + if (!wallet.isHardware) { + return this.apiService.post( + 'wallet/transaction/sign', + { + wallet_id: wallet ? wallet.filename : null, + password: password, + encoded_transaction: transaction.encoded, + }, + { + json: true, + }, + true, + ).map(response => { + return { + ...response.data.transaction, + hoursBurned: new BigNumber(response.data.transaction.fee), + encoded: response.data.encoded_transaction, + }; + }); + + } else { + + const txOutputs = []; + const txInputs = []; + const hwOutputs = []; + const hwInputs = []; + + transaction.outputs.forEach(output => { + txOutputs.push({ + address: output.address, + coins: parseInt(new BigNumber(output.coins).multipliedBy(1000000).toFixed(0), 10), + hours: parseInt(output.hours, 10), + }); + + hwOutputs.push({ + address: output.address, + coin: parseInt(new BigNumber(output.coins).multipliedBy(1000000).toFixed(0), 10), + hour: parseInt(output.hours, 10), + }); + }); + + if (hwOutputs.length > 1) { + for (let i = txOutputs.length - 1; i >= 0; i--) { + if (hwOutputs[i].address === wallet.addresses[0].address) { + hwOutputs[i].address_index = 0; + break; + } + } + } + + const addressesMap: Map = new Map(); + wallet.addresses.forEach((address, i) => addressesMap.set(address.address, i)); + + transaction.inputs.forEach(input => { + txInputs.push({ + hash: input.uxid, + secret: '', + address: input.address, + address_index: addressesMap.get(input.address), + calculated_hours: parseInt(input.calculated_hours, 10), + coins: parseInt(input.coins, 10), + }); + + hwInputs.push({ + hashIn: input.uxid, + index: addressesMap.get(input.address), + }); + }); + + return this.hwWalletService.signTransaction(hwInputs, hwOutputs).flatMap(signatures => { + const rawTransaction = TxEncoder.encode( + hwInputs, + hwOutputs, + signatures.rawResponse, + transaction.innerHash, + ); + + return Observable.of( { + ...transaction, + encoded: rawTransaction, + }); + }); + } + } + + injectTransaction(encodedTx: string, note: string): Observable { + return this.apiService.post('injectTransaction', { rawtx: encodedTx }, { json: true }) + .flatMap(txId => { + setTimeout(() => this.startDataRefreshSubscription(), 32); + + if (!note) { + return Observable.of(false); + } else { + return this.storageService.store(StorageType.NOTES, txId, note) + .retryWhen(errors => errors.delay(1000).take(3).concat(Observable.throw(-1))) + .catch(err => err === -1 ? Observable.of(-1) : err) + .map(result => result === -1 ? false : true); + } + }); + } + + transaction(txid: string): Observable { + return this.apiService.get('transaction', {txid: txid}).flatMap(transaction => { + if (transaction.txn.inputs && !transaction.txn.inputs.length) { + return Observable.of(transaction); + } + + return Observable.forkJoin(transaction.txn.inputs.map(input => this.retrieveInputAddress(input).map(response => { + return response.owner_address; + }))).map(inputs => { + transaction.txn.inputs = inputs; + + return transaction; + }); + }); + } + + transactions(): Observable { + let wallets: Wallet[]; + let transactions: NormalTransaction[]; + const addressesMap: Map = new Map(); + + + return this.wallets.first().flatMap(w => { + wallets = w; + + return this.allAddresses().first(); + }).flatMap(addresses => { + this.addresses = addresses; + addresses.map(add => addressesMap.set(add.address, true)); + + return this.apiService.getTransactions(addresses); + }).flatMap(recoveredTransactions => { + transactions = recoveredTransactions; + + return this.storageService.get(StorageType.NOTES, null); + }).map(notes => { + const notesMap: Map = new Map(); + Object.keys(notes.data).forEach(key => { + notesMap.set(key, notes.data[key]); + }); + + return transactions + .sort((a, b) => b.timestamp - a.timestamp) + .map(transaction => { + const outgoing = transaction.inputs.some(input => addressesMap.has(input.owner)); + + const relevantAddresses: Map = new Map(); + transaction.balance = new BigNumber('0'); + transaction.hoursSent = new BigNumber('0'); + + if (!outgoing) { + transaction.outputs.map(output => { + if (addressesMap.has(output.dst)) { + relevantAddresses.set(output.dst, true); + transaction.balance = transaction.balance.plus(output.coins); + transaction.hoursSent = transaction.hoursSent.plus(output.hours); + } + }); + } else { + const possibleReturnAddressesMap: Map = new Map(); + transaction.inputs.map(input => { + if (addressesMap.has(input.owner)) { + relevantAddresses.set(input.owner, true); + wallets.map(wallet => { + if (wallet.addresses.some(add => add.address === input.owner)) { + wallet.addresses.map(add => possibleReturnAddressesMap.set(add.address, true)); + } + }); + } + }); + + transaction.outputs.map(output => { + if (!possibleReturnAddressesMap.has(output.dst)) { + transaction.balance = transaction.balance.minus(output.coins); + transaction.hoursSent = transaction.hoursSent.plus(output.hours); + } + }); + + if (transaction.balance.isEqualTo(0)) { + transaction.coinsMovedInternally = true; + const inputAddressesMap: Map = new Map(); + + transaction.inputs.map(input => { + inputAddressesMap.set(input.owner, true); + }); + + transaction.outputs.map(output => { + if (!inputAddressesMap.has(output.dst)) { + relevantAddresses.set(output.dst, true); + transaction.balance = transaction.balance.plus(output.coins); + transaction.hoursSent = transaction.hoursSent.plus(output.hours); + } + }); + } + } + + relevantAddresses.forEach((value, key) => { + transaction.addresses.push(key); + }); + + let inputsHours = new BigNumber('0'); + transaction.inputs.map(input => inputsHours = inputsHours.plus(new BigNumber(input.calculated_hours))); + let outputsHours = new BigNumber('0'); + transaction.outputs.map(output => outputsHours = outputsHours.plus(new BigNumber(output.hours))); + transaction.hoursBurned = inputsHours.minus(outputsHours); + + const txNote = notesMap.get(transaction.txid); + if (txNote) { + transaction.note = txNote; + } + + return transaction; + }); + }); + } + + startDataRefreshSubscription() { + if (this.dataRefreshSubscription) { + this.dataRefreshSubscription.unsubscribe(); + } + + this.ngZone.runOutsideAngular(() => { + this.dataRefreshSubscription = Observable.timer(0, 10000) + .subscribe(() => this.ngZone.run(() => { + this.refreshBalances(); + this.refreshPendingTransactions(); + })); + }); + } + + saveHardwareWallets() { + this.wallets.first().subscribe(wallets => { + const hardwareWallets: Wallet[] = []; + + wallets.map(wallet => { + if (wallet.isHardware) { + hardwareWallets.push(this.createHardwareWalletData( + wallet.label, + wallet.addresses.map(address => { + return { address: address.address, confirmed: address.confirmed }; + }), + wallet.hasHwSecurityWarnings, + wallet.stopShowingHwSecurityPopup, + )); + } + }); + + this.hwWalletService.saveWalletsData(JSON.stringify(hardwareWallets)); + + this.wallets.next(wallets); + }); + } + + verifyAddress(address: string) { + return this.apiService.post('address/verify', { address }, {}, true) + .pipe(map(() => true), catchError(() => Observable.of(false))); + } + + getWalletUnspentOutputs(wallet: Wallet): Observable { + const addresses = wallet.addresses.map(a => a.address).join(','); + + return this.getOutputs(addresses); + } + + private createHardwareWalletData(label: string, addresses: {address: string, confirmed: boolean}[], hasHwSecurityWarnings: boolean, stopShowingHwSecurityPopup: boolean): Wallet { + return { + label: label, + filename: '', + hasHwSecurityWarnings: hasHwSecurityWarnings, + stopShowingHwSecurityPopup: stopShowingHwSecurityPopup, + coins: null, + hours: null, + addresses: addresses.map(address => { + return { + address: address.address, + coins: null, + hours: null, + confirmed: address.confirmed, + }; + }), + encrypted: false, + isHardware: true, + }; + } + + private loadData(): void { + let wallets: Wallet[] = []; + let softwareWallets: Wallet[] = []; + + this.apiService.getWallets().first().flatMap(recoveredWallets => { + softwareWallets = recoveredWallets; + + if (this.hwWalletService.hwWalletCompatibilityActivated) { + return this.loadHardwareWallets(wallets); + } + + return Observable.of(null); + + }).subscribe(() => { + wallets = wallets.concat(softwareWallets); + this.wallets.next(wallets); + }, () => this.initialLoadFailed.next(true)); + } + + private loadHardwareWallets(wallets: Wallet[]): Observable { + return this.hwWalletService.getSavedWalletsData().map(storedWallets => { + if (storedWallets) { + const loadedWallets: Wallet[] = JSON.parse(storedWallets); + loadedWallets.map(wallet => wallets.push(wallet)); + } + + return null; + }); + } + + private retrieveInputAddress(input: string) { + return this.apiService.get('uxout', {uxid: input}); + } + + private retrieveWalletBalance(wallet: Wallet): Observable { + let query: Observable; + if (!wallet.isHardware) { + query = this.apiService.get('wallet/balance', { id: wallet.filename }); + } else { + const formattedAddresses = wallet.addresses.map(a => a.address).join(','); + query = this.apiService.post('balance', { addrs: formattedAddresses }); + } + + return query.map(balance => { + return { + coins: new BigNumber(balance.confirmed.coins).dividedBy(1000000), + hours: new BigNumber(balance.confirmed.hours), + addresses: Object.keys(balance.addresses).map(address => ({ + address, + coins: new BigNumber(balance.addresses[address].confirmed.coins).dividedBy(1000000), + hours: new BigNumber(balance.addresses[address].confirmed.hours), + })), + }; + }); + } + + private updateWallet(wallet: Wallet) { + this.wallets.first().subscribe(wallets => { + const index = wallets.findIndex(w => w.filename === wallet.filename); + wallets[index] = wallet; + this.wallets.next(wallets); + }); + } + + private refreshPendingTransactions() { + this.apiService.get('pendingTxs', { verbose: true }) + .flatMap((transactions: any) => { + if (transactions.length === 0) { + return Observable.of({ + user: [], + all: [], + }); + } + + return this.wallets.first().map((wallets: Wallet[]) => { + const walletAddresses = new Set(); + wallets.forEach(wallet => { + wallet.addresses.forEach(address => walletAddresses.add(address.address)); + }); + + const userTransactions = transactions.filter(tran => { + return tran.transaction.inputs.some(input => walletAddresses.has(input.owner)) || + tran.transaction.outputs.some(output => walletAddresses.has(output.dst)); + }); + + return { + user: userTransactions, + all: transactions, + }; + }); + }) + .subscribe(transactions => this.pendingTxs.next(transactions)); + } + + private getOutputs(addresses): Observable { + if (!addresses) { + return Observable.of([]); + } else { + return this.apiService.post('outputs', { addrs: addresses }).map((response) => { + const outputs = []; + response.head_outputs.forEach(output => outputs.push({ + address: output.address, + coins: new BigNumber(output.coins), + hash: output.hash, + calculated_hours: new BigNumber(output.calculated_hours), + })); + + return outputs; + }); + } + } + + private sortOutputs(outputs: Output[], highestToLowest: boolean) { + outputs.sort((a, b) => { + if (b.coins.isGreaterThan(a.coins)) { + return highestToLowest ? 1 : -1; + } else if (b.coins.isLessThan(a.coins)) { + return highestToLowest ? -1 : 1; + } else { + if (b.calculated_hours.isGreaterThan(a.calculated_hours)) { + return -1; + } else if (b.calculated_hours.isLessThan(a.calculated_hours)) { + return 1; + } else { + return 0; + } + } + }); + } + + private getMinRequiredOutputs(transactionAmount: BigNumber, outputs: Output[]): Output[] { + + // Split the outputs into those with and without hours + const outputsWithHours: Output[] = []; + const outputsWitouthHours: Output[] = []; + outputs.forEach(output => { + if (output.calculated_hours.isGreaterThan(0)) { + outputsWithHours.push(output); + } else { + outputsWitouthHours.push(output); + } + }); + + // Abort if there are no outputs with non-zero coinhours. + if (outputsWithHours.length === 0) { + return []; + } + + // Sort the outputs with hours by coins, from highest to lowest. If two items have the same amount of + // coins, the one with the least hours is placed first. + this.sortOutputs(outputsWithHours, true); + + // Use the first nonzero output. + const minRequiredOutputs: Output[] = [outputsWithHours[0]]; + let sumCoins: BigNumber = new BigNumber(outputsWithHours[0].coins); + + // If it's enough, finish. + if (sumCoins.isGreaterThanOrEqualTo(transactionAmount)) { + return minRequiredOutputs; + } + + // Sort the outputs without hours by coins, from lowest to highest. + this.sortOutputs(outputsWitouthHours, false); + + // Add the outputs without hours, until having the necessary amount of coins. + outputsWitouthHours.forEach(output => { + if (sumCoins.isLessThan(transactionAmount)) { + minRequiredOutputs.push(output); + sumCoins = sumCoins.plus(output.coins); + } + }); + + // If it's enough, finish. + if (sumCoins.isGreaterThanOrEqualTo(transactionAmount)) { + return minRequiredOutputs; + } + + outputsWithHours.splice(0, 1); + // Sort the outputs with hours by coins, from lowest to highest. + this.sortOutputs(outputsWithHours, false); + + // Add the outputs with hours, until having the necessary amount of coins. + outputsWithHours.forEach((output) => { + if (sumCoins.isLessThan(transactionAmount)) { + minRequiredOutputs.push(output); + sumCoins = sumCoins.plus(output.coins); + } + }); + + return minRequiredOutputs; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/wizard-guard.service.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/wizard-guard.service.spec.ts new file mode 100644 index 00000000..ce4788b2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/wizard-guard.service.spec.ts @@ -0,0 +1,15 @@ +import { TestBed, inject } from '@angular/core/testing'; + +import { WizardGuardService } from './wizard-guard.service'; + +describe('WizardGuardService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [WizardGuardService], + }); + }); + + it('should be created', inject([WizardGuardService], (service: WizardGuardService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/wizard-guard.service.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/wizard-guard.service.ts new file mode 100644 index 00000000..dafdcb61 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/services/wizard-guard.service.ts @@ -0,0 +1,25 @@ +import { Injectable } from '@angular/core'; +import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from '@angular/router'; +import { WalletService } from './wallet.service'; + +@Injectable() +export class WizardGuardService implements CanActivate { + constructor( + private walletService: WalletService, + private router: Router, + ) { } + + canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise { + return new Promise(resolve => { + this.walletService.all().first().subscribe(wallets => { + if (wallets.length === 0) { + this.router.navigate(['/wizard']); + + return resolve(false); + } + + return resolve(true); + }); + }); + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/utils/errors.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/utils/errors.spec.ts new file mode 100644 index 00000000..ec0f2149 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/utils/errors.spec.ts @@ -0,0 +1,16 @@ +import { parseResponseMessage } from './errors'; + +fdescribe('errors', () => { + const message1 = '400 Bad Request - error description'; + const message2 = '403 Forbidden - error description'; + const message3 = '500 Internal Server Error - error description'; + + it('parses message from 400 and 403 responses', () => { + expect(parseResponseMessage(message1)).toEqual('Error description'); + expect(parseResponseMessage(message2)).toEqual('Error description'); + }); + + it('does not parse message from other responses', () => { + expect(parseResponseMessage(message3)).toEqual(message3); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/utils/errors.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/utils/errors.ts new file mode 100644 index 00000000..4a4d8b40 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/utils/errors.ts @@ -0,0 +1,76 @@ +import { HwWalletService, OperationResults } from '../services/hw-wallet.service'; +import { TranslateService } from '@ngx-translate/core'; +import { AppConfig } from '../app.config'; + +export function parseResponseMessage(body: string): string { + if (typeof body === 'object') { + if (body['_body']) { + body = body['_body']; + } else { + body = body + ''; + } + } + + if (body.indexOf('"error":') !== -1) { + body = JSON.parse(body).error.message; + } + + if (body.startsWith('400') || body.startsWith('403')) { + const parts = body.split(' - ', 2); + + return parts.length === 2 + ? parts[1].charAt(0).toUpperCase() + parts[1].slice(1) + : body; + } + + return body; +} + +export function getHardwareWalletErrorMsg(translateService: TranslateService, error: any, genericError: string = null): string { + if (!AppConfig.useHwWalletDaemon && !window['ipcRenderer'].sendSync('hwGetDeviceConnectedSync')) { + if (translateService) { + return translateService.instant('hardware-wallet.general.error-disconnected'); + } else { + return 'hardware-wallet.general.error-disconnected'; + } + } + + let response: string; + if (error.result) { + if (error.result === OperationResults.FailedOrRefused) { + response = 'hardware-wallet.general.refused'; + } else if (error.result === OperationResults.WrongPin) { + response = 'hardware-wallet.general.error-incorrect-pin'; + } else if (error.result === OperationResults.IncorrectHardwareWallet) { + response = 'hardware-wallet.general.error-incorrect-wallet'; + } else if (error.result === OperationResults.DaemonError) { + response = 'hardware-wallet.errors.daemon-connection'; + } else if (error.result === OperationResults.InvalidAddress) { + response = 'hardware-wallet.errors.invalid-address'; + } else if (error.result === OperationResults.Timeout) { + response = 'hardware-wallet.errors.timeout'; + } else if (error.result === OperationResults.Disconnected) { + response = 'hardware-wallet.general.error-disconnected'; + } else if (error.result === OperationResults.NotInBootloaderMode) { + response = 'hardware-wallet.errors.not-in-bootloader-mode'; + } else if (error.result === OperationResults.PinMismatch) { + response = 'hardware-wallet.change-pin.pin-mismatch'; + } else if (error.result === OperationResults.WrongWord) { + response = 'hardware-wallet.restore-seed.error-wrong-word'; + } else if (error.result === OperationResults.InvalidSeed) { + response = 'hardware-wallet.restore-seed.error-invalid-seed'; + } else if (error.result === OperationResults.WrongSeed) { + response = 'hardware-wallet.restore-seed.error-wrong-seed'; + } else { + response = genericError ? genericError : 'hardware-wallet.general.generic-error'; + } + } else { + response = genericError ? genericError : 'hardware-wallet.general.generic-error'; + } + + if (translateService) { + return translateService.instant(response); + } else { + return response; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/utils/index.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/utils/index.ts new file mode 100644 index 00000000..d3074666 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/utils/index.ts @@ -0,0 +1,40 @@ +import { MatDialog, MatDialogConfig, MatDialogRef } from '@angular/material'; +import { Observable } from 'rxjs/Observable'; + +import { ConfirmationData } from '../app.datatypes'; +import { ConfirmationComponent } from '../components/layout/confirmation/confirmation.component'; +import { SelectLanguageComponent } from '../components/layout/select-language/select-language.component'; + +export function showConfirmationModal(dialog: MatDialog, confirmationData: ConfirmationData): MatDialogRef { + return dialog.open(ConfirmationComponent, { + width: '450px', + data: confirmationData, + autoFocus: false, + }); +} + +export function openChangeLanguageModal(dialog: MatDialog, disableClose = false): Observable { + const config = new MatDialogConfig(); + config.width = '600px'; + config.disableClose = disableClose; + config.autoFocus = false; + + return dialog.open(SelectLanguageComponent, config).afterClosed(); +} + +export function copyTextToClipboard(text: string) { + const selBox = document.createElement('textarea'); + + selBox.style.position = 'fixed'; + selBox.style.left = '0'; + selBox.style.top = '0'; + selBox.style.opacity = '0'; + selBox.value = text; + + document.body.appendChild(selBox); + selBox.focus(); + selBox.select(); + + document.execCommand('copy'); + document.body.removeChild(selBox); +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/utils/semver.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/utils/semver.spec.ts new file mode 100644 index 00000000..df9974e3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/utils/semver.spec.ts @@ -0,0 +1,17 @@ +import { shouldUpgradeVersion } from './semver'; + +fdescribe('semver', () => { + it('correctly compares versions', () => { + expect(shouldUpgradeVersion('0.23.0', '0.22.0')).toBeFalsy(); + expect(shouldUpgradeVersion('0.23.0', '0.23.0')).toBeFalsy(); + expect(shouldUpgradeVersion('0.23.0', '0.23.1')).toBeTruthy(); + expect(shouldUpgradeVersion('0.23.1', '0.24.0')).toBeTruthy(); + expect(shouldUpgradeVersion('0.24.0', '1.0.0')).toBeTruthy(); + }); + + it('correctly handles rc versions', () => { + expect(shouldUpgradeVersion('0.23.1-rc.1', '0.23.0')).toBeFalsy(); + expect(shouldUpgradeVersion('0.23.1-rc.1', '0.23.1')).toBeTruthy(); + expect(shouldUpgradeVersion('0.23.1-rc.1', '0.23.2')).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/utils/semver.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/utils/semver.ts new file mode 100644 index 00000000..4c13ea1b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/utils/semver.ts @@ -0,0 +1,28 @@ +/** + * Compares two SemVer versions, returns true if 'from' is smaller than 'to'. + * Special cases with 'rc' suffix are described in spec file. + * + * @returns {boolean} + * @param from + * @param to + */ +export function shouldUpgradeVersion(from: string, to: string): boolean { + const toParts = to.split('.'); + const fromSplit = from.split('-'); + const fromParts = fromSplit[0].split('.'); + + for (let i = 0; i < 3; i++) { + const toNumber = Number(toParts[i]); + const fromNumber = Number(fromParts[i]); + + if (toNumber > fromNumber) { + return true; + } + + if (toNumber < fromNumber) { + return false; + } + } + + return fromSplit.length === 2 && fromSplit[1].indexOf('rc') !== -1; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/utils/tx-encoder.spec.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/utils/tx-encoder.spec.ts new file mode 100644 index 00000000..c2d88e82 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/utils/tx-encoder.spec.ts @@ -0,0 +1,15 @@ +import { readJSON } from 'karma-read-json'; +import { TxEncoder } from './tx-encoder'; + +fdescribe('TxEncoder', () => { + + describe('check encoding', () => { + const txs = readJSON('test-fixtures/encoded-txs.json').txs; + + for (let i = 0; i < txs.length; i++) { + it('encode tx ' + i, () => { + expect(TxEncoder.encode(txs[i].inputs, txs[i].outputs, txs[i].signatures, txs[i].innerHash)).toBe(txs[i].raw); + }); + } + }); +}); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/utils/tx-encoder.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/utils/tx-encoder.ts new file mode 100644 index 00000000..c5a113dd --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/app/utils/tx-encoder.ts @@ -0,0 +1,182 @@ +import * as Base58 from 'base-x'; +import BigNumber from 'bignumber.js'; +import { Input, Output } from '../services/hw-wallet.service'; + +export class TxEncoder { + static encode(inputs: Input[], outputs: Output[], signatures: string[], innerHash: string, transactionType = 0) { + if (inputs.length !== signatures.length) { + throw new Error('Invalid number of signatures.'); + } + + const transactionSize = this.encodeSizeTransaction(inputs, outputs, signatures).toNumber(); + const buffer = new ArrayBuffer(transactionSize); + const dataView = new DataView(buffer); + let currentPos = 0; + + // Tx length + dataView.setUint32(currentPos, transactionSize, true); + currentPos += 4; + + // Tx type + dataView.setUint8(currentPos, transactionType); + currentPos += 1; + + // Tx innerHash + const innerHashBytes = this.convertToBytes(innerHash); + innerHashBytes.forEach(number => { + dataView.setUint8(currentPos, number); + currentPos += 1; + }); + + // Tx sigs maxlen check + if (signatures.length > 65535) { + throw new Error('Too many signatures.'); + } + + // Tx sigs length + dataView.setUint32(currentPos, signatures.length, true); + currentPos += 4; + + // Tx sigs + (signatures as string[]).forEach(sig => { + // Copy all bytes + const binarySig = this.convertToBytes(sig); + binarySig.forEach(number => { + dataView.setUint8(currentPos, number); + currentPos += 1; + }); + }); + + // Tx inputs maxlen check + if (inputs.length > 65535) { + throw new Error('Too many inputs.'); + } + + // Tx inputs length + dataView.setUint32(currentPos, inputs.length, true); + currentPos += 4; + + // Tx inputs + inputs.forEach(input => { + // Copy all bytes + const binaryInput = this.convertToBytes(input.hashIn); + binaryInput.forEach(number => { + dataView.setUint8(currentPos, number); + currentPos += 1; + }); + }); + + // Tx outputs maxlen check + if (outputs.length > 65535) { + throw new Error('Too many outputs.'); + } + + // Tx outputs length + dataView.setUint32(currentPos, outputs.length, true); + currentPos += 4; + + const decoder = Base58('123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'); + + // Tx outputs + outputs.forEach(output => { + // Decode the address + const decodedAddress = decoder.decode(output.address); + + // Address version + dataView.setUint8(currentPos, decodedAddress[20]); + currentPos += 1; + + // Address Key + for (let i = 0; i < 20; i++) { + dataView.setUint8(currentPos, decodedAddress[i]); + currentPos += 1; + } + + // Coins + currentPos = this.setUint64(dataView, currentPos, new BigNumber(output.coin)); + // Hours + currentPos = this.setUint64(dataView, currentPos, new BigNumber(output.hour)); + }); + + // + + return this.convertToHex(buffer); + } + + private static encodeSizeTransaction(inputs: Input[], outputs: Output[], signatures: string[]): BigNumber { + let size = new BigNumber(0); + + // Tx length + size = size.plus(4); + + // Tx type + size = size.plus(1); + + // Tx innerHash + size = size.plus(32); + + // Tx sigs + size = size.plus(4); + size = size.plus((new BigNumber(65).multipliedBy(signatures.length))); + + // Tx inputs + size = size.plus(4); + size = size.plus((new BigNumber(32).multipliedBy(inputs.length))); + + // Tx outputs + size = size.plus(4); + size = size.plus((new BigNumber(37).multipliedBy(outputs.length))); + + return size; + } + + private static setUint64(dataView: DataView, currentPos: number, value: BigNumber): number { + let hex = value.toString(16); + if (hex.length % 2 !== 0) { + hex = '0' + hex; + } + + const bytes = this.convertToBytes(hex); + for (let i = bytes.length - 1; i >= 0; i--) { + dataView.setUint8(currentPos, bytes[i]); + currentPos += 1; + } + + for (let i = 0; i < 8 - bytes.length; i++) { + dataView.setUint8(currentPos, 0); + currentPos += 1; + } + + return currentPos; + } + + private static convertToBytes(hexString: string): number[] { + if (hexString.length % 2 !== 0) { + throw new Error('Invalid hex string.'); + } + + const result: number[] = []; + + for (let i = 0; i < hexString.length; i += 2) { + result.push(parseInt(hexString.substr(i, 2), 16)); + } + + return result; + } + + private static convertToHex(buffer: ArrayBuffer) { + let result = ''; + + (new Uint8Array(buffer)).forEach((v) => { + let val = v.toString(16); + if (val.length === 0) { + val = '00'; + } else if (val.length === 1) { + val = '0' + val; + } + result += val; + }); + + return result; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/.gitkeep b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/bip39-word-list.json b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/bip39-word-list.json new file mode 100644 index 00000000..c4956547 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/bip39-word-list.json @@ -0,0 +1,2049 @@ +{ "list": ["abandon", +"ability", +"able", +"about", +"above", +"absent", +"absorb", +"abstract", +"absurd", +"abuse", +"access", +"accident", +"account", +"accuse", +"achieve", +"acid", +"acoustic", +"acquire", +"across", +"act", +"action", +"actor", +"actress", +"actual", +"adapt", +"add", +"addict", +"address", +"adjust", +"admit", +"adult", +"advance", +"advice", +"aerobic", +"affair", +"afford", +"afraid", +"again", +"age", +"agent", +"agree", +"ahead", +"aim", +"air", +"airport", +"aisle", +"alarm", +"album", +"alcohol", +"alert", +"alien", +"all", +"alley", +"allow", +"almost", +"alone", +"alpha", +"already", +"also", +"alter", +"always", +"amateur", +"amazing", +"among", +"amount", +"amused", +"analyst", +"anchor", +"ancient", +"anger", +"angle", +"angry", +"animal", +"ankle", +"announce", +"annual", +"another", +"answer", +"antenna", +"antique", +"anxiety", +"any", +"apart", +"apology", +"appear", +"apple", +"approve", +"april", +"arch", +"arctic", +"area", +"arena", +"argue", +"arm", +"armed", +"armor", +"army", +"around", +"arrange", +"arrest", +"arrive", +"arrow", +"art", +"artefact", +"artist", +"artwork", +"ask", +"aspect", +"assault", +"asset", +"assist", +"assume", +"asthma", +"athlete", +"atom", +"attack", +"attend", +"attitude", +"attract", +"auction", +"audit", +"august", +"aunt", +"author", +"auto", +"autumn", +"average", +"avocado", +"avoid", +"awake", +"aware", +"away", +"awesome", +"awful", +"awkward", +"axis", +"baby", +"bachelor", +"bacon", +"badge", +"bag", +"balance", +"balcony", +"ball", +"bamboo", +"banana", +"banner", +"bar", +"barely", +"bargain", +"barrel", +"base", +"basic", +"basket", +"battle", +"beach", +"bean", +"beauty", +"because", +"become", +"beef", +"before", +"begin", +"behave", +"behind", +"believe", +"below", +"belt", +"bench", +"benefit", +"best", +"betray", +"better", +"between", +"beyond", +"bicycle", +"bid", +"bike", +"bind", +"biology", +"bird", +"birth", +"bitter", +"black", +"blade", +"blame", +"blanket", +"blast", +"bleak", +"bless", +"blind", +"blood", +"blossom", +"blouse", +"blue", +"blur", +"blush", +"board", +"boat", +"body", +"boil", +"bomb", +"bone", +"bonus", +"book", +"boost", +"border", +"boring", +"borrow", +"boss", +"bottom", +"bounce", +"box", +"boy", +"bracket", +"brain", +"brand", +"brass", +"brave", +"bread", +"breeze", +"brick", +"bridge", +"brief", +"bright", +"bring", +"brisk", +"broccoli", +"broken", +"bronze", +"broom", +"brother", +"brown", +"brush", +"bubble", +"buddy", +"budget", +"buffalo", +"build", +"bulb", +"bulk", +"bullet", +"bundle", +"bunker", +"burden", +"burger", +"burst", +"bus", +"business", +"busy", +"butter", +"buyer", +"buzz", +"cabbage", +"cabin", +"cable", +"cactus", +"cage", +"cake", +"call", +"calm", +"camera", +"camp", +"can", +"canal", +"cancel", +"candy", +"cannon", +"canoe", +"canvas", +"canyon", +"capable", +"capital", +"captain", +"car", +"carbon", +"card", +"cargo", +"carpet", +"carry", +"cart", +"case", +"cash", +"casino", +"castle", +"casual", +"cat", +"catalog", +"catch", +"category", +"cattle", +"caught", +"cause", +"caution", +"cave", +"ceiling", +"celery", +"cement", +"census", +"century", +"cereal", +"certain", +"chair", +"chalk", +"champion", +"change", +"chaos", +"chapter", +"charge", +"chase", +"chat", +"cheap", +"check", +"cheese", +"chef", +"cherry", +"chest", +"chicken", +"chief", +"child", +"chimney", +"choice", +"choose", +"chronic", +"chuckle", +"chunk", +"churn", +"cigar", +"cinnamon", +"circle", +"citizen", +"city", +"civil", +"claim", +"clap", +"clarify", +"claw", +"clay", +"clean", +"clerk", +"clever", +"click", +"client", +"cliff", +"climb", +"clinic", +"clip", +"clock", +"clog", +"close", +"cloth", +"cloud", +"clown", +"club", +"clump", +"cluster", +"clutch", +"coach", +"coast", +"coconut", +"code", +"coffee", +"coil", +"coin", +"collect", +"color", +"column", +"combine", +"come", +"comfort", +"comic", +"common", +"company", +"concert", +"conduct", +"confirm", +"congress", +"connect", +"consider", +"control", +"convince", +"cook", +"cool", +"copper", +"copy", +"coral", +"core", +"corn", +"correct", +"cost", +"cotton", +"couch", +"country", +"couple", +"course", +"cousin", +"cover", +"coyote", +"crack", +"cradle", +"craft", +"cram", +"crane", +"crash", +"crater", +"crawl", +"crazy", +"cream", +"credit", +"creek", +"crew", +"cricket", +"crime", +"crisp", +"critic", +"crop", +"cross", +"crouch", +"crowd", +"crucial", +"cruel", +"cruise", +"crumble", +"crunch", +"crush", +"cry", +"crystal", +"cube", +"culture", +"cup", +"cupboard", +"curious", +"current", +"curtain", +"curve", +"cushion", +"custom", +"cute", +"cycle", +"dad", +"damage", +"damp", +"dance", +"danger", +"daring", +"dash", +"daughter", +"dawn", +"day", +"deal", +"debate", +"debris", +"decade", +"december", +"decide", +"decline", +"decorate", +"decrease", +"deer", +"defense", +"define", +"defy", +"degree", +"delay", +"deliver", +"demand", +"demise", +"denial", +"dentist", +"deny", +"depart", +"depend", +"deposit", +"depth", +"deputy", +"derive", +"describe", +"desert", +"design", +"desk", +"despair", +"destroy", +"detail", +"detect", +"develop", +"device", +"devote", +"diagram", +"dial", +"diamond", +"diary", +"dice", +"diesel", +"diet", +"differ", +"digital", +"dignity", +"dilemma", +"dinner", +"dinosaur", +"direct", +"dirt", +"disagree", +"discover", +"disease", +"dish", +"dismiss", +"disorder", +"display", +"distance", +"divert", +"divide", +"divorce", +"dizzy", +"doctor", +"document", +"dog", +"doll", +"dolphin", +"domain", +"donate", +"donkey", +"donor", +"door", +"dose", +"double", +"dove", +"draft", +"dragon", +"drama", +"drastic", +"draw", +"dream", +"dress", +"drift", +"drill", +"drink", +"drip", +"drive", +"drop", +"drum", +"dry", +"duck", +"dumb", +"dune", +"during", +"dust", +"dutch", +"duty", +"dwarf", +"dynamic", +"eager", +"eagle", +"early", +"earn", +"earth", +"easily", +"east", +"easy", +"echo", +"ecology", +"economy", +"edge", +"edit", +"educate", +"effort", +"egg", +"eight", +"either", +"elbow", +"elder", +"electric", +"elegant", +"element", +"elephant", +"elevator", +"elite", +"else", +"embark", +"embody", +"embrace", +"emerge", +"emotion", +"employ", +"empower", +"empty", +"enable", +"enact", +"end", +"endless", +"endorse", +"enemy", +"energy", +"enforce", +"engage", +"engine", +"enhance", +"enjoy", +"enlist", +"enough", +"enrich", +"enroll", +"ensure", +"enter", +"entire", +"entry", +"envelope", +"episode", +"equal", +"equip", +"era", +"erase", +"erode", +"erosion", +"error", +"erupt", +"escape", +"essay", +"essence", +"estate", +"eternal", +"ethics", +"evidence", +"evil", +"evoke", +"evolve", +"exact", +"example", +"excess", +"exchange", +"excite", +"exclude", +"excuse", +"execute", +"exercise", +"exhaust", +"exhibit", +"exile", +"exist", +"exit", +"exotic", +"expand", +"expect", +"expire", +"explain", +"expose", +"express", +"extend", +"extra", +"eye", +"eyebrow", +"fabric", +"face", +"faculty", +"fade", +"faint", +"faith", +"fall", +"false", +"fame", +"family", +"famous", +"fan", +"fancy", +"fantasy", +"farm", +"fashion", +"fat", +"fatal", +"father", +"fatigue", +"fault", +"favorite", +"feature", +"february", +"federal", +"fee", +"feed", +"feel", +"female", +"fence", +"festival", +"fetch", +"fever", +"few", +"fiber", +"fiction", +"field", +"figure", +"file", +"film", +"filter", +"final", +"find", +"fine", +"finger", +"finish", +"fire", +"firm", +"first", +"fiscal", +"fish", +"fit", +"fitness", +"fix", +"flag", +"flame", +"flash", +"flat", +"flavor", +"flee", +"flight", +"flip", +"float", +"flock", +"floor", +"flower", +"fluid", +"flush", +"fly", +"foam", +"focus", +"fog", +"foil", +"fold", +"follow", +"food", +"foot", +"force", +"forest", +"forget", +"fork", +"fortune", +"forum", +"forward", +"fossil", +"foster", +"found", +"fox", +"fragile", +"frame", +"frequent", +"fresh", +"friend", +"fringe", +"frog", +"front", +"frost", +"frown", +"frozen", +"fruit", +"fuel", +"fun", +"funny", +"furnace", +"fury", +"future", +"gadget", +"gain", +"galaxy", +"gallery", +"game", +"gap", +"garage", +"garbage", +"garden", +"garlic", +"garment", +"gas", +"gasp", +"gate", +"gather", +"gauge", +"gaze", +"general", +"genius", +"genre", +"gentle", +"genuine", +"gesture", +"ghost", +"giant", +"gift", +"giggle", +"ginger", +"giraffe", +"girl", +"give", +"glad", +"glance", +"glare", +"glass", +"glide", +"glimpse", +"globe", +"gloom", +"glory", +"glove", +"glow", +"glue", +"goat", +"goddess", +"gold", +"good", +"goose", +"gorilla", +"gospel", +"gossip", +"govern", +"gown", +"grab", +"grace", +"grain", +"grant", +"grape", +"grass", +"gravity", +"great", +"green", +"grid", +"grief", +"grit", +"grocery", +"group", +"grow", +"grunt", +"guard", +"guess", +"guide", +"guilt", +"guitar", +"gun", +"gym", +"habit", +"hair", +"half", +"hammer", +"hamster", +"hand", +"happy", +"harbor", +"hard", +"harsh", +"harvest", +"hat", +"have", +"hawk", +"hazard", +"head", +"health", +"heart", +"heavy", +"hedgehog", +"height", +"hello", +"helmet", +"help", +"hen", +"hero", +"hidden", +"high", +"hill", +"hint", +"hip", +"hire", +"history", +"hobby", +"hockey", +"hold", +"hole", +"holiday", +"hollow", +"home", +"honey", +"hood", +"hope", +"horn", +"horror", +"horse", +"hospital", +"host", +"hotel", +"hour", +"hover", +"hub", +"huge", +"human", +"humble", +"humor", +"hundred", +"hungry", +"hunt", +"hurdle", +"hurry", +"hurt", +"husband", +"hybrid", +"ice", +"icon", +"idea", +"identify", +"idle", +"ignore", +"ill", +"illegal", +"illness", +"image", +"imitate", +"immense", +"immune", +"impact", +"impose", +"improve", +"impulse", +"inch", +"include", +"income", +"increase", +"index", +"indicate", +"indoor", +"industry", +"infant", +"inflict", +"inform", +"inhale", +"inherit", +"initial", +"inject", +"injury", +"inmate", +"inner", +"innocent", +"input", +"inquiry", +"insane", +"insect", +"inside", +"inspire", +"install", +"intact", +"interest", +"into", +"invest", +"invite", +"involve", +"iron", +"island", +"isolate", +"issue", +"item", +"ivory", +"jacket", +"jaguar", +"jar", +"jazz", +"jealous", +"jeans", +"jelly", +"jewel", +"job", +"join", +"joke", +"journey", +"joy", +"judge", +"juice", +"jump", +"jungle", +"junior", +"junk", +"just", +"kangaroo", +"keen", +"keep", +"ketchup", +"key", +"kick", +"kid", +"kidney", +"kind", +"kingdom", +"kiss", +"kit", +"kitchen", +"kite", +"kitten", +"kiwi", +"knee", +"knife", +"knock", +"know", +"lab", +"label", +"labor", +"ladder", +"lady", +"lake", +"lamp", +"language", +"laptop", +"large", +"later", +"latin", +"laugh", +"laundry", +"lava", +"law", +"lawn", +"lawsuit", +"layer", +"lazy", +"leader", +"leaf", +"learn", +"leave", +"lecture", +"left", +"leg", +"legal", +"legend", +"leisure", +"lemon", +"lend", +"length", +"lens", +"leopard", +"lesson", +"letter", +"level", +"liar", +"liberty", +"library", +"license", +"life", +"lift", +"light", +"like", +"limb", +"limit", +"link", +"lion", +"liquid", +"list", +"little", +"live", +"lizard", +"load", +"loan", +"lobster", +"local", +"lock", +"logic", +"lonely", +"long", +"loop", +"lottery", +"loud", +"lounge", +"love", +"loyal", +"lucky", +"luggage", +"lumber", +"lunar", +"lunch", +"luxury", +"lyrics", +"machine", +"mad", +"magic", +"magnet", +"maid", +"mail", +"main", +"major", +"make", +"mammal", +"man", +"manage", +"mandate", +"mango", +"mansion", +"manual", +"maple", +"marble", +"march", +"margin", +"marine", +"market", +"marriage", +"mask", +"mass", +"master", +"match", +"material", +"math", +"matrix", +"matter", +"maximum", +"maze", +"meadow", +"mean", +"measure", +"meat", +"mechanic", +"medal", +"media", +"melody", +"melt", +"member", +"memory", +"mention", +"menu", +"mercy", +"merge", +"merit", +"merry", +"mesh", +"message", +"metal", +"method", +"middle", +"midnight", +"milk", +"million", +"mimic", +"mind", +"minimum", +"minor", +"minute", +"miracle", +"mirror", +"misery", +"miss", +"mistake", +"mix", +"mixed", +"mixture", +"mobile", +"model", +"modify", +"mom", +"moment", +"monitor", +"monkey", +"monster", +"month", +"moon", +"moral", +"more", +"morning", +"mosquito", +"mother", +"motion", +"motor", +"mountain", +"mouse", +"move", +"movie", +"much", +"muffin", +"mule", +"multiply", +"muscle", +"museum", +"mushroom", +"music", +"must", +"mutual", +"myself", +"mystery", +"myth", +"naive", +"name", +"napkin", +"narrow", +"nasty", +"nation", +"nature", +"near", +"neck", +"need", +"negative", +"neglect", +"neither", +"nephew", +"nerve", +"nest", +"net", +"network", +"neutral", +"never", +"news", +"next", +"nice", +"night", +"noble", +"noise", +"nominee", +"noodle", +"normal", +"north", +"nose", +"notable", +"note", +"nothing", +"notice", +"novel", +"now", +"nuclear", +"number", +"nurse", +"nut", +"oak", +"obey", +"object", +"oblige", +"obscure", +"observe", +"obtain", +"obvious", +"occur", +"ocean", +"october", +"odor", +"off", +"offer", +"office", +"often", +"oil", +"okay", +"old", +"olive", +"olympic", +"omit", +"once", +"one", +"onion", +"online", +"only", +"open", +"opera", +"opinion", +"oppose", +"option", +"orange", +"orbit", +"orchard", +"order", +"ordinary", +"organ", +"orient", +"original", +"orphan", +"ostrich", +"other", +"outdoor", +"outer", +"output", +"outside", +"oval", +"oven", +"over", +"own", +"owner", +"oxygen", +"oyster", +"ozone", +"pact", +"paddle", +"page", +"pair", +"palace", +"palm", +"panda", +"panel", +"panic", +"panther", +"paper", +"parade", +"parent", +"park", +"parrot", +"party", +"pass", +"patch", +"path", +"patient", +"patrol", +"pattern", +"pause", +"pave", +"payment", +"peace", +"peanut", +"pear", +"peasant", +"pelican", +"pen", +"penalty", +"pencil", +"people", +"pepper", +"perfect", +"permit", +"person", +"pet", +"phone", +"photo", +"phrase", +"physical", +"piano", +"picnic", +"picture", +"piece", +"pig", +"pigeon", +"pill", +"pilot", +"pink", +"pioneer", +"pipe", +"pistol", +"pitch", +"pizza", +"place", +"planet", +"plastic", +"plate", +"play", +"please", +"pledge", +"pluck", +"plug", +"plunge", +"poem", +"poet", +"point", +"polar", +"pole", +"police", +"pond", +"pony", +"pool", +"popular", +"portion", +"position", +"possible", +"post", +"potato", +"pottery", +"poverty", +"powder", +"power", +"practice", +"praise", +"predict", +"prefer", +"prepare", +"present", +"pretty", +"prevent", +"price", +"pride", +"primary", +"print", +"priority", +"prison", +"private", +"prize", +"problem", +"process", +"produce", +"profit", +"program", +"project", +"promote", +"proof", +"property", +"prosper", +"protect", +"proud", +"provide", +"public", +"pudding", +"pull", +"pulp", +"pulse", +"pumpkin", +"punch", +"pupil", +"puppy", +"purchase", +"purity", +"purpose", +"purse", +"push", +"put", +"puzzle", +"pyramid", +"quality", +"quantum", +"quarter", +"question", +"quick", +"quit", +"quiz", +"quote", +"rabbit", +"raccoon", +"race", +"rack", +"radar", +"radio", +"rail", +"rain", +"raise", +"rally", +"ramp", +"ranch", +"random", +"range", +"rapid", +"rare", +"rate", +"rather", +"raven", +"raw", +"razor", +"ready", +"real", +"reason", +"rebel", +"rebuild", +"recall", +"receive", +"recipe", +"record", +"recycle", +"reduce", +"reflect", +"reform", +"refuse", +"region", +"regret", +"regular", +"reject", +"relax", +"release", +"relief", +"rely", +"remain", +"remember", +"remind", +"remove", +"render", +"renew", +"rent", +"reopen", +"repair", +"repeat", +"replace", +"report", +"require", +"rescue", +"resemble", +"resist", +"resource", +"response", +"result", +"retire", +"retreat", +"return", +"reunion", +"reveal", +"review", +"reward", +"rhythm", +"rib", +"ribbon", +"rice", +"rich", +"ride", +"ridge", +"rifle", +"right", +"rigid", +"ring", +"riot", +"ripple", +"risk", +"ritual", +"rival", +"river", +"road", +"roast", +"robot", +"robust", +"rocket", +"romance", +"roof", +"rookie", +"room", +"rose", +"rotate", +"rough", +"round", +"route", +"royal", +"rubber", +"rude", +"rug", +"rule", +"run", +"runway", +"rural", +"sad", +"saddle", +"sadness", +"safe", +"sail", +"salad", +"salmon", +"salon", +"salt", +"salute", +"same", +"sample", +"sand", +"satisfy", +"satoshi", +"sauce", +"sausage", +"save", +"say", +"scale", +"scan", +"scare", +"scatter", +"scene", +"scheme", +"school", +"science", +"scissors", +"scorpion", +"scout", +"scrap", +"screen", +"script", +"scrub", +"sea", +"search", +"season", +"seat", +"second", +"secret", +"section", +"security", +"seed", +"seek", +"segment", +"select", +"sell", +"seminar", +"senior", +"sense", +"sentence", +"series", +"service", +"session", +"settle", +"setup", +"seven", +"shadow", +"shaft", +"shallow", +"share", +"shed", +"shell", +"sheriff", +"shield", +"shift", +"shine", +"ship", +"shiver", +"shock", +"shoe", +"shoot", +"shop", +"short", +"shoulder", +"shove", +"shrimp", +"shrug", +"shuffle", +"shy", +"sibling", +"sick", +"side", +"siege", +"sight", +"sign", +"silent", +"silk", +"silly", +"silver", +"similar", +"simple", +"since", +"sing", +"siren", +"sister", +"situate", +"six", +"size", +"skate", +"sketch", +"ski", +"skill", +"skin", +"skirt", +"skull", +"slab", +"slam", +"sleep", +"slender", +"slice", +"slide", +"slight", +"slim", +"slogan", +"slot", +"slow", +"slush", +"small", +"smart", +"smile", +"smoke", +"smooth", +"snack", +"snake", +"snap", +"sniff", +"snow", +"soap", +"soccer", +"social", +"sock", +"soda", +"soft", +"solar", +"soldier", +"solid", +"solution", +"solve", +"someone", +"song", +"soon", +"sorry", +"sort", +"soul", +"sound", +"soup", +"source", +"south", +"space", +"spare", +"spatial", +"spawn", +"speak", +"special", +"speed", +"spell", +"spend", +"sphere", +"spice", +"spider", +"spike", +"spin", +"spirit", +"split", +"spoil", +"sponsor", +"spoon", +"sport", +"spot", +"spray", +"spread", +"spring", +"spy", +"square", +"squeeze", +"squirrel", +"stable", +"stadium", +"staff", +"stage", +"stairs", +"stamp", +"stand", +"start", +"state", +"stay", +"steak", +"steel", +"stem", +"step", +"stereo", +"stick", +"still", +"sting", +"stock", +"stomach", +"stone", +"stool", +"story", +"stove", +"strategy", +"street", +"strike", +"strong", +"struggle", +"student", +"stuff", +"stumble", +"style", +"subject", +"submit", +"subway", +"success", +"such", +"sudden", +"suffer", +"sugar", +"suggest", +"suit", +"summer", +"sun", +"sunny", +"sunset", +"super", +"supply", +"supreme", +"sure", +"surface", +"surge", +"surprise", +"surround", +"survey", +"suspect", +"sustain", +"swallow", +"swamp", +"swap", +"swarm", +"swear", +"sweet", +"swift", +"swim", +"swing", +"switch", +"sword", +"symbol", +"symptom", +"syrup", +"system", +"table", +"tackle", +"tag", +"tail", +"talent", +"talk", +"tank", +"tape", +"target", +"task", +"taste", +"tattoo", +"taxi", +"teach", +"team", +"tell", +"ten", +"tenant", +"tennis", +"tent", +"term", +"test", +"text", +"thank", +"that", +"theme", +"then", +"theory", +"there", +"they", +"thing", +"this", +"thought", +"three", +"thrive", +"throw", +"thumb", +"thunder", +"ticket", +"tide", +"tiger", +"tilt", +"timber", +"time", +"tiny", +"tip", +"tired", +"tissue", +"title", +"toast", +"tobacco", +"today", +"toddler", +"toe", +"together", +"toilet", +"token", +"tomato", +"tomorrow", +"tone", +"tongue", +"tonight", +"tool", +"tooth", +"top", +"topic", +"topple", +"torch", +"tornado", +"tortoise", +"toss", +"total", +"tourist", +"toward", +"tower", +"town", +"toy", +"track", +"trade", +"traffic", +"tragic", +"train", +"transfer", +"trap", +"trash", +"travel", +"tray", +"treat", +"tree", +"trend", +"trial", +"tribe", +"trick", +"trigger", +"trim", +"trip", +"trophy", +"trouble", +"truck", +"true", +"truly", +"trumpet", +"trust", +"truth", +"try", +"tube", +"tuition", +"tumble", +"tuna", +"tunnel", +"turkey", +"turn", +"turtle", +"twelve", +"twenty", +"twice", +"twin", +"twist", +"two", +"type", +"typical", +"ugly", +"umbrella", +"unable", +"unaware", +"uncle", +"uncover", +"under", +"undo", +"unfair", +"unfold", +"unhappy", +"uniform", +"unique", +"unit", +"universe", +"unknown", +"unlock", +"until", +"unusual", +"unveil", +"update", +"upgrade", +"uphold", +"upon", +"upper", +"upset", +"urban", +"urge", +"usage", +"use", +"used", +"useful", +"useless", +"usual", +"utility", +"vacant", +"vacuum", +"vague", +"valid", +"valley", +"valve", +"van", +"vanish", +"vapor", +"various", +"vast", +"vault", +"vehicle", +"velvet", +"vendor", +"venture", +"venue", +"verb", +"verify", +"version", +"very", +"vessel", +"veteran", +"viable", +"vibrant", +"vicious", +"victory", +"video", +"view", +"village", +"vintage", +"violin", +"virtual", +"virus", +"visa", +"visit", +"visual", +"vital", +"vivid", +"vocal", +"voice", +"void", +"volcano", +"volume", +"vote", +"voyage", +"wage", +"wagon", +"wait", +"walk", +"wall", +"walnut", +"want", +"warfare", +"warm", +"warrior", +"wash", +"wasp", +"waste", +"water", +"wave", +"way", +"wealth", +"weapon", +"wear", +"weasel", +"weather", +"web", +"wedding", +"weekend", +"weird", +"welcome", +"west", +"wet", +"whale", +"what", +"wheat", +"wheel", +"when", +"where", +"whip", +"whisper", +"wide", +"width", +"wife", +"wild", +"will", +"win", +"window", +"wine", +"wing", +"wink", +"winner", +"winter", +"wire", +"wisdom", +"wise", +"wish", +"witness", +"wolf", +"woman", +"wonder", +"wood", +"wool", +"word", +"work", +"world", +"worry", +"worth", +"wrap", +"wreck", +"wrestle", +"wrist", +"write", +"wrong", +"yard", +"year", +"yellow", +"you", +"young", +"youth", +"zebra", +"zero", +"zone", +"zoo"] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/error-alert/big-error-icon.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/error-alert/big-error-icon.png new file mode 100644 index 00000000..bcbda0c2 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/error-alert/big-error-icon.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/error-alert/index.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/error-alert/index.html new file mode 100644 index 00000000..29d9dc9f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/error-alert/index.html @@ -0,0 +1,89 @@ + + + + + + + + +
+
+ +
+
+
+
+ + + + diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/material-icons/MaterialIcons-Regular.eot b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/material-icons/MaterialIcons-Regular.eot new file mode 100644 index 00000000..70508eba Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/material-icons/MaterialIcons-Regular.eot differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/material-icons/MaterialIcons-Regular.ijmap b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/material-icons/MaterialIcons-Regular.ijmap new file mode 100644 index 00000000..d9f1d259 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/material-icons/MaterialIcons-Regular.ijmap @@ -0,0 +1 @@ +{"icons":{"e84d":{"name":"3d Rotation"},"eb3b":{"name":"Ac Unit"},"e190":{"name":"Access Alarm"},"e191":{"name":"Access Alarms"},"e192":{"name":"Access Time"},"e84e":{"name":"Accessibility"},"e914":{"name":"Accessible"},"e84f":{"name":"Account Balance"},"e850":{"name":"Account Balance Wallet"},"e851":{"name":"Account Box"},"e853":{"name":"Account Circle"},"e60e":{"name":"Adb"},"e145":{"name":"Add"},"e439":{"name":"Add A Photo"},"e193":{"name":"Add Alarm"},"e003":{"name":"Add Alert"},"e146":{"name":"Add Box"},"e147":{"name":"Add Circle"},"e148":{"name":"Add Circle Outline"},"e567":{"name":"Add Location"},"e854":{"name":"Add Shopping Cart"},"e39d":{"name":"Add To Photos"},"e05c":{"name":"Add To Queue"},"e39e":{"name":"Adjust"},"e630":{"name":"Airline Seat Flat"},"e631":{"name":"Airline Seat Flat Angled"},"e632":{"name":"Airline Seat Individual Suite"},"e633":{"name":"Airline Seat Legroom Extra"},"e634":{"name":"Airline Seat Legroom Normal"},"e635":{"name":"Airline Seat Legroom Reduced"},"e636":{"name":"Airline Seat Recline Extra"},"e637":{"name":"Airline Seat Recline Normal"},"e195":{"name":"Airplanemode Active"},"e194":{"name":"Airplanemode Inactive"},"e055":{"name":"Airplay"},"eb3c":{"name":"Airport Shuttle"},"e855":{"name":"Alarm"},"e856":{"name":"Alarm Add"},"e857":{"name":"Alarm Off"},"e858":{"name":"Alarm On"},"e019":{"name":"Album"},"eb3d":{"name":"All Inclusive"},"e90b":{"name":"All Out"},"e859":{"name":"Android"},"e85a":{"name":"Announcement"},"e5c3":{"name":"Apps"},"e149":{"name":"Archive"},"e5c4":{"name":"Arrow Back"},"e5db":{"name":"Arrow Downward"},"e5c5":{"name":"Arrow Drop Down"},"e5c6":{"name":"Arrow Drop Down Circle"},"e5c7":{"name":"Arrow Drop Up"},"e5c8":{"name":"Arrow Forward"},"e5d8":{"name":"Arrow Upward"},"e060":{"name":"Art Track"},"e85b":{"name":"Aspect Ratio"},"e85c":{"name":"Assessment"},"e85d":{"name":"Assignment"},"e85e":{"name":"Assignment Ind"},"e85f":{"name":"Assignment Late"},"e860":{"name":"Assignment Return"},"e861":{"name":"Assignment Returned"},"e862":{"name":"Assignment Turned In"},"e39f":{"name":"Assistant"},"e3a0":{"name":"Assistant Photo"},"e226":{"name":"Attach File"},"e227":{"name":"Attach Money"},"e2bc":{"name":"Attachment"},"e3a1":{"name":"Audiotrack"},"e863":{"name":"Autorenew"},"e01b":{"name":"Av Timer"},"e14a":{"name":"Backspace"},"e864":{"name":"Backup"},"e19c":{"name":"Battery Alert"},"e1a3":{"name":"Battery Charging Full"},"e1a4":{"name":"Battery Full"},"e1a5":{"name":"Battery Std"},"e1a6":{"name":"Battery Unknown"},"eb3e":{"name":"Beach Access"},"e52d":{"name":"Beenhere"},"e14b":{"name":"Block"},"e1a7":{"name":"Bluetooth"},"e60f":{"name":"Bluetooth Audio"},"e1a8":{"name":"Bluetooth Connected"},"e1a9":{"name":"Bluetooth Disabled"},"e1aa":{"name":"Bluetooth Searching"},"e3a2":{"name":"Blur Circular"},"e3a3":{"name":"Blur Linear"},"e3a4":{"name":"Blur Off"},"e3a5":{"name":"Blur On"},"e865":{"name":"Book"},"e866":{"name":"Bookmark"},"e867":{"name":"Bookmark Border"},"e228":{"name":"Border All"},"e229":{"name":"Border Bottom"},"e22a":{"name":"Border Clear"},"e22b":{"name":"Border Color"},"e22c":{"name":"Border Horizontal"},"e22d":{"name":"Border Inner"},"e22e":{"name":"Border Left"},"e22f":{"name":"Border Outer"},"e230":{"name":"Border Right"},"e231":{"name":"Border Style"},"e232":{"name":"Border Top"},"e233":{"name":"Border Vertical"},"e06b":{"name":"Branding Watermark"},"e3a6":{"name":"Brightness 1"},"e3a7":{"name":"Brightness 2"},"e3a8":{"name":"Brightness 3"},"e3a9":{"name":"Brightness 4"},"e3aa":{"name":"Brightness 5"},"e3ab":{"name":"Brightness 6"},"e3ac":{"name":"Brightness 7"},"e1ab":{"name":"Brightness Auto"},"e1ac":{"name":"Brightness High"},"e1ad":{"name":"Brightness Low"},"e1ae":{"name":"Brightness Medium"},"e3ad":{"name":"Broken Image"},"e3ae":{"name":"Brush"},"e6dd":{"name":"Bubble Chart"},"e868":{"name":"Bug Report"},"e869":{"name":"Build"},"e43c":{"name":"Burst Mode"},"e0af":{"name":"Business"},"eb3f":{"name":"Business Center"},"e86a":{"name":"Cached"},"e7e9":{"name":"Cake"},"e0b0":{"name":"Call"},"e0b1":{"name":"Call End"},"e0b2":{"name":"Call Made"},"e0b3":{"name":"Call Merge"},"e0b4":{"name":"Call Missed"},"e0e4":{"name":"Call Missed Outgoing"},"e0b5":{"name":"Call Received"},"e0b6":{"name":"Call Split"},"e06c":{"name":"Call To Action"},"e3af":{"name":"Camera"},"e3b0":{"name":"Camera Alt"},"e8fc":{"name":"Camera Enhance"},"e3b1":{"name":"Camera Front"},"e3b2":{"name":"Camera Rear"},"e3b3":{"name":"Camera Roll"},"e5c9":{"name":"Cancel"},"e8f6":{"name":"Card Giftcard"},"e8f7":{"name":"Card Membership"},"e8f8":{"name":"Card Travel"},"eb40":{"name":"Casino"},"e307":{"name":"Cast"},"e308":{"name":"Cast Connected"},"e3b4":{"name":"Center Focus Strong"},"e3b5":{"name":"Center Focus Weak"},"e86b":{"name":"Change History"},"e0b7":{"name":"Chat"},"e0ca":{"name":"Chat Bubble"},"e0cb":{"name":"Chat Bubble Outline"},"e5ca":{"name":"Check"},"e834":{"name":"Check Box"},"e835":{"name":"Check Box Outline Blank"},"e86c":{"name":"Check Circle"},"e5cb":{"name":"Chevron Left"},"e5cc":{"name":"Chevron Right"},"eb41":{"name":"Child Care"},"eb42":{"name":"Child Friendly"},"e86d":{"name":"Chrome Reader Mode"},"e86e":{"name":"Class"},"e14c":{"name":"Clear"},"e0b8":{"name":"Clear All"},"e5cd":{"name":"Close"},"e01c":{"name":"Closed Caption"},"e2bd":{"name":"Cloud"},"e2be":{"name":"Cloud Circle"},"e2bf":{"name":"Cloud Done"},"e2c0":{"name":"Cloud Download"},"e2c1":{"name":"Cloud Off"},"e2c2":{"name":"Cloud Queue"},"e2c3":{"name":"Cloud Upload"},"e86f":{"name":"Code"},"e3b6":{"name":"Collections"},"e431":{"name":"Collections Bookmark"},"e3b7":{"name":"Color Lens"},"e3b8":{"name":"Colorize"},"e0b9":{"name":"Comment"},"e3b9":{"name":"Compare"},"e915":{"name":"Compare Arrows"},"e30a":{"name":"Computer"},"e638":{"name":"Confirmation Number"},"e0d0":{"name":"Contact Mail"},"e0cf":{"name":"Contact Phone"},"e0ba":{"name":"Contacts"},"e14d":{"name":"Content Copy"},"e14e":{"name":"Content Cut"},"e14f":{"name":"Content Paste"},"e3ba":{"name":"Control Point"},"e3bb":{"name":"Control Point Duplicate"},"e90c":{"name":"Copyright"},"e150":{"name":"Create"},"e2cc":{"name":"Create New Folder"},"e870":{"name":"Credit Card"},"e3be":{"name":"Crop"},"e3bc":{"name":"Crop 16 9"},"e3bd":{"name":"Crop 3 2"},"e3bf":{"name":"Crop 5 4"},"e3c0":{"name":"Crop 7 5"},"e3c1":{"name":"Crop Din"},"e3c2":{"name":"Crop Free"},"e3c3":{"name":"Crop Landscape"},"e3c4":{"name":"Crop Original"},"e3c5":{"name":"Crop Portrait"},"e437":{"name":"Crop Rotate"},"e3c6":{"name":"Crop Square"},"e871":{"name":"Dashboard"},"e1af":{"name":"Data Usage"},"e916":{"name":"Date Range"},"e3c7":{"name":"Dehaze"},"e872":{"name":"Delete"},"e92b":{"name":"Delete Forever"},"e16c":{"name":"Delete Sweep"},"e873":{"name":"Description"},"e30b":{"name":"Desktop Mac"},"e30c":{"name":"Desktop Windows"},"e3c8":{"name":"Details"},"e30d":{"name":"Developer Board"},"e1b0":{"name":"Developer Mode"},"e335":{"name":"Device Hub"},"e1b1":{"name":"Devices"},"e337":{"name":"Devices Other"},"e0bb":{"name":"Dialer Sip"},"e0bc":{"name":"Dialpad"},"e52e":{"name":"Directions"},"e52f":{"name":"Directions Bike"},"e532":{"name":"Directions Boat"},"e530":{"name":"Directions Bus"},"e531":{"name":"Directions Car"},"e534":{"name":"Directions Railway"},"e566":{"name":"Directions Run"},"e533":{"name":"Directions Subway"},"e535":{"name":"Directions Transit"},"e536":{"name":"Directions Walk"},"e610":{"name":"Disc Full"},"e875":{"name":"Dns"},"e612":{"name":"Do Not Disturb"},"e611":{"name":"Do Not Disturb Alt"},"e643":{"name":"Do Not Disturb Off"},"e644":{"name":"Do Not Disturb On"},"e30e":{"name":"Dock"},"e7ee":{"name":"Domain"},"e876":{"name":"Done"},"e877":{"name":"Done All"},"e917":{"name":"Donut Large"},"e918":{"name":"Donut Small"},"e151":{"name":"Drafts"},"e25d":{"name":"Drag Handle"},"e613":{"name":"Drive Eta"},"e1b2":{"name":"Dvr"},"e3c9":{"name":"Edit"},"e568":{"name":"Edit Location"},"e8fb":{"name":"Eject"},"e0be":{"name":"Email"},"e63f":{"name":"Enhanced Encryption"},"e01d":{"name":"Equalizer"},"e000":{"name":"Error"},"e001":{"name":"Error Outline"},"e926":{"name":"Euro Symbol"},"e56d":{"name":"Ev Station"},"e878":{"name":"Event"},"e614":{"name":"Event Available"},"e615":{"name":"Event Busy"},"e616":{"name":"Event Note"},"e903":{"name":"Event Seat"},"e879":{"name":"Exit To App"},"e5ce":{"name":"Expand Less"},"e5cf":{"name":"Expand More"},"e01e":{"name":"Explicit"},"e87a":{"name":"Explore"},"e3ca":{"name":"Exposure"},"e3cb":{"name":"Exposure Neg 1"},"e3cc":{"name":"Exposure Neg 2"},"e3cd":{"name":"Exposure Plus 1"},"e3ce":{"name":"Exposure Plus 2"},"e3cf":{"name":"Exposure Zero"},"e87b":{"name":"Extension"},"e87c":{"name":"Face"},"e01f":{"name":"Fast Forward"},"e020":{"name":"Fast Rewind"},"e87d":{"name":"Favorite"},"e87e":{"name":"Favorite Border"},"e06d":{"name":"Featured Play List"},"e06e":{"name":"Featured Video"},"e87f":{"name":"Feedback"},"e05d":{"name":"Fiber Dvr"},"e061":{"name":"Fiber Manual Record"},"e05e":{"name":"Fiber New"},"e06a":{"name":"Fiber Pin"},"e062":{"name":"Fiber Smart Record"},"e2c4":{"name":"File Download"},"e2c6":{"name":"File Upload"},"e3d3":{"name":"Filter"},"e3d0":{"name":"Filter 1"},"e3d1":{"name":"Filter 2"},"e3d2":{"name":"Filter 3"},"e3d4":{"name":"Filter 4"},"e3d5":{"name":"Filter 5"},"e3d6":{"name":"Filter 6"},"e3d7":{"name":"Filter 7"},"e3d8":{"name":"Filter 8"},"e3d9":{"name":"Filter 9"},"e3da":{"name":"Filter 9 Plus"},"e3db":{"name":"Filter B And W"},"e3dc":{"name":"Filter Center Focus"},"e3dd":{"name":"Filter Drama"},"e3de":{"name":"Filter Frames"},"e3df":{"name":"Filter Hdr"},"e152":{"name":"Filter List"},"e3e0":{"name":"Filter None"},"e3e2":{"name":"Filter Tilt Shift"},"e3e3":{"name":"Filter Vintage"},"e880":{"name":"Find In Page"},"e881":{"name":"Find Replace"},"e90d":{"name":"Fingerprint"},"e5dc":{"name":"First Page"},"eb43":{"name":"Fitness Center"},"e153":{"name":"Flag"},"e3e4":{"name":"Flare"},"e3e5":{"name":"Flash Auto"},"e3e6":{"name":"Flash Off"},"e3e7":{"name":"Flash On"},"e539":{"name":"Flight"},"e904":{"name":"Flight Land"},"e905":{"name":"Flight Takeoff"},"e3e8":{"name":"Flip"},"e882":{"name":"Flip To Back"},"e883":{"name":"Flip To Front"},"e2c7":{"name":"Folder"},"e2c8":{"name":"Folder Open"},"e2c9":{"name":"Folder Shared"},"e617":{"name":"Folder Special"},"e167":{"name":"Font Download"},"e234":{"name":"Format Align Center"},"e235":{"name":"Format Align Justify"},"e236":{"name":"Format Align Left"},"e237":{"name":"Format Align Right"},"e238":{"name":"Format Bold"},"e239":{"name":"Format Clear"},"e23a":{"name":"Format Color Fill"},"e23b":{"name":"Format Color Reset"},"e23c":{"name":"Format Color Text"},"e23d":{"name":"Format Indent Decrease"},"e23e":{"name":"Format Indent Increase"},"e23f":{"name":"Format Italic"},"e240":{"name":"Format Line Spacing"},"e241":{"name":"Format List Bulleted"},"e242":{"name":"Format List Numbered"},"e243":{"name":"Format Paint"},"e244":{"name":"Format Quote"},"e25e":{"name":"Format Shapes"},"e245":{"name":"Format Size"},"e246":{"name":"Format Strikethrough"},"e247":{"name":"Format Textdirection L To R"},"e248":{"name":"Format Textdirection R To L"},"e249":{"name":"Format Underlined"},"e0bf":{"name":"Forum"},"e154":{"name":"Forward"},"e056":{"name":"Forward 10"},"e057":{"name":"Forward 30"},"e058":{"name":"Forward 5"},"eb44":{"name":"Free Breakfast"},"e5d0":{"name":"Fullscreen"},"e5d1":{"name":"Fullscreen Exit"},"e24a":{"name":"Functions"},"e927":{"name":"G Translate"},"e30f":{"name":"Gamepad"},"e021":{"name":"Games"},"e90e":{"name":"Gavel"},"e155":{"name":"Gesture"},"e884":{"name":"Get App"},"e908":{"name":"Gif"},"eb45":{"name":"Golf Course"},"e1b3":{"name":"Gps Fixed"},"e1b4":{"name":"Gps Not Fixed"},"e1b5":{"name":"Gps Off"},"e885":{"name":"Grade"},"e3e9":{"name":"Gradient"},"e3ea":{"name":"Grain"},"e1b8":{"name":"Graphic Eq"},"e3eb":{"name":"Grid Off"},"e3ec":{"name":"Grid On"},"e7ef":{"name":"Group"},"e7f0":{"name":"Group Add"},"e886":{"name":"Group Work"},"e052":{"name":"Hd"},"e3ed":{"name":"Hdr Off"},"e3ee":{"name":"Hdr On"},"e3f1":{"name":"Hdr Strong"},"e3f2":{"name":"Hdr Weak"},"e310":{"name":"Headset"},"e311":{"name":"Headset Mic"},"e3f3":{"name":"Healing"},"e023":{"name":"Hearing"},"e887":{"name":"Help"},"e8fd":{"name":"Help Outline"},"e024":{"name":"High Quality"},"e25f":{"name":"Highlight"},"e888":{"name":"Highlight Off"},"e889":{"name":"History"},"e88a":{"name":"Home"},"eb46":{"name":"Hot Tub"},"e53a":{"name":"Hotel"},"e88b":{"name":"Hourglass Empty"},"e88c":{"name":"Hourglass Full"},"e902":{"name":"Http"},"e88d":{"name":"Https"},"e3f4":{"name":"Image"},"e3f5":{"name":"Image Aspect Ratio"},"e0e0":{"name":"Import Contacts"},"e0c3":{"name":"Import Export"},"e912":{"name":"Important Devices"},"e156":{"name":"Inbox"},"e909":{"name":"Indeterminate Check Box"},"e88e":{"name":"Info"},"e88f":{"name":"Info Outline"},"e890":{"name":"Input"},"e24b":{"name":"Insert Chart"},"e24c":{"name":"Insert Comment"},"e24d":{"name":"Insert Drive File"},"e24e":{"name":"Insert Emoticon"},"e24f":{"name":"Insert Invitation"},"e250":{"name":"Insert Link"},"e251":{"name":"Insert Photo"},"e891":{"name":"Invert Colors"},"e0c4":{"name":"Invert Colors Off"},"e3f6":{"name":"Iso"},"e312":{"name":"Keyboard"},"e313":{"name":"Keyboard Arrow Down"},"e314":{"name":"Keyboard Arrow Left"},"e315":{"name":"Keyboard Arrow Right"},"e316":{"name":"Keyboard Arrow Up"},"e317":{"name":"Keyboard Backspace"},"e318":{"name":"Keyboard Capslock"},"e31a":{"name":"Keyboard Hide"},"e31b":{"name":"Keyboard Return"},"e31c":{"name":"Keyboard Tab"},"e31d":{"name":"Keyboard Voice"},"eb47":{"name":"Kitchen"},"e892":{"name":"Label"},"e893":{"name":"Label Outline"},"e3f7":{"name":"Landscape"},"e894":{"name":"Language"},"e31e":{"name":"Laptop"},"e31f":{"name":"Laptop Chromebook"},"e320":{"name":"Laptop Mac"},"e321":{"name":"Laptop Windows"},"e5dd":{"name":"Last Page"},"e895":{"name":"Launch"},"e53b":{"name":"Layers"},"e53c":{"name":"Layers Clear"},"e3f8":{"name":"Leak Add"},"e3f9":{"name":"Leak Remove"},"e3fa":{"name":"Lens"},"e02e":{"name":"Library Add"},"e02f":{"name":"Library Books"},"e030":{"name":"Library Music"},"e90f":{"name":"Lightbulb Outline"},"e919":{"name":"Line Style"},"e91a":{"name":"Line Weight"},"e260":{"name":"Linear Scale"},"e157":{"name":"Link"},"e438":{"name":"Linked Camera"},"e896":{"name":"List"},"e0c6":{"name":"Live Help"},"e639":{"name":"Live Tv"},"e53f":{"name":"Local Activity"},"e53d":{"name":"Local Airport"},"e53e":{"name":"Local Atm"},"e540":{"name":"Local Bar"},"e541":{"name":"Local Cafe"},"e542":{"name":"Local Car Wash"},"e543":{"name":"Local Convenience Store"},"e556":{"name":"Local Dining"},"e544":{"name":"Local Drink"},"e545":{"name":"Local Florist"},"e546":{"name":"Local Gas Station"},"e547":{"name":"Local Grocery Store"},"e548":{"name":"Local Hospital"},"e549":{"name":"Local Hotel"},"e54a":{"name":"Local Laundry Service"},"e54b":{"name":"Local Library"},"e54c":{"name":"Local Mall"},"e54d":{"name":"Local Movies"},"e54e":{"name":"Local Offer"},"e54f":{"name":"Local Parking"},"e550":{"name":"Local Pharmacy"},"e551":{"name":"Local Phone"},"e552":{"name":"Local Pizza"},"e553":{"name":"Local Play"},"e554":{"name":"Local Post Office"},"e555":{"name":"Local Printshop"},"e557":{"name":"Local See"},"e558":{"name":"Local Shipping"},"e559":{"name":"Local Taxi"},"e7f1":{"name":"Location City"},"e1b6":{"name":"Location Disabled"},"e0c7":{"name":"Location Off"},"e0c8":{"name":"Location On"},"e1b7":{"name":"Location Searching"},"e897":{"name":"Lock"},"e898":{"name":"Lock Open"},"e899":{"name":"Lock Outline"},"e3fc":{"name":"Looks"},"e3fb":{"name":"Looks 3"},"e3fd":{"name":"Looks 4"},"e3fe":{"name":"Looks 5"},"e3ff":{"name":"Looks 6"},"e400":{"name":"Looks One"},"e401":{"name":"Looks Two"},"e028":{"name":"Loop"},"e402":{"name":"Loupe"},"e16d":{"name":"Low Priority"},"e89a":{"name":"Loyalty"},"e158":{"name":"Mail"},"e0e1":{"name":"Mail Outline"},"e55b":{"name":"Map"},"e159":{"name":"Markunread"},"e89b":{"name":"Markunread Mailbox"},"e322":{"name":"Memory"},"e5d2":{"name":"Menu"},"e252":{"name":"Merge Type"},"e0c9":{"name":"Message"},"e029":{"name":"Mic"},"e02a":{"name":"Mic None"},"e02b":{"name":"Mic Off"},"e618":{"name":"Mms"},"e253":{"name":"Mode Comment"},"e254":{"name":"Mode Edit"},"e263":{"name":"Monetization On"},"e25c":{"name":"Money Off"},"e403":{"name":"Monochrome Photos"},"e7f2":{"name":"Mood"},"e7f3":{"name":"Mood Bad"},"e619":{"name":"More"},"e5d3":{"name":"More Horiz"},"e5d4":{"name":"More Vert"},"e91b":{"name":"Motorcycle"},"e323":{"name":"Mouse"},"e168":{"name":"Move To Inbox"},"e02c":{"name":"Movie"},"e404":{"name":"Movie Creation"},"e43a":{"name":"Movie Filter"},"e6df":{"name":"Multiline Chart"},"e405":{"name":"Music Note"},"e063":{"name":"Music Video"},"e55c":{"name":"My Location"},"e406":{"name":"Nature"},"e407":{"name":"Nature People"},"e408":{"name":"Navigate Before"},"e409":{"name":"Navigate Next"},"e55d":{"name":"Navigation"},"e569":{"name":"Near Me"},"e1b9":{"name":"Network Cell"},"e640":{"name":"Network Check"},"e61a":{"name":"Network Locked"},"e1ba":{"name":"Network Wifi"},"e031":{"name":"New Releases"},"e16a":{"name":"Next Week"},"e1bb":{"name":"Nfc"},"e641":{"name":"No Encryption"},"e0cc":{"name":"No Sim"},"e033":{"name":"Not Interested"},"e06f":{"name":"Note"},"e89c":{"name":"Note Add"},"e7f4":{"name":"Notifications"},"e7f7":{"name":"Notifications Active"},"e7f5":{"name":"Notifications None"},"e7f6":{"name":"Notifications Off"},"e7f8":{"name":"Notifications Paused"},"e90a":{"name":"Offline Pin"},"e63a":{"name":"Ondemand Video"},"e91c":{"name":"Opacity"},"e89d":{"name":"Open In Browser"},"e89e":{"name":"Open In New"},"e89f":{"name":"Open With"},"e7f9":{"name":"Pages"},"e8a0":{"name":"Pageview"},"e40a":{"name":"Palette"},"e925":{"name":"Pan Tool"},"e40b":{"name":"Panorama"},"e40c":{"name":"Panorama Fish Eye"},"e40d":{"name":"Panorama Horizontal"},"e40e":{"name":"Panorama Vertical"},"e40f":{"name":"Panorama Wide Angle"},"e7fa":{"name":"Party Mode"},"e034":{"name":"Pause"},"e035":{"name":"Pause Circle Filled"},"e036":{"name":"Pause Circle Outline"},"e8a1":{"name":"Payment"},"e7fb":{"name":"People"},"e7fc":{"name":"People Outline"},"e8a2":{"name":"Perm Camera Mic"},"e8a3":{"name":"Perm Contact Calendar"},"e8a4":{"name":"Perm Data Setting"},"e8a5":{"name":"Perm Device Information"},"e8a6":{"name":"Perm Identity"},"e8a7":{"name":"Perm Media"},"e8a8":{"name":"Perm Phone Msg"},"e8a9":{"name":"Perm Scan Wifi"},"e7fd":{"name":"Person"},"e7fe":{"name":"Person Add"},"e7ff":{"name":"Person Outline"},"e55a":{"name":"Person Pin"},"e56a":{"name":"Person Pin Circle"},"e63b":{"name":"Personal Video"},"e91d":{"name":"Pets"},"e0cd":{"name":"Phone"},"e324":{"name":"Phone Android"},"e61b":{"name":"Phone Bluetooth Speaker"},"e61c":{"name":"Phone Forwarded"},"e61d":{"name":"Phone In Talk"},"e325":{"name":"Phone Iphone"},"e61e":{"name":"Phone Locked"},"e61f":{"name":"Phone Missed"},"e620":{"name":"Phone Paused"},"e326":{"name":"Phonelink"},"e0db":{"name":"Phonelink Erase"},"e0dc":{"name":"Phonelink Lock"},"e327":{"name":"Phonelink Off"},"e0dd":{"name":"Phonelink Ring"},"e0de":{"name":"Phonelink Setup"},"e410":{"name":"Photo"},"e411":{"name":"Photo Album"},"e412":{"name":"Photo Camera"},"e43b":{"name":"Photo Filter"},"e413":{"name":"Photo Library"},"e432":{"name":"Photo Size Select Actual"},"e433":{"name":"Photo Size Select Large"},"e434":{"name":"Photo Size Select Small"},"e415":{"name":"Picture As Pdf"},"e8aa":{"name":"Picture In Picture"},"e911":{"name":"Picture In Picture Alt"},"e6c4":{"name":"Pie Chart"},"e6c5":{"name":"Pie Chart Outlined"},"e55e":{"name":"Pin Drop"},"e55f":{"name":"Place"},"e037":{"name":"Play Arrow"},"e038":{"name":"Play Circle Filled"},"e039":{"name":"Play Circle Outline"},"e906":{"name":"Play For Work"},"e03b":{"name":"Playlist Add"},"e065":{"name":"Playlist Add Check"},"e05f":{"name":"Playlist Play"},"e800":{"name":"Plus One"},"e801":{"name":"Poll"},"e8ab":{"name":"Polymer"},"eb48":{"name":"Pool"},"e0ce":{"name":"Portable Wifi Off"},"e416":{"name":"Portrait"},"e63c":{"name":"Power"},"e336":{"name":"Power Input"},"e8ac":{"name":"Power Settings New"},"e91e":{"name":"Pregnant Woman"},"e0df":{"name":"Present To All"},"e8ad":{"name":"Print"},"e645":{"name":"Priority High"},"e80b":{"name":"Public"},"e255":{"name":"Publish"},"e8ae":{"name":"Query Builder"},"e8af":{"name":"Question Answer"},"e03c":{"name":"Queue"},"e03d":{"name":"Queue Music"},"e066":{"name":"Queue Play Next"},"e03e":{"name":"Radio"},"e837":{"name":"Radio Button Checked"},"e836":{"name":"Radio Button Unchecked"},"e560":{"name":"Rate Review"},"e8b0":{"name":"Receipt"},"e03f":{"name":"Recent Actors"},"e91f":{"name":"Record Voice Over"},"e8b1":{"name":"Redeem"},"e15a":{"name":"Redo"},"e5d5":{"name":"Refresh"},"e15b":{"name":"Remove"},"e15c":{"name":"Remove Circle"},"e15d":{"name":"Remove Circle Outline"},"e067":{"name":"Remove From Queue"},"e417":{"name":"Remove Red Eye"},"e928":{"name":"Remove Shopping Cart"},"e8fe":{"name":"Reorder"},"e040":{"name":"Repeat"},"e041":{"name":"Repeat One"},"e042":{"name":"Replay"},"e059":{"name":"Replay 10"},"e05a":{"name":"Replay 30"},"e05b":{"name":"Replay 5"},"e15e":{"name":"Reply"},"e15f":{"name":"Reply All"},"e160":{"name":"Report"},"e8b2":{"name":"Report Problem"},"e56c":{"name":"Restaurant"},"e561":{"name":"Restaurant Menu"},"e8b3":{"name":"Restore"},"e929":{"name":"Restore Page"},"e0d1":{"name":"Ring Volume"},"e8b4":{"name":"Room"},"eb49":{"name":"Room Service"},"e418":{"name":"Rotate 90 Degrees Ccw"},"e419":{"name":"Rotate Left"},"e41a":{"name":"Rotate Right"},"e920":{"name":"Rounded Corner"},"e328":{"name":"Router"},"e921":{"name":"Rowing"},"e0e5":{"name":"Rss Feed"},"e642":{"name":"Rv Hookup"},"e562":{"name":"Satellite"},"e161":{"name":"Save"},"e329":{"name":"Scanner"},"e8b5":{"name":"Schedule"},"e80c":{"name":"School"},"e1be":{"name":"Screen Lock Landscape"},"e1bf":{"name":"Screen Lock Portrait"},"e1c0":{"name":"Screen Lock Rotation"},"e1c1":{"name":"Screen Rotation"},"e0e2":{"name":"Screen Share"},"e623":{"name":"Sd Card"},"e1c2":{"name":"Sd Storage"},"e8b6":{"name":"Search"},"e32a":{"name":"Security"},"e162":{"name":"Select All"},"e163":{"name":"Send"},"e811":{"name":"Sentiment Dissatisfied"},"e812":{"name":"Sentiment Neutral"},"e813":{"name":"Sentiment Satisfied"},"e814":{"name":"Sentiment Very Dissatisfied"},"e815":{"name":"Sentiment Very Satisfied"},"e8b8":{"name":"Settings"},"e8b9":{"name":"Settings Applications"},"e8ba":{"name":"Settings Backup Restore"},"e8bb":{"name":"Settings Bluetooth"},"e8bd":{"name":"Settings Brightness"},"e8bc":{"name":"Settings Cell"},"e8be":{"name":"Settings Ethernet"},"e8bf":{"name":"Settings Input Antenna"},"e8c0":{"name":"Settings Input Component"},"e8c1":{"name":"Settings Input Composite"},"e8c2":{"name":"Settings Input Hdmi"},"e8c3":{"name":"Settings Input Svideo"},"e8c4":{"name":"Settings Overscan"},"e8c5":{"name":"Settings Phone"},"e8c6":{"name":"Settings Power"},"e8c7":{"name":"Settings Remote"},"e1c3":{"name":"Settings System Daydream"},"e8c8":{"name":"Settings Voice"},"e80d":{"name":"Share"},"e8c9":{"name":"Shop"},"e8ca":{"name":"Shop Two"},"e8cb":{"name":"Shopping Basket"},"e8cc":{"name":"Shopping Cart"},"e261":{"name":"Short Text"},"e6e1":{"name":"Show Chart"},"e043":{"name":"Shuffle"},"e1c8":{"name":"Signal Cellular 4 Bar"},"e1cd":{"name":"Signal Cellular Connected No Internet 4 Bar"},"e1ce":{"name":"Signal Cellular No Sim"},"e1cf":{"name":"Signal Cellular Null"},"e1d0":{"name":"Signal Cellular Off"},"e1d8":{"name":"Signal Wifi 4 Bar"},"e1d9":{"name":"Signal Wifi 4 Bar Lock"},"e1da":{"name":"Signal Wifi Off"},"e32b":{"name":"Sim Card"},"e624":{"name":"Sim Card Alert"},"e044":{"name":"Skip Next"},"e045":{"name":"Skip Previous"},"e41b":{"name":"Slideshow"},"e068":{"name":"Slow Motion Video"},"e32c":{"name":"Smartphone"},"eb4a":{"name":"Smoke Free"},"eb4b":{"name":"Smoking Rooms"},"e625":{"name":"Sms"},"e626":{"name":"Sms Failed"},"e046":{"name":"Snooze"},"e164":{"name":"Sort"},"e053":{"name":"Sort By Alpha"},"eb4c":{"name":"Spa"},"e256":{"name":"Space Bar"},"e32d":{"name":"Speaker"},"e32e":{"name":"Speaker Group"},"e8cd":{"name":"Speaker Notes"},"e92a":{"name":"Speaker Notes Off"},"e0d2":{"name":"Speaker Phone"},"e8ce":{"name":"Spellcheck"},"e838":{"name":"Star"},"e83a":{"name":"Star Border"},"e839":{"name":"Star Half"},"e8d0":{"name":"Stars"},"e0d3":{"name":"Stay Current Landscape"},"e0d4":{"name":"Stay Current Portrait"},"e0d5":{"name":"Stay Primary Landscape"},"e0d6":{"name":"Stay Primary Portrait"},"e047":{"name":"Stop"},"e0e3":{"name":"Stop Screen Share"},"e1db":{"name":"Storage"},"e8d1":{"name":"Store"},"e563":{"name":"Store Mall Directory"},"e41c":{"name":"Straighten"},"e56e":{"name":"Streetview"},"e257":{"name":"Strikethrough S"},"e41d":{"name":"Style"},"e5d9":{"name":"Subdirectory Arrow Left"},"e5da":{"name":"Subdirectory Arrow Right"},"e8d2":{"name":"Subject"},"e064":{"name":"Subscriptions"},"e048":{"name":"Subtitles"},"e56f":{"name":"Subway"},"e8d3":{"name":"Supervisor Account"},"e049":{"name":"Surround Sound"},"e0d7":{"name":"Swap Calls"},"e8d4":{"name":"Swap Horiz"},"e8d5":{"name":"Swap Vert"},"e8d6":{"name":"Swap Vertical Circle"},"e41e":{"name":"Switch Camera"},"e41f":{"name":"Switch Video"},"e627":{"name":"Sync"},"e628":{"name":"Sync Disabled"},"e629":{"name":"Sync Problem"},"e62a":{"name":"System Update"},"e8d7":{"name":"System Update Alt"},"e8d8":{"name":"Tab"},"e8d9":{"name":"Tab Unselected"},"e32f":{"name":"Tablet"},"e330":{"name":"Tablet Android"},"e331":{"name":"Tablet Mac"},"e420":{"name":"Tag Faces"},"e62b":{"name":"Tap And Play"},"e564":{"name":"Terrain"},"e262":{"name":"Text Fields"},"e165":{"name":"Text Format"},"e0d8":{"name":"Textsms"},"e421":{"name":"Texture"},"e8da":{"name":"Theaters"},"e8db":{"name":"Thumb Down"},"e8dc":{"name":"Thumb Up"},"e8dd":{"name":"Thumbs Up Down"},"e62c":{"name":"Time To Leave"},"e422":{"name":"Timelapse"},"e922":{"name":"Timeline"},"e425":{"name":"Timer"},"e423":{"name":"Timer 10"},"e424":{"name":"Timer 3"},"e426":{"name":"Timer Off"},"e264":{"name":"Title"},"e8de":{"name":"Toc"},"e8df":{"name":"Today"},"e8e0":{"name":"Toll"},"e427":{"name":"Tonality"},"e913":{"name":"Touch App"},"e332":{"name":"Toys"},"e8e1":{"name":"Track Changes"},"e565":{"name":"Traffic"},"e570":{"name":"Train"},"e571":{"name":"Tram"},"e572":{"name":"Transfer Within A Station"},"e428":{"name":"Transform"},"e8e2":{"name":"Translate"},"e8e3":{"name":"Trending Down"},"e8e4":{"name":"Trending Flat"},"e8e5":{"name":"Trending Up"},"e429":{"name":"Tune"},"e8e6":{"name":"Turned In"},"e8e7":{"name":"Turned In Not"},"e333":{"name":"Tv"},"e169":{"name":"Unarchive"},"e166":{"name":"Undo"},"e5d6":{"name":"Unfold Less"},"e5d7":{"name":"Unfold More"},"e923":{"name":"Update"},"e1e0":{"name":"Usb"},"e8e8":{"name":"Verified User"},"e258":{"name":"Vertical Align Bottom"},"e259":{"name":"Vertical Align Center"},"e25a":{"name":"Vertical Align Top"},"e62d":{"name":"Vibration"},"e070":{"name":"Video Call"},"e071":{"name":"Video Label"},"e04a":{"name":"Video Library"},"e04b":{"name":"Videocam"},"e04c":{"name":"Videocam Off"},"e338":{"name":"Videogame Asset"},"e8e9":{"name":"View Agenda"},"e8ea":{"name":"View Array"},"e8eb":{"name":"View Carousel"},"e8ec":{"name":"View Column"},"e42a":{"name":"View Comfy"},"e42b":{"name":"View Compact"},"e8ed":{"name":"View Day"},"e8ee":{"name":"View Headline"},"e8ef":{"name":"View List"},"e8f0":{"name":"View Module"},"e8f1":{"name":"View Quilt"},"e8f2":{"name":"View Stream"},"e8f3":{"name":"View Week"},"e435":{"name":"Vignette"},"e8f4":{"name":"Visibility"},"e8f5":{"name":"Visibility Off"},"e62e":{"name":"Voice Chat"},"e0d9":{"name":"Voicemail"},"e04d":{"name":"Volume Down"},"e04e":{"name":"Volume Mute"},"e04f":{"name":"Volume Off"},"e050":{"name":"Volume Up"},"e0da":{"name":"Vpn Key"},"e62f":{"name":"Vpn Lock"},"e1bc":{"name":"Wallpaper"},"e002":{"name":"Warning"},"e334":{"name":"Watch"},"e924":{"name":"Watch Later"},"e42c":{"name":"Wb Auto"},"e42d":{"name":"Wb Cloudy"},"e42e":{"name":"Wb Incandescent"},"e436":{"name":"Wb Iridescent"},"e430":{"name":"Wb Sunny"},"e63d":{"name":"Wc"},"e051":{"name":"Web"},"e069":{"name":"Web Asset"},"e16b":{"name":"Weekend"},"e80e":{"name":"Whatshot"},"e1bd":{"name":"Widgets"},"e63e":{"name":"Wifi"},"e1e1":{"name":"Wifi Lock"},"e1e2":{"name":"Wifi Tethering"},"e8f9":{"name":"Work"},"e25b":{"name":"Wrap Text"},"e8fa":{"name":"Youtube Searched For"},"e8ff":{"name":"Zoom In"},"e900":{"name":"Zoom Out"},"e56b":{"name":"Zoom Out Map"}}} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/material-icons/MaterialIcons-Regular.svg b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/material-icons/MaterialIcons-Regular.svg new file mode 100644 index 00000000..a449327e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/material-icons/MaterialIcons-Regular.svg @@ -0,0 +1,2373 @@ + + + + + +Created by FontForge 20151118 at Mon Feb 8 11:58:02 2016 + By shyndman +Copyright 2015 Google, Inc. All Rights Reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/material-icons/MaterialIcons-Regular.ttf b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/material-icons/MaterialIcons-Regular.ttf new file mode 100644 index 00000000..7015564a Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/material-icons/MaterialIcons-Regular.ttf differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/material-icons/MaterialIcons-Regular.woff b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/material-icons/MaterialIcons-Regular.woff new file mode 100644 index 00000000..b648a3ee Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/material-icons/MaterialIcons-Regular.woff differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/material-icons/MaterialIcons-Regular.woff2 b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/material-icons/MaterialIcons-Regular.woff2 new file mode 100644 index 00000000..9fa21125 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/material-icons/MaterialIcons-Regular.woff2 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/material-icons/material-icons.css b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/material-icons/material-icons.css new file mode 100644 index 00000000..2270c09d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/material-icons/material-icons.css @@ -0,0 +1,36 @@ +@font-face { + font-family: 'Material Icons'; + font-style: normal; + font-weight: 400; + src: url(MaterialIcons-Regular.eot); /* For IE6-8 */ + src: local('Material Icons'), + local('MaterialIcons-Regular'), + url(MaterialIcons-Regular.woff2) format('woff2'), + url(MaterialIcons-Regular.woff) format('woff'), + url(MaterialIcons-Regular.ttf) format('truetype'); +} + +.material-icons { + font-family: 'Material Icons'; + font-weight: normal; + font-style: normal; + font-size: 24px; /* Preferred icon size */ + display: inline-block; + line-height: 1; + text-transform: none; + letter-spacing: normal; + word-wrap: normal; + white-space: nowrap; + direction: ltr; + + /* Support for all WebKit browsers. */ + -webkit-font-smoothing: antialiased; + /* Support for Safari and Chrome. */ + text-rendering: optimizeLegibility; + + /* Support for Firefox. */ + -moz-osx-font-smoothing: grayscale; + + /* Support for IE. */ + font-feature-settings: 'liga'; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-Bold.woff b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-Bold.woff new file mode 100644 index 00000000..780de6d6 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-Bold.woff differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-Bold.woff2 b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-Bold.woff2 new file mode 100644 index 00000000..72a32ab2 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-Bold.woff2 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-BoldItalic.woff b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-BoldItalic.woff new file mode 100644 index 00000000..20ec4ab2 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-BoldItalic.woff differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-BoldItalic.woff2 b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-BoldItalic.woff2 new file mode 100644 index 00000000..642a2d44 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-BoldItalic.woff2 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-Light.woff b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-Light.woff new file mode 100644 index 00000000..a9946092 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-Light.woff differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-Light.woff2 b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-Light.woff2 new file mode 100644 index 00000000..b3238fa2 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-Light.woff2 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-LightItalic.woff b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-LightItalic.woff new file mode 100644 index 00000000..7cc63b7e Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-LightItalic.woff differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-LightItalic.woff2 b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-LightItalic.woff2 new file mode 100644 index 00000000..3f438f80 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-LightItalic.woff2 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-Regular.woff b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-Regular.woff new file mode 100644 index 00000000..40c056ea Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-Regular.woff differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-Regular.woff2 b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-Regular.woff2 new file mode 100644 index 00000000..46f89cfb Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-Regular.woff2 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-RegularItalic.woff b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-RegularItalic.woff new file mode 100644 index 00000000..ddc9c014 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-RegularItalic.woff differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-RegularItalic.woff2 b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-RegularItalic.woff2 new file mode 100644 index 00000000..08d7a518 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-RegularItalic.woff2 differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/header.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/header.png new file mode 100644 index 00000000..be1002a4 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/header.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/README.md b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/README.md new file mode 100644 index 00000000..22bccbd4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/README.md @@ -0,0 +1,273 @@ +This folder contains the GUI translation files. To maintain order and be able +to easily make any necessary updates to the translation files after updating +the main text file, please follow its instructions if you are working with +its contents. + +# Contents of this folder + +The contents of this folder are: + +- `README.md`: this file. + +- `check.js`: file with the script for detecting if a translation file has errors +or should be updated. + +- `en.json`: main file with all the texts of the application, in English. It should +only be modified when changing the texts of the application (add, modify and +delete). This means that the file must not be modified while creating a new +ranslation or modifying an existing one. + +- Various `xx.json` files: files with the translated versions of the texts of +`en.json`. + +- Various `xx_base.json` files: files with copies of `en.json` made the last time the +corresponding `xx.json` file was modified. + +Normally there is no need to modify the first two files. + +For more information about the `xx.json` and `xx_base.json`, please check the +[Add a new translation](#add-a-new-translation) and +[Update a translation](#update-a-translation) sections. + +# About the meaning of "xx" in this file + +Several parts of this file uses "xx" as part of file names or scripts, like +`xx.json` and `xx_base.json`. In fact, no file in this folder should be called +`xx.json` or `xx_base.json`, the "xx" part must be replaces with the two +characters code of the language. For example, if you are working with the Chinese +translation, the files will be `zh.json` and `zh_base.json`, instead of `xx.json` +and `xx_base.json`. The same if true for the scripts, if you are working with the +Chinese translation, instead of running `node check.js xx` you must run +`node check.js zh`. + +# Add a new translation + +First you must create in this folder two copies of the `en.json` file. The first +copy must be called `xx.json`, where the `xx` part must be the two characters code +of the new language. For example, for Chinese the name of the file should be +`zh.json`; for Spanish, `es.json`; for French, `fr.json`, etc. + +The second copy of `en.json` must be renamed to `xx_base.json`, where the `xx` part +must be the two characters code of the new language. This means that if the first +copy is named `zh.json`, the second one should be named `zh_base.json`. + +It is not necessary to follow a specific standard for the two characters code, but +it must be limited to two letters and be a recognizable code for the language. + +After creating the two files, simply translate the texts in `xx.json`. Please make +sure you do not modify the structure of `xx.json`, just modify the texts. + +The `xx_base.json` file must not be modified in any way, as it is used only as a way +to know what the state of `en.json` was the last time the `xx.json` file was +modified. This copy will be compared in the future with `en.json`, to verify if +there were modifications to `en.json` since the last time the translation file was +modified and if an update is needed. + +If the `xx.json` and `xx_base.json` files do not have the same elements, the +automatic tests could fail when uploading the changes to the repository, preventing +the changes from being accepted, so, again, it is important not to modify the +structure of `xx.json`, but only its contents. + +After doing all this, the translation will be ready, but will not be available in +the GUI until adding it to the code. + +# Verify the translation files + +This folder includes a script that is capable of automatically checking the +translation files, to detect problems and know what should be updated. + +For using it, your computer must have `Node.js` installed. + +## Checking for problems + +For detecting basic problems on the translation files, open a command line window +in this folder and run `node check.js`. This will check the following: + +- The `en.json` must exist, as it is the main language file for the app. + +- For every `xx.json` file (except `en.json`) an `xx_base.json` file must exist +and viceversa. + +- A `xx.json` file and its corresponding `xx_base.json` file must have the exact +same elements (only the content of that elements could be different), as the +`xx.json` is suposed to be the translation of the contents of `xx_base.json`. + +As you can see, this only checks for errors that could be made while creating or +modifying the `xx.json` and `xx_base.json` files, and does not check if any +translation needs to be updated. + +At the end of the script excecution, the console will display the list of all +errors found, if any. This check could be done automatically when making changes +to the repository, to reject updates with problems, so it is good idea to run it +manually before uploading changes. + +Note: at this time the script does not check if the elements of the files are +in the same order, but this could be added in the future, so it is recomended +not to change the order of the elements. + +## Checking if a language file needs to be updated + +To detect if an specific language needs updating, run `node check.js xx`, +where xx is the two characters code of the language you want to check. If you +want to check all languages, run `node check.js all`. + +By doing this, the script will perform all the checks described in the +[Checking for problems](#checking-for-problems) section, plus this: + +- The `en.json` and `xx_base.json` should have the same elements. If `en.json` +has elements that `xx_base.json` does not contain, it means that, since the +last time the translation file was updated, new texts have been added to the +application. If `xx_base.json` has elements that `en.json` does not contain, +it means that, since the last time the translation file was updated, some texts +have been removed from the application. Both cases mean that the translation +file should be updated. + +- The elements of `en.json` and `xx_base.json` should have the same content. +If any element have different content, it means that since the last time the +translation file was updated, some texts of the applications have been changed. +This means that the translation file should be updated. + +At the end of the script excecution, the console will display the list of all +errors found, if any. + +# Update a translation + +Before updating a translation file, you should follow the steps of the +[Checking if a language file needs to be updated](#Checking-if-a-language-file-needs-to-be-updated) +section. By doing so you will quikly know exactly what texts must be added, +deleted or edited. + +After doing that, make all the required modifications in the `xx.json` file, +this means adding, deleting and modifying all the elements indicated by the +script. Please be sure to modify only what is required and to add any new +element in the same position that it is in the `en.json` file. This process +is manual, so be sure check all the changes before finishing. + +After doing the modifications in `xx.json`, delete the `xx_base.json` file, +create a copy of `en.json` and rename it `xx_base.json`. The objetive is to +simply update the `xx_base.json` file to the current state of `en.json`. +this will make possible to check in the future if more updates are nedded, +due to new changes in `en.json`. + +Once all the changes are made, check again the language file as indicated +in the +[Checking if a language file needs to be updated](#Checking-if-a-language-file-needs-to-be-updated) +section. The script should not return errors. If the script returns errors, +please solve them before continuing. + +# How to edit the translation files + +The translation files are in json format (.json files). It is possible to +open these files in a text editor and edit them like normal text files. +However, the json files are used for coding and have a very strict format. +Because of this, **editing the files manually is not recommended** unless +you know exactly what you are doing. + +If you do not know the json format, this section includes useful +information to be able to edit the files easily. + +## Which application should be used for editing the files + +There are several application that allow editing json files, including +some text editors. However, it is recommended to use the Json Editor app +for Google Chrome. Among the advantages of this application are that it +is multiplatform, it allows editing the contents without having to +directly modify the json code and has a relatively simple interface. You +can add it to your Chrome browser from here: +https://chrome.google.com/webstore/detail/json-editor/lhkmoheomjbkfloacpgllgjcamhihfaj + +The app looks like this: + +![app](app1.png) + +As you can see, you can load/save files on the upper-right corner of +the app. The left part shows the source code and the right part shows +a tree view of the elements of the file and its contents. You can +ignore the source code and work with the tree view only. + +![app](app2.png) + +As you will not be editing the soutce code, you can hide it by presing +and draging the 3-dot button (1). While editing the file, you can use +the arrows (2) to expand/contract the different sections in which the +elements are organized. Once you find an item that you want to edit, +click on the content and modify the text (3). Please, do not make any +changes to the name of the element (4). + +You can use the 6-dot buttons (5) to move the elements to a different +location, but please avoid doing it, as that could alter the order of +the file in a way that would make it stop working. Also, as you will +not be working with the source code, avoid using the arrow +buttons (6). + +## Special codes + +Some texts in the language files have special codes that are not +shown in the user interface of the wallet, but serve special purposes. +The codes are: + +- **\\"**: due to how json files work, it is not possible to write +double quotes directly in the texts, the ccorrect way to add double +quotes to a json file is **\\"** (note that the 2 characters must not +be separated by a white space). If you use the Json Editor app for +Google Chrome, you can write double quotes normally and the app will +automatically add the **\\** character behind them, but that is just +a convenience for when you are writing, you could still find the +**\\"** code in files you are editing and have to work with it. + +- **{{ }}**: any text block similar to **{{ something }}** is a +special identifier that the code will replace with a different value +when the app is running. For example, if you find a text like "Your +balance is {{ value }} coins", the application will show something +like "Your balance is 21 coins". In that example the "21" is a value +that the app has to calculate, so it is not possible to add it directly +into the language file. If you find a **{{ }}** text block, please do +not translate it, just move the whole **{{ }}** text block to where the +value should be displayed. If you want to leave a while space before the +value, simply add a white space before the **{{ }}** text block, and do +the same after it if you want a white space after the value. + +- **\
**: this code means "new line". It is just a way to tell +the code that the text after it should be added in a new line. + +# Make a translation available in the application + +Although creating the translation files is the most important step, it is +necessary to make some additional changes before a translation is +available in the application. + +The first thing to do is to add a bitmap in +[src/gui/static/src/assets/img/lang](src/gui/static/src/assets/img/lang), +with the flag that will be used to identify the language. The bitmap +should be a .png file with transparent background and a size of 64x64 +pixels. However, the flag does not have to occupy all the space of the +bitmap, but it should be 64 pixels wide and only 42 pixels high, +centered. Please use as a reference the flags that are already in +the folder. + +After adding the flag, you must modify the +[src/gui/static/src/app/app.config.ts](src/gui/static/src/app/app.config.ts) +file. In particular, you must add a new entry to the `languages` array, +with the data about the language. The object you must add is similar +to this: + +``` +{ + code: 'en', + name: 'English', + iconName: 'en.png' +} +``` + +The properties are: + +- `code`: 2 letter code that was assigned to the language. It must match +the name given to the translation file. + +- `name`: Name of the language. + +- `iconName`: Name of the file with the flag, which was added in the +previous step. + +Please use as a reference the data of the languages that have already +been added to the `languages` array. diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/app1.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/app1.png new file mode 100644 index 00000000..67c75016 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/app1.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/app2.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/app2.png new file mode 100644 index 00000000..6cabfe68 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/app2.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/check.js b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/check.js new file mode 100644 index 00000000..b70f022d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/check.js @@ -0,0 +1,230 @@ +'use strict' + +const fs = require('fs'); + +///////////////////////////////////////////// +// Initial configuration +///////////////////////////////////////////// + +console.log('Starting to check the language files.', '\n'); + +// Load the current English file. +if (!fs.existsSync('en.json')) { + exitWithError('Unable to find the English language file.'); +} +let currentData = JSON.parse(fs.readFileSync('en.json', 'utf8')); + +// 2 charaters code of the languages that will be checked. +const langs = []; +// If false, the code will only verify the differences in the elements (ignoring its contents) of the +// base files and the files with the translations. If not, the code will also verify the differences +// in the elements and contents of the base files and the current English file. +let checkFull = false; + +// If a param was send, it must be "all" or the 2 charaters code of the language that must be checked. +// If a param is provided, checkFull is set to true. +if (process.argv.length > 2) { + if (process.argv.length > 3) { + exitWithError('Invalid number of parameters.'); + } + + if (process.argv[2] != 'all') { + if (process.argv[2].length !== 2) { + exitWithError('You can only send as parameter to this script the 2-letter code of one of the language files in this folder, or "all".'); + } + langs.push(process.argv[2]); + } + + checkFull = true; +} + +// If no language code was send as param, the code will check all languages. +if (langs.length === 0) { + let localFiles = fs.readdirSync('./'); + + const langFiles = []; + const langFilesMap = new Map(); + const baseLangFilesMap = new Map(); + localFiles.forEach(file => { + if (file.length === 12 && file.endsWith('_base.json')) { + langs.push(file.substring(0, 2)); + baseLangFilesMap.set(file.substring(0, 2), true); + } + if (file !== 'en.json' && file.length === 7 && file.endsWith('.json')) { + langFiles.push(file.substring(0, 2)); + langFilesMap.set(file.substring(0, 2), true); + } + }); + + langs.forEach(lang => { + if (!langFilesMap.has(lang)) { + exitWithError('The \"' + lang + '_base.json\" base file does not have its corresponding language file.'); + } + }); + + langFiles.forEach(lang => { + if (!baseLangFilesMap.has(lang)) { + exitWithError('The \"' + lang + '.json\" file does not have its corresponding base file.'); + } + }); + + if (langs.length === 0) { + exitWithError('No language files to check.'); + } +} + +console.log('Checking the following languages:'); +langs.forEach(lang => { + console.log(lang); +}); +console.log(''); + +///////////////////////////////////////////// +// Verifications +///////////////////////////////////////////// + +// The following arrays will contain the list of elements with problems. Each element of the +// arrays contains a "lang" property with the language identifier and a "elements" array with +// the path of the problematic elements. + +// Elements that are present in a base file but not in its corresponding translation file. +const baseFileOnly = []; +// Elements that are present in a translation file but not in its corresponding base file. +const translatedFileOnly = []; +// Elements that are present in the English file but not in the currently checked base translation file. +const enOnly = []; +// Elements that are present in the currently checked base translation file but not in the English file. +const translatedOnly = []; +// Elements that have different values in the currently checked base translation file and the English file. +const different = []; + +function addNewLangToArray(array, lang) { + array.push({ + lang: lang, + elements: [] + }); +} + +langs.forEach(lang => { + addNewLangToArray(baseFileOnly, lang); + addNewLangToArray(translatedFileOnly, lang); + addNewLangToArray(enOnly, lang); + addNewLangToArray(translatedOnly, lang); + addNewLangToArray(different, lang); + + // Try to load the translation file and its corresponding base file. + if (!fs.existsSync(lang + '.json')) { + exitWithError('Unable to find the ' + lang + '.json file.'); + } + let translationData = JSON.parse(fs.readFileSync(lang + '.json', 'utf8')); + + if (!fs.existsSync(lang + '_base.json')) { + exitWithError('Unable to find the ' + lang + '_base.json language file.'); + } + let baseTranslationData = JSON.parse(fs.readFileSync(lang + '_base.json', 'utf8')); + + // Check the differences in the elements of the translation file and its base file. + checkElement('', '', baseTranslationData, translationData, baseFileOnly, true); + checkElement('', '', translationData, baseTranslationData, translatedFileOnly, true); + + // Check the differences in the elements and content of the base translation file the English file. + if (checkFull) { + checkElement('', '', currentData, baseTranslationData, enOnly, false); + checkElement('', '', baseTranslationData, currentData, translatedOnly, true); + } +}); + + +// Check recursively if the elements and content of two language objects are the same. +// +// path: path of the currently checked element. As this function works with nested elements, +// the path is the name of all the parents, separated by a dot. +// key: name of the current element. +// fist: first element for the comparation. +// second: second element for the comparation. +// arrayForMissingElements: array in which the list of "fist" elements that are not in "second" +// will be added. +// ignoreDifferences: if false, each time the content of an element in "fist" is different to the +// same element in "second" that element will be added to the "different" array. +function checkElement(path, key, fist, second, arrayForMissingElements, ignoreDifferences) { + let pathPrefix = ''; + if (path.length > 0) { + pathPrefix = '.'; + } + + // This means that, at some point, the code found an element in the "first" branch that is + // not in the "second" branch. + if (second === undefined || second === null) { + arrayForMissingElements[arrayForMissingElements.length - 1].elements.push(path + pathPrefix + key); + return; + } + + if (typeof fist !== 'object') { + // If the current element is a string, compare the contents, but ony if ignoreDifferences + // is true. + if (!ignoreDifferences && fist != second) { + different[different.length - 1].elements.push(path + pathPrefix + key); + } + } else { + // If the current element is an object, check the childs. + Object.keys(fist).forEach(currentKey => { + checkElement(path + pathPrefix + key, currentKey, fist[currentKey], second[currentKey], arrayForMissingElements, ignoreDifferences); + }); + } +} + +///////////////////////////////////////////// +// Results processing +///////////////////////////////////////////// + +// Becomes true if any of the verifications failed. +let failedValidation = false; + +// If "failedValidation" is false, writes to the console the header of the error list +// and updates the value of "failedValidation" to true. +function updateErrorSumary() { + if (!failedValidation) { + failedValidation = true; + console.log('The following problems were found:', '\n'); + } +} + +// Checks all arrays for errors. This loop is for the languages. +for (let i = 0; i < baseFileOnly.length; i++) { + + // This loop if for checking all the arrays. + [baseFileOnly, translatedFileOnly, enOnly, translatedOnly, different].forEach((array, idx) => { + // If the array has elements, it means that errors were found. + if (array[i].elements.length > 0) { + updateErrorSumary(); + + // Show the appropriate error text according to the current array. + if (idx === 0) { + console.log('The \"' + baseFileOnly[i].lang + '_base.json\" base file has elements that are not present in \"' + baseFileOnly[i].lang + '.json\":'); + } else if (idx === 1) { + console.log("\"" + translatedFileOnly[i].lang + '.json\" has elements that are not present in the \"' + baseFileOnly[i].lang + '_base.json\" base file:'); + } else if (idx === 2) { + console.log('The \"en.json\" file has elements that are not present in the \"' + enOnly[i].lang + '_base.json\" base file:'); + } else if (idx === 3) { + console.log('The \"' + translatedOnly[i].lang + '_base.json\" base file has elements that are not present in \"en.json\":'); + } else if (idx === 4) { + console.log('The \"' + different[i].lang + '_base.json\" base file has values that do not match the ones in \"en.json\":'); + } + // Show all the elements with errors. + array[i].elements.forEach(element => console.log(element)); + console.log(''); + } + }); +} + +// If no error was detected, show a success message on the console. If not, exit with an error code. +if (!failedValidation) { + console.log('The verification passed without problems.'); +} else { + process.exit(1); +} + +function exitWithError(errorMessage) { + console.log('Error: ' + errorMessage) + process.exit(1); +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/en.json b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/en.json new file mode 100644 index 00000000..2026efdb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/en.json @@ -0,0 +1,626 @@ +{ + "common": { + "coin-id": "SKY", + "coin-hours": "Coin Hours", + "usd": "USD", + "loading": "Loading...", + "new": "New", + "load": "Load", + "success": "Success", + "warning": "Warning", + "changes-made": "The changes have been made." + }, + + "errors": { + "error": "Error", + "fetch-version": "Unable to fetch latest release version from Github", + "incorrect-password": "Incorrect password", + "error-decrypting": "Error decrypting the wallet", + "api-disabled": "API disabled", + "no-wallet": "Wallet does not exist", + "no-outputs": "No unspent outputs", + "window-size": "The window is too narrow for the content" + }, + + "title": { + "language": "Select Language", + "wallets": "Wallets", + "send": "Send", + "history": "History", + "buy-coin": "Buy Skycoin", + "network": "Networking", + "blockchain": "Blockchain", + "outputs": "Outputs", + "transactions": "Transactions", + "pending-txs": "Pending Transactions", + "backup": "Backup Wallet", + "explorer": "Skycoin Explorer", + "seed": "Wallet Seed", + "reset": "Reset Password", + "exchange": "Exchange", + "select-address": "Select Address", + "order-history": "Order history" + }, + + "header": { + "syncing-blocks": "Syncing blocks", + "update1": "Wallet update", + "update2": "available.", + "synchronizing": "The wallet is synchronizing. Data you see may not be updated.", + "pending-txs1": "There are some", + "pending-txs2": "pending transactions.", + "pending-txs3": "Data you see may not be updated.", + + "errors": { + "no-connections": "No connections active, your client is not connected to any other nodes!", + "no-backend1": "Cannot reach backend. Please restart the app and/or seek help on our", + "no-backend2": "Telegram.", + "no-backend3": "", + "csrf": "Security vulnerability: CSRF is not working, please exit immediately." + } + }, + + "password": { + "title": "Enter Password", + "label": "Password", + "confirm-label": "Confirm password", + "button": "Proceed", + "reset-link": "I forgot my password" + }, + + "buy": { + "deposit-address": "Choose an address to generate a BTC deposit link for:", + "select-address": "Select address", + "generate": "Generate", + "deposit-location": "Deposit Location", + "deposit-location-desc": "Choose a wallet where you'd like us to deposit your Skycoin after we receive your Bitcoin.", + "make-choice": "Make a choice", + "wallets-desc": "Each time a new wallet and address are selected, a new BTC address is generated. A single Skycoin address can have up to 5 BTC addresses assigned to it.", + "send": "Send Bitcoin", + "send-desc": "Send Bitcoin to the address below. Once received, we will deposit the Skycoin to a new address in the wallet selected above at the current rate of {{ rate }} SKY/BTC.", + "fraction-warning": "Only send multiple of the SKY/BTC rate! Skycoin is sent in whole number; fractional SKY is not sent!", + "receive": "Receive Sky", + "receive-desc": "After receiving your Bitcoin, we'll send you your Skycoin. It may take anywhere between 20 minutes and an hour to receive your SKY.", + "status-button": "Status:", + "check-status-button": "Check Status", + "new-order-button": "New Order" + }, + + "wizard": { + "wallet-desc": "If you don't have a Skycoin wallet, use the generated seed to create a new one. If you already have a wallet, toggle over to \"Load Wallet\" and enter your seed.", + "encrypt-desc": "Increase security of your wallet by encrypting it. By entering a password below, your wallet will be encrypted. Only those with the password will be able access the wallet and remove funds.", + "hardware-wallet-link": "Using a Skywallet?", + "finish-button": "Finish", + "back-button": "Back", + + "confirm": { + "title": "Safeguard your seed!", + "desc": "We want to make sure that you wrote down your seed and stored it in a safe place. If you forget your seed, you WILL NOT be able to recover your Skycoin wallet!", + "checkbox": "It’s safe, I swear.", + "button": "Continue" + } + }, + + "wallet": { + "new-address": "New Address", + "new-addresses": "New Addresses", + "show-empty": "Show Empty", + "hide-empty": "Hide Empty", + "encrypt": "Encrypt Wallet", + "decrypt": "Decrypt Wallet", + "decrypt-warning": "Warning: for security reasons, it is not recommended to keep the wallets unencrypted. Caution is advised.", + "delete": "Delete Wallet", + "edit": "Edit Wallet", + "add": "Add Wallet", + "load": "Load Wallet", + "encryption-enabled": "Encryption enabled", + "encryption-disabled": "Encryption disabled", + "hw-security-warning": "Possible security risk. Access the Skywallet options (by pressing the \"Skywallet\" button below the wallets list) while the device is connected for more information.", + "wallet": "Wallet", + "hardware-wallet": "Skywallet", + "delete-confirmation": "WARNING: The wallet \"{{ name }}\" will be removed from the list. To add it again, you will have to reconnect the device and open the Skywallet options (by pressing the \"Skywallet\" button below the wallets list). Do you want to continue?", + "delete-confirmation-check": "Yeah, I want to delete the wallet.", + "max-hardware-wallets-error": "You have already reached the max number of addresses that can be added to the Skywallet.", + "add-many-confirmation": "WARNING: If you add too many addresses without using the previous ones or if you use the last ones and not the first ones, some addresses may not be recovered automatically if you try to restore the wallet using the seed (you will have to add them manually). Do you want to continue?", + + "new": { + "create-title": "Create Wallet", + "load-title": "Load Wallet", + "encrypt-title": "Encrypt Wallet", + "name-label": "Name", + "words-number": "How many word the seed has", + "seed-label": "Seed", + "confirm-seed-label": "Confirm seed", + "seed-warning": "Remember this seed! Keep it in a safe place. If you forget your seed, you will not be able to recover your wallet!", + "create-button": "Create", + "load-button": "Load", + "cancel-button": "Cancel", + "12-words": "12 words", + "24-words": "24 words", + "generate-12-seed": "Generate 12 word seed", + "generate-24-seed": "Generate 24 word seed", + "encrypt": "Encrypt wallet", + "encrypt-warning": "We suggest that you encrypt each one of your wallets with a password. If you forget your password, you can reset it with your seed. Make sure you have your seed saved somewhere safe before encrypting your wallet.", + "unconventional-seed-title": "Possible error", + "unconventional-seed-text": "You introduced an unconventional seed. If you did it for any special reason, you can continue (only recommended for advanced users). However, if your intention is to use a normal system seed, you must delete all the additional text and special characters.", + "unconventional-seed-check": "Continue with the unconventional seed.", + "synchronizing-warning-title": "Warning", + "synchronizing-warning-text": "The wallet is still synchronizing and some addresses may not be restored. If some addresses are not restored, please wait for the wallet to be fully synchronized and add them again manually.", + "synchronizing-warning-continue": "Continue", + "synchronizing-warning-cancel": "Cancel", + "wallet-created": "The wallet has been added to the list.", + + "seed": { + "enter-seed": "Press here to enter your seed.", + "change-seed": "Press to change", + "confirm-seed": "Press here to confirm your seed.", + "confirmed-seed": "Seed confirmed.", + "use-custom-seed": "Press here if you want to enter the seed manually.", + "use-normal-seed": "Press here if you want to enter the seed using the recommended method.", + "custom-seed-warning-title": "Warning", + "custom-seed-warning-text": "This option is only recommended for advanced users. Making mistakes with the seed could cause you to lose access to the funds in case of a problem.", + "custom-seed-warning-text-recovering": "To avoid possible problems, this option should only be used if you want to recover an unconventional seed.", + "custom-seed-warning-check": "I understand the risks and want to continue", + "custom-seed-warning-cancel": "Cancel", + "custom-seed-warning-continue": "Continue", + "incorrect-word": "The word you have entered does not match the requested one.", + "invalid-seed": "The seed you have entered is not valid. Please try again.", + "enter-word": "Enter the word #{{number}}", + "new-seed-help": "You must enter the words of the seed that was generated by the system, to confirm it.", + "recover-seed-help": "Please be sure to enter the correct words in the correct order." + } + }, + + "rename": { + "title": "Rename Wallet", + "name-label": "Name", + "cancel-button": "Cancel", + "rename-button": "Rename" + }, + + "add-addresses": { + "title": "Select quantity", + "name-quantity": "How many addresses to create", + "cancel-button": "Cancel", + "create-button": "Create", + "error": "There was an unexpected error. Please try again." + }, + + "address": { + "show": "Press to show", + "copy": "Copy", + "copy-address": "Copy address", + "copied": "Copied!", + "confirm": "Confirm address", + "outputs": "Unspent outputs", + "history": "History" + } + }, + + "qr": { + "title": "QR Code", + "title-read-only": "QR Code", + "data": "QR Data:", + "address": "Address:", + "request-link": "Request specific amount", + "amount": "Request amount:", + "hours": "Request hours:", + "message": "Message:", + "invalid": "(invalid value)", + "copied": "The text has been copied to the clipboard." + }, + + "send": { + "synchronizing-warning": "The wallet is still synchronizing the data, so the balance shown may be incorrect. Are you sure you want to continue?", + "from-label": "Send from", + "to-label": "Send to", + "amount-label": "Amount", + "personal-note-label": "Personal note", + "personal-note-help": "Use this field to add a text for allowing you to identify the transaction in the future. This text is saved locally, so it will only be visible from this computer", + "wallet-label": "Wallet", + "addresses-label": "Addresses", + "invalid-amount": "Please enter a valid amount", + "convert-confirmation": "Do you also want the already introduced amount to be converted from {{from}} to {{to}}?", + "convert-confirmation-plural": "Do you also want the already introduced amounts to be converted from {{from}} to {{to}}?", + "send-all-available-coins": "send all", + "no-wallet-selected": "You must select a wallet first.", + "precision-error-warning": "A precision error was detected during conversion. Please check the amount that will be sent.", + "invaid-amount-warning": "An invalid value was detected during conversion. Please check the amount that will be sent.", + "precision-errors-warning": "Precision errors were detected during conversion. Please check the amount that will be sent.", + "invaid-amounts-warning": "Invalid values were detected during conversion. Please check the amount that will be sent.", + "multiple-problems-warning": "Some values were not converted because they were invalid or could have been converted with precision errors. Please check the amount that will be sent.", + "no-coins-left": "There are no coins left to send.", + "addresses-help": "Limit the addresses from where the coins and hours could be sent", + "all-addresses": "All the addresses of the selected wallet", + "outputs-label": "Unspent outputs", + "outputs-help": "Limit the unspent outputs from where the coins and hours could be sent. Only the outputs from the selected addresses are shown", + "all-outputs": "All the outputs of the selected addresses", + "available-msg-part1": "With your current selection you can send up to", + "available-msg-part2": "and", + "available-msg-part3": "(at least", + "available-msg-part4": "must be used for the transaction fee).", + "change-address-label": "Custom change address", + "change-address-select": "Select", + "change-address-help": "Address to receive change. If it's not provided, it will be chosen automatically. Click on the \"Select\" link to choose an address from one of your wallets", + "destinations-label": "Destinations", + "destinations-help1": "Destination addresses and their coins", + "destinations-help2": "Destination addresses, their coins and coin hours", + "hours-allocation-label": "Automatic coin hours allocation", + "options-label": "Options", + "value-label": "Coin hours share factor", + "value-help": "The higher the value, the more coin hours will be sent to the recipients and less will be retained", + "preview-button": "Preview", + "send-button": "Send", + "back-button": "Back", + "simple": "Simple", + "advanced": "Advanced", + "select-wallet": "Select Wallet", + "error-saving-note": "The transaction was successfully sent, but it was not possible to save the note.", + "sent": "Transaction successfully sent.", + "total": "Total:", + + "bulk-send": { + "title": "Bulk Send", + "indications": "To send to multiple destinations in a quick way, type each address, coin amount and hour amount (optional) on a line, separated by a comma. Example: if you want to send 10 coins and 5 hours to the \"xyz\" address, type \"xyz,10,5\"; if you want the hours to be calculated automatically, type \"xyz,10\". Decimal values must be separated with a dot.", + "process": "Process", + "error-no-data": "There is no text to process.", + "error-inconsistent-data": "If you set how many hours you want to send to a destinations, you must do so for all destinations.", + "error-invalid-data": "The entered text has an invalid format." + } + }, + + "reset": { + "wallet-label": "Wallet", + "seed-label": "Wallet seed", + "password-label": "New password (leave empty if you want the wallet not to be encrypted)", + "confirm-label": "Confirm new password", + "reset-button": "Reset", + "done": "Password successfully changed." + }, + + "tx": { + "transaction": "Transaction", + "confirm-transaction": "Confirm Transaction", + "from": "From", + "to": "To", + "date": "Date", + "status": "Status", + "coins": "Coins", + "hours": "Hours", + "id": "Tx ID", + "note": "Note", + "without-note": "Without note", + "show-more": "Show more", + "hours-moved": "moved", + "hours-sent": "sent", + "hours-received": "received", + "hours-burned": "burned", + "inputs": "Inputs", + "outputs": "Outputs", + "confirmed": "Confirmed", + "pending": "Pending", + "current-rate": "Calculated at the current rate" + }, + + "edit-note": { + "title": "Edit note", + "cancel-button": "Cancel", + "change-button": "Change" + }, + + "backup": { + "wallet-directory": "Wallet Directory:", + "seed-warning": "BACKUP YOUR SEED. ON PAPER. IN A SAFE PLACE. As long as you have your seed, you can recover your coins.", + "desc": "Use the table below to get seeds from your encrypted wallets.
To get seeds from unencrypted wallets, open the folder above, open the .wlt files in a text editor and recover the seeds.", + "close-button": "Close", + "wallet": "Wallet Label", + "filename": "Filename", + "seed": "Seed", + "show-seed": "Show seed", + "no-wallets": "No encrypted wallets" + }, + + "blockchain": { + "blocks": "Number of blocks", + "time": "Timestamp of last block", + "hash": "Hash of last block", + "current-supply": "Current SKY supply", + "total-supply": "Total SKY supply", + "current-coinhour-supply": "Current Coin Hours supply", + "total-coinhour-supply": "Total Coin Hours supply" + }, + + "network": { + "peer": "Peer", + "source": "Source", + "block-height": "Block height", + "block-height-short": "Block", + "last-seen": "Last seen", + "last-received": "Last received", + "last-sent": "Last sent", + "in": "Incoming", + "out": "Outgoing", + + "sources": { + "default": "Default peer", + "exchange": "Peer exchange" + } + }, + + "pending-txs": { + "timestamp": "Timestamp", + "txid": "Transaction ID", + "none": "No pending transactions", + "my": "Mine", + "all": "All" + }, + + "history": { + "tx-detail": "Transaction Detail", + "moving": "Internally moving", + "moved": "Internally moved", + "sending": "Sending", + "sent": "Sent", + "received": "Received", + "receiving": "Receiving", + "pending": "Pending", + "note": "Note", + "no-txs": "You have no transaction history", + "no-txs-filter": "There are no transactions matching the current filter criteria", + "no-filter": "No filter active (press to select wallets/addresses)", + "filter": "Active filter: ", + "filters": "Active filters: ", + "all-addresses": "All addresses" + }, + + "teller": { + "done": "Completed", + "waiting-confirm": "Waiting for confirmation", + "waiting-deposit": "Waiting for Bitcoin deposit", + "waiting-send": "Waiting to send Skycoin", + "unknown": "Unknown" + }, + + "confirmation" : { + "header-text": "Confirmation", + "confirm-button": "Yes", + "cancel-button": "No", + "close": "Close" + }, + + "service": { + "api" : { + "server-error": "Server error" + }, + "wallet": { + "not-enough-hours": "Not enough available Coin Hours to perform the transaction!" + } + }, + + "hardware-wallet": { + "general" : { + "default-wallet-name": "New Skywallet", + "error-disconnected": "Unable to perform the operation. The Skywallet is not connected.", + "simple-error": "Error. Unable to perform the operation.", + "generic-error": "Unable to perform the operation. Make sure you have connected a valid Skywallet and that it is not waiting for input.", + "generic-error-internet": "Unable to perform the operation. Make sure you have connected a valid Skywallet that is not waiting for input and that you have a connection to the internet/node.", + "error-incorrect-wallet": "Unable to perform the operation. The connected Skywallet is different from the expected one.", + "error-incorrect-pin": "Unable to perform the operation. The PIN you have entered is incorrect.", + "confirm": "Please confirm the operation on the Skywallet.", + "confirm-and-more": "Please confirm the operation on the Skywallet and follow the instructions displayed.", + "follow": "Please follow the instructions displayed on the Skywallet.", + "close": "Close", + "cancel": "Cancel", + "continue": "Continue", + "completed": "Operation completed successfully.", + "refused": "The operation failed or was canceled.", + "name-updated": "The name used to identify this Skywallet in the wallet list has been updated to match the one shown on the device." + }, + "errors": { + "too-many-inputs-outputs": "The transaction has too many inputs or outputs for the Skywallet. Please try again creating several smaller transactions, each one with a smaller number of recipients (if the current transaction has many) or coins.", + "daemon-connection": "Problem connecting to the Skywallet service.", + "timeout": "The operation was canceled due to inactivity. Please try again.", + "invalid-address-generated": "There was a problem with the address generator and the operation had to be canceled.", + "invalid-address": "Invalid address.", + "not-in-bootloader-mode": "To use this option the Skywallet must be in bootloader mode." + }, + "security-warning" : { + "title": "Security warning", + "text": "The last time this Skywallet was connected, one or more security warnings were found. We recommend that you open the Skywallet options (by pressing the link below) while the device is connected and solve the security problems before continuing.", + "link": "Open the Skywallet options window.", + "check": "I understand the risks and want to continue", + "continue": "Continue", + "cancel": "Cancel" + }, + "options" : { + "connecting": "Connecting...", + "disconnected": "No Skywallet detected. Please connect a Skywallet to use this option.", + "unconfigured-detected-title": "Unconfigured Skywallet", + "unconfigured-detected": "A seedless Skywallet has been detected. Select \"Configure automatically\" if you want to configure it as a brand new wallet and start using it. Select \"Restore backup\" if you want to configure the Skywallet with a previously created seed backup.", + "configured-detected": "Skywallet detected. The device is identified in the wallets list as:", + "security-warnings-title": "Security warnings", + "security-warning-title": "Security warning", + "unchecked-version-warning": "It was not possible to verify if the firmware of your Skywallet is up to date. This could be due to problems with your internet connection or because the service is under maintenance.", + "outdated-version-warning": "The firmware of your Skywallet is outdated. We recommend you to update it as soon as possible to ensure safety. To do this, select the \"Update firmware\" option.", + "backup-warning": "You should backup the Skywallet seed or you could lose access to the funds in case of problems. To do this, select the \"Create a backup\" option.", + "pin-warning": "The connected Skywallet does not have a PIN. The PIN code protects the Skywallet from unauthorized parties accessing the device. To create a PIN code, select the \"Create PIN code\" option.", + "options": "Options:", + "update-firmware": "Update firmware", + "configure-automatically": "Configure automatically", + "restore-backup": "Restore backup", + "create-backup": "Create a backup", + "wipe": "Wipe the device", + "confirm-seed": "Confirm seed", + "create-pin": "Create PIN code", + "change-pin": "Change PIN code", + "delete-pin": "Delete PIN code", + "forgotten-pin1": "If you cannot access the wallet because you have forgotten the PIN, you can wipe the Skywallet and then restore it with the seed by clicking", + "forgotten-pin2": "here.", + "firmware-version": "Device firmware version:" + }, + "update-firmware-warning" : { + "title": "Outdated Firmware", + "text": "WARNING: the firmware in your Skywallet is outdated. To stay safe, it is recommended to update it.", + "cancel": "Cancel", + "update": "Update" + }, + "update-firmware" : { + "title-connecting": "Connecting...", + "title-update": "Update Firmware", + "title-install": "Install Firmware", + "text-downloading": "Checking device and downloading files...", + "text-bootloader": "WARNING: if you have already configured this device, before continuing you must have a backup of your seed or you could permanently lose access to the funds.", + "text-not-bootloader": "To update the firmware of your Skywallet you must connect it in bootloader mode (connect it to the computer while pressing the two physical buttons of the device). WARNING: if you have already configured this device, before continuing you must have a backup of your seed or you could permanently lose access to the funds.", + "text-no-firmware": "Welcome. The currently connected Skywallet does not have a firmware installed. A firmware will now be installed so you can start using the device. NOTE: if you have already configured this device and want to recover the funds, you will need your seed.", + "check": "I understand the risks and want to continue", + "follow": "The firmware update has been sent to the Skywallet. Please continue the process on the device.", + "connection-error": "It was not possible to download the firmware. This could be due to problems with your internet connection or because the service is under maintenance.", + "timeout": "The operation was canceled due to inactivity. Please disconnect the device, reconnect it and try again.", + "finished": "Your device has been configured correctly. Please unplug it before continuing." + }, + "generate-seed" : { + "text": "Before proceeding, you can select the number of words you want the seed to have. The seed is a list of words that can be used to recover access to the coins in case of problems. Both values are safe, so if you do not have a special reason for selecting one or the other, you can leave the default value.", + "configuring": "Configuring..." + }, + "restore-seed" : { + "text": "Before proceeding, please select the number of words that the seed you want to recover has.", + "check-text": "You can use this option to enter a seed and check if it is equal to the one in the Skywallet. Before start, select the number of words the seed you want to check has.", + "warning" : "WARNING: to avoid potential problems, use only seeds created with a Skywallet.", + "error-wrong-word": "Error: The retyped word does not match the one requested by the Skywallet.", + "error-invalid-seed": "Error: The seed is not valid. Please be sure to enter the correct words in the correct order.", + "error-wrong-seed": "Error: The seed is valid but does not match the one in the device.", + "correct-seed": "The seed is valid and matches the one in the device." + }, + "added" : { + "title": "New Skywallet", + "configuring": "New Skywallet detected. Configuring...", + "done": "Done", + "added1": "The connected Skywallet has been added to the wallets list with the following name:", + "added2": "Now you can check the balance and the addresses of the Skywallet even when it is not connected. Additionally, you can change the name of the wallet or remove it from the wallets list, if you wish.", + "characters-warning": "If you use non-standard English characters, the name may not be displayed correctly on the device.", + "ok": "Ok" + }, + "wipe" : { + "warning": "WARNING: All the data on the Skywallet will be deleted. If you do not have a backup, you will not be able to access your funds again.", + "confirm-delete": "Also remove from the wallets list" + }, + "create-backup" : { + "warning": "WARNING: You can only create a backup of your Skywallet seed once. If you decide to continue, you will have to write down a group of words (it is recommended to do it on paper and not on a computer) that will appear on the screen of the Skywallet and store the list in a safe place. Anyone with access to the word list (the \"seed\") will be able access the wallet funds, so extreme caution is advised.", + "instructions": "Write down the word list that appear on the screen of the Skywallet. Make sure you respect the order and write each word correctly." + }, + "seed-word" : { + "title": "Enter word", + "info1": "Enter the word shown on the device", + "info2": "You will be asked to enter the words of your backup seed in random order. Also, additional random words could be requested.", + "word": "Requested word", + "error-invalid-word": "The entered word is not valid.", + "error-loading-words": "Loading the word list. Please wait." + }, + "change-pin" : { + "pin-mismatch": "Unable to perform the operation. The PINs you have entered do not match." + }, + "remove-pin" : { + "warning": "WARNING: It is not recommended to remove the PIN code from your Skywallet, as it will be vulnerable to being used by unauthorized parties in case of loss or theft.", + "check": "I understand the risks and want to continue" + }, + "enter-pin" : { + "title": "Enter PIN", + "title-change-current": "Enter the current PIN", + "title-change-new": "Enter the new PIN", + "title-change-confirm": "Confirm the new PIN", + "instructions": "The PIN layout is displayed on the Skywallet screen.", + "instructions-tx": "Enter the PIN to confirm and sign the transaction.", + "instructions-change": "Please enter a secure PIN consisting of 4 to 8 numbers.", + "help": "Need help?" + }, + "pin-help" : { + "title": "Help", + "part1": "When it is necessary to enter the PIN to continue, the Skywallet screen will display a matrix of 9 boxes with numbers in random order (the order changes each time) and you will be asked to enter the PIN in the software wallet using a matrix of 9 buttons that simply show the symbol •.", + "part2": "To enter the PIN, look at the position of the PIN numbers in numbers matrix on the screen of the Skywallet and press the corresponding buttons in the software wallet. For example, if the PIN is \"23\" and the number 2 is in the upper left, number 3 in the middle of the Skywallet numbers matrix, press the upper left and middle button in that order in the software wallet.", + "part3": "If you wish, you can also use the numpad on your keyboard to enter the PIN. However, as in the previous example, if the PIN is \"23\", you can not simply type \"23\" with the numpad, but you will have to press the keys that are in the position where the numbers 2 and 3 are shown on the screen of the Skywallet. Taking into account the previous example, you would have to press the \"7\" and \"5\" keys, because those are the keys that you are in the same position as the numbers shown by the Skywallet." + }, + "create-tx" : { + "title": "Create transaction", + "upper-text": "Please confirm the operation in the Skywallet after verifying if the following data matches EXACTLY with the transaction you wish to send and with those shown by the Skywallet:", + "lower-text": "If any data does not correspond to what the Skywallet shows or the transaction you wish to send, cancel the operation on your Skywallet.", + "send-p1": "and", + "send-p2": "to" + }, + "confirm-address" : { + "title": "Confirm address", + "instructions": "Please confirm on the Skywallet if the address is:", + "short-confirmation": "Address confirmed.", + "confirmation": "Address confirmed. For security, you can re-show the address in the Skywallet using the \"Confirm address\" option, in the menu that you can display by pressing the button at the right of the address balance." + } + }, + + "time-from-now": { + "few-seconds": "a few seconds ago", + "minute": "one minute ago", + "minutes": "{{time}} minutes ago", + "hour": "one hour ago", + "hours": "{{time}} hours ago", + "day": "one day ago", + "days": "{{time}} days ago" + }, + + "exchange": { + "you-send": "You send", + "you-get": "You get (approx.)", + "to-address": "To {{coin}} address", + "price": "Exchange rate", + "time-15": "Exchange time", + "exchange-button": "Exchange", + "min-amount": "Minimum amount:", + "max-amount": "Maximum amount:", + "agree-1": "I agree with", + "agree-2": "Terms of Use", + "agree-3": "and", + "agree-4": "Privacy Policy", + "powered-by": "Powered by", + "need-help": "Need help?", + "support-portal": "Support portal", + "history": "Order history", + "order-not-found": "Order not found", + "status": "Status", + "exchanging": "Exchanging {{from}} for {{to}}", + "select": "Select", + "offline": "Exchange is temporarily offline", + "problem-connecting": "Unable to connect with the service. Please check your Internet connection and try again later.", + "invalid-address": "Invalid address.", + "statuses": { + "user-waiting": "Waiting for deposit. Please send {{amount}} {{from}} to the exchange address shown below", + "user-waiting-info": "The system is waiting for you to make the deposit into the exchange address. The exchange process will start after the deposit is detected and confirmed in the blockchain. If you have already made the deposit, it should be detected shortly.", + "market-waiting-confirmations": "Waiting for transaction confirmations", + "market-waiting-confirmations-info": "The deposit has already been detected and the system is waiting for it to be confirmed in the blockchain.", + "market-confirmed": "Transaction accepted", + "market-confirmed-info": "The transaction has already been confirmed in the blockchain. Preparing to make the exchange soon.", + "market-exchanged": "Traded {{from}} for {{to}}", + "market-exchanged-info": "The exchange has been made. The funds will be transferred to your address in a moment.", + "market-withdraw-waiting": "Sending {{to}} to your address", + "market-withdraw-waiting-info": "The process for sending the coins to your address has been initiated.", + "complete": "Exchange completed!", + "complete-info": "The funds have been successfully sent to your address.", + "error": "Error occurred", + "error-info": "There was an error in the operation, you can find more information below. If you need help, please save all the operation data shown below and contact technical support using the link in the lower right part of this page.", + "user-deposit-timeout": "Order canceled due to inactivity", + "user-deposit-timeout-info": "The system has canceled the order because no deposit was detected, please open a new order. If you need help, please save all the operation data shown below and contact technical support using the link in the lower right part of this page." + }, + "history-window": { + "address": "Address", + "date": "Date" + }, + "details": { + "exchange-addr": "Exchange address (valid for this exchange operation only)", + "exchange-addr-tag": "Payment ID or Destination Tag which must be used for the transaction", + "tx-id": "Transaction ID", + "order-id": "Order ID", + "initial-price": "Initial exchange rate", + "error-msg": "Error message", + "details": "Details", + "start-date": "Start date", + "back": "Back", + "back-alert": "The operation is still in progress. Do you really want to return to the form? You can see the progress of this operation again by pressing the \"Order history\" button" + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/es.json b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/es.json new file mode 100644 index 00000000..8f9f20f1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/es.json @@ -0,0 +1,506 @@ +{ + "common": { + "coin-id": "SKY", + "coin-hours": "Coin Hours", + "usd": "USD", + "loading": "Cargando...", + "new": "Nueva", + "load": "Cargar" + }, + + "errors": { + "error": "Error", + "fetch-version": "No ha sido posible verificar la última versión desde Github", + "incorrect-password": "Contraseña incorrecta", + "error-decrypting": "Error al desencriptar la billetera", + "api-disabled": "API desabilitada", + "no-wallet": "La billetera no existe", + "no-outputs": "No hay salidas no gastadas", + "window-size": "La ventana es demasiado estrecha para el contenido" + }, + + "title": { + "language": "Seleccionar Lenguaje", + "wallets": "Billeteras", + "send": "Enviar", + "history": "Historial", + "buy-coin": "Comprar Skycoins", + "network": "Red", + "blockchain": "Blockchain", + "outputs": "Salidas", + "transactions": "Transacciones", + "pending-txs": "Transacciones Pendientes", + "backup": "Respaldar Billetera", + "explorer": "Explorador de Skycoin", + "seed": "Semilla de la Billetera", + "qrcode": "Código QR", + "reset": "Restablecer contraseña", + "exchange": "Intercambiar", + "select-address": "Seleccionar Dirección", + "order-history": "Historial de órdenes" + }, + + "header": { + "syncing-blocks": "Sincronizando bloques", + "update1": "La actualización", + "update2": "está disponible.", + "synchronizing": "El nodo está sincronizando. Los datos mostrados pueden estar desactualizados.", + "pending-txs1": "Hay una o más", + "pending-txs2": "transacciones pendientes.", + "pending-txs3": "Los datos mostrados pueden estar desactualizados.", + + "errors": { + "no-connections": "Sin conexiones activas, ¡el cliente no está conectado a otros nodos!", + "no-backend1": "Sin acceso al servidor. Por favor, reinicie la aplicación y/o contáctenos vía", + "no-backend2": "Telegram.", + "no-backend3": "", + "csrf": "Vulnerabilidad de seguridad: CSRF no funciona. Por favor, salga de inmediato." + } + }, + + "password": { + "title": "Introduzca Su Contraseña", + "label": "Contraseña", + "confirm-label": "Confirmar contraseña", + "button": "Continuar", + "reset-link": "He olvidado mi contraseña" + }, + + "buy": { + "deposit-address": "Seleccione una dirección para la cual generar un enlace de depósito BTC:", + "select-address": "Seleccione una dirección", + "generate": "Generar", + "deposit-location": "Localización de Depósito", + "deposit-location-desc": "Seleccione la billetera en la que desea que le depositemos sus Skycoins después de recibir los Bitcoins.", + "make-choice": "Realice una selección", + "wallets-desc": "Una nueva dirección BTC es generada cada vez que se selecciona una nueva billetera y dirección. Una única dirección de Skycoin puede tener asignadas hasta 5 direcciones BTC.", + "send": "Enviar Bitcoins", + "send-desc": "Envíe Bitcoins a la dirección abajo indicada. Al recibirlos, le depositaremos los Skycoins en una nueva dirección en la billetera seleccionada más arriba, a la tasa de cambio actual de {{ rate }} SKY/BTC.", + "fraction-warning": "¡Envíe sólo múltiplos de la tasa SKY/BTC! Los Skycoins son enviados en números enteros, ¡no se envían fracciones de SKY!", + "receive": "Recibir SKY", + "receive-desc": "Después de recibir los Bitcoins, le enviaremos sus Skycoins. El tiempo de espera para recibir sus SKY puede ser de entre 20 minutos y una hora.", + "status-button": "Estatus:", + "check-status-button": "Revisar Estatus", + "new-order-button": "Nueva Orden" + }, + + "wizard": { + "wallet-desc": "Si no tiene una billetera, use la semilla generada automáticamente para crear una nueva. Si ya tiene una billetera, seleccione \"Cargar\" e introduzca su semilla.", + "encrypt-desc": "Incremente la seguridad de su billetera encriptándola. Al introducir una contraseña más abajo, su billetera será encriptada. Sólo quien tenga la contraseña podrá acceder a la billetera y retirar fondos.", + "hardware-wallet-link": "¿Utilizando una billetera de hardware?", + "finish-button": "Finalizar", + "back-button": "Volver", + + "confirm": { + "title": "¡Resguarde su semilla!", + "desc": "Queremos asegurarnos de que ha anotado su semilla y la ha almacenado en un lugar seguro. ¡Si olvida su semilla, NO podrá recuperar su billetera!", + "checkbox": "Está segura, lo garantizo.", + "button": "Continuar" + } + }, + + "wallet": { + "new-address": "Nueva Dirección", + "new-addresses": "Nuevas Direcciones", + "show-empty": "Mostrar Vacías", + "hide-empty": "Ocultar Vacías", + "encrypt": "Encriptar Billetera", + "decrypt": "Desencriptar Billetera", + "decrypt-warning": "Advertencia: por razones de seguridad, no se recomienda mantener las carteras desencriptadas. Se aconseja precaución.", + "delete" : "Borrar Billetera", + "edit": "Editar Billetera", + "add": "Agregar Billetera", + "load": "Cargar Billetera", + "encryption-enabled": "Encriptado habilitado", + "encryption-disabled": "Encriptado deshabilitado", + "hw-security-warning": "Posible riesgo de seguridad. Acceda a las opciones de la billetera de hardware (presionando el botón \"Billetera de Hardware\" debajo de la lista de billeteras) mientras el dispositivo está conectado, para más información.", + "wallet": "Billetera", + "hardware-wallet": "Billetera de Hardware", + "delete-confirmation": "ADVERTENCIA: la billetera \"{{ name }}\" será removida de la lista. Para agregarla nuevamente, deberá volver a conectar el dispositivo y abrir las opciones de la billetera del hardware (presionando el botón \"Billetera de hardware\" debajo de la lista de las billeteras). ¿Desea continuar?", + "delete-confirmation-check": "Sí, quiero borrar la billetera.", + "max-hardware-wallets-error": "Ya ha alcanzado el número máximo de direcciones que se puede agregar a la billetera de hardware.", + "add-many-confirmation": "ADVERTENCIA: si agrega demasiadas direcciones sin usar las anteriores o si usa las últimas y no las primeras, es posible que algunas direcciones no se recuperen automáticamente si intenta restaurar la billetera con la semilla (tendrá que agregarlas manualmente). ¿Desea continuar?", + + "new": { + "create-title": "Crear Billetera", + "load-title": "Cargar Billetera", + "encrypt-title": "Encriptar la billetera", + "name-label": "Nombre", + "seed-label": "Semilla", + "confirm-seed-label": "Confirmar semilla", + "seed-warning": "¡Recuerde esta semilla! Manténgala en un lugar seguro. ¡Si olvida su semilla, no podrá recuperar la billetera!", + "create-button": "Crear", + "load-button": "Cargar", + "cancel-button": "Cancelar", + "12-words": "12 palabras", + "24-words": "24 palabras", + "generate-12-seed": "Generar una semilla de 12 palabras", + "generate-24-seed": "Generar una semilla de 24 palabras", + "encrypt": "Encriptar billetera", + "encrypt-warning": "Le sugerimos que encripte con una contraseña cada una de sus billeteras. Si olvida su contraseña, puede restaurarla con la semilla. Asegúrese de guardar su semilla en un lugar seguro antes de encriptar la billetera.", + "unconventional-seed-title": "Posible error", + "unconventional-seed-text": "Usted introdujo una semilla no convencional. Si lo hizo por alguna razón en especial, puede continuar (sólo recomendable para usuarios avanzados). Sin embargo, si su intención es utilizar una semilla normal del sistema, usted debe borrar los textos y/o caracteres especiales adicionales.", + "unconventional-seed-check": "Continuar con la semilla no convencional." + }, + + "rename": { + "title": "Renombrar Billetera", + "name-label": "Nombre", + "cancel-button": "Cancelar", + "rename-button": "Renombrar" + }, + + "add-addresses": { + "title": "Seleccionar cantidad", + "name-quantity": "Cantidad de direcciones a crear", + "cancel-button": "Cancelar", + "create-button": "Crear" + }, + + "address": { + "show": "Presione para mostrar", + "copy": "Copiar", + "copy-address": "Copiar Dirección", + "copied": "¡Copiado!", + "confirm": "Confirmar Dirección", + "outputs": "Salidas No Gastadas", + "history": "Historial" + } + }, + + "send": { + "synchronizing-warning": "La billetera todavía está sincronizando los datos, por lo que el saldo que se muestra puede ser incorrecto. ¿Seguro de que desea continuar?", + "from-label": "Enviar desde", + "to-label": "Enviar a", + "amount-label": "Cantidad", + "notes-label": "Notas", + "wallet-label": "Billetera", + "addresses-label": "Dirección", + "invalid-amount": "Por favor introduzca una cantidad válida", + "addresses-help": "Limite las direcciones desde donde se podrían enviar las monedas y las horas", + "all-addresses": "Todas las direcciones de la billetera seleccionada", + "outputs-label": "Salidas no gastadas", + "outputs-help": "Limite las salidas no gastadas desde donde se podrían enviar las monedas y las horas. Solo se muestran las salidas de las direcciones seleccionadas.", + "all-outputs": "Todas las salidas no gastadas de las direcciones seleccionadas", + "available-msg-part1": "Con su selección actual puede enviar hasta", + "available-msg-part2": "y", + "available-msg-part3": "(al menos", + "available-msg-part4": "deben ser utilizadas para la tarifa de transacción).", + "change-address-label": "Dirección de retorno personalizada", + "change-address-select": "Seleccionar", + "change-address-help": "Dirección para recibir el cambio. Si no se proporciona, será elegida automáticamente. Haga clic en el enlace \"Seleccionar\" para elegir una dirección de una de sus billeteras", + "destinations-label": "Destinos", + "destinations-help1": "Direcciones de destino y sus monedas", + "destinations-help2": "Direcciones de destino, sus monedas y coin hours", + "hours-allocation-label": "Distribución automática de coin hours", + "options-label": "Opciones", + "value-label": "Factor de distribución de las coin hours", + "value-help": "Mientras mayor sea el valor, más coin hours se enviarán a las salidas", + "preview-button": "Preview", + "send-button": "Enviar", + "back-button": "Volver", + "simple": "Simple", + "advanced": "Advanzado", + "select-wallet": "Seleccionar Billetera" + }, + + "reset": { + "wallet-label": "Billetera", + "seed-label": "Semilla de la billetera", + "password-label": "Nueva contraseña (deje en blanco si desea que la billetera no esté encriptada)", + "confirm-label": "Confirme la contraseña", + "reset-button": "Restaurar" + }, + + "tx": { + "transaction": "Transacción", + "confirm-transaction": "Confirmar Transacción", + "from": "Desde", + "to": "A", + "date": "Fecha", + "status": "Estatus", + "coins": "Monedas", + "hours": "Horas", + "id": "Tx ID", + "show-more": "Mostrar más", + "hours-moved": "movida(s)", + "hours-sent": "enviada(s)", + "hours-received": "recibida(s)", + "hours-burned": "quemada(s)", + "inputs": "Entradas", + "outputs": "Salidas", + "confirmed": "Confirmada", + "pending": "Pendiente", + "current-rate": "Calculado a la tasa actual" + }, + + "backup": { + "wallet-directory": "Directorio de la Billetera:", + "seed-warning": "RESPALDE SU SEMILLA. EN PAPEL. EN UN LUGAR SEGURO. Mientras tenga su semilla, podrá recuperar las monedas.", + "desc": "Use la tabla de más abajo para obtener las semillas de sus billeteras encriptadas.
Para obtener las semillas de las billeteras no encriptadas, abra el directorio de más arriba, abra los archivos .wlt en un editor de texto y recupere las semillas.", + "close-button": "Cerrar", + "wallet": "Nombre de la Billetera", + "filename": "Archivo", + "seed": "Semilla", + "show-seed": "Mostrar semilla", + "no-wallets": "No hay billeteras encriptadas" + }, + + "blockchain": { + "blocks": "Cantidad de bloques", + "time": "Fecha del último bloque", + "hash": "Hash del último bloque", + "current-supply": "Suministro de SKY actual", + "total-supply": "Suministro de SKY total", + "current-coinhour-supply": "Suministro de Coin Hours actual", + "total-coinhour-supply": "Suministro de Coin Hours total" + }, + + "network": { + "peer": "Par", + "source": "Fuente", + "block-height": "Altura del bloque", + "block-height-short": "Bloque", + "last-seen": "Última vez visto", + "last-received": "Última recepción", + "last-sent": "Último envío", + "in": "Entrante", + "out": "Saliente", + + "sources": { + "default": "Par por defecto", + "exchange": "Intercambio de pares" + } + }, + + "pending-txs": { + "timestamp": "Fecha", + "txid": "ID de la transacción", + "none": "Actualmente no hay transacciones pendientes", + "my": "Mías", + "all": "Todas" + }, + + "history": { + "tx-detail": "Detalles de la Transacción", + "moving": "Moviendo internamente", + "moved": "Movida internamente", + "sending": "Enviando", + "sent": "Enviada", + "received": "Recibida", + "receiving": "Recibiendo", + "pending": "Pendiente", + "no-txs": "Usted no tiene historial de transacciones", + "no-txs-filter": "No hay transacciones que coincidan con los criterios de filtro actuales", + "no-filter": "Sin filtros activos (Presione para seleccionar billeteras/direcciones)", + "filter": "Filtro activo: ", + "filters": "Filtros activo: ", + "all-addresses": "Todas las direcciones" + }, + + "teller": { + "done": "Completado", + "waiting-confirm": "Esperando confirmación", + "waiting-deposit": "Esperando depósito de Bitcoins", + "waiting-send": "Esperando para envíar Skycoins", + "unknown": "Desconocido" + }, + + "confirmation" : { + "header-text": "Confirmación", + "confirm-button": "Sí", + "cancel-button": "No", + "close": "Cerrar" + }, + + "service": { + "api" : { + "server-error": "Error de servidor" + }, + "wallet": { + "not-enough-hours": "¡No cuenta con suficientes Coin Hours para realizar la operación!" + } + }, + + "hardware-wallet": { + "general" : { + "default-wallet-name": "Nueva billetera de hardware", + "error-disconnected": "No se puede realizar la operación. La billetera de hardware no está conectada.", + "simple-error": "Error, no se puede realizar la operación.", + "generic-error": "No se puede realizar la operación. Asegúrese de haber conectado una billetera de hardware válida y de que no esté esperando por alguna confirmación o respuesta.", + "generic-error-internet": "No se puede realizar la operación. Asegúrese de haber conectado una billetera de hardware válida que no esté esperando por alguna confirmación o respuesta y de que su equipo cuente con conexión a internet y al nodo.", + "error-incorrect-wallet": "No se puede realizar la operación. La billetera de hardware conectada es diferente a la esperada.", + "error-incorrect-pin": "No se puede realizar la operación. El PIN que ha introducido no es correcto.", + "confirm": "Por favor, confirme la operación en la billetera de hardware.", + "confirm-and-more": "Por favor, confirme la operación en la billetera de hardware y siga las instrucciones.", + "close": "Cerrar", + "cancel": "Cancelar", + "continue": "Continuar", + "completed": "La operación se realizó con éxito.", + "refused": "La operación falló o fue cancelada." + }, + "errors": { + "too-many-inputs": "La transacción tiene demasiadas entradas y no se puede procesar. Por favor, póngase en contacto con el soporte técnico.", + "too-many-outputs": "La transacción tiene demasiadas salidas y no se puede procesar. Por favor, póngase en contacto con el soporte técnico." + }, + "security-warning" : { + "title": "Advertencia de seguridad", + "text": "La última vez que se conectó esta billetera de hardware, se encontraron una o más advertencias de seguridad. Le recomendamos que abra las opciones de billetera de hardware (presionando el botón \"Billetera de hardware\" debajo de la lista de billeteras) mientras el dispositivo está conectado y resuelva los problemas de seguridad antes de continuar.", + "check": "Entiendo los riesgos y deseo continuar.", + "continue": "Continuar", + "cancel": "Cancelar" + }, + "options" : { + "connecting": "Conectando...", + "disconnected": "Billetera de hardware no detectada. Por favor, conecte una billetera de hardware para usar esta opción.", + "unconfigured-detected-title": "Billetera de hardware no configurada", + "unconfigured-detected": "Se ha detectado una billetera de hardware sin semilla. Seleccione \"Configurar automáticamente\" si desea configurarla como una billetera nueva y comenzar a usarla inmediatamente, o seleccione \"Restaurar una copia de seguridad\" si desea configurarla con la copia de seguridad de una semilla creada anteriormente y así poder acceder a sus fondos de nuevo.", + "configured-detected": "Billetera de hardware detectada. El dispositivo se identifica en la lista de billeteras como:", + "security-warnings-title": "Advertencias de seguridad", + "security-warning-title": "Advertencia de seguridad", + "backup-warning": "Debe hacer una copia de seguridad de la semilla de la billetera de hardware o podría perder acceso a los fondos en caso de problemas. Para hacer esto, seleccione la opción \"Crear copia de seguridad\".", + "pin-warning": "La billetera de hardware conectada no tiene un PIN. El código PIN protege la billetera de hardware en caso de pérdida, robo y pirateo. Para crear un código PIN, seleccione la opción \"Crear código PIN\".", + "options": "Opciones:", + "configure-automatically": "Configurar automáticamente", + "restore-backup": "Restaurar una copia de seguridad", + "create-backup": "Crear copia de seguridad", + "wipe": "Borrar el dispositivo", + "confirm-seed": "Confirmar la semilla", + "create-pin": "Crear código PIN", + "change-pin": "Cambiar el código PIN", + "forgotten-pin1": "Si no puede acceder a la billetera porque ha olvidado el PIN, puede borrar la billetera del hardware y luego restaurarla con la semilla haciendo clic", + "forgotten-pin2": "aquí." + }, + "generate-seed" : { + "text": "Antes de continuar, puede seleccionar el número de palabras que desea que tenga la semilla. La semilla es una lista de palabras que se pueden usar para recuperar el acceso a las monedas en caso de problemas. Ambos valores son seguros, por lo que si no tiene una razón especial para seleccionar uno u otro, puede dejar el valor predeterminado.", + "configuring": "Configurando..." + }, + "restore-seed" : { + "text": "Antes de continuar, por favor seleccione la cantidad de palabras de la semilla que desea recuperar.", + "check-text": "Puede usar esta opción para ingresar una semilla y verificar si es igual a la de la billetera de hardware. Antes de comenzar, seleccione el número de palabras de la semilla que desea verificar.", + "warning" : "ADVERTENCIA: para evitar posibles problemas, use solo semillas creadas con una billetera de hardware de la misma marca/modelo.", + "error-wrong-word": "Error: la palabra introducida no coincide con la solicitada por la billetera de hardware.", + "error-invalid-seed": "Error: La semilla no es válida. Por favor, asegúrese de ingresar las palabras correctas en el orden correcto.", + "error-wrong-seed": "Error: la semilla es válida pero no coincide con la del dispositivo." + }, + "added" : { + "title": "Nueva Billetera de Hardware", + "configuring": "Nueva billetera de hardware detectada. Configurando...", + "done": "Hecho", + "added1": "La billetera de hardware conectada se ha agregado a la lista de billeteras con el siguiente nombre:", + "added2": "Ahora puede consultar el saldo y las direcciones de la billetera de hardware incluso cuando no está conectada. Además, puede cambiar el nombre de la billetera o eliminarla de la lista de billeteras, si lo desea." + }, + "wipe" : { + "warning": "ADVERTENCIA: Todos los datos en la billetera de hardware serán eliminados. Si no tiene una copia de seguridad, no podrá volver a acceder a sus fondos.", + "confirm-delete": "Quitar también de la lista de billeteras." + }, + "create-backup" : { + "warning": "ADVERTENCIA: Solo puede usar esta opción para hacer una copia de seguridad de la semilla de su billetera de hardware una vez. Si decide continuar, tendrá que escribir un grupo de palabras (se recomienda hacerlo en papel y no en una computadora) que aparecerán en la pantalla de la billetera de hardware y almacenar la lista en un lugar seguro. Cualquier persona con acceso a la lista de palabras (la \"semilla\") podrá acceder a los fondos de la cartera, por lo que se recomienda extremar las precauciones.", + "instructions": "Escriba la lista de palabras que aparecen en la pantalla de la billetera de hardware. Asegúrate de respetar el orden y escribir cada palabra correctamente." + }, + "seed-word" : { + "title": "Ingresar palabra", + "info1": "Introduzca la palabra indicada en el dispositivo", + "info2": "Se le pedirá que ingrese las palabras de su semilla de respaldo en orden aleatorio, más algunas palabras adicionales.", + "word": "Palabra solicitada", + "error-invalid-word": "La palabra introducida no es válida.", + "error-loading-words": "Cargando la lista de palabras. Por favor espere." + }, + "change-pin" : { + "pin-mismatch": "No se puede realizar la operación. Los dos PIN que ha introducido no coinciden." + }, + "enter-pin" : { + "title": "Ingresar PIN", + "title-change-current": "Ingrese el PIN actual", + "title-change-new": "Ingrese el nuevo PIN", + "title-change-confirm": "Confirme el nuevo PIN", + "instructions": "El patrón de números del PIN se muestra en la pantalla de la billetera de hardware.", + "instructions-tx": "Introduzca el PIN para confirmar y firmar la transacción.", + "instructions-change": "Ingrese un PIN difícil de adivinar de entre 4 y 8 números.", + "help": "¿Necesita ayuda?" + }, + "pin-help" : { + "title": "Ayuda", + "part1": "Cuando sea necesario ingresar el PIN para continuar, la pantalla de la billetera del hardware mostrará una matriz de 9 casillas con números en orden aleatorio (el orden cambia cada vez) y se le pedirá que ingrese el PIN en la billetera de software usando una matriz de 9 botones que simplemente muestran el símbolo #.", + "part2": "Para ingresar el PIN, mire la posición de los números del PIN en la matriz de números en la pantalla de la billetera de hardware y presione los botones correspondientes en la billetera de software. Por ejemplo, si el PIN es \"23\", el número 2 está en la esquina superior izquierda y el número 3 en el centro de la matriz de números de billetera de hardware, presione los botones superior izquierdo y central, en ese orden, en la billetera de software.", + "part3": "Si lo desea, también puede usar el teclado numérico para ingresar el PIN. Sin embargo, como en el ejemplo anterior, si el PIN es \"23\", no puede simplemente escribir \"23\" con el teclado numérico, sino que deberá presionar las teclas que están en la posición donde están los números 2 y 3 en la pantalla de la billetera de hardware." + }, + "create-tx" : { + "title": "Crear transacción" + }, + "confirm-address" : { + "title": "Confirmar dirección", + "instructions": "Por favor confirme en la billetera de hardware si la dirección es:", + "short-confirmation": "Dirección confirmada.", + "confirmation": "Dirección confirmada. Por seguridad, puede volver a mostrar la dirección en la billetera de hardware usando la opción \"Confirmar dirección\", en el menú que puede mostrar presionando el botón a la derecha del balance de la direccion." + } + }, + + "time-from-now": { + "few-seconds": "hace pocos segundos", + "minute": "hace un minuto", + "minutes": "hace {{time}} minutos", + "hour": "hace una hora", + "hours": "hace {{time}} horas", + "day": "hace un día", + "days": "hace {{time}} días" + }, + + "exchange": { + "you-send": "Usted envía", + "you-get": "Usted recibe (aprox.)", + "to-address": "A la dirección de {{coin}}", + "price": "Tasa de cambio", + "time-15": "Duración del intercambio", + "exchange-button": "Intercambiar", + "min-amount": "Monto minimo:", + "max-amount": "Monto maximo:", + "agree-1": "Acepto los", + "agree-2": "Términos de Uso", + "agree-3": "y la ", + "agree-4": "Política de Privacidad", + "powered-by": "Manejado por", + "need-help": "¿Necesita ayuda?", + "support-portal": "Portal de soporte", + "history": "Historial de órdenes", + "order-not-found": "Orden no encontrada", + "status": "Estado", + "exchanging": "Intercambiando {{from}} por {{to}}", + "select": "Seleccionar", + "offline": "El servicio está temporalmente offline", + "problem-connecting": "No se puede conectar con el servicio. Por favor, compruebe su conexión a Internet y vuelva a intentarlo más tarde.", + "invalid-address": "Dirección inválida.", + "statuses": { + "user-waiting": "Esperando el deposito. Por favor, envíe {{amount}} {{from}} a la dirección de intercambio indicada más abajo", + "user-waiting-info": "El sistema está a la espera de que realice el depósito en la dirección de intercambio. El proceso de intercambio comenzará después de que se detecte el depósito y sea confirmado en la cadena de bloques. Si ya ha realizado el depósito, debería ser detectado en breve.", + "market-waiting-confirmations": "Esperando las confirmaciones de la transacción", + "market-waiting-confirmations-info": "El depósito ya ha sido detectado y el sistema está esperando que sea confirmado en la cadena de bloques.", + "market-confirmed": "Transacción aceptada", + "market-confirmed-info": "La transacción ya ha sido confirmada en la cadena de bloques. Haciendo los preparativos para realizar el intercambio pronto.", + "market-exchanged": "{{from}} intercambiado por {{to}}", + "market-exchanged-info": "El intercambio se ha realizado. Los fondos serán transferidos a su dirección en un momento.", + "market-withdraw-waiting": "Enviando {{to}} a su dirección", + "market-withdraw-waiting-info": "Se ha iniciado el proceso para enviar las monedas a su dirección.", + "complete": "¡Intercambio completado!", + "complete-info": "Los fondos han sido enviados con éxito a su dirección.", + "error": "Se produjo un error", + "error-info": "Hubo un error en la operación, puede encontrar más información más abajo. Si necesita ayuda, por favor guarde todos los datos de operación que se muestran más abajo y comuníquese con soporte técnico utilizando el enlace que se encuentra en la parte inferior derecha de esta página." + }, + "history-window": { + "address": "Dirección", + "date": "Fecha" + }, + "details": { + "exchange-addr": "Dirección de intercambio", + "exchange-addr-tag": "Payment ID o Destination Tag que debe usarse para la transacción", + "tx-id": "ID de la transacción", + "order-id": "ID de la orden", + "initial-price": "Tasa de cambio inicial", + "error-msg": "Mensaje de error", + "details": "Detalles", + "start-date": "Fecha de inicio", + "back": "Volver", + "back-alert": "La operación aún está en progreso. ¿Realmente desea volver al formulario? Puede ver el progreso de esta operación nuevamente presionando el botón \"Historial de pedidos\"" + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/es_base.json b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/es_base.json new file mode 100644 index 00000000..402d23ce --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/es_base.json @@ -0,0 +1,506 @@ +{ + "common": { + "coin-id": "SKY", + "coin-hours": "Coin Hours", + "usd": "USD", + "loading": "Loading...", + "new": "New", + "load": "Load" + }, + + "errors": { + "error": "Error", + "fetch-version": "Unable to fetch latest release version from Github", + "incorrect-password": "Incorrect password", + "error-decrypting": "Error decrypting the wallet", + "api-disabled": "API disabled", + "no-wallet": "Wallet does not exist", + "no-outputs": "No unspent outputs", + "window-size": "The window is too narrow for the content" + }, + + "title": { + "language": "Select Language", + "wallets": "Wallets", + "send": "Send", + "history": "History", + "buy-coin": "Buy Skycoin", + "network": "Networking", + "blockchain": "Blockchain", + "outputs": "Outputs", + "transactions": "Transactions", + "pending-txs": "Pending Transactions", + "backup": "Backup Wallet", + "explorer": "Skycoin Explorer", + "seed": "Wallet Seed", + "qrcode": "QR Code", + "reset": "Reset Password", + "exchange": "Exchange", + "select-address": "Select Address", + "order-history": "Order history" + }, + + "header": { + "syncing-blocks": "Syncing blocks", + "update1": "Wallet update", + "update2": "available.", + "synchronizing": "The wallet is synchronizing. Data you see may not be updated.", + "pending-txs1": "There are some", + "pending-txs2": "pending transactions.", + "pending-txs3": "Data you see may not be updated.", + + "errors": { + "no-connections": "No connections active, your client is not connected to any other nodes!", + "no-backend1": "Cannot reach backend. Please restart the app and/or seek help on our", + "no-backend2": "Telegram.", + "no-backend3": "", + "csrf": "Security vulnerability: CSRF is not working, please exit immediately." + } + }, + + "password": { + "title": "Enter Password", + "label": "Password", + "confirm-label": "Confirm password", + "button": "Proceed", + "reset-link": "I forgot my password" + }, + + "buy": { + "deposit-address": "Choose an address to generate a BTC deposit link for:", + "select-address": "Select address", + "generate": "Generate", + "deposit-location": "Deposit Location", + "deposit-location-desc": "Choose a wallet where you'd like us to deposit your Skycoin after we receive your Bitcoin.", + "make-choice": "Make a choice", + "wallets-desc": "Each time a new wallet and address are selected, a new BTC address is generated. A single Skycoin address can have up to 5 BTC addresses assigned to it.", + "send": "Send Bitcoin", + "send-desc": "Send Bitcoin to the address below. Once received, we will deposit the Skycoin to a new address in the wallet selected above at the current rate of {{ rate }} SKY/BTC.", + "fraction-warning": "Only send multiple of the SKY/BTC rate! Skycoin is sent in whole number; fractional SKY is not sent!", + "receive": "Receive Sky", + "receive-desc": "After receiving your Bitcoin, we'll send you your Skycoin. It may take anywhere between 20 minutes and an hour to receive your SKY.", + "status-button": "Status:", + "check-status-button": "Check Status", + "new-order-button": "New Order" + }, + + "wizard": { + "wallet-desc": "If you don't have a Skycoin wallet, use the generated seed to create a new one. If you already have a wallet, toggle over to \"Load Wallet\" and enter your seed.", + "encrypt-desc": "Increase security of your wallet by encrypting it. By entering a password below, your wallet will be encrypted. Only those with the password will be able access the wallet and remove funds.", + "hardware-wallet-link": "Using a hardware wallet?", + "finish-button": "Finish", + "back-button": "Back", + + "confirm": { + "title": "Safeguard your seed!", + "desc": "We want to make sure that you wrote down your seed and stored it in a safe place. If you forget your seed, you WILL NOT be able to recover your Skycoin wallet!", + "checkbox": "It’s safe, I swear.", + "button": "Continue" + } + }, + + "wallet": { + "new-address": "New Address", + "new-addresses": "New Addresses", + "show-empty": "Show Empty", + "hide-empty": "Hide Empty", + "encrypt": "Encrypt Wallet", + "decrypt": "Decrypt Wallet", + "decrypt-warning": "Warning: for security reasons, it is not recommended to keep the wallets unencrypted. Caution is advised.", + "delete": "Delete Wallet", + "edit": "Edit Wallet", + "add": "Add Wallet", + "load": "Load Wallet", + "encryption-enabled": "Encryption enabled", + "encryption-disabled": "Encryption disabled", + "hw-security-warning": "Possible security risk. Access the hardware wallet options (by pressing the \"Hardware Wallet\" button below the wallets list) while the device is connected for more information.", + "wallet": "Wallet", + "hardware-wallet": "Hardware Wallet", + "delete-confirmation": "WARNING: The wallet \"{{ name }}\" will be removed from the list. To add it again, you will have to reconnect the device and open the hardware wallet options (by pressing the \"Hardware Wallet\" button below the wallets list). Do you want to continue?", + "delete-confirmation-check": "Yeah, I want to delete the wallet.", + "max-hardware-wallets-error": "You have already reached the max number of addresses that can be added to the hardware wallet.", + "add-many-confirmation": "WARNING: If you add too many addresses without using the previous ones or if you use the last ones and not the first ones, some addresses may not be recovered automatically if you try to restore the wallet using the seed (you will have to add them manually). Do you want to continue?", + + "new": { + "create-title": "Create Wallet", + "load-title": "Load Wallet", + "encrypt-title": "Encrypt Wallet", + "name-label": "Name", + "seed-label": "Seed", + "confirm-seed-label": "Confirm seed", + "seed-warning": "Remember this seed! Keep it in a safe place. If you forget your seed, you will not be able to recover your wallet!", + "create-button": "Create", + "load-button": "Load", + "cancel-button": "Cancel", + "12-words": "12 words", + "24-words": "24 words", + "generate-12-seed": "Generate 12 word seed", + "generate-24-seed": "Generate 24 word seed", + "encrypt": "Encrypt wallet", + "encrypt-warning": "We suggest that you encrypt each one of your wallets with a password. If you forget your password, you can reset it with your seed. Make sure you have your seed saved somewhere safe before encrypting your wallet.", + "unconventional-seed-title": "Possible error", + "unconventional-seed-text": "You introduced an unconventional seed. If you did it for any special reason, you can continue (only recommended for advanced users). However, if your intention is to use a normal system seed, you must delete all the additional text and special characters.", + "unconventional-seed-check": "Continue with the unconventional seed." + }, + + "rename": { + "title": "Rename Wallet", + "name-label": "Name", + "cancel-button": "Cancel", + "rename-button": "Rename" + }, + + "add-addresses": { + "title": "Select quantity", + "name-quantity": "How many addresses to create", + "cancel-button": "Cancel", + "create-button": "Create" + }, + + "address": { + "show": "Press to show", + "copy": "Copy", + "copy-address": "Copy address", + "copied": "Copied!", + "confirm": "Confirm address", + "outputs": "Unspent outputs", + "history": "History" + } + }, + + "send": { + "synchronizing-warning": "The wallet is still synchronizing the data, so the balance shown may be incorrect. Are you sure you want to continue?", + "from-label": "Send from", + "to-label": "Send to", + "amount-label": "Amount", + "notes-label": "Notes", + "wallet-label": "Wallet", + "addresses-label": "Addresses", + "invalid-amount": "Please enter a valid amount", + "addresses-help": "Limit the addresses from where the coins and hours could be sent", + "all-addresses": "All the addresses of the selected wallet", + "outputs-label": "Unspent outputs", + "outputs-help": "Limit the unspent outputs from where the coins and hours could be sent. Only the outputs from the selected addresses are shown", + "all-outputs": "All the outputs of the selected addresses", + "available-msg-part1": "With your current selection you can send up to", + "available-msg-part2": "and", + "available-msg-part3": "(at least", + "available-msg-part4": "must be used for the transaction fee).", + "change-address-label": "Custom change address", + "change-address-select": "Select", + "change-address-help": "Address to receive change. If it's not provided, it will be chosen automatically. Click on the \"Select\" link to choose an address from one of your wallets", + "destinations-label": "Destinations", + "destinations-help1": "Destination addresses and their coins", + "destinations-help2": "Destination addresses, their coins and coin hours", + "hours-allocation-label": "Automatic coin hours allocation", + "options-label": "Options", + "value-label": "Coin hours share factor", + "value-help": "The higher the value, the more coin hours will be sent to outputs", + "preview-button": "Preview", + "send-button": "Send", + "back-button": "Back", + "simple": "Simple", + "advanced": "Advanced", + "select-wallet": "Select Wallet" + }, + + "reset": { + "wallet-label": "Wallet", + "seed-label": "Wallet seed", + "password-label": "New password (leave empty if you want the wallet not to be encrypted)", + "confirm-label": "Confirm new password", + "reset-button": "Reset" + }, + + "tx": { + "transaction": "Transaction", + "confirm-transaction": "Confirm Transaction", + "from": "From", + "to": "To", + "date": "Date", + "status": "Status", + "coins": "Coins", + "hours": "Hours", + "id": "Tx ID", + "show-more": "Show more", + "hours-moved": "moved", + "hours-sent": "sent", + "hours-received": "received", + "hours-burned": "burned", + "inputs": "Inputs", + "outputs": "Outputs", + "confirmed": "Confirmed", + "pending": "Pending", + "current-rate": "Calculated at the current rate" + }, + + "backup": { + "wallet-directory": "Wallet Directory:", + "seed-warning": "BACKUP YOUR SEED. ON PAPER. IN A SAFE PLACE. As long as you have your seed, you can recover your coins.", + "desc": "Use the table below to get seeds from your encrypted wallets.
To get seeds from unencrypted wallets, open the folder above, open the .wlt files in a text editor and recover the seeds.", + "close-button": "Close", + "wallet": "Wallet Label", + "filename": "Filename", + "seed": "Seed", + "show-seed": "Show seed", + "no-wallets": "No encrypted wallets" + }, + + "blockchain": { + "blocks": "Number of blocks", + "time": "Timestamp of last block", + "hash": "Hash of last block", + "current-supply": "Current SKY supply", + "total-supply": "Total SKY supply", + "current-coinhour-supply": "Current Coin Hours supply", + "total-coinhour-supply": "Total Coin Hours supply" + }, + + "network": { + "peer": "Peer", + "source": "Source", + "block-height": "Block height", + "block-height-short": "Block", + "last-seen": "Last seen", + "last-received": "Last received", + "last-sent": "Last sent", + "in": "Incoming", + "out": "Outgoing", + + "sources": { + "default": "Default peer", + "exchange": "Peer exchange" + } + }, + + "pending-txs": { + "timestamp": "Timestamp", + "txid": "Transaction ID", + "none": "No pending transactions", + "my": "Mine", + "all": "All" + }, + + "history": { + "tx-detail": "Transaction Detail", + "moving": "Internally moving", + "moved": "Internally moved", + "sending": "Sending", + "sent": "Sent", + "received": "Received", + "receiving": "Receiving", + "pending": "Pending", + "no-txs": "You have no transaction history", + "no-txs-filter": "There are no transactions matching the current filter criteria", + "no-filter": "No filter active (press to select wallets/addresses)", + "filter": "Active filter: ", + "filters": "Active filters: ", + "all-addresses": "All addresses" + }, + + "teller": { + "done": "Completed", + "waiting-confirm": "Waiting for confirmation", + "waiting-deposit": "Waiting for Bitcoin deposit", + "waiting-send": "Waiting to send Skycoin", + "unknown": "Unknown" + }, + + "confirmation" : { + "header-text": "Confirmation", + "confirm-button": "Yes", + "cancel-button": "No", + "close": "Close" + }, + + "service": { + "api" : { + "server-error": "Server error" + }, + "wallet": { + "not-enough-hours": "Not enough available Coin Hours to perform the transaction!" + } + }, + + "hardware-wallet": { + "general" : { + "default-wallet-name": "New hardware wallet", + "error-disconnected": "Unable to perform the operation. The hardware wallet is not connected.", + "simple-error": "Error, Unable to perform the operation.", + "generic-error": "Unable to perform the operation. Make sure you have connected a valid hardware wallet and that it is not waiting for input.", + "generic-error-internet": "Unable to perform the operation. Make sure you have connected a valid hardware wallet that is not waiting for input and that you have a connection to the internet/node.", + "error-incorrect-wallet": "Unable to perform the operation. The connected hardware wallet is different from the expected one.", + "error-incorrect-pin": "Unable to perform the operation. The PIN you have entered is not correct.", + "confirm": "Please, confirm the operation in the hardware wallet.", + "confirm-and-more": "Please, confirm the operation in the hardware wallet and follow the instructions.", + "close": "Close", + "cancel": "Cancel", + "continue": "Continue", + "completed": "Operation completed successfully.", + "refused": "The operation failed or was canceled." + }, + "errors": { + "too-many-inputs": "The transaction has too many inputs and can not be processed. Please contact technical support.", + "too-many-outputs": "The transaction has too many outputs and can not be processed. Please contact technical support." + }, + "security-warning" : { + "title": "Security warning", + "text": "The last time this hardware wallet was connected, one or more security warnings were found. We recommend you to open the hardware wallet options (by pressing the \"Hardware Wallet\" button below the wallets list) while the device is connected and solve the security problems before continuing.", + "check": "I understand the risks and want to continue", + "continue": "Continue", + "cancel": "Cancel" + }, + "options" : { + "connecting": "Connecting...", + "disconnected": "No hardware wallet detected. Please connect a hardware wallet to use this option.", + "unconfigured-detected-title": "Unconfigured hardware wallet", + "unconfigured-detected": "A seedless hardware wallet has been detected. Select \"Configure automatically\" if you want to configure it as a brand new wallet and start using it immediately, or select \"Restore backup\" if you want to configure it with a previously created seed backup and thus be able to access your funds again.", + "configured-detected": "Hardware wallet detected. The device is identified in the wallets list as:", + "security-warnings-title": "Security warnings", + "security-warning-title": "Security warning", + "backup-warning": "You should backup the hardware wallet seed or you could lose access to the funds in case of problems. To do this, select the \"Create a backup\" option.", + "pin-warning": "The connected hardware wallet does not have a PIN. The PIN code protects the hardware wallet in case of loss, theft and hacks. To create a PIN code, select the \"Create PIN code\" option.", + "options": "Options:", + "configure-automatically": "Configure automatically", + "restore-backup": "Restore backup", + "create-backup": "Create a backup", + "wipe": "Wipe the device", + "confirm-seed": "Confirm seed", + "create-pin": "Create PIN code", + "change-pin": "Change PIN code", + "forgotten-pin1": "If you can not access the wallet because you have forgotten the PIN, you can wipe the hardware wallet and then restore it with the seed by clicking", + "forgotten-pin2": "here." + }, + "generate-seed" : { + "text": "Before proceeding, you can select the number of words you want the seed to have. The seed is a list of words that can be used to recover access to the coins in case of problems. Both values are safe, so if you do not have a special reason for selecting one or the other, you can leave the default value.", + "configuring": "Configuring..." + }, + "restore-seed" : { + "text": "Before proceeding, please select the number of words that the seed you want to recover has.", + "check-text": "You can use this option to enter a seed and check if it is equal to the one in the hardware wallet. Before start, select the number of words the seed you want to check has.", + "warning" : "WARNING: to avoid potential problems, use only seeds created with a hardware wallet from the same brand/model.", + "error-wrong-word": "Error: The retyped word does not match the one requested by the hardware wallet.", + "error-invalid-seed": "Error: The seed is not valid. Please be sure to enter the correct words in the correct order.", + "error-wrong-seed": "Error: The seed is valid but does not match the one in the device." + }, + "added" : { + "title": "New Hardware Wallet", + "configuring": "New hardware wallet detected. Configuring...", + "done": "Done", + "added1": "The connected hardware wallet has been added to the wallets list with the following name:", + "added2": "Now you can check the balance and the addresses of the hardware wallet even when it is not connected. Additionally, you can change the name of the wallet or remove it from the wallets list, if you wish." + }, + "wipe" : { + "warning": "WARNING: All the data in the hardware wallet will be deleted. If you do not have a backup, you will not be able to access your funds again.", + "confirm-delete": "Also remove from the wallets list" + }, + "create-backup" : { + "warning": "WARNING: You can only use this option to backup your hardware wallet seed once. If you decide to continue, you will have to write down a group of words (it is recommended to do it on paper and not on a computer) that will appear on the screen of the hardware wallet and store the list in a safe place. Anyone with access to the word list (the \"seed\") will be able access the wallet balance, so extreme caution is advised.", + "instructions": "Write down the word list that appear on the screen of the hardware wallet. Make sure you respect the order and write each word correctly." + }, + "seed-word" : { + "title": "Enter word", + "info1": "Enter the word indicated in the device", + "info2": "You will be asked to enter the words of your backup seed in random order, plus a few additional words.", + "word": "Requested word", + "error-invalid-word": "The entered word is not valid.", + "error-loading-words": "Loading the word list. Please wait." + }, + "change-pin" : { + "pin-mismatch": "Unable to perform the operation. Two PINs you have entered do not match." + }, + "enter-pin" : { + "title": "Enter PIN", + "title-change-current": "Enter the current PIN", + "title-change-new": "Enter the new PIN", + "title-change-confirm": "Confirm the new PIN", + "instructions": "The PIN layout is displayed on the hardware wallet screen.", + "instructions-tx": "Enter the PIN to confirm and sign the transaction.", + "instructions-change": "Please enter a hard-to-guess PIN of between 4 and 8 numbers.", + "help": "Need help?" + }, + "pin-help" : { + "title": "Help", + "part1": "When it is necessary to enter the PIN to continue, the hardware wallet screen will display a matrix of 9 boxes with numbers in random order (the order changes each time) and you will be asked to enter the PIN in the software wallet using a matrix of 9 buttons that simply show the symbol #.", + "part2": "To enter the PIN, look at the position of the PIN numbers in numbers matrix on the screen of the hardware wallet and press the corresponding buttons in the software wallet. For example, if the PIN is \"23\" and the number 2 is in the upper left, number 3 in the middle of the hardware wallet numbers matrix, press the upper left and middle button in that order in the software wallet.", + "part3": "If you wish, you can also use the numpad on your keyboard to enter the PIN. However, as in the previous example, if the PIN is \"23\", you can not simply type \"23\" with the numpad, but you will have to press the keys that are in the position where the numbers 2 and 3 are shown on the screen of the hardware wallet." + }, + "create-tx" : { + "title": "Create transaction" + }, + "confirm-address" : { + "title": "Confirm address", + "instructions": "Please confirm on the hardware wallet if the address is:", + "short-confirmation": "Address confirmed.", + "confirmation": "Address confirmed. For security, you can re-show the address in the hardware wallet using the \"Confirm address\" option, in the menu that you can display by pressing the button at the right of the address balance." + } + }, + + "time-from-now": { + "few-seconds": "a few seconds ago", + "minute": "one minute ago", + "minutes": "{{time}} minutes ago", + "hour": "one hour ago", + "hours": "{{time}} hours ago", + "day": "one day ago", + "days": "{{time}} days ago" + }, + + "exchange": { + "you-send": "You send", + "you-get": "You get (approx.)", + "to-address": "To {{coin}} address", + "price": "Exchange rate", + "time-15": "Exchange time", + "exchange-button": "Exchange", + "min-amount": "Minimum amount:", + "max-amount": "Maximum amount:", + "agree-1": "I agree with", + "agree-2": "Terms of Use", + "agree-3": "and", + "agree-4": "Privacy Policy", + "powered-by": "Powered by", + "need-help": "Need help?", + "support-portal": "Support portal", + "history": "Order history", + "order-not-found": "Order not found", + "status": "Status", + "exchanging": "Exchanging {{from}} for {{to}}", + "select": "Select", + "offline": "Exchange is temporarily offline", + "problem-connecting": "Unable to connect with the service. Please check your Internet connection and try again later.", + "invalid-address": "Invalid address.", + "statuses": { + "user-waiting": "Waiting for deposit. Please send {{amount}} {{from}} to the exchange address shown below", + "user-waiting-info": "The system is waiting for you to make the deposit into the exchange address. The exchange process will start after the deposit is detected and confirmed in the blockchain. If you have already made the deposit, it should be detected shortly.", + "market-waiting-confirmations": "Waiting for transaction confirmations", + "market-waiting-confirmations-info": "The deposit has already been detected and the system is waiting for it to be confirmed in the blockchain.", + "market-confirmed": "Transaction accepted", + "market-confirmed-info": "The transaction has already been confirmed in the blockchain. Preparing to make the exchange soon.", + "market-exchanged": "Traded {{from}} for {{to}}", + "market-exchanged-info": "The exchange has been made. The funds will be transferred to your address in a moment.", + "market-withdraw-waiting": "Sending {{to}} to your address", + "market-withdraw-waiting-info": "The process for sending the coins to your address has been initiated.", + "complete": "Exchange completed!", + "complete-info": "The funds have been successfully sent to your address.", + "error": "Error occurred", + "error-info": "There was an error in the operation, you can find more information below. If you need help, please save all the operation data shown below and contact technical support using the link in the lower right part of this page." + }, + "history-window": { + "address": "Address", + "date": "Date" + }, + "details": { + "exchange-addr": "Exchange address", + "exchange-addr-tag": "Payment ID or Destination Tag which must be used for the transaction", + "tx-id": "Transaction ID", + "order-id": "Order ID", + "initial-price": "Initial exchange rate", + "error-msg": "Error message", + "details": "Details", + "start-date": "Start date", + "back": "Back", + "back-alert": "The operation is still in progress. Do you really want to return to the form? You can see the progress of this operation again by pressing the \"Order history\" button" + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/ru.json b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/ru.json new file mode 100644 index 00000000..69cd50e5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/ru.json @@ -0,0 +1,250 @@ +{ + "common": { + "coin-id": "SKY", + "coin-hours": "CH", + "loading": "Загрузка...", + "new": "Ðовый", + "load": "Импортировать" + }, + + "errors": { + "fetch-version": "Ðе удалоÑÑŒ получить поÑледнюю верÑию Ñ Github", + "incorrect-password": "Ðеверный пароль", + "api-disabled": "API выключен", + "no-wallet": "Кошелёк не ÑущеÑтвует", + "no-outputs": "Ðе доÑтаточно ÑредÑтв" + }, + + "title": { + "wallets": "Кошельки", + "send": "Отправить", + "history": "ИÑториÑ", + "buy-coin": "Купить Skycoin", + "network": "Сеть", + "blockchain": "Блокчейн", + "outputs": "Выходы (Outputs)", + "transactions": "Транзакции", + "pending-txs": "Ðеподтверждённые транзакции", + "backup": "Резервное копирование", + "explorer": "Skycoin ÑкÑплорер", + "seed": "Фраза воÑтановлениÑ", + "qrcode": "QR-код" + }, + + "header": { + "syncing-blocks": "Идёт ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¾Ð²...", + "update1": "Обновление кошелька", + "update2": "доÑтупно.", + "pending-txs1": "СущеÑтвует", + "pending-txs2": "транзакции, требующие подтверждениÑ.", + "pending-txs3": "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ‚ быть не актуальной. УбедитеÑÑŒ что у Ð²Ð°Ñ Ð¿Ñ€Ð¸ÑутÑтвует Ñоединение Ñ Ñетью.", + + "errors": { + "no-connections": "Ðет активных Ñоединений, ваш клиент не подключен к другим узлам!", + "no-backend1": "Ðет доÑтупа к ÑервиÑу. ПерезапуÑтите приложение или обратитÑеь за помощью в нашей группе", + "no-backend2": "в телеграмме.", + "no-backend3": "", + "csrf": "Возможные уÑзвимоÑти безопаÑноÑти: CSRF не работает." + } + }, + + "password": { + "title": "Введите пароль", + "label": "Пароль", + "confirm-label": "Подтвердите пароль", + "button": "Продолжить" + }, + + "buy": { + "deposit-address": "Выберите кошелёк Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ð¸ депозитного адреÑа:", + "select-address": "Выберите адреÑ", + "generate": "Сгенерировать", + "deposit-location": "ÐÐ´Ñ€ÐµÑ Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ", + "deposit-location-desc": "Выберите кошелёк Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Skycoin, поÑле уÑпешно отправленного депозита.", + "make-choice": "Сделайте выбор", + "wallets-desc": "При выборе адреÑа, каждый раз генерируетÑÑ Ð½Ð¾Ð²Ñ‹Ð¹ Ð°Ð´Ñ€ÐµÑ Ð´Ð»Ñ Ð´ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð°. Один Ð°Ð´Ñ€ÐµÑ Ð¼Ð¾Ð¶ÐµÑ‚ быть прикреплён к ограниченному количеÑтву адреÑов.", + "send": "Пошлите выбранную криптовалюту", + "send-desc": "Отправьте выбранную вами криптовалюту на Ð°Ð´Ñ€ÐµÑ ÑƒÐºÐ°Ð·Ð°Ð½Ñ‹Ð¹ ниже. По получению и поÑле доÑтаточного Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶ÐµÐ½Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¾Ð², вы получите Skycoin на указаный Ð°Ð´Ñ€ÐµÑ Ð¿Ð¾ курÑу {{ rate }} Skycoin/Selected Coin.", + "fraction-warning": "Рекомендовано поÑылать целые значениÑ.", + "receive": "Получить Skycoin", + "receive-desc": "ПоÑле Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð¾Ð¹ криптавалюты, вы получите Skycoin. Это может занÑÑ‚ÑŒ от неÑкольких Ñекунд до неÑкольких дней, в завиÑимоÑти от выбранного ÑпоÑоба оплаты и загруженноÑти Ñети.", + "status-button": "СтатуÑ:", + "check-status-button": "Проверить ÑтатуÑ", + "new-order-button": "Ðовый заказ", + "refresh": "Обновить", + "available-now": "ДоÑтупно:", + "choose-preference": "Выберите ÑпоÑоб оплаты. Имейте в виду, что некоторые ÑпоÑобы могут быть временно отключены.", + "choose": "Выберите вашу любимую крипту ;)", + "send-coin":"Отправить", + "send-coin-text-1": "на Ð°Ð´Ñ€ÐµÑ Ð½Ð¸Ð¶Ðµ. ПоÑле доÑтаточного количеÑтва подтверждений на блокчейне, вы получите Skycoin на выбранный вами кошелёк по курÑу" + }, + + "wizard": { + "wallet-desc": "ЕÑли у Ð²Ð°Ñ Ð½ÐµÑ‚ кошелька Skycoin, иÑпользуйте Ñгенерированную фразу Ð´Ð»Ñ ÐµÐ³Ð¾ ÑозданиÑ. ЕÑли фраза у Ð²Ð°Ñ ÑƒÐ¶Ðµ еÑÑ‚ÑŒ, нажмите \"Импортирование кошелька\" и введите вашу фразу.", + "encrypt-desc": "Ð”Ð»Ñ Ð±Ð¾Ð»ÑŒÑˆÐµÐ¹ безопаÑти, рекомендуем добавить пароль Ð´Ð»Ñ ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ. СредÑтва можно будет отправлÑÑ‚ÑŒ только при наличии паролÑ. УбедитеÑÑŒ, что вы его помните.", + "finish-button": "Закончить", + "back-button": "Ðазад", + + "confirm": { + "title": "Держите Ñвою фразу в Ñохраном меÑте!", + "desc": "УбедитеÑÑŒ, что вы запиÑали фразу воÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ держите её в надёжном меÑте. При утере фразы вы потерÑете доÑтуп к вашему кошельку Skycoin!", + "checkbox": "КлÑнуÑÑŒ. Я запиÑал.", + "button": "Продолжить" + } + }, + + "wallet": { + "new-address": "Ðовый адреÑ", + "show-empty": "Показать пуÑтые", + "hide-empty": "Скрыть пуÑтые", + "encrypt": "Зашифровать кошелёк", + "decrypt": "РаÑшифровать кошелёк", + "edit": "Редактирвоать", + "add": "Ðовый кошелёк", + "load": "Импортировать", + "encryption-enabled": "Зашифрован", + "encryption-disabled": "Без шифрованиÑ", + "wallet": "Кошелёк", + + "new": { + "create-title": "Создать кошелёк", + "load-title": "Импортировать кошелёк", + "encrypt-title": "Шифровать кошелёк", + "name-label": "Ð˜Ð¼Ñ ÐºÐ¾ÑˆÐµÐ»ÑŒÐºÐ°", + "seed-label": "Фраза воÑтановлениÑ", + "confirm-seed-label": "Подтвердите фразу", + "seed-warning": "Запомните Ñта фразу или запишите и держите в надежном меÑте, в дали от чужих глаз. При потере фразы вы не Ñможете воÑтановить Skycoin кошелёк!", + "create-button": "Создать", + "load-button": "Импортировать", + "cancel-button": "Отмена", + "12-words": "12 Ñлов", + "24-words": "24 Ñлова", + "generate-12-seed": "Сгенирировать фразу из 12 Ñлов", + "generate-24-seed": "Сгенирировать фразу из 24 Ñлов", + "encrypt": "Включить шифрование", + "encrypt-warning": "Мы рекомендуем шифровать вÑе ваши кашельки при помощи надёжного паролÑ. Так же убедитеÑÑŒ, что фраза воÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ð¸Ñана и хранитÑÑ Ð² надёжном меÑте." + }, + + "rename": { + "title": "Переименование кошелька", + "name-label": "ИмÑ", + "cancel-button": "Отмена", + "rename-button": "Переименовать" + }, + + "address": { + "copy": "Копировать", + "copy-address": "Копировать адреÑ", + "copied": "Скопировано!", + "outputs": "Ðепотраченые выходы (Unspent Outputs)" + } + }, + + "send": { + "from-label": "Отправить Ñ", + "to-label": "Получить на", + "amount-label": "Сумма", + "notes-label": "Заметки", + "wallet-label": "Кошелёк", + "addresses-label": "ÐдреÑ", + "addresses-help": "ÐÐ´Ñ€ÐµÑ ÐºÐ¾ÑˆÐµÐ»ÑŒÐºÐ° Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ", + "change-address-label": "ÐÐ´Ñ€ÐµÑ Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¾Ñтатка", + "change-address-help": "ÐÐ´Ñ€ÐµÑ Ð´Ð»Ñ Ñдачи. ЕÑли вы его не укажите, то он будет выбран автоматичеÑки", + "destinations-label": "ÐдреÑа получателей", + "destinations-help1": "ÐдреÑа получателей и Ñумма Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ", + "destinations-help2": "ÐдреÑа получателей, Ñумма Skycoin & CH Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ", + "hours-allocation-label": "ÐвтоматичеÑки подÑчитывать чаÑÑ‹ (CH)", + "options-label": "Дополнительно", + "value-label": "Фактор отправки чаÑов (CH)", + "value-help": "Чем больше фактор, тем больше CH будет отправлено вмеÑте Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸ÐµÐ¹", + "preview-button": "ПредпроÑмотр", + "send-button": "Отправить", + "back-button": "Ðазад", + "simple": "Обычный", + "advanced": "Продвинутый" + }, + + "tx": { + "transaction": "ТранзакциÑ", + "confirm-transaction": "Подтердите транзакцию", + "from": "Отправитель", + "to": "Получатель", + "date": "Дата", + "status": "СтатуÑ", + "coins": "Сумма", + "hours": "ЧаÑÑ‹", + "id": "TX ID", + "show-more": "Инфо", + "hours-sent": "отправлÑем", + "hours-burned": "Ñжигаем", + "inputs": "Входы", + "outputs": "Выходы", + "confirmed": "Подтверждена", + "pending": "Ожидание", + "current-rate": "По текущему курÑу" + }, + + "backup": { + "wallet-directory": "Папка кошелька:", + "seed-warning": "ДЕРЖИТЕ ФРÐЗУ ВОСТÐÐОВЛЕÐИЯ Ð’ ÐÐДÐЖÐОМ МЕСТЕ. ÐРБУМÐГЕ. ОФФЛÐЙÐ. ЕÑли вы держите фразу в надёжном меÑте, и никто не Ñмог её подглÑдеть - вашы токены в безопаÑноÑти.", + "desc": "Из таблицы ниже вы можете получить фразы Ð´Ð»Ñ Ð²Ð°ÑˆÐ¸Ñ… зашифрованных кошельков.
Ð”Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ñ„Ñ€Ð°Ð· воÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð² кошельках без шифрованиÑ, откройте папку указаную выше и найдите в ней файлы Ñ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸ÐµÐ¼ .wlt. Фраза хранитÑÑ Ð² них. Откройте при помощи любого (надёжного) текÑтового редактора", + "close-button": "Закрыть", + "wallet": "Ðазвание кошелька", + "filename": "Ð˜Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°", + "seed": "Фраза", + "show-seed": "Показать фразу", + "no-wallets": "Кошельков Ñ ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸ÐµÐ¼ нет" + }, + + "blockchain": { + "blocks": "КоличеÑтво блоков", + "time": "Ð’Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ñледнего блока", + "hash": "Ð¥Ñш поÑледнего блока", + "current-supply": "Ð’Ñего Skycoin в обращении", + "total-supply": "Ð’Ñего Skycoin ÑущеÑтвует", + "current-coinhour-supply": "Ð’Ñего CH в обращении", + "total-coinhour-supply": "Ð’Ñего CH ÑущеÑтвует" + }, + + "network": { + "peer": "Пир (Peer)", + "source": "ИÑточник", + "block-height": "Ð’Ñ‹Ñота блока", + "last-seen": "ПоÑледний блок", + "last-received": "ПоÑледний полученый", + "last-sent": "ПоÑледний отправленый", + "in": "ВходÑщие", + "out": "ИÑходÑщие", + + "sources": { + "default": "Пир по-умолчанию", + "exchange": "Обмена пирами" + } + }, + + "pending-txs": { + "timestamp": "Метка времени", + "txid": "ID транзакции", + "none": "Ðе найдено траназкций ждущих подтверждений", + "my": "Мой", + "all": "Ð’Ñе" + }, + + "history": { + "tx-detail": "Детали о транзакции", + "sending": "ОтправлÑем", + "sent": "Отправлено", + "received": "Получено", + "receiving": "Получаем", + "pending": "ОжидаетÑÑ", + "no-txs": "У Ð²Ð°Ñ Ð½ÐµÑ‚ иÑтории транзакций" + }, + + "teller": { + "done": "Завершено", + "waiting-confirm": "Ожидаем подтверждений", + "waiting-deposit": "Ожидаем депозит", + "waiting-send": "ПоÑылаем Skycoin", + "unknown": "ÐеизвеÑтно" + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/zh.json b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/zh.json new file mode 100644 index 00000000..9990b312 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/zh.json @@ -0,0 +1,506 @@ +{ + "common": { + "coin-id": "SKY", + "coin-hours": "å¸æ—¶", + "usd": "美元", + "loading": "加载中...", + "new": "æ–°", + "load": "加载" + }, + + "errors": { + "error": "错误", + "fetch-version": "无法从Github获å–最新版本", + "incorrect-password": "密ç é”™è¯¯", + "error-decrypting": "解密钱包时出错", + "api-disabled": "APIç¦ç”¨", + "no-wallet": "æ— å¯æ”¯ä»˜é’±åŒ…", + "no-outputs": "无未交易输出", + "window-size": "窗å£å¤ªçª„,内容放ä¸ä¸‹" + }, + + "title": { + "language": "选择语言", + "wallets": "钱包", + "send": "å‘é€", + "history": "历å²", + "buy-coin": "ä¹° Skycoin", + "network": "网络", + "blockchain": "区å—链", + "outputs": "未交易输出", + "transactions": "交易", + "pending-txs": "待处ç†äº¤æ˜“", + "backup": "备份钱包", + "explorer": "Skycoin Explorer", + "seed": "钱包ç§å­", + "qrcode": "QR代ç ", + "reset": "é‡ç½®å¯†ç ", + "exchange": "交易", + "select-address": "选择地å€", + "order-history": "订å•åŽ†å²" + }, + + "header": { + "syncing-blocks": "区å—åŒæ­¥ä¸­", + "update1": "钱包更新", + "update2": "å¯èŽ·å–", + "synchronizing": "钱包正在åŒæ­¥ã€‚你看到的数æ®å¯èƒ½ä¸æ˜¯æœ€æ–°çš„。", + "pending-txs1": "这里有一些", + "pending-txs2": "待处ç†äº¤æ˜“.", + "pending-txs3": "你看到的数æ®å¯èƒ½ä¸æ˜¯æœ€æ–°çš„。", + + "errors": { + "no-connections": "没有连接,你的客户端没有连接到任何其他节点", + "no-backend1": "ä¸èƒ½åˆ°è¾¾åŽç«¯ã€‚请é‡æ–°å¯åŠ¨åº”用程åºæˆ–寻求我们的帮助", + "no-backend2": "Telegram", + "no-backend3": "", + "csrf": "安全æ¼æ´ž: CSRF未工作,请立å³é€€å‡ºã€‚" + } + }, + + "password": { + "title": "输入密ç ", + "label": "密ç ", + "confirm-label": "确认密ç ", + "button": "继续", + "reset-link": "我忘记了密ç " + }, + + "buy": { + "deposit-address": "选择一个地å€æ¥ç”ŸæˆBTC充值链接,用于:", + "select-address": "选择地å€", + "generate": "生æˆ", + "deposit-location": "充值ä½ç½®", + "deposit-location-desc": "选择一个钱包,以在我们收到你的比特å¸åŽå……值Skycoin到该钱包", + "make-choice": "åšé€‰æ‹©", + "wallets-desc": "æ¯å½“选择一个新的钱包和地å€ï¼Œä¸€ä¸ªæ–°çš„BTC地å€å°†ä¼šç”Ÿæˆã€‚一个独立的Skycoin地å€æœ€å¤šå¯ç»‘定5个BTC地å€ã€‚", + "send": "å‘é€Bitcoin", + "send-desc": "å‘é€Bitcoin至如下地å€ã€‚一旦收到,我们将会按当å‰æ±‡çŽ‡: {{ rate }} SKY/BTC充值Skycoin到选中钱包的一个新地å€ã€‚", + "fraction-warning": "请按SKY/BTC汇率的å€æ•°å‘é€BTC! Skycoin是以整数å‘é€; SKYçš„å°æ•°ä½å°†ä¸ä¼šå‘é€", + "receive": "接收Sky", + "receive-desc": "收到你的比特å¸åŽï¼Œæˆ‘们将å‘é€Skycoin给你。你å¯èƒ½éœ€è¦20分钟到一个å°æ—¶æ‰èƒ½æ”¶åˆ°è¿™äº›SKY。", + "status-button": "状æ€:", + "check-status-button": "查看状æ€", + "new-order-button": "新订å•" + }, + + "wizard": { + "wallet-desc": "如果你没有Skycoin钱包,请使用生æˆçš„ç§å­æ¥åˆ›å»ºä¸€ä¸ªæ–°é’±åŒ…。如果你已ç»æœ‰ä¸€ä¸ªé’±åŒ…,切æ¢åˆ°\"加载钱包\"并输入你的ç§å­ã€‚", + "encrypt-desc": "通过加密æ¥å¢žåŠ é’±åŒ…的安全性。输入密ç åŽï¼Œä½ çš„钱包会被加密。åªæœ‰è¾“入密ç æ‰å¯ä»¥è®¿é—®çš„钱包或移动资金。", + "hardware-wallet-link": "使用硬件钱包?", + "finish-button": "完æˆ", + "back-button": "åŽé€€", + + "confirm": { + "title": "ä¿æŠ¤ä½ çš„ç§å­!", + "desc": "请确ä¿ä½ å·²ç»å†™ä¸‹ä½ çš„ç§å­å¹¶å°†å®ƒå‚¨å­˜åœ¨äº†ä¸€ä¸ªå®‰å…¨çš„地方。如果你忘记了ç§å­ï¼Œä½ å°†æ— æ³•æ¢å¤ä½ çš„Skycoin钱包", + "checkbox": "它很安全,我å‘誓。", + "button": "继续" + } + }, + + "wallet": { + "new-address": "新地å€", + "new-addresses": "新地å€", + "show-empty": "展示空地å€", + "hide-empty": "éšè—空地å€", + "encrypt": "加密钱包", + "decrypt": "解密钱包", + "decrypt-warning": "警告: 出于安全考虑,建议将钱包加密。建议谨慎一点。", + "delete": "删除钱包", + "edit": "编辑钱包", + "add": "添加钱包", + "load": "加载钱包", + "encryption-enabled": "加密已å¯ç”¨", + "encryption-disabled": "加密已ç¦ç”¨", + "hw-security-warning": "å¯èƒ½çš„安全风险。当硬件设备已连接时(点击钱包列表下的\"硬件钱包\"按钮)访问硬件钱包选项以获å–更多信æ¯", + "wallet": "钱包", + "hardware-wallet": "硬件钱包", + "delete-confirmation": "警告: 钱包\"{{ name }}\"将从列表中删除。若想é‡æ–°æ·»åŠ ï¼Œéœ€é‡æ–°è¿žæŽ¥è®¾å¤‡å¹¶æ‰“开硬件钱包的选项列表(点击钱包列表下的\"硬件钱包\"按钮)。你想继续å—?", + "delete-confirmation-check": "是的,我想è¦åˆ é™¤é’±åŒ…。", + "max-hardware-wallets-error": "你的硬件钱包里的地å€å·²ç»è¾¾åˆ°å…许的最大值。", + "add-many-confirmation": "警告: 如果你在ä¸ä½¿ç”¨å‰ä¸€ä¸ªåœ°å€çš„情况下添加太多地å€ï¼Œæˆ–者如果你使用的是最åŽä¸€ä¸ªåœ°å€è€Œä¸æ˜¯ç¬¬ä¸€ä¸ªåœ°å€ï¼Œé‚£ä¹ˆå¦‚果你å°è¯•ä½¿ç”¨ç§å­æ¢å¤é’±åŒ…,有些地å€å°†å¯èƒ½æ— æ³•è‡ªåŠ¨æ¢å¤ï¼ˆä½ å¿…须手动添加它们)。 你想继续å—?", + + "new": { + "create-title": "创建钱包", + "load-title": "加载钱包", + "encrypt-title": "加密钱包", + "name-label": "å称", + "seed-label": "ç§å­", + "confirm-seed-label": "确认ç§å­", + "seed-warning": "è®°ä½ç§å­! 把它ä¿å­˜åœ¨å®‰å…¨çš„地方。 如果你忘记了你的ç§å­ï¼Œä½ å°†æ— æ³•æ‰¾å›žä½ çš„钱包!", + "create-button": "创建", + "load-button": "加载", + "cancel-button": "删除", + "12-words": "12å­—", + "24-words": "24å­—", + "generate-12-seed": "生æˆ12å­—ç§å­", + "generate-24-seed": "生æˆ24å­—ç§å­", + "encrypt": "加密钱包", + "encrypt-warning": "我们建议你为æ¯ä¸ªé’±åŒ…设置一个独立的密ç ã€‚如果你忘记密ç ï¼Œä½ å¯ä»¥é€šè¿‡ç§å­é‡ç½®é’±åŒ…。在加密你的钱包之å‰ï¼Œç¡®ä¿ä½ çš„ç§å­ä¿å­˜åœ¨å®‰å…¨çš„地方。", + "unconventional-seed-title": "å¯èƒ½é”™è¯¯", + "unconventional-seed-text": "你引进了一ç§éžä¼ ç»Ÿçš„ç§å­ã€‚如果你出于任何特殊原因这样åšï¼Œä½ å¯ä»¥ç»§ç»­(åªæŽ¨è高级用户)。但是,如果你打算使用普通的系统ç§å­ï¼Œåˆ™å¿…须删除所有附加文本和特殊字符。", + "unconventional-seed-check": "继续使用éžä¼ ç»Ÿç§å­ã€‚" + }, + + "rename": { + "title": "é‡å‘½å钱包", + "name-label": "命å", + "cancel-button": "å–消", + "rename-button": "é‡å‘½å" + }, + + "add-addresses": { + "title": "选择数é‡", + "name-quantity": "创建多少地å€", + "cancel-button": "å–消", + "create-button": "创建" + }, + + "address": { + "show": "点击显示", + "copy": "å¤åˆ¶", + "copy-address": "å¤åˆ¶åœ°å€", + "copied": "å·²å¤åˆ¶!", + "confirm": "确认地å€", + "outputs": "未交易输出", + "history": "历å²" + } + }, + + "send": { + "synchronizing-warning":"钱包ä»åœ¨åŒæ­¥æ•°æ®ï¼Œæ‰€ä»¥æ˜¾ç¤ºçš„ä½™é¢å¯èƒ½ä¸æ­£ç¡®ã€‚你确定è¦ç»§ç»­å—?", + "from-label": "å‘é€è‡ª", + "to-label": "å‘é€è‡³", + "amount-label": "总é¢", + "notes-label": "标注", + "wallet-label": "钱包", + "addresses-label": "地å€", + "invalid-amount": "请输入一个有效数值", + "addresses-help": "é™å®šæºå‘é€åœ°å€", + "all-addresses": "所有地å€(所选钱包的)", + "outputs-label": "未交易输出", + "outputs-help": "é™å®šæœªäº¤æ˜“输出", + "all-outputs": "所有未交易输出(所选地å€çš„)", + "available-msg-part1": "æ ¹æ®ä½ å½“å‰çš„选择,你最多å¯ä»¥å‘é€", + "available-msg-part2": "å’Œ", + "available-msg-part3": "(至少", + "available-msg-part4": "将作为必须的交易手续费)。", + "change-address-label": "自定义找零地å€", + "change-address-select": "选择", + "change-address-help": "自定义找零地å€ã€‚如果ä¸æ供,钱包将会自动选择。点击\"选择\" æ¥é€‰æ‹©ä¸€ä¸ªåœ°å€", + "destinations-label": "目标地å€", + "destinations-help1": "目标地å€å’Œå³å°†å‘é€çš„å¸", + "destinations-help2": "目标地å€å’Œå³å°†å‘é€çš„å¸ä»¥åŠå¸æ—¶", + "hours-allocation-label": "自动分é…å¸æ—¶", + "options-label": "选项", + "value-label": "å¸æ—¶åˆ†å‘å› å­", + "value-help": "分å‘å› å­å€¼è¶Šé«˜ï¼Œè¶Šå¤šå¸æ—¶å°†è¢«å‘é€", + "preview-button": "预览", + "send-button": "å‘é€", + "back-button": "åŽé€€", + "simple": "简易", + "advanced": "高级的", + "select-wallet": "选择钱包" + }, + + "reset": { + "wallet-label": "钱包", + "seed-label": "钱包ç§å­", + "password-label": "æ–°å¯†ç  (如果你ä¸å¸Œæœ›é’±åŒ…加密,请将密ç ç•™ç©º)", + "confirm-label": "确认新密ç ", + "reset-button": "é‡ç½®" + }, + + "tx": { + "transaction": "交易", + "confirm-transaction": "确认交易", + "from": "æ¥è‡ª", + "to": "到", + "date": "日期", + "status": "状æ€", + "coins": "å¸", + "hours": "å¸æ—¶", + "id": "交易ID", + "show-more": "展示更多", + "hours-moved": "已转移", + "hours-sent": "å·²å‘é€", + "hours-received": "已接收", + "hours-burned": "已燃烧", + "inputs": "输入", + "outputs": "输出", + "confirmed": "已确认", + "pending": "待处ç†", + "current-rate": "按当å‰æ±‡çŽ‡è®¡ç®—" + }, + + "backup": { + "wallet-directory": "钱包目录:", + "seed-warning": "在纸上备份你的ç§å­ï¼Œå¹¶ä¿å­˜åœ¨ä¸€ä¸ªå®‰å…¨çš„地方。åªè¦æœ‰ç§å­ï¼Œä½ å°±å¯ä»¥æ‰¾å›žä½ çš„å¸ã€‚", + "desc": "使用下表从加密的钱包中得到ç§å­ã€‚
为了从未加密的钱包中获得ç§å­ï¼Œæ‰“开上é¢çš„文件夹,在文本编辑器中打开.wlt文件并æ¢å¤ç§å­ã€‚", + "close-button": "Close", + "wallet": "钱包", + "filename": "文件å", + "seed": "ç§å­", + "show-seed": "显示ç§å­", + "no-wallets": "未加密钱包" + }, + + "blockchain": { + "blocks": "区å—æ•°é‡", + "time": "上一个区å—的时间戳", + "hash": "上一个区å—的哈希值", + "current-supply": "ç›®å‰SKY供应é‡", + "total-supply": "SKY的总供应é‡", + "current-coinhour-supply": "ç›®å‰å¸æ—¶ä¾›åº”é‡", + "total-coinhour-supply": "å¸æ—¶æ€»ä¾›åº”é‡" + }, + + "network": { + "peer": "节点", + "source": "节点æ¥æº", + "block-height": "区å—高度", + "block-height-short": "区å—", + "last-seen": "上一次出现", + "last-received": "上一次接收", + "last-sent": "上一次å‘é€", + "in": "è¿›æ¥çš„", + "out": "出去的", + + "sources": { + "default": "默认节点", + "exchange": "交æ¢èŠ‚点" + } + }, + + "pending-txs": { + "timestamp": "时间戳", + "txid": "交易ID", + "none": "无待处ç†äº¤æ˜“", + "my": "我的", + "all": "全部" + }, + + "history": { + "tx-detail": "交易明细", + "moving": "内部转账中", + "moved": "已内部转账", + "sending": "å‘é€ä¸­", + "sent": "å·²å‘é€", + "received": "已接收", + "receiving": "接收中", + "pending": "待处ç†", + "no-txs": "你没有历å²äº¤æ˜“", + "no-txs-filter": "没有与当å‰ç­›é€‰æ¡ä»¶åŒ¹é…的交易", + "no-filter": "未ç»ç­›é€‰ (点击选择钱包/地å€)", + "filter": "已筛选: ", + "filters": "已筛选: ", + "all-addresses": "所有地å€" + }, + + "teller": { + "done": "完æˆ", + "waiting-confirm": "等待确认", + "waiting-deposit": "等待比特å¸å……值", + "waiting-send": "等待å‘é€Skycoin", + "unknown": "未知" + }, + + "confirmation" : { + "header-text": "确认", + "confirm-button": "是", + "cancel-button": "å¦", + "close": "关闭" + }, + + "service": { + "api" : { + "server-error": "æœåŠ¡å™¨é”™è¯¯" + }, + "wallet": { + "not-enough-hours": "没有足够的å¸æ—¶æ¥æ‰§è¡Œäº¤æ˜“" + } + }, + + "hardware-wallet": { + "general": { + "default-wallet-name": "新硬件钱包", + "error-disconnected": "无法执行该æ“作。硬件钱包未连接。", + "simple-error": "错误,无法执行æ“作。", + "generic-error": "无法执行该æ“作。确ä¿ä½ å·²ç»è¿žæŽ¥äº†ä¸€ä¸ªæœ‰æ•ˆçš„硬件钱包,并且它没有在等待输入。", + "generic-error-internet": "无法执行该æ“作。确ä¿ä½ å·²ç»è¿žæŽ¥äº†ä¸€ä¸ªæœ‰æ•ˆçš„硬件钱包,它ä¸åœ¨ç­‰å¾…输入,并且你已ç»è¿žæŽ¥åˆ°ç½‘络/节点", + "error-incorrect-wallet": "无法执行该æ“作。所连接的硬件钱包与预期ä¸åŒã€‚", + "error-incorrect-pin": "无法执行该æ“作。你输入的密ç ä¸æ­£ç¡®ã€‚", + "confirm": "请在硬件钱包中确认æ“作。", + "confirm-and-more": "请在硬件钱包中确认æ“作并按éµå¾ªæŒ‡ç¤ºã€‚", + "close": "关闭", + "cancel": "å–消", + "continue": "继续", + "completed": "æ“作完æˆã€‚", + "refused": "æ“作失败或被å–消。" + }, + "errors": { + "too-many-inputs": "此笔交易有太多的输入,无法处ç†ã€‚请è”系技术支æŒã€‚", + "too-many-outputs": "此笔交易有太多的输出,无法处ç†ï¼Œè¯·è”系技术支æŒã€‚" + }, + "security-warning": { + "title": "安全警告", + "text": "上次连接此硬件钱包时,å‘现一个或多个安全警告。我们建议你打开硬件钱包选项(点击钱包列表下的\"硬件钱包\"按钮)并ä¿æŒè®¾å¤‡å·²è¿žæŽ¥ï¼Œåœ¨ç»§ç»­ä¹‹å‰ï¼Œè§£å†³å®‰å…¨é—®é¢˜", + "check": "我明白其中的风险,并希望继续下去", + "continue": "继续", + "cancel": "å–消" + }, + "options": { + "connecting": "连接...", + "disconnected": "没有检测到硬件钱包。请连接硬件钱包åŽä½¿ç”¨æ­¤é€‰é¡¹ã€‚", + "unconfigured-detected-title": "未é…置的硬件钱包", + "unconfigured-detected": "检测到无ç§å­çš„硬件钱包。选择\"自动é…ç½®\"如果你想将其é…置为全新的钱包并立å³å¼€å§‹ä½¿ç”¨å®ƒï¼Œæˆ–选择\"æ¢å¤å¤‡ä»½\"如果你想使用先å‰åˆ›å»ºçš„备份ç§å­å¯¹å…¶è¿›è¡Œé…置,从而能够å†æ¬¡è®¿é—®ä½ çš„资产。", + "configured-detected": "检测到硬件钱包。该设备在钱包列表中被识别为:", + "security-warnings-title": "安全警告", + "security-warning-title": "安全警告", + "backup-warning": "你应该备份硬件钱包ç§å­ï¼Œå¦åˆ™ä¸‡ä¸€å‡ºçŽ°é—®é¢˜ï¼Œä½ å¯èƒ½å°†æ— æ³•è®¿é—®ä½ çš„资金,è¦åšåˆ°è¿™ä¸€ç‚¹ã€‚选择\"创建一个备份\"选项。", + "pin-warning": "当å‰è¿žæŽ¥çš„硬件钱包未设置密ç ã€‚密ç å¯ä¿æŠ¤ç¡¬ä»¶é’±åŒ…,以防丢失ã€ç›—窃和黑客入侵。è¦åˆ›å»ºä¸€ä¸ªå¯†ç ï¼Œé€‰æ‹©\"创建PINç \"选项。", + "options": "选项:", + "configure-automatically": "自动é…ç½®", + "restore-backup": "æ¢å¤å¤‡ä»½", + "create-backup": "创建备份", + "wipe": "删除设备", + "confirm-seed": "确认ç§å­", + "create-pin": "创建密ç ", + "change-pin": "更改密ç ", + "forgotten-pin1": "如果你因为忘记密ç è€Œæ— æ³•è¿›å…¥é’±åŒ…,你å¯ä»¥åˆ é™¤ç¡¬ä»¶é’±åŒ…,然åŽé€šè¿‡ç§å­", + "forgotten-pin2": "æ¢å¤" + }, + "generate-seed" : { + "text": "在继续之å‰ï¼Œä½ å¯ä»¥é€‰æ‹©ç”Ÿæˆç§å­çš„å•è¯æ•°ã€‚ç§å­æ˜¯ä¸€ä¸ªå•è¯åˆ—表,出现问题åŽå¯ä»¥ç”¨æ¥æ¢å¤è®¿é—®ä½ çš„å¸ã€‚所有选项都是安全的,如果你没有特殊原因必须选择æŸä¸€é¡¹ï¼Œä½ å¯ä»¥ä½¿ç”¨é»˜è®¤å€¼ã€‚", + "configuring": "é…ç½®..." + }, + "restore-seed" : { + "text": "在继续å‰ï¼Œè¯·é€‰æ‹©ä½ æƒ³è¦æ¢å¤ç§å­çš„å•è¯æ•°é‡ã€‚", + "check-text": "ä½ å¯ä»¥ä½¿ç”¨æ­¤é€‰é¡¹è¾“å…¥ç§å­ï¼Œå¹¶æ£€æŸ¥å®ƒæ˜¯å¦ä¸Žç¡¬ä»¶é’±åŒ…中的一致。在开始之å‰ï¼Œé€‰æ‹©ä½ æƒ³è¦æ£€æŸ¥çš„ç§å­çš„å•è¯æ•°ã€‚", + "warning" : "警告: 为了é¿å…å¯èƒ½å‡ºçŽ°çš„问题,请仅使用åŒä¸€å“牌/åž‹å·çš„硬件钱包创建ç§å­ã€‚", + "error-wrong-word": "错误: é‡æ–°é”®å…¥çš„å•è¯ä¸Žç¡¬ä»¶é’±åŒ…所请求的ä¸åŒ¹é…。", + "error-invalid-seed": "错误: ç§å­æ— æ•ˆã€‚请务必按正确的顺åºè¾“入正确的å•è¯ã€‚", + "error-wrong-seed": "错误: ç§å­æ˜¯æœ‰æ•ˆçš„,但与设备中的ç§å­ä¸åŒ¹é…。" + }, + "added": { + "title": "新硬件钱包", + "configuring": "检测到新的硬件钱包。é…ç½®...", + "done": "已完æˆ", + "added1": "已连接的硬件的钱包已ç»ç”¨å¦‚下å字被添加到钱包列表:", + "added2": "现在你å¯ä»¥æŸ¥çœ‹ç¡¬ä»¶é’±åŒ…中的余é¢å’Œåœ°å€äº†ï¼Œå³ä½¿ç¡¬ä»¶é’±åŒ…并未连接。此外如果你愿æ„,你还å¯ä»¥æ›´æ”¹é’±åŒ…å称或从将其从钱包列表删除。" + }, + "wipe": { + "warning": "警告: 硬件钱包中的所有数æ®å°†è¢«åˆ é™¤ã€‚如果没有备份,你将无法å†æ¬¡è®¿é—®ä½ çš„资金。", + "confirm-delete": "还是将其从钱包列表中删除" + }, + "create-backup": { + "warning": "警告: ä½ åªèƒ½ä½¿ç”¨æ­¤é€‰é¡¹å¤‡ä»½ä½ çš„硬件钱包ç§å­ä¸€æ¬¡ã€‚如果你决定继续,你将ä¸å¾—ä¸å†™ä¸‹ä¸€ç»„å•è¯(建议写在纸上,而ä¸æ˜¯ç”µè„‘上),这些å•è¯å°†å‡ºçŽ°åœ¨ç¡¬ä»¶é’±åŒ…çš„å±å¹•ä¸Šï¼Œå¹¶å°†å…¶å­˜å‚¨åœ¨ä¸€ä¸ªå®‰å…¨çš„地方。任何å¯ä»¥è®¿é—®å•è¯åˆ—表(\"ç§å­\")的人都å¯ä»¥è®¿é—®é’±åŒ…ä½™é¢ï¼Œå› æ­¤å»ºè®®è¯·æ ¼å¤–谨慎。", + "instructions": "写下出现在硬件钱包å±å¹•ä¸Šçš„å•è¯åˆ—表。一定è¦æŒ‰é¡ºåºå¹¶æŠŠæ¯ä¸ªå•è¯éƒ½å†™å¯¹ã€‚" + }, + "seed-word": { + "title": "输入字", + "info1": "输入设备中显示的字", + "info2": "你将被è¦æ±‚以éšæœºçš„顺åºè¾“入你备份的ç§å­ï¼ŒåŠ ä¸Šä¸€äº›é¢å¤–的字。", + "word": "è¦æ±‚çš„å­—", + "error-invalid-word": "输入字无效。", + "error-loading-words": "正在加载字列表。请ç¨ç­‰ã€‚" + }, + "change-pin" : { + "pin-mismatch":"无法执行æ“作。你输入的两个密ç ä¸åŒ¹é…" + }, + "enter-pin" : { + "title": "输入密ç ", + "title-change-current": "输入当å‰å¯†ç ", + "title-change-new": "输入新的密ç ", + "title-change-confirm": "确认新的密ç ", + "instructions": " 密ç å·²æ˜¾ç¤ºåœ¨ç¡¬ä»¶é’±åŒ…çš„å±å¹•ä¸Šã€‚", + "instructions-tx": "进入密ç ä»¥ç¡®è®¤å¹¶ç­¾ç½²äº¤æ˜“。", + "instructions-change": "请输入一个4到8个数字之间的难以被猜中的密ç ã€‚", + "help": "需è¦å¸®åŠ©ï¼Ÿ" + }, + "pin-help" : { + "title": "帮助", + "part1": "当需è¦è¾“入密ç æ‰èƒ½ç»§ç»­æ—¶ï¼Œç¡¬ä»¶é’±åŒ…å±å¹•ä¼šæ˜¾ç¤ºä¸€ä¸ªçŸ©é˜µï¼ŒçŸ©é˜µç”±9个éšæœºæŽ’列的å—组æˆ(æ¯æ¬¡é¡ºåºéƒ½ä¼šæ”¹å˜),你将被è¦æ±‚在软件钱包中输入密ç ï¼Œä½¿ç”¨ä¸€ä¸ªçŸ©é˜µï¼Œæ­¤çŸ©é˜µåŒ…å«9个按钮,åªæ˜¾ç¤ºç¬¦å·#。", + "part2": "è¦è¾“入密ç ï¼Œè¯·åœ¨ç¡¬ä»¶é’±åŒ…å±å¹•ä¸Šä»¥æ•°å­—矩阵查看密ç çš„ä½ç½®ï¼Œç„¶åŽç‚¹å‡»è½¯ä»¶é’±åŒ…中的相应按钮。例如,如果密ç ä¸º\"23\"且数字2ä½äºŽç¡¬ä»¶é’±åŒ…数字矩阵的左上角,数字3ä½äºŽç¡¬ä»¶é’±åŒ…数字矩阵的正中间,则按顺åºç‚¹å‡»è½¯ä»¶é’±åŒ…中的左上角和中间按钮。", + "part3": "如果你愿æ„,还å¯ä»¥ä½¿ç”¨é”®ç›˜ä¸Šçš„å°é”®ç›˜è¾“入密ç ã€‚但是,如之å‰ç¤ºä¾‹æ‰€ç¤ºï¼Œå¦‚果密ç æ˜¯\"23\",你ä¸èƒ½ç®€å•åœ°ç”¨å°é”®ç›˜é”®å…¥\"23\",而是必须选择点击硬件钱包å±å¹•ä¸Š2å’Œ3对应ä½ç½®çš„值。" + }, + "create-tx" : { + "title": "创建交易" + }, + "confirm-address" : { + "title": "确认地å€", + "instructions": "请在硬件钱包上确认,如果地å€ä¸º:", + "short-confirmation": "地å€å·²ç¡®è®¤", + "confirmation": "地å€å·²ç¡®è®¤ã€‚为了安全, 选择 \"确认地å€\" 选项å¯ä»¥åœ¨ç¡¬ä»¶é’±åŒ…上å†æ¬¡æ˜¾ç¤ºåœ°å€ï¼Œåœ¨èœå•ä¸­å¯ç‚¹å‡»åœ°å€ä½™é¢å³ä¾§çš„按钮显示。" + } + }, + + "time-from-now": { + "few-seconds": "几秒钟之å‰", + "minute": "一分钟之å‰", + "minutes": "{{time}} 分钟之å‰", + "hour": "一å°æ—¶ä¹‹å‰", + "hours": "{{time}} å°æ—¶ä¹‹å‰", + "day": "一天之å‰", + "days": "{{time}} 天之å‰" + }, + + "exchange": { + "you-send": "ä½ å‘é€", + "you-get": "你收到 (大约)", + "to-address": "到 {{coin}} 地å€", + "price": "交易汇率", + "time-15": "交易时间", + "exchange-button": "交易", + "min-amount": "最å°æ•°é¢:", + "max-amount": "最大数é¢:", + "agree-1": "我åŒæ„", + "agree-2": "使用æ¡æ¬¾", + "agree-3": "å’Œ", + "agree-4": "éšç§æ”¿ç­–", + "powered-by": "技术支æŒ", + "need-help": "需è¦å¸®åŠ©?", + "support-portal": "帮助入å£", + "history": "订å•åŽ†å²", + "order-not-found": "订å•æœªæ‰¾åˆ°", + "status": "状æ€", + "exchanging": "{{from}}交易{{to}}", + "select": "选择", + "offline": "交易暂时下线", + "problem-connecting": "未能连接到æœåŠ¡å™¨ã€‚请检查你的网络连接并ç¨åŽå†è¯•ã€‚", + "invalid-address": "无效地å€ã€‚", + "statuses": { + "user-waiting": "等待充值。请将{{amount}} {{from}}å‘é€åˆ°ä¸‹é¢æ˜¾ç¤ºçš„交易地å€", + "user-waiting-info": "系统正在等待你充值到交易地å€ã€‚交易将在系统检测到你的充值并在区å—链中确认åŽå¼€å§‹ã€‚如果你已ç»å……值,应该很快就会检测到。", + "market-waiting-confirmations": "等待链上交易确认", + "market-waiting-confirmations-info": "å·²ç»æ£€æµ‹åˆ°å……值,等待区å—链中被确认。", + "market-confirmed": "链上交易已接å—", + "market-confirmed-info": "链上交易已ç»åœ¨åŒºå—链上确认。准备马上执行兑æ¢ã€‚", + "market-exchanged": "完æˆ{{from}}到{{to}}çš„å…‘æ¢", + "market-exchanged-info": "å…‘æ¢å·²ç»å®Œæˆã€‚资金将很快å‘é€åˆ°ä½ çš„地å€ã€‚", + "market-withdraw-waiting": "正在å‘é€{{to}}到你的地å€", + "market-withdraw-waiting-info": "å‘é€{{to}}到你地å€çš„进程已å¯åŠ¨", + "complete": "交易已完æˆ!", + "complete-info": "资金已ç»æˆåŠŸå‘é€åˆ°ä½ çš„地å€ã€‚", + "error": "å‘生错误", + "error-info": "è¿è½¬è¿‡ç¨‹ä¸­å‡ºçŽ°é”™è¯¯ï¼Œä½ å¯ä»¥åœ¨ä¸‹é¢æ‰¾åˆ°æ›´å¤šä¿¡æ¯ã€‚如果你需è¦å¸®åŠ©ï¼Œè¯·ä¿å­˜ä¸‹é¢æ˜¾ç¤ºçš„所有数æ®å¹¶ä½¿ç”¨é¡µé¢å³ä¸‹è§’的帮助链接æ¥è”系技术支æŒã€‚" + }, + "history-window": { + "address": "地å€", + "date": "日期" + }, + "details": { + "exchange-addr": "交易地å€", + "exchange-addr-tag": "支付ID或交易必须用到的目标标签", + "tx-id": "交易ID", + "order-id": "订å•ID", + "initial-price": "åˆå§‹æ±‡çŽ‡", + "error-msg": "é”™è¯¯ä¿¡æ¯ ", + "details": "详情", + "start-date": "开始日期", + "back": "返回", + "back-alert": "æ“作正在执行。你真的想è¦è¿”回到表格å—?你å¯ä»¥é€šè¿‡ç‚¹å‡»\"订å•åŽ†å²\"å†æ¬¡çœ‹åˆ°æ‰§è¡Œè¿‡ç¨‹" + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/zh_base.json b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/zh_base.json new file mode 100644 index 00000000..402d23ce --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/i18n/zh_base.json @@ -0,0 +1,506 @@ +{ + "common": { + "coin-id": "SKY", + "coin-hours": "Coin Hours", + "usd": "USD", + "loading": "Loading...", + "new": "New", + "load": "Load" + }, + + "errors": { + "error": "Error", + "fetch-version": "Unable to fetch latest release version from Github", + "incorrect-password": "Incorrect password", + "error-decrypting": "Error decrypting the wallet", + "api-disabled": "API disabled", + "no-wallet": "Wallet does not exist", + "no-outputs": "No unspent outputs", + "window-size": "The window is too narrow for the content" + }, + + "title": { + "language": "Select Language", + "wallets": "Wallets", + "send": "Send", + "history": "History", + "buy-coin": "Buy Skycoin", + "network": "Networking", + "blockchain": "Blockchain", + "outputs": "Outputs", + "transactions": "Transactions", + "pending-txs": "Pending Transactions", + "backup": "Backup Wallet", + "explorer": "Skycoin Explorer", + "seed": "Wallet Seed", + "qrcode": "QR Code", + "reset": "Reset Password", + "exchange": "Exchange", + "select-address": "Select Address", + "order-history": "Order history" + }, + + "header": { + "syncing-blocks": "Syncing blocks", + "update1": "Wallet update", + "update2": "available.", + "synchronizing": "The wallet is synchronizing. Data you see may not be updated.", + "pending-txs1": "There are some", + "pending-txs2": "pending transactions.", + "pending-txs3": "Data you see may not be updated.", + + "errors": { + "no-connections": "No connections active, your client is not connected to any other nodes!", + "no-backend1": "Cannot reach backend. Please restart the app and/or seek help on our", + "no-backend2": "Telegram.", + "no-backend3": "", + "csrf": "Security vulnerability: CSRF is not working, please exit immediately." + } + }, + + "password": { + "title": "Enter Password", + "label": "Password", + "confirm-label": "Confirm password", + "button": "Proceed", + "reset-link": "I forgot my password" + }, + + "buy": { + "deposit-address": "Choose an address to generate a BTC deposit link for:", + "select-address": "Select address", + "generate": "Generate", + "deposit-location": "Deposit Location", + "deposit-location-desc": "Choose a wallet where you'd like us to deposit your Skycoin after we receive your Bitcoin.", + "make-choice": "Make a choice", + "wallets-desc": "Each time a new wallet and address are selected, a new BTC address is generated. A single Skycoin address can have up to 5 BTC addresses assigned to it.", + "send": "Send Bitcoin", + "send-desc": "Send Bitcoin to the address below. Once received, we will deposit the Skycoin to a new address in the wallet selected above at the current rate of {{ rate }} SKY/BTC.", + "fraction-warning": "Only send multiple of the SKY/BTC rate! Skycoin is sent in whole number; fractional SKY is not sent!", + "receive": "Receive Sky", + "receive-desc": "After receiving your Bitcoin, we'll send you your Skycoin. It may take anywhere between 20 minutes and an hour to receive your SKY.", + "status-button": "Status:", + "check-status-button": "Check Status", + "new-order-button": "New Order" + }, + + "wizard": { + "wallet-desc": "If you don't have a Skycoin wallet, use the generated seed to create a new one. If you already have a wallet, toggle over to \"Load Wallet\" and enter your seed.", + "encrypt-desc": "Increase security of your wallet by encrypting it. By entering a password below, your wallet will be encrypted. Only those with the password will be able access the wallet and remove funds.", + "hardware-wallet-link": "Using a hardware wallet?", + "finish-button": "Finish", + "back-button": "Back", + + "confirm": { + "title": "Safeguard your seed!", + "desc": "We want to make sure that you wrote down your seed and stored it in a safe place. If you forget your seed, you WILL NOT be able to recover your Skycoin wallet!", + "checkbox": "It’s safe, I swear.", + "button": "Continue" + } + }, + + "wallet": { + "new-address": "New Address", + "new-addresses": "New Addresses", + "show-empty": "Show Empty", + "hide-empty": "Hide Empty", + "encrypt": "Encrypt Wallet", + "decrypt": "Decrypt Wallet", + "decrypt-warning": "Warning: for security reasons, it is not recommended to keep the wallets unencrypted. Caution is advised.", + "delete": "Delete Wallet", + "edit": "Edit Wallet", + "add": "Add Wallet", + "load": "Load Wallet", + "encryption-enabled": "Encryption enabled", + "encryption-disabled": "Encryption disabled", + "hw-security-warning": "Possible security risk. Access the hardware wallet options (by pressing the \"Hardware Wallet\" button below the wallets list) while the device is connected for more information.", + "wallet": "Wallet", + "hardware-wallet": "Hardware Wallet", + "delete-confirmation": "WARNING: The wallet \"{{ name }}\" will be removed from the list. To add it again, you will have to reconnect the device and open the hardware wallet options (by pressing the \"Hardware Wallet\" button below the wallets list). Do you want to continue?", + "delete-confirmation-check": "Yeah, I want to delete the wallet.", + "max-hardware-wallets-error": "You have already reached the max number of addresses that can be added to the hardware wallet.", + "add-many-confirmation": "WARNING: If you add too many addresses without using the previous ones or if you use the last ones and not the first ones, some addresses may not be recovered automatically if you try to restore the wallet using the seed (you will have to add them manually). Do you want to continue?", + + "new": { + "create-title": "Create Wallet", + "load-title": "Load Wallet", + "encrypt-title": "Encrypt Wallet", + "name-label": "Name", + "seed-label": "Seed", + "confirm-seed-label": "Confirm seed", + "seed-warning": "Remember this seed! Keep it in a safe place. If you forget your seed, you will not be able to recover your wallet!", + "create-button": "Create", + "load-button": "Load", + "cancel-button": "Cancel", + "12-words": "12 words", + "24-words": "24 words", + "generate-12-seed": "Generate 12 word seed", + "generate-24-seed": "Generate 24 word seed", + "encrypt": "Encrypt wallet", + "encrypt-warning": "We suggest that you encrypt each one of your wallets with a password. If you forget your password, you can reset it with your seed. Make sure you have your seed saved somewhere safe before encrypting your wallet.", + "unconventional-seed-title": "Possible error", + "unconventional-seed-text": "You introduced an unconventional seed. If you did it for any special reason, you can continue (only recommended for advanced users). However, if your intention is to use a normal system seed, you must delete all the additional text and special characters.", + "unconventional-seed-check": "Continue with the unconventional seed." + }, + + "rename": { + "title": "Rename Wallet", + "name-label": "Name", + "cancel-button": "Cancel", + "rename-button": "Rename" + }, + + "add-addresses": { + "title": "Select quantity", + "name-quantity": "How many addresses to create", + "cancel-button": "Cancel", + "create-button": "Create" + }, + + "address": { + "show": "Press to show", + "copy": "Copy", + "copy-address": "Copy address", + "copied": "Copied!", + "confirm": "Confirm address", + "outputs": "Unspent outputs", + "history": "History" + } + }, + + "send": { + "synchronizing-warning": "The wallet is still synchronizing the data, so the balance shown may be incorrect. Are you sure you want to continue?", + "from-label": "Send from", + "to-label": "Send to", + "amount-label": "Amount", + "notes-label": "Notes", + "wallet-label": "Wallet", + "addresses-label": "Addresses", + "invalid-amount": "Please enter a valid amount", + "addresses-help": "Limit the addresses from where the coins and hours could be sent", + "all-addresses": "All the addresses of the selected wallet", + "outputs-label": "Unspent outputs", + "outputs-help": "Limit the unspent outputs from where the coins and hours could be sent. Only the outputs from the selected addresses are shown", + "all-outputs": "All the outputs of the selected addresses", + "available-msg-part1": "With your current selection you can send up to", + "available-msg-part2": "and", + "available-msg-part3": "(at least", + "available-msg-part4": "must be used for the transaction fee).", + "change-address-label": "Custom change address", + "change-address-select": "Select", + "change-address-help": "Address to receive change. If it's not provided, it will be chosen automatically. Click on the \"Select\" link to choose an address from one of your wallets", + "destinations-label": "Destinations", + "destinations-help1": "Destination addresses and their coins", + "destinations-help2": "Destination addresses, their coins and coin hours", + "hours-allocation-label": "Automatic coin hours allocation", + "options-label": "Options", + "value-label": "Coin hours share factor", + "value-help": "The higher the value, the more coin hours will be sent to outputs", + "preview-button": "Preview", + "send-button": "Send", + "back-button": "Back", + "simple": "Simple", + "advanced": "Advanced", + "select-wallet": "Select Wallet" + }, + + "reset": { + "wallet-label": "Wallet", + "seed-label": "Wallet seed", + "password-label": "New password (leave empty if you want the wallet not to be encrypted)", + "confirm-label": "Confirm new password", + "reset-button": "Reset" + }, + + "tx": { + "transaction": "Transaction", + "confirm-transaction": "Confirm Transaction", + "from": "From", + "to": "To", + "date": "Date", + "status": "Status", + "coins": "Coins", + "hours": "Hours", + "id": "Tx ID", + "show-more": "Show more", + "hours-moved": "moved", + "hours-sent": "sent", + "hours-received": "received", + "hours-burned": "burned", + "inputs": "Inputs", + "outputs": "Outputs", + "confirmed": "Confirmed", + "pending": "Pending", + "current-rate": "Calculated at the current rate" + }, + + "backup": { + "wallet-directory": "Wallet Directory:", + "seed-warning": "BACKUP YOUR SEED. ON PAPER. IN A SAFE PLACE. As long as you have your seed, you can recover your coins.", + "desc": "Use the table below to get seeds from your encrypted wallets.
To get seeds from unencrypted wallets, open the folder above, open the .wlt files in a text editor and recover the seeds.", + "close-button": "Close", + "wallet": "Wallet Label", + "filename": "Filename", + "seed": "Seed", + "show-seed": "Show seed", + "no-wallets": "No encrypted wallets" + }, + + "blockchain": { + "blocks": "Number of blocks", + "time": "Timestamp of last block", + "hash": "Hash of last block", + "current-supply": "Current SKY supply", + "total-supply": "Total SKY supply", + "current-coinhour-supply": "Current Coin Hours supply", + "total-coinhour-supply": "Total Coin Hours supply" + }, + + "network": { + "peer": "Peer", + "source": "Source", + "block-height": "Block height", + "block-height-short": "Block", + "last-seen": "Last seen", + "last-received": "Last received", + "last-sent": "Last sent", + "in": "Incoming", + "out": "Outgoing", + + "sources": { + "default": "Default peer", + "exchange": "Peer exchange" + } + }, + + "pending-txs": { + "timestamp": "Timestamp", + "txid": "Transaction ID", + "none": "No pending transactions", + "my": "Mine", + "all": "All" + }, + + "history": { + "tx-detail": "Transaction Detail", + "moving": "Internally moving", + "moved": "Internally moved", + "sending": "Sending", + "sent": "Sent", + "received": "Received", + "receiving": "Receiving", + "pending": "Pending", + "no-txs": "You have no transaction history", + "no-txs-filter": "There are no transactions matching the current filter criteria", + "no-filter": "No filter active (press to select wallets/addresses)", + "filter": "Active filter: ", + "filters": "Active filters: ", + "all-addresses": "All addresses" + }, + + "teller": { + "done": "Completed", + "waiting-confirm": "Waiting for confirmation", + "waiting-deposit": "Waiting for Bitcoin deposit", + "waiting-send": "Waiting to send Skycoin", + "unknown": "Unknown" + }, + + "confirmation" : { + "header-text": "Confirmation", + "confirm-button": "Yes", + "cancel-button": "No", + "close": "Close" + }, + + "service": { + "api" : { + "server-error": "Server error" + }, + "wallet": { + "not-enough-hours": "Not enough available Coin Hours to perform the transaction!" + } + }, + + "hardware-wallet": { + "general" : { + "default-wallet-name": "New hardware wallet", + "error-disconnected": "Unable to perform the operation. The hardware wallet is not connected.", + "simple-error": "Error, Unable to perform the operation.", + "generic-error": "Unable to perform the operation. Make sure you have connected a valid hardware wallet and that it is not waiting for input.", + "generic-error-internet": "Unable to perform the operation. Make sure you have connected a valid hardware wallet that is not waiting for input and that you have a connection to the internet/node.", + "error-incorrect-wallet": "Unable to perform the operation. The connected hardware wallet is different from the expected one.", + "error-incorrect-pin": "Unable to perform the operation. The PIN you have entered is not correct.", + "confirm": "Please, confirm the operation in the hardware wallet.", + "confirm-and-more": "Please, confirm the operation in the hardware wallet and follow the instructions.", + "close": "Close", + "cancel": "Cancel", + "continue": "Continue", + "completed": "Operation completed successfully.", + "refused": "The operation failed or was canceled." + }, + "errors": { + "too-many-inputs": "The transaction has too many inputs and can not be processed. Please contact technical support.", + "too-many-outputs": "The transaction has too many outputs and can not be processed. Please contact technical support." + }, + "security-warning" : { + "title": "Security warning", + "text": "The last time this hardware wallet was connected, one or more security warnings were found. We recommend you to open the hardware wallet options (by pressing the \"Hardware Wallet\" button below the wallets list) while the device is connected and solve the security problems before continuing.", + "check": "I understand the risks and want to continue", + "continue": "Continue", + "cancel": "Cancel" + }, + "options" : { + "connecting": "Connecting...", + "disconnected": "No hardware wallet detected. Please connect a hardware wallet to use this option.", + "unconfigured-detected-title": "Unconfigured hardware wallet", + "unconfigured-detected": "A seedless hardware wallet has been detected. Select \"Configure automatically\" if you want to configure it as a brand new wallet and start using it immediately, or select \"Restore backup\" if you want to configure it with a previously created seed backup and thus be able to access your funds again.", + "configured-detected": "Hardware wallet detected. The device is identified in the wallets list as:", + "security-warnings-title": "Security warnings", + "security-warning-title": "Security warning", + "backup-warning": "You should backup the hardware wallet seed or you could lose access to the funds in case of problems. To do this, select the \"Create a backup\" option.", + "pin-warning": "The connected hardware wallet does not have a PIN. The PIN code protects the hardware wallet in case of loss, theft and hacks. To create a PIN code, select the \"Create PIN code\" option.", + "options": "Options:", + "configure-automatically": "Configure automatically", + "restore-backup": "Restore backup", + "create-backup": "Create a backup", + "wipe": "Wipe the device", + "confirm-seed": "Confirm seed", + "create-pin": "Create PIN code", + "change-pin": "Change PIN code", + "forgotten-pin1": "If you can not access the wallet because you have forgotten the PIN, you can wipe the hardware wallet and then restore it with the seed by clicking", + "forgotten-pin2": "here." + }, + "generate-seed" : { + "text": "Before proceeding, you can select the number of words you want the seed to have. The seed is a list of words that can be used to recover access to the coins in case of problems. Both values are safe, so if you do not have a special reason for selecting one or the other, you can leave the default value.", + "configuring": "Configuring..." + }, + "restore-seed" : { + "text": "Before proceeding, please select the number of words that the seed you want to recover has.", + "check-text": "You can use this option to enter a seed and check if it is equal to the one in the hardware wallet. Before start, select the number of words the seed you want to check has.", + "warning" : "WARNING: to avoid potential problems, use only seeds created with a hardware wallet from the same brand/model.", + "error-wrong-word": "Error: The retyped word does not match the one requested by the hardware wallet.", + "error-invalid-seed": "Error: The seed is not valid. Please be sure to enter the correct words in the correct order.", + "error-wrong-seed": "Error: The seed is valid but does not match the one in the device." + }, + "added" : { + "title": "New Hardware Wallet", + "configuring": "New hardware wallet detected. Configuring...", + "done": "Done", + "added1": "The connected hardware wallet has been added to the wallets list with the following name:", + "added2": "Now you can check the balance and the addresses of the hardware wallet even when it is not connected. Additionally, you can change the name of the wallet or remove it from the wallets list, if you wish." + }, + "wipe" : { + "warning": "WARNING: All the data in the hardware wallet will be deleted. If you do not have a backup, you will not be able to access your funds again.", + "confirm-delete": "Also remove from the wallets list" + }, + "create-backup" : { + "warning": "WARNING: You can only use this option to backup your hardware wallet seed once. If you decide to continue, you will have to write down a group of words (it is recommended to do it on paper and not on a computer) that will appear on the screen of the hardware wallet and store the list in a safe place. Anyone with access to the word list (the \"seed\") will be able access the wallet balance, so extreme caution is advised.", + "instructions": "Write down the word list that appear on the screen of the hardware wallet. Make sure you respect the order and write each word correctly." + }, + "seed-word" : { + "title": "Enter word", + "info1": "Enter the word indicated in the device", + "info2": "You will be asked to enter the words of your backup seed in random order, plus a few additional words.", + "word": "Requested word", + "error-invalid-word": "The entered word is not valid.", + "error-loading-words": "Loading the word list. Please wait." + }, + "change-pin" : { + "pin-mismatch": "Unable to perform the operation. Two PINs you have entered do not match." + }, + "enter-pin" : { + "title": "Enter PIN", + "title-change-current": "Enter the current PIN", + "title-change-new": "Enter the new PIN", + "title-change-confirm": "Confirm the new PIN", + "instructions": "The PIN layout is displayed on the hardware wallet screen.", + "instructions-tx": "Enter the PIN to confirm and sign the transaction.", + "instructions-change": "Please enter a hard-to-guess PIN of between 4 and 8 numbers.", + "help": "Need help?" + }, + "pin-help" : { + "title": "Help", + "part1": "When it is necessary to enter the PIN to continue, the hardware wallet screen will display a matrix of 9 boxes with numbers in random order (the order changes each time) and you will be asked to enter the PIN in the software wallet using a matrix of 9 buttons that simply show the symbol #.", + "part2": "To enter the PIN, look at the position of the PIN numbers in numbers matrix on the screen of the hardware wallet and press the corresponding buttons in the software wallet. For example, if the PIN is \"23\" and the number 2 is in the upper left, number 3 in the middle of the hardware wallet numbers matrix, press the upper left and middle button in that order in the software wallet.", + "part3": "If you wish, you can also use the numpad on your keyboard to enter the PIN. However, as in the previous example, if the PIN is \"23\", you can not simply type \"23\" with the numpad, but you will have to press the keys that are in the position where the numbers 2 and 3 are shown on the screen of the hardware wallet." + }, + "create-tx" : { + "title": "Create transaction" + }, + "confirm-address" : { + "title": "Confirm address", + "instructions": "Please confirm on the hardware wallet if the address is:", + "short-confirmation": "Address confirmed.", + "confirmation": "Address confirmed. For security, you can re-show the address in the hardware wallet using the \"Confirm address\" option, in the menu that you can display by pressing the button at the right of the address balance." + } + }, + + "time-from-now": { + "few-seconds": "a few seconds ago", + "minute": "one minute ago", + "minutes": "{{time}} minutes ago", + "hour": "one hour ago", + "hours": "{{time}} hours ago", + "day": "one day ago", + "days": "{{time}} days ago" + }, + + "exchange": { + "you-send": "You send", + "you-get": "You get (approx.)", + "to-address": "To {{coin}} address", + "price": "Exchange rate", + "time-15": "Exchange time", + "exchange-button": "Exchange", + "min-amount": "Minimum amount:", + "max-amount": "Maximum amount:", + "agree-1": "I agree with", + "agree-2": "Terms of Use", + "agree-3": "and", + "agree-4": "Privacy Policy", + "powered-by": "Powered by", + "need-help": "Need help?", + "support-portal": "Support portal", + "history": "Order history", + "order-not-found": "Order not found", + "status": "Status", + "exchanging": "Exchanging {{from}} for {{to}}", + "select": "Select", + "offline": "Exchange is temporarily offline", + "problem-connecting": "Unable to connect with the service. Please check your Internet connection and try again later.", + "invalid-address": "Invalid address.", + "statuses": { + "user-waiting": "Waiting for deposit. Please send {{amount}} {{from}} to the exchange address shown below", + "user-waiting-info": "The system is waiting for you to make the deposit into the exchange address. The exchange process will start after the deposit is detected and confirmed in the blockchain. If you have already made the deposit, it should be detected shortly.", + "market-waiting-confirmations": "Waiting for transaction confirmations", + "market-waiting-confirmations-info": "The deposit has already been detected and the system is waiting for it to be confirmed in the blockchain.", + "market-confirmed": "Transaction accepted", + "market-confirmed-info": "The transaction has already been confirmed in the blockchain. Preparing to make the exchange soon.", + "market-exchanged": "Traded {{from}} for {{to}}", + "market-exchanged-info": "The exchange has been made. The funds will be transferred to your address in a moment.", + "market-withdraw-waiting": "Sending {{to}} to your address", + "market-withdraw-waiting-info": "The process for sending the coins to your address has been initiated.", + "complete": "Exchange completed!", + "complete-info": "The funds have been successfully sent to your address.", + "error": "Error occurred", + "error-info": "There was an error in the operation, you can find more information below. If you need help, please save all the operation data shown below and contact technical support using the link in the lower right part of this page." + }, + "history-window": { + "address": "Address", + "date": "Date" + }, + "details": { + "exchange-addr": "Exchange address", + "exchange-addr-tag": "Payment ID or Destination Tag which must be used for the transaction", + "tx-id": "Transaction ID", + "order-id": "Order ID", + "initial-price": "Initial exchange rate", + "error-msg": "Error message", + "details": "Details", + "start-date": "Start date", + "back": "Back", + "back-alert": "The operation is still in progress. Do you really want to return to the form? You can see the progress of this operation again by pressing the \"Order history\" button" + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/alert-red.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/alert-red.png new file mode 100644 index 00000000..17118ad3 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/alert-red.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/big-error-icon.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/big-error-icon.png new file mode 100644 index 00000000..bcbda0c2 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/big-error-icon.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/chevron-right-grey.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/chevron-right-grey.png new file mode 100644 index 00000000..d0404586 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/chevron-right-grey.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/close-grey.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/close-grey.png new file mode 100644 index 00000000..2f0ec3b6 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/close-grey.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/delete-grey.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/delete-grey.png new file mode 100644 index 00000000..42ea9346 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/delete-grey.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/delete-red.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/delete-red.png new file mode 100644 index 00000000..62175e3d Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/delete-red.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/edit-blue.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/edit-blue.png new file mode 100755 index 00000000..de88a9af Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/edit-blue.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/edit-grey.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/edit-grey.png new file mode 100644 index 00000000..a5cf11e2 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/edit-grey.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/header.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/header.png new file mode 100644 index 00000000..d73c2734 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/header.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/hw-gold.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/hw-gold.png new file mode 100644 index 00000000..af36aa93 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/hw-gold.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/lang/en.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/lang/en.png new file mode 100644 index 00000000..bb03eaaa Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/lang/en.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/lang/es.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/lang/es.png new file mode 100644 index 00000000..4590656a Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/lang/es.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/lang/ru.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/lang/ru.png new file mode 100644 index 00000000..61c27f9c Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/lang/ru.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/lang/zh.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/lang/zh.png new file mode 100644 index 00000000..ba5615b5 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/lang/zh.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/load-gold.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/load-gold.png new file mode 100644 index 00000000..4d1cbf7f Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/load-gold.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/lock-gold.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/lock-gold.png new file mode 100644 index 00000000..fc53863c Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/lock-gold.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/lock-grey.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/lock-grey.png new file mode 100755 index 00000000..3f835e7d Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/lock-grey.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/logo-white.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/logo-white.png new file mode 100644 index 00000000..8b714cf3 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/logo-white.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/minus-grey.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/minus-grey.png new file mode 100644 index 00000000..b81e568e Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/minus-grey.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/minus-red.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/minus-red.png new file mode 100644 index 00000000..6686a98c Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/minus-red.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/money-gold.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/money-gold.png new file mode 100644 index 00000000..649fc3b1 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/money-gold.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/otc-background.jpg b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/otc-background.jpg new file mode 100644 index 00000000..03a84019 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/otc-background.jpg differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/plus-gold.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/plus-gold.png new file mode 100644 index 00000000..854692e1 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/plus-gold.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/plus-green.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/plus-green.png new file mode 100755 index 00000000..ab020791 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/plus-green.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/plus-grey.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/plus-grey.png new file mode 100644 index 00000000..35dbfff5 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/plus-grey.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/qr-code-black.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/qr-code-black.png new file mode 100644 index 00000000..f9a2fabe Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/qr-code-black.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/send-black.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/send-black.png new file mode 100644 index 00000000..9f277422 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/send-black.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/send-blue.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/send-blue.png new file mode 100644 index 00000000..4226468c Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/send-blue.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/send-gold.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/send-gold.png new file mode 100644 index 00000000..59645e7d Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/send-gold.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/send-white.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/send-white.png new file mode 100644 index 00000000..16261a2f Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/send-white.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/size-alert.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/size-alert.png new file mode 100644 index 00000000..49b639c0 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/size-alert.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/transactions-black.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/transactions-black.png new file mode 100644 index 00000000..413f2235 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/transactions-black.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/unlock-gold.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/unlock-gold.png new file mode 100755 index 00000000..3ecf4ae4 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/unlock-gold.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/unlock-grey.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/unlock-grey.png new file mode 100644 index 00000000..61a31772 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/unlock-grey.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/wallet-black.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/wallet-black.png new file mode 100644 index 00000000..cdb2ec80 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/img/wallet-black.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/logo-white.png b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/logo-white.png new file mode 100644 index 00000000..cd615cf8 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/logo-white.png differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/scripts/qrcode.min.js b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/scripts/qrcode.min.js new file mode 100644 index 00000000..993e88f3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/assets/scripts/qrcode.min.js @@ -0,0 +1 @@ +var QRCode;!function(){function a(a){this.mode=c.MODE_8BIT_BYTE,this.data=a,this.parsedData=[];for(var b=[],d=0,e=this.data.length;e>d;d++){var f=this.data.charCodeAt(d);f>65536?(b[0]=240|(1835008&f)>>>18,b[1]=128|(258048&f)>>>12,b[2]=128|(4032&f)>>>6,b[3]=128|63&f):f>2048?(b[0]=224|(61440&f)>>>12,b[1]=128|(4032&f)>>>6,b[2]=128|63&f):f>128?(b[0]=192|(1984&f)>>>6,b[1]=128|63&f):b[0]=f,this.parsedData=this.parsedData.concat(b)}this.parsedData.length!=this.data.length&&(this.parsedData.unshift(191),this.parsedData.unshift(187),this.parsedData.unshift(239))}function b(a,b){this.typeNumber=a,this.errorCorrectLevel=b,this.modules=null,this.moduleCount=0,this.dataCache=null,this.dataList=[]}function i(a,b){if(void 0==a.length)throw new Error(a.length+"/"+b);for(var c=0;c=f;f++){var h=0;switch(b){case d.L:h=l[f][0];break;case d.M:h=l[f][1];break;case d.Q:h=l[f][2];break;case d.H:h=l[f][3]}if(h>=e)break;c++}if(c>l.length)throw new Error("Too long data");return c}function s(a){var b=encodeURI(a).toString().replace(/\%[0-9a-fA-F]{2}/g,"a");return b.length+(b.length!=a?3:0)}a.prototype={getLength:function(){return this.parsedData.length},write:function(a){for(var b=0,c=this.parsedData.length;c>b;b++)a.put(this.parsedData[b],8)}},b.prototype={addData:function(b){var c=new a(b);this.dataList.push(c),this.dataCache=null},isDark:function(a,b){if(0>a||this.moduleCount<=a||0>b||this.moduleCount<=b)throw new Error(a+","+b);return this.modules[a][b]},getModuleCount:function(){return this.moduleCount},make:function(){this.makeImpl(!1,this.getBestMaskPattern())},makeImpl:function(a,c){this.moduleCount=4*this.typeNumber+17,this.modules=new Array(this.moduleCount);for(var d=0;d=7&&this.setupTypeNumber(a),null==this.dataCache&&(this.dataCache=b.createData(this.typeNumber,this.errorCorrectLevel,this.dataList)),this.mapData(this.dataCache,c)},setupPositionProbePattern:function(a,b){for(var c=-1;7>=c;c++)if(!(-1>=a+c||this.moduleCount<=a+c))for(var d=-1;7>=d;d++)-1>=b+d||this.moduleCount<=b+d||(this.modules[a+c][b+d]=c>=0&&6>=c&&(0==d||6==d)||d>=0&&6>=d&&(0==c||6==c)||c>=2&&4>=c&&d>=2&&4>=d?!0:!1)},getBestMaskPattern:function(){for(var a=0,b=0,c=0;8>c;c++){this.makeImpl(!0,c);var d=f.getLostPoint(this);(0==c||a>d)&&(a=d,b=c)}return b},createMovieClip:function(a,b,c){var d=a.createEmptyMovieClip(b,c),e=1;this.make();for(var f=0;f=g;g++)for(var h=-2;2>=h;h++)this.modules[d+g][e+h]=-2==g||2==g||-2==h||2==h||0==g&&0==h?!0:!1}},setupTypeNumber:function(a){for(var b=f.getBCHTypeNumber(this.typeNumber),c=0;18>c;c++){var d=!a&&1==(1&b>>c);this.modules[Math.floor(c/3)][c%3+this.moduleCount-8-3]=d}for(var c=0;18>c;c++){var d=!a&&1==(1&b>>c);this.modules[c%3+this.moduleCount-8-3][Math.floor(c/3)]=d}},setupTypeInfo:function(a,b){for(var c=this.errorCorrectLevel<<3|b,d=f.getBCHTypeInfo(c),e=0;15>e;e++){var g=!a&&1==(1&d>>e);6>e?this.modules[e][8]=g:8>e?this.modules[e+1][8]=g:this.modules[this.moduleCount-15+e][8]=g}for(var e=0;15>e;e++){var g=!a&&1==(1&d>>e);8>e?this.modules[8][this.moduleCount-e-1]=g:9>e?this.modules[8][15-e-1+1]=g:this.modules[8][15-e-1]=g}this.modules[this.moduleCount-8][8]=!a},mapData:function(a,b){for(var c=-1,d=this.moduleCount-1,e=7,g=0,h=this.moduleCount-1;h>0;h-=2)for(6==h&&h--;;){for(var i=0;2>i;i++)if(null==this.modules[d][h-i]){var j=!1;g>>e));var k=f.getMask(b,d,h-i);k&&(j=!j),this.modules[d][h-i]=j,e--,-1==e&&(g++,e=7)}if(d+=c,0>d||this.moduleCount<=d){d-=c,c=-c;break}}}},b.PAD0=236,b.PAD1=17,b.createData=function(a,c,d){for(var e=j.getRSBlocks(a,c),g=new k,h=0;h8*l)throw new Error("code length overflow. ("+g.getLengthInBits()+">"+8*l+")");for(g.getLengthInBits()+4<=8*l&&g.put(0,4);0!=g.getLengthInBits()%8;)g.putBit(!1);for(;;){if(g.getLengthInBits()>=8*l)break;if(g.put(b.PAD0,8),g.getLengthInBits()>=8*l)break;g.put(b.PAD1,8)}return b.createBytes(g,e)},b.createBytes=function(a,b){for(var c=0,d=0,e=0,g=new Array(b.length),h=new Array(b.length),j=0;j=0?p.get(q):0}}for(var r=0,m=0;mm;m++)for(var j=0;jm;m++)for(var j=0;j=0;)b^=f.G15<=0;)b^=f.G18<>>=1;return b},getPatternPosition:function(a){return f.PATTERN_POSITION_TABLE[a-1]},getMask:function(a,b,c){switch(a){case e.PATTERN000:return 0==(b+c)%2;case e.PATTERN001:return 0==b%2;case e.PATTERN010:return 0==c%3;case e.PATTERN011:return 0==(b+c)%3;case e.PATTERN100:return 0==(Math.floor(b/2)+Math.floor(c/3))%2;case e.PATTERN101:return 0==b*c%2+b*c%3;case e.PATTERN110:return 0==(b*c%2+b*c%3)%2;case e.PATTERN111:return 0==(b*c%3+(b+c)%2)%2;default:throw new Error("bad maskPattern:"+a)}},getErrorCorrectPolynomial:function(a){for(var b=new i([1],0),c=0;a>c;c++)b=b.multiply(new i([1,g.gexp(c)],0));return b},getLengthInBits:function(a,b){if(b>=1&&10>b)switch(a){case c.MODE_NUMBER:return 10;case c.MODE_ALPHA_NUM:return 9;case c.MODE_8BIT_BYTE:return 8;case c.MODE_KANJI:return 8;default:throw new Error("mode:"+a)}else if(27>b)switch(a){case c.MODE_NUMBER:return 12;case c.MODE_ALPHA_NUM:return 11;case c.MODE_8BIT_BYTE:return 16;case c.MODE_KANJI:return 10;default:throw new Error("mode:"+a)}else{if(!(41>b))throw new Error("type:"+b);switch(a){case c.MODE_NUMBER:return 14;case c.MODE_ALPHA_NUM:return 13;case c.MODE_8BIT_BYTE:return 16;case c.MODE_KANJI:return 12;default:throw new Error("mode:"+a)}}},getLostPoint:function(a){for(var b=a.getModuleCount(),c=0,d=0;b>d;d++)for(var e=0;b>e;e++){for(var f=0,g=a.isDark(d,e),h=-1;1>=h;h++)if(!(0>d+h||d+h>=b))for(var i=-1;1>=i;i++)0>e+i||e+i>=b||(0!=h||0!=i)&&g==a.isDark(d+h,e+i)&&f++;f>5&&(c+=3+f-5)}for(var d=0;b-1>d;d++)for(var e=0;b-1>e;e++){var j=0;a.isDark(d,e)&&j++,a.isDark(d+1,e)&&j++,a.isDark(d,e+1)&&j++,a.isDark(d+1,e+1)&&j++,(0==j||4==j)&&(c+=3)}for(var d=0;b>d;d++)for(var e=0;b-6>e;e++)a.isDark(d,e)&&!a.isDark(d,e+1)&&a.isDark(d,e+2)&&a.isDark(d,e+3)&&a.isDark(d,e+4)&&!a.isDark(d,e+5)&&a.isDark(d,e+6)&&(c+=40);for(var e=0;b>e;e++)for(var d=0;b-6>d;d++)a.isDark(d,e)&&!a.isDark(d+1,e)&&a.isDark(d+2,e)&&a.isDark(d+3,e)&&a.isDark(d+4,e)&&!a.isDark(d+5,e)&&a.isDark(d+6,e)&&(c+=40);for(var k=0,e=0;b>e;e++)for(var d=0;b>d;d++)a.isDark(d,e)&&k++;var l=Math.abs(100*k/b/b-50)/5;return c+=10*l}},g={glog:function(a){if(1>a)throw new Error("glog("+a+")");return g.LOG_TABLE[a]},gexp:function(a){for(;0>a;)a+=255;for(;a>=256;)a-=255;return g.EXP_TABLE[a]},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)},h=0;8>h;h++)g.EXP_TABLE[h]=1<h;h++)g.EXP_TABLE[h]=g.EXP_TABLE[h-4]^g.EXP_TABLE[h-5]^g.EXP_TABLE[h-6]^g.EXP_TABLE[h-8];for(var h=0;255>h;h++)g.LOG_TABLE[g.EXP_TABLE[h]]=h;i.prototype={get:function(a){return this.num[a]},getLength:function(){return this.num.length},multiply:function(a){for(var b=new Array(this.getLength()+a.getLength()-1),c=0;cf;f++)for(var g=c[3*f+0],h=c[3*f+1],i=c[3*f+2],k=0;g>k;k++)e.push(new j(h,i));return e},j.getRsBlockTable=function(a,b){switch(b){case d.L:return j.RS_BLOCK_TABLE[4*(a-1)+0];case d.M:return j.RS_BLOCK_TABLE[4*(a-1)+1];case d.Q:return j.RS_BLOCK_TABLE[4*(a-1)+2];case d.H:return j.RS_BLOCK_TABLE[4*(a-1)+3];default:return void 0}},k.prototype={get:function(a){var b=Math.floor(a/8);return 1==(1&this.buffer[b]>>>7-a%8)},put:function(a,b){for(var c=0;b>c;c++)this.putBit(1==(1&a>>>b-c-1))},getLengthInBits:function(){return this.length},putBit:function(a){var b=Math.floor(this.length/8);this.buffer.length<=b&&this.buffer.push(0),a&&(this.buffer[b]|=128>>>this.length%8),this.length++}};var l=[[17,14,11,7],[32,26,20,14],[53,42,32,24],[78,62,46,34],[106,84,60,44],[134,106,74,58],[154,122,86,64],[192,152,108,84],[230,180,130,98],[271,213,151,119],[321,251,177,137],[367,287,203,155],[425,331,241,177],[458,362,258,194],[520,412,292,220],[586,450,322,250],[644,504,364,280],[718,560,394,310],[792,624,442,338],[858,666,482,382],[929,711,509,403],[1003,779,565,439],[1091,857,611,461],[1171,911,661,511],[1273,997,715,535],[1367,1059,751,593],[1465,1125,805,625],[1528,1190,868,658],[1628,1264,908,698],[1732,1370,982,742],[1840,1452,1030,790],[1952,1538,1112,842],[2068,1628,1168,898],[2188,1722,1228,958],[2303,1809,1283,983],[2431,1911,1351,1051],[2563,1989,1423,1093],[2699,2099,1499,1139],[2809,2213,1579,1219],[2953,2331,1663,1273]],o=function(){var a=function(a,b){this._el=a,this._htOption=b};return a.prototype.draw=function(a){function g(a,b){var c=document.createElementNS("http://www.w3.org/2000/svg",a);for(var d in b)b.hasOwnProperty(d)&&c.setAttribute(d,b[d]);return c}var b=this._htOption,c=this._el,d=a.getModuleCount();Math.floor(b.width/d),Math.floor(b.height/d),this.clear();var h=g("svg",{viewBox:"0 0 "+String(d)+" "+String(d),width:"100%",height:"100%",fill:b.colorLight});h.setAttributeNS("http://www.w3.org/2000/xmlns/","xmlns:xlink","http://www.w3.org/1999/xlink"),c.appendChild(h),h.appendChild(g("rect",{fill:b.colorDark,width:"1",height:"1",id:"template"}));for(var i=0;d>i;i++)for(var j=0;d>j;j++)if(a.isDark(i,j)){var k=g("use",{x:String(i),y:String(j)});k.setAttributeNS("http://www.w3.org/1999/xlink","href","#template"),h.appendChild(k)}},a.prototype.clear=function(){for(;this._el.hasChildNodes();)this._el.removeChild(this._el.lastChild)},a}(),p="svg"===document.documentElement.tagName.toLowerCase(),q=p?o:m()?function(){function a(){this._elImage.src=this._elCanvas.toDataURL("image/png"),this._elImage.style.display="block",this._elCanvas.style.display="none"}function d(a,b){var c=this;if(c._fFail=b,c._fSuccess=a,null===c._bSupportDataURI){var d=document.createElement("img"),e=function(){c._bSupportDataURI=!1,c._fFail&&_fFail.call(c)},f=function(){c._bSupportDataURI=!0,c._fSuccess&&c._fSuccess.call(c)};return d.onabort=e,d.onerror=e,d.onload=f,d.src="data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==",void 0}c._bSupportDataURI===!0&&c._fSuccess?c._fSuccess.call(c):c._bSupportDataURI===!1&&c._fFail&&c._fFail.call(c)}if(this._android&&this._android<=2.1){var b=1/window.devicePixelRatio,c=CanvasRenderingContext2D.prototype.drawImage;CanvasRenderingContext2D.prototype.drawImage=function(a,d,e,f,g,h,i,j){if("nodeName"in a&&/img/i.test(a.nodeName))for(var l=arguments.length-1;l>=1;l--)arguments[l]=arguments[l]*b;else"undefined"==typeof j&&(arguments[1]*=b,arguments[2]*=b,arguments[3]*=b,arguments[4]*=b);c.apply(this,arguments)}}var e=function(a,b){this._bIsPainted=!1,this._android=n(),this._htOption=b,this._elCanvas=document.createElement("canvas"),this._elCanvas.width=b.width,this._elCanvas.height=b.height,a.appendChild(this._elCanvas),this._el=a,this._oContext=this._elCanvas.getContext("2d"),this._bIsPainted=!1,this._elImage=document.createElement("img"),this._elImage.style.display="none",this._el.appendChild(this._elImage),this._bSupportDataURI=null};return e.prototype.draw=function(a){var b=this._elImage,c=this._oContext,d=this._htOption,e=a.getModuleCount(),f=d.width/e,g=d.height/e,h=Math.round(f),i=Math.round(g);b.style.display="none",this.clear();for(var j=0;e>j;j++)for(var k=0;e>k;k++){var l=a.isDark(j,k),m=k*f,n=j*g;c.strokeStyle=l?d.colorDark:d.colorLight,c.lineWidth=1,c.fillStyle=l?d.colorDark:d.colorLight,c.fillRect(m,n,f,g),c.strokeRect(Math.floor(m)+.5,Math.floor(n)+.5,h,i),c.strokeRect(Math.ceil(m)-.5,Math.ceil(n)-.5,h,i)}this._bIsPainted=!0},e.prototype.makeImage=function(){this._bIsPainted&&d.call(this,a)},e.prototype.isPainted=function(){return this._bIsPainted},e.prototype.clear=function(){this._oContext.clearRect(0,0,this._elCanvas.width,this._elCanvas.height),this._bIsPainted=!1},e.prototype.round=function(a){return a?Math.floor(1e3*a)/1e3:a},e}():function(){var a=function(a,b){this._el=a,this._htOption=b};return a.prototype.draw=function(a){for(var b=this._htOption,c=this._el,d=a.getModuleCount(),e=Math.floor(b.width/d),f=Math.floor(b.height/d),g=[''],h=0;d>h;h++){g.push("");for(var i=0;d>i;i++)g.push('');g.push("")}g.push("
"),c.innerHTML=g.join("");var j=c.childNodes[0],k=(b.width-j.offsetWidth)/2,l=(b.height-j.offsetHeight)/2;k>0&&l>0&&(j.style.margin=l+"px "+k+"px")},a.prototype.clear=function(){this._el.innerHTML=""},a}();QRCode=function(a,b){if(this._htOption={width:256,height:256,typeNumber:4,colorDark:"#000000",colorLight:"#ffffff",correctLevel:d.H},"string"==typeof b&&(b={text:b}),b)for(var c in b)this._htOption[c]=b[c];"string"==typeof a&&(a=document.getElementById(a)),this._android=n(),this._el=a,this._oQRCode=null,this._oDrawing=new q(this._el,this._htOption),this._htOption.text&&this.makeCode(this._htOption.text)},QRCode.prototype.makeCode=function(a){this._oQRCode=new b(r(a,this._htOption.correctLevel),this._htOption.correctLevel),this._oQRCode.addData(a),this._oQRCode.make(),this._el.title=a,this._oDrawing.draw(this._oQRCode),this.makeImage()},QRCode.prototype.makeImage=function(){"function"==typeof this._oDrawing.makeImage&&(!this._android||this._android>=3)&&this._oDrawing.makeImage()},QRCode.prototype.clear=function(){this._oDrawing.clear()},QRCode.CorrectLevel=d}(); \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/current-skycoin.json b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/current-skycoin.json new file mode 100644 index 00000000..e771960e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/current-skycoin.json @@ -0,0 +1 @@ +versionData='{ "version": "0.25.0" }'; diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/environments/environment.prod.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/environments/environment.prod.ts new file mode 100644 index 00000000..9ecd49cb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/environments/environment.prod.ts @@ -0,0 +1,11 @@ +export const environment = { + nodeUrl: '/api/', + production: true, + tellerUrl: 'https://event.skycoin.com/api/', + + swaplab: { + apiKey: 'w4bxe2tbf9beb72r', // if set to null, integration will be disabled + activateTestMode: false, + endStatusInError: false, + }, +}; diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/environments/environment.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/environments/environment.ts new file mode 100644 index 00000000..0fac1b06 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/environments/environment.ts @@ -0,0 +1,16 @@ +// The file contents for the current environment will overwrite these during build. +// The build system defaults to the dev environment which uses `environment.ts`, but if you do +// `ng build --env=prod` then `environment.prod.ts` will be used instead. +// The list of which env maps to which file can be found in `.angular-cli.json`. + +export const environment = { + nodeUrl: '/api/', + production: false, + tellerUrl: '/teller/', + + swaplab: { + apiKey: 'w4bxe2tbf9beb72r', // if set to null, integration will be disabled + activateTestMode: true, + endStatusInError: false, + }, +}; diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/favicon.ico b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/favicon.ico new file mode 100644 index 00000000..cc325fd3 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/favicon.ico differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/index.html b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/index.html new file mode 100755 index 00000000..3113303e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/index.html @@ -0,0 +1,49 @@ + + + + + Skycoin + + + + + + + +
+
+ +
+ +
+
+
+
+ + diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/main.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/main.ts new file mode 100644 index 00000000..6b163a15 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/main.ts @@ -0,0 +1,13 @@ +import { enableProdMode } from '@angular/core'; +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; + +import { AppModule } from './app/app.module'; +import { environment } from './environments/environment'; + +import 'hammerjs'; + +if (environment.production) { + enableProdMode(); +} + +platformBrowserDynamic().bootstrapModule(AppModule); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/polyfills.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/polyfills.ts new file mode 100644 index 00000000..7831e97b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/polyfills.ts @@ -0,0 +1,72 @@ +/** + * This file includes polyfills needed by Angular and is loaded before the app. + * You can add your own extra polyfills to this file. + * + * This file is divided into 2 sections: + * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. + * 2. Application imports. Files imported after ZoneJS that should be loaded before your main + * file. + * + * The current setup is for so-called "evergreen" browsers; the last versions of browsers that + * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), + * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. + * + * Learn more in https://angular.io/docs/ts/latest/guide/browser-support.html + */ + +/*************************************************************************************************** + * BROWSER POLYFILLS + */ + +/** IE9, IE10 and IE11 requires all of the following polyfills. **/ +// import 'core-js/es6/symbol'; +// import 'core-js/es6/object'; +// import 'core-js/es6/function'; +// import 'core-js/es6/parse-int'; +// import 'core-js/es6/parse-float'; +// import 'core-js/es6/number'; +// import 'core-js/es6/math'; +// import 'core-js/es6/string'; +// import 'core-js/es6/date'; +// import 'core-js/es6/array'; +// import 'core-js/es6/regexp'; +// import 'core-js/es6/map'; +// import 'core-js/es6/weak-map'; +// import 'core-js/es6/set'; + +/** IE10 and IE11 requires the following for NgClass support on SVG elements */ +// import 'classlist.js'; // Run `npm install --save classlist.js`. + +/** Evergreen browsers require these. **/ +import 'core-js/es6/reflect'; +import 'core-js/es7/reflect'; + + +/** + * Required to support Web Animations `@angular/animation`. + * Needed for: All but Chrome, Firefox and Opera. http://caniuse.com/#feat=web-animation + **/ +// import 'web-animations-js'; // Run `npm install --save web-animations-js`. + + + +/*************************************************************************************************** + * Zone JS is required by Angular itself. + */ +import 'zone.js/dist/zone'; // Included with Angular CLI. + + + +/*************************************************************************************************** + * APPLICATION IMPORTS + */ + +/** + * Date, currency, decimal and percent pipes. + * Needed for: All but Chrome, Firefox, Edge, IE11 and Safari 10 + */ +// import 'intl'; // Run `npm install --save intl`. +/** + * Need to import at least one locale-data with intl. + */ +// import 'intl/locale-data/jsonp/en'; diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/styles.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/styles.scss new file mode 100644 index 00000000..d2b3b828 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/styles.scss @@ -0,0 +1,501 @@ +@import 'theme/variables'; +@import 'theme/tables'; +@import 'theme/_modals'; +@import '~bootstrap/scss/bootstrap-grid.scss'; +@import '~bootstrap/scss/utilities/_display.scss'; + +/* You can add global styles to this file, and also import other style files */ +//@import '~@angular/material/prebuilt-themes/indigo-pink.css'; +@import 'app/app.theme.scss'; + +@font-face { + font-family: 'Skycoin'; + font-style: normal; + font-weight: 300; + src: url('assets/fonts/skycoin/Skycoin-Light.woff2') format('woff2'), + url('assets/fonts/skycoin/Skycoin-Light.woff') format('woff'); +} +@font-face { + font-family: 'Skycoin'; + font-style: italic; + font-weight: 300; + src: url('assets/fonts/skycoin/Skycoin-LightItalic.woff2') format('woff2'), + url('assets/fonts/skycoin/Skycoin-LightItalic.woff') format('woff'); +} +@font-face { + font-family: 'Skycoin'; + font-style: normal; + font-weight: 400; + src: url('assets/fonts/skycoin/Skycoin-Regular.woff2') format('woff2'), + url('assets/fonts/skycoin/Skycoin-Regular.woff') format('woff'); +} +@font-face { + font-family: 'Skycoin'; + font-style: italic; + font-weight: 400; + src: url('assets/fonts/skycoin/Skycoin-RegularItalic.woff2') format('woff2'), + url('assets/fonts/skycoin/Skycoin-RegularItalic.woff') format('woff'); +} +@font-face { + font-family: 'Skycoin'; + font-style: normal; + font-weight: 700; + src: url('assets/fonts/skycoin/Skycoin-Bold.woff2') format('woff2'), + url('assets/fonts/skycoin/Skycoin-Bold.woff') format('woff'); +} +@font-face { + font-family: 'Skycoin'; + font-style: italic; + font-weight: 700; + src: url('assets/fonts/skycoin/Skycoin-BoldItalic.woff2') format('woff2'), + url('assets/fonts/skycoin/Skycoin-BoldItalic.woff') format('woff'); +} + +$mat-font-family: Skycoin, sans-serif; +$white: #FBFBFB; + +$primary-color: #0072ff; +$secondary-color: #ffc125; + +body, div, h1, h2, h3, h4, h5, h6, p, span, a, button, option, select, +mat-panel-description, mat-panel-title, mat-option.mat-option { + font-family: $mat-font-family; +} + +html { + height: 100%; +} + +body { + background-color: #f7f7f7; + margin: 0; + padding: 0; + height: 100%; +} + +header { + background: url("assets/header.png") center center / cover, linear-gradient(-155deg, #686e96 0%, #373b5c 100%); + width: 100%; + height: 300px; +} + +mat-dialog-container { + border-radius: 5px !important; +} + +.mat-dialog-container { + padding: 0 !important; +} + +.header-container { + max-width: 848px; + text-align: center; + padding-top: 40px; + margin-right: auto; + margin-left: auto; +} + +.header-container h1 { + font-size: 3em; + color: white; +} + +.button-line { + margin-top: 40px; + text-align: right; +} + +.datatable-row-group { + cursor: pointer; +} + +button.active { + background-color: rgba(0,0,0,.12); +} + +mat-spinner.in-button .mat-spinner path { + stroke: #000; + opacity: 0.3; +} + +mat-spinner.in-button { + display: inline-block; + margin-left: 10px; + + &.small { + height: 18px !important; + width: 18px !important; + + svg { + height: 18px !important; + width: 18px !important; + } + } +} + +mat-spinner.in-text { + display: inline-block; + height: 12px !important; + width: 12px !important; + margin: 0 !important; + margin-left: 7px !important; + + svg { + height: 12px !important; + width: 12px !important; + + circle { + stroke: $gradient-blue-dark; + } + } +} + +snack-bar-container { + background-color: rgba(255, 0, 0, 0.8) !important; +} + +mat-panel-title { + width: 60%; + display: block; + flex-grow: 0 !important; +} + +.sky-container { + min-width: 100%; + min-height: 100%; + + &.sky-container-grey { + background-color: $grey-lightest; + } +} + +.flex-fill, .-flex-fill { + flex: 1 1 auto; +} + +.form-field { + margin-bottom: 20px; + + label { + color: #1e2227; + display: block; + font-size: 13px; + line-height: 20px; + margin-bottom: 2px; + } + + input { + border: 2px solid rgba(0, 0, 0, 0.05); + border-radius: 6px; + box-sizing: border-box; + display: block; + line-height: 20px; + padding: 10px 10px; + width: 100%; + } + + .-input-addon { + display: flex; + + input { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + + span { + border: 2px; + border-radius: 0 6px 6px 0; + background: #f1f1f1; + padding: 0 10px; + line-height: 44px; + color: $grey; + font-size: 14px; + flex-shrink: 0; + } + } + + select { + background-color: white; + border: 2px solid rgba(0, 0, 0, 0.05); + border-radius: 6px; + box-sizing: border-box; + display: block; + line-height: 20px; + padding: 10px 10px; + width: 100%; + appearance: none; + } + + textarea { + border: 2px solid rgba(0, 0, 0, 0.05); + border-radius: 6px; + box-sizing: border-box; + display: block; + line-height: 20px; + padding: 10px 10px; + width: 100%; + } +} + +.primary button.enabled, .primary-gradient-background { + background: $gradient-blue-dark; /* For browsers that do not support gradients */ + background: -webkit-linear-gradient(left top, $gradient-blue-dark, $gradient-blue-light); /* For Safari 5.1 to 6.0 */ + background: -o-linear-gradient(bottom right, $gradient-blue-dark, $gradient-blue-light); /* For Opera 11.1 to 12.0 */ + background: -moz-linear-gradient(bottom right, $gradient-blue-dark, $gradient-blue-light); /* For Firefox 3.6 to 15 */ + background: linear-gradient(to bottom right, $gradient-blue-dark, $gradient-blue-light); /* Standard syntax */ + + span { + color: white; + } +} + +/** +General Helpers + */ + +.primary-color { + color: $primary-color; +} + +.secondary-color { + color: $secondary-color; +} + +.no-opacity { + opacity: 1 !important; +} + +.light-opacity { + opacity: 0.2 +} + +.rotate-90 { + transform: rotate(90deg); +} + +.rotate-180 { + transform: rotate(180deg); +} + +.rotate-270 { + transform: rotate(270deg); +} + +mat-spinner.in-button svg { + height: 24px !important; + width: 24px !important; +} + +.empty-row { + padding: 0 1.2rem !important; + line-height: 50px !important; +} + +/** +Alerts + */ + +.alert-box { + color: $red; + font-size: 12px; + padding: 0 10px; + line-height: 1.5; + background-color: #ffdede; + padding: 15px; + display: flex; + margin-bottom: 20px; + + .title { + font-size: 20px; + } + + mat-icon { + margin-top: 5px; + margin-right: 10px; + animation: alert-blinking 1s linear infinite; + } + + mat-checkbox { + margin-top: 10px; + display: inline-block; + } +} + +@keyframes alert-blinking { + 50% { + opacity: 0.2; + } +} + +/** +On-boarding components + */ + +.onboarding-container { + width: 100%; + height: 100%; + overflow-x: hidden; + background: $gradient-blue-dark; /* For browsers that do not support gradients */ + background: -webkit-linear-gradient(left top, $gradient-blue-dark, $gradient-blue-light); /* For Safari 5.1 to 6.0 */ + background: -o-linear-gradient(bottom right, $gradient-blue-dark, $gradient-blue-light); /* For Opera 11.1 to 12.0 */ + background: -moz-linear-gradient(bottom right, $gradient-blue-dark, $gradient-blue-light); /* For Firefox 3.6 to 15 */ + background: linear-gradient(to bottom right, $gradient-blue-dark, $gradient-blue-light); /* Standard syntax */ + + .row-container { + max-width: 450px; + width: 80%; + margin: 0px auto; + } + + label { + color: white; + } + + input { + border: 2px solid rgba(0, 0, 0, 0.05); + border-radius: 6px; + box-sizing: border-box; + display: block; + line-height: 20px; + padding: 10px 10px; + width: 100%; + } + + select { + background-color: white; + border: 2px solid rgba(0, 0, 0, 0.05); + border-radius: 6px; + box-sizing: border-box; + display: block; + line-height: 20px; + padding: 10px 10px; + width: 100%; + -webkit-appearance:none; + } + + textarea { + border: 2px solid rgba(0, 0, 0, 0.05); + border-radius: 6px; + box-sizing: border-box; + display: block; + line-height: 20px; + padding: 10px 10px; + width: 100%; + } +} + +.dark button.enabled { + background-color: $black !important; + span { + color: white; + } +} + +.ghost button.enabled { + background-color: $transparent !important; + span { + color: black; + } +} + + +.-select { + position: relative; + + &::after { + content: ''; + display: block; + position: absolute; + top: 0; + right: 0; + background: url('/assets/img/chevron-right-grey.png') no-repeat; + background-size: 32px 32px; + width: 32px; + height: 32px; + margin: 6px; + pointer-events: none; + transform: rotate(90deg); + } +} + +.mat-menu-panel { + border-radius: 5px !important; + background-color: #fefefe; + + .mat-menu-item { + font-family: Skycoin; + line-height: 50px; + } + + &.compact { + .mat-menu-item { + font-size: 13px; + height: 35px; + line-height: 35px; + } + } +} + +.qr-code-button { + opacity: 0.6; + cursor: pointer; + + &:hover { + opacity: 1; + } +} + +.mat-dialog-content { + max-height: 90vh !important; +} + +@media (max-height: 600px) { + .mat-dialog-content { + max-height: 80vh !important; + } +} + +.mouse-disabled { + pointer-events: none; +} + +.coin-selector-container { + display: inline-block; + margin-left: 5px; + margin-bottom: 5px; +} + +.coins-value-label { + font-size: 10px; + margin-top: 1px; + padding: 3px 10px; + background-color: $grey-lightest; + border-radius: 4px; + + span { + opacity: 0.5; + } + + .link { + color: $gradient-blue-dark; + cursor: pointer; + display: inline-block; + font-size: 11px; + margin-bottom: 3px; + margin-top: -5px; + } + + .centerd-link { + width: 100%; + text-align: center; + } +} + +.red { + color: $red; +} + +.element-disabled { + pointer-events: none; + opacity: 0.5; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/test.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/test.ts new file mode 100644 index 00000000..0c45c2ef --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/test.ts @@ -0,0 +1,32 @@ +// This file is required by karma.conf.js and loads recursively all the .spec and framework files + +import 'zone.js/dist/long-stack-trace-zone'; +import 'zone.js/dist/proxy.js'; +import 'zone.js/dist/sync-test'; +import 'zone.js/dist/jasmine-patch'; +import 'zone.js/dist/async-test'; +import 'zone.js/dist/fake-async-test'; +import { getTestBed } from '@angular/core/testing'; +import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting, +} from '@angular/platform-browser-dynamic/testing'; + +// Unfortunately there's no typing for the `__karma__` variable. Just declare it as any. +declare const __karma__: any; +declare const require: any; + +// Prevent Karma from running prematurely. +__karma__.loaded = function() {}; + +// First, initialize the Angular testing environment. +getTestBed().initTestEnvironment( + BrowserDynamicTestingModule, + platformBrowserDynamicTesting(), +); +// Then we find all the tests. +const context = require.context('./', true, /\.spec\.ts$/); +// And load the modules. +context.keys().map(context); +// Finally, start Karma to run the tests. +__karma__.start(); diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/theme/_modals.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/theme/_modals.scss new file mode 100644 index 00000000..d406b085 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/theme/_modals.scss @@ -0,0 +1,65 @@ +@import 'variables'; + +.modal { + .-body { + line-height: 20px; + font-size: 13px; + color: $grey-dark; + opacity: 0.8; + } + + .big-text { + color: black; + font-weight: bold; + font-size: 15px; + } + + .-check-container{ + text-align: center; + margin-top: 25px; + + .-check { + label { + font-family: Skycoin; + line-height: normal; + font-size: 14px; + + color: $grey-dark; + } + + .mat-checkbox-checkmark-path { + position: absolute; + width: 18px; + height: 8px; + left: 4.59px; + top: 9px; + stroke: $gradient-blue-dark !important; + } + + .mat-checkbox-background, .mat-checkbox-frame { + top: 0; + left: 0; + right: 0; + bottom: 0; + position: absolute; + box-sizing: border-box; + pointer-events: none; + width: 20px; + height: 20px; + background: rgba(30, 34, 39, 0.05); + border-radius: 6px; + border-color: transparent; + } + } + } + + .-buttons { + text-align: center; + } + + app-button { + button { + margin-top: 28px; + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/theme/_tables.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/theme/_tables.scss new file mode 100644 index 00000000..b18b29bf --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/theme/_tables.scss @@ -0,0 +1,73 @@ +@import 'variables'; + +.-table { + &:last-of-type { + margin-bottom: 30px; + } + + .-headers { + color: $grey-light; + display: flex; + font-size: 12px; + font-weight: 700; + height: 50px; + line-height: 50px; + margin: 0 30px; + + > div { + padding: 0 20px; + } + } + + .-body { + border-radius: 15px; + box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.01), 1px 1px 2px 2px rgba(0, 0, 0, 0.01); + margin: 0 30px; + + .-row { + font-size: $font-size-standard; + padding: 15px 0; + background: $white; + display: flex; + align-items: center; + + &:not(:last-child) { + border-bottom: 1px solid #eff0f0; + } + + &:first-child { + border-top-left-radius: 15px; + border-top-right-radius: 15px; + } + + &:last-child { + border-bottom-left-radius: 15px; + border-bottom-right-radius: 15px; + } + + > div { + padding: 0 20px; + } + } + } + + .-width-70 { + width: 70px; + flex-shrink: 0; + } + + .-width-150 { + width: 150px; + flex-shrink: 0; + } + + .-width-200 { + width: 200px; + flex-shrink: 0; + } + + .-width-250 { + width: 250px; + flex-shrink: 0; + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/theme/_variables.scss b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/theme/_variables.scss new file mode 100644 index 00000000..85c8f237 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/theme/_variables.scss @@ -0,0 +1,35 @@ +// Backgrounds +$gradient-blue-dark: #0072ff; +$gradient-blue-dark-transparent: rgba(0, 114, 255, 0.7); +$gradient-blue-light: #00C3ff; +$gradient-blue-light-transparent: rgba(0, 195, 255, 0.7); + +// Colors +$black: #171a1d; + +$grey-lightest: #f7f7f7; +$grey-very-light: rgba(30, 34, 39, 0.05); +$grey-light: rgba(30, 34, 39, 0.2); +$grey: rgba(30, 34, 39, 0.5); +$grey-semi-dark: rgba(30, 34, 39, 0.75); +$grey-dark: #1e2227; + +$white: #fafafa; +$transparent: rgba(0,0,0,0); + +$red: #ff004e; +$blue: #0072ff; +$green: #00df80; +$yellow: #ffc125; + +// Grid +$row-height: 60px; +$row-detail-size: 32px; + +// Texts +$font-size-standard: 13px; +$letter-spacing-wide: 1px; + +// Responsive sizes +$max-xs-width: 767px; +$max-sm-width: 991px; diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/tsconfig.app.json b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/tsconfig.app.json new file mode 100644 index 00000000..39ba8dba --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/tsconfig.app.json @@ -0,0 +1,13 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/app", + "baseUrl": "./", + "module": "es2015", + "types": [] + }, + "exclude": [ + "test.ts", + "**/*.spec.ts" + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/tsconfig.spec.json b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/tsconfig.spec.json new file mode 100644 index 00000000..63d89ff2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/tsconfig.spec.json @@ -0,0 +1,20 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/spec", + "baseUrl": "./", + "module": "commonjs", + "target": "es5", + "types": [ + "jasmine", + "node" + ] + }, + "files": [ + "test.ts" + ], + "include": [ + "**/*.spec.ts", + "**/*.d.ts" + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/typings.d.ts b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/typings.d.ts new file mode 100644 index 00000000..bcc7cff2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/src/typings.d.ts @@ -0,0 +1,10 @@ +/* SystemJS module definition */ +declare var module: NodeModule; +interface NodeModule { + id: string; +} + +declare var System: System; +interface System { + import(request: string): Promise; +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/test-fixtures/encoded-txs.json b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/test-fixtures/encoded-txs.json new file mode 100644 index 00000000..50fefdb1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/test-fixtures/encoded-txs.json @@ -0,0 +1,665 @@ +{ + "txs": [ + { + "inputs": [ + { + "hashIn": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "index": 0 + } + ], + "outputs": [ + { + "address": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coin": 1000000000000, + "hour": 1 + }, + { + "address": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coin": 1000000000000, + "hour": 1 + } + ], + "signatures": [ + "be602113fe288f750001ab65f254ceedd8b05b1becc456a0a52a0bea10b8280e38d950933992ad3265e1f81d197036fa634b316f08b3b319ffce081aa43f3bb600" + ], + "innerHash": "0f7019627886818d2501af189bbac18e21b8e959891c5b2726f89e29355aa10a", + "block": 1, + "raw": "060f0000000f7019627886818d2501af189bbac18e21b8e959891c5b2726f89e29355aa10a01000000be602113fe288f750001ab65f254ceedd8b05b1becc456a0a52a0bea10b8280e38d950933992ad3265e1f81d197036fa634b316f08b3b319ffce081aa43f3bb60001000000043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a064000000003be2537f8c0893fddcddc878518f38ea493d949e0010a5d4e8000000010000000000000000b1cb2d1f0f4cae81aaba5b7bac6cd0825d836d860010a5d4e80000000100000000000000009b82664a2791ff0b713c054f0c8297b5d4b85a300010a5d4e80000000100000000000000006840be5c4574ebd2964d3b8480d9e68c9c04e4010010a5d4e800000001000000000000000017b74f4f9d84f265b849247786397241b31b435f0010a5d4e8000000010000000000000000c69047802c2eee1d3209fdc7a1f00387fb5ea1450010a5d4e8000000010000000000000000d17417e9ba3a0ab4c41b06dcba12fe1b7ad1cef50010a5d4e800000001000000000000000080032d0848e465ffb34336656390f4a781cc02310010a5d4e80000000100000000000000006d6c91562619265ff1b6ae7ae308511cfe3fcf3b0010a5d4e800000001000000000000000013d30014b79aee9b709eb17d202ad74cc6fdb8d80010a5d4e80000000100000000000000007df08027c2c47e2df1ed3fd93746c0f9d7a5fcd60010a5d4e8000000010000000000000000d496adb8bd0af7187b844243cfb436ba6d1ee18d0010a5d4e800000001000000000000000088a08c6fdd118b1a4bade4079b832d6415b4cb420010a5d4e80000000100000000000000002bb86985bfef99483e6d53c85febdf147472ff030010a5d4e8000000010000000000000000edc2beafb906a7362037c7b8d7c68bbcd50b5d250010a5d4e800000001000000000000000040929a5c060aa1665a78f68e687b2fc8e23aa8340010a5d4e8000000010000000000000000f129d1542ced1edd34800d5c2b781c8975aa37270010a5d4e80000000100000000000000001df18d79bd317911b14337ccc9caa7d0e26365b30010a5d4e800000001000000000000000062f93858c3201e2098bf5bfb8ffe35be1e0ef70e0010a5d4e8000000010000000000000000b19e29169074d369b6a61e718c70379737e4cccc0010a5d4e800000001000000000000000042cedc2e80c7ee2ca2855a06fd3ba0159bbff0d70010a5d4e8000000010000000000000000ef7101839457ea9bc50790171fd852bc006896390010a5d4e800000001000000000000000068409c9234c735fb2483d50bfcae0c62a3be08b10010a5d4e8000000010000000000000000cda5b71ce21c6a82bd7c24c63ce2f0ac69a400770010a5d4e80000000100000000000000001835c74c2fc92121d7435290bc14b272c7ea13b30010a5d4e8000000010000000000000000ed7d7b5c69cbcbd9932da5fb4c1ac95a535fef480010a5d4e80000000100000000000000002db48e3fe7f2050154bb72fcd8a810569c837c040010a5d4e80000000100000000000000000a60181b51e57912c8a7c9043cd7766fff2c8ddf0010a5d4e8000000010000000000000000f76e064dad995a22c9589c2ac78a0e21ae032cca0010a5d4e80000000100000000000000004bb99ae026d8ce7ced17cd314dcb392db209329d0010a5d4e8000000010000000000000000647ef87e6bf1c89c422134c6d36d8f96b17f03ce0010a5d4e8000000010000000000000000af9067e7b6c3691892bb7b8de7050dbdcbe355900010a5d4e80000000100000000000000007474ba61b2a67955667becc2de0f18ed2209fca90010a5d4e80000000100000000000000000809cd6f137e6a187a636fa7e369403511972aa50010a5d4e80000000100000000000000001018ab1c3cfa510be3fe6e2e29542771b3a6186f0010a5d4e800000001000000000000000074c3ef7e006a15baf6a33af6a1bf6e9434dc4efe0010a5d4e8000000010000000000000000ee74b074b2f5e6ffcce85da4a7e172cc911b90170010a5d4e80000000100000000000000004945b3bb36d9dc89df6f88e155d82503ee5feb9c0010a5d4e800000001000000000000000058d5676ed8fc30fa344ff9bfe224a4f94c098d750010a5d4e80000000100000000000000003300cac841a4acf1fd7527f4e76a173e8bc9ad550010a5d4e8000000010000000000000000889e62956a764db1143a4b588b4e4e886f79ef430010a5d4e8000000010000000000000000e8a1b38eb944d4501eb2ab60588a00d3a9c739a20010a5d4e8000000010000000000000000a5df92d314b2e133286a7cc0036bb836bc384df00010a5d4e8000000010000000000000000dba81d12c864e678c0a910f49d1e9d100f765ac30010a5d4e800000001000000000000000066958a5798c6f07a75ecc259866972c7db30fe930010a5d4e80000000100000000000000003c6aa14df1ceb2d3d90a72993124c4aee438dcf20010a5d4e8000000010000000000000000d8486eba19a2ec0a76bc7b5a6e729c28989c02dd0010a5d4e80000000100000000000000001731aacce97b0fcae9b3915d798a31e0bcdbecd20010a5d4e80000000100000000000000007f331280a851eab18e40a4f2e01e0423a61c88d20010a5d4e8000000010000000000000000f51d276fd69c55c5ae75617455bba63576eb55380010a5d4e8000000010000000000000000166261d8e0f4d7199137547f9d983093b8a83e010010a5d4e800000001000000000000000077a6cd82676ea569c2e29637bf021440f83c1b590010a5d4e8000000010000000000000000dd00b7bedd4b2c17e33c9f759c817751e5a03bac0010a5d4e800000001000000000000000007f2cc54dd0a7f9f9f8990765a160056e34cfe5c0010a5d4e8000000010000000000000000982aa1d396453abf15c827ef803d3d1fa42780750010a5d4e80000000100000000000000002e6f4e09ebf69c38051e82d47ff4f30ecb01636d0010a5d4e8000000010000000000000000da3771a1702dd6bd74e27ff495635e9fd5cfc8b90010a5d4e8000000010000000000000000ab270f3d713326ea04bbb76a40567ec9b68a0fdc0010a5d4e80000000100000000000000006ba2cf38a2e4e4490ef2aa6a13d334afe08e274b0010a5d4e8000000010000000000000000a2453b1d2c51e7e46576809e432e1d0f796c17cc0010a5d4e800000001000000000000000061f2ded3c11aa8cbff5428071deaaddd122b3d420010a5d4e800000001000000000000000006bcde3dcddf5eddbf36699de5edee76ae5381080010a5d4e800000001000000000000000034cf985956e53c3642ff24204510c09d2ec1f4160010a5d4e8000000010000000000000000c2d87e5ad2284c4b20b0630278b1b2afa51c8e4d0010a5d4e8000000010000000000000000cb1ed1ca9a81c76c138b733c1dba907cf2f6226f0010a5d4e80000000100000000000000004432ff17249de4f481203271f2433d0ff15963c20010a5d4e8000000010000000000000000575ee0f1bc6da3e3f5e1fdb2c30fe19289706b380010a5d4e800000001000000000000000078b7a73acfb87248b4a9b0313b4a258fc02568780010a5d4e800000001000000000000000094af09440255b4fe091e6087b18ebb3cd0b51d950010a5d4e80000000100000000000000009433ea55cb302024be8bde7bdff6ee614250899f0010a5d4e80000000100000000000000008de14bb4e87c177c14dfdd24d02c20e374bf05980010a5d4e800000001000000000000000025d7d3adff155dbfe0a8bb14a0efce72f82c8f530010a5d4e800000001000000000000000073659ddc6abd6d650ea735217e270f2cdf8f8e130010a5d4e80000000100000000000000007acbcc273b744075aeda6d93eeaa0ca3254b9dc30010a5d4e80000000100000000000000000d5837faf1dfab11e677852f1a004d5d2baa42fa0010a5d4e800000001000000000000000059380ebef923f2ec486888b0c6995655674e040d0010a5d4e800000001000000000000000056d06de791cface3fd12b262d4d1423eb11c1e6a0010a5d4e80000000100000000000000002a1045c8658b31d4be807a3734392d6f57cde1240010a5d4e80000000100000000000000003f98366594201e7641d404f2b5ae39ccb0e8840f0010a5d4e8000000010000000000000000d4f20c5eecf2159b66f9f3589cbb867a4979379e0010a5d4e8000000010000000000000000910b34a9fc34d4e9e4bdcd6b74017b376594b5a90010a5d4e80000000100000000000000001501051031afb8c1d978f8a6321dad9da114eee80010a5d4e8000000010000000000000000735927d116e5525d7f838a80cfaf4e41bbb5ce800010a5d4e8000000010000000000000000b5eb6ababe63206afefe9d69fe992162fa153a640010a5d4e8000000010000000000000000c55f1829761cd09dcbc117773fba906d3725eb1e0010a5d4e80000000100000000000000009b1fa3b8c4384fdae6ebf8adea1e327e74e649500010a5d4e80000000100000000000000009ece1f4291d35085f591333e497c1cec1183fc180010a5d4e800000001000000000000000049f419e3b8f22decc8ee51028016eb55e985f7540010a5d4e8000000010000000000000000a1c88901f123e1db30e01f632751d399d65371230010a5d4e8000000010000000000000000235ca41ff24d9ff52eda3dd948d976f167a868e80010a5d4e8000000010000000000000000637ff1cbb8c3989e4b5db6d687d5ebebb1eaeb440010a5d4e8000000010000000000000000e725485a2470e78c1ce948fcb475b6e58776b1b10010a5d4e8000000010000000000000000e55ebb425ff92f8f7d58f9bd4aa0a0df525c43fa0010a5d4e8000000010000000000000000f057f31ba7e6637669ed7039890d1cf3f07cd9c80010a5d4e800000001000000000000000041655ba68f745889e3ef649da6a26a3aae9169890010a5d4e80000000100000000000000008e8626e13f0393501cb2d25d4bbf4ae0afa4313f0010a5d4e80000000100000000000000009b02543dfce6942233a949eef327456039a145b40010a5d4e8000000010000000000000000e4900ea254300601620bda6af3a6cfe75b9ae1640010a5d4e80000000100000000000000003c858662d8b1f9460e6ddb5c30d368570a66c9390010a5d4e80000000100000000000000005dc40df06b99f88042a9d03999e10c17c86fc5db0010a5d4e80000000100000000000000" + }, + { + "inputs": [ + { + "hashIn": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "index": 0 + } + ], + "outputs": [ + { + "address": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coin": 999990000000, + "hour": 1 + }, + { + "address": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coin": 10000000, + "hour": 0 + } + ], + "signatures": [ + "f4482e0781e0d94c8c4773940e1f811405681844a9dc3c1938243442e1cbd5463d5e251880abbf8ff1ed85b4b2659e83ee30f06cc4c5dc9913aa6a9630fbe3de01" + ], + "innerHash": "4daff2831f5bc2877a98a49b0ef75f8ff01bcb35082fd4018c77707dfca31849", + "block": 2, + "raw": "dc000000004daff2831f5bc2877a98a49b0ef75f8ff01bcb35082fd4018c77707dfca3184901000000f4482e0781e0d94c8c4773940e1f811405681844a9dc3c1938243442e1cbd5463d5e251880abbf8ff1ed85b4b2659e83ee30f06cc4c5dc9913aa6a9630fbe3de0101000000e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f7602000000003be2537f8c0893fddcddc878518f38ea493d949e80790cd4e800000001000000000000000079ae1e8799c65b4c01e18b3b4135410c5b711f3680969800000000000000000000000000" + }, + { + "inputs": [ + { + "hashIn": "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a", + "index": 0 + } + ], + "outputs": [ + { + "address": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coin": 10000000, + "hour": 0 + } + ], + "signatures": [ + "ce8fd47e2044ed17998f92621e90329f673a746c802d67f639ca083705dd199f6ee346781497b44132434922879244d819694b5903093f784570c55d293ab4af01" + ], + "innerHash": "ea6adee3180c7f9d73d1e693822d5d1c2bba85067f89a873355bc771a078faa1", + "block": 3, + "raw": "b700000000ea6adee3180c7f9d73d1e693822d5d1c2bba85067f89a873355bc771a078faa101000000ce8fd47e2044ed17998f92621e90329f673a746c802d67f639ca083705dd199f6ee346781497b44132434922879244d819694b5903093f784570c55d293ab4af0101000000af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a01000000003be2537f8c0893fddcddc878518f38ea493d949e80969800000000000000000000000000" + }, + { + "inputs": [ + { + "hashIn": "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "index": 0 + }, + { + "hashIn": "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70", + "index": 0 + } + ], + "outputs": [ + { + "address": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coin": 999890000000, + "hour": 4073 + }, + { + "address": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coin": 100000000, + "hour": 0 + } + ], + "signatures": [ + "056ed0f74367fb1370d7e98689953983d9cf34eb6669854f1645c8a16c93d85075661e7d4f6df0ce5ca8eb9852eff6a12fbac2caafee03bb8c616f847c61416800", + "8aaa7f320a7b01169d3217a600100cb27c55e4ce56cd3455814f56d8e4e65be746e0e20e776087af6f19361f0b898edc2123a5f9bd35d24ef8b8669ca85b142601" + ], + "innerHash": "fe123ca954a82bb1ce2cc9ef9c56d6b649a4cbaf5b17394b0ffda651ed32327e", + "block": 5, + "raw": "3d01000000fe123ca954a82bb1ce2cc9ef9c56d6b649a4cbaf5b17394b0ffda651ed32327e02000000056ed0f74367fb1370d7e98689953983d9cf34eb6669854f1645c8a16c93d85075661e7d4f6df0ce5ca8eb9852eff6a12fbac2caafee03bb8c616f847c614168008aaa7f320a7b01169d3217a600100cb27c55e4ce56cd3455814f56d8e4e65be746e0e20e776087af6f19361f0b898edc2123a5f9bd35d24ef8b8669ca85b142601020000009eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf7002000000003be2537f8c0893fddcddc878518f38ea493d949e809816cee8000000e90f00000000000000ef3b60779f014b3c7acf27c16c9acc3ff3bea61600e1f505000000000000000000000000" + }, + { + "inputs": [ + { + "hashIn": "182b4c32bb5fe0e6809a19db63eecbeefde97a6c043b9248da94d428ab5a94c2", + "index": 0 + }, + { + "hashIn": "20900f1d317e0b10ebab7190a34265f52783ff4f85675398b497ab8eb3723a3c", + "index": 0 + } + ], + "outputs": [ + { + "address": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coin": 2000000, + "hour": 0 + } + ], + "signatures": [ + "fa3ccaecf3a01525fd617fe74971ff2f7270e88f92f17a0f7748c1b258e007fd0fd10a582cc406d7806fd7794e20c4a3178b71cc1cb9f59c3c7d36a4e34d962100", + "23530a4d36d65cb37fc366a8c4a61d47dfd4fbf3b268bd66fd960bcff1b91db419d039049b8f816bedbd73d6baeaea77c5907c0df5b47724ad07420dd225cdaf01" + ], + "innerHash": "02b721422fcadeb8c3217d9b972c81fe9042a32871a180fb1237e213a543cc9d", + "block": 24, + "raw": "180100000002b721422fcadeb8c3217d9b972c81fe9042a32871a180fb1237e213a543cc9d02000000fa3ccaecf3a01525fd617fe74971ff2f7270e88f92f17a0f7748c1b258e007fd0fd10a582cc406d7806fd7794e20c4a3178b71cc1cb9f59c3c7d36a4e34d96210023530a4d36d65cb37fc366a8c4a61d47dfd4fbf3b268bd66fd960bcff1b91db419d039049b8f816bedbd73d6baeaea77c5907c0df5b47724ad07420dd225cdaf0102000000182b4c32bb5fe0e6809a19db63eecbeefde97a6c043b9248da94d428ab5a94c220900f1d317e0b10ebab7190a34265f52783ff4f85675398b497ab8eb3723a3c01000000002e32707e91eb71a2dc7517c70a877fed9faf7a6080841e00000000000000000000000000" + }, + { + "inputs": [ + { + "hashIn": "2987e7c89d353ad5d63cea2bf2724dc5f7a5ef5fb81f5ea160a307f0726ac2f5", + "index": 0 + }, + { + "hashIn": "a52408daa8ce7026c70b61d4df4212fb577462060f340bfce779225b3e18193d", + "index": 0 + }, + { + "hashIn": "dc73aac74348dd285a1456c1fae2204d7c2039d50a765bdaae0c31f7c7e059db", + "index": 0 + }, + { + "hashIn": "e4e375b9dc55ff53d6de9120f1a87ff00e00a779835f8320f2c6b3090d0466e6", + "index": 0 + }, + { + "hashIn": "d11b05345917d171f60c31bd2634041b73b97eae364724369ddb8d53369397fb", + "index": 0 + } + ], + "outputs": [ + { + "address": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coin": 50000000, + "hour": 7510 + } + ], + "signatures": [ + "efb713e6a1e5d328e94a51fbeb0f73e2a3b7a54e15db75797f0b709f698b16eb26e522f187a98144807e0e6cd294686ff19037975abb6d44b20b2899968954f400", + "b5d011c60020ce591a21db15823c06188515a63ca95d573c36b3af83d634fc6f1c1125db197f6283510ee33890ac168513254ad37524c77294bb5a12e8ff23f300", + "00d87b91eda33f627f6cd28cc673daf929fbec36e7bcfdf894f7491618a68b5755b5baadedc106d53d2da924fcbedbd106eadc50ec611d426720f67426c7286500", + "e64cf7e74363cfd381a3aa6fd17d7c415d6034b26b93017acaf9cf3475ccdffc53c3714d1d13409323cf77ccc81596f6e6edcec11d890979a436ef960bcb5f6900", + "fc2eb05241afdd15cdbd28cc7158d7eb4442f21a678c52332762b23ac6c2fcc76b0f79731987df0ba84d82044cd474d4cda9afda778a21b78a0659c5b588664301" + ], + "innerHash": "02e9a06b0ca7f91255107993e00f09e9ef983559088c5febff264c17952033c4", + "block": 99, + "raw": "3b0200000002e9a06b0ca7f91255107993e00f09e9ef983559088c5febff264c17952033c405000000efb713e6a1e5d328e94a51fbeb0f73e2a3b7a54e15db75797f0b709f698b16eb26e522f187a98144807e0e6cd294686ff19037975abb6d44b20b2899968954f400b5d011c60020ce591a21db15823c06188515a63ca95d573c36b3af83d634fc6f1c1125db197f6283510ee33890ac168513254ad37524c77294bb5a12e8ff23f30000d87b91eda33f627f6cd28cc673daf929fbec36e7bcfdf894f7491618a68b5755b5baadedc106d53d2da924fcbedbd106eadc50ec611d426720f67426c7286500e64cf7e74363cfd381a3aa6fd17d7c415d6034b26b93017acaf9cf3475ccdffc53c3714d1d13409323cf77ccc81596f6e6edcec11d890979a436ef960bcb5f6900fc2eb05241afdd15cdbd28cc7158d7eb4442f21a678c52332762b23ac6c2fcc76b0f79731987df0ba84d82044cd474d4cda9afda778a21b78a0659c5b588664301050000002987e7c89d353ad5d63cea2bf2724dc5f7a5ef5fb81f5ea160a307f0726ac2f5a52408daa8ce7026c70b61d4df4212fb577462060f340bfce779225b3e18193ddc73aac74348dd285a1456c1fae2204d7c2039d50a765bdaae0c31f7c7e059dbe4e375b9dc55ff53d6de9120f1a87ff00e00a779835f8320f2c6b3090d0466e6d11b05345917d171f60c31bd2634041b73b97eae364724369ddb8d53369397fb01000000003be2537f8c0893fddcddc878518f38ea493d949e80f0fa0200000000561d000000000000" + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/tsconfig.json b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/tsconfig.json new file mode 100644 index 00000000..1f9b5585 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "outDir": "./dist/out-tsc", + "sourceMap": true, + "declaration": false, + "moduleResolution": "node", + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "target": "es5", + "typeRoots": [ + "node_modules/@types" + ], + "lib": [ + "es2016", + "dom" + ] + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/gui/static/tslint.json b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/tslint.json new file mode 100644 index 00000000..cd6c2c00 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/gui/static/tslint.json @@ -0,0 +1,159 @@ +{ + "rulesDirectory": [ + "node_modules/codelyzer" + ], + "rules": { + "arrow-return-shorthand": true, + "callable-types": true, + "class-name": true, + "comment-format": [ + true, + "check-space" + ], + "curly": true, + "eofline": true, + "forin": true, + "import-blacklist": [ + true, + "rxjs" + ], + "import-spacing": true, + "indent": [ + true, + "spaces" + ], + "interface-over-type-literal": true, + "label-position": true, + "max-line-length": [ + true, + 200 + ], + "member-access": false, + "member-ordering": [ + true, + { + "order": [ + "static-field", + "instance-field", + "static-method", + "instance-method" + ] + } + ], + "no-arg": true, + "no-bitwise": true, + "no-console": [ + true, + "debug", + "info", + "time", + "timeEnd", + "trace" + ], + "no-construct": true, + "no-debugger": true, + "no-duplicate-super": true, + "no-empty": false, + "no-empty-interface": true, + "no-eval": true, + "no-inferrable-types": [ + true, + "ignore-params" + ], + "no-misused-new": true, + "no-non-null-assertion": true, + "no-shadowed-variable": true, + "no-string-literal": false, + "no-string-throw": true, + "no-switch-case-fall-through": true, + "no-trailing-whitespace": true, + "no-unnecessary-initializer": true, + "no-unused-expression": true, + "no-use-before-declare": true, + "no-var-keyword": true, + "object-literal-sort-keys": false, + "one-line": [ + true, + "check-open-brace", + "check-catch", + "check-else", + "check-whitespace" + ], + "prefer-const": true, + "quotemark": [ + true, + "single" + ], + "radix": true, + "semicolon": [ + true, + "always" + ], + "triple-equals": [ + true, + "allow-null-check" + ], + "typedef-whitespace": [ + true, + { + "call-signature": "nospace", + "index-signature": "nospace", + "parameter": "nospace", + "property-declaration": "nospace", + "variable-declaration": "nospace" + }, + { + "call-signature": "onespace", + "index-signature": "onespace", + "parameter": "onespace", + "property-declaration": "onespace", + "variable-declaration": "onespace" + } + ], + "typeof-compare": true, + "unified-signatures": true, + "variable-name": false, + "whitespace": [ + true, + "check-branch", + "check-decl", + "check-operator", + "check-module", + "check-separator", + "check-type", + "check-typecast", + "check-preblock" + ], + "directive-selector": [ + true, + "attribute", + "app", + "camelCase" + ], + "component-selector": [ + true, + "element", + "app", + "kebab-case" + ], + "use-input-property-decorator": true, + "use-output-property-decorator": true, + "use-host-property-decorator": true, + "no-input-rename": true, + "no-output-rename": true, + "use-life-cycle-interface": true, + "use-pipe-transform-interface": true, + "component-class-suffix": true, + "directive-class-suffix": true, + "trailing-comma": [ + true, + { + "multiline": "always", + "esSpecCompliant": true + } + ], + "newline-before-return": true, + "space-before-function-paren": [true, "never"], + "prefer-method-signature": true + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/empty.go b/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/empty.go new file mode 100644 index 00000000..d93f2e3f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/empty.go @@ -0,0 +1,5 @@ +// Package kvstorage contains the implementation for a +// key-value storage of arbitrary data. `Manager` is used to +// access the storage contents. Each storage is presented by its own `KVStorageType` +// and each type has its own associated file to persist data +package kvstorage diff --git a/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/error.go b/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/error.go new file mode 100644 index 00000000..ef634dba --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/error.go @@ -0,0 +1,16 @@ +package kvstorage + +// Error wraps key-value storage related errors. +// It wraps errors caused by user input, but not errors caused by +// programmer input or internal issues. +type Error struct { + error +} + +// NewError creates an Error +func NewError(err error) error { + if err == nil { + return nil + } + return Error{err} +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/kvstorage.go b/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/kvstorage.go new file mode 100644 index 00000000..dd9caa0a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/kvstorage.go @@ -0,0 +1,162 @@ +package kvstorage + +import ( + "crypto/sha256" + "encoding/base64" + "errors" + "fmt" + "io" + "os" + "path/filepath" + "sync" + + "github.com/SkycoinProject/skycoin/src/util/file" +) + +var ( + // ErrNoSuchKey is returned when the specified key does not exist + // in the storage instance + ErrNoSuchKey = NewError(errors.New("no such key exists in the storage")) +) + +// kvStorage is a key-value storage for storing arbitrary data +type kvStorage struct { + fn string + data map[string]string + sync.RWMutex +} + +// newKVStorage constructs new storage instance using the file with the filename +// to persist data +func newKVStorage(fn string) (*kvStorage, error) { + storage := kvStorage{ + fn: fn, + } + + if err := file.LoadJSON(fn, &storage.data); err != nil { + logger.Warningf("newKVStorage LoadJSON(%s) failed: %v", fn, err) + cfp, err := makeCorruptFilePath(fn) + if err != nil { + return nil, fmt.Errorf("Failed to make corrupt file path: %v", err) + } + if err := os.Rename(fn, cfp); err != nil { + return nil, fmt.Errorf("Rename %s to %s failed: %v", fn, cfp, err) + } + logger.Infof("Backup the corrupted file from: %s to %s", fn, cfp) + if err := initEmptyStorage(fn); err != nil { + return nil, err + } + storage.data = make(map[string]string) + } + + return &storage, nil +} + +// makeCorruptFilePath creates a $FILE.corrupt.$HASH string based on file path, +// where $HASH is truncated SHA1 of $FILE. +func makeCorruptFilePath(path string) (string, error) { + fileHash, err := shaFileID(path) + if err != nil { + return "", err + } + + dir, file := filepath.Split(path) + newFile := fmt.Sprintf("%s.corrupt.%s", file, fileHash) + newPath := filepath.Join(dir, newFile) + + return newPath, nil +} + +// shaFileID return the first 8 bytes of the SHA1 hash of the file, +// hex-encoded +func shaFileID(path string) (string, error) { + fi, err := os.Open(path) + if err != nil { + return "", err + } + defer fi.Close() + + h := sha256.New() + if _, err := io.Copy(h, fi); err != nil { + return "", err + } + + sum := h.Sum(nil) + encodedSum := base64.RawURLEncoding.EncodeToString(sum[:8]) + return encodedSum, nil +} + +// get gets the value associated with the `key`. Returns `ErrNoSuchKey` +func (s *kvStorage) get(key string) (string, error) { + s.RLock() + defer s.RUnlock() + + val, ok := s.data[key] + if !ok { + return "", ErrNoSuchKey + } + + return val, nil +} + +// getAll gets the snapshot of the current storage contents +func (s *kvStorage) getAll() map[string]string { + s.RLock() + defer s.RUnlock() + + return copyMap(s.data) +} + +// add adds the `val` value to the storage with the specified `key`. Replaces the +// original value if `key` already exists +func (s *kvStorage) add(key, val string) error { + s.Lock() + defer s.Unlock() + + // save original data + oldVal, oldOk := s.data[key] + + s.data[key] = val + + // try to persist data, fall back to original data on error + if err := s.flush(); err != nil { + if !oldOk { + delete(s.data, key) + } else { + s.data[key] = oldVal + } + + return err + } + + return nil +} + +// remove removes the value associated with the `key`. Returns `ErrNoSuchKey` +func (s *kvStorage) remove(key string) error { + s.Lock() + defer s.Unlock() + + if _, ok := s.data[key]; !ok { + return ErrNoSuchKey + } + + // save original data + oldVal := s.data[key] + + delete(s.data, key) + + // try to persist data, fall back to original data on error + if err := s.flush(); err != nil { + s.data[key] = oldVal + + return err + } + + return nil +} + +// flush persists data to file +func (s *kvStorage) flush() error { + return file.SaveJSON(s.fn, s.data, 0600) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/kvstorage_test.go b/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/kvstorage_test.go new file mode 100644 index 00000000..57be749a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/kvstorage_test.go @@ -0,0 +1,390 @@ +package kvstorage + +import ( + "io/ioutil" + "os" + "path/filepath" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/util/file" +) + +const ( + testDataFilename = "data" + storageFileExtension + testEmptyFilename = "empty" + storageFileExtension + testCorruptFilename = "corrupt" + storageFileExtension +) + +func setupTmpDir(t *testing.T) (string, func()) { + tmpDir, err := ioutil.TempDir("", "kvstoragetest") + require.NoError(t, err) + + if err != nil { + return "", func() {} + } + + return tmpDir, func() { + _ = os.RemoveAll(tmpDir) //nolint:errcheck + } +} + +func setupTestFile(t *testing.T, fn string) { + data := map[string]string{ + "test1": "some value", + "test2": "{\"key\":\"val\",\"key2\":2}", + } + + err := file.SaveJSON(fn, data, 0600) + require.NoError(t, err) +} + +func setupEmptyTestFile(t *testing.T, fn string) { + data := make(map[string]string) + + err := file.SaveJSON(fn, data, 0600) + require.NoError(t, err) +} + +func setupCorruptedTestFile(t *testing.T, fn string) { + f, err := os.Create(fn) + require.NoError(t, err) + defer f.Close() + _, err = f.Write([]byte("corrupt json file")) + require.NoError(t, err) +} + +func TestNewKVStorage(t *testing.T) { + type expect struct { + storage *kvStorage + expectError bool + expectCorruptFile string + } + + tmpDir, cleanup := setupTmpDir(t) + defer cleanup() + + // Setup test data + dataFilename := filepath.Join(tmpDir, testDataFilename) + setupTestFile(t, dataFilename) + // Setup corrupt data file + corruptDataFilename := filepath.Join(tmpDir, testCorruptFilename) + setupCorruptedTestFile(t, corruptDataFilename) + + tt := []struct { + name string + fn string + expect expect + }{ + { + name: "no such file", + fn: "nofile.json", + expect: expect{ + storage: nil, + expectError: true, + }, + }, + { + name: "file exists", + fn: dataFilename, + expect: expect{ + storage: &kvStorage{ + fn: dataFilename, + data: map[string]string{ + "test1": "some value", + "test2": "{\"key\":\"val\",\"key2\":2}", + }, + }, + }, + }, + { + name: "corrupted file", + fn: corruptDataFilename, + expect: expect{ + storage: &kvStorage{ + fn: corruptDataFilename, + data: map[string]string{}, // an empty file will be when a corrupted file is detected + }, + expectCorruptFile: corruptDataFilename + ".corrupt.9NGyOAcMBB4", + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + storage, err := newKVStorage(tc.fn) + if tc.expect.expectError { + require.Error(t, err) + } else { + require.NoError(t, err) + } + if err != nil { + return + } + + require.Equal(t, tc.expect.storage, storage) + + if tc.expect.expectCorruptFile != "" { + // Check if the file does exist + _, err := os.Stat(tc.expect.expectCorruptFile) + require.False(t, os.IsNotExist(err)) + } + }) + } +} + +func TestKVStorageGet(t *testing.T) { + type expect struct { + val string + err error + } + + tmpDir, cleanup := setupTmpDir(t) + defer cleanup() + + dataFilename := filepath.Join(tmpDir, testDataFilename) + setupTestFile(t, dataFilename) + + storage, err := newKVStorage(dataFilename) + require.NoError(t, err) + + tt := []struct { + name string + storage *kvStorage + key string + expect expect + }{ + { + name: "no such key", + storage: storage, + key: "key", + expect: expect{ + err: ErrNoSuchKey, + }, + }, + { + name: "simple string value", + storage: storage, + key: "test1", + expect: expect{ + val: "some value", + err: nil, + }, + }, + { + name: "complex marshaled data", + storage: storage, + key: "test2", + expect: expect{ + val: "{\"key\":\"val\",\"key2\":2}", + err: nil, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + val, err := tc.storage.get(tc.key) + require.Equal(t, tc.expect.err, err) + if err != nil { + return + } + + require.Equal(t, tc.expect.val, val) + }) + } +} + +func TestKVStorageGetAll(t *testing.T) { + type expect struct { + data map[string]string + } + + tmpDir, cleanup := setupTmpDir(t) + defer cleanup() + + dataFilename := filepath.Join(tmpDir, testDataFilename) + emptyFilename := filepath.Join(tmpDir, testEmptyFilename) + + setupTestFile(t, dataFilename) + setupEmptyTestFile(t, emptyFilename) + + filledStorage, err := newKVStorage(dataFilename) + require.NoError(t, err) + emptyStorage, err := newKVStorage(emptyFilename) + require.NoError(t, err) + + tt := []struct { + name string + storage *kvStorage + expect expect + }{ + { + name: "filled storage", + storage: filledStorage, + expect: expect{ + data: map[string]string{ + "test1": "some value", + "test2": "{\"key\":\"val\",\"key2\":2}", + }, + }, + }, + { + name: "empty storage", + storage: emptyStorage, + expect: expect{ + data: map[string]string{}, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + data := tc.storage.getAll() + require.Equal(t, tc.expect.data, data) + }) + } +} + +func TestKVStorageAdd(t *testing.T) { + type expect struct { + newData map[string]string + expectError bool + } + + tt := []struct { + name string + key string + val string + expect expect + }{ + { + name: "add new value", + key: "new key", + val: "new value", + expect: expect{ + newData: map[string]string{ + "test1": "some value", + "test2": "{\"key\":\"val\",\"key2\":2}", + "new key": "new value", + }, + }, + }, + { + name: "replace old value", + key: "test1", + val: "oiuy", + expect: expect{ + newData: map[string]string{ + "test1": "oiuy", + "test2": "{\"key\":\"val\",\"key2\":2}", + }, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + tmpDir, cleanup := setupTmpDir(t) + defer cleanup() + + dataFilename := filepath.Join(tmpDir, testDataFilename) + setupTestFile(t, dataFilename) + + storage, err := newKVStorage(dataFilename) + require.NoError(t, err) + + // acquire the original data + originalData := storage.getAll() + + err = storage.add(tc.key, tc.val) + if tc.expect.expectError { + require.Error(t, err) + } else { + require.NoError(t, err) + } + if err != nil { + return + } + + modifiedData := storage.getAll() + + // resave the original data back to file + err = file.SaveJSON(storage.fn, originalData, 0600) + require.NoError(t, err) + + require.Equal(t, tc.expect.newData, modifiedData) + }) + } +} + +func TestKVStorageRemove(t *testing.T) { + type expect struct { + newData map[string]string + expectError bool + err error + } + + tt := []struct { + name string + key string + expect expect + }{ + { + name: "no such key", + key: "no key", + expect: expect{ + newData: map[string]string{ + "test1": "some value", + "test2": "{\"key\":\"val\",\"key2\":2}", + }, + expectError: true, + err: ErrNoSuchKey, + }, + }, + { + name: "removed", + key: "test1", + expect: expect{ + newData: map[string]string{ + "test2": "{\"key\":\"val\",\"key2\":2}", + }, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + tmpDir, cleanup := setupTmpDir(t) + defer cleanup() + + dataFilename := filepath.Join(tmpDir, testDataFilename) + setupTestFile(t, dataFilename) + + storage, err := newKVStorage(dataFilename) + require.NoError(t, err) + + // acquire the original data + originalData := storage.getAll() + + err = storage.remove(tc.key) + if tc.expect.expectError { + require.Equal(t, tc.expect.err, err) + } else { + require.NoError(t, err) + } + if err != nil { + return + } + + newData := storage.getAll() + + // resave the original data back to file + err = file.SaveJSON(storage.fn, originalData, 0600) + require.NoError(t, err) + + require.Equal(t, tc.expect.newData, newData) + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/manager.go b/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/manager.go new file mode 100644 index 00000000..f673259a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/manager.go @@ -0,0 +1,252 @@ +package kvstorage + +import ( + "errors" + "fmt" + "os" + "path/filepath" + "strings" + "sync" + + "github.com/SkycoinProject/skycoin/src/util/file" + "github.com/SkycoinProject/skycoin/src/util/logging" +) + +// Type is a type of a key-value storage +type Type string + +const ( + // TypeTxIDNotes is a type of storage containing transaction notes + TypeTxIDNotes Type = "txid" + // TypeGeneral is a type of storage for general user data + TypeGeneral Type = "client" +) + +const storageFileExtension = ".json" + +var ( + // ErrStorageAPIDisabled is returned while trying to do storage actions while + // the EnableStorageAPI option is false + ErrStorageAPIDisabled = NewError(errors.New("Storage API is disabled")) + // ErrNoSuchStorage is returned if no storage with the specified storage type loaded + ErrNoSuchStorage = NewError(errors.New("Storage with such type is not loaded")) + // ErrStorageAlreadyLoaded is returned while trying to load already loaded storage + ErrStorageAlreadyLoaded = NewError(errors.New("Storage with such type is already loaded")) + // ErrUnknownKVStorageType is returned while trying to access the storage of the unknown type + ErrUnknownKVStorageType = NewError(errors.New("Unknown storage type")) + + logger = logging.MustGetLogger("kvstorage") +) + +// Manager is a manager for key-value storage instances +type Manager struct { + config Config + storages map[Type]*kvStorage + sync.Mutex +} + +// NewManager constructs new manager according to the config +func NewManager(c Config) (*Manager, error) { + logger.Info("Creating new KVStorage manager") + + m := &Manager{ + config: c, + storages: make(map[Type]*kvStorage), + } + + if !strings.HasSuffix(m.config.StorageDir, "/") { + m.config.StorageDir += "/" + } + + if !m.config.EnableStorageAPI { + logger.Info("KVStorage is disabled") + return m, nil + } + + if err := os.MkdirAll(m.config.StorageDir, os.FileMode(0700)); err != nil { + return nil, fmt.Errorf("failed to create kvstorage directory %s: %v", m.config.StorageDir, err) + } + + for _, t := range m.config.EnabledStorages { + if err := m.LoadStorage(t); err != nil { + return nil, err + } + } + + return m, nil +} + +// LoadStorage loads a new storage instance for the `storageType` +// into the manager. Returns `ErrStorageAlreadyLoaded`, `ErrStorageAPIDisabled`, +// `ErrUnknownKVStorageType` +func (m *Manager) LoadStorage(storageType Type) error { + if !isStorageTypeValid(storageType) { + return ErrUnknownKVStorageType + } + + m.Lock() + defer m.Unlock() + + if !m.config.EnableStorageAPI { + return ErrStorageAPIDisabled + } + + if m.storageExists(storageType) { + return ErrStorageAlreadyLoaded + } + + fn := m.getStorageFilePath(storageType) + + exists, err := file.Exists(fn) + if err != nil { + return fmt.Errorf("Manager.LoadStorage file.Exists failed: %v", err) + } + if !exists { + if err := initEmptyStorage(fn); err != nil { + return fmt.Errorf("Manager.LoadStorage initEmptyStorage failed: %v", err) + } + } + + storage, err := newKVStorage(fn) + if err != nil { + return err + } + + m.storages[storageType] = storage + + return nil +} + +// UnloadStorage unloads the storage instance for the given `storageType` from the manager. +// Returns `ErrNoSuchStorage`, `ErrStorageAPIDisabled`, `ErrUnknownKVStorageType` +func (m *Manager) UnloadStorage(storageType Type) error { + if !isStorageTypeValid(storageType) { + return ErrUnknownKVStorageType + } + + m.Lock() + defer m.Unlock() + + if !m.config.EnableStorageAPI { + return ErrStorageAPIDisabled + } + + if !m.storageExists(storageType) { + return ErrNoSuchStorage + } + + delete(m.storages, storageType) + + return nil +} + +// GetStorageValue gets the value associated with the `key` from the storage of `storageType. +// Returns `ErrNoSuchStorage`, `ErrStorageAPIDisabled`, `ErrUnknownKVStorageType` +func (m *Manager) GetStorageValue(storageType Type, key string) (string, error) { + if !isStorageTypeValid(storageType) { + return "", ErrUnknownKVStorageType + } + + m.Lock() + defer m.Unlock() + + if !m.config.EnableStorageAPI { + return "", ErrStorageAPIDisabled + } + + if !m.storageExists(storageType) { + return "", ErrNoSuchStorage + } + + return m.storages[storageType].get(key) +} + +// GetAllStorageValues gets the snapshot of the current contents from storage of `storageType`. +// Returns `ErrNoSuchStorage`, `ErrStorageAPIDisabled`, `ErrUnknownKVStorageType` +func (m *Manager) GetAllStorageValues(storageType Type) (map[string]string, error) { + if !isStorageTypeValid(storageType) { + return nil, ErrUnknownKVStorageType + } + + m.Lock() + defer m.Unlock() + + if !m.config.EnableStorageAPI { + return nil, ErrStorageAPIDisabled + } + + if !m.storageExists(storageType) { + return nil, ErrNoSuchStorage + } + + return m.storages[storageType].getAll(), nil +} + +// AddStorageValue adds the `val` with the associated `key` to the storage of `storageType`. +// Returns `ErrNoSuchStorage`, `ErrStorageAPIDisabled`, `ErrUnknownKVStorageType` +func (m *Manager) AddStorageValue(storageType Type, key, val string) error { + if !isStorageTypeValid(storageType) { + return ErrUnknownKVStorageType + } + + m.Lock() + defer m.Unlock() + + if !m.config.EnableStorageAPI { + return ErrStorageAPIDisabled + } + + if !m.storageExists(storageType) { + return ErrNoSuchStorage + } + + return m.storages[storageType].add(key, val) +} + +// RemoveStorageValue removes the value with the associated `key` from the storage of `storageType`. +// Returns `ErrNoSuchStorage`, `ErrStorageAPIDisabled`, `ErrUnknownKVStorageType` +func (m *Manager) RemoveStorageValue(storageType Type, key string) error { + if !isStorageTypeValid(storageType) { + return ErrUnknownKVStorageType + } + + m.Lock() + defer m.Unlock() + + if !m.config.EnableStorageAPI { + return ErrStorageAPIDisabled + } + + if !m.storageExists(storageType) { + return ErrNoSuchStorage + } + + return m.storages[storageType].remove(key) +} + +// storageExists checks whether the storage of `storageType` exists in the manager +func (m *Manager) storageExists(storageType Type) bool { + _, ok := m.storages[storageType] + + return ok +} + +// getStorageFilePath creates the path to the storage of `storageType` in file system +func (m *Manager) getStorageFilePath(storageType Type) string { + return filepath.Join(m.config.StorageDir, fmt.Sprintf("%s%s", storageType, storageFileExtension)) +} + +// isStorageTypeValid validates the given `storageType` against the predefined available types +func isStorageTypeValid(storageType Type) bool { + switch storageType { + case TypeTxIDNotes, TypeGeneral: + return true + } + + return false +} + +// initEmptyStorage creates a file to persist data +func initEmptyStorage(fn string) error { + return file.SaveJSON(fn, map[string]string{}, 0600) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/manager_config.go b/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/manager_config.go new file mode 100644 index 00000000..82c68a9f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/manager_config.go @@ -0,0 +1,15 @@ +package kvstorage + +// Config is a configuration for storage manager +type Config struct { + StorageDir string + EnabledStorages []Type + EnableStorageAPI bool +} + +// NewConfig creates a default config. +func NewConfig() Config { + return Config{ + StorageDir: "./data/", + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/manager_test.go b/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/manager_test.go new file mode 100644 index 00000000..dc0f5bc1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/manager_test.go @@ -0,0 +1,574 @@ +package kvstorage + +import ( + "fmt" + "path/filepath" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/util/file" +) + +func TestLoadStorage(t *testing.T) { + type expect struct { + expectError bool + err error + } + + tt := []struct { + name string + manager *Manager + storageType Type + expect expect + }{ + { + name: "API disabled", + manager: &Manager{ + storages: make(map[Type]*kvStorage), + }, + storageType: TypeTxIDNotes, + expect: expect{ + expectError: true, + err: ErrStorageAPIDisabled, + }, + }, + { + name: "unknown storage type", + manager: &Manager{ + config: Config{ + EnableStorageAPI: true, + }, + storages: make(map[Type]*kvStorage), + }, + storageType: "unknown", + expect: expect{ + expectError: true, + err: ErrUnknownKVStorageType, + }, + }, + { + name: "storage already loaded", + manager: &Manager{ + config: Config{ + EnableStorageAPI: true, + }, + storages: map[Type]*kvStorage{ + TypeTxIDNotes: nil, + }, + }, + storageType: TypeTxIDNotes, + expect: expect{ + expectError: true, + err: ErrStorageAlreadyLoaded, + }, + }, + { + name: "OK", + manager: &Manager{ + config: Config{ + EnableStorageAPI: true, + }, + storages: make(map[Type]*kvStorage), + }, + storageType: TypeTxIDNotes, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + tmpDir, cleanup := setupTmpDir(t) + defer cleanup() + + tc.manager.config.StorageDir = tmpDir + + err := tc.manager.LoadStorage(tc.storageType) + if tc.expect.expectError { + require.Equal(t, tc.expect.err, err) + } else { + require.NoError(t, err) + } + if err != nil { + return + } + + testutil.RequireFileExists(t, tc.manager.getStorageFilePath(tc.storageType)) + }) + } +} + +func TestUnloadStorage(t *testing.T) { + type expect struct { + expectError bool + err error + } + + tt := []struct { + name string + manager *Manager + storageType Type + expect expect + }{ + { + name: "API disabled", + manager: &Manager{}, + storageType: TypeGeneral, + expect: expect{ + expectError: true, + err: ErrStorageAPIDisabled, + }, + }, + { + name: "unknown storage type", + manager: &Manager{ + config: Config{ + EnableStorageAPI: true, + }, + storages: make(map[Type]*kvStorage), + }, + storageType: "unknown", + expect: expect{ + expectError: true, + err: ErrUnknownKVStorageType, + }, + }, + { + name: "no such storage", + manager: &Manager{ + config: Config{ + EnableStorageAPI: true, + }, + storages: make(map[Type]*kvStorage), + }, + storageType: TypeGeneral, + expect: expect{ + expectError: true, + err: ErrNoSuchStorage, + }, + }, + { + name: "OK", + manager: &Manager{ + config: Config{ + EnableStorageAPI: true, + }, + storages: map[Type]*kvStorage{ + TypeTxIDNotes: nil, + }, + }, + storageType: TypeTxIDNotes, + }, + } + + tmpDir, cleanup := setupTmpDir(t) + defer cleanup() + + // init file for tests + manager := &Manager{ + config: Config{ + StorageDir: tmpDir, + EnableStorageAPI: true, + }, + storages: make(map[Type]*kvStorage), + } + err := manager.LoadStorage(TypeTxIDNotes) + require.NoError(t, err) + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + tc.manager.config.StorageDir = tmpDir + err := tc.manager.UnloadStorage(tc.storageType) + if tc.expect.expectError { + require.Equal(t, tc.expect.err, err) + } else { + require.NoError(t, err) + } + if err != nil { + return + } + + testutil.RequireFileExists(t, tc.manager.getStorageFilePath(tc.storageType)) + }) + } +} + +func TestManagerGetStorageValue(t *testing.T) { + type expect struct { + val string + err error + } + + tt := []struct { + name string + enableAPI bool + storageDataDir string + loadStorage bool + storageTypeToLoad Type + storageType Type + key string + expect expect + }{ + { + name: "API disabled", + storageDataDir: "./testdata/", + storageType: TypeTxIDNotes, + key: "key", + expect: expect{ + err: ErrStorageAPIDisabled, + }, + }, + { + name: "unknown storage type", + enableAPI: true, + storageDataDir: "./testdata/", + storageType: "unknown", + expect: expect{ + err: ErrUnknownKVStorageType, + }, + }, + { + name: "no such storage", + enableAPI: true, + storageDataDir: "./testdata/", + storageType: TypeTxIDNotes, + expect: expect{ + err: ErrNoSuchStorage, + }, + }, + { + name: "no such key", + enableAPI: true, + storageDataDir: "./testdata/", + loadStorage: true, + storageTypeToLoad: TypeTxIDNotes, + storageType: TypeTxIDNotes, + key: "unknown", + expect: expect{ + err: ErrNoSuchKey, + }, + }, + { + name: "OK - simple string", + enableAPI: true, + storageDataDir: "./testdata/", + loadStorage: true, + storageTypeToLoad: TypeTxIDNotes, + storageType: TypeTxIDNotes, + key: "test1", + expect: expect{ + val: "some value", + }, + }, + { + name: "OK - complex marshaled data", + enableAPI: true, + storageDataDir: "./testdata/", + loadStorage: true, + storageTypeToLoad: TypeTxIDNotes, + storageType: TypeTxIDNotes, + key: "test2", + expect: expect{ + val: "{\"key\":\"val\",\"key2\":2}", + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + c := NewConfig() + c.EnableStorageAPI = tc.enableAPI + c.StorageDir = "./testdata/" + m, err := NewManager(c) + require.NoError(t, err) + + if tc.loadStorage { + err := m.LoadStorage(tc.storageTypeToLoad) + require.NoError(t, err) + } + + val, err := m.GetStorageValue(tc.storageType, tc.key) + require.Equal(t, tc.expect.err, err) + if err != nil { + return + } + + require.Equal(t, tc.expect.val, val) + }) + } +} + +func TestManagerGetAllStorageValues(t *testing.T) { + type expect struct { + data map[string]string + err error + } + + tt := []struct { + name string + storageDataDir string + enableAPI bool + loadStorage bool + storageTypeToLoad Type + storageType Type + expect expect + }{ + { + name: "API disabled", + storageDataDir: "./testdata/", + storageType: TypeTxIDNotes, + expect: expect{ + err: ErrStorageAPIDisabled, + }, + }, + { + name: "unknown storage type", + enableAPI: true, + storageDataDir: "./testdata/", + storageType: "unknown", + expect: expect{ + err: ErrUnknownKVStorageType, + }, + }, + { + name: "no such storage", + enableAPI: true, + storageDataDir: "./testdata/", + storageType: TypeTxIDNotes, + expect: expect{ + err: ErrNoSuchStorage, + }, + }, + { + name: "OK", + enableAPI: true, + storageDataDir: "./testdata/", + loadStorage: true, + storageTypeToLoad: TypeTxIDNotes, + storageType: TypeTxIDNotes, + expect: expect{ + data: map[string]string{ + "test1": "some value", + "test2": "{\"key\":\"val\",\"key2\":2}", + }, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + c := NewConfig() + c.EnableStorageAPI = tc.enableAPI + c.StorageDir = "./testdata/" + m, err := NewManager(c) + require.NoError(t, err) + + if tc.loadStorage { + err := m.LoadStorage(tc.storageTypeToLoad) + require.NoError(t, err) + } + + data, err := m.GetAllStorageValues(tc.storageType) + require.Equal(t, tc.expect.err, err) + if err != nil { + return + } + + require.Equal(t, tc.expect.data, data) + }) + } +} + +func TestManagerAddStorageValue(t *testing.T) { + type expect struct { + expectErr bool + err error + } + + tt := []struct { + name string + enableAPI bool + loadStorage bool + storageTypeToLoad Type + storageType Type + key string + val string + expect expect + }{ + { + name: "API disabled", + storageType: TypeTxIDNotes, + key: "key", + val: "val", + expect: expect{ + expectErr: true, + err: ErrStorageAPIDisabled, + }, + }, + { + name: "unknown storage type", + enableAPI: true, + storageType: "unknown", + key: "key", + val: "val", + expect: expect{ + expectErr: true, + err: ErrUnknownKVStorageType, + }, + }, + { + name: "no such storage", + enableAPI: true, + storageType: TypeTxIDNotes, + key: "key", + val: "val", + expect: expect{ + expectErr: true, + err: ErrNoSuchStorage, + }, + }, + { + name: "add new value", + enableAPI: true, + loadStorage: true, + storageTypeToLoad: TypeTxIDNotes, + storageType: TypeTxIDNotes, + key: "key", + val: "val", + }, + { + name: "replace old value", + enableAPI: true, + loadStorage: true, + storageTypeToLoad: TypeTxIDNotes, + storageType: TypeTxIDNotes, + key: "test1", + val: "oiuy", + }, + } + + tmpDir, cleanup := setupTmpDir(t) + defer cleanup() + + setupTestFile(t, filepath.Join(tmpDir, fmt.Sprintf("%s%s", TypeTxIDNotes, storageFileExtension))) + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + m, err := NewManager(NewConfig()) + require.NoError(t, err) + m.config.EnableStorageAPI = tc.enableAPI + m.config.StorageDir = tmpDir + + if tc.loadStorage { + err := m.LoadStorage(tc.storageTypeToLoad) + require.NoError(t, err) + } + + err = m.AddStorageValue(tc.storageType, tc.key, tc.val) + if tc.expect.expectErr { + require.Equal(t, tc.expect.err, err) + } else { + require.NoError(t, err) + } + }) + } +} + +func TestManagerRemoveStorageValue(t *testing.T) { + type expect struct { + expectErr bool + err error + } + + tt := []struct { + name string + enableAPI bool + loadStorage bool + storageTypeToLoad Type + storageType Type + key string + expect expect + }{ + { + name: "API disabled", + storageType: TypeTxIDNotes, + key: "key", + expect: expect{ + expectErr: true, + err: ErrStorageAPIDisabled, + }, + }, + { + name: "unknown storage type", + enableAPI: true, + storageType: "unknown", + key: "key", + expect: expect{ + expectErr: true, + err: ErrUnknownKVStorageType, + }, + }, + { + name: "no such storage", + enableAPI: true, + storageType: TypeTxIDNotes, + key: "key", + expect: expect{ + expectErr: true, + err: ErrNoSuchStorage, + }, + }, + { + name: "no such key", + enableAPI: true, + loadStorage: true, + storageTypeToLoad: TypeTxIDNotes, + storageType: TypeTxIDNotes, + key: "key", + expect: expect{ + expectErr: true, + err: ErrNoSuchKey, + }, + }, + { + name: "OK", + enableAPI: true, + loadStorage: true, + storageTypeToLoad: TypeTxIDNotes, + storageType: TypeTxIDNotes, + key: "test1", + }, + } + + tmpDir, cleanup := setupTmpDir(t) + defer cleanup() + + // Copy the testdata/txid.json file to a tmp dir, so it can be operated on + filename := fmt.Sprintf("%s%s", TypeTxIDNotes, storageFileExtension) + srcFilename := filepath.Join("./testdata/", filename) + dstFilename := filepath.Join(tmpDir, filename) + err := file.Copy(dstFilename, srcFilename) + require.NoError(t, err) + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + c := NewConfig() + c.EnableStorageAPI = tc.enableAPI + c.StorageDir = tmpDir + m, err := NewManager(c) + require.NoError(t, err) + + if tc.loadStorage { + err := m.LoadStorage(tc.storageTypeToLoad) + require.NoError(t, err) + } + + err = m.RemoveStorageValue(tc.storageType, tc.key) + if tc.expect.expectErr { + require.Equal(t, tc.expect.err, err) + } else { + require.NoError(t, err) + } + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/map.go b/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/map.go new file mode 100644 index 00000000..3df52771 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/map.go @@ -0,0 +1,12 @@ +package kvstorage + +// Copy copies the map contents to the new map +func copyMap(data map[string]string) map[string]string { + copied := make(map[string]string, len(data)) + + for k, v := range data { + copied[k] = v + } + + return copied +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/testdata/data.json b/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/testdata/data.json new file mode 100644 index 00000000..e57c0482 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/testdata/data.json @@ -0,0 +1,4 @@ +{ + "test1": "some value", + "test2": "{\"key\":\"val\",\"key2\":2}" +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/testdata/empty.json b/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/testdata/empty.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/testdata/empty.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/testdata/txid.json b/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/testdata/txid.json new file mode 100644 index 00000000..e57c0482 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/kvstorage/testdata/txid.json @@ -0,0 +1,4 @@ +{ + "test1": "some value", + "test2": "{\"key\":\"val\",\"key2\":2}" +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/params/distribution.go b/vendor/github.com/SkycoinProject/skycoin/src/params/distribution.go new file mode 100644 index 00000000..b1fe2d1c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/params/distribution.go @@ -0,0 +1,153 @@ +package params + +import ( + "errors" + + "github.com/SkycoinProject/skycoin/src/cipher" +) + +// Distribution parameters define the initial coin distribution and unlocking schedule +type Distribution struct { + // MaxCoinSupply is the maximum supply of coins + MaxCoinSupply uint64 + // InitialUnlockedCount is the initial number of unlocked addresses + InitialUnlockedCount uint64 + // UnlockAddressRate is the number of addresses to unlock per unlock time interval + UnlockAddressRate uint64 + // UnlockTimeInterval is the distribution address unlock time interval, measured in seconds + // Once the InitialUnlockedCount is exhausted, + // UnlockAddressRate addresses will be unlocked per UnlockTimeInterval + UnlockTimeInterval uint64 + + // Addresses are the distribution addresses that received coins in the + // first block after the genesis block + Addresses []string + addressesDecoded []cipher.Address +} + +// MustValidate validates Distribution parameters, panics on error +func (d *Distribution) MustValidate() { + if err := d.Validate(); err != nil { + panic(err) + } +} + +// Validate validates Distribution parameters +func (d *Distribution) Validate() error { + if d.InitialUnlockedCount > uint64(len(d.Addresses)) { + return errors.New("unlocked addresses > total distribution addresses") + } + + if d.MaxCoinSupply%uint64(len(d.Addresses)) != 0 { + return errors.New("MaxCoinSupply should be perfectly divisible by len(addresses)") + } + + if err := d.decodeAddresses(); err != nil { + return err + } + + return nil +} + +// AddressInitialBalance is the initial balance of each distribution address +func (d *Distribution) AddressInitialBalance() uint64 { + return d.MaxCoinSupply / uint64(len(d.Addresses)) +} + +// UnlockedAddresses returns distribution addresses that are unlocked, i.e. they have spendable outputs +func (d *Distribution) UnlockedAddresses() []string { + // The first InitialUnlockedCount (25) addresses are unlocked by default. + // Subsequent addresses will be unlocked at a rate of UnlockAddressRate (5) per year, + // after the InitialUnlockedCount (25) addresses have no remaining balance. + // The unlock timer will be enabled manually once the + // InitialUnlockedCount (25) addresses are distributed. + + // NOTE: To have automatic unlocking, transaction verification would have + // to be handled in visor rather than in coin.Transactions.Visor(), because + // the coin package is agnostic to the state of the blockchain and cannot reference it. + // Instead of automatic unlocking, we can hardcode the timestamp at which the first 30% + // is distributed, then compute the unlocked addresses easily here. + + addrs := make([]string, d.InitialUnlockedCount) + copy(addrs[:], d.Addresses[:d.InitialUnlockedCount]) + return addrs +} + +// LockedAddresses returns distribution addresses that are locked, i.e. they have unspendable outputs +func (d *Distribution) LockedAddresses() []string { + // TODO -- once we reach 30% distribution, we can hardcode the + // initial timestamp for releasing more coins + addrs := make([]string, d.numLocked()) + copy(addrs, d.Addresses[d.InitialUnlockedCount:]) + return addrs +} + +// AddressesDecoded returns a copy of the hardcoded distribution addresses array. +// Each address has 1,000,000 coins. There are 100 addresses. +func (d *Distribution) AddressesDecoded() []cipher.Address { + d.mustDecodeAddresses() + addrs := make([]cipher.Address, len(d.addressesDecoded)) + copy(addrs, d.addressesDecoded) + return addrs +} + +// UnlockedAddressesDecoded returns distribution addresses that are unlocked, i.e. they have spendable outputs +func (d *Distribution) UnlockedAddressesDecoded() []cipher.Address { + // The first d.InitialUnlockedCount (25) addresses are unlocked by default. + // Subsequent addresses will be unlocked at a rate of UnlockAddressRate (5) per year, + // after the d.InitialUnlockedCount (25) addresses have no remaining balance. + // The unlock timer will be enabled manually once the + // d.InitialUnlockedCount (25) addresses are distributed. + + // NOTE: To have automatic unlocking, transaction verification would have + // to be handled in visor rather than in coin.Transactions.Visor(), because + // the coin package is agnostic to the state of the blockchain and cannot reference it. + // Instead of automatic unlocking, we can hardcode the timestamp at which the first 30% + // is distributed, then compute the unlocked addresses easily here. + d.mustDecodeAddresses() + addrs := make([]cipher.Address, d.InitialUnlockedCount) + copy(addrs[:], d.addressesDecoded[:d.InitialUnlockedCount]) + return addrs +} + +// LockedAddressesDecoded returns distribution addresses that are locked, i.e. they have unspendable outputs +func (d *Distribution) LockedAddressesDecoded() []cipher.Address { + // TODO -- once we reach 30% distribution, we can hardcode the + // initial timestamp for releasing more coins + d.mustDecodeAddresses() + addrs := make([]cipher.Address, d.numLocked()) + copy(addrs, d.addressesDecoded[d.InitialUnlockedCount:]) + return addrs +} + +func (d *Distribution) numLocked() uint64 { + n := uint64(len(d.Addresses)) + if n < d.InitialUnlockedCount { + panic("number of distribution addresses is less than InitialUnlockedCount") + } + return n - d.InitialUnlockedCount +} + +func (d *Distribution) decodeAddresses() error { + if len(d.addressesDecoded) == len(d.Addresses) { + return nil + } + + decodedAddrs := make([]cipher.Address, len(d.Addresses)) + for i, a := range d.Addresses { + var err error + decodedAddrs[i], err = cipher.DecodeBase58Address(a) + if err != nil { + return err + } + } + + d.addressesDecoded = decodedAddrs + return nil +} + +func (d *Distribution) mustDecodeAddresses() { + if err := d.decodeAddresses(); err != nil { + panic(err) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/params/distribution_test.go b/vendor/github.com/SkycoinProject/skycoin/src/params/distribution_test.go new file mode 100644 index 00000000..129f241f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/params/distribution_test.go @@ -0,0 +1,56 @@ +package params + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestDistributionAddressArrays(t *testing.T) { + require.Len(t, MainNetDistribution.Addresses, 100) + + // At the time of this writing, there should be 25 addresses in the + // unlocked pool and 75 in the locked pool. + require.Len(t, MainNetDistribution.UnlockedAddresses(), 25) + require.Len(t, MainNetDistribution.LockedAddresses(), 75) + + addrsMap := make(map[string]struct{}) + for _, a := range MainNetDistribution.Addresses { + // Check no duplicate address in distribution addresses + _, ok := addrsMap[a] + require.False(t, ok) + addrsMap[a] = struct{}{} + } + + unlocked := MainNetDistribution.UnlockedAddresses() + unlockedMap := make(map[string]struct{}) + for _, a := range unlocked { + // Check no duplicate address in unlocked addresses + _, ok := unlockedMap[a] + require.False(t, ok) + + // Check unlocked address in set of all addresses + _, ok = addrsMap[a] + require.True(t, ok) + + unlockedMap[a] = struct{}{} + } + + locked := MainNetDistribution.LockedAddresses() + lockedMap := make(map[string]struct{}) + for _, a := range locked { + // Check no duplicate address in locked addresses + _, ok := lockedMap[a] + require.False(t, ok) + + // Check locked address in set of all addresses + _, ok = addrsMap[a] + require.True(t, ok) + + // Check locked address not in unlocked addresses + _, ok = unlockedMap[a] + require.False(t, ok) + + lockedMap[a] = struct{}{} + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/params/droplet.go b/vendor/github.com/SkycoinProject/skycoin/src/params/droplet.go new file mode 100644 index 00000000..fb0c57aa --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/params/droplet.go @@ -0,0 +1,34 @@ +package params + +import ( + "errors" + + "github.com/SkycoinProject/skycoin/src/util/droplet" +) + +var ( + // ErrInvalidDecimals is returned by DropletPrecisionCheck if a coin amount has an invalid number of decimal places + ErrInvalidDecimals = errors.New("invalid amount, too many decimal places") +) + +// DropletPrecisionToDivisor converts number of allowed decimal places to the modulus divisor used when checking droplet precision rules +func DropletPrecisionToDivisor(precision uint8) uint64 { + if precision > droplet.Exponent { + panic("precision must be <= droplet.Exponent") + } + + n := droplet.Exponent - precision + var i uint64 = 1 + for k := uint8(0); k < n; k++ { + i = i * 10 + } + return i +} + +// DropletPrecisionCheck checks if an amount of coins is valid given decimal place restrictions +func DropletPrecisionCheck(precision uint8, amount uint64) error { + if amount%DropletPrecisionToDivisor(precision) != 0 { + return ErrInvalidDecimals + } + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/params/droplet_test.go b/vendor/github.com/SkycoinProject/skycoin/src/params/droplet_test.go new file mode 100644 index 00000000..80ef82a6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/params/droplet_test.go @@ -0,0 +1,37 @@ +package params + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/require" + + _require "github.com/SkycoinProject/skycoin/src/testutil/require" +) + +func TestDropletPrecisionToDivisor(t *testing.T) { + cases := []struct { + precision uint8 + divisor uint64 + }{ + {0, 1e6}, + {1, 1e5}, + {2, 1e4}, + {3, 1e3}, + {4, 1e2}, + {5, 1e1}, + {6, 1}, + } + + for _, tc := range cases { + name := fmt.Sprintf("DropletPrecisionToDivisor(%d)=%d", tc.precision, tc.divisor) + t.Run(name, func(t *testing.T) { + divisor := DropletPrecisionToDivisor(tc.precision) + require.Equal(t, tc.divisor, divisor, "%d != %d", tc.divisor, divisor) + }) + } + + _require.PanicsWithLogMessage(t, "precision must be <= droplet.Exponent", func() { + DropletPrecisionToDivisor(7) + }) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/params/init.go b/vendor/github.com/SkycoinProject/skycoin/src/params/init.go new file mode 100644 index 00000000..a6a64229 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/params/init.go @@ -0,0 +1,78 @@ +package params + +import ( + "fmt" + "os" + "strconv" + + "github.com/SkycoinProject/skycoin/src/util/droplet" +) + +func init() { + loadUserBurnFactor() + loadUserMaxTransactionSize() + loadUserMaxDecimals() + sanityCheck() +} + +func sanityCheck() { + if err := UserVerifyTxn.Validate(); err != nil { + panic(err) + } + + MainNetDistribution.MustValidate() +} + +func loadUserBurnFactor() { + xs := os.Getenv("USER_BURN_FACTOR") + if xs == "" { + return + } + + x, err := strconv.ParseUint(xs, 10, 32) + if err != nil { + panic(fmt.Sprintf("Invalid USER_BURN_FACTOR %q: %v", xs, err)) + } + + if x < uint64(MinBurnFactor) { + panic(fmt.Sprintf("USER_BURN_FACTOR must be >= %d", MinBurnFactor)) + } + + UserVerifyTxn.BurnFactor = uint32(x) +} + +func loadUserMaxTransactionSize() { + xs := os.Getenv("USER_MAX_TXN_SIZE") + if xs == "" { + return + } + + x, err := strconv.ParseUint(xs, 10, 32) + if err != nil { + panic(fmt.Sprintf("Invalid USER_MAX_TXN_SIZE %q: %v", xs, err)) + } + + if x < uint64(MinTransactionSize) { + panic(fmt.Sprintf("USER_MAX_TXN_SIZE must be >= %d", MinTransactionSize)) + } + + UserVerifyTxn.MaxTransactionSize = uint32(x) +} + +func loadUserMaxDecimals() { + xs := os.Getenv("USER_MAX_DECIMALS") + if xs == "" { + return + } + + x, err := strconv.ParseUint(xs, 10, 8) + if err != nil { + panic(fmt.Sprintf("Invalid USER_MAX_DECIMALS %q: %v", xs, err)) + } + + if x > uint64(droplet.Exponent) { + panic(fmt.Sprintf("USER_MAX_DECIMALS must be <= %d", droplet.Exponent)) + } + + UserVerifyTxn.MaxDropletPrecision = uint8(x) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/params/params.go b/vendor/github.com/SkycoinProject/skycoin/src/params/params.go new file mode 100644 index 00000000..7ae26c12 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/params/params.go @@ -0,0 +1,128 @@ +package params + +/* +CODE GENERATED AUTOMATICALLY WITH FIBER COIN CREATOR +AVOID EDITING THIS MANUALLY +*/ + +var ( + // MainNetDistribution Skycoin mainnet coin distribution parameters + MainNetDistribution = Distribution{ + MaxCoinSupply: 100000000, + InitialUnlockedCount: 25, + UnlockAddressRate: 5, + UnlockTimeInterval: 31536000, + Addresses: []string{ + "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + }, + } + + // UserVerifyTxn transaction verification parameters for user-created transactions + UserVerifyTxn = VerifyTxn{ + // BurnFactor can be overriden with `USER_BURN_FACTOR` env var + BurnFactor: 10, + // MaxTransactionSize can be overriden with `USER_MAX_TXN_SIZE` env var + MaxTransactionSize: 32768, // in bytes + // MaxDropletPrecision can be overriden with `USER_MAX_DECIMALS` env var + MaxDropletPrecision: 3, + } +) diff --git a/vendor/github.com/SkycoinProject/skycoin/src/params/verify_txn.go b/vendor/github.com/SkycoinProject/skycoin/src/params/verify_txn.go new file mode 100644 index 00000000..0296c1f0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/params/verify_txn.go @@ -0,0 +1,55 @@ +package params + +import ( + "errors" + + "github.com/SkycoinProject/skycoin/src/util/droplet" +) + +const ( + // MinBurnFactor minimum value for BurnFactor + MinBurnFactor uint32 = 2 + // MinTransactionSize minimum value for MaxTransactionSize + MinTransactionSize uint32 = 1024 +) + +var ( + // ErrInvalidBurnFactor BurnFactor value is out of range + ErrInvalidBurnFactor = errors.New("BurnFactor value is out of range") + // ErrInvalidMaxTransactionSize MaxTransactionSize value is out of range + ErrInvalidMaxTransactionSize = errors.New("MaxTransactionSize value is out of range") + // ErrInvalidMaxDropletPrecision MaxDropletPrecision value is out of range + ErrInvalidMaxDropletPrecision = errors.New("MaxDropletPrecision value is out of range") +) + +// VerifyTxn are parameters for verifying a transaction +type VerifyTxn struct { + // BurnFactor inverse fraction of coinhours that must be burned + BurnFactor uint32 + // MaxTransactionSize maximum size of a transaction in bytes + MaxTransactionSize uint32 + // MaxDropletPrecision maximum decimal precision of droplets + MaxDropletPrecision uint8 +} + +// MaxDropletDivisor return the modulus divisor used when checking droplet precision rules +func (v VerifyTxn) MaxDropletDivisor() uint64 { + return DropletPrecisionToDivisor(v.MaxDropletPrecision) +} + +// Validate validates the configured parameters +func (v VerifyTxn) Validate() error { + if v.BurnFactor < MinBurnFactor { + return ErrInvalidBurnFactor + } + + if v.MaxTransactionSize < MinTransactionSize { + return ErrInvalidMaxTransactionSize + } + + if v.MaxDropletPrecision > droplet.Exponent { + return ErrInvalidMaxDropletPrecision + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/readable/block.go b/vendor/github.com/SkycoinProject/skycoin/src/readable/block.go new file mode 100644 index 00000000..211d625e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/readable/block.go @@ -0,0 +1,145 @@ +/* +Package readable defines JSON-tagged struct representations of internal binary data structures, +for use by the API and CLI. +*/ +package readable + +import ( + "errors" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" +) + +// BlockHeader represents the readable block header +type BlockHeader struct { + BkSeq uint64 `json:"seq"` + Hash string `json:"block_hash"` + PreviousHash string `json:"previous_block_hash"` + Time uint64 `json:"timestamp"` + Fee uint64 `json:"fee"` + Version uint32 `json:"version"` + BodyHash string `json:"tx_body_hash"` + UxHash string `json:"ux_hash"` +} + +// NewBlockHeader creates a readable block header +func NewBlockHeader(b coin.BlockHeader) BlockHeader { + return BlockHeader{ + BkSeq: b.BkSeq, + Hash: b.Hash().Hex(), + PreviousHash: b.PrevHash.Hex(), + Time: b.Time, + Fee: b.Fee, + Version: b.Version, + BodyHash: b.BodyHash.Hex(), + UxHash: b.UxHash.Hex(), + } +} + +// ToCoinBlockHeader converts BlockHeader back to coin.BlockHeader +func (bh BlockHeader) ToCoinBlockHeader() (coin.BlockHeader, error) { + prevHash, err := cipher.SHA256FromHex(bh.PreviousHash) + if err != nil { + return coin.BlockHeader{}, err + } + + bodyHash, err := cipher.SHA256FromHex(bh.BodyHash) + if err != nil { + return coin.BlockHeader{}, err + } + + uxHash, err := cipher.SHA256FromHex(bh.UxHash) + if err != nil { + return coin.BlockHeader{}, err + } + + headHash, err := cipher.SHA256FromHex(bh.Hash) + if err != nil { + return coin.BlockHeader{}, err + } + + cbh := coin.BlockHeader{ + Version: bh.Version, + Time: bh.Time, + BkSeq: bh.BkSeq, + Fee: bh.Fee, + PrevHash: prevHash, + BodyHash: bodyHash, + UxHash: uxHash, + } + + if cbh.Hash() != headHash { + return coin.BlockHeader{}, errors.New("readable.BlockHeader.Hash != recovered coin.BlockHeader.Hash()") + } + + return cbh, nil +} + +// BlockBody represents a readable block body +type BlockBody struct { + Transactions []Transaction `json:"txns"` +} + +// NewBlockBody creates a readable block body +func NewBlockBody(b coin.Block) (*BlockBody, error) { + txns := make([]Transaction, len(b.Body.Transactions)) + isGenesis := b.Head.BkSeq == 0 + for i := range b.Body.Transactions { + txn, err := NewTransaction(b.Body.Transactions[i], isGenesis) + if err != nil { + return nil, err + } + txns[i] = *txn + } + + return &BlockBody{ + Transactions: txns, + }, nil +} + +// Block represents a readable block +type Block struct { + Head BlockHeader `json:"header"` + Body BlockBody `json:"body"` + Size uint32 `json:"size"` +} + +// NewBlock creates a readable block +func NewBlock(b coin.Block) (*Block, error) { + body, err := NewBlockBody(b) + if err != nil { + return nil, err + } + + size, err := b.Size() + if err != nil { + return nil, err + } + + return &Block{ + Head: NewBlockHeader(b.Head), + Body: *body, + Size: size, + }, nil +} + +// Blocks an array of readable blocks. +type Blocks struct { + Blocks []Block `json:"blocks"` +} + +// NewBlocks converts []coin.SignedBlock to Blocks +func NewBlocks(blocks []coin.SignedBlock) (*Blocks, error) { + rbs := make([]Block, 0, len(blocks)) + for _, b := range blocks { + rb, err := NewBlock(b.Block) + if err != nil { + return nil, err + } + rbs = append(rbs, *rb) + } + return &Blocks{ + Blocks: rbs, + }, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/readable/blockchain.go b/vendor/github.com/SkycoinProject/skycoin/src/readable/blockchain.go new file mode 100644 index 00000000..cd55ccd9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/readable/blockchain.go @@ -0,0 +1,58 @@ +package readable + +import ( + "github.com/SkycoinProject/skycoin/src/daemon" + "github.com/SkycoinProject/skycoin/src/visor" +) + +// BlockchainMetadata encapsulates useful information from the coin.Blockchain +type BlockchainMetadata struct { + // Most recent block's header + Head BlockHeader `json:"head"` + // Number of unspent outputs in the coin.Blockchain + Unspents uint64 `json:"unspents"` + // Number of known unconfirmed txns + Unconfirmed uint64 `json:"unconfirmed"` +} + +// NewBlockchainMetadata creates blockchain metadata +func NewBlockchainMetadata(bm visor.BlockchainMetadata) BlockchainMetadata { + return BlockchainMetadata{ + Head: NewBlockHeader(bm.HeadBlock.Head), + Unspents: bm.Unspents, + Unconfirmed: bm.Unconfirmed, + } +} + +// BlockchainProgress is the current blockchain syncing status +type BlockchainProgress struct { + // Our current blockchain length + Current uint64 `json:"current"` + // Our best guess at true blockchain length + Highest uint64 `json:"highest"` + // Individual blockchain length reports from peers + Peers []PeerBlockchainHeight `json:"peers"` +} + +// PeerBlockchainHeight is a peer's IP address with their reported blockchain height +type PeerBlockchainHeight struct { + Address string `json:"address"` + Height uint64 `json:"height"` +} + +// NewBlockchainProgress copies daemon.BlockchainProgress to a struct with json tags +func NewBlockchainProgress(bp *daemon.BlockchainProgress) BlockchainProgress { + peers := make([]PeerBlockchainHeight, len(bp.Peers)) + for i, p := range bp.Peers { + peers[i] = PeerBlockchainHeight{ + Address: p.Address, + Height: p.Height, + } + } + + return BlockchainProgress{ + Current: bp.Current, + Highest: bp.Highest, + Peers: peers, + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/readable/fiber.go b/vendor/github.com/SkycoinProject/skycoin/src/readable/fiber.go new file mode 100644 index 00000000..3c5bc921 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/readable/fiber.go @@ -0,0 +1,16 @@ +package readable + +import "github.com/SkycoinProject/skycoin/src/cipher/bip44" + +// FiberConfig is fiber configuration parameters +type FiberConfig struct { + Name string `json:"name"` + DisplayName string `json:"display_name"` + Ticker string `json:"ticker"` + CoinHoursName string `json:"coin_hours_display_name"` + CoinHoursNameSingular string `json:"coin_hours_display_name_singular"` + CoinHoursTicker string `json:"coin_hours_ticker"` + ExplorerURL string `json:"explorer_url"` + VersionURL string `json:"version_url"` + Bip44Coin bip44.CoinType `json:"bip44_coin"` +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/readable/network.go b/vendor/github.com/SkycoinProject/skycoin/src/readable/network.go new file mode 100644 index 00000000..777730b2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/readable/network.go @@ -0,0 +1,73 @@ +package readable + +import ( + "github.com/SkycoinProject/skycoin/src/daemon" + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/util/useragent" +) + +// Connection a connection's state within the daemon +type Connection struct { + GnetID uint64 `json:"id"` + Addr string `json:"address"` + LastSent int64 `json:"last_sent"` + LastReceived int64 `json:"last_received"` + ConnectedAt int64 `json:"connected_at"` + Outgoing bool `json:"outgoing"` + State daemon.ConnectionState `json:"state"` + Mirror uint32 `json:"mirror"` + ListenPort uint16 `json:"listen_port"` + Height uint64 `json:"height"` + UserAgent useragent.Data `json:"user_agent"` + IsTrustedPeer bool `json:"is_trusted_peer"` + UnconfirmedVerifyTxn VerifyTxn `json:"unconfirmed_verify_transaction"` +} + +// NewConnection copies daemon.Connection to a struct with json tags +func NewConnection(c *daemon.Connection) Connection { + var lastSent int64 + var lastReceived int64 + var connectedAt int64 + + if !c.Gnet.LastSent.IsZero() { + lastSent = c.Gnet.LastSent.Unix() + } + if !c.Gnet.LastReceived.IsZero() { + lastReceived = c.Gnet.LastReceived.Unix() + } + if !c.ConnectedAt.IsZero() { + connectedAt = c.ConnectedAt.Unix() + } + + return Connection{ + GnetID: c.Gnet.ID, + Addr: c.Addr, + LastSent: lastSent, + LastReceived: lastReceived, + ConnectedAt: connectedAt, + Outgoing: c.Outgoing, + State: c.State, + Mirror: c.Mirror, + ListenPort: c.ListenPort, + Height: c.Height, + UserAgent: c.UserAgent, + IsTrustedPeer: c.Pex.Trusted, + UnconfirmedVerifyTxn: NewVerifyTxn(c.UnconfirmedVerifyTxn), + } +} + +// VerifyTxn transaction verification parameters +type VerifyTxn struct { + BurnFactor uint32 `json:"burn_factor"` + MaxTransactionSize uint32 `json:"max_transaction_size"` + MaxDropletPrecision uint8 `json:"max_decimals"` +} + +// NewVerifyTxn converts params.VerifyTxn to VerifyTxn +func NewVerifyTxn(p params.VerifyTxn) VerifyTxn { + return VerifyTxn{ + BurnFactor: p.BurnFactor, + MaxTransactionSize: p.MaxTransactionSize, + MaxDropletPrecision: p.MaxDropletPrecision, + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/readable/output.go b/vendor/github.com/SkycoinProject/skycoin/src/readable/output.go new file mode 100644 index 00000000..a06fc0c2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/readable/output.go @@ -0,0 +1,276 @@ +package readable + +import ( + "errors" + "fmt" + "sort" + "strings" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/transaction" + "github.com/SkycoinProject/skycoin/src/util/droplet" + "github.com/SkycoinProject/skycoin/src/util/mathutil" + "github.com/SkycoinProject/skycoin/src/visor" + "github.com/SkycoinProject/skycoin/src/visor/historydb" + "github.com/SkycoinProject/skycoin/src/wallet" +) + +// UnspentOutput represents a readable output +type UnspentOutput struct { + Hash string `json:"hash"` + Time uint64 `json:"time"` + BkSeq uint64 `json:"block_seq"` + SourceTransaction string `json:"src_tx"` + Address string `json:"address"` + Coins string `json:"coins"` + Hours uint64 `json:"hours"` + CalculatedHours uint64 `json:"calculated_hours"` +} + +// NewUnspentOutput creates a readable output +func NewUnspentOutput(uxOut visor.UnspentOutput) (UnspentOutput, error) { + coinStr, err := droplet.ToString(uxOut.Body.Coins) + if err != nil { + return UnspentOutput{}, err + } + + return UnspentOutput{ + Hash: uxOut.Hash().Hex(), + Time: uxOut.Head.Time, + BkSeq: uxOut.Head.BkSeq, + SourceTransaction: uxOut.Body.SrcTransaction.Hex(), + Address: uxOut.Body.Address.String(), + Coins: coinStr, + Hours: uxOut.Body.Hours, + CalculatedHours: uxOut.CalculatedHours, + }, nil +} + +// UnspentOutputs slice of UnspentOutput +type UnspentOutputs []UnspentOutput + +// NewUnspentOutputs converts unspent outputs to a readable output +func NewUnspentOutputs(uxs []visor.UnspentOutput) (UnspentOutputs, error) { + rxReadables := make(UnspentOutputs, len(uxs)) + for i, ux := range uxs { + out, err := NewUnspentOutput(ux) + if err != nil { + return UnspentOutputs{}, err + } + + rxReadables[i] = out + } + + // Sort UnspentOutputs newest to oldest, using hash to break ties + sort.Slice(rxReadables, func(i, j int) bool { + if rxReadables[i].Time == rxReadables[j].Time { + return strings.Compare(rxReadables[i].Hash, rxReadables[j].Hash) < 0 + } + return rxReadables[i].Time > rxReadables[j].Time + }) + + return rxReadables, nil +} + +// Balance returns the balance in droplets +func (ros UnspentOutputs) Balance() (wallet.Balance, error) { + var bal wallet.Balance + for _, out := range ros { + coins, err := droplet.FromString(out.Coins) + if err != nil { + return wallet.Balance{}, err + } + + bal.Coins, err = mathutil.AddUint64(bal.Coins, coins) + if err != nil { + return wallet.Balance{}, err + } + + bal.Hours, err = mathutil.AddUint64(bal.Hours, out.CalculatedHours) + if err != nil { + return wallet.Balance{}, err + } + } + + return bal, nil +} + +// ToUxArray converts UnspentOutputs to coin.UxArray +func (ros UnspentOutputs) ToUxArray() (coin.UxArray, error) { + var uxs coin.UxArray + for _, o := range ros { + coins, err := droplet.FromString(o.Coins) + if err != nil { + return nil, err + } + + addr, err := cipher.DecodeBase58Address(o.Address) + if err != nil { + return nil, err + } + + srcTx, err := cipher.SHA256FromHex(o.SourceTransaction) + if err != nil { + return nil, err + } + + uxs = append(uxs, coin.UxOut{ + Head: coin.UxHead{ + Time: o.Time, + BkSeq: o.BkSeq, + }, + Body: coin.UxBody{ + SrcTransaction: srcTx, + Address: addr, + Coins: coins, + Hours: o.Hours, + }, + }) + } + + return uxs, nil +} + +// OutputsToUxBalances converts UnspentOutputs to []transaction.UxBalance +func OutputsToUxBalances(ros UnspentOutputs) ([]transaction.UxBalance, error) { + uxb := make([]transaction.UxBalance, len(ros)) + for i, ro := range ros { + if ro.Hash == "" { + return nil, errors.New("UnspentOutput missing hash") + } + + hash, err := cipher.SHA256FromHex(ro.Hash) + if err != nil { + return nil, fmt.Errorf("UnspentOutput hash is invalid: %v", err) + } + + coins, err := droplet.FromString(ro.Coins) + if err != nil { + return nil, fmt.Errorf("UnspentOutput coins is invalid: %v", err) + } + + addr, err := cipher.DecodeBase58Address(ro.Address) + if err != nil { + return nil, fmt.Errorf("UnspentOutput address is invalid: %v", err) + } + + srcTx, err := cipher.SHA256FromHex(ro.SourceTransaction) + if err != nil { + return nil, fmt.Errorf("UnspentOutput src_tx is invalid: %v", err) + } + + b := transaction.UxBalance{ + Hash: hash, + Time: ro.Time, + BkSeq: ro.BkSeq, + SrcTransaction: srcTx, + Address: addr, + Coins: coins, + Hours: ro.CalculatedHours, + InitialHours: ro.Hours, + } + + uxb[i] = b + } + + return uxb, nil +} + +// UnspentOutputsSummary records unspent outputs in different status. +type UnspentOutputsSummary struct { + Head BlockHeader `json:"head"` + // HeadOutputs are unspent outputs confirmed in the blockchain + HeadOutputs UnspentOutputs `json:"head_outputs"` + // OutgoingOutputs are unspent outputs being spent in unconfirmed transactions + OutgoingOutputs UnspentOutputs `json:"outgoing_outputs"` + // IncomingOutputs are unspent outputs being created by unconfirmed transactions + IncomingOutputs UnspentOutputs `json:"incoming_outputs"` +} + +// NewUnspentOutputsSummary creates an UnspentOutputsSummary from visor.UnspentOutputsSummary +func NewUnspentOutputsSummary(summary *visor.UnspentOutputsSummary) (*UnspentOutputsSummary, error) { + headOutputs, err := NewUnspentOutputs(summary.Confirmed) + if err != nil { + return nil, err + } + + outgoingOutputs, err := NewUnspentOutputs(summary.Outgoing) + if err != nil { + return nil, err + } + + incomingOutputs, err := NewUnspentOutputs(summary.Incoming) + if err != nil { + return nil, err + } + + return &UnspentOutputsSummary{ + Head: NewBlockHeader(summary.HeadBlock.Head), + HeadOutputs: headOutputs, + OutgoingOutputs: outgoingOutputs, + IncomingOutputs: incomingOutputs, + }, nil +} + +// SpendableOutputs subtracts OutgoingOutputs from HeadOutputs +func (os UnspentOutputsSummary) SpendableOutputs() UnspentOutputs { + if len(os.OutgoingOutputs) == 0 { + return os.HeadOutputs + } + + spending := make(map[string]struct{}, len(os.OutgoingOutputs)) + for _, u := range os.OutgoingOutputs { + spending[u.Hash] = struct{}{} + } + + var outs UnspentOutputs + for i := range os.HeadOutputs { + if _, ok := spending[os.HeadOutputs[i].Hash]; !ok { + outs = append(outs, os.HeadOutputs[i]) + } + } + return outs +} + +// ExpectedOutputs adds IncomingOutputs to SpendableOutputs +func (os UnspentOutputsSummary) ExpectedOutputs() UnspentOutputs { + return append(os.SpendableOutputs(), os.IncomingOutputs...) +} + +// SpentOutput is an unspent output that was spent +type SpentOutput struct { + Uxid string `json:"uxid"` + Time uint64 `json:"time"` + SrcBkSeq uint64 `json:"src_block_seq"` + SrcTx string `json:"src_tx"` + OwnerAddress string `json:"owner_address"` + Coins uint64 `json:"coins"` + Hours uint64 `json:"hours"` + SpentBlockSeq uint64 `json:"spent_block_seq"` // block seq that spent the output. + SpentTxnID string `json:"spent_tx"` // id of tx which spent this output. +} + +// NewSpentOutput creates a SpentOutput from historydb.UxOut +func NewSpentOutput(out *historydb.UxOut) SpentOutput { + return SpentOutput{ + Uxid: out.Hash().Hex(), + Time: out.Out.Head.Time, + SrcBkSeq: out.Out.Head.BkSeq, + SrcTx: out.Out.Body.SrcTransaction.Hex(), + OwnerAddress: out.Out.Body.Address.String(), + Coins: out.Out.Body.Coins, + Hours: out.Out.Body.Hours, + SpentBlockSeq: out.SpentBlockSeq, + SpentTxnID: out.SpentTxnID.Hex(), + } +} + +// NewSpentOutputs creates []SpentOutput from []historydb.UxOut +func NewSpentOutputs(outs []historydb.UxOut) []SpentOutput { + spents := make([]SpentOutput, len(outs)) + for i, o := range outs { + spents[i] = NewSpentOutput(&o) + } + return spents +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/readable/richlist.go b/vendor/github.com/SkycoinProject/skycoin/src/readable/richlist.go new file mode 100644 index 00000000..87aa061b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/readable/richlist.go @@ -0,0 +1,32 @@ +package readable + +import ( + "github.com/SkycoinProject/skycoin/src/util/droplet" + "github.com/SkycoinProject/skycoin/src/visor" +) + +// RichlistBalance holds info an address balance holder +type RichlistBalance struct { + Address string `json:"address"` + Coins string `json:"coins"` + Locked bool `json:"locked"` +} + +// NewRichlistBalances copies from visor.Richlist +func NewRichlistBalances(visorRichlist visor.Richlist) ([]RichlistBalance, error) { + richlist := make([]RichlistBalance, len(visorRichlist)) + for i, v := range visorRichlist { + coins, err := droplet.ToString(v.Coins) + if err != nil { + return nil, err + } + + richlist[i] = RichlistBalance{ + Address: v.Address.String(), + Coins: coins, + Locked: v.Locked, + } + } + + return richlist, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/readable/transaction.go b/vendor/github.com/SkycoinProject/skycoin/src/readable/transaction.go new file mode 100644 index 00000000..29326714 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/readable/transaction.go @@ -0,0 +1,252 @@ +package readable + +import ( + "errors" + "fmt" + "time" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/util/droplet" + "github.com/SkycoinProject/skycoin/src/util/logging" + "github.com/SkycoinProject/skycoin/src/util/timeutil" + "github.com/SkycoinProject/skycoin/src/visor" +) + +var logger = logging.MustGetLogger("readable") + +// TransactionStatus represents the transaction status +type TransactionStatus struct { + Confirmed bool `json:"confirmed"` + Unconfirmed bool `json:"unconfirmed"` + // If confirmed, how many blocks deep in the chain it is. Will be at least 1 if confirmed + Height uint64 `json:"height"` + // If confirmed, the sequence of the block in which the transaction was executed + BlockSeq uint64 `json:"block_seq"` +} + +// NewTransactionStatus creates TransactionStatus from visor.TransactionStatus +func NewTransactionStatus(status visor.TransactionStatus) TransactionStatus { + return TransactionStatus{ + Unconfirmed: !status.Confirmed, + Confirmed: status.Confirmed, + Height: status.Height, + BlockSeq: status.BlockSeq, + } +} + +// TransactionOutput readable transaction output +type TransactionOutput struct { + Hash string `json:"uxid"` + Address string `json:"dst"` + Coins string `json:"coins"` + Hours uint64 `json:"hours"` +} + +// TransactionInput readable transaction input +type TransactionInput struct { + Hash string `json:"uxid"` + Address string `json:"owner"` + Coins string `json:"coins"` + Hours uint64 `json:"hours"` + CalculatedHours uint64 `json:"calculated_hours"` +} + +// NewTransactionOutput creates a TransactionOutput +func NewTransactionOutput(txn *coin.TransactionOutput, txid cipher.SHA256) (*TransactionOutput, error) { + coinStr, err := droplet.ToString(txn.Coins) + if err != nil { + return nil, err + } + + return &TransactionOutput{ + Hash: txn.UxID(txid).Hex(), + Address: txn.Address.String(), + Coins: coinStr, + Hours: txn.Hours, + }, nil +} + +// NewTransactionInput creates a TransactionInput from a visor.TransactionInput +func NewTransactionInput(input visor.TransactionInput) (TransactionInput, error) { + coinStr, err := droplet.ToString(input.UxOut.Body.Coins) + if err != nil { + logger.Errorf("Failed to convert coins to string: %v", err) + return TransactionInput{}, err + } + + return TransactionInput{ + Hash: input.UxOut.Hash().Hex(), + Address: input.UxOut.Body.Address.String(), + Coins: coinStr, + Hours: input.UxOut.Body.Hours, + CalculatedHours: input.CalculatedHours, + }, nil +} + +// Transaction represents a readable transaction +type Transaction struct { + Timestamp uint64 `json:"timestamp,omitempty"` + Length uint32 `json:"length"` + Type uint8 `json:"type"` + Hash string `json:"txid"` + InnerHash string `json:"inner_hash"` + + Sigs []string `json:"sigs"` + In []string `json:"inputs"` + Out []TransactionOutput `json:"outputs"` +} + +// NewTransaction creates a readable transaction +func NewTransaction(txn coin.Transaction, isGenesis bool) (*Transaction, error) { + if isGenesis && len(txn.In) != 0 { + return nil, errors.New("NewTransaction: isGenesis=true but Transaction.In is not empty") + } + if !isGenesis && len(txn.In) == 0 { + return nil, errors.New("NewTransaction: isGenesis=false but Transaction.In is empty") + } + + // Genesis transaction uses empty SHA256 as the txid for its outputs [FIXME: requires hardfork] + txID := txn.Hash() + txnOutputTxID := cipher.SHA256{} + if !isGenesis { + txnOutputTxID = txID + } + + sigs := make([]string, len(txn.Sigs)) + for i := range txn.Sigs { + sigs[i] = txn.Sigs[i].Hex() + } + + in := make([]string, len(txn.In)) + for i := range txn.In { + in[i] = txn.In[i].Hex() + } + + out := make([]TransactionOutput, len(txn.Out)) + for i := range txn.Out { + o, err := NewTransactionOutput(&txn.Out[i], txnOutputTxID) + if err != nil { + return nil, err + } + + out[i] = *o + } + + return &Transaction{ + Length: txn.Length, + Type: txn.Type, + Hash: txID.Hex(), + InnerHash: txn.InnerHash.Hex(), + + Sigs: sigs, + In: in, + Out: out, + }, nil +} + +// NewTransactionWithTimestamp creates a readable transaction with its timestamp set +func NewTransactionWithTimestamp(txn coin.Transaction, isGenesis bool, timestamp uint64) (*Transaction, error) { + newTxn, err := NewTransaction(txn, isGenesis) + if err != nil { + return nil, err + } + newTxn.Timestamp = timestamp + return newTxn, nil +} + +// UnconfirmedTransactions represents a readable unconfirmed transaction +type UnconfirmedTransactions struct { + Transaction Transaction `json:"transaction"` + Received time.Time `json:"received"` + Checked time.Time `json:"checked"` + Announced time.Time `json:"announced"` + IsValid bool `json:"is_valid"` +} + +// NewUnconfirmedTransaction creates a readable unconfirmed transaction +func NewUnconfirmedTransaction(unconfirmed *visor.UnconfirmedTransaction) (*UnconfirmedTransactions, error) { + isGenesis := false // unconfirmed transactions are never the genesis transaction + txn, err := NewTransaction(unconfirmed.Transaction, isGenesis) + if err != nil { + return nil, err + } + return &UnconfirmedTransactions{ + Transaction: *txn, + Received: timeutil.NanoToTime(unconfirmed.Received), + Checked: timeutil.NanoToTime(unconfirmed.Checked), + Announced: timeutil.NanoToTime(unconfirmed.Announced), + IsValid: unconfirmed.IsValid == 1, + }, nil +} + +// NewUnconfirmedTransactions converts []visor.UnconfirmedTransaction to []UnconfirmedTransactions +func NewUnconfirmedTransactions(txns []visor.UnconfirmedTransaction) ([]UnconfirmedTransactions, error) { + rut := make([]UnconfirmedTransactions, len(txns)) + for i := range txns { + txn, err := NewUnconfirmedTransaction(&txns[i]) + if err != nil { + return []UnconfirmedTransactions{}, err + } + rut[i] = *txn + } + return rut, nil +} + +// TransactionWithStatus represents transaction result +type TransactionWithStatus struct { + Status TransactionStatus `json:"status"` + Time uint64 `json:"time"` + Transaction Transaction `json:"txn"` +} + +// NewTransactionWithStatus converts visor.Transaction to TransactionWithStatus +func NewTransactionWithStatus(txn *visor.Transaction) (*TransactionWithStatus, error) { + if txn == nil { + return nil, nil + } + + isGenesis := txn.Status.BlockSeq == 0 && txn.Status.Confirmed + rbTxn, err := NewTransactionWithTimestamp(txn.Transaction, isGenesis, txn.Time) + if err != nil { + return nil, err + } + + return &TransactionWithStatus{ + Transaction: *rbTxn, + Status: NewTransactionStatus(txn.Status), + Time: txn.Time, + }, nil +} + +// TransactionWithStatusVerbose represents verbose transaction result +type TransactionWithStatusVerbose struct { + Status TransactionStatus `json:"status"` + Time uint64 `json:"time"` + Transaction TransactionVerbose `json:"txn"` +} + +// NewTransactionWithStatusVerbose converts visor.Transaction to TransactionWithStatusVerbose +func NewTransactionWithStatusVerbose(txn *visor.Transaction, inputs []visor.TransactionInput) (*TransactionWithStatusVerbose, error) { + if txn == nil { + return nil, nil + } + + if len(txn.Transaction.In) != len(inputs) { + return nil, fmt.Errorf("NewTransactionWithStatusVerbose: len(txn.In) != len(inputs) [%d != %d]", len(txn.Transaction.In), len(inputs)) + } + + rbTxn, err := NewTransactionVerbose(*txn, inputs) + if err != nil { + return nil, err + } + + // Force the Status field to be hidden on the inner transaction, to maintain API compatibility + rbTxn.Status = nil + + return &TransactionWithStatusVerbose{ + Transaction: rbTxn, + Status: NewTransactionStatus(txn.Status), + Time: txn.Time, + }, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/readable/verbose.go b/vendor/github.com/SkycoinProject/skycoin/src/readable/verbose.go new file mode 100644 index 00000000..1ad82791 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/readable/verbose.go @@ -0,0 +1,258 @@ +package readable + +import ( + "errors" + "fmt" + "time" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/util/mathutil" + "github.com/SkycoinProject/skycoin/src/util/timeutil" + "github.com/SkycoinProject/skycoin/src/visor" +) + +// BlockBodyVerbose represents a verbose readable block body +type BlockBodyVerbose struct { + Transactions []BlockTransactionVerbose `json:"txns"` +} + +// BlockVerbose represents a readable block with verbose data +type BlockVerbose struct { + Head BlockHeader `json:"header"` + Body BlockBodyVerbose `json:"body"` + Size uint32 `json:"size"` +} + +// NewBlockBodyVerbose creates a verbose readable block body +func NewBlockBodyVerbose(b coin.Block, inputs [][]visor.TransactionInput) (*BlockBodyVerbose, error) { + if len(inputs) != len(b.Body.Transactions) { + return nil, fmt.Errorf("NewBlockBodyVerbose: len(inputs) != len(b.Body.Transactions) (seq=%d)", b.Head.BkSeq) + } + + txns := make([]BlockTransactionVerbose, len(b.Body.Transactions)) + for i := range b.Body.Transactions { + t := b.Body.Transactions[i] + + txn, err := NewBlockTransactionVerbose(t, inputs[i], b.Head.BkSeq == 0) + if err != nil { + return nil, err + } + txns[i] = txn + } + + return &BlockBodyVerbose{ + Transactions: txns, + }, nil +} + +// NewBlockVerbose creates a verbose readable block +func NewBlockVerbose(b coin.Block, inputs [][]visor.TransactionInput) (*BlockVerbose, error) { + body, err := NewBlockBodyVerbose(b, inputs) + if err != nil { + return nil, err + } + + size, err := b.Size() + if err != nil { + return nil, err + } + + return &BlockVerbose{ + Head: NewBlockHeader(b.Head), + Body: *body, + Size: size, + }, nil +} + +// BlocksVerbose an array of verbose readable blocks. +type BlocksVerbose struct { + Blocks []BlockVerbose `json:"blocks"` +} + +// NewBlocksVerbose creates BlocksVerbose from []BlockVerbose +func NewBlocksVerbose(blocks []coin.SignedBlock, inputs [][][]visor.TransactionInput) (*BlocksVerbose, error) { + bs := make([]BlockVerbose, len(blocks)) + for i := range blocks { + if i >= len(inputs) { + return nil, errors.New("NewBlocksVerbose: not enough inputs for blocks") + } + + b, err := NewBlockVerbose(blocks[i].Block, inputs[i]) + if err != nil { + return nil, err + } + + bs[i] = *b + } + + return &BlocksVerbose{ + Blocks: bs, + }, nil +} + +// BlockTransactionVerbose has readable transaction data for transactions inside a block. It differs from Transaction +// in that it includes metadata for transaction inputs and the calculated coinhour fee spent by the block +type BlockTransactionVerbose struct { + Length uint32 `json:"length"` + Type uint8 `json:"type"` + Hash string `json:"txid"` + InnerHash string `json:"inner_hash"` + Fee uint64 `json:"fee"` + + Sigs []string `json:"sigs"` + In []TransactionInput `json:"inputs"` + Out []TransactionOutput `json:"outputs"` +} + +// NewBlockTransactionVerbose creates BlockTransactionVerbose +func NewBlockTransactionVerbose(txn coin.Transaction, inputs []visor.TransactionInput, isGenesis bool) (BlockTransactionVerbose, error) { + if len(inputs) != len(txn.In) { + return BlockTransactionVerbose{}, errors.New("NewBlockTransactionVerbose: len(inputs) != len(txn.In)") + } + + // Genesis transaction uses empty SHA256 as txid + // FIXME: If/when the blockchain is regenerated, use a real hash as the txID for the genesis block. The bkSeq argument can be removed then. + txID := cipher.SHA256{} + if !isGenesis { + txID = txn.Hash() + } + + sigs := make([]string, len(txn.Sigs)) + for i, s := range txn.Sigs { + sigs[i] = s.Hex() + } + + out := make([]TransactionOutput, len(txn.Out)) + for i := range txn.Out { + o, err := NewTransactionOutput(&txn.Out[i], txID) + if err != nil { + return BlockTransactionVerbose{}, err + } + + out[i] = *o + } + + var hoursIn uint64 + for _, i := range inputs { + if _, err := mathutil.AddUint64(hoursIn, i.CalculatedHours); err != nil { + logger.Critical().Warningf("Ignoring NewBlockTransactionVerbose summing txn %s input hours error: %v", txID.Hex(), err) + } + hoursIn += i.CalculatedHours + } + + var hoursOut uint64 + for _, o := range txn.Out { + if _, err := mathutil.AddUint64(hoursOut, o.Hours); err != nil { + logger.Critical().Warningf("Ignoring NewBlockTransactionVerbose summing txn %s outputs hours error: %v", txID.Hex(), err) + } + + hoursOut += o.Hours + } + + var fee uint64 + if isGenesis { + if hoursIn != 0 { + err := errors.New("NewBlockTransactionVerbose genesis block should have 0 input hours") + return BlockTransactionVerbose{}, err + } + + fee = 0 + } else { + if hoursIn < hoursOut { + err := fmt.Errorf("NewBlockTransactionVerbose input hours is less than output hours, txid=%s", txID.Hex()) + return BlockTransactionVerbose{}, err + } + + fee = hoursIn - hoursOut + } + + txnInputs := make([]TransactionInput, len(inputs)) + for i, input := range inputs { + var err error + txnInputs[i], err = NewTransactionInput(input) + if err != nil { + return BlockTransactionVerbose{}, err + } + } + + return BlockTransactionVerbose{ + Length: txn.Length, + Type: txn.Type, + Hash: txn.Hash().Hex(), + InnerHash: txn.InnerHash.Hex(), + Fee: fee, + + Sigs: sigs, + In: txnInputs, + Out: out, + }, nil +} + +// TransactionVerbose has readable transaction data. It adds TransactionStatus to a BlockTransactionVerbose +type TransactionVerbose struct { + Status *TransactionStatus `json:"status,omitempty"` + Timestamp uint64 `json:"timestamp,omitempty"` + BlockTransactionVerbose +} + +// NewTransactionVerbose creates TransactionVerbose +func NewTransactionVerbose(txn visor.Transaction, inputs []visor.TransactionInput) (TransactionVerbose, error) { + rb, err := NewBlockTransactionVerbose(txn.Transaction, inputs, txn.Status.BlockSeq == 0 && txn.Status.Confirmed) + if err != nil { + return TransactionVerbose{}, err + } + + status := NewTransactionStatus(txn.Status) + + return TransactionVerbose{ + Status: &status, + Timestamp: txn.Time, + BlockTransactionVerbose: rb, + }, nil +} + +// UnconfirmedTransactionVerbose represents a verbose readable unconfirmed transaction +type UnconfirmedTransactionVerbose struct { + Transaction BlockTransactionVerbose `json:"transaction"` + Received time.Time `json:"received"` + Checked time.Time `json:"checked"` + Announced time.Time `json:"announced"` + IsValid bool `json:"is_valid"` +} + +// NewUnconfirmedTransactionVerbose creates a verbose readable unconfirmed transaction +func NewUnconfirmedTransactionVerbose(unconfirmed *visor.UnconfirmedTransaction, inputs []visor.TransactionInput) (*UnconfirmedTransactionVerbose, error) { + isGenesis := false // The genesis transaction is never unconfirmed + txn, err := NewBlockTransactionVerbose(unconfirmed.Transaction, inputs, isGenesis) + if err != nil { + return nil, err + } + + return &UnconfirmedTransactionVerbose{ + Transaction: txn, + Received: timeutil.NanoToTime(unconfirmed.Received), + Checked: timeutil.NanoToTime(unconfirmed.Checked), + Announced: timeutil.NanoToTime(unconfirmed.Announced), + IsValid: unconfirmed.IsValid == 1, + }, nil +} + +// NewUnconfirmedTransactionsVerbose creates []UnconfirmedTransactions from []UnconfirmedTransaction and their readable transaction inputs +func NewUnconfirmedTransactionsVerbose(txns []visor.UnconfirmedTransaction, inputs [][]visor.TransactionInput) ([]UnconfirmedTransactionVerbose, error) { + if len(inputs) != len(txns) { + return nil, fmt.Errorf("NewUnconfirmedTransactionsVerbose: len(inputs) != len(txns)") + } + + rTxns := make([]UnconfirmedTransactionVerbose, len(txns)) + for i, txn := range txns { + rTxn, err := NewUnconfirmedTransactionVerbose(&txn, inputs[i]) + if err != nil { + return nil, err + } + + rTxns[i] = *rTxn + } + + return rTxns, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/readable/version.go b/vendor/github.com/SkycoinProject/skycoin/src/readable/version.go new file mode 100644 index 00000000..d85b1976 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/readable/version.go @@ -0,0 +1,20 @@ +package readable + +import "github.com/blang/semver" + +// BuildInfo represents the build info +type BuildInfo struct { + Version string `json:"version"` // version number + Commit string `json:"commit"` // git commit id + Branch string `json:"branch"` // git branch name +} + +// Semver returns the parsed semver.Version of the configured Version string +func (b BuildInfo) Semver() (*semver.Version, error) { + sv, err := semver.Make(b.Version) + if err != nil { + return nil, err + } + + return &sv, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/readable/wallet.go b/vendor/github.com/SkycoinProject/skycoin/src/readable/wallet.go new file mode 100644 index 00000000..174c6580 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/readable/wallet.go @@ -0,0 +1,68 @@ +package readable + +import ( + "github.com/SkycoinProject/skycoin/src/cipher/bip44" + "github.com/SkycoinProject/skycoin/src/wallet" +) + +// Balance has coins and hours +type Balance struct { + Coins uint64 `json:"coins"` + Hours uint64 `json:"hours"` +} + +// NewBalance copies from wallet.Balance +func NewBalance(b wallet.Balance) Balance { + return Balance{ + Coins: b.Coins, + Hours: b.Hours, + } +} + +// BalancePair records the confirmed and predicted balance of an address +type BalancePair struct { + Confirmed Balance `json:"confirmed"` + Predicted Balance `json:"predicted"` // TODO rename "pending" +} + +// NewBalancePair copies from wallet.BalancePair +func NewBalancePair(bp wallet.BalancePair) BalancePair { + return BalancePair{ + Confirmed: NewBalance(bp.Confirmed), + Predicted: NewBalance(bp.Predicted), + } +} + +// AddressBalances represents a map of address balances +type AddressBalances map[string]BalancePair + +// NewAddressBalances copies from wallet.AddressBalances +func NewAddressBalances(wab wallet.AddressBalances) AddressBalances { + ab := make(AddressBalances, len(wab)) + for k, v := range wab { + ab[k] = NewBalancePair(v) + } + return ab +} + +// WalletEntry the wallet entry struct +type WalletEntry struct { + Address string `json:"address"` + Public string `json:"public_key"` + ChildNumber *uint32 `json:"child_number,omitempty"` // For bip32/44 + Change *uint32 `json:"change,omitempty"` // For bip44 +} + +// WalletMeta the wallet meta struct +type WalletMeta struct { + Coin wallet.CoinType `json:"coin"` + Filename string `json:"filename"` + Label string `json:"label"` + Type string `json:"type"` + Version string `json:"version"` + CryptoType wallet.CryptoType `json:"crypto_type"` + Timestamp int64 `json:"timestamp"` + Encrypted bool `json:"encrypted"` + Bip44Coin *bip44.CoinType `json:"bip44_coin,omitempty"` // For bip44 + XPub string `json:"xpub,omitempty"` // For xpub +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/skycoin/config.go b/vendor/github.com/SkycoinProject/skycoin/src/skycoin/config.go new file mode 100644 index 00000000..8943b16a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/skycoin/config.go @@ -0,0 +1,758 @@ +package skycoin + +import ( + "errors" + "flag" + "fmt" + "math" + "os" + "path/filepath" + "runtime" + "strings" + "time" + + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/fiber" + "github.com/SkycoinProject/skycoin/src/kvstorage" + + "log" + + "github.com/SkycoinProject/skycoin/src/api" + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/readable" + "github.com/SkycoinProject/skycoin/src/util/droplet" + "github.com/SkycoinProject/skycoin/src/util/file" + "github.com/SkycoinProject/skycoin/src/util/useragent" + "github.com/SkycoinProject/skycoin/src/wallet" +) + +var ( + help = false +) + +// Config records skycoin node and build config +type Config struct { + Node NodeConfig + Build readable.BuildInfo +} + +// NodeConfig records the node's configuration +type NodeConfig struct { + // Name of the coin + CoinName string + + // Disable peer exchange + DisablePEX bool + // Download peer list + DownloadPeerList bool + // Download the peers list from this URL + PeerListURL string + // Don't make any outgoing connections + DisableOutgoingConnections bool + // Don't allowing incoming connections + DisableIncomingConnections bool + // Disables networking altogether + DisableNetworking bool + // Enable GUI + EnableGUI bool + // Disable CSRF check in the wallet API + DisableCSRF bool + // Disable Host, Origin and Referer header check in the wallet API + DisableHeaderCheck bool + // Disable CSP disable content-security-policy in http response + DisableCSP bool + // Comma separated list of API sets enabled on the remote web interface + EnabledAPISets string + // Comma separated list of API sets disabled on the remote web interface + DisabledAPISets string + // Enable all of API sets. Applies before disabling individual sets + EnableAllAPISets bool + + enabledAPISets map[string]struct{} + // Comma separate list of hostnames to accept in the Host header, used to bypass the Host header check which only applies to localhost addresses + HostWhitelist string + hostWhitelist []string + + // Only run on localhost and only connect to others on localhost + LocalhostOnly bool + // Which address to serve on. Leave blank to automatically assign to a + // public interface + Address string + // gnet uses this for TCP incoming and outgoing + Port int + // MaxConnections is the maximum number of total connections allowed + MaxConnections int + // Maximum outgoing connections to maintain + MaxOutgoingConnections int + // Maximum default outgoing connections + MaxDefaultPeerOutgoingConnections int + // How often to make outgoing connections + OutgoingConnectionsRate time.Duration + // MaxOutgoingMessageLength maximum size of outgoing messages + MaxOutgoingMessageLength int + // MaxIncomingMessageLength maximum size of incoming messages + MaxIncomingMessageLength int + // PeerlistSize represents the maximum number of peers that the pex would maintain + PeerlistSize int + // Wallet Address Version + // AddressVersion string + // Remote web interface + WebInterface bool + // Remote web interface port + WebInterfacePort int + // Remote web interface address + WebInterfaceAddr string + // Remote web interface certificate + WebInterfaceCert string + // Remote web interface key + WebInterfaceKey string + // Remote web interface HTTPS support + WebInterfaceHTTPS bool + // Remote web interface username and password + WebInterfaceUsername string + WebInterfacePassword string + // Allow web interface auth without HTTPS + WebInterfacePlaintextAuth bool + + // Launch System Default Browser after client startup + LaunchBrowser bool + + // Data directory holds app data -- defaults to ~/.skycoin + DataDirectory string + // GUI directory contains assets for the HTML interface + GUIDirectory string + + // Timeouts for the HTTP listener + HTTPReadTimeout time.Duration + HTTPWriteTimeout time.Duration + HTTPIdleTimeout time.Duration + + // Remark to include in user agent sent in the wire protocol introduction + UserAgentRemark string + userAgent useragent.Data + + // Logging + ColorLog bool + // This is the value registered with flag, it is converted to LogLevel after parsing + LogLevel string + // Disable "Reply to ping", "Received pong" log messages + DisablePingPong bool + + // Verify the database integrity after loading + VerifyDB bool + // Reset the database if integrity checks fail, and continue running + ResetCorruptDB bool + + // Transaction verification parameters for unconfirmed transactions + UnconfirmedVerifyTxn params.VerifyTxn + // Transaction verification parameters for transactions when creating blocks + CreateBlockVerifyTxn params.VerifyTxn + // Maximum total size of transactions in a block + MaxBlockTransactionsSize uint32 + + unconfirmedBurnFactor uint64 + maxUnconfirmedTransactionSize uint64 + unconfirmedMaxDropletPrecision uint64 + createBlockBurnFactor uint64 + createBlockMaxTransactionSize uint64 + createBlockMaxDropletPrecision uint64 + maxBlockSize uint64 + + // Wallets + // Defaults to ${DataDirectory}/wallets/ + WalletDirectory string + // Wallet crypto type + WalletCryptoType string + + // Key-value storage + // Default to ${DataDirectory}/data + KVStorageDirectory string + EnabledStorageTypes []kvstorage.Type + + // Disable the hardcoded default peers + DisableDefaultPeers bool + // Load custom peers from disk + CustomPeersFile string + + RunBlockPublisher bool + + /* Developer options */ + + // Enable cpu profiling + ProfileCPU bool + // Where the file is written to + ProfileCPUFile string + // Enable HTTP profiling interface (see http://golang.org/pkg/net/http/pprof/) + HTTPProf bool + // Expose HTTP profiling on this interface + HTTPProfHost string + + DBPath string + DBReadOnly bool + LogToFile bool + Version bool // show node version + + GenesisSignatureStr string + GenesisAddressStr string + BlockchainPubkeyStr string + BlockchainSeckeyStr string + GenesisTimestamp uint64 + GenesisCoinVolume uint64 + DefaultConnections []string + + genesisSignature cipher.Sig + genesisAddress cipher.Address + genesisHash cipher.SHA256 + + blockchainPubkey cipher.PubKey + blockchainSeckey cipher.SecKey + + Fiber readable.FiberConfig +} + +// NewNodeConfig returns a new node config instance +func NewNodeConfig(mode string, node fiber.NodeConfig) NodeConfig { + nodeConfig := NodeConfig{ + CoinName: node.CoinName, + GenesisSignatureStr: node.GenesisSignatureStr, + GenesisAddressStr: node.GenesisAddressStr, + GenesisCoinVolume: node.GenesisCoinVolume, + GenesisTimestamp: node.GenesisTimestamp, + BlockchainPubkeyStr: node.BlockchainPubkeyStr, + BlockchainSeckeyStr: node.BlockchainSeckeyStr, + DefaultConnections: node.DefaultConnections, + // Disable peer exchange + DisablePEX: false, + // Don't make any outgoing connections + DisableOutgoingConnections: false, + // Don't allowing incoming connections + DisableIncomingConnections: false, + // Disables networking altogether + DisableNetworking: false, + // Enable GUI + EnableGUI: false, + // Disable CSRF check in the wallet API + DisableCSRF: false, + // Disable Host, Origin and Referer header check in the wallet API + DisableHeaderCheck: false, + // DisableCSP disable content-security-policy in http response + DisableCSP: false, + // Only run on localhost and only connect to others on localhost + LocalhostOnly: false, + // Which address to serve on. Leave blank to automatically assign to a + // public interface + Address: "", + // gnet uses this for TCP incoming and outgoing + Port: node.Port, + // MaxConnections is the maximum number of total connections allowed + MaxConnections: 128, + // MaxOutgoingConnections is the maximum outgoing connections allowed + MaxOutgoingConnections: 8, + // MaxDefaultOutgoingConnections is the maximum default outgoing connections allowed + MaxDefaultPeerOutgoingConnections: 1, + DownloadPeerList: true, + PeerListURL: node.PeerListURL, + // How often to make outgoing connections, in seconds + OutgoingConnectionsRate: time.Second * 5, + MaxOutgoingMessageLength: 256 * 1024, + MaxIncomingMessageLength: 1024 * 1024, + PeerlistSize: 65535, + // Wallet Address Version + // AddressVersion: "test", + // Remote web interface + WebInterface: true, + WebInterfacePort: node.WebInterfacePort, + WebInterfaceAddr: "127.0.0.1", + WebInterfaceCert: "", + WebInterfaceKey: "", + WebInterfaceHTTPS: false, + EnabledAPISets: strings.Join([]string{ + api.EndpointsRead, + api.EndpointsTransaction, + }, ","), + DisabledAPISets: "", + EnableAllAPISets: false, + + LaunchBrowser: false, + // Data directory holds app data + DataDirectory: node.DataDirectory, + // Web GUI static resources + GUIDirectory: "./src/gui/static/", + // Logging + ColorLog: true, + LogLevel: "INFO", + LogToFile: false, + DisablePingPong: false, + + VerifyDB: false, + ResetCorruptDB: false, + + // Blockchain/transaction validation + UnconfirmedVerifyTxn: params.VerifyTxn{ + BurnFactor: node.UnconfirmedBurnFactor, + MaxTransactionSize: node.UnconfirmedMaxTransactionSize, + MaxDropletPrecision: node.UnconfirmedMaxDropletPrecision, + }, + CreateBlockVerifyTxn: params.VerifyTxn{ + BurnFactor: node.CreateBlockBurnFactor, + MaxTransactionSize: node.CreateBlockMaxTransactionSize, + MaxDropletPrecision: node.CreateBlockMaxDropletPrecision, + }, + MaxBlockTransactionsSize: node.MaxBlockTransactionsSize, + + // Wallets + WalletDirectory: "", + WalletCryptoType: string(wallet.DefaultCryptoType), + + // Key-value storage + KVStorageDirectory: "", + EnabledStorageTypes: []kvstorage.Type{ + kvstorage.TypeTxIDNotes, + kvstorage.TypeGeneral, + }, + + // Timeout settings for http.Server + // https://blog.cloudflare.com/the-complete-guide-to-golang-net-http-timeouts/ + HTTPReadTimeout: time.Second * 10, + HTTPWriteTimeout: time.Second * 60, + HTTPIdleTimeout: time.Second * 120, + + RunBlockPublisher: false, + + // Enable cpu profiling + ProfileCPU: false, + // Where the file is written to + ProfileCPUFile: "cpu.prof", + // HTTP profiling interface (see http://golang.org/pkg/net/http/pprof/) + HTTPProf: false, + HTTPProfHost: "localhost:6060", + + Fiber: readable.FiberConfig{ + Name: node.CoinName, + DisplayName: node.DisplayName, + Ticker: node.Ticker, + CoinHoursName: node.CoinHoursName, + CoinHoursNameSingular: node.CoinHoursNameSingular, + CoinHoursTicker: node.CoinHoursTicker, + ExplorerURL: node.ExplorerURL, + VersionURL: node.VersionURL, + Bip44Coin: node.Bip44Coin, + }, + } + + nodeConfig.applyConfigMode(mode) + + return nodeConfig +} + +func (c *Config) postProcess() error { + if help { + flag.Usage() + os.Exit(0) + } + + var err error + if c.Node.GenesisSignatureStr != "" { + c.Node.genesisSignature, err = cipher.SigFromHex(c.Node.GenesisSignatureStr) + panicIfError(err, "Invalid Signature") + } + + if c.Node.GenesisAddressStr != "" { + c.Node.genesisAddress, err = cipher.DecodeBase58Address(c.Node.GenesisAddressStr) + panicIfError(err, "Invalid Address") + } + + // Compute genesis block hash + gb, err := coin.NewGenesisBlock(c.Node.genesisAddress, c.Node.GenesisCoinVolume, c.Node.GenesisTimestamp) + if err != nil { + panicIfError(err, "Create genesis hash failed") + } + c.Node.genesisHash = gb.HashHeader() + + if c.Node.BlockchainPubkeyStr != "" { + c.Node.blockchainPubkey, err = cipher.PubKeyFromHex(c.Node.BlockchainPubkeyStr) + panicIfError(err, "Invalid Pubkey") + } + if c.Node.BlockchainSeckeyStr != "" { + c.Node.blockchainSeckey, err = cipher.SecKeyFromHex(c.Node.BlockchainSeckeyStr) + panicIfError(err, "Invalid Seckey") + c.Node.BlockchainSeckeyStr = "" + } + if c.Node.BlockchainSeckeyStr != "" { + c.Node.blockchainSeckey = cipher.SecKey{} + } + + home := file.UserHome() + c.Node.DataDirectory, err = file.InitDataDir(replaceHome(c.Node.DataDirectory, home)) + panicIfError(err, "Invalid DataDirectory") + + if c.Node.WebInterfaceCert == "" { + c.Node.WebInterfaceCert = filepath.Join(c.Node.DataDirectory, "skycoind.cert") + } else { + c.Node.WebInterfaceCert = replaceHome(c.Node.WebInterfaceCert, home) + } + + if c.Node.WebInterfaceKey == "" { + c.Node.WebInterfaceKey = filepath.Join(c.Node.DataDirectory, "skycoind.key") + } else { + c.Node.WebInterfaceKey = replaceHome(c.Node.WebInterfaceKey, home) + } + + if c.Node.WalletDirectory == "" { + c.Node.WalletDirectory = filepath.Join(c.Node.DataDirectory, "wallets") + } else { + c.Node.WalletDirectory = replaceHome(c.Node.WalletDirectory, home) + } + + if c.Node.KVStorageDirectory == "" { + c.Node.KVStorageDirectory = filepath.Join(c.Node.DataDirectory, "data") + } else { + c.Node.KVStorageDirectory = replaceHome(c.Node.KVStorageDirectory, home) + } + if len(c.Node.EnabledStorageTypes) == 0 { + c.Node.EnabledStorageTypes = []kvstorage.Type{ + kvstorage.TypeGeneral, + kvstorage.TypeTxIDNotes, + } + } + + if c.Node.DBPath == "" { + c.Node.DBPath = filepath.Join(c.Node.DataDirectory, "data.db") + } else { + c.Node.DBPath = replaceHome(c.Node.DBPath, home) + } + + userAgentData := useragent.Data{ + Coin: c.Node.CoinName, + Version: c.Build.Version, + Remark: c.Node.UserAgentRemark, + } + + if _, err := userAgentData.Build(); err != nil { + return err + } + + c.Node.userAgent = userAgentData + + apiSets, err := buildAPISets(c.Node) + if err != nil { + return err + } + + // Don't open browser to load wallets if wallet apis are disabled. + c.Node.enabledAPISets = apiSets + if _, ok := c.Node.enabledAPISets[api.EndpointsWallet]; !ok { + c.Node.EnableGUI = false + c.Node.LaunchBrowser = false + } + + if c.Node.EnableGUI { + c.Node.GUIDirectory = file.ResolveResourceDirectory(c.Node.GUIDirectory) + } + + if c.Node.DisableDefaultPeers { + c.Node.DefaultConnections = nil + } + + if c.Node.HostWhitelist != "" { + if c.Node.DisableHeaderCheck { + return errors.New("host whitelist should be empty when header check is disabled") + } + c.Node.hostWhitelist = strings.Split(c.Node.HostWhitelist, ",") + } + + httpAuthEnabled := c.Node.WebInterfaceUsername != "" || c.Node.WebInterfacePassword != "" + if httpAuthEnabled && !c.Node.WebInterfaceHTTPS && !c.Node.WebInterfacePlaintextAuth { + return errors.New("Web interface auth enabled but HTTPS is not enabled. Use -web-interface-plaintext-auth=true if this is desired") + } + + if c.Node.MaxConnections < c.Node.MaxOutgoingConnections+c.Node.MaxDefaultPeerOutgoingConnections { + return errors.New("-max-connections must be >= -max-outgoing-connections + -max-default-peer-outgoing-connections") + } + + if c.Node.MaxOutgoingConnections > c.Node.MaxConnections { + return errors.New("-max-outgoing-connections cannot be higher than -max-connections") + } + + if c.Node.maxBlockSize > math.MaxUint32 { + return errors.New("-max-block-size exceeds MaxUint32") + } + if c.Node.maxUnconfirmedTransactionSize > math.MaxUint32 { + return errors.New("-max-txn-size-unconfirmed exceeds MaxUint32") + } + if c.Node.unconfirmedBurnFactor > math.MaxUint32 { + return errors.New("-burn-factor-unconfirmed exceeds MaxUint32") + } + if c.Node.createBlockBurnFactor > math.MaxUint32 { + return errors.New("-burn-factor-create-block exceeds MaxUint32") + } + + if c.Node.unconfirmedMaxDropletPrecision > math.MaxUint8 { + return errors.New("-max-decimals-unconfirmed exceeds MaxUint8") + } + if c.Node.createBlockMaxDropletPrecision > math.MaxUint8 { + return errors.New("-max-decimals-create-block exceeds MaxUint8") + } + + c.Node.UnconfirmedVerifyTxn.BurnFactor = uint32(c.Node.unconfirmedBurnFactor) + c.Node.UnconfirmedVerifyTxn.MaxTransactionSize = uint32(c.Node.maxUnconfirmedTransactionSize) + c.Node.UnconfirmedVerifyTxn.MaxDropletPrecision = uint8(c.Node.unconfirmedMaxDropletPrecision) + c.Node.CreateBlockVerifyTxn.BurnFactor = uint32(c.Node.createBlockBurnFactor) + c.Node.CreateBlockVerifyTxn.MaxTransactionSize = uint32(c.Node.createBlockMaxTransactionSize) + c.Node.CreateBlockVerifyTxn.MaxDropletPrecision = uint8(c.Node.createBlockMaxDropletPrecision) + c.Node.MaxBlockTransactionsSize = uint32(c.Node.maxBlockSize) + + if c.Node.UnconfirmedVerifyTxn.MaxTransactionSize < params.MinTransactionSize { + return fmt.Errorf("-max-txn-size-unconfirmed must be >= params.MinTransactionSize (%d)", params.MinTransactionSize) + } + if c.Node.UnconfirmedVerifyTxn.MaxTransactionSize < params.UserVerifyTxn.MaxTransactionSize { + return fmt.Errorf("-max-txn-size-unconfirmed must be >= params.UserVerifyTxn.MaxTransactionSize (%d)", params.UserVerifyTxn.MaxTransactionSize) + } + if c.Node.CreateBlockVerifyTxn.MaxTransactionSize < params.MinTransactionSize { + return fmt.Errorf("-max-txn-size-create-block must be >= params.MinTransactionSize (%d)", params.MinTransactionSize) + } + if c.Node.CreateBlockVerifyTxn.MaxTransactionSize < params.UserVerifyTxn.MaxTransactionSize { + return fmt.Errorf("-max-txn-size-create-block must be >= params.UserVerifyTxn.MaxTransactionSize (%d)", params.UserVerifyTxn.MaxTransactionSize) + } + + if c.Node.MaxBlockTransactionsSize < params.MinTransactionSize { + return fmt.Errorf("-max-block-size must be >= params.MinTransactionSize (%d)", params.MinTransactionSize) + } + if c.Node.MaxBlockTransactionsSize < params.UserVerifyTxn.MaxTransactionSize { + return fmt.Errorf("-max-block-size must be >= params.UserVerifyTxn.MaxTransactionSize (%d)", params.UserVerifyTxn.MaxTransactionSize) + } + if c.Node.MaxBlockTransactionsSize < c.Node.UnconfirmedVerifyTxn.MaxTransactionSize { + return errors.New("-max-block-size must be >= -max-txn-size-unconfirmed") + } + if c.Node.MaxBlockTransactionsSize < c.Node.CreateBlockVerifyTxn.MaxTransactionSize { + return errors.New("-max-block-size must be >= -max-txn-size-create-block") + } + + if c.Node.UnconfirmedVerifyTxn.BurnFactor < params.MinBurnFactor { + return fmt.Errorf("-burn-factor-unconfirmed must be >= params.MinBurnFactor (%d)", params.MinBurnFactor) + } + if c.Node.UnconfirmedVerifyTxn.BurnFactor < params.UserVerifyTxn.BurnFactor { + return fmt.Errorf("-burn-factor-unconfirmed must be >= params.UserVerifyTxn.BurnFactor (%d)", params.UserVerifyTxn.BurnFactor) + } + + if c.Node.CreateBlockVerifyTxn.BurnFactor < params.MinBurnFactor { + return fmt.Errorf("-burn-factor-create-block must be >= params.MinBurnFactor (%d)", params.MinBurnFactor) + } + if c.Node.CreateBlockVerifyTxn.BurnFactor < params.UserVerifyTxn.BurnFactor { + return fmt.Errorf("-burn-factor-create-block must be >= params.UserVerifyTxn.BurnFactor (%d)", params.UserVerifyTxn.BurnFactor) + } + + if c.Node.UnconfirmedVerifyTxn.MaxDropletPrecision > droplet.Exponent { + return fmt.Errorf("-max-decimals-unconfirmed must be <= droplet.Exponent (%d)", droplet.Exponent) + } + if c.Node.UnconfirmedVerifyTxn.MaxDropletPrecision < params.UserVerifyTxn.MaxDropletPrecision { + return fmt.Errorf("-max-decimals-unconfirmed must be >= params.UserVerifyTxn.MaxDropletPrecision (%d)", params.UserVerifyTxn.MaxDropletPrecision) + } + + if c.Node.CreateBlockVerifyTxn.MaxDropletPrecision > droplet.Exponent { + return fmt.Errorf("-max-decimals-create-block must be <= droplet.Exponent (%d)", droplet.Exponent) + } + if c.Node.CreateBlockVerifyTxn.MaxDropletPrecision < params.UserVerifyTxn.MaxDropletPrecision { + return fmt.Errorf("-max-decimals-create-block must be >= params.UserVerifyTxn.MaxDropletPrecision (%d)", params.UserVerifyTxn.MaxDropletPrecision) + } + + return nil +} + +// buildAPISets builds the set of enable APIs by the following rules: +// * If EnableAll, all API sets are added +// * For each api set in EnabledAPISets, add +// * For each api set in DisabledAPISets, remove +func buildAPISets(c NodeConfig) (map[string]struct{}, error) { + enabledAPISets := strings.Split(c.EnabledAPISets, ",") + if err := validateAPISets("-enable-api-sets", enabledAPISets); err != nil { + return nil, err + } + + disabledAPISets := strings.Split(c.DisabledAPISets, ",") + if err := validateAPISets("-disable-api-sets", disabledAPISets); err != nil { + return nil, err + } + + apiSets := make(map[string]struct{}) + + allAPISets := []string{ + api.EndpointsRead, + api.EndpointsStatus, + api.EndpointsWallet, + api.EndpointsTransaction, + api.EndpointsPrometheus, + api.EndpointsNetCtrl, + api.EndpointsStorage, + // Do not include insecure or deprecated API sets, they must always + // be explicitly enabled through -enable-api-sets + } + + if c.EnableAllAPISets { + for _, s := range allAPISets { + apiSets[s] = struct{}{} + } + } + + // Add the enabled API sets + for _, k := range enabledAPISets { + apiSets[k] = struct{}{} + } + + // Remove the disabled API sets + for _, k := range disabledAPISets { + delete(apiSets, k) + } + + return apiSets, nil +} + +func validateAPISets(opt string, apiSets []string) error { + for _, k := range apiSets { + k = strings.ToUpper(strings.TrimSpace(k)) + switch k { + case api.EndpointsRead, + api.EndpointsStatus, + api.EndpointsTransaction, + api.EndpointsWallet, + api.EndpointsInsecureWalletSeed, + api.EndpointsPrometheus, + api.EndpointsNetCtrl, + api.EndpointsStorage: + case "": + continue + default: + return fmt.Errorf("Invalid value in %s: %q", opt, k) + } + } + return nil +} + +// RegisterFlags binds CLI flags to config values +func (c *NodeConfig) RegisterFlags() { + flag.BoolVar(&help, "help", false, "Show help") + flag.BoolVar(&c.DisablePEX, "disable-pex", c.DisablePEX, "disable PEX peer discovery") + flag.BoolVar(&c.DownloadPeerList, "download-peerlist", c.DownloadPeerList, "download a peers.txt from -peerlist-url") + flag.StringVar(&c.PeerListURL, "peerlist-url", c.PeerListURL, "with -download-peerlist=true, download a peers.txt file from this url") + flag.BoolVar(&c.DisableOutgoingConnections, "disable-outgoing", c.DisableOutgoingConnections, "Don't make outgoing connections") + flag.BoolVar(&c.DisableIncomingConnections, "disable-incoming", c.DisableIncomingConnections, "Don't allow incoming connections") + flag.BoolVar(&c.DisableNetworking, "disable-networking", c.DisableNetworking, "Disable all network activity") + flag.BoolVar(&c.EnableGUI, "enable-gui", c.EnableGUI, "Enable GUI") + flag.BoolVar(&c.DisableCSRF, "disable-csrf", c.DisableCSRF, "disable CSRF check") + flag.BoolVar(&c.DisableHeaderCheck, "disable-header-check", c.DisableHeaderCheck, "disables the host, origin and referer header checks.") + flag.BoolVar(&c.DisableCSP, "disable-csp", c.DisableCSP, "disable content-security-policy in http response") + flag.StringVar(&c.Address, "address", c.Address, "IP Address to run application on. Leave empty to default to a public interface") + flag.IntVar(&c.Port, "port", c.Port, "Port to run application on") + + flag.BoolVar(&c.WebInterface, "web-interface", c.WebInterface, "enable the web interface") + flag.IntVar(&c.WebInterfacePort, "web-interface-port", c.WebInterfacePort, "port to serve web interface on") + flag.StringVar(&c.WebInterfaceAddr, "web-interface-addr", c.WebInterfaceAddr, "addr to serve web interface on") + flag.StringVar(&c.WebInterfaceCert, "web-interface-cert", c.WebInterfaceCert, "skycoind.cert file for web interface HTTPS. If not provided, will autogenerate or use skycoind.cert in --data-dir") + flag.StringVar(&c.WebInterfaceKey, "web-interface-key", c.WebInterfaceKey, "skycoind.key file for web interface HTTPS. If not provided, will autogenerate or use skycoind.key in --data-dir") + flag.BoolVar(&c.WebInterfaceHTTPS, "web-interface-https", c.WebInterfaceHTTPS, "enable HTTPS for web interface") + flag.StringVar(&c.HostWhitelist, "host-whitelist", c.HostWhitelist, "Hostnames to whitelist in the Host header check. Only applies when the web interface is bound to localhost.") + + allAPISets := []string{ + api.EndpointsRead, + api.EndpointsStatus, + api.EndpointsWallet, + api.EndpointsTransaction, + api.EndpointsPrometheus, + api.EndpointsNetCtrl, + api.EndpointsInsecureWalletSeed, + api.EndpointsStorage, + } + flag.StringVar(&c.EnabledAPISets, "enable-api-sets", c.EnabledAPISets, fmt.Sprintf("enable API set. Options are %s. Multiple values should be separated by comma", strings.Join(allAPISets, ", "))) + flag.StringVar(&c.DisabledAPISets, "disable-api-sets", c.DisabledAPISets, fmt.Sprintf("disable API set. Options are %s. Multiple values should be separated by comma", strings.Join(allAPISets, ", "))) + flag.BoolVar(&c.EnableAllAPISets, "enable-all-api-sets", c.EnableAllAPISets, "enable all API sets, except for deprecated or insecure sets. This option is applied before -disable-api-sets.") + + flag.StringVar(&c.WebInterfaceUsername, "web-interface-username", c.WebInterfaceUsername, "username for the web interface") + flag.StringVar(&c.WebInterfacePassword, "web-interface-password", c.WebInterfacePassword, "password for the web interface") + flag.BoolVar(&c.WebInterfacePlaintextAuth, "web-interface-plaintext-auth", c.WebInterfacePlaintextAuth, "allow web interface auth without https") + + flag.BoolVar(&c.LaunchBrowser, "launch-browser", c.LaunchBrowser, "launch system default webbrowser at client startup") + flag.StringVar(&c.DataDirectory, "data-dir", c.DataDirectory, "directory to store app data (defaults to ~/.skycoin)") + flag.StringVar(&c.DBPath, "db-path", c.DBPath, "path of database file (defaults to ~/.skycoin/data.db)") + flag.BoolVar(&c.DBReadOnly, "db-read-only", c.DBReadOnly, "open bolt db read-only") + flag.BoolVar(&c.ProfileCPU, "profile-cpu", c.ProfileCPU, "enable cpu profiling") + flag.StringVar(&c.ProfileCPUFile, "profile-cpu-file", c.ProfileCPUFile, "where to write the cpu profile file") + flag.BoolVar(&c.HTTPProf, "http-prof", c.HTTPProf, "run the HTTP profiling interface") + flag.StringVar(&c.HTTPProfHost, "http-prof-host", c.HTTPProfHost, "hostname to bind the HTTP profiling interface to") + flag.StringVar(&c.LogLevel, "log-level", c.LogLevel, "Choices are: debug, info, warn, error, fatal, panic") + flag.BoolVar(&c.ColorLog, "color-log", c.ColorLog, "Add terminal colors to log output") + flag.BoolVar(&c.DisablePingPong, "no-ping-log", c.DisablePingPong, `disable "reply to ping" and "received pong" debug log messages`) + flag.BoolVar(&c.LogToFile, "logtofile", c.LogToFile, "log to file") + flag.StringVar(&c.GUIDirectory, "gui-dir", c.GUIDirectory, "static content directory for the HTML interface") + + flag.BoolVar(&c.VerifyDB, "verify-db", c.VerifyDB, "check the database for corruption") + flag.BoolVar(&c.ResetCorruptDB, "reset-corrupt-db", c.ResetCorruptDB, "reset the database if corrupted, and continue running instead of exiting") + + flag.BoolVar(&c.DisableDefaultPeers, "disable-default-peers", c.DisableDefaultPeers, "disable the hardcoded default peers") + flag.StringVar(&c.CustomPeersFile, "custom-peers-file", c.CustomPeersFile, "load custom peers from a newline separate list of ip:port in a file. Note that this is different from the peers.json file in the data directory") + + flag.StringVar(&c.UserAgentRemark, "user-agent-remark", c.UserAgentRemark, "additional remark to include in the user agent sent over the wire protocol") + + flag.Uint64Var(&c.maxUnconfirmedTransactionSize, "max-txn-size-unconfirmed", uint64(c.UnconfirmedVerifyTxn.MaxTransactionSize), "maximum size of an unconfirmed transaction") + flag.Uint64Var(&c.unconfirmedBurnFactor, "burn-factor-unconfirmed", uint64(c.UnconfirmedVerifyTxn.BurnFactor), "coinhour burn factor applied to unconfirmed transactions") + flag.Uint64Var(&c.unconfirmedMaxDropletPrecision, "max-decimals-unconfirmed", uint64(c.UnconfirmedVerifyTxn.MaxDropletPrecision), "max number of decimal places applied to unconfirmed transactions") + flag.Uint64Var(&c.createBlockBurnFactor, "burn-factor-create-block", uint64(c.CreateBlockVerifyTxn.BurnFactor), "coinhour burn factor applied when creating blocks") + flag.Uint64Var(&c.createBlockMaxTransactionSize, "max-txn-size-create-block", uint64(c.CreateBlockVerifyTxn.MaxTransactionSize), "maximum size of a transaction applied when creating blocks") + flag.Uint64Var(&c.createBlockMaxDropletPrecision, "max-decimals-create-block", uint64(c.CreateBlockVerifyTxn.MaxDropletPrecision), "max number of decimal places applied when creating blocks") + flag.Uint64Var(&c.maxBlockSize, "max-block-size", uint64(c.MaxBlockTransactionsSize), "maximum total size of transactions in a block") + + flag.BoolVar(&c.RunBlockPublisher, "block-publisher", c.RunBlockPublisher, "run the daemon as a block publisher") + flag.StringVar(&c.BlockchainPubkeyStr, "blockchain-public-key", c.BlockchainPubkeyStr, "public key of the blockchain") + flag.StringVar(&c.BlockchainSeckeyStr, "blockchain-secret-key", c.BlockchainSeckeyStr, "secret key of the blockchain") + + flag.StringVar(&c.GenesisAddressStr, "genesis-address", c.GenesisAddressStr, "genesis address") + flag.StringVar(&c.GenesisSignatureStr, "genesis-signature", c.GenesisSignatureStr, "genesis block signature") + flag.Uint64Var(&c.GenesisTimestamp, "genesis-timestamp", c.GenesisTimestamp, "genesis block timestamp") + + flag.StringVar(&c.WalletDirectory, "wallet-dir", c.WalletDirectory, "location of the wallet files. Defaults to ~/.skycoin/wallet/") + flag.StringVar(&c.KVStorageDirectory, "storage-dir", c.KVStorageDirectory, "location of the storage data files. Defaults to ~/.skycoin/data/") + flag.IntVar(&c.MaxConnections, "max-connections", c.MaxConnections, "Maximum number of total connections allowed") + flag.IntVar(&c.MaxOutgoingConnections, "max-outgoing-connections", c.MaxOutgoingConnections, "Maximum number of outgoing connections allowed") + flag.IntVar(&c.MaxDefaultPeerOutgoingConnections, "max-default-peer-outgoing-connections", c.MaxDefaultPeerOutgoingConnections, "The maximum default peer outgoing connections allowed") + flag.IntVar(&c.PeerlistSize, "peerlist-size", c.PeerlistSize, "Max number of peers to track in peerlist") + flag.DurationVar(&c.OutgoingConnectionsRate, "connection-rate", c.OutgoingConnectionsRate, "How often to make an outgoing connection") + flag.IntVar(&c.MaxOutgoingMessageLength, "max-out-msg-len", c.MaxOutgoingMessageLength, "Maximum length of outgoing wire messages") + flag.IntVar(&c.MaxIncomingMessageLength, "max-in-msg-len", c.MaxIncomingMessageLength, "Maximum length of incoming wire messages") + flag.BoolVar(&c.LocalhostOnly, "localhost-only", c.LocalhostOnly, "Run on localhost and only connect to localhost peers") + flag.StringVar(&c.WalletCryptoType, "wallet-crypto-type", c.WalletCryptoType, "wallet crypto type. Can be sha256-xor or scrypt-chacha20poly1305") + flag.BoolVar(&c.Version, "version", false, "show node version") +} + +func (c *NodeConfig) applyConfigMode(configMode string) { + if runtime.GOOS == "windows" { + c.ColorLog = false + } + switch configMode { + case "": + case "STANDALONE_CLIENT": + c.EnableAllAPISets = true + c.EnabledAPISets = api.EndpointsInsecureWalletSeed + c.EnableGUI = true + c.LaunchBrowser = true + c.DisableCSRF = false + c.DisableHeaderCheck = false + c.DisableCSP = false + c.DownloadPeerList = true + c.WebInterface = true + c.LogToFile = false + c.ResetCorruptDB = true + c.WebInterfacePort = 0 // randomize web interface port + default: + panic("Invalid ConfigMode") + } +} + +func panicIfError(err error, msg string, args ...interface{}) { //nolint:unparam + if err != nil { + log.Panicf(msg+": %v", append(args, err)...) + } +} + +func replaceHome(path, home string) string { + return strings.Replace(path, "$HOME", home, 1) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/skycoin/skycoin.go b/vendor/github.com/SkycoinProject/skycoin/src/skycoin/skycoin.go new file mode 100644 index 00000000..8731e36c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/skycoin/skycoin.go @@ -0,0 +1,675 @@ +/* +Package skycoin implements the main daemon cmd's configuration and setup +*/ +package skycoin + +import ( + "errors" + "fmt" + "io/ioutil" + "log" + "net/http" + "os" + "path/filepath" + "runtime" + "runtime/pprof" + "sync" + "time" + + "github.com/blang/semver" + "github.com/toqueteos/webbrowser" + + "github.com/SkycoinProject/skycoin/src/api" + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/daemon" + "github.com/SkycoinProject/skycoin/src/kvstorage" + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/readable" + "github.com/SkycoinProject/skycoin/src/util/apputil" + "github.com/SkycoinProject/skycoin/src/util/certutil" + "github.com/SkycoinProject/skycoin/src/util/droplet" + "github.com/SkycoinProject/skycoin/src/util/logging" + "github.com/SkycoinProject/skycoin/src/visor" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" + "github.com/SkycoinProject/skycoin/src/wallet" +) + +var ( + // DBVerifyCheckpointVersion is a checkpoint for determining if DB verification should be run. + // Any DB upgrading from less than this version to equal or higher than this version will be forced to verify. + // Update this version checkpoint if a newer version requires a new verification run. + DBVerifyCheckpointVersion = "0.25.0" + dbVerifyCheckpointVersionParsed semver.Version +) + +// Coin represents a fiber coin instance +type Coin struct { + config Config + logger *logging.Logger +} + +// Run starts the node +func (c *Coin) Run() error { + var db *dbutil.DB + var w *wallet.Service + var v *visor.Visor + var d *daemon.Daemon + var s *kvstorage.Manager + var gw *api.Gateway + var webInterface *api.Server + var retErr error + errC := make(chan error, 10) + + if c.config.Node.Version { + fmt.Println(c.config.Build.Version) + return nil + } + + logLevel, err := logging.LevelFromString(c.config.Node.LogLevel) + if err != nil { + err = fmt.Errorf("Invalid -log-level: %v", err) + c.logger.Error(err) + return err + } + + logging.SetLevel(logLevel) + + if c.config.Node.ColorLog { + logging.EnableColors() + } else { + logging.DisableColors() + } + + var logFile *os.File + if c.config.Node.LogToFile { + var err error + logFile, err = c.initLogFile() + if err != nil { + c.logger.Error(err) + return err + } + } + + var fullAddress string + scheme := "http" + if c.config.Node.WebInterfaceHTTPS { + scheme = "https" + } + host := fmt.Sprintf("%s:%d", c.config.Node.WebInterfaceAddr, c.config.Node.WebInterfacePort) + + if c.config.Node.ProfileCPU { + f, err := os.Create(c.config.Node.ProfileCPUFile) + if err != nil { + c.logger.Error(err) + return err + } + + if err := pprof.StartCPUProfile(f); err != nil { + c.logger.Error(err) + return err + } + defer pprof.StopCPUProfile() + } + + if c.config.Node.HTTPProf { + go func() { + if err := http.ListenAndServe(c.config.Node.HTTPProfHost, nil); err != nil { + c.logger.WithError(err).Errorf("Listen on HTTP profiling interface %s failed", c.config.Node.HTTPProfHost) + } + }() + } + + var wg sync.WaitGroup + + quit := make(chan struct{}) + + // Catch SIGINT (CTRL-C) (closes the quit channel) + go apputil.CatchInterrupt(quit) + + // Catch SIGUSR1 (prints runtime stack to stdout) + go apputil.CatchDebug() + + // Parse the current app version + appVersion, err := c.config.Build.Semver() + if err != nil { + c.logger.WithError(err).Errorf("Version %s is not a valid semver", c.config.Build.Version) + return err + } + + c.logger.Infof("App version: %s", appVersion) + c.logger.Infof("OS: %s", runtime.GOOS) + c.logger.Infof("Arch: %s", runtime.GOARCH) + + wconf := c.ConfigureWallet() + dconf := c.ConfigureDaemon() + vconf := c.ConfigureVisor() + sconf := c.ConfigureStorage() + + // Open the database + c.logger.Infof("Opening database %s", c.config.Node.DBPath) + db, err = visor.OpenDB(c.config.Node.DBPath, c.config.Node.DBReadOnly) + if err != nil { + c.logger.Errorf("Database failed to open: %v. Is another skycoin instance running?", err) + return err + } + + // Look for saved app version + dbVersion, err := visor.GetDBVersion(db) + if err != nil { + c.logger.WithError(err).Error("visor.GetDBVersion failed") + retErr = err + goto earlyShutdown + } + + if dbVersion == nil { + c.logger.Info("DB version not found in DB") + } else { + c.logger.Infof("DB version: %s", dbVersion) + } + + c.logger.Infof("DB verify checkpoint version: %s", DBVerifyCheckpointVersion) + + // If the saved DB version is higher than the app version, abort. + // Otherwise DB corruption could occur. + if dbVersion != nil && dbVersion.GT(*appVersion) { + err = fmt.Errorf("Cannot use newer DB version=%v with older software version=%v", dbVersion, appVersion) + c.logger.WithError(err).Error() + retErr = err + goto earlyShutdown + } + + // Verify the DB if the version detection says to, or if it was requested on the command line + if shouldVerifyDB(appVersion, dbVersion) || c.config.Node.VerifyDB { + if c.config.Node.ResetCorruptDB { + // Check the database integrity and recreate it if necessary + c.logger.Info("Checking database and resetting if corrupted") + if newDB, err := visor.ResetCorruptDB(db, c.config.Node.blockchainPubkey, quit); err != nil { + if err != visor.ErrVerifyStopped { + c.logger.WithError(err).Error("visor.ResetCorruptDB failed") + retErr = err + } + goto earlyShutdown + } else { + db = newDB + } + } else { + c.logger.Info("Checking database") + if err := visor.CheckDatabase(db, c.config.Node.blockchainPubkey, quit); err != nil { + if err != visor.ErrVerifyStopped { + c.logger.WithError(err).Error("visor.CheckDatabase failed") + retErr = err + } + goto earlyShutdown + } + } + } + + // Update the DB version + if !db.IsReadOnly() { + if err := visor.SetDBVersion(db, *appVersion); err != nil { + c.logger.WithError(err).Error("visor.SetDBVersion failed") + retErr = err + goto earlyShutdown + } + } + + c.logger.Infof("Coinhour burn factor for user transactions is %d", params.UserVerifyTxn.BurnFactor) + c.logger.Infof("Max transaction size for user transactions is %d", params.UserVerifyTxn.MaxTransactionSize) + c.logger.Infof("Max decimals for user transactions is %d", params.UserVerifyTxn.MaxDropletPrecision) + + c.logger.Info("wallet.NewService") + w, err = wallet.NewService(wconf) + if err != nil { + c.logger.WithError(err).Error("wallet.NewService failed") + retErr = err + goto earlyShutdown + } + + c.logger.Info("visor.New") + v, err = visor.New(vconf, db, w) + if err != nil { + c.logger.WithError(err).Error("visor.New failed") + retErr = err + goto earlyShutdown + } + + c.logger.Info("daemon.New") + d, err = daemon.New(dconf, v) + if err != nil { + c.logger.WithError(err).Error("daemon.New failed") + retErr = err + goto earlyShutdown + } + + c.logger.Info("kvstorage.NewManager") + s, err = kvstorage.NewManager(sconf) + if err != nil { + c.logger.WithError(err).Error("kvstorage.NewManager failed") + retErr = err + goto earlyShutdown + } + + c.logger.Info("api.NewGateway") + gw = api.NewGateway(d, v, w, s) + + if c.config.Node.WebInterface { + webInterface, err = c.createGUI(gw, host) + if err != nil { + c.logger.WithError(err).Error("c.createGUI failed") + retErr = err + goto earlyShutdown + } + + fullAddress = fmt.Sprintf("%s://%s", scheme, webInterface.Addr()) + c.logger.Critical().Infof("Full address: %s", fullAddress) + } + + c.logger.Info("visor.Init") + if err := v.Init(); err != nil { + c.logger.WithError(err).Error("visor.Init failed") + retErr = err + goto earlyShutdown + } + + wg.Add(1) + go func() { + defer wg.Done() + + c.logger.Info("daemon.Run") + if err := d.Run(); err != nil { + c.logger.WithError(err).Error("daemon.Run failed") + errC <- err + } + }() + + if c.config.Node.WebInterface { + cancelLaunchBrowser := make(chan struct{}) + + wg.Add(1) + go func() { + defer wg.Done() + + c.logger.Info("webInterface.Serve") + if err := webInterface.Serve(); err != nil { + close(cancelLaunchBrowser) + c.logger.WithError(err).Error("webInterface.Serve failed") + errC <- err + } + }() + + if c.config.Node.LaunchBrowser { + go func() { + select { + case <-cancelLaunchBrowser: + c.logger.Warning("Browser launching canceled") + + // Wait a moment just to make sure the http interface is up + case <-time.After(time.Millisecond * 100): + c.logger.Infof("Launching System Browser with %s", fullAddress) + if err := webbrowser.Open(fullAddress); err != nil { + c.logger.WithError(err).Error("webbrowser.Open failed") + } + } + }() + } + } + + select { + case <-quit: + case retErr = <-errC: + c.logger.WithError(err).Error("Received error from errC (something prior has failed)") + } + + c.logger.Info("Shutting down...") + + if webInterface != nil { + c.logger.Info("Closing web interface") + webInterface.Shutdown() + } + + c.logger.Info("Closing daemon") + d.Shutdown() + + c.logger.Info("Waiting for goroutines to finish") + wg.Wait() + +earlyShutdown: + if db != nil { + c.logger.Info("Closing database") + if err := db.Close(); err != nil { + c.logger.WithError(err).Error("Failed to close DB") + } + } + + c.logger.Info("Goodbye") + + if logFile != nil { + if err := logFile.Close(); err != nil { + fmt.Println("Failed to close log file") + } + } + + return retErr +} + +// NewCoin returns a new fiber coin instance +func NewCoin(config Config, logger *logging.Logger) *Coin { + return &Coin{ + config: config, + logger: logger, + } +} + +func (c *Coin) initLogFile() (*os.File, error) { + logDir := filepath.Join(c.config.Node.DataDirectory, "logs") + if err := createDirIfNotExist(logDir); err != nil { + c.logger.WithError(err).Errorf("createDirIfNotExist(%s) failed", logDir) + return nil, fmt.Errorf("createDirIfNotExist(%s) failed: %v", logDir, err) + } + + // open log file + tf := "2006-01-02-030405" + logfile := filepath.Join(logDir, fmt.Sprintf("%s-v%s.log", time.Now().Format(tf), c.config.Build.Version)) + + f, err := os.OpenFile(logfile, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0600) + if err != nil { + c.logger.WithError(err).Errorf("os.OpenFile(%s) failed", logfile) + return nil, err + } + + hook := logging.NewWriteHook(f) + logging.AddHook(hook) + + return f, nil +} + +// ConfigureVisor sets the visor config values +func (c *Coin) ConfigureVisor() visor.Config { + vc := visor.NewConfig() + + vc.Distribution = params.MainNetDistribution + + vc.IsBlockPublisher = c.config.Node.RunBlockPublisher + vc.Arbitrating = c.config.Node.RunBlockPublisher + + vc.BlockchainPubkey = c.config.Node.blockchainPubkey + vc.BlockchainSeckey = c.config.Node.blockchainSeckey + + vc.UnconfirmedVerifyTxn = c.config.Node.UnconfirmedVerifyTxn + vc.CreateBlockVerifyTxn = c.config.Node.CreateBlockVerifyTxn + vc.MaxBlockTransactionsSize = c.config.Node.MaxBlockTransactionsSize + + vc.GenesisAddress = c.config.Node.genesisAddress + vc.GenesisSignature = c.config.Node.genesisSignature + vc.GenesisTimestamp = c.config.Node.GenesisTimestamp + vc.GenesisCoinVolume = c.config.Node.GenesisCoinVolume + + return vc +} + +// ConfigureWallet sets the wallet config values +func (c *Coin) ConfigureWallet() wallet.Config { + wc := wallet.NewConfig() + + wc.WalletDir = c.config.Node.WalletDirectory + _, wc.EnableWalletAPI = c.config.Node.enabledAPISets[api.EndpointsWallet] + _, wc.EnableSeedAPI = c.config.Node.enabledAPISets[api.EndpointsInsecureWalletSeed] + + // Initialize wallet default crypto type + cryptoType, err := wallet.CryptoTypeFromString(c.config.Node.WalletCryptoType) + if err != nil { + log.Panic(err) + } + + wc.CryptoType = cryptoType + + bc := c.config.Node.Fiber.Bip44Coin + wc.Bip44Coin = &bc + + return wc +} + +// ConfigureStorage sets the key-value storage config values +func (c *Coin) ConfigureStorage() kvstorage.Config { + sc := kvstorage.NewConfig() + + sc.StorageDir = c.config.Node.KVStorageDirectory + _, sc.EnableStorageAPI = c.config.Node.enabledAPISets[api.EndpointsStorage] + sc.EnabledStorages = c.config.Node.EnabledStorageTypes + + return sc +} + +// ConfigureDaemon sets the daemon config values +func (c *Coin) ConfigureDaemon() daemon.Config { + dc := daemon.NewConfig() + + dc.Pool.DefaultConnections = c.config.Node.DefaultConnections + dc.Pool.MaxDefaultPeerOutgoingConnections = c.config.Node.MaxDefaultPeerOutgoingConnections + dc.Pool.MaxIncomingMessageLength = c.config.Node.MaxIncomingMessageLength + dc.Pool.MaxOutgoingMessageLength = c.config.Node.MaxOutgoingMessageLength + + dc.Pex.DataDirectory = c.config.Node.DataDirectory + dc.Pex.Disabled = c.config.Node.DisablePEX + dc.Pex.NetworkDisabled = c.config.Node.DisableNetworking + dc.Pex.Max = c.config.Node.PeerlistSize + dc.Pex.DownloadPeerList = c.config.Node.DownloadPeerList + dc.Pex.PeerListURL = c.config.Node.PeerListURL + dc.Pex.DisableTrustedPeers = c.config.Node.DisableDefaultPeers + dc.Pex.CustomPeersFile = c.config.Node.CustomPeersFile + dc.Pex.DefaultConnections = c.config.Node.DefaultConnections + + dc.Daemon.MaxOutgoingMessageLength = uint64(c.config.Node.MaxOutgoingMessageLength) + dc.Daemon.MaxIncomingMessageLength = uint64(c.config.Node.MaxIncomingMessageLength) + dc.Daemon.MaxBlockTransactionsSize = c.config.Node.MaxBlockTransactionsSize + dc.Daemon.DefaultConnections = c.config.Node.DefaultConnections + dc.Daemon.DisableOutgoingConnections = c.config.Node.DisableOutgoingConnections + dc.Daemon.DisableIncomingConnections = c.config.Node.DisableIncomingConnections + dc.Daemon.DisableNetworking = c.config.Node.DisableNetworking + dc.Daemon.Port = c.config.Node.Port + dc.Daemon.Address = c.config.Node.Address + dc.Daemon.LocalhostOnly = c.config.Node.LocalhostOnly + dc.Daemon.MaxConnections = c.config.Node.MaxConnections + dc.Daemon.MaxOutgoingConnections = c.config.Node.MaxOutgoingConnections + dc.Daemon.DataDirectory = c.config.Node.DataDirectory + dc.Daemon.LogPings = !c.config.Node.DisablePingPong + dc.Daemon.BlockchainPubkey = c.config.Node.blockchainPubkey + dc.Daemon.GenesisHash = c.config.Node.genesisHash + dc.Daemon.UserAgent = c.config.Node.userAgent + dc.Daemon.UnconfirmedVerifyTxn = c.config.Node.UnconfirmedVerifyTxn + + if c.config.Node.OutgoingConnectionsRate == 0 { + c.config.Node.OutgoingConnectionsRate = time.Millisecond + } + dc.Daemon.OutgoingRate = c.config.Node.OutgoingConnectionsRate + + return dc +} + +func (c *Coin) createGUI(gw *api.Gateway, host string) (*api.Server, error) { + config := api.Config{ + StaticDir: c.config.Node.GUIDirectory, + DisableCSRF: c.config.Node.DisableCSRF, + DisableHeaderCheck: c.config.Node.DisableHeaderCheck, + DisableCSP: c.config.Node.DisableCSP, + EnableGUI: c.config.Node.EnableGUI, + ReadTimeout: c.config.Node.HTTPReadTimeout, + WriteTimeout: c.config.Node.HTTPWriteTimeout, + IdleTimeout: c.config.Node.HTTPIdleTimeout, + EnabledAPISets: c.config.Node.enabledAPISets, + HostWhitelist: c.config.Node.hostWhitelist, + Health: api.HealthConfig{ + BuildInfo: readable.BuildInfo{ + Version: c.config.Build.Version, + Commit: c.config.Build.Commit, + Branch: c.config.Build.Branch, + }, + Fiber: c.config.Node.Fiber, + DaemonUserAgent: c.config.Node.userAgent, + BlockPublisher: c.config.Node.RunBlockPublisher, + }, + Username: c.config.Node.WebInterfaceUsername, + Password: c.config.Node.WebInterfacePassword, + } + + var s *api.Server + if c.config.Node.WebInterfaceHTTPS { + // Verify cert/key parameters, and if neither exist, create them + exists, err := checkCertFiles(c.config.Node.WebInterfaceCert, c.config.Node.WebInterfaceKey) + if err != nil { + c.logger.WithError(err).Error("checkCertFiles failed") + return nil, err + } + + if !exists { + c.logger.Infof("Autogenerating HTTP certificate and key files %s, %s", c.config.Node.WebInterfaceCert, c.config.Node.WebInterfaceKey) + if err := createCertFiles(c.config.Node.WebInterfaceCert, c.config.Node.WebInterfaceKey); err != nil { + c.logger.WithError(err).Error("createCertFiles failed") + return nil, err + } + + c.logger.Infof("Created cert file %s", c.config.Node.WebInterfaceCert) + c.logger.Infof("Created key file %s", c.config.Node.WebInterfaceKey) + } + + s, err = api.CreateHTTPS(host, config, gw, c.config.Node.WebInterfaceCert, c.config.Node.WebInterfaceKey) + if err != nil { + c.logger.WithError(err).Error("Failed to start web failed") + return nil, err + } + } else { + var err error + s, err = api.Create(host, config, gw) + if err != nil { + c.logger.WithError(err).Error("Failed to start web failed") + return nil, err + } + } + + return s, nil +} + +// checkCertFiles returns true if both cert and key files exist, false if neither exist, +// or returns an error if only one does not exist +func checkCertFiles(cert, key string) (bool, error) { + doesFileExist := func(f string) (bool, error) { + if _, err := os.Stat(f); err != nil { + if os.IsNotExist(err) { + return false, nil + } + return false, err + } + return true, nil + } + + certExists, err := doesFileExist(cert) + if err != nil { + return false, err + } + + keyExists, err := doesFileExist(key) + if err != nil { + return false, err + } + + switch { + case certExists && keyExists: + return true, nil + case !certExists && !keyExists: + return false, nil + case certExists && !keyExists: + return false, fmt.Errorf("certfile %s exists but keyfile %s does not", cert, key) + case !certExists && keyExists: + return false, fmt.Errorf("keyfile %s exists but certfile %s does not", key, cert) + default: + log.Panic("unreachable code") + return false, errors.New("unreachable code") + } +} + +func createCertFiles(certFile, keyFile string) error { + org := "skycoin daemon autogenerated cert" + validUntil := time.Now().Add(10 * 365 * 24 * time.Hour) + cert, key, err := certutil.NewTLSCertPair(org, validUntil, nil) + if err != nil { + return err + } + + if err := ioutil.WriteFile(certFile, cert, 0600); err != nil { + return err + } + if err := ioutil.WriteFile(keyFile, key, 0600); err != nil { + os.Remove(certFile) + return err + } + + return nil +} + +// ParseConfig prepare the config +func (c *Coin) ParseConfig() error { + return c.config.postProcess() +} + +// InitTransaction creates the genesis transaction +func InitTransaction(uxID string, genesisSecKey cipher.SecKey, dist params.Distribution) coin.Transaction { + dist.MustValidate() + + var txn coin.Transaction + + output := cipher.MustSHA256FromHex(uxID) + if err := txn.PushInput(output); err != nil { + log.Panic(err) + } + + for _, addr := range dist.AddressesDecoded() { + if err := txn.PushOutput(addr, dist.AddressInitialBalance()*droplet.Multiplier, 1); err != nil { + log.Panic(err) + } + } + + seckeys := make([]cipher.SecKey, 1) + seckey := genesisSecKey.Hex() + seckeys[0] = cipher.MustSecKeyFromHex(seckey) + txn.SignInputs(seckeys) + + if err := txn.UpdateHeader(); err != nil { + log.Panic(err) + } + + if err := txn.Verify(); err != nil { + log.Panic(err) + } + + log.Printf("signature= %s", txn.Sigs[0].Hex()) + return txn +} + +func createDirIfNotExist(dir string) error { + if _, err := os.Stat(dir); !os.IsNotExist(err) { + return nil + } + + return os.Mkdir(dir, 0750) +} + +func shouldVerifyDB(appVersion, dbVersion *semver.Version) bool { + // If the dbVersion is not set, verify + if dbVersion == nil { + return true + } + + // If the dbVersion is less than the verification checkpoint version + // and the appVersion is greater than or equal to the checkpoint version, + // verify + if dbVersion.LT(dbVerifyCheckpointVersionParsed) && appVersion.GTE(dbVerifyCheckpointVersionParsed) { + return true + } + + return false +} + +func init() { + dbVerifyCheckpointVersionParsed = semver.MustParse(DBVerifyCheckpointVersion) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/skycoin/skycoin_test.go b/vendor/github.com/SkycoinProject/skycoin/src/skycoin/skycoin_test.go new file mode 100644 index 00000000..1c17f8d9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/skycoin/skycoin_test.go @@ -0,0 +1,333 @@ +// package skycoin implements skycoin main integration tests +package skycoin + +import ( + "bufio" + "bytes" + "fmt" + "io" + "io/ioutil" + "os" + "os/exec" + "path/filepath" + "runtime" + "strings" + "sync" + "testing" + "time" + + "github.com/blang/semver" + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/visor" +) + +const ( + testFixturesDir = "testdata" + checkpointVersion = "0.25.0" +) + +var ( + // import path for github.com/SkycoinProject/skycoin/cmd/skycoin + ldflagsNameCmd string + + // import path for github.com/SkycoinProject/skycoin/src/skycoin + ldflagsNameSkyLib string +) + +func TestMain(m *testing.M) { + coin := getCoinName() + output, err := exec.Command("go", "list", fmt.Sprintf("../../cmd/%s", coin)).CombinedOutput() //nolint:gosec + if err != nil { + fmt.Fprintf(os.Stderr, "go list failed: %s", output) + os.Exit(1) + } + + ldflagsNameCmd = strings.TrimSpace(string(output)) + + output, err = exec.Command("go", "list", ".").CombinedOutput() //nolint:gosec + if err != nil { + fmt.Fprintf(os.Stderr, "go list failed: %s", output) + os.Exit(1) + } + + ldflagsNameSkyLib = strings.TrimSpace(string(output)) + + ret := m.Run() + os.Exit(ret) +} + +func getCoinName() string { + coin := os.Getenv("COIN") + if coin == "" { + coin = "skycoin" + } + return coin +} + +func versionUpgradeWaitTimeout(t *testing.T) time.Duration { + x := os.Getenv("VERSION_UPGRADE_TEST_WAIT_TIMEOUT") + if x == "" { + return time.Second * 5 + } + + d, err := time.ParseDuration(x) + require.NoError(t, err) + return d +} + +func buildBinary(t *testing.T, version string) (string, func()) { + coin := getCoinName() + + binaryName := fmt.Sprintf("%s-skycoin-pkg-%s.test", coin, version) + binaryPath, err := filepath.Abs(binaryName) + require.NoError(t, err) + + // coverpkgName will be like github.com/SkycoinProject/skycoin + coverpkgName := filepath.Dir(filepath.Dir(ldflagsNameCmd)) + + // Build binary file with specific app version and db checkpoint version + args := []string{ + "test", "-c", + "-ldflags", fmt.Sprintf("-X %s.Version=%s -X %s.DBVerifyCheckpointVersion=%s", ldflagsNameCmd, version, ldflagsNameSkyLib, checkpointVersion), + "-tags", "testrunmain", + "-o", binaryPath, + fmt.Sprintf("-coverpkg=%s/...", coverpkgName), + fmt.Sprintf("../../cmd/%s/", coin), + } + cmd := exec.Command("go", args...) + + stdout, err := cmd.StdoutPipe() + require.NoError(t, err) + + err = cmd.Start() + require.NoError(t, err) + + output, err := ioutil.ReadAll(stdout) + require.NoError(t, err) + + err = cmd.Wait() + require.NoError(t, err, "Output: %s", string(output)) + + return binaryPath, func() { + if err := os.Remove(binaryPath); err != nil { + t.Logf("Failed to remove %s: %v", binaryPath, err) + } + } +} + +func TestDBVerifyLogic(t *testing.T) { + if runtime.GOOS == "windows" { + t.Skip("Windows doesn't support SIGINT") + return + } + + cases := []struct { + name string + dbFile string + dbVersion string + appVersion string + shouldVerify bool + args []string + err string + }{ + { + name: "db no version, app version 0.25.0", + dbFile: "no-version.db", + dbVersion: "", + appVersion: "0.25.0", + shouldVerify: true, + }, + { + name: "db version 0.24.1, app version 0.24.1", + dbFile: "version-0.24.1.db", + dbVersion: "0.24.1", + appVersion: "0.24.1", + shouldVerify: false, + }, + { + name: "db version 0.25.0, app version 0.25.0", + dbFile: "version-0.25.0.db", + dbVersion: "0.25.0", + appVersion: "0.25.0", + shouldVerify: false, + }, + { + name: "db version 0.25.0, app version 0.26.0", + dbFile: "version-0.25.0.db", + dbVersion: "0.25.0", + appVersion: "0.26.0", + shouldVerify: false, + }, + { + name: "db version 0.25.0, app version 0.26.0, force verify", + dbFile: "version-0.25.0.db", + dbVersion: "0.25.0", + appVersion: "0.26.0", + args: []string{"-verify-db=true"}, + shouldVerify: true, + }, + { + name: "db version 0.24.1, app version 0.26.0", + dbFile: "version-0.24.1.db", + dbVersion: "0.24.1", + appVersion: "0.26.0", + shouldVerify: true, + }, + { + name: "db version 0.25.0, app version 0.24.1", + dbFile: "version-0.25.0.db", + dbVersion: "0.25.0", + appVersion: "0.24.1", + err: "Cannot use newer DB version=0.25.0 with older software version=0.24.1", + }, + } + + copyDBFile := func(t *testing.T, dbFile string) string { + // Copy the database file to a temp file since it will be modified by the application + dbf, err := os.Open(filepath.Join(testFixturesDir, dbFile)) + require.NoError(t, err) + defer dbf.Close() + + f, err := ioutil.TempFile("", fmt.Sprintf("%s.*", dbFile)) + require.NoError(t, err) + defer f.Close() + + _, err = io.Copy(f, dbf) + require.NoError(t, err) + + return f.Name() + } + + err := os.MkdirAll("../../coverage", 0750) + require.NoError(t, err) + + // Cache for prebuilt binaries (reduces test time by not recompiling needlessly) + appCache := make(map[string]string) + var appCacheLock sync.Mutex + var cleanups []func() + defer func() { + for _, f := range cleanups { + f() + } + }() + + for i, tc := range cases { + coverageFile := fmt.Sprintf("../../coverage/db-verify-logic-%d.coverage.out", i) + t.Run(tc.name, func(t *testing.T) { + // Build the binary with a specific version + binaryPath := func() string { + appCacheLock.Lock() + defer appCacheLock.Unlock() + binaryPath := appCache[tc.appVersion] + if binaryPath == "" { + var cleanup func() + binaryPath, cleanup = buildBinary(t, tc.appVersion) + appCache[tc.appVersion] = binaryPath + cleanups = append(cleanups, cleanup) + } + return binaryPath + }() + + tmpFile := copyDBFile(t, tc.dbFile) + defer os.Remove(tmpFile) + + // Run the binary with networking disabled + args := append([]string{ + "-disable-networking=true", + "-web-interface=false", + "-download-peerlist=false", + fmt.Sprintf("-db-path=%s", tmpFile), + "-test.run", "^TestRunMain$", + fmt.Sprintf("-test.coverprofile=%s", coverageFile), + }, tc.args...) + + cmd := exec.Command(binaryPath, args...) + + stdout, err := cmd.StdoutPipe() + require.NoError(t, err) + + scanner := bufio.NewScanner(stdout) + + err = cmd.Start() + require.NoError(t, err) + + // Kill the process if it hasn't had an error or checked the database within a timeout, + // so that the tests that test that the database is not checked can complete + go time.AfterFunc(versionUpgradeWaitTimeout(t), func() { + if tc.shouldVerify { + cmd.Process.Kill() //nolint:errcheck + } else { + cmd.Process.Signal(os.Interrupt) //nolint:errcheck + } + }) + + // Scan for an error message or for the database check marker + didVerify := false + foundErrMsg := false + for scanner.Scan() { + x := scanner.Bytes() + + if tc.err != "" && bytes.Contains(x, []byte(tc.err)) { + foundErrMsg = true + break + } + + verifyMsg := "Checking database" + if bytes.Contains(x, []byte(verifyMsg)) { + didVerify = true + cmd.Process.Signal(os.Interrupt) //nolint:errcheck + break + } + } + + err = cmd.Wait() + if err != nil { + require.EqualError(t, err, "exit status 1", err.Error()) + require.NotEmpty(t, tc.err, "unexpected error: %v", err.Error()) + require.True(t, foundErrMsg) + + // Re-open the database to check that the version was not modified + db, err := visor.OpenDB(tmpFile, false) + require.NoError(t, err) + defer db.Close() + + v, err := visor.GetDBVersion(db) + require.NoError(t, err) + require.NotNil(t, v) + + expectVersion := semver.MustParse(tc.dbVersion) + require.Equal(t, expectVersion, *v) + + return + } + + require.NoError(t, err) + require.Empty(t, tc.err) + require.False(t, foundErrMsg) + require.Equal(t, tc.shouldVerify, didVerify) + + // Re-open the database to check that the version was added + db, err := visor.OpenDB(tmpFile, false) + require.NoError(t, err) + defer db.Close() + + v, err := visor.GetDBVersion(db) + require.NoError(t, err) + require.NotNil(t, v) + + appVersion := semver.MustParse(tc.appVersion) + + expectVersion := appVersion + + if tc.dbVersion != "" { + dbVersion := semver.MustParse(tc.dbVersion) + if appVersion.LT(dbVersion) { + expectVersion = dbVersion + } + } + + require.Equal(t, expectVersion, *v) + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/skycoin/testdata/no-version.db b/vendor/github.com/SkycoinProject/skycoin/src/skycoin/testdata/no-version.db new file mode 100644 index 00000000..e69de29b diff --git a/vendor/github.com/SkycoinProject/skycoin/src/skycoin/testdata/version-0.24.1.db b/vendor/github.com/SkycoinProject/skycoin/src/skycoin/testdata/version-0.24.1.db new file mode 100644 index 00000000..673730d8 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/skycoin/testdata/version-0.24.1.db differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/skycoin/testdata/version-0.25.0.db b/vendor/github.com/SkycoinProject/skycoin/src/skycoin/testdata/version-0.25.0.db new file mode 100644 index 00000000..ef7b2ed3 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/skycoin/testdata/version-0.25.0.db differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/testutil/assert/assertions.go b/vendor/github.com/SkycoinProject/skycoin/src/testutil/assert/assertions.go new file mode 100644 index 00000000..53bcc851 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/testutil/assert/assertions.go @@ -0,0 +1,73 @@ +package testutil + +import ( + "fmt" + + logrus "github.com/sirupsen/logrus" + assert "github.com/stretchr/testify/assert" +) + +// didPanic returns true if the function passed to it panics. Otherwise, it returns false. +func didPanic(f assert.PanicTestFunc) (bool, interface{}) { + + didPanic := false + var message interface{} + func() { + + defer func() { + if message = recover(); message != nil { + didPanic = true + } + }() + + // call the target function + f() + + }() + + return didPanic, message +} + +// TestValuePredicate checks that a value meets certain condition +// This function type may be seen as a continuation of a test scenario. +// Assertions executed inside of it may be recorded to the calling context +// by accessing free-vars in function closure. +type TestValuePredicate func(value interface{}) (success bool) + +// PanicsWithCondition asserts that the code inside the specified PanicTestFunc panics, and that +// the recovered panic value meets a given condition. +// +// assert.PanicsWithCondition(t, func(value){ return assert.True(t, isCrazy(value)) }, func(){ GoCrazy() }) +// +// Returns whether the assertion was successful (true) or not (false). +func PanicsWithCondition(t assert.TestingT, condition TestValuePredicate, f assert.PanicTestFunc, msgAndArgs ...interface{}) bool { + + funcDidPanic, panicValue := didPanic(f) + if !funcDidPanic { + return assert.Fail(t, fmt.Sprintf("func %#v should panic\n\r\tPanic value:\t%v", f, panicValue), msgAndArgs...) + } + return condition(panicValue) +} + +// PanicsWithLogMessage asserts that the code inside the specified PanicTestFunc panics, and that +// an expected string is included in log message. +// +// assert.PanicsWithLogMessage(t, "Log msg", func(){ log.Panic("Log msg for X") }) +// +// Returns whether the assertion was successful (true) or not (false). +func PanicsWithLogMessage(t assert.TestingT, expectedMessage string, f assert.PanicTestFunc, msgAndArgs ...interface{}) bool { + return PanicsWithCondition(t, func(logValue interface{}) bool { + gotMessage, gotIt := "", false + if entry, isEntry := logValue.(*logrus.Entry); isEntry { + gotMessage, gotIt = entry.Message, true + } else { + if msg, isString := logValue.(string); isString { + gotMessage, gotIt = msg, true + } + } + if gotIt { + return assert.Contains(t, gotMessage, expectedMessage) + } + return assert.Fail(t, "expected string or log entry but got %T", logValue) + }, f, msgAndArgs) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/testutil/require/require.go b/vendor/github.com/SkycoinProject/skycoin/src/testutil/require/require.go new file mode 100644 index 00000000..04ac7fe7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/testutil/require/require.go @@ -0,0 +1,32 @@ +package require + +import ( + assert "github.com/stretchr/testify/assert" + require "github.com/stretchr/testify/require" + + _assert "github.com/SkycoinProject/skycoin/src/testutil/assert" +) + +// PanicsWithCondition asserts that the code inside the specified PanicTestFunc panics, and that +// the recovered panic value meets a given condition. +// +// assert.PanicsWithCondition(t, func(value){ return assert.True(t, isCrazy(value)) }, func(){ GoCrazy() }) +// +// Returns whether the assertion was successful (true) or not (false). +func PanicsWithCondition(t require.TestingT, condition _assert.TestValuePredicate, f assert.PanicTestFunc, msgAndArgs ...interface{}) { + if !_assert.PanicsWithCondition(t, condition, f, msgAndArgs...) { + t.FailNow() + } +} + +// PanicsWithLogMessage asserts that the code inside the specified PanicTestFunc panics, and that +// an expected string is included in log message. +// +// assert.PanicsWithLogMessage(t, "Log msg", func(){ log.Panic("Log msg for X") }) +// +// Returns whether the assertion was successful (true) or not (false). +func PanicsWithLogMessage(t require.TestingT, expectedMessage string, f assert.PanicTestFunc, msgAndArgs ...interface{}) { + if !_assert.PanicsWithLogMessage(t, expectedMessage, f, msgAndArgs) { + t.FailNow() + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/testutil/testutil.go b/vendor/github.com/SkycoinProject/skycoin/src/testutil/testutil.go new file mode 100644 index 00000000..586be5b9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/testutil/testutil.go @@ -0,0 +1,120 @@ +/* +Package testutil provides utility methods for testing +*/ +package testutil + +import ( + "crypto/rand" + "io/ioutil" + "os" + "testing" + + "github.com/boltdb/bolt" + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/bip32" + "github.com/SkycoinProject/skycoin/src/cipher/bip39" + "github.com/SkycoinProject/skycoin/src/cipher/bip44" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +// PrepareDB creates and opens a temporary test DB and returns it with a cleanup callback +func PrepareDB(t *testing.T) (*dbutil.DB, func()) { + f, err := ioutil.TempFile("", "testdb") + require.NoError(t, err) + + db, err := bolt.Open(f.Name(), 0700, nil) + require.NoError(t, err) + + return dbutil.WrapDB(db), func() { + err := db.Close() + if err != nil { + t.Logf("Failed to close database: %v", err) + } + + err = f.Close() + if err != nil { + t.Logf("Failed to close file: %v", err) + } + + err = os.Remove(f.Name()) + if err != nil { + t.Logf("Failed to remove temp file %s: %v", f.Name(), err) + } + } +} + +// RequireError requires that an error is not nil and that its message matches +func RequireError(t *testing.T, err error, msg string) { + t.Helper() + require.Error(t, err) + require.NotNil(t, err) + require.Equal(t, msg, err.Error()) +} + +// MakeAddress creates a cipher.Address +func MakeAddress() cipher.Address { + p, _ := cipher.GenerateKeyPair() + return cipher.AddressFromPubKey(p) +} + +// MakePubKey creates a cipher.PubKey +func MakePubKey() cipher.PubKey { + p, _ := cipher.GenerateKeyPair() + return p +} + +// RandBytes returns n random bytes +func RandBytes(t *testing.T, n int) []byte { + b := make([]byte, n) + _, err := rand.Read(b) + require.NoError(t, err) + return b +} + +// RandSHA256 returns a random SHA256 hash +func RandSHA256(t *testing.T) cipher.SHA256 { + return cipher.SumSHA256(RandBytes(t, 128)) +} + +// SHA256FromHex converts an SHA256 hex string to a cipher.SHA256 +func SHA256FromHex(t *testing.T, hex string) cipher.SHA256 { + sha, err := cipher.SHA256FromHex(hex) + require.NoError(t, err) + return sha +} + +// RandSig returns a random cipher.Sig +func RandSig(t *testing.T) cipher.Sig { + s, err := cipher.NewSig(RandBytes(t, 65)) + require.NoError(t, err) + return s +} + +// RequireFileExists requires that a file exists +func RequireFileExists(t *testing.T, fn string) os.FileInfo { + stat, err := os.Stat(fn) + require.NoError(t, err) + return stat +} + +// RequireFileNotExists requires that a file doesn't exist +func RequireFileNotExists(t *testing.T, fn string) { + _, err := os.Stat(fn) + require.True(t, os.IsNotExist(err)) +} + +// RandXPub creates a random xpub key +func RandXPub(t *testing.T) *bip32.PublicKey { + m := bip39.MustNewDefaultMnemonic() + s, err := bip39.NewSeed(m, "") + require.NoError(t, err) + c, err := bip44.NewCoin(s, bip44.CoinTypeSkycoin) + require.NoError(t, err) + x, err := c.Account(0) + require.NoError(t, err) + e, err := x.External() + require.NoError(t, err) + return e.PublicKey() +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/transaction/choose.go b/vendor/github.com/SkycoinProject/skycoin/src/transaction/choose.go new file mode 100644 index 00000000..f090d0b7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/transaction/choose.go @@ -0,0 +1,278 @@ +package transaction + +import ( + "bytes" + "errors" + "sort" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/util/fee" +) + +var ( + // ErrInsufficientBalance is returned if a wallet does not have enough balance for a spend + ErrInsufficientBalance = NewError(errors.New("balance is not sufficient")) + // ErrInsufficientHours is returned if a wallet does not have enough hours for a spend with requested hours + ErrInsufficientHours = NewError(errors.New("hours are not sufficient")) + // ErrZeroSpend is returned if a transaction is trying to spend 0 coins + ErrZeroSpend = NewError(errors.New("zero spend amount")) + // ErrNoUnspents is returned if a Create is called with no unspent outputs + ErrNoUnspents = NewError(errors.New("no unspents to spend")) +) + +// UxBalance is an intermediate representation of a UxOut for sorting and spend choosing +type UxBalance struct { + Hash cipher.SHA256 + BkSeq uint64 + Time uint64 + Address cipher.Address + Coins uint64 + InitialHours uint64 + Hours uint64 + SrcTransaction cipher.SHA256 +} + +// NewUxBalances converts coin.UxArray to []UxBalance. headTime is required to calculate coin hours. +func NewUxBalances(uxa coin.UxArray, headTime uint64) ([]UxBalance, error) { + uxb := make([]UxBalance, len(uxa)) + for i, ux := range uxa { + b, err := NewUxBalance(headTime, ux) + if err != nil { + return nil, err + } + uxb[i] = b + } + + return uxb, nil +} + +// NewUxBalance converts coin.UxOut to UxBalance. headTime is required to calculate coin hours. +func NewUxBalance(headTime uint64, ux coin.UxOut) (UxBalance, error) { + hours, err := ux.CoinHours(headTime) + if err != nil { + return UxBalance{}, err + } + + return UxBalance{ + Hash: ux.Hash(), + BkSeq: ux.Head.BkSeq, + Time: ux.Head.Time, + Address: ux.Body.Address, + Coins: ux.Body.Coins, + InitialHours: ux.Body.Hours, + Hours: hours, + SrcTransaction: ux.Body.SrcTransaction, + }, nil +} + +func uxBalancesSub(a, b []UxBalance) []UxBalance { + var x []UxBalance + + bMap := make(map[cipher.SHA256]struct{}, len(b)) + for _, i := range b { + bMap[i.Hash] = struct{}{} + } + + for _, i := range a { + if _, ok := bMap[i.Hash]; !ok { + x = append(x, i) + } + } + + return x +} + +// ChooseSpendsMinimizeUxOuts chooses uxout spends to satisfy an amount, using the least number of uxouts +// -- PRO: Allows more frequent spending, less waiting for confirmations, useful for exchanges. +// -- PRO: When transaction is volume is higher, transactions are prioritized by fee/size. Minimizing uxouts minimizes size. +// -- CON: Would make the unconfirmed pool grow larger. +// Users with high transaction frequency will want to use this so that they will not need to wait as frequently +// for unconfirmed spends to complete before sending more. +// Alternatively, or in addition to this, they should batch sends into single transactions. +func ChooseSpendsMinimizeUxOuts(uxa []UxBalance, coins, hours uint64) ([]UxBalance, error) { + return ChooseSpends(uxa, coins, hours, sortSpendsCoinsHighToLow) +} + +// sortSpendsCoinsHighToLow sorts uxout spends with highest balance to lowest +func sortSpendsCoinsHighToLow(uxa []UxBalance) { + sort.Slice(uxa, makeCmpUxOutByCoins(uxa, func(a, b uint64) bool { + return a > b + })) +} + +// ChooseSpendsMaximizeUxOuts chooses uxout spends to satisfy an amount, using the most number of uxouts +// See the pros and cons of ChooseSpendsMinimizeUxOuts. +// This should be the default mode, because this keeps the unconfirmed pool smaller which will allow +// the network to scale better. +func ChooseSpendsMaximizeUxOuts(uxa []UxBalance, coins, hours uint64) ([]UxBalance, error) { + return ChooseSpends(uxa, coins, hours, sortSpendsCoinsLowToHigh) +} + +// sortSpendsCoinsLowToHigh sorts uxout spends with lowest balance to highest +func sortSpendsCoinsLowToHigh(uxa []UxBalance) { + sort.Slice(uxa, makeCmpUxOutByCoins(uxa, func(a, b uint64) bool { + return a < b + })) +} + +// sortSpendsHoursLowToHigh sorts uxout spends with lowest hours to highest +func sortSpendsHoursLowToHigh(uxa []UxBalance) { + sort.Slice(uxa, makeCmpUxOutByHours(uxa, func(a, b uint64) bool { + return a < b + })) +} + +func makeCmpUxOutByCoins(uxa []UxBalance, coinsCmp func(a, b uint64) bool) func(i, j int) bool { + // Sort by: + // coins highest or lowest depending on coinsCmp + // hours lowest + // oldest first + // tie break with hash comparison + return func(i, j int) bool { + a := uxa[i] + b := uxa[j] + + if a.Coins == b.Coins { + if a.Hours == b.Hours { + if a.BkSeq == b.BkSeq { + return cmpUxBalanceByUxID(a, b) + } + return a.BkSeq < b.BkSeq + } + return a.Hours < b.Hours + } + return coinsCmp(a.Coins, b.Coins) + } +} + +func makeCmpUxOutByHours(uxa []UxBalance, hoursCmp func(a, b uint64) bool) func(i, j int) bool { + // Sort by: + // hours highest or lowest depending on hoursCmp + // coins lowest + // oldest first + // tie break with hash comparison + return func(i, j int) bool { + a := uxa[i] + b := uxa[j] + + if a.Hours == b.Hours { + if a.Coins == b.Coins { + if a.BkSeq == b.BkSeq { + return cmpUxBalanceByUxID(a, b) + } + return a.BkSeq < b.BkSeq + } + return a.Coins < b.Coins + } + return hoursCmp(a.Hours, b.Hours) + } +} + +func cmpUxBalanceByUxID(a, b UxBalance) bool { + cmp := bytes.Compare(a.Hash[:], b.Hash[:]) + if cmp == 0 { + logger.Panic("Duplicate UxOut when sorting") + } + return cmp < 0 +} + +// ChooseSpends chooses uxouts from a list of uxouts. +// It first chooses the uxout with the most number of coins that has nonzero coinhours. +// It then chooses uxouts with zero coinhours, ordered by sortStrategy +// It then chooses remaining uxouts with nonzero coinhours, ordered by sortStrategy +func ChooseSpends(uxa []UxBalance, coins, hours uint64, sortStrategy func([]UxBalance)) ([]UxBalance, error) { + if coins == 0 { + return nil, ErrZeroSpend + } + + if len(uxa) == 0 { + return nil, ErrNoUnspents + } + + for _, ux := range uxa { + if ux.Coins == 0 { + logger.Panic("UxOut coins are 0, can't spend") + return nil, errors.New("UxOut coins are 0, can't spend") + } + } + + // Split UxBalances into those with and without hours + var nonzero, zero []UxBalance + for _, ux := range uxa { + if ux.Hours == 0 { + zero = append(zero, ux) + } else { + nonzero = append(nonzero, ux) + } + } + + // Abort if there are no uxouts with non-zero coinhours, they can't be spent yet + if len(nonzero) == 0 { + return nil, fee.ErrTxnNoFee + } + + // Sort uxouts with hours lowest to highest and coins highest to lowest + sortSpendsCoinsHighToLow(nonzero) + + var haveCoins uint64 + var haveHours uint64 + var spending []UxBalance + + // Use the first nonzero output. This output will have the least hours possible + firstNonzero := nonzero[0] + if firstNonzero.Hours == 0 { + logger.Panic("balance has zero hours unexpectedly") + return nil, errors.New("balance has zero hours unexpectedly") + } + + nonzero = nonzero[1:] + + spending = append(spending, firstNonzero) + + haveCoins += firstNonzero.Coins + haveHours += firstNonzero.Hours + + if haveCoins >= coins && fee.RemainingHours(haveHours, params.UserVerifyTxn.BurnFactor) >= hours { + return spending, nil + } + + // Sort uxouts without hours according to the sorting strategy + sortStrategy(zero) + + for _, ux := range zero { + spending = append(spending, ux) + + haveCoins += ux.Coins + haveHours += ux.Hours + + if haveCoins >= coins { + break + } + } + + if haveCoins >= coins && fee.RemainingHours(haveHours, params.UserVerifyTxn.BurnFactor) >= hours { + return spending, nil + } + + // Sort remaining uxouts with hours according to the sorting strategy + sortStrategy(nonzero) + + for _, ux := range nonzero { + spending = append(spending, ux) + + haveCoins += ux.Coins + haveHours += ux.Hours + + if haveCoins >= coins && fee.RemainingHours(haveHours, params.UserVerifyTxn.BurnFactor) >= hours { + return spending, nil + } + } + + if haveCoins < coins { + return nil, ErrInsufficientBalance + } + + return nil, ErrInsufficientHours +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/transaction/choose_test.go b/vendor/github.com/SkycoinProject/skycoin/src/transaction/choose_test.go new file mode 100644 index 00000000..9b62cb92 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/transaction/choose_test.go @@ -0,0 +1,534 @@ +package transaction + +import ( + "bytes" + "math" + "math/rand" + "reflect" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/util/fee" +) + +func TestSortSpendsCoinsLowToHigh(t *testing.T) { + // UxBalances are sorted with Coins lowest, then following other order rules + orderedUxb := []UxBalance{ + { + Hash: testutil.RandSHA256(t), + BkSeq: 5, + Coins: 1, + Hours: 0, + }, + { + Hash: testutil.RandSHA256(t), + BkSeq: 3, + Coins: 10, + Hours: 1, + }, + { + Hash: testutil.RandSHA256(t), + BkSeq: 1, + Coins: 10, + Hours: 10, + }, + { + Hash: cipher.MustSHA256FromHex("bddf0aaf80f96c144f33ac8a27764a868d37e1c11e568063ebeb1367de859566"), + BkSeq: 2, + Coins: 10, + Hours: 10, + }, + { + Hash: cipher.MustSHA256FromHex("f569461182b0efe9a5c666e9a35c6602b351021c1803cc740aca548cf6db4cb2"), + BkSeq: 2, + Coins: 10, + Hours: 10, + }, + { + Hash: testutil.RandSHA256(t), + BkSeq: 4, + Coins: 100, + Hours: 100, + }, + } + + shuffleWorked := false + nShuffle := 20 + for i := 0; i < nShuffle; i++ { + // Shuffle the list + uxb := make([]UxBalance, len(orderedUxb)) + copy(uxb, orderedUxb) + + for i := range uxb { + j := rand.Intn(i + 1) + uxb[i], uxb[j] = uxb[j], uxb[i] + } + + // Sanity check that shuffling produces a new result + if !reflect.DeepEqual(uxb, orderedUxb) { + shuffleWorked = true + } + + sortSpendsCoinsLowToHigh(uxb) + + for i, ux := range uxb { + require.Equal(t, orderedUxb[i], ux, "index %d", i) + } + + verifySortedCoinsLowToHigh(t, uxb) + } + + require.True(t, shuffleWorked) + + nRand := 1000 + for i := 0; i < nRand; i++ { + uxb := makeRandomUxBalances(t) + + sortSpendsCoinsLowToHigh(uxb) + verifySortedCoinsLowToHigh(t, uxb) + } +} + +func TestSortSpendsCoinsHighToLow(t *testing.T) { + // UxBalances are sorted with Coins highest, then following other order rules + orderedUxb := []UxBalance{ + { + Hash: testutil.RandSHA256(t), + BkSeq: 4, + Coins: 10000, + Hours: 0, + }, + { + Hash: testutil.RandSHA256(t), + BkSeq: 10, + Coins: 1000, + Hours: 1, + }, + { + Hash: testutil.RandSHA256(t), + BkSeq: 4, + Coins: 100, + Hours: 100, + }, + { + Hash: testutil.RandSHA256(t), + BkSeq: 3, + Coins: 10, + Hours: 1, + }, + { + Hash: testutil.RandSHA256(t), + BkSeq: 1, + Coins: 10, + Hours: 10, + }, + { + Hash: cipher.MustSHA256FromHex("bddf0aaf80f96c144f33ac8a27764a868d37e1c11e568063ebeb1367de859566"), + BkSeq: 2, + Coins: 10, + Hours: 10, + }, + { + Hash: cipher.MustSHA256FromHex("f569461182b0efe9a5c666e9a35c6602b351021c1803cc740aca548cf6db4cb2"), + BkSeq: 2, + Coins: 10, + Hours: 10, + }, + } + + shuffleWorked := false + nShuffle := 20 + for i := 0; i < nShuffle; i++ { + // Shuffle the list + uxb := make([]UxBalance, len(orderedUxb)) + copy(uxb, orderedUxb) + + rand.Shuffle(len(uxb), func(i, j int) { + uxb[i], uxb[j] = uxb[j], uxb[i] + }) + + if !reflect.DeepEqual(uxb, orderedUxb) { + shuffleWorked = true + } + + sortSpendsCoinsHighToLow(uxb) + + for i, ux := range uxb { + require.Equal(t, orderedUxb[i], ux, "index %d", i) + } + + verifySortedCoinsHighToLow(t, uxb) + } + + require.True(t, shuffleWorked) + + nRand := 1000 + for i := 0; i < nRand; i++ { + uxb := makeRandomUxBalances(t) + + sortSpendsCoinsHighToLow(uxb) + verifySortedCoinsHighToLow(t, uxb) + } +} + +func TestSortSpendsHoursLowToHigh(t *testing.T) { + // UxBalances are sorted with Coins lowest, then following other order rules + orderedUxb := []UxBalance{ + { + Hash: testutil.RandSHA256(t), + BkSeq: 5, + Coins: 1, + Hours: 0, + }, + { + Hash: testutil.RandSHA256(t), + BkSeq: 3, + Coins: 10, + Hours: 1, + }, + { + Hash: testutil.RandSHA256(t), + BkSeq: 1, + Coins: 10, + Hours: 10, + }, + { + Hash: cipher.MustSHA256FromHex("bddf0aaf80f96c144f33ac8a27764a868d37e1c11e568063ebeb1367de859566"), + BkSeq: 2, + Coins: 10, + Hours: 10, + }, + { + Hash: cipher.MustSHA256FromHex("f569461182b0efe9a5c666e9a35c6602b351021c1803cc740aca548cf6db4cb2"), + BkSeq: 2, + Coins: 10, + Hours: 10, + }, + { + Hash: testutil.RandSHA256(t), + BkSeq: 4, + Coins: 100, + Hours: 100, + }, + } + + shuffleWorked := false + nShuffle := 20 + for i := 0; i < nShuffle; i++ { + // Shuffle the list + uxb := make([]UxBalance, len(orderedUxb)) + copy(uxb, orderedUxb) + + for i := range uxb { + j := rand.Intn(i + 1) + uxb[i], uxb[j] = uxb[j], uxb[i] + } + + // Sanity check that shuffling produces a new result + if !reflect.DeepEqual(uxb, orderedUxb) { + shuffleWorked = true + } + + sortSpendsHoursLowToHigh(uxb) + + for i, ux := range uxb { + require.Equal(t, orderedUxb[i], ux, "index %d", i) + } + + verifySortedHoursLowToHigh(t, uxb) + } + + require.True(t, shuffleWorked) + + nRand := 1000 + for i := 0; i < nRand; i++ { + uxb := makeRandomUxBalances(t) + + sortSpendsHoursLowToHigh(uxb) + verifySortedHoursLowToHigh(t, uxb) + } +} + +func TestChooseSpendsMaximizeUxOuts(t *testing.T) { + nRand := 10000 + for i := 0; i < nRand; i++ { + coins := uint64((rand.Intn(3)+1)*10 + rand.Intn(3)) // 10,20,30 + 0,1,2 + uxb := makeRandomUxBalances(t) + + verifyChosenCoins(t, uxb, coins, ChooseSpendsMaximizeUxOuts, func(a, b UxBalance) bool { + return a.Coins <= b.Coins + }) + } + + // 0 coins (error) + uxb := makeRandomUxBalances(t) + verifyChosenCoins(t, uxb, 0, ChooseSpendsMaximizeUxOuts, func(a, b UxBalance) bool { + return a.Coins <= b.Coins + }) + + // 0 coins in a UxBalance (panic) + uxb[1].Coins = 0 + require.Panics(t, func() { + verifyChosenCoins(t, uxb, 10, ChooseSpendsMaximizeUxOuts, func(a, b UxBalance) bool { + return a.Coins <= b.Coins + }) + }) + + // MaxUint64 coins (error) + uxb = makeRandomUxBalances(t) + verifyChosenCoins(t, uxb, math.MaxUint64, ChooseSpendsMinimizeUxOuts, func(a, b UxBalance) bool { + return a.Coins <= b.Coins + }) +} + +func TestChooseSpendsMinimizeUxOutsRandom(t *testing.T) { + nRand := 10000 + for i := 0; i < nRand; i++ { + coins := uint64((rand.Intn(3)+1)*10 + rand.Intn(3)) // 10,20,30 + 0,1,2 + uxb := makeRandomUxBalances(t) + + verifyChosenCoins(t, uxb, coins, ChooseSpendsMinimizeUxOuts, func(a, b UxBalance) bool { + return a.Coins >= b.Coins + }) + } + + // 0 coins (error) + uxb := makeRandomUxBalances(t) + verifyChosenCoins(t, uxb, 0, ChooseSpendsMinimizeUxOuts, func(a, b UxBalance) bool { + return a.Coins >= b.Coins + }) + + // 0 coins in a UxBalance (panic) + uxb[1].Coins = 0 + require.Panics(t, func() { + verifyChosenCoins(t, uxb, 10, ChooseSpendsMaximizeUxOuts, func(a, b UxBalance) bool { + return a.Coins >= b.Coins + }) + }) + + // MaxUint64 coins (error) + uxb = makeRandomUxBalances(t) + verifyChosenCoins(t, uxb, math.MaxUint64, ChooseSpendsMinimizeUxOuts, func(a, b UxBalance) bool { + return a.Coins >= b.Coins + }) +} + +func makeRandomUxBalances(t *testing.T) []UxBalance { + // Generate random 0-100 UxBalances + // Coins 1-10 (must be >0) + // Hours 0-10 + // BkSeq 0-10 + // Hash random + // Small ranges are used for Coins, Hours, BkSeq to increase likelihood + // that they collide and test deeper sorting comparisons + + n := rand.Intn(101) + uxb := make([]UxBalance, n) + + // Use a random max range for the hours' rand range to ensure enough + // balances have zero hours + hasZeroHoursRange := rand.Intn(3) + 1 + + for i := 0; i < n; i++ { + ux := UxBalance{ + Coins: uint64(rand.Intn(10) + 1), // 1-10 + Hours: uint64(rand.Intn(hasZeroHoursRange)), + BkSeq: uint64(rand.Intn(11)), // 0-10 + Hash: testutil.RandSHA256(t), + } + + uxb[i] = ux + } + + return uxb +} + +func verifyChosenCoins(t *testing.T, uxb []UxBalance, coins uint64, chooseSpends func([]UxBalance, uint64, uint64) ([]UxBalance, error), cmpCoins func(i, j UxBalance) bool) { + var haveZero, haveNonzero int + for _, ux := range uxb { + if ux.Hours == 0 { + haveZero++ + } else { + haveNonzero++ + } + } + + var totalCoins, totalHours uint64 + for _, ux := range uxb { + totalCoins += ux.Coins + totalHours += ux.Hours + } + + chosen, err := chooseSpends(uxb, coins, 0) + + if coins == 0 { + testutil.RequireError(t, err, ErrZeroSpend.Error()) + return + } + + if len(uxb) == 0 { + testutil.RequireError(t, err, ErrNoUnspents.Error()) + return + } + + if totalHours == 0 { + testutil.RequireError(t, err, fee.ErrTxnNoFee.Error()) + return + } + + if coins > totalCoins { + testutil.RequireError(t, err, ErrInsufficientBalance.Error()) + return + } + + require.NoError(t, err) + require.NotEqual(t, 0, len(chosen)) + + // Check that there are no duplicated spends chosen + uxMap := make(map[UxBalance]struct{}, len(chosen)) + for _, ux := range chosen { + _, ok := uxMap[ux] + require.False(t, ok) + uxMap[ux] = struct{}{} + } + + // The first chosen spend should have non-zero coin hours + require.NotEqual(t, uint64(0), chosen[0].Hours) + + // Outputs with zero hours should come before any outputs with non-zero hours, + // except for the first output + for i := range chosen { + if i <= 1 { + continue + } + + a := chosen[i-1] + b := chosen[i] + + if b.Hours == 0 { + require.Equal(t, uint64(0), a.Hours) + } + } + + // The initial UxBalance with hours should have more or equal coins than any other UxBalance with hours + // If it has equal coins, it should have less hours + for _, ux := range chosen[1:] { + if ux.Hours != 0 { + require.True(t, chosen[0].Coins >= ux.Coins) + + if chosen[0].Coins == ux.Coins { + require.True(t, chosen[0].Hours <= ux.Hours) + } + } + } + + var zeroBalances, nonzeroBalances []UxBalance + for _, ux := range chosen[1:] { + if ux.Hours == 0 { + zeroBalances = append(zeroBalances, ux) + } else { + nonzeroBalances = append(nonzeroBalances, ux) + } + } + + // Amongst the UxBalances with zero hours, they should be sorted as specified + verifySortedCoins(t, zeroBalances, cmpCoins) + + // Amongst the UxBalances with non-zero hours, they should be sorted as specified + verifySortedCoins(t, nonzeroBalances, cmpCoins) + + // If there are any extra UxBalances with non-zero hours, all of the zeros should have been chosen + if len(nonzeroBalances) > 0 { + require.Equal(t, haveZero, len(zeroBalances)) + } + + // Excessive UxBalances to satisfy the amount requested should not be included + var haveCoins uint64 + for i, ux := range chosen { + haveCoins += ux.Coins + if haveCoins >= coins { + require.Equal(t, len(chosen)-1, i) + } + } +} + +func verifySortedCoins(t *testing.T, uxb []UxBalance, cmpCoins func(a, b UxBalance) bool) { + if len(uxb) <= 1 { + return + } + + for i := range uxb { + if i == 0 { + continue + } + + a := uxb[i-1] + b := uxb[i] + + require.True(t, cmpCoins(a, b)) + + if a.Coins == b.Coins { + require.True(t, a.Hours <= b.Hours) + + if a.Hours == b.Hours { + require.True(t, a.BkSeq <= b.BkSeq) + + if a.BkSeq == b.BkSeq { + cmp := bytes.Compare(a.Hash[:], b.Hash[:]) + require.True(t, cmp < 0) + } + } + } + } +} + +func verifySortedCoinsLowToHigh(t *testing.T, uxb []UxBalance) { + verifySortedCoins(t, uxb, func(a, b UxBalance) bool { + return a.Coins <= b.Coins + }) +} + +func verifySortedCoinsHighToLow(t *testing.T, uxb []UxBalance) { + verifySortedCoins(t, uxb, func(a, b UxBalance) bool { + return a.Coins >= b.Coins + }) +} + +func verifySortedHours(t *testing.T, uxb []UxBalance, cmpHours func(a, b UxBalance) bool) { + if len(uxb) <= 1 { + return + } + + for i := range uxb { + if i == 0 { + continue + } + + a := uxb[i-1] + b := uxb[i] + + require.True(t, cmpHours(a, b)) + + if a.Hours == b.Hours { + require.True(t, a.Coins <= b.Coins) + + if a.Coins == b.Coins { + require.True(t, a.BkSeq <= b.BkSeq) + + if a.BkSeq == b.BkSeq { + cmp := bytes.Compare(a.Hash[:], b.Hash[:]) + require.True(t, cmp < 0) + } + } + } + } +} + +func verifySortedHoursLowToHigh(t *testing.T, uxb []UxBalance) { + verifySortedHours(t, uxb, func(a, b UxBalance) bool { + return a.Hours <= b.Hours + }) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/transaction/create.go b/vendor/github.com/SkycoinProject/skycoin/src/transaction/create.go new file mode 100644 index 00000000..795bb679 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/transaction/create.go @@ -0,0 +1,504 @@ +/* +Package transaction provides methods for creating transactions + +See package coin for the Transaction object itself +*/ +package transaction + +import ( + "bytes" + "errors" + "fmt" + "sort" + + "github.com/shopspring/decimal" + "github.com/sirupsen/logrus" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/util/fee" + "github.com/SkycoinProject/skycoin/src/util/logging" + "github.com/SkycoinProject/skycoin/src/util/mathutil" +) + +var ( + logger = logging.MustGetLogger("txn") +) + +// Create creates an unsigned transaction based upon Params. +// NOTE: Caller must ensure that auxs correspond to params.UxOuts options +// Outputs to spend are chosen from the pool of outputs provided. +// The outputs are chosen by the following procedure: +// - All outputs are merged into one list and are sorted coins highest, hours lowest, with the hash as a tiebreaker +// - Outputs are chosen from the beginning of this list, until the requested amount of coins is met. +// If hours are also specified, selection continues until the requested amount of hours are met. +// - If the total amount of coins in the chosen outputs is exactly equal to the requested amount of coins, +// such that there would be no change output but hours remain as change, another output will be chosen to create change, +// if the coinhour cost of adding that output is less than the coinhours that would be lost as change +// If receiving hours are not explicitly specified, hours are allocated amongst the receiving outputs proportional to the number of coins being sent to them. +// If the change address is not specified, the address whose bytes are lexically sorted first is chosen from the owners of the outputs being spent. +func Create(p Params, auxs coin.AddressUxOuts, headTime uint64) (*coin.Transaction, []UxBalance, error) { + return create(p, auxs, headTime, 0) +} + +func create(p Params, auxs coin.AddressUxOuts, headTime uint64, callCount int) (*coin.Transaction, []UxBalance, error) { + logger.WithFields(logrus.Fields{ + "params": p, + "nAuxs": len(auxs), + "headTime": headTime, + "callCount": callCount, + }).Info("create requested") + + if err := p.Validate(); err != nil { + return nil, nil, err + } + + txn := &coin.Transaction{} + + // Determine which unspents to spend + uxa := auxs.Flatten() + + uxb, err := NewUxBalances(uxa, headTime) + if err != nil { + return nil, nil, err + } + + // Reverse lookup set to recover the inputs + uxbMap := make(map[cipher.SHA256]UxBalance, len(uxb)) + for _, u := range uxb { + if _, ok := uxbMap[u.Hash]; ok { + return nil, nil, errors.New("Duplicate UxBalance in array") + } + uxbMap[u.Hash] = u + } + + // Calculate total coins and minimum hours to send + var totalOutCoins uint64 + var requestedHours uint64 + for _, to := range p.To { + totalOutCoins, err = mathutil.AddUint64(totalOutCoins, to.Coins) + if err != nil { + return nil, nil, NewError(fmt.Errorf("total output coins error: %v", err)) + } + + requestedHours, err = mathutil.AddUint64(requestedHours, to.Hours) + if err != nil { + return nil, nil, NewError(fmt.Errorf("total output hours error: %v", err)) + } + } + + // Use the MinimizeUxOuts strategy, to use least possible uxouts + // this will allow more frequent spending + // we don't need to check whether we have sufficient balance beforehand as ChooseSpends already checks that + spends, err := ChooseSpendsMinimizeUxOuts(uxb, totalOutCoins, requestedHours) + if err != nil { + return nil, nil, err + } + + // Calculate total coins and hours in spends + var totalInputCoins uint64 + var totalInputHours uint64 + for _, spend := range spends { + totalInputCoins, err = mathutil.AddUint64(totalInputCoins, spend.Coins) + if err != nil { + return nil, nil, err + } + + totalInputHours, err = mathutil.AddUint64(totalInputHours, spend.Hours) + if err != nil { + return nil, nil, err + } + + if err := txn.PushInput(spend.Hash); err != nil { + logger.Critical().WithError(err).Error("PushInput failed") + return nil, nil, err + } + } + + feeHours := fee.RequiredFee(totalInputHours, params.UserVerifyTxn.BurnFactor) + if feeHours == 0 { + // feeHours can only be 0 if totalInputHours is 0, and if totalInputHours was 0 + // then ChooseSpendsMinimizeUxOuts should have already returned an error + err := errors.New("Chosen spends have no coin hours, unexpectedly") + logger.Critical().WithError(err).WithField("totalInputHours", totalInputHours).Error() + return nil, nil, err + } + remainingHours := totalInputHours - feeHours + + switch p.HoursSelection.Type { + case HoursSelectionTypeManual: + for _, o := range p.To { + if err := txn.PushOutput(o.Address, o.Coins, o.Hours); err != nil { + logger.Critical().WithError(err).WithField("selectionType", HoursSelectionTypeManual).Error("PushOutput failed") + return nil, nil, err + } + } + + case HoursSelectionTypeAuto: + var addrHours []uint64 + + switch p.HoursSelection.Mode { + case HoursSelectionModeShare: + // multiply remaining hours after fee burn with share factor + hours, err := mathutil.Uint64ToInt64(remainingHours) + if err != nil { + return nil, nil, err + } + + allocatedHoursInt := p.HoursSelection.ShareFactor.Mul(decimal.New(hours, 0)).IntPart() + allocatedHours, err := mathutil.Int64ToUint64(allocatedHoursInt) + if err != nil { + return nil, nil, err + } + + toCoins := make([]uint64, len(p.To)) + for i, to := range p.To { + toCoins[i] = to.Coins + } + + addrHours, err = DistributeCoinHoursProportional(toCoins, allocatedHours) + if err != nil { + return nil, nil, err + } + default: + // This should have been caught by params.Validate() + logger.Panic("Invalid HoursSelection.Mode") + return nil, nil, errors.New("Invalid HoursSelection.Type") + } + + for i, out := range p.To { + out.Hours = addrHours[i] + if err := txn.PushOutput(out.Address, out.Coins, addrHours[i]); err != nil { + logger.Critical().WithError(err).WithField("selectionType", HoursSelectionTypeAuto).Error("PushOutput failed") + return nil, nil, err + } + } + + default: + // This should have been caught by params.Validate() + logger.Panic("Invalid HoursSelection.Type") + return nil, nil, errors.New("Invalid HoursSelection.Type") + } + + totalOutHours, err := txn.OutputHours() + if err != nil { + return nil, nil, err + } + + // Make sure we have enough coins and coin hours + // If we don't, and we called ChooseSpends, then ChooseSpends has a bug, as it should have returned this error already + if totalOutCoins > totalInputCoins { + logger.Critical().WithError(ErrInsufficientBalance).Error("Insufficient coins after choosing spends, this should not occur") + return nil, nil, ErrInsufficientBalance + } + + if totalOutHours > remainingHours { + logger.Critical().WithError(fee.ErrTxnInsufficientCoinHours).Error("Insufficient hours after choosing spends or distributing hours, this should not occur") + return nil, nil, fee.ErrTxnInsufficientCoinHours + } + + // Create change output + changeCoins := totalInputCoins - totalOutCoins + changeHours := remainingHours - totalOutHours + + logger.WithFields(logrus.Fields{ + "totalOutCoins": totalOutCoins, + "totalOutHours": totalOutHours, + "requestedHours": requestedHours, + "nUnspents": len(uxb), + "totalInputCoins": totalInputCoins, + "totalInputHours": totalInputHours, + "feeHours": feeHours, + "remainingHours": remainingHours, + "changeCoins": changeCoins, + "changeHours": changeHours, + "nSpends": len(spends), + "nInputs": len(txn.In), + }).Info("Calculated spend parameters") + + // If there are no change coins but there are change hours, try to add another + // input to save the change hours. + // This chooses an available input with the least number of coin hours; + // if the extra coin hour fee incurred by this additional input is less than + // the remaining coin hours, the input is added. + if changeCoins == 0 && changeHours > 0 { + logger.Info("Trying to recover change hours by forcing an extra input") + // Find the output with the least coin hours + // If size of the fee for this output is less than the changeHours, add it + // Update changeCoins and changeHours + z := uxBalancesSub(uxb, spends) + sortSpendsHoursLowToHigh(z) + if len(z) > 0 { + logger.Info("Extra input found, evaluating if it can recover change hours") + extra := z[0] + + // Calculate the new hours being spent + newTotalHours, err := mathutil.AddUint64(totalInputHours, extra.Hours) + if err != nil { + return nil, nil, err + } + + // Calculate the new fee for this new amount of hours + newFee := fee.RequiredFee(newTotalHours, params.UserVerifyTxn.BurnFactor) + if newFee < feeHours { + err := errors.New("updated fee after adding extra input for change is unexpectedly less than it was initially") + logger.WithError(err).Error() + return nil, nil, err + } + + // If the cost of adding this extra input is less than the amount of change hours we + // can save, use the input + additionalFee := newFee - feeHours + if additionalFee < changeHours { + logger.Info("Change hours can be recovered by forcing an extra input") + changeCoins = extra.Coins + + if extra.Hours < additionalFee { + err := errors.New("calculated additional fee is unexpectedly higher than the extra input's hours") + logger.WithError(err).Error() + return nil, nil, err + } + + additionalHours := extra.Hours - additionalFee + changeHours, err = mathutil.AddUint64(changeHours, additionalHours) + if err != nil { + return nil, nil, err + } + + spends = append(spends, extra) + + if err := txn.PushInput(extra.Hash); err != nil { + logger.Critical().WithError(err).Error("PushInput failed") + return nil, nil, err + } + + logger.WithFields(logrus.Fields{ + "changeCoins": changeCoins, + "changeHours": changeHours, + "nSpends": len(spends), + "nInputs": len(txn.In), + "newTotalHours": newTotalHours, + "newFee": "newFee", + "additionalFee": additionalFee, + "additionalHours": additionalHours, + }).Info("Recalculated spend parameters after forcing a change output") + } else { + logger.Info("Unable to recover change hours by forcing an extra input") + } + } else { + logger.Info("No more inputs left to use to recover change hours") + } + } + + // With auto share mode, if there are leftover hours and change couldn't be force-added, + // recalculate that share ratio at 100% + if changeCoins == 0 && changeHours > 0 && p.HoursSelection.Type == HoursSelectionTypeAuto && p.HoursSelection.Mode == HoursSelectionModeShare { + logger.Info("Recalculating share factor at 1.0 to avoid burning change hours") + oneDecimal := decimal.New(1, 0) + + if p.HoursSelection.ShareFactor.Equal(oneDecimal) { + err := errors.New("share factor is 1.0 but changeHours > 0 unexpectedly") + logger.Critical().WithError(err).Error() + return nil, nil, err + } + + // Double-check that we haven't already called create() once already - + // if for some reason the previous check fails, we'll end up in an infinite loop + if callCount > 0 { + err := errors.New("transaction.Create already fell back to share ratio 1.0") + logger.Critical().WithError(err).Error() + return nil, nil, err + } + + p.HoursSelection.ShareFactor = &oneDecimal + return create(p, auxs, headTime, 1) + } + + if changeCoins > 0 { + var changeAddress cipher.Address + if p.ChangeAddress != nil { + changeAddress = *p.ChangeAddress + } else { + // Choose a change address from the unspent outputs + // Sort spends by address, comparing bytes, and use the first + // This provides deterministic change address selection from a set of unspent outputs + if len(spends) == 0 { + return nil, nil, errors.New("spends is unexpectedly empty when choosing an automatic change address") + } + + addressBytes := make([][]byte, len(spends)) + for i, s := range spends { + addressBytes[i] = s.Address.Bytes() + } + + sort.Slice(addressBytes, func(i, j int) bool { + return bytes.Compare(addressBytes[i], addressBytes[j]) < 0 + }) + + var err error + changeAddress, err = cipher.AddressFromBytes(addressBytes[0]) + if err != nil { + logger.Critical().WithError(err).Error("cipher.AddressFromBytes failed for change address converted to bytes") + return nil, nil, err + } + + logger.WithField("addr", changeAddress).Info("Automatically selected a change address") + } + + logger.WithFields(logrus.Fields{ + "changeAddress": changeAddress, + "changeCoins": changeCoins, + "changeHours": changeHours, + }).Info("Adding a change output") + + if err := txn.PushOutput(changeAddress, changeCoins, changeHours); err != nil { + logger.Critical().WithError(err).Error("PushOutput failed") + return nil, nil, err + } + } + + // Initialize unsigned transaction + txn.Sigs = make([]cipher.Sig, len(txn.In)) + + if err := txn.UpdateHeader(); err != nil { + logger.Critical().WithError(err).Error("txn.UpdateHeader failed") + return nil, nil, err + } + + inputs := make([]UxBalance, len(txn.In)) + for i, h := range txn.In { + uxBalance, ok := uxbMap[h] + if !ok { + err := errors.New("Created transaction's input is not in the UxBalanceSet, this should not occur") + logger.Critical().WithError(err).Error() + return nil, nil, err + } + inputs[i] = uxBalance + } + + if err := verifyCreatedUnignedInvariants(p, txn, inputs); err != nil { + logger.Critical().WithError(err).Error("CreateTransaction created transaction that violates invariants, aborting") + return nil, nil, fmt.Errorf("Created transaction that violates invariants, this is a bug: %v", err) + } + + return txn, inputs, nil +} + +func verifyCreatedUnignedInvariants(p Params, txn *coin.Transaction, inputs []UxBalance) error { + if !txn.IsFullyUnsigned() { + return errors.New("Transaction is not fully unsigned") + } + + if err := VerifyCreatedInvariants(p, txn, inputs); err != nil { + return err + } + + return nil +} + +// VerifyCreatedInvariants checks that the transaction that was created matches expectations. +// Does not call visor verification methods because that causes import cycle due to the wallet package. +// daemon.Gateway checks that the transaction passes additional visor verification methods. +// TODO -- could fix the import cycle by having visor create the transaction, passing it to the wallet for verifying params and signing +// This method still compares some values of Params against the created txn and doesn't only verify that the txn is well formed +func VerifyCreatedInvariants(p Params, txn *coin.Transaction, inputs []UxBalance) error { + for _, o := range txn.Out { + // No outputs should be sent to the null address + if o.Address.Null() { + return errors.New("Output address is null") + } + + if o.Coins == 0 { + return errors.New("Output coins is 0") + } + } + + if len(txn.Out) != len(p.To) && len(txn.Out) != len(p.To)+1 { + return errors.New("Transaction has unexpected number of outputs") + } + + for i, o := range txn.Out[:len(p.To)] { + if o.Address != p.To[i].Address { + return errors.New("Output address does not match requested address") + } + + if o.Coins != p.To[i].Coins { + return errors.New("Output coins does not match requested coins") + } + + if p.To[i].Hours != 0 && o.Hours != p.To[i].Hours { + return errors.New("Output hours does not match requested hours") + } + } + + if len(txn.Sigs) != len(txn.In) { + return errors.New("Number of signatures does not match number of inputs") + } + + if len(txn.In) != len(inputs) { + return errors.New("Number of UxOut inputs does not match number of transaction inputs") + } + + for i, h := range txn.In { + if inputs[i].Hash != h { + return errors.New("Transaction input hash does not match UxOut inputs hash") + } + } + + inputsMap := make(map[cipher.SHA256]struct{}, len(inputs)) + + for _, i := range inputs { + if i.Hours < i.InitialHours { + return errors.New("Calculated input hours are unexpectedly less than the initial hours") + } + + if i.BkSeq == 0 { + if !i.SrcTransaction.Null() { + return errors.New("Input is the genesis UTXO but its source transaction hash is not null") + } + } else { + if i.SrcTransaction.Null() { + return errors.New("Input's source transaction hash is null") + } + } + + if i.Hash.Null() { + return errors.New("Input's hash is null") + } + + if _, ok := inputsMap[i.Hash]; ok { + return errors.New("Duplicate input in array") + } + + inputsMap[i.Hash] = struct{}{} + } + + var inputHours uint64 + for _, i := range inputs { + var err error + inputHours, err = mathutil.AddUint64(inputHours, i.Hours) + if err != nil { + return err + } + } + + var outputHours uint64 + for _, i := range txn.Out { + var err error + outputHours, err = mathutil.AddUint64(outputHours, i.Hours) + if err != nil { + return err + } + } + + if inputHours < outputHours { + return errors.New("Total input hours is less than the output hours") + } + + if inputHours-outputHours < fee.RequiredFee(inputHours, params.UserVerifyTxn.BurnFactor) { + return errors.New("Transaction will not satisfy required fee") + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/transaction/create_test.go b/vendor/github.com/SkycoinProject/skycoin/src/transaction/create_test.go new file mode 100644 index 00000000..c62a9051 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/transaction/create_test.go @@ -0,0 +1,796 @@ +package transaction + +import ( + "bytes" + "errors" + "math" + "math/rand" + "sort" + "testing" + "time" + + "github.com/shopspring/decimal" + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/util/fee" +) + +func TestCreate(t *testing.T) { + headTime := uint64(time.Now().UTC().Unix()) + seed := []byte("seed") + + // Generate first keys + _, secKeys := cipher.MustGenerateDeterministicKeyPairsSeed(seed, 11) + secKey := secKeys[0] + addr := cipher.MustAddressFromSecKey(secKey) + + var extraWalletAddrs []cipher.Address + for _, s := range secKeys[1:] { + extraWalletAddrs = append(extraWalletAddrs, cipher.MustAddressFromSecKey(s)) + } + + // Create unspent outputs + var uxouts []coin.UxOut + var originalUxouts []coin.UxOut + addrs := []cipher.Address{} + for i := 0; i < 10; i++ { + uxout := makeUxOut(t, secKey, 2e6, uint64(100+i)) + uxout.Head.Time = headTime + uxouts = append(uxouts, uxout) + originalUxouts = append(originalUxouts, uxout) + + a := testutil.MakeAddress() + addrs = append(addrs, a) + } + + // shuffle the uxouts to test that the uxout sorting during spend selection is working + rand.Shuffle(len(uxouts), func(i, j int) { + uxouts[i], uxouts[j] = uxouts[j], uxouts[i] + }) + + // Create extra unspent outputs. These have the same value as uxouts, but are spendable by + // keys held in extraWalletAddrs + extraUxouts := make([][]coin.UxOut, len(extraWalletAddrs)) + for j := range extraWalletAddrs { + s := secKeys[j+1] + + var uxouts []coin.UxOut + for i := 0; i < 10; i++ { + uxout := makeUxOut(t, s, 2e6, uint64(100+i)) + uxout.Head.Time = headTime + uxouts = append(uxouts, uxout) + } + + extraUxouts[j] = uxouts + } + + // Create unspent outputs with no hours + var uxoutsNoHours []coin.UxOut + for i := 0; i < 10; i++ { + uxout := makeUxOut(t, secKey, 2e6, 0) + uxout.Head.Time = headTime + uxoutsNoHours = append(uxoutsNoHours, uxout) + } + + // shuffle the uxouts to test that the uxout sorting during spend selection is working + rand.Shuffle(len(uxoutsNoHours), func(i, j int) { + uxoutsNoHours[i], uxoutsNoHours[j] = uxoutsNoHours[j], uxoutsNoHours[i] + }) + + changeAddress := testutil.MakeAddress() + + validParams := Params{ + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + ChangeAddress: &changeAddress, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 10, + Coins: 1e6, + }, + }, + } + + newShareFactor := func(a string) *decimal.Decimal { + d, err := decimal.NewFromString(a) + require.NoError(t, err) + return &d + } + + firstAddress := func(uxa coin.UxArray) cipher.Address { + require.NotEmpty(t, uxa) + + addresses := make([]cipher.Address, len(uxa)) + for i, a := range uxa { + addresses[i] = a.Body.Address + } + + sort.Slice(addresses, func(i, j int) bool { + x := addresses[i].Bytes() + y := addresses[j].Bytes() + return bytes.Compare(x, y) < 0 + }) + + return addresses[0] + } + + cases := []struct { + name string + err error + params Params + unspents []coin.UxOut + addressUnspents coin.AddressUxOuts + chosenUnspents []coin.UxOut + headTime uint64 + changeOutput *coin.TransactionOutput + toExpectedHours []uint64 + }{ + { + name: "params invalid", + params: Params{}, + err: NewError(errors.New("To is required")), + }, + + { + name: "overflowing coin hours in params", + params: Params{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: math.MaxUint64, + Coins: 1e6, + }, + { + Address: addrs[1], + Hours: 1, + Coins: 1e6, + }, + }, + }, + err: NewError(errors.New("total output hours error: uint64 addition overflow")), + }, + + { + name: "overflowing coins in params", + params: Params{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 10, + Coins: math.MaxUint64, + }, + { + Address: addrs[1], + Hours: 1, + Coins: 1, + }, + }, + }, + err: NewError(errors.New("total output coins error: uint64 addition overflow")), + }, + + { + name: "no unspents", + params: Params{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 10, + Coins: 1e6, + }, + }, + }, + err: ErrNoUnspents, + }, + + { + name: "insufficient coins", + params: Params{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 10, + Coins: 100e6, + }, + }, + }, + unspents: uxouts[:1], + err: ErrInsufficientBalance, + }, + + { + name: "insufficient hours", + params: Params{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 100e6, + Coins: 1e6, + }, + }, + }, + unspents: uxouts[:1], + err: ErrInsufficientHours, + }, + + { + name: "manual, 1 output, no change", + params: Params{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 90, + Coins: 2e6, + }, + }, + }, + unspents: uxouts, + chosenUnspents: []coin.UxOut{originalUxouts[0]}, + }, + + // TODO -- belongs in visor_wallet_test.go + // { + // name: "manual, 1 output, no change, unknown address in auxs", + // params: Params{ + // ChangeAddress: &changeAddress, + // HoursSelection: HoursSelection{ + // Type: HoursSelectionTypeManual, + // }, + // Wallet: CreateTransactionWalletParams{}, + // To: []coin.TransactionOutput{ + // { + // Address: addrs[0], + // Hours: 50, + // Coins: 2e6, + // }, + // }, + // }, + // addressUnspents: coin.AddressUxOuts{ + // testutil.MakeAddress(): []coin.UxOut{extraUxouts[0][0]}, + // }, + // err: ErrUnknownAddress, + // }, + + { + name: "manual, 1 output, change", + params: Params{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 130, + Coins: 2e6 + 1, + }, + }, + }, + unspents: uxouts, + chosenUnspents: []coin.UxOut{originalUxouts[0], originalUxouts[1]}, + changeOutput: &coin.TransactionOutput{ + Address: changeAddress, + Hours: 50, + Coins: 2e6 - 1, + }, + }, + + { + name: "manual, 1 output, change, unspecified change address", + params: Params{ + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 50, + Coins: 2e6 + 1, + }, + }, + }, + unspents: uxouts, + chosenUnspents: []coin.UxOut{originalUxouts[0], originalUxouts[1]}, + changeOutput: &coin.TransactionOutput{ + Address: firstAddress([]coin.UxOut{originalUxouts[0], originalUxouts[1]}), + Hours: 130, + Coins: 2e6 - 1, + }, + }, + + { + // there are leftover coin hours and an additional input is added + // to force change to save the leftover coin hours + name: "manual, 1 output, forced change", + params: Params{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 0, + Coins: 2e6 * 2, + }, + }, + }, + unspents: uxouts, + chosenUnspents: []coin.UxOut{originalUxouts[0], originalUxouts[1], originalUxouts[2]}, + changeOutput: &coin.TransactionOutput{ + Address: changeAddress, + Hours: 272, + Coins: 2e6, + }, + }, + + { + // there are leftover coin hours and no coins change, + // but there are no more unspents to use to force a change output + name: "manual, 1 output, forced change rejected no more unspents", + params: Params{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 80, + Coins: 2e6 * 2, + }, + }, + }, + unspents: originalUxouts[:2], + chosenUnspents: []coin.UxOut{originalUxouts[0], originalUxouts[1]}, + changeOutput: nil, + }, + + { + // there are leftover coin hours and no coins change, + // but the hours cost of saving them with an additional input is less than is leftover + name: "manual, 1 output, forced change rejected", + params: Params{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 175, + Coins: 2e6 * 2, + }, + }, + }, + unspents: uxouts, + chosenUnspents: []coin.UxOut{originalUxouts[0], originalUxouts[1]}, + changeOutput: nil, + }, + + { + name: "manual, multiple outputs", + params: Params{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 50, + Coins: 1e6, + }, + { + Address: addrs[0], + Hours: 50, + Coins: 1e6 + 1, + }, + { + Address: addrs[1], + Hours: 70, + Coins: 2e6, + }, + }, + }, + unspents: uxouts, + chosenUnspents: []coin.UxOut{originalUxouts[0], originalUxouts[1], originalUxouts[2]}, + changeOutput: &coin.TransactionOutput{ + Address: changeAddress, + Hours: 102, + Coins: 2e6 - 1, + }, + }, + + { + name: "manual, multiple outputs, varied addressUnspents", + params: Params{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 50, + Coins: 1e6, + }, + { + Address: addrs[0], + Hours: 50, + Coins: 1e6 + 1, + }, + { + Address: addrs[1], + Hours: 70, + Coins: 2e6, + }, + }, + }, + addressUnspents: coin.AddressUxOuts{ + extraWalletAddrs[0]: []coin.UxOut{extraUxouts[0][0]}, + extraWalletAddrs[3]: []coin.UxOut{extraUxouts[3][1], extraUxouts[3][2]}, + extraWalletAddrs[5]: []coin.UxOut{extraUxouts[5][6]}, + }, + chosenUnspents: []coin.UxOut{extraUxouts[0][0], extraUxouts[3][1], extraUxouts[3][2]}, + changeOutput: &coin.TransactionOutput{ + Address: changeAddress, + Hours: 102, + Coins: 2e6 - 1, + }, + }, + + { + name: "auto, multiple outputs, share factor 0.5", + params: Params{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeAuto, + Mode: HoursSelectionModeShare, + ShareFactor: newShareFactor("0.5"), + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Coins: 1e6, + }, + { + Address: addrs[0], + Coins: 2e6, + }, + { + Address: addrs[1], + Coins: 2e6, + }, + { + Address: addrs[4], + Coins: 1e3, + }, + }, + }, + unspents: uxouts, + chosenUnspents: []coin.UxOut{originalUxouts[0], originalUxouts[1], originalUxouts[2]}, + changeOutput: &coin.TransactionOutput{ + Address: changeAddress, + Hours: 136, + Coins: 2e6 - (1e6 + 1e3), + }, + toExpectedHours: []uint64{27, 54, 54, 1}, + }, + + { + name: "auto, multiple outputs, share factor 0.5, switch to 1.0 because no change could be made", + params: Params{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeAuto, + Mode: HoursSelectionModeShare, + ShareFactor: newShareFactor("0.5"), + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Coins: 1e6, + }, + { + Address: addrs[0], + Coins: 2e6, + }, + { + Address: addrs[1], + Coins: 2e6, + }, + { + Address: addrs[4], + Coins: 1e6 - 1e3, + }, + { + Address: addrs[4], + Coins: 1e3, + }, + }, + }, + unspents: []coin.UxOut{originalUxouts[0], originalUxouts[1], originalUxouts[2]}, + chosenUnspents: []coin.UxOut{originalUxouts[0], originalUxouts[1], originalUxouts[2]}, + toExpectedHours: []uint64{46, 90, 90, 45, 1}, + }, + + { + name: "auto, multiple outputs, share factor 0", + params: Params{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeAuto, + Mode: HoursSelectionModeShare, + ShareFactor: newShareFactor("0"), + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Coins: 1e6, + }, + { + Address: addrs[0], + Coins: 2e6, + }, + { + Address: addrs[1], + Coins: 2e6, + }, + { + Address: addrs[4], + Coins: 1e3, + }, + }, + }, + unspents: uxouts, + chosenUnspents: []coin.UxOut{originalUxouts[0], originalUxouts[1], originalUxouts[2]}, + changeOutput: &coin.TransactionOutput{ + Address: changeAddress, + Hours: 272, + Coins: 2e6 - (1e6 + 1e3), + }, + toExpectedHours: []uint64{0, 0, 0, 0}, + }, + + { + name: "auto, multiple outputs, share factor 1", + params: Params{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeAuto, + Mode: HoursSelectionModeShare, + ShareFactor: newShareFactor("1"), + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Coins: 1e6, + }, + { + Address: addrs[0], + Coins: 2e6, + }, + { + Address: addrs[1], + Coins: 2e6, + }, + { + Address: addrs[4], + Coins: 1e3, + }, + }, + }, + unspents: uxouts, + chosenUnspents: []coin.UxOut{originalUxouts[0], originalUxouts[1], originalUxouts[2]}, + changeOutput: &coin.TransactionOutput{ + Address: changeAddress, + Hours: 0, + Coins: 2e6 - (1e6 + 1e3), + }, + toExpectedHours: []uint64{55, 108, 108, 1}, + }, + + { + name: "no coin hours in inputs", + unspents: uxoutsNoHours[:], + params: Params{ + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + ChangeAddress: &changeAddress, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 10, + Coins: 1e6, + }, + }, + }, + err: fee.ErrTxnNoFee, + }, + + { + name: "duplicate unspent output", + unspents: append(uxouts, uxouts[:2]...), + params: validParams, + err: errors.New("Duplicate UxBalance in array"), + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + if tc.headTime == 0 { + tc.headTime = headTime + } + + addrUxOuts := coin.AddressUxOuts{ + addr: tc.unspents, + } + + if tc.addressUnspents != nil { + addrUxOuts = tc.addressUnspents + } + + unspents := make(map[cipher.SHA256]coin.UxOut) + for _, uxs := range addrUxOuts { + for _, ux := range uxs { + unspents[ux.Hash()] = ux + } + } + + t.Log("len of addrUxOuts:", len(addrUxOuts.Flatten())) + txn, inputs, err := Create(tc.params, addrUxOuts, tc.headTime) + require.Equal(t, tc.err, err, "%v != %v", tc.err, err) + if tc.err != nil { + return + } + + err = txn.VerifyUnsigned() + require.NoError(t, err) + + t.Log("len of txn.In:", len(txn.In)) + require.Equal(t, len(inputs), len(txn.In)) + + // Checks duplicate inputs in array + inputsMap := make(map[cipher.SHA256]struct{}) + for _, i := range inputs { + _, ok := inputsMap[i.Hash] + require.False(t, ok) + inputsMap[i.Hash] = struct{}{} + } + + for i, inUxid := range txn.In { + _, ok := unspents[inUxid] + require.True(t, ok) + + require.Equal(t, inUxid, inputs[i].Hash) + } + + // Compare the transaction inputs + chosenUnspents := make([]coin.UxOut, len(tc.chosenUnspents)) + chosenUnspentHashes := make([]cipher.SHA256, len(tc.chosenUnspents)) + for i, u := range tc.chosenUnspents { + chosenUnspents[i] = u + chosenUnspentHashes[i] = u.Hash() + t.Log(u.Hash()) + } + + sort.Slice(chosenUnspentHashes, func(i, j int) bool { + return bytes.Compare(chosenUnspentHashes[i][:], chosenUnspentHashes[j][:]) < 0 + }) + sort.Slice(chosenUnspents, func(i, j int) bool { + h1 := chosenUnspents[i].Hash() + h2 := chosenUnspents[j].Hash() + return bytes.Compare(h1[:], h2[:]) < 0 + }) + + sortedTxnIn := make([]cipher.SHA256, len(txn.In)) + copy(sortedTxnIn[:], txn.In[:]) + + sort.Slice(sortedTxnIn, func(i, j int) bool { + return bytes.Compare(sortedTxnIn[i][:], sortedTxnIn[j][:]) < 0 + }) + + t.Log(len(chosenUnspentHashes)) + t.Log(len(sortedTxnIn)) + t.Log(len(txn.In)) + require.Equal(t, chosenUnspentHashes, sortedTxnIn) + + sort.Slice(inputs, func(i, j int) bool { + h1 := inputs[i].Hash + h2 := inputs[j].Hash + return bytes.Compare(h1[:], h2[:]) < 0 + }) + + chosenUnspentsUxBalances := make([]UxBalance, len(chosenUnspents)) + for i, o := range chosenUnspents { + b, err := NewUxBalance(tc.headTime, o) + require.NoError(t, err) + chosenUnspentsUxBalances[i] = b + } + + require.Equal(t, chosenUnspentsUxBalances, inputs) + + // Assign expected hours for comparison + var to []coin.TransactionOutput + to = append(to, tc.params.To...) + + if len(tc.toExpectedHours) != 0 { + require.Equal(t, len(tc.toExpectedHours), len(to)) + for i, h := range tc.toExpectedHours { + to[i].Hours = h + } + } + + // Add the change output if specified + if tc.changeOutput != nil { + to = append(to, *tc.changeOutput) + } + + // Compare transaction outputs + require.Equal(t, to, txn.Out) + }) + } +} + +func makeUxOut(t *testing.T, s cipher.SecKey, coins, hours uint64) coin.UxOut { //nolint:unparam + body := makeUxBody(t, s, coins, hours) + tm := rand.Int31n(1000) + seq := rand.Int31n(100) + return coin.UxOut{ + Head: coin.UxHead{ + Time: uint64(tm), + BkSeq: uint64(seq), + }, + Body: body, + } +} + +func makeUxBody(t *testing.T, s cipher.SecKey, coins, hours uint64) coin.UxBody { + p := cipher.MustPubKeyFromSecKey(s) + return coin.UxBody{ + SrcTransaction: cipher.SumSHA256(testutil.RandBytes(t, 128)), + Address: cipher.AddressFromPubKey(p), + Coins: coins, + Hours: hours, + } +} + +func TestDecimalPtrEqual(t *testing.T) { + // Sanity check for decimal comparison after converting to a pointer; + // if this test fails then the Create method can go into an infinite loop + oneDecimal := decimal.New(1, 0) + oneDecimalPtr := &oneDecimal + oneDecimal2 := decimal.New(1, 0) + require.True(t, oneDecimalPtr.Equal(oneDecimal2)) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/transaction/hours.go b/vendor/github.com/SkycoinProject/skycoin/src/transaction/hours.go new file mode 100644 index 00000000..93997ca1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/transaction/hours.go @@ -0,0 +1,165 @@ +package transaction + +import ( + "errors" + "math/big" + + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/util/fee" + "github.com/SkycoinProject/skycoin/src/util/mathutil" +) + +// DistributeSpendHours calculates how many coin hours to transfer to the change address and how +// many to transfer to each of the other destination addresses. +// Input hours are split by BurnFactor (rounded down) to meet the fee requirement. +// The remaining hours are split in half, one half goes to the change address +// and the other half goes to the destination addresses. +// If the remaining hours are an odd number, the change address gets the extra hour. +// If the amount assigned to the destination addresses is not perfectly divisible by the +// number of destination addresses, the extra hours are distributed to some of these addresses. +// Returns the number of hours to send to the change address, +// an array of length nAddrs with the hours to give to each destination address, +// and a sum of these values. +func DistributeSpendHours(inputHours, nAddrs uint64, haveChange bool) (uint64, []uint64, uint64) { + feeHours := fee.RequiredFee(inputHours, params.UserVerifyTxn.BurnFactor) + remainingHours := inputHours - feeHours + + var changeHours uint64 + if haveChange { + // Split the remaining hours between the change output and the other outputs + changeHours = remainingHours / 2 + + // If remainingHours is an odd number, give the extra hour to the change output + if remainingHours%2 == 1 { + changeHours++ + } + } + + // Distribute the remaining hours equally amongst the destination outputs + remainingAddrHours := remainingHours - changeHours + addrHoursShare := remainingAddrHours / nAddrs + + // Due to integer division, extra coin hours might remain after dividing by len(toAddrs) + // Allocate these extra hours to the toAddrs + addrHours := make([]uint64, nAddrs) + for i := range addrHours { + addrHours[i] = addrHoursShare + } + + extraHours := remainingAddrHours - (addrHoursShare * nAddrs) + i := 0 + for extraHours > 0 { + addrHours[i] = addrHours[i] + 1 + i++ + extraHours-- + } + + // Assert that the hour calculation is correct + var spendHours uint64 + for _, h := range addrHours { + spendHours += h + } + spendHours += changeHours + if spendHours != remainingHours { + logger.Panicf("spendHours != remainingHours (%d != %d), calculation error", spendHours, remainingHours) + } + + return changeHours, addrHours, spendHours +} + +// DistributeCoinHoursProportional distributes hours amongst coins proportional to the coins amount +func DistributeCoinHoursProportional(coins []uint64, hours uint64) ([]uint64, error) { + if len(coins) == 0 { + return nil, errors.New("DistributeCoinHoursProportional coins array must not be empty") + } + + coinsInt := make([]*big.Int, len(coins)) + + var total uint64 + for i, c := range coins { + if c == 0 { + return nil, errors.New("DistributeCoinHoursProportional coins array has a zero value") + } + + var err error + total, err = mathutil.AddUint64(total, c) + if err != nil { + return nil, err + } + + cInt64, err := mathutil.Uint64ToInt64(c) + if err != nil { + return nil, err + } + + coinsInt[i] = big.NewInt(cInt64) + } + + totalInt64, err := mathutil.Uint64ToInt64(total) + if err != nil { + return nil, err + } + totalInt := big.NewInt(totalInt64) + + hoursInt64, err := mathutil.Uint64ToInt64(hours) + if err != nil { + return nil, err + } + hoursInt := big.NewInt(hoursInt64) + + var assignedHours uint64 + addrHours := make([]uint64, len(coins)) + for i, c := range coinsInt { + // Scale the ratio of coins to total coins proportionally by calculating + // (coins * totalHours) / totalCoins + // The remainder is truncated, remaining hours are appended after this + num := &big.Int{} + num.Mul(c, hoursInt) + + fracInt := big.Int{} + fracInt.Div(num, totalInt) + + if !fracInt.IsUint64() { + return nil, errors.New("DistributeCoinHoursProportional calculated fractional hours is not representable as a uint64") + } + + fracHours := fracInt.Uint64() + + addrHours[i] = fracHours + assignedHours, err = mathutil.AddUint64(assignedHours, fracHours) + if err != nil { + return nil, err + } + } + + if hours < assignedHours { + return nil, errors.New("DistributeCoinHoursProportional assigned hours exceeding input hours, this is a bug") + } + + remainingHours := hours - assignedHours + + if remainingHours > uint64(len(coins)) { + return nil, errors.New("DistributeCoinHoursProportional remaining hours exceed len(coins), this is a bug") + } + + // For remaining hours lost due to fractional cutoff when scaling, + // first provide at least 1 coin hour to coins that were assigned 0. + i := 0 + for remainingHours > 0 && i < len(coins) { + if addrHours[i] == 0 { + addrHours[i] = 1 + remainingHours-- + } + i++ + } + + // Then, assign the extra coin hours + i = 0 + for remainingHours > 0 { + addrHours[i] = addrHours[i] + 1 + remainingHours-- + i++ + } + + return addrHours, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/transaction/hours_test.go b/vendor/github.com/SkycoinProject/skycoin/src/transaction/hours_test.go new file mode 100644 index 00000000..d56a8ed2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/transaction/hours_test.go @@ -0,0 +1,665 @@ +package transaction + +import ( + "errors" + "fmt" + "math" + "math/rand" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/util/fee" + "github.com/SkycoinProject/skycoin/src/util/mathutil" +) + +func TestDistributeCoinHoursProportional(t *testing.T) { + cases := []struct { + name string + coins []uint64 + hours uint64 + output []uint64 + err error + }{ + { + name: "no coins", + hours: 1, + err: errors.New("DistributeCoinHoursProportional coins array must not be empty"), + }, + { + name: "coins have 0 in them", + coins: []uint64{1, 2, 0, 3}, + hours: 1, + err: errors.New("DistributeCoinHoursProportional coins array has a zero value"), + }, + { + name: "total coins too large while adding", + coins: []uint64{10, math.MaxUint64 - 9}, + hours: 1, + err: mathutil.ErrUint64AddOverflow, + }, + { + name: "total coins too large after adding", + coins: []uint64{10, math.MaxInt64}, + hours: 1, + err: mathutil.ErrUint64OverflowsInt64, + }, + { + name: "single coin too large", + coins: []uint64{10, math.MaxInt64 + 1}, + hours: 1, + err: mathutil.ErrUint64OverflowsInt64, + }, + { + name: "hours too large", + coins: []uint64{10}, + hours: math.MaxInt64 + 1, + err: mathutil.ErrUint64OverflowsInt64, + }, + + { + name: "valid, one input", + coins: []uint64{1}, + hours: 1, + output: []uint64{1}, + }, + + { + name: "zero hours", + coins: []uint64{1}, + hours: 0, + output: []uint64{0}, + }, + + { + name: "valid, multiple inputs, all equal", + coins: []uint64{2, 4, 8, 16}, + hours: 30, + output: []uint64{2, 4, 8, 16}, + }, + + { + name: "valid, multiple inputs, rational division in coins and hours", + coins: []uint64{2, 4, 8, 16}, + hours: 30, + output: []uint64{2, 4, 8, 16}, + }, + + { + name: "valid, multiple inputs, rational division in coins, irrational in hours", + coins: []uint64{2, 4, 8, 16}, + hours: 31, + output: []uint64{3, 4, 8, 16}, + }, + + { + name: "valid, multiple inputs, irrational division in coins, rational in hours", + coins: []uint64{2, 3, 5, 7, 11, 13}, + hours: 41, + output: []uint64{2, 3, 5, 7, 11, 13}, + }, + + { + name: "valid, multiple inputs, irrational division in coins and hours", + coins: []uint64{2, 3, 5, 7, 11, 13}, + hours: 50, + output: []uint64{3, 4, 7, 8, 13, 15}, + }, + + { + name: "valid, multiple inputs that would receive 0 hours but get compensated from remainder as priority", + coins: []uint64{16, 8, 4, 2, 1, 1}, + hours: 14, + output: []uint64{7, 3, 1, 1, 1, 1}, + }, + + { + name: "not enough hours for everyone", + coins: []uint64{1, 1, 1, 1, 1}, + hours: 1, + output: []uint64{1, 0, 0, 0, 0}, + }, + + { + name: "not enough hours for everyone 2", + coins: []uint64{1, 1, 1, 1, 1}, + hours: 3, + output: []uint64{1, 1, 1, 0, 0}, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + hours, err := DistributeCoinHoursProportional(tc.coins, tc.hours) + if tc.err != nil { + require.Equal(t, tc.err, err) + } else { + require.NoError(t, err) + require.Equal(t, tc.output, hours) + } + }) + } + + // Randomized tests + iterations := 10000 + maxCoinsLen := 300 + maxMaxCoins := 100000 + maxHours := 15000000 + coins := make([]uint64, maxCoinsLen) + for i := 0; i < iterations; i++ { + coinsLen := rand.Intn(maxCoinsLen) + 1 + + maxCoins := rand.Intn(maxMaxCoins) + 1 + + var totalCoins uint64 + for i := 0; i < coinsLen; i++ { + coins[i] = uint64(rand.Intn(maxCoins) + 1) + + var err error + totalCoins, err = mathutil.AddUint64(totalCoins, coins[i]) + require.NoError(t, err) + } + + hours := uint64(rand.Intn(maxHours)) + + output, err := DistributeCoinHoursProportional(coins[:coinsLen], hours) + require.NoError(t, err) + + require.Equal(t, coinsLen, len(output)) + + var totalHours uint64 + for _, h := range output { + if hours >= totalCoins { + require.NotEqual(t, uint64(0), h) + } + + var err error + totalHours, err = mathutil.AddUint64(totalHours, h) + require.NoError(t, err) + } + + require.Equal(t, hours, totalHours) + } +} + +func TestDistributeSpendHours(t *testing.T) { + originalBurnFactor := params.UserVerifyTxn.BurnFactor + + cases := []struct { + burnFactor uint32 + cases []distributeSpendHoursTestCase + }{ + {2, burnFactor2TestCases}, + {3, burnFactor3TestCases}, + {10, burnFactor10TestCases}, + } + + tested := false + for _, tcc := range cases { + if tcc.burnFactor == params.UserVerifyTxn.BurnFactor { + tested = true + } + + for _, tc := range tcc.cases { + t.Run(tc.name, func(t *testing.T) { + params.UserVerifyTxn.BurnFactor = tcc.burnFactor + defer func() { + params.UserVerifyTxn.BurnFactor = originalBurnFactor + }() + + changeHours, addrHours, totalHours := DistributeSpendHours(tc.inputHours, tc.nAddrs, tc.haveChange) + require.Equal(t, tc.expectChangeHours, changeHours) + require.Equal(t, tc.expectAddrHours, addrHours) + require.Equal(t, tc.nAddrs, uint64(len(addrHours))) + + outputHours := changeHours + for _, h := range addrHours { + outputHours += h + } + require.True(t, tc.inputHours >= outputHours) + require.Equal(t, outputHours, totalHours) + + if tc.inputHours != 0 { + err := fee.VerifyTransactionFeeForHours(outputHours, tc.inputHours-outputHours, params.UserVerifyTxn.BurnFactor) + require.NoError(t, err) + } + }) + } + + t.Run(fmt.Sprintf("burn-factor-%d-range", tcc.burnFactor), func(t *testing.T) { + params.UserVerifyTxn.BurnFactor = tcc.burnFactor + defer func() { + params.UserVerifyTxn.BurnFactor = originalBurnFactor + }() + + // Tests over range of values + for inputHours := uint64(0); inputHours <= 1e3; inputHours++ { + for nAddrs := uint64(1); nAddrs < 16; nAddrs++ { + for _, haveChange := range []bool{true, false} { + name := fmt.Sprintf("inputHours=%d nAddrs=%d haveChange=%v", inputHours, nAddrs, haveChange) + t.Run(name, func(t *testing.T) { + changeHours, addrHours, totalHours := DistributeSpendHours(inputHours, nAddrs, haveChange) + require.Equal(t, nAddrs, uint64(len(addrHours))) + + var sumAddrHours uint64 + for _, h := range addrHours { + sumAddrHours += h + } + + if haveChange { + remainingHours := (inputHours - fee.RequiredFee(inputHours, params.UserVerifyTxn.BurnFactor)) + splitRemainingHours := remainingHours / 2 + require.True(t, changeHours == splitRemainingHours || changeHours == splitRemainingHours+1) + require.Equal(t, splitRemainingHours, sumAddrHours) + } else { + require.Equal(t, uint64(0), changeHours) + require.Equal(t, inputHours-fee.RequiredFee(inputHours, params.UserVerifyTxn.BurnFactor), sumAddrHours) + } + + outputHours := sumAddrHours + changeHours + require.True(t, inputHours >= outputHours) + require.Equal(t, outputHours, totalHours) + + if inputHours != 0 { + err := fee.VerifyTransactionFeeForHours(outputHours, inputHours-outputHours, params.UserVerifyTxn.BurnFactor) + require.NoError(t, err) + } + + // addrHours at the beginning and end of the array should not differ by more than one + max := addrHours[0] + min := addrHours[len(addrHours)-1] + require.True(t, max-min <= 1) + }) + } + } + } + }) + } + + require.True(t, tested, "configured BurnFactor=%d has not been tested", params.UserVerifyTxn.BurnFactor) +} + +type distributeSpendHoursTestCase struct { + name string + inputHours uint64 + nAddrs uint64 + haveChange bool + expectChangeHours uint64 + expectAddrHours []uint64 +} + +var burnFactor2TestCases = []distributeSpendHoursTestCase{ + { + name: "no input hours, one addr, no change", + inputHours: 0, + nAddrs: 1, + haveChange: false, + expectAddrHours: []uint64{0}, + }, + { + name: "no input hours, two addrs, no change", + inputHours: 0, + nAddrs: 2, + haveChange: false, + expectAddrHours: []uint64{0, 0}, + }, + { + name: "no input hours, one addr, change", + inputHours: 0, + nAddrs: 1, + haveChange: true, + expectAddrHours: []uint64{0}, + }, + { + name: "one input hour, one addr, no change", + inputHours: 1, + nAddrs: 1, + haveChange: false, + expectAddrHours: []uint64{0}, + }, + { + name: "two input hours, one addr, no change", + inputHours: 2, + nAddrs: 1, + haveChange: false, + expectAddrHours: []uint64{1}, + }, + { + name: "two input hours, one addr, change", + inputHours: 2, + nAddrs: 1, + haveChange: true, + expectChangeHours: 1, + expectAddrHours: []uint64{0}, + }, + { + name: "three input hours, one addr, change", + inputHours: 3, + nAddrs: 1, + haveChange: true, + expectChangeHours: 1, + expectAddrHours: []uint64{0}, + }, + { + name: "three input hours, one addr, no change", + inputHours: 3, + nAddrs: 1, + haveChange: false, + expectAddrHours: []uint64{1}, + }, + { + name: "three input hours, two addrs, no change", + inputHours: 3, + nAddrs: 2, + haveChange: false, + expectAddrHours: []uint64{1, 0}, + }, + { + name: "four input hours, one addr, no change", + inputHours: 4, + nAddrs: 1, + haveChange: false, + expectAddrHours: []uint64{2}, + }, + { + name: "four input hours, one addr, change", + inputHours: 4, + nAddrs: 1, + haveChange: true, + expectChangeHours: 1, + expectAddrHours: []uint64{1}, + }, + { + name: "four input hours, two addr, change", + inputHours: 4, + nAddrs: 2, + haveChange: true, + expectChangeHours: 1, + expectAddrHours: []uint64{1, 0}, + }, + { + name: "30 (divided by 2, odd number) input hours, two addr, change", + inputHours: 30, + nAddrs: 2, + haveChange: true, + expectChangeHours: 8, + expectAddrHours: []uint64{4, 3}, + }, + { + name: "33 (odd number) input hours, two addr, change", + inputHours: 33, + nAddrs: 2, + haveChange: true, + expectChangeHours: 8, + expectAddrHours: []uint64{4, 4}, + }, + { + name: "33 (odd number) input hours, three addr, change", + inputHours: 33, + nAddrs: 3, + haveChange: true, + expectChangeHours: 8, + expectAddrHours: []uint64{3, 3, 2}, + }, +} + +var burnFactor3TestCases = []distributeSpendHoursTestCase{ + { + name: "no input hours, one addr, no change", + inputHours: 0, + nAddrs: 1, + haveChange: false, + expectAddrHours: []uint64{0}, + }, + { + name: "no input hours, two addrs, no change", + inputHours: 0, + nAddrs: 2, + haveChange: false, + expectAddrHours: []uint64{0, 0}, + }, + { + name: "no input hours, one addr, change", + inputHours: 0, + nAddrs: 1, + haveChange: true, + expectAddrHours: []uint64{0}, + }, + { + name: "one input hour, one addr, no change", + inputHours: 1, + nAddrs: 1, + haveChange: false, + expectAddrHours: []uint64{0}, + }, + { + name: "two input hours, one addr, no change", + inputHours: 2, + nAddrs: 1, + haveChange: false, + expectAddrHours: []uint64{1}, + }, + { + name: "three input hours, one addr, no change", + inputHours: 3, + nAddrs: 1, + haveChange: false, + expectAddrHours: []uint64{2}, + }, + { + name: "two input hours, one addr, change", + inputHours: 2, + nAddrs: 1, + haveChange: true, + expectChangeHours: 1, + expectAddrHours: []uint64{0}, + }, + { + name: "three input hours, one addr, change", + inputHours: 3, + nAddrs: 1, + haveChange: true, + expectChangeHours: 1, + expectAddrHours: []uint64{1}, + }, + { + name: "four input hours, one addr, change", + inputHours: 4, + nAddrs: 1, + haveChange: true, + expectChangeHours: 1, + expectAddrHours: []uint64{1}, + }, + { + name: "four input hours, one addr, no change", + inputHours: 4, + nAddrs: 1, + haveChange: false, + expectAddrHours: []uint64{2}, + }, + { + name: "four input hours, two addrs, no change", + inputHours: 4, + nAddrs: 2, + haveChange: false, + expectAddrHours: []uint64{1, 1}, + }, + { + name: "five input hours, one addr, no change", + inputHours: 5, + nAddrs: 1, + haveChange: false, + expectAddrHours: []uint64{3}, + }, + { + name: "five input hours, one addr, change", + inputHours: 5, + nAddrs: 1, + haveChange: true, + expectChangeHours: 2, + expectAddrHours: []uint64{1}, + }, + { + name: "five input hours, two addr, change", + inputHours: 5, + nAddrs: 2, + haveChange: true, + expectChangeHours: 2, + expectAddrHours: []uint64{1, 0}, + }, + { + name: "32 input hours, two addr, change", + inputHours: 32, + nAddrs: 2, + haveChange: true, + expectChangeHours: 11, + expectAddrHours: []uint64{5, 5}, + }, + { + name: "35 input hours, two addr, change", + inputHours: 35, + nAddrs: 2, + haveChange: true, + expectChangeHours: 12, + expectAddrHours: []uint64{6, 5}, + }, + { + name: "32 input hours, three addr, change", + inputHours: 32, + nAddrs: 3, + haveChange: true, + expectChangeHours: 11, + expectAddrHours: []uint64{4, 3, 3}, + }, +} + +var burnFactor10TestCases = []distributeSpendHoursTestCase{ + { + name: "no input hours, one addr, no change", + inputHours: 0, + nAddrs: 1, + haveChange: false, + expectAddrHours: []uint64{0}, + }, + { + name: "no input hours, two addrs, no change", + inputHours: 0, + nAddrs: 2, + haveChange: false, + expectAddrHours: []uint64{0, 0}, + }, + { + name: "no input hours, one addr, change", + inputHours: 0, + nAddrs: 1, + haveChange: true, + expectAddrHours: []uint64{0}, + }, + { + name: "one input hour, one addr, no change", + inputHours: 1, + nAddrs: 1, + haveChange: false, + expectAddrHours: []uint64{0}, + }, + { + name: "two input hours, one addr, no change", + inputHours: 2, + nAddrs: 1, + haveChange: false, + expectAddrHours: []uint64{1}, + }, + { + name: "three input hours, one addr, no change", + inputHours: 3, + nAddrs: 1, + haveChange: false, + expectAddrHours: []uint64{2}, + }, + { + name: "two input hours, one addr, change", + inputHours: 2, + nAddrs: 1, + haveChange: true, + expectChangeHours: 1, + expectAddrHours: []uint64{0}, + }, + { + name: "three input hours, one addr, change", + inputHours: 3, + nAddrs: 1, + haveChange: true, + expectChangeHours: 1, + expectAddrHours: []uint64{1}, + }, + { + name: "four input hours, one addr, change", + inputHours: 4, + nAddrs: 1, + haveChange: true, + expectChangeHours: 2, + expectAddrHours: []uint64{1}, + }, + { + name: "four input hours, one addr, no change", + inputHours: 4, + nAddrs: 1, + haveChange: false, + expectAddrHours: []uint64{3}, + }, + { + name: "four input hours, two addrs, no change", + inputHours: 4, + nAddrs: 2, + haveChange: false, + expectAddrHours: []uint64{2, 1}, + }, + { + name: "five input hours, one addr, no change", + inputHours: 5, + nAddrs: 1, + haveChange: false, + expectAddrHours: []uint64{4}, + }, + { + name: "five input hours, one addr, change", + inputHours: 5, + nAddrs: 1, + haveChange: true, + expectChangeHours: 2, + expectAddrHours: []uint64{2}, + }, + { + name: "five input hours, two addr, change", + inputHours: 5, + nAddrs: 2, + haveChange: true, + expectChangeHours: 2, + expectAddrHours: []uint64{1, 1}, + }, + { + name: "32 input hours, two addr, change", + inputHours: 32, + nAddrs: 2, + haveChange: true, + expectChangeHours: 14, + expectAddrHours: []uint64{7, 7}, + }, + { + name: "35 input hours, two addr, change", + inputHours: 35, + nAddrs: 2, + haveChange: true, + expectChangeHours: 16, + expectAddrHours: []uint64{8, 7}, + }, + { + name: "32 input hours, three addr, change", + inputHours: 32, + nAddrs: 3, + haveChange: true, + expectChangeHours: 14, + expectAddrHours: []uint64{5, 5, 4}, + }, +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/transaction/params.go b/vendor/github.com/SkycoinProject/skycoin/src/transaction/params.go new file mode 100644 index 00000000..4285e6b7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/transaction/params.go @@ -0,0 +1,155 @@ +package transaction + +import ( + "errors" + + "github.com/shopspring/decimal" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" +) + +// Error wraps transaction creation-related errors. +// It wraps errors caused by user input, but not errors caused by programmer input or internal issues. +type Error struct { + error +} + +// NewError creates an Error +func NewError(err error) error { + if err == nil { + return nil + } + return Error{err} +} + +const ( + // HoursSelectionTypeManual is used to specify manual hours selection in advanced spend + HoursSelectionTypeManual = "manual" + // HoursSelectionTypeAuto is used to specify automatic hours selection in advanced spend + HoursSelectionTypeAuto = "auto" + + // HoursSelectionModeShare will distribute coin hours equally amongst destinations + HoursSelectionModeShare = "share" +) + +var ( + // ErrNullChangeAddress ChangeAddress must not be the null address + ErrNullChangeAddress = NewError(errors.New("ChangeAddress must not be the null address")) + // ErrMissingReceivers To is required + ErrMissingReceivers = NewError(errors.New("To is required")) + // ErrZeroCoinsReceiver To.Coins must not be zero + ErrZeroCoinsReceiver = NewError(errors.New("To.Coins must not be zero")) + // ErrNullAddressReceiver To.Address must not be the null address + ErrNullAddressReceiver = NewError(errors.New("To.Address must not be the null address")) + // ErrDuplicateReceiver To contains duplicate values + ErrDuplicateReceiver = NewError(errors.New("To contains duplicate values")) + // ErrReceiverZeroHoursAuto To.Hours must be zero for auto type hours selection + ErrReceiverZeroHoursAuto = NewError(errors.New("To.Hours must be zero for auto type hours selection")) + // ErrMissingHoursSelectionModeAuto HoursSelection.Mode is required for auto type hours selection + ErrMissingHoursSelectionModeAuto = NewError(errors.New("HoursSelection.Mode is required for auto type hours selection")) + // ErrInvalidHoursSelelectionMode Invalid HoursSelection.Mode + ErrInvalidHoursSelelectionMode = NewError(errors.New("Invalid HoursSelection.Mode")) + // ErrInvalidHoursSelectionModeManual HoursSelection.Mode cannot be used for manual type hours selection + ErrInvalidHoursSelectionModeManual = NewError(errors.New("HoursSelection.Mode cannot be used for manual type hours selection")) + // ErrInvalidHoursSelectionType Invalid HoursSelection.Type + ErrInvalidHoursSelectionType = NewError(errors.New("Invalid HoursSelection.Type")) + // ErrMissingShareFactor HoursSelection.ShareFactor must be set for share mode + ErrMissingShareFactor = NewError(errors.New("HoursSelection.ShareFactor must be set for share mode")) + // ErrInvalidShareFactor HoursSelection.ShareFactor can only be used for share mode + ErrInvalidShareFactor = NewError(errors.New("HoursSelection.ShareFactor can only be used for share mode")) + // ErrShareFactorOutOfRange HoursSelection.ShareFactor must be >= 0 and <= 1 + ErrShareFactorOutOfRange = NewError(errors.New("HoursSelection.ShareFactor must be >= 0 and <= 1")) +) + +// HoursSelection defines options for hours distribution +type HoursSelection struct { + Type string + Mode string + ShareFactor *decimal.Decimal +} + +// Params defines control parameters for transaction construction +type Params struct { + HoursSelection HoursSelection + To []coin.TransactionOutput + ChangeAddress *cipher.Address +} + +// Validate validates Params +func (c Params) Validate() error { + if c.ChangeAddress != nil && c.ChangeAddress.Null() { + return ErrNullChangeAddress + } + + if len(c.To) == 0 { + return ErrMissingReceivers + } + + for _, to := range c.To { + if to.Coins == 0 { + return ErrZeroCoinsReceiver + } + + if to.Address.Null() { + return ErrNullAddressReceiver + } + } + + // Check for duplicate outputs, a transaction can't have outputs with + // the same (address, coins, hours) + // Auto mode would distribute hours to the outputs and could hypothetically + // avoid assigning duplicate hours in many cases, but the complexity for doing + // so is very high, so also reject duplicate (address, coins) for auto mode. + outputs := make(map[coin.TransactionOutput]struct{}, len(c.To)) + for _, to := range c.To { + outputs[to] = struct{}{} + } + + if len(outputs) != len(c.To) { + return ErrDuplicateReceiver + } + + switch c.HoursSelection.Type { + case HoursSelectionTypeAuto: + for _, to := range c.To { + if to.Hours != 0 { + return ErrReceiverZeroHoursAuto + } + } + + switch c.HoursSelection.Mode { + case HoursSelectionModeShare: + case "": + return ErrMissingHoursSelectionModeAuto + default: + return ErrInvalidHoursSelelectionMode + } + + case HoursSelectionTypeManual: + if c.HoursSelection.Mode != "" { + return ErrInvalidHoursSelectionModeManual + } + + default: + return ErrInvalidHoursSelectionType + } + + if c.HoursSelection.ShareFactor == nil { + if c.HoursSelection.Mode == HoursSelectionModeShare { + return ErrMissingShareFactor + } + } else { + if c.HoursSelection.Mode != HoursSelectionModeShare { + return ErrInvalidShareFactor + } + + zero := decimal.New(0, 0) + one := decimal.New(1, 0) + if c.HoursSelection.ShareFactor.LessThan(zero) || c.HoursSelection.ShareFactor.GreaterThan(one) { + return ErrShareFactorOutOfRange + } + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/transaction/params_test.go b/vendor/github.com/SkycoinProject/skycoin/src/transaction/params_test.go new file mode 100644 index 00000000..bf5d7f56 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/transaction/params_test.go @@ -0,0 +1,285 @@ +package transaction + +import ( + "errors" + "testing" + + "github.com/shopspring/decimal" + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/testutil" +) + +func TestCreateWalletParamsVerify(t *testing.T) { + changeAddress := testutil.MakeAddress() + + toManual := []coin.TransactionOutput{ + { + Address: testutil.MakeAddress(), + Coins: 1e6, + Hours: 1, + }, + { + Address: testutil.MakeAddress(), + Coins: 5e6, + Hours: 0, + }, + } + + toAuto := []coin.TransactionOutput{ + { + Address: testutil.MakeAddress(), + Coins: 1e6, + }, + { + Address: testutil.MakeAddress(), + Coins: 5e6, + }, + } + + one := decimal.New(1, 0) + negativeOne := decimal.New(-1, 0) + onePointOne := decimal.New(11, -1) + pointOneOne := decimal.New(11, -2) + + cases := []struct { + name string + params Params + err string + }{ + { + name: "null change address", + params: Params{ + ChangeAddress: &cipher.Address{}, + }, + err: "ChangeAddress must not be the null address", + }, + + { + name: "no to destinations", + params: Params{ + ChangeAddress: &changeAddress, + }, + err: "To is required", + }, + + { + name: "missing to coins", + params: Params{ + ChangeAddress: &changeAddress, + To: []coin.TransactionOutput{ + { + Address: testutil.MakeAddress(), + Hours: 1, + }, + }, + }, + err: "To.Coins must not be zero", + }, + + { + name: "missing to address", + params: Params{ + ChangeAddress: &changeAddress, + To: []coin.TransactionOutput{ + { + Coins: 5, + Hours: 1, + }, + }, + }, + err: "To.Address must not be the null address", + }, + + { + name: "nonzero to hours for auto selection", + params: Params{ + ChangeAddress: &changeAddress, + To: toManual, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeAuto, + }, + }, + err: "To.Hours must be zero for auto type hours selection", + }, + + { + name: "mode missing for auto selection", + params: Params{ + ChangeAddress: &changeAddress, + To: toAuto, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeAuto, + }, + }, + err: "HoursSelection.Mode is required for auto type hours selection", + }, + + { + name: "mode set for manual selection", + params: Params{ + ChangeAddress: &changeAddress, + To: toManual, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + Mode: HoursSelectionModeShare, + }, + }, + err: "HoursSelection.Mode cannot be used for manual type hours selection", + }, + + { + name: "missing hours selection type", + params: Params{ + ChangeAddress: &changeAddress, + To: toAuto, + HoursSelection: HoursSelection{ + Type: "", + }, + }, + err: "Invalid HoursSelection.Type", + }, + + { + name: "invalid hours selection type", + params: Params{ + ChangeAddress: &changeAddress, + To: toAuto, + HoursSelection: HoursSelection{ + Type: "invalid", + }, + }, + err: "Invalid HoursSelection.Type", + }, + + { + name: "invalid hours selection mode", + params: Params{ + ChangeAddress: &changeAddress, + To: toAuto, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeAuto, + Mode: "invalid", + }, + }, + err: "Invalid HoursSelection.Mode", + }, + + { + name: "share factor not set for split even mode", + params: Params{ + ChangeAddress: &changeAddress, + To: toAuto, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeAuto, + Mode: HoursSelectionModeShare, + }, + }, + err: "HoursSelection.ShareFactor must be set for share mode", + }, + + { + name: "share factor set but not split even mode", + params: Params{ + ChangeAddress: &changeAddress, + To: toManual, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + ShareFactor: &one, + }, + }, + err: "HoursSelection.ShareFactor can only be used for share mode", + }, + + { + name: "share factor less than 0", + params: Params{ + ChangeAddress: &changeAddress, + To: toAuto, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeAuto, + Mode: HoursSelectionModeShare, + ShareFactor: &negativeOne, + }, + }, + err: "HoursSelection.ShareFactor must be >= 0 and <= 1", + }, + + { + name: "share factor greater than 1", + params: Params{ + ChangeAddress: &changeAddress, + To: toAuto, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeAuto, + Mode: HoursSelectionModeShare, + ShareFactor: &onePointOne, + }, + }, + err: "HoursSelection.ShareFactor must be >= 0 and <= 1", + }, + + { + name: "duplicate output when manual", + params: Params{ + ChangeAddress: &changeAddress, + To: []coin.TransactionOutput{toManual[0], toManual[0]}, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + }, + err: "To contains duplicate values", + }, + + { + name: "duplicate output when auto", + params: Params{ + ChangeAddress: &changeAddress, + To: []coin.TransactionOutput{toAuto[0], toAuto[0]}, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeAuto, + Mode: HoursSelectionModeShare, + ShareFactor: &pointOneOne, + }, + }, + err: "To contains duplicate values", + }, + + { + name: "valid auto split even share factor", + params: Params{ + ChangeAddress: &changeAddress, + To: toAuto, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeAuto, + Mode: HoursSelectionModeShare, + ShareFactor: &pointOneOne, + }, + }, + }, + + { + name: "valid manual", + params: Params{ + ChangeAddress: &changeAddress, + To: toManual, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + }, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + err := tc.params.Validate() + if tc.err != "" { + require.Equal(t, NewError(errors.New(tc.err)), err, err.Error()) + } else { + require.NoError(t, err) + } + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/util/apputil/apputil.go b/vendor/github.com/SkycoinProject/skycoin/src/util/apputil/apputil.go new file mode 100644 index 00000000..caf088dd --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/util/apputil/apputil.go @@ -0,0 +1,56 @@ +/* +Package apputil provides utility methods for cmd applications +*/ +package apputil + +import ( + "fmt" + "os" + "os/signal" + "runtime/pprof" + "syscall" +) + +// CatchInterrupt catches CTRL-C and closes the quit channel if it occurs. +// If CTRL-C is called again, the program stack is dumped and the process panics, +// so that shutdown hangs can be diagnosed. +func CatchInterrupt(quit chan<- struct{}) { + sigchan := make(chan os.Signal, 1) + signal.Notify(sigchan, os.Interrupt) + <-sigchan + signal.Stop(sigchan) + close(quit) + + // If ctrl-c is called again, panic so that the program state can be examined. + // Ctrl-c would be called again if program shutdown was stuck. + go CatchInterruptPanic() +} + +// CatchInterruptPanic catches os.Interrupt and panics +func CatchInterruptPanic() { + sigchan := make(chan os.Signal, 1) + signal.Notify(sigchan, os.Interrupt) + <-sigchan + signal.Stop(sigchan) + PrintProgramStatus() + panic("SIGINT") +} + +// CatchDebug catches SIGUSR1 and prints internal program state +func CatchDebug() { + sigchan := make(chan os.Signal, 1) + //signal.Notify(sigchan, syscall.SIGUSR1) + signal.Notify(sigchan, syscall.Signal(0xa)) // SIGUSR1 = Signal(0xa) + for range sigchan { + PrintProgramStatus() + } +} + +// PrintProgramStatus prints all goroutine data to stdout +func PrintProgramStatus() { + p := pprof.Lookup("goroutine") + if err := p.WriteTo(os.Stdout, 2); err != nil { + fmt.Println("ERROR:", err) + return + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/util/certutil/LICENSE b/vendor/github.com/SkycoinProject/skycoin/src/util/certutil/LICENSE new file mode 100644 index 00000000..a7b7560c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/util/certutil/LICENSE @@ -0,0 +1,15 @@ +ISC License + +Copyright (c) 2013-2015 The btcsuite developers + +Permission to use, copy, modify, and distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/vendor/github.com/SkycoinProject/skycoin/src/util/certutil/cert.go b/vendor/github.com/SkycoinProject/skycoin/src/util/certutil/cert.go new file mode 100644 index 00000000..b1e7cb23 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/util/certutil/cert.go @@ -0,0 +1,150 @@ +// Copyright (c) 2013-2015 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. +// Any modifications (c) 2018 Skycoin developers + +package certutil + +import ( + "bytes" + "crypto/ecdsa" + "crypto/elliptic" + "crypto/rand" + _ "crypto/sha512" // Needed for RegisterHash in init + "crypto/x509" + "crypto/x509/pkix" + "encoding/pem" + "errors" + "fmt" + "math/big" + "net" + "os" + "time" + + "github.com/SkycoinProject/skycoin/src/util/logging" +) + +var logger = logging.MustGetLogger("certutil") + +// NewTLSCertPair returns a new PEM-encoded x.509 certificate pair +// based on a 521-bit ECDSA private key. The machine's local interface +// addresses and all variants of IPv4 and IPv6 localhost are included as +// valid IP addresses. +func NewTLSCertPair(organization string, validUntil time.Time, extraHosts []string) (cert, key []byte, err error) { + now := time.Now() + if validUntil.Before(now) { + return nil, nil, errors.New("validUntil would create an already-expired certificate") + } + + priv, err := ecdsa.GenerateKey(elliptic.P521(), rand.Reader) + if err != nil { + return nil, nil, err + } + + // end of ASN.1 time + endOfTime := time.Date(2049, 12, 31, 23, 59, 59, 0, time.UTC) + if validUntil.After(endOfTime) { + validUntil = endOfTime + } + + serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128) + serialNumber, err := rand.Int(rand.Reader, serialNumberLimit) + if err != nil { + return nil, nil, fmt.Errorf("failed to generate serial number: %s", err) + } + + host, err := os.Hostname() + if err != nil { + return nil, nil, err + } + + ipAddresses := []net.IP{net.ParseIP("127.0.0.1"), net.ParseIP("::1")} + dnsNames := []string{host} + if host != "localhost" { + dnsNames = append(dnsNames, "localhost") + } + + addIP := func(ipAddr net.IP) { + for _, ip := range ipAddresses { + if net.IP.Equal(ip, ipAddr) { + return + } + } + ipAddresses = append(ipAddresses, ipAddr) + } + addHost := func(host string) { + for _, dnsName := range dnsNames { + if host == dnsName { + return + } + } + dnsNames = append(dnsNames, host) + } + + addrs, err := net.InterfaceAddrs() + if err != nil { + // net.InterfaceAddrs will fail on some systems - ignore if this happens + logger.WithError(err).Error("NewTLSCertPair: net.InterfaceAddrs failed") + } + for _, a := range addrs { + ipAddr, _, err := net.ParseCIDR(a.String()) + if err == nil { + addIP(ipAddr) + } + } + + for _, hostStr := range extraHosts { + host, _, err := net.SplitHostPort(hostStr) + if err != nil { + host = hostStr + } + if ip := net.ParseIP(host); ip != nil { + addIP(ip) + } else { + addHost(host) + } + } + + template := x509.Certificate{ + SerialNumber: serialNumber, + Subject: pkix.Name{ + Organization: []string{organization}, + CommonName: host, + }, + NotBefore: now.Add(-time.Hour * 24), + NotAfter: validUntil, + + KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature | + x509.KeyUsageCertSign, + IsCA: true, // so can sign self. + BasicConstraintsValid: true, + + DNSNames: dnsNames, + IPAddresses: ipAddresses, + } + + derBytes, err := x509.CreateCertificate(rand.Reader, &template, + &template, &priv.PublicKey, priv) + if err != nil { + return nil, nil, fmt.Errorf("failed to create certificate: %v", err) + } + + certBuf := &bytes.Buffer{} + err = pem.Encode(certBuf, &pem.Block{Type: "CERTIFICATE", Bytes: derBytes}) + if err != nil { + return nil, nil, fmt.Errorf("failed to encode certificate: %v", err) + } + + keybytes, err := x509.MarshalECPrivateKey(priv) + if err != nil { + return nil, nil, fmt.Errorf("failed to marshal private key: %v", err) + } + + keyBuf := &bytes.Buffer{} + err = pem.Encode(keyBuf, &pem.Block{Type: "EC PRIVATE KEY", Bytes: keybytes}) + if err != nil { + return nil, nil, fmt.Errorf("failed to encode private key: %v", err) + } + + return certBuf.Bytes(), keyBuf.Bytes(), nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/util/certutil/cert_test.go b/vendor/github.com/SkycoinProject/skycoin/src/util/certutil/cert_test.go new file mode 100644 index 00000000..9a7a715e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/util/certutil/cert_test.go @@ -0,0 +1,121 @@ +// Copyright (c) 2013-2015 The btcsuite developers +// Use of this source code is governed by an ISC +// license that can be found in the LICENSE file. +// Any modifications (c) 2018 Skycoin developers + +package certutil + +import ( + "crypto/x509" + "encoding/pem" + "net" + "testing" + "time" +) + +// TestNewTLSCertPair ensures the NewTLSCertPair function works as expected. +func TestNewTLSCertPair(t *testing.T) { + // Certs don't support sub-second precision, so truncate it now to + // ensure the checks later don't fail due to nanosecond precision + // differences. + validUntil := time.Unix(time.Now().Add(10*365*24*time.Hour).Unix(), 0) + org := "test autogenerated cert" + extraHosts := []string{"testtlscert.bogus", "localhost", "127.0.0.1"} + cert, key, err := NewTLSCertPair(org, validUntil, extraHosts) + if err != nil { + t.Fatalf("failed with unexpected error: %v", err) + } + + // Ensure the PEM-encoded cert that is returned can be decoded. + pemCert, _ := pem.Decode(cert) + if pemCert == nil { + t.Fatalf("pem.Decode was unable to decode the certificate") + } + + // Ensure the PEM-encoded key that is returned can be decoded. + pemKey, _ := pem.Decode(key) + if pemCert == nil { + t.Fatalf("pem.Decode was unable to decode the key") + } + + // Ensure the DER-encoded key bytes can be successfully parsed. + _, err = x509.ParseECPrivateKey(pemKey.Bytes) + if err != nil { + t.Fatalf("failed with unexpected error: %v", err) + } + + // Ensure the DER-encoded cert bytes can be successfully into an X.509 + // certificate. + x509Cert, err := x509.ParseCertificate(pemCert.Bytes) + if err != nil { + t.Fatalf("failed with unexpected error: %v", err) + } + + // Ensure the specified organization is correct. + x509Orgs := x509Cert.Subject.Organization + if len(x509Orgs) == 0 || x509Orgs[0] != org { + x509Org := "" + if len(x509Orgs) > 0 { + x509Org = x509Orgs[0] + } + t.Fatalf("generated cert organization field mismatch, got "+ + "'%v', want '%v'", x509Org, org) + } + + // Ensure the specified valid until value is correct. + if !x509Cert.NotAfter.Equal(validUntil) { + t.Fatalf("generated cert valid until field mismatch, got %v, "+ + "want %v", x509Cert.NotAfter, validUntil) + } + + // Ensure the specified extra hosts are present. + for _, host := range extraHosts { + if err := x509Cert.VerifyHostname(host); err != nil { + t.Fatalf("failed to verify extra host '%s'", host) + } + } + + // Ensure that the Common Name is also the first SAN DNS name. + cn := x509Cert.Subject.CommonName + san0 := x509Cert.DNSNames[0] + if cn != san0 { + t.Errorf("common name %s does not match first SAN %s", cn, san0) + } + + // Ensure there are no duplicate hosts or IPs. + hostCounts := make(map[string]int) + for _, host := range x509Cert.DNSNames { + hostCounts[host]++ + } + ipCounts := make(map[string]int) + for _, ip := range x509Cert.IPAddresses { + ipCounts[string(ip)]++ + } + for host, count := range hostCounts { + if count != 1 { + t.Errorf("host %s appears %d times in certificate", host, count) + } + } + for ipStr, count := range ipCounts { + if count != 1 { + t.Errorf("ip %s appears %d times in certificate", net.IP(ipStr), count) + } + } + + // Ensure the cert can be use for the intended purposes. + if !x509Cert.IsCA { + t.Fatal("generated cert is not a certificate authority") + } + if x509Cert.KeyUsage&x509.KeyUsageKeyEncipherment == 0 { + t.Fatal("generated cert can't be used for key encipherment") + } + if x509Cert.KeyUsage&x509.KeyUsageDigitalSignature == 0 { + t.Fatal("generated cert can't be used for digital signatures") + } + if x509Cert.KeyUsage&x509.KeyUsageCertSign == 0 { + t.Fatal("generated cert can't be used for signing other certs") + } + if !x509Cert.BasicConstraintsValid { + t.Fatal("generated cert does not have valid basic constraints") + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/util/droplet/droplet.go b/vendor/github.com/SkycoinProject/skycoin/src/util/droplet/droplet.go new file mode 100644 index 00000000..f690d144 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/util/droplet/droplet.go @@ -0,0 +1,95 @@ +/* +Package droplet provides methods for handling droplet integers and string. + +A droplet is the smallest possible coin amount in Skycoin, equal to 1/1000000 of a whole skycoin. +*/ +package droplet + +import ( + "errors" + "math" + + "github.com/shopspring/decimal" + + logging "github.com/SkycoinProject/skycoin/src/util/logging" +) + +const ( + // Exponent is the number of decimal places held by droplets + Exponent = 6 + // Multiplier is how much to multiply coins by to get droplets + Multiplier = 1e6 +) + +var ( + // ErrNegativeValue is returned if a balance string is a negative number + ErrNegativeValue = errors.New("Droplet string conversion failed: Negative balance") + // ErrTooManyDecimals is returned if a balance string has more than 6 decimal places + ErrTooManyDecimals = errors.New("Droplet string conversion failed: Too many decimal places") + // ErrTooLarge is returned if a balance string is greater than math.MaxInt64 + ErrTooLarge = errors.New("Droplet string conversion failed: Value is too large") + + logger = logging.MustGetLogger("convert") + maxDecimal decimal.Decimal +) + +func init() { + maxInt64 := "9223372036854775807" + max, err := decimal.NewFromString(maxInt64) + if err != nil { + panic(err) + } + + maxDecimal = max +} + +// FromString converts a skycoin balance string with decimal places to uint64 droplets. +// For example, "123.000456" becomes 123000456 +func FromString(b string) (uint64, error) { + d, err := decimal.NewFromString(b) + if err != nil { + return 0, err + } + + // Values must be zero or positive + if d.Sign() == -1 { + return 0, ErrNegativeValue + } + + // Skycoins have a maximum of 6 decimal places + if d.Exponent() < -Exponent { + return 0, ErrTooManyDecimals + } + + // Multiply the coin balance by 1e6 to obtain droplets amount + e := d.Shift(Exponent) + + // Check that there are no decimal places remaining. This error should not + // occur, because of the earlier check of Exponent() + if e.Exponent() < 0 { + logger.Critical().Errorf("Balance still has decimals after converting to droplets: %s", b) + return 0, ErrTooManyDecimals + } + + // Values greater than math.MaxInt64 will overflow after conversion to int64 + // using decimal.IntPart() + if e.GreaterThan(maxDecimal) { + return 0, ErrTooLarge + } + + return uint64(e.IntPart()), nil +} + +// ToString converts droplets to a skycoin balance fixed-point decimal string. +// String will always have a decimal precision of droplet.Exponent (6). +// For example, 123000456 becomes "123.000456" and +// 123000000 becomes "123.000000". +func ToString(n uint64) (string, error) { + if n > math.MaxInt64 { + return "", ErrTooLarge + } + + d := decimal.New(int64(n), -Exponent) + + return d.StringFixed(Exponent), nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/util/droplet/droplet_test.go b/vendor/github.com/SkycoinProject/skycoin/src/util/droplet/droplet_test.go new file mode 100644 index 00000000..332f72f7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/util/droplet/droplet_test.go @@ -0,0 +1,298 @@ +package droplet + +import ( + "errors" + "fmt" + "math/rand" + "regexp" + "testing" + "time" + + "github.com/stretchr/testify/require" +) + +// set rand seed. +var _ = func() int64 { + t := time.Now().Unix() + rand.Seed(t) + return t +}() + +func TestFromString(t *testing.T) { + t.Parallel() + + cases := []struct { + s string + n uint64 + e error + }{ + { + s: "100000000.000000", + n: 1e8 * 1e6, + }, + { + s: "0", + n: 0, + }, + { + s: "0.", + n: 0, + }, + { + s: "0.0", + n: 0, + }, + { + s: "0.000000", + n: 0, + }, + { + s: "0.0000000", + n: 0, + }, + { + s: "0.0000001", + e: ErrTooManyDecimals, + }, + { + s: "0.000001", + n: 1, + }, + { + s: "0.0000010", + n: 1, + }, + { + s: "1", + n: 1e6, + }, + { + s: "1.000001", + n: 1e6 + 1, + }, + { + s: "-1", + e: ErrNegativeValue, + }, + { + s: "10000", + n: 1e4 * 1e6, + }, + { + s: "123456789.123456", + n: 123456789123456, + }, + { + s: "123.000456", + n: 123000456, + }, + { + s: "100SKY", + e: errors.New("can't convert 100SKY to decimal"), + }, + { + s: "", + e: errors.New("can't convert to decimal"), + }, + { + s: "999999999999999999999999999999999999999999", + e: ErrTooLarge, + }, + { + s: "9223372036854.775807", + n: 9223372036854775807, + }, + { + s: "-9223372036854.775807", + e: ErrNegativeValue, + }, + { + s: "9223372036854775808", + e: ErrTooLarge, + }, + { + s: "9223372036854775807.000001", + e: ErrTooLarge, + }, + { + s: "9223372036854775807", + e: ErrTooLarge, + }, + { + s: "9223372036854775806.000001", + e: ErrTooLarge, + }, + { + s: "1.1", + n: 1e6 + 1e5, + }, + { + s: "1.01", + n: 1e6 + 1e4, + }, + { + s: "1.001", + n: 1e6 + 1e3, + }, + { + s: "1.0001", + n: 1e6 + 1e2, + }, + { + s: "1.00001", + n: 1e6 + 1e1, + }, + { + s: "1.000001", + n: 1e6 + 1e0, + }, + { + s: "1.0000001", + e: ErrTooManyDecimals, + }, + { + s: "1.0000000", // 7 decimal places, but they are 0s + n: 1e6, + }, + { + s: "1.000001000", + n: 1e6 + 1e0, + }, + } + + for _, tcc := range cases { + tc := tcc + t.Run(tc.s, func(t *testing.T) { + t.Parallel() + + n, err := FromString(tc.s) + + if tc.e == nil { + require.NoError(t, err) + require.Equal(t, tc.n, n, "result: %d", n) + } else { + require.Error(t, err) + require.Equal(t, tc.e, err) + require.Equal(t, uint64(0), n, "result: %d", n) + } + }) + } +} + +func TestToString(t *testing.T) { + t.Parallel() + + cases := []struct { + n uint64 + s string + e error + }{ + { + n: 0, + s: "0.000000", + }, + { + n: 1, + s: "0.000001", + }, + { + n: 1e6, + s: "1.000000", + }, + { + n: 100100, + s: "0.100100", + }, + { + n: 1001000, + s: "1.001000", + }, + { + n: 999, + s: "0.000999", + }, + { + n: 999000000, + s: "999.000000", + }, + { + n: 123000456, + s: "123.000456", + }, + { + n: 1e8 * 1e6, + s: "100000000.000000", + }, + { + n: 9223372036854775808, + e: ErrTooLarge, + }, + } + + for _, tcc := range cases { + tc := tcc + t.Run(tc.s, func(t *testing.T) { + t.Parallel() + + s, err := ToString(tc.n) + + if tc.e == nil { + require.NoError(t, err) + require.Equal(t, tc.s, s) + } else { + require.Error(t, err) + require.Equal(t, tc.e, err) + require.Equal(t, "", s) + } + }) + } +} + +func TestToFromStringFuzz(t *testing.T) { + if testing.Short() { + t.Skip("Skipping test in short mode") + } + + t.Parallel() + + verify := func(t *testing.T, x uint64, exp *regexp.Regexp) { + s, err := ToString(x) + require.NoError(t, err) + + n, err := FromString(s) + require.NoError(t, err) + + require.Equal(t, x, n) + + require.True(t, exp.MatchString(s), "%d -> %q", x, s) + } + + decRe := regexp.MustCompile(`^0\.[0-9]{6}$`) + // Check every possible value <1 whole coin + for i := uint64(0); i < uint64(1e6); i++ { + j := i + t.Run(fmt.Sprint(j), func(t *testing.T) { + verify(t, j, decRe) + }) + } + + // Check random values >=1 + nRand := int(1e5) + fullRe := regexp.MustCompile(`^[1-9][0-9]{0,8}\.[0-9]{6}$`) + for i := 0; i < nRand; i++ { + x := (rand.Uint64() % ((1e8 * 1e6) - 1e6 + 1)) + 1e6 // [1e6, 1e8*1e6] + t.Run(fmt.Sprint(x), func(t *testing.T) { + verify(t, x, fullRe) + }) + } + + // Check random values >=1 and with no droplets + wholeRe := regexp.MustCompile(`^[1-9][0-9]{0,8}\.0{6}$`) + for i := 0; i < nRand; i++ { + x := (rand.Uint64() % 1e8) + 1 // [1, 1e8] + x = x * 1e6 + t.Run(fmt.Sprint(x), func(t *testing.T) { + verify(t, x, wholeRe) + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/util/elapse/elapser.go b/vendor/github.com/SkycoinProject/skycoin/src/util/elapse/elapser.go new file mode 100644 index 00000000..2f692f35 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/util/elapse/elapser.go @@ -0,0 +1,72 @@ +/* +Package elapse provides time measuring instruments +*/ +package elapse + +import ( + "time" + + "github.com/SkycoinProject/skycoin/src/util/logging" +) + +// Elapser measures time elapsed for an operation. It is not thread-safe, use a different elapser per thread. +type Elapser struct { + name *string + startTime time.Time + elapsedThreshold time.Duration + Done chan bool + logger *logging.Logger +} + +// NewElapser creates an Elapser +func NewElapser(elapsedThreshold time.Duration, logger *logging.Logger) *Elapser { + elapser := &Elapser{ + elapsedThreshold: elapsedThreshold, + Done: make(chan bool, 100), + logger: logger, + } + return elapser +} + +// CheckForDone checks if the elapser has triggered and records the elapsed time +func (e *Elapser) CheckForDone() { + select { + case <-e.Done: + e.Elapsed() + default: + } +} + +// Register begins an operation to measure +func (e *Elapser) Register(name string) { + e.CheckForDone() + e.name = &name + e.startTime = time.Now() + e.Done <- true +} + +// ShowCurrentTime logs the elapsed time so far +func (e *Elapser) ShowCurrentTime(step string) { + stopTime := time.Now() + if e.name == nil { + e.logger.Warning("no registered events for elapsing, but found Elapser.ShowCurrentTime calling") + return + } + elapsed := stopTime.Sub(e.startTime) + e.logger.Infof("%s[%s] elapsed %s", *e.name, step, elapsed) + +} + +// Elapsed stops measuring an operation and logs the elapsed time if it exceeds the configured threshold +func (e *Elapser) Elapsed() { + stopTime := time.Now() + if e.name == nil { + e.logger.Warning("no registered events for elapsing, but found Elapser.Elapsed calling") + return + } + elapsed := stopTime.Sub(e.startTime) + if elapsed >= e.elapsedThreshold { + e.logger.Warningf("%s elapsed %s", *e.name, elapsed) + } + e.name = nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/util/fee/fee.go b/vendor/github.com/SkycoinProject/skycoin/src/util/fee/fee.go new file mode 100644 index 00000000..3d268739 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/util/fee/fee.go @@ -0,0 +1,99 @@ +/* +Package fee provides methods to calculate and verify transaction fees +*/ +package fee + +import ( + "errors" + + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/util/mathutil" +) + +var ( + // ErrTxnNoFee is returned if a transaction has no coinhour fee + ErrTxnNoFee = errors.New("Transaction has zero coinhour fee") + + // ErrTxnInsufficientFee is returned if a transaction's coinhour burn fee is not enough + ErrTxnInsufficientFee = errors.New("Transaction coinhour fee minimum not met") + + // ErrTxnInsufficientCoinHours is returned if a transaction has more coinhours in its outputs than its inputs + ErrTxnInsufficientCoinHours = errors.New("Insufficient coinhours for transaction outputs") +) + +// VerifyTransactionFee performs additional transaction verification at the unconfirmed pool level. +// This checks tunable params that should prevent the transaction from +// entering the blockchain, but cannot be done at the blockchain level because +// they may be changed. +func VerifyTransactionFee(t *coin.Transaction, fee uint64, burnFactor uint32) error { + hours, err := t.OutputHours() + if err != nil { + return err + } + return VerifyTransactionFeeForHours(hours, fee, burnFactor) +} + +// VerifyTransactionFeeForHours verifies the fee given fee and hours, +// where hours is the number of hours in a transaction's outputs, +// and hours+fee is the number of hours in a transaction's inputs +func VerifyTransactionFeeForHours(hours, fee uint64, burnFactor uint32) error { + // Require non-zero coinhour fee + if fee == 0 { + return ErrTxnNoFee + } + + // Calculate total number of coinhours + total, err := mathutil.AddUint64(hours, fee) + if err != nil { + return errors.New("Hours and fee overflow") + } + + // Calculate the required fee + requiredFee := RequiredFee(total, burnFactor) + + // Ensure that the required fee is met + if fee < requiredFee { + return ErrTxnInsufficientFee + } + + return nil +} + +// RequiredFee returns the coinhours fee required for an amount of hours +// The required fee is calculated as hours/burnFactor, rounded up. +func RequiredFee(hours uint64, burnFactor uint32) uint64 { + feeHours := hours / uint64(burnFactor) + if hours%uint64(burnFactor) != 0 { + feeHours++ + } + + return feeHours +} + +// RemainingHours returns the amount of coinhours leftover after paying the fee for the input. +func RemainingHours(hours uint64, burnFactor uint32) uint64 { + fee := RequiredFee(hours, burnFactor) + return hours - fee +} + +// TransactionFee calculates the current transaction fee in coinhours of a Transaction. +// Returns ErrTxnInsufficientCoinHours if input hours is less than output hours. +func TransactionFee(tx *coin.Transaction, headTime uint64, inUxs coin.UxArray) (uint64, error) { + // Compute input hours + inHours, err := inUxs.CoinHours(headTime) + if err != nil { + return 0, err + } + + // Compute output hours + outHours, err := tx.OutputHours() + if err != nil { + return 0, err + } + + if inHours < outHours { + return 0, ErrTxnInsufficientCoinHours + } + + return inHours - outHours, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/util/fee/fee_test.go b/vendor/github.com/SkycoinProject/skycoin/src/util/fee/fee_test.go new file mode 100644 index 00000000..0e08697e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/util/fee/fee_test.go @@ -0,0 +1,390 @@ +package fee + +import ( + "errors" + "fmt" + "math" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/testutil" +) + +type verifyTxnFeeTestCase struct { + inputHours uint64 + outputHours uint64 + err error +} + +var burnFactor2VerifyTxnFeeTestCases = []verifyTxnFeeTestCase{ + {0, 0, ErrTxnNoFee}, + {1, 0, nil}, + {1, 1, ErrTxnNoFee}, + {2, 0, nil}, + {2, 1, nil}, + {2, 2, ErrTxnNoFee}, + {3, 0, nil}, + {3, 1, nil}, + {3, 2, ErrTxnInsufficientFee}, + {3, 3, ErrTxnNoFee}, + {4, 0, nil}, + {4, 1, nil}, + {4, 2, nil}, + {4, 3, ErrTxnInsufficientFee}, + {4, 4, ErrTxnNoFee}, +} + +var burnFactor3VerifyTxnFeeTestCases = []verifyTxnFeeTestCase{ + {0, 0, ErrTxnNoFee}, + {1, 0, nil}, + {1, 1, ErrTxnNoFee}, + {2, 0, nil}, + {2, 1, nil}, + {2, 2, ErrTxnNoFee}, + {3, 0, nil}, + {3, 1, nil}, + {3, 2, nil}, + {3, 3, ErrTxnNoFee}, + {4, 0, nil}, + {4, 1, nil}, + {4, 2, nil}, + {4, 3, ErrTxnInsufficientFee}, + {4, 4, ErrTxnNoFee}, + {5, 0, nil}, + {5, 1, nil}, + {5, 2, nil}, + {5, 3, nil}, + {5, 4, ErrTxnInsufficientFee}, + {5, 5, ErrTxnNoFee}, +} + +var burnFactor10VerifyTxnFeeTestCases = []verifyTxnFeeTestCase{ + {0, 0, ErrTxnNoFee}, + {1, 0, nil}, + {1, 1, ErrTxnNoFee}, + {2, 0, nil}, + {2, 1, nil}, + {2, 2, ErrTxnNoFee}, + {3, 0, nil}, + {3, 1, nil}, + {3, 2, nil}, + {3, 3, ErrTxnNoFee}, + {4, 0, nil}, + {4, 1, nil}, + {4, 2, nil}, + {4, 3, nil}, + {4, 4, ErrTxnNoFee}, + {5, 0, nil}, + {5, 1, nil}, + {5, 2, nil}, + {5, 3, nil}, + {5, 4, nil}, + {5, 5, ErrTxnNoFee}, + {9, 8, nil}, + {9, 9, ErrTxnNoFee}, + {10, 5, nil}, + {10, 9, nil}, + {10, 10, ErrTxnNoFee}, + {11, 9, nil}, + {11, 10, ErrTxnInsufficientFee}, + {11, 11, ErrTxnNoFee}, + {19, 17, nil}, + {19, 18, ErrTxnInsufficientFee}, + {19, 19, ErrTxnNoFee}, + {20, 18, nil}, + {20, 19, ErrTxnInsufficientFee}, + {20, 20, ErrTxnNoFee}, +} + +func TestVerifyTransactionFee(t *testing.T) { + emptyTxn := &coin.Transaction{} + hours, err := emptyTxn.OutputHours() + require.NoError(t, err) + require.Equal(t, uint64(0), hours) + + // A txn with no outputs hours and no coinhours burn fee is valid + err = VerifyTransactionFee(emptyTxn, 0, 2) + testutil.RequireError(t, err, ErrTxnNoFee.Error()) + + // A txn with no outputs hours but with a coinhours burn fee is valid + err = VerifyTransactionFee(emptyTxn, 100, 2) + require.NoError(t, err) + + txn := &coin.Transaction{} + txn.Out = append(txn.Out, coin.TransactionOutput{ + Hours: 1e6, + }) + txn.Out = append(txn.Out, coin.TransactionOutput{ + Hours: 3e6, + }) + + hours, err = txn.OutputHours() + require.NoError(t, err) + require.Equal(t, uint64(4e6), hours) + + // A txn with insufficient net coinhours burn fee is invalid + err = VerifyTransactionFee(txn, 0, 2) + testutil.RequireError(t, err, ErrTxnNoFee.Error()) + + err = VerifyTransactionFee(txn, 1, 2) + testutil.RequireError(t, err, ErrTxnInsufficientFee.Error()) + + // A txn with sufficient net coinhours burn fee is valid + hours, err = txn.OutputHours() + require.NoError(t, err) + err = VerifyTransactionFee(txn, hours, 2) + require.NoError(t, err) + hours, err = txn.OutputHours() + require.NoError(t, err) + err = VerifyTransactionFee(txn, hours*10, 2) + require.NoError(t, err) + + // fee + hours overflows + err = VerifyTransactionFee(txn, math.MaxUint64-3e6, 2) + testutil.RequireError(t, err, "Hours and fee overflow") + + // txn has overflowing output hours + txn.Out = append(txn.Out, coin.TransactionOutput{ + Hours: math.MaxUint64 - 1e6 - 3e6 + 1, + }) + err = VerifyTransactionFee(txn, 10, 2) + testutil.RequireError(t, err, "Transaction output hours overflow") + + cases := []struct { + burnFactor uint32 + cases []verifyTxnFeeTestCase + }{ + {2, burnFactor2VerifyTxnFeeTestCases}, + {3, burnFactor3VerifyTxnFeeTestCases}, + {10, burnFactor10VerifyTxnFeeTestCases}, + } + + tested := false + for _, tcc := range cases { + if tcc.burnFactor == params.UserVerifyTxn.BurnFactor { + tested = true + } + + for _, tc := range tcc.cases { + name := fmt.Sprintf("burnFactor=%d input=%d output=%d", tcc.burnFactor, tc.inputHours, tc.outputHours) + t.Run(name, func(t *testing.T) { + txn := &coin.Transaction{} + txn.Out = append(txn.Out, coin.TransactionOutput{ + Hours: tc.outputHours, + }) + + require.True(t, tc.inputHours >= tc.outputHours) + err := VerifyTransactionFee(txn, tc.inputHours-tc.outputHours, tcc.burnFactor) + require.Equal(t, tc.err, err) + }) + } + } + + require.True(t, tested, "configured params.UserVerifyTxn.BurnFactor=%d has not been tested", params.UserVerifyTxn.BurnFactor) +} + +type requiredFeeTestCase struct { + hours uint64 + fee uint64 +} + +var burnFactor2RequiredFeeTestCases = []requiredFeeTestCase{ + {0, 0}, + {1, 1}, + {2, 1}, + {3, 2}, + {4, 2}, + {5, 3}, + {6, 3}, + {7, 4}, + {998, 499}, + {999, 500}, + {1000, 500}, + {1001, 501}, +} + +var burnFactor3RequiredFeeTestCases = []requiredFeeTestCase{ + {0, 0}, + {1, 1}, + {2, 1}, + {3, 1}, + {4, 2}, + {5, 2}, + {6, 2}, + {7, 3}, + {999, 333}, + {1000, 334}, + {1001, 334}, + {1002, 334}, + {1003, 335}, +} + +var burnFactor10RequiredFeeTestCases = []requiredFeeTestCase{ + {0, 0}, + {1, 1}, + {2, 1}, + {3, 1}, + {4, 1}, + {5, 1}, + {6, 1}, + {7, 1}, + {8, 1}, + {9, 1}, + {10, 1}, + {11, 2}, + {19, 2}, + {20, 2}, + {21, 3}, + {999, 100}, + {1000, 100}, + {1001, 101}, + {1002, 101}, + {1003, 101}, +} + +func TestRequiredFee(t *testing.T) { + cases := []struct { + burnFactor uint32 + cases []requiredFeeTestCase + }{ + {2, burnFactor2RequiredFeeTestCases}, + {3, burnFactor3RequiredFeeTestCases}, + {10, burnFactor10RequiredFeeTestCases}, + } + + tested := false + for _, tcc := range cases { + if tcc.burnFactor == params.UserVerifyTxn.BurnFactor { + tested = true + } + + for _, tc := range tcc.cases { + name := fmt.Sprintf("burnFactor=%d hours=%d fee=%d", tcc.burnFactor, tc.hours, tc.fee) + t.Run(name, func(t *testing.T) { + fee := RequiredFee(tc.hours, tcc.burnFactor) + require.Equal(t, tc.fee, fee) + + remainingHours := RemainingHours(tc.hours, tcc.burnFactor) + require.Equal(t, tc.hours-fee, remainingHours) + }) + } + } + + require.True(t, tested, "configured params.UserVerifyTxn.BurnFactor=%d has not been tested", params.UserVerifyTxn.BurnFactor) +} + +func TestTransactionFee(t *testing.T) { + var headTime uint64 = 1000 + nextTime := headTime + 3600 // 1 hour later + + type uxInput struct { + time uint64 + coins uint64 + hours uint64 + } + + cases := []struct { + out []uint64 + in []uxInput + headTime uint64 + fee uint64 + err error + }{ + // Test case with one output, one input + { + fee: 5, + out: []uint64{5}, + in: []uxInput{ + {time: headTime, coins: 10e6, hours: 10}, + }, + headTime: headTime, + }, + + // Test case with multiple outputs, multiple inputs + { + fee: 0, + out: []uint64{5, 7, 3}, + in: []uxInput{ + {time: headTime, coins: 10e6, hours: 10}, + {time: headTime, coins: 10e6, hours: 5}, + }, + headTime: headTime, + }, + + // Test case with multiple outputs, multiple inputs, and some inputs have more CoinHours once adjusted for HeadTime + { + fee: 8, + out: []uint64{5, 10}, + in: []uxInput{ + {time: nextTime, coins: 10e6, hours: 10}, + {time: headTime, coins: 8e6, hours: 5}, + }, + headTime: nextTime, + }, + + // Test case with insufficient coin hours + { + err: ErrTxnInsufficientCoinHours, + out: []uint64{5, 10, 1}, + in: []uxInput{ + {time: headTime, coins: 10e6, hours: 10}, + {time: headTime, coins: 8e6, hours: 5}, + }, + headTime: headTime, + }, + + // Test case with overflowing input hours + { + err: errors.New("UxArray.CoinHours addition overflow"), + out: []uint64{0}, + in: []uxInput{ + {time: headTime, coins: 10e6, hours: 10}, + {time: headTime, coins: 10e6, hours: math.MaxUint64 - 9}, + }, + headTime: headTime, + }, + + // Test case with overflowing output hours + { + err: errors.New("Transaction output hours overflow"), + out: []uint64{0, 10, math.MaxUint64 - 9}, + in: []uxInput{ + {time: headTime, coins: 10e6, hours: 10}, + {time: headTime, coins: 10e6, hours: 100}, + }, + headTime: headTime, + }, + } + + for _, tc := range cases { + name := fmt.Sprintf("fee=%d headTime=%d", tc.fee, tc.headTime) + t.Run(name, func(t *testing.T) { + tx := &coin.Transaction{} + for _, h := range tc.out { + tx.Out = append(tx.Out, coin.TransactionOutput{ + Hours: h, + }) + } + + inUxs := make(coin.UxArray, len(tc.in)) + for i, b := range tc.in { + inUxs[i] = coin.UxOut{ + Head: coin.UxHead{ + Time: b.time, + }, + Body: coin.UxBody{ + Coins: b.coins, + Hours: b.hours, + }, + } + } + + fee, err := TransactionFee(tx, tc.headTime, inUxs) + require.Equal(t, tc.err, err) + require.Equal(t, tc.fee, fee) + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/util/file/file.go b/vendor/github.com/SkycoinProject/skycoin/src/util/file/file.go new file mode 100644 index 00000000..3975fb6e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/util/file/file.go @@ -0,0 +1,321 @@ +// Package file provides filesystem related utilities +package file + +import ( + "encoding/json" + "errors" + "fmt" + "io" + "io/ioutil" + "os" + "path/filepath" + "runtime" + "strings" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/util/logging" +) + +var ( + // ErrEmptyDirectoryName is returned by constructing the full path + // of data directory if the passed argument is empty + ErrEmptyDirectoryName = errors.New("data directory must not be empty") + // ErrDotDirectoryName is returned by constructing the full path of + // data directory if the passed argument is "." + ErrDotDirectoryName = errors.New("data directory must not be equal to \".\"") + + logger = logging.MustGetLogger("file") +) + +// InitDataDir Joins dir with the user's $HOME directory. +// If $HOME cannot be determined, uses the current working directory. +// dir must not be the empty string +func InitDataDir(dir string) (string, error) { + dir, err := buildDataDir(dir) + if err != nil { + return "", err + } + + // check if dir already exists + st, err := os.Stat(dir) + if !os.IsNotExist(err) { + if !st.IsDir() { + return "", fmt.Errorf("%s is not a directory", dir) + } + // dir already exists + return dir, nil + } + + if err := os.MkdirAll(dir, os.FileMode(0700)); err != nil { + logger.Errorf("Failed to create directory %s: %v", dir, err) + return "", err + } + + logger.Infof("Created data directory %s", dir) + return dir, nil +} + +// Construct the full data directory by adding to $HOME or ./ +func buildDataDir(dir string) (string, error) { + if dir == "" { + logger.Error("data directory is empty") + return "", ErrEmptyDirectoryName + } + + home := filepath.Clean(UserHome()) + wd, err := os.Getwd() + if err != nil { + return "", err + } + wd = filepath.Clean(wd) + + fullDir, err := filepath.Abs(dir) + + if err != nil { + return "", err + } + + // The joined directory must not be equal to $HOME or a parent path of $HOME + // The joined directory must not be equal to `pwd` or a parent path of `pwd` + if strings.HasPrefix(home, fullDir) || strings.HasPrefix(wd, fullDir) { + logger.Errorf("join(%[1]s, %[2]s) == %[1]s", home, dir) + return "", ErrDotDirectoryName + } + + return fullDir, nil +} + +// UserHome returns the current user home path +func UserHome() string { + // os/user relies on cgo which is disabled when cross compiling + // use fallbacks for various OSes instead + // usr, err := user.Current() + // if err == nil { + // return usr.HomeDir + // } + if runtime.GOOS == "windows" { + home := os.Getenv("HOMEDRIVE") + os.Getenv("HOMEPATH") + if home == "" { + home = os.Getenv("USERPROFILE") + } + return home + } + + return os.Getenv("HOME") +} + +// LoadJSON load json file +func LoadJSON(filename string, thing interface{}) error { + file, err := os.Open(filename) + if err != nil { + return err + } + defer file.Close() + + dec := json.NewDecoder(file) + dec.UseNumber() + return dec.Decode(thing) +} + +// SaveJSON write value into json file +func SaveJSON(filename string, thing interface{}, mode os.FileMode) error { + data, err := json.MarshalIndent(thing, "", " ") + if err != nil { + return err + } + return SaveBinary(filename, data, mode) +} + +// SaveJSONSafe saves json to disk, but refuses if file already exists +func SaveJSONSafe(filename string, thing interface{}, mode os.FileMode) error { + b, err := json.MarshalIndent(thing, "", " ") + if err != nil { + return err + } + flags := os.O_WRONLY | os.O_CREATE | os.O_EXCL + f, err := os.OpenFile(filename, flags, mode) + if err != nil { + return err + } + defer f.Close() + n, err := f.Write(b) + if n != len(b) && err != nil { + err = errors.New("Failed to save complete file") + } + if err != nil { + if removeErr := os.Remove(filename); removeErr != nil { + logger.WithError(removeErr).Warningf("os.Remove(%s) failed", filename) + } + } + return err +} + +// SaveBinary persists data into given file in binary, +// backup the data to `tmp` wallet file and then write data +// to target wallet file. Remove the tmp file in the end of +// this function. In this way, the wallet data would not be lost +func SaveBinary(filename string, data []byte, mode os.FileMode) error { + // Write the new file to a temporary + dataHash := cipher.SumSHA256(data) + tmpname := filename + ".tmp." + dataHash.Hex()[:8] + if err := ioutil.WriteFile(tmpname, data, mode); err != nil { + return err + } + + if err := ioutil.WriteFile(filename, data, mode); err != nil { + return err + } + + return os.Remove(tmpname) +} + +//TODO: require file named after application and then hashcode, in static directory + +// ResolveResourceDirectory searches locations for a research directory and returns absolute path +func ResolveResourceDirectory(path string) string { + workDir, err := filepath.Abs(filepath.Dir(os.Args[0])) + if err != nil { + logger.Panic(err) + } + + _, rtFilename, _, _ := runtime.Caller(1) + rtDirectory := filepath.Dir(rtFilename) + + pathAbs, err := filepath.Abs(path) + if err != nil { + logger.Panic(err) + } + fmt.Println("abs path:", pathAbs) + + fmt.Printf("runtime.Caller= %s \n", rtFilename) + //fmt.Printf("Filepath Raw= %s \n") + fmt.Printf("Filepath Directory= %s \n", filepath.Dir(path)) + fmt.Printf("Filepath Absolute Directory= %s \n", pathAbs) + + fmt.Printf("Working Directory= %s \n", workDir) + fmt.Printf("Runtime Filename= %s \n", rtFilename) + fmt.Printf("Runtime Directory= %s \n", rtDirectory) + + //dir1 := filepath.Join(workDir, filepath.Dir(path)) + //fmt.Printf("Dir1= %s \n", dir1) + + dirs := []string{ + pathAbs, //try direct path first + filepath.Join(workDir, filepath.Dir(path)), //default + //filepath.Join(rt_directory, "./", filepath.Dir(path)), + filepath.Join(rtDirectory, "./", filepath.Dir(path)), + filepath.Join(rtDirectory, "../", filepath.Dir(path)), + filepath.Join(rtDirectory, "../../", filepath.Dir(path)), + filepath.Join(rtDirectory, "../../../", filepath.Dir(path)), + } + + //for i, dir := range dirs { + // fmt.Printf("Dir[%d]= %s \n", i, dir) + //} + + //must be an absolute path + //error and problem and crash if not absolute path + for i := range dirs { + absPath, err := filepath.Abs(dirs[i]) + if err != nil { + logger.WithError(err).Errorf("filepath.Abs(%s) failed", dirs[i]) + continue + } + dirs[i] = absPath + } + + for _, dir := range dirs { + if _, err := os.Stat(dir); !os.IsNotExist(err) { + fmt.Printf("ResolveResourceDirectory: static resource dir= %s \n", dir) + return dir + } + } + logger.Panic("GUI directory not found") + return "" +} + +// DetermineResourcePath DEPRECATE +func DetermineResourcePath(staticDir string, resourceDir string, devDir string) (string, error) { + //check "dev" directory first + appLoc := filepath.Join(staticDir, devDir) + // if !strings.HasPrefix(appLoc, "/") { + // // Prepend the binary's directory path if appLoc is relative + // dir, err := filepath.Abs(filepath.Dir(os.Args[0])) + // if err != nil { + // return "", err + // } + + // appLoc = filepath.Join(dir, appLoc) + // } + if _, err := os.Stat(appLoc); os.IsNotExist(err) { + //check dist directory + appLoc = filepath.Join(staticDir, resourceDir) + // if !strings.HasPrefix(appLoc, "/") { + // // Prepend the binary's directory path if appLoc is relative + // dir, err := filepath.Abs(filepath.Dir(os.Args[0])) + // if err != nil { + // return "", err + // } + + // appLoc = filepath.Join(dir, appLoc) + // } + + if _, err := os.Stat(appLoc); os.IsNotExist(err) { + return "", err + } + } + + return appLoc, nil +} + +// Copy copies file. Will overwrite dst if dst exists. +func Copy(dst, src string) (err error) { + f, err := os.Open(src) + if err != nil { + return err + } + + defer func() { + cerr := f.Close() + if err == nil { + err = cerr + } + }() + + out, err := os.Create(dst) + if err != nil { + return err + } + + defer func() { + cerr := out.Close() + if err == nil { + err = cerr + } + }() + + _, err = io.Copy(out, f) + return +} + +// Exists checks whether the file exists in the file system +func Exists(fn string) (bool, error) { + _, err := os.Stat(fn) + if os.IsNotExist(err) { + return false, nil + } + if err != nil { + return false, err + } + return true, nil +} + +// IsWritable checks if the file is writable +func IsWritable(name string) bool { + f, err := os.OpenFile(name, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600) + if err != nil && os.IsPermission(err) { + return false + } + f.Close() + return true +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/util/file/file_test.go b/vendor/github.com/SkycoinProject/skycoin/src/util/file/file_test.go new file mode 100644 index 00000000..49f893d9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/util/file/file_test.go @@ -0,0 +1,267 @@ +package file + +import ( + "bytes" + "crypto/rand" + "io/ioutil" + "os" + "path/filepath" + "strings" + "testing" + + "encoding/json" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/testutil" +) + +func requireFileMode(t *testing.T, filename string, mode os.FileMode) { + stat, err := os.Stat(filename) + require.NoError(t, err) + require.Equal(t, stat.Mode(), mode) +} + +func requireFileContentsBinary(t *testing.T, filename string, contents []byte) { + f, err := os.Open(filename) + require.NoError(t, err) + defer f.Close() + b := make([]byte, len(contents)*16) + n, err := f.Read(b) + require.NoError(t, err) + + require.Equal(t, n, len(contents)) + require.True(t, bytes.Equal(b[:n], contents)) +} + +func requireFileContents(t *testing.T, filename, contents string) { //nolint:unparam + requireFileContentsBinary(t, filename, []byte(contents)) +} + +func requireIsRegularFile(t *testing.T, filename string) { + stat := testutil.RequireFileExists(t, filename) + require.True(t, stat.Mode().IsRegular()) +} + +func cleanup(t *testing.T, fn string) { + paths := []string{fn} + err := filepath.Walk(".", func(path string, info os.FileInfo, err error) error { + if err != nil { + panic(err) + } + if strings.Contains(info.Name(), fn+".tmp") { + paths = append(paths, info.Name()) + return nil + } + + if strings.Contains(info.Name(), fn+".bak") { + paths = append(paths, info.Name()) + return nil + } + + return nil + }) + require.NoError(t, err) + + for _, f := range paths { + os.Remove(f) + } +} + +func TestCleanup(t *testing.T) { + fn := "test.bin" + defer cleanup(t, fn) + b := make([]byte, 128) + _, err := rand.Read(b) + require.NoError(t, err) + require.NoError(t, ioutil.WriteFile(fn, b, 0600)) + require.NoError(t, ioutil.WriteFile(fn+".tmp.abc", b, 0600)) + require.NoError(t, ioutil.WriteFile(fn+".bak.abc", b, 0600)) +} + +func TestBuildDataDirDotOk(t *testing.T) { + dir := "./.test-skycoin/test" + builtDir, err := buildDataDir(dir) + require.NoError(t, err) + + cleanDir := filepath.Clean(dir) + require.True(t, strings.HasSuffix(builtDir, cleanDir)) + + gopath := os.Getenv("GOPATH") + // by default go uses GOPATH=$HOME/go if it is not set + if gopath == "" { + home := filepath.Clean(UserHome()) + gopath = filepath.Join(home, "go") + } + + require.True(t, strings.HasPrefix(builtDir, gopath)) + require.NotEqual(t, builtDir, filepath.Clean(gopath)) +} + +func TestBuildDataDirEmptyError(t *testing.T) { + dir, err := buildDataDir("") + require.Empty(t, dir) + require.Error(t, err) + require.Equal(t, ErrEmptyDirectoryName, err) +} + +func TestBuildDataDirDotError(t *testing.T) { + bad := []string{".", "./", "./.", "././", "./../"} + for _, b := range bad { + dir, err := buildDataDir(b) + require.Empty(t, dir) + require.Error(t, err) + require.Equal(t, ErrDotDirectoryName, err) + } +} + +func TestUserHome(t *testing.T) { + home := UserHome() + require.NotEqual(t, home, "") +} + +func TestBuildDataDirDefault(t *testing.T) { + home := UserHome() + defaultDir := filepath.Join(home, ".skycoin") + dir, err := buildDataDir(defaultDir) + require.NoError(t, err) + expectedPath := filepath.Join(home, ".skycoin") + require.Equal(t, dir, expectedPath) +} + +func TestBuildDataDirAbsolute(t *testing.T) { + abspath := "/opt/.skycoin" + dir, err := buildDataDir(abspath) + require.NoError(t, err) + require.Equal(t, abspath, dir) +} + +func TestLoadJSON(t *testing.T) { + obj := struct{ Key string }{} + fn := "test.json" + defer cleanup(t, fn) + + // Loading nonexistant file + testutil.RequireFileNotExists(t, fn) + err := LoadJSON(fn, &obj) + require.Error(t, err) + require.True(t, os.IsNotExist(err)) + + f, err := os.Create(fn) + require.NoError(t, err) + _, err = f.WriteString("{\"key\":\"value\"}") + require.NoError(t, err) + f.Close() + + err = LoadJSON(fn, &obj) + require.NoError(t, err) + require.Equal(t, obj.Key, "value") +} + +func TestSaveJSON(t *testing.T) { + fn := "test.json" + defer cleanup(t, fn) + obj := struct { + Key string `json:"key"` + }{Key: "value"} + + b, err := json.MarshalIndent(obj, "", " ") + require.NoError(t, err) + + err = SaveJSON(fn, obj, 0644) + require.NoError(t, err) + + objHash := cipher.SumSHA256(b).Hex()[:8] + + requireIsRegularFile(t, fn) + testutil.RequireFileNotExists(t, fn+".bak."+objHash) + requireFileMode(t, fn, 0644) + requireFileContents(t, fn, string(b)) + + // Saving again should result in a .bak file same as original + obj.Key = "value2" + err = SaveJSON(fn, obj, 0644) + require.NoError(t, err) + b2, err := json.MarshalIndent(obj, "", " ") + require.NoError(t, err) + + requireFileMode(t, fn, 0644) + requireIsRegularFile(t, fn) + requireFileContents(t, fn, string(b2)) + objHash = cipher.SumSHA256(b2).Hex()[:8] + testutil.RequireFileNotExists(t, fn+".tmp."+objHash) +} + +func TestSaveJSONSafe(t *testing.T) { + fn := "test.json" + defer cleanup(t, fn) + obj := struct { + Key string `json:"key"` + }{Key: "value"} + err := SaveJSONSafe(fn, obj, 0600) + require.NoError(t, err) + b, err := json.MarshalIndent(obj, "", " ") + require.NoError(t, err) + + requireIsRegularFile(t, fn) + requireFileMode(t, fn, 0600) + requireFileContents(t, fn, string(b)) + + // Saving again should result in error, and original file not changed + obj.Key = "value2" + err = SaveJSONSafe(fn, obj, 0600) + require.Error(t, err) + + requireIsRegularFile(t, fn) + requireFileContents(t, fn, string(b)) + objHash := cipher.SumSHA256(b).Hex()[:8] + testutil.RequireFileNotExists(t, fn+".bak."+objHash) + testutil.RequireFileNotExists(t, fn+".tmp."+objHash) +} + +func TestSaveBinary(t *testing.T) { + fn := "test.bin" + defer cleanup(t, fn) + b := make([]byte, 128) + _, err := rand.Read(b) + require.NoError(t, err) + err = SaveBinary(fn, b, 0644) + require.NoError(t, err) + objHash := cipher.SumSHA256(b).Hex()[:8] + testutil.RequireFileNotExists(t, fn+".tmp."+objHash) + testutil.RequireFileNotExists(t, fn+".bak."+objHash) + requireIsRegularFile(t, fn) + requireFileContentsBinary(t, fn, b) + requireFileMode(t, fn, 0644) + + b2 := make([]byte, 128) + _, err = rand.Read(b2) + require.NoError(t, err) + require.False(t, bytes.Equal(b, b2)) + + err = SaveBinary(fn, b2, 0644) + require.NoError(t, err) + requireIsRegularFile(t, fn) + objHash = cipher.SumSHA256(b2).Hex()[:8] + testutil.RequireFileNotExists(t, fn+".tmp."+objHash) + requireFileContentsBinary(t, fn, b2) + // requireFileContentsBinary(t, fn+".bak", b) + requireFileMode(t, fn, 0644) + // requireFileMode(t, fn+".bak", 0644) +} + +func TestIsWritable(t *testing.T) { + fn := "test.bin" + defer cleanup(t, fn) + b := make([]byte, 32) + _, err := rand.Read(b) + require.NoError(t, err) + err = SaveBinary(fn, b, 0400) + require.NoError(t, err) + require.False(t, IsWritable(fn)) + + err = os.Chmod(fn, 0600) + require.NoError(t, err) + require.True(t, IsWritable(fn)) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/util/http/error.go b/vendor/github.com/SkycoinProject/skycoin/src/util/http/error.go new file mode 100644 index 00000000..f9e15762 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/util/http/error.go @@ -0,0 +1,68 @@ +// Package httphelper provides HTTP related utility methods +package httphelper + +import ( + "fmt" + "net/http" +) + +// ErrorXXX writes an error message with status code +func ErrorXXX(w http.ResponseWriter, status int, msg string) { + httpMsg := fmt.Sprintf("%d %s", status, http.StatusText(status)) + if msg != "" { + httpMsg = fmt.Sprintf("%s - %s", httpMsg, msg) + } + + http.Error(w, httpMsg, status) +} + +// Error400 respond with a 400 error and include a message +func Error400(w http.ResponseWriter, msg string) { + ErrorXXX(w, http.StatusBadRequest, msg) +} + +// Error401 respond with a 401 error +func Error401(w http.ResponseWriter, auth, msg string) { + w.Header().Set("WWW-Authenticate", auth) + ErrorXXX(w, http.StatusUnauthorized, msg) +} + +// Error403 respond with a 403 error and include a message +func Error403(w http.ResponseWriter, msg string) { + ErrorXXX(w, http.StatusForbidden, msg) +} + +// Error404 respond with a 404 error and include a message +func Error404(w http.ResponseWriter, msg string) { + ErrorXXX(w, http.StatusNotFound, msg) +} + +// Error405 respond with a 405 error +func Error405(w http.ResponseWriter) { + ErrorXXX(w, http.StatusMethodNotAllowed, "") +} + +// Error415 respond with a 415 error +func Error415(w http.ResponseWriter) { + ErrorXXX(w, http.StatusUnsupportedMediaType, "") +} + +// Error422 response with a 422 error and include a message +func Error422(w http.ResponseWriter, msg string) { + ErrorXXX(w, http.StatusUnprocessableEntity, msg) +} + +// Error500 respond with a 500 error and include a message +func Error500(w http.ResponseWriter, msg string) { + ErrorXXX(w, http.StatusInternalServerError, msg) +} + +// Error501 respond with a 501 error +func Error501(w http.ResponseWriter) { + ErrorXXX(w, http.StatusNotImplemented, "") +} + +// Error503 respond with a 503 error and include a message +func Error503(w http.ResponseWriter, msg string) { + ErrorXXX(w, http.StatusServiceUnavailable, msg) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/util/http/json.go b/vendor/github.com/SkycoinProject/skycoin/src/util/http/json.go new file mode 100644 index 00000000..ffdc38bb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/util/http/json.go @@ -0,0 +1,190 @@ +package httphelper + +// Utilities for sending JSON + +import ( + "encoding/json" + "fmt" + "net/http" + "strconv" + "time" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/util/droplet" + "github.com/SkycoinProject/skycoin/src/util/logging" +) + +// SendJSONOr500 writes an object as JSON, writing a 500 error if it fails +func SendJSONOr500(log *logging.Logger, w http.ResponseWriter, m interface{}) { + out, err := json.MarshalIndent(m, "", " ") + if err != nil { + Error500(w, "json.MarshalIndent failed") + return + } + + w.Header().Add("Content-Type", "application/json") + + if _, err := w.Write(out); err != nil { + log.WithError(err).Error("http Write failed") + } +} + +// Duration JSON type copied from https://github.com/vrischmann/jsonutil, MIT License + +// Duration is a wrapper around time.Duration which implements json.Unmarshaler and json.Marshaler. +// It marshals and unmarshals the duration as a string in the format accepted by time.ParseDuration and returned by time.Duration.String. +type Duration struct { + time.Duration +} + +// FromDuration is a convenience factory to create a Duration instance from the +// given time.Duration value. +func FromDuration(d time.Duration) Duration { + return Duration{d} +} + +// MarshalJSON implements the json.Marshaler interface. The duration is a quoted-string in the format accepted by time.ParseDuration and returned by time.Duration.String. +func (d Duration) MarshalJSON() ([]byte, error) { + return []byte(`"` + d.String() + `"`), nil +} + +// UnmarshalJSON implements the json.Unmarshaler interface. The duration is expected to be a quoted-string of a duration in the format accepted by time.ParseDuration. +func (d *Duration) UnmarshalJSON(data []byte) error { + var s string + if err := json.Unmarshal(data, &s); err != nil { + return err + } + + tmp, err := time.ParseDuration(s) + if err != nil { + return err + } + + d.Duration = tmp + + return nil +} + +// Address is a wrapper around cipher.Address which implements json.Unmarshaler and json.Marshaler. +// It marshals and unmarshals the address as a string +type Address struct { + cipher.Address +} + +// UnmarshalJSON unmarshals a string address to a cipher.Address +func (a *Address) UnmarshalJSON(b []byte) error { + var s string + if err := json.Unmarshal(b, &s); err != nil { + return err + } + + tmp, err := cipher.DecodeBase58Address(s) + if err != nil { + return fmt.Errorf("invalid address: %v", err) + } + + a.Address = tmp + + return nil +} + +// MarshalJSON marshals a cipher.Address in its string representation +func (a Address) MarshalJSON() ([]byte, error) { + return []byte(`"` + a.Address.String() + `"`), nil +} + +// SHA256 is a wrapper around cipher.SHA256 which implements json.Unmarshaler and json.Marshaler. +// It marshals and unmarshals the address as a string +type SHA256 struct { + cipher.SHA256 +} + +// UnmarshalJSON unmarshals a string address to a cipher.SHA256 +func (a *SHA256) UnmarshalJSON(b []byte) error { + var s string + if err := json.Unmarshal(b, &s); err != nil { + return err + } + + tmp, err := cipher.SHA256FromHex(s) + if err != nil { + return fmt.Errorf("invalid SHA256 hash: %v", err) + } + + a.SHA256 = tmp + + return nil +} + +// MarshalJSON marshals a cipher.SHA256 in its string representation +func (a SHA256) MarshalJSON() ([]byte, error) { + return []byte(`"` + a.SHA256.Hex() + `"`), nil +} + +// Coins is a wrapper around uint64 which implements json.Unmarshaler and json.Marshaler. +// It unmarshals a fixed-point decimal string to droplets and vice versa +type Coins uint64 + +// UnmarshalJSON unmarshals a fixed-point decimal string to droplets +func (c *Coins) UnmarshalJSON(b []byte) error { + var s string + if err := json.Unmarshal(b, &s); err != nil { + return err + } + + tmp, err := droplet.FromString(s) + if err != nil { + return err + } + + *c = Coins(tmp) + + return nil +} + +// MarshalJSON marshals droplets to a fixed-point decimal string +func (c Coins) MarshalJSON() ([]byte, error) { + s, err := droplet.ToString(uint64(c)) + if err != nil { + return nil, err + } + + return []byte(`"` + s + `"`), nil +} + +// Value returns the underlying uint64 value +func (c Coins) Value() uint64 { + return uint64(c) +} + +// Hours is a wrapper around uint64 which implements json.Unmarshaler and json.Marshaler. +// It unmarshals a fixed-point decimal string to droplets and vice versa +type Hours uint64 + +// UnmarshalJSON unmarshals a fixed-point decimal string to droplets +func (h *Hours) UnmarshalJSON(b []byte) error { + var s string + if err := json.Unmarshal(b, &s); err != nil { + return err + } + + tmp, err := strconv.ParseUint(s, 10, 64) + if err != nil { + return fmt.Errorf("invalid hours value: %v", err) + } + + *h = Hours(tmp) + + return nil +} + +// MarshalJSON marshals droplets to a fixed-point decimal string +func (h Hours) MarshalJSON() ([]byte, error) { + s := fmt.Sprint(h) + return []byte(`"` + s + `"`), nil +} + +// Value returns the underlying uint64 value +func (h Hours) Value() uint64 { + return uint64(h) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/util/http/json_test.go b/vendor/github.com/SkycoinProject/skycoin/src/util/http/json_test.go new file mode 100644 index 00000000..ce9df8a3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/util/http/json_test.go @@ -0,0 +1,319 @@ +package httphelper + +import ( + "errors" + "fmt" + "math" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/testutil" +) + +func TestFromDuration(t *testing.T) { + dur := 10 * time.Second + require.Equal(t, FromDuration(dur).Duration, dur) +} + +func TestDurationMarshalJSON(t *testing.T) { + d := Duration{time.Second * 10} + data, err := d.MarshalJSON() + + require.NoError(t, err) + require.Equal(t, `"10s"`, string(data)) +} + +func TestDurationUnmarshalJSON(t *testing.T) { + cases := []struct { + name string + s string + expected time.Duration + err string + }{ + { + name: "valid duration", + s: "1m", + expected: time.Minute, + }, + { + name: "invalid duration", + s: "foo", + err: "time: invalid duration foo", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + var d Duration + err := d.UnmarshalJSON([]byte(fmt.Sprintf(`"%s"`, tc.s))) + + if tc.err != "" { + require.Equal(t, errors.New(tc.err), err) + } else { + require.NoError(t, err) + require.Equal(t, tc.expected, d.Duration) + } + + }) + } + + var d Duration + err := d.UnmarshalJSON([]byte("invalidjson")) + testutil.RequireError(t, err, "invalid character 'i' looking for beginning of value") +} + +func TestAddressMarshalJSON(t *testing.T) { + addrStr := "2bfYafFtdkCRNcCyuDvsATV66GvBR9xfvjy" + addrInner, err := cipher.DecodeBase58Address(addrStr) + require.NoError(t, err) + + addr := Address{addrInner} + + data, err := addr.MarshalJSON() + require.NoError(t, err) + require.Equal(t, `"2bfYafFtdkCRNcCyuDvsATV66GvBR9xfvjy"`, string(data)) +} + +func TestAddressUnmarshalJSON(t *testing.T) { + cases := []struct { + name string + addr string + err string + }{ + { + name: "empty address", + addr: "", + err: "invalid address: Invalid base58 string", + }, + { + name: "short address", + addr: "xxx", + err: "invalid address: Invalid address length", + }, + { + name: "invalid base58 address", + addr: "2blYafFtdkCRNcCyuDvsATV66GvBR9xfvjy", + err: "invalid address: Invalid base58 character", + }, + { + name: "valid address", + addr: "2bfYafFtdkCRNcCyuDvsATV66GvBR9xfvjy", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + var a Address + err := a.UnmarshalJSON([]byte(fmt.Sprintf(`"%s"`, tc.addr))) + if tc.err != "" { + require.Equal(t, errors.New(tc.err), err) + } else { + require.NoError(t, err) + addr, err := cipher.DecodeBase58Address(tc.addr) + require.NoError(t, err) + + require.Equal(t, addr, a.Address) + } + }) + } + + var a Address + err := a.UnmarshalJSON([]byte("invalidjson")) + testutil.RequireError(t, err, "invalid character 'i' looking for beginning of value") +} + +func TestCoinsMarshalJSON(t *testing.T) { + c := Coins(111) + + data, err := c.MarshalJSON() + require.NoError(t, err) + require.Equal(t, `"0.000111"`, string(data)) + + c = Coins(math.MaxUint64) + _, err = c.MarshalJSON() + testutil.RequireError(t, err, "Droplet string conversion failed: Value is too large") +} + +func TestCoinsUnmarshalJSON(t *testing.T) { + cases := []struct { + c string + expected uint64 + err string + }{ + { + c: "-1", + err: "Droplet string conversion failed: Negative balance", + }, + { + c: "0", + expected: 0, + }, + { + c: "0.1234567", + err: "Droplet string conversion failed: Too many decimal places", + }, + { + c: "1.001", + expected: 1001e3, + }, + { + c: "1.234567", + expected: 1234567, + }, + { + c: "9", + expected: 9e6, + }, + { + c: ".", + err: "can't convert . to decimal", + }, + { + c: "inf", + err: "can't convert inf to decimal", + }, + { + c: "9223372036854.775807", + expected: uint64(math.MaxInt64), + }, + } + + for _, tc := range cases { + t.Run(fmt.Sprint(tc.c), func(t *testing.T) { + var c Coins + err := c.UnmarshalJSON([]byte(fmt.Sprintf(`"%s"`, tc.c))) + if tc.err != "" { + require.Equal(t, errors.New(tc.err), err) + } else { + require.NoError(t, err) + require.Equal(t, tc.expected, c.Value()) + } + }) + } + + var c Coins + err := c.UnmarshalJSON([]byte("invalidjson")) + testutil.RequireError(t, err, "invalid character 'i' looking for beginning of value") +} + +func TestHoursMarshalJSON(t *testing.T) { + c := Hours(111) + + data, err := c.MarshalJSON() + require.NoError(t, err) + require.Equal(t, `"111"`, string(data)) +} + +func TestHoursUnmarshalJSON(t *testing.T) { + cases := []struct { + c string + expected uint64 + err string + }{ + { + c: "-1", + err: "invalid hours value: strconv.ParseUint: parsing \"-1\": invalid syntax", + }, + { + c: "0", + expected: 0, + }, + { + c: "0.1", + err: "invalid hours value: strconv.ParseUint: parsing \"0.1\": invalid syntax", + }, + { + c: "9", + expected: 9, + }, + { + c: ".", + err: "invalid hours value: strconv.ParseUint: parsing \".\": invalid syntax", + }, + { + c: "inf", + err: "invalid hours value: strconv.ParseUint: parsing \"inf\": invalid syntax", + }, + } + + for _, tc := range cases { + t.Run(fmt.Sprint(tc.c), func(t *testing.T) { + var c Hours + err := c.UnmarshalJSON([]byte(fmt.Sprintf(`"%s"`, tc.c))) + if tc.err != "" { + require.Equal(t, errors.New(tc.err), err) + } else { + require.NoError(t, err) + require.Equal(t, tc.expected, c.Value()) + } + }) + } + + var c Hours + err := c.UnmarshalJSON([]byte("invalidjson")) + testutil.RequireError(t, err, "invalid character 'i' looking for beginning of value") +} + +func TestSHA256MarshalJSON(t *testing.T) { + hash := "97dd062820314c46da0fc18c8c6c10bfab1d5da80c30adc79bbe72e90bfab11d" + + c := SHA256{cipher.MustSHA256FromHex(hash)} + + data, err := c.MarshalJSON() + require.NoError(t, err) + require.Equal(t, `"97dd062820314c46da0fc18c8c6c10bfab1d5da80c30adc79bbe72e90bfab11d"`, string(data)) +} + +func TestSHA256UnmarshalJSON(t *testing.T) { + cases := []struct { + c string + expected cipher.SHA256 + err string + }{ + { + c: "", + err: "invalid SHA256 hash: Invalid hex length", + }, + + { + c: "foo", + err: "invalid SHA256 hash: encoding/hex: invalid byte: U+006F 'o'", + }, + + { + c: "97dd0628", + err: "invalid SHA256 hash: Invalid hex length", + }, + + { + c: "97dd062820314c46da0fc18c8c6c10bfab1d5da80c30adc79bbe72e90bfab11d97", + err: "invalid SHA256 hash: Invalid hex length", + }, + + { + c: "97dd062820314c46da0fc18c8c6c10bfab1d5da80c30adc79bbe72e90bfab11Q", + err: "invalid SHA256 hash: encoding/hex: invalid byte: U+0051 'Q'", + }, + + { + c: "97dd062820314c46da0fc18c8c6c10bfab1d5da80c30adc79bbe72e90bfab11d", + expected: cipher.MustSHA256FromHex("97dd062820314c46da0fc18c8c6c10bfab1d5da80c30adc79bbe72e90bfab11d"), + }, + } + + for _, tc := range cases { + t.Run(tc.c, func(t *testing.T) { + var c SHA256 + err := c.UnmarshalJSON([]byte(fmt.Sprintf(`"%s"`, tc.c))) + if tc.err != "" { + require.Equal(t, errors.New(tc.err), err) + } else { + require.NoError(t, err) + require.Equal(t, tc.expected, c.SHA256) + } + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/util/http/log.go b/vendor/github.com/SkycoinProject/skycoin/src/util/http/log.go new file mode 100644 index 00000000..84f4bee7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/util/http/log.go @@ -0,0 +1,53 @@ +package httphelper + +import ( + "bytes" + "net/http" + "strings" + "time" + + "github.com/sirupsen/logrus" +) + +// ElapsedHandler records and logs an HTTP request with the elapsed time and status code +func ElapsedHandler(logger logrus.FieldLogger, handler http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + lrw := newWrappedResponseWriter(w) + start := time.Now() + handler.ServeHTTP(lrw, r) + logMethod := logger.Infof + if lrw.statusCode >= 400 { + logMethod = logger.WithFields(logrus.Fields{ + "body": strings.TrimSpace(lrw.response.String()), + }).Errorf + } + logMethod("%d %s %s %s", lrw.statusCode, r.Method, r.URL.Path, time.Since(start)) + }) +} + +type wrappedResponseWriter struct { + http.ResponseWriter + statusCode int + response bytes.Buffer +} + +func newWrappedResponseWriter(w http.ResponseWriter) *wrappedResponseWriter { + return &wrappedResponseWriter{ + ResponseWriter: w, + statusCode: http.StatusOK, + response: bytes.Buffer{}, + } +} + +func (lrw *wrappedResponseWriter) WriteHeader(code int) { + lrw.statusCode = code + lrw.ResponseWriter.WriteHeader(code) +} + +func (lrw *wrappedResponseWriter) Write(buff []byte) (int, error) { + retVal, err := lrw.ResponseWriter.Write(buff) + if lrw.statusCode >= 400 { + lrw.response.Write(buff) + } + return retVal, err +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/util/iputil/iputil.go b/vendor/github.com/SkycoinProject/skycoin/src/util/iputil/iputil.go new file mode 100644 index 00000000..1dccbd9c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/util/iputil/iputil.go @@ -0,0 +1,66 @@ +/* +Package iputil provides IP address related utility methods +*/ +package iputil + +import ( + "errors" + "net" + "strconv" +) + +var ( + // ErrMissingIP IP missing from ip:port string + ErrMissingIP = errors.New("IP missing from ip:port address") + // ErrInvalidPort port invalid in ip:port string + ErrInvalidPort = errors.New("Port invalid in ip:port address") + // ErrNoLocalIP no localhost IP found in system net interfaces + ErrNoLocalIP = errors.New("No local IP found") +) + +// LocalhostIP returns the address for localhost on the machine +func LocalhostIP() (string, error) { + tt, err := net.Interfaces() + if err != nil { + return "", err + } + for _, t := range tt { + aa, err := t.Addrs() + if err != nil { + return "", err + } + for _, a := range aa { + if ipnet, ok := a.(*net.IPNet); ok && ipnet.IP.IsLoopback() { + return ipnet.IP.String(), nil + } + } + } + return "", ErrNoLocalIP +} + +// IsLocalhost returns true if addr is a localhost address +// Works for both ipv4 and ipv6 addresses. +func IsLocalhost(addr string) bool { + return net.ParseIP(addr).IsLoopback() || addr == "localhost" +} + +// SplitAddr splits an ip:port string to ip, port. +// Works for both ipv4 and ipv6 addresses. +// If the IP is not specified, returns an error. +func SplitAddr(addr string) (string, uint16, error) { + ip, port, err := net.SplitHostPort(addr) + if err != nil { + return "", 0, err + } + + if ip == "" { + return "", 0, ErrMissingIP + } + + port64, err := strconv.ParseUint(port, 10, 16) + if err != nil { + return "", 0, ErrInvalidPort + } + + return ip, uint16(port64), nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/util/iputil/iputil_test.go b/vendor/github.com/SkycoinProject/skycoin/src/util/iputil/iputil_test.go new file mode 100644 index 00000000..cc437c72 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/util/iputil/iputil_test.go @@ -0,0 +1,123 @@ +package iputil + +import ( + "net" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestIsLocalhost(t *testing.T) { + testData := []struct { + host string + expected bool + }{ + { + host: "0:0:0:0:0:0:0:1", + expected: true, + }, + { + host: "localhost", + expected: true, + }, + { + host: "127.0.0.1", + expected: true, + }, + { + host: "localhost", + expected: true, + }, + { + host: "85.56.12.34", + expected: false, + }, + { + host: "::1", + expected: true, + }, + { + host: "::", + expected: false, + }, + { + host: "2001:0db8:85a3:0000:0000:8a2e:0370:7334", + expected: false, + }, + { + host: "", + expected: false, + }, + } + + for _, tc := range testData { + t.Run(tc.host, func(t *testing.T) { + actual := IsLocalhost(tc.host) + require.Equal(t, tc.expected, actual) + }) + } +} + +func TestSplitAddr(t *testing.T) { + testData := []struct { + input string + host string + port uint16 + err error + }{ + { + input: "0.0.0.0:8888", + host: "0.0.0.0", + port: 8888, + }, + { + input: "0.0.0.0:", + err: ErrInvalidPort, + }, + { + input: "0.0.0.0:x", + err: ErrInvalidPort, + }, + { + input: ":9999", + err: ErrMissingIP, + }, + { + input: "127.0.0.1", + err: &net.AddrError{ + Err: "missing port in address", + Addr: "127.0.0.1", + }, + }, + { + input: "[2001:0db8:85a3:0000:0000:8a2e:0370:7334]:1234", + host: "2001:0db8:85a3:0000:0000:8a2e:0370:7334", + port: 1234, + }, + { + input: "[::]:1234", + host: "::", + port: 1234, + }, + { + input: "[::]:x", + err: ErrInvalidPort, + }, + } + + for _, tc := range testData { + t.Run(tc.input, func(t *testing.T) { + addr, port, err := SplitAddr(tc.input) + + if tc.err != nil { + require.Equal(t, tc.err, err) + return + } + + require.NoError(t, err) + + require.Equal(t, tc.host, addr) + require.Equal(t, tc.port, port) + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/util/logging/formatter.go b/vendor/github.com/SkycoinProject/skycoin/src/util/logging/formatter.go new file mode 100644 index 00000000..e9066f4c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/util/logging/formatter.go @@ -0,0 +1,441 @@ +package logging + +import ( + "bytes" + "fmt" + "io" + "os" + "sort" + "strings" + "sync" + "time" + + "github.com/mgutz/ansi" + "github.com/sirupsen/logrus" + "golang.org/x/crypto/ssh/terminal" +) + +const defaultTimestampFormat = time.RFC3339 + +var ( + baseTimestamp = time.Now() + defaultColorScheme = &ColorScheme{ + InfoLevelStyle: "green", + WarnLevelStyle: "yellow", + ErrorLevelStyle: "red", + FatalLevelStyle: "red", + PanicLevelStyle: "red", + DebugLevelStyle: "blue", + PrefixStyle: "cyan", + TimestampStyle: "black+h", + CallContextStyle: "black+h", + CriticalStyle: "magenta+h", + } + noColorsColorScheme = &compiledColorScheme{ + InfoLevelColor: ansi.ColorFunc(""), + WarnLevelColor: ansi.ColorFunc(""), + ErrorLevelColor: ansi.ColorFunc(""), + FatalLevelColor: ansi.ColorFunc(""), + PanicLevelColor: ansi.ColorFunc(""), + DebugLevelColor: ansi.ColorFunc(""), + PrefixColor: ansi.ColorFunc(""), + TimestampColor: ansi.ColorFunc(""), + CallContextColor: ansi.ColorFunc(""), + CriticalColor: ansi.ColorFunc(""), + } + defaultCompiledColorScheme = compileColorScheme(defaultColorScheme) +) + +func miniTS() int { + return int(time.Since(baseTimestamp) / time.Second) +} + +// ColorScheme configures the logging output colors +type ColorScheme struct { + InfoLevelStyle string + WarnLevelStyle string + ErrorLevelStyle string + FatalLevelStyle string + PanicLevelStyle string + DebugLevelStyle string + PrefixStyle string + TimestampStyle string + CallContextStyle string + CriticalStyle string +} + +type compiledColorScheme struct { + InfoLevelColor func(string) string + WarnLevelColor func(string) string + ErrorLevelColor func(string) string + FatalLevelColor func(string) string + PanicLevelColor func(string) string + DebugLevelColor func(string) string + PrefixColor func(string) string + TimestampColor func(string) string + CallContextColor func(string) string + CriticalColor func(string) string +} + +// TextFormatter formats log output +type TextFormatter struct { + // Set to true to bypass checking for a TTY before outputting colors. + ForceColors bool + + // Force disabling colors. For a TTY colors are enabled by default. + DisableColors bool + + // Force formatted layout, even for non-TTY output. + ForceFormatting bool + + // Disable timestamp logging. useful when output is redirected to logging + // system that already adds timestamps. + DisableTimestamp bool + + // Disable the conversion of the log levels to uppercase + DisableUppercase bool + + // Enable logging the full timestamp when a TTY is attached instead of just + // the time passed since beginning of execution. + FullTimestamp bool + + // Timestamp format to use for display when a full timestamp is printed. + TimestampFormat string + + // The fields are sorted by default for a consistent output. For applications + // that log extremely frequently and don't use the JSON formatter this may not + // be desired. + DisableSorting bool + + // Wrap empty fields in quotes if true. + QuoteEmptyFields bool + + // Can be set to the override the default quoting character " + // with something else. For example: ', or `. + QuoteCharacter string + + // Pad msg field with spaces on the right for display. + // The value for this parameter will be the size of padding. + // Its default value is zero, which means no padding will be applied for msg. + SpacePadding int + + // Always use quotes for string values (except for empty fields) + AlwaysQuoteStrings bool + + // Color scheme to use. + colorScheme *compiledColorScheme + + // Whether the logger's out is to a terminal. + isTerminal bool + + sync.Once +} + +func getCompiledColor(main string, fallback string) func(string) string { + var style string + if main != "" { + style = main + } else { + style = fallback + } + return ansi.ColorFunc(style) +} + +func compileColorScheme(s *ColorScheme) *compiledColorScheme { + return &compiledColorScheme{ + InfoLevelColor: getCompiledColor(s.InfoLevelStyle, defaultColorScheme.InfoLevelStyle), + WarnLevelColor: getCompiledColor(s.WarnLevelStyle, defaultColorScheme.WarnLevelStyle), + ErrorLevelColor: getCompiledColor(s.ErrorLevelStyle, defaultColorScheme.ErrorLevelStyle), + FatalLevelColor: getCompiledColor(s.FatalLevelStyle, defaultColorScheme.FatalLevelStyle), + PanicLevelColor: getCompiledColor(s.PanicLevelStyle, defaultColorScheme.PanicLevelStyle), + DebugLevelColor: getCompiledColor(s.DebugLevelStyle, defaultColorScheme.DebugLevelStyle), + PrefixColor: getCompiledColor(s.PrefixStyle, defaultColorScheme.PrefixStyle), + TimestampColor: getCompiledColor(s.TimestampStyle, defaultColorScheme.TimestampStyle), + CallContextColor: getCompiledColor(s.CallContextStyle, defaultColorScheme.CallContextStyle), + CriticalColor: getCompiledColor(s.CriticalStyle, defaultColorScheme.CriticalStyle), + } +} + +func (f *TextFormatter) init(entry *logrus.Entry) { + if len(f.QuoteCharacter) == 0 { + f.QuoteCharacter = "\"" + } + if entry.Logger != nil { + f.isTerminal = f.checkIfTerminal(entry.Logger.Out) + } +} + +func (f *TextFormatter) checkIfTerminal(w io.Writer) bool { + switch v := w.(type) { + case *os.File: + return terminal.IsTerminal(int(v.Fd())) + default: + return false + } +} + +// SetColorScheme sets the TextFormatter's color scheme configuration +func (f *TextFormatter) SetColorScheme(colorScheme *ColorScheme) { + f.colorScheme = compileColorScheme(colorScheme) +} + +// Format formats a logrus.Entry +func (f *TextFormatter) Format(entry *logrus.Entry) ([]byte, error) { + var b *bytes.Buffer + keys := make([]string, 0, len(entry.Data)) + for k := range entry.Data { + keys = append(keys, k) + } + lastKeyIdx := len(keys) - 1 + + if !f.DisableSorting { + sort.Strings(keys) + } + if entry.Buffer != nil { + b = entry.Buffer + } else { + b = &bytes.Buffer{} + } + + f.Do(func() { f.init(entry) }) + + isFormatted := f.ForceFormatting || f.isTerminal + + timestampFormat := f.TimestampFormat + if timestampFormat == "" { + timestampFormat = defaultTimestampFormat + } + if isFormatted { + isColored := (f.ForceColors || f.isTerminal) && !f.DisableColors + var colorScheme *compiledColorScheme + if isColored { + if f.colorScheme == nil { + colorScheme = defaultCompiledColorScheme + } else { + colorScheme = f.colorScheme + } + } else { + colorScheme = noColorsColorScheme + } + f.printColored(b, entry, keys, timestampFormat, colorScheme) + } else { + if !f.DisableTimestamp { + f.appendKeyValue(b, "time", entry.Time.Format(timestampFormat), true) + } + f.appendKeyValue(b, "level", entry.Level.String(), true) + if entry.Message != "" { + f.appendKeyValue(b, "msg", entry.Message, lastKeyIdx >= 0) + } + for i, key := range keys { + f.appendKeyValue(b, key, entry.Data[key], lastKeyIdx != i) + } + } + + b.WriteByte('\n') //nolint:gosec + return b.Bytes(), nil +} + +func (f *TextFormatter) printColored(b *bytes.Buffer, entry *logrus.Entry, keys []string, timestampFormat string, colorScheme *compiledColorScheme) { + var levelColor func(string) string + var levelText string + switch entry.Level { + case logrus.InfoLevel: + levelColor = colorScheme.InfoLevelColor + case logrus.WarnLevel: + levelColor = colorScheme.WarnLevelColor + case logrus.ErrorLevel: + levelColor = colorScheme.ErrorLevelColor + case logrus.FatalLevel: + levelColor = colorScheme.FatalLevelColor + case logrus.PanicLevel: + levelColor = colorScheme.PanicLevelColor + default: + levelColor = colorScheme.DebugLevelColor + } + + priority, ok := entry.Data[logPriorityKey] + hasPriority := ok && priority == logPriorityCritical + + if entry.Level != logrus.WarnLevel { + levelText = entry.Level.String() + } else { + levelText = "warn" + } + + if !f.DisableUppercase { + levelText = strings.ToUpper(levelText) + } + + level := levelColor(levelText) + message := entry.Message + prefix := "" + + prefixText := extractPrefix(entry) + if prefixText != "" { + prefixText = " " + prefixText + ":" + prefix = colorScheme.PrefixColor(prefixText) + } + + messageFormat := "%s" + if f.SpacePadding != 0 { + messageFormat = fmt.Sprintf("%%-%ds", f.SpacePadding) + } + if message != "" { + messageFormat = " " + messageFormat + } + + callContextParts := []string{} + if ifile, ok := entry.Data["file"]; ok { + if sfile, ok := ifile.(string); ok && sfile != "" { + callContextParts = append(callContextParts, sfile) + } + } + if ifunc, ok := entry.Data["func"]; ok { + if sfunc, ok := ifunc.(string); ok && sfunc != "" { + callContextParts = append(callContextParts, sfunc) + } + } + if iline, ok := entry.Data["line"]; ok { + sline := "" + switch iline := iline.(type) { + case string: + sline = iline + case int, uint, int32, int64, uint32, uint64: + sline = fmt.Sprint(iline) + } + if sline != "" { + callContextParts = append(callContextParts, fmt.Sprint(sline)) + } + } + callContextText := strings.Join(callContextParts, ":") + callContext := colorScheme.CallContextColor(callContextText) + if callContext != "" { + callContext = " " + callContext + } + + if f.DisableTimestamp { + if hasPriority { + str := fmt.Sprintf("%s%s%s"+messageFormat, levelText, callContextText, prefixText, message) + fmt.Fprint(b, colorScheme.CriticalColor(str)) + } else { + fmt.Fprintf(b, "%s%s%s"+messageFormat, level, callContext, prefix, message) + } + } else { + var timestamp string + if !f.FullTimestamp { + timestamp = fmt.Sprintf("[%04d]", miniTS()) + } else { + timestamp = fmt.Sprintf("[%s]", entry.Time.Format(timestampFormat)) + } + + coloredTimestamp := colorScheme.TimestampColor(timestamp) + + if hasPriority { + str := fmt.Sprintf("%s %s%s%s"+messageFormat, timestamp, levelText, callContextText, prefixText, message) + fmt.Fprint(b, colorScheme.CriticalColor(str)) + } else { + fmt.Fprintf(b, "%s %s%s%s"+messageFormat, coloredTimestamp, level, callContext, prefix, message) + } + } + + for _, k := range keys { + if k != "prefix" && k != "file" && k != "func" && k != "line" && k != logPriorityKey && k != logModuleKey { + v := entry.Data[k] + fmt.Fprintf(b, " %s", f.formatKeyValue(levelColor(k), v)) + } + } +} + +func (f *TextFormatter) needsQuoting(text string) bool { + if len(text) == 0 { + return f.QuoteEmptyFields + } + + if f.AlwaysQuoteStrings { + return true + } + + for _, ch := range text { + if !((ch >= 'a' && ch <= 'z') || + (ch >= 'A' && ch <= 'Z') || + (ch >= '0' && ch <= '9') || + ch == '-' || ch == '.') { + return true + } + } + + return false +} + +func extractPrefix(e *logrus.Entry) string { + var module string + if iModule, ok := e.Data[logModuleKey]; ok { + module, _ = iModule.(string) + } + + var priority string + if iPriority, ok := e.Data[logPriorityKey]; ok { + priority, _ = iPriority.(string) + } + + switch { + case priority == "": + return fmt.Sprintf("[%s]", module) + case module == "": + return fmt.Sprintf("[%s]", priority) + default: + return fmt.Sprintf("[%s:%s]", module, priority) + } +} + +func (f *TextFormatter) formatKeyValue(key string, value interface{}) string { + return fmt.Sprintf("%s=%s", key, f.formatValue(value)) +} + +func (f *TextFormatter) formatValue(value interface{}) string { + switch value := value.(type) { + case string: + if f.needsQuoting(value) { + return fmt.Sprintf("%s%+v%s", f.QuoteCharacter, value, f.QuoteCharacter) + } + return value + case error: + errmsg := value.Error() + if f.needsQuoting(errmsg) { + return fmt.Sprintf("%s%+v%s", f.QuoteCharacter, errmsg, f.QuoteCharacter) + } + return errmsg + default: + return fmt.Sprintf("%+v", value) + } +} + +func (f *TextFormatter) appendKeyValue(b *bytes.Buffer, key string, value interface{}, appendSpace bool) { + b.WriteString(key) //nolint:gosec + b.WriteByte('=') //nolint:gosec + f.appendValue(b, value) //nolint:gosec + + if appendSpace { + b.WriteByte(' ') //nolint:gosec + } +} + +func (f *TextFormatter) appendValue(b *bytes.Buffer, value interface{}) { + switch value := value.(type) { + case string: + if f.needsQuoting(value) { + fmt.Fprintf(b, "%s%+v%s", f.QuoteCharacter, value, f.QuoteCharacter) + } else { + b.WriteString(value) //nolint:gosec + } + case error: + errmsg := value.Error() + if f.needsQuoting(errmsg) { + fmt.Fprintf(b, "%s%+v%s", f.QuoteCharacter, errmsg, f.QuoteCharacter) + } else { + b.WriteString(errmsg) //nolint:gosec + } + default: + fmt.Fprint(b, value) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/util/logging/hooks.go b/vendor/github.com/SkycoinProject/skycoin/src/util/logging/hooks.go new file mode 100644 index 00000000..d8d0cc61 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/util/logging/hooks.go @@ -0,0 +1,44 @@ +package logging + +import ( + "io" + + "github.com/sirupsen/logrus" +) + +// WriteHook is a logrus.Hook that logs to an io.Writer +type WriteHook struct { + w io.Writer + formatter logrus.Formatter +} + +// NewWriteHook returns a new WriteHook +func NewWriteHook(w io.Writer) *WriteHook { + return &WriteHook{ + w: w, + formatter: &TextFormatter{ + DisableColors: true, + FullTimestamp: true, + AlwaysQuoteStrings: true, + QuoteEmptyFields: true, + ForceFormatting: true, + }, + } +} + +// Levels returns Levels accepted by the WriteHook. +// All logrus.Levels are returned. +func (f *WriteHook) Levels() []logrus.Level { + return logrus.AllLevels +} + +// Fire writes a logrus.Entry to the file +func (f *WriteHook) Fire(e *logrus.Entry) error { + b, err := f.formatter.Format(e) + if err != nil { + return err + } + + _, err = f.w.Write(b) + return err +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/util/logging/logger.go b/vendor/github.com/SkycoinProject/skycoin/src/util/logging/logger.go new file mode 100644 index 00000000..7b7e3359 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/util/logging/logger.go @@ -0,0 +1,77 @@ +package logging + +import ( + "os" + "time" + + "github.com/sirupsen/logrus" +) + +// Logger wraps logrus.FieldLogger +type Logger struct { + logrus.FieldLogger +} + +// Critical adds special critical-level fields for specially highlighted logging, +// since logrus lacks a distinct critical field and does not have configurable log levels +func (logger *Logger) Critical() logrus.FieldLogger { + return logger.WithField(logPriorityKey, logPriorityCritical) +} + +// WithTime overrides time, used by logger. +func (logger *Logger) WithTime(t time.Time) *logrus.Entry { + return logger.WithFields(logrus.Fields{}).WithTime(t) +} + +// MasterLogger wraps logrus.Logger and is able to create new package-aware loggers +type MasterLogger struct { + *logrus.Logger +} + +// NewMasterLogger creates a new package-aware logger with formatting string +func NewMasterLogger() *MasterLogger { + hooks := make(logrus.LevelHooks) + + return &MasterLogger{ + Logger: &logrus.Logger{ + Out: os.Stdout, + Formatter: &TextFormatter{ + FullTimestamp: true, + AlwaysQuoteStrings: true, + QuoteEmptyFields: true, + ForceFormatting: true, + DisableColors: false, + ForceColors: false, + }, + Hooks: hooks, + Level: logrus.DebugLevel, + }, + } +} + +// PackageLogger instantiates a package-aware logger +func (logger *MasterLogger) PackageLogger(moduleName string) *Logger { + return &Logger{ + FieldLogger: logger.WithField(logModuleKey, moduleName), + } +} + +// AddHook adds a logrus.Hook to the logger and its module loggers +func (logger *MasterLogger) AddHook(hook logrus.Hook) { + logger.Hooks.Add(hook) +} + +// SetLevel sets the log level for the logger and its module loggers +func (logger *MasterLogger) SetLevel(level logrus.Level) { + logger.Level = level +} + +// EnableColors enables colored logging +func (logger *MasterLogger) EnableColors() { + logger.Formatter.(*TextFormatter).DisableColors = false +} + +// DisableColors disables colored logging +func (logger *MasterLogger) DisableColors() { + logger.Formatter.(*TextFormatter).DisableColors = true +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/util/logging/logging.go b/vendor/github.com/SkycoinProject/skycoin/src/util/logging/logging.go new file mode 100644 index 00000000..f7b86ffc --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/util/logging/logging.go @@ -0,0 +1,79 @@ +/* +Package logging provides application logging utilities +*/ +package logging + +import ( + "errors" + "io" + "io/ioutil" + "strings" + + "github.com/sirupsen/logrus" +) + +var log = NewMasterLogger() + +const ( + // logModuleKey is the key used for the module name data entry + logModuleKey = "_module" + // logPriorityKey is the log entry key for priority log statements + logPriorityKey = "_priority" + // logPriorityCritical is the log entry value for priority log statements + logPriorityCritical = "CRITICAL" +) + +// LevelFromString returns a logrus.Level from a string identifier +func LevelFromString(s string) (logrus.Level, error) { + switch strings.ToLower(s) { + case "debug": + return logrus.DebugLevel, nil + case "info", "notice": + return logrus.InfoLevel, nil + case "warn", "warning": + return logrus.WarnLevel, nil + case "error": + return logrus.ErrorLevel, nil + case "fatal", "critical": + return logrus.FatalLevel, nil + case "panic": + return logrus.PanicLevel, nil + default: + return logrus.DebugLevel, errors.New("could not convert string to log level") + } +} + +// MustGetLogger returns a package-aware logger from the master logger +func MustGetLogger(module string) *Logger { + return log.PackageLogger(module) +} + +// AddHook adds a hook to the global logger +func AddHook(hook logrus.Hook) { + log.AddHook(hook) +} + +// EnableColors enables colored logging +func EnableColors() { + log.EnableColors() +} + +// DisableColors disables colored logging +func DisableColors() { + log.DisableColors() +} + +// SetLevel sets the logger's minimum log level +func SetLevel(level logrus.Level) { + log.SetLevel(level) +} + +// SetOutputTo sets the logger's output to an io.Writer +func SetOutputTo(w io.Writer) { + log.Out = w +} + +// Disable disables the logger completely +func Disable() { + log.Out = ioutil.Discard +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/util/mathutil/mathutil.go b/vendor/github.com/SkycoinProject/skycoin/src/util/mathutil/mathutil.go new file mode 100644 index 00000000..d1b7a191 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/util/mathutil/mathutil.go @@ -0,0 +1,81 @@ +// Package mathutil provides math utilities +package mathutil + +import ( + "errors" + "math" +) + +var ( + // ErrUint64MultOverflow is returned if when multiplying uint64 values would overflow uint64 + ErrUint64MultOverflow = errors.New("uint64 multiplication overflow") + // ErrUint64AddOverflow is returned if when adding uint64 values would overflow uint64 + ErrUint64AddOverflow = errors.New("uint64 addition overflow") + // ErrUint32AddOverflow is returned if when adding uint32 values would overflow uint32 + ErrUint32AddOverflow = errors.New("uint32 addition overflow") + // ErrUint64OverflowsInt64 is returned if when converting a uint64 to an int64 would overflow int64 + ErrUint64OverflowsInt64 = errors.New("uint64 overflows int64") + // ErrInt64UnderflowsUint64 is returned if when converting an int64 to a uint64 would underflow uint64 + ErrInt64UnderflowsUint64 = errors.New("int64 underflows uint64") + // ErrIntUnderflowsUint32 is returned if when converting an int to a uint32 would underflow uint32 + ErrIntUnderflowsUint32 = errors.New("int underflows uint32") + // ErrIntOverflowsUint32 is returned if when converting an int to a uint32 would overflow uint32 + ErrIntOverflowsUint32 = errors.New("int overflows uint32") +) + +// MultUint64 multiplies a by b, returning an error if the values would overflow +func MultUint64(a, b uint64) (uint64, error) { + c := a * b + if a != 0 && c/a != b { + return 0, ErrUint64MultOverflow + } + return c, nil +} + +// AddUint64 adds a and b, returning an error if the values would overflow +func AddUint64(a, b uint64) (uint64, error) { + c := a + b + if c < a || c < b { + return 0, ErrUint64AddOverflow + } + return c, nil +} + +// AddUint32 adds a and b, returning an error if the values would overflow +func AddUint32(a, b uint32) (uint32, error) { + c := a + b + if c < a || c < b { + return 0, ErrUint32AddOverflow + } + return c, nil +} + +// Uint64ToInt64 converts a uint64 to an int64, returning an error if the uint64 value overflows int64 +func Uint64ToInt64(a uint64) (int64, error) { + b := int64(a) + if b < 0 { + return 0, ErrUint64OverflowsInt64 + } + return b, nil +} + +// Int64ToUint64 converts an int64 to a uint64, returning an error if the int64 value underflows uint64 +func Int64ToUint64(a int64) (uint64, error) { + if a < 0 { + return 0, ErrInt64UnderflowsUint64 + } + return uint64(a), nil +} + +// IntToUint32 converts int to uint32, returning an error if the int value is negative or overflows uint32 +func IntToUint32(a int) (uint32, error) { + if a < 0 { + return 0, ErrIntUnderflowsUint32 + } + + if uint64(a) > math.MaxUint32 { + return 0, ErrIntOverflowsUint32 + } + + return uint32(a), nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/util/mathutil/mathutil_64bit_test.go b/vendor/github.com/SkycoinProject/skycoin/src/util/mathutil/mathutil_64bit_test.go new file mode 100644 index 00000000..8afabad9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/util/mathutil/mathutil_64bit_test.go @@ -0,0 +1,40 @@ +// +build !386,!amd64p32,!arm,!armbe,!mips,!mipsle,!mips64p32,!mips64p32le,!ppc,!s390,!sparc + +package mathutil + +import ( + "fmt" + "math" + "testing" + + "github.com/stretchr/testify/require" +) + +func Test64BitIntToUint32(t *testing.T) { + // Remaining tests defined in TestIntToUint32 + cases := []struct { + a int + b uint32 + err error + }{ + { + a: math.MaxUint32 + 1, + err: ErrIntOverflowsUint32, + }, + { + a: math.MaxUint32, + b: math.MaxUint32, + }, + } + + for _, tc := range cases { + t.Run(fmt.Sprint(tc.a), func(t *testing.T) { + x, err := IntToUint32(tc.a) + if tc.err != nil { + require.Equal(t, tc.err, err) + } else { + require.Equal(t, tc.b, x) + } + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/util/mathutil/mathutil_test.go b/vendor/github.com/SkycoinProject/skycoin/src/util/mathutil/mathutil_test.go new file mode 100644 index 00000000..6d3e8f0f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/util/mathutil/mathutil_test.go @@ -0,0 +1,153 @@ +package mathutil + +import ( + "fmt" + "math" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestAddUint64(t *testing.T) { + n, err := AddUint64(10, 11) + require.NoError(t, err) + require.Equal(t, uint64(21), n) + + _, err = AddUint64(math.MaxUint64, 1) + require.Error(t, err) +} + +func TestAddUint32(t *testing.T) { + n, err := AddUint32(10, 11) + require.NoError(t, err) + require.Equal(t, uint32(21), n) + + _, err = AddUint32(math.MaxUint32, 1) + require.Error(t, err) +} + +func TestMultUint64(t *testing.T) { + n, err := MultUint64(10, 11) + require.NoError(t, err) + require.Equal(t, uint64(110), n) + + _, err = MultUint64(math.MaxUint64/2, 3) + require.Error(t, err) +} + +func TestUint64ToInt64(t *testing.T) { + cases := []struct { + a uint64 + b int64 + err error + }{ + { + a: 0, + b: 0, + }, + { + a: 1, + b: 1, + }, + { + a: math.MaxInt64, + b: math.MaxInt64, + }, + { + a: math.MaxUint64, + err: ErrUint64OverflowsInt64, + }, + { + a: math.MaxInt64 + 1, + err: ErrUint64OverflowsInt64, + }, + } + + for _, tc := range cases { + t.Run(fmt.Sprint(tc.a), func(t *testing.T) { + x, err := Uint64ToInt64(tc.a) + if tc.err != nil { + require.Equal(t, tc.err, err) + } else { + require.Equal(t, tc.b, x) + } + }) + } +} + +func TestInt64ToUint64(t *testing.T) { + cases := []struct { + a int64 + b uint64 + err error + }{ + { + a: 0, + b: 0, + }, + { + a: 1, + b: 1, + }, + { + a: math.MaxInt64, + b: math.MaxInt64, + }, + { + a: -math.MaxInt64, + err: ErrInt64UnderflowsUint64, + }, + { + a: -1, + err: ErrInt64UnderflowsUint64, + }, + } + + for _, tc := range cases { + t.Run(fmt.Sprint(tc.a), func(t *testing.T) { + x, err := Int64ToUint64(tc.a) + if tc.err != nil { + require.Equal(t, tc.err, err) + } else { + require.Equal(t, tc.b, x) + } + }) + } +} + +func TestIntToUint32(t *testing.T) { + cases := []struct { + a int + b uint32 + err error + }{ + { + a: 0, + b: 0, + }, + { + a: -1, + err: ErrIntUnderflowsUint32, + }, + { + a: math.MaxInt32, + b: math.MaxInt32, + }, + { + a: 999, + b: 999, + }, + // 64bit test defined in Test64BitIntToUint32 + } + + for _, tc := range cases { + t.Run(fmt.Sprint(tc.a), func(t *testing.T) { + x, err := IntToUint32(tc.a) + if tc.err != nil { + require.Equal(t, tc.err, err) + } else { + require.Equal(t, tc.b, x) + } + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/util/timeutil/timeutil.go b/vendor/github.com/SkycoinProject/skycoin/src/util/timeutil/timeutil.go new file mode 100644 index 00000000..75486840 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/util/timeutil/timeutil.go @@ -0,0 +1,15 @@ +/* +Package timeutil provides time related utility methods +*/ +package timeutil + +import "time" + +// NanoToTime converts nanoseconds to time.Time +func NanoToTime(n int64) time.Time { + zeroTime := time.Time{} + if n == zeroTime.UnixNano() { + return zeroTime + } + return time.Unix(n/int64(time.Second), n%int64(time.Second)) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/util/useragent/useragent.go b/vendor/github.com/SkycoinProject/skycoin/src/util/useragent/useragent.go new file mode 100644 index 00000000..b338aed3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/util/useragent/useragent.go @@ -0,0 +1,222 @@ +// Package useragent implements methods for managing Skycoin user agents. +// +// A skycoin user agent has the following format: +// +// `$NAME:$VERSION[$GIT_HASH]($REMARK)` +// +// `$NAME` and `$VERSION` are required. +// +// * `$NAME` is the coin or application's name, e.g. `Skycoin`. It can contain the following characters: `A-Za-z0-9\-_+`. +// * `$VERSION` must be a valid [semver](http://semver.org/) version, e.g. `1.2.3` or `1.2.3-rc1`. +// Semver has the option of including build metadata such as the git commit hash, but this is not included by the default client. +// * `$REMARK` is optional. If not present, the enclosing brackets `()` should be omitted. +// It can contain the following characters: `A-Za-z0-9\-_+;:!$%,.=?~ ` (includes the space character). +package useragent + +import ( + "encoding/json" + "errors" + "fmt" + "regexp" + "strings" + + "github.com/blang/semver" +) + +const ( + // IllegalChars are printable ascii characters forbidden from a user agent string. All other ascii or bytes are also forbidden. + IllegalChars = `<>&"'#@|{}` + "`" + // MaxLen the maximum length of a user agent + MaxLen = 256 + + // NamePattern is the regex pattern for the name portion of the user agent + NamePattern = `[A-Za-z0-9\-_+]+` + // VersionPattern is the regex pattern for the version portion of the user agent + VersionPattern = `[0-9]+\.[0-9]+\.[0-9][A-Za-z0-9\-.+]*` + // RemarkPattern is the regex pattern for the remark portion of the user agent + RemarkPattern = `[A-Za-z0-9\-_+;:!$%,.=?~ ]+` + + // Pattern is the regex pattern for the user agent in entirety + Pattern = `^(` + NamePattern + `):(` + VersionPattern + `)(\(` + RemarkPattern + `\))?$` +) + +var ( + illegalCharsSanitizeRe *regexp.Regexp + illegalCharsCheckRe *regexp.Regexp + re *regexp.Regexp + + // ErrIllegalChars user agent contains illegal characters + ErrIllegalChars = errors.New("User agent has invalid character(s)") + // ErrTooLong user agent exceeds a certain max length + ErrTooLong = errors.New("User agent is too long") + // ErrMalformed user agent does not match the user agent pattern + ErrMalformed = errors.New("User agent is malformed") + // ErrEmpty user agent is an empty string + ErrEmpty = errors.New("User agent is an empty string") +) + +func init() { + illegalCharsSanitizeRe = regexp.MustCompile(fmt.Sprintf("([^[:print:]]|[%s])+", IllegalChars)) + illegalCharsCheckRe = regexp.MustCompile(fmt.Sprintf("[^[:print:]]|[%s]", IllegalChars)) + re = regexp.MustCompile(Pattern) +} + +// Data holds parsed user agent data +type Data struct { + Coin string + Version string + Remark string +} + +// Empty returns true if the Data is empty +func (d Data) Empty() bool { + return d == (Data{}) +} + +// Build builds a user agent string. Returns an error if the user agent would be invalid. +func (d Data) Build() (string, error) { + if d.Coin == "" { + return "", errors.New("missing coin name") + } + if d.Version == "" { + return "", errors.New("missing version") + } + + _, err := semver.Parse(d.Version) + if err != nil { + return "", err + } + + s := d.build() + + if err := validate(s); err != nil { + return "", err + } + + d2, err := Parse(s) + if err != nil { + return "", fmt.Errorf("Built a user agent that fails to parse: %q %v", s, err) + } + + if d2 != d { + return "", errors.New("Built a user agent that does not parse to the original format") + } + + return s, nil +} + +// MustBuild calls Build and panics on error +func (d Data) MustBuild() string { + s, err := d.Build() + if err != nil { + panic(err) + } + return s +} + +func (d Data) build() string { + if d.Coin == "" || d.Version == "" { + return "" + } + + remark := d.Remark + if remark != "" { + remark = fmt.Sprintf("(%s)", remark) + } + + return fmt.Sprintf("%s:%s%s", d.Coin, d.Version, remark) +} + +// MarshalJSON marshals Data as JSON +func (d Data) MarshalJSON() ([]byte, error) { + return []byte(fmt.Sprintf(`"%s"`, d.build())), nil +} + +// UnmarshalJSON unmarshals []byte to Data +func (d *Data) UnmarshalJSON(v []byte) error { + var s string + if err := json.Unmarshal(v, &s); err != nil { + return err + } + + if s == "" { + return nil + } + + parsed, err := Parse(s) + if err != nil { + return err + } + + *d = parsed + return nil +} + +// Parse parses a user agent string to Data +func Parse(userAgent string) (Data, error) { + if len(userAgent) == 0 { + return Data{}, ErrEmpty + } + + if err := validate(userAgent); err != nil { + return Data{}, err + } + + subs := re.FindAllStringSubmatch(userAgent, -1) + + if len(subs) == 0 { + return Data{}, ErrMalformed + } + + m := subs[0] + + if m[0] != userAgent { + // This should not occur since the pattern has ^$ boundaries applied, but just in case + return Data{}, errors.New("User agent did not match pattern completely") + } + + coin := m[1] + version := m[2] + remark := m[3] + + if _, err := semver.Parse(version); err != nil { + return Data{}, fmt.Errorf("User agent version is not a valid semver: %v", err) + } + + remark = strings.TrimPrefix(remark, "(") + remark = strings.TrimSuffix(remark, ")") + + return Data{ + Coin: coin, + Version: version, + Remark: remark, + }, nil +} + +// MustParse parses and panics on error +func MustParse(userAgent string) Data { + d, err := Parse(userAgent) + if err != nil { + panic(err) + } + + return d +} + +// validate validates a user agent string. The user agent must not contain illegal characters. +func validate(userAgent string) error { + if len(userAgent) > MaxLen { + return ErrTooLong + } + + if illegalCharsCheckRe.MatchString(userAgent) { + return ErrIllegalChars + } + + return nil +} + +// Sanitize removes illegal characters from a user agent string +func Sanitize(userAgent string) string { + return illegalCharsSanitizeRe.ReplaceAllLiteralString(userAgent, "") +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/util/useragent/useragent_test.go b/vendor/github.com/SkycoinProject/skycoin/src/util/useragent/useragent_test.go new file mode 100644 index 00000000..b3f71351 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/util/useragent/useragent_test.go @@ -0,0 +1,270 @@ +package useragent + +import ( + "encoding/json" + "errors" + "fmt" + "strings" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestDataBuild(t *testing.T) { + cases := []struct { + name string + data Data + userAgent string + err error + }{ + { + name: "without remark", + userAgent: "Skycoin:0.24.1", + data: Data{ + Coin: "Skycoin", + Version: "0.24.1", + }, + }, + { + name: "with remark", + userAgent: "Skycoin:0.24.1(remark; foo)", + data: Data{ + Coin: "Skycoin", + Version: "0.24.1", + Remark: "remark; foo", + }, + }, + { + name: "invalid characters in coin", + data: Data{ + Coin: "foo<>", + Version: "0.24.1", + }, + err: ErrIllegalChars, + }, + { + name: "invalid characters in version", + data: Data{ + Coin: "foo", + Version: "<0.24.1", + }, + err: errors.New(`Invalid character(s) found in major number "<0"`), + }, + { + name: "invalid characters in remark", + data: Data{ + Coin: "foo", + Version: "0.24.1", + Remark: "<>", + }, + err: ErrIllegalChars, + }, + { + name: "missing coin", + data: Data{ + Version: "0.24.1", + }, + err: errors.New("missing coin name"), + }, + { + name: "missing version", + data: Data{ + Coin: "Skycoin", + }, + err: errors.New("missing version"), + }, + { + name: "version is not valid semver", + data: Data{ + Coin: "Skycoin", + Version: "0.24", + }, + err: errors.New("No Major.Minor.Patch elements found"), + }, + { + name: "invalid remark", + data: Data{ + Coin: "skycoin", + Version: "0.24.1", + Remark: "\t", + }, + err: ErrIllegalChars, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + userAgent, err := tc.data.Build() + + if tc.err != nil { + require.Equal(t, tc.err, err) + return + } + + require.NoError(t, err) + require.Equal(t, tc.userAgent, userAgent) + }) + } +} + +func TestParse(t *testing.T) { + cases := []struct { + name string + userAgent string + data Data + err error + }{ + { + name: "too long", + userAgent: fmt.Sprintf("skycoin:0.24.1[abcdefg](%s)", strings.Repeat("a", 245)), + err: ErrTooLong, + }, + { + name: "no tab chars allowed", + userAgent: "skycoin:0.24.1(\t)", + err: ErrIllegalChars, + }, + { + name: "no newlines allowed", + userAgent: "skycoin:0.24.1(\n)", + err: ErrIllegalChars, + }, + { + name: "valid", + userAgent: "skycoin:0.25.0", + data: Data{ + Coin: "skycoin", + Version: "0.25.0", + }, + }, + { + name: "valid, version has suffix", + userAgent: "skycoin:0.25.1", + data: Data{ + Coin: "skycoin", + Version: "0.25.1", + }, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + d, err := Parse(tc.userAgent) + if tc.err != nil { + require.Equal(t, tc.err, err) + return + } + + require.NoError(t, err) + require.Equal(t, tc.data, d) + }) + } +} + +func TestDataJSON(t *testing.T) { + d := Data{} + + x, err := json.Marshal(d) + require.NoError(t, err) + require.Equal(t, `""`, string(x)) + + d.Coin = "skycoin" + d.Version = "0.25.0" + + x, err = json.Marshal(d) + require.NoError(t, err) + require.Equal(t, `"skycoin:0.25.0"`, string(x)) + + var e Data + err = json.Unmarshal([]byte(x), &e) + require.NoError(t, err) + require.Equal(t, d, e) + + d.Remark = "foo; bar" + + x, err = json.Marshal(d) + require.NoError(t, err) + require.Equal(t, `"skycoin:0.25.0(foo; bar)"`, string(x)) + + e = Data{} + err = json.Unmarshal([]byte(x), &e) + require.NoError(t, err) + require.Equal(t, d, e) + + // Fails, does not parse to a string + err = json.Unmarshal([]byte("{}"), &e) + require.Error(t, err) + + // OK, empty string + e = Data{} + err = json.Unmarshal([]byte(`""`), &e) + require.NoError(t, err) + require.Equal(t, Data{}, e) + + // Fails, does not parse + err = json.Unmarshal([]byte(`"skycoin:0.25.0(<>)"`), &e) + require.Equal(t, ErrIllegalChars, err) +} + +func TestSanitize(t *testing.T) { + for i := 0; i < len(IllegalChars); i++ { + x := "t" + IllegalChars[i:i+1] + t.Run(x, func(t *testing.T) { + require.Equal(t, "t", Sanitize(x)) + }) + } + + for i := 0; i < 256; i++ { + j := byte(i) + if j >= ' ' || j <= '~' { + continue + } + + v := []byte{'t', j} + + t.Run(fmt.Sprintf("%q", j), func(t *testing.T) { + require.Equal(t, "t", Sanitize(string(v))) + }) + } + + z := "dog\t\t\t\ncat\x01t\xE3\xE4t" + require.Equal(t, "dogcattt", Sanitize(z)) + + // Should not have anything stripped + x := "Skycoin:0.25.0(foo; bar)" + require.Equal(t, x, Sanitize(x)) + + // Should not have anything stripped + x = "Skycoin:0.25.1(foo; bar)" + require.Equal(t, x, Sanitize(x)) +} + +func TestEmpty(t *testing.T) { + var d Data + require.True(t, d.Empty()) + + d.Coin = "skycoin" + d.Version = "0.25.0" + require.False(t, d.Empty()) +} + +func TestMustParse(t *testing.T) { + d := MustParse("skycoin:0.25.0") + require.Equal(t, Data{ + Coin: "skycoin", + Version: "0.25.0", + }, d) + + require.Panics(t, func() { + MustParse("foo") //nolint:errcheck + }) +} + +func TestMustBuild(t *testing.T) { + d := Data{ + Version: "0", + } + require.Panics(t, func() { + d.MustBuild() //nolint:errcheck + }) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/blockchain.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockchain.go new file mode 100644 index 00000000..0d251b8f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockchain.go @@ -0,0 +1,852 @@ +package visor + +import ( + "bytes" + "errors" + "fmt" + "sync" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/util/fee" + "github.com/SkycoinProject/skycoin/src/visor/blockdb" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" + "github.com/SkycoinProject/skycoin/src/visor/historydb" +) + +const ( + // DebugLevel1 checks for extremely unlikely conditions (10e-40) + DebugLevel1 = true + // DebugLevel2 enable checks for impossible conditions + DebugLevel2 = true +) + +var ( + // ErrVerifyStopped is returned when database verification is interrupted + ErrVerifyStopped = errors.New("database verification stopped") +) + +// ErrBlockNotExist may be returned if a block is not found +type ErrBlockNotExist struct { + Seq uint64 +} + +// NewErrBlockNotExist creates an ErrBlockNotExist based on an unknown block sequence +func NewErrBlockNotExist(seq uint64) ErrBlockNotExist { + return ErrBlockNotExist{ + Seq: seq, + } +} + +func (e ErrBlockNotExist) Error() string { + return fmt.Sprintf("block does not exist seq=%d", e.Seq) +} + +//Warning: 10e6 is 10 million, 1e6 is 1 million + +// Note: DebugLevel1 adds additional checks for hash collisions that +// are unlikely to occur. DebugLevel2 adds checks for conditions that +// can only occur through programmer error and malice. + +// Note: a droplet is the base coin unit. Each Skycoin is one million droplets + +//Termonology: +// UXTO - unspent transaction outputs +// UX - outputs10 +// TX - transactions + +//Notes: +// transactions (TX) consume outputs (UX) and produce new outputs (UX) +// Tx.Uxi() - set of outputs consumed by transaction +// Tx.Uxo() - set of outputs created by transaction + +// chainStore +type chainStore interface { + Head(*dbutil.Tx) (*coin.SignedBlock, error) + HeadSeq(*dbutil.Tx) (uint64, bool, error) + Len(*dbutil.Tx) (uint64, error) + AddBlock(*dbutil.Tx, *coin.SignedBlock) error + GetBlockByHash(*dbutil.Tx, cipher.SHA256) (*coin.Block, error) + GetSignedBlockByHash(*dbutil.Tx, cipher.SHA256) (*coin.SignedBlock, error) + GetSignedBlockBySeq(*dbutil.Tx, uint64) (*coin.SignedBlock, error) + UnspentPool() blockdb.UnspentPooler + GetGenesisBlock(*dbutil.Tx) (*coin.SignedBlock, error) + GetBlockSignature(*dbutil.Tx, *coin.Block) (cipher.Sig, bool, error) + ForEachBlock(*dbutil.Tx, func(*coin.Block) error) error +} + +// DefaultWalker default blockchain walker +func DefaultWalker(tx *dbutil.Tx, hps []coin.HashPair) (cipher.SHA256, bool) { + if len(hps) == 0 { + return cipher.SHA256{}, false + } + return hps[0].Hash, true +} + +// CreateBuckets creates the buckets used by the blockdb +func CreateBuckets(db *dbutil.DB) error { + return db.Update("CreateBuckets", func(tx *dbutil.Tx) error { + if err := historydb.CreateBuckets(tx); err != nil { + return err + } + + if err := blockdb.CreateBuckets(tx); err != nil { + return err + } + + return dbutil.CreateBuckets(tx, [][]byte{ + UnconfirmedTxnsBkt, + UnconfirmedUnspentsBkt, + }) + }) +} + +// BlockchainConfig configures Blockchain options +type BlockchainConfig struct { + // Arbitrating mode: if in arbitrating mode, when block publishing node execute blocks, + // the invalid transaction will be skipped and continue the next; otherwise, + // node will throw the error and return. + Arbitrating bool + Pubkey cipher.PubKey +} + +// Blockchain maintains blockchain and provides apis for accessing the chain. +type Blockchain struct { + db *dbutil.DB + cfg BlockchainConfig + store chainStore +} + +// NewBlockchain creates a Blockchain +func NewBlockchain(db *dbutil.DB, cfg BlockchainConfig) (*Blockchain, error) { + chainstore, err := blockdb.NewBlockchain(db, DefaultWalker) + if err != nil { + return nil, err + } + + return &Blockchain{ + cfg: cfg, + db: db, + store: chainstore, + }, nil +} + +// GetGenesisBlock returns genesis block +func (bc *Blockchain) GetGenesisBlock(tx *dbutil.Tx) (*coin.SignedBlock, error) { + return bc.store.GetGenesisBlock(tx) +} + +// GetSignedBlockByHash returns block of given hash +func (bc *Blockchain) GetSignedBlockByHash(tx *dbutil.Tx, hash cipher.SHA256) (*coin.SignedBlock, error) { + return bc.store.GetSignedBlockByHash(tx, hash) +} + +// GetSignedBlockBySeq returns block of given seq +func (bc *Blockchain) GetSignedBlockBySeq(tx *dbutil.Tx, seq uint64) (*coin.SignedBlock, error) { + return bc.store.GetSignedBlockBySeq(tx, seq) +} + +// Head returns the most recent confirmed block +func (bc Blockchain) Head(tx *dbutil.Tx) (*coin.SignedBlock, error) { + return bc.store.Head(tx) +} + +// Unspent returns the unspent outputs pool +func (bc *Blockchain) Unspent() blockdb.UnspentPooler { + return bc.store.UnspentPool() +} + +// Len returns the length of current blockchain. +func (bc Blockchain) Len(tx *dbutil.Tx) (uint64, error) { + return bc.store.Len(tx) +} + +// HeadSeq returns the sequence of head block +func (bc *Blockchain) HeadSeq(tx *dbutil.Tx) (uint64, bool, error) { + return bc.store.HeadSeq(tx) +} + +// Time returns time of last block +// used as system clock indepedent clock for coin hour calculations +// TODO: Deprecate +func (bc *Blockchain) Time(tx *dbutil.Tx) (uint64, error) { + b, err := bc.Head(tx) + if err != nil { + if err == blockdb.ErrNoHeadBlock { + return 0, nil + } + return 0, err + } + + return b.Time(), nil +} + +// NewBlock creates a Block given an array of Transactions. +// Only hard constraints are applied to transactions in the block. +// The caller of this function should apply any additional soft constraints, +// and choose which transactions to place into the block. +func (bc Blockchain) NewBlock(tx *dbutil.Tx, txns coin.Transactions, currentTime uint64) (*coin.Block, error) { + if len(txns) == 0 { + return nil, errors.New("No transactions") + } + + head, err := bc.store.Head(tx) + if err != nil { + return nil, err + } + + if currentTime <= head.Time() { + return nil, errors.New("Time can only move forward") + } + + txns, err = bc.processTransactions(tx, txns) + if err != nil { + return nil, err + } + + uxHash, err := bc.Unspent().GetUxHash(tx) + if err != nil { + return nil, err + } + + feeCalc := bc.TransactionFee(tx, head.Time()) + + b, err := coin.NewBlock(head.Block, currentTime, uxHash, txns, feeCalc) + if err != nil { + return nil, err + } + + // make sure block is valid + if DebugLevel2 { + if err := bc.verifyBlockHeader(tx, *b); err != nil { + return nil, err + } + txns, err := bc.processTransactions(tx, b.Body.Transactions) + if err != nil { + logger.Panicf("bc.processTransactions second verification call failed: %v", err) + } + b.Body.Transactions = txns + } + return b, nil +} + +func (bc *Blockchain) processBlock(tx *dbutil.Tx, b coin.SignedBlock) (coin.SignedBlock, error) { + length, err := bc.Len(tx) + if err != nil { + return coin.SignedBlock{}, err + } + + if length > 0 { + if isGenesis, err := bc.isGenesisBlock(tx, b.Block); err != nil { + return coin.SignedBlock{}, err + } else if isGenesis { + err := errors.New("Attempted to process genesis block after blockchain has genesis block") + logger.Warning(err.Error()) + return coin.SignedBlock{}, err + } else { + if err := bc.verifyBlockHeader(tx, b.Block); err != nil { + return coin.SignedBlock{}, err + } + + txns, err := bc.processTransactions(tx, b.Body.Transactions) + if err != nil { + return coin.SignedBlock{}, err + } + b.Body.Transactions = txns + + if err := bc.verifyUxHash(tx, b.Block); err != nil { + return coin.SignedBlock{}, err + } + + } + } + + return b, nil +} + +// ExecuteBlock attempts to append block to blockchain with *dbutil.Tx +func (bc *Blockchain) ExecuteBlock(tx *dbutil.Tx, sb *coin.SignedBlock) error { + length, err := bc.Len(tx) + if err != nil { + return err + } + + if length > 0 { + head, err := bc.Head(tx) + if err != nil { + return err + } + + // TODO -- why do we modify the block here? + sb.Head.PrevHash = head.HashHeader() + } + + nb, err := bc.processBlock(tx, *sb) + if err != nil { + return err + } + + if err := bc.store.AddBlock(tx, &nb); err != nil { + return err + } + + return nil +} + +// VerifyBlock verifies specified block against current state of blockchain. +func (bc *Blockchain) VerifyBlock(tx *dbutil.Tx, sb *coin.SignedBlock) error { + _, err := bc.processBlock(tx, *sb) + + return err +} + +// isGenesisBlock checks if the block is genesis block +func (bc Blockchain) isGenesisBlock(tx *dbutil.Tx, b coin.Block) (bool, error) { + gb, err := bc.store.GetGenesisBlock(tx) + if err != nil { + return false, err + } + if gb == nil { + return false, nil + } + + return gb.HashHeader() == b.HashHeader(), nil +} + +// Compares the state of the current UxHash hash to state of unspent +// output pool. +func (bc Blockchain) verifyUxHash(tx *dbutil.Tx, b coin.Block) error { + uxHash, err := bc.Unspent().GetUxHash(tx) + if err != nil { + return err + } + + if !bytes.Equal(b.Head.UxHash[:], uxHash[:]) { + return errors.New("UxHash does not match") + } + + return nil +} + +// VerifyBlockTxnConstraints checks that the transaction does not violate hard constraints, +// for transactions that are already included in a block. +func (bc Blockchain) VerifyBlockTxnConstraints(tx *dbutil.Tx, txn coin.Transaction) error { + // NOTE: Unspent().GetArray() returns an error if not all txn.In can be found + // This prevents double spends + uxIn, err := bc.Unspent().GetArray(tx, txn.In) + if err != nil { + switch err.(type) { + case blockdb.ErrUnspentNotExist: + return NewErrTxnViolatesHardConstraint(err) + default: + return err + } + } + + head, err := bc.Head(tx) + if err != nil { + return err + } + + return bc.verifyBlockTxnHardConstraints(tx, txn, head, uxIn) +} + +func (bc Blockchain) verifyBlockTxnHardConstraints(tx *dbutil.Tx, txn coin.Transaction, head *coin.SignedBlock, uxIn coin.UxArray) error { + if err := VerifyBlockTxnConstraints(txn, head.Head, uxIn); err != nil { + return err + } + + if DebugLevel1 { + // Check that new unspents don't collide with existing. + // This should not occur but is a sanity check. + // NOTE: this is not in the top-level VerifyBlockTxnConstraints + // because it relies on the unspent pool to check for existence. + // For remote callers such as the CLI, they'd need to download the whole + // unspent pool or make a separate API call to check for duplicate unspents. + uxOuts := coin.CreateUnspents(head.Head, txn) + for i := range uxOuts { + if contains, err := bc.Unspent().Contains(tx, uxOuts[i].Hash()); err != nil { + return err + } else if contains { + err := errors.New("New unspent collides with existing unspent") + return NewErrTxnViolatesHardConstraint(err) + } + } + } + + return nil +} + +// VerifySingleTxnHardConstraints checks that the transaction does not violate hard constraints. +// for transactions that are not included in a block. +func (bc Blockchain) VerifySingleTxnHardConstraints(tx *dbutil.Tx, txn coin.Transaction, signed TxnSignedFlag) error { + // NOTE: Unspent().GetArray() returns an error if not all txn.In can be found + // This prevents double spends + uxIn, err := bc.Unspent().GetArray(tx, txn.In) + if err != nil { + switch err.(type) { + case blockdb.ErrUnspentNotExist: + return NewErrTxnViolatesHardConstraint(err) + default: + return err + } + } + + head, err := bc.Head(tx) + if err != nil { + return err + } + + return bc.verifySingleTxnHardConstraints(tx, txn, head, uxIn, signed) +} + +// VerifySingleTxnSoftHardConstraints checks that the transaction does not violate hard or soft constraints, +// for transactions that are not included in a block. +// Hard constraints are checked before soft constraints. +func (bc Blockchain) VerifySingleTxnSoftHardConstraints(tx *dbutil.Tx, txn coin.Transaction, distParams params.Distribution, verifyParams params.VerifyTxn, signed TxnSignedFlag) (*coin.SignedBlock, coin.UxArray, error) { + // NOTE: Unspent().GetArray() returns an error if not all txn.In can be found + // This prevents double spends + uxIn, err := bc.Unspent().GetArray(tx, txn.In) + if err != nil { + return nil, nil, NewErrTxnViolatesHardConstraint(err) + } + + head, err := bc.Head(tx) + if err != nil { + return nil, nil, err + } + + // Hard constraints must be checked before soft constraints + if err := bc.verifySingleTxnHardConstraints(tx, txn, head, uxIn, signed); err != nil { + return nil, nil, err + } + + if err := VerifySingleTxnSoftConstraints(txn, head.Time(), uxIn, distParams, verifyParams); err != nil { + return nil, nil, err + } + + return head, uxIn, nil +} + +func (bc Blockchain) verifySingleTxnHardConstraints(tx *dbutil.Tx, txn coin.Transaction, head *coin.SignedBlock, uxIn coin.UxArray, signed TxnSignedFlag) error { + if err := VerifySingleTxnHardConstraints(txn, head.Head, uxIn, signed); err != nil { + return err + } + + if DebugLevel1 { + // Check that new unspents don't collide with existing. + // This should not occur but is a sanity check. + // NOTE: this is not in the top-level VerifySingleTxnHardConstraints + // because it relies on the unspent pool to check for existence. + // For remote callers such as the CLI, they'd need to download the whole + // unspent pool or make a separate API call to check for duplicate unspents. + uxOuts := coin.CreateUnspents(head.Head, txn) + for i := range uxOuts { + if contains, err := bc.Unspent().Contains(tx, uxOuts[i].Hash()); err != nil { + return err + } else if contains { + err := errors.New("New unspent collides with existing unspent") + return NewErrTxnViolatesHardConstraint(err) + } + } + } + + return nil +} + +// GetBlocks returns blocks matching seqs. If any block is not found, returns an error. +func (bc Blockchain) GetBlocks(tx *dbutil.Tx, seqs []uint64) ([]coin.SignedBlock, error) { + blocks := make([]coin.SignedBlock, len(seqs)) + + for i, s := range seqs { + b, err := bc.store.GetSignedBlockBySeq(tx, s) + if err != nil { + return nil, err + } + + if b == nil { + return nil, NewErrBlockNotExist(s) + } + + blocks[i] = *b + } + + return blocks, nil +} + +// GetBlocksInRange return blocks whose seq are in the range of start and end. +func (bc Blockchain) GetBlocksInRange(tx *dbutil.Tx, start, end uint64) ([]coin.SignedBlock, error) { + if start > end { + return nil, nil + } + + var blocks []coin.SignedBlock + for i := start; i <= end; i++ { + b, err := bc.store.GetSignedBlockBySeq(tx, i) + if err != nil { + logger.WithError(err).Error("bc.store.GetSignedBlockBySeq failed") + return nil, err + } + + if b == nil { + break + } + + blocks = append(blocks, *b) + } + + return blocks, nil +} + +// GetLastBlocks return the latest N blocks. +func (bc Blockchain) GetLastBlocks(tx *dbutil.Tx, num uint64) ([]coin.SignedBlock, error) { + if num == 0 { + return nil, nil + } + + end, ok, err := bc.HeadSeq(tx) + if err != nil { + return nil, err + } + if !ok { + return nil, nil + } + + start := int(end-num) + 1 + if start < 0 { + start = 0 + } + + return bc.GetBlocksInRange(tx, uint64(start), end) +} + +/* Private */ + +// Validates a set of Transactions, individually, against each other and +// against the Blockchain. If firstFail is true, it will return an error +// as soon as it encounters one. Else, it will return an array of +// Transactions that are valid as a whole. It may return an error if +// firstFalse is false, if there is no way to filter the txns into a valid +// array, i.e. processTransactions(processTransactions(txn, false), true) +// should not result in an error, unless all txns are invalid. +// TODO: +// - move arbitration to visor +// - blockchain should have strict checking +func (bc Blockchain) processTransactions(tx *dbutil.Tx, txs coin.Transactions) (coin.Transactions, error) { + // copy txs so that the following code won't modify the original txns + txns := make(coin.Transactions, len(txs)) + copy(txns, txs) + + head, err := bc.store.Head(tx) + if err != nil { + return nil, err + } + + // Transactions need to be sorted by fee and hash before arbitrating + if bc.cfg.Arbitrating { + txns, err = coin.SortTransactions(txns, bc.TransactionFee(tx, head.Time())) + if err != nil { + logger.Critical().WithError(err).Error("processTransactions: coin.SortTransactions failed") + return nil, err + } + } + + //TODO: audit + if len(txns) == 0 { + if bc.cfg.Arbitrating { + return txns, nil + } + + // If there are no transactions, a block should not be made + return nil, errors.New("No transactions") + } + + skip := make(map[int]struct{}) + uxHashes := make(coin.UxHashSet, len(txns)) + for i, txn := range txns { + // Check the transaction against itself. This covers the hash, + // signature indices and duplicate spends within itself + if err := bc.VerifyBlockTxnConstraints(tx, txn); err != nil { + switch err.(type) { + case ErrTxnViolatesSoftConstraint: + logger.Critical().WithError(err).Panic("bc.VerifyBlockTxnConstraints should not return a ErrTxnViolatesSoftConstraint error") + case ErrTxnViolatesHardConstraint: + if bc.cfg.Arbitrating { + skip[i] = struct{}{} + continue + } + } + + return nil, err + } + + // Check that each pending unspent will be unique + uxb := coin.UxBody{ + SrcTransaction: txn.Hash(), + } + + for _, to := range txn.Out { + uxb.Coins = to.Coins + uxb.Hours = to.Hours + uxb.Address = to.Address + + h := uxb.Hash() + _, exists := uxHashes[h] + if exists { + if bc.cfg.Arbitrating { + skip[i] = struct{}{} + continue + } else { + return nil, errors.New("Duplicate unspent output across transactions") + } + } + + if DebugLevel1 { + // Check that the expected unspent is not already in the pool. + // This should never happen because its a hash collision + if contains, err := bc.Unspent().Contains(tx, h); err != nil { + return nil, err + } else if contains { + if bc.cfg.Arbitrating { + skip[i] = struct{}{} + continue + } else { + return nil, errors.New("Output hash is in the UnspentPool") + } + } + } + + uxHashes[h] = struct{}{} + } + } + + // Filter invalid transactions before arbitrating between colliding ones + if len(skip) > 0 { + newtxns := make(coin.Transactions, len(txns)-len(skip)) + j := 0 + for i := range txns { + if _, shouldSkip := skip[i]; !shouldSkip { + newtxns[j] = txns[i] + j++ + } + } + txns = newtxns + skip = make(map[int]struct{}) + } + + // Check to ensure that there are no duplicate spends in the entire block, + // and that we aren't creating duplicate outputs. Duplicate outputs + // within a single Transaction are already checked by VerifyBlockTxnConstraints + hashes := txns.Hashes() + for i := 0; i < len(txns)-1; i++ { + s := txns[i] + for j := i + 1; j < len(txns); j++ { + t := txns[j] + if DebugLevel1 { + if hashes[i] == hashes[j] { + // This is a non-recoverable error for filtering, and + // should never occur. It indicates a hash collision + // amongst different txns. Duplicate transactions are + // caught earlier, when duplicate expected outputs are + // checked for, and will not trigger this. + return nil, errors.New("Unexpected duplicate transaction") + } + } + for a := range s.In { + for b := range t.In { + if s.In[a] == t.In[b] { + if bc.cfg.Arbitrating { + // The txn with the highest fee and lowest hash + // is chosen when attempting a double spend. + // Since the txns are sorted, we skip the 2nd + // iterable + skip[j] = struct{}{} + } else { + return nil, errors.New("Cannot spend output twice in the same block") + } + } + } + } + } + } + + // Filter the final results, if necessary + if len(skip) > 0 { + newtxns := make(coin.Transactions, 0, len(txns)-len(skip)) + for i := range txns { + if _, shouldSkip := skip[i]; !shouldSkip { + newtxns = append(newtxns, txns[i]) + } + } + return newtxns, nil + } + + return txns, nil +} + +// TransactionFee calculates the current transaction fee in coinhours of a Transaction +func (bc Blockchain) TransactionFee(tx *dbutil.Tx, headTime uint64) coin.FeeCalculator { + return func(txn *coin.Transaction) (uint64, error) { + inUxs, err := bc.Unspent().GetArray(tx, txn.In) + if err != nil { + return 0, err + } + + return fee.TransactionFee(txn, headTime, inUxs) + } +} + +// VerifySignature checks that BlockSigs state correspond with coin.Blockchain state +// and that all signatures are valid. +func (bc *Blockchain) VerifySignature(block *coin.SignedBlock) error { + err := block.VerifySignature(bc.cfg.Pubkey) + if err != nil { + logger.Errorf("Blockchain signature verification failed for block %d: %v", block.Head.BkSeq, err) + } + return err +} + +// WalkChain walk through the blockchain concurrently +// The quit channel is optional and if closed, this method still stop. +func (bc *Blockchain) WalkChain(workers int, f func(*dbutil.Tx, *coin.SignedBlock) error, quit chan struct{}) error { + if quit == nil { + quit = make(chan struct{}) + } + + signedBlockC := make(chan *coin.SignedBlock, 100) + errC := make(chan error, 100) + interrupt := make(chan struct{}) + verifyDone := make(chan struct{}) + + // Verify block signatures in a worker pool + var workerWg sync.WaitGroup + workerWg.Add(workers) + for i := 0; i < workers; i++ { + go func() { + defer workerWg.Done() + if err := bc.db.View("WalkChain verify blocks", func(tx *dbutil.Tx) error { + for b := range signedBlockC { + if err := f(tx, b); err != nil { + // if err := cipher.VerifyPubKeySignedHash(bc.cfg.Pubkey, sh.sig, sh.hash); err != nil { + // logger.Errorf("Signature verification failed: %v", err) + select { + case errC <- err: + default: + } + } + } + return nil + }); err != nil { + logger.WithError(err).Error("WalkChain verify blocks db transaction failed") + } + }() + } + + // Wait for verification worker goroutines to finish + var wg sync.WaitGroup + wg.Add(1) + go func() { + defer wg.Done() + workerWg.Wait() + close(verifyDone) + }() + + // Iterate all blocks stored in the "blocks" bucket + // * Detect if a corresponding signature is missing from the signatures bucket + // * Verify the signature for the block + wg.Add(1) + go func() { + if err := bc.db.View("WalkChain get blocks", func(tx *dbutil.Tx) error { + if length, err := bc.Len(tx); err != nil { + return err + } else if length == 0 { + return nil + } + defer wg.Done() + defer close(signedBlockC) + + errInterrupted := errors.New("goroutine was stopped") + + if err := bc.store.ForEachBlock(tx, func(block *coin.Block) error { + sig, ok, err := bc.store.GetBlockSignature(tx, block) + if err != nil { + return err + } + if !ok { + return blockdb.NewErrMissingSignature(block) + } + + signedBlock := &coin.SignedBlock{ + Sig: sig, + Block: *block, + } + + select { + case signedBlockC <- signedBlock: + return nil + case <-quit: + return errInterrupted + case <-interrupt: + return errInterrupted + } + }); err != nil && err != errInterrupted { + switch err.(type) { + case blockdb.ErrMissingSignature: + default: + logger.Errorf("bc.store.ForEachBlock failed: %v", err) + } + select { + case errC <- err: + default: + } + } + return nil + }); err != nil { + logger.WithError(err).Error("WalkChain get blocks db transaction failed") + } + }() + + var err error + select { + case err = <-errC: + if err != nil { + break + } + case <-quit: + err = ErrVerifyStopped + break + case <-verifyDone: + break + } + + close(interrupt) + wg.Wait() + return err +} + +// VerifyBlockHeader Returns error if the BlockHeader is not valid +func (bc Blockchain) verifyBlockHeader(tx *dbutil.Tx, b coin.Block) error { + head, err := bc.Head(tx) + if err != nil { + return err + } + + //check BkSeq + if b.Head.BkSeq != head.Head.BkSeq+1 { + return errors.New("BkSeq invalid") + } + //check Time, only requirement is that its monotonely increasing + if b.Head.Time <= head.Head.Time { + return errors.New("Block time must be > head time") + } + // Check block hash against previous head + if b.Head.PrevHash != head.HashHeader() { + return errors.New("PrevHash does not match current head") + } + + if b.Body.Hash() != b.Head.BodyHash { + return errors.New("Computed body hash does not match") + } + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/blockchain_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockchain_test.go new file mode 100644 index 00000000..d5b96796 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockchain_test.go @@ -0,0 +1,864 @@ +package visor + +import ( + "errors" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/visor/blockdb" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +var ( + genPublic, genSecret = cipher.GenerateKeyPair() + genAddress = cipher.AddressFromPubKey(genPublic) +) + +var genTime uint64 = 1000 +var genCoins uint64 = 1000e6 + +func feeCalc(t *coin.Transaction) (uint64, error) { + return 0, nil +} + +func addGenesisBlockToBlockchain(t *testing.T, bc *Blockchain) *coin.SignedBlock { + // create genesis block + gb, err := coin.NewGenesisBlock(genAddress, genCoins, genTime) + require.NoError(t, err) + gbSig := cipher.MustSignHash(gb.HashHeader(), genSecret) + + // add genesis block to blockchain + err = bc.db.Update("", func(tx *dbutil.Tx) error { + return bc.store.AddBlock(tx, &coin.SignedBlock{ + Block: *gb, + Sig: gbSig, + }) + }) + require.NoError(t, err) + + return &coin.SignedBlock{ + Block: *gb, + Sig: gbSig, + } +} + +func makeSpendTxn(t *testing.T, uxs coin.UxArray, keys []cipher.SecKey, toAddr cipher.Address, coins uint64) coin.Transaction { + spendTxn := coin.Transaction{} + var totalHours uint64 + var totalCoins uint64 + for _, ux := range uxs { + err := spendTxn.PushInput(ux.Hash()) + require.NoError(t, err) + totalHours += ux.Body.Hours + totalCoins += ux.Body.Coins + } + + require.True(t, coins <= totalCoins) + + hours := totalHours / 4 + + err := spendTxn.PushOutput(toAddr, coins, hours) + require.NoError(t, err) + if totalCoins-coins != 0 { + err := spendTxn.PushOutput(uxs[0].Body.Address, totalCoins-coins, totalHours/4) + require.NoError(t, err) + } + spendTxn.SignInputs(keys) + err = spendTxn.UpdateHeader() + require.NoError(t, err) + return spendTxn +} + +/* Helpers */ +type fakeChainStore struct { + blocks []coin.SignedBlock +} + +func (fcs *fakeChainStore) Head(tx *dbutil.Tx) (*coin.SignedBlock, error) { + l := len(fcs.blocks) + if l == 0 { + return nil, blockdb.ErrNoHeadBlock + } + + return &fcs.blocks[l-1], nil +} + +func (fcs *fakeChainStore) HeadSeq(tx *dbutil.Tx) (uint64, bool, error) { + h, err := fcs.Head(tx) + if err != nil { + if err == blockdb.ErrNoHeadBlock { + return 0, false, nil + } + return 0, false, err + } + return h.Seq(), true, nil +} + +func (fcs *fakeChainStore) Len(tx *dbutil.Tx) (uint64, error) { + return uint64(len(fcs.blocks)), nil +} + +func (fcs *fakeChainStore) AddBlock(tx *dbutil.Tx, b *coin.SignedBlock) error { + return nil +} + +func (fcs *fakeChainStore) GetBlockSignature(tx *dbutil.Tx, b *coin.Block) (cipher.Sig, bool, error) { + return cipher.Sig{}, false, nil +} + +func (fcs *fakeChainStore) GetBlockByHash(tx *dbutil.Tx, hash cipher.SHA256) (*coin.Block, error) { + return nil, nil +} + +func (fcs *fakeChainStore) GetSignedBlockByHash(tx *dbutil.Tx, hash cipher.SHA256) (*coin.SignedBlock, error) { + return nil, nil +} + +func (fcs *fakeChainStore) GetSignedBlockBySeq(tx *dbutil.Tx, seq uint64) (*coin.SignedBlock, error) { + l := len(fcs.blocks) + if seq >= uint64(l) { + return nil, nil + } + + return &fcs.blocks[seq], nil +} + +func (fcs *fakeChainStore) UnspentPool() blockdb.UnspentPooler { + return nil +} + +func (fcs *fakeChainStore) GetGenesisBlock(tx *dbutil.Tx) (*coin.SignedBlock, error) { + if len(fcs.blocks) > 0 { + return &fcs.blocks[0], nil + } + return nil, nil +} + +func (fcs *fakeChainStore) ForEachBlock(tx *dbutil.Tx, f func(*coin.Block) error) error { + return nil +} + +func makeBlock(t *testing.T, preBlock coin.Block, tm uint64) *coin.Block { + uxHash := testutil.RandSHA256(t) + tx := coin.Transaction{} + b, err := coin.NewBlock(preBlock, tm, uxHash, coin.Transactions{tx}, feeCalc) + require.NoError(t, err) + return b +} + +func makeBlocks(t *testing.T, n int) []coin.SignedBlock { + var bs []coin.SignedBlock + preBlock, err := coin.NewGenesisBlock(genAddress, genCoins, genTime) + require.NoError(t, err) + bs = append(bs, coin.SignedBlock{Block: *preBlock}) + + now := genTime + 100 + for i := 1; i < n; i++ { + b := makeBlock(t, *preBlock, now+uint64(i)*100) + sb := coin.SignedBlock{ + Block: *b, + } + bs = append(bs, sb) + preBlock = b + } + + return bs +} + +func TestBlockchainTime(t *testing.T) { + bs := makeBlocks(t, 1) + tt := []struct { + name string + store chainStore + time uint64 + }{ + { + "ok", + &fakeChainStore{ + blocks: bs[:], + }, + bs[0].Time(), + }, + { + "no head", + &fakeChainStore{}, + uint64(0), + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + db, closeDB := prepareDB(t) + defer closeDB() + + bc := Blockchain{ + db: db, + store: tc.store, + } + + err := db.View("", func(tx *dbutil.Tx) error { + tm, err := bc.Time(tx) + require.NoError(t, err) + require.Equal(t, tc.time, tm) + return nil + }) + require.NoError(t, err) + }) + } +} + +func TestIsGenesisBlock(t *testing.T) { + bs := makeBlocks(t, 2) + tt := []struct { + name string + store chainStore + b *coin.Block + isGenesis bool + }{ + { + "genesis block", + &fakeChainStore{ + blocks: bs[:1], + }, + &bs[0].Block, + true, + }, + { + "not genesis block", + &fakeChainStore{ + blocks: bs[:1], + }, + &bs[1].Block, + false, + }, + { + "empty chain", + &fakeChainStore{}, + &bs[0].Block, + false, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + bc := Blockchain{ + store: tc.store, + } + + isGenesis, err := bc.isGenesisBlock(nil, *tc.b) + require.NoError(t, err) + require.Equal(t, tc.isGenesis, isGenesis) + }) + } +} + +func TestVerifyBlockHeader(t *testing.T) { + bs := makeBlocks(t, 5) + tt := []struct { + name string + store chainStore + b coin.Block + err error + }{ + { + "ok", + &fakeChainStore{ + blocks: bs[:1], + }, + bs[1].Block, + nil, + }, + { + "invalid block seq", + &fakeChainStore{ + blocks: bs[:1], + }, + bs[2].Block, + errors.New("BkSeq invalid"), + }, + { + "invalid time", + &fakeChainStore{ + blocks: bs[:1], + }, + coin.Block{ + Head: coin.BlockHeader{ + BkSeq: 1, + Time: 0, + }, + }, + + errors.New("Block time must be > head time"), + }, + { + "invalid prehash", + &fakeChainStore{ + blocks: bs[:1], + }, + coin.Block{ + Head: coin.BlockHeader{ + BkSeq: 1, + Time: bs[1].Time(), + }, + }, + + errors.New("PrevHash does not match current head"), + }, + { + "empty blockchain", + &fakeChainStore{}, + coin.Block{}, + blockdb.ErrNoHeadBlock, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + db, closeDB := prepareDB(t) + defer closeDB() + + bc := &Blockchain{ + db: db, + store: tc.store, + } + + err := db.View("", func(tx *dbutil.Tx) error { + err := bc.verifyBlockHeader(tx, tc.b) + require.Equal(t, tc.err, err) + return nil + }) + require.NoError(t, err) + }) + } +} + +func TestGetBlocks(t *testing.T) { + blocks := makeBlocks(t, 5) + tt := []struct { + name string + store chainStore + req struct { + st uint64 + ed uint64 + } + expect []coin.SignedBlock + }{ + { + "ok", + &fakeChainStore{ + blocks: blocks[:], + }, + struct { + st uint64 + ed uint64 + }{ + 0, + 1, + }, + blocks[:2], + }, + { + "start > end", + &fakeChainStore{ + blocks: blocks[:], + }, + struct { + st uint64 + ed uint64 + }{ + 1, + 0, + }, + nil, + }, + { + "start overflow", + &fakeChainStore{ + blocks: blocks[:], + }, + struct { + st uint64 + ed uint64 + }{ + 6, + 7, + }, + nil, + }, + { + "start == end", + &fakeChainStore{ + blocks: blocks[:], + }, + struct { + st uint64 + ed uint64 + }{ + 0, + 0, + }, + blocks[:1], + }, + { + "end overflow", + &fakeChainStore{ + blocks: blocks[:], + }, + struct { + st uint64 + ed uint64 + }{ + 0, + 8, + }, + blocks[:], + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + db, closeDB := prepareDB(t) + defer closeDB() + + bc := Blockchain{ + db: db, + store: tc.store, + } + + err := db.View("", func(tx *dbutil.Tx) error { + bs, err := bc.GetBlocksInRange(tx, tc.req.st, tc.req.ed) + require.NoError(t, err) + require.Equal(t, len(tc.expect), len(bs)) + require.Equal(t, tc.expect, bs) + return nil + }) + require.NoError(t, err) + }) + } +} + +func TestGetLastBlocks(t *testing.T) { + blocks := makeBlocks(t, 5) + tt := []struct { + name string + store chainStore + n uint64 + expect []coin.SignedBlock + }{ + { + "get last block", + &fakeChainStore{ + blocks: blocks[:], + }, + 1, + blocks[4:5], + }, + { + "get last two block", + &fakeChainStore{ + blocks: blocks[:], + }, + 2, + blocks[3:5], + }, + { + "get all block", + &fakeChainStore{ + blocks: blocks[:], + }, + 5, + blocks[0:5], + }, + { + "get block from empty chain", + &fakeChainStore{}, + 1, + nil, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + db, closeDB := prepareDB(t) + defer closeDB() + + bc := Blockchain{ + db: db, + store: tc.store, + } + + err := db.View("", func(tx *dbutil.Tx) error { + bs, err := bc.GetLastBlocks(tx, tc.n) + require.NoError(t, err) + require.Equal(t, tc.expect, bs) + return nil + }) + require.NoError(t, err) + }) + } + +} + +// newBlock calls bc.NewBlock in a dbutil.Tx +func newBlock(t *testing.T, bc *Blockchain, txn coin.Transaction, timestamp uint64) *coin.Block { + var b *coin.Block + err := bc.db.View("", func(tx *dbutil.Tx) error { + var err error + b, err = bc.NewBlock(tx, coin.Transactions{txn}, timestamp) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) + return b +} + +type spending struct { + TxIndex int + UxIndex int + Keys []cipher.SecKey + ToAddr cipher.Address + Coins uint64 +} + +func TestProcessTransactions(t *testing.T) { + toAddrs := make([]cipher.Address, 10) + keys := make([]cipher.SecKey, 10) + for i := 0; i < 10; i++ { + p, s := cipher.GenerateKeyPair() + toAddrs[i] = cipher.AddressFromPubKey(p) + keys[i] = s + } + + tt := []struct { + name string + arbitrating bool + initChain []spending + spends []spending + err error + }{ + { + "ok", + false, + []spending{}, + []spending{ + spending{ + TxIndex: 0, + UxIndex: 0, + Keys: []cipher.SecKey{genSecret}, + ToAddr: toAddrs[0], + Coins: 10e6, + }, + }, + nil, + }, + { + "no transactions", + false, + []spending{}, + []spending{}, + errors.New("No transactions"), + }, + { + "invalid signature", + false, + []spending{}, + []spending{ + spending{ + TxIndex: 0, + UxIndex: 0, + Keys: []cipher.SecKey{keys[0]}, + ToAddr: toAddrs[0], + Coins: 10e6, + }, + }, + NewErrTxnViolatesHardConstraint(errors.New("Signature not valid for output being spent")), + }, + { + "dup spending", + false, + []spending{}, + []spending{ + spending{ + TxIndex: 0, + UxIndex: 0, + Keys: []cipher.SecKey{genSecret}, + ToAddr: toAddrs[0], + Coins: 10e6, + }, + spending{ + TxIndex: 0, + UxIndex: 0, + Keys: []cipher.SecKey{genSecret}, + ToAddr: toAddrs[0], + Coins: 10e6, + }, + }, + errors.New("Cannot spend output twice in the same block"), + }, + { + "arbitrating no transactions", + true, + []spending{}, + []spending{}, + nil, + }, + { + "invalid signature", + true, + []spending{}, + []spending{ + spending{ + TxIndex: 0, + UxIndex: 0, + Keys: []cipher.SecKey{keys[0]}, + ToAddr: toAddrs[0], + Coins: 10e6, + }, + }, + nil, + }, + { + "including invalid signature", + true, + []spending{}, + []spending{ + spending{ + TxIndex: 0, + UxIndex: 0, + Keys: []cipher.SecKey{genSecret}, + ToAddr: toAddrs[0], + Coins: 10e6, + }, + spending{ + TxIndex: 0, + UxIndex: 0, + Keys: []cipher.SecKey{keys[0]}, + ToAddr: toAddrs[0], + Coins: 10e6, + }, + }, + nil, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + // create test db + db, closeDB := prepareDB(t) + defer closeDB() + + err := CreateBuckets(db) + require.NoError(t, err) + + // create chain store + store, err := blockdb.NewBlockchain(db, DefaultWalker) + require.NoError(t, err) + + // create Blockchain + bc := &Blockchain{ + cfg: BlockchainConfig{ + Arbitrating: tc.arbitrating, + }, + db: db, + store: store, + } + + // init chain + head := addGenesisBlockToBlockchain(t, bc) + tm := head.Time() + for i, spend := range tc.initChain { + uxs := coin.CreateUnspents(head.Head, head.Body.Transactions[spend.TxIndex]) + txn := makeSpendTxn(t, coin.UxArray{uxs[spend.UxIndex]}, spend.Keys, spend.ToAddr, spend.Coins) + + b := newBlock(t, bc, txn, tm+uint64(i*100)) + + sb := &coin.SignedBlock{ + Block: *b, + Sig: cipher.MustSignHash(b.HashHeader(), genSecret), + } + err = db.Update("", func(tx *dbutil.Tx) error { + return bc.store.AddBlock(tx, sb) + }) + require.NoError(t, err) + head = sb + } + + // create spending transactions + txns := make([]coin.Transaction, len(tc.spends)) + for i, spend := range tc.spends { + uxs := coin.CreateUnspents(head.Head, head.Body.Transactions[spend.TxIndex]) + txn := makeSpendTxn(t, coin.UxArray{uxs[spend.UxIndex]}, spend.Keys, spend.ToAddr, spend.Coins) + txns[i] = txn + } + + err = db.View("", func(tx *dbutil.Tx) error { + _, err := bc.processTransactions(tx, txns) + require.EqualValues(t, tc.err, err) + return nil + }) + require.NoError(t, err) + }) + } + +} + +func getUxHash(t *testing.T, db *dbutil.DB, bc *Blockchain) cipher.SHA256 { + var uxHash cipher.SHA256 + err := db.View("", func(tx *dbutil.Tx) error { + var err error + uxHash, err = bc.Unspent().GetUxHash(tx) + return err + }) + require.NoError(t, err) + return uxHash +} + +func TestVerifyUxHash(t *testing.T) { + db, closeDB := prepareDB(t) + defer closeDB() + + err := CreateBuckets(db) + require.NoError(t, err) + + store, err := blockdb.NewBlockchain(db, DefaultWalker) + require.NoError(t, err) + + bc := &Blockchain{ + db: db, + store: store, + } + + gb := addGenesisBlockToBlockchain(t, bc) + uxHash := getUxHash(t, db, bc) + txn := coin.Transaction{} + b, err := coin.NewBlock(gb.Block, genTime+100, uxHash, coin.Transactions{txn}, feeCalc) + require.NoError(t, err) + + err = db.View("", func(tx *dbutil.Tx) error { + err = bc.verifyUxHash(tx, *b) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) + + b2, err := coin.NewBlock(gb.Block, genTime+10, testutil.RandSHA256(t), coin.Transactions{txn}, feeCalc) + require.NoError(t, err) + + err = db.View("", func(tx *dbutil.Tx) error { + err = bc.verifyUxHash(tx, *b2) + require.Equal(t, errors.New("UxHash does not match"), err) + return nil + }) + require.NoError(t, err) +} + +func TestProcessBlock(t *testing.T) { + db, closeDB := prepareDB(t) + defer closeDB() + + err := CreateBuckets(db) + require.NoError(t, err) + + store, err := blockdb.NewBlockchain(db, DefaultWalker) + require.NoError(t, err) + + bc := &Blockchain{ + db: db, + store: store, + } + + gb, err := coin.NewGenesisBlock(genAddress, genCoins, genTime) + require.NoError(t, err) + + sb := coin.SignedBlock{ + Block: *gb, + Sig: cipher.MustSignHash(gb.HashHeader(), genSecret), + } + + // Test with empty blockchain + err = db.Update("", func(tx *dbutil.Tx) error { + _, err := bc.processBlock(tx, sb) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) + + // Add genesis block to chain store + err = db.Update("", func(tx *dbutil.Tx) error { + err := bc.store.AddBlock(tx, &sb) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) + + // Create new block + uxs := coin.CreateUnspents(gb.Head, gb.Body.Transactions[0]) + toAddr := testutil.MakeAddress() + tx := makeSpendTxn(t, uxs, []cipher.SecKey{genSecret}, toAddr, 10e6) + uxHash := getUxHash(t, db, bc) + b, err := coin.NewBlock(*gb, genTime+100, uxHash, coin.Transactions{tx}, feeCalc) + require.NoError(t, err) + + err = db.Update("", func(tx *dbutil.Tx) error { + _, err := bc.processBlock(tx, coin.SignedBlock{ + Block: *b, + Sig: cipher.MustSignHash(b.HashHeader(), genSecret), + }) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) +} + +func TestExecuteBlock(t *testing.T) { + db, closeDB := prepareDB(t) + defer closeDB() + + err := CreateBuckets(db) + require.NoError(t, err) + + store, err := blockdb.NewBlockchain(db, DefaultWalker) + require.NoError(t, err) + + bc := &Blockchain{ + db: db, + store: store, + } + + gb, err := coin.NewGenesisBlock(genAddress, genCoins, genTime) + require.NoError(t, err) + + sb := coin.SignedBlock{ + Block: *gb, + Sig: cipher.MustSignHash(gb.HashHeader(), genSecret), + } + + // test with empty chain + err = db.Update("", func(tx *dbutil.Tx) error { + err := bc.ExecuteBlock(tx, &sb) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) + + // new block + uxs := coin.CreateUnspents(gb.Head, gb.Body.Transactions[0]) + toAddr := testutil.MakeAddress() + tx := makeSpendTxn(t, uxs, []cipher.SecKey{genSecret}, toAddr, 10e6) + uxHash := getUxHash(t, db, bc) + b, err := coin.NewBlock(*gb, genTime+100, uxHash, coin.Transactions{tx}, feeCalc) + require.NoError(t, err) + err = db.Update("", func(tx *dbutil.Tx) error { + err := bc.ExecuteBlock(tx, &coin.SignedBlock{ + Block: *b, + Sig: cipher.MustSignHash(b.HashHeader(), genSecret), + }) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/blockchain_verify_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockchain_verify_test.go new file mode 100644 index 00000000..44587bb5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockchain_verify_test.go @@ -0,0 +1,665 @@ +package visor + +import ( + "errors" + "fmt" + "math" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/util/mathutil" + "github.com/SkycoinProject/skycoin/src/visor/blockdb" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +const ( + // GenesisTime is the time of the genesis block created in MakeBlockchain + GenesisTime uint64 = 1000 + // GenesisCoins is the amount of coins in the genesis block created in MakeBlockchain + GenesisCoins uint64 = 1000e6 + // GenesisCoinHours is the amount of coin hours in the genesis block created in MakeBlockchain + GenesisCoinHours uint64 = 1000 * 1000 + // TimeIncrement is the default time increment used when creating a block with CreateGenesisSpendTransaction + TimeIncrement uint64 = 3600 * 1000 +) + +var ( + // GenesisPublic is the public key used in the genesis block created in MakeBlockchain + GenesisPublic cipher.PubKey + // GenesisSecret is the secret key used in the genesis block created in MakeBlockchain + GenesisSecret cipher.SecKey + // GenesisAddress is the address used in the genesis block created in MakeBlockchain + GenesisAddress cipher.Address +) + +func init() { + GenesisPublic, GenesisSecret = cipher.GenerateKeyPair() + GenesisAddress = cipher.AddressFromPubKey(GenesisPublic) +} + +// MakeBlockchain creates a new blockchain with a genesis block +func MakeBlockchain(t *testing.T, db *dbutil.DB, seckey cipher.SecKey) *Blockchain { + pubkey := cipher.MustPubKeyFromSecKey(seckey) + b, err := NewBlockchain(db, BlockchainConfig{ + Pubkey: pubkey, + }) + require.NoError(t, err) + gb, err := coin.NewGenesisBlock(GenesisAddress, GenesisCoins, GenesisTime) + if err != nil { + panic(fmt.Errorf("create genesis block failed: %v", err)) + } + + sig := cipher.MustSignHash(gb.HashHeader(), seckey) + err = db.Update("", func(tx *dbutil.Tx) error { + return b.ExecuteBlock(tx, &coin.SignedBlock{ + Block: *gb, + Sig: sig, + }) + }) + require.NoError(t, err) + return b +} + +// CreateGenesisSpendTransaction creates the initial post-genesis transaction that moves genesis coins to another address +func CreateGenesisSpendTransaction(t *testing.T, db *dbutil.DB, bc *Blockchain, toAddr cipher.Address, coins, hours, fee uint64) coin.Transaction { + var txn coin.Transaction + err := db.View("", func(tx *dbutil.Tx) error { + uxOuts, err := bc.Unspent().GetAll(tx) + require.NoError(t, err) + require.Len(t, uxOuts, 1) + + txn = makeTransactionForChain(t, tx, bc, uxOuts[0], GenesisSecret, toAddr, coins, hours, fee) + require.Equal(t, txn.Out[0].Address.String(), toAddr.String()) + + if coins == GenesisCoins { + // No change output + require.Len(t, txn.Out, 1) + } else { + require.Len(t, txn.Out, 2) + require.Equal(t, txn.Out[1].Address.String(), GenesisAddress.String()) + } + + return nil + }) + require.NoError(t, err) + return txn +} + +// ExecuteGenesisSpendTransaction executes a genesis block created with CreateGenesisSpendTransaction against a blockchain +// created with MakeBlockchain +func ExecuteGenesisSpendTransaction(t *testing.T, db *dbutil.DB, bc *Blockchain, txn coin.Transaction) coin.UxOut { + var block *coin.Block + err := db.View("", func(tx *dbutil.Tx) error { + var err error + block, err = bc.NewBlock(tx, coin.Transactions{txn}, GenesisTime+TimeIncrement) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) + require.NotNil(t, block) + + sig := cipher.MustSignHash(block.HashHeader(), GenesisSecret) + sb := coin.SignedBlock{ + Block: *block, + Sig: sig, + } + + err = db.Update("", func(tx *dbutil.Tx) error { + err = bc.ExecuteBlock(tx, &sb) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) + + uxOut, err := coin.CreateUnspent(block.Head, txn, 0) + require.NoError(t, err) + + return uxOut +} + +func makeTransactionForChain(t *testing.T, tx *dbutil.Tx, bc *Blockchain, ux coin.UxOut, sec cipher.SecKey, toAddr cipher.Address, amt, hours, fee uint64) coin.Transaction { + tim, err := bc.Time(tx) + require.NoError(t, err) + + chrs, err := ux.CoinHours(tim) + require.NoError(t, err) + + require.Equal(t, cipher.AddressFromPubKey(cipher.MustPubKeyFromSecKey(sec)), ux.Body.Address) + + knownUx, err := bc.Unspent().Get(tx, ux.Hash()) + require.NoError(t, err) + require.NotNil(t, knownUx) + require.Equal(t, knownUx, &ux) + + txn := coin.Transaction{} + err = txn.PushInput(ux.Hash()) + require.NoError(t, err) + + err = txn.PushOutput(toAddr, amt, hours) + require.NoError(t, err) + + // Change output + coinsOut := ux.Body.Coins - amt + if coinsOut > 0 { + err := txn.PushOutput(GenesisAddress, coinsOut, chrs-hours-fee) + require.NoError(t, err) + } + + txn.SignInputs([]cipher.SecKey{sec}) + + require.Equal(t, len(txn.Sigs), 1) + + txnInnerHash := txn.HashInner() + err = cipher.VerifyAddressSignedHash(ux.Body.Address, txn.Sigs[0], cipher.AddSHA256(txnInnerHash, txn.In[0])) + require.NoError(t, err) + + err = txn.UpdateHeader() + require.NoError(t, err) + + err = txn.Verify() + require.NoError(t, err) + + err = bc.VerifySingleTxnHardConstraints(tx, txn, TxnSigned) + require.NoError(t, err) + + return txn +} + +func makeLostCoinTxn(t *testing.T, uxs coin.UxArray, keys []cipher.SecKey, toAddr cipher.Address, coins uint64) coin.Transaction { //nolint:unparam + txn := coin.Transaction{} + var totalCoins uint64 + var totalHours uint64 + + for _, ux := range uxs { + err := txn.PushInput(ux.Hash()) + require.NoError(t, err) + totalCoins += ux.Body.Coins + totalHours += ux.Body.Hours + } + + err := txn.PushOutput(toAddr, coins, totalHours/4) + require.NoError(t, err) + changeCoins := totalCoins - coins + if changeCoins > 0 { + err := txn.PushOutput(uxs[0].Body.Address, changeCoins-1, totalHours/4) + require.NoError(t, err) + } + + txn.SignInputs(keys) + err = txn.UpdateHeader() + require.NoError(t, err) + return txn +} + +func makeDuplicateUxOutTxn(t *testing.T, uxs coin.UxArray, keys []cipher.SecKey, toAddr cipher.Address, coins uint64) coin.Transaction { //nolint:unparam + txn := coin.Transaction{} + var totalCoins uint64 + var totalHours uint64 + + for _, ux := range uxs { + err := txn.PushInput(ux.Hash()) + require.NoError(t, err) + totalCoins += ux.Body.Coins + totalHours += ux.Body.Hours + } + + err := txn.PushOutput(toAddr, coins, totalHours/8) + require.NoError(t, err) + err = txn.PushOutput(toAddr, coins, totalHours/8) + require.NoError(t, err) + changeCoins := totalCoins - coins + if changeCoins > 0 { + err := txn.PushOutput(uxs[0].Body.Address, changeCoins, totalHours/4) + require.NoError(t, err) + } + + txn.SignInputs(keys) + err = txn.UpdateHeader() + require.NoError(t, err) + return txn +} + +// makeUnspentsTxn creates a transaction that has a configurable number of outputs sent to the same address. +// The genesis block has only one unspent output, so only one transaction can be made from it. +// This is useful for when multiple test transactions need to be made from the same block. +// Coins and hours are distributed equally amongst all new outputs. +func makeUnspentsTxn(t *testing.T, uxs coin.UxArray, keys []cipher.SecKey, toAddr cipher.Address, nUnspents int, maxDroplets uint8) coin.Transaction { //nolint:unparam + // Add inputs to the transaction + spendTxn := coin.Transaction{} + var totalHours uint64 + var totalCoins uint64 + for _, ux := range uxs { + err := spendTxn.PushInput(ux.Hash()) + require.NoError(t, err) + + totalHours, err = mathutil.AddUint64(totalHours, ux.Body.Hours) + require.NoError(t, err) + + totalCoins, err = mathutil.AddUint64(totalCoins, ux.Body.Coins) + require.NoError(t, err) + } + + maxDivisor := params.DropletPrecisionToDivisor(maxDroplets) + + // Distribute coins and hours equally to all of the new outputs + coins := totalCoins / uint64(nUnspents) + coins = (coins / maxDivisor) * maxDivisor + t.Logf("Assigning %d coins to each of %d outputs", coins, nUnspents) + changeCoins := totalCoins - (coins * uint64(nUnspents)) + t.Logf("Change coins: %d", changeCoins) + + hours := (totalHours / 2) / uint64(nUnspents) + changeHours := (totalHours / 2) - (hours * uint64(nUnspents)) + + // Create the new outputs + require.True(t, uint64(nUnspents) < hours) + for i := 0; i < nUnspents; i++ { + // Subtract index from hours so that the outputs are not all the same, + // otherwise the output hashes will be duplicated and the transaction + // will be invalid + spendHours := hours - uint64(i) + err := spendTxn.PushOutput(toAddr, coins, spendHours) + require.NoError(t, err) + } + + // Add change output, if necessary + if changeCoins != 0 { + err := spendTxn.PushOutput(uxs[0].Body.Address, changeCoins, changeHours) + require.NoError(t, err) + } + + // Sign the transaction + spendTxn.SignInputs(keys) + err := spendTxn.UpdateHeader() + require.NoError(t, err) + + return spendTxn +} + +// makeSpendTxWithFee creates a txn specified with the extra number of hours to burn in addition to the minimum required burn +func makeSpendTxWithFee(t *testing.T, uxs coin.UxArray, keys []cipher.SecKey, toAddr cipher.Address, coins, fee uint64) coin.Transaction { + spendTxn := coin.Transaction{} + var totalHours uint64 + var totalCoins uint64 + for _, ux := range uxs { + err := spendTxn.PushInput(ux.Hash()) + require.NoError(t, err) + totalHours += ux.Body.Hours + totalCoins += ux.Body.Coins + } + + require.True(t, coins <= totalCoins) + require.True(t, fee <= totalHours/2, "Fee must be <= half of total hours") + + spendHours := totalHours/2 - fee + + err := spendTxn.PushOutput(toAddr, coins, spendHours) + require.NoError(t, err) + if totalCoins != coins { + err := spendTxn.PushOutput(uxs[0].Body.Address, totalCoins-coins, 0) + require.NoError(t, err) + } + spendTxn.SignInputs(keys) + err = spendTxn.UpdateHeader() + require.NoError(t, err) + return spendTxn +} + +// makeSpendTxWithHoursBurned creates a txn specified with the total number of hours to burn +func makeSpendTxWithHoursBurned(t *testing.T, uxs coin.UxArray, keys []cipher.SecKey, toAddr cipher.Address, coins, hoursBurned uint64) coin.Transaction { //nolint:unparam + spendTxn := coin.Transaction{} + var totalHours uint64 + var totalCoins uint64 + for _, ux := range uxs { + err := spendTxn.PushInput(ux.Hash()) + require.NoError(t, err) + totalHours += ux.Body.Hours + totalCoins += ux.Body.Coins + } + + require.True(t, coins <= totalCoins) + require.True(t, hoursBurned <= totalHours, "hoursBurned must be <= totalHours") + + spendHours := totalHours - hoursBurned + + err := spendTxn.PushOutput(toAddr, coins, spendHours) + require.NoError(t, err) + if totalCoins != coins { + err := spendTxn.PushOutput(uxs[0].Body.Address, totalCoins-coins, 0) + require.NoError(t, err) + } + spendTxn.SignInputs(keys) + err = spendTxn.UpdateHeader() + require.NoError(t, err) + return spendTxn +} + +func requireSoftViolation(t *testing.T, msg string, err error) { + expected := NewErrTxnViolatesSoftConstraint(errors.New(msg)) + require.Equal(t, expected, err, "Expected: %s\nHave: %v", expected, err) +} + +func requireHardViolation(t *testing.T, msg string, err error) { + expected := NewErrTxnViolatesHardConstraint(errors.New(msg)) + require.Equal(t, expected, err, "Expected: %s\nHave: %v", expected, err) +} + +func TestVerifySignedTransactionSoftHardConstraints(t *testing.T) { + testVerifyTransactionSoftHardConstraints(t, TxnSigned) +} + +func TestVerifyUnsignedTransactionSoftHardConstraints(t *testing.T) { + testVerifyTransactionSoftHardConstraints(t, TxnUnsigned) +} + +func testVerifyTransactionSoftHardConstraints(t *testing.T, signed TxnSignedFlag) { + db, closeDB := prepareDB(t) + defer closeDB() + + err := CreateBuckets(db) + require.NoError(t, err) + + store, err := blockdb.NewBlockchain(db, DefaultWalker) + require.NoError(t, err) + + bc := &Blockchain{ + db: db, + store: store, + } + + gb := addGenesisBlockToBlockchain(t, bc) + + toAddr := testutil.MakeAddress() + coins := uint64(10e6) + + verifySingleTxnSoftHardConstraints := func(txn coin.Transaction, verifyParams params.VerifyTxn) error { + return db.View("", func(tx *dbutil.Tx) error { + _, _, err := bc.VerifySingleTxnSoftHardConstraints(tx, txn, params.MainNetDistribution, verifyParams, signed) + return err + }) + } + + // create normal spending txn + uxs := coin.CreateUnspents(gb.Head, gb.Body.Transactions[0]) + txn := makeSpendTxn(t, uxs, []cipher.SecKey{genSecret}, toAddr, coins) + err = verifySingleTxnSoftHardConstraints(txn, params.UserVerifyTxn) + if signed == TxnSigned { + require.NoError(t, err) + } else { + requireHardViolation(t, "Unsigned transaction must contain a null signature", err) + } + + if signed == TxnUnsigned { + txn.Sigs = make([]cipher.Sig, len(txn.Sigs)) + err := txn.UpdateHeader() + require.NoError(t, err) + } + err = verifySingleTxnSoftHardConstraints(txn, params.UserVerifyTxn) + require.NoError(t, err) + + // Transaction size exceeds maxSize + txnSize, err := txn.Size() + require.NoError(t, err) + err = verifySingleTxnSoftHardConstraints(txn, params.VerifyTxn{ + BurnFactor: params.UserVerifyTxn.BurnFactor, + MaxTransactionSize: txnSize - 1, + MaxDropletPrecision: params.UserVerifyTxn.MaxDropletPrecision, + }) + requireSoftViolation(t, "Transaction size bigger than max block size", err) + + // Invalid transaction fee + uxs = coin.CreateUnspents(gb.Head, gb.Body.Transactions[0]) + hours := uint64(0) + for _, ux := range uxs { + hours += ux.Body.Hours + } + txn = makeSpendTxWithHoursBurned(t, uxs, []cipher.SecKey{genSecret}, toAddr, coins, 0) + if signed == TxnUnsigned { + txn.Sigs = make([]cipher.Sig, len(txn.Sigs)) + err := txn.UpdateHeader() + require.NoError(t, err) + } + + err = verifySingleTxnSoftHardConstraints(txn, params.UserVerifyTxn) + requireSoftViolation(t, "Transaction has zero coinhour fee", err) + + // Invalid transaction fee, part 2 + txn = makeSpendTxWithHoursBurned(t, uxs, []cipher.SecKey{genSecret}, toAddr, coins, 1) + originalSigs := txn.Sigs + if signed == TxnUnsigned { + txn.Sigs = make([]cipher.Sig, len(txn.Sigs)) + err := txn.UpdateHeader() + require.NoError(t, err) + } + + err = verifySingleTxnSoftHardConstraints(txn, params.UserVerifyTxn) + requireSoftViolation(t, "Transaction coinhour fee minimum not met", err) + + // Transaction locking is tested by TestVerifyTransactionIsLocked + + // Test invalid header hash + if signed == TxnUnsigned { + txn.Sigs = make([]cipher.Sig, len(txn.Sigs)) + err := txn.UpdateHeader() + require.NoError(t, err) + } + originalInnerHash := txn.InnerHash + txn.InnerHash = cipher.SHA256{} + + err = verifySingleTxnSoftHardConstraints(txn, params.UserVerifyTxn) + requireHardViolation(t, "InnerHash does not match computed hash", err) + + txn.Sigs = originalSigs + err = txn.UpdateHeader() + require.NoError(t, err) + require.Equal(t, originalInnerHash, txn.InnerHash) + + // Create new block to spend the coins + var b *coin.Block + err = db.View("", func(tx *dbutil.Tx) error { + var err error + b, err = bc.NewBlock(tx, coin.Transactions{txn}, genTime+100) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) + require.NotNil(t, b) + + // Add the block to blockchain + err = bc.db.Update("", func(tx *dbutil.Tx) error { + return bc.store.AddBlock(tx, &coin.SignedBlock{ + Block: *b, + Sig: cipher.MustSignHash(b.HashHeader(), genSecret), + }) + }) + require.NoError(t, err) + + // A UxOut does not exist, it was already spent + err = verifySingleTxnSoftHardConstraints(txn, params.UserVerifyTxn) + expectedErr := NewErrTxnViolatesHardConstraint(blockdb.NewErrUnspentNotExist(txn.In[0].Hex())) + require.Equal(t, expectedErr, err) + + // Check invalid sig + uxs = coin.CreateUnspents(b.Head, txn) + _, key := cipher.GenerateKeyPair() + toAddr2 := testutil.MakeAddress() + txn2 := makeSpendTxn(t, uxs, []cipher.SecKey{key, key}, toAddr2, 5e6) + if signed == TxnUnsigned { + txn2.Sigs = make([]cipher.Sig, len(txn2.Sigs)) + err := txn2.UpdateHeader() + require.NoError(t, err) + } + + err = verifySingleTxnSoftHardConstraints(txn2, params.UserVerifyTxn) + + if signed == TxnSigned { + requireHardViolation(t, "Signature not valid for output being spent", err) + } else { + // unsigned transactions ignore the sigs + require.NoError(t, err) + } + + // Create lost coin transaction + uxs2 := coin.CreateUnspents(b.Head, txn) + toAddr3 := testutil.MakeAddress() + lostCoinTxn := makeLostCoinTxn(t, coin.UxArray{uxs2[1]}, []cipher.SecKey{genSecret}, toAddr3, 10e5) + if signed == TxnUnsigned { + lostCoinTxn.Sigs = make([]cipher.Sig, len(lostCoinTxn.Sigs)) + err := lostCoinTxn.UpdateHeader() + require.NoError(t, err) + } + + err = verifySingleTxnSoftHardConstraints(lostCoinTxn, params.UserVerifyTxn) + requireHardViolation(t, "Transactions may not destroy coins", err) + + // Create transaction with duplicate UxOuts + uxs = coin.CreateUnspents(b.Head, txn) + toAddr4 := testutil.MakeAddress() + dupUxOutTxn := makeDuplicateUxOutTxn(t, coin.UxArray{uxs[0]}, []cipher.SecKey{genSecret}, toAddr4, 1e6) + if signed == TxnUnsigned { + dupUxOutTxn.Sigs = make([]cipher.Sig, len(lostCoinTxn.Sigs)) + err := dupUxOutTxn.UpdateHeader() + require.NoError(t, err) + } + + err = verifySingleTxnSoftHardConstraints(dupUxOutTxn, params.UserVerifyTxn) + requireHardViolation(t, "Duplicate output in transaction", err) +} + +func TestVerifyTxnFeeCoinHoursAdditionFails(t *testing.T) { + // Test that VerifySingleTxnSoftConstraints fails if a uxIn.CoinHours() call fails. + // This is a separate test on its own, because it's not possible to reach the line + // that is being tested through the blockchain verify API wrappers + db, closeDB := prepareDB(t) + defer closeDB() + + err := CreateBuckets(db) + require.NoError(t, err) + + store, err := blockdb.NewBlockchain(db, DefaultWalker) + require.NoError(t, err) + + bc := &Blockchain{ + db: db, + store: store, + } + + gb := addGenesisBlockToBlockchain(t, bc) + + toAddr := testutil.MakeAddress() + coins := uint64(10e6) + + // create normal spending txn + uxs := coin.CreateUnspents(gb.Head, gb.Body.Transactions[0]) + txn := makeSpendTxn(t, uxs, []cipher.SecKey{genSecret}, toAddr, coins) + + var uxIn coin.UxArray + var head *coin.SignedBlock + err = db.View("", func(tx *dbutil.Tx) error { + var err error + uxIn, err = bc.Unspent().GetArray(tx, txn.In) + require.NoError(t, err) + require.NotEmpty(t, uxIn) + + head, err = bc.Head(tx) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) + + // Set the uxIn's hours high, so that uxIn.CoinHours() returns an error + uxIn[0].Body.Hours = math.MaxUint64 + _, coinHoursErr := uxIn[0].CoinHours(head.Time() + 1e6) + testutil.RequireError(t, coinHoursErr, "UxOut.CoinHours addition of earned coin hours overflow") + + // VerifySingleTxnSoftConstraints should fail on this, when trying to calculate the TransactionFee + err = VerifySingleTxnSoftConstraints(txn, head.Time()+1e6, uxIn, params.MainNetDistribution, params.UserVerifyTxn) + testutil.RequireError(t, err, NewErrTxnViolatesSoftConstraint(coinHoursErr).Error()) + + // VerifySingleTxnHardConstraints should fail on this, when performing the extra check of + // uxIn.CoinHours() errors, which is ignored by VerifyTransactionHoursSpending if the error + // is because of the earned hours addition overflow + head.Block.Head.Time += 1e6 + err = VerifySingleTxnHardConstraints(txn, head.Head, uxIn, TxnSigned) + testutil.RequireError(t, err, NewErrTxnViolatesHardConstraint(coinHoursErr).Error()) +} + +func TestVerifyTransactionIsLocked(t *testing.T) { + for _, addr := range params.MainNetDistribution.LockedAddresses() { + t.Run(fmt.Sprintf("IsLocked: %s", addr), func(t *testing.T) { + testVerifyTransactionAddressLocking(t, addr, errors.New("Transaction has locked address inputs")) + }) + } +} + +func TestVerifyTransactionIsUnlocked(t *testing.T) { + for _, addr := range params.MainNetDistribution.UnlockedAddresses() { + t.Run(fmt.Sprintf("IsUnlocked: %s", addr), func(t *testing.T) { + testVerifyTransactionAddressLocking(t, addr, nil) + }) + } +} + +func testVerifyTransactionAddressLocking(t *testing.T, toAddr string, expectedErr error) { + addr, err := cipher.DecodeBase58Address(toAddr) + require.NoError(t, err) + + db, close := prepareDB(t) + defer close() + + _, s := cipher.GenerateKeyPair() + + // Setup blockchain + bc := MakeBlockchain(t, db, s) + + // Send coins to the initial address + var coins = GenesisCoins + var hours uint64 = 1e6 + var fee uint64 = 5e8 + + txn := CreateGenesisSpendTransaction(t, db, bc, addr, coins, hours, fee) + uxOut := ExecuteGenesisSpendTransaction(t, db, bc, txn) + + // Create a transaction that spends from the locked address + // The secret key for the locked address is obviously unavailable here, + // instead, forge an invalid transaction. + // Transaction.Verify() is called after TransactionIsLocked(), + // so for this test it doesn't matter if transaction signature is wrong + randomAddress := testutil.MakeAddress() + txn = coin.Transaction{ + In: []cipher.SHA256{uxOut.Hash()}, + Out: []coin.TransactionOutput{ + { + Address: randomAddress, + Coins: uxOut.Body.Coins, + Hours: uxOut.Body.Hours / 2, + }, + }, + } + + var uxIn coin.UxArray + var head *coin.SignedBlock + err = db.View("", func(tx *dbutil.Tx) error { + var err error + uxIn, err = bc.Unspent().GetArray(tx, txn.In) + require.NoError(t, err) + require.NotEmpty(t, uxIn) + + head, err = bc.Head(tx) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) + + err = VerifySingleTxnSoftConstraints(txn, head.Time(), uxIn, params.MainNetDistribution, params.UserVerifyTxn) + if expectedErr == nil { + require.NoError(t, err) + } else { + requireSoftViolation(t, expectedErr.Error(), err) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/block_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/block_skyencoder.go new file mode 100644 index 00000000..313dbff0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/block_skyencoder.go @@ -0,0 +1,513 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package blockdb + +import ( + "errors" + "math" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" + "github.com/SkycoinProject/skycoin/src/coin" +) + +// encodeSizeBlock computes the size of an encoded object of type Block +func encodeSizeBlock(obj *coin.Block) uint64 { + i0 := uint64(0) + + // obj.Head.Version + i0 += 4 + + // obj.Head.Time + i0 += 8 + + // obj.Head.BkSeq + i0 += 8 + + // obj.Head.Fee + i0 += 8 + + // obj.Head.PrevHash + i0 += 32 + + // obj.Head.BodyHash + i0 += 32 + + // obj.Head.UxHash + i0 += 32 + + // obj.Body.Transactions + i0 += 4 + for _, x1 := range obj.Body.Transactions { + i1 := uint64(0) + + // x1.Length + i1 += 4 + + // x1.Type + i1++ + + // x1.InnerHash + i1 += 32 + + // x1.Sigs + i1 += 4 + { + i2 := uint64(0) + + // x2 + i2 += 65 + + i1 += uint64(len(x1.Sigs)) * i2 + } + + // x1.In + i1 += 4 + { + i2 := uint64(0) + + // x2 + i2 += 32 + + i1 += uint64(len(x1.In)) * i2 + } + + // x1.Out + i1 += 4 + { + i2 := uint64(0) + + // x2.Address.Version + i2++ + + // x2.Address.Key + i2 += 20 + + // x2.Coins + i2 += 8 + + // x2.Hours + i2 += 8 + + i1 += uint64(len(x1.Out)) * i2 + } + + i0 += i1 + } + + return i0 +} + +// encodeBlock encodes an object of type Block to a buffer allocated to the exact size +// required to encode the object. +func encodeBlock(obj *coin.Block) ([]byte, error) { + n := encodeSizeBlock(obj) + buf := make([]byte, n) + + if err := encodeBlockToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeBlockToBuffer encodes an object of type Block to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeBlockToBuffer(buf []byte, obj *coin.Block) error { + if uint64(len(buf)) < encodeSizeBlock(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Head.Version + e.Uint32(obj.Head.Version) + + // obj.Head.Time + e.Uint64(obj.Head.Time) + + // obj.Head.BkSeq + e.Uint64(obj.Head.BkSeq) + + // obj.Head.Fee + e.Uint64(obj.Head.Fee) + + // obj.Head.PrevHash + e.CopyBytes(obj.Head.PrevHash[:]) + + // obj.Head.BodyHash + e.CopyBytes(obj.Head.BodyHash[:]) + + // obj.Head.UxHash + e.CopyBytes(obj.Head.UxHash[:]) + + // obj.Body.Transactions maxlen check + if len(obj.Body.Transactions) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // obj.Body.Transactions length check + if uint64(len(obj.Body.Transactions)) > math.MaxUint32 { + return errors.New("obj.Body.Transactions length exceeds math.MaxUint32") + } + + // obj.Body.Transactions length + e.Uint32(uint32(len(obj.Body.Transactions))) + + // obj.Body.Transactions + for _, x := range obj.Body.Transactions { + + // x.Length + e.Uint32(x.Length) + + // x.Type + e.Uint8(x.Type) + + // x.InnerHash + e.CopyBytes(x.InnerHash[:]) + + // x.Sigs maxlen check + if len(x.Sigs) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // x.Sigs length check + if uint64(len(x.Sigs)) > math.MaxUint32 { + return errors.New("x.Sigs length exceeds math.MaxUint32") + } + + // x.Sigs length + e.Uint32(uint32(len(x.Sigs))) + + // x.Sigs + for _, x := range x.Sigs { + + // x + e.CopyBytes(x[:]) + + } + + // x.In maxlen check + if len(x.In) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // x.In length check + if uint64(len(x.In)) > math.MaxUint32 { + return errors.New("x.In length exceeds math.MaxUint32") + } + + // x.In length + e.Uint32(uint32(len(x.In))) + + // x.In + for _, x := range x.In { + + // x + e.CopyBytes(x[:]) + + } + + // x.Out maxlen check + if len(x.Out) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // x.Out length check + if uint64(len(x.Out)) > math.MaxUint32 { + return errors.New("x.Out length exceeds math.MaxUint32") + } + + // x.Out length + e.Uint32(uint32(len(x.Out))) + + // x.Out + for _, x := range x.Out { + + // x.Address.Version + e.Uint8(x.Address.Version) + + // x.Address.Key + e.CopyBytes(x.Address.Key[:]) + + // x.Coins + e.Uint64(x.Coins) + + // x.Hours + e.Uint64(x.Hours) + + } + + } + + return nil +} + +// decodeBlock decodes an object of type Block from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeBlock(buf []byte, obj *coin.Block) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Head.Version + i, err := d.Uint32() + if err != nil { + return 0, err + } + obj.Head.Version = i + } + + { + // obj.Head.Time + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Head.Time = i + } + + { + // obj.Head.BkSeq + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Head.BkSeq = i + } + + { + // obj.Head.Fee + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Head.Fee = i + } + + { + // obj.Head.PrevHash + if len(d.Buffer) < len(obj.Head.PrevHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Head.PrevHash[:], d.Buffer[:len(obj.Head.PrevHash)]) + d.Buffer = d.Buffer[len(obj.Head.PrevHash):] + } + + { + // obj.Head.BodyHash + if len(d.Buffer) < len(obj.Head.BodyHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Head.BodyHash[:], d.Buffer[:len(obj.Head.BodyHash)]) + d.Buffer = d.Buffer[len(obj.Head.BodyHash):] + } + + { + // obj.Head.UxHash + if len(d.Buffer) < len(obj.Head.UxHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Head.UxHash[:], d.Buffer[:len(obj.Head.UxHash)]) + d.Buffer = d.Buffer[len(obj.Head.UxHash):] + } + + { + // obj.Body.Transactions + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Body.Transactions = make([]coin.Transaction, length) + + for z2 := range obj.Body.Transactions { + { + // obj.Body.Transactions[z2].Length + i, err := d.Uint32() + if err != nil { + return 0, err + } + obj.Body.Transactions[z2].Length = i + } + + { + // obj.Body.Transactions[z2].Type + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Body.Transactions[z2].Type = i + } + + { + // obj.Body.Transactions[z2].InnerHash + if len(d.Buffer) < len(obj.Body.Transactions[z2].InnerHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Body.Transactions[z2].InnerHash[:], d.Buffer[:len(obj.Body.Transactions[z2].InnerHash)]) + d.Buffer = d.Buffer[len(obj.Body.Transactions[z2].InnerHash):] + } + + { + // obj.Body.Transactions[z2].Sigs + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Body.Transactions[z2].Sigs = make([]cipher.Sig, length) + + for z4 := range obj.Body.Transactions[z2].Sigs { + { + // obj.Body.Transactions[z2].Sigs[z4] + if len(d.Buffer) < len(obj.Body.Transactions[z2].Sigs[z4]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Body.Transactions[z2].Sigs[z4][:], d.Buffer[:len(obj.Body.Transactions[z2].Sigs[z4])]) + d.Buffer = d.Buffer[len(obj.Body.Transactions[z2].Sigs[z4]):] + } + + } + } + } + + { + // obj.Body.Transactions[z2].In + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Body.Transactions[z2].In = make([]cipher.SHA256, length) + + for z4 := range obj.Body.Transactions[z2].In { + { + // obj.Body.Transactions[z2].In[z4] + if len(d.Buffer) < len(obj.Body.Transactions[z2].In[z4]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Body.Transactions[z2].In[z4][:], d.Buffer[:len(obj.Body.Transactions[z2].In[z4])]) + d.Buffer = d.Buffer[len(obj.Body.Transactions[z2].In[z4]):] + } + + } + } + } + + { + // obj.Body.Transactions[z2].Out + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Body.Transactions[z2].Out = make([]coin.TransactionOutput, length) + + for z4 := range obj.Body.Transactions[z2].Out { + { + // obj.Body.Transactions[z2].Out[z4].Address.Version + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Body.Transactions[z2].Out[z4].Address.Version = i + } + + { + // obj.Body.Transactions[z2].Out[z4].Address.Key + if len(d.Buffer) < len(obj.Body.Transactions[z2].Out[z4].Address.Key) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Body.Transactions[z2].Out[z4].Address.Key[:], d.Buffer[:len(obj.Body.Transactions[z2].Out[z4].Address.Key)]) + d.Buffer = d.Buffer[len(obj.Body.Transactions[z2].Out[z4].Address.Key):] + } + + { + // obj.Body.Transactions[z2].Out[z4].Coins + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Body.Transactions[z2].Out[z4].Coins = i + } + + { + // obj.Body.Transactions[z2].Out[z4].Hours + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Body.Transactions[z2].Out[z4].Hours = i + } + + } + } + } + } + } + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeBlockExact decodes an object of type Block from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeBlockExact(buf []byte, obj *coin.Block) error { + if n, err := decodeBlock(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/block_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/block_skyencoder_test.go new file mode 100644 index 00000000..102838ac --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/block_skyencoder_test.go @@ -0,0 +1,422 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package blockdb + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" + "github.com/SkycoinProject/skycoin/src/coin" +) + +func newEmptyBlockForEncodeTest() *coin.Block { + var obj coin.Block + return &obj +} + +func newRandomBlockForEncodeTest(t *testing.T, rand *mathrand.Rand) *coin.Block { + var obj coin.Block + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenBlockForEncodeTest(t *testing.T, rand *mathrand.Rand) *coin.Block { + var obj coin.Block + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilBlockForEncodeTest(t *testing.T, rand *mathrand.Rand) *coin.Block { + var obj coin.Block + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderBlock(t *testing.T, obj *coin.Block) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeBlock(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeBlock() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeBlock(obj) + if err != nil { + t.Fatalf("encodeBlock failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeBlock produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeBlock()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeBlockToBuffer(data3, obj); err != nil { + t.Fatalf("encodeBlockToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 coin.Block + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 coin.Block + if n, err := decodeBlock(data2, &obj3); err != nil { + t.Fatalf("decodeBlock failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeBlock bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeBlock()") + } + + // Decode, excess buffer + var obj4 coin.Block + n, err := decodeBlock(data3, &obj4) + if err != nil { + t.Fatalf("decodeBlock failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeBlock bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeBlock bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeBlock()") + } + + // DecodeExact + var obj5 coin.Block + if err := decodeBlockExact(data2, &obj5); err != nil { + t.Fatalf("decodeBlock failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeBlock()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeBlock(data4, &obj3); err != nil { + t.Fatalf("decodeBlock failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeBlock bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderBlock(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *coin.Block + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptyBlockForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomBlockForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenBlockForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilBlockForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderBlock(t, tc.obj) + }) + } +} + +func decodeBlockExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj coin.Block + if _, err := decodeBlock(buf, &obj); err == nil { + t.Fatal("decodeBlock: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeBlock: expected error %q, got %q", expectedErr, err) + } +} + +func decodeBlockExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj coin.Block + if err := decodeBlockExact(buf, &obj); err == nil { + t.Fatal("decodeBlockExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeBlockExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderBlockDecodeErrors(t *testing.T, k int, tag string, obj *coin.Block) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeBlock(obj) + buf, err := encodeBlock(obj) + if err != nil { + t.Fatalf("encodeBlock failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeBlockExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeBlockExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeBlockExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeBlockExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeBlockExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderBlockDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptyBlockForEncodeTest() + fullObj := newRandomBlockForEncodeTest(t, rand) + testSkyencoderBlockDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderBlockDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/block_tree.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/block_tree.go new file mode 100644 index 00000000..e9cd246b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/block_tree.go @@ -0,0 +1,269 @@ +package blockdb + +import ( + "errors" + "fmt" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +var ( + errBlockExist = errors.New("block already exists") + errNoParent = errors.New("block is not genesis and has no parent") + errWrongParent = errors.New("wrong parent") + errHasChild = errors.New("remove block failed, it has children") + + // BlocksBkt holds coin.Blocks + BlocksBkt = []byte("blocks") + // TreeBkt maps block height to a (prev, hash) pair for a block + TreeBkt = []byte("block_tree") +) + +// Walker function for go through blockchain +type Walker func(*dbutil.Tx, []coin.HashPair) (cipher.SHA256, bool) + +// blockTree use the blockdb store all blocks and maintains the block tree struct. +type blockTree struct{} + +// AddBlock adds block with *dbutil.Tx +func (bt *blockTree) AddBlock(tx *dbutil.Tx, b *coin.Block) error { + // can't store block if it's not genesis block and has no parent. + if b.Seq() > 0 && b.Head.PrevHash.Null() { + return errNoParent + } + + // check if the block already exists. + hash := b.HashHeader() + if ok, err := dbutil.BucketHasKey(tx, BlocksBkt, hash[:]); err != nil { + return err + } else if ok { + return errBlockExist + } + + // write block into blocks bucket. + buf, err := encodeBlock(b) + if err != nil { + return err + } + + if err := dbutil.PutBucketValue(tx, BlocksBkt, hash[:], buf); err != nil { + return err + } + + // the pre hash must be in depth - 1. + if b.Seq() > 0 { + parentHashPair, err := getHashPairInDepth(tx, b.Seq()-1, func(hp coin.HashPair) bool { + return hp.Hash == b.Head.PrevHash + }) + if err != nil { + return err + } + if len(parentHashPair) == 0 { + return errWrongParent + } + } + + hp := coin.HashPair{ + Hash: hash, + PrevHash: b.Head.PrevHash, + } + + // get block pairs in the depth + hashPairs, err := getHashPairInDepth(tx, b.Seq(), allPairs) + if err != nil { + return err + } + + if len(hashPairs) == 0 { + // no hash pair exist in the depth. + // write the hash pair into tree. + return setHashPairInDepth(tx, b.Seq(), []coin.HashPair{hp}) + } + + // check dup block + if containHash(hashPairs, hp) { + return errBlockExist + } + + hashPairs = append(hashPairs, hp) + return setHashPairInDepth(tx, b.Seq(), hashPairs) +} + +// RemoveBlock remove block from blocks bucket and tree bucket. +// can't remove block if it has children. +func (bt *blockTree) RemoveBlock(tx *dbutil.Tx, b *coin.Block) error { + // delete block in blocks bucket. + hash := b.HashHeader() + if err := dbutil.Delete(tx, BlocksBkt, hash[:]); err != nil { + return err + } + + // check if this block has children + if has, err := hasChild(tx, *b); err != nil { + return err + } else if has { + return errHasChild + } + + // get block hash pairs in depth + hashPairs, err := getHashPairInDepth(tx, b.Seq(), allPairs) + if err != nil { + return err + } + + // remove block hash pair in tree. + ps := removePairs(hashPairs, coin.HashPair{ + Hash: hash, + PrevHash: b.Head.PrevHash, + }) + + if len(ps) == 0 { + return dbutil.Delete(tx, TreeBkt, dbutil.Itob(b.Seq())) + } + + // update the hash pairs in tree. + return setHashPairInDepth(tx, b.Seq(), ps) +} + +// GetBlock get block by hash, return nil on not found +func (bt *blockTree) GetBlock(tx *dbutil.Tx, hash cipher.SHA256) (*coin.Block, error) { + var b coin.Block + + v, err := dbutil.GetBucketValueNoCopy(tx, BlocksBkt, hash[:]) + if err != nil { + return nil, err + } else if v == nil { + return nil, nil + } + + if err := decodeBlockExact(v, &b); err != nil { + return nil, err + } + + if hash != b.HashHeader() { + return nil, fmt.Errorf("DB key %s does not match block hash header %s", hash, b.HashHeader()) + } + + return &b, nil +} + +// GetBlockInDepth get block in depth, return nil on not found, +// the filter is used to choose the appropriate block. +func (bt *blockTree) GetBlockInDepth(tx *dbutil.Tx, depth uint64, filter Walker) (*coin.Block, error) { + hash, ok, err := bt.getHashInDepth(tx, depth, filter) + if err != nil { + return nil, fmt.Errorf("BlockTree.getHashInDepth failed: %v", err) + } else if !ok { + return nil, nil + } + + return bt.GetBlock(tx, hash) +} + +// ForEachBlock iterates all blocks and calls f on them +func (bt *blockTree) ForEachBlock(tx *dbutil.Tx, f func(b *coin.Block) error) error { + return dbutil.ForEach(tx, BlocksBkt, func(_, v []byte) error { + var b coin.Block + if err := decodeBlockExact(v, &b); err != nil { + return err + } + + return f(&b) + }) +} + +func (bt *blockTree) getHashInDepth(tx *dbutil.Tx, depth uint64, filter Walker) (cipher.SHA256, bool, error) { + var pairs hashPairsWrapper + + v, err := dbutil.GetBucketValueNoCopy(tx, TreeBkt, dbutil.Itob(depth)) + if err != nil { + return cipher.SHA256{}, false, err + } else if v == nil { + return cipher.SHA256{}, false, nil + } + + if err := decodeHashPairsWrapperExact(v, &pairs); err != nil { + return cipher.SHA256{}, false, err + } + + hash, ok := filter(tx, pairs.HashPairs) + if !ok { + return cipher.SHA256{}, false, errors.New("No hash found in depth") + } + + return hash, true, nil +} + +func containHash(hashPairs []coin.HashPair, pair coin.HashPair) bool { + for _, p := range hashPairs { + if p.Hash == pair.Hash { + return true + } + } + return false +} + +func removePairs(hps []coin.HashPair, pair coin.HashPair) []coin.HashPair { + pairs := []coin.HashPair{} + for _, p := range hps { + if p.Hash == pair.Hash && p.PrevHash == pair.PrevHash { + continue + } + pairs = append(pairs, p) + } + return pairs +} + +func getHashPairInDepth(tx *dbutil.Tx, depth uint64, fn func(hp coin.HashPair) bool) ([]coin.HashPair, error) { + var hps hashPairsWrapper + + v, err := dbutil.GetBucketValueNoCopy(tx, TreeBkt, dbutil.Itob(depth)) + if err != nil { + return nil, err + } else if v == nil { + return nil, nil + } + + if err := decodeHashPairsWrapperExact(v, &hps); err != nil { + return nil, err + } + + var pairs []coin.HashPair + for _, ps := range hps.HashPairs { + if fn(ps) { + pairs = append(pairs, ps) + } + } + return pairs, nil +} + +// check if this block has children +func hasChild(tx *dbutil.Tx, b coin.Block) (bool, error) { + // get the child block hash pair, whose pre hash point to current block. + childHashPair, err := getHashPairInDepth(tx, b.Head.BkSeq+1, func(hp coin.HashPair) bool { + return hp.PrevHash == b.HashHeader() + }) + + if err != nil { + return false, err + } + + return len(childHashPair) > 0, nil +} + +func setHashPairInDepth(tx *dbutil.Tx, depth uint64, hps []coin.HashPair) error { + buf, err := encodeHashPairsWrapper(&hashPairsWrapper{ + HashPairs: hps, + }) + if err != nil { + return err + } + + return dbutil.PutBucketValue(tx, TreeBkt, dbutil.Itob(depth), buf) +} + +func allPairs(hp coin.HashPair) bool { + return true +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/block_tree_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/block_tree_test.go new file mode 100644 index 00000000..ce0ad02b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/block_tree_test.go @@ -0,0 +1,228 @@ +package blockdb + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +type blockInfo struct { + Seq uint64 + Time uint64 + Fee uint64 + Pre int +} + +type blockCase struct { + BInfo blockInfo + Err error + Action string +} + +func testCase(t *testing.T, cases []blockCase) { + db, close := prepareDB(t) + defer close() + + btree := &blockTree{} + blocks := make([]coin.Block, len(cases)) + for i, d := range cases { + var preHash cipher.SHA256 + if d.BInfo.Pre != -1 { + preHash = blocks[d.BInfo.Pre].HashHeader() + } + + b := coin.Block{ + Head: coin.BlockHeader{ + BkSeq: d.BInfo.Seq, + Time: d.BInfo.Time, + Fee: d.BInfo.Fee, + PrevHash: preHash, + }, + } + blocks[i] = b + + err := db.Update("", func(tx *dbutil.Tx) error { + switch d.Action { + case "add": + err := btree.AddBlock(tx, &b) + require.Equal(t, d.Err, err, "expect err:%v, but get err:%v", d.Err, err) + + if err == nil { + b1, err := btree.GetBlock(tx, b.HashHeader()) + require.NoError(t, err) + require.Equal(t, b, *b1) + } + case "remove": + err := btree.RemoveBlock(tx, &b) + require.Equal(t, d.Err, err, "expect err:%v, but get err:%v", d.Err, err) + if err == nil { + b1, err := btree.GetBlock(tx, b.HashHeader()) + require.NoError(t, err) + require.Nil(t, b1) + } + } + + return nil + }) + + require.NoError(t, err) + } +} + +func TestAddBlock(t *testing.T) { + testData := []blockCase{ + blockCase{ + BInfo: blockInfo{Seq: 0, Time: 0, Fee: 0, Pre: -1}, + Err: nil, + Action: "add", + }, + blockCase{ + BInfo: blockInfo{Seq: 1, Time: 0, Fee: 0, Pre: 0}, + Err: nil, + Action: "add", + }, + blockCase{ + BInfo: blockInfo{Seq: 1, Time: 1, Fee: 0, Pre: 0}, + Err: nil, + Action: "add", + }, + blockCase{ + BInfo: blockInfo{Seq: 2, Time: 2, Fee: 0, Pre: 1}, + Err: nil, + Action: "add", + }, + blockCase{ + BInfo: blockInfo{Seq: 2, Time: 2, Fee: 0, Pre: 1}, + Err: errBlockExist, + Action: "add", + }, + blockCase{ + BInfo: blockInfo{Seq: 2, Time: 2, Fee: 0, Pre: 0}, + Err: errWrongParent, + Action: "add", + }, + blockCase{ + BInfo: blockInfo{Seq: 4, Time: 2, Fee: 0, Pre: 3}, + Err: errWrongParent, + Action: "add", + }, + blockCase{ + BInfo: blockInfo{Seq: 3, Time: 2, Fee: 0, Pre: -1}, + Err: errNoParent, + Action: "add", + }, + } + + testCase(t, testData) +} + +func TestRemoveBlock(t *testing.T) { + testData := []blockCase{ + blockCase{ + BInfo: blockInfo{Seq: 0, Time: 0, Fee: 0, Pre: -1}, + Err: nil, + Action: "add", + }, + blockCase{ + BInfo: blockInfo{Seq: 1, Time: 1, Fee: 0, Pre: 0}, + Err: nil, + Action: "add", + }, + blockCase{ + BInfo: blockInfo{Seq: 1, Time: 2, Fee: 0, Pre: 0}, + Err: nil, + Action: "add", + }, + // remove block normally. + blockCase{ + BInfo: blockInfo{Seq: 1, Time: 2, Fee: 0, Pre: 0}, + Err: nil, + Action: "remove", + }, + // remove genesis block, which has children. + blockCase{ + BInfo: blockInfo{Seq: 0, Time: 0, Fee: 0, Pre: -1}, + Err: errHasChild, + Action: "remove", + }, + // remove the last block in depth 1. + blockCase{ + BInfo: blockInfo{Seq: 1, Time: 1, Fee: 0, Pre: 0}, + Err: nil, + Action: "remove", + }, + } + + testCase(t, testData) +} + +func TestGetBlockInDepth(t *testing.T) { + db, teardown := prepareDB(t) + defer teardown() + + bc := &blockTree{} + blocks := []coin.Block{ + coin.Block{ + Head: coin.BlockHeader{ + BkSeq: 0, + Time: 0, + Fee: 0, + }, + }, + coin.Block{ + Head: coin.BlockHeader{ + BkSeq: 1, + Time: 1, + }, + }, + coin.Block{ + Head: coin.BlockHeader{ + BkSeq: 1, + Time: 2, + }, + }, + } + + err := db.Update("", func(tx *dbutil.Tx) error { + err := bc.AddBlock(tx, &blocks[0]) + require.NoError(t, err) + + blocks[1].Head.PrevHash = blocks[0].HashHeader() + err = bc.AddBlock(tx, &blocks[1]) + require.NoError(t, err) + + blocks[2].Head.PrevHash = blocks[0].HashHeader() + err = bc.AddBlock(tx, &blocks[2]) + require.NoError(t, err) + + return nil + }) + + require.NoError(t, err) + + var block *coin.Block + err = db.View("", func(tx *dbutil.Tx) error { + var err error + block, err = bc.GetBlockInDepth(tx, 1, func(tx *dbutil.Tx, hps []coin.HashPair) (cipher.SHA256, bool) { + for _, hp := range hps { + b, err := bc.GetBlock(tx, hp.Hash) + require.NoError(t, err) + if b.Time() == 2 { + return b.HashHeader(), true + } + } + return cipher.SHA256{}, false + }) + require.NoError(t, err) + return err + }) + + require.NoError(t, err) + + require.NotNil(t, block) + require.Equal(t, blocks[2], *block) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/blockchain.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/blockchain.go new file mode 100644 index 00000000..c111080e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/blockchain.go @@ -0,0 +1,285 @@ +/* +Package blockdb is the core blockchain database wrapper +*/ +package blockdb + +import ( + "errors" + "fmt" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/util/logging" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +var ( + logger = logging.MustGetLogger("blockdb") + + // ErrNoHeadBlock is returned when calling Blockchain.Head() when no head block exists + ErrNoHeadBlock = fmt.Errorf("found no head block") +) + +//go:generate skyencoder -unexported -struct Block -output-path . -package blockdb github.com/SkycoinProject/skycoin/src/coin +//go:generate skyencoder -unexported -struct UxOut -output-path . -package blockdb github.com/SkycoinProject/skycoin/src/coin +//go:generate skyencoder -unexported -struct hashPairsWrapper +//go:generate skyencoder -unexported -struct hashesWrapper +//go:generate skyencoder -unexported -struct sigWrapper + +// hashesWrapper wraps []cipher.SHA256 so it can be used by skyencoder +type hashesWrapper struct { + Hashes []cipher.SHA256 +} + +// sigWrapper wraps cipher.Sig in struct so it can be used by skyencoder +type sigWrapper struct { + Sig cipher.Sig +} + +// hashPairsWrapper wraps []coin.HashPair so it can be used by skyencoder +type hashPairsWrapper struct { + HashPairs []coin.HashPair +} + +// ErrMissingSignature is returned if a block in the db does not have a corresponding signature in the db +type ErrMissingSignature struct { + b *coin.Block +} + +// NewErrMissingSignature creates ErrMissingSignature from *coin.Block +func NewErrMissingSignature(b *coin.Block) error { + return ErrMissingSignature{ + b: b, + } +} + +func (e ErrMissingSignature) Error() string { + return fmt.Sprintf("Signature not found for block seq=%d hash=%s", e.b.Head.BkSeq, e.b.HashHeader().Hex()) +} + +// CreateBuckets creates bolt.DB buckets used by the blockdb +func CreateBuckets(tx *dbutil.Tx) error { + return dbutil.CreateBuckets(tx, [][]byte{ + BlockSigsBkt, + BlocksBkt, + TreeBkt, + BlockchainMetaBkt, + UnspentPoolBkt, + UnspentPoolAddrIndexBkt, + UnspentMetaBkt, + }) +} + +// BlockTree block storage +type BlockTree interface { + AddBlock(*dbutil.Tx, *coin.Block) error + GetBlock(*dbutil.Tx, cipher.SHA256) (*coin.Block, error) + GetBlockInDepth(*dbutil.Tx, uint64, Walker) (*coin.Block, error) + ForEachBlock(*dbutil.Tx, func(*coin.Block) error) error +} + +// BlockSigs block signature storage +type BlockSigs interface { + Add(*dbutil.Tx, cipher.SHA256, cipher.Sig) error + Get(*dbutil.Tx, cipher.SHA256) (cipher.Sig, bool, error) + ForEach(*dbutil.Tx, func(cipher.SHA256, cipher.Sig) error) error +} + +//go:generate mockery -name UnspentPooler -case underscore -testonly -inpkg + +// UnspentPooler unspent outputs pool +type UnspentPooler interface { + MaybeBuildIndexes(*dbutil.Tx, uint64) error + Len(*dbutil.Tx) (uint64, error) + Contains(*dbutil.Tx, cipher.SHA256) (bool, error) + Get(*dbutil.Tx, cipher.SHA256) (*coin.UxOut, error) + GetAll(*dbutil.Tx) (coin.UxArray, error) + GetArray(*dbutil.Tx, []cipher.SHA256) (coin.UxArray, error) + GetUxHash(*dbutil.Tx) (cipher.SHA256, error) + GetUnspentsOfAddrs(*dbutil.Tx, []cipher.Address) (coin.AddressUxOuts, error) + GetUnspentHashesOfAddrs(*dbutil.Tx, []cipher.Address) (AddressHashes, error) + ProcessBlock(*dbutil.Tx, *coin.SignedBlock) error + AddressCount(*dbutil.Tx) (uint64, error) +} + +// ChainMeta blockchain metadata +type ChainMeta interface { + GetHeadSeq(*dbutil.Tx) (uint64, bool, error) + SetHeadSeq(*dbutil.Tx, uint64) error +} + +// Blockchain maintain the buckets for blockchain +type Blockchain struct { + db *dbutil.DB + meta ChainMeta + unspent UnspentPooler + tree BlockTree + sigs BlockSigs + walker Walker +} + +// NewBlockchain creates a new blockchain instance +func NewBlockchain(db *dbutil.DB, walker Walker) (*Blockchain, error) { + if db == nil { + return nil, errors.New("db is nil") + } + + if walker == nil { + return nil, errors.New("blockchain walker is nil") + } + + return &Blockchain{ + db: db, + unspent: NewUnspentPool(), + meta: &chainMeta{}, + tree: &blockTree{}, + sigs: &blockSigs{}, + walker: walker, + }, nil +} + +// UnspentPool returns the unspent pool +func (bc *Blockchain) UnspentPool() UnspentPooler { + return bc.unspent +} + +// AddBlock adds signed block +func (bc *Blockchain) AddBlock(tx *dbutil.Tx, sb *coin.SignedBlock) error { + if err := bc.sigs.Add(tx, sb.HashHeader(), sb.Sig); err != nil { + return fmt.Errorf("save signature failed: %v", err) + } + + if err := bc.tree.AddBlock(tx, &sb.Block); err != nil { + return fmt.Errorf("save block failed: %v", err) + } + + // update block head seq and unspent pool + if err := bc.processBlock(tx, sb); err != nil { + return err + } + + return nil +} + +// processBlock processes a block and updates the db +func (bc *Blockchain) processBlock(tx *dbutil.Tx, b *coin.SignedBlock) error { + if err := bc.unspent.ProcessBlock(tx, b); err != nil { + return err + } + + return bc.meta.SetHeadSeq(tx, b.Seq()) +} + +// Head returns head block, returns error if no head block exists +func (bc *Blockchain) Head(tx *dbutil.Tx) (*coin.SignedBlock, error) { + seq, ok, err := bc.HeadSeq(tx) + if err != nil { + return nil, err + } else if !ok { + return nil, ErrNoHeadBlock + } + + b, err := bc.GetSignedBlockBySeq(tx, seq) + if err != nil { + return nil, err + } + + if b == nil { + return nil, ErrNoHeadBlock + } + + return b, nil +} + +// HeadSeq returns the head block sequence +func (bc *Blockchain) HeadSeq(tx *dbutil.Tx) (uint64, bool, error) { + return bc.meta.GetHeadSeq(tx) +} + +// Len returns blockchain length +func (bc *Blockchain) Len(tx *dbutil.Tx) (uint64, error) { + seq, ok, err := bc.meta.GetHeadSeq(tx) + if err != nil { + return 0, err + } else if !ok { + return 0, nil + } + + return seq + 1, nil +} + +// GetBlockSignature returns the signature of a block +func (bc *Blockchain) GetBlockSignature(tx *dbutil.Tx, b *coin.Block) (cipher.Sig, bool, error) { + return bc.sigs.Get(tx, b.HashHeader()) +} + +// GetBlockByHash returns block of given hash +func (bc *Blockchain) GetBlockByHash(tx *dbutil.Tx, hash cipher.SHA256) (*coin.Block, error) { + b, err := bc.tree.GetBlock(tx, hash) + if err != nil { + return nil, err + } + + return b, nil +} + +// GetSignedBlockByHash returns signed block of given hash +func (bc *Blockchain) GetSignedBlockByHash(tx *dbutil.Tx, hash cipher.SHA256) (*coin.SignedBlock, error) { + b, err := bc.tree.GetBlock(tx, hash) + if err != nil { + return nil, err + } + if b == nil { + return nil, nil + } + + // get signature + sig, ok, err := bc.sigs.Get(tx, hash) + if err != nil { + return nil, fmt.Errorf("find signature of block: %v failed: %v", hash.Hex(), err) + } + + if !ok { + return nil, NewErrMissingSignature(b) + } + + return &coin.SignedBlock{ + Block: *b, + Sig: sig, + }, nil +} + +// GetSignedBlockBySeq returns signed block of given seq +func (bc *Blockchain) GetSignedBlockBySeq(tx *dbutil.Tx, seq uint64) (*coin.SignedBlock, error) { + b, err := bc.tree.GetBlockInDepth(tx, seq, bc.walker) + if err != nil { + return nil, fmt.Errorf("bc.tree.GetBlockInDepth failed: %v", err) + } + if b == nil { + return nil, nil + } + + sig, ok, err := bc.sigs.Get(tx, b.HashHeader()) + if err != nil { + return nil, fmt.Errorf("find signature of block: %v failed: %v", seq, err) + } + + if !ok { + return nil, NewErrMissingSignature(b) + } + + return &coin.SignedBlock{ + Block: *b, + Sig: sig, + }, nil +} + +// GetGenesisBlock returns genesis block +func (bc *Blockchain) GetGenesisBlock(tx *dbutil.Tx) (*coin.SignedBlock, error) { + return bc.GetSignedBlockBySeq(tx, 0) +} + +// ForEachBlock iterates all blocks and calls f on them +func (bc *Blockchain) ForEachBlock(tx *dbutil.Tx, f func(b *coin.Block) error) error { + return bc.tree.ForEachBlock(tx, f) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/blockchain_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/blockchain_test.go new file mode 100644 index 00000000..fc4f8669 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/blockchain_test.go @@ -0,0 +1,617 @@ +package blockdb + +import ( + "errors" + "fmt" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +func prepareDB(t *testing.T) (*dbutil.DB, func()) { + db, shutdown := testutil.PrepareDB(t) + + err := db.Update("", func(tx *dbutil.Tx) error { + return CreateBuckets(tx) + }) + if err != nil { + shutdown() + t.Fatalf("CreateBuckets failed: %v", err) + } + + return db, shutdown +} + +var ( + genPublic, genSecret = cipher.GenerateKeyPair() + genAddress = cipher.AddressFromPubKey(genPublic) + + genTime uint64 = 1000 + genCoinHours uint64 = 1000 * 1000 +) + +func feeCalc(t *coin.Transaction) (uint64, error) { + return 0, nil +} + +type fakeStorage struct { + tree *fakeBlockTree + sigs *fakeSignatureStore + unspent *fakeUnspentPool + chainMeta *fakeChainMeta +} + +func newFakeStorage() *fakeStorage { + var failedWhenSaved bool + return &fakeStorage{ + tree: newFakeBlockTree(&failedWhenSaved), + sigs: newFakeSigStore(&failedWhenSaved), + unspent: newFakeUnspentPool(&failedWhenSaved), + chainMeta: newFakeChainMeta(), + } +} + +type fakeBlockTree struct { + blocks map[string]*coin.Block + saveFailed bool + + // state tracking: do not configure directly + // set to true if saveFailed was true and certain operations were performed + failedWhenSaved *bool +} + +func newFakeBlockTree(failedWhenSaved *bool) *fakeBlockTree { + return &fakeBlockTree{ + blocks: make(map[string]*coin.Block), + failedWhenSaved: failedWhenSaved, + } +} + +func (bt *fakeBlockTree) AddBlock(tx *dbutil.Tx, b *coin.Block) error { + if bt.saveFailed { + if bt.failedWhenSaved != nil { + *bt.failedWhenSaved = true + } + return errors.New("intentionally failed") + } + bt.blocks[b.HashHeader().Hex()] = b + return nil +} + +func (bt *fakeBlockTree) GetBlock(tx *dbutil.Tx, hash cipher.SHA256) (*coin.Block, error) { + if bt.failedWhenSaved != nil && *bt.failedWhenSaved { + return nil, nil + } + return bt.blocks[hash.Hex()], nil +} + +func (bt *fakeBlockTree) GetBlockInDepth(tx *dbutil.Tx, depth uint64, filter Walker) (*coin.Block, error) { + if bt.failedWhenSaved != nil && *bt.failedWhenSaved { + return nil, nil + } + + for _, b := range bt.blocks { + if b.Head.BkSeq == depth { + return b, nil + } + } + + return nil, nil +} + +func (bt *fakeBlockTree) ForEachBlock(tx *dbutil.Tx, f func(*coin.Block) error) error { + return nil +} + +type fakeSignatureStore struct { + sigs map[string]cipher.Sig + saveFailed bool + getSigErr error + + // state tracking: do not configure directly + // set to true if saveFailed was true and certain operations were performed + failedWhenSaved *bool +} + +func newFakeSigStore(failedWhenSaved *bool) *fakeSignatureStore { + return &fakeSignatureStore{ + sigs: make(map[string]cipher.Sig), + failedWhenSaved: failedWhenSaved, + } +} + +func (ss *fakeSignatureStore) Add(tx *dbutil.Tx, hash cipher.SHA256, sig cipher.Sig) error { + if ss.saveFailed { + if ss.failedWhenSaved != nil { + *ss.failedWhenSaved = true + } + return errors.New("intentionally failed") + } + + ss.sigs[hash.Hex()] = sig + return nil +} + +func (ss *fakeSignatureStore) Get(tx *dbutil.Tx, hash cipher.SHA256) (cipher.Sig, bool, error) { + if ss.failedWhenSaved != nil && *ss.failedWhenSaved { + return cipher.Sig{}, false, nil + } + + if ss.getSigErr != nil { + return cipher.Sig{}, false, ss.getSigErr + } + + sig, ok := ss.sigs[hash.Hex()] + return sig, ok, nil +} + +func (ss *fakeSignatureStore) ForEach(tx *dbutil.Tx, f func(cipher.SHA256, cipher.Sig) error) error { + return nil +} + +type fakeUnspentPool struct { + outs map[cipher.SHA256]coin.UxOut + uxHash cipher.SHA256 + saveFailed bool + + // state tracking: do not configure directly + // set to true if saveFailed was true and certain operations were performed + failedWhenSaved *bool +} + +func newFakeUnspentPool(failedWhenSaved *bool) *fakeUnspentPool { + return &fakeUnspentPool{ + outs: make(map[cipher.SHA256]coin.UxOut), + failedWhenSaved: failedWhenSaved, + } +} + +func (fup *fakeUnspentPool) MaybeBuildIndexes(tx *dbutil.Tx, height uint64) error { + return nil +} + +func (fup *fakeUnspentPool) Len(tx *dbutil.Tx) (uint64, error) { + return uint64(len(fup.outs)), nil +} + +func (fup *fakeUnspentPool) Get(tx *dbutil.Tx, h cipher.SHA256) (*coin.UxOut, error) { + out, ok := fup.outs[h] + if !ok { + return nil, nil + } + return &out, nil +} + +func (fup *fakeUnspentPool) GetAll(tx *dbutil.Tx) (coin.UxArray, error) { + outs := make(coin.UxArray, 0, len(fup.outs)) + for _, out := range fup.outs { + outs = append(outs, out) + } + + return outs, nil +} + +func (fup *fakeUnspentPool) GetArray(tx *dbutil.Tx, hashes []cipher.SHA256) (coin.UxArray, error) { + outs := make(coin.UxArray, 0, len(hashes)) + for _, h := range hashes { + ux, ok := fup.outs[h] + if !ok { + return nil, fmt.Errorf("unspent output of %s does not exist", h.Hex()) + } + + outs = append(outs, ux) + } + return outs, nil +} + +func (fup *fakeUnspentPool) GetUxHash(tx *dbutil.Tx) (cipher.SHA256, error) { + return fup.uxHash, nil +} + +func (fup *fakeUnspentPool) GetUnspentHashesOfAddrs(tx *dbutil.Tx, addrs []cipher.Address) (AddressHashes, error) { + addrm := make(map[cipher.Address]struct{}, len(addrs)) + for _, a := range addrs { + addrm[a] = struct{}{} + } + + addrOutMap := make(AddressHashes) + for _, out := range fup.outs { + addr := out.Body.Address + addrOutMap[addr] = append(addrOutMap[addr], out.Hash()) + } + + return addrOutMap, nil +} + +func (fup *fakeUnspentPool) GetUnspentsOfAddrs(tx *dbutil.Tx, addrs []cipher.Address) (coin.AddressUxOuts, error) { + addrm := make(map[cipher.Address]struct{}, len(addrs)) + for _, a := range addrs { + addrm[a] = struct{}{} + } + + addrOutMap := make(coin.AddressUxOuts) + for _, out := range fup.outs { + addr := out.Body.Address + addrOutMap[addr] = append(addrOutMap[addr], out) + } + + return addrOutMap, nil +} + +func (fup *fakeUnspentPool) ProcessBlock(tx *dbutil.Tx, b *coin.SignedBlock) error { + if fup.saveFailed { + if fup.failedWhenSaved != nil { + *fup.failedWhenSaved = true + } + return errors.New("intentionally failed") + } + return nil +} + +func (fup *fakeUnspentPool) Contains(tx *dbutil.Tx, h cipher.SHA256) (bool, error) { + _, ok := fup.outs[h] + return ok, nil +} + +func (fup *fakeUnspentPool) AddressCount(tx *dbutil.Tx) (uint64, error) { + addrs := make(map[cipher.Address]struct{}) + for _, out := range fup.outs { + addrs[out.Body.Address] = struct{}{} + } + + return uint64(len(addrs)), nil +} + +type fakeChainMeta struct { + headSeq uint64 + didSetSeq bool +} + +func newFakeChainMeta() *fakeChainMeta { + return &fakeChainMeta{} +} + +func (fcm *fakeChainMeta) GetHeadSeq(tx *dbutil.Tx) (uint64, bool, error) { + if !fcm.didSetSeq { + return 0, false, nil + } + + return fcm.headSeq, true, nil +} + +func (fcm *fakeChainMeta) SetHeadSeq(tx *dbutil.Tx, seq uint64) error { + fcm.headSeq = seq + fcm.didSetSeq = true + return nil +} + +func DefaultWalker(tx *dbutil.Tx, hps []coin.HashPair) (cipher.SHA256, bool) { + return hps[0].Hash, true +} + +func makeGenesisBlock(t *testing.T) coin.SignedBlock { + gb, err := coin.NewGenesisBlock(genAddress, genCoinHours, genTime) + require.NoError(t, err) + + sig := cipher.MustSignHash(gb.HashHeader(), genSecret) + return coin.SignedBlock{ + Block: *gb, + Sig: sig, + } +} + +func TestBlockchainAddBlock(t *testing.T) { + type expect struct { + err error + sigSaved bool + blockSaved bool + headSeq uint64 + } + + type failedSaves struct { + tree bool + sigs bool + unspent bool + } + + tt := []struct { + name string + fakeStorage *fakeStorage + failedSaves failedSaves + expect expect + }{ + { + "ok", + newFakeStorage(), + failedSaves{}, + expect{ + nil, + true, + true, + uint64(0), + }, + }, + { + "save sig failed", + newFakeStorage(), + failedSaves{ + sigs: true, + }, + expect{ + errors.New("save signature failed: intentionally failed"), + false, + false, + uint64(0), + }, + }, + { + "save block failed", + newFakeStorage(), + failedSaves{ + tree: true, + }, + expect{ + errors.New("save block failed: intentionally failed"), + false, + false, + uint64(0), + }, + }, + { + "unspent process block failed", + newFakeStorage(), + failedSaves{ + unspent: true, + }, + expect{ + errors.New("intentionally failed"), + false, + false, + uint64(0), + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + db, closeDB := prepareDB(t) + defer closeDB() + + tc.fakeStorage.tree.saveFailed = tc.failedSaves.tree + tc.fakeStorage.sigs.saveFailed = tc.failedSaves.sigs + tc.fakeStorage.unspent.saveFailed = tc.failedSaves.unspent + + bc := &Blockchain{ + db: db, + unspent: tc.fakeStorage.unspent, + meta: tc.fakeStorage.chainMeta, + tree: tc.fakeStorage.tree, + sigs: tc.fakeStorage.sigs, + walker: DefaultWalker, + } + + gb := makeGenesisBlock(t) + + err := db.Update("", func(tx *dbutil.Tx) error { + err := bc.AddBlock(tx, &gb) + require.Equal(t, tc.expect.err, err) + return nil + }) + require.NoError(t, err) + + // check sig + err = db.View("", func(tx *dbutil.Tx) error { + _, ok, err := tc.fakeStorage.sigs.Get(tx, gb.HashHeader()) + require.NoError(t, err) + require.Equal(t, tc.expect.sigSaved, ok) + + // check block in tree + b, err := tc.fakeStorage.tree.GetBlock(tx, gb.HashHeader()) + require.NoError(t, err) + require.Equal(t, tc.expect.blockSaved, b != nil) + + // check head seq + headSeq, ok, err := bc.HeadSeq(tx) + require.NoError(t, err) + + if tc.expect.err == nil { + require.True(t, ok) + require.Equal(t, tc.expect.headSeq, headSeq) + } else { + require.False(t, ok) + } + + // check len + length, err := bc.Len(tx) + require.NoError(t, err) + + if tc.expect.err == nil { + require.Equal(t, uint64(1), length) + } else { + require.Equal(t, uint64(0), length) + } + + // check genesis block + genesisBlock, err := bc.GetGenesisBlock(tx) + require.NoError(t, err) + + if tc.expect.err == nil { + require.NotNil(t, genesisBlock) + require.Equal(t, gb, *genesisBlock) + } else { + require.Nil(t, genesisBlock) + } + + return nil + }) + require.NoError(t, err) + }) + } + +} + +func TestBlockchainHead(t *testing.T) { + db, closeDB := prepareDB(t) + defer closeDB() + + bc, err := NewBlockchain(db, DefaultWalker) + require.NoError(t, err) + + err = db.Update("", func(tx *dbutil.Tx) error { + _, err = bc.Head(tx) + require.Equal(t, err, ErrNoHeadBlock) + + gb := makeGenesisBlock(t) + + err := bc.AddBlock(tx, &gb) + require.NoError(t, err) + + b, err := bc.Head(tx) + require.NoError(t, err) + require.Equal(t, gb.HashHeader().Hex(), b.HashHeader().Hex()) + + return nil + }) + require.NoError(t, err) +} + +func TestBlockchainLen(t *testing.T) { + db, closeDB := prepareDB(t) + defer closeDB() + + bc, err := NewBlockchain(db, DefaultWalker) + require.NoError(t, err) + + err = db.View("", func(tx *dbutil.Tx) error { + length, err := bc.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(0), length) + return nil + }) + require.NoError(t, err) + + gb := makeGenesisBlock(t) + err = db.Update("", func(tx *dbutil.Tx) error { + err := bc.AddBlock(tx, &gb) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) + + err = db.View("", func(tx *dbutil.Tx) error { + length, err := bc.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(1), length) + return nil + }) + require.NoError(t, err) +} + +func TestBlockchainGetBlockByHash(t *testing.T) { + gb := makeGenesisBlock(t) + + type expect struct { + err error + b *coin.SignedBlock + } + + tt := []struct { + name string + tree BlockTree + sigs BlockSigs + hash cipher.SHA256 + expect expect + }{ + { + "ok", + &fakeBlockTree{ + blocks: map[string]*coin.Block{ + gb.HashHeader().Hex(): &gb.Block, + }, + }, + &fakeSignatureStore{ + sigs: map[string]cipher.Sig{ + gb.HashHeader().Hex(): gb.Sig, + }, + }, + gb.HashHeader(), + expect{ + nil, + &gb, + }, + }, + { + "block not exist", + &fakeBlockTree{ + blocks: map[string]*coin.Block{}, + }, + &fakeSignatureStore{ + sigs: map[string]cipher.Sig{}, + }, + gb.HashHeader(), + expect{ + nil, + nil, + }, + }, + { + "signature not exist", + &fakeBlockTree{ + blocks: map[string]*coin.Block{ + gb.HashHeader().Hex(): &gb.Block, + }, + }, + &fakeSignatureStore{ + sigs: map[string]cipher.Sig{}, + }, + gb.HashHeader(), + expect{ + NewErrMissingSignature(&gb.Block), + nil, + }, + }, + { + "get signature error", + &fakeBlockTree{ + blocks: map[string]*coin.Block{ + gb.HashHeader().Hex(): &gb.Block, + }, + }, + &fakeSignatureStore{ + getSigErr: errors.New("intentional error"), + sigs: map[string]cipher.Sig{}, + }, + gb.HashHeader(), + expect{ + fmt.Errorf("find signature of block: %v failed: intentional error", gb.HashHeader().Hex()), + nil, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + db, closeDB := prepareDB(t) + defer closeDB() + + bc, err := NewBlockchain(db, DefaultWalker) + require.NoError(t, err) + + bc.tree = tc.tree + bc.sigs = tc.sigs + + err = db.View("", func(tx *dbutil.Tx) error { + b, err := bc.GetSignedBlockByHash(tx, tc.hash) + require.Equal(t, tc.expect.err, err) + require.Equal(t, tc.expect.b, b) + return nil + }) + require.NoError(t, err) + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/blocksigs.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/blocksigs.go new file mode 100644 index 00000000..16b5cda4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/blocksigs.go @@ -0,0 +1,69 @@ +package blockdb + +import ( + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +var ( + // BlockSigsBkt holds block signatures + BlockSigsBkt = []byte("block_sigs") +) + +// blockSigs manages known blockSigs as received. +// TODO -- support out of order blocks. This requires a change to the +// message protocol to support ranges similar to bitcoin's locator hashes. +// We also need to keep track of whether a block has been executed so that +// as continuity is established we can execute chains of blocks. +// TODO -- Since we will need to hold blocks that cannot be verified +// immediately against the blockchain, we need to be able to hold multiple +// blockSigs per BkSeq, or use hashes as keys. For now, this is not a +// problem assuming the signed blocks created by a block publisher are valid blocks, +// because we can check the signature independently of the blockchain. +type blockSigs struct{} + +// Get returns the signature of a specific block +func (bs *blockSigs) Get(tx *dbutil.Tx, hash cipher.SHA256) (cipher.Sig, bool, error) { + var sig sigWrapper + + v, err := dbutil.GetBucketValueNoCopy(tx, BlockSigsBkt, hash[:]) + if err != nil { + return cipher.Sig{}, false, err + } else if v == nil { + return cipher.Sig{}, false, nil + } + + if err := decodeSigWrapperExact(v, &sig); err != nil { + return cipher.Sig{}, false, err + } + + return sig.Sig, true, nil +} + +// Add adds a signed block to the db +func (bs *blockSigs) Add(tx *dbutil.Tx, hash cipher.SHA256, sig cipher.Sig) error { + buf, err := encodeSigWrapper(&sigWrapper{ + Sig: sig, + }) + if err != nil { + return err + } + return dbutil.PutBucketValue(tx, BlockSigsBkt, hash[:], buf) +} + +// ForEach iterates all signatures and calls f on them +func (bs *blockSigs) ForEach(tx *dbutil.Tx, f func(cipher.SHA256, cipher.Sig) error) error { + return dbutil.ForEach(tx, BlockSigsBkt, func(k, v []byte) error { + hash, err := cipher.SHA256FromBytes(k) + if err != nil { + return err + } + + var sig sigWrapper + if err := decodeSigWrapperExact(v, &sig); err != nil { + return err + } + + return f(hash, sig.Sig) + }) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/blocksigs_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/blocksigs_test.go new file mode 100644 index 00000000..cce08817 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/blocksigs_test.go @@ -0,0 +1,127 @@ +package blockdb + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +func TestBlockSigsGet(t *testing.T) { + type hashSig struct { + hash cipher.SHA256 + sig cipher.Sig + } + + type expect struct { + exist bool + sig cipher.Sig + err error + } + + hashSigs := []hashSig{} + for i := 0; i < 5; i++ { + _, s := cipher.GenerateKeyPair() + h := testutil.RandSHA256(t) + + sig := cipher.MustSignHash(h, s) + hashSigs = append(hashSigs, hashSig{ + hash: h, + sig: sig, + }) + } + + tt := []struct { + name string + init []hashSig + hash cipher.SHA256 + expect expect + }{ + { + "ok", + hashSigs[:], + hashSigs[0].hash, + expect{ + true, + hashSigs[0].sig, + nil, + }, + }, + { + "not exist", + hashSigs[1:], + hashSigs[0].hash, + expect{ + false, + cipher.Sig{}, + nil, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + db, closeDB := prepareDB(t) + defer closeDB() + + // init db + err := db.Update("", func(tx *dbutil.Tx) error { + bkt, err := tx.CreateBucketIfNotExists(BlockSigsBkt) + require.NoError(t, err) + for _, hs := range tc.init { + err = bkt.Put(hs.hash[:], encoder.Serialize(hs.sig)) + require.NoError(t, err) + } + return nil + }) + require.NoError(t, err) + + sigs := &blockSigs{} + + err = db.View("", func(tx *dbutil.Tx) error { + sg, ok, err := sigs.Get(tx, tc.hash) + require.Equal(t, tc.expect.err, err) + require.Equal(t, tc.expect.exist, ok) + if ok { + require.Equal(t, tc.expect.sig, sg) + } + + return nil + }) + require.NoError(t, err) + }) + } +} + +func TestBlockSigsAdd(t *testing.T) { + db, closeDB := prepareDB(t) + defer closeDB() + + _, s := cipher.GenerateKeyPair() + h := testutil.RandSHA256(t) + sig := cipher.MustSignHash(h, s) + + sigs := &blockSigs{} + + err := db.Update("", func(tx *dbutil.Tx) error { + return sigs.Add(tx, h, sig) + }) + require.NoError(t, err) + + // check the db + err = db.View("", func(tx *dbutil.Tx) error { + bkt := tx.Bucket(BlockSigsBkt) + v := bkt.Get(h[:]) + require.NotNil(t, v) + var s cipher.Sig + err := encoder.DeserializeRawExact(v, &s) + require.NoError(t, err) + require.Equal(t, sig, s) + return nil + }) + require.NoError(t, err) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/chain_meta.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/chain_meta.go new file mode 100644 index 00000000..b1a9d355 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/chain_meta.go @@ -0,0 +1,29 @@ +package blockdb + +import ( + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +var ( + // BlockchainMetaBkt holds blockchain metadata + BlockchainMetaBkt = []byte("blockchain_meta") + // blockchain head sequence number + headSeqKey = []byte("head_seq") +) + +type chainMeta struct{} + +func (m chainMeta) SetHeadSeq(tx *dbutil.Tx, seq uint64) error { + return dbutil.PutBucketValue(tx, BlockchainMetaBkt, headSeqKey, dbutil.Itob(seq)) +} + +func (m chainMeta) GetHeadSeq(tx *dbutil.Tx) (uint64, bool, error) { + v, err := dbutil.GetBucketValue(tx, BlockchainMetaBkt, headSeqKey) + if err != nil { + return 0, false, err + } else if v == nil { + return 0, false, nil + } + + return dbutil.Btoi(v), true, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/hash_pairs_wrapper_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/hash_pairs_wrapper_skyencoder.go new file mode 100644 index 00000000..9bc4b04c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/hash_pairs_wrapper_skyencoder.go @@ -0,0 +1,141 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package blockdb + +import ( + "errors" + "math" + + "github.com/SkycoinProject/skycoin/src/cipher/encoder" + "github.com/SkycoinProject/skycoin/src/coin" +) + +// encodeSizeHashPairsWrapper computes the size of an encoded object of type hashPairsWrapper +func encodeSizeHashPairsWrapper(obj *hashPairsWrapper) uint64 { + i0 := uint64(0) + + // obj.HashPairs + i0 += 4 + { + i1 := uint64(0) + + // x1.Hash + i1 += 32 + + // x1.PrevHash + i1 += 32 + + i0 += uint64(len(obj.HashPairs)) * i1 + } + + return i0 +} + +// encodeHashPairsWrapper encodes an object of type hashPairsWrapper to a buffer allocated to the exact size +// required to encode the object. +func encodeHashPairsWrapper(obj *hashPairsWrapper) ([]byte, error) { + n := encodeSizeHashPairsWrapper(obj) + buf := make([]byte, n) + + if err := encodeHashPairsWrapperToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeHashPairsWrapperToBuffer encodes an object of type hashPairsWrapper to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeHashPairsWrapperToBuffer(buf []byte, obj *hashPairsWrapper) error { + if uint64(len(buf)) < encodeSizeHashPairsWrapper(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.HashPairs length check + if uint64(len(obj.HashPairs)) > math.MaxUint32 { + return errors.New("obj.HashPairs length exceeds math.MaxUint32") + } + + // obj.HashPairs length + e.Uint32(uint32(len(obj.HashPairs))) + + // obj.HashPairs + for _, x := range obj.HashPairs { + + // x.Hash + e.CopyBytes(x.Hash[:]) + + // x.PrevHash + e.CopyBytes(x.PrevHash[:]) + + } + + return nil +} + +// decodeHashPairsWrapper decodes an object of type hashPairsWrapper from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeHashPairsWrapper(buf []byte, obj *hashPairsWrapper) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.HashPairs + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length != 0 { + obj.HashPairs = make([]coin.HashPair, length) + + for z1 := range obj.HashPairs { + { + // obj.HashPairs[z1].Hash + if len(d.Buffer) < len(obj.HashPairs[z1].Hash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.HashPairs[z1].Hash[:], d.Buffer[:len(obj.HashPairs[z1].Hash)]) + d.Buffer = d.Buffer[len(obj.HashPairs[z1].Hash):] + } + + { + // obj.HashPairs[z1].PrevHash + if len(d.Buffer) < len(obj.HashPairs[z1].PrevHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.HashPairs[z1].PrevHash[:], d.Buffer[:len(obj.HashPairs[z1].PrevHash)]) + d.Buffer = d.Buffer[len(obj.HashPairs[z1].PrevHash):] + } + + } + } + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeHashPairsWrapperExact decodes an object of type hashPairsWrapper from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeHashPairsWrapperExact(buf []byte, obj *hashPairsWrapper) error { + if n, err := decodeHashPairsWrapper(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/hash_pairs_wrapper_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/hash_pairs_wrapper_skyencoder_test.go new file mode 100644 index 00000000..3285ed6d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/hash_pairs_wrapper_skyencoder_test.go @@ -0,0 +1,421 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package blockdb + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +func newEmptyHashPairsWrapperForEncodeTest() *hashPairsWrapper { + var obj hashPairsWrapper + return &obj +} + +func newRandomHashPairsWrapperForEncodeTest(t *testing.T, rand *mathrand.Rand) *hashPairsWrapper { + var obj hashPairsWrapper + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenHashPairsWrapperForEncodeTest(t *testing.T, rand *mathrand.Rand) *hashPairsWrapper { + var obj hashPairsWrapper + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilHashPairsWrapperForEncodeTest(t *testing.T, rand *mathrand.Rand) *hashPairsWrapper { + var obj hashPairsWrapper + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderHashPairsWrapper(t *testing.T, obj *hashPairsWrapper) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeHashPairsWrapper(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeHashPairsWrapper() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeHashPairsWrapper(obj) + if err != nil { + t.Fatalf("encodeHashPairsWrapper failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeHashPairsWrapper produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeHashPairsWrapper()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeHashPairsWrapperToBuffer(data3, obj); err != nil { + t.Fatalf("encodeHashPairsWrapperToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 hashPairsWrapper + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 hashPairsWrapper + if n, err := decodeHashPairsWrapper(data2, &obj3); err != nil { + t.Fatalf("decodeHashPairsWrapper failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeHashPairsWrapper bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeHashPairsWrapper()") + } + + // Decode, excess buffer + var obj4 hashPairsWrapper + n, err := decodeHashPairsWrapper(data3, &obj4) + if err != nil { + t.Fatalf("decodeHashPairsWrapper failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeHashPairsWrapper bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeHashPairsWrapper bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeHashPairsWrapper()") + } + + // DecodeExact + var obj5 hashPairsWrapper + if err := decodeHashPairsWrapperExact(data2, &obj5); err != nil { + t.Fatalf("decodeHashPairsWrapper failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeHashPairsWrapper()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeHashPairsWrapper(data4, &obj3); err != nil { + t.Fatalf("decodeHashPairsWrapper failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeHashPairsWrapper bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderHashPairsWrapper(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *hashPairsWrapper + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptyHashPairsWrapperForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomHashPairsWrapperForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenHashPairsWrapperForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilHashPairsWrapperForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderHashPairsWrapper(t, tc.obj) + }) + } +} + +func decodeHashPairsWrapperExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj hashPairsWrapper + if _, err := decodeHashPairsWrapper(buf, &obj); err == nil { + t.Fatal("decodeHashPairsWrapper: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeHashPairsWrapper: expected error %q, got %q", expectedErr, err) + } +} + +func decodeHashPairsWrapperExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj hashPairsWrapper + if err := decodeHashPairsWrapperExact(buf, &obj); err == nil { + t.Fatal("decodeHashPairsWrapperExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeHashPairsWrapperExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderHashPairsWrapperDecodeErrors(t *testing.T, k int, tag string, obj *hashPairsWrapper) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeHashPairsWrapper(obj) + buf, err := encodeHashPairsWrapper(obj) + if err != nil { + t.Fatalf("encodeHashPairsWrapper failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeHashPairsWrapperExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeHashPairsWrapperExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeHashPairsWrapperExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeHashPairsWrapperExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeHashPairsWrapperExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderHashPairsWrapperDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptyHashPairsWrapperForEncodeTest() + fullObj := newRandomHashPairsWrapperForEncodeTest(t, rand) + testSkyencoderHashPairsWrapperDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderHashPairsWrapperDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/hashes_wrapper_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/hashes_wrapper_skyencoder.go new file mode 100644 index 00000000..f88f3085 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/hashes_wrapper_skyencoder.go @@ -0,0 +1,126 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package blockdb + +import ( + "errors" + "math" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +// encodeSizeHashesWrapper computes the size of an encoded object of type hashesWrapper +func encodeSizeHashesWrapper(obj *hashesWrapper) uint64 { + i0 := uint64(0) + + // obj.Hashes + i0 += 4 + { + i1 := uint64(0) + + // x1 + i1 += 32 + + i0 += uint64(len(obj.Hashes)) * i1 + } + + return i0 +} + +// encodeHashesWrapper encodes an object of type hashesWrapper to a buffer allocated to the exact size +// required to encode the object. +func encodeHashesWrapper(obj *hashesWrapper) ([]byte, error) { + n := encodeSizeHashesWrapper(obj) + buf := make([]byte, n) + + if err := encodeHashesWrapperToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeHashesWrapperToBuffer encodes an object of type hashesWrapper to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeHashesWrapperToBuffer(buf []byte, obj *hashesWrapper) error { + if uint64(len(buf)) < encodeSizeHashesWrapper(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Hashes length check + if uint64(len(obj.Hashes)) > math.MaxUint32 { + return errors.New("obj.Hashes length exceeds math.MaxUint32") + } + + // obj.Hashes length + e.Uint32(uint32(len(obj.Hashes))) + + // obj.Hashes + for _, x := range obj.Hashes { + + // x + e.CopyBytes(x[:]) + + } + + return nil +} + +// decodeHashesWrapper decodes an object of type hashesWrapper from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeHashesWrapper(buf []byte, obj *hashesWrapper) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Hashes + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length != 0 { + obj.Hashes = make([]cipher.SHA256, length) + + for z1 := range obj.Hashes { + { + // obj.Hashes[z1] + if len(d.Buffer) < len(obj.Hashes[z1]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Hashes[z1][:], d.Buffer[:len(obj.Hashes[z1])]) + d.Buffer = d.Buffer[len(obj.Hashes[z1]):] + } + + } + } + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeHashesWrapperExact decodes an object of type hashesWrapper from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeHashesWrapperExact(buf []byte, obj *hashesWrapper) error { + if n, err := decodeHashesWrapper(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/hashes_wrapper_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/hashes_wrapper_skyencoder_test.go new file mode 100644 index 00000000..d2b894f0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/hashes_wrapper_skyencoder_test.go @@ -0,0 +1,421 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package blockdb + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +func newEmptyHashesWrapperForEncodeTest() *hashesWrapper { + var obj hashesWrapper + return &obj +} + +func newRandomHashesWrapperForEncodeTest(t *testing.T, rand *mathrand.Rand) *hashesWrapper { + var obj hashesWrapper + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenHashesWrapperForEncodeTest(t *testing.T, rand *mathrand.Rand) *hashesWrapper { + var obj hashesWrapper + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilHashesWrapperForEncodeTest(t *testing.T, rand *mathrand.Rand) *hashesWrapper { + var obj hashesWrapper + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderHashesWrapper(t *testing.T, obj *hashesWrapper) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeHashesWrapper(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeHashesWrapper() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeHashesWrapper(obj) + if err != nil { + t.Fatalf("encodeHashesWrapper failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeHashesWrapper produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeHashesWrapper()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeHashesWrapperToBuffer(data3, obj); err != nil { + t.Fatalf("encodeHashesWrapperToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 hashesWrapper + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 hashesWrapper + if n, err := decodeHashesWrapper(data2, &obj3); err != nil { + t.Fatalf("decodeHashesWrapper failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeHashesWrapper bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeHashesWrapper()") + } + + // Decode, excess buffer + var obj4 hashesWrapper + n, err := decodeHashesWrapper(data3, &obj4) + if err != nil { + t.Fatalf("decodeHashesWrapper failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeHashesWrapper bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeHashesWrapper bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeHashesWrapper()") + } + + // DecodeExact + var obj5 hashesWrapper + if err := decodeHashesWrapperExact(data2, &obj5); err != nil { + t.Fatalf("decodeHashesWrapper failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeHashesWrapper()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeHashesWrapper(data4, &obj3); err != nil { + t.Fatalf("decodeHashesWrapper failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeHashesWrapper bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderHashesWrapper(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *hashesWrapper + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptyHashesWrapperForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomHashesWrapperForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenHashesWrapperForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilHashesWrapperForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderHashesWrapper(t, tc.obj) + }) + } +} + +func decodeHashesWrapperExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj hashesWrapper + if _, err := decodeHashesWrapper(buf, &obj); err == nil { + t.Fatal("decodeHashesWrapper: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeHashesWrapper: expected error %q, got %q", expectedErr, err) + } +} + +func decodeHashesWrapperExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj hashesWrapper + if err := decodeHashesWrapperExact(buf, &obj); err == nil { + t.Fatal("decodeHashesWrapperExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeHashesWrapperExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderHashesWrapperDecodeErrors(t *testing.T, k int, tag string, obj *hashesWrapper) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeHashesWrapper(obj) + buf, err := encodeHashesWrapper(obj) + if err != nil { + t.Fatalf("encodeHashesWrapper failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeHashesWrapperExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeHashesWrapperExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeHashesWrapperExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeHashesWrapperExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeHashesWrapperExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderHashesWrapperDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptyHashesWrapperForEncodeTest() + fullObj := newRandomHashesWrapperForEncodeTest(t, rand) + testSkyencoderHashesWrapperDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderHashesWrapperDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/sig_wrapper_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/sig_wrapper_skyencoder.go new file mode 100644 index 00000000..87526f34 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/sig_wrapper_skyencoder.go @@ -0,0 +1,78 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package blockdb + +import "github.com/SkycoinProject/skycoin/src/cipher/encoder" + +// encodeSizeSigWrapper computes the size of an encoded object of type sigWrapper +func encodeSizeSigWrapper(obj *sigWrapper) uint64 { + i0 := uint64(0) + + // obj.Sig + i0 += 65 + + return i0 +} + +// encodeSigWrapper encodes an object of type sigWrapper to a buffer allocated to the exact size +// required to encode the object. +func encodeSigWrapper(obj *sigWrapper) ([]byte, error) { + n := encodeSizeSigWrapper(obj) + buf := make([]byte, n) + + if err := encodeSigWrapperToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeSigWrapperToBuffer encodes an object of type sigWrapper to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeSigWrapperToBuffer(buf []byte, obj *sigWrapper) error { + if uint64(len(buf)) < encodeSizeSigWrapper(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Sig + e.CopyBytes(obj.Sig[:]) + + return nil +} + +// decodeSigWrapper decodes an object of type sigWrapper from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeSigWrapper(buf []byte, obj *sigWrapper) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Sig + if len(d.Buffer) < len(obj.Sig) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Sig[:], d.Buffer[:len(obj.Sig)]) + d.Buffer = d.Buffer[len(obj.Sig):] + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeSigWrapperExact decodes an object of type sigWrapper from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeSigWrapperExact(buf []byte, obj *sigWrapper) error { + if n, err := decodeSigWrapper(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/sig_wrapper_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/sig_wrapper_skyencoder_test.go new file mode 100644 index 00000000..5701a517 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/sig_wrapper_skyencoder_test.go @@ -0,0 +1,421 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package blockdb + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +func newEmptySigWrapperForEncodeTest() *sigWrapper { + var obj sigWrapper + return &obj +} + +func newRandomSigWrapperForEncodeTest(t *testing.T, rand *mathrand.Rand) *sigWrapper { + var obj sigWrapper + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenSigWrapperForEncodeTest(t *testing.T, rand *mathrand.Rand) *sigWrapper { + var obj sigWrapper + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilSigWrapperForEncodeTest(t *testing.T, rand *mathrand.Rand) *sigWrapper { + var obj sigWrapper + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderSigWrapper(t *testing.T, obj *sigWrapper) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeSigWrapper(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeSigWrapper() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeSigWrapper(obj) + if err != nil { + t.Fatalf("encodeSigWrapper failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeSigWrapper produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeSigWrapper()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeSigWrapperToBuffer(data3, obj); err != nil { + t.Fatalf("encodeSigWrapperToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 sigWrapper + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 sigWrapper + if n, err := decodeSigWrapper(data2, &obj3); err != nil { + t.Fatalf("decodeSigWrapper failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeSigWrapper bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeSigWrapper()") + } + + // Decode, excess buffer + var obj4 sigWrapper + n, err := decodeSigWrapper(data3, &obj4) + if err != nil { + t.Fatalf("decodeSigWrapper failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeSigWrapper bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeSigWrapper bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeSigWrapper()") + } + + // DecodeExact + var obj5 sigWrapper + if err := decodeSigWrapperExact(data2, &obj5); err != nil { + t.Fatalf("decodeSigWrapper failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeSigWrapper()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeSigWrapper(data4, &obj3); err != nil { + t.Fatalf("decodeSigWrapper failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeSigWrapper bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderSigWrapper(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *sigWrapper + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptySigWrapperForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomSigWrapperForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenSigWrapperForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilSigWrapperForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderSigWrapper(t, tc.obj) + }) + } +} + +func decodeSigWrapperExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj sigWrapper + if _, err := decodeSigWrapper(buf, &obj); err == nil { + t.Fatal("decodeSigWrapper: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeSigWrapper: expected error %q, got %q", expectedErr, err) + } +} + +func decodeSigWrapperExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj sigWrapper + if err := decodeSigWrapperExact(buf, &obj); err == nil { + t.Fatal("decodeSigWrapperExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeSigWrapperExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderSigWrapperDecodeErrors(t *testing.T, k int, tag string, obj *sigWrapper) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeSigWrapper(obj) + buf, err := encodeSigWrapper(obj) + if err != nil { + t.Fatalf("encodeSigWrapper failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeSigWrapperExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeSigWrapperExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeSigWrapperExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeSigWrapperExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeSigWrapperExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderSigWrapperDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptySigWrapperForEncodeTest() + fullObj := newRandomSigWrapperForEncodeTest(t, rand) + testSkyencoderSigWrapperDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderSigWrapperDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/testdata/blockchain-180.no-unspent-addr-index.db b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/testdata/blockchain-180.no-unspent-addr-index.db new file mode 100644 index 00000000..dcd9ede3 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/testdata/blockchain-180.no-unspent-addr-index.db differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/unspent.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/unspent.go new file mode 100644 index 00000000..6e1c04d4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/unspent.go @@ -0,0 +1,541 @@ +package blockdb + +import ( + "bytes" + "errors" + "fmt" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +var ( + xorhashKey = []byte("xorhash") + addrIndexHeightKey = []byte("addr_index_height") + + // UnspentPoolBkt holds unspent outputs, indexed by unspent output hash + UnspentPoolBkt = []byte("unspent_pool") + // UnspentPoolAddrIndexBkt maps addresses to their unspent outputs + UnspentPoolAddrIndexBkt = []byte("unspent_pool_addr_index") + // UnspentMetaBkt holds unspent output metadata + UnspentMetaBkt = []byte("unspent_meta") +) + +// ErrUnspentNotExist is returned if an unspent is not found in the pool +type ErrUnspentNotExist struct { + UxID string +} + +// NewErrUnspentNotExist creates ErrUnspentNotExist from a UxID +func NewErrUnspentNotExist(uxID string) error { + return ErrUnspentNotExist{ + UxID: uxID, + } +} + +func (e ErrUnspentNotExist) Error() string { + return fmt.Sprintf("unspent output of %s does not exist", e.UxID) +} + +// AddressHashes maps addresses to a set of hashes +type AddressHashes map[cipher.Address][]cipher.SHA256 + +// Flatten flattens all hash sets from AddressHashes to one slice +func (a AddressHashes) Flatten() []cipher.SHA256 { + total := 0 + for _, h := range a { + total += len(h) + } + + hashes := make([]cipher.SHA256, total) + + i := 0 + for _, h := range a { + copy(hashes[i:], h) + i += len(h) + } + + return hashes +} + +type unspentMeta struct{} + +func (m unspentMeta) getXorHash(tx *dbutil.Tx) (cipher.SHA256, error) { + v, err := dbutil.GetBucketValue(tx, UnspentMetaBkt, xorhashKey) + if err != nil { + return cipher.SHA256{}, err + } else if v == nil { + return cipher.SHA256{}, nil + } + + return cipher.SHA256FromBytes(v) +} + +func (m *unspentMeta) setXorHash(tx *dbutil.Tx, hash cipher.SHA256) error { + return dbutil.PutBucketValue(tx, UnspentMetaBkt, xorhashKey, hash[:]) +} + +func (m *unspentMeta) getAddrIndexHeight(tx *dbutil.Tx) (uint64, bool, error) { + v, err := dbutil.GetBucketValue(tx, UnspentMetaBkt, addrIndexHeightKey) + if err != nil { + return 0, false, err + } else if v == nil { + return 0, false, nil + } + + return dbutil.Btoi(v), true, nil +} + +func (m *unspentMeta) setAddrIndexHeight(tx *dbutil.Tx, height uint64) error { + return dbutil.PutBucketValue(tx, UnspentMetaBkt, addrIndexHeightKey, dbutil.Itob(height)) +} + +type pool struct{} + +func (pl pool) get(tx *dbutil.Tx, hash cipher.SHA256) (*coin.UxOut, error) { + var out coin.UxOut + + v, err := dbutil.GetBucketValueNoCopy(tx, UnspentPoolBkt, hash[:]) + if err != nil { + return nil, err + } else if v == nil { + return nil, nil + } + + if err := decodeUxOutExact(v, &out); err != nil { + return nil, err + } + + return &out, nil +} + +func (pl pool) getAll(tx *dbutil.Tx) (coin.UxArray, error) { + var uxa coin.UxArray + + if err := dbutil.ForEach(tx, UnspentPoolBkt, func(_, v []byte) error { + var ux coin.UxOut + if err := decodeUxOutExact(v, &ux); err != nil { + return err + } + + uxa = append(uxa, ux) + return nil + }); err != nil { + return nil, err + } + + return uxa, nil +} + +func (pl pool) put(tx *dbutil.Tx, hash cipher.SHA256, ux coin.UxOut) error { + buf, err := encodeUxOut(&ux) + if err != nil { + return err + } + + return dbutil.PutBucketValue(tx, UnspentPoolBkt, hash[:], buf) +} + +func (pl *pool) delete(tx *dbutil.Tx, hash cipher.SHA256) error { + return dbutil.Delete(tx, UnspentPoolBkt, hash[:]) +} + +type poolAddrIndex struct{} + +func (p poolAddrIndex) get(tx *dbutil.Tx, addr cipher.Address) ([]cipher.SHA256, error) { + var hashes hashesWrapper + + v, err := dbutil.GetBucketValueNoCopy(tx, UnspentPoolAddrIndexBkt, addr.Bytes()) + if err != nil { + return nil, err + } else if v == nil { + return nil, nil + } + + if err := decodeHashesWrapperExact(v, &hashes); err != nil { + return nil, err + } + + return hashes.Hashes, nil +} + +func (p poolAddrIndex) put(tx *dbutil.Tx, addr cipher.Address, hashes []cipher.SHA256) error { + if len(hashes) == 0 { + return errors.New("poolAddrIndex.put cannot put empty hash array") + } + + hashesMap := make(map[cipher.SHA256]struct{}, len(hashes)) + for _, h := range hashes { + if _, ok := hashesMap[h]; ok { + return errors.New("poolAddrIndex.put: hashes array contains duplicate") + } + + hashesMap[h] = struct{}{} + } + + buf, err := encodeHashesWrapper(&hashesWrapper{ + Hashes: hashes, + }) + if err != nil { + return err + } + + return dbutil.PutBucketValue(tx, UnspentPoolAddrIndexBkt, addr.Bytes(), buf) +} + +// adjust adds and removes hashes from an address -> hashes index +// TODO -- if necessary, this can be optimized further to accept multiple addresses at once, +// so that all get queries can be performed before the set +func (p poolAddrIndex) adjust(tx *dbutil.Tx, addr cipher.Address, addHashes, rmHashes []cipher.SHA256) error { + if len(addHashes) == 0 && len(rmHashes) == 0 { + return nil + } + + existingHashes, err := p.get(tx, addr) + if err != nil { + return err + } + + rmHashesMap := make(map[cipher.SHA256]struct{}, len(rmHashes)) + for _, h := range rmHashes { + rmHashesMap[h] = struct{}{} + } + + if len(rmHashesMap) != len(rmHashes) { + return errors.New("poolAddrIndex.adjust: rmHashes contains duplicates") + } + + newHashesSize := len(existingHashes) - len(rmHashes) + if newHashesSize < 0 { + return errors.New("poolAddrIndex.adjust: rmHashes is longer than existingHashes") + } + + newHashes := make([]cipher.SHA256, 0, newHashesSize) + newHashesMap := make(map[cipher.SHA256]struct{}, newHashesSize) + + rmHashesCount := 0 + for _, h := range existingHashes { + if _, ok := rmHashesMap[h]; ok { + rmHashesCount++ + } else { + newHashes = append(newHashes, h) + newHashesMap[h] = struct{}{} + } + } + + if rmHashesCount != len(rmHashes) { + return fmt.Errorf("poolAddrIndex.adjust: rmHashes contains %d hashes not indexed for address %s", len(rmHashes)-rmHashesCount, addr.String()) + } + + for _, h := range addHashes { + if _, ok := rmHashesMap[h]; ok { + return errors.New("poolAddrIndex.adjust: hash appears in both addHashes and rmHashes") + } + + if _, ok := newHashesMap[h]; !ok { + newHashes = append(newHashes, h) + newHashesMap[h] = struct{}{} + } else { + return fmt.Errorf("poolAddrIndex.adjust: uxout hash %s is already indexed for address %s", h.Hex(), addr.String()) + } + } + + // Delete the row if hashes is empty, so that the length of the bucket can + // be used to determine the number of addresses with unspents + if len(newHashes) == 0 { + return dbutil.Delete(tx, UnspentPoolAddrIndexBkt, addr.Bytes()) + } + + return p.put(tx, addr, newHashes) +} + +// Unspents unspent outputs pool +type Unspents struct { + pool *pool + poolAddrIndex *poolAddrIndex + meta *unspentMeta +} + +// NewUnspentPool creates new unspent pool instance +func NewUnspentPool() *Unspents { + return &Unspents{ + pool: &pool{}, + poolAddrIndex: &poolAddrIndex{}, + meta: &unspentMeta{}, + } +} + +// MaybeBuildIndexes builds indexes if necessary +func (up *Unspents) MaybeBuildIndexes(tx *dbutil.Tx, headSeq uint64) error { + logger.Info("Unspents.MaybeBuildIndexes") + + // Compare the addrIndexHeight to the head block, + // if not equal, rebuild the address index + addrIndexHeight, ok, err := up.meta.getAddrIndexHeight(tx) + if err != nil { + return err + } + + if ok && addrIndexHeight == headSeq { + return nil + } + + if addrIndexHeight > headSeq { + logger.Critical().Warningf("addrIndexHeight > headSeq (%d > %d)", addrIndexHeight, headSeq) + } + + logger.Infof("Rebuilding unspent_pool_addr_index (addrHeightIndexExists=%v, addrIndexHeight=%d, headSeq=%d)", ok, addrIndexHeight, headSeq) + + return up.buildAddrIndex(tx) +} + +func (up *Unspents) buildAddrIndex(tx *dbutil.Tx) error { + logger.Info("Building unspent address index") + + if err := dbutil.Reset(tx, UnspentPoolAddrIndexBkt); err != nil { + return err + } + + addrHashes := make(map[cipher.Address][]cipher.SHA256) + + var maxBlockSeq uint64 + if err := dbutil.ForEach(tx, UnspentPoolBkt, func(k, v []byte) error { + var ux coin.UxOut + if err := decodeUxOutExact(v, &ux); err != nil { + return err + } + + if ux.Head.BkSeq > maxBlockSeq { + maxBlockSeq = ux.Head.BkSeq + } + + h := ux.Hash() + + if !bytes.Equal(k[:], h[:]) { + return errors.New("Unspent pool uxout.Hash() does not match its key") + } + + addrHashes[ux.Body.Address] = append(addrHashes[ux.Body.Address], h) + + return nil + }); err != nil { + return err + } + + if len(addrHashes) == 0 { + logger.Infof("No unspents to index") + return nil + } + + for addr, hashes := range addrHashes { + if err := up.poolAddrIndex.put(tx, addr, hashes); err != nil { + return err + } + } + + if err := up.meta.setAddrIndexHeight(tx, maxBlockSeq); err != nil { + return err + } + + logger.Infof("Indexed unspents for %d addresses", len(addrHashes)) + + return nil +} + +// ProcessBlock adds unspents from a block to the unspent pool +func (up *Unspents) ProcessBlock(tx *dbutil.Tx, b *coin.SignedBlock) error { + // Gather all transaction inputs + var inputs []cipher.SHA256 + var txnUxs coin.UxArray + for _, txn := range b.Body.Transactions { + inputs = append(inputs, txn.In...) + txnUxs = append(txnUxs, coin.CreateUnspents(b.Head, txn)...) + } + + uxs, err := up.GetArray(tx, inputs) + if err != nil { + return err + } + + xorHash, err := up.meta.getXorHash(tx) + if err != nil { + return err + } + + // Remove spent outputs + rmAddrHashes := make(map[cipher.Address][]cipher.SHA256) + for _, ux := range uxs { + xorHash = xorHash.Xor(ux.SnapshotHash()) + + h := ux.Hash() + + if err := up.pool.delete(tx, h); err != nil { + return err + } + + rmAddrHashes[ux.Body.Address] = append(rmAddrHashes[ux.Body.Address], h) + } + + // Create new outputs + txnUxHashes := make([]cipher.SHA256, len(txnUxs)) + addAddrHashes := make(map[cipher.Address][]cipher.SHA256) + for i, ux := range txnUxs { + h := ux.Hash() + txnUxHashes[i] = h + addAddrHashes[ux.Body.Address] = append(addAddrHashes[ux.Body.Address], h) + } + + // Check that the uxout exists in the pool already, otherwise xorHash will be calculated wrong + for _, h := range txnUxHashes { + if hasKey, err := up.Contains(tx, h); err != nil { + return err + } else if hasKey { + return fmt.Errorf("attempted to insert uxout:%v twice into the unspent pool", h.Hex()) + } + } + + for i, ux := range txnUxs { + // Add new outputs + if err := up.pool.put(tx, txnUxHashes[i], ux); err != nil { + return err + } + + // Recalculate xorHash + xorHash = xorHash.Xor(ux.SnapshotHash()) + } + + // Set xorHash + if err := up.meta.setXorHash(tx, xorHash); err != nil { + return err + } + + // Update indexes + for addr, rmHashes := range rmAddrHashes { + addHashes := addAddrHashes[addr] + + if err := up.poolAddrIndex.adjust(tx, addr, addHashes, rmHashes); err != nil { + return err + } + + delete(addAddrHashes, addr) + } + + for addr, addHashes := range addAddrHashes { + if err := up.poolAddrIndex.adjust(tx, addr, addHashes, nil); err != nil { + return err + } + } + + // Check that the addrIndexHeight is incremental + addrIndexHeight, ok, err := up.meta.getAddrIndexHeight(tx) + if err != nil { + return err + } + + if b.Block.Head.BkSeq == 0 { + if ok { + err := errors.New("addrIndexHeight is set but no block has been indexed yet") + logger.Critical().Error(err.Error()) + return err + } + } else if b.Block.Head.BkSeq != addrIndexHeight+1 { + err := errors.New("unspent pool processing blocks out of order") + logger.Critical().Error(err.Error()) + return err + } + + // Update the addrIndexHeight + return up.meta.setAddrIndexHeight(tx, b.Block.Head.BkSeq) +} + +// GetArray returns UxOut for a set of hashes, will return error if any of the hashes do not exist in the pool. +func (up *Unspents) GetArray(tx *dbutil.Tx, hashes []cipher.SHA256) (coin.UxArray, error) { + var uxa coin.UxArray + + for _, h := range hashes { + ux, err := up.pool.get(tx, h) + if err != nil { + return nil, err + } else if ux == nil { + return nil, NewErrUnspentNotExist(h.Hex()) + } + + uxa = append(uxa, *ux) + } + + return uxa, nil +} + +// Get returns the uxout value of given hash +func (up *Unspents) Get(tx *dbutil.Tx, h cipher.SHA256) (*coin.UxOut, error) { + return up.pool.get(tx, h) +} + +// GetAll returns Pool as an array. Note: they are not in any particular order. +func (up *Unspents) GetAll(tx *dbutil.Tx) (coin.UxArray, error) { + return up.pool.getAll(tx) +} + +// Len returns the unspent outputs num +func (up *Unspents) Len(tx *dbutil.Tx) (uint64, error) { + return dbutil.Len(tx, UnspentPoolBkt) +} + +// Contains check if the hash of uxout does exist in the pool +func (up *Unspents) Contains(tx *dbutil.Tx, h cipher.SHA256) (bool, error) { + return dbutil.BucketHasKey(tx, UnspentPoolBkt, h[:]) +} + +// GetUnspentHashesOfAddrs returns a map of addresses to their unspent output hashes +func (up *Unspents) GetUnspentHashesOfAddrs(tx *dbutil.Tx, addrs []cipher.Address) (AddressHashes, error) { + addrHashes := make(AddressHashes, len(addrs)) + + for _, addr := range addrs { + hashes, err := up.poolAddrIndex.get(tx, addr) + if err != nil { + return nil, err + } + + addrHashes[addr] = hashes + } + + return addrHashes, nil +} + +// GetUnspentsOfAddrs returns a map of addresses to their unspent outputs +func (up *Unspents) GetUnspentsOfAddrs(tx *dbutil.Tx, addrs []cipher.Address) (coin.AddressUxOuts, error) { + addrUxs := make(coin.AddressUxOuts, len(addrs)) + + for _, addr := range addrs { + hashes, err := up.poolAddrIndex.get(tx, addr) + if err != nil { + return nil, err + } + + uxa, err := up.GetArray(tx, hashes) + if err != nil { + switch e := err.(type) { + case ErrUnspentNotExist: + logger.Critical().Errorf("Unspent hash %s indexed under address %s does not exist in unspent pool", e.UxID, addr.String()) + } + return nil, err + } + + addrUxs[addr] = uxa + } + + return addrUxs, nil +} + +// GetUxHash returns unspent output checksum for the Block. +// Must be called after Block is fully initialized, +// and before its outputs are added to the unspent pool +func (up *Unspents) GetUxHash(tx *dbutil.Tx) (cipher.SHA256, error) { + return up.meta.getXorHash(tx) +} + +// AddressCount returns the total number of addresses with unspents +func (up *Unspents) AddressCount(tx *dbutil.Tx) (uint64, error) { + return dbutil.Len(tx, UnspentPoolAddrIndexBkt) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/unspent_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/unspent_test.go new file mode 100644 index 00000000..309205a5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/unspent_test.go @@ -0,0 +1,1155 @@ +package blockdb + +import ( + "bytes" + "errors" + "fmt" + "io" + "io/ioutil" + "os" + "sort" + "testing" + "time" + + "github.com/boltdb/bolt" + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +func makeUxBody(t *testing.T) coin.UxBody { + p, _ := cipher.GenerateKeyPair() + return coin.UxBody{ + SrcTransaction: testutil.RandSHA256(t), + Address: cipher.AddressFromPubKey(p), + Coins: 1e6, + Hours: 100, + } +} + +func makeUxOut(t *testing.T) coin.UxOut { + body := makeUxBody(t) + return coin.UxOut{ + Head: coin.UxHead{ + Time: 100, + BkSeq: 2, + }, + Body: body, + } +} + +func TestNewUnspentPool(t *testing.T) { + db, teardown := prepareDB(t) + defer teardown() + + up := NewUnspentPool() + + err := db.View("", func(tx *dbutil.Tx) error { + length, err := dbutil.Len(tx, UnspentPoolBkt) + require.NoError(t, err) + require.Equal(t, uint64(0), length) + + h, err := up.meta.getXorHash(tx) + require.NoError(t, err) + require.Equal(t, cipher.SHA256{}, h) + return nil + + }) + require.NoError(t, err) +} + +func addUxOut(db *dbutil.DB, up *Unspents, ux coin.UxOut) error { + return db.Update("", func(tx *dbutil.Tx) error { + if err := up.pool.put(tx, ux.Hash(), ux); err != nil { + return err + } + + return up.poolAddrIndex.adjust(tx, ux.Body.Address, []cipher.SHA256{ux.Hash()}, nil) + }) +} + +func TestUnspentPoolGet(t *testing.T) { + var uxs coin.UxArray + for i := 0; i < 5; i++ { + ux := makeUxOut(t) + uxs = append(uxs, ux) + } + + testCases := []struct { + name string + unspents coin.UxArray + hash cipher.SHA256 + ux *coin.UxOut + }{ + { + "not exist", + uxs[:2], + uxs[2].Hash(), + nil, + }, + { + "find one", + uxs[:2], + uxs[1].Hash(), + &uxs[1], + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + db, teardown := prepareDB(t) + defer teardown() + + up := NewUnspentPool() + for _, ux := range tc.unspents { + err := addUxOut(db, up, ux) + require.NoError(t, err) + } + + err := db.View("", func(tx *dbutil.Tx) error { + ux, err := up.Get(tx, tc.hash) + require.NoError(t, err) + require.Equal(t, tc.ux, ux) + return nil + }) + require.NoError(t, err) + }) + } +} + +func TestUnspentPoolLen(t *testing.T) { + var uxs coin.UxArray + for i := 0; i < 5; i++ { + ux := makeUxOut(t) + uxs = append(uxs, ux) + } + + db, closedb := prepareDB(t) + defer closedb() + + up := NewUnspentPool() + + for _, ux := range uxs { + err := addUxOut(db, up, ux) + require.NoError(t, err) + } + + err := db.View("", func(tx *dbutil.Tx) error { + length, err := up.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(5), length) + return nil + }) + require.NoError(t, err) +} + +func TestUnspentPoolGetUxHash(t *testing.T) { + var uxs coin.UxArray + for i := 0; i < 5; i++ { + ux := makeUxOut(t) + uxs = append(uxs, ux) + } + + db, closedb := prepareDB(t) + defer closedb() + + up := NewUnspentPool() + + for _, ux := range uxs { + err := addUxOut(db, up, ux) + require.NoError(t, err) + err = db.Update("", func(tx *dbutil.Tx) error { + uxHash, err := up.GetUxHash(tx) + require.NoError(t, err) + + xorHash, err := up.meta.getXorHash(tx) + require.NoError(t, err) + require.Equal(t, xorHash.Hex(), uxHash.Hex()) + return nil + }) + require.NoError(t, err) + } +} + +func TestUnspentPoolGetArray(t *testing.T) { + db, teardown := prepareDB(t) + defer teardown() + + up := NewUnspentPool() + + var uxs coin.UxArray + for i := 0; i < 5; i++ { + ux := makeUxOut(t) + err := addUxOut(db, up, ux) + require.NoError(t, err) + uxs = append(uxs, ux) + } + + outsideUx := makeUxOut(t) + + testCases := []struct { + name string + hashes []cipher.SHA256 + err error + unspents coin.UxArray + }{ + { + "get first", + []cipher.SHA256{uxs[0].Hash()}, + nil, + uxs[:1], + }, + { + "get second", + []cipher.SHA256{uxs[1].Hash()}, + nil, + uxs[1:2], + }, + { + "get two", + []cipher.SHA256{uxs[0].Hash(), uxs[1].Hash()}, + nil, + uxs[0:2], + }, + { + "get not exist", + []cipher.SHA256{outsideUx.Hash()}, + NewErrUnspentNotExist(outsideUx.Hash().Hex()), + coin.UxArray{}, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + err := db.View("", func(tx *dbutil.Tx) error { + uxs, err := up.GetArray(tx, tc.hashes) + require.Equal(t, tc.err, err) + if err == nil { + require.Equal(t, tc.unspents, uxs) + } + return nil + }) + require.NoError(t, err) + }) + } +} + +func TestUnspentPoolGetAll(t *testing.T) { + var uxs coin.UxArray + for i := 0; i < 5; i++ { + ux := makeUxOut(t) + uxs = append(uxs, ux) + } + + testCases := []struct { + name string + unspents coin.UxArray + expect coin.UxArray + }{ + { + "empty", + coin.UxArray{}, + coin.UxArray{}, + }, + { + "one unspent", + uxs[:1], + uxs[:1], + }, + { + "two unspent", + uxs[:2], + uxs[:2], + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + db, teardown := prepareDB(t) + defer teardown() + + up := NewUnspentPool() + for _, ux := range tc.unspents { + err := addUxOut(db, up, ux) + require.NoError(t, err) + } + + err := db.View("", func(tx *dbutil.Tx) error { + unspents, err := up.GetAll(tx) + require.NoError(t, err) + + uxm := make(map[cipher.SHA256]struct{}) + for _, ux := range unspents { + uxm[ux.Hash()] = struct{}{} + } + + for _, ux := range tc.expect { + _, ok := uxm[ux.Hash()] + require.True(t, ok) + } + + return nil + }) + require.NoError(t, err) + }) + } +} + +func BenchmarkUnspentPoolGetAll(b *testing.B) { + var t testing.T + db, teardown := prepareDB(&t) + defer teardown() + + up := NewUnspentPool() + + for i := 0; i < 1000; i++ { + ux := makeUxOut(&t) + if err := addUxOut(db, up, ux); err != nil { + b.Fatal(err) + } + } + + start := time.Now() + for i := 0; i < b.N; i++ { + err := db.View("", func(tx *dbutil.Tx) error { + _, err := up.GetAll(tx) + return err + }) + if err != nil { + b.Fatal(err) + } + } + fmt.Println(time.Since(start)) +} + +func TestGetUnspentOfAddrs(t *testing.T) { + var uxs coin.UxArray + for i := 0; i < 5; i++ { + ux := makeUxOut(t) + uxs = append(uxs, ux) + } + + uxs[4].Body.Address = uxs[0].Body.Address + + testCases := []struct { + name string + unspents coin.UxArray + addrs []cipher.Address + expect coin.UxArray + }{ + { + name: "one one addr one unspent", + unspents: uxs[:], + addrs: []cipher.Address{uxs[1].Body.Address}, + expect: uxs[1:2], + }, + { + name: "one addr two unspents", + unspents: uxs[:], + addrs: []cipher.Address{uxs[0].Body.Address}, + expect: []coin.UxOut{ + uxs[0], + uxs[4], + }, + }, + { + name: "two addrs three unspents", + unspents: uxs[:], + addrs: []cipher.Address{uxs[0].Body.Address, uxs[1].Body.Address}, + expect: []coin.UxOut{ + uxs[0], + uxs[1], + uxs[4], + }, + }, + { + name: "two addrs two unspents", + unspents: uxs[:], + addrs: []cipher.Address{uxs[2].Body.Address, uxs[1].Body.Address}, + expect: []coin.UxOut{ + uxs[1], + uxs[2], + }, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + db, teardown := prepareDB(t) + defer teardown() + + up := NewUnspentPool() + for _, ux := range tc.unspents { + err := addUxOut(db, up, ux) + require.NoError(t, err) + } + + var unspents coin.AddressUxOuts + err := db.View("", func(tx *dbutil.Tx) error { + var err error + unspents, err = up.GetUnspentsOfAddrs(tx, tc.addrs) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) + + uxm := make(map[cipher.SHA256]struct{}, len(unspents)) + for _, uxs := range unspents { + for _, ux := range uxs { + uxm[ux.Hash()] = struct{}{} + } + } + + require.Equal(t, len(uxm), len(tc.expect)) + + for _, ux := range tc.expect { + _, ok := uxm[ux.Hash()] + require.True(t, ok) + } + }) + } +} + +func TestUnspentProcessBlock(t *testing.T) { + var uxs coin.UxArray + for i := 0; i < 5; i++ { + ux := makeUxOut(t) + uxs = append(uxs, ux) + } + + type testOutputs struct { + addr cipher.Address + coins uint64 + hours uint64 + } + + addr := testutil.MakeAddress() + + tt := []struct { + name string + init coin.UxArray + inputs coin.UxArray + outputs []testOutputs + nIndexedAddrs uint64 + }{ + { + name: "spend one create one", + init: uxs, + inputs: uxs[:1], + outputs: []testOutputs{ + { + addr: testutil.MakeAddress(), + coins: 1e6, + hours: uxs[0].Body.Hours / 2, + }, + }, + nIndexedAddrs: 5, + }, + + { + name: "spend one create two", + init: uxs, + inputs: uxs[:1], + outputs: []testOutputs{ + { + addr: testutil.MakeAddress(), + coins: 1e6 / 2, + hours: uxs[0].Body.Hours / 4, + }, + { + addr: testutil.MakeAddress(), + coins: 1e6 / 2, + hours: uxs[0].Body.Hours / 4, + }, + }, + nIndexedAddrs: 6, + }, + + { + name: "spend one create three - two to the same new address and one to the spending address ", + init: uxs, + inputs: uxs[:1], + outputs: []testOutputs{ + { + addr: addr, + coins: 1e6 / 4, + hours: uxs[0].Body.Hours / 16, + }, + { + addr: addr, + coins: 1e6 / 4, + hours: uxs[0].Body.Hours / 8, + }, + { + addr: uxs[0].Body.Address, + coins: 1e6 / 4, + hours: uxs[0].Body.Hours / 8, + }, + }, + nIndexedAddrs: 6, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + db, closedb := prepareDB(t) + defer closedb() + + up := NewUnspentPool() + + for _, ux := range tc.init { + err := addUxOut(db, up, ux) + require.NoError(t, err) + } + + txn := coin.Transaction{} + for _, in := range tc.inputs { + err := txn.PushInput(in.Hash()) + require.NoError(t, err) + } + + for _, o := range tc.outputs { + err := txn.PushOutput(o.addr, o.coins, o.hours) + require.NoError(t, err) + } + + var block *coin.Block + var oldUxHash cipher.SHA256 + + err := db.Update("", func(tx *dbutil.Tx) error { + uxHash, err := up.GetUxHash(tx) + require.NoError(t, err) + + block, err = coin.NewBlock(coin.Block{}, uint64(time.Now().Unix()), uxHash, coin.Transactions{txn}, feeCalc) + require.NoError(t, err) + + oldUxHash, err = up.GetUxHash(tx) + require.NoError(t, err) + + err = up.ProcessBlock(tx, &coin.SignedBlock{ + Block: *block, + }) + require.NoError(t, err) + + return nil + }) + require.NoError(t, err) + + txOuts := coin.CreateUnspents(block.Head, txn) + + err = db.View("", func(tx *dbutil.Tx) error { + // check that the inputs should already been deleted from unspent pool + for _, in := range tc.inputs { + v, err := up.Get(tx, in.Hash()) + require.NoError(t, err) + require.Nil(t, v) + } + + // check the new generate unspent + hasKey, err := up.Contains(tx, txOuts[0].Hash()) + require.NoError(t, err) + require.True(t, hasKey) + + // check uxHash + for _, in := range tc.inputs { + oldUxHash = oldUxHash.Xor(in.SnapshotHash()) + } + + uxHash := oldUxHash.Xor(txOuts[0].SnapshotHash()) + for _, o := range txOuts[1:] { + uxHash = uxHash.Xor(o.SnapshotHash()) + } + + newUxHash, err := up.GetUxHash(tx) + require.NoError(t, err) + require.Equal(t, uxHash.Hex(), newUxHash.Hex()) + + // addr index height should equal the number of blocks added + addrIndexHeight, ok, err := up.meta.getAddrIndexHeight(tx) + require.NoError(t, err) + require.True(t, ok) + require.Equal(t, uint64(1), addrIndexHeight) + + // addr index should have 5 rows (5 initial addrs, 1 removed as input, 1 added as output) + addrIndexLength, err := dbutil.Len(tx, UnspentPoolAddrIndexBkt) + require.NoError(t, err) + require.Equal(t, tc.nIndexedAddrs, addrIndexLength) + + // new outputs should be added to addr index cache + expectedAddrHashes := make(map[cipher.Address][]cipher.SHA256) + for _, o := range txOuts { + expectedAddrHashes[o.Body.Address] = append(expectedAddrHashes[o.Body.Address], o.Hash()) + } + + for addr, hashes := range expectedAddrHashes { + addrUxHashes, err := up.poolAddrIndex.get(tx, addr) + require.NoError(t, err) + + require.Equal(t, len(hashes), len(addrUxHashes)) + + sort.Slice(hashes, func(i, j int) bool { + return bytes.Compare(hashes[i][:], hashes[j][:]) < 1 + }) + + sort.Slice(addrUxHashes, func(i, j int) bool { + return bytes.Compare(addrUxHashes[i][:], addrUxHashes[j][:]) < 1 + }) + + require.Equal(t, hashes, addrUxHashes) + } + + // used up inputs should be removed from addr index cache + for _, o := range tc.inputs { + // input addresses that appear in outputs should not be removed + if _, ok := expectedAddrHashes[o.Body.Address]; ok { + continue + } + + addrUxHashes, err := up.poolAddrIndex.get(tx, o.Body.Address) + require.NoError(t, err) + require.Nil(t, addrUxHashes) + } + + // none of the rows in the addr index should have empty arrays of hashes + err = dbutil.ForEach(tx, UnspentPoolAddrIndexBkt, func(k, v []byte) error { + _, err := cipher.AddressFromBytes(k) + require.NoError(t, err) + + var uxHashes []cipher.SHA256 + err = encoder.DeserializeRawExact(v, &uxHashes) + require.NoError(t, err) + require.NotEmpty(t, uxHashes) + + return nil + }) + require.NoError(t, err) + + return nil + }) + require.NoError(t, err) + }) + } +} + +func TestUnspentPoolAddrIndex(t *testing.T) { + addrs := make([]cipher.Address, 10) + for i := range addrs { + addrs[i] = testutil.MakeAddress() + } + + hashes := make([]cipher.SHA256, 30) + hashesMap := make(map[cipher.SHA256]struct{}) + for i := range hashes { + hashes[i] = testutil.RandSHA256(t) + _, ok := hashesMap[hashes[i]] + require.False(t, ok) + hashesMap[hashes[i]] = struct{}{} + } + + type addrHashMap map[cipher.Address][]cipher.SHA256 + + copyHashMap := func(hm addrHashMap) addrHashMap { + out := make(addrHashMap, len(hm)) + + for addr, hashes := range hm { + copiedHashes := make([]cipher.SHA256, len(hashes)) + copy(copiedHashes[:], hashes[:]) + out[addr] = copiedHashes + } + + return out + } + + dup := func(h []cipher.SHA256) []cipher.SHA256 { + i := make([]cipher.SHA256, len(h)) + copy(i[:], h[:]) + return i + } + + cases := []struct { + name string + init addrHashMap + add addrHashMap + remove addrHashMap + expect addrHashMap + putErr error + adjustErr error + }{ + { + name: "no initial, add only", + add: addrHashMap{ + addrs[0]: dup(hashes[0:3]), + addrs[1]: dup(hashes[3:6]), + }, + expect: addrHashMap{ + addrs[0]: dup(hashes[0:3]), + addrs[1]: dup(hashes[3:6]), + }, + }, + + { + name: "initial, add and remove", + init: addrHashMap{ + addrs[0]: dup(hashes[0:3]), // add one to here + addrs[1]: dup(hashes[3:6]), // remove one from here + addrs[2]: dup(hashes[6:9]), // add and remove one from here + addrs[3]: dup(hashes[9:12]), // remove all from here + addrs[4]: dup(hashes[12:15]), // remove all from here and add one + }, + add: addrHashMap{ + addrs[0]: dup(hashes[16:17]), + addrs[2]: dup(hashes[17:18]), + addrs[4]: dup(hashes[18:19]), + }, + remove: addrHashMap{ + addrs[1]: dup(hashes[4:5]), + addrs[2]: dup(hashes[6:7]), + addrs[3]: dup(hashes[9:12]), + addrs[4]: dup(hashes[12:15]), + }, + expect: addrHashMap{ + addrs[0]: append(dup(hashes[0:3]), dup(hashes[16:17])...), + addrs[1]: append(dup(hashes[3:4]), dup(hashes[5:6])...), + addrs[2]: append(dup(hashes[7:9]), dup(hashes[17:18])...), + addrs[4]: dup(hashes[18:19]), + }, + }, + + { + name: "put error duplicate", + init: addrHashMap{ + addrs[0]: []cipher.SHA256{hashes[0], hashes[0]}, + }, + putErr: errors.New("poolAddrIndex.put: hashes array contains duplicate"), + }, + + { + name: "put error empty array", + init: addrHashMap{ + addrs[0]: []cipher.SHA256{}, + }, + putErr: errors.New("poolAddrIndex.put cannot put empty hash array"), + }, + + { + name: "adjust error removes have duplicates", + init: addrHashMap{ + addrs[0]: dup(hashes[0:1]), + }, + remove: addrHashMap{ + addrs[0]: []cipher.SHA256{hashes[0], hashes[0]}, + }, + adjustErr: errors.New("poolAddrIndex.adjust: rmHashes contains duplicates"), + }, + + { + name: "adjust error removing more than exists", + init: addrHashMap{ + addrs[0]: dup(hashes[0:1]), + }, + remove: addrHashMap{ + addrs[0]: dup(hashes[0:2]), + }, + adjustErr: errors.New("poolAddrIndex.adjust: rmHashes is longer than existingHashes"), + }, + + { + name: "adjust error removing hash that does not exist", + init: addrHashMap{ + addrs[0]: dup(hashes[0:2]), + }, + remove: addrHashMap{ + addrs[0]: []cipher.SHA256{hashes[0], hashes[11]}, + }, + adjustErr: fmt.Errorf("poolAddrIndex.adjust: rmHashes contains 1 hashes not indexed for address %s", addrs[0].String()), + }, + + { + name: "adjust error hash in both add and remove", + init: addrHashMap{ + addrs[0]: dup(hashes[0:10]), + }, + add: addrHashMap{ + addrs[0]: dup(hashes[4:5]), + }, + remove: addrHashMap{ + addrs[0]: dup(hashes[1:5]), + }, + adjustErr: errors.New("poolAddrIndex.adjust: hash appears in both addHashes and rmHashes"), + }, + + { + name: "adjust error adding hash already indexed", + init: addrHashMap{ + addrs[0]: dup(hashes[0:10]), + }, + add: addrHashMap{ + addrs[0]: dup(hashes[4:5]), + }, + adjustErr: fmt.Errorf("poolAddrIndex.adjust: uxout hash %s is already indexed for address %s", hashes[4].Hex(), addrs[0].String()), + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + db, shutdown := prepareDB(t) + defer shutdown() + + tc.init = copyHashMap(tc.init) + tc.add = copyHashMap(tc.add) + tc.remove = copyHashMap(tc.remove) + tc.expect = copyHashMap(tc.expect) + + p := &poolAddrIndex{} + m := &unspentMeta{} + + // Initialize the data, test that put() works + err := db.Update("", func(tx *dbutil.Tx) error { + for addr, hashes := range tc.init { + if err := p.put(tx, addr, hashes); err != nil { + return err + } + } + + return m.setAddrIndexHeight(tx, uint64(len(tc.init))) + }) + + if tc.putErr == nil { + require.NoError(t, err) + } else { + require.Equal(t, tc.putErr, err) + return + } + + // Check the initialized data, test that get() works + err = db.View("", func(tx *dbutil.Tx) error { + length, err := dbutil.Len(tx, UnspentPoolAddrIndexBkt) + require.NoError(t, err) + require.Equal(t, uint64(len(tc.init)), length) + + height, ok, err := m.getAddrIndexHeight(tx) + require.NoError(t, err) + require.True(t, ok) + require.Equal(t, length, height) + + for addr, expectHashes := range tc.init { + hashes, err := p.get(tx, addr) + require.NoError(t, err) + require.Equal(t, expectHashes, hashes) + } + return nil + }) + require.NoError(t, err) + + // Adjust the data, test that adjust() works + err = db.Update("", func(tx *dbutil.Tx) error { + for addr, addHashes := range tc.add { + rmHashes := tc.remove[addr] + delete(tc.remove, addr) + + err := p.adjust(tx, addr, addHashes, rmHashes) + if err != nil { + return err + } + } + + for addr, rmHashes := range tc.remove { + err := p.adjust(tx, addr, nil, rmHashes) + if err != nil { + return err + } + } + + return nil + }) + + if tc.adjustErr == nil { + require.NoError(t, err) + } else { + require.Equal(t, tc.adjustErr, err) + return + } + + addrHashes := make(addrHashMap) + err = db.View("", func(tx *dbutil.Tx) error { + return dbutil.ForEach(tx, UnspentPoolAddrIndexBkt, func(k, v []byte) error { + addr, err := cipher.AddressFromBytes(k) + require.NoError(t, err) + + var hashes []cipher.SHA256 + err = encoder.DeserializeRawExact(v, &hashes) + require.NoError(t, err) + + sort.Slice(hashes, func(i, j int) bool { + return bytes.Compare(hashes[i][:], hashes[j][:]) < 1 + }) + + addrHashes[addr] = hashes + + return nil + }) + }) + require.NoError(t, err) + + for addr, hashes := range tc.expect { + sort.Slice(hashes, func(i, j int) bool { + return bytes.Compare(hashes[i][:], hashes[j][:]) < 1 + }) + + tc.expect[addr] = hashes + } + + require.Equal(t, len(tc.expect), len(addrHashes)) + require.Equal(t, tc.expect, addrHashes) + }) + } +} + +func TestUnspentMaybeBuildIndexesNoIndexNoHead(t *testing.T) { + // Test with a database that has no unspent addr index + testUnspentMaybeBuildIndexes(t, 0, nil) +} + +func TestUnspentMaybeBuildIndexesNoIndexHaveHead(t *testing.T) { + // Test with a database that has no unspent addr index + testUnspentMaybeBuildIndexes(t, 10, nil) +} + +func TestUnspentMaybeBuildIndexesPartialIndex(t *testing.T) { + // Test with a database that has an unspent addr index but the height is wrong + headHeight := uint64(3) + testUnspentMaybeBuildIndexes(t, headHeight+1, func(db *dbutil.DB) { + up := NewUnspentPool() + + // Index the first few blocks + err := db.Update("", func(tx *dbutil.Tx) error { + if err := dbutil.CreateBuckets(tx, [][]byte{UnspentPoolAddrIndexBkt}); err != nil { + return err + } + + addrHashes := make(map[cipher.Address][]cipher.SHA256) + + if err := dbutil.ForEach(tx, UnspentPoolBkt, func(_, v []byte) error { + var ux coin.UxOut + if err := encoder.DeserializeRawExact(v, &ux); err != nil { + return err + } + + if ux.Head.BkSeq > headHeight { + return nil + } + + h := ux.Hash() + addrHashes[ux.Body.Address] = append(addrHashes[ux.Body.Address], h) + + return nil + }); err != nil { + return err + } + + for addr, hashes := range addrHashes { + if err := up.poolAddrIndex.put(tx, addr, hashes); err != nil { + return err + } + } + + return up.meta.setAddrIndexHeight(tx, headHeight) + }) + require.NoError(t, err) + }) +} + +func testUnspentMaybeBuildIndexes(t *testing.T, headIndex uint64, setupDB func(*dbutil.DB)) { + db, shutdown := setupNoUnspentAddrIndexDB(t) + defer shutdown() + + if setupDB != nil { + setupDB(db) + } + + u := NewUnspentPool() + + // Create the indexes + err := db.Update("", func(tx *dbutil.Tx) error { + if _, err := tx.CreateBucketIfNotExists(UnspentPoolAddrIndexBkt); err != nil { + return err + } + + return u.MaybeBuildIndexes(tx, headIndex) + }) + require.NoError(t, err) + + // Check the address->hashes index + addrHashes := make(map[cipher.Address][]cipher.SHA256) + err = db.View("", func(tx *dbutil.Tx) error { + // Perform the unspent lookup the slow way, to confirm it matches the hashed data + err := dbutil.ForEach(tx, UnspentPoolBkt, func(k, v []byte) error { + hash, err := cipher.SHA256FromBytes(k) + require.NoError(t, err) + + var ux coin.UxOut + err = encoder.DeserializeRawExact(v, &ux) + require.NoError(t, err) + + require.Equal(t, hash, ux.Hash()) + + addrHashes[ux.Body.Address] = append(addrHashes[ux.Body.Address], hash) + + return nil + }) + require.NoError(t, err) + + length, err := dbutil.Len(tx, UnspentPoolAddrIndexBkt) + require.NoError(t, err) + + require.Equal(t, uint64(len(addrHashes)), length) + + height, ok, err := u.meta.getAddrIndexHeight(tx) + require.NoError(t, err) + require.True(t, ok) + require.Equal(t, uint64(180), height) + + err = dbutil.ForEach(tx, UnspentPoolAddrIndexBkt, func(k, v []byte) error { + addr, err := cipher.AddressFromBytes(k) + require.NoError(t, err) + + var hashes []cipher.SHA256 + err = encoder.DeserializeRawExact(v, &hashes) + require.NoError(t, err) + + expectedHashes, ok := addrHashes[addr] + require.True(t, ok) + + sort.Slice(expectedHashes, func(i, j int) bool { + return bytes.Compare(expectedHashes[i][:], expectedHashes[j][:]) < 1 + }) + + sort.Slice(hashes, func(i, j int) bool { + return bytes.Compare(hashes[i][:], hashes[j][:]) < 1 + }) + + require.Equal(t, expectedHashes, hashes) + + delete(addrHashes, addr) + + return nil + }) + require.NoError(t, err) + + require.Empty(t, addrHashes) + + return nil + }) + require.NoError(t, err) +} + +func TestUnspentMaybeBuildIndexesNoRebuild(t *testing.T) { + // Set addrIndexHeight to head block height, but don't populate the addr index + // Check that the addr index was not populated, so we know that the index did not get rebuilt if the height matches + db, shutdown := setupNoUnspentAddrIndexDB(t) + defer shutdown() + + u := NewUnspentPool() + + // Create the bucket and artificially set the indexed height, without indexing + headSeq := uint64(180) + err := db.Update("", func(tx *dbutil.Tx) error { + if _, err := tx.CreateBucketIfNotExists(UnspentPoolAddrIndexBkt); err != nil { + return err + } + + return u.meta.setAddrIndexHeight(tx, headSeq) + }) + require.NoError(t, err) + + // Attempt to build index based upon the headSeq that we set + err = db.Update("", func(tx *dbutil.Tx) error { + return u.MaybeBuildIndexes(tx, headSeq) + }) + require.NoError(t, err) + + // Check that the addr index is still empty, because the height was the same + err = db.View("", func(tx *dbutil.Tx) error { + height, ok, err := u.meta.getAddrIndexHeight(tx) + require.NoError(t, err) + require.True(t, ok) + require.Equal(t, headSeq, height) + + length, err := dbutil.Len(tx, UnspentPoolAddrIndexBkt) + require.NoError(t, err) + require.Equal(t, uint64(0), length) + return nil + }) + require.NoError(t, err) +} + +func setupNoUnspentAddrIndexDB(t *testing.T) (*dbutil.DB, func()) { + // Open a test database file that lacks UnspentPoolAddrIndexBkt, + // copy it to a temp file and open a database around the temp file + dbFilename := "./testdata/blockchain-180.no-unspent-addr-index.db" + dbFile, err := os.Open(dbFilename) + require.NoError(t, err) + + tmpFile, err := ioutil.TempFile("", "testdb") + require.NoError(t, err) + + _, err = io.Copy(tmpFile, dbFile) + require.NoError(t, err) + + err = dbFile.Close() + require.NoError(t, err) + + err = tmpFile.Sync() + require.NoError(t, err) + + boltDB, err := bolt.Open(tmpFile.Name(), 0700, nil) + require.NoError(t, err) + + db := dbutil.WrapDB(boltDB) + + return db, func() { + db.Close() + tmpFile.Close() + os.Remove(tmpFile.Name()) + } +} + +func TestAddressHashesFlatten(t *testing.T) { + addrHashes := make(AddressHashes) + + require.Empty(t, addrHashes.Flatten()) + + hashes := make([]cipher.SHA256, 10) + for i := range hashes { + hashes[i] = testutil.RandSHA256(t) + } + + addrHashes = AddressHashes{ + testutil.MakeAddress(): hashes[0:2], + } + require.Equal(t, hashes[0:2], addrHashes.Flatten()) + + addr1 := testutil.MakeAddress() + addr2 := testutil.MakeAddress() + addrHashes = AddressHashes{ + addr1: hashes[0:2], + addr2: hashes[4:6], + } + + expectedHashes := append(addrHashes[addr1], addrHashes[addr2]...) + flattenedHashes := addrHashes.Flatten() + + sort.Slice(expectedHashes, func(a, b int) bool { + return bytes.Compare(expectedHashes[a][:], expectedHashes[b][:]) < 0 + }) + sort.Slice(flattenedHashes, func(a, b int) bool { + return bytes.Compare(flattenedHashes[a][:], flattenedHashes[b][:]) < 0 + }) + + require.Equal(t, len(expectedHashes), len(flattenedHashes)) + require.Equal(t, expectedHashes, flattenedHashes) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/ux_out_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/ux_out_skyencoder.go new file mode 100644 index 00000000..c18ddd69 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/ux_out_skyencoder.go @@ -0,0 +1,171 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package blockdb + +import ( + "github.com/SkycoinProject/skycoin/src/cipher/encoder" + "github.com/SkycoinProject/skycoin/src/coin" +) + +// encodeSizeUxOut computes the size of an encoded object of type UxOut +func encodeSizeUxOut(obj *coin.UxOut) uint64 { + i0 := uint64(0) + + // obj.Head.Time + i0 += 8 + + // obj.Head.BkSeq + i0 += 8 + + // obj.Body.SrcTransaction + i0 += 32 + + // obj.Body.Address.Version + i0++ + + // obj.Body.Address.Key + i0 += 20 + + // obj.Body.Coins + i0 += 8 + + // obj.Body.Hours + i0 += 8 + + return i0 +} + +// encodeUxOut encodes an object of type UxOut to a buffer allocated to the exact size +// required to encode the object. +func encodeUxOut(obj *coin.UxOut) ([]byte, error) { + n := encodeSizeUxOut(obj) + buf := make([]byte, n) + + if err := encodeUxOutToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeUxOutToBuffer encodes an object of type UxOut to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeUxOutToBuffer(buf []byte, obj *coin.UxOut) error { + if uint64(len(buf)) < encodeSizeUxOut(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Head.Time + e.Uint64(obj.Head.Time) + + // obj.Head.BkSeq + e.Uint64(obj.Head.BkSeq) + + // obj.Body.SrcTransaction + e.CopyBytes(obj.Body.SrcTransaction[:]) + + // obj.Body.Address.Version + e.Uint8(obj.Body.Address.Version) + + // obj.Body.Address.Key + e.CopyBytes(obj.Body.Address.Key[:]) + + // obj.Body.Coins + e.Uint64(obj.Body.Coins) + + // obj.Body.Hours + e.Uint64(obj.Body.Hours) + + return nil +} + +// decodeUxOut decodes an object of type UxOut from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeUxOut(buf []byte, obj *coin.UxOut) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Head.Time + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Head.Time = i + } + + { + // obj.Head.BkSeq + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Head.BkSeq = i + } + + { + // obj.Body.SrcTransaction + if len(d.Buffer) < len(obj.Body.SrcTransaction) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Body.SrcTransaction[:], d.Buffer[:len(obj.Body.SrcTransaction)]) + d.Buffer = d.Buffer[len(obj.Body.SrcTransaction):] + } + + { + // obj.Body.Address.Version + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Body.Address.Version = i + } + + { + // obj.Body.Address.Key + if len(d.Buffer) < len(obj.Body.Address.Key) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Body.Address.Key[:], d.Buffer[:len(obj.Body.Address.Key)]) + d.Buffer = d.Buffer[len(obj.Body.Address.Key):] + } + + { + // obj.Body.Coins + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Body.Coins = i + } + + { + // obj.Body.Hours + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Body.Hours = i + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeUxOutExact decodes an object of type UxOut from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeUxOutExact(buf []byte, obj *coin.UxOut) error { + if n, err := decodeUxOut(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/ux_out_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/ux_out_skyencoder_test.go new file mode 100644 index 00000000..f62565bd --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/ux_out_skyencoder_test.go @@ -0,0 +1,422 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package blockdb + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" + "github.com/SkycoinProject/skycoin/src/coin" +) + +func newEmptyUxOutForEncodeTest() *coin.UxOut { + var obj coin.UxOut + return &obj +} + +func newRandomUxOutForEncodeTest(t *testing.T, rand *mathrand.Rand) *coin.UxOut { + var obj coin.UxOut + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenUxOutForEncodeTest(t *testing.T, rand *mathrand.Rand) *coin.UxOut { + var obj coin.UxOut + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilUxOutForEncodeTest(t *testing.T, rand *mathrand.Rand) *coin.UxOut { + var obj coin.UxOut + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderUxOut(t *testing.T, obj *coin.UxOut) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeUxOut(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeUxOut() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeUxOut(obj) + if err != nil { + t.Fatalf("encodeUxOut failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeUxOut produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeUxOut()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeUxOutToBuffer(data3, obj); err != nil { + t.Fatalf("encodeUxOutToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 coin.UxOut + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 coin.UxOut + if n, err := decodeUxOut(data2, &obj3); err != nil { + t.Fatalf("decodeUxOut failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeUxOut bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeUxOut()") + } + + // Decode, excess buffer + var obj4 coin.UxOut + n, err := decodeUxOut(data3, &obj4) + if err != nil { + t.Fatalf("decodeUxOut failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeUxOut bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeUxOut bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeUxOut()") + } + + // DecodeExact + var obj5 coin.UxOut + if err := decodeUxOutExact(data2, &obj5); err != nil { + t.Fatalf("decodeUxOut failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeUxOut()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeUxOut(data4, &obj3); err != nil { + t.Fatalf("decodeUxOut failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeUxOut bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderUxOut(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *coin.UxOut + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptyUxOutForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomUxOutForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenUxOutForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilUxOutForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderUxOut(t, tc.obj) + }) + } +} + +func decodeUxOutExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj coin.UxOut + if _, err := decodeUxOut(buf, &obj); err == nil { + t.Fatal("decodeUxOut: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeUxOut: expected error %q, got %q", expectedErr, err) + } +} + +func decodeUxOutExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj coin.UxOut + if err := decodeUxOutExact(buf, &obj); err == nil { + t.Fatal("decodeUxOutExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeUxOutExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderUxOutDecodeErrors(t *testing.T, k int, tag string, obj *coin.UxOut) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeUxOut(obj) + buf, err := encodeUxOut(obj) + if err != nil { + t.Fatalf("encodeUxOut failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeUxOutExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeUxOutExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeUxOutExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeUxOutExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeUxOutExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderUxOutDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptyUxOutForEncodeTest() + fullObj := newRandomUxOutForEncodeTest(t, rand) + testSkyencoderUxOutDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderUxOutDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/verify.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/verify.go new file mode 100644 index 00000000..e130420a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/blockdb/verify.go @@ -0,0 +1,156 @@ +package blockdb + +import ( + "errors" + "reflect" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +var ( + // ErrVerifyStopped is returned when database verification is interrupted + ErrVerifyStopped = errors.New("database verification stopped") +) + +// VerifyDBSkyencoderSafe verifies that the skyencoder generated code has the same result as the encoder +// for all data in the blockchain +func VerifyDBSkyencoderSafe(tx *dbutil.Tx, quit <-chan struct{}) error { + if quit == nil { + quit = make(chan struct{}) + } + + if err := dbutil.ForEach(tx, BlockSigsBkt, func(_, v []byte) error { + select { + case <-quit: + return ErrVerifyStopped + default: + } + + var sig1 sigWrapper + if err := decodeSigWrapperExact(v, &sig1); err != nil { + return err + } + + var sig2 cipher.Sig + if err := encoder.DeserializeRawExact(v, &sig2); err != nil { + return err + } + + if sig1.Sig != sig2 { + return errors.New("BlockSigsBkt sig decode mismatch") + } + + return nil + }); err != nil { + return err + } + + if err := dbutil.ForEach(tx, BlocksBkt, func(_, v []byte) error { + select { + case <-quit: + return ErrVerifyStopped + default: + } + + var b1 coin.Block + if err := decodeBlockExact(v, &b1); err != nil { + return err + } + + var b2 coin.Block + if err := encoder.DeserializeRawExact(v, &b2); err != nil { + return err + } + + if !reflect.DeepEqual(b1, b2) { + return errors.New("BlocksBkt block mismatch") + } + + return nil + }); err != nil { + return err + } + + if err := dbutil.ForEach(tx, TreeBkt, func(_, v []byte) error { + select { + case <-quit: + return ErrVerifyStopped + default: + } + + var b1 hashPairsWrapper + if err := decodeHashPairsWrapperExact(v, &b1); err != nil { + return err + } + + var b2 []coin.HashPair + if err := encoder.DeserializeRawExact(v, &b2); err != nil { + return err + } + + if !reflect.DeepEqual(b1.HashPairs, b2) { + return errors.New("TreeBkt hash pairs mismatch") + } + + return nil + }); err != nil { + return err + } + + if err := dbutil.ForEach(tx, UnspentPoolBkt, func(_, v []byte) error { + select { + case <-quit: + return ErrVerifyStopped + default: + } + + var b1 coin.UxOut + if err := decodeUxOutExact(v, &b1); err != nil { + return err + } + + var b2 coin.UxOut + if err := encoder.DeserializeRawExact(v, &b2); err != nil { + return err + } + + if !reflect.DeepEqual(b1, b2) { + return errors.New("UnspentPoolBkt ux out mismatch") + } + + return nil + }); err != nil { + return err + } + + if err := dbutil.ForEach(tx, UnspentPoolAddrIndexBkt, func(_, v []byte) error { + select { + case <-quit: + return ErrVerifyStopped + default: + } + + var b1 hashesWrapper + if err := decodeHashesWrapperExact(v, &b1); err != nil { + return err + } + + var b2 []cipher.SHA256 + if err := encoder.DeserializeRawExact(v, &b2); err != nil { + return err + } + + if !reflect.DeepEqual(b1.Hashes, b2) { + return errors.New("UnspentPoolAddrIndexBkt sha256 hashes mismatch") + } + + return nil + }); err != nil { + return err + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/config.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/config.go new file mode 100644 index 00000000..f74a85a0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/config.go @@ -0,0 +1,119 @@ +package visor + +import ( + "errors" + "fmt" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/params" +) + +// Config configuration parameters for the Visor +type Config struct { + // Is this a block publishing node + IsBlockPublisher bool + + // Public key of the blockchain + BlockchainPubkey cipher.PubKey + + // Secret key of the blockchain (required if block publisher) + BlockchainSeckey cipher.SecKey + + // Transaction verification parameters used for unconfirmed transactions + UnconfirmedVerifyTxn params.VerifyTxn + // Transaction verification parameters used when creating a block + CreateBlockVerifyTxn params.VerifyTxn + // Maximum size of a block, in bytes for creating blocks + MaxBlockTransactionsSize uint32 + + // Coin distribution parameters (necessary for txn verification) + Distribution params.Distribution + + // Where the blockchain is saved + BlockchainFile string + // Where the block signatures are saved + BlockSigsFile string + + //address for genesis + GenesisAddress cipher.Address + // Genesis block sig + GenesisSignature cipher.Sig + // Genesis block timestamp + GenesisTimestamp uint64 + // Number of coins in genesis block + GenesisCoinVolume uint64 + // enable arbitrating mode + Arbitrating bool +} + +// NewConfig creates Config +func NewConfig() Config { + c := Config{ + IsBlockPublisher: false, + + BlockchainPubkey: cipher.PubKey{}, + BlockchainSeckey: cipher.SecKey{}, + + UnconfirmedVerifyTxn: params.UserVerifyTxn, + CreateBlockVerifyTxn: params.UserVerifyTxn, + MaxBlockTransactionsSize: params.UserVerifyTxn.MaxTransactionSize, + + GenesisAddress: cipher.Address{}, + GenesisSignature: cipher.Sig{}, + GenesisTimestamp: 0, + GenesisCoinVolume: 0, //100e12, 100e6 * 10e6 + } + + return c +} + +// Verify verifies the configuration +func (c Config) Verify() error { + if c.IsBlockPublisher { + if c.BlockchainPubkey != cipher.MustPubKeyFromSecKey(c.BlockchainSeckey) { + return errors.New("Cannot run as block publisher: invalid seckey for pubkey") + } + } + + if err := c.UnconfirmedVerifyTxn.Validate(); err != nil { + return err + } + + if err := c.CreateBlockVerifyTxn.Validate(); err != nil { + return err + } + + if c.UnconfirmedVerifyTxn.BurnFactor < params.UserVerifyTxn.BurnFactor { + return fmt.Errorf("UnconfirmedVerifyTxn.BurnFactor must be >= params.UserVerifyTxn.BurnFactor (%d)", params.UserVerifyTxn.BurnFactor) + } + + if c.CreateBlockVerifyTxn.BurnFactor < params.UserVerifyTxn.BurnFactor { + return fmt.Errorf("CreateBlockVerifyTxn.BurnFactor must be >= params.UserVerifyTxn.BurnFactor (%d)", params.UserVerifyTxn.BurnFactor) + } + + if c.UnconfirmedVerifyTxn.MaxTransactionSize < params.UserVerifyTxn.MaxTransactionSize { + return fmt.Errorf("UnconfirmedVerifyTxn.MaxTransactionSize must be >= params.UserVerifyTxn.MaxTransactionSize (%d)", params.UserVerifyTxn.MaxTransactionSize) + } + + if c.CreateBlockVerifyTxn.MaxTransactionSize < params.UserVerifyTxn.MaxTransactionSize { + return fmt.Errorf("CreateBlockVerifyTxn.MaxTransactionSize must be >= params.UserVerifyTxn.MaxTransactionSize (%d)", params.UserVerifyTxn.MaxTransactionSize) + } + + if c.UnconfirmedVerifyTxn.MaxDropletPrecision < params.UserVerifyTxn.MaxDropletPrecision { + return fmt.Errorf("UnconfirmedVerifyTxn.MaxDropletPrecision must be >= params.UserVerifyTxn.MaxDropletPrecision (%d)", params.UserVerifyTxn.MaxDropletPrecision) + } + + if c.CreateBlockVerifyTxn.MaxDropletPrecision < params.UserVerifyTxn.MaxDropletPrecision { + return fmt.Errorf("CreateBlockVerifyTxn.MaxDropletPrecision must be >= params.UserVerifyTxn.MaxDropletPrecision (%d)", params.UserVerifyTxn.MaxDropletPrecision) + } + + if c.MaxBlockTransactionsSize < c.CreateBlockVerifyTxn.MaxTransactionSize { + return errors.New("MaxBlockTransactionsSize must be >= CreateBlockVerifyTxn.MaxTransactionSize") + } + + if err := c.Distribution.Validate(); err != nil { + return err + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/daemon_visor_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/daemon_visor_test.go new file mode 100644 index 00000000..aee9b07a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/daemon_visor_test.go @@ -0,0 +1,167 @@ +package visor + +/* +These are tests that used to be in daemon/visor_test.go, +but belong in package visor instead. + +They have been moved here without checking if they duplicate any +existing test in visor_test.go. + +It is assumed that these tests may provide coverage not present in visor_test.go + +They could be merged into visor_test.go, but for simplicity they were only moved here +*/ + +import ( + "errors" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/util/fee" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +func setupSimpleVisor(t *testing.T, db *dbutil.DB, bc *Blockchain) *Visor { + cfg := NewConfig() + + pool, err := NewUnconfirmedTransactionPool(db) + require.NoError(t, err) + + return &Visor{ + Config: cfg, + unconfirmed: pool, + blockchain: bc, + db: db, + } +} + +func TestVerifyTransactionInvalidFee(t *testing.T) { + // Test that a soft constraint is enforced + // Full verification tests are in visor/blockchain_verify_test.go + db, close := prepareDB(t) + defer close() + + // Setup blockchain + _, s := cipher.GenerateKeyPair() + bc := MakeBlockchain(t, db, s) + + // Send coins to the initial address, with invalid fee + var coins = GenesisCoins + var hours = GenesisCoinHours * 1e3 + var f uint64 + addr := testutil.MakeAddress() + + txn := CreateGenesisSpendTransaction(t, db, bc, addr, coins, hours, f) + + // Setup a minimal visor + v := setupSimpleVisor(t, db, bc) + + _, softErr, err := v.InjectForeignTransaction(txn) + require.NoError(t, err) + require.NotNil(t, softErr) + require.Equal(t, NewErrTxnViolatesSoftConstraint(fee.ErrTxnNoFee), *softErr) +} + +func TestVerifyTransactionInvalidSignature(t *testing.T) { + // Test that a hard constraint is enforced + // Full verification tests are in visor/blockchain_verify_test.go + db, close := prepareDB(t) + defer close() + + // Setup blockchain + _, s := cipher.GenerateKeyPair() + bc := MakeBlockchain(t, db, s) + + // Send coins to the initial address, with invalid fee + var coins = GenesisCoins + var hours uint64 + var fee uint64 + addr := testutil.MakeAddress() + + txn := CreateGenesisSpendTransaction(t, db, bc, addr, coins, hours, fee) + + // Invalidate signatures + txn.Sigs = nil + + // Setup a minimal visor + v := setupSimpleVisor(t, db, bc) + + _, softErr, err := v.InjectForeignTransaction(txn) + require.Nil(t, softErr) + testutil.RequireError(t, err, NewErrTxnViolatesHardConstraint(errors.New("Invalid number of signatures")).Error()) +} + +func TestInjectValidTransaction(t *testing.T) { + db, close := prepareDB(t) + defer close() + + _, s := cipher.GenerateKeyPair() + // Setup blockchain + bc := MakeBlockchain(t, db, s) + + // Send coins to the initial address, with invalid fee + var coins = GenesisCoins + var hours uint64 + var fee uint64 + addr := testutil.MakeAddress() + + txn := CreateGenesisSpendTransaction(t, db, bc, addr, coins, hours, fee) + + // Setup a minimal visor + v := setupSimpleVisor(t, db, bc) + + // The unconfirmed pool should be empty + txns, err := v.GetAllUnconfirmedTransactions() + require.NoError(t, err) + require.Len(t, txns, 0) + + // Call injectTransaction + _, softErr, err := v.InjectForeignTransaction(txn) + require.Nil(t, softErr) + require.NoError(t, err) + + // The transaction should appear in the unconfirmed pool + txns, err = v.GetAllUnconfirmedTransactions() + require.NoError(t, err) + require.Len(t, txns, 1) + require.Equal(t, txns[0].Transaction, txn) +} + +func TestInjectTransactionSoftViolationNoFee(t *testing.T) { + db, close := prepareDB(t) + defer close() + + // Setup blockchain + _, s := cipher.GenerateKeyPair() + bc := MakeBlockchain(t, db, s) + + // Send coins to the initial address, with invalid fee + var coins = GenesisCoins + var hours = GenesisCoinHours * 1e3 + var f uint64 + addr := testutil.MakeAddress() + + txn := CreateGenesisSpendTransaction(t, db, bc, addr, coins, hours, f) + + // Setup a minimal visor + v := setupSimpleVisor(t, db, bc) + + // The unconfirmed pool should be empty + txns, err := v.GetAllUnconfirmedTransactions() + require.NoError(t, err) + require.Len(t, txns, 0) + + // Call injectTransaction + _, softErr, err := v.InjectForeignTransaction(txn) + require.NoError(t, err) + require.NotNil(t, softErr) + require.Equal(t, NewErrTxnViolatesSoftConstraint(fee.ErrTxnNoFee), *softErr) + + // The transaction should appear in the unconfirmed pool + txns, err = v.GetAllUnconfirmedTransactions() + require.NoError(t, err) + require.Len(t, txns, 1) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/db.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/db.go new file mode 100644 index 00000000..c4a9c513 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/db.go @@ -0,0 +1,401 @@ +package visor + +import ( + "crypto/sha256" + "encoding/base64" + "errors" + "fmt" + "io" + "os" + "path/filepath" + "reflect" + "sync" + "time" + + "github.com/boltdb/bolt" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/util/elapse" + "github.com/SkycoinProject/skycoin/src/visor/blockdb" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" + "github.com/SkycoinProject/skycoin/src/visor/historydb" +) + +var ( + // BlockchainVerifyTheadNum number of goroutines to use for signature and historydb verification + BlockchainVerifyTheadNum = 4 +) + +// ErrCorruptDB is returned if the database is corrupted +// The original corruption error is embedded +type ErrCorruptDB struct { + error +} + +// CheckDatabase checks the database for corruption, rebuild history if corrupted +func CheckDatabase(db *dbutil.DB, pubkey cipher.PubKey, quit chan struct{}) error { + elapser := elapse.NewElapser(time.Second*30, logger) + elapser.Register("CheckDatabase") + defer elapser.CheckForDone() + + var blocksBktExist bool + if err := db.View("CheckDatabase", func(tx *dbutil.Tx) error { + blocksBktExist = dbutil.Exists(tx, blockdb.BlocksBkt) + return nil + }); err != nil { + return err + } + + // Don't verify the db if the blocks bucket does not exist + if !blocksBktExist { + return nil + } + + bc, err := NewBlockchain(db, BlockchainConfig{Pubkey: pubkey}) + if err != nil { + return err + } + + history := historydb.New() + indexesMap := historydb.NewIndexesMap() + + var historyVerifyErr error + var lock sync.Mutex + verifyFunc := func(tx *dbutil.Tx, b *coin.SignedBlock) error { + // Verify signature + if err := bc.VerifySignature(b); err != nil { + return err + } + + // Verify historydb, we don't return the error of history.Verify here, + // as we have to check all signature, if we return error early here, the + // potential bad signature won't be detected. + lock.Lock() + defer lock.Unlock() + if historyVerifyErr == nil { + historyVerifyErr = history.Verify(tx, b, indexesMap) + } + return nil + } + + err = bc.WalkChain(BlockchainVerifyTheadNum, verifyFunc, quit) + switch err.(type) { + case nil: + lock.Lock() + err = historyVerifyErr + lock.Unlock() + return err + default: + return err + } +} + +// backup the corrypted db first, then rebuild the history DB. +func rebuildHistoryDB(db *dbutil.DB, history *historydb.HistoryDB, bc *Blockchain, quit chan struct{}) (*dbutil.DB, error) { //nolint:unused,megacheck + db, err := backupDB(db) + if err != nil { + return nil, err + } + + if err := db.Update("Rebuild history db", func(tx *dbutil.Tx) error { + if err := history.Erase(tx); err != nil { + return err + } + + headSeq, ok, err := bc.HeadSeq(tx) + if err != nil { + return err + } + + if !ok { + return errors.New("head block does not exist") + } + + for i := uint64(0); i <= headSeq; i++ { + select { + case <-quit: + return nil + default: + b, err := bc.GetSignedBlockBySeq(tx, i) + if err != nil { + return err + } + + if err := history.ParseBlock(tx, b.Block); err != nil { + return err + } + + if i%1000 == 0 { + logger.Critical().Infof("Parse block: %d", i) + } + } + } + return nil + }); err != nil { + return nil, err + } + return db, nil +} + +// backupDB makes a backup copy of the DB +func backupDB(db *dbutil.DB) (*dbutil.DB, error) { //nolint:unused,megacheck + // backup the corrupted database + dbReadOnly := db.IsReadOnly() + + dbPath := db.Path() + + if err := db.Close(); err != nil { + return nil, fmt.Errorf("Failed to close db: %v", err) + } + + corruptDBPath, err := copyCorruptDB(dbPath) + if err != nil { + return nil, fmt.Errorf("Failed to copy corrupted db: %v", err) + } + + logger.Critical().Infof("Copy corrupted db to %s", corruptDBPath) + + // Open the database again + return OpenDB(dbPath, dbReadOnly) +} + +// ResetCorruptDB checks the database for corruption and if one of the following +// error types is found, then the database is deemed to be corrupted: +// - blockdb.ErrMissingSignature, +// - historydb.ErrHistoryDBCorrupted +// - encoder.ErrBufferUnderflow +// - encoder.ErrMaxLenExceeded +// If the database is deemed to be corrupted then it is erased and the db starts over. +// A copy of the corrupted database is saved. +func ResetCorruptDB(db *dbutil.DB, pubkey cipher.PubKey, quit chan struct{}) (*dbutil.DB, error) { + err := CheckDatabase(db, pubkey, quit) + + // Check if an encoder error has been reported. + // These are not types like the errors below so cannot be included in the + // .(type) switch evaluation. + if err == encoder.ErrBufferUnderflow || err == encoder.ErrMaxLenExceeded { + logger.Critical().Errorf("Database is corrupted (encoder error), recreating db: %v", err) + return resetCorruptDB(db) + } + + switch err.(type) { + case nil: + return db, nil + case blockdb.ErrMissingSignature, + historydb.ErrHistoryDBCorrupted: + logger.Critical().Errorf("Database is corrupted, recreating db: %v", err) + return resetCorruptDB(db) + default: + return nil, err + } +} + +func rebuildCorruptDB(db *dbutil.DB, pubkey cipher.PubKey, quit chan struct{}) (*dbutil.DB, error) { //nolint:deadcode,unused,megacheck + history := historydb.New() + bc, err := NewBlockchain(db, BlockchainConfig{Pubkey: pubkey}) + if err != nil { + return nil, err + } + + return rebuildHistoryDB(db, history, bc, quit) +} + +// resetCorruptDB recreates the DB, making a backup copy marked as corrupted +func resetCorruptDB(db *dbutil.DB) (*dbutil.DB, error) { + dbReadOnly := db.IsReadOnly() + dbPath := db.Path() + + if err := db.Close(); err != nil { + return nil, fmt.Errorf("Failed to close db: %v", err) + } + + corruptDBPath, err := moveCorruptDB(dbPath) + if err != nil { + return nil, fmt.Errorf("Failed to copy corrupted db: %v", err) + } + + logger.Critical().Infof("Moved corrupted db to %s", corruptDBPath) + + return OpenDB(dbPath, dbReadOnly) +} + +// OpenDB opens the blockdb +func OpenDB(dbFile string, readOnly bool) (*dbutil.DB, error) { + db, err := bolt.Open(dbFile, 0600, &bolt.Options{ + Timeout: 5000 * time.Millisecond, + ReadOnly: readOnly, + }) + if err != nil { + return nil, fmt.Errorf("Open boltdb failed, %v", err) + } + + return dbutil.WrapDB(db), nil +} + +// moveCorruptDB moves a file to makeCorruptDBPath(dbPath) +func moveCorruptDB(dbPath string) (string, error) { + newDBPath, err := makeCorruptDBPath(dbPath) + if err != nil { + return "", err + } + + if err := os.Rename(dbPath, newDBPath); err != nil { + logger.Errorf("os.Rename(%s, %s) failed: %v", dbPath, newDBPath, err) + return "", err + } + + return newDBPath, nil +} + +// copyCorruptDB copy a file to makeCorruptDBPath(dbPath) +func copyCorruptDB(dbPath string) (string, error) { //nolint:unused,megacheck + newDBPath, err := makeCorruptDBPath(dbPath) + if err != nil { + return "", err + } + + in, err := os.Open(dbPath) + if err != nil { + return "", err + } + defer in.Close() + + out, err := os.Create(newDBPath) + if err != nil { + return "", err + } + defer out.Close() + logger.Critical().Info(out.Name()) + + _, err = io.Copy(in, out) + if err != nil { + return "", err + } + + if err := out.Close(); err != nil { + return "", err + } + + return newDBPath, nil +} + +// makeCorruptDBPath creates a $FILE.corrupt.$HASH string based on dbPath, +// where $HASH is truncated SHA1 of $FILE. +func makeCorruptDBPath(dbPath string) (string, error) { + dbFileHash, err := shaFileID(dbPath) + if err != nil { + return "", err + } + + dbDir, dbFile := filepath.Split(dbPath) + newDBFile := fmt.Sprintf("%s.corrupt.%s", dbFile, dbFileHash) + newDBPath := filepath.Join(dbDir, newDBFile) + + return newDBPath, nil +} + +// shaFileID return the first 8 bytes of the SHA1 hash of the file, +// hex-encoded +func shaFileID(dbPath string) (string, error) { + fi, err := os.Open(dbPath) + if err != nil { + return "", err + } + defer fi.Close() + + h := sha256.New() + if _, err := io.Copy(h, fi); err != nil { + return "", err + } + + sum := h.Sum(nil) + encodedSum := base64.RawURLEncoding.EncodeToString(sum[:8]) + return encodedSum, nil +} + +// VerifyDBSkyencoderSafe verifies that the skyencoder generated code has the same result as the encoder +// for all data in the blockchain +func VerifyDBSkyencoderSafe(db *dbutil.DB, quit <-chan struct{}) error { + return db.View("VerifyDBSkyencoderSafe", func(tx *dbutil.Tx) error { + return verifyDBSkyencoderSafe(tx, quit) + }) +} + +func verifyDBSkyencoderSafe(tx *dbutil.Tx, quit <-chan struct{}) error { + if quit == nil { + quit = make(chan struct{}) + } + + // blockdb + if err := blockdb.VerifyDBSkyencoderSafe(tx, quit); err != nil { + if err == blockdb.ErrVerifyStopped { + return ErrVerifyStopped + } + return err + } + + // historydb + if err := historydb.VerifyDBSkyencoderSafe(tx, quit); err != nil { + if err == historydb.ErrVerifyStopped { + return ErrVerifyStopped + } + return err + } + + // visor + if err := dbutil.ForEach(tx, UnconfirmedTxnsBkt, func(_, v []byte) error { + select { + case <-quit: + return ErrVerifyStopped + default: + } + + var b1 UnconfirmedTransaction + if err := decodeUnconfirmedTransactionExact(v, &b1); err != nil { + return err + } + + var b2 UnconfirmedTransaction + if err := encoder.DeserializeRawExact(v, &b2); err != nil { + return err + } + + if !reflect.DeepEqual(b1, b2) { + return errors.New("UnconfirmedTxnsBkt unconfirmed transaction mismatch") + } + + return nil + }); err != nil { + return err + } + + if err := dbutil.ForEach(tx, UnconfirmedUnspentsBkt, func(_, v []byte) error { + select { + case <-quit: + return ErrVerifyStopped + default: + } + + var b1 UxArray + if err := decodeUxArrayExact(v, &b1); err != nil { + return err + } + + var b2 coin.UxArray + if err := encoder.DeserializeRawExact(v, &b2); err != nil { + return err + } + + if !reflect.DeepEqual(b1.UxArray, b2) { + return errors.New("UnconfirmedUnspentsBkt ux out slice mismatch") + } + + return nil + }); err != nil { + return err + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/dbutil/dbutil.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/dbutil/dbutil.go new file mode 100644 index 00000000..f3ec6339 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/dbutil/dbutil.go @@ -0,0 +1,360 @@ +/* +Package dbutil provides boltdb utility methods +*/ +package dbutil + +import ( + "encoding/binary" + "encoding/json" + "errors" + "fmt" + "runtime/debug" + "sync" + "time" + + "github.com/boltdb/bolt" + + "github.com/SkycoinProject/skycoin/src/cipher/encoder" + "github.com/SkycoinProject/skycoin/src/util/logging" +) + +var ( + logger = logging.MustGetLogger("dbutil") + txViewLog = false + txViewTrace = false + txUpdateLog = false + txUpdateTrace = false + txDurationLog = true + txDurationReportingThreshold = time.Millisecond * 100 +) + +// Tx wraps a Tx +type Tx struct { + *bolt.Tx +} + +// String is implemented to prevent a panic when mocking methods with *Tx arguments. +// The mock library forces arguments to be printed with %s which causes Tx to panic. +// See https://github.com/stretchr/testify/pull/596 +func (tx *Tx) String() string { + return fmt.Sprintf("%v", tx.Tx) +} + +// DB wraps a bolt.DB to add logging +type DB struct { + ViewLog bool + ViewTrace bool + UpdateLog bool + UpdateTrace bool + DurationLog bool + DurationReportingThreshold time.Duration + + *bolt.DB + + // shutdownLock is added to prevent closing the database while a View transaction is in progress + // bolt.DB will block for Update transactions but not for View transactions, and if + // the database is closed while in a View transaction, it will panic + // This will be fixed in coreos's bbolt after this PR is merged: + // https://github.com/coreos/bbolt/pull/91 + // When coreos has this feature, we can switch to coreos's bbolt and remove this lock + shutdownLock sync.RWMutex +} + +// WrapDB returns WrapDB +func WrapDB(db *bolt.DB) *DB { + return &DB{ + ViewLog: txViewLog, + UpdateLog: txUpdateLog, + ViewTrace: txViewTrace, + UpdateTrace: txUpdateTrace, + DurationLog: txDurationLog, + DurationReportingThreshold: txDurationReportingThreshold, + DB: db, + } +} + +// View wraps *bolt.DB.View to add logging +func (db *DB) View(name string, f func(*Tx) error) error { + db.shutdownLock.RLock() + defer db.shutdownLock.RUnlock() + + if db.ViewLog { + logger.Debug("db.View [%s] starting", name) + defer logger.Debug("db.View [%s] done", name) + } + if db.ViewTrace { + debug.PrintStack() + } + + t0 := time.Now() + + err := db.DB.View(func(tx *bolt.Tx) error { + return f(&Tx{tx}) + }) + + t1 := time.Now() + delta := t1.Sub(t0) + if db.DurationLog && delta > db.DurationReportingThreshold { + logger.Debugf("db.View [%s] elapsed %s", name, delta) + } + + return err +} + +// Update wraps *bolt.DB.Update to add logging +func (db *DB) Update(name string, f func(*Tx) error) error { + db.shutdownLock.RLock() + defer db.shutdownLock.RUnlock() + + if db.UpdateLog { + logger.Debug("db.Update [%s] starting", name) + defer logger.Debug("db.Update [%s] done", name) + } + if db.UpdateTrace { + debug.PrintStack() + } + + t0 := time.Now() + + err := db.DB.Update(func(tx *bolt.Tx) error { + return f(&Tx{tx}) + }) + + t1 := time.Now() + delta := t1.Sub(t0) + if db.DurationLog && delta > db.DurationReportingThreshold { + logger.Debugf("db.Update [%s] elapsed %s", name, delta) + } + + return err +} + +// Close closes the underlying *bolt.DB +func (db *DB) Close() error { + db.shutdownLock.Lock() + defer db.shutdownLock.Unlock() + + return db.DB.Close() +} + +// ErrCreateBucketFailed is returned if creating a bolt.DB bucket fails +type ErrCreateBucketFailed struct { + Bucket string + Err error +} + +func (e ErrCreateBucketFailed) Error() string { + return fmt.Sprintf("Create bucket \"%s\" failed: %v", e.Bucket, e.Err) +} + +// NewErrCreateBucketFailed returns an ErrCreateBucketFailed +func NewErrCreateBucketFailed(bucket []byte, err error) error { + return ErrCreateBucketFailed{ + Bucket: string(bucket), + Err: err, + } +} + +// ErrBucketNotExist is returned if a bolt.DB bucket does not exist +type ErrBucketNotExist struct { + Bucket string +} + +func (e ErrBucketNotExist) Error() string { + return fmt.Sprintf("Bucket \"%s\" doesn't exist", e.Bucket) +} + +// NewErrBucketNotExist returns an ErrBucketNotExist +func NewErrBucketNotExist(bucket []byte) error { + return ErrBucketNotExist{ + Bucket: string(bucket), + } +} + +// CreateBuckets creates multiple buckets +func CreateBuckets(tx *Tx, buckets [][]byte) error { + for _, b := range buckets { + if _, err := tx.CreateBucketIfNotExists(b); err != nil { + return NewErrCreateBucketFailed(b, err) + } + } + + return nil +} + +// GetBucketObjectDecoded returns an encoder-serialized value from a bucket, decoded to an object +func GetBucketObjectDecoded(tx *Tx, bktName, key []byte, obj interface{}) (bool, error) { + v, err := GetBucketValueNoCopy(tx, bktName, key) + if err != nil { + return false, err + } else if v == nil { + return false, nil + } + + if err := encoder.DeserializeRawExact(v, obj); err != nil { + return false, fmt.Errorf("encoder.DeserializeRawExact failed: %v", err) + } + + return true, nil +} + +// GetBucketObjectJSON returns a JSON value from a bucket, unmarshaled to an object +func GetBucketObjectJSON(tx *Tx, bktName, key []byte, obj interface{}) (bool, error) { + v, err := GetBucketValueNoCopy(tx, bktName, key) + if err != nil { + return false, err + } else if v == nil { + return false, nil + } + + if err := json.Unmarshal(v, obj); err != nil { + return false, fmt.Errorf("json.Unmarshal failed: %v", err) + } + + return true, nil +} + +// GetBucketString returns a string value from a bucket +func GetBucketString(tx *Tx, bktName, key []byte) (string, bool, error) { + v, err := GetBucketValueNoCopy(tx, bktName, key) + if err != nil { + return "", false, err + } else if v == nil { + return "", false, nil + } + + return string(v), true, nil +} + +// GetBucketValue returns a []byte value from a bucket. If the bucket does not exist, +// it returns an error of type ErrBucketNotExist +func GetBucketValue(tx *Tx, bktName, key []byte) ([]byte, error) { + v, err := GetBucketValueNoCopy(tx, bktName, key) + if err != nil { + return nil, err + } else if v == nil { + return nil, nil + } + + // Bytes returned from boltdb are not valid outside of the transaction + // they are called in, make a copy + w := make([]byte, len(v)) + copy(w[:], v[:]) + + return w, nil +} + +// GetBucketValueNoCopy returns a value from a bucket. If the bucket does not exist, +// it returns an error of type ErrBucketNotExist. The byte value is not copied so is not valid +// outside of the database transaction +func GetBucketValueNoCopy(tx *Tx, bktName, key []byte) ([]byte, error) { + bkt := tx.Bucket(bktName) + if bkt == nil { + return nil, NewErrBucketNotExist(bktName) + } + + return bkt.Get(key), nil +} + +// PutBucketValue puts a value into a bucket under key. +func PutBucketValue(tx *Tx, bktName, key, val []byte) error { + bkt := tx.Bucket(bktName) + if bkt == nil { + return NewErrBucketNotExist(bktName) + } + + return bkt.Put(key, val) +} + +// BucketHasKey returns true if a bucket has a non-nil value for a key +func BucketHasKey(tx *Tx, bktName, key []byte) (bool, error) { + bkt := tx.Bucket(bktName) + if bkt == nil { + return false, NewErrBucketNotExist(bktName) + } + + v := bkt.Get(key) + return v != nil, nil +} + +// NextSequence returns the NextSequence() from the bucket +func NextSequence(tx *Tx, bktName []byte) (uint64, error) { + bkt := tx.Bucket(bktName) + if bkt == nil { + return 0, NewErrBucketNotExist(bktName) + } + + return bkt.NextSequence() +} + +// ForEach calls ForEach on the bucket +func ForEach(tx *Tx, bktName []byte, f func(k, v []byte) error) error { + bkt := tx.Bucket(bktName) + if bkt == nil { + return NewErrBucketNotExist(bktName) + } + + return bkt.ForEach(f) +} + +// Delete deletes from a bucket +func Delete(tx *Tx, bktName, key []byte) error { + bkt := tx.Bucket(bktName) + if bkt == nil { + return NewErrBucketNotExist(bktName) + } + + return bkt.Delete(key) +} + +// Len returns the number of keys in a bucket +func Len(tx *Tx, bktName []byte) (uint64, error) { + bkt := tx.Bucket(bktName) + if bkt == nil { + return 0, NewErrBucketNotExist(bktName) + } + + bstats := bkt.Stats() + + if bstats.KeyN < 0 { + return 0, errors.New("Negative length queried from db stats") + } + + return uint64(bstats.KeyN), nil +} + +// IsEmpty returns true if the bucket is empty +func IsEmpty(tx *Tx, bktName []byte) (bool, error) { + length, err := Len(tx, bktName) + if err != nil { + return false, err + } + return length == 0, nil +} + +// Exists returns true if the bucket exists +func Exists(tx *Tx, bktName []byte) bool { + return tx.Bucket(bktName) != nil +} + +// Reset resets the bucket +func Reset(tx *Tx, bktName []byte) error { + if err := tx.DeleteBucket(bktName); err != nil { + return err + } + + _, err := tx.CreateBucket(bktName) + return err +} + +// Itob converts uint64 to bytes +func Itob(v uint64) []byte { + b := make([]byte, 8) + binary.BigEndian.PutUint64(b, v) + return b +} + +// Btoi converts bytes to uint64 +func Btoi(v []byte) uint64 { + return binary.BigEndian.Uint64(v) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/distribution.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/distribution.go new file mode 100644 index 00000000..a373a826 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/distribution.go @@ -0,0 +1,24 @@ +package visor + +import ( + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/params" +) + +// TransactionIsLocked returns true if the transaction spends locked outputs +func TransactionIsLocked(d params.Distribution, inUxs coin.UxArray) bool { + lockedAddrs := d.LockedAddresses() + lockedAddrsMap := make(map[string]struct{}) + for _, a := range lockedAddrs { + lockedAddrsMap[a] = struct{}{} + } + + for _, o := range inUxs { + uxAddr := o.Body.Address.String() + if _, ok := lockedAddrsMap[uxAddr]; ok { + return true + } + } + + return false +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/distribution_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/distribution_test.go new file mode 100644 index 00000000..33ef74e4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/distribution_test.go @@ -0,0 +1,40 @@ +package visor + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/params" +) + +func TestTransactionIsLocked(t *testing.T) { + test := func(addrStr string, expectedIsLocked bool) { + addr := cipher.MustDecodeBase58Address(addrStr) + + uxOut := coin.UxOut{ + Body: coin.UxBody{ + Address: addr, + }, + } + uxArray := coin.UxArray{uxOut} + + isLocked := TransactionIsLocked(params.MainNetDistribution, uxArray) + require.Equal(t, expectedIsLocked, isLocked) + } + + for _, a := range params.MainNetDistribution.LockedAddresses() { + test(a, true) + } + + for _, a := range params.MainNetDistribution.UnlockedAddresses() { + test(a, false) + } + + // A random address should not be locked + pubKey, _ := cipher.GenerateKeyPair() + addr := cipher.AddressFromPubKey(pubKey) + test(addr.String(), false) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/address_txn.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/address_txn.go new file mode 100644 index 00000000..cc9c96f7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/address_txn.go @@ -0,0 +1,79 @@ +package historydb + +import ( + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +//go:generate skyencoder -unexported -struct hashesWrapper + +// hashesWrapper wraps []cipher.SHA256 +type hashesWrapper struct { + Hashes []cipher.SHA256 +} + +// AddressTxnsBkt maps addresses to transaction hashes +var AddressTxnsBkt = []byte("address_txns") + +// addressTxn buckets for storing address related transactions +// address as key, transaction id slice as value +type addressTxns struct{} + +// get returns the transaction hashes of given address +func (atx *addressTxns) get(tx *dbutil.Tx, addr cipher.Address) ([]cipher.SHA256, error) { + var txnHashes hashesWrapper + + v, err := dbutil.GetBucketValueNoCopy(tx, AddressTxnsBkt, addr.Bytes()) + if err != nil { + return nil, err + } else if v == nil { + return nil, nil + } + + if err := decodeHashesWrapperExact(v, &txnHashes); err != nil { + return nil, err + } + + return txnHashes.Hashes, nil +} + +// add adds a hash to an address's hash list +func (atx *addressTxns) add(tx *dbutil.Tx, addr cipher.Address, hash cipher.SHA256) error { + hashes, err := atx.get(tx, addr) + if err != nil { + return err + } + + // check for duplicates + for _, u := range hashes { + if u == hash { + return nil + } + } + + hashes = append(hashes, hash) + + buf, err := encodeHashesWrapper(&hashesWrapper{ + Hashes: hashes, + }) + if err != nil { + return err + } + + return dbutil.PutBucketValue(tx, AddressTxnsBkt, addr.Bytes(), buf) +} + +// contains returns true if an address has transactions +func (atx *addressTxns) contains(tx *dbutil.Tx, addr cipher.Address) (bool, error) { + return dbutil.BucketHasKey(tx, AddressTxnsBkt, addr.Bytes()) +} + +// isEmpty checks if address transactions bucket is empty +func (atx *addressTxns) isEmpty(tx *dbutil.Tx) (bool, error) { + return dbutil.IsEmpty(tx, AddressTxnsBkt) +} + +// reset resets the bucket +func (atx *addressTxns) reset(tx *dbutil.Tx) error { + return dbutil.Reset(tx, AddressTxnsBkt) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/address_txn_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/address_txn_test.go new file mode 100644 index 00000000..fdf32417 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/address_txn_test.go @@ -0,0 +1,254 @@ +package historydb + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +func TestAddAddressTxns(t *testing.T) { + var preAddrs []cipher.Address + var preTxHashes []cipher.SHA256 + + type pair struct { + addr cipher.Address + txHash cipher.SHA256 + } + + type expectPair struct { + addr cipher.Address + txs []cipher.SHA256 + } + + for i := 0; i < 3; i++ { + preAddrs = append(preAddrs, makeAddress()) + preTxHashes = append(preTxHashes, cipher.SumSHA256([]byte(fmt.Sprintf("tx%d", i)))) + } + + var testCases = []struct { + name string + addPairs []pair + expect []expectPair + }{ + { + "address with single tx", + []pair{ + { + addr: preAddrs[0], + txHash: preTxHashes[0], + }, + { + addr: preAddrs[1], + txHash: preTxHashes[1], + }, + }, + []expectPair{ + { + preAddrs[0], + preTxHashes[:1], + }, + { + preAddrs[1], + preTxHashes[1:2], + }, + }, + }, + { + "address with multiple transactions", + []pair{ + { + addr: preAddrs[0], + txHash: preTxHashes[0], + }, + { + addr: preAddrs[0], + txHash: preTxHashes[1], + }, + }, + []expectPair{ + { + preAddrs[0], + preTxHashes[:2], + }, + }, + }, + { + "add address with multiple same transactions", + []pair{ + { + addr: preAddrs[0], + txHash: preTxHashes[0], + }, + { + addr: preAddrs[0], + txHash: preTxHashes[0], + }, + { + addr: preAddrs[0], + txHash: preTxHashes[0], + }, + }, + []expectPair{ + { + preAddrs[0], + preTxHashes[:1], + }, + }, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + db, td := prepareDB(t) + defer td() + + addrTxns := &addressTxns{} + + err := db.Update("", func(tx *dbutil.Tx) error { + for _, pr := range tc.addPairs { + err := addrTxns.add(tx, pr.addr, pr.txHash) + require.NoError(t, err) + } + return nil + }) + require.NoError(t, err) + + for _, e := range tc.expect { + err := db.View("", func(tx *dbutil.Tx) error { + hashes, err := addrTxns.get(tx, e.addr) + require.NoError(t, err) + require.Equal(t, e.txs, hashes) + return nil + }) + require.NoError(t, err) + } + + }) + } +} + +func TestGetAddressTxns(t *testing.T) { + var preAddrs []cipher.Address + var preTxHashes []cipher.SHA256 + + type pair struct { + addr cipher.Address + txHash cipher.SHA256 + } + + type expectPair struct { + addr cipher.Address + txs []cipher.SHA256 + } + + for i := 0; i < 3; i++ { + preAddrs = append(preAddrs, makeAddress()) + preTxHashes = append(preTxHashes, cipher.SumSHA256([]byte(fmt.Sprintf("tx%d", i)))) + } + + var testCases = []struct { + name string + addPairs []pair + expect []expectPair + }{ + { + "address with single tx", + []pair{ + { + addr: preAddrs[0], + txHash: preTxHashes[0], + }, + { + addr: preAddrs[1], + txHash: preTxHashes[1], + }, + }, + []expectPair{ + { + preAddrs[0], + preTxHashes[:1], + }, + { + preAddrs[1], + preTxHashes[1:2], + }, + }, + }, + { + "address with multiple transactions", + []pair{ + { + addr: preAddrs[0], + txHash: preTxHashes[0], + }, + { + addr: preAddrs[0], + txHash: preTxHashes[1], + }, + }, + []expectPair{ + { + preAddrs[0], + preTxHashes[:2], + }, + }, + }, + { + "add address with multiple same transactions", + []pair{ + { + addr: preAddrs[0], + txHash: preTxHashes[0], + }, + { + addr: preAddrs[0], + txHash: preTxHashes[0], + }, + { + addr: preAddrs[0], + txHash: preTxHashes[0], + }, + }, + []expectPair{ + { + preAddrs[0], + preTxHashes[:1], + }, + }, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + db, td := prepareDB(t) + defer td() + + addrTxns := &addressTxns{} + + err := db.Update("", func(tx *dbutil.Tx) error { + for _, pr := range tc.addPairs { + err := addrTxns.add(tx, pr.addr, pr.txHash) + require.NoError(t, err) + } + + return nil + }) + require.NoError(t, err) + + err = db.View("", func(tx *dbutil.Tx) error { + for _, e := range tc.expect { + hashes, err := addrTxns.get(tx, e.addr) + require.NoError(t, err) + require.Equal(t, e.txs, hashes) + } + return nil + }) + require.NoError(t, err) + + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/address_uxout.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/address_uxout.go new file mode 100644 index 00000000..f23185bc --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/address_uxout.go @@ -0,0 +1,66 @@ +package historydb + +import ( + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +// AddressUxBkt maps addresses to unspent outputs +var AddressUxBkt = []byte("address_in") + +// bucket for storing address with UxOut, key as address, value as UxOut. +type addressUx struct{} + +// get return nil on not found. +func (au *addressUx) get(tx *dbutil.Tx, addr cipher.Address) ([]cipher.SHA256, error) { + var uxHashes hashesWrapper + + v, err := dbutil.GetBucketValueNoCopy(tx, AddressUxBkt, addr.Bytes()) + if err != nil { + return nil, err + } else if v == nil { + return nil, nil + } + + if err := decodeHashesWrapperExact(v, &uxHashes); err != nil { + return nil, err + } + + return uxHashes.Hashes, nil +} + +// add adds a hash to an address's hash list +func (au *addressUx) add(tx *dbutil.Tx, address cipher.Address, uxHash cipher.SHA256) error { + hashes, err := au.get(tx, address) + if err != nil { + return err + } + + // check for duplicate hashes + for _, u := range hashes { + if u == uxHash { + return nil + } + } + + hashes = append(hashes, uxHash) + + buf, err := encodeHashesWrapper(&hashesWrapper{ + Hashes: hashes, + }) + if err != nil { + return err + } + + return dbutil.PutBucketValue(tx, AddressUxBkt, address.Bytes(), buf) +} + +// isEmpty checks if the addressUx bucket is empty +func (au *addressUx) isEmpty(tx *dbutil.Tx) (bool, error) { + return dbutil.IsEmpty(tx, AddressUxBkt) +} + +// reset resets the bucket +func (au *addressUx) reset(tx *dbutil.Tx) error { + return dbutil.Reset(tx, AddressUxBkt) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/hashes_wrapper_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/hashes_wrapper_skyencoder.go new file mode 100644 index 00000000..36fc3090 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/hashes_wrapper_skyencoder.go @@ -0,0 +1,126 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package historydb + +import ( + "errors" + "math" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +// encodeSizeHashesWrapper computes the size of an encoded object of type hashesWrapper +func encodeSizeHashesWrapper(obj *hashesWrapper) uint64 { + i0 := uint64(0) + + // obj.Hashes + i0 += 4 + { + i1 := uint64(0) + + // x1 + i1 += 32 + + i0 += uint64(len(obj.Hashes)) * i1 + } + + return i0 +} + +// encodeHashesWrapper encodes an object of type hashesWrapper to a buffer allocated to the exact size +// required to encode the object. +func encodeHashesWrapper(obj *hashesWrapper) ([]byte, error) { + n := encodeSizeHashesWrapper(obj) + buf := make([]byte, n) + + if err := encodeHashesWrapperToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeHashesWrapperToBuffer encodes an object of type hashesWrapper to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeHashesWrapperToBuffer(buf []byte, obj *hashesWrapper) error { + if uint64(len(buf)) < encodeSizeHashesWrapper(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Hashes length check + if uint64(len(obj.Hashes)) > math.MaxUint32 { + return errors.New("obj.Hashes length exceeds math.MaxUint32") + } + + // obj.Hashes length + e.Uint32(uint32(len(obj.Hashes))) + + // obj.Hashes + for _, x := range obj.Hashes { + + // x + e.CopyBytes(x[:]) + + } + + return nil +} + +// decodeHashesWrapper decodes an object of type hashesWrapper from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeHashesWrapper(buf []byte, obj *hashesWrapper) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Hashes + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length != 0 { + obj.Hashes = make([]cipher.SHA256, length) + + for z1 := range obj.Hashes { + { + // obj.Hashes[z1] + if len(d.Buffer) < len(obj.Hashes[z1]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Hashes[z1][:], d.Buffer[:len(obj.Hashes[z1])]) + d.Buffer = d.Buffer[len(obj.Hashes[z1]):] + } + + } + } + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeHashesWrapperExact decodes an object of type hashesWrapper from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeHashesWrapperExact(buf []byte, obj *hashesWrapper) error { + if n, err := decodeHashesWrapper(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/hashes_wrapper_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/hashes_wrapper_skyencoder_test.go new file mode 100644 index 00000000..ca0cbfb1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/hashes_wrapper_skyencoder_test.go @@ -0,0 +1,421 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package historydb + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +func newEmptyHashesWrapperForEncodeTest() *hashesWrapper { + var obj hashesWrapper + return &obj +} + +func newRandomHashesWrapperForEncodeTest(t *testing.T, rand *mathrand.Rand) *hashesWrapper { + var obj hashesWrapper + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenHashesWrapperForEncodeTest(t *testing.T, rand *mathrand.Rand) *hashesWrapper { + var obj hashesWrapper + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilHashesWrapperForEncodeTest(t *testing.T, rand *mathrand.Rand) *hashesWrapper { + var obj hashesWrapper + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderHashesWrapper(t *testing.T, obj *hashesWrapper) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeHashesWrapper(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeHashesWrapper() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeHashesWrapper(obj) + if err != nil { + t.Fatalf("encodeHashesWrapper failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeHashesWrapper produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeHashesWrapper()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeHashesWrapperToBuffer(data3, obj); err != nil { + t.Fatalf("encodeHashesWrapperToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 hashesWrapper + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 hashesWrapper + if n, err := decodeHashesWrapper(data2, &obj3); err != nil { + t.Fatalf("decodeHashesWrapper failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeHashesWrapper bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeHashesWrapper()") + } + + // Decode, excess buffer + var obj4 hashesWrapper + n, err := decodeHashesWrapper(data3, &obj4) + if err != nil { + t.Fatalf("decodeHashesWrapper failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeHashesWrapper bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeHashesWrapper bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeHashesWrapper()") + } + + // DecodeExact + var obj5 hashesWrapper + if err := decodeHashesWrapperExact(data2, &obj5); err != nil { + t.Fatalf("decodeHashesWrapper failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeHashesWrapper()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeHashesWrapper(data4, &obj3); err != nil { + t.Fatalf("decodeHashesWrapper failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeHashesWrapper bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderHashesWrapper(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *hashesWrapper + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptyHashesWrapperForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomHashesWrapperForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenHashesWrapperForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilHashesWrapperForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderHashesWrapper(t, tc.obj) + }) + } +} + +func decodeHashesWrapperExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj hashesWrapper + if _, err := decodeHashesWrapper(buf, &obj); err == nil { + t.Fatal("decodeHashesWrapper: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeHashesWrapper: expected error %q, got %q", expectedErr, err) + } +} + +func decodeHashesWrapperExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj hashesWrapper + if err := decodeHashesWrapperExact(buf, &obj); err == nil { + t.Fatal("decodeHashesWrapperExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeHashesWrapperExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderHashesWrapperDecodeErrors(t *testing.T, k int, tag string, obj *hashesWrapper) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeHashesWrapper(obj) + buf, err := encodeHashesWrapper(obj) + if err != nil { + t.Fatalf("encodeHashesWrapper failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeHashesWrapperExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeHashesWrapperExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeHashesWrapperExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeHashesWrapperExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeHashesWrapperExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderHashesWrapperDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptyHashesWrapperForEncodeTest() + fullObj := newRandomHashesWrapperForEncodeTest(t, rand) + testSkyencoderHashesWrapperDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderHashesWrapperDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/history_meta.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/history_meta.go new file mode 100644 index 00000000..17001850 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/history_meta.go @@ -0,0 +1,36 @@ +package historydb + +import ( + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +var ( + // HistoryMetaBkt holds history metadata + HistoryMetaBkt = []byte("history_meta") + parsedHeightKey = []byte("parsed_height") +) + +// historyMeta bucket for storing block history meta info +type historyMeta struct{} + +// parsedBlockSeq returns history parsed block seq +func (hm *historyMeta) parsedBlockSeq(tx *dbutil.Tx) (uint64, bool, error) { + v, err := dbutil.GetBucketValue(tx, HistoryMetaBkt, parsedHeightKey) + if err != nil { + return 0, false, err + } else if v == nil { + return 0, false, nil + } + + return dbutil.Btoi(v), true, nil +} + +// setParsedBlockSeq updates history parsed block seq +func (hm *historyMeta) setParsedBlockSeq(tx *dbutil.Tx, h uint64) error { + return dbutil.PutBucketValue(tx, HistoryMetaBkt, parsedHeightKey, dbutil.Itob(h)) +} + +// reset resets the bucket +func (hm *historyMeta) reset(tx *dbutil.Tx) error { + return dbutil.Reset(tx, HistoryMetaBkt) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/history_meta_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/history_meta_test.go new file mode 100644 index 00000000..e18de9af --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/history_meta_test.go @@ -0,0 +1,58 @@ +package historydb + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +func TestHistoryMetaGetSetParsedHeight(t *testing.T) { + db, td := prepareDB(t) + defer td() + + hm := &historyMeta{} + + err := db.View("", func(tx *dbutil.Tx) error { + height, ok, err := hm.parsedBlockSeq(tx) + require.NoError(t, err) + require.False(t, ok) + require.Equal(t, uint64(0), height) + return err + }) + require.NoError(t, err) + + err = db.Update("", func(tx *dbutil.Tx) error { + err := hm.setParsedBlockSeq(tx, 10) + require.NoError(t, err) + return err + }) + require.NoError(t, err) + + err = db.View("", func(tx *dbutil.Tx) error { + height, ok, err := hm.parsedBlockSeq(tx) + require.NoError(t, err) + require.True(t, ok) + require.Equal(t, uint64(10), height) + return err + }) + require.NoError(t, err) + + err = db.Update("", func(tx *dbutil.Tx) error { + err := hm.setParsedBlockSeq(tx, 0) + require.NoError(t, err) + return err + }) + require.NoError(t, err) + + err = db.View("", func(tx *dbutil.Tx) error { + height, ok, err := hm.parsedBlockSeq(tx) + require.NoError(t, err) + require.True(t, ok) + require.Equal(t, uint64(0), height) + return err + }) + require.NoError(t, err) + +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/historydb.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/historydb.go new file mode 100644 index 00000000..08b08182 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/historydb.go @@ -0,0 +1,395 @@ +/* +Package historydb stores historical blockchain data. +*/ +package historydb + +import ( + "errors" + "fmt" + "sync" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/util/logging" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +var logger = logging.MustGetLogger("historydb") + +// CreateBuckets creates bolt.DB buckets used by the historydb +func CreateBuckets(tx *dbutil.Tx) error { + return dbutil.CreateBuckets(tx, [][]byte{ + AddressTxnsBkt, + AddressUxBkt, + HistoryMetaBkt, + UxOutsBkt, + TransactionsBkt, + }) +} + +// HistoryDB provides APIs for blockchain explorer +type HistoryDB struct { + outputs *uxOuts // outputs bucket + txns *transactions // transactions bucket + addrUx *addressUx // bucket which stores all UxOuts that address received + addrTxns *addressTxns // address related transaction bucket + meta *historyMeta // stores history meta info +} + +// New create HistoryDB instance +func New() *HistoryDB { + return &HistoryDB{ + outputs: &uxOuts{}, + txns: &transactions{}, + addrUx: &addressUx{}, + addrTxns: &addressTxns{}, + meta: &historyMeta{}, + } +} + +// NeedsReset checks if need to reset the parsed block history, +// If we have a new added bucket, we need to reset to parse +// blockchain again to get the new bucket filled. +func (hd *HistoryDB) NeedsReset(tx *dbutil.Tx) (bool, error) { + _, ok, err := hd.meta.parsedBlockSeq(tx) + if err != nil { + return false, err + } else if !ok { + return true, nil + } + + // if any of the following buckets are empty, need to reset + addrTxnsEmpty, err := hd.addrTxns.isEmpty(tx) + if err != nil { + return false, err + } + + addrUxEmpty, err := hd.addrUx.isEmpty(tx) + if err != nil { + return false, err + } + + txnsEmpty, err := hd.txns.isEmpty(tx) + if err != nil { + return false, err + } + + outputsEmpty, err := hd.outputs.isEmpty(tx) + if err != nil { + return false, err + } + + if addrTxnsEmpty || addrUxEmpty || txnsEmpty || outputsEmpty { + return true, nil + } + + return false, nil +} + +// Erase erases the entire HistoryDB +func (hd *HistoryDB) Erase(tx *dbutil.Tx) error { + logger.Debug("HistoryDB.reset") + if err := hd.addrTxns.reset(tx); err != nil { + return err + } + + if err := hd.addrUx.reset(tx); err != nil { + return err + } + + if err := hd.outputs.reset(tx); err != nil { + return err + } + + if err := hd.meta.reset(tx); err != nil { + return err + } + + return hd.txns.reset(tx) +} + +// ParsedBlockSeq returns the block seq up to which the HistoryDB is parsed +func (hd *HistoryDB) ParsedBlockSeq(tx *dbutil.Tx) (uint64, bool, error) { + return hd.meta.parsedBlockSeq(tx) +} + +// SetParsedBlockSeq sets the block seq up to which the HistoryDB is parsed +func (hd *HistoryDB) SetParsedBlockSeq(tx *dbutil.Tx, seq uint64) error { + return hd.meta.setParsedBlockSeq(tx, seq) +} + +// GetUxOuts get UxOut of specific uxIDs. +func (hd *HistoryDB) GetUxOuts(tx *dbutil.Tx, uxIDs []cipher.SHA256) ([]UxOut, error) { + return hd.outputs.getArray(tx, uxIDs) +} + +// ParseBlock builds indexes out of the block data +func (hd *HistoryDB) ParseBlock(tx *dbutil.Tx, b coin.Block) error { + for _, t := range b.Body.Transactions { + txn := Transaction{ + Txn: t, + BlockSeq: b.Seq(), + } + + spentTxnID := t.Hash() + + if err := hd.txns.put(tx, &txn); err != nil { + return err + } + + for _, in := range t.In { + o, err := hd.outputs.get(tx, in) + if err != nil { + return err + } + + if o == nil { + return errors.New("HistoryDB.ParseBlock: transaction input not found in outputs bucket") + } + + // update the output's spent block seq and txid + o.SpentBlockSeq = b.Seq() + o.SpentTxnID = spentTxnID + if err := hd.outputs.put(tx, *o); err != nil { + return err + } + + // store the IN address with txid + if err := hd.addrTxns.add(tx, o.Out.Body.Address, spentTxnID); err != nil { + return err + } + } + + // handle the tx out + uxArray := coin.CreateUnspents(b.Head, t) + for _, ux := range uxArray { + if err := hd.outputs.put(tx, UxOut{ + Out: ux, + }); err != nil { + return err + } + + if err := hd.addrUx.add(tx, ux.Body.Address, ux.Hash()); err != nil { + return err + } + + if err := hd.addrTxns.add(tx, ux.Body.Address, spentTxnID); err != nil { + return err + } + } + } + + return hd.SetParsedBlockSeq(tx, b.Seq()) +} + +// GetTransaction get transaction by hash. +func (hd HistoryDB) GetTransaction(tx *dbutil.Tx, hash cipher.SHA256) (*Transaction, error) { + return hd.txns.get(tx, hash) +} + +// GetOutputsForAddress get all uxout that the address affected. +func (hd HistoryDB) GetOutputsForAddress(tx *dbutil.Tx, addr cipher.Address) ([]UxOut, error) { + hashes, err := hd.addrUx.get(tx, addr) + if err != nil { + return nil, err + } + + return hd.outputs.getArray(tx, hashes) +} + +// GetTransactionsForAddress returns all the address related transactions +func (hd HistoryDB) GetTransactionsForAddress(tx *dbutil.Tx, addr cipher.Address) ([]Transaction, error) { + hashes, err := hd.addrTxns.get(tx, addr) + if err != nil { + return nil, err + } + + return hd.txns.getArray(tx, hashes) +} + +// AddressSeen returns true if the address appears in the blockchain +func (hd HistoryDB) AddressSeen(tx *dbutil.Tx, addr cipher.Address) (bool, error) { + return hd.addrTxns.contains(tx, addr) +} + +// ForEachTxn traverses the transactions bucket +func (hd HistoryDB) ForEachTxn(tx *dbutil.Tx, f func(cipher.SHA256, *Transaction) error) error { + return hd.txns.forEach(tx, f) +} + +// IndexesMap is a goroutine safe address indexes map +type IndexesMap struct { + value map[cipher.Address]AddressIndexes + lock sync.RWMutex +} + +// NewIndexesMap creates a IndexesMap instance +func NewIndexesMap() *IndexesMap { + return &IndexesMap{ + value: make(map[cipher.Address]AddressIndexes), + } +} + +// Load returns value of given key +func (im *IndexesMap) Load(addr cipher.Address) (AddressIndexes, bool) { + im.lock.RLock() + defer im.lock.RUnlock() + v, ok := im.value[addr] + return v, ok +} + +// Store saves address with indexes +func (im *IndexesMap) Store(addr cipher.Address, indexes AddressIndexes) { + im.lock.Lock() + defer im.lock.Unlock() + im.value[addr] = indexes +} + +// AddressIndexes represents the address indexes struct +type AddressIndexes struct { + TxnHashes map[cipher.SHA256]struct{} + UxHashes map[cipher.SHA256]struct{} +} + +// Verify checks if the historydb is corrupted +func (hd HistoryDB) Verify(tx *dbutil.Tx, b *coin.SignedBlock, indexesMap *IndexesMap) error { + for _, t := range b.Body.Transactions { + txnHash := t.Hash() + txn, err := hd.txns.get(tx, txnHash) + if err != nil { + return err + } + + if txn == nil { + err := fmt.Errorf("HistoryDB.Verify: transaction %v does not exist in historydb", txnHash.Hex()) + return ErrHistoryDBCorrupted{err} + } + + for _, in := range t.In { + // Checks the existence of transaction input + o, err := hd.outputs.get(tx, in) + if err != nil { + return err + } + + if o == nil { + err := fmt.Errorf("HistoryDB.Verify: transaction input %v does not exist in historydb", in.Hex()) + return ErrHistoryDBCorrupted{err} + } + + // Checks the output's spend block seq + if o.SpentBlockSeq != b.Seq() { + err := fmt.Errorf("HistoryDB.Verify: spend block seq of transaction input %v is wrong, should be: %v, but is %v", + in.Hex(), b.Seq(), o.SpentBlockSeq) + return ErrHistoryDBCorrupted{err} + } + + addr := o.Out.Body.Address + txnHashesMap := map[cipher.SHA256]struct{}{} + uxHashesMap := map[cipher.SHA256]struct{}{} + + // Checks if the address indexes already loaded into memory + indexes, ok := indexesMap.Load(addr) + if ok { + txnHashesMap = indexes.TxnHashes + uxHashesMap = indexes.UxHashes + } else { + txnHashes, err := hd.addrTxns.get(tx, addr) + if err != nil { + return err + } + for _, hash := range txnHashes { + txnHashesMap[hash] = struct{}{} + } + + uxHashes, err := hd.addrUx.get(tx, addr) + if err != nil { + return err + } + for _, hash := range uxHashes { + uxHashesMap[hash] = struct{}{} + } + + indexesMap.Store(addr, AddressIndexes{ + TxnHashes: txnHashesMap, + UxHashes: uxHashesMap, + }) + } + + if _, ok := txnHashesMap[txnHash]; !ok { + err := fmt.Errorf("HistoryDB.Verify: index of address transaction [%s:%s] does not exist in historydb", + addr, txnHash.Hex()) + return ErrHistoryDBCorrupted{err} + } + + if _, ok := uxHashesMap[in]; !ok { + err := fmt.Errorf("HistoryDB.Verify: index of address uxout [%s:%s] does not exist in historydb", + addr, in.Hex()) + return ErrHistoryDBCorrupted{err} + } + } + + // Checks the transaction outs + uxArray := coin.CreateUnspents(b.Head, t) + for _, ux := range uxArray { + uxHash := ux.Hash() + out, err := hd.outputs.get(tx, uxHash) + if err != nil { + return err + } + + if out == nil { + err := fmt.Errorf("HistoryDB.Verify: transaction output %s does not exist in historydb", uxHash.Hex()) + return ErrHistoryDBCorrupted{err} + } + + addr := ux.Body.Address + txnHashesMap := map[cipher.SHA256]struct{}{} + indexes, ok := indexesMap.Load(addr) + if ok { + txnHashesMap = indexes.TxnHashes + } else { + txnHashes, err := hd.addrTxns.get(tx, addr) + if err != nil { + return err + } + for _, hash := range txnHashes { + txnHashesMap[hash] = struct{}{} + } + + uxHashes, err := hd.addrUx.get(tx, addr) + if err != nil { + return err + } + + uxHashesMap := make(map[cipher.SHA256]struct{}, len(uxHashes)) + for _, hash := range uxHashes { + uxHashesMap[hash] = struct{}{} + } + + indexesMap.Store(addr, AddressIndexes{ + TxnHashes: txnHashesMap, + UxHashes: uxHashesMap, + }) + } + + if _, ok := txnHashesMap[txnHash]; !ok { + err := fmt.Errorf("HistoryDB.Verify: index of address transaction [%s:%s] does not exist in historydb", + addr, txnHash.Hex()) + return ErrHistoryDBCorrupted{err} + } + } + } + return nil +} + +// ErrHistoryDBCorrupted is returned when found the historydb is corrupted +type ErrHistoryDBCorrupted struct { + error +} + +// NewErrHistoryDBCorrupted is for user to be able to create ErrHistoryDBCorrupted instance +// outside of the package +func NewErrHistoryDBCorrupted(err error) ErrHistoryDBCorrupted { + return ErrHistoryDBCorrupted{err} +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/historydb_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/historydb_test.go new file mode 100644 index 00000000..543bdaca --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/historydb_test.go @@ -0,0 +1,484 @@ +package historydb + +import ( + "errors" + "fmt" + "log" + "math/rand" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +func prepareDB(t *testing.T) (*dbutil.DB, func()) { + db, shutdown := testutil.PrepareDB(t) + + err := db.Update("", func(tx *dbutil.Tx) error { + return CreateBuckets(tx) + }) + if err != nil { + shutdown() + t.Fatalf("CreateBuckets failed: %v", err) + } + + return db, shutdown +} + +var ( + genPublic, genSecret = cipher.GenerateKeyPair() + genAddress = cipher.AddressFromPubKey(genPublic) +) + +var genTime uint64 = 1000 +var incTime uint64 = 3600 * 1000 +var genCoins uint64 = 1000e6 + +func feeCalc(t *coin.Transaction) (uint64, error) { + return 0, nil +} + +// set rand seed. +var _ = func() int64 { + t := time.Now().Unix() + rand.Seed(t) + return t +}() + +// Blockchainer interface for isolating the detail of blockchain. +type Blockchainer interface { + Head() *coin.Block + GetBlockInDepth(depth uint64) *coin.Block + ExecuteBlock(b *coin.Block) (coin.UxArray, error) + CreateGenesisBlock(genAddress cipher.Address, genCoins, timestamp uint64) coin.Block + VerifyTransaction(tx coin.Transaction) error + GetBlock(hash cipher.SHA256) *coin.Block +} + +type fakeBlockchain struct { + blocks []coin.Block + unspent map[string]coin.UxOut + uxhash cipher.SHA256 +} + +func newBlockchain() *fakeBlockchain { + return &fakeBlockchain{ + unspent: make(map[string]coin.UxOut), + } +} + +func (fbc fakeBlockchain) GetBlockInDepth(depth uint64) *coin.Block { + if depth >= uint64(len(fbc.blocks)) { + panic(fmt.Sprintf("block depth: %d overflow", depth)) + } + + return &fbc.blocks[depth] +} + +func (fbc fakeBlockchain) Head() *coin.Block { + l := len(fbc.blocks) + if l == 0 { + return nil + } + + return &fbc.blocks[l-1] +} + +func (fbc *fakeBlockchain) deleteUxOut(uxids []cipher.SHA256) { + for _, id := range uxids { + ux := fbc.unspent[id.Hex()] + fbc.uxhash = fbc.uxhash.Xor(ux.SnapshotHash()) + delete(fbc.unspent, id.Hex()) + } +} + +func (fbc *fakeBlockchain) addUxOut(ux coin.UxOut) { + fbc.uxhash = fbc.uxhash.Xor(ux.SnapshotHash()) + fbc.unspent[ux.Hash().Hex()] = ux +} + +func (fbc *fakeBlockchain) ExecuteBlock(b *coin.Block) (coin.UxArray, error) { + var uxs coin.UxArray + txns := b.Body.Transactions + for _, txn := range txns { + // Remove spent outputs + for _, id := range txn.In { + ux := fbc.unspent[id.Hex()] + fbc.uxhash = fbc.uxhash.Xor(ux.SnapshotHash()) + delete(fbc.unspent, id.Hex()) + + } + fbc.deleteUxOut(txn.In) + // Create new outputs + txnUxs := coin.CreateUnspents(b.Head, txn) + for i := range txnUxs { + fbc.addUxOut(txnUxs[i]) + } + uxs = append(uxs, txnUxs...) + } + + b.Head.PrevHash = fbc.Head().HashHeader() + fbc.blocks = append(fbc.blocks, *b) + + return uxs, nil +} + +func (fbc *fakeBlockchain) CreateGenesisBlock(genesisAddr cipher.Address, genesisCoins, timestamp uint64) coin.Block { + txn := coin.Transaction{} + err := txn.PushOutput(genesisAddr, genesisCoins, genesisCoins) + if err != nil { + panic(err) + } + body := coin.BlockBody{Transactions: coin.Transactions{txn}} + prevHash := cipher.SHA256{} + bodyHash := body.Hash() + head := coin.BlockHeader{ + Time: timestamp, + BodyHash: bodyHash, + PrevHash: prevHash, + BkSeq: 0, + Version: 0, + Fee: 0, + UxHash: cipher.SHA256{}, + } + b := coin.Block{ + Head: head, + Body: body, + } + // b.Body.Transactions[0].UpdateHeader() + fbc.blocks = append(fbc.blocks, b) + ux := coin.UxOut{ + Head: coin.UxHead{ + Time: timestamp, + BkSeq: 0, + }, + Body: coin.UxBody{ + SrcTransaction: txn.InnerHash, //user inner hash + Address: genesisAddr, + Coins: genesisCoins, + Hours: genesisCoins, // Allocate 1 coin hour per coin + }, + } + fbc.addUxOut(ux) + return b +} + +func (fbc fakeBlockchain) VerifyTransaction(tx coin.Transaction) error { + return nil +} + +func (fbc fakeBlockchain) GetBlock(hash cipher.SHA256) *coin.Block { + for _, b := range fbc.blocks { + if b.HashHeader() == hash { + return &b + } + } + return nil +} + +func TestProcessGenesisBlock(t *testing.T) { + db, teardown := prepareDB(t) + defer teardown() + + bc := newBlockchain() + gb := bc.CreateGenesisBlock(genAddress, genCoins, genTime) + hisDB := New() + + err := db.Update("", func(tx *dbutil.Tx) error { + err := hisDB.ParseBlock(tx, gb) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) + + // check transactions bucket. + var txn Transaction + txnHash := gb.Body.Transactions[0].Hash() + mustGetBucketValue(t, db, TransactionsBkt, txnHash[:], &txn) + require.Equal(t, txn.Txn, gb.Body.Transactions[0]) + + // check address in + outID := []cipher.SHA256{} + mustGetBucketValue(t, db, AddressUxBkt, genAddress.Bytes(), &outID) + + ux, ok := bc.unspent[outID[0].Hex()] + require.True(t, ok) + require.Equal(t, outID[0], ux.Hash()) + + // check outputs + output := UxOut{} + mustGetBucketValue(t, db, UxOutsBkt, outID[0][:], &output) + + require.Equal(t, output.Out, ux) +} + +type testData struct { + PreBlockHash cipher.SHA256 + Vin txIn + Vouts []txOut + AddrInNum map[string]int + AddrOutNum map[string]int +} + +type txIn struct { + SigKey string + Addr string + TxID cipher.SHA256 + BlockSeq uint64 +} + +type txOut struct { + ToAddr string + Coins uint64 + Hours uint64 +} + +// findTxnInBlock looks up a coin.Transaction from a coin.Block. +// Returns the Transaction and whether it was found or not +func findTxnInBlock(b *coin.Block, txnHash cipher.SHA256) (coin.Transaction, bool) { + txns := b.Body.Transactions + for i := range txns { + if txns[i].Hash() == txnHash { + return txns[i], true + } + } + return coin.Transaction{}, false +} + +func getUx(bc Blockchainer, seq uint64, txID cipher.SHA256, addr string) (*coin.UxOut, error) { + b := bc.GetBlockInDepth(seq) + if b == nil { + return nil, fmt.Errorf("no block in depth:%v", seq) + } + + txn, ok := findTxnInBlock(b, txID) + if !ok { + return nil, errors.New("found transaction failed") + } + + uxs := coin.CreateUnspents(b.Head, txn) + for _, u := range uxs { + if u.Body.Address.String() == addr { + return &u, nil + } + } + return nil, nil +} + +func TestProcessBlock(t *testing.T) { + db, teardown := prepareDB(t) + defer teardown() + bc := newBlockchain() + gb := bc.CreateGenesisBlock(genAddress, genCoins, genTime) + + // create + hisDB := New() + + err := db.Update("", func(tx *dbutil.Tx) error { + err := hisDB.ParseBlock(tx, gb) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) + /* + + |-2RxP5N26GhDqHrP6SK45ZzEMSmSpeUeWxsS + genesisAddr ==>| |-2RxP5N26GhDqHrP6SK45ZzEMSmSpeUeWxsS + |-222uMeCeL1PbkJGZJDgAz5sib2uisv9hYUm ==>| + |-222uMeCeL1PbkJGZJDgAz5sib2uisv9hYUm + */ + + testData := []testData{ + { + PreBlockHash: gb.HashHeader(), + Vin: txIn{ + SigKey: genSecret.Hex(), + Addr: genAddress.String(), + TxID: gb.Body.Transactions[0].Hash(), + BlockSeq: 0, + }, + Vouts: []txOut{ + { + ToAddr: "2RxP5N26GhDqHrP6SK45ZzEMSmSpeUeWxsS", + Coins: 10e6, + Hours: 100, + }, + { + ToAddr: "222uMeCeL1PbkJGZJDgAz5sib2uisv9hYUm", + Coins: genCoins - 10e6, + Hours: 400, + }, + }, + AddrInNum: map[string]int{ + "2RxP5N26GhDqHrP6SK45ZzEMSmSpeUeWxsS": 1, + "222uMeCeL1PbkJGZJDgAz5sib2uisv9hYUm": 1, + }, + AddrOutNum: map[string]int{ + genAddress.String(): 1, + }, + }, + { + Vin: txIn{ + Addr: "222uMeCeL1PbkJGZJDgAz5sib2uisv9hYUm", + SigKey: "62f4d675d991c41a2819d908a4fcf4ba44ff0c31564039e80508c9d68197f90c", + BlockSeq: 1, + }, + Vouts: []txOut{ + { + ToAddr: "2RxP5N26GhDqHrP6SK45ZzEMSmSpeUeWxsS", + Coins: 10e6, + Hours: 100, + }, + { + ToAddr: "222uMeCeL1PbkJGZJDgAz5sib2uisv9hYUm", + Coins: 1000e6 - 20e6, + Hours: 100, + }, + }, + AddrInNum: map[string]int{ + "2RxP5N26GhDqHrP6SK45ZzEMSmSpeUeWxsS": 2, + "222uMeCeL1PbkJGZJDgAz5sib2uisv9hYUm": 2, + }, + AddrOutNum: map[string]int{ + "222uMeCeL1PbkJGZJDgAz5sib2uisv9hYUm": 1, + }, + }, + } + + testEngine(t, testData, bc, hisDB, db) +} + +func testEngine(t *testing.T, tds []testData, bc *fakeBlockchain, hdb *HistoryDB, db *dbutil.DB) { + for i, td := range tds { + b, txn, err := addBlock(bc, td, incTime*(uint64(i)+1)) + require.NoError(t, err) + + // update the next block test data. + if i+1 < len(tds) { + // update UxOut of next test data. + tds[i+1].Vin.TxID = txn.Hash() + tds[i+1].PreBlockHash = b.HashHeader() + } + + err = db.Update("", func(tx *dbutil.Tx) error { + err := hdb.ParseBlock(tx, *b) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) + + // check txn + txnInBkt := Transaction{} + k := txn.Hash() + mustGetBucketValue(t, db, TransactionsBkt, k[:], &txnInBkt) + require.Equal(t, &txnInBkt.Txn, txn) + + // check outputs + for _, o := range td.Vouts { + ux, err := getUx(bc, uint64(i+1), txn.Hash(), o.ToAddr) + require.NoError(t, err) + + uxInDB := UxOut{} + uxKey := ux.Hash() + mustGetBucketValue(t, db, UxOutsBkt, uxKey[:], &uxInDB) + require.Equal(t, &uxInDB.Out, ux) + } + + // check addr in + for _, o := range td.Vouts { + addr := cipher.MustDecodeBase58Address(o.ToAddr) + uxHashes := []cipher.SHA256{} + mustGetBucketValue(t, db, AddressUxBkt, addr.Bytes(), &uxHashes) + require.Equal(t, len(uxHashes), td.AddrInNum[o.ToAddr]) + } + } +} + +func addBlock(bc *fakeBlockchain, td testData, tm uint64) (*coin.Block, *coin.Transaction, error) { + txn := coin.Transaction{} + // get unspent output + ux, err := getUx(bc, td.Vin.BlockSeq, td.Vin.TxID, td.Vin.Addr) + if err != nil { + return nil, nil, err + } + if ux == nil { + return nil, nil, errors.New("no unspent output") + } + + if err := txn.PushInput(ux.Hash()); err != nil { + return nil, nil, err + } + + for _, o := range td.Vouts { + addr, err := cipher.DecodeBase58Address(o.ToAddr) + if err != nil { + return nil, nil, err + } + if err := txn.PushOutput(addr, o.Coins, o.Hours); err != nil { + return nil, nil, err + } + } + + sigKey := cipher.MustSecKeyFromHex(td.Vin.SigKey) + txn.SignInputs([]cipher.SecKey{sigKey}) + if err := txn.UpdateHeader(); err != nil { + return nil, nil, err + } + if err := bc.VerifyTransaction(txn); err != nil { + return nil, nil, err + } + preBlock := bc.GetBlock(td.PreBlockHash) + b := newBlock(*preBlock, tm, bc.uxhash, coin.Transactions{txn}, feeCalc) + + // uxs, err := bc.ExecuteBlock(&b) + _, err = bc.ExecuteBlock(&b) + if err != nil { + return nil, nil, err + } + return &b, &txn, nil +} + +func mustGetBucketValue(t *testing.T, db *dbutil.DB, name []byte, key []byte, value interface{}) { + err := db.View("", func(tx *dbutil.Tx) error { + ok, err := dbutil.GetBucketObjectDecoded(tx, name, key, value) + require.NoError(t, err) + require.True(t, ok) + return err + }) + require.NoError(t, err) +} + +func newBlock(prev coin.Block, currentTime uint64, uxHash cipher.SHA256, txns coin.Transactions, calc coin.FeeCalculator) coin.Block { + if len(txns) == 0 { + log.Panic("Refusing to create block with no transactions") + } + fee, err := txns.Fees(calc) + if err != nil { + // This should have been caught earlier + log.Panicf("Invalid transaction fees: %v", err) + } + body := coin.BlockBody{Transactions: txns} + return coin.Block{ + Head: newBlockHeader(prev.Head, uxHash, currentTime, fee, body), + Body: body, + } +} + +func newBlockHeader(prev coin.BlockHeader, uxHash cipher.SHA256, currentTime, fee uint64, body coin.BlockBody) coin.BlockHeader { + prevHash := prev.Hash() + bodyHash := body.Hash() + return coin.BlockHeader{ + BodyHash: bodyHash, + Version: prev.Version, + PrevHash: prevHash, + Time: currentTime, + BkSeq: prev.BkSeq + 1, + Fee: fee, + UxHash: uxHash, + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/output.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/output.go new file mode 100644 index 00000000..efa3238c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/output.go @@ -0,0 +1,102 @@ +package historydb + +import ( + "fmt" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +//go:generate skyencoder -unexported -struct UxOut + +// UxOutsBkt holds unspent outputs +var UxOutsBkt = []byte("uxouts") + +// UxOut expend coin.UxOut struct +type UxOut struct { + Out coin.UxOut + SpentTxnID cipher.SHA256 // id of tx which spent this output. + SpentBlockSeq uint64 // block seq that spent the output. +} + +// Hash returns outhash +func (o UxOut) Hash() cipher.SHA256 { + return o.Out.Hash() +} + +// ErrUxOutNotExist is returned if an uxout is not found in historydb +type ErrUxOutNotExist struct { + UxID string +} + +// NewErrUxOutNotExist creates ErrUxOutNotExist from a UxID +func NewErrUxOutNotExist(uxID string) error { + return ErrUxOutNotExist{ + UxID: uxID, + } +} + +func (e ErrUxOutNotExist) Error() string { + return fmt.Sprintf("uxout of %s does not exist", e.UxID) +} + +// uxOuts bucket stores outputs, UxOut hash as key and Output as value. +type uxOuts struct{} + +// put sets out value +func (ux *uxOuts) put(tx *dbutil.Tx, out UxOut) error { + hash := out.Hash() + + buf, err := encodeUxOut(&out) + if err != nil { + return err + } + + return dbutil.PutBucketValue(tx, UxOutsBkt, hash[:], buf) +} + +// get gets UxOut of given id +func (ux *uxOuts) get(tx *dbutil.Tx, uxID cipher.SHA256) (*UxOut, error) { + var out UxOut + + v, err := dbutil.GetBucketValueNoCopy(tx, UxOutsBkt, uxID[:]) + if err != nil { + return nil, err + } else if v == nil { + return nil, nil + } + + if err := decodeUxOutExact(v, &out); err != nil { + return nil, err + } + + return &out, nil +} + +// getArray returns uxOuts for a set of uxids, will return error if any of the uxids do not exist +func (ux *uxOuts) getArray(tx *dbutil.Tx, uxIDs []cipher.SHA256) ([]UxOut, error) { + var outs []UxOut + for _, uxID := range uxIDs { + out, err := ux.get(tx, uxID) + if err != nil { + return nil, err + } else if out == nil { + return nil, NewErrUxOutNotExist(uxID.Hex()) + } + + outs = append(outs, *out) + } + + return outs, nil +} + +// isEmpty checks if the uxout bucekt is empty +func (ux *uxOuts) isEmpty(tx *dbutil.Tx) (bool, error) { + return dbutil.IsEmpty(tx, UxOutsBkt) +} + +// reset resets the bucket +func (ux *uxOuts) reset(tx *dbutil.Tx) error { + return dbutil.Reset(tx, UxOutsBkt) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/transaction.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/transaction.go new file mode 100644 index 00000000..2addd633 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/transaction.go @@ -0,0 +1,107 @@ +package historydb + +// transaction.go mainly provides transaction corresponding buckets and apis, +// The transactions bucket, tx hash as key, and tx as value, it's the main bucket that stores the +// transaction value. All other buckets that index different field of transaction will only records the +// transaction hash, and get the tx value from transactions bucket. + +import ( + "errors" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +//go:generate skyencoder -unexported -struct Transaction + +// Transaction contains transaction info and the seq of block which executed this block. +type Transaction struct { + Txn coin.Transaction + BlockSeq uint64 +} + +// Hash return the Txn hash. +func (txn *Transaction) Hash() cipher.SHA256 { + return txn.Txn.Hash() +} + +// TransactionsBkt holds Transactions +var TransactionsBkt = []byte("transactions") + +// Transactions transaction bucket instance. +type transactions struct{} + +// put transaction in the db +func (txs *transactions) put(tx *dbutil.Tx, txn *Transaction) error { + hash := txn.Hash() + buf, err := encodeTransaction(txn) + if err != nil { + return err + } + + return dbutil.PutBucketValue(tx, TransactionsBkt, hash[:], buf) +} + +// get gets transaction by transaction hash, return nil on not found +func (txs *transactions) get(tx *dbutil.Tx, hash cipher.SHA256) (*Transaction, error) { + var txn Transaction + + v, err := dbutil.GetBucketValueNoCopy(tx, TransactionsBkt, hash[:]) + if err != nil { + return nil, err + } else if v == nil { + return nil, nil + } + + if err := decodeTransactionExact(v, &txn); err != nil { + return nil, err + } + + return &txn, nil +} + +// getArray returns transactions slice of given hashes +func (txs *transactions) getArray(tx *dbutil.Tx, hashes []cipher.SHA256) ([]Transaction, error) { + txns := make([]Transaction, 0, len(hashes)) + for _, h := range hashes { + txn, err := txs.get(tx, h) + if err != nil { + return nil, err + } + if txn == nil { + return nil, errors.New("Transaction not found") + } + + txns = append(txns, *txn) + } + + return txns, nil +} + +// isEmpty checks if transaction bucket is empty +func (txs *transactions) isEmpty(tx *dbutil.Tx) (bool, error) { + return dbutil.IsEmpty(tx, TransactionsBkt) +} + +// reset resets the bucket +func (txs *transactions) reset(tx *dbutil.Tx) error { + return dbutil.Reset(tx, TransactionsBkt) +} + +// forEach traverses the transactions in db +func (txs *transactions) forEach(tx *dbutil.Tx, f func(cipher.SHA256, *Transaction) error) error { + return dbutil.ForEach(tx, TransactionsBkt, func(k, v []byte) error { + hash, err := cipher.SHA256FromBytes(k) + if err != nil { + return err + } + + var txn Transaction + if err := decodeTransactionExact(v, &txn); err != nil { + return err + } + + return f(hash, &txn) + }) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/transaction_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/transaction_skyencoder.go new file mode 100644 index 00000000..36f2d59b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/transaction_skyencoder.go @@ -0,0 +1,373 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package historydb + +import ( + "errors" + "math" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" + "github.com/SkycoinProject/skycoin/src/coin" +) + +// encodeSizeTransaction computes the size of an encoded object of type Transaction +func encodeSizeTransaction(obj *Transaction) uint64 { + i0 := uint64(0) + + // obj.Txn.Length + i0 += 4 + + // obj.Txn.Type + i0++ + + // obj.Txn.InnerHash + i0 += 32 + + // obj.Txn.Sigs + i0 += 4 + { + i1 := uint64(0) + + // x1 + i1 += 65 + + i0 += uint64(len(obj.Txn.Sigs)) * i1 + } + + // obj.Txn.In + i0 += 4 + { + i1 := uint64(0) + + // x1 + i1 += 32 + + i0 += uint64(len(obj.Txn.In)) * i1 + } + + // obj.Txn.Out + i0 += 4 + { + i1 := uint64(0) + + // x1.Address.Version + i1++ + + // x1.Address.Key + i1 += 20 + + // x1.Coins + i1 += 8 + + // x1.Hours + i1 += 8 + + i0 += uint64(len(obj.Txn.Out)) * i1 + } + + // obj.BlockSeq + i0 += 8 + + return i0 +} + +// encodeTransaction encodes an object of type Transaction to a buffer allocated to the exact size +// required to encode the object. +func encodeTransaction(obj *Transaction) ([]byte, error) { + n := encodeSizeTransaction(obj) + buf := make([]byte, n) + + if err := encodeTransactionToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeTransactionToBuffer encodes an object of type Transaction to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeTransactionToBuffer(buf []byte, obj *Transaction) error { + if uint64(len(buf)) < encodeSizeTransaction(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Txn.Length + e.Uint32(obj.Txn.Length) + + // obj.Txn.Type + e.Uint8(obj.Txn.Type) + + // obj.Txn.InnerHash + e.CopyBytes(obj.Txn.InnerHash[:]) + + // obj.Txn.Sigs maxlen check + if len(obj.Txn.Sigs) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // obj.Txn.Sigs length check + if uint64(len(obj.Txn.Sigs)) > math.MaxUint32 { + return errors.New("obj.Txn.Sigs length exceeds math.MaxUint32") + } + + // obj.Txn.Sigs length + e.Uint32(uint32(len(obj.Txn.Sigs))) + + // obj.Txn.Sigs + for _, x := range obj.Txn.Sigs { + + // x + e.CopyBytes(x[:]) + + } + + // obj.Txn.In maxlen check + if len(obj.Txn.In) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // obj.Txn.In length check + if uint64(len(obj.Txn.In)) > math.MaxUint32 { + return errors.New("obj.Txn.In length exceeds math.MaxUint32") + } + + // obj.Txn.In length + e.Uint32(uint32(len(obj.Txn.In))) + + // obj.Txn.In + for _, x := range obj.Txn.In { + + // x + e.CopyBytes(x[:]) + + } + + // obj.Txn.Out maxlen check + if len(obj.Txn.Out) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // obj.Txn.Out length check + if uint64(len(obj.Txn.Out)) > math.MaxUint32 { + return errors.New("obj.Txn.Out length exceeds math.MaxUint32") + } + + // obj.Txn.Out length + e.Uint32(uint32(len(obj.Txn.Out))) + + // obj.Txn.Out + for _, x := range obj.Txn.Out { + + // x.Address.Version + e.Uint8(x.Address.Version) + + // x.Address.Key + e.CopyBytes(x.Address.Key[:]) + + // x.Coins + e.Uint64(x.Coins) + + // x.Hours + e.Uint64(x.Hours) + + } + + // obj.BlockSeq + e.Uint64(obj.BlockSeq) + + return nil +} + +// decodeTransaction decodes an object of type Transaction from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeTransaction(buf []byte, obj *Transaction) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Txn.Length + i, err := d.Uint32() + if err != nil { + return 0, err + } + obj.Txn.Length = i + } + + { + // obj.Txn.Type + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Txn.Type = i + } + + { + // obj.Txn.InnerHash + if len(d.Buffer) < len(obj.Txn.InnerHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Txn.InnerHash[:], d.Buffer[:len(obj.Txn.InnerHash)]) + d.Buffer = d.Buffer[len(obj.Txn.InnerHash):] + } + + { + // obj.Txn.Sigs + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Txn.Sigs = make([]cipher.Sig, length) + + for z2 := range obj.Txn.Sigs { + { + // obj.Txn.Sigs[z2] + if len(d.Buffer) < len(obj.Txn.Sigs[z2]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Txn.Sigs[z2][:], d.Buffer[:len(obj.Txn.Sigs[z2])]) + d.Buffer = d.Buffer[len(obj.Txn.Sigs[z2]):] + } + + } + } + } + + { + // obj.Txn.In + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Txn.In = make([]cipher.SHA256, length) + + for z2 := range obj.Txn.In { + { + // obj.Txn.In[z2] + if len(d.Buffer) < len(obj.Txn.In[z2]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Txn.In[z2][:], d.Buffer[:len(obj.Txn.In[z2])]) + d.Buffer = d.Buffer[len(obj.Txn.In[z2]):] + } + + } + } + } + + { + // obj.Txn.Out + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Txn.Out = make([]coin.TransactionOutput, length) + + for z2 := range obj.Txn.Out { + { + // obj.Txn.Out[z2].Address.Version + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Txn.Out[z2].Address.Version = i + } + + { + // obj.Txn.Out[z2].Address.Key + if len(d.Buffer) < len(obj.Txn.Out[z2].Address.Key) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Txn.Out[z2].Address.Key[:], d.Buffer[:len(obj.Txn.Out[z2].Address.Key)]) + d.Buffer = d.Buffer[len(obj.Txn.Out[z2].Address.Key):] + } + + { + // obj.Txn.Out[z2].Coins + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Txn.Out[z2].Coins = i + } + + { + // obj.Txn.Out[z2].Hours + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Txn.Out[z2].Hours = i + } + + } + } + } + + { + // obj.BlockSeq + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.BlockSeq = i + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeTransactionExact decodes an object of type Transaction from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeTransactionExact(buf []byte, obj *Transaction) error { + if n, err := decodeTransaction(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/transaction_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/transaction_skyencoder_test.go new file mode 100644 index 00000000..b2cb84aa --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/transaction_skyencoder_test.go @@ -0,0 +1,421 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package historydb + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +func newEmptyTransactionForEncodeTest() *Transaction { + var obj Transaction + return &obj +} + +func newRandomTransactionForEncodeTest(t *testing.T, rand *mathrand.Rand) *Transaction { + var obj Transaction + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenTransactionForEncodeTest(t *testing.T, rand *mathrand.Rand) *Transaction { + var obj Transaction + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilTransactionForEncodeTest(t *testing.T, rand *mathrand.Rand) *Transaction { + var obj Transaction + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderTransaction(t *testing.T, obj *Transaction) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeTransaction(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeTransaction() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeTransaction(obj) + if err != nil { + t.Fatalf("encodeTransaction failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeTransaction produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeTransaction()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeTransactionToBuffer(data3, obj); err != nil { + t.Fatalf("encodeTransactionToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 Transaction + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 Transaction + if n, err := decodeTransaction(data2, &obj3); err != nil { + t.Fatalf("decodeTransaction failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeTransaction bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeTransaction()") + } + + // Decode, excess buffer + var obj4 Transaction + n, err := decodeTransaction(data3, &obj4) + if err != nil { + t.Fatalf("decodeTransaction failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeTransaction bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeTransaction bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeTransaction()") + } + + // DecodeExact + var obj5 Transaction + if err := decodeTransactionExact(data2, &obj5); err != nil { + t.Fatalf("decodeTransaction failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeTransaction()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeTransaction(data4, &obj3); err != nil { + t.Fatalf("decodeTransaction failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeTransaction bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderTransaction(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *Transaction + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptyTransactionForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomTransactionForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenTransactionForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilTransactionForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderTransaction(t, tc.obj) + }) + } +} + +func decodeTransactionExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj Transaction + if _, err := decodeTransaction(buf, &obj); err == nil { + t.Fatal("decodeTransaction: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeTransaction: expected error %q, got %q", expectedErr, err) + } +} + +func decodeTransactionExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj Transaction + if err := decodeTransactionExact(buf, &obj); err == nil { + t.Fatal("decodeTransactionExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeTransactionExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderTransactionDecodeErrors(t *testing.T, k int, tag string, obj *Transaction) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeTransaction(obj) + buf, err := encodeTransaction(obj) + if err != nil { + t.Fatalf("encodeTransaction failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeTransactionExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeTransactionExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeTransactionExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeTransactionExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeTransactionExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderTransactionDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptyTransactionForEncodeTest() + fullObj := newRandomTransactionForEncodeTest(t, rand) + testSkyencoderTransactionDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderTransactionDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/transaction_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/transaction_test.go new file mode 100644 index 00000000..b94867a9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/transaction_test.go @@ -0,0 +1,211 @@ +package historydb + +import ( + "errors" + "math/rand" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +// set rand seed. +var _ = func() int64 { + t := time.Now().Unix() + rand.Seed(t) + return t +}() + +func TestTransactionGet(t *testing.T) { + txns := make([]Transaction, 0, 3) + for i := 0; i < 3; i++ { + txns = append(txns, makeTransaction(t)) + } + + txnHashes := make([]cipher.SHA256, len(txns)) + for i, x := range txns { + txnHashes[i] = x.Hash() + } + + testCases := []struct { + name string + hash cipher.SHA256 + expect *Transaction + }{ + { + name: "get first", + hash: txnHashes[0], + expect: &txns[0], + }, + { + name: "get second", + hash: txnHashes[1], + expect: &txns[1], + }, + { + name: "not exist", + hash: txnHashes[2], + expect: nil, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + db, td := prepareDB(t) + defer td() + + txsBkt := &transactions{} + + // init the bkt + err := db.Update("", func(tx *dbutil.Tx) error { + for _, txn := range txns[:2] { + err := txsBkt.put(tx, &txn) + require.NoError(t, err) + } + return nil + }) + require.NoError(t, err) + + // get slice + err = db.View("", func(tx *dbutil.Tx) error { + ts, err := txsBkt.get(tx, tc.hash) + require.NoError(t, err) + require.Equal(t, tc.expect, ts) + return nil + }) + require.NoError(t, err) + }) + } +} + +func TestTransactionGetArray(t *testing.T) { + txns := make([]Transaction, 0, 4) + for i := 0; i < 4; i++ { + txns = append(txns, makeTransaction(t)) + } + + txnHashes := make([]cipher.SHA256, len(txns)) + for i, x := range txns { + txnHashes[i] = x.Hash() + } + + testCases := []struct { + name string + hashes []cipher.SHA256 + expect []Transaction + err error + }{ + { + name: "get one", + hashes: []cipher.SHA256{ + txnHashes[0], + }, + expect: txns[:1], + }, + + { + name: "get two", + hashes: []cipher.SHA256{ + txnHashes[0], + txnHashes[1], + }, + expect: txns[:2], + }, + + { + name: "get all", + hashes: []cipher.SHA256{ + txnHashes[0], + txnHashes[1], + txnHashes[2], + }, + expect: txns[:3], + }, + + { + name: "not exist", + hashes: []cipher.SHA256{ + txnHashes[3], + }, + err: errors.New("Transaction not found"), + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + db, td := prepareDB(t) + defer td() + txsBkt := &transactions{} + + // init the bkt + err := db.Update("", func(tx *dbutil.Tx) error { + for _, txn := range txns[:3] { + err := txsBkt.put(tx, &txn) + require.NoError(t, err) + } + return nil + }) + require.NoError(t, err) + + // get slice + err = db.View("", func(tx *dbutil.Tx) error { + ts, err := txsBkt.getArray(tx, tc.hashes) + if tc.err != nil { + require.Equal(t, tc.err, err) + return nil + } + require.NoError(t, err) + require.Equal(t, tc.expect, ts) + return nil + }) + require.NoError(t, err) + }) + } +} + +func makeTransaction(t *testing.T) Transaction { + txn := Transaction{} + ux, s := makeUxOutWithSecret(t) + + err := txn.Txn.PushInput(ux.Hash()) + require.NoError(t, err) + err = txn.Txn.PushOutput(makeAddress(), 1e6, 50) + require.NoError(t, err) + err = txn.Txn.PushOutput(makeAddress(), 5e6, 50) + require.NoError(t, err) + txn.Txn.SignInputs([]cipher.SecKey{s}) + err = txn.Txn.UpdateHeader() + require.NoError(t, err) + return txn +} + +func makeAddress() cipher.Address { + p, _ := cipher.GenerateKeyPair() + return cipher.AddressFromPubKey(p) +} + +func makeUxBodyWithSecret(t *testing.T) (coin.UxBody, cipher.SecKey) { + p, s := cipher.GenerateKeyPair() + return coin.UxBody{ + SrcTransaction: testutil.RandSHA256(t), + Address: cipher.AddressFromPubKey(p), + Coins: 1e6, + Hours: 100, + }, s +} + +func makeUxOutWithSecret(t *testing.T) (coin.UxOut, cipher.SecKey) { + body, sec := makeUxBodyWithSecret(t) + return coin.UxOut{ + Head: coin.UxHead{ + Time: 100, + BkSeq: 2, + }, + Body: body, + }, sec +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/ux_out_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/ux_out_skyencoder.go new file mode 100644 index 00000000..eae70069 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/ux_out_skyencoder.go @@ -0,0 +1,198 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package historydb + +import "github.com/SkycoinProject/skycoin/src/cipher/encoder" + +// encodeSizeUxOut computes the size of an encoded object of type UxOut +func encodeSizeUxOut(obj *UxOut) uint64 { + i0 := uint64(0) + + // obj.Out.Head.Time + i0 += 8 + + // obj.Out.Head.BkSeq + i0 += 8 + + // obj.Out.Body.SrcTransaction + i0 += 32 + + // obj.Out.Body.Address.Version + i0++ + + // obj.Out.Body.Address.Key + i0 += 20 + + // obj.Out.Body.Coins + i0 += 8 + + // obj.Out.Body.Hours + i0 += 8 + + // obj.SpentTxnID + i0 += 32 + + // obj.SpentBlockSeq + i0 += 8 + + return i0 +} + +// encodeUxOut encodes an object of type UxOut to a buffer allocated to the exact size +// required to encode the object. +func encodeUxOut(obj *UxOut) ([]byte, error) { + n := encodeSizeUxOut(obj) + buf := make([]byte, n) + + if err := encodeUxOutToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeUxOutToBuffer encodes an object of type UxOut to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeUxOutToBuffer(buf []byte, obj *UxOut) error { + if uint64(len(buf)) < encodeSizeUxOut(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Out.Head.Time + e.Uint64(obj.Out.Head.Time) + + // obj.Out.Head.BkSeq + e.Uint64(obj.Out.Head.BkSeq) + + // obj.Out.Body.SrcTransaction + e.CopyBytes(obj.Out.Body.SrcTransaction[:]) + + // obj.Out.Body.Address.Version + e.Uint8(obj.Out.Body.Address.Version) + + // obj.Out.Body.Address.Key + e.CopyBytes(obj.Out.Body.Address.Key[:]) + + // obj.Out.Body.Coins + e.Uint64(obj.Out.Body.Coins) + + // obj.Out.Body.Hours + e.Uint64(obj.Out.Body.Hours) + + // obj.SpentTxnID + e.CopyBytes(obj.SpentTxnID[:]) + + // obj.SpentBlockSeq + e.Uint64(obj.SpentBlockSeq) + + return nil +} + +// decodeUxOut decodes an object of type UxOut from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeUxOut(buf []byte, obj *UxOut) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Out.Head.Time + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Out.Head.Time = i + } + + { + // obj.Out.Head.BkSeq + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Out.Head.BkSeq = i + } + + { + // obj.Out.Body.SrcTransaction + if len(d.Buffer) < len(obj.Out.Body.SrcTransaction) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Out.Body.SrcTransaction[:], d.Buffer[:len(obj.Out.Body.SrcTransaction)]) + d.Buffer = d.Buffer[len(obj.Out.Body.SrcTransaction):] + } + + { + // obj.Out.Body.Address.Version + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Out.Body.Address.Version = i + } + + { + // obj.Out.Body.Address.Key + if len(d.Buffer) < len(obj.Out.Body.Address.Key) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Out.Body.Address.Key[:], d.Buffer[:len(obj.Out.Body.Address.Key)]) + d.Buffer = d.Buffer[len(obj.Out.Body.Address.Key):] + } + + { + // obj.Out.Body.Coins + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Out.Body.Coins = i + } + + { + // obj.Out.Body.Hours + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Out.Body.Hours = i + } + + { + // obj.SpentTxnID + if len(d.Buffer) < len(obj.SpentTxnID) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.SpentTxnID[:], d.Buffer[:len(obj.SpentTxnID)]) + d.Buffer = d.Buffer[len(obj.SpentTxnID):] + } + + { + // obj.SpentBlockSeq + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.SpentBlockSeq = i + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeUxOutExact decodes an object of type UxOut from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeUxOutExact(buf []byte, obj *UxOut) error { + if n, err := decodeUxOut(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/ux_out_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/ux_out_skyencoder_test.go new file mode 100644 index 00000000..08212b90 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/ux_out_skyencoder_test.go @@ -0,0 +1,421 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package historydb + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +func newEmptyUxOutForEncodeTest() *UxOut { + var obj UxOut + return &obj +} + +func newRandomUxOutForEncodeTest(t *testing.T, rand *mathrand.Rand) *UxOut { + var obj UxOut + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenUxOutForEncodeTest(t *testing.T, rand *mathrand.Rand) *UxOut { + var obj UxOut + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilUxOutForEncodeTest(t *testing.T, rand *mathrand.Rand) *UxOut { + var obj UxOut + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderUxOut(t *testing.T, obj *UxOut) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeUxOut(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeUxOut() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeUxOut(obj) + if err != nil { + t.Fatalf("encodeUxOut failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeUxOut produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeUxOut()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeUxOutToBuffer(data3, obj); err != nil { + t.Fatalf("encodeUxOutToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 UxOut + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 UxOut + if n, err := decodeUxOut(data2, &obj3); err != nil { + t.Fatalf("decodeUxOut failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeUxOut bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeUxOut()") + } + + // Decode, excess buffer + var obj4 UxOut + n, err := decodeUxOut(data3, &obj4) + if err != nil { + t.Fatalf("decodeUxOut failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeUxOut bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeUxOut bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeUxOut()") + } + + // DecodeExact + var obj5 UxOut + if err := decodeUxOutExact(data2, &obj5); err != nil { + t.Fatalf("decodeUxOut failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeUxOut()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeUxOut(data4, &obj3); err != nil { + t.Fatalf("decodeUxOut failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeUxOut bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderUxOut(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *UxOut + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptyUxOutForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomUxOutForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenUxOutForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilUxOutForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderUxOut(t, tc.obj) + }) + } +} + +func decodeUxOutExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj UxOut + if _, err := decodeUxOut(buf, &obj); err == nil { + t.Fatal("decodeUxOut: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeUxOut: expected error %q, got %q", expectedErr, err) + } +} + +func decodeUxOutExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj UxOut + if err := decodeUxOutExact(buf, &obj); err == nil { + t.Fatal("decodeUxOutExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeUxOutExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderUxOutDecodeErrors(t *testing.T, k int, tag string, obj *UxOut) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeUxOut(obj) + buf, err := encodeUxOut(obj) + if err != nil { + t.Fatalf("encodeUxOut failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeUxOutExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeUxOutExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeUxOutExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeUxOutExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeUxOutExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderUxOutDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptyUxOutForEncodeTest() + fullObj := newRandomUxOutForEncodeTest(t, rand) + testSkyencoderUxOutDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderUxOutDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/verify.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/verify.go new file mode 100644 index 00000000..04f81a59 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/historydb/verify.go @@ -0,0 +1,129 @@ +package historydb + +import ( + "errors" + "reflect" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +var ( + // ErrVerifyStopped is returned when database verification is interrupted + ErrVerifyStopped = errors.New("database verification stopped") +) + +// VerifyDBSkyencoderSafe verifies that the skyencoder generated code has the same result as the encoder +// for all data in the blockchain +func VerifyDBSkyencoderSafe(tx *dbutil.Tx, quit <-chan struct{}) error { + if quit == nil { + quit = make(chan struct{}) + } + + if err := dbutil.ForEach(tx, AddressTxnsBkt, func(_, v []byte) error { + select { + case <-quit: + return ErrVerifyStopped + default: + } + + var b1 hashesWrapper + if err := decodeHashesWrapperExact(v, &b1); err != nil { + return err + } + + var b2 []cipher.SHA256 + if err := encoder.DeserializeRawExact(v, &b2); err != nil { + return err + } + + if !reflect.DeepEqual(b1.Hashes, b2) { + return errors.New("AddressTxnsBkt sha256 hashes mismatch") + } + + return nil + }); err != nil { + return err + } + + if err := dbutil.ForEach(tx, AddressUxBkt, func(_, v []byte) error { + select { + case <-quit: + return ErrVerifyStopped + default: + } + + var b1 hashesWrapper + if err := decodeHashesWrapperExact(v, &b1); err != nil { + return err + } + + var b2 []cipher.SHA256 + if err := encoder.DeserializeRawExact(v, &b2); err != nil { + return err + } + + if !reflect.DeepEqual(b1.Hashes, b2) { + return errors.New("AddressUxBkt sha256 hashes mismatch") + } + + return nil + }); err != nil { + return err + } + + if err := dbutil.ForEach(tx, UxOutsBkt, func(_, v []byte) error { + select { + case <-quit: + return ErrVerifyStopped + default: + } + + var b1 UxOut + if err := decodeUxOutExact(v, &b1); err != nil { + return err + } + + var b2 UxOut + if err := encoder.DeserializeRawExact(v, &b2); err != nil { + return err + } + + if !reflect.DeepEqual(b1, b2) { + return errors.New("UxOutsBkt ux out mismatch") + } + + return nil + }); err != nil { + return err + } + + if err := dbutil.ForEach(tx, TransactionsBkt, func(_, v []byte) error { + select { + case <-quit: + return ErrVerifyStopped + default: + } + + var b1 Transaction + if err := decodeTransactionExact(v, &b1); err != nil { + return err + } + + var b2 Transaction + if err := encoder.DeserializeRawExact(v, &b2); err != nil { + return err + } + + if !reflect.DeepEqual(b1, b2) { + return errors.New("TransactionsBkt ux out mismatch") + } + + return nil + }); err != nil { + return err + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/interfaces.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/interfaces.go new file mode 100644 index 00000000..8db4dbd5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/interfaces.go @@ -0,0 +1,71 @@ +package visor + +import ( + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/visor/blockdb" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" + "github.com/SkycoinProject/skycoin/src/visor/historydb" +) + +//go:generate mockery -name Historyer -case underscore -inpkg -testonly +//go:generate mockery -name Blockchainer -case underscore -inpkg -testonly +//go:generate mockery -name UnconfirmedTransactionPooler -case underscore -inpkg -testonly + +// Historyer is the interface that provides methods for accessing history data that are parsed from blockchain. +type Historyer interface { + GetUxOuts(tx *dbutil.Tx, uxids []cipher.SHA256) ([]historydb.UxOut, error) + ParseBlock(tx *dbutil.Tx, b coin.Block) error + GetTransaction(tx *dbutil.Tx, hash cipher.SHA256) (*historydb.Transaction, error) + GetOutputsForAddress(tx *dbutil.Tx, address cipher.Address) ([]historydb.UxOut, error) + GetTransactionsForAddress(tx *dbutil.Tx, address cipher.Address) ([]historydb.Transaction, error) + AddressSeen(tx *dbutil.Tx, address cipher.Address) (bool, error) + NeedsReset(tx *dbutil.Tx) (bool, error) + Erase(tx *dbutil.Tx) error + ParsedBlockSeq(tx *dbutil.Tx) (uint64, bool, error) + ForEachTxn(tx *dbutil.Tx, f func(cipher.SHA256, *historydb.Transaction) error) error +} + +// Blockchainer is the interface that provides methods for accessing the blockchain data +type Blockchainer interface { + GetGenesisBlock(tx *dbutil.Tx) (*coin.SignedBlock, error) + GetBlocks(tx *dbutil.Tx, seqs []uint64) ([]coin.SignedBlock, error) + GetBlocksInRange(tx *dbutil.Tx, start, end uint64) ([]coin.SignedBlock, error) + GetLastBlocks(tx *dbutil.Tx, n uint64) ([]coin.SignedBlock, error) + GetSignedBlockByHash(tx *dbutil.Tx, hash cipher.SHA256) (*coin.SignedBlock, error) + GetSignedBlockBySeq(tx *dbutil.Tx, seq uint64) (*coin.SignedBlock, error) + Unspent() blockdb.UnspentPooler + Len(tx *dbutil.Tx) (uint64, error) + Head(tx *dbutil.Tx) (*coin.SignedBlock, error) + HeadSeq(tx *dbutil.Tx) (uint64, bool, error) + Time(tx *dbutil.Tx) (uint64, error) + NewBlock(tx *dbutil.Tx, txns coin.Transactions, currentTime uint64) (*coin.Block, error) + ExecuteBlock(tx *dbutil.Tx, sb *coin.SignedBlock) error + VerifyBlock(tx *dbutil.Tx, sb *coin.SignedBlock) error + VerifyBlockTxnConstraints(tx *dbutil.Tx, txn coin.Transaction) error + VerifySingleTxnHardConstraints(tx *dbutil.Tx, txn coin.Transaction, signed TxnSignedFlag) error + VerifySingleTxnSoftHardConstraints(tx *dbutil.Tx, txn coin.Transaction, distParams params.Distribution, verifyParams params.VerifyTxn, signed TxnSignedFlag) (*coin.SignedBlock, coin.UxArray, error) + TransactionFee(tx *dbutil.Tx, hours uint64) coin.FeeCalculator +} + +// UnconfirmedTransactionPooler is the interface that provides methods for +// accessing the unconfirmed transaction pool +type UnconfirmedTransactionPooler interface { + SetTransactionsAnnounced(tx *dbutil.Tx, hashes map[cipher.SHA256]int64) error + InjectTransaction(tx *dbutil.Tx, bc Blockchainer, t coin.Transaction, distParams params.Distribution, verifyParams params.VerifyTxn) (bool, *ErrTxnViolatesSoftConstraint, error) + AllRawTransactions(tx *dbutil.Tx) (coin.Transactions, error) + RemoveTransactions(tx *dbutil.Tx, txns []cipher.SHA256) error + Refresh(tx *dbutil.Tx, bc Blockchainer, distParams params.Distribution, verifyParams params.VerifyTxn) ([]cipher.SHA256, error) + RemoveInvalid(tx *dbutil.Tx, bc Blockchainer) ([]cipher.SHA256, error) + FilterKnown(tx *dbutil.Tx, txns []cipher.SHA256) ([]cipher.SHA256, error) + GetKnown(tx *dbutil.Tx, txns []cipher.SHA256) (coin.Transactions, error) + RecvOfAddresses(tx *dbutil.Tx, bh coin.BlockHeader, addrs []cipher.Address) (coin.AddressUxOuts, error) + GetIncomingOutputs(tx *dbutil.Tx, bh coin.BlockHeader) (coin.UxArray, error) + Get(tx *dbutil.Tx, hash cipher.SHA256) (*UnconfirmedTransaction, error) + GetFiltered(tx *dbutil.Tx, filter func(tx UnconfirmedTransaction) bool) ([]UnconfirmedTransaction, error) + GetHashes(tx *dbutil.Tx, filter func(tx UnconfirmedTransaction) bool) ([]cipher.SHA256, error) + ForEach(tx *dbutil.Tx, f func(cipher.SHA256, UnconfirmedTransaction) error) error + GetUnspentsOfAddr(tx *dbutil.Tx, addr cipher.Address) (coin.UxArray, error) + Len(tx *dbutil.Tx) (uint64, error) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/meta.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/meta.go new file mode 100644 index 00000000..7beea7d9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/meta.go @@ -0,0 +1,71 @@ +package visor + +import ( + "fmt" + + "github.com/blang/semver" + + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +var ( + // MetaBkt stores data about the application DB + MetaBkt = []byte("db_meta") + + versionKey = []byte("version") +) + +// GetDBVersion returns the saved DB version +func GetDBVersion(db *dbutil.DB) (*semver.Version, error) { + var v *semver.Version + if err := db.View("GetDBVersion", func(tx *dbutil.Tx) error { + var err error + v, err = getDBVersion(tx) + return err + }); err != nil { + return nil, err + } + + return v, nil +} + +func getDBVersion(tx *dbutil.Tx) (*semver.Version, error) { + v, err := dbutil.GetBucketValue(tx, MetaBkt, versionKey) + if err != nil { + switch err.(type) { + case dbutil.ErrBucketNotExist: + return nil, nil + default: + return nil, err + } + } else if v == nil { + return nil, nil + } + + sv, err := semver.Make(string(v)) + if err != nil { + return nil, err + } + + return &sv, nil +} + +// SetDBVersion sets the DB version +func SetDBVersion(db *dbutil.DB, version semver.Version) error { + return db.Update("SetDBVersion", func(tx *dbutil.Tx) error { + if _, err := tx.CreateBucketIfNotExists(MetaBkt); err != nil { + return err + } + + oldVersion, err := getDBVersion(tx) + if err != nil { + return err + } + + if oldVersion != nil && oldVersion.GT(version) { + return fmt.Errorf("SetDBVersion cannot regress version from %v to %v", oldVersion, version) + } + + return dbutil.PutBucketValue(tx, MetaBkt, versionKey, []byte(version.String())) + }) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/meta_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/meta_test.go new file mode 100644 index 00000000..8851aa1e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/meta_test.go @@ -0,0 +1,45 @@ +package visor + +import ( + "testing" + + "github.com/blang/semver" + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/testutil" +) + +func TestGetSetDBVersion(t *testing.T) { + db, shutdown := testutil.PrepareDB(t) + defer shutdown() + + // No version yet + v, err := GetDBVersion(db) + require.NoError(t, err) + require.Nil(t, v) + + // Bucket exists, but still no version + v, err = GetDBVersion(db) + require.NoError(t, err) + require.Nil(t, v) + + // Set the version + x := semver.MustParse("0.25.0") + err = SetDBVersion(db, x) + require.NoError(t, err) + + // Get the version + v, err = GetDBVersion(db) + require.NoError(t, err) + require.NotNil(t, v) + require.True(t, x.EQ(*v)) + require.Equal(t, "0.25.0", v.String()) + + // Set to a new version succeeds + err = SetDBVersion(db, semver.MustParse("0.26.0")) + require.NoError(t, err) + + // Set to an older version fails + err = SetDBVersion(db, x) + testutil.RequireError(t, err, "SetDBVersion cannot regress version from 0.26.0 to 0.25.0") +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/mock_blockchainer_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/mock_blockchainer_test.go new file mode 100644 index 00000000..3fb4fe1a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/mock_blockchainer_test.go @@ -0,0 +1,389 @@ +// Code generated by mockery v1.0.0. DO NOT EDIT. + +package visor + +import blockdb "github.com/SkycoinProject/skycoin/src/visor/blockdb" +import cipher "github.com/SkycoinProject/skycoin/src/cipher" +import coin "github.com/SkycoinProject/skycoin/src/coin" +import dbutil "github.com/SkycoinProject/skycoin/src/visor/dbutil" +import mock "github.com/stretchr/testify/mock" +import params "github.com/SkycoinProject/skycoin/src/params" + +// MockBlockchainer is an autogenerated mock type for the Blockchainer type +type MockBlockchainer struct { + mock.Mock +} + +// ExecuteBlock provides a mock function with given fields: tx, sb +func (_m *MockBlockchainer) ExecuteBlock(tx *dbutil.Tx, sb *coin.SignedBlock) error { + ret := _m.Called(tx, sb) + + var r0 error + if rf, ok := ret.Get(0).(func(*dbutil.Tx, *coin.SignedBlock) error); ok { + r0 = rf(tx, sb) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// GetBlocks provides a mock function with given fields: tx, seqs +func (_m *MockBlockchainer) GetBlocks(tx *dbutil.Tx, seqs []uint64) ([]coin.SignedBlock, error) { + ret := _m.Called(tx, seqs) + + var r0 []coin.SignedBlock + if rf, ok := ret.Get(0).(func(*dbutil.Tx, []uint64) []coin.SignedBlock); ok { + r0 = rf(tx, seqs) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]coin.SignedBlock) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx, []uint64) error); ok { + r1 = rf(tx, seqs) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetBlocksInRange provides a mock function with given fields: tx, start, end +func (_m *MockBlockchainer) GetBlocksInRange(tx *dbutil.Tx, start uint64, end uint64) ([]coin.SignedBlock, error) { + ret := _m.Called(tx, start, end) + + var r0 []coin.SignedBlock + if rf, ok := ret.Get(0).(func(*dbutil.Tx, uint64, uint64) []coin.SignedBlock); ok { + r0 = rf(tx, start, end) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]coin.SignedBlock) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx, uint64, uint64) error); ok { + r1 = rf(tx, start, end) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetGenesisBlock provides a mock function with given fields: tx +func (_m *MockBlockchainer) GetGenesisBlock(tx *dbutil.Tx) (*coin.SignedBlock, error) { + ret := _m.Called(tx) + + var r0 *coin.SignedBlock + if rf, ok := ret.Get(0).(func(*dbutil.Tx) *coin.SignedBlock); ok { + r0 = rf(tx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coin.SignedBlock) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx) error); ok { + r1 = rf(tx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetLastBlocks provides a mock function with given fields: tx, n +func (_m *MockBlockchainer) GetLastBlocks(tx *dbutil.Tx, n uint64) ([]coin.SignedBlock, error) { + ret := _m.Called(tx, n) + + var r0 []coin.SignedBlock + if rf, ok := ret.Get(0).(func(*dbutil.Tx, uint64) []coin.SignedBlock); ok { + r0 = rf(tx, n) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]coin.SignedBlock) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx, uint64) error); ok { + r1 = rf(tx, n) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetSignedBlockByHash provides a mock function with given fields: tx, hash +func (_m *MockBlockchainer) GetSignedBlockByHash(tx *dbutil.Tx, hash cipher.SHA256) (*coin.SignedBlock, error) { + ret := _m.Called(tx, hash) + + var r0 *coin.SignedBlock + if rf, ok := ret.Get(0).(func(*dbutil.Tx, cipher.SHA256) *coin.SignedBlock); ok { + r0 = rf(tx, hash) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coin.SignedBlock) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx, cipher.SHA256) error); ok { + r1 = rf(tx, hash) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetSignedBlockBySeq provides a mock function with given fields: tx, seq +func (_m *MockBlockchainer) GetSignedBlockBySeq(tx *dbutil.Tx, seq uint64) (*coin.SignedBlock, error) { + ret := _m.Called(tx, seq) + + var r0 *coin.SignedBlock + if rf, ok := ret.Get(0).(func(*dbutil.Tx, uint64) *coin.SignedBlock); ok { + r0 = rf(tx, seq) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coin.SignedBlock) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx, uint64) error); ok { + r1 = rf(tx, seq) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Head provides a mock function with given fields: tx +func (_m *MockBlockchainer) Head(tx *dbutil.Tx) (*coin.SignedBlock, error) { + ret := _m.Called(tx) + + var r0 *coin.SignedBlock + if rf, ok := ret.Get(0).(func(*dbutil.Tx) *coin.SignedBlock); ok { + r0 = rf(tx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coin.SignedBlock) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx) error); ok { + r1 = rf(tx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// HeadSeq provides a mock function with given fields: tx +func (_m *MockBlockchainer) HeadSeq(tx *dbutil.Tx) (uint64, bool, error) { + ret := _m.Called(tx) + + var r0 uint64 + if rf, ok := ret.Get(0).(func(*dbutil.Tx) uint64); ok { + r0 = rf(tx) + } else { + r0 = ret.Get(0).(uint64) + } + + var r1 bool + if rf, ok := ret.Get(1).(func(*dbutil.Tx) bool); ok { + r1 = rf(tx) + } else { + r1 = ret.Get(1).(bool) + } + + var r2 error + if rf, ok := ret.Get(2).(func(*dbutil.Tx) error); ok { + r2 = rf(tx) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// Len provides a mock function with given fields: tx +func (_m *MockBlockchainer) Len(tx *dbutil.Tx) (uint64, error) { + ret := _m.Called(tx) + + var r0 uint64 + if rf, ok := ret.Get(0).(func(*dbutil.Tx) uint64); ok { + r0 = rf(tx) + } else { + r0 = ret.Get(0).(uint64) + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx) error); ok { + r1 = rf(tx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// NewBlock provides a mock function with given fields: tx, txns, currentTime +func (_m *MockBlockchainer) NewBlock(tx *dbutil.Tx, txns coin.Transactions, currentTime uint64) (*coin.Block, error) { + ret := _m.Called(tx, txns, currentTime) + + var r0 *coin.Block + if rf, ok := ret.Get(0).(func(*dbutil.Tx, coin.Transactions, uint64) *coin.Block); ok { + r0 = rf(tx, txns, currentTime) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coin.Block) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx, coin.Transactions, uint64) error); ok { + r1 = rf(tx, txns, currentTime) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Time provides a mock function with given fields: tx +func (_m *MockBlockchainer) Time(tx *dbutil.Tx) (uint64, error) { + ret := _m.Called(tx) + + var r0 uint64 + if rf, ok := ret.Get(0).(func(*dbutil.Tx) uint64); ok { + r0 = rf(tx) + } else { + r0 = ret.Get(0).(uint64) + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx) error); ok { + r1 = rf(tx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// TransactionFee provides a mock function with given fields: tx, hours +func (_m *MockBlockchainer) TransactionFee(tx *dbutil.Tx, hours uint64) coin.FeeCalculator { + ret := _m.Called(tx, hours) + + var r0 coin.FeeCalculator + if rf, ok := ret.Get(0).(func(*dbutil.Tx, uint64) coin.FeeCalculator); ok { + r0 = rf(tx, hours) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(coin.FeeCalculator) + } + } + + return r0 +} + +// Unspent provides a mock function with given fields: +func (_m *MockBlockchainer) Unspent() blockdb.UnspentPooler { + ret := _m.Called() + + var r0 blockdb.UnspentPooler + if rf, ok := ret.Get(0).(func() blockdb.UnspentPooler); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(blockdb.UnspentPooler) + } + } + + return r0 +} + +// VerifyBlock provides a mock function with given fields: tx, sb +func (_m *MockBlockchainer) VerifyBlock(tx *dbutil.Tx, sb *coin.SignedBlock) error { + ret := _m.Called(tx, sb) + + var r0 error + if rf, ok := ret.Get(0).(func(*dbutil.Tx, *coin.SignedBlock) error); ok { + r0 = rf(tx, sb) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// VerifyBlockTxnConstraints provides a mock function with given fields: tx, txn +func (_m *MockBlockchainer) VerifyBlockTxnConstraints(tx *dbutil.Tx, txn coin.Transaction) error { + ret := _m.Called(tx, txn) + + var r0 error + if rf, ok := ret.Get(0).(func(*dbutil.Tx, coin.Transaction) error); ok { + r0 = rf(tx, txn) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// VerifySingleTxnHardConstraints provides a mock function with given fields: tx, txn, signed +func (_m *MockBlockchainer) VerifySingleTxnHardConstraints(tx *dbutil.Tx, txn coin.Transaction, signed TxnSignedFlag) error { + ret := _m.Called(tx, txn, signed) + + var r0 error + if rf, ok := ret.Get(0).(func(*dbutil.Tx, coin.Transaction, TxnSignedFlag) error); ok { + r0 = rf(tx, txn, signed) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// VerifySingleTxnSoftHardConstraints provides a mock function with given fields: tx, txn, distParams, verifyParams, signed +func (_m *MockBlockchainer) VerifySingleTxnSoftHardConstraints(tx *dbutil.Tx, txn coin.Transaction, distParams params.Distribution, verifyParams params.VerifyTxn, signed TxnSignedFlag) (*coin.SignedBlock, coin.UxArray, error) { + ret := _m.Called(tx, txn, distParams, verifyParams, signed) + + var r0 *coin.SignedBlock + if rf, ok := ret.Get(0).(func(*dbutil.Tx, coin.Transaction, params.Distribution, params.VerifyTxn, TxnSignedFlag) *coin.SignedBlock); ok { + r0 = rf(tx, txn, distParams, verifyParams, signed) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coin.SignedBlock) + } + } + + var r1 coin.UxArray + if rf, ok := ret.Get(1).(func(*dbutil.Tx, coin.Transaction, params.Distribution, params.VerifyTxn, TxnSignedFlag) coin.UxArray); ok { + r1 = rf(tx, txn, distParams, verifyParams, signed) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(coin.UxArray) + } + } + + var r2 error + if rf, ok := ret.Get(2).(func(*dbutil.Tx, coin.Transaction, params.Distribution, params.VerifyTxn, TxnSignedFlag) error); ok { + r2 = rf(tx, txn, distParams, verifyParams, signed) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/mock_historyer_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/mock_historyer_test.go new file mode 100644 index 00000000..a664a2f4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/mock_historyer_test.go @@ -0,0 +1,218 @@ +// Code generated by mockery v1.0.0. DO NOT EDIT. + +package visor + +import cipher "github.com/SkycoinProject/skycoin/src/cipher" +import coin "github.com/SkycoinProject/skycoin/src/coin" +import dbutil "github.com/SkycoinProject/skycoin/src/visor/dbutil" +import historydb "github.com/SkycoinProject/skycoin/src/visor/historydb" +import mock "github.com/stretchr/testify/mock" + +// MockHistoryer is an autogenerated mock type for the Historyer type +type MockHistoryer struct { + mock.Mock +} + +// AddressSeen provides a mock function with given fields: tx, address +func (_m *MockHistoryer) AddressSeen(tx *dbutil.Tx, address cipher.Address) (bool, error) { + ret := _m.Called(tx, address) + + var r0 bool + if rf, ok := ret.Get(0).(func(*dbutil.Tx, cipher.Address) bool); ok { + r0 = rf(tx, address) + } else { + r0 = ret.Get(0).(bool) + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx, cipher.Address) error); ok { + r1 = rf(tx, address) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Erase provides a mock function with given fields: tx +func (_m *MockHistoryer) Erase(tx *dbutil.Tx) error { + ret := _m.Called(tx) + + var r0 error + if rf, ok := ret.Get(0).(func(*dbutil.Tx) error); ok { + r0 = rf(tx) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// ForEachTxn provides a mock function with given fields: tx, f +func (_m *MockHistoryer) ForEachTxn(tx *dbutil.Tx, f func(cipher.SHA256, *historydb.Transaction) error) error { + ret := _m.Called(tx, f) + + var r0 error + if rf, ok := ret.Get(0).(func(*dbutil.Tx, func(cipher.SHA256, *historydb.Transaction) error) error); ok { + r0 = rf(tx, f) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// GetOutputsForAddress provides a mock function with given fields: tx, address +func (_m *MockHistoryer) GetOutputsForAddress(tx *dbutil.Tx, address cipher.Address) ([]historydb.UxOut, error) { + ret := _m.Called(tx, address) + + var r0 []historydb.UxOut + if rf, ok := ret.Get(0).(func(*dbutil.Tx, cipher.Address) []historydb.UxOut); ok { + r0 = rf(tx, address) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]historydb.UxOut) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx, cipher.Address) error); ok { + r1 = rf(tx, address) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetTransaction provides a mock function with given fields: tx, hash +func (_m *MockHistoryer) GetTransaction(tx *dbutil.Tx, hash cipher.SHA256) (*historydb.Transaction, error) { + ret := _m.Called(tx, hash) + + var r0 *historydb.Transaction + if rf, ok := ret.Get(0).(func(*dbutil.Tx, cipher.SHA256) *historydb.Transaction); ok { + r0 = rf(tx, hash) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*historydb.Transaction) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx, cipher.SHA256) error); ok { + r1 = rf(tx, hash) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetTransactionsForAddress provides a mock function with given fields: tx, address +func (_m *MockHistoryer) GetTransactionsForAddress(tx *dbutil.Tx, address cipher.Address) ([]historydb.Transaction, error) { + ret := _m.Called(tx, address) + + var r0 []historydb.Transaction + if rf, ok := ret.Get(0).(func(*dbutil.Tx, cipher.Address) []historydb.Transaction); ok { + r0 = rf(tx, address) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]historydb.Transaction) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx, cipher.Address) error); ok { + r1 = rf(tx, address) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetUxOuts provides a mock function with given fields: tx, uxids +func (_m *MockHistoryer) GetUxOuts(tx *dbutil.Tx, uxids []cipher.SHA256) ([]historydb.UxOut, error) { + ret := _m.Called(tx, uxids) + + var r0 []historydb.UxOut + if rf, ok := ret.Get(0).(func(*dbutil.Tx, []cipher.SHA256) []historydb.UxOut); ok { + r0 = rf(tx, uxids) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]historydb.UxOut) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx, []cipher.SHA256) error); ok { + r1 = rf(tx, uxids) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// NeedsReset provides a mock function with given fields: tx +func (_m *MockHistoryer) NeedsReset(tx *dbutil.Tx) (bool, error) { + ret := _m.Called(tx) + + var r0 bool + if rf, ok := ret.Get(0).(func(*dbutil.Tx) bool); ok { + r0 = rf(tx) + } else { + r0 = ret.Get(0).(bool) + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx) error); ok { + r1 = rf(tx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ParseBlock provides a mock function with given fields: tx, b +func (_m *MockHistoryer) ParseBlock(tx *dbutil.Tx, b coin.Block) error { + ret := _m.Called(tx, b) + + var r0 error + if rf, ok := ret.Get(0).(func(*dbutil.Tx, coin.Block) error); ok { + r0 = rf(tx, b) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// ParsedBlockSeq provides a mock function with given fields: tx +func (_m *MockHistoryer) ParsedBlockSeq(tx *dbutil.Tx) (uint64, bool, error) { + ret := _m.Called(tx) + + var r0 uint64 + if rf, ok := ret.Get(0).(func(*dbutil.Tx) uint64); ok { + r0 = rf(tx) + } else { + r0 = ret.Get(0).(uint64) + } + + var r1 bool + if rf, ok := ret.Get(1).(func(*dbutil.Tx) bool); ok { + r1 = rf(tx) + } else { + r1 = ret.Get(1).(bool) + } + + var r2 error + if rf, ok := ret.Get(2).(func(*dbutil.Tx) error); ok { + r2 = rf(tx) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/mock_unconfirmed_transaction_pooler_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/mock_unconfirmed_transaction_pooler_test.go new file mode 100644 index 00000000..7f610ea6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/mock_unconfirmed_transaction_pooler_test.go @@ -0,0 +1,360 @@ +// Code generated by mockery v1.0.0. DO NOT EDIT. + +package visor + +import cipher "github.com/SkycoinProject/skycoin/src/cipher" +import coin "github.com/SkycoinProject/skycoin/src/coin" +import dbutil "github.com/SkycoinProject/skycoin/src/visor/dbutil" +import mock "github.com/stretchr/testify/mock" +import params "github.com/SkycoinProject/skycoin/src/params" + +// MockUnconfirmedTransactionPooler is an autogenerated mock type for the UnconfirmedTransactionPooler type +type MockUnconfirmedTransactionPooler struct { + mock.Mock +} + +// AllRawTransactions provides a mock function with given fields: tx +func (_m *MockUnconfirmedTransactionPooler) AllRawTransactions(tx *dbutil.Tx) (coin.Transactions, error) { + ret := _m.Called(tx) + + var r0 coin.Transactions + if rf, ok := ret.Get(0).(func(*dbutil.Tx) coin.Transactions); ok { + r0 = rf(tx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(coin.Transactions) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx) error); ok { + r1 = rf(tx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// FilterKnown provides a mock function with given fields: tx, txns +func (_m *MockUnconfirmedTransactionPooler) FilterKnown(tx *dbutil.Tx, txns []cipher.SHA256) ([]cipher.SHA256, error) { + ret := _m.Called(tx, txns) + + var r0 []cipher.SHA256 + if rf, ok := ret.Get(0).(func(*dbutil.Tx, []cipher.SHA256) []cipher.SHA256); ok { + r0 = rf(tx, txns) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]cipher.SHA256) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx, []cipher.SHA256) error); ok { + r1 = rf(tx, txns) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ForEach provides a mock function with given fields: tx, f +func (_m *MockUnconfirmedTransactionPooler) ForEach(tx *dbutil.Tx, f func(cipher.SHA256, UnconfirmedTransaction) error) error { + ret := _m.Called(tx, f) + + var r0 error + if rf, ok := ret.Get(0).(func(*dbutil.Tx, func(cipher.SHA256, UnconfirmedTransaction) error) error); ok { + r0 = rf(tx, f) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// Get provides a mock function with given fields: tx, hash +func (_m *MockUnconfirmedTransactionPooler) Get(tx *dbutil.Tx, hash cipher.SHA256) (*UnconfirmedTransaction, error) { + ret := _m.Called(tx, hash) + + var r0 *UnconfirmedTransaction + if rf, ok := ret.Get(0).(func(*dbutil.Tx, cipher.SHA256) *UnconfirmedTransaction); ok { + r0 = rf(tx, hash) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*UnconfirmedTransaction) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx, cipher.SHA256) error); ok { + r1 = rf(tx, hash) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetFiltered provides a mock function with given fields: tx, filter +func (_m *MockUnconfirmedTransactionPooler) GetFiltered(tx *dbutil.Tx, filter func(UnconfirmedTransaction) bool) ([]UnconfirmedTransaction, error) { + ret := _m.Called(tx, filter) + + var r0 []UnconfirmedTransaction + if rf, ok := ret.Get(0).(func(*dbutil.Tx, func(UnconfirmedTransaction) bool) []UnconfirmedTransaction); ok { + r0 = rf(tx, filter) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]UnconfirmedTransaction) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx, func(UnconfirmedTransaction) bool) error); ok { + r1 = rf(tx, filter) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetHashes provides a mock function with given fields: tx, filter +func (_m *MockUnconfirmedTransactionPooler) GetHashes(tx *dbutil.Tx, filter func(UnconfirmedTransaction) bool) ([]cipher.SHA256, error) { + ret := _m.Called(tx, filter) + + var r0 []cipher.SHA256 + if rf, ok := ret.Get(0).(func(*dbutil.Tx, func(UnconfirmedTransaction) bool) []cipher.SHA256); ok { + r0 = rf(tx, filter) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]cipher.SHA256) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx, func(UnconfirmedTransaction) bool) error); ok { + r1 = rf(tx, filter) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetIncomingOutputs provides a mock function with given fields: tx, bh +func (_m *MockUnconfirmedTransactionPooler) GetIncomingOutputs(tx *dbutil.Tx, bh coin.BlockHeader) (coin.UxArray, error) { + ret := _m.Called(tx, bh) + + var r0 coin.UxArray + if rf, ok := ret.Get(0).(func(*dbutil.Tx, coin.BlockHeader) coin.UxArray); ok { + r0 = rf(tx, bh) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(coin.UxArray) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx, coin.BlockHeader) error); ok { + r1 = rf(tx, bh) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetKnown provides a mock function with given fields: tx, txns +func (_m *MockUnconfirmedTransactionPooler) GetKnown(tx *dbutil.Tx, txns []cipher.SHA256) (coin.Transactions, error) { + ret := _m.Called(tx, txns) + + var r0 coin.Transactions + if rf, ok := ret.Get(0).(func(*dbutil.Tx, []cipher.SHA256) coin.Transactions); ok { + r0 = rf(tx, txns) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(coin.Transactions) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx, []cipher.SHA256) error); ok { + r1 = rf(tx, txns) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetUnspentsOfAddr provides a mock function with given fields: tx, addr +func (_m *MockUnconfirmedTransactionPooler) GetUnspentsOfAddr(tx *dbutil.Tx, addr cipher.Address) (coin.UxArray, error) { + ret := _m.Called(tx, addr) + + var r0 coin.UxArray + if rf, ok := ret.Get(0).(func(*dbutil.Tx, cipher.Address) coin.UxArray); ok { + r0 = rf(tx, addr) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(coin.UxArray) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx, cipher.Address) error); ok { + r1 = rf(tx, addr) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// InjectTransaction provides a mock function with given fields: tx, bc, t, distParams, verifyParams +func (_m *MockUnconfirmedTransactionPooler) InjectTransaction(tx *dbutil.Tx, bc Blockchainer, t coin.Transaction, distParams params.Distribution, verifyParams params.VerifyTxn) (bool, *ErrTxnViolatesSoftConstraint, error) { + ret := _m.Called(tx, bc, t, distParams, verifyParams) + + var r0 bool + if rf, ok := ret.Get(0).(func(*dbutil.Tx, Blockchainer, coin.Transaction, params.Distribution, params.VerifyTxn) bool); ok { + r0 = rf(tx, bc, t, distParams, verifyParams) + } else { + r0 = ret.Get(0).(bool) + } + + var r1 *ErrTxnViolatesSoftConstraint + if rf, ok := ret.Get(1).(func(*dbutil.Tx, Blockchainer, coin.Transaction, params.Distribution, params.VerifyTxn) *ErrTxnViolatesSoftConstraint); ok { + r1 = rf(tx, bc, t, distParams, verifyParams) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*ErrTxnViolatesSoftConstraint) + } + } + + var r2 error + if rf, ok := ret.Get(2).(func(*dbutil.Tx, Blockchainer, coin.Transaction, params.Distribution, params.VerifyTxn) error); ok { + r2 = rf(tx, bc, t, distParams, verifyParams) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// Len provides a mock function with given fields: tx +func (_m *MockUnconfirmedTransactionPooler) Len(tx *dbutil.Tx) (uint64, error) { + ret := _m.Called(tx) + + var r0 uint64 + if rf, ok := ret.Get(0).(func(*dbutil.Tx) uint64); ok { + r0 = rf(tx) + } else { + r0 = ret.Get(0).(uint64) + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx) error); ok { + r1 = rf(tx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RecvOfAddresses provides a mock function with given fields: tx, bh, addrs +func (_m *MockUnconfirmedTransactionPooler) RecvOfAddresses(tx *dbutil.Tx, bh coin.BlockHeader, addrs []cipher.Address) (coin.AddressUxOuts, error) { + ret := _m.Called(tx, bh, addrs) + + var r0 coin.AddressUxOuts + if rf, ok := ret.Get(0).(func(*dbutil.Tx, coin.BlockHeader, []cipher.Address) coin.AddressUxOuts); ok { + r0 = rf(tx, bh, addrs) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(coin.AddressUxOuts) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx, coin.BlockHeader, []cipher.Address) error); ok { + r1 = rf(tx, bh, addrs) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Refresh provides a mock function with given fields: tx, bc, distParams, verifyParams +func (_m *MockUnconfirmedTransactionPooler) Refresh(tx *dbutil.Tx, bc Blockchainer, distParams params.Distribution, verifyParams params.VerifyTxn) ([]cipher.SHA256, error) { + ret := _m.Called(tx, bc, distParams, verifyParams) + + var r0 []cipher.SHA256 + if rf, ok := ret.Get(0).(func(*dbutil.Tx, Blockchainer, params.Distribution, params.VerifyTxn) []cipher.SHA256); ok { + r0 = rf(tx, bc, distParams, verifyParams) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]cipher.SHA256) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx, Blockchainer, params.Distribution, params.VerifyTxn) error); ok { + r1 = rf(tx, bc, distParams, verifyParams) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RemoveInvalid provides a mock function with given fields: tx, bc +func (_m *MockUnconfirmedTransactionPooler) RemoveInvalid(tx *dbutil.Tx, bc Blockchainer) ([]cipher.SHA256, error) { + ret := _m.Called(tx, bc) + + var r0 []cipher.SHA256 + if rf, ok := ret.Get(0).(func(*dbutil.Tx, Blockchainer) []cipher.SHA256); ok { + r0 = rf(tx, bc) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]cipher.SHA256) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx, Blockchainer) error); ok { + r1 = rf(tx, bc) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RemoveTransactions provides a mock function with given fields: tx, txns +func (_m *MockUnconfirmedTransactionPooler) RemoveTransactions(tx *dbutil.Tx, txns []cipher.SHA256) error { + ret := _m.Called(tx, txns) + + var r0 error + if rf, ok := ret.Get(0).(func(*dbutil.Tx, []cipher.SHA256) error); ok { + r0 = rf(tx, txns) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// SetTransactionsAnnounced provides a mock function with given fields: tx, hashes +func (_m *MockUnconfirmedTransactionPooler) SetTransactionsAnnounced(tx *dbutil.Tx, hashes map[cipher.SHA256]int64) error { + ret := _m.Called(tx, hashes) + + var r0 error + if rf, ok := ret.Get(0).(func(*dbutil.Tx, map[cipher.SHA256]int64) error); ok { + r0 = rf(tx, hashes) + } else { + r0 = ret.Error(0) + } + + return r0 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/mock_unspent_pooler_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/mock_unspent_pooler_test.go new file mode 100644 index 00000000..c136123c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/mock_unspent_pooler_test.go @@ -0,0 +1,247 @@ +// Code generated by mockery v1.0.0. DO NOT EDIT. + +package visor + +import ( + cipher "github.com/SkycoinProject/skycoin/src/cipher" + coin "github.com/SkycoinProject/skycoin/src/coin" + + mock "github.com/stretchr/testify/mock" + + "github.com/SkycoinProject/skycoin/src/visor/blockdb" + dbutil "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +// MockUnspentPooler is an autogenerated mock type for the UnspentPooler type +type MockUnspentPooler struct { + mock.Mock +} + +// AddressCount provides a mock function with given fields: _a0 +func (_m *MockUnspentPooler) AddressCount(_a0 *dbutil.Tx) (uint64, error) { + ret := _m.Called(_a0) + + var r0 uint64 + if rf, ok := ret.Get(0).(func(*dbutil.Tx) uint64); ok { + r0 = rf(_a0) + } else { + r0 = ret.Get(0).(uint64) + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Contains provides a mock function with given fields: _a0, _a1 +func (_m *MockUnspentPooler) Contains(_a0 *dbutil.Tx, _a1 cipher.SHA256) (bool, error) { + ret := _m.Called(_a0, _a1) + + var r0 bool + if rf, ok := ret.Get(0).(func(*dbutil.Tx, cipher.SHA256) bool); ok { + r0 = rf(_a0, _a1) + } else { + r0 = ret.Get(0).(bool) + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx, cipher.SHA256) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Get provides a mock function with given fields: _a0, _a1 +func (_m *MockUnspentPooler) Get(_a0 *dbutil.Tx, _a1 cipher.SHA256) (*coin.UxOut, error) { + ret := _m.Called(_a0, _a1) + + var r0 *coin.UxOut + if rf, ok := ret.Get(0).(func(*dbutil.Tx, cipher.SHA256) *coin.UxOut); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coin.UxOut) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx, cipher.SHA256) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetAll provides a mock function with given fields: _a0 +func (_m *MockUnspentPooler) GetAll(_a0 *dbutil.Tx) (coin.UxArray, error) { + ret := _m.Called(_a0) + + var r0 coin.UxArray + if rf, ok := ret.Get(0).(func(*dbutil.Tx) coin.UxArray); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(coin.UxArray) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetArray provides a mock function with given fields: _a0, _a1 +func (_m *MockUnspentPooler) GetArray(_a0 *dbutil.Tx, _a1 []cipher.SHA256) (coin.UxArray, error) { + ret := _m.Called(_a0, _a1) + + var r0 coin.UxArray + if rf, ok := ret.Get(0).(func(*dbutil.Tx, []cipher.SHA256) coin.UxArray); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(coin.UxArray) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx, []cipher.SHA256) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetUnspentHashesOfAddrs provides a mock function with given fields: _a0, _a1 +func (_m *MockUnspentPooler) GetUnspentHashesOfAddrs(_a0 *dbutil.Tx, _a1 []cipher.Address) (blockdb.AddressHashes, error) { + ret := _m.Called(_a0, _a1) + + var r0 blockdb.AddressHashes + if rf, ok := ret.Get(0).(func(*dbutil.Tx, []cipher.Address) blockdb.AddressHashes); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(blockdb.AddressHashes) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx, []cipher.Address) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetUnspentsOfAddrs provides a mock function with given fields: _a0, _a1 +func (_m *MockUnspentPooler) GetUnspentsOfAddrs(_a0 *dbutil.Tx, _a1 []cipher.Address) (coin.AddressUxOuts, error) { + ret := _m.Called(_a0, _a1) + + var r0 coin.AddressUxOuts + if rf, ok := ret.Get(0).(func(*dbutil.Tx, []cipher.Address) coin.AddressUxOuts); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(coin.AddressUxOuts) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx, []cipher.Address) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetUxHash provides a mock function with given fields: _a0 +func (_m *MockUnspentPooler) GetUxHash(_a0 *dbutil.Tx) (cipher.SHA256, error) { + ret := _m.Called(_a0) + + var r0 cipher.SHA256 + if rf, ok := ret.Get(0).(func(*dbutil.Tx) cipher.SHA256); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(cipher.SHA256) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Len provides a mock function with given fields: _a0 +func (_m *MockUnspentPooler) Len(_a0 *dbutil.Tx) (uint64, error) { + ret := _m.Called(_a0) + + var r0 uint64 + if rf, ok := ret.Get(0).(func(*dbutil.Tx) uint64); ok { + r0 = rf(_a0) + } else { + r0 = ret.Get(0).(uint64) + } + + var r1 error + if rf, ok := ret.Get(1).(func(*dbutil.Tx) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// MaybeBuildIndexes provides a mock function with given fields: _a0, _a1 +func (_m *MockUnspentPooler) MaybeBuildIndexes(_a0 *dbutil.Tx, _a1 uint64) error { + ret := _m.Called(_a0, _a1) + + var r0 error + if rf, ok := ret.Get(0).(func(*dbutil.Tx, uint64) error); ok { + r0 = rf(_a0, _a1) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// ProcessBlock provides a mock function with given fields: _a0, _a1 +func (_m *MockUnspentPooler) ProcessBlock(_a0 *dbutil.Tx, _a1 *coin.SignedBlock) error { + ret := _m.Called(_a0, _a1) + + var r0 error + if rf, ok := ret.Get(0).(func(*dbutil.Tx, *coin.SignedBlock) error); ok { + r0 = rf(_a0, _a1) + } else { + r0 = ret.Error(0) + } + + return r0 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/objects.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/objects.go new file mode 100644 index 00000000..2bf1341e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/objects.go @@ -0,0 +1,213 @@ +package visor + +import ( + "time" + + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/transaction" +) + +// Transaction wraps around coin.Transaction, tagged with its status. This allows us +// to include unconfirmed txns +type Transaction struct { + Transaction coin.Transaction + Status TransactionStatus + Time uint64 +} + +// TransactionStatus represents the transaction status +type TransactionStatus struct { + Confirmed bool + // If confirmed, how many blocks deep in the chain it is. Will be at least 1 if confirmed. + Height uint64 + // If confirmed, the sequence of the block in which the transaction was executed + BlockSeq uint64 +} + +// NewUnconfirmedTransactionStatus creates unconfirmed transaction status +func NewUnconfirmedTransactionStatus() TransactionStatus { + return TransactionStatus{ + Confirmed: false, + Height: 0, + BlockSeq: 0, + } +} + +// NewConfirmedTransactionStatus creates confirmed transaction status +func NewConfirmedTransactionStatus(height, blockSeq uint64) TransactionStatus { + // Height starts at 1 + // TODO -- height should start at 0? + if height == 0 { + logger.Panic("Invalid confirmed transaction height") + } + return TransactionStatus{ + Confirmed: true, + Height: height, + BlockSeq: blockSeq, + } +} + +// TransactionInput includes the UxOut spent in a transaction and the calculated hours of the output at spending time +type TransactionInput struct { + UxOut coin.UxOut + CalculatedHours uint64 +} + +// NewTransactionInput creates a TransactionInput. +// calculateHoursTime is the time against which the CalculatedHours should be computed +func NewTransactionInput(ux coin.UxOut, calculateHoursTime uint64) (TransactionInput, error) { + // The overflow bug causes this to fail for some transactions, allow it to pass + calculatedHours, err := ux.CoinHours(calculateHoursTime) + if err != nil { + logger.Critical().Warningf("Ignoring NewTransactionInput ux.CoinHours failed: %v", err) + calculatedHours = 0 + } + + return TransactionInput{ + UxOut: ux, + CalculatedHours: calculatedHours, + }, nil +} + +// NewTransactionInputs creates []TransactionInput from []coin.UxOut. +// Assumes all coin.UxOuts have their coin hours calculated from the same reference time. +func NewTransactionInputs(uxa []coin.UxOut, calculateHoursTime uint64) ([]TransactionInput, error) { + if len(uxa) == 0 { + return nil, nil + } + + inputs := make([]TransactionInput, len(uxa)) + for i, x := range uxa { + var err error + inputs[i], err = NewTransactionInput(x, calculateHoursTime) + if err != nil { + return nil, err + } + } + + return inputs, nil +} + +// TransactionInputFromUxBalance converts transaction.UxBalance to TransactionInput +func TransactionInputFromUxBalance(x transaction.UxBalance) TransactionInput { + var t TransactionInput + t.CalculatedHours = x.Hours + t.UxOut.Head.BkSeq = x.BkSeq + t.UxOut.Head.Time = x.Time + t.UxOut.Body.Address = x.Address + t.UxOut.Body.Coins = x.Coins + t.UxOut.Body.Hours = x.InitialHours + t.UxOut.Body.SrcTransaction = x.SrcTransaction + + if t.UxOut.Hash() != x.Hash { + logger.Panic("Reconstructed coin.UxOut from transaction.UxBalance hash does not match") + } + + return t +} + +// NewTransactionInputsFromUxBalance converts []transaction.UxBalance to []TransactionInput +func NewTransactionInputsFromUxBalance(uxb []transaction.UxBalance) []TransactionInput { + if len(uxb) == 0 { + return nil + } + + inputs := make([]TransactionInput, len(uxb)) + for i, x := range uxb { + inputs[i] = TransactionInputFromUxBalance(x) + } + + return inputs +} + +// BlockchainMetadata encapsulates useful information from the coin.Blockchain +type BlockchainMetadata struct { + // Most recent block + HeadBlock coin.SignedBlock + // Number of unspent outputs in the coin.Blockchain + Unspents uint64 + // Number of known unconfirmed txns + Unconfirmed uint64 +} + +// NewBlockchainMetadata creates blockchain meta data +func NewBlockchainMetadata(head coin.SignedBlock, unconfirmedLen, unspentsLen uint64) (*BlockchainMetadata, error) { + return &BlockchainMetadata{ + HeadBlock: head, + Unspents: unspentsLen, + Unconfirmed: unconfirmedLen, + }, nil +} + +// UnconfirmedTransaction unconfirmed transaction +type UnconfirmedTransaction struct { + Transaction coin.Transaction + // Time the txn was last received + Received int64 + // Time the txn was last checked against the blockchain + Checked int64 + // Last time we announced this txn + Announced int64 + // If this txn is valid + IsValid int8 +} + +// NewUnconfirmedTransaction creates an UnconfirmedTransaction +func NewUnconfirmedTransaction(txn coin.Transaction) UnconfirmedTransaction { + now := time.Now().UTC() + return UnconfirmedTransaction{ + Transaction: txn, + Received: now.UnixNano(), + Checked: now.UnixNano(), + Announced: time.Time{}.UnixNano(), + IsValid: 0, + } +} + +// UnspentOutput includes coin.UxOut and adds CalculatedHours +type UnspentOutput struct { + coin.UxOut + CalculatedHours uint64 +} + +// NewUnspentOutput creates an UnspentOutput +func NewUnspentOutput(uxOut coin.UxOut, calculateHoursTime uint64) (UnspentOutput, error) { + calculatedHours, err := uxOut.CoinHours(calculateHoursTime) + + // Treat overflowing coin hours calculations as a non-error and force hours to 0 + // This affects one bad spent output which had overflowed hours, spent in block 13277. + switch err { + case nil: + case coin.ErrAddEarnedCoinHoursAdditionOverflow: + calculatedHours = 0 + default: + return UnspentOutput{}, err + } + + return UnspentOutput{ + UxOut: uxOut, + CalculatedHours: calculatedHours, + }, nil +} + +// NewUnspentOutputs creates []UnspentOutput +func NewUnspentOutputs(uxOuts []coin.UxOut, calculateHoursTime uint64) ([]UnspentOutput, error) { + outs := make([]UnspentOutput, len(uxOuts)) + for i, ux := range uxOuts { + u, err := NewUnspentOutput(ux, calculateHoursTime) + if err != nil { + return nil, err + } + outs[i] = u + } + + return outs, nil +} + +// UnspentOutputsSummary includes current unspent outputs and incoming and outgoing unspent outputs +type UnspentOutputsSummary struct { + HeadBlock *coin.SignedBlock + Confirmed []UnspentOutput + Outgoing []UnspentOutput + Incoming []UnspentOutput +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/objects_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/objects_test.go new file mode 100644 index 00000000..5ae2072b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/objects_test.go @@ -0,0 +1,54 @@ +package visor + +import ( + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/transaction" +) + +func TestNewTransactionInputsFromUxBalance(t *testing.T) { + headTime := uint64(time.Now().Unix()) + + uxa := []coin.UxOut{ + { + Head: coin.UxHead{ + Time: headTime / 2, + BkSeq: 60, + }, + Body: coin.UxBody{ + SrcTransaction: testutil.RandSHA256(t), + Address: testutil.MakeAddress(), + Coins: 11e6, + Hours: 12345, + }, + }, + { + Head: coin.UxHead{ + Time: headTime/2 + headTime/4, + BkSeq: 120, + }, + Body: coin.UxBody{ + SrcTransaction: testutil.RandSHA256(t), + Address: testutil.MakeAddress(), + Coins: 12345678, + Hours: 987654, + }, + }, + } + + uxb, err := transaction.NewUxBalances(uxa, headTime) + require.NoError(t, err) + + inputsFromUxa, err := NewTransactionInputs(uxa, headTime) + require.NoError(t, err) + + inputsFromUxb := NewTransactionInputsFromUxBalance(uxb) + require.Equal(t, inputsFromUxa, inputsFromUxb) + + require.Nil(t, NewTransactionInputsFromUxBalance([]transaction.UxBalance{})) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/richlist.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/richlist.go new file mode 100644 index 00000000..28a4164a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/richlist.go @@ -0,0 +1,64 @@ +package visor + +import ( + "bytes" + "sort" + + "github.com/SkycoinProject/skycoin/src/cipher" +) + +// RichlistBalance holds info an address balance holder +type RichlistBalance struct { + Address cipher.Address + Coins uint64 + Locked bool +} + +// Richlist contains RichlistBalances +type Richlist []RichlistBalance + +// NewRichlist create Richlist via unspent outputs map +func NewRichlist(allAccounts map[cipher.Address]uint64, lockedAddrs map[cipher.Address]struct{}) (Richlist, error) { + richlist := make(Richlist, 0, len(allAccounts)) + + for addr, coins := range allAccounts { + var islocked bool + if _, ok := lockedAddrs[addr]; ok { + islocked = true + } + + richlist = append(richlist, RichlistBalance{ + Address: addr, + Coins: coins, + Locked: islocked, + }) + } + + // Sort order: + // Higher coins + // Locked > unlocked + // Address bytes + sort.Slice(richlist, func(i, j int) bool { + if richlist[i].Coins == richlist[j].Coins { + if richlist[i].Locked == richlist[j].Locked { + return bytes.Compare(richlist[i].Address.Bytes(), richlist[j].Address.Bytes()) < 0 + } + return richlist[i].Locked + } + + return richlist[i].Coins > richlist[j].Coins + }) + + return richlist, nil +} + +// FilterAddresses returns the richlist without addresses from the map +func (r Richlist) FilterAddresses(addrs map[cipher.Address]struct{}) Richlist { + var s Richlist + for _, b := range r { + if _, ok := addrs[b.Address]; !ok { + s = append(s, b) + } + } + return s +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/richlist_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/richlist_test.go new file mode 100644 index 00000000..d5573be6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/richlist_test.go @@ -0,0 +1,124 @@ +package visor + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" +) + +func getLockedMap(distributionAddresses [4]cipher.Address) map[cipher.Address]struct{} { + // distributionAddresses := []cipher.Address{"a1", "b1", "c1", "d1"} + dmap := map[cipher.Address]struct{}{} + for _, addr := range distributionAddresses { + dmap[addr] = struct{}{} + } + return dmap +} + +func getAllAccounts(distributionAddresses, otherAddresses [4]cipher.Address) map[cipher.Address]uint64 { + accMap := map[cipher.Address]uint64{} + accMap[distributionAddresses[0]] = 1000000 + accMap[distributionAddresses[1]] = 1000000 + accMap[distributionAddresses[2]] = 2123456 + accMap[distributionAddresses[3]] = 1000000 + accMap[otherAddresses[0]] = 3010000 + accMap[otherAddresses[1]] = 2010000 + accMap[otherAddresses[2]] = 4010000 + accMap[otherAddresses[3]] = 1000000 + + return accMap +} + +func TestRichlist(t *testing.T) { + otherAddresses := [4]cipher.Address{ + cipher.MustDecodeBase58Address("2cmpPv9PJfKFStekrKZXBnAfLKE6cB7qMrS"), + cipher.MustDecodeBase58Address("jhLw4EXNn2E7zVjrmi8fGsATZfRnAXfqRj"), + cipher.MustDecodeBase58Address("R7zjFhmW3KqGz6r92VFpJTpRWCzaXSokYb"), + cipher.MustDecodeBase58Address("JFQRvKXBoTt6D8aiFVrGquemzbrQDGKTAR"), + } + + distributionAddresses := [4]cipher.Address{ + cipher.MustDecodeBase58Address("DniB7KqDRNx8CjM6vruaKwbQPgWj1GSj5t"), + cipher.MustDecodeBase58Address("FbJuRez3RKpYsTSYTVyAQt146vzcFNkqpU"), + cipher.MustDecodeBase58Address("2mxNdCnUd7vF1uSpRhSDMEhZHKAyL9r1Uys"), + cipher.MustDecodeBase58Address("uBcaMg2vGpy45K7NVsRGmuNXQdaB8kgHfM"), + } + + expectedRichlist := Richlist{ + RichlistBalance{Address: otherAddresses[2], Coins: 4010000, Locked: false}, + RichlistBalance{Address: otherAddresses[0], Coins: 3010000, Locked: false}, + RichlistBalance{Address: distributionAddresses[2], Coins: 2123456, Locked: true}, + RichlistBalance{Address: otherAddresses[1], Coins: 2010000, Locked: false}, + RichlistBalance{Address: distributionAddresses[0], Coins: 1000000, Locked: true}, + RichlistBalance{Address: distributionAddresses[1], Coins: 1000000, Locked: true}, + RichlistBalance{Address: distributionAddresses[3], Coins: 1000000, Locked: true}, + RichlistBalance{Address: otherAddresses[3], Coins: 1000000, Locked: false}, + } + + accMap := getAllAccounts(distributionAddresses, otherAddresses) + distributionMap := getLockedMap(distributionAddresses) + + richlist, err := NewRichlist(map[cipher.Address]uint64{}, map[cipher.Address]struct{}{}) + require.NoError(t, err) + require.Equal(t, Richlist{}, richlist) + + richlist, err = NewRichlist(accMap, distributionMap) + require.NoError(t, err) + require.Equal(t, expectedRichlist, richlist) + + cases := []struct { + name string + filterMap map[cipher.Address]struct{} + richlistLen int + result Richlist + }{ + { + name: "filterRichlist", + filterMap: map[cipher.Address]struct{}{ + otherAddresses[0]: struct{}{}, + otherAddresses[1]: struct{}{}, + otherAddresses[3]: struct{}{}, + }, + richlistLen: 5, + result: Richlist{ + RichlistBalance{Address: otherAddresses[2], Locked: false, Coins: 4010000}, + RichlistBalance{Address: distributionAddresses[2], Locked: true, Coins: 2123456}, + RichlistBalance{Address: distributionAddresses[0], Locked: true, Coins: 1000000}, + RichlistBalance{Address: distributionAddresses[1], Locked: true, Coins: 1000000}, + RichlistBalance{Address: distributionAddresses[3], Locked: true, Coins: 1000000}, + }, + }, + + { + name: "allRichlist", + filterMap: map[cipher.Address]struct{}{}, + richlistLen: 8, + result: expectedRichlist, + }, + { + name: "lockedRichlist", + filterMap: map[cipher.Address]struct{}{ + otherAddresses[0]: struct{}{}, + otherAddresses[1]: struct{}{}, + otherAddresses[2]: struct{}{}, + otherAddresses[3]: struct{}{}, + }, + result: Richlist{ + RichlistBalance{Address: distributionAddresses[2], Locked: true, Coins: 2123456}, + RichlistBalance{Address: distributionAddresses[0], Locked: true, Coins: 1000000}, + RichlistBalance{Address: distributionAddresses[1], Locked: true, Coins: 1000000}, + RichlistBalance{Address: distributionAddresses[3], Locked: true, Coins: 1000000}, + }, + }, + } + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + result := richlist.FilterAddresses(tc.filterMap) + require.Equal(t, len(tc.result), len(result), "%d != %d", len(tc.result), len(result)) + + require.Equal(t, tc.result, result) + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/skyencoder_test.go new file mode 100644 index 00000000..6f55c7ca --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/skyencoder_test.go @@ -0,0 +1,17 @@ +package visor + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestSkyencoderDBSafe(t *testing.T) { + dbFile := "../api/integration/testdata/blockchain-180.db" + + db, err := OpenDB(dbFile, true) + require.NoError(t, err) + + err = VerifyDBSkyencoderSafe(db, nil) + require.NoError(t, err) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/testdata/data.db.garbage b/vendor/github.com/SkycoinProject/skycoin/src/visor/testdata/data.db.garbage new file mode 100644 index 00000000..e1e9666d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/testdata/data.db.garbage @@ -0,0 +1 @@ +....garbage file to cause bolt DB error.... diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/testdata/data.db.no-addr-txn-index b/vendor/github.com/SkycoinProject/skycoin/src/visor/testdata/data.db.no-addr-txn-index new file mode 100644 index 00000000..11f547d0 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/visor/testdata/data.db.no-addr-txn-index differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/testdata/data.db.no-addr-uxout-index b/vendor/github.com/SkycoinProject/skycoin/src/visor/testdata/data.db.no-addr-uxout-index new file mode 100644 index 00000000..bf4ef82c Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/visor/testdata/data.db.no-addr-uxout-index differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/testdata/data.db.nosig b/vendor/github.com/SkycoinProject/skycoin/src/visor/testdata/data.db.nosig new file mode 100644 index 00000000..40c5b253 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/visor/testdata/data.db.nosig differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/testdata/data.db.notxn b/vendor/github.com/SkycoinProject/skycoin/src/visor/testdata/data.db.notxn new file mode 100644 index 00000000..86fa6461 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/visor/testdata/data.db.notxn differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/testdata/data.db.nouxout b/vendor/github.com/SkycoinProject/skycoin/src/visor/testdata/data.db.nouxout new file mode 100644 index 00000000..21ebfa75 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/visor/testdata/data.db.nouxout differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/testdata/data.db.ok b/vendor/github.com/SkycoinProject/skycoin/src/visor/testdata/data.db.ok new file mode 100644 index 00000000..47780f85 Binary files /dev/null and b/vendor/github.com/SkycoinProject/skycoin/src/visor/testdata/data.db.ok differ diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/unconfirmed.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/unconfirmed.go new file mode 100644 index 00000000..510a1b05 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/unconfirmed.go @@ -0,0 +1,561 @@ +package visor + +import ( + "errors" + "fmt" + "time" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" +) + +var ( + // UnconfirmedTxnsBkt holds unconfirmed transactions + UnconfirmedTxnsBkt = []byte("unconfirmed_txns") + // UnconfirmedUnspentsBkt holds unconfirmed unspent outputs + UnconfirmedUnspentsBkt = []byte("unconfirmed_unspents") + + errUpdateObjectDoesNotExist = errors.New("object does not exist in bucket") +) + +//go:generate skyencoder -unexported -struct UnconfirmedTransaction +//go:generate skyencoder -unexported -struct UxArray + +// UxArray wraps coin.UxArray +type UxArray struct { + UxArray coin.UxArray +} + +// unconfirmed transactions bucket +type unconfirmedTxns struct{} + +func (utb *unconfirmedTxns) get(tx *dbutil.Tx, hash cipher.SHA256) (*UnconfirmedTransaction, error) { + var txn UnconfirmedTransaction + + v, err := dbutil.GetBucketValueNoCopy(tx, UnconfirmedTxnsBkt, []byte(hash.Hex())) + if err != nil { + return nil, err + } else if v == nil { + return nil, nil + } + + if err := decodeUnconfirmedTransactionExact(v, &txn); err != nil { + return nil, err + } + + txnHash := txn.Transaction.Hash() + if hash != txnHash { + return nil, fmt.Errorf("DB key %s does not match block hash header %s", hash, txnHash) + } + + return &txn, nil +} + +func (utb *unconfirmedTxns) put(tx *dbutil.Tx, v *UnconfirmedTransaction) error { + h := v.Transaction.Hash() + buf, err := encodeUnconfirmedTransaction(v) + if err != nil { + return err + } + + return dbutil.PutBucketValue(tx, UnconfirmedTxnsBkt, []byte(h.Hex()), buf) +} + +func (utb *unconfirmedTxns) update(tx *dbutil.Tx, hash cipher.SHA256, f func(v *UnconfirmedTransaction) error) error { + txn, err := utb.get(tx, hash) + if err != nil { + return err + } + + if txn == nil { + return errUpdateObjectDoesNotExist + } + + if err := f(txn); err != nil { + return err + } + + return utb.put(tx, txn) +} + +func (utb *unconfirmedTxns) delete(tx *dbutil.Tx, hash cipher.SHA256) error { + return dbutil.Delete(tx, UnconfirmedTxnsBkt, []byte(hash.Hex())) +} + +func (utb *unconfirmedTxns) getAll(tx *dbutil.Tx) ([]UnconfirmedTransaction, error) { + var txns []UnconfirmedTransaction + + if err := dbutil.ForEach(tx, UnconfirmedTxnsBkt, func(_, v []byte) error { + var txn UnconfirmedTransaction + if err := decodeUnconfirmedTransactionExact(v, &txn); err != nil { + return err + } + + txns = append(txns, txn) + return nil + }); err != nil { + return nil, err + } + + return txns, nil +} + +func (utb *unconfirmedTxns) hasKey(tx *dbutil.Tx, hash cipher.SHA256) (bool, error) { + return dbutil.BucketHasKey(tx, UnconfirmedTxnsBkt, []byte(hash.Hex())) +} + +func (utb *unconfirmedTxns) forEach(tx *dbutil.Tx, f func(hash cipher.SHA256, tx UnconfirmedTransaction) error) error { + return dbutil.ForEach(tx, UnconfirmedTxnsBkt, func(k, v []byte) error { + hash, err := cipher.SHA256FromHex(string(k)) + if err != nil { + return err + } + + var txn UnconfirmedTransaction + if err := decodeUnconfirmedTransactionExact(v, &txn); err != nil { + return err + } + + return f(hash, txn) + }) +} + +func (utb *unconfirmedTxns) len(tx *dbutil.Tx) (uint64, error) { + return dbutil.Len(tx, UnconfirmedTxnsBkt) +} + +type txnUnspents struct{} + +func (txus *txnUnspents) put(tx *dbutil.Tx, hash cipher.SHA256, uxs coin.UxArray) error { + buf, err := encodeUxArray(&UxArray{ + UxArray: uxs, + }) + if err != nil { + return err + } + + return dbutil.PutBucketValue(tx, UnconfirmedUnspentsBkt, []byte(hash.Hex()), buf) +} + +func (txus *txnUnspents) delete(tx *dbutil.Tx, hash cipher.SHA256) error { + return dbutil.Delete(tx, UnconfirmedUnspentsBkt, []byte(hash.Hex())) +} + +func (txus *txnUnspents) getByAddr(tx *dbutil.Tx, a cipher.Address) (coin.UxArray, error) { + var uxo coin.UxArray + + if err := dbutil.ForEach(tx, UnconfirmedUnspentsBkt, func(_, v []byte) error { + var uxa UxArray + if err := decodeUxArrayExact(v, &uxa); err != nil { + return err + } + + for i := range uxa.UxArray { + if uxa.UxArray[i].Body.Address == a { + uxo = append(uxo, uxa.UxArray[i]) + } + } + + return nil + }); err != nil { + return nil, err + } + + return uxo, nil +} + +// UnconfirmedTransactionPool manages unconfirmed transactions +type UnconfirmedTransactionPool struct { + db *dbutil.DB + txns *unconfirmedTxns + // Predicted unspents, assuming txns are valid. Needed to predict + // our future balance and avoid double spending our own coins + // Maps from Transaction.Hash() to UxArray. + unspent *txnUnspents +} + +// NewUnconfirmedTransactionPool creates an UnconfirmedTransactionPool instance +func NewUnconfirmedTransactionPool(db *dbutil.DB) (*UnconfirmedTransactionPool, error) { + if err := db.View("Check unconfirmed txn pool size", func(tx *dbutil.Tx) error { + n, err := dbutil.Len(tx, UnconfirmedTxnsBkt) + if err != nil { + return err + } + + logger.Infof("Unconfirmed transaction pool size: %d", n) + return nil + }); err != nil { + return nil, err + } + + return &UnconfirmedTransactionPool{ + db: db, + txns: &unconfirmedTxns{}, + unspent: &txnUnspents{}, + }, nil +} + +// SetTransactionsAnnounced updates announced time of specific tx +func (utp *UnconfirmedTransactionPool) SetTransactionsAnnounced(tx *dbutil.Tx, hashes map[cipher.SHA256]int64) error { + var txns []*UnconfirmedTransaction + for h, t := range hashes { + txn, err := utp.txns.get(tx, h) + if err != nil { + return err + } + + if txn == nil { + logger.Warningf("UnconfirmedTransactionPool.SetTransactionsAnnounced: UnconfirmedTransaction %s not found in DB", h.Hex()) + continue + } + + if t > txn.Announced { + txn.Announced = t + txns = append(txns, txn) + } + } + + for _, txn := range txns { + if err := utp.txns.put(tx, txn); err != nil { + return err + } + } + + return nil +} + +// InjectTransaction adds a coin.Transaction to the pool, or updates an existing one's timestamps +// Returns an error if txn is invalid, and whether the transaction already +// existed in the pool. +// If the transaction violates hard constraints, it is rejected. +// Soft constraints violations mark a txn as invalid, but the txn is inserted. The soft violation is returned. +func (utp *UnconfirmedTransactionPool) InjectTransaction(tx *dbutil.Tx, bc Blockchainer, txn coin.Transaction, distParams params.Distribution, verifyParams params.VerifyTxn) (bool, *ErrTxnViolatesSoftConstraint, error) { + var isValid int8 = 1 + var softErr *ErrTxnViolatesSoftConstraint + if _, _, err := bc.VerifySingleTxnSoftHardConstraints(tx, txn, distParams, verifyParams, TxnSigned); err != nil { + logger.Warningf("bc.VerifySingleTxnSoftHardConstraints failed for txn %s: %v", txn.Hash().Hex(), err) + switch e := err.(type) { + case ErrTxnViolatesSoftConstraint: + softErr = &e + isValid = 0 + case ErrTxnViolatesHardConstraint: + return false, nil, err + default: + return false, nil, err + } + } + + hash := txn.Hash() + known, err := utp.txns.hasKey(tx, hash) + if err != nil { + logger.Errorf("InjectTransaction check txn exists failed: %v", err) + return false, nil, err + } + + // Update if we already have this txn + if known { + if err := utp.txns.update(tx, hash, func(utxn *UnconfirmedTransaction) error { + now := time.Now().UTC().UnixNano() + utxn.Received = now + utxn.Checked = now + utxn.IsValid = isValid + return nil + }); err != nil { + logger.Errorf("InjectTransaction update known txn failed: %v", err) + return false, nil, err + } + + return true, softErr, nil + } + + utx := NewUnconfirmedTransaction(txn) + utx.IsValid = isValid + + // add txn to index + if err := utp.txns.put(tx, &utx); err != nil { + logger.Errorf("InjectTransaction put new unconfirmed txn failed: %v", err) + return false, nil, err + } + + head, err := bc.Head(tx) + if err != nil { + logger.Errorf("InjectTransaction bc.Head() failed: %v", err) + return false, nil, err + } + + // update unconfirmed unspent + createdUnspents := coin.CreateUnspents(head.Head, txn) + if err := utp.unspent.put(tx, hash, createdUnspents); err != nil { + logger.Errorf("InjectTransaction put new unspent outputs: %v", err) + return false, nil, err + } + + return false, softErr, nil +} + +// AllRawTransactions returns underlying coin.Transactions +func (utp *UnconfirmedTransactionPool) AllRawTransactions(tx *dbutil.Tx) (coin.Transactions, error) { + utxns, err := utp.txns.getAll(tx) + if err != nil { + return nil, err + } + + txns := make(coin.Transactions, len(utxns)) + for i := range utxns { + txns[i] = utxns[i].Transaction + } + return txns, nil +} + +// Remove a single txn by hash +func (utp *UnconfirmedTransactionPool) removeTransaction(tx *dbutil.Tx, txHash cipher.SHA256) error { + if err := utp.txns.delete(tx, txHash); err != nil { + return err + } + + return utp.unspent.delete(tx, txHash) +} + +// RemoveTransactions remove transactions with dbutil.Tx +func (utp *UnconfirmedTransactionPool) RemoveTransactions(tx *dbutil.Tx, txHashes []cipher.SHA256) error { + for i := range txHashes { + if err := utp.removeTransaction(tx, txHashes[i]); err != nil { + return err + } + } + + return nil +} + +// Refresh checks all unconfirmed txns against the blockchain. +// If the transaction becomes invalid it is marked invalid. +// If the transaction becomes valid it is marked valid and is returned to the caller. +func (utp *UnconfirmedTransactionPool) Refresh(tx *dbutil.Tx, bc Blockchainer, distParams params.Distribution, verifyParams params.VerifyTxn) ([]cipher.SHA256, error) { + utxns, err := utp.txns.getAll(tx) + if err != nil { + return nil, err + } + + now := time.Now().UTC() + var nowValid []cipher.SHA256 + + for _, utxn := range utxns { + utxn.Checked = now.UnixNano() + + _, _, err := bc.VerifySingleTxnSoftHardConstraints(tx, utxn.Transaction, distParams, verifyParams, TxnSigned) + + switch err.(type) { + case ErrTxnViolatesSoftConstraint, ErrTxnViolatesHardConstraint: + utxn.IsValid = 0 + case nil: + if utxn.IsValid == 0 { + nowValid = append(nowValid, utxn.Transaction.Hash()) + } + utxn.IsValid = 1 + default: + return nil, err + } + + if err := utp.txns.put(tx, &utxn); err != nil { + return nil, err + } + } + + return nowValid, nil +} + +// RemoveInvalid checks all unconfirmed txns against the blockchain. +// If a transaction violates hard constraints it is removed from the pool. +// The transactions that were removed are returned. +func (utp *UnconfirmedTransactionPool) RemoveInvalid(tx *dbutil.Tx, bc Blockchainer) ([]cipher.SHA256, error) { + var removeUtxns []cipher.SHA256 + + utxns, err := utp.txns.getAll(tx) + if err != nil { + return nil, err + } + + for _, utxn := range utxns { + err := bc.VerifySingleTxnHardConstraints(tx, utxn.Transaction, TxnSigned) + if err != nil { + switch err.(type) { + case ErrTxnViolatesHardConstraint: + removeUtxns = append(removeUtxns, utxn.Transaction.Hash()) + default: + return nil, err + } + } + } + + if err := utp.RemoveTransactions(tx, removeUtxns); err != nil { + return nil, err + } + + return removeUtxns, nil +} + +// FilterKnown returns txn hashes with known ones removed +func (utp *UnconfirmedTransactionPool) FilterKnown(tx *dbutil.Tx, txns []cipher.SHA256) ([]cipher.SHA256, error) { + var unknown []cipher.SHA256 + + for _, h := range txns { + if hasKey, err := utp.txns.hasKey(tx, h); err != nil { + return nil, err + } else if !hasKey { + unknown = append(unknown, h) + } + } + + return unknown, nil +} + +// GetKnown returns all known transactions from the pool, given hashes to select +func (utp *UnconfirmedTransactionPool) GetKnown(tx *dbutil.Tx, txns []cipher.SHA256) (coin.Transactions, error) { + var known coin.Transactions + + for _, h := range txns { + if tx, err := utp.txns.get(tx, h); err != nil { + return nil, err + } else if tx != nil { + known = append(known, tx.Transaction) + } + } + + return known, nil +} + +// RecvOfAddresses returns unconfirmed receiving uxouts of addresses +func (utp *UnconfirmedTransactionPool) RecvOfAddresses(tx *dbutil.Tx, bh coin.BlockHeader, addrs []cipher.Address) (coin.AddressUxOuts, error) { + addrm := make(map[cipher.Address]struct{}, len(addrs)) + for _, addr := range addrs { + addrm[addr] = struct{}{} + } + + auxs := make(coin.AddressUxOuts, len(addrs)) + if err := utp.txns.forEach(tx, func(_ cipher.SHA256, txn UnconfirmedTransaction) error { + for i, o := range txn.Transaction.Out { + if _, ok := addrm[o.Address]; ok { + uxout, err := coin.CreateUnspent(bh, txn.Transaction, i) + if err != nil { + return err + } + + auxs[o.Address] = append(auxs[o.Address], uxout) + } + } + return nil + }); err != nil { + return nil, err + } + + return auxs, nil +} + +// txnOutputsForAddrs returns unspent outputs assigned to addresses in addrs, created by a set of transactions +func txnOutputsForAddrs(bh coin.BlockHeader, addrs []cipher.Address, txns []coin.Transaction) (coin.AddressUxOuts, error) { + if len(txns) == 0 || len(addrs) == 0 { + return nil, nil + } + + addrm := make(map[cipher.Address]struct{}, len(addrs)) + for _, addr := range addrs { + addrm[addr] = struct{}{} + } + + auxs := make(coin.AddressUxOuts, len(addrs)) + + for _, txn := range txns { + for i, o := range txn.Out { + if _, ok := addrm[o.Address]; ok { + uxout, err := coin.CreateUnspent(bh, txn, i) + if err != nil { + return nil, err + } + + auxs[o.Address] = append(auxs[o.Address], uxout) + } + } + } + + return auxs, nil +} + +// GetIncomingOutputs returns all predicted incoming outputs. +func (utp *UnconfirmedTransactionPool) GetIncomingOutputs(tx *dbutil.Tx, bh coin.BlockHeader) (coin.UxArray, error) { + var outs coin.UxArray + + if err := utp.txns.forEach(tx, func(_ cipher.SHA256, txn UnconfirmedTransaction) error { + outs = append(outs, coin.CreateUnspents(bh, txn.Transaction)...) + return nil + }); err != nil { + return nil, err + } + + return outs, nil +} + +// Get returns the unconfirmed transaction of given tx hash. +func (utp *UnconfirmedTransactionPool) Get(tx *dbutil.Tx, hash cipher.SHA256) (*UnconfirmedTransaction, error) { + return utp.txns.get(tx, hash) +} + +// GetFiltered returns all transactions that can pass the filter +func (utp *UnconfirmedTransactionPool) GetFiltered(tx *dbutil.Tx, filter func(UnconfirmedTransaction) bool) ([]UnconfirmedTransaction, error) { + var txns []UnconfirmedTransaction + + if err := utp.txns.forEach(tx, func(_ cipher.SHA256, txn UnconfirmedTransaction) error { + if filter(txn) { + txns = append(txns, txn) + } + return nil + }); err != nil { + logger.Errorf("GetFiltered error: %v", err) + return nil, err + } + + return txns, nil +} + +// GetHashes returns transaction hashes that can pass the filter +func (utp *UnconfirmedTransactionPool) GetHashes(tx *dbutil.Tx, filter func(UnconfirmedTransaction) bool) ([]cipher.SHA256, error) { + var hashes []cipher.SHA256 + + if err := utp.txns.forEach(tx, func(hash cipher.SHA256, txn UnconfirmedTransaction) error { + if filter(txn) { + hashes = append(hashes, hash) + } + return nil + }); err != nil { + logger.Errorf("GetHashes error: %v", err) + return nil, err + } + + return hashes, nil +} + +// ForEach iterate the pool with given callback function +func (utp *UnconfirmedTransactionPool) ForEach(tx *dbutil.Tx, f func(cipher.SHA256, UnconfirmedTransaction) error) error { + return utp.txns.forEach(tx, f) +} + +// GetUnspentsOfAddr returns unspent outputs of given address in unspent tx pool +func (utp *UnconfirmedTransactionPool) GetUnspentsOfAddr(tx *dbutil.Tx, addr cipher.Address) (coin.UxArray, error) { + return utp.unspent.getByAddr(tx, addr) +} + +// IsValid can be used as filter function +func IsValid(tx UnconfirmedTransaction) bool { + return tx.IsValid == 1 +} + +// All use as return all filter +func All(tx UnconfirmedTransaction) bool { + return true +} + +// Len returns the number of unconfirmed transactions +func (utp *UnconfirmedTransactionPool) Len(tx *dbutil.Tx) (uint64, error) { + return utp.txns.len(tx) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/unconfirmed_transaction_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/unconfirmed_transaction_skyencoder.go new file mode 100644 index 00000000..37365a07 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/unconfirmed_transaction_skyencoder.go @@ -0,0 +1,418 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package visor + +import ( + "errors" + "math" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" + "github.com/SkycoinProject/skycoin/src/coin" +) + +// encodeSizeUnconfirmedTransaction computes the size of an encoded object of type UnconfirmedTransaction +func encodeSizeUnconfirmedTransaction(obj *UnconfirmedTransaction) uint64 { + i0 := uint64(0) + + // obj.Transaction.Length + i0 += 4 + + // obj.Transaction.Type + i0++ + + // obj.Transaction.InnerHash + i0 += 32 + + // obj.Transaction.Sigs + i0 += 4 + { + i1 := uint64(0) + + // x1 + i1 += 65 + + i0 += uint64(len(obj.Transaction.Sigs)) * i1 + } + + // obj.Transaction.In + i0 += 4 + { + i1 := uint64(0) + + // x1 + i1 += 32 + + i0 += uint64(len(obj.Transaction.In)) * i1 + } + + // obj.Transaction.Out + i0 += 4 + { + i1 := uint64(0) + + // x1.Address.Version + i1++ + + // x1.Address.Key + i1 += 20 + + // x1.Coins + i1 += 8 + + // x1.Hours + i1 += 8 + + i0 += uint64(len(obj.Transaction.Out)) * i1 + } + + // obj.Received + i0 += 8 + + // obj.Checked + i0 += 8 + + // obj.Announced + i0 += 8 + + // obj.IsValid + i0++ + + return i0 +} + +// encodeUnconfirmedTransaction encodes an object of type UnconfirmedTransaction to a buffer allocated to the exact size +// required to encode the object. +func encodeUnconfirmedTransaction(obj *UnconfirmedTransaction) ([]byte, error) { + n := encodeSizeUnconfirmedTransaction(obj) + buf := make([]byte, n) + + if err := encodeUnconfirmedTransactionToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeUnconfirmedTransactionToBuffer encodes an object of type UnconfirmedTransaction to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeUnconfirmedTransactionToBuffer(buf []byte, obj *UnconfirmedTransaction) error { + if uint64(len(buf)) < encodeSizeUnconfirmedTransaction(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.Transaction.Length + e.Uint32(obj.Transaction.Length) + + // obj.Transaction.Type + e.Uint8(obj.Transaction.Type) + + // obj.Transaction.InnerHash + e.CopyBytes(obj.Transaction.InnerHash[:]) + + // obj.Transaction.Sigs maxlen check + if len(obj.Transaction.Sigs) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // obj.Transaction.Sigs length check + if uint64(len(obj.Transaction.Sigs)) > math.MaxUint32 { + return errors.New("obj.Transaction.Sigs length exceeds math.MaxUint32") + } + + // obj.Transaction.Sigs length + e.Uint32(uint32(len(obj.Transaction.Sigs))) + + // obj.Transaction.Sigs + for _, x := range obj.Transaction.Sigs { + + // x + e.CopyBytes(x[:]) + + } + + // obj.Transaction.In maxlen check + if len(obj.Transaction.In) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // obj.Transaction.In length check + if uint64(len(obj.Transaction.In)) > math.MaxUint32 { + return errors.New("obj.Transaction.In length exceeds math.MaxUint32") + } + + // obj.Transaction.In length + e.Uint32(uint32(len(obj.Transaction.In))) + + // obj.Transaction.In + for _, x := range obj.Transaction.In { + + // x + e.CopyBytes(x[:]) + + } + + // obj.Transaction.Out maxlen check + if len(obj.Transaction.Out) > 65535 { + return encoder.ErrMaxLenExceeded + } + + // obj.Transaction.Out length check + if uint64(len(obj.Transaction.Out)) > math.MaxUint32 { + return errors.New("obj.Transaction.Out length exceeds math.MaxUint32") + } + + // obj.Transaction.Out length + e.Uint32(uint32(len(obj.Transaction.Out))) + + // obj.Transaction.Out + for _, x := range obj.Transaction.Out { + + // x.Address.Version + e.Uint8(x.Address.Version) + + // x.Address.Key + e.CopyBytes(x.Address.Key[:]) + + // x.Coins + e.Uint64(x.Coins) + + // x.Hours + e.Uint64(x.Hours) + + } + + // obj.Received + e.Int64(obj.Received) + + // obj.Checked + e.Int64(obj.Checked) + + // obj.Announced + e.Int64(obj.Announced) + + // obj.IsValid + e.Int8(obj.IsValid) + + return nil +} + +// decodeUnconfirmedTransaction decodes an object of type UnconfirmedTransaction from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeUnconfirmedTransaction(buf []byte, obj *UnconfirmedTransaction) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.Transaction.Length + i, err := d.Uint32() + if err != nil { + return 0, err + } + obj.Transaction.Length = i + } + + { + // obj.Transaction.Type + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Transaction.Type = i + } + + { + // obj.Transaction.InnerHash + if len(d.Buffer) < len(obj.Transaction.InnerHash) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Transaction.InnerHash[:], d.Buffer[:len(obj.Transaction.InnerHash)]) + d.Buffer = d.Buffer[len(obj.Transaction.InnerHash):] + } + + { + // obj.Transaction.Sigs + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Transaction.Sigs = make([]cipher.Sig, length) + + for z2 := range obj.Transaction.Sigs { + { + // obj.Transaction.Sigs[z2] + if len(d.Buffer) < len(obj.Transaction.Sigs[z2]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Transaction.Sigs[z2][:], d.Buffer[:len(obj.Transaction.Sigs[z2])]) + d.Buffer = d.Buffer[len(obj.Transaction.Sigs[z2]):] + } + + } + } + } + + { + // obj.Transaction.In + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Transaction.In = make([]cipher.SHA256, length) + + for z2 := range obj.Transaction.In { + { + // obj.Transaction.In[z2] + if len(d.Buffer) < len(obj.Transaction.In[z2]) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Transaction.In[z2][:], d.Buffer[:len(obj.Transaction.In[z2])]) + d.Buffer = d.Buffer[len(obj.Transaction.In[z2]):] + } + + } + } + } + + { + // obj.Transaction.Out + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length > 65535 { + return 0, encoder.ErrMaxLenExceeded + } + + if length != 0 { + obj.Transaction.Out = make([]coin.TransactionOutput, length) + + for z2 := range obj.Transaction.Out { + { + // obj.Transaction.Out[z2].Address.Version + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.Transaction.Out[z2].Address.Version = i + } + + { + // obj.Transaction.Out[z2].Address.Key + if len(d.Buffer) < len(obj.Transaction.Out[z2].Address.Key) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.Transaction.Out[z2].Address.Key[:], d.Buffer[:len(obj.Transaction.Out[z2].Address.Key)]) + d.Buffer = d.Buffer[len(obj.Transaction.Out[z2].Address.Key):] + } + + { + // obj.Transaction.Out[z2].Coins + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Transaction.Out[z2].Coins = i + } + + { + // obj.Transaction.Out[z2].Hours + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.Transaction.Out[z2].Hours = i + } + + } + } + } + + { + // obj.Received + i, err := d.Int64() + if err != nil { + return 0, err + } + obj.Received = i + } + + { + // obj.Checked + i, err := d.Int64() + if err != nil { + return 0, err + } + obj.Checked = i + } + + { + // obj.Announced + i, err := d.Int64() + if err != nil { + return 0, err + } + obj.Announced = i + } + + { + // obj.IsValid + i, err := d.Int8() + if err != nil { + return 0, err + } + obj.IsValid = i + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeUnconfirmedTransactionExact decodes an object of type UnconfirmedTransaction from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeUnconfirmedTransactionExact(buf []byte, obj *UnconfirmedTransaction) error { + if n, err := decodeUnconfirmedTransaction(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/unconfirmed_transaction_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/unconfirmed_transaction_skyencoder_test.go new file mode 100644 index 00000000..777b61ff --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/unconfirmed_transaction_skyencoder_test.go @@ -0,0 +1,421 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package visor + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +func newEmptyUnconfirmedTransactionForEncodeTest() *UnconfirmedTransaction { + var obj UnconfirmedTransaction + return &obj +} + +func newRandomUnconfirmedTransactionForEncodeTest(t *testing.T, rand *mathrand.Rand) *UnconfirmedTransaction { + var obj UnconfirmedTransaction + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenUnconfirmedTransactionForEncodeTest(t *testing.T, rand *mathrand.Rand) *UnconfirmedTransaction { + var obj UnconfirmedTransaction + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilUnconfirmedTransactionForEncodeTest(t *testing.T, rand *mathrand.Rand) *UnconfirmedTransaction { + var obj UnconfirmedTransaction + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderUnconfirmedTransaction(t *testing.T, obj *UnconfirmedTransaction) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeUnconfirmedTransaction(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeUnconfirmedTransaction() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeUnconfirmedTransaction(obj) + if err != nil { + t.Fatalf("encodeUnconfirmedTransaction failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeUnconfirmedTransaction produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeUnconfirmedTransaction()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeUnconfirmedTransactionToBuffer(data3, obj); err != nil { + t.Fatalf("encodeUnconfirmedTransactionToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 UnconfirmedTransaction + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 UnconfirmedTransaction + if n, err := decodeUnconfirmedTransaction(data2, &obj3); err != nil { + t.Fatalf("decodeUnconfirmedTransaction failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeUnconfirmedTransaction bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeUnconfirmedTransaction()") + } + + // Decode, excess buffer + var obj4 UnconfirmedTransaction + n, err := decodeUnconfirmedTransaction(data3, &obj4) + if err != nil { + t.Fatalf("decodeUnconfirmedTransaction failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeUnconfirmedTransaction bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeUnconfirmedTransaction bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeUnconfirmedTransaction()") + } + + // DecodeExact + var obj5 UnconfirmedTransaction + if err := decodeUnconfirmedTransactionExact(data2, &obj5); err != nil { + t.Fatalf("decodeUnconfirmedTransaction failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeUnconfirmedTransaction()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeUnconfirmedTransaction(data4, &obj3); err != nil { + t.Fatalf("decodeUnconfirmedTransaction failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeUnconfirmedTransaction bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderUnconfirmedTransaction(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *UnconfirmedTransaction + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptyUnconfirmedTransactionForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomUnconfirmedTransactionForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenUnconfirmedTransactionForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilUnconfirmedTransactionForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderUnconfirmedTransaction(t, tc.obj) + }) + } +} + +func decodeUnconfirmedTransactionExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj UnconfirmedTransaction + if _, err := decodeUnconfirmedTransaction(buf, &obj); err == nil { + t.Fatal("decodeUnconfirmedTransaction: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeUnconfirmedTransaction: expected error %q, got %q", expectedErr, err) + } +} + +func decodeUnconfirmedTransactionExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj UnconfirmedTransaction + if err := decodeUnconfirmedTransactionExact(buf, &obj); err == nil { + t.Fatal("decodeUnconfirmedTransactionExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeUnconfirmedTransactionExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderUnconfirmedTransactionDecodeErrors(t *testing.T, k int, tag string, obj *UnconfirmedTransaction) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeUnconfirmedTransaction(obj) + buf, err := encodeUnconfirmedTransaction(obj) + if err != nil { + t.Fatalf("encodeUnconfirmedTransaction failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeUnconfirmedTransactionExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeUnconfirmedTransactionExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeUnconfirmedTransactionExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeUnconfirmedTransactionExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeUnconfirmedTransactionExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderUnconfirmedTransactionDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptyUnconfirmedTransactionForEncodeTest() + fullObj := newRandomUnconfirmedTransactionForEncodeTest(t, rand) + testSkyencoderUnconfirmedTransactionDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderUnconfirmedTransactionDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/ux_array_skyencoder.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/ux_array_skyencoder.go new file mode 100644 index 00000000..84611051 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/ux_array_skyencoder.go @@ -0,0 +1,216 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package visor + +import ( + "errors" + "math" + + "github.com/SkycoinProject/skycoin/src/cipher/encoder" + "github.com/SkycoinProject/skycoin/src/coin" +) + +// encodeSizeUxArray computes the size of an encoded object of type UxArray +func encodeSizeUxArray(obj *UxArray) uint64 { + i0 := uint64(0) + + // obj.UxArray + i0 += 4 + { + i1 := uint64(0) + + // x1.Head.Time + i1 += 8 + + // x1.Head.BkSeq + i1 += 8 + + // x1.Body.SrcTransaction + i1 += 32 + + // x1.Body.Address.Version + i1++ + + // x1.Body.Address.Key + i1 += 20 + + // x1.Body.Coins + i1 += 8 + + // x1.Body.Hours + i1 += 8 + + i0 += uint64(len(obj.UxArray)) * i1 + } + + return i0 +} + +// encodeUxArray encodes an object of type UxArray to a buffer allocated to the exact size +// required to encode the object. +func encodeUxArray(obj *UxArray) ([]byte, error) { + n := encodeSizeUxArray(obj) + buf := make([]byte, n) + + if err := encodeUxArrayToBuffer(buf, obj); err != nil { + return nil, err + } + + return buf, nil +} + +// encodeUxArrayToBuffer encodes an object of type UxArray to a []byte buffer. +// The buffer must be large enough to encode the object, otherwise an error is returned. +func encodeUxArrayToBuffer(buf []byte, obj *UxArray) error { + if uint64(len(buf)) < encodeSizeUxArray(obj) { + return encoder.ErrBufferUnderflow + } + + e := &encoder.Encoder{ + Buffer: buf[:], + } + + // obj.UxArray length check + if uint64(len(obj.UxArray)) > math.MaxUint32 { + return errors.New("obj.UxArray length exceeds math.MaxUint32") + } + + // obj.UxArray length + e.Uint32(uint32(len(obj.UxArray))) + + // obj.UxArray + for _, x := range obj.UxArray { + + // x.Head.Time + e.Uint64(x.Head.Time) + + // x.Head.BkSeq + e.Uint64(x.Head.BkSeq) + + // x.Body.SrcTransaction + e.CopyBytes(x.Body.SrcTransaction[:]) + + // x.Body.Address.Version + e.Uint8(x.Body.Address.Version) + + // x.Body.Address.Key + e.CopyBytes(x.Body.Address.Key[:]) + + // x.Body.Coins + e.Uint64(x.Body.Coins) + + // x.Body.Hours + e.Uint64(x.Body.Hours) + + } + + return nil +} + +// decodeUxArray decodes an object of type UxArray from a buffer. +// Returns the number of bytes used from the buffer to decode the object. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +func decodeUxArray(buf []byte, obj *UxArray) (uint64, error) { + d := &encoder.Decoder{ + Buffer: buf[:], + } + + { + // obj.UxArray + + ul, err := d.Uint32() + if err != nil { + return 0, err + } + + length := int(ul) + if length < 0 || length > len(d.Buffer) { + return 0, encoder.ErrBufferUnderflow + } + + if length != 0 { + obj.UxArray = make([]coin.UxOut, length) + + for z1 := range obj.UxArray { + { + // obj.UxArray[z1].Head.Time + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.UxArray[z1].Head.Time = i + } + + { + // obj.UxArray[z1].Head.BkSeq + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.UxArray[z1].Head.BkSeq = i + } + + { + // obj.UxArray[z1].Body.SrcTransaction + if len(d.Buffer) < len(obj.UxArray[z1].Body.SrcTransaction) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.UxArray[z1].Body.SrcTransaction[:], d.Buffer[:len(obj.UxArray[z1].Body.SrcTransaction)]) + d.Buffer = d.Buffer[len(obj.UxArray[z1].Body.SrcTransaction):] + } + + { + // obj.UxArray[z1].Body.Address.Version + i, err := d.Uint8() + if err != nil { + return 0, err + } + obj.UxArray[z1].Body.Address.Version = i + } + + { + // obj.UxArray[z1].Body.Address.Key + if len(d.Buffer) < len(obj.UxArray[z1].Body.Address.Key) { + return 0, encoder.ErrBufferUnderflow + } + copy(obj.UxArray[z1].Body.Address.Key[:], d.Buffer[:len(obj.UxArray[z1].Body.Address.Key)]) + d.Buffer = d.Buffer[len(obj.UxArray[z1].Body.Address.Key):] + } + + { + // obj.UxArray[z1].Body.Coins + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.UxArray[z1].Body.Coins = i + } + + { + // obj.UxArray[z1].Body.Hours + i, err := d.Uint64() + if err != nil { + return 0, err + } + obj.UxArray[z1].Body.Hours = i + } + + } + } + } + + return uint64(len(buf) - len(d.Buffer)), nil +} + +// decodeUxArrayExact decodes an object of type UxArray from a buffer. +// If the buffer not long enough to decode the object, returns encoder.ErrBufferUnderflow. +// If the buffer is longer than required to decode the object, returns encoder.ErrRemainingBytes. +func decodeUxArrayExact(buf []byte, obj *UxArray) error { + if n, err := decodeUxArray(buf, obj); err != nil { + return err + } else if n != uint64(len(buf)) { + return encoder.ErrRemainingBytes + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/ux_array_skyencoder_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/ux_array_skyencoder_test.go new file mode 100644 index 00000000..42b649bd --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/ux_array_skyencoder_test.go @@ -0,0 +1,421 @@ +// Code generated by github.com/SkycoinProject/skyencoder. DO NOT EDIT. + +package visor + +import ( + "bytes" + "fmt" + mathrand "math/rand" + "reflect" + "strings" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/SkycoinProject/encodertest" + "github.com/SkycoinProject/skycoin/src/cipher/encoder" +) + +func newEmptyUxArrayForEncodeTest() *UxArray { + var obj UxArray + return &obj +} + +func newRandomUxArrayForEncodeTest(t *testing.T, rand *mathrand.Rand) *UxArray { + var obj UxArray + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 4, + MinRandLen: 1, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenUxArrayForEncodeTest(t *testing.T, rand *mathrand.Rand) *UxArray { + var obj UxArray + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: false, + EmptyMapNil: false, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func newRandomZeroLenNilUxArrayForEncodeTest(t *testing.T, rand *mathrand.Rand) *UxArray { + var obj UxArray + err := encodertest.PopulateRandom(&obj, rand, encodertest.PopulateRandomOptions{ + MaxRandLen: 0, + MinRandLen: 0, + EmptySliceNil: true, + EmptyMapNil: true, + }) + if err != nil { + t.Fatalf("encodertest.PopulateRandom failed: %v", err) + } + return &obj +} + +func testSkyencoderUxArray(t *testing.T, obj *UxArray) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + // encodeSize + + n1 := encoder.Size(obj) + n2 := encodeSizeUxArray(obj) + + if uint64(n1) != n2 { + t.Fatalf("encoder.Size() != encodeSizeUxArray() (%d != %d)", n1, n2) + } + + // Encode + + // encoder.Serialize + data1 := encoder.Serialize(obj) + + // Encode + data2, err := encodeUxArray(obj) + if err != nil { + t.Fatalf("encodeUxArray failed: %v", err) + } + if uint64(len(data2)) != n2 { + t.Fatal("encodeUxArray produced bytes of unexpected length") + } + if len(data1) != len(data2) { + t.Fatalf("len(encoder.Serialize()) != len(encodeUxArray()) (%d != %d)", len(data1), len(data2)) + } + + // EncodeToBuffer + data3 := make([]byte, n2+5) + if err := encodeUxArrayToBuffer(data3, obj); err != nil { + t.Fatalf("encodeUxArrayToBuffer failed: %v", err) + } + + if !bytes.Equal(data1, data2) { + t.Fatal("encoder.Serialize() != encode[1]s()") + } + + // Decode + + // encoder.DeserializeRaw + var obj2 UxArray + if n, err := encoder.DeserializeRaw(data1, &obj2); err != nil { + t.Fatalf("encoder.DeserializeRaw failed: %v", err) + } else if n != uint64(len(data1)) { + t.Fatalf("encoder.DeserializeRaw failed: %v", encoder.ErrRemainingBytes) + } + if !cmp.Equal(*obj, obj2, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw result wrong") + } + + // Decode + var obj3 UxArray + if n, err := decodeUxArray(data2, &obj3); err != nil { + t.Fatalf("decodeUxArray failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeUxArray bytes read length should be %d, is %d", len(data2), n) + } + if !cmp.Equal(obj2, obj3, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeUxArray()") + } + + // Decode, excess buffer + var obj4 UxArray + n, err := decodeUxArray(data3, &obj4) + if err != nil { + t.Fatalf("decodeUxArray failed: %v", err) + } + + if hasOmitEmptyField(&obj4) && omitEmptyLen(&obj4) == 0 { + // 4 bytes read for the omitEmpty length, which should be zero (see the 5 bytes added above) + if n != n2+4 { + t.Fatalf("decodeUxArray bytes read length should be %d, is %d", n2+4, n) + } + } else { + if n != n2 { + t.Fatalf("decodeUxArray bytes read length should be %d, is %d", n2, n) + } + } + if !cmp.Equal(obj2, obj4, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeUxArray()") + } + + // DecodeExact + var obj5 UxArray + if err := decodeUxArrayExact(data2, &obj5); err != nil { + t.Fatalf("decodeUxArray failed: %v", err) + } + if !cmp.Equal(obj2, obj5, cmpopts.EquateEmpty(), encodertest.IgnoreAllUnexported()) { + t.Fatal("encoder.DeserializeRaw() != decodeUxArray()") + } + + // Check that the bytes read value is correct when providing an extended buffer + if !hasOmitEmptyField(&obj3) || omitEmptyLen(&obj3) > 0 { + padding := []byte{0xFF, 0xFE, 0xFD, 0xFC} + data4 := append(data2[:], padding...) + if n, err := decodeUxArray(data4, &obj3); err != nil { + t.Fatalf("decodeUxArray failed: %v", err) + } else if n != uint64(len(data2)) { + t.Fatalf("decodeUxArray bytes read length should be %d, is %d", len(data2), n) + } + } +} + +func TestSkyencoderUxArray(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + + type testCase struct { + name string + obj *UxArray + } + + cases := []testCase{ + { + name: "empty object", + obj: newEmptyUxArrayForEncodeTest(), + }, + } + + nRandom := 10 + + for i := 0; i < nRandom; i++ { + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d", i), + obj: newRandomUxArrayForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents", i), + obj: newRandomZeroLenUxArrayForEncodeTest(t, rand), + }) + cases = append(cases, testCase{ + name: fmt.Sprintf("randomly populated object %d with zero length variable length contents set to nil", i), + obj: newRandomZeroLenNilUxArrayForEncodeTest(t, rand), + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + testSkyencoderUxArray(t, tc.obj) + }) + } +} + +func decodeUxArrayExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj UxArray + if _, err := decodeUxArray(buf, &obj); err == nil { + t.Fatal("decodeUxArray: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeUxArray: expected error %q, got %q", expectedErr, err) + } +} + +func decodeUxArrayExactExpectError(t *testing.T, buf []byte, expectedErr error) { + var obj UxArray + if err := decodeUxArrayExact(buf, &obj); err == nil { + t.Fatal("decodeUxArrayExact: expected error, got nil") + } else if err != expectedErr { + t.Fatalf("decodeUxArrayExact: expected error %q, got %q", expectedErr, err) + } +} + +func testSkyencoderUxArrayDecodeErrors(t *testing.T, k int, tag string, obj *UxArray) { + isEncodableField := func(f reflect.StructField) bool { + // Skip unexported fields + if f.PkgPath != "" { + return false + } + + // Skip fields disabled with and enc:"- struct tag + tag := f.Tag.Get("enc") + return !strings.HasPrefix(tag, "-,") && tag != "-" + } + + numEncodableFields := func(obj interface{}) int { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + + n := 0 + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if !isEncodableField(f) { + continue + } + n++ + } + return n + default: + return 0 + } + } + + hasOmitEmptyField := func(obj interface{}) bool { + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + t := v.Type() + n := v.NumField() + f := t.Field(n - 1) + tag := f.Tag.Get("enc") + return isEncodableField(f) && strings.Contains(tag, ",omitempty") + default: + return false + } + } + + // returns the number of bytes encoded by an omitempty field on a given object + omitEmptyLen := func(obj interface{}) uint64 { + if !hasOmitEmptyField(obj) { + return 0 + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + } + + switch v.Kind() { + case reflect.Struct: + n := v.NumField() + f := v.Field(n - 1) + if f.Len() == 0 { + return 0 + } + return uint64(4 + f.Len()) + + default: + return 0 + } + } + + n := encodeSizeUxArray(obj) + buf, err := encodeUxArray(obj) + if err != nil { + t.Fatalf("encodeUxArray failed: %v", err) + } + + // A nil buffer cannot decode, unless the object is a struct with a single omitempty field + if hasOmitEmptyField(obj) && numEncodableFields(obj) > 1 { + t.Run(fmt.Sprintf("%d %s buffer underflow nil", k, tag), func(t *testing.T) { + decodeUxArrayExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow nil", k, tag), func(t *testing.T) { + decodeUxArrayExactExpectError(t, nil, encoder.ErrBufferUnderflow) + }) + } + + // Test all possible truncations of the encoded byte array, but skip + // a truncation that would be valid where omitempty is removed + skipN := n - omitEmptyLen(obj) + for i := uint64(0); i < n; i++ { + if i == skipN { + continue + } + + t.Run(fmt.Sprintf("%d %s buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeUxArrayExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + + t.Run(fmt.Sprintf("%d %s exact buffer underflow bytes=%d", k, tag, i), func(t *testing.T) { + decodeUxArrayExactExpectError(t, buf[:i], encoder.ErrBufferUnderflow) + }) + } + + // Append 5 bytes for omit empty with a 0 length prefix, to cause an ErrRemainingBytes. + // If only 1 byte is appended, the decoder will try to read the 4-byte length prefix, + // and return an ErrBufferUnderflow instead + if hasOmitEmptyField(obj) { + buf = append(buf, []byte{0, 0, 0, 0, 0}...) + } else { + buf = append(buf, 0) + } + + t.Run(fmt.Sprintf("%d %s exact buffer remaining bytes", k, tag), func(t *testing.T) { + decodeUxArrayExactExpectError(t, buf, encoder.ErrRemainingBytes) + }) +} + +func TestSkyencoderUxArrayDecodeErrors(t *testing.T) { + rand := mathrand.New(mathrand.NewSource(time.Now().Unix())) + n := 10 + + for i := 0; i < n; i++ { + emptyObj := newEmptyUxArrayForEncodeTest() + fullObj := newRandomUxArrayForEncodeTest(t, rand) + testSkyencoderUxArrayDecodeErrors(t, i, "empty", emptyObj) + testSkyencoderUxArrayDecodeErrors(t, i, "full", fullObj) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/verify.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/verify.go new file mode 100644 index 00000000..f4c333f2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/verify.go @@ -0,0 +1,336 @@ +package visor + +import ( + "errors" + "fmt" + + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/util/fee" +) + +/* + +verify.go: Methods for handling transaction verification + +There are two levels of transaction constraint: HARD and SOFT +There are two situations in which transactions are verified: + * When included in a block + * When not in a block + +For transactions in a block, use VerifyBlockTxnConstraints. +For transactions outside of a block, use VerifySingleTxnHardConstraints and VerifySingleTxnSoftConstraints. + +VerifyBlockTxnConstraints only checks hard constraints. Soft constraints do not apply for transactions inside of a block. + +Soft and hard constraints have special handling for single transactions. + +When the transaction is received over the network, a transaction is not injected to the pool if it violates the HARD constraints. +If it violates soft constraints, it is still injected to the pool (TODO: with expiration) but is not rebroadcast to peers. +If it does not violate any constraints it is injected and rebroadcast to peers. + +When the transaction is created by the user (with create_rawtx or /spend), SOFT and HARD constraints apply, to prevent +the user from injecting a transaction to their local pool that cannot be confirmed. + +When creating a new block from transactions, SOFT and HARD constraints apply. + +Transactions in the unconfirmed pool are periodically checked for validity. (TODO: audit/implement this feature) +The transaction pool state transfer phases are as follows: + valid -> hard_invalid: remove + valid -> soft_invalid: mark as invalid + soft_invalid -> valid: mark as valid, broadcast + soft_invalid -> hard_invalid: remove + soft_invalid -> expired: remove + +HARD constraints can NEVER be violated. These include: + - Malformed transaction + - Double spends + - NOTE: Double spend verification must be done against the unspent output set, + the methods here do not operate on the unspent output set. + They accept a `uxIn coin.UxArray` argument, which are the unspents associated + with the transaction's inputs. The unspents must be queried from the unspent + output set first, thus if any unspent is not found for the input, it cannot be spent. + +SOFT constraints are based upon mutable parameters. These include: + - Max block size (transaction must not be larger than this value) + - Insufficient coin hour burn fee + - Timelocked distribution addresses + - Decimal place restrictions + +NOTE: Due to a bug which allowed overflowing output coin hours to be included in a block, + overflowing output coin hours are not checked when adding a signed block, so that the existing blocks can be processed. + When creating or receiving a single transaction from the network, it is treated as a HARD constraint. + +These methods should be called via the Blockchain object when possible, +using Blockchain.VerifyBlockTxnConstraints, Blockchain.VerifySingleTxnHardConstraints and Blockchain.VerifySingleTxnSoftHardConstraints +since data from the blockchain and unspent output set are required to fully validate a transaction. + +*/ + +var ( + // ErrTxnExceedsMaxBlockSize transaction size exceeds the max block size + ErrTxnExceedsMaxBlockSize = errors.New("Transaction size bigger than max block size") + // ErrTxnIsLocked transaction has locked address inputs + ErrTxnIsLocked = errors.New("Transaction has locked address inputs") +) + +// TxnSignedFlag indicates if the transaction is unsigned or not +type TxnSignedFlag int + +const ( + // TxnSigned is used for signed transactions + TxnSigned TxnSignedFlag = 1 + // TxnUnsigned is used for unsigned transactions + TxnUnsigned TxnSignedFlag = 2 +) + +// ErrTxnViolatesHardConstraint is returned when a transaction violates hard constraints +type ErrTxnViolatesHardConstraint struct { + Err error +} + +// NewErrTxnViolatesHardConstraint creates ErrTxnViolatesHardConstraint +func NewErrTxnViolatesHardConstraint(err error) error { + if err == nil { + return nil + } + return ErrTxnViolatesHardConstraint{ + Err: err, + } +} + +func (e ErrTxnViolatesHardConstraint) Error() string { + return fmt.Sprintf("Transaction violates hard constraint: %v", e.Err) +} + +// ErrTxnViolatesSoftConstraint is returned when a transaction violates soft constraints +type ErrTxnViolatesSoftConstraint struct { + Err error +} + +// NewErrTxnViolatesSoftConstraint creates ErrTxnViolatesSoftConstraint +func NewErrTxnViolatesSoftConstraint(err error) error { + if err == nil { + return nil + } + return ErrTxnViolatesSoftConstraint{ + Err: err, + } +} + +func (e ErrTxnViolatesSoftConstraint) Error() string { + return fmt.Sprintf("Transaction violates soft constraint: %v", e.Err) +} + +// ErrTxnViolatesUserConstraint is returned when a transaction violates user constraints +type ErrTxnViolatesUserConstraint struct { + Err error +} + +// NewErrTxnViolatesUserConstraint creates ErrTxnViolatesUserConstraint +func NewErrTxnViolatesUserConstraint(err error) error { + if err == nil { + return nil + } + return ErrTxnViolatesUserConstraint{ + Err: err, + } +} + +func (e ErrTxnViolatesUserConstraint) Error() string { + return fmt.Sprintf("Transaction violates user constraint: %v", e.Err) +} + +// VerifySingleTxnSoftConstraints returns an error if any "soft" constraint are violated. +// "soft" constraints are enforced at the network and block publication level, +// but are not enforced at the blockchain level. +// Clients will not accept blocks that violate hard constraints, but will +// accept blocks that violate soft constraints. +// Checks: +// * That the transaction size is not greater than the max block total transaction size +// * That the transaction burn enough coin hours (the fee) +// * That if that transaction does not spend from a locked distribution address +// * That the transaction does not create outputs with a higher decimal precision than is allowed +func VerifySingleTxnSoftConstraints(txn coin.Transaction, headTime uint64, uxIn coin.UxArray, distParams params.Distribution, verifyParams params.VerifyTxn) error { + if err := verifyTxnSoftConstraints(txn, headTime, uxIn, distParams, verifyParams); err != nil { + return NewErrTxnViolatesSoftConstraint(err) + } + + return nil +} + +func verifyTxnSoftConstraints(txn coin.Transaction, headTime uint64, uxIn coin.UxArray, distParams params.Distribution, verifyParams params.VerifyTxn) error { + txnSize, err := txn.Size() + if err != nil { + return ErrTxnExceedsMaxBlockSize + } + + if txnSize > verifyParams.MaxTransactionSize { + return ErrTxnExceedsMaxBlockSize + } + + f, err := fee.TransactionFee(&txn, headTime, uxIn) + if err != nil { + return err + } + + if err := fee.VerifyTransactionFee(&txn, f, verifyParams.BurnFactor); err != nil { + return err + } + + if TransactionIsLocked(distParams, uxIn) { + return ErrTxnIsLocked + } + + // Reject transactions that do not conform to decimal restrictions + for _, o := range txn.Out { + if err := params.DropletPrecisionCheck(verifyParams.MaxDropletPrecision, o.Coins); err != nil { + return err + } + } + + return nil +} + +// VerifySingleTxnHardConstraints returns an error if any "hard" constraints are violated. +// "hard" constraints are always enforced and if violated the transaction +// should not be included in any block and any block that includes such a transaction +// should be rejected. +// Checks: +// * That the inputs to the transaction exist +// * That the transaction does not create or destroy coins +// * That the signatures on the transaction are valid +// * That there are no duplicate ux inputs +// * That there are no duplicate outputs +// * That the transaction input and output coins do not overflow uint64 +// * That the transaction input and output hours do not overflow uint64 +// NOTE: Double spends are checked against the unspent output pool when querying for uxIn +func VerifySingleTxnHardConstraints(txn coin.Transaction, head coin.BlockHeader, uxIn coin.UxArray, signed TxnSignedFlag) error { + // Check for output hours overflow + // When verifying a single transaction, this is considered a hard constraint. + // For transactions inside of a block, it is a soft constraint. + // This is due to a bug which allowed some blocks to be published with overflowing hours, + // otherwise this would always be a hard constraint. + if _, err := txn.OutputHours(); err != nil { + return NewErrTxnViolatesHardConstraint(err) + } + + // Check for input CoinHours calculation overflow, since it is ignored by + // VerifyTransactionHoursSpending + for _, ux := range uxIn { + if _, err := ux.CoinHours(head.Time); err != nil { + return NewErrTxnViolatesHardConstraint(err) + } + } + + if err := verifyTxnHardConstraints(txn, head, uxIn, signed); err != nil { + return NewErrTxnViolatesHardConstraint(err) + } + + return nil +} + +// VerifyBlockTxnConstraints returns an error if any "hard" constraints are violated. +// "hard" constraints are always enforced and if violated the transaction +// should not be included in any block and any block that includes such a transaction +// should be rejected. +// Checks: +// * That the inputs to the transaction exist +// * That the transaction does not create or destroy coins +// * That the signatures on the transaction are valid +// * That there are no duplicate ux inputs +// * That there are no duplicate outputs +// * That the transaction input and output coins do not overflow uint64 +// * That the transaction input hours do not overflow uint64 +// NOTE: Double spends are checked against the unspent output pool when querying for uxIn +// NOTE: output hours overflow is treated as a soft constraint for transactions inside of a block, due to a bug +// which allowed some blocks to be published with overflowing output hours. +func VerifyBlockTxnConstraints(txn coin.Transaction, head coin.BlockHeader, uxIn coin.UxArray) error { + if err := verifyTxnHardConstraints(txn, head, uxIn, TxnSigned); err != nil { + return NewErrTxnViolatesHardConstraint(err) + } + + return nil +} + +func verifyTxnHardConstraints(txn coin.Transaction, head coin.BlockHeader, uxIn coin.UxArray, signed TxnSignedFlag) error { + //CHECKLIST: DONE: check for duplicate ux inputs/double spending + // NOTE: Double spends are checked against the unspent output pool when querying for uxIn + + //CHECKLIST: DONE: check that inputs of transaction have not been spent + //CHECKLIST: DONE: check there are no duplicate outputs + + // Q: why are coin hours based on last block time and not + // current time? + // A: no two computers will agree on system time. Need system clock + // indepedent timing that everyone agrees on. fee values would depend on + // local clock + + // Check transaction type and length + // Check for duplicate outputs + // Check for duplicate inputs + // Check for invalid hash + // Check for no inputs + // Check for no outputs + // Check for zero coin outputs + // Check valid looking signatures + + switch signed { + case TxnSigned: + if err := txn.Verify(); err != nil { + return err + } + + // Check that signatures are allowed to spend inputs + if err := txn.VerifyInputSignatures(uxIn); err != nil { + return err + } + case TxnUnsigned: + if err := txn.VerifyUnsigned(); err != nil { + return err + } + + // Check that signatures are allowed to spend inputs for signatures that are not null + if err := txn.VerifyPartialInputSignatures(uxIn); err != nil { + return err + } + default: + logger.Panic("Invalid TxnSignedFlag") + } + + uxOut := coin.CreateUnspents(head, txn) + + // Check that there are any duplicates within this set + // NOTE: This should already be checked by txn.Verify() + if uxOut.HasDupes() { + return errors.New("Duplicate output in transaction") + } + + // Check that no coins are created or destroyed + if err := coin.VerifyTransactionCoinsSpending(uxIn, uxOut); err != nil { + return err + } + + // Check that no hours are created + // NOTE: this check doesn't catch overflow errors in the addition of hours + // Some blocks had their hours overflow, and if this rule was checked here, + // existing blocks would invalidate. + // The hours overflow check is handled as an extra step in the SingleTxnHard constraints, + // to allow existing blocks which violate the overflow rules to pass. + return coin.VerifyTransactionHoursSpending(head.Time, uxIn, uxOut) +} + +// VerifySingleTxnUserConstraints applies additional verification for a +// transaction created by the user. +// This is distinct from transactions created by other users (i.e. received over the network), +// and from transactions included in blocks. +func VerifySingleTxnUserConstraints(txn coin.Transaction) error { + for _, o := range txn.Out { + if o.Address.Null() { + err := errors.New("Transaction output is sent to the null address") + return NewErrTxnViolatesUserConstraint(err) + } + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/visor.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/visor.go new file mode 100644 index 00000000..9ab353ad --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/visor.go @@ -0,0 +1,2469 @@ +/* +Package visor manages the blockchain database and wallets + +All conceptual database operations must use a database transaction. +Callers of visor methods must ensure they do not make multiple calls without a transaction, +unless it is determined safe to do so. + +Wallet access is also gatewayed by visor, since the wallet data relates to the blockchain database. +Wallets are conceptually a second database. +*/ +package visor + +import ( + "errors" + "fmt" + "sort" + + "time" + + "github.com/sirupsen/logrus" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/util/logging" + "github.com/SkycoinProject/skycoin/src/util/mathutil" + "github.com/SkycoinProject/skycoin/src/util/timeutil" + "github.com/SkycoinProject/skycoin/src/visor/blockdb" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" + "github.com/SkycoinProject/skycoin/src/visor/historydb" + "github.com/SkycoinProject/skycoin/src/wallet" +) + +var logger = logging.MustGetLogger("visor") + +// Visor manages the blockchain +type Visor struct { + Config Config + + startedAt time.Time + db *dbutil.DB + unconfirmed UnconfirmedTransactionPooler + blockchain Blockchainer + history Historyer + wallets *wallet.Service +} + +// New creates a Visor for managing the blockchain database +func New(c Config, db *dbutil.DB, wltServ *wallet.Service) (*Visor, error) { + logger.Info("Creating new visor") + if c.IsBlockPublisher { + logger.Info("Visor running in block publisher mode") + } + + if err := c.Verify(); err != nil { + return nil, err + } + + logger.Infof("Coinhour burn factor for unconfirmed transactions is %d", c.UnconfirmedVerifyTxn.BurnFactor) + logger.Infof("Max transaction size for unconfirmed transactions is %d", c.UnconfirmedVerifyTxn.MaxTransactionSize) + logger.Infof("Max decimals for unconfirmed transactions is %d", c.UnconfirmedVerifyTxn.MaxDropletPrecision) + logger.Infof("Coinhour burn factor for transactions when creating blocks is %d", c.CreateBlockVerifyTxn.BurnFactor) + logger.Infof("Max transaction size for transactions when creating blocks is %d", c.CreateBlockVerifyTxn.MaxTransactionSize) + logger.Infof("Max decimals for transactions when creating blocks is %d", c.CreateBlockVerifyTxn.MaxDropletPrecision) + logger.Infof("Max block size is %d", c.MaxBlockTransactionsSize) + + if !db.IsReadOnly() { + if err := CreateBuckets(db); err != nil { + logger.WithError(err).Error("CreateBuckets failed") + return nil, err + } + } + + bc, err := NewBlockchain(db, BlockchainConfig{ + Pubkey: c.BlockchainPubkey, + Arbitrating: c.Arbitrating, + }) + if err != nil { + return nil, err + } + + history := historydb.New() + + if !db.IsReadOnly() { + if err := db.Update("build unspent indexes and init history", func(tx *dbutil.Tx) error { + headSeq, _, err := bc.HeadSeq(tx) + if err != nil { + return err + } + + if err := bc.Unspent().MaybeBuildIndexes(tx, headSeq); err != nil { + return err + } + + return initHistory(tx, bc, history) + }); err != nil { + return nil, err + } + } + + utp, err := NewUnconfirmedTransactionPool(db) + if err != nil { + return nil, err + } + + v := &Visor{ + Config: c, + startedAt: time.Now(), + db: db, + blockchain: bc, + unconfirmed: utp, + history: history, + wallets: wltServ, + } + + return v, nil +} + +// VisorConfig returns Config +func (vs *Visor) VisorConfig() Config { + return vs.Config +} + +// Init initializes starts the visor +func (vs *Visor) Init() error { + logger.Info("Visor init") + + if vs.db.IsReadOnly() { + return nil + } + + return vs.db.Update("visor init", func(tx *dbutil.Tx) error { + if err := vs.maybeCreateGenesisBlock(tx); err != nil { + return err + } + + removed, err := vs.unconfirmed.RemoveInvalid(tx, vs.blockchain) + if err != nil { + return err + } + logger.Infof("Removed %d invalid txns from pool", len(removed)) + + return nil + }) +} + +func initHistory(tx *dbutil.Tx, bc *Blockchain, history *historydb.HistoryDB) error { + logger.Info("Visor initHistory") + + shouldReset, err := history.NeedsReset(tx) + if err != nil { + return err + } + + if !shouldReset { + return nil + } + + logger.Info("Resetting historyDB") + + if err := history.Erase(tx); err != nil { + return err + } + + // Reparse the history up to the blockchain head + headSeq, _, err := bc.HeadSeq(tx) + if err != nil { + return err + } + + if err := parseHistoryTo(tx, history, bc, headSeq); err != nil { + logger.WithError(err).Error("parseHistoryTo failed") + return err + } + + return nil +} + +func parseHistoryTo(tx *dbutil.Tx, history *historydb.HistoryDB, bc *Blockchain, height uint64) error { + logger.Info("Visor parseHistoryTo") + + parsedBlockSeq, _, err := history.ParsedBlockSeq(tx) + if err != nil { + return err + } + + for i := uint64(0); i < height-parsedBlockSeq; i++ { + b, err := bc.GetSignedBlockBySeq(tx, parsedBlockSeq+i+1) + if err != nil { + return err + } + + if b == nil { + return fmt.Errorf("no block exists in depth: %d", parsedBlockSeq+i+1) + } + + if err := history.ParseBlock(tx, b.Block); err != nil { + return err + } + } + + return nil +} + +// maybeCreateGenesisBlock creates a genesis block if necessary +func (vs *Visor) maybeCreateGenesisBlock(tx *dbutil.Tx) error { + logger.Info("Visor maybeCreateGenesisBlock") + gb, err := vs.blockchain.GetGenesisBlock(tx) + if err != nil { + return err + } + if gb != nil { + return nil + } + + logger.Info("Create genesis block") + vs.GenesisPreconditions() + b, err := coin.NewGenesisBlock(vs.Config.GenesisAddress, vs.Config.GenesisCoinVolume, vs.Config.GenesisTimestamp) + if err != nil { + return err + } + + var sb coin.SignedBlock + // record the signature of genesis block + if vs.Config.IsBlockPublisher { + sb = vs.signBlock(*b) + logger.Infof("Genesis block signature=%s", sb.Sig.Hex()) + } else { + sb = coin.SignedBlock{ + Block: *b, + Sig: vs.Config.GenesisSignature, + } + } + + return vs.executeSignedBlock(tx, sb) +} + +// GenesisPreconditions panics if conditions for genesis block are not met +func (vs *Visor) GenesisPreconditions() { + if vs.Config.BlockchainSeckey != (cipher.SecKey{}) { + if vs.Config.BlockchainPubkey != cipher.MustPubKeyFromSecKey(vs.Config.BlockchainSeckey) { + logger.Panic("Cannot create genesis block. Invalid secret key for pubkey") + } + } +} + +// StartedAt returns the time that the visor was created +func (vs *Visor) StartedAt() time.Time { + return vs.startedAt +} + +// RefreshUnconfirmed checks unconfirmed txns against the blockchain and returns +// all transaction that turn to valid. +func (vs *Visor) RefreshUnconfirmed() ([]cipher.SHA256, error) { + var hashes []cipher.SHA256 + if err := vs.db.Update("RefreshUnconfirmed", func(tx *dbutil.Tx) error { + var err error + hashes, err = vs.unconfirmed.Refresh(tx, vs.blockchain, vs.Config.Distribution, vs.Config.UnconfirmedVerifyTxn) + return err + }); err != nil { + return nil, err + } + + return hashes, nil +} + +// RemoveInvalidUnconfirmed removes transactions that become permanently invalid +// (by violating hard constraints) from the pool. +// Returns the transaction hashes that were removed. +func (vs *Visor) RemoveInvalidUnconfirmed() ([]cipher.SHA256, error) { + var hashes []cipher.SHA256 + if err := vs.db.Update("RemoveInvalidUnconfirmed", func(tx *dbutil.Tx) error { + var err error + hashes, err = vs.unconfirmed.RemoveInvalid(tx, vs.blockchain) + return err + }); err != nil { + return nil, err + } + + return hashes, nil +} + +// createBlock creates a SignedBlock from pending transactions +func (vs *Visor) createBlock(tx *dbutil.Tx, when uint64) (coin.SignedBlock, error) { + if !vs.Config.IsBlockPublisher { + logger.Panic("Only a block publisher node can create blocks") + } + + // Gather all unconfirmed transactions + txns, err := vs.unconfirmed.AllRawTransactions(tx) + if err != nil { + return coin.SignedBlock{}, err + } + + b, err := vs.createBlockFromTxns(tx, txns, when) + if err != nil { + return coin.SignedBlock{}, err + } + + return vs.signBlock(b), nil +} + +// createBlockFromTxns creates a Block from specified set of transactions according to set of determinstic rules. +func (vs *Visor) createBlockFromTxns(tx *dbutil.Tx, txns coin.Transactions, when uint64) (coin.Block, error) { + if len(txns) == 0 { + return coin.Block{}, errors.New("No transactions") + } + + logger.Infof("unconfirmed pool has %d transactions pending", len(txns)) + + // Filter transactions that violate all constraints + var filteredTxns coin.Transactions + for _, txn := range txns { + if _, _, err := vs.blockchain.VerifySingleTxnSoftHardConstraints(tx, txn, vs.Config.Distribution, vs.Config.CreateBlockVerifyTxn, TxnSigned); err != nil { + switch err.(type) { + case ErrTxnViolatesHardConstraint, ErrTxnViolatesSoftConstraint: + logger.Warningf("Transaction %s violates constraints: %v", txn.Hash().Hex(), err) + default: + return coin.Block{}, err + } + } else { + filteredTxns = append(filteredTxns, txn) + } + } + + nRemoved := len(txns) - len(filteredTxns) + if nRemoved > 0 { + logger.Infof("CreateBlock ignored %d transactions violating constraints", nRemoved) + } + + txns = filteredTxns + + if len(txns) == 0 { + logger.Info("No transactions after filtering for constraint violations") + return coin.Block{}, errors.New("No transactions after filtering for constraint violations") + } + + head, err := vs.blockchain.Head(tx) + if err != nil { + return coin.Block{}, err + } + + // Sort them by highest fee per kilobyte + txns, err = coin.SortTransactions(txns, vs.blockchain.TransactionFee(tx, head.Time())) + if err != nil { + logger.Critical().WithError(err).Error("SortTransactions failed, no block can be made until the offending transaction is removed") + return coin.Block{}, err + } + + // Apply block size transaction limit + txns, err = txns.TruncateBytesTo(vs.Config.MaxBlockTransactionsSize) + if err != nil { + logger.Critical().WithError(err).Error("TruncateBytesTo failed, no block can be made until the offending transaction is removed") + return coin.Block{}, err + } + + if len(txns) > coin.MaxBlockTransactions { + txns = txns[:coin.MaxBlockTransactions] + } + + if len(txns) == 0 { + logger.Panic("TruncateBytesTo removed all transactions") + } + + logger.Infof("Creating new block with %d transactions, head time %d", len(txns), when) + + b, err := vs.blockchain.NewBlock(tx, txns, when) + if err != nil { + logger.Warningf("blockchain.NewBlock failed: %v", err) + return coin.Block{}, err + } + + return *b, nil +} + +// CreateAndExecuteBlock creates a SignedBlock from pending transactions and executes it +func (vs *Visor) CreateAndExecuteBlock() (coin.SignedBlock, error) { + var sb coin.SignedBlock + + err := vs.db.Update("CreateAndExecuteBlock", func(tx *dbutil.Tx) error { + var err error + sb, err = vs.createBlock(tx, uint64(time.Now().UTC().Unix())) + if err != nil { + return err + } + + return vs.executeSignedBlock(tx, sb) + }) + + return sb, err +} + +// CreateBlockFromTxns creates a Block from specified set of transactions according to set of determinstic rules. +func (vs *Visor) CreateBlockFromTxns(txns coin.Transactions, when uint64) (coin.Block, error) { + var sb coin.Block + + err := vs.db.Update("CreateBlockFromTxns", func(tx *dbutil.Tx) error { + var err error + if sb, err = vs.createBlockFromTxns(tx, txns, when); err != nil { + return err + } + + return nil + }) + + return sb, err +} + +// VerifyBlock verifies specified block against local copy of blockchain. +// Signature is not verified. +func (vs *Visor) VerifyBlock(b coin.SignedBlock) error { + return vs.db.View("VerifyBlock", func(tx *dbutil.Tx) error { + return vs.blockchain.VerifyBlock(tx, &b) + }) +} + +// ExecuteSignedBlock adds a block to the blockchain, or returns error. +// Blocks must be executed in sequence, and be signed by a block publisher node. +func (vs *Visor) ExecuteSignedBlock(b coin.SignedBlock) error { + return vs.db.Update("ExecuteSignedBlock", func(tx *dbutil.Tx) error { + return vs.executeSignedBlock(tx, b) + }) +} + +// ExecuteSignedBlockUnsafe adds block to the blockchain, or returns error. +// Blocks must be executed in sequence. Block signature is not verified. +func (vs *Visor) ExecuteSignedBlockUnsafe(b coin.SignedBlock) error { + return vs.db.Update("ExecuteSignedBlockUnsafe", func(tx *dbutil.Tx) error { + return vs.executeSignedBlockUnsafe(tx, b) + }) +} + +// executeSignedBlock adds a block to the blockchain, or returns error. +// Blocks must be executed in sequence, and be signed by a block publisher node. +func (vs *Visor) executeSignedBlock(tx *dbutil.Tx, b coin.SignedBlock) error { + if err := b.VerifySignature(vs.Config.BlockchainPubkey); err != nil { + return err + } + + return vs.executeSignedBlockUnsafe(tx, b) +} + +// executeSignedBlockUnsafe add a block to the blockchain, or returns error. +// Blocks must be executed in sequence. Block signature is not verified. +func (vs *Visor) executeSignedBlockUnsafe(tx *dbutil.Tx, b coin.SignedBlock) error { + if err := vs.blockchain.ExecuteBlock(tx, &b); err != nil { + return err + } + + // Remove the transactions in the Block from the unconfirmed pool + txnHashes := make([]cipher.SHA256, 0, len(b.Block.Body.Transactions)) + for _, txn := range b.Block.Body.Transactions { + txnHashes = append(txnHashes, txn.Hash()) + } + + if err := vs.unconfirmed.RemoveTransactions(tx, txnHashes); err != nil { + return err + } + + // Update the HistoryDB + return vs.history.ParseBlock(tx, b.Block) +} + +// signBlock signs a block for a block publisher node. Will panic if anything is invalid +func (vs *Visor) signBlock(b coin.Block) coin.SignedBlock { + if !vs.Config.IsBlockPublisher { + logger.Panic("Only a block publisher node can sign blocks") + } + + sig := cipher.MustSignHash(b.HashHeader(), vs.Config.BlockchainSeckey) + + return coin.SignedBlock{ + Block: b, + Sig: sig, + } +} + +/* + Return Data +*/ + +// GetAllUnspentOutputs returns all unspent outputs +func (vs *Visor) GetAllUnspentOutputs() (coin.UxArray, error) { + var ux []coin.UxOut + if err := vs.db.View("GetAllUnspentOutputs", func(tx *dbutil.Tx) error { + var err error + ux, err = vs.blockchain.Unspent().GetAll(tx) + return err + }); err != nil { + return nil, err + } + + return ux, nil +} + +// GetUnspentOutputs returns unspent outputs from the pool, queried by hashes. +// If any do not exist, ErrUnspentNotExist is returned +func (vs *Visor) GetUnspentOutputs(hashes []cipher.SHA256) (coin.UxArray, error) { + var outputs coin.UxArray + if err := vs.db.View("GetUnspentOutputs", func(tx *dbutil.Tx) error { + var err error + outputs, err = vs.blockchain.Unspent().GetArray(tx, hashes) + return err + }); err != nil { + return nil, err + } + + return outputs, nil +} + +// UnconfirmedOutgoingOutputs returns all outputs that would be spent by unconfirmed transactions +func (vs *Visor) UnconfirmedOutgoingOutputs() (coin.UxArray, error) { + var uxa coin.UxArray + + if err := vs.db.View("UnconfirmedOutgoingOutputs", func(tx *dbutil.Tx) error { + var err error + uxa, err = vs.unconfirmedOutgoingOutputs(tx) + return err + }); err != nil { + return nil, err + } + + return uxa, nil +} + +func (vs *Visor) unconfirmedOutgoingOutputs(tx *dbutil.Tx) (coin.UxArray, error) { + txns, err := vs.unconfirmed.AllRawTransactions(tx) + if err != nil { + return nil, err + } + + var inputs []cipher.SHA256 + for _, txn := range txns { + inputs = append(inputs, txn.In...) + } + + return vs.blockchain.Unspent().GetArray(tx, inputs) +} + +// UnconfirmedIncomingOutputs returns all outputs that would be created by unconfirmed transactions +func (vs *Visor) UnconfirmedIncomingOutputs() (coin.UxArray, error) { + var uxa coin.UxArray + + if err := vs.db.View("UnconfirmedIncomingOutputs", func(tx *dbutil.Tx) error { + var err error + uxa, err = vs.unconfirmedIncomingOutputs(tx) + return err + }); err != nil { + return nil, err + } + + return uxa, nil +} + +func (vs *Visor) unconfirmedIncomingOutputs(tx *dbutil.Tx) (coin.UxArray, error) { + head, err := vs.blockchain.Head(tx) + if err != nil { + return nil, err + } + + return vs.unconfirmed.GetIncomingOutputs(tx, head.Head) +} + +// GetSignedBlocksSince returns N signed blocks more recent than Seq. Does not return nil. +func (vs *Visor) GetSignedBlocksSince(seq, ct uint64) ([]coin.SignedBlock, error) { + var blocks []coin.SignedBlock + + if err := vs.db.View("GetSignedBlocksSince", func(tx *dbutil.Tx) error { + avail := uint64(0) + head, err := vs.blockchain.Head(tx) + if err != nil { + return err + } + + headSeq := head.Seq() + if headSeq > seq { + avail = headSeq - seq + } + if avail < ct { + ct = avail + } + if ct == 0 { + return nil + } + + blocks = make([]coin.SignedBlock, 0, ct) + for j := uint64(0); j < ct; j++ { + i := seq + 1 + j + b, err := vs.blockchain.GetSignedBlockBySeq(tx, i) + if err != nil { + return err + } + + blocks = append(blocks, *b) + } + + return nil + }); err != nil { + return nil, err + } + + return blocks, nil +} + +// HeadBkSeq returns the highest BkSeq we know, returns false in the 2nd return value +// if the blockchain is empty +func (vs *Visor) HeadBkSeq() (uint64, bool, error) { + var headSeq uint64 + var ok bool + + if err := vs.db.View("HeadBkSeq", func(tx *dbutil.Tx) error { + var err error + headSeq, ok, err = vs.blockchain.HeadSeq(tx) + return err + }); err != nil { + return 0, false, err + } + + return headSeq, ok, nil +} + +// GetBlockchainMetadata returns descriptive blockchain information +func (vs *Visor) GetBlockchainMetadata() (*BlockchainMetadata, error) { + var head *coin.SignedBlock + var unconfirmedLen, unspentsLen uint64 + + if err := vs.db.View("GetBlockchainMetadata", func(tx *dbutil.Tx) error { + var err error + head, err = vs.blockchain.Head(tx) + if err != nil { + return err + } + + unconfirmedLen, err = vs.unconfirmed.Len(tx) + if err != nil { + return err + } + + unspentsLen, err = vs.blockchain.Unspent().Len(tx) + return err + }); err != nil { + return nil, err + } + + return NewBlockchainMetadata(*head, unconfirmedLen, unspentsLen) +} + +// GetBlock returns a copy of the block at seq. Returns error if seq out of range +func (vs *Visor) GetBlock(seq uint64) (*coin.SignedBlock, error) { + var b *coin.SignedBlock + + if err := vs.db.View("GetBlock", func(tx *dbutil.Tx) error { + headSeq, ok, err := vs.blockchain.HeadSeq(tx) + if err != nil { + return err + } + + if !ok || seq > headSeq { + return errors.New("Block seq out of range") + } + + b, err = vs.blockchain.GetSignedBlockBySeq(tx, seq) + return err + }); err != nil { + return nil, err + } + + return b, nil +} + +// GetBlocks returns blocks matches seqs +func (vs *Visor) GetBlocks(seqs []uint64) ([]coin.SignedBlock, error) { + var blocks []coin.SignedBlock + + if err := vs.db.View("GetBlocks", func(tx *dbutil.Tx) error { + var err error + blocks, err = vs.blockchain.GetBlocks(tx, seqs) + return err + }); err != nil { + return nil, err + } + + return blocks, nil +} + +// GetBlocksVerbose returns blocks matches seqs along with verbose transaction input data +func (vs *Visor) GetBlocksVerbose(seqs []uint64) ([]coin.SignedBlock, [][][]TransactionInput, error) { + var blocks []coin.SignedBlock + var inputs [][][]TransactionInput + + if err := vs.db.View("GetBlocksVerbose", func(tx *dbutil.Tx) error { + var err error + blocks, inputs, err = vs.getBlocksVerbose(tx, func(tx *dbutil.Tx) ([]coin.SignedBlock, error) { + return vs.blockchain.GetBlocks(tx, seqs) + }) + return err + }); err != nil { + return nil, nil, err + } + + return blocks, inputs, nil +} + +// GetBlocksInRange returns multiple blocks between start and end, including both start and end. +// Returns the empty slice if unable to fulfill request. +func (vs *Visor) GetBlocksInRange(start, end uint64) ([]coin.SignedBlock, error) { + var blocks []coin.SignedBlock + + if err := vs.db.View("GetBlocksInRange", func(tx *dbutil.Tx) error { + var err error + blocks, err = vs.blockchain.GetBlocksInRange(tx, start, end) + return err + }); err != nil { + return nil, err + } + + return blocks, nil +} + +// GetBlocksInRangeVerbose returns multiple blocks between start and end, including both start and end. +// Also returns the verbose transaction input data for transactions in these blocks. +// Returns the empty slice if unable to fulfill request. +func (vs *Visor) GetBlocksInRangeVerbose(start, end uint64) ([]coin.SignedBlock, [][][]TransactionInput, error) { + var blocks []coin.SignedBlock + var inputs [][][]TransactionInput + + if err := vs.db.View("GetBlocksInRangeVerbose", func(tx *dbutil.Tx) error { + var err error + blocks, inputs, err = vs.getBlocksVerbose(tx, func(tx *dbutil.Tx) ([]coin.SignedBlock, error) { + return vs.blockchain.GetBlocksInRange(tx, start, end) + }) + return err + }); err != nil { + return nil, nil, err + } + + return blocks, inputs, nil +} + +// GetLastBlocks returns last N blocks +func (vs *Visor) GetLastBlocks(num uint64) ([]coin.SignedBlock, error) { + var blocks []coin.SignedBlock + + if err := vs.db.View("GetLastBlocks", func(tx *dbutil.Tx) error { + var err error + blocks, err = vs.blockchain.GetLastBlocks(tx, num) + return err + }); err != nil { + return nil, err + } + + return blocks, nil +} + +// GetLastBlocksVerbose returns last N blocks with verbose transaction input data +func (vs *Visor) GetLastBlocksVerbose(num uint64) ([]coin.SignedBlock, [][][]TransactionInput, error) { + var blocks []coin.SignedBlock + var inputs [][][]TransactionInput + + if err := vs.db.View("GetLastBlocksVerbose", func(tx *dbutil.Tx) error { + var err error + blocks, inputs, err = vs.getBlocksVerbose(tx, func(tx *dbutil.Tx) ([]coin.SignedBlock, error) { + return vs.blockchain.GetLastBlocks(tx, num) + }) + return err + }); err != nil { + return nil, nil, err + } + + return blocks, inputs, nil +} + +func (vs *Visor) getBlocksVerbose(tx *dbutil.Tx, getBlocks func(*dbutil.Tx) ([]coin.SignedBlock, error)) ([]coin.SignedBlock, [][][]TransactionInput, error) { + blocks, err := getBlocks(tx) + if err != nil { + return nil, nil, err + } + + if len(blocks) == 0 { + return nil, nil, nil + } + + inputs := make([][][]TransactionInput, len(blocks)) + for i, b := range blocks { + blockInputs, err := vs.getBlockInputs(tx, &b) + if err != nil { + return nil, nil, err + } + inputs[i] = blockInputs + } + + return blocks, inputs, nil +} + +// InjectForeignTransaction records a coin.Transaction to the UnconfirmedTransactionPool if the txn is not +// already in the blockchain. +// The bool return value is whether or not the transaction was already in the pool. +// If the transaction violates hard constraints, it is rejected, and error will not be nil. +// If the transaction only violates soft constraints, it is still injected, and the soft constraint violation is returned. +// This method is intended for transactions received over the network. +func (vs *Visor) InjectForeignTransaction(txn coin.Transaction) (bool, *ErrTxnViolatesSoftConstraint, error) { + var known bool + var softErr *ErrTxnViolatesSoftConstraint + + if err := vs.db.Update("InjectForeignTransaction", func(tx *dbutil.Tx) error { + var err error + known, softErr, err = vs.unconfirmed.InjectTransaction(tx, vs.blockchain, txn, vs.Config.Distribution, vs.Config.UnconfirmedVerifyTxn) + return err + }); err != nil { + return false, nil, err + } + + return known, softErr, nil +} + +// InjectUserTransaction records a coin.Transaction to the UnconfirmedTransactionPool if the txn is not +// already in the blockchain. +// The bool return value is whether or not the transaction was already in the pool. +// If the transaction violates hard or soft constraints, it is rejected, and error will not be nil. +func (vs *Visor) InjectUserTransaction(txn coin.Transaction) (bool, *coin.SignedBlock, coin.UxArray, error) { + var known bool + var head *coin.SignedBlock + var inputs coin.UxArray + + if err := vs.db.Update("InjectUserTransaction", func(tx *dbutil.Tx) error { + var err error + known, head, inputs, err = vs.InjectUserTransactionTx(tx, txn) + return err + }); err != nil { + return false, nil, nil, err + } + + return known, head, inputs, nil +} + +// InjectUserTransactionTx records a coin.Transaction to the UnconfirmedTransactionPool if the txn is not +// already in the blockchain. +// The bool return value is whether or not the transaction was already in the pool. +// If the transaction violates hard or soft constraints, it is rejected, and error will not be nil. +// This method is only exported for use by the daemon gateway's InjectBroadcastTransaction method. +func (vs *Visor) InjectUserTransactionTx(tx *dbutil.Tx, txn coin.Transaction) (bool, *coin.SignedBlock, coin.UxArray, error) { + if err := VerifySingleTxnUserConstraints(txn); err != nil { + return false, nil, nil, err + } + + head, inputs, err := vs.blockchain.VerifySingleTxnSoftHardConstraints(tx, txn, vs.Config.Distribution, params.UserVerifyTxn, TxnSigned) + if err != nil { + return false, nil, nil, err + } + + known, softErr, err := vs.unconfirmed.InjectTransaction(tx, vs.blockchain, txn, vs.Config.Distribution, params.UserVerifyTxn) + if softErr != nil { + logger.WithError(softErr).Warning("InjectUserTransaction vs.unconfirmed.InjectTransaction returned a softErr unexpectedly") + } + + return known, head, inputs, err +} + +// GetTransactionsForAddress returns the Transactions whose unspents give coins to a cipher.Address. +// This includes both confirmed and unconfirmed transactions. +func (vs *Visor) GetTransactionsForAddress(a cipher.Address) ([]Transaction, error) { + var txns map[cipher.Address][]Transaction + + if err := vs.db.View("GetTransactionsForAddress", func(tx *dbutil.Tx) error { + var err error + txns, err = vs.getTransactionsForAddresses(tx, []cipher.Address{a}) + return err + }); err != nil { + return nil, err + } + + return txns[a], nil +} + +// GetTransaction returns a Transaction by hash. +func (vs *Visor) GetTransaction(txnHash cipher.SHA256) (*Transaction, error) { + var txn *Transaction + + if err := vs.db.View("GetTransaction", func(tx *dbutil.Tx) error { + var err error + txn, err = vs.getTransaction(tx, txnHash) + return err + }); err != nil { + return nil, err + } + + return txn, nil +} + +// GetTransactionWithInputs returns a Transaction by hash, along with the unspent outputs of its inputs +func (vs *Visor) GetTransactionWithInputs(txnHash cipher.SHA256) (*Transaction, []TransactionInput, error) { + var txn *Transaction + var inputs []TransactionInput + + if err := vs.db.View("GetTransactionWithInputs", func(tx *dbutil.Tx) error { + var err error + txn, err = vs.getTransaction(tx, txnHash) + if err != nil { + return err + } + + if txn == nil { + return nil + } + + feeCalcTime, err := vs.getFeeCalcTimeForTransaction(tx, *txn) + if err != nil { + return err + } + if feeCalcTime == nil { + return nil + } + + inputs, err = vs.getTransactionInputs(tx, *feeCalcTime, txn.Transaction.In) + return err + }); err != nil { + return nil, nil, err + } + + return txn, inputs, nil +} + +func (vs *Visor) getTransaction(tx *dbutil.Tx, txnHash cipher.SHA256) (*Transaction, error) { + // Look in the unconfirmed pool + utxn, err := vs.unconfirmed.Get(tx, txnHash) + if err != nil { + return nil, err + } + + if utxn != nil { + return &Transaction{ + Transaction: utxn.Transaction, + Status: NewUnconfirmedTransactionStatus(), + Time: uint64(timeutil.NanoToTime(utxn.Received).Unix()), + }, nil + } + + htxn, err := vs.history.GetTransaction(tx, txnHash) + if err != nil { + return nil, err + } + + if htxn == nil { + return nil, nil + } + + headSeq, ok, err := vs.blockchain.HeadSeq(tx) + if err != nil { + return nil, err + } else if !ok { + return nil, errors.New("blockchain is empty but history has transactions") + } + + b, err := vs.blockchain.GetSignedBlockBySeq(tx, htxn.BlockSeq) + if err != nil { + return nil, err + } + + if b == nil { + return nil, fmt.Errorf("found no block in seq %v", htxn.BlockSeq) + } + + if headSeq < htxn.BlockSeq { + return nil, fmt.Errorf("blockchain head seq %d is earlier than history txn seq %d", headSeq, htxn.BlockSeq) + } + + confirms := headSeq - htxn.BlockSeq + 1 + return &Transaction{ + Transaction: htxn.Txn, + Status: NewConfirmedTransactionStatus(confirms, htxn.BlockSeq), + Time: b.Time(), + }, nil +} + +// TxFilter transaction filter type +type TxFilter interface { + // Returns whether the transaction is matched + Match(*Transaction) bool +} + +// BaseFilter is a helper struct for generating TxFilter. +type BaseFilter struct { + F func(tx *Transaction) bool +} + +// Match matches the filter based upon F +func (f BaseFilter) Match(tx *Transaction) bool { + return f.F(tx) +} + +// NewAddrsFilter collects all addresses related transactions. +func NewAddrsFilter(addrs []cipher.Address) TxFilter { + return AddrsFilter{Addrs: addrs} +} + +// AddrsFilter filters by addresses +type AddrsFilter struct { + Addrs []cipher.Address +} + +// Match implements the TxFilter interface, this actually won't be used, only the 'Addrs' member is used. +func (af AddrsFilter) Match(tx *Transaction) bool { return true } + +// NewConfirmedTxFilter collects the transaction whose 'Confirmed' status matchs the parameter passed in. +func NewConfirmedTxFilter(isConfirmed bool) TxFilter { + return BaseFilter{F: func(tx *Transaction) bool { + return tx.Status.Confirmed == isConfirmed + }} +} + +// GetTransactions returns transactions that can pass the filters. +// If no filters is provided, returns all transactions. +func (vs *Visor) GetTransactions(flts []TxFilter) ([]Transaction, error) { + var txns []Transaction + + if err := vs.db.View("GetTransactions", func(tx *dbutil.Tx) error { + var err error + txns, err = vs.getTransactions(tx, flts) + return err + }); err != nil { + return nil, err + } + + return txns, nil +} + +// GetTransactionsWithInputs is the same as GetTransactions but also returns verbose transaction input data +func (vs *Visor) GetTransactionsWithInputs(flts []TxFilter) ([]Transaction, [][]TransactionInput, error) { + var txns []Transaction + var inputs [][]TransactionInput + + if err := vs.db.View("GetTransactionsWithInputs", func(tx *dbutil.Tx) error { + var err error + txns, err = vs.getTransactions(tx, flts) + if err != nil { + return err + } + + inputs = make([][]TransactionInput, len(txns)) + for i, txn := range txns { + feeCalcTime, err := vs.getFeeCalcTimeForTransaction(tx, txn) + if err != nil { + return err + } + if feeCalcTime == nil { + continue + } + + txnInputs, err := vs.getTransactionInputs(tx, *feeCalcTime, txn.Transaction.In) + if err != nil { + return err + } + + inputs[i] = txnInputs + } + + return nil + }); err != nil { + return nil, nil, err + } + + return txns, inputs, nil +} + +func (vs *Visor) getTransactions(tx *dbutil.Tx, flts []TxFilter) ([]Transaction, error) { + var addrFlts []AddrsFilter + var otherFlts []TxFilter + // Splits the filters into AddrsFilter and other filters + for _, f := range flts { + switch v := f.(type) { + case AddrsFilter: + addrFlts = append(addrFlts, v) + default: + otherFlts = append(otherFlts, f) + } + } + + // Accumulates all addresses in address filters + addrs := accumulateAddressInFilter(addrFlts) + + // Traverses all transactions to do collection if there's no address filter. + if len(addrs) == 0 { + return vs.traverseTxns(tx, otherFlts) + } + + // Gets addresses related transactions + addrTxns, err := vs.getTransactionsForAddresses(tx, addrs) + if err != nil { + return nil, err + } + + // Converts address transactions map into []Transaction, + // and remove duplicate txns + txnMap := make(map[cipher.SHA256]struct{}) + var txns []Transaction + for _, aTxns := range addrTxns { + for _, txn := range aTxns { + txnHash := txn.Transaction.Hash() + if _, exist := txnMap[txnHash]; exist { + continue + } + txnMap[txnHash] = struct{}{} + txns = append(txns, txn) + } + } + + // Checks other filters + f := func(txn *Transaction, flts []TxFilter) bool { + for _, flt := range flts { + if !flt.Match(txn) { + return false + } + } + + return true + } + + var retTxns []Transaction + for _, txn := range txns { + if f(&txn, otherFlts) { + retTxns = append(retTxns, txn) + } + } + + return retTxns, nil +} + +func accumulateAddressInFilter(afs []AddrsFilter) []cipher.Address { + // Accumulate all addresses in address filters + addrMap := make(map[cipher.Address]struct{}) + var addrs []cipher.Address + for _, af := range afs { + for _, a := range af.Addrs { + if _, exist := addrMap[a]; exist { + continue + } + addrMap[a] = struct{}{} + addrs = append(addrs, a) + } + } + return addrs +} + +// getTransactionsForAddresses returns all addresses related transactions. +// Including both confirmed and unconfirmed transactions. +func (vs *Visor) getTransactionsForAddresses(tx *dbutil.Tx, addrs []cipher.Address) (map[cipher.Address][]Transaction, error) { + // Get the head block seq, for calculating the txn status + headBkSeq, ok, err := vs.blockchain.HeadSeq(tx) + + if err != nil { + return nil, err + } + if !ok { + return nil, errors.New("No head block seq") + } + + ret := make(map[cipher.Address][]Transaction, len(addrs)) + for _, a := range addrs { + addrTxns, err := vs.history.GetTransactionsForAddress(tx, a) + if err != nil { + return nil, err + } + + txns := make([]Transaction, len(addrTxns), len(addrTxns)+4) + for i, txn := range addrTxns { + if headBkSeq < txn.BlockSeq { + err := errors.New("Transaction block sequence is greater than the head block sequence") + logger.Critical().WithError(err).WithFields(logrus.Fields{ + "headBkSeq": headBkSeq, + "txnBlockSeq": txn.BlockSeq, + }).Error() + return nil, err + } + h := headBkSeq - txn.BlockSeq + 1 + + bk, err := vs.blockchain.GetSignedBlockBySeq(tx, txn.BlockSeq) + if err != nil { + return nil, err + } + + if bk == nil { + return nil, fmt.Errorf("block seq=%d doesn't exist", txn.BlockSeq) + } + + txns[i] = Transaction{ + Transaction: txn.Txn, + Status: NewConfirmedTransactionStatus(h, txn.BlockSeq), + Time: bk.Time(), + } + } + + // Look in the unconfirmed pool + uxs, err := vs.unconfirmed.GetUnspentsOfAddr(tx, a) + if err != nil { + return nil, err + } + + for _, ux := range uxs { + txn, err := vs.unconfirmed.Get(tx, ux.Body.SrcTransaction) + if err != nil { + return nil, err + } + + if txn == nil { + logger.Critical().Error("unconfirmed unspent missing unconfirmed txn") + continue + } + + txns = append(txns, Transaction{ + Transaction: txn.Transaction, + Status: NewUnconfirmedTransactionStatus(), + Time: uint64(timeutil.NanoToTime(txn.Received).Unix()), + }) + } + + ret[a] = txns + } + + return ret, nil +} + +// traverseTxns traverses transactions in historydb and unconfirmed tx pool in db, +// returns transactions that can pass the filters. +func (vs *Visor) traverseTxns(tx *dbutil.Tx, flts []TxFilter) ([]Transaction, error) { + // Get the head block seq, for calculating the tx status + headBkSeq, ok, err := vs.blockchain.HeadSeq(tx) + if err != nil { + return nil, err + } + if !ok { + return nil, errors.New("No head block seq") + } + + var txns []Transaction + + if err := vs.history.ForEachTxn(tx, func(_ cipher.SHA256, hTxn *historydb.Transaction) error { + if headBkSeq < hTxn.BlockSeq { + err := errors.New("Transaction block sequence is less than the head block sequence") + logger.Critical().WithError(err).WithFields(logrus.Fields{ + "headBkSeq": headBkSeq, + "txBlockSeq": hTxn.BlockSeq, + }).Error() + return err + } + + h := headBkSeq - hTxn.BlockSeq + 1 + + bk, err := vs.blockchain.GetSignedBlockBySeq(tx, hTxn.BlockSeq) + if err != nil { + return fmt.Errorf("get block of seq: %v failed: %v", hTxn.BlockSeq, err) + } + + if bk == nil { + return fmt.Errorf("block of seq: %d doesn't exist", hTxn.BlockSeq) + } + + txn := Transaction{ + Transaction: hTxn.Txn, + Status: NewConfirmedTransactionStatus(h, hTxn.BlockSeq), + Time: bk.Time(), + } + + // Checks filters + for _, f := range flts { + if !f.Match(&txn) { + return nil + } + } + + txns = append(txns, txn) + return nil + }); err != nil { + return nil, err + } + + txns = sortTxns(txns) + + // Gets all unconfirmed transactions + unconfirmedTxns, err := vs.unconfirmed.GetFiltered(tx, func(txn UnconfirmedTransaction) bool { + return true + }) + if err != nil { + return nil, err + } + + for _, ux := range unconfirmedTxns { + txn := Transaction{ + Transaction: ux.Transaction, + Status: NewUnconfirmedTransactionStatus(), + Time: uint64(timeutil.NanoToTime(ux.Received).Unix()), + } + + // Checks filters + for _, f := range flts { + if !f.Match(&txn) { + continue + } + txns = append(txns, txn) + } + } + return txns, nil +} + +// Sort transactions by block seq, if equal then compare hash +func sortTxns(txns []Transaction) []Transaction { + sort.Slice(txns, func(i, j int) bool { + if txns[i].Status.BlockSeq < txns[j].Status.BlockSeq { + return true + } + + if txns[i].Status.BlockSeq > txns[j].Status.BlockSeq { + return false + } + + // If transactions in the same block, compare the hash string + return txns[i].Transaction.Hash().Hex() < txns[j].Transaction.Hash().Hex() + }) + return txns +} + +// AddressBalances computes the total balance for cipher.Addresses and their coin.UxOuts +func (vs *Visor) AddressBalances(head *coin.SignedBlock, auxs coin.AddressUxOuts) (uint64, uint64, error) { + prevTime := head.Time() + var coins uint64 + var hours uint64 + for _, uxs := range auxs { + for _, ux := range uxs { + uxHours, err := ux.CoinHours(prevTime) + if err != nil { + return 0, 0, err + } + + coins, err = mathutil.AddUint64(coins, ux.Body.Coins) + if err != nil { + return 0, 0, err + } + + hours, err = mathutil.AddUint64(hours, uxHours) + if err != nil { + return 0, 0, err + } + } + } + return coins, hours, nil +} + +// GetUnconfirmedTransactions gets all confirmed transactions of specific addresses +func (vs *Visor) GetUnconfirmedTransactions(filter func(UnconfirmedTransaction) bool) ([]UnconfirmedTransaction, error) { + var txns []UnconfirmedTransaction + + if err := vs.db.View("GetUnconfirmedTransactions", func(tx *dbutil.Tx) error { + var err error + txns, err = vs.unconfirmed.GetFiltered(tx, filter) + return err + }); err != nil { + return nil, err + } + + return txns, nil +} + +// GetUnconfirmedTransactionsVerbose gets all confirmed transactions of specific addresses +func (vs *Visor) GetUnconfirmedTransactionsVerbose(filter func(UnconfirmedTransaction) bool) ([]UnconfirmedTransaction, [][]TransactionInput, error) { + var txns []UnconfirmedTransaction + var inputs [][]TransactionInput + + if err := vs.db.View("GetUnconfirmedTransactionsVerbose", func(tx *dbutil.Tx) error { + var err error + txns, err = vs.unconfirmed.GetFiltered(tx, filter) + if err != nil { + return err + } + + inputs, err = vs.getTransactionInputsForUnconfirmedTxns(tx, txns) + + return err + }); err != nil { + return nil, nil, err + } + + if len(txns) == 0 { + return nil, nil, nil + } + + return txns, inputs, nil +} + +// SendsToAddresses represents a filter that check if tx has output to the given addresses +func SendsToAddresses(addresses []cipher.Address) func(UnconfirmedTransaction) bool { + return func(tx UnconfirmedTransaction) (isRelated bool) { + for _, out := range tx.Transaction.Out { + for _, address := range addresses { + if out.Address == address { + isRelated = true + return + } + } + } + return + } +} + +// GetAllUnconfirmedTransactions returns all unconfirmed transactions +func (vs *Visor) GetAllUnconfirmedTransactions() ([]UnconfirmedTransaction, error) { + var txns []UnconfirmedTransaction + + if err := vs.db.View("GetAllUnconfirmedTransactions", func(tx *dbutil.Tx) error { + var err error + txns, err = vs.unconfirmed.GetFiltered(tx, All) + return err + }); err != nil { + return nil, err + } + + return txns, nil +} + +// GetAllUnconfirmedTransactionsVerbose returns all unconfirmed transactions with verbose transaction input data +func (vs *Visor) GetAllUnconfirmedTransactionsVerbose() ([]UnconfirmedTransaction, [][]TransactionInput, error) { + var txns []UnconfirmedTransaction + var inputs [][]TransactionInput + + if err := vs.db.View("GetAllUnconfirmedTransactionsVerbose", func(tx *dbutil.Tx) error { + var err error + txns, err = vs.unconfirmed.GetFiltered(tx, All) + if err != nil { + return err + } + + inputs, err = vs.getTransactionInputsForUnconfirmedTxns(tx, txns) + + return err + }); err != nil { + return nil, nil, err + } + + if len(txns) == 0 { + return nil, nil, nil + } + + return txns, inputs, nil +} + +// getTransactionInputsForUnconfirmedTxns returns ReadableTransactionInputs for a set of UnconfirmedTransactions +func (vs *Visor) getTransactionInputsForUnconfirmedTxns(tx *dbutil.Tx, txns []UnconfirmedTransaction) ([][]TransactionInput, error) { + if len(txns) == 0 { + return nil, nil + } + + // Use the current head time to calculate estimated coin hours of unconfirmed transactions + headTime, err := vs.blockchain.Time(tx) + if err != nil { + return nil, err + } + + inputs := make([][]TransactionInput, len(txns)) + for i, txn := range txns { + if len(txn.Transaction.In) == 0 { + logger.Critical().WithField("txid", txn.Transaction.Hash().Hex()).Warning("unconfirmed transaction has no inputs") + continue + } + + txnInputs, err := vs.getTransactionInputs(tx, headTime, txn.Transaction.In) + if err != nil { + return nil, err + } + + inputs[i] = txnInputs + } + + return inputs, nil +} + +// getFeeCalcTimeForTransaction returns the time against which a transaction's fee should be calculated. +// The genesis block has no inputs and thus no fee to calculate, so it returns nil. +// A confirmed transaction's fee was calculated from the previous block's head time, when it was executed. +// An unconfirmed transaction's fee will be calculated from the current block head time, once executed. +func (vs *Visor) getFeeCalcTimeForTransaction(tx *dbutil.Tx, txn Transaction) (*uint64, error) { + // The genesis block has no inputs to calculate, otherwise calculate the inputs + if txn.Status.BlockSeq == 0 && txn.Status.Confirmed { + return nil, nil + } + + feeCalcTime := uint64(0) + if txn.Status.Confirmed { + // Use the previous block head to calculate the coin hours + prevBlock, err := vs.blockchain.GetSignedBlockBySeq(tx, txn.Status.BlockSeq-1) + if err != nil { + return nil, err + } + + if prevBlock == nil { + err := fmt.Errorf("getFeeCalcTimeForTransaction: prevBlock seq=%d not found", txn.Status.BlockSeq-1) + logger.Critical().WithError(err).Error("getFeeCalcTimeForTransaction") + return nil, err + } + + feeCalcTime = prevBlock.Block.Head.Time + } else { + // Use the current block head to calculate the coin hours + var err error + feeCalcTime, err = vs.blockchain.Time(tx) + if err != nil { + return nil, err + } + } + + return &feeCalcTime, nil +} + +// GetAllValidUnconfirmedTxHashes returns all valid unconfirmed transaction hashes +func (vs *Visor) GetAllValidUnconfirmedTxHashes() ([]cipher.SHA256, error) { + var hashes []cipher.SHA256 + + if err := vs.db.View("GetAllValidUnconfirmedTxHashes", func(tx *dbutil.Tx) error { + var err error + hashes, err = vs.unconfirmed.GetHashes(tx, IsValid) + return err + }); err != nil { + return nil, err + } + + return hashes, nil +} + +// GetConfirmedTransaction returns transaction, which has been already included in some block. +func (vs *Visor) GetConfirmedTransaction(txnHash cipher.SHA256) (*coin.Transaction, error) { + var histTxn *historydb.Transaction + + if err := vs.db.View("GetConfirmedTransaction", func(tx *dbutil.Tx) error { + var err error + histTxn, err = vs.history.GetTransaction(tx, txnHash) + return err + }); err != nil { + return nil, err + } + + // Transaction not found. + if histTxn == nil { + return nil, nil + } + + return &histTxn.Txn, nil +} + +// GetSignedBlockByHash get block of specific hash header, return nil on not found. +func (vs *Visor) GetSignedBlockByHash(hash cipher.SHA256) (*coin.SignedBlock, error) { + var sb *coin.SignedBlock + + if err := vs.db.View("GetSignedBlockByHash", func(tx *dbutil.Tx) error { + var err error + sb, err = vs.blockchain.GetSignedBlockByHash(tx, hash) + return err + }); err != nil { + return nil, err + } + + return sb, nil +} + +// GetSignedBlockBySeq get block of specific seq, return nil on not found. +func (vs *Visor) GetSignedBlockBySeq(seq uint64) (*coin.SignedBlock, error) { + var b *coin.SignedBlock + + if err := vs.db.View("GetSignedBlockBySeq", func(tx *dbutil.Tx) error { + var err error + b, err = vs.blockchain.GetSignedBlockBySeq(tx, seq) + return err + }); err != nil { + return nil, err + } + + return b, nil +} + +// GetSignedBlockByHashVerbose returns a coin.SignedBlock and its transactions' input data for a given block hash +func (vs *Visor) GetSignedBlockByHashVerbose(hash cipher.SHA256) (*coin.SignedBlock, [][]TransactionInput, error) { + var b *coin.SignedBlock + var inputs [][]TransactionInput + + if err := vs.db.View("GetSignedBlockByHashVerbose", func(tx *dbutil.Tx) error { + var err error + b, inputs, err = vs.getBlockVerbose(tx, func(tx *dbutil.Tx) (*coin.SignedBlock, error) { + return vs.blockchain.GetSignedBlockByHash(tx, hash) + }) + return err + }); err != nil { + return nil, nil, err + } + + return b, inputs, nil +} + +// GetSignedBlockBySeqVerbose returns a coin.SignedBlock and its transactions' input data for a given block hash +func (vs *Visor) GetSignedBlockBySeqVerbose(seq uint64) (*coin.SignedBlock, [][]TransactionInput, error) { + var b *coin.SignedBlock + var inputs [][]TransactionInput + + if err := vs.db.View("GetSignedBlockBySeqVerbose", func(tx *dbutil.Tx) error { + var err error + b, inputs, err = vs.getBlockVerbose(tx, func(tx *dbutil.Tx) (*coin.SignedBlock, error) { + return vs.blockchain.GetSignedBlockBySeq(tx, seq) + }) + return err + }); err != nil { + return nil, nil, err + } + + return b, inputs, nil +} + +func (vs *Visor) getBlockVerbose(tx *dbutil.Tx, getBlock func(*dbutil.Tx) (*coin.SignedBlock, error)) (*coin.SignedBlock, [][]TransactionInput, error) { + b, err := getBlock(tx) + if err != nil { + return nil, nil, err + } + + if b == nil { + return nil, nil, nil + } + + inputs, err := vs.getBlockInputs(tx, b) + if err != nil { + return nil, nil, err + } + + return b, inputs, nil +} + +func (vs *Visor) getBlockInputs(tx *dbutil.Tx, b *coin.SignedBlock) ([][]TransactionInput, error) { + if b == nil { + return nil, nil + } + + // The genesis block has no inputs to query or to calculate fees from + if b.Block.Head.BkSeq == 0 { + if len(b.Block.Body.Transactions) != 1 { + logger.Panicf("Genesis block should have only 1 transaction (has %d)", len(b.Block.Body.Transactions)) + } + + if len(b.Block.Body.Transactions[0].In) != 0 { + logger.Panic("Genesis block transaction should not have inputs") + } + + inputs := make([][]TransactionInput, 1) + + return inputs, nil + } + + // When a transaction was added to a block, its coinhour fee was + // calculated based upon the time of the head block. + // So we need to look at the previous block + prevBlock, err := vs.blockchain.GetSignedBlockBySeq(tx, b.Head.BkSeq-1) + if err != nil { + return nil, err + } + + if prevBlock == nil { + err := fmt.Errorf("getBlockInputs: prevBlock seq %d not found", b.Head.BkSeq-1) + logger.Critical().WithError(err).Error() + return nil, err + } + + var inputs [][]TransactionInput + for _, txn := range b.Block.Body.Transactions { + i, err := vs.getTransactionInputs(tx, prevBlock.Block.Head.Time, txn.In) + if err != nil { + return nil, err + } + + inputs = append(inputs, i) + } + + return inputs, nil +} + +// getTransactionInputs returns []TransactionInput for a given set of spent output hashes. +// feeCalcTime is the time against which to calculate the coinhours of the output +func (vs *Visor) getTransactionInputs(tx *dbutil.Tx, feeCalcTime uint64, inputs []cipher.SHA256) ([]TransactionInput, error) { + if len(inputs) == 0 { + err := errors.New("getTransactionInputs: inputs is empty only the genesis block transaction has no inputs, which shouldn't call this method") + logger.WithError(err).Error() + return nil, err + } + + uxOuts, err := vs.history.GetUxOuts(tx, inputs) + if err != nil { + logger.WithError(err).Error("getTransactionInputs GetUxOuts failed") + return nil, err + } + + ret := make([]TransactionInput, len(inputs)) + for i, o := range uxOuts { + r, err := NewTransactionInput(o.Out, feeCalcTime) + if err != nil { + logger.WithError(err).Error("getTransactionInputs NewTransactionInput failed") + return nil, err + } + ret[i] = r + } + + return ret, nil +} + +// GetHeadBlock gets head block. +func (vs Visor) GetHeadBlock() (*coin.SignedBlock, error) { + var b *coin.SignedBlock + + if err := vs.db.View("GetHeadBlock", func(tx *dbutil.Tx) error { + var err error + b, err = vs.blockchain.Head(tx) + return err + }); err != nil { + return nil, err + } + + return b, nil +} + +// GetHeadBlockTime returns the time of the head block. +func (vs Visor) GetHeadBlockTime() (uint64, error) { + var t uint64 + + if err := vs.db.View("GetHeadBlockTime", func(tx *dbutil.Tx) error { + var err error + t, err = vs.blockchain.Time(tx) + return err + }); err != nil { + return 0, err + } + + return t, nil +} + +// GetUxOutByID gets UxOut by hash id. +func (vs Visor) GetUxOutByID(id cipher.SHA256) (*historydb.UxOut, error) { + var outs []historydb.UxOut + + if err := vs.db.View("GetUxOutByID", func(tx *dbutil.Tx) error { + var err error + outs, err = vs.history.GetUxOuts(tx, []cipher.SHA256{id}) + return err + }); err != nil { + return nil, err + } + + if len(outs) == 0 { + return nil, nil + } + + return &outs[0], nil +} + +// GetSpentOutputsForAddresses gets all the spent outputs of a set of addresses +func (vs Visor) GetSpentOutputsForAddresses(addresses []cipher.Address) ([][]historydb.UxOut, error) { + out := make([][]historydb.UxOut, len(addresses)) + + if err := vs.db.View("GetSpentOutputsForAddresses", func(tx *dbutil.Tx) error { + for i, addr := range addresses { + addrUxOuts, err := vs.history.GetOutputsForAddress(tx, addr) + if err != nil { + return err + } + + out[i] = addrUxOuts + } + + return nil + }); err != nil { + return nil, err + } + + return out, nil +} + +// RecvOfAddresses returns unconfirmed receiving uxouts of addresses +func (vs *Visor) RecvOfAddresses(addrs []cipher.Address) (coin.AddressUxOuts, error) { + var uxouts coin.AddressUxOuts + + if err := vs.db.View("RecvOfAddresses", func(tx *dbutil.Tx) error { + head, err := vs.blockchain.Head(tx) + if err != nil { + return err + } + + uxouts, err = vs.unconfirmed.RecvOfAddresses(tx, head.Head, addrs) + return err + }); err != nil { + return nil, err + } + + return uxouts, nil +} + +// GetIncomingOutputs returns all predicted outputs that are in pending tx pool +func (vs *Visor) GetIncomingOutputs() (coin.UxArray, error) { + var uxa coin.UxArray + + if err := vs.db.View("GetIncomingOutputs", func(tx *dbutil.Tx) error { + head, err := vs.blockchain.Head(tx) + if err != nil { + return err + } + + uxa, err = vs.unconfirmed.GetIncomingOutputs(tx, head.Head) + return err + }); err != nil { + return nil, err + } + + return uxa, nil +} + +// GetUnconfirmedTxn gets an unconfirmed transaction from the DB +func (vs *Visor) GetUnconfirmedTxn(hash cipher.SHA256) (*UnconfirmedTransaction, error) { + var txn *UnconfirmedTransaction + + if err := vs.db.View("GetUnconfirmedTxn", func(tx *dbutil.Tx) error { + var err error + txn, err = vs.unconfirmed.Get(tx, hash) + return err + }); err != nil { + return nil, err + } + + return txn, nil +} + +// FilterKnownUnconfirmed returns unconfirmed txn hashes with known ones removed +func (vs *Visor) FilterKnownUnconfirmed(txns []cipher.SHA256) ([]cipher.SHA256, error) { + var hashes []cipher.SHA256 + + if err := vs.db.View("FilterKnownUnconfirmed", func(tx *dbutil.Tx) error { + var err error + hashes, err = vs.unconfirmed.FilterKnown(tx, txns) + return err + }); err != nil { + return nil, err + } + + return hashes, nil +} + +// GetKnownUnconfirmed returns unconfirmed txn hashes with known ones removed +func (vs *Visor) GetKnownUnconfirmed(txns []cipher.SHA256) (coin.Transactions, error) { + var hashes coin.Transactions + + if err := vs.db.View("GetKnownUnconfirmed", func(tx *dbutil.Tx) error { + var err error + hashes, err = vs.unconfirmed.GetKnown(tx, txns) + return err + }); err != nil { + return nil, err + } + + return hashes, nil +} + +// UnconfirmedSpendsOfAddresses returns all unconfirmed coin.UxOut spends of addresses +func (vs *Visor) UnconfirmedSpendsOfAddresses(addrs []cipher.Address) (coin.AddressUxOuts, error) { + var outs coin.AddressUxOuts + + if err := vs.db.View("UnconfirmedSpendsOfAddresses", func(tx *dbutil.Tx) error { + var err error + outs, err = vs.unconfirmedSpendsOfAddresses(tx, addrs) + return err + }); err != nil { + return nil, err + } + + return outs, nil +} + +// unconfirmedSpendsOfAddresses returns all unconfirmed coin.UxOut spends of addresses +func (vs *Visor) unconfirmedSpendsOfAddresses(tx *dbutil.Tx, addrs []cipher.Address) (coin.AddressUxOuts, error) { + txns, err := vs.unconfirmed.AllRawTransactions(tx) + if err != nil { + return nil, err + } + + var inputs []cipher.SHA256 + for _, txn := range txns { + inputs = append(inputs, txn.In...) + } + + uxa, err := vs.blockchain.Unspent().GetArray(tx, inputs) + if err != nil { + return nil, err + } + + outs := make(coin.AddressUxOuts, len(addrs)) + + addrm := make(map[cipher.Address]struct{}, len(addrs)) + for _, addr := range addrs { + addrm[addr] = struct{}{} + } + + for _, ux := range uxa { + if _, ok := addrm[ux.Body.Address]; ok { + outs[ux.Body.Address] = append(outs[ux.Body.Address], ux) + } + } + + return outs, nil +} + +// SetTransactionsAnnounced updates announced time of specific tx +func (vs *Visor) SetTransactionsAnnounced(hashes map[cipher.SHA256]int64) error { + if len(hashes) == 0 { + return nil + } + + return vs.db.Update("SetTransactionsAnnounced", func(tx *dbutil.Tx) error { + return vs.unconfirmed.SetTransactionsAnnounced(tx, hashes) + }) +} + +// GetBalanceOfAddresses returns balance pairs of given addreses +func (vs Visor) GetBalanceOfAddresses(addrs []cipher.Address) ([]wallet.BalancePair, error) { + if len(addrs) == 0 { + return nil, nil + } + + auxs := make(coin.AddressUxOuts, len(addrs)) + recvUxs := make(coin.AddressUxOuts, len(addrs)) + var uxa coin.UxArray + var head *coin.SignedBlock + + if err := vs.db.View("GetBalanceOfAddresses", func(tx *dbutil.Tx) error { + var err error + head, err = vs.blockchain.Head(tx) + if err != nil { + return err + } + + // Get all transactions from the unconfirmed pool + txns, err := vs.unconfirmed.AllRawTransactions(tx) + if err != nil { + return err + } + + // Create predicted unspent outputs from the unconfirmed transactions + recvUxs, err = txnOutputsForAddrs(head.Head, addrs, txns) + if err != nil { + return err + } + + var inputs []cipher.SHA256 + for _, txn := range txns { + inputs = append(inputs, txn.In...) + } + + // Get unspents for the inputs being spent + uxa, err = vs.blockchain.Unspent().GetArray(tx, inputs) + if err != nil { + return fmt.Errorf("GetArray failed when checking addresses balance: %v", err) + } + + // Get unspents owned by the addresses + auxs, err = vs.blockchain.Unspent().GetUnspentsOfAddrs(tx, addrs) + if err != nil { + return fmt.Errorf("GetUnspentsOfAddrs failed when checking addresses balance: %v", err) + } + + return nil + }); err != nil { + return nil, err + } + + // Build all unconfirmed transaction inputs that are associated with the addresses + spendUxs := make(coin.AddressUxOuts, len(addrs)) + + addrm := make(map[cipher.Address]struct{}, len(addrs)) + for _, addr := range addrs { + addrm[addr] = struct{}{} + } + + for _, ux := range uxa { + if _, ok := addrm[ux.Body.Address]; ok { + spendUxs[ux.Body.Address] = append(spendUxs[ux.Body.Address], ux) + } + } + + var bps []wallet.BalancePair + + headTime := head.Time() + for _, addr := range addrs { + uxs, ok := auxs[addr] + if !ok { + bps = append(bps, wallet.BalancePair{}) + continue + } + + outUxs := spendUxs[addr] + inUxs := recvUxs[addr] + predictedUxs := uxs.Sub(outUxs).Add(inUxs) + + coins, err := uxs.Coins() + if err != nil { + return nil, fmt.Errorf("uxs.Coins failed: %v", err) + } + + coinHours, err := uxs.CoinHours(headTime) + if err != nil { + switch err { + case coin.ErrAddEarnedCoinHoursAdditionOverflow: + coinHours = 0 + default: + return nil, fmt.Errorf("uxs.CoinHours failed: %v", err) + } + } + + pcoins, err := predictedUxs.Coins() + if err != nil { + return nil, fmt.Errorf("predictedUxs.Coins failed: %v", err) + } + + pcoinHours, err := predictedUxs.CoinHours(headTime) + if err != nil { + switch err { + case coin.ErrAddEarnedCoinHoursAdditionOverflow: + coinHours = 0 + default: + return nil, fmt.Errorf("predictedUxs.CoinHours failed: %v", err) + } + } + + bp := wallet.BalancePair{ + Confirmed: wallet.Balance{ + Coins: coins, + Hours: coinHours, + }, + Predicted: wallet.Balance{ + Coins: pcoins, + Hours: pcoinHours, + }, + } + + bps = append(bps, bp) + } + + return bps, nil +} + +// GetUnspentsOfAddrs returns unspent outputs of multiple addresses +func (vs *Visor) GetUnspentsOfAddrs(addrs []cipher.Address) (coin.AddressUxOuts, error) { + var uxa coin.AddressUxOuts + + if err := vs.db.View("GetUnspentsOfAddrs", func(tx *dbutil.Tx) error { + var err error + uxa, err = vs.blockchain.Unspent().GetUnspentsOfAddrs(tx, addrs) + return err + }); err != nil { + return nil, err + } + + return uxa, nil +} + +// VerifyTxnVerbose verifies a transaction, it returns transaction's input uxouts, whether the +// transaction is confirmed, and error if any +func (vs *Visor) VerifyTxnVerbose(txn *coin.Transaction, signed TxnSignedFlag) ([]TransactionInput, bool, error) { + var uxa coin.UxArray + var isTxnConfirmed bool + var feeCalcTime uint64 + + verifyErr := vs.db.View("VerifyTxnVerbose", func(tx *dbutil.Tx) error { + head, err := vs.blockchain.Head(tx) + if err != nil { + return err + } + + uxa, err = vs.blockchain.Unspent().GetArray(tx, txn.In) + switch e := err.(type) { + case nil: + // For unconfirmed transactions, use the blockchain head time to calculate hours + feeCalcTime = head.Time() + + case blockdb.ErrUnspentNotExist: + // Gets uxouts of txn.In from historydb + outs, err := vs.history.GetUxOuts(tx, txn.In) + if err != nil { + return err + } + + if len(outs) == 0 { + err = fmt.Errorf("transaction input of %s does not exist in either unspent pool or historydb", e.UxID) + return NewErrTxnViolatesHardConstraint(err) + } + + uxa = coin.UxArray{} + for _, out := range outs { + uxa = append(uxa, out.Out) + } + + // Checks if the transaction is confirmed + txnHash := txn.Hash() + historyTxn, err := vs.history.GetTransaction(tx, txnHash) + if err != nil { + return fmt.Errorf("get transaction of %v from historydb failed: %v", txnHash, err) + } + + if historyTxn != nil { + // Transaction is confirmed + isTxnConfirmed = true + } + + // For confirmed transactions, use the previous block time to calculate hours and fees, + // except for the genesis block which has no previous block and has no inputs nor fees. + feeCalcTime = 0 + if historyTxn.BlockSeq > 0 { + if isTxnConfirmed { + prevBlock, err := vs.blockchain.GetSignedBlockBySeq(tx, historyTxn.BlockSeq-1) + if err != nil { + return err + } + if prevBlock == nil { + return fmt.Errorf("VerifyTxnVerbose: previous block seq=%d not found", historyTxn.BlockSeq-1) + } + + feeCalcTime = prevBlock.Block.Head.Time + } + } + + return nil + default: + return err + } + + if err := VerifySingleTxnUserConstraints(*txn); err != nil { + return err + } + + if err := VerifySingleTxnSoftConstraints(*txn, feeCalcTime, uxa, vs.Config.Distribution, params.UserVerifyTxn); err != nil { + return err + } + + return VerifySingleTxnHardConstraints(*txn, head.Head, uxa, signed) + }) + + // If we were able to query the inputs, return the verbose inputs to the caller + // even if the transaction failed validation + var inputs []TransactionInput + if len(uxa) != 0 && feeCalcTime != 0 { + var err error + inputs, err = NewTransactionInputs(uxa, feeCalcTime) + if err != nil { + return nil, isTxnConfirmed, err + } + } + + return inputs, isTxnConfirmed, verifyErr +} + +// AddressCount returns the total number of addresses with unspents +func (vs *Visor) AddressCount() (uint64, error) { + var count uint64 + if err := vs.db.View("AddressCount", func(tx *dbutil.Tx) error { + var err error + count, err = vs.blockchain.Unspent().AddressCount(tx) + return err + }); err != nil { + return 0, err + } + + return count, nil +} + +// GetVerboseTransactionsForAddress returns verbose transaction data for a given address +func (vs *Visor) GetVerboseTransactionsForAddress(a cipher.Address) ([]Transaction, [][]TransactionInput, error) { + var txns []Transaction + var inputs [][]TransactionInput + + if err := vs.db.View("GetVerboseTransactionsForAddress", func(tx *dbutil.Tx) error { + addrTxns, err := vs.getTransactionsForAddresses(tx, []cipher.Address{a}) + if err != nil { + logger.Errorf("GetVerboseTransactionsForAddress: vs.GetTransactionsForAddress failed: %v", err) + return err + } + + txns = addrTxns[a] + if len(txns) == 0 { + return nil + } + + head, err := vs.blockchain.Head(tx) + if err != nil { + logger.Errorf("GetVerboseTransactionsForAddress: vs.blockchain.Head failed: %v", err) + return err + } + + inputs = make([][]TransactionInput, len(txns)) + + for i, txn := range txns { + // If the txn is confirmed, use the time of the block previous + // to the block in which the transaction was executed, + // else use the head time for unconfirmed blocks. + t := head.Time() + if txn.Status.Confirmed && txn.Status.BlockSeq > 0 { + prevBlock, err := vs.blockchain.GetSignedBlockBySeq(tx, txn.Status.BlockSeq-1) + if err != nil { + return err + } + + if prevBlock == nil { + return fmt.Errorf("GetVerboseTransactionsForAddress prevBlock seq=%d missing", txn.Status.BlockSeq-1) + } + + t = prevBlock.Block.Head.Time + } + + txnInputs := make([]TransactionInput, len(txn.Transaction.In)) + for j, inputID := range txn.Transaction.In { + uxOuts, err := vs.history.GetUxOuts(tx, []cipher.SHA256{inputID}) + if err != nil { + logger.Errorf("GetVerboseTransactionsForAddress: vs.history.GetUxOuts failed: %v", err) + return err + } + if len(uxOuts) == 0 { + err := fmt.Errorf("uxout of %v does not exist in history db", inputID.Hex()) + logger.Critical().Error(err) + return err + } + + input, err := NewTransactionInput(uxOuts[0].Out, t) + if err != nil { + logger.Errorf("GetVerboseTransactionsForAddress: NewTransactionInput failed: %v", err) + return err + } + + txnInputs[j] = input + } + + inputs[i] = txnInputs + } + + return nil + }); err != nil { + return nil, nil, err + } + + return txns, inputs, nil +} + +// OutputsFilter used as optional arguments in GetUnspentOutputs method +type OutputsFilter func(outputs coin.UxArray) coin.UxArray + +// FbyAddressesNotIncluded filters the unspent outputs that are not owned by the addresses +func FbyAddressesNotIncluded(addrs []cipher.Address) OutputsFilter { + return func(outputs coin.UxArray) coin.UxArray { + addrMatch := coin.UxArray{} + addrMap := newAddrSet(addrs) + + for _, u := range outputs { + if _, ok := addrMap[u.Body.Address]; !ok { + addrMatch = append(addrMatch, u) + } + } + return addrMatch + } +} + +// FbyAddresses filters the unspent outputs that owned by the addresses +func FbyAddresses(addrs []cipher.Address) OutputsFilter { + return func(outputs coin.UxArray) coin.UxArray { + addrMatch := coin.UxArray{} + addrMap := newAddrSet(addrs) + + for _, u := range outputs { + if _, ok := addrMap[u.Body.Address]; ok { + addrMatch = append(addrMatch, u) + } + } + return addrMatch + } +} + +// FbyHashes filters the unspent outputs that have hashes matched. +func FbyHashes(hashes []cipher.SHA256) OutputsFilter { + return func(outputs coin.UxArray) coin.UxArray { + hsMatch := coin.UxArray{} + hsMap := newSHA256Set(hashes) + + for _, u := range outputs { + if _, ok := hsMap[u.Hash()]; ok { + hsMatch = append(hsMatch, u) + } + } + return hsMatch + } +} + +func newAddrSet(keys []cipher.Address) map[cipher.Address]struct{} { + s := make(map[cipher.Address]struct{}, len(keys)) + for _, k := range keys { + s[k] = struct{}{} + } + return s +} + +// newSHA256Set returns a map-based set for string lookup +func newSHA256Set(keys []cipher.SHA256) map[cipher.SHA256]struct{} { + s := make(map[cipher.SHA256]struct{}, len(keys)) + for _, k := range keys { + s[k] = struct{}{} + } + return s +} + +// GetUnspentOutputsSummary gets unspent outputs and returns the filtered results, +// Note: all filters will be executed as the pending sequence in 'AND' mode. +func (vs *Visor) GetUnspentOutputsSummary(filters []OutputsFilter) (*UnspentOutputsSummary, error) { + var confirmedOutputs []coin.UxOut + var outgoingOutputs coin.UxArray + var incomingOutputs coin.UxArray + var head *coin.SignedBlock + + if err := vs.db.View("GetUnspentOutputsSummary", func(tx *dbutil.Tx) error { + var err error + head, err = vs.blockchain.Head(tx) + if err != nil { + return fmt.Errorf("vs.blockchain.Head failed: %v", err) + } + + confirmedOutputs, err = vs.blockchain.Unspent().GetAll(tx) + if err != nil { + return fmt.Errorf("vs.blockchain.Unspent().GetAll failed: %v", err) + } + + outgoingOutputs, err = vs.unconfirmedOutgoingOutputs(tx) + if err != nil { + return fmt.Errorf("vs.unconfirmedOutgoingOutputs failed: %v", err) + } + + incomingOutputs, err = vs.unconfirmedIncomingOutputs(tx) + if err != nil { + return fmt.Errorf("vs.unconfirmedIncomingOutputs failed: %v", err) + } + + return nil + }); err != nil { + return nil, err + } + + for _, flt := range filters { + confirmedOutputs = flt(confirmedOutputs) + outgoingOutputs = flt(outgoingOutputs) + incomingOutputs = flt(incomingOutputs) + } + + confirmed, err := NewUnspentOutputs(confirmedOutputs, head.Time()) + if err != nil { + return nil, err + } + + outgoing, err := NewUnspentOutputs(outgoingOutputs, head.Time()) + if err != nil { + return nil, err + } + + incoming, err := NewUnspentOutputs(incomingOutputs, head.Time()) + if err != nil { + return nil, err + } + + return &UnspentOutputsSummary{ + HeadBlock: head, + Confirmed: confirmed, + Outgoing: outgoing, + Incoming: incoming, + }, nil +} + +// GetRichlist returns a Richlist +func (vs *Visor) GetRichlist(includeDistribution bool) (Richlist, error) { + rbOuts, err := vs.GetUnspentOutputsSummary(nil) + if err != nil { + return nil, err + } + + // Build a map from addresses to total coins held + allAccounts := map[cipher.Address]uint64{} + for _, out := range rbOuts.Confirmed { + if _, ok := allAccounts[out.Body.Address]; ok { + var err error + allAccounts[out.Body.Address], err = mathutil.AddUint64(allAccounts[out.Body.Address], out.Body.Coins) + if err != nil { + return nil, err + } + } else { + allAccounts[out.Body.Address] = out.Body.Coins + } + } + + lockedAddrs := vs.Config.Distribution.LockedAddressesDecoded() + addrsMap := make(map[cipher.Address]struct{}, len(lockedAddrs)) + for _, a := range lockedAddrs { + addrsMap[a] = struct{}{} + } + + richlist, err := NewRichlist(allAccounts, addrsMap) + if err != nil { + return nil, err + } + + if !includeDistribution { + unlockedAddrs := vs.Config.Distribution.UnlockedAddressesDecoded() + for _, a := range unlockedAddrs { + addrsMap[a] = struct{}{} + } + richlist = richlist.FilterAddresses(addrsMap) + } + + return richlist, nil +} + +// WithUpdateTx executes a function inside of a db.Update transaction. +// This is exported for use by the daemon gateway's InjectBroadcastTransaction method. +// Do not use it for other purposes. +func (vs *Visor) WithUpdateTx(name string, f func(tx *dbutil.Tx) error) error { + return vs.db.Update(name, func(tx *dbutil.Tx) error { + return f(tx) + }) +} + +// AddressesActivity returns whether or not each address has any activity on blockchain +// or in the unconfirmed pool +func (vs *Visor) AddressesActivity(addrs []cipher.Address) ([]bool, error) { + active := make([]bool, len(addrs)) + addrsMap := make(map[cipher.Address]int, len(addrs)) + for i, a := range addrs { + addrsMap[a] = i + } + + if len(addrsMap) != len(addrs) { + return nil, errors.New("duplicates addresses not allowed") + } + + if err := vs.db.View("AddressActivity", func(tx *dbutil.Tx) error { + // Check if the addresses appear in the blockchain + for i, a := range addrs { + ok, err := vs.history.AddressSeen(tx, a) + if err != nil { + return err + } + + if ok { + active[i] = true + } + } + + // Check if the addresses appears in the unconfirmed pool + // NOTE: if this needs to be optimized, add an index to the unconfirmed pool + return vs.unconfirmed.ForEach(tx, func(h cipher.SHA256, ut UnconfirmedTransaction) error { + // Only transaction outputs need to be checked; if the address is associated + // with an input, it must have appeared in a transaction in the blockchain history + for _, o := range ut.Transaction.Out { + if i, ok := addrsMap[o.Address]; ok { + active[i] = true + } + } + return nil + }) + }); err != nil { + return nil, err + } + + return active, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/visor_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/visor_test.go new file mode 100644 index 00000000..e2e68576 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/visor_test.go @@ -0,0 +1,2734 @@ +package visor + +import ( + "bytes" + "errors" + "fmt" + "io" + "io/ioutil" + "math" + "os" + "path/filepath" + "sort" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/testutil" + _require "github.com/SkycoinProject/skycoin/src/testutil/require" + "github.com/SkycoinProject/skycoin/src/util/fee" + "github.com/SkycoinProject/skycoin/src/util/timeutil" + "github.com/SkycoinProject/skycoin/src/visor/blockdb" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" + "github.com/SkycoinProject/skycoin/src/visor/historydb" +) + +const ( + blockchainPubkeyStr = "0328c576d3f420e7682058a981173a4b374c7cc5ff55bf394d3cf57059bbe6456a" +) + +func prepareDB(t *testing.T) (*dbutil.DB, func()) { + db, shutdown := testutil.PrepareDB(t) + + err := CreateBuckets(db) + if err != nil { + shutdown() + t.Fatalf("CreateBuckets failed: %v", err) + } + + return db, shutdown +} + +func readAll(t *testing.T, f string) []byte { + fi, err := os.Open(f) + require.NoError(t, err) + defer fi.Close() + + b, err := ioutil.ReadAll(fi) + require.NoError(t, err) + + return b +} + +func mustParsePubkey(t *testing.T) cipher.PubKey { + // Parse the blockchain pubkey associated with this corrupted test db + t.Helper() + pubkey, err := cipher.PubKeyFromHex(blockchainPubkeyStr) + require.NoError(t, err) + return pubkey +} + +func writeDBFile(t *testing.T, badDBFile string, badDBData []byte) { + t.Logf("Writing the original bad db file back to %s", badDBFile) + fi, err := os.OpenFile(badDBFile, os.O_WRONLY, 0600) + require.NoError(t, err) + defer fi.Close() + + _, err = io.Copy(fi, bytes.NewBuffer(badDBData)) + require.NoError(t, err) +} + +func findCorruptDBFiles(t *testing.T, badDBFile string) []string { + corruptFiles, err := filepath.Glob(badDBFile + ".corrupt.*") + require.NoError(t, err) + return corruptFiles +} + +func removeCorruptDBFiles(t *testing.T, badDBFile string) { + corruptFiles := findCorruptDBFiles(t, badDBFile) + for _, m := range corruptFiles { + err := os.Remove(m) + require.NoError(t, err) + } +} + +func addGenesisBlockToVisor(t *testing.T, vs *Visor) *coin.SignedBlock { + // create genesis block + gb, err := coin.NewGenesisBlock(genAddress, genCoins, genTime) + require.NoError(t, err) + gbSig := cipher.MustSignHash(gb.HashHeader(), genSecret) + vs.Config.GenesisSignature = gbSig + + sb := coin.SignedBlock{ + Block: *gb, + Sig: gbSig, + } + + // add genesis block to blockchain + err = vs.db.Update("", func(tx *dbutil.Tx) error { + return vs.executeSignedBlock(tx, sb) + }) + require.NoError(t, err) + + return &sb +} + +func TestErrMissingSignatureRecreateDB(t *testing.T) { + badDBFile := "./testdata/data.db.nosig" // about 8MB size + badDBData := readAll(t, badDBFile) + + pubkey := mustParsePubkey(t) + + // Remove any existing corrupt db files from testdata + removeCorruptDBFiles(t, badDBFile) + corruptFiles := findCorruptDBFiles(t, badDBFile) + require.Len(t, corruptFiles, 0) + + // Cleanup + defer func() { + // Write the bad db data back to badDBFile + writeDBFile(t, badDBFile, badDBData) + // Remove leftover corrupt db copies + removeCorruptDBFiles(t, badDBFile) + }() + + // Make sure that the database file causes ErrMissingSignature error + t.Logf("Checking that %s is a corrupted database", badDBFile) + func() { + db, err := OpenDB(badDBFile, false) + require.NoError(t, err) + defer func() { + err := db.Close() + assert.NoError(t, err) + }() + + bc, err := NewBlockchain(db, BlockchainConfig{ + Pubkey: pubkey, + Arbitrating: false, + }) + require.NoError(t, err) + + // err = db.View("", func(tx *dbutil.Tx) error { + f := func(tx *dbutil.Tx, b *coin.SignedBlock) error { + return bc.VerifySignature(b) + } + + err = bc.WalkChain(BlockchainVerifyTheadNum, f, nil) + + require.Error(t, err) + require.IsType(t, blockdb.ErrMissingSignature{}, err) + }() + + // Loading this invalid db should cause ResetCorruptDB() to recreate the db + t.Logf("Loading the corrupted db from %s", badDBFile) + badDB, err := OpenDB(badDBFile, false) + require.NoError(t, err) + require.NotNil(t, badDB) + require.NotEmpty(t, badDB.Path()) + t.Logf("badDB.Path() == %s", badDB.Path()) + + db, err := ResetCorruptDB(badDB, pubkey, nil) + require.NoError(t, err) + + err = db.Close() + require.NoError(t, err) + + require.NotNil(t, db) + + // A corrupted database file should exist + corruptFiles = findCorruptDBFiles(t, badDBFile) + require.Len(t, corruptFiles, 1) + + // A new db should be written in place of the old bad db, and not be corrupted + t.Logf("Checking that the new db file is valid") + func() { + db, err := OpenDB(badDBFile, false) + require.NoError(t, err) + defer func() { + err := db.Close() + assert.NoError(t, err) + }() + + // The new db is not corrupted and loads without error + bc, err := NewBlockchain(db, BlockchainConfig{ + Pubkey: pubkey, + Arbitrating: false, + }) + require.NoError(t, err) + require.NotNil(t, bc) + }() +} + +func TestHistorydbVerifier(t *testing.T) { + tt := []struct { + name string + dbPath string + expectErr error + }{ + { + name: "db is ok", + dbPath: "./testdata/data.db.ok", + }, + { + name: "missing transaction", + dbPath: "./testdata/data.db.notxn", + expectErr: historydb.NewErrHistoryDBCorrupted(errors.New("HistoryDB.Verify: transaction 98db7eb30e13853d3dd93d5d8b4061596d5d288b6f8b92c4d43c46c6599f67fb does not exist in historydb")), + }, + { + name: "missing uxout", + dbPath: "./testdata/data.db.nouxout", + expectErr: historydb.NewErrHistoryDBCorrupted(errors.New("HistoryDB.Verify: transaction (input|output) 2f87d77c2a7d00b547db1af50e0ba04bafc5b05711e4939e9ec2640a21127dc0 does not exist in historydb")), + }, + { + name: "missing addr transaction index", + dbPath: "./testdata/data.db.no-addr-txn-index", + expectErr: historydb.NewErrHistoryDBCorrupted(errors.New(`HistoryDB.Verify: index of address transaction \[2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF:98db7eb30e13853d3dd93d5d8b4061596d5d288b6f8b92c4d43c46c6599f67fb\] does not exist in historydb`)), + }, + { + name: "missing addr uxout index", + dbPath: "./testdata/data.db.no-addr-uxout-index", + expectErr: historydb.NewErrHistoryDBCorrupted(errors.New(`HistoryDB.Verify: index of address uxout \[2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF:2f87d77c2a7d00b547db1af50e0ba04bafc5b05711e4939e9ec2640a21127dc0\] does not exist in historydb`)), + }, + } + + pubKeyStr := "0328c576d3f420e7682058a981173a4b374c7cc5ff55bf394d3cf57059bbe6456a" + pubkey := cipher.MustPubKeyFromHex(pubKeyStr) + history := historydb.New() + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + db, err := OpenDB(tc.dbPath, true) + require.NoError(t, err) + bc, err := NewBlockchain(db, BlockchainConfig{ + Pubkey: pubkey, + }) + require.NoError(t, err) + + indexesMap := historydb.NewIndexesMap() + f := func(tx *dbutil.Tx, b *coin.SignedBlock) error { + return history.Verify(tx, b, indexesMap) + } + + err = bc.WalkChain(2, f, nil) + if tc.expectErr == nil { + require.Nil(t, err) + return + } + + // Confirms that the error type is matched + require.IsType(t, tc.expectErr, err) + // Confirms the error message is matched + require.Regexp(t, tc.expectErr.Error(), err.Error()) + }) + } + +} + +func TestVisorCreateBlock(t *testing.T) { + when := uint64(time.Now().UTC().Unix()) + + db, shutdown := prepareDB(t) + defer shutdown() + + bc, err := NewBlockchain(db, BlockchainConfig{ + Pubkey: genPublic, + }) + + unconfirmed, err := NewUnconfirmedTransactionPool(db) + require.NoError(t, err) + + his := historydb.New() + + cfg := NewConfig() + cfg.IsBlockPublisher = false + cfg.BlockchainPubkey = genPublic + cfg.GenesisAddress = genAddress + + v := &Visor{ + Config: cfg, + unconfirmed: unconfirmed, + blockchain: bc, + db: db, + history: his, + } + + // CreateBlock panics if called when not a block publisher + _require.PanicsWithLogMessage(t, "Only a block publisher node can create blocks", func() { + err := db.Update("", func(tx *dbutil.Tx) error { + _, err := v.createBlock(tx, when) + return err + }) + require.NoError(t, err) + }) + + v.Config.IsBlockPublisher = true + v.Config.BlockchainSeckey = genSecret + + addGenesisBlockToVisor(t, v) + var gb *coin.SignedBlock + err = db.View("", func(tx *dbutil.Tx) error { + var err error + gb, err = v.blockchain.GetGenesisBlock(tx) + return err + }) + require.NoError(t, err) + require.NotNil(t, gb) + + // If no transactions in the unconfirmed pool, return an error + err = db.Update("", func(tx *dbutil.Tx) error { + _, err = v.createBlock(tx, when) + testutil.RequireError(t, err, "No transactions") + return nil + }) + require.NoError(t, err) + + // Create enough unspent outputs to create all of these transactions + uxs := coin.CreateUnspents(gb.Head, gb.Body.Transactions[0]) + + nUnspents := 100 + txn := makeUnspentsTxn(t, uxs, []cipher.SecKey{genSecret}, genAddress, nUnspents, params.UserVerifyTxn.MaxDropletPrecision) + + var known bool + var softErr *ErrTxnViolatesSoftConstraint + err = db.Update("", func(tx *dbutil.Tx) error { + var err error + known, softErr, err = unconfirmed.InjectTransaction(tx, bc, txn, params.MainNetDistribution, v.Config.UnconfirmedVerifyTxn) + return err + }) + require.NoError(t, err) + require.False(t, known) + require.Nil(t, softErr) + + v.Config.MaxBlockTransactionsSize, err = txn.Size() + require.NoError(t, err) + sb, err := v.CreateAndExecuteBlock() + require.NoError(t, err) + require.Equal(t, 1, len(sb.Body.Transactions)) + + var length uint64 + err = db.View("", func(tx *dbutil.Tx) error { + var err error + length, err = unconfirmed.Len(tx) + return err + }) + require.NoError(t, err) + + require.Equal(t, uint64(0), length) + v.Config.MaxBlockTransactionsSize = 1024 * 4 + + // Create various transactions and add them to unconfirmed pool + uxs = coin.CreateUnspents(sb.Head, sb.Body.Transactions[0]) + var coins uint64 = 9e6 + var f uint64 = 10 + toAddr := testutil.MakeAddress() + + // Add more transactions than is allowed in a block, to verify truncation + var txns coin.Transactions + var i int + truncatedTxns, err := txns.TruncateBytesTo(v.Config.MaxBlockTransactionsSize) + require.NoError(t, err) + for len(txns) == len(truncatedTxns) { + tx := makeSpendTxWithFee(t, coin.UxArray{uxs[i]}, []cipher.SecKey{genSecret}, toAddr, coins, f) + txns = append(txns, tx) + i++ + truncatedTxns, err = txns.TruncateBytesTo(v.Config.MaxBlockTransactionsSize) + require.NoError(t, err) + } + require.NotEqual(t, 0, len(txns)) + + // Use different f sizes to verify f ordering + txns = append(txns, makeSpendTxWithFee(t, coin.UxArray{uxs[i]}, []cipher.SecKey{genSecret}, toAddr, coins, f*5)) + i++ + txns = append(txns, makeSpendTxWithFee(t, coin.UxArray{uxs[i]}, []cipher.SecKey{genSecret}, toAddr, coins, f*10)) + i++ + + // Use invalid decimal places to verify decimal place filtering. + // The fs are set higher to ensure that they are not filtered due to truncating with a low f + // Spending 9.1 SKY + txns = append(txns, makeSpendTxWithFee(t, coin.UxArray{uxs[i]}, []cipher.SecKey{genSecret}, toAddr, coins+1e5, f*20)) + i++ + // Spending 9.01 SKY + txns = append(txns, makeSpendTxWithFee(t, coin.UxArray{uxs[i]}, []cipher.SecKey{genSecret}, toAddr, coins+1e4, f*30)) + i++ + // Spending 9.0001 SKY + txns = append(txns, makeSpendTxWithFee(t, coin.UxArray{uxs[i]}, []cipher.SecKey{genSecret}, toAddr, coins+1e3, f*40)) + i++ + // Spending 9.0001 SKY + txns = append(txns, makeSpendTxWithFee(t, coin.UxArray{uxs[i]}, []cipher.SecKey{genSecret}, toAddr, coins+1e2, f*50)) + i++ + // Spending 9.00001 SKY + txns = append(txns, makeSpendTxWithFee(t, coin.UxArray{uxs[i]}, []cipher.SecKey{genSecret}, toAddr, coins+1e1, f*60)) + i++ + // Spending 9.000001 SKY + txns = append(txns, makeSpendTxWithFee(t, coin.UxArray{uxs[i]}, []cipher.SecKey{genSecret}, toAddr, coins+1, f*70)) + // i++ + + // Confirm that at least one transaction has an invalid decimal output + foundInvalidCoins := false + for _, txn := range txns { + for _, o := range txn.Out { + if err := params.DropletPrecisionCheck(v.Config.UnconfirmedVerifyTxn.MaxDropletPrecision, o.Coins); err != nil { + foundInvalidCoins = true + break + } + } + } + require.True(t, foundInvalidCoins) + + // Inject transactions into the unconfirmed pool + for i, txn := range txns { + var known bool + var softErr *ErrTxnViolatesSoftConstraint + err = db.Update("", func(tx *dbutil.Tx) error { + var err error + known, softErr, err = unconfirmed.InjectTransaction(tx, bc, txn, params.MainNetDistribution, v.Config.UnconfirmedVerifyTxn) + return err + }) + require.False(t, known) + require.NoError(t, err) + + // The last 3 transactions will have a soft constraint violation for too many decimal places, + // but would still be injected into the pool + if i < len(txns)-3 { + require.Nil(t, softErr) + } else { + testutil.RequireError(t, softErr, "Transaction violates soft constraint: invalid amount, too many decimal places") + } + } + + // Make sure all transactions were injected + var allInjectedTxns []coin.Transaction + err = db.View("", func(tx *dbutil.Tx) error { + var err error + allInjectedTxns, err = unconfirmed.AllRawTransactions(tx) + return err + }) + require.NoError(t, err) + require.Equal(t, len(txns), len(allInjectedTxns)) + + err = db.Update("", func(tx *dbutil.Tx) error { + var err error + sb, err = v.createBlock(tx, when+100) + return err + }) + require.NoError(t, err) + require.Equal(t, when+100, sb.Block.Head.Time) + + blockTxns := sb.Block.Body.Transactions + require.NotEqual(t, len(txns), len(blockTxns), "Transactions should be truncated") + require.Equal(t, 18, len(blockTxns)) + + // Check fee ordering + err = db.View("", func(tx *dbutil.Tx) error { + inUxs, err := v.blockchain.Unspent().GetArray(tx, blockTxns[0].In) + require.NoError(t, err) + prevFee, err := fee.TransactionFee(&blockTxns[0], sb.Head.Time, inUxs) + require.NoError(t, err) + + for i := 1; i < len(blockTxns); i++ { + inUxs, err := v.blockchain.Unspent().GetArray(tx, blockTxns[i].In) + require.NoError(t, err) + f, err := fee.TransactionFee(&blockTxns[i], sb.Head.Time, inUxs) + require.NoError(t, err) + require.True(t, f <= prevFee) + prevFee = f + } + + return nil + }) + + require.NoError(t, err) + + // Check that decimal rules are enforced + for i, txn := range blockTxns { + for j, o := range txn.Out { + err := params.DropletPrecisionCheck(v.Config.CreateBlockVerifyTxn.MaxDropletPrecision, o.Coins) + require.NoError(t, err, "txout %d.%d coins=%d", i, j, o.Coins) + } + } +} + +func TestVisorInjectTransaction(t *testing.T) { + when := uint64(time.Now().UTC().Unix()) + + db, shutdown := prepareDB(t) + defer shutdown() + + bc, err := NewBlockchain(db, BlockchainConfig{ + Pubkey: genPublic, + }) + require.NoError(t, err) + + unconfirmed, err := NewUnconfirmedTransactionPool(db) + require.NoError(t, err) + + his := historydb.New() + + cfg := NewConfig() + cfg.IsBlockPublisher = false + cfg.BlockchainPubkey = genPublic + cfg.GenesisAddress = genAddress + + v := &Visor{ + Config: cfg, + unconfirmed: unconfirmed, + blockchain: bc, + db: db, + history: his, + } + + // CreateBlock panics if called when not a block publisher + _require.PanicsWithLogMessage(t, "Only a block publisher node can create blocks", func() { + err := db.Update("", func(tx *dbutil.Tx) error { + _, err := v.createBlock(tx, when) + return err + }) + require.NoError(t, err) + }) + + v.Config.IsBlockPublisher = true + v.Config.BlockchainSeckey = genSecret + + addGenesisBlockToVisor(t, v) + + var gb *coin.SignedBlock + err = db.View("", func(tx *dbutil.Tx) error { + var err error + gb, err = v.blockchain.GetGenesisBlock(tx) + return err + }) + require.NoError(t, err) + require.NotNil(t, gb) + + // If no transactions in the unconfirmed pool, return an error + err = db.Update("", func(tx *dbutil.Tx) error { + _, err := v.createBlock(tx, when) + return err + }) + testutil.RequireError(t, err, "No transactions") + + uxs := coin.CreateUnspents(gb.Head, gb.Body.Transactions[0]) + + toAddr := testutil.MakeAddress() + var coins uint64 = 10e6 + + // Create a transaction with valid decimal places + txn := makeSpendTxn(t, uxs, []cipher.SecKey{genSecret}, genAddress, coins) + known, softErr, err := v.InjectForeignTransaction(txn) + require.False(t, known) + require.Nil(t, softErr) + require.NoError(t, err) + + // Execute a block to clear this transaction from the pool + sb, err := v.CreateAndExecuteBlock() + require.NoError(t, err) + require.Equal(t, 1, len(sb.Body.Transactions)) + require.Equal(t, 2, len(sb.Body.Transactions[0].Out)) + + err = db.View("", func(tx *dbutil.Tx) error { + length, err := unconfirmed.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(0), length) + + length, err = bc.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(2), length) + + return nil + }) + require.NoError(t, err) + + uxs = coin.CreateUnspents(sb.Head, sb.Body.Transactions[0]) + + // Check transactions with overflowing output coins fail + txn = makeOverflowCoinsSpendTxn(t, coin.UxArray{uxs[0]}, []cipher.SecKey{genSecret}, toAddr) + _, softErr, err = v.InjectForeignTransaction(txn) + require.IsType(t, ErrTxnViolatesHardConstraint{}, err) + testutil.RequireError(t, err.(ErrTxnViolatesHardConstraint).Err, "Output coins overflow") + require.Nil(t, softErr) + + err = db.View("", func(tx *dbutil.Tx) error { + length, err := unconfirmed.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(0), length) + return nil + }) + require.NoError(t, err) + + // Check transactions with overflowing output hours fail + // It should not be injected; when injecting a txn, the overflowing output hours is treated + // as a hard constraint. It is only a soft constraint when the txn is included in a signed block. + txn = makeOverflowHoursSpendTxn(t, coin.UxArray{uxs[0]}, []cipher.SecKey{genSecret}, toAddr) + _, softErr, err = v.InjectForeignTransaction(txn) + require.Nil(t, softErr) + require.IsType(t, ErrTxnViolatesHardConstraint{}, err) + testutil.RequireError(t, err.(ErrTxnViolatesHardConstraint).Err, "Transaction output hours overflow") + + err = db.View("", func(tx *dbutil.Tx) error { + length, err := unconfirmed.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(0), length) + return nil + }) + require.NoError(t, err) + + // Create a transaction with invalid decimal places + // It's still injected, because this is considered a soft error + invalidCoins := coins + (params.UserVerifyTxn.MaxDropletDivisor() / 10) + txn = makeSpendTxn(t, uxs, []cipher.SecKey{genSecret, genSecret}, toAddr, invalidCoins) + _, softErr, err = v.InjectForeignTransaction(txn) + require.NoError(t, err) + testutil.RequireError(t, softErr.Err, params.ErrInvalidDecimals.Error()) + + err = db.View("", func(tx *dbutil.Tx) error { + length, err := unconfirmed.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(1), length) + return nil + }) + require.NoError(t, err) + + // Create a transaction with null address output + uxs = coin.CreateUnspents(gb.Head, gb.Body.Transactions[0]) + txn = makeSpendTxn(t, uxs, []cipher.SecKey{genSecret}, genAddress, coins) + txn.Out[0].Address = cipher.Address{} + known, _, _, err = v.InjectUserTransaction(txn) + require.False(t, known) + require.IsType(t, ErrTxnViolatesUserConstraint{}, err) + testutil.RequireError(t, err, "Transaction violates user constraint: Transaction output is sent to the null address") +} + +func makeOverflowCoinsSpendTxn(t *testing.T, uxs coin.UxArray, keys []cipher.SecKey, toAddr cipher.Address) coin.Transaction { + spendTxn := coin.Transaction{} + var totalHours uint64 + var totalCoins uint64 + for _, ux := range uxs { + err := spendTxn.PushInput(ux.Hash()) + require.NoError(t, err) + totalHours += ux.Body.Hours + totalCoins += ux.Body.Coins + } + + hours := totalHours / 12 + + // These two outputs' coins added up will overflow + err := spendTxn.PushOutput(toAddr, 18446744073709551000, hours) + require.NoError(t, err) + err = spendTxn.PushOutput(toAddr, totalCoins, hours) + require.NoError(t, err) + + spendTxn.SignInputs(keys) + err = spendTxn.UpdateHeader() + require.NoError(t, err) + return spendTxn +} + +func makeOverflowHoursSpendTxn(t *testing.T, uxs coin.UxArray, keys []cipher.SecKey, toAddr cipher.Address) coin.Transaction { + spendTxn := coin.Transaction{} + var totalHours uint64 + var totalCoins uint64 + for _, ux := range uxs { + err := spendTxn.PushInput(ux.Hash()) + require.NoError(t, err) + totalHours += ux.Body.Hours + totalCoins += ux.Body.Coins + } + + hours := totalHours / 12 + + // These two outputs' hours added up will overflow + err := spendTxn.PushOutput(toAddr, totalCoins/2, 18446744073709551615) + require.NoError(t, err) + err = spendTxn.PushOutput(toAddr, totalCoins-totalCoins/2, hours) + require.NoError(t, err) + + spendTxn.SignInputs(keys) + err = spendTxn.UpdateHeader() + require.NoError(t, err) + return spendTxn +} + +func makeTestData(t *testing.T, n int) ([]historydb.Transaction, []coin.SignedBlock, []UnconfirmedTransaction, uint64) { //nolint:unparam + var txns []historydb.Transaction + var blocks []coin.SignedBlock + var uncfmTxns []UnconfirmedTransaction + for i := uint64(0); i < uint64(n); i++ { + tm := time.Now().UTC().Unix() + int64(i)*int64(time.Second) + txns = append(txns, historydb.Transaction{ + BlockSeq: i, + Txn: coin.Transaction{ + InnerHash: testutil.RandSHA256(t), + }, + }) + + blocks = append(blocks, coin.SignedBlock{ + Block: coin.Block{ + Head: coin.BlockHeader{ + BkSeq: i, + Time: uint64(tm), + }, + }, + }) + + uncfmTxns = append(uncfmTxns, UnconfirmedTransaction{ + Transaction: coin.Transaction{ + InnerHash: testutil.RandSHA256(t), + }, + Received: time.Now().UTC().Unix() + int64(n)*int64(time.Second), + }) + } + + return txns, blocks, uncfmTxns, uint64(n) +} + +func makeUncfmUxs(txns []UnconfirmedTransaction) coin.UxArray { + var uxs coin.UxArray + for i := range txns { + uxs = append(uxs, coin.UxOut{ + Head: coin.UxHead{ + Time: uint64(txns[i].Received), + }, + Body: coin.UxBody{ + SrcTransaction: txns[i].Transaction.Hash(), + }, + }) + } + return uxs +} + +type txnsAndUncfmTxns struct { + Txns []historydb.Transaction + UncfmTxns []UnconfirmedTransaction +} +type expectTxnResult struct { + txns []Transaction + uncfmTxns []Transaction + err error +} + +func TestGetTransactions(t *testing.T) { + // Generates test data + txns, blocks, uncfmTxns, headSeq := makeTestData(t, 10) + // Generates []Transaction + var lTxns []Transaction + for i := range txns { + height := headSeq - txns[i].BlockSeq + 1 + lTxns = append(lTxns, Transaction{ + Transaction: txns[i].Txn, + Status: NewConfirmedTransactionStatus(height, txns[i].BlockSeq), + Time: blocks[i].Time(), + }) + } + + // Generate unconfirmed []Transaction + var luncfmTxns []Transaction + for i, txn := range uncfmTxns { + luncfmTxns = append(luncfmTxns, Transaction{ + Transaction: uncfmTxns[i].Transaction, + Status: NewUnconfirmedTransactionStatus(), + Time: uint64(timeutil.NanoToTime(txn.Received).Unix()), + }) + } + + // Generates addresses + var addrs []cipher.Address + for i := 0; i < 10; i++ { + addrs = append(addrs, testutil.MakeAddress()) + } + + tt := []struct { + name string + addrTxns map[cipher.Address]txnsAndUncfmTxns + blocks []coin.SignedBlock + bcHeadSeq uint64 + filters []TxFilter + expect expectTxnResult + }{ + { + "addrFilter=1 addr=1 txns=0 unconfirmedTxns=0", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: nil, + UncfmTxns: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:1]), + }, + expectTxnResult{ + txns: nil, + uncfmTxns: nil, + err: nil, + }, + }, + { + "addrFilter=1 addr=1 txns=0 unconfirmedTxns=1", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: nil, + UncfmTxns: uncfmTxns[:1], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:1]), + }, + expectTxnResult{ + txns: nil, + uncfmTxns: luncfmTxns[:1], + err: nil, + }, + }, + { + "addrFilter=1 addr=1 txns=0 unconfirmedTxns=2", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: nil, + UncfmTxns: uncfmTxns[:2], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:1]), + }, + expectTxnResult{ + txns: nil, + uncfmTxns: luncfmTxns[:2], + err: nil, + }, + }, + { + "addrFilter=1 addr=1 txns=1 unconfirmedTxns=0", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:1], + UncfmTxns: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:1]), + }, + expectTxnResult{ + txns: lTxns[:1], + uncfmTxns: nil, + err: nil, + }, + }, + { + "addrFilter=1 addr=1 txns=1 unconfirmedTxns=1", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:1], + UncfmTxns: uncfmTxns[:1], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:1]), + }, + expectTxnResult{ + txns: lTxns[:1], + uncfmTxns: luncfmTxns[:1], + err: nil, + }, + }, + { + "addrFilter=1 addr=1 txns=2 unconfirmedTxns=0", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:2], + UncfmTxns: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:1]), + }, + expectTxnResult{ + txns: lTxns[:2], + uncfmTxns: nil, + err: nil, + }, + }, + { + "addrFilter=1 addr=1 txns=2 unconfirmedTxns=1", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:2], + UncfmTxns: uncfmTxns[:1], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:1]), + }, + expectTxnResult{ + txns: lTxns[:2], + uncfmTxns: luncfmTxns[:1], + err: nil, + }, + }, + { + "addrFilter=1 addr=1 txns=2 unconfirmedTxns=2", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:2], + UncfmTxns: uncfmTxns[:2], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:1]), + }, + expectTxnResult{ + txns: lTxns[:2], + uncfmTxns: luncfmTxns[:2], + err: nil, + }, + }, + { + "addrFilter=1 addr=2 txns=0 unconfirmedTxns=0", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: nil, + UncfmTxns: nil, + }, + addrs[1]: txnsAndUncfmTxns{ + Txns: nil, + UncfmTxns: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:2]), + }, + expectTxnResult{ + txns: nil, + uncfmTxns: nil, + err: nil, + }, + }, + { + "addrFilter=1 addr=2 txns=0 unconfirmedTxns=1", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: nil, + UncfmTxns: uncfmTxns[:1], + }, + addrs[1]: txnsAndUncfmTxns{ + Txns: nil, + UncfmTxns: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:2]), + }, + expectTxnResult{ + txns: nil, + uncfmTxns: luncfmTxns[:1], + err: nil, + }, + }, + { + "addrFilter=1 addr=2 txns=0 unconfirmedTxns=2", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: nil, + UncfmTxns: uncfmTxns[:1], + }, + addrs[1]: txnsAndUncfmTxns{ + Txns: nil, + UncfmTxns: uncfmTxns[:2], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:2]), + }, + expectTxnResult{ + txns: nil, + uncfmTxns: luncfmTxns[:2], + err: nil, + }, + }, + { + "addrFilter=1 addr=2 txns=1 unconfirmedTxns=0", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:1], + UncfmTxns: nil, + }, + addrs[1]: txnsAndUncfmTxns{ + Txns: nil, + UncfmTxns: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:2]), + }, + expectTxnResult{ + txns: lTxns[:1], + uncfmTxns: nil, + err: nil, + }, + }, + { + "addrFilter=1 addr=2 txns=1 unconfirmedTxns=1", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:1], + UncfmTxns: uncfmTxns[:1], + }, + addrs[1]: txnsAndUncfmTxns{ + Txns: nil, + UncfmTxns: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:2]), + }, + expectTxnResult{ + txns: lTxns[:1], + uncfmTxns: luncfmTxns[:1], + err: nil, + }, + }, + { + "addrFilter=1 addr=2 txns=1 unconfirmedTxns=2", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:1], + UncfmTxns: uncfmTxns[:1], + }, + addrs[1]: txnsAndUncfmTxns{ + Txns: nil, + UncfmTxns: uncfmTxns[:2], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:2]), + }, + expectTxnResult{ + txns: lTxns[:1], + uncfmTxns: luncfmTxns[:2], + err: nil, + }, + }, + { + "addrFilter=1 addr=2 txns=2 unconfirmedTxns=0", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:2], + UncfmTxns: nil, + }, + addrs[1]: txnsAndUncfmTxns{ + Txns: nil, + UncfmTxns: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:2]), + }, + expectTxnResult{ + txns: lTxns[:2], + uncfmTxns: nil, + err: nil, + }, + }, + { + "addrFilter=1 addr=2 txns=2 unconfirmedTxns=1", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:2], + UncfmTxns: uncfmTxns[:1], + }, + addrs[1]: txnsAndUncfmTxns{ + Txns: nil, + UncfmTxns: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:2]), + }, + expectTxnResult{ + txns: lTxns[:2], + uncfmTxns: luncfmTxns[:1], + err: nil, + }, + }, + { + "addrFilter=1 addr=2 txns=2 unconfirmedTxns=2", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:2], + UncfmTxns: uncfmTxns[:2], + }, + addrs[1]: txnsAndUncfmTxns{ + Txns: nil, + UncfmTxns: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:2]), + }, + expectTxnResult{ + txns: lTxns[:2], + uncfmTxns: luncfmTxns[:2], + err: nil, + }, + }, + { + "addrFilter=1 addr=2 txns=2 unconfirmedTxns=3", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:2], + UncfmTxns: uncfmTxns[:2], + }, + addrs[1]: txnsAndUncfmTxns{ + Txns: nil, + UncfmTxns: uncfmTxns[2:3], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:2]), + }, + expectTxnResult{ + txns: lTxns[:2], + uncfmTxns: luncfmTxns[:3], + err: nil, + }, + }, + { + "addrFilter=1 addr=2 txns=3 unconfirmedTxns=0", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:2], + UncfmTxns: nil, + }, + addrs[1]: txnsAndUncfmTxns{ + Txns: txns[2:3], + UncfmTxns: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:2]), + }, + expectTxnResult{ + txns: lTxns[:3], + uncfmTxns: nil, + err: nil, + }, + }, + { + "addrFilter=1 addr=2 txns=3 unconfirmedTxns=1", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:2], + UncfmTxns: uncfmTxns[:1], + }, + addrs[1]: txnsAndUncfmTxns{ + Txns: txns[2:3], + UncfmTxns: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:2]), + }, + expectTxnResult{ + txns: lTxns[:3], + uncfmTxns: luncfmTxns[:1], + err: nil, + }, + }, + { + "addrFilter=1 addr=2 txns=3 unconfirmedTxns=2", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:2], + UncfmTxns: uncfmTxns[:2], + }, + addrs[1]: txnsAndUncfmTxns{ + Txns: txns[2:3], + UncfmTxns: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:2]), + }, + expectTxnResult{ + txns: lTxns[:3], + uncfmTxns: luncfmTxns[:2], + err: nil, + }, + }, + { + "addrFilter=1 addr=2 txns=3 unconfirmedTxns=3", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:2], + UncfmTxns: uncfmTxns[:2], + }, + addrs[1]: txnsAndUncfmTxns{ + Txns: txns[2:3], + UncfmTxns: uncfmTxns[2:3], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:2]), + }, + expectTxnResult{ + txns: lTxns[:3], + uncfmTxns: luncfmTxns[:3], + err: nil, + }, + }, + { + "confirmedTxFilter=1 confirmed=false txns=0 unconfirmedTxns=0", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: nil, + UncfmTxns: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewConfirmedTxFilter(false), + }, + expectTxnResult{ + txns: nil, + uncfmTxns: nil, + err: nil, + }, + }, + { + "confirmedTxFilter=1 confirmed=false confirmedTxns=1 unconfirmedTxns=0", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:1], + UncfmTxns: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewConfirmedTxFilter(false), + }, + expectTxnResult{ + txns: nil, + uncfmTxns: nil, + err: nil, + }, + }, + { + "confirmedTxFilter=1 confirmed=false confirmedTxns=1 unconfirmedTxns=1", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:1], + UncfmTxns: uncfmTxns[:1], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewConfirmedTxFilter(false), + }, + expectTxnResult{ + txns: nil, + uncfmTxns: luncfmTxns[:1], + err: nil, + }, + }, + { + "confirmedTxFilter=1 confirmed=false confirmedTxns=2 unconfirmedTxns=1", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:2], + UncfmTxns: uncfmTxns[:1], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewConfirmedTxFilter(false), + }, + expectTxnResult{ + txns: nil, + uncfmTxns: luncfmTxns[:1], + err: nil, + }, + }, + { + "confirmedTxFilter=1 confirmed=false confirmedTxns=2 unconfirmedTxns=2", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:2], + UncfmTxns: uncfmTxns[:2], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewConfirmedTxFilter(false), + }, + expectTxnResult{ + txns: nil, + uncfmTxns: luncfmTxns[:2], + err: nil, + }, + }, + { + "confirmedTxFilter=1 confirmed=true confirmedTxns=0 unconfirmedTxns=0", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: nil, + UncfmTxns: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewConfirmedTxFilter(true), + }, + expectTxnResult{ + txns: nil, + uncfmTxns: nil, + err: nil, + }, + }, + { + "confirmedTxFilter=1 confirmed=true confirmedTxns=1 unconfirmedTxns=0", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:1], + UncfmTxns: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewConfirmedTxFilter(true), + }, + expectTxnResult{ + txns: lTxns[:1], + uncfmTxns: nil, + err: nil, + }, + }, + { + "confirmedTxFilter=1 confirmed=true confirmedTxns=1 unconfirmedTxns=1", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:1], + UncfmTxns: uncfmTxns[:1], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewConfirmedTxFilter(true), + }, + expectTxnResult{ + txns: lTxns[:1], + uncfmTxns: nil, + err: nil, + }, + }, + { + "confirmedTxFilter=1 confirmed=true confirmedTxns=2 unconfirmedTxns=1", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:2], + UncfmTxns: uncfmTxns[:2], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewConfirmedTxFilter(true), + }, + expectTxnResult{ + txns: lTxns[:2], + uncfmTxns: nil, + err: nil, + }, + }, + { + "addrFilter=1 confirmedTxFilter=1 confirmed=false addr=1 txns=0 unconfirmedTxns=0", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{}, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:1]), + NewConfirmedTxFilter(false), + }, + expectTxnResult{ + txns: nil, + uncfmTxns: nil, + err: nil, + }, + }, + { + "addrFilter=1 confirmed=false addr=1 txns=1 unconfirmedTxns=0", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:1], + UncfmTxns: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:1]), + NewConfirmedTxFilter(false), + }, + expectTxnResult{ + txns: nil, + uncfmTxns: nil, + err: nil, + }, + }, + { + "addrFilter=1 confirmed=false addr=1 txns=1 unconfirmedTxns=1", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:1], + UncfmTxns: uncfmTxns[:1], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:1]), + NewConfirmedTxFilter(false), + }, + expectTxnResult{ + txns: nil, + uncfmTxns: luncfmTxns[:1], + err: nil, + }, + }, + { + "addrFilter=1 confirmed=false addr=1 txns=1 unconfirmedTxns=2", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:1], + UncfmTxns: uncfmTxns[:2], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:1]), + NewConfirmedTxFilter(false), + }, + expectTxnResult{ + txns: nil, + uncfmTxns: luncfmTxns[:2], + err: nil, + }, + }, + { + "addrFilter=1 confirmed=false addr=2 txns=1 unconfirmedTxns=0", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:1], + UncfmTxns: nil, + }, + addrs[1]: txnsAndUncfmTxns{ + Txns: nil, + UncfmTxns: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:2]), + NewConfirmedTxFilter(false), + }, + expectTxnResult{ + txns: nil, + uncfmTxns: nil, + err: nil, + }, + }, + { + "addrFilter=1 confirmed=false addr=2 txns=1 unconfirmedTxns=1", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:1], + UncfmTxns: uncfmTxns[:1], + }, + addrs[1]: txnsAndUncfmTxns{ + Txns: nil, + UncfmTxns: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:2]), + NewConfirmedTxFilter(false), + }, + expectTxnResult{ + txns: nil, + uncfmTxns: luncfmTxns[:1], + err: nil, + }, + }, + { + "addrFilter=1 confirmed=false addr=2 txns=2 unconfirmedTxns=1", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:2], + UncfmTxns: uncfmTxns[:1], + }, + addrs[1]: txnsAndUncfmTxns{ + Txns: nil, + UncfmTxns: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:2]), + NewConfirmedTxFilter(false), + }, + expectTxnResult{ + txns: nil, + uncfmTxns: luncfmTxns[:1], + err: nil, + }, + }, + { + "addrFilter=1 confirmed=false addr=2 txns=2 unconfirmedTxns=2", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:2], + UncfmTxns: uncfmTxns[:1], + }, + addrs[1]: txnsAndUncfmTxns{ + Txns: nil, + UncfmTxns: uncfmTxns[1:2], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:2]), + NewConfirmedTxFilter(false), + }, + expectTxnResult{ + txns: nil, + uncfmTxns: luncfmTxns[:2], + err: nil, + }, + }, + { + "addrFilter=1 confirmed=false addr=2 txns=2 unconfirmedTxns=3", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:2], + UncfmTxns: uncfmTxns[:2], + }, + addrs[1]: txnsAndUncfmTxns{ + Txns: nil, + UncfmTxns: uncfmTxns[2:3], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:2]), + NewConfirmedTxFilter(false), + }, + expectTxnResult{ + txns: nil, + uncfmTxns: luncfmTxns[:3], + err: nil, + }, + }, + { + "addrFilter=1 confirmed=false addr=2/1 txns=2 unconfirmedTxns=3", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:2], + UncfmTxns: uncfmTxns[:2], + }, + addrs[1]: txnsAndUncfmTxns{ + Txns: nil, + UncfmTxns: uncfmTxns[2:3], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:1]), + NewConfirmedTxFilter(false), + }, + expectTxnResult{ + txns: nil, + uncfmTxns: luncfmTxns[:2], + err: nil, + }, + }, + { + "addrFilter=1 confirmed=false addr=2/2 txns=2 unconfirmedTxns=3", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:2], + UncfmTxns: uncfmTxns[:2], + }, + addrs[1]: txnsAndUncfmTxns{ + Txns: nil, + UncfmTxns: uncfmTxns[2:3], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[1:2]), + NewConfirmedTxFilter(false), + }, + expectTxnResult{ + txns: nil, + uncfmTxns: luncfmTxns[2:3], + err: nil, + }, + }, + { + "addrFilter=1 confirmed=true addr=1 txns=0 unconfirmedTxns=0", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: nil, + UncfmTxns: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:1]), + NewConfirmedTxFilter(true), + }, + expectTxnResult{ + txns: nil, + uncfmTxns: nil, + err: nil, + }, + }, + { + "addrFilter=1 confirmed=true addr=1 txns=1 unconfirmedTxns=0", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:1], + UncfmTxns: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:1]), + NewConfirmedTxFilter(true), + }, + expectTxnResult{ + txns: lTxns[:1], + uncfmTxns: nil, + err: nil, + }, + }, + { + "addrFilter=1 confirmed=true addr=1 txns=1 unconfirmedTxns=1", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:1], + UncfmTxns: uncfmTxns[:1], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:1]), + NewConfirmedTxFilter(true), + }, + expectTxnResult{ + txns: lTxns[:1], + uncfmTxns: nil, + err: nil, + }, + }, + { + "addrFilter=1 confirmed=true addr=1 txns=2 unconfirmedTxns=1", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:2], + UncfmTxns: uncfmTxns[:1], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:1]), + NewConfirmedTxFilter(true), + }, + expectTxnResult{ + txns: lTxns[:2], + uncfmTxns: nil, + err: nil, + }, + }, + { + "addrFilter=1 confirmed=true addr=1 txns=2 unconfirmedTxns=2", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:2], + UncfmTxns: uncfmTxns[:2], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:1]), + NewConfirmedTxFilter(true), + }, + expectTxnResult{ + txns: lTxns[:2], + uncfmTxns: nil, + err: nil, + }, + }, + { + "addrFilter=1 confirmed=true addr=2/1 txns=3 unconfirmedTxns=2", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:2], + UncfmTxns: uncfmTxns[:1], + }, + addrs[1]: txnsAndUncfmTxns{ + Txns: txns[2:3], + UncfmTxns: uncfmTxns[1:2], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:1]), + NewConfirmedTxFilter(true), + }, + expectTxnResult{ + txns: lTxns[:2], + uncfmTxns: nil, + err: nil, + }, + }, + { + "addrFilter=1 confirmed=true addr=2/2 txns=3 unconfirmedTxns=2", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:2], + UncfmTxns: uncfmTxns[:1], + }, + addrs[1]: txnsAndUncfmTxns{ + Txns: txns[2:3], + UncfmTxns: uncfmTxns[1:2], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[1:2]), + NewConfirmedTxFilter(true), + }, + expectTxnResult{ + txns: lTxns[2:3], + uncfmTxns: nil, + err: nil, + }, + }, + { + "addrFilter=1 confirmed=true addr=2 txns=3 unconfirmedTxns=2", + map[cipher.Address]txnsAndUncfmTxns{ + addrs[0]: txnsAndUncfmTxns{ + Txns: txns[:2], + UncfmTxns: uncfmTxns[:1], + }, + addrs[1]: txnsAndUncfmTxns{ + Txns: txns[2:3], + UncfmTxns: uncfmTxns[1:2], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + NewAddrsFilter(addrs[:2]), + NewConfirmedTxFilter(true), + }, + expectTxnResult{ + txns: lTxns[:3], + uncfmTxns: nil, + err: nil, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + matchDBTx := mock.MatchedBy(func(tx *dbutil.Tx) bool { + return true + }) + + his := newHistoryerMock2() + uncfmTxnPool := NewUnconfirmedTransactionPoolerMock2() + for addr, txns := range tc.addrTxns { + his.On("GetTransactionsForAddress", matchDBTx, addr).Return(txns.Txns, nil) + his.txns = append(his.txns, txns.Txns...) + + uncfmTxnPool.On("GetUnspentsOfAddr", matchDBTx, addr).Return(makeUncfmUxs(txns.UncfmTxns), nil) + for i, uncfmTxn := range txns.UncfmTxns { + uncfmTxnPool.On("Get", matchDBTx, uncfmTxn.Transaction.Hash()).Return(&txns.UncfmTxns[i], nil) + } + uncfmTxnPool.txns = append(uncfmTxnPool.txns, txns.UncfmTxns...) + } + + bc := &MockBlockchainer{} + for i, b := range tc.blocks { + bc.On("GetSignedBlockBySeq", matchDBTx, b.Seq()).Return(&tc.blocks[i], nil) + } + + bc.On("HeadSeq", matchDBTx).Return(tc.bcHeadSeq, true, nil) + + db, shutdown := prepareDB(t) + defer shutdown() + + v := &Visor{ + db: db, + history: his, + unconfirmed: uncfmTxnPool, + blockchain: bc, + } + + retTxns, err := v.GetTransactions(tc.filters) + require.Equal(t, tc.expect.err, err) + if err != nil { + return + } + + require.Len(t, retTxns, len(tc.expect.txns)+len(tc.expect.uncfmTxns)) + + // Splits confirmed and unconfirmed txns in returned transactions + uncfmTxnMap := make(map[cipher.SHA256]Transaction) + txnMap := make(map[cipher.SHA256]Transaction) + for i, txn := range retTxns { + h := txn.Transaction.Hash() + if retTxns[i].Status.Confirmed { + txnMap[h] = retTxns[i] + } else { + uncfmTxnMap[h] = retTxns[i] + } + } + + // Confirms that all expected confirmed transactions must be in the txnMap + for _, txn := range tc.expect.txns { + h := txn.Transaction.Hash() + retTxn, ok := txnMap[h] + require.True(t, ok) + require.Equal(t, txn, retTxn) + } + + // Confirms that all expected unconfirmed transactions must be in the uncfmTxnMap + for _, txn := range tc.expect.uncfmTxns { + h := txn.Transaction.Hash() + retTxn, ok := uncfmTxnMap[h] + require.True(t, ok) + require.Equal(t, txn, retTxn) + } + }) + } +} + +func TestRefreshUnconfirmed(t *testing.T) { + db, shutdown := prepareDB(t) + defer shutdown() + + bc, err := NewBlockchain(db, BlockchainConfig{ + Pubkey: genPublic, + }) + require.NoError(t, err) + + unconfirmed, err := NewUnconfirmedTransactionPool(db) + require.NoError(t, err) + + his := historydb.New() + + cfg := NewConfig() + cfg.IsBlockPublisher = true + cfg.BlockchainSeckey = genSecret + cfg.BlockchainPubkey = genPublic + cfg.GenesisAddress = genAddress + + v := &Visor{ + Config: cfg, + unconfirmed: unconfirmed, + blockchain: bc, + db: db, + history: his, + } + + addGenesisBlockToVisor(t, v) + var gb *coin.SignedBlock + err = db.View("", func(tx *dbutil.Tx) error { + var err error + gb, err = v.blockchain.GetGenesisBlock(tx) + return err + }) + require.NoError(t, err) + require.NotNil(t, gb) + + uxs := coin.CreateUnspents(gb.Head, gb.Body.Transactions[0]) + + toAddr := testutil.MakeAddress() + var coins uint64 = 10e6 + + // Create a valid transaction that will remain valid + validTxn := makeSpendTxn(t, uxs, []cipher.SecKey{genSecret}, genAddress, coins) + known, softErr, err := v.InjectForeignTransaction(validTxn) + require.False(t, known) + require.Nil(t, softErr) + require.NoError(t, err) + + err = db.View("", func(tx *dbutil.Tx) error { + length, err := unconfirmed.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(1), length) + return nil + }) + require.NoError(t, err) + + // Create a transaction with invalid decimal places + // It's still injected, because this is considered a soft error + // This transaction will stay invalid on refresh + invalidCoins := coins + (params.UserVerifyTxn.MaxDropletDivisor() / 10) + alwaysInvalidTxn := makeSpendTxn(t, uxs, []cipher.SecKey{genSecret}, toAddr, invalidCoins) + _, softErr, err = v.InjectForeignTransaction(alwaysInvalidTxn) + require.NoError(t, err) + testutil.RequireError(t, softErr.Err, params.ErrInvalidDecimals.Error()) + + err = db.View("", func(tx *dbutil.Tx) error { + length, err := unconfirmed.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(2), length) + return nil + }) + require.NoError(t, err) + + // Create a transaction that exceeds UnconfirmedVerifyTxn.MaxTransactionSize + // It's still injected, because this is considered a soft error + // This transaction will become valid on refresh (by increasing UnconfirmedVerifyTxn.MaxTransactionSize) + originalMaxUnconfirmedTxnSize := v.Config.UnconfirmedVerifyTxn.MaxTransactionSize + v.Config.UnconfirmedVerifyTxn.MaxTransactionSize = 1 + sometimesInvalidTxn := makeSpendTxn(t, uxs, []cipher.SecKey{genSecret}, toAddr, coins) + _, softErr, err = v.InjectForeignTransaction(sometimesInvalidTxn) + require.NoError(t, err) + require.NotNil(t, softErr) + testutil.RequireError(t, softErr.Err, ErrTxnExceedsMaxBlockSize.Error()) + + err = db.View("", func(tx *dbutil.Tx) error { + length, err := unconfirmed.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(3), length) + return nil + }) + require.NoError(t, err) + + // The first txn remains valid, + // the second txn remains invalid, + // the third txn becomes valid + v.Config.UnconfirmedVerifyTxn.MaxTransactionSize = originalMaxUnconfirmedTxnSize + hashes, err := v.RefreshUnconfirmed() + require.NoError(t, err) + require.Equal(t, []cipher.SHA256{sometimesInvalidTxn.Hash()}, hashes) + + // Reduce the max block size to affirm that the valid transaction becomes invalid + // The first txn becomes invalid, + // the second txn remains invalid, + // the third txn becomes invalid again + v.Config.UnconfirmedVerifyTxn.MaxTransactionSize = 1 + hashes, err = v.RefreshUnconfirmed() + require.NoError(t, err) + require.Nil(t, hashes) + + // Restore the max block size to affirm the expected transaction validity shifts + // The first txn was valid, became invalid, and is now valid again + // The second txn was always invalid + // The third txn was invalid, became valid, became invalid, and is now valid again + v.Config.UnconfirmedVerifyTxn.MaxTransactionSize = originalMaxUnconfirmedTxnSize + hashes, err = v.RefreshUnconfirmed() + require.NoError(t, err) + + // Sort hashes for deterministic comparison + expectedHashes := []cipher.SHA256{validTxn.Hash(), sometimesInvalidTxn.Hash()} + sort.Slice(expectedHashes, func(i, j int) bool { + return bytes.Compare(expectedHashes[i][:], expectedHashes[j][:]) < 0 + }) + sort.Slice(hashes, func(i, j int) bool { + return bytes.Compare(hashes[i][:], hashes[j][:]) < 0 + }) + require.Equal(t, expectedHashes, hashes) +} + +func TestRemoveInvalidUnconfirmedDoubleSpendArbitrating(t *testing.T) { + db, shutdown := prepareDB(t) + defer shutdown() + + bc, err := NewBlockchain(db, BlockchainConfig{ + Pubkey: genPublic, + Arbitrating: true, + }) + require.NoError(t, err) + + unconfirmed, err := NewUnconfirmedTransactionPool(db) + require.NoError(t, err) + + his := historydb.New() + + cfg := NewConfig() + cfg.IsBlockPublisher = true + cfg.Arbitrating = true + cfg.BlockchainPubkey = genPublic + cfg.GenesisAddress = genAddress + cfg.BlockchainSeckey = genSecret + + v := &Visor{ + Config: cfg, + unconfirmed: unconfirmed, + blockchain: bc, + db: db, + history: his, + } + + addGenesisBlockToVisor(t, v) + var gb *coin.SignedBlock + err = db.View("", func(tx *dbutil.Tx) error { + var err error + gb, err = v.blockchain.GetGenesisBlock(tx) + return err + }) + require.NoError(t, err) + require.NotNil(t, gb) + + uxs := coin.CreateUnspents(gb.Head, gb.Body.Transactions[0]) + + // Create two valid transactions, both spending the same inputs, one with a higher fee + // Then, create a block from these transactions. + // The one with the higher fee should be included in the block, and the other should be ignored. + // A call to RemoveInvalidUnconfirmed will remove the other txn, because it would now be a double spend. + + var coins uint64 = 10e6 + txn1 := makeSpendTxn(t, uxs, []cipher.SecKey{genSecret}, genAddress, coins) + known, softErr, err := v.InjectForeignTransaction(txn1) + require.False(t, known) + require.Nil(t, softErr) + require.NoError(t, err) + + err = db.View("", func(tx *dbutil.Tx) error { + length, err := unconfirmed.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(1), length) + return nil + }) + require.NoError(t, err) + + var fee uint64 = 1 + txn2 := makeSpendTxWithFee(t, uxs, []cipher.SecKey{genSecret}, genAddress, coins, fee) + known, softErr, err = v.InjectForeignTransaction(txn2) + require.False(t, known) + require.Nil(t, softErr) + require.NoError(t, err) + + err = db.View("", func(tx *dbutil.Tx) error { + length, err := unconfirmed.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(2), length) + return nil + }) + require.NoError(t, err) + + // Execute a block, txn2 should be included because it has a higher fee + sb, err := v.CreateAndExecuteBlock() + require.NoError(t, err) + require.Equal(t, 1, len(sb.Body.Transactions)) + require.Equal(t, 2, len(sb.Body.Transactions[0].Out)) + require.Equal(t, txn2.Hash().Hex(), sb.Body.Transactions[0].Hash().Hex()) + + err = db.View("", func(tx *dbutil.Tx) error { + length, err := unconfirmed.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(1), length) + + length, err = bc.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(2), length) + + return nil + }) + require.NoError(t, err) + + // Call RemoveInvalidUnconfirmed, the first txn will be removed because it is now a double-spend txn + removed, err := v.RemoveInvalidUnconfirmed() + require.NoError(t, err) + require.Equal(t, []cipher.SHA256{txn1.Hash()}, removed) + err = db.View("", func(tx *dbutil.Tx) error { + length, err := unconfirmed.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(0), length) + return nil + }) + require.NoError(t, err) +} + +func makeTxn(t *testing.T, headTime uint64, in, out []coin.UxOut, keys []cipher.SecKey) (coin.Transaction, []TransactionInput) { + inputs := make([]cipher.SHA256, len(in)) + for i, input := range in { + inputs[i] = input.Hash() + } + + outputs := make([]coin.TransactionOutput, len(out)) + for i, output := range out { + outputs[i] = coin.TransactionOutput{ + Address: output.Body.Address, + Coins: output.Body.Coins, + Hours: output.Body.Hours, + } + } + + txn := coin.Transaction{ + In: inputs, + Out: outputs, + } + + txn.SignInputs(keys) + err := txn.UpdateHeader() + require.NoError(t, err) + + txnInputs, err := NewTransactionInputs(in, headTime) + require.NoError(t, err) + return txn, txnInputs +} + +func TestVerifyTxnVerbose(t *testing.T) { + head := coin.SignedBlock{ + Block: coin.Block{ + Head: coin.BlockHeader{ + Time: uint64(time.Now().UTC().Unix()), + }, + }, + } + + hashes := make([]cipher.SHA256, 20) + for i := 0; i < 20; i++ { + hashes[i] = testutil.RandSHA256(t) + } + + keys := make([]cipher.SecKey, 5) + for i := 0; i < 5; i++ { + _, keys[i] = cipher.GenerateKeyPair() + } + + addrs := make([]cipher.Address, 5) + for i := 0; i < 5; i++ { + addrs[i] = cipher.MustAddressFromSecKey(keys[i]) + } + + srcTxnHashes := make([]cipher.SHA256, 5) + inputs := make([]coin.UxOut, 5) + historyOutputs := make([]historydb.UxOut, 5) + + for i := 0; i < 5; i++ { + srcTxnHashes[i] = testutil.RandSHA256(t) + inputs[i] = coin.UxOut{ + Head: coin.UxHead{ + Time: head.Time(), + }, + Body: coin.UxBody{ + SrcTransaction: srcTxnHashes[i], + Address: addrs[i], + Coins: 10e6, + Hours: 1000, + }, + } + + historyOutputs[i] = historydb.UxOut{ + Out: inputs[i], + } + } + + outputs := make([]coin.UxOut, 5) + for i := 0; i < 5; i++ { + outputs[i] = coin.UxOut{ + Head: coin.UxHead{ + Time: head.Time(), + }, + Body: coin.UxBody{ + Address: testutil.MakeAddress(), + Coins: 10e6, + Hours: 400 + uint64(i)*200, + }, + } + } + + // add uxout with math.MaxUint64 hours + outputs = append(outputs, coin.UxOut{ + Head: coin.UxHead{ + Time: head.Time(), + }, + Body: coin.UxBody{ + Address: testutil.MakeAddress(), + Coins: 10e6, + Hours: math.MaxUint64, + }, + }) + + // add output which has 11e6 coins + outputs = append(outputs, coin.UxOut{ + Head: coin.UxHead{ + Time: head.Time(), + }, + Body: coin.UxBody{ + Address: testutil.MakeAddress(), + Coins: 11e6, + Hours: 500, + }, + }) + + // create a transaction + txn, spentInputs := makeTxn(t, head.Time(), inputs[:1], outputs[:1], keys[:1]) + + // create a transaction which sends coin to null address + toNullAddrTxn, toNullAddrSpentUxBalances := makeTxn(t, head.Time(), inputs[:1], outputs[:1], keys[:1]) + toNullAddrTxn.Out[0].Address = cipher.Address{} + + // create a transaction with insufficient coin hours + inSufficientCoinHoursTxn, _ := makeTxn(t, head.Time(), inputs[:1], outputs[4:5], keys[:1]) + + // create a transaction with zero fee + zeroFeeTxn, _ := makeTxn(t, head.Time(), inputs[:1], outputs[3:4], keys[:1]) + + // create a transaction with output coin hours overflow + coinHourOverflowTxn, _ := makeTxn(t, head.Time(), inputs[:1], outputs[4:], keys[:1]) + + // create a transaction with insufficient fee + insufficientFeeOuts := []coin.UxOut{ + coin.UxOut{ + Head: coin.UxHead{ + Time: head.Time(), + }, + Body: coin.UxBody{ + Address: testutil.MakeAddress(), + Coins: 1e6, + Hours: 950, + }, + }, + } + insufficientFeeTxn, _ := makeTxn(t, head.Time(), inputs[:1], insufficientFeeOuts[:], keys[:1]) + + // create a transaction with insufficient coins + insufficientCoinsTxn, _ := makeTxn(t, head.Time(), inputs[:1], outputs[6:], keys[:1]) + + // create a transaction with valid signature signed by key that doesn't own the input + badSigTxn, badSigTxnSpentInputs := makeTxn(t, head.Time(), inputs[:2], outputs[:2], keys[1:3]) + + // create a transaction with an empty signature + fullyUnsignedTxn, fullyUnsignedSpentInputs := makeTxn(t, head.Time(), inputs[:2], outputs[:2], keys[:2]) + fullyUnsignedTxn.Sigs[0] = cipher.Sig{} + fullyUnsignedTxn.Sigs[1] = cipher.Sig{} + err := fullyUnsignedTxn.UpdateHeader() + require.NoError(t, err) + + partiallyUnsignedTxn, partiallyUnsignedSpentInputs := makeTxn(t, head.Time(), inputs[:2], outputs[:2], keys[:2]) + partiallyUnsignedTxn.Sigs[0] = cipher.Sig{} + err = partiallyUnsignedTxn.UpdateHeader() + require.NoError(t, err) + + type testCase struct { + name string + txn coin.Transaction + isConfirmed bool + isUnsigned bool + signed TxnSignedFlag + inputs []TransactionInput + err error + + maxUserTransactionSize uint32 + + getArrayRet coin.UxArray + getArrayErr error + + getHistoryTxnRet *historydb.Transaction + getHistoryTxnErr error + + getHistoryUxOutsRet []historydb.UxOut + getHistoryUxOutsErr error + + getSignedBlocksBySeqRet *coin.SignedBlock + getSignedBlocksBySeqErr error + } + + baseCases := []testCase{ + { + name: "transaction has been spent", + txn: txn, + isConfirmed: true, + signed: TxnSigned, + inputs: spentInputs[:], + + getArrayErr: blockdb.ErrUnspentNotExist{UxID: inputs[0].Hash().Hex()}, + getHistoryTxnRet: &historydb.Transaction{ + Txn: txn, + BlockSeq: 10, + }, + getHistoryUxOutsRet: historyOutputs[:1], + getSignedBlocksBySeqRet: &coin.SignedBlock{ + Block: coin.Block{ + Head: coin.BlockHeader{ + Time: 10000000, + }, + }, + }, + }, + { + name: "transaction has been spent, get previous block error", + txn: txn, + isConfirmed: true, + signed: TxnSigned, + inputs: nil, + err: errors.New("GetSignedBlockBySeq failed"), + + getArrayErr: blockdb.ErrUnspentNotExist{UxID: inputs[0].Hash().Hex()}, + getHistoryTxnRet: &historydb.Transaction{ + Txn: txn, + BlockSeq: 10, + }, + getHistoryUxOutsRet: historyOutputs[:1], + getSignedBlocksBySeqErr: errors.New("GetSignedBlockBySeq failed"), + }, + { + name: "transaction has been spent, previous block not found", + txn: txn, + isConfirmed: true, + signed: TxnSigned, + inputs: nil, + err: fmt.Errorf("VerifyTxnVerbose: previous block seq=%d not found", 9), + + getArrayErr: blockdb.ErrUnspentNotExist{UxID: inputs[0].Hash().Hex()}, + getHistoryTxnRet: &historydb.Transaction{ + Txn: txn, + BlockSeq: 10, + }, + getHistoryUxOutsRet: historyOutputs[:1], + getSignedBlocksBySeqRet: nil, + getSignedBlocksBySeqErr: nil, + }, + { + name: "transaction does not exist in either unspents or historydb", + txn: txn, + isConfirmed: false, + signed: TxnSigned, + err: ErrTxnViolatesHardConstraint{fmt.Errorf("transaction input of %s does not exist in either unspent pool or historydb", inputs[0].Hash().Hex())}, + + getArrayErr: blockdb.ErrUnspentNotExist{UxID: inputs[0].Hash().Hex()}, + }, + { + name: "transaction violate user constratins, send to null address", + txn: toNullAddrTxn, + isConfirmed: false, + signed: TxnSigned, + err: ErrTxnViolatesUserConstraint{errors.New("Transaction output is sent to the null address")}, + inputs: toNullAddrSpentUxBalances[:], + + getArrayRet: inputs[:1], + }, + { + name: "transaction violate soft constraints, transaction size bigger than max block size", + signed: TxnSigned, + maxUserTransactionSize: 1, + txn: txn, + inputs: spentInputs[:], + err: ErrTxnViolatesSoftConstraint{errors.New("Transaction size bigger than max block size")}, + + getArrayRet: inputs[:1], + }, + { + name: "transaction violate soft constraints, Insufficient coinhours for transaction outputs", + signed: TxnSigned, + txn: inSufficientCoinHoursTxn, + err: ErrTxnViolatesSoftConstraint{fee.ErrTxnInsufficientCoinHours}, + inputs: spentInputs[:], + getArrayRet: inputs[:1], + }, + { + name: "transaction violate soft constraints, zero fee", + signed: TxnSigned, + txn: zeroFeeTxn, + err: ErrTxnViolatesSoftConstraint{fee.ErrTxnNoFee}, + inputs: spentInputs[:], + getArrayRet: inputs[:1], + }, + { + name: "transaction violate soft constraints, coin hour overflow", + signed: TxnSigned, + txn: coinHourOverflowTxn, + err: ErrTxnViolatesSoftConstraint{errors.New("Transaction output hours overflow")}, + inputs: spentInputs[:], + getArrayRet: inputs[:1], + }, + { + name: "transaction violate soft constraints, insufficient fee", + signed: TxnSigned, + txn: insufficientFeeTxn, + err: ErrTxnViolatesSoftConstraint{fee.ErrTxnInsufficientFee}, + inputs: spentInputs[:], + getArrayRet: inputs[:1], + }, + { + name: "transaction violate hard constraints, insufficient coins", + signed: TxnSigned, + txn: insufficientCoinsTxn, + err: ErrTxnViolatesHardConstraint{errors.New("Insufficient coins")}, + inputs: spentInputs[:], + getArrayRet: inputs[:1], + }, + { + name: "transaction violate hard constraints, bad signature", + signed: TxnSigned, + txn: badSigTxn, + err: ErrTxnViolatesHardConstraint{errors.New("Signature not valid for output being spent")}, + getArrayRet: inputs[:2], + inputs: badSigTxnSpentInputs[:], + }, + } + + signedOnlyCases := []testCase{ + { + name: "TxnSignedFlag=TxnSigned transaction violate hard constraints, fully unsigned", + signed: TxnSigned, + isUnsigned: true, + txn: fullyUnsignedTxn, + err: ErrTxnViolatesHardConstraint{errors.New("Unsigned input in transaction")}, + inputs: fullyUnsignedSpentInputs[:], + getArrayRet: inputs[:2], + }, + { + name: "TxnSignedFlag=TxnSigned transaction violate hard constraints, partially unsigned", + signed: TxnSigned, + isUnsigned: true, + txn: partiallyUnsignedTxn, + err: ErrTxnViolatesHardConstraint{errors.New("Unsigned input in transaction")}, + inputs: partiallyUnsignedSpentInputs[:], + getArrayRet: inputs[:2], + }, + { + name: "TxnSignedFlag=TxnSigned ok fully signed", + signed: TxnSigned, + txn: txn, + inputs: spentInputs, + getArrayRet: inputs[:1], + }, + } + + unsignedOnlyCases := []testCase{ + { + name: "TxnSignedFlag=TxnUnsigned ok, fully unsigned", + signed: TxnUnsigned, + isUnsigned: true, + txn: fullyUnsignedTxn, + inputs: fullyUnsignedSpentInputs, + getArrayRet: inputs[:2], + }, + { + name: "TxnSignedFlag=TxnUnsigned ok, partially unsigned", + signed: TxnUnsigned, + isUnsigned: true, + txn: partiallyUnsignedTxn, + inputs: partiallyUnsignedSpentInputs, + getArrayRet: inputs[:2], + }, + { + name: "TxnSignedFlag=TxnUnsigned transaction violate hard constraints: signed", + signed: TxnUnsigned, + txn: txn, + err: ErrTxnViolatesHardConstraint{errors.New("Unsigned transaction must contain a null signature")}, + inputs: spentInputs[:], + getArrayRet: inputs[:1], + }, + } + + cases := []testCase{} + + for _, tc := range baseCases { + c := tc + c.name = fmt.Sprintf("TxnSignedFlag=TxnSigned %s", tc.name) + c.signed = TxnSigned + cases = append(cases, c) + + c = tc + c.name = fmt.Sprintf("TxnSignedFlag=TxnUnsigned %s", tc.name) + c.signed = TxnUnsigned + c.txn.Sigs = make([]cipher.Sig, len(c.txn.Sigs)) + copy(c.txn.Sigs, tc.txn.Sigs) + c.txn.Sigs[0] = cipher.Sig{} + c.isUnsigned = true + cases = append(cases, c) + } + + cases = append(cases, signedOnlyCases...) + cases = append(cases, unsignedOnlyCases...) + + matchDBTx := mock.MatchedBy(func(tx *dbutil.Tx) bool { + return true + }) + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + db, shutdown := testutil.PrepareDB(t) + defer shutdown() + + history := &MockHistoryer{} + bc := &MockBlockchainer{} + unspent := &MockUnspentPooler{} + + bc.On("Unspent").Return(unspent) + bc.On("Head", matchDBTx).Return(&head, nil) + if tc.getHistoryTxnRet != nil { + bc.On("GetSignedBlockBySeq", matchDBTx, tc.getHistoryTxnRet.BlockSeq-1).Return(tc.getSignedBlocksBySeqRet, tc.getSignedBlocksBySeqErr) + } + + unspent.On("GetArray", matchDBTx, tc.txn.In).Return(tc.getArrayRet, tc.getArrayErr) + + history.On("GetTransaction", matchDBTx, tc.txn.Hash()).Return(tc.getHistoryTxnRet, tc.getHistoryTxnErr) + history.On("GetUxOuts", matchDBTx, tc.txn.In).Return(tc.getHistoryUxOutsRet, tc.getHistoryUxOutsErr) + + v := &Visor{ + blockchain: bc, + db: db, + history: history, + Config: Config{}, + } + + originalMaxUnconfirmedTxnSize := params.UserVerifyTxn.MaxTransactionSize + defer func() { + params.UserVerifyTxn.MaxTransactionSize = originalMaxUnconfirmedTxnSize + }() + + if tc.maxUserTransactionSize != 0 { + params.UserVerifyTxn.MaxTransactionSize = tc.maxUserTransactionSize + } + + var isConfirmed bool + var inputs []TransactionInput + err := v.db.View("VerifyTxnVerbose", func(tx *dbutil.Tx) error { + var err error + inputs, isConfirmed, err = v.VerifyTxnVerbose(&tc.txn, tc.signed) + return err + }) + + require.Equal(t, tc.isConfirmed, isConfirmed) + require.Equal(t, tc.inputs, inputs) + + require.Equal(t, tc.err, err, "%v != %v", tc.err, err) + + if tc.isUnsigned && tc.signed == TxnSigned { + require.Error(t, err) + } + + if !tc.isUnsigned && tc.signed == TxnUnsigned { + require.Error(t, err) + } + }) + } +} + +// historyerMock2 embeds historyerMock, and rewrite the ForEach method +type historyerMock2 struct { + MockHistoryer + txns []historydb.Transaction +} + +func newHistoryerMock2() *historyerMock2 { + return &historyerMock2{} +} + +func (h *historyerMock2) ForEachTxn(tx *dbutil.Tx, f func(cipher.SHA256, *historydb.Transaction) error) error { + for i := range h.txns { + if err := f(h.txns[i].Hash(), &h.txns[i]); err != nil { + return err + } + } + return nil +} + +// MockUnconfirmedTransactionPooler2 embeds UnconfirmedTxnPoolerMock, and rewrite the GetFiltered method +type MockUnconfirmedTransactionPooler2 struct { + MockUnconfirmedTransactionPooler + txns []UnconfirmedTransaction +} + +func NewUnconfirmedTransactionPoolerMock2() *MockUnconfirmedTransactionPooler2 { + return &MockUnconfirmedTransactionPooler2{} +} + +func (m *MockUnconfirmedTransactionPooler2) GetFiltered(tx *dbutil.Tx, f func(tx UnconfirmedTransaction) bool) ([]UnconfirmedTransaction, error) { + var txns []UnconfirmedTransaction + for i := range m.txns { + if f(m.txns[i]) { + txns = append(txns, m.txns[i]) + } + } + return txns, nil +} + +func TestFbyAddresses(t *testing.T) { + uxs := make(coin.UxArray, 5) + addrs := make([]cipher.Address, 5) + for i := 0; i < 5; i++ { + addrs[i] = testutil.MakeAddress() + uxs[i] = coin.UxOut{ + Body: coin.UxBody{ + Address: addrs[i], + }, + } + } + + tests := []struct { + name string + addrs []cipher.Address + outputs []coin.UxOut + want []coin.UxOut + }{ + { + "filter with one address", + []cipher.Address{addrs[0]}, + uxs[:2], + uxs[:1], + }, + { + "filter with multiple addresses", + []cipher.Address{addrs[0], addrs[1]}, + uxs[:3], + uxs[:2], + }, + } + for _, tt := range tests { + outs := FbyAddresses(tt.addrs)(tt.outputs) + require.Equal(t, outs, coin.UxArray(tt.want)) + } +} + +func TestFbyHashes(t *testing.T) { + uxs := make(coin.UxArray, 5) + addrs := make([]cipher.Address, 5) + for i := 0; i < 5; i++ { + addrs[i] = testutil.MakeAddress() + uxs[i] = coin.UxOut{ + Body: coin.UxBody{ + Address: addrs[i], + }, + } + } + + tests := []struct { + name string + hashes []cipher.SHA256 + outputs coin.UxArray + want coin.UxArray + }{ + { + "filter with one hash", + []cipher.SHA256{uxs[0].Hash()}, + uxs[:2], + uxs[:1], + }, + { + "filter with multiple hash", + []cipher.SHA256{uxs[0].Hash(), uxs[1].Hash()}, + uxs[:3], + uxs[:2], + }, + } + for _, tt := range tests { + outs := FbyHashes(tt.hashes)(tt.outputs) + require.Equal(t, outs, tt.want) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/visor_wallet.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/visor_wallet.go new file mode 100644 index 00000000..90394d35 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/visor_wallet.go @@ -0,0 +1,559 @@ +package visor + +// This file contains Visor method that require wallet access + +import ( + "errors" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/transaction" + "github.com/SkycoinProject/skycoin/src/util/mathutil" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" + "github.com/SkycoinProject/skycoin/src/wallet" +) + +// UserError wraps user input-related errors. +// Errors caused by programmer input or internal issues should not use this wrapper. +// Some knowledge of the HTTP API layer may be necessary to decide when to use UserError or not. +type UserError struct { + error +} + +// NewUserError creates an Error +func NewUserError(err error) error { + if err == nil { + return nil + } + return UserError{err} +} + +var ( + // ErrSpendingUnconfirmed is returned if caller attempts to spend unconfirmed outputs + ErrSpendingUnconfirmed = NewUserError(errors.New("Please spend after your pending transaction is confirmed")) + // ErrDuplicateUxOuts UxOuts contains duplicate values + ErrDuplicateUxOuts = NewUserError(errors.New("UxOuts contains duplicate values")) + // ErrIncludesNullAddress Addresses must not contain the null address + ErrIncludesNullAddress = NewUserError(errors.New("Addresses must not contain the null address")) + // ErrDuplicateAddresses Addresses contains duplicate values + ErrDuplicateAddresses = NewUserError(errors.New("Addresses contains duplicate values")) + // ErrCreateTransactionParamsConflict UxOuts and Addresses cannot be combined + ErrCreateTransactionParamsConflict = NewUserError(errors.New("UxOuts and Addresses cannot be combined")) + // ErrTransactionAlreadySigned attempted to sign a transaction that is already fully signed + ErrTransactionAlreadySigned = NewUserError(errors.New("Transaction is already fully signed")) + // ErrUxOutsOrAddressesRequired Both Addresses and UxOuts are empty + ErrUxOutsOrAddressesRequired = NewUserError(errors.New("UxOuts or Addresses must not be empty")) + // ErrNoSpendableOutputs after filtering unconfirmed spend outputs, there are no remaining outputs available for transaction creation + ErrNoSpendableOutputs = NewUserError(errors.New("All selected outputs are unavailable for spending")) +) + +// GetWalletBalance returns balance pairs of specific wallet +func (vs *Visor) GetWalletBalance(wltID string) (wallet.BalancePair, wallet.AddressBalances, error) { + var addressBalances wallet.AddressBalances + var walletBalance wallet.BalancePair + var addrsBalanceList []wallet.BalancePair + var addrs []cipher.Address + + if err := vs.wallets.View(wltID, func(w wallet.Wallet) error { + var err error + addrs, err = w.GetSkycoinAddresses() + if err != nil { + return err + } + + addrsBalanceList, err = vs.GetBalanceOfAddresses(addrs) + return err + }); err != nil { + return walletBalance, addressBalances, err + } + + // create map of address to balance + addressBalances = make(wallet.AddressBalances, len(addrs)) + for i, addr := range addrs { + addressBalances[addr.String()] = addrsBalanceList[i] + } + + // compute the sum of all addresses + for _, addrBalance := range addressBalances { + var err error + // compute confirmed balance + walletBalance.Confirmed.Coins, err = mathutil.AddUint64(walletBalance.Confirmed.Coins, addrBalance.Confirmed.Coins) + if err != nil { + return walletBalance, addressBalances, err + } + walletBalance.Confirmed.Hours, err = mathutil.AddUint64(walletBalance.Confirmed.Hours, addrBalance.Confirmed.Hours) + if err != nil { + return walletBalance, addressBalances, err + } + + // compute predicted balance + walletBalance.Predicted.Coins, err = mathutil.AddUint64(walletBalance.Predicted.Coins, addrBalance.Predicted.Coins) + if err != nil { + return walletBalance, addressBalances, err + } + walletBalance.Predicted.Hours, err = mathutil.AddUint64(walletBalance.Predicted.Hours, addrBalance.Predicted.Hours) + if err != nil { + return walletBalance, addressBalances, err + } + } + + return walletBalance, addressBalances, nil +} + +// GetWalletUnconfirmedTransactions returns all unconfirmed transactions in given wallet +func (vs *Visor) GetWalletUnconfirmedTransactions(wltID string) ([]UnconfirmedTransaction, error) { + var txns []UnconfirmedTransaction + + if err := vs.wallets.View(wltID, func(w wallet.Wallet) error { + addrs, err := w.GetSkycoinAddresses() + if err != nil { + return err + } + + txns, err = vs.GetUnconfirmedTransactions(SendsToAddresses(addrs)) + return err + }); err != nil { + return nil, err + } + + return txns, nil +} + +// GetWalletUnconfirmedTransactionsVerbose returns all unconfirmed transactions in given wallet +func (vs *Visor) GetWalletUnconfirmedTransactionsVerbose(wltID string) ([]UnconfirmedTransaction, [][]TransactionInput, error) { + var txns []UnconfirmedTransaction + var inputs [][]TransactionInput + + if err := vs.wallets.View(wltID, func(w wallet.Wallet) error { + addrs, err := w.GetSkycoinAddresses() + if err != nil { + return err + } + + txns, inputs, err = vs.GetUnconfirmedTransactionsVerbose(SendsToAddresses(addrs)) + return err + }); err != nil { + return nil, nil, err + } + + return txns, inputs, nil +} + +// WalletSignTransaction signs a transaction. Specific inputs may be signed by specifying signIndexes. +// If signIndexes is empty, all inputs will be signed. The transaction must be fully valid and spendable. +func (vs *Visor) WalletSignTransaction(wltID string, password []byte, txn *coin.Transaction, signIndexes []int) (*coin.Transaction, []TransactionInput, error) { + var inputs []TransactionInput + var signedTxn *coin.Transaction + + if txn.IsFullySigned() { + return nil, nil, ErrTransactionAlreadySigned + } + + if err := vs.wallets.ViewSecrets(wltID, password, func(w wallet.Wallet) error { + return vs.db.View("WalletSignTransaction", func(tx *dbutil.Tx) error { + // Verify the transaction before signing + if err := VerifySingleTxnUserConstraints(*txn); err != nil { + return err + } + if _, _, err := vs.blockchain.VerifySingleTxnSoftHardConstraints(tx, *txn, vs.Config.Distribution, params.UserVerifyTxn, TxnUnsigned); err != nil { + return err + } + + headTime, err := vs.blockchain.Time(tx) + if err != nil { + logger.WithError(err).Error("blockchain.Time failed") + return err + } + + inputs, err = vs.getTransactionInputs(tx, headTime, txn.In) + if err != nil { + return err + } + + uxOuts := make([]coin.UxOut, len(inputs)) + for i, in := range inputs { + uxOuts[i] = in.UxOut + } + + signedTxn, err = wallet.SignTransaction(w, txn, signIndexes, uxOuts) + if err != nil { + logger.WithError(err).Error("wallet.SignTransaction failed") + return err + } + + signed := TxnSigned + if !signedTxn.IsFullySigned() { + signed = TxnUnsigned + } + + if err := VerifySingleTxnUserConstraints(*signedTxn); err != nil { + // This shouldn't happen since we verified in the beginning; if it does, then wallet.SignTransaction has a bug + logger.Critical().WithError(err).Error("Signed transaction violates transaction user constraints") + return err + } + + if _, _, err := vs.blockchain.VerifySingleTxnSoftHardConstraints(tx, *signedTxn, vs.Config.Distribution, params.UserVerifyTxn, signed); err != nil { + // This shouldn't happen since we verified in the beginning; if it does, then wallet.SignTransaction has a bug + logger.Critical().WithError(err).Error("Signed transaction violates transaction constraints") + return err + } + + return nil + }) + }); err != nil { + return nil, nil, err + } + + return signedTxn, inputs, nil +} + +// CreateTransactionParams parameters for transaction creation +type CreateTransactionParams struct { + UxOuts []cipher.SHA256 + Addresses []cipher.Address + // IgnoreUnconfirmed if true, outputs matching Addresses or UxOuts spent by + // an unconfirmed transactions will be ignored, otherwise an error will be returned + IgnoreUnconfirmed bool +} + +// Validate validates params +func (p CreateTransactionParams) Validate() error { + if len(p.UxOuts) != 0 && len(p.Addresses) != 0 { + return ErrCreateTransactionParamsConflict + } + + // Check for duplicate addresses + addressMap := make(map[cipher.Address]struct{}, len(p.Addresses)) + for _, a := range p.Addresses { + if a.Null() { + return ErrIncludesNullAddress + } + + if _, ok := addressMap[a]; ok { + return ErrDuplicateAddresses + } + + addressMap[a] = struct{}{} + } + + // Check for duplicate spending uxouts + uxOuts := make(map[cipher.SHA256]struct{}, len(p.UxOuts)) + for _, o := range p.UxOuts { + if _, ok := uxOuts[o]; ok { + return ErrDuplicateUxOuts + } + uxOuts[o] = struct{}{} + } + + return nil +} + +// WalletCreateTransactionSigned creates a signed transaction based upon the parameters in CreateTransactionParams +func (vs *Visor) WalletCreateTransactionSigned(wltID string, password []byte, p transaction.Params, wp CreateTransactionParams) (*coin.Transaction, []TransactionInput, error) { + // Validate params before unlocking wallet + if err := p.Validate(); err != nil { + return nil, nil, err + } + if err := wp.Validate(); err != nil { + return nil, nil, err + } + + var txn *coin.Transaction + var inputs []TransactionInput + + if err := vs.wallets.UpdateSecrets(wltID, password, func(w wallet.Wallet) error { + var err error + txn, inputs, err = vs.walletCreateTransaction("WalletCreateTransactionSigned", w, p, wp, TxnSigned) + return err + }); err != nil { + return nil, nil, err + } + + return txn, inputs, nil +} + +// WalletCreateTransaction creates a transaction based upon the parameters in CreateTransactionParams +func (vs *Visor) WalletCreateTransaction(wltID string, p transaction.Params, wp CreateTransactionParams) (*coin.Transaction, []TransactionInput, error) { + // Validate params before opening wallet + if err := p.Validate(); err != nil { + return nil, nil, err + } + if err := wp.Validate(); err != nil { + return nil, nil, err + } + + var txn *coin.Transaction + var inputs []TransactionInput + + if err := vs.wallets.Update(wltID, func(w wallet.Wallet) error { + var err error + txn, inputs, err = vs.walletCreateTransaction("WalletCreateTransaction", w, p, wp, TxnUnsigned) + return err + }); err != nil { + return nil, nil, err + } + + return txn, inputs, nil +} + +func (vs *Visor) walletCreateTransaction(methodName string, w wallet.Wallet, p transaction.Params, wp CreateTransactionParams, signed TxnSignedFlag) (*coin.Transaction, []TransactionInput, error) { + if err := p.Validate(); err != nil { + return nil, nil, err + } + if err := wp.Validate(); err != nil { + return nil, nil, err + } + + // Get all addresses from the wallet for checking params against + walletAddresses, err := w.GetSkycoinAddresses() + if err != nil { + return nil, nil, err + } + + walletAddressesMap := make(map[cipher.Address]struct{}, len(walletAddresses)) + for _, a := range walletAddresses { + walletAddressesMap[a] = struct{}{} + } + + addrs := wp.Addresses + if len(addrs) == 0 { + // Use all wallet addresses if no addresses or uxouts specified + addrs = walletAddresses + } else { + // Check that requested addresses are in the wallet + for _, a := range addrs { + if _, ok := walletAddressesMap[a]; !ok { + return nil, nil, wallet.ErrUnknownAddress + } + } + } + + var txn *coin.Transaction + var uxb []transaction.UxBalance + + if err := vs.db.View(methodName, func(tx *dbutil.Tx) error { + var err error + txn, uxb, err = vs.walletCreateTransactionTx(tx, methodName, w, p, wp, signed, addrs, walletAddressesMap) + return err + }); err != nil { + return nil, nil, err + } + + inputs := NewTransactionInputsFromUxBalance(uxb) + + return txn, inputs, nil +} + +func (vs *Visor) walletCreateTransactionTx(tx *dbutil.Tx, methodName string, + w wallet.Wallet, p transaction.Params, wp CreateTransactionParams, signed TxnSignedFlag, + addrs []cipher.Address, walletAddressesMap map[cipher.Address]struct{}) (*coin.Transaction, []transaction.UxBalance, error) { + // Note: assumes inputs have already been validated by walletCreateTransaction + + head, err := vs.blockchain.Head(tx) + if err != nil { + logger.WithError(err).Error("blockchain.Head failed") + return nil, nil, err + } + + // Get mapping of addresses to uxOuts based upon CreateTransactionParams + var auxs coin.AddressUxOuts + if len(wp.UxOuts) != 0 { + var err error + auxs, err = vs.getCreateTransactionAuxsUxOut(tx, wp.UxOuts, wp.IgnoreUnconfirmed) + if err != nil { + return nil, nil, err + } + + // Check that UxOut addresses are in the wallet, + for a := range auxs { + if _, ok := walletAddressesMap[a]; !ok { + return nil, nil, wallet.ErrUnknownUxOut + } + } + } else { + var err error + auxs, err = vs.getCreateTransactionAuxsAddress(tx, addrs, wp.IgnoreUnconfirmed) + if err != nil { + return nil, nil, err + } + } + + // Create and sign transaction + var txn *coin.Transaction + var uxb []transaction.UxBalance + + switch signed { + case TxnSigned: + txn, uxb, err = wallet.CreateTransactionSigned(w, p, auxs, head.Time()) + case TxnUnsigned: + txn, uxb, err = wallet.CreateTransaction(w, p, auxs, head.Time()) + default: + logger.Panic("Invalid TxnSignedFlag") + } + if err != nil { + logger.Critical().WithError(err).Errorf("%s failed", methodName) + return nil, nil, err + } + + if err := VerifySingleTxnUserConstraints(*txn); err != nil { + logger.WithError(err).Error("Created transaction violates transaction user constraints") + return nil, nil, err + } + + // The wallet can create transactions that would not pass all validation, such as the decimal restriction, + // because the wallet is not aware of visor-level constraints. + // Check that the transaction is valid before returning it to the caller. + // TODO -- decimal restriction was moved to params/ package so the wallet can verify now. Move visor/verify to new package? + if _, _, err := vs.blockchain.VerifySingleTxnSoftHardConstraints(tx, *txn, vs.Config.Distribution, params.UserVerifyTxn, signed); err != nil { + logger.WithError(err).Error("Created transaction violates transaction soft/hard constraints") + return nil, nil, err + } + + return txn, uxb, nil +} + +// CreateTransaction creates an unsigned transaction from requested coin.UxOut hashes +func (vs *Visor) CreateTransaction(p transaction.Params, wp CreateTransactionParams) (*coin.Transaction, []TransactionInput, error) { + // Validate parameters before starting database transaction + if err := p.Validate(); err != nil { + return nil, nil, err + } + if err := wp.Validate(); err != nil { + return nil, nil, err + } + if len(wp.Addresses) == 0 && len(wp.UxOuts) == 0 { + return nil, nil, ErrUxOutsOrAddressesRequired + } + + var txn *coin.Transaction + var uxb []transaction.UxBalance + + if err := vs.db.View("CreateTransaction", func(tx *dbutil.Tx) error { + var err error + txn, uxb, err = vs.createTransactionTx(tx, p, wp) + return err + }); err != nil { + return nil, nil, err + } + + inputs := NewTransactionInputsFromUxBalance(uxb) + + return txn, inputs, nil +} + +func (vs *Visor) createTransactionTx(tx *dbutil.Tx, p transaction.Params, wp CreateTransactionParams) (*coin.Transaction, []transaction.UxBalance, error) { + // Note: assumes inputs have already been validated by walletCreateTransaction + head, err := vs.blockchain.Head(tx) + if err != nil { + logger.WithError(err).Error("blockchain.Head failed") + return nil, nil, err + } + + // Get mapping of addresses to uxOuts based upon CreateTransactionParams + var auxs coin.AddressUxOuts + if len(wp.UxOuts) != 0 { + auxs, err = vs.getCreateTransactionAuxsUxOut(tx, wp.UxOuts, wp.IgnoreUnconfirmed) + } else { + auxs, err = vs.getCreateTransactionAuxsAddress(tx, wp.Addresses, wp.IgnoreUnconfirmed) + } + if err != nil { + return nil, nil, err + } + + txn, uxb, err := transaction.Create(p, auxs, head.Time()) + if err != nil { + return nil, nil, err + } + + if err := VerifySingleTxnUserConstraints(*txn); err != nil { + logger.WithError(err).Error("Created transaction violates transaction user constraints") + return nil, nil, err + } + + // The wallet can create transactions that would not pass all validation, such as the decimal restriction, + // because the wallet is not aware of visor-level constraints. + // Check that the transaction is valid before returning it to the caller. + // TODO -- decimal restriction was moved to params/ package so the wallet can verify now. Move visor/verify to new package? + if _, _, err := vs.blockchain.VerifySingleTxnSoftHardConstraints(tx, *txn, vs.Config.Distribution, params.UserVerifyTxn, TxnUnsigned); err != nil { + logger.WithError(err).Error("Created transaction violates transaction soft/hard constraints") + return nil, nil, err + } + + return txn, uxb, nil +} + +// getCreateTransactionAuxsUxOut returns a map of addresses to their unspent outputs, +// given a list of unspent output hashes. +// If ignoreUnconfirmed is true, outputs being spent by unconfirmed transactions are ignored and excluded from the return value. +// If ignoreUnconfirmed is false, an error is return if any of the specified unspent outputs are spent by an unconfirmed transaction. +func (vs *Visor) getCreateTransactionAuxsUxOut(tx *dbutil.Tx, uxOutHashes []cipher.SHA256, ignoreUnconfirmed bool) (coin.AddressUxOuts, error) { + hashesMap := make(map[cipher.SHA256]struct{}, len(uxOutHashes)) + for _, h := range uxOutHashes { + hashesMap[h] = struct{}{} + } + + // Check if any of the outputs are spent by an unconfirmed transaction + unconfirmedHashesMap := make(map[cipher.SHA256]struct{}) + if err := vs.unconfirmed.ForEach(tx, func(_ cipher.SHA256, txn UnconfirmedTransaction) error { + for _, h := range txn.Transaction.In { + if _, ok := hashesMap[h]; ok { + if !ignoreUnconfirmed { + return ErrSpendingUnconfirmed + } + unconfirmedHashesMap[h] = struct{}{} + } + } + return nil + }); err != nil { + return nil, err + } + + if !ignoreUnconfirmed && len(unconfirmedHashesMap) != 0 { + logger.Panic("ignoreUnconfirmed is false but unconfirmedHashesMap is not empty") + } + + // Filter unconfirmed spends + if len(unconfirmedHashesMap) != 0 { + filteredUxOutHashes := uxOutHashes[:0] + for _, h := range uxOutHashes { + if _, ok := unconfirmedHashesMap[h]; ok { + delete(hashesMap, h) + } else { + filteredUxOutHashes = append(filteredUxOutHashes, h) + } + } + uxOutHashes = filteredUxOutHashes + } + + if len(uxOutHashes) == 0 { + return nil, ErrNoSpendableOutputs + } + + // Retrieve the uxouts from the pool. + // An error is returned if any do not exist + uxOuts, err := vs.blockchain.Unspent().GetArray(tx, uxOutHashes) + if err != nil { + return nil, err + } + + // Build coin.AddressUxOuts map + return coin.NewAddressUxOuts(coin.UxArray(uxOuts)), nil +} + +// getCreateTransactionAuxsAddress returns a map of the addresses to their unspent outputs, +// filtering or erroring on unconfirmed outputs depending on the value of ignoreUnconfirmed +func (vs *Visor) getCreateTransactionAuxsAddress(tx *dbutil.Tx, addrs []cipher.Address, ignoreUnconfirmed bool) (coin.AddressUxOuts, error) { + // Get all address unspent hashes + addrHashes, err := vs.blockchain.Unspent().GetUnspentHashesOfAddrs(tx, addrs) + if err != nil { + return nil, err + } + + hashes := addrHashes.Flatten() + if len(hashes) == 0 { + return nil, transaction.ErrNoUnspents + } + + return vs.getCreateTransactionAuxsUxOut(tx, hashes, ignoreUnconfirmed) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/visor/visor_wallet_test.go b/vendor/github.com/SkycoinProject/skycoin/src/visor/visor_wallet_test.go new file mode 100644 index 00000000..59183326 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/visor/visor_wallet_test.go @@ -0,0 +1,1626 @@ +package visor + +import ( + "bytes" + "errors" + "fmt" + "io/ioutil" + "reflect" + "sort" + "testing" + "time" + + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/params" + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/transaction" + "github.com/SkycoinProject/skycoin/src/visor/blockdb" + "github.com/SkycoinProject/skycoin/src/visor/dbutil" + "github.com/SkycoinProject/skycoin/src/wallet" +) + +func TestCreateTransaction(t *testing.T) { + addrs := make([]cipher.Address, 3) + for i := range addrs { + addrs[i] = testutil.MakeAddress() + } + + uxOuts := make([]cipher.SHA256, 3) + for i := range uxOuts { + uxOuts[i] = testutil.RandSHA256(t) + } + + validCreateTxnParams := CreateTransactionParams{ + Addresses: addrs, + } + + validParams := transaction.Params{ + HoursSelection: transaction.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: testutil.MakeAddress(), + Coins: 1e6, + Hours: 7, + }, + }, + } + + insufficientBalanceParams := transaction.Params{ + HoursSelection: transaction.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: testutil.MakeAddress(), + Coins: 2e6, + Hours: 7, + }, + }, + } + + invalidParams := transaction.Params{ + HoursSelection: transaction.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: cipher.Address{}, // null address violates user constraints + Coins: 1e6, + Hours: 7, + }, + }, + } + + getArrayRet := coin.UxArray{ + { + Head: coin.UxHead{ + Time: uint64(time.Now().Unix()) - 3700, + BkSeq: 100, + }, + Body: coin.UxBody{ + SrcTransaction: testutil.RandSHA256(t), + Address: addrs[1], + Coins: 1e6, + Hours: 100, + }, + }, + } + uxOuts[1] = getArrayRet[0].Hash() + + inputs := []TransactionInput{ + { + UxOut: getArrayRet[0], + CalculatedHours: getArrayRet[0].Body.Hours + 1, + }, + } + + txn := &coin.Transaction{ + Length: 183, + Type: 0, + Sigs: make([]cipher.Sig, 1), + In: []cipher.SHA256{getArrayRet[0].Hash()}, + Out: validParams.To, + } + err := txn.UpdateHeader() + require.NoError(t, err) + + invalidParamsTxn := &coin.Transaction{ + Length: 183, + Type: 0, + Sigs: make([]cipher.Sig, 1), + In: []cipher.SHA256{getArrayRet[0].Hash()}, + Out: invalidParams.To, + } + err = invalidParamsTxn.UpdateHeader() + require.NoError(t, err) + + headBlock := &coin.SignedBlock{ + Block: coin.Block{ + Head: coin.BlockHeader{ + Time: uint64(time.Now().Unix()), + }, + }, + } + + cases := []struct { + name string + txn *coin.Transaction + inputs []TransactionInput + p transaction.Params + wp CreateTransactionParams + err error + + blockchainHead *coin.SignedBlock + blockchainHeadErr error + + unconfirmedTxns []coin.Transaction + uxOuts []cipher.SHA256 + forEachErr error + + getArrayInputs []cipher.SHA256 + getArray coin.UxArray + getArrayErr error + + getUnspentHashesOfAddrs blockdb.AddressHashes + getUnspentHashesOfAddrsErr error + + verifyErr error + }{ + { + name: "Blockchain.Head failed", + p: validParams, + wp: validCreateTxnParams, + blockchainHeadErr: errors.New("failure"), + err: errors.New("failure"), + }, + + { + name: "GetUnspentHashesOfAddrs failed", + p: validParams, + wp: validCreateTxnParams, + getUnspentHashesOfAddrsErr: errors.New("failure"), + err: errors.New("failure"), + }, + + { + name: "no unspents found for addresses", + p: validParams, + wp: validCreateTxnParams, + getUnspentHashesOfAddrs: nil, + err: transaction.ErrNoUnspents, + }, + + { + name: "Unconfirmed.ForEach failed", + p: validParams, + wp: validCreateTxnParams, + getUnspentHashesOfAddrs: blockdb.AddressHashes{ + addrs[1]: uxOuts, + }, + forEachErr: errors.New("failure"), + err: errors.New("failure"), + }, + + { + name: "Unspent.GetArray failed", + p: validParams, + wp: CreateTransactionParams{ + UxOuts: uxOuts, + }, + getArrayInputs: uxOuts, + getArrayErr: errors.New("failure"), + err: errors.New("failure"), + }, + + { + name: "insufficient balance", + p: insufficientBalanceParams, + wp: CreateTransactionParams{ + UxOuts: uxOuts, + }, + blockchainHead: headBlock, + getArrayInputs: uxOuts, + getArray: getArrayRet, + err: transaction.ErrInsufficientBalance, + }, + + { + name: "invalid params for transaction.Create, uxouts", + p: invalidParams, + wp: CreateTransactionParams{ + UxOuts: uxOuts, + }, + blockchainHead: headBlock, + getArrayInputs: uxOuts, + getArray: getArrayRet, + txn: invalidParamsTxn, + inputs: inputs, + err: transaction.ErrNullAddressReceiver, + }, + + { + name: "blockchain verify error, uxouts", + p: validParams, + wp: CreateTransactionParams{ + UxOuts: uxOuts, + }, + blockchainHead: headBlock, + getArrayInputs: uxOuts, + getArray: getArrayRet, + txn: txn, + inputs: inputs, + verifyErr: NewErrTxnViolatesSoftConstraint(errors.New("Violates soft constraints")), + err: NewErrTxnViolatesSoftConstraint(errors.New("Violates soft constraints")), + }, + + { + name: "bad transaction.Params", + p: transaction.Params{}, + err: transaction.ErrMissingReceivers, + }, + + { + name: "bad CreateTransactionParams", + p: validParams, + wp: CreateTransactionParams{ + Addresses: []cipher.Address{testutil.MakeAddress()}, + UxOuts: []cipher.SHA256{testutil.RandSHA256(t)}, + }, + err: ErrCreateTransactionParamsConflict, + }, + + { + name: "Addresses and UxOuts both empty", + p: validParams, + err: ErrUxOutsOrAddressesRequired, + }, + + { + name: "ok, addresses", + p: validParams, + wp: CreateTransactionParams{ + Addresses: addrs, + }, + blockchainHead: headBlock, + getUnspentHashesOfAddrs: blockdb.AddressHashes{ + addrs[1]: uxOuts, + }, + getArrayInputs: uxOuts, + getArray: getArrayRet, + txn: txn, + inputs: inputs, + }, + + { + name: "ok, uxouts", + p: validParams, + wp: CreateTransactionParams{ + UxOuts: uxOuts, + }, + blockchainHead: headBlock, + getArrayInputs: uxOuts, + getArray: getArrayRet, + txn: txn, + inputs: inputs, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + b := &MockBlockchainer{} + ut := &MockUnconfirmedTransactionPooler{} + up := &MockUnspentPooler{} + + b.On("Head", matchDBTx).Return(tc.blockchainHead, tc.blockchainHeadErr) + up.On("GetUnspentHashesOfAddrs", matchDBTx, tc.wp.Addresses).Return(tc.getUnspentHashesOfAddrs, tc.getUnspentHashesOfAddrsErr) + + ut.On("ForEach", matchDBTx, mock.MatchedBy(func(f func(cipher.SHA256, UnconfirmedTransaction) error) bool { + return true + })).Return(tc.forEachErr).Run(unconfirmedForEachMockRun(t, tc.unconfirmedTxns, tc.uxOuts, tc.wp.IgnoreUnconfirmed)) + + up.On("GetArray", matchDBTx, mock.MatchedBy(matchUxOutsAnyOrder(tc.getArrayInputs))).Return(tc.getArray, tc.getArrayErr) + b.On("Unspent").Return(up) + + if tc.txn != nil { + b.On("VerifySingleTxnSoftHardConstraints", matchDBTx, *tc.txn, params.MainNetDistribution, params.UserVerifyTxn, TxnUnsigned).Return(nil, nil, tc.verifyErr) + } + + db, shutdown := prepareDB(t) + defer shutdown() + + v := &Visor{ + db: db, + blockchain: b, + unconfirmed: ut, + Config: Config{ + Distribution: params.MainNetDistribution, + }, + } + + txn, inputs, err := v.CreateTransaction(tc.p, tc.wp) + require.Equal(t, tc.err, err) + if tc.err != nil { + return + } + + require.Equal(t, tc.txn, txn) + require.Equal(t, tc.inputs, inputs) + }) + } +} + +func prepareWltDir() string { + dir, err := ioutil.TempDir("", "wallets") + if err != nil { + panic(err) + } + + return dir +} + +func makeEntries(n int) ([]wallet.Entry, []cipher.Address) { + addrs := make([]cipher.Address, n) + entries := make([]wallet.Entry, n) + for i := range addrs { + p, s := cipher.GenerateKeyPair() + a := cipher.AddressFromPubKey(p) + entries[i] = wallet.Entry{ + Address: a, + Public: p, + Secret: s, + } + addrs[i] = a + } + return entries, addrs +} + +func TestWalletCreateTransaction(t *testing.T) { + // Create arbitrary entries for a "collection" wallet + entries, addrs := makeEntries(3) + + // Load the 5th through 8th entries for a known bip44 wallet. + // These entries will be used for the test data. + bip44Seed := "voyage say extend find sheriff surge priority merit ignore maple cash argue" + w, err := wallet.NewWallet("bip44.wlt", wallet.Options{ + Type: wallet.WalletTypeBip44, + GenerateN: 8, + Seed: bip44Seed, + }) + require.NoError(t, err) + bip44Entries := w.GetEntries()[5:8] + require.Len(t, bip44Entries, 3) + bip44Addrs, err := w.GetSkycoinAddresses() + require.NoError(t, err) + bip44Addrs = bip44Addrs[5:8] + require.Len(t, bip44Addrs, 3) + + uxOuts := make([]cipher.SHA256, 3) + for i := range uxOuts { + uxOuts[i] = testutil.RandSHA256(t) + } + + bip44UxOuts := make([]cipher.SHA256, 3) + for i := range bip44UxOuts { + bip44UxOuts[i] = testutil.RandSHA256(t) + } + + validParams := transaction.Params{ + HoursSelection: transaction.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: testutil.MakeAddress(), + Coins: 1e6, + Hours: 7, + }, + }, + } + + insufficientBalanceParams := transaction.Params{ + HoursSelection: transaction.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: testutil.MakeAddress(), + Coins: 2e6, + Hours: 7, + }, + }, + } + + invalidParams := transaction.Params{ + HoursSelection: transaction.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: cipher.Address{}, // null address violates user constraints + Coins: 1e6, + Hours: 7, + }, + }, + } + + getArrayRet := coin.UxArray{ + { + Head: coin.UxHead{ + Time: uint64(time.Now().Unix()) - 3700, + BkSeq: 100, + }, + Body: coin.UxBody{ + SrcTransaction: testutil.RandSHA256(t), + Address: addrs[1], + Coins: 1e6, + Hours: 100, + }, + }, + } + uxOuts[1] = getArrayRet[0].Hash() + + unknownUxOutGetArrayRet := append(getArrayRet, coin.UxOut{ + Head: coin.UxHead{ + Time: uint64(time.Now().Unix()) - 3700, + BkSeq: 100, + }, + Body: coin.UxBody{ + SrcTransaction: testutil.RandSHA256(t), + Address: testutil.MakeAddress(), + Coins: 1e6, + Hours: 100, + }, + }) + + inputs := []TransactionInput{ + { + UxOut: getArrayRet[0], + CalculatedHours: getArrayRet[0].Body.Hours + 1, + }, + } + + txn := &coin.Transaction{ + Length: 183, + Type: 0, + Sigs: make([]cipher.Sig, 1), + In: []cipher.SHA256{getArrayRet[0].Hash()}, + Out: validParams.To, + } + err = txn.UpdateHeader() + require.NoError(t, err) + + invalidParamsTxn := &coin.Transaction{ + Length: 183, + Type: 0, + Sigs: make([]cipher.Sig, 1), + In: []cipher.SHA256{getArrayRet[0].Hash()}, + Out: invalidParams.To, + } + err = invalidParamsTxn.UpdateHeader() + require.NoError(t, err) + + bip44GetArrayRet := coin.UxArray{ + { + Head: coin.UxHead{ + Time: uint64(time.Now().Unix()) - 3700, + BkSeq: 100, + }, + Body: coin.UxBody{ + SrcTransaction: testutil.RandSHA256(t), + Address: bip44Addrs[1], + Coins: 1e6, + Hours: 100, + }, + }, + } + bip44UxOuts[1] = bip44GetArrayRet[0].Hash() + + bip44UnknownUxOutGetArrayRet := append(bip44GetArrayRet, coin.UxOut{ + Head: coin.UxHead{ + Time: uint64(time.Now().Unix()) - 3700, + BkSeq: 100, + }, + Body: coin.UxBody{ + SrcTransaction: testutil.RandSHA256(t), + Address: testutil.MakeAddress(), + Coins: 1e6, + Hours: 100, + }, + }) + + bip44Inputs := []TransactionInput{ + { + UxOut: bip44GetArrayRet[0], + CalculatedHours: bip44GetArrayRet[0].Body.Hours + 1, + }, + } + + bip44Txn := &coin.Transaction{ + Length: 183, + Type: 0, + Sigs: make([]cipher.Sig, 1), + In: []cipher.SHA256{bip44GetArrayRet[0].Hash()}, + Out: validParams.To, + } + err = bip44Txn.UpdateHeader() + require.NoError(t, err) + + bip44InvalidParamsTxn := &coin.Transaction{ + Length: 183, + Type: 0, + Sigs: make([]cipher.Sig, 1), + In: []cipher.SHA256{bip44GetArrayRet[0].Hash()}, + Out: invalidParams.To, + } + err = invalidParamsTxn.UpdateHeader() + require.NoError(t, err) + + headBlock := &coin.SignedBlock{ + Block: coin.Block{ + Head: coin.BlockHeader{ + Time: uint64(time.Now().Unix()), + }, + }, + } + + type testCase struct { + name string + txn *coin.Transaction + inputs []TransactionInput + p transaction.Params + wp CreateTransactionParams + signed TxnSignedFlag + walletID string + walletType string + seed string + password []byte + err error + + blockchainHead *coin.SignedBlock + blockchainHeadErr error + + unconfirmedTxns []coin.Transaction + uxOuts []cipher.SHA256 + forEachErr error + + getArrayInputs []cipher.SHA256 + getArray coin.UxArray + getArrayErr error + + getUnspentHashesOfAddrs blockdb.AddressHashes + getUnspentHashesOfAddrsErr error + + verifyErr error + } + + baseCases := []testCase{ + { + name: "all wallet addresses", + p: validParams, + wp: CreateTransactionParams{}, + walletID: "foo.wlt", + walletType: wallet.WalletTypeCollection, + blockchainHead: headBlock, + getUnspentHashesOfAddrs: blockdb.AddressHashes{ + addrs[1]: uxOuts, + }, + getArrayInputs: uxOuts, + getArray: getArrayRet, + txn: txn, + inputs: inputs, + }, + + { + name: "specific wallet addresses", + p: validParams, + wp: CreateTransactionParams{ + Addresses: addrs, + }, + walletID: "foo.wlt", + walletType: wallet.WalletTypeCollection, + blockchainHead: headBlock, + getUnspentHashesOfAddrs: blockdb.AddressHashes{ + addrs[1]: uxOuts, + }, + getArrayInputs: uxOuts, + getArray: getArrayRet, + txn: txn, + inputs: inputs, + }, + + { + name: "specific uxouts", + p: validParams, + wp: CreateTransactionParams{ + UxOuts: uxOuts, + }, + walletID: "foo.wlt", + walletType: wallet.WalletTypeCollection, + blockchainHead: headBlock, + getArrayInputs: uxOuts, + getArray: getArrayRet, + txn: txn, + inputs: inputs, + }, + + { + name: "unknown wallet address", + p: validParams, + wp: CreateTransactionParams{ + Addresses: append(addrs, testutil.MakeAddress()), + }, + walletID: "foo.wlt", + walletType: wallet.WalletTypeCollection, + blockchainHead: headBlock, + getUnspentHashesOfAddrs: blockdb.AddressHashes{ + addrs[1]: uxOuts, + }, + getArrayInputs: uxOuts, + getArray: getArrayRet, + err: wallet.ErrUnknownAddress, + }, + + { + name: "unknown wallet uxouts", + p: validParams, + wp: CreateTransactionParams{ + UxOuts: uxOuts, + }, + walletID: "foo.wlt", + walletType: wallet.WalletTypeCollection, + blockchainHead: headBlock, + getArrayInputs: uxOuts, + getArray: unknownUxOutGetArrayRet, + err: wallet.ErrUnknownUxOut, + }, + + { + name: "insufficient balance", + p: insufficientBalanceParams, + wp: CreateTransactionParams{ + UxOuts: uxOuts, + }, + walletID: "foo.wlt", + walletType: wallet.WalletTypeCollection, + blockchainHead: headBlock, + getArrayInputs: uxOuts, + getArray: getArrayRet, + err: transaction.ErrInsufficientBalance, + }, + + { + name: "invalid params for transaction.Create, uxouts", + p: invalidParams, + wp: CreateTransactionParams{ + UxOuts: uxOuts, + }, + walletID: "foo.wlt", + walletType: wallet.WalletTypeCollection, + blockchainHead: headBlock, + getArrayInputs: uxOuts, + getArray: getArrayRet, + txn: invalidParamsTxn, + inputs: inputs, + err: transaction.ErrNullAddressReceiver, + }, + + { + name: "Blockchain.Head failed", + p: validParams, + walletID: "foo.wlt", + walletType: wallet.WalletTypeCollection, + blockchainHeadErr: errors.New("failure"), + err: errors.New("failure"), + }, + + { + name: "blockchain verify error, uxouts", + p: validParams, + wp: CreateTransactionParams{ + UxOuts: uxOuts, + }, + walletID: "foo.wlt", + walletType: wallet.WalletTypeCollection, + blockchainHead: headBlock, + getArrayInputs: uxOuts, + getArray: getArrayRet, + txn: txn, + inputs: inputs, + verifyErr: NewErrTxnViolatesSoftConstraint(errors.New("Violates soft constraints")), + err: NewErrTxnViolatesSoftConstraint(errors.New("Violates soft constraints")), + }, + + { + name: "all wallet addresses bip44 wallet", + p: validParams, + wp: CreateTransactionParams{}, + walletID: "foo.wlt", + walletType: wallet.WalletTypeBip44, + seed: bip44Seed, + blockchainHead: headBlock, + getUnspentHashesOfAddrs: blockdb.AddressHashes{ + bip44Addrs[1]: bip44UxOuts, + }, + getArrayInputs: bip44UxOuts, + getArray: bip44GetArrayRet, + txn: bip44Txn, + inputs: bip44Inputs, + }, + + { + name: "specific wallet addresses bip44 wallet", + p: validParams, + wp: CreateTransactionParams{ + Addresses: bip44Addrs, + }, + walletID: "foo.wlt", + walletType: wallet.WalletTypeBip44, + seed: bip44Seed, + blockchainHead: headBlock, + getUnspentHashesOfAddrs: blockdb.AddressHashes{ + bip44Addrs[1]: bip44UxOuts, + }, + getArrayInputs: bip44UxOuts, + getArray: bip44GetArrayRet, + txn: bip44Txn, + inputs: bip44Inputs, + }, + + { + name: "specific uxouts bip44 wallet", + p: validParams, + wp: CreateTransactionParams{ + UxOuts: bip44UxOuts, + }, + walletID: "foo.wlt", + walletType: wallet.WalletTypeBip44, + seed: bip44Seed, + blockchainHead: headBlock, + getArrayInputs: bip44UxOuts, + getArray: bip44GetArrayRet, + txn: bip44Txn, + inputs: bip44Inputs, + }, + + { + name: "unknown wallet address bip44 wallet", + p: validParams, + wp: CreateTransactionParams{ + Addresses: append(bip44Addrs, testutil.MakeAddress()), + }, + walletID: "foo.wlt", + walletType: wallet.WalletTypeBip44, + seed: bip44Seed, + blockchainHead: headBlock, + getUnspentHashesOfAddrs: blockdb.AddressHashes{ + bip44Addrs[1]: bip44UxOuts, + }, + getArrayInputs: bip44UxOuts, + getArray: bip44GetArrayRet, + err: wallet.ErrUnknownAddress, + }, + + { + name: "unknown wallet uxouts bip44 wallet", + p: validParams, + wp: CreateTransactionParams{ + UxOuts: bip44UxOuts, + }, + walletID: "foo.wlt", + walletType: wallet.WalletTypeBip44, + seed: bip44Seed, + blockchainHead: headBlock, + getArrayInputs: bip44UxOuts, + getArray: bip44UnknownUxOutGetArrayRet, + err: wallet.ErrUnknownUxOut, + }, + + { + name: "insufficient balance bip44 wallet", + p: insufficientBalanceParams, + wp: CreateTransactionParams{ + UxOuts: bip44UxOuts, + }, + walletID: "foo.wlt", + walletType: wallet.WalletTypeBip44, + seed: bip44Seed, + blockchainHead: headBlock, + getArrayInputs: bip44UxOuts, + getArray: bip44GetArrayRet, + err: transaction.ErrInsufficientBalance, + }, + + { + name: "invalid params for transaction.Create, uxouts bip44 wallet", + p: invalidParams, + wp: CreateTransactionParams{ + UxOuts: bip44UxOuts, + }, + walletID: "foo.wlt", + walletType: wallet.WalletTypeBip44, + seed: bip44Seed, + blockchainHead: headBlock, + getArrayInputs: bip44UxOuts, + getArray: bip44GetArrayRet, + txn: bip44InvalidParamsTxn, + inputs: bip44Inputs, + err: transaction.ErrNullAddressReceiver, + }, + + { + name: "Blockchain.Head failed bip44 wallet", + p: validParams, + walletID: "foo.wlt", + walletType: wallet.WalletTypeBip44, + seed: bip44Seed, + blockchainHeadErr: errors.New("failure"), + err: errors.New("failure"), + }, + + { + name: "blockchain verify error, uxouts bip44 wallet", + p: validParams, + wp: CreateTransactionParams{ + UxOuts: bip44UxOuts, + }, + walletID: "foo.wlt", + walletType: wallet.WalletTypeBip44, + seed: bip44Seed, + blockchainHead: headBlock, + getArrayInputs: bip44UxOuts, + getArray: bip44GetArrayRet, + txn: bip44Txn, + inputs: bip44Inputs, + verifyErr: NewErrTxnViolatesSoftConstraint(errors.New("Violates soft constraints")), + err: NewErrTxnViolatesSoftConstraint(errors.New("Violates soft constraints")), + }, + } + + cases := make([]testCase, len(baseCases)*2) + copy(cases, baseCases) + copy(cases[len(baseCases):], baseCases) + for i := range cases[:len(baseCases)] { + cases[i].signed = TxnUnsigned + cases[i].password = nil + } + for i := range cases[len(baseCases):] { + cases[i+len(baseCases)].signed = TxnSigned + cases[i+len(baseCases)].password = []byte("foo") + } + + for _, tc := range cases { + name := fmt.Sprintf("signed-flag=%d %s", tc.signed, tc.name) + t.Run(name, func(t *testing.T) { + require.NotEmpty(t, tc.walletID) + + ws, err := wallet.NewService(wallet.Config{ + EnableWalletAPI: true, + CryptoType: wallet.CryptoTypeScryptChacha20poly1305Insecure, + WalletDir: prepareWltDir(), + }) + require.NoError(t, err) + + generateN := uint64(0) + if tc.walletType == wallet.WalletTypeBip44 { + // Generate 8 addresses, the last 3 were used in the test data above + generateN = 8 + } + + _, err = ws.CreateWallet(tc.walletID, wallet.Options{ + Coin: wallet.CoinTypeSkycoin, + Encrypt: len(tc.password) != 0, + Password: tc.password, + CryptoType: wallet.CryptoTypeScryptChacha20poly1305Insecure, + Type: tc.walletType, + GenerateN: generateN, + Seed: tc.seed, + }, nil) + require.NoError(t, err) + + err = ws.UpdateSecrets(tc.walletID, tc.password, func(w wallet.Wallet) error { + switch w.Type() { + case wallet.WalletTypeCollection: + // Add 5 unused entries into the wallet, in addition to the 3 above + uniqueEntries, _ := makeEntries(5) + for _, e := range append(uniqueEntries, entries...) { + err := w.(*wallet.CollectionWallet).AddEntry(e) + require.NoError(t, err) + } + } + return nil + }) + require.NoError(t, err) + + walletAddrs, err := ws.GetSkycoinAddresses(tc.walletID) + require.NoError(t, err) + + b := &MockBlockchainer{} + ut := &MockUnconfirmedTransactionPooler{} + up := &MockUnspentPooler{} + + addrs := walletAddrs + if len(tc.wp.Addresses) != 0 { + addrs = tc.wp.Addresses + } + + b.On("Head", matchDBTx).Return(tc.blockchainHead, tc.blockchainHeadErr) + up.On("GetUnspentHashesOfAddrs", matchDBTx, addrs).Return(tc.getUnspentHashesOfAddrs, tc.getUnspentHashesOfAddrsErr) + + ut.On("ForEach", matchDBTx, mock.MatchedBy(func(f func(cipher.SHA256, UnconfirmedTransaction) error) bool { + return true + })).Return(tc.forEachErr).Run(unconfirmedForEachMockRun(t, tc.unconfirmedTxns, tc.uxOuts, tc.wp.IgnoreUnconfirmed)) + + up.On("GetArray", matchDBTx, mock.MatchedBy(matchUxOutsAnyOrder(tc.getArrayInputs))).Return(tc.getArray, tc.getArrayErr) + b.On("Unspent").Return(up) + + matchTxnIgnoreSigs := mock.MatchedBy(func(txn coin.Transaction) bool { + switch tc.signed { + case TxnSigned: + if !txn.IsFullySigned() { + return false + } + // Unset sigs for comparison to the unsigned txn + txn.Sigs = make([]cipher.Sig, len(txn.Sigs)) + return reflect.DeepEqual(txn, *tc.txn) + case TxnUnsigned: + return reflect.DeepEqual(txn, *tc.txn) + default: + return false + } + }) + + if tc.txn != nil { + b.On("VerifySingleTxnSoftHardConstraints", matchDBTx, matchTxnIgnoreSigs, params.MainNetDistribution, params.UserVerifyTxn, tc.signed).Return(nil, nil, tc.verifyErr) + } + + db, shutdown := prepareDB(t) + defer shutdown() + + v := &Visor{ + db: db, + blockchain: b, + unconfirmed: ut, + wallets: ws, + Config: Config{ + Distribution: params.MainNetDistribution, + }, + } + + var txn *coin.Transaction + var inputs []TransactionInput + switch tc.signed { + case TxnSigned: + txn, inputs, err = v.WalletCreateTransactionSigned(tc.walletID, tc.password, tc.p, tc.wp) + case TxnUnsigned: + txn, inputs, err = v.WalletCreateTransaction(tc.walletID, tc.p, tc.wp) + default: + t.Fatal("invalid tc.signed value") + } + require.Equal(t, tc.err, err, "%v != %v", tc.err, err) + if tc.err != nil { + return + } + + if tc.signed == TxnSigned { + require.True(t, txn.IsFullySigned()) + // Unset sigs for comparison to the unsigned transaction + txn.Sigs = make([]cipher.Sig, len(txn.Sigs)) + } + + require.Equal(t, tc.txn, txn) + require.Equal(t, tc.inputs, inputs) + }) + } +} + +func TestCreateTransactionParamsValidate(t *testing.T) { + var nullAddress cipher.Address + addr := testutil.MakeAddress() + hash := testutil.RandSHA256(t) + + cases := []struct { + name string + p CreateTransactionParams + err error + }{ + { + name: "both addrs and uxouts specified", + p: CreateTransactionParams{ + Addresses: []cipher.Address{addr}, + UxOuts: []cipher.SHA256{hash}, + }, + err: ErrCreateTransactionParamsConflict, + }, + + { + name: "null address in addrs", + p: CreateTransactionParams{ + Addresses: []cipher.Address{nullAddress}, + }, + err: ErrIncludesNullAddress, + }, + + { + name: "duplicate address in addrs", + p: CreateTransactionParams{ + Addresses: []cipher.Address{addr, addr}, + }, + err: ErrDuplicateAddresses, + }, + + { + name: "duplicate hash in uxouts", + p: CreateTransactionParams{ + UxOuts: []cipher.SHA256{hash, hash}, + }, + err: ErrDuplicateUxOuts, + }, + + { + name: "ok, addrs specified", + p: CreateTransactionParams{ + Addresses: []cipher.Address{addr}, + }, + }, + + { + name: "ok, uxouts specified", + p: CreateTransactionParams{ + UxOuts: []cipher.SHA256{hash}, + }, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + err := tc.p.Validate() + require.Equal(t, tc.err, err, "%v != %v", tc.err, err) + }) + } +} + +func TestWalletCreateTransactionValidation(t *testing.T) { + // This only tests that WalletCreateTransaction and WalletCreateTransactionSigned fails on invalid inputs; + // success tests are performed by live integration tests + + validParams := transaction.Params{ + HoursSelection: transaction.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: testutil.MakeAddress(), + Coins: 10, + Hours: 10, + }, + }, + } + + cases := []struct { + name string + p transaction.Params + wp CreateTransactionParams + err error + }{ + { + name: "bad transaction.Params", + p: transaction.Params{}, + err: transaction.ErrMissingReceivers, + }, + { + name: "bad CreateTransactionParams", + p: validParams, + wp: CreateTransactionParams{ + Addresses: []cipher.Address{testutil.MakeAddress()}, + UxOuts: []cipher.SHA256{testutil.RandSHA256(t)}, + }, + err: ErrCreateTransactionParamsConflict, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + // setup visor + v := &Visor{} + + _, _, err := v.WalletCreateTransaction("foo.wlt", tc.p, tc.wp) + require.Equal(t, tc.err, err) + + _, _, err = v.WalletCreateTransactionSigned("foo.wlt", nil, tc.p, tc.wp) + require.Equal(t, tc.err, err) + + if tc.err != nil { + return + } + + // Valid WalletCreateTransaction and WalletCreateTransactionSigned calls are tested in live integration tests + }) + } +} + +func TestGetCreateTransactionAuxsUxOut(t *testing.T) { + allAddrs := make([]cipher.Address, 10) + for i := range allAddrs { + allAddrs[i] = testutil.MakeAddress() + } + + hashes := make([]cipher.SHA256, 20) + for i := range hashes { + hashes[i] = testutil.RandSHA256(t) + } + + srcTxns := make([]cipher.SHA256, 20) + for i := range srcTxns { + srcTxns[i] = testutil.RandSHA256(t) + } + + cases := []struct { + name string + ignoreUnconfirmed bool + uxOuts []cipher.SHA256 + expectedAuxs coin.AddressUxOuts + err error + + forEachErr error + unconfirmedTxns coin.Transactions + getArrayInputs []cipher.SHA256 + getArray coin.UxArray + getArrayErr error + }{ + { + name: "uxouts specified, ok", + uxOuts: hashes[5:10], + unconfirmedTxns: coin.Transactions{ + coin.Transaction{ + In: hashes[0:2], + }, + coin.Transaction{ + In: hashes[2:4], + }, + }, + getArrayInputs: hashes[5:10], + getArray: coin.UxArray{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[6], + Address: allAddrs[3], + }, + }, + }, + expectedAuxs: coin.AddressUxOuts{ + allAddrs[1]: []coin.UxOut{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + }, + allAddrs[3]: []coin.UxOut{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[6], + Address: allAddrs[3], + }, + }, + }, + }, + }, + + { + name: "uxouts specified, unconfirmed spend", + uxOuts: hashes[0:4], + err: ErrSpendingUnconfirmed, + forEachErr: ErrSpendingUnconfirmed, + unconfirmedTxns: coin.Transactions{ + coin.Transaction{ + In: hashes[6:10], + }, + coin.Transaction{ + In: hashes[3:6], + }, + }, + }, + + { + name: "uxouts specified, unconfirmed spend ignored", + ignoreUnconfirmed: true, + uxOuts: hashes[5:10], + unconfirmedTxns: coin.Transactions{ + coin.Transaction{ + In: hashes[0:2], + }, + coin.Transaction{ + In: hashes[2:4], + }, + coin.Transaction{ + In: hashes[8:10], + }, + }, + getArrayInputs: hashes[5:8], // the 8th & 9th hash are filtered because it is an unconfirmed spend + getArray: coin.UxArray{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + }, + expectedAuxs: coin.AddressUxOuts{ + allAddrs[1]: []coin.UxOut{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + }, + }, + }, + + { + name: "uxouts specified, all uxouts are unconfirmed", + ignoreUnconfirmed: true, + uxOuts: hashes[5:10], + unconfirmedTxns: coin.Transactions{ + coin.Transaction{ + In: hashes[0:2], + }, + coin.Transaction{ + In: hashes[2:4], + }, + coin.Transaction{ + In: hashes[8:10], + }, + coin.Transaction{ + In: hashes[5:8], + }, + }, + err: ErrNoSpendableOutputs, + }, + + { + name: "uxouts specified, unknown uxout", + uxOuts: hashes[5:10], + err: blockdb.ErrUnspentNotExist{ + UxID: "foo", + }, + getArrayErr: blockdb.ErrUnspentNotExist{ + UxID: "foo", + }, + unconfirmedTxns: coin.Transactions{ + coin.Transaction{ + In: hashes[0:2], + }, + coin.Transaction{ + In: hashes[2:4], + }, + }, + getArrayInputs: hashes[5:10], + getArray: coin.UxArray{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[4], + Address: testutil.MakeAddress(), + }, + }, + }, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + db, shutdown := testutil.PrepareDB(t) + defer shutdown() + + unconfirmed := &MockUnconfirmedTransactionPooler{} + bc := &MockBlockchainer{} + unspent := &MockUnspentPooler{} + require.Implements(t, (*blockdb.UnspentPooler)(nil), unspent) + + v := &Visor{ + unconfirmed: unconfirmed, + blockchain: bc, + db: db, + } + + unconfirmed.On("ForEach", matchDBTx, mock.MatchedBy(func(f func(cipher.SHA256, UnconfirmedTransaction) error) bool { + return true + })).Return(tc.forEachErr).Run(unconfirmedForEachMockRun(t, tc.unconfirmedTxns, tc.uxOuts, tc.ignoreUnconfirmed)) + + unspent.On("GetArray", matchDBTx, mock.MatchedBy(matchUxOutsAnyOrder(tc.getArrayInputs))).Return(tc.getArray, tc.getArrayErr) + + bc.On("Unspent").Return(unspent) + + var auxs coin.AddressUxOuts + err := v.db.View("", func(tx *dbutil.Tx) error { + var err error + auxs, err = v.getCreateTransactionAuxsUxOut(tx, tc.uxOuts, tc.ignoreUnconfirmed) + return err + }) + + if tc.err != nil { + require.Equal(t, tc.err, err) + return + } + + require.NoError(t, err) + + require.Equal(t, tc.expectedAuxs, auxs) + }) + } +} + +func TestGetCreateTransactionAuxsAddress(t *testing.T) { + allAddrs := make([]cipher.Address, 10) + for i := range allAddrs { + allAddrs[i] = testutil.MakeAddress() + } + + hashes := make([]cipher.SHA256, 20) + for i := range hashes { + hashes[i] = testutil.RandSHA256(t) + } + + srcTxns := make([]cipher.SHA256, 20) + for i := range srcTxns { + srcTxns[i] = testutil.RandSHA256(t) + } + + cases := []struct { + name string + ignoreUnconfirmed bool + addrs []cipher.Address + expectedAuxs coin.AddressUxOuts + err error + + forEachErr error + unconfirmedTxns coin.Transactions + getArrayInputs []cipher.SHA256 + getArray coin.UxArray + getArrayErr error + getUnspentHashesOfAddrs blockdb.AddressHashes + }{ + { + name: "ok", + addrs: allAddrs, + getArrayInputs: hashes[0:4], + getArray: coin.UxArray{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[6], + Address: allAddrs[3], + }, + }, + }, + getUnspentHashesOfAddrs: blockdb.AddressHashes{ + allAddrs[1]: hashes[0:2], + allAddrs[3]: hashes[2:4], + }, + expectedAuxs: coin.AddressUxOuts{ + allAddrs[1]: []coin.UxOut{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + }, + allAddrs[3]: []coin.UxOut{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[6], + Address: allAddrs[3], + }, + }, + }, + }, + }, + + { + name: "err, unconfirmed spends", + addrs: allAddrs, + err: ErrSpendingUnconfirmed, + forEachErr: ErrSpendingUnconfirmed, + getUnspentHashesOfAddrs: blockdb.AddressHashes{ + allAddrs[1]: hashes[0:2], + allAddrs[3]: hashes[2:4], + }, + }, + + { + name: "ignore unconfirmed", + ignoreUnconfirmed: true, + addrs: allAddrs, + unconfirmedTxns: coin.Transactions{ + { + In: []cipher.SHA256{hashes[1]}, + }, + { + In: []cipher.SHA256{hashes[2]}, + }, + }, + getArrayInputs: []cipher.SHA256{hashes[0], hashes[3]}, + getArray: coin.UxArray{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[6], + Address: allAddrs[3], + }, + }, + }, + getUnspentHashesOfAddrs: blockdb.AddressHashes{ + allAddrs[1]: hashes[0:2], + allAddrs[3]: hashes[2:4], + }, + expectedAuxs: coin.AddressUxOuts{ + allAddrs[1]: []coin.UxOut{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + }, + allAddrs[3]: []coin.UxOut{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[6], + Address: allAddrs[3], + }, + }, + }, + }, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + db, shutdown := testutil.PrepareDB(t) + defer shutdown() + + unconfirmed := &MockUnconfirmedTransactionPooler{} + bc := &MockBlockchainer{} + unspent := &MockUnspentPooler{} + require.Implements(t, (*blockdb.UnspentPooler)(nil), unspent) + + v := &Visor{ + unconfirmed: unconfirmed, + blockchain: bc, + db: db, + } + unspent.On("GetUnspentHashesOfAddrs", matchDBTx, tc.addrs).Return(tc.getUnspentHashesOfAddrs, nil) + + unconfirmed.On("ForEach", matchDBTx, mock.MatchedBy(func(f func(cipher.SHA256, UnconfirmedTransaction) error) bool { + return true + })).Return(tc.forEachErr).Run(unconfirmedForEachMockRun(t, tc.unconfirmedTxns, tc.getUnspentHashesOfAddrs.Flatten(), tc.ignoreUnconfirmed)) + + unspent.On("GetArray", matchDBTx, mock.MatchedBy(matchUxOutsAnyOrder(tc.getArrayInputs))).Return(tc.getArray, tc.getArrayErr) + + bc.On("Unspent").Return(unspent) + + var auxs coin.AddressUxOuts + err := v.db.View("", func(tx *dbutil.Tx) error { + var err error + auxs, err = v.getCreateTransactionAuxsAddress(tx, tc.addrs, tc.ignoreUnconfirmed) + return err + }) + + if tc.err != nil { + require.Equal(t, tc.err, err) + return + } + + require.NoError(t, err) + + require.Equal(t, tc.expectedAuxs, auxs) + }) + } +} + +var matchDBTx = mock.MatchedBy(func(tx *dbutil.Tx) bool { + return true +}) + +func matchUxOutsAnyOrder(inputs []cipher.SHA256) func(args []cipher.SHA256) bool { + return func(args []cipher.SHA256) bool { + // Compares two []coin.UxOuts for equality, ignoring the order of elements in the slice + if len(args) != len(inputs) { + return false + } + + x := make([]cipher.SHA256, len(inputs)) + copy(x, inputs) + y := make([]cipher.SHA256, len(args)) + copy(y, args) + + sort.Slice(x, func(a, b int) bool { + return bytes.Compare(x[a][:], x[b][:]) < 0 + }) + sort.Slice(y, func(a, b int) bool { + return bytes.Compare(y[a][:], y[b][:]) < 0 + }) + + return reflect.DeepEqual(x, y) + } +} + +// hashesIntersect returns true if there are any hashes common to x and y +func hashesIntersect(x, y []cipher.SHA256) bool { + for _, a := range x { + for _, b := range y { + if a == b { + return true + } + } + } + return false +} + +// unconfirmedForEachMockRun simulates the Unconfirmed.ForEach callback method +func unconfirmedForEachMockRun(t *testing.T, unconfirmedTxns []coin.Transaction, uxOuts []cipher.SHA256, ignoreUnconfirmed bool) func(args mock.Arguments) { + return func(args mock.Arguments) { + fn := args.Get(1).(func(cipher.SHA256, UnconfirmedTransaction) error) + for _, u := range unconfirmedTxns { + err := fn(u.Hash(), UnconfirmedTransaction{ + Transaction: u, + }) + + // If any of the input hashes are in an unconfirmed transaction, + // the callback handler should have returned ErrSpendingUnconfirmed + // unless IgnoreUnconfirmed is true + hasUnconfirmedHash := hashesIntersect(u.In, uxOuts) + + if hasUnconfirmedHash { + if ignoreUnconfirmed { + require.NoError(t, err) + } else { + require.Equal(t, ErrSpendingUnconfirmed, err) + } + } else { + require.NoError(t, err) + } + + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/balance.go b/vendor/github.com/SkycoinProject/skycoin/src/wallet/balance.go new file mode 100644 index 00000000..e9edbe1e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/balance.go @@ -0,0 +1,87 @@ +package wallet + +import ( + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/util/mathutil" +) + +/* +Do not show balances or outputs that have not cleared yet +- should only allow spends against outputs that are on head +*/ + +// BalancePair records the confirmed and predicted balance of an address +type BalancePair struct { + Confirmed Balance + Predicted Balance +} + +// AddressBalances represents a map of address balances +type AddressBalances map[string]BalancePair + +// Balance has coins and hours +type Balance struct { + Coins uint64 + Hours uint64 +} + +// NewBalance creates balance +func NewBalance(coins, hours uint64) Balance { + return Balance{ + Coins: coins, + Hours: hours, + } +} + +// NewBalanceFromUxOut creates Balance from UxOut +func NewBalanceFromUxOut(headTime uint64, ux *coin.UxOut) (Balance, error) { + hours, err := ux.CoinHours(headTime) + if err != nil { + return Balance{}, err + } + + return Balance{ + Coins: ux.Body.Coins, + Hours: hours, + }, nil +} + +// Add adds two Balances +func (bal Balance) Add(other Balance) (Balance, error) { + coins, err := mathutil.AddUint64(bal.Coins, other.Coins) + if err != nil { + return Balance{}, err + } + + hours, err := mathutil.AddUint64(bal.Hours, other.Hours) + if err != nil { + return Balance{}, err + } + + return Balance{ + Coins: coins, + Hours: hours, + }, nil +} + +// Sub subtracts other from self and returns the new Balance. Will panic if +// other is greater than balance, because Coins and Hours are unsigned. +func (bal Balance) Sub(other Balance) Balance { + if other.Coins > bal.Coins || other.Hours > bal.Hours { + logger.Panic("Cannot subtract balances, second balance is too large") + } + return Balance{ + Coins: bal.Coins - other.Coins, + Hours: bal.Hours - other.Hours, + } +} + +// Equals compares two Balances +func (bal Balance) Equals(other Balance) bool { + return bal.Coins == other.Coins && bal.Hours == other.Hours +} + +// IsZero returns true if the Balance is empty (both coins and hours) +func (bal Balance) IsZero() bool { + return bal.Coins == 0 && bal.Hours == 0 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/bip44_wallet.go b/vendor/github.com/SkycoinProject/skycoin/src/wallet/bip44_wallet.go new file mode 100644 index 00000000..e30b052c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/bip44_wallet.go @@ -0,0 +1,535 @@ +package wallet + +import ( + "errors" + "fmt" + "math" + "sort" + + "github.com/sirupsen/logrus" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/bip32" + "github.com/SkycoinProject/skycoin/src/cipher/bip39" + "github.com/SkycoinProject/skycoin/src/cipher/bip44" + "github.com/SkycoinProject/skycoin/src/util/file" + "github.com/SkycoinProject/skycoin/src/util/mathutil" +) + +// Bip44Wallet manages keys using the original Skycoin deterministic +// keypair generator method. +// With this generator, a single chain of addresses is created, each one dependent +// on the previous. +type Bip44Wallet struct { + Meta + ExternalEntries Entries + ChangeEntries Entries +} + +// newBip44Wallet creates a Bip44Wallet +func newBip44Wallet(meta Meta) (*Bip44Wallet, error) { //nolint:unparam + return &Bip44Wallet{ + Meta: meta, + }, nil +} + +// PackSecrets copies data from decrypted wallets into the secrets container +func (w *Bip44Wallet) PackSecrets(ss Secrets) { + ss.set(secretSeed, w.Meta.Seed()) + ss.set(secretSeedPassphrase, w.Meta.SeedPassphrase()) + + // Saves entry secret keys in secrets + for _, e := range w.ExternalEntries { + ss.set(e.Address.String(), e.Secret.Hex()) + } + for _, e := range w.ChangeEntries { + ss.set(e.Address.String(), e.Secret.Hex()) + } +} + +// UnpackSecrets copies data from decrypted secrets into the wallet +func (w *Bip44Wallet) UnpackSecrets(ss Secrets) error { + seed, ok := ss.get(secretSeed) + if !ok { + return errors.New("seed doesn't exist in secrets") + } + w.Meta.setSeed(seed) + + passphrase, _ := ss.get(secretSeedPassphrase) + w.Meta.setSeedPassphrase(passphrase) + + if err := w.ExternalEntries.unpackSecretKeys(ss); err != nil { + return err + } + return w.ChangeEntries.unpackSecretKeys(ss) +} + +// Clone clones the wallet a new wallet object +func (w *Bip44Wallet) Clone() Wallet { + return &Bip44Wallet{ + Meta: w.Meta.clone(), + ExternalEntries: w.ExternalEntries.clone(), + ChangeEntries: w.ChangeEntries.clone(), + } +} + +// CopyFrom copies the src wallet to w +func (w *Bip44Wallet) CopyFrom(src Wallet) { + w.Meta = src.(*Bip44Wallet).Meta.clone() + w.ExternalEntries = src.(*Bip44Wallet).ExternalEntries.clone() + w.ChangeEntries = src.(*Bip44Wallet).ChangeEntries.clone() +} + +// CopyFromRef copies the src wallet with a pointer dereference +func (w *Bip44Wallet) CopyFromRef(src Wallet) { + *w = *(src.(*Bip44Wallet)) +} + +// Erase wipes secret fields in wallet +func (w *Bip44Wallet) Erase() { + w.Meta.eraseSeeds() + w.ExternalEntries.erase() + w.ChangeEntries.erase() +} + +// ToReadable converts the wallet to its readable (serializable) format +func (w *Bip44Wallet) ToReadable() Readable { + return NewReadableBip44Wallet(w) +} + +// Validate validates the wallet +func (w *Bip44Wallet) Validate() error { + return w.Meta.validate() +} + +// GetAddresses returns all addresses in wallet +func (w *Bip44Wallet) GetAddresses() []cipher.Addresser { + return append(w.ExternalEntries.getAddresses(), w.ChangeEntries.getAddresses()...) +} + +// GetSkycoinAddresses returns all Skycoin addresses in wallet. The wallet's coin type must be Skycoin. +func (w *Bip44Wallet) GetSkycoinAddresses() ([]cipher.Address, error) { + if w.Meta.Coin() != CoinTypeSkycoin { + return nil, errors.New("Bip44Wallet coin type is not skycoin") + } + + return append(w.ExternalEntries.getSkycoinAddresses(), w.ChangeEntries.getSkycoinAddresses()...), nil +} + +// GetEntries returns a copy of all entries held by the wallet +func (w *Bip44Wallet) GetEntries() Entries { + if w.EntriesLen() == 0 { + return nil + } + return append(w.ExternalEntries.clone(), w.ChangeEntries.clone()...) +} + +// EntriesLen returns the number of entries in the wallet +func (w *Bip44Wallet) EntriesLen() int { + return len(w.ExternalEntries) + len(w.ChangeEntries) +} + +// GetEntryAt returns entry at a given index in the entries array +func (w *Bip44Wallet) GetEntryAt(i int) Entry { + if i >= len(w.ExternalEntries) { + return w.ChangeEntries[i-len(w.ExternalEntries)] + } + return w.ExternalEntries[i] +} + +// GetEntry returns entry of given address +func (w *Bip44Wallet) GetEntry(a cipher.Address) (Entry, bool) { + if e, ok := w.ExternalEntries.get(a); ok { + return e, true + } + + return w.ChangeEntries.get(a) +} + +// HasEntry returns true if the wallet has an Entry with a given cipher.Address. +func (w *Bip44Wallet) HasEntry(a cipher.Address) bool { + return w.ExternalEntries.has(a) || w.ChangeEntries.has(a) +} + +// CoinHDNode return the "coin" level bip44 HDNode +func (w *Bip44Wallet) CoinHDNode() (*bip44.Coin, error) { + // w.Meta.Seed() must return a valid bip39 mnemonic + seed, err := bip39.NewSeed(w.Meta.Seed(), w.Meta.SeedPassphrase()) + if err != nil { + return nil, err + } + + c, err := bip44.NewCoin(seed, w.Meta.Bip44Coin()) + if err != nil { + logger.Critical().WithError(err).Error("Failed to derive the bip44 purpose node") + if bip32.IsImpossibleChildError(err) { + logger.Critical().Error("ImpossibleChild: this seed cannot be used for bip44") + } + return nil, err + } + + return c, nil +} + +// nextChildIdx returns the next child index from a sequence of entries. +// This assumes that entries are sorted by child number ascending. +func nextChildIdx(e Entries) uint32 { + if len(e) == 0 { + return 0 + } + return e[len(e)-1].ChildNumber + 1 +} + +// generateEntries generates addresses for a change chain (should be 0 or 1) starting from an initial child number. +func (w *Bip44Wallet) generateEntries(num uint64, changeIdx, initialChildIdx uint32) (Entries, error) { + if w.Meta.IsEncrypted() { + return nil, ErrWalletEncrypted + } + + if num > math.MaxUint32 { + return nil, NewError(errors.New("Bip44Wallet.generateEntries num too large")) + } + + // Cap `num` in case it would exceed the maximum child index number + if math.MaxUint32-initialChildIdx < uint32(num) { + num = uint64(math.MaxUint32 - initialChildIdx) + } + + if num == 0 { + return nil, nil + } + + c, err := w.CoinHDNode() + if err != nil { + return nil, err + } + + // Generate the "account" HDNode. Multiple accounts are not supported; use 0. + account, err := c.Account(0) + if err != nil { + logger.Critical().WithError(err).Error("Failed to derive the bip44 account node") + if bip32.IsImpossibleChildError(err) { + logger.Critical().Error("ImpossibleChild: this seed cannot be used for bip44") + } + return nil, err + } + + // Generate the external chain parent node + chain, err := account.NewPrivateChildKey(changeIdx) + if err != nil { + logger.Critical().WithError(err).Error("Failed to derive the final bip44 chain node") + if bip32.IsImpossibleChildError(err) { + logger.Critical().Error("ImpossibleChild: this seed cannot be used for bip44") + } + return nil, err + } + + // Generate `num` secret keys from the external chain HDNode, skipping any children that + // are invalid (note that this has probability ~2^-128) + var seckeys []*bip32.PrivateKey + var addressIndices []uint32 + j := initialChildIdx + for i := uint32(0); i < uint32(num); i++ { + k, err := chain.NewPrivateChildKey(j) + + var addErr error + j, addErr = mathutil.AddUint32(j, 1) + if addErr != nil { + logger.Critical().WithError(addErr).WithFields(logrus.Fields{ + "num": num, + "initialChildIdx": initialChildIdx, + "accountIdx": 0, + "changeIdx": changeIdx, + "childIdx": j, + "i": i, + }).Error("childIdx can't be incremented any further") + return nil, errors.New("childIdx can't be incremented any further") + } + + if err != nil { + if bip32.IsImpossibleChildError(err) { + logger.Critical().WithError(err).WithFields(logrus.Fields{ + "accountIdx": 0, + "changeIdx": changeIdx, + "childIdx": j, + }).Error("ImpossibleChild for chain node child element") + continue + } else { + logger.Critical().WithError(err).WithFields(logrus.Fields{ + "accountIdx": 0, + "changeIdx": changeIdx, + "childIdx": j, + }).Error("NewPrivateChildKey failed unexpectedly") + return nil, err + } + } + + seckeys = append(seckeys, k) + addressIndices = append(addressIndices, j-1) + } + + entries := make(Entries, len(seckeys)) + makeAddress := w.Meta.AddressConstructor() + for i, xprv := range seckeys { + sk := cipher.MustNewSecKey(xprv.Key) + pk := cipher.MustPubKeyFromSecKey(sk) + entries[i] = Entry{ + Address: makeAddress(pk), + Secret: sk, + Public: pk, + ChildNumber: addressIndices[i], + Change: changeIdx, + } + } + + return entries, nil +} + +// PeekChangeEntry creates and returns an entry for the change chain. +// If used, the caller the append it with GenerateChangeEntry +func (w *Bip44Wallet) PeekChangeEntry() (Entry, error) { + entries, err := w.generateEntries(1, bip44.ChangeChainIndex, nextChildIdx(w.ChangeEntries)) + if err != nil { + return Entry{}, err + } + + if len(entries) == 0 { + return Entry{}, NewError(errors.New("PeekChangeEntry: no more change addresses")) + } + + return entries[0], nil +} + +// GenerateChangeEntry creates, appends and returns an entry for the change chain +func (w *Bip44Wallet) GenerateChangeEntry() (Entry, error) { + e, err := w.PeekChangeEntry() + if err != nil { + return Entry{}, err + } + + w.ChangeEntries = append(w.ChangeEntries, Entries{e}...) + + return w.ChangeEntries[len(w.ChangeEntries)-1], nil +} + +// GenerateAddresses generates addresses for the external chain, and appends them to the wallet's entries array +func (w *Bip44Wallet) GenerateAddresses(num uint64) ([]cipher.Addresser, error) { + entries, err := w.generateEntries(num, bip44.ExternalChainIndex, nextChildIdx(w.ExternalEntries)) + if err != nil { + return nil, err + } + + w.ExternalEntries = append(w.ExternalEntries, entries...) + + return entries.getAddresses(), nil +} + +// GenerateSkycoinAddresses generates Skycoin addresses for the external chain, and appends them to the wallet's entries array. +// If the wallet's coin type is not Skycoin, returns an error +func (w *Bip44Wallet) GenerateSkycoinAddresses(num uint64) ([]cipher.Address, error) { + if w.Meta.Coin() != CoinTypeSkycoin { + return nil, errors.New("GenerateSkycoinAddresses called for non-skycoin wallet") + } + + entries, err := w.generateEntries(num, bip44.ExternalChainIndex, nextChildIdx(w.ExternalEntries)) + if err != nil { + return nil, err + } + + w.ExternalEntries = append(w.ExternalEntries, entries...) + + return entries.getSkycoinAddresses(), nil +} + +// ScanAddresses scans ahead N addresses, truncating up to the highest address with any transaction history. +func (w *Bip44Wallet) ScanAddresses(scanN uint64, tf TransactionsFinder) error { + if w.Meta.IsEncrypted() { + return ErrWalletEncrypted + } + + if scanN == 0 { + return nil + } + + w2 := w.Clone().(*Bip44Wallet) + + externalEntries, err := scanAddressesBip32(func(num uint64, childIdx uint32) (Entries, error) { + return w.generateEntries(num, bip44.ExternalChainIndex, childIdx) + }, scanN, tf, nextChildIdx(w2.ExternalEntries)) + if err != nil { + return err + } + + changeEntries, err := scanAddressesBip32(func(num uint64, childIdx uint32) (Entries, error) { + return w.generateEntries(num, bip44.ChangeChainIndex, childIdx) + }, scanN, tf, nextChildIdx(w2.ChangeEntries)) + if err != nil { + return err + } + + // Add scanned entries + w2.ExternalEntries = append(w2.ExternalEntries, externalEntries...) + w2.ChangeEntries = append(w2.ChangeEntries, changeEntries...) + + *w = *w2 + + return nil +} + +// scanAddressesBip32 implements the address scanning algorithm for bip32 +// based (e.g. bip44, xpub) wallets +func scanAddressesBip32(generateEntries func(num uint64, childIdx uint32) (Entries, error), scanN uint64, tf TransactionsFinder, initialChildIdx uint32) (Entries, error) { + if scanN == 0 { + return nil, nil + } + + nAddAddrs := uint64(0) + n := scanN + extraScan := uint64(0) + childIdx := initialChildIdx + var newEntries Entries + + for { + // Generate the addresses to scan + entries, err := generateEntries(n, childIdx) + if err != nil { + return nil, err + } + + if len(entries) == 0 { + break + } + + // The bip32 child key sequence is finite and may be truncated at its limit + n = uint64(len(entries)) + if n == 0 { + break + } + + childIdx = nextChildIdx(entries) + + newEntries = append(newEntries, entries...) + + addrs := entries.getSkycoinAddresses() + + // Find if these addresses had any activity + active, err := tf.AddressesActivity(addrs) + if err != nil { + return nil, err + } + + // Check activity from the last one until we find the address that has activity + var keepNum uint64 + for i := len(active) - 1; i >= 0; i-- { + if active[i] { + keepNum = uint64(i + 1) + break + } + } + + if keepNum == 0 { + break + } + + nAddAddrs += keepNum + extraScan + + if n < keepNum { + logger.Panic("n should never be less than keepNum") + } + + // extraScan is the number of addresses with no activity beyond the + // last address with activity + extraScan = n - keepNum + + // n is the number of addresses to scan the next iteration + n = scanN - extraScan + } + + return newEntries[:nAddAddrs], nil +} + +// Fingerprint returns a unique ID fingerprint for this wallet, composed of its initial address +// and wallet type +func (w *Bip44Wallet) Fingerprint() string { + addr := "" + if len(w.ExternalEntries) == 0 { + if !w.IsEncrypted() { + entries, err := w.generateEntries(1, bip44.ExternalChainIndex, 0) + if err != nil { + logger.WithError(err).Panic("Fingerprint failed to generate initial entry for empty wallet") + } + addr = entries[0].Address.String() + } + } else { + addr = w.ExternalEntries[0].Address.String() + } + return fmt.Sprintf("%s-%s", w.Type(), addr) +} + +// ReadableBip44Wallet used for [de]serialization of a deterministic wallet +type ReadableBip44Wallet struct { + Meta `json:"meta"` + ReadableEntries `json:"entries"` +} + +// LoadReadableBip44Wallet loads a deterministic wallet from disk +func LoadReadableBip44Wallet(wltFile string) (*ReadableBip44Wallet, error) { + var rw ReadableBip44Wallet + if err := file.LoadJSON(wltFile, &rw); err != nil { + return nil, err + } + if rw.Type() != WalletTypeBip44 { + return nil, ErrInvalidWalletType + } + return &rw, nil +} + +// NewReadableBip44Wallet creates readable wallet +func NewReadableBip44Wallet(w *Bip44Wallet) *ReadableBip44Wallet { + return &ReadableBip44Wallet{ + Meta: w.Meta.clone(), + ReadableEntries: newReadableEntries(w.GetEntries(), w.Meta.Coin(), w.Meta.Type()), + } +} + +// ToWallet convert readable wallet to Wallet +func (rw *ReadableBip44Wallet) ToWallet() (Wallet, error) { + w := &Bip44Wallet{ + Meta: rw.Meta.clone(), + } + + if err := w.Validate(); err != nil { + err := fmt.Errorf("invalid wallet %q: %v", w.Filename(), err) + logger.WithError(err).Error("ReadableBip44Wallet.ToWallet Validate failed") + return nil, err + } + + ets, err := rw.ReadableEntries.toWalletEntries(w.Meta.Coin(), w.Meta.Type(), w.Meta.IsEncrypted()) + if err != nil { + logger.WithError(err).Error("ReadableBip44Wallet.ToWallet ReadableEntries.toWalletEntries failed") + return nil, err + } + + // Split the single array of entries into separate external and change chains, + // for easier internal management + for _, e := range ets { + switch e.Change { + case bip44.ExternalChainIndex: + w.ExternalEntries = append(w.ExternalEntries, e) + case bip44.ChangeChainIndex: + w.ChangeEntries = append(w.ChangeEntries, e) + default: + logger.Panicf("invalid change value %d", e.Change) + } + } + + // Sort childNumber low to high + sort.Slice(w.ExternalEntries, func(i, j int) bool { + return w.ExternalEntries[i].ChildNumber < w.ExternalEntries[j].ChildNumber + }) + sort.Slice(w.ChangeEntries, func(i, j int) bool { + return w.ChangeEntries[i].ChildNumber < w.ChangeEntries[j].ChildNumber + }) + + return w, err +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/collection_wallet.go b/vendor/github.com/SkycoinProject/skycoin/src/wallet/collection_wallet.go new file mode 100644 index 00000000..ad0de070 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/collection_wallet.go @@ -0,0 +1,207 @@ +package wallet + +import ( + "errors" + "fmt" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/util/file" +) + +// CollectionWallet manages keys as an arbitrary collection. +// It has no defined keypair generator. The only way to add keys to the +// wallet is to explicitly add them. +// This wallet does not support address scanning or generation. +// This wallet does not use seeds. +type CollectionWallet struct { + Meta + Entries Entries +} + +// newCollectionWallet creates a CollectionWallet +func newCollectionWallet(meta Meta) (*CollectionWallet, error) { //nolint:unparam + return &CollectionWallet{ + Meta: meta, + }, nil +} + +// PackSecrets copies data from decrypted wallets into the secrets container +func (w *CollectionWallet) PackSecrets(ss Secrets) { + ss.set(secretSeed, w.Meta.Seed()) + ss.set(secretLastSeed, w.Meta.LastSeed()) + + // Saves entry secret keys in secrets + for _, e := range w.Entries { + ss.set(e.Address.String(), e.Secret.Hex()) + } +} + +// UnpackSecrets copies data from decrypted secrets into the wallet +func (w *CollectionWallet) UnpackSecrets(ss Secrets) error { + return w.Entries.unpackSecretKeys(ss) +} + +// Clone clones the wallet a new wallet object +func (w *CollectionWallet) Clone() Wallet { + return &CollectionWallet{ + Meta: w.Meta.clone(), + Entries: w.Entries.clone(), + } +} + +// CopyFrom copies the src wallet by reallocating +func (w *CollectionWallet) CopyFrom(src Wallet) { + w.Meta = src.(*CollectionWallet).Meta.clone() + w.Entries = src.(*CollectionWallet).Entries.clone() +} + +// CopyFromRef copies the src wallet with a pointer dereference +func (w *CollectionWallet) CopyFromRef(src Wallet) { + *w = *(src.(*CollectionWallet)) +} + +// Erase wipes secret fields in wallet +func (w *CollectionWallet) Erase() { + w.Meta.eraseSeeds() + w.Entries.erase() +} + +// ToReadable converts the wallet to its readable (serializable) format +func (w *CollectionWallet) ToReadable() Readable { + return NewReadableCollectionWallet(w) +} + +// Validate validates the wallet +func (w *CollectionWallet) Validate() error { + return w.Meta.validate() +} + +// GetEntries returns a copy of all entries held by the wallet +func (w *CollectionWallet) GetEntries() Entries { + return w.Entries.clone() +} + +// EntriesLen returns the number of entries in the wallet +func (w *CollectionWallet) EntriesLen() int { + return len(w.Entries) +} + +// GetEntryAt returns entry at a given index in the entries array +func (w *CollectionWallet) GetEntryAt(i int) Entry { + return w.Entries[i] +} + +// GetEntry returns entry of given address +func (w *CollectionWallet) GetEntry(a cipher.Address) (Entry, bool) { + return w.Entries.get(a) +} + +// HasEntry returns true if the wallet has an Entry with a given cipher.Address. +func (w *CollectionWallet) HasEntry(a cipher.Address) bool { + return w.Entries.has(a) +} + +// GenerateAddresses is a no-op for "collection" wallets +func (w *CollectionWallet) GenerateAddresses(num uint64) ([]cipher.Addresser, error) { + return nil, NewError(errors.New("A collection wallet does not implement GenerateAddresses")) +} + +// GenerateSkycoinAddresses is a no-op for "collection" wallets +func (w *CollectionWallet) GenerateSkycoinAddresses(num uint64) ([]cipher.Address, error) { + return nil, NewError(errors.New("A collection wallet does not implement GenerateSkycoinAddresses")) +} + +// ScanAddresses is a no-op for "collection" wallets +func (w *CollectionWallet) ScanAddresses(scanN uint64, tf TransactionsFinder) error { + return NewError(errors.New("A collection wallet does not implement ScanAddresses")) +} + +// GetAddresses returns all addresses in wallet +func (w *CollectionWallet) GetAddresses() []cipher.Addresser { + return w.Entries.getAddresses() +} + +// GetSkycoinAddresses returns all Skycoin addresses in wallet. The wallet's coin type must be Skycoin. +func (w *CollectionWallet) GetSkycoinAddresses() ([]cipher.Address, error) { + if w.Meta.Coin() != CoinTypeSkycoin { + return nil, errors.New("CollectionWallet coin type is not skycoin") + } + + return w.Entries.getSkycoinAddresses(), nil +} + +// Fingerprint returns an empty string; fingerprints are only defined for +// wallets with a seed +func (w *CollectionWallet) Fingerprint() string { + return "" +} + +// AddEntry adds a new entry to the wallet. +func (w *CollectionWallet) AddEntry(e Entry) error { + if w.IsEncrypted() { + return ErrWalletEncrypted + } + + if err := e.Verify(); err != nil { + return err + } + + for _, entry := range w.Entries { + if e.SkycoinAddress() == entry.SkycoinAddress() { + return errors.New("wallet already contains entry with this address") + } + } + + w.Entries = append(w.Entries, e) + return nil +} + +// ReadableCollectionWallet used for [de]serialization of a collection wallet +type ReadableCollectionWallet struct { + Meta `json:"meta"` + ReadableEntries `json:"entries"` +} + +// NewReadableCollectionWallet creates readable wallet +func NewReadableCollectionWallet(w *CollectionWallet) *ReadableCollectionWallet { + return &ReadableCollectionWallet{ + Meta: w.Meta.clone(), + ReadableEntries: newReadableEntries(w.Entries, w.Meta.Coin(), w.Meta.Type()), + } +} + +// LoadReadableCollectionWallet loads a collection wallet from disk +func LoadReadableCollectionWallet(wltFile string) (*ReadableCollectionWallet, error) { + logger.WithField("filename", wltFile).Info("LoadReadableCollectionWallet") + var rw ReadableCollectionWallet + if err := file.LoadJSON(wltFile, &rw); err != nil { + return nil, err + } + if rw.Type() != WalletTypeCollection { + return nil, ErrInvalidWalletType + } + return &rw, nil +} + +// ToWallet convert readable wallet to Wallet +func (rw *ReadableCollectionWallet) ToWallet() (Wallet, error) { + w := &CollectionWallet{ + Meta: rw.Meta.clone(), + } + + if err := w.Validate(); err != nil { + err := fmt.Errorf("invalid wallet %q: %v", w.Filename(), err) + logger.WithError(err).Error("ReadableCollectionWallet.ToWallet Validate failed") + return nil, err + } + + ets, err := rw.ReadableEntries.toWalletEntries(w.Meta.Coin(), w.Meta.Type(), w.Meta.IsEncrypted()) + if err != nil { + logger.WithError(err).Error("ReadableCollectionWallet.ToWallet toWalletEntries failed") + return nil, err + } + + w.Entries = ets + + return w, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/crypto.go b/vendor/github.com/SkycoinProject/skycoin/src/wallet/crypto.go new file mode 100644 index 00000000..49ec0b12 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/crypto.go @@ -0,0 +1,66 @@ +package wallet + +import ( + "errors" + "fmt" + + "github.com/SkycoinProject/skycoin/src/cipher/encrypt" +) + +type cryptor interface { + Encrypt(data, password []byte) ([]byte, error) + Decrypt(data, password []byte) ([]byte, error) +} + +// CryptoType represents the type of crypto name +type CryptoType string + +// CryptoTypeFromString converts string to CryptoType +func CryptoTypeFromString(s string) (CryptoType, error) { + switch CryptoType(s) { + case CryptoTypeSha256Xor: + return CryptoTypeSha256Xor, nil + case CryptoTypeScryptChacha20poly1305: + return CryptoTypeScryptChacha20poly1305, nil + case CryptoTypeScryptChacha20poly1305Insecure: + return CryptoTypeScryptChacha20poly1305Insecure, nil + default: + return "", errors.New("unknown crypto type") + } +} + +// Crypto types +const ( + // CryptoTypeSha256Xor uses the SHA256-XOR encryption method (unsafe - no key derivation) + CryptoTypeSha256Xor = CryptoType("sha256-xor") + // CryptoTypeScryptChacha20poly1305 uses chacha20poly1305 + scrypt key derivation (use this) + CryptoTypeScryptChacha20poly1305 = CryptoType("scrypt-chacha20poly1305") + // CryptoTypeScryptChacha20poly1305Insecure uses chacha20poly1305 + scrypt key derivation with a weak work factor (unsafe) + CryptoTypeScryptChacha20poly1305Insecure = CryptoType("scrypt-chacha20poly1305-insecure") + + // DefaultCryptoType is the default CryptoType used + DefaultCryptoType = CryptoTypeScryptChacha20poly1305 +) + +// cryptoTable records all supported wallet crypto methods +// If want to support new crypto methods, register here. +var cryptoTable = map[CryptoType]cryptor{ + CryptoTypeSha256Xor: encrypt.DefaultSha256Xor, + CryptoTypeScryptChacha20poly1305: encrypt.DefaultScryptChacha20poly1305, + CryptoTypeScryptChacha20poly1305Insecure: encrypt.ScryptChacha20poly1305{ + N: 1 << 15, + R: encrypt.ScryptR, + P: encrypt.ScryptP, + KeyLen: encrypt.ScryptKeyLen, + }, +} + +// getCrypto gets crypto of given type +func getCrypto(cryptoType CryptoType) (cryptor, error) { + c, ok := cryptoTable[cryptoType] + if !ok { + return nil, fmt.Errorf("can not find crypto %v in crypto table", cryptoType) + } + + return c, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/crypto_test.go b/vendor/github.com/SkycoinProject/skycoin/src/wallet/crypto_test.go new file mode 100644 index 00000000..f36ef9f0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/crypto_test.go @@ -0,0 +1,29 @@ +package wallet + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestSecrets(t *testing.T) { + s := make(Secrets) + s.set("k1", "v1") + + v, ok := s.get("k1") + require.True(t, ok) + require.Equal(t, "v1", v) + + _, ok = s.get("k2") + require.False(t, ok) + + s.set("k2", "v2") + + b, err := s.serialize() + require.NoError(t, err) + + s1 := make(Secrets) + err = s1.deserialize(b) + require.NoError(t, err) + require.Equal(t, s, s1) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/deterministic_wallet.go b/vendor/github.com/SkycoinProject/skycoin/src/wallet/deterministic_wallet.go new file mode 100644 index 00000000..3464cacd --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/deterministic_wallet.go @@ -0,0 +1,321 @@ +package wallet + +import ( + "encoding/hex" + "errors" + "fmt" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/util/file" +) + +// DeterministicWallet manages keys using the original Skycoin deterministic +// keypair generator method. +// With this generator, a single chain of addresses is created, each one dependent +// on the previous. +type DeterministicWallet struct { + Meta + Entries Entries +} + +// newDeterministicWallet creates a DeterministicWallet +func newDeterministicWallet(meta Meta) (*DeterministicWallet, error) { //nolint:unparam + return &DeterministicWallet{ + Meta: meta, + }, nil +} + +// PackSecrets copies data from decrypted wallets into the secrets container +func (w *DeterministicWallet) PackSecrets(ss Secrets) { + ss.set(secretSeed, w.Meta.Seed()) + ss.set(secretLastSeed, w.Meta.LastSeed()) + + // Saves entry secret keys in secrets + for _, e := range w.Entries { + ss.set(e.Address.String(), e.Secret.Hex()) + } +} + +// UnpackSecrets copies data from decrypted secrets into the wallet +func (w *DeterministicWallet) UnpackSecrets(ss Secrets) error { + seed, ok := ss.get(secretSeed) + if !ok { + return errors.New("seed doesn't exist in secrets") + } + w.Meta.setSeed(seed) + + lastSeed, ok := ss.get(secretLastSeed) + if !ok { + return errors.New("lastSeed doesn't exist in secrets") + } + w.Meta.setLastSeed(lastSeed) + + return w.Entries.unpackSecretKeys(ss) +} + +// Clone clones the wallet a new wallet object +func (w *DeterministicWallet) Clone() Wallet { + return &DeterministicWallet{ + Meta: w.Meta.clone(), + Entries: w.Entries.clone(), + } +} + +// CopyFrom copies the src wallet to w +func (w *DeterministicWallet) CopyFrom(src Wallet) { + w.Meta = src.(*DeterministicWallet).Meta.clone() + w.Entries = src.(*DeterministicWallet).Entries.clone() +} + +// CopyFromRef copies the src wallet with a pointer dereference +func (w *DeterministicWallet) CopyFromRef(src Wallet) { + *w = *(src.(*DeterministicWallet)) +} + +// Erase wipes secret fields in wallet +func (w *DeterministicWallet) Erase() { + w.Meta.eraseSeeds() + w.Entries.erase() +} + +// ToReadable converts the wallet to its readable (serializable) format +func (w *DeterministicWallet) ToReadable() Readable { + return NewReadableDeterministicWallet(w) +} + +// Validate validates the wallet +func (w *DeterministicWallet) Validate() error { + return w.Meta.validate() +} + +// GetAddresses returns all addresses in wallet +func (w *DeterministicWallet) GetAddresses() []cipher.Addresser { + return w.Entries.getAddresses() +} + +// GetSkycoinAddresses returns all Skycoin addresses in wallet. The wallet's coin type must be Skycoin. +func (w *DeterministicWallet) GetSkycoinAddresses() ([]cipher.Address, error) { + if w.Meta.Coin() != CoinTypeSkycoin { + return nil, errors.New("DeterministicWallet coin type is not skycoin") + } + + return w.Entries.getSkycoinAddresses(), nil +} + +// GetEntries returns a copy of all entries held by the wallet +func (w *DeterministicWallet) GetEntries() Entries { + return w.Entries.clone() +} + +// EntriesLen returns the number of entries in the wallet +func (w *DeterministicWallet) EntriesLen() int { + return len(w.Entries) +} + +// GetEntryAt returns entry at a given index in the entries array +func (w *DeterministicWallet) GetEntryAt(i int) Entry { + return w.Entries[i] +} + +// GetEntry returns entry of given address +func (w *DeterministicWallet) GetEntry(a cipher.Address) (Entry, bool) { + return w.Entries.get(a) +} + +// HasEntry returns true if the wallet has an Entry with a given cipher.Address. +func (w *DeterministicWallet) HasEntry(a cipher.Address) bool { + return w.Entries.has(a) +} + +// GenerateAddresses generates addresses +func (w *DeterministicWallet) GenerateAddresses(num uint64) ([]cipher.Addresser, error) { + if w.Meta.IsEncrypted() { + return nil, ErrWalletEncrypted + } + + if num == 0 { + return nil, nil + } + + var seckeys []cipher.SecKey + var seed []byte + if len(w.Entries) == 0 { + seed, seckeys = cipher.MustGenerateDeterministicKeyPairsSeed([]byte(w.Meta.Seed()), int(num)) + } else { + sd, err := hex.DecodeString(w.Meta.LastSeed()) + if err != nil { + return nil, fmt.Errorf("decode hex seed failed: %v", err) + } + seed, seckeys = cipher.MustGenerateDeterministicKeyPairsSeed(sd, int(num)) + } + + w.Meta.setLastSeed(hex.EncodeToString(seed)) + + addrs := make([]cipher.Addresser, len(seckeys)) + makeAddress := w.Meta.AddressConstructor() + for i, s := range seckeys { + p := cipher.MustPubKeyFromSecKey(s) + a := makeAddress(p) + addrs[i] = a + w.Entries = append(w.Entries, Entry{ + Address: a, + Secret: s, + Public: p, + }) + } + return addrs, nil +} + +// GenerateSkycoinAddresses generates Skycoin addresses. If the wallet's coin type is not Skycoin, returns an error +func (w *DeterministicWallet) GenerateSkycoinAddresses(num uint64) ([]cipher.Address, error) { + if w.Meta.Coin() != CoinTypeSkycoin { + return nil, errors.New("GenerateSkycoinAddresses called for non-skycoin wallet") + } + + addrs, err := w.GenerateAddresses(num) + if err != nil { + return nil, err + } + + skyAddrs := make([]cipher.Address, len(addrs)) + for i, a := range addrs { + skyAddrs[i] = a.(cipher.Address) + } + + return skyAddrs, nil +} + +// reset resets the wallet entries and move the lastSeed to origin +func (w *DeterministicWallet) reset() { + w.Entries = Entries{} + w.Meta.setLastSeed(w.Meta.Seed()) +} + +// ScanAddresses scans ahead N addresses, truncating up to the highest address with any transaction history. +func (w *DeterministicWallet) ScanAddresses(scanN uint64, tf TransactionsFinder) error { + if w.Meta.IsEncrypted() { + return ErrWalletEncrypted + } + + if scanN == 0 { + return nil + } + + w2 := w.Clone().(*DeterministicWallet) + + nExistingAddrs := uint64(len(w2.Entries)) + nAddAddrs := uint64(0) + n := scanN + extraScan := uint64(0) + + for { + // Generate the addresses to scan + addrs, err := w2.GenerateSkycoinAddresses(n) + if err != nil { + return err + } + + // Find if these addresses had any activity + active, err := tf.AddressesActivity(addrs) + if err != nil { + return err + } + + // Check activity from the last one until we find the address that has activity + var keepNum uint64 + for i := len(active) - 1; i >= 0; i-- { + if active[i] { + keepNum = uint64(i + 1) + break + } + } + + if keepNum == 0 { + break + } + + nAddAddrs += keepNum + extraScan + + // extraScan is the number of addresses with no activity beyond the + // last address with activity + extraScan = n - keepNum + + // n is the number of addresses to scan the next iteration + n = scanN - extraScan + } + + // Regenerate addresses up to nExistingAddrs + nAddAddrs. + // This is necessary to keep the lastSeed updated. + w2.reset() + if _, err := w2.GenerateSkycoinAddresses(nExistingAddrs + nAddAddrs); err != nil { + return err + } + + *w = *w2 + + return nil +} + +// Fingerprint returns a unique ID fingerprint for this wallet, composed of its initial address +// and wallet type +func (w *DeterministicWallet) Fingerprint() string { + addr := "" + if len(w.Entries) == 0 { + if !w.IsEncrypted() { + _, pk, _ := cipher.MustDeterministicKeyPairIterator([]byte(w.Meta.Seed())) + addr = w.Meta.AddressConstructor()(pk).String() + } + } else { + addr = w.Entries[0].Address.String() + } + return fmt.Sprintf("%s-%s", w.Type(), addr) +} + +// ReadableDeterministicWallet used for [de]serialization of a deterministic wallet +type ReadableDeterministicWallet struct { + Meta `json:"meta"` + ReadableEntries `json:"entries"` +} + +// LoadReadableDeterministicWallet loads a deterministic wallet from disk +func LoadReadableDeterministicWallet(wltFile string) (*ReadableDeterministicWallet, error) { + var rw ReadableDeterministicWallet + if err := file.LoadJSON(wltFile, &rw); err != nil { + return nil, err + } + if rw.Type() != WalletTypeDeterministic { + return nil, ErrInvalidWalletType + } + return &rw, nil +} + +// NewReadableDeterministicWallet creates readable wallet +func NewReadableDeterministicWallet(w *DeterministicWallet) *ReadableDeterministicWallet { + return &ReadableDeterministicWallet{ + Meta: w.Meta.clone(), + ReadableEntries: newReadableEntries(w.Entries, w.Meta.Coin(), w.Meta.Type()), + } +} + +// ToWallet convert readable wallet to Wallet +func (rw *ReadableDeterministicWallet) ToWallet() (Wallet, error) { + w := &DeterministicWallet{ + Meta: rw.Meta.clone(), + } + + if err := w.Validate(); err != nil { + err := fmt.Errorf("invalid wallet %q: %v", w.Filename(), err) + logger.WithError(err).Error("ReadableDeterministicWallet.ToWallet Validate failed") + return nil, err + } + + ets, err := rw.ReadableEntries.toWalletEntries(w.Meta.Coin(), w.Meta.Type(), w.Meta.IsEncrypted()) + if err != nil { + logger.WithError(err).Error("ReadableDeterministicWallet.ToWallet toWalletEntries failed") + return nil, err + } + + w.Entries = ets + + return w, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/entry.go b/vendor/github.com/SkycoinProject/skycoin/src/wallet/entry.go new file mode 100644 index 00000000..a207f4fb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/entry.go @@ -0,0 +1,126 @@ +package wallet + +import ( + "encoding/hex" + "errors" + "fmt" + + "github.com/SkycoinProject/skycoin/src/cipher" +) + +// Entry represents the wallet entry +type Entry struct { + Address cipher.Addresser + Public cipher.PubKey + Secret cipher.SecKey + ChildNumber uint32 // For bip32/bip44 + Change uint32 // For bip44 +} + +// SkycoinAddress returns the Skycoin address of an entry. Panics if Address is not a Skycoin address +func (we Entry) SkycoinAddress() cipher.Address { + return we.Address.(cipher.Address) +} + +// BitcoinAddress returns the Skycoin address of an entry. Panics if Address is not a Bitcoin address +func (we Entry) BitcoinAddress() cipher.BitcoinAddress { + return we.Address.(cipher.BitcoinAddress) +} + +// Verify checks that the public key is derivable from the secret key, +// and that the public key is associated with the address +func (we *Entry) Verify() error { + pk, err := cipher.PubKeyFromSecKey(we.Secret) + if err != nil { + return err + } + + if pk != we.Public { + return errors.New("invalid public key for secret key") + } + + return we.VerifyPublic() +} + +// VerifyPublic checks that the public key is associated with the address +func (we *Entry) VerifyPublic() error { + if err := we.Public.Verify(); err != nil { + return err + } + return we.Address.Verify(we.Public) +} + +// Entries are an array of wallet entries +type Entries []Entry + +func (entries Entries) clone() Entries { + if len(entries) == 0 { + return nil + } + return append(Entries{}, entries...) +} + +func (entries Entries) has(a cipher.Address) bool { + // This doesn't use getEntry() to avoid copying an Entry in the return value, + // which may contain a secret key + for _, e := range entries { + if e.SkycoinAddress() == a { + return true + } + } + return false +} + +func (entries Entries) get(a cipher.Address) (Entry, bool) { + for _, e := range entries { + if e.SkycoinAddress() == a { + return e, true + } + } + return Entry{}, false +} + +func (entries Entries) getSkycoinAddresses() []cipher.Address { + addrs := make([]cipher.Address, len(entries)) + for i, e := range entries { + addrs[i] = e.SkycoinAddress() + } + return addrs +} + +func (entries Entries) getAddresses() []cipher.Addresser { + addrs := make([]cipher.Addresser, len(entries)) + for i, e := range entries { + addrs[i] = e.Address + } + return addrs +} + +// eraseEntries wipes private keys in entries +func (entries Entries) erase() { + for i := range entries { + for j := range entries[i].Secret { + entries[i].Secret[j] = 0 + } + entries[i].Secret = cipher.SecKey{} + } +} + +// unpackSecretKeys for each entry, look for the secret key in the Secrets dict, keyed by address +func (entries Entries) unpackSecretKeys(ss Secrets) error { + for i, e := range entries { + sstr, ok := ss.get(e.Address.String()) + if !ok { + return fmt.Errorf("secret of address %s doesn't exist in secrets", e.Address) + } + + s, err := hex.DecodeString(sstr) + if err != nil { + return fmt.Errorf("decode secret hex string failed: %v", err) + } + + copy(entries[i].Secret[:], s[:]) + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/meta.go b/vendor/github.com/SkycoinProject/skycoin/src/wallet/meta.go new file mode 100644 index 00000000..10f878aa --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/meta.go @@ -0,0 +1,357 @@ +package wallet + +import ( + "errors" + "fmt" + "strconv" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/bip39" + "github.com/SkycoinProject/skycoin/src/cipher/bip44" +) + +// wallet meta fields +const ( + metaVersion = "version" // wallet version + metaFilename = "filename" // wallet file name + metaLabel = "label" // wallet label + metaTimestamp = "tm" // the timestamp when creating the wallet + metaType = "type" // wallet type + metaCoin = "coin" // coin type + metaEncrypted = "encrypted" // whether the wallet is encrypted + metaCryptoType = "cryptoType" // encrytion/decryption type + metaSeed = "seed" // wallet seed + metaLastSeed = "lastSeed" // seed for generating next address [deterministic wallets] + metaSecrets = "secrets" // secrets which records the encrypted seeds and secrets of address entries + metaBip44Coin = "bip44Coin" // bip44 coin type + metaSeedPassphrase = "seedPassphrase" // seed passphrase [bip44 wallets] + metaXPub = "xpub" // xpub key [xpub wallets] +) + +// Meta holds wallet metadata +type Meta map[string]string + +func (m Meta) clone() Meta { + mm := make(Meta, len(m)) + for k, v := range m { + mm[k] = v + } + return mm +} + +// erase wipes the seed and last seed +func (m Meta) eraseSeeds() { + m.setSeed("") + m.setLastSeed("") + m.setSeedPassphrase("") +} + +// validate validates the wallet +func (m Meta) validate() error { + if fn := m[metaFilename]; fn == "" { + return errors.New("filename not set") + } + + if tm := m[metaTimestamp]; tm != "" { + _, err := strconv.ParseInt(tm, 10, 64) + if err != nil { + return errors.New("invalid timestamp") + } + } + + walletType, ok := m[metaType] + if !ok { + return errors.New("type field not set") + } + if !IsValidWalletType(walletType) { + return ErrInvalidWalletType + } + + if coinType := m[metaCoin]; coinType == "" { + return errors.New("coin field not set") + } + + var isEncrypted bool + if encStr, ok := m[metaEncrypted]; ok { + // validate the encrypted value + var err error + isEncrypted, err = strconv.ParseBool(encStr) + if err != nil { + return errors.New("encrypted field is not a valid bool") + } + } + + if isEncrypted { + cryptoType, ok := m[metaCryptoType] + if !ok { + return errors.New("crypto type field not set") + } + + if _, err := getCrypto(CryptoType(cryptoType)); err != nil { + return errors.New("unknown crypto type") + } + + if s := m[metaSecrets]; s == "" { + return errors.New("wallet is encrypted, but secrets field not set") + } + + if s := m[metaSeed]; s != "" { + return errors.New("seed should not be visible in encrypted wallets") + } + + if s := m[metaLastSeed]; s != "" { + return errors.New("lastSeed should not be visible in encrypted wallets") + } + } else { + if s := m[metaSecrets]; s != "" { + return errors.New("secrets should not be in unencrypted wallets") + } + } + + switch walletType { + case WalletTypeCollection: + if s := m[metaSeed]; s != "" { + return errors.New("seed should not be in collection wallets") + } + + if s := m[metaLastSeed]; s != "" { + return errors.New("lastSeed should not be in collection wallets") + } + case WalletTypeDeterministic: + if !isEncrypted { + if s := m[metaSeed]; s == "" { + return errors.New("seed missing in unencrypted deterministic wallet") + } + + if s := m[metaLastSeed]; s == "" { + return errors.New("lastSeed missing in unencrypted deterministic wallet") + } + } + case WalletTypeBip44: + if !isEncrypted { + // bip44 wallet seeds must be a valid bip39 mnemonic + if s := m[metaSeed]; s == "" { + return errors.New("seed missing in unencrypted bip44 wallet") + } else if err := bip39.ValidateMnemonic(s); err != nil { + return err + } + } + + if s := m[metaBip44Coin]; s == "" { + return errors.New("bip44Coin missing") + } else if _, err := strconv.ParseUint(s, 10, 32); err != nil { + return fmt.Errorf("bip44Coin invalid: %v", err) + } + + if s := m[metaLastSeed]; s != "" { + return errors.New("lastSeed should not be in bip44 wallets") + } + case WalletTypeXPub: + if s := m[metaSeed]; s != "" { + return errors.New("seed should not be in xpub wallets") + } + + if s := m[metaLastSeed]; s != "" { + return errors.New("lastSeed should not be in xpub wallets") + } + default: + return errors.New("unhandled wallet type") + } + + if m[metaXPub] != "" && walletType != WalletTypeXPub { + return errors.New("xpub is only used for xpub wallets") + } + + return nil +} + +// Find returns a key value from the metadata map +func (m Meta) Find(k string) string { + return m[k] +} + +// Type gets the wallet type +func (m Meta) Type() string { + return m[metaType] +} + +// Version gets the wallet version +func (m Meta) Version() string { + return m[metaVersion] +} + +// SetVersion sets the wallet version +func (m Meta) SetVersion(v string) { + m[metaVersion] = v +} + +// Filename gets the wallet filename +func (m Meta) Filename() string { + return m[metaFilename] +} + +// SetFilename sets the wallet filename +func (m Meta) SetFilename(fn string) { + m[metaFilename] = fn +} + +// Label gets the wallet label +func (m Meta) Label() string { + return m[metaLabel] +} + +// SetLabel sets the wallet label +func (m Meta) SetLabel(label string) { + m[metaLabel] = label +} + +// LastSeed returns the last seed +func (m Meta) LastSeed() string { + return m[metaLastSeed] +} + +func (m Meta) setLastSeed(lseed string) { + m[metaLastSeed] = lseed +} + +// Seed returns the seed +func (m Meta) Seed() string { + return m[metaSeed] +} + +func (m Meta) setSeed(seed string) { + m[metaSeed] = seed +} + +// SeedPassphrase returns the seed passphrase +func (m Meta) SeedPassphrase() string { + return m[metaSeedPassphrase] +} + +func (m Meta) setSeedPassphrase(p string) { + m[metaSeedPassphrase] = p +} + +// Coin returns the wallet's coin type +func (m Meta) Coin() CoinType { + return CoinType(m[metaCoin]) +} + +// SetCoin sets the wallet's coin type +func (m Meta) SetCoin(ct CoinType) { + m[metaCoin] = string(ct) +} + +// Bip44Coin returns the bip44 coin type +func (m Meta) Bip44Coin() bip44.CoinType { + c := m[metaBip44Coin] + if c == "" { + logger.Critical().Error("wallet.Meta.Bip44Coin() is empty") + return bip44.CoinType(0) + } + + x, err := strconv.ParseUint(c, 10, 32) + if err != nil { + logger.WithError(err).Panic() + } + + return bip44.CoinType(x) +} + +func (m Meta) setBip44Coin(ct bip44.CoinType) { + m[metaBip44Coin] = strconv.FormatUint(uint64(ct), 10) +} + +func (m Meta) setIsEncrypted(encrypt bool) { + m[metaEncrypted] = strconv.FormatBool(encrypt) +} + +// SetEncrypted sets encryption fields +func (m Meta) SetEncrypted(cryptoType CryptoType, encryptedSecrets string) { + m.setCryptoType(cryptoType) + m.setSecrets(encryptedSecrets) + m.setIsEncrypted(true) +} + +// SetDecrypted unsets encryption fields +func (m Meta) SetDecrypted() { + m.setIsEncrypted(false) + m.setSecrets("") + m.setCryptoType("") +} + +// IsEncrypted checks whether the wallet is encrypted. +func (m Meta) IsEncrypted() bool { + encStr, ok := m[metaEncrypted] + if !ok { + return false + } + + b, err := strconv.ParseBool(encStr) + if err != nil { + // This can't happen, the meta.encrypted value is either set by + // setEncrypted() method or converted in ReadableWallet.toWallet(). + // toWallet() method will throw error if the meta.encrypted string is invalid. + logger.Critical().WithError(err).Error("parse wallet.meta.encrypted string failed") + return false + } + return b +} + +func (m Meta) setCryptoType(tp CryptoType) { + m[metaCryptoType] = string(tp) +} + +// CryptoType returns the encryption type +func (m Meta) CryptoType() CryptoType { + return CryptoType(m[metaCryptoType]) +} + +// Secrets returns the encrypted wallet secrets +func (m Meta) Secrets() string { + return m[metaSecrets] +} + +func (m Meta) setSecrets(s string) { + m[metaSecrets] = s +} + +// Timestamp returns the timestamp +func (m Meta) Timestamp() int64 { + // Intentionally ignore the error when parsing the timestamp, + // if it isn't valid or is missing it will be set to 0. + // Also, this value is validated by wallet.validate() + x, _ := strconv.ParseInt(m[metaTimestamp], 10, 64) //nolint:errcheck + return x +} + +// SetTimestamp sets the timestamp +func (m Meta) SetTimestamp(t int64) { + m[metaTimestamp] = strconv.FormatInt(t, 10) +} + +// AddressConstructor returns a function to create a cipher.Addresser from a cipher.PubKey +func (m Meta) AddressConstructor() func(cipher.PubKey) cipher.Addresser { + switch m.Coin() { + case CoinTypeSkycoin: + return func(pk cipher.PubKey) cipher.Addresser { + return cipher.AddressFromPubKey(pk) + } + case CoinTypeBitcoin: + return func(pk cipher.PubKey) cipher.Addresser { + return cipher.BitcoinAddressFromPubKey(pk) + } + default: + logger.Panicf("Invalid wallet coin type %q", m.Coin()) + return nil + } +} + +func (m Meta) setXPub(xpub string) { + m[metaXPub] = xpub +} + +// XPub returns the wallet's configured XPub key +func (m Meta) XPub() string { + return m[metaXPub] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/readable.go b/vendor/github.com/SkycoinProject/skycoin/src/wallet/readable.go new file mode 100644 index 00000000..4ea78cd7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/readable.go @@ -0,0 +1,200 @@ +package wallet + +import ( + "errors" + "fmt" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/bip44" +) + +// ReadableEntry wallet entry with json tags +type ReadableEntry struct { + Address string `json:"address"` + Public string `json:"public_key"` + Secret string `json:"secret_key"` + ChildNumber *uint32 `json:"child_number,omitempty"` // For bip32/bip44 + Change *uint32 `json:"change,omitempty"` // For bip44 +} + +// NewReadableEntry creates readable wallet entry +func NewReadableEntry(coinType CoinType, walletType string, e Entry) ReadableEntry { + re := ReadableEntry{} + if !e.Address.Null() { + re.Address = e.Address.String() + } + + if !e.Public.Null() { + re.Public = e.Public.Hex() + } + + if !e.Secret.Null() { + switch coinType { + case CoinTypeSkycoin: + re.Secret = e.Secret.Hex() + case CoinTypeBitcoin: + re.Secret = cipher.BitcoinWalletImportFormatFromSeckey(e.Secret) + default: + logger.Panicf("Invalid coin type %q", coinType) + } + } + + switch walletType { + case WalletTypeBip44: + cn := e.ChildNumber + re.ChildNumber = &cn + change := e.Change + re.Change = &change + case WalletTypeXPub: + cn := e.ChildNumber + re.ChildNumber = &cn + if e.Change != 0 { + logger.Panicf("wallet.Entry.Change is not 0 but wallet type is %q", walletType) + } + default: + if e.ChildNumber != 0 { + logger.Panicf("wallet.Entry.ChildNumber is not 0 but wallet type is %q", walletType) + } + if e.Change != 0 { + logger.Panicf("wallet.Entry.Change is not 0 but wallet type is %q", walletType) + } + } + + return re +} + +// ReadableEntries array of ReadableEntry +type ReadableEntries []ReadableEntry + +func newReadableEntries(entries Entries, coinType CoinType, walletType string) ReadableEntries { + re := make(ReadableEntries, len(entries)) + for i, e := range entries { + re[i] = NewReadableEntry(coinType, walletType, e) + } + return re +} + +// GetEntries returns this array +func (res ReadableEntries) GetEntries() ReadableEntries { + return res +} + +// toWalletEntries convert readable entries to entries +// converts base on the wallet version. +func (res ReadableEntries) toWalletEntries(coinType CoinType, walletType string, isEncrypted bool) ([]Entry, error) { + entries := make([]Entry, len(res)) + for i, re := range res { + e, err := newEntryFromReadable(coinType, walletType, &re) + if err != nil { + return []Entry{}, err + } + + // Verify the wallet if it's not encrypted + if !isEncrypted && re.Secret != "" { + if err := e.Verify(); err != nil { + return nil, err + } + } + + entries[i] = *e + } + return entries, nil +} + +// newEntryFromReadable creates WalletEntry base one ReadableWalletEntry +func newEntryFromReadable(coinType CoinType, walletType string, re *ReadableEntry) (*Entry, error) { + var a cipher.Addresser + var err error + + switch coinType { + case CoinTypeSkycoin: + a, err = cipher.DecodeBase58Address(re.Address) + case CoinTypeBitcoin: + a, err = cipher.DecodeBase58BitcoinAddress(re.Address) + default: + logger.Panicf("Invalid coin type %q", coinType) + } + + if err != nil { + return nil, err + } + + p, err := cipher.PubKeyFromHex(re.Public) + if err != nil { + return nil, err + } + + // Decodes the secret hex string if any + var secret cipher.SecKey + if re.Secret != "" { + switch coinType { + case CoinTypeSkycoin: + secret, err = cipher.SecKeyFromHex(re.Secret) + case CoinTypeBitcoin: + secret, err = cipher.SecKeyFromBitcoinWalletImportFormat(re.Secret) + default: + logger.Panicf("Invalid coin type %q", coinType) + } + if err != nil { + return nil, err + } + } + + var childNumber uint32 + var change uint32 + switch walletType { + case WalletTypeBip44: + if re.ChildNumber == nil { + return nil, fmt.Errorf("child_number required for %q wallet type", walletType) + } + if re.Change == nil { + return nil, fmt.Errorf("change required for %q wallet type", walletType) + } + + childNumber = *re.ChildNumber + change = *re.Change + + switch change { + case bip44.ExternalChainIndex, bip44.ChangeChainIndex: + default: + return nil, errors.New("change must be either 0 or 1") + } + + case WalletTypeXPub: + if re.ChildNumber == nil { + return nil, fmt.Errorf("child_number required for %q wallet type", walletType) + } + + childNumber = *re.ChildNumber + + if re.Change != nil { + return nil, fmt.Errorf("change should not be set for %q wallet type", walletType) + } + + default: + if re.ChildNumber != nil { + return nil, fmt.Errorf("child_number should not be set for %q wallet type", walletType) + } + if re.Change != nil { + return nil, fmt.Errorf("change should not be set for %q wallet type", walletType) + } + } + + return &Entry{ + Address: a, + Public: p, + Secret: secret, + ChildNumber: childNumber, + Change: change, + }, nil +} + +// Readable defines the readable wallet API. +// A readable wallet is the on-disk representation of a wallet. +type Readable interface { + ToWallet() (Wallet, error) + Timestamp() int64 + SetFilename(string) + Filename() string + GetEntries() ReadableEntries +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/secrets.go b/vendor/github.com/SkycoinProject/skycoin/src/wallet/secrets.go new file mode 100644 index 00000000..a1769eba --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/secrets.go @@ -0,0 +1,36 @@ +package wallet + +import "encoding/json" + +const ( + secretSeed = "seed" + secretLastSeed = "lastSeed" + secretSeedPassphrase = "seedPassphrase" +) + +// Secrets hold secret data, to be encrypted +type Secrets map[string]string + +func (s Secrets) get(key string) (string, bool) { + v, ok := s[key] + return v, ok +} + +func (s Secrets) set(key, v string) { + s[key] = v +} + +func (s Secrets) serialize() ([]byte, error) { + return json.Marshal(s) +} + +func (s Secrets) deserialize(data []byte) error { + return json.Unmarshal(data, &s) +} + +func (s Secrets) erase() { + for k := range s { + s[k] = "" + delete(s, k) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/service.go b/vendor/github.com/SkycoinProject/skycoin/src/wallet/service.go new file mode 100644 index 00000000..3ad38bdd --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/service.go @@ -0,0 +1,616 @@ +package wallet + +import ( + "fmt" + "os" + "path/filepath" + "sync" + + "github.com/sirupsen/logrus" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/bip44" + "github.com/SkycoinProject/skycoin/src/util/file" +) + +// TransactionsFinder interface for finding address related transaction hashes +type TransactionsFinder interface { + AddressesActivity(addrs []cipher.Address) ([]bool, error) +} + +// Service wallet service struct +type Service struct { + sync.RWMutex + wallets Wallets + config Config + // fingerprints is used to check for duplicate deterministic wallets + fingerprints map[string]string +} + +// Config wallet service config +type Config struct { + WalletDir string + CryptoType CryptoType + EnableWalletAPI bool + EnableSeedAPI bool + Bip44Coin *bip44.CoinType +} + +// NewConfig creates a default Config +func NewConfig() Config { + bc := bip44.CoinTypeSkycoin + return Config{ + WalletDir: "./", + CryptoType: DefaultCryptoType, + EnableWalletAPI: false, + EnableSeedAPI: false, + Bip44Coin: &bc, + } +} + +// NewService new wallet service +func NewService(c Config) (*Service, error) { + serv := &Service{ + config: c, + fingerprints: make(map[string]string), + } + + if !serv.config.EnableWalletAPI { + return serv, nil + } + + if err := os.MkdirAll(c.WalletDir, os.FileMode(0700)); err != nil { + return nil, fmt.Errorf("failed to create wallet directory %s: %v", c.WalletDir, err) + } + + // Removes .wlt.bak files before loading wallets + if err := removeBackupFiles(serv.config.WalletDir); err != nil { + return nil, fmt.Errorf("remove .wlt.bak files in %v failed: %v", serv.config.WalletDir, err) + } + + // Load all wallets from disk + w, err := loadWallets(serv.config.WalletDir) + if err != nil { + return nil, fmt.Errorf("failed to load all wallets: %v", err) + } + + // Abort if there are duplicate wallets (identified by fingerprint) on disk + if wltID, fp, hasDup := w.containsDuplicate(); hasDup { + return nil, fmt.Errorf("duplicate wallet found with fingerprint %s in file %q", fp, wltID) + } + + // Abort if there are empty deterministic wallets on disk + if wltID, hasEmpty := w.containsEmpty(); hasEmpty { + return nil, fmt.Errorf("empty wallet file found: %q", wltID) + } + + serv.setWallets(w) + + fields := logrus.Fields{ + "walletDir": serv.config.WalletDir, + } + if serv.config.Bip44Coin != nil { + fields["bip44Coin"] = *serv.config.Bip44Coin + } + logger.WithFields(fields).Debug("wallet.NewService complete") + + return serv, nil +} + +// WalletDir returns the configured wallet directory +func (serv *Service) WalletDir() (string, error) { + serv.Lock() + defer serv.Unlock() + if !serv.config.EnableWalletAPI { + return "", ErrWalletAPIDisabled + } + return serv.config.WalletDir, nil +} + +func (serv *Service) updateOptions(opts Options) Options { + // Apply service-configured default settings for wallet options + if opts.Encrypt && opts.CryptoType == "" { + opts.CryptoType = serv.config.CryptoType + } + if opts.Type == WalletTypeBip44 && opts.Bip44Coin == nil && serv.config.Bip44Coin != nil { + c := *serv.config.Bip44Coin + opts.Bip44Coin = &c + } + return opts +} + +// CreateWallet creates a wallet with the given wallet file name and options. +// A address will be automatically generated by default. +func (serv *Service) CreateWallet(wltName string, options Options, tf TransactionsFinder) (Wallet, error) { + serv.Lock() + defer serv.Unlock() + if !serv.config.EnableWalletAPI { + return nil, ErrWalletAPIDisabled + } + if wltName == "" { + wltName = serv.generateUniqueWalletFilename() + } + + options = serv.updateOptions(options) + return serv.loadWallet(wltName, options, tf) +} + +// loadWallet loads wallet from seed and scan the first N addresses +func (serv *Service) loadWallet(wltName string, options Options, tf TransactionsFinder) (Wallet, error) { + options = serv.updateOptions(options) + w, err := NewWalletScanAhead(wltName, options, tf) + if err != nil { + return nil, err + } + + fingerprint := w.Fingerprint() + if fingerprint != "" { + if _, ok := serv.fingerprints[fingerprint]; ok { + // Note: collection wallets do not have fingerprints + switch w.Type() { + case WalletTypeDeterministic, WalletTypeBip44: + return nil, ErrSeedUsed + case WalletTypeXPub: + return nil, ErrXPubKeyUsed + default: + logger.WithFields(logrus.Fields{ + "walletType": w.Type(), + "fingerprint": fingerprint, + }).Panic("Unhandled wallet type after fingerprint conflict") + } + } + } + + if err := serv.wallets.add(w); err != nil { + return nil, err + } + + if err := Save(w, serv.config.WalletDir); err != nil { + // If save fails, remove the added wallet + serv.wallets.remove(w.Filename()) + return nil, err + } + + if fingerprint != "" { + serv.fingerprints[fingerprint] = w.Filename() + } + + return w.Clone(), nil +} + +func (serv *Service) generateUniqueWalletFilename() string { + wltName := NewWalletFilename() + for { + if w := serv.wallets.get(wltName); w == nil { + break + } + wltName = NewWalletFilename() + } + + return wltName +} + +// EncryptWallet encrypts wallet with password +func (serv *Service) EncryptWallet(wltID string, password []byte) (Wallet, error) { + serv.Lock() + defer serv.Unlock() + if !serv.config.EnableWalletAPI { + return nil, ErrWalletAPIDisabled + } + + w, err := serv.getWallet(wltID) + if err != nil { + return nil, err + } + + if w.IsEncrypted() { + return nil, ErrWalletEncrypted + } + + if err := Lock(w, password, serv.config.CryptoType); err != nil { + return nil, err + } + + // Save to disk first + if err := Save(w, serv.config.WalletDir); err != nil { + return nil, err + } + + // Sets the encrypted wallet + serv.wallets.set(w) + return w, nil +} + +// DecryptWallet decrypts wallet with password +func (serv *Service) DecryptWallet(wltID string, password []byte) (Wallet, error) { + serv.Lock() + defer serv.Unlock() + if !serv.config.EnableWalletAPI { + return nil, ErrWalletAPIDisabled + } + + w, err := serv.getWallet(wltID) + if err != nil { + return nil, err + } + + // Returns error if wallet is not encrypted + if !w.IsEncrypted() { + return nil, ErrWalletNotEncrypted + } + + // Unlocks the wallet + unlockWlt, err := Unlock(w, password) + if err != nil { + return nil, err + } + + // Updates the wallet file + if err := Save(unlockWlt, serv.config.WalletDir); err != nil { + return nil, err + } + + // Sets the decrypted wallet in memory + serv.wallets.set(unlockWlt) + return unlockWlt, nil +} + +// NewAddresses generate address entries in given wallet, +// return nil if wallet does not exist. +// Set password as nil if the wallet is not encrypted, otherwise the password must be provided. +func (serv *Service) NewAddresses(wltID string, password []byte, num uint64) ([]cipher.Address, error) { + serv.Lock() + defer serv.Unlock() + + if !serv.config.EnableWalletAPI { + return nil, ErrWalletAPIDisabled + } + + w, err := serv.getWallet(wltID) + if err != nil { + return nil, err + } + + var addrs []cipher.Address + f := func(wlt Wallet) error { + var err error + addrs, err = wlt.GenerateSkycoinAddresses(num) + return err + } + + if w.IsEncrypted() { + if err := GuardUpdate(w, password, f); err != nil { + return nil, err + } + } else { + if len(password) != 0 { + return nil, ErrWalletNotEncrypted + } + + if err := f(w); err != nil { + return nil, err + } + } + + // Checks if the wallet file is writable + wf := filepath.Join(serv.config.WalletDir, w.Filename()) + if !file.IsWritable(wf) { + return nil, ErrWalletPermission + } + + // Save the wallet first + if err := Save(w, serv.config.WalletDir); err != nil { + return nil, err + } + + serv.wallets.set(w) + + return addrs, nil +} + +// GetSkycoinAddresses returns all addresses in given wallet +func (serv *Service) GetSkycoinAddresses(wltID string) ([]cipher.Address, error) { + serv.RLock() + defer serv.RUnlock() + if !serv.config.EnableWalletAPI { + return nil, ErrWalletAPIDisabled + } + + w, err := serv.getWallet(wltID) + if err != nil { + return nil, err + } + + return w.GetSkycoinAddresses() +} + +// GetWallet returns wallet by id +func (serv *Service) GetWallet(wltID string) (Wallet, error) { + serv.RLock() + defer serv.RUnlock() + if !serv.config.EnableWalletAPI { + return nil, ErrWalletAPIDisabled + } + + return serv.getWallet(wltID) +} + +// returns the clone of the wallet of given id +func (serv *Service) getWallet(wltID string) (Wallet, error) { + w := serv.wallets.get(wltID) + if w == nil { + return nil, ErrWalletNotExist + } + return w.Clone(), nil +} + +// GetWallets returns all wallet clones +func (serv *Service) GetWallets() (Wallets, error) { + serv.RLock() + defer serv.RUnlock() + if !serv.config.EnableWalletAPI { + return nil, ErrWalletAPIDisabled + } + + wlts := make(Wallets, len(serv.wallets)) + for k, w := range serv.wallets { + wlts[k] = w.Clone() + } + return wlts, nil +} + +// UpdateWalletLabel updates the wallet label +func (serv *Service) UpdateWalletLabel(wltID, label string) error { + serv.Lock() + defer serv.Unlock() + if !serv.config.EnableWalletAPI { + return ErrWalletAPIDisabled + } + + w, err := serv.getWallet(wltID) + if err != nil { + return err + } + + w.SetLabel(label) + + if err := Save(w, serv.config.WalletDir); err != nil { + return err + } + + serv.wallets.set(w) + return nil +} + +// UnloadWallet removes wallet of given wallet id from the service +func (serv *Service) UnloadWallet(wltID string) error { + serv.Lock() + defer serv.Unlock() + if !serv.config.EnableWalletAPI { + return ErrWalletAPIDisabled + } + + wlt := serv.wallets.get(wltID) + if wlt != nil { + if fp := wlt.Fingerprint(); fp != "" { + delete(serv.fingerprints, fp) + } + } + + serv.wallets.remove(wltID) + return nil +} + +func (serv *Service) setWallets(wlts Wallets) { + serv.wallets = wlts + + for wltID, wlt := range wlts { + if fp := wlt.Fingerprint(); fp != "" { + serv.fingerprints[fp] = wltID + } + } +} + +// GetWalletSeed returns seed and seed passphrase of encrypted wallet of given wallet id +// Returns ErrWalletNotEncrypted if it's not encrypted +func (serv *Service) GetWalletSeed(wltID string, password []byte) (string, string, error) { + serv.RLock() + defer serv.RUnlock() + if !serv.config.EnableWalletAPI { + return "", "", ErrWalletAPIDisabled + } + + if !serv.config.EnableSeedAPI { + return "", "", ErrSeedAPIDisabled + } + + w, err := serv.getWallet(wltID) + if err != nil { + return "", "", err + } + + if !w.IsEncrypted() { + return "", "", ErrWalletNotEncrypted + } + + var seed, seedPassphrase string + if err := GuardView(w, password, func(wlt Wallet) error { + seed = wlt.Seed() + seedPassphrase = wlt.SeedPassphrase() + return nil + }); err != nil { + return "", "", err + } + + return seed, seedPassphrase, nil +} + +// UpdateSecrets opens a wallet for modification of secret data and saves it safely +func (serv *Service) UpdateSecrets(wltID string, password []byte, f func(Wallet) error) error { + serv.Lock() + defer serv.Unlock() + if !serv.config.EnableWalletAPI { + return ErrWalletAPIDisabled + } + + w, err := serv.getWallet(wltID) + if err != nil { + return err + } + + if w.IsEncrypted() { + if err := GuardUpdate(w, password, f); err != nil { + return err + } + } else if len(password) != 0 { + return ErrWalletNotEncrypted + } else { + if err := f(w); err != nil { + return err + } + } + + // Save the wallet first + if err := Save(w, serv.config.WalletDir); err != nil { + return err + } + + serv.wallets.set(w) + + return nil +} + +// Update opens a wallet for modification of non-secret data and saves it safely +func (serv *Service) Update(wltID string, f func(Wallet) error) error { + serv.Lock() + defer serv.Unlock() + if !serv.config.EnableWalletAPI { + return ErrWalletAPIDisabled + } + + w, err := serv.getWallet(wltID) + if err != nil { + return err + } + + if err := f(w); err != nil { + return err + } + + // Save the wallet first + if err := Save(w, serv.config.WalletDir); err != nil { + return err + } + + serv.wallets.set(w) + + return nil +} + +// ViewSecrets opens a wallet for reading secret data +func (serv *Service) ViewSecrets(wltID string, password []byte, f func(Wallet) error) error { + serv.RLock() + defer serv.RUnlock() + if !serv.config.EnableWalletAPI { + return ErrWalletAPIDisabled + } + + w, err := serv.getWallet(wltID) + if err != nil { + return err + } + + if w.IsEncrypted() { + return GuardView(w, password, f) + } else if len(password) != 0 { + return ErrWalletNotEncrypted + } else { + return f(w) + } +} + +// View opens a wallet for reading non-secret data +func (serv *Service) View(wltID string, f func(Wallet) error) error { + serv.RLock() + defer serv.RUnlock() + if !serv.config.EnableWalletAPI { + return ErrWalletAPIDisabled + } + + w, err := serv.getWallet(wltID) + if err != nil { + return err + } + + return f(w) +} + +// RecoverWallet recovers an encrypted wallet from seed. +// The recovered wallet will be encrypted with the new password, if provided. +func (serv *Service) RecoverWallet(wltName, seed, seedPassphrase string, password []byte) (Wallet, error) { + serv.Lock() + defer serv.Unlock() + if !serv.config.EnableWalletAPI { + return nil, ErrWalletAPIDisabled + } + + w, err := serv.getWallet(wltName) + if err != nil { + return nil, err + } + + if !w.IsEncrypted() { + return nil, ErrWalletNotEncrypted + } + + switch w.Type() { + case WalletTypeDeterministic, WalletTypeBip44: + default: + return nil, ErrWalletTypeNotRecoverable + } + + // Create a wallet from this seed and compare the fingerprint + w2, err := NewWallet(wltName, Options{ + Type: w.Type(), + Coin: w.Coin(), + Seed: seed, + SeedPassphrase: seedPassphrase, + GenerateN: 1, + }) + if err != nil { + err = NewError(fmt.Errorf("RecoverWallet failed to create temporary wallet for fingerprint comparison: %v", err)) + logger.Critical().WithError(err).Error() + return nil, err + } + if w.Fingerprint() != w2.Fingerprint() { + return nil, ErrWalletRecoverSeedWrong + } + + // Create a new wallet with the same number of addresses, encrypting if needed + w3, err := NewWallet(wltName, Options{ + Type: w.Type(), + Coin: w.Coin(), + Label: w.Label(), + Seed: seed, + SeedPassphrase: seedPassphrase, + Encrypt: len(password) != 0, + Password: password, + CryptoType: w.CryptoType(), + GenerateN: uint64(w.EntriesLen()), + }) + if err != nil { + return nil, err + } + + // Preserve the timestamp of the old wallet + w3.SetTimestamp(w.Timestamp()) + + // Save to disk + if err := Save(w3, serv.config.WalletDir); err != nil { + return nil, err + } + + serv.wallets.set(w3) + + return w3.Clone(), nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/service_test.go b/vendor/github.com/SkycoinProject/skycoin/src/wallet/service_test.go new file mode 100644 index 00000000..e0cbb827 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/service_test.go @@ -0,0 +1,3780 @@ +package wallet + +import ( + "encoding/hex" + "fmt" + "io" + "io/ioutil" + "os" + "path/filepath" + "strings" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/bip39" + "github.com/SkycoinProject/skycoin/src/testutil" +) + +func prepareWltDir() string { + dir, err := ioutil.TempDir("", "wallets") + if err != nil { + panic(err) + } + + return dir +} + +func dirIsEmpty(t *testing.T, dir string) { + f, err := os.Open(dir) + require.NoError(t, err) + names, err := f.Readdirnames(1) + require.Equal(t, io.EOF, err) + require.Empty(t, names) +} + +func TestNewService(t *testing.T) { + for ct := range cryptoTable { + t.Run(fmt.Sprintf("crypto=%v", ct), func(t *testing.T) { + dir := prepareWltDir() + s, err := NewService(Config{ + WalletDir: dir, + CryptoType: ct, + EnableWalletAPI: true, + }) + require.NoError(t, err) + + // check if the wallet dir is created + _, err = os.Stat(dir) + require.NoError(t, err) + + require.Equal(t, dir, s.config.WalletDir) + + require.Equal(t, 0, len(s.wallets)) + + // test load wallets + s, err = NewService(Config{ + WalletDir: "./testdata", + CryptoType: ct, + EnableWalletAPI: true, + }) + require.NoError(t, err) + + require.Equal(t, 11, len(s.wallets)) + + }) + } +} + +func TestNewServiceDupWallets(t *testing.T) { + _, err := NewService(Config{ + WalletDir: "./testdata/duplicate_wallets", + EnableWalletAPI: true, + }) + require.NotNil(t, err) + require.Error(t, err) + require.True(t, strings.HasPrefix(err.Error(), "duplicate wallet found with fingerprint deterministic-2M755W9o7933roLASK9PZTmqRsjQUsVen9y in file"), err.Error()) +} + +func TestNewServiceEmptyWallet(t *testing.T) { + cases := []struct { + dir string + fn string + }{ + { + dir: "./testdata/empty_wallet", + fn: "empty.wlt", + }, + { + dir: "./testdata/empty_bip44_wallet", + fn: "empty.wlt", + }, + } + + for _, tc := range cases { + t.Run(filepath.Join(tc.dir, tc.fn), func(t *testing.T) { + _, err := NewService(Config{ + WalletDir: tc.dir, + EnableWalletAPI: true, + }) + testutil.RequireError(t, err, fmt.Sprintf("empty wallet file found: %q", tc.fn)) + }) + } +} + +func TestServiceCreateWallet(t *testing.T) { + tt := []struct { + name string + encrypt bool + password []byte + enableWalletAPI bool + walletType string + filename string + seed string + xpub string + err error + }{ + { + name: "type=xpub encrypt=true password=pwd", + encrypt: true, + password: []byte("pwd"), + enableWalletAPI: true, + walletType: WalletTypeXPub, + filename: "t1.wlt", + xpub: "xpub6EFYYRQeAbWLdWQYbtQv8HnemieKNmYUE23RmwphgtMLjz4UaStKADSKNoSSXM5FDcq4gZec2q6n7kdNWfuMdScxK1cXm8tR37kaitHtvuJ", + }, + { + name: "type=collection encrypt=true password=pwd", + encrypt: true, + password: []byte("pwd"), + enableWalletAPI: true, + walletType: WalletTypeCollection, + filename: "t1.wlt", + }, + { + name: "type=bip44 encrypt=true password=pwd", + encrypt: true, + password: []byte("pwd"), + enableWalletAPI: true, + walletType: WalletTypeBip44, + filename: "t1.wlt", + seed: "voyage say extend find sheriff surge priority merit ignore maple cash argue", + }, + { + name: "encrypt=true password=pwd", + encrypt: true, + password: []byte("pwd"), + enableWalletAPI: true, + filename: "t1.wlt", + seed: "seed1", + walletType: WalletTypeDeterministic, + }, + { + name: "encrypt=true password=pwd", + encrypt: true, + password: []byte("pwd"), + enableWalletAPI: false, + filename: "t1.wlt", + seed: "seed1", + err: ErrWalletAPIDisabled, + walletType: WalletTypeDeterministic, + }, + { + name: "encrypt=false", + encrypt: false, + enableWalletAPI: true, + filename: "t1.wlt", + seed: "seed1", + walletType: WalletTypeDeterministic, + }, + { + name: "encrypt=false", + encrypt: false, + enableWalletAPI: false, + filename: "t1.wlt", + seed: "seed1", + err: ErrWalletAPIDisabled, + walletType: WalletTypeDeterministic, + }, + } + for _, tc := range tt { + for ct := range cryptoTable { + t.Run(fmt.Sprintf("%v crypto=%v", tc.name, ct), func(t *testing.T) { + dir := prepareWltDir() + s, err := NewService(Config{ + WalletDir: dir, + CryptoType: ct, + EnableWalletAPI: tc.enableWalletAPI, + }) + require.NoError(t, err) + + w, err := s.CreateWallet(tc.filename, Options{ + Seed: tc.seed, + Encrypt: tc.encrypt, + Password: tc.password, + Type: tc.walletType, + XPub: tc.xpub, + }, nil) + + if tc.err == nil { + require.NoError(t, err) + } else { + require.Error(t, err) + require.Equal(t, tc.err, err, "%s != %s", tc.err.Error(), err.Error()) + return + } + + require.NoError(t, err) + require.Equal(t, w.IsEncrypted(), tc.encrypt) + if tc.encrypt { + require.NotEmpty(t, w.Secrets()) + checkNoSensitiveData(t, w) + + // Checks the wallet file doesn't contain sensitive data + lw, err := Load(filepath.Join(dir, w.Filename())) + require.NoError(t, err) + checkNoSensitiveData(t, lw) + } else { + require.NoError(t, w.Validate()) + } + + // create wallet with dup wallet name + var otherSeed string + var otherXPub string + var dupFingerprintErr error + switch tc.walletType { + case WalletTypeDeterministic, WalletTypeBip44: + otherSeed = bip39.MustNewDefaultMnemonic() + dupFingerprintErr = ErrSeedUsed + case WalletTypeXPub: + otherXPub = "xpub6Ea7Vm9yPWhgrpmH7oTTc8vFmfp5Hpaf4ZpcjNWWJmpqr68viqmndJGkq6UFZcM6MpSXpqxF93PgvC7PuqByk5Pkx1XmcKMqkZhQbg21JXA" + dupFingerprintErr = ErrXPubKeyUsed + } + + _, err = s.CreateWallet(tc.filename, Options{ + Seed: otherSeed, + Type: tc.walletType, + XPub: otherXPub, + }, nil) + require.Equal(t, err, ErrWalletNameConflict) + + switch tc.walletType { + case WalletTypeDeterministic, WalletTypeBip44, WalletTypeXPub: + // create wallet with dup seed or xpub key + dupWlt := "dup_wallet.wlt" + _, err = s.CreateWallet(dupWlt, Options{ + Seed: tc.seed, + XPub: tc.xpub, + Type: tc.walletType, + }, nil) + require.Equal(t, dupFingerprintErr, err) + + // check that the dup wallet is not created + _, ok := s.wallets[dupWlt] + require.False(t, ok) + + testutil.RequireFileNotExists(t, filepath.Join(dir, dupWlt)) + + case WalletTypeCollection: + // collection wallets never conflict with each other + + default: + t.Fatal("unhandled wallet type") + } + }) + } + } +} + +type mockTxnsFinder map[cipher.Address]bool + +func (mb mockTxnsFinder) AddressesActivity(addrs []cipher.Address) ([]bool, error) { + if len(addrs) == 0 { + return nil, nil + } + active := make([]bool, len(addrs)) + for i, addr := range addrs { + active[i] = mb[addr] + } + return active, nil +} + +func TestServiceLoadWallet(t *testing.T) { + // Prepare addresss + seed := "seed" + _, seckeys := cipher.MustGenerateDeterministicKeyPairsSeed([]byte(seed), 10) + var addrs []cipher.Address + for _, s := range seckeys { + addrs = append(addrs, cipher.MustAddressFromSecKey(s)) + } + + bip44Seed := "voyage say extend find sheriff surge priority merit ignore maple cash argue" + bip44AddrStrs := []string{ + "9BSEAEE3XGtQ2X43BCT2XCYgheGLQQigEG", + "29cnQPHuWHCRF26LEAb2gR83ywnF3F9HduW", + "2ZUAv9MGSpDKR3dnKMUnrKqLenV22JXAxzP", + "fwNVThqdzH7JMsStoLrTpkVsemesbdGftm", + "eyr5KDLTnN6ZZeggeHqDcXnrwmNUi7sGk2", + "Aee3J9qoFPLoUEJes6YVzdKHdeuvCrMZeJ", + "29MZS8aiYUdEwcruwCPggVJG9YJLsm92FHa", + "2Hbm3bwKiEwqNAMAzVJmz5hL1dNTfaA3ju7", + "WCaSCwSZnVqtkYeiKryeHjR8LbzE3KbkzJ", + "baRjCy1yHfishGdZi3bVaPaL7VJM7FZCSd", + } + bip44Addrs := make([]cipher.Address, len(bip44AddrStrs)) + for i, a := range bip44AddrStrs { + bip44Addrs[i] = cipher.MustDecodeBase58Address(a) + } + + bip44SeedPassphrase := "foobar" + bip44SeedPassphraseAddrStrs := []string{ + "n5SteDkkYdR3VJtMnVYcQ45L16rDDrseG8", + "mGeG2PDoU4nc9qE1FSSreAjFeKG12zDvur", + "rhbE3thvA747E81KfaYCujur7GKXjdhvS4", + "BDEmcU8u4oTf9domk19Nzh65MXoWLLUvJN", + "cubnvXGENW3gTdcdJADp8XEJaBscpy7gpq", + "wv37cSiVhjgo6Qrrs994UJ52YU2zWNGJbu", + "7aEzdSrcm1s2pm5YhshsRmkFy4EuYEnJ49", + "nQJgxEE2eaggUeGaA73e4DaXq6KAvUiaS4", + "2G9bhZaJrTKo1LScgtdvVXpQD4P8tKvgkvL", + "4RqFK3qLz26XbPjgJsiJ3587P7p6DesDHd", + } + bip44SeedPassphraseAddrs := make([]cipher.Address, len(bip44SeedPassphraseAddrStrs)) + for i, a := range bip44SeedPassphraseAddrStrs { + bip44SeedPassphraseAddrs[i] = cipher.MustDecodeBase58Address(a) + } + + tt := []struct { + name string + opts Options + tf TransactionsFinder + err error + expectAddrNum int + expectAddrs []cipher.Address + }{ + { + name: "raw wallet address=1", + opts: Options{ + Type: WalletTypeDeterministic, + Seed: seed, + Label: "wallet", + ScanN: 5, + }, + tf: mockTxnsFinder{ + addrs[0]: true, + }, + err: nil, + expectAddrNum: 1, + expectAddrs: addrs[:1], + }, + { + name: "raw wallet address=2", + opts: Options{ + Type: WalletTypeDeterministic, + Seed: seed, + Label: "wallet", + ScanN: 5, + }, + tf: mockTxnsFinder{ + addrs[1]: true, + }, + err: nil, + expectAddrNum: 2, + expectAddrs: addrs[:2], + }, + { + name: "encrypted wallet address=1", + opts: Options{ + Type: WalletTypeDeterministic, + Seed: seed, + Label: "wallet", + Encrypt: true, + Password: []byte("pwd"), + ScanN: 5, + }, + tf: mockTxnsFinder{ + addrs[0]: true, + }, + err: nil, + expectAddrNum: 1, + expectAddrs: addrs[:1], + }, + { + name: "encrypted wallet address=2", + opts: Options{ + Type: WalletTypeDeterministic, + Seed: seed, + Label: "wallet", + Encrypt: true, + Password: []byte("pwd"), + ScanN: 5, + }, + tf: mockTxnsFinder{ + addrs[1]: true, + }, + err: nil, + expectAddrNum: 2, + expectAddrs: addrs[:2], + }, + + { + name: "bip44 raw wallet address=1", + opts: Options{ + Type: WalletTypeBip44, + Seed: bip44Seed, + Label: "wallet", + ScanN: 5, + }, + tf: mockTxnsFinder{ + bip44Addrs[0]: true, + }, + err: nil, + expectAddrNum: 1, + expectAddrs: bip44Addrs[:1], + }, + { + name: "bip44 raw wallet address=2", + opts: Options{ + Type: WalletTypeBip44, + Seed: bip44Seed, + Label: "wallet", + ScanN: 5, + }, + tf: mockTxnsFinder{ + bip44Addrs[1]: true, + }, + err: nil, + expectAddrNum: 2, + expectAddrs: bip44Addrs[:2], + }, + { + name: "bip44 encrypted wallet address=1", + opts: Options{ + Type: WalletTypeBip44, + Seed: bip44Seed, + Label: "wallet", + Encrypt: true, + Password: []byte("pwd"), + ScanN: 5, + }, + tf: mockTxnsFinder{ + bip44Addrs[0]: true, + }, + err: nil, + expectAddrNum: 1, + expectAddrs: bip44Addrs[:1], + }, + { + name: "bip44 encrypted wallet address=2", + opts: Options{ + Type: WalletTypeBip44, + Seed: bip44Seed, + Label: "wallet", + Encrypt: true, + Password: []byte("pwd"), + ScanN: 5, + }, + tf: mockTxnsFinder{ + bip44Addrs[1]: true, + }, + err: nil, + expectAddrNum: 2, + expectAddrs: bip44Addrs[:2], + }, + + { + name: "bip44 with seed passphrase raw wallet address=1", + opts: Options{ + Type: WalletTypeBip44, + Seed: bip44Seed, + SeedPassphrase: bip44SeedPassphrase, + Label: "wallet", + ScanN: 5, + }, + tf: mockTxnsFinder{ + bip44SeedPassphraseAddrs[0]: true, + }, + err: nil, + expectAddrNum: 1, + expectAddrs: bip44SeedPassphraseAddrs[:1], + }, + { + name: "bip44 with seed passphrase raw wallet address=2", + opts: Options{ + Type: WalletTypeBip44, + Seed: bip44Seed, + SeedPassphrase: bip44SeedPassphrase, + Label: "wallet", + ScanN: 5, + }, + tf: mockTxnsFinder{ + bip44SeedPassphraseAddrs[1]: true, + }, + err: nil, + expectAddrNum: 2, + expectAddrs: bip44SeedPassphraseAddrs[:2], + }, + { + name: "bip44 with seed passphrase encrypted wallet address=1", + opts: Options{ + Type: WalletTypeBip44, + Seed: bip44Seed, + SeedPassphrase: bip44SeedPassphrase, + Label: "wallet", + Encrypt: true, + Password: []byte("pwd"), + ScanN: 5, + }, + tf: mockTxnsFinder{ + bip44SeedPassphraseAddrs[0]: true, + }, + err: nil, + expectAddrNum: 1, + expectAddrs: bip44SeedPassphraseAddrs[:1], + }, + { + name: "bip44 with seed passphrase encrypted wallet address=2", + opts: Options{ + Type: WalletTypeBip44, + Seed: bip44Seed, + SeedPassphrase: bip44SeedPassphrase, + Label: "wallet", + Encrypt: true, + Password: []byte("pwd"), + ScanN: 5, + }, + tf: mockTxnsFinder{ + bip44SeedPassphraseAddrs[1]: true, + }, + err: nil, + expectAddrNum: 2, + expectAddrs: bip44SeedPassphraseAddrs[:2], + }, + } + + for _, tc := range tt { + for _, ct := range []CryptoType{CryptoTypeScryptChacha20poly1305Insecure} { + name := fmt.Sprintf("%v crypto=%v", tc.name, ct) + t.Run(name, func(t *testing.T) { + dir := prepareWltDir() + s, err := NewService(Config{ + WalletDir: dir, + CryptoType: ct, + EnableWalletAPI: true, + }) + require.NoError(t, err) + wltName := NewWalletFilename() + + w, err := s.loadWallet(wltName, tc.opts, tc.tf) + require.Equal(t, tc.err, err) + if err != nil { + return + } + + require.Equal(t, w.EntriesLen(), tc.expectAddrNum) + for i, a := range tc.expectAddrs { + require.Equal(t, a, w.GetEntryAt(i).Address) + } + + require.Equal(t, w.IsEncrypted(), tc.opts.Encrypt) + if w.IsEncrypted() { + checkNoSensitiveData(t, w) + // Checks the wallet file doesn't contain sensitive data + wltPath := filepath.Join(dir, w.Filename()) + lw, err := Load(wltPath) + require.NoError(t, err) + checkNoSensitiveData(t, lw) + } + }) + } + } + +} + +func TestServiceNewAddresses(t *testing.T) { + seed := "seed" + // Generate adddresses from the seed + var addrs []cipher.Address + _, seckeys := cipher.MustGenerateDeterministicKeyPairsSeed([]byte(seed), 10) + for _, s := range seckeys { + addrs = append(addrs, cipher.MustAddressFromSecKey(s)) + } + + bip44Seed := "voyage say extend find sheriff surge priority merit ignore maple cash argue" + bip44AddrStrs := []string{ + "9BSEAEE3XGtQ2X43BCT2XCYgheGLQQigEG", + "29cnQPHuWHCRF26LEAb2gR83ywnF3F9HduW", + "2ZUAv9MGSpDKR3dnKMUnrKqLenV22JXAxzP", + "fwNVThqdzH7JMsStoLrTpkVsemesbdGftm", + "eyr5KDLTnN6ZZeggeHqDcXnrwmNUi7sGk2", + "Aee3J9qoFPLoUEJes6YVzdKHdeuvCrMZeJ", + "29MZS8aiYUdEwcruwCPggVJG9YJLsm92FHa", + "2Hbm3bwKiEwqNAMAzVJmz5hL1dNTfaA3ju7", + "WCaSCwSZnVqtkYeiKryeHjR8LbzE3KbkzJ", + "baRjCy1yHfishGdZi3bVaPaL7VJM7FZCSd", + } + bip44Addrs := make([]cipher.Address, len(bip44AddrStrs)) + for i, a := range bip44AddrStrs { + bip44Addrs[i] = cipher.MustDecodeBase58Address(a) + } + + tt := []struct { + name string + opts Options + n uint64 + pwd []byte + walletAPIDisabled bool + postWalletHandle func(w string) + expectAddrNum int + expectAddrs []cipher.Address + expectErr error + }{ + { + name: "encrypted=false addresses=0", + opts: Options{ + Type: WalletTypeDeterministic, + Label: "label", + Seed: seed, + }, + n: 0, + expectAddrNum: 0, + }, + { + name: "encrypted=false addresses=1", + opts: Options{ + Label: "label", + Seed: seed, + Type: WalletTypeDeterministic, + }, + n: 2, + expectAddrNum: 2, + // CreateWallet will generate a default address, so check from new address + expectAddrs: addrs[1:3], + }, + { + name: "encrypted=false addresses=2", + opts: Options{ + Label: "label", + Seed: seed, + Type: WalletTypeDeterministic, + }, + n: 2, + expectAddrNum: 2, + // CreateWallet will generate a default address, so check from new address + expectAddrs: addrs[1:3], + }, + { + name: "encrypted=true addresses=1", + opts: Options{ + Label: "label", + Seed: seed, + Encrypt: true, + Password: []byte("pwd"), + Type: WalletTypeDeterministic, + }, + n: 1, + pwd: []byte("pwd"), + expectAddrNum: 1, + // CreateWallet will generate a default address, so check from new address + expectAddrs: addrs[1:2], + }, + { + name: "encrypted=true addresses=2", + opts: Options{ + Label: "label", + Seed: seed, + Encrypt: true, + Password: []byte("pwd"), + Type: WalletTypeDeterministic, + }, + n: 2, + pwd: []byte("pwd"), + expectAddrNum: 2, + // CreateWallet will generate a default address, so check from new address + expectAddrs: addrs[1:3], + }, + + { + name: "bip44 encrypted=false addresses=0", + opts: Options{ + Type: WalletTypeBip44, + Label: "label", + Seed: bip44Seed, + }, + n: 0, + expectAddrNum: 0, + }, + { + name: "bip44 encrypted=false addresses=1", + opts: Options{ + Label: "label", + Seed: bip44Seed, + Type: WalletTypeBip44, + }, + n: 2, + expectAddrNum: 2, + // CreateWallet will generate a default address, so check from new address + expectAddrs: bip44Addrs[1:3], + }, + { + name: "bip44 encrypted=false addresses=2", + opts: Options{ + Label: "label", + Seed: bip44Seed, + Type: WalletTypeBip44, + }, + n: 2, + expectAddrNum: 2, + // CreateWallet will generate a default address, so check from new address + expectAddrs: bip44Addrs[1:3], + }, + { + name: "bip44 encrypted=true addresses=1", + opts: Options{ + Label: "label", + Seed: bip44Seed, + Encrypt: true, + Password: []byte("pwd"), + Type: WalletTypeBip44, + }, + n: 1, + pwd: []byte("pwd"), + expectAddrNum: 1, + // CreateWallet will generate a default address, so check from new address + expectAddrs: bip44Addrs[1:2], + }, + { + name: "bip44 encrypted=true addresses=2", + opts: Options{ + Label: "label", + Seed: bip44Seed, + Encrypt: true, + Password: []byte("pwd"), + Type: WalletTypeBip44, + }, + n: 2, + pwd: []byte("pwd"), + expectAddrNum: 2, + // CreateWallet will generate a default address, so check from new address + expectAddrs: bip44Addrs[1:3], + }, + + { + name: "encrypted=true wrong password", + opts: Options{ + Label: "label", + Seed: seed, + Encrypt: true, + Password: []byte("pwd"), + Type: WalletTypeDeterministic, + }, + n: 1, + pwd: []byte("wrong password"), + expectAddrNum: 1, + expectErr: ErrInvalidPassword, + }, + { + name: "wallet api disabled", + opts: Options{ + Seed: "seed", + Label: "label", + Type: WalletTypeDeterministic, + }, + walletAPIDisabled: true, + expectErr: ErrWalletAPIDisabled, + }, + { + name: "encrypted=false password provided", + opts: Options{ + Label: "label", + Seed: seed, + Type: WalletTypeDeterministic, + }, + n: 1, + pwd: []byte("foo"), + expectErr: ErrWalletNotEncrypted, + }, + { + name: "encrypted=false writable=false", + opts: Options{ + Label: "label", + Seed: seed, + Type: WalletTypeDeterministic, + }, + n: 1, + postWalletHandle: func(fn string) { + err := os.Chmod(fn, 0555) // no write permission to the wallet file + require.NoError(t, err) + }, + expectAddrNum: 1, + expectErr: ErrWalletPermission, + }, + } + + for _, tc := range tt { + for ct := range cryptoTable { + name := fmt.Sprintf("crypto=%v %v", ct, tc.name) + t.Run(name, func(t *testing.T) { + dir := prepareWltDir() + s, err := NewService(Config{ + WalletDir: dir, + CryptoType: ct, + EnableWalletAPI: !tc.walletAPIDisabled, + }) + require.NoError(t, err) + + wltName := NewWalletFilename() + + w, err := s.CreateWallet(wltName, tc.opts, nil) + if err != nil { + require.Equal(t, tc.expectErr, err) + return + } + + wltPath := filepath.Join(dir, w.Filename()) + if tc.postWalletHandle != nil { + tc.postWalletHandle(wltPath) + } + + if w.IsEncrypted() { + checkNoSensitiveData(t, w) + } + + naddrs, err := s.NewAddresses(w.Filename(), tc.pwd, tc.n) + require.Equal(t, tc.expectErr, err) + + // Confirms that no intermediate tmp file exists + tmpWltPath := filepath.Join(dir, w.Filename()) + ".tmp" + _, existErr := os.Stat(tmpWltPath) + require.True(t, os.IsNotExist(existErr)) + + if err != nil { + return + } + + // Confirms that the wallet addresse number is correct + require.Len(t, naddrs, tc.expectAddrNum) + for i, a := range tc.expectAddrs { + require.Equal(t, a, naddrs[i]) + } + + // Check the wallet again + w, ok := s.wallets[wltName] + require.True(t, ok) + require.Equal(t, w.EntriesLen(), int(tc.n+1)) + + // Wallet has a default address, so need to start from the second address + for i, a := range tc.expectAddrs { + require.Equal(t, a, w.GetEntryAt(i+1).Address) + } + + // Load wallet from file and check + _, err = os.Stat(filepath.Join(dir, w.Filename())) + require.NoError(t, err) + + lw, err := Load(filepath.Join(dir, w.Filename())) + require.NoError(t, err) + require.Equal(t, lw, w) + if w.IsEncrypted() { + checkNoSensitiveData(t, lw) + } + + // Wallet doesn't exist + _, err = s.NewAddresses("wallet_not_exist.wlt", tc.pwd, 1) + require.Equal(t, ErrWalletNotExist, err) + }) + } + } +} + +func TestServiceGetAddress(t *testing.T) { + for _, enableWalletAPI := range []bool{true, false} { + for ct := range cryptoTable { + t.Run(fmt.Sprintf("enable wallet api=%v crypto=%v", enableWalletAPI, ct), func(t *testing.T) { + dir := prepareWltDir() + s, err := NewService(Config{ + WalletDir: "./testdata", + CryptoType: ct, + EnableWalletAPI: enableWalletAPI, + }) + require.NoError(t, err) + + if !enableWalletAPI { + dirIsEmpty(t, dir) + + require.Empty(t, s.wallets) + addrs, err := s.GetSkycoinAddresses("") + require.Equal(t, ErrWalletAPIDisabled, err) + require.Equal(t, 0, len(addrs)) + return + } + + addrs, err := s.GetSkycoinAddresses("test1.wlt") + require.NoError(t, err) + require.Equal(t, 1, len(addrs)) + + // test none exist wallet + notExistID := "not_exist_id.wlt" + _, err = s.GetSkycoinAddresses(notExistID) + require.Equal(t, ErrWalletNotExist, err) + }) + } + + } +} + +func TestServiceGetWallet(t *testing.T) { + walletTypes := []string{ + WalletTypeDeterministic, + WalletTypeBip44, + WalletTypeCollection, + WalletTypeXPub, + } + + for _, walletType := range walletTypes { + for _, enableWalletAPI := range []bool{true, false} { + for ct := range cryptoTable { + t.Run(fmt.Sprintf("enable wallet api=%v crypto=%v", enableWalletAPI, ct), func(t *testing.T) { + dir := prepareWltDir() + + s, err := NewService(Config{ + WalletDir: dir, + CryptoType: ct, + EnableWalletAPI: enableWalletAPI, + }) + require.NoError(t, err) + + if !enableWalletAPI { + dirIsEmpty(t, dir) + + require.Empty(t, s.wallets) + w, err := s.GetWallet("") + require.Equal(t, ErrWalletAPIDisabled, err) + require.Nil(t, w) + return + } + + opts := Options{ + Label: "label", + Type: walletType, + } + switch walletType { + case WalletTypeBip44, WalletTypeDeterministic: + opts.Seed = bip39.MustNewDefaultMnemonic() + case WalletTypeCollection: + case WalletTypeXPub: + opts.XPub = "xpub6CkxdS1d4vNqqcnf9xPgqR5e2jE2PZKmKSw93QQMjHE1hRk22nU4zns85EDRgmLWYXYtu62XexwqaET33XA28c26NbXCAUJh1xmqq6B3S2v" + default: + t.Fatal("unhandled wallet type") + } + + // Create a wallet + w, err := s.CreateWallet("t.wlt", opts, nil) + require.NoError(t, err) + + w1, err := s.GetWallet(w.Filename()) + require.NoError(t, err) + + // Check if change original wallet would change the returned wallet + w.SetLabel("new_label") + + require.NotEqual(t, "new_label", w1.Label()) + + // Get wallet doesn't exist + wltName := "does_not_exist.wlt" + _, err = s.GetWallet(wltName) + require.Equal(t, ErrWalletNotExist, err) + }) + } + } + } +} + +func TestServiceGetWallets(t *testing.T) { + for _, enableWalletAPI := range []bool{true, false} { + for ct := range cryptoTable { + t.Run(fmt.Sprintf("enable wallet=%v crypto=%v", enableWalletAPI, ct), func(t *testing.T) { + dir := prepareWltDir() + s, err := NewService(Config{ + WalletDir: dir, + CryptoType: ct, + EnableWalletAPI: enableWalletAPI, + }) + require.NoError(t, err) + + if !enableWalletAPI { + dirIsEmpty(t, dir) + + require.Empty(t, s.wallets) + w, err := s.GetWallets() + require.Equal(t, ErrWalletAPIDisabled, err) + var emptyW Wallets + require.Equal(t, w, emptyW) + return + } + + // Creates a wallet + w, err := s.CreateWallet("t.wlt", Options{ + Label: "label", + Seed: bip39.MustNewDefaultMnemonic(), + Type: WalletTypeBip44, + }, nil) + require.NoError(t, err) + + var wallets []Wallet + // Get the default wallet + wallets = append(wallets, w) + + // Create a new wallet + wltName := NewWalletFilename() + w1, err := s.CreateWallet(wltName, Options{ + Label: "label1", + Seed: bip39.MustNewDefaultMnemonic(), + Type: WalletTypeDeterministic, + }, nil) + require.NoError(t, err) + wallets = append(wallets, w1) + + ws, err := s.GetWallets() + require.NoError(t, err) + for _, w := range wallets { + ww, ok := ws[w.Filename()] + require.True(t, ok) + require.Equal(t, w, ww) + } + }) + } + } +} + +func TestServiceUpdateWalletLabel(t *testing.T) { + tt := []struct { + name string + wltName string + opts Options + updateWltName string + label string + disableWalletAPI bool + err error + }{ + { + name: "ok", + wltName: "t.wlt", + opts: Options{ + Seed: bip39.MustNewDefaultMnemonic(), + Label: "label", + Type: WalletTypeBip44, + }, + updateWltName: "t.wlt", + label: "new-label", + }, + { + name: "wallet doesn't exist", + wltName: "t.wlt", + opts: Options{ + Seed: bip39.MustNewDefaultMnemonic(), + Label: "label", + Type: WalletTypeBip44, + }, + updateWltName: "t1.wlt", + label: "new-label", + err: ErrWalletNotExist, + }, + { + name: "wallet api disabled", + wltName: "t.wlt", + opts: Options{ + Seed: bip39.MustNewDefaultMnemonic(), + Label: "label", + Type: WalletTypeBip44, + }, + disableWalletAPI: true, + err: ErrWalletAPIDisabled, + }, + } + + for _, tc := range tt { + for ct := range cryptoTable { + t.Run(tc.name, func(t *testing.T) { + // Create the wallet service + dir := prepareWltDir() + s, err := NewService(Config{ + WalletDir: dir, + CryptoType: ct, + EnableWalletAPI: !tc.disableWalletAPI, + }) + require.NoError(t, err) + + if tc.disableWalletAPI { + err = s.UpdateWalletLabel("", "new label") + require.Equal(t, tc.err, err) + return + } + + // Create a new wallet + w, err := s.CreateWallet(tc.wltName, tc.opts, nil) + require.NoError(t, err) + + err = s.UpdateWalletLabel(tc.updateWltName, tc.label) + require.Equal(t, tc.err, err) + + if err != nil { + return + } + + nw, err := s.GetWallet(w.Filename()) + require.NoError(t, err) + require.NotEqual(t, w.Label(), nw.Label()) + + require.Equal(t, tc.label, nw.Label()) + }) + } + } +} + +func TestServiceEncryptWallet(t *testing.T) { + tt := []struct { + name string + wltName string + opts Options + encWltName string + pwd []byte + disableWalletAPI bool + err error + }{ + { + name: "ok xpub wallet", + wltName: "t.wlt", + opts: Options{ + XPub: "xpub6CkxdS1d4vNqqcnf9xPgqR5e2jE2PZKmKSw93QQMjHE1hRk22nU4zns85EDRgmLWYXYtu62XexwqaET33XA28c26NbXCAUJh1xmqq6B3S2v", + Type: WalletTypeXPub, + }, + encWltName: "t.wlt", + pwd: []byte("pwd"), + }, + { + name: "ok deterministic wallet", + wltName: "t.wlt", + opts: Options{ + Seed: "seed", + Type: WalletTypeDeterministic, + }, + encWltName: "t.wlt", + pwd: []byte("pwd"), + }, + { + name: "ok collection wallet", + wltName: "t.wlt", + opts: Options{ + Type: WalletTypeCollection, + }, + encWltName: "t.wlt", + pwd: []byte("pwd"), + }, + { + name: "ok bip44 wallet", + wltName: "t.wlt", + opts: Options{ + Type: WalletTypeBip44, + Seed: "voyage say extend find sheriff surge priority merit ignore maple cash argue", + }, + encWltName: "t.wlt", + pwd: []byte("pwd"), + }, + { + name: "wallet doesn't exist", + wltName: "t.wlt", + opts: Options{ + Seed: "seed", + Type: WalletTypeDeterministic, + }, + encWltName: "t2.wlt", + err: ErrWalletNotExist, + }, + { + name: "wallet already encrypted", + wltName: "t.wlt", + opts: Options{ + Seed: "seed", + Type: WalletTypeDeterministic, + Encrypt: true, + Password: []byte("pwd"), + }, + encWltName: "t.wlt", + pwd: []byte("pwd"), + err: ErrWalletEncrypted, + }, + { + name: "wallet api disabled", + wltName: "t.wlt", + opts: Options{ + Seed: "seed", + Type: WalletTypeDeterministic, + Encrypt: true, + Password: []byte("pwd"), + }, + encWltName: "t.wlt", + pwd: []byte("pwd"), + disableWalletAPI: true, + err: ErrWalletAPIDisabled, + }, + } + + for _, tc := range tt { + for ct := range cryptoTable { + name := fmt.Sprintf("crypto=%v %v", ct, tc.name) + t.Run(name, func(t *testing.T) { + dir := prepareWltDir() + // Create the wallet service + s, err := NewService(Config{ + WalletDir: dir, + CryptoType: ct, + EnableWalletAPI: !tc.disableWalletAPI, + }) + require.NoError(t, err) + + if tc.disableWalletAPI { + _, err = s.EncryptWallet("", tc.pwd) + require.Equal(t, tc.err, err) + return + } + + // Create a new wallet + w, err := s.CreateWallet(tc.wltName, tc.opts, nil) + require.NoError(t, err) + + switch w.Type() { + // Add an entry to a collection wallet, to verify that secrets are hidden + case WalletTypeCollection: + err := s.Update(w.Filename(), func(w Wallet) error { + p, s := cipher.GenerateKeyPair() + return w.(*CollectionWallet).AddEntry(Entry{ + Public: p, + Secret: s, + Address: cipher.AddressFromPubKey(p), + }) + }) + require.NoError(t, err) + + // Add entries to the a bip44 wallet's change chain, to verify that those secrets are hidden + case WalletTypeBip44: + err := s.Update(w.Filename(), func(w Wallet) error { + _, err := w.(*Bip44Wallet).GenerateChangeEntry() + return err + }) + require.NoError(t, err) + } + + // Encrypt the wallet + encWlt, err := s.EncryptWallet(tc.encWltName, tc.pwd) + require.Equal(t, tc.err, err) + if err != nil { + return + } + + encWlt1, err := s.getWallet(tc.encWltName) + require.NoError(t, err) + require.Equal(t, encWlt, encWlt1) + + // Check the encrypted wallet + require.True(t, encWlt.IsEncrypted()) + for i := 0; i < encWlt.EntriesLen(); i++ { + require.True(t, encWlt.GetEntryAt(i).Secret.Null()) + } + require.Empty(t, encWlt.Seed()) + require.Empty(t, encWlt.LastSeed()) + + // Check the decrypted seeds + decWlt, err := Unlock(encWlt, tc.pwd) + require.NoError(t, err) + for i := 0; i < decWlt.EntriesLen(); i++ { + switch decWlt.Type() { + case WalletTypeXPub: + // xpub wallets never have secret keys + require.True(t, decWlt.GetEntryAt(i).Secret.Null()) + default: + require.False(t, decWlt.GetEntryAt(i).Secret.Null()) + } + } + require.Equal(t, w.Seed(), decWlt.Seed()) + require.Equal(t, w.LastSeed(), decWlt.LastSeed()) + + // Check if the wallet file does exist + path := filepath.Join(dir, w.Filename()) + testutil.RequireFileExists(t, path) + + // Check that the temporary backup wallet file does not exist + bakPath := path + ".bak" + testutil.RequireFileNotExists(t, bakPath) + }) + } + } +} + +func TestServiceDecryptWallet(t *testing.T) { + type testCase struct { + name string + wltName string + opts Options + decryptWltName string + password []byte + disableWalletAPI bool + err error + } + + tt := []testCase{ + { + name: "ok xpub", + wltName: "test.wlt", + opts: Options{ + Type: WalletTypeXPub, + Encrypt: true, + Password: []byte("pwd"), + XPub: "xpub6CkxdS1d4vNqqcnf9xPgqR5e2jE2PZKmKSw93QQMjHE1hRk22nU4zns85EDRgmLWYXYtu62XexwqaET33XA28c26NbXCAUJh1xmqq6B3S2v", + }, + decryptWltName: "test.wlt", + password: []byte("pwd"), + }, + { + name: "ok collection", + wltName: "test.wlt", + opts: Options{ + Type: WalletTypeCollection, + Encrypt: true, + Password: []byte("pwd"), + }, + decryptWltName: "test.wlt", + password: []byte("pwd"), + }, + { + name: "ok deterministic", + wltName: "test.wlt", + opts: Options{ + Seed: "seed", + Encrypt: true, + Password: []byte("pwd"), + Type: WalletTypeDeterministic, + }, + decryptWltName: "test.wlt", + password: []byte("pwd"), + }, + { + name: "ok bip44", + wltName: "test.wlt", + opts: Options{ + Seed: "voyage say extend find sheriff surge priority merit ignore maple cash argue", + Encrypt: true, + Password: []byte("pwd"), + Type: WalletTypeBip44, + }, + decryptWltName: "test.wlt", + password: []byte("pwd"), + }, + { + name: "wallet not exist", + wltName: "test.wlt", + opts: Options{ + Seed: "seed", + Encrypt: true, + Password: []byte("pwd"), + Type: WalletTypeDeterministic, + }, + decryptWltName: "t.wlt", + password: []byte("pwd"), + err: ErrWalletNotExist, + }, + { + name: "wallet not encrypted", + wltName: "test.wlt", + opts: Options{ + Seed: "seed", + Type: WalletTypeDeterministic, + }, + decryptWltName: "test.wlt", + password: []byte("pwd"), + err: ErrWalletNotEncrypted, + }, + { + name: "invalid password", + wltName: "test.wlt", + opts: Options{ + Seed: "seed", + Encrypt: true, + Password: []byte("pwd"), + Type: WalletTypeDeterministic, + }, + decryptWltName: "test.wlt", + password: []byte("wrong password"), + err: ErrInvalidPassword, + }, + { + name: "wallet api disabled", + wltName: "test.wlt", + opts: Options{ + Seed: "seed", + Encrypt: true, + Password: []byte("pwd"), + Type: WalletTypeDeterministic, + }, + decryptWltName: "test.wlt", + password: []byte("pwd"), + disableWalletAPI: true, + err: ErrWalletAPIDisabled, + }, + } + + verifyDecryptedXPubWlt := func(tc testCase, wlt Wallet) { + // XPub wlt doesn't have anything to encrypt or decrypt + require.Equal(t, tc.opts.XPub, wlt.XPub()) + require.Empty(t, wlt.Secrets()) + require.Empty(t, wlt.Seed()) + require.Empty(t, wlt.LastSeed()) + for _, e := range wlt.GetEntries() { + require.True(t, e.Secret.Null()) + } + } + + verifyDecryptedDeterministicWlt := func(tc testCase, wlt Wallet) { + // Checks the "encrypted" meta info + require.False(t, wlt.IsEncrypted()) + // Checks the seed + require.Equal(t, tc.opts.Seed, wlt.Seed()) + + // Checks the last seed + entryNum := wlt.EntriesLen() + lsd, seckeys := cipher.MustGenerateDeterministicKeyPairsSeed([]byte(wlt.Seed()), entryNum) + require.Equal(t, hex.EncodeToString(lsd), wlt.LastSeed()) + + // Checks the entries + for i := range seckeys { + a := cipher.MustAddressFromSecKey(seckeys[i]) + require.Equal(t, a, wlt.GetEntryAt(i).Address) + require.Equal(t, seckeys[i], wlt.GetEntryAt(i).Secret) + } + + require.Empty(t, wlt.Secrets()) + require.Empty(t, wlt.CryptoType()) + } + + verifyDecryptedCollectionWlt := func(_ testCase, wlt Wallet) { + // Checks the "encrypted" meta info + require.False(t, wlt.IsEncrypted()) + require.Empty(t, wlt.Seed()) + require.Empty(t, wlt.LastSeed()) + + // Checks the entries + for _, e := range wlt.GetEntries() { + require.False(t, e.Secret.Null()) + a := cipher.MustAddressFromSecKey(e.Secret) + require.Equal(t, a, e.Address) + p := cipher.MustPubKeyFromSecKey(e.Secret) + require.Equal(t, p, e.Public) + } + + require.Empty(t, wlt.Secrets()) + require.Empty(t, wlt.CryptoType()) + } + + verifyDecryptedBip44Wlt := func(tc testCase, wlt Wallet) { + // Checks the "encrypted" meta info + require.False(t, wlt.IsEncrypted()) + // Checks the seed + require.Equal(t, tc.opts.Seed, wlt.Seed()) + require.Empty(t, wlt.LastSeed()) + + // Checks the entries + for _, e := range wlt.GetEntries() { + require.False(t, e.Secret.Null()) + a := cipher.MustAddressFromSecKey(e.Secret) + require.Equal(t, a, e.Address) + p := cipher.MustPubKeyFromSecKey(e.Secret) + require.Equal(t, p, e.Public) + } + + require.Empty(t, wlt.Secrets()) + require.Empty(t, wlt.CryptoType()) + } + + for _, tc := range tt { + for ct := range cryptoTable { + name := fmt.Sprintf("crypto=%v %v", ct, tc.name) + t.Run(name, func(t *testing.T) { + dir := prepareWltDir() + s, err := NewService(Config{ + WalletDir: dir, + CryptoType: ct, + EnableWalletAPI: !tc.disableWalletAPI, + }) + require.NoError(t, err) + + if tc.disableWalletAPI { + _, err = s.DecryptWallet(tc.decryptWltName, tc.password) + require.Equal(t, tc.err, err) + return + } + + _, err = s.CreateWallet(tc.wltName, tc.opts, nil) + require.NoError(t, err) + + _, err = s.DecryptWallet(tc.decryptWltName, tc.password) + require.Equal(t, tc.err, err) + if err != nil { + return + } + + wltType := tc.opts.Type + if wltType == "" { + wltType = WalletTypeBip44 + } + + verify := verifyDecryptedCollectionWlt + switch wltType { + case WalletTypeCollection: + verify = verifyDecryptedCollectionWlt + case WalletTypeBip44: + verify = verifyDecryptedBip44Wlt + case WalletTypeDeterministic: + verify = verifyDecryptedDeterministicWlt + case WalletTypeXPub: + verify = verifyDecryptedXPubWlt + default: + t.Fatal("unhandled wallet type") + } + + // Checks the decrypted wallet in service + w, err := s.getWallet(tc.wltName) + require.NoError(t, err) + verify(tc, w) + + // Checks the existence of the wallet file + fn := filepath.Join(dir, tc.wltName) + testutil.RequireFileExists(t, fn) + + // Loads wallet from the file and check if it's decrypted + w1, err := Load(fn) + require.NoError(t, err) + verify(tc, w1) + }) + } + } +} + +func TestServiceCreateWalletWithScan(t *testing.T) { + seed := "seed1" + addrs := make([]cipher.Address, 20) + childSeeds := make([]string, 20) + lastSeed := []byte(seed) + for i := range addrs { + s, pk, _, err := cipher.DeterministicKeyPairIterator(lastSeed) + require.NoError(t, err) + addrs[i] = cipher.AddressFromPubKey(pk) + childSeeds[i] = hex.EncodeToString(s) + lastSeed = s + } + + bip44Seed := "voyage say extend find sheriff surge priority merit ignore maple cash argue" + bip44AddrStrs := []string{ + "9BSEAEE3XGtQ2X43BCT2XCYgheGLQQigEG", + "29cnQPHuWHCRF26LEAb2gR83ywnF3F9HduW", + "2ZUAv9MGSpDKR3dnKMUnrKqLenV22JXAxzP", + "fwNVThqdzH7JMsStoLrTpkVsemesbdGftm", + "eyr5KDLTnN6ZZeggeHqDcXnrwmNUi7sGk2", + "Aee3J9qoFPLoUEJes6YVzdKHdeuvCrMZeJ", + "29MZS8aiYUdEwcruwCPggVJG9YJLsm92FHa", + "2Hbm3bwKiEwqNAMAzVJmz5hL1dNTfaA3ju7", + "WCaSCwSZnVqtkYeiKryeHjR8LbzE3KbkzJ", + "baRjCy1yHfishGdZi3bVaPaL7VJM7FZCSd", + "296oQmJJgx35NDApi7YYzj1AryM8fZcjwf3", + "cxxxRfy3RRy2YbFTcptRbVTQYcHY1ejRB5", + "omLGQm1Z2Y9Bga8v6NQ2hgrpRm1nATzGK9", + "2EpZP1E8gTJy799t5CVrZUcxjyFFHwshr6X", + "2hgaPG2oNVrkonPxjv4Sx9au6ruw1Y8pjUi", + "2bHfa8yjhWB5mTip8j1FjNhB1TGbSBkX3Xu", + "VYu5ePSB7ReKm2pysC5JRdCUiTBgDn5Tkw", + "2crRqwG3BaurEqNa7eiB5oUNKTQPETfKrFW", + "2LVTqqNSTBKE51UC7bZ39bZ6wwmR3sibHBX", + "2A8C3h1gsw92Q4Uhn4b385onKrhzuH8UTwE", + } + bip44Addrs := make([]cipher.Address, len(bip44AddrStrs)) + for i, a := range bip44AddrStrs { + bip44Addrs[i] = cipher.MustDecodeBase58Address(a) + } + + bip44ChangeAddrStrs := []string{ + "oHvj7oy8maES9HJiQHJTp4GvcUcpz3voDq", + "2SGMfTFV2zbQzGw7aJm1D5EeEPgych5ixuC", + "2ymjULRdbiFoUNJKNhWbQ3JqdE8TXnZkyU", + "muvdio7V8vkbUPPJsumVWEqScKHZho6Xmx", + "qyQuA2RW4H6NFqhRQmHDt2q28E654PoBsH", + "24UcBj42Q7GBx1rmeU5AE7JhcRbpDq9utCV", + "2TwjgBxKhK84Qa34HoNc5KbsYfp1NBZyPXk", + "fDYKWyDnDaQmpigGAJNK4ZoBZ4WTg5dtRN", + "rRMXXm8ufMcqqnLqRX5CoJ8wA6rdWPJEiW", + "2D6HN4fSHZqsGaPzCDUjddF6NS4hBsVGRag", + "2bXjTvatPW4Z3SaQBr96zJwwYcxp7iemeGC", + "tbmXTJWtqtuaAdVvFWS1rmL42omdD4Hkd3", + "27NT6t4xJoqcs6PsM2EgNNhx4MMw3ioFVER", + "Xym6pAVg2Xjp9sXvCUKrLgq6PSEt1izsRd", + "49EqkHPgWPS9W1jDiJXSKdKdNur3pJjADw", + "f52mwYtpVNhgMMmJZHQYVBQVHwHXCbP5yX", + "2ffeXAKtVUmxucs8mpM2EKMqzYCN3TB7DYx", + "2NJERX84xLHMidXtYDtT1rGzhf4HJmCkz47", + "wik4VEcja3pz2Wo6SwwfoDGzVzB7ZoosQB", + "2gj3qjYQ4MMkv7CdB3PvkbEEPhXikZBD4q6", + } + bip44ChangeAddrs := make([]cipher.Address, len(bip44ChangeAddrStrs)) + for i, a := range bip44ChangeAddrStrs { + bip44ChangeAddrs[i] = cipher.MustDecodeBase58Address(a) + } + + xpub := "xpub6E5WPk37XdM79dy6oJ7iH6NkCvVzxmrCo4zMFFHSZMc5ymZYhReQFWaDcGNZeYYe1ahY2e3RcRZDHLHC98FfzPRfNRcU6ecURpS4RCQRP2w" + xpubAddrStrs := []string{ + "2mhaS6SE2TPSmRRbJvngWQSNXCCVuTic5Zg", + "2bq2itwDKteqigxVS9eYJv4Ww9SEfuyGcib", + "B7eMXM6nLUqqzkFcosXR3HSVkQ6yUz53n4", + "niAy17kBb8vB2pFey8eZnE92e6x9bFGLHp", + "N8JbzcqWEPkn6CF3JdZDmEydzECyZ4NhRv", + "TcyY3F4xHPCtFFkdDBTC93y684Fmxg2rPd", + "kcVFbcrVqAVUHrirp7r3HYHUzrtdFuybez", + "bzA7UeUmkuFWn3waGh3z1eQ5xV3TAZpgX2", + "2K29ZX6vaqrTRZJbFKX7hzu646wL3pJfF6H", + "VKpFCpN4yp46uYbffaeCg7XEvQd6pHNSkV", + "2bGUCmS8BcFiX6VQbq6DVvjDsCdu5fgoSSr", + "2Yx8dzMgzU5Y2vrAomAtkajWNmUCJ31xNF", + "wd2NGBkCygq7cCP899gbiBciM7ZFqphRDM", + "2akitSsnetXoc3ejzY4pA8dGjWM76uzPxo3", + "WFTbYvNJGAq9wWG644sMvgt4EJ6CvkbvDK", + "2FReiyjcQuQBCvjKQzyrhc7QMwdbdBwLvCT", + "2RnSh4sZrxCEK5fUSCLR8JuwzGd6K5mzdrA", + "ujJHitcLhQZB393qrdJvdfM4AyEPMmDhcV", + "25jWWmrgU8Z9HYVCsAXYmCjF1jQqe5DDnqr", + "rsaKzohU5erbR6FX1whWu9Ke4q2jLkLBeJ", + } + xpubAddrs := make([]cipher.Address, len(xpubAddrStrs)) + for i, a := range xpubAddrStrs { + xpubAddrs[i] = cipher.MustDecodeBase58Address(a) + } + + tf := make(mockTxnsFinder, 20) + + type exp struct { + err error + seed string + lastSeed string + xpub string + entryNum int + addrs []cipher.Address + } + + tt := []struct { + name string + opts Options + balGetter TransactionsFinder + disableWalletAPI bool + expect exp + }{ + { + name: "no coins and scan 0, unencrypted", + opts: Options{ + Seed: seed, + Type: WalletTypeDeterministic, + }, + balGetter: tf, + expect: exp{ + err: nil, + seed: seed, + lastSeed: childSeeds[0], + entryNum: 1, + addrs: addrs, + }, + }, + { + name: "no coins and scan 0, encrypted", + opts: Options{ + Seed: seed, + Encrypt: true, + Password: []byte("pwd"), + Type: WalletTypeDeterministic, + }, + balGetter: tf, + expect: exp{ + err: nil, + seed: seed, + lastSeed: childSeeds[0], + entryNum: 1, + addrs: addrs, + }, + }, + { + name: "no coins and scan 1, unencrypted", + opts: Options{ + Seed: seed, + ScanN: 1, + Type: WalletTypeDeterministic, + }, + balGetter: tf, + expect: exp{ + err: nil, + seed: seed, + lastSeed: childSeeds[0], + entryNum: 1, + addrs: addrs, + }, + }, + { + name: "no coins and scan 1, encrypted", + opts: Options{ + Seed: seed, + Encrypt: true, + Password: []byte("pwd"), + ScanN: 1, + Type: WalletTypeDeterministic, + }, + balGetter: tf, + expect: exp{ + err: nil, + seed: seed, + lastSeed: childSeeds[0], + entryNum: 1, + addrs: addrs, + }, + }, + { + name: "no coins and scan 10, unencrypted", + opts: Options{ + Seed: seed, + ScanN: 10, + Type: WalletTypeDeterministic, + }, + balGetter: tf, + expect: exp{ + err: nil, + seed: seed, + lastSeed: childSeeds[0], + entryNum: 1, + addrs: addrs, + }, + }, + { + name: "scan 5 get 6, unencrypted", + opts: Options{ + Seed: seed, + ScanN: 5, + Type: WalletTypeDeterministic, + }, + balGetter: mockTxnsFinder{ + addrs[5]: true, + }, + expect: exp{ + err: nil, + seed: seed, + lastSeed: childSeeds[5], + entryNum: 6, + addrs: addrs, + }, + }, + { + name: "scan 5 get 9, unencrypted", + opts: Options{ + Seed: seed, + ScanN: 5, + Type: WalletTypeDeterministic, + }, + balGetter: mockTxnsFinder{ + addrs[5]: true, + addrs[8]: true, + }, + expect: exp{ + err: nil, + seed: seed, + lastSeed: childSeeds[8], + entryNum: 9, + addrs: addrs, + }, + }, + { + name: "scan 5 get 11, unencrypted", + opts: Options{ + Seed: seed, + ScanN: 5, + Type: WalletTypeDeterministic, + }, + balGetter: mockTxnsFinder{ + addrs[4+1]: true, + addrs[10]: true, + }, + expect: exp{ + err: nil, + seed: seed, + lastSeed: childSeeds[10], + entryNum: 11, + addrs: addrs, + }, + }, + + { + name: "scan 5 get 6, encrypted", + opts: Options{ + Seed: seed, + Encrypt: true, + Password: []byte("pwd"), + ScanN: 5, + Type: WalletTypeDeterministic, + }, + balGetter: mockTxnsFinder{ + addrs[5]: true, + }, + expect: exp{ + err: nil, + seed: seed, + lastSeed: childSeeds[5], + entryNum: 6, + addrs: addrs, + }, + }, + { + name: "scan 5 get 5, unencrypted", + opts: Options{ + Seed: seed, + ScanN: 5, + Type: WalletTypeDeterministic, + }, + balGetter: mockTxnsFinder{ + addrs[3]: true, + addrs[4]: true, + }, + expect: exp{ + err: nil, + seed: seed, + lastSeed: childSeeds[4], + entryNum: 5, + addrs: addrs, + }, + }, + { + name: "scan 5 get 5, encrypted", + opts: Options{ + Seed: seed, + Encrypt: true, + Password: []byte("pwd"), + ScanN: 5, + Type: WalletTypeDeterministic, + }, + balGetter: mockTxnsFinder{ + addrs[3]: true, + addrs[4]: true, + }, + expect: exp{ + err: nil, + seed: seed, + lastSeed: childSeeds[4], + entryNum: 5, + addrs: addrs, + }, + }, + { + name: "scan 5 get 5 have 7, unencrypted", + opts: Options{ + Seed: seed, + ScanN: 5, + Type: WalletTypeDeterministic, + }, + balGetter: mockTxnsFinder{ + addrs[3]: true, + addrs[4]: true, + addrs[6]: true, + }, + expect: exp{ + err: nil, + seed: seed, + lastSeed: childSeeds[6], + entryNum: 7, + addrs: addrs, + }, + }, + { + name: "scan 5 get 3 have 8, unencrypted", + opts: Options{ + Seed: seed, + ScanN: 5, + Type: WalletTypeDeterministic, + }, + balGetter: mockTxnsFinder{ + addrs[2]: true, + addrs[7]: true, + }, + expect: exp{ + err: nil, + seed: seed, + lastSeed: childSeeds[7], + entryNum: 8, + addrs: addrs, + }, + }, + { + name: "scan 5 get 3 get 8 have 13, unencrypted", + opts: Options{ + Seed: seed, + ScanN: 5, + Type: WalletTypeDeterministic, + }, + balGetter: mockTxnsFinder{ + addrs[2]: true, + addrs[7]: true, + addrs[12]: true, + }, + expect: exp{ + err: nil, + seed: seed, + lastSeed: childSeeds[12], + entryNum: 13, + addrs: addrs, + }, + }, + { + name: "scan 5 get 3 get 8 have 14, unencrypted", + opts: Options{ + Seed: seed, + ScanN: 5, + Type: WalletTypeDeterministic, + }, + balGetter: mockTxnsFinder{ + addrs[2]: true, + addrs[7]: true, + addrs[13]: true, + }, + expect: exp{ + err: nil, + seed: seed, + lastSeed: childSeeds[7], + entryNum: 8, + addrs: addrs, + }, + }, + { + name: "scan 5 get 3 have 9, unencrypted", + opts: Options{ + Seed: seed, + ScanN: 5, + Type: WalletTypeDeterministic, + }, + balGetter: mockTxnsFinder{ + addrs[2]: true, + addrs[8]: true, + }, + expect: exp{ + err: nil, + seed: seed, + lastSeed: childSeeds[2], + entryNum: 3, + addrs: addrs, + }, + }, + { + name: "confirmed and predicted, unencrypted", + opts: Options{ + Seed: seed, + ScanN: 5, + Type: WalletTypeDeterministic, + }, + balGetter: mockTxnsFinder{ + addrs[3]: true, + addrs[4]: true, + }, + expect: exp{ + err: nil, + seed: seed, + lastSeed: childSeeds[4], + entryNum: 5, + addrs: addrs, + }, + }, + { + name: "confirmed and predicted, encrypted", + opts: Options{ + Seed: seed, + Encrypt: true, + Password: []byte("pwd"), + ScanN: 5, + Type: WalletTypeDeterministic, + }, + balGetter: mockTxnsFinder{ + addrs[3]: true, + addrs[4]: true, + }, + expect: exp{ + err: nil, + seed: seed, + lastSeed: childSeeds[4], + entryNum: 5, + addrs: addrs, + }, + }, + + { + name: "bip44 no coins and scan 0, unencrypted", + opts: Options{ + Seed: bip44Seed, + Type: WalletTypeBip44, + }, + balGetter: tf, + expect: exp{ + err: nil, + seed: bip44Seed, + entryNum: 1, + addrs: bip44Addrs, + }, + }, + { + name: "bip44 no coins and scan 0, encrypted", + opts: Options{ + Seed: bip44Seed, + Encrypt: true, + Password: []byte("pwd"), + Type: WalletTypeBip44, + }, + balGetter: tf, + expect: exp{ + err: nil, + seed: bip44Seed, + entryNum: 1, + addrs: bip44Addrs, + }, + }, + { + name: "bip44 no coins and scan 1, unencrypted", + opts: Options{ + Seed: bip44Seed, + ScanN: 1, + Type: WalletTypeBip44, + }, + balGetter: tf, + expect: exp{ + err: nil, + seed: bip44Seed, + entryNum: 1, + addrs: bip44Addrs, + }, + }, + { + name: "bip44 no coins and scan 1, encrypted", + opts: Options{ + Seed: bip44Seed, + Encrypt: true, + Password: []byte("pwd"), + ScanN: 1, + Type: WalletTypeBip44, + }, + balGetter: tf, + expect: exp{ + err: nil, + seed: bip44Seed, + entryNum: 1, + addrs: bip44Addrs, + }, + }, + { + name: "bip44 no coins and scan 10, unencrypted", + opts: Options{ + Seed: bip44Seed, + ScanN: 10, + Type: WalletTypeBip44, + }, + balGetter: tf, + expect: exp{ + err: nil, + seed: bip44Seed, + entryNum: 1, + addrs: bip44Addrs, + }, + }, + { + name: "bip44 scan 5 get 6, unencrypted", + opts: Options{ + Seed: bip44Seed, + ScanN: 5, + Type: WalletTypeBip44, + }, + balGetter: mockTxnsFinder{ + bip44Addrs[5]: true, + }, + expect: exp{ + err: nil, + seed: bip44Seed, + entryNum: 6, + addrs: bip44Addrs, + }, + }, + { + name: "bip44 scan 5 get 9, unencrypted", + opts: Options{ + Seed: bip44Seed, + ScanN: 5, + Type: WalletTypeBip44, + }, + balGetter: mockTxnsFinder{ + bip44Addrs[5]: true, + bip44Addrs[8]: true, + }, + expect: exp{ + err: nil, + seed: bip44Seed, + entryNum: 9, + addrs: bip44Addrs, + }, + }, + { + name: "bip44 scan 5 get 11, unencrypted", + opts: Options{ + Seed: bip44Seed, + ScanN: 5, + Type: WalletTypeBip44, + }, + balGetter: mockTxnsFinder{ + bip44Addrs[4+1]: true, + bip44Addrs[10]: true, + }, + expect: exp{ + err: nil, + seed: bip44Seed, + entryNum: 11, + addrs: bip44Addrs, + }, + }, + + { + name: "bip44 scan 5 get 6, encrypted", + opts: Options{ + Seed: bip44Seed, + Encrypt: true, + Password: []byte("pwd"), + ScanN: 5, + Type: WalletTypeBip44, + }, + balGetter: mockTxnsFinder{ + bip44Addrs[5]: true, + }, + expect: exp{ + err: nil, + seed: bip44Seed, + entryNum: 6, + addrs: bip44Addrs, + }, + }, + { + name: "bip44 scan 5 get 5, unencrypted", + opts: Options{ + Seed: bip44Seed, + ScanN: 5, + Type: WalletTypeBip44, + }, + balGetter: mockTxnsFinder{ + bip44Addrs[3]: true, + bip44Addrs[4]: true, + }, + expect: exp{ + err: nil, + seed: bip44Seed, + entryNum: 5, + addrs: bip44Addrs, + }, + }, + { + name: "bip44 scan 5 get 5, encrypted", + opts: Options{ + Seed: bip44Seed, + Encrypt: true, + Password: []byte("pwd"), + ScanN: 5, + Type: WalletTypeBip44, + }, + balGetter: mockTxnsFinder{ + bip44Addrs[3]: true, + bip44Addrs[4]: true, + }, + expect: exp{ + err: nil, + seed: bip44Seed, + entryNum: 5, + addrs: bip44Addrs, + }, + }, + { + name: "bip44 scan 5 get 5 have 7, unencrypted", + opts: Options{ + Seed: bip44Seed, + ScanN: 5, + Type: WalletTypeBip44, + }, + balGetter: mockTxnsFinder{ + bip44Addrs[3]: true, + bip44Addrs[4]: true, + bip44Addrs[6]: true, + }, + expect: exp{ + err: nil, + seed: bip44Seed, + entryNum: 7, + addrs: bip44Addrs, + }, + }, + { + name: "bip44 scan 5 get 3 have 8, unencrypted", + opts: Options{ + Seed: bip44Seed, + ScanN: 5, + Type: WalletTypeBip44, + }, + balGetter: mockTxnsFinder{ + bip44Addrs[2]: true, + bip44Addrs[7]: true, + }, + expect: exp{ + err: nil, + seed: bip44Seed, + entryNum: 8, + addrs: bip44Addrs, + }, + }, + { + name: "bip44 scan 5 get 3 get 8 have 13, unencrypted", + opts: Options{ + Seed: bip44Seed, + ScanN: 5, + Type: WalletTypeBip44, + }, + balGetter: mockTxnsFinder{ + bip44Addrs[2]: true, + bip44Addrs[7]: true, + bip44Addrs[12]: true, + }, + expect: exp{ + err: nil, + seed: bip44Seed, + entryNum: 13, + addrs: bip44Addrs, + }, + }, + { + name: "bip44 scan 5 get 3 get 8 have 14, unencrypted", + opts: Options{ + Seed: bip44Seed, + ScanN: 5, + Type: WalletTypeBip44, + }, + balGetter: mockTxnsFinder{ + bip44Addrs[2]: true, + bip44Addrs[7]: true, + bip44Addrs[13]: true, + }, + expect: exp{ + err: nil, + seed: bip44Seed, + entryNum: 8, + addrs: bip44Addrs, + }, + }, + { + name: "bip44 scan 5 get 3 get 8 have 14, change chain, unencrypted", + opts: Options{ + Seed: bip44Seed, + ScanN: 5, + Type: WalletTypeBip44, + }, + balGetter: mockTxnsFinder{ + bip44ChangeAddrs[2]: true, + bip44ChangeAddrs[7]: true, + bip44ChangeAddrs[13]: true, + }, + expect: exp{ + err: nil, + seed: bip44Seed, + entryNum: 8 + 1, // 1 address is always generated in the external chain + addrs: append(bip44Addrs[:1], bip44ChangeAddrs...), + }, + }, { + name: "bip44 scan 5 get 3 have 9, unencrypted", + opts: Options{ + Seed: bip44Seed, + ScanN: 5, + Type: WalletTypeBip44, + }, + balGetter: mockTxnsFinder{ + bip44Addrs[2]: true, + bip44Addrs[8]: true, + }, + expect: exp{ + err: nil, + seed: bip44Seed, + entryNum: 3, + addrs: bip44Addrs, + }, + }, + { + name: "bip44 confirmed and predicted, unencrypted", + opts: Options{ + Seed: bip44Seed, + ScanN: 5, + Type: WalletTypeBip44, + }, + balGetter: mockTxnsFinder{ + bip44Addrs[3]: true, + bip44Addrs[4]: true, + }, + expect: exp{ + err: nil, + seed: bip44Seed, + entryNum: 5, + addrs: bip44Addrs, + }, + }, + { + name: "bip44 confirmed and predicted, encrypted", + opts: Options{ + Seed: bip44Seed, + Encrypt: true, + Password: []byte("pwd"), + ScanN: 5, + Type: WalletTypeBip44, + }, + balGetter: mockTxnsFinder{ + bip44Addrs[3]: true, + bip44Addrs[4]: true, + }, + expect: exp{ + err: nil, + seed: bip44Seed, + entryNum: 5, + addrs: bip44Addrs, + }, + }, + + { + name: "xpub no coins and scan 0, unencrypted", + opts: Options{ + XPub: xpub, + Type: WalletTypeXPub, + }, + balGetter: tf, + expect: exp{ + err: nil, + xpub: xpub, + entryNum: 1, + addrs: xpubAddrs, + }, + }, + { + name: "xpub no coins and scan 0, encrypted", + opts: Options{ + XPub: xpub, + Encrypt: true, + Password: []byte("pwd"), + Type: WalletTypeXPub, + }, + balGetter: tf, + expect: exp{ + err: nil, + xpub: xpub, + entryNum: 1, + addrs: xpubAddrs, + }, + }, + { + name: "xpub no coins and scan 1, unencrypted", + opts: Options{ + XPub: xpub, + ScanN: 1, + Type: WalletTypeXPub, + }, + balGetter: tf, + expect: exp{ + err: nil, + xpub: xpub, + entryNum: 1, + addrs: xpubAddrs, + }, + }, + { + name: "xpub no coins and scan 1, encrypted", + opts: Options{ + XPub: xpub, + Encrypt: true, + Password: []byte("pwd"), + ScanN: 1, + Type: WalletTypeXPub, + }, + balGetter: tf, + expect: exp{ + err: nil, + xpub: xpub, + entryNum: 1, + addrs: xpubAddrs, + }, + }, + { + name: "xpub no coins and scan 10, unencrypted", + opts: Options{ + XPub: xpub, + ScanN: 10, + Type: WalletTypeXPub, + }, + balGetter: tf, + expect: exp{ + err: nil, + xpub: xpub, + entryNum: 1, + addrs: xpubAddrs, + }, + }, + { + name: "xpub scan 5 get 6, unencrypted", + opts: Options{ + XPub: xpub, + ScanN: 5, + Type: WalletTypeXPub, + }, + balGetter: mockTxnsFinder{ + xpubAddrs[5]: true, + }, + expect: exp{ + err: nil, + xpub: xpub, + entryNum: 6, + addrs: xpubAddrs, + }, + }, + { + name: "xpub scan 5 get 9, unencrypted", + opts: Options{ + XPub: xpub, + ScanN: 5, + Type: WalletTypeXPub, + }, + balGetter: mockTxnsFinder{ + xpubAddrs[5]: true, + xpubAddrs[8]: true, + }, + expect: exp{ + err: nil, + xpub: xpub, + entryNum: 9, + addrs: xpubAddrs, + }, + }, + { + name: "xpub scan 5 get 11, unencrypted", + opts: Options{ + XPub: xpub, + ScanN: 5, + Type: WalletTypeXPub, + }, + balGetter: mockTxnsFinder{ + xpubAddrs[4+1]: true, + xpubAddrs[10]: true, + }, + expect: exp{ + err: nil, + xpub: xpub, + entryNum: 11, + addrs: xpubAddrs, + }, + }, + + { + name: "xpub scan 5 get 6, encrypted", + opts: Options{ + XPub: xpub, + Encrypt: true, + Password: []byte("pwd"), + ScanN: 5, + Type: WalletTypeXPub, + }, + balGetter: mockTxnsFinder{ + xpubAddrs[5]: true, + }, + expect: exp{ + err: nil, + xpub: xpub, + entryNum: 6, + addrs: xpubAddrs, + }, + }, + { + name: "xpub scan 5 get 5, unencrypted", + opts: Options{ + XPub: xpub, + ScanN: 5, + Type: WalletTypeXPub, + }, + balGetter: mockTxnsFinder{ + xpubAddrs[3]: true, + xpubAddrs[4]: true, + }, + expect: exp{ + err: nil, + xpub: xpub, + entryNum: 5, + addrs: xpubAddrs, + }, + }, + { + name: "xpub scan 5 get 5, encrypted", + opts: Options{ + XPub: xpub, + Encrypt: true, + Password: []byte("pwd"), + ScanN: 5, + Type: WalletTypeXPub, + }, + balGetter: mockTxnsFinder{ + xpubAddrs[3]: true, + xpubAddrs[4]: true, + }, + expect: exp{ + err: nil, + xpub: xpub, + entryNum: 5, + addrs: xpubAddrs, + }, + }, + { + name: "xpub scan 5 get 5 have 7, unencrypted", + opts: Options{ + XPub: xpub, + ScanN: 5, + Type: WalletTypeXPub, + }, + balGetter: mockTxnsFinder{ + xpubAddrs[3]: true, + xpubAddrs[4]: true, + xpubAddrs[6]: true, + }, + expect: exp{ + err: nil, + xpub: xpub, + entryNum: 7, + addrs: xpubAddrs, + }, + }, + { + name: "xpub scan 5 get 3 have 8, unencrypted", + opts: Options{ + XPub: xpub, + ScanN: 5, + Type: WalletTypeXPub, + }, + balGetter: mockTxnsFinder{ + xpubAddrs[2]: true, + xpubAddrs[7]: true, + }, + expect: exp{ + err: nil, + xpub: xpub, + entryNum: 8, + addrs: xpubAddrs, + }, + }, + { + name: "xpub scan 5 get 3 get 8 have 13, unencrypted", + opts: Options{ + XPub: xpub, + ScanN: 5, + Type: WalletTypeXPub, + }, + balGetter: mockTxnsFinder{ + xpubAddrs[2]: true, + xpubAddrs[7]: true, + xpubAddrs[12]: true, + }, + expect: exp{ + err: nil, + xpub: xpub, + entryNum: 13, + addrs: xpubAddrs, + }, + }, + { + name: "xpub scan 5 get 3 get 8 have 14, unencrypted", + opts: Options{ + XPub: xpub, + ScanN: 5, + Type: WalletTypeXPub, + }, + balGetter: mockTxnsFinder{ + xpubAddrs[2]: true, + xpubAddrs[7]: true, + xpubAddrs[13]: true, + }, + expect: exp{ + err: nil, + xpub: xpub, + entryNum: 8, + addrs: xpubAddrs, + }, + }, + { + name: "xpub scan 5 get 3 have 9, unencrypted", + opts: Options{ + XPub: xpub, + ScanN: 5, + Type: WalletTypeXPub, + }, + balGetter: mockTxnsFinder{ + xpubAddrs[2]: true, + xpubAddrs[8]: true, + }, + expect: exp{ + err: nil, + xpub: xpub, + entryNum: 3, + addrs: xpubAddrs, + }, + }, + { + name: "xpub confirmed and predicted, unencrypted", + opts: Options{ + XPub: xpub, + ScanN: 5, + Type: WalletTypeXPub, + }, + balGetter: mockTxnsFinder{ + xpubAddrs[3]: true, + xpubAddrs[4]: true, + }, + expect: exp{ + err: nil, + xpub: xpub, + entryNum: 5, + addrs: xpubAddrs, + }, + }, + { + name: "xpub confirmed and predicted, encrypted", + opts: Options{ + XPub: xpub, + Encrypt: true, + Password: []byte("pwd"), + ScanN: 5, + Type: WalletTypeXPub, + }, + balGetter: mockTxnsFinder{ + xpubAddrs[3]: true, + xpubAddrs[4]: true, + }, + expect: exp{ + err: nil, + xpub: xpub, + entryNum: 5, + addrs: xpubAddrs, + }, + }, + + { + name: "wallet api disabled", + opts: Options{ + Seed: seed, + Encrypt: true, + Password: []byte("pwd"), + ScanN: 5, + Type: WalletTypeDeterministic, + }, + balGetter: mockTxnsFinder{}, + disableWalletAPI: true, + expect: exp{ + err: ErrWalletAPIDisabled, + }, + }, + } + + for _, tc := range tt { + for ct := range cryptoTable { + name := fmt.Sprintf("crypto=%v %v", ct, tc.name) + t.Run(name, func(t *testing.T) { + dir := prepareWltDir() + s, err := NewService(Config{ + WalletDir: dir, + CryptoType: ct, + EnableWalletAPI: !tc.disableWalletAPI, + }) + require.NoError(t, err) + + wltName := NewWalletFilename() + w, err := s.CreateWallet(wltName, tc.opts, tc.balGetter) + require.Equal(t, tc.expect.err, err) + if err != nil { + return + } + + require.NoError(t, w.Validate()) + + if !w.IsEncrypted() { + require.Equal(t, tc.expect.seed, w.Seed()) + require.Equal(t, tc.expect.lastSeed, w.LastSeed()) + } + require.Equal(t, tc.expect.xpub, w.XPub()) + require.Equal(t, tc.expect.entryNum, w.EntriesLen()) + for i, e := range w.GetEntries() { + require.Equal(t, tc.expect.addrs[i].String(), e.Address.String()) + } + }) + } + } +} + +func TestGetWalletSeed(t *testing.T) { + tt := []struct { + name string + wltName string + opts Options + id string + pwd []byte + disableWalletAPI bool + enableSeedAPI bool + expectErr error + }{ + { + name: "wallet is not encrypted", + wltName: "wallet.wlt", + opts: Options{ + Seed: "seed", + Label: "label", + Type: WalletTypeDeterministic, + }, + id: "wallet.wlt", + enableSeedAPI: true, + expectErr: ErrWalletNotEncrypted, + }, + { + name: "wallet api disabled", + wltName: "wallet.wlt", + opts: Options{ + Seed: "seed", + Label: "label", + Type: WalletTypeDeterministic, + }, + id: "wallet.wlt", + enableSeedAPI: true, + disableWalletAPI: true, + expectErr: ErrWalletAPIDisabled, + }, + { + name: "ok", + wltName: "wallet.wlt", + opts: Options{ + Seed: "seed", + Label: "label", + Encrypt: true, + Password: []byte("pwd"), + Type: WalletTypeDeterministic, + }, + enableSeedAPI: true, + id: "wallet.wlt", + pwd: []byte("pwd"), + }, + { + name: "ok seed passphrase", + wltName: "wallet.wlt", + opts: Options{ + Seed: bip39.MustNewDefaultMnemonic(), + SeedPassphrase: "seed-passphrase", + Label: "label", + Encrypt: true, + Password: []byte("pwd"), + Type: WalletTypeBip44, + }, + enableSeedAPI: true, + id: "wallet.wlt", + pwd: []byte("pwd"), + }, + { + name: "wallet does not exist", + wltName: "wallet.wlt", + opts: Options{ + Seed: "seed", + Label: "label", + Encrypt: true, + Password: []byte("pwd"), + Type: WalletTypeDeterministic, + }, + enableSeedAPI: true, + pwd: []byte("pwd"), + id: "none-exist.wlt", + expectErr: ErrWalletNotExist, + }, + { + name: "disable seed api", + wltName: "wallet.wlt", + opts: Options{ + Seed: "seed", + Label: "label", + Encrypt: true, + Password: []byte("pwd"), + Type: WalletTypeDeterministic, + }, + pwd: []byte("pwd"), + id: "wallet.wlt", + enableSeedAPI: false, + expectErr: ErrSeedAPIDisabled, + }, + } + + for _, tc := range tt { + for ct := range cryptoTable { + t.Run(tc.name, func(t *testing.T) { + dir := prepareWltDir() + s, err := NewService(Config{ + WalletDir: dir, + CryptoType: ct, + EnableWalletAPI: !tc.disableWalletAPI, + EnableSeedAPI: tc.enableSeedAPI, + }) + require.NoError(t, err) + + if tc.disableWalletAPI { + _, _, err = s.GetWalletSeed("", tc.pwd) + require.Equal(t, tc.expectErr, err) + return + } + + // Create a wallet + _, err = s.CreateWallet(tc.wltName, tc.opts, nil) + require.NoError(t, err) + + seed, seedPassphrase, err := s.GetWalletSeed(tc.id, tc.pwd) + require.Equal(t, tc.expectErr, err) + if err != nil { + return + } + + require.Equal(t, tc.opts.Seed, seed) + require.Equal(t, tc.opts.SeedPassphrase, seedPassphrase) + }) + } + } +} + +func TestServiceView(t *testing.T) { + tt := []struct { + name string + wltName string + opts Options + viewWltName string + action func(*testing.T) func(Wallet) error + disableWalletAPI bool + err error + }{ + { + name: "ok, encrypted collection wallet", + wltName: "test-view-collection-encrypted.wlt", + viewWltName: "test-view-collection-encrypted.wlt", + opts: Options{ + Type: WalletTypeCollection, + Encrypt: true, + Password: []byte("pwd"), + Label: "foowlt", + }, + action: func(t *testing.T) func(Wallet) error { + return func(w Wallet) error { + require.Equal(t, "foowlt", w.Label()) + checkNoSensitiveData(t, w) + + // Modify the wallet pointer in order to check that this references a clone and not the original + w.SetLabel(w.Label() + "foo") + + return nil + } + }, + }, + + { + name: "ok, unencrypted collection wallet", + wltName: "test-view-collection-unencrypted.wlt", + viewWltName: "test-view-collection-unencrypted.wlt", + opts: Options{ + Label: "foowlt", + Type: WalletTypeCollection, + }, + action: func(t *testing.T) func(Wallet) error { + return func(w Wallet) error { + require.Equal(t, "foowlt", w.Label()) + // Collection wallets don't have seeds + require.Empty(t, w.Seed()) + require.Empty(t, w.LastSeed()) + + // Modify the wallet pointer in order to check that this references a clone and not the original + w.SetLabel(w.Label() + "foo") + + return nil + } + }, + }, + + { + name: "ok, encrypted xpub wallet", + wltName: "test-view-xpub-encrypted.wlt", + viewWltName: "test-view-xpub-encrypted.wlt", + opts: Options{ + Type: WalletTypeXPub, + Encrypt: true, + Password: []byte("pwd"), + Label: "foowlt", + XPub: "xpub6CkxdS1d4vNqqcnf9xPgqR5e2jE2PZKmKSw93QQMjHE1hRk22nU4zns85EDRgmLWYXYtu62XexwqaET33XA28c26NbXCAUJh1xmqq6B3S2v", + }, + action: func(t *testing.T) func(Wallet) error { + return func(w Wallet) error { + require.Equal(t, "foowlt", w.Label()) + checkNoSensitiveData(t, w) + + require.Equal(t, "xpub6CkxdS1d4vNqqcnf9xPgqR5e2jE2PZKmKSw93QQMjHE1hRk22nU4zns85EDRgmLWYXYtu62XexwqaET33XA28c26NbXCAUJh1xmqq6B3S2v", w.XPub()) + + // Modify the wallet pointer in order to check that this references a clone and not the original + w.SetLabel(w.Label() + "foo") + + return nil + } + }, + }, + + { + name: "ok, unencrypted xpub wallet", + wltName: "test-view-xpub-unencrypted.wlt", + viewWltName: "test-view-xpub-unencrypted.wlt", + opts: Options{ + Label: "foowlt", + Type: WalletTypeXPub, + XPub: "xpub6CkxdS1d4vNqqcnf9xPgqR5e2jE2PZKmKSw93QQMjHE1hRk22nU4zns85EDRgmLWYXYtu62XexwqaET33XA28c26NbXCAUJh1xmqq6B3S2v", + }, + action: func(t *testing.T) func(Wallet) error { + return func(w Wallet) error { + require.Equal(t, "foowlt", w.Label()) + // xpub wallets don't have seeds + require.Empty(t, w.Seed()) + require.Empty(t, w.LastSeed()) + + require.Equal(t, "xpub6CkxdS1d4vNqqcnf9xPgqR5e2jE2PZKmKSw93QQMjHE1hRk22nU4zns85EDRgmLWYXYtu62XexwqaET33XA28c26NbXCAUJh1xmqq6B3S2v", w.XPub()) + + // Modify the wallet pointer in order to check that this references a clone and not the original + w.SetLabel(w.Label() + "foo") + + return nil + } + }, + }, + + { + name: "ok, encrypted bip44 wallet", + wltName: "test-view-bip44-encrypted.wlt", + viewWltName: "test-view-bip44-encrypted.wlt", + opts: Options{ + Type: WalletTypeBip44, + Encrypt: true, + Password: []byte("pwd"), + Label: "foowlt", + Seed: "voyage say extend find sheriff surge priority merit ignore maple cash argue", + }, + action: func(t *testing.T) func(Wallet) error { + return func(w Wallet) error { + require.Equal(t, "foowlt", w.Label()) + checkNoSensitiveData(t, w) + + // Modify the wallet pointer in order to check that this references a clone and not the original + w.SetLabel(w.Label() + "foo") + + return nil + } + }, + }, + + { + name: "ok, unencrypted bip44 wallet", + wltName: "test-view-bip44-unencrypted.wlt", + viewWltName: "test-view-bip44-unencrypted.wlt", + opts: Options{ + Label: "foowlt", + Type: WalletTypeBip44, + Seed: "voyage say extend find sheriff surge priority merit ignore maple cash argue", + SeedPassphrase: "foo", + }, + action: func(t *testing.T) func(Wallet) error { + return func(w Wallet) error { + require.Equal(t, "foowlt", w.Label()) + require.Equal(t, "voyage say extend find sheriff surge priority merit ignore maple cash argue", w.Seed()) + require.Equal(t, "foo", w.SeedPassphrase()) + require.Empty(t, w.LastSeed()) + + // Modify the wallet pointer in order to check that this references a clone and not the original + w.SetLabel(w.Label() + "foo") + + return nil + } + }, + }, + + { + name: "ok, encrypted wallet", + wltName: "test-view-encrypted.wlt", + viewWltName: "test-view-encrypted.wlt", + opts: Options{ + Type: WalletTypeDeterministic, + Seed: "fooseed", + Encrypt: true, + Password: []byte("pwd"), + Label: "foowlt", + }, + action: func(t *testing.T) func(Wallet) error { + return func(w Wallet) error { + require.Equal(t, "foowlt", w.Label()) + checkNoSensitiveData(t, w) + + // Modify the wallet pointer in order to check that this references a clone and not the original + w.SetLabel(w.Label() + "foo") + + return nil + } + }, + }, + + { + name: "ok, unencrypted wallet", + wltName: "test-view-unencrypted.wlt", + viewWltName: "test-view-unencrypted.wlt", + opts: Options{ + Type: WalletTypeDeterministic, + Seed: "fooseed", + Label: "foowlt", + }, + action: func(t *testing.T) func(Wallet) error { + return func(w Wallet) error { + require.Equal(t, "foowlt", w.Label()) + // Seed is visible because its not encrypted + require.Equal(t, "fooseed", w.Seed()) + require.NotEmpty(t, w.LastSeed()) + + // Modify the wallet pointer in order to check that this references a clone and not the original + w.SetLabel(w.Label() + "foo") + + return nil + } + }, + }, + + { + name: "wallet doesn't exist", + wltName: "test-view-not-exist.wlt", + viewWltName: "foo-test-view-not-exist.wlt", + opts: Options{ + Type: WalletTypeDeterministic, + Seed: "fooseed", + Label: "foowlt", + }, + err: ErrWalletNotExist, + }, + + { + name: "api disabled", + wltName: "test-view-api-disabled.wlt", + viewWltName: "test-view-api-disabled.wlt", + opts: Options{ + Type: WalletTypeDeterministic, + Seed: "fooseed", + Label: "foowlt", + }, + disableWalletAPI: true, + err: ErrWalletAPIDisabled, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + dir := prepareWltDir() + s, err := NewService(Config{ + WalletDir: dir, + CryptoType: CryptoTypeSha256Xor, + EnableWalletAPI: true, + }) + require.NoError(t, err) + + w, err := s.CreateWallet(tc.wltName, tc.opts, nil) + require.NoError(t, err) + + if w.Type() == WalletTypeCollection { + err := s.UpdateSecrets(w.Filename(), tc.opts.Password, func(w Wallet) error { + p, s := cipher.GenerateKeyPair() + return w.(*CollectionWallet).AddEntry(Entry{ + Public: p, + Secret: s, + Address: cipher.AddressFromPubKey(p), + }) + }) + require.NoError(t, err) + + w, err = s.GetWallet(tc.wltName) + require.NoError(t, err) + } + + s.config.EnableWalletAPI = !tc.disableWalletAPI + + var action func(Wallet) error + if tc.action != nil { + action = tc.action(t) + } + + err = s.View(tc.viewWltName, action) + + require.Equal(t, tc.err, err) + if err != nil { + return + } + + s.config.EnableWalletAPI = true + + // Check that the wallet is unmodified + w2, err := s.GetWallet(tc.wltName) + require.NoError(t, err) + require.Equal(t, w, w2) + }) + } +} + +func TestServiceViewSecrets(t *testing.T) { + mnemonicSeed := bip39.MustNewDefaultMnemonic() + + tt := []struct { + name string + wltName string + opts Options + viewWltName string + action func(*testing.T) func(Wallet) error + password []byte + disableWalletAPI bool + err error + }{ + { + name: "ok, encrypted wallet", + wltName: "test-view-secrets-encrypted.wlt", + viewWltName: "test-view-secrets-encrypted.wlt", + opts: Options{ + Seed: "fooseed", + Encrypt: true, + Password: []byte("pwd"), + Label: "foowlt", + Type: WalletTypeDeterministic, + }, + password: []byte("pwd"), + action: func(t *testing.T) func(Wallet) error { + return func(w Wallet) error { + require.Equal(t, "foowlt", w.Label()) + + // Should be able to see sensitive data + require.Equal(t, "fooseed", w.Seed()) + require.NotEmpty(t, w.LastSeed()) + + // Modify the wallet pointer in order to check that this references a clone and not the original + w.SetLabel(w.Label() + "foo") + + return nil + } + }, + }, + + { + name: "ok, unencrypted wallet", + wltName: "test-view-secrets-unencrypted.wlt", + viewWltName: "test-view-secrets-unencrypted.wlt", + opts: Options{ + Seed: "fooseed", + Label: "foowlt", + Type: WalletTypeDeterministic, + }, + action: func(t *testing.T) func(Wallet) error { + return func(w Wallet) error { + require.Equal(t, "foowlt", w.Label()) + + // Seed is visible because its not encrypted + require.Equal(t, "fooseed", w.Seed()) + require.NotEmpty(t, w.LastSeed()) + + // Modify the wallet pointer in order to check that this references a clone and not the original + w.SetLabel(w.Label() + "foo") + + return nil + } + }, + }, + + { + name: "ok, encrypted wallet bip44 seed passphrase", + wltName: "test-view-secrets-encrypted-bip44.wlt", + viewWltName: "test-view-secrets-encrypted-bip44.wlt", + opts: Options{ + Seed: mnemonicSeed, + SeedPassphrase: "foobar", + Encrypt: true, + Password: []byte("pwd"), + Label: "foowlt", + Type: WalletTypeBip44, + }, + password: []byte("pwd"), + action: func(t *testing.T) func(Wallet) error { + return func(w Wallet) error { + require.Equal(t, "foowlt", w.Label()) + + // Should be able to see sensitive data + require.Equal(t, mnemonicSeed, w.Seed()) + require.Equal(t, "foobar", w.SeedPassphrase()) + require.Empty(t, w.LastSeed()) + + // Modify the wallet pointer in order to check that this references a clone and not the original + w.SetLabel(w.Label() + "foo") + + return nil + } + }, + }, + + { + name: "ok, unencrypted wallet bip44", + wltName: "test-view-secrets-unencrypted-bip44.wlt", + viewWltName: "test-view-secrets-unencrypted-bip44.wlt", + opts: Options{ + Seed: mnemonicSeed, + Label: "foowlt", + Type: WalletTypeBip44, + }, + action: func(t *testing.T) func(Wallet) error { + return func(w Wallet) error { + require.Equal(t, "foowlt", w.Label()) + + // Seed is visible because its not encrypted + require.Equal(t, mnemonicSeed, w.Seed()) + require.Empty(t, w.SeedPassphrase()) + require.Empty(t, w.LastSeed()) + + // Modify the wallet pointer in order to check that this references a clone and not the original + w.SetLabel(w.Label() + "foo") + + return nil + } + }, + }, + + { + name: "ok, unencrypted wallet bip44 seed passphrase", + wltName: "test-view-secrets-unencrypted-bip44.wlt", + viewWltName: "test-view-secrets-unencrypted-bip44.wlt", + opts: Options{ + Seed: mnemonicSeed, + SeedPassphrase: "foobar", + Label: "foowlt", + Type: WalletTypeBip44, + }, + action: func(t *testing.T) func(Wallet) error { + return func(w Wallet) error { + require.Equal(t, "foowlt", w.Label()) + + // Seed is visible because its not encrypted + require.Equal(t, mnemonicSeed, w.Seed()) + require.Equal(t, "foobar", w.SeedPassphrase()) + require.Empty(t, w.LastSeed()) + + // Modify the wallet pointer in order to check that this references a clone and not the original + w.SetLabel(w.Label() + "foo") + + return nil + } + }, + }, + + { + name: "encrypted wallet but password not provided", + wltName: "test-view-secrets-encrypted-no-password.wlt", + viewWltName: "test-view-secrets-encrypted-no-password.wlt", + opts: Options{ + Seed: "fooseed", + Encrypt: true, + Password: []byte("pwd"), + Label: "foowlt", + Type: WalletTypeDeterministic, + }, + err: ErrMissingPassword, + }, + + { + name: "encrypted wallet but password invalid", + wltName: "test-view-secrets-encrypted-wrong-password.wlt", + viewWltName: "test-view-secrets-encrypted-wrong-password.wlt", + opts: Options{ + Seed: "fooseed", + Encrypt: true, + Password: []byte("pwd"), + Label: "foowlt", + Type: WalletTypeDeterministic, + }, + password: []byte("pwdpwd"), + err: ErrInvalidPassword, + }, + + { + name: "unencrypted wallet but password provided", + wltName: "test-view-secrets-unencrypted-password.wlt", + viewWltName: "test-view-secrets-unencrypted-password.wlt", + opts: Options{ + Seed: "fooseed", + Label: "foowlt", + Type: WalletTypeDeterministic, + }, + password: []byte("pwd"), + err: ErrWalletNotEncrypted, + }, + + { + name: "wallet doesn't exist", + wltName: "test-view-secrets-not-exist.wlt", + viewWltName: "foo-test-view-secrets-not-exist.wlt", + opts: Options{ + Seed: "fooseed", + Label: "foowlt", + Type: WalletTypeDeterministic, + }, + err: ErrWalletNotExist, + }, + + { + name: "api disabled", + wltName: "test-view-secrets-api-disabled.wlt", + viewWltName: "test-view-secrets-api-disabled.wlt", + opts: Options{ + Seed: "fooseed", + Label: "foowlt", + Type: WalletTypeDeterministic, + }, + disableWalletAPI: true, + err: ErrWalletAPIDisabled, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + dir := prepareWltDir() + s, err := NewService(Config{ + WalletDir: dir, + CryptoType: CryptoTypeSha256Xor, + EnableWalletAPI: true, + }) + require.NoError(t, err) + + w, err := s.CreateWallet(tc.wltName, tc.opts, nil) + require.NoError(t, err) + + s.config.EnableWalletAPI = !tc.disableWalletAPI + + var action func(Wallet) error + if tc.action != nil { + action = tc.action(t) + } + + err = s.ViewSecrets(tc.viewWltName, tc.password, action) + require.Equal(t, tc.err, err) + if err != nil { + return + } + + s.config.EnableWalletAPI = true + + // Check that the wallet is unmodified + w2, err := s.GetWallet(tc.wltName) + require.NoError(t, err) + require.Equal(t, w, w2) + }) + } +} + +func TestServiceUpdate(t *testing.T) { + tt := []struct { + name string + wltName string + opts Options + viewWltName string + action func(*testing.T) func(Wallet) error + checkWallet func(*testing.T, Wallet) + disableWalletAPI bool + err error + }{ + { + name: "ok, encrypted wallet", + wltName: "test-update-encrypted.wlt", + viewWltName: "test-update-encrypted.wlt", + opts: Options{ + Seed: "fooseed", + Encrypt: true, + Password: []byte("pwd"), + Label: "foowlt", + Type: WalletTypeDeterministic, + }, + action: func(t *testing.T) func(Wallet) error { + return func(w Wallet) error { + require.Equal(t, "foowlt", w.Label()) + + // Should not be able to see sensitive data + checkNoSensitiveData(t, w) + + // Modify the wallet pointer in order to check that the wallet gets saved + w.SetLabel(w.Label() + "foo") + + // The wallet is encrypted so it cannot generate more addresses + _, err := w.GenerateAddresses(1) + require.Equal(t, ErrWalletEncrypted, err) + + return nil + } + }, + checkWallet: func(t *testing.T, w Wallet) { + require.Equal(t, "foowltfoo", w.Label()) + require.Equal(t, 1, w.EntriesLen()) + checkNoSensitiveData(t, w) + }, + }, + + { + name: "ok, unencrypted wallet", + wltName: "test-update-unencrypted.wlt", + viewWltName: "test-update-unencrypted.wlt", + opts: Options{ + Seed: "fooseed", + Label: "foowlt", + Type: WalletTypeDeterministic, + }, + action: func(t *testing.T) func(Wallet) error { + return func(w Wallet) error { + require.Equal(t, "foowlt", w.Label()) + + // Seed is visible because its not encrypted + require.Equal(t, "fooseed", w.Seed()) + require.NotEmpty(t, w.LastSeed()) + + // Modify the wallet pointer in order to check that the wallet gets saved + w.SetLabel(w.Label() + "foo") + + return nil + } + }, + checkWallet: func(t *testing.T, w Wallet) { + require.Equal(t, "foowltfoo", w.Label()) + require.Equal(t, 1, w.EntriesLen()) + require.NotEmpty(t, w.GetEntryAt(0).Secret) + }, + }, + + { + name: "wallet doesn't exist", + wltName: "test-update-not-exist.wlt", + viewWltName: "foo-test-update-not-exist.wlt", + opts: Options{ + Seed: "fooseed", + Label: "foowlt", + Type: WalletTypeDeterministic, + }, + err: ErrWalletNotExist, + }, + + { + name: "api disabled", + wltName: "test-update-api-disabled.wlt", + viewWltName: "test-update-api-disabled.wlt", + opts: Options{ + Seed: "fooseed", + Label: "foowlt", + Type: WalletTypeDeterministic, + }, + disableWalletAPI: true, + err: ErrWalletAPIDisabled, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + dir := prepareWltDir() + s, err := NewService(Config{ + WalletDir: dir, + CryptoType: CryptoTypeSha256Xor, + EnableWalletAPI: true, + }) + require.NoError(t, err) + + _, err = s.CreateWallet(tc.wltName, tc.opts, nil) + require.NoError(t, err) + + s.config.EnableWalletAPI = !tc.disableWalletAPI + + var action func(Wallet) error + if tc.action != nil { + action = tc.action(t) + } + + err = s.Update(tc.viewWltName, action) + require.Equal(t, tc.err, err) + if err != nil { + return + } + + s.config.EnableWalletAPI = true + + // Check that the wallet was modified as expected + w, err := s.GetWallet(tc.wltName) + require.NoError(t, err) + tc.checkWallet(t, w) + + // Even if secrets were modified, wallet should still be encrypted + require.Equal(t, tc.opts.Encrypt, w.IsEncrypted()) + if w.IsEncrypted() { + checkNoSensitiveData(t, w) + } + }) + } +} + +func TestServiceUpdateSecrets(t *testing.T) { + tt := []struct { + name string + wltName string + opts Options + viewWltName string + action func(*testing.T) func(Wallet) error + checkWallet func(*testing.T, Wallet) + password []byte + disableWalletAPI bool + err error + }{ + { + name: "ok, encrypted wallet", + wltName: "test-update-secrets-encrypted.wlt", + viewWltName: "test-update-secrets-encrypted.wlt", + opts: Options{ + Seed: "fooseed", + Encrypt: true, + Password: []byte("pwd"), + Label: "foowlt", + Type: WalletTypeDeterministic, + }, + password: []byte("pwd"), + action: func(t *testing.T) func(Wallet) error { + return func(w Wallet) error { + require.Equal(t, "foowlt", w.Label()) + + // Should be able to see sensitive data + require.Equal(t, "fooseed", w.Seed()) + require.NotEmpty(t, w.LastSeed()) + + // Modify the wallet pointer in order to check that the wallet gets saved + w.SetLabel(w.Label() + "foo") + _, err := w.GenerateAddresses(1) + require.NoError(t, err) + + return nil + } + }, + checkWallet: func(t *testing.T, w Wallet) { + require.Equal(t, "foowltfoo", w.Label()) + require.Equal(t, 2, w.EntriesLen()) + checkNoSensitiveData(t, w) + }, + }, + + { + name: "ok, unencrypted wallet", + wltName: "test-update-secrets-unencrypted.wlt", + viewWltName: "test-update-secrets-unencrypted.wlt", + opts: Options{ + Seed: "fooseed", + Label: "foowlt", + Type: WalletTypeDeterministic, + }, + action: func(t *testing.T) func(Wallet) error { + return func(w Wallet) error { + require.Equal(t, "foowlt", w.Label()) + + // Seed is visible because its not encrypted + require.Equal(t, "fooseed", w.Seed()) + require.NotEmpty(t, w.LastSeed()) + + // Modify the wallet pointer in order to check that the wallet gets saved + w.SetLabel(w.Label() + "foo") + _, err := w.GenerateAddresses(1) + require.NoError(t, err) + + return nil + } + }, + checkWallet: func(t *testing.T, w Wallet) { + require.Equal(t, "foowltfoo", w.Label()) + require.Equal(t, 2, w.EntriesLen()) + require.NotEmpty(t, w.GetEntryAt(1).Secret) + }, + }, + + { + name: "ok, encrypted bip44 wallet", + wltName: "test-update-secrets-bip44-encrypted.wlt", + viewWltName: "test-update-secrets-bip44-encrypted.wlt", + opts: Options{ + Seed: "voyage say extend find sheriff surge priority merit ignore maple cash argue", + Encrypt: true, + Password: []byte("pwd"), + Label: "foowltbip44", + Type: WalletTypeBip44, + }, + password: []byte("pwd"), + action: func(t *testing.T) func(Wallet) error { + return func(w Wallet) error { + require.Equal(t, "foowltbip44", w.Label()) + + // Should be able to see sensitive data + require.Equal(t, "voyage say extend find sheriff surge priority merit ignore maple cash argue", w.Seed()) + require.Empty(t, w.LastSeed()) + + // Modify the wallet pointer in order to check that the wallet gets saved + w.SetLabel(w.Label() + "foo") + _, err := w.GenerateAddresses(1) + require.NoError(t, err) + + return nil + } + }, + checkWallet: func(t *testing.T, w Wallet) { + require.Equal(t, "foowltbip44foo", w.Label()) + require.Equal(t, 2, w.EntriesLen()) + checkNoSensitiveData(t, w) + }, + }, + + { + name: "ok, unencrypted bip44 wallet", + wltName: "test-update-secrets-bip44-unencrypted.wlt", + viewWltName: "test-update-secrets-bip44-unencrypted.wlt", + opts: Options{ + Seed: "voyage say extend find sheriff surge priority merit ignore maple cash argue", + Label: "foowltbip44", + Type: WalletTypeBip44, + }, + action: func(t *testing.T) func(Wallet) error { + return func(w Wallet) error { + require.Equal(t, "foowltbip44", w.Label()) + + // Seed is visible because its not encrypted + require.Equal(t, "voyage say extend find sheriff surge priority merit ignore maple cash argue", w.Seed()) + require.Empty(t, w.LastSeed()) + + // Modify the wallet pointer in order to check that the wallet gets saved + w.SetLabel(w.Label() + "foo") + _, err := w.GenerateAddresses(1) + require.NoError(t, err) + + return nil + } + }, + checkWallet: func(t *testing.T, w Wallet) { + require.Equal(t, "foowltbip44foo", w.Label()) + require.Equal(t, 2, w.EntriesLen()) + require.NotEmpty(t, w.GetEntryAt(1).Secret) + }, + }, + + { + name: "encrypted wallet but password not provided", + wltName: "test-update-secrets-encrypted-no-password.wlt", + viewWltName: "test-update-secrets-encrypted-no-password.wlt", + opts: Options{ + Seed: "fooseed", + Encrypt: true, + Password: []byte("pwd"), + Label: "foowlt", + Type: WalletTypeDeterministic, + }, + err: ErrMissingPassword, + }, + + { + name: "encrypted wallet but password invalid", + wltName: "test-update-secrets-encrypted-wrong-password.wlt", + viewWltName: "test-update-secrets-encrypted-wrong-password.wlt", + opts: Options{ + Seed: "fooseed", + Encrypt: true, + Password: []byte("pwd"), + Label: "foowlt", + Type: WalletTypeDeterministic, + }, + password: []byte("pwdpwd"), + err: ErrInvalidPassword, + }, + + { + name: "unencrypted wallet but password provided", + wltName: "test-update-secrets-unencrypted-password.wlt", + viewWltName: "test-update-secrets-unencrypted-password.wlt", + opts: Options{ + Seed: "fooseed", + Label: "foowlt", + Type: WalletTypeDeterministic, + }, + password: []byte("pwd"), + err: ErrWalletNotEncrypted, + }, + + { + name: "wallet doesn't exist", + wltName: "test-update-secrets-not-exist.wlt", + viewWltName: "foo-test-update-secrets-not-exist.wlt", + opts: Options{ + Seed: "fooseed", + Label: "foowlt", + Type: WalletTypeDeterministic, + }, + err: ErrWalletNotExist, + }, + + { + name: "api disabled", + wltName: "test-update-secrets-api-disabled.wlt", + viewWltName: "test-update-secrets-api-disabled.wlt", + opts: Options{ + Seed: "fooseed", + Label: "foowlt", + Type: WalletTypeDeterministic, + }, + disableWalletAPI: true, + err: ErrWalletAPIDisabled, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + dir := prepareWltDir() + s, err := NewService(Config{ + WalletDir: dir, + CryptoType: CryptoTypeSha256Xor, + EnableWalletAPI: true, + }) + require.NoError(t, err) + + _, err = s.CreateWallet(tc.wltName, tc.opts, nil) + require.NoError(t, err) + + s.config.EnableWalletAPI = !tc.disableWalletAPI + + var action func(Wallet) error + if tc.action != nil { + action = tc.action(t) + } + + err = s.UpdateSecrets(tc.viewWltName, tc.password, action) + require.Equal(t, tc.err, err) + if err != nil { + return + } + + s.config.EnableWalletAPI = true + + // Check that the wallet was modified as expected + w, err := s.GetWallet(tc.wltName) + require.NoError(t, err) + tc.checkWallet(t, w) + + // Even if secrets were modified, wallet should still be encrypted + require.Equal(t, tc.opts.Encrypt, w.IsEncrypted()) + if w.IsEncrypted() { + checkNoSensitiveData(t, w) + } + }) + } +} + +func checkNoSensitiveData(t *testing.T, w Wallet) { + require.Empty(t, w.Seed()) + require.Empty(t, w.LastSeed()) + require.Empty(t, w.SeedPassphrase()) + for _, e := range w.GetEntries() { + require.True(t, e.Secret.Null()) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/duplicate_wallets/test3.1.wlt b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/duplicate_wallets/test3.1.wlt new file mode 100644 index 00000000..bf15c60d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/duplicate_wallets/test3.1.wlt @@ -0,0 +1,19 @@ +{ + "meta": { + "coin": "sky", + "filename": "2017_08_23_5e7d.wlt", + "label": "test2", + "lastSeed": "f3a7942899ed2723999288ea83f4f20908bf9deabc05bc8216339da4d3e02c0b", + "seed": "acoustic test story tank thrive wine able frequent marriage use swim develop", + "tm": "1503458890", + "type": "deterministic", + "version": "0.1" + }, + "entries": [ + { + "address": "2M755W9o7933roLASK9PZTmqRsjQUsVen9y", + "public_key": "03a179e412d9d27e14ba647177648a871a7311f15a5312064c7abac1d72764081c", + "secret_key": "7889f1d107dade4369bbb1ab6a55cf74a31d0524601398f03a57c5b0b1f5444b" + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/duplicate_wallets/test3.wlt b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/duplicate_wallets/test3.wlt new file mode 100644 index 00000000..bf15c60d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/duplicate_wallets/test3.wlt @@ -0,0 +1,19 @@ +{ + "meta": { + "coin": "sky", + "filename": "2017_08_23_5e7d.wlt", + "label": "test2", + "lastSeed": "f3a7942899ed2723999288ea83f4f20908bf9deabc05bc8216339da4d3e02c0b", + "seed": "acoustic test story tank thrive wine able frequent marriage use swim develop", + "tm": "1503458890", + "type": "deterministic", + "version": "0.1" + }, + "entries": [ + { + "address": "2M755W9o7933roLASK9PZTmqRsjQUsVen9y", + "public_key": "03a179e412d9d27e14ba647177648a871a7311f15a5312064c7abac1d72764081c", + "secret_key": "7889f1d107dade4369bbb1ab6a55cf74a31d0524601398f03a57c5b0b1f5444b" + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/empty_bip44_wallet/empty.wlt b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/empty_bip44_wallet/empty.wlt new file mode 100644 index 00000000..c5b16186 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/empty_bip44_wallet/empty.wlt @@ -0,0 +1,15 @@ +{ + "meta": { + "bip44Coin": "8000", + "coin": "skycoin", + "filename": "empty.wlt", + "label": "test3", + "lastSeed": "", + "secrets": "", + "seed": "buddy fossil side modify turtle door label grunt baby worth brush master", + "tm": "1503458909", + "type": "bip44", + "version": "0.3" + }, + "entries": [] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/empty_wallet/empty.wlt b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/empty_wallet/empty.wlt new file mode 100644 index 00000000..afeca2dd --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/empty_wallet/empty.wlt @@ -0,0 +1,14 @@ +{ + "meta": { + "coin": "skycoin", + "filename": "2017_08_23_3d3b.wlt", + "label": "test3", + "lastSeed": "9182b02c0004217ba9a55593f8cf0abecc30d041e094b266dbb5103e1919adaf", + "seed": "buddy fossil side modify turtle door label grunt baby worth brush master", + "tm": "1503458909", + "type": "deterministic", + "version": "0.1" + }, + "entries": [] +} + diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/invalid_wallets/err_type.wlt b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/invalid_wallets/err_type.wlt new file mode 100644 index 00000000..9f62934b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/invalid_wallets/err_type.wlt @@ -0,0 +1,19 @@ +{ + "meta": { + "coin": "sky", + "filename": "2017_08_23_3d3b.wlt", + "label": "test3", + "lastSeed": "9182b02c0004217ba9a55593f8cf0abecc30d041e094b266dbb5103e1919adaf", + "seed": "buddy fossil side modify turtle door label grunt baby worth brush master", + "tm": "1503458909", + "type": "invalid_type", + "version": "0.1" + }, + "entries": [ + { + "address": "JUdRuTiqD1mGcw358twMg3VPpXpzbkdRvJ", + "public_key": "028ef95b281f1bd6483f0c5c1ed1144b77c360b92a4eb48f681a6dff67a7c2dab1", + "secret_key": "1fc5396e91e60b9fc613d004ea5bd2ccea17053a12127301b3857ead76fdb93e" + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/invalid_wallets/no_coin.wlt b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/invalid_wallets/no_coin.wlt new file mode 100644 index 00000000..aa22c318 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/invalid_wallets/no_coin.wlt @@ -0,0 +1,18 @@ +{ + "meta": { + "filename": "2017_08_23_3d3b.wlt", + "label": "test3", + "lastSeed": "9182b02c0004217ba9a55593f8cf0abecc30d041e094b266dbb5103e1919adaf", + "seed": "buddy fossil side modify turtle door label grunt baby worth brush master", + "tm": "1503458909", + "type": "deterministic", + "version": "0.1" + }, + "entries": [ + { + "address": "JUdRuTiqD1mGcw358twMg3VPpXpzbkdRvJ", + "public_key": "028ef95b281f1bd6483f0c5c1ed1144b77c360b92a4eb48f681a6dff67a7c2dab1", + "secret_key": "1fc5396e91e60b9fc613d004ea5bd2ccea17053a12127301b3857ead76fdb93e" + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/invalid_wallets/no_seed.wlt b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/invalid_wallets/no_seed.wlt new file mode 100644 index 00000000..e6e26ed0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/invalid_wallets/no_seed.wlt @@ -0,0 +1,18 @@ +{ + "meta": { + "coin": "sky", + "filename": "2017_08_23_3d3b.wlt", + "label": "test3", + "lastSeed": "9182b02c0004217ba9a55593f8cf0abecc30d041e094b266dbb5103e1919adaf", + "tm": "1503458909", + "type": "deterministic", + "version": "0.1" + }, + "entries": [ + { + "address": "JUdRuTiqD1mGcw358twMg3VPpXpzbkdRvJ", + "public_key": "028ef95b281f1bd6483f0c5c1ed1144b77c360b92a4eb48f681a6dff67a7c2dab1", + "secret_key": "1fc5396e91e60b9fc613d004ea5bd2ccea17053a12127301b3857ead76fdb93e" + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/invalid_wallets/no_type.wlt b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/invalid_wallets/no_type.wlt new file mode 100644 index 00000000..1376dbd7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/invalid_wallets/no_type.wlt @@ -0,0 +1,18 @@ +{ + "meta": { + "coin": "sky", + "filename": "2017_08_23_3d3b.wlt", + "label": "test3", + "lastSeed": "9182b02c0004217ba9a55593f8cf0abecc30d041e094b266dbb5103e1919adaf", + "seed": "buddy fossil side modify turtle door label grunt baby worth brush master", + "tm": "1503458909", + "version": "0.1" + }, + "entries": [ + { + "address": "JUdRuTiqD1mGcw358twMg3VPpXpzbkdRvJ", + "public_key": "028ef95b281f1bd6483f0c5c1ed1144b77c360b92a4eb48f681a6dff67a7c2dab1", + "secret_key": "1fc5396e91e60b9fc613d004ea5bd2ccea17053a12127301b3857ead76fdb93e" + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/scrypt-chacha20poly1305-encrypted.wlt b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/scrypt-chacha20poly1305-encrypted.wlt new file mode 100644 index 00000000..c75f1726 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/scrypt-chacha20poly1305-encrypted.wlt @@ -0,0 +1,27 @@ +{ + "meta": { + "coin": "skycoin", + "cryptoType": "scrypt-chacha20poly1305", + "encrypted": "true", + "filename": "scrypt-chacha20poly1305-encrypted.wlt", + "label": "scrypt-chacha20poly1305", + "lastSeed": "", + "secrets": "dAB7Im4iOjMyNzY4LCJyIjo4LCJwIjoxLCJrZXlMZW4iOjMyLCJzYWx0IjoiT2kxTVd2cE1CVmRCYXVCZldhOGs0MVFhWFRrWnBVeTRkd1N3dTVsZjV5Zz0iLCJub25jZSI6Ik1aeFdvRGVza1N4OGdsd1gifXuy+kX89cwbM2pxsPYRcRg+lObHyQjlPDB/aO8nh/rRhs1KZp8/BZUZmluxgGlSVMT80A567kgc4Y+q4E5OA4GgdVlE3ca63oKHO/ujCzYSBdY28HkbxzYIRVlvJZYMEExA8Zd5LQFBnAjXcQpiSRTggT3mf3byewfCUHj3IgtDoN1gpOlTZx+1ecH8aUFtJTlxnO9l2xFRfUCPxoG6natG3yiVfK63J21FlRAJO/763u+YmRr9dpn89bA3Ol6Rpq9X+ghJjawK31kWWbxsmdEBIQfxf8fOwMJpn6q7ickU0wioHZ/dxxybvFO34enTTrXYSXxeJAAx00YCAmpWvXAwYQdqZt8RKVrp4m+U8lTR0AWlMeKiq9Vre+PdeaSPhHgMQCBslph8oB6eWGIbofKX3L5ypNbFWFCFA3FF2yf4c1r1NNTgeBvmceIpShlkgJnTXa++AQ==", + "seed": "", + "tm": "1549801137", + "type": "deterministic", + "version": "0.2" + }, + "entries": [ + { + "address": "LxcitUpWQZbPjgEPs6R1i3G4Xa31nPMoSG", + "public_key": "0300f6b15377b0917062199bb90bb5eb6bd4ec6408cf99b0f25ad39280628f276b", + "secret_key": "" + }, + { + "address": "2EJMjg7nV4DMrkshnvwg7tLdibeuu7DKvZh", + "public_key": "02f101936835d944aef21930bb078de22da7154fb9a0c66d9f2a07a380bbe8fafe", + "secret_key": "" + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/sha256xor-encrypted.wlt b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/sha256xor-encrypted.wlt new file mode 100644 index 00000000..04138661 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/sha256xor-encrypted.wlt @@ -0,0 +1,22 @@ +{ + "meta": { + "coin": "skycoin", + "cryptoType": "sha256-xor", + "encrypted": "true", + "filename": "sha256xor-encrypted.wlt", + "label": "sha256xor", + "lastSeed": "", + "secrets": "gnuCNYiwuFN/eyAvOZYTYB+/ALRgkh5omR/7xyJIIsSrEQtMLkXrms05tYe0r5px1DHNASHz5jUg0T3RH4dS/fTusy2SORIq00f5rZLqLP9q+ySMKxhMBa1JPW64mSDRlVV9nS3LqTu06baSwDvN3wL8KtmbNVYxQ9PN8nk3plG2agiEW6/UpqUR1F2oWO58w9uwdy7rz2pS/QztlFoWVlQd9F9tNhDJEesCX5zTsxsd5O1glsKnagzy3216x4AQfC3LJZj3DiUTTXx0nMKzbLMsmwmYL0ZW/9ACtzU/1rWcVzQe95B8E4f7n8JoLLn4Mg1JATKHG7ISpunOVzLz6Yxyqh8azbaSemxR4lCgw1bbOZQryn3l5JX7ReZAW/JoJgNJ4aaaYZ/u0Tg94feOQgaJq6cKVNB8lHjU8zHfpbc=", + "seed": "", + "tm": "1549801106", + "type": "deterministic", + "version": "0.2" + }, + "entries": [ + { + "address": "kqc4S2EJNLMQ11hwo3Vg2ZvNc3CksDXnPy", + "public_key": "03c4aca54b68dda7eaf947d83c25d99b84becf8714b666d283b4f23b40d7e9e172", + "secret_key": "" + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/test1.wlt b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/test1.wlt new file mode 100644 index 00000000..d2283fca --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/test1.wlt @@ -0,0 +1,19 @@ +{ + "meta": { + "coin": "skycoin", + "filename": "2017_08_23_3d3b.wlt", + "label": "test3", + "lastSeed": "9182b02c0004217ba9a55593f8cf0abecc30d041e094b266dbb5103e1919adaf", + "seed": "buddy fossil side modify turtle door label grunt baby worth brush master", + "tm": "1503458909", + "type": "deterministic", + "version": "0.1" + }, + "entries": [ + { + "address": "JUdRuTiqD1mGcw358twMg3VPpXpzbkdRvJ", + "public_key": "028ef95b281f1bd6483f0c5c1ed1144b77c360b92a4eb48f681a6dff67a7c2dab1", + "secret_key": "1fc5396e91e60b9fc613d004ea5bd2ccea17053a12127301b3857ead76fdb93e" + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/test2.wlt b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/test2.wlt new file mode 100644 index 00000000..fa7020a3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/test2.wlt @@ -0,0 +1,19 @@ +{ + "meta": { + "coin": "sky", + "filename": "2017_08_23_46d6.wlt", + "label": "test1", + "lastSeed": "67de80ac3ae025c8742bec541da7018d08fa351983557d2bc753e90e24337d13", + "seed": "sample assume enjoy museum behind horror mad reward forward reform valley planet", + "tm": "1503458877", + "type": "deterministic", + "version": "0.1" + }, + "entries": [ + { + "address": "2ULfxDUuenUY5V4Pr8whmoAwFdUseXNyjXC", + "public_key": "03595cffa8e5906b08be0c6bf907c9b6ad70f422b7c875b1a0da2c11114145c71f", + "secret_key": "7154a28fc9939a759cd00067130507e118e8e068ed0df595d488c2562ce8c9f0" + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/test3.wlt b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/test3.wlt new file mode 100644 index 00000000..bf15c60d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/test3.wlt @@ -0,0 +1,19 @@ +{ + "meta": { + "coin": "sky", + "filename": "2017_08_23_5e7d.wlt", + "label": "test2", + "lastSeed": "f3a7942899ed2723999288ea83f4f20908bf9deabc05bc8216339da4d3e02c0b", + "seed": "acoustic test story tank thrive wine able frequent marriage use swim develop", + "tm": "1503458890", + "type": "deterministic", + "version": "0.1" + }, + "entries": [ + { + "address": "2M755W9o7933roLASK9PZTmqRsjQUsVen9y", + "public_key": "03a179e412d9d27e14ba647177648a871a7311f15a5312064c7abac1d72764081c", + "secret_key": "7889f1d107dade4369bbb1ab6a55cf74a31d0524601398f03a57c5b0b1f5444b" + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/test4-collection.wlt b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/test4-collection.wlt new file mode 100644 index 00000000..51ee6fd7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/test4-collection.wlt @@ -0,0 +1,19 @@ +{ + "meta": { + "coin": "skycoin", + "filename": "2099_09_99_5a5a.wlt", + "label": "test3", + "lastSeed": "", + "seed": "", + "tm": "1503458909", + "type": "collection", + "version": "0.2" + }, + "entries": [ + { + "address": "JUdRuTiqD1mGcw358twMg3VPpXpzbkdRvJ", + "public_key": "028ef95b281f1bd6483f0c5c1ed1144b77c360b92a4eb48f681a6dff67a7c2dab1", + "secret_key": "1fc5396e91e60b9fc613d004ea5bd2ccea17053a12127301b3857ead76fdb93e" + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/test5-bip44.wlt b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/test5-bip44.wlt new file mode 100644 index 00000000..f1ffc18f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/test5-bip44.wlt @@ -0,0 +1,67 @@ +{ + "meta": { + "bip44Coin": "8000", + "coin": "skycoin", + "cryptoType": "", + "encrypted": "false", + "filename": "test5-bip44.wlt", + "label": "test5-bip44", + "lastSeed": "", + "secrets": "", + "seed": "voyage say extend find sheriff surge priority merit ignore maple cash argue", + "seedPassphrase": "", + "tm": "1562233771", + "type": "bip44", + "version": "0.3" + }, + "entries": [ + { + "address": "9BSEAEE3XGtQ2X43BCT2XCYgheGLQQigEG", + "public_key": "02074cad04ddc61c355a2b0faf3099fb6261731eaa5d12fb5ce36cff5829583848", + "secret_key": "8e6d170ac29f26b3824428dcbd9849070739a02e6ec4d646a52fd9d48ddae67e", + "xprv": "xprvA43Cg6rd3Fv1Tcin9JPQLVhgYULdp8WnHDUUswZxEjXuQi9sMQ6gUEgFsUFhWV5e5eUZ3qhyMMEDrnZDrMjNKmFfV5mGA5rGBmLUABo4RFG", + "child_number": 0, + "change": 0 + }, + { + "address": "29cnQPHuWHCRF26LEAb2gR83ywnF3F9HduW", + "public_key": "03055c0e3af16ca8fa61a162a709984e5c7aaf0673f953a69954e039b28f39a076", + "secret_key": "99995e4fd3261ca5aa3baff8e686bc404f9c92ce5fb35cee403586699a661d70", + "xprv": "xprvA43Cg6rd3Fv1VgENQXHX3Gsu6gF9bUyMfhRhmU4SsJDrGb83VqmR7XV8DYeKYPoQG2A8jQU64Mo2jMq5hzPzsWpujhWj8L2D5VM4bgEnRCB", + "child_number": 1, + "change": 0 + }, + { + "address": "2ZUAv9MGSpDKR3dnKMUnrKqLenV22JXAxzP", + "public_key": "0297e32c9672586956fa26fca605a1ec4ff01b6922c190003cb50d00aacd12436d", + "secret_key": "580651e6ab86c93e895f187c0364564771d396d8e9884572abfffca0c7c766ef", + "xprv": "xprvA43Cg6rd3Fv1Y776WqJ9mHhU7htii6wVLmT3d395hxJwj6wQL9tGoboSyeJ9phJbd7BmnZgouUFXXKdWVnsH4g7EyycK34PzwSu3KhSx5Tc", + "child_number": 2, + "change": 0 + }, + { + "address": "oHvj7oy8maES9HJiQHJTp4GvcUcpz3voDq", + "public_key": "02ca3ee1a6092bb8bafc2a57c26412edc2b7de1dd0d8eb5b5b40819aee756dcced", + "secret_key": "2f293ac9d02bc119165d0f2226f045cb31f49b0ec03f53a7b792518e75f8ce6b", + "xprv": "xprvA2d34WiJh6wNHLFn4PfTEV5JosmypCXrmWW7ZM2cp4B5MdmwSWx7CRdfGgPRyjmCJmGdDg2VXaDDfWjetD58DpM8kXWArTtDi1chvpk1SPJ", + "child_number": 0, + "change": 1 + }, + { + "address": "2SGMfTFV2zbQzGw7aJm1D5EeEPgych5ixuC", + "public_key": "024360f9304b4a40496a1ea4653df912c7b3fa5123fce5db421f099b10d9d8941e", + "secret_key": "67486d242223e4d5f813d6b9087574c80ae47452047cd6cebaae77d5e8996544", + "xprv": "xprvA2d34WiJh6wNK4nyMBcFov4SrH6stzduRUY8HpVT2yx6A38ZeV9fqBGvT8oTUhnomaDmdkNpUM56Ud86gEuRgvtQQ3sRRHwR3UhdZmrnMiV", + "child_number": 1, + "change": 1 + }, + { + "address": "2ymjULRdbiFoUNJKNhWbQ3JqdE8TXnZkyU", + "public_key": "03e3344a7d378dbfe4f872ae831196937b673e8c15990dad817f9cbbf4beb22f3f", + "secret_key": "f16b5785fd48ef0583c1a5f7ca78a3acc9f7132f0742a3611912869e00d55c53", + "xprv": "xprvA2d34WiJh6wNNtD9MggscueaCHUAgQAszuTEZddfzsM6GZWy6DPLBsAaPoAGVjQuECFk5Tn2xEZ7ya33cZtR1K646kEceywkYqMmSgJeXgF", + "child_number": 2, + "change": 1 + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/test6-bip44.wlt b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/test6-bip44.wlt new file mode 100644 index 00000000..4f558f20 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/test6-bip44.wlt @@ -0,0 +1,40 @@ +{ + "meta": { + "bip44Coin": "8000", + "coin": "skycoin", + "cryptoType": "", + "encrypted": "false", + "filename": "test6-bip44.wlt", + "label": "test6-bip44", + "lastSeed": "", + "secrets": "", + "seed": "into raccoon purity buzz shock arch artefact stadium bless witness used odor", + "seedPassphrase": "", + "tm": "1562241393", + "type": "bip44", + "version": "0.3" + }, + "entries": [ + { + "address": "c4gUJP2XytywBbvrjni7hPDK7ZgmK3dGuH", + "public_key": "02a52d5d9399ef1925dded42f44b7a0c6124e5a1e30ad4a04a198b64f336bd7378", + "secret_key": "ddd235eebb2ee5aac6d17591aa04e35a3376fb4b6b6cab9492251d5ca1540a80", + "child_number": 0, + "change": 0 + }, + { + "address": "Qb5SE7ARrBvcbjYqHnAoenAKnd9NT6QUaR", + "public_key": "03958bade8945f30f8c226bf9238a03e7bc42821fc482a9c70153a3393b06a6c24", + "secret_key": "7af0bf10f7a3e6ed2bd916d05b8cd032e5e0343b153f84334dd7ec1b8e58e655", + "child_number": 1, + "change": 0 + }, + { + "address": "29uMZ7vhsv8tRqjocLPMjuUaJVLyu91iNwW", + "public_key": "02607723cc31fff50bc8ae7dfff86b2472f593350d0a45e034aa78082952466882", + "secret_key": "328da176b75dc6bad2a54c145aa25154779faa48520d868c37d391ac4611d133", + "child_number": 2, + "change": 0 + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/test6-passphrase-bip44.wlt b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/test6-passphrase-bip44.wlt new file mode 100644 index 00000000..237ccce0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/test6-passphrase-bip44.wlt @@ -0,0 +1,40 @@ +{ + "meta": { + "bip44Coin": "8000", + "coin": "skycoin", + "cryptoType": "", + "encrypted": "false", + "filename": "test6-passphrase-bip44.wlt", + "label": "test6-passphrase-bip44", + "lastSeed": "", + "secrets": "", + "seed": "voyage say extend find sheriff surge priority merit ignore maple cash argue", + "seedPassphrase": "foobar", + "tm": "1562414330", + "type": "bip44", + "version": "0.3" + }, + "entries": [ + { + "address": "n5SteDkkYdR3VJtMnVYcQ45L16rDDrseG8", + "public_key": "025570afef5ab8379f2b728297a7e579042d1f4cd17142129cea936dc869a01033", + "secret_key": "0c9764b340855567b48b498b96830b3afe9194b587345cf415d602e370b3ed34", + "child_number": 0, + "change": 0 + }, + { + "address": "mGeG2PDoU4nc9qE1FSSreAjFeKG12zDvur", + "public_key": "03968defd679e6f5c2af5fb3f07e3fa5e53fdf50e021db6052d237333356503813", + "secret_key": "7fc6d339eb453daae4e779bf4dec44124f28d9e0e2e76c03fc075420e2f2e8e5", + "child_number": 1, + "change": 0 + }, + { + "address": "rhbE3thvA747E81KfaYCujur7GKXjdhvS4", + "public_key": "02cd574b2c96b8d85d46d168fbf2bce6cd516e6d6b855904b56997772e189cab25", + "secret_key": "b017dcbb71dfa49a3cfbcb126147c2728ee8be17f1f93be4fc12f34ebdb5660b", + "child_number": 2, + "change": 0 + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/v2_no_encrypt.wlt b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/v2_no_encrypt.wlt new file mode 100644 index 00000000..c8e06f4a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/v2_no_encrypt.wlt @@ -0,0 +1,22 @@ +{ + "meta": { + "coin": "skycoin", + "cryptoType": "scrypt-chacha20poly1305", + "encrypted": "false", + "filename": "v2_no_encrypt.wlt", + "label": "v2_no_encrypt", + "lastSeed": "c79454cf362b3f55e5effce09f664311650a44b9c189b3c8eed1ae9bd696cd9e", + "secrets": "", + "seed": "seed", + "tm": "1516497816", + "type": "deterministic", + "version": "0.2" + }, + "entries": [ + { + "address": "2EVNa4CK9SKosT4j1GEn8SuuUUEAXaHAMbM", + "public_key": "02e5be89fa161bf6b0bc64ec9ec7fe27311fbb78949c3ef9739d4c73a84920d6e1", + "secret_key": "001aa9e416aff5f3a3c7f9ae0811757cf54f393d50df861f5c33747954341aa7" + } + ] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/xpub-test.wlt b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/xpub-test.wlt new file mode 100644 index 00000000..7dcaad3b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/testdata/xpub-test.wlt @@ -0,0 +1,25 @@ +{ + "meta": { + "coin": "skycoin", + "cryptoType": "", + "encrypted": "false", + "filename": "xpub-test.wlt", + "label": "xpub-test", + "lastSeed": "", + "secrets": "", + "seed": "", + "seedPassphrase": "", + "tm": "1563252269", + "type": "xpub", + "version": "0.4", + "xpub": "xpub6D4BDPcP2GT577Vvch3R8wDkScZWzQzMMUm3PWbmWvVJrZwQY4VUNgqFJPMM3No2dFDFGTsxxpG5uJh7n7epu4trkrX7x7DogT5Uv6fcLW5" + }, + "entries": [ + { + "address": "2DpeofcsamDfanrRz34qjYvskRzKqzNKMcj", + "public_key": "0243802bfee2c58101d5da81028f3480a923ae5af771e4055ede154482e96da1cd", + "secret_key": "", + "child_number": 0 + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/transaction.go b/vendor/github.com/SkycoinProject/skycoin/src/wallet/transaction.go new file mode 100644 index 00000000..5b3b0ddc --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/transaction.go @@ -0,0 +1,286 @@ +package wallet + +import ( + "errors" + "fmt" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/transaction" +) + +var ( + // ErrUnknownAddress is returned if an address is not found in a wallet + ErrUnknownAddress = NewError(errors.New("address not found in wallet")) + // ErrUnknownUxOut is returned if a uxout is not owned by any address in a wallet + ErrUnknownUxOut = NewError(errors.New("uxout is not owned by any address in the wallet")) + // ErrWalletCantSign is returned is attempting to sign a transaction with a wallet + // that does not have the capability to sign transactions (e.g. an xpub or watch wallet) + ErrWalletCantSign = NewError(errors.New("wallet does not have the signing capability")) +) + +func validateSignIndexes(x []int, uxOuts []coin.UxOut) error { + if len(x) > len(uxOuts) { + return errors.New("Number of signature indexes exceeds number of inputs") + } + + for _, i := range x { + if i >= len(uxOuts) || i < 0 { + return errors.New("Signature index out of range") + } + } + + m := make(map[int]struct{}, len(x)) + for _, i := range x { + if _, ok := m[i]; ok { + return errors.New("Duplicate value in signature indexes") + } + m[i] = struct{}{} + } + + return nil +} + +func copyTransaction(txn *coin.Transaction) *coin.Transaction { + txnHash := txn.Hash() + txnInnerHash := txn.HashInner() + + txn2 := *txn + txn2.Sigs = make([]cipher.Sig, len(txn.Sigs)) + copy(txn2.Sigs, txn.Sigs) + txn2.In = make([]cipher.SHA256, len(txn.In)) + copy(txn2.In, txn.In) + txn2.Out = make([]coin.TransactionOutput, len(txn.Out)) + copy(txn2.Out, txn.Out) + + if txnInnerHash != txn2.HashInner() { + logger.Panic("copyTransaction copy broke InnerHash") + } + if txnHash != txn2.Hash() { + logger.Panic("copyTransaction copy broke Hash") + } + + return &txn2 +} + +// SignTransaction signs a transaction. Specific inputs may be signed by specifying signIndexes. +// If signIndexes is empty, all inputs will be signed. +// The transaction should already have a valid header. The transaction may be partially signed, +// but a valid existing signature cannot be overwritten. +// Clients should avoid signing the same transaction multiple times. +func SignTransaction(w Wallet, txn *coin.Transaction, signIndexes []int, uxOuts []coin.UxOut) (*coin.Transaction, error) { + switch w.Type() { + case WalletTypeXPub: + return nil, ErrWalletCantSign + } + + signedTxn := copyTransaction(txn) + txnInnerHash := signedTxn.HashInner() + + if w.IsEncrypted() { + return nil, ErrWalletEncrypted + } + + if txnInnerHash != signedTxn.InnerHash { + return nil, NewError(errors.New("Transaction inner hash does not match computed inner hash")) + } + + if len(signedTxn.Sigs) == 0 { + return nil, NewError(errors.New("Transaction signatures array is empty")) + } + if signedTxn.IsFullySigned() { + return nil, NewError(errors.New("Transaction is fully signed")) + } + + if len(signedTxn.In) == 0 { + return nil, NewError(errors.New("No transaction inputs to sign")) + } + if len(uxOuts) != len(signedTxn.In) { + return nil, errors.New("len(uxOuts) != len(txn.In)") + } + if err := validateSignIndexes(signIndexes, uxOuts); err != nil { + return nil, NewError(err) + } + + nMissingSigs := 0 + for _, s := range signedTxn.Sigs { + if s.Null() { + nMissingSigs++ + } + } + + // Build a mapping of addresses to the inputs that need to be signed + addrs := make(map[cipher.Address][]int) + if len(signIndexes) > 0 { + for _, in := range signIndexes { + if !signedTxn.Sigs[in].Null() { + return nil, NewError(fmt.Errorf("Transaction is already signed at index %d", in)) + } + addrs[uxOuts[in].Body.Address] = append(addrs[uxOuts[in].Body.Address], in) + } + } else { + for i, o := range uxOuts { + if !signedTxn.Sigs[i].Null() { + continue + } + addrs[o.Body.Address] = append(addrs[o.Body.Address], i) + } + } + + // Check that the wallet has all addresses needed for signing + toSign := make(map[int][]int) + for i, e := range w.GetEntries() { + if len(toSign) == len(addrs) { + break + } + addr := e.SkycoinAddress() + if x, ok := addrs[addr]; ok { + toSign[i] = x + } + } + + if len(toSign) != len(addrs) { + return nil, NewError(errors.New("Wallet cannot sign all requested inputs")) + } + + // Sign the selected inputs + for k, v := range toSign { + for _, x := range v { + if !signedTxn.Sigs[x].Null() { + return nil, NewError(fmt.Errorf("Transaction is already signed at index %d", x)) + } + + if err := signedTxn.SignInput(w.GetEntryAt(k).Secret, x); err != nil { + return nil, err + } + } + } + + if err := signedTxn.UpdateHeader(); err != nil { + return nil, err + } + + // Sanity check + if txnInnerHash != signedTxn.HashInner() { + err := errors.New("Transaction inner hash modified in the process of signing") + logger.Critical().WithError(err).Error() + return nil, err + } + + if len(signIndexes) == 0 || len(signIndexes) == nMissingSigs { + if !signedTxn.IsFullySigned() { + return nil, errors.New("Transaction is not fully signed, but should be") + } + } else { + if signedTxn.IsFullySigned() { + return nil, errors.New("Transaction is fully signed, but shouldn't be") + } + } + + return signedTxn, nil +} + +// CreateTransaction creates an unsigned transaction based upon transaction.Params. +// Set the password as nil if the wallet is not encrypted, otherwise the password must be provided. +// NOTE: Caller must ensure that auxs correspond to params.Wallet.Addresses and params.Wallet.UxOuts options +// Outputs to spend are chosen from the pool of outputs provided. +// The outputs are chosen by the following procedure: +// - All outputs are merged into one list and are sorted coins highest, hours lowest, with the hash as a tiebreaker +// - Outputs are chosen from the beginning of this list, until the requested amount of coins is met. +// If hours are also specified, selection continues until the requested amount of hours are met. +// - If the total amount of coins in the chosen outputs is exactly equal to the requested amount of coins, +// such that there would be no change output but hours remain as change, another output will be chosen to create change, +// if the coinhour cost of adding that output is less than the coinhours that would be lost as change +// If receiving hours are not explicitly specified, hours are allocated amongst the receiving outputs proportional to the number of coins being sent to them. +// If the change address is not specified, the address whose bytes are lexically sorted first is chosen from the owners of the outputs being spent. +// WARNING: This method is not concurrent-safe if operating on the same wallet. Use Service.View or Service.ViewSecrets to lock the wallet, or use your own lock. +func CreateTransaction(w Wallet, p transaction.Params, auxs coin.AddressUxOuts, headTime uint64) (*coin.Transaction, []transaction.UxBalance, error) { + if err := p.Validate(); err != nil { + return nil, nil, err + } + + // Check that auxs does not contain addresses that are not known to this wallet + for a := range auxs { + if !w.HasEntry(a) { + return nil, nil, fmt.Errorf("Address %s from auxs not found in wallet", a) + } + } + + // Generate a new change address for bip44 wallets + var changeEntry *Entry + if p.ChangeAddress == nil && w.Type() == WalletTypeBip44 { + e, err := w.(*Bip44Wallet).PeekChangeEntry() + if err != nil { + logger.Critical().WithError(err).Error("PeekChangeEntry failed") + return nil, nil, fmt.Errorf("PeekChangeEntry failed: %v", err) + } + changeAddr := e.Address.(cipher.Address) + p.ChangeAddress = &changeAddr + changeEntry = &e + } + + txn, uxb, err := transaction.Create(p, auxs, headTime) + + if err == nil && changeEntry != nil && w.Type() == WalletTypeBip44 { + // Commit the change address to the bip44 wallet, assuming it will be used + if e, err := w.(*Bip44Wallet).GenerateChangeEntry(); err != nil { + logger.WithError(err).Panic("GenerateChangeEntry failed after a PeekChangeEntry") + } else if e != *changeEntry { + logger.Panicf("GenerateChangeEntry produced a different change entry than PeekChangeEntry: %s != %s", e.Address, changeEntry.Address) + } + } + + return txn, uxb, err +} + +// CreateTransactionSigned creates and signs a transaction based upon transaction.Params. +// Set the password as nil if the wallet is not encrypted, otherwise the password must be provided. +// Refer to CreateTransaction for information about transaction creation. +func CreateTransactionSigned(w Wallet, p transaction.Params, auxs coin.AddressUxOuts, headTime uint64) (*coin.Transaction, []transaction.UxBalance, error) { + txn, uxb, err := CreateTransaction(w, p, auxs, headTime) + if err != nil { + return nil, nil, err + } + + logger.Infof("CreateTransactionSigned: signing %d inputs", len(uxb)) + + // Sign the transaction + entriesMap := make(map[cipher.Address]Entry) + for i, s := range uxb { + entry, ok := entriesMap[s.Address] + if !ok { + entry, ok = w.GetEntry(s.Address) + if !ok { + // This should not occur because CreateTransaction should have checked it already + err := fmt.Errorf("Chosen spend address %s not found in wallet", s.Address) + logger.Critical().WithError(err).Error() + return nil, nil, err + } + entriesMap[s.Address] = entry + } + + if err := txn.SignInput(entry.Secret, i); err != nil { + logger.Critical().WithError(err).Errorf("CreateTransaction SignInput(%d) failed", i) + return nil, nil, err + } + } + + // Sanity check the signed transaction + if err := verifyCreatedSignedInvariants(p, txn, uxb); err != nil { + return nil, nil, err + } + + return txn, uxb, nil +} + +func verifyCreatedSignedInvariants(p transaction.Params, txn *coin.Transaction, inputs []transaction.UxBalance) error { + if !txn.IsFullySigned() { + return errors.New("Transaction is not fully signed") + } + + if err := transaction.VerifyCreatedInvariants(p, txn, inputs); err != nil { + return err + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/transaction_test.go b/vendor/github.com/SkycoinProject/skycoin/src/wallet/transaction_test.go new file mode 100644 index 00000000..91e111db --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/transaction_test.go @@ -0,0 +1,826 @@ +package wallet + +import ( + "bytes" + "errors" + "fmt" + "math" + "math/rand" + "reflect" + "sort" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/coin" + "github.com/SkycoinProject/skycoin/src/testutil" + "github.com/SkycoinProject/skycoin/src/transaction" + "github.com/SkycoinProject/skycoin/src/util/fee" +) + +func TestWalletSignTransaction(t *testing.T) { + txnSigned, uxs, seckeys := makeTransaction(t, 4) + require.Equal(t, 4, len(uxs)) + require.Equal(t, 4, len(seckeys)) + txnUnsigned := txnSigned + txnUnsigned.Sigs = make([]cipher.Sig, len(txnSigned.Sigs)) + + w := &CollectionWallet{} + for _, x := range seckeys { + p := cipher.MustPubKeyFromSecKey(x) + a := cipher.AddressFromPubKey(p) + err := w.AddEntry(Entry{ + Address: a, + Public: p, + Secret: x, + }) + require.NoError(t, err) + + // Add unrelated entries + err = w.AddEntry(makeEntry()) + require.NoError(t, err) + } + + badTxnInnerHash, _, _ := makeTransaction(t, 2) + badTxnInnerHash.InnerHash = testutil.RandSHA256(t) + + badTxnNoInputs, _, _ := makeTransaction(t, 2) + badTxnNoInputs.Sigs = make([]cipher.Sig, len(badTxnNoInputs.Sigs)) + badTxnNoInputs.In = nil + err := badTxnNoInputs.UpdateHeader() + require.NoError(t, err) + + badTxnNoSigs, _, _ := makeTransaction(t, 2) + badTxnNoSigs.Sigs = nil + err = badTxnNoSigs.UpdateHeader() + require.NoError(t, err) + + txnOtherWallet, uxsOtherWallet, secKeysOtherWallet := makeTransaction(t, 4) + + txnPartiallySigned := txnOtherWallet + err = txnPartiallySigned.Verify() + require.NoError(t, err) + err = txnPartiallySigned.VerifyInputSignatures(uxsOtherWallet) + require.NoError(t, err) + + txnPartiallySigned.Sigs = make([]cipher.Sig, len(txnOtherWallet.Sigs)) + copy(txnPartiallySigned.Sigs, txnOtherWallet.Sigs) + txnPartiallySigned.Sigs[1] = cipher.Sig{} + txnPartiallySigned.Sigs[2] = cipher.Sig{} + err = txnPartiallySigned.UpdateHeader() + require.NoError(t, err) + + txnPartiallySigned2 := txnPartiallySigned + txnPartiallySigned2.Sigs = make([]cipher.Sig, len(txnPartiallySigned.Sigs)) + copy(txnPartiallySigned2.Sigs, txnPartiallySigned.Sigs) + err = txnPartiallySigned2.UpdateHeader() + require.NoError(t, err) + + txnOtherWallet.Sigs = make([]cipher.Sig, len(txnOtherWallet.Sigs)) + err = txnOtherWallet.UpdateHeader() + require.NoError(t, err) + + otherWallet := &CollectionWallet{} + for i := 1; i < 3; i++ { + p := cipher.MustPubKeyFromSecKey(secKeysOtherWallet[i]) + a := cipher.AddressFromPubKey(p) + err := otherWallet.AddEntry(Entry{ + Address: a, + Public: p, + Secret: secKeysOtherWallet[i], + }) + require.NoError(t, err) + } + + cases := []struct { + name string + w Wallet + txn coin.Transaction + signIndexes []int + uxOuts []coin.UxOut + err error + partial bool + complete bool + }{ + { + name: "signed txn", + w: w, + txn: txnSigned, + uxOuts: uxs, + err: NewError(errors.New("Transaction is fully signed")), + }, + + { + name: "partially signed txn signing with same index", + w: w, + txn: txnPartiallySigned, + uxOuts: uxs, + signIndexes: []int{3}, + err: NewError(errors.New("Transaction is already signed at index 3")), + }, + + { + name: "bad txn inner hash", + w: w, + txn: badTxnInnerHash, + err: NewError(errors.New("Transaction inner hash does not match computed inner hash")), + }, + + { + name: "txn no inputs", + w: w, + txn: badTxnNoInputs, + err: NewError(errors.New("No transaction inputs to sign")), + }, + + { + name: "txn no sigs", + w: w, + txn: badTxnNoSigs, + err: NewError(errors.New("Transaction signatures array is empty")), + }, + + { + name: "len uxouts does not match len inputs", + w: w, + txn: txnUnsigned, + uxOuts: uxs[:2], + err: errors.New("len(uxOuts) != len(txn.In)"), + }, + + { + name: "too many sign indexes", + w: w, + txn: txnUnsigned, + uxOuts: uxs, + signIndexes: []int{0, 1, 2, 3, 4, 5}, + err: NewError(errors.New("Number of signature indexes exceeds number of inputs")), + }, + + { + name: "sign index out of range", + w: w, + txn: txnUnsigned, + uxOuts: uxs, + signIndexes: []int{0, 1, 5, 2}, + err: NewError(errors.New("Signature index out of range")), + }, + + { + name: "duplicate value in sign indexes", + w: w, + txn: txnUnsigned, + uxOuts: uxs, + signIndexes: []int{0, 1, 1}, + err: NewError(errors.New("Duplicate value in signature indexes")), + }, + + { + name: "wallet cannot sign any input", + w: w, + txn: txnOtherWallet, + uxOuts: uxsOtherWallet, + err: NewError(errors.New("Wallet cannot sign all requested inputs")), + }, + + { + name: "wallet cannot sign some inputs", + w: otherWallet, + txn: txnOtherWallet, + uxOuts: uxsOtherWallet, + err: NewError(errors.New("Wallet cannot sign all requested inputs")), + }, + + { + name: "wallet cannot sign all specified inputs", + w: otherWallet, + txn: txnOtherWallet, + uxOuts: uxsOtherWallet, + signIndexes: []int{2, 0}, + err: NewError(errors.New("Wallet cannot sign all requested inputs")), + }, + + { + name: "valid unsigned txn, all sigs", + w: w, + txn: txnUnsigned, + uxOuts: uxs, + err: nil, + }, + + { + name: "valid unsigned txn, some sigs defined", + w: w, + txn: txnUnsigned, + signIndexes: []int{1, 2}, + uxOuts: uxs, + err: nil, + }, + + { + name: "valid unsigned txn, all sigs defined", + w: w, + txn: txnUnsigned, + signIndexes: []int{0, 1, 2, 3}, + uxOuts: uxs, + err: nil, + }, + + { + name: "valid unsigned txn, all sigs defined, unordered", + w: w, + txn: txnUnsigned, + signIndexes: []int{2, 1, 3, 0}, + uxOuts: uxs, + err: nil, + }, + + { + name: "valid, wallet can sign the specified inputs, but not others", + w: otherWallet, + txn: txnOtherWallet, + uxOuts: uxsOtherWallet, + signIndexes: []int{2}, + err: nil, + }, + + { + name: "valid, transaction partially signed, unfinished signing", + w: otherWallet, + txn: txnPartiallySigned, + uxOuts: uxsOtherWallet, + signIndexes: []int{2}, + err: nil, + partial: true, + complete: false, + }, + + { + name: "valid, transaction partially signed, finished signing", + w: otherWallet, + txn: txnPartiallySigned2, + uxOuts: uxsOtherWallet, + signIndexes: []int{1, 2}, + err: nil, + partial: true, + complete: true, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + signedTxn, err := SignTransaction(tc.w, &tc.txn, tc.signIndexes, tc.uxOuts) + if tc.err != nil { + require.Equal(t, tc.err, err) + return + } + + require.NoError(t, err) + + // The original txn should not be modified + require.False(t, reflect.DeepEqual(tc.txn, *signedTxn)) + + if len(tc.signIndexes) == 0 || len(tc.signIndexes) == len(tc.uxOuts) || tc.complete { + // Transaction should be fully signed + require.False(t, signedTxn.IsFullyUnsigned()) + err = signedTxn.Verify() + require.NoError(t, err) + err = signedTxn.VerifyInputSignatures(tc.uxOuts) + require.NoError(t, err) + } else { + // index of a valid signature should be found in the signIndexes + for _, x := range tc.signIndexes { + require.False(t, signedTxn.Sigs[x].Null()) + } + + if !tc.partial { + // Number of signatures should equal length of signIndexes + nSigned := 0 + for _, s := range signedTxn.Sigs { + if !s.Null() { + nSigned++ + } + } + + require.Equal(t, len(tc.signIndexes), nSigned) + } + } + }) + } +} + +func TestWalletCreateTransaction(t *testing.T) { + headTime := uint64(time.Now().UTC().Unix()) + seed := []byte("seed") + + // Generate first keys + _, secKeys := cipher.MustGenerateDeterministicKeyPairsSeed(seed, 11) + secKey := secKeys[0] + addr := cipher.MustAddressFromSecKey(secKey) + + var extraWalletAddrs []cipher.Address + for _, s := range secKeys[1:] { + extraWalletAddrs = append(extraWalletAddrs, cipher.MustAddressFromSecKey(s)) + } + + // Create unspent outputs + var uxouts []coin.UxOut + var originalUxouts []coin.UxOut + addrs := []cipher.Address{} + for i := 0; i < 10; i++ { + uxout := makeUxOut(t, secKey, 2e6, uint64(100+i)) + uxout.Head.Time = headTime + uxouts = append(uxouts, uxout) + originalUxouts = append(originalUxouts, uxout) + + a := testutil.MakeAddress() + addrs = append(addrs, a) + } + + w := &CollectionWallet{} + for _, x := range secKeys { + p := cipher.MustPubKeyFromSecKey(x) + a := cipher.AddressFromPubKey(p) + err := w.AddEntry(Entry{ + Address: a, + Public: p, + Secret: x, + }) + require.NoError(t, err) + + // Add unrelated entries + err = w.AddEntry(makeEntry()) + require.NoError(t, err) + } + + // shuffle the uxouts to test that the uxout sorting during spend selection is working + rand.Shuffle(len(uxouts), func(i, j int) { + uxouts[i], uxouts[j] = uxouts[j], uxouts[i] + }) + + // Create extra unspent outputs. These have the same value as uxouts, but are spendable by + // keys held in extraWalletAddrs + extraUxouts := make([][]coin.UxOut, len(extraWalletAddrs)) + for j := range extraWalletAddrs { + s := secKeys[j+1] + + var uxouts []coin.UxOut + for i := 0; i < 10; i++ { + uxout := makeUxOut(t, s, 2e6, uint64(100+i)) + uxout.Head.Time = headTime + uxouts = append(uxouts, uxout) + } + + extraUxouts[j] = uxouts + } + + // Create unspent outputs with no hours + var uxoutsNoHours []coin.UxOut + for i := 0; i < 10; i++ { + uxout := makeUxOut(t, secKey, 2e6, 0) + uxout.Head.Time = headTime + uxoutsNoHours = append(uxoutsNoHours, uxout) + } + + // shuffle the uxouts to test that the uxout sorting during spend selection is working + rand.Shuffle(len(uxoutsNoHours), func(i, j int) { + uxoutsNoHours[i], uxoutsNoHours[j] = uxoutsNoHours[j], uxoutsNoHours[i] + }) + + changeAddress := testutil.MakeAddress() + + validParams := transaction.Params{ + HoursSelection: transaction.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + ChangeAddress: &changeAddress, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 10, + Coins: 1e6, + }, + }, + } + + unknownAddress := testutil.MakeAddress() + + cases := []struct { + name string + err error + params transaction.Params + unspents []coin.UxOut + addressUnspents coin.AddressUxOuts + chosenUnspents []coin.UxOut + headTime uint64 + changeOutput *coin.TransactionOutput + toExpectedHours []uint64 + }{ + { + name: "params invalid", + params: transaction.Params{}, + err: transaction.NewError(errors.New("To is required")), + }, + + { + name: "unknown address in auxs", + params: validParams, + addressUnspents: coin.AddressUxOuts{ + unknownAddress: uxouts, + }, + err: fmt.Errorf("Address %s from auxs not found in wallet", unknownAddress), + }, + + { + name: "overflowing coin hours in params", + params: transaction.Params{ + ChangeAddress: &changeAddress, + HoursSelection: transaction.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: math.MaxUint64, + Coins: 1e6, + }, + { + Address: addrs[1], + Hours: 1, + Coins: 1e6, + }, + }, + }, + err: transaction.NewError(errors.New("total output hours error: uint64 addition overflow")), + }, + + { + name: "overflowing coins in params", + params: transaction.Params{ + ChangeAddress: &changeAddress, + HoursSelection: transaction.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 10, + Coins: math.MaxUint64, + }, + { + Address: addrs[1], + Hours: 1, + Coins: 1, + }, + }, + }, + err: transaction.NewError(errors.New("total output coins error: uint64 addition overflow")), + }, + + { + name: "no unspents", + params: transaction.Params{ + ChangeAddress: &changeAddress, + HoursSelection: transaction.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 10, + Coins: 1e6, + }, + }, + }, + err: transaction.ErrNoUnspents, + }, + + { + name: "insufficient coins", + params: transaction.Params{ + ChangeAddress: &changeAddress, + HoursSelection: transaction.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 10, + Coins: 100e6, + }, + }, + }, + unspents: uxouts[:1], + err: transaction.ErrInsufficientBalance, + }, + + { + name: "insufficient hours", + params: transaction.Params{ + ChangeAddress: &changeAddress, + HoursSelection: transaction.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 100e6, + Coins: 1e6, + }, + }, + }, + unspents: uxouts[:1], + err: transaction.ErrInsufficientHours, + }, + + { + name: "manual, 1 output, no change", + params: transaction.Params{ + ChangeAddress: &changeAddress, + HoursSelection: transaction.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 90, + Coins: 2e6, + }, + }, + }, + unspents: uxouts, + chosenUnspents: []coin.UxOut{originalUxouts[0]}, + }, + + { + name: "no coin hours in inputs", + unspents: uxoutsNoHours[:], + params: transaction.Params{ + HoursSelection: transaction.HoursSelection{ + Type: transaction.HoursSelectionTypeManual, + }, + ChangeAddress: &changeAddress, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 10, + Coins: 1e6, + }, + }, + }, + err: fee.ErrTxnNoFee, + }, + } + + type TestResult struct { + Transaction *coin.Transaction + Inputs []transaction.UxBalance + Unsigned bool + } + + results := make(map[string]TestResult, len(cases)) + + compareResult := func(t *testing.T, a, b TestResult) { + require.True(t, reflect.DeepEqual(a.Inputs, b.Inputs)) + require.True(t, reflect.DeepEqual(a.Transaction.Out, b.Transaction.Out)) + require.Equal(t, a.Transaction.InnerHash, b.Transaction.InnerHash) + require.Equal(t, a.Transaction.Type, b.Transaction.Type) + require.Equal(t, a.Transaction.Length, b.Transaction.Length) + require.Equal(t, len(a.Transaction.Sigs), len(b.Transaction.Sigs)) + + if a.Unsigned == b.Unsigned { + require.Equal(t, a.Transaction.Hash(), b.Transaction.Hash()) + // Sigs have a nonce so will vary each run, unset them before comparing the whole transaction + require.Equal(t, len(a.Transaction.Sigs), len(b.Transaction.Sigs)) + at := *a.Transaction + bt := *b.Transaction + at.Sigs = nil + bt.Sigs = nil + require.True(t, reflect.DeepEqual(at, bt)) + } else { + require.NotEqual(t, a.Transaction.Hash(), b.Transaction.Hash()) + } + } + + bools := []bool{true, false} + for _, unsigned := range bools { + for _, tc := range cases { + name := fmt.Sprintf("unsigned=%v %s", unsigned, tc.name) + t.Run(name, func(t *testing.T) { + if tc.headTime == 0 { + tc.headTime = headTime + } + + addrUxOuts := coin.AddressUxOuts{ + addr: tc.unspents, + } + + if tc.addressUnspents != nil { + addrUxOuts = tc.addressUnspents + } + + unspents := make(map[cipher.SHA256]coin.UxOut) + for _, uxs := range addrUxOuts { + for _, ux := range uxs { + unspents[ux.Hash()] = ux + } + } + + var txn *coin.Transaction + var inputs []transaction.UxBalance + var err error + if unsigned { + txn, inputs, err = CreateTransaction(w, tc.params, addrUxOuts, tc.headTime) + } else { + txn, inputs, err = CreateTransactionSigned(w, tc.params, addrUxOuts, tc.headTime) + } + require.Equal(t, tc.err, err, "%v != %v", tc.err, err) + if tc.err != nil { + return + } + + if unsigned { + err := txn.VerifyUnsigned() + require.NoError(t, err) + } else { + err := txn.Verify() + require.NoError(t, err) + } + + require.Equal(t, len(inputs), len(txn.In)) + + // Checks duplicate inputs in array + inputsMap := make(map[cipher.SHA256]struct{}) + for _, i := range inputs { + _, ok := inputsMap[i.Hash] + require.False(t, ok) + inputsMap[i.Hash] = struct{}{} + } + + for i, inUxid := range txn.In { + _, ok := unspents[inUxid] + require.True(t, ok) + + require.Equal(t, inUxid, inputs[i].Hash) + } + + // Compare the transaction inputs + chosenUnspents := make([]coin.UxOut, len(tc.chosenUnspents)) + chosenUnspentHashes := make([]cipher.SHA256, len(tc.chosenUnspents)) + for i, u := range tc.chosenUnspents { + chosenUnspents[i] = u + chosenUnspentHashes[i] = u.Hash() + } + sort.Slice(chosenUnspentHashes, func(i, j int) bool { + return bytes.Compare(chosenUnspentHashes[i][:], chosenUnspentHashes[j][:]) < 0 + }) + sort.Slice(chosenUnspents, func(i, j int) bool { + h1 := chosenUnspents[i].Hash() + h2 := chosenUnspents[j].Hash() + return bytes.Compare(h1[:], h2[:]) < 0 + }) + + sortedTxnIn := make([]cipher.SHA256, len(txn.In)) + copy(sortedTxnIn[:], txn.In[:]) + + sort.Slice(sortedTxnIn, func(i, j int) bool { + return bytes.Compare(sortedTxnIn[i][:], sortedTxnIn[j][:]) < 0 + }) + + require.Equal(t, chosenUnspentHashes, sortedTxnIn) + + sort.Slice(inputs, func(i, j int) bool { + h1 := inputs[i].Hash + h2 := inputs[j].Hash + return bytes.Compare(h1[:], h2[:]) < 0 + }) + + chosenUnspentsUxBalances := make([]transaction.UxBalance, len(chosenUnspents)) + for i, o := range chosenUnspents { + b, err := transaction.NewUxBalance(tc.headTime, o) + require.NoError(t, err) + chosenUnspentsUxBalances[i] = b + } + + require.Equal(t, chosenUnspentsUxBalances, inputs) + + // Assign expected hours for comparison + var to []coin.TransactionOutput + to = append(to, tc.params.To...) + + if len(tc.toExpectedHours) != 0 { + require.Equal(t, len(tc.toExpectedHours), len(to)) + for i, h := range tc.toExpectedHours { + to[i].Hours = h + } + } + + // Add the change output if specified + if tc.changeOutput != nil { + to = append(to, *tc.changeOutput) + } + + // Compare transaction outputs + require.Equal(t, to, txn.Out) + + // compare to previous result for the same test case + // but either signed or unsigned (both should produce the same transactions, except for signatures) + result := TestResult{ + Transaction: txn, + Inputs: inputs, + Unsigned: unsigned, + } + if prevResult, ok := results[tc.name]; ok { + compareResult(t, prevResult, result) + } else { + results[tc.name] = result + } + }) + } + } +} + +func makeTransaction(t *testing.T, nInputs int) (coin.Transaction, []coin.UxOut, []cipher.SecKey) { + txn := coin.Transaction{} + + toSign := make([]cipher.SecKey, 0) + uxs := make([]coin.UxOut, 0) + for i := 0; i < nInputs; i++ { + ux, s := makeUxOutWithSecret(t) + err := txn.PushInput(ux.Hash()) + require.NoError(t, err) + toSign = append(toSign, s) + uxs = append(uxs, ux) + } + + err := txn.PushOutput(makeAddress(), 1e6, 50) + require.NoError(t, err) + err = txn.PushOutput(makeAddress(), 5e6, 50) + require.NoError(t, err) + txn.SignInputs(toSign) + err = txn.UpdateHeader() + require.NoError(t, err) + + return txn, uxs, toSign +} + +func makeUxOut(t *testing.T, s cipher.SecKey, coins, hours uint64) coin.UxOut { //nolint:unparam + body := makeUxBody(t, s, coins, hours) + tm := rand.Int31n(1000) + seq := rand.Int31n(100) + return coin.UxOut{ + Head: coin.UxHead{ + Time: uint64(tm), + BkSeq: uint64(seq), + }, + Body: body, + } +} + +func makeUxBody(t *testing.T, s cipher.SecKey, coins, hours uint64) coin.UxBody { + p := cipher.MustPubKeyFromSecKey(s) + return coin.UxBody{ + SrcTransaction: cipher.SumSHA256(testutil.RandBytes(t, 128)), + Address: cipher.AddressFromPubKey(p), + Coins: coins, + Hours: hours, + } +} + +func makeUxOutWithSecret(t *testing.T) (coin.UxOut, cipher.SecKey) { + body, sec := makeUxBodyWithSecret(t) + return coin.UxOut{ + Head: coin.UxHead{ + Time: 100, + BkSeq: 2, + }, + Body: body, + }, sec +} + +func makeUxBodyWithSecret(t *testing.T) (coin.UxBody, cipher.SecKey) { + p, s := cipher.GenerateKeyPair() + return coin.UxBody{ + SrcTransaction: testutil.RandSHA256(t), + Address: cipher.AddressFromPubKey(p), + Coins: 1e6, + Hours: 100, + }, s +} + +func makeAddress() cipher.Address { + p, _ := cipher.GenerateKeyPair() + return cipher.AddressFromPubKey(p) +} + +func makeEntry() Entry { + p, s := cipher.GenerateKeyPair() + a := cipher.AddressFromPubKey(p) + return Entry{ + Secret: s, + Public: p, + Address: a, + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/wallet.go b/vendor/github.com/SkycoinProject/skycoin/src/wallet/wallet.go new file mode 100644 index 00000000..b61148eb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/wallet.go @@ -0,0 +1,727 @@ +/* +Package wallet implements wallets and the wallet database service +*/ +package wallet + +import ( + "encoding/hex" + "errors" + "fmt" + "io/ioutil" + "os" + "path/filepath" + "strconv" + "strings" + "time" + + "github.com/sirupsen/logrus" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/bip44" + "github.com/SkycoinProject/skycoin/src/util/file" + "github.com/SkycoinProject/skycoin/src/util/logging" +) + +// Error wraps wallet-related errors. +// It wraps errors caused by user input, but not errors caused by programmer input or internal issues. +type Error struct { + error +} + +// NewError creates an Error +func NewError(err error) error { + if err == nil { + return nil + } + return Error{err} +} + +var ( + // Version represents the current wallet version + Version = "0.4" + + logger = logging.MustGetLogger("wallet") + + // ErrInvalidEncryptedField is returned if a wallet's Meta.encrypted value is invalid. + ErrInvalidEncryptedField = NewError(errors.New(`encrypted field value is not valid, must be "true", "false" or ""`)) + // ErrWalletEncrypted is returned when trying to generate addresses or sign tx in encrypted wallet + ErrWalletEncrypted = NewError(errors.New("wallet is encrypted")) + // ErrWalletNotEncrypted is returned when trying to decrypt unencrypted wallet + ErrWalletNotEncrypted = NewError(errors.New("wallet is not encrypted")) + // ErrMissingPassword is returned when trying to create wallet with encryption, but password is not provided. + ErrMissingPassword = NewError(errors.New("missing password")) + // ErrMissingEncrypt is returned when trying to create wallet with password, but options.Encrypt is not set. + ErrMissingEncrypt = NewError(errors.New("missing encrypt")) + // ErrInvalidPassword is returned if decrypts secrets failed + ErrInvalidPassword = NewError(errors.New("invalid password")) + // ErrMissingSeed is returned when trying to create wallet without a seed + ErrMissingSeed = NewError(errors.New("missing seed")) + // ErrMissingAuthenticated is returned if try to decrypt a scrypt chacha20poly1305 encrypted wallet, and find no authenticated metadata. + ErrMissingAuthenticated = NewError(errors.New("missing authenticated metadata")) + // ErrWrongCryptoType is returned when decrypting wallet with wrong crypto method + ErrWrongCryptoType = NewError(errors.New("wrong crypto type")) + // ErrWalletNotExist is returned if a wallet does not exist + ErrWalletNotExist = NewError(errors.New("wallet doesn't exist")) + // ErrSeedUsed is returned if a wallet already exists with the same seed + ErrSeedUsed = NewError(errors.New("a wallet already exists with this seed")) + // ErrXPubKeyUsed is returned if a wallet already exists with the same xpub key + ErrXPubKeyUsed = NewError(errors.New("a wallet already exists with this xpub key")) + // ErrWalletAPIDisabled is returned when trying to do wallet actions while the EnableWalletAPI option is false + ErrWalletAPIDisabled = NewError(errors.New("wallet api is disabled")) + // ErrSeedAPIDisabled is returned when trying to get seed of wallet while the EnableWalletAPI or EnableSeedAPI is false + ErrSeedAPIDisabled = NewError(errors.New("wallet seed api is disabled")) + // ErrWalletNameConflict represents the wallet name conflict error + ErrWalletNameConflict = NewError(errors.New("wallet name would conflict with existing wallet, renaming")) + // ErrWalletRecoverSeedWrong is returned if the seed or seed passphrase does not match the specified wallet when recovering + ErrWalletRecoverSeedWrong = NewError(errors.New("wallet recovery seed or seed passphrase is wrong")) + // ErrNilTransactionsFinder is returned if Options.ScanN > 0 but a nil TransactionsFinder was provided + ErrNilTransactionsFinder = NewError(errors.New("scan ahead requested but balance getter is nil")) + // ErrInvalidCoinType is returned for invalid coin types + ErrInvalidCoinType = NewError(errors.New("invalid coin type")) + // ErrInvalidWalletType is returned for invalid wallet types + ErrInvalidWalletType = NewError(errors.New("invalid wallet type")) + // ErrWalletTypeNotRecoverable is returned by RecoverWallet is the wallet type does not support recovery + ErrWalletTypeNotRecoverable = NewError(errors.New("wallet type is not recoverable")) + // ErrWalletPermission is returned when updating a wallet without writing permission + ErrWalletPermission = NewError(errors.New("saving wallet permission denied")) +) + +const ( + // WalletExt wallet file extension + WalletExt = "wlt" + + // WalletTimestampFormat wallet timestamp layout + WalletTimestampFormat = "2006_01_02" + + // CoinTypeSkycoin skycoin type + CoinTypeSkycoin CoinType = "skycoin" + // CoinTypeBitcoin bitcoin type + CoinTypeBitcoin CoinType = "bitcoin" + + // WalletTypeDeterministic deterministic wallet type. + // Uses the original Skycoin deterministic key generator. + WalletTypeDeterministic = "deterministic" + // WalletTypeCollection collection wallet type. + // Does not use any key generator; keys must be added explicitly + WalletTypeCollection = "collection" + // WalletTypeBip44 bip44 HD wallet type. + // Follow the bip44 spec. + WalletTypeBip44 = "bip44" + // WalletTypeXPub xpub HD wallet type. + // Allows generating addresses without a secret key + WalletTypeXPub = "xpub" +) + +// ResolveCoinType normalizes a coin type string to a CoinType constant +func ResolveCoinType(s string) (CoinType, error) { + switch strings.ToLower(s) { + case "sky", "skycoin": + return CoinTypeSkycoin, nil + case "btc", "bitcoin": + return CoinTypeBitcoin, nil + default: + return CoinType(""), ErrInvalidCoinType + } +} + +// IsValidWalletType returns true if a wallet type is recognized +func IsValidWalletType(t string) bool { + switch t { + case WalletTypeDeterministic, + WalletTypeCollection, + WalletTypeBip44, + WalletTypeXPub: + return true + default: + return false + } +} + +// CoinType represents the wallet coin type, which refers to the pubkey2addr method used +type CoinType string + +// NewWalletFilename generates a filename from the current time and random bytes +func NewWalletFilename() string { + timestamp := time.Now().Format(WalletTimestampFormat) + // should read in wallet files and make sure does not exist + padding := hex.EncodeToString((cipher.RandByte(2))) + return fmt.Sprintf("%s_%s.%s", timestamp, padding, WalletExt) +} + +// Options options that could be used when creating a wallet +type Options struct { + Type string // wallet type: deterministic, collection. Refers to which key generation mechanism is used. + Coin CoinType // coin type: skycoin, bitcoin, etc. Refers to which pubkey2addr method is used. + Bip44Coin *bip44.CoinType // bip44 path coin type + Label string // wallet label + Seed string // wallet seed + SeedPassphrase string // wallet seed passphrase (bip44 wallets only) + Encrypt bool // whether the wallet need to be encrypted. + Password []byte // password that would be used for encryption, and would only be used when 'Encrypt' is true. + CryptoType CryptoType // wallet encryption type, scrypt-chacha20poly1305 or sha256-xor. + ScanN uint64 // number of addresses that're going to be scanned for a balance. The highest address with a balance will be used. + GenerateN uint64 // number of addresses to generate, regardless of balance + XPub string // xpub key (xpub wallets only) +} + +// newWallet creates a wallet instance with given name and options. +func newWallet(wltName string, opts Options, tf TransactionsFinder) (Wallet, error) { + wltType := opts.Type + if wltType == "" { + return nil, NewError(errors.New("wallet type is required")) + } + if !IsValidWalletType(wltType) { + return nil, ErrInvalidWalletType + } + + lastSeed := "" + if wltType == WalletTypeDeterministic { + lastSeed = opts.Seed + } + + var bip44Coin bip44.CoinType + if wltType == WalletTypeBip44 { + if opts.Bip44Coin == nil { + switch opts.Coin { + case CoinTypeBitcoin: + bip44Coin = bip44.CoinTypeBitcoin + case CoinTypeSkycoin: + bip44Coin = bip44.CoinTypeSkycoin + default: + bip44Coin = bip44.CoinTypeSkycoin + } + } else { + bip44Coin = *opts.Bip44Coin + } + } + + if opts.SeedPassphrase != "" && wltType != WalletTypeBip44 { + return nil, NewError(fmt.Errorf("seedPassphrase is only used for %q wallets", WalletTypeBip44)) + } + + if opts.XPub != "" && wltType != WalletTypeXPub { + return nil, NewError(fmt.Errorf("xpub is only used for %q wallets", WalletTypeXPub)) + } + + switch wltType { + case WalletTypeDeterministic, WalletTypeBip44: + if opts.Seed == "" { + return nil, ErrMissingSeed + } + + if opts.ScanN > 0 && tf == nil { + return nil, ErrNilTransactionsFinder + } + + case WalletTypeXPub: + if opts.Seed != "" { + return nil, NewError(fmt.Errorf("seed should not be provided for %q wallets", wltType)) + } + + if opts.ScanN > 0 && tf == nil { + return nil, ErrNilTransactionsFinder + } + + case WalletTypeCollection: + if opts.Seed != "" { + return nil, NewError(fmt.Errorf("seed should not be provided for %q wallets", wltType)) + } + + default: + return nil, ErrInvalidWalletType + } + + coin := opts.Coin + if coin == "" { + coin = CoinTypeSkycoin + } + coin, err := ResolveCoinType(string(coin)) + if err != nil { + return nil, err + } + + meta := Meta{ + metaFilename: wltName, + metaVersion: Version, + metaLabel: opts.Label, + metaSeed: opts.Seed, + metaLastSeed: lastSeed, + metaSeedPassphrase: opts.SeedPassphrase, + metaTimestamp: strconv.FormatInt(time.Now().Unix(), 10), + metaType: wltType, + metaCoin: string(coin), + metaEncrypted: "false", + metaCryptoType: "", + metaSecrets: "", + metaXPub: opts.XPub, + } + + // Create the wallet + var w Wallet + switch wltType { + case WalletTypeDeterministic: + w, err = newDeterministicWallet(meta) + case WalletTypeCollection: + w, err = newCollectionWallet(meta) + case WalletTypeBip44: + meta.setBip44Coin(bip44Coin) + w, err = newBip44Wallet(meta) + case WalletTypeXPub: + meta.setXPub(opts.XPub) + w, err = newXPubWallet(meta) + default: + logger.Panic("unhandled wltType") + } + + if err != nil { + logger.WithError(err).WithField("walletType", wltType).Error("newWallet failed") + return nil, err + } + + // Generate wallet addresses + switch wltType { + case WalletTypeDeterministic, WalletTypeBip44, WalletTypeXPub: + generateN := opts.GenerateN + if generateN == 0 { + generateN = 1 + } + + logger.WithFields(logrus.Fields{ + "generateN": generateN, + "walletType": wltType, + }).Infof("Generating addresses for wallet") + + if _, err := w.GenerateAddresses(generateN); err != nil { + return nil, err + } + + if opts.ScanN != 0 && coin != CoinTypeSkycoin { + return nil, errors.New("Wallet scanning is only supported for Skycoin address wallets") + } + + if opts.ScanN > generateN { + // Scan for addresses with balances + logger.WithFields(logrus.Fields{ + "scanN": opts.ScanN, + "walletType": wltType, + }).Info("Scanning addresses for wallet") + if err := w.ScanAddresses(opts.ScanN, tf); err != nil { + return nil, err + } + } + + case WalletTypeCollection: + if opts.GenerateN != 0 || opts.ScanN != 0 { + return nil, NewError(fmt.Errorf("wallet scanning is not defined for %q wallets", wltType)) + } + + default: + logger.Panic("unhandled wltType") + } + + // Validate the wallet, before encrypting + if err := w.Validate(); err != nil { + return nil, err + } + + // Check if the wallet should be encrypted + if !opts.Encrypt { + if len(opts.Password) != 0 { + return nil, ErrMissingEncrypt + } + return w, nil + } + + // Check if the password is provided + if len(opts.Password) == 0 { + return nil, ErrMissingPassword + } + + // Check crypto type + if opts.CryptoType == "" { + opts.CryptoType = DefaultCryptoType + } + + if _, err := getCrypto(opts.CryptoType); err != nil { + return nil, err + } + + // Encrypt the wallet + if err := Lock(w, opts.Password, opts.CryptoType); err != nil { + return nil, err + } + + // Validate the wallet again, after encrypting + if err := w.Validate(); err != nil { + return nil, err + } + + return w, nil +} + +// NewWallet creates wallet without scanning addresses +func NewWallet(wltName string, opts Options) (Wallet, error) { + return newWallet(wltName, opts, nil) +} + +// NewWalletScanAhead creates wallet and scan ahead N addresses +func NewWalletScanAhead(wltName string, opts Options, tf TransactionsFinder) (Wallet, error) { + return newWallet(wltName, opts, tf) +} + +// Lock encrypts the wallet with the given password and specific crypto type +func Lock(w Wallet, password []byte, cryptoType CryptoType) error { + if len(password) == 0 { + return ErrMissingPassword + } + + if w.IsEncrypted() { + return ErrWalletEncrypted + } + + wlt := w.Clone() + + // Records seeds in secrets + ss := make(Secrets) + defer func() { + // Wipes all unencrypted sensitive data + ss.erase() + wlt.Erase() + }() + + wlt.PackSecrets(ss) + + sb, err := ss.serialize() + if err != nil { + return err + } + + crypto, err := getCrypto(cryptoType) + if err != nil { + return err + } + + // Encrypts the secrets + encSecret, err := crypto.Encrypt(sb, password) + if err != nil { + return err + } + + // Sets wallet as encrypted + wlt.SetEncrypted(cryptoType, string(encSecret)) + + // Update the wallet to the latest version, which indicates encryption support + wlt.SetVersion(Version) + + // Wipes unencrypted sensitive data + wlt.Erase() + + // Wipes the secret fields in w + w.Erase() + + // Replace the original wallet with new encrypted wallet + w.CopyFrom(wlt) + return nil +} + +// Unlock decrypts the wallet into a temporary decrypted copy of the wallet +// Returns error if the decryption fails +// The temporary decrypted wallet should be erased from memory when done. +func Unlock(w Wallet, password []byte) (Wallet, error) { + if !w.IsEncrypted() { + return nil, ErrWalletNotEncrypted + } + + if len(password) == 0 { + return nil, ErrMissingPassword + } + + wlt := w.Clone() + + // Gets the secrets string + sstr := w.Secrets() + if sstr == "" { + return nil, errors.New("secrets missing from wallet") + } + + ct := w.CryptoType() + if ct == "" { + return nil, errors.New("missing crypto type") + } + + // Gets the crypto module + crypto, err := getCrypto(ct) + if err != nil { + return nil, err + } + + // Decrypts the secrets + sb, err := crypto.Decrypt([]byte(sstr), password) + if err != nil { + return nil, ErrInvalidPassword + } + + defer func() { + // Wipe the data from the secrets bytes buffer + for i := range sb { + sb[i] = 0 + } + }() + + // Deserialize into secrets + ss := make(Secrets) + defer ss.erase() + if err := ss.deserialize(sb); err != nil { + return nil, err + } + + if err := wlt.UnpackSecrets(ss); err != nil { + return nil, err + } + + wlt.SetDecrypted() + + return wlt, nil +} + +// Wallet defines the wallet API +type Wallet interface { + Find(string) string + Seed() string + LastSeed() string + SeedPassphrase() string + Timestamp() int64 + SetTimestamp(int64) + Coin() CoinType + Bip44Coin() bip44.CoinType + Type() string + Label() string + SetLabel(string) + Filename() string + IsEncrypted() bool + SetEncrypted(cryptoType CryptoType, encryptedSecrets string) + SetDecrypted() + CryptoType() CryptoType + Version() string + SetVersion(string) + AddressConstructor() func(cipher.PubKey) cipher.Addresser + Secrets() string + XPub() string + + UnpackSecrets(ss Secrets) error + PackSecrets(ss Secrets) + + Erase() + Clone() Wallet + CopyFrom(src Wallet) + CopyFromRef(src Wallet) + + ToReadable() Readable + + Validate() error + + Fingerprint() string + GetAddresses() []cipher.Addresser + GetSkycoinAddresses() ([]cipher.Address, error) + GetEntryAt(i int) Entry + GetEntry(cipher.Address) (Entry, bool) + HasEntry(cipher.Address) bool + EntriesLen() int + GetEntries() Entries + + GenerateAddresses(num uint64) ([]cipher.Addresser, error) + GenerateSkycoinAddresses(num uint64) ([]cipher.Address, error) + ScanAddresses(scanN uint64, tf TransactionsFinder) error +} + +// GuardUpdate executes a function within the context of a read-write managed decrypted wallet. +// Returns ErrWalletNotEncrypted if wallet is not encrypted. +func GuardUpdate(w Wallet, password []byte, fn func(w Wallet) error) error { + if !w.IsEncrypted() { + return ErrWalletNotEncrypted + } + + if len(password) == 0 { + return ErrMissingPassword + } + + cryptoType := w.CryptoType() + wlt, err := Unlock(w, password) + if err != nil { + return err + } + + defer wlt.Erase() + + if err := fn(wlt); err != nil { + return err + } + + if err := Lock(wlt, password, cryptoType); err != nil { + return err + } + + w.CopyFromRef(wlt) + + // Wipes all sensitive data + w.Erase() + return nil +} + +// GuardView executes a function within the context of a read-only managed decrypted wallet. +// Returns ErrWalletNotEncrypted if wallet is not encrypted. +func GuardView(w Wallet, password []byte, f func(w Wallet) error) error { + if !w.IsEncrypted() { + return ErrWalletNotEncrypted + } + + if len(password) == 0 { + return ErrMissingPassword + } + + wlt, err := Unlock(w, password) + if err != nil { + return err + } + + defer wlt.Erase() + + return f(wlt) +} + +type walletLoadMeta struct { + Meta struct { + Type string `json:"type"` + } `json:"meta"` +} + +type walletLoader interface { + SetFilename(string) + SetCoin(CoinType) + Coin() CoinType + ToWallet() (Wallet, error) +} + +// Load loads wallet from a given file +func Load(filename string) (Wallet, error) { + if _, err := os.Stat(filename); os.IsNotExist(err) { + return nil, fmt.Errorf("wallet %q doesn't exist", filename) + } + + // Load the wallet meta type field from JSON + var m walletLoadMeta + if err := file.LoadJSON(filename, &m); err != nil { + logger.WithError(err).WithField("filename", filename).Error("Load: file.LoadJSON failed") + return nil, err + } + + if !IsValidWalletType(m.Meta.Type) { + logger.WithError(ErrInvalidWalletType).WithFields(logrus.Fields{ + "filename": filename, + "walletType": m.Meta.Type, + }).Error("wallet meta loaded from disk has invalid wallet type") + return nil, fmt.Errorf("invalid wallet %q: %v", filename, ErrInvalidWalletType) + } + + // Depending on the wallet type in the wallet metadata header, load the full wallet data + var rw walletLoader + var err error + switch m.Meta.Type { + case WalletTypeDeterministic: + //logger.WithField("filename", filename).Info("LoadReadableDeterministicWallet") + rw, err = LoadReadableDeterministicWallet(filename) + case WalletTypeCollection: + //logger.WithField("filename", filename).Info("LoadReadableCollectionWallet") + rw, err = LoadReadableCollectionWallet(filename) + case WalletTypeBip44: + //logger.WithField("filename", filename).Info("LoadReadableBip44Wallet") + rw, err = LoadReadableBip44Wallet(filename) + case WalletTypeXPub: + //logger.WithField("filename", filename).Info("LoadReadableXPubWallet") + rw, err = LoadReadableXPubWallet(filename) + default: + err := errors.New("unhandled wallet type") + logger.WithField("walletType", m.Meta.Type).WithError(err).Error("Load failed") + return nil, err + } + + if err != nil { + logger.WithError(err).WithFields(logrus.Fields{ + "filename": filename, + "walletType": m.Meta.Type, + }).Error("Load readable wallet failed") + return nil, err + } + + // Make sure "sky", "btc" normalize to "skycoin", "bitcoin" + ct, err := ResolveCoinType(string(rw.Coin())) + if err != nil { + logger.WithError(err).WithField("coinType", rw.Coin()).Error("Load: invalid coin type") + return nil, fmt.Errorf("invalid wallet %q: %v", filename, err) + } + rw.SetCoin(ct) + + rw.SetFilename(filepath.Base(filename)) + + return rw.ToWallet() +} + +// Save saves the wallet to a directory. The wallet's filename is read from its metadata. +func Save(w Wallet, dir string) error { + rw := w.ToReadable() + return file.SaveJSON(filepath.Join(dir, rw.Filename()), rw, 0600) +} + +// removeBackupFiles removes any *.wlt.bak files whom have version 0.1 and *.wlt matched in the given directory +func removeBackupFiles(dir string) error { + fs, err := filterDir(dir, ".wlt") + if err != nil { + return err + } + + // Creates the .wlt file map + fm := make(map[string]struct{}) + for _, f := range fs { + fm[f] = struct{}{} + } + + // Filters all .wlt.bak files in the directory + bakFs, err := filterDir(dir, ".wlt.bak") + if err != nil { + return err + } + + // Removes the .wlt.bak file that has .wlt matched. + for _, bf := range bakFs { + f := strings.TrimRight(bf, ".bak") + if _, ok := fm[f]; ok { + // Load and check the wallet version + w, err := Load(f) + if err != nil { + return err + } + + if w.Version() == "0.1" { + if err := os.Remove(bf); err != nil { + return err + } + } + } + } + + return nil +} + +func filterDir(dir string, suffix string) ([]string, error) { + files, err := ioutil.ReadDir(dir) + if err != nil { + return nil, err + } + res := []string{} + for _, f := range files { + if !f.IsDir() && strings.HasSuffix(f.Name(), suffix) { + res = append(res, filepath.Join(dir, f.Name())) + } + } + return res, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/wallet_test.go b/vendor/github.com/SkycoinProject/skycoin/src/wallet/wallet_test.go new file mode 100644 index 00000000..9f09728d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/wallet_test.go @@ -0,0 +1,1578 @@ +package wallet + +import ( + "encoding/hex" + "errors" + "flag" + "fmt" + "io/ioutil" + "math/rand" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/bip32" + "github.com/SkycoinProject/skycoin/src/cipher/bip39" + "github.com/SkycoinProject/skycoin/src/cipher/bip44" + "github.com/SkycoinProject/skycoin/src/cipher/encrypt" + "github.com/SkycoinProject/skycoin/src/util/logging" +) + +var ( + log = logging.MustGetLogger("wallet_test") +) + +// set rand seed. +var _ = func() int64 { + t := time.Now().Unix() + rand.Seed(t) + return t +}() + +var u = flag.Bool("u", false, "update test wallet file in ./testdata") + +func init() { + flag.Parse() + + // Change the scrypt N value in cryptoTable to make test faster, otherwise + // it would take more than 200 seconds to finish. + cryptoTable[CryptoTypeScryptChacha20poly1305] = encrypt.ScryptChacha20poly1305{ + N: 1 << 15, + R: encrypt.ScryptR, + P: encrypt.ScryptP, + KeyLen: encrypt.ScryptKeyLen, + } + + // When -u flag is specified, update the following wallet files: + // - ./testdata/scrypt-chacha20poly1305-encrypted.wlt + // - ./testdata/sha256xor-encrypted.wlt + if *u { + // Update ./testdata/scrypt-chacha20poly1305-encrypted.wlt + // - Create an unencrypted wallet + // - Generate an address + // - Lock the wallet with scrypt-chacha20poly1305 crypto type and password of "pwd". + w, err := NewWallet("scrypt-chacha20poly1305-encrypted.wlt", Options{ + Seed: "seed-scrypt-chacha20poly1305", + Label: "scrypt-chacha20poly1305", + }) + if err != nil { + log.Panic(err) + } + + if _, err := w.GenerateAddresses(1); err != nil { + log.Panic(err) + } + + if err := Lock(w, []byte("pwd"), CryptoTypeScryptChacha20poly1305); err != nil { + log.Panic(err) + } + + if err := Save(w, "./testdata"); err != nil { + log.Panic(err) + } + + // Update ./testdata/sha256xor-encrypted.wlt + // - Create an sha256xor encrypted wallet with password: "pwd". + w1, err := NewWallet("sha256xor-encrypted.wlt", Options{ + Seed: "seed-sha256xor", + Label: "sha256xor", + Encrypt: true, + Password: []byte("pwd"), + CryptoType: CryptoTypeSha256Xor, + }) + if err != nil { + log.Panic(err) + } + + if err := Save(w1, "./testdata"); err != nil { + log.Panic(err) + } + } +} + +func TestNewWallet(t *testing.T) { + type expect struct { + meta map[string]string + err error + } + + tt := []struct { + name string + wltName string + opts Options + expect expect + }{ + { + name: "ok, empty collection wallet", + wltName: "test-collection.wlt", + opts: Options{ + Type: WalletTypeCollection, + }, + expect: expect{ + meta: map[string]string{ + "label": "", + "filename": "test-collection.wlt", + "coin": string(CoinTypeSkycoin), + "type": WalletTypeDeterministic, + "version": Version, + }, + err: nil, + }, + }, + { + name: "ok, xpub wallet", + wltName: "test-xpub.wlt", + opts: Options{ + Type: WalletTypeXPub, + XPub: "xpub6CkxdS1d4vNqqcnf9xPgqR5e2jE2PZKmKSw93QQMjHE1hRk22nU4zns85EDRgmLWYXYtu62XexwqaET33XA28c26NbXCAUJh1xmqq6B3S2v", + }, + expect: expect{ + meta: map[string]string{ + "label": "", + "filename": "test-collection.wlt", + "coin": string(CoinTypeSkycoin), + "type": WalletTypeDeterministic, + "version": Version, + "xpub": "xpub6CkxdS1d4vNqqcnf9xPgqR5e2jE2PZKmKSw93QQMjHE1hRk22nU4zns85EDRgmLWYXYtu62XexwqaET33XA28c26NbXCAUJh1xmqq6B3S2v", + }, + err: nil, + }, + }, + { + name: "ok all defaults", + wltName: "test.wlt", + opts: Options{ + Seed: bip39.MustNewDefaultMnemonic(), + Type: WalletTypeBip44, + }, + expect: expect{ + meta: map[string]string{ + "label": "", + "filename": "test.wlt", + "coin": string(CoinTypeSkycoin), + "type": WalletTypeDeterministic, + "seed": "testseed123", + "version": Version, + }, + err: nil, + }, + }, + { + name: "ok with seed set, deterministic", + wltName: "test.wlt", + opts: Options{ + Seed: "testseed123", + Type: WalletTypeDeterministic, + }, + expect: expect{ + meta: map[string]string{ + "label": "", + "filename": "test.wlt", + "coin": string(CoinTypeSkycoin), + "type": WalletTypeDeterministic, + "seed": "testseed123", + "version": Version, + }, + err: nil, + }, + }, + { + name: "ok with label and seed set, deterministic", + wltName: "test.wlt", + opts: Options{ + Label: "wallet1", + Seed: "testseed123", + Type: WalletTypeDeterministic, + }, + expect: expect{ + meta: map[string]string{ + "label": "wallet1", + "filename": "test.wlt", + "coin": string(CoinTypeSkycoin), + "type": WalletTypeDeterministic, + "seed": "testseed123", + "version": Version, + }, + err: nil, + }, + }, + { + name: "ok with label, seed and coin set, deterministic", + wltName: "test.wlt", + opts: Options{ + Label: "wallet1", + Coin: CoinTypeBitcoin, + Seed: "testseed123", + Type: WalletTypeDeterministic, + }, + expect: expect{ + meta: map[string]string{ + "label": "wallet1", + "filename": "test.wlt", + "coin": string(CoinTypeBitcoin), + "type": WalletTypeDeterministic, + "seed": "testseed123", + }, + err: nil, + }, + }, + { + name: "ok default crypto type, deterministic", + wltName: "test.wlt", + opts: Options{ + Label: "wallet1", + Coin: CoinTypeSkycoin, + Seed: "testseed123", + Encrypt: true, + Password: []byte("pwd"), + Type: WalletTypeDeterministic, + }, + expect: expect{ + meta: map[string]string{ + "label": "wallet1", + "coin": string(CoinTypeSkycoin), + "type": WalletTypeDeterministic, + "encrypted": "true", + }, + err: nil, + }, + }, + { + name: "encrypt without password, deterministic", + wltName: "test.wlt", + opts: Options{ + Label: "wallet1", + Coin: CoinTypeSkycoin, + Seed: "testseed123", + Encrypt: true, + Type: WalletTypeDeterministic, + }, + expect: expect{ + meta: map[string]string{ + "label": "wallet1", + "coin": string(CoinTypeSkycoin), + "type": WalletTypeDeterministic, + "encrypted": "true", + }, + err: ErrMissingPassword, + }, + }, + { + name: "create with no seed, deterministic", + wltName: "test.wlt", + opts: Options{ + Label: "wallet1", + Coin: CoinTypeSkycoin, + Encrypt: true, + Password: []byte("pwd"), + Type: WalletTypeDeterministic, + }, + expect: expect{ + meta: map[string]string{ + "label": "wallet1", + "coin": string(CoinTypeSkycoin), + "type": WalletTypeDeterministic, + "encrypted": "true", + }, + err: ErrMissingSeed, + }, + }, + { + name: "password=pwd encrypt=false, deterministic", + wltName: "test.wlt", + opts: Options{ + Label: "wallet1", + Coin: CoinTypeSkycoin, + Encrypt: false, + Seed: "seed", + Password: []byte("pwd"), + Type: WalletTypeDeterministic, + }, + expect: expect{ + err: ErrMissingEncrypt, + }, + }, + { + name: "ok bip44", + wltName: "bip44.wlt", + opts: Options{ + Label: "bip44wallet1", + Type: WalletTypeBip44, + Seed: "voyage say extend find sheriff surge priority merit ignore maple cash argue", + }, + expect: expect{ + meta: map[string]string{ + "label": "bip44wallet1", + "coin": string(CoinTypeSkycoin), + "type": string(WalletTypeBip44), + "version": Version, + "bip44Coin": "8000", + }, + }, + }, + { + name: "invalid xpub wallet", + wltName: "test-xpub.wlt", + opts: Options{ + Type: WalletTypeXPub, + XPub: "xpubbad", + }, + expect: expect{ + err: NewError(errors.New("invalid xpub key: Serialized keys should be exactly 82 bytes")), + }, + }, + { + name: "seed provided with xpub wallet", + wltName: "test-xpub.wlt", + opts: Options{ + Type: WalletTypeXPub, + Seed: "foobar", + XPub: "xpub6CkxdS1d4vNqqcnf9xPgqR5e2jE2PZKmKSw93QQMjHE1hRk22nU4zns85EDRgmLWYXYtu62XexwqaET33XA28c26NbXCAUJh1xmqq6B3S2v", + }, + expect: expect{ + err: NewError(errors.New("seed should not be provided for \"xpub\" wallets")), + }, + }, + } + + for _, tc := range tt { + // test all supported crypto types + for ct := range cryptoTable { + name := fmt.Sprintf("%v crypto=%v", tc.name, ct) + if tc.opts.Encrypt { + tc.opts.CryptoType = ct + } + t.Run(name, func(t *testing.T) { + w, err := NewWallet(tc.wltName, tc.opts) + + if tc.expect.err == nil { + require.NoError(t, err) + } else { + require.Error(t, err) + require.Equal(t, tc.expect.err, err, "%s != %s", tc.expect.err.Error(), err.Error()) + return + } + + require.Equal(t, tc.opts.Encrypt, w.IsEncrypted()) + + if w.IsEncrypted() { + // Confirms the seeds and entry secrets are all empty + require.Equal(t, "", w.Seed()) + require.Equal(t, "", w.LastSeed()) + + for _, e := range w.GetEntries() { + require.True(t, e.Secret.Null()) + } + + // Confirms that secrets field is not empty + require.NotEmpty(t, w.Secrets()) + } + }) + } + } +} + +func TestWalletLock(t *testing.T) { + tt := []struct { + name string + opts Options + lockPwd []byte + err error + }{ + { + name: "ok deterministic", + opts: Options{ + Seed: "seed", + Type: WalletTypeDeterministic, + }, + lockPwd: []byte("pwd"), + }, + { + name: "ok bip44", + opts: Options{ + Seed: bip39.MustNewDefaultMnemonic(), + Type: WalletTypeBip44, + }, + lockPwd: []byte("pwd"), + }, + { + name: "password is nil", + opts: Options{ + Seed: "seed", + Type: WalletTypeDeterministic, + }, + lockPwd: nil, + err: ErrMissingPassword, + }, + { + name: "wallet already encrypted", + opts: Options{ + Seed: "seed", + Encrypt: true, + Password: []byte("pwd"), + Type: WalletTypeDeterministic, + }, + lockPwd: []byte("pwd"), + err: ErrWalletEncrypted, + }, + } + + for _, tc := range tt { + for ct := range cryptoTable { + name := fmt.Sprintf("%v crypto=%v", tc.name, ct) + if tc.opts.Encrypt { + tc.opts.CryptoType = ct + } + t.Run(name, func(t *testing.T) { + wltName := NewWalletFilename() + w, err := NewWallet(wltName, tc.opts) + require.NoError(t, err) + + if !w.IsEncrypted() { + // Generates 2 addresses + _, err = w.GenerateAddresses(2) + require.NoError(t, err) + } + + err = Lock(w, tc.lockPwd, ct) + require.Equal(t, tc.err, err) + if err != nil { + return + } + + require.True(t, w.IsEncrypted()) + + // Checks if the seeds are wiped + require.Empty(t, w.Seed()) + require.Empty(t, w.LastSeed()) + + // Checks if the entries are encrypted + for _, e := range w.GetEntries() { + require.Equal(t, cipher.SecKey{}, e.Secret) + } + }) + + } + } +} + +func TestWalletUnlock(t *testing.T) { + tt := []struct { + name string + opts Options + unlockPwd []byte + err error + }{ + { + name: "ok deterministic", + opts: Options{ + Seed: "seed", + Encrypt: true, + Password: []byte("pwd"), + Type: WalletTypeDeterministic, + }, + unlockPwd: []byte("pwd"), + }, + { + name: "ok bip44", + opts: Options{ + Seed: bip39.MustNewDefaultMnemonic(), + Encrypt: true, + Password: []byte("pwd"), + Type: WalletTypeBip44, + }, + unlockPwd: []byte("pwd"), + }, + { + name: "unlock with nil password", + opts: Options{ + Seed: "seed", + Encrypt: true, + Password: []byte("pwd"), + Type: WalletTypeDeterministic, + }, + unlockPwd: nil, + err: ErrMissingPassword, + }, + { + name: "unlock undecrypted wallet", + opts: Options{ + Seed: "seed", + Encrypt: false, + Type: WalletTypeDeterministic, + }, + unlockPwd: []byte("pwd"), + err: ErrWalletNotEncrypted, + }, + } + + for _, tc := range tt { + for ct := range cryptoTable { + name := fmt.Sprintf("%v crypto=%v", tc.name, ct) + if tc.opts.Encrypt { + tc.opts.CryptoType = ct + } + t.Run(name, func(t *testing.T) { + w := makeWallet(t, tc.opts, 1) + // Tests the unlock method + wlt, err := Unlock(w, tc.unlockPwd) + require.Equal(t, tc.err, err) + if err != nil { + return + } + + require.False(t, wlt.IsEncrypted()) + + // Checks the seeds + require.Equal(t, tc.opts.Seed, wlt.Seed()) + + // Checks the generated addresses + require.Equal(t, 1, wlt.EntriesLen()) + + switch tc.opts.Type { + case WalletTypeBip44: + require.Empty(t, wlt.LastSeed()) + keys := generateBip44Chain(t, wlt.Seed(), wlt.SeedPassphrase(), bip44.ExternalChainIndex, 1) + for i, e := range wlt.GetEntries() { + sk := cipher.MustNewSecKey(keys[i].Key) + addr := cipher.MustAddressFromSecKey(sk) + require.Equal(t, addr, e.Address) + } + + case WalletTypeDeterministic: + sd, sks := cipher.MustGenerateDeterministicKeyPairsSeed([]byte(wlt.Seed()), 1) + require.Equal(t, hex.EncodeToString(sd), wlt.LastSeed()) + + for i, e := range wlt.GetEntries() { + addr := cipher.MustAddressFromSecKey(sks[i]) + require.Equal(t, addr, e.Address) + } + default: + t.Fatalf("unhandled wallet type %q", tc.opts.Type) + } + + // Checks the original seeds + require.NotEqual(t, tc.opts.Seed, w.Seed()) + + // Checks if the seckeys in entries of original wallet are empty + for _, e := range w.GetEntries() { + require.True(t, e.Secret.Null()) + } + + // Checks if the seed and lastSeed in original wallet are still empty + require.Empty(t, w.Seed()) + require.Empty(t, w.LastSeed()) + require.Empty(t, w.SeedPassphrase()) + }) + } + } +} + +func TestLockAndUnLock(t *testing.T) { + for _, walletType := range []string{ + WalletTypeBip44, + WalletTypeDeterministic, + } { + for ct := range cryptoTable { + t.Run(fmt.Sprintf("crypto=%v", ct), func(t *testing.T) { + w, err := NewWallet("wallet", Options{ + Label: "wallet", + Seed: bip39.MustNewDefaultMnemonic(), + Type: walletType, + }) + require.NoError(t, err) + _, err = w.GenerateAddresses(9) + require.NoError(t, err) + require.Equal(t, 10, w.EntriesLen()) + + if walletType == WalletTypeBip44 { + // Generate change entries, to verify that their secret keys + // are protected and revealed when locked and unlocked + for i := 0; i < 5; i++ { + e, err := w.(*Bip44Wallet).GenerateChangeEntry() + require.NoError(t, err) + require.Equal(t, bip44.ChangeChainIndex, e.Change) + } + + require.Equal(t, 15, w.EntriesLen()) + nExternal := 0 + nChange := 0 + for _, e := range w.GetEntries() { + switch e.Change { + case bip44.ExternalChainIndex: + nExternal++ + case bip44.ChangeChainIndex: + nChange++ + default: + t.Fatalf("invalid change chain index: %d", e.Change) + } + } + require.Equal(t, 10, nExternal) + require.Equal(t, 5, nChange) + } + + // clone the wallet + cw := w.Clone() + require.Equal(t, w, cw) + + // lock the cloned wallet + err = Lock(cw, []byte("pwd"), ct) + require.NoError(t, err) + + checkNoSensitiveData(t, cw) + + // unlock the cloned wallet + ucw, err := Unlock(cw, []byte("pwd")) + require.NoError(t, err) + + require.Equal(t, w, ucw) + }) + } + } +} + +func makeWallet(t *testing.T, opts Options, addrNum uint64) Wallet { //nolint:unparam + // Create an unlocked wallet, then generate addresses, lock if the options.Encrypt is true. + preOpts := opts + opts.Encrypt = false + opts.Password = nil + w, err := NewWallet("t.wlt", opts) + require.NoError(t, err) + + if addrNum > 1 { + _, err = w.GenerateAddresses(addrNum - 1) + require.NoError(t, err) + } + if preOpts.Encrypt { + err = Lock(w, preOpts.Password, preOpts.CryptoType) + require.NoError(t, err) + } + return w +} + +func TestLoadWallet(t *testing.T) { + type expect struct { + meta map[string]string + err error + } + + tt := []struct { + name string + filename string + expect expect + }{ + { + name: "ok", + filename: "./testdata/test1.wlt", + expect: expect{ + meta: map[string]string{ + "coin": string(CoinTypeSkycoin), + "filename": "test1.wlt", + "label": "test3", + "lastSeed": "9182b02c0004217ba9a55593f8cf0abecc30d041e094b266dbb5103e1919adaf", + "seed": "buddy fossil side modify turtle door label grunt baby worth brush master", + "tm": "1503458909", + "type": WalletTypeDeterministic, + "version": "0.1", + }, + err: nil, + }, + }, + { + name: "wallet file doesn't exist", + filename: "not_exist_file.wlt", + expect: expect{ + meta: map[string]string{}, + err: fmt.Errorf("wallet \"not_exist_file.wlt\" doesn't exist"), + }, + }, + { + name: "invalid wallet: no type", + filename: "./testdata/invalid_wallets/no_type.wlt", + expect: expect{ + meta: map[string]string{}, + err: fmt.Errorf("invalid wallet \"./testdata/invalid_wallets/no_type.wlt\": invalid wallet type"), + }, + }, + { + name: "invalid wallet: invalid type", + filename: "./testdata/invalid_wallets/err_type.wlt", + expect: expect{ + meta: map[string]string{}, + err: fmt.Errorf("invalid wallet \"./testdata/invalid_wallets/err_type.wlt\": invalid wallet type"), + }, + }, + { + name: "invalid wallet: no coin", + filename: "./testdata/invalid_wallets/no_coin.wlt", + expect: expect{ + meta: map[string]string{}, + err: fmt.Errorf("invalid wallet \"./testdata/invalid_wallets/no_coin.wlt\": invalid coin type"), + }, + }, + { + name: "invalid wallet: no seed", + filename: "./testdata/invalid_wallets/no_seed.wlt", + expect: expect{ + meta: map[string]string{}, + err: fmt.Errorf("invalid wallet \"no_seed.wlt\": seed missing in unencrypted deterministic wallet"), + }, + }, + { + name: "version=0.2 encrypted=true crypto=scrypt-chacha20poly1305", + filename: "./testdata/scrypt-chacha20poly1305-encrypted.wlt", + expect: expect{ + meta: map[string]string{ + "coin": string(CoinTypeSkycoin), + "cryptoType": "scrypt-chacha20poly1305", + "encrypted": "true", + "filename": "scrypt-chacha20poly1305-encrypted.wlt", + "label": "scrypt-chacha20poly1305", + "lastSeed": "", + "seed": "", + "type": WalletTypeDeterministic, + "version": "0.2", + }, + err: nil, + }, + }, + { + name: "version=0.2 encrypted=true crypto=sha256xor", + filename: "./testdata/sha256xor-encrypted.wlt", + expect: expect{ + meta: map[string]string{ + "coin": string(CoinTypeSkycoin), + "cryptoType": "sha256-xor", + "encrypted": "true", + "filename": "sha256xor-encrypted.wlt", + "label": "sha256xor", + "lastSeed": "", + "seed": "", + "type": WalletTypeDeterministic, + "version": "0.2", + }, + err: nil, + }, + }, + { + name: "version=0.2 encrypted=false", + filename: "./testdata/v2_no_encrypt.wlt", + expect: expect{ + meta: map[string]string{ + "coin": string(CoinTypeSkycoin), + "cryptoType": "scrypt-chacha20poly1305", + "encrypted": "false", + "filename": "v2_no_encrypt.wlt", + "label": "v2_no_encrypt", + "lastSeed": "c79454cf362b3f55e5effce09f664311650a44b9c189b3c8eed1ae9bd696cd9e", + "secrets": "", + "seed": "seed", + "type": WalletTypeDeterministic, + "version": "0.2", + }, + err: nil, + }, + }, + { + name: "version=0.3 encrypted=false type=bip44", + filename: "./testdata/test5-bip44.wlt", + expect: expect{ + meta: map[string]string{ + "bip44Coin": fmt.Sprint(bip44.CoinTypeSkycoin), + "coin": string(CoinTypeSkycoin), + "cryptoType": "", + "encrypted": "false", + "filename": "test5-bip44.wlt", + "label": "test5-bip44", + "lastSeed": "", + "secrets": "", + "seed": "voyage say extend find sheriff surge priority merit ignore maple cash argue", + "seedPassphrase": "", + "type": WalletTypeBip44, + "version": "0.3", + }, + err: nil, + }, + }, + { + name: "version=0.3 encrypted=false type=bip44 seed-passphrase=true", + filename: "./testdata/test6-passphrase-bip44.wlt", + expect: expect{ + meta: map[string]string{ + "bip44Coin": fmt.Sprint(bip44.CoinTypeSkycoin), + "coin": string(CoinTypeSkycoin), + "cryptoType": "", + "encrypted": "false", + "filename": "test6-passphrase-bip44.wlt", + "label": "test6-passphrase-bip44", + "lastSeed": "", + "secrets": "", + "seed": "voyage say extend find sheriff surge priority merit ignore maple cash argue", + "seedPassphrase": "foobar", + "type": WalletTypeBip44, + "version": "0.3", + }, + err: nil, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + w, err := Load(tc.filename) + if err != nil { + require.Equal(t, tc.expect.err.Error(), err.Error()) + } + if err != nil { + return + } + + for k, v := range tc.expect.meta { + vv := w.Find(k) + require.Equal(t, v, vv) + } + + if w.IsEncrypted() { + require.NotEmpty(t, w.Secrets()) + } + }) + } +} + +func TestWalletGenerateAddress(t *testing.T) { + tt := []struct { + name string + opts Options + num uint64 + oneAddressEachTime bool + err error + }{ + { + name: "ok with one address deterministic", + opts: Options{ + Seed: bip39.MustNewDefaultMnemonic(), + Type: WalletTypeDeterministic, + }, + num: 1, + }, + { + name: "ok with two address deterministic", + opts: Options{ + Seed: bip39.MustNewDefaultMnemonic(), + Type: WalletTypeDeterministic, + }, + num: 2, + }, + { + name: "ok with three address and generate one address each time deterministic", + opts: Options{ + Seed: bip39.MustNewDefaultMnemonic(), + Type: WalletTypeDeterministic, + }, + num: 2, + oneAddressEachTime: true, + }, + { + name: "wallet is encrypted deterministic", + opts: Options{ + Seed: bip39.MustNewDefaultMnemonic(), + Type: WalletTypeDeterministic, + Encrypt: true, + Password: []byte("pwd"), + }, + num: 2, + oneAddressEachTime: true, + err: ErrWalletEncrypted, + }, + + { + name: "ok with one address bip44", + opts: Options{ + Seed: bip39.MustNewDefaultMnemonic(), + Type: WalletTypeBip44, + }, + num: 1, + }, + { + name: "ok with two address bip44", + opts: Options{ + Seed: bip39.MustNewDefaultMnemonic(), + Type: WalletTypeBip44, + }, + num: 2, + }, + { + name: "ok with three address and generate one address each time bip44", + opts: Options{ + Seed: bip39.MustNewDefaultMnemonic(), + Type: WalletTypeBip44, + }, + num: 2, + oneAddressEachTime: true, + }, + { + name: "wallet is encrypted bip44", + opts: Options{ + Seed: bip39.MustNewDefaultMnemonic(), + Type: WalletTypeBip44, + Encrypt: true, + Password: []byte("pwd"), + }, + num: 2, + oneAddressEachTime: true, + err: ErrWalletEncrypted, + }, + } + + for _, tc := range tt { + for ct := range cryptoTable { + name := fmt.Sprintf("crypto=%v %v", ct, tc.name) + if tc.opts.Encrypt { + tc.opts.CryptoType = ct + } + + t.Run(name, func(t *testing.T) { + // create wallet + w, err := NewWallet("test.wlt", tc.opts) + require.NoError(t, err) + + // generate addresses + if tc.oneAddressEachTime { + _, err = w.GenerateAddresses(tc.num - 1) + require.Equal(t, tc.err, err) + if err != nil { + return + } + } else { + for i := uint64(0); i < tc.num-1; i++ { + _, err := w.GenerateAddresses(1) + require.Equal(t, tc.err, err) + if err != nil { + return + } + } + } + + // check the entry number + require.Equal(t, w.EntriesLen(), int(tc.num)) + + addrs := w.GetAddresses() + + switch tc.opts.Type { + case WalletTypeDeterministic: + _, keys := cipher.MustGenerateDeterministicKeyPairsSeed([]byte(tc.opts.Seed), int(tc.num)) + for i, k := range keys { + a := cipher.MustAddressFromSecKey(k) + require.Equal(t, a.String(), addrs[i].String()) + } + case WalletTypeBip44: + keys := generateBip44Chain(t, tc.opts.Seed, tc.opts.SeedPassphrase, bip44.ExternalChainIndex, int(tc.num)) + for i, k := range keys { + sk := cipher.MustNewSecKey(k.Key) + a := cipher.MustAddressFromSecKey(sk) + require.Equal(t, a.String(), addrs[i].String()) + } + default: + t.Fatalf("unhandled wallet type %q", tc.opts.Type) + } + }) + } + } +} + +// generateBip44Chain generates N keys for the leaf change chain +func generateBip44Chain(t *testing.T, seed, seedPassphrase string, change uint32, num int) []*bip32.PrivateKey { + ss, err := bip39.NewSeed(seed, seedPassphrase) + require.NoError(t, err) + + cc, err := bip44.NewCoin(ss, bip44.CoinTypeSkycoin) + require.NoError(t, err) + + acct, err := cc.Account(0) + require.NoError(t, err) + + chain, err := acct.NewPrivateChildKey(change) + require.NoError(t, err) + + keys := make([]*bip32.PrivateKey, num) + for i := 0; i < num; i++ { + k, err := chain.NewPrivateChildKey(uint32(i)) + require.NoError(t, err) + keys[i] = k + } + + return keys +} + +func TestWalletGetEntry(t *testing.T) { + tt := []struct { + name string + wltFile string + address string + find bool + }{ + { + "ok", + "./testdata/test1.wlt", + "JUdRuTiqD1mGcw358twMg3VPpXpzbkdRvJ", + true, + }, + { + "entry not exist", + "./testdata/test1.wlt", + "2ULfxDUuenUY5V4Pr8whmoAwFdUseXNyjXC", + false, + }, + { + "scrypt-chacha20poly1305 encrypted wallet", + "./testdata/scrypt-chacha20poly1305-encrypted.wlt", + "LxcitUpWQZbPjgEPs6R1i3G4Xa31nPMoSG", + true, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + w, err := Load(tc.wltFile) + require.NoError(t, err) + a, err := cipher.DecodeBase58Address(tc.address) + require.NoError(t, err) + e, ok := w.GetEntry(a) + require.Equal(t, tc.find, ok) + if ok { + require.Equal(t, tc.address, e.Address.String()) + } + }) + } +} + +func TestWalletCollectionAddEntry(t *testing.T) { + test1SecKey, err := cipher.SecKeyFromHex("1fc5396e91e60b9fc613d004ea5bd2ccea17053a12127301b3857ead76fdb93e") + require.NoError(t, err) + + _, s := cipher.GenerateKeyPair() + + cases := []struct { + name string + wltFile string + secKey cipher.SecKey + err error + }{ + { + "ok", + "./testdata/test4-collection.wlt", + s, + nil, + }, + { + "dup entry", + "./testdata/test4-collection.wlt", + test1SecKey, + errors.New("wallet already contains entry with this address"), + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + w, err := Load(tc.wltFile) + require.NoError(t, err) + + a := cipher.MustAddressFromSecKey(tc.secKey) + p := cipher.MustPubKeyFromSecKey(tc.secKey) + require.Equal(t, tc.err, w.(*CollectionWallet).AddEntry(Entry{ + Address: a, + Public: p, + Secret: tc.secKey, + })) + }) + } +} + +func TestWalletGuard(t *testing.T) { + cases := []struct { + name string + walletType string + }{ + { + name: "deterministic", + walletType: WalletTypeDeterministic, + }, + { + name: "bip44", + walletType: WalletTypeBip44, + }, + } + + for ct := range cryptoTable { + for _, tc := range cases { + t.Run(fmt.Sprintf("crypto=%v", ct), func(t *testing.T) { + validate := func(w Wallet) { + require.Equal(t, "", w.Seed()) + require.Equal(t, "", w.LastSeed()) + require.Equal(t, "", w.SeedPassphrase()) + for _, e := range w.GetEntries() { + require.True(t, e.Secret.Null()) + } + } + + seed := bip39.MustNewDefaultMnemonic() + w, err := NewWallet("t.wlt", Options{ + Seed: seed, + Encrypt: true, + Password: []byte("pwd"), + CryptoType: ct, + Type: tc.walletType, + }) + require.NoError(t, err) + + err = GuardUpdate(w, []byte("pwd"), func(w Wallet) error { + require.Equal(t, seed, w.Seed()) + w.SetLabel("label") + return nil + }) + require.NoError(t, err) + require.Equal(t, "label", w.Label()) + validate(w) + + err = GuardView(w, []byte("pwd"), func(w Wallet) error { + require.Equal(t, "label", w.Label()) + w.SetLabel("new label") + return nil + }) + require.NoError(t, err) + + require.Equal(t, "label", w.Label()) + validate(w) + }) + } + } +} + +func TestRemoveBackupFiles(t *testing.T) { + type wltInfo struct { + wltName string + version string + } + + tt := []struct { + name string + initFiles []wltInfo + expectedRemainingFiles map[string]struct{} + }{ + { + name: "no file", + initFiles: []wltInfo{}, + expectedRemainingFiles: map[string]struct{}{}, + }, + { + name: "wlt v0.1=1 bak v0.1=1 delete 1 bak", + initFiles: []wltInfo{ + { + "t1.wlt", + "0.1", + }, + { + "t1.wlt.bak", + "0.1", + }, + }, + expectedRemainingFiles: map[string]struct{}{ + "t1.wlt": struct{}{}, + }, + }, + { + name: "wlt v0.1=2 bak v0.1=1 delete 1 bak", + initFiles: []wltInfo{ + { + "t1.wlt", + "0.1", + }, + { + "t2.wlt", + "0.1", + }, + { + "t2.wlt.bak", + "0.1", + }, + }, + expectedRemainingFiles: map[string]struct{}{ + "t1.wlt": struct{}{}, + "t2.wlt": struct{}{}, + }, + }, + { + name: "wlt v0.1=3 bak v0.1=1 delete 1 bak", + initFiles: []wltInfo{ + { + "t1.wlt", + "0.1", + }, + { + "t2.wlt", + "0.1", + }, + { + "t3.wlt", + "0.1", + }, + { + "t3.wlt.bak", + "0.1", + }, + }, + expectedRemainingFiles: map[string]struct{}{ + "t1.wlt": struct{}{}, + "t2.wlt": struct{}{}, + "t3.wlt": struct{}{}, + }, + }, + { + name: "wlt v0.1=3 bak v0.1=2 delete 2 bak", + initFiles: []wltInfo{ + { + "t1.wlt", + "0.1", + }, + { + "t2.wlt", + "0.1", + }, + { + "t2.wlt.bak", + "0.1", + }, + { + "t3.wlt", + "0.1", + }, + { + "t3.wlt.bak", + "0.1", + }, + }, + expectedRemainingFiles: map[string]struct{}{ + "t1.wlt": struct{}{}, + "t2.wlt": struct{}{}, + "t3.wlt": struct{}{}, + }, + }, + { + name: "wlt v0.1=3 bak v0.1=3 delete 3 bak", + initFiles: []wltInfo{ + { + "t1.wlt", + "0.1", + }, + { + "t1.wlt.bak", + "0.1", + }, + { + "t2.wlt", + "0.1", + }, + { + "t2.wlt.bak", + "0.1", + }, + { + "t3.wlt", + "0.1", + }, + { + "t3.wlt.bak", + "0.1", + }, + }, + expectedRemainingFiles: map[string]struct{}{ + "t1.wlt": struct{}{}, + "t2.wlt": struct{}{}, + "t3.wlt": struct{}{}, + }, + }, + { + name: "wlt v0.1=3 bak v0.1=1 no delete", + initFiles: []wltInfo{ + { + "t1.wlt", + "0.1", + }, + { + "t2.wlt", + "0.1", + }, + { + "t3.wlt", + "0.1", + }, + { + "t4.wlt.bak", + "0.1", + }, + }, + expectedRemainingFiles: map[string]struct{}{ + "t1.wlt": struct{}{}, + "t2.wlt": struct{}{}, + "t3.wlt": struct{}{}, + "t4.wlt.bak": struct{}{}, + }, + }, + { + name: "wlt v0.2=3 bak v0.2=1 no delete", + initFiles: []wltInfo{ + { + "t1.wlt", + "0.2", + }, + { + "t2.wlt", + "0.2", + }, + { + "t3.wlt", + "0.2", + }, + { + "t3.wlt.bak", + "0.2", + }, + }, + expectedRemainingFiles: map[string]struct{}{ + "t1.wlt": struct{}{}, + "t2.wlt": struct{}{}, + "t3.wlt": struct{}{}, + "t3.wlt.bak": struct{}{}, + }, + }, + { + name: "wlt v0.1=1 bak v0.1=1 wlt v0.2=2 bak v0.2=2 delete 1 bak", + initFiles: []wltInfo{ + { + "t1.wlt", + "0.1", + }, + { + "t1.wlt.bak", + "0.1", + }, + { + "t2.wlt", + "0.2", + }, + { + "t2.wlt.bak", + "0.2", + }, + { + "t3.wlt", + "0.2", + }, + { + "t3.wlt.bak", + "0.2", + }, + }, + expectedRemainingFiles: map[string]struct{}{ + "t1.wlt": struct{}{}, + "t2.wlt": struct{}{}, + "t2.wlt.bak": struct{}{}, + "t3.wlt": struct{}{}, + "t3.wlt.bak": struct{}{}, + }, + }, + { + name: "wlt v0.1=1 bak v0.1=2 wlt v0.2=2 bak v0.2=1 delete 1 bak", + initFiles: []wltInfo{ + { + "t1.wlt", + "0.1", + }, + { + "t1.wlt.bak", + "0.1", + }, + { + "t2.wlt", + "0.2", + }, + { + "t2.wlt.bak", + "0.1", + }, + { + "t3.wlt", + "0.2", + }, + { + "t3.wlt.bak", + "0.2", + }, + }, + expectedRemainingFiles: map[string]struct{}{ + "t1.wlt": struct{}{}, + "t2.wlt": struct{}{}, + "t2.wlt.bak": struct{}{}, + "t3.wlt": struct{}{}, + "t3.wlt.bak": struct{}{}, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + dir := prepareWltDir() + // Initialize files + for _, f := range tc.initFiles { + w, err := NewWallet(f.wltName, Options{ + Seed: "s1", + Type: WalletTypeDeterministic, + }) + require.NoError(t, err) + w.SetVersion(f.version) + + require.NoError(t, Save(w, dir)) + } + + require.NoError(t, removeBackupFiles(dir)) + + // Get all remaining files + fs, err := ioutil.ReadDir(dir) + require.NoError(t, err) + require.Len(t, fs, len(tc.expectedRemainingFiles)) + for _, f := range fs { + _, ok := tc.expectedRemainingFiles[f.Name()] + require.True(t, ok) + } + }) + } +} + +func TestWalletValidate(t *testing.T) { + goodMetaUnencrypted := map[string]string{ + "filename": "foo.wlt", + "type": WalletTypeDeterministic, + "coin": string(CoinTypeSkycoin), + "encrypted": "false", + "seed": "fooseed", + "lastSeed": "foolastseed", + } + + goodMetaEncrypted := map[string]string{ + "filename": "foo.wlt", + "type": WalletTypeDeterministic, + "coin": string(CoinTypeSkycoin), + "encrypted": "true", + "cryptoType": "scrypt-chacha20poly1305", + "seed": "", + "lastSeed": "", + "secrets": "xacsdasdasdasd", + } + + copyMap := func(m map[string]string) map[string]string { + n := make(map[string]string, len(m)) + for k, v := range m { + n[k] = v + } + return n + } + + delField := func(m map[string]string, f string) map[string]string { + n := copyMap(m) + delete(n, f) + return n + } + + setField := func(m map[string]string, f, g string) map[string]string { + n := copyMap(m) + n[f] = g + return n + } + + cases := []struct { + name string + meta map[string]string + err error + }{ + { + name: "missing filename", + meta: delField(goodMetaUnencrypted, metaFilename), + err: errors.New("filename not set"), + }, + { + name: "wallet type missing", + meta: delField(goodMetaUnencrypted, metaType), + err: errors.New("type field not set"), + }, + { + name: "invalid wallet type", + meta: setField(goodMetaUnencrypted, metaType, "footype"), + err: ErrInvalidWalletType, + }, + { + name: "coin field missing", + meta: delField(goodMetaUnencrypted, metaCoin), + err: errors.New("coin field not set"), + }, + { + name: "encrypted field invalid", + meta: setField(goodMetaUnencrypted, metaEncrypted, "foo"), + err: errors.New("encrypted field is not a valid bool"), + }, + { + name: "unencrypted missing seed", + meta: delField(goodMetaUnencrypted, metaSeed), + err: errors.New("seed missing in unencrypted deterministic wallet"), + }, + { + name: "unencrypted missing last seed", + meta: delField(goodMetaUnencrypted, metaLastSeed), + err: errors.New("lastSeed missing in unencrypted deterministic wallet"), + }, + { + name: "crypto type missing", + meta: delField(goodMetaEncrypted, metaCryptoType), + err: errors.New("crypto type field not set"), + }, + { + name: "crypto type invalid", + meta: setField(goodMetaEncrypted, metaCryptoType, "foocryptotype"), + err: errors.New("unknown crypto type"), + }, + { + name: "secrets missing", + meta: delField(goodMetaEncrypted, metaSecrets), + err: errors.New("wallet is encrypted, but secrets field not set"), + }, + { + name: "secrets empty", + meta: setField(goodMetaEncrypted, metaSecrets, ""), + err: errors.New("wallet is encrypted, but secrets field not set"), + }, + { + name: "valid unencrypted", + meta: goodMetaUnencrypted, + }, + { + name: "valid encrypted", + meta: goodMetaEncrypted, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + w := &DeterministicWallet{ + Meta: tc.meta, + } + err := w.Validate() + + if tc.err == nil { + require.NoError(t, err) + } else { + require.Equal(t, tc.err, err, "%s != %s", tc.err, err) + } + }) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/wallets.go b/vendor/github.com/SkycoinProject/skycoin/src/wallet/wallets.go new file mode 100644 index 00000000..83f32cfb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/wallets.go @@ -0,0 +1,126 @@ +package wallet + +import ( + "fmt" + "io/ioutil" + "path/filepath" + "strings" +) + +// Wallets wallets map +type Wallets map[string]Wallet + +// loadWallets Loads all wallets contained in wallet dir. If any regular file in wallet +// dir fails to load, loading is aborted and error returned. Only files with +// extension WalletExt are considered. +func loadWallets(dir string) (Wallets, error) { + entries, err := ioutil.ReadDir(dir) + if err != nil { + logger.WithError(err).WithField("dir", dir).Error("loadWallets: ioutil.ReadDir failed") + return nil, err + } + + wallets := Wallets{} + for _, e := range entries { + if e.Mode().IsRegular() { + name := e.Name() + if !strings.HasSuffix(name, WalletExt) { + logger.WithField("filename", name).Info("loadWallets: skipping file") + continue + } + + fullpath := filepath.Join(dir, name) + w, err := Load(fullpath) + if err != nil { + logger.WithError(err).WithField("filename", fullpath).Error("loadWallets: loadWallet failed") + return nil, err + } + + logger.WithField("filename", fullpath).Info("loadWallets: loaded wallet") + + wallets[name] = w + } + } + + for name, w := range wallets { + if err := w.Validate(); err != nil { + logger.WithError(err).WithField("name", name).Error("loadWallets: wallet.Validate failed") + return nil, err + } + + if w.Coin() != CoinTypeSkycoin { + err := fmt.Errorf("LoadWallets only support skycoin wallets, %s is a %s wallet", name, w.Coin()) + logger.WithError(err).WithField("name", name).Error() + return nil, err + } + } + + return wallets, nil +} + +// add add walet to current wallet +func (wlts Wallets) add(w Wallet) error { + if _, dup := wlts[w.Filename()]; dup { + return ErrWalletNameConflict + } + + wlts[w.Filename()] = w + return nil +} + +// remove wallet of specific id +func (wlts Wallets) remove(id string) { + delete(wlts, id) +} + +// get returns wallet by wallet id +func (wlts Wallets) get(id string) Wallet { + return wlts[id] +} + +// set sets a wallet into the map +func (wlts Wallets) set(w Wallet) { + wlts[w.Filename()] = w.Clone() +} + +// containsDuplicate returns true if there is a duplicate wallet identified by +// the wallet's fingerprint. This is to detect duplicate generative wallets; +// wallets with no defined generation method do not have a concept of being +// a duplicate of another wallet +func (wlts Wallets) containsDuplicate() (string, string, bool) { + m := make(map[string]struct{}, len(wlts)) + for wltID, wlt := range wlts { + fp := wlt.Fingerprint() + if fp == "" { + continue + } + + if _, ok := m[fp]; ok { + return wltID, fp, true + } + + m[fp] = struct{}{} + } + + return "", "", false +} + +// containsEmpty returns true there is an empty wallet and the ID of that wallet if true. +// Does not apply to collection wallets +func (wlts Wallets) containsEmpty() (string, bool) { + for wltID, wlt := range wlts { + switch wlt.Type() { + case WalletTypeCollection: + continue + case WalletTypeDeterministic: + if wlt.EntriesLen() == 0 { + return wltID, true + } + case WalletTypeBip44: + if len(wlt.(*Bip44Wallet).ExternalEntries) == 0 { + return wltID, true + } + } + } + return "", false +} diff --git a/vendor/github.com/SkycoinProject/skycoin/src/wallet/xpub_wallet.go b/vendor/github.com/SkycoinProject/skycoin/src/wallet/xpub_wallet.go new file mode 100644 index 00000000..32f048c0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/src/wallet/xpub_wallet.go @@ -0,0 +1,348 @@ +package wallet + +import ( + "errors" + "fmt" + "math" + "sort" + + "github.com/sirupsen/logrus" + + "github.com/SkycoinProject/skycoin/src/cipher" + "github.com/SkycoinProject/skycoin/src/cipher/bip32" + "github.com/SkycoinProject/skycoin/src/util/file" + "github.com/SkycoinProject/skycoin/src/util/mathutil" +) + +// XPubWallet holds a single xpub (extended public key) and derives child public keys from it. +// Refer to the bip32 spec to understand xpub keys. +// XPub wallets can generate new addresses and receive coins, but can't spend coins +// because the private keys are not available. +type XPubWallet struct { + Meta + Entries Entries + xpub *bip32.PublicKey +} + +// newXPubWallet creates a XPubWallet +func newXPubWallet(meta Meta) (*XPubWallet, error) { + xpub, err := parseXPub(meta.XPub()) + if err != nil { + return nil, err + } + + return &XPubWallet{ + Meta: meta, + xpub: xpub, + }, nil +} + +func parseXPub(xp string) (*bip32.PublicKey, error) { + xpub, err := bip32.DeserializeEncodedPublicKey(xp) + if err != nil { + logger.WithError(err).Error("bip32.DeserializeEncodedPublicKey failed") + return nil, NewError(fmt.Errorf("invalid xpub key: %v", err)) + } + + return xpub, nil +} + +// PackSecrets does nothing because XPubWallet has no secrets +func (w *XPubWallet) PackSecrets(ss Secrets) { +} + +// UnpackSecrets does nothing because XPubWallet has no secrets +func (w *XPubWallet) UnpackSecrets(ss Secrets) error { + return nil +} + +// Clone clones the wallet a new wallet object +func (w *XPubWallet) Clone() Wallet { + xpub, err := parseXPub(w.Meta.XPub()) + if err != nil { + logger.WithError(err).Panic("Clone parseXPub failed") + } + + return &XPubWallet{ + Meta: w.Meta.clone(), + Entries: w.Entries.clone(), + xpub: xpub, + } +} + +// CopyFrom copies the src wallet to w +func (w *XPubWallet) CopyFrom(src Wallet) { + xpub, err := parseXPub(src.XPub()) + if err != nil { + logger.WithError(err).Panic("CopyFrom parseXPub failed") + } + w.xpub = xpub + w.Meta = src.(*XPubWallet).Meta.clone() + w.Entries = src.(*XPubWallet).Entries.clone() +} + +// CopyFromRef copies the src wallet with a pointer dereference +func (w *XPubWallet) CopyFromRef(src Wallet) { + xpub, err := parseXPub(src.XPub()) + if err != nil { + logger.WithError(err).Panic("CopyFromRef parseXPub failed") + } + + *w = *(src.(*XPubWallet)) + w.xpub = xpub +} + +// Erase wipes secret fields in wallet +func (w *XPubWallet) Erase() { + w.Meta.eraseSeeds() + w.Entries.erase() +} + +// ToReadable converts the wallet to its readable (serializable) format +func (w *XPubWallet) ToReadable() Readable { + return NewReadableXPubWallet(w) +} + +// Validate validates the wallet +func (w *XPubWallet) Validate() error { + return w.Meta.validate() +} + +// GetAddresses returns all addresses in wallet +func (w *XPubWallet) GetAddresses() []cipher.Addresser { + return w.Entries.getAddresses() +} + +// GetSkycoinAddresses returns all Skycoin addresses in wallet. The wallet's coin type must be Skycoin. +func (w *XPubWallet) GetSkycoinAddresses() ([]cipher.Address, error) { + if w.Meta.Coin() != CoinTypeSkycoin { + return nil, errors.New("XPubWallet coin type is not skycoin") + } + + return w.Entries.getSkycoinAddresses(), nil +} + +// GetEntries returns a copy of all entries held by the wallet +func (w *XPubWallet) GetEntries() Entries { + return w.Entries.clone() +} + +// EntriesLen returns the number of entries in the wallet +func (w *XPubWallet) EntriesLen() int { + return len(w.Entries) +} + +// GetEntryAt returns entry at a given index in the entries array +func (w *XPubWallet) GetEntryAt(i int) Entry { + return w.Entries[i] +} + +// GetEntry returns entry of given address +func (w *XPubWallet) GetEntry(a cipher.Address) (Entry, bool) { + return w.Entries.get(a) +} + +// HasEntry returns true if the wallet has an Entry with a given cipher.Address. +func (w *XPubWallet) HasEntry(a cipher.Address) bool { + return w.Entries.has(a) +} + +// generateEntries generates up to `num` addresses +func (w *XPubWallet) generateEntries(num uint64, initialChildIdx uint32) (Entries, error) { + if w.Meta.IsEncrypted() { + return nil, ErrWalletEncrypted + } + + if num > math.MaxUint32 { + return nil, NewError(errors.New("XPubWallet.generateEntries num too large")) + } + + // Cap `num` in case it would exceed the maximum child index number + if math.MaxUint32-initialChildIdx < uint32(num) { + num = uint64(math.MaxUint32 - initialChildIdx) + } + + if num == 0 { + return nil, nil + } + + // Generate `num` secret keys from the external chain HDNode, skipping any children that + // are invalid (note that this has probability ~2^-128) + var pubkeys []*bip32.PublicKey + var addressIndices []uint32 + j := initialChildIdx + for i := uint32(0); i < uint32(num); i++ { + k, err := w.xpub.NewPublicChildKey(j) + + var addErr error + j, addErr = mathutil.AddUint32(j, 1) + if addErr != nil { + logger.Critical().WithError(addErr).WithFields(logrus.Fields{ + "num": num, + "initialChildIdx": initialChildIdx, + "childIdx": j, + "i": i, + }).Error("childIdx can't be incremented any further") + return nil, errors.New("childIdx can't be incremented any further") + } + + if err != nil { + if bip32.IsImpossibleChildError(err) { + logger.Critical().WithError(err).WithField("childIdx", j).Error("ImpossibleChild for xpub child element") + continue + } else { + logger.Critical().WithError(err).WithField("childIdx", j).Error("NewPublicChildKey failed unexpectedly") + return nil, err + } + } + + pubkeys = append(pubkeys, k) + addressIndices = append(addressIndices, j-1) + } + + entries := make(Entries, len(pubkeys)) + makeAddress := w.Meta.AddressConstructor() + for i, xp := range pubkeys { + pk := cipher.MustNewPubKey(xp.Key) + entries[i] = Entry{ + Address: makeAddress(pk), + Public: pk, + ChildNumber: addressIndices[i], + } + } + + return entries, nil +} + +// GenerateAddresses generates addresses for the external chain, and appends them to the wallet's entries array +func (w *XPubWallet) GenerateAddresses(num uint64) ([]cipher.Addresser, error) { + entries, err := w.generateEntries(num, nextChildIdx(w.Entries)) + if err != nil { + return nil, err + } + + w.Entries = append(w.Entries, entries...) + + return entries.getAddresses(), nil +} + +// GenerateSkycoinAddresses generates Skycoin addresses for the external chain, and appends them to the wallet's entries array. +// If the wallet's coin type is not Skycoin, returns an error +func (w *XPubWallet) GenerateSkycoinAddresses(num uint64) ([]cipher.Address, error) { + if w.Meta.Coin() != CoinTypeSkycoin { + return nil, errors.New("GenerateSkycoinAddresses called for non-skycoin wallet") + } + + entries, err := w.generateEntries(num, nextChildIdx(w.Entries)) + if err != nil { + return nil, err + } + + w.Entries = append(w.Entries, entries...) + + return entries.getSkycoinAddresses(), nil +} + +// ScanAddresses scans ahead N addresses, +// truncating up to the highest address with any transaction history. +func (w *XPubWallet) ScanAddresses(scanN uint64, tf TransactionsFinder) error { + if w.Meta.IsEncrypted() { + return ErrWalletEncrypted + } + + if scanN == 0 { + return nil + } + + w2 := w.Clone().(*XPubWallet) + + entries, err := scanAddressesBip32(func(num uint64, childIdx uint32) (Entries, error) { + return w2.generateEntries(num, childIdx) + }, scanN, tf, nextChildIdx(w2.Entries)) + if err != nil { + return err + } + + w2.Entries = append(w2.Entries, entries...) + + *w = *w2 + + return nil +} + +// Fingerprint returns a unique ID fingerprint for this wallet, using the first +// child address of the xpub key +func (w *XPubWallet) Fingerprint() string { + // Note: the xpub key is not used as the fingerprint, because it is + // partially sensitive data + addr := "" + if len(w.Entries) == 0 { + if !w.IsEncrypted() { + entries, err := w.generateEntries(1, 0) + if err != nil { + logger.WithError(err).Panic("Fingerprint failed to generate initial entry for empty wallet") + } + addr = entries[0].Address.String() + } + } else { + addr = w.Entries[0].Address.String() + } + + return fmt.Sprintf("%s-%s", w.Type(), addr) +} + +// ReadableXPubWallet used for [de]serialization of an xpub wallet +type ReadableXPubWallet struct { + Meta `json:"meta"` + ReadableEntries `json:"entries"` +} + +// LoadReadableXPubWallet loads an xpub wallet from disk +func LoadReadableXPubWallet(wltFile string) (*ReadableXPubWallet, error) { + var rw ReadableXPubWallet + if err := file.LoadJSON(wltFile, &rw); err != nil { + return nil, err + } + if rw.Type() != WalletTypeXPub { + return nil, ErrInvalidWalletType + } + return &rw, nil +} + +// NewReadableXPubWallet creates readable wallet +func NewReadableXPubWallet(w *XPubWallet) *ReadableXPubWallet { + return &ReadableXPubWallet{ + Meta: w.Meta.clone(), + ReadableEntries: newReadableEntries(w.Entries, w.Meta.Coin(), w.Meta.Type()), + } +} + +// ToWallet convert readable wallet to Wallet +func (rw *ReadableXPubWallet) ToWallet() (Wallet, error) { + w := &XPubWallet{ + Meta: rw.Meta.clone(), + } + + if err := w.Validate(); err != nil { + err := fmt.Errorf("invalid wallet %q: %v", w.Filename(), err) + logger.WithError(err).Error("ReadableXPubWallet.ToWallet Validate failed") + return nil, err + } + + ets, err := rw.ReadableEntries.toWalletEntries(w.Meta.Coin(), w.Meta.Type(), w.Meta.IsEncrypted()) + if err != nil { + logger.WithError(err).Error("ReadableXPubWallet.ToWallet toWalletEntries failed") + return nil, err + } + + w.Entries = ets + + // Sort childNumber low to high + sort.Slice(w.Entries, func(i, j int) bool { + return w.Entries[i].ChildNumber < w.Entries[j].ChildNumber + }) + + w.Entries = ets + + return w, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/template/coin.template b/vendor/github.com/SkycoinProject/skycoin/template/coin.template new file mode 100755 index 00000000..aa8c8e68 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/template/coin.template @@ -0,0 +1,124 @@ +/* +skycoin daemon +*/ +package main + +/* +CODE GENERATED AUTOMATICALLY WITH FIBER COIN CREATOR +AVOID EDITING THIS MANUALLY +*/ + +import ( + "flag" + _ "net/http/pprof" + "os" + + "github.com/SkycoinProject/skycoin/src/fiber" + "github.com/SkycoinProject/skycoin/src/readable" + "github.com/SkycoinProject/skycoin/src/skycoin" + "github.com/SkycoinProject/skycoin/src/util/logging" +) + +var ( + // Version of the node. Can be set by -ldflags + Version = "0.27.0" + // Commit ID. Can be set by -ldflags + Commit = "" + // Branch name. Can be set by -ldflags + Branch = "" + // ConfigMode (possible values are "", "STANDALONE_CLIENT"). + // This is used to change the default configuration. + // Can be set by -ldflags + ConfigMode = "" + + logger = logging.MustGetLogger("main") + + // CoinName name of coin + CoinName = "{{.CoinName}}" + + // GenesisSignatureStr hex string of genesis signature + GenesisSignatureStr = "{{.GenesisSignatureStr}}" + // GenesisAddressStr genesis address string + GenesisAddressStr = "{{.GenesisAddressStr}}" + // BlockchainPubkeyStr pubic key string + BlockchainPubkeyStr = "{{.BlockchainPubkeyStr}}" + // BlockchainSeckeyStr empty private key string + BlockchainSeckeyStr = "{{.BlockchainSeckeyStr}}" + + // GenesisTimestamp genesis block create unix time + GenesisTimestamp uint64 = {{.GenesisTimestamp}} + // GenesisCoinVolume represents the coin capacity + GenesisCoinVolume uint64 = {{.GenesisCoinVolume}} + + // DefaultConnections the default trust node addresses + DefaultConnections = []string{ + {{- range $index, $address := .DefaultConnections}} + "{{$address -}}", + {{- end}} + } + + nodeConfig = skycoin.NewNodeConfig(ConfigMode, fiber.NodeConfig{ + CoinName: CoinName, + GenesisSignatureStr: GenesisSignatureStr, + GenesisAddressStr: GenesisAddressStr, + GenesisCoinVolume: GenesisCoinVolume, + GenesisTimestamp: GenesisTimestamp, + BlockchainPubkeyStr: BlockchainPubkeyStr, + BlockchainSeckeyStr: BlockchainSeckeyStr, + DefaultConnections: DefaultConnections, + PeerListURL: "{{.PeerListURL}}", + Port: {{.Port}}, + WebInterfacePort: {{.WebInterfacePort}}, + DataDirectory: "{{.DataDirectory}}", + + UnconfirmedBurnFactor: {{.UnconfirmedBurnFactor}}, + UnconfirmedMaxTransactionSize: {{.UnconfirmedMaxTransactionSize}}, + UnconfirmedMaxDropletPrecision: {{.UnconfirmedMaxDropletPrecision}}, + CreateBlockBurnFactor: {{.CreateBlockBurnFactor}}, + CreateBlockMaxTransactionSize: {{.CreateBlockMaxTransactionSize}}, + CreateBlockMaxDropletPrecision: {{.CreateBlockMaxDropletPrecision}}, + MaxBlockTransactionsSize: {{.MaxBlockTransactionsSize}}, + + DisplayName: "{{.DisplayName}}", + Ticker: "{{.Ticker}}", + CoinHoursName: "{{.CoinHoursName}}", + CoinHoursNameSingular: "{{.CoinHoursNameSingular}}", + CoinHoursTicker: "{{.CoinHoursTicker}}", + ExplorerURL: "{{.ExplorerURL}}", + VersionURL: "{{.VersionURL}}", + Bip44Coin: {{.Bip44Coin}}, + }) + + parseFlags = true +) + +func init() { + nodeConfig.RegisterFlags() +} + +func main() { + if parseFlags { + flag.Parse() + } + + // create a new fiber coin instance + coin := skycoin.NewCoin(skycoin.Config{ + Node: nodeConfig, + Build: readable.BuildInfo{ + Version: Version, + Commit: Commit, + Branch: Branch, + }, + }, logger) + + // parse config values + if err := coin.ParseConfig(); err != nil { + logger.Error(err) + os.Exit(1) + } + + // run fiber coin node + if err := coin.Run(); err != nil { + os.Exit(1) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/template/coin_test.template b/vendor/github.com/SkycoinProject/skycoin/template/coin_test.template new file mode 100644 index 00000000..7f3a2d17 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/template/coin_test.template @@ -0,0 +1,20 @@ +// +build testrunmain + +/* +CODE GENERATED AUTOMATICALLY WITH FIBER COIN CREATOR +AVOID EDITING THIS MANUALLY +*/ + +// This file allows us to run the entire program with test coverage enabled, useful for integration tests +package main + +import "testing" + +func init() { + // Disable flag.Parse because go's test runner calls it instead + parseFlags = false +} + +func TestRunMain(t *testing.T) { + main() +} diff --git a/vendor/github.com/SkycoinProject/skycoin/template/params.template b/vendor/github.com/SkycoinProject/skycoin/template/params.template new file mode 100644 index 00000000..2e843e98 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/template/params.template @@ -0,0 +1,31 @@ +package params + +/* +CODE GENERATED AUTOMATICALLY WITH FIBER COIN CREATOR +AVOID EDITING THIS MANUALLY +*/ + +var ( + // MainNetDistribution Skycoin mainnet coin distribution parameters + MainNetDistribution = Distribution{ + MaxCoinSupply: {{.MaxCoinSupply}}, + InitialUnlockedCount: {{.InitialUnlockedCount}}, + UnlockAddressRate: {{.UnlockAddressRate}}, + UnlockTimeInterval: {{.UnlockTimeInterval}}, + Addresses: []string{ + {{- range $index, $address := .DistributionAddresses}} + "{{$address -}}", + {{- end}} + }, + } + + // UserVerifyTxn transaction verification parameters for user-created transactions + UserVerifyTxn = VerifyTxn{ + // BurnFactor can be overriden with `USER_BURN_FACTOR` env var + BurnFactor: {{.UserBurnFactor}}, + // MaxTransactionSize can be overriden with `USER_MAX_TXN_SIZE` env var + MaxTransactionSize: {{.UserMaxTransactionSize}}, // in bytes + // MaxDropletPrecision can be overriden with `USER_MAX_DECIMALS` env var + MaxDropletPrecision: {{.UserMaxDropletPrecision}}, + } +) diff --git a/vendor/github.com/NYTimes/gziphandler/.gitignore b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/NYTimes/gziphandler/.gitignore similarity index 100% rename from vendor/github.com/NYTimes/gziphandler/.gitignore rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/NYTimes/gziphandler/.gitignore diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/NYTimes/gziphandler/.travis.yml b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/NYTimes/gziphandler/.travis.yml new file mode 100644 index 00000000..d2b67f69 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/NYTimes/gziphandler/.travis.yml @@ -0,0 +1,6 @@ +language: go + +go: + - 1.7 + - 1.8 + - tip diff --git a/vendor/github.com/NYTimes/gziphandler/CODE_OF_CONDUCT.md b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/NYTimes/gziphandler/CODE_OF_CONDUCT.md similarity index 100% rename from vendor/github.com/NYTimes/gziphandler/CODE_OF_CONDUCT.md rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/NYTimes/gziphandler/CODE_OF_CONDUCT.md diff --git a/vendor/github.com/NYTimes/gziphandler/CONTRIBUTING.md b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/NYTimes/gziphandler/CONTRIBUTING.md similarity index 100% rename from vendor/github.com/NYTimes/gziphandler/CONTRIBUTING.md rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/NYTimes/gziphandler/CONTRIBUTING.md diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/NYTimes/gziphandler/LICENSE b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/NYTimes/gziphandler/LICENSE new file mode 100644 index 00000000..df6192d3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/NYTimes/gziphandler/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2016-2017 The New York Times Company + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/NYTimes/gziphandler/README.md b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/NYTimes/gziphandler/README.md similarity index 83% rename from vendor/github.com/NYTimes/gziphandler/README.md rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/NYTimes/gziphandler/README.md index 6259acac..6d724607 100644 --- a/vendor/github.com/NYTimes/gziphandler/README.md +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/NYTimes/gziphandler/README.md @@ -6,10 +6,6 @@ response body, for clients which support it. Although it's usually simpler to leave that to a reverse proxy (like nginx or Varnish), this package is useful when that's undesirable. -## Install -```bash -go get -u github.com/NYTimes/gziphandler -``` ## Usage @@ -52,5 +48,5 @@ The docs can be found at [godoc.org][docs], as usual. -[docs]: https://godoc.org/github.com/NYTimes/gziphandler -[license]: https://github.com/NYTimes/gziphandler/blob/master/LICENSE +[docs]: https://godoc.org/github.com/nytimes/gziphandler +[license]: https://github.com/nytimes/gziphandler/blob/master/LICENSE.md diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/NYTimes/gziphandler/gzip.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/NYTimes/gziphandler/gzip.go new file mode 100644 index 00000000..f91dcfa1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/NYTimes/gziphandler/gzip.go @@ -0,0 +1,429 @@ +package gziphandler + +import ( + "bufio" + "compress/gzip" + "fmt" + "io" + "net" + "net/http" + "strconv" + "strings" + "sync" +) + +const ( + vary = "Vary" + acceptEncoding = "Accept-Encoding" + contentEncoding = "Content-Encoding" + contentType = "Content-Type" + contentLength = "Content-Length" +) + +type codings map[string]float64 + +const ( + // DefaultQValue is the default qvalue to assign to an encoding if no explicit qvalue is set. + // This is actually kind of ambiguous in RFC 2616, so hopefully it's correct. + // The examples seem to indicate that it is. + DefaultQValue = 1.0 + + // 1500 bytes is the MTU size for the internet since that is the largest size allowed at the network layer. + // If you take a file that is 1300 bytes and compress it to 800 bytes, it’s still transmitted in that same 1500 byte packet regardless, so you’ve gained nothing. + // That being the case, you should restrict the gzip compression to files with a size greater than a single packet, 1400 bytes (1.4KB) is a safe value. + DefaultMinSize = 1400 +) + +// gzipWriterPools stores a sync.Pool for each compression level for reuse of +// gzip.Writers. Use poolIndex to covert a compression level to an index into +// gzipWriterPools. +var gzipWriterPools [gzip.BestCompression - gzip.BestSpeed + 2]*sync.Pool + +func init() { + for i := gzip.BestSpeed; i <= gzip.BestCompression; i++ { + addLevelPool(i) + } + addLevelPool(gzip.DefaultCompression) +} + +// poolIndex maps a compression level to its index into gzipWriterPools. It +// assumes that level is a valid gzip compression level. +func poolIndex(level int) int { + // gzip.DefaultCompression == -1, so we need to treat it special. + if level == gzip.DefaultCompression { + return gzip.BestCompression - gzip.BestSpeed + 1 + } + return level - gzip.BestSpeed +} + +func addLevelPool(level int) { + gzipWriterPools[poolIndex(level)] = &sync.Pool{ + New: func() interface{} { + // NewWriterLevel only returns error on a bad level, we are guaranteeing + // that this will be a valid level so it is okay to ignore the returned + // error. + w, _ := gzip.NewWriterLevel(nil, level) + return w + }, + } +} + +// GzipResponseWriter provides an http.ResponseWriter interface, which gzips +// bytes before writing them to the underlying response. This doesn't close the +// writers, so don't forget to do that. +// It can be configured to skip response smaller than minSize. +type GzipResponseWriter struct { + http.ResponseWriter + index int // Index for gzipWriterPools. + gw *gzip.Writer + + code int // Saves the WriteHeader value. + + minSize int // Specifed the minimum response size to gzip. If the response length is bigger than this value, it is compressed. + buf []byte // Holds the first part of the write before reaching the minSize or the end of the write. + + contentTypes []string // Only compress if the response is one of these content-types. All are accepted if empty. +} + +type GzipResponseWriterWithCloseNotify struct { + *GzipResponseWriter +} + +func (w GzipResponseWriterWithCloseNotify) CloseNotify() <-chan bool { + return w.ResponseWriter.(http.CloseNotifier).CloseNotify() +} + +// Write appends data to the gzip writer. +func (w *GzipResponseWriter) Write(b []byte) (int, error) { + // If content type is not set. + if _, ok := w.Header()[contentType]; !ok { + // It infer it from the uncompressed body. + w.Header().Set(contentType, http.DetectContentType(b)) + } + + // GZIP responseWriter is initialized. Use the GZIP responseWriter. + if w.gw != nil { + n, err := w.gw.Write(b) + return n, err + } + + // Save the write into a buffer for later use in GZIP responseWriter (if content is long enough) or at close with regular responseWriter. + // On the first write, w.buf changes from nil to a valid slice + w.buf = append(w.buf, b...) + + // If the global writes are bigger than the minSize and we're about to write + // a response containing a content type we want to handle, enable + // compression. + if len(w.buf) >= w.minSize && handleContentType(w.contentTypes, w) && w.Header().Get(contentEncoding) == "" { + err := w.startGzip() + if err != nil { + return 0, err + } + } + + return len(b), nil +} + +// startGzip initialize any GZIP specific informations. +func (w *GzipResponseWriter) startGzip() error { + + // Set the GZIP header. + w.Header().Set(contentEncoding, "gzip") + + // if the Content-Length is already set, then calls to Write on gzip + // will fail to set the Content-Length header since its already set + // See: https://github.com/golang/go/issues/14975. + w.Header().Del(contentLength) + + // Write the header to gzip response. + if w.code != 0 { + w.ResponseWriter.WriteHeader(w.code) + } + + // Initialize the GZIP response. + w.init() + + // Flush the buffer into the gzip response. + n, err := w.gw.Write(w.buf) + + // This should never happen (per io.Writer docs), but if the write didn't + // accept the entire buffer but returned no specific error, we have no clue + // what's going on, so abort just to be safe. + if err == nil && n < len(w.buf) { + return io.ErrShortWrite + } + + w.buf = nil + return err +} + +// WriteHeader just saves the response code until close or GZIP effective writes. +func (w *GzipResponseWriter) WriteHeader(code int) { + if w.code == 0 { + w.code = code + } +} + +// init graps a new gzip writer from the gzipWriterPool and writes the correct +// content encoding header. +func (w *GzipResponseWriter) init() { + // Bytes written during ServeHTTP are redirected to this gzip writer + // before being written to the underlying response. + gzw := gzipWriterPools[w.index].Get().(*gzip.Writer) + gzw.Reset(w.ResponseWriter) + w.gw = gzw +} + +// Close will close the gzip.Writer and will put it back in the gzipWriterPool. +func (w *GzipResponseWriter) Close() error { + if w.gw == nil { + // Gzip not trigged yet, write out regular response. + if w.code != 0 { + w.ResponseWriter.WriteHeader(w.code) + } + if w.buf != nil { + _, writeErr := w.ResponseWriter.Write(w.buf) + // Returns the error if any at write. + if writeErr != nil { + return fmt.Errorf("gziphandler: write to regular responseWriter at close gets error: %q", writeErr.Error()) + } + } + return nil + } + + err := w.gw.Close() + gzipWriterPools[w.index].Put(w.gw) + w.gw = nil + return err +} + +// Flush flushes the underlying *gzip.Writer and then the underlying +// http.ResponseWriter if it is an http.Flusher. This makes GzipResponseWriter +// an http.Flusher. +func (w *GzipResponseWriter) Flush() { + if w.gw == nil { + // Only flush once startGzip has been called. + // + // Flush is thus a no-op until the written body + // exceeds minSize. + return + } + + w.gw.Flush() + + if fw, ok := w.ResponseWriter.(http.Flusher); ok { + fw.Flush() + } +} + +// Hijack implements http.Hijacker. If the underlying ResponseWriter is a +// Hijacker, its Hijack method is returned. Otherwise an error is returned. +func (w *GzipResponseWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) { + if hj, ok := w.ResponseWriter.(http.Hijacker); ok { + return hj.Hijack() + } + return nil, nil, fmt.Errorf("http.Hijacker interface is not supported") +} + +// verify Hijacker interface implementation +var _ http.Hijacker = &GzipResponseWriter{} + +// MustNewGzipLevelHandler behaves just like NewGzipLevelHandler except that in +// an error case it panics rather than returning an error. +func MustNewGzipLevelHandler(level int) func(http.Handler) http.Handler { + wrap, err := NewGzipLevelHandler(level) + if err != nil { + panic(err) + } + return wrap +} + +// NewGzipLevelHandler returns a wrapper function (often known as middleware) +// which can be used to wrap an HTTP handler to transparently gzip the response +// body if the client supports it (via the Accept-Encoding header). Responses will +// be encoded at the given gzip compression level. An error will be returned only +// if an invalid gzip compression level is given, so if one can ensure the level +// is valid, the returned error can be safely ignored. +func NewGzipLevelHandler(level int) (func(http.Handler) http.Handler, error) { + return NewGzipLevelAndMinSize(level, DefaultMinSize) +} + +// NewGzipLevelAndMinSize behave as NewGzipLevelHandler except it let the caller +// specify the minimum size before compression. +func NewGzipLevelAndMinSize(level, minSize int) (func(http.Handler) http.Handler, error) { + return GzipHandlerWithOpts(CompressionLevel(level), MinSize(minSize)) +} + +func GzipHandlerWithOpts(opts ...option) (func(http.Handler) http.Handler, error) { + c := &config{ + level: gzip.DefaultCompression, + minSize: DefaultMinSize, + } + + for _, o := range opts { + o(c) + } + + if err := c.validate(); err != nil { + return nil, err + } + + return func(h http.Handler) http.Handler { + index := poolIndex(c.level) + + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Add(vary, acceptEncoding) + if acceptsGzip(r) { + gw := &GzipResponseWriter{ + ResponseWriter: w, + index: index, + minSize: c.minSize, + contentTypes: c.contentTypes, + } + defer gw.Close() + + if _, ok := w.(http.CloseNotifier); ok { + gwcn := GzipResponseWriterWithCloseNotify{gw} + h.ServeHTTP(gwcn, r) + } else { + h.ServeHTTP(gw, r) + } + + } else { + h.ServeHTTP(w, r) + } + }) + }, nil +} + +// Used for functional configuration. +type config struct { + minSize int + level int + contentTypes []string +} + +func (c *config) validate() error { + if c.level != gzip.DefaultCompression && (c.level < gzip.BestSpeed || c.level > gzip.BestCompression) { + return fmt.Errorf("invalid compression level requested: %d", c.level) + } + + if c.minSize < 0 { + return fmt.Errorf("minimum size must be more than zero") + } + + return nil +} + +type option func(c *config) + +func MinSize(size int) option { + return func(c *config) { + c.minSize = size + } +} + +func CompressionLevel(level int) option { + return func(c *config) { + c.level = level + } +} + +func ContentTypes(types []string) option { + return func(c *config) { + c.contentTypes = []string{} + for _, v := range types { + c.contentTypes = append(c.contentTypes, strings.ToLower(v)) + } + } +} + +// GzipHandler wraps an HTTP handler, to transparently gzip the response body if +// the client supports it (via the Accept-Encoding header). This will compress at +// the default compression level. +func GzipHandler(h http.Handler) http.Handler { + wrapper, _ := NewGzipLevelHandler(gzip.DefaultCompression) + return wrapper(h) +} + +// acceptsGzip returns true if the given HTTP request indicates that it will +// accept a gzipped response. +func acceptsGzip(r *http.Request) bool { + acceptedEncodings, _ := parseEncodings(r.Header.Get(acceptEncoding)) + return acceptedEncodings["gzip"] > 0.0 +} + +// returns true if we've been configured to compress the specific content type. +func handleContentType(contentTypes []string, w http.ResponseWriter) bool { + // If contentTypes is empty we handle all content types. + if len(contentTypes) == 0 { + return true + } + + ct := strings.ToLower(w.Header().Get(contentType)) + for _, c := range contentTypes { + if c == ct { + return true + } + } + + return false +} + +// parseEncodings attempts to parse a list of codings, per RFC 2616, as might +// appear in an Accept-Encoding header. It returns a map of content-codings to +// quality values, and an error containing the errors encountered. It's probably +// safe to ignore those, because silently ignoring errors is how the internet +// works. +// +// See: http://tools.ietf.org/html/rfc2616#section-14.3. +func parseEncodings(s string) (codings, error) { + c := make(codings) + var e []string + + for _, ss := range strings.Split(s, ",") { + coding, qvalue, err := parseCoding(ss) + + if err != nil { + e = append(e, err.Error()) + } else { + c[coding] = qvalue + } + } + + // TODO (adammck): Use a proper multi-error struct, so the individual errors + // can be extracted if anyone cares. + if len(e) > 0 { + return c, fmt.Errorf("errors while parsing encodings: %s", strings.Join(e, ", ")) + } + + return c, nil +} + +// parseCoding parses a single conding (content-coding with an optional qvalue), +// as might appear in an Accept-Encoding header. It attempts to forgive minor +// formatting errors. +func parseCoding(s string) (coding string, qvalue float64, err error) { + for n, part := range strings.Split(s, ";") { + part = strings.TrimSpace(part) + qvalue = DefaultQValue + + if n == 0 { + coding = strings.ToLower(part) + } else if strings.HasPrefix(part, "q=") { + qvalue, err = strconv.ParseFloat(strings.TrimPrefix(part, "q="), 64) + + if qvalue < 0.0 { + qvalue = 0.0 + } else if qvalue > 1.0 { + qvalue = 1.0 + } + } + } + + if coding == "" { + err = fmt.Errorf("empty content-coding") + } + + return +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/NYTimes/gziphandler/gzip_go18.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/NYTimes/gziphandler/gzip_go18.go new file mode 100644 index 00000000..fa9665b7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/NYTimes/gziphandler/gzip_go18.go @@ -0,0 +1,43 @@ +// +build go1.8 + +package gziphandler + +import "net/http" + +// Push initiates an HTTP/2 server push. +// Push returns ErrNotSupported if the client has disabled push or if push +// is not supported on the underlying connection. +func (w *GzipResponseWriter) Push(target string, opts *http.PushOptions) error { + pusher, ok := w.ResponseWriter.(http.Pusher) + if ok && pusher != nil { + return pusher.Push(target, setAcceptEncodingForPushOptions(opts)) + } + return http.ErrNotSupported +} + +// setAcceptEncodingForPushOptions sets "Accept-Encoding" : "gzip" for PushOptions without overriding existing headers. +func setAcceptEncodingForPushOptions(opts *http.PushOptions) *http.PushOptions { + + if opts == nil { + opts = &http.PushOptions{ + Header: http.Header{ + acceptEncoding: []string{"gzip"}, + }, + } + return opts + } + + if opts.Header == nil { + opts.Header = http.Header{ + acceptEncoding: []string{"gzip"}, + } + return opts + } + + if encoding := opts.Header.Get(acceptEncoding); encoding == "" { + opts.Header.Add(acceptEncoding, "gzip") + return opts + } + + return opts +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/SkycoinProject/encodertest/.gitignore b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/SkycoinProject/encodertest/.gitignore new file mode 100644 index 00000000..f1c181ec --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/SkycoinProject/encodertest/.gitignore @@ -0,0 +1,12 @@ +# Binaries for programs and plugins +*.exe +*.exe~ +*.dll +*.so +*.dylib + +# Test binary, build with `go test -c` +*.test + +# Output of the go coverage tool, specifically when used with LiteIDE +*.out diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/SkycoinProject/encodertest/.travis.yml b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/SkycoinProject/encodertest/.travis.yml new file mode 100644 index 00000000..1b3824fb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/SkycoinProject/encodertest/.travis.yml @@ -0,0 +1,16 @@ +sudo: required +dist: trusty +language: go +go: + - "1.11.x" + - tip + +install: + - go get -t github.com/skycoin/encodertest/... + +script: + - go test . + +notifications: + # https://github.com/kvld/travisci-telegram TravisCI Telegram Bot integration + webhooks: https://fathomless-fjord-24024.herokuapp.com/notify diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/SkycoinProject/encodertest/LICENSE b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/SkycoinProject/encodertest/LICENSE new file mode 100644 index 00000000..8574600e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/SkycoinProject/encodertest/LICENSE @@ -0,0 +1,7 @@ +Copyright 2019 Skycoin + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/SkycoinProject/encodertest/README.md b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/SkycoinProject/encodertest/README.md new file mode 100644 index 00000000..89578681 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/SkycoinProject/encodertest/README.md @@ -0,0 +1,5 @@ +# encodertest +Test utilities for the skycoin encoder + +[![Build Status](https://travis-ci.com/skycoin/encodertest.svg)](https://travis-ci.com/skycoin/encodertest) +[![GoDoc](https://godoc.org/github.com/skycoin/encodertest?status.svg)](https://godoc.org/github.com/skycoin/encodertest) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/SkycoinProject/encodertest/cmp.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/SkycoinProject/encodertest/cmp.go new file mode 100644 index 00000000..49a3ad1f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/SkycoinProject/encodertest/cmp.go @@ -0,0 +1,28 @@ +package encodertest + +import ( + "unicode" + "unicode/utf8" + + "github.com/google/go-cmp/cmp" +) + +// IgnoreAllUnexported returns an Option that only ignores the all unexported +// fields of a struct and its descendents, including anonymous fields of unexported types, +func IgnoreAllUnexported() cmp.Option { + return cmp.FilterPath(allUnexportedFilter, cmp.Ignore()) +} + +func allUnexportedFilter(p cmp.Path) bool { + sf, ok := p.Index(-1).(cmp.StructField) + if !ok { + return false + } + return !isExported(sf.Name()) +} + +// isExported reports whether the identifier is exported. +func isExported(id string) bool { + r, _ := utf8.DecodeRuneInString(id) + return unicode.IsUpper(r) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/SkycoinProject/encodertest/populate.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/SkycoinProject/encodertest/populate.go new file mode 100644 index 00000000..9f33bef5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/SkycoinProject/encodertest/populate.go @@ -0,0 +1,232 @@ +// Package encodertest provides test helpers for testing package encoder +package encodertest + +import ( + "errors" + "fmt" + "log" + "reflect" + "strconv" + "strings" + + mathrand "math/rand" +) + +// PopulateRandomOptions are configuration options for the PopulateRandom method +type PopulateRandomOptions struct { + // Maximum random length for strings, slices, maps. If a string, slice or map has a `maxlen` struct tag, the lesser of the two will be used + MaxRandLen int + // Minimum random length for strings, slices, maps + MinRandLen int + // Leave slices as nil if they are empty + EmptySliceNil bool + // Leaves maps as nil if they are empty + EmptyMapNil bool + // Leave an omitempty field empty + ForceEmptyOmitEmpty bool + // Don't populate maps + IgnoreMaps bool +} + +// PopulateRandom constructs an object with random data. +// This is used by the autogenerated skyencoder tests and can be useful in other testing. +func PopulateRandom(obj interface{}, rand *mathrand.Rand, options PopulateRandomOptions) error { + if options.MaxRandLen < options.MinRandLen { + return errors.New("MaxRandLen must be >= MinRandLen") + } + + v := reflect.ValueOf(obj) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + case reflect.Map: + default: + return fmt.Errorf("DeserializeRaw value must be a ptr, is %s", v.Kind().String()) + } + + return populate(v, rand, options, 0) +} + +func populate(v reflect.Value, rand *mathrand.Rand, options PopulateRandomOptions, maxlen int) error { + kind := v.Kind() + switch kind { + case reflect.Array: + length := v.Len() + for i := 0; i < length; i++ { + if err := populate(v.Index(i), rand, options, 0); err != nil { + return err + } + } + + case reflect.Map: + length := 0 + + if !options.IgnoreMaps { + length = randLen(rand, options, maxlen) + } + + if length == 0 && options.EmptyMapNil { + return nil + } + + t := v.Type() + + if v.IsNil() { + v.Set(reflect.Indirect(reflect.MakeMap(t))) + } + + key := t.Key() + elem := t.Elem() + for i := 0; i < length; i++ { + keyv := reflect.Indirect(reflect.New(key)) + elemv := reflect.Indirect(reflect.New(elem)) + if err := populate(keyv, rand, options, 0); err != nil { + return err + } + if err := populate(elemv, rand, options, 0); err != nil { + return err + } + v.SetMapIndex(keyv, elemv) + } + + case reflect.Slice: + length := randLen(rand, options, maxlen) + + if length == 0 && options.EmptySliceNil { + return nil + } + + t := v.Type() + elemvs := reflect.MakeSlice(t, length, length) + for i := 0; i < length; i++ { + elemv := reflect.Indirect(elemvs.Index(i)) + if err := populate(elemv, rand, options, 0); err != nil { + return err + } + } + v.Set(elemvs) + + case reflect.Struct: + t := v.Type() + nFields := v.NumField() + for i := 0; i < nFields; i++ { + ff := t.Field(i) + // Skip unexported fields + if ff.PkgPath != "" { + continue + } + + tag := ff.Tag.Get("enc") + omitempty := tagOmitempty(tag) + + if omitempty && i != nFields-1 { + log.Panic("omitempty can only be used on the last field of a struct") + } + + if len(tag) > 0 && tag[0] == '-' { + continue + } + + fv := v.Field(i) + if fv.CanSet() && ff.Name != "_" { + maxlen := tagMaxLen(tag) + + opts := options + if omitempty && opts.ForceEmptyOmitEmpty { + opts.MaxRandLen = 0 + opts.MinRandLen = 0 + } + + if err := populate(fv, rand, opts, maxlen); err != nil { + return err + } + } + } + + case reflect.String: + length := randLen(rand, options, maxlen) + v.SetString(randString(rand, length)) + + case reflect.Bool: + v.SetBool(rand.Uint64()%2 == 0) + + // rand.Int63 is not used because it returns a non-negative integer + case reflect.Int8: + v.SetInt(int64(rand.Uint64())) + case reflect.Int16: + v.SetInt(int64(rand.Uint64())) + case reflect.Int32: + v.SetInt(int64(rand.Uint64())) + case reflect.Int64: + v.SetInt(int64(rand.Uint64())) + + case reflect.Uint8: + v.SetUint(rand.Uint64()) + case reflect.Uint16: + v.SetUint(rand.Uint64()) + case reflect.Uint32: + v.SetUint(rand.Uint64()) + case reflect.Uint64: + v.SetUint(rand.Uint64()) + + case reflect.Float32: + v.SetFloat(rand.Float64()) + case reflect.Float64: + v.SetFloat(rand.Float64()) + + default: + log.Panicf("Decode error: kind %s not handled", v.Kind().String()) + } + + return nil +} + +func randLen(rand *mathrand.Rand, options PopulateRandomOptions, maxlen int) int { + max := options.MaxRandLen + if maxlen != 0 && maxlen < max { + max = maxlen + } + + min := options.MinRandLen + if maxlen != 0 && maxlen < min { + min = maxlen + } + + return rand.Intn(max-min+1) + min +} + +const printableChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%^&*()-=_+[]{}\\|:\";'<>,./?`~\n\t " + +func randString(rand *mathrand.Rand, n int) string { + b := make([]byte, n) + for i := range b { + b[i] = printableChars[rand.Int63()%int64(len(printableChars))] + } + return string(b) +} + +// tagOmitempty returns true if the tag specifies omitempty +func tagOmitempty(tag string) bool { + return strings.Contains(tag, ",omitempty") +} + +// tagMaxLen returns the maxlen value tagged on a struct. Returns 0 if no tag is present. +func tagMaxLen(tag string) int { + maxlenIndex := strings.Index(tag, ",maxlen=") + if maxlenIndex == -1 { + return 0 + } + + maxlenRem := tag[maxlenIndex+len(",maxlen="):] + commaIndex := strings.Index(maxlenRem, ",") + if commaIndex != -1 { + maxlenRem = maxlenRem[:commaIndex] + } + + maxlen, err := strconv.Atoi(maxlenRem) + if err != nil { + panic("maxlen must be a number") + } + + return maxlen +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/andreyvit/diff/.gitignore b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/andreyvit/diff/.gitignore new file mode 100644 index 00000000..daf913b1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/andreyvit/diff/.gitignore @@ -0,0 +1,24 @@ +# Compiled Object files, Static and Dynamic libs (Shared Objects) +*.o +*.a +*.so + +# Folders +_obj +_test + +# Architecture specific extensions/prefixes +*.[568vq] +[568vq].out + +*.cgo1.go +*.cgo2.c +_cgo_defun.c +_cgo_gotypes.go +_cgo_export.* + +_testmain.go + +*.exe +*.test +*.prof diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/andreyvit/diff/LICENSE b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/andreyvit/diff/LICENSE new file mode 100644 index 00000000..05b98e1f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/andreyvit/diff/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 Andrey Tarantsov + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/andreyvit/diff/README.md b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/andreyvit/diff/README.md new file mode 100644 index 00000000..5b52fea8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/andreyvit/diff/README.md @@ -0,0 +1,28 @@ +# diff + +Quick'n'easy string diffing functions for Golang based on [github.com/sergi/go-diff](https://github.com/sergi/go-diff). Mainly for diffing strings in tests. + +See [the docs on GoDoc](https://godoc.org/github.com/andreyvit/diff). + +Get it: + + go get -u github.com/andreyvit/diff + +Example: + + import ( + "strings" + "testing" + "github.com/andreyvit/diff" + ) + + const expected = ` + ... + ` + + func TestFoo(t *testing.T) { + actual := Foo(...) + if a, e := strings.TrimSpace(actual), strings.TrimSpace(expected); a != e { + t.Errorf("Result not as expected:\n%v", diff.LineDiff(e, a)) + } + } diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/andreyvit/diff/diff.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/andreyvit/diff/diff.go new file mode 100644 index 00000000..12953c83 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/andreyvit/diff/diff.go @@ -0,0 +1,128 @@ +package diff + +import ( + "bytes" + "strings" + + "github.com/sergi/go-diff/diffmatchpatch" +) + +func diff(a, b string) []diffmatchpatch.Diff { + dmp := diffmatchpatch.New() + diffs := dmp.DiffMain(a, b, true) + if len(diffs) > 2 { + diffs = dmp.DiffCleanupSemantic(diffs) + diffs = dmp.DiffCleanupEfficiency(diffs) + } + return diffs +} + +// CharacterDiff returns an inline diff between the two strings, using (++added++) and (~~deleted~~) markup. +func CharacterDiff(a, b string) string { + return diffsToString(diff(a, b)) +} + +func diffsToString(diffs []diffmatchpatch.Diff) string { + var buff bytes.Buffer + for _, diff := range diffs { + text := diff.Text + switch diff.Type { + case diffmatchpatch.DiffInsert: + buff.WriteString("(++") + buff.WriteString(text) + buff.WriteString("++)") + case diffmatchpatch.DiffDelete: + buff.WriteString("(~~") + buff.WriteString(text) + buff.WriteString("~~)") + case diffmatchpatch.DiffEqual: + buff.WriteString(text) + } + } + return buff.String() +} + +// LineDiff returns a normal linewise diff between the two given strings. +func LineDiff(a, b string) string { + return strings.Join(LineDiffAsLines(a, b), "\n") +} + +// LineDiffAsLines returns the lines of a linewise diff between the two given strings. +func LineDiffAsLines(a, b string) []string { + return diffsToPatchLines(diff(a, b)) +} + +type patchBuilder struct { + output []string + oldLines []string + newLines []string + newLineBuffer bytes.Buffer + oldLineBuffer bytes.Buffer +} + +func (b *patchBuilder) AddCharacters(text string, op diffmatchpatch.Operation) { + if op == diffmatchpatch.DiffInsert || op == diffmatchpatch.DiffEqual { + b.newLineBuffer.WriteString(text) + } + if op == diffmatchpatch.DiffDelete || op == diffmatchpatch.DiffEqual { + b.oldLineBuffer.WriteString(text) + } +} +func (b *patchBuilder) AddNewline(op diffmatchpatch.Operation) { + oldLine := b.oldLineBuffer.String() + newLine := b.newLineBuffer.String() + + if op == diffmatchpatch.DiffEqual && (oldLine == newLine) { + b.FlushChunk() + b.output = append(b.output, " "+newLine) + b.oldLineBuffer.Reset() + b.newLineBuffer.Reset() + } else { + if op == diffmatchpatch.DiffDelete || op == diffmatchpatch.DiffEqual { + b.oldLines = append(b.oldLines, "-"+oldLine) + b.oldLineBuffer.Reset() + } + if op == diffmatchpatch.DiffInsert || op == diffmatchpatch.DiffEqual { + b.newLines = append(b.newLines, "+"+newLine) + b.newLineBuffer.Reset() + } + } +} +func (b *patchBuilder) FlushChunk() { + if b.oldLines != nil { + b.output = append(b.output, b.oldLines...) + b.oldLines = nil + } + if b.newLines != nil { + b.output = append(b.output, b.newLines...) + b.newLines = nil + } +} +func (b *patchBuilder) Flush() { + if b.oldLineBuffer.Len() > 0 && b.newLineBuffer.Len() > 0 { + b.AddNewline(diffmatchpatch.DiffEqual) + } else if b.oldLineBuffer.Len() > 0 { + b.AddNewline(diffmatchpatch.DiffDelete) + } else if b.newLineBuffer.Len() > 0 { + b.AddNewline(diffmatchpatch.DiffInsert) + } + b.FlushChunk() +} + +func diffsToPatchLines(diffs []diffmatchpatch.Diff) []string { + b := new(patchBuilder) + b.output = make([]string, 0, len(diffs)) + + for _, diff := range diffs { + lines := strings.Split(diff.Text, "\n") + for idx, line := range lines { + if idx > 0 { + b.AddNewline(diff.Type) + } + b.AddCharacters(line, diff.Type) + } + } + + b.Flush() + return b.output +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/andreyvit/diff/doc.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/andreyvit/diff/doc.go new file mode 100644 index 00000000..98e24708 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/andreyvit/diff/doc.go @@ -0,0 +1,2 @@ +// diff provides quick and easy string diffing functions based on github.com/sergi/go-diff, mainly for diffing strings in tests +package diff diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/andreyvit/diff/trim.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/andreyvit/diff/trim.go new file mode 100644 index 00000000..87871f99 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/andreyvit/diff/trim.go @@ -0,0 +1,19 @@ +package diff + +import ( + "strings" +) + +// TrimLines applies TrimSpace to each string in the given array. +func TrimLines(input []string) []string { + result := make([]string, 0, len(input)) + for _, el := range input { + result = append(result, strings.TrimSpace(el)) + } + return result +} + +// TrimLinesInString applies TrimSpace to each line in the given string, and returns the new trimmed string. Empty lines are not removed. +func TrimLinesInString(input string) string { + return strings.Join(TrimLines(strings.Split(strings.TrimSpace(input), "\n")), "\n") +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/beorn7/perks/LICENSE b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/beorn7/perks/LICENSE new file mode 100644 index 00000000..339177be --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/beorn7/perks/LICENSE @@ -0,0 +1,20 @@ +Copyright (C) 2013 Blake Mizerany + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/beorn7/perks/quantile/exampledata.txt b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/beorn7/perks/quantile/exampledata.txt similarity index 100% rename from vendor/github.com/beorn7/perks/quantile/exampledata.txt rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/beorn7/perks/quantile/exampledata.txt diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/beorn7/perks/quantile/stream.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/beorn7/perks/quantile/stream.go new file mode 100644 index 00000000..d7d14f8e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/beorn7/perks/quantile/stream.go @@ -0,0 +1,316 @@ +// Package quantile computes approximate quantiles over an unbounded data +// stream within low memory and CPU bounds. +// +// A small amount of accuracy is traded to achieve the above properties. +// +// Multiple streams can be merged before calling Query to generate a single set +// of results. This is meaningful when the streams represent the same type of +// data. See Merge and Samples. +// +// For more detailed information about the algorithm used, see: +// +// Effective Computation of Biased Quantiles over Data Streams +// +// http://www.cs.rutgers.edu/~muthu/bquant.pdf +package quantile + +import ( + "math" + "sort" +) + +// Sample holds an observed value and meta information for compression. JSON +// tags have been added for convenience. +type Sample struct { + Value float64 `json:",string"` + Width float64 `json:",string"` + Delta float64 `json:",string"` +} + +// Samples represents a slice of samples. It implements sort.Interface. +type Samples []Sample + +func (a Samples) Len() int { return len(a) } +func (a Samples) Less(i, j int) bool { return a[i].Value < a[j].Value } +func (a Samples) Swap(i, j int) { a[i], a[j] = a[j], a[i] } + +type invariant func(s *stream, r float64) float64 + +// NewLowBiased returns an initialized Stream for low-biased quantiles +// (e.g. 0.01, 0.1, 0.5) where the needed quantiles are not known a priori, but +// error guarantees can still be given even for the lower ranks of the data +// distribution. +// +// The provided epsilon is a relative error, i.e. the true quantile of a value +// returned by a query is guaranteed to be within (1±Epsilon)*Quantile. +// +// See http://www.cs.rutgers.edu/~muthu/bquant.pdf for time, space, and error +// properties. +func NewLowBiased(epsilon float64) *Stream { + Æ’ := func(s *stream, r float64) float64 { + return 2 * epsilon * r + } + return newStream(Æ’) +} + +// NewHighBiased returns an initialized Stream for high-biased quantiles +// (e.g. 0.01, 0.1, 0.5) where the needed quantiles are not known a priori, but +// error guarantees can still be given even for the higher ranks of the data +// distribution. +// +// The provided epsilon is a relative error, i.e. the true quantile of a value +// returned by a query is guaranteed to be within 1-(1±Epsilon)*(1-Quantile). +// +// See http://www.cs.rutgers.edu/~muthu/bquant.pdf for time, space, and error +// properties. +func NewHighBiased(epsilon float64) *Stream { + Æ’ := func(s *stream, r float64) float64 { + return 2 * epsilon * (s.n - r) + } + return newStream(Æ’) +} + +// NewTargeted returns an initialized Stream concerned with a particular set of +// quantile values that are supplied a priori. Knowing these a priori reduces +// space and computation time. The targets map maps the desired quantiles to +// their absolute errors, i.e. the true quantile of a value returned by a query +// is guaranteed to be within (Quantile±Epsilon). +// +// See http://www.cs.rutgers.edu/~muthu/bquant.pdf for time, space, and error properties. +func NewTargeted(targetMap map[float64]float64) *Stream { + // Convert map to slice to avoid slow iterations on a map. + // Æ’ is called on the hot path, so converting the map to a slice + // beforehand results in significant CPU savings. + targets := targetMapToSlice(targetMap) + + Æ’ := func(s *stream, r float64) float64 { + var m = math.MaxFloat64 + var f float64 + for _, t := range targets { + if t.quantile*s.n <= r { + f = (2 * t.epsilon * r) / t.quantile + } else { + f = (2 * t.epsilon * (s.n - r)) / (1 - t.quantile) + } + if f < m { + m = f + } + } + return m + } + return newStream(Æ’) +} + +type target struct { + quantile float64 + epsilon float64 +} + +func targetMapToSlice(targetMap map[float64]float64) []target { + targets := make([]target, 0, len(targetMap)) + + for quantile, epsilon := range targetMap { + t := target{ + quantile: quantile, + epsilon: epsilon, + } + targets = append(targets, t) + } + + return targets +} + +// Stream computes quantiles for a stream of float64s. It is not thread-safe by +// design. Take care when using across multiple goroutines. +type Stream struct { + *stream + b Samples + sorted bool +} + +func newStream(Æ’ invariant) *Stream { + x := &stream{Æ’: Æ’} + return &Stream{x, make(Samples, 0, 500), true} +} + +// Insert inserts v into the stream. +func (s *Stream) Insert(v float64) { + s.insert(Sample{Value: v, Width: 1}) +} + +func (s *Stream) insert(sample Sample) { + s.b = append(s.b, sample) + s.sorted = false + if len(s.b) == cap(s.b) { + s.flush() + } +} + +// Query returns the computed qth percentiles value. If s was created with +// NewTargeted, and q is not in the set of quantiles provided a priori, Query +// will return an unspecified result. +func (s *Stream) Query(q float64) float64 { + if !s.flushed() { + // Fast path when there hasn't been enough data for a flush; + // this also yields better accuracy for small sets of data. + l := len(s.b) + if l == 0 { + return 0 + } + i := int(math.Ceil(float64(l) * q)) + if i > 0 { + i -= 1 + } + s.maybeSort() + return s.b[i].Value + } + s.flush() + return s.stream.query(q) +} + +// Merge merges samples into the underlying streams samples. This is handy when +// merging multiple streams from separate threads, database shards, etc. +// +// ATTENTION: This method is broken and does not yield correct results. The +// underlying algorithm is not capable of merging streams correctly. +func (s *Stream) Merge(samples Samples) { + sort.Sort(samples) + s.stream.merge(samples) +} + +// Reset reinitializes and clears the list reusing the samples buffer memory. +func (s *Stream) Reset() { + s.stream.reset() + s.b = s.b[:0] +} + +// Samples returns stream samples held by s. +func (s *Stream) Samples() Samples { + if !s.flushed() { + return s.b + } + s.flush() + return s.stream.samples() +} + +// Count returns the total number of samples observed in the stream +// since initialization. +func (s *Stream) Count() int { + return len(s.b) + s.stream.count() +} + +func (s *Stream) flush() { + s.maybeSort() + s.stream.merge(s.b) + s.b = s.b[:0] +} + +func (s *Stream) maybeSort() { + if !s.sorted { + s.sorted = true + sort.Sort(s.b) + } +} + +func (s *Stream) flushed() bool { + return len(s.stream.l) > 0 +} + +type stream struct { + n float64 + l []Sample + Æ’ invariant +} + +func (s *stream) reset() { + s.l = s.l[:0] + s.n = 0 +} + +func (s *stream) insert(v float64) { + s.merge(Samples{{v, 1, 0}}) +} + +func (s *stream) merge(samples Samples) { + // TODO(beorn7): This tries to merge not only individual samples, but + // whole summaries. The paper doesn't mention merging summaries at + // all. Unittests show that the merging is inaccurate. Find out how to + // do merges properly. + var r float64 + i := 0 + for _, sample := range samples { + for ; i < len(s.l); i++ { + c := s.l[i] + if c.Value > sample.Value { + // Insert at position i. + s.l = append(s.l, Sample{}) + copy(s.l[i+1:], s.l[i:]) + s.l[i] = Sample{ + sample.Value, + sample.Width, + math.Max(sample.Delta, math.Floor(s.Æ’(s, r))-1), + // TODO(beorn7): How to calculate delta correctly? + } + i++ + goto inserted + } + r += c.Width + } + s.l = append(s.l, Sample{sample.Value, sample.Width, 0}) + i++ + inserted: + s.n += sample.Width + r += sample.Width + } + s.compress() +} + +func (s *stream) count() int { + return int(s.n) +} + +func (s *stream) query(q float64) float64 { + t := math.Ceil(q * s.n) + t += math.Ceil(s.Æ’(s, t) / 2) + p := s.l[0] + var r float64 + for _, c := range s.l[1:] { + r += p.Width + if r+c.Width+c.Delta > t { + return p.Value + } + p = c + } + return p.Value +} + +func (s *stream) compress() { + if len(s.l) < 2 { + return + } + x := s.l[len(s.l)-1] + xi := len(s.l) - 1 + r := s.n - 1 - x.Width + + for i := len(s.l) - 2; i >= 0; i-- { + c := s.l[i] + if c.Width+x.Width+x.Delta <= s.Æ’(s, r) { + x.Width += c.Width + s.l[xi] = x + // Remove element at i. + copy(s.l[i:], s.l[i+1:]) + s.l = s.l[:len(s.l)-1] + xi -= 1 + } else { + x = c + xi = i + } + r -= c.Width + } +} + +func (s *stream) samples() Samples { + samples := make(Samples, len(s.l)) + copy(samples, s.l) + return samples +} diff --git a/vendor/github.com/blang/semver/.travis.yml b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/blang/semver/.travis.yml similarity index 79% rename from vendor/github.com/blang/semver/.travis.yml rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/blang/semver/.travis.yml index 7319bdea..102fb9a6 100644 --- a/vendor/github.com/blang/semver/.travis.yml +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/blang/semver/.travis.yml @@ -1,14 +1,10 @@ language: go matrix: include: - - go: 1.4.x - - go: 1.5.x - - go: 1.6.x - - go: 1.7.x - - go: 1.8.x - - go: 1.9.x - - go: 1.10.x - - go: 1.11.x + - go: 1.4.3 + - go: 1.5.4 + - go: 1.6.3 + - go: 1.7 - go: tip allow_failures: - go: tip @@ -17,7 +13,7 @@ install: - go get github.com/mattn/goveralls script: - echo "Test and track coverage" ; $HOME/gopath/bin/goveralls -package "." -service=travis-ci - -repotoken=$COVERALLS_TOKEN + -repotoken $COVERALLS_TOKEN - echo "Build examples" ; cd examples && go build - echo "Check if gofmt'd" ; diff -u <(echo -n) <(gofmt -d -s .) env: diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/blang/semver/LICENSE b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/blang/semver/LICENSE new file mode 100644 index 00000000..5ba5c86f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/blang/semver/LICENSE @@ -0,0 +1,22 @@ +The MIT License + +Copyright (c) 2014 Benedikt Lang + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + diff --git a/vendor/github.com/blang/semver/README.md b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/blang/semver/README.md similarity index 94% rename from vendor/github.com/blang/semver/README.md rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/blang/semver/README.md index e05f9865..08b2e4a3 100644 --- a/vendor/github.com/blang/semver/README.md +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/blang/semver/README.md @@ -1,4 +1,4 @@ -semver for golang [![Build Status](https://travis-ci.org/blang/semver.svg?branch=master)](https://travis-ci.org/blang/semver) [![GoDoc](https://godoc.org/github.com/blang/semver?status.svg)](https://godoc.org/github.com/blang/semver) [![Coverage Status](https://img.shields.io/coveralls/blang/semver.svg)](https://coveralls.io/r/blang/semver?branch=master) [![Go Report Card](https://goreportcard.com/badge/github.com/blang/semver)](https://goreportcard.com/report/github.com/blang/semver) +semver for golang [![Build Status](https://travis-ci.org/blang/semver.svg?branch=master)](https://travis-ci.org/blang/semver) [![GoDoc](https://godoc.org/github.com/blang/semver?status.png)](https://godoc.org/github.com/blang/semver) [![Coverage Status](https://img.shields.io/coveralls/blang/semver.svg)](https://coveralls.io/r/blang/semver?branch=master) ====== semver is a [Semantic Versioning](http://semver.org/) library written in golang. It fully covers spec version `2.0.0`. @@ -83,8 +83,8 @@ Range usage: ``` v, err := semver.Parse("1.2.3") -expectedRange, err := semver.ParseRange(">1.0.0 <2.0.0 || >=3.0.0") -if expectedRange(v) { +range, err := semver.ParseRange(">1.0.0 <2.0.0 || >=3.0.0") +if range(v) { //valid } diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/blang/semver/json.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/blang/semver/json.go new file mode 100644 index 00000000..a74bf7c4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/blang/semver/json.go @@ -0,0 +1,23 @@ +package semver + +import ( + "encoding/json" +) + +// MarshalJSON implements the encoding/json.Marshaler interface. +func (v Version) MarshalJSON() ([]byte, error) { + return json.Marshal(v.String()) +} + +// UnmarshalJSON implements the encoding/json.Unmarshaler interface. +func (v *Version) UnmarshalJSON(data []byte) (err error) { + var versionString string + + if err = json.Unmarshal(data, &versionString); err != nil { + return + } + + *v, err = Parse(versionString) + + return +} diff --git a/vendor/github.com/blang/semver/package.json b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/blang/semver/package.json similarity index 100% rename from vendor/github.com/blang/semver/package.json rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/blang/semver/package.json diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/blang/semver/range.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/blang/semver/range.go new file mode 100644 index 00000000..fca406d4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/blang/semver/range.go @@ -0,0 +1,416 @@ +package semver + +import ( + "fmt" + "strconv" + "strings" + "unicode" +) + +type wildcardType int + +const ( + noneWildcard wildcardType = iota + majorWildcard wildcardType = 1 + minorWildcard wildcardType = 2 + patchWildcard wildcardType = 3 +) + +func wildcardTypefromInt(i int) wildcardType { + switch i { + case 1: + return majorWildcard + case 2: + return minorWildcard + case 3: + return patchWildcard + default: + return noneWildcard + } +} + +type comparator func(Version, Version) bool + +var ( + compEQ comparator = func(v1 Version, v2 Version) bool { + return v1.Compare(v2) == 0 + } + compNE = func(v1 Version, v2 Version) bool { + return v1.Compare(v2) != 0 + } + compGT = func(v1 Version, v2 Version) bool { + return v1.Compare(v2) == 1 + } + compGE = func(v1 Version, v2 Version) bool { + return v1.Compare(v2) >= 0 + } + compLT = func(v1 Version, v2 Version) bool { + return v1.Compare(v2) == -1 + } + compLE = func(v1 Version, v2 Version) bool { + return v1.Compare(v2) <= 0 + } +) + +type versionRange struct { + v Version + c comparator +} + +// rangeFunc creates a Range from the given versionRange. +func (vr *versionRange) rangeFunc() Range { + return Range(func(v Version) bool { + return vr.c(v, vr.v) + }) +} + +// Range represents a range of versions. +// A Range can be used to check if a Version satisfies it: +// +// range, err := semver.ParseRange(">1.0.0 <2.0.0") +// range(semver.MustParse("1.1.1") // returns true +type Range func(Version) bool + +// OR combines the existing Range with another Range using logical OR. +func (rf Range) OR(f Range) Range { + return Range(func(v Version) bool { + return rf(v) || f(v) + }) +} + +// AND combines the existing Range with another Range using logical AND. +func (rf Range) AND(f Range) Range { + return Range(func(v Version) bool { + return rf(v) && f(v) + }) +} + +// ParseRange parses a range and returns a Range. +// If the range could not be parsed an error is returned. +// +// Valid ranges are: +// - "<1.0.0" +// - "<=1.0.0" +// - ">1.0.0" +// - ">=1.0.0" +// - "1.0.0", "=1.0.0", "==1.0.0" +// - "!1.0.0", "!=1.0.0" +// +// A Range can consist of multiple ranges separated by space: +// Ranges can be linked by logical AND: +// - ">1.0.0 <2.0.0" would match between both ranges, so "1.1.1" and "1.8.7" but not "1.0.0" or "2.0.0" +// - ">1.0.0 <3.0.0 !2.0.3-beta.2" would match every version between 1.0.0 and 3.0.0 except 2.0.3-beta.2 +// +// Ranges can also be linked by logical OR: +// - "<2.0.0 || >=3.0.0" would match "1.x.x" and "3.x.x" but not "2.x.x" +// +// AND has a higher precedence than OR. It's not possible to use brackets. +// +// Ranges can be combined by both AND and OR +// +// - `>1.0.0 <2.0.0 || >3.0.0 !4.2.1` would match `1.2.3`, `1.9.9`, `3.1.1`, but not `4.2.1`, `2.1.1` +func ParseRange(s string) (Range, error) { + parts := splitAndTrim(s) + orParts, err := splitORParts(parts) + if err != nil { + return nil, err + } + expandedParts, err := expandWildcardVersion(orParts) + if err != nil { + return nil, err + } + var orFn Range + for _, p := range expandedParts { + var andFn Range + for _, ap := range p { + opStr, vStr, err := splitComparatorVersion(ap) + if err != nil { + return nil, err + } + vr, err := buildVersionRange(opStr, vStr) + if err != nil { + return nil, fmt.Errorf("Could not parse Range %q: %s", ap, err) + } + rf := vr.rangeFunc() + + // Set function + if andFn == nil { + andFn = rf + } else { // Combine with existing function + andFn = andFn.AND(rf) + } + } + if orFn == nil { + orFn = andFn + } else { + orFn = orFn.OR(andFn) + } + + } + return orFn, nil +} + +// splitORParts splits the already cleaned parts by '||'. +// Checks for invalid positions of the operator and returns an +// error if found. +func splitORParts(parts []string) ([][]string, error) { + var ORparts [][]string + last := 0 + for i, p := range parts { + if p == "||" { + if i == 0 { + return nil, fmt.Errorf("First element in range is '||'") + } + ORparts = append(ORparts, parts[last:i]) + last = i + 1 + } + } + if last == len(parts) { + return nil, fmt.Errorf("Last element in range is '||'") + } + ORparts = append(ORparts, parts[last:]) + return ORparts, nil +} + +// buildVersionRange takes a slice of 2: operator and version +// and builds a versionRange, otherwise an error. +func buildVersionRange(opStr, vStr string) (*versionRange, error) { + c := parseComparator(opStr) + if c == nil { + return nil, fmt.Errorf("Could not parse comparator %q in %q", opStr, strings.Join([]string{opStr, vStr}, "")) + } + v, err := Parse(vStr) + if err != nil { + return nil, fmt.Errorf("Could not parse version %q in %q: %s", vStr, strings.Join([]string{opStr, vStr}, ""), err) + } + + return &versionRange{ + v: v, + c: c, + }, nil + +} + +// inArray checks if a byte is contained in an array of bytes +func inArray(s byte, list []byte) bool { + for _, el := range list { + if el == s { + return true + } + } + return false +} + +// splitAndTrim splits a range string by spaces and cleans whitespaces +func splitAndTrim(s string) (result []string) { + last := 0 + var lastChar byte + excludeFromSplit := []byte{'>', '<', '='} + for i := 0; i < len(s); i++ { + if s[i] == ' ' && !inArray(lastChar, excludeFromSplit) { + if last < i-1 { + result = append(result, s[last:i]) + } + last = i + 1 + } else if s[i] != ' ' { + lastChar = s[i] + } + } + if last < len(s)-1 { + result = append(result, s[last:]) + } + + for i, v := range result { + result[i] = strings.Replace(v, " ", "", -1) + } + + // parts := strings.Split(s, " ") + // for _, x := range parts { + // if s := strings.TrimSpace(x); len(s) != 0 { + // result = append(result, s) + // } + // } + return +} + +// splitComparatorVersion splits the comparator from the version. +// Input must be free of leading or trailing spaces. +func splitComparatorVersion(s string) (string, string, error) { + i := strings.IndexFunc(s, unicode.IsDigit) + if i == -1 { + return "", "", fmt.Errorf("Could not get version from string: %q", s) + } + return strings.TrimSpace(s[0:i]), s[i:], nil +} + +// getWildcardType will return the type of wildcard that the +// passed version contains +func getWildcardType(vStr string) wildcardType { + parts := strings.Split(vStr, ".") + nparts := len(parts) + wildcard := parts[nparts-1] + + possibleWildcardType := wildcardTypefromInt(nparts) + if wildcard == "x" { + return possibleWildcardType + } + + return noneWildcard +} + +// createVersionFromWildcard will convert a wildcard version +// into a regular version, replacing 'x's with '0's, handling +// special cases like '1.x.x' and '1.x' +func createVersionFromWildcard(vStr string) string { + // handle 1.x.x + vStr2 := strings.Replace(vStr, ".x.x", ".x", 1) + vStr2 = strings.Replace(vStr2, ".x", ".0", 1) + parts := strings.Split(vStr2, ".") + + // handle 1.x + if len(parts) == 2 { + return vStr2 + ".0" + } + + return vStr2 +} + +// incrementMajorVersion will increment the major version +// of the passed version +func incrementMajorVersion(vStr string) (string, error) { + parts := strings.Split(vStr, ".") + i, err := strconv.Atoi(parts[0]) + if err != nil { + return "", err + } + parts[0] = strconv.Itoa(i + 1) + + return strings.Join(parts, "."), nil +} + +// incrementMajorVersion will increment the minor version +// of the passed version +func incrementMinorVersion(vStr string) (string, error) { + parts := strings.Split(vStr, ".") + i, err := strconv.Atoi(parts[1]) + if err != nil { + return "", err + } + parts[1] = strconv.Itoa(i + 1) + + return strings.Join(parts, "."), nil +} + +// expandWildcardVersion will expand wildcards inside versions +// following these rules: +// +// * when dealing with patch wildcards: +// >= 1.2.x will become >= 1.2.0 +// <= 1.2.x will become < 1.3.0 +// > 1.2.x will become >= 1.3.0 +// < 1.2.x will become < 1.2.0 +// != 1.2.x will become < 1.2.0 >= 1.3.0 +// +// * when dealing with minor wildcards: +// >= 1.x will become >= 1.0.0 +// <= 1.x will become < 2.0.0 +// > 1.x will become >= 2.0.0 +// < 1.0 will become < 1.0.0 +// != 1.x will become < 1.0.0 >= 2.0.0 +// +// * when dealing with wildcards without +// version operator: +// 1.2.x will become >= 1.2.0 < 1.3.0 +// 1.x will become >= 1.0.0 < 2.0.0 +func expandWildcardVersion(parts [][]string) ([][]string, error) { + var expandedParts [][]string + for _, p := range parts { + var newParts []string + for _, ap := range p { + if strings.Index(ap, "x") != -1 { + opStr, vStr, err := splitComparatorVersion(ap) + if err != nil { + return nil, err + } + + versionWildcardType := getWildcardType(vStr) + flatVersion := createVersionFromWildcard(vStr) + + var resultOperator string + var shouldIncrementVersion bool + switch opStr { + case ">": + resultOperator = ">=" + shouldIncrementVersion = true + case ">=": + resultOperator = ">=" + case "<": + resultOperator = "<" + case "<=": + resultOperator = "<" + shouldIncrementVersion = true + case "", "=", "==": + newParts = append(newParts, ">="+flatVersion) + resultOperator = "<" + shouldIncrementVersion = true + case "!=", "!": + newParts = append(newParts, "<"+flatVersion) + resultOperator = ">=" + shouldIncrementVersion = true + } + + var resultVersion string + if shouldIncrementVersion { + switch versionWildcardType { + case patchWildcard: + resultVersion, _ = incrementMinorVersion(flatVersion) + case minorWildcard: + resultVersion, _ = incrementMajorVersion(flatVersion) + } + } else { + resultVersion = flatVersion + } + + ap = resultOperator + resultVersion + } + newParts = append(newParts, ap) + } + expandedParts = append(expandedParts, newParts) + } + + return expandedParts, nil +} + +func parseComparator(s string) comparator { + switch s { + case "==": + fallthrough + case "": + fallthrough + case "=": + return compEQ + case ">": + return compGT + case ">=": + return compGE + case "<": + return compLT + case "<=": + return compLE + case "!": + fallthrough + case "!=": + return compNE + } + + return nil +} + +// MustParseRange is like ParseRange but panics if the range cannot be parsed. +func MustParseRange(s string) Range { + r, err := ParseRange(s) + if err != nil { + panic(`semver: ParseRange(` + s + `): ` + err.Error()) + } + return r +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/blang/semver/semver.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/blang/semver/semver.go new file mode 100644 index 00000000..8ee0842e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/blang/semver/semver.go @@ -0,0 +1,418 @@ +package semver + +import ( + "errors" + "fmt" + "strconv" + "strings" +) + +const ( + numbers string = "0123456789" + alphas = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-" + alphanum = alphas + numbers +) + +// SpecVersion is the latest fully supported spec version of semver +var SpecVersion = Version{ + Major: 2, + Minor: 0, + Patch: 0, +} + +// Version represents a semver compatible version +type Version struct { + Major uint64 + Minor uint64 + Patch uint64 + Pre []PRVersion + Build []string //No Precendence +} + +// Version to string +func (v Version) String() string { + b := make([]byte, 0, 5) + b = strconv.AppendUint(b, v.Major, 10) + b = append(b, '.') + b = strconv.AppendUint(b, v.Minor, 10) + b = append(b, '.') + b = strconv.AppendUint(b, v.Patch, 10) + + if len(v.Pre) > 0 { + b = append(b, '-') + b = append(b, v.Pre[0].String()...) + + for _, pre := range v.Pre[1:] { + b = append(b, '.') + b = append(b, pre.String()...) + } + } + + if len(v.Build) > 0 { + b = append(b, '+') + b = append(b, v.Build[0]...) + + for _, build := range v.Build[1:] { + b = append(b, '.') + b = append(b, build...) + } + } + + return string(b) +} + +// Equals checks if v is equal to o. +func (v Version) Equals(o Version) bool { + return (v.Compare(o) == 0) +} + +// EQ checks if v is equal to o. +func (v Version) EQ(o Version) bool { + return (v.Compare(o) == 0) +} + +// NE checks if v is not equal to o. +func (v Version) NE(o Version) bool { + return (v.Compare(o) != 0) +} + +// GT checks if v is greater than o. +func (v Version) GT(o Version) bool { + return (v.Compare(o) == 1) +} + +// GTE checks if v is greater than or equal to o. +func (v Version) GTE(o Version) bool { + return (v.Compare(o) >= 0) +} + +// GE checks if v is greater than or equal to o. +func (v Version) GE(o Version) bool { + return (v.Compare(o) >= 0) +} + +// LT checks if v is less than o. +func (v Version) LT(o Version) bool { + return (v.Compare(o) == -1) +} + +// LTE checks if v is less than or equal to o. +func (v Version) LTE(o Version) bool { + return (v.Compare(o) <= 0) +} + +// LE checks if v is less than or equal to o. +func (v Version) LE(o Version) bool { + return (v.Compare(o) <= 0) +} + +// Compare compares Versions v to o: +// -1 == v is less than o +// 0 == v is equal to o +// 1 == v is greater than o +func (v Version) Compare(o Version) int { + if v.Major != o.Major { + if v.Major > o.Major { + return 1 + } + return -1 + } + if v.Minor != o.Minor { + if v.Minor > o.Minor { + return 1 + } + return -1 + } + if v.Patch != o.Patch { + if v.Patch > o.Patch { + return 1 + } + return -1 + } + + // Quick comparison if a version has no prerelease versions + if len(v.Pre) == 0 && len(o.Pre) == 0 { + return 0 + } else if len(v.Pre) == 0 && len(o.Pre) > 0 { + return 1 + } else if len(v.Pre) > 0 && len(o.Pre) == 0 { + return -1 + } + + i := 0 + for ; i < len(v.Pre) && i < len(o.Pre); i++ { + if comp := v.Pre[i].Compare(o.Pre[i]); comp == 0 { + continue + } else if comp == 1 { + return 1 + } else { + return -1 + } + } + + // If all pr versions are the equal but one has further prversion, this one greater + if i == len(v.Pre) && i == len(o.Pre) { + return 0 + } else if i == len(v.Pre) && i < len(o.Pre) { + return -1 + } else { + return 1 + } + +} + +// Validate validates v and returns error in case +func (v Version) Validate() error { + // Major, Minor, Patch already validated using uint64 + + for _, pre := range v.Pre { + if !pre.IsNum { //Numeric prerelease versions already uint64 + if len(pre.VersionStr) == 0 { + return fmt.Errorf("Prerelease can not be empty %q", pre.VersionStr) + } + if !containsOnly(pre.VersionStr, alphanum) { + return fmt.Errorf("Invalid character(s) found in prerelease %q", pre.VersionStr) + } + } + } + + for _, build := range v.Build { + if len(build) == 0 { + return fmt.Errorf("Build meta data can not be empty %q", build) + } + if !containsOnly(build, alphanum) { + return fmt.Errorf("Invalid character(s) found in build meta data %q", build) + } + } + + return nil +} + +// New is an alias for Parse and returns a pointer, parses version string and returns a validated Version or error +func New(s string) (vp *Version, err error) { + v, err := Parse(s) + vp = &v + return +} + +// Make is an alias for Parse, parses version string and returns a validated Version or error +func Make(s string) (Version, error) { + return Parse(s) +} + +// ParseTolerant allows for certain version specifications that do not strictly adhere to semver +// specs to be parsed by this library. It does so by normalizing versions before passing them to +// Parse(). It currently trims spaces, removes a "v" prefix, and adds a 0 patch number to versions +// with only major and minor components specified +func ParseTolerant(s string) (Version, error) { + s = strings.TrimSpace(s) + s = strings.TrimPrefix(s, "v") + + // Split into major.minor.(patch+pr+meta) + parts := strings.SplitN(s, ".", 3) + if len(parts) < 3 { + if strings.ContainsAny(parts[len(parts)-1], "+-") { + return Version{}, errors.New("Short version cannot contain PreRelease/Build meta data") + } + for len(parts) < 3 { + parts = append(parts, "0") + } + s = strings.Join(parts, ".") + } + + return Parse(s) +} + +// Parse parses version string and returns a validated Version or error +func Parse(s string) (Version, error) { + if len(s) == 0 { + return Version{}, errors.New("Version string empty") + } + + // Split into major.minor.(patch+pr+meta) + parts := strings.SplitN(s, ".", 3) + if len(parts) != 3 { + return Version{}, errors.New("No Major.Minor.Patch elements found") + } + + // Major + if !containsOnly(parts[0], numbers) { + return Version{}, fmt.Errorf("Invalid character(s) found in major number %q", parts[0]) + } + if hasLeadingZeroes(parts[0]) { + return Version{}, fmt.Errorf("Major number must not contain leading zeroes %q", parts[0]) + } + major, err := strconv.ParseUint(parts[0], 10, 64) + if err != nil { + return Version{}, err + } + + // Minor + if !containsOnly(parts[1], numbers) { + return Version{}, fmt.Errorf("Invalid character(s) found in minor number %q", parts[1]) + } + if hasLeadingZeroes(parts[1]) { + return Version{}, fmt.Errorf("Minor number must not contain leading zeroes %q", parts[1]) + } + minor, err := strconv.ParseUint(parts[1], 10, 64) + if err != nil { + return Version{}, err + } + + v := Version{} + v.Major = major + v.Minor = minor + + var build, prerelease []string + patchStr := parts[2] + + if buildIndex := strings.IndexRune(patchStr, '+'); buildIndex != -1 { + build = strings.Split(patchStr[buildIndex+1:], ".") + patchStr = patchStr[:buildIndex] + } + + if preIndex := strings.IndexRune(patchStr, '-'); preIndex != -1 { + prerelease = strings.Split(patchStr[preIndex+1:], ".") + patchStr = patchStr[:preIndex] + } + + if !containsOnly(patchStr, numbers) { + return Version{}, fmt.Errorf("Invalid character(s) found in patch number %q", patchStr) + } + if hasLeadingZeroes(patchStr) { + return Version{}, fmt.Errorf("Patch number must not contain leading zeroes %q", patchStr) + } + patch, err := strconv.ParseUint(patchStr, 10, 64) + if err != nil { + return Version{}, err + } + + v.Patch = patch + + // Prerelease + for _, prstr := range prerelease { + parsedPR, err := NewPRVersion(prstr) + if err != nil { + return Version{}, err + } + v.Pre = append(v.Pre, parsedPR) + } + + // Build meta data + for _, str := range build { + if len(str) == 0 { + return Version{}, errors.New("Build meta data is empty") + } + if !containsOnly(str, alphanum) { + return Version{}, fmt.Errorf("Invalid character(s) found in build meta data %q", str) + } + v.Build = append(v.Build, str) + } + + return v, nil +} + +// MustParse is like Parse but panics if the version cannot be parsed. +func MustParse(s string) Version { + v, err := Parse(s) + if err != nil { + panic(`semver: Parse(` + s + `): ` + err.Error()) + } + return v +} + +// PRVersion represents a PreRelease Version +type PRVersion struct { + VersionStr string + VersionNum uint64 + IsNum bool +} + +// NewPRVersion creates a new valid prerelease version +func NewPRVersion(s string) (PRVersion, error) { + if len(s) == 0 { + return PRVersion{}, errors.New("Prerelease is empty") + } + v := PRVersion{} + if containsOnly(s, numbers) { + if hasLeadingZeroes(s) { + return PRVersion{}, fmt.Errorf("Numeric PreRelease version must not contain leading zeroes %q", s) + } + num, err := strconv.ParseUint(s, 10, 64) + + // Might never be hit, but just in case + if err != nil { + return PRVersion{}, err + } + v.VersionNum = num + v.IsNum = true + } else if containsOnly(s, alphanum) { + v.VersionStr = s + v.IsNum = false + } else { + return PRVersion{}, fmt.Errorf("Invalid character(s) found in prerelease %q", s) + } + return v, nil +} + +// IsNumeric checks if prerelease-version is numeric +func (v PRVersion) IsNumeric() bool { + return v.IsNum +} + +// Compare compares two PreRelease Versions v and o: +// -1 == v is less than o +// 0 == v is equal to o +// 1 == v is greater than o +func (v PRVersion) Compare(o PRVersion) int { + if v.IsNum && !o.IsNum { + return -1 + } else if !v.IsNum && o.IsNum { + return 1 + } else if v.IsNum && o.IsNum { + if v.VersionNum == o.VersionNum { + return 0 + } else if v.VersionNum > o.VersionNum { + return 1 + } else { + return -1 + } + } else { // both are Alphas + if v.VersionStr == o.VersionStr { + return 0 + } else if v.VersionStr > o.VersionStr { + return 1 + } else { + return -1 + } + } +} + +// PreRelease version to string +func (v PRVersion) String() string { + if v.IsNum { + return strconv.FormatUint(v.VersionNum, 10) + } + return v.VersionStr +} + +func containsOnly(s string, set string) bool { + return strings.IndexFunc(s, func(r rune) bool { + return !strings.ContainsRune(set, r) + }) == -1 +} + +func hasLeadingZeroes(s string) bool { + return len(s) > 1 && s[0] == '0' +} + +// NewBuildVersion creates a new valid build version +func NewBuildVersion(s string) (string, error) { + if len(s) == 0 { + return "", errors.New("Buildversion is empty") + } + if !containsOnly(s, alphanum) { + return "", fmt.Errorf("Invalid character(s) found in build meta data %q", s) + } + return s, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/blang/semver/sort.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/blang/semver/sort.go new file mode 100644 index 00000000..e18f8808 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/blang/semver/sort.go @@ -0,0 +1,28 @@ +package semver + +import ( + "sort" +) + +// Versions represents multiple versions. +type Versions []Version + +// Len returns length of version collection +func (s Versions) Len() int { + return len(s) +} + +// Swap swaps two versions inside the collection by its indices +func (s Versions) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +// Less checks if version at index i is less than version at index j +func (s Versions) Less(i, j int) bool { + return s[i].LT(s[j]) +} + +// Sort sorts a slice of versions +func Sort(versions []Version) { + sort.Sort(Versions(versions)) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/blang/semver/sql.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/blang/semver/sql.go new file mode 100644 index 00000000..eb4d8026 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/blang/semver/sql.go @@ -0,0 +1,30 @@ +package semver + +import ( + "database/sql/driver" + "fmt" +) + +// Scan implements the database/sql.Scanner interface. +func (v *Version) Scan(src interface{}) (err error) { + var str string + switch src := src.(type) { + case string: + str = src + case []byte: + str = string(src) + default: + return fmt.Errorf("Version.Scan: cannot convert %T to string.", src) + } + + if t, err := Parse(str); err == nil { + *v = t + } + + return +} + +// Value implements the database/sql/driver.Valuer interface. +func (v Version) Value() (driver.Value, error) { + return v.String(), nil +} diff --git a/vendor/github.com/boltdb/bolt/.gitignore b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/.gitignore similarity index 100% rename from vendor/github.com/boltdb/bolt/.gitignore rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/.gitignore diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/LICENSE b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/LICENSE new file mode 100644 index 00000000..004e77fe --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2013 Ben Johnson + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/boltdb/bolt/Makefile b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/Makefile similarity index 100% rename from vendor/github.com/boltdb/bolt/Makefile rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/Makefile diff --git a/vendor/github.com/boltdb/bolt/README.md b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/README.md similarity index 100% rename from vendor/github.com/boltdb/bolt/README.md rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/README.md diff --git a/vendor/github.com/boltdb/bolt/appveyor.yml b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/appveyor.yml similarity index 100% rename from vendor/github.com/boltdb/bolt/appveyor.yml rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/appveyor.yml diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/bolt_386.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/bolt_386.go new file mode 100644 index 00000000..820d533c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/bolt_386.go @@ -0,0 +1,10 @@ +package bolt + +// maxMapSize represents the largest mmap size supported by Bolt. +const maxMapSize = 0x7FFFFFFF // 2GB + +// maxAllocSize is the size used when creating array pointers. +const maxAllocSize = 0xFFFFFFF + +// Are unaligned load/stores broken on this arch? +var brokenUnaligned = false diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/bolt_amd64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/bolt_amd64.go new file mode 100644 index 00000000..98fafdb4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/bolt_amd64.go @@ -0,0 +1,10 @@ +package bolt + +// maxMapSize represents the largest mmap size supported by Bolt. +const maxMapSize = 0xFFFFFFFFFFFF // 256TB + +// maxAllocSize is the size used when creating array pointers. +const maxAllocSize = 0x7FFFFFFF + +// Are unaligned load/stores broken on this arch? +var brokenUnaligned = false diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/bolt_arm.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/bolt_arm.go new file mode 100644 index 00000000..7e5cb4b9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/bolt_arm.go @@ -0,0 +1,28 @@ +package bolt + +import "unsafe" + +// maxMapSize represents the largest mmap size supported by Bolt. +const maxMapSize = 0x7FFFFFFF // 2GB + +// maxAllocSize is the size used when creating array pointers. +const maxAllocSize = 0xFFFFFFF + +// Are unaligned load/stores broken on this arch? +var brokenUnaligned bool + +func init() { + // Simple check to see whether this arch handles unaligned load/stores + // correctly. + + // ARM9 and older devices require load/stores to be from/to aligned + // addresses. If not, the lower 2 bits are cleared and that address is + // read in a jumbled up order. + + // See http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka15414.html + + raw := [6]byte{0xfe, 0xef, 0x11, 0x22, 0x22, 0x11} + val := *(*uint32)(unsafe.Pointer(uintptr(unsafe.Pointer(&raw)) + 2)) + + brokenUnaligned = val != 0x11222211 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/bolt_arm64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/bolt_arm64.go new file mode 100644 index 00000000..b26d84f9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/bolt_arm64.go @@ -0,0 +1,12 @@ +// +build arm64 + +package bolt + +// maxMapSize represents the largest mmap size supported by Bolt. +const maxMapSize = 0xFFFFFFFFFFFF // 256TB + +// maxAllocSize is the size used when creating array pointers. +const maxAllocSize = 0x7FFFFFFF + +// Are unaligned load/stores broken on this arch? +var brokenUnaligned = false diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/bolt_linux.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/bolt_linux.go new file mode 100644 index 00000000..2b676661 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/bolt_linux.go @@ -0,0 +1,10 @@ +package bolt + +import ( + "syscall" +) + +// fdatasync flushes written data to a file descriptor. +func fdatasync(db *DB) error { + return syscall.Fdatasync(int(db.file.Fd())) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/bolt_openbsd.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/bolt_openbsd.go new file mode 100644 index 00000000..7058c3d7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/bolt_openbsd.go @@ -0,0 +1,27 @@ +package bolt + +import ( + "syscall" + "unsafe" +) + +const ( + msAsync = 1 << iota // perform asynchronous writes + msSync // perform synchronous writes + msInvalidate // invalidate cached data +) + +func msync(db *DB) error { + _, _, errno := syscall.Syscall(syscall.SYS_MSYNC, uintptr(unsafe.Pointer(db.data)), uintptr(db.datasz), msInvalidate) + if errno != 0 { + return errno + } + return nil +} + +func fdatasync(db *DB) error { + if db.data != nil { + return msync(db) + } + return db.file.Sync() +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/bolt_ppc.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/bolt_ppc.go new file mode 100644 index 00000000..645ddc3e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/bolt_ppc.go @@ -0,0 +1,9 @@ +// +build ppc + +package bolt + +// maxMapSize represents the largest mmap size supported by Bolt. +const maxMapSize = 0x7FFFFFFF // 2GB + +// maxAllocSize is the size used when creating array pointers. +const maxAllocSize = 0xFFFFFFF diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/bolt_ppc64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/bolt_ppc64.go new file mode 100644 index 00000000..9331d977 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/bolt_ppc64.go @@ -0,0 +1,12 @@ +// +build ppc64 + +package bolt + +// maxMapSize represents the largest mmap size supported by Bolt. +const maxMapSize = 0xFFFFFFFFFFFF // 256TB + +// maxAllocSize is the size used when creating array pointers. +const maxAllocSize = 0x7FFFFFFF + +// Are unaligned load/stores broken on this arch? +var brokenUnaligned = false diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/bolt_ppc64le.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/bolt_ppc64le.go new file mode 100644 index 00000000..8c143bc5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/bolt_ppc64le.go @@ -0,0 +1,12 @@ +// +build ppc64le + +package bolt + +// maxMapSize represents the largest mmap size supported by Bolt. +const maxMapSize = 0xFFFFFFFFFFFF // 256TB + +// maxAllocSize is the size used when creating array pointers. +const maxAllocSize = 0x7FFFFFFF + +// Are unaligned load/stores broken on this arch? +var brokenUnaligned = false diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/bolt_s390x.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/bolt_s390x.go new file mode 100644 index 00000000..d7c39af9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/bolt_s390x.go @@ -0,0 +1,12 @@ +// +build s390x + +package bolt + +// maxMapSize represents the largest mmap size supported by Bolt. +const maxMapSize = 0xFFFFFFFFFFFF // 256TB + +// maxAllocSize is the size used when creating array pointers. +const maxAllocSize = 0x7FFFFFFF + +// Are unaligned load/stores broken on this arch? +var brokenUnaligned = false diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/bolt_unix.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/bolt_unix.go new file mode 100644 index 00000000..cad62dda --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/bolt_unix.go @@ -0,0 +1,89 @@ +// +build !windows,!plan9,!solaris + +package bolt + +import ( + "fmt" + "os" + "syscall" + "time" + "unsafe" +) + +// flock acquires an advisory lock on a file descriptor. +func flock(db *DB, mode os.FileMode, exclusive bool, timeout time.Duration) error { + var t time.Time + for { + // If we're beyond our timeout then return an error. + // This can only occur after we've attempted a flock once. + if t.IsZero() { + t = time.Now() + } else if timeout > 0 && time.Since(t) > timeout { + return ErrTimeout + } + flag := syscall.LOCK_SH + if exclusive { + flag = syscall.LOCK_EX + } + + // Otherwise attempt to obtain an exclusive lock. + err := syscall.Flock(int(db.file.Fd()), flag|syscall.LOCK_NB) + if err == nil { + return nil + } else if err != syscall.EWOULDBLOCK { + return err + } + + // Wait for a bit and try again. + time.Sleep(50 * time.Millisecond) + } +} + +// funlock releases an advisory lock on a file descriptor. +func funlock(db *DB) error { + return syscall.Flock(int(db.file.Fd()), syscall.LOCK_UN) +} + +// mmap memory maps a DB's data file. +func mmap(db *DB, sz int) error { + // Map the data file to memory. + b, err := syscall.Mmap(int(db.file.Fd()), 0, sz, syscall.PROT_READ, syscall.MAP_SHARED|db.MmapFlags) + if err != nil { + return err + } + + // Advise the kernel that the mmap is accessed randomly. + if err := madvise(b, syscall.MADV_RANDOM); err != nil { + return fmt.Errorf("madvise: %s", err) + } + + // Save the original byte slice and convert to a byte array pointer. + db.dataref = b + db.data = (*[maxMapSize]byte)(unsafe.Pointer(&b[0])) + db.datasz = sz + return nil +} + +// munmap unmaps a DB's data file from memory. +func munmap(db *DB) error { + // Ignore the unmap if we have no mapped data. + if db.dataref == nil { + return nil + } + + // Unmap using the original byte slice. + err := syscall.Munmap(db.dataref) + db.dataref = nil + db.data = nil + db.datasz = 0 + return err +} + +// NOTE: This function is copied from stdlib because it is not available on darwin. +func madvise(b []byte, advice int) (err error) { + _, _, e1 := syscall.Syscall(syscall.SYS_MADVISE, uintptr(unsafe.Pointer(&b[0])), uintptr(len(b)), uintptr(advice)) + if e1 != 0 { + err = e1 + } + return +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/bolt_unix_solaris.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/bolt_unix_solaris.go new file mode 100644 index 00000000..307bf2b3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/bolt_unix_solaris.go @@ -0,0 +1,90 @@ +package bolt + +import ( + "fmt" + "os" + "syscall" + "time" + "unsafe" + + "golang.org/x/sys/unix" +) + +// flock acquires an advisory lock on a file descriptor. +func flock(db *DB, mode os.FileMode, exclusive bool, timeout time.Duration) error { + var t time.Time + for { + // If we're beyond our timeout then return an error. + // This can only occur after we've attempted a flock once. + if t.IsZero() { + t = time.Now() + } else if timeout > 0 && time.Since(t) > timeout { + return ErrTimeout + } + var lock syscall.Flock_t + lock.Start = 0 + lock.Len = 0 + lock.Pid = 0 + lock.Whence = 0 + lock.Pid = 0 + if exclusive { + lock.Type = syscall.F_WRLCK + } else { + lock.Type = syscall.F_RDLCK + } + err := syscall.FcntlFlock(db.file.Fd(), syscall.F_SETLK, &lock) + if err == nil { + return nil + } else if err != syscall.EAGAIN { + return err + } + + // Wait for a bit and try again. + time.Sleep(50 * time.Millisecond) + } +} + +// funlock releases an advisory lock on a file descriptor. +func funlock(db *DB) error { + var lock syscall.Flock_t + lock.Start = 0 + lock.Len = 0 + lock.Type = syscall.F_UNLCK + lock.Whence = 0 + return syscall.FcntlFlock(uintptr(db.file.Fd()), syscall.F_SETLK, &lock) +} + +// mmap memory maps a DB's data file. +func mmap(db *DB, sz int) error { + // Map the data file to memory. + b, err := unix.Mmap(int(db.file.Fd()), 0, sz, syscall.PROT_READ, syscall.MAP_SHARED|db.MmapFlags) + if err != nil { + return err + } + + // Advise the kernel that the mmap is accessed randomly. + if err := unix.Madvise(b, syscall.MADV_RANDOM); err != nil { + return fmt.Errorf("madvise: %s", err) + } + + // Save the original byte slice and convert to a byte array pointer. + db.dataref = b + db.data = (*[maxMapSize]byte)(unsafe.Pointer(&b[0])) + db.datasz = sz + return nil +} + +// munmap unmaps a DB's data file from memory. +func munmap(db *DB) error { + // Ignore the unmap if we have no mapped data. + if db.dataref == nil { + return nil + } + + // Unmap using the original byte slice. + err := unix.Munmap(db.dataref) + db.dataref = nil + db.data = nil + db.datasz = 0 + return err +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/bolt_windows.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/bolt_windows.go new file mode 100644 index 00000000..b00fb072 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/bolt_windows.go @@ -0,0 +1,144 @@ +package bolt + +import ( + "fmt" + "os" + "syscall" + "time" + "unsafe" +) + +// LockFileEx code derived from golang build filemutex_windows.go @ v1.5.1 +var ( + modkernel32 = syscall.NewLazyDLL("kernel32.dll") + procLockFileEx = modkernel32.NewProc("LockFileEx") + procUnlockFileEx = modkernel32.NewProc("UnlockFileEx") +) + +const ( + lockExt = ".lock" + + // see https://msdn.microsoft.com/en-us/library/windows/desktop/aa365203(v=vs.85).aspx + flagLockExclusive = 2 + flagLockFailImmediately = 1 + + // see https://msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v=vs.85).aspx + errLockViolation syscall.Errno = 0x21 +) + +func lockFileEx(h syscall.Handle, flags, reserved, locklow, lockhigh uint32, ol *syscall.Overlapped) (err error) { + r, _, err := procLockFileEx.Call(uintptr(h), uintptr(flags), uintptr(reserved), uintptr(locklow), uintptr(lockhigh), uintptr(unsafe.Pointer(ol))) + if r == 0 { + return err + } + return nil +} + +func unlockFileEx(h syscall.Handle, reserved, locklow, lockhigh uint32, ol *syscall.Overlapped) (err error) { + r, _, err := procUnlockFileEx.Call(uintptr(h), uintptr(reserved), uintptr(locklow), uintptr(lockhigh), uintptr(unsafe.Pointer(ol)), 0) + if r == 0 { + return err + } + return nil +} + +// fdatasync flushes written data to a file descriptor. +func fdatasync(db *DB) error { + return db.file.Sync() +} + +// flock acquires an advisory lock on a file descriptor. +func flock(db *DB, mode os.FileMode, exclusive bool, timeout time.Duration) error { + // Create a separate lock file on windows because a process + // cannot share an exclusive lock on the same file. This is + // needed during Tx.WriteTo(). + f, err := os.OpenFile(db.path+lockExt, os.O_CREATE, mode) + if err != nil { + return err + } + db.lockfile = f + + var t time.Time + for { + // If we're beyond our timeout then return an error. + // This can only occur after we've attempted a flock once. + if t.IsZero() { + t = time.Now() + } else if timeout > 0 && time.Since(t) > timeout { + return ErrTimeout + } + + var flag uint32 = flagLockFailImmediately + if exclusive { + flag |= flagLockExclusive + } + + err := lockFileEx(syscall.Handle(db.lockfile.Fd()), flag, 0, 1, 0, &syscall.Overlapped{}) + if err == nil { + return nil + } else if err != errLockViolation { + return err + } + + // Wait for a bit and try again. + time.Sleep(50 * time.Millisecond) + } +} + +// funlock releases an advisory lock on a file descriptor. +func funlock(db *DB) error { + err := unlockFileEx(syscall.Handle(db.lockfile.Fd()), 0, 1, 0, &syscall.Overlapped{}) + db.lockfile.Close() + os.Remove(db.path + lockExt) + return err +} + +// mmap memory maps a DB's data file. +// Based on: https://github.com/edsrzf/mmap-go +func mmap(db *DB, sz int) error { + if !db.readOnly { + // Truncate the database to the size of the mmap. + if err := db.file.Truncate(int64(sz)); err != nil { + return fmt.Errorf("truncate: %s", err) + } + } + + // Open a file mapping handle. + sizelo := uint32(sz >> 32) + sizehi := uint32(sz) & 0xffffffff + h, errno := syscall.CreateFileMapping(syscall.Handle(db.file.Fd()), nil, syscall.PAGE_READONLY, sizelo, sizehi, nil) + if h == 0 { + return os.NewSyscallError("CreateFileMapping", errno) + } + + // Create the memory map. + addr, errno := syscall.MapViewOfFile(h, syscall.FILE_MAP_READ, 0, 0, uintptr(sz)) + if addr == 0 { + return os.NewSyscallError("MapViewOfFile", errno) + } + + // Close mapping handle. + if err := syscall.CloseHandle(syscall.Handle(h)); err != nil { + return os.NewSyscallError("CloseHandle", err) + } + + // Convert to a byte array. + db.data = ((*[maxMapSize]byte)(unsafe.Pointer(addr))) + db.datasz = sz + + return nil +} + +// munmap unmaps a pointer from a file. +// Based on: https://github.com/edsrzf/mmap-go +func munmap(db *DB) error { + if db.data == nil { + return nil + } + + addr := (uintptr)(unsafe.Pointer(&db.data[0])) + if err := syscall.UnmapViewOfFile(addr); err != nil { + return os.NewSyscallError("UnmapViewOfFile", err) + } + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/boltsync_unix.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/boltsync_unix.go new file mode 100644 index 00000000..f5044252 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/boltsync_unix.go @@ -0,0 +1,8 @@ +// +build !windows,!plan9,!linux,!openbsd + +package bolt + +// fdatasync flushes written data to a file descriptor. +func fdatasync(db *DB) error { + return db.file.Sync() +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/bucket.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/bucket.go new file mode 100644 index 00000000..0c5bf274 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/bucket.go @@ -0,0 +1,777 @@ +package bolt + +import ( + "bytes" + "fmt" + "unsafe" +) + +const ( + // MaxKeySize is the maximum length of a key, in bytes. + MaxKeySize = 32768 + + // MaxValueSize is the maximum length of a value, in bytes. + MaxValueSize = (1 << 31) - 2 +) + +const ( + maxUint = ^uint(0) + minUint = 0 + maxInt = int(^uint(0) >> 1) + minInt = -maxInt - 1 +) + +const bucketHeaderSize = int(unsafe.Sizeof(bucket{})) + +const ( + minFillPercent = 0.1 + maxFillPercent = 1.0 +) + +// DefaultFillPercent is the percentage that split pages are filled. +// This value can be changed by setting Bucket.FillPercent. +const DefaultFillPercent = 0.5 + +// Bucket represents a collection of key/value pairs inside the database. +type Bucket struct { + *bucket + tx *Tx // the associated transaction + buckets map[string]*Bucket // subbucket cache + page *page // inline page reference + rootNode *node // materialized node for the root page. + nodes map[pgid]*node // node cache + + // Sets the threshold for filling nodes when they split. By default, + // the bucket will fill to 50% but it can be useful to increase this + // amount if you know that your write workloads are mostly append-only. + // + // This is non-persisted across transactions so it must be set in every Tx. + FillPercent float64 +} + +// bucket represents the on-file representation of a bucket. +// This is stored as the "value" of a bucket key. If the bucket is small enough, +// then its root page can be stored inline in the "value", after the bucket +// header. In the case of inline buckets, the "root" will be 0. +type bucket struct { + root pgid // page id of the bucket's root-level page + sequence uint64 // monotonically incrementing, used by NextSequence() +} + +// newBucket returns a new bucket associated with a transaction. +func newBucket(tx *Tx) Bucket { + var b = Bucket{tx: tx, FillPercent: DefaultFillPercent} + if tx.writable { + b.buckets = make(map[string]*Bucket) + b.nodes = make(map[pgid]*node) + } + return b +} + +// Tx returns the tx of the bucket. +func (b *Bucket) Tx() *Tx { + return b.tx +} + +// Root returns the root of the bucket. +func (b *Bucket) Root() pgid { + return b.root +} + +// Writable returns whether the bucket is writable. +func (b *Bucket) Writable() bool { + return b.tx.writable +} + +// Cursor creates a cursor associated with the bucket. +// The cursor is only valid as long as the transaction is open. +// Do not use a cursor after the transaction is closed. +func (b *Bucket) Cursor() *Cursor { + // Update transaction statistics. + b.tx.stats.CursorCount++ + + // Allocate and return a cursor. + return &Cursor{ + bucket: b, + stack: make([]elemRef, 0), + } +} + +// Bucket retrieves a nested bucket by name. +// Returns nil if the bucket does not exist. +// The bucket instance is only valid for the lifetime of the transaction. +func (b *Bucket) Bucket(name []byte) *Bucket { + if b.buckets != nil { + if child := b.buckets[string(name)]; child != nil { + return child + } + } + + // Move cursor to key. + c := b.Cursor() + k, v, flags := c.seek(name) + + // Return nil if the key doesn't exist or it is not a bucket. + if !bytes.Equal(name, k) || (flags&bucketLeafFlag) == 0 { + return nil + } + + // Otherwise create a bucket and cache it. + var child = b.openBucket(v) + if b.buckets != nil { + b.buckets[string(name)] = child + } + + return child +} + +// Helper method that re-interprets a sub-bucket value +// from a parent into a Bucket +func (b *Bucket) openBucket(value []byte) *Bucket { + var child = newBucket(b.tx) + + // If unaligned load/stores are broken on this arch and value is + // unaligned simply clone to an aligned byte array. + unaligned := brokenUnaligned && uintptr(unsafe.Pointer(&value[0]))&3 != 0 + + if unaligned { + value = cloneBytes(value) + } + + // If this is a writable transaction then we need to copy the bucket entry. + // Read-only transactions can point directly at the mmap entry. + if b.tx.writable && !unaligned { + child.bucket = &bucket{} + *child.bucket = *(*bucket)(unsafe.Pointer(&value[0])) + } else { + child.bucket = (*bucket)(unsafe.Pointer(&value[0])) + } + + // Save a reference to the inline page if the bucket is inline. + if child.root == 0 { + child.page = (*page)(unsafe.Pointer(&value[bucketHeaderSize])) + } + + return &child +} + +// CreateBucket creates a new bucket at the given key and returns the new bucket. +// Returns an error if the key already exists, if the bucket name is blank, or if the bucket name is too long. +// The bucket instance is only valid for the lifetime of the transaction. +func (b *Bucket) CreateBucket(key []byte) (*Bucket, error) { + if b.tx.db == nil { + return nil, ErrTxClosed + } else if !b.tx.writable { + return nil, ErrTxNotWritable + } else if len(key) == 0 { + return nil, ErrBucketNameRequired + } + + // Move cursor to correct position. + c := b.Cursor() + k, _, flags := c.seek(key) + + // Return an error if there is an existing key. + if bytes.Equal(key, k) { + if (flags & bucketLeafFlag) != 0 { + return nil, ErrBucketExists + } + return nil, ErrIncompatibleValue + } + + // Create empty, inline bucket. + var bucket = Bucket{ + bucket: &bucket{}, + rootNode: &node{isLeaf: true}, + FillPercent: DefaultFillPercent, + } + var value = bucket.write() + + // Insert into node. + key = cloneBytes(key) + c.node().put(key, key, value, 0, bucketLeafFlag) + + // Since subbuckets are not allowed on inline buckets, we need to + // dereference the inline page, if it exists. This will cause the bucket + // to be treated as a regular, non-inline bucket for the rest of the tx. + b.page = nil + + return b.Bucket(key), nil +} + +// CreateBucketIfNotExists creates a new bucket if it doesn't already exist and returns a reference to it. +// Returns an error if the bucket name is blank, or if the bucket name is too long. +// The bucket instance is only valid for the lifetime of the transaction. +func (b *Bucket) CreateBucketIfNotExists(key []byte) (*Bucket, error) { + child, err := b.CreateBucket(key) + if err == ErrBucketExists { + return b.Bucket(key), nil + } else if err != nil { + return nil, err + } + return child, nil +} + +// DeleteBucket deletes a bucket at the given key. +// Returns an error if the bucket does not exists, or if the key represents a non-bucket value. +func (b *Bucket) DeleteBucket(key []byte) error { + if b.tx.db == nil { + return ErrTxClosed + } else if !b.Writable() { + return ErrTxNotWritable + } + + // Move cursor to correct position. + c := b.Cursor() + k, _, flags := c.seek(key) + + // Return an error if bucket doesn't exist or is not a bucket. + if !bytes.Equal(key, k) { + return ErrBucketNotFound + } else if (flags & bucketLeafFlag) == 0 { + return ErrIncompatibleValue + } + + // Recursively delete all child buckets. + child := b.Bucket(key) + err := child.ForEach(func(k, v []byte) error { + if v == nil { + if err := child.DeleteBucket(k); err != nil { + return fmt.Errorf("delete bucket: %s", err) + } + } + return nil + }) + if err != nil { + return err + } + + // Remove cached copy. + delete(b.buckets, string(key)) + + // Release all bucket pages to freelist. + child.nodes = nil + child.rootNode = nil + child.free() + + // Delete the node if we have a matching key. + c.node().del(key) + + return nil +} + +// Get retrieves the value for a key in the bucket. +// Returns a nil value if the key does not exist or if the key is a nested bucket. +// The returned value is only valid for the life of the transaction. +func (b *Bucket) Get(key []byte) []byte { + k, v, flags := b.Cursor().seek(key) + + // Return nil if this is a bucket. + if (flags & bucketLeafFlag) != 0 { + return nil + } + + // If our target node isn't the same key as what's passed in then return nil. + if !bytes.Equal(key, k) { + return nil + } + return v +} + +// Put sets the value for a key in the bucket. +// If the key exist then its previous value will be overwritten. +// Supplied value must remain valid for the life of the transaction. +// Returns an error if the bucket was created from a read-only transaction, if the key is blank, if the key is too large, or if the value is too large. +func (b *Bucket) Put(key []byte, value []byte) error { + if b.tx.db == nil { + return ErrTxClosed + } else if !b.Writable() { + return ErrTxNotWritable + } else if len(key) == 0 { + return ErrKeyRequired + } else if len(key) > MaxKeySize { + return ErrKeyTooLarge + } else if int64(len(value)) > MaxValueSize { + return ErrValueTooLarge + } + + // Move cursor to correct position. + c := b.Cursor() + k, _, flags := c.seek(key) + + // Return an error if there is an existing key with a bucket value. + if bytes.Equal(key, k) && (flags&bucketLeafFlag) != 0 { + return ErrIncompatibleValue + } + + // Insert into node. + key = cloneBytes(key) + c.node().put(key, key, value, 0, 0) + + return nil +} + +// Delete removes a key from the bucket. +// If the key does not exist then nothing is done and a nil error is returned. +// Returns an error if the bucket was created from a read-only transaction. +func (b *Bucket) Delete(key []byte) error { + if b.tx.db == nil { + return ErrTxClosed + } else if !b.Writable() { + return ErrTxNotWritable + } + + // Move cursor to correct position. + c := b.Cursor() + _, _, flags := c.seek(key) + + // Return an error if there is already existing bucket value. + if (flags & bucketLeafFlag) != 0 { + return ErrIncompatibleValue + } + + // Delete the node if we have a matching key. + c.node().del(key) + + return nil +} + +// Sequence returns the current integer for the bucket without incrementing it. +func (b *Bucket) Sequence() uint64 { return b.bucket.sequence } + +// SetSequence updates the sequence number for the bucket. +func (b *Bucket) SetSequence(v uint64) error { + if b.tx.db == nil { + return ErrTxClosed + } else if !b.Writable() { + return ErrTxNotWritable + } + + // Materialize the root node if it hasn't been already so that the + // bucket will be saved during commit. + if b.rootNode == nil { + _ = b.node(b.root, nil) + } + + // Increment and return the sequence. + b.bucket.sequence = v + return nil +} + +// NextSequence returns an autoincrementing integer for the bucket. +func (b *Bucket) NextSequence() (uint64, error) { + if b.tx.db == nil { + return 0, ErrTxClosed + } else if !b.Writable() { + return 0, ErrTxNotWritable + } + + // Materialize the root node if it hasn't been already so that the + // bucket will be saved during commit. + if b.rootNode == nil { + _ = b.node(b.root, nil) + } + + // Increment and return the sequence. + b.bucket.sequence++ + return b.bucket.sequence, nil +} + +// ForEach executes a function for each key/value pair in a bucket. +// If the provided function returns an error then the iteration is stopped and +// the error is returned to the caller. The provided function must not modify +// the bucket; this will result in undefined behavior. +func (b *Bucket) ForEach(fn func(k, v []byte) error) error { + if b.tx.db == nil { + return ErrTxClosed + } + c := b.Cursor() + for k, v := c.First(); k != nil; k, v = c.Next() { + if err := fn(k, v); err != nil { + return err + } + } + return nil +} + +// Stat returns stats on a bucket. +func (b *Bucket) Stats() BucketStats { + var s, subStats BucketStats + pageSize := b.tx.db.pageSize + s.BucketN += 1 + if b.root == 0 { + s.InlineBucketN += 1 + } + b.forEachPage(func(p *page, depth int) { + if (p.flags & leafPageFlag) != 0 { + s.KeyN += int(p.count) + + // used totals the used bytes for the page + used := pageHeaderSize + + if p.count != 0 { + // If page has any elements, add all element headers. + used += leafPageElementSize * int(p.count-1) + + // Add all element key, value sizes. + // The computation takes advantage of the fact that the position + // of the last element's key/value equals to the total of the sizes + // of all previous elements' keys and values. + // It also includes the last element's header. + lastElement := p.leafPageElement(p.count - 1) + used += int(lastElement.pos + lastElement.ksize + lastElement.vsize) + } + + if b.root == 0 { + // For inlined bucket just update the inline stats + s.InlineBucketInuse += used + } else { + // For non-inlined bucket update all the leaf stats + s.LeafPageN++ + s.LeafInuse += used + s.LeafOverflowN += int(p.overflow) + + // Collect stats from sub-buckets. + // Do that by iterating over all element headers + // looking for the ones with the bucketLeafFlag. + for i := uint16(0); i < p.count; i++ { + e := p.leafPageElement(i) + if (e.flags & bucketLeafFlag) != 0 { + // For any bucket element, open the element value + // and recursively call Stats on the contained bucket. + subStats.Add(b.openBucket(e.value()).Stats()) + } + } + } + } else if (p.flags & branchPageFlag) != 0 { + s.BranchPageN++ + lastElement := p.branchPageElement(p.count - 1) + + // used totals the used bytes for the page + // Add header and all element headers. + used := pageHeaderSize + (branchPageElementSize * int(p.count-1)) + + // Add size of all keys and values. + // Again, use the fact that last element's position equals to + // the total of key, value sizes of all previous elements. + used += int(lastElement.pos + lastElement.ksize) + s.BranchInuse += used + s.BranchOverflowN += int(p.overflow) + } + + // Keep track of maximum page depth. + if depth+1 > s.Depth { + s.Depth = (depth + 1) + } + }) + + // Alloc stats can be computed from page counts and pageSize. + s.BranchAlloc = (s.BranchPageN + s.BranchOverflowN) * pageSize + s.LeafAlloc = (s.LeafPageN + s.LeafOverflowN) * pageSize + + // Add the max depth of sub-buckets to get total nested depth. + s.Depth += subStats.Depth + // Add the stats for all sub-buckets + s.Add(subStats) + return s +} + +// forEachPage iterates over every page in a bucket, including inline pages. +func (b *Bucket) forEachPage(fn func(*page, int)) { + // If we have an inline page then just use that. + if b.page != nil { + fn(b.page, 0) + return + } + + // Otherwise traverse the page hierarchy. + b.tx.forEachPage(b.root, 0, fn) +} + +// forEachPageNode iterates over every page (or node) in a bucket. +// This also includes inline pages. +func (b *Bucket) forEachPageNode(fn func(*page, *node, int)) { + // If we have an inline page or root node then just use that. + if b.page != nil { + fn(b.page, nil, 0) + return + } + b._forEachPageNode(b.root, 0, fn) +} + +func (b *Bucket) _forEachPageNode(pgid pgid, depth int, fn func(*page, *node, int)) { + var p, n = b.pageNode(pgid) + + // Execute function. + fn(p, n, depth) + + // Recursively loop over children. + if p != nil { + if (p.flags & branchPageFlag) != 0 { + for i := 0; i < int(p.count); i++ { + elem := p.branchPageElement(uint16(i)) + b._forEachPageNode(elem.pgid, depth+1, fn) + } + } + } else { + if !n.isLeaf { + for _, inode := range n.inodes { + b._forEachPageNode(inode.pgid, depth+1, fn) + } + } + } +} + +// spill writes all the nodes for this bucket to dirty pages. +func (b *Bucket) spill() error { + // Spill all child buckets first. + for name, child := range b.buckets { + // If the child bucket is small enough and it has no child buckets then + // write it inline into the parent bucket's page. Otherwise spill it + // like a normal bucket and make the parent value a pointer to the page. + var value []byte + if child.inlineable() { + child.free() + value = child.write() + } else { + if err := child.spill(); err != nil { + return err + } + + // Update the child bucket header in this bucket. + value = make([]byte, unsafe.Sizeof(bucket{})) + var bucket = (*bucket)(unsafe.Pointer(&value[0])) + *bucket = *child.bucket + } + + // Skip writing the bucket if there are no materialized nodes. + if child.rootNode == nil { + continue + } + + // Update parent node. + var c = b.Cursor() + k, _, flags := c.seek([]byte(name)) + if !bytes.Equal([]byte(name), k) { + panic(fmt.Sprintf("misplaced bucket header: %x -> %x", []byte(name), k)) + } + if flags&bucketLeafFlag == 0 { + panic(fmt.Sprintf("unexpected bucket header flag: %x", flags)) + } + c.node().put([]byte(name), []byte(name), value, 0, bucketLeafFlag) + } + + // Ignore if there's not a materialized root node. + if b.rootNode == nil { + return nil + } + + // Spill nodes. + if err := b.rootNode.spill(); err != nil { + return err + } + b.rootNode = b.rootNode.root() + + // Update the root node for this bucket. + if b.rootNode.pgid >= b.tx.meta.pgid { + panic(fmt.Sprintf("pgid (%d) above high water mark (%d)", b.rootNode.pgid, b.tx.meta.pgid)) + } + b.root = b.rootNode.pgid + + return nil +} + +// inlineable returns true if a bucket is small enough to be written inline +// and if it contains no subbuckets. Otherwise returns false. +func (b *Bucket) inlineable() bool { + var n = b.rootNode + + // Bucket must only contain a single leaf node. + if n == nil || !n.isLeaf { + return false + } + + // Bucket is not inlineable if it contains subbuckets or if it goes beyond + // our threshold for inline bucket size. + var size = pageHeaderSize + for _, inode := range n.inodes { + size += leafPageElementSize + len(inode.key) + len(inode.value) + + if inode.flags&bucketLeafFlag != 0 { + return false + } else if size > b.maxInlineBucketSize() { + return false + } + } + + return true +} + +// Returns the maximum total size of a bucket to make it a candidate for inlining. +func (b *Bucket) maxInlineBucketSize() int { + return b.tx.db.pageSize / 4 +} + +// write allocates and writes a bucket to a byte slice. +func (b *Bucket) write() []byte { + // Allocate the appropriate size. + var n = b.rootNode + var value = make([]byte, bucketHeaderSize+n.size()) + + // Write a bucket header. + var bucket = (*bucket)(unsafe.Pointer(&value[0])) + *bucket = *b.bucket + + // Convert byte slice to a fake page and write the root node. + var p = (*page)(unsafe.Pointer(&value[bucketHeaderSize])) + n.write(p) + + return value +} + +// rebalance attempts to balance all nodes. +func (b *Bucket) rebalance() { + for _, n := range b.nodes { + n.rebalance() + } + for _, child := range b.buckets { + child.rebalance() + } +} + +// node creates a node from a page and associates it with a given parent. +func (b *Bucket) node(pgid pgid, parent *node) *node { + _assert(b.nodes != nil, "nodes map expected") + + // Retrieve node if it's already been created. + if n := b.nodes[pgid]; n != nil { + return n + } + + // Otherwise create a node and cache it. + n := &node{bucket: b, parent: parent} + if parent == nil { + b.rootNode = n + } else { + parent.children = append(parent.children, n) + } + + // Use the inline page if this is an inline bucket. + var p = b.page + if p == nil { + p = b.tx.page(pgid) + } + + // Read the page into the node and cache it. + n.read(p) + b.nodes[pgid] = n + + // Update statistics. + b.tx.stats.NodeCount++ + + return n +} + +// free recursively frees all pages in the bucket. +func (b *Bucket) free() { + if b.root == 0 { + return + } + + var tx = b.tx + b.forEachPageNode(func(p *page, n *node, _ int) { + if p != nil { + tx.db.freelist.free(tx.meta.txid, p) + } else { + n.free() + } + }) + b.root = 0 +} + +// dereference removes all references to the old mmap. +func (b *Bucket) dereference() { + if b.rootNode != nil { + b.rootNode.root().dereference() + } + + for _, child := range b.buckets { + child.dereference() + } +} + +// pageNode returns the in-memory node, if it exists. +// Otherwise returns the underlying page. +func (b *Bucket) pageNode(id pgid) (*page, *node) { + // Inline buckets have a fake page embedded in their value so treat them + // differently. We'll return the rootNode (if available) or the fake page. + if b.root == 0 { + if id != 0 { + panic(fmt.Sprintf("inline bucket non-zero page access(2): %d != 0", id)) + } + if b.rootNode != nil { + return nil, b.rootNode + } + return b.page, nil + } + + // Check the node cache for non-inline buckets. + if b.nodes != nil { + if n := b.nodes[id]; n != nil { + return nil, n + } + } + + // Finally lookup the page from the transaction if no node is materialized. + return b.tx.page(id), nil +} + +// BucketStats records statistics about resources used by a bucket. +type BucketStats struct { + // Page count statistics. + BranchPageN int // number of logical branch pages + BranchOverflowN int // number of physical branch overflow pages + LeafPageN int // number of logical leaf pages + LeafOverflowN int // number of physical leaf overflow pages + + // Tree statistics. + KeyN int // number of keys/value pairs + Depth int // number of levels in B+tree + + // Page size utilization. + BranchAlloc int // bytes allocated for physical branch pages + BranchInuse int // bytes actually used for branch data + LeafAlloc int // bytes allocated for physical leaf pages + LeafInuse int // bytes actually used for leaf data + + // Bucket statistics + BucketN int // total number of buckets including the top bucket + InlineBucketN int // total number on inlined buckets + InlineBucketInuse int // bytes used for inlined buckets (also accounted for in LeafInuse) +} + +func (s *BucketStats) Add(other BucketStats) { + s.BranchPageN += other.BranchPageN + s.BranchOverflowN += other.BranchOverflowN + s.LeafPageN += other.LeafPageN + s.LeafOverflowN += other.LeafOverflowN + s.KeyN += other.KeyN + if s.Depth < other.Depth { + s.Depth = other.Depth + } + s.BranchAlloc += other.BranchAlloc + s.BranchInuse += other.BranchInuse + s.LeafAlloc += other.LeafAlloc + s.LeafInuse += other.LeafInuse + + s.BucketN += other.BucketN + s.InlineBucketN += other.InlineBucketN + s.InlineBucketInuse += other.InlineBucketInuse +} + +// cloneBytes returns a copy of a given slice. +func cloneBytes(v []byte) []byte { + var clone = make([]byte, len(v)) + copy(clone, v) + return clone +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/cursor.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/cursor.go new file mode 100644 index 00000000..1be9f35e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/cursor.go @@ -0,0 +1,400 @@ +package bolt + +import ( + "bytes" + "fmt" + "sort" +) + +// Cursor represents an iterator that can traverse over all key/value pairs in a bucket in sorted order. +// Cursors see nested buckets with value == nil. +// Cursors can be obtained from a transaction and are valid as long as the transaction is open. +// +// Keys and values returned from the cursor are only valid for the life of the transaction. +// +// Changing data while traversing with a cursor may cause it to be invalidated +// and return unexpected keys and/or values. You must reposition your cursor +// after mutating data. +type Cursor struct { + bucket *Bucket + stack []elemRef +} + +// Bucket returns the bucket that this cursor was created from. +func (c *Cursor) Bucket() *Bucket { + return c.bucket +} + +// First moves the cursor to the first item in the bucket and returns its key and value. +// If the bucket is empty then a nil key and value are returned. +// The returned key and value are only valid for the life of the transaction. +func (c *Cursor) First() (key []byte, value []byte) { + _assert(c.bucket.tx.db != nil, "tx closed") + c.stack = c.stack[:0] + p, n := c.bucket.pageNode(c.bucket.root) + c.stack = append(c.stack, elemRef{page: p, node: n, index: 0}) + c.first() + + // If we land on an empty page then move to the next value. + // https://github.com/boltdb/bolt/issues/450 + if c.stack[len(c.stack)-1].count() == 0 { + c.next() + } + + k, v, flags := c.keyValue() + if (flags & uint32(bucketLeafFlag)) != 0 { + return k, nil + } + return k, v + +} + +// Last moves the cursor to the last item in the bucket and returns its key and value. +// If the bucket is empty then a nil key and value are returned. +// The returned key and value are only valid for the life of the transaction. +func (c *Cursor) Last() (key []byte, value []byte) { + _assert(c.bucket.tx.db != nil, "tx closed") + c.stack = c.stack[:0] + p, n := c.bucket.pageNode(c.bucket.root) + ref := elemRef{page: p, node: n} + ref.index = ref.count() - 1 + c.stack = append(c.stack, ref) + c.last() + k, v, flags := c.keyValue() + if (flags & uint32(bucketLeafFlag)) != 0 { + return k, nil + } + return k, v +} + +// Next moves the cursor to the next item in the bucket and returns its key and value. +// If the cursor is at the end of the bucket then a nil key and value are returned. +// The returned key and value are only valid for the life of the transaction. +func (c *Cursor) Next() (key []byte, value []byte) { + _assert(c.bucket.tx.db != nil, "tx closed") + k, v, flags := c.next() + if (flags & uint32(bucketLeafFlag)) != 0 { + return k, nil + } + return k, v +} + +// Prev moves the cursor to the previous item in the bucket and returns its key and value. +// If the cursor is at the beginning of the bucket then a nil key and value are returned. +// The returned key and value are only valid for the life of the transaction. +func (c *Cursor) Prev() (key []byte, value []byte) { + _assert(c.bucket.tx.db != nil, "tx closed") + + // Attempt to move back one element until we're successful. + // Move up the stack as we hit the beginning of each page in our stack. + for i := len(c.stack) - 1; i >= 0; i-- { + elem := &c.stack[i] + if elem.index > 0 { + elem.index-- + break + } + c.stack = c.stack[:i] + } + + // If we've hit the end then return nil. + if len(c.stack) == 0 { + return nil, nil + } + + // Move down the stack to find the last element of the last leaf under this branch. + c.last() + k, v, flags := c.keyValue() + if (flags & uint32(bucketLeafFlag)) != 0 { + return k, nil + } + return k, v +} + +// Seek moves the cursor to a given key and returns it. +// If the key does not exist then the next key is used. If no keys +// follow, a nil key is returned. +// The returned key and value are only valid for the life of the transaction. +func (c *Cursor) Seek(seek []byte) (key []byte, value []byte) { + k, v, flags := c.seek(seek) + + // If we ended up after the last element of a page then move to the next one. + if ref := &c.stack[len(c.stack)-1]; ref.index >= ref.count() { + k, v, flags = c.next() + } + + if k == nil { + return nil, nil + } else if (flags & uint32(bucketLeafFlag)) != 0 { + return k, nil + } + return k, v +} + +// Delete removes the current key/value under the cursor from the bucket. +// Delete fails if current key/value is a bucket or if the transaction is not writable. +func (c *Cursor) Delete() error { + if c.bucket.tx.db == nil { + return ErrTxClosed + } else if !c.bucket.Writable() { + return ErrTxNotWritable + } + + key, _, flags := c.keyValue() + // Return an error if current value is a bucket. + if (flags & bucketLeafFlag) != 0 { + return ErrIncompatibleValue + } + c.node().del(key) + + return nil +} + +// seek moves the cursor to a given key and returns it. +// If the key does not exist then the next key is used. +func (c *Cursor) seek(seek []byte) (key []byte, value []byte, flags uint32) { + _assert(c.bucket.tx.db != nil, "tx closed") + + // Start from root page/node and traverse to correct page. + c.stack = c.stack[:0] + c.search(seek, c.bucket.root) + ref := &c.stack[len(c.stack)-1] + + // If the cursor is pointing to the end of page/node then return nil. + if ref.index >= ref.count() { + return nil, nil, 0 + } + + // If this is a bucket then return a nil value. + return c.keyValue() +} + +// first moves the cursor to the first leaf element under the last page in the stack. +func (c *Cursor) first() { + for { + // Exit when we hit a leaf page. + var ref = &c.stack[len(c.stack)-1] + if ref.isLeaf() { + break + } + + // Keep adding pages pointing to the first element to the stack. + var pgid pgid + if ref.node != nil { + pgid = ref.node.inodes[ref.index].pgid + } else { + pgid = ref.page.branchPageElement(uint16(ref.index)).pgid + } + p, n := c.bucket.pageNode(pgid) + c.stack = append(c.stack, elemRef{page: p, node: n, index: 0}) + } +} + +// last moves the cursor to the last leaf element under the last page in the stack. +func (c *Cursor) last() { + for { + // Exit when we hit a leaf page. + ref := &c.stack[len(c.stack)-1] + if ref.isLeaf() { + break + } + + // Keep adding pages pointing to the last element in the stack. + var pgid pgid + if ref.node != nil { + pgid = ref.node.inodes[ref.index].pgid + } else { + pgid = ref.page.branchPageElement(uint16(ref.index)).pgid + } + p, n := c.bucket.pageNode(pgid) + + var nextRef = elemRef{page: p, node: n} + nextRef.index = nextRef.count() - 1 + c.stack = append(c.stack, nextRef) + } +} + +// next moves to the next leaf element and returns the key and value. +// If the cursor is at the last leaf element then it stays there and returns nil. +func (c *Cursor) next() (key []byte, value []byte, flags uint32) { + for { + // Attempt to move over one element until we're successful. + // Move up the stack as we hit the end of each page in our stack. + var i int + for i = len(c.stack) - 1; i >= 0; i-- { + elem := &c.stack[i] + if elem.index < elem.count()-1 { + elem.index++ + break + } + } + + // If we've hit the root page then stop and return. This will leave the + // cursor on the last element of the last page. + if i == -1 { + return nil, nil, 0 + } + + // Otherwise start from where we left off in the stack and find the + // first element of the first leaf page. + c.stack = c.stack[:i+1] + c.first() + + // If this is an empty page then restart and move back up the stack. + // https://github.com/boltdb/bolt/issues/450 + if c.stack[len(c.stack)-1].count() == 0 { + continue + } + + return c.keyValue() + } +} + +// search recursively performs a binary search against a given page/node until it finds a given key. +func (c *Cursor) search(key []byte, pgid pgid) { + p, n := c.bucket.pageNode(pgid) + if p != nil && (p.flags&(branchPageFlag|leafPageFlag)) == 0 { + panic(fmt.Sprintf("invalid page type: %d: %x", p.id, p.flags)) + } + e := elemRef{page: p, node: n} + c.stack = append(c.stack, e) + + // If we're on a leaf page/node then find the specific node. + if e.isLeaf() { + c.nsearch(key) + return + } + + if n != nil { + c.searchNode(key, n) + return + } + c.searchPage(key, p) +} + +func (c *Cursor) searchNode(key []byte, n *node) { + var exact bool + index := sort.Search(len(n.inodes), func(i int) bool { + // TODO(benbjohnson): Optimize this range search. It's a bit hacky right now. + // sort.Search() finds the lowest index where f() != -1 but we need the highest index. + ret := bytes.Compare(n.inodes[i].key, key) + if ret == 0 { + exact = true + } + return ret != -1 + }) + if !exact && index > 0 { + index-- + } + c.stack[len(c.stack)-1].index = index + + // Recursively search to the next page. + c.search(key, n.inodes[index].pgid) +} + +func (c *Cursor) searchPage(key []byte, p *page) { + // Binary search for the correct range. + inodes := p.branchPageElements() + + var exact bool + index := sort.Search(int(p.count), func(i int) bool { + // TODO(benbjohnson): Optimize this range search. It's a bit hacky right now. + // sort.Search() finds the lowest index where f() != -1 but we need the highest index. + ret := bytes.Compare(inodes[i].key(), key) + if ret == 0 { + exact = true + } + return ret != -1 + }) + if !exact && index > 0 { + index-- + } + c.stack[len(c.stack)-1].index = index + + // Recursively search to the next page. + c.search(key, inodes[index].pgid) +} + +// nsearch searches the leaf node on the top of the stack for a key. +func (c *Cursor) nsearch(key []byte) { + e := &c.stack[len(c.stack)-1] + p, n := e.page, e.node + + // If we have a node then search its inodes. + if n != nil { + index := sort.Search(len(n.inodes), func(i int) bool { + return bytes.Compare(n.inodes[i].key, key) != -1 + }) + e.index = index + return + } + + // If we have a page then search its leaf elements. + inodes := p.leafPageElements() + index := sort.Search(int(p.count), func(i int) bool { + return bytes.Compare(inodes[i].key(), key) != -1 + }) + e.index = index +} + +// keyValue returns the key and value of the current leaf element. +func (c *Cursor) keyValue() ([]byte, []byte, uint32) { + ref := &c.stack[len(c.stack)-1] + if ref.count() == 0 || ref.index >= ref.count() { + return nil, nil, 0 + } + + // Retrieve value from node. + if ref.node != nil { + inode := &ref.node.inodes[ref.index] + return inode.key, inode.value, inode.flags + } + + // Or retrieve value from page. + elem := ref.page.leafPageElement(uint16(ref.index)) + return elem.key(), elem.value(), elem.flags +} + +// node returns the node that the cursor is currently positioned on. +func (c *Cursor) node() *node { + _assert(len(c.stack) > 0, "accessing a node with a zero-length cursor stack") + + // If the top of the stack is a leaf node then just return it. + if ref := &c.stack[len(c.stack)-1]; ref.node != nil && ref.isLeaf() { + return ref.node + } + + // Start from root and traverse down the hierarchy. + var n = c.stack[0].node + if n == nil { + n = c.bucket.node(c.stack[0].page.id, nil) + } + for _, ref := range c.stack[:len(c.stack)-1] { + _assert(!n.isLeaf, "expected branch node") + n = n.childAt(int(ref.index)) + } + _assert(n.isLeaf, "expected leaf node") + return n +} + +// elemRef represents a reference to an element on a given page/node. +type elemRef struct { + page *page + node *node + index int +} + +// isLeaf returns whether the ref is pointing at a leaf page/node. +func (r *elemRef) isLeaf() bool { + if r.node != nil { + return r.node.isLeaf + } + return (r.page.flags & leafPageFlag) != 0 +} + +// count returns the number of inodes or page elements. +func (r *elemRef) count() int { + if r.node != nil { + return len(r.node.inodes) + } + return int(r.page.count) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/db.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/db.go new file mode 100644 index 00000000..f352ff14 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/db.go @@ -0,0 +1,1039 @@ +package bolt + +import ( + "errors" + "fmt" + "hash/fnv" + "log" + "os" + "runtime" + "runtime/debug" + "strings" + "sync" + "time" + "unsafe" +) + +// The largest step that can be taken when remapping the mmap. +const maxMmapStep = 1 << 30 // 1GB + +// The data file format version. +const version = 2 + +// Represents a marker value to indicate that a file is a Bolt DB. +const magic uint32 = 0xED0CDAED + +// IgnoreNoSync specifies whether the NoSync field of a DB is ignored when +// syncing changes to a file. This is required as some operating systems, +// such as OpenBSD, do not have a unified buffer cache (UBC) and writes +// must be synchronized using the msync(2) syscall. +const IgnoreNoSync = runtime.GOOS == "openbsd" + +// Default values if not set in a DB instance. +const ( + DefaultMaxBatchSize int = 1000 + DefaultMaxBatchDelay = 10 * time.Millisecond + DefaultAllocSize = 16 * 1024 * 1024 +) + +// default page size for db is set to the OS page size. +var defaultPageSize = os.Getpagesize() + +// DB represents a collection of buckets persisted to a file on disk. +// All data access is performed through transactions which can be obtained through the DB. +// All the functions on DB will return a ErrDatabaseNotOpen if accessed before Open() is called. +type DB struct { + // When enabled, the database will perform a Check() after every commit. + // A panic is issued if the database is in an inconsistent state. This + // flag has a large performance impact so it should only be used for + // debugging purposes. + StrictMode bool + + // Setting the NoSync flag will cause the database to skip fsync() + // calls after each commit. This can be useful when bulk loading data + // into a database and you can restart the bulk load in the event of + // a system failure or database corruption. Do not set this flag for + // normal use. + // + // If the package global IgnoreNoSync constant is true, this value is + // ignored. See the comment on that constant for more details. + // + // THIS IS UNSAFE. PLEASE USE WITH CAUTION. + NoSync bool + + // When true, skips the truncate call when growing the database. + // Setting this to true is only safe on non-ext3/ext4 systems. + // Skipping truncation avoids preallocation of hard drive space and + // bypasses a truncate() and fsync() syscall on remapping. + // + // https://github.com/boltdb/bolt/issues/284 + NoGrowSync bool + + // If you want to read the entire database fast, you can set MmapFlag to + // syscall.MAP_POPULATE on Linux 2.6.23+ for sequential read-ahead. + MmapFlags int + + // MaxBatchSize is the maximum size of a batch. Default value is + // copied from DefaultMaxBatchSize in Open. + // + // If <=0, disables batching. + // + // Do not change concurrently with calls to Batch. + MaxBatchSize int + + // MaxBatchDelay is the maximum delay before a batch starts. + // Default value is copied from DefaultMaxBatchDelay in Open. + // + // If <=0, effectively disables batching. + // + // Do not change concurrently with calls to Batch. + MaxBatchDelay time.Duration + + // AllocSize is the amount of space allocated when the database + // needs to create new pages. This is done to amortize the cost + // of truncate() and fsync() when growing the data file. + AllocSize int + + path string + file *os.File + lockfile *os.File // windows only + dataref []byte // mmap'ed readonly, write throws SEGV + data *[maxMapSize]byte + datasz int + filesz int // current on disk file size + meta0 *meta + meta1 *meta + pageSize int + opened bool + rwtx *Tx + txs []*Tx + freelist *freelist + stats Stats + + pagePool sync.Pool + + batchMu sync.Mutex + batch *batch + + rwlock sync.Mutex // Allows only one writer at a time. + metalock sync.Mutex // Protects meta page access. + mmaplock sync.RWMutex // Protects mmap access during remapping. + statlock sync.RWMutex // Protects stats access. + + ops struct { + writeAt func(b []byte, off int64) (n int, err error) + } + + // Read only mode. + // When true, Update() and Begin(true) return ErrDatabaseReadOnly immediately. + readOnly bool +} + +// Path returns the path to currently open database file. +func (db *DB) Path() string { + return db.path +} + +// GoString returns the Go string representation of the database. +func (db *DB) GoString() string { + return fmt.Sprintf("bolt.DB{path:%q}", db.path) +} + +// String returns the string representation of the database. +func (db *DB) String() string { + return fmt.Sprintf("DB<%q>", db.path) +} + +// Open creates and opens a database at the given path. +// If the file does not exist then it will be created automatically. +// Passing in nil options will cause Bolt to open the database with the default options. +func Open(path string, mode os.FileMode, options *Options) (*DB, error) { + var db = &DB{opened: true} + + // Set default options if no options are provided. + if options == nil { + options = DefaultOptions + } + db.NoGrowSync = options.NoGrowSync + db.MmapFlags = options.MmapFlags + + // Set default values for later DB operations. + db.MaxBatchSize = DefaultMaxBatchSize + db.MaxBatchDelay = DefaultMaxBatchDelay + db.AllocSize = DefaultAllocSize + + flag := os.O_RDWR + if options.ReadOnly { + flag = os.O_RDONLY + db.readOnly = true + } + + // Open data file and separate sync handler for metadata writes. + db.path = path + var err error + if db.file, err = os.OpenFile(db.path, flag|os.O_CREATE, mode); err != nil { + _ = db.close() + return nil, err + } + + // Lock file so that other processes using Bolt in read-write mode cannot + // use the database at the same time. This would cause corruption since + // the two processes would write meta pages and free pages separately. + // The database file is locked exclusively (only one process can grab the lock) + // if !options.ReadOnly. + // The database file is locked using the shared lock (more than one process may + // hold a lock at the same time) otherwise (options.ReadOnly is set). + if err := flock(db, mode, !db.readOnly, options.Timeout); err != nil { + _ = db.close() + return nil, err + } + + // Default values for test hooks + db.ops.writeAt = db.file.WriteAt + + // Initialize the database if it doesn't exist. + if info, err := db.file.Stat(); err != nil { + return nil, err + } else if info.Size() == 0 { + // Initialize new files with meta pages. + if err := db.init(); err != nil { + return nil, err + } + } else { + // Read the first meta page to determine the page size. + var buf [0x1000]byte + if _, err := db.file.ReadAt(buf[:], 0); err == nil { + m := db.pageInBuffer(buf[:], 0).meta() + if err := m.validate(); err != nil { + // If we can't read the page size, we can assume it's the same + // as the OS -- since that's how the page size was chosen in the + // first place. + // + // If the first page is invalid and this OS uses a different + // page size than what the database was created with then we + // are out of luck and cannot access the database. + db.pageSize = os.Getpagesize() + } else { + db.pageSize = int(m.pageSize) + } + } + } + + // Initialize page pool. + db.pagePool = sync.Pool{ + New: func() interface{} { + return make([]byte, db.pageSize) + }, + } + + // Memory map the data file. + if err := db.mmap(options.InitialMmapSize); err != nil { + _ = db.close() + return nil, err + } + + // Read in the freelist. + db.freelist = newFreelist() + db.freelist.read(db.page(db.meta().freelist)) + + // Mark the database as opened and return. + return db, nil +} + +// mmap opens the underlying memory-mapped file and initializes the meta references. +// minsz is the minimum size that the new mmap can be. +func (db *DB) mmap(minsz int) error { + db.mmaplock.Lock() + defer db.mmaplock.Unlock() + + info, err := db.file.Stat() + if err != nil { + return fmt.Errorf("mmap stat error: %s", err) + } else if int(info.Size()) < db.pageSize*2 { + return fmt.Errorf("file size too small") + } + + // Ensure the size is at least the minimum size. + var size = int(info.Size()) + if size < minsz { + size = minsz + } + size, err = db.mmapSize(size) + if err != nil { + return err + } + + // Dereference all mmap references before unmapping. + if db.rwtx != nil { + db.rwtx.root.dereference() + } + + // Unmap existing data before continuing. + if err := db.munmap(); err != nil { + return err + } + + // Memory-map the data file as a byte slice. + if err := mmap(db, size); err != nil { + return err + } + + // Save references to the meta pages. + db.meta0 = db.page(0).meta() + db.meta1 = db.page(1).meta() + + // Validate the meta pages. We only return an error if both meta pages fail + // validation, since meta0 failing validation means that it wasn't saved + // properly -- but we can recover using meta1. And vice-versa. + err0 := db.meta0.validate() + err1 := db.meta1.validate() + if err0 != nil && err1 != nil { + return err0 + } + + return nil +} + +// munmap unmaps the data file from memory. +func (db *DB) munmap() error { + if err := munmap(db); err != nil { + return fmt.Errorf("unmap error: " + err.Error()) + } + return nil +} + +// mmapSize determines the appropriate size for the mmap given the current size +// of the database. The minimum size is 32KB and doubles until it reaches 1GB. +// Returns an error if the new mmap size is greater than the max allowed. +func (db *DB) mmapSize(size int) (int, error) { + // Double the size from 32KB until 1GB. + for i := uint(15); i <= 30; i++ { + if size <= 1< maxMapSize { + return 0, fmt.Errorf("mmap too large") + } + + // If larger than 1GB then grow by 1GB at a time. + sz := int64(size) + if remainder := sz % int64(maxMmapStep); remainder > 0 { + sz += int64(maxMmapStep) - remainder + } + + // Ensure that the mmap size is a multiple of the page size. + // This should always be true since we're incrementing in MBs. + pageSize := int64(db.pageSize) + if (sz % pageSize) != 0 { + sz = ((sz / pageSize) + 1) * pageSize + } + + // If we've exceeded the max size then only grow up to the max size. + if sz > maxMapSize { + sz = maxMapSize + } + + return int(sz), nil +} + +// init creates a new database file and initializes its meta pages. +func (db *DB) init() error { + // Set the page size to the OS page size. + db.pageSize = os.Getpagesize() + + // Create two meta pages on a buffer. + buf := make([]byte, db.pageSize*4) + for i := 0; i < 2; i++ { + p := db.pageInBuffer(buf[:], pgid(i)) + p.id = pgid(i) + p.flags = metaPageFlag + + // Initialize the meta page. + m := p.meta() + m.magic = magic + m.version = version + m.pageSize = uint32(db.pageSize) + m.freelist = 2 + m.root = bucket{root: 3} + m.pgid = 4 + m.txid = txid(i) + m.checksum = m.sum64() + } + + // Write an empty freelist at page 3. + p := db.pageInBuffer(buf[:], pgid(2)) + p.id = pgid(2) + p.flags = freelistPageFlag + p.count = 0 + + // Write an empty leaf page at page 4. + p = db.pageInBuffer(buf[:], pgid(3)) + p.id = pgid(3) + p.flags = leafPageFlag + p.count = 0 + + // Write the buffer to our data file. + if _, err := db.ops.writeAt(buf, 0); err != nil { + return err + } + if err := fdatasync(db); err != nil { + return err + } + + return nil +} + +// Close releases all database resources. +// All transactions must be closed before closing the database. +func (db *DB) Close() error { + db.rwlock.Lock() + defer db.rwlock.Unlock() + + db.metalock.Lock() + defer db.metalock.Unlock() + + db.mmaplock.RLock() + defer db.mmaplock.RUnlock() + + return db.close() +} + +func (db *DB) close() error { + if !db.opened { + return nil + } + + db.opened = false + + db.freelist = nil + + // Clear ops. + db.ops.writeAt = nil + + // Close the mmap. + if err := db.munmap(); err != nil { + return err + } + + // Close file handles. + if db.file != nil { + // No need to unlock read-only file. + if !db.readOnly { + // Unlock the file. + if err := funlock(db); err != nil { + log.Printf("bolt.Close(): funlock error: %s", err) + } + } + + // Close the file descriptor. + if err := db.file.Close(); err != nil { + return fmt.Errorf("db file close: %s", err) + } + db.file = nil + } + + db.path = "" + return nil +} + +// Begin starts a new transaction. +// Multiple read-only transactions can be used concurrently but only one +// write transaction can be used at a time. Starting multiple write transactions +// will cause the calls to block and be serialized until the current write +// transaction finishes. +// +// Transactions should not be dependent on one another. Opening a read +// transaction and a write transaction in the same goroutine can cause the +// writer to deadlock because the database periodically needs to re-mmap itself +// as it grows and it cannot do that while a read transaction is open. +// +// If a long running read transaction (for example, a snapshot transaction) is +// needed, you might want to set DB.InitialMmapSize to a large enough value +// to avoid potential blocking of write transaction. +// +// IMPORTANT: You must close read-only transactions after you are finished or +// else the database will not reclaim old pages. +func (db *DB) Begin(writable bool) (*Tx, error) { + if writable { + return db.beginRWTx() + } + return db.beginTx() +} + +func (db *DB) beginTx() (*Tx, error) { + // Lock the meta pages while we initialize the transaction. We obtain + // the meta lock before the mmap lock because that's the order that the + // write transaction will obtain them. + db.metalock.Lock() + + // Obtain a read-only lock on the mmap. When the mmap is remapped it will + // obtain a write lock so all transactions must finish before it can be + // remapped. + db.mmaplock.RLock() + + // Exit if the database is not open yet. + if !db.opened { + db.mmaplock.RUnlock() + db.metalock.Unlock() + return nil, ErrDatabaseNotOpen + } + + // Create a transaction associated with the database. + t := &Tx{} + t.init(db) + + // Keep track of transaction until it closes. + db.txs = append(db.txs, t) + n := len(db.txs) + + // Unlock the meta pages. + db.metalock.Unlock() + + // Update the transaction stats. + db.statlock.Lock() + db.stats.TxN++ + db.stats.OpenTxN = n + db.statlock.Unlock() + + return t, nil +} + +func (db *DB) beginRWTx() (*Tx, error) { + // If the database was opened with Options.ReadOnly, return an error. + if db.readOnly { + return nil, ErrDatabaseReadOnly + } + + // Obtain writer lock. This is released by the transaction when it closes. + // This enforces only one writer transaction at a time. + db.rwlock.Lock() + + // Once we have the writer lock then we can lock the meta pages so that + // we can set up the transaction. + db.metalock.Lock() + defer db.metalock.Unlock() + + // Exit if the database is not open yet. + if !db.opened { + db.rwlock.Unlock() + return nil, ErrDatabaseNotOpen + } + + // Create a transaction associated with the database. + t := &Tx{writable: true} + t.init(db) + db.rwtx = t + + // Free any pages associated with closed read-only transactions. + var minid txid = 0xFFFFFFFFFFFFFFFF + for _, t := range db.txs { + if t.meta.txid < minid { + minid = t.meta.txid + } + } + if minid > 0 { + db.freelist.release(minid - 1) + } + + return t, nil +} + +// removeTx removes a transaction from the database. +func (db *DB) removeTx(tx *Tx) { + // Release the read lock on the mmap. + db.mmaplock.RUnlock() + + // Use the meta lock to restrict access to the DB object. + db.metalock.Lock() + + // Remove the transaction. + for i, t := range db.txs { + if t == tx { + last := len(db.txs) - 1 + db.txs[i] = db.txs[last] + db.txs[last] = nil + db.txs = db.txs[:last] + break + } + } + n := len(db.txs) + + // Unlock the meta pages. + db.metalock.Unlock() + + // Merge statistics. + db.statlock.Lock() + db.stats.OpenTxN = n + db.stats.TxStats.add(&tx.stats) + db.statlock.Unlock() +} + +// Update executes a function within the context of a read-write managed transaction. +// If no error is returned from the function then the transaction is committed. +// If an error is returned then the entire transaction is rolled back. +// Any error that is returned from the function or returned from the commit is +// returned from the Update() method. +// +// Attempting to manually commit or rollback within the function will cause a panic. +func (db *DB) Update(fn func(*Tx) error) error { + t, err := db.Begin(true) + if err != nil { + return err + } + + // Make sure the transaction rolls back in the event of a panic. + defer func() { + if t.db != nil { + t.rollback() + } + }() + + // Mark as a managed tx so that the inner function cannot manually commit. + t.managed = true + + // If an error is returned from the function then rollback and return error. + err = fn(t) + t.managed = false + if err != nil { + _ = t.Rollback() + return err + } + + return t.Commit() +} + +// View executes a function within the context of a managed read-only transaction. +// Any error that is returned from the function is returned from the View() method. +// +// Attempting to manually rollback within the function will cause a panic. +func (db *DB) View(fn func(*Tx) error) error { + t, err := db.Begin(false) + if err != nil { + return err + } + + // Make sure the transaction rolls back in the event of a panic. + defer func() { + if t.db != nil { + t.rollback() + } + }() + + // Mark as a managed tx so that the inner function cannot manually rollback. + t.managed = true + + // If an error is returned from the function then pass it through. + err = fn(t) + t.managed = false + if err != nil { + _ = t.Rollback() + return err + } + + if err := t.Rollback(); err != nil { + return err + } + + return nil +} + +// Batch calls fn as part of a batch. It behaves similar to Update, +// except: +// +// 1. concurrent Batch calls can be combined into a single Bolt +// transaction. +// +// 2. the function passed to Batch may be called multiple times, +// regardless of whether it returns error or not. +// +// This means that Batch function side effects must be idempotent and +// take permanent effect only after a successful return is seen in +// caller. +// +// The maximum batch size and delay can be adjusted with DB.MaxBatchSize +// and DB.MaxBatchDelay, respectively. +// +// Batch is only useful when there are multiple goroutines calling it. +func (db *DB) Batch(fn func(*Tx) error) error { + errCh := make(chan error, 1) + + db.batchMu.Lock() + if (db.batch == nil) || (db.batch != nil && len(db.batch.calls) >= db.MaxBatchSize) { + // There is no existing batch, or the existing batch is full; start a new one. + db.batch = &batch{ + db: db, + } + db.batch.timer = time.AfterFunc(db.MaxBatchDelay, db.batch.trigger) + } + db.batch.calls = append(db.batch.calls, call{fn: fn, err: errCh}) + if len(db.batch.calls) >= db.MaxBatchSize { + // wake up batch, it's ready to run + go db.batch.trigger() + } + db.batchMu.Unlock() + + err := <-errCh + if err == trySolo { + err = db.Update(fn) + } + return err +} + +type call struct { + fn func(*Tx) error + err chan<- error +} + +type batch struct { + db *DB + timer *time.Timer + start sync.Once + calls []call +} + +// trigger runs the batch if it hasn't already been run. +func (b *batch) trigger() { + b.start.Do(b.run) +} + +// run performs the transactions in the batch and communicates results +// back to DB.Batch. +func (b *batch) run() { + b.db.batchMu.Lock() + b.timer.Stop() + // Make sure no new work is added to this batch, but don't break + // other batches. + if b.db.batch == b { + b.db.batch = nil + } + b.db.batchMu.Unlock() + +retry: + for len(b.calls) > 0 { + var failIdx = -1 + err := b.db.Update(func(tx *Tx) error { + for i, c := range b.calls { + if err := safelyCall(c.fn, tx); err != nil { + failIdx = i + return err + } + } + return nil + }) + + if failIdx >= 0 { + // take the failing transaction out of the batch. it's + // safe to shorten b.calls here because db.batch no longer + // points to us, and we hold the mutex anyway. + c := b.calls[failIdx] + b.calls[failIdx], b.calls = b.calls[len(b.calls)-1], b.calls[:len(b.calls)-1] + // tell the submitter re-run it solo, continue with the rest of the batch + c.err <- trySolo + continue retry + } + + // pass success, or bolt internal errors, to all callers + for _, c := range b.calls { + if c.err != nil { + c.err <- err + } + } + break retry + } +} + +// trySolo is a special sentinel error value used for signaling that a +// transaction function should be re-run. It should never be seen by +// callers. +var trySolo = errors.New("batch function returned an error and should be re-run solo") + +type panicked struct { + reason interface{} +} + +func (p panicked) Error() string { + if err, ok := p.reason.(error); ok { + return err.Error() + } + return fmt.Sprintf("panic: %v", p.reason) +} + +func safelyCall(fn func(*Tx) error, tx *Tx) (err error) { + defer func() { + if p := recover(); p != nil { + err = panicked{p} + } + }() + return fn(tx) +} + +// Sync executes fdatasync() against the database file handle. +// +// This is not necessary under normal operation, however, if you use NoSync +// then it allows you to force the database file to sync against the disk. +func (db *DB) Sync() error { return fdatasync(db) } + +// Stats retrieves ongoing performance stats for the database. +// This is only updated when a transaction closes. +func (db *DB) Stats() Stats { + db.statlock.RLock() + defer db.statlock.RUnlock() + return db.stats +} + +// This is for internal access to the raw data bytes from the C cursor, use +// carefully, or not at all. +func (db *DB) Info() *Info { + return &Info{uintptr(unsafe.Pointer(&db.data[0])), db.pageSize} +} + +// page retrieves a page reference from the mmap based on the current page size. +func (db *DB) page(id pgid) *page { + pos := id * pgid(db.pageSize) + return (*page)(unsafe.Pointer(&db.data[pos])) +} + +// pageInBuffer retrieves a page reference from a given byte array based on the current page size. +func (db *DB) pageInBuffer(b []byte, id pgid) *page { + return (*page)(unsafe.Pointer(&b[id*pgid(db.pageSize)])) +} + +// meta retrieves the current meta page reference. +func (db *DB) meta() *meta { + // We have to return the meta with the highest txid which doesn't fail + // validation. Otherwise, we can cause errors when in fact the database is + // in a consistent state. metaA is the one with the higher txid. + metaA := db.meta0 + metaB := db.meta1 + if db.meta1.txid > db.meta0.txid { + metaA = db.meta1 + metaB = db.meta0 + } + + // Use higher meta page if valid. Otherwise fallback to previous, if valid. + if err := metaA.validate(); err == nil { + return metaA + } else if err := metaB.validate(); err == nil { + return metaB + } + + // This should never be reached, because both meta1 and meta0 were validated + // on mmap() and we do fsync() on every write. + panic("bolt.DB.meta(): invalid meta pages") +} + +// allocate returns a contiguous block of memory starting at a given page. +func (db *DB) allocate(count int) (*page, error) { + // Allocate a temporary buffer for the page. + var buf []byte + if count == 1 { + buf = db.pagePool.Get().([]byte) + } else { + buf = make([]byte, count*db.pageSize) + } + p := (*page)(unsafe.Pointer(&buf[0])) + p.overflow = uint32(count - 1) + + // Use pages from the freelist if they are available. + if p.id = db.freelist.allocate(count); p.id != 0 { + return p, nil + } + + // Resize mmap() if we're at the end. + p.id = db.rwtx.meta.pgid + var minsz = int((p.id+pgid(count))+1) * db.pageSize + if minsz >= db.datasz { + if err := db.mmap(minsz); err != nil { + return nil, fmt.Errorf("mmap allocate error: %s", err) + } + } + + // Move the page id high water mark. + db.rwtx.meta.pgid += pgid(count) + + return p, nil +} + +// grow grows the size of the database to the given sz. +func (db *DB) grow(sz int) error { + // Ignore if the new size is less than available file size. + if sz <= db.filesz { + return nil + } + + // If the data is smaller than the alloc size then only allocate what's needed. + // Once it goes over the allocation size then allocate in chunks. + if db.datasz < db.AllocSize { + sz = db.datasz + } else { + sz += db.AllocSize + } + + // Truncate and fsync to ensure file size metadata is flushed. + // https://github.com/boltdb/bolt/issues/284 + if !db.NoGrowSync && !db.readOnly { + if runtime.GOOS != "windows" { + if err := db.file.Truncate(int64(sz)); err != nil { + return fmt.Errorf("file resize error: %s", err) + } + } + if err := db.file.Sync(); err != nil { + return fmt.Errorf("file sync error: %s", err) + } + } + + db.filesz = sz + return nil +} + +func (db *DB) IsReadOnly() bool { + return db.readOnly +} + +// Options represents the options that can be set when opening a database. +type Options struct { + // Timeout is the amount of time to wait to obtain a file lock. + // When set to zero it will wait indefinitely. This option is only + // available on Darwin and Linux. + Timeout time.Duration + + // Sets the DB.NoGrowSync flag before memory mapping the file. + NoGrowSync bool + + // Open database in read-only mode. Uses flock(..., LOCK_SH |LOCK_NB) to + // grab a shared lock (UNIX). + ReadOnly bool + + // Sets the DB.MmapFlags flag before memory mapping the file. + MmapFlags int + + // InitialMmapSize is the initial mmap size of the database + // in bytes. Read transactions won't block write transaction + // if the InitialMmapSize is large enough to hold database mmap + // size. (See DB.Begin for more information) + // + // If <=0, the initial map size is 0. + // If initialMmapSize is smaller than the previous database size, + // it takes no effect. + InitialMmapSize int +} + +// DefaultOptions represent the options used if nil options are passed into Open(). +// No timeout is used which will cause Bolt to wait indefinitely for a lock. +var DefaultOptions = &Options{ + Timeout: 0, + NoGrowSync: false, +} + +// Stats represents statistics about the database. +type Stats struct { + // Freelist stats + FreePageN int // total number of free pages on the freelist + PendingPageN int // total number of pending pages on the freelist + FreeAlloc int // total bytes allocated in free pages + FreelistInuse int // total bytes used by the freelist + + // Transaction stats + TxN int // total number of started read transactions + OpenTxN int // number of currently open read transactions + + TxStats TxStats // global, ongoing stats. +} + +// Sub calculates and returns the difference between two sets of database stats. +// This is useful when obtaining stats at two different points and time and +// you need the performance counters that occurred within that time span. +func (s *Stats) Sub(other *Stats) Stats { + if other == nil { + return *s + } + var diff Stats + diff.FreePageN = s.FreePageN + diff.PendingPageN = s.PendingPageN + diff.FreeAlloc = s.FreeAlloc + diff.FreelistInuse = s.FreelistInuse + diff.TxN = s.TxN - other.TxN + diff.TxStats = s.TxStats.Sub(&other.TxStats) + return diff +} + +func (s *Stats) add(other *Stats) { + s.TxStats.add(&other.TxStats) +} + +type Info struct { + Data uintptr + PageSize int +} + +type meta struct { + magic uint32 + version uint32 + pageSize uint32 + flags uint32 + root bucket + freelist pgid + pgid pgid + txid txid + checksum uint64 +} + +// validate checks the marker bytes and version of the meta page to ensure it matches this binary. +func (m *meta) validate() error { + if m.magic != magic { + return ErrInvalid + } else if m.version != version { + return ErrVersionMismatch + } else if m.checksum != 0 && m.checksum != m.sum64() { + return ErrChecksum + } + return nil +} + +// copy copies one meta object to another. +func (m *meta) copy(dest *meta) { + *dest = *m +} + +// write writes the meta onto a page. +func (m *meta) write(p *page) { + if m.root.root >= m.pgid { + panic(fmt.Sprintf("root bucket pgid (%d) above high water mark (%d)", m.root.root, m.pgid)) + } else if m.freelist >= m.pgid { + panic(fmt.Sprintf("freelist pgid (%d) above high water mark (%d)", m.freelist, m.pgid)) + } + + // Page id is either going to be 0 or 1 which we can determine by the transaction ID. + p.id = pgid(m.txid % 2) + p.flags |= metaPageFlag + + // Calculate the checksum. + m.checksum = m.sum64() + + m.copy(p.meta()) +} + +// generates the checksum for the meta. +func (m *meta) sum64() uint64 { + var h = fnv.New64a() + _, _ = h.Write((*[unsafe.Offsetof(meta{}.checksum)]byte)(unsafe.Pointer(m))[:]) + return h.Sum64() +} + +// _assert will panic with a given formatted message if the given condition is false. +func _assert(condition bool, msg string, v ...interface{}) { + if !condition { + panic(fmt.Sprintf("assertion failed: "+msg, v...)) + } +} + +func warn(v ...interface{}) { fmt.Fprintln(os.Stderr, v...) } +func warnf(msg string, v ...interface{}) { fmt.Fprintf(os.Stderr, msg+"\n", v...) } + +func printstack() { + stack := strings.Join(strings.Split(string(debug.Stack()), "\n")[2:], "\n") + fmt.Fprintln(os.Stderr, stack) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/doc.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/doc.go new file mode 100644 index 00000000..cc937845 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/doc.go @@ -0,0 +1,44 @@ +/* +Package bolt implements a low-level key/value store in pure Go. It supports +fully serializable transactions, ACID semantics, and lock-free MVCC with +multiple readers and a single writer. Bolt can be used for projects that +want a simple data store without the need to add large dependencies such as +Postgres or MySQL. + +Bolt is a single-level, zero-copy, B+tree data store. This means that Bolt is +optimized for fast read access and does not require recovery in the event of a +system crash. Transactions which have not finished committing will simply be +rolled back in the event of a crash. + +The design of Bolt is based on Howard Chu's LMDB database project. + +Bolt currently works on Windows, Mac OS X, and Linux. + + +Basics + +There are only a few types in Bolt: DB, Bucket, Tx, and Cursor. The DB is +a collection of buckets and is represented by a single file on disk. A bucket is +a collection of unique keys that are associated with values. + +Transactions provide either read-only or read-write access to the database. +Read-only transactions can retrieve key/value pairs and can use Cursors to +iterate over the dataset sequentially. Read-write transactions can create and +delete buckets and can insert and remove keys. Only one read-write transaction +is allowed at a time. + + +Caveats + +The database uses a read-only, memory-mapped data file to ensure that +applications cannot corrupt the database, however, this means that keys and +values returned from Bolt cannot be changed. Writing to a read-only byte slice +will cause Go to panic. + +Keys and values retrieved from the database are only valid for the life of +the transaction. When used outside the transaction, these byte slices can +point to different data or can point to invalid memory which will cause a panic. + + +*/ +package bolt diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/errors.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/errors.go new file mode 100644 index 00000000..a3620a3e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/errors.go @@ -0,0 +1,71 @@ +package bolt + +import "errors" + +// These errors can be returned when opening or calling methods on a DB. +var ( + // ErrDatabaseNotOpen is returned when a DB instance is accessed before it + // is opened or after it is closed. + ErrDatabaseNotOpen = errors.New("database not open") + + // ErrDatabaseOpen is returned when opening a database that is + // already open. + ErrDatabaseOpen = errors.New("database already open") + + // ErrInvalid is returned when both meta pages on a database are invalid. + // This typically occurs when a file is not a bolt database. + ErrInvalid = errors.New("invalid database") + + // ErrVersionMismatch is returned when the data file was created with a + // different version of Bolt. + ErrVersionMismatch = errors.New("version mismatch") + + // ErrChecksum is returned when either meta page checksum does not match. + ErrChecksum = errors.New("checksum error") + + // ErrTimeout is returned when a database cannot obtain an exclusive lock + // on the data file after the timeout passed to Open(). + ErrTimeout = errors.New("timeout") +) + +// These errors can occur when beginning or committing a Tx. +var ( + // ErrTxNotWritable is returned when performing a write operation on a + // read-only transaction. + ErrTxNotWritable = errors.New("tx not writable") + + // ErrTxClosed is returned when committing or rolling back a transaction + // that has already been committed or rolled back. + ErrTxClosed = errors.New("tx closed") + + // ErrDatabaseReadOnly is returned when a mutating transaction is started on a + // read-only database. + ErrDatabaseReadOnly = errors.New("database is in read-only mode") +) + +// These errors can occur when putting or deleting a value or a bucket. +var ( + // ErrBucketNotFound is returned when trying to access a bucket that has + // not been created yet. + ErrBucketNotFound = errors.New("bucket not found") + + // ErrBucketExists is returned when creating a bucket that already exists. + ErrBucketExists = errors.New("bucket already exists") + + // ErrBucketNameRequired is returned when creating a bucket with a blank name. + ErrBucketNameRequired = errors.New("bucket name required") + + // ErrKeyRequired is returned when inserting a zero-length key. + ErrKeyRequired = errors.New("key required") + + // ErrKeyTooLarge is returned when inserting a key that is larger than MaxKeySize. + ErrKeyTooLarge = errors.New("key too large") + + // ErrValueTooLarge is returned when inserting a value that is larger than MaxValueSize. + ErrValueTooLarge = errors.New("value too large") + + // ErrIncompatibleValue is returned when trying create or delete a bucket + // on an existing non-bucket key or when trying to create or delete a + // non-bucket key on an existing bucket key. + ErrIncompatibleValue = errors.New("incompatible value") +) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/freelist.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/freelist.go new file mode 100644 index 00000000..aba48f58 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/freelist.go @@ -0,0 +1,252 @@ +package bolt + +import ( + "fmt" + "sort" + "unsafe" +) + +// freelist represents a list of all pages that are available for allocation. +// It also tracks pages that have been freed but are still in use by open transactions. +type freelist struct { + ids []pgid // all free and available free page ids. + pending map[txid][]pgid // mapping of soon-to-be free page ids by tx. + cache map[pgid]bool // fast lookup of all free and pending page ids. +} + +// newFreelist returns an empty, initialized freelist. +func newFreelist() *freelist { + return &freelist{ + pending: make(map[txid][]pgid), + cache: make(map[pgid]bool), + } +} + +// size returns the size of the page after serialization. +func (f *freelist) size() int { + n := f.count() + if n >= 0xFFFF { + // The first element will be used to store the count. See freelist.write. + n++ + } + return pageHeaderSize + (int(unsafe.Sizeof(pgid(0))) * n) +} + +// count returns count of pages on the freelist +func (f *freelist) count() int { + return f.free_count() + f.pending_count() +} + +// free_count returns count of free pages +func (f *freelist) free_count() int { + return len(f.ids) +} + +// pending_count returns count of pending pages +func (f *freelist) pending_count() int { + var count int + for _, list := range f.pending { + count += len(list) + } + return count +} + +// copyall copies into dst a list of all free ids and all pending ids in one sorted list. +// f.count returns the minimum length required for dst. +func (f *freelist) copyall(dst []pgid) { + m := make(pgids, 0, f.pending_count()) + for _, list := range f.pending { + m = append(m, list...) + } + sort.Sort(m) + mergepgids(dst, f.ids, m) +} + +// allocate returns the starting page id of a contiguous list of pages of a given size. +// If a contiguous block cannot be found then 0 is returned. +func (f *freelist) allocate(n int) pgid { + if len(f.ids) == 0 { + return 0 + } + + var initial, previd pgid + for i, id := range f.ids { + if id <= 1 { + panic(fmt.Sprintf("invalid page allocation: %d", id)) + } + + // Reset initial page if this is not contiguous. + if previd == 0 || id-previd != 1 { + initial = id + } + + // If we found a contiguous block then remove it and return it. + if (id-initial)+1 == pgid(n) { + // If we're allocating off the beginning then take the fast path + // and just adjust the existing slice. This will use extra memory + // temporarily but the append() in free() will realloc the slice + // as is necessary. + if (i + 1) == n { + f.ids = f.ids[i+1:] + } else { + copy(f.ids[i-n+1:], f.ids[i+1:]) + f.ids = f.ids[:len(f.ids)-n] + } + + // Remove from the free cache. + for i := pgid(0); i < pgid(n); i++ { + delete(f.cache, initial+i) + } + + return initial + } + + previd = id + } + return 0 +} + +// free releases a page and its overflow for a given transaction id. +// If the page is already free then a panic will occur. +func (f *freelist) free(txid txid, p *page) { + if p.id <= 1 { + panic(fmt.Sprintf("cannot free page 0 or 1: %d", p.id)) + } + + // Free page and all its overflow pages. + var ids = f.pending[txid] + for id := p.id; id <= p.id+pgid(p.overflow); id++ { + // Verify that page is not already free. + if f.cache[id] { + panic(fmt.Sprintf("page %d already freed", id)) + } + + // Add to the freelist and cache. + ids = append(ids, id) + f.cache[id] = true + } + f.pending[txid] = ids +} + +// release moves all page ids for a transaction id (or older) to the freelist. +func (f *freelist) release(txid txid) { + m := make(pgids, 0) + for tid, ids := range f.pending { + if tid <= txid { + // Move transaction's pending pages to the available freelist. + // Don't remove from the cache since the page is still free. + m = append(m, ids...) + delete(f.pending, tid) + } + } + sort.Sort(m) + f.ids = pgids(f.ids).merge(m) +} + +// rollback removes the pages from a given pending tx. +func (f *freelist) rollback(txid txid) { + // Remove page ids from cache. + for _, id := range f.pending[txid] { + delete(f.cache, id) + } + + // Remove pages from pending list. + delete(f.pending, txid) +} + +// freed returns whether a given page is in the free list. +func (f *freelist) freed(pgid pgid) bool { + return f.cache[pgid] +} + +// read initializes the freelist from a freelist page. +func (f *freelist) read(p *page) { + // If the page.count is at the max uint16 value (64k) then it's considered + // an overflow and the size of the freelist is stored as the first element. + idx, count := 0, int(p.count) + if count == 0xFFFF { + idx = 1 + count = int(((*[maxAllocSize]pgid)(unsafe.Pointer(&p.ptr)))[0]) + } + + // Copy the list of page ids from the freelist. + if count == 0 { + f.ids = nil + } else { + ids := ((*[maxAllocSize]pgid)(unsafe.Pointer(&p.ptr)))[idx:count] + f.ids = make([]pgid, len(ids)) + copy(f.ids, ids) + + // Make sure they're sorted. + sort.Sort(pgids(f.ids)) + } + + // Rebuild the page cache. + f.reindex() +} + +// write writes the page ids onto a freelist page. All free and pending ids are +// saved to disk since in the event of a program crash, all pending ids will +// become free. +func (f *freelist) write(p *page) error { + // Combine the old free pgids and pgids waiting on an open transaction. + + // Update the header flag. + p.flags |= freelistPageFlag + + // The page.count can only hold up to 64k elements so if we overflow that + // number then we handle it by putting the size in the first element. + lenids := f.count() + if lenids == 0 { + p.count = uint16(lenids) + } else if lenids < 0xFFFF { + p.count = uint16(lenids) + f.copyall(((*[maxAllocSize]pgid)(unsafe.Pointer(&p.ptr)))[:]) + } else { + p.count = 0xFFFF + ((*[maxAllocSize]pgid)(unsafe.Pointer(&p.ptr)))[0] = pgid(lenids) + f.copyall(((*[maxAllocSize]pgid)(unsafe.Pointer(&p.ptr)))[1:]) + } + + return nil +} + +// reload reads the freelist from a page and filters out pending items. +func (f *freelist) reload(p *page) { + f.read(p) + + // Build a cache of only pending pages. + pcache := make(map[pgid]bool) + for _, pendingIDs := range f.pending { + for _, pendingID := range pendingIDs { + pcache[pendingID] = true + } + } + + // Check each page in the freelist and build a new available freelist + // with any pages not in the pending lists. + var a []pgid + for _, id := range f.ids { + if !pcache[id] { + a = append(a, id) + } + } + f.ids = a + + // Once the available list is rebuilt then rebuild the free cache so that + // it includes the available and pending free pages. + f.reindex() +} + +// reindex rebuilds the free cache based on available and pending free lists. +func (f *freelist) reindex() { + f.cache = make(map[pgid]bool, len(f.ids)) + for _, id := range f.ids { + f.cache[id] = true + } + for _, pendingIDs := range f.pending { + for _, pendingID := range pendingIDs { + f.cache[pendingID] = true + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/node.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/node.go new file mode 100644 index 00000000..159318b2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/node.go @@ -0,0 +1,604 @@ +package bolt + +import ( + "bytes" + "fmt" + "sort" + "unsafe" +) + +// node represents an in-memory, deserialized page. +type node struct { + bucket *Bucket + isLeaf bool + unbalanced bool + spilled bool + key []byte + pgid pgid + parent *node + children nodes + inodes inodes +} + +// root returns the top-level node this node is attached to. +func (n *node) root() *node { + if n.parent == nil { + return n + } + return n.parent.root() +} + +// minKeys returns the minimum number of inodes this node should have. +func (n *node) minKeys() int { + if n.isLeaf { + return 1 + } + return 2 +} + +// size returns the size of the node after serialization. +func (n *node) size() int { + sz, elsz := pageHeaderSize, n.pageElementSize() + for i := 0; i < len(n.inodes); i++ { + item := &n.inodes[i] + sz += elsz + len(item.key) + len(item.value) + } + return sz +} + +// sizeLessThan returns true if the node is less than a given size. +// This is an optimization to avoid calculating a large node when we only need +// to know if it fits inside a certain page size. +func (n *node) sizeLessThan(v int) bool { + sz, elsz := pageHeaderSize, n.pageElementSize() + for i := 0; i < len(n.inodes); i++ { + item := &n.inodes[i] + sz += elsz + len(item.key) + len(item.value) + if sz >= v { + return false + } + } + return true +} + +// pageElementSize returns the size of each page element based on the type of node. +func (n *node) pageElementSize() int { + if n.isLeaf { + return leafPageElementSize + } + return branchPageElementSize +} + +// childAt returns the child node at a given index. +func (n *node) childAt(index int) *node { + if n.isLeaf { + panic(fmt.Sprintf("invalid childAt(%d) on a leaf node", index)) + } + return n.bucket.node(n.inodes[index].pgid, n) +} + +// childIndex returns the index of a given child node. +func (n *node) childIndex(child *node) int { + index := sort.Search(len(n.inodes), func(i int) bool { return bytes.Compare(n.inodes[i].key, child.key) != -1 }) + return index +} + +// numChildren returns the number of children. +func (n *node) numChildren() int { + return len(n.inodes) +} + +// nextSibling returns the next node with the same parent. +func (n *node) nextSibling() *node { + if n.parent == nil { + return nil + } + index := n.parent.childIndex(n) + if index >= n.parent.numChildren()-1 { + return nil + } + return n.parent.childAt(index + 1) +} + +// prevSibling returns the previous node with the same parent. +func (n *node) prevSibling() *node { + if n.parent == nil { + return nil + } + index := n.parent.childIndex(n) + if index == 0 { + return nil + } + return n.parent.childAt(index - 1) +} + +// put inserts a key/value. +func (n *node) put(oldKey, newKey, value []byte, pgid pgid, flags uint32) { + if pgid >= n.bucket.tx.meta.pgid { + panic(fmt.Sprintf("pgid (%d) above high water mark (%d)", pgid, n.bucket.tx.meta.pgid)) + } else if len(oldKey) <= 0 { + panic("put: zero-length old key") + } else if len(newKey) <= 0 { + panic("put: zero-length new key") + } + + // Find insertion index. + index := sort.Search(len(n.inodes), func(i int) bool { return bytes.Compare(n.inodes[i].key, oldKey) != -1 }) + + // Add capacity and shift nodes if we don't have an exact match and need to insert. + exact := (len(n.inodes) > 0 && index < len(n.inodes) && bytes.Equal(n.inodes[index].key, oldKey)) + if !exact { + n.inodes = append(n.inodes, inode{}) + copy(n.inodes[index+1:], n.inodes[index:]) + } + + inode := &n.inodes[index] + inode.flags = flags + inode.key = newKey + inode.value = value + inode.pgid = pgid + _assert(len(inode.key) > 0, "put: zero-length inode key") +} + +// del removes a key from the node. +func (n *node) del(key []byte) { + // Find index of key. + index := sort.Search(len(n.inodes), func(i int) bool { return bytes.Compare(n.inodes[i].key, key) != -1 }) + + // Exit if the key isn't found. + if index >= len(n.inodes) || !bytes.Equal(n.inodes[index].key, key) { + return + } + + // Delete inode from the node. + n.inodes = append(n.inodes[:index], n.inodes[index+1:]...) + + // Mark the node as needing rebalancing. + n.unbalanced = true +} + +// read initializes the node from a page. +func (n *node) read(p *page) { + n.pgid = p.id + n.isLeaf = ((p.flags & leafPageFlag) != 0) + n.inodes = make(inodes, int(p.count)) + + for i := 0; i < int(p.count); i++ { + inode := &n.inodes[i] + if n.isLeaf { + elem := p.leafPageElement(uint16(i)) + inode.flags = elem.flags + inode.key = elem.key() + inode.value = elem.value() + } else { + elem := p.branchPageElement(uint16(i)) + inode.pgid = elem.pgid + inode.key = elem.key() + } + _assert(len(inode.key) > 0, "read: zero-length inode key") + } + + // Save first key so we can find the node in the parent when we spill. + if len(n.inodes) > 0 { + n.key = n.inodes[0].key + _assert(len(n.key) > 0, "read: zero-length node key") + } else { + n.key = nil + } +} + +// write writes the items onto one or more pages. +func (n *node) write(p *page) { + // Initialize page. + if n.isLeaf { + p.flags |= leafPageFlag + } else { + p.flags |= branchPageFlag + } + + if len(n.inodes) >= 0xFFFF { + panic(fmt.Sprintf("inode overflow: %d (pgid=%d)", len(n.inodes), p.id)) + } + p.count = uint16(len(n.inodes)) + + // Stop here if there are no items to write. + if p.count == 0 { + return + } + + // Loop over each item and write it to the page. + b := (*[maxAllocSize]byte)(unsafe.Pointer(&p.ptr))[n.pageElementSize()*len(n.inodes):] + for i, item := range n.inodes { + _assert(len(item.key) > 0, "write: zero-length inode key") + + // Write the page element. + if n.isLeaf { + elem := p.leafPageElement(uint16(i)) + elem.pos = uint32(uintptr(unsafe.Pointer(&b[0])) - uintptr(unsafe.Pointer(elem))) + elem.flags = item.flags + elem.ksize = uint32(len(item.key)) + elem.vsize = uint32(len(item.value)) + } else { + elem := p.branchPageElement(uint16(i)) + elem.pos = uint32(uintptr(unsafe.Pointer(&b[0])) - uintptr(unsafe.Pointer(elem))) + elem.ksize = uint32(len(item.key)) + elem.pgid = item.pgid + _assert(elem.pgid != p.id, "write: circular dependency occurred") + } + + // If the length of key+value is larger than the max allocation size + // then we need to reallocate the byte array pointer. + // + // See: https://github.com/boltdb/bolt/pull/335 + klen, vlen := len(item.key), len(item.value) + if len(b) < klen+vlen { + b = (*[maxAllocSize]byte)(unsafe.Pointer(&b[0]))[:] + } + + // Write data for the element to the end of the page. + copy(b[0:], item.key) + b = b[klen:] + copy(b[0:], item.value) + b = b[vlen:] + } + + // DEBUG ONLY: n.dump() +} + +// split breaks up a node into multiple smaller nodes, if appropriate. +// This should only be called from the spill() function. +func (n *node) split(pageSize int) []*node { + var nodes []*node + + node := n + for { + // Split node into two. + a, b := node.splitTwo(pageSize) + nodes = append(nodes, a) + + // If we can't split then exit the loop. + if b == nil { + break + } + + // Set node to b so it gets split on the next iteration. + node = b + } + + return nodes +} + +// splitTwo breaks up a node into two smaller nodes, if appropriate. +// This should only be called from the split() function. +func (n *node) splitTwo(pageSize int) (*node, *node) { + // Ignore the split if the page doesn't have at least enough nodes for + // two pages or if the nodes can fit in a single page. + if len(n.inodes) <= (minKeysPerPage*2) || n.sizeLessThan(pageSize) { + return n, nil + } + + // Determine the threshold before starting a new node. + var fillPercent = n.bucket.FillPercent + if fillPercent < minFillPercent { + fillPercent = minFillPercent + } else if fillPercent > maxFillPercent { + fillPercent = maxFillPercent + } + threshold := int(float64(pageSize) * fillPercent) + + // Determine split position and sizes of the two pages. + splitIndex, _ := n.splitIndex(threshold) + + // Split node into two separate nodes. + // If there's no parent then we'll need to create one. + if n.parent == nil { + n.parent = &node{bucket: n.bucket, children: []*node{n}} + } + + // Create a new node and add it to the parent. + next := &node{bucket: n.bucket, isLeaf: n.isLeaf, parent: n.parent} + n.parent.children = append(n.parent.children, next) + + // Split inodes across two nodes. + next.inodes = n.inodes[splitIndex:] + n.inodes = n.inodes[:splitIndex] + + // Update the statistics. + n.bucket.tx.stats.Split++ + + return n, next +} + +// splitIndex finds the position where a page will fill a given threshold. +// It returns the index as well as the size of the first page. +// This is only be called from split(). +func (n *node) splitIndex(threshold int) (index, sz int) { + sz = pageHeaderSize + + // Loop until we only have the minimum number of keys required for the second page. + for i := 0; i < len(n.inodes)-minKeysPerPage; i++ { + index = i + inode := n.inodes[i] + elsize := n.pageElementSize() + len(inode.key) + len(inode.value) + + // If we have at least the minimum number of keys and adding another + // node would put us over the threshold then exit and return. + if i >= minKeysPerPage && sz+elsize > threshold { + break + } + + // Add the element size to the total size. + sz += elsize + } + + return +} + +// spill writes the nodes to dirty pages and splits nodes as it goes. +// Returns an error if dirty pages cannot be allocated. +func (n *node) spill() error { + var tx = n.bucket.tx + if n.spilled { + return nil + } + + // Spill child nodes first. Child nodes can materialize sibling nodes in + // the case of split-merge so we cannot use a range loop. We have to check + // the children size on every loop iteration. + sort.Sort(n.children) + for i := 0; i < len(n.children); i++ { + if err := n.children[i].spill(); err != nil { + return err + } + } + + // We no longer need the child list because it's only used for spill tracking. + n.children = nil + + // Split nodes into appropriate sizes. The first node will always be n. + var nodes = n.split(tx.db.pageSize) + for _, node := range nodes { + // Add node's page to the freelist if it's not new. + if node.pgid > 0 { + tx.db.freelist.free(tx.meta.txid, tx.page(node.pgid)) + node.pgid = 0 + } + + // Allocate contiguous space for the node. + p, err := tx.allocate((node.size() / tx.db.pageSize) + 1) + if err != nil { + return err + } + + // Write the node. + if p.id >= tx.meta.pgid { + panic(fmt.Sprintf("pgid (%d) above high water mark (%d)", p.id, tx.meta.pgid)) + } + node.pgid = p.id + node.write(p) + node.spilled = true + + // Insert into parent inodes. + if node.parent != nil { + var key = node.key + if key == nil { + key = node.inodes[0].key + } + + node.parent.put(key, node.inodes[0].key, nil, node.pgid, 0) + node.key = node.inodes[0].key + _assert(len(node.key) > 0, "spill: zero-length node key") + } + + // Update the statistics. + tx.stats.Spill++ + } + + // If the root node split and created a new root then we need to spill that + // as well. We'll clear out the children to make sure it doesn't try to respill. + if n.parent != nil && n.parent.pgid == 0 { + n.children = nil + return n.parent.spill() + } + + return nil +} + +// rebalance attempts to combine the node with sibling nodes if the node fill +// size is below a threshold or if there are not enough keys. +func (n *node) rebalance() { + if !n.unbalanced { + return + } + n.unbalanced = false + + // Update statistics. + n.bucket.tx.stats.Rebalance++ + + // Ignore if node is above threshold (25%) and has enough keys. + var threshold = n.bucket.tx.db.pageSize / 4 + if n.size() > threshold && len(n.inodes) > n.minKeys() { + return + } + + // Root node has special handling. + if n.parent == nil { + // If root node is a branch and only has one node then collapse it. + if !n.isLeaf && len(n.inodes) == 1 { + // Move root's child up. + child := n.bucket.node(n.inodes[0].pgid, n) + n.isLeaf = child.isLeaf + n.inodes = child.inodes[:] + n.children = child.children + + // Reparent all child nodes being moved. + for _, inode := range n.inodes { + if child, ok := n.bucket.nodes[inode.pgid]; ok { + child.parent = n + } + } + + // Remove old child. + child.parent = nil + delete(n.bucket.nodes, child.pgid) + child.free() + } + + return + } + + // If node has no keys then just remove it. + if n.numChildren() == 0 { + n.parent.del(n.key) + n.parent.removeChild(n) + delete(n.bucket.nodes, n.pgid) + n.free() + n.parent.rebalance() + return + } + + _assert(n.parent.numChildren() > 1, "parent must have at least 2 children") + + // Destination node is right sibling if idx == 0, otherwise left sibling. + var target *node + var useNextSibling = (n.parent.childIndex(n) == 0) + if useNextSibling { + target = n.nextSibling() + } else { + target = n.prevSibling() + } + + // If both this node and the target node are too small then merge them. + if useNextSibling { + // Reparent all child nodes being moved. + for _, inode := range target.inodes { + if child, ok := n.bucket.nodes[inode.pgid]; ok { + child.parent.removeChild(child) + child.parent = n + child.parent.children = append(child.parent.children, child) + } + } + + // Copy over inodes from target and remove target. + n.inodes = append(n.inodes, target.inodes...) + n.parent.del(target.key) + n.parent.removeChild(target) + delete(n.bucket.nodes, target.pgid) + target.free() + } else { + // Reparent all child nodes being moved. + for _, inode := range n.inodes { + if child, ok := n.bucket.nodes[inode.pgid]; ok { + child.parent.removeChild(child) + child.parent = target + child.parent.children = append(child.parent.children, child) + } + } + + // Copy over inodes to target and remove node. + target.inodes = append(target.inodes, n.inodes...) + n.parent.del(n.key) + n.parent.removeChild(n) + delete(n.bucket.nodes, n.pgid) + n.free() + } + + // Either this node or the target node was deleted from the parent so rebalance it. + n.parent.rebalance() +} + +// removes a node from the list of in-memory children. +// This does not affect the inodes. +func (n *node) removeChild(target *node) { + for i, child := range n.children { + if child == target { + n.children = append(n.children[:i], n.children[i+1:]...) + return + } + } +} + +// dereference causes the node to copy all its inode key/value references to heap memory. +// This is required when the mmap is reallocated so inodes are not pointing to stale data. +func (n *node) dereference() { + if n.key != nil { + key := make([]byte, len(n.key)) + copy(key, n.key) + n.key = key + _assert(n.pgid == 0 || len(n.key) > 0, "dereference: zero-length node key on existing node") + } + + for i := range n.inodes { + inode := &n.inodes[i] + + key := make([]byte, len(inode.key)) + copy(key, inode.key) + inode.key = key + _assert(len(inode.key) > 0, "dereference: zero-length inode key") + + value := make([]byte, len(inode.value)) + copy(value, inode.value) + inode.value = value + } + + // Recursively dereference children. + for _, child := range n.children { + child.dereference() + } + + // Update statistics. + n.bucket.tx.stats.NodeDeref++ +} + +// free adds the node's underlying page to the freelist. +func (n *node) free() { + if n.pgid != 0 { + n.bucket.tx.db.freelist.free(n.bucket.tx.meta.txid, n.bucket.tx.page(n.pgid)) + n.pgid = 0 + } +} + +// dump writes the contents of the node to STDERR for debugging purposes. +/* +func (n *node) dump() { + // Write node header. + var typ = "branch" + if n.isLeaf { + typ = "leaf" + } + warnf("[NODE %d {type=%s count=%d}]", n.pgid, typ, len(n.inodes)) + + // Write out abbreviated version of each item. + for _, item := range n.inodes { + if n.isLeaf { + if item.flags&bucketLeafFlag != 0 { + bucket := (*bucket)(unsafe.Pointer(&item.value[0])) + warnf("+L %08x -> (bucket root=%d)", trunc(item.key, 4), bucket.root) + } else { + warnf("+L %08x -> %08x", trunc(item.key, 4), trunc(item.value, 4)) + } + } else { + warnf("+B %08x -> pgid=%d", trunc(item.key, 4), item.pgid) + } + } + warn("") +} +*/ + +type nodes []*node + +func (s nodes) Len() int { return len(s) } +func (s nodes) Swap(i, j int) { s[i], s[j] = s[j], s[i] } +func (s nodes) Less(i, j int) bool { return bytes.Compare(s[i].inodes[0].key, s[j].inodes[0].key) == -1 } + +// inode represents an internal node inside of a node. +// It can be used to point to elements in a page or point +// to an element which hasn't been added to a page yet. +type inode struct { + flags uint32 + pgid pgid + key []byte + value []byte +} + +type inodes []inode diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/page.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/page.go new file mode 100644 index 00000000..cde403ae --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/page.go @@ -0,0 +1,197 @@ +package bolt + +import ( + "fmt" + "os" + "sort" + "unsafe" +) + +const pageHeaderSize = int(unsafe.Offsetof(((*page)(nil)).ptr)) + +const minKeysPerPage = 2 + +const branchPageElementSize = int(unsafe.Sizeof(branchPageElement{})) +const leafPageElementSize = int(unsafe.Sizeof(leafPageElement{})) + +const ( + branchPageFlag = 0x01 + leafPageFlag = 0x02 + metaPageFlag = 0x04 + freelistPageFlag = 0x10 +) + +const ( + bucketLeafFlag = 0x01 +) + +type pgid uint64 + +type page struct { + id pgid + flags uint16 + count uint16 + overflow uint32 + ptr uintptr +} + +// typ returns a human readable page type string used for debugging. +func (p *page) typ() string { + if (p.flags & branchPageFlag) != 0 { + return "branch" + } else if (p.flags & leafPageFlag) != 0 { + return "leaf" + } else if (p.flags & metaPageFlag) != 0 { + return "meta" + } else if (p.flags & freelistPageFlag) != 0 { + return "freelist" + } + return fmt.Sprintf("unknown<%02x>", p.flags) +} + +// meta returns a pointer to the metadata section of the page. +func (p *page) meta() *meta { + return (*meta)(unsafe.Pointer(&p.ptr)) +} + +// leafPageElement retrieves the leaf node by index +func (p *page) leafPageElement(index uint16) *leafPageElement { + n := &((*[0x7FFFFFF]leafPageElement)(unsafe.Pointer(&p.ptr)))[index] + return n +} + +// leafPageElements retrieves a list of leaf nodes. +func (p *page) leafPageElements() []leafPageElement { + if p.count == 0 { + return nil + } + return ((*[0x7FFFFFF]leafPageElement)(unsafe.Pointer(&p.ptr)))[:] +} + +// branchPageElement retrieves the branch node by index +func (p *page) branchPageElement(index uint16) *branchPageElement { + return &((*[0x7FFFFFF]branchPageElement)(unsafe.Pointer(&p.ptr)))[index] +} + +// branchPageElements retrieves a list of branch nodes. +func (p *page) branchPageElements() []branchPageElement { + if p.count == 0 { + return nil + } + return ((*[0x7FFFFFF]branchPageElement)(unsafe.Pointer(&p.ptr)))[:] +} + +// dump writes n bytes of the page to STDERR as hex output. +func (p *page) hexdump(n int) { + buf := (*[maxAllocSize]byte)(unsafe.Pointer(p))[:n] + fmt.Fprintf(os.Stderr, "%x\n", buf) +} + +type pages []*page + +func (s pages) Len() int { return len(s) } +func (s pages) Swap(i, j int) { s[i], s[j] = s[j], s[i] } +func (s pages) Less(i, j int) bool { return s[i].id < s[j].id } + +// branchPageElement represents a node on a branch page. +type branchPageElement struct { + pos uint32 + ksize uint32 + pgid pgid +} + +// key returns a byte slice of the node key. +func (n *branchPageElement) key() []byte { + buf := (*[maxAllocSize]byte)(unsafe.Pointer(n)) + return (*[maxAllocSize]byte)(unsafe.Pointer(&buf[n.pos]))[:n.ksize] +} + +// leafPageElement represents a node on a leaf page. +type leafPageElement struct { + flags uint32 + pos uint32 + ksize uint32 + vsize uint32 +} + +// key returns a byte slice of the node key. +func (n *leafPageElement) key() []byte { + buf := (*[maxAllocSize]byte)(unsafe.Pointer(n)) + return (*[maxAllocSize]byte)(unsafe.Pointer(&buf[n.pos]))[:n.ksize:n.ksize] +} + +// value returns a byte slice of the node value. +func (n *leafPageElement) value() []byte { + buf := (*[maxAllocSize]byte)(unsafe.Pointer(n)) + return (*[maxAllocSize]byte)(unsafe.Pointer(&buf[n.pos+n.ksize]))[:n.vsize:n.vsize] +} + +// PageInfo represents human readable information about a page. +type PageInfo struct { + ID int + Type string + Count int + OverflowCount int +} + +type pgids []pgid + +func (s pgids) Len() int { return len(s) } +func (s pgids) Swap(i, j int) { s[i], s[j] = s[j], s[i] } +func (s pgids) Less(i, j int) bool { return s[i] < s[j] } + +// merge returns the sorted union of a and b. +func (a pgids) merge(b pgids) pgids { + // Return the opposite slice if one is nil. + if len(a) == 0 { + return b + } + if len(b) == 0 { + return a + } + merged := make(pgids, len(a)+len(b)) + mergepgids(merged, a, b) + return merged +} + +// mergepgids copies the sorted union of a and b into dst. +// If dst is too small, it panics. +func mergepgids(dst, a, b pgids) { + if len(dst) < len(a)+len(b) { + panic(fmt.Errorf("mergepgids bad len %d < %d + %d", len(dst), len(a), len(b))) + } + // Copy in the opposite slice if one is nil. + if len(a) == 0 { + copy(dst, b) + return + } + if len(b) == 0 { + copy(dst, a) + return + } + + // Merged will hold all elements from both lists. + merged := dst[:0] + + // Assign lead to the slice with a lower starting value, follow to the higher value. + lead, follow := a, b + if b[0] < a[0] { + lead, follow = b, a + } + + // Continue while there are elements in the lead. + for len(lead) > 0 { + // Merge largest prefix of lead that is ahead of follow[0]. + n := sort.Search(len(lead), func(i int) bool { return lead[i] > follow[0] }) + merged = append(merged, lead[:n]...) + if n >= len(lead) { + break + } + + // Swap lead and follow. + lead, follow = follow, lead[n:] + } + + // Append what's left in follow. + _ = append(merged, follow...) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/tx.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/tx.go new file mode 100644 index 00000000..6700308a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/boltdb/bolt/tx.go @@ -0,0 +1,684 @@ +package bolt + +import ( + "fmt" + "io" + "os" + "sort" + "strings" + "time" + "unsafe" +) + +// txid represents the internal transaction identifier. +type txid uint64 + +// Tx represents a read-only or read/write transaction on the database. +// Read-only transactions can be used for retrieving values for keys and creating cursors. +// Read/write transactions can create and remove buckets and create and remove keys. +// +// IMPORTANT: You must commit or rollback transactions when you are done with +// them. Pages can not be reclaimed by the writer until no more transactions +// are using them. A long running read transaction can cause the database to +// quickly grow. +type Tx struct { + writable bool + managed bool + db *DB + meta *meta + root Bucket + pages map[pgid]*page + stats TxStats + commitHandlers []func() + + // WriteFlag specifies the flag for write-related methods like WriteTo(). + // Tx opens the database file with the specified flag to copy the data. + // + // By default, the flag is unset, which works well for mostly in-memory + // workloads. For databases that are much larger than available RAM, + // set the flag to syscall.O_DIRECT to avoid trashing the page cache. + WriteFlag int +} + +// init initializes the transaction. +func (tx *Tx) init(db *DB) { + tx.db = db + tx.pages = nil + + // Copy the meta page since it can be changed by the writer. + tx.meta = &meta{} + db.meta().copy(tx.meta) + + // Copy over the root bucket. + tx.root = newBucket(tx) + tx.root.bucket = &bucket{} + *tx.root.bucket = tx.meta.root + + // Increment the transaction id and add a page cache for writable transactions. + if tx.writable { + tx.pages = make(map[pgid]*page) + tx.meta.txid += txid(1) + } +} + +// ID returns the transaction id. +func (tx *Tx) ID() int { + return int(tx.meta.txid) +} + +// DB returns a reference to the database that created the transaction. +func (tx *Tx) DB() *DB { + return tx.db +} + +// Size returns current database size in bytes as seen by this transaction. +func (tx *Tx) Size() int64 { + return int64(tx.meta.pgid) * int64(tx.db.pageSize) +} + +// Writable returns whether the transaction can perform write operations. +func (tx *Tx) Writable() bool { + return tx.writable +} + +// Cursor creates a cursor associated with the root bucket. +// All items in the cursor will return a nil value because all root bucket keys point to buckets. +// The cursor is only valid as long as the transaction is open. +// Do not use a cursor after the transaction is closed. +func (tx *Tx) Cursor() *Cursor { + return tx.root.Cursor() +} + +// Stats retrieves a copy of the current transaction statistics. +func (tx *Tx) Stats() TxStats { + return tx.stats +} + +// Bucket retrieves a bucket by name. +// Returns nil if the bucket does not exist. +// The bucket instance is only valid for the lifetime of the transaction. +func (tx *Tx) Bucket(name []byte) *Bucket { + return tx.root.Bucket(name) +} + +// CreateBucket creates a new bucket. +// Returns an error if the bucket already exists, if the bucket name is blank, or if the bucket name is too long. +// The bucket instance is only valid for the lifetime of the transaction. +func (tx *Tx) CreateBucket(name []byte) (*Bucket, error) { + return tx.root.CreateBucket(name) +} + +// CreateBucketIfNotExists creates a new bucket if it doesn't already exist. +// Returns an error if the bucket name is blank, or if the bucket name is too long. +// The bucket instance is only valid for the lifetime of the transaction. +func (tx *Tx) CreateBucketIfNotExists(name []byte) (*Bucket, error) { + return tx.root.CreateBucketIfNotExists(name) +} + +// DeleteBucket deletes a bucket. +// Returns an error if the bucket cannot be found or if the key represents a non-bucket value. +func (tx *Tx) DeleteBucket(name []byte) error { + return tx.root.DeleteBucket(name) +} + +// ForEach executes a function for each bucket in the root. +// If the provided function returns an error then the iteration is stopped and +// the error is returned to the caller. +func (tx *Tx) ForEach(fn func(name []byte, b *Bucket) error) error { + return tx.root.ForEach(func(k, v []byte) error { + if err := fn(k, tx.root.Bucket(k)); err != nil { + return err + } + return nil + }) +} + +// OnCommit adds a handler function to be executed after the transaction successfully commits. +func (tx *Tx) OnCommit(fn func()) { + tx.commitHandlers = append(tx.commitHandlers, fn) +} + +// Commit writes all changes to disk and updates the meta page. +// Returns an error if a disk write error occurs, or if Commit is +// called on a read-only transaction. +func (tx *Tx) Commit() error { + _assert(!tx.managed, "managed tx commit not allowed") + if tx.db == nil { + return ErrTxClosed + } else if !tx.writable { + return ErrTxNotWritable + } + + // TODO(benbjohnson): Use vectorized I/O to write out dirty pages. + + // Rebalance nodes which have had deletions. + var startTime = time.Now() + tx.root.rebalance() + if tx.stats.Rebalance > 0 { + tx.stats.RebalanceTime += time.Since(startTime) + } + + // spill data onto dirty pages. + startTime = time.Now() + if err := tx.root.spill(); err != nil { + tx.rollback() + return err + } + tx.stats.SpillTime += time.Since(startTime) + + // Free the old root bucket. + tx.meta.root.root = tx.root.root + + opgid := tx.meta.pgid + + // Free the freelist and allocate new pages for it. This will overestimate + // the size of the freelist but not underestimate the size (which would be bad). + tx.db.freelist.free(tx.meta.txid, tx.db.page(tx.meta.freelist)) + p, err := tx.allocate((tx.db.freelist.size() / tx.db.pageSize) + 1) + if err != nil { + tx.rollback() + return err + } + if err := tx.db.freelist.write(p); err != nil { + tx.rollback() + return err + } + tx.meta.freelist = p.id + + // If the high water mark has moved up then attempt to grow the database. + if tx.meta.pgid > opgid { + if err := tx.db.grow(int(tx.meta.pgid+1) * tx.db.pageSize); err != nil { + tx.rollback() + return err + } + } + + // Write dirty pages to disk. + startTime = time.Now() + if err := tx.write(); err != nil { + tx.rollback() + return err + } + + // If strict mode is enabled then perform a consistency check. + // Only the first consistency error is reported in the panic. + if tx.db.StrictMode { + ch := tx.Check() + var errs []string + for { + err, ok := <-ch + if !ok { + break + } + errs = append(errs, err.Error()) + } + if len(errs) > 0 { + panic("check fail: " + strings.Join(errs, "\n")) + } + } + + // Write meta to disk. + if err := tx.writeMeta(); err != nil { + tx.rollback() + return err + } + tx.stats.WriteTime += time.Since(startTime) + + // Finalize the transaction. + tx.close() + + // Execute commit handlers now that the locks have been removed. + for _, fn := range tx.commitHandlers { + fn() + } + + return nil +} + +// Rollback closes the transaction and ignores all previous updates. Read-only +// transactions must be rolled back and not committed. +func (tx *Tx) Rollback() error { + _assert(!tx.managed, "managed tx rollback not allowed") + if tx.db == nil { + return ErrTxClosed + } + tx.rollback() + return nil +} + +func (tx *Tx) rollback() { + if tx.db == nil { + return + } + if tx.writable { + tx.db.freelist.rollback(tx.meta.txid) + tx.db.freelist.reload(tx.db.page(tx.db.meta().freelist)) + } + tx.close() +} + +func (tx *Tx) close() { + if tx.db == nil { + return + } + if tx.writable { + // Grab freelist stats. + var freelistFreeN = tx.db.freelist.free_count() + var freelistPendingN = tx.db.freelist.pending_count() + var freelistAlloc = tx.db.freelist.size() + + // Remove transaction ref & writer lock. + tx.db.rwtx = nil + tx.db.rwlock.Unlock() + + // Merge statistics. + tx.db.statlock.Lock() + tx.db.stats.FreePageN = freelistFreeN + tx.db.stats.PendingPageN = freelistPendingN + tx.db.stats.FreeAlloc = (freelistFreeN + freelistPendingN) * tx.db.pageSize + tx.db.stats.FreelistInuse = freelistAlloc + tx.db.stats.TxStats.add(&tx.stats) + tx.db.statlock.Unlock() + } else { + tx.db.removeTx(tx) + } + + // Clear all references. + tx.db = nil + tx.meta = nil + tx.root = Bucket{tx: tx} + tx.pages = nil +} + +// Copy writes the entire database to a writer. +// This function exists for backwards compatibility. Use WriteTo() instead. +func (tx *Tx) Copy(w io.Writer) error { + _, err := tx.WriteTo(w) + return err +} + +// WriteTo writes the entire database to a writer. +// If err == nil then exactly tx.Size() bytes will be written into the writer. +func (tx *Tx) WriteTo(w io.Writer) (n int64, err error) { + // Attempt to open reader with WriteFlag + f, err := os.OpenFile(tx.db.path, os.O_RDONLY|tx.WriteFlag, 0) + if err != nil { + return 0, err + } + defer func() { _ = f.Close() }() + + // Generate a meta page. We use the same page data for both meta pages. + buf := make([]byte, tx.db.pageSize) + page := (*page)(unsafe.Pointer(&buf[0])) + page.flags = metaPageFlag + *page.meta() = *tx.meta + + // Write meta 0. + page.id = 0 + page.meta().checksum = page.meta().sum64() + nn, err := w.Write(buf) + n += int64(nn) + if err != nil { + return n, fmt.Errorf("meta 0 copy: %s", err) + } + + // Write meta 1 with a lower transaction id. + page.id = 1 + page.meta().txid -= 1 + page.meta().checksum = page.meta().sum64() + nn, err = w.Write(buf) + n += int64(nn) + if err != nil { + return n, fmt.Errorf("meta 1 copy: %s", err) + } + + // Move past the meta pages in the file. + if _, err := f.Seek(int64(tx.db.pageSize*2), os.SEEK_SET); err != nil { + return n, fmt.Errorf("seek: %s", err) + } + + // Copy data pages. + wn, err := io.CopyN(w, f, tx.Size()-int64(tx.db.pageSize*2)) + n += wn + if err != nil { + return n, err + } + + return n, f.Close() +} + +// CopyFile copies the entire database to file at the given path. +// A reader transaction is maintained during the copy so it is safe to continue +// using the database while a copy is in progress. +func (tx *Tx) CopyFile(path string, mode os.FileMode) error { + f, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_TRUNC, mode) + if err != nil { + return err + } + + err = tx.Copy(f) + if err != nil { + _ = f.Close() + return err + } + return f.Close() +} + +// Check performs several consistency checks on the database for this transaction. +// An error is returned if any inconsistency is found. +// +// It can be safely run concurrently on a writable transaction. However, this +// incurs a high cost for large databases and databases with a lot of subbuckets +// because of caching. This overhead can be removed if running on a read-only +// transaction, however, it is not safe to execute other writer transactions at +// the same time. +func (tx *Tx) Check() <-chan error { + ch := make(chan error) + go tx.check(ch) + return ch +} + +func (tx *Tx) check(ch chan error) { + // Check if any pages are double freed. + freed := make(map[pgid]bool) + all := make([]pgid, tx.db.freelist.count()) + tx.db.freelist.copyall(all) + for _, id := range all { + if freed[id] { + ch <- fmt.Errorf("page %d: already freed", id) + } + freed[id] = true + } + + // Track every reachable page. + reachable := make(map[pgid]*page) + reachable[0] = tx.page(0) // meta0 + reachable[1] = tx.page(1) // meta1 + for i := uint32(0); i <= tx.page(tx.meta.freelist).overflow; i++ { + reachable[tx.meta.freelist+pgid(i)] = tx.page(tx.meta.freelist) + } + + // Recursively check buckets. + tx.checkBucket(&tx.root, reachable, freed, ch) + + // Ensure all pages below high water mark are either reachable or freed. + for i := pgid(0); i < tx.meta.pgid; i++ { + _, isReachable := reachable[i] + if !isReachable && !freed[i] { + ch <- fmt.Errorf("page %d: unreachable unfreed", int(i)) + } + } + + // Close the channel to signal completion. + close(ch) +} + +func (tx *Tx) checkBucket(b *Bucket, reachable map[pgid]*page, freed map[pgid]bool, ch chan error) { + // Ignore inline buckets. + if b.root == 0 { + return + } + + // Check every page used by this bucket. + b.tx.forEachPage(b.root, 0, func(p *page, _ int) { + if p.id > tx.meta.pgid { + ch <- fmt.Errorf("page %d: out of bounds: %d", int(p.id), int(b.tx.meta.pgid)) + } + + // Ensure each page is only referenced once. + for i := pgid(0); i <= pgid(p.overflow); i++ { + var id = p.id + i + if _, ok := reachable[id]; ok { + ch <- fmt.Errorf("page %d: multiple references", int(id)) + } + reachable[id] = p + } + + // We should only encounter un-freed leaf and branch pages. + if freed[p.id] { + ch <- fmt.Errorf("page %d: reachable freed", int(p.id)) + } else if (p.flags&branchPageFlag) == 0 && (p.flags&leafPageFlag) == 0 { + ch <- fmt.Errorf("page %d: invalid type: %s", int(p.id), p.typ()) + } + }) + + // Check each bucket within this bucket. + _ = b.ForEach(func(k, v []byte) error { + if child := b.Bucket(k); child != nil { + tx.checkBucket(child, reachable, freed, ch) + } + return nil + }) +} + +// allocate returns a contiguous block of memory starting at a given page. +func (tx *Tx) allocate(count int) (*page, error) { + p, err := tx.db.allocate(count) + if err != nil { + return nil, err + } + + // Save to our page cache. + tx.pages[p.id] = p + + // Update statistics. + tx.stats.PageCount++ + tx.stats.PageAlloc += count * tx.db.pageSize + + return p, nil +} + +// write writes any dirty pages to disk. +func (tx *Tx) write() error { + // Sort pages by id. + pages := make(pages, 0, len(tx.pages)) + for _, p := range tx.pages { + pages = append(pages, p) + } + // Clear out page cache early. + tx.pages = make(map[pgid]*page) + sort.Sort(pages) + + // Write pages to disk in order. + for _, p := range pages { + size := (int(p.overflow) + 1) * tx.db.pageSize + offset := int64(p.id) * int64(tx.db.pageSize) + + // Write out page in "max allocation" sized chunks. + ptr := (*[maxAllocSize]byte)(unsafe.Pointer(p)) + for { + // Limit our write to our max allocation size. + sz := size + if sz > maxAllocSize-1 { + sz = maxAllocSize - 1 + } + + // Write chunk to disk. + buf := ptr[:sz] + if _, err := tx.db.ops.writeAt(buf, offset); err != nil { + return err + } + + // Update statistics. + tx.stats.Write++ + + // Exit inner for loop if we've written all the chunks. + size -= sz + if size == 0 { + break + } + + // Otherwise move offset forward and move pointer to next chunk. + offset += int64(sz) + ptr = (*[maxAllocSize]byte)(unsafe.Pointer(&ptr[sz])) + } + } + + // Ignore file sync if flag is set on DB. + if !tx.db.NoSync || IgnoreNoSync { + if err := fdatasync(tx.db); err != nil { + return err + } + } + + // Put small pages back to page pool. + for _, p := range pages { + // Ignore page sizes over 1 page. + // These are allocated using make() instead of the page pool. + if int(p.overflow) != 0 { + continue + } + + buf := (*[maxAllocSize]byte)(unsafe.Pointer(p))[:tx.db.pageSize] + + // See https://go.googlesource.com/go/+/f03c9202c43e0abb130669852082117ca50aa9b1 + for i := range buf { + buf[i] = 0 + } + tx.db.pagePool.Put(buf) + } + + return nil +} + +// writeMeta writes the meta to the disk. +func (tx *Tx) writeMeta() error { + // Create a temporary buffer for the meta page. + buf := make([]byte, tx.db.pageSize) + p := tx.db.pageInBuffer(buf, 0) + tx.meta.write(p) + + // Write the meta page to file. + if _, err := tx.db.ops.writeAt(buf, int64(p.id)*int64(tx.db.pageSize)); err != nil { + return err + } + if !tx.db.NoSync || IgnoreNoSync { + if err := fdatasync(tx.db); err != nil { + return err + } + } + + // Update statistics. + tx.stats.Write++ + + return nil +} + +// page returns a reference to the page with a given id. +// If page has been written to then a temporary buffered page is returned. +func (tx *Tx) page(id pgid) *page { + // Check the dirty pages first. + if tx.pages != nil { + if p, ok := tx.pages[id]; ok { + return p + } + } + + // Otherwise return directly from the mmap. + return tx.db.page(id) +} + +// forEachPage iterates over every page within a given page and executes a function. +func (tx *Tx) forEachPage(pgid pgid, depth int, fn func(*page, int)) { + p := tx.page(pgid) + + // Execute function. + fn(p, depth) + + // Recursively loop over children. + if (p.flags & branchPageFlag) != 0 { + for i := 0; i < int(p.count); i++ { + elem := p.branchPageElement(uint16(i)) + tx.forEachPage(elem.pgid, depth+1, fn) + } + } +} + +// Page returns page information for a given page number. +// This is only safe for concurrent use when used by a writable transaction. +func (tx *Tx) Page(id int) (*PageInfo, error) { + if tx.db == nil { + return nil, ErrTxClosed + } else if pgid(id) >= tx.meta.pgid { + return nil, nil + } + + // Build the page info. + p := tx.db.page(pgid(id)) + info := &PageInfo{ + ID: id, + Count: int(p.count), + OverflowCount: int(p.overflow), + } + + // Determine the type (or if it's free). + if tx.db.freelist.freed(pgid(id)) { + info.Type = "free" + } else { + info.Type = p.typ() + } + + return info, nil +} + +// TxStats represents statistics about the actions performed by the transaction. +type TxStats struct { + // Page statistics. + PageCount int // number of page allocations + PageAlloc int // total bytes allocated + + // Cursor statistics. + CursorCount int // number of cursors created + + // Node statistics + NodeCount int // number of node allocations + NodeDeref int // number of node dereferences + + // Rebalance statistics. + Rebalance int // number of node rebalances + RebalanceTime time.Duration // total time spent rebalancing + + // Split/Spill statistics. + Split int // number of nodes split + Spill int // number of nodes spilled + SpillTime time.Duration // total time spent spilling + + // Write statistics. + Write int // number of writes performed + WriteTime time.Duration // total time spent writing to disk +} + +func (s *TxStats) add(other *TxStats) { + s.PageCount += other.PageCount + s.PageAlloc += other.PageAlloc + s.CursorCount += other.CursorCount + s.NodeCount += other.NodeCount + s.NodeDeref += other.NodeDeref + s.Rebalance += other.Rebalance + s.RebalanceTime += other.RebalanceTime + s.Split += other.Split + s.Spill += other.Spill + s.SpillTime += other.SpillTime + s.Write += other.Write + s.WriteTime += other.WriteTime +} + +// Sub calculates and returns the difference between two sets of transaction stats. +// This is useful when obtaining stats at two different points and time and +// you need the performance counters that occurred within that time span. +func (s *TxStats) Sub(other *TxStats) TxStats { + var diff TxStats + diff.PageCount = s.PageCount - other.PageCount + diff.PageAlloc = s.PageAlloc - other.PageAlloc + diff.CursorCount = s.CursorCount - other.CursorCount + diff.NodeCount = s.NodeCount - other.NodeCount + diff.NodeDeref = s.NodeDeref - other.NodeDeref + diff.Rebalance = s.Rebalance - other.Rebalance + diff.RebalanceTime = s.RebalanceTime - other.RebalanceTime + diff.Split = s.Split - other.Split + diff.Spill = s.Spill - other.Spill + diff.SpillTime = s.SpillTime - other.SpillTime + diff.Write = s.Write - other.Write + diff.WriteTime = s.WriteTime - other.WriteTime + return diff +} diff --git a/vendor/github.com/cenkalti/backoff/.gitignore b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/cenkalti/backoff/.gitignore similarity index 100% rename from vendor/github.com/cenkalti/backoff/.gitignore rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/cenkalti/backoff/.gitignore diff --git a/vendor/github.com/cenkalti/backoff/.travis.yml b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/cenkalti/backoff/.travis.yml similarity index 100% rename from vendor/github.com/cenkalti/backoff/.travis.yml rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/cenkalti/backoff/.travis.yml diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/cenkalti/backoff/LICENSE b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/cenkalti/backoff/LICENSE new file mode 100644 index 00000000..89b81799 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/cenkalti/backoff/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2014 Cenk Altı + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/cenkalti/backoff/README.md b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/cenkalti/backoff/README.md similarity index 100% rename from vendor/github.com/cenkalti/backoff/README.md rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/cenkalti/backoff/README.md diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/cenkalti/backoff/backoff.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/cenkalti/backoff/backoff.go new file mode 100644 index 00000000..2102c5f2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/cenkalti/backoff/backoff.go @@ -0,0 +1,66 @@ +// Package backoff implements backoff algorithms for retrying operations. +// +// Use Retry function for retrying operations that may fail. +// If Retry does not meet your needs, +// copy/paste the function into your project and modify as you wish. +// +// There is also Ticker type similar to time.Ticker. +// You can use it if you need to work with channels. +// +// See Examples section below for usage examples. +package backoff + +import "time" + +// BackOff is a backoff policy for retrying an operation. +type BackOff interface { + // NextBackOff returns the duration to wait before retrying the operation, + // or backoff.Stop to indicate that no more retries should be made. + // + // Example usage: + // + // duration := backoff.NextBackOff(); + // if (duration == backoff.Stop) { + // // Do not retry operation. + // } else { + // // Sleep for duration and retry operation. + // } + // + NextBackOff() time.Duration + + // Reset to initial state. + Reset() +} + +// Stop indicates that no more retries should be made for use in NextBackOff(). +const Stop time.Duration = -1 + +// ZeroBackOff is a fixed backoff policy whose backoff time is always zero, +// meaning that the operation is retried immediately without waiting, indefinitely. +type ZeroBackOff struct{} + +func (b *ZeroBackOff) Reset() {} + +func (b *ZeroBackOff) NextBackOff() time.Duration { return 0 } + +// StopBackOff is a fixed backoff policy that always returns backoff.Stop for +// NextBackOff(), meaning that the operation should never be retried. +type StopBackOff struct{} + +func (b *StopBackOff) Reset() {} + +func (b *StopBackOff) NextBackOff() time.Duration { return Stop } + +// ConstantBackOff is a backoff policy that always returns the same backoff delay. +// This is in contrast to an exponential backoff policy, +// which returns a delay that grows longer as you call NextBackOff() over and over again. +type ConstantBackOff struct { + Interval time.Duration +} + +func (b *ConstantBackOff) Reset() {} +func (b *ConstantBackOff) NextBackOff() time.Duration { return b.Interval } + +func NewConstantBackOff(d time.Duration) *ConstantBackOff { + return &ConstantBackOff{Interval: d} +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/cenkalti/backoff/context.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/cenkalti/backoff/context.go new file mode 100644 index 00000000..5d157092 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/cenkalti/backoff/context.go @@ -0,0 +1,60 @@ +package backoff + +import ( + "time" + + "golang.org/x/net/context" +) + +// BackOffContext is a backoff policy that stops retrying after the context +// is canceled. +type BackOffContext interface { + BackOff + Context() context.Context +} + +type backOffContext struct { + BackOff + ctx context.Context +} + +// WithContext returns a BackOffContext with context ctx +// +// ctx must not be nil +func WithContext(b BackOff, ctx context.Context) BackOffContext { + if ctx == nil { + panic("nil context") + } + + if b, ok := b.(*backOffContext); ok { + return &backOffContext{ + BackOff: b.BackOff, + ctx: ctx, + } + } + + return &backOffContext{ + BackOff: b, + ctx: ctx, + } +} + +func ensureContext(b BackOff) BackOffContext { + if cb, ok := b.(BackOffContext); ok { + return cb + } + return WithContext(b, context.Background()) +} + +func (b *backOffContext) Context() context.Context { + return b.ctx +} + +func (b *backOffContext) NextBackOff() time.Duration { + select { + case <-b.Context().Done(): + return Stop + default: + return b.BackOff.NextBackOff() + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/cenkalti/backoff/exponential.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/cenkalti/backoff/exponential.go new file mode 100644 index 00000000..9a6addf0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/cenkalti/backoff/exponential.go @@ -0,0 +1,156 @@ +package backoff + +import ( + "math/rand" + "time" +) + +/* +ExponentialBackOff is a backoff implementation that increases the backoff +period for each retry attempt using a randomization function that grows exponentially. + +NextBackOff() is calculated using the following formula: + + randomized interval = + RetryInterval * (random value in range [1 - RandomizationFactor, 1 + RandomizationFactor]) + +In other words NextBackOff() will range between the randomization factor +percentage below and above the retry interval. + +For example, given the following parameters: + + RetryInterval = 2 + RandomizationFactor = 0.5 + Multiplier = 2 + +the actual backoff period used in the next retry attempt will range between 1 and 3 seconds, +multiplied by the exponential, that is, between 2 and 6 seconds. + +Note: MaxInterval caps the RetryInterval and not the randomized interval. + +If the time elapsed since an ExponentialBackOff instance is created goes past the +MaxElapsedTime, then the method NextBackOff() starts returning backoff.Stop. + +The elapsed time can be reset by calling Reset(). + +Example: Given the following default arguments, for 10 tries the sequence will be, +and assuming we go over the MaxElapsedTime on the 10th try: + + Request # RetryInterval (seconds) Randomized Interval (seconds) + + 1 0.5 [0.25, 0.75] + 2 0.75 [0.375, 1.125] + 3 1.125 [0.562, 1.687] + 4 1.687 [0.8435, 2.53] + 5 2.53 [1.265, 3.795] + 6 3.795 [1.897, 5.692] + 7 5.692 [2.846, 8.538] + 8 8.538 [4.269, 12.807] + 9 12.807 [6.403, 19.210] + 10 19.210 backoff.Stop + +Note: Implementation is not thread-safe. +*/ +type ExponentialBackOff struct { + InitialInterval time.Duration + RandomizationFactor float64 + Multiplier float64 + MaxInterval time.Duration + // After MaxElapsedTime the ExponentialBackOff stops. + // It never stops if MaxElapsedTime == 0. + MaxElapsedTime time.Duration + Clock Clock + + currentInterval time.Duration + startTime time.Time + random *rand.Rand +} + +// Clock is an interface that returns current time for BackOff. +type Clock interface { + Now() time.Time +} + +// Default values for ExponentialBackOff. +const ( + DefaultInitialInterval = 500 * time.Millisecond + DefaultRandomizationFactor = 0.5 + DefaultMultiplier = 1.5 + DefaultMaxInterval = 60 * time.Second + DefaultMaxElapsedTime = 15 * time.Minute +) + +// NewExponentialBackOff creates an instance of ExponentialBackOff using default values. +func NewExponentialBackOff() *ExponentialBackOff { + b := &ExponentialBackOff{ + InitialInterval: DefaultInitialInterval, + RandomizationFactor: DefaultRandomizationFactor, + Multiplier: DefaultMultiplier, + MaxInterval: DefaultMaxInterval, + MaxElapsedTime: DefaultMaxElapsedTime, + Clock: SystemClock, + random: rand.New(rand.NewSource(time.Now().UnixNano())), + } + b.Reset() + return b +} + +type systemClock struct{} + +func (t systemClock) Now() time.Time { + return time.Now() +} + +// SystemClock implements Clock interface that uses time.Now(). +var SystemClock = systemClock{} + +// Reset the interval back to the initial retry interval and restarts the timer. +func (b *ExponentialBackOff) Reset() { + b.currentInterval = b.InitialInterval + b.startTime = b.Clock.Now() +} + +// NextBackOff calculates the next backoff interval using the formula: +// Randomized interval = RetryInterval +/- (RandomizationFactor * RetryInterval) +func (b *ExponentialBackOff) NextBackOff() time.Duration { + // Make sure we have not gone over the maximum elapsed time. + if b.MaxElapsedTime != 0 && b.GetElapsedTime() > b.MaxElapsedTime { + return Stop + } + defer b.incrementCurrentInterval() + if b.random == nil { + b.random = rand.New(rand.NewSource(time.Now().UnixNano())) + } + return getRandomValueFromInterval(b.RandomizationFactor, b.random.Float64(), b.currentInterval) +} + +// GetElapsedTime returns the elapsed time since an ExponentialBackOff instance +// is created and is reset when Reset() is called. +// +// The elapsed time is computed using time.Now().UnixNano(). +func (b *ExponentialBackOff) GetElapsedTime() time.Duration { + return b.Clock.Now().Sub(b.startTime) +} + +// Increments the current interval by multiplying it with the multiplier. +func (b *ExponentialBackOff) incrementCurrentInterval() { + // Check for overflow, if overflow is detected set the current interval to the max interval. + if float64(b.currentInterval) >= float64(b.MaxInterval)/b.Multiplier { + b.currentInterval = b.MaxInterval + } else { + b.currentInterval = time.Duration(float64(b.currentInterval) * b.Multiplier) + } +} + +// Returns a random value from the following interval: +// [randomizationFactor * currentInterval, randomizationFactor * currentInterval]. +func getRandomValueFromInterval(randomizationFactor, random float64, currentInterval time.Duration) time.Duration { + var delta = randomizationFactor * float64(currentInterval) + var minInterval = float64(currentInterval) - delta + var maxInterval = float64(currentInterval) + delta + + // Get a random value from the range [minInterval, maxInterval]. + // The formula used below has a +1 because if the minInterval is 1 and the maxInterval is 3 then + // we want a 33% chance for selecting either 1, 2 or 3. + return time.Duration(minInterval + (random * (maxInterval - minInterval + 1))) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/cenkalti/backoff/retry.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/cenkalti/backoff/retry.go new file mode 100644 index 00000000..5dbd825b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/cenkalti/backoff/retry.go @@ -0,0 +1,78 @@ +package backoff + +import "time" + +// An Operation is executing by Retry() or RetryNotify(). +// The operation will be retried using a backoff policy if it returns an error. +type Operation func() error + +// Notify is a notify-on-error function. It receives an operation error and +// backoff delay if the operation failed (with an error). +// +// NOTE that if the backoff policy stated to stop retrying, +// the notify function isn't called. +type Notify func(error, time.Duration) + +// Retry the operation o until it does not return error or BackOff stops. +// o is guaranteed to be run at least once. +// It is the caller's responsibility to reset b after Retry returns. +// +// If o returns a *PermanentError, the operation is not retried, and the +// wrapped error is returned. +// +// Retry sleeps the goroutine for the duration returned by BackOff after a +// failed operation returns. +func Retry(o Operation, b BackOff) error { return RetryNotify(o, b, nil) } + +// RetryNotify calls notify function with the error and wait duration +// for each failed attempt before sleep. +func RetryNotify(operation Operation, b BackOff, notify Notify) error { + var err error + var next time.Duration + + cb := ensureContext(b) + + b.Reset() + for { + if err = operation(); err == nil { + return nil + } + + if permanent, ok := err.(*PermanentError); ok { + return permanent.Err + } + + if next = b.NextBackOff(); next == Stop { + return err + } + + if notify != nil { + notify(err, next) + } + + t := time.NewTimer(next) + + select { + case <-cb.Context().Done(): + t.Stop() + return err + case <-t.C: + } + } +} + +// PermanentError signals that the operation should not be retried. +type PermanentError struct { + Err error +} + +func (e *PermanentError) Error() string { + return e.Err.Error() +} + +// Permanent wraps the given err in a *PermanentError. +func Permanent(err error) *PermanentError { + return &PermanentError{ + Err: err, + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/cenkalti/backoff/ticker.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/cenkalti/backoff/ticker.go new file mode 100644 index 00000000..49a99718 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/cenkalti/backoff/ticker.go @@ -0,0 +1,81 @@ +package backoff + +import ( + "runtime" + "sync" + "time" +) + +// Ticker holds a channel that delivers `ticks' of a clock at times reported by a BackOff. +// +// Ticks will continue to arrive when the previous operation is still running, +// so operations that take a while to fail could run in quick succession. +type Ticker struct { + C <-chan time.Time + c chan time.Time + b BackOffContext + stop chan struct{} + stopOnce sync.Once +} + +// NewTicker returns a new Ticker containing a channel that will send the time at times +// specified by the BackOff argument. Ticker is guaranteed to tick at least once. +// The channel is closed when Stop method is called or BackOff stops. +func NewTicker(b BackOff) *Ticker { + c := make(chan time.Time) + t := &Ticker{ + C: c, + c: c, + b: ensureContext(b), + stop: make(chan struct{}), + } + go t.run() + runtime.SetFinalizer(t, (*Ticker).Stop) + return t +} + +// Stop turns off a ticker. After Stop, no more ticks will be sent. +func (t *Ticker) Stop() { + t.stopOnce.Do(func() { close(t.stop) }) +} + +func (t *Ticker) run() { + c := t.c + defer close(c) + t.b.Reset() + + // Ticker is guaranteed to tick at least once. + afterC := t.send(time.Now()) + + for { + if afterC == nil { + return + } + + select { + case tick := <-afterC: + afterC = t.send(tick) + case <-t.stop: + t.c = nil // Prevent future ticks from being sent to the channel. + return + case <-t.b.Context().Done(): + return + } + } +} + +func (t *Ticker) send(tick time.Time) <-chan time.Time { + select { + case t.c <- tick: + case <-t.stop: + return nil + } + + next := t.b.NextBackOff() + if next == Stop { + t.Stop() + return nil + } + + return time.After(next) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/cenkalti/backoff/tries.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/cenkalti/backoff/tries.go new file mode 100644 index 00000000..d2da7308 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/cenkalti/backoff/tries.go @@ -0,0 +1,35 @@ +package backoff + +import "time" + +/* +WithMaxTries creates a wrapper around another BackOff, which will +return Stop if NextBackOff() has been called too many times since +the last time Reset() was called + +Note: Implementation is not thread-safe. +*/ +func WithMaxTries(b BackOff, max uint64) BackOff { + return &backOffTries{delegate: b, maxTries: max} +} + +type backOffTries struct { + delegate BackOff + maxTries uint64 + numTries uint64 +} + +func (b *backOffTries) NextBackOff() time.Duration { + if b.maxTries > 0 { + if b.maxTries <= b.numTries { + return Stop + } + b.numTries++ + } + return b.delegate.NextBackOff() +} + +func (b *backOffTries) Reset() { + b.numTries = 0 + b.delegate.Reset() +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/davecgh/go-spew/LICENSE b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/davecgh/go-spew/LICENSE new file mode 100644 index 00000000..bc52e96f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/davecgh/go-spew/LICENSE @@ -0,0 +1,15 @@ +ISC License + +Copyright (c) 2012-2016 Dave Collins + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/davecgh/go-spew/spew/bypass.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/davecgh/go-spew/spew/bypass.go new file mode 100644 index 00000000..79299478 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/davecgh/go-spew/spew/bypass.go @@ -0,0 +1,145 @@ +// Copyright (c) 2015-2016 Dave Collins +// +// Permission to use, copy, modify, and distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +// NOTE: Due to the following build constraints, this file will only be compiled +// when the code is not running on Google App Engine, compiled by GopherJS, and +// "-tags safe" is not added to the go build command line. The "disableunsafe" +// tag is deprecated and thus should not be used. +// Go versions prior to 1.4 are disabled because they use a different layout +// for interfaces which make the implementation of unsafeReflectValue more complex. +// +build !js,!appengine,!safe,!disableunsafe,go1.4 + +package spew + +import ( + "reflect" + "unsafe" +) + +const ( + // UnsafeDisabled is a build-time constant which specifies whether or + // not access to the unsafe package is available. + UnsafeDisabled = false + + // ptrSize is the size of a pointer on the current arch. + ptrSize = unsafe.Sizeof((*byte)(nil)) +) + +type flag uintptr + +var ( + // flagRO indicates whether the value field of a reflect.Value + // is read-only. + flagRO flag + + // flagAddr indicates whether the address of the reflect.Value's + // value may be taken. + flagAddr flag +) + +// flagKindMask holds the bits that make up the kind +// part of the flags field. In all the supported versions, +// it is in the lower 5 bits. +const flagKindMask = flag(0x1f) + +// Different versions of Go have used different +// bit layouts for the flags type. This table +// records the known combinations. +var okFlags = []struct { + ro, addr flag +}{{ + // From Go 1.4 to 1.5 + ro: 1 << 5, + addr: 1 << 7, +}, { + // Up to Go tip. + ro: 1<<5 | 1<<6, + addr: 1 << 8, +}} + +var flagValOffset = func() uintptr { + field, ok := reflect.TypeOf(reflect.Value{}).FieldByName("flag") + if !ok { + panic("reflect.Value has no flag field") + } + return field.Offset +}() + +// flagField returns a pointer to the flag field of a reflect.Value. +func flagField(v *reflect.Value) *flag { + return (*flag)(unsafe.Pointer(uintptr(unsafe.Pointer(v)) + flagValOffset)) +} + +// unsafeReflectValue converts the passed reflect.Value into a one that bypasses +// the typical safety restrictions preventing access to unaddressable and +// unexported data. It works by digging the raw pointer to the underlying +// value out of the protected value and generating a new unprotected (unsafe) +// reflect.Value to it. +// +// This allows us to check for implementations of the Stringer and error +// interfaces to be used for pretty printing ordinarily unaddressable and +// inaccessible values such as unexported struct fields. +func unsafeReflectValue(v reflect.Value) reflect.Value { + if !v.IsValid() || (v.CanInterface() && v.CanAddr()) { + return v + } + flagFieldPtr := flagField(&v) + *flagFieldPtr &^= flagRO + *flagFieldPtr |= flagAddr + return v +} + +// Sanity checks against future reflect package changes +// to the type or semantics of the Value.flag field. +func init() { + field, ok := reflect.TypeOf(reflect.Value{}).FieldByName("flag") + if !ok { + panic("reflect.Value has no flag field") + } + if field.Type.Kind() != reflect.TypeOf(flag(0)).Kind() { + panic("reflect.Value flag field has changed kind") + } + type t0 int + var t struct { + A t0 + // t0 will have flagEmbedRO set. + t0 + // a will have flagStickyRO set + a t0 + } + vA := reflect.ValueOf(t).FieldByName("A") + va := reflect.ValueOf(t).FieldByName("a") + vt0 := reflect.ValueOf(t).FieldByName("t0") + + // Infer flagRO from the difference between the flags + // for the (otherwise identical) fields in t. + flagPublic := *flagField(&vA) + flagWithRO := *flagField(&va) | *flagField(&vt0) + flagRO = flagPublic ^ flagWithRO + + // Infer flagAddr from the difference between a value + // taken from a pointer and not. + vPtrA := reflect.ValueOf(&t).Elem().FieldByName("A") + flagNoPtr := *flagField(&vA) + flagPtr := *flagField(&vPtrA) + flagAddr = flagNoPtr ^ flagPtr + + // Check that the inferred flags tally with one of the known versions. + for _, f := range okFlags { + if flagRO == f.ro && flagAddr == f.addr { + return + } + } + panic("reflect.Value read-only flag has changed semantics") +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/davecgh/go-spew/spew/bypasssafe.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/davecgh/go-spew/spew/bypasssafe.go new file mode 100644 index 00000000..205c28d6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/davecgh/go-spew/spew/bypasssafe.go @@ -0,0 +1,38 @@ +// Copyright (c) 2015-2016 Dave Collins +// +// Permission to use, copy, modify, and distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +// NOTE: Due to the following build constraints, this file will only be compiled +// when the code is running on Google App Engine, compiled by GopherJS, or +// "-tags safe" is added to the go build command line. The "disableunsafe" +// tag is deprecated and thus should not be used. +// +build js appengine safe disableunsafe !go1.4 + +package spew + +import "reflect" + +const ( + // UnsafeDisabled is a build-time constant which specifies whether or + // not access to the unsafe package is available. + UnsafeDisabled = true +) + +// unsafeReflectValue typically converts the passed reflect.Value into a one +// that bypasses the typical safety restrictions preventing access to +// unaddressable and unexported data. However, doing this relies on access to +// the unsafe package. This is a stub version which simply returns the passed +// reflect.Value when the unsafe package is not available. +func unsafeReflectValue(v reflect.Value) reflect.Value { + return v +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/davecgh/go-spew/spew/common.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/davecgh/go-spew/spew/common.go new file mode 100644 index 00000000..1be8ce94 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/davecgh/go-spew/spew/common.go @@ -0,0 +1,341 @@ +/* + * Copyright (c) 2013-2016 Dave Collins + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +package spew + +import ( + "bytes" + "fmt" + "io" + "reflect" + "sort" + "strconv" +) + +// Some constants in the form of bytes to avoid string overhead. This mirrors +// the technique used in the fmt package. +var ( + panicBytes = []byte("(PANIC=") + plusBytes = []byte("+") + iBytes = []byte("i") + trueBytes = []byte("true") + falseBytes = []byte("false") + interfaceBytes = []byte("(interface {})") + commaNewlineBytes = []byte(",\n") + newlineBytes = []byte("\n") + openBraceBytes = []byte("{") + openBraceNewlineBytes = []byte("{\n") + closeBraceBytes = []byte("}") + asteriskBytes = []byte("*") + colonBytes = []byte(":") + colonSpaceBytes = []byte(": ") + openParenBytes = []byte("(") + closeParenBytes = []byte(")") + spaceBytes = []byte(" ") + pointerChainBytes = []byte("->") + nilAngleBytes = []byte("") + maxNewlineBytes = []byte("\n") + maxShortBytes = []byte("") + circularBytes = []byte("") + circularShortBytes = []byte("") + invalidAngleBytes = []byte("") + openBracketBytes = []byte("[") + closeBracketBytes = []byte("]") + percentBytes = []byte("%") + precisionBytes = []byte(".") + openAngleBytes = []byte("<") + closeAngleBytes = []byte(">") + openMapBytes = []byte("map[") + closeMapBytes = []byte("]") + lenEqualsBytes = []byte("len=") + capEqualsBytes = []byte("cap=") +) + +// hexDigits is used to map a decimal value to a hex digit. +var hexDigits = "0123456789abcdef" + +// catchPanic handles any panics that might occur during the handleMethods +// calls. +func catchPanic(w io.Writer, v reflect.Value) { + if err := recover(); err != nil { + w.Write(panicBytes) + fmt.Fprintf(w, "%v", err) + w.Write(closeParenBytes) + } +} + +// handleMethods attempts to call the Error and String methods on the underlying +// type the passed reflect.Value represents and outputes the result to Writer w. +// +// It handles panics in any called methods by catching and displaying the error +// as the formatted value. +func handleMethods(cs *ConfigState, w io.Writer, v reflect.Value) (handled bool) { + // We need an interface to check if the type implements the error or + // Stringer interface. However, the reflect package won't give us an + // interface on certain things like unexported struct fields in order + // to enforce visibility rules. We use unsafe, when it's available, + // to bypass these restrictions since this package does not mutate the + // values. + if !v.CanInterface() { + if UnsafeDisabled { + return false + } + + v = unsafeReflectValue(v) + } + + // Choose whether or not to do error and Stringer interface lookups against + // the base type or a pointer to the base type depending on settings. + // Technically calling one of these methods with a pointer receiver can + // mutate the value, however, types which choose to satisify an error or + // Stringer interface with a pointer receiver should not be mutating their + // state inside these interface methods. + if !cs.DisablePointerMethods && !UnsafeDisabled && !v.CanAddr() { + v = unsafeReflectValue(v) + } + if v.CanAddr() { + v = v.Addr() + } + + // Is it an error or Stringer? + switch iface := v.Interface().(type) { + case error: + defer catchPanic(w, v) + if cs.ContinueOnMethod { + w.Write(openParenBytes) + w.Write([]byte(iface.Error())) + w.Write(closeParenBytes) + w.Write(spaceBytes) + return false + } + + w.Write([]byte(iface.Error())) + return true + + case fmt.Stringer: + defer catchPanic(w, v) + if cs.ContinueOnMethod { + w.Write(openParenBytes) + w.Write([]byte(iface.String())) + w.Write(closeParenBytes) + w.Write(spaceBytes) + return false + } + w.Write([]byte(iface.String())) + return true + } + return false +} + +// printBool outputs a boolean value as true or false to Writer w. +func printBool(w io.Writer, val bool) { + if val { + w.Write(trueBytes) + } else { + w.Write(falseBytes) + } +} + +// printInt outputs a signed integer value to Writer w. +func printInt(w io.Writer, val int64, base int) { + w.Write([]byte(strconv.FormatInt(val, base))) +} + +// printUint outputs an unsigned integer value to Writer w. +func printUint(w io.Writer, val uint64, base int) { + w.Write([]byte(strconv.FormatUint(val, base))) +} + +// printFloat outputs a floating point value using the specified precision, +// which is expected to be 32 or 64bit, to Writer w. +func printFloat(w io.Writer, val float64, precision int) { + w.Write([]byte(strconv.FormatFloat(val, 'g', -1, precision))) +} + +// printComplex outputs a complex value using the specified float precision +// for the real and imaginary parts to Writer w. +func printComplex(w io.Writer, c complex128, floatPrecision int) { + r := real(c) + w.Write(openParenBytes) + w.Write([]byte(strconv.FormatFloat(r, 'g', -1, floatPrecision))) + i := imag(c) + if i >= 0 { + w.Write(plusBytes) + } + w.Write([]byte(strconv.FormatFloat(i, 'g', -1, floatPrecision))) + w.Write(iBytes) + w.Write(closeParenBytes) +} + +// printHexPtr outputs a uintptr formatted as hexadecimal with a leading '0x' +// prefix to Writer w. +func printHexPtr(w io.Writer, p uintptr) { + // Null pointer. + num := uint64(p) + if num == 0 { + w.Write(nilAngleBytes) + return + } + + // Max uint64 is 16 bytes in hex + 2 bytes for '0x' prefix + buf := make([]byte, 18) + + // It's simpler to construct the hex string right to left. + base := uint64(16) + i := len(buf) - 1 + for num >= base { + buf[i] = hexDigits[num%base] + num /= base + i-- + } + buf[i] = hexDigits[num] + + // Add '0x' prefix. + i-- + buf[i] = 'x' + i-- + buf[i] = '0' + + // Strip unused leading bytes. + buf = buf[i:] + w.Write(buf) +} + +// valuesSorter implements sort.Interface to allow a slice of reflect.Value +// elements to be sorted. +type valuesSorter struct { + values []reflect.Value + strings []string // either nil or same len and values + cs *ConfigState +} + +// newValuesSorter initializes a valuesSorter instance, which holds a set of +// surrogate keys on which the data should be sorted. It uses flags in +// ConfigState to decide if and how to populate those surrogate keys. +func newValuesSorter(values []reflect.Value, cs *ConfigState) sort.Interface { + vs := &valuesSorter{values: values, cs: cs} + if canSortSimply(vs.values[0].Kind()) { + return vs + } + if !cs.DisableMethods { + vs.strings = make([]string, len(values)) + for i := range vs.values { + b := bytes.Buffer{} + if !handleMethods(cs, &b, vs.values[i]) { + vs.strings = nil + break + } + vs.strings[i] = b.String() + } + } + if vs.strings == nil && cs.SpewKeys { + vs.strings = make([]string, len(values)) + for i := range vs.values { + vs.strings[i] = Sprintf("%#v", vs.values[i].Interface()) + } + } + return vs +} + +// canSortSimply tests whether a reflect.Kind is a primitive that can be sorted +// directly, or whether it should be considered for sorting by surrogate keys +// (if the ConfigState allows it). +func canSortSimply(kind reflect.Kind) bool { + // This switch parallels valueSortLess, except for the default case. + switch kind { + case reflect.Bool: + return true + case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int: + return true + case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint: + return true + case reflect.Float32, reflect.Float64: + return true + case reflect.String: + return true + case reflect.Uintptr: + return true + case reflect.Array: + return true + } + return false +} + +// Len returns the number of values in the slice. It is part of the +// sort.Interface implementation. +func (s *valuesSorter) Len() int { + return len(s.values) +} + +// Swap swaps the values at the passed indices. It is part of the +// sort.Interface implementation. +func (s *valuesSorter) Swap(i, j int) { + s.values[i], s.values[j] = s.values[j], s.values[i] + if s.strings != nil { + s.strings[i], s.strings[j] = s.strings[j], s.strings[i] + } +} + +// valueSortLess returns whether the first value should sort before the second +// value. It is used by valueSorter.Less as part of the sort.Interface +// implementation. +func valueSortLess(a, b reflect.Value) bool { + switch a.Kind() { + case reflect.Bool: + return !a.Bool() && b.Bool() + case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int: + return a.Int() < b.Int() + case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint: + return a.Uint() < b.Uint() + case reflect.Float32, reflect.Float64: + return a.Float() < b.Float() + case reflect.String: + return a.String() < b.String() + case reflect.Uintptr: + return a.Uint() < b.Uint() + case reflect.Array: + // Compare the contents of both arrays. + l := a.Len() + for i := 0; i < l; i++ { + av := a.Index(i) + bv := b.Index(i) + if av.Interface() == bv.Interface() { + continue + } + return valueSortLess(av, bv) + } + } + return a.String() < b.String() +} + +// Less returns whether the value at index i should sort before the +// value at index j. It is part of the sort.Interface implementation. +func (s *valuesSorter) Less(i, j int) bool { + if s.strings == nil { + return valueSortLess(s.values[i], s.values[j]) + } + return s.strings[i] < s.strings[j] +} + +// sortValues is a sort function that handles both native types and any type that +// can be converted to error or Stringer. Other inputs are sorted according to +// their Value.String() value to ensure display stability. +func sortValues(values []reflect.Value, cs *ConfigState) { + if len(values) == 0 { + return + } + sort.Sort(newValuesSorter(values, cs)) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/davecgh/go-spew/spew/config.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/davecgh/go-spew/spew/config.go new file mode 100644 index 00000000..2e3d22f3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/davecgh/go-spew/spew/config.go @@ -0,0 +1,306 @@ +/* + * Copyright (c) 2013-2016 Dave Collins + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +package spew + +import ( + "bytes" + "fmt" + "io" + "os" +) + +// ConfigState houses the configuration options used by spew to format and +// display values. There is a global instance, Config, that is used to control +// all top-level Formatter and Dump functionality. Each ConfigState instance +// provides methods equivalent to the top-level functions. +// +// The zero value for ConfigState provides no indentation. You would typically +// want to set it to a space or a tab. +// +// Alternatively, you can use NewDefaultConfig to get a ConfigState instance +// with default settings. See the documentation of NewDefaultConfig for default +// values. +type ConfigState struct { + // Indent specifies the string to use for each indentation level. The + // global config instance that all top-level functions use set this to a + // single space by default. If you would like more indentation, you might + // set this to a tab with "\t" or perhaps two spaces with " ". + Indent string + + // MaxDepth controls the maximum number of levels to descend into nested + // data structures. The default, 0, means there is no limit. + // + // NOTE: Circular data structures are properly detected, so it is not + // necessary to set this value unless you specifically want to limit deeply + // nested data structures. + MaxDepth int + + // DisableMethods specifies whether or not error and Stringer interfaces are + // invoked for types that implement them. + DisableMethods bool + + // DisablePointerMethods specifies whether or not to check for and invoke + // error and Stringer interfaces on types which only accept a pointer + // receiver when the current type is not a pointer. + // + // NOTE: This might be an unsafe action since calling one of these methods + // with a pointer receiver could technically mutate the value, however, + // in practice, types which choose to satisify an error or Stringer + // interface with a pointer receiver should not be mutating their state + // inside these interface methods. As a result, this option relies on + // access to the unsafe package, so it will not have any effect when + // running in environments without access to the unsafe package such as + // Google App Engine or with the "safe" build tag specified. + DisablePointerMethods bool + + // DisablePointerAddresses specifies whether to disable the printing of + // pointer addresses. This is useful when diffing data structures in tests. + DisablePointerAddresses bool + + // DisableCapacities specifies whether to disable the printing of capacities + // for arrays, slices, maps and channels. This is useful when diffing + // data structures in tests. + DisableCapacities bool + + // ContinueOnMethod specifies whether or not recursion should continue once + // a custom error or Stringer interface is invoked. The default, false, + // means it will print the results of invoking the custom error or Stringer + // interface and return immediately instead of continuing to recurse into + // the internals of the data type. + // + // NOTE: This flag does not have any effect if method invocation is disabled + // via the DisableMethods or DisablePointerMethods options. + ContinueOnMethod bool + + // SortKeys specifies map keys should be sorted before being printed. Use + // this to have a more deterministic, diffable output. Note that only + // native types (bool, int, uint, floats, uintptr and string) and types + // that support the error or Stringer interfaces (if methods are + // enabled) are supported, with other types sorted according to the + // reflect.Value.String() output which guarantees display stability. + SortKeys bool + + // SpewKeys specifies that, as a last resort attempt, map keys should + // be spewed to strings and sorted by those strings. This is only + // considered if SortKeys is true. + SpewKeys bool +} + +// Config is the active configuration of the top-level functions. +// The configuration can be changed by modifying the contents of spew.Config. +var Config = ConfigState{Indent: " "} + +// Errorf is a wrapper for fmt.Errorf that treats each argument as if it were +// passed with a Formatter interface returned by c.NewFormatter. It returns +// the formatted string as a value that satisfies error. See NewFormatter +// for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Errorf(format, c.NewFormatter(a), c.NewFormatter(b)) +func (c *ConfigState) Errorf(format string, a ...interface{}) (err error) { + return fmt.Errorf(format, c.convertArgs(a)...) +} + +// Fprint is a wrapper for fmt.Fprint that treats each argument as if it were +// passed with a Formatter interface returned by c.NewFormatter. It returns +// the number of bytes written and any write error encountered. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Fprint(w, c.NewFormatter(a), c.NewFormatter(b)) +func (c *ConfigState) Fprint(w io.Writer, a ...interface{}) (n int, err error) { + return fmt.Fprint(w, c.convertArgs(a)...) +} + +// Fprintf is a wrapper for fmt.Fprintf that treats each argument as if it were +// passed with a Formatter interface returned by c.NewFormatter. It returns +// the number of bytes written and any write error encountered. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Fprintf(w, format, c.NewFormatter(a), c.NewFormatter(b)) +func (c *ConfigState) Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error) { + return fmt.Fprintf(w, format, c.convertArgs(a)...) +} + +// Fprintln is a wrapper for fmt.Fprintln that treats each argument as if it +// passed with a Formatter interface returned by c.NewFormatter. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Fprintln(w, c.NewFormatter(a), c.NewFormatter(b)) +func (c *ConfigState) Fprintln(w io.Writer, a ...interface{}) (n int, err error) { + return fmt.Fprintln(w, c.convertArgs(a)...) +} + +// Print is a wrapper for fmt.Print that treats each argument as if it were +// passed with a Formatter interface returned by c.NewFormatter. It returns +// the number of bytes written and any write error encountered. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Print(c.NewFormatter(a), c.NewFormatter(b)) +func (c *ConfigState) Print(a ...interface{}) (n int, err error) { + return fmt.Print(c.convertArgs(a)...) +} + +// Printf is a wrapper for fmt.Printf that treats each argument as if it were +// passed with a Formatter interface returned by c.NewFormatter. It returns +// the number of bytes written and any write error encountered. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Printf(format, c.NewFormatter(a), c.NewFormatter(b)) +func (c *ConfigState) Printf(format string, a ...interface{}) (n int, err error) { + return fmt.Printf(format, c.convertArgs(a)...) +} + +// Println is a wrapper for fmt.Println that treats each argument as if it were +// passed with a Formatter interface returned by c.NewFormatter. It returns +// the number of bytes written and any write error encountered. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Println(c.NewFormatter(a), c.NewFormatter(b)) +func (c *ConfigState) Println(a ...interface{}) (n int, err error) { + return fmt.Println(c.convertArgs(a)...) +} + +// Sprint is a wrapper for fmt.Sprint that treats each argument as if it were +// passed with a Formatter interface returned by c.NewFormatter. It returns +// the resulting string. See NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Sprint(c.NewFormatter(a), c.NewFormatter(b)) +func (c *ConfigState) Sprint(a ...interface{}) string { + return fmt.Sprint(c.convertArgs(a)...) +} + +// Sprintf is a wrapper for fmt.Sprintf that treats each argument as if it were +// passed with a Formatter interface returned by c.NewFormatter. It returns +// the resulting string. See NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Sprintf(format, c.NewFormatter(a), c.NewFormatter(b)) +func (c *ConfigState) Sprintf(format string, a ...interface{}) string { + return fmt.Sprintf(format, c.convertArgs(a)...) +} + +// Sprintln is a wrapper for fmt.Sprintln that treats each argument as if it +// were passed with a Formatter interface returned by c.NewFormatter. It +// returns the resulting string. See NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Sprintln(c.NewFormatter(a), c.NewFormatter(b)) +func (c *ConfigState) Sprintln(a ...interface{}) string { + return fmt.Sprintln(c.convertArgs(a)...) +} + +/* +NewFormatter returns a custom formatter that satisfies the fmt.Formatter +interface. As a result, it integrates cleanly with standard fmt package +printing functions. The formatter is useful for inline printing of smaller data +types similar to the standard %v format specifier. + +The custom formatter only responds to the %v (most compact), %+v (adds pointer +addresses), %#v (adds types), and %#+v (adds types and pointer addresses) verb +combinations. Any other verbs such as %x and %q will be sent to the the +standard fmt package for formatting. In addition, the custom formatter ignores +the width and precision arguments (however they will still work on the format +specifiers not handled by the custom formatter). + +Typically this function shouldn't be called directly. It is much easier to make +use of the custom formatter by calling one of the convenience functions such as +c.Printf, c.Println, or c.Printf. +*/ +func (c *ConfigState) NewFormatter(v interface{}) fmt.Formatter { + return newFormatter(c, v) +} + +// Fdump formats and displays the passed arguments to io.Writer w. It formats +// exactly the same as Dump. +func (c *ConfigState) Fdump(w io.Writer, a ...interface{}) { + fdump(c, w, a...) +} + +/* +Dump displays the passed parameters to standard out with newlines, customizable +indentation, and additional debug information such as complete types and all +pointer addresses used to indirect to the final value. It provides the +following features over the built-in printing facilities provided by the fmt +package: + + * Pointers are dereferenced and followed + * Circular data structures are detected and handled properly + * Custom Stringer/error interfaces are optionally invoked, including + on unexported types + * Custom types which only implement the Stringer/error interfaces via + a pointer receiver are optionally invoked when passing non-pointer + variables + * Byte arrays and slices are dumped like the hexdump -C command which + includes offsets, byte values in hex, and ASCII output + +The configuration options are controlled by modifying the public members +of c. See ConfigState for options documentation. + +See Fdump if you would prefer dumping to an arbitrary io.Writer or Sdump to +get the formatted result as a string. +*/ +func (c *ConfigState) Dump(a ...interface{}) { + fdump(c, os.Stdout, a...) +} + +// Sdump returns a string with the passed arguments formatted exactly the same +// as Dump. +func (c *ConfigState) Sdump(a ...interface{}) string { + var buf bytes.Buffer + fdump(c, &buf, a...) + return buf.String() +} + +// convertArgs accepts a slice of arguments and returns a slice of the same +// length with each argument converted to a spew Formatter interface using +// the ConfigState associated with s. +func (c *ConfigState) convertArgs(args []interface{}) (formatters []interface{}) { + formatters = make([]interface{}, len(args)) + for index, arg := range args { + formatters[index] = newFormatter(c, arg) + } + return formatters +} + +// NewDefaultConfig returns a ConfigState with the following default settings. +// +// Indent: " " +// MaxDepth: 0 +// DisableMethods: false +// DisablePointerMethods: false +// ContinueOnMethod: false +// SortKeys: false +func NewDefaultConfig() *ConfigState { + return &ConfigState{Indent: " "} +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/davecgh/go-spew/spew/doc.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/davecgh/go-spew/spew/doc.go new file mode 100644 index 00000000..aacaac6f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/davecgh/go-spew/spew/doc.go @@ -0,0 +1,211 @@ +/* + * Copyright (c) 2013-2016 Dave Collins + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* +Package spew implements a deep pretty printer for Go data structures to aid in +debugging. + +A quick overview of the additional features spew provides over the built-in +printing facilities for Go data types are as follows: + + * Pointers are dereferenced and followed + * Circular data structures are detected and handled properly + * Custom Stringer/error interfaces are optionally invoked, including + on unexported types + * Custom types which only implement the Stringer/error interfaces via + a pointer receiver are optionally invoked when passing non-pointer + variables + * Byte arrays and slices are dumped like the hexdump -C command which + includes offsets, byte values in hex, and ASCII output (only when using + Dump style) + +There are two different approaches spew allows for dumping Go data structures: + + * Dump style which prints with newlines, customizable indentation, + and additional debug information such as types and all pointer addresses + used to indirect to the final value + * A custom Formatter interface that integrates cleanly with the standard fmt + package and replaces %v, %+v, %#v, and %#+v to provide inline printing + similar to the default %v while providing the additional functionality + outlined above and passing unsupported format verbs such as %x and %q + along to fmt + +Quick Start + +This section demonstrates how to quickly get started with spew. See the +sections below for further details on formatting and configuration options. + +To dump a variable with full newlines, indentation, type, and pointer +information use Dump, Fdump, or Sdump: + spew.Dump(myVar1, myVar2, ...) + spew.Fdump(someWriter, myVar1, myVar2, ...) + str := spew.Sdump(myVar1, myVar2, ...) + +Alternatively, if you would prefer to use format strings with a compacted inline +printing style, use the convenience wrappers Printf, Fprintf, etc with +%v (most compact), %+v (adds pointer addresses), %#v (adds types), or +%#+v (adds types and pointer addresses): + spew.Printf("myVar1: %v -- myVar2: %+v", myVar1, myVar2) + spew.Printf("myVar3: %#v -- myVar4: %#+v", myVar3, myVar4) + spew.Fprintf(someWriter, "myVar1: %v -- myVar2: %+v", myVar1, myVar2) + spew.Fprintf(someWriter, "myVar3: %#v -- myVar4: %#+v", myVar3, myVar4) + +Configuration Options + +Configuration of spew is handled by fields in the ConfigState type. For +convenience, all of the top-level functions use a global state available +via the spew.Config global. + +It is also possible to create a ConfigState instance that provides methods +equivalent to the top-level functions. This allows concurrent configuration +options. See the ConfigState documentation for more details. + +The following configuration options are available: + * Indent + String to use for each indentation level for Dump functions. + It is a single space by default. A popular alternative is "\t". + + * MaxDepth + Maximum number of levels to descend into nested data structures. + There is no limit by default. + + * DisableMethods + Disables invocation of error and Stringer interface methods. + Method invocation is enabled by default. + + * DisablePointerMethods + Disables invocation of error and Stringer interface methods on types + which only accept pointer receivers from non-pointer variables. + Pointer method invocation is enabled by default. + + * DisablePointerAddresses + DisablePointerAddresses specifies whether to disable the printing of + pointer addresses. This is useful when diffing data structures in tests. + + * DisableCapacities + DisableCapacities specifies whether to disable the printing of + capacities for arrays, slices, maps and channels. This is useful when + diffing data structures in tests. + + * ContinueOnMethod + Enables recursion into types after invoking error and Stringer interface + methods. Recursion after method invocation is disabled by default. + + * SortKeys + Specifies map keys should be sorted before being printed. Use + this to have a more deterministic, diffable output. Note that + only native types (bool, int, uint, floats, uintptr and string) + and types which implement error or Stringer interfaces are + supported with other types sorted according to the + reflect.Value.String() output which guarantees display + stability. Natural map order is used by default. + + * SpewKeys + Specifies that, as a last resort attempt, map keys should be + spewed to strings and sorted by those strings. This is only + considered if SortKeys is true. + +Dump Usage + +Simply call spew.Dump with a list of variables you want to dump: + + spew.Dump(myVar1, myVar2, ...) + +You may also call spew.Fdump if you would prefer to output to an arbitrary +io.Writer. For example, to dump to standard error: + + spew.Fdump(os.Stderr, myVar1, myVar2, ...) + +A third option is to call spew.Sdump to get the formatted output as a string: + + str := spew.Sdump(myVar1, myVar2, ...) + +Sample Dump Output + +See the Dump example for details on the setup of the types and variables being +shown here. + + (main.Foo) { + unexportedField: (*main.Bar)(0xf84002e210)({ + flag: (main.Flag) flagTwo, + data: (uintptr) + }), + ExportedField: (map[interface {}]interface {}) (len=1) { + (string) (len=3) "one": (bool) true + } + } + +Byte (and uint8) arrays and slices are displayed uniquely like the hexdump -C +command as shown. + ([]uint8) (len=32 cap=32) { + 00000000 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 |............... | + 00000010 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 |!"#$%&'()*+,-./0| + 00000020 31 32 |12| + } + +Custom Formatter + +Spew provides a custom formatter that implements the fmt.Formatter interface +so that it integrates cleanly with standard fmt package printing functions. The +formatter is useful for inline printing of smaller data types similar to the +standard %v format specifier. + +The custom formatter only responds to the %v (most compact), %+v (adds pointer +addresses), %#v (adds types), or %#+v (adds types and pointer addresses) verb +combinations. Any other verbs such as %x and %q will be sent to the the +standard fmt package for formatting. In addition, the custom formatter ignores +the width and precision arguments (however they will still work on the format +specifiers not handled by the custom formatter). + +Custom Formatter Usage + +The simplest way to make use of the spew custom formatter is to call one of the +convenience functions such as spew.Printf, spew.Println, or spew.Printf. The +functions have syntax you are most likely already familiar with: + + spew.Printf("myVar1: %v -- myVar2: %+v", myVar1, myVar2) + spew.Printf("myVar3: %#v -- myVar4: %#+v", myVar3, myVar4) + spew.Println(myVar, myVar2) + spew.Fprintf(os.Stderr, "myVar1: %v -- myVar2: %+v", myVar1, myVar2) + spew.Fprintf(os.Stderr, "myVar3: %#v -- myVar4: %#+v", myVar3, myVar4) + +See the Index for the full list convenience functions. + +Sample Formatter Output + +Double pointer to a uint8: + %v: <**>5 + %+v: <**>(0xf8400420d0->0xf8400420c8)5 + %#v: (**uint8)5 + %#+v: (**uint8)(0xf8400420d0->0xf8400420c8)5 + +Pointer to circular struct with a uint8 field and a pointer to itself: + %v: <*>{1 <*>} + %+v: <*>(0xf84003e260){ui8:1 c:<*>(0xf84003e260)} + %#v: (*main.circular){ui8:(uint8)1 c:(*main.circular)} + %#+v: (*main.circular)(0xf84003e260){ui8:(uint8)1 c:(*main.circular)(0xf84003e260)} + +See the Printf example for details on the setup of variables being shown +here. + +Errors + +Since it is possible for custom Stringer/error interfaces to panic, spew +detects them and handles them internally by printing the panic information +inline with the output. Since spew is intended to provide deep pretty printing +capabilities on structures, it intentionally does not return any errors. +*/ +package spew diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/davecgh/go-spew/spew/dump.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/davecgh/go-spew/spew/dump.go new file mode 100644 index 00000000..f78d89fc --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/davecgh/go-spew/spew/dump.go @@ -0,0 +1,509 @@ +/* + * Copyright (c) 2013-2016 Dave Collins + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +package spew + +import ( + "bytes" + "encoding/hex" + "fmt" + "io" + "os" + "reflect" + "regexp" + "strconv" + "strings" +) + +var ( + // uint8Type is a reflect.Type representing a uint8. It is used to + // convert cgo types to uint8 slices for hexdumping. + uint8Type = reflect.TypeOf(uint8(0)) + + // cCharRE is a regular expression that matches a cgo char. + // It is used to detect character arrays to hexdump them. + cCharRE = regexp.MustCompile(`^.*\._Ctype_char$`) + + // cUnsignedCharRE is a regular expression that matches a cgo unsigned + // char. It is used to detect unsigned character arrays to hexdump + // them. + cUnsignedCharRE = regexp.MustCompile(`^.*\._Ctype_unsignedchar$`) + + // cUint8tCharRE is a regular expression that matches a cgo uint8_t. + // It is used to detect uint8_t arrays to hexdump them. + cUint8tCharRE = regexp.MustCompile(`^.*\._Ctype_uint8_t$`) +) + +// dumpState contains information about the state of a dump operation. +type dumpState struct { + w io.Writer + depth int + pointers map[uintptr]int + ignoreNextType bool + ignoreNextIndent bool + cs *ConfigState +} + +// indent performs indentation according to the depth level and cs.Indent +// option. +func (d *dumpState) indent() { + if d.ignoreNextIndent { + d.ignoreNextIndent = false + return + } + d.w.Write(bytes.Repeat([]byte(d.cs.Indent), d.depth)) +} + +// unpackValue returns values inside of non-nil interfaces when possible. +// This is useful for data types like structs, arrays, slices, and maps which +// can contain varying types packed inside an interface. +func (d *dumpState) unpackValue(v reflect.Value) reflect.Value { + if v.Kind() == reflect.Interface && !v.IsNil() { + v = v.Elem() + } + return v +} + +// dumpPtr handles formatting of pointers by indirecting them as necessary. +func (d *dumpState) dumpPtr(v reflect.Value) { + // Remove pointers at or below the current depth from map used to detect + // circular refs. + for k, depth := range d.pointers { + if depth >= d.depth { + delete(d.pointers, k) + } + } + + // Keep list of all dereferenced pointers to show later. + pointerChain := make([]uintptr, 0) + + // Figure out how many levels of indirection there are by dereferencing + // pointers and unpacking interfaces down the chain while detecting circular + // references. + nilFound := false + cycleFound := false + indirects := 0 + ve := v + for ve.Kind() == reflect.Ptr { + if ve.IsNil() { + nilFound = true + break + } + indirects++ + addr := ve.Pointer() + pointerChain = append(pointerChain, addr) + if pd, ok := d.pointers[addr]; ok && pd < d.depth { + cycleFound = true + indirects-- + break + } + d.pointers[addr] = d.depth + + ve = ve.Elem() + if ve.Kind() == reflect.Interface { + if ve.IsNil() { + nilFound = true + break + } + ve = ve.Elem() + } + } + + // Display type information. + d.w.Write(openParenBytes) + d.w.Write(bytes.Repeat(asteriskBytes, indirects)) + d.w.Write([]byte(ve.Type().String())) + d.w.Write(closeParenBytes) + + // Display pointer information. + if !d.cs.DisablePointerAddresses && len(pointerChain) > 0 { + d.w.Write(openParenBytes) + for i, addr := range pointerChain { + if i > 0 { + d.w.Write(pointerChainBytes) + } + printHexPtr(d.w, addr) + } + d.w.Write(closeParenBytes) + } + + // Display dereferenced value. + d.w.Write(openParenBytes) + switch { + case nilFound: + d.w.Write(nilAngleBytes) + + case cycleFound: + d.w.Write(circularBytes) + + default: + d.ignoreNextType = true + d.dump(ve) + } + d.w.Write(closeParenBytes) +} + +// dumpSlice handles formatting of arrays and slices. Byte (uint8 under +// reflection) arrays and slices are dumped in hexdump -C fashion. +func (d *dumpState) dumpSlice(v reflect.Value) { + // Determine whether this type should be hex dumped or not. Also, + // for types which should be hexdumped, try to use the underlying data + // first, then fall back to trying to convert them to a uint8 slice. + var buf []uint8 + doConvert := false + doHexDump := false + numEntries := v.Len() + if numEntries > 0 { + vt := v.Index(0).Type() + vts := vt.String() + switch { + // C types that need to be converted. + case cCharRE.MatchString(vts): + fallthrough + case cUnsignedCharRE.MatchString(vts): + fallthrough + case cUint8tCharRE.MatchString(vts): + doConvert = true + + // Try to use existing uint8 slices and fall back to converting + // and copying if that fails. + case vt.Kind() == reflect.Uint8: + // We need an addressable interface to convert the type + // to a byte slice. However, the reflect package won't + // give us an interface on certain things like + // unexported struct fields in order to enforce + // visibility rules. We use unsafe, when available, to + // bypass these restrictions since this package does not + // mutate the values. + vs := v + if !vs.CanInterface() || !vs.CanAddr() { + vs = unsafeReflectValue(vs) + } + if !UnsafeDisabled { + vs = vs.Slice(0, numEntries) + + // Use the existing uint8 slice if it can be + // type asserted. + iface := vs.Interface() + if slice, ok := iface.([]uint8); ok { + buf = slice + doHexDump = true + break + } + } + + // The underlying data needs to be converted if it can't + // be type asserted to a uint8 slice. + doConvert = true + } + + // Copy and convert the underlying type if needed. + if doConvert && vt.ConvertibleTo(uint8Type) { + // Convert and copy each element into a uint8 byte + // slice. + buf = make([]uint8, numEntries) + for i := 0; i < numEntries; i++ { + vv := v.Index(i) + buf[i] = uint8(vv.Convert(uint8Type).Uint()) + } + doHexDump = true + } + } + + // Hexdump the entire slice as needed. + if doHexDump { + indent := strings.Repeat(d.cs.Indent, d.depth) + str := indent + hex.Dump(buf) + str = strings.Replace(str, "\n", "\n"+indent, -1) + str = strings.TrimRight(str, d.cs.Indent) + d.w.Write([]byte(str)) + return + } + + // Recursively call dump for each item. + for i := 0; i < numEntries; i++ { + d.dump(d.unpackValue(v.Index(i))) + if i < (numEntries - 1) { + d.w.Write(commaNewlineBytes) + } else { + d.w.Write(newlineBytes) + } + } +} + +// dump is the main workhorse for dumping a value. It uses the passed reflect +// value to figure out what kind of object we are dealing with and formats it +// appropriately. It is a recursive function, however circular data structures +// are detected and handled properly. +func (d *dumpState) dump(v reflect.Value) { + // Handle invalid reflect values immediately. + kind := v.Kind() + if kind == reflect.Invalid { + d.w.Write(invalidAngleBytes) + return + } + + // Handle pointers specially. + if kind == reflect.Ptr { + d.indent() + d.dumpPtr(v) + return + } + + // Print type information unless already handled elsewhere. + if !d.ignoreNextType { + d.indent() + d.w.Write(openParenBytes) + d.w.Write([]byte(v.Type().String())) + d.w.Write(closeParenBytes) + d.w.Write(spaceBytes) + } + d.ignoreNextType = false + + // Display length and capacity if the built-in len and cap functions + // work with the value's kind and the len/cap itself is non-zero. + valueLen, valueCap := 0, 0 + switch v.Kind() { + case reflect.Array, reflect.Slice, reflect.Chan: + valueLen, valueCap = v.Len(), v.Cap() + case reflect.Map, reflect.String: + valueLen = v.Len() + } + if valueLen != 0 || !d.cs.DisableCapacities && valueCap != 0 { + d.w.Write(openParenBytes) + if valueLen != 0 { + d.w.Write(lenEqualsBytes) + printInt(d.w, int64(valueLen), 10) + } + if !d.cs.DisableCapacities && valueCap != 0 { + if valueLen != 0 { + d.w.Write(spaceBytes) + } + d.w.Write(capEqualsBytes) + printInt(d.w, int64(valueCap), 10) + } + d.w.Write(closeParenBytes) + d.w.Write(spaceBytes) + } + + // Call Stringer/error interfaces if they exist and the handle methods flag + // is enabled + if !d.cs.DisableMethods { + if (kind != reflect.Invalid) && (kind != reflect.Interface) { + if handled := handleMethods(d.cs, d.w, v); handled { + return + } + } + } + + switch kind { + case reflect.Invalid: + // Do nothing. We should never get here since invalid has already + // been handled above. + + case reflect.Bool: + printBool(d.w, v.Bool()) + + case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int: + printInt(d.w, v.Int(), 10) + + case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint: + printUint(d.w, v.Uint(), 10) + + case reflect.Float32: + printFloat(d.w, v.Float(), 32) + + case reflect.Float64: + printFloat(d.w, v.Float(), 64) + + case reflect.Complex64: + printComplex(d.w, v.Complex(), 32) + + case reflect.Complex128: + printComplex(d.w, v.Complex(), 64) + + case reflect.Slice: + if v.IsNil() { + d.w.Write(nilAngleBytes) + break + } + fallthrough + + case reflect.Array: + d.w.Write(openBraceNewlineBytes) + d.depth++ + if (d.cs.MaxDepth != 0) && (d.depth > d.cs.MaxDepth) { + d.indent() + d.w.Write(maxNewlineBytes) + } else { + d.dumpSlice(v) + } + d.depth-- + d.indent() + d.w.Write(closeBraceBytes) + + case reflect.String: + d.w.Write([]byte(strconv.Quote(v.String()))) + + case reflect.Interface: + // The only time we should get here is for nil interfaces due to + // unpackValue calls. + if v.IsNil() { + d.w.Write(nilAngleBytes) + } + + case reflect.Ptr: + // Do nothing. We should never get here since pointers have already + // been handled above. + + case reflect.Map: + // nil maps should be indicated as different than empty maps + if v.IsNil() { + d.w.Write(nilAngleBytes) + break + } + + d.w.Write(openBraceNewlineBytes) + d.depth++ + if (d.cs.MaxDepth != 0) && (d.depth > d.cs.MaxDepth) { + d.indent() + d.w.Write(maxNewlineBytes) + } else { + numEntries := v.Len() + keys := v.MapKeys() + if d.cs.SortKeys { + sortValues(keys, d.cs) + } + for i, key := range keys { + d.dump(d.unpackValue(key)) + d.w.Write(colonSpaceBytes) + d.ignoreNextIndent = true + d.dump(d.unpackValue(v.MapIndex(key))) + if i < (numEntries - 1) { + d.w.Write(commaNewlineBytes) + } else { + d.w.Write(newlineBytes) + } + } + } + d.depth-- + d.indent() + d.w.Write(closeBraceBytes) + + case reflect.Struct: + d.w.Write(openBraceNewlineBytes) + d.depth++ + if (d.cs.MaxDepth != 0) && (d.depth > d.cs.MaxDepth) { + d.indent() + d.w.Write(maxNewlineBytes) + } else { + vt := v.Type() + numFields := v.NumField() + for i := 0; i < numFields; i++ { + d.indent() + vtf := vt.Field(i) + d.w.Write([]byte(vtf.Name)) + d.w.Write(colonSpaceBytes) + d.ignoreNextIndent = true + d.dump(d.unpackValue(v.Field(i))) + if i < (numFields - 1) { + d.w.Write(commaNewlineBytes) + } else { + d.w.Write(newlineBytes) + } + } + } + d.depth-- + d.indent() + d.w.Write(closeBraceBytes) + + case reflect.Uintptr: + printHexPtr(d.w, uintptr(v.Uint())) + + case reflect.UnsafePointer, reflect.Chan, reflect.Func: + printHexPtr(d.w, v.Pointer()) + + // There were not any other types at the time this code was written, but + // fall back to letting the default fmt package handle it in case any new + // types are added. + default: + if v.CanInterface() { + fmt.Fprintf(d.w, "%v", v.Interface()) + } else { + fmt.Fprintf(d.w, "%v", v.String()) + } + } +} + +// fdump is a helper function to consolidate the logic from the various public +// methods which take varying writers and config states. +func fdump(cs *ConfigState, w io.Writer, a ...interface{}) { + for _, arg := range a { + if arg == nil { + w.Write(interfaceBytes) + w.Write(spaceBytes) + w.Write(nilAngleBytes) + w.Write(newlineBytes) + continue + } + + d := dumpState{w: w, cs: cs} + d.pointers = make(map[uintptr]int) + d.dump(reflect.ValueOf(arg)) + d.w.Write(newlineBytes) + } +} + +// Fdump formats and displays the passed arguments to io.Writer w. It formats +// exactly the same as Dump. +func Fdump(w io.Writer, a ...interface{}) { + fdump(&Config, w, a...) +} + +// Sdump returns a string with the passed arguments formatted exactly the same +// as Dump. +func Sdump(a ...interface{}) string { + var buf bytes.Buffer + fdump(&Config, &buf, a...) + return buf.String() +} + +/* +Dump displays the passed parameters to standard out with newlines, customizable +indentation, and additional debug information such as complete types and all +pointer addresses used to indirect to the final value. It provides the +following features over the built-in printing facilities provided by the fmt +package: + + * Pointers are dereferenced and followed + * Circular data structures are detected and handled properly + * Custom Stringer/error interfaces are optionally invoked, including + on unexported types + * Custom types which only implement the Stringer/error interfaces via + a pointer receiver are optionally invoked when passing non-pointer + variables + * Byte arrays and slices are dumped like the hexdump -C command which + includes offsets, byte values in hex, and ASCII output + +The configuration options are controlled by an exported package global, +spew.Config. See ConfigState for options documentation. + +See Fdump if you would prefer dumping to an arbitrary io.Writer or Sdump to +get the formatted result as a string. +*/ +func Dump(a ...interface{}) { + fdump(&Config, os.Stdout, a...) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/davecgh/go-spew/spew/format.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/davecgh/go-spew/spew/format.go new file mode 100644 index 00000000..b04edb7d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/davecgh/go-spew/spew/format.go @@ -0,0 +1,419 @@ +/* + * Copyright (c) 2013-2016 Dave Collins + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +package spew + +import ( + "bytes" + "fmt" + "reflect" + "strconv" + "strings" +) + +// supportedFlags is a list of all the character flags supported by fmt package. +const supportedFlags = "0-+# " + +// formatState implements the fmt.Formatter interface and contains information +// about the state of a formatting operation. The NewFormatter function can +// be used to get a new Formatter which can be used directly as arguments +// in standard fmt package printing calls. +type formatState struct { + value interface{} + fs fmt.State + depth int + pointers map[uintptr]int + ignoreNextType bool + cs *ConfigState +} + +// buildDefaultFormat recreates the original format string without precision +// and width information to pass in to fmt.Sprintf in the case of an +// unrecognized type. Unless new types are added to the language, this +// function won't ever be called. +func (f *formatState) buildDefaultFormat() (format string) { + buf := bytes.NewBuffer(percentBytes) + + for _, flag := range supportedFlags { + if f.fs.Flag(int(flag)) { + buf.WriteRune(flag) + } + } + + buf.WriteRune('v') + + format = buf.String() + return format +} + +// constructOrigFormat recreates the original format string including precision +// and width information to pass along to the standard fmt package. This allows +// automatic deferral of all format strings this package doesn't support. +func (f *formatState) constructOrigFormat(verb rune) (format string) { + buf := bytes.NewBuffer(percentBytes) + + for _, flag := range supportedFlags { + if f.fs.Flag(int(flag)) { + buf.WriteRune(flag) + } + } + + if width, ok := f.fs.Width(); ok { + buf.WriteString(strconv.Itoa(width)) + } + + if precision, ok := f.fs.Precision(); ok { + buf.Write(precisionBytes) + buf.WriteString(strconv.Itoa(precision)) + } + + buf.WriteRune(verb) + + format = buf.String() + return format +} + +// unpackValue returns values inside of non-nil interfaces when possible and +// ensures that types for values which have been unpacked from an interface +// are displayed when the show types flag is also set. +// This is useful for data types like structs, arrays, slices, and maps which +// can contain varying types packed inside an interface. +func (f *formatState) unpackValue(v reflect.Value) reflect.Value { + if v.Kind() == reflect.Interface { + f.ignoreNextType = false + if !v.IsNil() { + v = v.Elem() + } + } + return v +} + +// formatPtr handles formatting of pointers by indirecting them as necessary. +func (f *formatState) formatPtr(v reflect.Value) { + // Display nil if top level pointer is nil. + showTypes := f.fs.Flag('#') + if v.IsNil() && (!showTypes || f.ignoreNextType) { + f.fs.Write(nilAngleBytes) + return + } + + // Remove pointers at or below the current depth from map used to detect + // circular refs. + for k, depth := range f.pointers { + if depth >= f.depth { + delete(f.pointers, k) + } + } + + // Keep list of all dereferenced pointers to possibly show later. + pointerChain := make([]uintptr, 0) + + // Figure out how many levels of indirection there are by derferencing + // pointers and unpacking interfaces down the chain while detecting circular + // references. + nilFound := false + cycleFound := false + indirects := 0 + ve := v + for ve.Kind() == reflect.Ptr { + if ve.IsNil() { + nilFound = true + break + } + indirects++ + addr := ve.Pointer() + pointerChain = append(pointerChain, addr) + if pd, ok := f.pointers[addr]; ok && pd < f.depth { + cycleFound = true + indirects-- + break + } + f.pointers[addr] = f.depth + + ve = ve.Elem() + if ve.Kind() == reflect.Interface { + if ve.IsNil() { + nilFound = true + break + } + ve = ve.Elem() + } + } + + // Display type or indirection level depending on flags. + if showTypes && !f.ignoreNextType { + f.fs.Write(openParenBytes) + f.fs.Write(bytes.Repeat(asteriskBytes, indirects)) + f.fs.Write([]byte(ve.Type().String())) + f.fs.Write(closeParenBytes) + } else { + if nilFound || cycleFound { + indirects += strings.Count(ve.Type().String(), "*") + } + f.fs.Write(openAngleBytes) + f.fs.Write([]byte(strings.Repeat("*", indirects))) + f.fs.Write(closeAngleBytes) + } + + // Display pointer information depending on flags. + if f.fs.Flag('+') && (len(pointerChain) > 0) { + f.fs.Write(openParenBytes) + for i, addr := range pointerChain { + if i > 0 { + f.fs.Write(pointerChainBytes) + } + printHexPtr(f.fs, addr) + } + f.fs.Write(closeParenBytes) + } + + // Display dereferenced value. + switch { + case nilFound: + f.fs.Write(nilAngleBytes) + + case cycleFound: + f.fs.Write(circularShortBytes) + + default: + f.ignoreNextType = true + f.format(ve) + } +} + +// format is the main workhorse for providing the Formatter interface. It +// uses the passed reflect value to figure out what kind of object we are +// dealing with and formats it appropriately. It is a recursive function, +// however circular data structures are detected and handled properly. +func (f *formatState) format(v reflect.Value) { + // Handle invalid reflect values immediately. + kind := v.Kind() + if kind == reflect.Invalid { + f.fs.Write(invalidAngleBytes) + return + } + + // Handle pointers specially. + if kind == reflect.Ptr { + f.formatPtr(v) + return + } + + // Print type information unless already handled elsewhere. + if !f.ignoreNextType && f.fs.Flag('#') { + f.fs.Write(openParenBytes) + f.fs.Write([]byte(v.Type().String())) + f.fs.Write(closeParenBytes) + } + f.ignoreNextType = false + + // Call Stringer/error interfaces if they exist and the handle methods + // flag is enabled. + if !f.cs.DisableMethods { + if (kind != reflect.Invalid) && (kind != reflect.Interface) { + if handled := handleMethods(f.cs, f.fs, v); handled { + return + } + } + } + + switch kind { + case reflect.Invalid: + // Do nothing. We should never get here since invalid has already + // been handled above. + + case reflect.Bool: + printBool(f.fs, v.Bool()) + + case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int: + printInt(f.fs, v.Int(), 10) + + case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint: + printUint(f.fs, v.Uint(), 10) + + case reflect.Float32: + printFloat(f.fs, v.Float(), 32) + + case reflect.Float64: + printFloat(f.fs, v.Float(), 64) + + case reflect.Complex64: + printComplex(f.fs, v.Complex(), 32) + + case reflect.Complex128: + printComplex(f.fs, v.Complex(), 64) + + case reflect.Slice: + if v.IsNil() { + f.fs.Write(nilAngleBytes) + break + } + fallthrough + + case reflect.Array: + f.fs.Write(openBracketBytes) + f.depth++ + if (f.cs.MaxDepth != 0) && (f.depth > f.cs.MaxDepth) { + f.fs.Write(maxShortBytes) + } else { + numEntries := v.Len() + for i := 0; i < numEntries; i++ { + if i > 0 { + f.fs.Write(spaceBytes) + } + f.ignoreNextType = true + f.format(f.unpackValue(v.Index(i))) + } + } + f.depth-- + f.fs.Write(closeBracketBytes) + + case reflect.String: + f.fs.Write([]byte(v.String())) + + case reflect.Interface: + // The only time we should get here is for nil interfaces due to + // unpackValue calls. + if v.IsNil() { + f.fs.Write(nilAngleBytes) + } + + case reflect.Ptr: + // Do nothing. We should never get here since pointers have already + // been handled above. + + case reflect.Map: + // nil maps should be indicated as different than empty maps + if v.IsNil() { + f.fs.Write(nilAngleBytes) + break + } + + f.fs.Write(openMapBytes) + f.depth++ + if (f.cs.MaxDepth != 0) && (f.depth > f.cs.MaxDepth) { + f.fs.Write(maxShortBytes) + } else { + keys := v.MapKeys() + if f.cs.SortKeys { + sortValues(keys, f.cs) + } + for i, key := range keys { + if i > 0 { + f.fs.Write(spaceBytes) + } + f.ignoreNextType = true + f.format(f.unpackValue(key)) + f.fs.Write(colonBytes) + f.ignoreNextType = true + f.format(f.unpackValue(v.MapIndex(key))) + } + } + f.depth-- + f.fs.Write(closeMapBytes) + + case reflect.Struct: + numFields := v.NumField() + f.fs.Write(openBraceBytes) + f.depth++ + if (f.cs.MaxDepth != 0) && (f.depth > f.cs.MaxDepth) { + f.fs.Write(maxShortBytes) + } else { + vt := v.Type() + for i := 0; i < numFields; i++ { + if i > 0 { + f.fs.Write(spaceBytes) + } + vtf := vt.Field(i) + if f.fs.Flag('+') || f.fs.Flag('#') { + f.fs.Write([]byte(vtf.Name)) + f.fs.Write(colonBytes) + } + f.format(f.unpackValue(v.Field(i))) + } + } + f.depth-- + f.fs.Write(closeBraceBytes) + + case reflect.Uintptr: + printHexPtr(f.fs, uintptr(v.Uint())) + + case reflect.UnsafePointer, reflect.Chan, reflect.Func: + printHexPtr(f.fs, v.Pointer()) + + // There were not any other types at the time this code was written, but + // fall back to letting the default fmt package handle it if any get added. + default: + format := f.buildDefaultFormat() + if v.CanInterface() { + fmt.Fprintf(f.fs, format, v.Interface()) + } else { + fmt.Fprintf(f.fs, format, v.String()) + } + } +} + +// Format satisfies the fmt.Formatter interface. See NewFormatter for usage +// details. +func (f *formatState) Format(fs fmt.State, verb rune) { + f.fs = fs + + // Use standard formatting for verbs that are not v. + if verb != 'v' { + format := f.constructOrigFormat(verb) + fmt.Fprintf(fs, format, f.value) + return + } + + if f.value == nil { + if fs.Flag('#') { + fs.Write(interfaceBytes) + } + fs.Write(nilAngleBytes) + return + } + + f.format(reflect.ValueOf(f.value)) +} + +// newFormatter is a helper function to consolidate the logic from the various +// public methods which take varying config states. +func newFormatter(cs *ConfigState, v interface{}) fmt.Formatter { + fs := &formatState{value: v, cs: cs} + fs.pointers = make(map[uintptr]int) + return fs +} + +/* +NewFormatter returns a custom formatter that satisfies the fmt.Formatter +interface. As a result, it integrates cleanly with standard fmt package +printing functions. The formatter is useful for inline printing of smaller data +types similar to the standard %v format specifier. + +The custom formatter only responds to the %v (most compact), %+v (adds pointer +addresses), %#v (adds types), or %#+v (adds types and pointer addresses) verb +combinations. Any other verbs such as %x and %q will be sent to the the +standard fmt package for formatting. In addition, the custom formatter ignores +the width and precision arguments (however they will still work on the format +specifiers not handled by the custom formatter). + +Typically this function shouldn't be called directly. It is much easier to make +use of the custom formatter by calling one of the convenience functions such as +Printf, Println, or Fprintf. +*/ +func NewFormatter(v interface{}) fmt.Formatter { + return newFormatter(&Config, v) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/davecgh/go-spew/spew/spew.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/davecgh/go-spew/spew/spew.go new file mode 100644 index 00000000..32c0e338 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/davecgh/go-spew/spew/spew.go @@ -0,0 +1,148 @@ +/* + * Copyright (c) 2013-2016 Dave Collins + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +package spew + +import ( + "fmt" + "io" +) + +// Errorf is a wrapper for fmt.Errorf that treats each argument as if it were +// passed with a default Formatter interface returned by NewFormatter. It +// returns the formatted string as a value that satisfies error. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Errorf(format, spew.NewFormatter(a), spew.NewFormatter(b)) +func Errorf(format string, a ...interface{}) (err error) { + return fmt.Errorf(format, convertArgs(a)...) +} + +// Fprint is a wrapper for fmt.Fprint that treats each argument as if it were +// passed with a default Formatter interface returned by NewFormatter. It +// returns the number of bytes written and any write error encountered. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Fprint(w, spew.NewFormatter(a), spew.NewFormatter(b)) +func Fprint(w io.Writer, a ...interface{}) (n int, err error) { + return fmt.Fprint(w, convertArgs(a)...) +} + +// Fprintf is a wrapper for fmt.Fprintf that treats each argument as if it were +// passed with a default Formatter interface returned by NewFormatter. It +// returns the number of bytes written and any write error encountered. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Fprintf(w, format, spew.NewFormatter(a), spew.NewFormatter(b)) +func Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error) { + return fmt.Fprintf(w, format, convertArgs(a)...) +} + +// Fprintln is a wrapper for fmt.Fprintln that treats each argument as if it +// passed with a default Formatter interface returned by NewFormatter. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Fprintln(w, spew.NewFormatter(a), spew.NewFormatter(b)) +func Fprintln(w io.Writer, a ...interface{}) (n int, err error) { + return fmt.Fprintln(w, convertArgs(a)...) +} + +// Print is a wrapper for fmt.Print that treats each argument as if it were +// passed with a default Formatter interface returned by NewFormatter. It +// returns the number of bytes written and any write error encountered. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Print(spew.NewFormatter(a), spew.NewFormatter(b)) +func Print(a ...interface{}) (n int, err error) { + return fmt.Print(convertArgs(a)...) +} + +// Printf is a wrapper for fmt.Printf that treats each argument as if it were +// passed with a default Formatter interface returned by NewFormatter. It +// returns the number of bytes written and any write error encountered. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Printf(format, spew.NewFormatter(a), spew.NewFormatter(b)) +func Printf(format string, a ...interface{}) (n int, err error) { + return fmt.Printf(format, convertArgs(a)...) +} + +// Println is a wrapper for fmt.Println that treats each argument as if it were +// passed with a default Formatter interface returned by NewFormatter. It +// returns the number of bytes written and any write error encountered. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Println(spew.NewFormatter(a), spew.NewFormatter(b)) +func Println(a ...interface{}) (n int, err error) { + return fmt.Println(convertArgs(a)...) +} + +// Sprint is a wrapper for fmt.Sprint that treats each argument as if it were +// passed with a default Formatter interface returned by NewFormatter. It +// returns the resulting string. See NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Sprint(spew.NewFormatter(a), spew.NewFormatter(b)) +func Sprint(a ...interface{}) string { + return fmt.Sprint(convertArgs(a)...) +} + +// Sprintf is a wrapper for fmt.Sprintf that treats each argument as if it were +// passed with a default Formatter interface returned by NewFormatter. It +// returns the resulting string. See NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Sprintf(format, spew.NewFormatter(a), spew.NewFormatter(b)) +func Sprintf(format string, a ...interface{}) string { + return fmt.Sprintf(format, convertArgs(a)...) +} + +// Sprintln is a wrapper for fmt.Sprintln that treats each argument as if it +// were passed with a default Formatter interface returned by NewFormatter. It +// returns the resulting string. See NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Sprintln(spew.NewFormatter(a), spew.NewFormatter(b)) +func Sprintln(a ...interface{}) string { + return fmt.Sprintln(convertArgs(a)...) +} + +// convertArgs accepts a slice of arguments and returns a slice of the same +// length with each argument converted to a default spew Formatter interface. +func convertArgs(args []interface{}) (formatters []interface{}) { + formatters = make([]interface{}, len(args)) + for index, arg := range args { + formatters[index] = NewFormatter(arg) + } + return formatters +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/fsnotify/fsnotify/.editorconfig b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/fsnotify/fsnotify/.editorconfig new file mode 100644 index 00000000..ba49e3c2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/fsnotify/fsnotify/.editorconfig @@ -0,0 +1,5 @@ +root = true + +[*] +indent_style = tab +indent_size = 4 diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/fsnotify/fsnotify/.gitignore b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/fsnotify/fsnotify/.gitignore new file mode 100644 index 00000000..4cd0cbaf --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/fsnotify/fsnotify/.gitignore @@ -0,0 +1,6 @@ +# Setup a Global .gitignore for OS and editor generated files: +# https://help.github.com/articles/ignoring-files +# git config --global core.excludesfile ~/.gitignore_global + +.vagrant +*.sublime-project diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/fsnotify/fsnotify/.travis.yml b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/fsnotify/fsnotify/.travis.yml new file mode 100644 index 00000000..981d1bb8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/fsnotify/fsnotify/.travis.yml @@ -0,0 +1,30 @@ +sudo: false +language: go + +go: + - 1.8.x + - 1.9.x + - tip + +matrix: + allow_failures: + - go: tip + fast_finish: true + +before_script: + - go get -u github.com/golang/lint/golint + +script: + - go test -v --race ./... + +after_script: + - test -z "$(gofmt -s -l -w . | tee /dev/stderr)" + - test -z "$(golint ./... | tee /dev/stderr)" + - go vet ./... + +os: + - linux + - osx + +notifications: + email: false diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/fsnotify/fsnotify/AUTHORS b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/fsnotify/fsnotify/AUTHORS new file mode 100644 index 00000000..5ab5d41c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/fsnotify/fsnotify/AUTHORS @@ -0,0 +1,52 @@ +# Names should be added to this file as +# Name or Organization +# The email address is not required for organizations. + +# You can update this list using the following command: +# +# $ git shortlog -se | awk '{print $2 " " $3 " " $4}' + +# Please keep the list sorted. + +Aaron L +Adrien Bustany +Amit Krishnan +Anmol Sethi +Bjørn Erik Pedersen +Bruno Bigras +Caleb Spare +Case Nelson +Chris Howey +Christoffer Buchholz +Daniel Wagner-Hall +Dave Cheney +Evan Phoenix +Francisco Souza +Hari haran +John C Barstow +Kelvin Fo +Ken-ichirou MATSUZAWA +Matt Layher +Nathan Youngman +Nickolai Zeldovich +Patrick +Paul Hammond +Pawel Knap +Pieter Droogendijk +Pursuit92 +Riku Voipio +Rob Figueiredo +Rodrigo Chiossi +Slawek Ligus +Soge Zhang +Tiffany Jernigan +Tilak Sharma +Tom Payne +Travis Cline +Tudor Golubenco +Vahe Khachikyan +Yukang +bronze1man +debrando +henrikedwards +é“å“¥ diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/fsnotify/fsnotify/CHANGELOG.md b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/fsnotify/fsnotify/CHANGELOG.md new file mode 100644 index 00000000..be4d7ea2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/fsnotify/fsnotify/CHANGELOG.md @@ -0,0 +1,317 @@ +# Changelog + +## v1.4.7 / 2018-01-09 + +* BSD/macOS: Fix possible deadlock on closing the watcher on kqueue (thanks @nhooyr and @glycerine) +* Tests: Fix missing verb on format string (thanks @rchiossi) +* Linux: Fix deadlock in Remove (thanks @aarondl) +* Linux: Watch.Add improvements (avoid race, fix consistency, reduce garbage) (thanks @twpayne) +* Docs: Moved FAQ into the README (thanks @vahe) +* Linux: Properly handle inotify's IN_Q_OVERFLOW event (thanks @zeldovich) +* Docs: replace references to OS X with macOS + +## v1.4.2 / 2016-10-10 + +* Linux: use InotifyInit1 with IN_CLOEXEC to stop leaking a file descriptor to a child process when using fork/exec [#178](https://github.com/fsnotify/fsnotify/pull/178) (thanks @pattyshack) + +## v1.4.1 / 2016-10-04 + +* Fix flaky inotify stress test on Linux [#177](https://github.com/fsnotify/fsnotify/pull/177) (thanks @pattyshack) + +## v1.4.0 / 2016-10-01 + +* add a String() method to Event.Op [#165](https://github.com/fsnotify/fsnotify/pull/165) (thanks @oozie) + +## v1.3.1 / 2016-06-28 + +* Windows: fix for double backslash when watching the root of a drive [#151](https://github.com/fsnotify/fsnotify/issues/151) (thanks @brunoqc) + +## v1.3.0 / 2016-04-19 + +* Support linux/arm64 by [patching](https://go-review.googlesource.com/#/c/21971/) x/sys/unix and switching to to it from syscall (thanks @suihkulokki) [#135](https://github.com/fsnotify/fsnotify/pull/135) + +## v1.2.10 / 2016-03-02 + +* Fix golint errors in windows.go [#121](https://github.com/fsnotify/fsnotify/pull/121) (thanks @tiffanyfj) + +## v1.2.9 / 2016-01-13 + +kqueue: Fix logic for CREATE after REMOVE [#111](https://github.com/fsnotify/fsnotify/pull/111) (thanks @bep) + +## v1.2.8 / 2015-12-17 + +* kqueue: fix race condition in Close [#105](https://github.com/fsnotify/fsnotify/pull/105) (thanks @djui for reporting the issue and @ppknap for writing a failing test) +* inotify: fix race in test +* enable race detection for continuous integration (Linux, Mac, Windows) + +## v1.2.5 / 2015-10-17 + +* inotify: use epoll_create1 for arm64 support (requires Linux 2.6.27 or later) [#100](https://github.com/fsnotify/fsnotify/pull/100) (thanks @suihkulokki) +* inotify: fix path leaks [#73](https://github.com/fsnotify/fsnotify/pull/73) (thanks @chamaken) +* kqueue: watch for rename events on subdirectories [#83](https://github.com/fsnotify/fsnotify/pull/83) (thanks @guotie) +* kqueue: avoid infinite loops from symlinks cycles [#101](https://github.com/fsnotify/fsnotify/pull/101) (thanks @illicitonion) + +## v1.2.1 / 2015-10-14 + +* kqueue: don't watch named pipes [#98](https://github.com/fsnotify/fsnotify/pull/98) (thanks @evanphx) + +## v1.2.0 / 2015-02-08 + +* inotify: use epoll to wake up readEvents [#66](https://github.com/fsnotify/fsnotify/pull/66) (thanks @PieterD) +* inotify: closing watcher should now always shut down goroutine [#63](https://github.com/fsnotify/fsnotify/pull/63) (thanks @PieterD) +* kqueue: close kqueue after removing watches, fixes [#59](https://github.com/fsnotify/fsnotify/issues/59) + +## v1.1.1 / 2015-02-05 + +* inotify: Retry read on EINTR [#61](https://github.com/fsnotify/fsnotify/issues/61) (thanks @PieterD) + +## v1.1.0 / 2014-12-12 + +* kqueue: rework internals [#43](https://github.com/fsnotify/fsnotify/pull/43) + * add low-level functions + * only need to store flags on directories + * less mutexes [#13](https://github.com/fsnotify/fsnotify/issues/13) + * done can be an unbuffered channel + * remove calls to os.NewSyscallError +* More efficient string concatenation for Event.String() [#52](https://github.com/fsnotify/fsnotify/pull/52) (thanks @mdlayher) +* kqueue: fix regression in rework causing subdirectories to be watched [#48](https://github.com/fsnotify/fsnotify/issues/48) +* kqueue: cleanup internal watch before sending remove event [#51](https://github.com/fsnotify/fsnotify/issues/51) + +## v1.0.4 / 2014-09-07 + +* kqueue: add dragonfly to the build tags. +* Rename source code files, rearrange code so exported APIs are at the top. +* Add done channel to example code. [#37](https://github.com/fsnotify/fsnotify/pull/37) (thanks @chenyukang) + +## v1.0.3 / 2014-08-19 + +* [Fix] Windows MOVED_TO now translates to Create like on BSD and Linux. [#36](https://github.com/fsnotify/fsnotify/issues/36) + +## v1.0.2 / 2014-08-17 + +* [Fix] Missing create events on macOS. [#14](https://github.com/fsnotify/fsnotify/issues/14) (thanks @zhsso) +* [Fix] Make ./path and path equivalent. (thanks @zhsso) + +## v1.0.0 / 2014-08-15 + +* [API] Remove AddWatch on Windows, use Add. +* Improve documentation for exported identifiers. [#30](https://github.com/fsnotify/fsnotify/issues/30) +* Minor updates based on feedback from golint. + +## dev / 2014-07-09 + +* Moved to [github.com/fsnotify/fsnotify](https://github.com/fsnotify/fsnotify). +* Use os.NewSyscallError instead of returning errno (thanks @hariharan-uno) + +## dev / 2014-07-04 + +* kqueue: fix incorrect mutex used in Close() +* Update example to demonstrate usage of Op. + +## dev / 2014-06-28 + +* [API] Don't set the Write Op for attribute notifications [#4](https://github.com/fsnotify/fsnotify/issues/4) +* Fix for String() method on Event (thanks Alex Brainman) +* Don't build on Plan 9 or Solaris (thanks @4ad) + +## dev / 2014-06-21 + +* Events channel of type Event rather than *Event. +* [internal] use syscall constants directly for inotify and kqueue. +* [internal] kqueue: rename events to kevents and fileEvent to event. + +## dev / 2014-06-19 + +* Go 1.3+ required on Windows (uses syscall.ERROR_MORE_DATA internally). +* [internal] remove cookie from Event struct (unused). +* [internal] Event struct has the same definition across every OS. +* [internal] remove internal watch and removeWatch methods. + +## dev / 2014-06-12 + +* [API] Renamed Watch() to Add() and RemoveWatch() to Remove(). +* [API] Pluralized channel names: Events and Errors. +* [API] Renamed FileEvent struct to Event. +* [API] Op constants replace methods like IsCreate(). + +## dev / 2014-06-12 + +* Fix data race on kevent buffer (thanks @tilaks) [#98](https://github.com/howeyc/fsnotify/pull/98) + +## dev / 2014-05-23 + +* [API] Remove current implementation of WatchFlags. + * current implementation doesn't take advantage of OS for efficiency + * provides little benefit over filtering events as they are received, but has extra bookkeeping and mutexes + * no tests for the current implementation + * not fully implemented on Windows [#93](https://github.com/howeyc/fsnotify/issues/93#issuecomment-39285195) + +## v0.9.3 / 2014-12-31 + +* kqueue: cleanup internal watch before sending remove event [#51](https://github.com/fsnotify/fsnotify/issues/51) + +## v0.9.2 / 2014-08-17 + +* [Backport] Fix missing create events on macOS. [#14](https://github.com/fsnotify/fsnotify/issues/14) (thanks @zhsso) + +## v0.9.1 / 2014-06-12 + +* Fix data race on kevent buffer (thanks @tilaks) [#98](https://github.com/howeyc/fsnotify/pull/98) + +## v0.9.0 / 2014-01-17 + +* IsAttrib() for events that only concern a file's metadata [#79][] (thanks @abustany) +* [Fix] kqueue: fix deadlock [#77][] (thanks @cespare) +* [NOTICE] Development has moved to `code.google.com/p/go.exp/fsnotify` in preparation for inclusion in the Go standard library. + +## v0.8.12 / 2013-11-13 + +* [API] Remove FD_SET and friends from Linux adapter + +## v0.8.11 / 2013-11-02 + +* [Doc] Add Changelog [#72][] (thanks @nathany) +* [Doc] Spotlight and double modify events on macOS [#62][] (reported by @paulhammond) + +## v0.8.10 / 2013-10-19 + +* [Fix] kqueue: remove file watches when parent directory is removed [#71][] (reported by @mdwhatcott) +* [Fix] kqueue: race between Close and readEvents [#70][] (reported by @bernerdschaefer) +* [Doc] specify OS-specific limits in README (thanks @debrando) + +## v0.8.9 / 2013-09-08 + +* [Doc] Contributing (thanks @nathany) +* [Doc] update package path in example code [#63][] (thanks @paulhammond) +* [Doc] GoCI badge in README (Linux only) [#60][] +* [Doc] Cross-platform testing with Vagrant [#59][] (thanks @nathany) + +## v0.8.8 / 2013-06-17 + +* [Fix] Windows: handle `ERROR_MORE_DATA` on Windows [#49][] (thanks @jbowtie) + +## v0.8.7 / 2013-06-03 + +* [API] Make syscall flags internal +* [Fix] inotify: ignore event changes +* [Fix] race in symlink test [#45][] (reported by @srid) +* [Fix] tests on Windows +* lower case error messages + +## v0.8.6 / 2013-05-23 + +* kqueue: Use EVT_ONLY flag on Darwin +* [Doc] Update README with full example + +## v0.8.5 / 2013-05-09 + +* [Fix] inotify: allow monitoring of "broken" symlinks (thanks @tsg) + +## v0.8.4 / 2013-04-07 + +* [Fix] kqueue: watch all file events [#40][] (thanks @ChrisBuchholz) + +## v0.8.3 / 2013-03-13 + +* [Fix] inoitfy/kqueue memory leak [#36][] (reported by @nbkolchin) +* [Fix] kqueue: use fsnFlags for watching a directory [#33][] (reported by @nbkolchin) + +## v0.8.2 / 2013-02-07 + +* [Doc] add Authors +* [Fix] fix data races for map access [#29][] (thanks @fsouza) + +## v0.8.1 / 2013-01-09 + +* [Fix] Windows path separators +* [Doc] BSD License + +## v0.8.0 / 2012-11-09 + +* kqueue: directory watching improvements (thanks @vmirage) +* inotify: add `IN_MOVED_TO` [#25][] (requested by @cpisto) +* [Fix] kqueue: deleting watched directory [#24][] (reported by @jakerr) + +## v0.7.4 / 2012-10-09 + +* [Fix] inotify: fixes from https://codereview.appspot.com/5418045/ (ugorji) +* [Fix] kqueue: preserve watch flags when watching for delete [#21][] (reported by @robfig) +* [Fix] kqueue: watch the directory even if it isn't a new watch (thanks @robfig) +* [Fix] kqueue: modify after recreation of file + +## v0.7.3 / 2012-09-27 + +* [Fix] kqueue: watch with an existing folder inside the watched folder (thanks @vmirage) +* [Fix] kqueue: no longer get duplicate CREATE events + +## v0.7.2 / 2012-09-01 + +* kqueue: events for created directories + +## v0.7.1 / 2012-07-14 + +* [Fix] for renaming files + +## v0.7.0 / 2012-07-02 + +* [Feature] FSNotify flags +* [Fix] inotify: Added file name back to event path + +## v0.6.0 / 2012-06-06 + +* kqueue: watch files after directory created (thanks @tmc) + +## v0.5.1 / 2012-05-22 + +* [Fix] inotify: remove all watches before Close() + +## v0.5.0 / 2012-05-03 + +* [API] kqueue: return errors during watch instead of sending over channel +* kqueue: match symlink behavior on Linux +* inotify: add `DELETE_SELF` (requested by @taralx) +* [Fix] kqueue: handle EINTR (reported by @robfig) +* [Doc] Godoc example [#1][] (thanks @davecheney) + +## v0.4.0 / 2012-03-30 + +* Go 1 released: build with go tool +* [Feature] Windows support using winfsnotify +* Windows does not have attribute change notifications +* Roll attribute notifications into IsModify + +## v0.3.0 / 2012-02-19 + +* kqueue: add files when watch directory + +## v0.2.0 / 2011-12-30 + +* update to latest Go weekly code + +## v0.1.0 / 2011-10-19 + +* kqueue: add watch on file creation to match inotify +* kqueue: create file event +* inotify: ignore `IN_IGNORED` events +* event String() +* linux: common FileEvent functions +* initial commit + +[#79]: https://github.com/howeyc/fsnotify/pull/79 +[#77]: https://github.com/howeyc/fsnotify/pull/77 +[#72]: https://github.com/howeyc/fsnotify/issues/72 +[#71]: https://github.com/howeyc/fsnotify/issues/71 +[#70]: https://github.com/howeyc/fsnotify/issues/70 +[#63]: https://github.com/howeyc/fsnotify/issues/63 +[#62]: https://github.com/howeyc/fsnotify/issues/62 +[#60]: https://github.com/howeyc/fsnotify/issues/60 +[#59]: https://github.com/howeyc/fsnotify/issues/59 +[#49]: https://github.com/howeyc/fsnotify/issues/49 +[#45]: https://github.com/howeyc/fsnotify/issues/45 +[#40]: https://github.com/howeyc/fsnotify/issues/40 +[#36]: https://github.com/howeyc/fsnotify/issues/36 +[#33]: https://github.com/howeyc/fsnotify/issues/33 +[#29]: https://github.com/howeyc/fsnotify/issues/29 +[#25]: https://github.com/howeyc/fsnotify/issues/25 +[#24]: https://github.com/howeyc/fsnotify/issues/24 +[#21]: https://github.com/howeyc/fsnotify/issues/21 diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/fsnotify/fsnotify/CONTRIBUTING.md b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/fsnotify/fsnotify/CONTRIBUTING.md new file mode 100644 index 00000000..828a60b2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/fsnotify/fsnotify/CONTRIBUTING.md @@ -0,0 +1,77 @@ +# Contributing + +## Issues + +* Request features and report bugs using the [GitHub Issue Tracker](https://github.com/fsnotify/fsnotify/issues). +* Please indicate the platform you are using fsnotify on. +* A code example to reproduce the problem is appreciated. + +## Pull Requests + +### Contributor License Agreement + +fsnotify is derived from code in the [golang.org/x/exp](https://godoc.org/golang.org/x/exp) package and it may be included [in the standard library](https://github.com/fsnotify/fsnotify/issues/1) in the future. Therefore fsnotify carries the same [LICENSE](https://github.com/fsnotify/fsnotify/blob/master/LICENSE) as Go. Contributors retain their copyright, so you need to fill out a short form before we can accept your contribution: [Google Individual Contributor License Agreement](https://developers.google.com/open-source/cla/individual). + +Please indicate that you have signed the CLA in your pull request. + +### How fsnotify is Developed + +* Development is done on feature branches. +* Tests are run on BSD, Linux, macOS and Windows. +* Pull requests are reviewed and [applied to master][am] using [hub][]. + * Maintainers may modify or squash commits rather than asking contributors to. +* To issue a new release, the maintainers will: + * Update the CHANGELOG + * Tag a version, which will become available through gopkg.in. + +### How to Fork + +For smooth sailing, always use the original import path. Installing with `go get` makes this easy. + +1. Install from GitHub (`go get -u github.com/fsnotify/fsnotify`) +2. Create your feature branch (`git checkout -b my-new-feature`) +3. Ensure everything works and the tests pass (see below) +4. Commit your changes (`git commit -am 'Add some feature'`) + +Contribute upstream: + +1. Fork fsnotify on GitHub +2. Add your remote (`git remote add fork git@github.com:mycompany/repo.git`) +3. Push to the branch (`git push fork my-new-feature`) +4. Create a new Pull Request on GitHub + +This workflow is [thoroughly explained by Katrina Owen](https://splice.com/blog/contributing-open-source-git-repositories-go/). + +### Testing + +fsnotify uses build tags to compile different code on Linux, BSD, macOS, and Windows. + +Before doing a pull request, please do your best to test your changes on multiple platforms, and list which platforms you were able/unable to test on. + +To aid in cross-platform testing there is a Vagrantfile for Linux and BSD. + +* Install [Vagrant](http://www.vagrantup.com/) and [VirtualBox](https://www.virtualbox.org/) +* Setup [Vagrant Gopher](https://github.com/nathany/vagrant-gopher) in your `src` folder. +* Run `vagrant up` from the project folder. You can also setup just one box with `vagrant up linux` or `vagrant up bsd` (note: the BSD box doesn't support Windows hosts at this time, and NFS may prompt for your host OS password) +* Once setup, you can run the test suite on a given OS with a single command `vagrant ssh linux -c 'cd fsnotify/fsnotify; go test'`. +* When you're done, you will want to halt or destroy the Vagrant boxes. + +Notice: fsnotify file system events won't trigger in shared folders. The tests get around this limitation by using the /tmp directory. + +Right now there is no equivalent solution for Windows and macOS, but there are Windows VMs [freely available from Microsoft](http://www.modern.ie/en-us/virtualization-tools#downloads). + +### Maintainers + +Help maintaining fsnotify is welcome. To be a maintainer: + +* Submit a pull request and sign the CLA as above. +* You must be able to run the test suite on Mac, Windows, Linux and BSD. + +To keep master clean, the fsnotify project uses the "apply mail" workflow outlined in Nathaniel Talbott's post ["Merge pull request" Considered Harmful][am]. This requires installing [hub][]. + +All code changes should be internal pull requests. + +Releases are tagged using [Semantic Versioning](http://semver.org/). + +[hub]: https://github.com/github/hub +[am]: http://blog.spreedly.com/2014/06/24/merge-pull-request-considered-harmful/#.VGa5yZPF_Zs diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/fsnotify/fsnotify/LICENSE b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/fsnotify/fsnotify/LICENSE new file mode 100644 index 00000000..f21e5408 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/fsnotify/fsnotify/LICENSE @@ -0,0 +1,28 @@ +Copyright (c) 2012 The Go Authors. All rights reserved. +Copyright (c) 2012 fsnotify Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/fsnotify/fsnotify/README.md b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/fsnotify/fsnotify/README.md new file mode 100644 index 00000000..39932074 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/fsnotify/fsnotify/README.md @@ -0,0 +1,79 @@ +# File system notifications for Go + +[![GoDoc](https://godoc.org/github.com/fsnotify/fsnotify?status.svg)](https://godoc.org/github.com/fsnotify/fsnotify) [![Go Report Card](https://goreportcard.com/badge/github.com/fsnotify/fsnotify)](https://goreportcard.com/report/github.com/fsnotify/fsnotify) + +fsnotify utilizes [golang.org/x/sys](https://godoc.org/golang.org/x/sys) rather than `syscall` from the standard library. Ensure you have the latest version installed by running: + +```console +go get -u golang.org/x/sys/... +``` + +Cross platform: Windows, Linux, BSD and macOS. + +|Adapter |OS |Status | +|----------|----------|----------| +|inotify |Linux 2.6.27 or later, Android\*|Supported [![Build Status](https://travis-ci.org/fsnotify/fsnotify.svg?branch=master)](https://travis-ci.org/fsnotify/fsnotify)| +|kqueue |BSD, macOS, iOS\*|Supported [![Build Status](https://travis-ci.org/fsnotify/fsnotify.svg?branch=master)](https://travis-ci.org/fsnotify/fsnotify)| +|ReadDirectoryChangesW|Windows|Supported [![Build status](https://ci.appveyor.com/api/projects/status/ivwjubaih4r0udeh/branch/master?svg=true)](https://ci.appveyor.com/project/NathanYoungman/fsnotify/branch/master)| +|FSEvents |macOS |[Planned](https://github.com/fsnotify/fsnotify/issues/11)| +|FEN |Solaris 11 |[In Progress](https://github.com/fsnotify/fsnotify/issues/12)| +|fanotify |Linux 2.6.37+ | | +|USN Journals |Windows |[Maybe](https://github.com/fsnotify/fsnotify/issues/53)| +|Polling |*All* |[Maybe](https://github.com/fsnotify/fsnotify/issues/9)| + +\* Android and iOS are untested. + +Please see [the documentation](https://godoc.org/github.com/fsnotify/fsnotify) and consult the [FAQ](#faq) for usage information. + +## API stability + +fsnotify is a fork of [howeyc/fsnotify](https://godoc.org/github.com/howeyc/fsnotify) with a new API as of v1.0. The API is based on [this design document](http://goo.gl/MrYxyA). + +All [releases](https://github.com/fsnotify/fsnotify/releases) are tagged based on [Semantic Versioning](http://semver.org/). Further API changes are [planned](https://github.com/fsnotify/fsnotify/milestones), and will be tagged with a new major revision number. + +Go 1.6 supports dependencies located in the `vendor/` folder. Unless you are creating a library, it is recommended that you copy fsnotify into `vendor/github.com/fsnotify/fsnotify` within your project, and likewise for `golang.org/x/sys`. + +## Contributing + +Please refer to [CONTRIBUTING][] before opening an issue or pull request. + +## Example + +See [example_test.go](https://github.com/fsnotify/fsnotify/blob/master/example_test.go). + +## FAQ + +**When a file is moved to another directory is it still being watched?** + +No (it shouldn't be, unless you are watching where it was moved to). + +**When I watch a directory, are all subdirectories watched as well?** + +No, you must add watches for any directory you want to watch (a recursive watcher is on the roadmap [#18][]). + +**Do I have to watch the Error and Event channels in a separate goroutine?** + +As of now, yes. Looking into making this single-thread friendly (see [howeyc #7][#7]) + +**Why am I receiving multiple events for the same file on OS X?** + +Spotlight indexing on OS X can result in multiple events (see [howeyc #62][#62]). A temporary workaround is to add your folder(s) to the *Spotlight Privacy settings* until we have a native FSEvents implementation (see [#11][]). + +**How many files can be watched at once?** + +There are OS-specific limits as to how many watches can be created: +* Linux: /proc/sys/fs/inotify/max_user_watches contains the limit, reaching this limit results in a "no space left on device" error. +* BSD / OSX: sysctl variables "kern.maxfiles" and "kern.maxfilesperproc", reaching these limits results in a "too many open files" error. + +[#62]: https://github.com/howeyc/fsnotify/issues/62 +[#18]: https://github.com/fsnotify/fsnotify/issues/18 +[#11]: https://github.com/fsnotify/fsnotify/issues/11 +[#7]: https://github.com/howeyc/fsnotify/issues/7 + +[contributing]: https://github.com/fsnotify/fsnotify/blob/master/CONTRIBUTING.md + +## Related Projects + +* [notify](https://github.com/rjeczalik/notify) +* [fsevents](https://github.com/fsnotify/fsevents) + diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/fsnotify/fsnotify/fen.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/fsnotify/fsnotify/fen.go new file mode 100644 index 00000000..ced39cb8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/fsnotify/fsnotify/fen.go @@ -0,0 +1,37 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build solaris + +package fsnotify + +import ( + "errors" +) + +// Watcher watches a set of files, delivering events to a channel. +type Watcher struct { + Events chan Event + Errors chan error +} + +// NewWatcher establishes a new watcher with the underlying OS and begins waiting for events. +func NewWatcher() (*Watcher, error) { + return nil, errors.New("FEN based watcher not yet supported for fsnotify\n") +} + +// Close removes all watches and closes the events channel. +func (w *Watcher) Close() error { + return nil +} + +// Add starts watching the named file or directory (non-recursively). +func (w *Watcher) Add(name string) error { + return nil +} + +// Remove stops watching the the named file or directory (non-recursively). +func (w *Watcher) Remove(name string) error { + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/fsnotify/fsnotify/fsnotify.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/fsnotify/fsnotify/fsnotify.go new file mode 100644 index 00000000..190bf0de --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/fsnotify/fsnotify/fsnotify.go @@ -0,0 +1,66 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !plan9 + +// Package fsnotify provides a platform-independent interface for file system notifications. +package fsnotify + +import ( + "bytes" + "errors" + "fmt" +) + +// Event represents a single file system notification. +type Event struct { + Name string // Relative path to the file or directory. + Op Op // File operation that triggered the event. +} + +// Op describes a set of file operations. +type Op uint32 + +// These are the generalized file operations that can trigger a notification. +const ( + Create Op = 1 << iota + Write + Remove + Rename + Chmod +) + +func (op Op) String() string { + // Use a buffer for efficient string concatenation + var buffer bytes.Buffer + + if op&Create == Create { + buffer.WriteString("|CREATE") + } + if op&Remove == Remove { + buffer.WriteString("|REMOVE") + } + if op&Write == Write { + buffer.WriteString("|WRITE") + } + if op&Rename == Rename { + buffer.WriteString("|RENAME") + } + if op&Chmod == Chmod { + buffer.WriteString("|CHMOD") + } + if buffer.Len() == 0 { + return "" + } + return buffer.String()[1:] // Strip leading pipe +} + +// String returns a string representation of the event in the form +// "file: REMOVE|WRITE|..." +func (e Event) String() string { + return fmt.Sprintf("%q: %s", e.Name, e.Op.String()) +} + +// Common errors that can be reported by a watcher +var ErrEventOverflow = errors.New("fsnotify queue overflow") diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/fsnotify/fsnotify/inotify.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/fsnotify/fsnotify/inotify.go new file mode 100644 index 00000000..d9fd1b88 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/fsnotify/fsnotify/inotify.go @@ -0,0 +1,337 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build linux + +package fsnotify + +import ( + "errors" + "fmt" + "io" + "os" + "path/filepath" + "strings" + "sync" + "unsafe" + + "golang.org/x/sys/unix" +) + +// Watcher watches a set of files, delivering events to a channel. +type Watcher struct { + Events chan Event + Errors chan error + mu sync.Mutex // Map access + fd int + poller *fdPoller + watches map[string]*watch // Map of inotify watches (key: path) + paths map[int]string // Map of watched paths (key: watch descriptor) + done chan struct{} // Channel for sending a "quit message" to the reader goroutine + doneResp chan struct{} // Channel to respond to Close +} + +// NewWatcher establishes a new watcher with the underlying OS and begins waiting for events. +func NewWatcher() (*Watcher, error) { + // Create inotify fd + fd, errno := unix.InotifyInit1(unix.IN_CLOEXEC) + if fd == -1 { + return nil, errno + } + // Create epoll + poller, err := newFdPoller(fd) + if err != nil { + unix.Close(fd) + return nil, err + } + w := &Watcher{ + fd: fd, + poller: poller, + watches: make(map[string]*watch), + paths: make(map[int]string), + Events: make(chan Event), + Errors: make(chan error), + done: make(chan struct{}), + doneResp: make(chan struct{}), + } + + go w.readEvents() + return w, nil +} + +func (w *Watcher) isClosed() bool { + select { + case <-w.done: + return true + default: + return false + } +} + +// Close removes all watches and closes the events channel. +func (w *Watcher) Close() error { + if w.isClosed() { + return nil + } + + // Send 'close' signal to goroutine, and set the Watcher to closed. + close(w.done) + + // Wake up goroutine + w.poller.wake() + + // Wait for goroutine to close + <-w.doneResp + + return nil +} + +// Add starts watching the named file or directory (non-recursively). +func (w *Watcher) Add(name string) error { + name = filepath.Clean(name) + if w.isClosed() { + return errors.New("inotify instance already closed") + } + + const agnosticEvents = unix.IN_MOVED_TO | unix.IN_MOVED_FROM | + unix.IN_CREATE | unix.IN_ATTRIB | unix.IN_MODIFY | + unix.IN_MOVE_SELF | unix.IN_DELETE | unix.IN_DELETE_SELF + + var flags uint32 = agnosticEvents + + w.mu.Lock() + defer w.mu.Unlock() + watchEntry := w.watches[name] + if watchEntry != nil { + flags |= watchEntry.flags | unix.IN_MASK_ADD + } + wd, errno := unix.InotifyAddWatch(w.fd, name, flags) + if wd == -1 { + return errno + } + + if watchEntry == nil { + w.watches[name] = &watch{wd: uint32(wd), flags: flags} + w.paths[wd] = name + } else { + watchEntry.wd = uint32(wd) + watchEntry.flags = flags + } + + return nil +} + +// Remove stops watching the named file or directory (non-recursively). +func (w *Watcher) Remove(name string) error { + name = filepath.Clean(name) + + // Fetch the watch. + w.mu.Lock() + defer w.mu.Unlock() + watch, ok := w.watches[name] + + // Remove it from inotify. + if !ok { + return fmt.Errorf("can't remove non-existent inotify watch for: %s", name) + } + + // We successfully removed the watch if InotifyRmWatch doesn't return an + // error, we need to clean up our internal state to ensure it matches + // inotify's kernel state. + delete(w.paths, int(watch.wd)) + delete(w.watches, name) + + // inotify_rm_watch will return EINVAL if the file has been deleted; + // the inotify will already have been removed. + // watches and pathes are deleted in ignoreLinux() implicitly and asynchronously + // by calling inotify_rm_watch() below. e.g. readEvents() goroutine receives IN_IGNORE + // so that EINVAL means that the wd is being rm_watch()ed or its file removed + // by another thread and we have not received IN_IGNORE event. + success, errno := unix.InotifyRmWatch(w.fd, watch.wd) + if success == -1 { + // TODO: Perhaps it's not helpful to return an error here in every case. + // the only two possible errors are: + // EBADF, which happens when w.fd is not a valid file descriptor of any kind. + // EINVAL, which is when fd is not an inotify descriptor or wd is not a valid watch descriptor. + // Watch descriptors are invalidated when they are removed explicitly or implicitly; + // explicitly by inotify_rm_watch, implicitly when the file they are watching is deleted. + return errno + } + + return nil +} + +type watch struct { + wd uint32 // Watch descriptor (as returned by the inotify_add_watch() syscall) + flags uint32 // inotify flags of this watch (see inotify(7) for the list of valid flags) +} + +// readEvents reads from the inotify file descriptor, converts the +// received events into Event objects and sends them via the Events channel +func (w *Watcher) readEvents() { + var ( + buf [unix.SizeofInotifyEvent * 4096]byte // Buffer for a maximum of 4096 raw events + n int // Number of bytes read with read() + errno error // Syscall errno + ok bool // For poller.wait + ) + + defer close(w.doneResp) + defer close(w.Errors) + defer close(w.Events) + defer unix.Close(w.fd) + defer w.poller.close() + + for { + // See if we have been closed. + if w.isClosed() { + return + } + + ok, errno = w.poller.wait() + if errno != nil { + select { + case w.Errors <- errno: + case <-w.done: + return + } + continue + } + + if !ok { + continue + } + + n, errno = unix.Read(w.fd, buf[:]) + // If a signal interrupted execution, see if we've been asked to close, and try again. + // http://man7.org/linux/man-pages/man7/signal.7.html : + // "Before Linux 3.8, reads from an inotify(7) file descriptor were not restartable" + if errno == unix.EINTR { + continue + } + + // unix.Read might have been woken up by Close. If so, we're done. + if w.isClosed() { + return + } + + if n < unix.SizeofInotifyEvent { + var err error + if n == 0 { + // If EOF is received. This should really never happen. + err = io.EOF + } else if n < 0 { + // If an error occurred while reading. + err = errno + } else { + // Read was too short. + err = errors.New("notify: short read in readEvents()") + } + select { + case w.Errors <- err: + case <-w.done: + return + } + continue + } + + var offset uint32 + // We don't know how many events we just read into the buffer + // While the offset points to at least one whole event... + for offset <= uint32(n-unix.SizeofInotifyEvent) { + // Point "raw" to the event in the buffer + raw := (*unix.InotifyEvent)(unsafe.Pointer(&buf[offset])) + + mask := uint32(raw.Mask) + nameLen := uint32(raw.Len) + + if mask&unix.IN_Q_OVERFLOW != 0 { + select { + case w.Errors <- ErrEventOverflow: + case <-w.done: + return + } + } + + // If the event happened to the watched directory or the watched file, the kernel + // doesn't append the filename to the event, but we would like to always fill the + // the "Name" field with a valid filename. We retrieve the path of the watch from + // the "paths" map. + w.mu.Lock() + name, ok := w.paths[int(raw.Wd)] + // IN_DELETE_SELF occurs when the file/directory being watched is removed. + // This is a sign to clean up the maps, otherwise we are no longer in sync + // with the inotify kernel state which has already deleted the watch + // automatically. + if ok && mask&unix.IN_DELETE_SELF == unix.IN_DELETE_SELF { + delete(w.paths, int(raw.Wd)) + delete(w.watches, name) + } + w.mu.Unlock() + + if nameLen > 0 { + // Point "bytes" at the first byte of the filename + bytes := (*[unix.PathMax]byte)(unsafe.Pointer(&buf[offset+unix.SizeofInotifyEvent])) + // The filename is padded with NULL bytes. TrimRight() gets rid of those. + name += "/" + strings.TrimRight(string(bytes[0:nameLen]), "\000") + } + + event := newEvent(name, mask) + + // Send the events that are not ignored on the events channel + if !event.ignoreLinux(mask) { + select { + case w.Events <- event: + case <-w.done: + return + } + } + + // Move to the next event in the buffer + offset += unix.SizeofInotifyEvent + nameLen + } + } +} + +// Certain types of events can be "ignored" and not sent over the Events +// channel. Such as events marked ignore by the kernel, or MODIFY events +// against files that do not exist. +func (e *Event) ignoreLinux(mask uint32) bool { + // Ignore anything the inotify API says to ignore + if mask&unix.IN_IGNORED == unix.IN_IGNORED { + return true + } + + // If the event is not a DELETE or RENAME, the file must exist. + // Otherwise the event is ignored. + // *Note*: this was put in place because it was seen that a MODIFY + // event was sent after the DELETE. This ignores that MODIFY and + // assumes a DELETE will come or has come if the file doesn't exist. + if !(e.Op&Remove == Remove || e.Op&Rename == Rename) { + _, statErr := os.Lstat(e.Name) + return os.IsNotExist(statErr) + } + return false +} + +// newEvent returns an platform-independent Event based on an inotify mask. +func newEvent(name string, mask uint32) Event { + e := Event{Name: name} + if mask&unix.IN_CREATE == unix.IN_CREATE || mask&unix.IN_MOVED_TO == unix.IN_MOVED_TO { + e.Op |= Create + } + if mask&unix.IN_DELETE_SELF == unix.IN_DELETE_SELF || mask&unix.IN_DELETE == unix.IN_DELETE { + e.Op |= Remove + } + if mask&unix.IN_MODIFY == unix.IN_MODIFY { + e.Op |= Write + } + if mask&unix.IN_MOVE_SELF == unix.IN_MOVE_SELF || mask&unix.IN_MOVED_FROM == unix.IN_MOVED_FROM { + e.Op |= Rename + } + if mask&unix.IN_ATTRIB == unix.IN_ATTRIB { + e.Op |= Chmod + } + return e +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/fsnotify/fsnotify/inotify_poller.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/fsnotify/fsnotify/inotify_poller.go new file mode 100644 index 00000000..cc7db4b2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/fsnotify/fsnotify/inotify_poller.go @@ -0,0 +1,187 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build linux + +package fsnotify + +import ( + "errors" + + "golang.org/x/sys/unix" +) + +type fdPoller struct { + fd int // File descriptor (as returned by the inotify_init() syscall) + epfd int // Epoll file descriptor + pipe [2]int // Pipe for waking up +} + +func emptyPoller(fd int) *fdPoller { + poller := new(fdPoller) + poller.fd = fd + poller.epfd = -1 + poller.pipe[0] = -1 + poller.pipe[1] = -1 + return poller +} + +// Create a new inotify poller. +// This creates an inotify handler, and an epoll handler. +func newFdPoller(fd int) (*fdPoller, error) { + var errno error + poller := emptyPoller(fd) + defer func() { + if errno != nil { + poller.close() + } + }() + poller.fd = fd + + // Create epoll fd + poller.epfd, errno = unix.EpollCreate1(0) + if poller.epfd == -1 { + return nil, errno + } + // Create pipe; pipe[0] is the read end, pipe[1] the write end. + errno = unix.Pipe2(poller.pipe[:], unix.O_NONBLOCK) + if errno != nil { + return nil, errno + } + + // Register inotify fd with epoll + event := unix.EpollEvent{ + Fd: int32(poller.fd), + Events: unix.EPOLLIN, + } + errno = unix.EpollCtl(poller.epfd, unix.EPOLL_CTL_ADD, poller.fd, &event) + if errno != nil { + return nil, errno + } + + // Register pipe fd with epoll + event = unix.EpollEvent{ + Fd: int32(poller.pipe[0]), + Events: unix.EPOLLIN, + } + errno = unix.EpollCtl(poller.epfd, unix.EPOLL_CTL_ADD, poller.pipe[0], &event) + if errno != nil { + return nil, errno + } + + return poller, nil +} + +// Wait using epoll. +// Returns true if something is ready to be read, +// false if there is not. +func (poller *fdPoller) wait() (bool, error) { + // 3 possible events per fd, and 2 fds, makes a maximum of 6 events. + // I don't know whether epoll_wait returns the number of events returned, + // or the total number of events ready. + // I decided to catch both by making the buffer one larger than the maximum. + events := make([]unix.EpollEvent, 7) + for { + n, errno := unix.EpollWait(poller.epfd, events, -1) + if n == -1 { + if errno == unix.EINTR { + continue + } + return false, errno + } + if n == 0 { + // If there are no events, try again. + continue + } + if n > 6 { + // This should never happen. More events were returned than should be possible. + return false, errors.New("epoll_wait returned more events than I know what to do with") + } + ready := events[:n] + epollhup := false + epollerr := false + epollin := false + for _, event := range ready { + if event.Fd == int32(poller.fd) { + if event.Events&unix.EPOLLHUP != 0 { + // This should not happen, but if it does, treat it as a wakeup. + epollhup = true + } + if event.Events&unix.EPOLLERR != 0 { + // If an error is waiting on the file descriptor, we should pretend + // something is ready to read, and let unix.Read pick up the error. + epollerr = true + } + if event.Events&unix.EPOLLIN != 0 { + // There is data to read. + epollin = true + } + } + if event.Fd == int32(poller.pipe[0]) { + if event.Events&unix.EPOLLHUP != 0 { + // Write pipe descriptor was closed, by us. This means we're closing down the + // watcher, and we should wake up. + } + if event.Events&unix.EPOLLERR != 0 { + // If an error is waiting on the pipe file descriptor. + // This is an absolute mystery, and should never ever happen. + return false, errors.New("Error on the pipe descriptor.") + } + if event.Events&unix.EPOLLIN != 0 { + // This is a regular wakeup, so we have to clear the buffer. + err := poller.clearWake() + if err != nil { + return false, err + } + } + } + } + + if epollhup || epollerr || epollin { + return true, nil + } + return false, nil + } +} + +// Close the write end of the poller. +func (poller *fdPoller) wake() error { + buf := make([]byte, 1) + n, errno := unix.Write(poller.pipe[1], buf) + if n == -1 { + if errno == unix.EAGAIN { + // Buffer is full, poller will wake. + return nil + } + return errno + } + return nil +} + +func (poller *fdPoller) clearWake() error { + // You have to be woken up a LOT in order to get to 100! + buf := make([]byte, 100) + n, errno := unix.Read(poller.pipe[0], buf) + if n == -1 { + if errno == unix.EAGAIN { + // Buffer is empty, someone else cleared our wake. + return nil + } + return errno + } + return nil +} + +// Close all poller file descriptors, but not the one passed to it. +func (poller *fdPoller) close() { + if poller.pipe[1] != -1 { + unix.Close(poller.pipe[1]) + } + if poller.pipe[0] != -1 { + unix.Close(poller.pipe[0]) + } + if poller.epfd != -1 { + unix.Close(poller.epfd) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/fsnotify/fsnotify/kqueue.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/fsnotify/fsnotify/kqueue.go new file mode 100644 index 00000000..86e76a3d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/fsnotify/fsnotify/kqueue.go @@ -0,0 +1,521 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build freebsd openbsd netbsd dragonfly darwin + +package fsnotify + +import ( + "errors" + "fmt" + "io/ioutil" + "os" + "path/filepath" + "sync" + "time" + + "golang.org/x/sys/unix" +) + +// Watcher watches a set of files, delivering events to a channel. +type Watcher struct { + Events chan Event + Errors chan error + done chan struct{} // Channel for sending a "quit message" to the reader goroutine + + kq int // File descriptor (as returned by the kqueue() syscall). + + mu sync.Mutex // Protects access to watcher data + watches map[string]int // Map of watched file descriptors (key: path). + externalWatches map[string]bool // Map of watches added by user of the library. + dirFlags map[string]uint32 // Map of watched directories to fflags used in kqueue. + paths map[int]pathInfo // Map file descriptors to path names for processing kqueue events. + fileExists map[string]bool // Keep track of if we know this file exists (to stop duplicate create events). + isClosed bool // Set to true when Close() is first called +} + +type pathInfo struct { + name string + isDir bool +} + +// NewWatcher establishes a new watcher with the underlying OS and begins waiting for events. +func NewWatcher() (*Watcher, error) { + kq, err := kqueue() + if err != nil { + return nil, err + } + + w := &Watcher{ + kq: kq, + watches: make(map[string]int), + dirFlags: make(map[string]uint32), + paths: make(map[int]pathInfo), + fileExists: make(map[string]bool), + externalWatches: make(map[string]bool), + Events: make(chan Event), + Errors: make(chan error), + done: make(chan struct{}), + } + + go w.readEvents() + return w, nil +} + +// Close removes all watches and closes the events channel. +func (w *Watcher) Close() error { + w.mu.Lock() + if w.isClosed { + w.mu.Unlock() + return nil + } + w.isClosed = true + + // copy paths to remove while locked + var pathsToRemove = make([]string, 0, len(w.watches)) + for name := range w.watches { + pathsToRemove = append(pathsToRemove, name) + } + w.mu.Unlock() + // unlock before calling Remove, which also locks + + for _, name := range pathsToRemove { + w.Remove(name) + } + + // send a "quit" message to the reader goroutine + close(w.done) + + return nil +} + +// Add starts watching the named file or directory (non-recursively). +func (w *Watcher) Add(name string) error { + w.mu.Lock() + w.externalWatches[name] = true + w.mu.Unlock() + _, err := w.addWatch(name, noteAllEvents) + return err +} + +// Remove stops watching the the named file or directory (non-recursively). +func (w *Watcher) Remove(name string) error { + name = filepath.Clean(name) + w.mu.Lock() + watchfd, ok := w.watches[name] + w.mu.Unlock() + if !ok { + return fmt.Errorf("can't remove non-existent kevent watch for: %s", name) + } + + const registerRemove = unix.EV_DELETE + if err := register(w.kq, []int{watchfd}, registerRemove, 0); err != nil { + return err + } + + unix.Close(watchfd) + + w.mu.Lock() + isDir := w.paths[watchfd].isDir + delete(w.watches, name) + delete(w.paths, watchfd) + delete(w.dirFlags, name) + w.mu.Unlock() + + // Find all watched paths that are in this directory that are not external. + if isDir { + var pathsToRemove []string + w.mu.Lock() + for _, path := range w.paths { + wdir, _ := filepath.Split(path.name) + if filepath.Clean(wdir) == name { + if !w.externalWatches[path.name] { + pathsToRemove = append(pathsToRemove, path.name) + } + } + } + w.mu.Unlock() + for _, name := range pathsToRemove { + // Since these are internal, not much sense in propagating error + // to the user, as that will just confuse them with an error about + // a path they did not explicitly watch themselves. + w.Remove(name) + } + } + + return nil +} + +// Watch all events (except NOTE_EXTEND, NOTE_LINK, NOTE_REVOKE) +const noteAllEvents = unix.NOTE_DELETE | unix.NOTE_WRITE | unix.NOTE_ATTRIB | unix.NOTE_RENAME + +// keventWaitTime to block on each read from kevent +var keventWaitTime = durationToTimespec(100 * time.Millisecond) + +// addWatch adds name to the watched file set. +// The flags are interpreted as described in kevent(2). +// Returns the real path to the file which was added, if any, which may be different from the one passed in the case of symlinks. +func (w *Watcher) addWatch(name string, flags uint32) (string, error) { + var isDir bool + // Make ./name and name equivalent + name = filepath.Clean(name) + + w.mu.Lock() + if w.isClosed { + w.mu.Unlock() + return "", errors.New("kevent instance already closed") + } + watchfd, alreadyWatching := w.watches[name] + // We already have a watch, but we can still override flags. + if alreadyWatching { + isDir = w.paths[watchfd].isDir + } + w.mu.Unlock() + + if !alreadyWatching { + fi, err := os.Lstat(name) + if err != nil { + return "", err + } + + // Don't watch sockets. + if fi.Mode()&os.ModeSocket == os.ModeSocket { + return "", nil + } + + // Don't watch named pipes. + if fi.Mode()&os.ModeNamedPipe == os.ModeNamedPipe { + return "", nil + } + + // Follow Symlinks + // Unfortunately, Linux can add bogus symlinks to watch list without + // issue, and Windows can't do symlinks period (AFAIK). To maintain + // consistency, we will act like everything is fine. There will simply + // be no file events for broken symlinks. + // Hence the returns of nil on errors. + if fi.Mode()&os.ModeSymlink == os.ModeSymlink { + name, err = filepath.EvalSymlinks(name) + if err != nil { + return "", nil + } + + w.mu.Lock() + _, alreadyWatching = w.watches[name] + w.mu.Unlock() + + if alreadyWatching { + return name, nil + } + + fi, err = os.Lstat(name) + if err != nil { + return "", nil + } + } + + watchfd, err = unix.Open(name, openMode, 0700) + if watchfd == -1 { + return "", err + } + + isDir = fi.IsDir() + } + + const registerAdd = unix.EV_ADD | unix.EV_CLEAR | unix.EV_ENABLE + if err := register(w.kq, []int{watchfd}, registerAdd, flags); err != nil { + unix.Close(watchfd) + return "", err + } + + if !alreadyWatching { + w.mu.Lock() + w.watches[name] = watchfd + w.paths[watchfd] = pathInfo{name: name, isDir: isDir} + w.mu.Unlock() + } + + if isDir { + // Watch the directory if it has not been watched before, + // or if it was watched before, but perhaps only a NOTE_DELETE (watchDirectoryFiles) + w.mu.Lock() + + watchDir := (flags&unix.NOTE_WRITE) == unix.NOTE_WRITE && + (!alreadyWatching || (w.dirFlags[name]&unix.NOTE_WRITE) != unix.NOTE_WRITE) + // Store flags so this watch can be updated later + w.dirFlags[name] = flags + w.mu.Unlock() + + if watchDir { + if err := w.watchDirectoryFiles(name); err != nil { + return "", err + } + } + } + return name, nil +} + +// readEvents reads from kqueue and converts the received kevents into +// Event values that it sends down the Events channel. +func (w *Watcher) readEvents() { + eventBuffer := make([]unix.Kevent_t, 10) + +loop: + for { + // See if there is a message on the "done" channel + select { + case <-w.done: + break loop + default: + } + + // Get new events + kevents, err := read(w.kq, eventBuffer, &keventWaitTime) + // EINTR is okay, the syscall was interrupted before timeout expired. + if err != nil && err != unix.EINTR { + select { + case w.Errors <- err: + case <-w.done: + break loop + } + continue + } + + // Flush the events we received to the Events channel + for len(kevents) > 0 { + kevent := &kevents[0] + watchfd := int(kevent.Ident) + mask := uint32(kevent.Fflags) + w.mu.Lock() + path := w.paths[watchfd] + w.mu.Unlock() + event := newEvent(path.name, mask) + + if path.isDir && !(event.Op&Remove == Remove) { + // Double check to make sure the directory exists. This can happen when + // we do a rm -fr on a recursively watched folders and we receive a + // modification event first but the folder has been deleted and later + // receive the delete event + if _, err := os.Lstat(event.Name); os.IsNotExist(err) { + // mark is as delete event + event.Op |= Remove + } + } + + if event.Op&Rename == Rename || event.Op&Remove == Remove { + w.Remove(event.Name) + w.mu.Lock() + delete(w.fileExists, event.Name) + w.mu.Unlock() + } + + if path.isDir && event.Op&Write == Write && !(event.Op&Remove == Remove) { + w.sendDirectoryChangeEvents(event.Name) + } else { + // Send the event on the Events channel. + select { + case w.Events <- event: + case <-w.done: + break loop + } + } + + if event.Op&Remove == Remove { + // Look for a file that may have overwritten this. + // For example, mv f1 f2 will delete f2, then create f2. + if path.isDir { + fileDir := filepath.Clean(event.Name) + w.mu.Lock() + _, found := w.watches[fileDir] + w.mu.Unlock() + if found { + // make sure the directory exists before we watch for changes. When we + // do a recursive watch and perform rm -fr, the parent directory might + // have gone missing, ignore the missing directory and let the + // upcoming delete event remove the watch from the parent directory. + if _, err := os.Lstat(fileDir); err == nil { + w.sendDirectoryChangeEvents(fileDir) + } + } + } else { + filePath := filepath.Clean(event.Name) + if fileInfo, err := os.Lstat(filePath); err == nil { + w.sendFileCreatedEventIfNew(filePath, fileInfo) + } + } + } + + // Move to next event + kevents = kevents[1:] + } + } + + // cleanup + err := unix.Close(w.kq) + if err != nil { + // only way the previous loop breaks is if w.done was closed so we need to async send to w.Errors. + select { + case w.Errors <- err: + default: + } + } + close(w.Events) + close(w.Errors) +} + +// newEvent returns an platform-independent Event based on kqueue Fflags. +func newEvent(name string, mask uint32) Event { + e := Event{Name: name} + if mask&unix.NOTE_DELETE == unix.NOTE_DELETE { + e.Op |= Remove + } + if mask&unix.NOTE_WRITE == unix.NOTE_WRITE { + e.Op |= Write + } + if mask&unix.NOTE_RENAME == unix.NOTE_RENAME { + e.Op |= Rename + } + if mask&unix.NOTE_ATTRIB == unix.NOTE_ATTRIB { + e.Op |= Chmod + } + return e +} + +func newCreateEvent(name string) Event { + return Event{Name: name, Op: Create} +} + +// watchDirectoryFiles to mimic inotify when adding a watch on a directory +func (w *Watcher) watchDirectoryFiles(dirPath string) error { + // Get all files + files, err := ioutil.ReadDir(dirPath) + if err != nil { + return err + } + + for _, fileInfo := range files { + filePath := filepath.Join(dirPath, fileInfo.Name()) + filePath, err = w.internalWatch(filePath, fileInfo) + if err != nil { + return err + } + + w.mu.Lock() + w.fileExists[filePath] = true + w.mu.Unlock() + } + + return nil +} + +// sendDirectoryEvents searches the directory for newly created files +// and sends them over the event channel. This functionality is to have +// the BSD version of fsnotify match Linux inotify which provides a +// create event for files created in a watched directory. +func (w *Watcher) sendDirectoryChangeEvents(dirPath string) { + // Get all files + files, err := ioutil.ReadDir(dirPath) + if err != nil { + select { + case w.Errors <- err: + case <-w.done: + return + } + } + + // Search for new files + for _, fileInfo := range files { + filePath := filepath.Join(dirPath, fileInfo.Name()) + err := w.sendFileCreatedEventIfNew(filePath, fileInfo) + + if err != nil { + return + } + } +} + +// sendFileCreatedEvent sends a create event if the file isn't already being tracked. +func (w *Watcher) sendFileCreatedEventIfNew(filePath string, fileInfo os.FileInfo) (err error) { + w.mu.Lock() + _, doesExist := w.fileExists[filePath] + w.mu.Unlock() + if !doesExist { + // Send create event + select { + case w.Events <- newCreateEvent(filePath): + case <-w.done: + return + } + } + + // like watchDirectoryFiles (but without doing another ReadDir) + filePath, err = w.internalWatch(filePath, fileInfo) + if err != nil { + return err + } + + w.mu.Lock() + w.fileExists[filePath] = true + w.mu.Unlock() + + return nil +} + +func (w *Watcher) internalWatch(name string, fileInfo os.FileInfo) (string, error) { + if fileInfo.IsDir() { + // mimic Linux providing delete events for subdirectories + // but preserve the flags used if currently watching subdirectory + w.mu.Lock() + flags := w.dirFlags[name] + w.mu.Unlock() + + flags |= unix.NOTE_DELETE | unix.NOTE_RENAME + return w.addWatch(name, flags) + } + + // watch file to mimic Linux inotify + return w.addWatch(name, noteAllEvents) +} + +// kqueue creates a new kernel event queue and returns a descriptor. +func kqueue() (kq int, err error) { + kq, err = unix.Kqueue() + if kq == -1 { + return kq, err + } + return kq, nil +} + +// register events with the queue +func register(kq int, fds []int, flags int, fflags uint32) error { + changes := make([]unix.Kevent_t, len(fds)) + + for i, fd := range fds { + // SetKevent converts int to the platform-specific types: + unix.SetKevent(&changes[i], fd, unix.EVFILT_VNODE, flags) + changes[i].Fflags = fflags + } + + // register the events + success, err := unix.Kevent(kq, changes, nil, nil) + if success == -1 { + return err + } + return nil +} + +// read retrieves pending events, or waits until an event occurs. +// A timeout of nil blocks indefinitely, while 0 polls the queue. +func read(kq int, events []unix.Kevent_t, timeout *unix.Timespec) ([]unix.Kevent_t, error) { + n, err := unix.Kevent(kq, nil, events, timeout) + if err != nil { + return nil, err + } + return events[0:n], nil +} + +// durationToTimespec prepares a timeout value +func durationToTimespec(d time.Duration) unix.Timespec { + return unix.NsecToTimespec(d.Nanoseconds()) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/fsnotify/fsnotify/open_mode_bsd.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/fsnotify/fsnotify/open_mode_bsd.go new file mode 100644 index 00000000..7d8de145 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/fsnotify/fsnotify/open_mode_bsd.go @@ -0,0 +1,11 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build freebsd openbsd netbsd dragonfly + +package fsnotify + +import "golang.org/x/sys/unix" + +const openMode = unix.O_NONBLOCK | unix.O_RDONLY diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/fsnotify/fsnotify/open_mode_darwin.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/fsnotify/fsnotify/open_mode_darwin.go new file mode 100644 index 00000000..9139e171 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/fsnotify/fsnotify/open_mode_darwin.go @@ -0,0 +1,12 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build darwin + +package fsnotify + +import "golang.org/x/sys/unix" + +// note: this constant is not defined on BSD +const openMode = unix.O_EVTONLY diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/fsnotify/fsnotify/windows.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/fsnotify/fsnotify/windows.go new file mode 100644 index 00000000..09436f31 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/fsnotify/fsnotify/windows.go @@ -0,0 +1,561 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build windows + +package fsnotify + +import ( + "errors" + "fmt" + "os" + "path/filepath" + "runtime" + "sync" + "syscall" + "unsafe" +) + +// Watcher watches a set of files, delivering events to a channel. +type Watcher struct { + Events chan Event + Errors chan error + isClosed bool // Set to true when Close() is first called + mu sync.Mutex // Map access + port syscall.Handle // Handle to completion port + watches watchMap // Map of watches (key: i-number) + input chan *input // Inputs to the reader are sent on this channel + quit chan chan<- error +} + +// NewWatcher establishes a new watcher with the underlying OS and begins waiting for events. +func NewWatcher() (*Watcher, error) { + port, e := syscall.CreateIoCompletionPort(syscall.InvalidHandle, 0, 0, 0) + if e != nil { + return nil, os.NewSyscallError("CreateIoCompletionPort", e) + } + w := &Watcher{ + port: port, + watches: make(watchMap), + input: make(chan *input, 1), + Events: make(chan Event, 50), + Errors: make(chan error), + quit: make(chan chan<- error, 1), + } + go w.readEvents() + return w, nil +} + +// Close removes all watches and closes the events channel. +func (w *Watcher) Close() error { + if w.isClosed { + return nil + } + w.isClosed = true + + // Send "quit" message to the reader goroutine + ch := make(chan error) + w.quit <- ch + if err := w.wakeupReader(); err != nil { + return err + } + return <-ch +} + +// Add starts watching the named file or directory (non-recursively). +func (w *Watcher) Add(name string) error { + if w.isClosed { + return errors.New("watcher already closed") + } + in := &input{ + op: opAddWatch, + path: filepath.Clean(name), + flags: sysFSALLEVENTS, + reply: make(chan error), + } + w.input <- in + if err := w.wakeupReader(); err != nil { + return err + } + return <-in.reply +} + +// Remove stops watching the the named file or directory (non-recursively). +func (w *Watcher) Remove(name string) error { + in := &input{ + op: opRemoveWatch, + path: filepath.Clean(name), + reply: make(chan error), + } + w.input <- in + if err := w.wakeupReader(); err != nil { + return err + } + return <-in.reply +} + +const ( + // Options for AddWatch + sysFSONESHOT = 0x80000000 + sysFSONLYDIR = 0x1000000 + + // Events + sysFSACCESS = 0x1 + sysFSALLEVENTS = 0xfff + sysFSATTRIB = 0x4 + sysFSCLOSE = 0x18 + sysFSCREATE = 0x100 + sysFSDELETE = 0x200 + sysFSDELETESELF = 0x400 + sysFSMODIFY = 0x2 + sysFSMOVE = 0xc0 + sysFSMOVEDFROM = 0x40 + sysFSMOVEDTO = 0x80 + sysFSMOVESELF = 0x800 + + // Special events + sysFSIGNORED = 0x8000 + sysFSQOVERFLOW = 0x4000 +) + +func newEvent(name string, mask uint32) Event { + e := Event{Name: name} + if mask&sysFSCREATE == sysFSCREATE || mask&sysFSMOVEDTO == sysFSMOVEDTO { + e.Op |= Create + } + if mask&sysFSDELETE == sysFSDELETE || mask&sysFSDELETESELF == sysFSDELETESELF { + e.Op |= Remove + } + if mask&sysFSMODIFY == sysFSMODIFY { + e.Op |= Write + } + if mask&sysFSMOVE == sysFSMOVE || mask&sysFSMOVESELF == sysFSMOVESELF || mask&sysFSMOVEDFROM == sysFSMOVEDFROM { + e.Op |= Rename + } + if mask&sysFSATTRIB == sysFSATTRIB { + e.Op |= Chmod + } + return e +} + +const ( + opAddWatch = iota + opRemoveWatch +) + +const ( + provisional uint64 = 1 << (32 + iota) +) + +type input struct { + op int + path string + flags uint32 + reply chan error +} + +type inode struct { + handle syscall.Handle + volume uint32 + index uint64 +} + +type watch struct { + ov syscall.Overlapped + ino *inode // i-number + path string // Directory path + mask uint64 // Directory itself is being watched with these notify flags + names map[string]uint64 // Map of names being watched and their notify flags + rename string // Remembers the old name while renaming a file + buf [4096]byte +} + +type indexMap map[uint64]*watch +type watchMap map[uint32]indexMap + +func (w *Watcher) wakeupReader() error { + e := syscall.PostQueuedCompletionStatus(w.port, 0, 0, nil) + if e != nil { + return os.NewSyscallError("PostQueuedCompletionStatus", e) + } + return nil +} + +func getDir(pathname string) (dir string, err error) { + attr, e := syscall.GetFileAttributes(syscall.StringToUTF16Ptr(pathname)) + if e != nil { + return "", os.NewSyscallError("GetFileAttributes", e) + } + if attr&syscall.FILE_ATTRIBUTE_DIRECTORY != 0 { + dir = pathname + } else { + dir, _ = filepath.Split(pathname) + dir = filepath.Clean(dir) + } + return +} + +func getIno(path string) (ino *inode, err error) { + h, e := syscall.CreateFile(syscall.StringToUTF16Ptr(path), + syscall.FILE_LIST_DIRECTORY, + syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE, + nil, syscall.OPEN_EXISTING, + syscall.FILE_FLAG_BACKUP_SEMANTICS|syscall.FILE_FLAG_OVERLAPPED, 0) + if e != nil { + return nil, os.NewSyscallError("CreateFile", e) + } + var fi syscall.ByHandleFileInformation + if e = syscall.GetFileInformationByHandle(h, &fi); e != nil { + syscall.CloseHandle(h) + return nil, os.NewSyscallError("GetFileInformationByHandle", e) + } + ino = &inode{ + handle: h, + volume: fi.VolumeSerialNumber, + index: uint64(fi.FileIndexHigh)<<32 | uint64(fi.FileIndexLow), + } + return ino, nil +} + +// Must run within the I/O thread. +func (m watchMap) get(ino *inode) *watch { + if i := m[ino.volume]; i != nil { + return i[ino.index] + } + return nil +} + +// Must run within the I/O thread. +func (m watchMap) set(ino *inode, watch *watch) { + i := m[ino.volume] + if i == nil { + i = make(indexMap) + m[ino.volume] = i + } + i[ino.index] = watch +} + +// Must run within the I/O thread. +func (w *Watcher) addWatch(pathname string, flags uint64) error { + dir, err := getDir(pathname) + if err != nil { + return err + } + if flags&sysFSONLYDIR != 0 && pathname != dir { + return nil + } + ino, err := getIno(dir) + if err != nil { + return err + } + w.mu.Lock() + watchEntry := w.watches.get(ino) + w.mu.Unlock() + if watchEntry == nil { + if _, e := syscall.CreateIoCompletionPort(ino.handle, w.port, 0, 0); e != nil { + syscall.CloseHandle(ino.handle) + return os.NewSyscallError("CreateIoCompletionPort", e) + } + watchEntry = &watch{ + ino: ino, + path: dir, + names: make(map[string]uint64), + } + w.mu.Lock() + w.watches.set(ino, watchEntry) + w.mu.Unlock() + flags |= provisional + } else { + syscall.CloseHandle(ino.handle) + } + if pathname == dir { + watchEntry.mask |= flags + } else { + watchEntry.names[filepath.Base(pathname)] |= flags + } + if err = w.startRead(watchEntry); err != nil { + return err + } + if pathname == dir { + watchEntry.mask &= ^provisional + } else { + watchEntry.names[filepath.Base(pathname)] &= ^provisional + } + return nil +} + +// Must run within the I/O thread. +func (w *Watcher) remWatch(pathname string) error { + dir, err := getDir(pathname) + if err != nil { + return err + } + ino, err := getIno(dir) + if err != nil { + return err + } + w.mu.Lock() + watch := w.watches.get(ino) + w.mu.Unlock() + if watch == nil { + return fmt.Errorf("can't remove non-existent watch for: %s", pathname) + } + if pathname == dir { + w.sendEvent(watch.path, watch.mask&sysFSIGNORED) + watch.mask = 0 + } else { + name := filepath.Base(pathname) + w.sendEvent(filepath.Join(watch.path, name), watch.names[name]&sysFSIGNORED) + delete(watch.names, name) + } + return w.startRead(watch) +} + +// Must run within the I/O thread. +func (w *Watcher) deleteWatch(watch *watch) { + for name, mask := range watch.names { + if mask&provisional == 0 { + w.sendEvent(filepath.Join(watch.path, name), mask&sysFSIGNORED) + } + delete(watch.names, name) + } + if watch.mask != 0 { + if watch.mask&provisional == 0 { + w.sendEvent(watch.path, watch.mask&sysFSIGNORED) + } + watch.mask = 0 + } +} + +// Must run within the I/O thread. +func (w *Watcher) startRead(watch *watch) error { + if e := syscall.CancelIo(watch.ino.handle); e != nil { + w.Errors <- os.NewSyscallError("CancelIo", e) + w.deleteWatch(watch) + } + mask := toWindowsFlags(watch.mask) + for _, m := range watch.names { + mask |= toWindowsFlags(m) + } + if mask == 0 { + if e := syscall.CloseHandle(watch.ino.handle); e != nil { + w.Errors <- os.NewSyscallError("CloseHandle", e) + } + w.mu.Lock() + delete(w.watches[watch.ino.volume], watch.ino.index) + w.mu.Unlock() + return nil + } + e := syscall.ReadDirectoryChanges(watch.ino.handle, &watch.buf[0], + uint32(unsafe.Sizeof(watch.buf)), false, mask, nil, &watch.ov, 0) + if e != nil { + err := os.NewSyscallError("ReadDirectoryChanges", e) + if e == syscall.ERROR_ACCESS_DENIED && watch.mask&provisional == 0 { + // Watched directory was probably removed + if w.sendEvent(watch.path, watch.mask&sysFSDELETESELF) { + if watch.mask&sysFSONESHOT != 0 { + watch.mask = 0 + } + } + err = nil + } + w.deleteWatch(watch) + w.startRead(watch) + return err + } + return nil +} + +// readEvents reads from the I/O completion port, converts the +// received events into Event objects and sends them via the Events channel. +// Entry point to the I/O thread. +func (w *Watcher) readEvents() { + var ( + n, key uint32 + ov *syscall.Overlapped + ) + runtime.LockOSThread() + + for { + e := syscall.GetQueuedCompletionStatus(w.port, &n, &key, &ov, syscall.INFINITE) + watch := (*watch)(unsafe.Pointer(ov)) + + if watch == nil { + select { + case ch := <-w.quit: + w.mu.Lock() + var indexes []indexMap + for _, index := range w.watches { + indexes = append(indexes, index) + } + w.mu.Unlock() + for _, index := range indexes { + for _, watch := range index { + w.deleteWatch(watch) + w.startRead(watch) + } + } + var err error + if e := syscall.CloseHandle(w.port); e != nil { + err = os.NewSyscallError("CloseHandle", e) + } + close(w.Events) + close(w.Errors) + ch <- err + return + case in := <-w.input: + switch in.op { + case opAddWatch: + in.reply <- w.addWatch(in.path, uint64(in.flags)) + case opRemoveWatch: + in.reply <- w.remWatch(in.path) + } + default: + } + continue + } + + switch e { + case syscall.ERROR_MORE_DATA: + if watch == nil { + w.Errors <- errors.New("ERROR_MORE_DATA has unexpectedly null lpOverlapped buffer") + } else { + // The i/o succeeded but the buffer is full. + // In theory we should be building up a full packet. + // In practice we can get away with just carrying on. + n = uint32(unsafe.Sizeof(watch.buf)) + } + case syscall.ERROR_ACCESS_DENIED: + // Watched directory was probably removed + w.sendEvent(watch.path, watch.mask&sysFSDELETESELF) + w.deleteWatch(watch) + w.startRead(watch) + continue + case syscall.ERROR_OPERATION_ABORTED: + // CancelIo was called on this handle + continue + default: + w.Errors <- os.NewSyscallError("GetQueuedCompletionPort", e) + continue + case nil: + } + + var offset uint32 + for { + if n == 0 { + w.Events <- newEvent("", sysFSQOVERFLOW) + w.Errors <- errors.New("short read in readEvents()") + break + } + + // Point "raw" to the event in the buffer + raw := (*syscall.FileNotifyInformation)(unsafe.Pointer(&watch.buf[offset])) + buf := (*[syscall.MAX_PATH]uint16)(unsafe.Pointer(&raw.FileName)) + name := syscall.UTF16ToString(buf[:raw.FileNameLength/2]) + fullname := filepath.Join(watch.path, name) + + var mask uint64 + switch raw.Action { + case syscall.FILE_ACTION_REMOVED: + mask = sysFSDELETESELF + case syscall.FILE_ACTION_MODIFIED: + mask = sysFSMODIFY + case syscall.FILE_ACTION_RENAMED_OLD_NAME: + watch.rename = name + case syscall.FILE_ACTION_RENAMED_NEW_NAME: + if watch.names[watch.rename] != 0 { + watch.names[name] |= watch.names[watch.rename] + delete(watch.names, watch.rename) + mask = sysFSMOVESELF + } + } + + sendNameEvent := func() { + if w.sendEvent(fullname, watch.names[name]&mask) { + if watch.names[name]&sysFSONESHOT != 0 { + delete(watch.names, name) + } + } + } + if raw.Action != syscall.FILE_ACTION_RENAMED_NEW_NAME { + sendNameEvent() + } + if raw.Action == syscall.FILE_ACTION_REMOVED { + w.sendEvent(fullname, watch.names[name]&sysFSIGNORED) + delete(watch.names, name) + } + if w.sendEvent(fullname, watch.mask&toFSnotifyFlags(raw.Action)) { + if watch.mask&sysFSONESHOT != 0 { + watch.mask = 0 + } + } + if raw.Action == syscall.FILE_ACTION_RENAMED_NEW_NAME { + fullname = filepath.Join(watch.path, watch.rename) + sendNameEvent() + } + + // Move to the next event in the buffer + if raw.NextEntryOffset == 0 { + break + } + offset += raw.NextEntryOffset + + // Error! + if offset >= n { + w.Errors <- errors.New("Windows system assumed buffer larger than it is, events have likely been missed.") + break + } + } + + if err := w.startRead(watch); err != nil { + w.Errors <- err + } + } +} + +func (w *Watcher) sendEvent(name string, mask uint64) bool { + if mask == 0 { + return false + } + event := newEvent(name, uint32(mask)) + select { + case ch := <-w.quit: + w.quit <- ch + case w.Events <- event: + } + return true +} + +func toWindowsFlags(mask uint64) uint32 { + var m uint32 + if mask&sysFSACCESS != 0 { + m |= syscall.FILE_NOTIFY_CHANGE_LAST_ACCESS + } + if mask&sysFSMODIFY != 0 { + m |= syscall.FILE_NOTIFY_CHANGE_LAST_WRITE + } + if mask&sysFSATTRIB != 0 { + m |= syscall.FILE_NOTIFY_CHANGE_ATTRIBUTES + } + if mask&(sysFSMOVE|sysFSCREATE|sysFSDELETE) != 0 { + m |= syscall.FILE_NOTIFY_CHANGE_FILE_NAME | syscall.FILE_NOTIFY_CHANGE_DIR_NAME + } + return m +} + +func toFSnotifyFlags(action uint32) uint64 { + switch action { + case syscall.FILE_ACTION_ADDED: + return sysFSCREATE + case syscall.FILE_ACTION_REMOVED: + return sysFSDELETE + case syscall.FILE_ACTION_MODIFIED: + return sysFSMODIFY + case syscall.FILE_ACTION_RENAMED_OLD_NAME: + return sysFSMOVEDFROM + case syscall.FILE_ACTION_RENAMED_NEW_NAME: + return sysFSMOVEDTO + } + return 0 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/AUTHORS b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/AUTHORS new file mode 100644 index 00000000..15167cd7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/AUTHORS @@ -0,0 +1,3 @@ +# This source code refers to The Go Authors for copyright purposes. +# The master list of authors is in the main Go distribution, +# visible at http://tip.golang.org/AUTHORS. diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/CONTRIBUTORS b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/CONTRIBUTORS new file mode 100644 index 00000000..1c4577e9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/CONTRIBUTORS @@ -0,0 +1,3 @@ +# This source code was written by the Go contributors. +# The master list of contributors is in the main Go distribution, +# visible at http://tip.golang.org/CONTRIBUTORS. diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/LICENSE b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/LICENSE new file mode 100644 index 00000000..0f646931 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/LICENSE @@ -0,0 +1,28 @@ +Copyright 2010 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/proto/clone.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/proto/clone.go new file mode 100644 index 00000000..3cd3249f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/proto/clone.go @@ -0,0 +1,253 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2011 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Protocol buffer deep copy and merge. +// TODO: RawMessage. + +package proto + +import ( + "fmt" + "log" + "reflect" + "strings" +) + +// Clone returns a deep copy of a protocol buffer. +func Clone(src Message) Message { + in := reflect.ValueOf(src) + if in.IsNil() { + return src + } + out := reflect.New(in.Type().Elem()) + dst := out.Interface().(Message) + Merge(dst, src) + return dst +} + +// Merger is the interface representing objects that can merge messages of the same type. +type Merger interface { + // Merge merges src into this message. + // Required and optional fields that are set in src will be set to that value in dst. + // Elements of repeated fields will be appended. + // + // Merge may panic if called with a different argument type than the receiver. + Merge(src Message) +} + +// generatedMerger is the custom merge method that generated protos will have. +// We must add this method since a generate Merge method will conflict with +// many existing protos that have a Merge data field already defined. +type generatedMerger interface { + XXX_Merge(src Message) +} + +// Merge merges src into dst. +// Required and optional fields that are set in src will be set to that value in dst. +// Elements of repeated fields will be appended. +// Merge panics if src and dst are not the same type, or if dst is nil. +func Merge(dst, src Message) { + if m, ok := dst.(Merger); ok { + m.Merge(src) + return + } + + in := reflect.ValueOf(src) + out := reflect.ValueOf(dst) + if out.IsNil() { + panic("proto: nil destination") + } + if in.Type() != out.Type() { + panic(fmt.Sprintf("proto.Merge(%T, %T) type mismatch", dst, src)) + } + if in.IsNil() { + return // Merge from nil src is a noop + } + if m, ok := dst.(generatedMerger); ok { + m.XXX_Merge(src) + return + } + mergeStruct(out.Elem(), in.Elem()) +} + +func mergeStruct(out, in reflect.Value) { + sprop := GetProperties(in.Type()) + for i := 0; i < in.NumField(); i++ { + f := in.Type().Field(i) + if strings.HasPrefix(f.Name, "XXX_") { + continue + } + mergeAny(out.Field(i), in.Field(i), false, sprop.Prop[i]) + } + + if emIn, err := extendable(in.Addr().Interface()); err == nil { + emOut, _ := extendable(out.Addr().Interface()) + mIn, muIn := emIn.extensionsRead() + if mIn != nil { + mOut := emOut.extensionsWrite() + muIn.Lock() + mergeExtension(mOut, mIn) + muIn.Unlock() + } + } + + uf := in.FieldByName("XXX_unrecognized") + if !uf.IsValid() { + return + } + uin := uf.Bytes() + if len(uin) > 0 { + out.FieldByName("XXX_unrecognized").SetBytes(append([]byte(nil), uin...)) + } +} + +// mergeAny performs a merge between two values of the same type. +// viaPtr indicates whether the values were indirected through a pointer (implying proto2). +// prop is set if this is a struct field (it may be nil). +func mergeAny(out, in reflect.Value, viaPtr bool, prop *Properties) { + if in.Type() == protoMessageType { + if !in.IsNil() { + if out.IsNil() { + out.Set(reflect.ValueOf(Clone(in.Interface().(Message)))) + } else { + Merge(out.Interface().(Message), in.Interface().(Message)) + } + } + return + } + switch in.Kind() { + case reflect.Bool, reflect.Float32, reflect.Float64, reflect.Int32, reflect.Int64, + reflect.String, reflect.Uint32, reflect.Uint64: + if !viaPtr && isProto3Zero(in) { + return + } + out.Set(in) + case reflect.Interface: + // Probably a oneof field; copy non-nil values. + if in.IsNil() { + return + } + // Allocate destination if it is not set, or set to a different type. + // Otherwise we will merge as normal. + if out.IsNil() || out.Elem().Type() != in.Elem().Type() { + out.Set(reflect.New(in.Elem().Elem().Type())) // interface -> *T -> T -> new(T) + } + mergeAny(out.Elem(), in.Elem(), false, nil) + case reflect.Map: + if in.Len() == 0 { + return + } + if out.IsNil() { + out.Set(reflect.MakeMap(in.Type())) + } + // For maps with value types of *T or []byte we need to deep copy each value. + elemKind := in.Type().Elem().Kind() + for _, key := range in.MapKeys() { + var val reflect.Value + switch elemKind { + case reflect.Ptr: + val = reflect.New(in.Type().Elem().Elem()) + mergeAny(val, in.MapIndex(key), false, nil) + case reflect.Slice: + val = in.MapIndex(key) + val = reflect.ValueOf(append([]byte{}, val.Bytes()...)) + default: + val = in.MapIndex(key) + } + out.SetMapIndex(key, val) + } + case reflect.Ptr: + if in.IsNil() { + return + } + if out.IsNil() { + out.Set(reflect.New(in.Elem().Type())) + } + mergeAny(out.Elem(), in.Elem(), true, nil) + case reflect.Slice: + if in.IsNil() { + return + } + if in.Type().Elem().Kind() == reflect.Uint8 { + // []byte is a scalar bytes field, not a repeated field. + + // Edge case: if this is in a proto3 message, a zero length + // bytes field is considered the zero value, and should not + // be merged. + if prop != nil && prop.proto3 && in.Len() == 0 { + return + } + + // Make a deep copy. + // Append to []byte{} instead of []byte(nil) so that we never end up + // with a nil result. + out.SetBytes(append([]byte{}, in.Bytes()...)) + return + } + n := in.Len() + if out.IsNil() { + out.Set(reflect.MakeSlice(in.Type(), 0, n)) + } + switch in.Type().Elem().Kind() { + case reflect.Bool, reflect.Float32, reflect.Float64, reflect.Int32, reflect.Int64, + reflect.String, reflect.Uint32, reflect.Uint64: + out.Set(reflect.AppendSlice(out, in)) + default: + for i := 0; i < n; i++ { + x := reflect.Indirect(reflect.New(in.Type().Elem())) + mergeAny(x, in.Index(i), false, nil) + out.Set(reflect.Append(out, x)) + } + } + case reflect.Struct: + mergeStruct(out, in) + default: + // unknown type, so not a protocol buffer + log.Printf("proto: don't know how to copy %v", in) + } +} + +func mergeExtension(out, in map[int32]Extension) { + for extNum, eIn := range in { + eOut := Extension{desc: eIn.desc} + if eIn.value != nil { + v := reflect.New(reflect.TypeOf(eIn.value)).Elem() + mergeAny(v, reflect.ValueOf(eIn.value), false, nil) + eOut.value = v.Interface() + } + if eIn.enc != nil { + eOut.enc = make([]byte, len(eIn.enc)) + copy(eOut.enc, eIn.enc) + } + + out[extNum] = eOut + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/proto/decode.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/proto/decode.go new file mode 100644 index 00000000..d9aa3c42 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/proto/decode.go @@ -0,0 +1,428 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +/* + * Routines for decoding protocol buffer data to construct in-memory representations. + */ + +import ( + "errors" + "fmt" + "io" +) + +// errOverflow is returned when an integer is too large to be represented. +var errOverflow = errors.New("proto: integer overflow") + +// ErrInternalBadWireType is returned by generated code when an incorrect +// wire type is encountered. It does not get returned to user code. +var ErrInternalBadWireType = errors.New("proto: internal error: bad wiretype for oneof") + +// DecodeVarint reads a varint-encoded integer from the slice. +// It returns the integer and the number of bytes consumed, or +// zero if there is not enough. +// This is the format for the +// int32, int64, uint32, uint64, bool, and enum +// protocol buffer types. +func DecodeVarint(buf []byte) (x uint64, n int) { + for shift := uint(0); shift < 64; shift += 7 { + if n >= len(buf) { + return 0, 0 + } + b := uint64(buf[n]) + n++ + x |= (b & 0x7F) << shift + if (b & 0x80) == 0 { + return x, n + } + } + + // The number is too large to represent in a 64-bit value. + return 0, 0 +} + +func (p *Buffer) decodeVarintSlow() (x uint64, err error) { + i := p.index + l := len(p.buf) + + for shift := uint(0); shift < 64; shift += 7 { + if i >= l { + err = io.ErrUnexpectedEOF + return + } + b := p.buf[i] + i++ + x |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + p.index = i + return + } + } + + // The number is too large to represent in a 64-bit value. + err = errOverflow + return +} + +// DecodeVarint reads a varint-encoded integer from the Buffer. +// This is the format for the +// int32, int64, uint32, uint64, bool, and enum +// protocol buffer types. +func (p *Buffer) DecodeVarint() (x uint64, err error) { + i := p.index + buf := p.buf + + if i >= len(buf) { + return 0, io.ErrUnexpectedEOF + } else if buf[i] < 0x80 { + p.index++ + return uint64(buf[i]), nil + } else if len(buf)-i < 10 { + return p.decodeVarintSlow() + } + + var b uint64 + // we already checked the first byte + x = uint64(buf[i]) - 0x80 + i++ + + b = uint64(buf[i]) + i++ + x += b << 7 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 7 + + b = uint64(buf[i]) + i++ + x += b << 14 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 14 + + b = uint64(buf[i]) + i++ + x += b << 21 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 21 + + b = uint64(buf[i]) + i++ + x += b << 28 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 28 + + b = uint64(buf[i]) + i++ + x += b << 35 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 35 + + b = uint64(buf[i]) + i++ + x += b << 42 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 42 + + b = uint64(buf[i]) + i++ + x += b << 49 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 49 + + b = uint64(buf[i]) + i++ + x += b << 56 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 56 + + b = uint64(buf[i]) + i++ + x += b << 63 + if b&0x80 == 0 { + goto done + } + // x -= 0x80 << 63 // Always zero. + + return 0, errOverflow + +done: + p.index = i + return x, nil +} + +// DecodeFixed64 reads a 64-bit integer from the Buffer. +// This is the format for the +// fixed64, sfixed64, and double protocol buffer types. +func (p *Buffer) DecodeFixed64() (x uint64, err error) { + // x, err already 0 + i := p.index + 8 + if i < 0 || i > len(p.buf) { + err = io.ErrUnexpectedEOF + return + } + p.index = i + + x = uint64(p.buf[i-8]) + x |= uint64(p.buf[i-7]) << 8 + x |= uint64(p.buf[i-6]) << 16 + x |= uint64(p.buf[i-5]) << 24 + x |= uint64(p.buf[i-4]) << 32 + x |= uint64(p.buf[i-3]) << 40 + x |= uint64(p.buf[i-2]) << 48 + x |= uint64(p.buf[i-1]) << 56 + return +} + +// DecodeFixed32 reads a 32-bit integer from the Buffer. +// This is the format for the +// fixed32, sfixed32, and float protocol buffer types. +func (p *Buffer) DecodeFixed32() (x uint64, err error) { + // x, err already 0 + i := p.index + 4 + if i < 0 || i > len(p.buf) { + err = io.ErrUnexpectedEOF + return + } + p.index = i + + x = uint64(p.buf[i-4]) + x |= uint64(p.buf[i-3]) << 8 + x |= uint64(p.buf[i-2]) << 16 + x |= uint64(p.buf[i-1]) << 24 + return +} + +// DecodeZigzag64 reads a zigzag-encoded 64-bit integer +// from the Buffer. +// This is the format used for the sint64 protocol buffer type. +func (p *Buffer) DecodeZigzag64() (x uint64, err error) { + x, err = p.DecodeVarint() + if err != nil { + return + } + x = (x >> 1) ^ uint64((int64(x&1)<<63)>>63) + return +} + +// DecodeZigzag32 reads a zigzag-encoded 32-bit integer +// from the Buffer. +// This is the format used for the sint32 protocol buffer type. +func (p *Buffer) DecodeZigzag32() (x uint64, err error) { + x, err = p.DecodeVarint() + if err != nil { + return + } + x = uint64((uint32(x) >> 1) ^ uint32((int32(x&1)<<31)>>31)) + return +} + +// DecodeRawBytes reads a count-delimited byte buffer from the Buffer. +// This is the format used for the bytes protocol buffer +// type and for embedded messages. +func (p *Buffer) DecodeRawBytes(alloc bool) (buf []byte, err error) { + n, err := p.DecodeVarint() + if err != nil { + return nil, err + } + + nb := int(n) + if nb < 0 { + return nil, fmt.Errorf("proto: bad byte length %d", nb) + } + end := p.index + nb + if end < p.index || end > len(p.buf) { + return nil, io.ErrUnexpectedEOF + } + + if !alloc { + // todo: check if can get more uses of alloc=false + buf = p.buf[p.index:end] + p.index += nb + return + } + + buf = make([]byte, nb) + copy(buf, p.buf[p.index:]) + p.index += nb + return +} + +// DecodeStringBytes reads an encoded string from the Buffer. +// This is the format used for the proto2 string type. +func (p *Buffer) DecodeStringBytes() (s string, err error) { + buf, err := p.DecodeRawBytes(false) + if err != nil { + return + } + return string(buf), nil +} + +// Unmarshaler is the interface representing objects that can +// unmarshal themselves. The argument points to data that may be +// overwritten, so implementations should not keep references to the +// buffer. +// Unmarshal implementations should not clear the receiver. +// Any unmarshaled data should be merged into the receiver. +// Callers of Unmarshal that do not want to retain existing data +// should Reset the receiver before calling Unmarshal. +type Unmarshaler interface { + Unmarshal([]byte) error +} + +// newUnmarshaler is the interface representing objects that can +// unmarshal themselves. The semantics are identical to Unmarshaler. +// +// This exists to support protoc-gen-go generated messages. +// The proto package will stop type-asserting to this interface in the future. +// +// DO NOT DEPEND ON THIS. +type newUnmarshaler interface { + XXX_Unmarshal([]byte) error +} + +// Unmarshal parses the protocol buffer representation in buf and places the +// decoded result in pb. If the struct underlying pb does not match +// the data in buf, the results can be unpredictable. +// +// Unmarshal resets pb before starting to unmarshal, so any +// existing data in pb is always removed. Use UnmarshalMerge +// to preserve and append to existing data. +func Unmarshal(buf []byte, pb Message) error { + pb.Reset() + if u, ok := pb.(newUnmarshaler); ok { + return u.XXX_Unmarshal(buf) + } + if u, ok := pb.(Unmarshaler); ok { + return u.Unmarshal(buf) + } + return NewBuffer(buf).Unmarshal(pb) +} + +// UnmarshalMerge parses the protocol buffer representation in buf and +// writes the decoded result to pb. If the struct underlying pb does not match +// the data in buf, the results can be unpredictable. +// +// UnmarshalMerge merges into existing data in pb. +// Most code should use Unmarshal instead. +func UnmarshalMerge(buf []byte, pb Message) error { + if u, ok := pb.(newUnmarshaler); ok { + return u.XXX_Unmarshal(buf) + } + if u, ok := pb.(Unmarshaler); ok { + // NOTE: The history of proto have unfortunately been inconsistent + // whether Unmarshaler should or should not implicitly clear itself. + // Some implementations do, most do not. + // Thus, calling this here may or may not do what people want. + // + // See https://github.com/golang/protobuf/issues/424 + return u.Unmarshal(buf) + } + return NewBuffer(buf).Unmarshal(pb) +} + +// DecodeMessage reads a count-delimited message from the Buffer. +func (p *Buffer) DecodeMessage(pb Message) error { + enc, err := p.DecodeRawBytes(false) + if err != nil { + return err + } + return NewBuffer(enc).Unmarshal(pb) +} + +// DecodeGroup reads a tag-delimited group from the Buffer. +// StartGroup tag is already consumed. This function consumes +// EndGroup tag. +func (p *Buffer) DecodeGroup(pb Message) error { + b := p.buf[p.index:] + x, y := findEndGroup(b) + if x < 0 { + return io.ErrUnexpectedEOF + } + err := Unmarshal(b[:x], pb) + p.index += y + return err +} + +// Unmarshal parses the protocol buffer representation in the +// Buffer and places the decoded result in pb. If the struct +// underlying pb does not match the data in the buffer, the results can be +// unpredictable. +// +// Unlike proto.Unmarshal, this does not reset pb before starting to unmarshal. +func (p *Buffer) Unmarshal(pb Message) error { + // If the object can unmarshal itself, let it. + if u, ok := pb.(newUnmarshaler); ok { + err := u.XXX_Unmarshal(p.buf[p.index:]) + p.index = len(p.buf) + return err + } + if u, ok := pb.(Unmarshaler); ok { + // NOTE: The history of proto have unfortunately been inconsistent + // whether Unmarshaler should or should not implicitly clear itself. + // Some implementations do, most do not. + // Thus, calling this here may or may not do what people want. + // + // See https://github.com/golang/protobuf/issues/424 + err := u.Unmarshal(p.buf[p.index:]) + p.index = len(p.buf) + return err + } + + // Slow workaround for messages that aren't Unmarshalers. + // This includes some hand-coded .pb.go files and + // bootstrap protos. + // TODO: fix all of those and then add Unmarshal to + // the Message interface. Then: + // The cast above and code below can be deleted. + // The old unmarshaler can be deleted. + // Clients can call Unmarshal directly (can already do that, actually). + var info InternalMessageInfo + err := info.Unmarshal(pb, p.buf[p.index:]) + p.index = len(p.buf) + return err +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/proto/discard.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/proto/discard.go new file mode 100644 index 00000000..dea2617c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/proto/discard.go @@ -0,0 +1,350 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2017 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "fmt" + "reflect" + "strings" + "sync" + "sync/atomic" +) + +type generatedDiscarder interface { + XXX_DiscardUnknown() +} + +// DiscardUnknown recursively discards all unknown fields from this message +// and all embedded messages. +// +// When unmarshaling a message with unrecognized fields, the tags and values +// of such fields are preserved in the Message. This allows a later call to +// marshal to be able to produce a message that continues to have those +// unrecognized fields. To avoid this, DiscardUnknown is used to +// explicitly clear the unknown fields after unmarshaling. +// +// For proto2 messages, the unknown fields of message extensions are only +// discarded from messages that have been accessed via GetExtension. +func DiscardUnknown(m Message) { + if m, ok := m.(generatedDiscarder); ok { + m.XXX_DiscardUnknown() + return + } + // TODO: Dynamically populate a InternalMessageInfo for legacy messages, + // but the master branch has no implementation for InternalMessageInfo, + // so it would be more work to replicate that approach. + discardLegacy(m) +} + +// DiscardUnknown recursively discards all unknown fields. +func (a *InternalMessageInfo) DiscardUnknown(m Message) { + di := atomicLoadDiscardInfo(&a.discard) + if di == nil { + di = getDiscardInfo(reflect.TypeOf(m).Elem()) + atomicStoreDiscardInfo(&a.discard, di) + } + di.discard(toPointer(&m)) +} + +type discardInfo struct { + typ reflect.Type + + initialized int32 // 0: only typ is valid, 1: everything is valid + lock sync.Mutex + + fields []discardFieldInfo + unrecognized field +} + +type discardFieldInfo struct { + field field // Offset of field, guaranteed to be valid + discard func(src pointer) +} + +var ( + discardInfoMap = map[reflect.Type]*discardInfo{} + discardInfoLock sync.Mutex +) + +func getDiscardInfo(t reflect.Type) *discardInfo { + discardInfoLock.Lock() + defer discardInfoLock.Unlock() + di := discardInfoMap[t] + if di == nil { + di = &discardInfo{typ: t} + discardInfoMap[t] = di + } + return di +} + +func (di *discardInfo) discard(src pointer) { + if src.isNil() { + return // Nothing to do. + } + + if atomic.LoadInt32(&di.initialized) == 0 { + di.computeDiscardInfo() + } + + for _, fi := range di.fields { + sfp := src.offset(fi.field) + fi.discard(sfp) + } + + // For proto2 messages, only discard unknown fields in message extensions + // that have been accessed via GetExtension. + if em, err := extendable(src.asPointerTo(di.typ).Interface()); err == nil { + // Ignore lock since DiscardUnknown is not concurrency safe. + emm, _ := em.extensionsRead() + for _, mx := range emm { + if m, ok := mx.value.(Message); ok { + DiscardUnknown(m) + } + } + } + + if di.unrecognized.IsValid() { + *src.offset(di.unrecognized).toBytes() = nil + } +} + +func (di *discardInfo) computeDiscardInfo() { + di.lock.Lock() + defer di.lock.Unlock() + if di.initialized != 0 { + return + } + t := di.typ + n := t.NumField() + + for i := 0; i < n; i++ { + f := t.Field(i) + if strings.HasPrefix(f.Name, "XXX_") { + continue + } + + dfi := discardFieldInfo{field: toField(&f)} + tf := f.Type + + // Unwrap tf to get its most basic type. + var isPointer, isSlice bool + if tf.Kind() == reflect.Slice && tf.Elem().Kind() != reflect.Uint8 { + isSlice = true + tf = tf.Elem() + } + if tf.Kind() == reflect.Ptr { + isPointer = true + tf = tf.Elem() + } + if isPointer && isSlice && tf.Kind() != reflect.Struct { + panic(fmt.Sprintf("%v.%s cannot be a slice of pointers to primitive types", t, f.Name)) + } + + switch tf.Kind() { + case reflect.Struct: + switch { + case !isPointer: + panic(fmt.Sprintf("%v.%s cannot be a direct struct value", t, f.Name)) + case isSlice: // E.g., []*pb.T + di := getDiscardInfo(tf) + dfi.discard = func(src pointer) { + sps := src.getPointerSlice() + for _, sp := range sps { + if !sp.isNil() { + di.discard(sp) + } + } + } + default: // E.g., *pb.T + di := getDiscardInfo(tf) + dfi.discard = func(src pointer) { + sp := src.getPointer() + if !sp.isNil() { + di.discard(sp) + } + } + } + case reflect.Map: + switch { + case isPointer || isSlice: + panic(fmt.Sprintf("%v.%s cannot be a pointer to a map or a slice of map values", t, f.Name)) + default: // E.g., map[K]V + if tf.Elem().Kind() == reflect.Ptr { // Proto struct (e.g., *T) + dfi.discard = func(src pointer) { + sm := src.asPointerTo(tf).Elem() + if sm.Len() == 0 { + return + } + for _, key := range sm.MapKeys() { + val := sm.MapIndex(key) + DiscardUnknown(val.Interface().(Message)) + } + } + } else { + dfi.discard = func(pointer) {} // Noop + } + } + case reflect.Interface: + // Must be oneof field. + switch { + case isPointer || isSlice: + panic(fmt.Sprintf("%v.%s cannot be a pointer to a interface or a slice of interface values", t, f.Name)) + default: // E.g., interface{} + // TODO: Make this faster? + dfi.discard = func(src pointer) { + su := src.asPointerTo(tf).Elem() + if !su.IsNil() { + sv := su.Elem().Elem().Field(0) + if sv.Kind() == reflect.Ptr && sv.IsNil() { + return + } + switch sv.Type().Kind() { + case reflect.Ptr: // Proto struct (e.g., *T) + DiscardUnknown(sv.Interface().(Message)) + } + } + } + } + default: + continue + } + di.fields = append(di.fields, dfi) + } + + di.unrecognized = invalidField + if f, ok := t.FieldByName("XXX_unrecognized"); ok { + if f.Type != reflect.TypeOf([]byte{}) { + panic("expected XXX_unrecognized to be of type []byte") + } + di.unrecognized = toField(&f) + } + + atomic.StoreInt32(&di.initialized, 1) +} + +func discardLegacy(m Message) { + v := reflect.ValueOf(m) + if v.Kind() != reflect.Ptr || v.IsNil() { + return + } + v = v.Elem() + if v.Kind() != reflect.Struct { + return + } + t := v.Type() + + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if strings.HasPrefix(f.Name, "XXX_") { + continue + } + vf := v.Field(i) + tf := f.Type + + // Unwrap tf to get its most basic type. + var isPointer, isSlice bool + if tf.Kind() == reflect.Slice && tf.Elem().Kind() != reflect.Uint8 { + isSlice = true + tf = tf.Elem() + } + if tf.Kind() == reflect.Ptr { + isPointer = true + tf = tf.Elem() + } + if isPointer && isSlice && tf.Kind() != reflect.Struct { + panic(fmt.Sprintf("%T.%s cannot be a slice of pointers to primitive types", m, f.Name)) + } + + switch tf.Kind() { + case reflect.Struct: + switch { + case !isPointer: + panic(fmt.Sprintf("%T.%s cannot be a direct struct value", m, f.Name)) + case isSlice: // E.g., []*pb.T + for j := 0; j < vf.Len(); j++ { + discardLegacy(vf.Index(j).Interface().(Message)) + } + default: // E.g., *pb.T + discardLegacy(vf.Interface().(Message)) + } + case reflect.Map: + switch { + case isPointer || isSlice: + panic(fmt.Sprintf("%T.%s cannot be a pointer to a map or a slice of map values", m, f.Name)) + default: // E.g., map[K]V + tv := vf.Type().Elem() + if tv.Kind() == reflect.Ptr && tv.Implements(protoMessageType) { // Proto struct (e.g., *T) + for _, key := range vf.MapKeys() { + val := vf.MapIndex(key) + discardLegacy(val.Interface().(Message)) + } + } + } + case reflect.Interface: + // Must be oneof field. + switch { + case isPointer || isSlice: + panic(fmt.Sprintf("%T.%s cannot be a pointer to a interface or a slice of interface values", m, f.Name)) + default: // E.g., test_proto.isCommunique_Union interface + if !vf.IsNil() && f.Tag.Get("protobuf_oneof") != "" { + vf = vf.Elem() // E.g., *test_proto.Communique_Msg + if !vf.IsNil() { + vf = vf.Elem() // E.g., test_proto.Communique_Msg + vf = vf.Field(0) // E.g., Proto struct (e.g., *T) or primitive value + if vf.Kind() == reflect.Ptr { + discardLegacy(vf.Interface().(Message)) + } + } + } + } + } + } + + if vf := v.FieldByName("XXX_unrecognized"); vf.IsValid() { + if vf.Type() != reflect.TypeOf([]byte{}) { + panic("expected XXX_unrecognized to be of type []byte") + } + vf.Set(reflect.ValueOf([]byte(nil))) + } + + // For proto2 messages, only discard unknown fields in message extensions + // that have been accessed via GetExtension. + if em, err := extendable(m); err == nil { + // Ignore lock since discardLegacy is not concurrency safe. + emm, _ := em.extensionsRead() + for _, mx := range emm { + if m, ok := mx.value.(Message); ok { + discardLegacy(m) + } + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/proto/encode.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/proto/encode.go new file mode 100644 index 00000000..3abfed2c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/proto/encode.go @@ -0,0 +1,203 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +/* + * Routines for encoding data into the wire format for protocol buffers. + */ + +import ( + "errors" + "reflect" +) + +var ( + // errRepeatedHasNil is the error returned if Marshal is called with + // a struct with a repeated field containing a nil element. + errRepeatedHasNil = errors.New("proto: repeated field has nil element") + + // errOneofHasNil is the error returned if Marshal is called with + // a struct with a oneof field containing a nil element. + errOneofHasNil = errors.New("proto: oneof field has nil value") + + // ErrNil is the error returned if Marshal is called with nil. + ErrNil = errors.New("proto: Marshal called with nil") + + // ErrTooLarge is the error returned if Marshal is called with a + // message that encodes to >2GB. + ErrTooLarge = errors.New("proto: message encodes to over 2 GB") +) + +// The fundamental encoders that put bytes on the wire. +// Those that take integer types all accept uint64 and are +// therefore of type valueEncoder. + +const maxVarintBytes = 10 // maximum length of a varint + +// EncodeVarint returns the varint encoding of x. +// This is the format for the +// int32, int64, uint32, uint64, bool, and enum +// protocol buffer types. +// Not used by the package itself, but helpful to clients +// wishing to use the same encoding. +func EncodeVarint(x uint64) []byte { + var buf [maxVarintBytes]byte + var n int + for n = 0; x > 127; n++ { + buf[n] = 0x80 | uint8(x&0x7F) + x >>= 7 + } + buf[n] = uint8(x) + n++ + return buf[0:n] +} + +// EncodeVarint writes a varint-encoded integer to the Buffer. +// This is the format for the +// int32, int64, uint32, uint64, bool, and enum +// protocol buffer types. +func (p *Buffer) EncodeVarint(x uint64) error { + for x >= 1<<7 { + p.buf = append(p.buf, uint8(x&0x7f|0x80)) + x >>= 7 + } + p.buf = append(p.buf, uint8(x)) + return nil +} + +// SizeVarint returns the varint encoding size of an integer. +func SizeVarint(x uint64) int { + switch { + case x < 1<<7: + return 1 + case x < 1<<14: + return 2 + case x < 1<<21: + return 3 + case x < 1<<28: + return 4 + case x < 1<<35: + return 5 + case x < 1<<42: + return 6 + case x < 1<<49: + return 7 + case x < 1<<56: + return 8 + case x < 1<<63: + return 9 + } + return 10 +} + +// EncodeFixed64 writes a 64-bit integer to the Buffer. +// This is the format for the +// fixed64, sfixed64, and double protocol buffer types. +func (p *Buffer) EncodeFixed64(x uint64) error { + p.buf = append(p.buf, + uint8(x), + uint8(x>>8), + uint8(x>>16), + uint8(x>>24), + uint8(x>>32), + uint8(x>>40), + uint8(x>>48), + uint8(x>>56)) + return nil +} + +// EncodeFixed32 writes a 32-bit integer to the Buffer. +// This is the format for the +// fixed32, sfixed32, and float protocol buffer types. +func (p *Buffer) EncodeFixed32(x uint64) error { + p.buf = append(p.buf, + uint8(x), + uint8(x>>8), + uint8(x>>16), + uint8(x>>24)) + return nil +} + +// EncodeZigzag64 writes a zigzag-encoded 64-bit integer +// to the Buffer. +// This is the format used for the sint64 protocol buffer type. +func (p *Buffer) EncodeZigzag64(x uint64) error { + // use signed number to get arithmetic right shift. + return p.EncodeVarint(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} + +// EncodeZigzag32 writes a zigzag-encoded 32-bit integer +// to the Buffer. +// This is the format used for the sint32 protocol buffer type. +func (p *Buffer) EncodeZigzag32(x uint64) error { + // use signed number to get arithmetic right shift. + return p.EncodeVarint(uint64((uint32(x) << 1) ^ uint32((int32(x) >> 31)))) +} + +// EncodeRawBytes writes a count-delimited byte buffer to the Buffer. +// This is the format used for the bytes protocol buffer +// type and for embedded messages. +func (p *Buffer) EncodeRawBytes(b []byte) error { + p.EncodeVarint(uint64(len(b))) + p.buf = append(p.buf, b...) + return nil +} + +// EncodeStringBytes writes an encoded string to the Buffer. +// This is the format used for the proto2 string type. +func (p *Buffer) EncodeStringBytes(s string) error { + p.EncodeVarint(uint64(len(s))) + p.buf = append(p.buf, s...) + return nil +} + +// Marshaler is the interface representing objects that can marshal themselves. +type Marshaler interface { + Marshal() ([]byte, error) +} + +// EncodeMessage writes the protocol buffer to the Buffer, +// prefixed by a varint-encoded length. +func (p *Buffer) EncodeMessage(pb Message) error { + siz := Size(pb) + p.EncodeVarint(uint64(siz)) + return p.Marshal(pb) +} + +// All protocol buffer fields are nillable, but be careful. +func isNil(v reflect.Value) bool { + switch v.Kind() { + case reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice: + return v.IsNil() + } + return false +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/proto/equal.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/proto/equal.go new file mode 100644 index 00000000..d4db5a1c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/proto/equal.go @@ -0,0 +1,300 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2011 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Protocol buffer comparison. + +package proto + +import ( + "bytes" + "log" + "reflect" + "strings" +) + +/* +Equal returns true iff protocol buffers a and b are equal. +The arguments must both be pointers to protocol buffer structs. + +Equality is defined in this way: + - Two messages are equal iff they are the same type, + corresponding fields are equal, unknown field sets + are equal, and extensions sets are equal. + - Two set scalar fields are equal iff their values are equal. + If the fields are of a floating-point type, remember that + NaN != x for all x, including NaN. If the message is defined + in a proto3 .proto file, fields are not "set"; specifically, + zero length proto3 "bytes" fields are equal (nil == {}). + - Two repeated fields are equal iff their lengths are the same, + and their corresponding elements are equal. Note a "bytes" field, + although represented by []byte, is not a repeated field and the + rule for the scalar fields described above applies. + - Two unset fields are equal. + - Two unknown field sets are equal if their current + encoded state is equal. + - Two extension sets are equal iff they have corresponding + elements that are pairwise equal. + - Two map fields are equal iff their lengths are the same, + and they contain the same set of elements. Zero-length map + fields are equal. + - Every other combination of things are not equal. + +The return value is undefined if a and b are not protocol buffers. +*/ +func Equal(a, b Message) bool { + if a == nil || b == nil { + return a == b + } + v1, v2 := reflect.ValueOf(a), reflect.ValueOf(b) + if v1.Type() != v2.Type() { + return false + } + if v1.Kind() == reflect.Ptr { + if v1.IsNil() { + return v2.IsNil() + } + if v2.IsNil() { + return false + } + v1, v2 = v1.Elem(), v2.Elem() + } + if v1.Kind() != reflect.Struct { + return false + } + return equalStruct(v1, v2) +} + +// v1 and v2 are known to have the same type. +func equalStruct(v1, v2 reflect.Value) bool { + sprop := GetProperties(v1.Type()) + for i := 0; i < v1.NumField(); i++ { + f := v1.Type().Field(i) + if strings.HasPrefix(f.Name, "XXX_") { + continue + } + f1, f2 := v1.Field(i), v2.Field(i) + if f.Type.Kind() == reflect.Ptr { + if n1, n2 := f1.IsNil(), f2.IsNil(); n1 && n2 { + // both unset + continue + } else if n1 != n2 { + // set/unset mismatch + return false + } + f1, f2 = f1.Elem(), f2.Elem() + } + if !equalAny(f1, f2, sprop.Prop[i]) { + return false + } + } + + if em1 := v1.FieldByName("XXX_InternalExtensions"); em1.IsValid() { + em2 := v2.FieldByName("XXX_InternalExtensions") + if !equalExtensions(v1.Type(), em1.Interface().(XXX_InternalExtensions), em2.Interface().(XXX_InternalExtensions)) { + return false + } + } + + if em1 := v1.FieldByName("XXX_extensions"); em1.IsValid() { + em2 := v2.FieldByName("XXX_extensions") + if !equalExtMap(v1.Type(), em1.Interface().(map[int32]Extension), em2.Interface().(map[int32]Extension)) { + return false + } + } + + uf := v1.FieldByName("XXX_unrecognized") + if !uf.IsValid() { + return true + } + + u1 := uf.Bytes() + u2 := v2.FieldByName("XXX_unrecognized").Bytes() + return bytes.Equal(u1, u2) +} + +// v1 and v2 are known to have the same type. +// prop may be nil. +func equalAny(v1, v2 reflect.Value, prop *Properties) bool { + if v1.Type() == protoMessageType { + m1, _ := v1.Interface().(Message) + m2, _ := v2.Interface().(Message) + return Equal(m1, m2) + } + switch v1.Kind() { + case reflect.Bool: + return v1.Bool() == v2.Bool() + case reflect.Float32, reflect.Float64: + return v1.Float() == v2.Float() + case reflect.Int32, reflect.Int64: + return v1.Int() == v2.Int() + case reflect.Interface: + // Probably a oneof field; compare the inner values. + n1, n2 := v1.IsNil(), v2.IsNil() + if n1 || n2 { + return n1 == n2 + } + e1, e2 := v1.Elem(), v2.Elem() + if e1.Type() != e2.Type() { + return false + } + return equalAny(e1, e2, nil) + case reflect.Map: + if v1.Len() != v2.Len() { + return false + } + for _, key := range v1.MapKeys() { + val2 := v2.MapIndex(key) + if !val2.IsValid() { + // This key was not found in the second map. + return false + } + if !equalAny(v1.MapIndex(key), val2, nil) { + return false + } + } + return true + case reflect.Ptr: + // Maps may have nil values in them, so check for nil. + if v1.IsNil() && v2.IsNil() { + return true + } + if v1.IsNil() != v2.IsNil() { + return false + } + return equalAny(v1.Elem(), v2.Elem(), prop) + case reflect.Slice: + if v1.Type().Elem().Kind() == reflect.Uint8 { + // short circuit: []byte + + // Edge case: if this is in a proto3 message, a zero length + // bytes field is considered the zero value. + if prop != nil && prop.proto3 && v1.Len() == 0 && v2.Len() == 0 { + return true + } + if v1.IsNil() != v2.IsNil() { + return false + } + return bytes.Equal(v1.Interface().([]byte), v2.Interface().([]byte)) + } + + if v1.Len() != v2.Len() { + return false + } + for i := 0; i < v1.Len(); i++ { + if !equalAny(v1.Index(i), v2.Index(i), prop) { + return false + } + } + return true + case reflect.String: + return v1.Interface().(string) == v2.Interface().(string) + case reflect.Struct: + return equalStruct(v1, v2) + case reflect.Uint32, reflect.Uint64: + return v1.Uint() == v2.Uint() + } + + // unknown type, so not a protocol buffer + log.Printf("proto: don't know how to compare %v", v1) + return false +} + +// base is the struct type that the extensions are based on. +// x1 and x2 are InternalExtensions. +func equalExtensions(base reflect.Type, x1, x2 XXX_InternalExtensions) bool { + em1, _ := x1.extensionsRead() + em2, _ := x2.extensionsRead() + return equalExtMap(base, em1, em2) +} + +func equalExtMap(base reflect.Type, em1, em2 map[int32]Extension) bool { + if len(em1) != len(em2) { + return false + } + + for extNum, e1 := range em1 { + e2, ok := em2[extNum] + if !ok { + return false + } + + m1, m2 := e1.value, e2.value + + if m1 == nil && m2 == nil { + // Both have only encoded form. + if bytes.Equal(e1.enc, e2.enc) { + continue + } + // The bytes are different, but the extensions might still be + // equal. We need to decode them to compare. + } + + if m1 != nil && m2 != nil { + // Both are unencoded. + if !equalAny(reflect.ValueOf(m1), reflect.ValueOf(m2), nil) { + return false + } + continue + } + + // At least one is encoded. To do a semantically correct comparison + // we need to unmarshal them first. + var desc *ExtensionDesc + if m := extensionMaps[base]; m != nil { + desc = m[extNum] + } + if desc == nil { + // If both have only encoded form and the bytes are the same, + // it is handled above. We get here when the bytes are different. + // We don't know how to decode it, so just compare them as byte + // slices. + log.Printf("proto: don't know how to compare extension %d of %v", extNum, base) + return false + } + var err error + if m1 == nil { + m1, err = decodeExtension(e1.enc, desc) + } + if m2 == nil && err == nil { + m2, err = decodeExtension(e2.enc, desc) + } + if err != nil { + // The encoded form is invalid. + log.Printf("proto: badly encoded extension %d of %v: %v", extNum, base, err) + return false + } + if !equalAny(reflect.ValueOf(m1), reflect.ValueOf(m2), nil) { + return false + } + } + + return true +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/proto/extensions.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/proto/extensions.go new file mode 100644 index 00000000..816a3b9d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/proto/extensions.go @@ -0,0 +1,543 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +/* + * Types and routines for supporting protocol buffer extensions. + */ + +import ( + "errors" + "fmt" + "io" + "reflect" + "strconv" + "sync" +) + +// ErrMissingExtension is the error returned by GetExtension if the named extension is not in the message. +var ErrMissingExtension = errors.New("proto: missing extension") + +// ExtensionRange represents a range of message extensions for a protocol buffer. +// Used in code generated by the protocol compiler. +type ExtensionRange struct { + Start, End int32 // both inclusive +} + +// extendableProto is an interface implemented by any protocol buffer generated by the current +// proto compiler that may be extended. +type extendableProto interface { + Message + ExtensionRangeArray() []ExtensionRange + extensionsWrite() map[int32]Extension + extensionsRead() (map[int32]Extension, sync.Locker) +} + +// extendableProtoV1 is an interface implemented by a protocol buffer generated by the previous +// version of the proto compiler that may be extended. +type extendableProtoV1 interface { + Message + ExtensionRangeArray() []ExtensionRange + ExtensionMap() map[int32]Extension +} + +// extensionAdapter is a wrapper around extendableProtoV1 that implements extendableProto. +type extensionAdapter struct { + extendableProtoV1 +} + +func (e extensionAdapter) extensionsWrite() map[int32]Extension { + return e.ExtensionMap() +} + +func (e extensionAdapter) extensionsRead() (map[int32]Extension, sync.Locker) { + return e.ExtensionMap(), notLocker{} +} + +// notLocker is a sync.Locker whose Lock and Unlock methods are nops. +type notLocker struct{} + +func (n notLocker) Lock() {} +func (n notLocker) Unlock() {} + +// extendable returns the extendableProto interface for the given generated proto message. +// If the proto message has the old extension format, it returns a wrapper that implements +// the extendableProto interface. +func extendable(p interface{}) (extendableProto, error) { + switch p := p.(type) { + case extendableProto: + if isNilPtr(p) { + return nil, fmt.Errorf("proto: nil %T is not extendable", p) + } + return p, nil + case extendableProtoV1: + if isNilPtr(p) { + return nil, fmt.Errorf("proto: nil %T is not extendable", p) + } + return extensionAdapter{p}, nil + } + // Don't allocate a specific error containing %T: + // this is the hot path for Clone and MarshalText. + return nil, errNotExtendable +} + +var errNotExtendable = errors.New("proto: not an extendable proto.Message") + +func isNilPtr(x interface{}) bool { + v := reflect.ValueOf(x) + return v.Kind() == reflect.Ptr && v.IsNil() +} + +// XXX_InternalExtensions is an internal representation of proto extensions. +// +// Each generated message struct type embeds an anonymous XXX_InternalExtensions field, +// thus gaining the unexported 'extensions' method, which can be called only from the proto package. +// +// The methods of XXX_InternalExtensions are not concurrency safe in general, +// but calls to logically read-only methods such as has and get may be executed concurrently. +type XXX_InternalExtensions struct { + // The struct must be indirect so that if a user inadvertently copies a + // generated message and its embedded XXX_InternalExtensions, they + // avoid the mayhem of a copied mutex. + // + // The mutex serializes all logically read-only operations to p.extensionMap. + // It is up to the client to ensure that write operations to p.extensionMap are + // mutually exclusive with other accesses. + p *struct { + mu sync.Mutex + extensionMap map[int32]Extension + } +} + +// extensionsWrite returns the extension map, creating it on first use. +func (e *XXX_InternalExtensions) extensionsWrite() map[int32]Extension { + if e.p == nil { + e.p = new(struct { + mu sync.Mutex + extensionMap map[int32]Extension + }) + e.p.extensionMap = make(map[int32]Extension) + } + return e.p.extensionMap +} + +// extensionsRead returns the extensions map for read-only use. It may be nil. +// The caller must hold the returned mutex's lock when accessing Elements within the map. +func (e *XXX_InternalExtensions) extensionsRead() (map[int32]Extension, sync.Locker) { + if e.p == nil { + return nil, nil + } + return e.p.extensionMap, &e.p.mu +} + +// ExtensionDesc represents an extension specification. +// Used in generated code from the protocol compiler. +type ExtensionDesc struct { + ExtendedType Message // nil pointer to the type that is being extended + ExtensionType interface{} // nil pointer to the extension type + Field int32 // field number + Name string // fully-qualified name of extension, for text formatting + Tag string // protobuf tag style + Filename string // name of the file in which the extension is defined +} + +func (ed *ExtensionDesc) repeated() bool { + t := reflect.TypeOf(ed.ExtensionType) + return t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 +} + +// Extension represents an extension in a message. +type Extension struct { + // When an extension is stored in a message using SetExtension + // only desc and value are set. When the message is marshaled + // enc will be set to the encoded form of the message. + // + // When a message is unmarshaled and contains extensions, each + // extension will have only enc set. When such an extension is + // accessed using GetExtension (or GetExtensions) desc and value + // will be set. + desc *ExtensionDesc + value interface{} + enc []byte +} + +// SetRawExtension is for testing only. +func SetRawExtension(base Message, id int32, b []byte) { + epb, err := extendable(base) + if err != nil { + return + } + extmap := epb.extensionsWrite() + extmap[id] = Extension{enc: b} +} + +// isExtensionField returns true iff the given field number is in an extension range. +func isExtensionField(pb extendableProto, field int32) bool { + for _, er := range pb.ExtensionRangeArray() { + if er.Start <= field && field <= er.End { + return true + } + } + return false +} + +// checkExtensionTypes checks that the given extension is valid for pb. +func checkExtensionTypes(pb extendableProto, extension *ExtensionDesc) error { + var pbi interface{} = pb + // Check the extended type. + if ea, ok := pbi.(extensionAdapter); ok { + pbi = ea.extendableProtoV1 + } + if a, b := reflect.TypeOf(pbi), reflect.TypeOf(extension.ExtendedType); a != b { + return fmt.Errorf("proto: bad extended type; %v does not extend %v", b, a) + } + // Check the range. + if !isExtensionField(pb, extension.Field) { + return errors.New("proto: bad extension number; not in declared ranges") + } + return nil +} + +// extPropKey is sufficient to uniquely identify an extension. +type extPropKey struct { + base reflect.Type + field int32 +} + +var extProp = struct { + sync.RWMutex + m map[extPropKey]*Properties +}{ + m: make(map[extPropKey]*Properties), +} + +func extensionProperties(ed *ExtensionDesc) *Properties { + key := extPropKey{base: reflect.TypeOf(ed.ExtendedType), field: ed.Field} + + extProp.RLock() + if prop, ok := extProp.m[key]; ok { + extProp.RUnlock() + return prop + } + extProp.RUnlock() + + extProp.Lock() + defer extProp.Unlock() + // Check again. + if prop, ok := extProp.m[key]; ok { + return prop + } + + prop := new(Properties) + prop.Init(reflect.TypeOf(ed.ExtensionType), "unknown_name", ed.Tag, nil) + extProp.m[key] = prop + return prop +} + +// HasExtension returns whether the given extension is present in pb. +func HasExtension(pb Message, extension *ExtensionDesc) bool { + // TODO: Check types, field numbers, etc.? + epb, err := extendable(pb) + if err != nil { + return false + } + extmap, mu := epb.extensionsRead() + if extmap == nil { + return false + } + mu.Lock() + _, ok := extmap[extension.Field] + mu.Unlock() + return ok +} + +// ClearExtension removes the given extension from pb. +func ClearExtension(pb Message, extension *ExtensionDesc) { + epb, err := extendable(pb) + if err != nil { + return + } + // TODO: Check types, field numbers, etc.? + extmap := epb.extensionsWrite() + delete(extmap, extension.Field) +} + +// GetExtension retrieves a proto2 extended field from pb. +// +// If the descriptor is type complete (i.e., ExtensionDesc.ExtensionType is non-nil), +// then GetExtension parses the encoded field and returns a Go value of the specified type. +// If the field is not present, then the default value is returned (if one is specified), +// otherwise ErrMissingExtension is reported. +// +// If the descriptor is not type complete (i.e., ExtensionDesc.ExtensionType is nil), +// then GetExtension returns the raw encoded bytes of the field extension. +func GetExtension(pb Message, extension *ExtensionDesc) (interface{}, error) { + epb, err := extendable(pb) + if err != nil { + return nil, err + } + + if extension.ExtendedType != nil { + // can only check type if this is a complete descriptor + if err := checkExtensionTypes(epb, extension); err != nil { + return nil, err + } + } + + emap, mu := epb.extensionsRead() + if emap == nil { + return defaultExtensionValue(extension) + } + mu.Lock() + defer mu.Unlock() + e, ok := emap[extension.Field] + if !ok { + // defaultExtensionValue returns the default value or + // ErrMissingExtension if there is no default. + return defaultExtensionValue(extension) + } + + if e.value != nil { + // Already decoded. Check the descriptor, though. + if e.desc != extension { + // This shouldn't happen. If it does, it means that + // GetExtension was called twice with two different + // descriptors with the same field number. + return nil, errors.New("proto: descriptor conflict") + } + return e.value, nil + } + + if extension.ExtensionType == nil { + // incomplete descriptor + return e.enc, nil + } + + v, err := decodeExtension(e.enc, extension) + if err != nil { + return nil, err + } + + // Remember the decoded version and drop the encoded version. + // That way it is safe to mutate what we return. + e.value = v + e.desc = extension + e.enc = nil + emap[extension.Field] = e + return e.value, nil +} + +// defaultExtensionValue returns the default value for extension. +// If no default for an extension is defined ErrMissingExtension is returned. +func defaultExtensionValue(extension *ExtensionDesc) (interface{}, error) { + if extension.ExtensionType == nil { + // incomplete descriptor, so no default + return nil, ErrMissingExtension + } + + t := reflect.TypeOf(extension.ExtensionType) + props := extensionProperties(extension) + + sf, _, err := fieldDefault(t, props) + if err != nil { + return nil, err + } + + if sf == nil || sf.value == nil { + // There is no default value. + return nil, ErrMissingExtension + } + + if t.Kind() != reflect.Ptr { + // We do not need to return a Ptr, we can directly return sf.value. + return sf.value, nil + } + + // We need to return an interface{} that is a pointer to sf.value. + value := reflect.New(t).Elem() + value.Set(reflect.New(value.Type().Elem())) + if sf.kind == reflect.Int32 { + // We may have an int32 or an enum, but the underlying data is int32. + // Since we can't set an int32 into a non int32 reflect.value directly + // set it as a int32. + value.Elem().SetInt(int64(sf.value.(int32))) + } else { + value.Elem().Set(reflect.ValueOf(sf.value)) + } + return value.Interface(), nil +} + +// decodeExtension decodes an extension encoded in b. +func decodeExtension(b []byte, extension *ExtensionDesc) (interface{}, error) { + t := reflect.TypeOf(extension.ExtensionType) + unmarshal := typeUnmarshaler(t, extension.Tag) + + // t is a pointer to a struct, pointer to basic type or a slice. + // Allocate space to store the pointer/slice. + value := reflect.New(t).Elem() + + var err error + for { + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + wire := int(x) & 7 + + b, err = unmarshal(b, valToPointer(value.Addr()), wire) + if err != nil { + return nil, err + } + + if len(b) == 0 { + break + } + } + return value.Interface(), nil +} + +// GetExtensions returns a slice of the extensions present in pb that are also listed in es. +// The returned slice has the same length as es; missing extensions will appear as nil elements. +func GetExtensions(pb Message, es []*ExtensionDesc) (extensions []interface{}, err error) { + epb, err := extendable(pb) + if err != nil { + return nil, err + } + extensions = make([]interface{}, len(es)) + for i, e := range es { + extensions[i], err = GetExtension(epb, e) + if err == ErrMissingExtension { + err = nil + } + if err != nil { + return + } + } + return +} + +// ExtensionDescs returns a new slice containing pb's extension descriptors, in undefined order. +// For non-registered extensions, ExtensionDescs returns an incomplete descriptor containing +// just the Field field, which defines the extension's field number. +func ExtensionDescs(pb Message) ([]*ExtensionDesc, error) { + epb, err := extendable(pb) + if err != nil { + return nil, err + } + registeredExtensions := RegisteredExtensions(pb) + + emap, mu := epb.extensionsRead() + if emap == nil { + return nil, nil + } + mu.Lock() + defer mu.Unlock() + extensions := make([]*ExtensionDesc, 0, len(emap)) + for extid, e := range emap { + desc := e.desc + if desc == nil { + desc = registeredExtensions[extid] + if desc == nil { + desc = &ExtensionDesc{Field: extid} + } + } + + extensions = append(extensions, desc) + } + return extensions, nil +} + +// SetExtension sets the specified extension of pb to the specified value. +func SetExtension(pb Message, extension *ExtensionDesc, value interface{}) error { + epb, err := extendable(pb) + if err != nil { + return err + } + if err := checkExtensionTypes(epb, extension); err != nil { + return err + } + typ := reflect.TypeOf(extension.ExtensionType) + if typ != reflect.TypeOf(value) { + return errors.New("proto: bad extension value type") + } + // nil extension values need to be caught early, because the + // encoder can't distinguish an ErrNil due to a nil extension + // from an ErrNil due to a missing field. Extensions are + // always optional, so the encoder would just swallow the error + // and drop all the extensions from the encoded message. + if reflect.ValueOf(value).IsNil() { + return fmt.Errorf("proto: SetExtension called with nil value of type %T", value) + } + + extmap := epb.extensionsWrite() + extmap[extension.Field] = Extension{desc: extension, value: value} + return nil +} + +// ClearAllExtensions clears all extensions from pb. +func ClearAllExtensions(pb Message) { + epb, err := extendable(pb) + if err != nil { + return + } + m := epb.extensionsWrite() + for k := range m { + delete(m, k) + } +} + +// A global registry of extensions. +// The generated code will register the generated descriptors by calling RegisterExtension. + +var extensionMaps = make(map[reflect.Type]map[int32]*ExtensionDesc) + +// RegisterExtension is called from the generated code. +func RegisterExtension(desc *ExtensionDesc) { + st := reflect.TypeOf(desc.ExtendedType).Elem() + m := extensionMaps[st] + if m == nil { + m = make(map[int32]*ExtensionDesc) + extensionMaps[st] = m + } + if _, ok := m[desc.Field]; ok { + panic("proto: duplicate extension registered: " + st.String() + " " + strconv.Itoa(int(desc.Field))) + } + m[desc.Field] = desc +} + +// RegisteredExtensions returns a map of the registered extensions of a +// protocol buffer struct, indexed by the extension number. +// The argument pb should be a nil pointer to the struct type. +func RegisteredExtensions(pb Message) map[int32]*ExtensionDesc { + return extensionMaps[reflect.TypeOf(pb).Elem()] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/proto/lib.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/proto/lib.go new file mode 100644 index 00000000..75565cc6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/proto/lib.go @@ -0,0 +1,979 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +/* +Package proto converts data structures to and from the wire format of +protocol buffers. It works in concert with the Go source code generated +for .proto files by the protocol compiler. + +A summary of the properties of the protocol buffer interface +for a protocol buffer variable v: + + - Names are turned from camel_case to CamelCase for export. + - There are no methods on v to set fields; just treat + them as structure fields. + - There are getters that return a field's value if set, + and return the field's default value if unset. + The getters work even if the receiver is a nil message. + - The zero value for a struct is its correct initialization state. + All desired fields must be set before marshaling. + - A Reset() method will restore a protobuf struct to its zero state. + - Non-repeated fields are pointers to the values; nil means unset. + That is, optional or required field int32 f becomes F *int32. + - Repeated fields are slices. + - Helper functions are available to aid the setting of fields. + msg.Foo = proto.String("hello") // set field + - Constants are defined to hold the default values of all fields that + have them. They have the form Default_StructName_FieldName. + Because the getter methods handle defaulted values, + direct use of these constants should be rare. + - Enums are given type names and maps from names to values. + Enum values are prefixed by the enclosing message's name, or by the + enum's type name if it is a top-level enum. Enum types have a String + method, and a Enum method to assist in message construction. + - Nested messages, groups and enums have type names prefixed with the name of + the surrounding message type. + - Extensions are given descriptor names that start with E_, + followed by an underscore-delimited list of the nested messages + that contain it (if any) followed by the CamelCased name of the + extension field itself. HasExtension, ClearExtension, GetExtension + and SetExtension are functions for manipulating extensions. + - Oneof field sets are given a single field in their message, + with distinguished wrapper types for each possible field value. + - Marshal and Unmarshal are functions to encode and decode the wire format. + +When the .proto file specifies `syntax="proto3"`, there are some differences: + + - Non-repeated fields of non-message type are values instead of pointers. + - Enum types do not get an Enum method. + +The simplest way to describe this is to see an example. +Given file test.proto, containing + + package example; + + enum FOO { X = 17; } + + message Test { + required string label = 1; + optional int32 type = 2 [default=77]; + repeated int64 reps = 3; + optional group OptionalGroup = 4 { + required string RequiredField = 5; + } + oneof union { + int32 number = 6; + string name = 7; + } + } + +The resulting file, test.pb.go, is: + + package example + + import proto "github.com/golang/protobuf/proto" + import math "math" + + type FOO int32 + const ( + FOO_X FOO = 17 + ) + var FOO_name = map[int32]string{ + 17: "X", + } + var FOO_value = map[string]int32{ + "X": 17, + } + + func (x FOO) Enum() *FOO { + p := new(FOO) + *p = x + return p + } + func (x FOO) String() string { + return proto.EnumName(FOO_name, int32(x)) + } + func (x *FOO) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(FOO_value, data) + if err != nil { + return err + } + *x = FOO(value) + return nil + } + + type Test struct { + Label *string `protobuf:"bytes,1,req,name=label" json:"label,omitempty"` + Type *int32 `protobuf:"varint,2,opt,name=type,def=77" json:"type,omitempty"` + Reps []int64 `protobuf:"varint,3,rep,name=reps" json:"reps,omitempty"` + Optionalgroup *Test_OptionalGroup `protobuf:"group,4,opt,name=OptionalGroup" json:"optionalgroup,omitempty"` + // Types that are valid to be assigned to Union: + // *Test_Number + // *Test_Name + Union isTest_Union `protobuf_oneof:"union"` + XXX_unrecognized []byte `json:"-"` + } + func (m *Test) Reset() { *m = Test{} } + func (m *Test) String() string { return proto.CompactTextString(m) } + func (*Test) ProtoMessage() {} + + type isTest_Union interface { + isTest_Union() + } + + type Test_Number struct { + Number int32 `protobuf:"varint,6,opt,name=number"` + } + type Test_Name struct { + Name string `protobuf:"bytes,7,opt,name=name"` + } + + func (*Test_Number) isTest_Union() {} + func (*Test_Name) isTest_Union() {} + + func (m *Test) GetUnion() isTest_Union { + if m != nil { + return m.Union + } + return nil + } + const Default_Test_Type int32 = 77 + + func (m *Test) GetLabel() string { + if m != nil && m.Label != nil { + return *m.Label + } + return "" + } + + func (m *Test) GetType() int32 { + if m != nil && m.Type != nil { + return *m.Type + } + return Default_Test_Type + } + + func (m *Test) GetOptionalgroup() *Test_OptionalGroup { + if m != nil { + return m.Optionalgroup + } + return nil + } + + type Test_OptionalGroup struct { + RequiredField *string `protobuf:"bytes,5,req" json:"RequiredField,omitempty"` + } + func (m *Test_OptionalGroup) Reset() { *m = Test_OptionalGroup{} } + func (m *Test_OptionalGroup) String() string { return proto.CompactTextString(m) } + + func (m *Test_OptionalGroup) GetRequiredField() string { + if m != nil && m.RequiredField != nil { + return *m.RequiredField + } + return "" + } + + func (m *Test) GetNumber() int32 { + if x, ok := m.GetUnion().(*Test_Number); ok { + return x.Number + } + return 0 + } + + func (m *Test) GetName() string { + if x, ok := m.GetUnion().(*Test_Name); ok { + return x.Name + } + return "" + } + + func init() { + proto.RegisterEnum("example.FOO", FOO_name, FOO_value) + } + +To create and play with a Test object: + + package main + + import ( + "log" + + "github.com/golang/protobuf/proto" + pb "./example.pb" + ) + + func main() { + test := &pb.Test{ + Label: proto.String("hello"), + Type: proto.Int32(17), + Reps: []int64{1, 2, 3}, + Optionalgroup: &pb.Test_OptionalGroup{ + RequiredField: proto.String("good bye"), + }, + Union: &pb.Test_Name{"fred"}, + } + data, err := proto.Marshal(test) + if err != nil { + log.Fatal("marshaling error: ", err) + } + newTest := &pb.Test{} + err = proto.Unmarshal(data, newTest) + if err != nil { + log.Fatal("unmarshaling error: ", err) + } + // Now test and newTest contain the same data. + if test.GetLabel() != newTest.GetLabel() { + log.Fatalf("data mismatch %q != %q", test.GetLabel(), newTest.GetLabel()) + } + // Use a type switch to determine which oneof was set. + switch u := test.Union.(type) { + case *pb.Test_Number: // u.Number contains the number. + case *pb.Test_Name: // u.Name contains the string. + } + // etc. + } +*/ +package proto + +import ( + "encoding/json" + "fmt" + "log" + "reflect" + "sort" + "strconv" + "sync" +) + +// RequiredNotSetError is an error type returned by either Marshal or Unmarshal. +// Marshal reports this when a required field is not initialized. +// Unmarshal reports this when a required field is missing from the wire data. +type RequiredNotSetError struct{ field string } + +func (e *RequiredNotSetError) Error() string { + if e.field == "" { + return fmt.Sprintf("proto: required field not set") + } + return fmt.Sprintf("proto: required field %q not set", e.field) +} +func (e *RequiredNotSetError) RequiredNotSet() bool { + return true +} + +type invalidUTF8Error struct{ field string } + +func (e *invalidUTF8Error) Error() string { + if e.field == "" { + return "proto: invalid UTF-8 detected" + } + return fmt.Sprintf("proto: field %q contains invalid UTF-8", e.field) +} +func (e *invalidUTF8Error) InvalidUTF8() bool { + return true +} + +// errInvalidUTF8 is a sentinel error to identify fields with invalid UTF-8. +// This error should not be exposed to the external API as such errors should +// be recreated with the field information. +var errInvalidUTF8 = &invalidUTF8Error{} + +// isNonFatal reports whether the error is either a RequiredNotSet error +// or a InvalidUTF8 error. +func isNonFatal(err error) bool { + if re, ok := err.(interface{ RequiredNotSet() bool }); ok && re.RequiredNotSet() { + return true + } + if re, ok := err.(interface{ InvalidUTF8() bool }); ok && re.InvalidUTF8() { + return true + } + return false +} + +type nonFatal struct{ E error } + +// Merge merges err into nf and reports whether it was successful. +// Otherwise it returns false for any fatal non-nil errors. +func (nf *nonFatal) Merge(err error) (ok bool) { + if err == nil { + return true // not an error + } + if !isNonFatal(err) { + return false // fatal error + } + if nf.E == nil { + nf.E = err // store first instance of non-fatal error + } + return true +} + +// Message is implemented by generated protocol buffer messages. +type Message interface { + Reset() + String() string + ProtoMessage() +} + +// Stats records allocation details about the protocol buffer encoders +// and decoders. Useful for tuning the library itself. +type Stats struct { + Emalloc uint64 // mallocs in encode + Dmalloc uint64 // mallocs in decode + Encode uint64 // number of encodes + Decode uint64 // number of decodes + Chit uint64 // number of cache hits + Cmiss uint64 // number of cache misses + Size uint64 // number of sizes +} + +// Set to true to enable stats collection. +const collectStats = false + +var stats Stats + +// GetStats returns a copy of the global Stats structure. +func GetStats() Stats { return stats } + +// A Buffer is a buffer manager for marshaling and unmarshaling +// protocol buffers. It may be reused between invocations to +// reduce memory usage. It is not necessary to use a Buffer; +// the global functions Marshal and Unmarshal create a +// temporary Buffer and are fine for most applications. +type Buffer struct { + buf []byte // encode/decode byte stream + index int // read point + + deterministic bool +} + +// NewBuffer allocates a new Buffer and initializes its internal data to +// the contents of the argument slice. +func NewBuffer(e []byte) *Buffer { + return &Buffer{buf: e} +} + +// Reset resets the Buffer, ready for marshaling a new protocol buffer. +func (p *Buffer) Reset() { + p.buf = p.buf[0:0] // for reading/writing + p.index = 0 // for reading +} + +// SetBuf replaces the internal buffer with the slice, +// ready for unmarshaling the contents of the slice. +func (p *Buffer) SetBuf(s []byte) { + p.buf = s + p.index = 0 +} + +// Bytes returns the contents of the Buffer. +func (p *Buffer) Bytes() []byte { return p.buf } + +// SetDeterministic sets whether to use deterministic serialization. +// +// Deterministic serialization guarantees that for a given binary, equal +// messages will always be serialized to the same bytes. This implies: +// +// - Repeated serialization of a message will return the same bytes. +// - Different processes of the same binary (which may be executing on +// different machines) will serialize equal messages to the same bytes. +// +// Note that the deterministic serialization is NOT canonical across +// languages. It is not guaranteed to remain stable over time. It is unstable +// across different builds with schema changes due to unknown fields. +// Users who need canonical serialization (e.g., persistent storage in a +// canonical form, fingerprinting, etc.) should define their own +// canonicalization specification and implement their own serializer rather +// than relying on this API. +// +// If deterministic serialization is requested, map entries will be sorted +// by keys in lexographical order. This is an implementation detail and +// subject to change. +func (p *Buffer) SetDeterministic(deterministic bool) { + p.deterministic = deterministic +} + +/* + * Helper routines for simplifying the creation of optional fields of basic type. + */ + +// Bool is a helper routine that allocates a new bool value +// to store v and returns a pointer to it. +func Bool(v bool) *bool { + return &v +} + +// Int32 is a helper routine that allocates a new int32 value +// to store v and returns a pointer to it. +func Int32(v int32) *int32 { + return &v +} + +// Int is a helper routine that allocates a new int32 value +// to store v and returns a pointer to it, but unlike Int32 +// its argument value is an int. +func Int(v int) *int32 { + p := new(int32) + *p = int32(v) + return p +} + +// Int64 is a helper routine that allocates a new int64 value +// to store v and returns a pointer to it. +func Int64(v int64) *int64 { + return &v +} + +// Float32 is a helper routine that allocates a new float32 value +// to store v and returns a pointer to it. +func Float32(v float32) *float32 { + return &v +} + +// Float64 is a helper routine that allocates a new float64 value +// to store v and returns a pointer to it. +func Float64(v float64) *float64 { + return &v +} + +// Uint32 is a helper routine that allocates a new uint32 value +// to store v and returns a pointer to it. +func Uint32(v uint32) *uint32 { + return &v +} + +// Uint64 is a helper routine that allocates a new uint64 value +// to store v and returns a pointer to it. +func Uint64(v uint64) *uint64 { + return &v +} + +// String is a helper routine that allocates a new string value +// to store v and returns a pointer to it. +func String(v string) *string { + return &v +} + +// EnumName is a helper function to simplify printing protocol buffer enums +// by name. Given an enum map and a value, it returns a useful string. +func EnumName(m map[int32]string, v int32) string { + s, ok := m[v] + if ok { + return s + } + return strconv.Itoa(int(v)) +} + +// UnmarshalJSONEnum is a helper function to simplify recovering enum int values +// from their JSON-encoded representation. Given a map from the enum's symbolic +// names to its int values, and a byte buffer containing the JSON-encoded +// value, it returns an int32 that can be cast to the enum type by the caller. +// +// The function can deal with both JSON representations, numeric and symbolic. +func UnmarshalJSONEnum(m map[string]int32, data []byte, enumName string) (int32, error) { + if data[0] == '"' { + // New style: enums are strings. + var repr string + if err := json.Unmarshal(data, &repr); err != nil { + return -1, err + } + val, ok := m[repr] + if !ok { + return 0, fmt.Errorf("unrecognized enum %s value %q", enumName, repr) + } + return val, nil + } + // Old style: enums are ints. + var val int32 + if err := json.Unmarshal(data, &val); err != nil { + return 0, fmt.Errorf("cannot unmarshal %#q into enum %s", data, enumName) + } + return val, nil +} + +// DebugPrint dumps the encoded data in b in a debugging format with a header +// including the string s. Used in testing but made available for general debugging. +func (p *Buffer) DebugPrint(s string, b []byte) { + var u uint64 + + obuf := p.buf + index := p.index + p.buf = b + p.index = 0 + depth := 0 + + fmt.Printf("\n--- %s ---\n", s) + +out: + for { + for i := 0; i < depth; i++ { + fmt.Print(" ") + } + + index := p.index + if index == len(p.buf) { + break + } + + op, err := p.DecodeVarint() + if err != nil { + fmt.Printf("%3d: fetching op err %v\n", index, err) + break out + } + tag := op >> 3 + wire := op & 7 + + switch wire { + default: + fmt.Printf("%3d: t=%3d unknown wire=%d\n", + index, tag, wire) + break out + + case WireBytes: + var r []byte + + r, err = p.DecodeRawBytes(false) + if err != nil { + break out + } + fmt.Printf("%3d: t=%3d bytes [%d]", index, tag, len(r)) + if len(r) <= 6 { + for i := 0; i < len(r); i++ { + fmt.Printf(" %.2x", r[i]) + } + } else { + for i := 0; i < 3; i++ { + fmt.Printf(" %.2x", r[i]) + } + fmt.Printf(" ..") + for i := len(r) - 3; i < len(r); i++ { + fmt.Printf(" %.2x", r[i]) + } + } + fmt.Printf("\n") + + case WireFixed32: + u, err = p.DecodeFixed32() + if err != nil { + fmt.Printf("%3d: t=%3d fix32 err %v\n", index, tag, err) + break out + } + fmt.Printf("%3d: t=%3d fix32 %d\n", index, tag, u) + + case WireFixed64: + u, err = p.DecodeFixed64() + if err != nil { + fmt.Printf("%3d: t=%3d fix64 err %v\n", index, tag, err) + break out + } + fmt.Printf("%3d: t=%3d fix64 %d\n", index, tag, u) + + case WireVarint: + u, err = p.DecodeVarint() + if err != nil { + fmt.Printf("%3d: t=%3d varint err %v\n", index, tag, err) + break out + } + fmt.Printf("%3d: t=%3d varint %d\n", index, tag, u) + + case WireStartGroup: + fmt.Printf("%3d: t=%3d start\n", index, tag) + depth++ + + case WireEndGroup: + depth-- + fmt.Printf("%3d: t=%3d end\n", index, tag) + } + } + + if depth != 0 { + fmt.Printf("%3d: start-end not balanced %d\n", p.index, depth) + } + fmt.Printf("\n") + + p.buf = obuf + p.index = index +} + +// SetDefaults sets unset protocol buffer fields to their default values. +// It only modifies fields that are both unset and have defined defaults. +// It recursively sets default values in any non-nil sub-messages. +func SetDefaults(pb Message) { + setDefaults(reflect.ValueOf(pb), true, false) +} + +// v is a pointer to a struct. +func setDefaults(v reflect.Value, recur, zeros bool) { + v = v.Elem() + + defaultMu.RLock() + dm, ok := defaults[v.Type()] + defaultMu.RUnlock() + if !ok { + dm = buildDefaultMessage(v.Type()) + defaultMu.Lock() + defaults[v.Type()] = dm + defaultMu.Unlock() + } + + for _, sf := range dm.scalars { + f := v.Field(sf.index) + if !f.IsNil() { + // field already set + continue + } + dv := sf.value + if dv == nil && !zeros { + // no explicit default, and don't want to set zeros + continue + } + fptr := f.Addr().Interface() // **T + // TODO: Consider batching the allocations we do here. + switch sf.kind { + case reflect.Bool: + b := new(bool) + if dv != nil { + *b = dv.(bool) + } + *(fptr.(**bool)) = b + case reflect.Float32: + f := new(float32) + if dv != nil { + *f = dv.(float32) + } + *(fptr.(**float32)) = f + case reflect.Float64: + f := new(float64) + if dv != nil { + *f = dv.(float64) + } + *(fptr.(**float64)) = f + case reflect.Int32: + // might be an enum + if ft := f.Type(); ft != int32PtrType { + // enum + f.Set(reflect.New(ft.Elem())) + if dv != nil { + f.Elem().SetInt(int64(dv.(int32))) + } + } else { + // int32 field + i := new(int32) + if dv != nil { + *i = dv.(int32) + } + *(fptr.(**int32)) = i + } + case reflect.Int64: + i := new(int64) + if dv != nil { + *i = dv.(int64) + } + *(fptr.(**int64)) = i + case reflect.String: + s := new(string) + if dv != nil { + *s = dv.(string) + } + *(fptr.(**string)) = s + case reflect.Uint8: + // exceptional case: []byte + var b []byte + if dv != nil { + db := dv.([]byte) + b = make([]byte, len(db)) + copy(b, db) + } else { + b = []byte{} + } + *(fptr.(*[]byte)) = b + case reflect.Uint32: + u := new(uint32) + if dv != nil { + *u = dv.(uint32) + } + *(fptr.(**uint32)) = u + case reflect.Uint64: + u := new(uint64) + if dv != nil { + *u = dv.(uint64) + } + *(fptr.(**uint64)) = u + default: + log.Printf("proto: can't set default for field %v (sf.kind=%v)", f, sf.kind) + } + } + + for _, ni := range dm.nested { + f := v.Field(ni) + // f is *T or []*T or map[T]*T + switch f.Kind() { + case reflect.Ptr: + if f.IsNil() { + continue + } + setDefaults(f, recur, zeros) + + case reflect.Slice: + for i := 0; i < f.Len(); i++ { + e := f.Index(i) + if e.IsNil() { + continue + } + setDefaults(e, recur, zeros) + } + + case reflect.Map: + for _, k := range f.MapKeys() { + e := f.MapIndex(k) + if e.IsNil() { + continue + } + setDefaults(e, recur, zeros) + } + } + } +} + +var ( + // defaults maps a protocol buffer struct type to a slice of the fields, + // with its scalar fields set to their proto-declared non-zero default values. + defaultMu sync.RWMutex + defaults = make(map[reflect.Type]defaultMessage) + + int32PtrType = reflect.TypeOf((*int32)(nil)) +) + +// defaultMessage represents information about the default values of a message. +type defaultMessage struct { + scalars []scalarField + nested []int // struct field index of nested messages +} + +type scalarField struct { + index int // struct field index + kind reflect.Kind // element type (the T in *T or []T) + value interface{} // the proto-declared default value, or nil +} + +// t is a struct type. +func buildDefaultMessage(t reflect.Type) (dm defaultMessage) { + sprop := GetProperties(t) + for _, prop := range sprop.Prop { + fi, ok := sprop.decoderTags.get(prop.Tag) + if !ok { + // XXX_unrecognized + continue + } + ft := t.Field(fi).Type + + sf, nested, err := fieldDefault(ft, prop) + switch { + case err != nil: + log.Print(err) + case nested: + dm.nested = append(dm.nested, fi) + case sf != nil: + sf.index = fi + dm.scalars = append(dm.scalars, *sf) + } + } + + return dm +} + +// fieldDefault returns the scalarField for field type ft. +// sf will be nil if the field can not have a default. +// nestedMessage will be true if this is a nested message. +// Note that sf.index is not set on return. +func fieldDefault(ft reflect.Type, prop *Properties) (sf *scalarField, nestedMessage bool, err error) { + var canHaveDefault bool + switch ft.Kind() { + case reflect.Ptr: + if ft.Elem().Kind() == reflect.Struct { + nestedMessage = true + } else { + canHaveDefault = true // proto2 scalar field + } + + case reflect.Slice: + switch ft.Elem().Kind() { + case reflect.Ptr: + nestedMessage = true // repeated message + case reflect.Uint8: + canHaveDefault = true // bytes field + } + + case reflect.Map: + if ft.Elem().Kind() == reflect.Ptr { + nestedMessage = true // map with message values + } + } + + if !canHaveDefault { + if nestedMessage { + return nil, true, nil + } + return nil, false, nil + } + + // We now know that ft is a pointer or slice. + sf = &scalarField{kind: ft.Elem().Kind()} + + // scalar fields without defaults + if !prop.HasDefault { + return sf, false, nil + } + + // a scalar field: either *T or []byte + switch ft.Elem().Kind() { + case reflect.Bool: + x, err := strconv.ParseBool(prop.Default) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default bool %q: %v", prop.Default, err) + } + sf.value = x + case reflect.Float32: + x, err := strconv.ParseFloat(prop.Default, 32) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default float32 %q: %v", prop.Default, err) + } + sf.value = float32(x) + case reflect.Float64: + x, err := strconv.ParseFloat(prop.Default, 64) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default float64 %q: %v", prop.Default, err) + } + sf.value = x + case reflect.Int32: + x, err := strconv.ParseInt(prop.Default, 10, 32) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default int32 %q: %v", prop.Default, err) + } + sf.value = int32(x) + case reflect.Int64: + x, err := strconv.ParseInt(prop.Default, 10, 64) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default int64 %q: %v", prop.Default, err) + } + sf.value = x + case reflect.String: + sf.value = prop.Default + case reflect.Uint8: + // []byte (not *uint8) + sf.value = []byte(prop.Default) + case reflect.Uint32: + x, err := strconv.ParseUint(prop.Default, 10, 32) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default uint32 %q: %v", prop.Default, err) + } + sf.value = uint32(x) + case reflect.Uint64: + x, err := strconv.ParseUint(prop.Default, 10, 64) + if err != nil { + return nil, false, fmt.Errorf("proto: bad default uint64 %q: %v", prop.Default, err) + } + sf.value = x + default: + return nil, false, fmt.Errorf("proto: unhandled def kind %v", ft.Elem().Kind()) + } + + return sf, false, nil +} + +// mapKeys returns a sort.Interface to be used for sorting the map keys. +// Map fields may have key types of non-float scalars, strings and enums. +func mapKeys(vs []reflect.Value) sort.Interface { + s := mapKeySorter{vs: vs} + + // Type specialization per https://developers.google.com/protocol-buffers/docs/proto#maps. + if len(vs) == 0 { + return s + } + switch vs[0].Kind() { + case reflect.Int32, reflect.Int64: + s.less = func(a, b reflect.Value) bool { return a.Int() < b.Int() } + case reflect.Uint32, reflect.Uint64: + s.less = func(a, b reflect.Value) bool { return a.Uint() < b.Uint() } + case reflect.Bool: + s.less = func(a, b reflect.Value) bool { return !a.Bool() && b.Bool() } // false < true + case reflect.String: + s.less = func(a, b reflect.Value) bool { return a.String() < b.String() } + default: + panic(fmt.Sprintf("unsupported map key type: %v", vs[0].Kind())) + } + + return s +} + +type mapKeySorter struct { + vs []reflect.Value + less func(a, b reflect.Value) bool +} + +func (s mapKeySorter) Len() int { return len(s.vs) } +func (s mapKeySorter) Swap(i, j int) { s.vs[i], s.vs[j] = s.vs[j], s.vs[i] } +func (s mapKeySorter) Less(i, j int) bool { + return s.less(s.vs[i], s.vs[j]) +} + +// isProto3Zero reports whether v is a zero proto3 value. +func isProto3Zero(v reflect.Value) bool { + switch v.Kind() { + case reflect.Bool: + return !v.Bool() + case reflect.Int32, reflect.Int64: + return v.Int() == 0 + case reflect.Uint32, reflect.Uint64: + return v.Uint() == 0 + case reflect.Float32, reflect.Float64: + return v.Float() == 0 + case reflect.String: + return v.String() == "" + } + return false +} + +// ProtoPackageIsVersion2 is referenced from generated protocol buffer files +// to assert that that code is compatible with this version of the proto package. +const ProtoPackageIsVersion2 = true + +// ProtoPackageIsVersion1 is referenced from generated protocol buffer files +// to assert that that code is compatible with this version of the proto package. +const ProtoPackageIsVersion1 = true + +// InternalMessageInfo is a type used internally by generated .pb.go files. +// This type is not intended to be used by non-generated code. +// This type is not subject to any compatibility guarantee. +type InternalMessageInfo struct { + marshal *marshalInfo + unmarshal *unmarshalInfo + merge *mergeInfo + discard *discardInfo +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/proto/message_set.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/proto/message_set.go new file mode 100644 index 00000000..3b6ca41d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/proto/message_set.go @@ -0,0 +1,314 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +/* + * Support for message sets. + */ + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" + "reflect" + "sort" + "sync" +) + +// errNoMessageTypeID occurs when a protocol buffer does not have a message type ID. +// A message type ID is required for storing a protocol buffer in a message set. +var errNoMessageTypeID = errors.New("proto does not have a message type ID") + +// The first two types (_MessageSet_Item and messageSet) +// model what the protocol compiler produces for the following protocol message: +// message MessageSet { +// repeated group Item = 1 { +// required int32 type_id = 2; +// required string message = 3; +// }; +// } +// That is the MessageSet wire format. We can't use a proto to generate these +// because that would introduce a circular dependency between it and this package. + +type _MessageSet_Item struct { + TypeId *int32 `protobuf:"varint,2,req,name=type_id"` + Message []byte `protobuf:"bytes,3,req,name=message"` +} + +type messageSet struct { + Item []*_MessageSet_Item `protobuf:"group,1,rep"` + XXX_unrecognized []byte + // TODO: caching? +} + +// Make sure messageSet is a Message. +var _ Message = (*messageSet)(nil) + +// messageTypeIder is an interface satisfied by a protocol buffer type +// that may be stored in a MessageSet. +type messageTypeIder interface { + MessageTypeId() int32 +} + +func (ms *messageSet) find(pb Message) *_MessageSet_Item { + mti, ok := pb.(messageTypeIder) + if !ok { + return nil + } + id := mti.MessageTypeId() + for _, item := range ms.Item { + if *item.TypeId == id { + return item + } + } + return nil +} + +func (ms *messageSet) Has(pb Message) bool { + return ms.find(pb) != nil +} + +func (ms *messageSet) Unmarshal(pb Message) error { + if item := ms.find(pb); item != nil { + return Unmarshal(item.Message, pb) + } + if _, ok := pb.(messageTypeIder); !ok { + return errNoMessageTypeID + } + return nil // TODO: return error instead? +} + +func (ms *messageSet) Marshal(pb Message) error { + msg, err := Marshal(pb) + if err != nil { + return err + } + if item := ms.find(pb); item != nil { + // reuse existing item + item.Message = msg + return nil + } + + mti, ok := pb.(messageTypeIder) + if !ok { + return errNoMessageTypeID + } + + mtid := mti.MessageTypeId() + ms.Item = append(ms.Item, &_MessageSet_Item{ + TypeId: &mtid, + Message: msg, + }) + return nil +} + +func (ms *messageSet) Reset() { *ms = messageSet{} } +func (ms *messageSet) String() string { return CompactTextString(ms) } +func (*messageSet) ProtoMessage() {} + +// Support for the message_set_wire_format message option. + +func skipVarint(buf []byte) []byte { + i := 0 + for ; buf[i]&0x80 != 0; i++ { + } + return buf[i+1:] +} + +// MarshalMessageSet encodes the extension map represented by m in the message set wire format. +// It is called by generated Marshal methods on protocol buffer messages with the message_set_wire_format option. +func MarshalMessageSet(exts interface{}) ([]byte, error) { + return marshalMessageSet(exts, false) +} + +// marshaMessageSet implements above function, with the opt to turn on / off deterministic during Marshal. +func marshalMessageSet(exts interface{}, deterministic bool) ([]byte, error) { + switch exts := exts.(type) { + case *XXX_InternalExtensions: + var u marshalInfo + siz := u.sizeMessageSet(exts) + b := make([]byte, 0, siz) + return u.appendMessageSet(b, exts, deterministic) + + case map[int32]Extension: + // This is an old-style extension map. + // Wrap it in a new-style XXX_InternalExtensions. + ie := XXX_InternalExtensions{ + p: &struct { + mu sync.Mutex + extensionMap map[int32]Extension + }{ + extensionMap: exts, + }, + } + + var u marshalInfo + siz := u.sizeMessageSet(&ie) + b := make([]byte, 0, siz) + return u.appendMessageSet(b, &ie, deterministic) + + default: + return nil, errors.New("proto: not an extension map") + } +} + +// UnmarshalMessageSet decodes the extension map encoded in buf in the message set wire format. +// It is called by Unmarshal methods on protocol buffer messages with the message_set_wire_format option. +func UnmarshalMessageSet(buf []byte, exts interface{}) error { + var m map[int32]Extension + switch exts := exts.(type) { + case *XXX_InternalExtensions: + m = exts.extensionsWrite() + case map[int32]Extension: + m = exts + default: + return errors.New("proto: not an extension map") + } + + ms := new(messageSet) + if err := Unmarshal(buf, ms); err != nil { + return err + } + for _, item := range ms.Item { + id := *item.TypeId + msg := item.Message + + // Restore wire type and field number varint, plus length varint. + // Be careful to preserve duplicate items. + b := EncodeVarint(uint64(id)<<3 | WireBytes) + if ext, ok := m[id]; ok { + // Existing data; rip off the tag and length varint + // so we join the new data correctly. + // We can assume that ext.enc is set because we are unmarshaling. + o := ext.enc[len(b):] // skip wire type and field number + _, n := DecodeVarint(o) // calculate length of length varint + o = o[n:] // skip length varint + msg = append(o, msg...) // join old data and new data + } + b = append(b, EncodeVarint(uint64(len(msg)))...) + b = append(b, msg...) + + m[id] = Extension{enc: b} + } + return nil +} + +// MarshalMessageSetJSON encodes the extension map represented by m in JSON format. +// It is called by generated MarshalJSON methods on protocol buffer messages with the message_set_wire_format option. +func MarshalMessageSetJSON(exts interface{}) ([]byte, error) { + var m map[int32]Extension + switch exts := exts.(type) { + case *XXX_InternalExtensions: + var mu sync.Locker + m, mu = exts.extensionsRead() + if m != nil { + // Keep the extensions map locked until we're done marshaling to prevent + // races between marshaling and unmarshaling the lazily-{en,de}coded + // values. + mu.Lock() + defer mu.Unlock() + } + case map[int32]Extension: + m = exts + default: + return nil, errors.New("proto: not an extension map") + } + var b bytes.Buffer + b.WriteByte('{') + + // Process the map in key order for deterministic output. + ids := make([]int32, 0, len(m)) + for id := range m { + ids = append(ids, id) + } + sort.Sort(int32Slice(ids)) // int32Slice defined in text.go + + for i, id := range ids { + ext := m[id] + msd, ok := messageSetMap[id] + if !ok { + // Unknown type; we can't render it, so skip it. + continue + } + + if i > 0 && b.Len() > 1 { + b.WriteByte(',') + } + + fmt.Fprintf(&b, `"[%s]":`, msd.name) + + x := ext.value + if x == nil { + x = reflect.New(msd.t.Elem()).Interface() + if err := Unmarshal(ext.enc, x.(Message)); err != nil { + return nil, err + } + } + d, err := json.Marshal(x) + if err != nil { + return nil, err + } + b.Write(d) + } + b.WriteByte('}') + return b.Bytes(), nil +} + +// UnmarshalMessageSetJSON decodes the extension map encoded in buf in JSON format. +// It is called by generated UnmarshalJSON methods on protocol buffer messages with the message_set_wire_format option. +func UnmarshalMessageSetJSON(buf []byte, exts interface{}) error { + // Common-case fast path. + if len(buf) == 0 || bytes.Equal(buf, []byte("{}")) { + return nil + } + + // This is fairly tricky, and it's not clear that it is needed. + return errors.New("TODO: UnmarshalMessageSetJSON not yet implemented") +} + +// A global registry of types that can be used in a MessageSet. + +var messageSetMap = make(map[int32]messageSetDesc) + +type messageSetDesc struct { + t reflect.Type // pointer to struct + name string +} + +// RegisterMessageSetType is called from the generated code. +func RegisterMessageSetType(m Message, fieldNum int32, name string) { + messageSetMap[fieldNum] = messageSetDesc{ + t: reflect.TypeOf(m), + name: name, + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/proto/pointer_reflect.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/proto/pointer_reflect.go new file mode 100644 index 00000000..b6cad908 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/proto/pointer_reflect.go @@ -0,0 +1,357 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2012 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// +build purego appengine js + +// This file contains an implementation of proto field accesses using package reflect. +// It is slower than the code in pointer_unsafe.go but it avoids package unsafe and can +// be used on App Engine. + +package proto + +import ( + "reflect" + "sync" +) + +const unsafeAllowed = false + +// A field identifies a field in a struct, accessible from a pointer. +// In this implementation, a field is identified by the sequence of field indices +// passed to reflect's FieldByIndex. +type field []int + +// toField returns a field equivalent to the given reflect field. +func toField(f *reflect.StructField) field { + return f.Index +} + +// invalidField is an invalid field identifier. +var invalidField = field(nil) + +// zeroField is a noop when calling pointer.offset. +var zeroField = field([]int{}) + +// IsValid reports whether the field identifier is valid. +func (f field) IsValid() bool { return f != nil } + +// The pointer type is for the table-driven decoder. +// The implementation here uses a reflect.Value of pointer type to +// create a generic pointer. In pointer_unsafe.go we use unsafe +// instead of reflect to implement the same (but faster) interface. +type pointer struct { + v reflect.Value +} + +// toPointer converts an interface of pointer type to a pointer +// that points to the same target. +func toPointer(i *Message) pointer { + return pointer{v: reflect.ValueOf(*i)} +} + +// toAddrPointer converts an interface to a pointer that points to +// the interface data. +func toAddrPointer(i *interface{}, isptr bool) pointer { + v := reflect.ValueOf(*i) + u := reflect.New(v.Type()) + u.Elem().Set(v) + return pointer{v: u} +} + +// valToPointer converts v to a pointer. v must be of pointer type. +func valToPointer(v reflect.Value) pointer { + return pointer{v: v} +} + +// offset converts from a pointer to a structure to a pointer to +// one of its fields. +func (p pointer) offset(f field) pointer { + return pointer{v: p.v.Elem().FieldByIndex(f).Addr()} +} + +func (p pointer) isNil() bool { + return p.v.IsNil() +} + +// grow updates the slice s in place to make it one element longer. +// s must be addressable. +// Returns the (addressable) new element. +func grow(s reflect.Value) reflect.Value { + n, m := s.Len(), s.Cap() + if n < m { + s.SetLen(n + 1) + } else { + s.Set(reflect.Append(s, reflect.Zero(s.Type().Elem()))) + } + return s.Index(n) +} + +func (p pointer) toInt64() *int64 { + return p.v.Interface().(*int64) +} +func (p pointer) toInt64Ptr() **int64 { + return p.v.Interface().(**int64) +} +func (p pointer) toInt64Slice() *[]int64 { + return p.v.Interface().(*[]int64) +} + +var int32ptr = reflect.TypeOf((*int32)(nil)) + +func (p pointer) toInt32() *int32 { + return p.v.Convert(int32ptr).Interface().(*int32) +} + +// The toInt32Ptr/Slice methods don't work because of enums. +// Instead, we must use set/get methods for the int32ptr/slice case. +/* + func (p pointer) toInt32Ptr() **int32 { + return p.v.Interface().(**int32) +} + func (p pointer) toInt32Slice() *[]int32 { + return p.v.Interface().(*[]int32) +} +*/ +func (p pointer) getInt32Ptr() *int32 { + if p.v.Type().Elem().Elem() == reflect.TypeOf(int32(0)) { + // raw int32 type + return p.v.Elem().Interface().(*int32) + } + // an enum + return p.v.Elem().Convert(int32PtrType).Interface().(*int32) +} +func (p pointer) setInt32Ptr(v int32) { + // Allocate value in a *int32. Possibly convert that to a *enum. + // Then assign it to a **int32 or **enum. + // Note: we can convert *int32 to *enum, but we can't convert + // **int32 to **enum! + p.v.Elem().Set(reflect.ValueOf(&v).Convert(p.v.Type().Elem())) +} + +// getInt32Slice copies []int32 from p as a new slice. +// This behavior differs from the implementation in pointer_unsafe.go. +func (p pointer) getInt32Slice() []int32 { + if p.v.Type().Elem().Elem() == reflect.TypeOf(int32(0)) { + // raw int32 type + return p.v.Elem().Interface().([]int32) + } + // an enum + // Allocate a []int32, then assign []enum's values into it. + // Note: we can't convert []enum to []int32. + slice := p.v.Elem() + s := make([]int32, slice.Len()) + for i := 0; i < slice.Len(); i++ { + s[i] = int32(slice.Index(i).Int()) + } + return s +} + +// setInt32Slice copies []int32 into p as a new slice. +// This behavior differs from the implementation in pointer_unsafe.go. +func (p pointer) setInt32Slice(v []int32) { + if p.v.Type().Elem().Elem() == reflect.TypeOf(int32(0)) { + // raw int32 type + p.v.Elem().Set(reflect.ValueOf(v)) + return + } + // an enum + // Allocate a []enum, then assign []int32's values into it. + // Note: we can't convert []enum to []int32. + slice := reflect.MakeSlice(p.v.Type().Elem(), len(v), cap(v)) + for i, x := range v { + slice.Index(i).SetInt(int64(x)) + } + p.v.Elem().Set(slice) +} +func (p pointer) appendInt32Slice(v int32) { + grow(p.v.Elem()).SetInt(int64(v)) +} + +func (p pointer) toUint64() *uint64 { + return p.v.Interface().(*uint64) +} +func (p pointer) toUint64Ptr() **uint64 { + return p.v.Interface().(**uint64) +} +func (p pointer) toUint64Slice() *[]uint64 { + return p.v.Interface().(*[]uint64) +} +func (p pointer) toUint32() *uint32 { + return p.v.Interface().(*uint32) +} +func (p pointer) toUint32Ptr() **uint32 { + return p.v.Interface().(**uint32) +} +func (p pointer) toUint32Slice() *[]uint32 { + return p.v.Interface().(*[]uint32) +} +func (p pointer) toBool() *bool { + return p.v.Interface().(*bool) +} +func (p pointer) toBoolPtr() **bool { + return p.v.Interface().(**bool) +} +func (p pointer) toBoolSlice() *[]bool { + return p.v.Interface().(*[]bool) +} +func (p pointer) toFloat64() *float64 { + return p.v.Interface().(*float64) +} +func (p pointer) toFloat64Ptr() **float64 { + return p.v.Interface().(**float64) +} +func (p pointer) toFloat64Slice() *[]float64 { + return p.v.Interface().(*[]float64) +} +func (p pointer) toFloat32() *float32 { + return p.v.Interface().(*float32) +} +func (p pointer) toFloat32Ptr() **float32 { + return p.v.Interface().(**float32) +} +func (p pointer) toFloat32Slice() *[]float32 { + return p.v.Interface().(*[]float32) +} +func (p pointer) toString() *string { + return p.v.Interface().(*string) +} +func (p pointer) toStringPtr() **string { + return p.v.Interface().(**string) +} +func (p pointer) toStringSlice() *[]string { + return p.v.Interface().(*[]string) +} +func (p pointer) toBytes() *[]byte { + return p.v.Interface().(*[]byte) +} +func (p pointer) toBytesSlice() *[][]byte { + return p.v.Interface().(*[][]byte) +} +func (p pointer) toExtensions() *XXX_InternalExtensions { + return p.v.Interface().(*XXX_InternalExtensions) +} +func (p pointer) toOldExtensions() *map[int32]Extension { + return p.v.Interface().(*map[int32]Extension) +} +func (p pointer) getPointer() pointer { + return pointer{v: p.v.Elem()} +} +func (p pointer) setPointer(q pointer) { + p.v.Elem().Set(q.v) +} +func (p pointer) appendPointer(q pointer) { + grow(p.v.Elem()).Set(q.v) +} + +// getPointerSlice copies []*T from p as a new []pointer. +// This behavior differs from the implementation in pointer_unsafe.go. +func (p pointer) getPointerSlice() []pointer { + if p.v.IsNil() { + return nil + } + n := p.v.Elem().Len() + s := make([]pointer, n) + for i := 0; i < n; i++ { + s[i] = pointer{v: p.v.Elem().Index(i)} + } + return s +} + +// setPointerSlice copies []pointer into p as a new []*T. +// This behavior differs from the implementation in pointer_unsafe.go. +func (p pointer) setPointerSlice(v []pointer) { + if v == nil { + p.v.Elem().Set(reflect.New(p.v.Elem().Type()).Elem()) + return + } + s := reflect.MakeSlice(p.v.Elem().Type(), 0, len(v)) + for _, p := range v { + s = reflect.Append(s, p.v) + } + p.v.Elem().Set(s) +} + +// getInterfacePointer returns a pointer that points to the +// interface data of the interface pointed by p. +func (p pointer) getInterfacePointer() pointer { + if p.v.Elem().IsNil() { + return pointer{v: p.v.Elem()} + } + return pointer{v: p.v.Elem().Elem().Elem().Field(0).Addr()} // *interface -> interface -> *struct -> struct +} + +func (p pointer) asPointerTo(t reflect.Type) reflect.Value { + // TODO: check that p.v.Type().Elem() == t? + return p.v +} + +func atomicLoadUnmarshalInfo(p **unmarshalInfo) *unmarshalInfo { + atomicLock.Lock() + defer atomicLock.Unlock() + return *p +} +func atomicStoreUnmarshalInfo(p **unmarshalInfo, v *unmarshalInfo) { + atomicLock.Lock() + defer atomicLock.Unlock() + *p = v +} +func atomicLoadMarshalInfo(p **marshalInfo) *marshalInfo { + atomicLock.Lock() + defer atomicLock.Unlock() + return *p +} +func atomicStoreMarshalInfo(p **marshalInfo, v *marshalInfo) { + atomicLock.Lock() + defer atomicLock.Unlock() + *p = v +} +func atomicLoadMergeInfo(p **mergeInfo) *mergeInfo { + atomicLock.Lock() + defer atomicLock.Unlock() + return *p +} +func atomicStoreMergeInfo(p **mergeInfo, v *mergeInfo) { + atomicLock.Lock() + defer atomicLock.Unlock() + *p = v +} +func atomicLoadDiscardInfo(p **discardInfo) *discardInfo { + atomicLock.Lock() + defer atomicLock.Unlock() + return *p +} +func atomicStoreDiscardInfo(p **discardInfo, v *discardInfo) { + atomicLock.Lock() + defer atomicLock.Unlock() + *p = v +} + +var atomicLock sync.Mutex diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/proto/pointer_unsafe.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/proto/pointer_unsafe.go new file mode 100644 index 00000000..d55a335d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/proto/pointer_unsafe.go @@ -0,0 +1,308 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2012 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// +build !purego,!appengine,!js + +// This file contains the implementation of the proto field accesses using package unsafe. + +package proto + +import ( + "reflect" + "sync/atomic" + "unsafe" +) + +const unsafeAllowed = true + +// A field identifies a field in a struct, accessible from a pointer. +// In this implementation, a field is identified by its byte offset from the start of the struct. +type field uintptr + +// toField returns a field equivalent to the given reflect field. +func toField(f *reflect.StructField) field { + return field(f.Offset) +} + +// invalidField is an invalid field identifier. +const invalidField = ^field(0) + +// zeroField is a noop when calling pointer.offset. +const zeroField = field(0) + +// IsValid reports whether the field identifier is valid. +func (f field) IsValid() bool { + return f != invalidField +} + +// The pointer type below is for the new table-driven encoder/decoder. +// The implementation here uses unsafe.Pointer to create a generic pointer. +// In pointer_reflect.go we use reflect instead of unsafe to implement +// the same (but slower) interface. +type pointer struct { + p unsafe.Pointer +} + +// size of pointer +var ptrSize = unsafe.Sizeof(uintptr(0)) + +// toPointer converts an interface of pointer type to a pointer +// that points to the same target. +func toPointer(i *Message) pointer { + // Super-tricky - read pointer out of data word of interface value. + // Saves ~25ns over the equivalent: + // return valToPointer(reflect.ValueOf(*i)) + return pointer{p: (*[2]unsafe.Pointer)(unsafe.Pointer(i))[1]} +} + +// toAddrPointer converts an interface to a pointer that points to +// the interface data. +func toAddrPointer(i *interface{}, isptr bool) pointer { + // Super-tricky - read or get the address of data word of interface value. + if isptr { + // The interface is of pointer type, thus it is a direct interface. + // The data word is the pointer data itself. We take its address. + return pointer{p: unsafe.Pointer(uintptr(unsafe.Pointer(i)) + ptrSize)} + } + // The interface is not of pointer type. The data word is the pointer + // to the data. + return pointer{p: (*[2]unsafe.Pointer)(unsafe.Pointer(i))[1]} +} + +// valToPointer converts v to a pointer. v must be of pointer type. +func valToPointer(v reflect.Value) pointer { + return pointer{p: unsafe.Pointer(v.Pointer())} +} + +// offset converts from a pointer to a structure to a pointer to +// one of its fields. +func (p pointer) offset(f field) pointer { + // For safety, we should panic if !f.IsValid, however calling panic causes + // this to no longer be inlineable, which is a serious performance cost. + /* + if !f.IsValid() { + panic("invalid field") + } + */ + return pointer{p: unsafe.Pointer(uintptr(p.p) + uintptr(f))} +} + +func (p pointer) isNil() bool { + return p.p == nil +} + +func (p pointer) toInt64() *int64 { + return (*int64)(p.p) +} +func (p pointer) toInt64Ptr() **int64 { + return (**int64)(p.p) +} +func (p pointer) toInt64Slice() *[]int64 { + return (*[]int64)(p.p) +} +func (p pointer) toInt32() *int32 { + return (*int32)(p.p) +} + +// See pointer_reflect.go for why toInt32Ptr/Slice doesn't exist. +/* + func (p pointer) toInt32Ptr() **int32 { + return (**int32)(p.p) + } + func (p pointer) toInt32Slice() *[]int32 { + return (*[]int32)(p.p) + } +*/ +func (p pointer) getInt32Ptr() *int32 { + return *(**int32)(p.p) +} +func (p pointer) setInt32Ptr(v int32) { + *(**int32)(p.p) = &v +} + +// getInt32Slice loads a []int32 from p. +// The value returned is aliased with the original slice. +// This behavior differs from the implementation in pointer_reflect.go. +func (p pointer) getInt32Slice() []int32 { + return *(*[]int32)(p.p) +} + +// setInt32Slice stores a []int32 to p. +// The value set is aliased with the input slice. +// This behavior differs from the implementation in pointer_reflect.go. +func (p pointer) setInt32Slice(v []int32) { + *(*[]int32)(p.p) = v +} + +// TODO: Can we get rid of appendInt32Slice and use setInt32Slice instead? +func (p pointer) appendInt32Slice(v int32) { + s := (*[]int32)(p.p) + *s = append(*s, v) +} + +func (p pointer) toUint64() *uint64 { + return (*uint64)(p.p) +} +func (p pointer) toUint64Ptr() **uint64 { + return (**uint64)(p.p) +} +func (p pointer) toUint64Slice() *[]uint64 { + return (*[]uint64)(p.p) +} +func (p pointer) toUint32() *uint32 { + return (*uint32)(p.p) +} +func (p pointer) toUint32Ptr() **uint32 { + return (**uint32)(p.p) +} +func (p pointer) toUint32Slice() *[]uint32 { + return (*[]uint32)(p.p) +} +func (p pointer) toBool() *bool { + return (*bool)(p.p) +} +func (p pointer) toBoolPtr() **bool { + return (**bool)(p.p) +} +func (p pointer) toBoolSlice() *[]bool { + return (*[]bool)(p.p) +} +func (p pointer) toFloat64() *float64 { + return (*float64)(p.p) +} +func (p pointer) toFloat64Ptr() **float64 { + return (**float64)(p.p) +} +func (p pointer) toFloat64Slice() *[]float64 { + return (*[]float64)(p.p) +} +func (p pointer) toFloat32() *float32 { + return (*float32)(p.p) +} +func (p pointer) toFloat32Ptr() **float32 { + return (**float32)(p.p) +} +func (p pointer) toFloat32Slice() *[]float32 { + return (*[]float32)(p.p) +} +func (p pointer) toString() *string { + return (*string)(p.p) +} +func (p pointer) toStringPtr() **string { + return (**string)(p.p) +} +func (p pointer) toStringSlice() *[]string { + return (*[]string)(p.p) +} +func (p pointer) toBytes() *[]byte { + return (*[]byte)(p.p) +} +func (p pointer) toBytesSlice() *[][]byte { + return (*[][]byte)(p.p) +} +func (p pointer) toExtensions() *XXX_InternalExtensions { + return (*XXX_InternalExtensions)(p.p) +} +func (p pointer) toOldExtensions() *map[int32]Extension { + return (*map[int32]Extension)(p.p) +} + +// getPointerSlice loads []*T from p as a []pointer. +// The value returned is aliased with the original slice. +// This behavior differs from the implementation in pointer_reflect.go. +func (p pointer) getPointerSlice() []pointer { + // Super-tricky - p should point to a []*T where T is a + // message type. We load it as []pointer. + return *(*[]pointer)(p.p) +} + +// setPointerSlice stores []pointer into p as a []*T. +// The value set is aliased with the input slice. +// This behavior differs from the implementation in pointer_reflect.go. +func (p pointer) setPointerSlice(v []pointer) { + // Super-tricky - p should point to a []*T where T is a + // message type. We store it as []pointer. + *(*[]pointer)(p.p) = v +} + +// getPointer loads the pointer at p and returns it. +func (p pointer) getPointer() pointer { + return pointer{p: *(*unsafe.Pointer)(p.p)} +} + +// setPointer stores the pointer q at p. +func (p pointer) setPointer(q pointer) { + *(*unsafe.Pointer)(p.p) = q.p +} + +// append q to the slice pointed to by p. +func (p pointer) appendPointer(q pointer) { + s := (*[]unsafe.Pointer)(p.p) + *s = append(*s, q.p) +} + +// getInterfacePointer returns a pointer that points to the +// interface data of the interface pointed by p. +func (p pointer) getInterfacePointer() pointer { + // Super-tricky - read pointer out of data word of interface value. + return pointer{p: (*(*[2]unsafe.Pointer)(p.p))[1]} +} + +// asPointerTo returns a reflect.Value that is a pointer to an +// object of type t stored at p. +func (p pointer) asPointerTo(t reflect.Type) reflect.Value { + return reflect.NewAt(t, p.p) +} + +func atomicLoadUnmarshalInfo(p **unmarshalInfo) *unmarshalInfo { + return (*unmarshalInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p)))) +} +func atomicStoreUnmarshalInfo(p **unmarshalInfo, v *unmarshalInfo) { + atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v)) +} +func atomicLoadMarshalInfo(p **marshalInfo) *marshalInfo { + return (*marshalInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p)))) +} +func atomicStoreMarshalInfo(p **marshalInfo, v *marshalInfo) { + atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v)) +} +func atomicLoadMergeInfo(p **mergeInfo) *mergeInfo { + return (*mergeInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p)))) +} +func atomicStoreMergeInfo(p **mergeInfo, v *mergeInfo) { + atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v)) +} +func atomicLoadDiscardInfo(p **discardInfo) *discardInfo { + return (*discardInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p)))) +} +func atomicStoreDiscardInfo(p **discardInfo, v *discardInfo) { + atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v)) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/proto/properties.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/proto/properties.go new file mode 100644 index 00000000..50b99b83 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/proto/properties.go @@ -0,0 +1,544 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +/* + * Routines for encoding data into the wire format for protocol buffers. + */ + +import ( + "fmt" + "log" + "os" + "reflect" + "sort" + "strconv" + "strings" + "sync" +) + +const debug bool = false + +// Constants that identify the encoding of a value on the wire. +const ( + WireVarint = 0 + WireFixed64 = 1 + WireBytes = 2 + WireStartGroup = 3 + WireEndGroup = 4 + WireFixed32 = 5 +) + +// tagMap is an optimization over map[int]int for typical protocol buffer +// use-cases. Encoded protocol buffers are often in tag order with small tag +// numbers. +type tagMap struct { + fastTags []int + slowTags map[int]int +} + +// tagMapFastLimit is the upper bound on the tag number that will be stored in +// the tagMap slice rather than its map. +const tagMapFastLimit = 1024 + +func (p *tagMap) get(t int) (int, bool) { + if t > 0 && t < tagMapFastLimit { + if t >= len(p.fastTags) { + return 0, false + } + fi := p.fastTags[t] + return fi, fi >= 0 + } + fi, ok := p.slowTags[t] + return fi, ok +} + +func (p *tagMap) put(t int, fi int) { + if t > 0 && t < tagMapFastLimit { + for len(p.fastTags) < t+1 { + p.fastTags = append(p.fastTags, -1) + } + p.fastTags[t] = fi + return + } + if p.slowTags == nil { + p.slowTags = make(map[int]int) + } + p.slowTags[t] = fi +} + +// StructProperties represents properties for all the fields of a struct. +// decoderTags and decoderOrigNames should only be used by the decoder. +type StructProperties struct { + Prop []*Properties // properties for each field + reqCount int // required count + decoderTags tagMap // map from proto tag to struct field number + decoderOrigNames map[string]int // map from original name to struct field number + order []int // list of struct field numbers in tag order + + // OneofTypes contains information about the oneof fields in this message. + // It is keyed by the original name of a field. + OneofTypes map[string]*OneofProperties +} + +// OneofProperties represents information about a specific field in a oneof. +type OneofProperties struct { + Type reflect.Type // pointer to generated struct type for this oneof field + Field int // struct field number of the containing oneof in the message + Prop *Properties +} + +// Implement the sorting interface so we can sort the fields in tag order, as recommended by the spec. +// See encode.go, (*Buffer).enc_struct. + +func (sp *StructProperties) Len() int { return len(sp.order) } +func (sp *StructProperties) Less(i, j int) bool { + return sp.Prop[sp.order[i]].Tag < sp.Prop[sp.order[j]].Tag +} +func (sp *StructProperties) Swap(i, j int) { sp.order[i], sp.order[j] = sp.order[j], sp.order[i] } + +// Properties represents the protocol-specific behavior of a single struct field. +type Properties struct { + Name string // name of the field, for error messages + OrigName string // original name before protocol compiler (always set) + JSONName string // name to use for JSON; determined by protoc + Wire string + WireType int + Tag int + Required bool + Optional bool + Repeated bool + Packed bool // relevant for repeated primitives only + Enum string // set for enum types only + proto3 bool // whether this is known to be a proto3 field + oneof bool // whether this is a oneof field + + Default string // default value + HasDefault bool // whether an explicit default was provided + + stype reflect.Type // set for struct types only + sprop *StructProperties // set for struct types only + + mtype reflect.Type // set for map types only + MapKeyProp *Properties // set for map types only + MapValProp *Properties // set for map types only +} + +// String formats the properties in the protobuf struct field tag style. +func (p *Properties) String() string { + s := p.Wire + s += "," + s += strconv.Itoa(p.Tag) + if p.Required { + s += ",req" + } + if p.Optional { + s += ",opt" + } + if p.Repeated { + s += ",rep" + } + if p.Packed { + s += ",packed" + } + s += ",name=" + p.OrigName + if p.JSONName != p.OrigName { + s += ",json=" + p.JSONName + } + if p.proto3 { + s += ",proto3" + } + if p.oneof { + s += ",oneof" + } + if len(p.Enum) > 0 { + s += ",enum=" + p.Enum + } + if p.HasDefault { + s += ",def=" + p.Default + } + return s +} + +// Parse populates p by parsing a string in the protobuf struct field tag style. +func (p *Properties) Parse(s string) { + // "bytes,49,opt,name=foo,def=hello!" + fields := strings.Split(s, ",") // breaks def=, but handled below. + if len(fields) < 2 { + fmt.Fprintf(os.Stderr, "proto: tag has too few fields: %q\n", s) + return + } + + p.Wire = fields[0] + switch p.Wire { + case "varint": + p.WireType = WireVarint + case "fixed32": + p.WireType = WireFixed32 + case "fixed64": + p.WireType = WireFixed64 + case "zigzag32": + p.WireType = WireVarint + case "zigzag64": + p.WireType = WireVarint + case "bytes", "group": + p.WireType = WireBytes + // no numeric converter for non-numeric types + default: + fmt.Fprintf(os.Stderr, "proto: tag has unknown wire type: %q\n", s) + return + } + + var err error + p.Tag, err = strconv.Atoi(fields[1]) + if err != nil { + return + } + +outer: + for i := 2; i < len(fields); i++ { + f := fields[i] + switch { + case f == "req": + p.Required = true + case f == "opt": + p.Optional = true + case f == "rep": + p.Repeated = true + case f == "packed": + p.Packed = true + case strings.HasPrefix(f, "name="): + p.OrigName = f[5:] + case strings.HasPrefix(f, "json="): + p.JSONName = f[5:] + case strings.HasPrefix(f, "enum="): + p.Enum = f[5:] + case f == "proto3": + p.proto3 = true + case f == "oneof": + p.oneof = true + case strings.HasPrefix(f, "def="): + p.HasDefault = true + p.Default = f[4:] // rest of string + if i+1 < len(fields) { + // Commas aren't escaped, and def is always last. + p.Default += "," + strings.Join(fields[i+1:], ",") + break outer + } + } + } +} + +var protoMessageType = reflect.TypeOf((*Message)(nil)).Elem() + +// setFieldProps initializes the field properties for submessages and maps. +func (p *Properties) setFieldProps(typ reflect.Type, f *reflect.StructField, lockGetProp bool) { + switch t1 := typ; t1.Kind() { + case reflect.Ptr: + if t1.Elem().Kind() == reflect.Struct { + p.stype = t1.Elem() + } + + case reflect.Slice: + if t2 := t1.Elem(); t2.Kind() == reflect.Ptr && t2.Elem().Kind() == reflect.Struct { + p.stype = t2.Elem() + } + + case reflect.Map: + p.mtype = t1 + p.MapKeyProp = &Properties{} + p.MapKeyProp.init(reflect.PtrTo(p.mtype.Key()), "Key", f.Tag.Get("protobuf_key"), nil, lockGetProp) + p.MapValProp = &Properties{} + vtype := p.mtype.Elem() + if vtype.Kind() != reflect.Ptr && vtype.Kind() != reflect.Slice { + // The value type is not a message (*T) or bytes ([]byte), + // so we need encoders for the pointer to this type. + vtype = reflect.PtrTo(vtype) + } + p.MapValProp.init(vtype, "Value", f.Tag.Get("protobuf_val"), nil, lockGetProp) + } + + if p.stype != nil { + if lockGetProp { + p.sprop = GetProperties(p.stype) + } else { + p.sprop = getPropertiesLocked(p.stype) + } + } +} + +var ( + marshalerType = reflect.TypeOf((*Marshaler)(nil)).Elem() +) + +// Init populates the properties from a protocol buffer struct tag. +func (p *Properties) Init(typ reflect.Type, name, tag string, f *reflect.StructField) { + p.init(typ, name, tag, f, true) +} + +func (p *Properties) init(typ reflect.Type, name, tag string, f *reflect.StructField, lockGetProp bool) { + // "bytes,49,opt,def=hello!" + p.Name = name + p.OrigName = name + if tag == "" { + return + } + p.Parse(tag) + p.setFieldProps(typ, f, lockGetProp) +} + +var ( + propertiesMu sync.RWMutex + propertiesMap = make(map[reflect.Type]*StructProperties) +) + +// GetProperties returns the list of properties for the type represented by t. +// t must represent a generated struct type of a protocol message. +func GetProperties(t reflect.Type) *StructProperties { + if t.Kind() != reflect.Struct { + panic("proto: type must have kind struct") + } + + // Most calls to GetProperties in a long-running program will be + // retrieving details for types we have seen before. + propertiesMu.RLock() + sprop, ok := propertiesMap[t] + propertiesMu.RUnlock() + if ok { + if collectStats { + stats.Chit++ + } + return sprop + } + + propertiesMu.Lock() + sprop = getPropertiesLocked(t) + propertiesMu.Unlock() + return sprop +} + +// getPropertiesLocked requires that propertiesMu is held. +func getPropertiesLocked(t reflect.Type) *StructProperties { + if prop, ok := propertiesMap[t]; ok { + if collectStats { + stats.Chit++ + } + return prop + } + if collectStats { + stats.Cmiss++ + } + + prop := new(StructProperties) + // in case of recursive protos, fill this in now. + propertiesMap[t] = prop + + // build properties + prop.Prop = make([]*Properties, t.NumField()) + prop.order = make([]int, t.NumField()) + + for i := 0; i < t.NumField(); i++ { + f := t.Field(i) + p := new(Properties) + name := f.Name + p.init(f.Type, name, f.Tag.Get("protobuf"), &f, false) + + oneof := f.Tag.Get("protobuf_oneof") // special case + if oneof != "" { + // Oneof fields don't use the traditional protobuf tag. + p.OrigName = oneof + } + prop.Prop[i] = p + prop.order[i] = i + if debug { + print(i, " ", f.Name, " ", t.String(), " ") + if p.Tag > 0 { + print(p.String()) + } + print("\n") + } + } + + // Re-order prop.order. + sort.Sort(prop) + + type oneofMessage interface { + XXX_OneofFuncs() (func(Message, *Buffer) error, func(Message, int, int, *Buffer) (bool, error), func(Message) int, []interface{}) + } + if om, ok := reflect.Zero(reflect.PtrTo(t)).Interface().(oneofMessage); ok { + var oots []interface{} + _, _, _, oots = om.XXX_OneofFuncs() + + // Interpret oneof metadata. + prop.OneofTypes = make(map[string]*OneofProperties) + for _, oot := range oots { + oop := &OneofProperties{ + Type: reflect.ValueOf(oot).Type(), // *T + Prop: new(Properties), + } + sft := oop.Type.Elem().Field(0) + oop.Prop.Name = sft.Name + oop.Prop.Parse(sft.Tag.Get("protobuf")) + // There will be exactly one interface field that + // this new value is assignable to. + for i := 0; i < t.NumField(); i++ { + f := t.Field(i) + if f.Type.Kind() != reflect.Interface { + continue + } + if !oop.Type.AssignableTo(f.Type) { + continue + } + oop.Field = i + break + } + prop.OneofTypes[oop.Prop.OrigName] = oop + } + } + + // build required counts + // build tags + reqCount := 0 + prop.decoderOrigNames = make(map[string]int) + for i, p := range prop.Prop { + if strings.HasPrefix(p.Name, "XXX_") { + // Internal fields should not appear in tags/origNames maps. + // They are handled specially when encoding and decoding. + continue + } + if p.Required { + reqCount++ + } + prop.decoderTags.put(p.Tag, i) + prop.decoderOrigNames[p.OrigName] = i + } + prop.reqCount = reqCount + + return prop +} + +// A global registry of enum types. +// The generated code will register the generated maps by calling RegisterEnum. + +var enumValueMaps = make(map[string]map[string]int32) + +// RegisterEnum is called from the generated code to install the enum descriptor +// maps into the global table to aid parsing text format protocol buffers. +func RegisterEnum(typeName string, unusedNameMap map[int32]string, valueMap map[string]int32) { + if _, ok := enumValueMaps[typeName]; ok { + panic("proto: duplicate enum registered: " + typeName) + } + enumValueMaps[typeName] = valueMap +} + +// EnumValueMap returns the mapping from names to integers of the +// enum type enumType, or a nil if not found. +func EnumValueMap(enumType string) map[string]int32 { + return enumValueMaps[enumType] +} + +// A registry of all linked message types. +// The string is a fully-qualified proto name ("pkg.Message"). +var ( + protoTypedNils = make(map[string]Message) // a map from proto names to typed nil pointers + protoMapTypes = make(map[string]reflect.Type) // a map from proto names to map types + revProtoTypes = make(map[reflect.Type]string) +) + +// RegisterType is called from generated code and maps from the fully qualified +// proto name to the type (pointer to struct) of the protocol buffer. +func RegisterType(x Message, name string) { + if _, ok := protoTypedNils[name]; ok { + // TODO: Some day, make this a panic. + log.Printf("proto: duplicate proto type registered: %s", name) + return + } + t := reflect.TypeOf(x) + if v := reflect.ValueOf(x); v.Kind() == reflect.Ptr && v.Pointer() == 0 { + // Generated code always calls RegisterType with nil x. + // This check is just for extra safety. + protoTypedNils[name] = x + } else { + protoTypedNils[name] = reflect.Zero(t).Interface().(Message) + } + revProtoTypes[t] = name +} + +// RegisterMapType is called from generated code and maps from the fully qualified +// proto name to the native map type of the proto map definition. +func RegisterMapType(x interface{}, name string) { + if reflect.TypeOf(x).Kind() != reflect.Map { + panic(fmt.Sprintf("RegisterMapType(%T, %q); want map", x, name)) + } + if _, ok := protoMapTypes[name]; ok { + log.Printf("proto: duplicate proto type registered: %s", name) + return + } + t := reflect.TypeOf(x) + protoMapTypes[name] = t + revProtoTypes[t] = name +} + +// MessageName returns the fully-qualified proto name for the given message type. +func MessageName(x Message) string { + type xname interface { + XXX_MessageName() string + } + if m, ok := x.(xname); ok { + return m.XXX_MessageName() + } + return revProtoTypes[reflect.TypeOf(x)] +} + +// MessageType returns the message type (pointer to struct) for a named message. +// The type is not guaranteed to implement proto.Message if the name refers to a +// map entry. +func MessageType(name string) reflect.Type { + if t, ok := protoTypedNils[name]; ok { + return reflect.TypeOf(t) + } + return protoMapTypes[name] +} + +// A registry of all linked proto files. +var ( + protoFiles = make(map[string][]byte) // file name => fileDescriptor +) + +// RegisterFile is called from generated code and maps from the +// full file name of a .proto file to its compressed FileDescriptorProto. +func RegisterFile(filename string, fileDescriptor []byte) { + protoFiles[filename] = fileDescriptor +} + +// FileDescriptor returns the compressed FileDescriptorProto for a .proto file. +func FileDescriptor(filename string) []byte { return protoFiles[filename] } diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/proto/table_marshal.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/proto/table_marshal.go new file mode 100644 index 00000000..b1679449 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/proto/table_marshal.go @@ -0,0 +1,2767 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "errors" + "fmt" + "math" + "reflect" + "sort" + "strconv" + "strings" + "sync" + "sync/atomic" + "unicode/utf8" +) + +// a sizer takes a pointer to a field and the size of its tag, computes the size of +// the encoded data. +type sizer func(pointer, int) int + +// a marshaler takes a byte slice, a pointer to a field, and its tag (in wire format), +// marshals the field to the end of the slice, returns the slice and error (if any). +type marshaler func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) + +// marshalInfo is the information used for marshaling a message. +type marshalInfo struct { + typ reflect.Type + fields []*marshalFieldInfo + unrecognized field // offset of XXX_unrecognized + extensions field // offset of XXX_InternalExtensions + v1extensions field // offset of XXX_extensions + sizecache field // offset of XXX_sizecache + initialized int32 // 0 -- only typ is set, 1 -- fully initialized + messageset bool // uses message set wire format + hasmarshaler bool // has custom marshaler + sync.RWMutex // protect extElems map, also for initialization + extElems map[int32]*marshalElemInfo // info of extension elements +} + +// marshalFieldInfo is the information used for marshaling a field of a message. +type marshalFieldInfo struct { + field field + wiretag uint64 // tag in wire format + tagsize int // size of tag in wire format + sizer sizer + marshaler marshaler + isPointer bool + required bool // field is required + name string // name of the field, for error reporting + oneofElems map[reflect.Type]*marshalElemInfo // info of oneof elements +} + +// marshalElemInfo is the information used for marshaling an extension or oneof element. +type marshalElemInfo struct { + wiretag uint64 // tag in wire format + tagsize int // size of tag in wire format + sizer sizer + marshaler marshaler + isptr bool // elem is pointer typed, thus interface of this type is a direct interface (extension only) +} + +var ( + marshalInfoMap = map[reflect.Type]*marshalInfo{} + marshalInfoLock sync.Mutex +) + +// getMarshalInfo returns the information to marshal a given type of message. +// The info it returns may not necessarily initialized. +// t is the type of the message (NOT the pointer to it). +func getMarshalInfo(t reflect.Type) *marshalInfo { + marshalInfoLock.Lock() + u, ok := marshalInfoMap[t] + if !ok { + u = &marshalInfo{typ: t} + marshalInfoMap[t] = u + } + marshalInfoLock.Unlock() + return u +} + +// Size is the entry point from generated code, +// and should be ONLY called by generated code. +// It computes the size of encoded data of msg. +// a is a pointer to a place to store cached marshal info. +func (a *InternalMessageInfo) Size(msg Message) int { + u := getMessageMarshalInfo(msg, a) + ptr := toPointer(&msg) + if ptr.isNil() { + // We get here if msg is a typed nil ((*SomeMessage)(nil)), + // so it satisfies the interface, and msg == nil wouldn't + // catch it. We don't want crash in this case. + return 0 + } + return u.size(ptr) +} + +// Marshal is the entry point from generated code, +// and should be ONLY called by generated code. +// It marshals msg to the end of b. +// a is a pointer to a place to store cached marshal info. +func (a *InternalMessageInfo) Marshal(b []byte, msg Message, deterministic bool) ([]byte, error) { + u := getMessageMarshalInfo(msg, a) + ptr := toPointer(&msg) + if ptr.isNil() { + // We get here if msg is a typed nil ((*SomeMessage)(nil)), + // so it satisfies the interface, and msg == nil wouldn't + // catch it. We don't want crash in this case. + return b, ErrNil + } + return u.marshal(b, ptr, deterministic) +} + +func getMessageMarshalInfo(msg interface{}, a *InternalMessageInfo) *marshalInfo { + // u := a.marshal, but atomically. + // We use an atomic here to ensure memory consistency. + u := atomicLoadMarshalInfo(&a.marshal) + if u == nil { + // Get marshal information from type of message. + t := reflect.ValueOf(msg).Type() + if t.Kind() != reflect.Ptr { + panic(fmt.Sprintf("cannot handle non-pointer message type %v", t)) + } + u = getMarshalInfo(t.Elem()) + // Store it in the cache for later users. + // a.marshal = u, but atomically. + atomicStoreMarshalInfo(&a.marshal, u) + } + return u +} + +// size is the main function to compute the size of the encoded data of a message. +// ptr is the pointer to the message. +func (u *marshalInfo) size(ptr pointer) int { + if atomic.LoadInt32(&u.initialized) == 0 { + u.computeMarshalInfo() + } + + // If the message can marshal itself, let it do it, for compatibility. + // NOTE: This is not efficient. + if u.hasmarshaler { + m := ptr.asPointerTo(u.typ).Interface().(Marshaler) + b, _ := m.Marshal() + return len(b) + } + + n := 0 + for _, f := range u.fields { + if f.isPointer && ptr.offset(f.field).getPointer().isNil() { + // nil pointer always marshals to nothing + continue + } + n += f.sizer(ptr.offset(f.field), f.tagsize) + } + if u.extensions.IsValid() { + e := ptr.offset(u.extensions).toExtensions() + if u.messageset { + n += u.sizeMessageSet(e) + } else { + n += u.sizeExtensions(e) + } + } + if u.v1extensions.IsValid() { + m := *ptr.offset(u.v1extensions).toOldExtensions() + n += u.sizeV1Extensions(m) + } + if u.unrecognized.IsValid() { + s := *ptr.offset(u.unrecognized).toBytes() + n += len(s) + } + // cache the result for use in marshal + if u.sizecache.IsValid() { + atomic.StoreInt32(ptr.offset(u.sizecache).toInt32(), int32(n)) + } + return n +} + +// cachedsize gets the size from cache. If there is no cache (i.e. message is not generated), +// fall back to compute the size. +func (u *marshalInfo) cachedsize(ptr pointer) int { + if u.sizecache.IsValid() { + return int(atomic.LoadInt32(ptr.offset(u.sizecache).toInt32())) + } + return u.size(ptr) +} + +// marshal is the main function to marshal a message. It takes a byte slice and appends +// the encoded data to the end of the slice, returns the slice and error (if any). +// ptr is the pointer to the message. +// If deterministic is true, map is marshaled in deterministic order. +func (u *marshalInfo) marshal(b []byte, ptr pointer, deterministic bool) ([]byte, error) { + if atomic.LoadInt32(&u.initialized) == 0 { + u.computeMarshalInfo() + } + + // If the message can marshal itself, let it do it, for compatibility. + // NOTE: This is not efficient. + if u.hasmarshaler { + m := ptr.asPointerTo(u.typ).Interface().(Marshaler) + b1, err := m.Marshal() + b = append(b, b1...) + return b, err + } + + var err, errLater error + // The old marshaler encodes extensions at beginning. + if u.extensions.IsValid() { + e := ptr.offset(u.extensions).toExtensions() + if u.messageset { + b, err = u.appendMessageSet(b, e, deterministic) + } else { + b, err = u.appendExtensions(b, e, deterministic) + } + if err != nil { + return b, err + } + } + if u.v1extensions.IsValid() { + m := *ptr.offset(u.v1extensions).toOldExtensions() + b, err = u.appendV1Extensions(b, m, deterministic) + if err != nil { + return b, err + } + } + for _, f := range u.fields { + if f.required { + if ptr.offset(f.field).getPointer().isNil() { + // Required field is not set. + // We record the error but keep going, to give a complete marshaling. + if errLater == nil { + errLater = &RequiredNotSetError{f.name} + } + continue + } + } + if f.isPointer && ptr.offset(f.field).getPointer().isNil() { + // nil pointer always marshals to nothing + continue + } + b, err = f.marshaler(b, ptr.offset(f.field), f.wiretag, deterministic) + if err != nil { + if err1, ok := err.(*RequiredNotSetError); ok { + // Required field in submessage is not set. + // We record the error but keep going, to give a complete marshaling. + if errLater == nil { + errLater = &RequiredNotSetError{f.name + "." + err1.field} + } + continue + } + if err == errRepeatedHasNil { + err = errors.New("proto: repeated field " + f.name + " has nil element") + } + if err == errInvalidUTF8 { + if errLater == nil { + fullName := revProtoTypes[reflect.PtrTo(u.typ)] + "." + f.name + errLater = &invalidUTF8Error{fullName} + } + continue + } + return b, err + } + } + if u.unrecognized.IsValid() { + s := *ptr.offset(u.unrecognized).toBytes() + b = append(b, s...) + } + return b, errLater +} + +// computeMarshalInfo initializes the marshal info. +func (u *marshalInfo) computeMarshalInfo() { + u.Lock() + defer u.Unlock() + if u.initialized != 0 { // non-atomic read is ok as it is protected by the lock + return + } + + t := u.typ + u.unrecognized = invalidField + u.extensions = invalidField + u.v1extensions = invalidField + u.sizecache = invalidField + + // If the message can marshal itself, let it do it, for compatibility. + // NOTE: This is not efficient. + if reflect.PtrTo(t).Implements(marshalerType) { + u.hasmarshaler = true + atomic.StoreInt32(&u.initialized, 1) + return + } + + // get oneof implementers + var oneofImplementers []interface{} + if m, ok := reflect.Zero(reflect.PtrTo(t)).Interface().(oneofMessage); ok { + _, _, _, oneofImplementers = m.XXX_OneofFuncs() + } + + n := t.NumField() + + // deal with XXX fields first + for i := 0; i < t.NumField(); i++ { + f := t.Field(i) + if !strings.HasPrefix(f.Name, "XXX_") { + continue + } + switch f.Name { + case "XXX_sizecache": + u.sizecache = toField(&f) + case "XXX_unrecognized": + u.unrecognized = toField(&f) + case "XXX_InternalExtensions": + u.extensions = toField(&f) + u.messageset = f.Tag.Get("protobuf_messageset") == "1" + case "XXX_extensions": + u.v1extensions = toField(&f) + case "XXX_NoUnkeyedLiteral": + // nothing to do + default: + panic("unknown XXX field: " + f.Name) + } + n-- + } + + // normal fields + fields := make([]marshalFieldInfo, n) // batch allocation + u.fields = make([]*marshalFieldInfo, 0, n) + for i, j := 0, 0; i < t.NumField(); i++ { + f := t.Field(i) + + if strings.HasPrefix(f.Name, "XXX_") { + continue + } + field := &fields[j] + j++ + field.name = f.Name + u.fields = append(u.fields, field) + if f.Tag.Get("protobuf_oneof") != "" { + field.computeOneofFieldInfo(&f, oneofImplementers) + continue + } + if f.Tag.Get("protobuf") == "" { + // field has no tag (not in generated message), ignore it + u.fields = u.fields[:len(u.fields)-1] + j-- + continue + } + field.computeMarshalFieldInfo(&f) + } + + // fields are marshaled in tag order on the wire. + sort.Sort(byTag(u.fields)) + + atomic.StoreInt32(&u.initialized, 1) +} + +// helper for sorting fields by tag +type byTag []*marshalFieldInfo + +func (a byTag) Len() int { return len(a) } +func (a byTag) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a byTag) Less(i, j int) bool { return a[i].wiretag < a[j].wiretag } + +// getExtElemInfo returns the information to marshal an extension element. +// The info it returns is initialized. +func (u *marshalInfo) getExtElemInfo(desc *ExtensionDesc) *marshalElemInfo { + // get from cache first + u.RLock() + e, ok := u.extElems[desc.Field] + u.RUnlock() + if ok { + return e + } + + t := reflect.TypeOf(desc.ExtensionType) // pointer or slice to basic type or struct + tags := strings.Split(desc.Tag, ",") + tag, err := strconv.Atoi(tags[1]) + if err != nil { + panic("tag is not an integer") + } + wt := wiretype(tags[0]) + sizer, marshaler := typeMarshaler(t, tags, false, false) + e = &marshalElemInfo{ + wiretag: uint64(tag)<<3 | wt, + tagsize: SizeVarint(uint64(tag) << 3), + sizer: sizer, + marshaler: marshaler, + isptr: t.Kind() == reflect.Ptr, + } + + // update cache + u.Lock() + if u.extElems == nil { + u.extElems = make(map[int32]*marshalElemInfo) + } + u.extElems[desc.Field] = e + u.Unlock() + return e +} + +// computeMarshalFieldInfo fills up the information to marshal a field. +func (fi *marshalFieldInfo) computeMarshalFieldInfo(f *reflect.StructField) { + // parse protobuf tag of the field. + // tag has format of "bytes,49,opt,name=foo,def=hello!" + tags := strings.Split(f.Tag.Get("protobuf"), ",") + if tags[0] == "" { + return + } + tag, err := strconv.Atoi(tags[1]) + if err != nil { + panic("tag is not an integer") + } + wt := wiretype(tags[0]) + if tags[2] == "req" { + fi.required = true + } + fi.setTag(f, tag, wt) + fi.setMarshaler(f, tags) +} + +func (fi *marshalFieldInfo) computeOneofFieldInfo(f *reflect.StructField, oneofImplementers []interface{}) { + fi.field = toField(f) + fi.wiretag = 1<<31 - 1 // Use a large tag number, make oneofs sorted at the end. This tag will not appear on the wire. + fi.isPointer = true + fi.sizer, fi.marshaler = makeOneOfMarshaler(fi, f) + fi.oneofElems = make(map[reflect.Type]*marshalElemInfo) + + ityp := f.Type // interface type + for _, o := range oneofImplementers { + t := reflect.TypeOf(o) + if !t.Implements(ityp) { + continue + } + sf := t.Elem().Field(0) // oneof implementer is a struct with a single field + tags := strings.Split(sf.Tag.Get("protobuf"), ",") + tag, err := strconv.Atoi(tags[1]) + if err != nil { + panic("tag is not an integer") + } + wt := wiretype(tags[0]) + sizer, marshaler := typeMarshaler(sf.Type, tags, false, true) // oneof should not omit any zero value + fi.oneofElems[t.Elem()] = &marshalElemInfo{ + wiretag: uint64(tag)<<3 | wt, + tagsize: SizeVarint(uint64(tag) << 3), + sizer: sizer, + marshaler: marshaler, + } + } +} + +type oneofMessage interface { + XXX_OneofFuncs() (func(Message, *Buffer) error, func(Message, int, int, *Buffer) (bool, error), func(Message) int, []interface{}) +} + +// wiretype returns the wire encoding of the type. +func wiretype(encoding string) uint64 { + switch encoding { + case "fixed32": + return WireFixed32 + case "fixed64": + return WireFixed64 + case "varint", "zigzag32", "zigzag64": + return WireVarint + case "bytes": + return WireBytes + case "group": + return WireStartGroup + } + panic("unknown wire type " + encoding) +} + +// setTag fills up the tag (in wire format) and its size in the info of a field. +func (fi *marshalFieldInfo) setTag(f *reflect.StructField, tag int, wt uint64) { + fi.field = toField(f) + fi.wiretag = uint64(tag)<<3 | wt + fi.tagsize = SizeVarint(uint64(tag) << 3) +} + +// setMarshaler fills up the sizer and marshaler in the info of a field. +func (fi *marshalFieldInfo) setMarshaler(f *reflect.StructField, tags []string) { + switch f.Type.Kind() { + case reflect.Map: + // map field + fi.isPointer = true + fi.sizer, fi.marshaler = makeMapMarshaler(f) + return + case reflect.Ptr, reflect.Slice: + fi.isPointer = true + } + fi.sizer, fi.marshaler = typeMarshaler(f.Type, tags, true, false) +} + +// typeMarshaler returns the sizer and marshaler of a given field. +// t is the type of the field. +// tags is the generated "protobuf" tag of the field. +// If nozero is true, zero value is not marshaled to the wire. +// If oneof is true, it is a oneof field. +func typeMarshaler(t reflect.Type, tags []string, nozero, oneof bool) (sizer, marshaler) { + encoding := tags[0] + + pointer := false + slice := false + if t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 { + slice = true + t = t.Elem() + } + if t.Kind() == reflect.Ptr { + pointer = true + t = t.Elem() + } + + packed := false + proto3 := false + validateUTF8 := true + for i := 2; i < len(tags); i++ { + if tags[i] == "packed" { + packed = true + } + if tags[i] == "proto3" { + proto3 = true + } + } + validateUTF8 = validateUTF8 && proto3 + + switch t.Kind() { + case reflect.Bool: + if pointer { + return sizeBoolPtr, appendBoolPtr + } + if slice { + if packed { + return sizeBoolPackedSlice, appendBoolPackedSlice + } + return sizeBoolSlice, appendBoolSlice + } + if nozero { + return sizeBoolValueNoZero, appendBoolValueNoZero + } + return sizeBoolValue, appendBoolValue + case reflect.Uint32: + switch encoding { + case "fixed32": + if pointer { + return sizeFixed32Ptr, appendFixed32Ptr + } + if slice { + if packed { + return sizeFixed32PackedSlice, appendFixed32PackedSlice + } + return sizeFixed32Slice, appendFixed32Slice + } + if nozero { + return sizeFixed32ValueNoZero, appendFixed32ValueNoZero + } + return sizeFixed32Value, appendFixed32Value + case "varint": + if pointer { + return sizeVarint32Ptr, appendVarint32Ptr + } + if slice { + if packed { + return sizeVarint32PackedSlice, appendVarint32PackedSlice + } + return sizeVarint32Slice, appendVarint32Slice + } + if nozero { + return sizeVarint32ValueNoZero, appendVarint32ValueNoZero + } + return sizeVarint32Value, appendVarint32Value + } + case reflect.Int32: + switch encoding { + case "fixed32": + if pointer { + return sizeFixedS32Ptr, appendFixedS32Ptr + } + if slice { + if packed { + return sizeFixedS32PackedSlice, appendFixedS32PackedSlice + } + return sizeFixedS32Slice, appendFixedS32Slice + } + if nozero { + return sizeFixedS32ValueNoZero, appendFixedS32ValueNoZero + } + return sizeFixedS32Value, appendFixedS32Value + case "varint": + if pointer { + return sizeVarintS32Ptr, appendVarintS32Ptr + } + if slice { + if packed { + return sizeVarintS32PackedSlice, appendVarintS32PackedSlice + } + return sizeVarintS32Slice, appendVarintS32Slice + } + if nozero { + return sizeVarintS32ValueNoZero, appendVarintS32ValueNoZero + } + return sizeVarintS32Value, appendVarintS32Value + case "zigzag32": + if pointer { + return sizeZigzag32Ptr, appendZigzag32Ptr + } + if slice { + if packed { + return sizeZigzag32PackedSlice, appendZigzag32PackedSlice + } + return sizeZigzag32Slice, appendZigzag32Slice + } + if nozero { + return sizeZigzag32ValueNoZero, appendZigzag32ValueNoZero + } + return sizeZigzag32Value, appendZigzag32Value + } + case reflect.Uint64: + switch encoding { + case "fixed64": + if pointer { + return sizeFixed64Ptr, appendFixed64Ptr + } + if slice { + if packed { + return sizeFixed64PackedSlice, appendFixed64PackedSlice + } + return sizeFixed64Slice, appendFixed64Slice + } + if nozero { + return sizeFixed64ValueNoZero, appendFixed64ValueNoZero + } + return sizeFixed64Value, appendFixed64Value + case "varint": + if pointer { + return sizeVarint64Ptr, appendVarint64Ptr + } + if slice { + if packed { + return sizeVarint64PackedSlice, appendVarint64PackedSlice + } + return sizeVarint64Slice, appendVarint64Slice + } + if nozero { + return sizeVarint64ValueNoZero, appendVarint64ValueNoZero + } + return sizeVarint64Value, appendVarint64Value + } + case reflect.Int64: + switch encoding { + case "fixed64": + if pointer { + return sizeFixedS64Ptr, appendFixedS64Ptr + } + if slice { + if packed { + return sizeFixedS64PackedSlice, appendFixedS64PackedSlice + } + return sizeFixedS64Slice, appendFixedS64Slice + } + if nozero { + return sizeFixedS64ValueNoZero, appendFixedS64ValueNoZero + } + return sizeFixedS64Value, appendFixedS64Value + case "varint": + if pointer { + return sizeVarintS64Ptr, appendVarintS64Ptr + } + if slice { + if packed { + return sizeVarintS64PackedSlice, appendVarintS64PackedSlice + } + return sizeVarintS64Slice, appendVarintS64Slice + } + if nozero { + return sizeVarintS64ValueNoZero, appendVarintS64ValueNoZero + } + return sizeVarintS64Value, appendVarintS64Value + case "zigzag64": + if pointer { + return sizeZigzag64Ptr, appendZigzag64Ptr + } + if slice { + if packed { + return sizeZigzag64PackedSlice, appendZigzag64PackedSlice + } + return sizeZigzag64Slice, appendZigzag64Slice + } + if nozero { + return sizeZigzag64ValueNoZero, appendZigzag64ValueNoZero + } + return sizeZigzag64Value, appendZigzag64Value + } + case reflect.Float32: + if pointer { + return sizeFloat32Ptr, appendFloat32Ptr + } + if slice { + if packed { + return sizeFloat32PackedSlice, appendFloat32PackedSlice + } + return sizeFloat32Slice, appendFloat32Slice + } + if nozero { + return sizeFloat32ValueNoZero, appendFloat32ValueNoZero + } + return sizeFloat32Value, appendFloat32Value + case reflect.Float64: + if pointer { + return sizeFloat64Ptr, appendFloat64Ptr + } + if slice { + if packed { + return sizeFloat64PackedSlice, appendFloat64PackedSlice + } + return sizeFloat64Slice, appendFloat64Slice + } + if nozero { + return sizeFloat64ValueNoZero, appendFloat64ValueNoZero + } + return sizeFloat64Value, appendFloat64Value + case reflect.String: + if validateUTF8 { + if pointer { + return sizeStringPtr, appendUTF8StringPtr + } + if slice { + return sizeStringSlice, appendUTF8StringSlice + } + if nozero { + return sizeStringValueNoZero, appendUTF8StringValueNoZero + } + return sizeStringValue, appendUTF8StringValue + } + if pointer { + return sizeStringPtr, appendStringPtr + } + if slice { + return sizeStringSlice, appendStringSlice + } + if nozero { + return sizeStringValueNoZero, appendStringValueNoZero + } + return sizeStringValue, appendStringValue + case reflect.Slice: + if slice { + return sizeBytesSlice, appendBytesSlice + } + if oneof { + // Oneof bytes field may also have "proto3" tag. + // We want to marshal it as a oneof field. Do this + // check before the proto3 check. + return sizeBytesOneof, appendBytesOneof + } + if proto3 { + return sizeBytes3, appendBytes3 + } + return sizeBytes, appendBytes + case reflect.Struct: + switch encoding { + case "group": + if slice { + return makeGroupSliceMarshaler(getMarshalInfo(t)) + } + return makeGroupMarshaler(getMarshalInfo(t)) + case "bytes": + if slice { + return makeMessageSliceMarshaler(getMarshalInfo(t)) + } + return makeMessageMarshaler(getMarshalInfo(t)) + } + } + panic(fmt.Sprintf("unknown or mismatched type: type: %v, wire type: %v", t, encoding)) +} + +// Below are functions to size/marshal a specific type of a field. +// They are stored in the field's info, and called by function pointers. +// They have type sizer or marshaler. + +func sizeFixed32Value(_ pointer, tagsize int) int { + return 4 + tagsize +} +func sizeFixed32ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toUint32() + if v == 0 { + return 0 + } + return 4 + tagsize +} +func sizeFixed32Ptr(ptr pointer, tagsize int) int { + p := *ptr.toUint32Ptr() + if p == nil { + return 0 + } + return 4 + tagsize +} +func sizeFixed32Slice(ptr pointer, tagsize int) int { + s := *ptr.toUint32Slice() + return (4 + tagsize) * len(s) +} +func sizeFixed32PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toUint32Slice() + if len(s) == 0 { + return 0 + } + return 4*len(s) + SizeVarint(uint64(4*len(s))) + tagsize +} +func sizeFixedS32Value(_ pointer, tagsize int) int { + return 4 + tagsize +} +func sizeFixedS32ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toInt32() + if v == 0 { + return 0 + } + return 4 + tagsize +} +func sizeFixedS32Ptr(ptr pointer, tagsize int) int { + p := ptr.getInt32Ptr() + if p == nil { + return 0 + } + return 4 + tagsize +} +func sizeFixedS32Slice(ptr pointer, tagsize int) int { + s := ptr.getInt32Slice() + return (4 + tagsize) * len(s) +} +func sizeFixedS32PackedSlice(ptr pointer, tagsize int) int { + s := ptr.getInt32Slice() + if len(s) == 0 { + return 0 + } + return 4*len(s) + SizeVarint(uint64(4*len(s))) + tagsize +} +func sizeFloat32Value(_ pointer, tagsize int) int { + return 4 + tagsize +} +func sizeFloat32ValueNoZero(ptr pointer, tagsize int) int { + v := math.Float32bits(*ptr.toFloat32()) + if v == 0 { + return 0 + } + return 4 + tagsize +} +func sizeFloat32Ptr(ptr pointer, tagsize int) int { + p := *ptr.toFloat32Ptr() + if p == nil { + return 0 + } + return 4 + tagsize +} +func sizeFloat32Slice(ptr pointer, tagsize int) int { + s := *ptr.toFloat32Slice() + return (4 + tagsize) * len(s) +} +func sizeFloat32PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toFloat32Slice() + if len(s) == 0 { + return 0 + } + return 4*len(s) + SizeVarint(uint64(4*len(s))) + tagsize +} +func sizeFixed64Value(_ pointer, tagsize int) int { + return 8 + tagsize +} +func sizeFixed64ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toUint64() + if v == 0 { + return 0 + } + return 8 + tagsize +} +func sizeFixed64Ptr(ptr pointer, tagsize int) int { + p := *ptr.toUint64Ptr() + if p == nil { + return 0 + } + return 8 + tagsize +} +func sizeFixed64Slice(ptr pointer, tagsize int) int { + s := *ptr.toUint64Slice() + return (8 + tagsize) * len(s) +} +func sizeFixed64PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toUint64Slice() + if len(s) == 0 { + return 0 + } + return 8*len(s) + SizeVarint(uint64(8*len(s))) + tagsize +} +func sizeFixedS64Value(_ pointer, tagsize int) int { + return 8 + tagsize +} +func sizeFixedS64ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toInt64() + if v == 0 { + return 0 + } + return 8 + tagsize +} +func sizeFixedS64Ptr(ptr pointer, tagsize int) int { + p := *ptr.toInt64Ptr() + if p == nil { + return 0 + } + return 8 + tagsize +} +func sizeFixedS64Slice(ptr pointer, tagsize int) int { + s := *ptr.toInt64Slice() + return (8 + tagsize) * len(s) +} +func sizeFixedS64PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toInt64Slice() + if len(s) == 0 { + return 0 + } + return 8*len(s) + SizeVarint(uint64(8*len(s))) + tagsize +} +func sizeFloat64Value(_ pointer, tagsize int) int { + return 8 + tagsize +} +func sizeFloat64ValueNoZero(ptr pointer, tagsize int) int { + v := math.Float64bits(*ptr.toFloat64()) + if v == 0 { + return 0 + } + return 8 + tagsize +} +func sizeFloat64Ptr(ptr pointer, tagsize int) int { + p := *ptr.toFloat64Ptr() + if p == nil { + return 0 + } + return 8 + tagsize +} +func sizeFloat64Slice(ptr pointer, tagsize int) int { + s := *ptr.toFloat64Slice() + return (8 + tagsize) * len(s) +} +func sizeFloat64PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toFloat64Slice() + if len(s) == 0 { + return 0 + } + return 8*len(s) + SizeVarint(uint64(8*len(s))) + tagsize +} +func sizeVarint32Value(ptr pointer, tagsize int) int { + v := *ptr.toUint32() + return SizeVarint(uint64(v)) + tagsize +} +func sizeVarint32ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toUint32() + if v == 0 { + return 0 + } + return SizeVarint(uint64(v)) + tagsize +} +func sizeVarint32Ptr(ptr pointer, tagsize int) int { + p := *ptr.toUint32Ptr() + if p == nil { + return 0 + } + return SizeVarint(uint64(*p)) + tagsize +} +func sizeVarint32Slice(ptr pointer, tagsize int) int { + s := *ptr.toUint32Slice() + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + tagsize + } + return n +} +func sizeVarint32PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toUint32Slice() + if len(s) == 0 { + return 0 + } + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + } + return n + SizeVarint(uint64(n)) + tagsize +} +func sizeVarintS32Value(ptr pointer, tagsize int) int { + v := *ptr.toInt32() + return SizeVarint(uint64(v)) + tagsize +} +func sizeVarintS32ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toInt32() + if v == 0 { + return 0 + } + return SizeVarint(uint64(v)) + tagsize +} +func sizeVarintS32Ptr(ptr pointer, tagsize int) int { + p := ptr.getInt32Ptr() + if p == nil { + return 0 + } + return SizeVarint(uint64(*p)) + tagsize +} +func sizeVarintS32Slice(ptr pointer, tagsize int) int { + s := ptr.getInt32Slice() + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + tagsize + } + return n +} +func sizeVarintS32PackedSlice(ptr pointer, tagsize int) int { + s := ptr.getInt32Slice() + if len(s) == 0 { + return 0 + } + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + } + return n + SizeVarint(uint64(n)) + tagsize +} +func sizeVarint64Value(ptr pointer, tagsize int) int { + v := *ptr.toUint64() + return SizeVarint(v) + tagsize +} +func sizeVarint64ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toUint64() + if v == 0 { + return 0 + } + return SizeVarint(v) + tagsize +} +func sizeVarint64Ptr(ptr pointer, tagsize int) int { + p := *ptr.toUint64Ptr() + if p == nil { + return 0 + } + return SizeVarint(*p) + tagsize +} +func sizeVarint64Slice(ptr pointer, tagsize int) int { + s := *ptr.toUint64Slice() + n := 0 + for _, v := range s { + n += SizeVarint(v) + tagsize + } + return n +} +func sizeVarint64PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toUint64Slice() + if len(s) == 0 { + return 0 + } + n := 0 + for _, v := range s { + n += SizeVarint(v) + } + return n + SizeVarint(uint64(n)) + tagsize +} +func sizeVarintS64Value(ptr pointer, tagsize int) int { + v := *ptr.toInt64() + return SizeVarint(uint64(v)) + tagsize +} +func sizeVarintS64ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toInt64() + if v == 0 { + return 0 + } + return SizeVarint(uint64(v)) + tagsize +} +func sizeVarintS64Ptr(ptr pointer, tagsize int) int { + p := *ptr.toInt64Ptr() + if p == nil { + return 0 + } + return SizeVarint(uint64(*p)) + tagsize +} +func sizeVarintS64Slice(ptr pointer, tagsize int) int { + s := *ptr.toInt64Slice() + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + tagsize + } + return n +} +func sizeVarintS64PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toInt64Slice() + if len(s) == 0 { + return 0 + } + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + } + return n + SizeVarint(uint64(n)) + tagsize +} +func sizeZigzag32Value(ptr pointer, tagsize int) int { + v := *ptr.toInt32() + return SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize +} +func sizeZigzag32ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toInt32() + if v == 0 { + return 0 + } + return SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize +} +func sizeZigzag32Ptr(ptr pointer, tagsize int) int { + p := ptr.getInt32Ptr() + if p == nil { + return 0 + } + v := *p + return SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize +} +func sizeZigzag32Slice(ptr pointer, tagsize int) int { + s := ptr.getInt32Slice() + n := 0 + for _, v := range s { + n += SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize + } + return n +} +func sizeZigzag32PackedSlice(ptr pointer, tagsize int) int { + s := ptr.getInt32Slice() + if len(s) == 0 { + return 0 + } + n := 0 + for _, v := range s { + n += SizeVarint(uint64((uint32(v) << 1) ^ uint32((int32(v) >> 31)))) + } + return n + SizeVarint(uint64(n)) + tagsize +} +func sizeZigzag64Value(ptr pointer, tagsize int) int { + v := *ptr.toInt64() + return SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize +} +func sizeZigzag64ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toInt64() + if v == 0 { + return 0 + } + return SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize +} +func sizeZigzag64Ptr(ptr pointer, tagsize int) int { + p := *ptr.toInt64Ptr() + if p == nil { + return 0 + } + v := *p + return SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize +} +func sizeZigzag64Slice(ptr pointer, tagsize int) int { + s := *ptr.toInt64Slice() + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize + } + return n +} +func sizeZigzag64PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toInt64Slice() + if len(s) == 0 { + return 0 + } + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v<<1) ^ uint64((int64(v) >> 63))) + } + return n + SizeVarint(uint64(n)) + tagsize +} +func sizeBoolValue(_ pointer, tagsize int) int { + return 1 + tagsize +} +func sizeBoolValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toBool() + if !v { + return 0 + } + return 1 + tagsize +} +func sizeBoolPtr(ptr pointer, tagsize int) int { + p := *ptr.toBoolPtr() + if p == nil { + return 0 + } + return 1 + tagsize +} +func sizeBoolSlice(ptr pointer, tagsize int) int { + s := *ptr.toBoolSlice() + return (1 + tagsize) * len(s) +} +func sizeBoolPackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toBoolSlice() + if len(s) == 0 { + return 0 + } + return len(s) + SizeVarint(uint64(len(s))) + tagsize +} +func sizeStringValue(ptr pointer, tagsize int) int { + v := *ptr.toString() + return len(v) + SizeVarint(uint64(len(v))) + tagsize +} +func sizeStringValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toString() + if v == "" { + return 0 + } + return len(v) + SizeVarint(uint64(len(v))) + tagsize +} +func sizeStringPtr(ptr pointer, tagsize int) int { + p := *ptr.toStringPtr() + if p == nil { + return 0 + } + v := *p + return len(v) + SizeVarint(uint64(len(v))) + tagsize +} +func sizeStringSlice(ptr pointer, tagsize int) int { + s := *ptr.toStringSlice() + n := 0 + for _, v := range s { + n += len(v) + SizeVarint(uint64(len(v))) + tagsize + } + return n +} +func sizeBytes(ptr pointer, tagsize int) int { + v := *ptr.toBytes() + if v == nil { + return 0 + } + return len(v) + SizeVarint(uint64(len(v))) + tagsize +} +func sizeBytes3(ptr pointer, tagsize int) int { + v := *ptr.toBytes() + if len(v) == 0 { + return 0 + } + return len(v) + SizeVarint(uint64(len(v))) + tagsize +} +func sizeBytesOneof(ptr pointer, tagsize int) int { + v := *ptr.toBytes() + return len(v) + SizeVarint(uint64(len(v))) + tagsize +} +func sizeBytesSlice(ptr pointer, tagsize int) int { + s := *ptr.toBytesSlice() + n := 0 + for _, v := range s { + n += len(v) + SizeVarint(uint64(len(v))) + tagsize + } + return n +} + +// appendFixed32 appends an encoded fixed32 to b. +func appendFixed32(b []byte, v uint32) []byte { + b = append(b, + byte(v), + byte(v>>8), + byte(v>>16), + byte(v>>24)) + return b +} + +// appendFixed64 appends an encoded fixed64 to b. +func appendFixed64(b []byte, v uint64) []byte { + b = append(b, + byte(v), + byte(v>>8), + byte(v>>16), + byte(v>>24), + byte(v>>32), + byte(v>>40), + byte(v>>48), + byte(v>>56)) + return b +} + +// appendVarint appends an encoded varint to b. +func appendVarint(b []byte, v uint64) []byte { + // TODO: make 1-byte (maybe 2-byte) case inline-able, once we + // have non-leaf inliner. + switch { + case v < 1<<7: + b = append(b, byte(v)) + case v < 1<<14: + b = append(b, + byte(v&0x7f|0x80), + byte(v>>7)) + case v < 1<<21: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte(v>>14)) + case v < 1<<28: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte(v>>21)) + case v < 1<<35: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte((v>>21)&0x7f|0x80), + byte(v>>28)) + case v < 1<<42: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte((v>>21)&0x7f|0x80), + byte((v>>28)&0x7f|0x80), + byte(v>>35)) + case v < 1<<49: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte((v>>21)&0x7f|0x80), + byte((v>>28)&0x7f|0x80), + byte((v>>35)&0x7f|0x80), + byte(v>>42)) + case v < 1<<56: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte((v>>21)&0x7f|0x80), + byte((v>>28)&0x7f|0x80), + byte((v>>35)&0x7f|0x80), + byte((v>>42)&0x7f|0x80), + byte(v>>49)) + case v < 1<<63: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte((v>>21)&0x7f|0x80), + byte((v>>28)&0x7f|0x80), + byte((v>>35)&0x7f|0x80), + byte((v>>42)&0x7f|0x80), + byte((v>>49)&0x7f|0x80), + byte(v>>56)) + default: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte((v>>21)&0x7f|0x80), + byte((v>>28)&0x7f|0x80), + byte((v>>35)&0x7f|0x80), + byte((v>>42)&0x7f|0x80), + byte((v>>49)&0x7f|0x80), + byte((v>>56)&0x7f|0x80), + 1) + } + return b +} + +func appendFixed32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint32() + b = appendVarint(b, wiretag) + b = appendFixed32(b, v) + return b, nil +} +func appendFixed32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint32() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed32(b, v) + return b, nil +} +func appendFixed32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toUint32Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed32(b, *p) + return b, nil +} +func appendFixed32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint32Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendFixed32(b, v) + } + return b, nil +} +func appendFixed32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint32Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(4*len(s))) + for _, v := range s { + b = appendFixed32(b, v) + } + return b, nil +} +func appendFixedS32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt32() + b = appendVarint(b, wiretag) + b = appendFixed32(b, uint32(v)) + return b, nil +} +func appendFixedS32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt32() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed32(b, uint32(v)) + return b, nil +} +func appendFixedS32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := ptr.getInt32Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed32(b, uint32(*p)) + return b, nil +} +func appendFixedS32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := ptr.getInt32Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendFixed32(b, uint32(v)) + } + return b, nil +} +func appendFixedS32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := ptr.getInt32Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(4*len(s))) + for _, v := range s { + b = appendFixed32(b, uint32(v)) + } + return b, nil +} +func appendFloat32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := math.Float32bits(*ptr.toFloat32()) + b = appendVarint(b, wiretag) + b = appendFixed32(b, v) + return b, nil +} +func appendFloat32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := math.Float32bits(*ptr.toFloat32()) + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed32(b, v) + return b, nil +} +func appendFloat32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toFloat32Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed32(b, math.Float32bits(*p)) + return b, nil +} +func appendFloat32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toFloat32Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendFixed32(b, math.Float32bits(v)) + } + return b, nil +} +func appendFloat32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toFloat32Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(4*len(s))) + for _, v := range s { + b = appendFixed32(b, math.Float32bits(v)) + } + return b, nil +} +func appendFixed64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint64() + b = appendVarint(b, wiretag) + b = appendFixed64(b, v) + return b, nil +} +func appendFixed64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint64() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed64(b, v) + return b, nil +} +func appendFixed64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toUint64Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed64(b, *p) + return b, nil +} +func appendFixed64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint64Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendFixed64(b, v) + } + return b, nil +} +func appendFixed64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint64Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(8*len(s))) + for _, v := range s { + b = appendFixed64(b, v) + } + return b, nil +} +func appendFixedS64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt64() + b = appendVarint(b, wiretag) + b = appendFixed64(b, uint64(v)) + return b, nil +} +func appendFixedS64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt64() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed64(b, uint64(v)) + return b, nil +} +func appendFixedS64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toInt64Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed64(b, uint64(*p)) + return b, nil +} +func appendFixedS64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toInt64Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendFixed64(b, uint64(v)) + } + return b, nil +} +func appendFixedS64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toInt64Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(8*len(s))) + for _, v := range s { + b = appendFixed64(b, uint64(v)) + } + return b, nil +} +func appendFloat64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := math.Float64bits(*ptr.toFloat64()) + b = appendVarint(b, wiretag) + b = appendFixed64(b, v) + return b, nil +} +func appendFloat64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := math.Float64bits(*ptr.toFloat64()) + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed64(b, v) + return b, nil +} +func appendFloat64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toFloat64Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed64(b, math.Float64bits(*p)) + return b, nil +} +func appendFloat64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toFloat64Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendFixed64(b, math.Float64bits(v)) + } + return b, nil +} +func appendFloat64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toFloat64Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(8*len(s))) + for _, v := range s { + b = appendFixed64(b, math.Float64bits(v)) + } + return b, nil +} +func appendVarint32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint32() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + return b, nil +} +func appendVarint32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint32() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + return b, nil +} +func appendVarint32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toUint32Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(*p)) + return b, nil +} +func appendVarint32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint32Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + } + return b, nil +} +func appendVarint32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint32Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + // compute size + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + } + b = appendVarint(b, uint64(n)) + for _, v := range s { + b = appendVarint(b, uint64(v)) + } + return b, nil +} +func appendVarintS32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt32() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + return b, nil +} +func appendVarintS32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt32() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + return b, nil +} +func appendVarintS32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := ptr.getInt32Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(*p)) + return b, nil +} +func appendVarintS32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := ptr.getInt32Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + } + return b, nil +} +func appendVarintS32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := ptr.getInt32Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + // compute size + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + } + b = appendVarint(b, uint64(n)) + for _, v := range s { + b = appendVarint(b, uint64(v)) + } + return b, nil +} +func appendVarint64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint64() + b = appendVarint(b, wiretag) + b = appendVarint(b, v) + return b, nil +} +func appendVarint64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint64() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, v) + return b, nil +} +func appendVarint64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toUint64Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, *p) + return b, nil +} +func appendVarint64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint64Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, v) + } + return b, nil +} +func appendVarint64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint64Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + // compute size + n := 0 + for _, v := range s { + n += SizeVarint(v) + } + b = appendVarint(b, uint64(n)) + for _, v := range s { + b = appendVarint(b, v) + } + return b, nil +} +func appendVarintS64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt64() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + return b, nil +} +func appendVarintS64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt64() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + return b, nil +} +func appendVarintS64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toInt64Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(*p)) + return b, nil +} +func appendVarintS64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toInt64Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + } + return b, nil +} +func appendVarintS64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toInt64Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + // compute size + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + } + b = appendVarint(b, uint64(n)) + for _, v := range s { + b = appendVarint(b, uint64(v)) + } + return b, nil +} +func appendZigzag32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt32() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + return b, nil +} +func appendZigzag32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt32() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + return b, nil +} +func appendZigzag32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := ptr.getInt32Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + v := *p + b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + return b, nil +} +func appendZigzag32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := ptr.getInt32Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + } + return b, nil +} +func appendZigzag32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := ptr.getInt32Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + // compute size + n := 0 + for _, v := range s { + n += SizeVarint(uint64((uint32(v) << 1) ^ uint32((int32(v) >> 31)))) + } + b = appendVarint(b, uint64(n)) + for _, v := range s { + b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + } + return b, nil +} +func appendZigzag64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt64() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) + return b, nil +} +func appendZigzag64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt64() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) + return b, nil +} +func appendZigzag64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toInt64Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + v := *p + b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) + return b, nil +} +func appendZigzag64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toInt64Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) + } + return b, nil +} +func appendZigzag64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toInt64Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + // compute size + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v<<1) ^ uint64((int64(v) >> 63))) + } + b = appendVarint(b, uint64(n)) + for _, v := range s { + b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) + } + return b, nil +} +func appendBoolValue(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toBool() + b = appendVarint(b, wiretag) + if v { + b = append(b, 1) + } else { + b = append(b, 0) + } + return b, nil +} +func appendBoolValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toBool() + if !v { + return b, nil + } + b = appendVarint(b, wiretag) + b = append(b, 1) + return b, nil +} + +func appendBoolPtr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toBoolPtr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + if *p { + b = append(b, 1) + } else { + b = append(b, 0) + } + return b, nil +} +func appendBoolSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toBoolSlice() + for _, v := range s { + b = appendVarint(b, wiretag) + if v { + b = append(b, 1) + } else { + b = append(b, 0) + } + } + return b, nil +} +func appendBoolPackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toBoolSlice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(len(s))) + for _, v := range s { + if v { + b = append(b, 1) + } else { + b = append(b, 0) + } + } + return b, nil +} +func appendStringValue(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toString() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + return b, nil +} +func appendStringValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toString() + if v == "" { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + return b, nil +} +func appendStringPtr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toStringPtr() + if p == nil { + return b, nil + } + v := *p + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + return b, nil +} +func appendStringSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toStringSlice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + } + return b, nil +} +func appendUTF8StringValue(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + var invalidUTF8 bool + v := *ptr.toString() + if !utf8.ValidString(v) { + invalidUTF8 = true + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + if invalidUTF8 { + return b, errInvalidUTF8 + } + return b, nil +} +func appendUTF8StringValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + var invalidUTF8 bool + v := *ptr.toString() + if v == "" { + return b, nil + } + if !utf8.ValidString(v) { + invalidUTF8 = true + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + if invalidUTF8 { + return b, errInvalidUTF8 + } + return b, nil +} +func appendUTF8StringPtr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + var invalidUTF8 bool + p := *ptr.toStringPtr() + if p == nil { + return b, nil + } + v := *p + if !utf8.ValidString(v) { + invalidUTF8 = true + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + if invalidUTF8 { + return b, errInvalidUTF8 + } + return b, nil +} +func appendUTF8StringSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + var invalidUTF8 bool + s := *ptr.toStringSlice() + for _, v := range s { + if !utf8.ValidString(v) { + invalidUTF8 = true + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + } + if invalidUTF8 { + return b, errInvalidUTF8 + } + return b, nil +} +func appendBytes(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toBytes() + if v == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + return b, nil +} +func appendBytes3(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toBytes() + if len(v) == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + return b, nil +} +func appendBytesOneof(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toBytes() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + return b, nil +} +func appendBytesSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toBytesSlice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + } + return b, nil +} + +// makeGroupMarshaler returns the sizer and marshaler for a group. +// u is the marshal info of the underlying message. +func makeGroupMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + p := ptr.getPointer() + if p.isNil() { + return 0 + } + return u.size(p) + 2*tagsize + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + p := ptr.getPointer() + if p.isNil() { + return b, nil + } + var err error + b = appendVarint(b, wiretag) // start group + b, err = u.marshal(b, p, deterministic) + b = appendVarint(b, wiretag+(WireEndGroup-WireStartGroup)) // end group + return b, err + } +} + +// makeGroupSliceMarshaler returns the sizer and marshaler for a group slice. +// u is the marshal info of the underlying message. +func makeGroupSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getPointerSlice() + n := 0 + for _, v := range s { + if v.isNil() { + continue + } + n += u.size(v) + 2*tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getPointerSlice() + var err error + var nerr nonFatal + for _, v := range s { + if v.isNil() { + return b, errRepeatedHasNil + } + b = appendVarint(b, wiretag) // start group + b, err = u.marshal(b, v, deterministic) + b = appendVarint(b, wiretag+(WireEndGroup-WireStartGroup)) // end group + if !nerr.Merge(err) { + if err == ErrNil { + err = errRepeatedHasNil + } + return b, err + } + } + return b, nerr.E + } +} + +// makeMessageMarshaler returns the sizer and marshaler for a message field. +// u is the marshal info of the message. +func makeMessageMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + p := ptr.getPointer() + if p.isNil() { + return 0 + } + siz := u.size(p) + return siz + SizeVarint(uint64(siz)) + tagsize + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + p := ptr.getPointer() + if p.isNil() { + return b, nil + } + b = appendVarint(b, wiretag) + siz := u.cachedsize(p) + b = appendVarint(b, uint64(siz)) + return u.marshal(b, p, deterministic) + } +} + +// makeMessageSliceMarshaler returns the sizer and marshaler for a message slice. +// u is the marshal info of the message. +func makeMessageSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getPointerSlice() + n := 0 + for _, v := range s { + if v.isNil() { + continue + } + siz := u.size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getPointerSlice() + var err error + var nerr nonFatal + for _, v := range s { + if v.isNil() { + return b, errRepeatedHasNil + } + b = appendVarint(b, wiretag) + siz := u.cachedsize(v) + b = appendVarint(b, uint64(siz)) + b, err = u.marshal(b, v, deterministic) + + if !nerr.Merge(err) { + if err == ErrNil { + err = errRepeatedHasNil + } + return b, err + } + } + return b, nerr.E + } +} + +// makeMapMarshaler returns the sizer and marshaler for a map field. +// f is the pointer to the reflect data structure of the field. +func makeMapMarshaler(f *reflect.StructField) (sizer, marshaler) { + // figure out key and value type + t := f.Type + keyType := t.Key() + valType := t.Elem() + keyTags := strings.Split(f.Tag.Get("protobuf_key"), ",") + valTags := strings.Split(f.Tag.Get("protobuf_val"), ",") + keySizer, keyMarshaler := typeMarshaler(keyType, keyTags, false, false) // don't omit zero value in map + valSizer, valMarshaler := typeMarshaler(valType, valTags, false, false) // don't omit zero value in map + keyWireTag := 1<<3 | wiretype(keyTags[0]) + valWireTag := 2<<3 | wiretype(valTags[0]) + + // We create an interface to get the addresses of the map key and value. + // If value is pointer-typed, the interface is a direct interface, the + // idata itself is the value. Otherwise, the idata is the pointer to the + // value. + // Key cannot be pointer-typed. + valIsPtr := valType.Kind() == reflect.Ptr + + // If value is a message with nested maps, calling + // valSizer in marshal may be quadratic. We should use + // cached version in marshal (but not in size). + // If value is not message type, we don't have size cache, + // but it cannot be nested either. Just use valSizer. + valCachedSizer := valSizer + if valIsPtr && valType.Elem().Kind() == reflect.Struct { + u := getMarshalInfo(valType.Elem()) + valCachedSizer = func(ptr pointer, tagsize int) int { + // Same as message sizer, but use cache. + p := ptr.getPointer() + if p.isNil() { + return 0 + } + siz := u.cachedsize(p) + return siz + SizeVarint(uint64(siz)) + tagsize + } + } + return func(ptr pointer, tagsize int) int { + m := ptr.asPointerTo(t).Elem() // the map + n := 0 + for _, k := range m.MapKeys() { + ki := k.Interface() + vi := m.MapIndex(k).Interface() + kaddr := toAddrPointer(&ki, false) // pointer to key + vaddr := toAddrPointer(&vi, valIsPtr) // pointer to value + siz := keySizer(kaddr, 1) + valSizer(vaddr, 1) // tag of key = 1 (size=1), tag of val = 2 (size=1) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, tag uint64, deterministic bool) ([]byte, error) { + m := ptr.asPointerTo(t).Elem() // the map + var err error + keys := m.MapKeys() + if len(keys) > 1 && deterministic { + sort.Sort(mapKeys(keys)) + } + + var nerr nonFatal + for _, k := range keys { + ki := k.Interface() + vi := m.MapIndex(k).Interface() + kaddr := toAddrPointer(&ki, false) // pointer to key + vaddr := toAddrPointer(&vi, valIsPtr) // pointer to value + b = appendVarint(b, tag) + siz := keySizer(kaddr, 1) + valCachedSizer(vaddr, 1) // tag of key = 1 (size=1), tag of val = 2 (size=1) + b = appendVarint(b, uint64(siz)) + b, err = keyMarshaler(b, kaddr, keyWireTag, deterministic) + if !nerr.Merge(err) { + return b, err + } + b, err = valMarshaler(b, vaddr, valWireTag, deterministic) + if err != ErrNil && !nerr.Merge(err) { // allow nil value in map + return b, err + } + } + return b, nerr.E + } +} + +// makeOneOfMarshaler returns the sizer and marshaler for a oneof field. +// fi is the marshal info of the field. +// f is the pointer to the reflect data structure of the field. +func makeOneOfMarshaler(fi *marshalFieldInfo, f *reflect.StructField) (sizer, marshaler) { + // Oneof field is an interface. We need to get the actual data type on the fly. + t := f.Type + return func(ptr pointer, _ int) int { + p := ptr.getInterfacePointer() + if p.isNil() { + return 0 + } + v := ptr.asPointerTo(t).Elem().Elem().Elem() // *interface -> interface -> *struct -> struct + telem := v.Type() + e := fi.oneofElems[telem] + return e.sizer(p, e.tagsize) + }, + func(b []byte, ptr pointer, _ uint64, deterministic bool) ([]byte, error) { + p := ptr.getInterfacePointer() + if p.isNil() { + return b, nil + } + v := ptr.asPointerTo(t).Elem().Elem().Elem() // *interface -> interface -> *struct -> struct + telem := v.Type() + if telem.Field(0).Type.Kind() == reflect.Ptr && p.getPointer().isNil() { + return b, errOneofHasNil + } + e := fi.oneofElems[telem] + return e.marshaler(b, p, e.wiretag, deterministic) + } +} + +// sizeExtensions computes the size of encoded data for a XXX_InternalExtensions field. +func (u *marshalInfo) sizeExtensions(ext *XXX_InternalExtensions) int { + m, mu := ext.extensionsRead() + if m == nil { + return 0 + } + mu.Lock() + + n := 0 + for _, e := range m { + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + n += len(e.enc) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr) + n += ei.sizer(p, ei.tagsize) + } + mu.Unlock() + return n +} + +// appendExtensions marshals a XXX_InternalExtensions field to the end of byte slice b. +func (u *marshalInfo) appendExtensions(b []byte, ext *XXX_InternalExtensions, deterministic bool) ([]byte, error) { + m, mu := ext.extensionsRead() + if m == nil { + return b, nil + } + mu.Lock() + defer mu.Unlock() + + var err error + var nerr nonFatal + + // Fast-path for common cases: zero or one extensions. + // Don't bother sorting the keys. + if len(m) <= 1 { + for _, e := range m { + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + b = append(b, e.enc...) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr) + b, err = ei.marshaler(b, p, ei.wiretag, deterministic) + if !nerr.Merge(err) { + return b, err + } + } + return b, nerr.E + } + + // Sort the keys to provide a deterministic encoding. + // Not sure this is required, but the old code does it. + keys := make([]int, 0, len(m)) + for k := range m { + keys = append(keys, int(k)) + } + sort.Ints(keys) + + for _, k := range keys { + e := m[int32(k)] + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + b = append(b, e.enc...) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr) + b, err = ei.marshaler(b, p, ei.wiretag, deterministic) + if !nerr.Merge(err) { + return b, err + } + } + return b, nerr.E +} + +// message set format is: +// message MessageSet { +// repeated group Item = 1 { +// required int32 type_id = 2; +// required string message = 3; +// }; +// } + +// sizeMessageSet computes the size of encoded data for a XXX_InternalExtensions field +// in message set format (above). +func (u *marshalInfo) sizeMessageSet(ext *XXX_InternalExtensions) int { + m, mu := ext.extensionsRead() + if m == nil { + return 0 + } + mu.Lock() + + n := 0 + for id, e := range m { + n += 2 // start group, end group. tag = 1 (size=1) + n += SizeVarint(uint64(id)) + 1 // type_id, tag = 2 (size=1) + + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + msgWithLen := skipVarint(e.enc) // skip old tag, but leave the length varint + siz := len(msgWithLen) + n += siz + 1 // message, tag = 3 (size=1) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr) + n += ei.sizer(p, 1) // message, tag = 3 (size=1) + } + mu.Unlock() + return n +} + +// appendMessageSet marshals a XXX_InternalExtensions field in message set format (above) +// to the end of byte slice b. +func (u *marshalInfo) appendMessageSet(b []byte, ext *XXX_InternalExtensions, deterministic bool) ([]byte, error) { + m, mu := ext.extensionsRead() + if m == nil { + return b, nil + } + mu.Lock() + defer mu.Unlock() + + var err error + var nerr nonFatal + + // Fast-path for common cases: zero or one extensions. + // Don't bother sorting the keys. + if len(m) <= 1 { + for id, e := range m { + b = append(b, 1<<3|WireStartGroup) + b = append(b, 2<<3|WireVarint) + b = appendVarint(b, uint64(id)) + + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + msgWithLen := skipVarint(e.enc) // skip old tag, but leave the length varint + b = append(b, 3<<3|WireBytes) + b = append(b, msgWithLen...) + b = append(b, 1<<3|WireEndGroup) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr) + b, err = ei.marshaler(b, p, 3<<3|WireBytes, deterministic) + if !nerr.Merge(err) { + return b, err + } + b = append(b, 1<<3|WireEndGroup) + } + return b, nerr.E + } + + // Sort the keys to provide a deterministic encoding. + keys := make([]int, 0, len(m)) + for k := range m { + keys = append(keys, int(k)) + } + sort.Ints(keys) + + for _, id := range keys { + e := m[int32(id)] + b = append(b, 1<<3|WireStartGroup) + b = append(b, 2<<3|WireVarint) + b = appendVarint(b, uint64(id)) + + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + msgWithLen := skipVarint(e.enc) // skip old tag, but leave the length varint + b = append(b, 3<<3|WireBytes) + b = append(b, msgWithLen...) + b = append(b, 1<<3|WireEndGroup) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr) + b, err = ei.marshaler(b, p, 3<<3|WireBytes, deterministic) + b = append(b, 1<<3|WireEndGroup) + if !nerr.Merge(err) { + return b, err + } + } + return b, nerr.E +} + +// sizeV1Extensions computes the size of encoded data for a V1-API extension field. +func (u *marshalInfo) sizeV1Extensions(m map[int32]Extension) int { + if m == nil { + return 0 + } + + n := 0 + for _, e := range m { + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + n += len(e.enc) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr) + n += ei.sizer(p, ei.tagsize) + } + return n +} + +// appendV1Extensions marshals a V1-API extension field to the end of byte slice b. +func (u *marshalInfo) appendV1Extensions(b []byte, m map[int32]Extension, deterministic bool) ([]byte, error) { + if m == nil { + return b, nil + } + + // Sort the keys to provide a deterministic encoding. + keys := make([]int, 0, len(m)) + for k := range m { + keys = append(keys, int(k)) + } + sort.Ints(keys) + + var err error + var nerr nonFatal + for _, k := range keys { + e := m[int32(k)] + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + b = append(b, e.enc...) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr) + b, err = ei.marshaler(b, p, ei.wiretag, deterministic) + if !nerr.Merge(err) { + return b, err + } + } + return b, nerr.E +} + +// newMarshaler is the interface representing objects that can marshal themselves. +// +// This exists to support protoc-gen-go generated messages. +// The proto package will stop type-asserting to this interface in the future. +// +// DO NOT DEPEND ON THIS. +type newMarshaler interface { + XXX_Size() int + XXX_Marshal(b []byte, deterministic bool) ([]byte, error) +} + +// Size returns the encoded size of a protocol buffer message. +// This is the main entry point. +func Size(pb Message) int { + if m, ok := pb.(newMarshaler); ok { + return m.XXX_Size() + } + if m, ok := pb.(Marshaler); ok { + // If the message can marshal itself, let it do it, for compatibility. + // NOTE: This is not efficient. + b, _ := m.Marshal() + return len(b) + } + // in case somehow we didn't generate the wrapper + if pb == nil { + return 0 + } + var info InternalMessageInfo + return info.Size(pb) +} + +// Marshal takes a protocol buffer message +// and encodes it into the wire format, returning the data. +// This is the main entry point. +func Marshal(pb Message) ([]byte, error) { + if m, ok := pb.(newMarshaler); ok { + siz := m.XXX_Size() + b := make([]byte, 0, siz) + return m.XXX_Marshal(b, false) + } + if m, ok := pb.(Marshaler); ok { + // If the message can marshal itself, let it do it, for compatibility. + // NOTE: This is not efficient. + return m.Marshal() + } + // in case somehow we didn't generate the wrapper + if pb == nil { + return nil, ErrNil + } + var info InternalMessageInfo + siz := info.Size(pb) + b := make([]byte, 0, siz) + return info.Marshal(b, pb, false) +} + +// Marshal takes a protocol buffer message +// and encodes it into the wire format, writing the result to the +// Buffer. +// This is an alternative entry point. It is not necessary to use +// a Buffer for most applications. +func (p *Buffer) Marshal(pb Message) error { + var err error + if m, ok := pb.(newMarshaler); ok { + siz := m.XXX_Size() + p.grow(siz) // make sure buf has enough capacity + p.buf, err = m.XXX_Marshal(p.buf, p.deterministic) + return err + } + if m, ok := pb.(Marshaler); ok { + // If the message can marshal itself, let it do it, for compatibility. + // NOTE: This is not efficient. + b, err := m.Marshal() + p.buf = append(p.buf, b...) + return err + } + // in case somehow we didn't generate the wrapper + if pb == nil { + return ErrNil + } + var info InternalMessageInfo + siz := info.Size(pb) + p.grow(siz) // make sure buf has enough capacity + p.buf, err = info.Marshal(p.buf, pb, p.deterministic) + return err +} + +// grow grows the buffer's capacity, if necessary, to guarantee space for +// another n bytes. After grow(n), at least n bytes can be written to the +// buffer without another allocation. +func (p *Buffer) grow(n int) { + need := len(p.buf) + n + if need <= cap(p.buf) { + return + } + newCap := len(p.buf) * 2 + if newCap < need { + newCap = need + } + p.buf = append(make([]byte, 0, newCap), p.buf...) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/proto/table_merge.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/proto/table_merge.go new file mode 100644 index 00000000..5525def6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/proto/table_merge.go @@ -0,0 +1,654 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "fmt" + "reflect" + "strings" + "sync" + "sync/atomic" +) + +// Merge merges the src message into dst. +// This assumes that dst and src of the same type and are non-nil. +func (a *InternalMessageInfo) Merge(dst, src Message) { + mi := atomicLoadMergeInfo(&a.merge) + if mi == nil { + mi = getMergeInfo(reflect.TypeOf(dst).Elem()) + atomicStoreMergeInfo(&a.merge, mi) + } + mi.merge(toPointer(&dst), toPointer(&src)) +} + +type mergeInfo struct { + typ reflect.Type + + initialized int32 // 0: only typ is valid, 1: everything is valid + lock sync.Mutex + + fields []mergeFieldInfo + unrecognized field // Offset of XXX_unrecognized +} + +type mergeFieldInfo struct { + field field // Offset of field, guaranteed to be valid + + // isPointer reports whether the value in the field is a pointer. + // This is true for the following situations: + // * Pointer to struct + // * Pointer to basic type (proto2 only) + // * Slice (first value in slice header is a pointer) + // * String (first value in string header is a pointer) + isPointer bool + + // basicWidth reports the width of the field assuming that it is directly + // embedded in the struct (as is the case for basic types in proto3). + // The possible values are: + // 0: invalid + // 1: bool + // 4: int32, uint32, float32 + // 8: int64, uint64, float64 + basicWidth int + + // Where dst and src are pointers to the types being merged. + merge func(dst, src pointer) +} + +var ( + mergeInfoMap = map[reflect.Type]*mergeInfo{} + mergeInfoLock sync.Mutex +) + +func getMergeInfo(t reflect.Type) *mergeInfo { + mergeInfoLock.Lock() + defer mergeInfoLock.Unlock() + mi := mergeInfoMap[t] + if mi == nil { + mi = &mergeInfo{typ: t} + mergeInfoMap[t] = mi + } + return mi +} + +// merge merges src into dst assuming they are both of type *mi.typ. +func (mi *mergeInfo) merge(dst, src pointer) { + if dst.isNil() { + panic("proto: nil destination") + } + if src.isNil() { + return // Nothing to do. + } + + if atomic.LoadInt32(&mi.initialized) == 0 { + mi.computeMergeInfo() + } + + for _, fi := range mi.fields { + sfp := src.offset(fi.field) + + // As an optimization, we can avoid the merge function call cost + // if we know for sure that the source will have no effect + // by checking if it is the zero value. + if unsafeAllowed { + if fi.isPointer && sfp.getPointer().isNil() { // Could be slice or string + continue + } + if fi.basicWidth > 0 { + switch { + case fi.basicWidth == 1 && !*sfp.toBool(): + continue + case fi.basicWidth == 4 && *sfp.toUint32() == 0: + continue + case fi.basicWidth == 8 && *sfp.toUint64() == 0: + continue + } + } + } + + dfp := dst.offset(fi.field) + fi.merge(dfp, sfp) + } + + // TODO: Make this faster? + out := dst.asPointerTo(mi.typ).Elem() + in := src.asPointerTo(mi.typ).Elem() + if emIn, err := extendable(in.Addr().Interface()); err == nil { + emOut, _ := extendable(out.Addr().Interface()) + mIn, muIn := emIn.extensionsRead() + if mIn != nil { + mOut := emOut.extensionsWrite() + muIn.Lock() + mergeExtension(mOut, mIn) + muIn.Unlock() + } + } + + if mi.unrecognized.IsValid() { + if b := *src.offset(mi.unrecognized).toBytes(); len(b) > 0 { + *dst.offset(mi.unrecognized).toBytes() = append([]byte(nil), b...) + } + } +} + +func (mi *mergeInfo) computeMergeInfo() { + mi.lock.Lock() + defer mi.lock.Unlock() + if mi.initialized != 0 { + return + } + t := mi.typ + n := t.NumField() + + props := GetProperties(t) + for i := 0; i < n; i++ { + f := t.Field(i) + if strings.HasPrefix(f.Name, "XXX_") { + continue + } + + mfi := mergeFieldInfo{field: toField(&f)} + tf := f.Type + + // As an optimization, we can avoid the merge function call cost + // if we know for sure that the source will have no effect + // by checking if it is the zero value. + if unsafeAllowed { + switch tf.Kind() { + case reflect.Ptr, reflect.Slice, reflect.String: + // As a special case, we assume slices and strings are pointers + // since we know that the first field in the SliceSlice or + // StringHeader is a data pointer. + mfi.isPointer = true + case reflect.Bool: + mfi.basicWidth = 1 + case reflect.Int32, reflect.Uint32, reflect.Float32: + mfi.basicWidth = 4 + case reflect.Int64, reflect.Uint64, reflect.Float64: + mfi.basicWidth = 8 + } + } + + // Unwrap tf to get at its most basic type. + var isPointer, isSlice bool + if tf.Kind() == reflect.Slice && tf.Elem().Kind() != reflect.Uint8 { + isSlice = true + tf = tf.Elem() + } + if tf.Kind() == reflect.Ptr { + isPointer = true + tf = tf.Elem() + } + if isPointer && isSlice && tf.Kind() != reflect.Struct { + panic("both pointer and slice for basic type in " + tf.Name()) + } + + switch tf.Kind() { + case reflect.Int32: + switch { + case isSlice: // E.g., []int32 + mfi.merge = func(dst, src pointer) { + // NOTE: toInt32Slice is not defined (see pointer_reflect.go). + /* + sfsp := src.toInt32Slice() + if *sfsp != nil { + dfsp := dst.toInt32Slice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []int64{} + } + } + */ + sfs := src.getInt32Slice() + if sfs != nil { + dfs := dst.getInt32Slice() + dfs = append(dfs, sfs...) + if dfs == nil { + dfs = []int32{} + } + dst.setInt32Slice(dfs) + } + } + case isPointer: // E.g., *int32 + mfi.merge = func(dst, src pointer) { + // NOTE: toInt32Ptr is not defined (see pointer_reflect.go). + /* + sfpp := src.toInt32Ptr() + if *sfpp != nil { + dfpp := dst.toInt32Ptr() + if *dfpp == nil { + *dfpp = Int32(**sfpp) + } else { + **dfpp = **sfpp + } + } + */ + sfp := src.getInt32Ptr() + if sfp != nil { + dfp := dst.getInt32Ptr() + if dfp == nil { + dst.setInt32Ptr(*sfp) + } else { + *dfp = *sfp + } + } + } + default: // E.g., int32 + mfi.merge = func(dst, src pointer) { + if v := *src.toInt32(); v != 0 { + *dst.toInt32() = v + } + } + } + case reflect.Int64: + switch { + case isSlice: // E.g., []int64 + mfi.merge = func(dst, src pointer) { + sfsp := src.toInt64Slice() + if *sfsp != nil { + dfsp := dst.toInt64Slice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []int64{} + } + } + } + case isPointer: // E.g., *int64 + mfi.merge = func(dst, src pointer) { + sfpp := src.toInt64Ptr() + if *sfpp != nil { + dfpp := dst.toInt64Ptr() + if *dfpp == nil { + *dfpp = Int64(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., int64 + mfi.merge = func(dst, src pointer) { + if v := *src.toInt64(); v != 0 { + *dst.toInt64() = v + } + } + } + case reflect.Uint32: + switch { + case isSlice: // E.g., []uint32 + mfi.merge = func(dst, src pointer) { + sfsp := src.toUint32Slice() + if *sfsp != nil { + dfsp := dst.toUint32Slice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []uint32{} + } + } + } + case isPointer: // E.g., *uint32 + mfi.merge = func(dst, src pointer) { + sfpp := src.toUint32Ptr() + if *sfpp != nil { + dfpp := dst.toUint32Ptr() + if *dfpp == nil { + *dfpp = Uint32(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., uint32 + mfi.merge = func(dst, src pointer) { + if v := *src.toUint32(); v != 0 { + *dst.toUint32() = v + } + } + } + case reflect.Uint64: + switch { + case isSlice: // E.g., []uint64 + mfi.merge = func(dst, src pointer) { + sfsp := src.toUint64Slice() + if *sfsp != nil { + dfsp := dst.toUint64Slice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []uint64{} + } + } + } + case isPointer: // E.g., *uint64 + mfi.merge = func(dst, src pointer) { + sfpp := src.toUint64Ptr() + if *sfpp != nil { + dfpp := dst.toUint64Ptr() + if *dfpp == nil { + *dfpp = Uint64(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., uint64 + mfi.merge = func(dst, src pointer) { + if v := *src.toUint64(); v != 0 { + *dst.toUint64() = v + } + } + } + case reflect.Float32: + switch { + case isSlice: // E.g., []float32 + mfi.merge = func(dst, src pointer) { + sfsp := src.toFloat32Slice() + if *sfsp != nil { + dfsp := dst.toFloat32Slice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []float32{} + } + } + } + case isPointer: // E.g., *float32 + mfi.merge = func(dst, src pointer) { + sfpp := src.toFloat32Ptr() + if *sfpp != nil { + dfpp := dst.toFloat32Ptr() + if *dfpp == nil { + *dfpp = Float32(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., float32 + mfi.merge = func(dst, src pointer) { + if v := *src.toFloat32(); v != 0 { + *dst.toFloat32() = v + } + } + } + case reflect.Float64: + switch { + case isSlice: // E.g., []float64 + mfi.merge = func(dst, src pointer) { + sfsp := src.toFloat64Slice() + if *sfsp != nil { + dfsp := dst.toFloat64Slice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []float64{} + } + } + } + case isPointer: // E.g., *float64 + mfi.merge = func(dst, src pointer) { + sfpp := src.toFloat64Ptr() + if *sfpp != nil { + dfpp := dst.toFloat64Ptr() + if *dfpp == nil { + *dfpp = Float64(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., float64 + mfi.merge = func(dst, src pointer) { + if v := *src.toFloat64(); v != 0 { + *dst.toFloat64() = v + } + } + } + case reflect.Bool: + switch { + case isSlice: // E.g., []bool + mfi.merge = func(dst, src pointer) { + sfsp := src.toBoolSlice() + if *sfsp != nil { + dfsp := dst.toBoolSlice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []bool{} + } + } + } + case isPointer: // E.g., *bool + mfi.merge = func(dst, src pointer) { + sfpp := src.toBoolPtr() + if *sfpp != nil { + dfpp := dst.toBoolPtr() + if *dfpp == nil { + *dfpp = Bool(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., bool + mfi.merge = func(dst, src pointer) { + if v := *src.toBool(); v { + *dst.toBool() = v + } + } + } + case reflect.String: + switch { + case isSlice: // E.g., []string + mfi.merge = func(dst, src pointer) { + sfsp := src.toStringSlice() + if *sfsp != nil { + dfsp := dst.toStringSlice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []string{} + } + } + } + case isPointer: // E.g., *string + mfi.merge = func(dst, src pointer) { + sfpp := src.toStringPtr() + if *sfpp != nil { + dfpp := dst.toStringPtr() + if *dfpp == nil { + *dfpp = String(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., string + mfi.merge = func(dst, src pointer) { + if v := *src.toString(); v != "" { + *dst.toString() = v + } + } + } + case reflect.Slice: + isProto3 := props.Prop[i].proto3 + switch { + case isPointer: + panic("bad pointer in byte slice case in " + tf.Name()) + case tf.Elem().Kind() != reflect.Uint8: + panic("bad element kind in byte slice case in " + tf.Name()) + case isSlice: // E.g., [][]byte + mfi.merge = func(dst, src pointer) { + sbsp := src.toBytesSlice() + if *sbsp != nil { + dbsp := dst.toBytesSlice() + for _, sb := range *sbsp { + if sb == nil { + *dbsp = append(*dbsp, nil) + } else { + *dbsp = append(*dbsp, append([]byte{}, sb...)) + } + } + if *dbsp == nil { + *dbsp = [][]byte{} + } + } + } + default: // E.g., []byte + mfi.merge = func(dst, src pointer) { + sbp := src.toBytes() + if *sbp != nil { + dbp := dst.toBytes() + if !isProto3 || len(*sbp) > 0 { + *dbp = append([]byte{}, *sbp...) + } + } + } + } + case reflect.Struct: + switch { + case !isPointer: + panic(fmt.Sprintf("message field %s without pointer", tf)) + case isSlice: // E.g., []*pb.T + mi := getMergeInfo(tf) + mfi.merge = func(dst, src pointer) { + sps := src.getPointerSlice() + if sps != nil { + dps := dst.getPointerSlice() + for _, sp := range sps { + var dp pointer + if !sp.isNil() { + dp = valToPointer(reflect.New(tf)) + mi.merge(dp, sp) + } + dps = append(dps, dp) + } + if dps == nil { + dps = []pointer{} + } + dst.setPointerSlice(dps) + } + } + default: // E.g., *pb.T + mi := getMergeInfo(tf) + mfi.merge = func(dst, src pointer) { + sp := src.getPointer() + if !sp.isNil() { + dp := dst.getPointer() + if dp.isNil() { + dp = valToPointer(reflect.New(tf)) + dst.setPointer(dp) + } + mi.merge(dp, sp) + } + } + } + case reflect.Map: + switch { + case isPointer || isSlice: + panic("bad pointer or slice in map case in " + tf.Name()) + default: // E.g., map[K]V + mfi.merge = func(dst, src pointer) { + sm := src.asPointerTo(tf).Elem() + if sm.Len() == 0 { + return + } + dm := dst.asPointerTo(tf).Elem() + if dm.IsNil() { + dm.Set(reflect.MakeMap(tf)) + } + + switch tf.Elem().Kind() { + case reflect.Ptr: // Proto struct (e.g., *T) + for _, key := range sm.MapKeys() { + val := sm.MapIndex(key) + val = reflect.ValueOf(Clone(val.Interface().(Message))) + dm.SetMapIndex(key, val) + } + case reflect.Slice: // E.g. Bytes type (e.g., []byte) + for _, key := range sm.MapKeys() { + val := sm.MapIndex(key) + val = reflect.ValueOf(append([]byte{}, val.Bytes()...)) + dm.SetMapIndex(key, val) + } + default: // Basic type (e.g., string) + for _, key := range sm.MapKeys() { + val := sm.MapIndex(key) + dm.SetMapIndex(key, val) + } + } + } + } + case reflect.Interface: + // Must be oneof field. + switch { + case isPointer || isSlice: + panic("bad pointer or slice in interface case in " + tf.Name()) + default: // E.g., interface{} + // TODO: Make this faster? + mfi.merge = func(dst, src pointer) { + su := src.asPointerTo(tf).Elem() + if !su.IsNil() { + du := dst.asPointerTo(tf).Elem() + typ := su.Elem().Type() + if du.IsNil() || du.Elem().Type() != typ { + du.Set(reflect.New(typ.Elem())) // Initialize interface if empty + } + sv := su.Elem().Elem().Field(0) + if sv.Kind() == reflect.Ptr && sv.IsNil() { + return + } + dv := du.Elem().Elem().Field(0) + if dv.Kind() == reflect.Ptr && dv.IsNil() { + dv.Set(reflect.New(sv.Type().Elem())) // Initialize proto message if empty + } + switch sv.Type().Kind() { + case reflect.Ptr: // Proto struct (e.g., *T) + Merge(dv.Interface().(Message), sv.Interface().(Message)) + case reflect.Slice: // E.g. Bytes type (e.g., []byte) + dv.Set(reflect.ValueOf(append([]byte{}, sv.Bytes()...))) + default: // Basic type (e.g., string) + dv.Set(sv) + } + } + } + } + default: + panic(fmt.Sprintf("merger not found for type:%s", tf)) + } + mi.fields = append(mi.fields, mfi) + } + + mi.unrecognized = invalidField + if f, ok := t.FieldByName("XXX_unrecognized"); ok { + if f.Type != reflect.TypeOf([]byte{}) { + panic("expected XXX_unrecognized to be of type []byte") + } + mi.unrecognized = toField(&f) + } + + atomic.StoreInt32(&mi.initialized, 1) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/proto/table_unmarshal.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/proto/table_unmarshal.go new file mode 100644 index 00000000..ebf1caa5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/proto/table_unmarshal.go @@ -0,0 +1,2051 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "errors" + "fmt" + "io" + "math" + "reflect" + "strconv" + "strings" + "sync" + "sync/atomic" + "unicode/utf8" +) + +// Unmarshal is the entry point from the generated .pb.go files. +// This function is not intended to be used by non-generated code. +// This function is not subject to any compatibility guarantee. +// msg contains a pointer to a protocol buffer struct. +// b is the data to be unmarshaled into the protocol buffer. +// a is a pointer to a place to store cached unmarshal information. +func (a *InternalMessageInfo) Unmarshal(msg Message, b []byte) error { + // Load the unmarshal information for this message type. + // The atomic load ensures memory consistency. + u := atomicLoadUnmarshalInfo(&a.unmarshal) + if u == nil { + // Slow path: find unmarshal info for msg, update a with it. + u = getUnmarshalInfo(reflect.TypeOf(msg).Elem()) + atomicStoreUnmarshalInfo(&a.unmarshal, u) + } + // Then do the unmarshaling. + err := u.unmarshal(toPointer(&msg), b) + return err +} + +type unmarshalInfo struct { + typ reflect.Type // type of the protobuf struct + + // 0 = only typ field is initialized + // 1 = completely initialized + initialized int32 + lock sync.Mutex // prevents double initialization + dense []unmarshalFieldInfo // fields indexed by tag # + sparse map[uint64]unmarshalFieldInfo // fields indexed by tag # + reqFields []string // names of required fields + reqMask uint64 // 1< 0 { + // Read tag and wire type. + // Special case 1 and 2 byte varints. + var x uint64 + if b[0] < 128 { + x = uint64(b[0]) + b = b[1:] + } else if len(b) >= 2 && b[1] < 128 { + x = uint64(b[0]&0x7f) + uint64(b[1])<<7 + b = b[2:] + } else { + var n int + x, n = decodeVarint(b) + if n == 0 { + return io.ErrUnexpectedEOF + } + b = b[n:] + } + tag := x >> 3 + wire := int(x) & 7 + + // Dispatch on the tag to one of the unmarshal* functions below. + var f unmarshalFieldInfo + if tag < uint64(len(u.dense)) { + f = u.dense[tag] + } else { + f = u.sparse[tag] + } + if fn := f.unmarshal; fn != nil { + var err error + b, err = fn(b, m.offset(f.field), wire) + if err == nil { + reqMask |= f.reqMask + continue + } + if r, ok := err.(*RequiredNotSetError); ok { + // Remember this error, but keep parsing. We need to produce + // a full parse even if a required field is missing. + if errLater == nil { + errLater = r + } + reqMask |= f.reqMask + continue + } + if err != errInternalBadWireType { + if err == errInvalidUTF8 { + if errLater == nil { + fullName := revProtoTypes[reflect.PtrTo(u.typ)] + "." + f.name + errLater = &invalidUTF8Error{fullName} + } + continue + } + return err + } + // Fragments with bad wire type are treated as unknown fields. + } + + // Unknown tag. + if !u.unrecognized.IsValid() { + // Don't keep unrecognized data; just skip it. + var err error + b, err = skipField(b, wire) + if err != nil { + return err + } + continue + } + // Keep unrecognized data around. + // maybe in extensions, maybe in the unrecognized field. + z := m.offset(u.unrecognized).toBytes() + var emap map[int32]Extension + var e Extension + for _, r := range u.extensionRanges { + if uint64(r.Start) <= tag && tag <= uint64(r.End) { + if u.extensions.IsValid() { + mp := m.offset(u.extensions).toExtensions() + emap = mp.extensionsWrite() + e = emap[int32(tag)] + z = &e.enc + break + } + if u.oldExtensions.IsValid() { + p := m.offset(u.oldExtensions).toOldExtensions() + emap = *p + if emap == nil { + emap = map[int32]Extension{} + *p = emap + } + e = emap[int32(tag)] + z = &e.enc + break + } + panic("no extensions field available") + } + } + + // Use wire type to skip data. + var err error + b0 := b + b, err = skipField(b, wire) + if err != nil { + return err + } + *z = encodeVarint(*z, tag<<3|uint64(wire)) + *z = append(*z, b0[:len(b0)-len(b)]...) + + if emap != nil { + emap[int32(tag)] = e + } + } + if reqMask != u.reqMask && errLater == nil { + // A required field of this message is missing. + for _, n := range u.reqFields { + if reqMask&1 == 0 { + errLater = &RequiredNotSetError{n} + } + reqMask >>= 1 + } + } + return errLater +} + +// computeUnmarshalInfo fills in u with information for use +// in unmarshaling protocol buffers of type u.typ. +func (u *unmarshalInfo) computeUnmarshalInfo() { + u.lock.Lock() + defer u.lock.Unlock() + if u.initialized != 0 { + return + } + t := u.typ + n := t.NumField() + + // Set up the "not found" value for the unrecognized byte buffer. + // This is the default for proto3. + u.unrecognized = invalidField + u.extensions = invalidField + u.oldExtensions = invalidField + + // List of the generated type and offset for each oneof field. + type oneofField struct { + ityp reflect.Type // interface type of oneof field + field field // offset in containing message + } + var oneofFields []oneofField + + for i := 0; i < n; i++ { + f := t.Field(i) + if f.Name == "XXX_unrecognized" { + // The byte slice used to hold unrecognized input is special. + if f.Type != reflect.TypeOf(([]byte)(nil)) { + panic("bad type for XXX_unrecognized field: " + f.Type.Name()) + } + u.unrecognized = toField(&f) + continue + } + if f.Name == "XXX_InternalExtensions" { + // Ditto here. + if f.Type != reflect.TypeOf(XXX_InternalExtensions{}) { + panic("bad type for XXX_InternalExtensions field: " + f.Type.Name()) + } + u.extensions = toField(&f) + if f.Tag.Get("protobuf_messageset") == "1" { + u.isMessageSet = true + } + continue + } + if f.Name == "XXX_extensions" { + // An older form of the extensions field. + if f.Type != reflect.TypeOf((map[int32]Extension)(nil)) { + panic("bad type for XXX_extensions field: " + f.Type.Name()) + } + u.oldExtensions = toField(&f) + continue + } + if f.Name == "XXX_NoUnkeyedLiteral" || f.Name == "XXX_sizecache" { + continue + } + + oneof := f.Tag.Get("protobuf_oneof") + if oneof != "" { + oneofFields = append(oneofFields, oneofField{f.Type, toField(&f)}) + // The rest of oneof processing happens below. + continue + } + + tags := f.Tag.Get("protobuf") + tagArray := strings.Split(tags, ",") + if len(tagArray) < 2 { + panic("protobuf tag not enough fields in " + t.Name() + "." + f.Name + ": " + tags) + } + tag, err := strconv.Atoi(tagArray[1]) + if err != nil { + panic("protobuf tag field not an integer: " + tagArray[1]) + } + + name := "" + for _, tag := range tagArray[3:] { + if strings.HasPrefix(tag, "name=") { + name = tag[5:] + } + } + + // Extract unmarshaling function from the field (its type and tags). + unmarshal := fieldUnmarshaler(&f) + + // Required field? + var reqMask uint64 + if tagArray[2] == "req" { + bit := len(u.reqFields) + u.reqFields = append(u.reqFields, name) + reqMask = uint64(1) << uint(bit) + // TODO: if we have more than 64 required fields, we end up + // not verifying that all required fields are present. + // Fix this, perhaps using a count of required fields? + } + + // Store the info in the correct slot in the message. + u.setTag(tag, toField(&f), unmarshal, reqMask, name) + } + + // Find any types associated with oneof fields. + // TODO: XXX_OneofFuncs returns more info than we need. Get rid of some of it? + fn := reflect.Zero(reflect.PtrTo(t)).MethodByName("XXX_OneofFuncs") + if fn.IsValid() { + res := fn.Call(nil)[3] // last return value from XXX_OneofFuncs: []interface{} + for i := res.Len() - 1; i >= 0; i-- { + v := res.Index(i) // interface{} + tptr := reflect.ValueOf(v.Interface()).Type() // *Msg_X + typ := tptr.Elem() // Msg_X + + f := typ.Field(0) // oneof implementers have one field + baseUnmarshal := fieldUnmarshaler(&f) + tags := strings.Split(f.Tag.Get("protobuf"), ",") + fieldNum, err := strconv.Atoi(tags[1]) + if err != nil { + panic("protobuf tag field not an integer: " + tags[1]) + } + var name string + for _, tag := range tags { + if strings.HasPrefix(tag, "name=") { + name = strings.TrimPrefix(tag, "name=") + break + } + } + + // Find the oneof field that this struct implements. + // Might take O(n^2) to process all of the oneofs, but who cares. + for _, of := range oneofFields { + if tptr.Implements(of.ityp) { + // We have found the corresponding interface for this struct. + // That lets us know where this struct should be stored + // when we encounter it during unmarshaling. + unmarshal := makeUnmarshalOneof(typ, of.ityp, baseUnmarshal) + u.setTag(fieldNum, of.field, unmarshal, 0, name) + } + } + } + } + + // Get extension ranges, if any. + fn = reflect.Zero(reflect.PtrTo(t)).MethodByName("ExtensionRangeArray") + if fn.IsValid() { + if !u.extensions.IsValid() && !u.oldExtensions.IsValid() { + panic("a message with extensions, but no extensions field in " + t.Name()) + } + u.extensionRanges = fn.Call(nil)[0].Interface().([]ExtensionRange) + } + + // Explicitly disallow tag 0. This will ensure we flag an error + // when decoding a buffer of all zeros. Without this code, we + // would decode and skip an all-zero buffer of even length. + // [0 0] is [tag=0/wiretype=varint varint-encoded-0]. + u.setTag(0, zeroField, func(b []byte, f pointer, w int) ([]byte, error) { + return nil, fmt.Errorf("proto: %s: illegal tag 0 (wire type %d)", t, w) + }, 0, "") + + // Set mask for required field check. + u.reqMask = uint64(1)<= 0 && (tag < 16 || tag < 2*n) { // TODO: what are the right numbers here? + for len(u.dense) <= tag { + u.dense = append(u.dense, unmarshalFieldInfo{}) + } + u.dense[tag] = i + return + } + if u.sparse == nil { + u.sparse = map[uint64]unmarshalFieldInfo{} + } + u.sparse[uint64(tag)] = i +} + +// fieldUnmarshaler returns an unmarshaler for the given field. +func fieldUnmarshaler(f *reflect.StructField) unmarshaler { + if f.Type.Kind() == reflect.Map { + return makeUnmarshalMap(f) + } + return typeUnmarshaler(f.Type, f.Tag.Get("protobuf")) +} + +// typeUnmarshaler returns an unmarshaler for the given field type / field tag pair. +func typeUnmarshaler(t reflect.Type, tags string) unmarshaler { + tagArray := strings.Split(tags, ",") + encoding := tagArray[0] + name := "unknown" + proto3 := false + validateUTF8 := true + for _, tag := range tagArray[3:] { + if strings.HasPrefix(tag, "name=") { + name = tag[5:] + } + if tag == "proto3" { + proto3 = true + } + } + validateUTF8 = validateUTF8 && proto3 + + // Figure out packaging (pointer, slice, or both) + slice := false + pointer := false + if t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 { + slice = true + t = t.Elem() + } + if t.Kind() == reflect.Ptr { + pointer = true + t = t.Elem() + } + + // We'll never have both pointer and slice for basic types. + if pointer && slice && t.Kind() != reflect.Struct { + panic("both pointer and slice for basic type in " + t.Name()) + } + + switch t.Kind() { + case reflect.Bool: + if pointer { + return unmarshalBoolPtr + } + if slice { + return unmarshalBoolSlice + } + return unmarshalBoolValue + case reflect.Int32: + switch encoding { + case "fixed32": + if pointer { + return unmarshalFixedS32Ptr + } + if slice { + return unmarshalFixedS32Slice + } + return unmarshalFixedS32Value + case "varint": + // this could be int32 or enum + if pointer { + return unmarshalInt32Ptr + } + if slice { + return unmarshalInt32Slice + } + return unmarshalInt32Value + case "zigzag32": + if pointer { + return unmarshalSint32Ptr + } + if slice { + return unmarshalSint32Slice + } + return unmarshalSint32Value + } + case reflect.Int64: + switch encoding { + case "fixed64": + if pointer { + return unmarshalFixedS64Ptr + } + if slice { + return unmarshalFixedS64Slice + } + return unmarshalFixedS64Value + case "varint": + if pointer { + return unmarshalInt64Ptr + } + if slice { + return unmarshalInt64Slice + } + return unmarshalInt64Value + case "zigzag64": + if pointer { + return unmarshalSint64Ptr + } + if slice { + return unmarshalSint64Slice + } + return unmarshalSint64Value + } + case reflect.Uint32: + switch encoding { + case "fixed32": + if pointer { + return unmarshalFixed32Ptr + } + if slice { + return unmarshalFixed32Slice + } + return unmarshalFixed32Value + case "varint": + if pointer { + return unmarshalUint32Ptr + } + if slice { + return unmarshalUint32Slice + } + return unmarshalUint32Value + } + case reflect.Uint64: + switch encoding { + case "fixed64": + if pointer { + return unmarshalFixed64Ptr + } + if slice { + return unmarshalFixed64Slice + } + return unmarshalFixed64Value + case "varint": + if pointer { + return unmarshalUint64Ptr + } + if slice { + return unmarshalUint64Slice + } + return unmarshalUint64Value + } + case reflect.Float32: + if pointer { + return unmarshalFloat32Ptr + } + if slice { + return unmarshalFloat32Slice + } + return unmarshalFloat32Value + case reflect.Float64: + if pointer { + return unmarshalFloat64Ptr + } + if slice { + return unmarshalFloat64Slice + } + return unmarshalFloat64Value + case reflect.Map: + panic("map type in typeUnmarshaler in " + t.Name()) + case reflect.Slice: + if pointer { + panic("bad pointer in slice case in " + t.Name()) + } + if slice { + return unmarshalBytesSlice + } + return unmarshalBytesValue + case reflect.String: + if validateUTF8 { + if pointer { + return unmarshalUTF8StringPtr + } + if slice { + return unmarshalUTF8StringSlice + } + return unmarshalUTF8StringValue + } + if pointer { + return unmarshalStringPtr + } + if slice { + return unmarshalStringSlice + } + return unmarshalStringValue + case reflect.Struct: + // message or group field + if !pointer { + panic(fmt.Sprintf("message/group field %s:%s without pointer", t, encoding)) + } + switch encoding { + case "bytes": + if slice { + return makeUnmarshalMessageSlicePtr(getUnmarshalInfo(t), name) + } + return makeUnmarshalMessagePtr(getUnmarshalInfo(t), name) + case "group": + if slice { + return makeUnmarshalGroupSlicePtr(getUnmarshalInfo(t), name) + } + return makeUnmarshalGroupPtr(getUnmarshalInfo(t), name) + } + } + panic(fmt.Sprintf("unmarshaler not found type:%s encoding:%s", t, encoding)) +} + +// Below are all the unmarshalers for individual fields of various types. + +func unmarshalInt64Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x) + *f.toInt64() = v + return b, nil +} + +func unmarshalInt64Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x) + *f.toInt64Ptr() = &v + return b, nil +} + +func unmarshalInt64Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x) + s := f.toInt64Slice() + *s = append(*s, v) + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x) + s := f.toInt64Slice() + *s = append(*s, v) + return b, nil +} + +func unmarshalSint64Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x>>1) ^ int64(x)<<63>>63 + *f.toInt64() = v + return b, nil +} + +func unmarshalSint64Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x>>1) ^ int64(x)<<63>>63 + *f.toInt64Ptr() = &v + return b, nil +} + +func unmarshalSint64Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x>>1) ^ int64(x)<<63>>63 + s := f.toInt64Slice() + *s = append(*s, v) + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x>>1) ^ int64(x)<<63>>63 + s := f.toInt64Slice() + *s = append(*s, v) + return b, nil +} + +func unmarshalUint64Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint64(x) + *f.toUint64() = v + return b, nil +} + +func unmarshalUint64Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint64(x) + *f.toUint64Ptr() = &v + return b, nil +} + +func unmarshalUint64Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint64(x) + s := f.toUint64Slice() + *s = append(*s, v) + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint64(x) + s := f.toUint64Slice() + *s = append(*s, v) + return b, nil +} + +func unmarshalInt32Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x) + *f.toInt32() = v + return b, nil +} + +func unmarshalInt32Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x) + f.setInt32Ptr(v) + return b, nil +} + +func unmarshalInt32Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x) + f.appendInt32Slice(v) + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x) + f.appendInt32Slice(v) + return b, nil +} + +func unmarshalSint32Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x>>1) ^ int32(x)<<31>>31 + *f.toInt32() = v + return b, nil +} + +func unmarshalSint32Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x>>1) ^ int32(x)<<31>>31 + f.setInt32Ptr(v) + return b, nil +} + +func unmarshalSint32Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x>>1) ^ int32(x)<<31>>31 + f.appendInt32Slice(v) + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x>>1) ^ int32(x)<<31>>31 + f.appendInt32Slice(v) + return b, nil +} + +func unmarshalUint32Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint32(x) + *f.toUint32() = v + return b, nil +} + +func unmarshalUint32Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint32(x) + *f.toUint32Ptr() = &v + return b, nil +} + +func unmarshalUint32Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint32(x) + s := f.toUint32Slice() + *s = append(*s, v) + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint32(x) + s := f.toUint32Slice() + *s = append(*s, v) + return b, nil +} + +func unmarshalFixed64Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 + *f.toUint64() = v + return b[8:], nil +} + +func unmarshalFixed64Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 + *f.toUint64Ptr() = &v + return b[8:], nil +} + +func unmarshalFixed64Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 + s := f.toUint64Slice() + *s = append(*s, v) + b = b[8:] + } + return res, nil + } + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 + s := f.toUint64Slice() + *s = append(*s, v) + return b[8:], nil +} + +func unmarshalFixedS64Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := int64(b[0]) | int64(b[1])<<8 | int64(b[2])<<16 | int64(b[3])<<24 | int64(b[4])<<32 | int64(b[5])<<40 | int64(b[6])<<48 | int64(b[7])<<56 + *f.toInt64() = v + return b[8:], nil +} + +func unmarshalFixedS64Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := int64(b[0]) | int64(b[1])<<8 | int64(b[2])<<16 | int64(b[3])<<24 | int64(b[4])<<32 | int64(b[5])<<40 | int64(b[6])<<48 | int64(b[7])<<56 + *f.toInt64Ptr() = &v + return b[8:], nil +} + +func unmarshalFixedS64Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := int64(b[0]) | int64(b[1])<<8 | int64(b[2])<<16 | int64(b[3])<<24 | int64(b[4])<<32 | int64(b[5])<<40 | int64(b[6])<<48 | int64(b[7])<<56 + s := f.toInt64Slice() + *s = append(*s, v) + b = b[8:] + } + return res, nil + } + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := int64(b[0]) | int64(b[1])<<8 | int64(b[2])<<16 | int64(b[3])<<24 | int64(b[4])<<32 | int64(b[5])<<40 | int64(b[6])<<48 | int64(b[7])<<56 + s := f.toInt64Slice() + *s = append(*s, v) + return b[8:], nil +} + +func unmarshalFixed32Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 + *f.toUint32() = v + return b[4:], nil +} + +func unmarshalFixed32Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 + *f.toUint32Ptr() = &v + return b[4:], nil +} + +func unmarshalFixed32Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 + s := f.toUint32Slice() + *s = append(*s, v) + b = b[4:] + } + return res, nil + } + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 + s := f.toUint32Slice() + *s = append(*s, v) + return b[4:], nil +} + +func unmarshalFixedS32Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24 + *f.toInt32() = v + return b[4:], nil +} + +func unmarshalFixedS32Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24 + f.setInt32Ptr(v) + return b[4:], nil +} + +func unmarshalFixedS32Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24 + f.appendInt32Slice(v) + b = b[4:] + } + return res, nil + } + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24 + f.appendInt32Slice(v) + return b[4:], nil +} + +func unmarshalBoolValue(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + // Note: any length varint is allowed, even though any sane + // encoder will use one byte. + // See https://github.com/golang/protobuf/issues/76 + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + // TODO: check if x>1? Tests seem to indicate no. + v := x != 0 + *f.toBool() = v + return b[n:], nil +} + +func unmarshalBoolPtr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + v := x != 0 + *f.toBoolPtr() = &v + return b[n:], nil +} + +func unmarshalBoolSlice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + v := x != 0 + s := f.toBoolSlice() + *s = append(*s, v) + b = b[n:] + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + v := x != 0 + s := f.toBoolSlice() + *s = append(*s, v) + return b[n:], nil +} + +func unmarshalFloat64Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float64frombits(uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56) + *f.toFloat64() = v + return b[8:], nil +} + +func unmarshalFloat64Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float64frombits(uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56) + *f.toFloat64Ptr() = &v + return b[8:], nil +} + +func unmarshalFloat64Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float64frombits(uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56) + s := f.toFloat64Slice() + *s = append(*s, v) + b = b[8:] + } + return res, nil + } + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float64frombits(uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56) + s := f.toFloat64Slice() + *s = append(*s, v) + return b[8:], nil +} + +func unmarshalFloat32Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24) + *f.toFloat32() = v + return b[4:], nil +} + +func unmarshalFloat32Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24) + *f.toFloat32Ptr() = &v + return b[4:], nil +} + +func unmarshalFloat32Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24) + s := f.toFloat32Slice() + *s = append(*s, v) + b = b[4:] + } + return res, nil + } + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24) + s := f.toFloat32Slice() + *s = append(*s, v) + return b[4:], nil +} + +func unmarshalStringValue(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := string(b[:x]) + *f.toString() = v + return b[x:], nil +} + +func unmarshalStringPtr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := string(b[:x]) + *f.toStringPtr() = &v + return b[x:], nil +} + +func unmarshalStringSlice(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := string(b[:x]) + s := f.toStringSlice() + *s = append(*s, v) + return b[x:], nil +} + +func unmarshalUTF8StringValue(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := string(b[:x]) + *f.toString() = v + if !utf8.ValidString(v) { + return b[x:], errInvalidUTF8 + } + return b[x:], nil +} + +func unmarshalUTF8StringPtr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := string(b[:x]) + *f.toStringPtr() = &v + if !utf8.ValidString(v) { + return b[x:], errInvalidUTF8 + } + return b[x:], nil +} + +func unmarshalUTF8StringSlice(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := string(b[:x]) + s := f.toStringSlice() + *s = append(*s, v) + if !utf8.ValidString(v) { + return b[x:], errInvalidUTF8 + } + return b[x:], nil +} + +var emptyBuf [0]byte + +func unmarshalBytesValue(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + // The use of append here is a trick which avoids the zeroing + // that would be required if we used a make/copy pair. + // We append to emptyBuf instead of nil because we want + // a non-nil result even when the length is 0. + v := append(emptyBuf[:], b[:x]...) + *f.toBytes() = v + return b[x:], nil +} + +func unmarshalBytesSlice(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := append(emptyBuf[:], b[:x]...) + s := f.toBytesSlice() + *s = append(*s, v) + return b[x:], nil +} + +func makeUnmarshalMessagePtr(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + // First read the message field to see if something is there. + // The semantics of multiple submessages are weird. Instead of + // the last one winning (as it is for all other fields), multiple + // submessages are merged. + v := f.getPointer() + if v.isNil() { + v = valToPointer(reflect.New(sub.typ)) + f.setPointer(v) + } + err := sub.unmarshal(v, b[:x]) + if err != nil { + if r, ok := err.(*RequiredNotSetError); ok { + r.field = name + "." + r.field + } else { + return nil, err + } + } + return b[x:], err + } +} + +func makeUnmarshalMessageSlicePtr(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := valToPointer(reflect.New(sub.typ)) + err := sub.unmarshal(v, b[:x]) + if err != nil { + if r, ok := err.(*RequiredNotSetError); ok { + r.field = name + "." + r.field + } else { + return nil, err + } + } + f.appendPointer(v) + return b[x:], err + } +} + +func makeUnmarshalGroupPtr(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireStartGroup { + return b, errInternalBadWireType + } + x, y := findEndGroup(b) + if x < 0 { + return nil, io.ErrUnexpectedEOF + } + v := f.getPointer() + if v.isNil() { + v = valToPointer(reflect.New(sub.typ)) + f.setPointer(v) + } + err := sub.unmarshal(v, b[:x]) + if err != nil { + if r, ok := err.(*RequiredNotSetError); ok { + r.field = name + "." + r.field + } else { + return nil, err + } + } + return b[y:], err + } +} + +func makeUnmarshalGroupSlicePtr(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireStartGroup { + return b, errInternalBadWireType + } + x, y := findEndGroup(b) + if x < 0 { + return nil, io.ErrUnexpectedEOF + } + v := valToPointer(reflect.New(sub.typ)) + err := sub.unmarshal(v, b[:x]) + if err != nil { + if r, ok := err.(*RequiredNotSetError); ok { + r.field = name + "." + r.field + } else { + return nil, err + } + } + f.appendPointer(v) + return b[y:], err + } +} + +func makeUnmarshalMap(f *reflect.StructField) unmarshaler { + t := f.Type + kt := t.Key() + vt := t.Elem() + unmarshalKey := typeUnmarshaler(kt, f.Tag.Get("protobuf_key")) + unmarshalVal := typeUnmarshaler(vt, f.Tag.Get("protobuf_val")) + return func(b []byte, f pointer, w int) ([]byte, error) { + // The map entry is a submessage. Figure out how big it is. + if w != WireBytes { + return nil, fmt.Errorf("proto: bad wiretype for map field: got %d want %d", w, WireBytes) + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + r := b[x:] // unused data to return + b = b[:x] // data for map entry + + // Note: we could use #keys * #values ~= 200 functions + // to do map decoding without reflection. Probably not worth it. + // Maps will be somewhat slow. Oh well. + + // Read key and value from data. + var nerr nonFatal + k := reflect.New(kt) + v := reflect.New(vt) + for len(b) > 0 { + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + wire := int(x) & 7 + b = b[n:] + + var err error + switch x >> 3 { + case 1: + b, err = unmarshalKey(b, valToPointer(k), wire) + case 2: + b, err = unmarshalVal(b, valToPointer(v), wire) + default: + err = errInternalBadWireType // skip unknown tag + } + + if nerr.Merge(err) { + continue + } + if err != errInternalBadWireType { + return nil, err + } + + // Skip past unknown fields. + b, err = skipField(b, wire) + if err != nil { + return nil, err + } + } + + // Get map, allocate if needed. + m := f.asPointerTo(t).Elem() // an addressable map[K]T + if m.IsNil() { + m.Set(reflect.MakeMap(t)) + } + + // Insert into map. + m.SetMapIndex(k.Elem(), v.Elem()) + + return r, nerr.E + } +} + +// makeUnmarshalOneof makes an unmarshaler for oneof fields. +// for: +// message Msg { +// oneof F { +// int64 X = 1; +// float64 Y = 2; +// } +// } +// typ is the type of the concrete entry for a oneof case (e.g. Msg_X). +// ityp is the interface type of the oneof field (e.g. isMsg_F). +// unmarshal is the unmarshaler for the base type of the oneof case (e.g. int64). +// Note that this function will be called once for each case in the oneof. +func makeUnmarshalOneof(typ, ityp reflect.Type, unmarshal unmarshaler) unmarshaler { + sf := typ.Field(0) + field0 := toField(&sf) + return func(b []byte, f pointer, w int) ([]byte, error) { + // Allocate holder for value. + v := reflect.New(typ) + + // Unmarshal data into holder. + // We unmarshal into the first field of the holder object. + var err error + var nerr nonFatal + b, err = unmarshal(b, valToPointer(v).offset(field0), w) + if !nerr.Merge(err) { + return nil, err + } + + // Write pointer to holder into target field. + f.asPointerTo(ityp).Elem().Set(v) + + return b, nerr.E + } +} + +// Error used by decode internally. +var errInternalBadWireType = errors.New("proto: internal error: bad wiretype") + +// skipField skips past a field of type wire and returns the remaining bytes. +func skipField(b []byte, wire int) ([]byte, error) { + switch wire { + case WireVarint: + _, k := decodeVarint(b) + if k == 0 { + return b, io.ErrUnexpectedEOF + } + b = b[k:] + case WireFixed32: + if len(b) < 4 { + return b, io.ErrUnexpectedEOF + } + b = b[4:] + case WireFixed64: + if len(b) < 8 { + return b, io.ErrUnexpectedEOF + } + b = b[8:] + case WireBytes: + m, k := decodeVarint(b) + if k == 0 || uint64(len(b)-k) < m { + return b, io.ErrUnexpectedEOF + } + b = b[uint64(k)+m:] + case WireStartGroup: + _, i := findEndGroup(b) + if i == -1 { + return b, io.ErrUnexpectedEOF + } + b = b[i:] + default: + return b, fmt.Errorf("proto: can't skip unknown wire type %d", wire) + } + return b, nil +} + +// findEndGroup finds the index of the next EndGroup tag. +// Groups may be nested, so the "next" EndGroup tag is the first +// unpaired EndGroup. +// findEndGroup returns the indexes of the start and end of the EndGroup tag. +// Returns (-1,-1) if it can't find one. +func findEndGroup(b []byte) (int, int) { + depth := 1 + i := 0 + for { + x, n := decodeVarint(b[i:]) + if n == 0 { + return -1, -1 + } + j := i + i += n + switch x & 7 { + case WireVarint: + _, k := decodeVarint(b[i:]) + if k == 0 { + return -1, -1 + } + i += k + case WireFixed32: + if len(b)-4 < i { + return -1, -1 + } + i += 4 + case WireFixed64: + if len(b)-8 < i { + return -1, -1 + } + i += 8 + case WireBytes: + m, k := decodeVarint(b[i:]) + if k == 0 { + return -1, -1 + } + i += k + if uint64(len(b)-i) < m { + return -1, -1 + } + i += int(m) + case WireStartGroup: + depth++ + case WireEndGroup: + depth-- + if depth == 0 { + return j, i + } + default: + return -1, -1 + } + } +} + +// encodeVarint appends a varint-encoded integer to b and returns the result. +func encodeVarint(b []byte, x uint64) []byte { + for x >= 1<<7 { + b = append(b, byte(x&0x7f|0x80)) + x >>= 7 + } + return append(b, byte(x)) +} + +// decodeVarint reads a varint-encoded integer from b. +// Returns the decoded integer and the number of bytes read. +// If there is an error, it returns 0,0. +func decodeVarint(b []byte) (uint64, int) { + var x, y uint64 + if len(b) <= 0 { + goto bad + } + x = uint64(b[0]) + if x < 0x80 { + return x, 1 + } + x -= 0x80 + + if len(b) <= 1 { + goto bad + } + y = uint64(b[1]) + x += y << 7 + if y < 0x80 { + return x, 2 + } + x -= 0x80 << 7 + + if len(b) <= 2 { + goto bad + } + y = uint64(b[2]) + x += y << 14 + if y < 0x80 { + return x, 3 + } + x -= 0x80 << 14 + + if len(b) <= 3 { + goto bad + } + y = uint64(b[3]) + x += y << 21 + if y < 0x80 { + return x, 4 + } + x -= 0x80 << 21 + + if len(b) <= 4 { + goto bad + } + y = uint64(b[4]) + x += y << 28 + if y < 0x80 { + return x, 5 + } + x -= 0x80 << 28 + + if len(b) <= 5 { + goto bad + } + y = uint64(b[5]) + x += y << 35 + if y < 0x80 { + return x, 6 + } + x -= 0x80 << 35 + + if len(b) <= 6 { + goto bad + } + y = uint64(b[6]) + x += y << 42 + if y < 0x80 { + return x, 7 + } + x -= 0x80 << 42 + + if len(b) <= 7 { + goto bad + } + y = uint64(b[7]) + x += y << 49 + if y < 0x80 { + return x, 8 + } + x -= 0x80 << 49 + + if len(b) <= 8 { + goto bad + } + y = uint64(b[8]) + x += y << 56 + if y < 0x80 { + return x, 9 + } + x -= 0x80 << 56 + + if len(b) <= 9 { + goto bad + } + y = uint64(b[9]) + x += y << 63 + if y < 2 { + return x, 10 + } + +bad: + return 0, 0 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/proto/text.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/proto/text.go new file mode 100644 index 00000000..1aaee725 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/proto/text.go @@ -0,0 +1,843 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +// Functions for writing the text protocol buffer format. + +import ( + "bufio" + "bytes" + "encoding" + "errors" + "fmt" + "io" + "log" + "math" + "reflect" + "sort" + "strings" +) + +var ( + newline = []byte("\n") + spaces = []byte(" ") + endBraceNewline = []byte("}\n") + backslashN = []byte{'\\', 'n'} + backslashR = []byte{'\\', 'r'} + backslashT = []byte{'\\', 't'} + backslashDQ = []byte{'\\', '"'} + backslashBS = []byte{'\\', '\\'} + posInf = []byte("inf") + negInf = []byte("-inf") + nan = []byte("nan") +) + +type writer interface { + io.Writer + WriteByte(byte) error +} + +// textWriter is an io.Writer that tracks its indentation level. +type textWriter struct { + ind int + complete bool // if the current position is a complete line + compact bool // whether to write out as a one-liner + w writer +} + +func (w *textWriter) WriteString(s string) (n int, err error) { + if !strings.Contains(s, "\n") { + if !w.compact && w.complete { + w.writeIndent() + } + w.complete = false + return io.WriteString(w.w, s) + } + // WriteString is typically called without newlines, so this + // codepath and its copy are rare. We copy to avoid + // duplicating all of Write's logic here. + return w.Write([]byte(s)) +} + +func (w *textWriter) Write(p []byte) (n int, err error) { + newlines := bytes.Count(p, newline) + if newlines == 0 { + if !w.compact && w.complete { + w.writeIndent() + } + n, err = w.w.Write(p) + w.complete = false + return n, err + } + + frags := bytes.SplitN(p, newline, newlines+1) + if w.compact { + for i, frag := range frags { + if i > 0 { + if err := w.w.WriteByte(' '); err != nil { + return n, err + } + n++ + } + nn, err := w.w.Write(frag) + n += nn + if err != nil { + return n, err + } + } + return n, nil + } + + for i, frag := range frags { + if w.complete { + w.writeIndent() + } + nn, err := w.w.Write(frag) + n += nn + if err != nil { + return n, err + } + if i+1 < len(frags) { + if err := w.w.WriteByte('\n'); err != nil { + return n, err + } + n++ + } + } + w.complete = len(frags[len(frags)-1]) == 0 + return n, nil +} + +func (w *textWriter) WriteByte(c byte) error { + if w.compact && c == '\n' { + c = ' ' + } + if !w.compact && w.complete { + w.writeIndent() + } + err := w.w.WriteByte(c) + w.complete = c == '\n' + return err +} + +func (w *textWriter) indent() { w.ind++ } + +func (w *textWriter) unindent() { + if w.ind == 0 { + log.Print("proto: textWriter unindented too far") + return + } + w.ind-- +} + +func writeName(w *textWriter, props *Properties) error { + if _, err := w.WriteString(props.OrigName); err != nil { + return err + } + if props.Wire != "group" { + return w.WriteByte(':') + } + return nil +} + +func requiresQuotes(u string) bool { + // When type URL contains any characters except [0-9A-Za-z./\-]*, it must be quoted. + for _, ch := range u { + switch { + case ch == '.' || ch == '/' || ch == '_': + continue + case '0' <= ch && ch <= '9': + continue + case 'A' <= ch && ch <= 'Z': + continue + case 'a' <= ch && ch <= 'z': + continue + default: + return true + } + } + return false +} + +// isAny reports whether sv is a google.protobuf.Any message +func isAny(sv reflect.Value) bool { + type wkt interface { + XXX_WellKnownType() string + } + t, ok := sv.Addr().Interface().(wkt) + return ok && t.XXX_WellKnownType() == "Any" +} + +// writeProto3Any writes an expanded google.protobuf.Any message. +// +// It returns (false, nil) if sv value can't be unmarshaled (e.g. because +// required messages are not linked in). +// +// It returns (true, error) when sv was written in expanded format or an error +// was encountered. +func (tm *TextMarshaler) writeProto3Any(w *textWriter, sv reflect.Value) (bool, error) { + turl := sv.FieldByName("TypeUrl") + val := sv.FieldByName("Value") + if !turl.IsValid() || !val.IsValid() { + return true, errors.New("proto: invalid google.protobuf.Any message") + } + + b, ok := val.Interface().([]byte) + if !ok { + return true, errors.New("proto: invalid google.protobuf.Any message") + } + + parts := strings.Split(turl.String(), "/") + mt := MessageType(parts[len(parts)-1]) + if mt == nil { + return false, nil + } + m := reflect.New(mt.Elem()) + if err := Unmarshal(b, m.Interface().(Message)); err != nil { + return false, nil + } + w.Write([]byte("[")) + u := turl.String() + if requiresQuotes(u) { + writeString(w, u) + } else { + w.Write([]byte(u)) + } + if w.compact { + w.Write([]byte("]:<")) + } else { + w.Write([]byte("]: <\n")) + w.ind++ + } + if err := tm.writeStruct(w, m.Elem()); err != nil { + return true, err + } + if w.compact { + w.Write([]byte("> ")) + } else { + w.ind-- + w.Write([]byte(">\n")) + } + return true, nil +} + +func (tm *TextMarshaler) writeStruct(w *textWriter, sv reflect.Value) error { + if tm.ExpandAny && isAny(sv) { + if canExpand, err := tm.writeProto3Any(w, sv); canExpand { + return err + } + } + st := sv.Type() + sprops := GetProperties(st) + for i := 0; i < sv.NumField(); i++ { + fv := sv.Field(i) + props := sprops.Prop[i] + name := st.Field(i).Name + + if name == "XXX_NoUnkeyedLiteral" { + continue + } + + if strings.HasPrefix(name, "XXX_") { + // There are two XXX_ fields: + // XXX_unrecognized []byte + // XXX_extensions map[int32]proto.Extension + // The first is handled here; + // the second is handled at the bottom of this function. + if name == "XXX_unrecognized" && !fv.IsNil() { + if err := writeUnknownStruct(w, fv.Interface().([]byte)); err != nil { + return err + } + } + continue + } + if fv.Kind() == reflect.Ptr && fv.IsNil() { + // Field not filled in. This could be an optional field or + // a required field that wasn't filled in. Either way, there + // isn't anything we can show for it. + continue + } + if fv.Kind() == reflect.Slice && fv.IsNil() { + // Repeated field that is empty, or a bytes field that is unused. + continue + } + + if props.Repeated && fv.Kind() == reflect.Slice { + // Repeated field. + for j := 0; j < fv.Len(); j++ { + if err := writeName(w, props); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + v := fv.Index(j) + if v.Kind() == reflect.Ptr && v.IsNil() { + // A nil message in a repeated field is not valid, + // but we can handle that more gracefully than panicking. + if _, err := w.Write([]byte("\n")); err != nil { + return err + } + continue + } + if err := tm.writeAny(w, v, props); err != nil { + return err + } + if err := w.WriteByte('\n'); err != nil { + return err + } + } + continue + } + if fv.Kind() == reflect.Map { + // Map fields are rendered as a repeated struct with key/value fields. + keys := fv.MapKeys() + sort.Sort(mapKeys(keys)) + for _, key := range keys { + val := fv.MapIndex(key) + if err := writeName(w, props); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + // open struct + if err := w.WriteByte('<'); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte('\n'); err != nil { + return err + } + } + w.indent() + // key + if _, err := w.WriteString("key:"); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + if err := tm.writeAny(w, key, props.MapKeyProp); err != nil { + return err + } + if err := w.WriteByte('\n'); err != nil { + return err + } + // nil values aren't legal, but we can avoid panicking because of them. + if val.Kind() != reflect.Ptr || !val.IsNil() { + // value + if _, err := w.WriteString("value:"); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + if err := tm.writeAny(w, val, props.MapValProp); err != nil { + return err + } + if err := w.WriteByte('\n'); err != nil { + return err + } + } + // close struct + w.unindent() + if err := w.WriteByte('>'); err != nil { + return err + } + if err := w.WriteByte('\n'); err != nil { + return err + } + } + continue + } + if props.proto3 && fv.Kind() == reflect.Slice && fv.Len() == 0 { + // empty bytes field + continue + } + if fv.Kind() != reflect.Ptr && fv.Kind() != reflect.Slice { + // proto3 non-repeated scalar field; skip if zero value + if isProto3Zero(fv) { + continue + } + } + + if fv.Kind() == reflect.Interface { + // Check if it is a oneof. + if st.Field(i).Tag.Get("protobuf_oneof") != "" { + // fv is nil, or holds a pointer to generated struct. + // That generated struct has exactly one field, + // which has a protobuf struct tag. + if fv.IsNil() { + continue + } + inner := fv.Elem().Elem() // interface -> *T -> T + tag := inner.Type().Field(0).Tag.Get("protobuf") + props = new(Properties) // Overwrite the outer props var, but not its pointee. + props.Parse(tag) + // Write the value in the oneof, not the oneof itself. + fv = inner.Field(0) + + // Special case to cope with malformed messages gracefully: + // If the value in the oneof is a nil pointer, don't panic + // in writeAny. + if fv.Kind() == reflect.Ptr && fv.IsNil() { + // Use errors.New so writeAny won't render quotes. + msg := errors.New("/* nil */") + fv = reflect.ValueOf(&msg).Elem() + } + } + } + + if err := writeName(w, props); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + + // Enums have a String method, so writeAny will work fine. + if err := tm.writeAny(w, fv, props); err != nil { + return err + } + + if err := w.WriteByte('\n'); err != nil { + return err + } + } + + // Extensions (the XXX_extensions field). + pv := sv.Addr() + if _, err := extendable(pv.Interface()); err == nil { + if err := tm.writeExtensions(w, pv); err != nil { + return err + } + } + + return nil +} + +// writeAny writes an arbitrary field. +func (tm *TextMarshaler) writeAny(w *textWriter, v reflect.Value, props *Properties) error { + v = reflect.Indirect(v) + + // Floats have special cases. + if v.Kind() == reflect.Float32 || v.Kind() == reflect.Float64 { + x := v.Float() + var b []byte + switch { + case math.IsInf(x, 1): + b = posInf + case math.IsInf(x, -1): + b = negInf + case math.IsNaN(x): + b = nan + } + if b != nil { + _, err := w.Write(b) + return err + } + // Other values are handled below. + } + + // We don't attempt to serialise every possible value type; only those + // that can occur in protocol buffers. + switch v.Kind() { + case reflect.Slice: + // Should only be a []byte; repeated fields are handled in writeStruct. + if err := writeString(w, string(v.Bytes())); err != nil { + return err + } + case reflect.String: + if err := writeString(w, v.String()); err != nil { + return err + } + case reflect.Struct: + // Required/optional group/message. + var bra, ket byte = '<', '>' + if props != nil && props.Wire == "group" { + bra, ket = '{', '}' + } + if err := w.WriteByte(bra); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte('\n'); err != nil { + return err + } + } + w.indent() + if v.CanAddr() { + // Calling v.Interface on a struct causes the reflect package to + // copy the entire struct. This is racy with the new Marshaler + // since we atomically update the XXX_sizecache. + // + // Thus, we retrieve a pointer to the struct if possible to avoid + // a race since v.Interface on the pointer doesn't copy the struct. + // + // If v is not addressable, then we are not worried about a race + // since it implies that the binary Marshaler cannot possibly be + // mutating this value. + v = v.Addr() + } + if etm, ok := v.Interface().(encoding.TextMarshaler); ok { + text, err := etm.MarshalText() + if err != nil { + return err + } + if _, err = w.Write(text); err != nil { + return err + } + } else { + if v.Kind() == reflect.Ptr { + v = v.Elem() + } + if err := tm.writeStruct(w, v); err != nil { + return err + } + } + w.unindent() + if err := w.WriteByte(ket); err != nil { + return err + } + default: + _, err := fmt.Fprint(w, v.Interface()) + return err + } + return nil +} + +// equivalent to C's isprint. +func isprint(c byte) bool { + return c >= 0x20 && c < 0x7f +} + +// writeString writes a string in the protocol buffer text format. +// It is similar to strconv.Quote except we don't use Go escape sequences, +// we treat the string as a byte sequence, and we use octal escapes. +// These differences are to maintain interoperability with the other +// languages' implementations of the text format. +func writeString(w *textWriter, s string) error { + // use WriteByte here to get any needed indent + if err := w.WriteByte('"'); err != nil { + return err + } + // Loop over the bytes, not the runes. + for i := 0; i < len(s); i++ { + var err error + // Divergence from C++: we don't escape apostrophes. + // There's no need to escape them, and the C++ parser + // copes with a naked apostrophe. + switch c := s[i]; c { + case '\n': + _, err = w.w.Write(backslashN) + case '\r': + _, err = w.w.Write(backslashR) + case '\t': + _, err = w.w.Write(backslashT) + case '"': + _, err = w.w.Write(backslashDQ) + case '\\': + _, err = w.w.Write(backslashBS) + default: + if isprint(c) { + err = w.w.WriteByte(c) + } else { + _, err = fmt.Fprintf(w.w, "\\%03o", c) + } + } + if err != nil { + return err + } + } + return w.WriteByte('"') +} + +func writeUnknownStruct(w *textWriter, data []byte) (err error) { + if !w.compact { + if _, err := fmt.Fprintf(w, "/* %d unknown bytes */\n", len(data)); err != nil { + return err + } + } + b := NewBuffer(data) + for b.index < len(b.buf) { + x, err := b.DecodeVarint() + if err != nil { + _, err := fmt.Fprintf(w, "/* %v */\n", err) + return err + } + wire, tag := x&7, x>>3 + if wire == WireEndGroup { + w.unindent() + if _, err := w.Write(endBraceNewline); err != nil { + return err + } + continue + } + if _, err := fmt.Fprint(w, tag); err != nil { + return err + } + if wire != WireStartGroup { + if err := w.WriteByte(':'); err != nil { + return err + } + } + if !w.compact || wire == WireStartGroup { + if err := w.WriteByte(' '); err != nil { + return err + } + } + switch wire { + case WireBytes: + buf, e := b.DecodeRawBytes(false) + if e == nil { + _, err = fmt.Fprintf(w, "%q", buf) + } else { + _, err = fmt.Fprintf(w, "/* %v */", e) + } + case WireFixed32: + x, err = b.DecodeFixed32() + err = writeUnknownInt(w, x, err) + case WireFixed64: + x, err = b.DecodeFixed64() + err = writeUnknownInt(w, x, err) + case WireStartGroup: + err = w.WriteByte('{') + w.indent() + case WireVarint: + x, err = b.DecodeVarint() + err = writeUnknownInt(w, x, err) + default: + _, err = fmt.Fprintf(w, "/* unknown wire type %d */", wire) + } + if err != nil { + return err + } + if err = w.WriteByte('\n'); err != nil { + return err + } + } + return nil +} + +func writeUnknownInt(w *textWriter, x uint64, err error) error { + if err == nil { + _, err = fmt.Fprint(w, x) + } else { + _, err = fmt.Fprintf(w, "/* %v */", err) + } + return err +} + +type int32Slice []int32 + +func (s int32Slice) Len() int { return len(s) } +func (s int32Slice) Less(i, j int) bool { return s[i] < s[j] } +func (s int32Slice) Swap(i, j int) { s[i], s[j] = s[j], s[i] } + +// writeExtensions writes all the extensions in pv. +// pv is assumed to be a pointer to a protocol message struct that is extendable. +func (tm *TextMarshaler) writeExtensions(w *textWriter, pv reflect.Value) error { + emap := extensionMaps[pv.Type().Elem()] + ep, _ := extendable(pv.Interface()) + + // Order the extensions by ID. + // This isn't strictly necessary, but it will give us + // canonical output, which will also make testing easier. + m, mu := ep.extensionsRead() + if m == nil { + return nil + } + mu.Lock() + ids := make([]int32, 0, len(m)) + for id := range m { + ids = append(ids, id) + } + sort.Sort(int32Slice(ids)) + mu.Unlock() + + for _, extNum := range ids { + ext := m[extNum] + var desc *ExtensionDesc + if emap != nil { + desc = emap[extNum] + } + if desc == nil { + // Unknown extension. + if err := writeUnknownStruct(w, ext.enc); err != nil { + return err + } + continue + } + + pb, err := GetExtension(ep, desc) + if err != nil { + return fmt.Errorf("failed getting extension: %v", err) + } + + // Repeated extensions will appear as a slice. + if !desc.repeated() { + if err := tm.writeExtension(w, desc.Name, pb); err != nil { + return err + } + } else { + v := reflect.ValueOf(pb) + for i := 0; i < v.Len(); i++ { + if err := tm.writeExtension(w, desc.Name, v.Index(i).Interface()); err != nil { + return err + } + } + } + } + return nil +} + +func (tm *TextMarshaler) writeExtension(w *textWriter, name string, pb interface{}) error { + if _, err := fmt.Fprintf(w, "[%s]:", name); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte(' '); err != nil { + return err + } + } + if err := tm.writeAny(w, reflect.ValueOf(pb), nil); err != nil { + return err + } + if err := w.WriteByte('\n'); err != nil { + return err + } + return nil +} + +func (w *textWriter) writeIndent() { + if !w.complete { + return + } + remain := w.ind * 2 + for remain > 0 { + n := remain + if n > len(spaces) { + n = len(spaces) + } + w.w.Write(spaces[:n]) + remain -= n + } + w.complete = false +} + +// TextMarshaler is a configurable text format marshaler. +type TextMarshaler struct { + Compact bool // use compact text format (one line). + ExpandAny bool // expand google.protobuf.Any messages of known types +} + +// Marshal writes a given protocol buffer in text format. +// The only errors returned are from w. +func (tm *TextMarshaler) Marshal(w io.Writer, pb Message) error { + val := reflect.ValueOf(pb) + if pb == nil || val.IsNil() { + w.Write([]byte("")) + return nil + } + var bw *bufio.Writer + ww, ok := w.(writer) + if !ok { + bw = bufio.NewWriter(w) + ww = bw + } + aw := &textWriter{ + w: ww, + complete: true, + compact: tm.Compact, + } + + if etm, ok := pb.(encoding.TextMarshaler); ok { + text, err := etm.MarshalText() + if err != nil { + return err + } + if _, err = aw.Write(text); err != nil { + return err + } + if bw != nil { + return bw.Flush() + } + return nil + } + // Dereference the received pointer so we don't have outer < and >. + v := reflect.Indirect(val) + if err := tm.writeStruct(aw, v); err != nil { + return err + } + if bw != nil { + return bw.Flush() + } + return nil +} + +// Text is the same as Marshal, but returns the string directly. +func (tm *TextMarshaler) Text(pb Message) string { + var buf bytes.Buffer + tm.Marshal(&buf, pb) + return buf.String() +} + +var ( + defaultTextMarshaler = TextMarshaler{} + compactTextMarshaler = TextMarshaler{Compact: true} +) + +// TODO: consider removing some of the Marshal functions below. + +// MarshalText writes a given protocol buffer in text format. +// The only errors returned are from w. +func MarshalText(w io.Writer, pb Message) error { return defaultTextMarshaler.Marshal(w, pb) } + +// MarshalTextString is the same as MarshalText, but returns the string directly. +func MarshalTextString(pb Message) string { return defaultTextMarshaler.Text(pb) } + +// CompactText writes a given protocol buffer in compact text format (one line). +func CompactText(w io.Writer, pb Message) error { return compactTextMarshaler.Marshal(w, pb) } + +// CompactTextString is the same as CompactText, but returns the string directly. +func CompactTextString(pb Message) string { return compactTextMarshaler.Text(pb) } diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/proto/text_parser.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/proto/text_parser.go new file mode 100644 index 00000000..bb55a3af --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/golang/protobuf/proto/text_parser.go @@ -0,0 +1,880 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2010 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +// Functions for parsing the Text protocol buffer format. +// TODO: message sets. + +import ( + "encoding" + "errors" + "fmt" + "reflect" + "strconv" + "strings" + "unicode/utf8" +) + +// Error string emitted when deserializing Any and fields are already set +const anyRepeatedlyUnpacked = "Any message unpacked multiple times, or %q already set" + +type ParseError struct { + Message string + Line int // 1-based line number + Offset int // 0-based byte offset from start of input +} + +func (p *ParseError) Error() string { + if p.Line == 1 { + // show offset only for first line + return fmt.Sprintf("line 1.%d: %v", p.Offset, p.Message) + } + return fmt.Sprintf("line %d: %v", p.Line, p.Message) +} + +type token struct { + value string + err *ParseError + line int // line number + offset int // byte number from start of input, not start of line + unquoted string // the unquoted version of value, if it was a quoted string +} + +func (t *token) String() string { + if t.err == nil { + return fmt.Sprintf("%q (line=%d, offset=%d)", t.value, t.line, t.offset) + } + return fmt.Sprintf("parse error: %v", t.err) +} + +type textParser struct { + s string // remaining input + done bool // whether the parsing is finished (success or error) + backed bool // whether back() was called + offset, line int + cur token +} + +func newTextParser(s string) *textParser { + p := new(textParser) + p.s = s + p.line = 1 + p.cur.line = 1 + return p +} + +func (p *textParser) errorf(format string, a ...interface{}) *ParseError { + pe := &ParseError{fmt.Sprintf(format, a...), p.cur.line, p.cur.offset} + p.cur.err = pe + p.done = true + return pe +} + +// Numbers and identifiers are matched by [-+._A-Za-z0-9] +func isIdentOrNumberChar(c byte) bool { + switch { + case 'A' <= c && c <= 'Z', 'a' <= c && c <= 'z': + return true + case '0' <= c && c <= '9': + return true + } + switch c { + case '-', '+', '.', '_': + return true + } + return false +} + +func isWhitespace(c byte) bool { + switch c { + case ' ', '\t', '\n', '\r': + return true + } + return false +} + +func isQuote(c byte) bool { + switch c { + case '"', '\'': + return true + } + return false +} + +func (p *textParser) skipWhitespace() { + i := 0 + for i < len(p.s) && (isWhitespace(p.s[i]) || p.s[i] == '#') { + if p.s[i] == '#' { + // comment; skip to end of line or input + for i < len(p.s) && p.s[i] != '\n' { + i++ + } + if i == len(p.s) { + break + } + } + if p.s[i] == '\n' { + p.line++ + } + i++ + } + p.offset += i + p.s = p.s[i:len(p.s)] + if len(p.s) == 0 { + p.done = true + } +} + +func (p *textParser) advance() { + // Skip whitespace + p.skipWhitespace() + if p.done { + return + } + + // Start of non-whitespace + p.cur.err = nil + p.cur.offset, p.cur.line = p.offset, p.line + p.cur.unquoted = "" + switch p.s[0] { + case '<', '>', '{', '}', ':', '[', ']', ';', ',', '/': + // Single symbol + p.cur.value, p.s = p.s[0:1], p.s[1:len(p.s)] + case '"', '\'': + // Quoted string + i := 1 + for i < len(p.s) && p.s[i] != p.s[0] && p.s[i] != '\n' { + if p.s[i] == '\\' && i+1 < len(p.s) { + // skip escaped char + i++ + } + i++ + } + if i >= len(p.s) || p.s[i] != p.s[0] { + p.errorf("unmatched quote") + return + } + unq, err := unquoteC(p.s[1:i], rune(p.s[0])) + if err != nil { + p.errorf("invalid quoted string %s: %v", p.s[0:i+1], err) + return + } + p.cur.value, p.s = p.s[0:i+1], p.s[i+1:len(p.s)] + p.cur.unquoted = unq + default: + i := 0 + for i < len(p.s) && isIdentOrNumberChar(p.s[i]) { + i++ + } + if i == 0 { + p.errorf("unexpected byte %#x", p.s[0]) + return + } + p.cur.value, p.s = p.s[0:i], p.s[i:len(p.s)] + } + p.offset += len(p.cur.value) +} + +var ( + errBadUTF8 = errors.New("proto: bad UTF-8") +) + +func unquoteC(s string, quote rune) (string, error) { + // This is based on C++'s tokenizer.cc. + // Despite its name, this is *not* parsing C syntax. + // For instance, "\0" is an invalid quoted string. + + // Avoid allocation in trivial cases. + simple := true + for _, r := range s { + if r == '\\' || r == quote { + simple = false + break + } + } + if simple { + return s, nil + } + + buf := make([]byte, 0, 3*len(s)/2) + for len(s) > 0 { + r, n := utf8.DecodeRuneInString(s) + if r == utf8.RuneError && n == 1 { + return "", errBadUTF8 + } + s = s[n:] + if r != '\\' { + if r < utf8.RuneSelf { + buf = append(buf, byte(r)) + } else { + buf = append(buf, string(r)...) + } + continue + } + + ch, tail, err := unescape(s) + if err != nil { + return "", err + } + buf = append(buf, ch...) + s = tail + } + return string(buf), nil +} + +func unescape(s string) (ch string, tail string, err error) { + r, n := utf8.DecodeRuneInString(s) + if r == utf8.RuneError && n == 1 { + return "", "", errBadUTF8 + } + s = s[n:] + switch r { + case 'a': + return "\a", s, nil + case 'b': + return "\b", s, nil + case 'f': + return "\f", s, nil + case 'n': + return "\n", s, nil + case 'r': + return "\r", s, nil + case 't': + return "\t", s, nil + case 'v': + return "\v", s, nil + case '?': + return "?", s, nil // trigraph workaround + case '\'', '"', '\\': + return string(r), s, nil + case '0', '1', '2', '3', '4', '5', '6', '7': + if len(s) < 2 { + return "", "", fmt.Errorf(`\%c requires 2 following digits`, r) + } + ss := string(r) + s[:2] + s = s[2:] + i, err := strconv.ParseUint(ss, 8, 8) + if err != nil { + return "", "", fmt.Errorf(`\%s contains non-octal digits`, ss) + } + return string([]byte{byte(i)}), s, nil + case 'x', 'X', 'u', 'U': + var n int + switch r { + case 'x', 'X': + n = 2 + case 'u': + n = 4 + case 'U': + n = 8 + } + if len(s) < n { + return "", "", fmt.Errorf(`\%c requires %d following digits`, r, n) + } + ss := s[:n] + s = s[n:] + i, err := strconv.ParseUint(ss, 16, 64) + if err != nil { + return "", "", fmt.Errorf(`\%c%s contains non-hexadecimal digits`, r, ss) + } + if r == 'x' || r == 'X' { + return string([]byte{byte(i)}), s, nil + } + if i > utf8.MaxRune { + return "", "", fmt.Errorf(`\%c%s is not a valid Unicode code point`, r, ss) + } + return string(i), s, nil + } + return "", "", fmt.Errorf(`unknown escape \%c`, r) +} + +// Back off the parser by one token. Can only be done between calls to next(). +// It makes the next advance() a no-op. +func (p *textParser) back() { p.backed = true } + +// Advances the parser and returns the new current token. +func (p *textParser) next() *token { + if p.backed || p.done { + p.backed = false + return &p.cur + } + p.advance() + if p.done { + p.cur.value = "" + } else if len(p.cur.value) > 0 && isQuote(p.cur.value[0]) { + // Look for multiple quoted strings separated by whitespace, + // and concatenate them. + cat := p.cur + for { + p.skipWhitespace() + if p.done || !isQuote(p.s[0]) { + break + } + p.advance() + if p.cur.err != nil { + return &p.cur + } + cat.value += " " + p.cur.value + cat.unquoted += p.cur.unquoted + } + p.done = false // parser may have seen EOF, but we want to return cat + p.cur = cat + } + return &p.cur +} + +func (p *textParser) consumeToken(s string) error { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value != s { + p.back() + return p.errorf("expected %q, found %q", s, tok.value) + } + return nil +} + +// Return a RequiredNotSetError indicating which required field was not set. +func (p *textParser) missingRequiredFieldError(sv reflect.Value) *RequiredNotSetError { + st := sv.Type() + sprops := GetProperties(st) + for i := 0; i < st.NumField(); i++ { + if !isNil(sv.Field(i)) { + continue + } + + props := sprops.Prop[i] + if props.Required { + return &RequiredNotSetError{fmt.Sprintf("%v.%v", st, props.OrigName)} + } + } + return &RequiredNotSetError{fmt.Sprintf("%v.", st)} // should not happen +} + +// Returns the index in the struct for the named field, as well as the parsed tag properties. +func structFieldByName(sprops *StructProperties, name string) (int, *Properties, bool) { + i, ok := sprops.decoderOrigNames[name] + if ok { + return i, sprops.Prop[i], true + } + return -1, nil, false +} + +// Consume a ':' from the input stream (if the next token is a colon), +// returning an error if a colon is needed but not present. +func (p *textParser) checkForColon(props *Properties, typ reflect.Type) *ParseError { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value != ":" { + // Colon is optional when the field is a group or message. + needColon := true + switch props.Wire { + case "group": + needColon = false + case "bytes": + // A "bytes" field is either a message, a string, or a repeated field; + // those three become *T, *string and []T respectively, so we can check for + // this field being a pointer to a non-string. + if typ.Kind() == reflect.Ptr { + // *T or *string + if typ.Elem().Kind() == reflect.String { + break + } + } else if typ.Kind() == reflect.Slice { + // []T or []*T + if typ.Elem().Kind() != reflect.Ptr { + break + } + } else if typ.Kind() == reflect.String { + // The proto3 exception is for a string field, + // which requires a colon. + break + } + needColon = false + } + if needColon { + return p.errorf("expected ':', found %q", tok.value) + } + p.back() + } + return nil +} + +func (p *textParser) readStruct(sv reflect.Value, terminator string) error { + st := sv.Type() + sprops := GetProperties(st) + reqCount := sprops.reqCount + var reqFieldErr error + fieldSet := make(map[string]bool) + // A struct is a sequence of "name: value", terminated by one of + // '>' or '}', or the end of the input. A name may also be + // "[extension]" or "[type/url]". + // + // The whole struct can also be an expanded Any message, like: + // [type/url] < ... struct contents ... > + for { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value == terminator { + break + } + if tok.value == "[" { + // Looks like an extension or an Any. + // + // TODO: Check whether we need to handle + // namespace rooted names (e.g. ".something.Foo"). + extName, err := p.consumeExtName() + if err != nil { + return err + } + + if s := strings.LastIndex(extName, "/"); s >= 0 { + // If it contains a slash, it's an Any type URL. + messageName := extName[s+1:] + mt := MessageType(messageName) + if mt == nil { + return p.errorf("unrecognized message %q in google.protobuf.Any", messageName) + } + tok = p.next() + if tok.err != nil { + return tok.err + } + // consume an optional colon + if tok.value == ":" { + tok = p.next() + if tok.err != nil { + return tok.err + } + } + var terminator string + switch tok.value { + case "<": + terminator = ">" + case "{": + terminator = "}" + default: + return p.errorf("expected '{' or '<', found %q", tok.value) + } + v := reflect.New(mt.Elem()) + if pe := p.readStruct(v.Elem(), terminator); pe != nil { + return pe + } + b, err := Marshal(v.Interface().(Message)) + if err != nil { + return p.errorf("failed to marshal message of type %q: %v", messageName, err) + } + if fieldSet["type_url"] { + return p.errorf(anyRepeatedlyUnpacked, "type_url") + } + if fieldSet["value"] { + return p.errorf(anyRepeatedlyUnpacked, "value") + } + sv.FieldByName("TypeUrl").SetString(extName) + sv.FieldByName("Value").SetBytes(b) + fieldSet["type_url"] = true + fieldSet["value"] = true + continue + } + + var desc *ExtensionDesc + // This could be faster, but it's functional. + // TODO: Do something smarter than a linear scan. + for _, d := range RegisteredExtensions(reflect.New(st).Interface().(Message)) { + if d.Name == extName { + desc = d + break + } + } + if desc == nil { + return p.errorf("unrecognized extension %q", extName) + } + + props := &Properties{} + props.Parse(desc.Tag) + + typ := reflect.TypeOf(desc.ExtensionType) + if err := p.checkForColon(props, typ); err != nil { + return err + } + + rep := desc.repeated() + + // Read the extension structure, and set it in + // the value we're constructing. + var ext reflect.Value + if !rep { + ext = reflect.New(typ).Elem() + } else { + ext = reflect.New(typ.Elem()).Elem() + } + if err := p.readAny(ext, props); err != nil { + if _, ok := err.(*RequiredNotSetError); !ok { + return err + } + reqFieldErr = err + } + ep := sv.Addr().Interface().(Message) + if !rep { + SetExtension(ep, desc, ext.Interface()) + } else { + old, err := GetExtension(ep, desc) + var sl reflect.Value + if err == nil { + sl = reflect.ValueOf(old) // existing slice + } else { + sl = reflect.MakeSlice(typ, 0, 1) + } + sl = reflect.Append(sl, ext) + SetExtension(ep, desc, sl.Interface()) + } + if err := p.consumeOptionalSeparator(); err != nil { + return err + } + continue + } + + // This is a normal, non-extension field. + name := tok.value + var dst reflect.Value + fi, props, ok := structFieldByName(sprops, name) + if ok { + dst = sv.Field(fi) + } else if oop, ok := sprops.OneofTypes[name]; ok { + // It is a oneof. + props = oop.Prop + nv := reflect.New(oop.Type.Elem()) + dst = nv.Elem().Field(0) + field := sv.Field(oop.Field) + if !field.IsNil() { + return p.errorf("field '%s' would overwrite already parsed oneof '%s'", name, sv.Type().Field(oop.Field).Name) + } + field.Set(nv) + } + if !dst.IsValid() { + return p.errorf("unknown field name %q in %v", name, st) + } + + if dst.Kind() == reflect.Map { + // Consume any colon. + if err := p.checkForColon(props, dst.Type()); err != nil { + return err + } + + // Construct the map if it doesn't already exist. + if dst.IsNil() { + dst.Set(reflect.MakeMap(dst.Type())) + } + key := reflect.New(dst.Type().Key()).Elem() + val := reflect.New(dst.Type().Elem()).Elem() + + // The map entry should be this sequence of tokens: + // < key : KEY value : VALUE > + // However, implementations may omit key or value, and technically + // we should support them in any order. See b/28924776 for a time + // this went wrong. + + tok := p.next() + var terminator string + switch tok.value { + case "<": + terminator = ">" + case "{": + terminator = "}" + default: + return p.errorf("expected '{' or '<', found %q", tok.value) + } + for { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value == terminator { + break + } + switch tok.value { + case "key": + if err := p.consumeToken(":"); err != nil { + return err + } + if err := p.readAny(key, props.MapKeyProp); err != nil { + return err + } + if err := p.consumeOptionalSeparator(); err != nil { + return err + } + case "value": + if err := p.checkForColon(props.MapValProp, dst.Type().Elem()); err != nil { + return err + } + if err := p.readAny(val, props.MapValProp); err != nil { + return err + } + if err := p.consumeOptionalSeparator(); err != nil { + return err + } + default: + p.back() + return p.errorf(`expected "key", "value", or %q, found %q`, terminator, tok.value) + } + } + + dst.SetMapIndex(key, val) + continue + } + + // Check that it's not already set if it's not a repeated field. + if !props.Repeated && fieldSet[name] { + return p.errorf("non-repeated field %q was repeated", name) + } + + if err := p.checkForColon(props, dst.Type()); err != nil { + return err + } + + // Parse into the field. + fieldSet[name] = true + if err := p.readAny(dst, props); err != nil { + if _, ok := err.(*RequiredNotSetError); !ok { + return err + } + reqFieldErr = err + } + if props.Required { + reqCount-- + } + + if err := p.consumeOptionalSeparator(); err != nil { + return err + } + + } + + if reqCount > 0 { + return p.missingRequiredFieldError(sv) + } + return reqFieldErr +} + +// consumeExtName consumes extension name or expanded Any type URL and the +// following ']'. It returns the name or URL consumed. +func (p *textParser) consumeExtName() (string, error) { + tok := p.next() + if tok.err != nil { + return "", tok.err + } + + // If extension name or type url is quoted, it's a single token. + if len(tok.value) > 2 && isQuote(tok.value[0]) && tok.value[len(tok.value)-1] == tok.value[0] { + name, err := unquoteC(tok.value[1:len(tok.value)-1], rune(tok.value[0])) + if err != nil { + return "", err + } + return name, p.consumeToken("]") + } + + // Consume everything up to "]" + var parts []string + for tok.value != "]" { + parts = append(parts, tok.value) + tok = p.next() + if tok.err != nil { + return "", p.errorf("unrecognized type_url or extension name: %s", tok.err) + } + if p.done && tok.value != "]" { + return "", p.errorf("unclosed type_url or extension name") + } + } + return strings.Join(parts, ""), nil +} + +// consumeOptionalSeparator consumes an optional semicolon or comma. +// It is used in readStruct to provide backward compatibility. +func (p *textParser) consumeOptionalSeparator() error { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value != ";" && tok.value != "," { + p.back() + } + return nil +} + +func (p *textParser) readAny(v reflect.Value, props *Properties) error { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value == "" { + return p.errorf("unexpected EOF") + } + + switch fv := v; fv.Kind() { + case reflect.Slice: + at := v.Type() + if at.Elem().Kind() == reflect.Uint8 { + // Special case for []byte + if tok.value[0] != '"' && tok.value[0] != '\'' { + // Deliberately written out here, as the error after + // this switch statement would write "invalid []byte: ...", + // which is not as user-friendly. + return p.errorf("invalid string: %v", tok.value) + } + bytes := []byte(tok.unquoted) + fv.Set(reflect.ValueOf(bytes)) + return nil + } + // Repeated field. + if tok.value == "[" { + // Repeated field with list notation, like [1,2,3]. + for { + fv.Set(reflect.Append(fv, reflect.New(at.Elem()).Elem())) + err := p.readAny(fv.Index(fv.Len()-1), props) + if err != nil { + return err + } + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value == "]" { + break + } + if tok.value != "," { + return p.errorf("Expected ']' or ',' found %q", tok.value) + } + } + return nil + } + // One value of the repeated field. + p.back() + fv.Set(reflect.Append(fv, reflect.New(at.Elem()).Elem())) + return p.readAny(fv.Index(fv.Len()-1), props) + case reflect.Bool: + // true/1/t/True or false/f/0/False. + switch tok.value { + case "true", "1", "t", "True": + fv.SetBool(true) + return nil + case "false", "0", "f", "False": + fv.SetBool(false) + return nil + } + case reflect.Float32, reflect.Float64: + v := tok.value + // Ignore 'f' for compatibility with output generated by C++, but don't + // remove 'f' when the value is "-inf" or "inf". + if strings.HasSuffix(v, "f") && tok.value != "-inf" && tok.value != "inf" { + v = v[:len(v)-1] + } + if f, err := strconv.ParseFloat(v, fv.Type().Bits()); err == nil { + fv.SetFloat(f) + return nil + } + case reflect.Int32: + if x, err := strconv.ParseInt(tok.value, 0, 32); err == nil { + fv.SetInt(x) + return nil + } + + if len(props.Enum) == 0 { + break + } + m, ok := enumValueMaps[props.Enum] + if !ok { + break + } + x, ok := m[tok.value] + if !ok { + break + } + fv.SetInt(int64(x)) + return nil + case reflect.Int64: + if x, err := strconv.ParseInt(tok.value, 0, 64); err == nil { + fv.SetInt(x) + return nil + } + + case reflect.Ptr: + // A basic field (indirected through pointer), or a repeated message/group + p.back() + fv.Set(reflect.New(fv.Type().Elem())) + return p.readAny(fv.Elem(), props) + case reflect.String: + if tok.value[0] == '"' || tok.value[0] == '\'' { + fv.SetString(tok.unquoted) + return nil + } + case reflect.Struct: + var terminator string + switch tok.value { + case "{": + terminator = "}" + case "<": + terminator = ">" + default: + return p.errorf("expected '{' or '<', found %q", tok.value) + } + // TODO: Handle nested messages which implement encoding.TextUnmarshaler. + return p.readStruct(fv, terminator) + case reflect.Uint32: + if x, err := strconv.ParseUint(tok.value, 0, 32); err == nil { + fv.SetUint(uint64(x)) + return nil + } + case reflect.Uint64: + if x, err := strconv.ParseUint(tok.value, 0, 64); err == nil { + fv.SetUint(x) + return nil + } + } + return p.errorf("invalid %v: %v", v.Type(), tok.value) +} + +// UnmarshalText reads a protocol buffer in Text format. UnmarshalText resets pb +// before starting to unmarshal, so any existing data in pb is always removed. +// If a required field is not set and no other error occurs, +// UnmarshalText returns *RequiredNotSetError. +func UnmarshalText(s string, pb Message) error { + if um, ok := pb.(encoding.TextUnmarshaler); ok { + return um.UnmarshalText([]byte(s)) + } + pb.Reset() + v := reflect.ValueOf(pb) + return newTextParser(s).readStruct(v.Elem(), "") +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/LICENSE b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/LICENSE new file mode 100644 index 00000000..32017f8f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2017 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/cmp/cmpopts/equate.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/cmp/cmpopts/equate.go new file mode 100644 index 00000000..41bbddc6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/cmp/cmpopts/equate.go @@ -0,0 +1,89 @@ +// Copyright 2017, The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE.md file. + +// Package cmpopts provides common options for the cmp package. +package cmpopts + +import ( + "math" + "reflect" + + "github.com/google/go-cmp/cmp" +) + +func equateAlways(_, _ interface{}) bool { return true } + +// EquateEmpty returns a Comparer option that determines all maps and slices +// with a length of zero to be equal, regardless of whether they are nil. +// +// EquateEmpty can be used in conjunction with SortSlices and SortMaps. +func EquateEmpty() cmp.Option { + return cmp.FilterValues(isEmpty, cmp.Comparer(equateAlways)) +} + +func isEmpty(x, y interface{}) bool { + vx, vy := reflect.ValueOf(x), reflect.ValueOf(y) + return (x != nil && y != nil && vx.Type() == vy.Type()) && + (vx.Kind() == reflect.Slice || vx.Kind() == reflect.Map) && + (vx.Len() == 0 && vy.Len() == 0) +} + +// EquateApprox returns a Comparer option that determines float32 or float64 +// values to be equal if they are within a relative fraction or absolute margin. +// This option is not used when either x or y is NaN or infinite. +// +// The fraction determines that the difference of two values must be within the +// smaller fraction of the two values, while the margin determines that the two +// values must be within some absolute margin. +// To express only a fraction or only a margin, use 0 for the other parameter. +// The fraction and margin must be non-negative. +// +// The mathematical expression used is equivalent to: +// |x-y| ≤ max(fraction*min(|x|, |y|), margin) +// +// EquateApprox can be used in conjunction with EquateNaNs. +func EquateApprox(fraction, margin float64) cmp.Option { + if margin < 0 || fraction < 0 || math.IsNaN(margin) || math.IsNaN(fraction) { + panic("margin or fraction must be a non-negative number") + } + a := approximator{fraction, margin} + return cmp.Options{ + cmp.FilterValues(areRealF64s, cmp.Comparer(a.compareF64)), + cmp.FilterValues(areRealF32s, cmp.Comparer(a.compareF32)), + } +} + +type approximator struct{ frac, marg float64 } + +func areRealF64s(x, y float64) bool { + return !math.IsNaN(x) && !math.IsNaN(y) && !math.IsInf(x, 0) && !math.IsInf(y, 0) +} +func areRealF32s(x, y float32) bool { + return areRealF64s(float64(x), float64(y)) +} +func (a approximator) compareF64(x, y float64) bool { + relMarg := a.frac * math.Min(math.Abs(x), math.Abs(y)) + return math.Abs(x-y) <= math.Max(a.marg, relMarg) +} +func (a approximator) compareF32(x, y float32) bool { + return a.compareF64(float64(x), float64(y)) +} + +// EquateNaNs returns a Comparer option that determines float32 and float64 +// NaN values to be equal. +// +// EquateNaNs can be used in conjunction with EquateApprox. +func EquateNaNs() cmp.Option { + return cmp.Options{ + cmp.FilterValues(areNaNsF64s, cmp.Comparer(equateAlways)), + cmp.FilterValues(areNaNsF32s, cmp.Comparer(equateAlways)), + } +} + +func areNaNsF64s(x, y float64) bool { + return math.IsNaN(x) && math.IsNaN(y) +} +func areNaNsF32s(x, y float32) bool { + return areNaNsF64s(float64(x), float64(y)) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/cmp/cmpopts/ignore.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/cmp/cmpopts/ignore.go new file mode 100644 index 00000000..e86554b9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/cmp/cmpopts/ignore.go @@ -0,0 +1,145 @@ +// Copyright 2017, The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE.md file. + +package cmpopts + +import ( + "fmt" + "reflect" + "unicode" + "unicode/utf8" + + "github.com/google/go-cmp/cmp" +) + +// IgnoreFields returns an Option that ignores exported fields of the +// given names on a single struct type. +// The struct type is specified by passing in a value of that type. +// +// The name may be a dot-delimited string (e.g., "Foo.Bar") to ignore a +// specific sub-field that is embedded or nested within the parent struct. +// +// This does not handle unexported fields; use IgnoreUnexported instead. +func IgnoreFields(typ interface{}, names ...string) cmp.Option { + sf := newStructFilter(typ, names...) + return cmp.FilterPath(sf.filter, cmp.Ignore()) +} + +// IgnoreTypes returns an Option that ignores all values assignable to +// certain types, which are specified by passing in a value of each type. +func IgnoreTypes(typs ...interface{}) cmp.Option { + tf := newTypeFilter(typs...) + return cmp.FilterPath(tf.filter, cmp.Ignore()) +} + +type typeFilter []reflect.Type + +func newTypeFilter(typs ...interface{}) (tf typeFilter) { + for _, typ := range typs { + t := reflect.TypeOf(typ) + if t == nil { + // This occurs if someone tries to pass in sync.Locker(nil) + panic("cannot determine type; consider using IgnoreInterfaces") + } + tf = append(tf, t) + } + return tf +} +func (tf typeFilter) filter(p cmp.Path) bool { + if len(p) < 1 { + return false + } + t := p.Last().Type() + for _, ti := range tf { + if t.AssignableTo(ti) { + return true + } + } + return false +} + +// IgnoreInterfaces returns an Option that ignores all values or references of +// values assignable to certain interface types. These interfaces are specified +// by passing in an anonymous struct with the interface types embedded in it. +// For example, to ignore sync.Locker, pass in struct{sync.Locker}{}. +func IgnoreInterfaces(ifaces interface{}) cmp.Option { + tf := newIfaceFilter(ifaces) + return cmp.FilterPath(tf.filter, cmp.Ignore()) +} + +type ifaceFilter []reflect.Type + +func newIfaceFilter(ifaces interface{}) (tf ifaceFilter) { + t := reflect.TypeOf(ifaces) + if ifaces == nil || t.Name() != "" || t.Kind() != reflect.Struct { + panic("input must be an anonymous struct") + } + for i := 0; i < t.NumField(); i++ { + fi := t.Field(i) + switch { + case !fi.Anonymous: + panic("struct cannot have named fields") + case fi.Type.Kind() != reflect.Interface: + panic("embedded field must be an interface type") + case fi.Type.NumMethod() == 0: + // This matches everything; why would you ever want this? + panic("cannot ignore empty interface") + default: + tf = append(tf, fi.Type) + } + } + return tf +} +func (tf ifaceFilter) filter(p cmp.Path) bool { + if len(p) < 1 { + return false + } + t := p.Last().Type() + for _, ti := range tf { + if t.AssignableTo(ti) { + return true + } + if t.Kind() != reflect.Ptr && reflect.PtrTo(t).AssignableTo(ti) { + return true + } + } + return false +} + +// IgnoreUnexported returns an Option that only ignores the immediate unexported +// fields of a struct, including anonymous fields of unexported types. +// In particular, unexported fields within the struct's exported fields +// of struct types, including anonymous fields, will not be ignored unless the +// type of the field itself is also passed to IgnoreUnexported. +func IgnoreUnexported(typs ...interface{}) cmp.Option { + ux := newUnexportedFilter(typs...) + return cmp.FilterPath(ux.filter, cmp.Ignore()) +} + +type unexportedFilter struct{ m map[reflect.Type]bool } + +func newUnexportedFilter(typs ...interface{}) unexportedFilter { + ux := unexportedFilter{m: make(map[reflect.Type]bool)} + for _, typ := range typs { + t := reflect.TypeOf(typ) + if t == nil || t.Kind() != reflect.Struct { + panic(fmt.Sprintf("invalid struct type: %T", typ)) + } + ux.m[t] = true + } + return ux +} +func (xf unexportedFilter) filter(p cmp.Path) bool { + sf, ok := p.Index(-1).(cmp.StructField) + if !ok { + return false + } + return xf.m[p.Index(-2).Type()] && !isExported(sf.Name()) +} + +// isExported reports whether the identifier is exported. +func isExported(id string) bool { + r, _ := utf8.DecodeRuneInString(id) + return unicode.IsUpper(r) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/cmp/cmpopts/sort.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/cmp/cmpopts/sort.go new file mode 100644 index 00000000..da17d746 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/cmp/cmpopts/sort.go @@ -0,0 +1,146 @@ +// Copyright 2017, The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE.md file. + +package cmpopts + +import ( + "fmt" + "reflect" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/internal/function" +) + +// SortSlices returns a Transformer option that sorts all []V. +// The less function must be of the form "func(T, T) bool" which is used to +// sort any slice with element type V that is assignable to T. +// +// The less function must be: +// • Deterministic: less(x, y) == less(x, y) +// • Irreflexive: !less(x, x) +// • Transitive: if !less(x, y) and !less(y, z), then !less(x, z) +// +// The less function does not have to be "total". That is, if !less(x, y) and +// !less(y, x) for two elements x and y, their relative order is maintained. +// +// SortSlices can be used in conjunction with EquateEmpty. +func SortSlices(less interface{}) cmp.Option { + vf := reflect.ValueOf(less) + if !function.IsType(vf.Type(), function.Less) || vf.IsNil() { + panic(fmt.Sprintf("invalid less function: %T", less)) + } + ss := sliceSorter{vf.Type().In(0), vf} + return cmp.FilterValues(ss.filter, cmp.Transformer("Sort", ss.sort)) +} + +type sliceSorter struct { + in reflect.Type // T + fnc reflect.Value // func(T, T) bool +} + +func (ss sliceSorter) filter(x, y interface{}) bool { + vx, vy := reflect.ValueOf(x), reflect.ValueOf(y) + if !(x != nil && y != nil && vx.Type() == vy.Type()) || + !(vx.Kind() == reflect.Slice && vx.Type().Elem().AssignableTo(ss.in)) || + (vx.Len() <= 1 && vy.Len() <= 1) { + return false + } + // Check whether the slices are already sorted to avoid an infinite + // recursion cycle applying the same transform to itself. + ok1 := sliceIsSorted(x, func(i, j int) bool { return ss.less(vx, i, j) }) + ok2 := sliceIsSorted(y, func(i, j int) bool { return ss.less(vy, i, j) }) + return !ok1 || !ok2 +} +func (ss sliceSorter) sort(x interface{}) interface{} { + src := reflect.ValueOf(x) + dst := reflect.MakeSlice(src.Type(), src.Len(), src.Len()) + for i := 0; i < src.Len(); i++ { + dst.Index(i).Set(src.Index(i)) + } + sortSliceStable(dst.Interface(), func(i, j int) bool { return ss.less(dst, i, j) }) + ss.checkSort(dst) + return dst.Interface() +} +func (ss sliceSorter) checkSort(v reflect.Value) { + start := -1 // Start of a sequence of equal elements. + for i := 1; i < v.Len(); i++ { + if ss.less(v, i-1, i) { + // Check that first and last elements in v[start:i] are equal. + if start >= 0 && (ss.less(v, start, i-1) || ss.less(v, i-1, start)) { + panic(fmt.Sprintf("incomparable values detected: want equal elements: %v", v.Slice(start, i))) + } + start = -1 + } else if start == -1 { + start = i + } + } +} +func (ss sliceSorter) less(v reflect.Value, i, j int) bool { + vx, vy := v.Index(i), v.Index(j) + return ss.fnc.Call([]reflect.Value{vx, vy})[0].Bool() +} + +// SortMaps returns a Transformer option that flattens map[K]V types to be a +// sorted []struct{K, V}. The less function must be of the form +// "func(T, T) bool" which is used to sort any map with key K that is +// assignable to T. +// +// Flattening the map into a slice has the property that cmp.Equal is able to +// use Comparers on K or the K.Equal method if it exists. +// +// The less function must be: +// • Deterministic: less(x, y) == less(x, y) +// • Irreflexive: !less(x, x) +// • Transitive: if !less(x, y) and !less(y, z), then !less(x, z) +// • Total: if x != y, then either less(x, y) or less(y, x) +// +// SortMaps can be used in conjunction with EquateEmpty. +func SortMaps(less interface{}) cmp.Option { + vf := reflect.ValueOf(less) + if !function.IsType(vf.Type(), function.Less) || vf.IsNil() { + panic(fmt.Sprintf("invalid less function: %T", less)) + } + ms := mapSorter{vf.Type().In(0), vf} + return cmp.FilterValues(ms.filter, cmp.Transformer("Sort", ms.sort)) +} + +type mapSorter struct { + in reflect.Type // T + fnc reflect.Value // func(T, T) bool +} + +func (ms mapSorter) filter(x, y interface{}) bool { + vx, vy := reflect.ValueOf(x), reflect.ValueOf(y) + return (x != nil && y != nil && vx.Type() == vy.Type()) && + (vx.Kind() == reflect.Map && vx.Type().Key().AssignableTo(ms.in)) && + (vx.Len() != 0 || vy.Len() != 0) +} +func (ms mapSorter) sort(x interface{}) interface{} { + src := reflect.ValueOf(x) + outType := mapEntryType(src.Type()) + dst := reflect.MakeSlice(reflect.SliceOf(outType), src.Len(), src.Len()) + for i, k := range src.MapKeys() { + v := reflect.New(outType).Elem() + v.Field(0).Set(k) + v.Field(1).Set(src.MapIndex(k)) + dst.Index(i).Set(v) + } + sortSlice(dst.Interface(), func(i, j int) bool { return ms.less(dst, i, j) }) + ms.checkSort(dst) + return dst.Interface() +} +func (ms mapSorter) checkSort(v reflect.Value) { + for i := 1; i < v.Len(); i++ { + if !ms.less(v, i-1, i) { + panic(fmt.Sprintf("partial order detected: want %v < %v", v.Index(i-1), v.Index(i))) + } + } +} +func (ms mapSorter) less(v reflect.Value, i, j int) bool { + vx, vy := v.Index(i).Field(0), v.Index(j).Field(0) + if !hasReflectStructOf { + vx, vy = vx.Elem(), vy.Elem() + } + return ms.fnc.Call([]reflect.Value{vx, vy})[0].Bool() +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/cmp/cmpopts/sort_go17.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/cmp/cmpopts/sort_go17.go new file mode 100644 index 00000000..839b88ca --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/cmp/cmpopts/sort_go17.go @@ -0,0 +1,46 @@ +// Copyright 2017, The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE.md file. + +// +build !go1.8 + +package cmpopts + +import ( + "reflect" + "sort" +) + +const hasReflectStructOf = false + +func mapEntryType(reflect.Type) reflect.Type { + return reflect.TypeOf(struct{ K, V interface{} }{}) +} + +func sliceIsSorted(slice interface{}, less func(i, j int) bool) bool { + return sort.IsSorted(reflectSliceSorter{reflect.ValueOf(slice), less}) +} +func sortSlice(slice interface{}, less func(i, j int) bool) { + sort.Sort(reflectSliceSorter{reflect.ValueOf(slice), less}) +} +func sortSliceStable(slice interface{}, less func(i, j int) bool) { + sort.Stable(reflectSliceSorter{reflect.ValueOf(slice), less}) +} + +type reflectSliceSorter struct { + slice reflect.Value + less func(i, j int) bool +} + +func (ss reflectSliceSorter) Len() int { + return ss.slice.Len() +} +func (ss reflectSliceSorter) Less(i, j int) bool { + return ss.less(i, j) +} +func (ss reflectSliceSorter) Swap(i, j int) { + vi := ss.slice.Index(i).Interface() + vj := ss.slice.Index(j).Interface() + ss.slice.Index(i).Set(reflect.ValueOf(vj)) + ss.slice.Index(j).Set(reflect.ValueOf(vi)) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/cmp/cmpopts/sort_go18.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/cmp/cmpopts/sort_go18.go new file mode 100644 index 00000000..8a59c0d3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/cmp/cmpopts/sort_go18.go @@ -0,0 +1,31 @@ +// Copyright 2017, The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE.md file. + +// +build go1.8 + +package cmpopts + +import ( + "reflect" + "sort" +) + +const hasReflectStructOf = true + +func mapEntryType(t reflect.Type) reflect.Type { + return reflect.StructOf([]reflect.StructField{ + {Name: "K", Type: t.Key()}, + {Name: "V", Type: t.Elem()}, + }) +} + +func sliceIsSorted(slice interface{}, less func(i, j int) bool) bool { + return sort.SliceIsSorted(slice, less) +} +func sortSlice(slice interface{}, less func(i, j int) bool) { + sort.Slice(slice, less) +} +func sortSliceStable(slice interface{}, less func(i, j int) bool) { + sort.SliceStable(slice, less) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/cmp/cmpopts/struct_filter.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/cmp/cmpopts/struct_filter.go new file mode 100644 index 00000000..97f70798 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/cmp/cmpopts/struct_filter.go @@ -0,0 +1,182 @@ +// Copyright 2017, The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE.md file. + +package cmpopts + +import ( + "fmt" + "reflect" + "strings" + + "github.com/google/go-cmp/cmp" +) + +// filterField returns a new Option where opt is only evaluated on paths that +// include a specific exported field on a single struct type. +// The struct type is specified by passing in a value of that type. +// +// The name may be a dot-delimited string (e.g., "Foo.Bar") to select a +// specific sub-field that is embedded or nested within the parent struct. +func filterField(typ interface{}, name string, opt cmp.Option) cmp.Option { + // TODO: This is currently unexported over concerns of how helper filters + // can be composed together easily. + // TODO: Add tests for FilterField. + + sf := newStructFilter(typ, name) + return cmp.FilterPath(sf.filter, opt) +} + +type structFilter struct { + t reflect.Type // The root struct type to match on + ft fieldTree // Tree of fields to match on +} + +func newStructFilter(typ interface{}, names ...string) structFilter { + // TODO: Perhaps allow * as a special identifier to allow ignoring any + // number of path steps until the next field match? + // This could be useful when a concrete struct gets transformed into + // an anonymous struct where it is not possible to specify that by type, + // but the transformer happens to provide guarantees about the names of + // the transformed fields. + + t := reflect.TypeOf(typ) + if t == nil || t.Kind() != reflect.Struct { + panic(fmt.Sprintf("%T must be a struct", typ)) + } + var ft fieldTree + for _, name := range names { + cname, err := canonicalName(t, name) + if err != nil { + panic(fmt.Sprintf("%s: %v", strings.Join(cname, "."), err)) + } + ft.insert(cname) + } + return structFilter{t, ft} +} + +func (sf structFilter) filter(p cmp.Path) bool { + for i, ps := range p { + if ps.Type().AssignableTo(sf.t) && sf.ft.matchPrefix(p[i+1:]) { + return true + } + } + return false +} + +// fieldTree represents a set of dot-separated identifiers. +// +// For example, inserting the following selectors: +// Foo +// Foo.Bar.Baz +// Foo.Buzz +// Nuka.Cola.Quantum +// +// Results in a tree of the form: +// {sub: { +// "Foo": {ok: true, sub: { +// "Bar": {sub: { +// "Baz": {ok: true}, +// }}, +// "Buzz": {ok: true}, +// }}, +// "Nuka": {sub: { +// "Cola": {sub: { +// "Quantum": {ok: true}, +// }}, +// }}, +// }} +type fieldTree struct { + ok bool // Whether this is a specified node + sub map[string]fieldTree // The sub-tree of fields under this node +} + +// insert inserts a sequence of field accesses into the tree. +func (ft *fieldTree) insert(cname []string) { + if ft.sub == nil { + ft.sub = make(map[string]fieldTree) + } + if len(cname) == 0 { + ft.ok = true + return + } + sub := ft.sub[cname[0]] + sub.insert(cname[1:]) + ft.sub[cname[0]] = sub +} + +// matchPrefix reports whether any selector in the fieldTree matches +// the start of path p. +func (ft fieldTree) matchPrefix(p cmp.Path) bool { + for _, ps := range p { + switch ps := ps.(type) { + case cmp.StructField: + ft = ft.sub[ps.Name()] + if ft.ok { + return true + } + if len(ft.sub) == 0 { + return false + } + case cmp.Indirect: + default: + return false + } + } + return false +} + +// canonicalName returns a list of identifiers where any struct field access +// through an embedded field is expanded to include the names of the embedded +// types themselves. +// +// For example, suppose field "Foo" is not directly in the parent struct, +// but actually from an embedded struct of type "Bar". Then, the canonical name +// of "Foo" is actually "Bar.Foo". +// +// Suppose field "Foo" is not directly in the parent struct, but actually +// a field in two different embedded structs of types "Bar" and "Baz". +// Then the selector "Foo" causes a panic since it is ambiguous which one it +// refers to. The user must specify either "Bar.Foo" or "Baz.Foo". +func canonicalName(t reflect.Type, sel string) ([]string, error) { + var name string + sel = strings.TrimPrefix(sel, ".") + if sel == "" { + return nil, fmt.Errorf("name must not be empty") + } + if i := strings.IndexByte(sel, '.'); i < 0 { + name, sel = sel, "" + } else { + name, sel = sel[:i], sel[i:] + } + + // Type must be a struct or pointer to struct. + if t.Kind() == reflect.Ptr { + t = t.Elem() + } + if t.Kind() != reflect.Struct { + return nil, fmt.Errorf("%v must be a struct", t) + } + + // Find the canonical name for this current field name. + // If the field exists in an embedded struct, then it will be expanded. + if !isExported(name) { + // Disallow unexported fields: + // * To discourage people from actually touching unexported fields + // * FieldByName is buggy (https://golang.org/issue/4876) + return []string{name}, fmt.Errorf("name must be exported") + } + sf, ok := t.FieldByName(name) + if !ok { + return []string{name}, fmt.Errorf("does not exist") + } + var ss []string + for i := range sf.Index { + ss = append(ss, t.FieldByIndex(sf.Index[:i+1]).Name) + } + if sel == "" { + return ss, nil + } + ssPost, err := canonicalName(sf.Type, sel) + return append(ss, ssPost...), err +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/cmp/compare.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/cmp/compare.go new file mode 100644 index 00000000..7e215f22 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/cmp/compare.go @@ -0,0 +1,553 @@ +// Copyright 2017, The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE.md file. + +// Package cmp determines equality of values. +// +// This package is intended to be a more powerful and safer alternative to +// reflect.DeepEqual for comparing whether two values are semantically equal. +// +// The primary features of cmp are: +// +// • When the default behavior of equality does not suit the needs of the test, +// custom equality functions can override the equality operation. +// For example, an equality function may report floats as equal so long as they +// are within some tolerance of each other. +// +// • Types that have an Equal method may use that method to determine equality. +// This allows package authors to determine the equality operation for the types +// that they define. +// +// • If no custom equality functions are used and no Equal method is defined, +// equality is determined by recursively comparing the primitive kinds on both +// values, much like reflect.DeepEqual. Unlike reflect.DeepEqual, unexported +// fields are not compared by default; they result in panics unless suppressed +// by using an Ignore option (see cmpopts.IgnoreUnexported) or explicitly compared +// using the AllowUnexported option. +package cmp + +import ( + "fmt" + "reflect" + + "github.com/google/go-cmp/cmp/internal/diff" + "github.com/google/go-cmp/cmp/internal/function" + "github.com/google/go-cmp/cmp/internal/value" +) + +// BUG(dsnet): Maps with keys containing NaN values cannot be properly compared due to +// the reflection package's inability to retrieve such entries. Equal will panic +// anytime it comes across a NaN key, but this behavior may change. +// +// See https://golang.org/issue/11104 for more details. + +var nothing = reflect.Value{} + +// Equal reports whether x and y are equal by recursively applying the +// following rules in the given order to x and y and all of their sub-values: +// +// • If two values are not of the same type, then they are never equal +// and the overall result is false. +// +// • Let S be the set of all Ignore, Transformer, and Comparer options that +// remain after applying all path filters, value filters, and type filters. +// If at least one Ignore exists in S, then the comparison is ignored. +// If the number of Transformer and Comparer options in S is greater than one, +// then Equal panics because it is ambiguous which option to use. +// If S contains a single Transformer, then use that to transform the current +// values and recursively call Equal on the output values. +// If S contains a single Comparer, then use that to compare the current values. +// Otherwise, evaluation proceeds to the next rule. +// +// • If the values have an Equal method of the form "(T) Equal(T) bool" or +// "(T) Equal(I) bool" where T is assignable to I, then use the result of +// x.Equal(y) even if x or y is nil. +// Otherwise, no such method exists and evaluation proceeds to the next rule. +// +// • Lastly, try to compare x and y based on their basic kinds. +// Simple kinds like booleans, integers, floats, complex numbers, strings, and +// channels are compared using the equivalent of the == operator in Go. +// Functions are only equal if they are both nil, otherwise they are unequal. +// Pointers are equal if the underlying values they point to are also equal. +// Interfaces are equal if their underlying concrete values are also equal. +// +// Structs are equal if all of their fields are equal. If a struct contains +// unexported fields, Equal panics unless the AllowUnexported option is used or +// an Ignore option (e.g., cmpopts.IgnoreUnexported) ignores that field. +// +// Arrays, slices, and maps are equal if they are both nil or both non-nil +// with the same length and the elements at each index or key are equal. +// Note that a non-nil empty slice and a nil slice are not equal. +// To equate empty slices and maps, consider using cmpopts.EquateEmpty. +// Map keys are equal according to the == operator. +// To use custom comparisons for map keys, consider using cmpopts.SortMaps. +func Equal(x, y interface{}, opts ...Option) bool { + s := newState(opts) + s.compareAny(reflect.ValueOf(x), reflect.ValueOf(y)) + return s.result.Equal() +} + +// Diff returns a human-readable report of the differences between two values. +// It returns an empty string if and only if Equal returns true for the same +// input values and options. The output string will use the "-" symbol to +// indicate elements removed from x, and the "+" symbol to indicate elements +// added to y. +// +// Do not depend on this output being stable. +func Diff(x, y interface{}, opts ...Option) string { + r := new(defaultReporter) + opts = Options{Options(opts), r} + eq := Equal(x, y, opts...) + d := r.String() + if (d == "") != eq { + panic("inconsistent difference and equality results") + } + return d +} + +type state struct { + // These fields represent the "comparison state". + // Calling statelessCompare must not result in observable changes to these. + result diff.Result // The current result of comparison + curPath Path // The current path in the value tree + reporter reporter // Optional reporter used for difference formatting + + // dynChecker triggers pseudo-random checks for option correctness. + // It is safe for statelessCompare to mutate this value. + dynChecker dynChecker + + // These fields, once set by processOption, will not change. + exporters map[reflect.Type]bool // Set of structs with unexported field visibility + opts Options // List of all fundamental and filter options +} + +func newState(opts []Option) *state { + s := new(state) + for _, opt := range opts { + s.processOption(opt) + } + return s +} + +func (s *state) processOption(opt Option) { + switch opt := opt.(type) { + case nil: + case Options: + for _, o := range opt { + s.processOption(o) + } + case coreOption: + type filtered interface { + isFiltered() bool + } + if fopt, ok := opt.(filtered); ok && !fopt.isFiltered() { + panic(fmt.Sprintf("cannot use an unfiltered option: %v", opt)) + } + s.opts = append(s.opts, opt) + case visibleStructs: + if s.exporters == nil { + s.exporters = make(map[reflect.Type]bool) + } + for t := range opt { + s.exporters[t] = true + } + case reporter: + if s.reporter != nil { + panic("difference reporter already registered") + } + s.reporter = opt + default: + panic(fmt.Sprintf("unknown option %T", opt)) + } +} + +// statelessCompare compares two values and returns the result. +// This function is stateless in that it does not alter the current result, +// or output to any registered reporters. +func (s *state) statelessCompare(vx, vy reflect.Value) diff.Result { + // We do not save and restore the curPath because all of the compareX + // methods should properly push and pop from the path. + // It is an implementation bug if the contents of curPath differs from + // when calling this function to when returning from it. + + oldResult, oldReporter := s.result, s.reporter + s.result = diff.Result{} // Reset result + s.reporter = nil // Remove reporter to avoid spurious printouts + s.compareAny(vx, vy) + res := s.result + s.result, s.reporter = oldResult, oldReporter + return res +} + +func (s *state) compareAny(vx, vy reflect.Value) { + // TODO: Support cyclic data structures. + + // Rule 0: Differing types are never equal. + if !vx.IsValid() || !vy.IsValid() { + s.report(vx.IsValid() == vy.IsValid(), vx, vy) + return + } + if vx.Type() != vy.Type() { + s.report(false, vx, vy) // Possible for path to be empty + return + } + t := vx.Type() + if len(s.curPath) == 0 { + s.curPath.push(&pathStep{typ: t}) + defer s.curPath.pop() + } + vx, vy = s.tryExporting(vx, vy) + + // Rule 1: Check whether an option applies on this node in the value tree. + if s.tryOptions(vx, vy, t) { + return + } + + // Rule 2: Check whether the type has a valid Equal method. + if s.tryMethod(vx, vy, t) { + return + } + + // Rule 3: Recursively descend into each value's underlying kind. + switch t.Kind() { + case reflect.Bool: + s.report(vx.Bool() == vy.Bool(), vx, vy) + return + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + s.report(vx.Int() == vy.Int(), vx, vy) + return + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + s.report(vx.Uint() == vy.Uint(), vx, vy) + return + case reflect.Float32, reflect.Float64: + s.report(vx.Float() == vy.Float(), vx, vy) + return + case reflect.Complex64, reflect.Complex128: + s.report(vx.Complex() == vy.Complex(), vx, vy) + return + case reflect.String: + s.report(vx.String() == vy.String(), vx, vy) + return + case reflect.Chan, reflect.UnsafePointer: + s.report(vx.Pointer() == vy.Pointer(), vx, vy) + return + case reflect.Func: + s.report(vx.IsNil() && vy.IsNil(), vx, vy) + return + case reflect.Ptr: + if vx.IsNil() || vy.IsNil() { + s.report(vx.IsNil() && vy.IsNil(), vx, vy) + return + } + s.curPath.push(&indirect{pathStep{t.Elem()}}) + defer s.curPath.pop() + s.compareAny(vx.Elem(), vy.Elem()) + return + case reflect.Interface: + if vx.IsNil() || vy.IsNil() { + s.report(vx.IsNil() && vy.IsNil(), vx, vy) + return + } + if vx.Elem().Type() != vy.Elem().Type() { + s.report(false, vx.Elem(), vy.Elem()) + return + } + s.curPath.push(&typeAssertion{pathStep{vx.Elem().Type()}}) + defer s.curPath.pop() + s.compareAny(vx.Elem(), vy.Elem()) + return + case reflect.Slice: + if vx.IsNil() || vy.IsNil() { + s.report(vx.IsNil() && vy.IsNil(), vx, vy) + return + } + fallthrough + case reflect.Array: + s.compareArray(vx, vy, t) + return + case reflect.Map: + s.compareMap(vx, vy, t) + return + case reflect.Struct: + s.compareStruct(vx, vy, t) + return + default: + panic(fmt.Sprintf("%v kind not handled", t.Kind())) + } +} + +func (s *state) tryExporting(vx, vy reflect.Value) (reflect.Value, reflect.Value) { + if sf, ok := s.curPath[len(s.curPath)-1].(*structField); ok && sf.unexported { + if sf.force { + // Use unsafe pointer arithmetic to get read-write access to an + // unexported field in the struct. + vx = unsafeRetrieveField(sf.pvx, sf.field) + vy = unsafeRetrieveField(sf.pvy, sf.field) + } else { + // We are not allowed to export the value, so invalidate them + // so that tryOptions can panic later if not explicitly ignored. + vx = nothing + vy = nothing + } + } + return vx, vy +} + +func (s *state) tryOptions(vx, vy reflect.Value, t reflect.Type) bool { + // If there were no FilterValues, we will not detect invalid inputs, + // so manually check for them and append invalid if necessary. + // We still evaluate the options since an ignore can override invalid. + opts := s.opts + if !vx.IsValid() || !vy.IsValid() { + opts = Options{opts, invalid{}} + } + + // Evaluate all filters and apply the remaining options. + if opt := opts.filter(s, vx, vy, t); opt != nil { + opt.apply(s, vx, vy) + return true + } + return false +} + +func (s *state) tryMethod(vx, vy reflect.Value, t reflect.Type) bool { + // Check if this type even has an Equal method. + m, ok := t.MethodByName("Equal") + if !ok || !function.IsType(m.Type, function.EqualAssignable) { + return false + } + + eq := s.callTTBFunc(m.Func, vx, vy) + s.report(eq, vx, vy) + return true +} + +func (s *state) callTRFunc(f, v reflect.Value) reflect.Value { + v = sanitizeValue(v, f.Type().In(0)) + if !s.dynChecker.Next() { + return f.Call([]reflect.Value{v})[0] + } + + // Run the function twice and ensure that we get the same results back. + // We run in goroutines so that the race detector (if enabled) can detect + // unsafe mutations to the input. + c := make(chan reflect.Value) + go detectRaces(c, f, v) + want := f.Call([]reflect.Value{v})[0] + if got := <-c; !s.statelessCompare(got, want).Equal() { + // To avoid false-positives with non-reflexive equality operations, + // we sanity check whether a value is equal to itself. + if !s.statelessCompare(want, want).Equal() { + return want + } + fn := getFuncName(f.Pointer()) + panic(fmt.Sprintf("non-deterministic function detected: %s", fn)) + } + return want +} + +func (s *state) callTTBFunc(f, x, y reflect.Value) bool { + x = sanitizeValue(x, f.Type().In(0)) + y = sanitizeValue(y, f.Type().In(1)) + if !s.dynChecker.Next() { + return f.Call([]reflect.Value{x, y})[0].Bool() + } + + // Swapping the input arguments is sufficient to check that + // f is symmetric and deterministic. + // We run in goroutines so that the race detector (if enabled) can detect + // unsafe mutations to the input. + c := make(chan reflect.Value) + go detectRaces(c, f, y, x) + want := f.Call([]reflect.Value{x, y})[0].Bool() + if got := <-c; !got.IsValid() || got.Bool() != want { + fn := getFuncName(f.Pointer()) + panic(fmt.Sprintf("non-deterministic or non-symmetric function detected: %s", fn)) + } + return want +} + +func detectRaces(c chan<- reflect.Value, f reflect.Value, vs ...reflect.Value) { + var ret reflect.Value + defer func() { + recover() // Ignore panics, let the other call to f panic instead + c <- ret + }() + ret = f.Call(vs)[0] +} + +// sanitizeValue converts nil interfaces of type T to those of type R, +// assuming that T is assignable to R. +// Otherwise, it returns the input value as is. +func sanitizeValue(v reflect.Value, t reflect.Type) reflect.Value { + // TODO(dsnet): Remove this hacky workaround. + // See https://golang.org/issue/22143 + if v.Kind() == reflect.Interface && v.IsNil() && v.Type() != t { + return reflect.New(t).Elem() + } + return v +} + +func (s *state) compareArray(vx, vy reflect.Value, t reflect.Type) { + step := &sliceIndex{pathStep{t.Elem()}, 0, 0} + s.curPath.push(step) + + // Compute an edit-script for slices vx and vy. + es := diff.Difference(vx.Len(), vy.Len(), func(ix, iy int) diff.Result { + step.xkey, step.ykey = ix, iy + return s.statelessCompare(vx.Index(ix), vy.Index(iy)) + }) + + // Report the entire slice as is if the arrays are of primitive kind, + // and the arrays are different enough. + isPrimitive := false + switch t.Elem().Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, + reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr, + reflect.Bool, reflect.Float32, reflect.Float64, reflect.Complex64, reflect.Complex128: + isPrimitive = true + } + if isPrimitive && es.Dist() > (vx.Len()+vy.Len())/4 { + s.curPath.pop() // Pop first since we are reporting the whole slice + s.report(false, vx, vy) + return + } + + // Replay the edit-script. + var ix, iy int + for _, e := range es { + switch e { + case diff.UniqueX: + step.xkey, step.ykey = ix, -1 + s.report(false, vx.Index(ix), nothing) + ix++ + case diff.UniqueY: + step.xkey, step.ykey = -1, iy + s.report(false, nothing, vy.Index(iy)) + iy++ + default: + step.xkey, step.ykey = ix, iy + if e == diff.Identity { + s.report(true, vx.Index(ix), vy.Index(iy)) + } else { + s.compareAny(vx.Index(ix), vy.Index(iy)) + } + ix++ + iy++ + } + } + s.curPath.pop() + return +} + +func (s *state) compareMap(vx, vy reflect.Value, t reflect.Type) { + if vx.IsNil() || vy.IsNil() { + s.report(vx.IsNil() && vy.IsNil(), vx, vy) + return + } + + // We combine and sort the two map keys so that we can perform the + // comparisons in a deterministic order. + step := &mapIndex{pathStep: pathStep{t.Elem()}} + s.curPath.push(step) + defer s.curPath.pop() + for _, k := range value.SortKeys(append(vx.MapKeys(), vy.MapKeys()...)) { + step.key = k + vvx := vx.MapIndex(k) + vvy := vy.MapIndex(k) + switch { + case vvx.IsValid() && vvy.IsValid(): + s.compareAny(vvx, vvy) + case vvx.IsValid() && !vvy.IsValid(): + s.report(false, vvx, nothing) + case !vvx.IsValid() && vvy.IsValid(): + s.report(false, nothing, vvy) + default: + // It is possible for both vvx and vvy to be invalid if the + // key contained a NaN value in it. There is no way in + // reflection to be able to retrieve these values. + // See https://golang.org/issue/11104 + panic(fmt.Sprintf("%#v has map key with NaNs", s.curPath)) + } + } +} + +func (s *state) compareStruct(vx, vy reflect.Value, t reflect.Type) { + var vax, vay reflect.Value // Addressable versions of vx and vy + + step := &structField{} + s.curPath.push(step) + defer s.curPath.pop() + for i := 0; i < t.NumField(); i++ { + vvx := vx.Field(i) + vvy := vy.Field(i) + step.typ = t.Field(i).Type + step.name = t.Field(i).Name + step.idx = i + step.unexported = !isExported(step.name) + if step.unexported { + // Defer checking of unexported fields until later to give an + // Ignore a chance to ignore the field. + if !vax.IsValid() || !vay.IsValid() { + // For unsafeRetrieveField to work, the parent struct must + // be addressable. Create a new copy of the values if + // necessary to make them addressable. + vax = makeAddressable(vx) + vay = makeAddressable(vy) + } + step.force = s.exporters[t] + step.pvx = vax + step.pvy = vay + step.field = t.Field(i) + } + s.compareAny(vvx, vvy) + } +} + +// report records the result of a single comparison. +// It also calls Report if any reporter is registered. +func (s *state) report(eq bool, vx, vy reflect.Value) { + if eq { + s.result.NSame++ + } else { + s.result.NDiff++ + } + if s.reporter != nil { + s.reporter.Report(vx, vy, eq, s.curPath) + } +} + +// dynChecker tracks the state needed to periodically perform checks that +// user provided functions are symmetric and deterministic. +// The zero value is safe for immediate use. +type dynChecker struct{ curr, next int } + +// Next increments the state and reports whether a check should be performed. +// +// Checks occur every Nth function call, where N is a triangular number: +// 0 1 3 6 10 15 21 28 36 45 55 66 78 91 105 120 136 153 171 190 ... +// See https://en.wikipedia.org/wiki/Triangular_number +// +// This sequence ensures that the cost of checks drops significantly as +// the number of functions calls grows larger. +func (dc *dynChecker) Next() bool { + ok := dc.curr == dc.next + if ok { + dc.curr = 0 + dc.next++ + } + dc.curr++ + return ok +} + +// makeAddressable returns a value that is always addressable. +// It returns the input verbatim if it is already addressable, +// otherwise it creates a new value and returns an addressable copy. +func makeAddressable(v reflect.Value) reflect.Value { + if v.CanAddr() { + return v + } + vc := reflect.New(v.Type()).Elem() + vc.Set(v) + return vc +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/cmp/internal/diff/debug_disable.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/cmp/internal/diff/debug_disable.go new file mode 100644 index 00000000..42afa496 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/cmp/internal/diff/debug_disable.go @@ -0,0 +1,17 @@ +// Copyright 2017, The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE.md file. + +// +build !debug + +package diff + +var debug debugger + +type debugger struct{} + +func (debugger) Begin(_, _ int, f EqualFunc, _, _ *EditScript) EqualFunc { + return f +} +func (debugger) Update() {} +func (debugger) Finish() {} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/cmp/internal/diff/debug_enable.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/cmp/internal/diff/debug_enable.go new file mode 100644 index 00000000..fd9f7f17 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/cmp/internal/diff/debug_enable.go @@ -0,0 +1,122 @@ +// Copyright 2017, The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE.md file. + +// +build debug + +package diff + +import ( + "fmt" + "strings" + "sync" + "time" +) + +// The algorithm can be seen running in real-time by enabling debugging: +// go test -tags=debug -v +// +// Example output: +// === RUN TestDifference/#34 +// ┌───────────────────────────────┠+// │ \ · · · · · · · · · · · · · · │ +// │ · # · · · · · · · · · · · · · │ +// │ · \ · · · · · · · · · · · · · │ +// │ · · \ · · · · · · · · · · · · │ +// │ · · · X # · · · · · · · · · · │ +// │ · · · # \ · · · · · · · · · · │ +// │ · · · · · # # · · · · · · · · │ +// │ · · · · · # \ · · · · · · · · │ +// │ · · · · · · · \ · · · · · · · │ +// │ · · · · · · · · \ · · · · · · │ +// │ · · · · · · · · · \ · · · · · │ +// │ · · · · · · · · · · \ · · # · │ +// │ · · · · · · · · · · · \ # # · │ +// │ · · · · · · · · · · · # # # · │ +// │ · · · · · · · · · · # # # # · │ +// │ · · · · · · · · · # # # # # · │ +// │ · · · · · · · · · · · · · · \ │ +// └───────────────────────────────┘ +// [.Y..M.XY......YXYXY.|] +// +// The grid represents the edit-graph where the horizontal axis represents +// list X and the vertical axis represents list Y. The start of the two lists +// is the top-left, while the ends are the bottom-right. The '·' represents +// an unexplored node in the graph. The '\' indicates that the two symbols +// from list X and Y are equal. The 'X' indicates that two symbols are similar +// (but not exactly equal) to each other. The '#' indicates that the two symbols +// are different (and not similar). The algorithm traverses this graph trying to +// make the paths starting in the top-left and the bottom-right connect. +// +// The series of '.', 'X', 'Y', and 'M' characters at the bottom represents +// the currently established path from the forward and reverse searches, +// separated by a '|' character. + +const ( + updateDelay = 100 * time.Millisecond + finishDelay = 500 * time.Millisecond + ansiTerminal = true // ANSI escape codes used to move terminal cursor +) + +var debug debugger + +type debugger struct { + sync.Mutex + p1, p2 EditScript + fwdPath, revPath *EditScript + grid []byte + lines int +} + +func (dbg *debugger) Begin(nx, ny int, f EqualFunc, p1, p2 *EditScript) EqualFunc { + dbg.Lock() + dbg.fwdPath, dbg.revPath = p1, p2 + top := "┌─" + strings.Repeat("──", nx) + "â”\n" + row := "│ " + strings.Repeat("· ", nx) + "│\n" + btm := "└─" + strings.Repeat("──", nx) + "┘\n" + dbg.grid = []byte(top + strings.Repeat(row, ny) + btm) + dbg.lines = strings.Count(dbg.String(), "\n") + fmt.Print(dbg) + + // Wrap the EqualFunc so that we can intercept each result. + return func(ix, iy int) (r Result) { + cell := dbg.grid[len(top)+iy*len(row):][len("│ ")+len("· ")*ix:][:len("·")] + for i := range cell { + cell[i] = 0 // Zero out the multiple bytes of UTF-8 middle-dot + } + switch r = f(ix, iy); { + case r.Equal(): + cell[0] = '\\' + case r.Similar(): + cell[0] = 'X' + default: + cell[0] = '#' + } + return + } +} + +func (dbg *debugger) Update() { + dbg.print(updateDelay) +} + +func (dbg *debugger) Finish() { + dbg.print(finishDelay) + dbg.Unlock() +} + +func (dbg *debugger) String() string { + dbg.p1, dbg.p2 = *dbg.fwdPath, dbg.p2[:0] + for i := len(*dbg.revPath) - 1; i >= 0; i-- { + dbg.p2 = append(dbg.p2, (*dbg.revPath)[i]) + } + return fmt.Sprintf("%s[%v|%v]\n\n", dbg.grid, dbg.p1, dbg.p2) +} + +func (dbg *debugger) print(d time.Duration) { + if ansiTerminal { + fmt.Printf("\x1b[%dA", dbg.lines) // Reset terminal cursor + } + fmt.Print(dbg) + time.Sleep(d) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/cmp/internal/diff/diff.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/cmp/internal/diff/diff.go new file mode 100644 index 00000000..260befea --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/cmp/internal/diff/diff.go @@ -0,0 +1,363 @@ +// Copyright 2017, The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE.md file. + +// Package diff implements an algorithm for producing edit-scripts. +// The edit-script is a sequence of operations needed to transform one list +// of symbols into another (or vice-versa). The edits allowed are insertions, +// deletions, and modifications. The summation of all edits is called the +// Levenshtein distance as this problem is well-known in computer science. +// +// This package prioritizes performance over accuracy. That is, the run time +// is more important than obtaining a minimal Levenshtein distance. +package diff + +// EditType represents a single operation within an edit-script. +type EditType uint8 + +const ( + // Identity indicates that a symbol pair is identical in both list X and Y. + Identity EditType = iota + // UniqueX indicates that a symbol only exists in X and not Y. + UniqueX + // UniqueY indicates that a symbol only exists in Y and not X. + UniqueY + // Modified indicates that a symbol pair is a modification of each other. + Modified +) + +// EditScript represents the series of differences between two lists. +type EditScript []EditType + +// String returns a human-readable string representing the edit-script where +// Identity, UniqueX, UniqueY, and Modified are represented by the +// '.', 'X', 'Y', and 'M' characters, respectively. +func (es EditScript) String() string { + b := make([]byte, len(es)) + for i, e := range es { + switch e { + case Identity: + b[i] = '.' + case UniqueX: + b[i] = 'X' + case UniqueY: + b[i] = 'Y' + case Modified: + b[i] = 'M' + default: + panic("invalid edit-type") + } + } + return string(b) +} + +// stats returns a histogram of the number of each type of edit operation. +func (es EditScript) stats() (s struct{ NI, NX, NY, NM int }) { + for _, e := range es { + switch e { + case Identity: + s.NI++ + case UniqueX: + s.NX++ + case UniqueY: + s.NY++ + case Modified: + s.NM++ + default: + panic("invalid edit-type") + } + } + return +} + +// Dist is the Levenshtein distance and is guaranteed to be 0 if and only if +// lists X and Y are equal. +func (es EditScript) Dist() int { return len(es) - es.stats().NI } + +// LenX is the length of the X list. +func (es EditScript) LenX() int { return len(es) - es.stats().NY } + +// LenY is the length of the Y list. +func (es EditScript) LenY() int { return len(es) - es.stats().NX } + +// EqualFunc reports whether the symbols at indexes ix and iy are equal. +// When called by Difference, the index is guaranteed to be within nx and ny. +type EqualFunc func(ix int, iy int) Result + +// Result is the result of comparison. +// NSame is the number of sub-elements that are equal. +// NDiff is the number of sub-elements that are not equal. +type Result struct{ NSame, NDiff int } + +// Equal indicates whether the symbols are equal. Two symbols are equal +// if and only if NDiff == 0. If Equal, then they are also Similar. +func (r Result) Equal() bool { return r.NDiff == 0 } + +// Similar indicates whether two symbols are similar and may be represented +// by using the Modified type. As a special case, we consider binary comparisons +// (i.e., those that return Result{1, 0} or Result{0, 1}) to be similar. +// +// The exact ratio of NSame to NDiff to determine similarity may change. +func (r Result) Similar() bool { + // Use NSame+1 to offset NSame so that binary comparisons are similar. + return r.NSame+1 >= r.NDiff +} + +// Difference reports whether two lists of lengths nx and ny are equal +// given the definition of equality provided as f. +// +// This function returns an edit-script, which is a sequence of operations +// needed to convert one list into the other. The following invariants for +// the edit-script are maintained: +// • eq == (es.Dist()==0) +// • nx == es.LenX() +// • ny == es.LenY() +// +// This algorithm is not guaranteed to be an optimal solution (i.e., one that +// produces an edit-script with a minimal Levenshtein distance). This algorithm +// favors performance over optimality. The exact output is not guaranteed to +// be stable and may change over time. +func Difference(nx, ny int, f EqualFunc) (es EditScript) { + // This algorithm is based on traversing what is known as an "edit-graph". + // See Figure 1 from "An O(ND) Difference Algorithm and Its Variations" + // by Eugene W. Myers. Since D can be as large as N itself, this is + // effectively O(N^2). Unlike the algorithm from that paper, we are not + // interested in the optimal path, but at least some "decent" path. + // + // For example, let X and Y be lists of symbols: + // X = [A B C A B B A] + // Y = [C B A B A C] + // + // The edit-graph can be drawn as the following: + // A B C A B B A + // ┌─────────────┠+ // C │_|_|\|_|_|_|_│ 0 + // B │_|\|_|_|\|\|_│ 1 + // A │\|_|_|\|_|_|\│ 2 + // B │_|\|_|_|\|\|_│ 3 + // A │\|_|_|\|_|_|\│ 4 + // C │ | |\| | | | │ 5 + // └─────────────┘ 6 + // 0 1 2 3 4 5 6 7 + // + // List X is written along the horizontal axis, while list Y is written + // along the vertical axis. At any point on this grid, if the symbol in + // list X matches the corresponding symbol in list Y, then a '\' is drawn. + // The goal of any minimal edit-script algorithm is to find a path from the + // top-left corner to the bottom-right corner, while traveling through the + // fewest horizontal or vertical edges. + // A horizontal edge is equivalent to inserting a symbol from list X. + // A vertical edge is equivalent to inserting a symbol from list Y. + // A diagonal edge is equivalent to a matching symbol between both X and Y. + + // Invariants: + // • 0 ≤ fwdPath.X ≤ (fwdFrontier.X, revFrontier.X) ≤ revPath.X ≤ nx + // • 0 ≤ fwdPath.Y ≤ (fwdFrontier.Y, revFrontier.Y) ≤ revPath.Y ≤ ny + // + // In general: + // • fwdFrontier.X < revFrontier.X + // • fwdFrontier.Y < revFrontier.Y + // Unless, it is time for the algorithm to terminate. + fwdPath := path{+1, point{0, 0}, make(EditScript, 0, (nx+ny)/2)} + revPath := path{-1, point{nx, ny}, make(EditScript, 0)} + fwdFrontier := fwdPath.point // Forward search frontier + revFrontier := revPath.point // Reverse search frontier + + // Search budget bounds the cost of searching for better paths. + // The longest sequence of non-matching symbols that can be tolerated is + // approximately the square-root of the search budget. + searchBudget := 4 * (nx + ny) // O(n) + + // The algorithm below is a greedy, meet-in-the-middle algorithm for + // computing sub-optimal edit-scripts between two lists. + // + // The algorithm is approximately as follows: + // • Searching for differences switches back-and-forth between + // a search that starts at the beginning (the top-left corner), and + // a search that starts at the end (the bottom-right corner). The goal of + // the search is connect with the search from the opposite corner. + // • As we search, we build a path in a greedy manner, where the first + // match seen is added to the path (this is sub-optimal, but provides a + // decent result in practice). When matches are found, we try the next pair + // of symbols in the lists and follow all matches as far as possible. + // • When searching for matches, we search along a diagonal going through + // through the "frontier" point. If no matches are found, we advance the + // frontier towards the opposite corner. + // • This algorithm terminates when either the X coordinates or the + // Y coordinates of the forward and reverse frontier points ever intersect. + // + // This algorithm is correct even if searching only in the forward direction + // or in the reverse direction. We do both because it is commonly observed + // that two lists commonly differ because elements were added to the front + // or end of the other list. + // + // Running the tests with the "debug" build tag prints a visualization of + // the algorithm running in real-time. This is educational for understanding + // how the algorithm works. See debug_enable.go. + f = debug.Begin(nx, ny, f, &fwdPath.es, &revPath.es) + for { + // Forward search from the beginning. + if fwdFrontier.X >= revFrontier.X || fwdFrontier.Y >= revFrontier.Y || searchBudget == 0 { + break + } + for stop1, stop2, i := false, false, 0; !(stop1 && stop2) && searchBudget > 0; i++ { + // Search in a diagonal pattern for a match. + z := zigzag(i) + p := point{fwdFrontier.X + z, fwdFrontier.Y - z} + switch { + case p.X >= revPath.X || p.Y < fwdPath.Y: + stop1 = true // Hit top-right corner + case p.Y >= revPath.Y || p.X < fwdPath.X: + stop2 = true // Hit bottom-left corner + case f(p.X, p.Y).Equal(): + // Match found, so connect the path to this point. + fwdPath.connect(p, f) + fwdPath.append(Identity) + // Follow sequence of matches as far as possible. + for fwdPath.X < revPath.X && fwdPath.Y < revPath.Y { + if !f(fwdPath.X, fwdPath.Y).Equal() { + break + } + fwdPath.append(Identity) + } + fwdFrontier = fwdPath.point + stop1, stop2 = true, true + default: + searchBudget-- // Match not found + } + debug.Update() + } + // Advance the frontier towards reverse point. + if revPath.X-fwdFrontier.X >= revPath.Y-fwdFrontier.Y { + fwdFrontier.X++ + } else { + fwdFrontier.Y++ + } + + // Reverse search from the end. + if fwdFrontier.X >= revFrontier.X || fwdFrontier.Y >= revFrontier.Y || searchBudget == 0 { + break + } + for stop1, stop2, i := false, false, 0; !(stop1 && stop2) && searchBudget > 0; i++ { + // Search in a diagonal pattern for a match. + z := zigzag(i) + p := point{revFrontier.X - z, revFrontier.Y + z} + switch { + case fwdPath.X >= p.X || revPath.Y < p.Y: + stop1 = true // Hit bottom-left corner + case fwdPath.Y >= p.Y || revPath.X < p.X: + stop2 = true // Hit top-right corner + case f(p.X-1, p.Y-1).Equal(): + // Match found, so connect the path to this point. + revPath.connect(p, f) + revPath.append(Identity) + // Follow sequence of matches as far as possible. + for fwdPath.X < revPath.X && fwdPath.Y < revPath.Y { + if !f(revPath.X-1, revPath.Y-1).Equal() { + break + } + revPath.append(Identity) + } + revFrontier = revPath.point + stop1, stop2 = true, true + default: + searchBudget-- // Match not found + } + debug.Update() + } + // Advance the frontier towards forward point. + if revFrontier.X-fwdPath.X >= revFrontier.Y-fwdPath.Y { + revFrontier.X-- + } else { + revFrontier.Y-- + } + } + + // Join the forward and reverse paths and then append the reverse path. + fwdPath.connect(revPath.point, f) + for i := len(revPath.es) - 1; i >= 0; i-- { + t := revPath.es[i] + revPath.es = revPath.es[:i] + fwdPath.append(t) + } + debug.Finish() + return fwdPath.es +} + +type path struct { + dir int // +1 if forward, -1 if reverse + point // Leading point of the EditScript path + es EditScript +} + +// connect appends any necessary Identity, Modified, UniqueX, or UniqueY types +// to the edit-script to connect p.point to dst. +func (p *path) connect(dst point, f EqualFunc) { + if p.dir > 0 { + // Connect in forward direction. + for dst.X > p.X && dst.Y > p.Y { + switch r := f(p.X, p.Y); { + case r.Equal(): + p.append(Identity) + case r.Similar(): + p.append(Modified) + case dst.X-p.X >= dst.Y-p.Y: + p.append(UniqueX) + default: + p.append(UniqueY) + } + } + for dst.X > p.X { + p.append(UniqueX) + } + for dst.Y > p.Y { + p.append(UniqueY) + } + } else { + // Connect in reverse direction. + for p.X > dst.X && p.Y > dst.Y { + switch r := f(p.X-1, p.Y-1); { + case r.Equal(): + p.append(Identity) + case r.Similar(): + p.append(Modified) + case p.Y-dst.Y >= p.X-dst.X: + p.append(UniqueY) + default: + p.append(UniqueX) + } + } + for p.X > dst.X { + p.append(UniqueX) + } + for p.Y > dst.Y { + p.append(UniqueY) + } + } +} + +func (p *path) append(t EditType) { + p.es = append(p.es, t) + switch t { + case Identity, Modified: + p.add(p.dir, p.dir) + case UniqueX: + p.add(p.dir, 0) + case UniqueY: + p.add(0, p.dir) + } + debug.Update() +} + +type point struct{ X, Y int } + +func (p *point) add(dx, dy int) { p.X += dx; p.Y += dy } + +// zigzag maps a consecutive sequence of integers to a zig-zag sequence. +// [0 1 2 3 4 5 ...] => [0 -1 +1 -2 +2 ...] +func zigzag(x int) int { + if x&1 != 0 { + x = ^x + } + return x >> 1 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/cmp/internal/function/func.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/cmp/internal/function/func.go new file mode 100644 index 00000000..4c35ff11 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/cmp/internal/function/func.go @@ -0,0 +1,49 @@ +// Copyright 2017, The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE.md file. + +// Package function identifies function types. +package function + +import "reflect" + +type funcType int + +const ( + _ funcType = iota + + ttbFunc // func(T, T) bool + tibFunc // func(T, I) bool + trFunc // func(T) R + + Equal = ttbFunc // func(T, T) bool + EqualAssignable = tibFunc // func(T, I) bool; encapsulates func(T, T) bool + Transformer = trFunc // func(T) R + ValueFilter = ttbFunc // func(T, T) bool + Less = ttbFunc // func(T, T) bool +) + +var boolType = reflect.TypeOf(true) + +// IsType reports whether the reflect.Type is of the specified function type. +func IsType(t reflect.Type, ft funcType) bool { + if t == nil || t.Kind() != reflect.Func || t.IsVariadic() { + return false + } + ni, no := t.NumIn(), t.NumOut() + switch ft { + case ttbFunc: // func(T, T) bool + if ni == 2 && no == 1 && t.In(0) == t.In(1) && t.Out(0) == boolType { + return true + } + case tibFunc: // func(T, I) bool + if ni == 2 && no == 1 && t.In(0).AssignableTo(t.In(1)) && t.Out(0) == boolType { + return true + } + case trFunc: // func(T) R + if ni == 1 && no == 1 { + return true + } + } + return false +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/cmp/internal/value/format.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/cmp/internal/value/format.go new file mode 100644 index 00000000..657e5087 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/cmp/internal/value/format.go @@ -0,0 +1,277 @@ +// Copyright 2017, The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE.md file. + +// Package value provides functionality for reflect.Value types. +package value + +import ( + "fmt" + "reflect" + "strconv" + "strings" + "unicode" +) + +var stringerIface = reflect.TypeOf((*fmt.Stringer)(nil)).Elem() + +// Format formats the value v as a string. +// +// This is similar to fmt.Sprintf("%+v", v) except this: +// * Prints the type unless it can be elided +// * Avoids printing struct fields that are zero +// * Prints a nil-slice as being nil, not empty +// * Prints map entries in deterministic order +func Format(v reflect.Value, conf FormatConfig) string { + conf.printType = true + conf.followPointers = true + conf.realPointers = true + return formatAny(v, conf, nil) +} + +type FormatConfig struct { + UseStringer bool // Should the String method be used if available? + printType bool // Should we print the type before the value? + PrintPrimitiveType bool // Should we print the type of primitives? + followPointers bool // Should we recursively follow pointers? + realPointers bool // Should we print the real address of pointers? +} + +func formatAny(v reflect.Value, conf FormatConfig, visited map[uintptr]bool) string { + // TODO: Should this be a multi-line printout in certain situations? + + if !v.IsValid() { + return "" + } + if conf.UseStringer && v.Type().Implements(stringerIface) && v.CanInterface() { + if (v.Kind() == reflect.Ptr || v.Kind() == reflect.Interface) && v.IsNil() { + return "" + } + + const stringerPrefix = "s" // Indicates that the String method was used + s := v.Interface().(fmt.Stringer).String() + return stringerPrefix + formatString(s) + } + + switch v.Kind() { + case reflect.Bool: + return formatPrimitive(v.Type(), v.Bool(), conf) + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return formatPrimitive(v.Type(), v.Int(), conf) + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + if v.Type().PkgPath() == "" || v.Kind() == reflect.Uintptr { + // Unnamed uints are usually bytes or words, so use hexadecimal. + return formatPrimitive(v.Type(), formatHex(v.Uint()), conf) + } + return formatPrimitive(v.Type(), v.Uint(), conf) + case reflect.Float32, reflect.Float64: + return formatPrimitive(v.Type(), v.Float(), conf) + case reflect.Complex64, reflect.Complex128: + return formatPrimitive(v.Type(), v.Complex(), conf) + case reflect.String: + return formatPrimitive(v.Type(), formatString(v.String()), conf) + case reflect.UnsafePointer, reflect.Chan, reflect.Func: + return formatPointer(v, conf) + case reflect.Ptr: + if v.IsNil() { + if conf.printType { + return fmt.Sprintf("(%v)(nil)", v.Type()) + } + return "" + } + if visited[v.Pointer()] || !conf.followPointers { + return formatPointer(v, conf) + } + visited = insertPointer(visited, v.Pointer()) + return "&" + formatAny(v.Elem(), conf, visited) + case reflect.Interface: + if v.IsNil() { + if conf.printType { + return fmt.Sprintf("%v(nil)", v.Type()) + } + return "" + } + return formatAny(v.Elem(), conf, visited) + case reflect.Slice: + if v.IsNil() { + if conf.printType { + return fmt.Sprintf("%v(nil)", v.Type()) + } + return "" + } + if visited[v.Pointer()] { + return formatPointer(v, conf) + } + visited = insertPointer(visited, v.Pointer()) + fallthrough + case reflect.Array: + var ss []string + subConf := conf + subConf.printType = v.Type().Elem().Kind() == reflect.Interface + for i := 0; i < v.Len(); i++ { + s := formatAny(v.Index(i), subConf, visited) + ss = append(ss, s) + } + s := fmt.Sprintf("{%s}", strings.Join(ss, ", ")) + if conf.printType { + return v.Type().String() + s + } + return s + case reflect.Map: + if v.IsNil() { + if conf.printType { + return fmt.Sprintf("%v(nil)", v.Type()) + } + return "" + } + if visited[v.Pointer()] { + return formatPointer(v, conf) + } + visited = insertPointer(visited, v.Pointer()) + + var ss []string + keyConf, valConf := conf, conf + keyConf.printType = v.Type().Key().Kind() == reflect.Interface + keyConf.followPointers = false + valConf.printType = v.Type().Elem().Kind() == reflect.Interface + for _, k := range SortKeys(v.MapKeys()) { + sk := formatAny(k, keyConf, visited) + sv := formatAny(v.MapIndex(k), valConf, visited) + ss = append(ss, fmt.Sprintf("%s: %s", sk, sv)) + } + s := fmt.Sprintf("{%s}", strings.Join(ss, ", ")) + if conf.printType { + return v.Type().String() + s + } + return s + case reflect.Struct: + var ss []string + subConf := conf + subConf.printType = true + for i := 0; i < v.NumField(); i++ { + vv := v.Field(i) + if isZero(vv) { + continue // Elide zero value fields + } + name := v.Type().Field(i).Name + subConf.UseStringer = conf.UseStringer + s := formatAny(vv, subConf, visited) + ss = append(ss, fmt.Sprintf("%s: %s", name, s)) + } + s := fmt.Sprintf("{%s}", strings.Join(ss, ", ")) + if conf.printType { + return v.Type().String() + s + } + return s + default: + panic(fmt.Sprintf("%v kind not handled", v.Kind())) + } +} + +func formatString(s string) string { + // Use quoted string if it the same length as a raw string literal. + // Otherwise, attempt to use the raw string form. + qs := strconv.Quote(s) + if len(qs) == 1+len(s)+1 { + return qs + } + + // Disallow newlines to ensure output is a single line. + // Only allow printable runes for readability purposes. + rawInvalid := func(r rune) bool { + return r == '`' || r == '\n' || !unicode.IsPrint(r) + } + if strings.IndexFunc(s, rawInvalid) < 0 { + return "`" + s + "`" + } + return qs +} + +func formatPrimitive(t reflect.Type, v interface{}, conf FormatConfig) string { + if conf.printType && (conf.PrintPrimitiveType || t.PkgPath() != "") { + return fmt.Sprintf("%v(%v)", t, v) + } + return fmt.Sprintf("%v", v) +} + +func formatPointer(v reflect.Value, conf FormatConfig) string { + p := v.Pointer() + if !conf.realPointers { + p = 0 // For deterministic printing purposes + } + s := formatHex(uint64(p)) + if conf.printType { + return fmt.Sprintf("(%v)(%s)", v.Type(), s) + } + return s +} + +func formatHex(u uint64) string { + var f string + switch { + case u <= 0xff: + f = "0x%02x" + case u <= 0xffff: + f = "0x%04x" + case u <= 0xffffff: + f = "0x%06x" + case u <= 0xffffffff: + f = "0x%08x" + case u <= 0xffffffffff: + f = "0x%010x" + case u <= 0xffffffffffff: + f = "0x%012x" + case u <= 0xffffffffffffff: + f = "0x%014x" + case u <= 0xffffffffffffffff: + f = "0x%016x" + } + return fmt.Sprintf(f, u) +} + +// insertPointer insert p into m, allocating m if necessary. +func insertPointer(m map[uintptr]bool, p uintptr) map[uintptr]bool { + if m == nil { + m = make(map[uintptr]bool) + } + m[p] = true + return m +} + +// isZero reports whether v is the zero value. +// This does not rely on Interface and so can be used on unexported fields. +func isZero(v reflect.Value) bool { + switch v.Kind() { + case reflect.Bool: + return v.Bool() == false + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return v.Int() == 0 + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return v.Uint() == 0 + case reflect.Float32, reflect.Float64: + return v.Float() == 0 + case reflect.Complex64, reflect.Complex128: + return v.Complex() == 0 + case reflect.String: + return v.String() == "" + case reflect.UnsafePointer: + return v.Pointer() == 0 + case reflect.Chan, reflect.Func, reflect.Interface, reflect.Ptr, reflect.Map, reflect.Slice: + return v.IsNil() + case reflect.Array: + for i := 0; i < v.Len(); i++ { + if !isZero(v.Index(i)) { + return false + } + } + return true + case reflect.Struct: + for i := 0; i < v.NumField(); i++ { + if !isZero(v.Field(i)) { + return false + } + } + return true + } + return false +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/cmp/internal/value/sort.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/cmp/internal/value/sort.go new file mode 100644 index 00000000..fe8aa27a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/cmp/internal/value/sort.go @@ -0,0 +1,111 @@ +// Copyright 2017, The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE.md file. + +package value + +import ( + "fmt" + "math" + "reflect" + "sort" +) + +// SortKeys sorts a list of map keys, deduplicating keys if necessary. +// The type of each value must be comparable. +func SortKeys(vs []reflect.Value) []reflect.Value { + if len(vs) == 0 { + return vs + } + + // Sort the map keys. + sort.Sort(valueSorter(vs)) + + // Deduplicate keys (fails for NaNs). + vs2 := vs[:1] + for _, v := range vs[1:] { + if isLess(vs2[len(vs2)-1], v) { + vs2 = append(vs2, v) + } + } + return vs2 +} + +// TODO: Use sort.Slice once Google AppEngine is on Go1.8 or above. +type valueSorter []reflect.Value + +func (vs valueSorter) Len() int { return len(vs) } +func (vs valueSorter) Less(i, j int) bool { return isLess(vs[i], vs[j]) } +func (vs valueSorter) Swap(i, j int) { vs[i], vs[j] = vs[j], vs[i] } + +// isLess is a generic function for sorting arbitrary map keys. +// The inputs must be of the same type and must be comparable. +func isLess(x, y reflect.Value) bool { + switch x.Type().Kind() { + case reflect.Bool: + return !x.Bool() && y.Bool() + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return x.Int() < y.Int() + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return x.Uint() < y.Uint() + case reflect.Float32, reflect.Float64: + fx, fy := x.Float(), y.Float() + return fx < fy || math.IsNaN(fx) && !math.IsNaN(fy) + case reflect.Complex64, reflect.Complex128: + cx, cy := x.Complex(), y.Complex() + rx, ix, ry, iy := real(cx), imag(cx), real(cy), imag(cy) + if rx == ry || (math.IsNaN(rx) && math.IsNaN(ry)) { + return ix < iy || math.IsNaN(ix) && !math.IsNaN(iy) + } + return rx < ry || math.IsNaN(rx) && !math.IsNaN(ry) + case reflect.Ptr, reflect.UnsafePointer, reflect.Chan: + return x.Pointer() < y.Pointer() + case reflect.String: + return x.String() < y.String() + case reflect.Array: + for i := 0; i < x.Len(); i++ { + if isLess(x.Index(i), y.Index(i)) { + return true + } + if isLess(y.Index(i), x.Index(i)) { + return false + } + } + return false + case reflect.Struct: + for i := 0; i < x.NumField(); i++ { + if isLess(x.Field(i), y.Field(i)) { + return true + } + if isLess(y.Field(i), x.Field(i)) { + return false + } + } + return false + case reflect.Interface: + vx, vy := x.Elem(), y.Elem() + if !vx.IsValid() || !vy.IsValid() { + return !vx.IsValid() && vy.IsValid() + } + tx, ty := vx.Type(), vy.Type() + if tx == ty { + return isLess(x.Elem(), y.Elem()) + } + if tx.Kind() != ty.Kind() { + return vx.Kind() < vy.Kind() + } + if tx.String() != ty.String() { + return tx.String() < ty.String() + } + if tx.PkgPath() != ty.PkgPath() { + return tx.PkgPath() < ty.PkgPath() + } + // This can happen in rare situations, so we fallback to just comparing + // the unique pointer for a reflect.Type. This guarantees deterministic + // ordering within a program, but it is obviously not stable. + return reflect.ValueOf(vx.Type()).Pointer() < reflect.ValueOf(vy.Type()).Pointer() + default: + // Must be Func, Map, or Slice; which are not comparable. + panic(fmt.Sprintf("%T is not comparable", x.Type())) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/cmp/options.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/cmp/options.go new file mode 100644 index 00000000..91d4b066 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/cmp/options.go @@ -0,0 +1,453 @@ +// Copyright 2017, The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE.md file. + +package cmp + +import ( + "fmt" + "reflect" + "runtime" + "strings" + + "github.com/google/go-cmp/cmp/internal/function" +) + +// Option configures for specific behavior of Equal and Diff. In particular, +// the fundamental Option functions (Ignore, Transformer, and Comparer), +// configure how equality is determined. +// +// The fundamental options may be composed with filters (FilterPath and +// FilterValues) to control the scope over which they are applied. +// +// The cmp/cmpopts package provides helper functions for creating options that +// may be used with Equal and Diff. +type Option interface { + // filter applies all filters and returns the option that remains. + // Each option may only read s.curPath and call s.callTTBFunc. + // + // An Options is returned only if multiple comparers or transformers + // can apply simultaneously and will only contain values of those types + // or sub-Options containing values of those types. + filter(s *state, vx, vy reflect.Value, t reflect.Type) applicableOption +} + +// applicableOption represents the following types: +// Fundamental: ignore | invalid | *comparer | *transformer +// Grouping: Options +type applicableOption interface { + Option + + // apply executes the option, which may mutate s or panic. + apply(s *state, vx, vy reflect.Value) +} + +// coreOption represents the following types: +// Fundamental: ignore | invalid | *comparer | *transformer +// Filters: *pathFilter | *valuesFilter +type coreOption interface { + Option + isCore() +} + +type core struct{} + +func (core) isCore() {} + +// Options is a list of Option values that also satisfies the Option interface. +// Helper comparison packages may return an Options value when packing multiple +// Option values into a single Option. When this package processes an Options, +// it will be implicitly expanded into a flat list. +// +// Applying a filter on an Options is equivalent to applying that same filter +// on all individual options held within. +type Options []Option + +func (opts Options) filter(s *state, vx, vy reflect.Value, t reflect.Type) (out applicableOption) { + for _, opt := range opts { + switch opt := opt.filter(s, vx, vy, t); opt.(type) { + case ignore: + return ignore{} // Only ignore can short-circuit evaluation + case invalid: + out = invalid{} // Takes precedence over comparer or transformer + case *comparer, *transformer, Options: + switch out.(type) { + case nil: + out = opt + case invalid: + // Keep invalid + case *comparer, *transformer, Options: + out = Options{out, opt} // Conflicting comparers or transformers + } + } + } + return out +} + +func (opts Options) apply(s *state, _, _ reflect.Value) { + const warning = "ambiguous set of applicable options" + const help = "consider using filters to ensure at most one Comparer or Transformer may apply" + var ss []string + for _, opt := range flattenOptions(nil, opts) { + ss = append(ss, fmt.Sprint(opt)) + } + set := strings.Join(ss, "\n\t") + panic(fmt.Sprintf("%s at %#v:\n\t%s\n%s", warning, s.curPath, set, help)) +} + +func (opts Options) String() string { + var ss []string + for _, opt := range opts { + ss = append(ss, fmt.Sprint(opt)) + } + return fmt.Sprintf("Options{%s}", strings.Join(ss, ", ")) +} + +// FilterPath returns a new Option where opt is only evaluated if filter f +// returns true for the current Path in the value tree. +// +// The option passed in may be an Ignore, Transformer, Comparer, Options, or +// a previously filtered Option. +func FilterPath(f func(Path) bool, opt Option) Option { + if f == nil { + panic("invalid path filter function") + } + if opt := normalizeOption(opt); opt != nil { + return &pathFilter{fnc: f, opt: opt} + } + return nil +} + +type pathFilter struct { + core + fnc func(Path) bool + opt Option +} + +func (f pathFilter) filter(s *state, vx, vy reflect.Value, t reflect.Type) applicableOption { + if f.fnc(s.curPath) { + return f.opt.filter(s, vx, vy, t) + } + return nil +} + +func (f pathFilter) String() string { + fn := getFuncName(reflect.ValueOf(f.fnc).Pointer()) + return fmt.Sprintf("FilterPath(%s, %v)", fn, f.opt) +} + +// FilterValues returns a new Option where opt is only evaluated if filter f, +// which is a function of the form "func(T, T) bool", returns true for the +// current pair of values being compared. If the type of the values is not +// assignable to T, then this filter implicitly returns false. +// +// The filter function must be +// symmetric (i.e., agnostic to the order of the inputs) and +// deterministic (i.e., produces the same result when given the same inputs). +// If T is an interface, it is possible that f is called with two values with +// different concrete types that both implement T. +// +// The option passed in may be an Ignore, Transformer, Comparer, Options, or +// a previously filtered Option. +func FilterValues(f interface{}, opt Option) Option { + v := reflect.ValueOf(f) + if !function.IsType(v.Type(), function.ValueFilter) || v.IsNil() { + panic(fmt.Sprintf("invalid values filter function: %T", f)) + } + if opt := normalizeOption(opt); opt != nil { + vf := &valuesFilter{fnc: v, opt: opt} + if ti := v.Type().In(0); ti.Kind() != reflect.Interface || ti.NumMethod() > 0 { + vf.typ = ti + } + return vf + } + return nil +} + +type valuesFilter struct { + core + typ reflect.Type // T + fnc reflect.Value // func(T, T) bool + opt Option +} + +func (f valuesFilter) filter(s *state, vx, vy reflect.Value, t reflect.Type) applicableOption { + if !vx.IsValid() || !vy.IsValid() { + return invalid{} + } + if (f.typ == nil || t.AssignableTo(f.typ)) && s.callTTBFunc(f.fnc, vx, vy) { + return f.opt.filter(s, vx, vy, t) + } + return nil +} + +func (f valuesFilter) String() string { + fn := getFuncName(f.fnc.Pointer()) + return fmt.Sprintf("FilterValues(%s, %v)", fn, f.opt) +} + +// Ignore is an Option that causes all comparisons to be ignored. +// This value is intended to be combined with FilterPath or FilterValues. +// It is an error to pass an unfiltered Ignore option to Equal. +func Ignore() Option { return ignore{} } + +type ignore struct{ core } + +func (ignore) isFiltered() bool { return false } +func (ignore) filter(_ *state, _, _ reflect.Value, _ reflect.Type) applicableOption { return ignore{} } +func (ignore) apply(_ *state, _, _ reflect.Value) { return } +func (ignore) String() string { return "Ignore()" } + +// invalid is a sentinel Option type to indicate that some options could not +// be evaluated due to unexported fields. +type invalid struct{ core } + +func (invalid) filter(_ *state, _, _ reflect.Value, _ reflect.Type) applicableOption { return invalid{} } +func (invalid) apply(s *state, _, _ reflect.Value) { + const help = "consider using AllowUnexported or cmpopts.IgnoreUnexported" + panic(fmt.Sprintf("cannot handle unexported field: %#v\n%s", s.curPath, help)) +} + +// Transformer returns an Option that applies a transformation function that +// converts values of a certain type into that of another. +// +// The transformer f must be a function "func(T) R" that converts values of +// type T to those of type R and is implicitly filtered to input values +// assignable to T. The transformer must not mutate T in any way. +// +// To help prevent some cases of infinite recursive cycles applying the +// same transform to the output of itself (e.g., in the case where the +// input and output types are the same), an implicit filter is added such that +// a transformer is applicable only if that exact transformer is not already +// in the tail of the Path since the last non-Transform step. +// +// The name is a user provided label that is used as the Transform.Name in the +// transformation PathStep. If empty, an arbitrary name is used. +func Transformer(name string, f interface{}) Option { + v := reflect.ValueOf(f) + if !function.IsType(v.Type(), function.Transformer) || v.IsNil() { + panic(fmt.Sprintf("invalid transformer function: %T", f)) + } + if name == "" { + name = "λ" // Lambda-symbol as place-holder for anonymous transformer + } + if !isValid(name) { + panic(fmt.Sprintf("invalid name: %q", name)) + } + tr := &transformer{name: name, fnc: reflect.ValueOf(f)} + if ti := v.Type().In(0); ti.Kind() != reflect.Interface || ti.NumMethod() > 0 { + tr.typ = ti + } + return tr +} + +type transformer struct { + core + name string + typ reflect.Type // T + fnc reflect.Value // func(T) R +} + +func (tr *transformer) isFiltered() bool { return tr.typ != nil } + +func (tr *transformer) filter(s *state, _, _ reflect.Value, t reflect.Type) applicableOption { + for i := len(s.curPath) - 1; i >= 0; i-- { + if t, ok := s.curPath[i].(*transform); !ok { + break // Hit most recent non-Transform step + } else if tr == t.trans { + return nil // Cannot directly use same Transform + } + } + if tr.typ == nil || t.AssignableTo(tr.typ) { + return tr + } + return nil +} + +func (tr *transformer) apply(s *state, vx, vy reflect.Value) { + // Update path before calling the Transformer so that dynamic checks + // will use the updated path. + s.curPath.push(&transform{pathStep{tr.fnc.Type().Out(0)}, tr}) + defer s.curPath.pop() + + vx = s.callTRFunc(tr.fnc, vx) + vy = s.callTRFunc(tr.fnc, vy) + s.compareAny(vx, vy) +} + +func (tr transformer) String() string { + return fmt.Sprintf("Transformer(%s, %s)", tr.name, getFuncName(tr.fnc.Pointer())) +} + +// Comparer returns an Option that determines whether two values are equal +// to each other. +// +// The comparer f must be a function "func(T, T) bool" and is implicitly +// filtered to input values assignable to T. If T is an interface, it is +// possible that f is called with two values of different concrete types that +// both implement T. +// +// The equality function must be: +// • Symmetric: equal(x, y) == equal(y, x) +// • Deterministic: equal(x, y) == equal(x, y) +// • Pure: equal(x, y) does not modify x or y +func Comparer(f interface{}) Option { + v := reflect.ValueOf(f) + if !function.IsType(v.Type(), function.Equal) || v.IsNil() { + panic(fmt.Sprintf("invalid comparer function: %T", f)) + } + cm := &comparer{fnc: v} + if ti := v.Type().In(0); ti.Kind() != reflect.Interface || ti.NumMethod() > 0 { + cm.typ = ti + } + return cm +} + +type comparer struct { + core + typ reflect.Type // T + fnc reflect.Value // func(T, T) bool +} + +func (cm *comparer) isFiltered() bool { return cm.typ != nil } + +func (cm *comparer) filter(_ *state, _, _ reflect.Value, t reflect.Type) applicableOption { + if cm.typ == nil || t.AssignableTo(cm.typ) { + return cm + } + return nil +} + +func (cm *comparer) apply(s *state, vx, vy reflect.Value) { + eq := s.callTTBFunc(cm.fnc, vx, vy) + s.report(eq, vx, vy) +} + +func (cm comparer) String() string { + return fmt.Sprintf("Comparer(%s)", getFuncName(cm.fnc.Pointer())) +} + +// AllowUnexported returns an Option that forcibly allows operations on +// unexported fields in certain structs, which are specified by passing in a +// value of each struct type. +// +// Users of this option must understand that comparing on unexported fields +// from external packages is not safe since changes in the internal +// implementation of some external package may cause the result of Equal +// to unexpectedly change. However, it may be valid to use this option on types +// defined in an internal package where the semantic meaning of an unexported +// field is in the control of the user. +// +// For some cases, a custom Comparer should be used instead that defines +// equality as a function of the public API of a type rather than the underlying +// unexported implementation. +// +// For example, the reflect.Type documentation defines equality to be determined +// by the == operator on the interface (essentially performing a shallow pointer +// comparison) and most attempts to compare *regexp.Regexp types are interested +// in only checking that the regular expression strings are equal. +// Both of these are accomplished using Comparers: +// +// Comparer(func(x, y reflect.Type) bool { return x == y }) +// Comparer(func(x, y *regexp.Regexp) bool { return x.String() == y.String() }) +// +// In other cases, the cmpopts.IgnoreUnexported option can be used to ignore +// all unexported fields on specified struct types. +func AllowUnexported(types ...interface{}) Option { + if !supportAllowUnexported { + panic("AllowUnexported is not supported on purego builds, Google App Engine Standard, or GopherJS") + } + m := make(map[reflect.Type]bool) + for _, typ := range types { + t := reflect.TypeOf(typ) + if t.Kind() != reflect.Struct { + panic(fmt.Sprintf("invalid struct type: %T", typ)) + } + m[t] = true + } + return visibleStructs(m) +} + +type visibleStructs map[reflect.Type]bool + +func (visibleStructs) filter(_ *state, _, _ reflect.Value, _ reflect.Type) applicableOption { + panic("not implemented") +} + +// reporter is an Option that configures how differences are reported. +type reporter interface { + // TODO: Not exported yet. + // + // Perhaps add PushStep and PopStep and change Report to only accept + // a PathStep instead of the full-path? Adding a PushStep and PopStep makes + // it clear that we are traversing the value tree in a depth-first-search + // manner, which has an effect on how values are printed. + + Option + + // Report is called for every comparison made and will be provided with + // the two values being compared, the equality result, and the + // current path in the value tree. It is possible for x or y to be an + // invalid reflect.Value if one of the values is non-existent; + // which is possible with maps and slices. + Report(x, y reflect.Value, eq bool, p Path) +} + +// normalizeOption normalizes the input options such that all Options groups +// are flattened and groups with a single element are reduced to that element. +// Only coreOptions and Options containing coreOptions are allowed. +func normalizeOption(src Option) Option { + switch opts := flattenOptions(nil, Options{src}); len(opts) { + case 0: + return nil + case 1: + return opts[0] + default: + return opts + } +} + +// flattenOptions copies all options in src to dst as a flat list. +// Only coreOptions and Options containing coreOptions are allowed. +func flattenOptions(dst, src Options) Options { + for _, opt := range src { + switch opt := opt.(type) { + case nil: + continue + case Options: + dst = flattenOptions(dst, opt) + case coreOption: + dst = append(dst, opt) + default: + panic(fmt.Sprintf("invalid option type: %T", opt)) + } + } + return dst +} + +// getFuncName returns a short function name from the pointer. +// The string parsing logic works up until Go1.9. +func getFuncName(p uintptr) string { + fnc := runtime.FuncForPC(p) + if fnc == nil { + return "" + } + name := fnc.Name() // E.g., "long/path/name/mypkg.(mytype).(long/path/name/mypkg.myfunc)-fm" + if strings.HasSuffix(name, ")-fm") || strings.HasSuffix(name, ")·fm") { + // Strip the package name from method name. + name = strings.TrimSuffix(name, ")-fm") + name = strings.TrimSuffix(name, ")·fm") + if i := strings.LastIndexByte(name, '('); i >= 0 { + methodName := name[i+1:] // E.g., "long/path/name/mypkg.myfunc" + if j := strings.LastIndexByte(methodName, '.'); j >= 0 { + methodName = methodName[j+1:] // E.g., "myfunc" + } + name = name[:i] + methodName // E.g., "long/path/name/mypkg.(mytype)." + "myfunc" + } + } + if i := strings.LastIndexByte(name, '/'); i >= 0 { + // Strip the package name. + name = name[i+1:] // E.g., "mypkg.(mytype).myfunc" + } + return name +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/cmp/path.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/cmp/path.go new file mode 100644 index 00000000..c08a3cf8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/cmp/path.go @@ -0,0 +1,309 @@ +// Copyright 2017, The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE.md file. + +package cmp + +import ( + "fmt" + "reflect" + "strings" + "unicode" + "unicode/utf8" +) + +type ( + // Path is a list of PathSteps describing the sequence of operations to get + // from some root type to the current position in the value tree. + // The first Path element is always an operation-less PathStep that exists + // simply to identify the initial type. + // + // When traversing structs with embedded structs, the embedded struct will + // always be accessed as a field before traversing the fields of the + // embedded struct themselves. That is, an exported field from the + // embedded struct will never be accessed directly from the parent struct. + Path []PathStep + + // PathStep is a union-type for specific operations to traverse + // a value's tree structure. Users of this package never need to implement + // these types as values of this type will be returned by this package. + PathStep interface { + String() string + Type() reflect.Type // Resulting type after performing the path step + isPathStep() + } + + // SliceIndex is an index operation on a slice or array at some index Key. + SliceIndex interface { + PathStep + Key() int // May return -1 if in a split state + + // SplitKeys returns the indexes for indexing into slices in the + // x and y values, respectively. These indexes may differ due to the + // insertion or removal of an element in one of the slices, causing + // all of the indexes to be shifted. If an index is -1, then that + // indicates that the element does not exist in the associated slice. + // + // Key is guaranteed to return -1 if and only if the indexes returned + // by SplitKeys are not the same. SplitKeys will never return -1 for + // both indexes. + SplitKeys() (x int, y int) + + isSliceIndex() + } + // MapIndex is an index operation on a map at some index Key. + MapIndex interface { + PathStep + Key() reflect.Value + isMapIndex() + } + // TypeAssertion represents a type assertion on an interface. + TypeAssertion interface { + PathStep + isTypeAssertion() + } + // StructField represents a struct field access on a field called Name. + StructField interface { + PathStep + Name() string + Index() int + isStructField() + } + // Indirect represents pointer indirection on the parent type. + Indirect interface { + PathStep + isIndirect() + } + // Transform is a transformation from the parent type to the current type. + Transform interface { + PathStep + Name() string + Func() reflect.Value + + // Option returns the originally constructed Transformer option. + // The == operator can be used to detect the exact option used. + Option() Option + + isTransform() + } +) + +func (pa *Path) push(s PathStep) { + *pa = append(*pa, s) +} + +func (pa *Path) pop() { + *pa = (*pa)[:len(*pa)-1] +} + +// Last returns the last PathStep in the Path. +// If the path is empty, this returns a non-nil PathStep that reports a nil Type. +func (pa Path) Last() PathStep { + return pa.Index(-1) +} + +// Index returns the ith step in the Path and supports negative indexing. +// A negative index starts counting from the tail of the Path such that -1 +// refers to the last step, -2 refers to the second-to-last step, and so on. +// If index is invalid, this returns a non-nil PathStep that reports a nil Type. +func (pa Path) Index(i int) PathStep { + if i < 0 { + i = len(pa) + i + } + if i < 0 || i >= len(pa) { + return pathStep{} + } + return pa[i] +} + +// String returns the simplified path to a node. +// The simplified path only contains struct field accesses. +// +// For example: +// MyMap.MySlices.MyField +func (pa Path) String() string { + var ss []string + for _, s := range pa { + if _, ok := s.(*structField); ok { + ss = append(ss, s.String()) + } + } + return strings.TrimPrefix(strings.Join(ss, ""), ".") +} + +// GoString returns the path to a specific node using Go syntax. +// +// For example: +// (*root.MyMap["key"].(*mypkg.MyStruct).MySlices)[2][3].MyField +func (pa Path) GoString() string { + var ssPre, ssPost []string + var numIndirect int + for i, s := range pa { + var nextStep PathStep + if i+1 < len(pa) { + nextStep = pa[i+1] + } + switch s := s.(type) { + case *indirect: + numIndirect++ + pPre, pPost := "(", ")" + switch nextStep.(type) { + case *indirect: + continue // Next step is indirection, so let them batch up + case *structField: + numIndirect-- // Automatic indirection on struct fields + case nil: + pPre, pPost = "", "" // Last step; no need for parenthesis + } + if numIndirect > 0 { + ssPre = append(ssPre, pPre+strings.Repeat("*", numIndirect)) + ssPost = append(ssPost, pPost) + } + numIndirect = 0 + continue + case *transform: + ssPre = append(ssPre, s.trans.name+"(") + ssPost = append(ssPost, ")") + continue + case *typeAssertion: + // As a special-case, elide type assertions on anonymous types + // since they are typically generated dynamically and can be very + // verbose. For example, some transforms return interface{} because + // of Go's lack of generics, but typically take in and return the + // exact same concrete type. + if s.Type().PkgPath() == "" { + continue + } + } + ssPost = append(ssPost, s.String()) + } + for i, j := 0, len(ssPre)-1; i < j; i, j = i+1, j-1 { + ssPre[i], ssPre[j] = ssPre[j], ssPre[i] + } + return strings.Join(ssPre, "") + strings.Join(ssPost, "") +} + +type ( + pathStep struct { + typ reflect.Type + } + + sliceIndex struct { + pathStep + xkey, ykey int + } + mapIndex struct { + pathStep + key reflect.Value + } + typeAssertion struct { + pathStep + } + structField struct { + pathStep + name string + idx int + + // These fields are used for forcibly accessing an unexported field. + // pvx, pvy, and field are only valid if unexported is true. + unexported bool + force bool // Forcibly allow visibility + pvx, pvy reflect.Value // Parent values + field reflect.StructField // Field information + } + indirect struct { + pathStep + } + transform struct { + pathStep + trans *transformer + } +) + +func (ps pathStep) Type() reflect.Type { return ps.typ } +func (ps pathStep) String() string { + if ps.typ == nil { + return "" + } + s := ps.typ.String() + if s == "" || strings.ContainsAny(s, "{}\n") { + return "root" // Type too simple or complex to print + } + return fmt.Sprintf("{%s}", s) +} + +func (si sliceIndex) String() string { + switch { + case si.xkey == si.ykey: + return fmt.Sprintf("[%d]", si.xkey) + case si.ykey == -1: + // [5->?] means "I don't know where X[5] went" + return fmt.Sprintf("[%d->?]", si.xkey) + case si.xkey == -1: + // [?->3] means "I don't know where Y[3] came from" + return fmt.Sprintf("[?->%d]", si.ykey) + default: + // [5->3] means "X[5] moved to Y[3]" + return fmt.Sprintf("[%d->%d]", si.xkey, si.ykey) + } +} +func (mi mapIndex) String() string { return fmt.Sprintf("[%#v]", mi.key) } +func (ta typeAssertion) String() string { return fmt.Sprintf(".(%v)", ta.typ) } +func (sf structField) String() string { return fmt.Sprintf(".%s", sf.name) } +func (in indirect) String() string { return "*" } +func (tf transform) String() string { return fmt.Sprintf("%s()", tf.trans.name) } + +func (si sliceIndex) Key() int { + if si.xkey != si.ykey { + return -1 + } + return si.xkey +} +func (si sliceIndex) SplitKeys() (x, y int) { return si.xkey, si.ykey } +func (mi mapIndex) Key() reflect.Value { return mi.key } +func (sf structField) Name() string { return sf.name } +func (sf structField) Index() int { return sf.idx } +func (tf transform) Name() string { return tf.trans.name } +func (tf transform) Func() reflect.Value { return tf.trans.fnc } +func (tf transform) Option() Option { return tf.trans } + +func (pathStep) isPathStep() {} +func (sliceIndex) isSliceIndex() {} +func (mapIndex) isMapIndex() {} +func (typeAssertion) isTypeAssertion() {} +func (structField) isStructField() {} +func (indirect) isIndirect() {} +func (transform) isTransform() {} + +var ( + _ SliceIndex = sliceIndex{} + _ MapIndex = mapIndex{} + _ TypeAssertion = typeAssertion{} + _ StructField = structField{} + _ Indirect = indirect{} + _ Transform = transform{} + + _ PathStep = sliceIndex{} + _ PathStep = mapIndex{} + _ PathStep = typeAssertion{} + _ PathStep = structField{} + _ PathStep = indirect{} + _ PathStep = transform{} +) + +// isExported reports whether the identifier is exported. +func isExported(id string) bool { + r, _ := utf8.DecodeRuneInString(id) + return unicode.IsUpper(r) +} + +// isValid reports whether the identifier is valid. +// Empty and underscore-only strings are not valid. +func isValid(id string) bool { + ok := id != "" && id != "_" + for j, c := range id { + ok = ok && (j > 0 || !unicode.IsDigit(c)) + ok = ok && (c == '_' || unicode.IsLetter(c) || unicode.IsDigit(c)) + } + return ok +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/cmp/reporter.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/cmp/reporter.go new file mode 100644 index 00000000..20e9f18e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/cmp/reporter.go @@ -0,0 +1,53 @@ +// Copyright 2017, The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE.md file. + +package cmp + +import ( + "fmt" + "reflect" + "strings" + + "github.com/google/go-cmp/cmp/internal/value" +) + +type defaultReporter struct { + Option + diffs []string // List of differences, possibly truncated + ndiffs int // Total number of differences + nbytes int // Number of bytes in diffs + nlines int // Number of lines in diffs +} + +var _ reporter = (*defaultReporter)(nil) + +func (r *defaultReporter) Report(x, y reflect.Value, eq bool, p Path) { + if eq { + return // Ignore equal results + } + const maxBytes = 4096 + const maxLines = 256 + r.ndiffs++ + if r.nbytes < maxBytes && r.nlines < maxLines { + sx := value.Format(x, value.FormatConfig{UseStringer: true}) + sy := value.Format(y, value.FormatConfig{UseStringer: true}) + if sx == sy { + // Unhelpful output, so use more exact formatting. + sx = value.Format(x, value.FormatConfig{PrintPrimitiveType: true}) + sy = value.Format(y, value.FormatConfig{PrintPrimitiveType: true}) + } + s := fmt.Sprintf("%#v:\n\t-: %s\n\t+: %s\n", p, sx, sy) + r.diffs = append(r.diffs, s) + r.nbytes += len(s) + r.nlines += strings.Count(s, "\n") + } +} + +func (r *defaultReporter) String() string { + s := strings.Join(r.diffs, "") + if r.ndiffs == len(r.diffs) { + return s + } + return fmt.Sprintf("%s... %d more differences ...", s, r.ndiffs-len(r.diffs)) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/cmp/unsafe_panic.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/cmp/unsafe_panic.go new file mode 100644 index 00000000..d1518eb3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/cmp/unsafe_panic.go @@ -0,0 +1,15 @@ +// Copyright 2017, The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE.md file. + +// +build purego appengine js + +package cmp + +import "reflect" + +const supportAllowUnexported = false + +func unsafeRetrieveField(reflect.Value, reflect.StructField) reflect.Value { + panic("unsafeRetrieveField is not implemented") +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/cmp/unsafe_reflect.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/cmp/unsafe_reflect.go new file mode 100644 index 00000000..579b6550 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/google/go-cmp/cmp/unsafe_reflect.go @@ -0,0 +1,23 @@ +// Copyright 2017, The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE.md file. + +// +build !purego,!appengine,!js + +package cmp + +import ( + "reflect" + "unsafe" +) + +const supportAllowUnexported = true + +// unsafeRetrieveField uses unsafe to forcibly retrieve any field from a struct +// such that the value has read-write permissions. +// +// The parent struct, v, must be addressable, while f must be a StructField +// describing the field to retrieve. +func unsafeRetrieveField(v reflect.Value, f reflect.StructField) reflect.Value { + return reflect.NewAt(f.Type, unsafe.Pointer(v.UnsafeAddr()+f.Offset)).Elem() +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/.gitignore b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/.gitignore new file mode 100644 index 00000000..15586a2b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/.gitignore @@ -0,0 +1,9 @@ +y.output + +# ignore intellij files +.idea +*.iml +*.ipr +*.iws + +*.test diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/.travis.yml b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/.travis.yml new file mode 100644 index 00000000..cb63a321 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/.travis.yml @@ -0,0 +1,13 @@ +sudo: false + +language: go + +go: + - 1.x + - tip + +branches: + only: + - master + +script: make test diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/LICENSE b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/LICENSE new file mode 100644 index 00000000..c33dcc7c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/LICENSE @@ -0,0 +1,354 @@ +Mozilla Public License, version 2.0 + +1. Definitions + +1.1. “Contributor†+ + means each individual or legal entity that creates, contributes to the + creation of, or owns Covered Software. + +1.2. “Contributor Version†+ + means the combination of the Contributions of others (if any) used by a + Contributor and that particular Contributor’s Contribution. + +1.3. “Contribution†+ + means Covered Software of a particular Contributor. + +1.4. “Covered Software†+ + means Source Code Form to which the initial Contributor has attached the + notice in Exhibit A, the Executable Form of such Source Code Form, and + Modifications of such Source Code Form, in each case including portions + thereof. + +1.5. “Incompatible With Secondary Licenses†+ means + + a. that the initial Contributor has attached the notice described in + Exhibit B to the Covered Software; or + + b. that the Covered Software was made available under the terms of version + 1.1 or earlier of the License, but not also under the terms of a + Secondary License. + +1.6. “Executable Form†+ + means any form of the work other than Source Code Form. + +1.7. “Larger Work†+ + means a work that combines Covered Software with other material, in a separate + file or files, that is not Covered Software. + +1.8. “License†+ + means this document. + +1.9. “Licensable†+ + means having the right to grant, to the maximum extent possible, whether at the + time of the initial grant or subsequently, any and all of the rights conveyed by + this License. + +1.10. “Modifications†+ + means any of the following: + + a. any file in Source Code Form that results from an addition to, deletion + from, or modification of the contents of Covered Software; or + + b. any new file in Source Code Form that contains any Covered Software. + +1.11. “Patent Claims†of a Contributor + + means any patent claim(s), including without limitation, method, process, + and apparatus claims, in any patent Licensable by such Contributor that + would be infringed, but for the grant of the License, by the making, + using, selling, offering for sale, having made, import, or transfer of + either its Contributions or its Contributor Version. + +1.12. “Secondary License†+ + means either the GNU General Public License, Version 2.0, the GNU Lesser + General Public License, Version 2.1, the GNU Affero General Public + License, Version 3.0, or any later versions of those licenses. + +1.13. “Source Code Form†+ + means the form of the work preferred for making modifications. + +1.14. “You†(or “Yourâ€) + + means an individual or a legal entity exercising rights under this + License. For legal entities, “You†includes any entity that controls, is + controlled by, or is under common control with You. For purposes of this + definition, “control†means (a) the power, direct or indirect, to cause + the direction or management of such entity, whether by contract or + otherwise, or (b) ownership of more than fifty percent (50%) of the + outstanding shares or beneficial ownership of such entity. + + +2. License Grants and Conditions + +2.1. Grants + + Each Contributor hereby grants You a world-wide, royalty-free, + non-exclusive license: + + a. under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or as + part of a Larger Work; and + + b. under Patent Claims of such Contributor to make, use, sell, offer for + sale, have made, import, and otherwise transfer either its Contributions + or its Contributor Version. + +2.2. Effective Date + + The licenses granted in Section 2.1 with respect to any Contribution become + effective for each Contribution on the date the Contributor first distributes + such Contribution. + +2.3. Limitations on Grant Scope + + The licenses granted in this Section 2 are the only rights granted under this + License. No additional rights or licenses will be implied from the distribution + or licensing of Covered Software under this License. Notwithstanding Section + 2.1(b) above, no patent license is granted by a Contributor: + + a. for any code that a Contributor has removed from Covered Software; or + + b. for infringements caused by: (i) Your and any other third party’s + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + + c. under Patent Claims infringed by Covered Software in the absence of its + Contributions. + + This License does not grant any rights in the trademarks, service marks, or + logos of any Contributor (except as may be necessary to comply with the + notice requirements in Section 3.4). + +2.4. Subsequent Licenses + + No Contributor makes additional grants as a result of Your choice to + distribute the Covered Software under a subsequent version of this License + (see Section 10.2) or under the terms of a Secondary License (if permitted + under the terms of Section 3.3). + +2.5. Representation + + Each Contributor represents that the Contributor believes its Contributions + are its original creation(s) or it has sufficient rights to grant the + rights to its Contributions conveyed by this License. + +2.6. Fair Use + + This License is not intended to limit any rights You have under applicable + copyright doctrines of fair use, fair dealing, or other equivalents. + +2.7. Conditions + + Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in + Section 2.1. + + +3. Responsibilities + +3.1. Distribution of Source Form + + All distribution of Covered Software in Source Code Form, including any + Modifications that You create or to which You contribute, must be under the + terms of this License. You must inform recipients that the Source Code Form + of the Covered Software is governed by the terms of this License, and how + they can obtain a copy of this License. You may not attempt to alter or + restrict the recipients’ rights in the Source Code Form. + +3.2. Distribution of Executable Form + + If You distribute Covered Software in Executable Form then: + + a. such Covered Software must also be made available in Source Code Form, + as described in Section 3.1, and You must inform recipients of the + Executable Form how they can obtain a copy of such Source Code Form by + reasonable means in a timely manner, at a charge no more than the cost + of distribution to the recipient; and + + b. You may distribute such Executable Form under the terms of this License, + or sublicense it under different terms, provided that the license for + the Executable Form does not attempt to limit or alter the recipients’ + rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + + You may create and distribute a Larger Work under terms of Your choice, + provided that You also comply with the requirements of this License for the + Covered Software. If the Larger Work is a combination of Covered Software + with a work governed by one or more Secondary Licenses, and the Covered + Software is not Incompatible With Secondary Licenses, this License permits + You to additionally distribute such Covered Software under the terms of + such Secondary License(s), so that the recipient of the Larger Work may, at + their option, further distribute the Covered Software under the terms of + either this License or such Secondary License(s). + +3.4. Notices + + You may not remove or alter the substance of any license notices (including + copyright notices, patent notices, disclaimers of warranty, or limitations + of liability) contained within the Source Code Form of the Covered + Software, except that You may alter any license notices to the extent + required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + + You may choose to offer, and to charge a fee for, warranty, support, + indemnity or liability obligations to one or more recipients of Covered + Software. However, You may do so only on Your own behalf, and not on behalf + of any Contributor. You must make it absolutely clear that any such + warranty, support, indemnity, or liability obligation is offered by You + alone, and You hereby agree to indemnify every Contributor for any + liability incurred by such Contributor as a result of warranty, support, + indemnity or liability terms You offer. You may include additional + disclaimers of warranty and limitations of liability specific to any + jurisdiction. + +4. Inability to Comply Due to Statute or Regulation + + If it is impossible for You to comply with any of the terms of this License + with respect to some or all of the Covered Software due to statute, judicial + order, or regulation then You must: (a) comply with the terms of this License + to the maximum extent possible; and (b) describe the limitations and the code + they affect. Such description must be placed in a text file included with all + distributions of the Covered Software under this License. Except to the + extent prohibited by statute or regulation, such description must be + sufficiently detailed for a recipient of ordinary skill to be able to + understand it. + +5. Termination + +5.1. The rights granted under this License will terminate automatically if You + fail to comply with any of its terms. However, if You become compliant, + then the rights granted under this License from a particular Contributor + are reinstated (a) provisionally, unless and until such Contributor + explicitly and finally terminates Your grants, and (b) on an ongoing basis, + if such Contributor fails to notify You of the non-compliance by some + reasonable means prior to 60 days after You have come back into compliance. + Moreover, Your grants from a particular Contributor are reinstated on an + ongoing basis if such Contributor notifies You of the non-compliance by + some reasonable means, this is the first time You have received notice of + non-compliance with this License from such Contributor, and You become + compliant prior to 30 days after Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent + infringement claim (excluding declaratory judgment actions, counter-claims, + and cross-claims) alleging that a Contributor Version directly or + indirectly infringes any patent, then the rights granted to You by any and + all Contributors for the Covered Software under Section 2.1 of this License + shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user + license agreements (excluding distributors and resellers) which have been + validly granted by You or Your distributors under this License prior to + termination shall survive termination. + +6. Disclaimer of Warranty + + Covered Software is provided under this License on an “as is†basis, without + warranty of any kind, either expressed, implied, or statutory, including, + without limitation, warranties that the Covered Software is free of defects, + merchantable, fit for a particular purpose or non-infringing. The entire + risk as to the quality and performance of the Covered Software is with You. + Should any Covered Software prove defective in any respect, You (not any + Contributor) assume the cost of any necessary servicing, repair, or + correction. This disclaimer of warranty constitutes an essential part of this + License. No use of any Covered Software is authorized under this License + except under this disclaimer. + +7. Limitation of Liability + + Under no circumstances and under no legal theory, whether tort (including + negligence), contract, or otherwise, shall any Contributor, or anyone who + distributes Covered Software as permitted above, be liable to You for any + direct, indirect, special, incidental, or consequential damages of any + character including, without limitation, damages for lost profits, loss of + goodwill, work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses, even if such party shall have been + informed of the possibility of such damages. This limitation of liability + shall not apply to liability for death or personal injury resulting from such + party’s negligence to the extent applicable law prohibits such limitation. + Some jurisdictions do not allow the exclusion or limitation of incidental or + consequential damages, so this exclusion and limitation may not apply to You. + +8. Litigation + + Any litigation relating to this License may be brought only in the courts of + a jurisdiction where the defendant maintains its principal place of business + and such litigation shall be governed by laws of that jurisdiction, without + reference to its conflict-of-law provisions. Nothing in this Section shall + prevent a party’s ability to bring cross-claims or counter-claims. + +9. Miscellaneous + + This License represents the complete agreement concerning the subject matter + hereof. If any provision of this License is held to be unenforceable, such + provision shall be reformed only to the extent necessary to make it + enforceable. Any law or regulation which provides that the language of a + contract shall be construed against the drafter shall not be used to construe + this License against a Contributor. + + +10. Versions of the License + +10.1. New Versions + + Mozilla Foundation is the license steward. Except as provided in Section + 10.3, no one other than the license steward has the right to modify or + publish new versions of this License. Each version will be given a + distinguishing version number. + +10.2. Effect of New Versions + + You may distribute the Covered Software under the terms of the version of + the License under which You originally received the Covered Software, or + under the terms of any subsequent version published by the license + steward. + +10.3. Modified Versions + + If you create software not governed by this License, and you want to + create a new license for such software, you may create and use a modified + version of this License if you rename the license and remove any + references to the name of the license steward (except to note that such + modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses + If You choose to distribute Source Code Form that is Incompatible With + Secondary Licenses under the terms of this version of the License, the + notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice + + This Source Code Form is subject to the + terms of the Mozilla Public License, v. + 2.0. If a copy of the MPL was not + distributed with this file, You can + obtain one at + http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular file, then +You may include the notice in a location (such as a LICENSE file in a relevant +directory) where a recipient would be likely to look for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - “Incompatible With Secondary Licenses†Notice + + This Source Code Form is “Incompatible + With Secondary Licensesâ€, as defined by + the Mozilla Public License, v. 2.0. + diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/Makefile b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/Makefile new file mode 100644 index 00000000..84fd743f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/Makefile @@ -0,0 +1,18 @@ +TEST?=./... + +default: test + +fmt: generate + go fmt ./... + +test: generate + go get -t ./... + go test $(TEST) $(TESTARGS) + +generate: + go generate ./... + +updatedeps: + go get -u golang.org/x/tools/cmd/stringer + +.PHONY: default generate test updatedeps diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/README.md b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/README.md new file mode 100644 index 00000000..c8223326 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/README.md @@ -0,0 +1,125 @@ +# HCL + +[![GoDoc](https://godoc.org/github.com/hashicorp/hcl?status.png)](https://godoc.org/github.com/hashicorp/hcl) [![Build Status](https://travis-ci.org/hashicorp/hcl.svg?branch=master)](https://travis-ci.org/hashicorp/hcl) + +HCL (HashiCorp Configuration Language) is a configuration language built +by HashiCorp. The goal of HCL is to build a structured configuration language +that is both human and machine friendly for use with command-line tools, but +specifically targeted towards DevOps tools, servers, etc. + +HCL is also fully JSON compatible. That is, JSON can be used as completely +valid input to a system expecting HCL. This helps makes systems +interoperable with other systems. + +HCL is heavily inspired by +[libucl](https://github.com/vstakhov/libucl), +nginx configuration, and others similar. + +## Why? + +A common question when viewing HCL is to ask the question: why not +JSON, YAML, etc.? + +Prior to HCL, the tools we built at [HashiCorp](http://www.hashicorp.com) +used a variety of configuration languages from full programming languages +such as Ruby to complete data structure languages such as JSON. What we +learned is that some people wanted human-friendly configuration languages +and some people wanted machine-friendly languages. + +JSON fits a nice balance in this, but is fairly verbose and most +importantly doesn't support comments. With YAML, we found that beginners +had a really hard time determining what the actual structure was, and +ended up guessing more often than not whether to use a hyphen, colon, etc. +in order to represent some configuration key. + +Full programming languages such as Ruby enable complex behavior +a configuration language shouldn't usually allow, and also forces +people to learn some set of Ruby. + +Because of this, we decided to create our own configuration language +that is JSON-compatible. Our configuration language (HCL) is designed +to be written and modified by humans. The API for HCL allows JSON +as an input so that it is also machine-friendly (machines can generate +JSON instead of trying to generate HCL). + +Our goal with HCL is not to alienate other configuration languages. +It is instead to provide HCL as a specialized language for our tools, +and JSON as the interoperability layer. + +## Syntax + +For a complete grammar, please see the parser itself. A high-level overview +of the syntax and grammar is listed here. + + * Single line comments start with `#` or `//` + + * Multi-line comments are wrapped in `/*` and `*/`. Nested block comments + are not allowed. A multi-line comment (also known as a block comment) + terminates at the first `*/` found. + + * Values are assigned with the syntax `key = value` (whitespace doesn't + matter). The value can be any primitive: a string, number, boolean, + object, or list. + + * Strings are double-quoted and can contain any UTF-8 characters. + Example: `"Hello, World"` + + * Multi-line strings start with `<- + echo %Path% + + go version + + go env + + go get -t ./... + +build_script: +- cmd: go test -v ./... diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/decoder.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/decoder.go new file mode 100644 index 00000000..bed9ebbe --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/decoder.go @@ -0,0 +1,729 @@ +package hcl + +import ( + "errors" + "fmt" + "reflect" + "sort" + "strconv" + "strings" + + "github.com/hashicorp/hcl/hcl/ast" + "github.com/hashicorp/hcl/hcl/parser" + "github.com/hashicorp/hcl/hcl/token" +) + +// This is the tag to use with structures to have settings for HCL +const tagName = "hcl" + +var ( + // nodeType holds a reference to the type of ast.Node + nodeType reflect.Type = findNodeType() +) + +// Unmarshal accepts a byte slice as input and writes the +// data to the value pointed to by v. +func Unmarshal(bs []byte, v interface{}) error { + root, err := parse(bs) + if err != nil { + return err + } + + return DecodeObject(v, root) +} + +// Decode reads the given input and decodes it into the structure +// given by `out`. +func Decode(out interface{}, in string) error { + obj, err := Parse(in) + if err != nil { + return err + } + + return DecodeObject(out, obj) +} + +// DecodeObject is a lower-level version of Decode. It decodes a +// raw Object into the given output. +func DecodeObject(out interface{}, n ast.Node) error { + val := reflect.ValueOf(out) + if val.Kind() != reflect.Ptr { + return errors.New("result must be a pointer") + } + + // If we have the file, we really decode the root node + if f, ok := n.(*ast.File); ok { + n = f.Node + } + + var d decoder + return d.decode("root", n, val.Elem()) +} + +type decoder struct { + stack []reflect.Kind +} + +func (d *decoder) decode(name string, node ast.Node, result reflect.Value) error { + k := result + + // If we have an interface with a valid value, we use that + // for the check. + if result.Kind() == reflect.Interface { + elem := result.Elem() + if elem.IsValid() { + k = elem + } + } + + // Push current onto stack unless it is an interface. + if k.Kind() != reflect.Interface { + d.stack = append(d.stack, k.Kind()) + + // Schedule a pop + defer func() { + d.stack = d.stack[:len(d.stack)-1] + }() + } + + switch k.Kind() { + case reflect.Bool: + return d.decodeBool(name, node, result) + case reflect.Float32, reflect.Float64: + return d.decodeFloat(name, node, result) + case reflect.Int, reflect.Int32, reflect.Int64: + return d.decodeInt(name, node, result) + case reflect.Interface: + // When we see an interface, we make our own thing + return d.decodeInterface(name, node, result) + case reflect.Map: + return d.decodeMap(name, node, result) + case reflect.Ptr: + return d.decodePtr(name, node, result) + case reflect.Slice: + return d.decodeSlice(name, node, result) + case reflect.String: + return d.decodeString(name, node, result) + case reflect.Struct: + return d.decodeStruct(name, node, result) + default: + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: unknown kind to decode into: %s", name, k.Kind()), + } + } +} + +func (d *decoder) decodeBool(name string, node ast.Node, result reflect.Value) error { + switch n := node.(type) { + case *ast.LiteralType: + if n.Token.Type == token.BOOL { + v, err := strconv.ParseBool(n.Token.Text) + if err != nil { + return err + } + + result.Set(reflect.ValueOf(v)) + return nil + } + } + + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: unknown type %T", name, node), + } +} + +func (d *decoder) decodeFloat(name string, node ast.Node, result reflect.Value) error { + switch n := node.(type) { + case *ast.LiteralType: + if n.Token.Type == token.FLOAT || n.Token.Type == token.NUMBER { + v, err := strconv.ParseFloat(n.Token.Text, 64) + if err != nil { + return err + } + + result.Set(reflect.ValueOf(v).Convert(result.Type())) + return nil + } + } + + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: unknown type %T", name, node), + } +} + +func (d *decoder) decodeInt(name string, node ast.Node, result reflect.Value) error { + switch n := node.(type) { + case *ast.LiteralType: + switch n.Token.Type { + case token.NUMBER: + v, err := strconv.ParseInt(n.Token.Text, 0, 0) + if err != nil { + return err + } + + if result.Kind() == reflect.Interface { + result.Set(reflect.ValueOf(int(v))) + } else { + result.SetInt(v) + } + return nil + case token.STRING: + v, err := strconv.ParseInt(n.Token.Value().(string), 0, 0) + if err != nil { + return err + } + + if result.Kind() == reflect.Interface { + result.Set(reflect.ValueOf(int(v))) + } else { + result.SetInt(v) + } + return nil + } + } + + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: unknown type %T", name, node), + } +} + +func (d *decoder) decodeInterface(name string, node ast.Node, result reflect.Value) error { + // When we see an ast.Node, we retain the value to enable deferred decoding. + // Very useful in situations where we want to preserve ast.Node information + // like Pos + if result.Type() == nodeType && result.CanSet() { + result.Set(reflect.ValueOf(node)) + return nil + } + + var set reflect.Value + redecode := true + + // For testing types, ObjectType should just be treated as a list. We + // set this to a temporary var because we want to pass in the real node. + testNode := node + if ot, ok := node.(*ast.ObjectType); ok { + testNode = ot.List + } + + switch n := testNode.(type) { + case *ast.ObjectList: + // If we're at the root or we're directly within a slice, then we + // decode objects into map[string]interface{}, otherwise we decode + // them into lists. + if len(d.stack) == 0 || d.stack[len(d.stack)-1] == reflect.Slice { + var temp map[string]interface{} + tempVal := reflect.ValueOf(temp) + result := reflect.MakeMap( + reflect.MapOf( + reflect.TypeOf(""), + tempVal.Type().Elem())) + + set = result + } else { + var temp []map[string]interface{} + tempVal := reflect.ValueOf(temp) + result := reflect.MakeSlice( + reflect.SliceOf(tempVal.Type().Elem()), 0, len(n.Items)) + set = result + } + case *ast.ObjectType: + // If we're at the root or we're directly within a slice, then we + // decode objects into map[string]interface{}, otherwise we decode + // them into lists. + if len(d.stack) == 0 || d.stack[len(d.stack)-1] == reflect.Slice { + var temp map[string]interface{} + tempVal := reflect.ValueOf(temp) + result := reflect.MakeMap( + reflect.MapOf( + reflect.TypeOf(""), + tempVal.Type().Elem())) + + set = result + } else { + var temp []map[string]interface{} + tempVal := reflect.ValueOf(temp) + result := reflect.MakeSlice( + reflect.SliceOf(tempVal.Type().Elem()), 0, 1) + set = result + } + case *ast.ListType: + var temp []interface{} + tempVal := reflect.ValueOf(temp) + result := reflect.MakeSlice( + reflect.SliceOf(tempVal.Type().Elem()), 0, 0) + set = result + case *ast.LiteralType: + switch n.Token.Type { + case token.BOOL: + var result bool + set = reflect.Indirect(reflect.New(reflect.TypeOf(result))) + case token.FLOAT: + var result float64 + set = reflect.Indirect(reflect.New(reflect.TypeOf(result))) + case token.NUMBER: + var result int + set = reflect.Indirect(reflect.New(reflect.TypeOf(result))) + case token.STRING, token.HEREDOC: + set = reflect.Indirect(reflect.New(reflect.TypeOf(""))) + default: + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: cannot decode into interface: %T", name, node), + } + } + default: + return fmt.Errorf( + "%s: cannot decode into interface: %T", + name, node) + } + + // Set the result to what its supposed to be, then reset + // result so we don't reflect into this method anymore. + result.Set(set) + + if redecode { + // Revisit the node so that we can use the newly instantiated + // thing and populate it. + if err := d.decode(name, node, result); err != nil { + return err + } + } + + return nil +} + +func (d *decoder) decodeMap(name string, node ast.Node, result reflect.Value) error { + if item, ok := node.(*ast.ObjectItem); ok { + node = &ast.ObjectList{Items: []*ast.ObjectItem{item}} + } + + if ot, ok := node.(*ast.ObjectType); ok { + node = ot.List + } + + n, ok := node.(*ast.ObjectList) + if !ok { + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: not an object type for map (%T)", name, node), + } + } + + // If we have an interface, then we can address the interface, + // but not the slice itself, so get the element but set the interface + set := result + if result.Kind() == reflect.Interface { + result = result.Elem() + } + + resultType := result.Type() + resultElemType := resultType.Elem() + resultKeyType := resultType.Key() + if resultKeyType.Kind() != reflect.String { + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: map must have string keys", name), + } + } + + // Make a map if it is nil + resultMap := result + if result.IsNil() { + resultMap = reflect.MakeMap( + reflect.MapOf(resultKeyType, resultElemType)) + } + + // Go through each element and decode it. + done := make(map[string]struct{}) + for _, item := range n.Items { + if item.Val == nil { + continue + } + + // github.com/hashicorp/terraform/issue/5740 + if len(item.Keys) == 0 { + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: map must have string keys", name), + } + } + + // Get the key we're dealing with, which is the first item + keyStr := item.Keys[0].Token.Value().(string) + + // If we've already processed this key, then ignore it + if _, ok := done[keyStr]; ok { + continue + } + + // Determine the value. If we have more than one key, then we + // get the objectlist of only these keys. + itemVal := item.Val + if len(item.Keys) > 1 { + itemVal = n.Filter(keyStr) + done[keyStr] = struct{}{} + } + + // Make the field name + fieldName := fmt.Sprintf("%s.%s", name, keyStr) + + // Get the key/value as reflection values + key := reflect.ValueOf(keyStr) + val := reflect.Indirect(reflect.New(resultElemType)) + + // If we have a pre-existing value in the map, use that + oldVal := resultMap.MapIndex(key) + if oldVal.IsValid() { + val.Set(oldVal) + } + + // Decode! + if err := d.decode(fieldName, itemVal, val); err != nil { + return err + } + + // Set the value on the map + resultMap.SetMapIndex(key, val) + } + + // Set the final map if we can + set.Set(resultMap) + return nil +} + +func (d *decoder) decodePtr(name string, node ast.Node, result reflect.Value) error { + // Create an element of the concrete (non pointer) type and decode + // into that. Then set the value of the pointer to this type. + resultType := result.Type() + resultElemType := resultType.Elem() + val := reflect.New(resultElemType) + if err := d.decode(name, node, reflect.Indirect(val)); err != nil { + return err + } + + result.Set(val) + return nil +} + +func (d *decoder) decodeSlice(name string, node ast.Node, result reflect.Value) error { + // If we have an interface, then we can address the interface, + // but not the slice itself, so get the element but set the interface + set := result + if result.Kind() == reflect.Interface { + result = result.Elem() + } + // Create the slice if it isn't nil + resultType := result.Type() + resultElemType := resultType.Elem() + if result.IsNil() { + resultSliceType := reflect.SliceOf(resultElemType) + result = reflect.MakeSlice( + resultSliceType, 0, 0) + } + + // Figure out the items we'll be copying into the slice + var items []ast.Node + switch n := node.(type) { + case *ast.ObjectList: + items = make([]ast.Node, len(n.Items)) + for i, item := range n.Items { + items[i] = item + } + case *ast.ObjectType: + items = []ast.Node{n} + case *ast.ListType: + items = n.List + default: + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("unknown slice type: %T", node), + } + } + + for i, item := range items { + fieldName := fmt.Sprintf("%s[%d]", name, i) + + // Decode + val := reflect.Indirect(reflect.New(resultElemType)) + + // if item is an object that was decoded from ambiguous JSON and + // flattened, make sure it's expanded if it needs to decode into a + // defined structure. + item := expandObject(item, val) + + if err := d.decode(fieldName, item, val); err != nil { + return err + } + + // Append it onto the slice + result = reflect.Append(result, val) + } + + set.Set(result) + return nil +} + +// expandObject detects if an ambiguous JSON object was flattened to a List which +// should be decoded into a struct, and expands the ast to properly deocode. +func expandObject(node ast.Node, result reflect.Value) ast.Node { + item, ok := node.(*ast.ObjectItem) + if !ok { + return node + } + + elemType := result.Type() + + // our target type must be a struct + switch elemType.Kind() { + case reflect.Ptr: + switch elemType.Elem().Kind() { + case reflect.Struct: + //OK + default: + return node + } + case reflect.Struct: + //OK + default: + return node + } + + // A list value will have a key and field name. If it had more fields, + // it wouldn't have been flattened. + if len(item.Keys) != 2 { + return node + } + + keyToken := item.Keys[0].Token + item.Keys = item.Keys[1:] + + // we need to un-flatten the ast enough to decode + newNode := &ast.ObjectItem{ + Keys: []*ast.ObjectKey{ + &ast.ObjectKey{ + Token: keyToken, + }, + }, + Val: &ast.ObjectType{ + List: &ast.ObjectList{ + Items: []*ast.ObjectItem{item}, + }, + }, + } + + return newNode +} + +func (d *decoder) decodeString(name string, node ast.Node, result reflect.Value) error { + switch n := node.(type) { + case *ast.LiteralType: + switch n.Token.Type { + case token.NUMBER: + result.Set(reflect.ValueOf(n.Token.Text).Convert(result.Type())) + return nil + case token.STRING, token.HEREDOC: + result.Set(reflect.ValueOf(n.Token.Value()).Convert(result.Type())) + return nil + } + } + + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: unknown type for string %T", name, node), + } +} + +func (d *decoder) decodeStruct(name string, node ast.Node, result reflect.Value) error { + var item *ast.ObjectItem + if it, ok := node.(*ast.ObjectItem); ok { + item = it + node = it.Val + } + + if ot, ok := node.(*ast.ObjectType); ok { + node = ot.List + } + + // Handle the special case where the object itself is a literal. Previously + // the yacc parser would always ensure top-level elements were arrays. The new + // parser does not make the same guarantees, thus we need to convert any + // top-level literal elements into a list. + if _, ok := node.(*ast.LiteralType); ok && item != nil { + node = &ast.ObjectList{Items: []*ast.ObjectItem{item}} + } + + list, ok := node.(*ast.ObjectList) + if !ok { + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: not an object type for struct (%T)", name, node), + } + } + + // This slice will keep track of all the structs we'll be decoding. + // There can be more than one struct if there are embedded structs + // that are squashed. + structs := make([]reflect.Value, 1, 5) + structs[0] = result + + // Compile the list of all the fields that we're going to be decoding + // from all the structs. + type field struct { + field reflect.StructField + val reflect.Value + } + fields := []field{} + for len(structs) > 0 { + structVal := structs[0] + structs = structs[1:] + + structType := structVal.Type() + for i := 0; i < structType.NumField(); i++ { + fieldType := structType.Field(i) + tagParts := strings.Split(fieldType.Tag.Get(tagName), ",") + + // Ignore fields with tag name "-" + if tagParts[0] == "-" { + continue + } + + if fieldType.Anonymous { + fieldKind := fieldType.Type.Kind() + if fieldKind != reflect.Struct { + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: unsupported type to struct: %s", + fieldType.Name, fieldKind), + } + } + + // We have an embedded field. We "squash" the fields down + // if specified in the tag. + squash := false + for _, tag := range tagParts[1:] { + if tag == "squash" { + squash = true + break + } + } + + if squash { + structs = append( + structs, result.FieldByName(fieldType.Name)) + continue + } + } + + // Normal struct field, store it away + fields = append(fields, field{fieldType, structVal.Field(i)}) + } + } + + usedKeys := make(map[string]struct{}) + decodedFields := make([]string, 0, len(fields)) + decodedFieldsVal := make([]reflect.Value, 0) + unusedKeysVal := make([]reflect.Value, 0) + for _, f := range fields { + field, fieldValue := f.field, f.val + if !fieldValue.IsValid() { + // This should never happen + panic("field is not valid") + } + + // If we can't set the field, then it is unexported or something, + // and we just continue onwards. + if !fieldValue.CanSet() { + continue + } + + fieldName := field.Name + + tagValue := field.Tag.Get(tagName) + tagParts := strings.SplitN(tagValue, ",", 2) + if len(tagParts) >= 2 { + switch tagParts[1] { + case "decodedFields": + decodedFieldsVal = append(decodedFieldsVal, fieldValue) + continue + case "key": + if item == nil { + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: %s asked for 'key', impossible", + name, fieldName), + } + } + + fieldValue.SetString(item.Keys[0].Token.Value().(string)) + continue + case "unusedKeys": + unusedKeysVal = append(unusedKeysVal, fieldValue) + continue + } + } + + if tagParts[0] != "" { + fieldName = tagParts[0] + } + + // Determine the element we'll use to decode. If it is a single + // match (only object with the field), then we decode it exactly. + // If it is a prefix match, then we decode the matches. + filter := list.Filter(fieldName) + + prefixMatches := filter.Children() + matches := filter.Elem() + if len(matches.Items) == 0 && len(prefixMatches.Items) == 0 { + continue + } + + // Track the used key + usedKeys[fieldName] = struct{}{} + + // Create the field name and decode. We range over the elements + // because we actually want the value. + fieldName = fmt.Sprintf("%s.%s", name, fieldName) + if len(prefixMatches.Items) > 0 { + if err := d.decode(fieldName, prefixMatches, fieldValue); err != nil { + return err + } + } + for _, match := range matches.Items { + var decodeNode ast.Node = match.Val + if ot, ok := decodeNode.(*ast.ObjectType); ok { + decodeNode = &ast.ObjectList{Items: ot.List.Items} + } + + if err := d.decode(fieldName, decodeNode, fieldValue); err != nil { + return err + } + } + + decodedFields = append(decodedFields, field.Name) + } + + if len(decodedFieldsVal) > 0 { + // Sort it so that it is deterministic + sort.Strings(decodedFields) + + for _, v := range decodedFieldsVal { + v.Set(reflect.ValueOf(decodedFields)) + } + } + + return nil +} + +// findNodeType returns the type of ast.Node +func findNodeType() reflect.Type { + var nodeContainer struct { + Node ast.Node + } + value := reflect.ValueOf(nodeContainer).FieldByName("Node") + return value.Type() +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/go.mod b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/go.mod new file mode 100644 index 00000000..4debbbe3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/go.mod @@ -0,0 +1,3 @@ +module github.com/hashicorp/hcl + +require github.com/davecgh/go-spew v1.1.1 diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/go.sum b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/go.sum new file mode 100644 index 00000000..b5e2922e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/go.sum @@ -0,0 +1,2 @@ +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/hcl.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/hcl.go new file mode 100644 index 00000000..575a20b5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/hcl.go @@ -0,0 +1,11 @@ +// Package hcl decodes HCL into usable Go structures. +// +// hcl input can come in either pure HCL format or JSON format. +// It can be parsed into an AST, and then decoded into a structure, +// or it can be decoded directly from a string into a structure. +// +// If you choose to parse HCL into a raw AST, the benefit is that you +// can write custom visitor implementations to implement custom +// semantic checks. By default, HCL does not perform any semantic +// checks. +package hcl diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/hcl/ast/ast.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/hcl/ast/ast.go new file mode 100644 index 00000000..6e5ef654 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/hcl/ast/ast.go @@ -0,0 +1,219 @@ +// Package ast declares the types used to represent syntax trees for HCL +// (HashiCorp Configuration Language) +package ast + +import ( + "fmt" + "strings" + + "github.com/hashicorp/hcl/hcl/token" +) + +// Node is an element in the abstract syntax tree. +type Node interface { + node() + Pos() token.Pos +} + +func (File) node() {} +func (ObjectList) node() {} +func (ObjectKey) node() {} +func (ObjectItem) node() {} +func (Comment) node() {} +func (CommentGroup) node() {} +func (ObjectType) node() {} +func (LiteralType) node() {} +func (ListType) node() {} + +// File represents a single HCL file +type File struct { + Node Node // usually a *ObjectList + Comments []*CommentGroup // list of all comments in the source +} + +func (f *File) Pos() token.Pos { + return f.Node.Pos() +} + +// ObjectList represents a list of ObjectItems. An HCL file itself is an +// ObjectList. +type ObjectList struct { + Items []*ObjectItem +} + +func (o *ObjectList) Add(item *ObjectItem) { + o.Items = append(o.Items, item) +} + +// Filter filters out the objects with the given key list as a prefix. +// +// The returned list of objects contain ObjectItems where the keys have +// this prefix already stripped off. This might result in objects with +// zero-length key lists if they have no children. +// +// If no matches are found, an empty ObjectList (non-nil) is returned. +func (o *ObjectList) Filter(keys ...string) *ObjectList { + var result ObjectList + for _, item := range o.Items { + // If there aren't enough keys, then ignore this + if len(item.Keys) < len(keys) { + continue + } + + match := true + for i, key := range item.Keys[:len(keys)] { + key := key.Token.Value().(string) + if key != keys[i] && !strings.EqualFold(key, keys[i]) { + match = false + break + } + } + if !match { + continue + } + + // Strip off the prefix from the children + newItem := *item + newItem.Keys = newItem.Keys[len(keys):] + result.Add(&newItem) + } + + return &result +} + +// Children returns further nested objects (key length > 0) within this +// ObjectList. This should be used with Filter to get at child items. +func (o *ObjectList) Children() *ObjectList { + var result ObjectList + for _, item := range o.Items { + if len(item.Keys) > 0 { + result.Add(item) + } + } + + return &result +} + +// Elem returns items in the list that are direct element assignments +// (key length == 0). This should be used with Filter to get at elements. +func (o *ObjectList) Elem() *ObjectList { + var result ObjectList + for _, item := range o.Items { + if len(item.Keys) == 0 { + result.Add(item) + } + } + + return &result +} + +func (o *ObjectList) Pos() token.Pos { + // always returns the uninitiliazed position + return o.Items[0].Pos() +} + +// ObjectItem represents a HCL Object Item. An item is represented with a key +// (or keys). It can be an assignment or an object (both normal and nested) +type ObjectItem struct { + // keys is only one length long if it's of type assignment. If it's a + // nested object it can be larger than one. In that case "assign" is + // invalid as there is no assignments for a nested object. + Keys []*ObjectKey + + // assign contains the position of "=", if any + Assign token.Pos + + // val is the item itself. It can be an object,list, number, bool or a + // string. If key length is larger than one, val can be only of type + // Object. + Val Node + + LeadComment *CommentGroup // associated lead comment + LineComment *CommentGroup // associated line comment +} + +func (o *ObjectItem) Pos() token.Pos { + // I'm not entirely sure what causes this, but removing this causes + // a test failure. We should investigate at some point. + if len(o.Keys) == 0 { + return token.Pos{} + } + + return o.Keys[0].Pos() +} + +// ObjectKeys are either an identifier or of type string. +type ObjectKey struct { + Token token.Token +} + +func (o *ObjectKey) Pos() token.Pos { + return o.Token.Pos +} + +// LiteralType represents a literal of basic type. Valid types are: +// token.NUMBER, token.FLOAT, token.BOOL and token.STRING +type LiteralType struct { + Token token.Token + + // comment types, only used when in a list + LeadComment *CommentGroup + LineComment *CommentGroup +} + +func (l *LiteralType) Pos() token.Pos { + return l.Token.Pos +} + +// ListStatement represents a HCL List type +type ListType struct { + Lbrack token.Pos // position of "[" + Rbrack token.Pos // position of "]" + List []Node // the elements in lexical order +} + +func (l *ListType) Pos() token.Pos { + return l.Lbrack +} + +func (l *ListType) Add(node Node) { + l.List = append(l.List, node) +} + +// ObjectType represents a HCL Object Type +type ObjectType struct { + Lbrace token.Pos // position of "{" + Rbrace token.Pos // position of "}" + List *ObjectList // the nodes in lexical order +} + +func (o *ObjectType) Pos() token.Pos { + return o.Lbrace +} + +// Comment node represents a single //, # style or /*- style commment +type Comment struct { + Start token.Pos // position of / or # + Text string +} + +func (c *Comment) Pos() token.Pos { + return c.Start +} + +// CommentGroup node represents a sequence of comments with no other tokens and +// no empty lines between. +type CommentGroup struct { + List []*Comment // len(List) > 0 +} + +func (c *CommentGroup) Pos() token.Pos { + return c.List[0].Pos() +} + +//------------------------------------------------------------------- +// GoStringer +//------------------------------------------------------------------- + +func (o *ObjectKey) GoString() string { return fmt.Sprintf("*%#v", *o) } +func (o *ObjectList) GoString() string { return fmt.Sprintf("*%#v", *o) } diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/hcl/ast/walk.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/hcl/ast/walk.go new file mode 100644 index 00000000..ba07ad42 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/hcl/ast/walk.go @@ -0,0 +1,52 @@ +package ast + +import "fmt" + +// WalkFunc describes a function to be called for each node during a Walk. The +// returned node can be used to rewrite the AST. Walking stops the returned +// bool is false. +type WalkFunc func(Node) (Node, bool) + +// Walk traverses an AST in depth-first order: It starts by calling fn(node); +// node must not be nil. If fn returns true, Walk invokes fn recursively for +// each of the non-nil children of node, followed by a call of fn(nil). The +// returned node of fn can be used to rewrite the passed node to fn. +func Walk(node Node, fn WalkFunc) Node { + rewritten, ok := fn(node) + if !ok { + return rewritten + } + + switch n := node.(type) { + case *File: + n.Node = Walk(n.Node, fn) + case *ObjectList: + for i, item := range n.Items { + n.Items[i] = Walk(item, fn).(*ObjectItem) + } + case *ObjectKey: + // nothing to do + case *ObjectItem: + for i, k := range n.Keys { + n.Keys[i] = Walk(k, fn).(*ObjectKey) + } + + if n.Val != nil { + n.Val = Walk(n.Val, fn) + } + case *LiteralType: + // nothing to do + case *ListType: + for i, l := range n.List { + n.List[i] = Walk(l, fn) + } + case *ObjectType: + n.List = Walk(n.List, fn).(*ObjectList) + default: + // should we panic here? + fmt.Printf("unknown type: %T\n", n) + } + + fn(nil) + return rewritten +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/hcl/parser/error.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/hcl/parser/error.go new file mode 100644 index 00000000..5c99381d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/hcl/parser/error.go @@ -0,0 +1,17 @@ +package parser + +import ( + "fmt" + + "github.com/hashicorp/hcl/hcl/token" +) + +// PosError is a parse error that contains a position. +type PosError struct { + Pos token.Pos + Err error +} + +func (e *PosError) Error() string { + return fmt.Sprintf("At %s: %s", e.Pos, e.Err) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/hcl/parser/parser.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/hcl/parser/parser.go new file mode 100644 index 00000000..64c83bcf --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/hcl/parser/parser.go @@ -0,0 +1,532 @@ +// Package parser implements a parser for HCL (HashiCorp Configuration +// Language) +package parser + +import ( + "bytes" + "errors" + "fmt" + "strings" + + "github.com/hashicorp/hcl/hcl/ast" + "github.com/hashicorp/hcl/hcl/scanner" + "github.com/hashicorp/hcl/hcl/token" +) + +type Parser struct { + sc *scanner.Scanner + + // Last read token + tok token.Token + commaPrev token.Token + + comments []*ast.CommentGroup + leadComment *ast.CommentGroup // last lead comment + lineComment *ast.CommentGroup // last line comment + + enableTrace bool + indent int + n int // buffer size (max = 1) +} + +func newParser(src []byte) *Parser { + return &Parser{ + sc: scanner.New(src), + } +} + +// Parse returns the fully parsed source and returns the abstract syntax tree. +func Parse(src []byte) (*ast.File, error) { + // normalize all line endings + // since the scanner and output only work with "\n" line endings, we may + // end up with dangling "\r" characters in the parsed data. + src = bytes.Replace(src, []byte("\r\n"), []byte("\n"), -1) + + p := newParser(src) + return p.Parse() +} + +var errEofToken = errors.New("EOF token found") + +// Parse returns the fully parsed source and returns the abstract syntax tree. +func (p *Parser) Parse() (*ast.File, error) { + f := &ast.File{} + var err, scerr error + p.sc.Error = func(pos token.Pos, msg string) { + scerr = &PosError{Pos: pos, Err: errors.New(msg)} + } + + f.Node, err = p.objectList(false) + if scerr != nil { + return nil, scerr + } + if err != nil { + return nil, err + } + + f.Comments = p.comments + return f, nil +} + +// objectList parses a list of items within an object (generally k/v pairs). +// The parameter" obj" tells this whether to we are within an object (braces: +// '{', '}') or just at the top level. If we're within an object, we end +// at an RBRACE. +func (p *Parser) objectList(obj bool) (*ast.ObjectList, error) { + defer un(trace(p, "ParseObjectList")) + node := &ast.ObjectList{} + + for { + if obj { + tok := p.scan() + p.unscan() + if tok.Type == token.RBRACE { + break + } + } + + n, err := p.objectItem() + if err == errEofToken { + break // we are finished + } + + // we don't return a nil node, because might want to use already + // collected items. + if err != nil { + return node, err + } + + node.Add(n) + + // object lists can be optionally comma-delimited e.g. when a list of maps + // is being expressed, so a comma is allowed here - it's simply consumed + tok := p.scan() + if tok.Type != token.COMMA { + p.unscan() + } + } + return node, nil +} + +func (p *Parser) consumeComment() (comment *ast.Comment, endline int) { + endline = p.tok.Pos.Line + + // count the endline if it's multiline comment, ie starting with /* + if len(p.tok.Text) > 1 && p.tok.Text[1] == '*' { + // don't use range here - no need to decode Unicode code points + for i := 0; i < len(p.tok.Text); i++ { + if p.tok.Text[i] == '\n' { + endline++ + } + } + } + + comment = &ast.Comment{Start: p.tok.Pos, Text: p.tok.Text} + p.tok = p.sc.Scan() + return +} + +func (p *Parser) consumeCommentGroup(n int) (comments *ast.CommentGroup, endline int) { + var list []*ast.Comment + endline = p.tok.Pos.Line + + for p.tok.Type == token.COMMENT && p.tok.Pos.Line <= endline+n { + var comment *ast.Comment + comment, endline = p.consumeComment() + list = append(list, comment) + } + + // add comment group to the comments list + comments = &ast.CommentGroup{List: list} + p.comments = append(p.comments, comments) + + return +} + +// objectItem parses a single object item +func (p *Parser) objectItem() (*ast.ObjectItem, error) { + defer un(trace(p, "ParseObjectItem")) + + keys, err := p.objectKey() + if len(keys) > 0 && err == errEofToken { + // We ignore eof token here since it is an error if we didn't + // receive a value (but we did receive a key) for the item. + err = nil + } + if len(keys) > 0 && err != nil && p.tok.Type == token.RBRACE { + // This is a strange boolean statement, but what it means is: + // We have keys with no value, and we're likely in an object + // (since RBrace ends an object). For this, we set err to nil so + // we continue and get the error below of having the wrong value + // type. + err = nil + + // Reset the token type so we don't think it completed fine. See + // objectType which uses p.tok.Type to check if we're done with + // the object. + p.tok.Type = token.EOF + } + if err != nil { + return nil, err + } + + o := &ast.ObjectItem{ + Keys: keys, + } + + if p.leadComment != nil { + o.LeadComment = p.leadComment + p.leadComment = nil + } + + switch p.tok.Type { + case token.ASSIGN: + o.Assign = p.tok.Pos + o.Val, err = p.object() + if err != nil { + return nil, err + } + case token.LBRACE: + o.Val, err = p.objectType() + if err != nil { + return nil, err + } + default: + keyStr := make([]string, 0, len(keys)) + for _, k := range keys { + keyStr = append(keyStr, k.Token.Text) + } + + return nil, &PosError{ + Pos: p.tok.Pos, + Err: fmt.Errorf( + "key '%s' expected start of object ('{') or assignment ('=')", + strings.Join(keyStr, " ")), + } + } + + // key=#comment + // val + if p.lineComment != nil { + o.LineComment, p.lineComment = p.lineComment, nil + } + + // do a look-ahead for line comment + p.scan() + if len(keys) > 0 && o.Val.Pos().Line == keys[0].Pos().Line && p.lineComment != nil { + o.LineComment = p.lineComment + p.lineComment = nil + } + p.unscan() + return o, nil +} + +// objectKey parses an object key and returns a ObjectKey AST +func (p *Parser) objectKey() ([]*ast.ObjectKey, error) { + keyCount := 0 + keys := make([]*ast.ObjectKey, 0) + + for { + tok := p.scan() + switch tok.Type { + case token.EOF: + // It is very important to also return the keys here as well as + // the error. This is because we need to be able to tell if we + // did parse keys prior to finding the EOF, or if we just found + // a bare EOF. + return keys, errEofToken + case token.ASSIGN: + // assignment or object only, but not nested objects. this is not + // allowed: `foo bar = {}` + if keyCount > 1 { + return nil, &PosError{ + Pos: p.tok.Pos, + Err: fmt.Errorf("nested object expected: LBRACE got: %s", p.tok.Type), + } + } + + if keyCount == 0 { + return nil, &PosError{ + Pos: p.tok.Pos, + Err: errors.New("no object keys found!"), + } + } + + return keys, nil + case token.LBRACE: + var err error + + // If we have no keys, then it is a syntax error. i.e. {{}} is not + // allowed. + if len(keys) == 0 { + err = &PosError{ + Pos: p.tok.Pos, + Err: fmt.Errorf("expected: IDENT | STRING got: %s", p.tok.Type), + } + } + + // object + return keys, err + case token.IDENT, token.STRING: + keyCount++ + keys = append(keys, &ast.ObjectKey{Token: p.tok}) + case token.ILLEGAL: + return keys, &PosError{ + Pos: p.tok.Pos, + Err: fmt.Errorf("illegal character"), + } + default: + return keys, &PosError{ + Pos: p.tok.Pos, + Err: fmt.Errorf("expected: IDENT | STRING | ASSIGN | LBRACE got: %s", p.tok.Type), + } + } + } +} + +// object parses any type of object, such as number, bool, string, object or +// list. +func (p *Parser) object() (ast.Node, error) { + defer un(trace(p, "ParseType")) + tok := p.scan() + + switch tok.Type { + case token.NUMBER, token.FLOAT, token.BOOL, token.STRING, token.HEREDOC: + return p.literalType() + case token.LBRACE: + return p.objectType() + case token.LBRACK: + return p.listType() + case token.COMMENT: + // implement comment + case token.EOF: + return nil, errEofToken + } + + return nil, &PosError{ + Pos: tok.Pos, + Err: fmt.Errorf("Unknown token: %+v", tok), + } +} + +// objectType parses an object type and returns a ObjectType AST +func (p *Parser) objectType() (*ast.ObjectType, error) { + defer un(trace(p, "ParseObjectType")) + + // we assume that the currently scanned token is a LBRACE + o := &ast.ObjectType{ + Lbrace: p.tok.Pos, + } + + l, err := p.objectList(true) + + // if we hit RBRACE, we are good to go (means we parsed all Items), if it's + // not a RBRACE, it's an syntax error and we just return it. + if err != nil && p.tok.Type != token.RBRACE { + return nil, err + } + + // No error, scan and expect the ending to be a brace + if tok := p.scan(); tok.Type != token.RBRACE { + return nil, &PosError{ + Pos: tok.Pos, + Err: fmt.Errorf("object expected closing RBRACE got: %s", tok.Type), + } + } + + o.List = l + o.Rbrace = p.tok.Pos // advanced via parseObjectList + return o, nil +} + +// listType parses a list type and returns a ListType AST +func (p *Parser) listType() (*ast.ListType, error) { + defer un(trace(p, "ParseListType")) + + // we assume that the currently scanned token is a LBRACK + l := &ast.ListType{ + Lbrack: p.tok.Pos, + } + + needComma := false + for { + tok := p.scan() + if needComma { + switch tok.Type { + case token.COMMA, token.RBRACK: + default: + return nil, &PosError{ + Pos: tok.Pos, + Err: fmt.Errorf( + "error parsing list, expected comma or list end, got: %s", + tok.Type), + } + } + } + switch tok.Type { + case token.BOOL, token.NUMBER, token.FLOAT, token.STRING, token.HEREDOC: + node, err := p.literalType() + if err != nil { + return nil, err + } + + // If there is a lead comment, apply it + if p.leadComment != nil { + node.LeadComment = p.leadComment + p.leadComment = nil + } + + l.Add(node) + needComma = true + case token.COMMA: + // get next list item or we are at the end + // do a look-ahead for line comment + p.scan() + if p.lineComment != nil && len(l.List) > 0 { + lit, ok := l.List[len(l.List)-1].(*ast.LiteralType) + if ok { + lit.LineComment = p.lineComment + l.List[len(l.List)-1] = lit + p.lineComment = nil + } + } + p.unscan() + + needComma = false + continue + case token.LBRACE: + // Looks like a nested object, so parse it out + node, err := p.objectType() + if err != nil { + return nil, &PosError{ + Pos: tok.Pos, + Err: fmt.Errorf( + "error while trying to parse object within list: %s", err), + } + } + l.Add(node) + needComma = true + case token.LBRACK: + node, err := p.listType() + if err != nil { + return nil, &PosError{ + Pos: tok.Pos, + Err: fmt.Errorf( + "error while trying to parse list within list: %s", err), + } + } + l.Add(node) + case token.RBRACK: + // finished + l.Rbrack = p.tok.Pos + return l, nil + default: + return nil, &PosError{ + Pos: tok.Pos, + Err: fmt.Errorf("unexpected token while parsing list: %s", tok.Type), + } + } + } +} + +// literalType parses a literal type and returns a LiteralType AST +func (p *Parser) literalType() (*ast.LiteralType, error) { + defer un(trace(p, "ParseLiteral")) + + return &ast.LiteralType{ + Token: p.tok, + }, nil +} + +// scan returns the next token from the underlying scanner. If a token has +// been unscanned then read that instead. In the process, it collects any +// comment groups encountered, and remembers the last lead and line comments. +func (p *Parser) scan() token.Token { + // If we have a token on the buffer, then return it. + if p.n != 0 { + p.n = 0 + return p.tok + } + + // Otherwise read the next token from the scanner and Save it to the buffer + // in case we unscan later. + prev := p.tok + p.tok = p.sc.Scan() + + if p.tok.Type == token.COMMENT { + var comment *ast.CommentGroup + var endline int + + // fmt.Printf("p.tok.Pos.Line = %+v prev: %d endline %d \n", + // p.tok.Pos.Line, prev.Pos.Line, endline) + if p.tok.Pos.Line == prev.Pos.Line { + // The comment is on same line as the previous token; it + // cannot be a lead comment but may be a line comment. + comment, endline = p.consumeCommentGroup(0) + if p.tok.Pos.Line != endline { + // The next token is on a different line, thus + // the last comment group is a line comment. + p.lineComment = comment + } + } + + // consume successor comments, if any + endline = -1 + for p.tok.Type == token.COMMENT { + comment, endline = p.consumeCommentGroup(1) + } + + if endline+1 == p.tok.Pos.Line && p.tok.Type != token.RBRACE { + switch p.tok.Type { + case token.RBRACE, token.RBRACK: + // Do not count for these cases + default: + // The next token is following on the line immediately after the + // comment group, thus the last comment group is a lead comment. + p.leadComment = comment + } + } + + } + + return p.tok +} + +// unscan pushes the previously read token back onto the buffer. +func (p *Parser) unscan() { + p.n = 1 +} + +// ---------------------------------------------------------------------------- +// Parsing support + +func (p *Parser) printTrace(a ...interface{}) { + if !p.enableTrace { + return + } + + const dots = ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . " + const n = len(dots) + fmt.Printf("%5d:%3d: ", p.tok.Pos.Line, p.tok.Pos.Column) + + i := 2 * p.indent + for i > n { + fmt.Print(dots) + i -= n + } + // i <= n + fmt.Print(dots[0:i]) + fmt.Println(a...) +} + +func trace(p *Parser, msg string) *Parser { + p.printTrace(msg, "(") + p.indent++ + return p +} + +// Usage pattern: defer un(trace(p, "...")) +func un(p *Parser) { + p.indent-- + p.printTrace(")") +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/hcl/printer/nodes.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/hcl/printer/nodes.go new file mode 100644 index 00000000..7c038d12 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/hcl/printer/nodes.go @@ -0,0 +1,789 @@ +package printer + +import ( + "bytes" + "fmt" + "sort" + + "github.com/hashicorp/hcl/hcl/ast" + "github.com/hashicorp/hcl/hcl/token" +) + +const ( + blank = byte(' ') + newline = byte('\n') + tab = byte('\t') + infinity = 1 << 30 // offset or line +) + +var ( + unindent = []byte("\uE123") // in the private use space +) + +type printer struct { + cfg Config + prev token.Pos + + comments []*ast.CommentGroup // may be nil, contains all comments + standaloneComments []*ast.CommentGroup // contains all standalone comments (not assigned to any node) + + enableTrace bool + indentTrace int +} + +type ByPosition []*ast.CommentGroup + +func (b ByPosition) Len() int { return len(b) } +func (b ByPosition) Swap(i, j int) { b[i], b[j] = b[j], b[i] } +func (b ByPosition) Less(i, j int) bool { return b[i].Pos().Before(b[j].Pos()) } + +// collectComments comments all standalone comments which are not lead or line +// comment +func (p *printer) collectComments(node ast.Node) { + // first collect all comments. This is already stored in + // ast.File.(comments) + ast.Walk(node, func(nn ast.Node) (ast.Node, bool) { + switch t := nn.(type) { + case *ast.File: + p.comments = t.Comments + return nn, false + } + return nn, true + }) + + standaloneComments := make(map[token.Pos]*ast.CommentGroup, 0) + for _, c := range p.comments { + standaloneComments[c.Pos()] = c + } + + // next remove all lead and line comments from the overall comment map. + // This will give us comments which are standalone, comments which are not + // assigned to any kind of node. + ast.Walk(node, func(nn ast.Node) (ast.Node, bool) { + switch t := nn.(type) { + case *ast.LiteralType: + if t.LeadComment != nil { + for _, comment := range t.LeadComment.List { + if _, ok := standaloneComments[comment.Pos()]; ok { + delete(standaloneComments, comment.Pos()) + } + } + } + + if t.LineComment != nil { + for _, comment := range t.LineComment.List { + if _, ok := standaloneComments[comment.Pos()]; ok { + delete(standaloneComments, comment.Pos()) + } + } + } + case *ast.ObjectItem: + if t.LeadComment != nil { + for _, comment := range t.LeadComment.List { + if _, ok := standaloneComments[comment.Pos()]; ok { + delete(standaloneComments, comment.Pos()) + } + } + } + + if t.LineComment != nil { + for _, comment := range t.LineComment.List { + if _, ok := standaloneComments[comment.Pos()]; ok { + delete(standaloneComments, comment.Pos()) + } + } + } + } + + return nn, true + }) + + for _, c := range standaloneComments { + p.standaloneComments = append(p.standaloneComments, c) + } + + sort.Sort(ByPosition(p.standaloneComments)) +} + +// output prints creates b printable HCL output and returns it. +func (p *printer) output(n interface{}) []byte { + var buf bytes.Buffer + + switch t := n.(type) { + case *ast.File: + // File doesn't trace so we add the tracing here + defer un(trace(p, "File")) + return p.output(t.Node) + case *ast.ObjectList: + defer un(trace(p, "ObjectList")) + + var index int + for { + // Determine the location of the next actual non-comment + // item. If we're at the end, the next item is at "infinity" + var nextItem token.Pos + if index != len(t.Items) { + nextItem = t.Items[index].Pos() + } else { + nextItem = token.Pos{Offset: infinity, Line: infinity} + } + + // Go through the standalone comments in the file and print out + // the comments that we should be for this object item. + for _, c := range p.standaloneComments { + // Go through all the comments in the group. The group + // should be printed together, not separated by double newlines. + printed := false + newlinePrinted := false + for _, comment := range c.List { + // We only care about comments after the previous item + // we've printed so that comments are printed in the + // correct locations (between two objects for example). + // And before the next item. + if comment.Pos().After(p.prev) && comment.Pos().Before(nextItem) { + // if we hit the end add newlines so we can print the comment + // we don't do this if prev is invalid which means the + // beginning of the file since the first comment should + // be at the first line. + if !newlinePrinted && p.prev.IsValid() && index == len(t.Items) { + buf.Write([]byte{newline, newline}) + newlinePrinted = true + } + + // Write the actual comment. + buf.WriteString(comment.Text) + buf.WriteByte(newline) + + // Set printed to true to note that we printed something + printed = true + } + } + + // If we're not at the last item, write a new line so + // that there is a newline separating this comment from + // the next object. + if printed && index != len(t.Items) { + buf.WriteByte(newline) + } + } + + if index == len(t.Items) { + break + } + + buf.Write(p.output(t.Items[index])) + if index != len(t.Items)-1 { + // Always write a newline to separate us from the next item + buf.WriteByte(newline) + + // Need to determine if we're going to separate the next item + // with a blank line. The logic here is simple, though there + // are a few conditions: + // + // 1. The next object is more than one line away anyways, + // so we need an empty line. + // + // 2. The next object is not a "single line" object, so + // we need an empty line. + // + // 3. This current object is not a single line object, + // so we need an empty line. + current := t.Items[index] + next := t.Items[index+1] + if next.Pos().Line != t.Items[index].Pos().Line+1 || + !p.isSingleLineObject(next) || + !p.isSingleLineObject(current) { + buf.WriteByte(newline) + } + } + index++ + } + case *ast.ObjectKey: + buf.WriteString(t.Token.Text) + case *ast.ObjectItem: + p.prev = t.Pos() + buf.Write(p.objectItem(t)) + case *ast.LiteralType: + buf.Write(p.literalType(t)) + case *ast.ListType: + buf.Write(p.list(t)) + case *ast.ObjectType: + buf.Write(p.objectType(t)) + default: + fmt.Printf(" unknown type: %T\n", n) + } + + return buf.Bytes() +} + +func (p *printer) literalType(lit *ast.LiteralType) []byte { + result := []byte(lit.Token.Text) + switch lit.Token.Type { + case token.HEREDOC: + // Clear the trailing newline from heredocs + if result[len(result)-1] == '\n' { + result = result[:len(result)-1] + } + + // Poison lines 2+ so that we don't indent them + result = p.heredocIndent(result) + case token.STRING: + // If this is a multiline string, poison lines 2+ so we don't + // indent them. + if bytes.IndexRune(result, '\n') >= 0 { + result = p.heredocIndent(result) + } + } + + return result +} + +// objectItem returns the printable HCL form of an object item. An object type +// starts with one/multiple keys and has a value. The value might be of any +// type. +func (p *printer) objectItem(o *ast.ObjectItem) []byte { + defer un(trace(p, fmt.Sprintf("ObjectItem: %s", o.Keys[0].Token.Text))) + var buf bytes.Buffer + + if o.LeadComment != nil { + for _, comment := range o.LeadComment.List { + buf.WriteString(comment.Text) + buf.WriteByte(newline) + } + } + + // If key and val are on different lines, treat line comments like lead comments. + if o.LineComment != nil && o.Val.Pos().Line != o.Keys[0].Pos().Line { + for _, comment := range o.LineComment.List { + buf.WriteString(comment.Text) + buf.WriteByte(newline) + } + } + + for i, k := range o.Keys { + buf.WriteString(k.Token.Text) + buf.WriteByte(blank) + + // reach end of key + if o.Assign.IsValid() && i == len(o.Keys)-1 && len(o.Keys) == 1 { + buf.WriteString("=") + buf.WriteByte(blank) + } + } + + buf.Write(p.output(o.Val)) + + if o.LineComment != nil && o.Val.Pos().Line == o.Keys[0].Pos().Line { + buf.WriteByte(blank) + for _, comment := range o.LineComment.List { + buf.WriteString(comment.Text) + } + } + + return buf.Bytes() +} + +// objectType returns the printable HCL form of an object type. An object type +// begins with a brace and ends with a brace. +func (p *printer) objectType(o *ast.ObjectType) []byte { + defer un(trace(p, "ObjectType")) + var buf bytes.Buffer + buf.WriteString("{") + + var index int + var nextItem token.Pos + var commented, newlinePrinted bool + for { + // Determine the location of the next actual non-comment + // item. If we're at the end, the next item is the closing brace + if index != len(o.List.Items) { + nextItem = o.List.Items[index].Pos() + } else { + nextItem = o.Rbrace + } + + // Go through the standalone comments in the file and print out + // the comments that we should be for this object item. + for _, c := range p.standaloneComments { + printed := false + var lastCommentPos token.Pos + for _, comment := range c.List { + // We only care about comments after the previous item + // we've printed so that comments are printed in the + // correct locations (between two objects for example). + // And before the next item. + if comment.Pos().After(p.prev) && comment.Pos().Before(nextItem) { + // If there are standalone comments and the initial newline has not + // been printed yet, do it now. + if !newlinePrinted { + newlinePrinted = true + buf.WriteByte(newline) + } + + // add newline if it's between other printed nodes + if index > 0 { + commented = true + buf.WriteByte(newline) + } + + // Store this position + lastCommentPos = comment.Pos() + + // output the comment itself + buf.Write(p.indent(p.heredocIndent([]byte(comment.Text)))) + + // Set printed to true to note that we printed something + printed = true + + /* + if index != len(o.List.Items) { + buf.WriteByte(newline) // do not print on the end + } + */ + } + } + + // Stuff to do if we had comments + if printed { + // Always write a newline + buf.WriteByte(newline) + + // If there is another item in the object and our comment + // didn't hug it directly, then make sure there is a blank + // line separating them. + if nextItem != o.Rbrace && nextItem.Line != lastCommentPos.Line+1 { + buf.WriteByte(newline) + } + } + } + + if index == len(o.List.Items) { + p.prev = o.Rbrace + break + } + + // At this point we are sure that it's not a totally empty block: print + // the initial newline if it hasn't been printed yet by the previous + // block about standalone comments. + if !newlinePrinted { + buf.WriteByte(newline) + newlinePrinted = true + } + + // check if we have adjacent one liner items. If yes we'll going to align + // the comments. + var aligned []*ast.ObjectItem + for _, item := range o.List.Items[index:] { + // we don't group one line lists + if len(o.List.Items) == 1 { + break + } + + // one means a oneliner with out any lead comment + // two means a oneliner with lead comment + // anything else might be something else + cur := lines(string(p.objectItem(item))) + if cur > 2 { + break + } + + curPos := item.Pos() + + nextPos := token.Pos{} + if index != len(o.List.Items)-1 { + nextPos = o.List.Items[index+1].Pos() + } + + prevPos := token.Pos{} + if index != 0 { + prevPos = o.List.Items[index-1].Pos() + } + + // fmt.Println("DEBUG ----------------") + // fmt.Printf("prev = %+v prevPos: %s\n", prev, prevPos) + // fmt.Printf("cur = %+v curPos: %s\n", cur, curPos) + // fmt.Printf("next = %+v nextPos: %s\n", next, nextPos) + + if curPos.Line+1 == nextPos.Line { + aligned = append(aligned, item) + index++ + continue + } + + if curPos.Line-1 == prevPos.Line { + aligned = append(aligned, item) + index++ + + // finish if we have a new line or comment next. This happens + // if the next item is not adjacent + if curPos.Line+1 != nextPos.Line { + break + } + continue + } + + break + } + + // put newlines if the items are between other non aligned items. + // newlines are also added if there is a standalone comment already, so + // check it too + if !commented && index != len(aligned) { + buf.WriteByte(newline) + } + + if len(aligned) >= 1 { + p.prev = aligned[len(aligned)-1].Pos() + + items := p.alignedItems(aligned) + buf.Write(p.indent(items)) + } else { + p.prev = o.List.Items[index].Pos() + + buf.Write(p.indent(p.objectItem(o.List.Items[index]))) + index++ + } + + buf.WriteByte(newline) + } + + buf.WriteString("}") + return buf.Bytes() +} + +func (p *printer) alignedItems(items []*ast.ObjectItem) []byte { + var buf bytes.Buffer + + // find the longest key and value length, needed for alignment + var longestKeyLen int // longest key length + var longestValLen int // longest value length + for _, item := range items { + key := len(item.Keys[0].Token.Text) + val := len(p.output(item.Val)) + + if key > longestKeyLen { + longestKeyLen = key + } + + if val > longestValLen { + longestValLen = val + } + } + + for i, item := range items { + if item.LeadComment != nil { + for _, comment := range item.LeadComment.List { + buf.WriteString(comment.Text) + buf.WriteByte(newline) + } + } + + for i, k := range item.Keys { + keyLen := len(k.Token.Text) + buf.WriteString(k.Token.Text) + for i := 0; i < longestKeyLen-keyLen+1; i++ { + buf.WriteByte(blank) + } + + // reach end of key + if i == len(item.Keys)-1 && len(item.Keys) == 1 { + buf.WriteString("=") + buf.WriteByte(blank) + } + } + + val := p.output(item.Val) + valLen := len(val) + buf.Write(val) + + if item.Val.Pos().Line == item.Keys[0].Pos().Line && item.LineComment != nil { + for i := 0; i < longestValLen-valLen+1; i++ { + buf.WriteByte(blank) + } + + for _, comment := range item.LineComment.List { + buf.WriteString(comment.Text) + } + } + + // do not print for the last item + if i != len(items)-1 { + buf.WriteByte(newline) + } + } + + return buf.Bytes() +} + +// list returns the printable HCL form of an list type. +func (p *printer) list(l *ast.ListType) []byte { + if p.isSingleLineList(l) { + return p.singleLineList(l) + } + + var buf bytes.Buffer + buf.WriteString("[") + buf.WriteByte(newline) + + var longestLine int + for _, item := range l.List { + // for now we assume that the list only contains literal types + if lit, ok := item.(*ast.LiteralType); ok { + lineLen := len(lit.Token.Text) + if lineLen > longestLine { + longestLine = lineLen + } + } + } + + haveEmptyLine := false + for i, item := range l.List { + // If we have a lead comment, then we want to write that first + leadComment := false + if lit, ok := item.(*ast.LiteralType); ok && lit.LeadComment != nil { + leadComment = true + + // Ensure an empty line before every element with a + // lead comment (except the first item in a list). + if !haveEmptyLine && i != 0 { + buf.WriteByte(newline) + } + + for _, comment := range lit.LeadComment.List { + buf.Write(p.indent([]byte(comment.Text))) + buf.WriteByte(newline) + } + } + + // also indent each line + val := p.output(item) + curLen := len(val) + buf.Write(p.indent(val)) + + // if this item is a heredoc, then we output the comma on + // the next line. This is the only case this happens. + comma := []byte{','} + if lit, ok := item.(*ast.LiteralType); ok && lit.Token.Type == token.HEREDOC { + buf.WriteByte(newline) + comma = p.indent(comma) + } + + buf.Write(comma) + + if lit, ok := item.(*ast.LiteralType); ok && lit.LineComment != nil { + // if the next item doesn't have any comments, do not align + buf.WriteByte(blank) // align one space + for i := 0; i < longestLine-curLen; i++ { + buf.WriteByte(blank) + } + + for _, comment := range lit.LineComment.List { + buf.WriteString(comment.Text) + } + } + + buf.WriteByte(newline) + + // Ensure an empty line after every element with a + // lead comment (except the first item in a list). + haveEmptyLine = leadComment && i != len(l.List)-1 + if haveEmptyLine { + buf.WriteByte(newline) + } + } + + buf.WriteString("]") + return buf.Bytes() +} + +// isSingleLineList returns true if: +// * they were previously formatted entirely on one line +// * they consist entirely of literals +// * there are either no heredoc strings or the list has exactly one element +// * there are no line comments +func (printer) isSingleLineList(l *ast.ListType) bool { + for _, item := range l.List { + if item.Pos().Line != l.Lbrack.Line { + return false + } + + lit, ok := item.(*ast.LiteralType) + if !ok { + return false + } + + if lit.Token.Type == token.HEREDOC && len(l.List) != 1 { + return false + } + + if lit.LineComment != nil { + return false + } + } + + return true +} + +// singleLineList prints a simple single line list. +// For a definition of "simple", see isSingleLineList above. +func (p *printer) singleLineList(l *ast.ListType) []byte { + buf := &bytes.Buffer{} + + buf.WriteString("[") + for i, item := range l.List { + if i != 0 { + buf.WriteString(", ") + } + + // Output the item itself + buf.Write(p.output(item)) + + // The heredoc marker needs to be at the end of line. + if lit, ok := item.(*ast.LiteralType); ok && lit.Token.Type == token.HEREDOC { + buf.WriteByte(newline) + } + } + + buf.WriteString("]") + return buf.Bytes() +} + +// indent indents the lines of the given buffer for each non-empty line +func (p *printer) indent(buf []byte) []byte { + var prefix []byte + if p.cfg.SpacesWidth != 0 { + for i := 0; i < p.cfg.SpacesWidth; i++ { + prefix = append(prefix, blank) + } + } else { + prefix = []byte{tab} + } + + var res []byte + bol := true + for _, c := range buf { + if bol && c != '\n' { + res = append(res, prefix...) + } + + res = append(res, c) + bol = c == '\n' + } + return res +} + +// unindent removes all the indentation from the tombstoned lines +func (p *printer) unindent(buf []byte) []byte { + var res []byte + for i := 0; i < len(buf); i++ { + skip := len(buf)-i <= len(unindent) + if !skip { + skip = !bytes.Equal(unindent, buf[i:i+len(unindent)]) + } + if skip { + res = append(res, buf[i]) + continue + } + + // We have a marker. we have to backtrace here and clean out + // any whitespace ahead of our tombstone up to a \n + for j := len(res) - 1; j >= 0; j-- { + if res[j] == '\n' { + break + } + + res = res[:j] + } + + // Skip the entire unindent marker + i += len(unindent) - 1 + } + + return res +} + +// heredocIndent marks all the 2nd and further lines as unindentable +func (p *printer) heredocIndent(buf []byte) []byte { + var res []byte + bol := false + for _, c := range buf { + if bol && c != '\n' { + res = append(res, unindent...) + } + res = append(res, c) + bol = c == '\n' + } + return res +} + +// isSingleLineObject tells whether the given object item is a single +// line object such as "obj {}". +// +// A single line object: +// +// * has no lead comments (hence multi-line) +// * has no assignment +// * has no values in the stanza (within {}) +// +func (p *printer) isSingleLineObject(val *ast.ObjectItem) bool { + // If there is a lead comment, can't be one line + if val.LeadComment != nil { + return false + } + + // If there is assignment, we always break by line + if val.Assign.IsValid() { + return false + } + + // If it isn't an object type, then its not a single line object + ot, ok := val.Val.(*ast.ObjectType) + if !ok { + return false + } + + // If the object has no items, it is single line! + return len(ot.List.Items) == 0 +} + +func lines(txt string) int { + endline := 1 + for i := 0; i < len(txt); i++ { + if txt[i] == '\n' { + endline++ + } + } + return endline +} + +// ---------------------------------------------------------------------------- +// Tracing support + +func (p *printer) printTrace(a ...interface{}) { + if !p.enableTrace { + return + } + + const dots = ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . " + const n = len(dots) + i := 2 * p.indentTrace + for i > n { + fmt.Print(dots) + i -= n + } + // i <= n + fmt.Print(dots[0:i]) + fmt.Println(a...) +} + +func trace(p *printer, msg string) *printer { + p.printTrace(msg, "(") + p.indentTrace++ + return p +} + +// Usage pattern: defer un(trace(p, "...")) +func un(p *printer) { + p.indentTrace-- + p.printTrace(")") +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/hcl/printer/printer.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/hcl/printer/printer.go new file mode 100644 index 00000000..6617ab8e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/hcl/printer/printer.go @@ -0,0 +1,66 @@ +// Package printer implements printing of AST nodes to HCL format. +package printer + +import ( + "bytes" + "io" + "text/tabwriter" + + "github.com/hashicorp/hcl/hcl/ast" + "github.com/hashicorp/hcl/hcl/parser" +) + +var DefaultConfig = Config{ + SpacesWidth: 2, +} + +// A Config node controls the output of Fprint. +type Config struct { + SpacesWidth int // if set, it will use spaces instead of tabs for alignment +} + +func (c *Config) Fprint(output io.Writer, node ast.Node) error { + p := &printer{ + cfg: *c, + comments: make([]*ast.CommentGroup, 0), + standaloneComments: make([]*ast.CommentGroup, 0), + // enableTrace: true, + } + + p.collectComments(node) + + if _, err := output.Write(p.unindent(p.output(node))); err != nil { + return err + } + + // flush tabwriter, if any + var err error + if tw, _ := output.(*tabwriter.Writer); tw != nil { + err = tw.Flush() + } + + return err +} + +// Fprint "pretty-prints" an HCL node to output +// It calls Config.Fprint with default settings. +func Fprint(output io.Writer, node ast.Node) error { + return DefaultConfig.Fprint(output, node) +} + +// Format formats src HCL and returns the result. +func Format(src []byte) ([]byte, error) { + node, err := parser.Parse(src) + if err != nil { + return nil, err + } + + var buf bytes.Buffer + if err := DefaultConfig.Fprint(&buf, node); err != nil { + return nil, err + } + + // Add trailing newline to result + buf.WriteString("\n") + return buf.Bytes(), nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/hcl/scanner/scanner.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/hcl/scanner/scanner.go new file mode 100644 index 00000000..624a18fe --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/hcl/scanner/scanner.go @@ -0,0 +1,652 @@ +// Package scanner implements a scanner for HCL (HashiCorp Configuration +// Language) source text. +package scanner + +import ( + "bytes" + "fmt" + "os" + "regexp" + "unicode" + "unicode/utf8" + + "github.com/hashicorp/hcl/hcl/token" +) + +// eof represents a marker rune for the end of the reader. +const eof = rune(0) + +// Scanner defines a lexical scanner +type Scanner struct { + buf *bytes.Buffer // Source buffer for advancing and scanning + src []byte // Source buffer for immutable access + + // Source Position + srcPos token.Pos // current position + prevPos token.Pos // previous position, used for peek() method + + lastCharLen int // length of last character in bytes + lastLineLen int // length of last line in characters (for correct column reporting) + + tokStart int // token text start position + tokEnd int // token text end position + + // Error is called for each error encountered. If no Error + // function is set, the error is reported to os.Stderr. + Error func(pos token.Pos, msg string) + + // ErrorCount is incremented by one for each error encountered. + ErrorCount int + + // tokPos is the start position of most recently scanned token; set by + // Scan. The Filename field is always left untouched by the Scanner. If + // an error is reported (via Error) and Position is invalid, the scanner is + // not inside a token. + tokPos token.Pos +} + +// New creates and initializes a new instance of Scanner using src as +// its source content. +func New(src []byte) *Scanner { + // even though we accept a src, we read from a io.Reader compatible type + // (*bytes.Buffer). So in the future we might easily change it to streaming + // read. + b := bytes.NewBuffer(src) + s := &Scanner{ + buf: b, + src: src, + } + + // srcPosition always starts with 1 + s.srcPos.Line = 1 + return s +} + +// next reads the next rune from the bufferred reader. Returns the rune(0) if +// an error occurs (or io.EOF is returned). +func (s *Scanner) next() rune { + ch, size, err := s.buf.ReadRune() + if err != nil { + // advance for error reporting + s.srcPos.Column++ + s.srcPos.Offset += size + s.lastCharLen = size + return eof + } + + // remember last position + s.prevPos = s.srcPos + + s.srcPos.Column++ + s.lastCharLen = size + s.srcPos.Offset += size + + if ch == utf8.RuneError && size == 1 { + s.err("illegal UTF-8 encoding") + return ch + } + + if ch == '\n' { + s.srcPos.Line++ + s.lastLineLen = s.srcPos.Column + s.srcPos.Column = 0 + } + + if ch == '\x00' { + s.err("unexpected null character (0x00)") + return eof + } + + if ch == '\uE123' { + s.err("unicode code point U+E123 reserved for internal use") + return utf8.RuneError + } + + // debug + // fmt.Printf("ch: %q, offset:column: %d:%d\n", ch, s.srcPos.Offset, s.srcPos.Column) + return ch +} + +// unread unreads the previous read Rune and updates the source position +func (s *Scanner) unread() { + if err := s.buf.UnreadRune(); err != nil { + panic(err) // this is user fault, we should catch it + } + s.srcPos = s.prevPos // put back last position +} + +// peek returns the next rune without advancing the reader. +func (s *Scanner) peek() rune { + peek, _, err := s.buf.ReadRune() + if err != nil { + return eof + } + + s.buf.UnreadRune() + return peek +} + +// Scan scans the next token and returns the token. +func (s *Scanner) Scan() token.Token { + ch := s.next() + + // skip white space + for isWhitespace(ch) { + ch = s.next() + } + + var tok token.Type + + // token text markings + s.tokStart = s.srcPos.Offset - s.lastCharLen + + // token position, initial next() is moving the offset by one(size of rune + // actually), though we are interested with the starting point + s.tokPos.Offset = s.srcPos.Offset - s.lastCharLen + if s.srcPos.Column > 0 { + // common case: last character was not a '\n' + s.tokPos.Line = s.srcPos.Line + s.tokPos.Column = s.srcPos.Column + } else { + // last character was a '\n' + // (we cannot be at the beginning of the source + // since we have called next() at least once) + s.tokPos.Line = s.srcPos.Line - 1 + s.tokPos.Column = s.lastLineLen + } + + switch { + case isLetter(ch): + tok = token.IDENT + lit := s.scanIdentifier() + if lit == "true" || lit == "false" { + tok = token.BOOL + } + case isDecimal(ch): + tok = s.scanNumber(ch) + default: + switch ch { + case eof: + tok = token.EOF + case '"': + tok = token.STRING + s.scanString() + case '#', '/': + tok = token.COMMENT + s.scanComment(ch) + case '.': + tok = token.PERIOD + ch = s.peek() + if isDecimal(ch) { + tok = token.FLOAT + ch = s.scanMantissa(ch) + ch = s.scanExponent(ch) + } + case '<': + tok = token.HEREDOC + s.scanHeredoc() + case '[': + tok = token.LBRACK + case ']': + tok = token.RBRACK + case '{': + tok = token.LBRACE + case '}': + tok = token.RBRACE + case ',': + tok = token.COMMA + case '=': + tok = token.ASSIGN + case '+': + tok = token.ADD + case '-': + if isDecimal(s.peek()) { + ch := s.next() + tok = s.scanNumber(ch) + } else { + tok = token.SUB + } + default: + s.err("illegal char") + } + } + + // finish token ending + s.tokEnd = s.srcPos.Offset + + // create token literal + var tokenText string + if s.tokStart >= 0 { + tokenText = string(s.src[s.tokStart:s.tokEnd]) + } + s.tokStart = s.tokEnd // ensure idempotency of tokenText() call + + return token.Token{ + Type: tok, + Pos: s.tokPos, + Text: tokenText, + } +} + +func (s *Scanner) scanComment(ch rune) { + // single line comments + if ch == '#' || (ch == '/' && s.peek() != '*') { + if ch == '/' && s.peek() != '/' { + s.err("expected '/' for comment") + return + } + + ch = s.next() + for ch != '\n' && ch >= 0 && ch != eof { + ch = s.next() + } + if ch != eof && ch >= 0 { + s.unread() + } + return + } + + // be sure we get the character after /* This allows us to find comment's + // that are not erminated + if ch == '/' { + s.next() + ch = s.next() // read character after "/*" + } + + // look for /* - style comments + for { + if ch < 0 || ch == eof { + s.err("comment not terminated") + break + } + + ch0 := ch + ch = s.next() + if ch0 == '*' && ch == '/' { + break + } + } +} + +// scanNumber scans a HCL number definition starting with the given rune +func (s *Scanner) scanNumber(ch rune) token.Type { + if ch == '0' { + // check for hexadecimal, octal or float + ch = s.next() + if ch == 'x' || ch == 'X' { + // hexadecimal + ch = s.next() + found := false + for isHexadecimal(ch) { + ch = s.next() + found = true + } + + if !found { + s.err("illegal hexadecimal number") + } + + if ch != eof { + s.unread() + } + + return token.NUMBER + } + + // now it's either something like: 0421(octal) or 0.1231(float) + illegalOctal := false + for isDecimal(ch) { + ch = s.next() + if ch == '8' || ch == '9' { + // this is just a possibility. For example 0159 is illegal, but + // 0159.23 is valid. So we mark a possible illegal octal. If + // the next character is not a period, we'll print the error. + illegalOctal = true + } + } + + if ch == 'e' || ch == 'E' { + ch = s.scanExponent(ch) + return token.FLOAT + } + + if ch == '.' { + ch = s.scanFraction(ch) + + if ch == 'e' || ch == 'E' { + ch = s.next() + ch = s.scanExponent(ch) + } + return token.FLOAT + } + + if illegalOctal { + s.err("illegal octal number") + } + + if ch != eof { + s.unread() + } + return token.NUMBER + } + + s.scanMantissa(ch) + ch = s.next() // seek forward + if ch == 'e' || ch == 'E' { + ch = s.scanExponent(ch) + return token.FLOAT + } + + if ch == '.' { + ch = s.scanFraction(ch) + if ch == 'e' || ch == 'E' { + ch = s.next() + ch = s.scanExponent(ch) + } + return token.FLOAT + } + + if ch != eof { + s.unread() + } + return token.NUMBER +} + +// scanMantissa scans the mantissa beginning from the rune. It returns the next +// non decimal rune. It's used to determine wheter it's a fraction or exponent. +func (s *Scanner) scanMantissa(ch rune) rune { + scanned := false + for isDecimal(ch) { + ch = s.next() + scanned = true + } + + if scanned && ch != eof { + s.unread() + } + return ch +} + +// scanFraction scans the fraction after the '.' rune +func (s *Scanner) scanFraction(ch rune) rune { + if ch == '.' { + ch = s.peek() // we peek just to see if we can move forward + ch = s.scanMantissa(ch) + } + return ch +} + +// scanExponent scans the remaining parts of an exponent after the 'e' or 'E' +// rune. +func (s *Scanner) scanExponent(ch rune) rune { + if ch == 'e' || ch == 'E' { + ch = s.next() + if ch == '-' || ch == '+' { + ch = s.next() + } + ch = s.scanMantissa(ch) + } + return ch +} + +// scanHeredoc scans a heredoc string +func (s *Scanner) scanHeredoc() { + // Scan the second '<' in example: '<= len(identBytes) && identRegexp.Match(s.src[lineStart:s.srcPos.Offset-s.lastCharLen]) { + break + } + + // Not an anchor match, record the start of a new line + lineStart = s.srcPos.Offset + } + + if ch == eof { + s.err("heredoc not terminated") + return + } + } + + return +} + +// scanString scans a quoted string +func (s *Scanner) scanString() { + braces := 0 + for { + // '"' opening already consumed + // read character after quote + ch := s.next() + + if (ch == '\n' && braces == 0) || ch < 0 || ch == eof { + s.err("literal not terminated") + return + } + + if ch == '"' && braces == 0 { + break + } + + // If we're going into a ${} then we can ignore quotes for awhile + if braces == 0 && ch == '$' && s.peek() == '{' { + braces++ + s.next() + } else if braces > 0 && ch == '{' { + braces++ + } + if braces > 0 && ch == '}' { + braces-- + } + + if ch == '\\' { + s.scanEscape() + } + } + + return +} + +// scanEscape scans an escape sequence +func (s *Scanner) scanEscape() rune { + // http://en.cppreference.com/w/cpp/language/escape + ch := s.next() // read character after '/' + switch ch { + case 'a', 'b', 'f', 'n', 'r', 't', 'v', '\\', '"': + // nothing to do + case '0', '1', '2', '3', '4', '5', '6', '7': + // octal notation + ch = s.scanDigits(ch, 8, 3) + case 'x': + // hexademical notation + ch = s.scanDigits(s.next(), 16, 2) + case 'u': + // universal character name + ch = s.scanDigits(s.next(), 16, 4) + case 'U': + // universal character name + ch = s.scanDigits(s.next(), 16, 8) + default: + s.err("illegal char escape") + } + return ch +} + +// scanDigits scans a rune with the given base for n times. For example an +// octal notation \184 would yield in scanDigits(ch, 8, 3) +func (s *Scanner) scanDigits(ch rune, base, n int) rune { + start := n + for n > 0 && digitVal(ch) < base { + ch = s.next() + if ch == eof { + // If we see an EOF, we halt any more scanning of digits + // immediately. + break + } + + n-- + } + if n > 0 { + s.err("illegal char escape") + } + + if n != start && ch != eof { + // we scanned all digits, put the last non digit char back, + // only if we read anything at all + s.unread() + } + + return ch +} + +// scanIdentifier scans an identifier and returns the literal string +func (s *Scanner) scanIdentifier() string { + offs := s.srcPos.Offset - s.lastCharLen + ch := s.next() + for isLetter(ch) || isDigit(ch) || ch == '-' || ch == '.' { + ch = s.next() + } + + if ch != eof { + s.unread() // we got identifier, put back latest char + } + + return string(s.src[offs:s.srcPos.Offset]) +} + +// recentPosition returns the position of the character immediately after the +// character or token returned by the last call to Scan. +func (s *Scanner) recentPosition() (pos token.Pos) { + pos.Offset = s.srcPos.Offset - s.lastCharLen + switch { + case s.srcPos.Column > 0: + // common case: last character was not a '\n' + pos.Line = s.srcPos.Line + pos.Column = s.srcPos.Column + case s.lastLineLen > 0: + // last character was a '\n' + // (we cannot be at the beginning of the source + // since we have called next() at least once) + pos.Line = s.srcPos.Line - 1 + pos.Column = s.lastLineLen + default: + // at the beginning of the source + pos.Line = 1 + pos.Column = 1 + } + return +} + +// err prints the error of any scanning to s.Error function. If the function is +// not defined, by default it prints them to os.Stderr +func (s *Scanner) err(msg string) { + s.ErrorCount++ + pos := s.recentPosition() + + if s.Error != nil { + s.Error(pos, msg) + return + } + + fmt.Fprintf(os.Stderr, "%s: %s\n", pos, msg) +} + +// isHexadecimal returns true if the given rune is a letter +func isLetter(ch rune) bool { + return 'a' <= ch && ch <= 'z' || 'A' <= ch && ch <= 'Z' || ch == '_' || ch >= 0x80 && unicode.IsLetter(ch) +} + +// isDigit returns true if the given rune is a decimal digit +func isDigit(ch rune) bool { + return '0' <= ch && ch <= '9' || ch >= 0x80 && unicode.IsDigit(ch) +} + +// isDecimal returns true if the given rune is a decimal number +func isDecimal(ch rune) bool { + return '0' <= ch && ch <= '9' +} + +// isHexadecimal returns true if the given rune is an hexadecimal number +func isHexadecimal(ch rune) bool { + return '0' <= ch && ch <= '9' || 'a' <= ch && ch <= 'f' || 'A' <= ch && ch <= 'F' +} + +// isWhitespace returns true if the rune is a space, tab, newline or carriage return +func isWhitespace(ch rune) bool { + return ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r' +} + +// digitVal returns the integer value of a given octal,decimal or hexadecimal rune +func digitVal(ch rune) int { + switch { + case '0' <= ch && ch <= '9': + return int(ch - '0') + case 'a' <= ch && ch <= 'f': + return int(ch - 'a' + 10) + case 'A' <= ch && ch <= 'F': + return int(ch - 'A' + 10) + } + return 16 // larger than any legal digit val +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/hcl/strconv/quote.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/hcl/strconv/quote.go new file mode 100644 index 00000000..5f981eaa --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/hcl/strconv/quote.go @@ -0,0 +1,241 @@ +package strconv + +import ( + "errors" + "unicode/utf8" +) + +// ErrSyntax indicates that a value does not have the right syntax for the target type. +var ErrSyntax = errors.New("invalid syntax") + +// Unquote interprets s as a single-quoted, double-quoted, +// or backquoted Go string literal, returning the string value +// that s quotes. (If s is single-quoted, it would be a Go +// character literal; Unquote returns the corresponding +// one-character string.) +func Unquote(s string) (t string, err error) { + n := len(s) + if n < 2 { + return "", ErrSyntax + } + quote := s[0] + if quote != s[n-1] { + return "", ErrSyntax + } + s = s[1 : n-1] + + if quote != '"' { + return "", ErrSyntax + } + if !contains(s, '$') && !contains(s, '{') && contains(s, '\n') { + return "", ErrSyntax + } + + // Is it trivial? Avoid allocation. + if !contains(s, '\\') && !contains(s, quote) && !contains(s, '$') { + switch quote { + case '"': + return s, nil + case '\'': + r, size := utf8.DecodeRuneInString(s) + if size == len(s) && (r != utf8.RuneError || size != 1) { + return s, nil + } + } + } + + var runeTmp [utf8.UTFMax]byte + buf := make([]byte, 0, 3*len(s)/2) // Try to avoid more allocations. + for len(s) > 0 { + // If we're starting a '${}' then let it through un-unquoted. + // Specifically: we don't unquote any characters within the `${}` + // section. + if s[0] == '$' && len(s) > 1 && s[1] == '{' { + buf = append(buf, '$', '{') + s = s[2:] + + // Continue reading until we find the closing brace, copying as-is + braces := 1 + for len(s) > 0 && braces > 0 { + r, size := utf8.DecodeRuneInString(s) + if r == utf8.RuneError { + return "", ErrSyntax + } + + s = s[size:] + + n := utf8.EncodeRune(runeTmp[:], r) + buf = append(buf, runeTmp[:n]...) + + switch r { + case '{': + braces++ + case '}': + braces-- + } + } + if braces != 0 { + return "", ErrSyntax + } + if len(s) == 0 { + // If there's no string left, we're done! + break + } else { + // If there's more left, we need to pop back up to the top of the loop + // in case there's another interpolation in this string. + continue + } + } + + if s[0] == '\n' { + return "", ErrSyntax + } + + c, multibyte, ss, err := unquoteChar(s, quote) + if err != nil { + return "", err + } + s = ss + if c < utf8.RuneSelf || !multibyte { + buf = append(buf, byte(c)) + } else { + n := utf8.EncodeRune(runeTmp[:], c) + buf = append(buf, runeTmp[:n]...) + } + if quote == '\'' && len(s) != 0 { + // single-quoted must be single character + return "", ErrSyntax + } + } + return string(buf), nil +} + +// contains reports whether the string contains the byte c. +func contains(s string, c byte) bool { + for i := 0; i < len(s); i++ { + if s[i] == c { + return true + } + } + return false +} + +func unhex(b byte) (v rune, ok bool) { + c := rune(b) + switch { + case '0' <= c && c <= '9': + return c - '0', true + case 'a' <= c && c <= 'f': + return c - 'a' + 10, true + case 'A' <= c && c <= 'F': + return c - 'A' + 10, true + } + return +} + +func unquoteChar(s string, quote byte) (value rune, multibyte bool, tail string, err error) { + // easy cases + switch c := s[0]; { + case c == quote && (quote == '\'' || quote == '"'): + err = ErrSyntax + return + case c >= utf8.RuneSelf: + r, size := utf8.DecodeRuneInString(s) + return r, true, s[size:], nil + case c != '\\': + return rune(s[0]), false, s[1:], nil + } + + // hard case: c is backslash + if len(s) <= 1 { + err = ErrSyntax + return + } + c := s[1] + s = s[2:] + + switch c { + case 'a': + value = '\a' + case 'b': + value = '\b' + case 'f': + value = '\f' + case 'n': + value = '\n' + case 'r': + value = '\r' + case 't': + value = '\t' + case 'v': + value = '\v' + case 'x', 'u', 'U': + n := 0 + switch c { + case 'x': + n = 2 + case 'u': + n = 4 + case 'U': + n = 8 + } + var v rune + if len(s) < n { + err = ErrSyntax + return + } + for j := 0; j < n; j++ { + x, ok := unhex(s[j]) + if !ok { + err = ErrSyntax + return + } + v = v<<4 | x + } + s = s[n:] + if c == 'x' { + // single-byte string, possibly not UTF-8 + value = v + break + } + if v > utf8.MaxRune { + err = ErrSyntax + return + } + value = v + multibyte = true + case '0', '1', '2', '3', '4', '5', '6', '7': + v := rune(c) - '0' + if len(s) < 2 { + err = ErrSyntax + return + } + for j := 0; j < 2; j++ { // one digit already; two more + x := rune(s[j]) - '0' + if x < 0 || x > 7 { + err = ErrSyntax + return + } + v = (v << 3) | x + } + s = s[2:] + if v > 255 { + err = ErrSyntax + return + } + value = v + case '\\': + value = '\\' + case '\'', '"': + if c != quote { + err = ErrSyntax + return + } + value = rune(c) + default: + err = ErrSyntax + return + } + tail = s + return +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/hcl/token/position.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/hcl/token/position.go new file mode 100644 index 00000000..59c1bb72 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/hcl/token/position.go @@ -0,0 +1,46 @@ +package token + +import "fmt" + +// Pos describes an arbitrary source position +// including the file, line, and column location. +// A Position is valid if the line number is > 0. +type Pos struct { + Filename string // filename, if any + Offset int // offset, starting at 0 + Line int // line number, starting at 1 + Column int // column number, starting at 1 (character count) +} + +// IsValid returns true if the position is valid. +func (p *Pos) IsValid() bool { return p.Line > 0 } + +// String returns a string in one of several forms: +// +// file:line:column valid position with file name +// line:column valid position without file name +// file invalid position with file name +// - invalid position without file name +func (p Pos) String() string { + s := p.Filename + if p.IsValid() { + if s != "" { + s += ":" + } + s += fmt.Sprintf("%d:%d", p.Line, p.Column) + } + if s == "" { + s = "-" + } + return s +} + +// Before reports whether the position p is before u. +func (p Pos) Before(u Pos) bool { + return u.Offset > p.Offset || u.Line > p.Line +} + +// After reports whether the position p is after u. +func (p Pos) After(u Pos) bool { + return u.Offset < p.Offset || u.Line < p.Line +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/hcl/token/token.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/hcl/token/token.go new file mode 100644 index 00000000..e37c0664 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/hcl/token/token.go @@ -0,0 +1,219 @@ +// Package token defines constants representing the lexical tokens for HCL +// (HashiCorp Configuration Language) +package token + +import ( + "fmt" + "strconv" + "strings" + + hclstrconv "github.com/hashicorp/hcl/hcl/strconv" +) + +// Token defines a single HCL token which can be obtained via the Scanner +type Token struct { + Type Type + Pos Pos + Text string + JSON bool +} + +// Type is the set of lexical tokens of the HCL (HashiCorp Configuration Language) +type Type int + +const ( + // Special tokens + ILLEGAL Type = iota + EOF + COMMENT + + identifier_beg + IDENT // literals + literal_beg + NUMBER // 12345 + FLOAT // 123.45 + BOOL // true,false + STRING // "abc" + HEREDOC // < 0 { + // Pop the current item + n := len(frontier) + item := frontier[n-1] + frontier = frontier[:n-1] + + switch v := item.Val.(type) { + case *ast.ObjectType: + items, frontier = flattenObjectType(v, item, items, frontier) + case *ast.ListType: + items, frontier = flattenListType(v, item, items, frontier) + default: + items = append(items, item) + } + } + + // Reverse the list since the frontier model runs things backwards + for i := len(items)/2 - 1; i >= 0; i-- { + opp := len(items) - 1 - i + items[i], items[opp] = items[opp], items[i] + } + + // Done! Set the original items + list.Items = items + return n, true + }) +} + +func flattenListType( + ot *ast.ListType, + item *ast.ObjectItem, + items []*ast.ObjectItem, + frontier []*ast.ObjectItem) ([]*ast.ObjectItem, []*ast.ObjectItem) { + // If the list is empty, keep the original list + if len(ot.List) == 0 { + items = append(items, item) + return items, frontier + } + + // All the elements of this object must also be objects! + for _, subitem := range ot.List { + if _, ok := subitem.(*ast.ObjectType); !ok { + items = append(items, item) + return items, frontier + } + } + + // Great! We have a match go through all the items and flatten + for _, elem := range ot.List { + // Add it to the frontier so that we can recurse + frontier = append(frontier, &ast.ObjectItem{ + Keys: item.Keys, + Assign: item.Assign, + Val: elem, + LeadComment: item.LeadComment, + LineComment: item.LineComment, + }) + } + + return items, frontier +} + +func flattenObjectType( + ot *ast.ObjectType, + item *ast.ObjectItem, + items []*ast.ObjectItem, + frontier []*ast.ObjectItem) ([]*ast.ObjectItem, []*ast.ObjectItem) { + // If the list has no items we do not have to flatten anything + if ot.List.Items == nil { + items = append(items, item) + return items, frontier + } + + // All the elements of this object must also be objects! + for _, subitem := range ot.List.Items { + if _, ok := subitem.Val.(*ast.ObjectType); !ok { + items = append(items, item) + return items, frontier + } + } + + // Great! We have a match go through all the items and flatten + for _, subitem := range ot.List.Items { + // Copy the new key + keys := make([]*ast.ObjectKey, len(item.Keys)+len(subitem.Keys)) + copy(keys, item.Keys) + copy(keys[len(item.Keys):], subitem.Keys) + + // Add it to the frontier so that we can recurse + frontier = append(frontier, &ast.ObjectItem{ + Keys: keys, + Assign: item.Assign, + Val: subitem.Val, + LeadComment: item.LeadComment, + LineComment: item.LineComment, + }) + } + + return items, frontier +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/json/parser/parser.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/json/parser/parser.go new file mode 100644 index 00000000..125a5f07 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/json/parser/parser.go @@ -0,0 +1,313 @@ +package parser + +import ( + "errors" + "fmt" + + "github.com/hashicorp/hcl/hcl/ast" + hcltoken "github.com/hashicorp/hcl/hcl/token" + "github.com/hashicorp/hcl/json/scanner" + "github.com/hashicorp/hcl/json/token" +) + +type Parser struct { + sc *scanner.Scanner + + // Last read token + tok token.Token + commaPrev token.Token + + enableTrace bool + indent int + n int // buffer size (max = 1) +} + +func newParser(src []byte) *Parser { + return &Parser{ + sc: scanner.New(src), + } +} + +// Parse returns the fully parsed source and returns the abstract syntax tree. +func Parse(src []byte) (*ast.File, error) { + p := newParser(src) + return p.Parse() +} + +var errEofToken = errors.New("EOF token found") + +// Parse returns the fully parsed source and returns the abstract syntax tree. +func (p *Parser) Parse() (*ast.File, error) { + f := &ast.File{} + var err, scerr error + p.sc.Error = func(pos token.Pos, msg string) { + scerr = fmt.Errorf("%s: %s", pos, msg) + } + + // The root must be an object in JSON + object, err := p.object() + if scerr != nil { + return nil, scerr + } + if err != nil { + return nil, err + } + + // We make our final node an object list so it is more HCL compatible + f.Node = object.List + + // Flatten it, which finds patterns and turns them into more HCL-like + // AST trees. + flattenObjects(f.Node) + + return f, nil +} + +func (p *Parser) objectList() (*ast.ObjectList, error) { + defer un(trace(p, "ParseObjectList")) + node := &ast.ObjectList{} + + for { + n, err := p.objectItem() + if err == errEofToken { + break // we are finished + } + + // we don't return a nil node, because might want to use already + // collected items. + if err != nil { + return node, err + } + + node.Add(n) + + // Check for a followup comma. If it isn't a comma, then we're done + if tok := p.scan(); tok.Type != token.COMMA { + break + } + } + + return node, nil +} + +// objectItem parses a single object item +func (p *Parser) objectItem() (*ast.ObjectItem, error) { + defer un(trace(p, "ParseObjectItem")) + + keys, err := p.objectKey() + if err != nil { + return nil, err + } + + o := &ast.ObjectItem{ + Keys: keys, + } + + switch p.tok.Type { + case token.COLON: + pos := p.tok.Pos + o.Assign = hcltoken.Pos{ + Filename: pos.Filename, + Offset: pos.Offset, + Line: pos.Line, + Column: pos.Column, + } + + o.Val, err = p.objectValue() + if err != nil { + return nil, err + } + } + + return o, nil +} + +// objectKey parses an object key and returns a ObjectKey AST +func (p *Parser) objectKey() ([]*ast.ObjectKey, error) { + keyCount := 0 + keys := make([]*ast.ObjectKey, 0) + + for { + tok := p.scan() + switch tok.Type { + case token.EOF: + return nil, errEofToken + case token.STRING: + keyCount++ + keys = append(keys, &ast.ObjectKey{ + Token: p.tok.HCLToken(), + }) + case token.COLON: + // If we have a zero keycount it means that we never got + // an object key, i.e. `{ :`. This is a syntax error. + if keyCount == 0 { + return nil, fmt.Errorf("expected: STRING got: %s", p.tok.Type) + } + + // Done + return keys, nil + case token.ILLEGAL: + return nil, errors.New("illegal") + default: + return nil, fmt.Errorf("expected: STRING got: %s", p.tok.Type) + } + } +} + +// object parses any type of object, such as number, bool, string, object or +// list. +func (p *Parser) objectValue() (ast.Node, error) { + defer un(trace(p, "ParseObjectValue")) + tok := p.scan() + + switch tok.Type { + case token.NUMBER, token.FLOAT, token.BOOL, token.NULL, token.STRING: + return p.literalType() + case token.LBRACE: + return p.objectType() + case token.LBRACK: + return p.listType() + case token.EOF: + return nil, errEofToken + } + + return nil, fmt.Errorf("Expected object value, got unknown token: %+v", tok) +} + +// object parses any type of object, such as number, bool, string, object or +// list. +func (p *Parser) object() (*ast.ObjectType, error) { + defer un(trace(p, "ParseType")) + tok := p.scan() + + switch tok.Type { + case token.LBRACE: + return p.objectType() + case token.EOF: + return nil, errEofToken + } + + return nil, fmt.Errorf("Expected object, got unknown token: %+v", tok) +} + +// objectType parses an object type and returns a ObjectType AST +func (p *Parser) objectType() (*ast.ObjectType, error) { + defer un(trace(p, "ParseObjectType")) + + // we assume that the currently scanned token is a LBRACE + o := &ast.ObjectType{} + + l, err := p.objectList() + + // if we hit RBRACE, we are good to go (means we parsed all Items), if it's + // not a RBRACE, it's an syntax error and we just return it. + if err != nil && p.tok.Type != token.RBRACE { + return nil, err + } + + o.List = l + return o, nil +} + +// listType parses a list type and returns a ListType AST +func (p *Parser) listType() (*ast.ListType, error) { + defer un(trace(p, "ParseListType")) + + // we assume that the currently scanned token is a LBRACK + l := &ast.ListType{} + + for { + tok := p.scan() + switch tok.Type { + case token.NUMBER, token.FLOAT, token.STRING: + node, err := p.literalType() + if err != nil { + return nil, err + } + + l.Add(node) + case token.COMMA: + continue + case token.LBRACE: + node, err := p.objectType() + if err != nil { + return nil, err + } + + l.Add(node) + case token.BOOL: + // TODO(arslan) should we support? not supported by HCL yet + case token.LBRACK: + // TODO(arslan) should we support nested lists? Even though it's + // written in README of HCL, it's not a part of the grammar + // (not defined in parse.y) + case token.RBRACK: + // finished + return l, nil + default: + return nil, fmt.Errorf("unexpected token while parsing list: %s", tok.Type) + } + + } +} + +// literalType parses a literal type and returns a LiteralType AST +func (p *Parser) literalType() (*ast.LiteralType, error) { + defer un(trace(p, "ParseLiteral")) + + return &ast.LiteralType{ + Token: p.tok.HCLToken(), + }, nil +} + +// scan returns the next token from the underlying scanner. If a token has +// been unscanned then read that instead. +func (p *Parser) scan() token.Token { + // If we have a token on the buffer, then return it. + if p.n != 0 { + p.n = 0 + return p.tok + } + + p.tok = p.sc.Scan() + return p.tok +} + +// unscan pushes the previously read token back onto the buffer. +func (p *Parser) unscan() { + p.n = 1 +} + +// ---------------------------------------------------------------------------- +// Parsing support + +func (p *Parser) printTrace(a ...interface{}) { + if !p.enableTrace { + return + } + + const dots = ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . " + const n = len(dots) + fmt.Printf("%5d:%3d: ", p.tok.Pos.Line, p.tok.Pos.Column) + + i := 2 * p.indent + for i > n { + fmt.Print(dots) + i -= n + } + // i <= n + fmt.Print(dots[0:i]) + fmt.Println(a...) +} + +func trace(p *Parser, msg string) *Parser { + p.printTrace(msg, "(") + p.indent++ + return p +} + +// Usage pattern: defer un(trace(p, "...")) +func un(p *Parser) { + p.indent-- + p.printTrace(")") +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/json/scanner/scanner.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/json/scanner/scanner.go new file mode 100644 index 00000000..fe3f0f09 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/json/scanner/scanner.go @@ -0,0 +1,451 @@ +package scanner + +import ( + "bytes" + "fmt" + "os" + "unicode" + "unicode/utf8" + + "github.com/hashicorp/hcl/json/token" +) + +// eof represents a marker rune for the end of the reader. +const eof = rune(0) + +// Scanner defines a lexical scanner +type Scanner struct { + buf *bytes.Buffer // Source buffer for advancing and scanning + src []byte // Source buffer for immutable access + + // Source Position + srcPos token.Pos // current position + prevPos token.Pos // previous position, used for peek() method + + lastCharLen int // length of last character in bytes + lastLineLen int // length of last line in characters (for correct column reporting) + + tokStart int // token text start position + tokEnd int // token text end position + + // Error is called for each error encountered. If no Error + // function is set, the error is reported to os.Stderr. + Error func(pos token.Pos, msg string) + + // ErrorCount is incremented by one for each error encountered. + ErrorCount int + + // tokPos is the start position of most recently scanned token; set by + // Scan. The Filename field is always left untouched by the Scanner. If + // an error is reported (via Error) and Position is invalid, the scanner is + // not inside a token. + tokPos token.Pos +} + +// New creates and initializes a new instance of Scanner using src as +// its source content. +func New(src []byte) *Scanner { + // even though we accept a src, we read from a io.Reader compatible type + // (*bytes.Buffer). So in the future we might easily change it to streaming + // read. + b := bytes.NewBuffer(src) + s := &Scanner{ + buf: b, + src: src, + } + + // srcPosition always starts with 1 + s.srcPos.Line = 1 + return s +} + +// next reads the next rune from the bufferred reader. Returns the rune(0) if +// an error occurs (or io.EOF is returned). +func (s *Scanner) next() rune { + ch, size, err := s.buf.ReadRune() + if err != nil { + // advance for error reporting + s.srcPos.Column++ + s.srcPos.Offset += size + s.lastCharLen = size + return eof + } + + if ch == utf8.RuneError && size == 1 { + s.srcPos.Column++ + s.srcPos.Offset += size + s.lastCharLen = size + s.err("illegal UTF-8 encoding") + return ch + } + + // remember last position + s.prevPos = s.srcPos + + s.srcPos.Column++ + s.lastCharLen = size + s.srcPos.Offset += size + + if ch == '\n' { + s.srcPos.Line++ + s.lastLineLen = s.srcPos.Column + s.srcPos.Column = 0 + } + + // debug + // fmt.Printf("ch: %q, offset:column: %d:%d\n", ch, s.srcPos.Offset, s.srcPos.Column) + return ch +} + +// unread unreads the previous read Rune and updates the source position +func (s *Scanner) unread() { + if err := s.buf.UnreadRune(); err != nil { + panic(err) // this is user fault, we should catch it + } + s.srcPos = s.prevPos // put back last position +} + +// peek returns the next rune without advancing the reader. +func (s *Scanner) peek() rune { + peek, _, err := s.buf.ReadRune() + if err != nil { + return eof + } + + s.buf.UnreadRune() + return peek +} + +// Scan scans the next token and returns the token. +func (s *Scanner) Scan() token.Token { + ch := s.next() + + // skip white space + for isWhitespace(ch) { + ch = s.next() + } + + var tok token.Type + + // token text markings + s.tokStart = s.srcPos.Offset - s.lastCharLen + + // token position, initial next() is moving the offset by one(size of rune + // actually), though we are interested with the starting point + s.tokPos.Offset = s.srcPos.Offset - s.lastCharLen + if s.srcPos.Column > 0 { + // common case: last character was not a '\n' + s.tokPos.Line = s.srcPos.Line + s.tokPos.Column = s.srcPos.Column + } else { + // last character was a '\n' + // (we cannot be at the beginning of the source + // since we have called next() at least once) + s.tokPos.Line = s.srcPos.Line - 1 + s.tokPos.Column = s.lastLineLen + } + + switch { + case isLetter(ch): + lit := s.scanIdentifier() + if lit == "true" || lit == "false" { + tok = token.BOOL + } else if lit == "null" { + tok = token.NULL + } else { + s.err("illegal char") + } + case isDecimal(ch): + tok = s.scanNumber(ch) + default: + switch ch { + case eof: + tok = token.EOF + case '"': + tok = token.STRING + s.scanString() + case '.': + tok = token.PERIOD + ch = s.peek() + if isDecimal(ch) { + tok = token.FLOAT + ch = s.scanMantissa(ch) + ch = s.scanExponent(ch) + } + case '[': + tok = token.LBRACK + case ']': + tok = token.RBRACK + case '{': + tok = token.LBRACE + case '}': + tok = token.RBRACE + case ',': + tok = token.COMMA + case ':': + tok = token.COLON + case '-': + if isDecimal(s.peek()) { + ch := s.next() + tok = s.scanNumber(ch) + } else { + s.err("illegal char") + } + default: + s.err("illegal char: " + string(ch)) + } + } + + // finish token ending + s.tokEnd = s.srcPos.Offset + + // create token literal + var tokenText string + if s.tokStart >= 0 { + tokenText = string(s.src[s.tokStart:s.tokEnd]) + } + s.tokStart = s.tokEnd // ensure idempotency of tokenText() call + + return token.Token{ + Type: tok, + Pos: s.tokPos, + Text: tokenText, + } +} + +// scanNumber scans a HCL number definition starting with the given rune +func (s *Scanner) scanNumber(ch rune) token.Type { + zero := ch == '0' + pos := s.srcPos + + s.scanMantissa(ch) + ch = s.next() // seek forward + if ch == 'e' || ch == 'E' { + ch = s.scanExponent(ch) + return token.FLOAT + } + + if ch == '.' { + ch = s.scanFraction(ch) + if ch == 'e' || ch == 'E' { + ch = s.next() + ch = s.scanExponent(ch) + } + return token.FLOAT + } + + if ch != eof { + s.unread() + } + + // If we have a larger number and this is zero, error + if zero && pos != s.srcPos { + s.err("numbers cannot start with 0") + } + + return token.NUMBER +} + +// scanMantissa scans the mantissa beginning from the rune. It returns the next +// non decimal rune. It's used to determine wheter it's a fraction or exponent. +func (s *Scanner) scanMantissa(ch rune) rune { + scanned := false + for isDecimal(ch) { + ch = s.next() + scanned = true + } + + if scanned && ch != eof { + s.unread() + } + return ch +} + +// scanFraction scans the fraction after the '.' rune +func (s *Scanner) scanFraction(ch rune) rune { + if ch == '.' { + ch = s.peek() // we peek just to see if we can move forward + ch = s.scanMantissa(ch) + } + return ch +} + +// scanExponent scans the remaining parts of an exponent after the 'e' or 'E' +// rune. +func (s *Scanner) scanExponent(ch rune) rune { + if ch == 'e' || ch == 'E' { + ch = s.next() + if ch == '-' || ch == '+' { + ch = s.next() + } + ch = s.scanMantissa(ch) + } + return ch +} + +// scanString scans a quoted string +func (s *Scanner) scanString() { + braces := 0 + for { + // '"' opening already consumed + // read character after quote + ch := s.next() + + if ch == '\n' || ch < 0 || ch == eof { + s.err("literal not terminated") + return + } + + if ch == '"' { + break + } + + // If we're going into a ${} then we can ignore quotes for awhile + if braces == 0 && ch == '$' && s.peek() == '{' { + braces++ + s.next() + } else if braces > 0 && ch == '{' { + braces++ + } + if braces > 0 && ch == '}' { + braces-- + } + + if ch == '\\' { + s.scanEscape() + } + } + + return +} + +// scanEscape scans an escape sequence +func (s *Scanner) scanEscape() rune { + // http://en.cppreference.com/w/cpp/language/escape + ch := s.next() // read character after '/' + switch ch { + case 'a', 'b', 'f', 'n', 'r', 't', 'v', '\\', '"': + // nothing to do + case '0', '1', '2', '3', '4', '5', '6', '7': + // octal notation + ch = s.scanDigits(ch, 8, 3) + case 'x': + // hexademical notation + ch = s.scanDigits(s.next(), 16, 2) + case 'u': + // universal character name + ch = s.scanDigits(s.next(), 16, 4) + case 'U': + // universal character name + ch = s.scanDigits(s.next(), 16, 8) + default: + s.err("illegal char escape") + } + return ch +} + +// scanDigits scans a rune with the given base for n times. For example an +// octal notation \184 would yield in scanDigits(ch, 8, 3) +func (s *Scanner) scanDigits(ch rune, base, n int) rune { + for n > 0 && digitVal(ch) < base { + ch = s.next() + n-- + } + if n > 0 { + s.err("illegal char escape") + } + + // we scanned all digits, put the last non digit char back + s.unread() + return ch +} + +// scanIdentifier scans an identifier and returns the literal string +func (s *Scanner) scanIdentifier() string { + offs := s.srcPos.Offset - s.lastCharLen + ch := s.next() + for isLetter(ch) || isDigit(ch) || ch == '-' { + ch = s.next() + } + + if ch != eof { + s.unread() // we got identifier, put back latest char + } + + return string(s.src[offs:s.srcPos.Offset]) +} + +// recentPosition returns the position of the character immediately after the +// character or token returned by the last call to Scan. +func (s *Scanner) recentPosition() (pos token.Pos) { + pos.Offset = s.srcPos.Offset - s.lastCharLen + switch { + case s.srcPos.Column > 0: + // common case: last character was not a '\n' + pos.Line = s.srcPos.Line + pos.Column = s.srcPos.Column + case s.lastLineLen > 0: + // last character was a '\n' + // (we cannot be at the beginning of the source + // since we have called next() at least once) + pos.Line = s.srcPos.Line - 1 + pos.Column = s.lastLineLen + default: + // at the beginning of the source + pos.Line = 1 + pos.Column = 1 + } + return +} + +// err prints the error of any scanning to s.Error function. If the function is +// not defined, by default it prints them to os.Stderr +func (s *Scanner) err(msg string) { + s.ErrorCount++ + pos := s.recentPosition() + + if s.Error != nil { + s.Error(pos, msg) + return + } + + fmt.Fprintf(os.Stderr, "%s: %s\n", pos, msg) +} + +// isHexadecimal returns true if the given rune is a letter +func isLetter(ch rune) bool { + return 'a' <= ch && ch <= 'z' || 'A' <= ch && ch <= 'Z' || ch == '_' || ch >= 0x80 && unicode.IsLetter(ch) +} + +// isHexadecimal returns true if the given rune is a decimal digit +func isDigit(ch rune) bool { + return '0' <= ch && ch <= '9' || ch >= 0x80 && unicode.IsDigit(ch) +} + +// isHexadecimal returns true if the given rune is a decimal number +func isDecimal(ch rune) bool { + return '0' <= ch && ch <= '9' +} + +// isHexadecimal returns true if the given rune is an hexadecimal number +func isHexadecimal(ch rune) bool { + return '0' <= ch && ch <= '9' || 'a' <= ch && ch <= 'f' || 'A' <= ch && ch <= 'F' +} + +// isWhitespace returns true if the rune is a space, tab, newline or carriage return +func isWhitespace(ch rune) bool { + return ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r' +} + +// digitVal returns the integer value of a given octal,decimal or hexadecimal rune +func digitVal(ch rune) int { + switch { + case '0' <= ch && ch <= '9': + return int(ch - '0') + case 'a' <= ch && ch <= 'f': + return int(ch - 'a' + 10) + case 'A' <= ch && ch <= 'F': + return int(ch - 'A' + 10) + } + return 16 // larger than any legal digit val +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/json/token/position.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/json/token/position.go new file mode 100644 index 00000000..59c1bb72 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/json/token/position.go @@ -0,0 +1,46 @@ +package token + +import "fmt" + +// Pos describes an arbitrary source position +// including the file, line, and column location. +// A Position is valid if the line number is > 0. +type Pos struct { + Filename string // filename, if any + Offset int // offset, starting at 0 + Line int // line number, starting at 1 + Column int // column number, starting at 1 (character count) +} + +// IsValid returns true if the position is valid. +func (p *Pos) IsValid() bool { return p.Line > 0 } + +// String returns a string in one of several forms: +// +// file:line:column valid position with file name +// line:column valid position without file name +// file invalid position with file name +// - invalid position without file name +func (p Pos) String() string { + s := p.Filename + if p.IsValid() { + if s != "" { + s += ":" + } + s += fmt.Sprintf("%d:%d", p.Line, p.Column) + } + if s == "" { + s = "-" + } + return s +} + +// Before reports whether the position p is before u. +func (p Pos) Before(u Pos) bool { + return u.Offset > p.Offset || u.Line > p.Line +} + +// After reports whether the position p is after u. +func (p Pos) After(u Pos) bool { + return u.Offset < p.Offset || u.Line < p.Line +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/json/token/token.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/json/token/token.go new file mode 100644 index 00000000..95a0c3ee --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/json/token/token.go @@ -0,0 +1,118 @@ +package token + +import ( + "fmt" + "strconv" + + hcltoken "github.com/hashicorp/hcl/hcl/token" +) + +// Token defines a single HCL token which can be obtained via the Scanner +type Token struct { + Type Type + Pos Pos + Text string +} + +// Type is the set of lexical tokens of the HCL (HashiCorp Configuration Language) +type Type int + +const ( + // Special tokens + ILLEGAL Type = iota + EOF + + identifier_beg + literal_beg + NUMBER // 12345 + FLOAT // 123.45 + BOOL // true,false + STRING // "abc" + NULL // null + literal_end + identifier_end + + operator_beg + LBRACK // [ + LBRACE // { + COMMA // , + PERIOD // . + COLON // : + + RBRACK // ] + RBRACE // } + + operator_end +) + +var tokens = [...]string{ + ILLEGAL: "ILLEGAL", + + EOF: "EOF", + + NUMBER: "NUMBER", + FLOAT: "FLOAT", + BOOL: "BOOL", + STRING: "STRING", + NULL: "NULL", + + LBRACK: "LBRACK", + LBRACE: "LBRACE", + COMMA: "COMMA", + PERIOD: "PERIOD", + COLON: "COLON", + + RBRACK: "RBRACK", + RBRACE: "RBRACE", +} + +// String returns the string corresponding to the token tok. +func (t Type) String() string { + s := "" + if 0 <= t && t < Type(len(tokens)) { + s = tokens[t] + } + if s == "" { + s = "token(" + strconv.Itoa(int(t)) + ")" + } + return s +} + +// IsIdentifier returns true for tokens corresponding to identifiers and basic +// type literals; it returns false otherwise. +func (t Type) IsIdentifier() bool { return identifier_beg < t && t < identifier_end } + +// IsLiteral returns true for tokens corresponding to basic type literals; it +// returns false otherwise. +func (t Type) IsLiteral() bool { return literal_beg < t && t < literal_end } + +// IsOperator returns true for tokens corresponding to operators and +// delimiters; it returns false otherwise. +func (t Type) IsOperator() bool { return operator_beg < t && t < operator_end } + +// String returns the token's literal text. Note that this is only +// applicable for certain token types, such as token.IDENT, +// token.STRING, etc.. +func (t Token) String() string { + return fmt.Sprintf("%s %s %s", t.Pos.String(), t.Type.String(), t.Text) +} + +// HCLToken converts this token to an HCL token. +// +// The token type must be a literal type or this will panic. +func (t Token) HCLToken() hcltoken.Token { + switch t.Type { + case BOOL: + return hcltoken.Token{Type: hcltoken.BOOL, Text: t.Text} + case FLOAT: + return hcltoken.Token{Type: hcltoken.FLOAT, Text: t.Text} + case NULL: + return hcltoken.Token{Type: hcltoken.STRING, Text: ""} + case NUMBER: + return hcltoken.Token{Type: hcltoken.NUMBER, Text: t.Text} + case STRING: + return hcltoken.Token{Type: hcltoken.STRING, Text: t.Text, JSON: true} + default: + panic(fmt.Sprintf("unimplemented HCLToken for type: %s", t.Type)) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/lex.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/lex.go new file mode 100644 index 00000000..d9993c29 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/lex.go @@ -0,0 +1,38 @@ +package hcl + +import ( + "unicode" + "unicode/utf8" +) + +type lexModeValue byte + +const ( + lexModeUnknown lexModeValue = iota + lexModeHcl + lexModeJson +) + +// lexMode returns whether we're going to be parsing in JSON +// mode or HCL mode. +func lexMode(v []byte) lexModeValue { + var ( + r rune + w int + offset int + ) + + for { + r, w = utf8.DecodeRune(v[offset:]) + offset += w + if unicode.IsSpace(r) { + continue + } + if r == '{' { + return lexModeJson + } + break + } + + return lexModeHcl +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/parse.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/parse.go new file mode 100644 index 00000000..1fca53c4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/hashicorp/hcl/parse.go @@ -0,0 +1,39 @@ +package hcl + +import ( + "fmt" + + "github.com/hashicorp/hcl/hcl/ast" + hclParser "github.com/hashicorp/hcl/hcl/parser" + jsonParser "github.com/hashicorp/hcl/json/parser" +) + +// ParseBytes accepts as input byte slice and returns ast tree. +// +// Input can be either JSON or HCL +func ParseBytes(in []byte) (*ast.File, error) { + return parse(in) +} + +// ParseString accepts input as a string and returns ast tree. +func ParseString(input string) (*ast.File, error) { + return parse([]byte(input)) +} + +func parse(in []byte) (*ast.File, error) { + switch lexMode(in) { + case lexModeHcl: + return hclParser.Parse(in) + case lexModeJson: + return jsonParser.Parse(in) + } + + return nil, fmt.Errorf("unknown config format") +} + +// Parse parses the given input and returns the root object. +// +// The input format can be either HCL or JSON. +func Parse(input string) (*ast.File, error) { + return parse([]byte(input)) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/inconshreveable/mousetrap/LICENSE b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/inconshreveable/mousetrap/LICENSE new file mode 100644 index 00000000..5f0d1fb6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/inconshreveable/mousetrap/LICENSE @@ -0,0 +1,13 @@ +Copyright 2014 Alan Shreve + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/vendor/github.com/inconshreveable/mousetrap/README.md b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/inconshreveable/mousetrap/README.md similarity index 100% rename from vendor/github.com/inconshreveable/mousetrap/README.md rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/inconshreveable/mousetrap/README.md diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/inconshreveable/mousetrap/trap_others.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/inconshreveable/mousetrap/trap_others.go new file mode 100644 index 00000000..9d2d8a4b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/inconshreveable/mousetrap/trap_others.go @@ -0,0 +1,15 @@ +// +build !windows + +package mousetrap + +// StartedByExplorer returns true if the program was invoked by the user +// double-clicking on the executable from explorer.exe +// +// It is conservative and returns false if any of the internal calls fail. +// It does not guarantee that the program was run from a terminal. It only can tell you +// whether it was launched from explorer.exe +// +// On non-Windows platforms, it always returns false. +func StartedByExplorer() bool { + return false +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/inconshreveable/mousetrap/trap_windows.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/inconshreveable/mousetrap/trap_windows.go new file mode 100644 index 00000000..336142a5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/inconshreveable/mousetrap/trap_windows.go @@ -0,0 +1,98 @@ +// +build windows +// +build !go1.4 + +package mousetrap + +import ( + "fmt" + "os" + "syscall" + "unsafe" +) + +const ( + // defined by the Win32 API + th32cs_snapprocess uintptr = 0x2 +) + +var ( + kernel = syscall.MustLoadDLL("kernel32.dll") + CreateToolhelp32Snapshot = kernel.MustFindProc("CreateToolhelp32Snapshot") + Process32First = kernel.MustFindProc("Process32FirstW") + Process32Next = kernel.MustFindProc("Process32NextW") +) + +// ProcessEntry32 structure defined by the Win32 API +type processEntry32 struct { + dwSize uint32 + cntUsage uint32 + th32ProcessID uint32 + th32DefaultHeapID int + th32ModuleID uint32 + cntThreads uint32 + th32ParentProcessID uint32 + pcPriClassBase int32 + dwFlags uint32 + szExeFile [syscall.MAX_PATH]uint16 +} + +func getProcessEntry(pid int) (pe *processEntry32, err error) { + snapshot, _, e1 := CreateToolhelp32Snapshot.Call(th32cs_snapprocess, uintptr(0)) + if snapshot == uintptr(syscall.InvalidHandle) { + err = fmt.Errorf("CreateToolhelp32Snapshot: %v", e1) + return + } + defer syscall.CloseHandle(syscall.Handle(snapshot)) + + var processEntry processEntry32 + processEntry.dwSize = uint32(unsafe.Sizeof(processEntry)) + ok, _, e1 := Process32First.Call(snapshot, uintptr(unsafe.Pointer(&processEntry))) + if ok == 0 { + err = fmt.Errorf("Process32First: %v", e1) + return + } + + for { + if processEntry.th32ProcessID == uint32(pid) { + pe = &processEntry + return + } + + ok, _, e1 = Process32Next.Call(snapshot, uintptr(unsafe.Pointer(&processEntry))) + if ok == 0 { + err = fmt.Errorf("Process32Next: %v", e1) + return + } + } +} + +func getppid() (pid int, err error) { + pe, err := getProcessEntry(os.Getpid()) + if err != nil { + return + } + + pid = int(pe.th32ParentProcessID) + return +} + +// StartedByExplorer returns true if the program was invoked by the user double-clicking +// on the executable from explorer.exe +// +// It is conservative and returns false if any of the internal calls fail. +// It does not guarantee that the program was run from a terminal. It only can tell you +// whether it was launched from explorer.exe +func StartedByExplorer() bool { + ppid, err := getppid() + if err != nil { + return false + } + + pe, err := getProcessEntry(ppid) + if err != nil { + return false + } + + name := syscall.UTF16ToString(pe.szExeFile[:]) + return name == "explorer.exe" +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/inconshreveable/mousetrap/trap_windows_1.4.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/inconshreveable/mousetrap/trap_windows_1.4.go new file mode 100644 index 00000000..9a28e57c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/inconshreveable/mousetrap/trap_windows_1.4.go @@ -0,0 +1,46 @@ +// +build windows +// +build go1.4 + +package mousetrap + +import ( + "os" + "syscall" + "unsafe" +) + +func getProcessEntry(pid int) (*syscall.ProcessEntry32, error) { + snapshot, err := syscall.CreateToolhelp32Snapshot(syscall.TH32CS_SNAPPROCESS, 0) + if err != nil { + return nil, err + } + defer syscall.CloseHandle(snapshot) + var procEntry syscall.ProcessEntry32 + procEntry.Size = uint32(unsafe.Sizeof(procEntry)) + if err = syscall.Process32First(snapshot, &procEntry); err != nil { + return nil, err + } + for { + if procEntry.ProcessID == uint32(pid) { + return &procEntry, nil + } + err = syscall.Process32Next(snapshot, &procEntry) + if err != nil { + return nil, err + } + } +} + +// StartedByExplorer returns true if the program was invoked by the user double-clicking +// on the executable from explorer.exe +// +// It is conservative and returns false if any of the internal calls fail. +// It does not guarantee that the program was run from a terminal. It only can tell you +// whether it was launched from explorer.exe +func StartedByExplorer() bool { + pe, err := getProcessEntry(os.Getppid()) + if err != nil { + return false + } + return "explorer.exe" == syscall.UTF16ToString(pe.ExeFile[:]) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/konsorten/go-windows-terminal-sequences/LICENSE b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/konsorten/go-windows-terminal-sequences/LICENSE new file mode 100644 index 00000000..14127cd8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/konsorten/go-windows-terminal-sequences/LICENSE @@ -0,0 +1,9 @@ +(The MIT License) + +Copyright (c) 2017 marvin + konsorten GmbH (open-source@konsorten.de) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/konsorten/go-windows-terminal-sequences/README.md b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/konsorten/go-windows-terminal-sequences/README.md similarity index 98% rename from vendor/github.com/konsorten/go-windows-terminal-sequences/README.md rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/konsorten/go-windows-terminal-sequences/README.md index 195333e5..949b77e3 100644 --- a/vendor/github.com/konsorten/go-windows-terminal-sequences/README.md +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/konsorten/go-windows-terminal-sequences/README.md @@ -26,7 +26,6 @@ The tool is sponsored by the [marvin + konsorten GmbH](http://www.konsorten.de). We thank all the authors who provided code to this library: * Felix Kollmann -* Nicolas Perraut ## License diff --git a/vendor/github.com/konsorten/go-windows-terminal-sequences/go.mod b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/konsorten/go-windows-terminal-sequences/go.mod similarity index 100% rename from vendor/github.com/konsorten/go-windows-terminal-sequences/go.mod rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/konsorten/go-windows-terminal-sequences/go.mod diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/konsorten/go-windows-terminal-sequences/sequences.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/konsorten/go-windows-terminal-sequences/sequences.go new file mode 100644 index 00000000..ef18d8f9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/konsorten/go-windows-terminal-sequences/sequences.go @@ -0,0 +1,36 @@ +// +build windows + +package sequences + +import ( + "syscall" + "unsafe" +) + +var ( + kernel32Dll *syscall.LazyDLL = syscall.NewLazyDLL("Kernel32.dll") + setConsoleMode *syscall.LazyProc = kernel32Dll.NewProc("SetConsoleMode") +) + +func EnableVirtualTerminalProcessing(stream syscall.Handle, enable bool) error { + const ENABLE_VIRTUAL_TERMINAL_PROCESSING uint32 = 0x4 + + var mode uint32 + err := syscall.GetConsoleMode(syscall.Stdout, &mode) + if err != nil { + return err + } + + if enable { + mode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING + } else { + mode &^= ENABLE_VIRTUAL_TERMINAL_PROCESSING + } + + ret, _, err := setConsoleMode.Call(uintptr(unsafe.Pointer(stream)), uintptr(mode)) + if ret == 0 { + return err + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/magiconair/properties/.gitignore b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/magiconair/properties/.gitignore new file mode 100644 index 00000000..e7081ff5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/magiconair/properties/.gitignore @@ -0,0 +1,6 @@ +*.sublime-project +*.sublime-workspace +*.un~ +*.swp +.idea/ +*.iml diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/magiconair/properties/.travis.yml b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/magiconair/properties/.travis.yml new file mode 100644 index 00000000..3e7c3d2c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/magiconair/properties/.travis.yml @@ -0,0 +1,10 @@ +language: go +go: + - 1.4.x + - 1.5.x + - 1.6.x + - 1.7.x + - 1.8.x + - 1.9.x + - "1.10.x" + - tip diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/magiconair/properties/CHANGELOG.md b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/magiconair/properties/CHANGELOG.md new file mode 100644 index 00000000..f83adc20 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/magiconair/properties/CHANGELOG.md @@ -0,0 +1,131 @@ +## Changelog + +### [1.8](https://github.com/magiconair/properties/tree/v1.8) - 15 May 2018 + + * [PR #26](https://github.com/magiconair/properties/pull/26): Disable expansion during loading + + This adds the option to disable property expansion during loading. + + Thanks to [@kmala](https://github.com/kmala) for the patch. + +### [1.7.6](https://github.com/magiconair/properties/tree/v1.7.6) - 14 Feb 2018 + + * [PR #29](https://github.com/magiconair/properties/pull/29): Reworked expansion logic to handle more complex cases. + + See PR for an example. + + Thanks to [@yobert](https://github.com/yobert) for the fix. + +### [1.7.5](https://github.com/magiconair/properties/tree/v1.7.5) - 13 Feb 2018 + + * [PR #28](https://github.com/magiconair/properties/pull/28): Support duplicate expansions in the same value + + Values which expand the same key multiple times (e.g. `key=${a} ${a}`) will no longer fail + with a `circular reference error`. + + Thanks to [@yobert](https://github.com/yobert) for the fix. + +### [1.7.4](https://github.com/magiconair/properties/tree/v1.7.4) - 31 Oct 2017 + + * [Issue #23](https://github.com/magiconair/properties/issues/23): Ignore blank lines with whitespaces + + * [PR #24](https://github.com/magiconair/properties/pull/24): Update keys when DisableExpansion is enabled + + Thanks to [@mgurov](https://github.com/mgurov) for the fix. + +### [1.7.3](https://github.com/magiconair/properties/tree/v1.7.3) - 10 Jul 2017 + + * [Issue #17](https://github.com/magiconair/properties/issues/17): Add [SetValue()](http://godoc.org/github.com/magiconair/properties#Properties.SetValue) method to set values generically + * [Issue #22](https://github.com/magiconair/properties/issues/22): Add [LoadMap()](http://godoc.org/github.com/magiconair/properties#LoadMap) function to load properties from a string map + +### [1.7.2](https://github.com/magiconair/properties/tree/v1.7.2) - 20 Mar 2017 + + * [Issue #15](https://github.com/magiconair/properties/issues/15): Drop gocheck dependency + * [PR #21](https://github.com/magiconair/properties/pull/21): Add [Map()](http://godoc.org/github.com/magiconair/properties#Properties.Map) and [FilterFunc()](http://godoc.org/github.com/magiconair/properties#Properties.FilterFunc) + +### [1.7.1](https://github.com/magiconair/properties/tree/v1.7.1) - 13 Jan 2017 + + * [Issue #14](https://github.com/magiconair/properties/issues/14): Decouple TestLoadExpandedFile from `$USER` + * [PR #12](https://github.com/magiconair/properties/pull/12): Load from files and URLs + * [PR #16](https://github.com/magiconair/properties/pull/16): Keep gofmt happy + * [PR #18](https://github.com/magiconair/properties/pull/18): Fix Delete() function + +### [1.7.0](https://github.com/magiconair/properties/tree/v1.7.0) - 20 Mar 2016 + + * [Issue #10](https://github.com/magiconair/properties/issues/10): Add [LoadURL,LoadURLs,MustLoadURL,MustLoadURLs](http://godoc.org/github.com/magiconair/properties#LoadURL) method to load properties from a URL. + * [Issue #11](https://github.com/magiconair/properties/issues/11): Add [LoadString,MustLoadString](http://godoc.org/github.com/magiconair/properties#LoadString) method to load properties from an UTF8 string. + * [PR #8](https://github.com/magiconair/properties/pull/8): Add [MustFlag](http://godoc.org/github.com/magiconair/properties#Properties.MustFlag) method to provide overrides via command line flags. (@pascaldekloe) + +### [1.6.0](https://github.com/magiconair/properties/tree/v1.6.0) - 11 Dec 2015 + + * Add [Decode](http://godoc.org/github.com/magiconair/properties#Properties.Decode) method to populate struct from properties via tags. + +### [1.5.6](https://github.com/magiconair/properties/tree/v1.5.6) - 18 Oct 2015 + + * Vendored in gopkg.in/check.v1 + +### [1.5.5](https://github.com/magiconair/properties/tree/v1.5.5) - 31 Jul 2015 + + * [PR #6](https://github.com/magiconair/properties/pull/6): Add [Delete](http://godoc.org/github.com/magiconair/properties#Properties.Delete) method to remove keys including comments. (@gerbenjacobs) + +### [1.5.4](https://github.com/magiconair/properties/tree/v1.5.4) - 23 Jun 2015 + + * [Issue #5](https://github.com/magiconair/properties/issues/5): Allow disabling of property expansion [DisableExpansion](http://godoc.org/github.com/magiconair/properties#Properties.DisableExpansion). When property expansion is disabled Properties become a simple key/value store and don't check for circular references. + +### [1.5.3](https://github.com/magiconair/properties/tree/v1.5.3) - 02 Jun 2015 + + * [Issue #4](https://github.com/magiconair/properties/issues/4): Maintain key order in [Filter()](http://godoc.org/github.com/magiconair/properties#Properties.Filter), [FilterPrefix()](http://godoc.org/github.com/magiconair/properties#Properties.FilterPrefix) and [FilterRegexp()](http://godoc.org/github.com/magiconair/properties#Properties.FilterRegexp) + +### [1.5.2](https://github.com/magiconair/properties/tree/v1.5.2) - 10 Apr 2015 + + * [Issue #3](https://github.com/magiconair/properties/issues/3): Don't print comments in [WriteComment()](http://godoc.org/github.com/magiconair/properties#Properties.WriteComment) if they are all empty + * Add clickable links to README + +### [1.5.1](https://github.com/magiconair/properties/tree/v1.5.1) - 08 Dec 2014 + + * Added [GetParsedDuration()](http://godoc.org/github.com/magiconair/properties#Properties.GetParsedDuration) and [MustGetParsedDuration()](http://godoc.org/github.com/magiconair/properties#Properties.MustGetParsedDuration) for values specified compatible with + [time.ParseDuration()](http://golang.org/pkg/time/#ParseDuration). + +### [1.5.0](https://github.com/magiconair/properties/tree/v1.5.0) - 18 Nov 2014 + + * Added support for single and multi-line comments (reading, writing and updating) + * The order of keys is now preserved + * Calling [Set()](http://godoc.org/github.com/magiconair/properties#Properties.Set) with an empty key now silently ignores the call and does not create a new entry + * Added a [MustSet()](http://godoc.org/github.com/magiconair/properties#Properties.MustSet) method + * Migrated test library from launchpad.net/gocheck to [gopkg.in/check.v1](http://gopkg.in/check.v1) + +### [1.4.2](https://github.com/magiconair/properties/tree/v1.4.2) - 15 Nov 2014 + + * [Issue #2](https://github.com/magiconair/properties/issues/2): Fixed goroutine leak in parser which created two lexers but cleaned up only one + +### [1.4.1](https://github.com/magiconair/properties/tree/v1.4.1) - 13 Nov 2014 + + * [Issue #1](https://github.com/magiconair/properties/issues/1): Fixed bug in Keys() method which returned an empty string + +### [1.4.0](https://github.com/magiconair/properties/tree/v1.4.0) - 23 Sep 2014 + + * Added [Keys()](http://godoc.org/github.com/magiconair/properties#Properties.Keys) to get the keys + * Added [Filter()](http://godoc.org/github.com/magiconair/properties#Properties.Filter), [FilterRegexp()](http://godoc.org/github.com/magiconair/properties#Properties.FilterRegexp) and [FilterPrefix()](http://godoc.org/github.com/magiconair/properties#Properties.FilterPrefix) to get a subset of the properties + +### [1.3.0](https://github.com/magiconair/properties/tree/v1.3.0) - 18 Mar 2014 + +* Added support for time.Duration +* Made MustXXX() failure beha[ior configurable (log.Fatal, panic](https://github.com/magiconair/properties/tree/vior configurable (log.Fatal, panic) - custom) +* Changed default of MustXXX() failure from panic to log.Fatal + +### [1.2.0](https://github.com/magiconair/properties/tree/v1.2.0) - 05 Mar 2014 + +* Added MustGet... functions +* Added support for int and uint with range checks on 32 bit platforms + +### [1.1.0](https://github.com/magiconair/properties/tree/v1.1.0) - 20 Jan 2014 + +* Renamed from goproperties to properties +* Added support for expansion of environment vars in + filenames and value expressions +* Fixed bug where value expressions were not at the + start of the string + +### [1.0.0](https://github.com/magiconair/properties/tree/v1.0.0) - 7 Jan 2014 + +* Initial release diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/magiconair/properties/LICENSE b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/magiconair/properties/LICENSE new file mode 100644 index 00000000..b387087c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/magiconair/properties/LICENSE @@ -0,0 +1,25 @@ +goproperties - properties file decoder for Go + +Copyright (c) 2013-2018 - Frank Schroeder + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/magiconair/properties/README.md b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/magiconair/properties/README.md new file mode 100644 index 00000000..2c05f290 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/magiconair/properties/README.md @@ -0,0 +1,129 @@ +[![](https://img.shields.io/github/tag/magiconair/properties.svg?style=flat-square&label=release)](https://github.com/magiconair/properties/releases) +[![Travis CI Status](https://img.shields.io/travis/magiconair/properties.svg?branch=master&style=flat-square&label=travis)](https://travis-ci.org/magiconair/properties) +[![Codeship CI Status](https://img.shields.io/codeship/16aaf660-f615-0135-b8f0-7e33b70920c0/master.svg?label=codeship&style=flat-square)](https://app.codeship.com/projects/274177") +[![License](https://img.shields.io/badge/License-BSD%202--Clause-orange.svg?style=flat-square)](https://raw.githubusercontent.com/magiconair/properties/master/LICENSE) +[![GoDoc](http://img.shields.io/badge/godoc-reference-5272B4.svg?style=flat-square)](http://godoc.org/github.com/magiconair/properties) + +# Overview + +#### Please run `git pull --tags` to update the tags. See [below](#updated-git-tags) why. + +properties is a Go library for reading and writing properties files. + +It supports reading from multiple files or URLs and Spring style recursive +property expansion of expressions like `${key}` to their corresponding value. +Value expressions can refer to other keys like in `${key}` or to environment +variables like in `${USER}`. Filenames can also contain environment variables +like in `/home/${USER}/myapp.properties`. + +Properties can be decoded into structs, maps, arrays and values through +struct tags. + +Comments and the order of keys are preserved. Comments can be modified +and can be written to the output. + +The properties library supports both ISO-8859-1 and UTF-8 encoded data. + +Starting from version 1.3.0 the behavior of the MustXXX() functions is +configurable by providing a custom `ErrorHandler` function. The default has +changed from `panic` to `log.Fatal` but this is configurable and custom +error handling functions can be provided. See the package documentation for +details. + +Read the full documentation on [GoDoc](https://godoc.org/github.com/magiconair/properties) [![GoDoc](https://godoc.org/github.com/magiconair/properties?status.png)](https://godoc.org/github.com/magiconair/properties) + +## Getting Started + +```go +import ( + "flag" + "github.com/magiconair/properties" +) + +func main() { + // init from a file + p := properties.MustLoadFile("${HOME}/config.properties", properties.UTF8) + + // or multiple files + p = properties.MustLoadFiles([]string{ + "${HOME}/config.properties", + "${HOME}/config-${USER}.properties", + }, properties.UTF8, true) + + // or from a map + p = properties.LoadMap(map[string]string{"key": "value", "abc": "def"}) + + // or from a string + p = properties.MustLoadString("key=value\nabc=def") + + // or from a URL + p = properties.MustLoadURL("http://host/path") + + // or from multiple URLs + p = properties.MustLoadURL([]string{ + "http://host/config", + "http://host/config-${USER}", + }, true) + + // or from flags + p.MustFlag(flag.CommandLine) + + // get values through getters + host := p.MustGetString("host") + port := p.GetInt("port", 8080) + + // or through Decode + type Config struct { + Host string `properties:"host"` + Port int `properties:"port,default=9000"` + Accept []string `properties:"accept,default=image/png;image;gif"` + Timeout time.Duration `properties:"timeout,default=5s"` + } + var cfg Config + if err := p.Decode(&cfg); err != nil { + log.Fatal(err) + } +} + +``` + +## Installation and Upgrade + +``` +$ go get -u github.com/magiconair/properties +``` + +## License + +2 clause BSD license. See [LICENSE](https://github.com/magiconair/properties/blob/master/LICENSE) file for details. + +## ToDo + +* Dump contents with passwords and secrets obscured + +## Updated Git tags + +#### 13 Feb 2018 + +I realized that all of the git tags I had pushed before v1.7.5 were lightweight tags +and I've only recently learned that this doesn't play well with `git describe` 😞 + +I have replaced all lightweight tags with signed tags using this script which should +retain the commit date, name and email address. Please run `git pull --tags` to update them. + +Worst case you have to reclone the repo. + +```shell +#!/bin/bash +tag=$1 +echo "Updating $tag" +date=$(git show ${tag}^0 --format=%aD | head -1) +email=$(git show ${tag}^0 --format=%aE | head -1) +name=$(git show ${tag}^0 --format=%aN | head -1) +GIT_COMMITTER_DATE="$date" GIT_COMMITTER_NAME="$name" GIT_COMMITTER_EMAIL="$email" git tag -s -f ${tag} ${tag}^0 -m ${tag} +``` + +I apologize for the inconvenience. + +Frank + diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/magiconair/properties/decode.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/magiconair/properties/decode.go new file mode 100644 index 00000000..3ebf8049 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/magiconair/properties/decode.go @@ -0,0 +1,289 @@ +// Copyright 2018 Frank Schroeder. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package properties + +import ( + "fmt" + "reflect" + "strconv" + "strings" + "time" +) + +// Decode assigns property values to exported fields of a struct. +// +// Decode traverses v recursively and returns an error if a value cannot be +// converted to the field type or a required value is missing for a field. +// +// The following type dependent decodings are used: +// +// String, boolean, numeric fields have the value of the property key assigned. +// The property key name is the name of the field. A different key and a default +// value can be set in the field's tag. Fields without default value are +// required. If the value cannot be converted to the field type an error is +// returned. +// +// time.Duration fields have the result of time.ParseDuration() assigned. +// +// time.Time fields have the vaule of time.Parse() assigned. The default layout +// is time.RFC3339 but can be set in the field's tag. +// +// Arrays and slices of string, boolean, numeric, time.Duration and time.Time +// fields have the value interpreted as a comma separated list of values. The +// individual values are trimmed of whitespace and empty values are ignored. A +// default value can be provided as a semicolon separated list in the field's +// tag. +// +// Struct fields are decoded recursively using the field name plus "." as +// prefix. The prefix (without dot) can be overridden in the field's tag. +// Default values are not supported in the field's tag. Specify them on the +// fields of the inner struct instead. +// +// Map fields must have a key of type string and are decoded recursively by +// using the field's name plus ".' as prefix and the next element of the key +// name as map key. The prefix (without dot) can be overridden in the field's +// tag. Default values are not supported. +// +// Examples: +// +// // Field is ignored. +// Field int `properties:"-"` +// +// // Field is assigned value of 'Field'. +// Field int +// +// // Field is assigned value of 'myName'. +// Field int `properties:"myName"` +// +// // Field is assigned value of key 'myName' and has a default +// // value 15 if the key does not exist. +// Field int `properties:"myName,default=15"` +// +// // Field is assigned value of key 'Field' and has a default +// // value 15 if the key does not exist. +// Field int `properties:",default=15"` +// +// // Field is assigned value of key 'date' and the date +// // is in format 2006-01-02 +// Field time.Time `properties:"date,layout=2006-01-02"` +// +// // Field is assigned the non-empty and whitespace trimmed +// // values of key 'Field' split by commas. +// Field []string +// +// // Field is assigned the non-empty and whitespace trimmed +// // values of key 'Field' split by commas and has a default +// // value ["a", "b", "c"] if the key does not exist. +// Field []string `properties:",default=a;b;c"` +// +// // Field is decoded recursively with "Field." as key prefix. +// Field SomeStruct +// +// // Field is decoded recursively with "myName." as key prefix. +// Field SomeStruct `properties:"myName"` +// +// // Field is decoded recursively with "Field." as key prefix +// // and the next dotted element of the key as map key. +// Field map[string]string +// +// // Field is decoded recursively with "myName." as key prefix +// // and the next dotted element of the key as map key. +// Field map[string]string `properties:"myName"` +func (p *Properties) Decode(x interface{}) error { + t, v := reflect.TypeOf(x), reflect.ValueOf(x) + if t.Kind() != reflect.Ptr || v.Elem().Type().Kind() != reflect.Struct { + return fmt.Errorf("not a pointer to struct: %s", t) + } + if err := dec(p, "", nil, nil, v); err != nil { + return err + } + return nil +} + +func dec(p *Properties, key string, def *string, opts map[string]string, v reflect.Value) error { + t := v.Type() + + // value returns the property value for key or the default if provided. + value := func() (string, error) { + if val, ok := p.Get(key); ok { + return val, nil + } + if def != nil { + return *def, nil + } + return "", fmt.Errorf("missing required key %s", key) + } + + // conv converts a string to a value of the given type. + conv := func(s string, t reflect.Type) (val reflect.Value, err error) { + var v interface{} + + switch { + case isDuration(t): + v, err = time.ParseDuration(s) + + case isTime(t): + layout := opts["layout"] + if layout == "" { + layout = time.RFC3339 + } + v, err = time.Parse(layout, s) + + case isBool(t): + v, err = boolVal(s), nil + + case isString(t): + v, err = s, nil + + case isFloat(t): + v, err = strconv.ParseFloat(s, 64) + + case isInt(t): + v, err = strconv.ParseInt(s, 10, 64) + + case isUint(t): + v, err = strconv.ParseUint(s, 10, 64) + + default: + return reflect.Zero(t), fmt.Errorf("unsupported type %s", t) + } + if err != nil { + return reflect.Zero(t), err + } + return reflect.ValueOf(v).Convert(t), nil + } + + // keydef returns the property key and the default value based on the + // name of the struct field and the options in the tag. + keydef := func(f reflect.StructField) (string, *string, map[string]string) { + _key, _opts := parseTag(f.Tag.Get("properties")) + + var _def *string + if d, ok := _opts["default"]; ok { + _def = &d + } + if _key != "" { + return _key, _def, _opts + } + return f.Name, _def, _opts + } + + switch { + case isDuration(t) || isTime(t) || isBool(t) || isString(t) || isFloat(t) || isInt(t) || isUint(t): + s, err := value() + if err != nil { + return err + } + val, err := conv(s, t) + if err != nil { + return err + } + v.Set(val) + + case isPtr(t): + return dec(p, key, def, opts, v.Elem()) + + case isStruct(t): + for i := 0; i < v.NumField(); i++ { + fv := v.Field(i) + fk, def, opts := keydef(t.Field(i)) + if !fv.CanSet() { + return fmt.Errorf("cannot set %s", t.Field(i).Name) + } + if fk == "-" { + continue + } + if key != "" { + fk = key + "." + fk + } + if err := dec(p, fk, def, opts, fv); err != nil { + return err + } + } + return nil + + case isArray(t): + val, err := value() + if err != nil { + return err + } + vals := split(val, ";") + a := reflect.MakeSlice(t, 0, len(vals)) + for _, s := range vals { + val, err := conv(s, t.Elem()) + if err != nil { + return err + } + a = reflect.Append(a, val) + } + v.Set(a) + + case isMap(t): + valT := t.Elem() + m := reflect.MakeMap(t) + for postfix := range p.FilterStripPrefix(key + ".").m { + pp := strings.SplitN(postfix, ".", 2) + mk, mv := pp[0], reflect.New(valT) + if err := dec(p, key+"."+mk, nil, nil, mv); err != nil { + return err + } + m.SetMapIndex(reflect.ValueOf(mk), mv.Elem()) + } + v.Set(m) + + default: + return fmt.Errorf("unsupported type %s", t) + } + return nil +} + +// split splits a string on sep, trims whitespace of elements +// and omits empty elements +func split(s string, sep string) []string { + var a []string + for _, v := range strings.Split(s, sep) { + if v = strings.TrimSpace(v); v != "" { + a = append(a, v) + } + } + return a +} + +// parseTag parses a "key,k=v,k=v,..." +func parseTag(tag string) (key string, opts map[string]string) { + opts = map[string]string{} + for i, s := range strings.Split(tag, ",") { + if i == 0 { + key = s + continue + } + + pp := strings.SplitN(s, "=", 2) + if len(pp) == 1 { + opts[pp[0]] = "" + } else { + opts[pp[0]] = pp[1] + } + } + return key, opts +} + +func isArray(t reflect.Type) bool { return t.Kind() == reflect.Array || t.Kind() == reflect.Slice } +func isBool(t reflect.Type) bool { return t.Kind() == reflect.Bool } +func isDuration(t reflect.Type) bool { return t == reflect.TypeOf(time.Second) } +func isMap(t reflect.Type) bool { return t.Kind() == reflect.Map } +func isPtr(t reflect.Type) bool { return t.Kind() == reflect.Ptr } +func isString(t reflect.Type) bool { return t.Kind() == reflect.String } +func isStruct(t reflect.Type) bool { return t.Kind() == reflect.Struct } +func isTime(t reflect.Type) bool { return t == reflect.TypeOf(time.Time{}) } +func isFloat(t reflect.Type) bool { + return t.Kind() == reflect.Float32 || t.Kind() == reflect.Float64 +} +func isInt(t reflect.Type) bool { + return t.Kind() == reflect.Int || t.Kind() == reflect.Int8 || t.Kind() == reflect.Int16 || t.Kind() == reflect.Int32 || t.Kind() == reflect.Int64 +} +func isUint(t reflect.Type) bool { + return t.Kind() == reflect.Uint || t.Kind() == reflect.Uint8 || t.Kind() == reflect.Uint16 || t.Kind() == reflect.Uint32 || t.Kind() == reflect.Uint64 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/magiconair/properties/doc.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/magiconair/properties/doc.go new file mode 100644 index 00000000..f8822da2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/magiconair/properties/doc.go @@ -0,0 +1,156 @@ +// Copyright 2018 Frank Schroeder. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package properties provides functions for reading and writing +// ISO-8859-1 and UTF-8 encoded .properties files and has +// support for recursive property expansion. +// +// Java properties files are ISO-8859-1 encoded and use Unicode +// literals for characters outside the ISO character set. Unicode +// literals can be used in UTF-8 encoded properties files but +// aren't necessary. +// +// To load a single properties file use MustLoadFile(): +// +// p := properties.MustLoadFile(filename, properties.UTF8) +// +// To load multiple properties files use MustLoadFiles() +// which loads the files in the given order and merges the +// result. Missing properties files can be ignored if the +// 'ignoreMissing' flag is set to true. +// +// Filenames can contain environment variables which are expanded +// before loading. +// +// f1 := "/etc/myapp/myapp.conf" +// f2 := "/home/${USER}/myapp.conf" +// p := MustLoadFiles([]string{f1, f2}, properties.UTF8, true) +// +// All of the different key/value delimiters ' ', ':' and '=' are +// supported as well as the comment characters '!' and '#' and +// multi-line values. +// +// ! this is a comment +// # and so is this +// +// # the following expressions are equal +// key value +// key=value +// key:value +// key = value +// key : value +// key = val\ +// ue +// +// Properties stores all comments preceding a key and provides +// GetComments() and SetComments() methods to retrieve and +// update them. The convenience functions GetComment() and +// SetComment() allow access to the last comment. The +// WriteComment() method writes properties files including +// the comments and with the keys in the original order. +// This can be used for sanitizing properties files. +// +// Property expansion is recursive and circular references +// and malformed expressions are not allowed and cause an +// error. Expansion of environment variables is supported. +// +// # standard property +// key = value +// +// # property expansion: key2 = value +// key2 = ${key} +// +// # recursive expansion: key3 = value +// key3 = ${key2} +// +// # circular reference (error) +// key = ${key} +// +// # malformed expression (error) +// key = ${ke +// +// # refers to the users' home dir +// home = ${HOME} +// +// # local key takes precedence over env var: u = foo +// USER = foo +// u = ${USER} +// +// The default property expansion format is ${key} but can be +// changed by setting different pre- and postfix values on the +// Properties object. +// +// p := properties.NewProperties() +// p.Prefix = "#[" +// p.Postfix = "]#" +// +// Properties provides convenience functions for getting typed +// values with default values if the key does not exist or the +// type conversion failed. +// +// # Returns true if the value is either "1", "on", "yes" or "true" +// # Returns false for every other value and the default value if +// # the key does not exist. +// v = p.GetBool("key", false) +// +// # Returns the value if the key exists and the format conversion +// # was successful. Otherwise, the default value is returned. +// v = p.GetInt64("key", 999) +// v = p.GetUint64("key", 999) +// v = p.GetFloat64("key", 123.0) +// v = p.GetString("key", "def") +// v = p.GetDuration("key", 999) +// +// As an alternative properties may be applied with the standard +// library's flag implementation at any time. +// +// # Standard configuration +// v = flag.Int("key", 999, "help message") +// flag.Parse() +// +// # Merge p into the flag set +// p.MustFlag(flag.CommandLine) +// +// Properties provides several MustXXX() convenience functions +// which will terminate the app if an error occurs. The behavior +// of the failure is configurable and the default is to call +// log.Fatal(err). To have the MustXXX() functions panic instead +// of logging the error set a different ErrorHandler before +// you use the Properties package. +// +// properties.ErrorHandler = properties.PanicHandler +// +// # Will panic instead of logging an error +// p := properties.MustLoadFile("config.properties") +// +// You can also provide your own ErrorHandler function. The only requirement +// is that the error handler function must exit after handling the error. +// +// properties.ErrorHandler = func(err error) { +// fmt.Println(err) +// os.Exit(1) +// } +// +// # Will write to stdout and then exit +// p := properties.MustLoadFile("config.properties") +// +// Properties can also be loaded into a struct via the `Decode` +// method, e.g. +// +// type S struct { +// A string `properties:"a,default=foo"` +// D time.Duration `properties:"timeout,default=5s"` +// E time.Time `properties:"expires,layout=2006-01-02,default=2015-01-01"` +// } +// +// See `Decode()` method for the full documentation. +// +// The following documents provide a description of the properties +// file format. +// +// http://en.wikipedia.org/wiki/.properties +// +// http://docs.oracle.com/javase/7/docs/api/java/util/Properties.html#load%28java.io.Reader%29 +// +package properties diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/magiconair/properties/integrate.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/magiconair/properties/integrate.go new file mode 100644 index 00000000..74d38dc6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/magiconair/properties/integrate.go @@ -0,0 +1,34 @@ +// Copyright 2018 Frank Schroeder. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package properties + +import "flag" + +// MustFlag sets flags that are skipped by dst.Parse when p contains +// the respective key for flag.Flag.Name. +// +// It's use is recommended with command line arguments as in: +// flag.Parse() +// p.MustFlag(flag.CommandLine) +func (p *Properties) MustFlag(dst *flag.FlagSet) { + m := make(map[string]*flag.Flag) + dst.VisitAll(func(f *flag.Flag) { + m[f.Name] = f + }) + dst.Visit(func(f *flag.Flag) { + delete(m, f.Name) // overridden + }) + + for name, f := range m { + v, ok := p.Get(name) + if !ok { + continue + } + + if err := f.Value.Set(v); err != nil { + ErrorHandler(err) + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/magiconair/properties/lex.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/magiconair/properties/lex.go new file mode 100644 index 00000000..367166d5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/magiconair/properties/lex.go @@ -0,0 +1,407 @@ +// Copyright 2018 Frank Schroeder. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. +// +// Parts of the lexer are from the template/text/parser package +// For these parts the following applies: +// +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file of the go 1.2 +// distribution. + +package properties + +import ( + "fmt" + "strconv" + "strings" + "unicode/utf8" +) + +// item represents a token or text string returned from the scanner. +type item struct { + typ itemType // The type of this item. + pos int // The starting position, in bytes, of this item in the input string. + val string // The value of this item. +} + +func (i item) String() string { + switch { + case i.typ == itemEOF: + return "EOF" + case i.typ == itemError: + return i.val + case len(i.val) > 10: + return fmt.Sprintf("%.10q...", i.val) + } + return fmt.Sprintf("%q", i.val) +} + +// itemType identifies the type of lex items. +type itemType int + +const ( + itemError itemType = iota // error occurred; value is text of error + itemEOF + itemKey // a key + itemValue // a value + itemComment // a comment +) + +// defines a constant for EOF +const eof = -1 + +// permitted whitespace characters space, FF and TAB +const whitespace = " \f\t" + +// stateFn represents the state of the scanner as a function that returns the next state. +type stateFn func(*lexer) stateFn + +// lexer holds the state of the scanner. +type lexer struct { + input string // the string being scanned + state stateFn // the next lexing function to enter + pos int // current position in the input + start int // start position of this item + width int // width of last rune read from input + lastPos int // position of most recent item returned by nextItem + runes []rune // scanned runes for this item + items chan item // channel of scanned items +} + +// next returns the next rune in the input. +func (l *lexer) next() rune { + if l.pos >= len(l.input) { + l.width = 0 + return eof + } + r, w := utf8.DecodeRuneInString(l.input[l.pos:]) + l.width = w + l.pos += l.width + return r +} + +// peek returns but does not consume the next rune in the input. +func (l *lexer) peek() rune { + r := l.next() + l.backup() + return r +} + +// backup steps back one rune. Can only be called once per call of next. +func (l *lexer) backup() { + l.pos -= l.width +} + +// emit passes an item back to the client. +func (l *lexer) emit(t itemType) { + i := item{t, l.start, string(l.runes)} + l.items <- i + l.start = l.pos + l.runes = l.runes[:0] +} + +// ignore skips over the pending input before this point. +func (l *lexer) ignore() { + l.start = l.pos +} + +// appends the rune to the current value +func (l *lexer) appendRune(r rune) { + l.runes = append(l.runes, r) +} + +// accept consumes the next rune if it's from the valid set. +func (l *lexer) accept(valid string) bool { + if strings.ContainsRune(valid, l.next()) { + return true + } + l.backup() + return false +} + +// acceptRun consumes a run of runes from the valid set. +func (l *lexer) acceptRun(valid string) { + for strings.ContainsRune(valid, l.next()) { + } + l.backup() +} + +// acceptRunUntil consumes a run of runes up to a terminator. +func (l *lexer) acceptRunUntil(term rune) { + for term != l.next() { + } + l.backup() +} + +// hasText returns true if the current parsed text is not empty. +func (l *lexer) isNotEmpty() bool { + return l.pos > l.start +} + +// lineNumber reports which line we're on, based on the position of +// the previous item returned by nextItem. Doing it this way +// means we don't have to worry about peek double counting. +func (l *lexer) lineNumber() int { + return 1 + strings.Count(l.input[:l.lastPos], "\n") +} + +// errorf returns an error token and terminates the scan by passing +// back a nil pointer that will be the next state, terminating l.nextItem. +func (l *lexer) errorf(format string, args ...interface{}) stateFn { + l.items <- item{itemError, l.start, fmt.Sprintf(format, args...)} + return nil +} + +// nextItem returns the next item from the input. +func (l *lexer) nextItem() item { + i := <-l.items + l.lastPos = i.pos + return i +} + +// lex creates a new scanner for the input string. +func lex(input string) *lexer { + l := &lexer{ + input: input, + items: make(chan item), + runes: make([]rune, 0, 32), + } + go l.run() + return l +} + +// run runs the state machine for the lexer. +func (l *lexer) run() { + for l.state = lexBeforeKey(l); l.state != nil; { + l.state = l.state(l) + } +} + +// state functions + +// lexBeforeKey scans until a key begins. +func lexBeforeKey(l *lexer) stateFn { + switch r := l.next(); { + case isEOF(r): + l.emit(itemEOF) + return nil + + case isEOL(r): + l.ignore() + return lexBeforeKey + + case isComment(r): + return lexComment + + case isWhitespace(r): + l.ignore() + return lexBeforeKey + + default: + l.backup() + return lexKey + } +} + +// lexComment scans a comment line. The comment character has already been scanned. +func lexComment(l *lexer) stateFn { + l.acceptRun(whitespace) + l.ignore() + for { + switch r := l.next(); { + case isEOF(r): + l.ignore() + l.emit(itemEOF) + return nil + case isEOL(r): + l.emit(itemComment) + return lexBeforeKey + default: + l.appendRune(r) + } + } +} + +// lexKey scans the key up to a delimiter +func lexKey(l *lexer) stateFn { + var r rune + +Loop: + for { + switch r = l.next(); { + + case isEscape(r): + err := l.scanEscapeSequence() + if err != nil { + return l.errorf(err.Error()) + } + + case isEndOfKey(r): + l.backup() + break Loop + + case isEOF(r): + break Loop + + default: + l.appendRune(r) + } + } + + if len(l.runes) > 0 { + l.emit(itemKey) + } + + if isEOF(r) { + l.emit(itemEOF) + return nil + } + + return lexBeforeValue +} + +// lexBeforeValue scans the delimiter between key and value. +// Leading and trailing whitespace is ignored. +// We expect to be just after the key. +func lexBeforeValue(l *lexer) stateFn { + l.acceptRun(whitespace) + l.accept(":=") + l.acceptRun(whitespace) + l.ignore() + return lexValue +} + +// lexValue scans text until the end of the line. We expect to be just after the delimiter. +func lexValue(l *lexer) stateFn { + for { + switch r := l.next(); { + case isEscape(r): + if isEOL(l.peek()) { + l.next() + l.acceptRun(whitespace) + } else { + err := l.scanEscapeSequence() + if err != nil { + return l.errorf(err.Error()) + } + } + + case isEOL(r): + l.emit(itemValue) + l.ignore() + return lexBeforeKey + + case isEOF(r): + l.emit(itemValue) + l.emit(itemEOF) + return nil + + default: + l.appendRune(r) + } + } +} + +// scanEscapeSequence scans either one of the escaped characters +// or a unicode literal. We expect to be after the escape character. +func (l *lexer) scanEscapeSequence() error { + switch r := l.next(); { + + case isEscapedCharacter(r): + l.appendRune(decodeEscapedCharacter(r)) + return nil + + case atUnicodeLiteral(r): + return l.scanUnicodeLiteral() + + case isEOF(r): + return fmt.Errorf("premature EOF") + + // silently drop the escape character and append the rune as is + default: + l.appendRune(r) + return nil + } +} + +// scans a unicode literal in the form \uXXXX. We expect to be after the \u. +func (l *lexer) scanUnicodeLiteral() error { + // scan the digits + d := make([]rune, 4) + for i := 0; i < 4; i++ { + d[i] = l.next() + if d[i] == eof || !strings.ContainsRune("0123456789abcdefABCDEF", d[i]) { + return fmt.Errorf("invalid unicode literal") + } + } + + // decode the digits into a rune + r, err := strconv.ParseInt(string(d), 16, 0) + if err != nil { + return err + } + + l.appendRune(rune(r)) + return nil +} + +// decodeEscapedCharacter returns the unescaped rune. We expect to be after the escape character. +func decodeEscapedCharacter(r rune) rune { + switch r { + case 'f': + return '\f' + case 'n': + return '\n' + case 'r': + return '\r' + case 't': + return '\t' + default: + return r + } +} + +// atUnicodeLiteral reports whether we are at a unicode literal. +// The escape character has already been consumed. +func atUnicodeLiteral(r rune) bool { + return r == 'u' +} + +// isComment reports whether we are at the start of a comment. +func isComment(r rune) bool { + return r == '#' || r == '!' +} + +// isEndOfKey reports whether the rune terminates the current key. +func isEndOfKey(r rune) bool { + return strings.ContainsRune(" \f\t\r\n:=", r) +} + +// isEOF reports whether we are at EOF. +func isEOF(r rune) bool { + return r == eof +} + +// isEOL reports whether we are at a new line character. +func isEOL(r rune) bool { + return r == '\n' || r == '\r' +} + +// isEscape reports whether the rune is the escape character which +// prefixes unicode literals and other escaped characters. +func isEscape(r rune) bool { + return r == '\\' +} + +// isEscapedCharacter reports whether we are at one of the characters that need escaping. +// The escape character has already been consumed. +func isEscapedCharacter(r rune) bool { + return strings.ContainsRune(" :=fnrt", r) +} + +// isWhitespace reports whether the rune is a whitespace character. +func isWhitespace(r rune) bool { + return strings.ContainsRune(whitespace, r) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/magiconair/properties/load.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/magiconair/properties/load.go new file mode 100644 index 00000000..c8e1b580 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/magiconair/properties/load.go @@ -0,0 +1,292 @@ +// Copyright 2018 Frank Schroeder. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package properties + +import ( + "fmt" + "io/ioutil" + "net/http" + "os" + "strings" +) + +// Encoding specifies encoding of the input data. +type Encoding uint + +const ( + // utf8Default is a private placeholder for the zero value of Encoding to + // ensure that it has the correct meaning. UTF8 is the default encoding but + // was assigned a non-zero value which cannot be changed without breaking + // existing code. Clients should continue to use the public constants. + utf8Default Encoding = iota + + // UTF8 interprets the input data as UTF-8. + UTF8 + + // ISO_8859_1 interprets the input data as ISO-8859-1. + ISO_8859_1 +) + +type Loader struct { + // Encoding determines how the data from files and byte buffers + // is interpreted. For URLs the Content-Type header is used + // to determine the encoding of the data. + Encoding Encoding + + // DisableExpansion configures the property expansion of the + // returned property object. When set to true, the property values + // will not be expanded and the Property object will not be checked + // for invalid expansion expressions. + DisableExpansion bool + + // IgnoreMissing configures whether missing files or URLs which return + // 404 are reported as errors. When set to true, missing files and 404 + // status codes are not reported as errors. + IgnoreMissing bool +} + +// Load reads a buffer into a Properties struct. +func (l *Loader) LoadBytes(buf []byte) (*Properties, error) { + return l.loadBytes(buf, l.Encoding) +} + +// LoadAll reads the content of multiple URLs or files in the given order into +// a Properties struct. If IgnoreMissing is true then a 404 status code or +// missing file will not be reported as error. Encoding sets the encoding for +// files. For the URLs see LoadURL for the Content-Type header and the +// encoding. +func (l *Loader) LoadAll(names []string) (*Properties, error) { + all := NewProperties() + for _, name := range names { + n, err := expandName(name) + if err != nil { + return nil, err + } + + var p *Properties + switch { + case strings.HasPrefix(n, "http://"): + p, err = l.LoadURL(n) + case strings.HasPrefix(n, "https://"): + p, err = l.LoadURL(n) + default: + p, err = l.LoadFile(n) + } + if err != nil { + return nil, err + } + all.Merge(p) + } + + all.DisableExpansion = l.DisableExpansion + if all.DisableExpansion { + return all, nil + } + return all, all.check() +} + +// LoadFile reads a file into a Properties struct. +// If IgnoreMissing is true then a missing file will not be +// reported as error. +func (l *Loader) LoadFile(filename string) (*Properties, error) { + data, err := ioutil.ReadFile(filename) + if err != nil { + if l.IgnoreMissing && os.IsNotExist(err) { + LogPrintf("properties: %s not found. skipping", filename) + return NewProperties(), nil + } + return nil, err + } + return l.loadBytes(data, l.Encoding) +} + +// LoadURL reads the content of the URL into a Properties struct. +// +// The encoding is determined via the Content-Type header which +// should be set to 'text/plain'. If the 'charset' parameter is +// missing, 'iso-8859-1' or 'latin1' the encoding is set to +// ISO-8859-1. If the 'charset' parameter is set to 'utf-8' the +// encoding is set to UTF-8. A missing content type header is +// interpreted as 'text/plain; charset=utf-8'. +func (l *Loader) LoadURL(url string) (*Properties, error) { + resp, err := http.Get(url) + if err != nil { + return nil, fmt.Errorf("properties: error fetching %q. %s", url, err) + } + + if resp.StatusCode == 404 && l.IgnoreMissing { + LogPrintf("properties: %s returned %d. skipping", url, resp.StatusCode) + return NewProperties(), nil + } + + if resp.StatusCode != 200 { + return nil, fmt.Errorf("properties: %s returned %d", url, resp.StatusCode) + } + + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return nil, fmt.Errorf("properties: %s error reading response. %s", url, err) + } + defer resp.Body.Close() + + ct := resp.Header.Get("Content-Type") + var enc Encoding + switch strings.ToLower(ct) { + case "text/plain", "text/plain; charset=iso-8859-1", "text/plain; charset=latin1": + enc = ISO_8859_1 + case "", "text/plain; charset=utf-8": + enc = UTF8 + default: + return nil, fmt.Errorf("properties: invalid content type %s", ct) + } + + return l.loadBytes(body, enc) +} + +func (l *Loader) loadBytes(buf []byte, enc Encoding) (*Properties, error) { + p, err := parse(convert(buf, enc)) + if err != nil { + return nil, err + } + p.DisableExpansion = l.DisableExpansion + if p.DisableExpansion { + return p, nil + } + return p, p.check() +} + +// Load reads a buffer into a Properties struct. +func Load(buf []byte, enc Encoding) (*Properties, error) { + l := &Loader{Encoding: enc} + return l.LoadBytes(buf) +} + +// LoadString reads an UTF8 string into a properties struct. +func LoadString(s string) (*Properties, error) { + l := &Loader{Encoding: UTF8} + return l.LoadBytes([]byte(s)) +} + +// LoadMap creates a new Properties struct from a string map. +func LoadMap(m map[string]string) *Properties { + p := NewProperties() + for k, v := range m { + p.Set(k, v) + } + return p +} + +// LoadFile reads a file into a Properties struct. +func LoadFile(filename string, enc Encoding) (*Properties, error) { + l := &Loader{Encoding: enc} + return l.LoadAll([]string{filename}) +} + +// LoadFiles reads multiple files in the given order into +// a Properties struct. If 'ignoreMissing' is true then +// non-existent files will not be reported as error. +func LoadFiles(filenames []string, enc Encoding, ignoreMissing bool) (*Properties, error) { + l := &Loader{Encoding: enc, IgnoreMissing: ignoreMissing} + return l.LoadAll(filenames) +} + +// LoadURL reads the content of the URL into a Properties struct. +// See Loader#LoadURL for details. +func LoadURL(url string) (*Properties, error) { + l := &Loader{Encoding: UTF8} + return l.LoadAll([]string{url}) +} + +// LoadURLs reads the content of multiple URLs in the given order into a +// Properties struct. If IgnoreMissing is true then a 404 status code will +// not be reported as error. See Loader#LoadURL for the Content-Type header +// and the encoding. +func LoadURLs(urls []string, ignoreMissing bool) (*Properties, error) { + l := &Loader{Encoding: UTF8, IgnoreMissing: ignoreMissing} + return l.LoadAll(urls) +} + +// LoadAll reads the content of multiple URLs or files in the given order into a +// Properties struct. If 'ignoreMissing' is true then a 404 status code or missing file will +// not be reported as error. Encoding sets the encoding for files. For the URLs please see +// LoadURL for the Content-Type header and the encoding. +func LoadAll(names []string, enc Encoding, ignoreMissing bool) (*Properties, error) { + l := &Loader{Encoding: enc, IgnoreMissing: ignoreMissing} + return l.LoadAll(names) +} + +// MustLoadString reads an UTF8 string into a Properties struct and +// panics on error. +func MustLoadString(s string) *Properties { + return must(LoadString(s)) +} + +// MustLoadFile reads a file into a Properties struct and +// panics on error. +func MustLoadFile(filename string, enc Encoding) *Properties { + return must(LoadFile(filename, enc)) +} + +// MustLoadFiles reads multiple files in the given order into +// a Properties struct and panics on error. If 'ignoreMissing' +// is true then non-existent files will not be reported as error. +func MustLoadFiles(filenames []string, enc Encoding, ignoreMissing bool) *Properties { + return must(LoadFiles(filenames, enc, ignoreMissing)) +} + +// MustLoadURL reads the content of a URL into a Properties struct and +// panics on error. +func MustLoadURL(url string) *Properties { + return must(LoadURL(url)) +} + +// MustLoadURLs reads the content of multiple URLs in the given order into a +// Properties struct and panics on error. If 'ignoreMissing' is true then a 404 +// status code will not be reported as error. +func MustLoadURLs(urls []string, ignoreMissing bool) *Properties { + return must(LoadURLs(urls, ignoreMissing)) +} + +// MustLoadAll reads the content of multiple URLs or files in the given order into a +// Properties struct. If 'ignoreMissing' is true then a 404 status code or missing file will +// not be reported as error. Encoding sets the encoding for files. For the URLs please see +// LoadURL for the Content-Type header and the encoding. It panics on error. +func MustLoadAll(names []string, enc Encoding, ignoreMissing bool) *Properties { + return must(LoadAll(names, enc, ignoreMissing)) +} + +func must(p *Properties, err error) *Properties { + if err != nil { + ErrorHandler(err) + } + return p +} + +// expandName expands ${ENV_VAR} expressions in a name. +// If the environment variable does not exist then it will be replaced +// with an empty string. Malformed expressions like "${ENV_VAR" will +// be reported as error. +func expandName(name string) (string, error) { + return expand(name, []string{}, "${", "}", make(map[string]string)) +} + +// Interprets a byte buffer either as an ISO-8859-1 or UTF-8 encoded string. +// For ISO-8859-1 we can convert each byte straight into a rune since the +// first 256 unicode code points cover ISO-8859-1. +func convert(buf []byte, enc Encoding) string { + switch enc { + case utf8Default, UTF8: + return string(buf) + case ISO_8859_1: + runes := make([]rune, len(buf)) + for i, b := range buf { + runes[i] = rune(b) + } + return string(runes) + default: + ErrorHandler(fmt.Errorf("unsupported encoding %v", enc)) + } + panic("ErrorHandler should exit") +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/magiconair/properties/parser.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/magiconair/properties/parser.go new file mode 100644 index 00000000..cdc4a803 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/magiconair/properties/parser.go @@ -0,0 +1,95 @@ +// Copyright 2018 Frank Schroeder. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package properties + +import ( + "fmt" + "runtime" +) + +type parser struct { + lex *lexer +} + +func parse(input string) (properties *Properties, err error) { + p := &parser{lex: lex(input)} + defer p.recover(&err) + + properties = NewProperties() + key := "" + comments := []string{} + + for { + token := p.expectOneOf(itemComment, itemKey, itemEOF) + switch token.typ { + case itemEOF: + goto done + case itemComment: + comments = append(comments, token.val) + continue + case itemKey: + key = token.val + if _, ok := properties.m[key]; !ok { + properties.k = append(properties.k, key) + } + } + + token = p.expectOneOf(itemValue, itemEOF) + if len(comments) > 0 { + properties.c[key] = comments + comments = []string{} + } + switch token.typ { + case itemEOF: + properties.m[key] = "" + goto done + case itemValue: + properties.m[key] = token.val + } + } + +done: + return properties, nil +} + +func (p *parser) errorf(format string, args ...interface{}) { + format = fmt.Sprintf("properties: Line %d: %s", p.lex.lineNumber(), format) + panic(fmt.Errorf(format, args...)) +} + +func (p *parser) expect(expected itemType) (token item) { + token = p.lex.nextItem() + if token.typ != expected { + p.unexpected(token) + } + return token +} + +func (p *parser) expectOneOf(expected ...itemType) (token item) { + token = p.lex.nextItem() + for _, v := range expected { + if token.typ == v { + return token + } + } + p.unexpected(token) + panic("unexpected token") +} + +func (p *parser) unexpected(token item) { + p.errorf(token.String()) +} + +// recover is the handler that turns panics into returns from the top level of Parse. +func (p *parser) recover(errp *error) { + e := recover() + if e != nil { + if _, ok := e.(runtime.Error); ok { + panic(e) + } + *errp = e.(error) + } + return +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/magiconair/properties/properties.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/magiconair/properties/properties.go new file mode 100644 index 00000000..cb3d1a33 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/magiconair/properties/properties.go @@ -0,0 +1,833 @@ +// Copyright 2018 Frank Schroeder. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package properties + +// BUG(frank): Set() does not check for invalid unicode literals since this is currently handled by the lexer. +// BUG(frank): Write() does not allow to configure the newline character. Therefore, on Windows LF is used. + +import ( + "fmt" + "io" + "log" + "os" + "regexp" + "strconv" + "strings" + "time" + "unicode/utf8" +) + +const maxExpansionDepth = 64 + +// ErrorHandlerFunc defines the type of function which handles failures +// of the MustXXX() functions. An error handler function must exit +// the application after handling the error. +type ErrorHandlerFunc func(error) + +// ErrorHandler is the function which handles failures of the MustXXX() +// functions. The default is LogFatalHandler. +var ErrorHandler ErrorHandlerFunc = LogFatalHandler + +// LogHandlerFunc defines the function prototype for logging errors. +type LogHandlerFunc func(fmt string, args ...interface{}) + +// LogPrintf defines a log handler which uses log.Printf. +var LogPrintf LogHandlerFunc = log.Printf + +// LogFatalHandler handles the error by logging a fatal error and exiting. +func LogFatalHandler(err error) { + log.Fatal(err) +} + +// PanicHandler handles the error by panicking. +func PanicHandler(err error) { + panic(err) +} + +// ----------------------------------------------------------------------------- + +// A Properties contains the key/value pairs from the properties input. +// All values are stored in unexpanded form and are expanded at runtime +type Properties struct { + // Pre-/Postfix for property expansion. + Prefix string + Postfix string + + // DisableExpansion controls the expansion of properties on Get() + // and the check for circular references on Set(). When set to + // true Properties behaves like a simple key/value store and does + // not check for circular references on Get() or on Set(). + DisableExpansion bool + + // Stores the key/value pairs + m map[string]string + + // Stores the comments per key. + c map[string][]string + + // Stores the keys in order of appearance. + k []string +} + +// NewProperties creates a new Properties struct with the default +// configuration for "${key}" expressions. +func NewProperties() *Properties { + return &Properties{ + Prefix: "${", + Postfix: "}", + m: map[string]string{}, + c: map[string][]string{}, + k: []string{}, + } +} + +// Load reads a buffer into the given Properties struct. +func (p *Properties) Load(buf []byte, enc Encoding) error { + l := &Loader{Encoding: enc, DisableExpansion: p.DisableExpansion} + newProperties, err := l.LoadBytes(buf) + if err != nil { + return err + } + p.Merge(newProperties) + return nil +} + +// Get returns the expanded value for the given key if exists. +// Otherwise, ok is false. +func (p *Properties) Get(key string) (value string, ok bool) { + v, ok := p.m[key] + if p.DisableExpansion { + return v, ok + } + if !ok { + return "", false + } + + expanded, err := p.expand(key, v) + + // we guarantee that the expanded value is free of + // circular references and malformed expressions + // so we panic if we still get an error here. + if err != nil { + ErrorHandler(fmt.Errorf("%s in %q", err, key+" = "+v)) + } + + return expanded, true +} + +// MustGet returns the expanded value for the given key if exists. +// Otherwise, it panics. +func (p *Properties) MustGet(key string) string { + if v, ok := p.Get(key); ok { + return v + } + ErrorHandler(invalidKeyError(key)) + panic("ErrorHandler should exit") +} + +// ---------------------------------------------------------------------------- + +// ClearComments removes the comments for all keys. +func (p *Properties) ClearComments() { + p.c = map[string][]string{} +} + +// ---------------------------------------------------------------------------- + +// GetComment returns the last comment before the given key or an empty string. +func (p *Properties) GetComment(key string) string { + comments, ok := p.c[key] + if !ok || len(comments) == 0 { + return "" + } + return comments[len(comments)-1] +} + +// ---------------------------------------------------------------------------- + +// GetComments returns all comments that appeared before the given key or nil. +func (p *Properties) GetComments(key string) []string { + if comments, ok := p.c[key]; ok { + return comments + } + return nil +} + +// ---------------------------------------------------------------------------- + +// SetComment sets the comment for the key. +func (p *Properties) SetComment(key, comment string) { + p.c[key] = []string{comment} +} + +// ---------------------------------------------------------------------------- + +// SetComments sets the comments for the key. If the comments are nil then +// all comments for this key are deleted. +func (p *Properties) SetComments(key string, comments []string) { + if comments == nil { + delete(p.c, key) + return + } + p.c[key] = comments +} + +// ---------------------------------------------------------------------------- + +// GetBool checks if the expanded value is one of '1', 'yes', +// 'true' or 'on' if the key exists. The comparison is case-insensitive. +// If the key does not exist the default value is returned. +func (p *Properties) GetBool(key string, def bool) bool { + v, err := p.getBool(key) + if err != nil { + return def + } + return v +} + +// MustGetBool checks if the expanded value is one of '1', 'yes', +// 'true' or 'on' if the key exists. The comparison is case-insensitive. +// If the key does not exist the function panics. +func (p *Properties) MustGetBool(key string) bool { + v, err := p.getBool(key) + if err != nil { + ErrorHandler(err) + } + return v +} + +func (p *Properties) getBool(key string) (value bool, err error) { + if v, ok := p.Get(key); ok { + return boolVal(v), nil + } + return false, invalidKeyError(key) +} + +func boolVal(v string) bool { + v = strings.ToLower(v) + return v == "1" || v == "true" || v == "yes" || v == "on" +} + +// ---------------------------------------------------------------------------- + +// GetDuration parses the expanded value as an time.Duration (in ns) if the +// key exists. If key does not exist or the value cannot be parsed the default +// value is returned. In almost all cases you want to use GetParsedDuration(). +func (p *Properties) GetDuration(key string, def time.Duration) time.Duration { + v, err := p.getInt64(key) + if err != nil { + return def + } + return time.Duration(v) +} + +// MustGetDuration parses the expanded value as an time.Duration (in ns) if +// the key exists. If key does not exist or the value cannot be parsed the +// function panics. In almost all cases you want to use MustGetParsedDuration(). +func (p *Properties) MustGetDuration(key string) time.Duration { + v, err := p.getInt64(key) + if err != nil { + ErrorHandler(err) + } + return time.Duration(v) +} + +// ---------------------------------------------------------------------------- + +// GetParsedDuration parses the expanded value with time.ParseDuration() if the key exists. +// If key does not exist or the value cannot be parsed the default +// value is returned. +func (p *Properties) GetParsedDuration(key string, def time.Duration) time.Duration { + s, ok := p.Get(key) + if !ok { + return def + } + v, err := time.ParseDuration(s) + if err != nil { + return def + } + return v +} + +// MustGetParsedDuration parses the expanded value with time.ParseDuration() if the key exists. +// If key does not exist or the value cannot be parsed the function panics. +func (p *Properties) MustGetParsedDuration(key string) time.Duration { + s, ok := p.Get(key) + if !ok { + ErrorHandler(invalidKeyError(key)) + } + v, err := time.ParseDuration(s) + if err != nil { + ErrorHandler(err) + } + return v +} + +// ---------------------------------------------------------------------------- + +// GetFloat64 parses the expanded value as a float64 if the key exists. +// If key does not exist or the value cannot be parsed the default +// value is returned. +func (p *Properties) GetFloat64(key string, def float64) float64 { + v, err := p.getFloat64(key) + if err != nil { + return def + } + return v +} + +// MustGetFloat64 parses the expanded value as a float64 if the key exists. +// If key does not exist or the value cannot be parsed the function panics. +func (p *Properties) MustGetFloat64(key string) float64 { + v, err := p.getFloat64(key) + if err != nil { + ErrorHandler(err) + } + return v +} + +func (p *Properties) getFloat64(key string) (value float64, err error) { + if v, ok := p.Get(key); ok { + value, err = strconv.ParseFloat(v, 64) + if err != nil { + return 0, err + } + return value, nil + } + return 0, invalidKeyError(key) +} + +// ---------------------------------------------------------------------------- + +// GetInt parses the expanded value as an int if the key exists. +// If key does not exist or the value cannot be parsed the default +// value is returned. If the value does not fit into an int the +// function panics with an out of range error. +func (p *Properties) GetInt(key string, def int) int { + v, err := p.getInt64(key) + if err != nil { + return def + } + return intRangeCheck(key, v) +} + +// MustGetInt parses the expanded value as an int if the key exists. +// If key does not exist or the value cannot be parsed the function panics. +// If the value does not fit into an int the function panics with +// an out of range error. +func (p *Properties) MustGetInt(key string) int { + v, err := p.getInt64(key) + if err != nil { + ErrorHandler(err) + } + return intRangeCheck(key, v) +} + +// ---------------------------------------------------------------------------- + +// GetInt64 parses the expanded value as an int64 if the key exists. +// If key does not exist or the value cannot be parsed the default +// value is returned. +func (p *Properties) GetInt64(key string, def int64) int64 { + v, err := p.getInt64(key) + if err != nil { + return def + } + return v +} + +// MustGetInt64 parses the expanded value as an int if the key exists. +// If key does not exist or the value cannot be parsed the function panics. +func (p *Properties) MustGetInt64(key string) int64 { + v, err := p.getInt64(key) + if err != nil { + ErrorHandler(err) + } + return v +} + +func (p *Properties) getInt64(key string) (value int64, err error) { + if v, ok := p.Get(key); ok { + value, err = strconv.ParseInt(v, 10, 64) + if err != nil { + return 0, err + } + return value, nil + } + return 0, invalidKeyError(key) +} + +// ---------------------------------------------------------------------------- + +// GetUint parses the expanded value as an uint if the key exists. +// If key does not exist or the value cannot be parsed the default +// value is returned. If the value does not fit into an int the +// function panics with an out of range error. +func (p *Properties) GetUint(key string, def uint) uint { + v, err := p.getUint64(key) + if err != nil { + return def + } + return uintRangeCheck(key, v) +} + +// MustGetUint parses the expanded value as an int if the key exists. +// If key does not exist or the value cannot be parsed the function panics. +// If the value does not fit into an int the function panics with +// an out of range error. +func (p *Properties) MustGetUint(key string) uint { + v, err := p.getUint64(key) + if err != nil { + ErrorHandler(err) + } + return uintRangeCheck(key, v) +} + +// ---------------------------------------------------------------------------- + +// GetUint64 parses the expanded value as an uint64 if the key exists. +// If key does not exist or the value cannot be parsed the default +// value is returned. +func (p *Properties) GetUint64(key string, def uint64) uint64 { + v, err := p.getUint64(key) + if err != nil { + return def + } + return v +} + +// MustGetUint64 parses the expanded value as an int if the key exists. +// If key does not exist or the value cannot be parsed the function panics. +func (p *Properties) MustGetUint64(key string) uint64 { + v, err := p.getUint64(key) + if err != nil { + ErrorHandler(err) + } + return v +} + +func (p *Properties) getUint64(key string) (value uint64, err error) { + if v, ok := p.Get(key); ok { + value, err = strconv.ParseUint(v, 10, 64) + if err != nil { + return 0, err + } + return value, nil + } + return 0, invalidKeyError(key) +} + +// ---------------------------------------------------------------------------- + +// GetString returns the expanded value for the given key if exists or +// the default value otherwise. +func (p *Properties) GetString(key, def string) string { + if v, ok := p.Get(key); ok { + return v + } + return def +} + +// MustGetString returns the expanded value for the given key if exists or +// panics otherwise. +func (p *Properties) MustGetString(key string) string { + if v, ok := p.Get(key); ok { + return v + } + ErrorHandler(invalidKeyError(key)) + panic("ErrorHandler should exit") +} + +// ---------------------------------------------------------------------------- + +// Filter returns a new properties object which contains all properties +// for which the key matches the pattern. +func (p *Properties) Filter(pattern string) (*Properties, error) { + re, err := regexp.Compile(pattern) + if err != nil { + return nil, err + } + + return p.FilterRegexp(re), nil +} + +// FilterRegexp returns a new properties object which contains all properties +// for which the key matches the regular expression. +func (p *Properties) FilterRegexp(re *regexp.Regexp) *Properties { + pp := NewProperties() + for _, k := range p.k { + if re.MatchString(k) { + // TODO(fs): we are ignoring the error which flags a circular reference. + // TODO(fs): since we are just copying a subset of keys this cannot happen (fingers crossed) + pp.Set(k, p.m[k]) + } + } + return pp +} + +// FilterPrefix returns a new properties object with a subset of all keys +// with the given prefix. +func (p *Properties) FilterPrefix(prefix string) *Properties { + pp := NewProperties() + for _, k := range p.k { + if strings.HasPrefix(k, prefix) { + // TODO(fs): we are ignoring the error which flags a circular reference. + // TODO(fs): since we are just copying a subset of keys this cannot happen (fingers crossed) + pp.Set(k, p.m[k]) + } + } + return pp +} + +// FilterStripPrefix returns a new properties object with a subset of all keys +// with the given prefix and the prefix removed from the keys. +func (p *Properties) FilterStripPrefix(prefix string) *Properties { + pp := NewProperties() + n := len(prefix) + for _, k := range p.k { + if len(k) > len(prefix) && strings.HasPrefix(k, prefix) { + // TODO(fs): we are ignoring the error which flags a circular reference. + // TODO(fs): since we are modifying keys I am not entirely sure whether we can create a circular reference + // TODO(fs): this function should probably return an error but the signature is fixed + pp.Set(k[n:], p.m[k]) + } + } + return pp +} + +// Len returns the number of keys. +func (p *Properties) Len() int { + return len(p.m) +} + +// Keys returns all keys in the same order as in the input. +func (p *Properties) Keys() []string { + keys := make([]string, len(p.k)) + copy(keys, p.k) + return keys +} + +// Set sets the property key to the corresponding value. +// If a value for key existed before then ok is true and prev +// contains the previous value. If the value contains a +// circular reference or a malformed expression then +// an error is returned. +// An empty key is silently ignored. +func (p *Properties) Set(key, value string) (prev string, ok bool, err error) { + if key == "" { + return "", false, nil + } + + // if expansion is disabled we allow circular references + if p.DisableExpansion { + prev, ok = p.Get(key) + p.m[key] = value + if !ok { + p.k = append(p.k, key) + } + return prev, ok, nil + } + + // to check for a circular reference we temporarily need + // to set the new value. If there is an error then revert + // to the previous state. Only if all tests are successful + // then we add the key to the p.k list. + prev, ok = p.Get(key) + p.m[key] = value + + // now check for a circular reference + _, err = p.expand(key, value) + if err != nil { + + // revert to the previous state + if ok { + p.m[key] = prev + } else { + delete(p.m, key) + } + + return "", false, err + } + + if !ok { + p.k = append(p.k, key) + } + + return prev, ok, nil +} + +// SetValue sets property key to the default string value +// as defined by fmt.Sprintf("%v"). +func (p *Properties) SetValue(key string, value interface{}) error { + _, _, err := p.Set(key, fmt.Sprintf("%v", value)) + return err +} + +// MustSet sets the property key to the corresponding value. +// If a value for key existed before then ok is true and prev +// contains the previous value. An empty key is silently ignored. +func (p *Properties) MustSet(key, value string) (prev string, ok bool) { + prev, ok, err := p.Set(key, value) + if err != nil { + ErrorHandler(err) + } + return prev, ok +} + +// String returns a string of all expanded 'key = value' pairs. +func (p *Properties) String() string { + var s string + for _, key := range p.k { + value, _ := p.Get(key) + s = fmt.Sprintf("%s%s = %s\n", s, key, value) + } + return s +} + +// Write writes all unexpanded 'key = value' pairs to the given writer. +// Write returns the number of bytes written and any write error encountered. +func (p *Properties) Write(w io.Writer, enc Encoding) (n int, err error) { + return p.WriteComment(w, "", enc) +} + +// WriteComment writes all unexpanced 'key = value' pairs to the given writer. +// If prefix is not empty then comments are written with a blank line and the +// given prefix. The prefix should be either "# " or "! " to be compatible with +// the properties file format. Otherwise, the properties parser will not be +// able to read the file back in. It returns the number of bytes written and +// any write error encountered. +func (p *Properties) WriteComment(w io.Writer, prefix string, enc Encoding) (n int, err error) { + var x int + + for _, key := range p.k { + value := p.m[key] + + if prefix != "" { + if comments, ok := p.c[key]; ok { + // don't print comments if they are all empty + allEmpty := true + for _, c := range comments { + if c != "" { + allEmpty = false + break + } + } + + if !allEmpty { + // add a blank line between entries but not at the top + if len(comments) > 0 && n > 0 { + x, err = fmt.Fprintln(w) + if err != nil { + return + } + n += x + } + + for _, c := range comments { + x, err = fmt.Fprintf(w, "%s%s\n", prefix, encode(c, "", enc)) + if err != nil { + return + } + n += x + } + } + } + } + + x, err = fmt.Fprintf(w, "%s = %s\n", encode(key, " :", enc), encode(value, "", enc)) + if err != nil { + return + } + n += x + } + return +} + +// Map returns a copy of the properties as a map. +func (p *Properties) Map() map[string]string { + m := make(map[string]string) + for k, v := range p.m { + m[k] = v + } + return m +} + +// FilterFunc returns a copy of the properties which includes the values which passed all filters. +func (p *Properties) FilterFunc(filters ...func(k, v string) bool) *Properties { + pp := NewProperties() +outer: + for k, v := range p.m { + for _, f := range filters { + if !f(k, v) { + continue outer + } + pp.Set(k, v) + } + } + return pp +} + +// ---------------------------------------------------------------------------- + +// Delete removes the key and its comments. +func (p *Properties) Delete(key string) { + delete(p.m, key) + delete(p.c, key) + newKeys := []string{} + for _, k := range p.k { + if k != key { + newKeys = append(newKeys, k) + } + } + p.k = newKeys +} + +// Merge merges properties, comments and keys from other *Properties into p +func (p *Properties) Merge(other *Properties) { + for k, v := range other.m { + p.m[k] = v + } + for k, v := range other.c { + p.c[k] = v + } + +outer: + for _, otherKey := range other.k { + for _, key := range p.k { + if otherKey == key { + continue outer + } + } + p.k = append(p.k, otherKey) + } +} + +// ---------------------------------------------------------------------------- + +// check expands all values and returns an error if a circular reference or +// a malformed expression was found. +func (p *Properties) check() error { + for key, value := range p.m { + if _, err := p.expand(key, value); err != nil { + return err + } + } + return nil +} + +func (p *Properties) expand(key, input string) (string, error) { + // no pre/postfix -> nothing to expand + if p.Prefix == "" && p.Postfix == "" { + return input, nil + } + + return expand(input, []string{key}, p.Prefix, p.Postfix, p.m) +} + +// expand recursively expands expressions of '(prefix)key(postfix)' to their corresponding values. +// The function keeps track of the keys that were already expanded and stops if it +// detects a circular reference or a malformed expression of the form '(prefix)key'. +func expand(s string, keys []string, prefix, postfix string, values map[string]string) (string, error) { + if len(keys) > maxExpansionDepth { + return "", fmt.Errorf("expansion too deep") + } + + for { + start := strings.Index(s, prefix) + if start == -1 { + return s, nil + } + + keyStart := start + len(prefix) + keyLen := strings.Index(s[keyStart:], postfix) + if keyLen == -1 { + return "", fmt.Errorf("malformed expression") + } + + end := keyStart + keyLen + len(postfix) - 1 + key := s[keyStart : keyStart+keyLen] + + // fmt.Printf("s:%q pp:%q start:%d end:%d keyStart:%d keyLen:%d key:%q\n", s, prefix + "..." + postfix, start, end, keyStart, keyLen, key) + + for _, k := range keys { + if key == k { + return "", fmt.Errorf("circular reference") + } + } + + val, ok := values[key] + if !ok { + val = os.Getenv(key) + } + new_val, err := expand(val, append(keys, key), prefix, postfix, values) + if err != nil { + return "", err + } + s = s[:start] + new_val + s[end+1:] + } + return s, nil +} + +// encode encodes a UTF-8 string to ISO-8859-1 and escapes some characters. +func encode(s string, special string, enc Encoding) string { + switch enc { + case UTF8: + return encodeUtf8(s, special) + case ISO_8859_1: + return encodeIso(s, special) + default: + panic(fmt.Sprintf("unsupported encoding %v", enc)) + } +} + +func encodeUtf8(s string, special string) string { + v := "" + for pos := 0; pos < len(s); { + r, w := utf8.DecodeRuneInString(s[pos:]) + pos += w + v += escape(r, special) + } + return v +} + +func encodeIso(s string, special string) string { + var r rune + var w int + var v string + for pos := 0; pos < len(s); { + switch r, w = utf8.DecodeRuneInString(s[pos:]); { + case r < 1<<8: // single byte rune -> escape special chars only + v += escape(r, special) + case r < 1<<16: // two byte rune -> unicode literal + v += fmt.Sprintf("\\u%04x", r) + default: // more than two bytes per rune -> can't encode + v += "?" + } + pos += w + } + return v +} + +func escape(r rune, special string) string { + switch r { + case '\f': + return "\\f" + case '\n': + return "\\n" + case '\r': + return "\\r" + case '\t': + return "\\t" + default: + if strings.ContainsRune(special, r) { + return "\\" + string(r) + } + return string(r) + } +} + +func invalidKeyError(key string) error { + return fmt.Errorf("unknown property: %s", key) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/magiconair/properties/rangecheck.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/magiconair/properties/rangecheck.go new file mode 100644 index 00000000..b013a2e5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/magiconair/properties/rangecheck.go @@ -0,0 +1,31 @@ +// Copyright 2018 Frank Schroeder. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package properties + +import ( + "fmt" + "math" +) + +// make this a var to overwrite it in a test +var is32Bit = ^uint(0) == math.MaxUint32 + +// intRangeCheck checks if the value fits into the int type and +// panics if it does not. +func intRangeCheck(key string, v int64) int { + if is32Bit && (v < math.MinInt32 || v > math.MaxInt32) { + panic(fmt.Sprintf("Value %d for key %s out of range", v, key)) + } + return int(v) +} + +// uintRangeCheck checks if the value fits into the uint type and +// panics if it does not. +func uintRangeCheck(key string, v uint64) uint { + if is32Bit && v > math.MaxUint32 { + panic(fmt.Sprintf("Value %d for key %s out of range", v, key)) + } + return uint(v) +} diff --git a/vendor/github.com/mattn/go-colorable/.travis.yml b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mattn/go-colorable/.travis.yml similarity index 100% rename from vendor/github.com/mattn/go-colorable/.travis.yml rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mattn/go-colorable/.travis.yml diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mattn/go-colorable/LICENSE b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mattn/go-colorable/LICENSE new file mode 100644 index 00000000..91b5cef3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mattn/go-colorable/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 Yasuhiro Matsumoto + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/mattn/go-colorable/README.md b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mattn/go-colorable/README.md similarity index 100% rename from vendor/github.com/mattn/go-colorable/README.md rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mattn/go-colorable/README.md diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mattn/go-colorable/colorable_appengine.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mattn/go-colorable/colorable_appengine.go new file mode 100644 index 00000000..1f28d773 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mattn/go-colorable/colorable_appengine.go @@ -0,0 +1,29 @@ +// +build appengine + +package colorable + +import ( + "io" + "os" + + _ "github.com/mattn/go-isatty" +) + +// NewColorable return new instance of Writer which handle escape sequence. +func NewColorable(file *os.File) io.Writer { + if file == nil { + panic("nil passed instead of *os.File to NewColorable()") + } + + return file +} + +// NewColorableStdout return new instance of Writer which handle escape sequence for stdout. +func NewColorableStdout() io.Writer { + return os.Stdout +} + +// NewColorableStderr return new instance of Writer which handle escape sequence for stderr. +func NewColorableStderr() io.Writer { + return os.Stderr +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mattn/go-colorable/colorable_others.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mattn/go-colorable/colorable_others.go new file mode 100644 index 00000000..887f203d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mattn/go-colorable/colorable_others.go @@ -0,0 +1,30 @@ +// +build !windows +// +build !appengine + +package colorable + +import ( + "io" + "os" + + _ "github.com/mattn/go-isatty" +) + +// NewColorable return new instance of Writer which handle escape sequence. +func NewColorable(file *os.File) io.Writer { + if file == nil { + panic("nil passed instead of *os.File to NewColorable()") + } + + return file +} + +// NewColorableStdout return new instance of Writer which handle escape sequence for stdout. +func NewColorableStdout() io.Writer { + return os.Stdout +} + +// NewColorableStderr return new instance of Writer which handle escape sequence for stderr. +func NewColorableStderr() io.Writer { + return os.Stderr +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mattn/go-colorable/colorable_windows.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mattn/go-colorable/colorable_windows.go new file mode 100644 index 00000000..e17a5474 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mattn/go-colorable/colorable_windows.go @@ -0,0 +1,884 @@ +// +build windows +// +build !appengine + +package colorable + +import ( + "bytes" + "io" + "math" + "os" + "strconv" + "strings" + "syscall" + "unsafe" + + "github.com/mattn/go-isatty" +) + +const ( + foregroundBlue = 0x1 + foregroundGreen = 0x2 + foregroundRed = 0x4 + foregroundIntensity = 0x8 + foregroundMask = (foregroundRed | foregroundBlue | foregroundGreen | foregroundIntensity) + backgroundBlue = 0x10 + backgroundGreen = 0x20 + backgroundRed = 0x40 + backgroundIntensity = 0x80 + backgroundMask = (backgroundRed | backgroundBlue | backgroundGreen | backgroundIntensity) +) + +type wchar uint16 +type short int16 +type dword uint32 +type word uint16 + +type coord struct { + x short + y short +} + +type smallRect struct { + left short + top short + right short + bottom short +} + +type consoleScreenBufferInfo struct { + size coord + cursorPosition coord + attributes word + window smallRect + maximumWindowSize coord +} + +type consoleCursorInfo struct { + size dword + visible int32 +} + +var ( + kernel32 = syscall.NewLazyDLL("kernel32.dll") + procGetConsoleScreenBufferInfo = kernel32.NewProc("GetConsoleScreenBufferInfo") + procSetConsoleTextAttribute = kernel32.NewProc("SetConsoleTextAttribute") + procSetConsoleCursorPosition = kernel32.NewProc("SetConsoleCursorPosition") + procFillConsoleOutputCharacter = kernel32.NewProc("FillConsoleOutputCharacterW") + procFillConsoleOutputAttribute = kernel32.NewProc("FillConsoleOutputAttribute") + procGetConsoleCursorInfo = kernel32.NewProc("GetConsoleCursorInfo") + procSetConsoleCursorInfo = kernel32.NewProc("SetConsoleCursorInfo") + procSetConsoleTitle = kernel32.NewProc("SetConsoleTitleW") +) + +// Writer provide colorable Writer to the console +type Writer struct { + out io.Writer + handle syscall.Handle + oldattr word + oldpos coord +} + +// NewColorable return new instance of Writer which handle escape sequence from File. +func NewColorable(file *os.File) io.Writer { + if file == nil { + panic("nil passed instead of *os.File to NewColorable()") + } + + if isatty.IsTerminal(file.Fd()) { + var csbi consoleScreenBufferInfo + handle := syscall.Handle(file.Fd()) + procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) + return &Writer{out: file, handle: handle, oldattr: csbi.attributes, oldpos: coord{0, 0}} + } + return file +} + +// NewColorableStdout return new instance of Writer which handle escape sequence for stdout. +func NewColorableStdout() io.Writer { + return NewColorable(os.Stdout) +} + +// NewColorableStderr return new instance of Writer which handle escape sequence for stderr. +func NewColorableStderr() io.Writer { + return NewColorable(os.Stderr) +} + +var color256 = map[int]int{ + 0: 0x000000, + 1: 0x800000, + 2: 0x008000, + 3: 0x808000, + 4: 0x000080, + 5: 0x800080, + 6: 0x008080, + 7: 0xc0c0c0, + 8: 0x808080, + 9: 0xff0000, + 10: 0x00ff00, + 11: 0xffff00, + 12: 0x0000ff, + 13: 0xff00ff, + 14: 0x00ffff, + 15: 0xffffff, + 16: 0x000000, + 17: 0x00005f, + 18: 0x000087, + 19: 0x0000af, + 20: 0x0000d7, + 21: 0x0000ff, + 22: 0x005f00, + 23: 0x005f5f, + 24: 0x005f87, + 25: 0x005faf, + 26: 0x005fd7, + 27: 0x005fff, + 28: 0x008700, + 29: 0x00875f, + 30: 0x008787, + 31: 0x0087af, + 32: 0x0087d7, + 33: 0x0087ff, + 34: 0x00af00, + 35: 0x00af5f, + 36: 0x00af87, + 37: 0x00afaf, + 38: 0x00afd7, + 39: 0x00afff, + 40: 0x00d700, + 41: 0x00d75f, + 42: 0x00d787, + 43: 0x00d7af, + 44: 0x00d7d7, + 45: 0x00d7ff, + 46: 0x00ff00, + 47: 0x00ff5f, + 48: 0x00ff87, + 49: 0x00ffaf, + 50: 0x00ffd7, + 51: 0x00ffff, + 52: 0x5f0000, + 53: 0x5f005f, + 54: 0x5f0087, + 55: 0x5f00af, + 56: 0x5f00d7, + 57: 0x5f00ff, + 58: 0x5f5f00, + 59: 0x5f5f5f, + 60: 0x5f5f87, + 61: 0x5f5faf, + 62: 0x5f5fd7, + 63: 0x5f5fff, + 64: 0x5f8700, + 65: 0x5f875f, + 66: 0x5f8787, + 67: 0x5f87af, + 68: 0x5f87d7, + 69: 0x5f87ff, + 70: 0x5faf00, + 71: 0x5faf5f, + 72: 0x5faf87, + 73: 0x5fafaf, + 74: 0x5fafd7, + 75: 0x5fafff, + 76: 0x5fd700, + 77: 0x5fd75f, + 78: 0x5fd787, + 79: 0x5fd7af, + 80: 0x5fd7d7, + 81: 0x5fd7ff, + 82: 0x5fff00, + 83: 0x5fff5f, + 84: 0x5fff87, + 85: 0x5fffaf, + 86: 0x5fffd7, + 87: 0x5fffff, + 88: 0x870000, + 89: 0x87005f, + 90: 0x870087, + 91: 0x8700af, + 92: 0x8700d7, + 93: 0x8700ff, + 94: 0x875f00, + 95: 0x875f5f, + 96: 0x875f87, + 97: 0x875faf, + 98: 0x875fd7, + 99: 0x875fff, + 100: 0x878700, + 101: 0x87875f, + 102: 0x878787, + 103: 0x8787af, + 104: 0x8787d7, + 105: 0x8787ff, + 106: 0x87af00, + 107: 0x87af5f, + 108: 0x87af87, + 109: 0x87afaf, + 110: 0x87afd7, + 111: 0x87afff, + 112: 0x87d700, + 113: 0x87d75f, + 114: 0x87d787, + 115: 0x87d7af, + 116: 0x87d7d7, + 117: 0x87d7ff, + 118: 0x87ff00, + 119: 0x87ff5f, + 120: 0x87ff87, + 121: 0x87ffaf, + 122: 0x87ffd7, + 123: 0x87ffff, + 124: 0xaf0000, + 125: 0xaf005f, + 126: 0xaf0087, + 127: 0xaf00af, + 128: 0xaf00d7, + 129: 0xaf00ff, + 130: 0xaf5f00, + 131: 0xaf5f5f, + 132: 0xaf5f87, + 133: 0xaf5faf, + 134: 0xaf5fd7, + 135: 0xaf5fff, + 136: 0xaf8700, + 137: 0xaf875f, + 138: 0xaf8787, + 139: 0xaf87af, + 140: 0xaf87d7, + 141: 0xaf87ff, + 142: 0xafaf00, + 143: 0xafaf5f, + 144: 0xafaf87, + 145: 0xafafaf, + 146: 0xafafd7, + 147: 0xafafff, + 148: 0xafd700, + 149: 0xafd75f, + 150: 0xafd787, + 151: 0xafd7af, + 152: 0xafd7d7, + 153: 0xafd7ff, + 154: 0xafff00, + 155: 0xafff5f, + 156: 0xafff87, + 157: 0xafffaf, + 158: 0xafffd7, + 159: 0xafffff, + 160: 0xd70000, + 161: 0xd7005f, + 162: 0xd70087, + 163: 0xd700af, + 164: 0xd700d7, + 165: 0xd700ff, + 166: 0xd75f00, + 167: 0xd75f5f, + 168: 0xd75f87, + 169: 0xd75faf, + 170: 0xd75fd7, + 171: 0xd75fff, + 172: 0xd78700, + 173: 0xd7875f, + 174: 0xd78787, + 175: 0xd787af, + 176: 0xd787d7, + 177: 0xd787ff, + 178: 0xd7af00, + 179: 0xd7af5f, + 180: 0xd7af87, + 181: 0xd7afaf, + 182: 0xd7afd7, + 183: 0xd7afff, + 184: 0xd7d700, + 185: 0xd7d75f, + 186: 0xd7d787, + 187: 0xd7d7af, + 188: 0xd7d7d7, + 189: 0xd7d7ff, + 190: 0xd7ff00, + 191: 0xd7ff5f, + 192: 0xd7ff87, + 193: 0xd7ffaf, + 194: 0xd7ffd7, + 195: 0xd7ffff, + 196: 0xff0000, + 197: 0xff005f, + 198: 0xff0087, + 199: 0xff00af, + 200: 0xff00d7, + 201: 0xff00ff, + 202: 0xff5f00, + 203: 0xff5f5f, + 204: 0xff5f87, + 205: 0xff5faf, + 206: 0xff5fd7, + 207: 0xff5fff, + 208: 0xff8700, + 209: 0xff875f, + 210: 0xff8787, + 211: 0xff87af, + 212: 0xff87d7, + 213: 0xff87ff, + 214: 0xffaf00, + 215: 0xffaf5f, + 216: 0xffaf87, + 217: 0xffafaf, + 218: 0xffafd7, + 219: 0xffafff, + 220: 0xffd700, + 221: 0xffd75f, + 222: 0xffd787, + 223: 0xffd7af, + 224: 0xffd7d7, + 225: 0xffd7ff, + 226: 0xffff00, + 227: 0xffff5f, + 228: 0xffff87, + 229: 0xffffaf, + 230: 0xffffd7, + 231: 0xffffff, + 232: 0x080808, + 233: 0x121212, + 234: 0x1c1c1c, + 235: 0x262626, + 236: 0x303030, + 237: 0x3a3a3a, + 238: 0x444444, + 239: 0x4e4e4e, + 240: 0x585858, + 241: 0x626262, + 242: 0x6c6c6c, + 243: 0x767676, + 244: 0x808080, + 245: 0x8a8a8a, + 246: 0x949494, + 247: 0x9e9e9e, + 248: 0xa8a8a8, + 249: 0xb2b2b2, + 250: 0xbcbcbc, + 251: 0xc6c6c6, + 252: 0xd0d0d0, + 253: 0xdadada, + 254: 0xe4e4e4, + 255: 0xeeeeee, +} + +// `\033]0;TITLESTR\007` +func doTitleSequence(er *bytes.Reader) error { + var c byte + var err error + + c, err = er.ReadByte() + if err != nil { + return err + } + if c != '0' && c != '2' { + return nil + } + c, err = er.ReadByte() + if err != nil { + return err + } + if c != ';' { + return nil + } + title := make([]byte, 0, 80) + for { + c, err = er.ReadByte() + if err != nil { + return err + } + if c == 0x07 || c == '\n' { + break + } + title = append(title, c) + } + if len(title) > 0 { + title8, err := syscall.UTF16PtrFromString(string(title)) + if err == nil { + procSetConsoleTitle.Call(uintptr(unsafe.Pointer(title8))) + } + } + return nil +} + +// Write write data on console +func (w *Writer) Write(data []byte) (n int, err error) { + var csbi consoleScreenBufferInfo + procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) + + er := bytes.NewReader(data) + var bw [1]byte +loop: + for { + c1, err := er.ReadByte() + if err != nil { + break loop + } + if c1 != 0x1b { + bw[0] = c1 + w.out.Write(bw[:]) + continue + } + c2, err := er.ReadByte() + if err != nil { + break loop + } + + if c2 == ']' { + if err := doTitleSequence(er); err != nil { + break loop + } + continue + } + if c2 != 0x5b { + continue + } + + var buf bytes.Buffer + var m byte + for { + c, err := er.ReadByte() + if err != nil { + break loop + } + if ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || c == '@' { + m = c + break + } + buf.Write([]byte(string(c))) + } + + switch m { + case 'A': + n, err = strconv.Atoi(buf.String()) + if err != nil { + continue + } + procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) + csbi.cursorPosition.y -= short(n) + procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) + case 'B': + n, err = strconv.Atoi(buf.String()) + if err != nil { + continue + } + procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) + csbi.cursorPosition.y += short(n) + procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) + case 'C': + n, err = strconv.Atoi(buf.String()) + if err != nil { + continue + } + procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) + csbi.cursorPosition.x += short(n) + procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) + case 'D': + n, err = strconv.Atoi(buf.String()) + if err != nil { + continue + } + procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) + csbi.cursorPosition.x -= short(n) + procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) + case 'E': + n, err = strconv.Atoi(buf.String()) + if err != nil { + continue + } + procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) + csbi.cursorPosition.x = 0 + csbi.cursorPosition.y += short(n) + procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) + case 'F': + n, err = strconv.Atoi(buf.String()) + if err != nil { + continue + } + procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) + csbi.cursorPosition.x = 0 + csbi.cursorPosition.y -= short(n) + procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) + case 'G': + n, err = strconv.Atoi(buf.String()) + if err != nil { + continue + } + procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) + csbi.cursorPosition.x = short(n - 1) + procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) + case 'H', 'f': + procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) + if buf.Len() > 0 { + token := strings.Split(buf.String(), ";") + switch len(token) { + case 1: + n1, err := strconv.Atoi(token[0]) + if err != nil { + continue + } + csbi.cursorPosition.y = short(n1 - 1) + case 2: + n1, err := strconv.Atoi(token[0]) + if err != nil { + continue + } + n2, err := strconv.Atoi(token[1]) + if err != nil { + continue + } + csbi.cursorPosition.x = short(n2 - 1) + csbi.cursorPosition.y = short(n1 - 1) + } + } else { + csbi.cursorPosition.y = 0 + } + procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) + case 'J': + n := 0 + if buf.Len() > 0 { + n, err = strconv.Atoi(buf.String()) + if err != nil { + continue + } + } + var count, written dword + var cursor coord + procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) + switch n { + case 0: + cursor = coord{x: csbi.cursorPosition.x, y: csbi.cursorPosition.y} + count = dword(csbi.size.x - csbi.cursorPosition.x + (csbi.size.y-csbi.cursorPosition.y)*csbi.size.x) + case 1: + cursor = coord{x: csbi.window.left, y: csbi.window.top} + count = dword(csbi.size.x - csbi.cursorPosition.x + (csbi.window.top-csbi.cursorPosition.y)*csbi.size.x) + case 2: + cursor = coord{x: csbi.window.left, y: csbi.window.top} + count = dword(csbi.size.x - csbi.cursorPosition.x + (csbi.size.y-csbi.cursorPosition.y)*csbi.size.x) + } + procFillConsoleOutputCharacter.Call(uintptr(w.handle), uintptr(' '), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written))) + procFillConsoleOutputAttribute.Call(uintptr(w.handle), uintptr(csbi.attributes), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written))) + case 'K': + n := 0 + if buf.Len() > 0 { + n, err = strconv.Atoi(buf.String()) + if err != nil { + continue + } + } + procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) + var cursor coord + var count, written dword + switch n { + case 0: + cursor = coord{x: csbi.cursorPosition.x + 1, y: csbi.cursorPosition.y} + count = dword(csbi.size.x - csbi.cursorPosition.x - 1) + case 1: + cursor = coord{x: csbi.window.left, y: csbi.window.top + csbi.cursorPosition.y} + count = dword(csbi.size.x - csbi.cursorPosition.x) + case 2: + cursor = coord{x: csbi.window.left, y: csbi.window.top + csbi.cursorPosition.y} + count = dword(csbi.size.x) + } + procFillConsoleOutputCharacter.Call(uintptr(w.handle), uintptr(' '), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written))) + procFillConsoleOutputAttribute.Call(uintptr(w.handle), uintptr(csbi.attributes), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written))) + case 'm': + procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) + attr := csbi.attributes + cs := buf.String() + if cs == "" { + procSetConsoleTextAttribute.Call(uintptr(w.handle), uintptr(w.oldattr)) + continue + } + token := strings.Split(cs, ";") + for i := 0; i < len(token); i++ { + ns := token[i] + if n, err = strconv.Atoi(ns); err == nil { + switch { + case n == 0 || n == 100: + attr = w.oldattr + case 1 <= n && n <= 5: + attr |= foregroundIntensity + case n == 7: + attr = ((attr & foregroundMask) << 4) | ((attr & backgroundMask) >> 4) + case n == 22 || n == 25: + attr |= foregroundIntensity + case n == 27: + attr = ((attr & foregroundMask) << 4) | ((attr & backgroundMask) >> 4) + case 30 <= n && n <= 37: + attr &= backgroundMask + if (n-30)&1 != 0 { + attr |= foregroundRed + } + if (n-30)&2 != 0 { + attr |= foregroundGreen + } + if (n-30)&4 != 0 { + attr |= foregroundBlue + } + case n == 38: // set foreground color. + if i < len(token)-2 && (token[i+1] == "5" || token[i+1] == "05") { + if n256, err := strconv.Atoi(token[i+2]); err == nil { + if n256foreAttr == nil { + n256setup() + } + attr &= backgroundMask + attr |= n256foreAttr[n256] + i += 2 + } + } else { + attr = attr & (w.oldattr & backgroundMask) + } + case n == 39: // reset foreground color. + attr &= backgroundMask + attr |= w.oldattr & foregroundMask + case 40 <= n && n <= 47: + attr &= foregroundMask + if (n-40)&1 != 0 { + attr |= backgroundRed + } + if (n-40)&2 != 0 { + attr |= backgroundGreen + } + if (n-40)&4 != 0 { + attr |= backgroundBlue + } + case n == 48: // set background color. + if i < len(token)-2 && token[i+1] == "5" { + if n256, err := strconv.Atoi(token[i+2]); err == nil { + if n256backAttr == nil { + n256setup() + } + attr &= foregroundMask + attr |= n256backAttr[n256] + i += 2 + } + } else { + attr = attr & (w.oldattr & foregroundMask) + } + case n == 49: // reset foreground color. + attr &= foregroundMask + attr |= w.oldattr & backgroundMask + case 90 <= n && n <= 97: + attr = (attr & backgroundMask) + attr |= foregroundIntensity + if (n-90)&1 != 0 { + attr |= foregroundRed + } + if (n-90)&2 != 0 { + attr |= foregroundGreen + } + if (n-90)&4 != 0 { + attr |= foregroundBlue + } + case 100 <= n && n <= 107: + attr = (attr & foregroundMask) + attr |= backgroundIntensity + if (n-100)&1 != 0 { + attr |= backgroundRed + } + if (n-100)&2 != 0 { + attr |= backgroundGreen + } + if (n-100)&4 != 0 { + attr |= backgroundBlue + } + } + procSetConsoleTextAttribute.Call(uintptr(w.handle), uintptr(attr)) + } + } + case 'h': + var ci consoleCursorInfo + cs := buf.String() + if cs == "5>" { + procGetConsoleCursorInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&ci))) + ci.visible = 0 + procSetConsoleCursorInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&ci))) + } else if cs == "?25" { + procGetConsoleCursorInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&ci))) + ci.visible = 1 + procSetConsoleCursorInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&ci))) + } + case 'l': + var ci consoleCursorInfo + cs := buf.String() + if cs == "5>" { + procGetConsoleCursorInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&ci))) + ci.visible = 1 + procSetConsoleCursorInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&ci))) + } else if cs == "?25" { + procGetConsoleCursorInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&ci))) + ci.visible = 0 + procSetConsoleCursorInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&ci))) + } + case 's': + procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) + w.oldpos = csbi.cursorPosition + case 'u': + procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&w.oldpos))) + } + } + + return len(data), nil +} + +type consoleColor struct { + rgb int + red bool + green bool + blue bool + intensity bool +} + +func (c consoleColor) foregroundAttr() (attr word) { + if c.red { + attr |= foregroundRed + } + if c.green { + attr |= foregroundGreen + } + if c.blue { + attr |= foregroundBlue + } + if c.intensity { + attr |= foregroundIntensity + } + return +} + +func (c consoleColor) backgroundAttr() (attr word) { + if c.red { + attr |= backgroundRed + } + if c.green { + attr |= backgroundGreen + } + if c.blue { + attr |= backgroundBlue + } + if c.intensity { + attr |= backgroundIntensity + } + return +} + +var color16 = []consoleColor{ + {0x000000, false, false, false, false}, + {0x000080, false, false, true, false}, + {0x008000, false, true, false, false}, + {0x008080, false, true, true, false}, + {0x800000, true, false, false, false}, + {0x800080, true, false, true, false}, + {0x808000, true, true, false, false}, + {0xc0c0c0, true, true, true, false}, + {0x808080, false, false, false, true}, + {0x0000ff, false, false, true, true}, + {0x00ff00, false, true, false, true}, + {0x00ffff, false, true, true, true}, + {0xff0000, true, false, false, true}, + {0xff00ff, true, false, true, true}, + {0xffff00, true, true, false, true}, + {0xffffff, true, true, true, true}, +} + +type hsv struct { + h, s, v float32 +} + +func (a hsv) dist(b hsv) float32 { + dh := a.h - b.h + switch { + case dh > 0.5: + dh = 1 - dh + case dh < -0.5: + dh = -1 - dh + } + ds := a.s - b.s + dv := a.v - b.v + return float32(math.Sqrt(float64(dh*dh + ds*ds + dv*dv))) +} + +func toHSV(rgb int) hsv { + r, g, b := float32((rgb&0xFF0000)>>16)/256.0, + float32((rgb&0x00FF00)>>8)/256.0, + float32(rgb&0x0000FF)/256.0 + min, max := minmax3f(r, g, b) + h := max - min + if h > 0 { + if max == r { + h = (g - b) / h + if h < 0 { + h += 6 + } + } else if max == g { + h = 2 + (b-r)/h + } else { + h = 4 + (r-g)/h + } + } + h /= 6.0 + s := max - min + if max != 0 { + s /= max + } + v := max + return hsv{h: h, s: s, v: v} +} + +type hsvTable []hsv + +func toHSVTable(rgbTable []consoleColor) hsvTable { + t := make(hsvTable, len(rgbTable)) + for i, c := range rgbTable { + t[i] = toHSV(c.rgb) + } + return t +} + +func (t hsvTable) find(rgb int) consoleColor { + hsv := toHSV(rgb) + n := 7 + l := float32(5.0) + for i, p := range t { + d := hsv.dist(p) + if d < l { + l, n = d, i + } + } + return color16[n] +} + +func minmax3f(a, b, c float32) (min, max float32) { + if a < b { + if b < c { + return a, c + } else if a < c { + return a, b + } else { + return c, b + } + } else { + if a < c { + return b, c + } else if b < c { + return b, a + } else { + return c, a + } + } +} + +var n256foreAttr []word +var n256backAttr []word + +func n256setup() { + n256foreAttr = make([]word, 256) + n256backAttr = make([]word, 256) + t := toHSVTable(color16) + for i, rgb := range color256 { + c := t.find(rgb) + n256foreAttr[i] = c.foregroundAttr() + n256backAttr[i] = c.backgroundAttr() + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mattn/go-colorable/noncolorable.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mattn/go-colorable/noncolorable.go new file mode 100644 index 00000000..9721e16f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mattn/go-colorable/noncolorable.go @@ -0,0 +1,55 @@ +package colorable + +import ( + "bytes" + "io" +) + +// NonColorable hold writer but remove escape sequence. +type NonColorable struct { + out io.Writer +} + +// NewNonColorable return new instance of Writer which remove escape sequence from Writer. +func NewNonColorable(w io.Writer) io.Writer { + return &NonColorable{out: w} +} + +// Write write data on console +func (w *NonColorable) Write(data []byte) (n int, err error) { + er := bytes.NewReader(data) + var bw [1]byte +loop: + for { + c1, err := er.ReadByte() + if err != nil { + break loop + } + if c1 != 0x1b { + bw[0] = c1 + w.out.Write(bw[:]) + continue + } + c2, err := er.ReadByte() + if err != nil { + break loop + } + if c2 != 0x5b { + continue + } + + var buf bytes.Buffer + for { + c, err := er.ReadByte() + if err != nil { + break loop + } + if ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || c == '@' { + break + } + buf.Write([]byte(string(c))) + } + } + + return len(data), nil +} diff --git a/vendor/github.com/mattn/go-isatty/.travis.yml b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mattn/go-isatty/.travis.yml similarity index 100% rename from vendor/github.com/mattn/go-isatty/.travis.yml rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mattn/go-isatty/.travis.yml diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mattn/go-isatty/LICENSE b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mattn/go-isatty/LICENSE new file mode 100644 index 00000000..65dc692b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mattn/go-isatty/LICENSE @@ -0,0 +1,9 @@ +Copyright (c) Yasuhiro MATSUMOTO + +MIT License (Expat) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/mattn/go-isatty/README.md b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mattn/go-isatty/README.md similarity index 100% rename from vendor/github.com/mattn/go-isatty/README.md rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mattn/go-isatty/README.md diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mattn/go-isatty/doc.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mattn/go-isatty/doc.go new file mode 100644 index 00000000..17d4f90e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mattn/go-isatty/doc.go @@ -0,0 +1,2 @@ +// Package isatty implements interface to isatty +package isatty diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mattn/go-isatty/isatty_appengine.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mattn/go-isatty/isatty_appengine.go new file mode 100644 index 00000000..9584a988 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mattn/go-isatty/isatty_appengine.go @@ -0,0 +1,15 @@ +// +build appengine + +package isatty + +// IsTerminal returns true if the file descriptor is terminal which +// is always false on on appengine classic which is a sandboxed PaaS. +func IsTerminal(fd uintptr) bool { + return false +} + +// IsCygwinTerminal() return true if the file descriptor is a cygwin or msys2 +// terminal. This is also always false on this environment. +func IsCygwinTerminal(fd uintptr) bool { + return false +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mattn/go-isatty/isatty_bsd.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mattn/go-isatty/isatty_bsd.go new file mode 100644 index 00000000..42f2514d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mattn/go-isatty/isatty_bsd.go @@ -0,0 +1,18 @@ +// +build darwin freebsd openbsd netbsd dragonfly +// +build !appengine + +package isatty + +import ( + "syscall" + "unsafe" +) + +const ioctlReadTermios = syscall.TIOCGETA + +// IsTerminal return true if the file descriptor is terminal. +func IsTerminal(fd uintptr) bool { + var termios syscall.Termios + _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, fd, ioctlReadTermios, uintptr(unsafe.Pointer(&termios)), 0, 0, 0) + return err == 0 +} diff --git a/vendor/github.com/mattn/go-isatty/isatty_android.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mattn/go-isatty/isatty_linux.go similarity index 62% rename from vendor/github.com/mattn/go-isatty/isatty_android.go rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mattn/go-isatty/isatty_linux.go index d3567cb5..7384cf99 100644 --- a/vendor/github.com/mattn/go-isatty/isatty_android.go +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mattn/go-isatty/isatty_linux.go @@ -1,4 +1,5 @@ -// +build android +// +build linux +// +build !appengine,!ppc64,!ppc64le package isatty @@ -15,9 +16,3 @@ func IsTerminal(fd uintptr) bool { _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, fd, ioctlReadTermios, uintptr(unsafe.Pointer(&termios)), 0, 0, 0) return err == 0 } - -// IsCygwinTerminal return true if the file descriptor is a cygwin or msys2 -// terminal. This is also always false on this environment. -func IsCygwinTerminal(fd uintptr) bool { - return false -} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mattn/go-isatty/isatty_linux_ppc64x.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mattn/go-isatty/isatty_linux_ppc64x.go new file mode 100644 index 00000000..44e5d213 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mattn/go-isatty/isatty_linux_ppc64x.go @@ -0,0 +1,19 @@ +// +build linux +// +build ppc64 ppc64le + +package isatty + +import ( + "unsafe" + + syscall "golang.org/x/sys/unix" +) + +const ioctlReadTermios = syscall.TCGETS + +// IsTerminal return true if the file descriptor is terminal. +func IsTerminal(fd uintptr) bool { + var termios syscall.Termios + _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, fd, ioctlReadTermios, uintptr(unsafe.Pointer(&termios)), 0, 0, 0) + return err == 0 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mattn/go-isatty/isatty_others.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mattn/go-isatty/isatty_others.go new file mode 100644 index 00000000..9d8b4a59 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mattn/go-isatty/isatty_others.go @@ -0,0 +1,10 @@ +// +build !windows +// +build !appengine + +package isatty + +// IsCygwinTerminal return true if the file descriptor is a cygwin or msys2 +// terminal. This is also always false on this environment. +func IsCygwinTerminal(fd uintptr) bool { + return false +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mattn/go-isatty/isatty_solaris.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mattn/go-isatty/isatty_solaris.go new file mode 100644 index 00000000..1f0c6bf5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mattn/go-isatty/isatty_solaris.go @@ -0,0 +1,16 @@ +// +build solaris +// +build !appengine + +package isatty + +import ( + "golang.org/x/sys/unix" +) + +// IsTerminal returns true if the given file descriptor is a terminal. +// see: http://src.illumos.org/source/xref/illumos-gate/usr/src/lib/libbc/libc/gen/common/isatty.c +func IsTerminal(fd uintptr) bool { + var termio unix.Termio + err := unix.IoctlSetTermio(int(fd), unix.TCGETA, &termio) + return err == nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mattn/go-isatty/isatty_windows.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mattn/go-isatty/isatty_windows.go new file mode 100644 index 00000000..af51cbca --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mattn/go-isatty/isatty_windows.go @@ -0,0 +1,94 @@ +// +build windows +// +build !appengine + +package isatty + +import ( + "strings" + "syscall" + "unicode/utf16" + "unsafe" +) + +const ( + fileNameInfo uintptr = 2 + fileTypePipe = 3 +) + +var ( + kernel32 = syscall.NewLazyDLL("kernel32.dll") + procGetConsoleMode = kernel32.NewProc("GetConsoleMode") + procGetFileInformationByHandleEx = kernel32.NewProc("GetFileInformationByHandleEx") + procGetFileType = kernel32.NewProc("GetFileType") +) + +func init() { + // Check if GetFileInformationByHandleEx is available. + if procGetFileInformationByHandleEx.Find() != nil { + procGetFileInformationByHandleEx = nil + } +} + +// IsTerminal return true if the file descriptor is terminal. +func IsTerminal(fd uintptr) bool { + var st uint32 + r, _, e := syscall.Syscall(procGetConsoleMode.Addr(), 2, fd, uintptr(unsafe.Pointer(&st)), 0) + return r != 0 && e == 0 +} + +// Check pipe name is used for cygwin/msys2 pty. +// Cygwin/MSYS2 PTY has a name like: +// \{cygwin,msys}-XXXXXXXXXXXXXXXX-ptyN-{from,to}-master +func isCygwinPipeName(name string) bool { + token := strings.Split(name, "-") + if len(token) < 5 { + return false + } + + if token[0] != `\msys` && token[0] != `\cygwin` { + return false + } + + if token[1] == "" { + return false + } + + if !strings.HasPrefix(token[2], "pty") { + return false + } + + if token[3] != `from` && token[3] != `to` { + return false + } + + if token[4] != "master" { + return false + } + + return true +} + +// IsCygwinTerminal() return true if the file descriptor is a cygwin or msys2 +// terminal. +func IsCygwinTerminal(fd uintptr) bool { + if procGetFileInformationByHandleEx == nil { + return false + } + + // Cygwin/msys's pty is a pipe. + ft, _, e := syscall.Syscall(procGetFileType.Addr(), 1, fd, 0, 0) + if ft != fileTypePipe || e != 0 { + return false + } + + var buf [2 + syscall.MAX_PATH]uint16 + r, _, e := syscall.Syscall6(procGetFileInformationByHandleEx.Addr(), + 4, fd, fileNameInfo, uintptr(unsafe.Pointer(&buf)), + uintptr(len(buf)*2), 0, 0) + if r == 0 || e != 0 { + return false + } + + l := *(*uint32)(unsafe.Pointer(&buf)) + return isCygwinPipeName(string(utf16.Decode(buf[2 : 2+l/2]))) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/matttproud/golang_protobuf_extensions/LICENSE b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/matttproud/golang_protobuf_extensions/LICENSE new file mode 100644 index 00000000..8dada3ed --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/matttproud/golang_protobuf_extensions/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/matttproud/golang_protobuf_extensions/NOTICE b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/matttproud/golang_protobuf_extensions/NOTICE new file mode 100644 index 00000000..5d8cb5b7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/matttproud/golang_protobuf_extensions/NOTICE @@ -0,0 +1 @@ +Copyright 2012 Matt T. Proud (matt.proud@gmail.com) diff --git a/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/.gitignore b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/.gitignore similarity index 100% rename from vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/.gitignore rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/.gitignore diff --git a/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/Makefile b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/Makefile similarity index 100% rename from vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/Makefile rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/Makefile diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/decode.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/decode.go new file mode 100644 index 00000000..258c0636 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/decode.go @@ -0,0 +1,75 @@ +// Copyright 2013 Matt T. Proud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package pbutil + +import ( + "encoding/binary" + "errors" + "io" + + "github.com/golang/protobuf/proto" +) + +var errInvalidVarint = errors.New("invalid varint32 encountered") + +// ReadDelimited decodes a message from the provided length-delimited stream, +// where the length is encoded as 32-bit varint prefix to the message body. +// It returns the total number of bytes read and any applicable error. This is +// roughly equivalent to the companion Java API's +// MessageLite#parseDelimitedFrom. As per the reader contract, this function +// calls r.Read repeatedly as required until exactly one message including its +// prefix is read and decoded (or an error has occurred). The function never +// reads more bytes from the stream than required. The function never returns +// an error if a message has been read and decoded correctly, even if the end +// of the stream has been reached in doing so. In that case, any subsequent +// calls return (0, io.EOF). +func ReadDelimited(r io.Reader, m proto.Message) (n int, err error) { + // Per AbstractParser#parsePartialDelimitedFrom with + // CodedInputStream#readRawVarint32. + var headerBuf [binary.MaxVarintLen32]byte + var bytesRead, varIntBytes int + var messageLength uint64 + for varIntBytes == 0 { // i.e. no varint has been decoded yet. + if bytesRead >= len(headerBuf) { + return bytesRead, errInvalidVarint + } + // We have to read byte by byte here to avoid reading more bytes + // than required. Each read byte is appended to what we have + // read before. + newBytesRead, err := r.Read(headerBuf[bytesRead : bytesRead+1]) + if newBytesRead == 0 { + if err != nil { + return bytesRead, err + } + // A Reader should not return (0, nil), but if it does, + // it should be treated as no-op (according to the + // Reader contract). So let's go on... + continue + } + bytesRead += newBytesRead + // Now present everything read so far to the varint decoder and + // see if a varint can be decoded already. + messageLength, varIntBytes = proto.DecodeVarint(headerBuf[:bytesRead]) + } + + messageBuf := make([]byte, messageLength) + newBytesRead, err := io.ReadFull(r, messageBuf) + bytesRead += newBytesRead + if err != nil { + return bytesRead, err + } + + return bytesRead, proto.Unmarshal(messageBuf, m) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/doc.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/doc.go new file mode 100644 index 00000000..c318385c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/doc.go @@ -0,0 +1,16 @@ +// Copyright 2013 Matt T. Proud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package pbutil provides record length-delimited Protocol Buffer streaming. +package pbutil diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/encode.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/encode.go new file mode 100644 index 00000000..8fb59ad2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/encode.go @@ -0,0 +1,46 @@ +// Copyright 2013 Matt T. Proud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package pbutil + +import ( + "encoding/binary" + "io" + + "github.com/golang/protobuf/proto" +) + +// WriteDelimited encodes and dumps a message to the provided writer prefixed +// with a 32-bit varint indicating the length of the encoded message, producing +// a length-delimited record stream, which can be used to chain together +// encoded messages of the same type together in a file. It returns the total +// number of bytes written and any applicable error. This is roughly +// equivalent to the companion Java API's MessageLite#writeDelimitedTo. +func WriteDelimited(w io.Writer, m proto.Message) (n int, err error) { + buffer, err := proto.Marshal(m) + if err != nil { + return 0, err + } + + var buf [binary.MaxVarintLen32]byte + encodedLength := binary.PutUvarint(buf[:], uint64(len(buffer))) + + sync, err := w.Write(buf[:encodedLength]) + if err != nil { + return sync, err + } + + n, err = w.Write(buffer) + return n + sync, err +} diff --git a/vendor/github.com/mgutz/ansi/.gitignore b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mgutz/ansi/.gitignore similarity index 100% rename from vendor/github.com/mgutz/ansi/.gitignore rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mgutz/ansi/.gitignore diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mgutz/ansi/LICENSE b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mgutz/ansi/LICENSE new file mode 100644 index 00000000..06ce0c3b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mgutz/ansi/LICENSE @@ -0,0 +1,9 @@ +The MIT License (MIT) +Copyright (c) 2013 Mario L. Gutierrez + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + diff --git a/vendor/github.com/mgutz/ansi/README.md b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mgutz/ansi/README.md similarity index 100% rename from vendor/github.com/mgutz/ansi/README.md rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mgutz/ansi/README.md diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mgutz/ansi/ansi.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mgutz/ansi/ansi.go new file mode 100644 index 00000000..dc041364 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mgutz/ansi/ansi.go @@ -0,0 +1,285 @@ +package ansi + +import ( + "bytes" + "fmt" + "strconv" + "strings" +) + +const ( + black = iota + red + green + yellow + blue + magenta + cyan + white + defaultt = 9 + + normalIntensityFG = 30 + highIntensityFG = 90 + normalIntensityBG = 40 + highIntensityBG = 100 + + start = "\033[" + bold = "1;" + blink = "5;" + underline = "4;" + inverse = "7;" + strikethrough = "9;" + + // Reset is the ANSI reset escape sequence + Reset = "\033[0m" + // DefaultBG is the default background + DefaultBG = "\033[49m" + // DefaultFG is the default foreground + DefaultFG = "\033[39m" +) + +// Black FG +var Black string + +// Red FG +var Red string + +// Green FG +var Green string + +// Yellow FG +var Yellow string + +// Blue FG +var Blue string + +// Magenta FG +var Magenta string + +// Cyan FG +var Cyan string + +// White FG +var White string + +// LightBlack FG +var LightBlack string + +// LightRed FG +var LightRed string + +// LightGreen FG +var LightGreen string + +// LightYellow FG +var LightYellow string + +// LightBlue FG +var LightBlue string + +// LightMagenta FG +var LightMagenta string + +// LightCyan FG +var LightCyan string + +// LightWhite FG +var LightWhite string + +var ( + plain = false + // Colors maps common color names to their ANSI color code. + Colors = map[string]int{ + "black": black, + "red": red, + "green": green, + "yellow": yellow, + "blue": blue, + "magenta": magenta, + "cyan": cyan, + "white": white, + "default": defaultt, + } +) + +func init() { + for i := 0; i < 256; i++ { + Colors[strconv.Itoa(i)] = i + } + + Black = ColorCode("black") + Red = ColorCode("red") + Green = ColorCode("green") + Yellow = ColorCode("yellow") + Blue = ColorCode("blue") + Magenta = ColorCode("magenta") + Cyan = ColorCode("cyan") + White = ColorCode("white") + LightBlack = ColorCode("black+h") + LightRed = ColorCode("red+h") + LightGreen = ColorCode("green+h") + LightYellow = ColorCode("yellow+h") + LightBlue = ColorCode("blue+h") + LightMagenta = ColorCode("magenta+h") + LightCyan = ColorCode("cyan+h") + LightWhite = ColorCode("white+h") +} + +// ColorCode returns the ANSI color color code for style. +func ColorCode(style string) string { + return colorCode(style).String() +} + +// Gets the ANSI color code for a style. +func colorCode(style string) *bytes.Buffer { + buf := bytes.NewBufferString("") + if plain || style == "" { + return buf + } + if style == "reset" { + buf.WriteString(Reset) + return buf + } else if style == "off" { + return buf + } + + foregroundBackground := strings.Split(style, ":") + foreground := strings.Split(foregroundBackground[0], "+") + fgKey := foreground[0] + fg := Colors[fgKey] + fgStyle := "" + if len(foreground) > 1 { + fgStyle = foreground[1] + } + + bg, bgStyle := "", "" + + if len(foregroundBackground) > 1 { + background := strings.Split(foregroundBackground[1], "+") + bg = background[0] + if len(background) > 1 { + bgStyle = background[1] + } + } + + buf.WriteString(start) + base := normalIntensityFG + if len(fgStyle) > 0 { + if strings.Contains(fgStyle, "b") { + buf.WriteString(bold) + } + if strings.Contains(fgStyle, "B") { + buf.WriteString(blink) + } + if strings.Contains(fgStyle, "u") { + buf.WriteString(underline) + } + if strings.Contains(fgStyle, "i") { + buf.WriteString(inverse) + } + if strings.Contains(fgStyle, "s") { + buf.WriteString(strikethrough) + } + if strings.Contains(fgStyle, "h") { + base = highIntensityFG + } + } + + // if 256-color + n, err := strconv.Atoi(fgKey) + if err == nil { + fmt.Fprintf(buf, "38;5;%d;", n) + } else { + fmt.Fprintf(buf, "%d;", base+fg) + } + + base = normalIntensityBG + if len(bg) > 0 { + if strings.Contains(bgStyle, "h") { + base = highIntensityBG + } + // if 256-color + n, err := strconv.Atoi(bg) + if err == nil { + fmt.Fprintf(buf, "48;5;%d;", n) + } else { + fmt.Fprintf(buf, "%d;", base+Colors[bg]) + } + } + + // remove last ";" + buf.Truncate(buf.Len() - 1) + buf.WriteRune('m') + return buf +} + +// Color colors a string based on the ANSI color code for style. +func Color(s, style string) string { + if plain || len(style) < 1 { + return s + } + buf := colorCode(style) + buf.WriteString(s) + buf.WriteString(Reset) + return buf.String() +} + +// ColorFunc creates a closure to avoid computation ANSI color code. +func ColorFunc(style string) func(string) string { + if style == "" { + return func(s string) string { + return s + } + } + color := ColorCode(style) + return func(s string) string { + if plain || s == "" { + return s + } + buf := bytes.NewBufferString(color) + buf.WriteString(s) + buf.WriteString(Reset) + result := buf.String() + return result + } +} + +// DisableColors disables ANSI color codes. The default is false (colors are on). +func DisableColors(disable bool) { + plain = disable + if plain { + Black = "" + Red = "" + Green = "" + Yellow = "" + Blue = "" + Magenta = "" + Cyan = "" + White = "" + LightBlack = "" + LightRed = "" + LightGreen = "" + LightYellow = "" + LightBlue = "" + LightMagenta = "" + LightCyan = "" + LightWhite = "" + } else { + Black = ColorCode("black") + Red = ColorCode("red") + Green = ColorCode("green") + Yellow = ColorCode("yellow") + Blue = ColorCode("blue") + Magenta = ColorCode("magenta") + Cyan = ColorCode("cyan") + White = ColorCode("white") + LightBlack = ColorCode("black+h") + LightRed = ColorCode("red+h") + LightGreen = ColorCode("green+h") + LightYellow = ColorCode("yellow+h") + LightBlue = ColorCode("blue+h") + LightMagenta = ColorCode("magenta+h") + LightCyan = ColorCode("cyan+h") + LightWhite = ColorCode("white+h") + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mgutz/ansi/doc.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mgutz/ansi/doc.go new file mode 100644 index 00000000..43c217e1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mgutz/ansi/doc.go @@ -0,0 +1,65 @@ +/* +Package ansi is a small, fast library to create ANSI colored strings and codes. + +Installation + + # this installs the color viewer and the package + go get -u github.com/mgutz/ansi/cmd/ansi-mgutz + +Example + + // colorize a string, SLOW + msg := ansi.Color("foo", "red+b:white") + + // create a closure to avoid recalculating ANSI code compilation + phosphorize := ansi.ColorFunc("green+h:black") + msg = phosphorize("Bring back the 80s!") + msg2 := phospohorize("Look, I'm a CRT!") + + // cache escape codes and build strings manually + lime := ansi.ColorCode("green+h:black") + reset := ansi.ColorCode("reset") + + fmt.Println(lime, "Bring back the 80s!", reset) + +Other examples + + Color(s, "red") // red + Color(s, "red+b") // red bold + Color(s, "red+B") // red blinking + Color(s, "red+u") // red underline + Color(s, "red+bh") // red bold bright + Color(s, "red:white") // red on white + Color(s, "red+b:white+h") // red bold on white bright + Color(s, "red+B:white+h") // red blink on white bright + +To view color combinations, from terminal + + ansi-mgutz + +Style format + + "foregroundColor+attributes:backgroundColor+attributes" + +Colors + + black + red + green + yellow + blue + magenta + cyan + white + +Attributes + + b = bold foreground + B = Blink foreground + u = underline foreground + h = high intensity (bright) foreground, background + i = inverse + +Wikipedia ANSI escape codes [Colors](http://en.wikipedia.org/wiki/ANSI_escape_code#Colors) +*/ +package ansi diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mgutz/ansi/print.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mgutz/ansi/print.go new file mode 100644 index 00000000..806f436b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mgutz/ansi/print.go @@ -0,0 +1,57 @@ +package ansi + +import ( + "fmt" + "sort" + + colorable "github.com/mattn/go-colorable" +) + +// PrintStyles prints all style combinations to the terminal. +func PrintStyles() { + // for compatibility with Windows, not needed for *nix + stdout := colorable.NewColorableStdout() + + bgColors := []string{ + "", + ":black", + ":red", + ":green", + ":yellow", + ":blue", + ":magenta", + ":cyan", + ":white", + } + + keys := make([]string, 0, len(Colors)) + for k := range Colors { + keys = append(keys, k) + } + + sort.Sort(sort.StringSlice(keys)) + + for _, fg := range keys { + for _, bg := range bgColors { + fmt.Fprintln(stdout, padColor(fg, []string{"" + bg, "+b" + bg, "+bh" + bg, "+u" + bg})) + fmt.Fprintln(stdout, padColor(fg, []string{"+s" + bg, "+i" + bg})) + fmt.Fprintln(stdout, padColor(fg, []string{"+uh" + bg, "+B" + bg, "+Bb" + bg /* backgrounds */, "" + bg + "+h"})) + fmt.Fprintln(stdout, padColor(fg, []string{"+b" + bg + "+h", "+bh" + bg + "+h", "+u" + bg + "+h", "+uh" + bg + "+h"})) + } + } +} + +func pad(s string, length int) string { + for len(s) < length { + s += " " + } + return s +} + +func padColor(color string, styles []string) string { + buffer := "" + for _, style := range styles { + buffer += Color(pad(color+style, 20), color+style) + } + return buffer +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mitchellh/mapstructure/.travis.yml b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mitchellh/mapstructure/.travis.yml new file mode 100644 index 00000000..1689c7d7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mitchellh/mapstructure/.travis.yml @@ -0,0 +1,8 @@ +language: go + +go: + - "1.11.x" + - tip + +script: + - go test diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mitchellh/mapstructure/CHANGELOG.md b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mitchellh/mapstructure/CHANGELOG.md new file mode 100644 index 00000000..3b3cb723 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mitchellh/mapstructure/CHANGELOG.md @@ -0,0 +1,21 @@ +## 1.1.2 + +* Fix error when decode hook decodes interface implementation into interface + type. [GH-140] + +## 1.1.1 + +* Fix panic that can happen in `decodePtr` + +## 1.1.0 + +* Added `StringToIPHookFunc` to convert `string` to `net.IP` and `net.IPNet` [GH-133] +* Support struct to struct decoding [GH-137] +* If source map value is nil, then destination map value is nil (instead of empty) +* If source slice value is nil, then destination slice value is nil (instead of empty) +* If source pointer is nil, then destination pointer is set to nil (instead of + allocated zero value of type) + +## 1.0.0 + +* Initial tagged stable release. diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mitchellh/mapstructure/LICENSE b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mitchellh/mapstructure/LICENSE new file mode 100644 index 00000000..f9c841a5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mitchellh/mapstructure/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2013 Mitchell Hashimoto + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mitchellh/mapstructure/README.md b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mitchellh/mapstructure/README.md new file mode 100644 index 00000000..0018dc7d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mitchellh/mapstructure/README.md @@ -0,0 +1,46 @@ +# mapstructure [![Godoc](https://godoc.org/github.com/mitchellh/mapstructure?status.svg)](https://godoc.org/github.com/mitchellh/mapstructure) + +mapstructure is a Go library for decoding generic map values to structures +and vice versa, while providing helpful error handling. + +This library is most useful when decoding values from some data stream (JSON, +Gob, etc.) where you don't _quite_ know the structure of the underlying data +until you read a part of it. You can therefore read a `map[string]interface{}` +and use this library to decode it into the proper underlying native Go +structure. + +## Installation + +Standard `go get`: + +``` +$ go get github.com/mitchellh/mapstructure +``` + +## Usage & Example + +For usage and examples see the [Godoc](http://godoc.org/github.com/mitchellh/mapstructure). + +The `Decode` function has examples associated with it there. + +## But Why?! + +Go offers fantastic standard libraries for decoding formats such as JSON. +The standard method is to have a struct pre-created, and populate that struct +from the bytes of the encoded format. This is great, but the problem is if +you have configuration or an encoding that changes slightly depending on +specific fields. For example, consider this JSON: + +```json +{ + "type": "person", + "name": "Mitchell" +} +``` + +Perhaps we can't populate a specific structure without first reading +the "type" field from the JSON. We could always do two passes over the +decoding of the JSON (reading the "type" first, and the rest later). +However, it is much simpler to just decode this into a `map[string]interface{}` +structure, read the "type" key, then use something like this library +to decode it into the proper structure. diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mitchellh/mapstructure/decode_hooks.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mitchellh/mapstructure/decode_hooks.go new file mode 100644 index 00000000..1f0abc65 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mitchellh/mapstructure/decode_hooks.go @@ -0,0 +1,217 @@ +package mapstructure + +import ( + "errors" + "fmt" + "net" + "reflect" + "strconv" + "strings" + "time" +) + +// typedDecodeHook takes a raw DecodeHookFunc (an interface{}) and turns +// it into the proper DecodeHookFunc type, such as DecodeHookFuncType. +func typedDecodeHook(h DecodeHookFunc) DecodeHookFunc { + // Create variables here so we can reference them with the reflect pkg + var f1 DecodeHookFuncType + var f2 DecodeHookFuncKind + + // Fill in the variables into this interface and the rest is done + // automatically using the reflect package. + potential := []interface{}{f1, f2} + + v := reflect.ValueOf(h) + vt := v.Type() + for _, raw := range potential { + pt := reflect.ValueOf(raw).Type() + if vt.ConvertibleTo(pt) { + return v.Convert(pt).Interface() + } + } + + return nil +} + +// DecodeHookExec executes the given decode hook. This should be used +// since it'll naturally degrade to the older backwards compatible DecodeHookFunc +// that took reflect.Kind instead of reflect.Type. +func DecodeHookExec( + raw DecodeHookFunc, + from reflect.Type, to reflect.Type, + data interface{}) (interface{}, error) { + switch f := typedDecodeHook(raw).(type) { + case DecodeHookFuncType: + return f(from, to, data) + case DecodeHookFuncKind: + return f(from.Kind(), to.Kind(), data) + default: + return nil, errors.New("invalid decode hook signature") + } +} + +// ComposeDecodeHookFunc creates a single DecodeHookFunc that +// automatically composes multiple DecodeHookFuncs. +// +// The composed funcs are called in order, with the result of the +// previous transformation. +func ComposeDecodeHookFunc(fs ...DecodeHookFunc) DecodeHookFunc { + return func( + f reflect.Type, + t reflect.Type, + data interface{}) (interface{}, error) { + var err error + for _, f1 := range fs { + data, err = DecodeHookExec(f1, f, t, data) + if err != nil { + return nil, err + } + + // Modify the from kind to be correct with the new data + f = nil + if val := reflect.ValueOf(data); val.IsValid() { + f = val.Type() + } + } + + return data, nil + } +} + +// StringToSliceHookFunc returns a DecodeHookFunc that converts +// string to []string by splitting on the given sep. +func StringToSliceHookFunc(sep string) DecodeHookFunc { + return func( + f reflect.Kind, + t reflect.Kind, + data interface{}) (interface{}, error) { + if f != reflect.String || t != reflect.Slice { + return data, nil + } + + raw := data.(string) + if raw == "" { + return []string{}, nil + } + + return strings.Split(raw, sep), nil + } +} + +// StringToTimeDurationHookFunc returns a DecodeHookFunc that converts +// strings to time.Duration. +func StringToTimeDurationHookFunc() DecodeHookFunc { + return func( + f reflect.Type, + t reflect.Type, + data interface{}) (interface{}, error) { + if f.Kind() != reflect.String { + return data, nil + } + if t != reflect.TypeOf(time.Duration(5)) { + return data, nil + } + + // Convert it by parsing + return time.ParseDuration(data.(string)) + } +} + +// StringToIPHookFunc returns a DecodeHookFunc that converts +// strings to net.IP +func StringToIPHookFunc() DecodeHookFunc { + return func( + f reflect.Type, + t reflect.Type, + data interface{}) (interface{}, error) { + if f.Kind() != reflect.String { + return data, nil + } + if t != reflect.TypeOf(net.IP{}) { + return data, nil + } + + // Convert it by parsing + ip := net.ParseIP(data.(string)) + if ip == nil { + return net.IP{}, fmt.Errorf("failed parsing ip %v", data) + } + + return ip, nil + } +} + +// StringToIPNetHookFunc returns a DecodeHookFunc that converts +// strings to net.IPNet +func StringToIPNetHookFunc() DecodeHookFunc { + return func( + f reflect.Type, + t reflect.Type, + data interface{}) (interface{}, error) { + if f.Kind() != reflect.String { + return data, nil + } + if t != reflect.TypeOf(net.IPNet{}) { + return data, nil + } + + // Convert it by parsing + _, net, err := net.ParseCIDR(data.(string)) + return net, err + } +} + +// StringToTimeHookFunc returns a DecodeHookFunc that converts +// strings to time.Time. +func StringToTimeHookFunc(layout string) DecodeHookFunc { + return func( + f reflect.Type, + t reflect.Type, + data interface{}) (interface{}, error) { + if f.Kind() != reflect.String { + return data, nil + } + if t != reflect.TypeOf(time.Time{}) { + return data, nil + } + + // Convert it by parsing + return time.Parse(layout, data.(string)) + } +} + +// WeaklyTypedHook is a DecodeHookFunc which adds support for weak typing to +// the decoder. +// +// Note that this is significantly different from the WeaklyTypedInput option +// of the DecoderConfig. +func WeaklyTypedHook( + f reflect.Kind, + t reflect.Kind, + data interface{}) (interface{}, error) { + dataVal := reflect.ValueOf(data) + switch t { + case reflect.String: + switch f { + case reflect.Bool: + if dataVal.Bool() { + return "1", nil + } + return "0", nil + case reflect.Float32: + return strconv.FormatFloat(dataVal.Float(), 'f', -1, 64), nil + case reflect.Int: + return strconv.FormatInt(dataVal.Int(), 10), nil + case reflect.Slice: + dataType := dataVal.Type() + elemKind := dataType.Elem().Kind() + if elemKind == reflect.Uint8 { + return string(dataVal.Interface().([]uint8)), nil + } + case reflect.Uint: + return strconv.FormatUint(dataVal.Uint(), 10), nil + } + } + + return data, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mitchellh/mapstructure/error.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mitchellh/mapstructure/error.go new file mode 100644 index 00000000..47a99e5a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mitchellh/mapstructure/error.go @@ -0,0 +1,50 @@ +package mapstructure + +import ( + "errors" + "fmt" + "sort" + "strings" +) + +// Error implements the error interface and can represents multiple +// errors that occur in the course of a single decode. +type Error struct { + Errors []string +} + +func (e *Error) Error() string { + points := make([]string, len(e.Errors)) + for i, err := range e.Errors { + points[i] = fmt.Sprintf("* %s", err) + } + + sort.Strings(points) + return fmt.Sprintf( + "%d error(s) decoding:\n\n%s", + len(e.Errors), strings.Join(points, "\n")) +} + +// WrappedErrors implements the errwrap.Wrapper interface to make this +// return value more useful with the errwrap and go-multierror libraries. +func (e *Error) WrappedErrors() []error { + if e == nil { + return nil + } + + result := make([]error, len(e.Errors)) + for i, e := range e.Errors { + result[i] = errors.New(e) + } + + return result +} + +func appendErrors(errors []string, err error) []string { + switch e := err.(type) { + case *Error: + return append(errors, e.Errors...) + default: + return append(errors, e.Error()) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mitchellh/mapstructure/go.mod b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mitchellh/mapstructure/go.mod new file mode 100644 index 00000000..d2a71256 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mitchellh/mapstructure/go.mod @@ -0,0 +1 @@ +module github.com/mitchellh/mapstructure diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mitchellh/mapstructure/mapstructure.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mitchellh/mapstructure/mapstructure.go new file mode 100644 index 00000000..256ee63f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/mitchellh/mapstructure/mapstructure.go @@ -0,0 +1,1149 @@ +// Package mapstructure exposes functionality to convert an arbitrary +// map[string]interface{} into a native Go structure. +// +// The Go structure can be arbitrarily complex, containing slices, +// other structs, etc. and the decoder will properly decode nested +// maps and so on into the proper structures in the native Go struct. +// See the examples to see what the decoder is capable of. +package mapstructure + +import ( + "encoding/json" + "errors" + "fmt" + "reflect" + "sort" + "strconv" + "strings" +) + +// DecodeHookFunc is the callback function that can be used for +// data transformations. See "DecodeHook" in the DecoderConfig +// struct. +// +// The type should be DecodeHookFuncType or DecodeHookFuncKind. +// Either is accepted. Types are a superset of Kinds (Types can return +// Kinds) and are generally a richer thing to use, but Kinds are simpler +// if you only need those. +// +// The reason DecodeHookFunc is multi-typed is for backwards compatibility: +// we started with Kinds and then realized Types were the better solution, +// but have a promise to not break backwards compat so we now support +// both. +type DecodeHookFunc interface{} + +// DecodeHookFuncType is a DecodeHookFunc which has complete information about +// the source and target types. +type DecodeHookFuncType func(reflect.Type, reflect.Type, interface{}) (interface{}, error) + +// DecodeHookFuncKind is a DecodeHookFunc which knows only the Kinds of the +// source and target types. +type DecodeHookFuncKind func(reflect.Kind, reflect.Kind, interface{}) (interface{}, error) + +// DecoderConfig is the configuration that is used to create a new decoder +// and allows customization of various aspects of decoding. +type DecoderConfig struct { + // DecodeHook, if set, will be called before any decoding and any + // type conversion (if WeaklyTypedInput is on). This lets you modify + // the values before they're set down onto the resulting struct. + // + // If an error is returned, the entire decode will fail with that + // error. + DecodeHook DecodeHookFunc + + // If ErrorUnused is true, then it is an error for there to exist + // keys in the original map that were unused in the decoding process + // (extra keys). + ErrorUnused bool + + // ZeroFields, if set to true, will zero fields before writing them. + // For example, a map will be emptied before decoded values are put in + // it. If this is false, a map will be merged. + ZeroFields bool + + // If WeaklyTypedInput is true, the decoder will make the following + // "weak" conversions: + // + // - bools to string (true = "1", false = "0") + // - numbers to string (base 10) + // - bools to int/uint (true = 1, false = 0) + // - strings to int/uint (base implied by prefix) + // - int to bool (true if value != 0) + // - string to bool (accepts: 1, t, T, TRUE, true, True, 0, f, F, + // FALSE, false, False. Anything else is an error) + // - empty array = empty map and vice versa + // - negative numbers to overflowed uint values (base 10) + // - slice of maps to a merged map + // - single values are converted to slices if required. Each + // element is weakly decoded. For example: "4" can become []int{4} + // if the target type is an int slice. + // + WeaklyTypedInput bool + + // Metadata is the struct that will contain extra metadata about + // the decoding. If this is nil, then no metadata will be tracked. + Metadata *Metadata + + // Result is a pointer to the struct that will contain the decoded + // value. + Result interface{} + + // The tag name that mapstructure reads for field names. This + // defaults to "mapstructure" + TagName string +} + +// A Decoder takes a raw interface value and turns it into structured +// data, keeping track of rich error information along the way in case +// anything goes wrong. Unlike the basic top-level Decode method, you can +// more finely control how the Decoder behaves using the DecoderConfig +// structure. The top-level Decode method is just a convenience that sets +// up the most basic Decoder. +type Decoder struct { + config *DecoderConfig +} + +// Metadata contains information about decoding a structure that +// is tedious or difficult to get otherwise. +type Metadata struct { + // Keys are the keys of the structure which were successfully decoded + Keys []string + + // Unused is a slice of keys that were found in the raw value but + // weren't decoded since there was no matching field in the result interface + Unused []string +} + +// Decode takes an input structure and uses reflection to translate it to +// the output structure. output must be a pointer to a map or struct. +func Decode(input interface{}, output interface{}) error { + config := &DecoderConfig{ + Metadata: nil, + Result: output, + } + + decoder, err := NewDecoder(config) + if err != nil { + return err + } + + return decoder.Decode(input) +} + +// WeakDecode is the same as Decode but is shorthand to enable +// WeaklyTypedInput. See DecoderConfig for more info. +func WeakDecode(input, output interface{}) error { + config := &DecoderConfig{ + Metadata: nil, + Result: output, + WeaklyTypedInput: true, + } + + decoder, err := NewDecoder(config) + if err != nil { + return err + } + + return decoder.Decode(input) +} + +// DecodeMetadata is the same as Decode, but is shorthand to +// enable metadata collection. See DecoderConfig for more info. +func DecodeMetadata(input interface{}, output interface{}, metadata *Metadata) error { + config := &DecoderConfig{ + Metadata: metadata, + Result: output, + } + + decoder, err := NewDecoder(config) + if err != nil { + return err + } + + return decoder.Decode(input) +} + +// WeakDecodeMetadata is the same as Decode, but is shorthand to +// enable both WeaklyTypedInput and metadata collection. See +// DecoderConfig for more info. +func WeakDecodeMetadata(input interface{}, output interface{}, metadata *Metadata) error { + config := &DecoderConfig{ + Metadata: metadata, + Result: output, + WeaklyTypedInput: true, + } + + decoder, err := NewDecoder(config) + if err != nil { + return err + } + + return decoder.Decode(input) +} + +// NewDecoder returns a new decoder for the given configuration. Once +// a decoder has been returned, the same configuration must not be used +// again. +func NewDecoder(config *DecoderConfig) (*Decoder, error) { + val := reflect.ValueOf(config.Result) + if val.Kind() != reflect.Ptr { + return nil, errors.New("result must be a pointer") + } + + val = val.Elem() + if !val.CanAddr() { + return nil, errors.New("result must be addressable (a pointer)") + } + + if config.Metadata != nil { + if config.Metadata.Keys == nil { + config.Metadata.Keys = make([]string, 0) + } + + if config.Metadata.Unused == nil { + config.Metadata.Unused = make([]string, 0) + } + } + + if config.TagName == "" { + config.TagName = "mapstructure" + } + + result := &Decoder{ + config: config, + } + + return result, nil +} + +// Decode decodes the given raw interface to the target pointer specified +// by the configuration. +func (d *Decoder) Decode(input interface{}) error { + return d.decode("", input, reflect.ValueOf(d.config.Result).Elem()) +} + +// Decodes an unknown data type into a specific reflection value. +func (d *Decoder) decode(name string, input interface{}, outVal reflect.Value) error { + var inputVal reflect.Value + if input != nil { + inputVal = reflect.ValueOf(input) + + // We need to check here if input is a typed nil. Typed nils won't + // match the "input == nil" below so we check that here. + if inputVal.Kind() == reflect.Ptr && inputVal.IsNil() { + input = nil + } + } + + if input == nil { + // If the data is nil, then we don't set anything, unless ZeroFields is set + // to true. + if d.config.ZeroFields { + outVal.Set(reflect.Zero(outVal.Type())) + + if d.config.Metadata != nil && name != "" { + d.config.Metadata.Keys = append(d.config.Metadata.Keys, name) + } + } + return nil + } + + if !inputVal.IsValid() { + // If the input value is invalid, then we just set the value + // to be the zero value. + outVal.Set(reflect.Zero(outVal.Type())) + if d.config.Metadata != nil && name != "" { + d.config.Metadata.Keys = append(d.config.Metadata.Keys, name) + } + return nil + } + + if d.config.DecodeHook != nil { + // We have a DecodeHook, so let's pre-process the input. + var err error + input, err = DecodeHookExec( + d.config.DecodeHook, + inputVal.Type(), outVal.Type(), input) + if err != nil { + return fmt.Errorf("error decoding '%s': %s", name, err) + } + } + + var err error + outputKind := getKind(outVal) + switch outputKind { + case reflect.Bool: + err = d.decodeBool(name, input, outVal) + case reflect.Interface: + err = d.decodeBasic(name, input, outVal) + case reflect.String: + err = d.decodeString(name, input, outVal) + case reflect.Int: + err = d.decodeInt(name, input, outVal) + case reflect.Uint: + err = d.decodeUint(name, input, outVal) + case reflect.Float32: + err = d.decodeFloat(name, input, outVal) + case reflect.Struct: + err = d.decodeStruct(name, input, outVal) + case reflect.Map: + err = d.decodeMap(name, input, outVal) + case reflect.Ptr: + err = d.decodePtr(name, input, outVal) + case reflect.Slice: + err = d.decodeSlice(name, input, outVal) + case reflect.Array: + err = d.decodeArray(name, input, outVal) + case reflect.Func: + err = d.decodeFunc(name, input, outVal) + default: + // If we reached this point then we weren't able to decode it + return fmt.Errorf("%s: unsupported type: %s", name, outputKind) + } + + // If we reached here, then we successfully decoded SOMETHING, so + // mark the key as used if we're tracking metainput. + if d.config.Metadata != nil && name != "" { + d.config.Metadata.Keys = append(d.config.Metadata.Keys, name) + } + + return err +} + +// This decodes a basic type (bool, int, string, etc.) and sets the +// value to "data" of that type. +func (d *Decoder) decodeBasic(name string, data interface{}, val reflect.Value) error { + if val.IsValid() && val.Elem().IsValid() { + return d.decode(name, data, val.Elem()) + } + + dataVal := reflect.ValueOf(data) + + // If the input data is a pointer, and the assigned type is the dereference + // of that exact pointer, then indirect it so that we can assign it. + // Example: *string to string + if dataVal.Kind() == reflect.Ptr && dataVal.Type().Elem() == val.Type() { + dataVal = reflect.Indirect(dataVal) + } + + if !dataVal.IsValid() { + dataVal = reflect.Zero(val.Type()) + } + + dataValType := dataVal.Type() + if !dataValType.AssignableTo(val.Type()) { + return fmt.Errorf( + "'%s' expected type '%s', got '%s'", + name, val.Type(), dataValType) + } + + val.Set(dataVal) + return nil +} + +func (d *Decoder) decodeString(name string, data interface{}, val reflect.Value) error { + dataVal := reflect.Indirect(reflect.ValueOf(data)) + dataKind := getKind(dataVal) + + converted := true + switch { + case dataKind == reflect.String: + val.SetString(dataVal.String()) + case dataKind == reflect.Bool && d.config.WeaklyTypedInput: + if dataVal.Bool() { + val.SetString("1") + } else { + val.SetString("0") + } + case dataKind == reflect.Int && d.config.WeaklyTypedInput: + val.SetString(strconv.FormatInt(dataVal.Int(), 10)) + case dataKind == reflect.Uint && d.config.WeaklyTypedInput: + val.SetString(strconv.FormatUint(dataVal.Uint(), 10)) + case dataKind == reflect.Float32 && d.config.WeaklyTypedInput: + val.SetString(strconv.FormatFloat(dataVal.Float(), 'f', -1, 64)) + case dataKind == reflect.Slice && d.config.WeaklyTypedInput, + dataKind == reflect.Array && d.config.WeaklyTypedInput: + dataType := dataVal.Type() + elemKind := dataType.Elem().Kind() + switch elemKind { + case reflect.Uint8: + var uints []uint8 + if dataKind == reflect.Array { + uints = make([]uint8, dataVal.Len(), dataVal.Len()) + for i := range uints { + uints[i] = dataVal.Index(i).Interface().(uint8) + } + } else { + uints = dataVal.Interface().([]uint8) + } + val.SetString(string(uints)) + default: + converted = false + } + default: + converted = false + } + + if !converted { + return fmt.Errorf( + "'%s' expected type '%s', got unconvertible type '%s'", + name, val.Type(), dataVal.Type()) + } + + return nil +} + +func (d *Decoder) decodeInt(name string, data interface{}, val reflect.Value) error { + dataVal := reflect.Indirect(reflect.ValueOf(data)) + dataKind := getKind(dataVal) + dataType := dataVal.Type() + + switch { + case dataKind == reflect.Int: + val.SetInt(dataVal.Int()) + case dataKind == reflect.Uint: + val.SetInt(int64(dataVal.Uint())) + case dataKind == reflect.Float32: + val.SetInt(int64(dataVal.Float())) + case dataKind == reflect.Bool && d.config.WeaklyTypedInput: + if dataVal.Bool() { + val.SetInt(1) + } else { + val.SetInt(0) + } + case dataKind == reflect.String && d.config.WeaklyTypedInput: + i, err := strconv.ParseInt(dataVal.String(), 0, val.Type().Bits()) + if err == nil { + val.SetInt(i) + } else { + return fmt.Errorf("cannot parse '%s' as int: %s", name, err) + } + case dataType.PkgPath() == "encoding/json" && dataType.Name() == "Number": + jn := data.(json.Number) + i, err := jn.Int64() + if err != nil { + return fmt.Errorf( + "error decoding json.Number into %s: %s", name, err) + } + val.SetInt(i) + default: + return fmt.Errorf( + "'%s' expected type '%s', got unconvertible type '%s'", + name, val.Type(), dataVal.Type()) + } + + return nil +} + +func (d *Decoder) decodeUint(name string, data interface{}, val reflect.Value) error { + dataVal := reflect.Indirect(reflect.ValueOf(data)) + dataKind := getKind(dataVal) + + switch { + case dataKind == reflect.Int: + i := dataVal.Int() + if i < 0 && !d.config.WeaklyTypedInput { + return fmt.Errorf("cannot parse '%s', %d overflows uint", + name, i) + } + val.SetUint(uint64(i)) + case dataKind == reflect.Uint: + val.SetUint(dataVal.Uint()) + case dataKind == reflect.Float32: + f := dataVal.Float() + if f < 0 && !d.config.WeaklyTypedInput { + return fmt.Errorf("cannot parse '%s', %f overflows uint", + name, f) + } + val.SetUint(uint64(f)) + case dataKind == reflect.Bool && d.config.WeaklyTypedInput: + if dataVal.Bool() { + val.SetUint(1) + } else { + val.SetUint(0) + } + case dataKind == reflect.String && d.config.WeaklyTypedInput: + i, err := strconv.ParseUint(dataVal.String(), 0, val.Type().Bits()) + if err == nil { + val.SetUint(i) + } else { + return fmt.Errorf("cannot parse '%s' as uint: %s", name, err) + } + default: + return fmt.Errorf( + "'%s' expected type '%s', got unconvertible type '%s'", + name, val.Type(), dataVal.Type()) + } + + return nil +} + +func (d *Decoder) decodeBool(name string, data interface{}, val reflect.Value) error { + dataVal := reflect.Indirect(reflect.ValueOf(data)) + dataKind := getKind(dataVal) + + switch { + case dataKind == reflect.Bool: + val.SetBool(dataVal.Bool()) + case dataKind == reflect.Int && d.config.WeaklyTypedInput: + val.SetBool(dataVal.Int() != 0) + case dataKind == reflect.Uint && d.config.WeaklyTypedInput: + val.SetBool(dataVal.Uint() != 0) + case dataKind == reflect.Float32 && d.config.WeaklyTypedInput: + val.SetBool(dataVal.Float() != 0) + case dataKind == reflect.String && d.config.WeaklyTypedInput: + b, err := strconv.ParseBool(dataVal.String()) + if err == nil { + val.SetBool(b) + } else if dataVal.String() == "" { + val.SetBool(false) + } else { + return fmt.Errorf("cannot parse '%s' as bool: %s", name, err) + } + default: + return fmt.Errorf( + "'%s' expected type '%s', got unconvertible type '%s'", + name, val.Type(), dataVal.Type()) + } + + return nil +} + +func (d *Decoder) decodeFloat(name string, data interface{}, val reflect.Value) error { + dataVal := reflect.Indirect(reflect.ValueOf(data)) + dataKind := getKind(dataVal) + dataType := dataVal.Type() + + switch { + case dataKind == reflect.Int: + val.SetFloat(float64(dataVal.Int())) + case dataKind == reflect.Uint: + val.SetFloat(float64(dataVal.Uint())) + case dataKind == reflect.Float32: + val.SetFloat(dataVal.Float()) + case dataKind == reflect.Bool && d.config.WeaklyTypedInput: + if dataVal.Bool() { + val.SetFloat(1) + } else { + val.SetFloat(0) + } + case dataKind == reflect.String && d.config.WeaklyTypedInput: + f, err := strconv.ParseFloat(dataVal.String(), val.Type().Bits()) + if err == nil { + val.SetFloat(f) + } else { + return fmt.Errorf("cannot parse '%s' as float: %s", name, err) + } + case dataType.PkgPath() == "encoding/json" && dataType.Name() == "Number": + jn := data.(json.Number) + i, err := jn.Float64() + if err != nil { + return fmt.Errorf( + "error decoding json.Number into %s: %s", name, err) + } + val.SetFloat(i) + default: + return fmt.Errorf( + "'%s' expected type '%s', got unconvertible type '%s'", + name, val.Type(), dataVal.Type()) + } + + return nil +} + +func (d *Decoder) decodeMap(name string, data interface{}, val reflect.Value) error { + valType := val.Type() + valKeyType := valType.Key() + valElemType := valType.Elem() + + // By default we overwrite keys in the current map + valMap := val + + // If the map is nil or we're purposely zeroing fields, make a new map + if valMap.IsNil() || d.config.ZeroFields { + // Make a new map to hold our result + mapType := reflect.MapOf(valKeyType, valElemType) + valMap = reflect.MakeMap(mapType) + } + + // Check input type and based on the input type jump to the proper func + dataVal := reflect.Indirect(reflect.ValueOf(data)) + switch dataVal.Kind() { + case reflect.Map: + return d.decodeMapFromMap(name, dataVal, val, valMap) + + case reflect.Struct: + return d.decodeMapFromStruct(name, dataVal, val, valMap) + + case reflect.Array, reflect.Slice: + if d.config.WeaklyTypedInput { + return d.decodeMapFromSlice(name, dataVal, val, valMap) + } + + fallthrough + + default: + return fmt.Errorf("'%s' expected a map, got '%s'", name, dataVal.Kind()) + } +} + +func (d *Decoder) decodeMapFromSlice(name string, dataVal reflect.Value, val reflect.Value, valMap reflect.Value) error { + // Special case for BC reasons (covered by tests) + if dataVal.Len() == 0 { + val.Set(valMap) + return nil + } + + for i := 0; i < dataVal.Len(); i++ { + err := d.decode( + fmt.Sprintf("%s[%d]", name, i), + dataVal.Index(i).Interface(), val) + if err != nil { + return err + } + } + + return nil +} + +func (d *Decoder) decodeMapFromMap(name string, dataVal reflect.Value, val reflect.Value, valMap reflect.Value) error { + valType := val.Type() + valKeyType := valType.Key() + valElemType := valType.Elem() + + // Accumulate errors + errors := make([]string, 0) + + // If the input data is empty, then we just match what the input data is. + if dataVal.Len() == 0 { + if dataVal.IsNil() { + if !val.IsNil() { + val.Set(dataVal) + } + } else { + // Set to empty allocated value + val.Set(valMap) + } + + return nil + } + + for _, k := range dataVal.MapKeys() { + fieldName := fmt.Sprintf("%s[%s]", name, k) + + // First decode the key into the proper type + currentKey := reflect.Indirect(reflect.New(valKeyType)) + if err := d.decode(fieldName, k.Interface(), currentKey); err != nil { + errors = appendErrors(errors, err) + continue + } + + // Next decode the data into the proper type + v := dataVal.MapIndex(k).Interface() + currentVal := reflect.Indirect(reflect.New(valElemType)) + if err := d.decode(fieldName, v, currentVal); err != nil { + errors = appendErrors(errors, err) + continue + } + + valMap.SetMapIndex(currentKey, currentVal) + } + + // Set the built up map to the value + val.Set(valMap) + + // If we had errors, return those + if len(errors) > 0 { + return &Error{errors} + } + + return nil +} + +func (d *Decoder) decodeMapFromStruct(name string, dataVal reflect.Value, val reflect.Value, valMap reflect.Value) error { + typ := dataVal.Type() + for i := 0; i < typ.NumField(); i++ { + // Get the StructField first since this is a cheap operation. If the + // field is unexported, then ignore it. + f := typ.Field(i) + if f.PkgPath != "" { + continue + } + + // Next get the actual value of this field and verify it is assignable + // to the map value. + v := dataVal.Field(i) + if !v.Type().AssignableTo(valMap.Type().Elem()) { + return fmt.Errorf("cannot assign type '%s' to map value field of type '%s'", v.Type(), valMap.Type().Elem()) + } + + tagValue := f.Tag.Get(d.config.TagName) + tagParts := strings.Split(tagValue, ",") + + // Determine the name of the key in the map + keyName := f.Name + if tagParts[0] != "" { + if tagParts[0] == "-" { + continue + } + keyName = tagParts[0] + } + + // If "squash" is specified in the tag, we squash the field down. + squash := false + for _, tag := range tagParts[1:] { + if tag == "squash" { + squash = true + break + } + } + if squash && v.Kind() != reflect.Struct { + return fmt.Errorf("cannot squash non-struct type '%s'", v.Type()) + } + + switch v.Kind() { + // this is an embedded struct, so handle it differently + case reflect.Struct: + x := reflect.New(v.Type()) + x.Elem().Set(v) + + vType := valMap.Type() + vKeyType := vType.Key() + vElemType := vType.Elem() + mType := reflect.MapOf(vKeyType, vElemType) + vMap := reflect.MakeMap(mType) + + err := d.decode(keyName, x.Interface(), vMap) + if err != nil { + return err + } + + if squash { + for _, k := range vMap.MapKeys() { + valMap.SetMapIndex(k, vMap.MapIndex(k)) + } + } else { + valMap.SetMapIndex(reflect.ValueOf(keyName), vMap) + } + + default: + valMap.SetMapIndex(reflect.ValueOf(keyName), v) + } + } + + if val.CanAddr() { + val.Set(valMap) + } + + return nil +} + +func (d *Decoder) decodePtr(name string, data interface{}, val reflect.Value) error { + // If the input data is nil, then we want to just set the output + // pointer to be nil as well. + isNil := data == nil + if !isNil { + switch v := reflect.Indirect(reflect.ValueOf(data)); v.Kind() { + case reflect.Chan, + reflect.Func, + reflect.Interface, + reflect.Map, + reflect.Ptr, + reflect.Slice: + isNil = v.IsNil() + } + } + if isNil { + if !val.IsNil() && val.CanSet() { + nilValue := reflect.New(val.Type()).Elem() + val.Set(nilValue) + } + + return nil + } + + // Create an element of the concrete (non pointer) type and decode + // into that. Then set the value of the pointer to this type. + valType := val.Type() + valElemType := valType.Elem() + if val.CanSet() { + realVal := val + if realVal.IsNil() || d.config.ZeroFields { + realVal = reflect.New(valElemType) + } + + if err := d.decode(name, data, reflect.Indirect(realVal)); err != nil { + return err + } + + val.Set(realVal) + } else { + if err := d.decode(name, data, reflect.Indirect(val)); err != nil { + return err + } + } + return nil +} + +func (d *Decoder) decodeFunc(name string, data interface{}, val reflect.Value) error { + // Create an element of the concrete (non pointer) type and decode + // into that. Then set the value of the pointer to this type. + dataVal := reflect.Indirect(reflect.ValueOf(data)) + if val.Type() != dataVal.Type() { + return fmt.Errorf( + "'%s' expected type '%s', got unconvertible type '%s'", + name, val.Type(), dataVal.Type()) + } + val.Set(dataVal) + return nil +} + +func (d *Decoder) decodeSlice(name string, data interface{}, val reflect.Value) error { + dataVal := reflect.Indirect(reflect.ValueOf(data)) + dataValKind := dataVal.Kind() + valType := val.Type() + valElemType := valType.Elem() + sliceType := reflect.SliceOf(valElemType) + + valSlice := val + if valSlice.IsNil() || d.config.ZeroFields { + if d.config.WeaklyTypedInput { + switch { + // Slice and array we use the normal logic + case dataValKind == reflect.Slice, dataValKind == reflect.Array: + break + + // Empty maps turn into empty slices + case dataValKind == reflect.Map: + if dataVal.Len() == 0 { + val.Set(reflect.MakeSlice(sliceType, 0, 0)) + return nil + } + // Create slice of maps of other sizes + return d.decodeSlice(name, []interface{}{data}, val) + + case dataValKind == reflect.String && valElemType.Kind() == reflect.Uint8: + return d.decodeSlice(name, []byte(dataVal.String()), val) + + // All other types we try to convert to the slice type + // and "lift" it into it. i.e. a string becomes a string slice. + default: + // Just re-try this function with data as a slice. + return d.decodeSlice(name, []interface{}{data}, val) + } + } + + // Check input type + if dataValKind != reflect.Array && dataValKind != reflect.Slice { + return fmt.Errorf( + "'%s': source data must be an array or slice, got %s", name, dataValKind) + + } + + // If the input value is empty, then don't allocate since non-nil != nil + if dataVal.Len() == 0 { + return nil + } + + // Make a new slice to hold our result, same size as the original data. + valSlice = reflect.MakeSlice(sliceType, dataVal.Len(), dataVal.Len()) + } + + // Accumulate any errors + errors := make([]string, 0) + + for i := 0; i < dataVal.Len(); i++ { + currentData := dataVal.Index(i).Interface() + for valSlice.Len() <= i { + valSlice = reflect.Append(valSlice, reflect.Zero(valElemType)) + } + currentField := valSlice.Index(i) + + fieldName := fmt.Sprintf("%s[%d]", name, i) + if err := d.decode(fieldName, currentData, currentField); err != nil { + errors = appendErrors(errors, err) + } + } + + // Finally, set the value to the slice we built up + val.Set(valSlice) + + // If there were errors, we return those + if len(errors) > 0 { + return &Error{errors} + } + + return nil +} + +func (d *Decoder) decodeArray(name string, data interface{}, val reflect.Value) error { + dataVal := reflect.Indirect(reflect.ValueOf(data)) + dataValKind := dataVal.Kind() + valType := val.Type() + valElemType := valType.Elem() + arrayType := reflect.ArrayOf(valType.Len(), valElemType) + + valArray := val + + if valArray.Interface() == reflect.Zero(valArray.Type()).Interface() || d.config.ZeroFields { + // Check input type + if dataValKind != reflect.Array && dataValKind != reflect.Slice { + if d.config.WeaklyTypedInput { + switch { + // Empty maps turn into empty arrays + case dataValKind == reflect.Map: + if dataVal.Len() == 0 { + val.Set(reflect.Zero(arrayType)) + return nil + } + + // All other types we try to convert to the array type + // and "lift" it into it. i.e. a string becomes a string array. + default: + // Just re-try this function with data as a slice. + return d.decodeArray(name, []interface{}{data}, val) + } + } + + return fmt.Errorf( + "'%s': source data must be an array or slice, got %s", name, dataValKind) + + } + if dataVal.Len() > arrayType.Len() { + return fmt.Errorf( + "'%s': expected source data to have length less or equal to %d, got %d", name, arrayType.Len(), dataVal.Len()) + + } + + // Make a new array to hold our result, same size as the original data. + valArray = reflect.New(arrayType).Elem() + } + + // Accumulate any errors + errors := make([]string, 0) + + for i := 0; i < dataVal.Len(); i++ { + currentData := dataVal.Index(i).Interface() + currentField := valArray.Index(i) + + fieldName := fmt.Sprintf("%s[%d]", name, i) + if err := d.decode(fieldName, currentData, currentField); err != nil { + errors = appendErrors(errors, err) + } + } + + // Finally, set the value to the array we built up + val.Set(valArray) + + // If there were errors, we return those + if len(errors) > 0 { + return &Error{errors} + } + + return nil +} + +func (d *Decoder) decodeStruct(name string, data interface{}, val reflect.Value) error { + dataVal := reflect.Indirect(reflect.ValueOf(data)) + + // If the type of the value to write to and the data match directly, + // then we just set it directly instead of recursing into the structure. + if dataVal.Type() == val.Type() { + val.Set(dataVal) + return nil + } + + dataValKind := dataVal.Kind() + switch dataValKind { + case reflect.Map: + return d.decodeStructFromMap(name, dataVal, val) + + case reflect.Struct: + // Not the most efficient way to do this but we can optimize later if + // we want to. To convert from struct to struct we go to map first + // as an intermediary. + m := make(map[string]interface{}) + mval := reflect.Indirect(reflect.ValueOf(&m)) + if err := d.decodeMapFromStruct(name, dataVal, mval, mval); err != nil { + return err + } + + result := d.decodeStructFromMap(name, mval, val) + return result + + default: + return fmt.Errorf("'%s' expected a map, got '%s'", name, dataVal.Kind()) + } +} + +func (d *Decoder) decodeStructFromMap(name string, dataVal, val reflect.Value) error { + dataValType := dataVal.Type() + if kind := dataValType.Key().Kind(); kind != reflect.String && kind != reflect.Interface { + return fmt.Errorf( + "'%s' needs a map with string keys, has '%s' keys", + name, dataValType.Key().Kind()) + } + + dataValKeys := make(map[reflect.Value]struct{}) + dataValKeysUnused := make(map[interface{}]struct{}) + for _, dataValKey := range dataVal.MapKeys() { + dataValKeys[dataValKey] = struct{}{} + dataValKeysUnused[dataValKey.Interface()] = struct{}{} + } + + errors := make([]string, 0) + + // This slice will keep track of all the structs we'll be decoding. + // There can be more than one struct if there are embedded structs + // that are squashed. + structs := make([]reflect.Value, 1, 5) + structs[0] = val + + // Compile the list of all the fields that we're going to be decoding + // from all the structs. + type field struct { + field reflect.StructField + val reflect.Value + } + fields := []field{} + for len(structs) > 0 { + structVal := structs[0] + structs = structs[1:] + + structType := structVal.Type() + + for i := 0; i < structType.NumField(); i++ { + fieldType := structType.Field(i) + fieldKind := fieldType.Type.Kind() + + // If "squash" is specified in the tag, we squash the field down. + squash := false + tagParts := strings.Split(fieldType.Tag.Get(d.config.TagName), ",") + for _, tag := range tagParts[1:] { + if tag == "squash" { + squash = true + break + } + } + + if squash { + if fieldKind != reflect.Struct { + errors = appendErrors(errors, + fmt.Errorf("%s: unsupported type for squash: %s", fieldType.Name, fieldKind)) + } else { + structs = append(structs, structVal.FieldByName(fieldType.Name)) + } + continue + } + + // Normal struct field, store it away + fields = append(fields, field{fieldType, structVal.Field(i)}) + } + } + + // for fieldType, field := range fields { + for _, f := range fields { + field, fieldValue := f.field, f.val + fieldName := field.Name + + tagValue := field.Tag.Get(d.config.TagName) + tagValue = strings.SplitN(tagValue, ",", 2)[0] + if tagValue != "" { + fieldName = tagValue + } + + rawMapKey := reflect.ValueOf(fieldName) + rawMapVal := dataVal.MapIndex(rawMapKey) + if !rawMapVal.IsValid() { + // Do a slower search by iterating over each key and + // doing case-insensitive search. + for dataValKey := range dataValKeys { + mK, ok := dataValKey.Interface().(string) + if !ok { + // Not a string key + continue + } + + if strings.EqualFold(mK, fieldName) { + rawMapKey = dataValKey + rawMapVal = dataVal.MapIndex(dataValKey) + break + } + } + + if !rawMapVal.IsValid() { + // There was no matching key in the map for the value in + // the struct. Just ignore. + continue + } + } + + // Delete the key we're using from the unused map so we stop tracking + delete(dataValKeysUnused, rawMapKey.Interface()) + + if !fieldValue.IsValid() { + // This should never happen + panic("field is not valid") + } + + // If we can't set the field, then it is unexported or something, + // and we just continue onwards. + if !fieldValue.CanSet() { + continue + } + + // If the name is empty string, then we're at the root, and we + // don't dot-join the fields. + if name != "" { + fieldName = fmt.Sprintf("%s.%s", name, fieldName) + } + + if err := d.decode(fieldName, rawMapVal.Interface(), fieldValue); err != nil { + errors = appendErrors(errors, err) + } + } + + if d.config.ErrorUnused && len(dataValKeysUnused) > 0 { + keys := make([]string, 0, len(dataValKeysUnused)) + for rawKey := range dataValKeysUnused { + keys = append(keys, rawKey.(string)) + } + sort.Strings(keys) + + err := fmt.Errorf("'%s' has invalid keys: %s", name, strings.Join(keys, ", ")) + errors = appendErrors(errors, err) + } + + if len(errors) > 0 { + return &Error{errors} + } + + // Add the unused keys to the list of unused keys if we're tracking metadata + if d.config.Metadata != nil { + for rawKey := range dataValKeysUnused { + key := rawKey.(string) + if name != "" { + key = fmt.Sprintf("%s.%s", name, key) + } + + d.config.Metadata.Unused = append(d.config.Metadata.Unused, key) + } + } + + return nil +} + +func getKind(val reflect.Value) reflect.Kind { + kind := val.Kind() + + switch { + case kind >= reflect.Int && kind <= reflect.Int64: + return reflect.Int + case kind >= reflect.Uint && kind <= reflect.Uint64: + return reflect.Uint + case kind >= reflect.Float32 && kind <= reflect.Float64: + return reflect.Float32 + default: + return kind + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/.gitignore b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/.gitignore new file mode 100644 index 00000000..99e38bbc --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/.gitignore @@ -0,0 +1,2 @@ +test_program/test_program_bin +fuzz/ diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/.travis.yml b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/.travis.yml new file mode 100644 index 00000000..c9fbf304 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/.travis.yml @@ -0,0 +1,23 @@ +sudo: false +language: go +go: + - 1.8.x + - 1.9.x + - 1.10.x + - tip +matrix: + allow_failures: + - go: tip + fast_finish: true +script: + - if [ -n "$(go fmt ./...)" ]; then exit 1; fi + - ./test.sh + - ./benchmark.sh $TRAVIS_BRANCH https://github.com/$TRAVIS_REPO_SLUG.git +before_install: + - go get github.com/axw/gocov/gocov + - go get github.com/mattn/goveralls + - if ! go get code.google.com/p/go.tools/cmd/cover; then go get golang.org/x/tools/cmd/cover; fi +branches: + only: [master] +after_success: + - $HOME/gopath/bin/goveralls -service=travis-ci -coverprofile=coverage.out -repotoken $COVERALLS_TOKEN diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/LICENSE b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/LICENSE new file mode 100644 index 00000000..583bdae6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2013 - 2017 Thomas Pelletier, Eric Anderton + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/README.md b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/README.md new file mode 100644 index 00000000..0d357acf --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/README.md @@ -0,0 +1,131 @@ +# go-toml + +Go library for the [TOML](https://github.com/mojombo/toml) format. + +This library supports TOML version +[v0.4.0](https://github.com/toml-lang/toml/blob/master/versions/en/toml-v0.4.0.md) + +[![GoDoc](https://godoc.org/github.com/pelletier/go-toml?status.svg)](http://godoc.org/github.com/pelletier/go-toml) +[![license](https://img.shields.io/github/license/pelletier/go-toml.svg)](https://github.com/pelletier/go-toml/blob/master/LICENSE) +[![Build Status](https://travis-ci.org/pelletier/go-toml.svg?branch=master)](https://travis-ci.org/pelletier/go-toml) +[![Coverage Status](https://coveralls.io/repos/github/pelletier/go-toml/badge.svg?branch=master)](https://coveralls.io/github/pelletier/go-toml?branch=master) +[![Go Report Card](https://goreportcard.com/badge/github.com/pelletier/go-toml)](https://goreportcard.com/report/github.com/pelletier/go-toml) + +## Features + +Go-toml provides the following features for using data parsed from TOML documents: + +* Load TOML documents from files and string data +* Easily navigate TOML structure using Tree +* Mashaling and unmarshaling to and from data structures +* Line & column position data for all parsed elements +* [Query support similar to JSON-Path](query/) +* Syntax errors contain line and column numbers + +## Import + +```go +import "github.com/pelletier/go-toml" +``` + +## Usage example + +Read a TOML document: + +```go +config, _ := toml.Load(` +[postgres] +user = "pelletier" +password = "mypassword"`) +// retrieve data directly +user := config.Get("postgres.user").(string) + +// or using an intermediate object +postgresConfig := config.Get("postgres").(*toml.Tree) +password := postgresConfig.Get("password").(string) +``` + +Or use Unmarshal: + +```go +type Postgres struct { + User string + Password string +} +type Config struct { + Postgres Postgres +} + +doc := []byte(` +[Postgres] +User = "pelletier" +Password = "mypassword"`) + +config := Config{} +toml.Unmarshal(doc, &config) +fmt.Println("user=", config.Postgres.User) +``` + +Or use a query: + +```go +// use a query to gather elements without walking the tree +q, _ := query.Compile("$..[user,password]") +results := q.Execute(config) +for ii, item := range results.Values() { + fmt.Println("Query result %d: %v", ii, item) +} +``` + +## Documentation + +The documentation and additional examples are available at +[godoc.org](http://godoc.org/github.com/pelletier/go-toml). + +## Tools + +Go-toml provides two handy command line tools: + +* `tomll`: Reads TOML files and lint them. + + ``` + go install github.com/pelletier/go-toml/cmd/tomll + tomll --help + ``` +* `tomljson`: Reads a TOML file and outputs its JSON representation. + + ``` + go install github.com/pelletier/go-toml/cmd/tomljson + tomljson --help + ``` + +## Contribute + +Feel free to report bugs and patches using GitHub's pull requests system on +[pelletier/go-toml](https://github.com/pelletier/go-toml). Any feedback would be +much appreciated! + +### Run tests + +You have to make sure two kind of tests run: + +1. The Go unit tests +2. The TOML examples base + +You can run both of them using `./test.sh`. + +### Fuzzing + +The script `./fuzz.sh` is available to +run [go-fuzz](https://github.com/dvyukov/go-fuzz) on go-toml. + +## Versioning + +Go-toml follows [Semantic Versioning](http://semver.org/). The supported version +of [TOML](https://github.com/toml-lang/toml) is indicated at the beginning of +this document. The last two major versions of Go are supported +(see [Go Release Policy](https://golang.org/doc/devel/release.html#policy)). + +## License + +The MIT License (MIT). Read [LICENSE](LICENSE). diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/benchmark.json b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/benchmark.json new file mode 100644 index 00000000..86f99c6a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/benchmark.json @@ -0,0 +1,164 @@ +{ + "array": { + "key1": [ + 1, + 2, + 3 + ], + "key2": [ + "red", + "yellow", + "green" + ], + "key3": [ + [ + 1, + 2 + ], + [ + 3, + 4, + 5 + ] + ], + "key4": [ + [ + 1, + 2 + ], + [ + "a", + "b", + "c" + ] + ], + "key5": [ + 1, + 2, + 3 + ], + "key6": [ + 1, + 2 + ] + }, + "boolean": { + "False": false, + "True": true + }, + "datetime": { + "key1": "1979-05-27T07:32:00Z", + "key2": "1979-05-27T00:32:00-07:00", + "key3": "1979-05-27T00:32:00.999999-07:00" + }, + "float": { + "both": { + "key": 6.626e-34 + }, + "exponent": { + "key1": 5e+22, + "key2": 1000000, + "key3": -0.02 + }, + "fractional": { + "key1": 1, + "key2": 3.1415, + "key3": -0.01 + }, + "underscores": { + "key1": 9224617.445991227, + "key2": 1e+100 + } + }, + "fruit": [{ + "name": "apple", + "physical": { + "color": "red", + "shape": "round" + }, + "variety": [{ + "name": "red delicious" + }, + { + "name": "granny smith" + } + ] + }, + { + "name": "banana", + "variety": [{ + "name": "plantain" + }] + } + ], + "integer": { + "key1": 99, + "key2": 42, + "key3": 0, + "key4": -17, + "underscores": { + "key1": 1000, + "key2": 5349221, + "key3": 12345 + } + }, + "products": [{ + "name": "Hammer", + "sku": 738594937 + }, + {}, + { + "color": "gray", + "name": "Nail", + "sku": 284758393 + } + ], + "string": { + "basic": { + "basic": "I'm a string. \"You can quote me\". Name\tJosé\nLocation\tSF." + }, + "literal": { + "multiline": { + "lines": "The first newline is\ntrimmed in raw strings.\n All other whitespace\n is preserved.\n", + "regex2": "I [dw]on't need \\d{2} apples" + }, + "quoted": "Tom \"Dubs\" Preston-Werner", + "regex": "\u003c\\i\\c*\\s*\u003e", + "winpath": "C:\\Users\\nodejs\\templates", + "winpath2": "\\\\ServerX\\admin$\\system32\\" + }, + "multiline": { + "continued": { + "key1": "The quick brown fox jumps over the lazy dog.", + "key2": "The quick brown fox jumps over the lazy dog.", + "key3": "The quick brown fox jumps over the lazy dog." + }, + "key1": "One\nTwo", + "key2": "One\nTwo", + "key3": "One\nTwo" + } + }, + "table": { + "inline": { + "name": { + "first": "Tom", + "last": "Preston-Werner" + }, + "point": { + "x": 1, + "y": 2 + } + }, + "key": "value", + "subtable": { + "key": "another value" + } + }, + "x": { + "y": { + "z": { + "w": {} + } + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/benchmark.sh b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/benchmark.sh new file mode 100755 index 00000000..8b8bb528 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/benchmark.sh @@ -0,0 +1,32 @@ +#!/bin/bash + +set -e + +reference_ref=${1:-master} +reference_git=${2:-.} + +if ! `hash benchstat 2>/dev/null`; then + echo "Installing benchstat" + go get golang.org/x/perf/cmd/benchstat + go install golang.org/x/perf/cmd/benchstat +fi + +tempdir=`mktemp -d /tmp/go-toml-benchmark-XXXXXX` +ref_tempdir="${tempdir}/ref" +ref_benchmark="${ref_tempdir}/benchmark-`echo -n ${reference_ref}|tr -s '/' '-'`.txt" +local_benchmark="`pwd`/benchmark-local.txt" + +echo "=== ${reference_ref} (${ref_tempdir})" +git clone ${reference_git} ${ref_tempdir} >/dev/null 2>/dev/null +pushd ${ref_tempdir} >/dev/null +git checkout ${reference_ref} >/dev/null 2>/dev/null +go test -bench=. -benchmem | tee ${ref_benchmark} +popd >/dev/null + +echo "" +echo "=== local" +go test -bench=. -benchmem | tee ${local_benchmark} + +echo "" +echo "=== diff" +benchstat -delta-test=none ${ref_benchmark} ${local_benchmark} \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/benchmark.toml b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/benchmark.toml new file mode 100644 index 00000000..dfd77e09 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/benchmark.toml @@ -0,0 +1,244 @@ +################################################################################ +## Comment + +# Speak your mind with the hash symbol. They go from the symbol to the end of +# the line. + + +################################################################################ +## Table + +# Tables (also known as hash tables or dictionaries) are collections of +# key/value pairs. They appear in square brackets on a line by themselves. + +[table] + +key = "value" # Yeah, you can do this. + +# Nested tables are denoted by table names with dots in them. Name your tables +# whatever crap you please, just don't use #, ., [ or ]. + +[table.subtable] + +key = "another value" + +# You don't need to specify all the super-tables if you don't want to. TOML +# knows how to do it for you. + +# [x] you +# [x.y] don't +# [x.y.z] need these +[x.y.z.w] # for this to work + + +################################################################################ +## Inline Table + +# Inline tables provide a more compact syntax for expressing tables. They are +# especially useful for grouped data that can otherwise quickly become verbose. +# Inline tables are enclosed in curly braces `{` and `}`. No newlines are +# allowed between the curly braces unless they are valid within a value. + +[table.inline] + +name = { first = "Tom", last = "Preston-Werner" } +point = { x = 1, y = 2 } + + +################################################################################ +## String + +# There are four ways to express strings: basic, multi-line basic, literal, and +# multi-line literal. All strings must contain only valid UTF-8 characters. + +[string.basic] + +basic = "I'm a string. \"You can quote me\". Name\tJos\u00E9\nLocation\tSF." + +[string.multiline] + +# The following strings are byte-for-byte equivalent: +key1 = "One\nTwo" +key2 = """One\nTwo""" +key3 = """ +One +Two""" + +[string.multiline.continued] + +# The following strings are byte-for-byte equivalent: +key1 = "The quick brown fox jumps over the lazy dog." + +key2 = """ +The quick brown \ + + + fox jumps over \ + the lazy dog.""" + +key3 = """\ + The quick brown \ + fox jumps over \ + the lazy dog.\ + """ + +[string.literal] + +# What you see is what you get. +winpath = 'C:\Users\nodejs\templates' +winpath2 = '\\ServerX\admin$\system32\' +quoted = 'Tom "Dubs" Preston-Werner' +regex = '<\i\c*\s*>' + + +[string.literal.multiline] + +regex2 = '''I [dw]on't need \d{2} apples''' +lines = ''' +The first newline is +trimmed in raw strings. + All other whitespace + is preserved. +''' + + +################################################################################ +## Integer + +# Integers are whole numbers. Positive numbers may be prefixed with a plus sign. +# Negative numbers are prefixed with a minus sign. + +[integer] + +key1 = +99 +key2 = 42 +key3 = 0 +key4 = -17 + +[integer.underscores] + +# For large numbers, you may use underscores to enhance readability. Each +# underscore must be surrounded by at least one digit. +key1 = 1_000 +key2 = 5_349_221 +key3 = 1_2_3_4_5 # valid but inadvisable + + +################################################################################ +## Float + +# A float consists of an integer part (which may be prefixed with a plus or +# minus sign) followed by a fractional part and/or an exponent part. + +[float.fractional] + +key1 = +1.0 +key2 = 3.1415 +key3 = -0.01 + +[float.exponent] + +key1 = 5e+22 +key2 = 1e6 +key3 = -2E-2 + +[float.both] + +key = 6.626e-34 + +[float.underscores] + +key1 = 9_224_617.445_991_228_313 +key2 = 1e1_00 + + +################################################################################ +## Boolean + +# Booleans are just the tokens you're used to. Always lowercase. + +[boolean] + +True = true +False = false + + +################################################################################ +## Datetime + +# Datetimes are RFC 3339 dates. + +[datetime] + +key1 = 1979-05-27T07:32:00Z +key2 = 1979-05-27T00:32:00-07:00 +key3 = 1979-05-27T00:32:00.999999-07:00 + + +################################################################################ +## Array + +# Arrays are square brackets with other primitives inside. Whitespace is +# ignored. Elements are separated by commas. Data types may not be mixed. + +[array] + +key1 = [ 1, 2, 3 ] +key2 = [ "red", "yellow", "green" ] +key3 = [ [ 1, 2 ], [3, 4, 5] ] +#key4 = [ [ 1, 2 ], ["a", "b", "c"] ] # this is ok + +# Arrays can also be multiline. So in addition to ignoring whitespace, arrays +# also ignore newlines between the brackets. Terminating commas are ok before +# the closing bracket. + +key5 = [ + 1, 2, 3 +] +key6 = [ + 1, + 2, # this is ok +] + + +################################################################################ +## Array of Tables + +# These can be expressed by using a table name in double brackets. Each table +# with the same double bracketed name will be an element in the array. The +# tables are inserted in the order encountered. + +[[products]] + +name = "Hammer" +sku = 738594937 + +[[products]] + +[[products]] + +name = "Nail" +sku = 284758393 +color = "gray" + + +# You can create nested arrays of tables as well. + +[[fruit]] + name = "apple" + + [fruit.physical] + color = "red" + shape = "round" + + [[fruit.variety]] + name = "red delicious" + + [[fruit.variety]] + name = "granny smith" + +[[fruit]] + name = "banana" + + [[fruit.variety]] + name = "plantain" diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/benchmark.yml b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/benchmark.yml new file mode 100644 index 00000000..0bd19f08 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/benchmark.yml @@ -0,0 +1,121 @@ +--- +array: + key1: + - 1 + - 2 + - 3 + key2: + - red + - yellow + - green + key3: + - - 1 + - 2 + - - 3 + - 4 + - 5 + key4: + - - 1 + - 2 + - - a + - b + - c + key5: + - 1 + - 2 + - 3 + key6: + - 1 + - 2 +boolean: + 'False': false + 'True': true +datetime: + key1: '1979-05-27T07:32:00Z' + key2: '1979-05-27T00:32:00-07:00' + key3: '1979-05-27T00:32:00.999999-07:00' +float: + both: + key: 6.626e-34 + exponent: + key1: 5.0e+22 + key2: 1000000 + key3: -0.02 + fractional: + key1: 1 + key2: 3.1415 + key3: -0.01 + underscores: + key1: 9224617.445991227 + key2: 1.0e+100 +fruit: +- name: apple + physical: + color: red + shape: round + variety: + - name: red delicious + - name: granny smith +- name: banana + variety: + - name: plantain +integer: + key1: 99 + key2: 42 + key3: 0 + key4: -17 + underscores: + key1: 1000 + key2: 5349221 + key3: 12345 +products: +- name: Hammer + sku: 738594937 +- {} +- color: gray + name: Nail + sku: 284758393 +string: + basic: + basic: "I'm a string. \"You can quote me\". Name\tJosé\nLocation\tSF." + literal: + multiline: + lines: | + The first newline is + trimmed in raw strings. + All other whitespace + is preserved. + regex2: I [dw]on't need \d{2} apples + quoted: Tom "Dubs" Preston-Werner + regex: "<\\i\\c*\\s*>" + winpath: C:\Users\nodejs\templates + winpath2: "\\\\ServerX\\admin$\\system32\\" + multiline: + continued: + key1: The quick brown fox jumps over the lazy dog. + key2: The quick brown fox jumps over the lazy dog. + key3: The quick brown fox jumps over the lazy dog. + key1: |- + One + Two + key2: |- + One + Two + key3: |- + One + Two +table: + inline: + name: + first: Tom + last: Preston-Werner + point: + x: 1 + y: 2 + key: value + subtable: + key: another value +x: + y: + z: + w: {} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/doc.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/doc.go new file mode 100644 index 00000000..d5fd98c0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/doc.go @@ -0,0 +1,23 @@ +// Package toml is a TOML parser and manipulation library. +// +// This version supports the specification as described in +// https://github.com/toml-lang/toml/blob/master/versions/en/toml-v0.4.0.md +// +// Marshaling +// +// Go-toml can marshal and unmarshal TOML documents from and to data +// structures. +// +// TOML document as a tree +// +// Go-toml can operate on a TOML document as a tree. Use one of the Load* +// functions to parse TOML data and obtain a Tree instance, then one of its +// methods to manipulate the tree. +// +// JSONPath-like queries +// +// The package github.com/pelletier/go-toml/query implements a system +// similar to JSONPath to quickly retrieve elements of a TOML document using a +// single expression. See the package documentation for more information. +// +package toml diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/example-crlf.toml b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/example-crlf.toml new file mode 100644 index 00000000..12950a16 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/example-crlf.toml @@ -0,0 +1,29 @@ +# This is a TOML document. Boom. + +title = "TOML Example" + +[owner] +name = "Tom Preston-Werner" +organization = "GitHub" +bio = "GitHub Cofounder & CEO\nLikes tater tots and beer." +dob = 1979-05-27T07:32:00Z # First class dates? Why not? + +[database] +server = "192.168.1.1" +ports = [ 8001, 8001, 8002 ] +connection_max = 5000 +enabled = true + +[servers] + + # You can indent as you please. Tabs or spaces. TOML don't care. + [servers.alpha] + ip = "10.0.0.1" + dc = "eqdc10" + + [servers.beta] + ip = "10.0.0.2" + dc = "eqdc10" + +[clients] +data = [ ["gamma", "delta"], [1, 2] ] # just an update to make sure parsers support it diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/example.toml b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/example.toml new file mode 100644 index 00000000..3d902f28 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/example.toml @@ -0,0 +1,29 @@ +# This is a TOML document. Boom. + +title = "TOML Example" + +[owner] +name = "Tom Preston-Werner" +organization = "GitHub" +bio = "GitHub Cofounder & CEO\nLikes tater tots and beer." +dob = 1979-05-27T07:32:00Z # First class dates? Why not? + +[database] +server = "192.168.1.1" +ports = [ 8001, 8001, 8002 ] +connection_max = 5000 +enabled = true + +[servers] + + # You can indent as you please. Tabs or spaces. TOML don't care. + [servers.alpha] + ip = "10.0.0.1" + dc = "eqdc10" + + [servers.beta] + ip = "10.0.0.2" + dc = "eqdc10" + +[clients] +data = [ ["gamma", "delta"], [1, 2] ] # just an update to make sure parsers support it diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/fuzz.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/fuzz.go new file mode 100644 index 00000000..14570c8d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/fuzz.go @@ -0,0 +1,31 @@ +// +build gofuzz + +package toml + +func Fuzz(data []byte) int { + tree, err := LoadBytes(data) + if err != nil { + if tree != nil { + panic("tree must be nil if there is an error") + } + return 0 + } + + str, err := tree.ToTomlString() + if err != nil { + if str != "" { + panic(`str must be "" if there is an error`) + } + panic(err) + } + + tree, err = Load(str) + if err != nil { + if tree != nil { + panic("tree must be nil if there is an error") + } + return 0 + } + + return 1 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/fuzz.sh b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/fuzz.sh new file mode 100755 index 00000000..3204b4c4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/fuzz.sh @@ -0,0 +1,15 @@ +#! /bin/sh +set -eu + +go get github.com/dvyukov/go-fuzz/go-fuzz +go get github.com/dvyukov/go-fuzz/go-fuzz-build + +if [ ! -e toml-fuzz.zip ]; then + go-fuzz-build github.com/pelletier/go-toml +fi + +rm -fr fuzz +mkdir -p fuzz/corpus +cp *.toml fuzz/corpus + +go-fuzz -bin=toml-fuzz.zip -workdir=fuzz diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/keysparsing.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/keysparsing.go new file mode 100644 index 00000000..284db646 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/keysparsing.go @@ -0,0 +1,85 @@ +// Parsing keys handling both bare and quoted keys. + +package toml + +import ( + "bytes" + "errors" + "fmt" + "unicode" +) + +// Convert the bare key group string to an array. +// The input supports double quotation to allow "." inside the key name, +// but escape sequences are not supported. Lexers must unescape them beforehand. +func parseKey(key string) ([]string, error) { + groups := []string{} + var buffer bytes.Buffer + inQuotes := false + wasInQuotes := false + ignoreSpace := true + expectDot := false + + for _, char := range key { + if ignoreSpace { + if char == ' ' { + continue + } + ignoreSpace = false + } + switch char { + case '"': + if inQuotes { + groups = append(groups, buffer.String()) + buffer.Reset() + wasInQuotes = true + } + inQuotes = !inQuotes + expectDot = false + case '.': + if inQuotes { + buffer.WriteRune(char) + } else { + if !wasInQuotes { + if buffer.Len() == 0 { + return nil, errors.New("empty table key") + } + groups = append(groups, buffer.String()) + buffer.Reset() + } + ignoreSpace = true + expectDot = false + wasInQuotes = false + } + case ' ': + if inQuotes { + buffer.WriteRune(char) + } else { + expectDot = true + } + default: + if !inQuotes && !isValidBareChar(char) { + return nil, fmt.Errorf("invalid bare character: %c", char) + } + if !inQuotes && expectDot { + return nil, errors.New("what?") + } + buffer.WriteRune(char) + expectDot = false + } + } + if inQuotes { + return nil, errors.New("mismatched quotes") + } + if buffer.Len() > 0 { + groups = append(groups, buffer.String()) + } + if len(groups) == 0 { + return nil, errors.New("empty key") + } + return groups, nil +} + +func isValidBareChar(r rune) bool { + return isAlphanumeric(r) || r == '-' || unicode.IsNumber(r) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/lexer.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/lexer.go new file mode 100644 index 00000000..d11de428 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/lexer.go @@ -0,0 +1,750 @@ +// TOML lexer. +// +// Written using the principles developed by Rob Pike in +// http://www.youtube.com/watch?v=HxaD_trXwRE + +package toml + +import ( + "bytes" + "errors" + "fmt" + "regexp" + "strconv" + "strings" +) + +var dateRegexp *regexp.Regexp + +// Define state functions +type tomlLexStateFn func() tomlLexStateFn + +// Define lexer +type tomlLexer struct { + inputIdx int + input []rune // Textual source + currentTokenStart int + currentTokenStop int + tokens []token + depth int + line int + col int + endbufferLine int + endbufferCol int +} + +// Basic read operations on input + +func (l *tomlLexer) read() rune { + r := l.peek() + if r == '\n' { + l.endbufferLine++ + l.endbufferCol = 1 + } else { + l.endbufferCol++ + } + l.inputIdx++ + return r +} + +func (l *tomlLexer) next() rune { + r := l.read() + + if r != eof { + l.currentTokenStop++ + } + return r +} + +func (l *tomlLexer) ignore() { + l.currentTokenStart = l.currentTokenStop + l.line = l.endbufferLine + l.col = l.endbufferCol +} + +func (l *tomlLexer) skip() { + l.next() + l.ignore() +} + +func (l *tomlLexer) fastForward(n int) { + for i := 0; i < n; i++ { + l.next() + } +} + +func (l *tomlLexer) emitWithValue(t tokenType, value string) { + l.tokens = append(l.tokens, token{ + Position: Position{l.line, l.col}, + typ: t, + val: value, + }) + l.ignore() +} + +func (l *tomlLexer) emit(t tokenType) { + l.emitWithValue(t, string(l.input[l.currentTokenStart:l.currentTokenStop])) +} + +func (l *tomlLexer) peek() rune { + if l.inputIdx >= len(l.input) { + return eof + } + return l.input[l.inputIdx] +} + +func (l *tomlLexer) peekString(size int) string { + maxIdx := len(l.input) + upperIdx := l.inputIdx + size // FIXME: potential overflow + if upperIdx > maxIdx { + upperIdx = maxIdx + } + return string(l.input[l.inputIdx:upperIdx]) +} + +func (l *tomlLexer) follow(next string) bool { + return next == l.peekString(len(next)) +} + +// Error management + +func (l *tomlLexer) errorf(format string, args ...interface{}) tomlLexStateFn { + l.tokens = append(l.tokens, token{ + Position: Position{l.line, l.col}, + typ: tokenError, + val: fmt.Sprintf(format, args...), + }) + return nil +} + +// State functions + +func (l *tomlLexer) lexVoid() tomlLexStateFn { + for { + next := l.peek() + switch next { + case '[': + return l.lexTableKey + case '#': + return l.lexComment(l.lexVoid) + case '=': + return l.lexEqual + case '\r': + fallthrough + case '\n': + l.skip() + continue + } + + if isSpace(next) { + l.skip() + } + + if l.depth > 0 { + return l.lexRvalue + } + + if isKeyStartChar(next) { + return l.lexKey + } + + if next == eof { + l.next() + break + } + } + + l.emit(tokenEOF) + return nil +} + +func (l *tomlLexer) lexRvalue() tomlLexStateFn { + for { + next := l.peek() + switch next { + case '.': + return l.errorf("cannot start float with a dot") + case '=': + return l.lexEqual + case '[': + l.depth++ + return l.lexLeftBracket + case ']': + l.depth-- + return l.lexRightBracket + case '{': + return l.lexLeftCurlyBrace + case '}': + return l.lexRightCurlyBrace + case '#': + return l.lexComment(l.lexRvalue) + case '"': + return l.lexString + case '\'': + return l.lexLiteralString + case ',': + return l.lexComma + case '\r': + fallthrough + case '\n': + l.skip() + if l.depth == 0 { + return l.lexVoid + } + return l.lexRvalue + case '_': + return l.errorf("cannot start number with underscore") + } + + if l.follow("true") { + return l.lexTrue + } + + if l.follow("false") { + return l.lexFalse + } + + if l.follow("inf") { + return l.lexInf + } + + if l.follow("nan") { + return l.lexNan + } + + if isSpace(next) { + l.skip() + continue + } + + if next == eof { + l.next() + break + } + + possibleDate := l.peekString(35) + dateMatch := dateRegexp.FindString(possibleDate) + if dateMatch != "" { + l.fastForward(len(dateMatch)) + return l.lexDate + } + + if next == '+' || next == '-' || isDigit(next) { + return l.lexNumber + } + + if isAlphanumeric(next) { + return l.lexKey + } + + return l.errorf("no value can start with %c", next) + } + + l.emit(tokenEOF) + return nil +} + +func (l *tomlLexer) lexLeftCurlyBrace() tomlLexStateFn { + l.next() + l.emit(tokenLeftCurlyBrace) + return l.lexRvalue +} + +func (l *tomlLexer) lexRightCurlyBrace() tomlLexStateFn { + l.next() + l.emit(tokenRightCurlyBrace) + return l.lexRvalue +} + +func (l *tomlLexer) lexDate() tomlLexStateFn { + l.emit(tokenDate) + return l.lexRvalue +} + +func (l *tomlLexer) lexTrue() tomlLexStateFn { + l.fastForward(4) + l.emit(tokenTrue) + return l.lexRvalue +} + +func (l *tomlLexer) lexFalse() tomlLexStateFn { + l.fastForward(5) + l.emit(tokenFalse) + return l.lexRvalue +} + +func (l *tomlLexer) lexInf() tomlLexStateFn { + l.fastForward(3) + l.emit(tokenInf) + return l.lexRvalue +} + +func (l *tomlLexer) lexNan() tomlLexStateFn { + l.fastForward(3) + l.emit(tokenNan) + return l.lexRvalue +} + +func (l *tomlLexer) lexEqual() tomlLexStateFn { + l.next() + l.emit(tokenEqual) + return l.lexRvalue +} + +func (l *tomlLexer) lexComma() tomlLexStateFn { + l.next() + l.emit(tokenComma) + return l.lexRvalue +} + +// Parse the key and emits its value without escape sequences. +// bare keys, basic string keys and literal string keys are supported. +func (l *tomlLexer) lexKey() tomlLexStateFn { + growingString := "" + + for r := l.peek(); isKeyChar(r) || r == '\n' || r == '\r'; r = l.peek() { + if r == '"' { + l.next() + str, err := l.lexStringAsString(`"`, false, true) + if err != nil { + return l.errorf(err.Error()) + } + growingString += str + l.next() + continue + } else if r == '\'' { + l.next() + str, err := l.lexLiteralStringAsString(`'`, false) + if err != nil { + return l.errorf(err.Error()) + } + growingString += str + l.next() + continue + } else if r == '\n' { + return l.errorf("keys cannot contain new lines") + } else if isSpace(r) { + break + } else if !isValidBareChar(r) { + return l.errorf("keys cannot contain %c character", r) + } + growingString += string(r) + l.next() + } + l.emitWithValue(tokenKey, growingString) + return l.lexVoid +} + +func (l *tomlLexer) lexComment(previousState tomlLexStateFn) tomlLexStateFn { + return func() tomlLexStateFn { + for next := l.peek(); next != '\n' && next != eof; next = l.peek() { + if next == '\r' && l.follow("\r\n") { + break + } + l.next() + } + l.ignore() + return previousState + } +} + +func (l *tomlLexer) lexLeftBracket() tomlLexStateFn { + l.next() + l.emit(tokenLeftBracket) + return l.lexRvalue +} + +func (l *tomlLexer) lexLiteralStringAsString(terminator string, discardLeadingNewLine bool) (string, error) { + growingString := "" + + if discardLeadingNewLine { + if l.follow("\r\n") { + l.skip() + l.skip() + } else if l.peek() == '\n' { + l.skip() + } + } + + // find end of string + for { + if l.follow(terminator) { + return growingString, nil + } + + next := l.peek() + if next == eof { + break + } + growingString += string(l.next()) + } + + return "", errors.New("unclosed string") +} + +func (l *tomlLexer) lexLiteralString() tomlLexStateFn { + l.skip() + + // handle special case for triple-quote + terminator := "'" + discardLeadingNewLine := false + if l.follow("''") { + l.skip() + l.skip() + terminator = "'''" + discardLeadingNewLine = true + } + + str, err := l.lexLiteralStringAsString(terminator, discardLeadingNewLine) + if err != nil { + return l.errorf(err.Error()) + } + + l.emitWithValue(tokenString, str) + l.fastForward(len(terminator)) + l.ignore() + return l.lexRvalue +} + +// Lex a string and return the results as a string. +// Terminator is the substring indicating the end of the token. +// The resulting string does not include the terminator. +func (l *tomlLexer) lexStringAsString(terminator string, discardLeadingNewLine, acceptNewLines bool) (string, error) { + growingString := "" + + if discardLeadingNewLine { + if l.follow("\r\n") { + l.skip() + l.skip() + } else if l.peek() == '\n' { + l.skip() + } + } + + for { + if l.follow(terminator) { + return growingString, nil + } + + if l.follow("\\") { + l.next() + switch l.peek() { + case '\r': + fallthrough + case '\n': + fallthrough + case '\t': + fallthrough + case ' ': + // skip all whitespace chars following backslash + for strings.ContainsRune("\r\n\t ", l.peek()) { + l.next() + } + case '"': + growingString += "\"" + l.next() + case 'n': + growingString += "\n" + l.next() + case 'b': + growingString += "\b" + l.next() + case 'f': + growingString += "\f" + l.next() + case '/': + growingString += "/" + l.next() + case 't': + growingString += "\t" + l.next() + case 'r': + growingString += "\r" + l.next() + case '\\': + growingString += "\\" + l.next() + case 'u': + l.next() + code := "" + for i := 0; i < 4; i++ { + c := l.peek() + if !isHexDigit(c) { + return "", errors.New("unfinished unicode escape") + } + l.next() + code = code + string(c) + } + intcode, err := strconv.ParseInt(code, 16, 32) + if err != nil { + return "", errors.New("invalid unicode escape: \\u" + code) + } + growingString += string(rune(intcode)) + case 'U': + l.next() + code := "" + for i := 0; i < 8; i++ { + c := l.peek() + if !isHexDigit(c) { + return "", errors.New("unfinished unicode escape") + } + l.next() + code = code + string(c) + } + intcode, err := strconv.ParseInt(code, 16, 64) + if err != nil { + return "", errors.New("invalid unicode escape: \\U" + code) + } + growingString += string(rune(intcode)) + default: + return "", errors.New("invalid escape sequence: \\" + string(l.peek())) + } + } else { + r := l.peek() + + if 0x00 <= r && r <= 0x1F && !(acceptNewLines && (r == '\n' || r == '\r')) { + return "", fmt.Errorf("unescaped control character %U", r) + } + l.next() + growingString += string(r) + } + + if l.peek() == eof { + break + } + } + + return "", errors.New("unclosed string") +} + +func (l *tomlLexer) lexString() tomlLexStateFn { + l.skip() + + // handle special case for triple-quote + terminator := `"` + discardLeadingNewLine := false + acceptNewLines := false + if l.follow(`""`) { + l.skip() + l.skip() + terminator = `"""` + discardLeadingNewLine = true + acceptNewLines = true + } + + str, err := l.lexStringAsString(terminator, discardLeadingNewLine, acceptNewLines) + + if err != nil { + return l.errorf(err.Error()) + } + + l.emitWithValue(tokenString, str) + l.fastForward(len(terminator)) + l.ignore() + return l.lexRvalue +} + +func (l *tomlLexer) lexTableKey() tomlLexStateFn { + l.next() + + if l.peek() == '[' { + // token '[[' signifies an array of tables + l.next() + l.emit(tokenDoubleLeftBracket) + return l.lexInsideTableArrayKey + } + // vanilla table key + l.emit(tokenLeftBracket) + return l.lexInsideTableKey +} + +// Parse the key till "]]", but only bare keys are supported +func (l *tomlLexer) lexInsideTableArrayKey() tomlLexStateFn { + for r := l.peek(); r != eof; r = l.peek() { + switch r { + case ']': + if l.currentTokenStop > l.currentTokenStart { + l.emit(tokenKeyGroupArray) + } + l.next() + if l.peek() != ']' { + break + } + l.next() + l.emit(tokenDoubleRightBracket) + return l.lexVoid + case '[': + return l.errorf("table array key cannot contain ']'") + default: + l.next() + } + } + return l.errorf("unclosed table array key") +} + +// Parse the key till "]" but only bare keys are supported +func (l *tomlLexer) lexInsideTableKey() tomlLexStateFn { + for r := l.peek(); r != eof; r = l.peek() { + switch r { + case ']': + if l.currentTokenStop > l.currentTokenStart { + l.emit(tokenKeyGroup) + } + l.next() + l.emit(tokenRightBracket) + return l.lexVoid + case '[': + return l.errorf("table key cannot contain ']'") + default: + l.next() + } + } + return l.errorf("unclosed table key") +} + +func (l *tomlLexer) lexRightBracket() tomlLexStateFn { + l.next() + l.emit(tokenRightBracket) + return l.lexRvalue +} + +type validRuneFn func(r rune) bool + +func isValidHexRune(r rune) bool { + return r >= 'a' && r <= 'f' || + r >= 'A' && r <= 'F' || + r >= '0' && r <= '9' || + r == '_' +} + +func isValidOctalRune(r rune) bool { + return r >= '0' && r <= '7' || r == '_' +} + +func isValidBinaryRune(r rune) bool { + return r == '0' || r == '1' || r == '_' +} + +func (l *tomlLexer) lexNumber() tomlLexStateFn { + r := l.peek() + + if r == '0' { + follow := l.peekString(2) + if len(follow) == 2 { + var isValidRune validRuneFn + switch follow[1] { + case 'x': + isValidRune = isValidHexRune + case 'o': + isValidRune = isValidOctalRune + case 'b': + isValidRune = isValidBinaryRune + default: + if follow[1] >= 'a' && follow[1] <= 'z' || follow[1] >= 'A' && follow[1] <= 'Z' { + return l.errorf("unknown number base: %s. possible options are x (hex) o (octal) b (binary)", string(follow[1])) + } + } + + if isValidRune != nil { + l.next() + l.next() + digitSeen := false + for { + next := l.peek() + if !isValidRune(next) { + break + } + digitSeen = true + l.next() + } + + if !digitSeen { + return l.errorf("number needs at least one digit") + } + + l.emit(tokenInteger) + + return l.lexRvalue + } + } + } + + if r == '+' || r == '-' { + l.next() + if l.follow("inf") { + return l.lexInf + } + if l.follow("nan") { + return l.lexNan + } + } + + pointSeen := false + expSeen := false + digitSeen := false + for { + next := l.peek() + if next == '.' { + if pointSeen { + return l.errorf("cannot have two dots in one float") + } + l.next() + if !isDigit(l.peek()) { + return l.errorf("float cannot end with a dot") + } + pointSeen = true + } else if next == 'e' || next == 'E' { + expSeen = true + l.next() + r := l.peek() + if r == '+' || r == '-' { + l.next() + } + } else if isDigit(next) { + digitSeen = true + l.next() + } else if next == '_' { + l.next() + } else { + break + } + if pointSeen && !digitSeen { + return l.errorf("cannot start float with a dot") + } + } + + if !digitSeen { + return l.errorf("no digit in that number") + } + if pointSeen || expSeen { + l.emit(tokenFloat) + } else { + l.emit(tokenInteger) + } + return l.lexRvalue +} + +func (l *tomlLexer) run() { + for state := l.lexVoid; state != nil; { + state = state() + } +} + +func init() { + dateRegexp = regexp.MustCompile(`^\d{1,4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d{1,9})?(Z|[+-]\d{2}:\d{2})`) +} + +// Entry point +func lexToml(inputBytes []byte) []token { + runes := bytes.Runes(inputBytes) + l := &tomlLexer{ + input: runes, + tokens: make([]token, 0, 256), + line: 1, + col: 1, + endbufferLine: 1, + endbufferCol: 1, + } + l.run() + return l.tokens +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/marshal.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/marshal.go new file mode 100644 index 00000000..671da556 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/marshal.go @@ -0,0 +1,609 @@ +package toml + +import ( + "bytes" + "errors" + "fmt" + "io" + "reflect" + "strconv" + "strings" + "time" +) + +const tagKeyMultiline = "multiline" + +type tomlOpts struct { + name string + comment string + commented bool + multiline bool + include bool + omitempty bool +} + +type encOpts struct { + quoteMapKeys bool + arraysOneElementPerLine bool +} + +var encOptsDefaults = encOpts{ + quoteMapKeys: false, +} + +var timeType = reflect.TypeOf(time.Time{}) +var marshalerType = reflect.TypeOf(new(Marshaler)).Elem() + +// Check if the given marshall type maps to a Tree primitive +func isPrimitive(mtype reflect.Type) bool { + switch mtype.Kind() { + case reflect.Ptr: + return isPrimitive(mtype.Elem()) + case reflect.Bool: + return true + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return true + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + return true + case reflect.Float32, reflect.Float64: + return true + case reflect.String: + return true + case reflect.Struct: + return mtype == timeType || isCustomMarshaler(mtype) + default: + return false + } +} + +// Check if the given marshall type maps to a Tree slice +func isTreeSlice(mtype reflect.Type) bool { + switch mtype.Kind() { + case reflect.Slice: + return !isOtherSlice(mtype) + default: + return false + } +} + +// Check if the given marshall type maps to a non-Tree slice +func isOtherSlice(mtype reflect.Type) bool { + switch mtype.Kind() { + case reflect.Ptr: + return isOtherSlice(mtype.Elem()) + case reflect.Slice: + return isPrimitive(mtype.Elem()) || isOtherSlice(mtype.Elem()) + default: + return false + } +} + +// Check if the given marshall type maps to a Tree +func isTree(mtype reflect.Type) bool { + switch mtype.Kind() { + case reflect.Map: + return true + case reflect.Struct: + return !isPrimitive(mtype) + default: + return false + } +} + +func isCustomMarshaler(mtype reflect.Type) bool { + return mtype.Implements(marshalerType) +} + +func callCustomMarshaler(mval reflect.Value) ([]byte, error) { + return mval.Interface().(Marshaler).MarshalTOML() +} + +// Marshaler is the interface implemented by types that +// can marshal themselves into valid TOML. +type Marshaler interface { + MarshalTOML() ([]byte, error) +} + +/* +Marshal returns the TOML encoding of v. Behavior is similar to the Go json +encoder, except that there is no concept of a Marshaler interface or MarshalTOML +function for sub-structs, and currently only definite types can be marshaled +(i.e. no `interface{}`). + +The following struct annotations are supported: + + toml:"Field" Overrides the field's name to output. + omitempty When set, empty values and groups are not emitted. + comment:"comment" Emits a # comment on the same line. This supports new lines. + commented:"true" Emits the value as commented. + +Note that pointers are automatically assigned the "omitempty" option, as TOML +explicitly does not handle null values (saying instead the label should be +dropped). + +Tree structural types and corresponding marshal types: + + *Tree (*)struct, (*)map[string]interface{} + []*Tree (*)[](*)struct, (*)[](*)map[string]interface{} + []interface{} (as interface{}) (*)[]primitive, (*)[]([]interface{}) + interface{} (*)primitive + +Tree primitive types and corresponding marshal types: + + uint64 uint, uint8-uint64, pointers to same + int64 int, int8-uint64, pointers to same + float64 float32, float64, pointers to same + string string, pointers to same + bool bool, pointers to same + time.Time time.Time{}, pointers to same +*/ +func Marshal(v interface{}) ([]byte, error) { + return NewEncoder(nil).marshal(v) +} + +// Encoder writes TOML values to an output stream. +type Encoder struct { + w io.Writer + encOpts +} + +// NewEncoder returns a new encoder that writes to w. +func NewEncoder(w io.Writer) *Encoder { + return &Encoder{ + w: w, + encOpts: encOptsDefaults, + } +} + +// Encode writes the TOML encoding of v to the stream. +// +// See the documentation for Marshal for details. +func (e *Encoder) Encode(v interface{}) error { + b, err := e.marshal(v) + if err != nil { + return err + } + if _, err := e.w.Write(b); err != nil { + return err + } + return nil +} + +// QuoteMapKeys sets up the encoder to encode +// maps with string type keys with quoted TOML keys. +// +// This relieves the character limitations on map keys. +func (e *Encoder) QuoteMapKeys(v bool) *Encoder { + e.quoteMapKeys = v + return e +} + +// ArraysWithOneElementPerLine sets up the encoder to encode arrays +// with more than one element on multiple lines instead of one. +// +// For example: +// +// A = [1,2,3] +// +// Becomes +// +// A = [ +// 1, +// 2, +// 3, +// ] +func (e *Encoder) ArraysWithOneElementPerLine(v bool) *Encoder { + e.arraysOneElementPerLine = v + return e +} + +func (e *Encoder) marshal(v interface{}) ([]byte, error) { + mtype := reflect.TypeOf(v) + if mtype.Kind() != reflect.Struct { + return []byte{}, errors.New("Only a struct can be marshaled to TOML") + } + sval := reflect.ValueOf(v) + if isCustomMarshaler(mtype) { + return callCustomMarshaler(sval) + } + t, err := e.valueToTree(mtype, sval) + if err != nil { + return []byte{}, err + } + + var buf bytes.Buffer + _, err = t.writeTo(&buf, "", "", 0, e.arraysOneElementPerLine) + + return buf.Bytes(), err +} + +// Convert given marshal struct or map value to toml tree +func (e *Encoder) valueToTree(mtype reflect.Type, mval reflect.Value) (*Tree, error) { + if mtype.Kind() == reflect.Ptr { + return e.valueToTree(mtype.Elem(), mval.Elem()) + } + tval := newTree() + switch mtype.Kind() { + case reflect.Struct: + for i := 0; i < mtype.NumField(); i++ { + mtypef, mvalf := mtype.Field(i), mval.Field(i) + opts := tomlOptions(mtypef) + if opts.include && (!opts.omitempty || !isZero(mvalf)) { + val, err := e.valueToToml(mtypef.Type, mvalf) + if err != nil { + return nil, err + } + + tval.SetWithOptions(opts.name, SetOptions{ + Comment: opts.comment, + Commented: opts.commented, + Multiline: opts.multiline, + }, val) + } + } + case reflect.Map: + for _, key := range mval.MapKeys() { + mvalf := mval.MapIndex(key) + val, err := e.valueToToml(mtype.Elem(), mvalf) + if err != nil { + return nil, err + } + if e.quoteMapKeys { + keyStr, err := tomlValueStringRepresentation(key.String(), "", e.arraysOneElementPerLine) + if err != nil { + return nil, err + } + tval.SetPath([]string{keyStr}, val) + } else { + tval.Set(key.String(), val) + } + } + } + return tval, nil +} + +// Convert given marshal slice to slice of Toml trees +func (e *Encoder) valueToTreeSlice(mtype reflect.Type, mval reflect.Value) ([]*Tree, error) { + tval := make([]*Tree, mval.Len(), mval.Len()) + for i := 0; i < mval.Len(); i++ { + val, err := e.valueToTree(mtype.Elem(), mval.Index(i)) + if err != nil { + return nil, err + } + tval[i] = val + } + return tval, nil +} + +// Convert given marshal slice to slice of toml values +func (e *Encoder) valueToOtherSlice(mtype reflect.Type, mval reflect.Value) (interface{}, error) { + tval := make([]interface{}, mval.Len(), mval.Len()) + for i := 0; i < mval.Len(); i++ { + val, err := e.valueToToml(mtype.Elem(), mval.Index(i)) + if err != nil { + return nil, err + } + tval[i] = val + } + return tval, nil +} + +// Convert given marshal value to toml value +func (e *Encoder) valueToToml(mtype reflect.Type, mval reflect.Value) (interface{}, error) { + if mtype.Kind() == reflect.Ptr { + return e.valueToToml(mtype.Elem(), mval.Elem()) + } + switch { + case isCustomMarshaler(mtype): + return callCustomMarshaler(mval) + case isTree(mtype): + return e.valueToTree(mtype, mval) + case isTreeSlice(mtype): + return e.valueToTreeSlice(mtype, mval) + case isOtherSlice(mtype): + return e.valueToOtherSlice(mtype, mval) + default: + switch mtype.Kind() { + case reflect.Bool: + return mval.Bool(), nil + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return mval.Int(), nil + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + return mval.Uint(), nil + case reflect.Float32, reflect.Float64: + return mval.Float(), nil + case reflect.String: + return mval.String(), nil + case reflect.Struct: + return mval.Interface().(time.Time), nil + default: + return nil, fmt.Errorf("Marshal can't handle %v(%v)", mtype, mtype.Kind()) + } + } +} + +// Unmarshal attempts to unmarshal the Tree into a Go struct pointed by v. +// Neither Unmarshaler interfaces nor UnmarshalTOML functions are supported for +// sub-structs, and only definite types can be unmarshaled. +func (t *Tree) Unmarshal(v interface{}) error { + d := Decoder{tval: t} + return d.unmarshal(v) +} + +// Marshal returns the TOML encoding of Tree. +// See Marshal() documentation for types mapping table. +func (t *Tree) Marshal() ([]byte, error) { + var buf bytes.Buffer + err := NewEncoder(&buf).Encode(t) + return buf.Bytes(), err +} + +// Unmarshal parses the TOML-encoded data and stores the result in the value +// pointed to by v. Behavior is similar to the Go json encoder, except that there +// is no concept of an Unmarshaler interface or UnmarshalTOML function for +// sub-structs, and currently only definite types can be unmarshaled to (i.e. no +// `interface{}`). +// +// The following struct annotations are supported: +// +// toml:"Field" Overrides the field's name to map to. +// +// See Marshal() documentation for types mapping table. +func Unmarshal(data []byte, v interface{}) error { + t, err := LoadReader(bytes.NewReader(data)) + if err != nil { + return err + } + return t.Unmarshal(v) +} + +// Decoder reads and decodes TOML values from an input stream. +type Decoder struct { + r io.Reader + tval *Tree + encOpts +} + +// NewDecoder returns a new decoder that reads from r. +func NewDecoder(r io.Reader) *Decoder { + return &Decoder{ + r: r, + encOpts: encOptsDefaults, + } +} + +// Decode reads a TOML-encoded value from it's input +// and unmarshals it in the value pointed at by v. +// +// See the documentation for Marshal for details. +func (d *Decoder) Decode(v interface{}) error { + var err error + d.tval, err = LoadReader(d.r) + if err != nil { + return err + } + return d.unmarshal(v) +} + +func (d *Decoder) unmarshal(v interface{}) error { + mtype := reflect.TypeOf(v) + if mtype.Kind() != reflect.Ptr || mtype.Elem().Kind() != reflect.Struct { + return errors.New("Only a pointer to struct can be unmarshaled from TOML") + } + + sval, err := d.valueFromTree(mtype.Elem(), d.tval) + if err != nil { + return err + } + reflect.ValueOf(v).Elem().Set(sval) + return nil +} + +// Convert toml tree to marshal struct or map, using marshal type +func (d *Decoder) valueFromTree(mtype reflect.Type, tval *Tree) (reflect.Value, error) { + if mtype.Kind() == reflect.Ptr { + return d.unwrapPointer(mtype, tval) + } + var mval reflect.Value + switch mtype.Kind() { + case reflect.Struct: + mval = reflect.New(mtype).Elem() + for i := 0; i < mtype.NumField(); i++ { + mtypef := mtype.Field(i) + opts := tomlOptions(mtypef) + if opts.include { + baseKey := opts.name + keysToTry := []string{baseKey, strings.ToLower(baseKey), strings.ToTitle(baseKey)} + for _, key := range keysToTry { + exists := tval.Has(key) + if !exists { + continue + } + val := tval.Get(key) + mvalf, err := d.valueFromToml(mtypef.Type, val) + if err != nil { + return mval, formatError(err, tval.GetPosition(key)) + } + mval.Field(i).Set(mvalf) + break + } + } + } + case reflect.Map: + mval = reflect.MakeMap(mtype) + for _, key := range tval.Keys() { + // TODO: path splits key + val := tval.GetPath([]string{key}) + mvalf, err := d.valueFromToml(mtype.Elem(), val) + if err != nil { + return mval, formatError(err, tval.GetPosition(key)) + } + mval.SetMapIndex(reflect.ValueOf(key), mvalf) + } + } + return mval, nil +} + +// Convert toml value to marshal struct/map slice, using marshal type +func (d *Decoder) valueFromTreeSlice(mtype reflect.Type, tval []*Tree) (reflect.Value, error) { + mval := reflect.MakeSlice(mtype, len(tval), len(tval)) + for i := 0; i < len(tval); i++ { + val, err := d.valueFromTree(mtype.Elem(), tval[i]) + if err != nil { + return mval, err + } + mval.Index(i).Set(val) + } + return mval, nil +} + +// Convert toml value to marshal primitive slice, using marshal type +func (d *Decoder) valueFromOtherSlice(mtype reflect.Type, tval []interface{}) (reflect.Value, error) { + mval := reflect.MakeSlice(mtype, len(tval), len(tval)) + for i := 0; i < len(tval); i++ { + val, err := d.valueFromToml(mtype.Elem(), tval[i]) + if err != nil { + return mval, err + } + mval.Index(i).Set(val) + } + return mval, nil +} + +// Convert toml value to marshal value, using marshal type +func (d *Decoder) valueFromToml(mtype reflect.Type, tval interface{}) (reflect.Value, error) { + if mtype.Kind() == reflect.Ptr { + return d.unwrapPointer(mtype, tval) + } + + switch tval.(type) { + case *Tree: + if isTree(mtype) { + return d.valueFromTree(mtype, tval.(*Tree)) + } + return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to a tree", tval, tval) + case []*Tree: + if isTreeSlice(mtype) { + return d.valueFromTreeSlice(mtype, tval.([]*Tree)) + } + return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to trees", tval, tval) + case []interface{}: + if isOtherSlice(mtype) { + return d.valueFromOtherSlice(mtype, tval.([]interface{})) + } + return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to a slice", tval, tval) + default: + switch mtype.Kind() { + case reflect.Bool, reflect.Struct: + val := reflect.ValueOf(tval) + // if this passes for when mtype is reflect.Struct, tval is a time.Time + if !val.Type().ConvertibleTo(mtype) { + return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v", tval, tval, mtype.String()) + } + + return val.Convert(mtype), nil + case reflect.String: + val := reflect.ValueOf(tval) + // stupidly, int64 is convertible to string. So special case this. + if !val.Type().ConvertibleTo(mtype) || val.Kind() == reflect.Int64 { + return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v", tval, tval, mtype.String()) + } + + return val.Convert(mtype), nil + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + val := reflect.ValueOf(tval) + if !val.Type().ConvertibleTo(mtype) { + return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v", tval, tval, mtype.String()) + } + if reflect.Indirect(reflect.New(mtype)).OverflowInt(val.Int()) { + return reflect.ValueOf(nil), fmt.Errorf("%v(%T) would overflow %v", tval, tval, mtype.String()) + } + + return val.Convert(mtype), nil + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + val := reflect.ValueOf(tval) + if !val.Type().ConvertibleTo(mtype) { + return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v", tval, tval, mtype.String()) + } + if val.Int() < 0 { + return reflect.ValueOf(nil), fmt.Errorf("%v(%T) is negative so does not fit in %v", tval, tval, mtype.String()) + } + if reflect.Indirect(reflect.New(mtype)).OverflowUint(uint64(val.Int())) { + return reflect.ValueOf(nil), fmt.Errorf("%v(%T) would overflow %v", tval, tval, mtype.String()) + } + + return val.Convert(mtype), nil + case reflect.Float32, reflect.Float64: + val := reflect.ValueOf(tval) + if !val.Type().ConvertibleTo(mtype) { + return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v", tval, tval, mtype.String()) + } + if reflect.Indirect(reflect.New(mtype)).OverflowFloat(val.Float()) { + return reflect.ValueOf(nil), fmt.Errorf("%v(%T) would overflow %v", tval, tval, mtype.String()) + } + + return val.Convert(mtype), nil + default: + return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v(%v)", tval, tval, mtype, mtype.Kind()) + } + } +} + +func (d *Decoder) unwrapPointer(mtype reflect.Type, tval interface{}) (reflect.Value, error) { + val, err := d.valueFromToml(mtype.Elem(), tval) + if err != nil { + return reflect.ValueOf(nil), err + } + mval := reflect.New(mtype.Elem()) + mval.Elem().Set(val) + return mval, nil +} + +func tomlOptions(vf reflect.StructField) tomlOpts { + tag := vf.Tag.Get("toml") + parse := strings.Split(tag, ",") + var comment string + if c := vf.Tag.Get("comment"); c != "" { + comment = c + } + commented, _ := strconv.ParseBool(vf.Tag.Get("commented")) + multiline, _ := strconv.ParseBool(vf.Tag.Get(tagKeyMultiline)) + result := tomlOpts{name: vf.Name, comment: comment, commented: commented, multiline: multiline, include: true, omitempty: false} + if parse[0] != "" { + if parse[0] == "-" && len(parse) == 1 { + result.include = false + } else { + result.name = strings.Trim(parse[0], " ") + } + } + if vf.PkgPath != "" { + result.include = false + } + if len(parse) > 1 && strings.Trim(parse[1], " ") == "omitempty" { + result.omitempty = true + } + if vf.Type.Kind() == reflect.Ptr { + result.omitempty = true + } + return result +} + +func isZero(val reflect.Value) bool { + switch val.Type().Kind() { + case reflect.Map: + fallthrough + case reflect.Array: + fallthrough + case reflect.Slice: + return val.Len() == 0 + default: + return reflect.DeepEqual(val.Interface(), reflect.Zero(val.Type()).Interface()) + } +} + +func formatError(err error, pos Position) error { + if err.Error()[0] == '(' { // Error already contains position information + return err + } + return fmt.Errorf("%s: %s", pos, err) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/marshal_test.toml b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/marshal_test.toml new file mode 100644 index 00000000..1c5f98e7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/marshal_test.toml @@ -0,0 +1,38 @@ +title = "TOML Marshal Testing" + +[basic] + bool = true + date = 1979-05-27T07:32:00Z + float = 123.4 + int = 5000 + string = "Bite me" + uint = 5001 + +[basic_lists] + bools = [true,false,true] + dates = [1979-05-27T07:32:00Z,1980-05-27T07:32:00Z] + floats = [12.3,45.6,78.9] + ints = [8001,8001,8002] + strings = ["One","Two","Three"] + uints = [5002,5003] + +[basic_map] + one = "one" + two = "two" + +[subdoc] + + [subdoc.first] + name = "First" + + [subdoc.second] + name = "Second" + +[[subdoclist]] + name = "List.First" + +[[subdoclist]] + name = "List.Second" + +[[subdocptrs]] + name = "Second" diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/parser.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/parser.go new file mode 100644 index 00000000..2d27599a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/parser.go @@ -0,0 +1,430 @@ +// TOML Parser. + +package toml + +import ( + "errors" + "fmt" + "math" + "reflect" + "regexp" + "strconv" + "strings" + "time" +) + +type tomlParser struct { + flowIdx int + flow []token + tree *Tree + currentTable []string + seenTableKeys []string +} + +type tomlParserStateFn func() tomlParserStateFn + +// Formats and panics an error message based on a token +func (p *tomlParser) raiseError(tok *token, msg string, args ...interface{}) { + panic(tok.Position.String() + ": " + fmt.Sprintf(msg, args...)) +} + +func (p *tomlParser) run() { + for state := p.parseStart; state != nil; { + state = state() + } +} + +func (p *tomlParser) peek() *token { + if p.flowIdx >= len(p.flow) { + return nil + } + return &p.flow[p.flowIdx] +} + +func (p *tomlParser) assume(typ tokenType) { + tok := p.getToken() + if tok == nil { + p.raiseError(tok, "was expecting token %s, but token stream is empty", tok) + } + if tok.typ != typ { + p.raiseError(tok, "was expecting token %s, but got %s instead", typ, tok) + } +} + +func (p *tomlParser) getToken() *token { + tok := p.peek() + if tok == nil { + return nil + } + p.flowIdx++ + return tok +} + +func (p *tomlParser) parseStart() tomlParserStateFn { + tok := p.peek() + + // end of stream, parsing is finished + if tok == nil { + return nil + } + + switch tok.typ { + case tokenDoubleLeftBracket: + return p.parseGroupArray + case tokenLeftBracket: + return p.parseGroup + case tokenKey: + return p.parseAssign + case tokenEOF: + return nil + default: + p.raiseError(tok, "unexpected token") + } + return nil +} + +func (p *tomlParser) parseGroupArray() tomlParserStateFn { + startToken := p.getToken() // discard the [[ + key := p.getToken() + if key.typ != tokenKeyGroupArray { + p.raiseError(key, "unexpected token %s, was expecting a table array key", key) + } + + // get or create table array element at the indicated part in the path + keys, err := parseKey(key.val) + if err != nil { + p.raiseError(key, "invalid table array key: %s", err) + } + p.tree.createSubTree(keys[:len(keys)-1], startToken.Position) // create parent entries + destTree := p.tree.GetPath(keys) + var array []*Tree + if destTree == nil { + array = make([]*Tree, 0) + } else if target, ok := destTree.([]*Tree); ok && target != nil { + array = destTree.([]*Tree) + } else { + p.raiseError(key, "key %s is already assigned and not of type table array", key) + } + p.currentTable = keys + + // add a new tree to the end of the table array + newTree := newTree() + newTree.position = startToken.Position + array = append(array, newTree) + p.tree.SetPath(p.currentTable, array) + + // remove all keys that were children of this table array + prefix := key.val + "." + found := false + for ii := 0; ii < len(p.seenTableKeys); { + tableKey := p.seenTableKeys[ii] + if strings.HasPrefix(tableKey, prefix) { + p.seenTableKeys = append(p.seenTableKeys[:ii], p.seenTableKeys[ii+1:]...) + } else { + found = (tableKey == key.val) + ii++ + } + } + + // keep this key name from use by other kinds of assignments + if !found { + p.seenTableKeys = append(p.seenTableKeys, key.val) + } + + // move to next parser state + p.assume(tokenDoubleRightBracket) + return p.parseStart +} + +func (p *tomlParser) parseGroup() tomlParserStateFn { + startToken := p.getToken() // discard the [ + key := p.getToken() + if key.typ != tokenKeyGroup { + p.raiseError(key, "unexpected token %s, was expecting a table key", key) + } + for _, item := range p.seenTableKeys { + if item == key.val { + p.raiseError(key, "duplicated tables") + } + } + + p.seenTableKeys = append(p.seenTableKeys, key.val) + keys, err := parseKey(key.val) + if err != nil { + p.raiseError(key, "invalid table array key: %s", err) + } + if err := p.tree.createSubTree(keys, startToken.Position); err != nil { + p.raiseError(key, "%s", err) + } + p.assume(tokenRightBracket) + p.currentTable = keys + return p.parseStart +} + +func (p *tomlParser) parseAssign() tomlParserStateFn { + key := p.getToken() + p.assume(tokenEqual) + + value := p.parseRvalue() + var tableKey []string + if len(p.currentTable) > 0 { + tableKey = p.currentTable + } else { + tableKey = []string{} + } + + // find the table to assign, looking out for arrays of tables + var targetNode *Tree + switch node := p.tree.GetPath(tableKey).(type) { + case []*Tree: + targetNode = node[len(node)-1] + case *Tree: + targetNode = node + default: + p.raiseError(key, "Unknown table type for path: %s", + strings.Join(tableKey, ".")) + } + + // assign value to the found table + keyVals := []string{key.val} + if len(keyVals) != 1 { + p.raiseError(key, "Invalid key") + } + keyVal := keyVals[0] + localKey := []string{keyVal} + finalKey := append(tableKey, keyVal) + if targetNode.GetPath(localKey) != nil { + p.raiseError(key, "The following key was defined twice: %s", + strings.Join(finalKey, ".")) + } + var toInsert interface{} + + switch value.(type) { + case *Tree, []*Tree: + toInsert = value + default: + toInsert = &tomlValue{value: value, position: key.Position} + } + targetNode.values[keyVal] = toInsert + return p.parseStart +} + +var numberUnderscoreInvalidRegexp *regexp.Regexp +var hexNumberUnderscoreInvalidRegexp *regexp.Regexp + +func numberContainsInvalidUnderscore(value string) error { + if numberUnderscoreInvalidRegexp.MatchString(value) { + return errors.New("invalid use of _ in number") + } + return nil +} + +func hexNumberContainsInvalidUnderscore(value string) error { + if hexNumberUnderscoreInvalidRegexp.MatchString(value) { + return errors.New("invalid use of _ in hex number") + } + return nil +} + +func cleanupNumberToken(value string) string { + cleanedVal := strings.Replace(value, "_", "", -1) + return cleanedVal +} + +func (p *tomlParser) parseRvalue() interface{} { + tok := p.getToken() + if tok == nil || tok.typ == tokenEOF { + p.raiseError(tok, "expecting a value") + } + + switch tok.typ { + case tokenString: + return tok.val + case tokenTrue: + return true + case tokenFalse: + return false + case tokenInf: + if tok.val[0] == '-' { + return math.Inf(-1) + } + return math.Inf(1) + case tokenNan: + return math.NaN() + case tokenInteger: + cleanedVal := cleanupNumberToken(tok.val) + var err error + var val int64 + if len(cleanedVal) >= 3 && cleanedVal[0] == '0' { + switch cleanedVal[1] { + case 'x': + err = hexNumberContainsInvalidUnderscore(tok.val) + if err != nil { + p.raiseError(tok, "%s", err) + } + val, err = strconv.ParseInt(cleanedVal[2:], 16, 64) + case 'o': + err = numberContainsInvalidUnderscore(tok.val) + if err != nil { + p.raiseError(tok, "%s", err) + } + val, err = strconv.ParseInt(cleanedVal[2:], 8, 64) + case 'b': + err = numberContainsInvalidUnderscore(tok.val) + if err != nil { + p.raiseError(tok, "%s", err) + } + val, err = strconv.ParseInt(cleanedVal[2:], 2, 64) + default: + panic("invalid base") // the lexer should catch this first + } + } else { + err = numberContainsInvalidUnderscore(tok.val) + if err != nil { + p.raiseError(tok, "%s", err) + } + val, err = strconv.ParseInt(cleanedVal, 10, 64) + } + if err != nil { + p.raiseError(tok, "%s", err) + } + return val + case tokenFloat: + err := numberContainsInvalidUnderscore(tok.val) + if err != nil { + p.raiseError(tok, "%s", err) + } + cleanedVal := cleanupNumberToken(tok.val) + val, err := strconv.ParseFloat(cleanedVal, 64) + if err != nil { + p.raiseError(tok, "%s", err) + } + return val + case tokenDate: + val, err := time.ParseInLocation(time.RFC3339Nano, tok.val, time.UTC) + if err != nil { + p.raiseError(tok, "%s", err) + } + return val + case tokenLeftBracket: + return p.parseArray() + case tokenLeftCurlyBrace: + return p.parseInlineTable() + case tokenEqual: + p.raiseError(tok, "cannot have multiple equals for the same key") + case tokenError: + p.raiseError(tok, "%s", tok) + } + + p.raiseError(tok, "never reached") + + return nil +} + +func tokenIsComma(t *token) bool { + return t != nil && t.typ == tokenComma +} + +func (p *tomlParser) parseInlineTable() *Tree { + tree := newTree() + var previous *token +Loop: + for { + follow := p.peek() + if follow == nil || follow.typ == tokenEOF { + p.raiseError(follow, "unterminated inline table") + } + switch follow.typ { + case tokenRightCurlyBrace: + p.getToken() + break Loop + case tokenKey: + if !tokenIsComma(previous) && previous != nil { + p.raiseError(follow, "comma expected between fields in inline table") + } + key := p.getToken() + p.assume(tokenEqual) + value := p.parseRvalue() + tree.Set(key.val, value) + case tokenComma: + if previous == nil { + p.raiseError(follow, "inline table cannot start with a comma") + } + if tokenIsComma(previous) { + p.raiseError(follow, "need field between two commas in inline table") + } + p.getToken() + default: + p.raiseError(follow, "unexpected token type in inline table: %s", follow.String()) + } + previous = follow + } + if tokenIsComma(previous) { + p.raiseError(previous, "trailing comma at the end of inline table") + } + return tree +} + +func (p *tomlParser) parseArray() interface{} { + var array []interface{} + arrayType := reflect.TypeOf(nil) + for { + follow := p.peek() + if follow == nil || follow.typ == tokenEOF { + p.raiseError(follow, "unterminated array") + } + if follow.typ == tokenRightBracket { + p.getToken() + break + } + val := p.parseRvalue() + if arrayType == nil { + arrayType = reflect.TypeOf(val) + } + if reflect.TypeOf(val) != arrayType { + p.raiseError(follow, "mixed types in array") + } + array = append(array, val) + follow = p.peek() + if follow == nil || follow.typ == tokenEOF { + p.raiseError(follow, "unterminated array") + } + if follow.typ != tokenRightBracket && follow.typ != tokenComma { + p.raiseError(follow, "missing comma") + } + if follow.typ == tokenComma { + p.getToken() + } + } + // An array of Trees is actually an array of inline + // tables, which is a shorthand for a table array. If the + // array was not converted from []interface{} to []*Tree, + // the two notations would not be equivalent. + if arrayType == reflect.TypeOf(newTree()) { + tomlArray := make([]*Tree, len(array)) + for i, v := range array { + tomlArray[i] = v.(*Tree) + } + return tomlArray + } + return array +} + +func parseToml(flow []token) *Tree { + result := newTree() + result.position = Position{1, 1} + parser := &tomlParser{ + flowIdx: 0, + flow: flow, + tree: result, + currentTable: make([]string, 0), + seenTableKeys: make([]string, 0), + } + parser.run() + return result +} + +func init() { + numberUnderscoreInvalidRegexp = regexp.MustCompile(`([^\d]_|_[^\d])|_$|^_`) + hexNumberUnderscoreInvalidRegexp = regexp.MustCompile(`(^0x_)|([^\da-f]_|_[^\da-f])|_$|^_`) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/position.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/position.go new file mode 100644 index 00000000..c17bff87 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/position.go @@ -0,0 +1,29 @@ +// Position support for go-toml + +package toml + +import ( + "fmt" +) + +// Position of a document element within a TOML document. +// +// Line and Col are both 1-indexed positions for the element's line number and +// column number, respectively. Values of zero or less will cause Invalid(), +// to return true. +type Position struct { + Line int // line within the document + Col int // column within the line +} + +// String representation of the position. +// Displays 1-indexed line and column numbers. +func (p Position) String() string { + return fmt.Sprintf("(%d, %d)", p.Line, p.Col) +} + +// Invalid returns whether or not the position is valid (i.e. with negative or +// null values) +func (p Position) Invalid() bool { + return p.Line <= 0 || p.Col <= 0 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/test.sh b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/test.sh new file mode 100755 index 00000000..ba6adf3f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/test.sh @@ -0,0 +1,88 @@ +#!/bin/bash +# fail out of the script if anything here fails +set -e +set -o pipefail + +# set the path to the present working directory +export GOPATH=`pwd` + +function git_clone() { + path=$1 + branch=$2 + version=$3 + if [ ! -d "src/$path" ]; then + mkdir -p src/$path + git clone https://$path.git src/$path + fi + pushd src/$path + git checkout "$branch" + git reset --hard "$version" + popd +} + +# Remove potential previous runs +rm -rf src test_program_bin toml-test + +go get github.com/pelletier/go-buffruneio +go get github.com/davecgh/go-spew/spew +go get gopkg.in/yaml.v2 +go get github.com/BurntSushi/toml + +# get code for BurntSushi TOML validation +# pinning all to 'HEAD' for version 0.3.x work (TODO: pin to commit hash when tests stabilize) +git_clone github.com/BurntSushi/toml master HEAD +git_clone github.com/BurntSushi/toml-test master HEAD #was: 0.2.0 HEAD + +# build the BurntSushi test application +go build -o toml-test github.com/BurntSushi/toml-test + +# vendorize the current lib for testing +# NOTE: this basically mocks an install without having to go back out to github for code +mkdir -p src/github.com/pelletier/go-toml/cmd +mkdir -p src/github.com/pelletier/go-toml/query +cp *.go *.toml src/github.com/pelletier/go-toml +cp -R cmd/* src/github.com/pelletier/go-toml/cmd +cp -R query/* src/github.com/pelletier/go-toml/query +go build -o test_program_bin src/github.com/pelletier/go-toml/cmd/test_program.go + +# Run basic unit tests +go test github.com/pelletier/go-toml -covermode=count -coverprofile=coverage.out +go test github.com/pelletier/go-toml/cmd/tomljson +go test github.com/pelletier/go-toml/query + +# run the entire BurntSushi test suite +if [[ $# -eq 0 ]] ; then + echo "Running all BurntSushi tests" + ./toml-test ./test_program_bin | tee test_out +else + # run a specific test + test=$1 + test_path='src/github.com/BurntSushi/toml-test/tests' + valid_test="$test_path/valid/$test" + invalid_test="$test_path/invalid/$test" + + if [ -e "$valid_test.toml" ]; then + echo "Valid Test TOML for $test:" + echo "====" + cat "$valid_test.toml" + + echo "Valid Test JSON for $test:" + echo "====" + cat "$valid_test.json" + + echo "Go-TOML Output for $test:" + echo "====" + cat "$valid_test.toml" | ./test_program_bin + fi + + if [ -e "$invalid_test.toml" ]; then + echo "Invalid Test TOML for $test:" + echo "====" + cat "$invalid_test.toml" + + echo "Go-TOML Output for $test:" + echo "====" + echo "go-toml Output:" + cat "$invalid_test.toml" | ./test_program_bin + fi +fi diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/token.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/token.go new file mode 100644 index 00000000..1a908134 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/token.go @@ -0,0 +1,144 @@ +package toml + +import ( + "fmt" + "strconv" + "unicode" +) + +// Define tokens +type tokenType int + +const ( + eof = -(iota + 1) +) + +const ( + tokenError tokenType = iota + tokenEOF + tokenComment + tokenKey + tokenString + tokenInteger + tokenTrue + tokenFalse + tokenFloat + tokenInf + tokenNan + tokenEqual + tokenLeftBracket + tokenRightBracket + tokenLeftCurlyBrace + tokenRightCurlyBrace + tokenLeftParen + tokenRightParen + tokenDoubleLeftBracket + tokenDoubleRightBracket + tokenDate + tokenKeyGroup + tokenKeyGroupArray + tokenComma + tokenColon + tokenDollar + tokenStar + tokenQuestion + tokenDot + tokenDotDot + tokenEOL +) + +var tokenTypeNames = []string{ + "Error", + "EOF", + "Comment", + "Key", + "String", + "Integer", + "True", + "False", + "Float", + "Inf", + "NaN", + "=", + "[", + "]", + "{", + "}", + "(", + ")", + "]]", + "[[", + "Date", + "KeyGroup", + "KeyGroupArray", + ",", + ":", + "$", + "*", + "?", + ".", + "..", + "EOL", +} + +type token struct { + Position + typ tokenType + val string +} + +func (tt tokenType) String() string { + idx := int(tt) + if idx < len(tokenTypeNames) { + return tokenTypeNames[idx] + } + return "Unknown" +} + +func (t token) Int() int { + if result, err := strconv.Atoi(t.val); err != nil { + panic(err) + } else { + return result + } +} + +func (t token) String() string { + switch t.typ { + case tokenEOF: + return "EOF" + case tokenError: + return t.val + } + + return fmt.Sprintf("%q", t.val) +} + +func isSpace(r rune) bool { + return r == ' ' || r == '\t' +} + +func isAlphanumeric(r rune) bool { + return unicode.IsLetter(r) || r == '_' +} + +func isKeyChar(r rune) bool { + // Keys start with the first character that isn't whitespace or [ and end + // with the last non-whitespace character before the equals sign. Keys + // cannot contain a # character." + return !(r == '\r' || r == '\n' || r == eof || r == '=') +} + +func isKeyStartChar(r rune) bool { + return !(isSpace(r) || r == '\r' || r == '\n' || r == eof || r == '[') +} + +func isDigit(r rune) bool { + return unicode.IsNumber(r) +} + +func isHexDigit(r rune) bool { + return isDigit(r) || + (r >= 'a' && r <= 'f') || + (r >= 'A' && r <= 'F') +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/toml.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/toml.go new file mode 100644 index 00000000..98c185ad --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/toml.go @@ -0,0 +1,367 @@ +package toml + +import ( + "errors" + "fmt" + "io" + "io/ioutil" + "os" + "runtime" + "strings" +) + +type tomlValue struct { + value interface{} // string, int64, uint64, float64, bool, time.Time, [] of any of this list + comment string + commented bool + multiline bool + position Position +} + +// Tree is the result of the parsing of a TOML file. +type Tree struct { + values map[string]interface{} // string -> *tomlValue, *Tree, []*Tree + comment string + commented bool + position Position +} + +func newTree() *Tree { + return &Tree{ + values: make(map[string]interface{}), + position: Position{}, + } +} + +// TreeFromMap initializes a new Tree object using the given map. +func TreeFromMap(m map[string]interface{}) (*Tree, error) { + result, err := toTree(m) + if err != nil { + return nil, err + } + return result.(*Tree), nil +} + +// Position returns the position of the tree. +func (t *Tree) Position() Position { + return t.position +} + +// Has returns a boolean indicating if the given key exists. +func (t *Tree) Has(key string) bool { + if key == "" { + return false + } + return t.HasPath(strings.Split(key, ".")) +} + +// HasPath returns true if the given path of keys exists, false otherwise. +func (t *Tree) HasPath(keys []string) bool { + return t.GetPath(keys) != nil +} + +// Keys returns the keys of the toplevel tree (does not recurse). +func (t *Tree) Keys() []string { + keys := make([]string, len(t.values)) + i := 0 + for k := range t.values { + keys[i] = k + i++ + } + return keys +} + +// Get the value at key in the Tree. +// Key is a dot-separated path (e.g. a.b.c) without single/double quoted strings. +// If you need to retrieve non-bare keys, use GetPath. +// Returns nil if the path does not exist in the tree. +// If keys is of length zero, the current tree is returned. +func (t *Tree) Get(key string) interface{} { + if key == "" { + return t + } + return t.GetPath(strings.Split(key, ".")) +} + +// GetPath returns the element in the tree indicated by 'keys'. +// If keys is of length zero, the current tree is returned. +func (t *Tree) GetPath(keys []string) interface{} { + if len(keys) == 0 { + return t + } + subtree := t + for _, intermediateKey := range keys[:len(keys)-1] { + value, exists := subtree.values[intermediateKey] + if !exists { + return nil + } + switch node := value.(type) { + case *Tree: + subtree = node + case []*Tree: + // go to most recent element + if len(node) == 0 { + return nil + } + subtree = node[len(node)-1] + default: + return nil // cannot navigate through other node types + } + } + // branch based on final node type + switch node := subtree.values[keys[len(keys)-1]].(type) { + case *tomlValue: + return node.value + default: + return node + } +} + +// GetPosition returns the position of the given key. +func (t *Tree) GetPosition(key string) Position { + if key == "" { + return t.position + } + return t.GetPositionPath(strings.Split(key, ".")) +} + +// GetPositionPath returns the element in the tree indicated by 'keys'. +// If keys is of length zero, the current tree is returned. +func (t *Tree) GetPositionPath(keys []string) Position { + if len(keys) == 0 { + return t.position + } + subtree := t + for _, intermediateKey := range keys[:len(keys)-1] { + value, exists := subtree.values[intermediateKey] + if !exists { + return Position{0, 0} + } + switch node := value.(type) { + case *Tree: + subtree = node + case []*Tree: + // go to most recent element + if len(node) == 0 { + return Position{0, 0} + } + subtree = node[len(node)-1] + default: + return Position{0, 0} + } + } + // branch based on final node type + switch node := subtree.values[keys[len(keys)-1]].(type) { + case *tomlValue: + return node.position + case *Tree: + return node.position + case []*Tree: + // go to most recent element + if len(node) == 0 { + return Position{0, 0} + } + return node[len(node)-1].position + default: + return Position{0, 0} + } +} + +// GetDefault works like Get but with a default value +func (t *Tree) GetDefault(key string, def interface{}) interface{} { + val := t.Get(key) + if val == nil { + return def + } + return val +} + +// SetOptions arguments are supplied to the SetWithOptions and SetPathWithOptions functions to modify marshalling behaviour. +// The default values within the struct are valid default options. +type SetOptions struct { + Comment string + Commented bool + Multiline bool +} + +// SetWithOptions is the same as Set, but allows you to provide formatting +// instructions to the key, that will be used by Marshal(). +func (t *Tree) SetWithOptions(key string, opts SetOptions, value interface{}) { + t.SetPathWithOptions(strings.Split(key, "."), opts, value) +} + +// SetPathWithOptions is the same as SetPath, but allows you to provide +// formatting instructions to the key, that will be reused by Marshal(). +func (t *Tree) SetPathWithOptions(keys []string, opts SetOptions, value interface{}) { + subtree := t + for _, intermediateKey := range keys[:len(keys)-1] { + nextTree, exists := subtree.values[intermediateKey] + if !exists { + nextTree = newTree() + subtree.values[intermediateKey] = nextTree // add new element here + } + switch node := nextTree.(type) { + case *Tree: + subtree = node + case []*Tree: + // go to most recent element + if len(node) == 0 { + // create element if it does not exist + subtree.values[intermediateKey] = append(node, newTree()) + } + subtree = node[len(node)-1] + } + } + + var toInsert interface{} + + switch value.(type) { + case *Tree: + tt := value.(*Tree) + tt.comment = opts.Comment + toInsert = value + case []*Tree: + toInsert = value + case *tomlValue: + tt := value.(*tomlValue) + tt.comment = opts.Comment + toInsert = tt + default: + toInsert = &tomlValue{value: value, comment: opts.Comment, commented: opts.Commented, multiline: opts.Multiline} + } + + subtree.values[keys[len(keys)-1]] = toInsert +} + +// Set an element in the tree. +// Key is a dot-separated path (e.g. a.b.c). +// Creates all necessary intermediate trees, if needed. +func (t *Tree) Set(key string, value interface{}) { + t.SetWithComment(key, "", false, value) +} + +// SetWithComment is the same as Set, but allows you to provide comment +// information to the key, that will be reused by Marshal(). +func (t *Tree) SetWithComment(key string, comment string, commented bool, value interface{}) { + t.SetPathWithComment(strings.Split(key, "."), comment, commented, value) +} + +// SetPath sets an element in the tree. +// Keys is an array of path elements (e.g. {"a","b","c"}). +// Creates all necessary intermediate trees, if needed. +func (t *Tree) SetPath(keys []string, value interface{}) { + t.SetPathWithComment(keys, "", false, value) +} + +// SetPathWithComment is the same as SetPath, but allows you to provide comment +// information to the key, that will be reused by Marshal(). +func (t *Tree) SetPathWithComment(keys []string, comment string, commented bool, value interface{}) { + subtree := t + for _, intermediateKey := range keys[:len(keys)-1] { + nextTree, exists := subtree.values[intermediateKey] + if !exists { + nextTree = newTree() + subtree.values[intermediateKey] = nextTree // add new element here + } + switch node := nextTree.(type) { + case *Tree: + subtree = node + case []*Tree: + // go to most recent element + if len(node) == 0 { + // create element if it does not exist + subtree.values[intermediateKey] = append(node, newTree()) + } + subtree = node[len(node)-1] + } + } + + var toInsert interface{} + + switch value.(type) { + case *Tree: + tt := value.(*Tree) + tt.comment = comment + toInsert = value + case []*Tree: + toInsert = value + case *tomlValue: + tt := value.(*tomlValue) + tt.comment = comment + toInsert = tt + default: + toInsert = &tomlValue{value: value, comment: comment, commented: commented} + } + + subtree.values[keys[len(keys)-1]] = toInsert +} + +// createSubTree takes a tree and a key and create the necessary intermediate +// subtrees to create a subtree at that point. In-place. +// +// e.g. passing a.b.c will create (assuming tree is empty) tree[a], tree[a][b] +// and tree[a][b][c] +// +// Returns nil on success, error object on failure +func (t *Tree) createSubTree(keys []string, pos Position) error { + subtree := t + for _, intermediateKey := range keys { + nextTree, exists := subtree.values[intermediateKey] + if !exists { + tree := newTree() + tree.position = pos + subtree.values[intermediateKey] = tree + nextTree = tree + } + + switch node := nextTree.(type) { + case []*Tree: + subtree = node[len(node)-1] + case *Tree: + subtree = node + default: + return fmt.Errorf("unknown type for path %s (%s): %T (%#v)", + strings.Join(keys, "."), intermediateKey, nextTree, nextTree) + } + } + return nil +} + +// LoadBytes creates a Tree from a []byte. +func LoadBytes(b []byte) (tree *Tree, err error) { + defer func() { + if r := recover(); r != nil { + if _, ok := r.(runtime.Error); ok { + panic(r) + } + err = errors.New(r.(string)) + } + }() + tree = parseToml(lexToml(b)) + return +} + +// LoadReader creates a Tree from any io.Reader. +func LoadReader(reader io.Reader) (tree *Tree, err error) { + inputBytes, err := ioutil.ReadAll(reader) + if err != nil { + return + } + tree, err = LoadBytes(inputBytes) + return +} + +// Load creates a Tree from a string. +func Load(content string) (tree *Tree, err error) { + return LoadBytes([]byte(content)) +} + +// LoadFile creates a Tree from a file. +func LoadFile(path string) (tree *Tree, err error) { + file, err := os.Open(path) + if err != nil { + return nil, err + } + defer file.Close() + return LoadReader(file) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/tomltree_create.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/tomltree_create.go new file mode 100644 index 00000000..79610e9b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/tomltree_create.go @@ -0,0 +1,142 @@ +package toml + +import ( + "fmt" + "reflect" + "time" +) + +var kindToType = [reflect.String + 1]reflect.Type{ + reflect.Bool: reflect.TypeOf(true), + reflect.String: reflect.TypeOf(""), + reflect.Float32: reflect.TypeOf(float64(1)), + reflect.Float64: reflect.TypeOf(float64(1)), + reflect.Int: reflect.TypeOf(int64(1)), + reflect.Int8: reflect.TypeOf(int64(1)), + reflect.Int16: reflect.TypeOf(int64(1)), + reflect.Int32: reflect.TypeOf(int64(1)), + reflect.Int64: reflect.TypeOf(int64(1)), + reflect.Uint: reflect.TypeOf(uint64(1)), + reflect.Uint8: reflect.TypeOf(uint64(1)), + reflect.Uint16: reflect.TypeOf(uint64(1)), + reflect.Uint32: reflect.TypeOf(uint64(1)), + reflect.Uint64: reflect.TypeOf(uint64(1)), +} + +// typeFor returns a reflect.Type for a reflect.Kind, or nil if none is found. +// supported values: +// string, bool, int64, uint64, float64, time.Time, int, int8, int16, int32, uint, uint8, uint16, uint32, float32 +func typeFor(k reflect.Kind) reflect.Type { + if k > 0 && int(k) < len(kindToType) { + return kindToType[k] + } + return nil +} + +func simpleValueCoercion(object interface{}) (interface{}, error) { + switch original := object.(type) { + case string, bool, int64, uint64, float64, time.Time: + return original, nil + case int: + return int64(original), nil + case int8: + return int64(original), nil + case int16: + return int64(original), nil + case int32: + return int64(original), nil + case uint: + return uint64(original), nil + case uint8: + return uint64(original), nil + case uint16: + return uint64(original), nil + case uint32: + return uint64(original), nil + case float32: + return float64(original), nil + case fmt.Stringer: + return original.String(), nil + default: + return nil, fmt.Errorf("cannot convert type %T to Tree", object) + } +} + +func sliceToTree(object interface{}) (interface{}, error) { + // arrays are a bit tricky, since they can represent either a + // collection of simple values, which is represented by one + // *tomlValue, or an array of tables, which is represented by an + // array of *Tree. + + // holding the assumption that this function is called from toTree only when value.Kind() is Array or Slice + value := reflect.ValueOf(object) + insideType := value.Type().Elem() + length := value.Len() + if length > 0 { + insideType = reflect.ValueOf(value.Index(0).Interface()).Type() + } + if insideType.Kind() == reflect.Map { + // this is considered as an array of tables + tablesArray := make([]*Tree, 0, length) + for i := 0; i < length; i++ { + table := value.Index(i) + tree, err := toTree(table.Interface()) + if err != nil { + return nil, err + } + tablesArray = append(tablesArray, tree.(*Tree)) + } + return tablesArray, nil + } + + sliceType := typeFor(insideType.Kind()) + if sliceType == nil { + sliceType = insideType + } + + arrayValue := reflect.MakeSlice(reflect.SliceOf(sliceType), 0, length) + + for i := 0; i < length; i++ { + val := value.Index(i).Interface() + simpleValue, err := simpleValueCoercion(val) + if err != nil { + return nil, err + } + arrayValue = reflect.Append(arrayValue, reflect.ValueOf(simpleValue)) + } + return &tomlValue{value: arrayValue.Interface(), position: Position{}}, nil +} + +func toTree(object interface{}) (interface{}, error) { + value := reflect.ValueOf(object) + + if value.Kind() == reflect.Map { + values := map[string]interface{}{} + keys := value.MapKeys() + for _, key := range keys { + if key.Kind() != reflect.String { + if _, ok := key.Interface().(string); !ok { + return nil, fmt.Errorf("map key needs to be a string, not %T (%v)", key.Interface(), key.Kind()) + } + } + + v := value.MapIndex(key) + newValue, err := toTree(v.Interface()) + if err != nil { + return nil, err + } + values[key.String()] = newValue + } + return &Tree{values: values, position: Position{}}, nil + } + + if value.Kind() == reflect.Array || value.Kind() == reflect.Slice { + return sliceToTree(object) + } + + simpleValue, err := simpleValueCoercion(object) + if err != nil { + return nil, err + } + return &tomlValue{value: simpleValue, position: Position{}}, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/tomltree_write.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/tomltree_write.go new file mode 100644 index 00000000..e4049e29 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pelletier/go-toml/tomltree_write.go @@ -0,0 +1,333 @@ +package toml + +import ( + "bytes" + "fmt" + "io" + "math" + "reflect" + "sort" + "strconv" + "strings" + "time" +) + +// Encodes a string to a TOML-compliant multi-line string value +// This function is a clone of the existing encodeTomlString function, except that whitespace characters +// are preserved. Quotation marks and backslashes are also not escaped. +func encodeMultilineTomlString(value string) string { + var b bytes.Buffer + + for _, rr := range value { + switch rr { + case '\b': + b.WriteString(`\b`) + case '\t': + b.WriteString("\t") + case '\n': + b.WriteString("\n") + case '\f': + b.WriteString(`\f`) + case '\r': + b.WriteString("\r") + case '"': + b.WriteString(`"`) + case '\\': + b.WriteString(`\`) + default: + intRr := uint16(rr) + if intRr < 0x001F { + b.WriteString(fmt.Sprintf("\\u%0.4X", intRr)) + } else { + b.WriteRune(rr) + } + } + } + return b.String() +} + +// Encodes a string to a TOML-compliant string value +func encodeTomlString(value string) string { + var b bytes.Buffer + + for _, rr := range value { + switch rr { + case '\b': + b.WriteString(`\b`) + case '\t': + b.WriteString(`\t`) + case '\n': + b.WriteString(`\n`) + case '\f': + b.WriteString(`\f`) + case '\r': + b.WriteString(`\r`) + case '"': + b.WriteString(`\"`) + case '\\': + b.WriteString(`\\`) + default: + intRr := uint16(rr) + if intRr < 0x001F { + b.WriteString(fmt.Sprintf("\\u%0.4X", intRr)) + } else { + b.WriteRune(rr) + } + } + } + return b.String() +} + +func tomlValueStringRepresentation(v interface{}, indent string, arraysOneElementPerLine bool) (string, error) { + // this interface check is added to dereference the change made in the writeTo function. + // That change was made to allow this function to see formatting options. + tv, ok := v.(*tomlValue) + if ok { + v = tv.value + } else { + tv = &tomlValue{} + } + + switch value := v.(type) { + case uint64: + return strconv.FormatUint(value, 10), nil + case int64: + return strconv.FormatInt(value, 10), nil + case float64: + // Ensure a round float does contain a decimal point. Otherwise feeding + // the output back to the parser would convert to an integer. + if math.Trunc(value) == value { + return strings.ToLower(strconv.FormatFloat(value, 'f', 1, 32)), nil + } + return strings.ToLower(strconv.FormatFloat(value, 'f', -1, 32)), nil + case string: + if tv.multiline { + return "\"\"\"\n" + encodeMultilineTomlString(value) + "\"\"\"", nil + } + return "\"" + encodeTomlString(value) + "\"", nil + case []byte: + b, _ := v.([]byte) + return tomlValueStringRepresentation(string(b), indent, arraysOneElementPerLine) + case bool: + if value { + return "true", nil + } + return "false", nil + case time.Time: + return value.Format(time.RFC3339), nil + case nil: + return "", nil + } + + rv := reflect.ValueOf(v) + + if rv.Kind() == reflect.Slice { + var values []string + for i := 0; i < rv.Len(); i++ { + item := rv.Index(i).Interface() + itemRepr, err := tomlValueStringRepresentation(item, indent, arraysOneElementPerLine) + if err != nil { + return "", err + } + values = append(values, itemRepr) + } + if arraysOneElementPerLine && len(values) > 1 { + stringBuffer := bytes.Buffer{} + valueIndent := indent + ` ` // TODO: move that to a shared encoder state + + stringBuffer.WriteString("[\n") + + for _, value := range values { + stringBuffer.WriteString(valueIndent) + stringBuffer.WriteString(value) + stringBuffer.WriteString(`,`) + stringBuffer.WriteString("\n") + } + + stringBuffer.WriteString(indent + "]") + + return stringBuffer.String(), nil + } + return "[" + strings.Join(values, ",") + "]", nil + } + return "", fmt.Errorf("unsupported value type %T: %v", v, v) +} + +func (t *Tree) writeTo(w io.Writer, indent, keyspace string, bytesCount int64, arraysOneElementPerLine bool) (int64, error) { + simpleValuesKeys := make([]string, 0) + complexValuesKeys := make([]string, 0) + + for k := range t.values { + v := t.values[k] + switch v.(type) { + case *Tree, []*Tree: + complexValuesKeys = append(complexValuesKeys, k) + default: + simpleValuesKeys = append(simpleValuesKeys, k) + } + } + + sort.Strings(simpleValuesKeys) + sort.Strings(complexValuesKeys) + + for _, k := range simpleValuesKeys { + v, ok := t.values[k].(*tomlValue) + if !ok { + return bytesCount, fmt.Errorf("invalid value type at %s: %T", k, t.values[k]) + } + + repr, err := tomlValueStringRepresentation(v, indent, arraysOneElementPerLine) + if err != nil { + return bytesCount, err + } + + if v.comment != "" { + comment := strings.Replace(v.comment, "\n", "\n"+indent+"#", -1) + start := "# " + if strings.HasPrefix(comment, "#") { + start = "" + } + writtenBytesCountComment, errc := writeStrings(w, "\n", indent, start, comment, "\n") + bytesCount += int64(writtenBytesCountComment) + if errc != nil { + return bytesCount, errc + } + } + + var commented string + if v.commented { + commented = "# " + } + writtenBytesCount, err := writeStrings(w, indent, commented, k, " = ", repr, "\n") + bytesCount += int64(writtenBytesCount) + if err != nil { + return bytesCount, err + } + } + + for _, k := range complexValuesKeys { + v := t.values[k] + + combinedKey := k + if keyspace != "" { + combinedKey = keyspace + "." + combinedKey + } + var commented string + if t.commented { + commented = "# " + } + + switch node := v.(type) { + // node has to be of those two types given how keys are sorted above + case *Tree: + tv, ok := t.values[k].(*Tree) + if !ok { + return bytesCount, fmt.Errorf("invalid value type at %s: %T", k, t.values[k]) + } + if tv.comment != "" { + comment := strings.Replace(tv.comment, "\n", "\n"+indent+"#", -1) + start := "# " + if strings.HasPrefix(comment, "#") { + start = "" + } + writtenBytesCountComment, errc := writeStrings(w, "\n", indent, start, comment) + bytesCount += int64(writtenBytesCountComment) + if errc != nil { + return bytesCount, errc + } + } + writtenBytesCount, err := writeStrings(w, "\n", indent, commented, "[", combinedKey, "]\n") + bytesCount += int64(writtenBytesCount) + if err != nil { + return bytesCount, err + } + bytesCount, err = node.writeTo(w, indent+" ", combinedKey, bytesCount, arraysOneElementPerLine) + if err != nil { + return bytesCount, err + } + case []*Tree: + for _, subTree := range node { + writtenBytesCount, err := writeStrings(w, "\n", indent, commented, "[[", combinedKey, "]]\n") + bytesCount += int64(writtenBytesCount) + if err != nil { + return bytesCount, err + } + + bytesCount, err = subTree.writeTo(w, indent+" ", combinedKey, bytesCount, arraysOneElementPerLine) + if err != nil { + return bytesCount, err + } + } + } + } + + return bytesCount, nil +} + +func writeStrings(w io.Writer, s ...string) (int, error) { + var n int + for i := range s { + b, err := io.WriteString(w, s[i]) + n += b + if err != nil { + return n, err + } + } + return n, nil +} + +// WriteTo encode the Tree as Toml and writes it to the writer w. +// Returns the number of bytes written in case of success, or an error if anything happened. +func (t *Tree) WriteTo(w io.Writer) (int64, error) { + return t.writeTo(w, "", "", 0, false) +} + +// ToTomlString generates a human-readable representation of the current tree. +// Output spans multiple lines, and is suitable for ingest by a TOML parser. +// If the conversion cannot be performed, ToString returns a non-nil error. +func (t *Tree) ToTomlString() (string, error) { + var buf bytes.Buffer + _, err := t.WriteTo(&buf) + if err != nil { + return "", err + } + return buf.String(), nil +} + +// String generates a human-readable representation of the current tree. +// Alias of ToString. Present to implement the fmt.Stringer interface. +func (t *Tree) String() string { + result, _ := t.ToTomlString() + return result +} + +// ToMap recursively generates a representation of the tree using Go built-in structures. +// The following types are used: +// +// * bool +// * float64 +// * int64 +// * string +// * uint64 +// * time.Time +// * map[string]interface{} (where interface{} is any of this list) +// * []interface{} (where interface{} is any of this list) +func (t *Tree) ToMap() map[string]interface{} { + result := map[string]interface{}{} + + for k, v := range t.values { + switch node := v.(type) { + case []*Tree: + var array []interface{} + for _, item := range node { + array = append(array, item.ToMap()) + } + result[k] = array + case *Tree: + result[k] = node.ToMap() + case *tomlValue: + result[k] = node.value + } + } + return result +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pmezard/go-difflib/LICENSE b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pmezard/go-difflib/LICENSE new file mode 100644 index 00000000..c67dad61 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pmezard/go-difflib/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2013, Patrick Mezard +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + The names of its contributors may not be used to endorse or promote +products derived from this software without specific prior written +permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pmezard/go-difflib/difflib/difflib.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pmezard/go-difflib/difflib/difflib.go new file mode 100644 index 00000000..003e99fa --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/pmezard/go-difflib/difflib/difflib.go @@ -0,0 +1,772 @@ +// Package difflib is a partial port of Python difflib module. +// +// It provides tools to compare sequences of strings and generate textual diffs. +// +// The following class and functions have been ported: +// +// - SequenceMatcher +// +// - unified_diff +// +// - context_diff +// +// Getting unified diffs was the main goal of the port. Keep in mind this code +// is mostly suitable to output text differences in a human friendly way, there +// are no guarantees generated diffs are consumable by patch(1). +package difflib + +import ( + "bufio" + "bytes" + "fmt" + "io" + "strings" +) + +func min(a, b int) int { + if a < b { + return a + } + return b +} + +func max(a, b int) int { + if a > b { + return a + } + return b +} + +func calculateRatio(matches, length int) float64 { + if length > 0 { + return 2.0 * float64(matches) / float64(length) + } + return 1.0 +} + +type Match struct { + A int + B int + Size int +} + +type OpCode struct { + Tag byte + I1 int + I2 int + J1 int + J2 int +} + +// SequenceMatcher compares sequence of strings. The basic +// algorithm predates, and is a little fancier than, an algorithm +// published in the late 1980's by Ratcliff and Obershelp under the +// hyperbolic name "gestalt pattern matching". The basic idea is to find +// the longest contiguous matching subsequence that contains no "junk" +// elements (R-O doesn't address junk). The same idea is then applied +// recursively to the pieces of the sequences to the left and to the right +// of the matching subsequence. This does not yield minimal edit +// sequences, but does tend to yield matches that "look right" to people. +// +// SequenceMatcher tries to compute a "human-friendly diff" between two +// sequences. Unlike e.g. UNIX(tm) diff, the fundamental notion is the +// longest *contiguous* & junk-free matching subsequence. That's what +// catches peoples' eyes. The Windows(tm) windiff has another interesting +// notion, pairing up elements that appear uniquely in each sequence. +// That, and the method here, appear to yield more intuitive difference +// reports than does diff. This method appears to be the least vulnerable +// to synching up on blocks of "junk lines", though (like blank lines in +// ordinary text files, or maybe "

" lines in HTML files). That may be +// because this is the only method of the 3 that has a *concept* of +// "junk" . +// +// Timing: Basic R-O is cubic time worst case and quadratic time expected +// case. SequenceMatcher is quadratic time for the worst case and has +// expected-case behavior dependent in a complicated way on how many +// elements the sequences have in common; best case time is linear. +type SequenceMatcher struct { + a []string + b []string + b2j map[string][]int + IsJunk func(string) bool + autoJunk bool + bJunk map[string]struct{} + matchingBlocks []Match + fullBCount map[string]int + bPopular map[string]struct{} + opCodes []OpCode +} + +func NewMatcher(a, b []string) *SequenceMatcher { + m := SequenceMatcher{autoJunk: true} + m.SetSeqs(a, b) + return &m +} + +func NewMatcherWithJunk(a, b []string, autoJunk bool, + isJunk func(string) bool) *SequenceMatcher { + + m := SequenceMatcher{IsJunk: isJunk, autoJunk: autoJunk} + m.SetSeqs(a, b) + return &m +} + +// Set two sequences to be compared. +func (m *SequenceMatcher) SetSeqs(a, b []string) { + m.SetSeq1(a) + m.SetSeq2(b) +} + +// Set the first sequence to be compared. The second sequence to be compared is +// not changed. +// +// SequenceMatcher computes and caches detailed information about the second +// sequence, so if you want to compare one sequence S against many sequences, +// use .SetSeq2(s) once and call .SetSeq1(x) repeatedly for each of the other +// sequences. +// +// See also SetSeqs() and SetSeq2(). +func (m *SequenceMatcher) SetSeq1(a []string) { + if &a == &m.a { + return + } + m.a = a + m.matchingBlocks = nil + m.opCodes = nil +} + +// Set the second sequence to be compared. The first sequence to be compared is +// not changed. +func (m *SequenceMatcher) SetSeq2(b []string) { + if &b == &m.b { + return + } + m.b = b + m.matchingBlocks = nil + m.opCodes = nil + m.fullBCount = nil + m.chainB() +} + +func (m *SequenceMatcher) chainB() { + // Populate line -> index mapping + b2j := map[string][]int{} + for i, s := range m.b { + indices := b2j[s] + indices = append(indices, i) + b2j[s] = indices + } + + // Purge junk elements + m.bJunk = map[string]struct{}{} + if m.IsJunk != nil { + junk := m.bJunk + for s, _ := range b2j { + if m.IsJunk(s) { + junk[s] = struct{}{} + } + } + for s, _ := range junk { + delete(b2j, s) + } + } + + // Purge remaining popular elements + popular := map[string]struct{}{} + n := len(m.b) + if m.autoJunk && n >= 200 { + ntest := n/100 + 1 + for s, indices := range b2j { + if len(indices) > ntest { + popular[s] = struct{}{} + } + } + for s, _ := range popular { + delete(b2j, s) + } + } + m.bPopular = popular + m.b2j = b2j +} + +func (m *SequenceMatcher) isBJunk(s string) bool { + _, ok := m.bJunk[s] + return ok +} + +// Find longest matching block in a[alo:ahi] and b[blo:bhi]. +// +// If IsJunk is not defined: +// +// Return (i,j,k) such that a[i:i+k] is equal to b[j:j+k], where +// alo <= i <= i+k <= ahi +// blo <= j <= j+k <= bhi +// and for all (i',j',k') meeting those conditions, +// k >= k' +// i <= i' +// and if i == i', j <= j' +// +// In other words, of all maximal matching blocks, return one that +// starts earliest in a, and of all those maximal matching blocks that +// start earliest in a, return the one that starts earliest in b. +// +// If IsJunk is defined, first the longest matching block is +// determined as above, but with the additional restriction that no +// junk element appears in the block. Then that block is extended as +// far as possible by matching (only) junk elements on both sides. So +// the resulting block never matches on junk except as identical junk +// happens to be adjacent to an "interesting" match. +// +// If no blocks match, return (alo, blo, 0). +func (m *SequenceMatcher) findLongestMatch(alo, ahi, blo, bhi int) Match { + // CAUTION: stripping common prefix or suffix would be incorrect. + // E.g., + // ab + // acab + // Longest matching block is "ab", but if common prefix is + // stripped, it's "a" (tied with "b"). UNIX(tm) diff does so + // strip, so ends up claiming that ab is changed to acab by + // inserting "ca" in the middle. That's minimal but unintuitive: + // "it's obvious" that someone inserted "ac" at the front. + // Windiff ends up at the same place as diff, but by pairing up + // the unique 'b's and then matching the first two 'a's. + besti, bestj, bestsize := alo, blo, 0 + + // find longest junk-free match + // during an iteration of the loop, j2len[j] = length of longest + // junk-free match ending with a[i-1] and b[j] + j2len := map[int]int{} + for i := alo; i != ahi; i++ { + // look at all instances of a[i] in b; note that because + // b2j has no junk keys, the loop is skipped if a[i] is junk + newj2len := map[int]int{} + for _, j := range m.b2j[m.a[i]] { + // a[i] matches b[j] + if j < blo { + continue + } + if j >= bhi { + break + } + k := j2len[j-1] + 1 + newj2len[j] = k + if k > bestsize { + besti, bestj, bestsize = i-k+1, j-k+1, k + } + } + j2len = newj2len + } + + // Extend the best by non-junk elements on each end. In particular, + // "popular" non-junk elements aren't in b2j, which greatly speeds + // the inner loop above, but also means "the best" match so far + // doesn't contain any junk *or* popular non-junk elements. + for besti > alo && bestj > blo && !m.isBJunk(m.b[bestj-1]) && + m.a[besti-1] == m.b[bestj-1] { + besti, bestj, bestsize = besti-1, bestj-1, bestsize+1 + } + for besti+bestsize < ahi && bestj+bestsize < bhi && + !m.isBJunk(m.b[bestj+bestsize]) && + m.a[besti+bestsize] == m.b[bestj+bestsize] { + bestsize += 1 + } + + // Now that we have a wholly interesting match (albeit possibly + // empty!), we may as well suck up the matching junk on each + // side of it too. Can't think of a good reason not to, and it + // saves post-processing the (possibly considerable) expense of + // figuring out what to do with it. In the case of an empty + // interesting match, this is clearly the right thing to do, + // because no other kind of match is possible in the regions. + for besti > alo && bestj > blo && m.isBJunk(m.b[bestj-1]) && + m.a[besti-1] == m.b[bestj-1] { + besti, bestj, bestsize = besti-1, bestj-1, bestsize+1 + } + for besti+bestsize < ahi && bestj+bestsize < bhi && + m.isBJunk(m.b[bestj+bestsize]) && + m.a[besti+bestsize] == m.b[bestj+bestsize] { + bestsize += 1 + } + + return Match{A: besti, B: bestj, Size: bestsize} +} + +// Return list of triples describing matching subsequences. +// +// Each triple is of the form (i, j, n), and means that +// a[i:i+n] == b[j:j+n]. The triples are monotonically increasing in +// i and in j. It's also guaranteed that if (i, j, n) and (i', j', n') are +// adjacent triples in the list, and the second is not the last triple in the +// list, then i+n != i' or j+n != j'. IOW, adjacent triples never describe +// adjacent equal blocks. +// +// The last triple is a dummy, (len(a), len(b), 0), and is the only +// triple with n==0. +func (m *SequenceMatcher) GetMatchingBlocks() []Match { + if m.matchingBlocks != nil { + return m.matchingBlocks + } + + var matchBlocks func(alo, ahi, blo, bhi int, matched []Match) []Match + matchBlocks = func(alo, ahi, blo, bhi int, matched []Match) []Match { + match := m.findLongestMatch(alo, ahi, blo, bhi) + i, j, k := match.A, match.B, match.Size + if match.Size > 0 { + if alo < i && blo < j { + matched = matchBlocks(alo, i, blo, j, matched) + } + matched = append(matched, match) + if i+k < ahi && j+k < bhi { + matched = matchBlocks(i+k, ahi, j+k, bhi, matched) + } + } + return matched + } + matched := matchBlocks(0, len(m.a), 0, len(m.b), nil) + + // It's possible that we have adjacent equal blocks in the + // matching_blocks list now. + nonAdjacent := []Match{} + i1, j1, k1 := 0, 0, 0 + for _, b := range matched { + // Is this block adjacent to i1, j1, k1? + i2, j2, k2 := b.A, b.B, b.Size + if i1+k1 == i2 && j1+k1 == j2 { + // Yes, so collapse them -- this just increases the length of + // the first block by the length of the second, and the first + // block so lengthened remains the block to compare against. + k1 += k2 + } else { + // Not adjacent. Remember the first block (k1==0 means it's + // the dummy we started with), and make the second block the + // new block to compare against. + if k1 > 0 { + nonAdjacent = append(nonAdjacent, Match{i1, j1, k1}) + } + i1, j1, k1 = i2, j2, k2 + } + } + if k1 > 0 { + nonAdjacent = append(nonAdjacent, Match{i1, j1, k1}) + } + + nonAdjacent = append(nonAdjacent, Match{len(m.a), len(m.b), 0}) + m.matchingBlocks = nonAdjacent + return m.matchingBlocks +} + +// Return list of 5-tuples describing how to turn a into b. +// +// Each tuple is of the form (tag, i1, i2, j1, j2). The first tuple +// has i1 == j1 == 0, and remaining tuples have i1 == the i2 from the +// tuple preceding it, and likewise for j1 == the previous j2. +// +// The tags are characters, with these meanings: +// +// 'r' (replace): a[i1:i2] should be replaced by b[j1:j2] +// +// 'd' (delete): a[i1:i2] should be deleted, j1==j2 in this case. +// +// 'i' (insert): b[j1:j2] should be inserted at a[i1:i1], i1==i2 in this case. +// +// 'e' (equal): a[i1:i2] == b[j1:j2] +func (m *SequenceMatcher) GetOpCodes() []OpCode { + if m.opCodes != nil { + return m.opCodes + } + i, j := 0, 0 + matching := m.GetMatchingBlocks() + opCodes := make([]OpCode, 0, len(matching)) + for _, m := range matching { + // invariant: we've pumped out correct diffs to change + // a[:i] into b[:j], and the next matching block is + // a[ai:ai+size] == b[bj:bj+size]. So we need to pump + // out a diff to change a[i:ai] into b[j:bj], pump out + // the matching block, and move (i,j) beyond the match + ai, bj, size := m.A, m.B, m.Size + tag := byte(0) + if i < ai && j < bj { + tag = 'r' + } else if i < ai { + tag = 'd' + } else if j < bj { + tag = 'i' + } + if tag > 0 { + opCodes = append(opCodes, OpCode{tag, i, ai, j, bj}) + } + i, j = ai+size, bj+size + // the list of matching blocks is terminated by a + // sentinel with size 0 + if size > 0 { + opCodes = append(opCodes, OpCode{'e', ai, i, bj, j}) + } + } + m.opCodes = opCodes + return m.opCodes +} + +// Isolate change clusters by eliminating ranges with no changes. +// +// Return a generator of groups with up to n lines of context. +// Each group is in the same format as returned by GetOpCodes(). +func (m *SequenceMatcher) GetGroupedOpCodes(n int) [][]OpCode { + if n < 0 { + n = 3 + } + codes := m.GetOpCodes() + if len(codes) == 0 { + codes = []OpCode{OpCode{'e', 0, 1, 0, 1}} + } + // Fixup leading and trailing groups if they show no changes. + if codes[0].Tag == 'e' { + c := codes[0] + i1, i2, j1, j2 := c.I1, c.I2, c.J1, c.J2 + codes[0] = OpCode{c.Tag, max(i1, i2-n), i2, max(j1, j2-n), j2} + } + if codes[len(codes)-1].Tag == 'e' { + c := codes[len(codes)-1] + i1, i2, j1, j2 := c.I1, c.I2, c.J1, c.J2 + codes[len(codes)-1] = OpCode{c.Tag, i1, min(i2, i1+n), j1, min(j2, j1+n)} + } + nn := n + n + groups := [][]OpCode{} + group := []OpCode{} + for _, c := range codes { + i1, i2, j1, j2 := c.I1, c.I2, c.J1, c.J2 + // End the current group and start a new one whenever + // there is a large range with no changes. + if c.Tag == 'e' && i2-i1 > nn { + group = append(group, OpCode{c.Tag, i1, min(i2, i1+n), + j1, min(j2, j1+n)}) + groups = append(groups, group) + group = []OpCode{} + i1, j1 = max(i1, i2-n), max(j1, j2-n) + } + group = append(group, OpCode{c.Tag, i1, i2, j1, j2}) + } + if len(group) > 0 && !(len(group) == 1 && group[0].Tag == 'e') { + groups = append(groups, group) + } + return groups +} + +// Return a measure of the sequences' similarity (float in [0,1]). +// +// Where T is the total number of elements in both sequences, and +// M is the number of matches, this is 2.0*M / T. +// Note that this is 1 if the sequences are identical, and 0 if +// they have nothing in common. +// +// .Ratio() is expensive to compute if you haven't already computed +// .GetMatchingBlocks() or .GetOpCodes(), in which case you may +// want to try .QuickRatio() or .RealQuickRation() first to get an +// upper bound. +func (m *SequenceMatcher) Ratio() float64 { + matches := 0 + for _, m := range m.GetMatchingBlocks() { + matches += m.Size + } + return calculateRatio(matches, len(m.a)+len(m.b)) +} + +// Return an upper bound on ratio() relatively quickly. +// +// This isn't defined beyond that it is an upper bound on .Ratio(), and +// is faster to compute. +func (m *SequenceMatcher) QuickRatio() float64 { + // viewing a and b as multisets, set matches to the cardinality + // of their intersection; this counts the number of matches + // without regard to order, so is clearly an upper bound + if m.fullBCount == nil { + m.fullBCount = map[string]int{} + for _, s := range m.b { + m.fullBCount[s] = m.fullBCount[s] + 1 + } + } + + // avail[x] is the number of times x appears in 'b' less the + // number of times we've seen it in 'a' so far ... kinda + avail := map[string]int{} + matches := 0 + for _, s := range m.a { + n, ok := avail[s] + if !ok { + n = m.fullBCount[s] + } + avail[s] = n - 1 + if n > 0 { + matches += 1 + } + } + return calculateRatio(matches, len(m.a)+len(m.b)) +} + +// Return an upper bound on ratio() very quickly. +// +// This isn't defined beyond that it is an upper bound on .Ratio(), and +// is faster to compute than either .Ratio() or .QuickRatio(). +func (m *SequenceMatcher) RealQuickRatio() float64 { + la, lb := len(m.a), len(m.b) + return calculateRatio(min(la, lb), la+lb) +} + +// Convert range to the "ed" format +func formatRangeUnified(start, stop int) string { + // Per the diff spec at http://www.unix.org/single_unix_specification/ + beginning := start + 1 // lines start numbering with one + length := stop - start + if length == 1 { + return fmt.Sprintf("%d", beginning) + } + if length == 0 { + beginning -= 1 // empty ranges begin at line just before the range + } + return fmt.Sprintf("%d,%d", beginning, length) +} + +// Unified diff parameters +type UnifiedDiff struct { + A []string // First sequence lines + FromFile string // First file name + FromDate string // First file time + B []string // Second sequence lines + ToFile string // Second file name + ToDate string // Second file time + Eol string // Headers end of line, defaults to LF + Context int // Number of context lines +} + +// Compare two sequences of lines; generate the delta as a unified diff. +// +// Unified diffs are a compact way of showing line changes and a few +// lines of context. The number of context lines is set by 'n' which +// defaults to three. +// +// By default, the diff control lines (those with ---, +++, or @@) are +// created with a trailing newline. This is helpful so that inputs +// created from file.readlines() result in diffs that are suitable for +// file.writelines() since both the inputs and outputs have trailing +// newlines. +// +// For inputs that do not have trailing newlines, set the lineterm +// argument to "" so that the output will be uniformly newline free. +// +// The unidiff format normally has a header for filenames and modification +// times. Any or all of these may be specified using strings for +// 'fromfile', 'tofile', 'fromfiledate', and 'tofiledate'. +// The modification times are normally expressed in the ISO 8601 format. +func WriteUnifiedDiff(writer io.Writer, diff UnifiedDiff) error { + buf := bufio.NewWriter(writer) + defer buf.Flush() + wf := func(format string, args ...interface{}) error { + _, err := buf.WriteString(fmt.Sprintf(format, args...)) + return err + } + ws := func(s string) error { + _, err := buf.WriteString(s) + return err + } + + if len(diff.Eol) == 0 { + diff.Eol = "\n" + } + + started := false + m := NewMatcher(diff.A, diff.B) + for _, g := range m.GetGroupedOpCodes(diff.Context) { + if !started { + started = true + fromDate := "" + if len(diff.FromDate) > 0 { + fromDate = "\t" + diff.FromDate + } + toDate := "" + if len(diff.ToDate) > 0 { + toDate = "\t" + diff.ToDate + } + if diff.FromFile != "" || diff.ToFile != "" { + err := wf("--- %s%s%s", diff.FromFile, fromDate, diff.Eol) + if err != nil { + return err + } + err = wf("+++ %s%s%s", diff.ToFile, toDate, diff.Eol) + if err != nil { + return err + } + } + } + first, last := g[0], g[len(g)-1] + range1 := formatRangeUnified(first.I1, last.I2) + range2 := formatRangeUnified(first.J1, last.J2) + if err := wf("@@ -%s +%s @@%s", range1, range2, diff.Eol); err != nil { + return err + } + for _, c := range g { + i1, i2, j1, j2 := c.I1, c.I2, c.J1, c.J2 + if c.Tag == 'e' { + for _, line := range diff.A[i1:i2] { + if err := ws(" " + line); err != nil { + return err + } + } + continue + } + if c.Tag == 'r' || c.Tag == 'd' { + for _, line := range diff.A[i1:i2] { + if err := ws("-" + line); err != nil { + return err + } + } + } + if c.Tag == 'r' || c.Tag == 'i' { + for _, line := range diff.B[j1:j2] { + if err := ws("+" + line); err != nil { + return err + } + } + } + } + } + return nil +} + +// Like WriteUnifiedDiff but returns the diff a string. +func GetUnifiedDiffString(diff UnifiedDiff) (string, error) { + w := &bytes.Buffer{} + err := WriteUnifiedDiff(w, diff) + return string(w.Bytes()), err +} + +// Convert range to the "ed" format. +func formatRangeContext(start, stop int) string { + // Per the diff spec at http://www.unix.org/single_unix_specification/ + beginning := start + 1 // lines start numbering with one + length := stop - start + if length == 0 { + beginning -= 1 // empty ranges begin at line just before the range + } + if length <= 1 { + return fmt.Sprintf("%d", beginning) + } + return fmt.Sprintf("%d,%d", beginning, beginning+length-1) +} + +type ContextDiff UnifiedDiff + +// Compare two sequences of lines; generate the delta as a context diff. +// +// Context diffs are a compact way of showing line changes and a few +// lines of context. The number of context lines is set by diff.Context +// which defaults to three. +// +// By default, the diff control lines (those with *** or ---) are +// created with a trailing newline. +// +// For inputs that do not have trailing newlines, set the diff.Eol +// argument to "" so that the output will be uniformly newline free. +// +// The context diff format normally has a header for filenames and +// modification times. Any or all of these may be specified using +// strings for diff.FromFile, diff.ToFile, diff.FromDate, diff.ToDate. +// The modification times are normally expressed in the ISO 8601 format. +// If not specified, the strings default to blanks. +func WriteContextDiff(writer io.Writer, diff ContextDiff) error { + buf := bufio.NewWriter(writer) + defer buf.Flush() + var diffErr error + wf := func(format string, args ...interface{}) { + _, err := buf.WriteString(fmt.Sprintf(format, args...)) + if diffErr == nil && err != nil { + diffErr = err + } + } + ws := func(s string) { + _, err := buf.WriteString(s) + if diffErr == nil && err != nil { + diffErr = err + } + } + + if len(diff.Eol) == 0 { + diff.Eol = "\n" + } + + prefix := map[byte]string{ + 'i': "+ ", + 'd': "- ", + 'r': "! ", + 'e': " ", + } + + started := false + m := NewMatcher(diff.A, diff.B) + for _, g := range m.GetGroupedOpCodes(diff.Context) { + if !started { + started = true + fromDate := "" + if len(diff.FromDate) > 0 { + fromDate = "\t" + diff.FromDate + } + toDate := "" + if len(diff.ToDate) > 0 { + toDate = "\t" + diff.ToDate + } + if diff.FromFile != "" || diff.ToFile != "" { + wf("*** %s%s%s", diff.FromFile, fromDate, diff.Eol) + wf("--- %s%s%s", diff.ToFile, toDate, diff.Eol) + } + } + + first, last := g[0], g[len(g)-1] + ws("***************" + diff.Eol) + + range1 := formatRangeContext(first.I1, last.I2) + wf("*** %s ****%s", range1, diff.Eol) + for _, c := range g { + if c.Tag == 'r' || c.Tag == 'd' { + for _, cc := range g { + if cc.Tag == 'i' { + continue + } + for _, line := range diff.A[cc.I1:cc.I2] { + ws(prefix[cc.Tag] + line) + } + } + break + } + } + + range2 := formatRangeContext(first.J1, last.J2) + wf("--- %s ----%s", range2, diff.Eol) + for _, c := range g { + if c.Tag == 'r' || c.Tag == 'i' { + for _, cc := range g { + if cc.Tag == 'd' { + continue + } + for _, line := range diff.B[cc.J1:cc.J2] { + ws(prefix[cc.Tag] + line) + } + } + break + } + } + } + return diffErr +} + +// Like WriteContextDiff but returns the diff a string. +func GetContextDiffString(diff ContextDiff) (string, error) { + w := &bytes.Buffer{} + err := WriteContextDiff(w, diff) + return string(w.Bytes()), err +} + +// Split a string on "\n" while preserving them. The output can be used +// as input for UnifiedDiff and ContextDiff structures. +func SplitLines(s string) []string { + lines := strings.SplitAfter(s, "\n") + lines[len(lines)-1] += "\n" + return lines +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/AUTHORS.md b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/AUTHORS.md new file mode 100644 index 00000000..c5275d5a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/AUTHORS.md @@ -0,0 +1,18 @@ +The Prometheus project was started by Matt T. Proud (emeritus) and +Julius Volz in 2012. + +Maintainers of this repository: + +* Björn Rabenstein + +The following individuals have contributed code to this repository +(listed in alphabetical order): + +* Bernerd Schaefer +* Björn Rabenstein +* Daniel Bornkessel +* Jeff Younker +* Julius Volz +* Matt T. Proud +* Tobias Schmidt + diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/LICENSE b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/LICENSE new file mode 100644 index 00000000..261eeb9e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/NOTICE b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/NOTICE new file mode 100644 index 00000000..dd878a30 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/NOTICE @@ -0,0 +1,23 @@ +Prometheus instrumentation library for Go applications +Copyright 2012-2015 The Prometheus Authors + +This product includes software developed at +SoundCloud Ltd. (http://soundcloud.com/). + + +The following components are included in this product: + +perks - a fork of https://github.com/bmizerany/perks +https://github.com/beorn7/perks +Copyright 2013-2015 Blake Mizerany, Björn Rabenstein +See https://github.com/beorn7/perks/blob/master/README.md for license details. + +Go support for Protocol Buffers - Google's data interchange format +http://github.com/golang/protobuf/ +Copyright 2010 The Go Authors +See source code for license details. + +Support for streaming Protocol Buffer messages for the Go language (golang). +https://github.com/matttproud/golang_protobuf_extensions +Copyright 2013 Matt T. Proud +Licensed under the Apache License, Version 2.0 diff --git a/vendor/github.com/prometheus/client_golang/prometheus/.gitignore b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/.gitignore similarity index 100% rename from vendor/github.com/prometheus/client_golang/prometheus/.gitignore rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/.gitignore diff --git a/vendor/github.com/prometheus/client_golang/prometheus/README.md b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/README.md similarity index 100% rename from vendor/github.com/prometheus/client_golang/prometheus/README.md rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/README.md diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/collector.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/collector.go new file mode 100644 index 00000000..623d3d83 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/collector.go @@ -0,0 +1,75 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +// Collector is the interface implemented by anything that can be used by +// Prometheus to collect metrics. A Collector has to be registered for +// collection. See Registerer.Register. +// +// The stock metrics provided by this package (Gauge, Counter, Summary, +// Histogram, Untyped) are also Collectors (which only ever collect one metric, +// namely itself). An implementer of Collector may, however, collect multiple +// metrics in a coordinated fashion and/or create metrics on the fly. Examples +// for collectors already implemented in this library are the metric vectors +// (i.e. collection of multiple instances of the same Metric but with different +// label values) like GaugeVec or SummaryVec, and the ExpvarCollector. +type Collector interface { + // Describe sends the super-set of all possible descriptors of metrics + // collected by this Collector to the provided channel and returns once + // the last descriptor has been sent. The sent descriptors fulfill the + // consistency and uniqueness requirements described in the Desc + // documentation. (It is valid if one and the same Collector sends + // duplicate descriptors. Those duplicates are simply ignored. However, + // two different Collectors must not send duplicate descriptors.) This + // method idempotently sends the same descriptors throughout the + // lifetime of the Collector. If a Collector encounters an error while + // executing this method, it must send an invalid descriptor (created + // with NewInvalidDesc) to signal the error to the registry. + Describe(chan<- *Desc) + // Collect is called by the Prometheus registry when collecting + // metrics. The implementation sends each collected metric via the + // provided channel and returns once the last metric has been sent. The + // descriptor of each sent metric is one of those returned by + // Describe. Returned metrics that share the same descriptor must differ + // in their variable label values. This method may be called + // concurrently and must therefore be implemented in a concurrency safe + // way. Blocking occurs at the expense of total performance of rendering + // all registered metrics. Ideally, Collector implementations support + // concurrent readers. + Collect(chan<- Metric) +} + +// selfCollector implements Collector for a single Metric so that the Metric +// collects itself. Add it as an anonymous field to a struct that implements +// Metric, and call init with the Metric itself as an argument. +type selfCollector struct { + self Metric +} + +// init provides the selfCollector with a reference to the metric it is supposed +// to collect. It is usually called within the factory function to create a +// metric. See example. +func (c *selfCollector) init(self Metric) { + c.self = self +} + +// Describe implements Collector. +func (c *selfCollector) Describe(ch chan<- *Desc) { + ch <- c.self.Desc() +} + +// Collect implements Collector. +func (c *selfCollector) Collect(ch chan<- Metric) { + ch <- c.self +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/counter.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/counter.go new file mode 100644 index 00000000..ee37949a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/counter.go @@ -0,0 +1,172 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "errors" +) + +// Counter is a Metric that represents a single numerical value that only ever +// goes up. That implies that it cannot be used to count items whose number can +// also go down, e.g. the number of currently running goroutines. Those +// "counters" are represented by Gauges. +// +// A Counter is typically used to count requests served, tasks completed, errors +// occurred, etc. +// +// To create Counter instances, use NewCounter. +type Counter interface { + Metric + Collector + + // Set is used to set the Counter to an arbitrary value. It is only used + // if you have to transfer a value from an external counter into this + // Prometheus metric. Do not use it for regular handling of a + // Prometheus counter (as it can be used to break the contract of + // monotonically increasing values). + // + // Deprecated: Use NewConstMetric to create a counter for an external + // value. A Counter should never be set. + Set(float64) + // Inc increments the counter by 1. + Inc() + // Add adds the given value to the counter. It panics if the value is < + // 0. + Add(float64) +} + +// CounterOpts is an alias for Opts. See there for doc comments. +type CounterOpts Opts + +// NewCounter creates a new Counter based on the provided CounterOpts. +func NewCounter(opts CounterOpts) Counter { + desc := NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + nil, + opts.ConstLabels, + ) + result := &counter{value: value{desc: desc, valType: CounterValue, labelPairs: desc.constLabelPairs}} + result.init(result) // Init self-collection. + return result +} + +type counter struct { + value +} + +func (c *counter) Add(v float64) { + if v < 0 { + panic(errors.New("counter cannot decrease in value")) + } + c.value.Add(v) +} + +// CounterVec is a Collector that bundles a set of Counters that all share the +// same Desc, but have different values for their variable labels. This is used +// if you want to count the same thing partitioned by various dimensions +// (e.g. number of HTTP requests, partitioned by response code and +// method). Create instances with NewCounterVec. +// +// CounterVec embeds MetricVec. See there for a full list of methods with +// detailed documentation. +type CounterVec struct { + *MetricVec +} + +// NewCounterVec creates a new CounterVec based on the provided CounterOpts and +// partitioned by the given label names. At least one label name must be +// provided. +func NewCounterVec(opts CounterOpts, labelNames []string) *CounterVec { + desc := NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + labelNames, + opts.ConstLabels, + ) + return &CounterVec{ + MetricVec: newMetricVec(desc, func(lvs ...string) Metric { + result := &counter{value: value{ + desc: desc, + valType: CounterValue, + labelPairs: makeLabelPairs(desc, lvs), + }} + result.init(result) // Init self-collection. + return result + }), + } +} + +// GetMetricWithLabelValues replaces the method of the same name in +// MetricVec. The difference is that this method returns a Counter and not a +// Metric so that no type conversion is required. +func (m *CounterVec) GetMetricWithLabelValues(lvs ...string) (Counter, error) { + metric, err := m.MetricVec.GetMetricWithLabelValues(lvs...) + if metric != nil { + return metric.(Counter), err + } + return nil, err +} + +// GetMetricWith replaces the method of the same name in MetricVec. The +// difference is that this method returns a Counter and not a Metric so that no +// type conversion is required. +func (m *CounterVec) GetMetricWith(labels Labels) (Counter, error) { + metric, err := m.MetricVec.GetMetricWith(labels) + if metric != nil { + return metric.(Counter), err + } + return nil, err +} + +// WithLabelValues works as GetMetricWithLabelValues, but panics where +// GetMetricWithLabelValues would have returned an error. By not returning an +// error, WithLabelValues allows shortcuts like +// myVec.WithLabelValues("404", "GET").Add(42) +func (m *CounterVec) WithLabelValues(lvs ...string) Counter { + return m.MetricVec.WithLabelValues(lvs...).(Counter) +} + +// With works as GetMetricWith, but panics where GetMetricWithLabels would have +// returned an error. By not returning an error, With allows shortcuts like +// myVec.With(Labels{"code": "404", "method": "GET"}).Add(42) +func (m *CounterVec) With(labels Labels) Counter { + return m.MetricVec.With(labels).(Counter) +} + +// CounterFunc is a Counter whose value is determined at collect time by calling a +// provided function. +// +// To create CounterFunc instances, use NewCounterFunc. +type CounterFunc interface { + Metric + Collector +} + +// NewCounterFunc creates a new CounterFunc based on the provided +// CounterOpts. The value reported is determined by calling the given function +// from within the Write method. Take into account that metric collection may +// happen concurrently. If that results in concurrent calls to Write, like in +// the case where a CounterFunc is directly registered with Prometheus, the +// provided function must be concurrency-safe. The function should also honor +// the contract for a Counter (values only go up, not down), but compliance will +// not be checked. +func NewCounterFunc(opts CounterOpts, function func() float64) CounterFunc { + return newValueFunc(NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + nil, + opts.ConstLabels, + ), CounterValue, function) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/desc.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/desc.go new file mode 100644 index 00000000..77f4b30e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/desc.go @@ -0,0 +1,205 @@ +// Copyright 2016 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "errors" + "fmt" + "regexp" + "sort" + "strings" + + "github.com/golang/protobuf/proto" + + dto "github.com/prometheus/client_model/go" +) + +var ( + metricNameRE = regexp.MustCompile(`^[a-zA-Z_][a-zA-Z0-9_:]*$`) + labelNameRE = regexp.MustCompile("^[a-zA-Z_][a-zA-Z0-9_]*$") +) + +// reservedLabelPrefix is a prefix which is not legal in user-supplied +// label names. +const reservedLabelPrefix = "__" + +// Labels represents a collection of label name -> value mappings. This type is +// commonly used with the With(Labels) and GetMetricWith(Labels) methods of +// metric vector Collectors, e.g.: +// myVec.With(Labels{"code": "404", "method": "GET"}).Add(42) +// +// The other use-case is the specification of constant label pairs in Opts or to +// create a Desc. +type Labels map[string]string + +// Desc is the descriptor used by every Prometheus Metric. It is essentially +// the immutable meta-data of a Metric. The normal Metric implementations +// included in this package manage their Desc under the hood. Users only have to +// deal with Desc if they use advanced features like the ExpvarCollector or +// custom Collectors and Metrics. +// +// Descriptors registered with the same registry have to fulfill certain +// consistency and uniqueness criteria if they share the same fully-qualified +// name: They must have the same help string and the same label names (aka label +// dimensions) in each, constLabels and variableLabels, but they must differ in +// the values of the constLabels. +// +// Descriptors that share the same fully-qualified names and the same label +// values of their constLabels are considered equal. +// +// Use NewDesc to create new Desc instances. +type Desc struct { + // fqName has been built from Namespace, Subsystem, and Name. + fqName string + // help provides some helpful information about this metric. + help string + // constLabelPairs contains precalculated DTO label pairs based on + // the constant labels. + constLabelPairs []*dto.LabelPair + // VariableLabels contains names of labels for which the metric + // maintains variable values. + variableLabels []string + // id is a hash of the values of the ConstLabels and fqName. This + // must be unique among all registered descriptors and can therefore be + // used as an identifier of the descriptor. + id uint64 + // dimHash is a hash of the label names (preset and variable) and the + // Help string. Each Desc with the same fqName must have the same + // dimHash. + dimHash uint64 + // err is an error that occured during construction. It is reported on + // registration time. + err error +} + +// NewDesc allocates and initializes a new Desc. Errors are recorded in the Desc +// and will be reported on registration time. variableLabels and constLabels can +// be nil if no such labels should be set. fqName and help must not be empty. +// +// variableLabels only contain the label names. Their label values are variable +// and therefore not part of the Desc. (They are managed within the Metric.) +// +// For constLabels, the label values are constant. Therefore, they are fully +// specified in the Desc. See the Opts documentation for the implications of +// constant labels. +func NewDesc(fqName, help string, variableLabels []string, constLabels Labels) *Desc { + d := &Desc{ + fqName: fqName, + help: help, + variableLabels: variableLabels, + } + if help == "" { + d.err = errors.New("empty help string") + return d + } + if !metricNameRE.MatchString(fqName) { + d.err = fmt.Errorf("%q is not a valid metric name", fqName) + return d + } + // labelValues contains the label values of const labels (in order of + // their sorted label names) plus the fqName (at position 0). + labelValues := make([]string, 1, len(constLabels)+1) + labelValues[0] = fqName + labelNames := make([]string, 0, len(constLabels)+len(variableLabels)) + labelNameSet := map[string]struct{}{} + // First add only the const label names and sort them... + for labelName := range constLabels { + if !checkLabelName(labelName) { + d.err = fmt.Errorf("%q is not a valid label name", labelName) + return d + } + labelNames = append(labelNames, labelName) + labelNameSet[labelName] = struct{}{} + } + sort.Strings(labelNames) + // ... so that we can now add const label values in the order of their names. + for _, labelName := range labelNames { + labelValues = append(labelValues, constLabels[labelName]) + } + // Now add the variable label names, but prefix them with something that + // cannot be in a regular label name. That prevents matching the label + // dimension with a different mix between preset and variable labels. + for _, labelName := range variableLabels { + if !checkLabelName(labelName) { + d.err = fmt.Errorf("%q is not a valid label name", labelName) + return d + } + labelNames = append(labelNames, "$"+labelName) + labelNameSet[labelName] = struct{}{} + } + if len(labelNames) != len(labelNameSet) { + d.err = errors.New("duplicate label names") + return d + } + vh := hashNew() + for _, val := range labelValues { + vh = hashAdd(vh, val) + vh = hashAddByte(vh, separatorByte) + } + d.id = vh + // Sort labelNames so that order doesn't matter for the hash. + sort.Strings(labelNames) + // Now hash together (in this order) the help string and the sorted + // label names. + lh := hashNew() + lh = hashAdd(lh, help) + lh = hashAddByte(lh, separatorByte) + for _, labelName := range labelNames { + lh = hashAdd(lh, labelName) + lh = hashAddByte(lh, separatorByte) + } + d.dimHash = lh + + d.constLabelPairs = make([]*dto.LabelPair, 0, len(constLabels)) + for n, v := range constLabels { + d.constLabelPairs = append(d.constLabelPairs, &dto.LabelPair{ + Name: proto.String(n), + Value: proto.String(v), + }) + } + sort.Sort(LabelPairSorter(d.constLabelPairs)) + return d +} + +// NewInvalidDesc returns an invalid descriptor, i.e. a descriptor with the +// provided error set. If a collector returning such a descriptor is registered, +// registration will fail with the provided error. NewInvalidDesc can be used by +// a Collector to signal inability to describe itself. +func NewInvalidDesc(err error) *Desc { + return &Desc{ + err: err, + } +} + +func (d *Desc) String() string { + lpStrings := make([]string, 0, len(d.constLabelPairs)) + for _, lp := range d.constLabelPairs { + lpStrings = append( + lpStrings, + fmt.Sprintf("%s=%q", lp.GetName(), lp.GetValue()), + ) + } + return fmt.Sprintf( + "Desc{fqName: %q, help: %q, constLabels: {%s}, variableLabels: %v}", + d.fqName, + d.help, + strings.Join(lpStrings, ","), + d.variableLabels, + ) +} + +func checkLabelName(l string) bool { + return labelNameRE.MatchString(l) && + !strings.HasPrefix(l, reservedLabelPrefix) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/doc.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/doc.go new file mode 100644 index 00000000..b15a2d3b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/doc.go @@ -0,0 +1,181 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package prometheus provides metrics primitives to instrument code for +// monitoring. It also offers a registry for metrics. Sub-packages allow to +// expose the registered metrics via HTTP (package promhttp) or push them to a +// Pushgateway (package push). +// +// All exported functions and methods are safe to be used concurrently unless +//specified otherwise. +// +// A Basic Example +// +// As a starting point, a very basic usage example: +// +// package main +// +// import ( +// "net/http" +// +// "github.com/prometheus/client_golang/prometheus" +// "github.com/prometheus/client_golang/prometheus/promhttp" +// ) +// +// var ( +// cpuTemp = prometheus.NewGauge(prometheus.GaugeOpts{ +// Name: "cpu_temperature_celsius", +// Help: "Current temperature of the CPU.", +// }) +// hdFailures = prometheus.NewCounterVec( +// prometheus.CounterOpts{ +// Name: "hd_errors_total", +// Help: "Number of hard-disk errors.", +// }, +// []string{"device"}, +// ) +// ) +// +// func init() { +// // Metrics have to be registered to be exposed: +// prometheus.MustRegister(cpuTemp) +// prometheus.MustRegister(hdFailures) +// } +// +// func main() { +// cpuTemp.Set(65.3) +// hdFailures.With(prometheus.Labels{"device":"/dev/sda"}).Inc() +// +// // The Handler function provides a default handler to expose metrics +// // via an HTTP server. "/metrics" is the usual endpoint for that. +// http.Handle("/metrics", promhttp.Handler()) +// http.ListenAndServe(":8080", nil) +// } +// +// +// This is a complete program that exports two metrics, a Gauge and a Counter, +// the latter with a label attached to turn it into a (one-dimensional) vector. +// +// Metrics +// +// The number of exported identifiers in this package might appear a bit +// overwhelming. Hovever, in addition to the basic plumbing shown in the example +// above, you only need to understand the different metric types and their +// vector versions for basic usage. +// +// Above, you have already touched the Counter and the Gauge. There are two more +// advanced metric types: the Summary and Histogram. A more thorough description +// of those four metric types can be found in the Prometheus docs: +// https://prometheus.io/docs/concepts/metric_types/ +// +// A fifth "type" of metric is Untyped. It behaves like a Gauge, but signals the +// Prometheus server not to assume anything about its type. +// +// In addition to the fundamental metric types Gauge, Counter, Summary, +// Histogram, and Untyped, a very important part of the Prometheus data model is +// the partitioning of samples along dimensions called labels, which results in +// metric vectors. The fundamental types are GaugeVec, CounterVec, SummaryVec, +// HistogramVec, and UntypedVec. +// +// While only the fundamental metric types implement the Metric interface, both +// the metrics and their vector versions implement the Collector interface. A +// Collector manages the collection of a number of Metrics, but for convenience, +// a Metric can also “collect itselfâ€. Note that Gauge, Counter, Summary, +// Histogram, and Untyped are interfaces themselves while GaugeVec, CounterVec, +// SummaryVec, HistogramVec, and UntypedVec are not. +// +// To create instances of Metrics and their vector versions, you need a suitable +// …Opts struct, i.e. GaugeOpts, CounterOpts, SummaryOpts, +// HistogramOpts, or UntypedOpts. +// +// Custom Collectors and constant Metrics +// +// While you could create your own implementations of Metric, most likely you +// will only ever implement the Collector interface on your own. At a first +// glance, a custom Collector seems handy to bundle Metrics for common +// registration (with the prime example of the different metric vectors above, +// which bundle all the metrics of the same name but with different labels). +// +// There is a more involved use case, too: If you already have metrics +// available, created outside of the Prometheus context, you don't need the +// interface of the various Metric types. You essentially want to mirror the +// existing numbers into Prometheus Metrics during collection. An own +// implementation of the Collector interface is perfect for that. You can create +// Metric instances “on the fly†using NewConstMetric, NewConstHistogram, and +// NewConstSummary (and their respective Must… versions). That will happen in +// the Collect method. The Describe method has to return separate Desc +// instances, representative of the “throw-away†metrics to be created +// later. NewDesc comes in handy to create those Desc instances. +// +// The Collector example illustrates the use case. You can also look at the +// source code of the processCollector (mirroring process metrics), the +// goCollector (mirroring Go metrics), or the expvarCollector (mirroring expvar +// metrics) as examples that are used in this package itself. +// +// If you just need to call a function to get a single float value to collect as +// a metric, GaugeFunc, CounterFunc, or UntypedFunc might be interesting +// shortcuts. +// +// Advanced Uses of the Registry +// +// While MustRegister is the by far most common way of registering a Collector, +// sometimes you might want to handle the errors the registration might +// cause. As suggested by the name, MustRegister panics if an error occurs. With +// the Register function, the error is returned and can be handled. +// +// An error is returned if the registered Collector is incompatible or +// inconsistent with already registered metrics. The registry aims for +// consistency of the collected metrics according to the Prometheus data +// model. Inconsistencies are ideally detected at registration time, not at +// collect time. The former will usually be detected at start-up time of a +// program, while the latter will only happen at scrape time, possibly not even +// on the first scrape if the inconsistency only becomes relevant later. That is +// the main reason why a Collector and a Metric have to describe themselves to +// the registry. +// +// So far, everything we did operated on the so-called default registry, as it +// can be found in the global DefaultRegistry variable. With NewRegistry, you +// can create a custom registry, or you can even implement the Registerer or +// Gatherer interfaces yourself. The methods Register and Unregister work in +// the same way on a custom registry as the global functions Register and +// Unregister on the default registry. +// +// There are a number of uses for custom registries: You can use registries +// with special properties, see NewPedanticRegistry. You can avoid global state, +// as it is imposed by the DefaultRegistry. You can use multiple registries at +// the same time to expose different metrics in different ways. You can use +// separate registries for testing purposes. +// +// Also note that the DefaultRegistry comes registered with a Collector for Go +// runtime metrics (via NewGoCollector) and a Collector for process metrics (via +// NewProcessCollector). With a custom registry, you are in control and decide +// yourself about the Collectors to register. +// +// HTTP Exposition +// +// The Registry implements the Gatherer interface. The caller of the Gather +// method can then expose the gathered metrics in some way. Usually, the metrics +// are served via HTTP on the /metrics endpoint. That's happening in the example +// above. The tools to expose metrics via HTTP are in the promhttp +// sub-package. (The top-level functions in the prometheus package are +// deprecated.) +// +// Pushing to the Pushgateway +// +// Function for pushing to the Pushgateway can be found in the push sub-package. +// +// Other Means of Exposition +// +// More ways of exposing metrics can easily be added. Sending metrics to +// Graphite would be an example that will soon be implemented. +package prometheus diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/expvar_collector.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/expvar_collector.go new file mode 100644 index 00000000..18a99d5f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/expvar_collector.go @@ -0,0 +1,119 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "encoding/json" + "expvar" +) + +type expvarCollector struct { + exports map[string]*Desc +} + +// NewExpvarCollector returns a newly allocated expvar Collector that still has +// to be registered with a Prometheus registry. +// +// An expvar Collector collects metrics from the expvar interface. It provides a +// quick way to expose numeric values that are already exported via expvar as +// Prometheus metrics. Note that the data models of expvar and Prometheus are +// fundamentally different, and that the expvar Collector is inherently slower +// than native Prometheus metrics. Thus, the expvar Collector is probably great +// for experiments and prototying, but you should seriously consider a more +// direct implementation of Prometheus metrics for monitoring production +// systems. +// +// The exports map has the following meaning: +// +// The keys in the map correspond to expvar keys, i.e. for every expvar key you +// want to export as Prometheus metric, you need an entry in the exports +// map. The descriptor mapped to each key describes how to export the expvar +// value. It defines the name and the help string of the Prometheus metric +// proxying the expvar value. The type will always be Untyped. +// +// For descriptors without variable labels, the expvar value must be a number or +// a bool. The number is then directly exported as the Prometheus sample +// value. (For a bool, 'false' translates to 0 and 'true' to 1). Expvar values +// that are not numbers or bools are silently ignored. +// +// If the descriptor has one variable label, the expvar value must be an expvar +// map. The keys in the expvar map become the various values of the one +// Prometheus label. The values in the expvar map must be numbers or bools again +// as above. +// +// For descriptors with more than one variable label, the expvar must be a +// nested expvar map, i.e. where the values of the topmost map are maps again +// etc. until a depth is reached that corresponds to the number of labels. The +// leaves of that structure must be numbers or bools as above to serve as the +// sample values. +// +// Anything that does not fit into the scheme above is silently ignored. +func NewExpvarCollector(exports map[string]*Desc) Collector { + return &expvarCollector{ + exports: exports, + } +} + +// Describe implements Collector. +func (e *expvarCollector) Describe(ch chan<- *Desc) { + for _, desc := range e.exports { + ch <- desc + } +} + +// Collect implements Collector. +func (e *expvarCollector) Collect(ch chan<- Metric) { + for name, desc := range e.exports { + var m Metric + expVar := expvar.Get(name) + if expVar == nil { + continue + } + var v interface{} + labels := make([]string, len(desc.variableLabels)) + if err := json.Unmarshal([]byte(expVar.String()), &v); err != nil { + ch <- NewInvalidMetric(desc, err) + continue + } + var processValue func(v interface{}, i int) + processValue = func(v interface{}, i int) { + if i >= len(labels) { + copiedLabels := append(make([]string, 0, len(labels)), labels...) + switch v := v.(type) { + case float64: + m = MustNewConstMetric(desc, UntypedValue, v, copiedLabels...) + case bool: + if v { + m = MustNewConstMetric(desc, UntypedValue, 1, copiedLabels...) + } else { + m = MustNewConstMetric(desc, UntypedValue, 0, copiedLabels...) + } + default: + return + } + ch <- m + return + } + vm, ok := v.(map[string]interface{}) + if !ok { + return + } + for lv, val := range vm { + labels[i] = lv + processValue(val, i+1) + } + } + processValue(v, 0) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/fnv.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/fnv.go new file mode 100644 index 00000000..e3b67df8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/fnv.go @@ -0,0 +1,29 @@ +package prometheus + +// Inline and byte-free variant of hash/fnv's fnv64a. + +const ( + offset64 = 14695981039346656037 + prime64 = 1099511628211 +) + +// hashNew initializies a new fnv64a hash value. +func hashNew() uint64 { + return offset64 +} + +// hashAdd adds a string to a fnv64a hash value, returning the updated hash. +func hashAdd(h uint64, s string) uint64 { + for i := 0; i < len(s); i++ { + h ^= uint64(s[i]) + h *= prime64 + } + return h +} + +// hashAddByte adds a byte to a fnv64a hash value, returning the updated hash. +func hashAddByte(h uint64, b byte) uint64 { + h ^= uint64(b) + h *= prime64 + return h +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/gauge.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/gauge.go new file mode 100644 index 00000000..8b70e514 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/gauge.go @@ -0,0 +1,140 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +// Gauge is a Metric that represents a single numerical value that can +// arbitrarily go up and down. +// +// A Gauge is typically used for measured values like temperatures or current +// memory usage, but also "counts" that can go up and down, like the number of +// running goroutines. +// +// To create Gauge instances, use NewGauge. +type Gauge interface { + Metric + Collector + + // Set sets the Gauge to an arbitrary value. + Set(float64) + // Inc increments the Gauge by 1. + Inc() + // Dec decrements the Gauge by 1. + Dec() + // Add adds the given value to the Gauge. (The value can be + // negative, resulting in a decrease of the Gauge.) + Add(float64) + // Sub subtracts the given value from the Gauge. (The value can be + // negative, resulting in an increase of the Gauge.) + Sub(float64) +} + +// GaugeOpts is an alias for Opts. See there for doc comments. +type GaugeOpts Opts + +// NewGauge creates a new Gauge based on the provided GaugeOpts. +func NewGauge(opts GaugeOpts) Gauge { + return newValue(NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + nil, + opts.ConstLabels, + ), GaugeValue, 0) +} + +// GaugeVec is a Collector that bundles a set of Gauges that all share the same +// Desc, but have different values for their variable labels. This is used if +// you want to count the same thing partitioned by various dimensions +// (e.g. number of operations queued, partitioned by user and operation +// type). Create instances with NewGaugeVec. +type GaugeVec struct { + *MetricVec +} + +// NewGaugeVec creates a new GaugeVec based on the provided GaugeOpts and +// partitioned by the given label names. At least one label name must be +// provided. +func NewGaugeVec(opts GaugeOpts, labelNames []string) *GaugeVec { + desc := NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + labelNames, + opts.ConstLabels, + ) + return &GaugeVec{ + MetricVec: newMetricVec(desc, func(lvs ...string) Metric { + return newValue(desc, GaugeValue, 0, lvs...) + }), + } +} + +// GetMetricWithLabelValues replaces the method of the same name in +// MetricVec. The difference is that this method returns a Gauge and not a +// Metric so that no type conversion is required. +func (m *GaugeVec) GetMetricWithLabelValues(lvs ...string) (Gauge, error) { + metric, err := m.MetricVec.GetMetricWithLabelValues(lvs...) + if metric != nil { + return metric.(Gauge), err + } + return nil, err +} + +// GetMetricWith replaces the method of the same name in MetricVec. The +// difference is that this method returns a Gauge and not a Metric so that no +// type conversion is required. +func (m *GaugeVec) GetMetricWith(labels Labels) (Gauge, error) { + metric, err := m.MetricVec.GetMetricWith(labels) + if metric != nil { + return metric.(Gauge), err + } + return nil, err +} + +// WithLabelValues works as GetMetricWithLabelValues, but panics where +// GetMetricWithLabelValues would have returned an error. By not returning an +// error, WithLabelValues allows shortcuts like +// myVec.WithLabelValues("404", "GET").Add(42) +func (m *GaugeVec) WithLabelValues(lvs ...string) Gauge { + return m.MetricVec.WithLabelValues(lvs...).(Gauge) +} + +// With works as GetMetricWith, but panics where GetMetricWithLabels would have +// returned an error. By not returning an error, With allows shortcuts like +// myVec.With(Labels{"code": "404", "method": "GET"}).Add(42) +func (m *GaugeVec) With(labels Labels) Gauge { + return m.MetricVec.With(labels).(Gauge) +} + +// GaugeFunc is a Gauge whose value is determined at collect time by calling a +// provided function. +// +// To create GaugeFunc instances, use NewGaugeFunc. +type GaugeFunc interface { + Metric + Collector +} + +// NewGaugeFunc creates a new GaugeFunc based on the provided GaugeOpts. The +// value reported is determined by calling the given function from within the +// Write method. Take into account that metric collection may happen +// concurrently. If that results in concurrent calls to Write, like in the case +// where a GaugeFunc is directly registered with Prometheus, the provided +// function must be concurrency-safe. +func NewGaugeFunc(opts GaugeOpts, function func() float64) GaugeFunc { + return newValueFunc(NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + nil, + opts.ConstLabels, + ), GaugeValue, function) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/go_collector.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/go_collector.go new file mode 100644 index 00000000..abc9d4ec --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/go_collector.go @@ -0,0 +1,263 @@ +package prometheus + +import ( + "fmt" + "runtime" + "runtime/debug" + "time" +) + +type goCollector struct { + goroutines Gauge + gcDesc *Desc + + // metrics to describe and collect + metrics memStatsMetrics +} + +// NewGoCollector returns a collector which exports metrics about the current +// go process. +func NewGoCollector() Collector { + return &goCollector{ + goroutines: NewGauge(GaugeOpts{ + Namespace: "go", + Name: "goroutines", + Help: "Number of goroutines that currently exist.", + }), + gcDesc: NewDesc( + "go_gc_duration_seconds", + "A summary of the GC invocation durations.", + nil, nil), + metrics: memStatsMetrics{ + { + desc: NewDesc( + memstatNamespace("alloc_bytes"), + "Number of bytes allocated and still in use.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.Alloc) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("alloc_bytes_total"), + "Total number of bytes allocated, even if freed.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.TotalAlloc) }, + valType: CounterValue, + }, { + desc: NewDesc( + memstatNamespace("sys_bytes"), + "Number of bytes obtained by system. Sum of all system allocations.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.Sys) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("lookups_total"), + "Total number of pointer lookups.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.Lookups) }, + valType: CounterValue, + }, { + desc: NewDesc( + memstatNamespace("mallocs_total"), + "Total number of mallocs.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.Mallocs) }, + valType: CounterValue, + }, { + desc: NewDesc( + memstatNamespace("frees_total"), + "Total number of frees.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.Frees) }, + valType: CounterValue, + }, { + desc: NewDesc( + memstatNamespace("heap_alloc_bytes"), + "Number of heap bytes allocated and still in use.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.HeapAlloc) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("heap_sys_bytes"), + "Number of heap bytes obtained from system.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.HeapSys) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("heap_idle_bytes"), + "Number of heap bytes waiting to be used.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.HeapIdle) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("heap_inuse_bytes"), + "Number of heap bytes that are in use.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.HeapInuse) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("heap_released_bytes_total"), + "Total number of heap bytes released to OS.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.HeapReleased) }, + valType: CounterValue, + }, { + desc: NewDesc( + memstatNamespace("heap_objects"), + "Number of allocated objects.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.HeapObjects) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("stack_inuse_bytes"), + "Number of bytes in use by the stack allocator.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.StackInuse) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("stack_sys_bytes"), + "Number of bytes obtained from system for stack allocator.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.StackSys) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("mspan_inuse_bytes"), + "Number of bytes in use by mspan structures.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.MSpanInuse) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("mspan_sys_bytes"), + "Number of bytes used for mspan structures obtained from system.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.MSpanSys) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("mcache_inuse_bytes"), + "Number of bytes in use by mcache structures.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.MCacheInuse) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("mcache_sys_bytes"), + "Number of bytes used for mcache structures obtained from system.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.MCacheSys) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("buck_hash_sys_bytes"), + "Number of bytes used by the profiling bucket hash table.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.BuckHashSys) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("gc_sys_bytes"), + "Number of bytes used for garbage collection system metadata.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.GCSys) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("other_sys_bytes"), + "Number of bytes used for other system allocations.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.OtherSys) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("next_gc_bytes"), + "Number of heap bytes when next garbage collection will take place.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.NextGC) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("last_gc_time_seconds"), + "Number of seconds since 1970 of last garbage collection.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.LastGC) / 1e9 }, + valType: GaugeValue, + }, + }, + } +} + +func memstatNamespace(s string) string { + return fmt.Sprintf("go_memstats_%s", s) +} + +// Describe returns all descriptions of the collector. +func (c *goCollector) Describe(ch chan<- *Desc) { + ch <- c.goroutines.Desc() + ch <- c.gcDesc + + for _, i := range c.metrics { + ch <- i.desc + } +} + +// Collect returns the current state of all metrics of the collector. +func (c *goCollector) Collect(ch chan<- Metric) { + c.goroutines.Set(float64(runtime.NumGoroutine())) + ch <- c.goroutines + + var stats debug.GCStats + stats.PauseQuantiles = make([]time.Duration, 5) + debug.ReadGCStats(&stats) + + quantiles := make(map[float64]float64) + for idx, pq := range stats.PauseQuantiles[1:] { + quantiles[float64(idx+1)/float64(len(stats.PauseQuantiles)-1)] = pq.Seconds() + } + quantiles[0.0] = stats.PauseQuantiles[0].Seconds() + ch <- MustNewConstSummary(c.gcDesc, uint64(stats.NumGC), float64(stats.PauseTotal.Seconds()), quantiles) + + ms := &runtime.MemStats{} + runtime.ReadMemStats(ms) + for _, i := range c.metrics { + ch <- MustNewConstMetric(i.desc, i.valType, i.eval(ms)) + } +} + +// memStatsMetrics provide description, value, and value type for memstat metrics. +type memStatsMetrics []struct { + desc *Desc + eval func(*runtime.MemStats) float64 + valType ValueType +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/histogram.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/histogram.go new file mode 100644 index 00000000..9719e8fa --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/histogram.go @@ -0,0 +1,444 @@ +// Copyright 2015 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "fmt" + "math" + "sort" + "sync/atomic" + + "github.com/golang/protobuf/proto" + + dto "github.com/prometheus/client_model/go" +) + +// A Histogram counts individual observations from an event or sample stream in +// configurable buckets. Similar to a summary, it also provides a sum of +// observations and an observation count. +// +// On the Prometheus server, quantiles can be calculated from a Histogram using +// the histogram_quantile function in the query language. +// +// Note that Histograms, in contrast to Summaries, can be aggregated with the +// Prometheus query language (see the documentation for detailed +// procedures). However, Histograms require the user to pre-define suitable +// buckets, and they are in general less accurate. The Observe method of a +// Histogram has a very low performance overhead in comparison with the Observe +// method of a Summary. +// +// To create Histogram instances, use NewHistogram. +type Histogram interface { + Metric + Collector + + // Observe adds a single observation to the histogram. + Observe(float64) +} + +// bucketLabel is used for the label that defines the upper bound of a +// bucket of a histogram ("le" -> "less or equal"). +const bucketLabel = "le" + +// DefBuckets are the default Histogram buckets. The default buckets are +// tailored to broadly measure the response time (in seconds) of a network +// service. Most likely, however, you will be required to define buckets +// customized to your use case. +var ( + DefBuckets = []float64{.005, .01, .025, .05, .1, .25, .5, 1, 2.5, 5, 10} + + errBucketLabelNotAllowed = fmt.Errorf( + "%q is not allowed as label name in histograms", bucketLabel, + ) +) + +// LinearBuckets creates 'count' buckets, each 'width' wide, where the lowest +// bucket has an upper bound of 'start'. The final +Inf bucket is not counted +// and not included in the returned slice. The returned slice is meant to be +// used for the Buckets field of HistogramOpts. +// +// The function panics if 'count' is zero or negative. +func LinearBuckets(start, width float64, count int) []float64 { + if count < 1 { + panic("LinearBuckets needs a positive count") + } + buckets := make([]float64, count) + for i := range buckets { + buckets[i] = start + start += width + } + return buckets +} + +// ExponentialBuckets creates 'count' buckets, where the lowest bucket has an +// upper bound of 'start' and each following bucket's upper bound is 'factor' +// times the previous bucket's upper bound. The final +Inf bucket is not counted +// and not included in the returned slice. The returned slice is meant to be +// used for the Buckets field of HistogramOpts. +// +// The function panics if 'count' is 0 or negative, if 'start' is 0 or negative, +// or if 'factor' is less than or equal 1. +func ExponentialBuckets(start, factor float64, count int) []float64 { + if count < 1 { + panic("ExponentialBuckets needs a positive count") + } + if start <= 0 { + panic("ExponentialBuckets needs a positive start value") + } + if factor <= 1 { + panic("ExponentialBuckets needs a factor greater than 1") + } + buckets := make([]float64, count) + for i := range buckets { + buckets[i] = start + start *= factor + } + return buckets +} + +// HistogramOpts bundles the options for creating a Histogram metric. It is +// mandatory to set Name and Help to a non-empty string. All other fields are +// optional and can safely be left at their zero value. +type HistogramOpts struct { + // Namespace, Subsystem, and Name are components of the fully-qualified + // name of the Histogram (created by joining these components with + // "_"). Only Name is mandatory, the others merely help structuring the + // name. Note that the fully-qualified name of the Histogram must be a + // valid Prometheus metric name. + Namespace string + Subsystem string + Name string + + // Help provides information about this Histogram. Mandatory! + // + // Metrics with the same fully-qualified name must have the same Help + // string. + Help string + + // ConstLabels are used to attach fixed labels to this + // Histogram. Histograms with the same fully-qualified name must have the + // same label names in their ConstLabels. + // + // Note that in most cases, labels have a value that varies during the + // lifetime of a process. Those labels are usually managed with a + // HistogramVec. ConstLabels serve only special purposes. One is for the + // special case where the value of a label does not change during the + // lifetime of a process, e.g. if the revision of the running binary is + // put into a label. Another, more advanced purpose is if more than one + // Collector needs to collect Histograms with the same fully-qualified + // name. In that case, those Summaries must differ in the values of + // their ConstLabels. See the Collector examples. + // + // If the value of a label never changes (not even between binaries), + // that label most likely should not be a label at all (but part of the + // metric name). + ConstLabels Labels + + // Buckets defines the buckets into which observations are counted. Each + // element in the slice is the upper inclusive bound of a bucket. The + // values must be sorted in strictly increasing order. There is no need + // to add a highest bucket with +Inf bound, it will be added + // implicitly. The default value is DefBuckets. + Buckets []float64 +} + +// NewHistogram creates a new Histogram based on the provided HistogramOpts. It +// panics if the buckets in HistogramOpts are not in strictly increasing order. +func NewHistogram(opts HistogramOpts) Histogram { + return newHistogram( + NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + nil, + opts.ConstLabels, + ), + opts, + ) +} + +func newHistogram(desc *Desc, opts HistogramOpts, labelValues ...string) Histogram { + if len(desc.variableLabels) != len(labelValues) { + panic(errInconsistentCardinality) + } + + for _, n := range desc.variableLabels { + if n == bucketLabel { + panic(errBucketLabelNotAllowed) + } + } + for _, lp := range desc.constLabelPairs { + if lp.GetName() == bucketLabel { + panic(errBucketLabelNotAllowed) + } + } + + if len(opts.Buckets) == 0 { + opts.Buckets = DefBuckets + } + + h := &histogram{ + desc: desc, + upperBounds: opts.Buckets, + labelPairs: makeLabelPairs(desc, labelValues), + } + for i, upperBound := range h.upperBounds { + if i < len(h.upperBounds)-1 { + if upperBound >= h.upperBounds[i+1] { + panic(fmt.Errorf( + "histogram buckets must be in increasing order: %f >= %f", + upperBound, h.upperBounds[i+1], + )) + } + } else { + if math.IsInf(upperBound, +1) { + // The +Inf bucket is implicit. Remove it here. + h.upperBounds = h.upperBounds[:i] + } + } + } + // Finally we know the final length of h.upperBounds and can make counts. + h.counts = make([]uint64, len(h.upperBounds)) + + h.init(h) // Init self-collection. + return h +} + +type histogram struct { + // sumBits contains the bits of the float64 representing the sum of all + // observations. sumBits and count have to go first in the struct to + // guarantee alignment for atomic operations. + // http://golang.org/pkg/sync/atomic/#pkg-note-BUG + sumBits uint64 + count uint64 + + selfCollector + // Note that there is no mutex required. + + desc *Desc + + upperBounds []float64 + counts []uint64 + + labelPairs []*dto.LabelPair +} + +func (h *histogram) Desc() *Desc { + return h.desc +} + +func (h *histogram) Observe(v float64) { + // TODO(beorn7): For small numbers of buckets (<30), a linear search is + // slightly faster than the binary search. If we really care, we could + // switch from one search strategy to the other depending on the number + // of buckets. + // + // Microbenchmarks (BenchmarkHistogramNoLabels): + // 11 buckets: 38.3 ns/op linear - binary 48.7 ns/op + // 100 buckets: 78.1 ns/op linear - binary 54.9 ns/op + // 300 buckets: 154 ns/op linear - binary 61.6 ns/op + i := sort.SearchFloat64s(h.upperBounds, v) + if i < len(h.counts) { + atomic.AddUint64(&h.counts[i], 1) + } + atomic.AddUint64(&h.count, 1) + for { + oldBits := atomic.LoadUint64(&h.sumBits) + newBits := math.Float64bits(math.Float64frombits(oldBits) + v) + if atomic.CompareAndSwapUint64(&h.sumBits, oldBits, newBits) { + break + } + } +} + +func (h *histogram) Write(out *dto.Metric) error { + his := &dto.Histogram{} + buckets := make([]*dto.Bucket, len(h.upperBounds)) + + his.SampleSum = proto.Float64(math.Float64frombits(atomic.LoadUint64(&h.sumBits))) + his.SampleCount = proto.Uint64(atomic.LoadUint64(&h.count)) + var count uint64 + for i, upperBound := range h.upperBounds { + count += atomic.LoadUint64(&h.counts[i]) + buckets[i] = &dto.Bucket{ + CumulativeCount: proto.Uint64(count), + UpperBound: proto.Float64(upperBound), + } + } + his.Bucket = buckets + out.Histogram = his + out.Label = h.labelPairs + return nil +} + +// HistogramVec is a Collector that bundles a set of Histograms that all share the +// same Desc, but have different values for their variable labels. This is used +// if you want to count the same thing partitioned by various dimensions +// (e.g. HTTP request latencies, partitioned by status code and method). Create +// instances with NewHistogramVec. +type HistogramVec struct { + *MetricVec +} + +// NewHistogramVec creates a new HistogramVec based on the provided HistogramOpts and +// partitioned by the given label names. At least one label name must be +// provided. +func NewHistogramVec(opts HistogramOpts, labelNames []string) *HistogramVec { + desc := NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + labelNames, + opts.ConstLabels, + ) + return &HistogramVec{ + MetricVec: newMetricVec(desc, func(lvs ...string) Metric { + return newHistogram(desc, opts, lvs...) + }), + } +} + +// GetMetricWithLabelValues replaces the method of the same name in +// MetricVec. The difference is that this method returns a Histogram and not a +// Metric so that no type conversion is required. +func (m *HistogramVec) GetMetricWithLabelValues(lvs ...string) (Histogram, error) { + metric, err := m.MetricVec.GetMetricWithLabelValues(lvs...) + if metric != nil { + return metric.(Histogram), err + } + return nil, err +} + +// GetMetricWith replaces the method of the same name in MetricVec. The +// difference is that this method returns a Histogram and not a Metric so that no +// type conversion is required. +func (m *HistogramVec) GetMetricWith(labels Labels) (Histogram, error) { + metric, err := m.MetricVec.GetMetricWith(labels) + if metric != nil { + return metric.(Histogram), err + } + return nil, err +} + +// WithLabelValues works as GetMetricWithLabelValues, but panics where +// GetMetricWithLabelValues would have returned an error. By not returning an +// error, WithLabelValues allows shortcuts like +// myVec.WithLabelValues("404", "GET").Observe(42.21) +func (m *HistogramVec) WithLabelValues(lvs ...string) Histogram { + return m.MetricVec.WithLabelValues(lvs...).(Histogram) +} + +// With works as GetMetricWith, but panics where GetMetricWithLabels would have +// returned an error. By not returning an error, With allows shortcuts like +// myVec.With(Labels{"code": "404", "method": "GET"}).Observe(42.21) +func (m *HistogramVec) With(labels Labels) Histogram { + return m.MetricVec.With(labels).(Histogram) +} + +type constHistogram struct { + desc *Desc + count uint64 + sum float64 + buckets map[float64]uint64 + labelPairs []*dto.LabelPair +} + +func (h *constHistogram) Desc() *Desc { + return h.desc +} + +func (h *constHistogram) Write(out *dto.Metric) error { + his := &dto.Histogram{} + buckets := make([]*dto.Bucket, 0, len(h.buckets)) + + his.SampleCount = proto.Uint64(h.count) + his.SampleSum = proto.Float64(h.sum) + + for upperBound, count := range h.buckets { + buckets = append(buckets, &dto.Bucket{ + CumulativeCount: proto.Uint64(count), + UpperBound: proto.Float64(upperBound), + }) + } + + if len(buckets) > 0 { + sort.Sort(buckSort(buckets)) + } + his.Bucket = buckets + + out.Histogram = his + out.Label = h.labelPairs + + return nil +} + +// NewConstHistogram returns a metric representing a Prometheus histogram with +// fixed values for the count, sum, and bucket counts. As those parameters +// cannot be changed, the returned value does not implement the Histogram +// interface (but only the Metric interface). Users of this package will not +// have much use for it in regular operations. However, when implementing custom +// Collectors, it is useful as a throw-away metric that is generated on the fly +// to send it to Prometheus in the Collect method. +// +// buckets is a map of upper bounds to cumulative counts, excluding the +Inf +// bucket. +// +// NewConstHistogram returns an error if the length of labelValues is not +// consistent with the variable labels in Desc. +func NewConstHistogram( + desc *Desc, + count uint64, + sum float64, + buckets map[float64]uint64, + labelValues ...string, +) (Metric, error) { + if len(desc.variableLabels) != len(labelValues) { + return nil, errInconsistentCardinality + } + return &constHistogram{ + desc: desc, + count: count, + sum: sum, + buckets: buckets, + labelPairs: makeLabelPairs(desc, labelValues), + }, nil +} + +// MustNewConstHistogram is a version of NewConstHistogram that panics where +// NewConstMetric would have returned an error. +func MustNewConstHistogram( + desc *Desc, + count uint64, + sum float64, + buckets map[float64]uint64, + labelValues ...string, +) Metric { + m, err := NewConstHistogram(desc, count, sum, buckets, labelValues...) + if err != nil { + panic(err) + } + return m +} + +type buckSort []*dto.Bucket + +func (s buckSort) Len() int { + return len(s) +} + +func (s buckSort) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +func (s buckSort) Less(i, j int) bool { + return s[i].GetUpperBound() < s[j].GetUpperBound() +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/http.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/http.go new file mode 100644 index 00000000..67ee5ac7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/http.go @@ -0,0 +1,490 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "bufio" + "bytes" + "compress/gzip" + "fmt" + "io" + "net" + "net/http" + "strconv" + "strings" + "sync" + "time" + + "github.com/prometheus/common/expfmt" +) + +// TODO(beorn7): Remove this whole file. It is a partial mirror of +// promhttp/http.go (to avoid circular import chains) where everything HTTP +// related should live. The functions here are just for avoiding +// breakage. Everything is deprecated. + +const ( + contentTypeHeader = "Content-Type" + contentLengthHeader = "Content-Length" + contentEncodingHeader = "Content-Encoding" + acceptEncodingHeader = "Accept-Encoding" +) + +var bufPool sync.Pool + +func getBuf() *bytes.Buffer { + buf := bufPool.Get() + if buf == nil { + return &bytes.Buffer{} + } + return buf.(*bytes.Buffer) +} + +func giveBuf(buf *bytes.Buffer) { + buf.Reset() + bufPool.Put(buf) +} + +// Handler returns an HTTP handler for the DefaultGatherer. It is +// already instrumented with InstrumentHandler (using "prometheus" as handler +// name). +// +// Deprecated: Please note the issues described in the doc comment of +// InstrumentHandler. You might want to consider using promhttp.Handler instead +// (which is non instrumented). +func Handler() http.Handler { + return InstrumentHandler("prometheus", UninstrumentedHandler()) +} + +// UninstrumentedHandler returns an HTTP handler for the DefaultGatherer. +// +// Deprecated: Use promhttp.Handler instead. See there for further documentation. +func UninstrumentedHandler() http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + mfs, err := DefaultGatherer.Gather() + if err != nil { + http.Error(w, "An error has occurred during metrics collection:\n\n"+err.Error(), http.StatusInternalServerError) + return + } + + contentType := expfmt.Negotiate(req.Header) + buf := getBuf() + defer giveBuf(buf) + writer, encoding := decorateWriter(req, buf) + enc := expfmt.NewEncoder(writer, contentType) + var lastErr error + for _, mf := range mfs { + if err := enc.Encode(mf); err != nil { + lastErr = err + http.Error(w, "An error has occurred during metrics encoding:\n\n"+err.Error(), http.StatusInternalServerError) + return + } + } + if closer, ok := writer.(io.Closer); ok { + closer.Close() + } + if lastErr != nil && buf.Len() == 0 { + http.Error(w, "No metrics encoded, last error:\n\n"+err.Error(), http.StatusInternalServerError) + return + } + header := w.Header() + header.Set(contentTypeHeader, string(contentType)) + header.Set(contentLengthHeader, fmt.Sprint(buf.Len())) + if encoding != "" { + header.Set(contentEncodingHeader, encoding) + } + w.Write(buf.Bytes()) + }) +} + +// decorateWriter wraps a writer to handle gzip compression if requested. It +// returns the decorated writer and the appropriate "Content-Encoding" header +// (which is empty if no compression is enabled). +func decorateWriter(request *http.Request, writer io.Writer) (io.Writer, string) { + header := request.Header.Get(acceptEncodingHeader) + parts := strings.Split(header, ",") + for _, part := range parts { + part := strings.TrimSpace(part) + if part == "gzip" || strings.HasPrefix(part, "gzip;") { + return gzip.NewWriter(writer), "gzip" + } + } + return writer, "" +} + +var instLabels = []string{"method", "code"} + +type nower interface { + Now() time.Time +} + +type nowFunc func() time.Time + +func (n nowFunc) Now() time.Time { + return n() +} + +var now nower = nowFunc(func() time.Time { + return time.Now() +}) + +func nowSeries(t ...time.Time) nower { + return nowFunc(func() time.Time { + defer func() { + t = t[1:] + }() + + return t[0] + }) +} + +// InstrumentHandler wraps the given HTTP handler for instrumentation. It +// registers four metric collectors (if not already done) and reports HTTP +// metrics to the (newly or already) registered collectors: http_requests_total +// (CounterVec), http_request_duration_microseconds (Summary), +// http_request_size_bytes (Summary), http_response_size_bytes (Summary). Each +// has a constant label named "handler" with the provided handlerName as +// value. http_requests_total is a metric vector partitioned by HTTP method +// (label name "method") and HTTP status code (label name "code"). +// +// Deprecated: InstrumentHandler has several issues: +// +// - It uses Summaries rather than Histograms. Summaries are not useful if +// aggregation across multiple instances is required. +// +// - It uses microseconds as unit, which is deprecated and should be replaced by +// seconds. +// +// - The size of the request is calculated in a separate goroutine. Since this +// calculator requires access to the request header, it creates a race with +// any writes to the header performed during request handling. +// httputil.ReverseProxy is a prominent example for a handler +// performing such writes. +// +// Upcoming versions of this package will provide ways of instrumenting HTTP +// handlers that are more flexible and have fewer issues. Please prefer direct +// instrumentation in the meantime. +func InstrumentHandler(handlerName string, handler http.Handler) http.HandlerFunc { + return InstrumentHandlerFunc(handlerName, handler.ServeHTTP) +} + +// InstrumentHandlerFunc wraps the given function for instrumentation. It +// otherwise works in the same way as InstrumentHandler (and shares the same +// issues). +// +// Deprecated: InstrumentHandlerFunc is deprecated for the same reasons as +// InstrumentHandler is. +func InstrumentHandlerFunc(handlerName string, handlerFunc func(http.ResponseWriter, *http.Request)) http.HandlerFunc { + return InstrumentHandlerFuncWithOpts( + SummaryOpts{ + Subsystem: "http", + ConstLabels: Labels{"handler": handlerName}, + }, + handlerFunc, + ) +} + +// InstrumentHandlerWithOpts works like InstrumentHandler (and shares the same +// issues) but provides more flexibility (at the cost of a more complex call +// syntax). As InstrumentHandler, this function registers four metric +// collectors, but it uses the provided SummaryOpts to create them. However, the +// fields "Name" and "Help" in the SummaryOpts are ignored. "Name" is replaced +// by "requests_total", "request_duration_microseconds", "request_size_bytes", +// and "response_size_bytes", respectively. "Help" is replaced by an appropriate +// help string. The names of the variable labels of the http_requests_total +// CounterVec are "method" (get, post, etc.), and "code" (HTTP status code). +// +// If InstrumentHandlerWithOpts is called as follows, it mimics exactly the +// behavior of InstrumentHandler: +// +// prometheus.InstrumentHandlerWithOpts( +// prometheus.SummaryOpts{ +// Subsystem: "http", +// ConstLabels: prometheus.Labels{"handler": handlerName}, +// }, +// handler, +// ) +// +// Technical detail: "requests_total" is a CounterVec, not a SummaryVec, so it +// cannot use SummaryOpts. Instead, a CounterOpts struct is created internally, +// and all its fields are set to the equally named fields in the provided +// SummaryOpts. +// +// Deprecated: InstrumentHandlerWithOpts is deprecated for the same reasons as +// InstrumentHandler is. +func InstrumentHandlerWithOpts(opts SummaryOpts, handler http.Handler) http.HandlerFunc { + return InstrumentHandlerFuncWithOpts(opts, handler.ServeHTTP) +} + +// InstrumentHandlerFuncWithOpts works like InstrumentHandlerFunc (and shares +// the same issues) but provides more flexibility (at the cost of a more complex +// call syntax). See InstrumentHandlerWithOpts for details how the provided +// SummaryOpts are used. +// +// Deprecated: InstrumentHandlerFuncWithOpts is deprecated for the same reasons +// as InstrumentHandler is. +func InstrumentHandlerFuncWithOpts(opts SummaryOpts, handlerFunc func(http.ResponseWriter, *http.Request)) http.HandlerFunc { + reqCnt := NewCounterVec( + CounterOpts{ + Namespace: opts.Namespace, + Subsystem: opts.Subsystem, + Name: "requests_total", + Help: "Total number of HTTP requests made.", + ConstLabels: opts.ConstLabels, + }, + instLabels, + ) + + opts.Name = "request_duration_microseconds" + opts.Help = "The HTTP request latencies in microseconds." + reqDur := NewSummary(opts) + + opts.Name = "request_size_bytes" + opts.Help = "The HTTP request sizes in bytes." + reqSz := NewSummary(opts) + + opts.Name = "response_size_bytes" + opts.Help = "The HTTP response sizes in bytes." + resSz := NewSummary(opts) + + regReqCnt := MustRegisterOrGet(reqCnt).(*CounterVec) + regReqDur := MustRegisterOrGet(reqDur).(Summary) + regReqSz := MustRegisterOrGet(reqSz).(Summary) + regResSz := MustRegisterOrGet(resSz).(Summary) + + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + now := time.Now() + + delegate := &responseWriterDelegator{ResponseWriter: w} + out := make(chan int) + urlLen := 0 + if r.URL != nil { + urlLen = len(r.URL.String()) + } + go computeApproximateRequestSize(r, out, urlLen) + + _, cn := w.(http.CloseNotifier) + _, fl := w.(http.Flusher) + _, hj := w.(http.Hijacker) + _, rf := w.(io.ReaderFrom) + var rw http.ResponseWriter + if cn && fl && hj && rf { + rw = &fancyResponseWriterDelegator{delegate} + } else { + rw = delegate + } + handlerFunc(rw, r) + + elapsed := float64(time.Since(now)) / float64(time.Microsecond) + + method := sanitizeMethod(r.Method) + code := sanitizeCode(delegate.status) + regReqCnt.WithLabelValues(method, code).Inc() + regReqDur.Observe(elapsed) + regResSz.Observe(float64(delegate.written)) + regReqSz.Observe(float64(<-out)) + }) +} + +func computeApproximateRequestSize(r *http.Request, out chan int, s int) { + s += len(r.Method) + s += len(r.Proto) + for name, values := range r.Header { + s += len(name) + for _, value := range values { + s += len(value) + } + } + s += len(r.Host) + + // N.B. r.Form and r.MultipartForm are assumed to be included in r.URL. + + if r.ContentLength != -1 { + s += int(r.ContentLength) + } + out <- s +} + +type responseWriterDelegator struct { + http.ResponseWriter + + handler, method string + status int + written int64 + wroteHeader bool +} + +func (r *responseWriterDelegator) WriteHeader(code int) { + r.status = code + r.wroteHeader = true + r.ResponseWriter.WriteHeader(code) +} + +func (r *responseWriterDelegator) Write(b []byte) (int, error) { + if !r.wroteHeader { + r.WriteHeader(http.StatusOK) + } + n, err := r.ResponseWriter.Write(b) + r.written += int64(n) + return n, err +} + +type fancyResponseWriterDelegator struct { + *responseWriterDelegator +} + +func (f *fancyResponseWriterDelegator) CloseNotify() <-chan bool { + return f.ResponseWriter.(http.CloseNotifier).CloseNotify() +} + +func (f *fancyResponseWriterDelegator) Flush() { + f.ResponseWriter.(http.Flusher).Flush() +} + +func (f *fancyResponseWriterDelegator) Hijack() (net.Conn, *bufio.ReadWriter, error) { + return f.ResponseWriter.(http.Hijacker).Hijack() +} + +func (f *fancyResponseWriterDelegator) ReadFrom(r io.Reader) (int64, error) { + if !f.wroteHeader { + f.WriteHeader(http.StatusOK) + } + n, err := f.ResponseWriter.(io.ReaderFrom).ReadFrom(r) + f.written += n + return n, err +} + +func sanitizeMethod(m string) string { + switch m { + case "GET", "get": + return "get" + case "PUT", "put": + return "put" + case "HEAD", "head": + return "head" + case "POST", "post": + return "post" + case "DELETE", "delete": + return "delete" + case "CONNECT", "connect": + return "connect" + case "OPTIONS", "options": + return "options" + case "NOTIFY", "notify": + return "notify" + default: + return strings.ToLower(m) + } +} + +func sanitizeCode(s int) string { + switch s { + case 100: + return "100" + case 101: + return "101" + + case 200: + return "200" + case 201: + return "201" + case 202: + return "202" + case 203: + return "203" + case 204: + return "204" + case 205: + return "205" + case 206: + return "206" + + case 300: + return "300" + case 301: + return "301" + case 302: + return "302" + case 304: + return "304" + case 305: + return "305" + case 307: + return "307" + + case 400: + return "400" + case 401: + return "401" + case 402: + return "402" + case 403: + return "403" + case 404: + return "404" + case 405: + return "405" + case 406: + return "406" + case 407: + return "407" + case 408: + return "408" + case 409: + return "409" + case 410: + return "410" + case 411: + return "411" + case 412: + return "412" + case 413: + return "413" + case 414: + return "414" + case 415: + return "415" + case 416: + return "416" + case 417: + return "417" + case 418: + return "418" + + case 500: + return "500" + case 501: + return "501" + case 502: + return "502" + case 503: + return "503" + case 504: + return "504" + case 505: + return "505" + + case 428: + return "428" + case 429: + return "429" + case 431: + return "431" + case 511: + return "511" + + default: + return strconv.Itoa(s) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/metric.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/metric.go new file mode 100644 index 00000000..d4063d98 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/metric.go @@ -0,0 +1,166 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "strings" + + dto "github.com/prometheus/client_model/go" +) + +const separatorByte byte = 255 + +// A Metric models a single sample value with its meta data being exported to +// Prometheus. Implementations of Metric in this package are Gauge, Counter, +// Histogram, Summary, and Untyped. +type Metric interface { + // Desc returns the descriptor for the Metric. This method idempotently + // returns the same descriptor throughout the lifetime of the + // Metric. The returned descriptor is immutable by contract. A Metric + // unable to describe itself must return an invalid descriptor (created + // with NewInvalidDesc). + Desc() *Desc + // Write encodes the Metric into a "Metric" Protocol Buffer data + // transmission object. + // + // Metric implementations must observe concurrency safety as reads of + // this metric may occur at any time, and any blocking occurs at the + // expense of total performance of rendering all registered + // metrics. Ideally, Metric implementations should support concurrent + // readers. + // + // While populating dto.Metric, it is the responsibility of the + // implementation to ensure validity of the Metric protobuf (like valid + // UTF-8 strings or syntactically valid metric and label names). It is + // recommended to sort labels lexicographically. (Implementers may find + // LabelPairSorter useful for that.) Callers of Write should still make + // sure of sorting if they depend on it. + Write(*dto.Metric) error + // TODO(beorn7): The original rationale of passing in a pre-allocated + // dto.Metric protobuf to save allocations has disappeared. The + // signature of this method should be changed to "Write() (*dto.Metric, + // error)". +} + +// Opts bundles the options for creating most Metric types. Each metric +// implementation XXX has its own XXXOpts type, but in most cases, it is just be +// an alias of this type (which might change when the requirement arises.) +// +// It is mandatory to set Name and Help to a non-empty string. All other fields +// are optional and can safely be left at their zero value. +type Opts struct { + // Namespace, Subsystem, and Name are components of the fully-qualified + // name of the Metric (created by joining these components with + // "_"). Only Name is mandatory, the others merely help structuring the + // name. Note that the fully-qualified name of the metric must be a + // valid Prometheus metric name. + Namespace string + Subsystem string + Name string + + // Help provides information about this metric. Mandatory! + // + // Metrics with the same fully-qualified name must have the same Help + // string. + Help string + + // ConstLabels are used to attach fixed labels to this metric. Metrics + // with the same fully-qualified name must have the same label names in + // their ConstLabels. + // + // Note that in most cases, labels have a value that varies during the + // lifetime of a process. Those labels are usually managed with a metric + // vector collector (like CounterVec, GaugeVec, UntypedVec). ConstLabels + // serve only special purposes. One is for the special case where the + // value of a label does not change during the lifetime of a process, + // e.g. if the revision of the running binary is put into a + // label. Another, more advanced purpose is if more than one Collector + // needs to collect Metrics with the same fully-qualified name. In that + // case, those Metrics must differ in the values of their + // ConstLabels. See the Collector examples. + // + // If the value of a label never changes (not even between binaries), + // that label most likely should not be a label at all (but part of the + // metric name). + ConstLabels Labels +} + +// BuildFQName joins the given three name components by "_". Empty name +// components are ignored. If the name parameter itself is empty, an empty +// string is returned, no matter what. Metric implementations included in this +// library use this function internally to generate the fully-qualified metric +// name from the name component in their Opts. Users of the library will only +// need this function if they implement their own Metric or instantiate a Desc +// (with NewDesc) directly. +func BuildFQName(namespace, subsystem, name string) string { + if name == "" { + return "" + } + switch { + case namespace != "" && subsystem != "": + return strings.Join([]string{namespace, subsystem, name}, "_") + case namespace != "": + return strings.Join([]string{namespace, name}, "_") + case subsystem != "": + return strings.Join([]string{subsystem, name}, "_") + } + return name +} + +// LabelPairSorter implements sort.Interface. It is used to sort a slice of +// dto.LabelPair pointers. This is useful for implementing the Write method of +// custom metrics. +type LabelPairSorter []*dto.LabelPair + +func (s LabelPairSorter) Len() int { + return len(s) +} + +func (s LabelPairSorter) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +func (s LabelPairSorter) Less(i, j int) bool { + return s[i].GetName() < s[j].GetName() +} + +type hashSorter []uint64 + +func (s hashSorter) Len() int { + return len(s) +} + +func (s hashSorter) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +func (s hashSorter) Less(i, j int) bool { + return s[i] < s[j] +} + +type invalidMetric struct { + desc *Desc + err error +} + +// NewInvalidMetric returns a metric whose Write method always returns the +// provided error. It is useful if a Collector finds itself unable to collect +// a metric and wishes to report an error to the registry. +func NewInvalidMetric(desc *Desc, err error) Metric { + return &invalidMetric{desc, err} +} + +func (m *invalidMetric) Desc() *Desc { return m.desc } + +func (m *invalidMetric) Write(*dto.Metric) error { return m.err } diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/process_collector.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/process_collector.go new file mode 100644 index 00000000..e31e62e7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/process_collector.go @@ -0,0 +1,142 @@ +// Copyright 2015 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import "github.com/prometheus/procfs" + +type processCollector struct { + pid int + collectFn func(chan<- Metric) + pidFn func() (int, error) + cpuTotal Counter + openFDs, maxFDs Gauge + vsize, rss Gauge + startTime Gauge +} + +// NewProcessCollector returns a collector which exports the current state of +// process metrics including cpu, memory and file descriptor usage as well as +// the process start time for the given process id under the given namespace. +func NewProcessCollector(pid int, namespace string) Collector { + return NewProcessCollectorPIDFn( + func() (int, error) { return pid, nil }, + namespace, + ) +} + +// NewProcessCollectorPIDFn returns a collector which exports the current state +// of process metrics including cpu, memory and file descriptor usage as well +// as the process start time under the given namespace. The given pidFn is +// called on each collect and is used to determine the process to export +// metrics for. +func NewProcessCollectorPIDFn( + pidFn func() (int, error), + namespace string, +) Collector { + c := processCollector{ + pidFn: pidFn, + collectFn: func(chan<- Metric) {}, + + cpuTotal: NewCounter(CounterOpts{ + Namespace: namespace, + Name: "process_cpu_seconds_total", + Help: "Total user and system CPU time spent in seconds.", + }), + openFDs: NewGauge(GaugeOpts{ + Namespace: namespace, + Name: "process_open_fds", + Help: "Number of open file descriptors.", + }), + maxFDs: NewGauge(GaugeOpts{ + Namespace: namespace, + Name: "process_max_fds", + Help: "Maximum number of open file descriptors.", + }), + vsize: NewGauge(GaugeOpts{ + Namespace: namespace, + Name: "process_virtual_memory_bytes", + Help: "Virtual memory size in bytes.", + }), + rss: NewGauge(GaugeOpts{ + Namespace: namespace, + Name: "process_resident_memory_bytes", + Help: "Resident memory size in bytes.", + }), + startTime: NewGauge(GaugeOpts{ + Namespace: namespace, + Name: "process_start_time_seconds", + Help: "Start time of the process since unix epoch in seconds.", + }), + } + + // Set up process metric collection if supported by the runtime. + if _, err := procfs.NewStat(); err == nil { + c.collectFn = c.processCollect + } + + return &c +} + +// Describe returns all descriptions of the collector. +func (c *processCollector) Describe(ch chan<- *Desc) { + ch <- c.cpuTotal.Desc() + ch <- c.openFDs.Desc() + ch <- c.maxFDs.Desc() + ch <- c.vsize.Desc() + ch <- c.rss.Desc() + ch <- c.startTime.Desc() +} + +// Collect returns the current state of all metrics of the collector. +func (c *processCollector) Collect(ch chan<- Metric) { + c.collectFn(ch) +} + +// TODO(ts): Bring back error reporting by reverting 7faf9e7 as soon as the +// client allows users to configure the error behavior. +func (c *processCollector) processCollect(ch chan<- Metric) { + pid, err := c.pidFn() + if err != nil { + return + } + + p, err := procfs.NewProc(pid) + if err != nil { + return + } + + if stat, err := p.NewStat(); err == nil { + c.cpuTotal.Set(stat.CPUTime()) + ch <- c.cpuTotal + c.vsize.Set(float64(stat.VirtualMemory())) + ch <- c.vsize + c.rss.Set(float64(stat.ResidentMemory())) + ch <- c.rss + + if startTime, err := stat.StartTime(); err == nil { + c.startTime.Set(startTime) + ch <- c.startTime + } + } + + if fds, err := p.FileDescriptorsLen(); err == nil { + c.openFDs.Set(float64(fds)) + ch <- c.openFDs + } + + if limits, err := p.NewLimits(); err == nil { + c.maxFDs.Set(float64(limits.OpenFiles)) + ch <- c.maxFDs + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/promhttp/http.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/promhttp/http.go new file mode 100644 index 00000000..b6dd5a26 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/promhttp/http.go @@ -0,0 +1,201 @@ +// Copyright 2016 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Copyright (c) 2013, The Prometheus Authors +// All rights reserved. +// +// Use of this source code is governed by a BSD-style license that can be found +// in the LICENSE file. + +// Package promhttp contains functions to create http.Handler instances to +// expose Prometheus metrics via HTTP. In later versions of this package, it +// will also contain tooling to instrument instances of http.Handler and +// http.RoundTripper. +// +// promhttp.Handler acts on the prometheus.DefaultGatherer. With HandlerFor, +// you can create a handler for a custom registry or anything that implements +// the Gatherer interface. It also allows to create handlers that act +// differently on errors or allow to log errors. +package promhttp + +import ( + "bytes" + "compress/gzip" + "fmt" + "io" + "net/http" + "strings" + "sync" + + "github.com/prometheus/common/expfmt" + + "github.com/prometheus/client_golang/prometheus" +) + +const ( + contentTypeHeader = "Content-Type" + contentLengthHeader = "Content-Length" + contentEncodingHeader = "Content-Encoding" + acceptEncodingHeader = "Accept-Encoding" +) + +var bufPool sync.Pool + +func getBuf() *bytes.Buffer { + buf := bufPool.Get() + if buf == nil { + return &bytes.Buffer{} + } + return buf.(*bytes.Buffer) +} + +func giveBuf(buf *bytes.Buffer) { + buf.Reset() + bufPool.Put(buf) +} + +// Handler returns an HTTP handler for the prometheus.DefaultGatherer. The +// Handler uses the default HandlerOpts, i.e. report the first error as an HTTP +// error, no error logging, and compression if requested by the client. +// +// If you want to create a Handler for the DefaultGatherer with different +// HandlerOpts, create it with HandlerFor with prometheus.DefaultGatherer and +// your desired HandlerOpts. +func Handler() http.Handler { + return HandlerFor(prometheus.DefaultGatherer, HandlerOpts{}) +} + +// HandlerFor returns an http.Handler for the provided Gatherer. The behavior +// of the Handler is defined by the provided HandlerOpts. +func HandlerFor(reg prometheus.Gatherer, opts HandlerOpts) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + mfs, err := reg.Gather() + if err != nil { + if opts.ErrorLog != nil { + opts.ErrorLog.Println("error gathering metrics:", err) + } + switch opts.ErrorHandling { + case PanicOnError: + panic(err) + case ContinueOnError: + if len(mfs) == 0 { + http.Error(w, "No metrics gathered, last error:\n\n"+err.Error(), http.StatusInternalServerError) + return + } + case HTTPErrorOnError: + http.Error(w, "An error has occurred during metrics gathering:\n\n"+err.Error(), http.StatusInternalServerError) + return + } + } + + contentType := expfmt.Negotiate(req.Header) + buf := getBuf() + defer giveBuf(buf) + writer, encoding := decorateWriter(req, buf, opts.DisableCompression) + enc := expfmt.NewEncoder(writer, contentType) + var lastErr error + for _, mf := range mfs { + if err := enc.Encode(mf); err != nil { + lastErr = err + if opts.ErrorLog != nil { + opts.ErrorLog.Println("error encoding metric family:", err) + } + switch opts.ErrorHandling { + case PanicOnError: + panic(err) + case ContinueOnError: + // Handled later. + case HTTPErrorOnError: + http.Error(w, "An error has occurred during metrics encoding:\n\n"+err.Error(), http.StatusInternalServerError) + return + } + } + } + if closer, ok := writer.(io.Closer); ok { + closer.Close() + } + if lastErr != nil && buf.Len() == 0 { + http.Error(w, "No metrics encoded, last error:\n\n"+err.Error(), http.StatusInternalServerError) + return + } + header := w.Header() + header.Set(contentTypeHeader, string(contentType)) + header.Set(contentLengthHeader, fmt.Sprint(buf.Len())) + if encoding != "" { + header.Set(contentEncodingHeader, encoding) + } + w.Write(buf.Bytes()) + // TODO(beorn7): Consider streaming serving of metrics. + }) +} + +// HandlerErrorHandling defines how a Handler serving metrics will handle +// errors. +type HandlerErrorHandling int + +// These constants cause handlers serving metrics to behave as described if +// errors are encountered. +const ( + // Serve an HTTP status code 500 upon the first error + // encountered. Report the error message in the body. + HTTPErrorOnError HandlerErrorHandling = iota + // Ignore errors and try to serve as many metrics as possible. However, + // if no metrics can be served, serve an HTTP status code 500 and the + // last error message in the body. Only use this in deliberate "best + // effort" metrics collection scenarios. It is recommended to at least + // log errors (by providing an ErrorLog in HandlerOpts) to not mask + // errors completely. + ContinueOnError + // Panic upon the first error encountered (useful for "crash only" apps). + PanicOnError +) + +// Logger is the minimal interface HandlerOpts needs for logging. Note that +// log.Logger from the standard library implements this interface, and it is +// easy to implement by custom loggers, if they don't do so already anyway. +type Logger interface { + Println(v ...interface{}) +} + +// HandlerOpts specifies options how to serve metrics via an http.Handler. The +// zero value of HandlerOpts is a reasonable default. +type HandlerOpts struct { + // ErrorLog specifies an optional logger for errors collecting and + // serving metrics. If nil, errors are not logged at all. + ErrorLog Logger + // ErrorHandling defines how errors are handled. Note that errors are + // logged regardless of the configured ErrorHandling provided ErrorLog + // is not nil. + ErrorHandling HandlerErrorHandling + // If DisableCompression is true, the handler will never compress the + // response, even if requested by the client. + DisableCompression bool +} + +// decorateWriter wraps a writer to handle gzip compression if requested. It +// returns the decorated writer and the appropriate "Content-Encoding" header +// (which is empty if no compression is enabled). +func decorateWriter(request *http.Request, writer io.Writer, compressionDisabled bool) (io.Writer, string) { + if compressionDisabled { + return writer, "" + } + header := request.Header.Get(acceptEncodingHeader) + parts := strings.Split(header, ",") + for _, part := range parts { + part := strings.TrimSpace(part) + if part == "gzip" || strings.HasPrefix(part, "gzip;") { + return gzip.NewWriter(writer), "gzip" + } + } + return writer, "" +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/registry.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/registry.go new file mode 100644 index 00000000..32a3986b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/registry.go @@ -0,0 +1,806 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "bytes" + "errors" + "fmt" + "os" + "sort" + "sync" + + "github.com/golang/protobuf/proto" + + dto "github.com/prometheus/client_model/go" +) + +const ( + // Capacity for the channel to collect metrics and descriptors. + capMetricChan = 1000 + capDescChan = 10 +) + +// DefaultRegisterer and DefaultGatherer are the implementations of the +// Registerer and Gatherer interface a number of convenience functions in this +// package act on. Initially, both variables point to the same Registry, which +// has a process collector (see NewProcessCollector) and a Go collector (see +// NewGoCollector) already registered. This approach to keep default instances +// as global state mirrors the approach of other packages in the Go standard +// library. Note that there are caveats. Change the variables with caution and +// only if you understand the consequences. Users who want to avoid global state +// altogether should not use the convenience function and act on custom +// instances instead. +var ( + defaultRegistry = NewRegistry() + DefaultRegisterer Registerer = defaultRegistry + DefaultGatherer Gatherer = defaultRegistry +) + +func init() { + MustRegister(NewProcessCollector(os.Getpid(), "")) + MustRegister(NewGoCollector()) +} + +// NewRegistry creates a new vanilla Registry without any Collectors +// pre-registered. +func NewRegistry() *Registry { + return &Registry{ + collectorsByID: map[uint64]Collector{}, + descIDs: map[uint64]struct{}{}, + dimHashesByName: map[string]uint64{}, + } +} + +// NewPedanticRegistry returns a registry that checks during collection if each +// collected Metric is consistent with its reported Desc, and if the Desc has +// actually been registered with the registry. +// +// Usually, a Registry will be happy as long as the union of all collected +// Metrics is consistent and valid even if some metrics are not consistent with +// their own Desc or a Desc provided by their registered Collector. Well-behaved +// Collectors and Metrics will only provide consistent Descs. This Registry is +// useful to test the implementation of Collectors and Metrics. +func NewPedanticRegistry() *Registry { + r := NewRegistry() + r.pedanticChecksEnabled = true + return r +} + +// Registerer is the interface for the part of a registry in charge of +// registering and unregistering. Users of custom registries should use +// Registerer as type for registration purposes (rather then the Registry type +// directly). In that way, they are free to use custom Registerer implementation +// (e.g. for testing purposes). +type Registerer interface { + // Register registers a new Collector to be included in metrics + // collection. It returns an error if the descriptors provided by the + // Collector are invalid or if they — in combination with descriptors of + // already registered Collectors — do not fulfill the consistency and + // uniqueness criteria described in the documentation of metric.Desc. + // + // If the provided Collector is equal to a Collector already registered + // (which includes the case of re-registering the same Collector), the + // returned error is an instance of AlreadyRegisteredError, which + // contains the previously registered Collector. + // + // It is in general not safe to register the same Collector multiple + // times concurrently. + Register(Collector) error + // MustRegister works like Register but registers any number of + // Collectors and panics upon the first registration that causes an + // error. + MustRegister(...Collector) + // Unregister unregisters the Collector that equals the Collector passed + // in as an argument. (Two Collectors are considered equal if their + // Describe method yields the same set of descriptors.) The function + // returns whether a Collector was unregistered. + // + // Note that even after unregistering, it will not be possible to + // register a new Collector that is inconsistent with the unregistered + // Collector, e.g. a Collector collecting metrics with the same name but + // a different help string. The rationale here is that the same registry + // instance must only collect consistent metrics throughout its + // lifetime. + Unregister(Collector) bool +} + +// Gatherer is the interface for the part of a registry in charge of gathering +// the collected metrics into a number of MetricFamilies. The Gatherer interface +// comes with the same general implication as described for the Registerer +// interface. +type Gatherer interface { + // Gather calls the Collect method of the registered Collectors and then + // gathers the collected metrics into a lexicographically sorted slice + // of MetricFamily protobufs. Even if an error occurs, Gather attempts + // to gather as many metrics as possible. Hence, if a non-nil error is + // returned, the returned MetricFamily slice could be nil (in case of a + // fatal error that prevented any meaningful metric collection) or + // contain a number of MetricFamily protobufs, some of which might be + // incomplete, and some might be missing altogether. The returned error + // (which might be a MultiError) explains the details. In scenarios + // where complete collection is critical, the returned MetricFamily + // protobufs should be disregarded if the returned error is non-nil. + Gather() ([]*dto.MetricFamily, error) +} + +// Register registers the provided Collector with the DefaultRegisterer. +// +// Register is a shortcut for DefaultRegisterer.Register(c). See there for more +// details. +func Register(c Collector) error { + return DefaultRegisterer.Register(c) +} + +// MustRegister registers the provided Collectors with the DefaultRegisterer and +// panics if any error occurs. +// +// MustRegister is a shortcut for DefaultRegisterer.MustRegister(cs...). See +// there for more details. +func MustRegister(cs ...Collector) { + DefaultRegisterer.MustRegister(cs...) +} + +// RegisterOrGet registers the provided Collector with the DefaultRegisterer and +// returns the Collector, unless an equal Collector was registered before, in +// which case that Collector is returned. +// +// Deprecated: RegisterOrGet is merely a convenience function for the +// implementation as described in the documentation for +// AlreadyRegisteredError. As the use case is relatively rare, this function +// will be removed in a future version of this package to clean up the +// namespace. +func RegisterOrGet(c Collector) (Collector, error) { + if err := Register(c); err != nil { + if are, ok := err.(AlreadyRegisteredError); ok { + return are.ExistingCollector, nil + } + return nil, err + } + return c, nil +} + +// MustRegisterOrGet behaves like RegisterOrGet but panics instead of returning +// an error. +// +// Deprecated: This is deprecated for the same reason RegisterOrGet is. See +// there for details. +func MustRegisterOrGet(c Collector) Collector { + c, err := RegisterOrGet(c) + if err != nil { + panic(err) + } + return c +} + +// Unregister removes the registration of the provided Collector from the +// DefaultRegisterer. +// +// Unregister is a shortcut for DefaultRegisterer.Unregister(c). See there for +// more details. +func Unregister(c Collector) bool { + return DefaultRegisterer.Unregister(c) +} + +// GathererFunc turns a function into a Gatherer. +type GathererFunc func() ([]*dto.MetricFamily, error) + +// Gather implements Gatherer. +func (gf GathererFunc) Gather() ([]*dto.MetricFamily, error) { + return gf() +} + +// SetMetricFamilyInjectionHook replaces the DefaultGatherer with one that +// gathers from the previous DefaultGatherers but then merges the MetricFamily +// protobufs returned from the provided hook function with the MetricFamily +// protobufs returned from the original DefaultGatherer. +// +// Deprecated: This function manipulates the DefaultGatherer variable. Consider +// the implications, i.e. don't do this concurrently with any uses of the +// DefaultGatherer. In the rare cases where you need to inject MetricFamily +// protobufs directly, it is recommended to use a custom Registry and combine it +// with a custom Gatherer using the Gatherers type (see +// there). SetMetricFamilyInjectionHook only exists for compatibility reasons +// with previous versions of this package. +func SetMetricFamilyInjectionHook(hook func() []*dto.MetricFamily) { + DefaultGatherer = Gatherers{ + DefaultGatherer, + GathererFunc(func() ([]*dto.MetricFamily, error) { return hook(), nil }), + } +} + +// AlreadyRegisteredError is returned by the Register method if the Collector to +// be registered has already been registered before, or a different Collector +// that collects the same metrics has been registered before. Registration fails +// in that case, but you can detect from the kind of error what has +// happened. The error contains fields for the existing Collector and the +// (rejected) new Collector that equals the existing one. This can be used to +// find out if an equal Collector has been registered before and switch over to +// using the old one, as demonstrated in the example. +type AlreadyRegisteredError struct { + ExistingCollector, NewCollector Collector +} + +func (err AlreadyRegisteredError) Error() string { + return "duplicate metrics collector registration attempted" +} + +// MultiError is a slice of errors implementing the error interface. It is used +// by a Gatherer to report multiple errors during MetricFamily gathering. +type MultiError []error + +func (errs MultiError) Error() string { + if len(errs) == 0 { + return "" + } + buf := &bytes.Buffer{} + fmt.Fprintf(buf, "%d error(s) occurred:", len(errs)) + for _, err := range errs { + fmt.Fprintf(buf, "\n* %s", err) + } + return buf.String() +} + +// MaybeUnwrap returns nil if len(errs) is 0. It returns the first and only +// contained error as error if len(errs is 1). In all other cases, it returns +// the MultiError directly. This is helpful for returning a MultiError in a way +// that only uses the MultiError if needed. +func (errs MultiError) MaybeUnwrap() error { + switch len(errs) { + case 0: + return nil + case 1: + return errs[0] + default: + return errs + } +} + +// Registry registers Prometheus collectors, collects their metrics, and gathers +// them into MetricFamilies for exposition. It implements both Registerer and +// Gatherer. The zero value is not usable. Create instances with NewRegistry or +// NewPedanticRegistry. +type Registry struct { + mtx sync.RWMutex + collectorsByID map[uint64]Collector // ID is a hash of the descIDs. + descIDs map[uint64]struct{} + dimHashesByName map[string]uint64 + pedanticChecksEnabled bool +} + +// Register implements Registerer. +func (r *Registry) Register(c Collector) error { + var ( + descChan = make(chan *Desc, capDescChan) + newDescIDs = map[uint64]struct{}{} + newDimHashesByName = map[string]uint64{} + collectorID uint64 // Just a sum of all desc IDs. + duplicateDescErr error + ) + go func() { + c.Describe(descChan) + close(descChan) + }() + r.mtx.Lock() + defer r.mtx.Unlock() + // Coduct various tests... + for desc := range descChan { + + // Is the descriptor valid at all? + if desc.err != nil { + return fmt.Errorf("descriptor %s is invalid: %s", desc, desc.err) + } + + // Is the descID unique? + // (In other words: Is the fqName + constLabel combination unique?) + if _, exists := r.descIDs[desc.id]; exists { + duplicateDescErr = fmt.Errorf("descriptor %s already exists with the same fully-qualified name and const label values", desc) + } + // If it is not a duplicate desc in this collector, add it to + // the collectorID. (We allow duplicate descs within the same + // collector, but their existence must be a no-op.) + if _, exists := newDescIDs[desc.id]; !exists { + newDescIDs[desc.id] = struct{}{} + collectorID += desc.id + } + + // Are all the label names and the help string consistent with + // previous descriptors of the same name? + // First check existing descriptors... + if dimHash, exists := r.dimHashesByName[desc.fqName]; exists { + if dimHash != desc.dimHash { + return fmt.Errorf("a previously registered descriptor with the same fully-qualified name as %s has different label names or a different help string", desc) + } + } else { + // ...then check the new descriptors already seen. + if dimHash, exists := newDimHashesByName[desc.fqName]; exists { + if dimHash != desc.dimHash { + return fmt.Errorf("descriptors reported by collector have inconsistent label names or help strings for the same fully-qualified name, offender is %s", desc) + } + } else { + newDimHashesByName[desc.fqName] = desc.dimHash + } + } + } + // Did anything happen at all? + if len(newDescIDs) == 0 { + return errors.New("collector has no descriptors") + } + if existing, exists := r.collectorsByID[collectorID]; exists { + return AlreadyRegisteredError{ + ExistingCollector: existing, + NewCollector: c, + } + } + // If the collectorID is new, but at least one of the descs existed + // before, we are in trouble. + if duplicateDescErr != nil { + return duplicateDescErr + } + + // Only after all tests have passed, actually register. + r.collectorsByID[collectorID] = c + for hash := range newDescIDs { + r.descIDs[hash] = struct{}{} + } + for name, dimHash := range newDimHashesByName { + r.dimHashesByName[name] = dimHash + } + return nil +} + +// Unregister implements Registerer. +func (r *Registry) Unregister(c Collector) bool { + var ( + descChan = make(chan *Desc, capDescChan) + descIDs = map[uint64]struct{}{} + collectorID uint64 // Just a sum of the desc IDs. + ) + go func() { + c.Describe(descChan) + close(descChan) + }() + for desc := range descChan { + if _, exists := descIDs[desc.id]; !exists { + collectorID += desc.id + descIDs[desc.id] = struct{}{} + } + } + + r.mtx.RLock() + if _, exists := r.collectorsByID[collectorID]; !exists { + r.mtx.RUnlock() + return false + } + r.mtx.RUnlock() + + r.mtx.Lock() + defer r.mtx.Unlock() + + delete(r.collectorsByID, collectorID) + for id := range descIDs { + delete(r.descIDs, id) + } + // dimHashesByName is left untouched as those must be consistent + // throughout the lifetime of a program. + return true +} + +// MustRegister implements Registerer. +func (r *Registry) MustRegister(cs ...Collector) { + for _, c := range cs { + if err := r.Register(c); err != nil { + panic(err) + } + } +} + +// Gather implements Gatherer. +func (r *Registry) Gather() ([]*dto.MetricFamily, error) { + var ( + metricChan = make(chan Metric, capMetricChan) + metricHashes = map[uint64]struct{}{} + dimHashes = map[string]uint64{} + wg sync.WaitGroup + errs MultiError // The collected errors to return in the end. + registeredDescIDs map[uint64]struct{} // Only used for pedantic checks + ) + + r.mtx.RLock() + metricFamiliesByName := make(map[string]*dto.MetricFamily, len(r.dimHashesByName)) + + // Scatter. + // (Collectors could be complex and slow, so we call them all at once.) + wg.Add(len(r.collectorsByID)) + go func() { + wg.Wait() + close(metricChan) + }() + for _, collector := range r.collectorsByID { + go func(collector Collector) { + defer wg.Done() + collector.Collect(metricChan) + }(collector) + } + + // In case pedantic checks are enabled, we have to copy the map before + // giving up the RLock. + if r.pedanticChecksEnabled { + registeredDescIDs = make(map[uint64]struct{}, len(r.descIDs)) + for id := range r.descIDs { + registeredDescIDs[id] = struct{}{} + } + } + + r.mtx.RUnlock() + + // Drain metricChan in case of premature return. + defer func() { + for _ = range metricChan { + } + }() + + // Gather. + for metric := range metricChan { + // This could be done concurrently, too, but it required locking + // of metricFamiliesByName (and of metricHashes if checks are + // enabled). Most likely not worth it. + desc := metric.Desc() + dtoMetric := &dto.Metric{} + if err := metric.Write(dtoMetric); err != nil { + errs = append(errs, fmt.Errorf( + "error collecting metric %v: %s", desc, err, + )) + continue + } + metricFamily, ok := metricFamiliesByName[desc.fqName] + if ok { + if metricFamily.GetHelp() != desc.help { + errs = append(errs, fmt.Errorf( + "collected metric %s %s has help %q but should have %q", + desc.fqName, dtoMetric, desc.help, metricFamily.GetHelp(), + )) + continue + } + // TODO(beorn7): Simplify switch once Desc has type. + switch metricFamily.GetType() { + case dto.MetricType_COUNTER: + if dtoMetric.Counter == nil { + errs = append(errs, fmt.Errorf( + "collected metric %s %s should be a Counter", + desc.fqName, dtoMetric, + )) + continue + } + case dto.MetricType_GAUGE: + if dtoMetric.Gauge == nil { + errs = append(errs, fmt.Errorf( + "collected metric %s %s should be a Gauge", + desc.fqName, dtoMetric, + )) + continue + } + case dto.MetricType_SUMMARY: + if dtoMetric.Summary == nil { + errs = append(errs, fmt.Errorf( + "collected metric %s %s should be a Summary", + desc.fqName, dtoMetric, + )) + continue + } + case dto.MetricType_UNTYPED: + if dtoMetric.Untyped == nil { + errs = append(errs, fmt.Errorf( + "collected metric %s %s should be Untyped", + desc.fqName, dtoMetric, + )) + continue + } + case dto.MetricType_HISTOGRAM: + if dtoMetric.Histogram == nil { + errs = append(errs, fmt.Errorf( + "collected metric %s %s should be a Histogram", + desc.fqName, dtoMetric, + )) + continue + } + default: + panic("encountered MetricFamily with invalid type") + } + } else { + metricFamily = &dto.MetricFamily{} + metricFamily.Name = proto.String(desc.fqName) + metricFamily.Help = proto.String(desc.help) + // TODO(beorn7): Simplify switch once Desc has type. + switch { + case dtoMetric.Gauge != nil: + metricFamily.Type = dto.MetricType_GAUGE.Enum() + case dtoMetric.Counter != nil: + metricFamily.Type = dto.MetricType_COUNTER.Enum() + case dtoMetric.Summary != nil: + metricFamily.Type = dto.MetricType_SUMMARY.Enum() + case dtoMetric.Untyped != nil: + metricFamily.Type = dto.MetricType_UNTYPED.Enum() + case dtoMetric.Histogram != nil: + metricFamily.Type = dto.MetricType_HISTOGRAM.Enum() + default: + errs = append(errs, fmt.Errorf( + "empty metric collected: %s", dtoMetric, + )) + continue + } + metricFamiliesByName[desc.fqName] = metricFamily + } + if err := checkMetricConsistency(metricFamily, dtoMetric, metricHashes, dimHashes); err != nil { + errs = append(errs, err) + continue + } + if r.pedanticChecksEnabled { + // Is the desc registered at all? + if _, exist := registeredDescIDs[desc.id]; !exist { + errs = append(errs, fmt.Errorf( + "collected metric %s %s with unregistered descriptor %s", + metricFamily.GetName(), dtoMetric, desc, + )) + continue + } + if err := checkDescConsistency(metricFamily, dtoMetric, desc); err != nil { + errs = append(errs, err) + continue + } + } + metricFamily.Metric = append(metricFamily.Metric, dtoMetric) + } + return normalizeMetricFamilies(metricFamiliesByName), errs.MaybeUnwrap() +} + +// Gatherers is a slice of Gatherer instances that implements the Gatherer +// interface itself. Its Gather method calls Gather on all Gatherers in the +// slice in order and returns the merged results. Errors returned from the +// Gather calles are all returned in a flattened MultiError. Duplicate and +// inconsistent Metrics are skipped (first occurrence in slice order wins) and +// reported in the returned error. +// +// Gatherers can be used to merge the Gather results from multiple +// Registries. It also provides a way to directly inject existing MetricFamily +// protobufs into the gathering by creating a custom Gatherer with a Gather +// method that simply returns the existing MetricFamily protobufs. Note that no +// registration is involved (in contrast to Collector registration), so +// obviously registration-time checks cannot happen. Any inconsistencies between +// the gathered MetricFamilies are reported as errors by the Gather method, and +// inconsistent Metrics are dropped. Invalid parts of the MetricFamilies +// (e.g. syntactically invalid metric or label names) will go undetected. +type Gatherers []Gatherer + +// Gather implements Gatherer. +func (gs Gatherers) Gather() ([]*dto.MetricFamily, error) { + var ( + metricFamiliesByName = map[string]*dto.MetricFamily{} + metricHashes = map[uint64]struct{}{} + dimHashes = map[string]uint64{} + errs MultiError // The collected errors to return in the end. + ) + + for i, g := range gs { + mfs, err := g.Gather() + if err != nil { + if multiErr, ok := err.(MultiError); ok { + for _, err := range multiErr { + errs = append(errs, fmt.Errorf("[from Gatherer #%d] %s", i+1, err)) + } + } else { + errs = append(errs, fmt.Errorf("[from Gatherer #%d] %s", i+1, err)) + } + } + for _, mf := range mfs { + existingMF, exists := metricFamiliesByName[mf.GetName()] + if exists { + if existingMF.GetHelp() != mf.GetHelp() { + errs = append(errs, fmt.Errorf( + "gathered metric family %s has help %q but should have %q", + mf.GetName(), mf.GetHelp(), existingMF.GetHelp(), + )) + continue + } + if existingMF.GetType() != mf.GetType() { + errs = append(errs, fmt.Errorf( + "gathered metric family %s has type %s but should have %s", + mf.GetName(), mf.GetType(), existingMF.GetType(), + )) + continue + } + } else { + existingMF = &dto.MetricFamily{} + existingMF.Name = mf.Name + existingMF.Help = mf.Help + existingMF.Type = mf.Type + metricFamiliesByName[mf.GetName()] = existingMF + } + for _, m := range mf.Metric { + if err := checkMetricConsistency(existingMF, m, metricHashes, dimHashes); err != nil { + errs = append(errs, err) + continue + } + existingMF.Metric = append(existingMF.Metric, m) + } + } + } + return normalizeMetricFamilies(metricFamiliesByName), errs.MaybeUnwrap() +} + +// metricSorter is a sortable slice of *dto.Metric. +type metricSorter []*dto.Metric + +func (s metricSorter) Len() int { + return len(s) +} + +func (s metricSorter) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +func (s metricSorter) Less(i, j int) bool { + if len(s[i].Label) != len(s[j].Label) { + // This should not happen. The metrics are + // inconsistent. However, we have to deal with the fact, as + // people might use custom collectors or metric family injection + // to create inconsistent metrics. So let's simply compare the + // number of labels in this case. That will still yield + // reproducible sorting. + return len(s[i].Label) < len(s[j].Label) + } + for n, lp := range s[i].Label { + vi := lp.GetValue() + vj := s[j].Label[n].GetValue() + if vi != vj { + return vi < vj + } + } + + // We should never arrive here. Multiple metrics with the same + // label set in the same scrape will lead to undefined ingestion + // behavior. However, as above, we have to provide stable sorting + // here, even for inconsistent metrics. So sort equal metrics + // by their timestamp, with missing timestamps (implying "now") + // coming last. + if s[i].TimestampMs == nil { + return false + } + if s[j].TimestampMs == nil { + return true + } + return s[i].GetTimestampMs() < s[j].GetTimestampMs() +} + +// normalizeMetricFamilies returns a MetricFamily slice whith empty +// MetricFamilies pruned and the remaining MetricFamilies sorted by name within +// the slice, with the contained Metrics sorted within each MetricFamily. +func normalizeMetricFamilies(metricFamiliesByName map[string]*dto.MetricFamily) []*dto.MetricFamily { + for _, mf := range metricFamiliesByName { + sort.Sort(metricSorter(mf.Metric)) + } + names := make([]string, 0, len(metricFamiliesByName)) + for name, mf := range metricFamiliesByName { + if len(mf.Metric) > 0 { + names = append(names, name) + } + } + sort.Strings(names) + result := make([]*dto.MetricFamily, 0, len(names)) + for _, name := range names { + result = append(result, metricFamiliesByName[name]) + } + return result +} + +// checkMetricConsistency checks if the provided Metric is consistent with the +// provided MetricFamily. It also hashed the Metric labels and the MetricFamily +// name. If the resulting hash is alread in the provided metricHashes, an error +// is returned. If not, it is added to metricHashes. The provided dimHashes maps +// MetricFamily names to their dimHash (hashed sorted label names). If dimHashes +// doesn't yet contain a hash for the provided MetricFamily, it is +// added. Otherwise, an error is returned if the existing dimHashes in not equal +// the calculated dimHash. +func checkMetricConsistency( + metricFamily *dto.MetricFamily, + dtoMetric *dto.Metric, + metricHashes map[uint64]struct{}, + dimHashes map[string]uint64, +) error { + // Type consistency with metric family. + if metricFamily.GetType() == dto.MetricType_GAUGE && dtoMetric.Gauge == nil || + metricFamily.GetType() == dto.MetricType_COUNTER && dtoMetric.Counter == nil || + metricFamily.GetType() == dto.MetricType_SUMMARY && dtoMetric.Summary == nil || + metricFamily.GetType() == dto.MetricType_HISTOGRAM && dtoMetric.Histogram == nil || + metricFamily.GetType() == dto.MetricType_UNTYPED && dtoMetric.Untyped == nil { + return fmt.Errorf( + "collected metric %s %s is not a %s", + metricFamily.GetName(), dtoMetric, metricFamily.GetType(), + ) + } + + // Is the metric unique (i.e. no other metric with the same name and the same label values)? + h := hashNew() + h = hashAdd(h, metricFamily.GetName()) + h = hashAddByte(h, separatorByte) + dh := hashNew() + // Make sure label pairs are sorted. We depend on it for the consistency + // check. + sort.Sort(LabelPairSorter(dtoMetric.Label)) + for _, lp := range dtoMetric.Label { + h = hashAdd(h, lp.GetValue()) + h = hashAddByte(h, separatorByte) + dh = hashAdd(dh, lp.GetName()) + dh = hashAddByte(dh, separatorByte) + } + if _, exists := metricHashes[h]; exists { + return fmt.Errorf( + "collected metric %s %s was collected before with the same name and label values", + metricFamily.GetName(), dtoMetric, + ) + } + if dimHash, ok := dimHashes[metricFamily.GetName()]; ok { + if dimHash != dh { + return fmt.Errorf( + "collected metric %s %s has label dimensions inconsistent with previously collected metrics in the same metric family", + metricFamily.GetName(), dtoMetric, + ) + } + } else { + dimHashes[metricFamily.GetName()] = dh + } + metricHashes[h] = struct{}{} + return nil +} + +func checkDescConsistency( + metricFamily *dto.MetricFamily, + dtoMetric *dto.Metric, + desc *Desc, +) error { + // Desc help consistency with metric family help. + if metricFamily.GetHelp() != desc.help { + return fmt.Errorf( + "collected metric %s %s has help %q but should have %q", + metricFamily.GetName(), dtoMetric, metricFamily.GetHelp(), desc.help, + ) + } + + // Is the desc consistent with the content of the metric? + lpsFromDesc := make([]*dto.LabelPair, 0, len(dtoMetric.Label)) + lpsFromDesc = append(lpsFromDesc, desc.constLabelPairs...) + for _, l := range desc.variableLabels { + lpsFromDesc = append(lpsFromDesc, &dto.LabelPair{ + Name: proto.String(l), + }) + } + if len(lpsFromDesc) != len(dtoMetric.Label) { + return fmt.Errorf( + "labels in collected metric %s %s are inconsistent with descriptor %s", + metricFamily.GetName(), dtoMetric, desc, + ) + } + sort.Sort(LabelPairSorter(lpsFromDesc)) + for i, lpFromDesc := range lpsFromDesc { + lpFromMetric := dtoMetric.Label[i] + if lpFromDesc.GetName() != lpFromMetric.GetName() || + lpFromDesc.Value != nil && lpFromDesc.GetValue() != lpFromMetric.GetValue() { + return fmt.Errorf( + "labels in collected metric %s %s are inconsistent with descriptor %s", + metricFamily.GetName(), dtoMetric, desc, + ) + } + } + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/summary.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/summary.go new file mode 100644 index 00000000..bce05bf9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/summary.go @@ -0,0 +1,534 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "fmt" + "math" + "sort" + "sync" + "time" + + "github.com/beorn7/perks/quantile" + "github.com/golang/protobuf/proto" + + dto "github.com/prometheus/client_model/go" +) + +// quantileLabel is used for the label that defines the quantile in a +// summary. +const quantileLabel = "quantile" + +// A Summary captures individual observations from an event or sample stream and +// summarizes them in a manner similar to traditional summary statistics: 1. sum +// of observations, 2. observation count, 3. rank estimations. +// +// A typical use-case is the observation of request latencies. By default, a +// Summary provides the median, the 90th and the 99th percentile of the latency +// as rank estimations. +// +// Note that the rank estimations cannot be aggregated in a meaningful way with +// the Prometheus query language (i.e. you cannot average or add them). If you +// need aggregatable quantiles (e.g. you want the 99th percentile latency of all +// queries served across all instances of a service), consider the Histogram +// metric type. See the Prometheus documentation for more details. +// +// To create Summary instances, use NewSummary. +type Summary interface { + Metric + Collector + + // Observe adds a single observation to the summary. + Observe(float64) +} + +// DefObjectives are the default Summary quantile values. +var ( + DefObjectives = map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001} + + errQuantileLabelNotAllowed = fmt.Errorf( + "%q is not allowed as label name in summaries", quantileLabel, + ) +) + +// Default values for SummaryOpts. +const ( + // DefMaxAge is the default duration for which observations stay + // relevant. + DefMaxAge time.Duration = 10 * time.Minute + // DefAgeBuckets is the default number of buckets used to calculate the + // age of observations. + DefAgeBuckets = 5 + // DefBufCap is the standard buffer size for collecting Summary observations. + DefBufCap = 500 +) + +// SummaryOpts bundles the options for creating a Summary metric. It is +// mandatory to set Name and Help to a non-empty string. All other fields are +// optional and can safely be left at their zero value. +type SummaryOpts struct { + // Namespace, Subsystem, and Name are components of the fully-qualified + // name of the Summary (created by joining these components with + // "_"). Only Name is mandatory, the others merely help structuring the + // name. Note that the fully-qualified name of the Summary must be a + // valid Prometheus metric name. + Namespace string + Subsystem string + Name string + + // Help provides information about this Summary. Mandatory! + // + // Metrics with the same fully-qualified name must have the same Help + // string. + Help string + + // ConstLabels are used to attach fixed labels to this + // Summary. Summaries with the same fully-qualified name must have the + // same label names in their ConstLabels. + // + // Note that in most cases, labels have a value that varies during the + // lifetime of a process. Those labels are usually managed with a + // SummaryVec. ConstLabels serve only special purposes. One is for the + // special case where the value of a label does not change during the + // lifetime of a process, e.g. if the revision of the running binary is + // put into a label. Another, more advanced purpose is if more than one + // Collector needs to collect Summaries with the same fully-qualified + // name. In that case, those Summaries must differ in the values of + // their ConstLabels. See the Collector examples. + // + // If the value of a label never changes (not even between binaries), + // that label most likely should not be a label at all (but part of the + // metric name). + ConstLabels Labels + + // Objectives defines the quantile rank estimates with their respective + // absolute error. If Objectives[q] = e, then the value reported + // for q will be the φ-quantile value for some φ between q-e and q+e. + // The default value is DefObjectives. + Objectives map[float64]float64 + + // MaxAge defines the duration for which an observation stays relevant + // for the summary. Must be positive. The default value is DefMaxAge. + MaxAge time.Duration + + // AgeBuckets is the number of buckets used to exclude observations that + // are older than MaxAge from the summary. A higher number has a + // resource penalty, so only increase it if the higher resolution is + // really required. For very high observation rates, you might want to + // reduce the number of age buckets. With only one age bucket, you will + // effectively see a complete reset of the summary each time MaxAge has + // passed. The default value is DefAgeBuckets. + AgeBuckets uint32 + + // BufCap defines the default sample stream buffer size. The default + // value of DefBufCap should suffice for most uses. If there is a need + // to increase the value, a multiple of 500 is recommended (because that + // is the internal buffer size of the underlying package + // "github.com/bmizerany/perks/quantile"). + BufCap uint32 +} + +// Great fuck-up with the sliding-window decay algorithm... The Merge method of +// perk/quantile is actually not working as advertised - and it might be +// unfixable, as the underlying algorithm is apparently not capable of merging +// summaries in the first place. To avoid using Merge, we are currently adding +// observations to _each_ age bucket, i.e. the effort to add a sample is +// essentially multiplied by the number of age buckets. When rotating age +// buckets, we empty the previous head stream. On scrape time, we simply take +// the quantiles from the head stream (no merging required). Result: More effort +// on observation time, less effort on scrape time, which is exactly the +// opposite of what we try to accomplish, but at least the results are correct. +// +// The quite elegant previous contraption to merge the age buckets efficiently +// on scrape time (see code up commit 6b9530d72ea715f0ba612c0120e6e09fbf1d49d0) +// can't be used anymore. + +// NewSummary creates a new Summary based on the provided SummaryOpts. +func NewSummary(opts SummaryOpts) Summary { + return newSummary( + NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + nil, + opts.ConstLabels, + ), + opts, + ) +} + +func newSummary(desc *Desc, opts SummaryOpts, labelValues ...string) Summary { + if len(desc.variableLabels) != len(labelValues) { + panic(errInconsistentCardinality) + } + + for _, n := range desc.variableLabels { + if n == quantileLabel { + panic(errQuantileLabelNotAllowed) + } + } + for _, lp := range desc.constLabelPairs { + if lp.GetName() == quantileLabel { + panic(errQuantileLabelNotAllowed) + } + } + + if len(opts.Objectives) == 0 { + opts.Objectives = DefObjectives + } + + if opts.MaxAge < 0 { + panic(fmt.Errorf("illegal max age MaxAge=%v", opts.MaxAge)) + } + if opts.MaxAge == 0 { + opts.MaxAge = DefMaxAge + } + + if opts.AgeBuckets == 0 { + opts.AgeBuckets = DefAgeBuckets + } + + if opts.BufCap == 0 { + opts.BufCap = DefBufCap + } + + s := &summary{ + desc: desc, + + objectives: opts.Objectives, + sortedObjectives: make([]float64, 0, len(opts.Objectives)), + + labelPairs: makeLabelPairs(desc, labelValues), + + hotBuf: make([]float64, 0, opts.BufCap), + coldBuf: make([]float64, 0, opts.BufCap), + streamDuration: opts.MaxAge / time.Duration(opts.AgeBuckets), + } + s.headStreamExpTime = time.Now().Add(s.streamDuration) + s.hotBufExpTime = s.headStreamExpTime + + for i := uint32(0); i < opts.AgeBuckets; i++ { + s.streams = append(s.streams, s.newStream()) + } + s.headStream = s.streams[0] + + for qu := range s.objectives { + s.sortedObjectives = append(s.sortedObjectives, qu) + } + sort.Float64s(s.sortedObjectives) + + s.init(s) // Init self-collection. + return s +} + +type summary struct { + selfCollector + + bufMtx sync.Mutex // Protects hotBuf and hotBufExpTime. + mtx sync.Mutex // Protects every other moving part. + // Lock bufMtx before mtx if both are needed. + + desc *Desc + + objectives map[float64]float64 + sortedObjectives []float64 + + labelPairs []*dto.LabelPair + + sum float64 + cnt uint64 + + hotBuf, coldBuf []float64 + + streams []*quantile.Stream + streamDuration time.Duration + headStream *quantile.Stream + headStreamIdx int + headStreamExpTime, hotBufExpTime time.Time +} + +func (s *summary) Desc() *Desc { + return s.desc +} + +func (s *summary) Observe(v float64) { + s.bufMtx.Lock() + defer s.bufMtx.Unlock() + + now := time.Now() + if now.After(s.hotBufExpTime) { + s.asyncFlush(now) + } + s.hotBuf = append(s.hotBuf, v) + if len(s.hotBuf) == cap(s.hotBuf) { + s.asyncFlush(now) + } +} + +func (s *summary) Write(out *dto.Metric) error { + sum := &dto.Summary{} + qs := make([]*dto.Quantile, 0, len(s.objectives)) + + s.bufMtx.Lock() + s.mtx.Lock() + // Swap bufs even if hotBuf is empty to set new hotBufExpTime. + s.swapBufs(time.Now()) + s.bufMtx.Unlock() + + s.flushColdBuf() + sum.SampleCount = proto.Uint64(s.cnt) + sum.SampleSum = proto.Float64(s.sum) + + for _, rank := range s.sortedObjectives { + var q float64 + if s.headStream.Count() == 0 { + q = math.NaN() + } else { + q = s.headStream.Query(rank) + } + qs = append(qs, &dto.Quantile{ + Quantile: proto.Float64(rank), + Value: proto.Float64(q), + }) + } + + s.mtx.Unlock() + + if len(qs) > 0 { + sort.Sort(quantSort(qs)) + } + sum.Quantile = qs + + out.Summary = sum + out.Label = s.labelPairs + return nil +} + +func (s *summary) newStream() *quantile.Stream { + return quantile.NewTargeted(s.objectives) +} + +// asyncFlush needs bufMtx locked. +func (s *summary) asyncFlush(now time.Time) { + s.mtx.Lock() + s.swapBufs(now) + + // Unblock the original goroutine that was responsible for the mutation + // that triggered the compaction. But hold onto the global non-buffer + // state mutex until the operation finishes. + go func() { + s.flushColdBuf() + s.mtx.Unlock() + }() +} + +// rotateStreams needs mtx AND bufMtx locked. +func (s *summary) maybeRotateStreams() { + for !s.hotBufExpTime.Equal(s.headStreamExpTime) { + s.headStream.Reset() + s.headStreamIdx++ + if s.headStreamIdx >= len(s.streams) { + s.headStreamIdx = 0 + } + s.headStream = s.streams[s.headStreamIdx] + s.headStreamExpTime = s.headStreamExpTime.Add(s.streamDuration) + } +} + +// flushColdBuf needs mtx locked. +func (s *summary) flushColdBuf() { + for _, v := range s.coldBuf { + for _, stream := range s.streams { + stream.Insert(v) + } + s.cnt++ + s.sum += v + } + s.coldBuf = s.coldBuf[0:0] + s.maybeRotateStreams() +} + +// swapBufs needs mtx AND bufMtx locked, coldBuf must be empty. +func (s *summary) swapBufs(now time.Time) { + if len(s.coldBuf) != 0 { + panic("coldBuf is not empty") + } + s.hotBuf, s.coldBuf = s.coldBuf, s.hotBuf + // hotBuf is now empty and gets new expiration set. + for now.After(s.hotBufExpTime) { + s.hotBufExpTime = s.hotBufExpTime.Add(s.streamDuration) + } +} + +type quantSort []*dto.Quantile + +func (s quantSort) Len() int { + return len(s) +} + +func (s quantSort) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +func (s quantSort) Less(i, j int) bool { + return s[i].GetQuantile() < s[j].GetQuantile() +} + +// SummaryVec is a Collector that bundles a set of Summaries that all share the +// same Desc, but have different values for their variable labels. This is used +// if you want to count the same thing partitioned by various dimensions +// (e.g. HTTP request latencies, partitioned by status code and method). Create +// instances with NewSummaryVec. +type SummaryVec struct { + *MetricVec +} + +// NewSummaryVec creates a new SummaryVec based on the provided SummaryOpts and +// partitioned by the given label names. At least one label name must be +// provided. +func NewSummaryVec(opts SummaryOpts, labelNames []string) *SummaryVec { + desc := NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + labelNames, + opts.ConstLabels, + ) + return &SummaryVec{ + MetricVec: newMetricVec(desc, func(lvs ...string) Metric { + return newSummary(desc, opts, lvs...) + }), + } +} + +// GetMetricWithLabelValues replaces the method of the same name in +// MetricVec. The difference is that this method returns a Summary and not a +// Metric so that no type conversion is required. +func (m *SummaryVec) GetMetricWithLabelValues(lvs ...string) (Summary, error) { + metric, err := m.MetricVec.GetMetricWithLabelValues(lvs...) + if metric != nil { + return metric.(Summary), err + } + return nil, err +} + +// GetMetricWith replaces the method of the same name in MetricVec. The +// difference is that this method returns a Summary and not a Metric so that no +// type conversion is required. +func (m *SummaryVec) GetMetricWith(labels Labels) (Summary, error) { + metric, err := m.MetricVec.GetMetricWith(labels) + if metric != nil { + return metric.(Summary), err + } + return nil, err +} + +// WithLabelValues works as GetMetricWithLabelValues, but panics where +// GetMetricWithLabelValues would have returned an error. By not returning an +// error, WithLabelValues allows shortcuts like +// myVec.WithLabelValues("404", "GET").Observe(42.21) +func (m *SummaryVec) WithLabelValues(lvs ...string) Summary { + return m.MetricVec.WithLabelValues(lvs...).(Summary) +} + +// With works as GetMetricWith, but panics where GetMetricWithLabels would have +// returned an error. By not returning an error, With allows shortcuts like +// myVec.With(Labels{"code": "404", "method": "GET"}).Observe(42.21) +func (m *SummaryVec) With(labels Labels) Summary { + return m.MetricVec.With(labels).(Summary) +} + +type constSummary struct { + desc *Desc + count uint64 + sum float64 + quantiles map[float64]float64 + labelPairs []*dto.LabelPair +} + +func (s *constSummary) Desc() *Desc { + return s.desc +} + +func (s *constSummary) Write(out *dto.Metric) error { + sum := &dto.Summary{} + qs := make([]*dto.Quantile, 0, len(s.quantiles)) + + sum.SampleCount = proto.Uint64(s.count) + sum.SampleSum = proto.Float64(s.sum) + + for rank, q := range s.quantiles { + qs = append(qs, &dto.Quantile{ + Quantile: proto.Float64(rank), + Value: proto.Float64(q), + }) + } + + if len(qs) > 0 { + sort.Sort(quantSort(qs)) + } + sum.Quantile = qs + + out.Summary = sum + out.Label = s.labelPairs + + return nil +} + +// NewConstSummary returns a metric representing a Prometheus summary with fixed +// values for the count, sum, and quantiles. As those parameters cannot be +// changed, the returned value does not implement the Summary interface (but +// only the Metric interface). Users of this package will not have much use for +// it in regular operations. However, when implementing custom Collectors, it is +// useful as a throw-away metric that is generated on the fly to send it to +// Prometheus in the Collect method. +// +// quantiles maps ranks to quantile values. For example, a median latency of +// 0.23s and a 99th percentile latency of 0.56s would be expressed as: +// map[float64]float64{0.5: 0.23, 0.99: 0.56} +// +// NewConstSummary returns an error if the length of labelValues is not +// consistent with the variable labels in Desc. +func NewConstSummary( + desc *Desc, + count uint64, + sum float64, + quantiles map[float64]float64, + labelValues ...string, +) (Metric, error) { + if len(desc.variableLabels) != len(labelValues) { + return nil, errInconsistentCardinality + } + return &constSummary{ + desc: desc, + count: count, + sum: sum, + quantiles: quantiles, + labelPairs: makeLabelPairs(desc, labelValues), + }, nil +} + +// MustNewConstSummary is a version of NewConstSummary that panics where +// NewConstMetric would have returned an error. +func MustNewConstSummary( + desc *Desc, + count uint64, + sum float64, + quantiles map[float64]float64, + labelValues ...string, +) Metric { + m, err := NewConstSummary(desc, count, sum, quantiles, labelValues...) + if err != nil { + panic(err) + } + return m +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/untyped.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/untyped.go new file mode 100644 index 00000000..5faf7e6e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/untyped.go @@ -0,0 +1,138 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +// Untyped is a Metric that represents a single numerical value that can +// arbitrarily go up and down. +// +// An Untyped metric works the same as a Gauge. The only difference is that to +// no type information is implied. +// +// To create Untyped instances, use NewUntyped. +type Untyped interface { + Metric + Collector + + // Set sets the Untyped metric to an arbitrary value. + Set(float64) + // Inc increments the Untyped metric by 1. + Inc() + // Dec decrements the Untyped metric by 1. + Dec() + // Add adds the given value to the Untyped metric. (The value can be + // negative, resulting in a decrease.) + Add(float64) + // Sub subtracts the given value from the Untyped metric. (The value can + // be negative, resulting in an increase.) + Sub(float64) +} + +// UntypedOpts is an alias for Opts. See there for doc comments. +type UntypedOpts Opts + +// NewUntyped creates a new Untyped metric from the provided UntypedOpts. +func NewUntyped(opts UntypedOpts) Untyped { + return newValue(NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + nil, + opts.ConstLabels, + ), UntypedValue, 0) +} + +// UntypedVec is a Collector that bundles a set of Untyped metrics that all +// share the same Desc, but have different values for their variable +// labels. This is used if you want to count the same thing partitioned by +// various dimensions. Create instances with NewUntypedVec. +type UntypedVec struct { + *MetricVec +} + +// NewUntypedVec creates a new UntypedVec based on the provided UntypedOpts and +// partitioned by the given label names. At least one label name must be +// provided. +func NewUntypedVec(opts UntypedOpts, labelNames []string) *UntypedVec { + desc := NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + labelNames, + opts.ConstLabels, + ) + return &UntypedVec{ + MetricVec: newMetricVec(desc, func(lvs ...string) Metric { + return newValue(desc, UntypedValue, 0, lvs...) + }), + } +} + +// GetMetricWithLabelValues replaces the method of the same name in +// MetricVec. The difference is that this method returns an Untyped and not a +// Metric so that no type conversion is required. +func (m *UntypedVec) GetMetricWithLabelValues(lvs ...string) (Untyped, error) { + metric, err := m.MetricVec.GetMetricWithLabelValues(lvs...) + if metric != nil { + return metric.(Untyped), err + } + return nil, err +} + +// GetMetricWith replaces the method of the same name in MetricVec. The +// difference is that this method returns an Untyped and not a Metric so that no +// type conversion is required. +func (m *UntypedVec) GetMetricWith(labels Labels) (Untyped, error) { + metric, err := m.MetricVec.GetMetricWith(labels) + if metric != nil { + return metric.(Untyped), err + } + return nil, err +} + +// WithLabelValues works as GetMetricWithLabelValues, but panics where +// GetMetricWithLabelValues would have returned an error. By not returning an +// error, WithLabelValues allows shortcuts like +// myVec.WithLabelValues("404", "GET").Add(42) +func (m *UntypedVec) WithLabelValues(lvs ...string) Untyped { + return m.MetricVec.WithLabelValues(lvs...).(Untyped) +} + +// With works as GetMetricWith, but panics where GetMetricWithLabels would have +// returned an error. By not returning an error, With allows shortcuts like +// myVec.With(Labels{"code": "404", "method": "GET"}).Add(42) +func (m *UntypedVec) With(labels Labels) Untyped { + return m.MetricVec.With(labels).(Untyped) +} + +// UntypedFunc is an Untyped whose value is determined at collect time by +// calling a provided function. +// +// To create UntypedFunc instances, use NewUntypedFunc. +type UntypedFunc interface { + Metric + Collector +} + +// NewUntypedFunc creates a new UntypedFunc based on the provided +// UntypedOpts. The value reported is determined by calling the given function +// from within the Write method. Take into account that metric collection may +// happen concurrently. If that results in concurrent calls to Write, like in +// the case where an UntypedFunc is directly registered with Prometheus, the +// provided function must be concurrency-safe. +func NewUntypedFunc(opts UntypedOpts, function func() float64) UntypedFunc { + return newValueFunc(NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + nil, + opts.ConstLabels, + ), UntypedValue, function) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/value.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/value.go new file mode 100644 index 00000000..a944c377 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/value.go @@ -0,0 +1,234 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "errors" + "fmt" + "math" + "sort" + "sync/atomic" + + dto "github.com/prometheus/client_model/go" + + "github.com/golang/protobuf/proto" +) + +// ValueType is an enumeration of metric types that represent a simple value. +type ValueType int + +// Possible values for the ValueType enum. +const ( + _ ValueType = iota + CounterValue + GaugeValue + UntypedValue +) + +var errInconsistentCardinality = errors.New("inconsistent label cardinality") + +// value is a generic metric for simple values. It implements Metric, Collector, +// Counter, Gauge, and Untyped. Its effective type is determined by +// ValueType. This is a low-level building block used by the library to back the +// implementations of Counter, Gauge, and Untyped. +type value struct { + // valBits containst the bits of the represented float64 value. It has + // to go first in the struct to guarantee alignment for atomic + // operations. http://golang.org/pkg/sync/atomic/#pkg-note-BUG + valBits uint64 + + selfCollector + + desc *Desc + valType ValueType + labelPairs []*dto.LabelPair +} + +// newValue returns a newly allocated value with the given Desc, ValueType, +// sample value and label values. It panics if the number of label +// values is different from the number of variable labels in Desc. +func newValue(desc *Desc, valueType ValueType, val float64, labelValues ...string) *value { + if len(labelValues) != len(desc.variableLabels) { + panic(errInconsistentCardinality) + } + result := &value{ + desc: desc, + valType: valueType, + valBits: math.Float64bits(val), + labelPairs: makeLabelPairs(desc, labelValues), + } + result.init(result) + return result +} + +func (v *value) Desc() *Desc { + return v.desc +} + +func (v *value) Set(val float64) { + atomic.StoreUint64(&v.valBits, math.Float64bits(val)) +} + +func (v *value) Inc() { + v.Add(1) +} + +func (v *value) Dec() { + v.Add(-1) +} + +func (v *value) Add(val float64) { + for { + oldBits := atomic.LoadUint64(&v.valBits) + newBits := math.Float64bits(math.Float64frombits(oldBits) + val) + if atomic.CompareAndSwapUint64(&v.valBits, oldBits, newBits) { + return + } + } +} + +func (v *value) Sub(val float64) { + v.Add(val * -1) +} + +func (v *value) Write(out *dto.Metric) error { + val := math.Float64frombits(atomic.LoadUint64(&v.valBits)) + return populateMetric(v.valType, val, v.labelPairs, out) +} + +// valueFunc is a generic metric for simple values retrieved on collect time +// from a function. It implements Metric and Collector. Its effective type is +// determined by ValueType. This is a low-level building block used by the +// library to back the implementations of CounterFunc, GaugeFunc, and +// UntypedFunc. +type valueFunc struct { + selfCollector + + desc *Desc + valType ValueType + function func() float64 + labelPairs []*dto.LabelPair +} + +// newValueFunc returns a newly allocated valueFunc with the given Desc and +// ValueType. The value reported is determined by calling the given function +// from within the Write method. Take into account that metric collection may +// happen concurrently. If that results in concurrent calls to Write, like in +// the case where a valueFunc is directly registered with Prometheus, the +// provided function must be concurrency-safe. +func newValueFunc(desc *Desc, valueType ValueType, function func() float64) *valueFunc { + result := &valueFunc{ + desc: desc, + valType: valueType, + function: function, + labelPairs: makeLabelPairs(desc, nil), + } + result.init(result) + return result +} + +func (v *valueFunc) Desc() *Desc { + return v.desc +} + +func (v *valueFunc) Write(out *dto.Metric) error { + return populateMetric(v.valType, v.function(), v.labelPairs, out) +} + +// NewConstMetric returns a metric with one fixed value that cannot be +// changed. Users of this package will not have much use for it in regular +// operations. However, when implementing custom Collectors, it is useful as a +// throw-away metric that is generated on the fly to send it to Prometheus in +// the Collect method. NewConstMetric returns an error if the length of +// labelValues is not consistent with the variable labels in Desc. +func NewConstMetric(desc *Desc, valueType ValueType, value float64, labelValues ...string) (Metric, error) { + if len(desc.variableLabels) != len(labelValues) { + return nil, errInconsistentCardinality + } + return &constMetric{ + desc: desc, + valType: valueType, + val: value, + labelPairs: makeLabelPairs(desc, labelValues), + }, nil +} + +// MustNewConstMetric is a version of NewConstMetric that panics where +// NewConstMetric would have returned an error. +func MustNewConstMetric(desc *Desc, valueType ValueType, value float64, labelValues ...string) Metric { + m, err := NewConstMetric(desc, valueType, value, labelValues...) + if err != nil { + panic(err) + } + return m +} + +type constMetric struct { + desc *Desc + valType ValueType + val float64 + labelPairs []*dto.LabelPair +} + +func (m *constMetric) Desc() *Desc { + return m.desc +} + +func (m *constMetric) Write(out *dto.Metric) error { + return populateMetric(m.valType, m.val, m.labelPairs, out) +} + +func populateMetric( + t ValueType, + v float64, + labelPairs []*dto.LabelPair, + m *dto.Metric, +) error { + m.Label = labelPairs + switch t { + case CounterValue: + m.Counter = &dto.Counter{Value: proto.Float64(v)} + case GaugeValue: + m.Gauge = &dto.Gauge{Value: proto.Float64(v)} + case UntypedValue: + m.Untyped = &dto.Untyped{Value: proto.Float64(v)} + default: + return fmt.Errorf("encountered unknown type %v", t) + } + return nil +} + +func makeLabelPairs(desc *Desc, labelValues []string) []*dto.LabelPair { + totalLen := len(desc.variableLabels) + len(desc.constLabelPairs) + if totalLen == 0 { + // Super fast path. + return nil + } + if len(desc.variableLabels) == 0 { + // Moderately fast path. + return desc.constLabelPairs + } + labelPairs := make([]*dto.LabelPair, 0, totalLen) + for i, n := range desc.variableLabels { + labelPairs = append(labelPairs, &dto.LabelPair{ + Name: proto.String(n), + Value: proto.String(labelValues[i]), + }) + } + for _, lp := range desc.constLabelPairs { + labelPairs = append(labelPairs, lp) + } + sort.Sort(LabelPairSorter(labelPairs)) + return labelPairs +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/vec.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/vec.go new file mode 100644 index 00000000..7f3eef9a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_golang/prometheus/vec.go @@ -0,0 +1,404 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "fmt" + "sync" + + "github.com/prometheus/common/model" +) + +// MetricVec is a Collector to bundle metrics of the same name that +// differ in their label values. MetricVec is usually not used directly but as a +// building block for implementations of vectors of a given metric +// type. GaugeVec, CounterVec, SummaryVec, and UntypedVec are examples already +// provided in this package. +type MetricVec struct { + mtx sync.RWMutex // Protects the children. + children map[uint64][]metricWithLabelValues + desc *Desc + + newMetric func(labelValues ...string) Metric + hashAdd func(h uint64, s string) uint64 // replace hash function for testing collision handling + hashAddByte func(h uint64, b byte) uint64 +} + +// newMetricVec returns an initialized MetricVec. The concrete value is +// returned for embedding into another struct. +func newMetricVec(desc *Desc, newMetric func(lvs ...string) Metric) *MetricVec { + return &MetricVec{ + children: map[uint64][]metricWithLabelValues{}, + desc: desc, + newMetric: newMetric, + hashAdd: hashAdd, + hashAddByte: hashAddByte, + } +} + +// metricWithLabelValues provides the metric and its label values for +// disambiguation on hash collision. +type metricWithLabelValues struct { + values []string + metric Metric +} + +// Describe implements Collector. The length of the returned slice +// is always one. +func (m *MetricVec) Describe(ch chan<- *Desc) { + ch <- m.desc +} + +// Collect implements Collector. +func (m *MetricVec) Collect(ch chan<- Metric) { + m.mtx.RLock() + defer m.mtx.RUnlock() + + for _, metrics := range m.children { + for _, metric := range metrics { + ch <- metric.metric + } + } +} + +// GetMetricWithLabelValues returns the Metric for the given slice of label +// values (same order as the VariableLabels in Desc). If that combination of +// label values is accessed for the first time, a new Metric is created. +// +// It is possible to call this method without using the returned Metric to only +// create the new Metric but leave it at its start value (e.g. a Summary or +// Histogram without any observations). See also the SummaryVec example. +// +// Keeping the Metric for later use is possible (and should be considered if +// performance is critical), but keep in mind that Reset, DeleteLabelValues and +// Delete can be used to delete the Metric from the MetricVec. In that case, the +// Metric will still exist, but it will not be exported anymore, even if a +// Metric with the same label values is created later. See also the CounterVec +// example. +// +// An error is returned if the number of label values is not the same as the +// number of VariableLabels in Desc. +// +// Note that for more than one label value, this method is prone to mistakes +// caused by an incorrect order of arguments. Consider GetMetricWith(Labels) as +// an alternative to avoid that type of mistake. For higher label numbers, the +// latter has a much more readable (albeit more verbose) syntax, but it comes +// with a performance overhead (for creating and processing the Labels map). +// See also the GaugeVec example. +func (m *MetricVec) GetMetricWithLabelValues(lvs ...string) (Metric, error) { + h, err := m.hashLabelValues(lvs) + if err != nil { + return nil, err + } + + return m.getOrCreateMetricWithLabelValues(h, lvs), nil +} + +// GetMetricWith returns the Metric for the given Labels map (the label names +// must match those of the VariableLabels in Desc). If that label map is +// accessed for the first time, a new Metric is created. Implications of +// creating a Metric without using it and keeping the Metric for later use are +// the same as for GetMetricWithLabelValues. +// +// An error is returned if the number and names of the Labels are inconsistent +// with those of the VariableLabels in Desc. +// +// This method is used for the same purpose as +// GetMetricWithLabelValues(...string). See there for pros and cons of the two +// methods. +func (m *MetricVec) GetMetricWith(labels Labels) (Metric, error) { + h, err := m.hashLabels(labels) + if err != nil { + return nil, err + } + + return m.getOrCreateMetricWithLabels(h, labels), nil +} + +// WithLabelValues works as GetMetricWithLabelValues, but panics if an error +// occurs. The method allows neat syntax like: +// httpReqs.WithLabelValues("404", "POST").Inc() +func (m *MetricVec) WithLabelValues(lvs ...string) Metric { + metric, err := m.GetMetricWithLabelValues(lvs...) + if err != nil { + panic(err) + } + return metric +} + +// With works as GetMetricWith, but panics if an error occurs. The method allows +// neat syntax like: +// httpReqs.With(Labels{"status":"404", "method":"POST"}).Inc() +func (m *MetricVec) With(labels Labels) Metric { + metric, err := m.GetMetricWith(labels) + if err != nil { + panic(err) + } + return metric +} + +// DeleteLabelValues removes the metric where the variable labels are the same +// as those passed in as labels (same order as the VariableLabels in Desc). It +// returns true if a metric was deleted. +// +// It is not an error if the number of label values is not the same as the +// number of VariableLabels in Desc. However, such inconsistent label count can +// never match an actual Metric, so the method will always return false in that +// case. +// +// Note that for more than one label value, this method is prone to mistakes +// caused by an incorrect order of arguments. Consider Delete(Labels) as an +// alternative to avoid that type of mistake. For higher label numbers, the +// latter has a much more readable (albeit more verbose) syntax, but it comes +// with a performance overhead (for creating and processing the Labels map). +// See also the CounterVec example. +func (m *MetricVec) DeleteLabelValues(lvs ...string) bool { + m.mtx.Lock() + defer m.mtx.Unlock() + + h, err := m.hashLabelValues(lvs) + if err != nil { + return false + } + return m.deleteByHashWithLabelValues(h, lvs) +} + +// Delete deletes the metric where the variable labels are the same as those +// passed in as labels. It returns true if a metric was deleted. +// +// It is not an error if the number and names of the Labels are inconsistent +// with those of the VariableLabels in the Desc of the MetricVec. However, such +// inconsistent Labels can never match an actual Metric, so the method will +// always return false in that case. +// +// This method is used for the same purpose as DeleteLabelValues(...string). See +// there for pros and cons of the two methods. +func (m *MetricVec) Delete(labels Labels) bool { + m.mtx.Lock() + defer m.mtx.Unlock() + + h, err := m.hashLabels(labels) + if err != nil { + return false + } + + return m.deleteByHashWithLabels(h, labels) +} + +// deleteByHashWithLabelValues removes the metric from the hash bucket h. If +// there are multiple matches in the bucket, use lvs to select a metric and +// remove only that metric. +func (m *MetricVec) deleteByHashWithLabelValues(h uint64, lvs []string) bool { + metrics, ok := m.children[h] + if !ok { + return false + } + + i := m.findMetricWithLabelValues(metrics, lvs) + if i >= len(metrics) { + return false + } + + if len(metrics) > 1 { + m.children[h] = append(metrics[:i], metrics[i+1:]...) + } else { + delete(m.children, h) + } + return true +} + +// deleteByHashWithLabels removes the metric from the hash bucket h. If there +// are multiple matches in the bucket, use lvs to select a metric and remove +// only that metric. +func (m *MetricVec) deleteByHashWithLabels(h uint64, labels Labels) bool { + metrics, ok := m.children[h] + if !ok { + return false + } + i := m.findMetricWithLabels(metrics, labels) + if i >= len(metrics) { + return false + } + + if len(metrics) > 1 { + m.children[h] = append(metrics[:i], metrics[i+1:]...) + } else { + delete(m.children, h) + } + return true +} + +// Reset deletes all metrics in this vector. +func (m *MetricVec) Reset() { + m.mtx.Lock() + defer m.mtx.Unlock() + + for h := range m.children { + delete(m.children, h) + } +} + +func (m *MetricVec) hashLabelValues(vals []string) (uint64, error) { + if len(vals) != len(m.desc.variableLabels) { + return 0, errInconsistentCardinality + } + h := hashNew() + for _, val := range vals { + h = m.hashAdd(h, val) + h = m.hashAddByte(h, model.SeparatorByte) + } + return h, nil +} + +func (m *MetricVec) hashLabels(labels Labels) (uint64, error) { + if len(labels) != len(m.desc.variableLabels) { + return 0, errInconsistentCardinality + } + h := hashNew() + for _, label := range m.desc.variableLabels { + val, ok := labels[label] + if !ok { + return 0, fmt.Errorf("label name %q missing in label map", label) + } + h = m.hashAdd(h, val) + h = m.hashAddByte(h, model.SeparatorByte) + } + return h, nil +} + +// getOrCreateMetricWithLabelValues retrieves the metric by hash and label value +// or creates it and returns the new one. +// +// This function holds the mutex. +func (m *MetricVec) getOrCreateMetricWithLabelValues(hash uint64, lvs []string) Metric { + m.mtx.RLock() + metric, ok := m.getMetricWithLabelValues(hash, lvs) + m.mtx.RUnlock() + if ok { + return metric + } + + m.mtx.Lock() + defer m.mtx.Unlock() + metric, ok = m.getMetricWithLabelValues(hash, lvs) + if !ok { + // Copy to avoid allocation in case wo don't go down this code path. + copiedLVs := make([]string, len(lvs)) + copy(copiedLVs, lvs) + metric = m.newMetric(copiedLVs...) + m.children[hash] = append(m.children[hash], metricWithLabelValues{values: copiedLVs, metric: metric}) + } + return metric +} + +// getOrCreateMetricWithLabelValues retrieves the metric by hash and label value +// or creates it and returns the new one. +// +// This function holds the mutex. +func (m *MetricVec) getOrCreateMetricWithLabels(hash uint64, labels Labels) Metric { + m.mtx.RLock() + metric, ok := m.getMetricWithLabels(hash, labels) + m.mtx.RUnlock() + if ok { + return metric + } + + m.mtx.Lock() + defer m.mtx.Unlock() + metric, ok = m.getMetricWithLabels(hash, labels) + if !ok { + lvs := m.extractLabelValues(labels) + metric = m.newMetric(lvs...) + m.children[hash] = append(m.children[hash], metricWithLabelValues{values: lvs, metric: metric}) + } + return metric +} + +// getMetricWithLabelValues gets a metric while handling possible collisions in +// the hash space. Must be called while holding read mutex. +func (m *MetricVec) getMetricWithLabelValues(h uint64, lvs []string) (Metric, bool) { + metrics, ok := m.children[h] + if ok { + if i := m.findMetricWithLabelValues(metrics, lvs); i < len(metrics) { + return metrics[i].metric, true + } + } + return nil, false +} + +// getMetricWithLabels gets a metric while handling possible collisions in +// the hash space. Must be called while holding read mutex. +func (m *MetricVec) getMetricWithLabels(h uint64, labels Labels) (Metric, bool) { + metrics, ok := m.children[h] + if ok { + if i := m.findMetricWithLabels(metrics, labels); i < len(metrics) { + return metrics[i].metric, true + } + } + return nil, false +} + +// findMetricWithLabelValues returns the index of the matching metric or +// len(metrics) if not found. +func (m *MetricVec) findMetricWithLabelValues(metrics []metricWithLabelValues, lvs []string) int { + for i, metric := range metrics { + if m.matchLabelValues(metric.values, lvs) { + return i + } + } + return len(metrics) +} + +// findMetricWithLabels returns the index of the matching metric or len(metrics) +// if not found. +func (m *MetricVec) findMetricWithLabels(metrics []metricWithLabelValues, labels Labels) int { + for i, metric := range metrics { + if m.matchLabels(metric.values, labels) { + return i + } + } + return len(metrics) +} + +func (m *MetricVec) matchLabelValues(values []string, lvs []string) bool { + if len(values) != len(lvs) { + return false + } + for i, v := range values { + if v != lvs[i] { + return false + } + } + return true +} + +func (m *MetricVec) matchLabels(values []string, labels Labels) bool { + if len(labels) != len(values) { + return false + } + for i, k := range m.desc.variableLabels { + if values[i] != labels[k] { + return false + } + } + return true +} + +func (m *MetricVec) extractLabelValues(labels Labels) []string { + labelValues := make([]string, len(labels)) + for i, k := range m.desc.variableLabels { + labelValues[i] = labels[k] + } + return labelValues +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_model/LICENSE b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_model/LICENSE new file mode 100644 index 00000000..261eeb9e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_model/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_model/NOTICE b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_model/NOTICE new file mode 100644 index 00000000..20110e41 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_model/NOTICE @@ -0,0 +1,5 @@ +Data model artifacts for Prometheus. +Copyright 2012-2015 The Prometheus Authors + +This product includes software developed at +SoundCloud Ltd. (http://soundcloud.com/). diff --git a/vendor/github.com/prometheus/client_model/ruby/LICENSE b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_model/ruby/LICENSE similarity index 100% rename from vendor/github.com/prometheus/client_model/ruby/LICENSE rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/client_model/ruby/LICENSE diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/LICENSE b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/LICENSE new file mode 100644 index 00000000..261eeb9e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/NOTICE b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/NOTICE new file mode 100644 index 00000000..636a2c1a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/NOTICE @@ -0,0 +1,5 @@ +Common libraries shared by Prometheus Go components. +Copyright 2015 The Prometheus Authors + +This product includes software developed at +SoundCloud Ltd. (http://soundcloud.com/). diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/expfmt/decode.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/expfmt/decode.go new file mode 100644 index 00000000..c092723e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/expfmt/decode.go @@ -0,0 +1,429 @@ +// Copyright 2015 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package expfmt + +import ( + "fmt" + "io" + "math" + "mime" + "net/http" + + dto "github.com/prometheus/client_model/go" + + "github.com/matttproud/golang_protobuf_extensions/pbutil" + "github.com/prometheus/common/model" +) + +// Decoder types decode an input stream into metric families. +type Decoder interface { + Decode(*dto.MetricFamily) error +} + +// DecodeOptions contains options used by the Decoder and in sample extraction. +type DecodeOptions struct { + // Timestamp is added to each value from the stream that has no explicit timestamp set. + Timestamp model.Time +} + +// ResponseFormat extracts the correct format from a HTTP response header. +// If no matching format can be found FormatUnknown is returned. +func ResponseFormat(h http.Header) Format { + ct := h.Get(hdrContentType) + + mediatype, params, err := mime.ParseMediaType(ct) + if err != nil { + return FmtUnknown + } + + const textType = "text/plain" + + switch mediatype { + case ProtoType: + if p, ok := params["proto"]; ok && p != ProtoProtocol { + return FmtUnknown + } + if e, ok := params["encoding"]; ok && e != "delimited" { + return FmtUnknown + } + return FmtProtoDelim + + case textType: + if v, ok := params["version"]; ok && v != TextVersion { + return FmtUnknown + } + return FmtText + } + + return FmtUnknown +} + +// NewDecoder returns a new decoder based on the given input format. +// If the input format does not imply otherwise, a text format decoder is returned. +func NewDecoder(r io.Reader, format Format) Decoder { + switch format { + case FmtProtoDelim: + return &protoDecoder{r: r} + } + return &textDecoder{r: r} +} + +// protoDecoder implements the Decoder interface for protocol buffers. +type protoDecoder struct { + r io.Reader +} + +// Decode implements the Decoder interface. +func (d *protoDecoder) Decode(v *dto.MetricFamily) error { + _, err := pbutil.ReadDelimited(d.r, v) + if err != nil { + return err + } + if !model.IsValidMetricName(model.LabelValue(v.GetName())) { + return fmt.Errorf("invalid metric name %q", v.GetName()) + } + for _, m := range v.GetMetric() { + if m == nil { + continue + } + for _, l := range m.GetLabel() { + if l == nil { + continue + } + if !model.LabelValue(l.GetValue()).IsValid() { + return fmt.Errorf("invalid label value %q", l.GetValue()) + } + if !model.LabelName(l.GetName()).IsValid() { + return fmt.Errorf("invalid label name %q", l.GetName()) + } + } + } + return nil +} + +// textDecoder implements the Decoder interface for the text protocol. +type textDecoder struct { + r io.Reader + p TextParser + fams []*dto.MetricFamily +} + +// Decode implements the Decoder interface. +func (d *textDecoder) Decode(v *dto.MetricFamily) error { + // TODO(fabxc): Wrap this as a line reader to make streaming safer. + if len(d.fams) == 0 { + // No cached metric families, read everything and parse metrics. + fams, err := d.p.TextToMetricFamilies(d.r) + if err != nil { + return err + } + if len(fams) == 0 { + return io.EOF + } + d.fams = make([]*dto.MetricFamily, 0, len(fams)) + for _, f := range fams { + d.fams = append(d.fams, f) + } + } + + *v = *d.fams[0] + d.fams = d.fams[1:] + + return nil +} + +// SampleDecoder wraps a Decoder to extract samples from the metric families +// decoded by the wrapped Decoder. +type SampleDecoder struct { + Dec Decoder + Opts *DecodeOptions + + f dto.MetricFamily +} + +// Decode calls the Decode method of the wrapped Decoder and then extracts the +// samples from the decoded MetricFamily into the provided model.Vector. +func (sd *SampleDecoder) Decode(s *model.Vector) error { + err := sd.Dec.Decode(&sd.f) + if err != nil { + return err + } + *s, err = extractSamples(&sd.f, sd.Opts) + return err +} + +// ExtractSamples builds a slice of samples from the provided metric +// families. If an error occurrs during sample extraction, it continues to +// extract from the remaining metric families. The returned error is the last +// error that has occurred. +func ExtractSamples(o *DecodeOptions, fams ...*dto.MetricFamily) (model.Vector, error) { + var ( + all model.Vector + lastErr error + ) + for _, f := range fams { + some, err := extractSamples(f, o) + if err != nil { + lastErr = err + continue + } + all = append(all, some...) + } + return all, lastErr +} + +func extractSamples(f *dto.MetricFamily, o *DecodeOptions) (model.Vector, error) { + switch f.GetType() { + case dto.MetricType_COUNTER: + return extractCounter(o, f), nil + case dto.MetricType_GAUGE: + return extractGauge(o, f), nil + case dto.MetricType_SUMMARY: + return extractSummary(o, f), nil + case dto.MetricType_UNTYPED: + return extractUntyped(o, f), nil + case dto.MetricType_HISTOGRAM: + return extractHistogram(o, f), nil + } + return nil, fmt.Errorf("expfmt.extractSamples: unknown metric family type %v", f.GetType()) +} + +func extractCounter(o *DecodeOptions, f *dto.MetricFamily) model.Vector { + samples := make(model.Vector, 0, len(f.Metric)) + + for _, m := range f.Metric { + if m.Counter == nil { + continue + } + + lset := make(model.LabelSet, len(m.Label)+1) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + lset[model.MetricNameLabel] = model.LabelValue(f.GetName()) + + smpl := &model.Sample{ + Metric: model.Metric(lset), + Value: model.SampleValue(m.Counter.GetValue()), + } + + if m.TimestampMs != nil { + smpl.Timestamp = model.TimeFromUnixNano(*m.TimestampMs * 1000000) + } else { + smpl.Timestamp = o.Timestamp + } + + samples = append(samples, smpl) + } + + return samples +} + +func extractGauge(o *DecodeOptions, f *dto.MetricFamily) model.Vector { + samples := make(model.Vector, 0, len(f.Metric)) + + for _, m := range f.Metric { + if m.Gauge == nil { + continue + } + + lset := make(model.LabelSet, len(m.Label)+1) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + lset[model.MetricNameLabel] = model.LabelValue(f.GetName()) + + smpl := &model.Sample{ + Metric: model.Metric(lset), + Value: model.SampleValue(m.Gauge.GetValue()), + } + + if m.TimestampMs != nil { + smpl.Timestamp = model.TimeFromUnixNano(*m.TimestampMs * 1000000) + } else { + smpl.Timestamp = o.Timestamp + } + + samples = append(samples, smpl) + } + + return samples +} + +func extractUntyped(o *DecodeOptions, f *dto.MetricFamily) model.Vector { + samples := make(model.Vector, 0, len(f.Metric)) + + for _, m := range f.Metric { + if m.Untyped == nil { + continue + } + + lset := make(model.LabelSet, len(m.Label)+1) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + lset[model.MetricNameLabel] = model.LabelValue(f.GetName()) + + smpl := &model.Sample{ + Metric: model.Metric(lset), + Value: model.SampleValue(m.Untyped.GetValue()), + } + + if m.TimestampMs != nil { + smpl.Timestamp = model.TimeFromUnixNano(*m.TimestampMs * 1000000) + } else { + smpl.Timestamp = o.Timestamp + } + + samples = append(samples, smpl) + } + + return samples +} + +func extractSummary(o *DecodeOptions, f *dto.MetricFamily) model.Vector { + samples := make(model.Vector, 0, len(f.Metric)) + + for _, m := range f.Metric { + if m.Summary == nil { + continue + } + + timestamp := o.Timestamp + if m.TimestampMs != nil { + timestamp = model.TimeFromUnixNano(*m.TimestampMs * 1000000) + } + + for _, q := range m.Summary.Quantile { + lset := make(model.LabelSet, len(m.Label)+2) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + // BUG(matt): Update other names to "quantile". + lset[model.LabelName(model.QuantileLabel)] = model.LabelValue(fmt.Sprint(q.GetQuantile())) + lset[model.MetricNameLabel] = model.LabelValue(f.GetName()) + + samples = append(samples, &model.Sample{ + Metric: model.Metric(lset), + Value: model.SampleValue(q.GetValue()), + Timestamp: timestamp, + }) + } + + lset := make(model.LabelSet, len(m.Label)+1) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + lset[model.MetricNameLabel] = model.LabelValue(f.GetName() + "_sum") + + samples = append(samples, &model.Sample{ + Metric: model.Metric(lset), + Value: model.SampleValue(m.Summary.GetSampleSum()), + Timestamp: timestamp, + }) + + lset = make(model.LabelSet, len(m.Label)+1) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + lset[model.MetricNameLabel] = model.LabelValue(f.GetName() + "_count") + + samples = append(samples, &model.Sample{ + Metric: model.Metric(lset), + Value: model.SampleValue(m.Summary.GetSampleCount()), + Timestamp: timestamp, + }) + } + + return samples +} + +func extractHistogram(o *DecodeOptions, f *dto.MetricFamily) model.Vector { + samples := make(model.Vector, 0, len(f.Metric)) + + for _, m := range f.Metric { + if m.Histogram == nil { + continue + } + + timestamp := o.Timestamp + if m.TimestampMs != nil { + timestamp = model.TimeFromUnixNano(*m.TimestampMs * 1000000) + } + + infSeen := false + + for _, q := range m.Histogram.Bucket { + lset := make(model.LabelSet, len(m.Label)+2) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + lset[model.LabelName(model.BucketLabel)] = model.LabelValue(fmt.Sprint(q.GetUpperBound())) + lset[model.MetricNameLabel] = model.LabelValue(f.GetName() + "_bucket") + + if math.IsInf(q.GetUpperBound(), +1) { + infSeen = true + } + + samples = append(samples, &model.Sample{ + Metric: model.Metric(lset), + Value: model.SampleValue(q.GetCumulativeCount()), + Timestamp: timestamp, + }) + } + + lset := make(model.LabelSet, len(m.Label)+1) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + lset[model.MetricNameLabel] = model.LabelValue(f.GetName() + "_sum") + + samples = append(samples, &model.Sample{ + Metric: model.Metric(lset), + Value: model.SampleValue(m.Histogram.GetSampleSum()), + Timestamp: timestamp, + }) + + lset = make(model.LabelSet, len(m.Label)+1) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + lset[model.MetricNameLabel] = model.LabelValue(f.GetName() + "_count") + + count := &model.Sample{ + Metric: model.Metric(lset), + Value: model.SampleValue(m.Histogram.GetSampleCount()), + Timestamp: timestamp, + } + samples = append(samples, count) + + if !infSeen { + // Append an infinity bucket sample. + lset := make(model.LabelSet, len(m.Label)+2) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + lset[model.LabelName(model.BucketLabel)] = model.LabelValue("+Inf") + lset[model.MetricNameLabel] = model.LabelValue(f.GetName() + "_bucket") + + samples = append(samples, &model.Sample{ + Metric: model.Metric(lset), + Value: count.Value, + Timestamp: timestamp, + }) + } + } + + return samples +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/expfmt/encode.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/expfmt/encode.go new file mode 100644 index 00000000..11839ed6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/expfmt/encode.go @@ -0,0 +1,88 @@ +// Copyright 2015 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package expfmt + +import ( + "fmt" + "io" + "net/http" + + "github.com/golang/protobuf/proto" + "github.com/matttproud/golang_protobuf_extensions/pbutil" + "github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg" + + dto "github.com/prometheus/client_model/go" +) + +// Encoder types encode metric families into an underlying wire protocol. +type Encoder interface { + Encode(*dto.MetricFamily) error +} + +type encoder func(*dto.MetricFamily) error + +func (e encoder) Encode(v *dto.MetricFamily) error { + return e(v) +} + +// Negotiate returns the Content-Type based on the given Accept header. +// If no appropriate accepted type is found, FmtText is returned. +func Negotiate(h http.Header) Format { + for _, ac := range goautoneg.ParseAccept(h.Get(hdrAccept)) { + // Check for protocol buffer + if ac.Type+"/"+ac.SubType == ProtoType && ac.Params["proto"] == ProtoProtocol { + switch ac.Params["encoding"] { + case "delimited": + return FmtProtoDelim + case "text": + return FmtProtoText + case "compact-text": + return FmtProtoCompact + } + } + // Check for text format. + ver := ac.Params["version"] + if ac.Type == "text" && ac.SubType == "plain" && (ver == TextVersion || ver == "") { + return FmtText + } + } + return FmtText +} + +// NewEncoder returns a new encoder based on content type negotiation. +func NewEncoder(w io.Writer, format Format) Encoder { + switch format { + case FmtProtoDelim: + return encoder(func(v *dto.MetricFamily) error { + _, err := pbutil.WriteDelimited(w, v) + return err + }) + case FmtProtoCompact: + return encoder(func(v *dto.MetricFamily) error { + _, err := fmt.Fprintln(w, v.String()) + return err + }) + case FmtProtoText: + return encoder(func(v *dto.MetricFamily) error { + _, err := fmt.Fprintln(w, proto.MarshalTextString(v)) + return err + }) + case FmtText: + return encoder(func(v *dto.MetricFamily) error { + _, err := MetricFamilyToText(w, v) + return err + }) + } + panic("expfmt.NewEncoder: unknown format") +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/expfmt/expfmt.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/expfmt/expfmt.go new file mode 100644 index 00000000..c71bcb98 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/expfmt/expfmt.go @@ -0,0 +1,38 @@ +// Copyright 2015 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package expfmt contains tools for reading and writing Prometheus metrics. +package expfmt + +// Format specifies the HTTP content type of the different wire protocols. +type Format string + +// Constants to assemble the Content-Type values for the different wire protocols. +const ( + TextVersion = "0.0.4" + ProtoType = `application/vnd.google.protobuf` + ProtoProtocol = `io.prometheus.client.MetricFamily` + ProtoFmt = ProtoType + "; proto=" + ProtoProtocol + ";" + + // The Content-Type values for the different wire protocols. + FmtUnknown Format = `` + FmtText Format = `text/plain; version=` + TextVersion + `; charset=utf-8` + FmtProtoDelim Format = ProtoFmt + ` encoding=delimited` + FmtProtoText Format = ProtoFmt + ` encoding=text` + FmtProtoCompact Format = ProtoFmt + ` encoding=compact-text` +) + +const ( + hdrContentType = "Content-Type" + hdrAccept = "Accept" +) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/expfmt/fuzz.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/expfmt/fuzz.go new file mode 100644 index 00000000..dc2eedee --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/expfmt/fuzz.go @@ -0,0 +1,36 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Build only when actually fuzzing +// +build gofuzz + +package expfmt + +import "bytes" + +// Fuzz text metric parser with with github.com/dvyukov/go-fuzz: +// +// go-fuzz-build github.com/prometheus/common/expfmt +// go-fuzz -bin expfmt-fuzz.zip -workdir fuzz +// +// Further input samples should go in the folder fuzz/corpus. +func Fuzz(in []byte) int { + parser := TextParser{} + _, err := parser.TextToMetricFamilies(bytes.NewReader(in)) + + if err != nil { + return 0 + } + + return 1 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/expfmt/text_create.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/expfmt/text_create.go new file mode 100644 index 00000000..8e473d0f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/expfmt/text_create.go @@ -0,0 +1,468 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package expfmt + +import ( + "bytes" + "fmt" + "io" + "math" + "strconv" + "strings" + "sync" + + "github.com/prometheus/common/model" + + dto "github.com/prometheus/client_model/go" +) + +// enhancedWriter has all the enhanced write functions needed here. bytes.Buffer +// implements it. +type enhancedWriter interface { + io.Writer + WriteRune(r rune) (n int, err error) + WriteString(s string) (n int, err error) + WriteByte(c byte) error +} + +const ( + initialBufSize = 512 + initialNumBufSize = 24 +) + +var ( + bufPool = sync.Pool{ + New: func() interface{} { + return bytes.NewBuffer(make([]byte, 0, initialBufSize)) + }, + } + numBufPool = sync.Pool{ + New: func() interface{} { + b := make([]byte, 0, initialNumBufSize) + return &b + }, + } +) + +// MetricFamilyToText converts a MetricFamily proto message into text format and +// writes the resulting lines to 'out'. It returns the number of bytes written +// and any error encountered. The output will have the same order as the input, +// no further sorting is performed. Furthermore, this function assumes the input +// is already sanitized and does not perform any sanity checks. If the input +// contains duplicate metrics or invalid metric or label names, the conversion +// will result in invalid text format output. +// +// This method fulfills the type 'prometheus.encoder'. +func MetricFamilyToText(out io.Writer, in *dto.MetricFamily) (written int, err error) { + // Fail-fast checks. + if len(in.Metric) == 0 { + return 0, fmt.Errorf("MetricFamily has no metrics: %s", in) + } + name := in.GetName() + if name == "" { + return 0, fmt.Errorf("MetricFamily has no name: %s", in) + } + + // Try the interface upgrade. If it doesn't work, we'll use a + // bytes.Buffer from the sync.Pool and write out its content to out in a + // single go in the end. + w, ok := out.(enhancedWriter) + if !ok { + b := bufPool.Get().(*bytes.Buffer) + b.Reset() + w = b + defer func() { + bWritten, bErr := out.Write(b.Bytes()) + written = bWritten + if err == nil { + err = bErr + } + bufPool.Put(b) + }() + } + + var n int + + // Comments, first HELP, then TYPE. + if in.Help != nil { + n, err = w.WriteString("# HELP ") + written += n + if err != nil { + return + } + n, err = w.WriteString(name) + written += n + if err != nil { + return + } + err = w.WriteByte(' ') + written++ + if err != nil { + return + } + n, err = writeEscapedString(w, *in.Help, false) + written += n + if err != nil { + return + } + err = w.WriteByte('\n') + written++ + if err != nil { + return + } + } + n, err = w.WriteString("# TYPE ") + written += n + if err != nil { + return + } + n, err = w.WriteString(name) + written += n + if err != nil { + return + } + metricType := in.GetType() + switch metricType { + case dto.MetricType_COUNTER: + n, err = w.WriteString(" counter\n") + case dto.MetricType_GAUGE: + n, err = w.WriteString(" gauge\n") + case dto.MetricType_SUMMARY: + n, err = w.WriteString(" summary\n") + case dto.MetricType_UNTYPED: + n, err = w.WriteString(" untyped\n") + case dto.MetricType_HISTOGRAM: + n, err = w.WriteString(" histogram\n") + default: + return written, fmt.Errorf("unknown metric type %s", metricType.String()) + } + written += n + if err != nil { + return + } + + // Finally the samples, one line for each. + for _, metric := range in.Metric { + switch metricType { + case dto.MetricType_COUNTER: + if metric.Counter == nil { + return written, fmt.Errorf( + "expected counter in metric %s %s", name, metric, + ) + } + n, err = writeSample( + w, name, "", metric, "", 0, + metric.Counter.GetValue(), + ) + case dto.MetricType_GAUGE: + if metric.Gauge == nil { + return written, fmt.Errorf( + "expected gauge in metric %s %s", name, metric, + ) + } + n, err = writeSample( + w, name, "", metric, "", 0, + metric.Gauge.GetValue(), + ) + case dto.MetricType_UNTYPED: + if metric.Untyped == nil { + return written, fmt.Errorf( + "expected untyped in metric %s %s", name, metric, + ) + } + n, err = writeSample( + w, name, "", metric, "", 0, + metric.Untyped.GetValue(), + ) + case dto.MetricType_SUMMARY: + if metric.Summary == nil { + return written, fmt.Errorf( + "expected summary in metric %s %s", name, metric, + ) + } + for _, q := range metric.Summary.Quantile { + n, err = writeSample( + w, name, "", metric, + model.QuantileLabel, q.GetQuantile(), + q.GetValue(), + ) + written += n + if err != nil { + return + } + } + n, err = writeSample( + w, name, "_sum", metric, "", 0, + metric.Summary.GetSampleSum(), + ) + written += n + if err != nil { + return + } + n, err = writeSample( + w, name, "_count", metric, "", 0, + float64(metric.Summary.GetSampleCount()), + ) + case dto.MetricType_HISTOGRAM: + if metric.Histogram == nil { + return written, fmt.Errorf( + "expected histogram in metric %s %s", name, metric, + ) + } + infSeen := false + for _, b := range metric.Histogram.Bucket { + n, err = writeSample( + w, name, "_bucket", metric, + model.BucketLabel, b.GetUpperBound(), + float64(b.GetCumulativeCount()), + ) + written += n + if err != nil { + return + } + if math.IsInf(b.GetUpperBound(), +1) { + infSeen = true + } + } + if !infSeen { + n, err = writeSample( + w, name, "_bucket", metric, + model.BucketLabel, math.Inf(+1), + float64(metric.Histogram.GetSampleCount()), + ) + written += n + if err != nil { + return + } + } + n, err = writeSample( + w, name, "_sum", metric, "", 0, + metric.Histogram.GetSampleSum(), + ) + written += n + if err != nil { + return + } + n, err = writeSample( + w, name, "_count", metric, "", 0, + float64(metric.Histogram.GetSampleCount()), + ) + default: + return written, fmt.Errorf( + "unexpected type in metric %s %s", name, metric, + ) + } + written += n + if err != nil { + return + } + } + return +} + +// writeSample writes a single sample in text format to w, given the metric +// name, the metric proto message itself, optionally an additional label name +// with a float64 value (use empty string as label name if not required), and +// the value. The function returns the number of bytes written and any error +// encountered. +func writeSample( + w enhancedWriter, + name, suffix string, + metric *dto.Metric, + additionalLabelName string, additionalLabelValue float64, + value float64, +) (int, error) { + var written int + n, err := w.WriteString(name) + written += n + if err != nil { + return written, err + } + if suffix != "" { + n, err = w.WriteString(suffix) + written += n + if err != nil { + return written, err + } + } + n, err = writeLabelPairs( + w, metric.Label, additionalLabelName, additionalLabelValue, + ) + written += n + if err != nil { + return written, err + } + err = w.WriteByte(' ') + written++ + if err != nil { + return written, err + } + n, err = writeFloat(w, value) + written += n + if err != nil { + return written, err + } + if metric.TimestampMs != nil { + err = w.WriteByte(' ') + written++ + if err != nil { + return written, err + } + n, err = writeInt(w, *metric.TimestampMs) + written += n + if err != nil { + return written, err + } + } + err = w.WriteByte('\n') + written++ + if err != nil { + return written, err + } + return written, nil +} + +// writeLabelPairs converts a slice of LabelPair proto messages plus the +// explicitly given additional label pair into text formatted as required by the +// text format and writes it to 'w'. An empty slice in combination with an empty +// string 'additionalLabelName' results in nothing being written. Otherwise, the +// label pairs are written, escaped as required by the text format, and enclosed +// in '{...}'. The function returns the number of bytes written and any error +// encountered. +func writeLabelPairs( + w enhancedWriter, + in []*dto.LabelPair, + additionalLabelName string, additionalLabelValue float64, +) (int, error) { + if len(in) == 0 && additionalLabelName == "" { + return 0, nil + } + var ( + written int + separator byte = '{' + ) + for _, lp := range in { + err := w.WriteByte(separator) + written++ + if err != nil { + return written, err + } + n, err := w.WriteString(lp.GetName()) + written += n + if err != nil { + return written, err + } + n, err = w.WriteString(`="`) + written += n + if err != nil { + return written, err + } + n, err = writeEscapedString(w, lp.GetValue(), true) + written += n + if err != nil { + return written, err + } + err = w.WriteByte('"') + written++ + if err != nil { + return written, err + } + separator = ',' + } + if additionalLabelName != "" { + err := w.WriteByte(separator) + written++ + if err != nil { + return written, err + } + n, err := w.WriteString(additionalLabelName) + written += n + if err != nil { + return written, err + } + n, err = w.WriteString(`="`) + written += n + if err != nil { + return written, err + } + n, err = writeFloat(w, additionalLabelValue) + written += n + if err != nil { + return written, err + } + err = w.WriteByte('"') + written++ + if err != nil { + return written, err + } + } + err := w.WriteByte('}') + written++ + if err != nil { + return written, err + } + return written, nil +} + +// writeEscapedString replaces '\' by '\\', new line character by '\n', and - if +// includeDoubleQuote is true - '"' by '\"'. +var ( + escaper = strings.NewReplacer("\\", `\\`, "\n", `\n`) + quotedEscaper = strings.NewReplacer("\\", `\\`, "\n", `\n`, "\"", `\"`) +) + +func writeEscapedString(w enhancedWriter, v string, includeDoubleQuote bool) (int, error) { + if includeDoubleQuote { + return quotedEscaper.WriteString(w, v) + } else { + return escaper.WriteString(w, v) + } +} + +// writeFloat is equivalent to fmt.Fprint with a float64 argument but hardcodes +// a few common cases for increased efficiency. For non-hardcoded cases, it uses +// strconv.AppendFloat to avoid allocations, similar to writeInt. +func writeFloat(w enhancedWriter, f float64) (int, error) { + switch { + case f == 1: + return 1, w.WriteByte('1') + case f == 0: + return 1, w.WriteByte('0') + case f == -1: + return w.WriteString("-1") + case math.IsNaN(f): + return w.WriteString("NaN") + case math.IsInf(f, +1): + return w.WriteString("+Inf") + case math.IsInf(f, -1): + return w.WriteString("-Inf") + default: + bp := numBufPool.Get().(*[]byte) + *bp = strconv.AppendFloat((*bp)[:0], f, 'g', -1, 64) + written, err := w.Write(*bp) + numBufPool.Put(bp) + return written, err + } +} + +// writeInt is equivalent to fmt.Fprint with an int64 argument but uses +// strconv.AppendInt with a byte slice taken from a sync.Pool to avoid +// allocations. +func writeInt(w enhancedWriter, i int64) (int, error) { + bp := numBufPool.Get().(*[]byte) + *bp = strconv.AppendInt((*bp)[:0], i, 10) + written, err := w.Write(*bp) + numBufPool.Put(bp) + return written, err +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/expfmt/text_parse.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/expfmt/text_parse.go new file mode 100644 index 00000000..ec3d86ba --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/expfmt/text_parse.go @@ -0,0 +1,757 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package expfmt + +import ( + "bufio" + "bytes" + "fmt" + "io" + "math" + "strconv" + "strings" + + dto "github.com/prometheus/client_model/go" + + "github.com/golang/protobuf/proto" + "github.com/prometheus/common/model" +) + +// A stateFn is a function that represents a state in a state machine. By +// executing it, the state is progressed to the next state. The stateFn returns +// another stateFn, which represents the new state. The end state is represented +// by nil. +type stateFn func() stateFn + +// ParseError signals errors while parsing the simple and flat text-based +// exchange format. +type ParseError struct { + Line int + Msg string +} + +// Error implements the error interface. +func (e ParseError) Error() string { + return fmt.Sprintf("text format parsing error in line %d: %s", e.Line, e.Msg) +} + +// TextParser is used to parse the simple and flat text-based exchange format. Its +// zero value is ready to use. +type TextParser struct { + metricFamiliesByName map[string]*dto.MetricFamily + buf *bufio.Reader // Where the parsed input is read through. + err error // Most recent error. + lineCount int // Tracks the line count for error messages. + currentByte byte // The most recent byte read. + currentToken bytes.Buffer // Re-used each time a token has to be gathered from multiple bytes. + currentMF *dto.MetricFamily + currentMetric *dto.Metric + currentLabelPair *dto.LabelPair + + // The remaining member variables are only used for summaries/histograms. + currentLabels map[string]string // All labels including '__name__' but excluding 'quantile'/'le' + // Summary specific. + summaries map[uint64]*dto.Metric // Key is created with LabelsToSignature. + currentQuantile float64 + // Histogram specific. + histograms map[uint64]*dto.Metric // Key is created with LabelsToSignature. + currentBucket float64 + // These tell us if the currently processed line ends on '_count' or + // '_sum' respectively and belong to a summary/histogram, representing the sample + // count and sum of that summary/histogram. + currentIsSummaryCount, currentIsSummarySum bool + currentIsHistogramCount, currentIsHistogramSum bool +} + +// TextToMetricFamilies reads 'in' as the simple and flat text-based exchange +// format and creates MetricFamily proto messages. It returns the MetricFamily +// proto messages in a map where the metric names are the keys, along with any +// error encountered. +// +// If the input contains duplicate metrics (i.e. lines with the same metric name +// and exactly the same label set), the resulting MetricFamily will contain +// duplicate Metric proto messages. Similar is true for duplicate label +// names. Checks for duplicates have to be performed separately, if required. +// Also note that neither the metrics within each MetricFamily are sorted nor +// the label pairs within each Metric. Sorting is not required for the most +// frequent use of this method, which is sample ingestion in the Prometheus +// server. However, for presentation purposes, you might want to sort the +// metrics, and in some cases, you must sort the labels, e.g. for consumption by +// the metric family injection hook of the Prometheus registry. +// +// Summaries and histograms are rather special beasts. You would probably not +// use them in the simple text format anyway. This method can deal with +// summaries and histograms if they are presented in exactly the way the +// text.Create function creates them. +// +// This method must not be called concurrently. If you want to parse different +// input concurrently, instantiate a separate Parser for each goroutine. +func (p *TextParser) TextToMetricFamilies(in io.Reader) (map[string]*dto.MetricFamily, error) { + p.reset(in) + for nextState := p.startOfLine; nextState != nil; nextState = nextState() { + // Magic happens here... + } + // Get rid of empty metric families. + for k, mf := range p.metricFamiliesByName { + if len(mf.GetMetric()) == 0 { + delete(p.metricFamiliesByName, k) + } + } + // If p.err is io.EOF now, we have run into a premature end of the input + // stream. Turn this error into something nicer and more + // meaningful. (io.EOF is often used as a signal for the legitimate end + // of an input stream.) + if p.err == io.EOF { + p.parseError("unexpected end of input stream") + } + return p.metricFamiliesByName, p.err +} + +func (p *TextParser) reset(in io.Reader) { + p.metricFamiliesByName = map[string]*dto.MetricFamily{} + if p.buf == nil { + p.buf = bufio.NewReader(in) + } else { + p.buf.Reset(in) + } + p.err = nil + p.lineCount = 0 + if p.summaries == nil || len(p.summaries) > 0 { + p.summaries = map[uint64]*dto.Metric{} + } + if p.histograms == nil || len(p.histograms) > 0 { + p.histograms = map[uint64]*dto.Metric{} + } + p.currentQuantile = math.NaN() + p.currentBucket = math.NaN() +} + +// startOfLine represents the state where the next byte read from p.buf is the +// start of a line (or whitespace leading up to it). +func (p *TextParser) startOfLine() stateFn { + p.lineCount++ + if p.skipBlankTab(); p.err != nil { + // End of input reached. This is the only case where + // that is not an error but a signal that we are done. + p.err = nil + return nil + } + switch p.currentByte { + case '#': + return p.startComment + case '\n': + return p.startOfLine // Empty line, start the next one. + } + return p.readingMetricName +} + +// startComment represents the state where the next byte read from p.buf is the +// start of a comment (or whitespace leading up to it). +func (p *TextParser) startComment() stateFn { + if p.skipBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + if p.currentByte == '\n' { + return p.startOfLine + } + if p.readTokenUntilWhitespace(); p.err != nil { + return nil // Unexpected end of input. + } + // If we have hit the end of line already, there is nothing left + // to do. This is not considered a syntax error. + if p.currentByte == '\n' { + return p.startOfLine + } + keyword := p.currentToken.String() + if keyword != "HELP" && keyword != "TYPE" { + // Generic comment, ignore by fast forwarding to end of line. + for p.currentByte != '\n' { + if p.currentByte, p.err = p.buf.ReadByte(); p.err != nil { + return nil // Unexpected end of input. + } + } + return p.startOfLine + } + // There is something. Next has to be a metric name. + if p.skipBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + if p.readTokenAsMetricName(); p.err != nil { + return nil // Unexpected end of input. + } + if p.currentByte == '\n' { + // At the end of the line already. + // Again, this is not considered a syntax error. + return p.startOfLine + } + if !isBlankOrTab(p.currentByte) { + p.parseError("invalid metric name in comment") + return nil + } + p.setOrCreateCurrentMF() + if p.skipBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + if p.currentByte == '\n' { + // At the end of the line already. + // Again, this is not considered a syntax error. + return p.startOfLine + } + switch keyword { + case "HELP": + return p.readingHelp + case "TYPE": + return p.readingType + } + panic(fmt.Sprintf("code error: unexpected keyword %q", keyword)) +} + +// readingMetricName represents the state where the last byte read (now in +// p.currentByte) is the first byte of a metric name. +func (p *TextParser) readingMetricName() stateFn { + if p.readTokenAsMetricName(); p.err != nil { + return nil + } + if p.currentToken.Len() == 0 { + p.parseError("invalid metric name") + return nil + } + p.setOrCreateCurrentMF() + // Now is the time to fix the type if it hasn't happened yet. + if p.currentMF.Type == nil { + p.currentMF.Type = dto.MetricType_UNTYPED.Enum() + } + p.currentMetric = &dto.Metric{} + // Do not append the newly created currentMetric to + // currentMF.Metric right now. First wait if this is a summary, + // and the metric exists already, which we can only know after + // having read all the labels. + if p.skipBlankTabIfCurrentBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + return p.readingLabels +} + +// readingLabels represents the state where the last byte read (now in +// p.currentByte) is either the first byte of the label set (i.e. a '{'), or the +// first byte of the value (otherwise). +func (p *TextParser) readingLabels() stateFn { + // Summaries/histograms are special. We have to reset the + // currentLabels map, currentQuantile and currentBucket before starting to + // read labels. + if p.currentMF.GetType() == dto.MetricType_SUMMARY || p.currentMF.GetType() == dto.MetricType_HISTOGRAM { + p.currentLabels = map[string]string{} + p.currentLabels[string(model.MetricNameLabel)] = p.currentMF.GetName() + p.currentQuantile = math.NaN() + p.currentBucket = math.NaN() + } + if p.currentByte != '{' { + return p.readingValue + } + return p.startLabelName +} + +// startLabelName represents the state where the next byte read from p.buf is +// the start of a label name (or whitespace leading up to it). +func (p *TextParser) startLabelName() stateFn { + if p.skipBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + if p.currentByte == '}' { + if p.skipBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + return p.readingValue + } + if p.readTokenAsLabelName(); p.err != nil { + return nil // Unexpected end of input. + } + if p.currentToken.Len() == 0 { + p.parseError(fmt.Sprintf("invalid label name for metric %q", p.currentMF.GetName())) + return nil + } + p.currentLabelPair = &dto.LabelPair{Name: proto.String(p.currentToken.String())} + if p.currentLabelPair.GetName() == string(model.MetricNameLabel) { + p.parseError(fmt.Sprintf("label name %q is reserved", model.MetricNameLabel)) + return nil + } + // Special summary/histogram treatment. Don't add 'quantile' and 'le' + // labels to 'real' labels. + if !(p.currentMF.GetType() == dto.MetricType_SUMMARY && p.currentLabelPair.GetName() == model.QuantileLabel) && + !(p.currentMF.GetType() == dto.MetricType_HISTOGRAM && p.currentLabelPair.GetName() == model.BucketLabel) { + p.currentMetric.Label = append(p.currentMetric.Label, p.currentLabelPair) + } + if p.skipBlankTabIfCurrentBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + if p.currentByte != '=' { + p.parseError(fmt.Sprintf("expected '=' after label name, found %q", p.currentByte)) + return nil + } + return p.startLabelValue +} + +// startLabelValue represents the state where the next byte read from p.buf is +// the start of a (quoted) label value (or whitespace leading up to it). +func (p *TextParser) startLabelValue() stateFn { + if p.skipBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + if p.currentByte != '"' { + p.parseError(fmt.Sprintf("expected '\"' at start of label value, found %q", p.currentByte)) + return nil + } + if p.readTokenAsLabelValue(); p.err != nil { + return nil + } + if !model.LabelValue(p.currentToken.String()).IsValid() { + p.parseError(fmt.Sprintf("invalid label value %q", p.currentToken.String())) + return nil + } + p.currentLabelPair.Value = proto.String(p.currentToken.String()) + // Special treatment of summaries: + // - Quantile labels are special, will result in dto.Quantile later. + // - Other labels have to be added to currentLabels for signature calculation. + if p.currentMF.GetType() == dto.MetricType_SUMMARY { + if p.currentLabelPair.GetName() == model.QuantileLabel { + if p.currentQuantile, p.err = strconv.ParseFloat(p.currentLabelPair.GetValue(), 64); p.err != nil { + // Create a more helpful error message. + p.parseError(fmt.Sprintf("expected float as value for 'quantile' label, got %q", p.currentLabelPair.GetValue())) + return nil + } + } else { + p.currentLabels[p.currentLabelPair.GetName()] = p.currentLabelPair.GetValue() + } + } + // Similar special treatment of histograms. + if p.currentMF.GetType() == dto.MetricType_HISTOGRAM { + if p.currentLabelPair.GetName() == model.BucketLabel { + if p.currentBucket, p.err = strconv.ParseFloat(p.currentLabelPair.GetValue(), 64); p.err != nil { + // Create a more helpful error message. + p.parseError(fmt.Sprintf("expected float as value for 'le' label, got %q", p.currentLabelPair.GetValue())) + return nil + } + } else { + p.currentLabels[p.currentLabelPair.GetName()] = p.currentLabelPair.GetValue() + } + } + if p.skipBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + switch p.currentByte { + case ',': + return p.startLabelName + + case '}': + if p.skipBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + return p.readingValue + default: + p.parseError(fmt.Sprintf("unexpected end of label value %q", p.currentLabelPair.GetValue())) + return nil + } +} + +// readingValue represents the state where the last byte read (now in +// p.currentByte) is the first byte of the sample value (i.e. a float). +func (p *TextParser) readingValue() stateFn { + // When we are here, we have read all the labels, so for the + // special case of a summary/histogram, we can finally find out + // if the metric already exists. + if p.currentMF.GetType() == dto.MetricType_SUMMARY { + signature := model.LabelsToSignature(p.currentLabels) + if summary := p.summaries[signature]; summary != nil { + p.currentMetric = summary + } else { + p.summaries[signature] = p.currentMetric + p.currentMF.Metric = append(p.currentMF.Metric, p.currentMetric) + } + } else if p.currentMF.GetType() == dto.MetricType_HISTOGRAM { + signature := model.LabelsToSignature(p.currentLabels) + if histogram := p.histograms[signature]; histogram != nil { + p.currentMetric = histogram + } else { + p.histograms[signature] = p.currentMetric + p.currentMF.Metric = append(p.currentMF.Metric, p.currentMetric) + } + } else { + p.currentMF.Metric = append(p.currentMF.Metric, p.currentMetric) + } + if p.readTokenUntilWhitespace(); p.err != nil { + return nil // Unexpected end of input. + } + value, err := strconv.ParseFloat(p.currentToken.String(), 64) + if err != nil { + // Create a more helpful error message. + p.parseError(fmt.Sprintf("expected float as value, got %q", p.currentToken.String())) + return nil + } + switch p.currentMF.GetType() { + case dto.MetricType_COUNTER: + p.currentMetric.Counter = &dto.Counter{Value: proto.Float64(value)} + case dto.MetricType_GAUGE: + p.currentMetric.Gauge = &dto.Gauge{Value: proto.Float64(value)} + case dto.MetricType_UNTYPED: + p.currentMetric.Untyped = &dto.Untyped{Value: proto.Float64(value)} + case dto.MetricType_SUMMARY: + // *sigh* + if p.currentMetric.Summary == nil { + p.currentMetric.Summary = &dto.Summary{} + } + switch { + case p.currentIsSummaryCount: + p.currentMetric.Summary.SampleCount = proto.Uint64(uint64(value)) + case p.currentIsSummarySum: + p.currentMetric.Summary.SampleSum = proto.Float64(value) + case !math.IsNaN(p.currentQuantile): + p.currentMetric.Summary.Quantile = append( + p.currentMetric.Summary.Quantile, + &dto.Quantile{ + Quantile: proto.Float64(p.currentQuantile), + Value: proto.Float64(value), + }, + ) + } + case dto.MetricType_HISTOGRAM: + // *sigh* + if p.currentMetric.Histogram == nil { + p.currentMetric.Histogram = &dto.Histogram{} + } + switch { + case p.currentIsHistogramCount: + p.currentMetric.Histogram.SampleCount = proto.Uint64(uint64(value)) + case p.currentIsHistogramSum: + p.currentMetric.Histogram.SampleSum = proto.Float64(value) + case !math.IsNaN(p.currentBucket): + p.currentMetric.Histogram.Bucket = append( + p.currentMetric.Histogram.Bucket, + &dto.Bucket{ + UpperBound: proto.Float64(p.currentBucket), + CumulativeCount: proto.Uint64(uint64(value)), + }, + ) + } + default: + p.err = fmt.Errorf("unexpected type for metric name %q", p.currentMF.GetName()) + } + if p.currentByte == '\n' { + return p.startOfLine + } + return p.startTimestamp +} + +// startTimestamp represents the state where the next byte read from p.buf is +// the start of the timestamp (or whitespace leading up to it). +func (p *TextParser) startTimestamp() stateFn { + if p.skipBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + if p.readTokenUntilWhitespace(); p.err != nil { + return nil // Unexpected end of input. + } + timestamp, err := strconv.ParseInt(p.currentToken.String(), 10, 64) + if err != nil { + // Create a more helpful error message. + p.parseError(fmt.Sprintf("expected integer as timestamp, got %q", p.currentToken.String())) + return nil + } + p.currentMetric.TimestampMs = proto.Int64(timestamp) + if p.readTokenUntilNewline(false); p.err != nil { + return nil // Unexpected end of input. + } + if p.currentToken.Len() > 0 { + p.parseError(fmt.Sprintf("spurious string after timestamp: %q", p.currentToken.String())) + return nil + } + return p.startOfLine +} + +// readingHelp represents the state where the last byte read (now in +// p.currentByte) is the first byte of the docstring after 'HELP'. +func (p *TextParser) readingHelp() stateFn { + if p.currentMF.Help != nil { + p.parseError(fmt.Sprintf("second HELP line for metric name %q", p.currentMF.GetName())) + return nil + } + // Rest of line is the docstring. + if p.readTokenUntilNewline(true); p.err != nil { + return nil // Unexpected end of input. + } + p.currentMF.Help = proto.String(p.currentToken.String()) + return p.startOfLine +} + +// readingType represents the state where the last byte read (now in +// p.currentByte) is the first byte of the type hint after 'HELP'. +func (p *TextParser) readingType() stateFn { + if p.currentMF.Type != nil { + p.parseError(fmt.Sprintf("second TYPE line for metric name %q, or TYPE reported after samples", p.currentMF.GetName())) + return nil + } + // Rest of line is the type. + if p.readTokenUntilNewline(false); p.err != nil { + return nil // Unexpected end of input. + } + metricType, ok := dto.MetricType_value[strings.ToUpper(p.currentToken.String())] + if !ok { + p.parseError(fmt.Sprintf("unknown metric type %q", p.currentToken.String())) + return nil + } + p.currentMF.Type = dto.MetricType(metricType).Enum() + return p.startOfLine +} + +// parseError sets p.err to a ParseError at the current line with the given +// message. +func (p *TextParser) parseError(msg string) { + p.err = ParseError{ + Line: p.lineCount, + Msg: msg, + } +} + +// skipBlankTab reads (and discards) bytes from p.buf until it encounters a byte +// that is neither ' ' nor '\t'. That byte is left in p.currentByte. +func (p *TextParser) skipBlankTab() { + for { + if p.currentByte, p.err = p.buf.ReadByte(); p.err != nil || !isBlankOrTab(p.currentByte) { + return + } + } +} + +// skipBlankTabIfCurrentBlankTab works exactly as skipBlankTab but doesn't do +// anything if p.currentByte is neither ' ' nor '\t'. +func (p *TextParser) skipBlankTabIfCurrentBlankTab() { + if isBlankOrTab(p.currentByte) { + p.skipBlankTab() + } +} + +// readTokenUntilWhitespace copies bytes from p.buf into p.currentToken. The +// first byte considered is the byte already read (now in p.currentByte). The +// first whitespace byte encountered is still copied into p.currentByte, but not +// into p.currentToken. +func (p *TextParser) readTokenUntilWhitespace() { + p.currentToken.Reset() + for p.err == nil && !isBlankOrTab(p.currentByte) && p.currentByte != '\n' { + p.currentToken.WriteByte(p.currentByte) + p.currentByte, p.err = p.buf.ReadByte() + } +} + +// readTokenUntilNewline copies bytes from p.buf into p.currentToken. The first +// byte considered is the byte already read (now in p.currentByte). The first +// newline byte encountered is still copied into p.currentByte, but not into +// p.currentToken. If recognizeEscapeSequence is true, two escape sequences are +// recognized: '\\' translates into '\', and '\n' into a line-feed character. +// All other escape sequences are invalid and cause an error. +func (p *TextParser) readTokenUntilNewline(recognizeEscapeSequence bool) { + p.currentToken.Reset() + escaped := false + for p.err == nil { + if recognizeEscapeSequence && escaped { + switch p.currentByte { + case '\\': + p.currentToken.WriteByte(p.currentByte) + case 'n': + p.currentToken.WriteByte('\n') + default: + p.parseError(fmt.Sprintf("invalid escape sequence '\\%c'", p.currentByte)) + return + } + escaped = false + } else { + switch p.currentByte { + case '\n': + return + case '\\': + escaped = true + default: + p.currentToken.WriteByte(p.currentByte) + } + } + p.currentByte, p.err = p.buf.ReadByte() + } +} + +// readTokenAsMetricName copies a metric name from p.buf into p.currentToken. +// The first byte considered is the byte already read (now in p.currentByte). +// The first byte not part of a metric name is still copied into p.currentByte, +// but not into p.currentToken. +func (p *TextParser) readTokenAsMetricName() { + p.currentToken.Reset() + if !isValidMetricNameStart(p.currentByte) { + return + } + for { + p.currentToken.WriteByte(p.currentByte) + p.currentByte, p.err = p.buf.ReadByte() + if p.err != nil || !isValidMetricNameContinuation(p.currentByte) { + return + } + } +} + +// readTokenAsLabelName copies a label name from p.buf into p.currentToken. +// The first byte considered is the byte already read (now in p.currentByte). +// The first byte not part of a label name is still copied into p.currentByte, +// but not into p.currentToken. +func (p *TextParser) readTokenAsLabelName() { + p.currentToken.Reset() + if !isValidLabelNameStart(p.currentByte) { + return + } + for { + p.currentToken.WriteByte(p.currentByte) + p.currentByte, p.err = p.buf.ReadByte() + if p.err != nil || !isValidLabelNameContinuation(p.currentByte) { + return + } + } +} + +// readTokenAsLabelValue copies a label value from p.buf into p.currentToken. +// In contrast to the other 'readTokenAs...' functions, which start with the +// last read byte in p.currentByte, this method ignores p.currentByte and starts +// with reading a new byte from p.buf. The first byte not part of a label value +// is still copied into p.currentByte, but not into p.currentToken. +func (p *TextParser) readTokenAsLabelValue() { + p.currentToken.Reset() + escaped := false + for { + if p.currentByte, p.err = p.buf.ReadByte(); p.err != nil { + return + } + if escaped { + switch p.currentByte { + case '"', '\\': + p.currentToken.WriteByte(p.currentByte) + case 'n': + p.currentToken.WriteByte('\n') + default: + p.parseError(fmt.Sprintf("invalid escape sequence '\\%c'", p.currentByte)) + return + } + escaped = false + continue + } + switch p.currentByte { + case '"': + return + case '\n': + p.parseError(fmt.Sprintf("label value %q contains unescaped new-line", p.currentToken.String())) + return + case '\\': + escaped = true + default: + p.currentToken.WriteByte(p.currentByte) + } + } +} + +func (p *TextParser) setOrCreateCurrentMF() { + p.currentIsSummaryCount = false + p.currentIsSummarySum = false + p.currentIsHistogramCount = false + p.currentIsHistogramSum = false + name := p.currentToken.String() + if p.currentMF = p.metricFamiliesByName[name]; p.currentMF != nil { + return + } + // Try out if this is a _sum or _count for a summary/histogram. + summaryName := summaryMetricName(name) + if p.currentMF = p.metricFamiliesByName[summaryName]; p.currentMF != nil { + if p.currentMF.GetType() == dto.MetricType_SUMMARY { + if isCount(name) { + p.currentIsSummaryCount = true + } + if isSum(name) { + p.currentIsSummarySum = true + } + return + } + } + histogramName := histogramMetricName(name) + if p.currentMF = p.metricFamiliesByName[histogramName]; p.currentMF != nil { + if p.currentMF.GetType() == dto.MetricType_HISTOGRAM { + if isCount(name) { + p.currentIsHistogramCount = true + } + if isSum(name) { + p.currentIsHistogramSum = true + } + return + } + } + p.currentMF = &dto.MetricFamily{Name: proto.String(name)} + p.metricFamiliesByName[name] = p.currentMF +} + +func isValidLabelNameStart(b byte) bool { + return (b >= 'a' && b <= 'z') || (b >= 'A' && b <= 'Z') || b == '_' +} + +func isValidLabelNameContinuation(b byte) bool { + return isValidLabelNameStart(b) || (b >= '0' && b <= '9') +} + +func isValidMetricNameStart(b byte) bool { + return isValidLabelNameStart(b) || b == ':' +} + +func isValidMetricNameContinuation(b byte) bool { + return isValidLabelNameContinuation(b) || b == ':' +} + +func isBlankOrTab(b byte) bool { + return b == ' ' || b == '\t' +} + +func isCount(name string) bool { + return len(name) > 6 && name[len(name)-6:] == "_count" +} + +func isSum(name string) bool { + return len(name) > 4 && name[len(name)-4:] == "_sum" +} + +func isBucket(name string) bool { + return len(name) > 7 && name[len(name)-7:] == "_bucket" +} + +func summaryMetricName(name string) string { + switch { + case isCount(name): + return name[:len(name)-6] + case isSum(name): + return name[:len(name)-4] + default: + return name + } +} + +func histogramMetricName(name string) string { + switch { + case isCount(name): + return name[:len(name)-6] + case isSum(name): + return name[:len(name)-4] + case isBucket(name): + return name[:len(name)-7] + default: + return name + } +} diff --git a/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/README.txt b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/README.txt similarity index 100% rename from vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/README.txt rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/README.txt diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/autoneg.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/autoneg.go new file mode 100644 index 00000000..648b38cb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/autoneg.go @@ -0,0 +1,162 @@ +/* +HTTP Content-Type Autonegotiation. + +The functions in this package implement the behaviour specified in +http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html + +Copyright (c) 2011, Open Knowledge Foundation Ltd. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + Neither the name of the Open Knowledge Foundation Ltd. nor the + names of its contributors may be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +*/ +package goautoneg + +import ( + "sort" + "strconv" + "strings" +) + +// Structure to represent a clause in an HTTP Accept Header +type Accept struct { + Type, SubType string + Q float64 + Params map[string]string +} + +// For internal use, so that we can use the sort interface +type accept_slice []Accept + +func (accept accept_slice) Len() int { + slice := []Accept(accept) + return len(slice) +} + +func (accept accept_slice) Less(i, j int) bool { + slice := []Accept(accept) + ai, aj := slice[i], slice[j] + if ai.Q > aj.Q { + return true + } + if ai.Type != "*" && aj.Type == "*" { + return true + } + if ai.SubType != "*" && aj.SubType == "*" { + return true + } + return false +} + +func (accept accept_slice) Swap(i, j int) { + slice := []Accept(accept) + slice[i], slice[j] = slice[j], slice[i] +} + +// Parse an Accept Header string returning a sorted list +// of clauses +func ParseAccept(header string) (accept []Accept) { + parts := strings.Split(header, ",") + accept = make([]Accept, 0, len(parts)) + for _, part := range parts { + part := strings.Trim(part, " ") + + a := Accept{} + a.Params = make(map[string]string) + a.Q = 1.0 + + mrp := strings.Split(part, ";") + + media_range := mrp[0] + sp := strings.Split(media_range, "/") + a.Type = strings.Trim(sp[0], " ") + + switch { + case len(sp) == 1 && a.Type == "*": + a.SubType = "*" + case len(sp) == 2: + a.SubType = strings.Trim(sp[1], " ") + default: + continue + } + + if len(mrp) == 1 { + accept = append(accept, a) + continue + } + + for _, param := range mrp[1:] { + sp := strings.SplitN(param, "=", 2) + if len(sp) != 2 { + continue + } + token := strings.Trim(sp[0], " ") + if token == "q" { + a.Q, _ = strconv.ParseFloat(sp[1], 32) + } else { + a.Params[token] = strings.Trim(sp[1], " ") + } + } + + accept = append(accept, a) + } + + slice := accept_slice(accept) + sort.Sort(slice) + + return +} + +// Negotiate the most appropriate content_type given the accept header +// and a list of alternatives. +func Negotiate(header string, alternatives []string) (content_type string) { + asp := make([][]string, 0, len(alternatives)) + for _, ctype := range alternatives { + asp = append(asp, strings.SplitN(ctype, "/", 2)) + } + for _, clause := range ParseAccept(header) { + for i, ctsp := range asp { + if clause.Type == ctsp[0] && clause.SubType == ctsp[1] { + content_type = alternatives[i] + return + } + if clause.Type == ctsp[0] && clause.SubType == "*" { + content_type = alternatives[i] + return + } + if clause.Type == "*" && clause.SubType == "*" { + content_type = alternatives[i] + return + } + } + } + return +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/model/alert.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/model/alert.go new file mode 100644 index 00000000..35e739c7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/model/alert.go @@ -0,0 +1,136 @@ +// Copyright 2013 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +import ( + "fmt" + "time" +) + +type AlertStatus string + +const ( + AlertFiring AlertStatus = "firing" + AlertResolved AlertStatus = "resolved" +) + +// Alert is a generic representation of an alert in the Prometheus eco-system. +type Alert struct { + // Label value pairs for purpose of aggregation, matching, and disposition + // dispatching. This must minimally include an "alertname" label. + Labels LabelSet `json:"labels"` + + // Extra key/value information which does not define alert identity. + Annotations LabelSet `json:"annotations"` + + // The known time range for this alert. Both ends are optional. + StartsAt time.Time `json:"startsAt,omitempty"` + EndsAt time.Time `json:"endsAt,omitempty"` + GeneratorURL string `json:"generatorURL"` +} + +// Name returns the name of the alert. It is equivalent to the "alertname" label. +func (a *Alert) Name() string { + return string(a.Labels[AlertNameLabel]) +} + +// Fingerprint returns a unique hash for the alert. It is equivalent to +// the fingerprint of the alert's label set. +func (a *Alert) Fingerprint() Fingerprint { + return a.Labels.Fingerprint() +} + +func (a *Alert) String() string { + s := fmt.Sprintf("%s[%s]", a.Name(), a.Fingerprint().String()[:7]) + if a.Resolved() { + return s + "[resolved]" + } + return s + "[active]" +} + +// Resolved returns true iff the activity interval ended in the past. +func (a *Alert) Resolved() bool { + return a.ResolvedAt(time.Now()) +} + +// ResolvedAt returns true off the activity interval ended before +// the given timestamp. +func (a *Alert) ResolvedAt(ts time.Time) bool { + if a.EndsAt.IsZero() { + return false + } + return !a.EndsAt.After(ts) +} + +// Status returns the status of the alert. +func (a *Alert) Status() AlertStatus { + if a.Resolved() { + return AlertResolved + } + return AlertFiring +} + +// Validate checks whether the alert data is inconsistent. +func (a *Alert) Validate() error { + if a.StartsAt.IsZero() { + return fmt.Errorf("start time missing") + } + if !a.EndsAt.IsZero() && a.EndsAt.Before(a.StartsAt) { + return fmt.Errorf("start time must be before end time") + } + if err := a.Labels.Validate(); err != nil { + return fmt.Errorf("invalid label set: %s", err) + } + if len(a.Labels) == 0 { + return fmt.Errorf("at least one label pair required") + } + if err := a.Annotations.Validate(); err != nil { + return fmt.Errorf("invalid annotations: %s", err) + } + return nil +} + +// Alert is a list of alerts that can be sorted in chronological order. +type Alerts []*Alert + +func (as Alerts) Len() int { return len(as) } +func (as Alerts) Swap(i, j int) { as[i], as[j] = as[j], as[i] } + +func (as Alerts) Less(i, j int) bool { + if as[i].StartsAt.Before(as[j].StartsAt) { + return true + } + if as[i].EndsAt.Before(as[j].EndsAt) { + return true + } + return as[i].Fingerprint() < as[j].Fingerprint() +} + +// HasFiring returns true iff one of the alerts is not resolved. +func (as Alerts) HasFiring() bool { + for _, a := range as { + if !a.Resolved() { + return true + } + } + return false +} + +// Status returns StatusFiring iff at least one of the alerts is firing. +func (as Alerts) Status() AlertStatus { + if as.HasFiring() { + return AlertFiring + } + return AlertResolved +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/model/fingerprinting.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/model/fingerprinting.go new file mode 100644 index 00000000..fc4de410 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/model/fingerprinting.go @@ -0,0 +1,105 @@ +// Copyright 2013 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +import ( + "fmt" + "strconv" +) + +// Fingerprint provides a hash-capable representation of a Metric. +// For our purposes, FNV-1A 64-bit is used. +type Fingerprint uint64 + +// FingerprintFromString transforms a string representation into a Fingerprint. +func FingerprintFromString(s string) (Fingerprint, error) { + num, err := strconv.ParseUint(s, 16, 64) + return Fingerprint(num), err +} + +// ParseFingerprint parses the input string into a fingerprint. +func ParseFingerprint(s string) (Fingerprint, error) { + num, err := strconv.ParseUint(s, 16, 64) + if err != nil { + return 0, err + } + return Fingerprint(num), nil +} + +func (f Fingerprint) String() string { + return fmt.Sprintf("%016x", uint64(f)) +} + +// Fingerprints represents a collection of Fingerprint subject to a given +// natural sorting scheme. It implements sort.Interface. +type Fingerprints []Fingerprint + +// Len implements sort.Interface. +func (f Fingerprints) Len() int { + return len(f) +} + +// Less implements sort.Interface. +func (f Fingerprints) Less(i, j int) bool { + return f[i] < f[j] +} + +// Swap implements sort.Interface. +func (f Fingerprints) Swap(i, j int) { + f[i], f[j] = f[j], f[i] +} + +// FingerprintSet is a set of Fingerprints. +type FingerprintSet map[Fingerprint]struct{} + +// Equal returns true if both sets contain the same elements (and not more). +func (s FingerprintSet) Equal(o FingerprintSet) bool { + if len(s) != len(o) { + return false + } + + for k := range s { + if _, ok := o[k]; !ok { + return false + } + } + + return true +} + +// Intersection returns the elements contained in both sets. +func (s FingerprintSet) Intersection(o FingerprintSet) FingerprintSet { + myLength, otherLength := len(s), len(o) + if myLength == 0 || otherLength == 0 { + return FingerprintSet{} + } + + subSet := s + superSet := o + + if otherLength < myLength { + subSet = o + superSet = s + } + + out := FingerprintSet{} + + for k := range subSet { + if _, ok := superSet[k]; ok { + out[k] = struct{}{} + } + } + + return out +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/model/fnv.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/model/fnv.go new file mode 100644 index 00000000..038fc1c9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/model/fnv.go @@ -0,0 +1,42 @@ +// Copyright 2015 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +// Inline and byte-free variant of hash/fnv's fnv64a. + +const ( + offset64 = 14695981039346656037 + prime64 = 1099511628211 +) + +// hashNew initializies a new fnv64a hash value. +func hashNew() uint64 { + return offset64 +} + +// hashAdd adds a string to a fnv64a hash value, returning the updated hash. +func hashAdd(h uint64, s string) uint64 { + for i := 0; i < len(s); i++ { + h ^= uint64(s[i]) + h *= prime64 + } + return h +} + +// hashAddByte adds a byte to a fnv64a hash value, returning the updated hash. +func hashAddByte(h uint64, b byte) uint64 { + h ^= uint64(b) + h *= prime64 + return h +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/model/labels.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/model/labels.go new file mode 100644 index 00000000..41051a01 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/model/labels.go @@ -0,0 +1,210 @@ +// Copyright 2013 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +import ( + "encoding/json" + "fmt" + "regexp" + "strings" + "unicode/utf8" +) + +const ( + // AlertNameLabel is the name of the label containing the an alert's name. + AlertNameLabel = "alertname" + + // ExportedLabelPrefix is the prefix to prepend to the label names present in + // exported metrics if a label of the same name is added by the server. + ExportedLabelPrefix = "exported_" + + // MetricNameLabel is the label name indicating the metric name of a + // timeseries. + MetricNameLabel = "__name__" + + // SchemeLabel is the name of the label that holds the scheme on which to + // scrape a target. + SchemeLabel = "__scheme__" + + // AddressLabel is the name of the label that holds the address of + // a scrape target. + AddressLabel = "__address__" + + // MetricsPathLabel is the name of the label that holds the path on which to + // scrape a target. + MetricsPathLabel = "__metrics_path__" + + // ReservedLabelPrefix is a prefix which is not legal in user-supplied + // label names. + ReservedLabelPrefix = "__" + + // MetaLabelPrefix is a prefix for labels that provide meta information. + // Labels with this prefix are used for intermediate label processing and + // will not be attached to time series. + MetaLabelPrefix = "__meta_" + + // TmpLabelPrefix is a prefix for temporary labels as part of relabelling. + // Labels with this prefix are used for intermediate label processing and + // will not be attached to time series. This is reserved for use in + // Prometheus configuration files by users. + TmpLabelPrefix = "__tmp_" + + // ParamLabelPrefix is a prefix for labels that provide URL parameters + // used to scrape a target. + ParamLabelPrefix = "__param_" + + // JobLabel is the label name indicating the job from which a timeseries + // was scraped. + JobLabel = "job" + + // InstanceLabel is the label name used for the instance label. + InstanceLabel = "instance" + + // BucketLabel is used for the label that defines the upper bound of a + // bucket of a histogram ("le" -> "less or equal"). + BucketLabel = "le" + + // QuantileLabel is used for the label that defines the quantile in a + // summary. + QuantileLabel = "quantile" +) + +// LabelNameRE is a regular expression matching valid label names. Note that the +// IsValid method of LabelName performs the same check but faster than a match +// with this regular expression. +var LabelNameRE = regexp.MustCompile("^[a-zA-Z_][a-zA-Z0-9_]*$") + +// A LabelName is a key for a LabelSet or Metric. It has a value associated +// therewith. +type LabelName string + +// IsValid is true iff the label name matches the pattern of LabelNameRE. This +// method, however, does not use LabelNameRE for the check but a much faster +// hardcoded implementation. +func (ln LabelName) IsValid() bool { + if len(ln) == 0 { + return false + } + for i, b := range ln { + if !((b >= 'a' && b <= 'z') || (b >= 'A' && b <= 'Z') || b == '_' || (b >= '0' && b <= '9' && i > 0)) { + return false + } + } + return true +} + +// UnmarshalYAML implements the yaml.Unmarshaler interface. +func (ln *LabelName) UnmarshalYAML(unmarshal func(interface{}) error) error { + var s string + if err := unmarshal(&s); err != nil { + return err + } + if !LabelName(s).IsValid() { + return fmt.Errorf("%q is not a valid label name", s) + } + *ln = LabelName(s) + return nil +} + +// UnmarshalJSON implements the json.Unmarshaler interface. +func (ln *LabelName) UnmarshalJSON(b []byte) error { + var s string + if err := json.Unmarshal(b, &s); err != nil { + return err + } + if !LabelName(s).IsValid() { + return fmt.Errorf("%q is not a valid label name", s) + } + *ln = LabelName(s) + return nil +} + +// LabelNames is a sortable LabelName slice. In implements sort.Interface. +type LabelNames []LabelName + +func (l LabelNames) Len() int { + return len(l) +} + +func (l LabelNames) Less(i, j int) bool { + return l[i] < l[j] +} + +func (l LabelNames) Swap(i, j int) { + l[i], l[j] = l[j], l[i] +} + +func (l LabelNames) String() string { + labelStrings := make([]string, 0, len(l)) + for _, label := range l { + labelStrings = append(labelStrings, string(label)) + } + return strings.Join(labelStrings, ", ") +} + +// A LabelValue is an associated value for a LabelName. +type LabelValue string + +// IsValid returns true iff the string is a valid UTF8. +func (lv LabelValue) IsValid() bool { + return utf8.ValidString(string(lv)) +} + +// LabelValues is a sortable LabelValue slice. It implements sort.Interface. +type LabelValues []LabelValue + +func (l LabelValues) Len() int { + return len(l) +} + +func (l LabelValues) Less(i, j int) bool { + return string(l[i]) < string(l[j]) +} + +func (l LabelValues) Swap(i, j int) { + l[i], l[j] = l[j], l[i] +} + +// LabelPair pairs a name with a value. +type LabelPair struct { + Name LabelName + Value LabelValue +} + +// LabelPairs is a sortable slice of LabelPair pointers. It implements +// sort.Interface. +type LabelPairs []*LabelPair + +func (l LabelPairs) Len() int { + return len(l) +} + +func (l LabelPairs) Less(i, j int) bool { + switch { + case l[i].Name > l[j].Name: + return false + case l[i].Name < l[j].Name: + return true + case l[i].Value > l[j].Value: + return false + case l[i].Value < l[j].Value: + return true + default: + return false + } +} + +func (l LabelPairs) Swap(i, j int) { + l[i], l[j] = l[j], l[i] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/model/labelset.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/model/labelset.go new file mode 100644 index 00000000..6eda08a7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/model/labelset.go @@ -0,0 +1,169 @@ +// Copyright 2013 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +import ( + "encoding/json" + "fmt" + "sort" + "strings" +) + +// A LabelSet is a collection of LabelName and LabelValue pairs. The LabelSet +// may be fully-qualified down to the point where it may resolve to a single +// Metric in the data store or not. All operations that occur within the realm +// of a LabelSet can emit a vector of Metric entities to which the LabelSet may +// match. +type LabelSet map[LabelName]LabelValue + +// Validate checks whether all names and values in the label set +// are valid. +func (ls LabelSet) Validate() error { + for ln, lv := range ls { + if !ln.IsValid() { + return fmt.Errorf("invalid name %q", ln) + } + if !lv.IsValid() { + return fmt.Errorf("invalid value %q", lv) + } + } + return nil +} + +// Equal returns true iff both label sets have exactly the same key/value pairs. +func (ls LabelSet) Equal(o LabelSet) bool { + if len(ls) != len(o) { + return false + } + for ln, lv := range ls { + olv, ok := o[ln] + if !ok { + return false + } + if olv != lv { + return false + } + } + return true +} + +// Before compares the metrics, using the following criteria: +// +// If m has fewer labels than o, it is before o. If it has more, it is not. +// +// If the number of labels is the same, the superset of all label names is +// sorted alphanumerically. The first differing label pair found in that order +// determines the outcome: If the label does not exist at all in m, then m is +// before o, and vice versa. Otherwise the label value is compared +// alphanumerically. +// +// If m and o are equal, the method returns false. +func (ls LabelSet) Before(o LabelSet) bool { + if len(ls) < len(o) { + return true + } + if len(ls) > len(o) { + return false + } + + lns := make(LabelNames, 0, len(ls)+len(o)) + for ln := range ls { + lns = append(lns, ln) + } + for ln := range o { + lns = append(lns, ln) + } + // It's probably not worth it to de-dup lns. + sort.Sort(lns) + for _, ln := range lns { + mlv, ok := ls[ln] + if !ok { + return true + } + olv, ok := o[ln] + if !ok { + return false + } + if mlv < olv { + return true + } + if mlv > olv { + return false + } + } + return false +} + +// Clone returns a copy of the label set. +func (ls LabelSet) Clone() LabelSet { + lsn := make(LabelSet, len(ls)) + for ln, lv := range ls { + lsn[ln] = lv + } + return lsn +} + +// Merge is a helper function to non-destructively merge two label sets. +func (l LabelSet) Merge(other LabelSet) LabelSet { + result := make(LabelSet, len(l)) + + for k, v := range l { + result[k] = v + } + + for k, v := range other { + result[k] = v + } + + return result +} + +func (l LabelSet) String() string { + lstrs := make([]string, 0, len(l)) + for l, v := range l { + lstrs = append(lstrs, fmt.Sprintf("%s=%q", l, v)) + } + + sort.Strings(lstrs) + return fmt.Sprintf("{%s}", strings.Join(lstrs, ", ")) +} + +// Fingerprint returns the LabelSet's fingerprint. +func (ls LabelSet) Fingerprint() Fingerprint { + return labelSetToFingerprint(ls) +} + +// FastFingerprint returns the LabelSet's Fingerprint calculated by a faster hashing +// algorithm, which is, however, more susceptible to hash collisions. +func (ls LabelSet) FastFingerprint() Fingerprint { + return labelSetToFastFingerprint(ls) +} + +// UnmarshalJSON implements the json.Unmarshaler interface. +func (l *LabelSet) UnmarshalJSON(b []byte) error { + var m map[LabelName]LabelValue + if err := json.Unmarshal(b, &m); err != nil { + return err + } + // encoding/json only unmarshals maps of the form map[string]T. It treats + // LabelName as a string and does not call its UnmarshalJSON method. + // Thus, we have to replicate the behavior here. + for ln := range m { + if !ln.IsValid() { + return fmt.Errorf("%q is not a valid label name", ln) + } + } + *l = LabelSet(m) + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/model/metric.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/model/metric.go new file mode 100644 index 00000000..f7250909 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/model/metric.go @@ -0,0 +1,103 @@ +// Copyright 2013 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +import ( + "fmt" + "regexp" + "sort" + "strings" +) + +var ( + separator = []byte{0} + // MetricNameRE is a regular expression matching valid metric + // names. Note that the IsValidMetricName function performs the same + // check but faster than a match with this regular expression. + MetricNameRE = regexp.MustCompile(`^[a-zA-Z_:][a-zA-Z0-9_:]*$`) +) + +// A Metric is similar to a LabelSet, but the key difference is that a Metric is +// a singleton and refers to one and only one stream of samples. +type Metric LabelSet + +// Equal compares the metrics. +func (m Metric) Equal(o Metric) bool { + return LabelSet(m).Equal(LabelSet(o)) +} + +// Before compares the metrics' underlying label sets. +func (m Metric) Before(o Metric) bool { + return LabelSet(m).Before(LabelSet(o)) +} + +// Clone returns a copy of the Metric. +func (m Metric) Clone() Metric { + clone := make(Metric, len(m)) + for k, v := range m { + clone[k] = v + } + return clone +} + +func (m Metric) String() string { + metricName, hasName := m[MetricNameLabel] + numLabels := len(m) - 1 + if !hasName { + numLabels = len(m) + } + labelStrings := make([]string, 0, numLabels) + for label, value := range m { + if label != MetricNameLabel { + labelStrings = append(labelStrings, fmt.Sprintf("%s=%q", label, value)) + } + } + + switch numLabels { + case 0: + if hasName { + return string(metricName) + } + return "{}" + default: + sort.Strings(labelStrings) + return fmt.Sprintf("%s{%s}", metricName, strings.Join(labelStrings, ", ")) + } +} + +// Fingerprint returns a Metric's Fingerprint. +func (m Metric) Fingerprint() Fingerprint { + return LabelSet(m).Fingerprint() +} + +// FastFingerprint returns a Metric's Fingerprint calculated by a faster hashing +// algorithm, which is, however, more susceptible to hash collisions. +func (m Metric) FastFingerprint() Fingerprint { + return LabelSet(m).FastFingerprint() +} + +// IsValidMetricName returns true iff name matches the pattern of MetricNameRE. +// This function, however, does not use MetricNameRE for the check but a much +// faster hardcoded implementation. +func IsValidMetricName(n LabelValue) bool { + if len(n) == 0 { + return false + } + for i, b := range n { + if !((b >= 'a' && b <= 'z') || (b >= 'A' && b <= 'Z') || b == '_' || b == ':' || (b >= '0' && b <= '9' && i > 0)) { + return false + } + } + return true +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/model/model.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/model/model.go new file mode 100644 index 00000000..a7b96917 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/model/model.go @@ -0,0 +1,16 @@ +// Copyright 2013 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package model contains common data structures that are shared across +// Prometheus components and libraries. +package model diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/model/signature.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/model/signature.go new file mode 100644 index 00000000..8762b13c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/model/signature.go @@ -0,0 +1,144 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +import ( + "sort" +) + +// SeparatorByte is a byte that cannot occur in valid UTF-8 sequences and is +// used to separate label names, label values, and other strings from each other +// when calculating their combined hash value (aka signature aka fingerprint). +const SeparatorByte byte = 255 + +var ( + // cache the signature of an empty label set. + emptyLabelSignature = hashNew() +) + +// LabelsToSignature returns a quasi-unique signature (i.e., fingerprint) for a +// given label set. (Collisions are possible but unlikely if the number of label +// sets the function is applied to is small.) +func LabelsToSignature(labels map[string]string) uint64 { + if len(labels) == 0 { + return emptyLabelSignature + } + + labelNames := make([]string, 0, len(labels)) + for labelName := range labels { + labelNames = append(labelNames, labelName) + } + sort.Strings(labelNames) + + sum := hashNew() + for _, labelName := range labelNames { + sum = hashAdd(sum, labelName) + sum = hashAddByte(sum, SeparatorByte) + sum = hashAdd(sum, labels[labelName]) + sum = hashAddByte(sum, SeparatorByte) + } + return sum +} + +// labelSetToFingerprint works exactly as LabelsToSignature but takes a LabelSet as +// parameter (rather than a label map) and returns a Fingerprint. +func labelSetToFingerprint(ls LabelSet) Fingerprint { + if len(ls) == 0 { + return Fingerprint(emptyLabelSignature) + } + + labelNames := make(LabelNames, 0, len(ls)) + for labelName := range ls { + labelNames = append(labelNames, labelName) + } + sort.Sort(labelNames) + + sum := hashNew() + for _, labelName := range labelNames { + sum = hashAdd(sum, string(labelName)) + sum = hashAddByte(sum, SeparatorByte) + sum = hashAdd(sum, string(ls[labelName])) + sum = hashAddByte(sum, SeparatorByte) + } + return Fingerprint(sum) +} + +// labelSetToFastFingerprint works similar to labelSetToFingerprint but uses a +// faster and less allocation-heavy hash function, which is more susceptible to +// create hash collisions. Therefore, collision detection should be applied. +func labelSetToFastFingerprint(ls LabelSet) Fingerprint { + if len(ls) == 0 { + return Fingerprint(emptyLabelSignature) + } + + var result uint64 + for labelName, labelValue := range ls { + sum := hashNew() + sum = hashAdd(sum, string(labelName)) + sum = hashAddByte(sum, SeparatorByte) + sum = hashAdd(sum, string(labelValue)) + result ^= sum + } + return Fingerprint(result) +} + +// SignatureForLabels works like LabelsToSignature but takes a Metric as +// parameter (rather than a label map) and only includes the labels with the +// specified LabelNames into the signature calculation. The labels passed in +// will be sorted by this function. +func SignatureForLabels(m Metric, labels ...LabelName) uint64 { + if len(labels) == 0 { + return emptyLabelSignature + } + + sort.Sort(LabelNames(labels)) + + sum := hashNew() + for _, label := range labels { + sum = hashAdd(sum, string(label)) + sum = hashAddByte(sum, SeparatorByte) + sum = hashAdd(sum, string(m[label])) + sum = hashAddByte(sum, SeparatorByte) + } + return sum +} + +// SignatureWithoutLabels works like LabelsToSignature but takes a Metric as +// parameter (rather than a label map) and excludes the labels with any of the +// specified LabelNames from the signature calculation. +func SignatureWithoutLabels(m Metric, labels map[LabelName]struct{}) uint64 { + if len(m) == 0 { + return emptyLabelSignature + } + + labelNames := make(LabelNames, 0, len(m)) + for labelName := range m { + if _, exclude := labels[labelName]; !exclude { + labelNames = append(labelNames, labelName) + } + } + if len(labelNames) == 0 { + return emptyLabelSignature + } + sort.Sort(labelNames) + + sum := hashNew() + for _, labelName := range labelNames { + sum = hashAdd(sum, string(labelName)) + sum = hashAddByte(sum, SeparatorByte) + sum = hashAdd(sum, string(m[labelName])) + sum = hashAddByte(sum, SeparatorByte) + } + return sum +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/model/silence.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/model/silence.go new file mode 100644 index 00000000..bb99889d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/model/silence.go @@ -0,0 +1,106 @@ +// Copyright 2015 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +import ( + "encoding/json" + "fmt" + "regexp" + "time" +) + +// Matcher describes a matches the value of a given label. +type Matcher struct { + Name LabelName `json:"name"` + Value string `json:"value"` + IsRegex bool `json:"isRegex"` +} + +func (m *Matcher) UnmarshalJSON(b []byte) error { + type plain Matcher + if err := json.Unmarshal(b, (*plain)(m)); err != nil { + return err + } + + if len(m.Name) == 0 { + return fmt.Errorf("label name in matcher must not be empty") + } + if m.IsRegex { + if _, err := regexp.Compile(m.Value); err != nil { + return err + } + } + return nil +} + +// Validate returns true iff all fields of the matcher have valid values. +func (m *Matcher) Validate() error { + if !m.Name.IsValid() { + return fmt.Errorf("invalid name %q", m.Name) + } + if m.IsRegex { + if _, err := regexp.Compile(m.Value); err != nil { + return fmt.Errorf("invalid regular expression %q", m.Value) + } + } else if !LabelValue(m.Value).IsValid() || len(m.Value) == 0 { + return fmt.Errorf("invalid value %q", m.Value) + } + return nil +} + +// Silence defines the representation of a silence definition in the Prometheus +// eco-system. +type Silence struct { + ID uint64 `json:"id,omitempty"` + + Matchers []*Matcher `json:"matchers"` + + StartsAt time.Time `json:"startsAt"` + EndsAt time.Time `json:"endsAt"` + + CreatedAt time.Time `json:"createdAt,omitempty"` + CreatedBy string `json:"createdBy"` + Comment string `json:"comment,omitempty"` +} + +// Validate returns true iff all fields of the silence have valid values. +func (s *Silence) Validate() error { + if len(s.Matchers) == 0 { + return fmt.Errorf("at least one matcher required") + } + for _, m := range s.Matchers { + if err := m.Validate(); err != nil { + return fmt.Errorf("invalid matcher: %s", err) + } + } + if s.StartsAt.IsZero() { + return fmt.Errorf("start time missing") + } + if s.EndsAt.IsZero() { + return fmt.Errorf("end time missing") + } + if s.EndsAt.Before(s.StartsAt) { + return fmt.Errorf("start time must be before end time") + } + if s.CreatedBy == "" { + return fmt.Errorf("creator information missing") + } + if s.Comment == "" { + return fmt.Errorf("comment missing") + } + if s.CreatedAt.IsZero() { + return fmt.Errorf("creation timestamp missing") + } + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/model/time.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/model/time.go new file mode 100644 index 00000000..46259b1f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/model/time.go @@ -0,0 +1,264 @@ +// Copyright 2013 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +import ( + "fmt" + "math" + "regexp" + "strconv" + "strings" + "time" +) + +const ( + // MinimumTick is the minimum supported time resolution. This has to be + // at least time.Second in order for the code below to work. + minimumTick = time.Millisecond + // second is the Time duration equivalent to one second. + second = int64(time.Second / minimumTick) + // The number of nanoseconds per minimum tick. + nanosPerTick = int64(minimumTick / time.Nanosecond) + + // Earliest is the earliest Time representable. Handy for + // initializing a high watermark. + Earliest = Time(math.MinInt64) + // Latest is the latest Time representable. Handy for initializing + // a low watermark. + Latest = Time(math.MaxInt64) +) + +// Time is the number of milliseconds since the epoch +// (1970-01-01 00:00 UTC) excluding leap seconds. +type Time int64 + +// Interval describes an interval between two timestamps. +type Interval struct { + Start, End Time +} + +// Now returns the current time as a Time. +func Now() Time { + return TimeFromUnixNano(time.Now().UnixNano()) +} + +// TimeFromUnix returns the Time equivalent to the Unix Time t +// provided in seconds. +func TimeFromUnix(t int64) Time { + return Time(t * second) +} + +// TimeFromUnixNano returns the Time equivalent to the Unix Time +// t provided in nanoseconds. +func TimeFromUnixNano(t int64) Time { + return Time(t / nanosPerTick) +} + +// Equal reports whether two Times represent the same instant. +func (t Time) Equal(o Time) bool { + return t == o +} + +// Before reports whether the Time t is before o. +func (t Time) Before(o Time) bool { + return t < o +} + +// After reports whether the Time t is after o. +func (t Time) After(o Time) bool { + return t > o +} + +// Add returns the Time t + d. +func (t Time) Add(d time.Duration) Time { + return t + Time(d/minimumTick) +} + +// Sub returns the Duration t - o. +func (t Time) Sub(o Time) time.Duration { + return time.Duration(t-o) * minimumTick +} + +// Time returns the time.Time representation of t. +func (t Time) Time() time.Time { + return time.Unix(int64(t)/second, (int64(t)%second)*nanosPerTick) +} + +// Unix returns t as a Unix time, the number of seconds elapsed +// since January 1, 1970 UTC. +func (t Time) Unix() int64 { + return int64(t) / second +} + +// UnixNano returns t as a Unix time, the number of nanoseconds elapsed +// since January 1, 1970 UTC. +func (t Time) UnixNano() int64 { + return int64(t) * nanosPerTick +} + +// The number of digits after the dot. +var dotPrecision = int(math.Log10(float64(second))) + +// String returns a string representation of the Time. +func (t Time) String() string { + return strconv.FormatFloat(float64(t)/float64(second), 'f', -1, 64) +} + +// MarshalJSON implements the json.Marshaler interface. +func (t Time) MarshalJSON() ([]byte, error) { + return []byte(t.String()), nil +} + +// UnmarshalJSON implements the json.Unmarshaler interface. +func (t *Time) UnmarshalJSON(b []byte) error { + p := strings.Split(string(b), ".") + switch len(p) { + case 1: + v, err := strconv.ParseInt(string(p[0]), 10, 64) + if err != nil { + return err + } + *t = Time(v * second) + + case 2: + v, err := strconv.ParseInt(string(p[0]), 10, 64) + if err != nil { + return err + } + v *= second + + prec := dotPrecision - len(p[1]) + if prec < 0 { + p[1] = p[1][:dotPrecision] + } else if prec > 0 { + p[1] = p[1] + strings.Repeat("0", prec) + } + + va, err := strconv.ParseInt(p[1], 10, 32) + if err != nil { + return err + } + + *t = Time(v + va) + + default: + return fmt.Errorf("invalid time %q", string(b)) + } + return nil +} + +// Duration wraps time.Duration. It is used to parse the custom duration format +// from YAML. +// This type should not propagate beyond the scope of input/output processing. +type Duration time.Duration + +// Set implements pflag/flag.Value +func (d *Duration) Set(s string) error { + var err error + *d, err = ParseDuration(s) + return err +} + +// Type implements pflag.Value +func (d *Duration) Type() string { + return "duration" +} + +var durationRE = regexp.MustCompile("^([0-9]+)(y|w|d|h|m|s|ms)$") + +// ParseDuration parses a string into a time.Duration, assuming that a year +// always has 365d, a week always has 7d, and a day always has 24h. +func ParseDuration(durationStr string) (Duration, error) { + matches := durationRE.FindStringSubmatch(durationStr) + if len(matches) != 3 { + return 0, fmt.Errorf("not a valid duration string: %q", durationStr) + } + var ( + n, _ = strconv.Atoi(matches[1]) + dur = time.Duration(n) * time.Millisecond + ) + switch unit := matches[2]; unit { + case "y": + dur *= 1000 * 60 * 60 * 24 * 365 + case "w": + dur *= 1000 * 60 * 60 * 24 * 7 + case "d": + dur *= 1000 * 60 * 60 * 24 + case "h": + dur *= 1000 * 60 * 60 + case "m": + dur *= 1000 * 60 + case "s": + dur *= 1000 + case "ms": + // Value already correct + default: + return 0, fmt.Errorf("invalid time unit in duration string: %q", unit) + } + return Duration(dur), nil +} + +func (d Duration) String() string { + var ( + ms = int64(time.Duration(d) / time.Millisecond) + unit = "ms" + ) + if ms == 0 { + return "0s" + } + factors := map[string]int64{ + "y": 1000 * 60 * 60 * 24 * 365, + "w": 1000 * 60 * 60 * 24 * 7, + "d": 1000 * 60 * 60 * 24, + "h": 1000 * 60 * 60, + "m": 1000 * 60, + "s": 1000, + "ms": 1, + } + + switch int64(0) { + case ms % factors["y"]: + unit = "y" + case ms % factors["w"]: + unit = "w" + case ms % factors["d"]: + unit = "d" + case ms % factors["h"]: + unit = "h" + case ms % factors["m"]: + unit = "m" + case ms % factors["s"]: + unit = "s" + } + return fmt.Sprintf("%v%v", ms/factors[unit], unit) +} + +// MarshalYAML implements the yaml.Marshaler interface. +func (d Duration) MarshalYAML() (interface{}, error) { + return d.String(), nil +} + +// UnmarshalYAML implements the yaml.Unmarshaler interface. +func (d *Duration) UnmarshalYAML(unmarshal func(interface{}) error) error { + var s string + if err := unmarshal(&s); err != nil { + return err + } + dur, err := ParseDuration(s) + if err != nil { + return err + } + *d = dur + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/model/value.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/model/value.go new file mode 100644 index 00000000..c9d8fb1a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/common/model/value.go @@ -0,0 +1,416 @@ +// Copyright 2013 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +import ( + "encoding/json" + "fmt" + "math" + "sort" + "strconv" + "strings" +) + +var ( + // ZeroSamplePair is the pseudo zero-value of SamplePair used to signal a + // non-existing sample pair. It is a SamplePair with timestamp Earliest and + // value 0.0. Note that the natural zero value of SamplePair has a timestamp + // of 0, which is possible to appear in a real SamplePair and thus not + // suitable to signal a non-existing SamplePair. + ZeroSamplePair = SamplePair{Timestamp: Earliest} + + // ZeroSample is the pseudo zero-value of Sample used to signal a + // non-existing sample. It is a Sample with timestamp Earliest, value 0.0, + // and metric nil. Note that the natural zero value of Sample has a timestamp + // of 0, which is possible to appear in a real Sample and thus not suitable + // to signal a non-existing Sample. + ZeroSample = Sample{Timestamp: Earliest} +) + +// A SampleValue is a representation of a value for a given sample at a given +// time. +type SampleValue float64 + +// MarshalJSON implements json.Marshaler. +func (v SampleValue) MarshalJSON() ([]byte, error) { + return json.Marshal(v.String()) +} + +// UnmarshalJSON implements json.Unmarshaler. +func (v *SampleValue) UnmarshalJSON(b []byte) error { + if len(b) < 2 || b[0] != '"' || b[len(b)-1] != '"' { + return fmt.Errorf("sample value must be a quoted string") + } + f, err := strconv.ParseFloat(string(b[1:len(b)-1]), 64) + if err != nil { + return err + } + *v = SampleValue(f) + return nil +} + +// Equal returns true if the value of v and o is equal or if both are NaN. Note +// that v==o is false if both are NaN. If you want the conventional float +// behavior, use == to compare two SampleValues. +func (v SampleValue) Equal(o SampleValue) bool { + if v == o { + return true + } + return math.IsNaN(float64(v)) && math.IsNaN(float64(o)) +} + +func (v SampleValue) String() string { + return strconv.FormatFloat(float64(v), 'f', -1, 64) +} + +// SamplePair pairs a SampleValue with a Timestamp. +type SamplePair struct { + Timestamp Time + Value SampleValue +} + +// MarshalJSON implements json.Marshaler. +func (s SamplePair) MarshalJSON() ([]byte, error) { + t, err := json.Marshal(s.Timestamp) + if err != nil { + return nil, err + } + v, err := json.Marshal(s.Value) + if err != nil { + return nil, err + } + return []byte(fmt.Sprintf("[%s,%s]", t, v)), nil +} + +// UnmarshalJSON implements json.Unmarshaler. +func (s *SamplePair) UnmarshalJSON(b []byte) error { + v := [...]json.Unmarshaler{&s.Timestamp, &s.Value} + return json.Unmarshal(b, &v) +} + +// Equal returns true if this SamplePair and o have equal Values and equal +// Timestamps. The semantics of Value equality is defined by SampleValue.Equal. +func (s *SamplePair) Equal(o *SamplePair) bool { + return s == o || (s.Value.Equal(o.Value) && s.Timestamp.Equal(o.Timestamp)) +} + +func (s SamplePair) String() string { + return fmt.Sprintf("%s @[%s]", s.Value, s.Timestamp) +} + +// Sample is a sample pair associated with a metric. +type Sample struct { + Metric Metric `json:"metric"` + Value SampleValue `json:"value"` + Timestamp Time `json:"timestamp"` +} + +// Equal compares first the metrics, then the timestamp, then the value. The +// semantics of value equality is defined by SampleValue.Equal. +func (s *Sample) Equal(o *Sample) bool { + if s == o { + return true + } + + if !s.Metric.Equal(o.Metric) { + return false + } + if !s.Timestamp.Equal(o.Timestamp) { + return false + } + + return s.Value.Equal(o.Value) +} + +func (s Sample) String() string { + return fmt.Sprintf("%s => %s", s.Metric, SamplePair{ + Timestamp: s.Timestamp, + Value: s.Value, + }) +} + +// MarshalJSON implements json.Marshaler. +func (s Sample) MarshalJSON() ([]byte, error) { + v := struct { + Metric Metric `json:"metric"` + Value SamplePair `json:"value"` + }{ + Metric: s.Metric, + Value: SamplePair{ + Timestamp: s.Timestamp, + Value: s.Value, + }, + } + + return json.Marshal(&v) +} + +// UnmarshalJSON implements json.Unmarshaler. +func (s *Sample) UnmarshalJSON(b []byte) error { + v := struct { + Metric Metric `json:"metric"` + Value SamplePair `json:"value"` + }{ + Metric: s.Metric, + Value: SamplePair{ + Timestamp: s.Timestamp, + Value: s.Value, + }, + } + + if err := json.Unmarshal(b, &v); err != nil { + return err + } + + s.Metric = v.Metric + s.Timestamp = v.Value.Timestamp + s.Value = v.Value.Value + + return nil +} + +// Samples is a sortable Sample slice. It implements sort.Interface. +type Samples []*Sample + +func (s Samples) Len() int { + return len(s) +} + +// Less compares first the metrics, then the timestamp. +func (s Samples) Less(i, j int) bool { + switch { + case s[i].Metric.Before(s[j].Metric): + return true + case s[j].Metric.Before(s[i].Metric): + return false + case s[i].Timestamp.Before(s[j].Timestamp): + return true + default: + return false + } +} + +func (s Samples) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +// Equal compares two sets of samples and returns true if they are equal. +func (s Samples) Equal(o Samples) bool { + if len(s) != len(o) { + return false + } + + for i, sample := range s { + if !sample.Equal(o[i]) { + return false + } + } + return true +} + +// SampleStream is a stream of Values belonging to an attached COWMetric. +type SampleStream struct { + Metric Metric `json:"metric"` + Values []SamplePair `json:"values"` +} + +func (ss SampleStream) String() string { + vals := make([]string, len(ss.Values)) + for i, v := range ss.Values { + vals[i] = v.String() + } + return fmt.Sprintf("%s =>\n%s", ss.Metric, strings.Join(vals, "\n")) +} + +// Value is a generic interface for values resulting from a query evaluation. +type Value interface { + Type() ValueType + String() string +} + +func (Matrix) Type() ValueType { return ValMatrix } +func (Vector) Type() ValueType { return ValVector } +func (*Scalar) Type() ValueType { return ValScalar } +func (*String) Type() ValueType { return ValString } + +type ValueType int + +const ( + ValNone ValueType = iota + ValScalar + ValVector + ValMatrix + ValString +) + +// MarshalJSON implements json.Marshaler. +func (et ValueType) MarshalJSON() ([]byte, error) { + return json.Marshal(et.String()) +} + +func (et *ValueType) UnmarshalJSON(b []byte) error { + var s string + if err := json.Unmarshal(b, &s); err != nil { + return err + } + switch s { + case "": + *et = ValNone + case "scalar": + *et = ValScalar + case "vector": + *et = ValVector + case "matrix": + *et = ValMatrix + case "string": + *et = ValString + default: + return fmt.Errorf("unknown value type %q", s) + } + return nil +} + +func (e ValueType) String() string { + switch e { + case ValNone: + return "" + case ValScalar: + return "scalar" + case ValVector: + return "vector" + case ValMatrix: + return "matrix" + case ValString: + return "string" + } + panic("ValueType.String: unhandled value type") +} + +// Scalar is a scalar value evaluated at the set timestamp. +type Scalar struct { + Value SampleValue `json:"value"` + Timestamp Time `json:"timestamp"` +} + +func (s Scalar) String() string { + return fmt.Sprintf("scalar: %v @[%v]", s.Value, s.Timestamp) +} + +// MarshalJSON implements json.Marshaler. +func (s Scalar) MarshalJSON() ([]byte, error) { + v := strconv.FormatFloat(float64(s.Value), 'f', -1, 64) + return json.Marshal([...]interface{}{s.Timestamp, string(v)}) +} + +// UnmarshalJSON implements json.Unmarshaler. +func (s *Scalar) UnmarshalJSON(b []byte) error { + var f string + v := [...]interface{}{&s.Timestamp, &f} + + if err := json.Unmarshal(b, &v); err != nil { + return err + } + + value, err := strconv.ParseFloat(f, 64) + if err != nil { + return fmt.Errorf("error parsing sample value: %s", err) + } + s.Value = SampleValue(value) + return nil +} + +// String is a string value evaluated at the set timestamp. +type String struct { + Value string `json:"value"` + Timestamp Time `json:"timestamp"` +} + +func (s *String) String() string { + return s.Value +} + +// MarshalJSON implements json.Marshaler. +func (s String) MarshalJSON() ([]byte, error) { + return json.Marshal([]interface{}{s.Timestamp, s.Value}) +} + +// UnmarshalJSON implements json.Unmarshaler. +func (s *String) UnmarshalJSON(b []byte) error { + v := [...]interface{}{&s.Timestamp, &s.Value} + return json.Unmarshal(b, &v) +} + +// Vector is basically only an alias for Samples, but the +// contract is that in a Vector, all Samples have the same timestamp. +type Vector []*Sample + +func (vec Vector) String() string { + entries := make([]string, len(vec)) + for i, s := range vec { + entries[i] = s.String() + } + return strings.Join(entries, "\n") +} + +func (vec Vector) Len() int { return len(vec) } +func (vec Vector) Swap(i, j int) { vec[i], vec[j] = vec[j], vec[i] } + +// Less compares first the metrics, then the timestamp. +func (vec Vector) Less(i, j int) bool { + switch { + case vec[i].Metric.Before(vec[j].Metric): + return true + case vec[j].Metric.Before(vec[i].Metric): + return false + case vec[i].Timestamp.Before(vec[j].Timestamp): + return true + default: + return false + } +} + +// Equal compares two sets of samples and returns true if they are equal. +func (vec Vector) Equal(o Vector) bool { + if len(vec) != len(o) { + return false + } + + for i, sample := range vec { + if !sample.Equal(o[i]) { + return false + } + } + return true +} + +// Matrix is a list of time series. +type Matrix []*SampleStream + +func (m Matrix) Len() int { return len(m) } +func (m Matrix) Less(i, j int) bool { return m[i].Metric.Before(m[j].Metric) } +func (m Matrix) Swap(i, j int) { m[i], m[j] = m[j], m[i] } + +func (mat Matrix) String() string { + matCp := make(Matrix, len(mat)) + copy(matCp, mat) + sort.Sort(matCp) + + strs := make([]string, len(matCp)) + + for i, ss := range matCp { + strs[i] = ss.String() + } + + return strings.Join(strs, "\n") +} diff --git a/vendor/github.com/prometheus/procfs/.gitignore b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/.gitignore similarity index 100% rename from vendor/github.com/prometheus/procfs/.gitignore rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/.gitignore diff --git a/vendor/github.com/prometheus/procfs/CONTRIBUTING.md b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/CONTRIBUTING.md similarity index 100% rename from vendor/github.com/prometheus/procfs/CONTRIBUTING.md rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/CONTRIBUTING.md diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/LICENSE b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/LICENSE new file mode 100644 index 00000000..261eeb9e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/MAINTAINERS.md b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/MAINTAINERS.md new file mode 100644 index 00000000..35993c41 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/MAINTAINERS.md @@ -0,0 +1 @@ +* Tobias Schmidt diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/Makefile b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/Makefile new file mode 100644 index 00000000..4d109839 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/Makefile @@ -0,0 +1,77 @@ +# Copyright 2018 The Prometheus Authors +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Ensure GOBIN is not set during build so that promu is installed to the correct path +unexport GOBIN + +GO ?= go +GOFMT ?= $(GO)fmt +FIRST_GOPATH := $(firstword $(subst :, ,$(shell $(GO) env GOPATH))) +STATICCHECK := $(FIRST_GOPATH)/bin/staticcheck +pkgs = $(shell $(GO) list ./... | grep -v /vendor/) + +PREFIX ?= $(shell pwd) +BIN_DIR ?= $(shell pwd) + +ifdef DEBUG + bindata_flags = -debug +endif + +STATICCHECK_IGNORE = + +all: format staticcheck build test + +style: + @echo ">> checking code style" + @! $(GOFMT) -d $(shell find . -path ./vendor -prune -o -name '*.go' -print) | grep '^' + +check_license: + @echo ">> checking license header" + @./scripts/check_license.sh + +test: fixtures/.unpacked sysfs/fixtures/.unpacked + @echo ">> running all tests" + @$(GO) test -race $(shell $(GO) list ./... | grep -v /vendor/ | grep -v examples) + +format: + @echo ">> formatting code" + @$(GO) fmt $(pkgs) + +vet: + @echo ">> vetting code" + @$(GO) vet $(pkgs) + +staticcheck: $(STATICCHECK) + @echo ">> running staticcheck" + @$(STATICCHECK) -ignore "$(STATICCHECK_IGNORE)" $(pkgs) + +%/.unpacked: %.ttar + ./ttar -C $(dir $*) -x -f $*.ttar + touch $@ + +update_fixtures: fixtures.ttar sysfs/fixtures.ttar + +%fixtures.ttar: %/fixtures + rm -v $(dir $*)fixtures/.unpacked + ./ttar -C $(dir $*) -c -f $*fixtures.ttar fixtures/ + +$(FIRST_GOPATH)/bin/staticcheck: + @GOOS= GOARCH= $(GO) get -u honnef.co/go/tools/cmd/staticcheck + +.PHONY: all style check_license format test vet staticcheck + +# Declaring the binaries at their default locations as PHONY targets is a hack +# to ensure the latest version is downloaded on every make execution. +# If this is not desired, copy/symlink these binaries to a different path and +# set the respective environment variables. +.PHONY: $(GOPATH)/bin/staticcheck diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/NOTICE b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/NOTICE new file mode 100644 index 00000000..53c5e9aa --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/NOTICE @@ -0,0 +1,7 @@ +procfs provides functions to retrieve system, kernel and process +metrics from the pseudo-filesystem proc. + +Copyright 2014-2015 The Prometheus Authors + +This product includes software developed at +SoundCloud Ltd. (http://soundcloud.com/). diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/README.md b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/README.md new file mode 100644 index 00000000..20954947 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/README.md @@ -0,0 +1,11 @@ +# procfs + +This procfs package provides functions to retrieve system, kernel and process +metrics from the pseudo-filesystem proc. + +*WARNING*: This package is a work in progress. Its API may still break in +backwards-incompatible ways without warnings. Use it at your own risk. + +[![GoDoc](https://godoc.org/github.com/prometheus/procfs?status.png)](https://godoc.org/github.com/prometheus/procfs) +[![Build Status](https://travis-ci.org/prometheus/procfs.svg?branch=master)](https://travis-ci.org/prometheus/procfs) +[![Go Report Card](https://goreportcard.com/badge/github.com/prometheus/procfs)](https://goreportcard.com/report/github.com/prometheus/procfs) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/buddyinfo.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/buddyinfo.go new file mode 100644 index 00000000..d3a82680 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/buddyinfo.go @@ -0,0 +1,95 @@ +// Copyright 2017 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "bufio" + "fmt" + "io" + "os" + "strconv" + "strings" +) + +// A BuddyInfo is the details parsed from /proc/buddyinfo. +// The data is comprised of an array of free fragments of each size. +// The sizes are 2^n*PAGE_SIZE, where n is the array index. +type BuddyInfo struct { + Node string + Zone string + Sizes []float64 +} + +// NewBuddyInfo reads the buddyinfo statistics. +func NewBuddyInfo() ([]BuddyInfo, error) { + fs, err := NewFS(DefaultMountPoint) + if err != nil { + return nil, err + } + + return fs.NewBuddyInfo() +} + +// NewBuddyInfo reads the buddyinfo statistics from the specified `proc` filesystem. +func (fs FS) NewBuddyInfo() ([]BuddyInfo, error) { + file, err := os.Open(fs.Path("buddyinfo")) + if err != nil { + return nil, err + } + defer file.Close() + + return parseBuddyInfo(file) +} + +func parseBuddyInfo(r io.Reader) ([]BuddyInfo, error) { + var ( + buddyInfo = []BuddyInfo{} + scanner = bufio.NewScanner(r) + bucketCount = -1 + ) + + for scanner.Scan() { + var err error + line := scanner.Text() + parts := strings.Fields(line) + + if len(parts) < 4 { + return nil, fmt.Errorf("invalid number of fields when parsing buddyinfo") + } + + node := strings.TrimRight(parts[1], ",") + zone := strings.TrimRight(parts[3], ",") + arraySize := len(parts[4:]) + + if bucketCount == -1 { + bucketCount = arraySize + } else { + if bucketCount != arraySize { + return nil, fmt.Errorf("mismatch in number of buddyinfo buckets, previous count %d, new count %d", bucketCount, arraySize) + } + } + + sizes := make([]float64, arraySize) + for i := 0; i < arraySize; i++ { + sizes[i], err = strconv.ParseFloat(parts[i+4], 64) + if err != nil { + return nil, fmt.Errorf("invalid value in buddyinfo: %s", err) + } + } + + buddyInfo = append(buddyInfo, BuddyInfo{node, zone, sizes}) + } + + return buddyInfo, scanner.Err() +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/doc.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/doc.go new file mode 100644 index 00000000..e2acd6d4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/doc.go @@ -0,0 +1,45 @@ +// Copyright 2014 Prometheus Team +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package procfs provides functions to retrieve system, kernel and process +// metrics from the pseudo-filesystem proc. +// +// Example: +// +// package main +// +// import ( +// "fmt" +// "log" +// +// "github.com/prometheus/procfs" +// ) +// +// func main() { +// p, err := procfs.Self() +// if err != nil { +// log.Fatalf("could not get process: %s", err) +// } +// +// stat, err := p.NewStat() +// if err != nil { +// log.Fatalf("could not get process stat: %s", err) +// } +// +// fmt.Printf("command: %s\n", stat.Comm) +// fmt.Printf("cpu time: %fs\n", stat.CPUTime()) +// fmt.Printf("vsize: %dB\n", stat.VirtualMemory()) +// fmt.Printf("rss: %dB\n", stat.ResidentMemory()) +// } +// +package procfs diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/fixtures.ttar b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/fixtures.ttar new file mode 100644 index 00000000..13c831ef --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/fixtures.ttar @@ -0,0 +1,462 @@ +# Archive created by ttar -c -f fixtures.ttar fixtures/ +Directory: fixtures +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/26231 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26231/cmdline +Lines: 1 +vimNULLBYTEtest.goNULLBYTE+10NULLBYTEEOF +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26231/comm +Lines: 1 +vim +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26231/cwd +SymlinkTo: /usr/bin +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26231/exe +SymlinkTo: /usr/bin/vim +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/26231/fd +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26231/fd/0 +SymlinkTo: ../../symlinktargets/abc +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26231/fd/1 +SymlinkTo: ../../symlinktargets/def +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26231/fd/10 +SymlinkTo: ../../symlinktargets/xyz +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26231/fd/2 +SymlinkTo: ../../symlinktargets/ghi +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26231/fd/3 +SymlinkTo: ../../symlinktargets/uvw +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26231/io +Lines: 7 +rchar: 750339 +wchar: 818609 +syscr: 7405 +syscw: 5245 +read_bytes: 1024 +write_bytes: 2048 +cancelled_write_bytes: -1024 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26231/limits +Lines: 17 +Limit Soft Limit Hard Limit Units +Max cpu time unlimited unlimited seconds +Max file size unlimited unlimited bytes +Max data size unlimited unlimited bytes +Max stack size 8388608 unlimited bytes +Max core file size 0 unlimited bytes +Max resident set unlimited unlimited bytes +Max processes 62898 62898 processes +Max open files 2048 4096 files +Max locked memory 65536 65536 bytes +Max address space 8589934592 unlimited bytes +Max file locks unlimited unlimited locks +Max pending signals 62898 62898 signals +Max msgqueue size 819200 819200 bytes +Max nice priority 0 0 +Max realtime priority 0 0 +Max realtime timeout unlimited unlimited us +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26231/mountstats +Lines: 19 +device rootfs mounted on / with fstype rootfs +device sysfs mounted on /sys with fstype sysfs +device proc mounted on /proc with fstype proc +device /dev/sda1 mounted on / with fstype ext4 +device 192.168.1.1:/srv/test mounted on /mnt/nfs/test with fstype nfs4 statvers=1.1 + opts: rw,vers=4.0,rsize=1048576,wsize=1048576,namlen=255,acregmin=3,acregmax=60,acdirmin=30,acdirmax=60,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.1.5,local_lock=none + age: 13968 + caps: caps=0xfff7,wtmult=512,dtsize=32768,bsize=0,namlen=255 + nfsv4: bm0=0xfdffafff,bm1=0xf9be3e,bm2=0x0,acl=0x0,pnfs=not configured + sec: flavor=1,pseudoflavor=1 + events: 52 226 0 0 1 13 398 0 0 331 0 47 0 0 77 0 0 77 0 0 0 0 0 0 0 0 0 + bytes: 1207640230 0 0 0 1210214218 0 295483 0 + RPC iostats version: 1.0 p/v: 100003/4 (nfs) + xprt: tcp 832 0 1 0 11 6428 6428 0 12154 0 24 26 5726 + per-op statistics + NULL: 0 0 0 0 0 0 0 0 + READ: 1298 1298 0 207680 1210292152 6 79386 79407 + WRITE: 0 0 0 0 0 0 0 0 + +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/26231/net +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26231/net/dev +Lines: 4 +Inter-| Receive | Transmit + face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed + lo: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + eth0: 438 5 0 0 0 0 0 0 648 8 0 0 0 0 0 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/26231/ns +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26231/ns/mnt +SymlinkTo: mnt:[4026531840] +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26231/ns/net +SymlinkTo: net:[4026531993] +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26231/root +SymlinkTo: / +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26231/stat +Lines: 1 +26231 (vim) R 5392 7446 5392 34835 7446 4218880 32533 309516 26 82 1677 44 158 99 20 0 1 0 82375 56274944 1981 18446744073709551615 4194304 6294284 140736914091744 140736914087944 139965136429984 0 0 12288 1870679807 0 0 0 17 0 0 0 31 0 0 8391624 8481048 16420864 140736914093252 140736914093279 140736914093279 140736914096107 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/26232 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26232/cmdline +Lines: 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26232/comm +Lines: 1 +ata_sff +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26232/cwd +SymlinkTo: /does/not/exist +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/26232/fd +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26232/fd/0 +SymlinkTo: ../../symlinktargets/abc +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26232/fd/1 +SymlinkTo: ../../symlinktargets/def +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26232/fd/2 +SymlinkTo: ../../symlinktargets/ghi +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26232/fd/3 +SymlinkTo: ../../symlinktargets/uvw +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26232/fd/4 +SymlinkTo: ../../symlinktargets/xyz +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26232/limits +Lines: 17 +Limit Soft Limit Hard Limit Units +Max cpu time unlimited unlimited seconds +Max file size unlimited unlimited bytes +Max data size unlimited unlimited bytes +Max stack size 8388608 unlimited bytes +Max core file size 0 unlimited bytes +Max resident set unlimited unlimited bytes +Max processes 29436 29436 processes +Max open files 1024 4096 files +Max locked memory 65536 65536 bytes +Max address space unlimited unlimited bytes +Max file locks unlimited unlimited locks +Max pending signals 29436 29436 signals +Max msgqueue size 819200 819200 bytes +Max nice priority 0 0 +Max realtime priority 0 0 +Max realtime timeout unlimited unlimited us +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26232/root +SymlinkTo: /does/not/exist +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26232/stat +Lines: 1 +33 (ata_sff) S 2 0 0 0 -1 69238880 0 0 0 0 0 0 0 0 0 -20 1 0 5 0 0 18446744073709551615 0 0 0 0 0 0 0 2147483647 0 18446744073709551615 0 0 17 1 0 0 0 0 0 0 0 0 0 0 0 0 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/26233 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/26233/cmdline +Lines: 1 +com.github.uiautomatorNULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTEEOF +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/584 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/584/stat +Lines: 2 +1020 ((a b ) ( c d) ) R 28378 1020 28378 34842 1020 4218880 286 0 0 0 0 0 0 0 20 0 1 0 10839175 10395648 155 18446744073709551615 4194304 4238788 140736466511168 140736466511168 140609271124624 0 0 0 0 0 0 0 17 5 0 0 0 0 0 6336016 6337300 25579520 140736466515030 140736466515061 140736466515061 140736466518002 0 +#!/bin/cat /proc/self/stat +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/buddyinfo +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/buddyinfo/short +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/buddyinfo/short/buddyinfo +Lines: 3 +Node 0, zone +Node 0, zone +Node 0, zone +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/buddyinfo/sizemismatch +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/buddyinfo/sizemismatch/buddyinfo +Lines: 3 +Node 0, zone DMA 1 0 1 0 2 1 1 0 1 1 3 +Node 0, zone DMA32 759 572 791 475 194 45 12 0 0 0 0 0 +Node 0, zone Normal 4381 1093 185 1530 567 102 4 0 0 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/buddyinfo/valid +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/buddyinfo/valid/buddyinfo +Lines: 3 +Node 0, zone DMA 1 0 1 0 2 1 1 0 1 1 3 +Node 0, zone DMA32 759 572 791 475 194 45 12 0 0 0 0 +Node 0, zone Normal 4381 1093 185 1530 567 102 4 0 0 0 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/fs +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/fs/xfs +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/fs/xfs/stat +Lines: 23 +extent_alloc 92447 97589 92448 93751 +abt 0 0 0 0 +blk_map 1767055 188820 184891 92447 92448 2140766 0 +bmbt 0 0 0 0 +dir 185039 92447 92444 136422 +trans 706 944304 0 +ig 185045 58807 0 126238 0 33637 22 +log 2883 113448 9 17360 739 +push_ail 945014 0 134260 15483 0 3940 464 159985 0 40 +xstrat 92447 0 +rw 107739 94045 +attr 4 0 0 0 +icluster 8677 7849 135802 +vnodes 92601 0 0 0 92444 92444 92444 0 +buf 2666287 7122 2659202 3599 2 7085 0 10297 7085 +abtb2 184941 1277345 13257 13278 0 0 0 0 0 0 0 0 0 0 2746147 +abtc2 345295 2416764 172637 172658 0 0 0 0 0 0 0 0 0 0 21406023 +bmbt2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +ibt2 343004 1358467 0 0 0 0 0 0 0 0 0 0 0 0 0 +fibt2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +qm 0 0 0 0 0 0 0 0 +xpc 399724544 92823103 86219234 +debug 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/mdstat +Lines: 26 +Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] +md3 : active raid6 sda1[8] sdh1[7] sdg1[6] sdf1[5] sde1[11] sdd1[3] sdc1[10] sdb1[9] + 5853468288 blocks super 1.2 level 6, 64k chunk, algorithm 2 [8/8] [UUUUUUUU] + +md127 : active raid1 sdi2[0] sdj2[1] + 312319552 blocks [2/2] [UU] + +md0 : active raid1 sdk[2](S) sdi1[0] sdj1[1] + 248896 blocks [2/2] [UU] + +md4 : inactive raid1 sda3[0] sdb3[1] + 4883648 blocks [2/2] [UU] + +md6 : active raid1 sdb2[2] sda2[0] + 195310144 blocks [2/1] [U_] + [=>...................] recovery = 8.5% (16775552/195310144) finish=17.0min speed=259783K/sec + +md8 : active raid1 sdb1[1] sda1[0] + 195310144 blocks [2/2] [UU] + [=>...................] resync = 8.5% (16775552/195310144) finish=17.0min speed=259783K/sec + +md7 : active raid6 sdb1[0] sde1[3] sdd1[2] sdc1[1] + 7813735424 blocks super 1.2 level 6, 512k chunk, algorithm 2 [4/3] [U_UU] + bitmap: 0/30 pages [0KB], 65536KB chunk + +unused devices: +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/net +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/net/dev +Lines: 6 +Inter-| Receive | Transmit + face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed +vethf345468: 648 8 0 0 0 0 0 0 438 5 0 0 0 0 0 0 + lo: 1664039048 1566805 0 0 0 0 0 0 1664039048 1566805 0 0 0 0 0 0 +docker0: 2568 38 0 0 0 0 0 0 438 5 0 0 0 0 0 0 + eth0: 874354587 1036395 0 0 0 0 0 0 563352563 732147 0 0 0 0 0 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/net/ip_vs +Lines: 21 +IP Virtual Server version 1.2.1 (size=4096) +Prot LocalAddress:Port Scheduler Flags + -> RemoteAddress:Port Forward Weight ActiveConn InActConn +TCP C0A80016:0CEA wlc + -> C0A85216:0CEA Tunnel 100 248 2 + -> C0A85318:0CEA Tunnel 100 248 2 + -> C0A85315:0CEA Tunnel 100 248 1 +TCP C0A80039:0CEA wlc + -> C0A85416:0CEA Tunnel 0 0 0 + -> C0A85215:0CEA Tunnel 100 1499 0 + -> C0A83215:0CEA Tunnel 100 1498 0 +TCP C0A80037:0CEA wlc + -> C0A8321A:0CEA Tunnel 0 0 0 + -> C0A83120:0CEA Tunnel 100 0 0 +TCP [2620:0000:0000:0000:0000:0000:0000:0001]:0050 sh + -> [2620:0000:0000:0000:0000:0000:0000:0002]:0050 Route 1 0 0 + -> [2620:0000:0000:0000:0000:0000:0000:0003]:0050 Route 1 0 0 + -> [2620:0000:0000:0000:0000:0000:0000:0004]:0050 Route 1 1 1 +FWM 10001000 wlc + -> C0A8321A:0CEA Route 0 0 1 + -> C0A83215:0CEA Route 0 0 2 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/net/ip_vs_stats +Lines: 6 + Total Incoming Outgoing Incoming Outgoing + Conns Packets Packets Bytes Bytes + 16AA370 E33656E5 0 51D8C8883AB3 0 + + Conns/s Pkts/s Pkts/s Bytes/s Bytes/s + 4 1FB3C 0 1282A8F 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/net/rpc +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/net/rpc/nfs +Lines: 5 +net 18628 0 18628 6 +rpc 4329785 0 4338291 +proc2 18 2 69 0 0 4410 0 0 0 0 0 0 0 0 0 0 0 99 2 +proc3 22 1 4084749 29200 94754 32580 186 47747 7981 8639 0 6356 0 6962 0 7958 0 0 241 4 4 2 39 +proc4 61 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/net/rpc/nfsd +Lines: 11 +rc 0 6 18622 +fh 0 0 0 0 0 +io 157286400 0 +th 8 0 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 +ra 32 0 0 0 0 0 0 0 0 0 0 0 +net 18628 0 18628 6 +rpc 18628 0 0 0 0 +proc2 18 2 69 0 0 4410 0 0 0 0 0 0 0 0 0 0 0 99 2 +proc3 22 2 112 0 2719 111 0 0 0 0 0 0 0 0 0 0 0 27 216 0 2 1 0 +proc4 2 2 10853 +proc4ops 72 0 0 0 1098 2 0 0 0 0 8179 5896 0 0 0 0 5900 0 0 2 0 2 0 9609 0 2 150 1272 0 0 0 1236 0 0 0 0 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/net/xfrm_stat +Lines: 28 +XfrmInError 1 +XfrmInBufferError 2 +XfrmInHdrError 4 +XfrmInNoStates 3 +XfrmInStateProtoError 40 +XfrmInStateModeError 100 +XfrmInStateSeqError 6000 +XfrmInStateExpired 4 +XfrmInStateMismatch 23451 +XfrmInStateInvalid 55555 +XfrmInTmplMismatch 51 +XfrmInNoPols 65432 +XfrmInPolBlock 100 +XfrmInPolError 10000 +XfrmOutError 1000000 +XfrmOutBundleGenError 43321 +XfrmOutBundleCheckError 555 +XfrmOutNoStates 869 +XfrmOutStateProtoError 4542 +XfrmOutStateModeError 4 +XfrmOutStateSeqError 543 +XfrmOutStateExpired 565 +XfrmOutPolBlock 43456 +XfrmOutPolDead 7656 +XfrmOutPolError 1454 +XfrmFwdHdrError 6654 +XfrmOutStateInvalid 28765 +XfrmAcquireError 24532 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/self +SymlinkTo: 26231 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/stat +Lines: 16 +cpu 301854 612 111922 8979004 3552 2 3944 0 0 0 +cpu0 44490 19 21045 1087069 220 1 3410 0 0 0 +cpu1 47869 23 16474 1110787 591 0 46 0 0 0 +cpu2 46504 36 15916 1112321 441 0 326 0 0 0 +cpu3 47054 102 15683 1113230 533 0 60 0 0 0 +cpu4 28413 25 10776 1140321 217 0 8 0 0 0 +cpu5 29271 101 11586 1136270 672 0 30 0 0 0 +cpu6 29152 36 10276 1139721 319 0 29 0 0 0 +cpu7 29098 268 10164 1139282 555 0 31 0 0 0 +intr 8885917 17 0 0 0 0 0 0 0 1 79281 0 0 0 0 0 0 0 231237 0 0 0 0 250586 103 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 223424 190745 13 906 1283803 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +ctxt 38014093 +btime 1418183276 +processes 26442 +procs_running 2 +procs_blocked 1 +softirq 5057579 250191 1481983 1647 211099 186066 0 1783454 622196 12499 508444 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/symlinktargets +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/symlinktargets/README +Lines: 2 +This directory contains some empty files that are the symlinks the files in the "fd" directory point to. +They are otherwise ignored by the tests +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/symlinktargets/abc +Lines: 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/symlinktargets/def +Lines: 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/symlinktargets/ghi +Lines: 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/symlinktargets/uvw +Lines: 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/symlinktargets/xyz +Lines: 0 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/.unpacked +Lines: 0 +Mode: 664 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/fs.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/fs.go new file mode 100644 index 00000000..b6c6b2ce --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/fs.go @@ -0,0 +1,82 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "fmt" + "os" + "path" + + "github.com/prometheus/procfs/nfs" + "github.com/prometheus/procfs/xfs" +) + +// FS represents the pseudo-filesystem proc, which provides an interface to +// kernel data structures. +type FS string + +// DefaultMountPoint is the common mount point of the proc filesystem. +const DefaultMountPoint = "/proc" + +// NewFS returns a new FS mounted under the given mountPoint. It will error +// if the mount point can't be read. +func NewFS(mountPoint string) (FS, error) { + info, err := os.Stat(mountPoint) + if err != nil { + return "", fmt.Errorf("could not read %s: %s", mountPoint, err) + } + if !info.IsDir() { + return "", fmt.Errorf("mount point %s is not a directory", mountPoint) + } + + return FS(mountPoint), nil +} + +// Path returns the path of the given subsystem relative to the procfs root. +func (fs FS) Path(p ...string) string { + return path.Join(append([]string{string(fs)}, p...)...) +} + +// XFSStats retrieves XFS filesystem runtime statistics. +func (fs FS) XFSStats() (*xfs.Stats, error) { + f, err := os.Open(fs.Path("fs/xfs/stat")) + if err != nil { + return nil, err + } + defer f.Close() + + return xfs.ParseStats(f) +} + +// NFSClientRPCStats retrieves NFS client RPC statistics. +func (fs FS) NFSClientRPCStats() (*nfs.ClientRPCStats, error) { + f, err := os.Open(fs.Path("net/rpc/nfs")) + if err != nil { + return nil, err + } + defer f.Close() + + return nfs.ParseClientRPCStats(f) +} + +// NFSdServerRPCStats retrieves NFS daemon RPC statistics. +func (fs FS) NFSdServerRPCStats() (*nfs.ServerRPCStats, error) { + f, err := os.Open(fs.Path("net/rpc/nfsd")) + if err != nil { + return nil, err + } + defer f.Close() + + return nfs.ParseServerRPCStats(f) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/internal/util/parse.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/internal/util/parse.go new file mode 100644 index 00000000..2ff228e9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/internal/util/parse.go @@ -0,0 +1,59 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package util + +import ( + "io/ioutil" + "strconv" + "strings" +) + +// ParseUint32s parses a slice of strings into a slice of uint32s. +func ParseUint32s(ss []string) ([]uint32, error) { + us := make([]uint32, 0, len(ss)) + for _, s := range ss { + u, err := strconv.ParseUint(s, 10, 32) + if err != nil { + return nil, err + } + + us = append(us, uint32(u)) + } + + return us, nil +} + +// ParseUint64s parses a slice of strings into a slice of uint64s. +func ParseUint64s(ss []string) ([]uint64, error) { + us := make([]uint64, 0, len(ss)) + for _, s := range ss { + u, err := strconv.ParseUint(s, 10, 64) + if err != nil { + return nil, err + } + + us = append(us, u) + } + + return us, nil +} + +// ReadUintFromFile reads a file and attempts to parse a uint64 from it. +func ReadUintFromFile(path string) (uint64, error) { + data, err := ioutil.ReadFile(path) + if err != nil { + return 0, err + } + return strconv.ParseUint(strings.TrimSpace(string(data)), 10, 64) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/internal/util/sysreadfile_linux.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/internal/util/sysreadfile_linux.go new file mode 100644 index 00000000..df0d567b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/internal/util/sysreadfile_linux.go @@ -0,0 +1,45 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build !windows + +package util + +import ( + "bytes" + "os" + "syscall" +) + +// SysReadFile is a simplified ioutil.ReadFile that invokes syscall.Read directly. +// https://github.com/prometheus/node_exporter/pull/728/files +func SysReadFile(file string) (string, error) { + f, err := os.Open(file) + if err != nil { + return "", err + } + defer f.Close() + + // On some machines, hwmon drivers are broken and return EAGAIN. This causes + // Go's ioutil.ReadFile implementation to poll forever. + // + // Since we either want to read data or bail immediately, do the simplest + // possible read using syscall directly. + b := make([]byte, 128) + n, err := syscall.Read(int(f.Fd()), b) + if err != nil { + return "", err + } + + return string(bytes.TrimSpace(b[:n])), nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/ipvs.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/ipvs.go new file mode 100644 index 00000000..e36d4a3b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/ipvs.go @@ -0,0 +1,259 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "bufio" + "encoding/hex" + "errors" + "fmt" + "io" + "io/ioutil" + "net" + "os" + "strconv" + "strings" +) + +// IPVSStats holds IPVS statistics, as exposed by the kernel in `/proc/net/ip_vs_stats`. +type IPVSStats struct { + // Total count of connections. + Connections uint64 + // Total incoming packages processed. + IncomingPackets uint64 + // Total outgoing packages processed. + OutgoingPackets uint64 + // Total incoming traffic. + IncomingBytes uint64 + // Total outgoing traffic. + OutgoingBytes uint64 +} + +// IPVSBackendStatus holds current metrics of one virtual / real address pair. +type IPVSBackendStatus struct { + // The local (virtual) IP address. + LocalAddress net.IP + // The remote (real) IP address. + RemoteAddress net.IP + // The local (virtual) port. + LocalPort uint16 + // The remote (real) port. + RemotePort uint16 + // The local firewall mark + LocalMark string + // The transport protocol (TCP, UDP). + Proto string + // The current number of active connections for this virtual/real address pair. + ActiveConn uint64 + // The current number of inactive connections for this virtual/real address pair. + InactConn uint64 + // The current weight of this virtual/real address pair. + Weight uint64 +} + +// NewIPVSStats reads the IPVS statistics. +func NewIPVSStats() (IPVSStats, error) { + fs, err := NewFS(DefaultMountPoint) + if err != nil { + return IPVSStats{}, err + } + + return fs.NewIPVSStats() +} + +// NewIPVSStats reads the IPVS statistics from the specified `proc` filesystem. +func (fs FS) NewIPVSStats() (IPVSStats, error) { + file, err := os.Open(fs.Path("net/ip_vs_stats")) + if err != nil { + return IPVSStats{}, err + } + defer file.Close() + + return parseIPVSStats(file) +} + +// parseIPVSStats performs the actual parsing of `ip_vs_stats`. +func parseIPVSStats(file io.Reader) (IPVSStats, error) { + var ( + statContent []byte + statLines []string + statFields []string + stats IPVSStats + ) + + statContent, err := ioutil.ReadAll(file) + if err != nil { + return IPVSStats{}, err + } + + statLines = strings.SplitN(string(statContent), "\n", 4) + if len(statLines) != 4 { + return IPVSStats{}, errors.New("ip_vs_stats corrupt: too short") + } + + statFields = strings.Fields(statLines[2]) + if len(statFields) != 5 { + return IPVSStats{}, errors.New("ip_vs_stats corrupt: unexpected number of fields") + } + + stats.Connections, err = strconv.ParseUint(statFields[0], 16, 64) + if err != nil { + return IPVSStats{}, err + } + stats.IncomingPackets, err = strconv.ParseUint(statFields[1], 16, 64) + if err != nil { + return IPVSStats{}, err + } + stats.OutgoingPackets, err = strconv.ParseUint(statFields[2], 16, 64) + if err != nil { + return IPVSStats{}, err + } + stats.IncomingBytes, err = strconv.ParseUint(statFields[3], 16, 64) + if err != nil { + return IPVSStats{}, err + } + stats.OutgoingBytes, err = strconv.ParseUint(statFields[4], 16, 64) + if err != nil { + return IPVSStats{}, err + } + + return stats, nil +} + +// NewIPVSBackendStatus reads and returns the status of all (virtual,real) server pairs. +func NewIPVSBackendStatus() ([]IPVSBackendStatus, error) { + fs, err := NewFS(DefaultMountPoint) + if err != nil { + return []IPVSBackendStatus{}, err + } + + return fs.NewIPVSBackendStatus() +} + +// NewIPVSBackendStatus reads and returns the status of all (virtual,real) server pairs from the specified `proc` filesystem. +func (fs FS) NewIPVSBackendStatus() ([]IPVSBackendStatus, error) { + file, err := os.Open(fs.Path("net/ip_vs")) + if err != nil { + return nil, err + } + defer file.Close() + + return parseIPVSBackendStatus(file) +} + +func parseIPVSBackendStatus(file io.Reader) ([]IPVSBackendStatus, error) { + var ( + status []IPVSBackendStatus + scanner = bufio.NewScanner(file) + proto string + localMark string + localAddress net.IP + localPort uint16 + err error + ) + + for scanner.Scan() { + fields := strings.Fields(scanner.Text()) + if len(fields) == 0 { + continue + } + switch { + case fields[0] == "IP" || fields[0] == "Prot" || fields[1] == "RemoteAddress:Port": + continue + case fields[0] == "TCP" || fields[0] == "UDP": + if len(fields) < 2 { + continue + } + proto = fields[0] + localMark = "" + localAddress, localPort, err = parseIPPort(fields[1]) + if err != nil { + return nil, err + } + case fields[0] == "FWM": + if len(fields) < 2 { + continue + } + proto = fields[0] + localMark = fields[1] + localAddress = nil + localPort = 0 + case fields[0] == "->": + if len(fields) < 6 { + continue + } + remoteAddress, remotePort, err := parseIPPort(fields[1]) + if err != nil { + return nil, err + } + weight, err := strconv.ParseUint(fields[3], 10, 64) + if err != nil { + return nil, err + } + activeConn, err := strconv.ParseUint(fields[4], 10, 64) + if err != nil { + return nil, err + } + inactConn, err := strconv.ParseUint(fields[5], 10, 64) + if err != nil { + return nil, err + } + status = append(status, IPVSBackendStatus{ + LocalAddress: localAddress, + LocalPort: localPort, + LocalMark: localMark, + RemoteAddress: remoteAddress, + RemotePort: remotePort, + Proto: proto, + Weight: weight, + ActiveConn: activeConn, + InactConn: inactConn, + }) + } + } + return status, nil +} + +func parseIPPort(s string) (net.IP, uint16, error) { + var ( + ip net.IP + err error + ) + + switch len(s) { + case 13: + ip, err = hex.DecodeString(s[0:8]) + if err != nil { + return nil, 0, err + } + case 46: + ip = net.ParseIP(s[1:40]) + if ip == nil { + return nil, 0, fmt.Errorf("invalid IPv6 address: %s", s[1:40]) + } + default: + return nil, 0, fmt.Errorf("unexpected IP:Port: %s", s) + } + + portString := s[len(s)-4:] + if len(portString) != 4 { + return nil, 0, fmt.Errorf("unexpected port string format: %s", portString) + } + port, err := strconv.ParseUint(portString, 16, 16) + if err != nil { + return nil, 0, err + } + + return ip, uint16(port), nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/mdstat.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/mdstat.go new file mode 100644 index 00000000..9dc19583 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/mdstat.go @@ -0,0 +1,151 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "fmt" + "io/ioutil" + "regexp" + "strconv" + "strings" +) + +var ( + statuslineRE = regexp.MustCompile(`(\d+) blocks .*\[(\d+)/(\d+)\] \[[U_]+\]`) + buildlineRE = regexp.MustCompile(`\((\d+)/\d+\)`) +) + +// MDStat holds info parsed from /proc/mdstat. +type MDStat struct { + // Name of the device. + Name string + // activity-state of the device. + ActivityState string + // Number of active disks. + DisksActive int64 + // Total number of disks the device consists of. + DisksTotal int64 + // Number of blocks the device holds. + BlocksTotal int64 + // Number of blocks on the device that are in sync. + BlocksSynced int64 +} + +// ParseMDStat parses an mdstat-file and returns a struct with the relevant infos. +func (fs FS) ParseMDStat() (mdstates []MDStat, err error) { + mdStatusFilePath := fs.Path("mdstat") + content, err := ioutil.ReadFile(mdStatusFilePath) + if err != nil { + return []MDStat{}, fmt.Errorf("error parsing %s: %s", mdStatusFilePath, err) + } + + mdStates := []MDStat{} + lines := strings.Split(string(content), "\n") + for i, l := range lines { + if l == "" { + continue + } + if l[0] == ' ' { + continue + } + if strings.HasPrefix(l, "Personalities") || strings.HasPrefix(l, "unused") { + continue + } + + mainLine := strings.Split(l, " ") + if len(mainLine) < 3 { + return mdStates, fmt.Errorf("error parsing mdline: %s", l) + } + mdName := mainLine[0] + activityState := mainLine[2] + + if len(lines) <= i+3 { + return mdStates, fmt.Errorf( + "error parsing %s: too few lines for md device %s", + mdStatusFilePath, + mdName, + ) + } + + active, total, size, err := evalStatusline(lines[i+1]) + if err != nil { + return mdStates, fmt.Errorf("error parsing %s: %s", mdStatusFilePath, err) + } + + // j is the line number of the syncing-line. + j := i + 2 + if strings.Contains(lines[i+2], "bitmap") { // skip bitmap line + j = i + 3 + } + + // If device is syncing at the moment, get the number of currently + // synced bytes, otherwise that number equals the size of the device. + syncedBlocks := size + if strings.Contains(lines[j], "recovery") || strings.Contains(lines[j], "resync") { + syncedBlocks, err = evalBuildline(lines[j]) + if err != nil { + return mdStates, fmt.Errorf("error parsing %s: %s", mdStatusFilePath, err) + } + } + + mdStates = append(mdStates, MDStat{ + Name: mdName, + ActivityState: activityState, + DisksActive: active, + DisksTotal: total, + BlocksTotal: size, + BlocksSynced: syncedBlocks, + }) + } + + return mdStates, nil +} + +func evalStatusline(statusline string) (active, total, size int64, err error) { + matches := statuslineRE.FindStringSubmatch(statusline) + if len(matches) != 4 { + return 0, 0, 0, fmt.Errorf("unexpected statusline: %s", statusline) + } + + size, err = strconv.ParseInt(matches[1], 10, 64) + if err != nil { + return 0, 0, 0, fmt.Errorf("unexpected statusline %s: %s", statusline, err) + } + + total, err = strconv.ParseInt(matches[2], 10, 64) + if err != nil { + return 0, 0, 0, fmt.Errorf("unexpected statusline %s: %s", statusline, err) + } + + active, err = strconv.ParseInt(matches[3], 10, 64) + if err != nil { + return 0, 0, 0, fmt.Errorf("unexpected statusline %s: %s", statusline, err) + } + + return active, total, size, nil +} + +func evalBuildline(buildline string) (syncedBlocks int64, err error) { + matches := buildlineRE.FindStringSubmatch(buildline) + if len(matches) != 2 { + return 0, fmt.Errorf("unexpected buildline: %s", buildline) + } + + syncedBlocks, err = strconv.ParseInt(matches[1], 10, 64) + if err != nil { + return 0, fmt.Errorf("%s in buildline: %s", err, buildline) + } + + return syncedBlocks, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/mountstats.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/mountstats.go new file mode 100644 index 00000000..7a8a1e09 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/mountstats.go @@ -0,0 +1,606 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +// While implementing parsing of /proc/[pid]/mountstats, this blog was used +// heavily as a reference: +// https://utcc.utoronto.ca/~cks/space/blog/linux/NFSMountstatsIndex +// +// Special thanks to Chris Siebenmann for all of his posts explaining the +// various statistics available for NFS. + +import ( + "bufio" + "fmt" + "io" + "strconv" + "strings" + "time" +) + +// Constants shared between multiple functions. +const ( + deviceEntryLen = 8 + + fieldBytesLen = 8 + fieldEventsLen = 27 + + statVersion10 = "1.0" + statVersion11 = "1.1" + + fieldTransport10TCPLen = 10 + fieldTransport10UDPLen = 7 + + fieldTransport11TCPLen = 13 + fieldTransport11UDPLen = 10 +) + +// A Mount is a device mount parsed from /proc/[pid]/mountstats. +type Mount struct { + // Name of the device. + Device string + // The mount point of the device. + Mount string + // The filesystem type used by the device. + Type string + // If available additional statistics related to this Mount. + // Use a type assertion to determine if additional statistics are available. + Stats MountStats +} + +// A MountStats is a type which contains detailed statistics for a specific +// type of Mount. +type MountStats interface { + mountStats() +} + +// A MountStatsNFS is a MountStats implementation for NFSv3 and v4 mounts. +type MountStatsNFS struct { + // The version of statistics provided. + StatVersion string + // The age of the NFS mount. + Age time.Duration + // Statistics related to byte counters for various operations. + Bytes NFSBytesStats + // Statistics related to various NFS event occurrences. + Events NFSEventsStats + // Statistics broken down by filesystem operation. + Operations []NFSOperationStats + // Statistics about the NFS RPC transport. + Transport NFSTransportStats +} + +// mountStats implements MountStats. +func (m MountStatsNFS) mountStats() {} + +// A NFSBytesStats contains statistics about the number of bytes read and written +// by an NFS client to and from an NFS server. +type NFSBytesStats struct { + // Number of bytes read using the read() syscall. + Read uint64 + // Number of bytes written using the write() syscall. + Write uint64 + // Number of bytes read using the read() syscall in O_DIRECT mode. + DirectRead uint64 + // Number of bytes written using the write() syscall in O_DIRECT mode. + DirectWrite uint64 + // Number of bytes read from the NFS server, in total. + ReadTotal uint64 + // Number of bytes written to the NFS server, in total. + WriteTotal uint64 + // Number of pages read directly via mmap()'d files. + ReadPages uint64 + // Number of pages written directly via mmap()'d files. + WritePages uint64 +} + +// A NFSEventsStats contains statistics about NFS event occurrences. +type NFSEventsStats struct { + // Number of times cached inode attributes are re-validated from the server. + InodeRevalidate uint64 + // Number of times cached dentry nodes are re-validated from the server. + DnodeRevalidate uint64 + // Number of times an inode cache is cleared. + DataInvalidate uint64 + // Number of times cached inode attributes are invalidated. + AttributeInvalidate uint64 + // Number of times files or directories have been open()'d. + VFSOpen uint64 + // Number of times a directory lookup has occurred. + VFSLookup uint64 + // Number of times permissions have been checked. + VFSAccess uint64 + // Number of updates (and potential writes) to pages. + VFSUpdatePage uint64 + // Number of pages read directly via mmap()'d files. + VFSReadPage uint64 + // Number of times a group of pages have been read. + VFSReadPages uint64 + // Number of pages written directly via mmap()'d files. + VFSWritePage uint64 + // Number of times a group of pages have been written. + VFSWritePages uint64 + // Number of times directory entries have been read with getdents(). + VFSGetdents uint64 + // Number of times attributes have been set on inodes. + VFSSetattr uint64 + // Number of pending writes that have been forcefully flushed to the server. + VFSFlush uint64 + // Number of times fsync() has been called on directories and files. + VFSFsync uint64 + // Number of times locking has been attempted on a file. + VFSLock uint64 + // Number of times files have been closed and released. + VFSFileRelease uint64 + // Unknown. Possibly unused. + CongestionWait uint64 + // Number of times files have been truncated. + Truncation uint64 + // Number of times a file has been grown due to writes beyond its existing end. + WriteExtension uint64 + // Number of times a file was removed while still open by another process. + SillyRename uint64 + // Number of times the NFS server gave less data than expected while reading. + ShortRead uint64 + // Number of times the NFS server wrote less data than expected while writing. + ShortWrite uint64 + // Number of times the NFS server indicated EJUKEBOX; retrieving data from + // offline storage. + JukeboxDelay uint64 + // Number of NFS v4.1+ pNFS reads. + PNFSRead uint64 + // Number of NFS v4.1+ pNFS writes. + PNFSWrite uint64 +} + +// A NFSOperationStats contains statistics for a single operation. +type NFSOperationStats struct { + // The name of the operation. + Operation string + // Number of requests performed for this operation. + Requests uint64 + // Number of times an actual RPC request has been transmitted for this operation. + Transmissions uint64 + // Number of times a request has had a major timeout. + MajorTimeouts uint64 + // Number of bytes sent for this operation, including RPC headers and payload. + BytesSent uint64 + // Number of bytes received for this operation, including RPC headers and payload. + BytesReceived uint64 + // Duration all requests spent queued for transmission before they were sent. + CumulativeQueueTime time.Duration + // Duration it took to get a reply back after the request was transmitted. + CumulativeTotalResponseTime time.Duration + // Duration from when a request was enqueued to when it was completely handled. + CumulativeTotalRequestTime time.Duration +} + +// A NFSTransportStats contains statistics for the NFS mount RPC requests and +// responses. +type NFSTransportStats struct { + // The transport protocol used for the NFS mount. + Protocol string + // The local port used for the NFS mount. + Port uint64 + // Number of times the client has had to establish a connection from scratch + // to the NFS server. + Bind uint64 + // Number of times the client has made a TCP connection to the NFS server. + Connect uint64 + // Duration (in jiffies, a kernel internal unit of time) the NFS mount has + // spent waiting for connections to the server to be established. + ConnectIdleTime uint64 + // Duration since the NFS mount last saw any RPC traffic. + IdleTime time.Duration + // Number of RPC requests for this mount sent to the NFS server. + Sends uint64 + // Number of RPC responses for this mount received from the NFS server. + Receives uint64 + // Number of times the NFS server sent a response with a transaction ID + // unknown to this client. + BadTransactionIDs uint64 + // A running counter, incremented on each request as the current difference + // ebetween sends and receives. + CumulativeActiveRequests uint64 + // A running counter, incremented on each request by the current backlog + // queue size. + CumulativeBacklog uint64 + + // Stats below only available with stat version 1.1. + + // Maximum number of simultaneously active RPC requests ever used. + MaximumRPCSlotsUsed uint64 + // A running counter, incremented on each request as the current size of the + // sending queue. + CumulativeSendingQueue uint64 + // A running counter, incremented on each request as the current size of the + // pending queue. + CumulativePendingQueue uint64 +} + +// parseMountStats parses a /proc/[pid]/mountstats file and returns a slice +// of Mount structures containing detailed information about each mount. +// If available, statistics for each mount are parsed as well. +func parseMountStats(r io.Reader) ([]*Mount, error) { + const ( + device = "device" + statVersionPrefix = "statvers=" + + nfs3Type = "nfs" + nfs4Type = "nfs4" + ) + + var mounts []*Mount + + s := bufio.NewScanner(r) + for s.Scan() { + // Only look for device entries in this function + ss := strings.Fields(string(s.Bytes())) + if len(ss) == 0 || ss[0] != device { + continue + } + + m, err := parseMount(ss) + if err != nil { + return nil, err + } + + // Does this mount also possess statistics information? + if len(ss) > deviceEntryLen { + // Only NFSv3 and v4 are supported for parsing statistics + if m.Type != nfs3Type && m.Type != nfs4Type { + return nil, fmt.Errorf("cannot parse MountStats for fstype %q", m.Type) + } + + statVersion := strings.TrimPrefix(ss[8], statVersionPrefix) + + stats, err := parseMountStatsNFS(s, statVersion) + if err != nil { + return nil, err + } + + m.Stats = stats + } + + mounts = append(mounts, m) + } + + return mounts, s.Err() +} + +// parseMount parses an entry in /proc/[pid]/mountstats in the format: +// device [device] mounted on [mount] with fstype [type] +func parseMount(ss []string) (*Mount, error) { + if len(ss) < deviceEntryLen { + return nil, fmt.Errorf("invalid device entry: %v", ss) + } + + // Check for specific words appearing at specific indices to ensure + // the format is consistent with what we expect + format := []struct { + i int + s string + }{ + {i: 0, s: "device"}, + {i: 2, s: "mounted"}, + {i: 3, s: "on"}, + {i: 5, s: "with"}, + {i: 6, s: "fstype"}, + } + + for _, f := range format { + if ss[f.i] != f.s { + return nil, fmt.Errorf("invalid device entry: %v", ss) + } + } + + return &Mount{ + Device: ss[1], + Mount: ss[4], + Type: ss[7], + }, nil +} + +// parseMountStatsNFS parses a MountStatsNFS by scanning additional information +// related to NFS statistics. +func parseMountStatsNFS(s *bufio.Scanner, statVersion string) (*MountStatsNFS, error) { + // Field indicators for parsing specific types of data + const ( + fieldAge = "age:" + fieldBytes = "bytes:" + fieldEvents = "events:" + fieldPerOpStats = "per-op" + fieldTransport = "xprt:" + ) + + stats := &MountStatsNFS{ + StatVersion: statVersion, + } + + for s.Scan() { + ss := strings.Fields(string(s.Bytes())) + if len(ss) == 0 { + break + } + if len(ss) < 2 { + return nil, fmt.Errorf("not enough information for NFS stats: %v", ss) + } + + switch ss[0] { + case fieldAge: + // Age integer is in seconds + d, err := time.ParseDuration(ss[1] + "s") + if err != nil { + return nil, err + } + + stats.Age = d + case fieldBytes: + bstats, err := parseNFSBytesStats(ss[1:]) + if err != nil { + return nil, err + } + + stats.Bytes = *bstats + case fieldEvents: + estats, err := parseNFSEventsStats(ss[1:]) + if err != nil { + return nil, err + } + + stats.Events = *estats + case fieldTransport: + if len(ss) < 3 { + return nil, fmt.Errorf("not enough information for NFS transport stats: %v", ss) + } + + tstats, err := parseNFSTransportStats(ss[1:], statVersion) + if err != nil { + return nil, err + } + + stats.Transport = *tstats + } + + // When encountering "per-operation statistics", we must break this + // loop and parse them separately to ensure we can terminate parsing + // before reaching another device entry; hence why this 'if' statement + // is not just another switch case + if ss[0] == fieldPerOpStats { + break + } + } + + if err := s.Err(); err != nil { + return nil, err + } + + // NFS per-operation stats appear last before the next device entry + perOpStats, err := parseNFSOperationStats(s) + if err != nil { + return nil, err + } + + stats.Operations = perOpStats + + return stats, nil +} + +// parseNFSBytesStats parses a NFSBytesStats line using an input set of +// integer fields. +func parseNFSBytesStats(ss []string) (*NFSBytesStats, error) { + if len(ss) != fieldBytesLen { + return nil, fmt.Errorf("invalid NFS bytes stats: %v", ss) + } + + ns := make([]uint64, 0, fieldBytesLen) + for _, s := range ss { + n, err := strconv.ParseUint(s, 10, 64) + if err != nil { + return nil, err + } + + ns = append(ns, n) + } + + return &NFSBytesStats{ + Read: ns[0], + Write: ns[1], + DirectRead: ns[2], + DirectWrite: ns[3], + ReadTotal: ns[4], + WriteTotal: ns[5], + ReadPages: ns[6], + WritePages: ns[7], + }, nil +} + +// parseNFSEventsStats parses a NFSEventsStats line using an input set of +// integer fields. +func parseNFSEventsStats(ss []string) (*NFSEventsStats, error) { + if len(ss) != fieldEventsLen { + return nil, fmt.Errorf("invalid NFS events stats: %v", ss) + } + + ns := make([]uint64, 0, fieldEventsLen) + for _, s := range ss { + n, err := strconv.ParseUint(s, 10, 64) + if err != nil { + return nil, err + } + + ns = append(ns, n) + } + + return &NFSEventsStats{ + InodeRevalidate: ns[0], + DnodeRevalidate: ns[1], + DataInvalidate: ns[2], + AttributeInvalidate: ns[3], + VFSOpen: ns[4], + VFSLookup: ns[5], + VFSAccess: ns[6], + VFSUpdatePage: ns[7], + VFSReadPage: ns[8], + VFSReadPages: ns[9], + VFSWritePage: ns[10], + VFSWritePages: ns[11], + VFSGetdents: ns[12], + VFSSetattr: ns[13], + VFSFlush: ns[14], + VFSFsync: ns[15], + VFSLock: ns[16], + VFSFileRelease: ns[17], + CongestionWait: ns[18], + Truncation: ns[19], + WriteExtension: ns[20], + SillyRename: ns[21], + ShortRead: ns[22], + ShortWrite: ns[23], + JukeboxDelay: ns[24], + PNFSRead: ns[25], + PNFSWrite: ns[26], + }, nil +} + +// parseNFSOperationStats parses a slice of NFSOperationStats by scanning +// additional information about per-operation statistics until an empty +// line is reached. +func parseNFSOperationStats(s *bufio.Scanner) ([]NFSOperationStats, error) { + const ( + // Number of expected fields in each per-operation statistics set + numFields = 9 + ) + + var ops []NFSOperationStats + + for s.Scan() { + ss := strings.Fields(string(s.Bytes())) + if len(ss) == 0 { + // Must break when reading a blank line after per-operation stats to + // enable top-level function to parse the next device entry + break + } + + if len(ss) != numFields { + return nil, fmt.Errorf("invalid NFS per-operations stats: %v", ss) + } + + // Skip string operation name for integers + ns := make([]uint64, 0, numFields-1) + for _, st := range ss[1:] { + n, err := strconv.ParseUint(st, 10, 64) + if err != nil { + return nil, err + } + + ns = append(ns, n) + } + + ops = append(ops, NFSOperationStats{ + Operation: strings.TrimSuffix(ss[0], ":"), + Requests: ns[0], + Transmissions: ns[1], + MajorTimeouts: ns[2], + BytesSent: ns[3], + BytesReceived: ns[4], + CumulativeQueueTime: time.Duration(ns[5]) * time.Millisecond, + CumulativeTotalResponseTime: time.Duration(ns[6]) * time.Millisecond, + CumulativeTotalRequestTime: time.Duration(ns[7]) * time.Millisecond, + }) + } + + return ops, s.Err() +} + +// parseNFSTransportStats parses a NFSTransportStats line using an input set of +// integer fields matched to a specific stats version. +func parseNFSTransportStats(ss []string, statVersion string) (*NFSTransportStats, error) { + // Extract the protocol field. It is the only string value in the line + protocol := ss[0] + ss = ss[1:] + + switch statVersion { + case statVersion10: + var expectedLength int + if protocol == "tcp" { + expectedLength = fieldTransport10TCPLen + } else if protocol == "udp" { + expectedLength = fieldTransport10UDPLen + } else { + return nil, fmt.Errorf("invalid NFS protocol \"%s\" in stats 1.0 statement: %v", protocol, ss) + } + if len(ss) != expectedLength { + return nil, fmt.Errorf("invalid NFS transport stats 1.0 statement: %v", ss) + } + case statVersion11: + var expectedLength int + if protocol == "tcp" { + expectedLength = fieldTransport11TCPLen + } else if protocol == "udp" { + expectedLength = fieldTransport11UDPLen + } else { + return nil, fmt.Errorf("invalid NFS protocol \"%s\" in stats 1.1 statement: %v", protocol, ss) + } + if len(ss) != expectedLength { + return nil, fmt.Errorf("invalid NFS transport stats 1.1 statement: %v", ss) + } + default: + return nil, fmt.Errorf("unrecognized NFS transport stats version: %q", statVersion) + } + + // Allocate enough for v1.1 stats since zero value for v1.1 stats will be okay + // in a v1.0 response. Since the stat length is bigger for TCP stats, we use + // the TCP length here. + // + // Note: slice length must be set to length of v1.1 stats to avoid a panic when + // only v1.0 stats are present. + // See: https://github.com/prometheus/node_exporter/issues/571. + ns := make([]uint64, fieldTransport11TCPLen) + for i, s := range ss { + n, err := strconv.ParseUint(s, 10, 64) + if err != nil { + return nil, err + } + + ns[i] = n + } + + // The fields differ depending on the transport protocol (TCP or UDP) + // From https://utcc.utoronto.ca/%7Ecks/space/blog/linux/NFSMountstatsXprt + // + // For the udp RPC transport there is no connection count, connect idle time, + // or idle time (fields #3, #4, and #5); all other fields are the same. So + // we set them to 0 here. + if protocol == "udp" { + ns = append(ns[:2], append(make([]uint64, 3), ns[2:]...)...) + } + + return &NFSTransportStats{ + Protocol: protocol, + Port: ns[0], + Bind: ns[1], + Connect: ns[2], + ConnectIdleTime: ns[3], + IdleTime: time.Duration(ns[4]) * time.Second, + Sends: ns[5], + Receives: ns[6], + BadTransactionIDs: ns[7], + CumulativeActiveRequests: ns[8], + CumulativeBacklog: ns[9], + MaximumRPCSlotsUsed: ns[10], + CumulativeSendingQueue: ns[11], + CumulativePendingQueue: ns[12], + }, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/net_dev.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/net_dev.go new file mode 100644 index 00000000..3f252337 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/net_dev.go @@ -0,0 +1,216 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "bufio" + "errors" + "os" + "sort" + "strconv" + "strings" +) + +// NetDevLine is single line parsed from /proc/net/dev or /proc/[pid]/net/dev. +type NetDevLine struct { + Name string `json:"name"` // The name of the interface. + RxBytes uint64 `json:"rx_bytes"` // Cumulative count of bytes received. + RxPackets uint64 `json:"rx_packets"` // Cumulative count of packets received. + RxErrors uint64 `json:"rx_errors"` // Cumulative count of receive errors encountered. + RxDropped uint64 `json:"rx_dropped"` // Cumulative count of packets dropped while receiving. + RxFIFO uint64 `json:"rx_fifo"` // Cumulative count of FIFO buffer errors. + RxFrame uint64 `json:"rx_frame"` // Cumulative count of packet framing errors. + RxCompressed uint64 `json:"rx_compressed"` // Cumulative count of compressed packets received by the device driver. + RxMulticast uint64 `json:"rx_multicast"` // Cumulative count of multicast frames received by the device driver. + TxBytes uint64 `json:"tx_bytes"` // Cumulative count of bytes transmitted. + TxPackets uint64 `json:"tx_packets"` // Cumulative count of packets transmitted. + TxErrors uint64 `json:"tx_errors"` // Cumulative count of transmit errors encountered. + TxDropped uint64 `json:"tx_dropped"` // Cumulative count of packets dropped while transmitting. + TxFIFO uint64 `json:"tx_fifo"` // Cumulative count of FIFO buffer errors. + TxCollisions uint64 `json:"tx_collisions"` // Cumulative count of collisions detected on the interface. + TxCarrier uint64 `json:"tx_carrier"` // Cumulative count of carrier losses detected by the device driver. + TxCompressed uint64 `json:"tx_compressed"` // Cumulative count of compressed packets transmitted by the device driver. +} + +// NetDev is parsed from /proc/net/dev or /proc/[pid]/net/dev. The map keys +// are interface names. +type NetDev map[string]NetDevLine + +// NewNetDev returns kernel/system statistics read from /proc/net/dev. +func NewNetDev() (NetDev, error) { + fs, err := NewFS(DefaultMountPoint) + if err != nil { + return nil, err + } + + return fs.NewNetDev() +} + +// NewNetDev returns kernel/system statistics read from /proc/net/dev. +func (fs FS) NewNetDev() (NetDev, error) { + return newNetDev(fs.Path("net/dev")) +} + +// NewNetDev returns kernel/system statistics read from /proc/[pid]/net/dev. +func (p Proc) NewNetDev() (NetDev, error) { + return newNetDev(p.path("net/dev")) +} + +// newNetDev creates a new NetDev from the contents of the given file. +func newNetDev(file string) (NetDev, error) { + f, err := os.Open(file) + if err != nil { + return NetDev{}, err + } + defer f.Close() + + nd := NetDev{} + s := bufio.NewScanner(f) + for n := 0; s.Scan(); n++ { + // Skip the 2 header lines. + if n < 2 { + continue + } + + line, err := nd.parseLine(s.Text()) + if err != nil { + return nd, err + } + + nd[line.Name] = *line + } + + return nd, s.Err() +} + +// parseLine parses a single line from the /proc/net/dev file. Header lines +// must be filtered prior to calling this method. +func (nd NetDev) parseLine(rawLine string) (*NetDevLine, error) { + parts := strings.SplitN(rawLine, ":", 2) + if len(parts) != 2 { + return nil, errors.New("invalid net/dev line, missing colon") + } + fields := strings.Fields(strings.TrimSpace(parts[1])) + + var err error + line := &NetDevLine{} + + // Interface Name + line.Name = strings.TrimSpace(parts[0]) + if line.Name == "" { + return nil, errors.New("invalid net/dev line, empty interface name") + } + + // RX + line.RxBytes, err = strconv.ParseUint(fields[0], 10, 64) + if err != nil { + return nil, err + } + line.RxPackets, err = strconv.ParseUint(fields[1], 10, 64) + if err != nil { + return nil, err + } + line.RxErrors, err = strconv.ParseUint(fields[2], 10, 64) + if err != nil { + return nil, err + } + line.RxDropped, err = strconv.ParseUint(fields[3], 10, 64) + if err != nil { + return nil, err + } + line.RxFIFO, err = strconv.ParseUint(fields[4], 10, 64) + if err != nil { + return nil, err + } + line.RxFrame, err = strconv.ParseUint(fields[5], 10, 64) + if err != nil { + return nil, err + } + line.RxCompressed, err = strconv.ParseUint(fields[6], 10, 64) + if err != nil { + return nil, err + } + line.RxMulticast, err = strconv.ParseUint(fields[7], 10, 64) + if err != nil { + return nil, err + } + + // TX + line.TxBytes, err = strconv.ParseUint(fields[8], 10, 64) + if err != nil { + return nil, err + } + line.TxPackets, err = strconv.ParseUint(fields[9], 10, 64) + if err != nil { + return nil, err + } + line.TxErrors, err = strconv.ParseUint(fields[10], 10, 64) + if err != nil { + return nil, err + } + line.TxDropped, err = strconv.ParseUint(fields[11], 10, 64) + if err != nil { + return nil, err + } + line.TxFIFO, err = strconv.ParseUint(fields[12], 10, 64) + if err != nil { + return nil, err + } + line.TxCollisions, err = strconv.ParseUint(fields[13], 10, 64) + if err != nil { + return nil, err + } + line.TxCarrier, err = strconv.ParseUint(fields[14], 10, 64) + if err != nil { + return nil, err + } + line.TxCompressed, err = strconv.ParseUint(fields[15], 10, 64) + if err != nil { + return nil, err + } + + return line, nil +} + +// Total aggregates the values across interfaces and returns a new NetDevLine. +// The Name field will be a sorted comma separated list of interface names. +func (nd NetDev) Total() NetDevLine { + total := NetDevLine{} + + names := make([]string, 0, len(nd)) + for _, ifc := range nd { + names = append(names, ifc.Name) + total.RxBytes += ifc.RxBytes + total.RxPackets += ifc.RxPackets + total.RxPackets += ifc.RxPackets + total.RxErrors += ifc.RxErrors + total.RxDropped += ifc.RxDropped + total.RxFIFO += ifc.RxFIFO + total.RxFrame += ifc.RxFrame + total.RxCompressed += ifc.RxCompressed + total.RxMulticast += ifc.RxMulticast + total.TxBytes += ifc.TxBytes + total.TxPackets += ifc.TxPackets + total.TxErrors += ifc.TxErrors + total.TxDropped += ifc.TxDropped + total.TxFIFO += ifc.TxFIFO + total.TxCollisions += ifc.TxCollisions + total.TxCarrier += ifc.TxCarrier + total.TxCompressed += ifc.TxCompressed + } + sort.Strings(names) + total.Name = strings.Join(names, ", ") + + return total +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/nfs/nfs.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/nfs/nfs.go new file mode 100644 index 00000000..651bf681 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/nfs/nfs.go @@ -0,0 +1,263 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package nfs implements parsing of /proc/net/rpc/nfsd. +// Fields are documented in https://www.svennd.be/nfsd-stats-explained-procnetrpcnfsd/ +package nfs + +// ReplyCache models the "rc" line. +type ReplyCache struct { + Hits uint64 + Misses uint64 + NoCache uint64 +} + +// FileHandles models the "fh" line. +type FileHandles struct { + Stale uint64 + TotalLookups uint64 + AnonLookups uint64 + DirNoCache uint64 + NoDirNoCache uint64 +} + +// InputOutput models the "io" line. +type InputOutput struct { + Read uint64 + Write uint64 +} + +// Threads models the "th" line. +type Threads struct { + Threads uint64 + FullCnt uint64 +} + +// ReadAheadCache models the "ra" line. +type ReadAheadCache struct { + CacheSize uint64 + CacheHistogram []uint64 + NotFound uint64 +} + +// Network models the "net" line. +type Network struct { + NetCount uint64 + UDPCount uint64 + TCPCount uint64 + TCPConnect uint64 +} + +// ClientRPC models the nfs "rpc" line. +type ClientRPC struct { + RPCCount uint64 + Retransmissions uint64 + AuthRefreshes uint64 +} + +// ServerRPC models the nfsd "rpc" line. +type ServerRPC struct { + RPCCount uint64 + BadCnt uint64 + BadFmt uint64 + BadAuth uint64 + BadcInt uint64 +} + +// V2Stats models the "proc2" line. +type V2Stats struct { + Null uint64 + GetAttr uint64 + SetAttr uint64 + Root uint64 + Lookup uint64 + ReadLink uint64 + Read uint64 + WrCache uint64 + Write uint64 + Create uint64 + Remove uint64 + Rename uint64 + Link uint64 + SymLink uint64 + MkDir uint64 + RmDir uint64 + ReadDir uint64 + FsStat uint64 +} + +// V3Stats models the "proc3" line. +type V3Stats struct { + Null uint64 + GetAttr uint64 + SetAttr uint64 + Lookup uint64 + Access uint64 + ReadLink uint64 + Read uint64 + Write uint64 + Create uint64 + MkDir uint64 + SymLink uint64 + MkNod uint64 + Remove uint64 + RmDir uint64 + Rename uint64 + Link uint64 + ReadDir uint64 + ReadDirPlus uint64 + FsStat uint64 + FsInfo uint64 + PathConf uint64 + Commit uint64 +} + +// ClientV4Stats models the nfs "proc4" line. +type ClientV4Stats struct { + Null uint64 + Read uint64 + Write uint64 + Commit uint64 + Open uint64 + OpenConfirm uint64 + OpenNoattr uint64 + OpenDowngrade uint64 + Close uint64 + Setattr uint64 + FsInfo uint64 + Renew uint64 + SetClientID uint64 + SetClientIDConfirm uint64 + Lock uint64 + Lockt uint64 + Locku uint64 + Access uint64 + Getattr uint64 + Lookup uint64 + LookupRoot uint64 + Remove uint64 + Rename uint64 + Link uint64 + Symlink uint64 + Create uint64 + Pathconf uint64 + StatFs uint64 + ReadLink uint64 + ReadDir uint64 + ServerCaps uint64 + DelegReturn uint64 + GetACL uint64 + SetACL uint64 + FsLocations uint64 + ReleaseLockowner uint64 + Secinfo uint64 + FsidPresent uint64 + ExchangeID uint64 + CreateSession uint64 + DestroySession uint64 + Sequence uint64 + GetLeaseTime uint64 + ReclaimComplete uint64 + LayoutGet uint64 + GetDeviceInfo uint64 + LayoutCommit uint64 + LayoutReturn uint64 + SecinfoNoName uint64 + TestStateID uint64 + FreeStateID uint64 + GetDeviceList uint64 + BindConnToSession uint64 + DestroyClientID uint64 + Seek uint64 + Allocate uint64 + DeAllocate uint64 + LayoutStats uint64 + Clone uint64 +} + +// ServerV4Stats models the nfsd "proc4" line. +type ServerV4Stats struct { + Null uint64 + Compound uint64 +} + +// V4Ops models the "proc4ops" line: NFSv4 operations +// Variable list, see: +// v4.0 https://tools.ietf.org/html/rfc3010 (38 operations) +// v4.1 https://tools.ietf.org/html/rfc5661 (58 operations) +// v4.2 https://tools.ietf.org/html/draft-ietf-nfsv4-minorversion2-41 (71 operations) +type V4Ops struct { + //Values uint64 // Variable depending on v4.x sub-version. TODO: Will this always at least include the fields in this struct? + Op0Unused uint64 + Op1Unused uint64 + Op2Future uint64 + Access uint64 + Close uint64 + Commit uint64 + Create uint64 + DelegPurge uint64 + DelegReturn uint64 + GetAttr uint64 + GetFH uint64 + Link uint64 + Lock uint64 + Lockt uint64 + Locku uint64 + Lookup uint64 + LookupRoot uint64 + Nverify uint64 + Open uint64 + OpenAttr uint64 + OpenConfirm uint64 + OpenDgrd uint64 + PutFH uint64 + PutPubFH uint64 + PutRootFH uint64 + Read uint64 + ReadDir uint64 + ReadLink uint64 + Remove uint64 + Rename uint64 + Renew uint64 + RestoreFH uint64 + SaveFH uint64 + SecInfo uint64 + SetAttr uint64 + Verify uint64 + Write uint64 + RelLockOwner uint64 +} + +// ClientRPCStats models all stats from /proc/net/rpc/nfs. +type ClientRPCStats struct { + Network Network + ClientRPC ClientRPC + V2Stats V2Stats + V3Stats V3Stats + ClientV4Stats ClientV4Stats +} + +// ServerRPCStats models all stats from /proc/net/rpc/nfsd. +type ServerRPCStats struct { + ReplyCache ReplyCache + FileHandles FileHandles + InputOutput InputOutput + Threads Threads + ReadAheadCache ReadAheadCache + Network Network + ServerRPC ServerRPC + V2Stats V2Stats + V3Stats V3Stats + ServerV4Stats ServerV4Stats + V4Ops V4Ops +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/nfs/parse.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/nfs/parse.go new file mode 100644 index 00000000..95a83cc5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/nfs/parse.go @@ -0,0 +1,317 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package nfs + +import ( + "fmt" +) + +func parseReplyCache(v []uint64) (ReplyCache, error) { + if len(v) != 3 { + return ReplyCache{}, fmt.Errorf("invalid ReplyCache line %q", v) + } + + return ReplyCache{ + Hits: v[0], + Misses: v[1], + NoCache: v[2], + }, nil +} + +func parseFileHandles(v []uint64) (FileHandles, error) { + if len(v) != 5 { + return FileHandles{}, fmt.Errorf("invalid FileHandles, line %q", v) + } + + return FileHandles{ + Stale: v[0], + TotalLookups: v[1], + AnonLookups: v[2], + DirNoCache: v[3], + NoDirNoCache: v[4], + }, nil +} + +func parseInputOutput(v []uint64) (InputOutput, error) { + if len(v) != 2 { + return InputOutput{}, fmt.Errorf("invalid InputOutput line %q", v) + } + + return InputOutput{ + Read: v[0], + Write: v[1], + }, nil +} + +func parseThreads(v []uint64) (Threads, error) { + if len(v) != 2 { + return Threads{}, fmt.Errorf("invalid Threads line %q", v) + } + + return Threads{ + Threads: v[0], + FullCnt: v[1], + }, nil +} + +func parseReadAheadCache(v []uint64) (ReadAheadCache, error) { + if len(v) != 12 { + return ReadAheadCache{}, fmt.Errorf("invalid ReadAheadCache line %q", v) + } + + return ReadAheadCache{ + CacheSize: v[0], + CacheHistogram: v[1:11], + NotFound: v[11], + }, nil +} + +func parseNetwork(v []uint64) (Network, error) { + if len(v) != 4 { + return Network{}, fmt.Errorf("invalid Network line %q", v) + } + + return Network{ + NetCount: v[0], + UDPCount: v[1], + TCPCount: v[2], + TCPConnect: v[3], + }, nil +} + +func parseServerRPC(v []uint64) (ServerRPC, error) { + if len(v) != 5 { + return ServerRPC{}, fmt.Errorf("invalid RPC line %q", v) + } + + return ServerRPC{ + RPCCount: v[0], + BadCnt: v[1], + BadFmt: v[2], + BadAuth: v[3], + BadcInt: v[4], + }, nil +} + +func parseClientRPC(v []uint64) (ClientRPC, error) { + if len(v) != 3 { + return ClientRPC{}, fmt.Errorf("invalid RPC line %q", v) + } + + return ClientRPC{ + RPCCount: v[0], + Retransmissions: v[1], + AuthRefreshes: v[2], + }, nil +} + +func parseV2Stats(v []uint64) (V2Stats, error) { + values := int(v[0]) + if len(v[1:]) != values || values != 18 { + return V2Stats{}, fmt.Errorf("invalid V2Stats line %q", v) + } + + return V2Stats{ + Null: v[1], + GetAttr: v[2], + SetAttr: v[3], + Root: v[4], + Lookup: v[5], + ReadLink: v[6], + Read: v[7], + WrCache: v[8], + Write: v[9], + Create: v[10], + Remove: v[11], + Rename: v[12], + Link: v[13], + SymLink: v[14], + MkDir: v[15], + RmDir: v[16], + ReadDir: v[17], + FsStat: v[18], + }, nil +} + +func parseV3Stats(v []uint64) (V3Stats, error) { + values := int(v[0]) + if len(v[1:]) != values || values != 22 { + return V3Stats{}, fmt.Errorf("invalid V3Stats line %q", v) + } + + return V3Stats{ + Null: v[1], + GetAttr: v[2], + SetAttr: v[3], + Lookup: v[4], + Access: v[5], + ReadLink: v[6], + Read: v[7], + Write: v[8], + Create: v[9], + MkDir: v[10], + SymLink: v[11], + MkNod: v[12], + Remove: v[13], + RmDir: v[14], + Rename: v[15], + Link: v[16], + ReadDir: v[17], + ReadDirPlus: v[18], + FsStat: v[19], + FsInfo: v[20], + PathConf: v[21], + Commit: v[22], + }, nil +} + +func parseClientV4Stats(v []uint64) (ClientV4Stats, error) { + values := int(v[0]) + if len(v[1:]) != values { + return ClientV4Stats{}, fmt.Errorf("invalid ClientV4Stats line %q", v) + } + + // This function currently supports mapping 59 NFS v4 client stats. Older + // kernels may emit fewer stats, so we must detect this and pad out the + // values to match the expected slice size. + if values < 59 { + newValues := make([]uint64, 60) + copy(newValues, v) + v = newValues + } + + return ClientV4Stats{ + Null: v[1], + Read: v[2], + Write: v[3], + Commit: v[4], + Open: v[5], + OpenConfirm: v[6], + OpenNoattr: v[7], + OpenDowngrade: v[8], + Close: v[9], + Setattr: v[10], + FsInfo: v[11], + Renew: v[12], + SetClientID: v[13], + SetClientIDConfirm: v[14], + Lock: v[15], + Lockt: v[16], + Locku: v[17], + Access: v[18], + Getattr: v[19], + Lookup: v[20], + LookupRoot: v[21], + Remove: v[22], + Rename: v[23], + Link: v[24], + Symlink: v[25], + Create: v[26], + Pathconf: v[27], + StatFs: v[28], + ReadLink: v[29], + ReadDir: v[30], + ServerCaps: v[31], + DelegReturn: v[32], + GetACL: v[33], + SetACL: v[34], + FsLocations: v[35], + ReleaseLockowner: v[36], + Secinfo: v[37], + FsidPresent: v[38], + ExchangeID: v[39], + CreateSession: v[40], + DestroySession: v[41], + Sequence: v[42], + GetLeaseTime: v[43], + ReclaimComplete: v[44], + LayoutGet: v[45], + GetDeviceInfo: v[46], + LayoutCommit: v[47], + LayoutReturn: v[48], + SecinfoNoName: v[49], + TestStateID: v[50], + FreeStateID: v[51], + GetDeviceList: v[52], + BindConnToSession: v[53], + DestroyClientID: v[54], + Seek: v[55], + Allocate: v[56], + DeAllocate: v[57], + LayoutStats: v[58], + Clone: v[59], + }, nil +} + +func parseServerV4Stats(v []uint64) (ServerV4Stats, error) { + values := int(v[0]) + if len(v[1:]) != values || values != 2 { + return ServerV4Stats{}, fmt.Errorf("invalid V4Stats line %q", v) + } + + return ServerV4Stats{ + Null: v[1], + Compound: v[2], + }, nil +} + +func parseV4Ops(v []uint64) (V4Ops, error) { + values := int(v[0]) + if len(v[1:]) != values || values < 39 { + return V4Ops{}, fmt.Errorf("invalid V4Ops line %q", v) + } + + stats := V4Ops{ + Op0Unused: v[1], + Op1Unused: v[2], + Op2Future: v[3], + Access: v[4], + Close: v[5], + Commit: v[6], + Create: v[7], + DelegPurge: v[8], + DelegReturn: v[9], + GetAttr: v[10], + GetFH: v[11], + Link: v[12], + Lock: v[13], + Lockt: v[14], + Locku: v[15], + Lookup: v[16], + LookupRoot: v[17], + Nverify: v[18], + Open: v[19], + OpenAttr: v[20], + OpenConfirm: v[21], + OpenDgrd: v[22], + PutFH: v[23], + PutPubFH: v[24], + PutRootFH: v[25], + Read: v[26], + ReadDir: v[27], + ReadLink: v[28], + Remove: v[29], + Rename: v[30], + Renew: v[31], + RestoreFH: v[32], + SaveFH: v[33], + SecInfo: v[34], + SetAttr: v[35], + Verify: v[36], + Write: v[37], + RelLockOwner: v[38], + } + + return stats, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/nfs/parse_nfs.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/nfs/parse_nfs.go new file mode 100644 index 00000000..c0d3a5ad --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/nfs/parse_nfs.go @@ -0,0 +1,67 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package nfs + +import ( + "bufio" + "fmt" + "io" + "strings" + + "github.com/prometheus/procfs/internal/util" +) + +// ParseClientRPCStats returns stats read from /proc/net/rpc/nfs +func ParseClientRPCStats(r io.Reader) (*ClientRPCStats, error) { + stats := &ClientRPCStats{} + + scanner := bufio.NewScanner(r) + for scanner.Scan() { + line := scanner.Text() + parts := strings.Fields(scanner.Text()) + // require at least + if len(parts) < 2 { + return nil, fmt.Errorf("invalid NFS metric line %q", line) + } + + values, err := util.ParseUint64s(parts[1:]) + if err != nil { + return nil, fmt.Errorf("error parsing NFS metric line: %s", err) + } + + switch metricLine := parts[0]; metricLine { + case "net": + stats.Network, err = parseNetwork(values) + case "rpc": + stats.ClientRPC, err = parseClientRPC(values) + case "proc2": + stats.V2Stats, err = parseV2Stats(values) + case "proc3": + stats.V3Stats, err = parseV3Stats(values) + case "proc4": + stats.ClientV4Stats, err = parseClientV4Stats(values) + default: + return nil, fmt.Errorf("unknown NFS metric line %q", metricLine) + } + if err != nil { + return nil, fmt.Errorf("errors parsing NFS metric line: %s", err) + } + } + + if err := scanner.Err(); err != nil { + return nil, fmt.Errorf("error scanning NFS file: %s", err) + } + + return stats, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/nfs/parse_nfsd.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/nfs/parse_nfsd.go new file mode 100644 index 00000000..57bb4a35 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/nfs/parse_nfsd.go @@ -0,0 +1,89 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package nfs + +import ( + "bufio" + "fmt" + "io" + "strings" + + "github.com/prometheus/procfs/internal/util" +) + +// ParseServerRPCStats returns stats read from /proc/net/rpc/nfsd +func ParseServerRPCStats(r io.Reader) (*ServerRPCStats, error) { + stats := &ServerRPCStats{} + + scanner := bufio.NewScanner(r) + for scanner.Scan() { + line := scanner.Text() + parts := strings.Fields(scanner.Text()) + // require at least + if len(parts) < 2 { + return nil, fmt.Errorf("invalid NFSd metric line %q", line) + } + label := parts[0] + + var values []uint64 + var err error + if label == "th" { + if len(parts) < 3 { + return nil, fmt.Errorf("invalid NFSd th metric line %q", line) + } + values, err = util.ParseUint64s(parts[1:3]) + } else { + values, err = util.ParseUint64s(parts[1:]) + } + if err != nil { + return nil, fmt.Errorf("error parsing NFSd metric line: %s", err) + } + + switch metricLine := parts[0]; metricLine { + case "rc": + stats.ReplyCache, err = parseReplyCache(values) + case "fh": + stats.FileHandles, err = parseFileHandles(values) + case "io": + stats.InputOutput, err = parseInputOutput(values) + case "th": + stats.Threads, err = parseThreads(values) + case "ra": + stats.ReadAheadCache, err = parseReadAheadCache(values) + case "net": + stats.Network, err = parseNetwork(values) + case "rpc": + stats.ServerRPC, err = parseServerRPC(values) + case "proc2": + stats.V2Stats, err = parseV2Stats(values) + case "proc3": + stats.V3Stats, err = parseV3Stats(values) + case "proc4": + stats.ServerV4Stats, err = parseServerV4Stats(values) + case "proc4ops": + stats.V4Ops, err = parseV4Ops(values) + default: + return nil, fmt.Errorf("unknown NFSd metric line %q", metricLine) + } + if err != nil { + return nil, fmt.Errorf("errors parsing NFSd metric line: %s", err) + } + } + + if err := scanner.Err(); err != nil { + return nil, fmt.Errorf("error scanning NFSd file: %s", err) + } + + return stats, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/proc.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/proc.go new file mode 100644 index 00000000..06bed0ef --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/proc.go @@ -0,0 +1,258 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "bytes" + "fmt" + "io/ioutil" + "os" + "strconv" + "strings" +) + +// Proc provides information about a running process. +type Proc struct { + // The process ID. + PID int + + fs FS +} + +// Procs represents a list of Proc structs. +type Procs []Proc + +func (p Procs) Len() int { return len(p) } +func (p Procs) Swap(i, j int) { p[i], p[j] = p[j], p[i] } +func (p Procs) Less(i, j int) bool { return p[i].PID < p[j].PID } + +// Self returns a process for the current process read via /proc/self. +func Self() (Proc, error) { + fs, err := NewFS(DefaultMountPoint) + if err != nil { + return Proc{}, err + } + return fs.Self() +} + +// NewProc returns a process for the given pid under /proc. +func NewProc(pid int) (Proc, error) { + fs, err := NewFS(DefaultMountPoint) + if err != nil { + return Proc{}, err + } + return fs.NewProc(pid) +} + +// AllProcs returns a list of all currently available processes under /proc. +func AllProcs() (Procs, error) { + fs, err := NewFS(DefaultMountPoint) + if err != nil { + return Procs{}, err + } + return fs.AllProcs() +} + +// Self returns a process for the current process. +func (fs FS) Self() (Proc, error) { + p, err := os.Readlink(fs.Path("self")) + if err != nil { + return Proc{}, err + } + pid, err := strconv.Atoi(strings.Replace(p, string(fs), "", -1)) + if err != nil { + return Proc{}, err + } + return fs.NewProc(pid) +} + +// NewProc returns a process for the given pid. +func (fs FS) NewProc(pid int) (Proc, error) { + if _, err := os.Stat(fs.Path(strconv.Itoa(pid))); err != nil { + return Proc{}, err + } + return Proc{PID: pid, fs: fs}, nil +} + +// AllProcs returns a list of all currently available processes. +func (fs FS) AllProcs() (Procs, error) { + d, err := os.Open(fs.Path()) + if err != nil { + return Procs{}, err + } + defer d.Close() + + names, err := d.Readdirnames(-1) + if err != nil { + return Procs{}, fmt.Errorf("could not read %s: %s", d.Name(), err) + } + + p := Procs{} + for _, n := range names { + pid, err := strconv.ParseInt(n, 10, 64) + if err != nil { + continue + } + p = append(p, Proc{PID: int(pid), fs: fs}) + } + + return p, nil +} + +// CmdLine returns the command line of a process. +func (p Proc) CmdLine() ([]string, error) { + f, err := os.Open(p.path("cmdline")) + if err != nil { + return nil, err + } + defer f.Close() + + data, err := ioutil.ReadAll(f) + if err != nil { + return nil, err + } + + if len(data) < 1 { + return []string{}, nil + } + + return strings.Split(string(bytes.TrimRight(data, string("\x00"))), string(byte(0))), nil +} + +// Comm returns the command name of a process. +func (p Proc) Comm() (string, error) { + f, err := os.Open(p.path("comm")) + if err != nil { + return "", err + } + defer f.Close() + + data, err := ioutil.ReadAll(f) + if err != nil { + return "", err + } + + return strings.TrimSpace(string(data)), nil +} + +// Executable returns the absolute path of the executable command of a process. +func (p Proc) Executable() (string, error) { + exe, err := os.Readlink(p.path("exe")) + if os.IsNotExist(err) { + return "", nil + } + + return exe, err +} + +// Cwd returns the absolute path to the current working directory of the process. +func (p Proc) Cwd() (string, error) { + wd, err := os.Readlink(p.path("cwd")) + if os.IsNotExist(err) { + return "", nil + } + + return wd, err +} + +// RootDir returns the absolute path to the process's root directory (as set by chroot) +func (p Proc) RootDir() (string, error) { + rdir, err := os.Readlink(p.path("root")) + if os.IsNotExist(err) { + return "", nil + } + + return rdir, err +} + +// FileDescriptors returns the currently open file descriptors of a process. +func (p Proc) FileDescriptors() ([]uintptr, error) { + names, err := p.fileDescriptors() + if err != nil { + return nil, err + } + + fds := make([]uintptr, len(names)) + for i, n := range names { + fd, err := strconv.ParseInt(n, 10, 32) + if err != nil { + return nil, fmt.Errorf("could not parse fd %s: %s", n, err) + } + fds[i] = uintptr(fd) + } + + return fds, nil +} + +// FileDescriptorTargets returns the targets of all file descriptors of a process. +// If a file descriptor is not a symlink to a file (like a socket), that value will be the empty string. +func (p Proc) FileDescriptorTargets() ([]string, error) { + names, err := p.fileDescriptors() + if err != nil { + return nil, err + } + + targets := make([]string, len(names)) + + for i, name := range names { + target, err := os.Readlink(p.path("fd", name)) + if err == nil { + targets[i] = target + } + } + + return targets, nil +} + +// FileDescriptorsLen returns the number of currently open file descriptors of +// a process. +func (p Proc) FileDescriptorsLen() (int, error) { + fds, err := p.fileDescriptors() + if err != nil { + return 0, err + } + + return len(fds), nil +} + +// MountStats retrieves statistics and configuration for mount points in a +// process's namespace. +func (p Proc) MountStats() ([]*Mount, error) { + f, err := os.Open(p.path("mountstats")) + if err != nil { + return nil, err + } + defer f.Close() + + return parseMountStats(f) +} + +func (p Proc) fileDescriptors() ([]string, error) { + d, err := os.Open(p.path("fd")) + if err != nil { + return nil, err + } + defer d.Close() + + names, err := d.Readdirnames(-1) + if err != nil { + return nil, fmt.Errorf("could not read %s: %s", d.Name(), err) + } + + return names, nil +} + +func (p Proc) path(pa ...string) string { + return p.fs.Path(append([]string{strconv.Itoa(p.PID)}, pa...)...) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/proc_io.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/proc_io.go new file mode 100644 index 00000000..0251c83b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/proc_io.go @@ -0,0 +1,65 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "fmt" + "io/ioutil" + "os" +) + +// ProcIO models the content of /proc//io. +type ProcIO struct { + // Chars read. + RChar uint64 + // Chars written. + WChar uint64 + // Read syscalls. + SyscR uint64 + // Write syscalls. + SyscW uint64 + // Bytes read. + ReadBytes uint64 + // Bytes written. + WriteBytes uint64 + // Bytes written, but taking into account truncation. See + // Documentation/filesystems/proc.txt in the kernel sources for + // detailed explanation. + CancelledWriteBytes int64 +} + +// NewIO creates a new ProcIO instance from a given Proc instance. +func (p Proc) NewIO() (ProcIO, error) { + pio := ProcIO{} + + f, err := os.Open(p.path("io")) + if err != nil { + return pio, err + } + defer f.Close() + + data, err := ioutil.ReadAll(f) + if err != nil { + return pio, err + } + + ioFormat := "rchar: %d\nwchar: %d\nsyscr: %d\nsyscw: %d\n" + + "read_bytes: %d\nwrite_bytes: %d\n" + + "cancelled_write_bytes: %d\n" + + _, err = fmt.Sscanf(string(data), ioFormat, &pio.RChar, &pio.WChar, &pio.SyscR, + &pio.SyscW, &pio.ReadBytes, &pio.WriteBytes, &pio.CancelledWriteBytes) + + return pio, err +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/proc_limits.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/proc_limits.go new file mode 100644 index 00000000..f04ba6fd --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/proc_limits.go @@ -0,0 +1,150 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "bufio" + "fmt" + "os" + "regexp" + "strconv" +) + +// ProcLimits represents the soft limits for each of the process's resource +// limits. For more information see getrlimit(2): +// http://man7.org/linux/man-pages/man2/getrlimit.2.html. +type ProcLimits struct { + // CPU time limit in seconds. + CPUTime int64 + // Maximum size of files that the process may create. + FileSize int64 + // Maximum size of the process's data segment (initialized data, + // uninitialized data, and heap). + DataSize int64 + // Maximum size of the process stack in bytes. + StackSize int64 + // Maximum size of a core file. + CoreFileSize int64 + // Limit of the process's resident set in pages. + ResidentSet int64 + // Maximum number of processes that can be created for the real user ID of + // the calling process. + Processes int64 + // Value one greater than the maximum file descriptor number that can be + // opened by this process. + OpenFiles int64 + // Maximum number of bytes of memory that may be locked into RAM. + LockedMemory int64 + // Maximum size of the process's virtual memory address space in bytes. + AddressSpace int64 + // Limit on the combined number of flock(2) locks and fcntl(2) leases that + // this process may establish. + FileLocks int64 + // Limit of signals that may be queued for the real user ID of the calling + // process. + PendingSignals int64 + // Limit on the number of bytes that can be allocated for POSIX message + // queues for the real user ID of the calling process. + MsqqueueSize int64 + // Limit of the nice priority set using setpriority(2) or nice(2). + NicePriority int64 + // Limit of the real-time priority set using sched_setscheduler(2) or + // sched_setparam(2). + RealtimePriority int64 + // Limit (in microseconds) on the amount of CPU time that a process + // scheduled under a real-time scheduling policy may consume without making + // a blocking system call. + RealtimeTimeout int64 +} + +const ( + limitsFields = 3 + limitsUnlimited = "unlimited" +) + +var ( + limitsDelimiter = regexp.MustCompile(" +") +) + +// NewLimits returns the current soft limits of the process. +func (p Proc) NewLimits() (ProcLimits, error) { + f, err := os.Open(p.path("limits")) + if err != nil { + return ProcLimits{}, err + } + defer f.Close() + + var ( + l = ProcLimits{} + s = bufio.NewScanner(f) + ) + for s.Scan() { + fields := limitsDelimiter.Split(s.Text(), limitsFields) + if len(fields) != limitsFields { + return ProcLimits{}, fmt.Errorf( + "couldn't parse %s line %s", f.Name(), s.Text()) + } + + switch fields[0] { + case "Max cpu time": + l.CPUTime, err = parseInt(fields[1]) + case "Max file size": + l.FileSize, err = parseInt(fields[1]) + case "Max data size": + l.DataSize, err = parseInt(fields[1]) + case "Max stack size": + l.StackSize, err = parseInt(fields[1]) + case "Max core file size": + l.CoreFileSize, err = parseInt(fields[1]) + case "Max resident set": + l.ResidentSet, err = parseInt(fields[1]) + case "Max processes": + l.Processes, err = parseInt(fields[1]) + case "Max open files": + l.OpenFiles, err = parseInt(fields[1]) + case "Max locked memory": + l.LockedMemory, err = parseInt(fields[1]) + case "Max address space": + l.AddressSpace, err = parseInt(fields[1]) + case "Max file locks": + l.FileLocks, err = parseInt(fields[1]) + case "Max pending signals": + l.PendingSignals, err = parseInt(fields[1]) + case "Max msgqueue size": + l.MsqqueueSize, err = parseInt(fields[1]) + case "Max nice priority": + l.NicePriority, err = parseInt(fields[1]) + case "Max realtime priority": + l.RealtimePriority, err = parseInt(fields[1]) + case "Max realtime timeout": + l.RealtimeTimeout, err = parseInt(fields[1]) + } + if err != nil { + return ProcLimits{}, err + } + } + + return l, s.Err() +} + +func parseInt(s string) (int64, error) { + if s == limitsUnlimited { + return -1, nil + } + i, err := strconv.ParseInt(s, 10, 64) + if err != nil { + return 0, fmt.Errorf("couldn't parse value %s: %s", s, err) + } + return i, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/proc_ns.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/proc_ns.go new file mode 100644 index 00000000..d06c26eb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/proc_ns.go @@ -0,0 +1,68 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "fmt" + "os" + "strconv" + "strings" +) + +// Namespace represents a single namespace of a process. +type Namespace struct { + Type string // Namespace type. + Inode uint32 // Inode number of the namespace. If two processes are in the same namespace their inodes will match. +} + +// Namespaces contains all of the namespaces that the process is contained in. +type Namespaces map[string]Namespace + +// NewNamespaces reads from /proc/[pid/ns/* to get the namespaces of which the +// process is a member. +func (p Proc) NewNamespaces() (Namespaces, error) { + d, err := os.Open(p.path("ns")) + if err != nil { + return nil, err + } + defer d.Close() + + names, err := d.Readdirnames(-1) + if err != nil { + return nil, fmt.Errorf("failed to read contents of ns dir: %v", err) + } + + ns := make(Namespaces, len(names)) + for _, name := range names { + target, err := os.Readlink(p.path("ns", name)) + if err != nil { + return nil, err + } + + fields := strings.SplitN(target, ":", 2) + if len(fields) != 2 { + return nil, fmt.Errorf("failed to parse namespace type and inode from '%v'", target) + } + + typ := fields[0] + inode, err := strconv.ParseUint(strings.Trim(fields[1], "[]"), 10, 32) + if err != nil { + return nil, fmt.Errorf("failed to parse inode from '%v': %v", fields[1], err) + } + + ns[name] = Namespace{typ, uint32(inode)} + } + + return ns, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/proc_stat.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/proc_stat.go new file mode 100644 index 00000000..3cf2a9f1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/proc_stat.go @@ -0,0 +1,188 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "bytes" + "fmt" + "io/ioutil" + "os" +) + +// Originally, this USER_HZ value was dynamically retrieved via a sysconf call +// which required cgo. However, that caused a lot of problems regarding +// cross-compilation. Alternatives such as running a binary to determine the +// value, or trying to derive it in some other way were all problematic. After +// much research it was determined that USER_HZ is actually hardcoded to 100 on +// all Go-supported platforms as of the time of this writing. This is why we +// decided to hardcode it here as well. It is not impossible that there could +// be systems with exceptions, but they should be very exotic edge cases, and +// in that case, the worst outcome will be two misreported metrics. +// +// See also the following discussions: +// +// - https://github.com/prometheus/node_exporter/issues/52 +// - https://github.com/prometheus/procfs/pull/2 +// - http://stackoverflow.com/questions/17410841/how-does-user-hz-solve-the-jiffy-scaling-issue +const userHZ = 100 + +// ProcStat provides status information about the process, +// read from /proc/[pid]/stat. +type ProcStat struct { + // The process ID. + PID int + // The filename of the executable. + Comm string + // The process state. + State string + // The PID of the parent of this process. + PPID int + // The process group ID of the process. + PGRP int + // The session ID of the process. + Session int + // The controlling terminal of the process. + TTY int + // The ID of the foreground process group of the controlling terminal of + // the process. + TPGID int + // The kernel flags word of the process. + Flags uint + // The number of minor faults the process has made which have not required + // loading a memory page from disk. + MinFlt uint + // The number of minor faults that the process's waited-for children have + // made. + CMinFlt uint + // The number of major faults the process has made which have required + // loading a memory page from disk. + MajFlt uint + // The number of major faults that the process's waited-for children have + // made. + CMajFlt uint + // Amount of time that this process has been scheduled in user mode, + // measured in clock ticks. + UTime uint + // Amount of time that this process has been scheduled in kernel mode, + // measured in clock ticks. + STime uint + // Amount of time that this process's waited-for children have been + // scheduled in user mode, measured in clock ticks. + CUTime uint + // Amount of time that this process's waited-for children have been + // scheduled in kernel mode, measured in clock ticks. + CSTime uint + // For processes running a real-time scheduling policy, this is the negated + // scheduling priority, minus one. + Priority int + // The nice value, a value in the range 19 (low priority) to -20 (high + // priority). + Nice int + // Number of threads in this process. + NumThreads int + // The time the process started after system boot, the value is expressed + // in clock ticks. + Starttime uint64 + // Virtual memory size in bytes. + VSize int + // Resident set size in pages. + RSS int + + fs FS +} + +// NewStat returns the current status information of the process. +func (p Proc) NewStat() (ProcStat, error) { + f, err := os.Open(p.path("stat")) + if err != nil { + return ProcStat{}, err + } + defer f.Close() + + data, err := ioutil.ReadAll(f) + if err != nil { + return ProcStat{}, err + } + + var ( + ignore int + + s = ProcStat{PID: p.PID, fs: p.fs} + l = bytes.Index(data, []byte("(")) + r = bytes.LastIndex(data, []byte(")")) + ) + + if l < 0 || r < 0 { + return ProcStat{}, fmt.Errorf( + "unexpected format, couldn't extract comm: %s", + data, + ) + } + + s.Comm = string(data[l+1 : r]) + _, err = fmt.Fscan( + bytes.NewBuffer(data[r+2:]), + &s.State, + &s.PPID, + &s.PGRP, + &s.Session, + &s.TTY, + &s.TPGID, + &s.Flags, + &s.MinFlt, + &s.CMinFlt, + &s.MajFlt, + &s.CMajFlt, + &s.UTime, + &s.STime, + &s.CUTime, + &s.CSTime, + &s.Priority, + &s.Nice, + &s.NumThreads, + &ignore, + &s.Starttime, + &s.VSize, + &s.RSS, + ) + if err != nil { + return ProcStat{}, err + } + + return s, nil +} + +// VirtualMemory returns the virtual memory size in bytes. +func (s ProcStat) VirtualMemory() int { + return s.VSize +} + +// ResidentMemory returns the resident memory size in bytes. +func (s ProcStat) ResidentMemory() int { + return s.RSS * os.Getpagesize() +} + +// StartTime returns the unix timestamp of the process in seconds. +func (s ProcStat) StartTime() (float64, error) { + stat, err := s.fs.NewStat() + if err != nil { + return 0, err + } + return float64(stat.BootTime) + (float64(s.Starttime) / userHZ), nil +} + +// CPUTime returns the total CPU user and system time in seconds. +func (s ProcStat) CPUTime() float64 { + return float64(s.UTime+s.STime) / userHZ +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/stat.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/stat.go new file mode 100644 index 00000000..61eb6b0e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/stat.go @@ -0,0 +1,232 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "bufio" + "fmt" + "io" + "os" + "strconv" + "strings" +) + +// CPUStat shows how much time the cpu spend in various stages. +type CPUStat struct { + User float64 + Nice float64 + System float64 + Idle float64 + Iowait float64 + IRQ float64 + SoftIRQ float64 + Steal float64 + Guest float64 + GuestNice float64 +} + +// SoftIRQStat represent the softirq statistics as exported in the procfs stat file. +// A nice introduction can be found at https://0xax.gitbooks.io/linux-insides/content/interrupts/interrupts-9.html +// It is possible to get per-cpu stats by reading /proc/softirqs +type SoftIRQStat struct { + Hi uint64 + Timer uint64 + NetTx uint64 + NetRx uint64 + Block uint64 + BlockIoPoll uint64 + Tasklet uint64 + Sched uint64 + Hrtimer uint64 + Rcu uint64 +} + +// Stat represents kernel/system statistics. +type Stat struct { + // Boot time in seconds since the Epoch. + BootTime uint64 + // Summed up cpu statistics. + CPUTotal CPUStat + // Per-CPU statistics. + CPU []CPUStat + // Number of times interrupts were handled, which contains numbered and unnumbered IRQs. + IRQTotal uint64 + // Number of times a numbered IRQ was triggered. + IRQ []uint64 + // Number of times a context switch happened. + ContextSwitches uint64 + // Number of times a process was created. + ProcessCreated uint64 + // Number of processes currently running. + ProcessesRunning uint64 + // Number of processes currently blocked (waiting for IO). + ProcessesBlocked uint64 + // Number of times a softirq was scheduled. + SoftIRQTotal uint64 + // Detailed softirq statistics. + SoftIRQ SoftIRQStat +} + +// NewStat returns kernel/system statistics read from /proc/stat. +func NewStat() (Stat, error) { + fs, err := NewFS(DefaultMountPoint) + if err != nil { + return Stat{}, err + } + + return fs.NewStat() +} + +// Parse a cpu statistics line and returns the CPUStat struct plus the cpu id (or -1 for the overall sum). +func parseCPUStat(line string) (CPUStat, int64, error) { + cpuStat := CPUStat{} + var cpu string + + count, err := fmt.Sscanf(line, "%s %f %f %f %f %f %f %f %f %f %f", + &cpu, + &cpuStat.User, &cpuStat.Nice, &cpuStat.System, &cpuStat.Idle, + &cpuStat.Iowait, &cpuStat.IRQ, &cpuStat.SoftIRQ, &cpuStat.Steal, + &cpuStat.Guest, &cpuStat.GuestNice) + + if err != nil && err != io.EOF { + return CPUStat{}, -1, fmt.Errorf("couldn't parse %s (cpu): %s", line, err) + } + if count == 0 { + return CPUStat{}, -1, fmt.Errorf("couldn't parse %s (cpu): 0 elements parsed", line) + } + + cpuStat.User /= userHZ + cpuStat.Nice /= userHZ + cpuStat.System /= userHZ + cpuStat.Idle /= userHZ + cpuStat.Iowait /= userHZ + cpuStat.IRQ /= userHZ + cpuStat.SoftIRQ /= userHZ + cpuStat.Steal /= userHZ + cpuStat.Guest /= userHZ + cpuStat.GuestNice /= userHZ + + if cpu == "cpu" { + return cpuStat, -1, nil + } + + cpuID, err := strconv.ParseInt(cpu[3:], 10, 64) + if err != nil { + return CPUStat{}, -1, fmt.Errorf("couldn't parse %s (cpu/cpuid): %s", line, err) + } + + return cpuStat, cpuID, nil +} + +// Parse a softirq line. +func parseSoftIRQStat(line string) (SoftIRQStat, uint64, error) { + softIRQStat := SoftIRQStat{} + var total uint64 + var prefix string + + _, err := fmt.Sscanf(line, "%s %d %d %d %d %d %d %d %d %d %d %d", + &prefix, &total, + &softIRQStat.Hi, &softIRQStat.Timer, &softIRQStat.NetTx, &softIRQStat.NetRx, + &softIRQStat.Block, &softIRQStat.BlockIoPoll, + &softIRQStat.Tasklet, &softIRQStat.Sched, + &softIRQStat.Hrtimer, &softIRQStat.Rcu) + + if err != nil { + return SoftIRQStat{}, 0, fmt.Errorf("couldn't parse %s (softirq): %s", line, err) + } + + return softIRQStat, total, nil +} + +// NewStat returns an information about current kernel/system statistics. +func (fs FS) NewStat() (Stat, error) { + // See https://www.kernel.org/doc/Documentation/filesystems/proc.txt + + f, err := os.Open(fs.Path("stat")) + if err != nil { + return Stat{}, err + } + defer f.Close() + + stat := Stat{} + + scanner := bufio.NewScanner(f) + for scanner.Scan() { + line := scanner.Text() + parts := strings.Fields(scanner.Text()) + // require at least + if len(parts) < 2 { + continue + } + switch { + case parts[0] == "btime": + if stat.BootTime, err = strconv.ParseUint(parts[1], 10, 64); err != nil { + return Stat{}, fmt.Errorf("couldn't parse %s (btime): %s", parts[1], err) + } + case parts[0] == "intr": + if stat.IRQTotal, err = strconv.ParseUint(parts[1], 10, 64); err != nil { + return Stat{}, fmt.Errorf("couldn't parse %s (intr): %s", parts[1], err) + } + numberedIRQs := parts[2:] + stat.IRQ = make([]uint64, len(numberedIRQs)) + for i, count := range numberedIRQs { + if stat.IRQ[i], err = strconv.ParseUint(count, 10, 64); err != nil { + return Stat{}, fmt.Errorf("couldn't parse %s (intr%d): %s", count, i, err) + } + } + case parts[0] == "ctxt": + if stat.ContextSwitches, err = strconv.ParseUint(parts[1], 10, 64); err != nil { + return Stat{}, fmt.Errorf("couldn't parse %s (ctxt): %s", parts[1], err) + } + case parts[0] == "processes": + if stat.ProcessCreated, err = strconv.ParseUint(parts[1], 10, 64); err != nil { + return Stat{}, fmt.Errorf("couldn't parse %s (processes): %s", parts[1], err) + } + case parts[0] == "procs_running": + if stat.ProcessesRunning, err = strconv.ParseUint(parts[1], 10, 64); err != nil { + return Stat{}, fmt.Errorf("couldn't parse %s (procs_running): %s", parts[1], err) + } + case parts[0] == "procs_blocked": + if stat.ProcessesBlocked, err = strconv.ParseUint(parts[1], 10, 64); err != nil { + return Stat{}, fmt.Errorf("couldn't parse %s (procs_blocked): %s", parts[1], err) + } + case parts[0] == "softirq": + softIRQStats, total, err := parseSoftIRQStat(line) + if err != nil { + return Stat{}, err + } + stat.SoftIRQTotal = total + stat.SoftIRQ = softIRQStats + case strings.HasPrefix(parts[0], "cpu"): + cpuStat, cpuID, err := parseCPUStat(line) + if err != nil { + return Stat{}, err + } + if cpuID == -1 { + stat.CPUTotal = cpuStat + } else { + for int64(len(stat.CPU)) <= cpuID { + stat.CPU = append(stat.CPU, CPUStat{}) + } + stat.CPU[cpuID] = cpuStat + } + } + } + + if err := scanner.Err(); err != nil { + return Stat{}, fmt.Errorf("couldn't parse %s: %s", f.Name(), err) + } + + return stat, nil +} diff --git a/vendor/github.com/prometheus/procfs/ttar b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/ttar similarity index 88% rename from vendor/github.com/prometheus/procfs/ttar rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/ttar index 19ef02b8..b0171a12 100755 --- a/vendor/github.com/prometheus/procfs/ttar +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/ttar @@ -86,10 +86,8 @@ Usage: $bname [-C

] -c -f (create archive) $bname [-C ] -x -f (extract archive) Options: - -C (change directory) - -v (verbose) - --recursive-unlink (recursively delete existing directory if path - collides with file or directory to extract) + -C (change directory) + -v (verbose) Example: Change to sysfs directory, create ttar file from fixtures directory $bname -C sysfs -c -f sysfs/fixtures.ttar fixtures/ @@ -113,9 +111,8 @@ function set_cmd { } unset VERBOSE -unset RECURSIVE_UNLINK -while getopts :cf:-:htxvC: opt; do +while getopts :cf:htxvC: opt; do case $opt in c) set_cmd "create" @@ -139,18 +136,6 @@ while getopts :cf:-:htxvC: opt; do C) CDIR=$OPTARG ;; - -) - case $OPTARG in - recursive-unlink) - RECURSIVE_UNLINK="yes" - ;; - *) - echo -e "Error: invalid option -$OPTARG" - echo - usage 1 - ;; - esac - ;; *) echo >&2 "ERROR: invalid option -$OPTARG" echo @@ -227,16 +212,16 @@ function extract { local eof_without_newline if [ "$size" -gt 0 ]; then if [[ "$line" =~ [^\\]EOF ]]; then - # An EOF not preceded by a backslash indicates that the line + # An EOF not preceeded by a backslash indicates that the line # does not end with a newline eof_without_newline=1 else eof_without_newline=0 fi # Replace NULLBYTE with null byte if at beginning of line - # Replace NULLBYTE with null byte unless preceded by backslash + # Replace NULLBYTE with null byte unless preceeded by backslash # Remove one backslash in front of NULLBYTE (if any) - # Remove EOF unless preceded by backslash + # Remove EOF unless preceeded by backslash # Remove one backslash in front of EOF if [ $USE_PYTHON -eq 1 ]; then echo -n "$line" | python -c "$PYTHON_EXTRACT_FILTER" >> "$path" @@ -260,16 +245,7 @@ function extract { fi if [[ $line =~ ^Path:\ (.*)$ ]]; then path=${BASH_REMATCH[1]} - if [ -L "$path" ]; then - rm "$path" - elif [ -d "$path" ]; then - if [ "${RECURSIVE_UNLINK:-}" == "yes" ]; then - rm -r "$path" - else - # Safe because symlinks to directories are dealt with above - rmdir "$path" - fi - elif [ -e "$path" ]; then + if [ -e "$path" ] || [ -L "$path" ]; then rm "$path" fi elif [[ $line =~ ^Lines:\ (.*)$ ]]; then @@ -362,8 +338,8 @@ function _create { else < "$file" \ sed 's/EOF/\\EOF/g; - s/NULLBYTE/\\NULLBYTE/g; - s/\x0/NULLBYTE/g; + s/NULLBYTE/\\NULLBYTE/g; + s/\x0/NULLBYTE/g; ' fi if [[ "$eof_without_newline" -eq 1 ]]; then diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/xfrm.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/xfrm.go new file mode 100644 index 00000000..8f1508f0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/xfrm.go @@ -0,0 +1,187 @@ +// Copyright 2017 Prometheus Team +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "bufio" + "fmt" + "os" + "strconv" + "strings" +) + +// XfrmStat models the contents of /proc/net/xfrm_stat. +type XfrmStat struct { + // All errors which are not matched by other + XfrmInError int + // No buffer is left + XfrmInBufferError int + // Header Error + XfrmInHdrError int + // No state found + // i.e. either inbound SPI, address, or IPSEC protocol at SA is wrong + XfrmInNoStates int + // Transformation protocol specific error + // e.g. SA Key is wrong + XfrmInStateProtoError int + // Transformation mode specific error + XfrmInStateModeError int + // Sequence error + // e.g. sequence number is out of window + XfrmInStateSeqError int + // State is expired + XfrmInStateExpired int + // State has mismatch option + // e.g. UDP encapsulation type is mismatched + XfrmInStateMismatch int + // State is invalid + XfrmInStateInvalid int + // No matching template for states + // e.g. Inbound SAs are correct but SP rule is wrong + XfrmInTmplMismatch int + // No policy is found for states + // e.g. Inbound SAs are correct but no SP is found + XfrmInNoPols int + // Policy discards + XfrmInPolBlock int + // Policy error + XfrmInPolError int + // All errors which are not matched by others + XfrmOutError int + // Bundle generation error + XfrmOutBundleGenError int + // Bundle check error + XfrmOutBundleCheckError int + // No state was found + XfrmOutNoStates int + // Transformation protocol specific error + XfrmOutStateProtoError int + // Transportation mode specific error + XfrmOutStateModeError int + // Sequence error + // i.e sequence number overflow + XfrmOutStateSeqError int + // State is expired + XfrmOutStateExpired int + // Policy discads + XfrmOutPolBlock int + // Policy is dead + XfrmOutPolDead int + // Policy Error + XfrmOutPolError int + XfrmFwdHdrError int + XfrmOutStateInvalid int + XfrmAcquireError int +} + +// NewXfrmStat reads the xfrm_stat statistics. +func NewXfrmStat() (XfrmStat, error) { + fs, err := NewFS(DefaultMountPoint) + if err != nil { + return XfrmStat{}, err + } + + return fs.NewXfrmStat() +} + +// NewXfrmStat reads the xfrm_stat statistics from the 'proc' filesystem. +func (fs FS) NewXfrmStat() (XfrmStat, error) { + file, err := os.Open(fs.Path("net/xfrm_stat")) + if err != nil { + return XfrmStat{}, err + } + defer file.Close() + + var ( + x = XfrmStat{} + s = bufio.NewScanner(file) + ) + + for s.Scan() { + fields := strings.Fields(s.Text()) + + if len(fields) != 2 { + return XfrmStat{}, fmt.Errorf( + "couldn't parse %s line %s", file.Name(), s.Text()) + } + + name := fields[0] + value, err := strconv.Atoi(fields[1]) + if err != nil { + return XfrmStat{}, err + } + + switch name { + case "XfrmInError": + x.XfrmInError = value + case "XfrmInBufferError": + x.XfrmInBufferError = value + case "XfrmInHdrError": + x.XfrmInHdrError = value + case "XfrmInNoStates": + x.XfrmInNoStates = value + case "XfrmInStateProtoError": + x.XfrmInStateProtoError = value + case "XfrmInStateModeError": + x.XfrmInStateModeError = value + case "XfrmInStateSeqError": + x.XfrmInStateSeqError = value + case "XfrmInStateExpired": + x.XfrmInStateExpired = value + case "XfrmInStateInvalid": + x.XfrmInStateInvalid = value + case "XfrmInTmplMismatch": + x.XfrmInTmplMismatch = value + case "XfrmInNoPols": + x.XfrmInNoPols = value + case "XfrmInPolBlock": + x.XfrmInPolBlock = value + case "XfrmInPolError": + x.XfrmInPolError = value + case "XfrmOutError": + x.XfrmOutError = value + case "XfrmInStateMismatch": + x.XfrmInStateMismatch = value + case "XfrmOutBundleGenError": + x.XfrmOutBundleGenError = value + case "XfrmOutBundleCheckError": + x.XfrmOutBundleCheckError = value + case "XfrmOutNoStates": + x.XfrmOutNoStates = value + case "XfrmOutStateProtoError": + x.XfrmOutStateProtoError = value + case "XfrmOutStateModeError": + x.XfrmOutStateModeError = value + case "XfrmOutStateSeqError": + x.XfrmOutStateSeqError = value + case "XfrmOutStateExpired": + x.XfrmOutStateExpired = value + case "XfrmOutPolBlock": + x.XfrmOutPolBlock = value + case "XfrmOutPolDead": + x.XfrmOutPolDead = value + case "XfrmOutPolError": + x.XfrmOutPolError = value + case "XfrmFwdHdrError": + x.XfrmFwdHdrError = value + case "XfrmOutStateInvalid": + x.XfrmOutStateInvalid = value + case "XfrmAcquireError": + x.XfrmAcquireError = value + } + + } + + return x, s.Err() +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/xfs/parse.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/xfs/parse.go new file mode 100644 index 00000000..2bc0ef34 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/xfs/parse.go @@ -0,0 +1,330 @@ +// Copyright 2017 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package xfs + +import ( + "bufio" + "fmt" + "io" + "strings" + + "github.com/prometheus/procfs/internal/util" +) + +// ParseStats parses a Stats from an input io.Reader, using the format +// found in /proc/fs/xfs/stat. +func ParseStats(r io.Reader) (*Stats, error) { + const ( + // Fields parsed into stats structures. + fieldExtentAlloc = "extent_alloc" + fieldAbt = "abt" + fieldBlkMap = "blk_map" + fieldBmbt = "bmbt" + fieldDir = "dir" + fieldTrans = "trans" + fieldIg = "ig" + fieldLog = "log" + fieldRw = "rw" + fieldAttr = "attr" + fieldIcluster = "icluster" + fieldVnodes = "vnodes" + fieldBuf = "buf" + fieldXpc = "xpc" + + // Unimplemented at this time due to lack of documentation. + fieldPushAil = "push_ail" + fieldXstrat = "xstrat" + fieldAbtb2 = "abtb2" + fieldAbtc2 = "abtc2" + fieldBmbt2 = "bmbt2" + fieldIbt2 = "ibt2" + fieldFibt2 = "fibt2" + fieldQm = "qm" + fieldDebug = "debug" + ) + + var xfss Stats + + s := bufio.NewScanner(r) + for s.Scan() { + // Expect at least a string label and a single integer value, ex: + // - abt 0 + // - rw 1 2 + ss := strings.Fields(string(s.Bytes())) + if len(ss) < 2 { + continue + } + label := ss[0] + + // Extended precision counters are uint64 values. + if label == fieldXpc { + us, err := util.ParseUint64s(ss[1:]) + if err != nil { + return nil, err + } + + xfss.ExtendedPrecision, err = extendedPrecisionStats(us) + if err != nil { + return nil, err + } + + continue + } + + // All other counters are uint32 values. + us, err := util.ParseUint32s(ss[1:]) + if err != nil { + return nil, err + } + + switch label { + case fieldExtentAlloc: + xfss.ExtentAllocation, err = extentAllocationStats(us) + case fieldAbt: + xfss.AllocationBTree, err = btreeStats(us) + case fieldBlkMap: + xfss.BlockMapping, err = blockMappingStats(us) + case fieldBmbt: + xfss.BlockMapBTree, err = btreeStats(us) + case fieldDir: + xfss.DirectoryOperation, err = directoryOperationStats(us) + case fieldTrans: + xfss.Transaction, err = transactionStats(us) + case fieldIg: + xfss.InodeOperation, err = inodeOperationStats(us) + case fieldLog: + xfss.LogOperation, err = logOperationStats(us) + case fieldRw: + xfss.ReadWrite, err = readWriteStats(us) + case fieldAttr: + xfss.AttributeOperation, err = attributeOperationStats(us) + case fieldIcluster: + xfss.InodeClustering, err = inodeClusteringStats(us) + case fieldVnodes: + xfss.Vnode, err = vnodeStats(us) + case fieldBuf: + xfss.Buffer, err = bufferStats(us) + } + if err != nil { + return nil, err + } + } + + return &xfss, s.Err() +} + +// extentAllocationStats builds an ExtentAllocationStats from a slice of uint32s. +func extentAllocationStats(us []uint32) (ExtentAllocationStats, error) { + if l := len(us); l != 4 { + return ExtentAllocationStats{}, fmt.Errorf("incorrect number of values for XFS extent allocation stats: %d", l) + } + + return ExtentAllocationStats{ + ExtentsAllocated: us[0], + BlocksAllocated: us[1], + ExtentsFreed: us[2], + BlocksFreed: us[3], + }, nil +} + +// btreeStats builds a BTreeStats from a slice of uint32s. +func btreeStats(us []uint32) (BTreeStats, error) { + if l := len(us); l != 4 { + return BTreeStats{}, fmt.Errorf("incorrect number of values for XFS btree stats: %d", l) + } + + return BTreeStats{ + Lookups: us[0], + Compares: us[1], + RecordsInserted: us[2], + RecordsDeleted: us[3], + }, nil +} + +// BlockMappingStat builds a BlockMappingStats from a slice of uint32s. +func blockMappingStats(us []uint32) (BlockMappingStats, error) { + if l := len(us); l != 7 { + return BlockMappingStats{}, fmt.Errorf("incorrect number of values for XFS block mapping stats: %d", l) + } + + return BlockMappingStats{ + Reads: us[0], + Writes: us[1], + Unmaps: us[2], + ExtentListInsertions: us[3], + ExtentListDeletions: us[4], + ExtentListLookups: us[5], + ExtentListCompares: us[6], + }, nil +} + +// DirectoryOperationStats builds a DirectoryOperationStats from a slice of uint32s. +func directoryOperationStats(us []uint32) (DirectoryOperationStats, error) { + if l := len(us); l != 4 { + return DirectoryOperationStats{}, fmt.Errorf("incorrect number of values for XFS directory operation stats: %d", l) + } + + return DirectoryOperationStats{ + Lookups: us[0], + Creates: us[1], + Removes: us[2], + Getdents: us[3], + }, nil +} + +// TransactionStats builds a TransactionStats from a slice of uint32s. +func transactionStats(us []uint32) (TransactionStats, error) { + if l := len(us); l != 3 { + return TransactionStats{}, fmt.Errorf("incorrect number of values for XFS transaction stats: %d", l) + } + + return TransactionStats{ + Sync: us[0], + Async: us[1], + Empty: us[2], + }, nil +} + +// InodeOperationStats builds an InodeOperationStats from a slice of uint32s. +func inodeOperationStats(us []uint32) (InodeOperationStats, error) { + if l := len(us); l != 7 { + return InodeOperationStats{}, fmt.Errorf("incorrect number of values for XFS inode operation stats: %d", l) + } + + return InodeOperationStats{ + Attempts: us[0], + Found: us[1], + Recycle: us[2], + Missed: us[3], + Duplicate: us[4], + Reclaims: us[5], + AttributeChange: us[6], + }, nil +} + +// LogOperationStats builds a LogOperationStats from a slice of uint32s. +func logOperationStats(us []uint32) (LogOperationStats, error) { + if l := len(us); l != 5 { + return LogOperationStats{}, fmt.Errorf("incorrect number of values for XFS log operation stats: %d", l) + } + + return LogOperationStats{ + Writes: us[0], + Blocks: us[1], + NoInternalBuffers: us[2], + Force: us[3], + ForceSleep: us[4], + }, nil +} + +// ReadWriteStats builds a ReadWriteStats from a slice of uint32s. +func readWriteStats(us []uint32) (ReadWriteStats, error) { + if l := len(us); l != 2 { + return ReadWriteStats{}, fmt.Errorf("incorrect number of values for XFS read write stats: %d", l) + } + + return ReadWriteStats{ + Read: us[0], + Write: us[1], + }, nil +} + +// AttributeOperationStats builds an AttributeOperationStats from a slice of uint32s. +func attributeOperationStats(us []uint32) (AttributeOperationStats, error) { + if l := len(us); l != 4 { + return AttributeOperationStats{}, fmt.Errorf("incorrect number of values for XFS attribute operation stats: %d", l) + } + + return AttributeOperationStats{ + Get: us[0], + Set: us[1], + Remove: us[2], + List: us[3], + }, nil +} + +// InodeClusteringStats builds an InodeClusteringStats from a slice of uint32s. +func inodeClusteringStats(us []uint32) (InodeClusteringStats, error) { + if l := len(us); l != 3 { + return InodeClusteringStats{}, fmt.Errorf("incorrect number of values for XFS inode clustering stats: %d", l) + } + + return InodeClusteringStats{ + Iflush: us[0], + Flush: us[1], + FlushInode: us[2], + }, nil +} + +// VnodeStats builds a VnodeStats from a slice of uint32s. +func vnodeStats(us []uint32) (VnodeStats, error) { + // The attribute "Free" appears to not be available on older XFS + // stats versions. Therefore, 7 or 8 elements may appear in + // this slice. + l := len(us) + if l != 7 && l != 8 { + return VnodeStats{}, fmt.Errorf("incorrect number of values for XFS vnode stats: %d", l) + } + + s := VnodeStats{ + Active: us[0], + Allocate: us[1], + Get: us[2], + Hold: us[3], + Release: us[4], + Reclaim: us[5], + Remove: us[6], + } + + // Skip adding free, unless it is present. The zero value will + // be used in place of an actual count. + if l == 7 { + return s, nil + } + + s.Free = us[7] + return s, nil +} + +// BufferStats builds a BufferStats from a slice of uint32s. +func bufferStats(us []uint32) (BufferStats, error) { + if l := len(us); l != 9 { + return BufferStats{}, fmt.Errorf("incorrect number of values for XFS buffer stats: %d", l) + } + + return BufferStats{ + Get: us[0], + Create: us[1], + GetLocked: us[2], + GetLockedWaited: us[3], + BusyLocked: us[4], + MissLocked: us[5], + PageRetries: us[6], + PageFound: us[7], + GetRead: us[8], + }, nil +} + +// ExtendedPrecisionStats builds an ExtendedPrecisionStats from a slice of uint32s. +func extendedPrecisionStats(us []uint64) (ExtendedPrecisionStats, error) { + if l := len(us); l != 3 { + return ExtendedPrecisionStats{}, fmt.Errorf("incorrect number of values for XFS extended precision stats: %d", l) + } + + return ExtendedPrecisionStats{ + FlushBytes: us[0], + WriteBytes: us[1], + ReadBytes: us[2], + }, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/xfs/xfs.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/xfs/xfs.go new file mode 100644 index 00000000..d86794b7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/prometheus/procfs/xfs/xfs.go @@ -0,0 +1,163 @@ +// Copyright 2017 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package xfs provides access to statistics exposed by the XFS filesystem. +package xfs + +// Stats contains XFS filesystem runtime statistics, parsed from +// /proc/fs/xfs/stat. +// +// The names and meanings of each statistic were taken from +// http://xfs.org/index.php/Runtime_Stats and xfs_stats.h in the Linux +// kernel source. Most counters are uint32s (same data types used in +// xfs_stats.h), but some of the "extended precision stats" are uint64s. +type Stats struct { + // The name of the filesystem used to source these statistics. + // If empty, this indicates aggregated statistics for all XFS + // filesystems on the host. + Name string + + ExtentAllocation ExtentAllocationStats + AllocationBTree BTreeStats + BlockMapping BlockMappingStats + BlockMapBTree BTreeStats + DirectoryOperation DirectoryOperationStats + Transaction TransactionStats + InodeOperation InodeOperationStats + LogOperation LogOperationStats + ReadWrite ReadWriteStats + AttributeOperation AttributeOperationStats + InodeClustering InodeClusteringStats + Vnode VnodeStats + Buffer BufferStats + ExtendedPrecision ExtendedPrecisionStats +} + +// ExtentAllocationStats contains statistics regarding XFS extent allocations. +type ExtentAllocationStats struct { + ExtentsAllocated uint32 + BlocksAllocated uint32 + ExtentsFreed uint32 + BlocksFreed uint32 +} + +// BTreeStats contains statistics regarding an XFS internal B-tree. +type BTreeStats struct { + Lookups uint32 + Compares uint32 + RecordsInserted uint32 + RecordsDeleted uint32 +} + +// BlockMappingStats contains statistics regarding XFS block maps. +type BlockMappingStats struct { + Reads uint32 + Writes uint32 + Unmaps uint32 + ExtentListInsertions uint32 + ExtentListDeletions uint32 + ExtentListLookups uint32 + ExtentListCompares uint32 +} + +// DirectoryOperationStats contains statistics regarding XFS directory entries. +type DirectoryOperationStats struct { + Lookups uint32 + Creates uint32 + Removes uint32 + Getdents uint32 +} + +// TransactionStats contains statistics regarding XFS metadata transactions. +type TransactionStats struct { + Sync uint32 + Async uint32 + Empty uint32 +} + +// InodeOperationStats contains statistics regarding XFS inode operations. +type InodeOperationStats struct { + Attempts uint32 + Found uint32 + Recycle uint32 + Missed uint32 + Duplicate uint32 + Reclaims uint32 + AttributeChange uint32 +} + +// LogOperationStats contains statistics regarding the XFS log buffer. +type LogOperationStats struct { + Writes uint32 + Blocks uint32 + NoInternalBuffers uint32 + Force uint32 + ForceSleep uint32 +} + +// ReadWriteStats contains statistics regarding the number of read and write +// system calls for XFS filesystems. +type ReadWriteStats struct { + Read uint32 + Write uint32 +} + +// AttributeOperationStats contains statistics regarding manipulation of +// XFS extended file attributes. +type AttributeOperationStats struct { + Get uint32 + Set uint32 + Remove uint32 + List uint32 +} + +// InodeClusteringStats contains statistics regarding XFS inode clustering +// operations. +type InodeClusteringStats struct { + Iflush uint32 + Flush uint32 + FlushInode uint32 +} + +// VnodeStats contains statistics regarding XFS vnode operations. +type VnodeStats struct { + Active uint32 + Allocate uint32 + Get uint32 + Hold uint32 + Release uint32 + Reclaim uint32 + Remove uint32 + Free uint32 +} + +// BufferStats contains statistics regarding XFS read/write I/O buffers. +type BufferStats struct { + Get uint32 + Create uint32 + GetLocked uint32 + GetLockedWaited uint32 + BusyLocked uint32 + MissLocked uint32 + PageRetries uint32 + PageFound uint32 + GetRead uint32 +} + +// ExtendedPrecisionStats contains high precision counters used to track the +// total number of bytes read, written, or flushed, during XFS operations. +type ExtendedPrecisionStats struct { + FlushBytes uint64 + WriteBytes uint64 + ReadBytes uint64 +} diff --git a/vendor/github.com/rs/cors/.travis.yml b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/rs/cors/.travis.yml similarity index 80% rename from vendor/github.com/rs/cors/.travis.yml rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/rs/cors/.travis.yml index 9a68b567..17e5e50d 100644 --- a/vendor/github.com/rs/cors/.travis.yml +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/rs/cors/.travis.yml @@ -1,8 +1,7 @@ language: go go: +- 1.9 - "1.10" -- "1.11" -- "1.12" - tip matrix: allow_failures: diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/rs/cors/LICENSE b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/rs/cors/LICENSE new file mode 100644 index 00000000..d8e2df5a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/rs/cors/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2014 Olivier Poitrey + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/github.com/rs/cors/README.md b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/rs/cors/README.md similarity index 100% rename from vendor/github.com/rs/cors/README.md rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/rs/cors/README.md diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/rs/cors/cors.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/rs/cors/cors.go new file mode 100644 index 00000000..d301ca72 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/rs/cors/cors.go @@ -0,0 +1,417 @@ +/* +Package cors is net/http handler to handle CORS related requests +as defined by http://www.w3.org/TR/cors/ + +You can configure it by passing an option struct to cors.New: + + c := cors.New(cors.Options{ + AllowedOrigins: []string{"foo.com"}, + AllowedMethods: []string{"GET", "POST", "DELETE"}, + AllowCredentials: true, + }) + +Then insert the handler in the chain: + + handler = c.Handler(handler) + +See Options documentation for more options. + +The resulting handler is a standard net/http handler. +*/ +package cors + +import ( + "log" + "net/http" + "os" + "strconv" + "strings" +) + +// Options is a configuration container to setup the CORS middleware. +type Options struct { + // AllowedOrigins is a list of origins a cross-domain request can be executed from. + // If the special "*" value is present in the list, all origins will be allowed. + // An origin may contain a wildcard (*) to replace 0 or more characters + // (i.e.: http://*.domain.com). Usage of wildcards implies a small performance penalty. + // Only one wildcard can be used per origin. + // Default value is ["*"] + AllowedOrigins []string + // AllowOriginFunc is a custom function to validate the origin. It take the origin + // as argument and returns true if allowed or false otherwise. If this option is + // set, the content of AllowedOrigins is ignored. + AllowOriginFunc func(origin string) bool + // AllowOriginFunc is a custom function to validate the origin. It takes the HTTP Request object and the origin as + // argument and returns true if allowed or false otherwise. If this option is set, the content of `AllowedOrigins` + // and `AllowOriginFunc` is ignored. + AllowOriginRequestFunc func(r *http.Request, origin string) bool + // AllowedMethods is a list of methods the client is allowed to use with + // cross-domain requests. Default value is simple methods (HEAD, GET and POST). + AllowedMethods []string + // AllowedHeaders is list of non simple headers the client is allowed to use with + // cross-domain requests. + // If the special "*" value is present in the list, all headers will be allowed. + // Default value is [] but "Origin" is always appended to the list. + AllowedHeaders []string + // ExposedHeaders indicates which headers are safe to expose to the API of a CORS + // API specification + ExposedHeaders []string + // MaxAge indicates how long (in seconds) the results of a preflight request + // can be cached + MaxAge int + // AllowCredentials indicates whether the request can include user credentials like + // cookies, HTTP authentication or client side SSL certificates. + AllowCredentials bool + // OptionsPassthrough instructs preflight to let other potential next handlers to + // process the OPTIONS method. Turn this on if your application handles OPTIONS. + OptionsPassthrough bool + // Debugging flag adds additional output to debug server side CORS issues + Debug bool +} + +// Cors http handler +type Cors struct { + // Debug logger + Log *log.Logger + // Normalized list of plain allowed origins + allowedOrigins []string + // List of allowed origins containing wildcards + allowedWOrigins []wildcard + // Optional origin validator function + allowOriginFunc func(origin string) bool + // Optional origin validator (with request) function + allowOriginRequestFunc func(r *http.Request, origin string) bool + // Normalized list of allowed headers + allowedHeaders []string + // Normalized list of allowed methods + allowedMethods []string + // Normalized list of exposed headers + exposedHeaders []string + maxAge int + // Set to true when allowed origins contains a "*" + allowedOriginsAll bool + // Set to true when allowed headers contains a "*" + allowedHeadersAll bool + allowCredentials bool + optionPassthrough bool +} + +// New creates a new Cors handler with the provided options. +func New(options Options) *Cors { + c := &Cors{ + exposedHeaders: convert(options.ExposedHeaders, http.CanonicalHeaderKey), + allowOriginFunc: options.AllowOriginFunc, + allowOriginRequestFunc: options.AllowOriginRequestFunc, + allowCredentials: options.AllowCredentials, + maxAge: options.MaxAge, + optionPassthrough: options.OptionsPassthrough, + } + if options.Debug { + c.Log = log.New(os.Stdout, "[cors] ", log.LstdFlags) + } + + // Normalize options + // Note: for origins and methods matching, the spec requires a case-sensitive matching. + // As it may error prone, we chose to ignore the spec here. + + // Allowed Origins + if len(options.AllowedOrigins) == 0 { + if options.AllowOriginFunc == nil && options.AllowOriginRequestFunc == nil { + // Default is all origins + c.allowedOriginsAll = true + } + } else { + c.allowedOrigins = []string{} + c.allowedWOrigins = []wildcard{} + for _, origin := range options.AllowedOrigins { + // Normalize + origin = strings.ToLower(origin) + if origin == "*" { + // If "*" is present in the list, turn the whole list into a match all + c.allowedOriginsAll = true + c.allowedOrigins = nil + c.allowedWOrigins = nil + break + } else if i := strings.IndexByte(origin, '*'); i >= 0 { + // Split the origin in two: start and end string without the * + w := wildcard{origin[0:i], origin[i+1:]} + c.allowedWOrigins = append(c.allowedWOrigins, w) + } else { + c.allowedOrigins = append(c.allowedOrigins, origin) + } + } + } + + // Allowed Headers + if len(options.AllowedHeaders) == 0 { + // Use sensible defaults + c.allowedHeaders = []string{"Origin", "Accept", "Content-Type", "X-Requested-With"} + } else { + // Origin is always appended as some browsers will always request for this header at preflight + c.allowedHeaders = convert(append(options.AllowedHeaders, "Origin"), http.CanonicalHeaderKey) + for _, h := range options.AllowedHeaders { + if h == "*" { + c.allowedHeadersAll = true + c.allowedHeaders = nil + break + } + } + } + + // Allowed Methods + if len(options.AllowedMethods) == 0 { + // Default is spec's "simple" methods + c.allowedMethods = []string{"GET", "POST", "HEAD"} + } else { + c.allowedMethods = convert(options.AllowedMethods, strings.ToUpper) + } + + return c +} + +// Default creates a new Cors handler with default options. +func Default() *Cors { + return New(Options{}) +} + +// AllowAll create a new Cors handler with permissive configuration allowing all +// origins with all standard methods with any header and credentials. +func AllowAll() *Cors { + return New(Options{ + AllowedOrigins: []string{"*"}, + AllowedMethods: []string{"HEAD", "GET", "POST", "PUT", "PATCH", "DELETE"}, + AllowedHeaders: []string{"*"}, + AllowCredentials: false, + }) +} + +// Handler apply the CORS specification on the request, and add relevant CORS headers +// as necessary. +func (c *Cors) Handler(h http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method == http.MethodOptions && r.Header.Get("Access-Control-Request-Method") != "" { + c.logf("Handler: Preflight request") + c.handlePreflight(w, r) + // Preflight requests are standalone and should stop the chain as some other + // middleware may not handle OPTIONS requests correctly. One typical example + // is authentication middleware ; OPTIONS requests won't carry authentication + // headers (see #1) + if c.optionPassthrough { + h.ServeHTTP(w, r) + } else { + w.WriteHeader(http.StatusOK) + } + } else { + c.logf("Handler: Actual request") + c.handleActualRequest(w, r) + h.ServeHTTP(w, r) + } + }) +} + +// HandlerFunc provides Martini compatible handler +func (c *Cors) HandlerFunc(w http.ResponseWriter, r *http.Request) { + if r.Method == http.MethodOptions && r.Header.Get("Access-Control-Request-Method") != "" { + c.logf("HandlerFunc: Preflight request") + c.handlePreflight(w, r) + } else { + c.logf("HandlerFunc: Actual request") + c.handleActualRequest(w, r) + } +} + +// Negroni compatible interface +func (c *Cors) ServeHTTP(w http.ResponseWriter, r *http.Request, next http.HandlerFunc) { + if r.Method == http.MethodOptions && r.Header.Get("Access-Control-Request-Method") != "" { + c.logf("ServeHTTP: Preflight request") + c.handlePreflight(w, r) + // Preflight requests are standalone and should stop the chain as some other + // middleware may not handle OPTIONS requests correctly. One typical example + // is authentication middleware ; OPTIONS requests won't carry authentication + // headers (see #1) + if c.optionPassthrough { + next(w, r) + } else { + w.WriteHeader(http.StatusOK) + } + } else { + c.logf("ServeHTTP: Actual request") + c.handleActualRequest(w, r) + next(w, r) + } +} + +// handlePreflight handles pre-flight CORS requests +func (c *Cors) handlePreflight(w http.ResponseWriter, r *http.Request) { + headers := w.Header() + origin := r.Header.Get("Origin") + + if r.Method != http.MethodOptions { + c.logf(" Preflight aborted: %s!=OPTIONS", r.Method) + return + } + // Always set Vary headers + // see https://github.com/rs/cors/issues/10, + // https://github.com/rs/cors/commit/dbdca4d95feaa7511a46e6f1efb3b3aa505bc43f#commitcomment-12352001 + headers.Add("Vary", "Origin") + headers.Add("Vary", "Access-Control-Request-Method") + headers.Add("Vary", "Access-Control-Request-Headers") + + if origin == "" { + c.logf(" Preflight aborted: empty origin") + return + } + if !c.isOriginAllowed(r, origin) { + c.logf(" Preflight aborted: origin '%s' not allowed", origin) + return + } + + reqMethod := r.Header.Get("Access-Control-Request-Method") + if !c.isMethodAllowed(reqMethod) { + c.logf(" Preflight aborted: method '%s' not allowed", reqMethod) + return + } + reqHeaders := parseHeaderList(r.Header.Get("Access-Control-Request-Headers")) + if !c.areHeadersAllowed(reqHeaders) { + c.logf(" Preflight aborted: headers '%v' not allowed", reqHeaders) + return + } + if c.allowedOriginsAll { + headers.Set("Access-Control-Allow-Origin", "*") + } else { + headers.Set("Access-Control-Allow-Origin", origin) + } + // Spec says: Since the list of methods can be unbounded, simply returning the method indicated + // by Access-Control-Request-Method (if supported) can be enough + headers.Set("Access-Control-Allow-Methods", strings.ToUpper(reqMethod)) + if len(reqHeaders) > 0 { + + // Spec says: Since the list of headers can be unbounded, simply returning supported headers + // from Access-Control-Request-Headers can be enough + headers.Set("Access-Control-Allow-Headers", strings.Join(reqHeaders, ", ")) + } + if c.allowCredentials { + headers.Set("Access-Control-Allow-Credentials", "true") + } + if c.maxAge > 0 { + headers.Set("Access-Control-Max-Age", strconv.Itoa(c.maxAge)) + } + c.logf(" Preflight response headers: %v", headers) +} + +// handleActualRequest handles simple cross-origin requests, actual request or redirects +func (c *Cors) handleActualRequest(w http.ResponseWriter, r *http.Request) { + headers := w.Header() + origin := r.Header.Get("Origin") + + if r.Method == http.MethodOptions { + c.logf(" Actual request no headers added: method == %s", r.Method) + return + } + // Always set Vary, see https://github.com/rs/cors/issues/10 + headers.Add("Vary", "Origin") + if origin == "" { + c.logf(" Actual request no headers added: missing origin") + return + } + if !c.isOriginAllowed(r, origin) { + c.logf(" Actual request no headers added: origin '%s' not allowed", origin) + return + } + + // Note that spec does define a way to specifically disallow a simple method like GET or + // POST. Access-Control-Allow-Methods is only used for pre-flight requests and the + // spec doesn't instruct to check the allowed methods for simple cross-origin requests. + // We think it's a nice feature to be able to have control on those methods though. + if !c.isMethodAllowed(r.Method) { + c.logf(" Actual request no headers added: method '%s' not allowed", r.Method) + + return + } + if c.allowedOriginsAll { + headers.Set("Access-Control-Allow-Origin", "*") + } else { + headers.Set("Access-Control-Allow-Origin", origin) + } + if len(c.exposedHeaders) > 0 { + headers.Set("Access-Control-Expose-Headers", strings.Join(c.exposedHeaders, ", ")) + } + if c.allowCredentials { + headers.Set("Access-Control-Allow-Credentials", "true") + } + c.logf(" Actual response added headers: %v", headers) +} + +// convenience method. checks if debugging is turned on before printing +func (c *Cors) logf(format string, a ...interface{}) { + if c.Log != nil { + c.Log.Printf(format, a...) + } +} + +// isOriginAllowed checks if a given origin is allowed to perform cross-domain requests +// on the endpoint +func (c *Cors) isOriginAllowed(r *http.Request, origin string) bool { + if c.allowOriginRequestFunc != nil { + return c.allowOriginRequestFunc(r, origin) + } + if c.allowOriginFunc != nil { + return c.allowOriginFunc(origin) + } + if c.allowedOriginsAll { + return true + } + origin = strings.ToLower(origin) + for _, o := range c.allowedOrigins { + if o == origin { + return true + } + } + for _, w := range c.allowedWOrigins { + if w.match(origin) { + return true + } + } + return false +} + +// isMethodAllowed checks if a given method can be used as part of a cross-domain request +// on the endpoing +func (c *Cors) isMethodAllowed(method string) bool { + if len(c.allowedMethods) == 0 { + // If no method allowed, always return false, even for preflight request + return false + } + method = strings.ToUpper(method) + if method == http.MethodOptions { + // Always allow preflight requests + return true + } + for _, m := range c.allowedMethods { + if m == method { + return true + } + } + return false +} + +// areHeadersAllowed checks if a given list of headers are allowed to used within +// a cross-domain request. +func (c *Cors) areHeadersAllowed(requestedHeaders []string) bool { + if c.allowedHeadersAll || len(requestedHeaders) == 0 { + return true + } + for _, header := range requestedHeaders { + header = http.CanonicalHeaderKey(header) + found := false + for _, h := range c.allowedHeaders { + if h == header { + found = true + } + } + if !found { + return false + } + } + return true +} diff --git a/vendor/github.com/rs/cors/go.mod b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/rs/cors/go.mod similarity index 100% rename from vendor/github.com/rs/cors/go.mod rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/rs/cors/go.mod diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/rs/cors/utils.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/rs/cors/utils.go new file mode 100644 index 00000000..53ad9e9d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/rs/cors/utils.go @@ -0,0 +1,71 @@ +package cors + +import "strings" + +const toLower = 'a' - 'A' + +type converter func(string) string + +type wildcard struct { + prefix string + suffix string +} + +func (w wildcard) match(s string) bool { + return len(s) >= len(w.prefix+w.suffix) && strings.HasPrefix(s, w.prefix) && strings.HasSuffix(s, w.suffix) +} + +// convert converts a list of string using the passed converter function +func convert(s []string, c converter) []string { + out := []string{} + for _, i := range s { + out = append(out, c(i)) + } + return out +} + +// parseHeaderList tokenize + normalize a string containing a list of headers +func parseHeaderList(headerList string) []string { + l := len(headerList) + h := make([]byte, 0, l) + upper := true + // Estimate the number headers in order to allocate the right splice size + t := 0 + for i := 0; i < l; i++ { + if headerList[i] == ',' { + t++ + } + } + headers := make([]string, 0, t) + for i := 0; i < l; i++ { + b := headerList[i] + switch { + case b >= 'a' && b <= 'z': + if upper { + h = append(h, b-toLower) + } else { + h = append(h, b) + } + case b >= 'A' && b <= 'Z': + if !upper { + h = append(h, b+toLower) + } else { + h = append(h, b) + } + case b == '-' || b == '_' || (b >= '0' && b <= '9'): + h = append(h, b) + } + + if b == ' ' || b == ',' || i == l-1 { + if len(h) > 0 { + // Flush the found header + headers = append(headers, string(h)) + h = h[:0] + upper = true + } + } else { + upper = b == '-' || b == '_' + } + } + return headers +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sergi/go-diff/AUTHORS b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sergi/go-diff/AUTHORS new file mode 100644 index 00000000..2d7bb2bf --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sergi/go-diff/AUTHORS @@ -0,0 +1,25 @@ +# This is the official list of go-diff authors for copyright purposes. +# This file is distinct from the CONTRIBUTORS files. +# See the latter for an explanation. + +# Names should be added to this file as +# Name or Organization +# The email address is not required for organizations. + +# Please keep the list sorted. + +Danny Yoo +James Kolb +Jonathan Amsterdam +Markus Zimmermann +Matt Kovars +Örjan Persson +Osman Masood +Robert Carlsen +Rory Flynn +Sergi Mansilla +Shatrugna Sadhu +Shawn Smith +Stas Maksimov +Tor Arvid Lund +Zac Bergquist diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sergi/go-diff/CONTRIBUTORS b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sergi/go-diff/CONTRIBUTORS new file mode 100644 index 00000000..369e3d55 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sergi/go-diff/CONTRIBUTORS @@ -0,0 +1,32 @@ +# This is the official list of people who can contribute +# (and typically have contributed) code to the go-diff +# repository. +# +# The AUTHORS file lists the copyright holders; this file +# lists people. For example, ACME Inc. employees would be listed here +# but not in AUTHORS, because ACME Inc. would hold the copyright. +# +# When adding J Random Contributor's name to this file, +# either J's name or J's organization's name should be +# added to the AUTHORS file. +# +# Names should be added to this file like so: +# Name +# +# Please keep the list sorted. + +Danny Yoo +James Kolb +Jonathan Amsterdam +Markus Zimmermann +Matt Kovars +Örjan Persson +Osman Masood +Robert Carlsen +Rory Flynn +Sergi Mansilla +Shatrugna Sadhu +Shawn Smith +Stas Maksimov +Tor Arvid Lund +Zac Bergquist diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sergi/go-diff/LICENSE b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sergi/go-diff/LICENSE new file mode 100644 index 00000000..937942c2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sergi/go-diff/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2012-2016 The go-diff Authors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sergi/go-diff/diffmatchpatch/diff.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sergi/go-diff/diffmatchpatch/diff.go new file mode 100644 index 00000000..82ad7bc8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sergi/go-diff/diffmatchpatch/diff.go @@ -0,0 +1,1344 @@ +// Copyright (c) 2012-2016 The go-diff authors. All rights reserved. +// https://github.com/sergi/go-diff +// See the included LICENSE file for license details. +// +// go-diff is a Go implementation of Google's Diff, Match, and Patch library +// Original library is Copyright (c) 2006 Google Inc. +// http://code.google.com/p/google-diff-match-patch/ + +package diffmatchpatch + +import ( + "bytes" + "errors" + "fmt" + "html" + "math" + "net/url" + "regexp" + "strconv" + "strings" + "time" + "unicode/utf8" +) + +// Operation defines the operation of a diff item. +type Operation int8 + +const ( + // DiffDelete item represents a delete diff. + DiffDelete Operation = -1 + // DiffInsert item represents an insert diff. + DiffInsert Operation = 1 + // DiffEqual item represents an equal diff. + DiffEqual Operation = 0 +) + +// Diff represents one diff operation +type Diff struct { + Type Operation + Text string +} + +func splice(slice []Diff, index int, amount int, elements ...Diff) []Diff { + return append(slice[:index], append(elements, slice[index+amount:]...)...) +} + +// DiffMain finds the differences between two texts. +// If an invalid UTF-8 sequence is encountered, it will be replaced by the Unicode replacement character. +func (dmp *DiffMatchPatch) DiffMain(text1, text2 string, checklines bool) []Diff { + return dmp.DiffMainRunes([]rune(text1), []rune(text2), checklines) +} + +// DiffMainRunes finds the differences between two rune sequences. +// If an invalid UTF-8 sequence is encountered, it will be replaced by the Unicode replacement character. +func (dmp *DiffMatchPatch) DiffMainRunes(text1, text2 []rune, checklines bool) []Diff { + var deadline time.Time + if dmp.DiffTimeout > 0 { + deadline = time.Now().Add(dmp.DiffTimeout) + } + return dmp.diffMainRunes(text1, text2, checklines, deadline) +} + +func (dmp *DiffMatchPatch) diffMainRunes(text1, text2 []rune, checklines bool, deadline time.Time) []Diff { + if runesEqual(text1, text2) { + var diffs []Diff + if len(text1) > 0 { + diffs = append(diffs, Diff{DiffEqual, string(text1)}) + } + return diffs + } + // Trim off common prefix (speedup). + commonlength := commonPrefixLength(text1, text2) + commonprefix := text1[:commonlength] + text1 = text1[commonlength:] + text2 = text2[commonlength:] + + // Trim off common suffix (speedup). + commonlength = commonSuffixLength(text1, text2) + commonsuffix := text1[len(text1)-commonlength:] + text1 = text1[:len(text1)-commonlength] + text2 = text2[:len(text2)-commonlength] + + // Compute the diff on the middle block. + diffs := dmp.diffCompute(text1, text2, checklines, deadline) + + // Restore the prefix and suffix. + if len(commonprefix) != 0 { + diffs = append([]Diff{Diff{DiffEqual, string(commonprefix)}}, diffs...) + } + if len(commonsuffix) != 0 { + diffs = append(diffs, Diff{DiffEqual, string(commonsuffix)}) + } + + return dmp.DiffCleanupMerge(diffs) +} + +// diffCompute finds the differences between two rune slices. Assumes that the texts do not have any common prefix or suffix. +func (dmp *DiffMatchPatch) diffCompute(text1, text2 []rune, checklines bool, deadline time.Time) []Diff { + diffs := []Diff{} + if len(text1) == 0 { + // Just add some text (speedup). + return append(diffs, Diff{DiffInsert, string(text2)}) + } else if len(text2) == 0 { + // Just delete some text (speedup). + return append(diffs, Diff{DiffDelete, string(text1)}) + } + + var longtext, shorttext []rune + if len(text1) > len(text2) { + longtext = text1 + shorttext = text2 + } else { + longtext = text2 + shorttext = text1 + } + + if i := runesIndex(longtext, shorttext); i != -1 { + op := DiffInsert + // Swap insertions for deletions if diff is reversed. + if len(text1) > len(text2) { + op = DiffDelete + } + // Shorter text is inside the longer text (speedup). + return []Diff{ + Diff{op, string(longtext[:i])}, + Diff{DiffEqual, string(shorttext)}, + Diff{op, string(longtext[i+len(shorttext):])}, + } + } else if len(shorttext) == 1 { + // Single character string. + // After the previous speedup, the character can't be an equality. + return []Diff{ + Diff{DiffDelete, string(text1)}, + Diff{DiffInsert, string(text2)}, + } + // Check to see if the problem can be split in two. + } else if hm := dmp.diffHalfMatch(text1, text2); hm != nil { + // A half-match was found, sort out the return data. + text1A := hm[0] + text1B := hm[1] + text2A := hm[2] + text2B := hm[3] + midCommon := hm[4] + // Send both pairs off for separate processing. + diffsA := dmp.diffMainRunes(text1A, text2A, checklines, deadline) + diffsB := dmp.diffMainRunes(text1B, text2B, checklines, deadline) + // Merge the results. + return append(diffsA, append([]Diff{Diff{DiffEqual, string(midCommon)}}, diffsB...)...) + } else if checklines && len(text1) > 100 && len(text2) > 100 { + return dmp.diffLineMode(text1, text2, deadline) + } + return dmp.diffBisect(text1, text2, deadline) +} + +// diffLineMode does a quick line-level diff on both []runes, then rediff the parts for greater accuracy. This speedup can produce non-minimal diffs. +func (dmp *DiffMatchPatch) diffLineMode(text1, text2 []rune, deadline time.Time) []Diff { + // Scan the text on a line-by-line basis first. + text1, text2, linearray := dmp.diffLinesToRunes(text1, text2) + + diffs := dmp.diffMainRunes(text1, text2, false, deadline) + + // Convert the diff back to original text. + diffs = dmp.DiffCharsToLines(diffs, linearray) + // Eliminate freak matches (e.g. blank lines) + diffs = dmp.DiffCleanupSemantic(diffs) + + // Rediff any replacement blocks, this time character-by-character. + // Add a dummy entry at the end. + diffs = append(diffs, Diff{DiffEqual, ""}) + + pointer := 0 + countDelete := 0 + countInsert := 0 + + // NOTE: Rune slices are slower than using strings in this case. + textDelete := "" + textInsert := "" + + for pointer < len(diffs) { + switch diffs[pointer].Type { + case DiffInsert: + countInsert++ + textInsert += diffs[pointer].Text + case DiffDelete: + countDelete++ + textDelete += diffs[pointer].Text + case DiffEqual: + // Upon reaching an equality, check for prior redundancies. + if countDelete >= 1 && countInsert >= 1 { + // Delete the offending records and add the merged ones. + diffs = splice(diffs, pointer-countDelete-countInsert, + countDelete+countInsert) + + pointer = pointer - countDelete - countInsert + a := dmp.diffMainRunes([]rune(textDelete), []rune(textInsert), false, deadline) + for j := len(a) - 1; j >= 0; j-- { + diffs = splice(diffs, pointer, 0, a[j]) + } + pointer = pointer + len(a) + } + + countInsert = 0 + countDelete = 0 + textDelete = "" + textInsert = "" + } + pointer++ + } + + return diffs[:len(diffs)-1] // Remove the dummy entry at the end. +} + +// DiffBisect finds the 'middle snake' of a diff, split the problem in two and return the recursively constructed diff. +// If an invalid UTF-8 sequence is encountered, it will be replaced by the Unicode replacement character. +// See Myers 1986 paper: An O(ND) Difference Algorithm and Its Variations. +func (dmp *DiffMatchPatch) DiffBisect(text1, text2 string, deadline time.Time) []Diff { + // Unused in this code, but retained for interface compatibility. + return dmp.diffBisect([]rune(text1), []rune(text2), deadline) +} + +// diffBisect finds the 'middle snake' of a diff, splits the problem in two and returns the recursively constructed diff. +// See Myers's 1986 paper: An O(ND) Difference Algorithm and Its Variations. +func (dmp *DiffMatchPatch) diffBisect(runes1, runes2 []rune, deadline time.Time) []Diff { + // Cache the text lengths to prevent multiple calls. + runes1Len, runes2Len := len(runes1), len(runes2) + + maxD := (runes1Len + runes2Len + 1) / 2 + vOffset := maxD + vLength := 2 * maxD + + v1 := make([]int, vLength) + v2 := make([]int, vLength) + for i := range v1 { + v1[i] = -1 + v2[i] = -1 + } + v1[vOffset+1] = 0 + v2[vOffset+1] = 0 + + delta := runes1Len - runes2Len + // If the total number of characters is odd, then the front path will collide with the reverse path. + front := (delta%2 != 0) + // Offsets for start and end of k loop. Prevents mapping of space beyond the grid. + k1start := 0 + k1end := 0 + k2start := 0 + k2end := 0 + for d := 0; d < maxD; d++ { + // Bail out if deadline is reached. + if !deadline.IsZero() && time.Now().After(deadline) { + break + } + + // Walk the front path one step. + for k1 := -d + k1start; k1 <= d-k1end; k1 += 2 { + k1Offset := vOffset + k1 + var x1 int + + if k1 == -d || (k1 != d && v1[k1Offset-1] < v1[k1Offset+1]) { + x1 = v1[k1Offset+1] + } else { + x1 = v1[k1Offset-1] + 1 + } + + y1 := x1 - k1 + for x1 < runes1Len && y1 < runes2Len { + if runes1[x1] != runes2[y1] { + break + } + x1++ + y1++ + } + v1[k1Offset] = x1 + if x1 > runes1Len { + // Ran off the right of the graph. + k1end += 2 + } else if y1 > runes2Len { + // Ran off the bottom of the graph. + k1start += 2 + } else if front { + k2Offset := vOffset + delta - k1 + if k2Offset >= 0 && k2Offset < vLength && v2[k2Offset] != -1 { + // Mirror x2 onto top-left coordinate system. + x2 := runes1Len - v2[k2Offset] + if x1 >= x2 { + // Overlap detected. + return dmp.diffBisectSplit(runes1, runes2, x1, y1, deadline) + } + } + } + } + // Walk the reverse path one step. + for k2 := -d + k2start; k2 <= d-k2end; k2 += 2 { + k2Offset := vOffset + k2 + var x2 int + if k2 == -d || (k2 != d && v2[k2Offset-1] < v2[k2Offset+1]) { + x2 = v2[k2Offset+1] + } else { + x2 = v2[k2Offset-1] + 1 + } + var y2 = x2 - k2 + for x2 < runes1Len && y2 < runes2Len { + if runes1[runes1Len-x2-1] != runes2[runes2Len-y2-1] { + break + } + x2++ + y2++ + } + v2[k2Offset] = x2 + if x2 > runes1Len { + // Ran off the left of the graph. + k2end += 2 + } else if y2 > runes2Len { + // Ran off the top of the graph. + k2start += 2 + } else if !front { + k1Offset := vOffset + delta - k2 + if k1Offset >= 0 && k1Offset < vLength && v1[k1Offset] != -1 { + x1 := v1[k1Offset] + y1 := vOffset + x1 - k1Offset + // Mirror x2 onto top-left coordinate system. + x2 = runes1Len - x2 + if x1 >= x2 { + // Overlap detected. + return dmp.diffBisectSplit(runes1, runes2, x1, y1, deadline) + } + } + } + } + } + // Diff took too long and hit the deadline or number of diffs equals number of characters, no commonality at all. + return []Diff{ + Diff{DiffDelete, string(runes1)}, + Diff{DiffInsert, string(runes2)}, + } +} + +func (dmp *DiffMatchPatch) diffBisectSplit(runes1, runes2 []rune, x, y int, + deadline time.Time) []Diff { + runes1a := runes1[:x] + runes2a := runes2[:y] + runes1b := runes1[x:] + runes2b := runes2[y:] + + // Compute both diffs serially. + diffs := dmp.diffMainRunes(runes1a, runes2a, false, deadline) + diffsb := dmp.diffMainRunes(runes1b, runes2b, false, deadline) + + return append(diffs, diffsb...) +} + +// DiffLinesToChars splits two texts into a list of strings, and educes the texts to a string of hashes where each Unicode character represents one line. +// It's slightly faster to call DiffLinesToRunes first, followed by DiffMainRunes. +func (dmp *DiffMatchPatch) DiffLinesToChars(text1, text2 string) (string, string, []string) { + chars1, chars2, lineArray := dmp.DiffLinesToRunes(text1, text2) + return string(chars1), string(chars2), lineArray +} + +// DiffLinesToRunes splits two texts into a list of runes. Each rune represents one line. +func (dmp *DiffMatchPatch) DiffLinesToRunes(text1, text2 string) ([]rune, []rune, []string) { + // '\x00' is a valid character, but various debuggers don't like it. So we'll insert a junk entry to avoid generating a null character. + lineArray := []string{""} // e.g. lineArray[4] == 'Hello\n' + lineHash := map[string]int{} // e.g. lineHash['Hello\n'] == 4 + + chars1 := dmp.diffLinesToRunesMunge(text1, &lineArray, lineHash) + chars2 := dmp.diffLinesToRunesMunge(text2, &lineArray, lineHash) + + return chars1, chars2, lineArray +} + +func (dmp *DiffMatchPatch) diffLinesToRunes(text1, text2 []rune) ([]rune, []rune, []string) { + return dmp.DiffLinesToRunes(string(text1), string(text2)) +} + +// diffLinesToRunesMunge splits a text into an array of strings, and reduces the texts to a []rune where each Unicode character represents one line. +// We use strings instead of []runes as input mainly because you can't use []rune as a map key. +func (dmp *DiffMatchPatch) diffLinesToRunesMunge(text string, lineArray *[]string, lineHash map[string]int) []rune { + // Walk the text, pulling out a substring for each line. text.split('\n') would would temporarily double our memory footprint. Modifying text would create many large strings to garbage collect. + lineStart := 0 + lineEnd := -1 + runes := []rune{} + + for lineEnd < len(text)-1 { + lineEnd = indexOf(text, "\n", lineStart) + + if lineEnd == -1 { + lineEnd = len(text) - 1 + } + + line := text[lineStart : lineEnd+1] + lineStart = lineEnd + 1 + lineValue, ok := lineHash[line] + + if ok { + runes = append(runes, rune(lineValue)) + } else { + *lineArray = append(*lineArray, line) + lineHash[line] = len(*lineArray) - 1 + runes = append(runes, rune(len(*lineArray)-1)) + } + } + + return runes +} + +// DiffCharsToLines rehydrates the text in a diff from a string of line hashes to real lines of text. +func (dmp *DiffMatchPatch) DiffCharsToLines(diffs []Diff, lineArray []string) []Diff { + hydrated := make([]Diff, 0, len(diffs)) + for _, aDiff := range diffs { + chars := aDiff.Text + text := make([]string, len(chars)) + + for i, r := range chars { + text[i] = lineArray[r] + } + + aDiff.Text = strings.Join(text, "") + hydrated = append(hydrated, aDiff) + } + return hydrated +} + +// DiffCommonPrefix determines the common prefix length of two strings. +func (dmp *DiffMatchPatch) DiffCommonPrefix(text1, text2 string) int { + // Unused in this code, but retained for interface compatibility. + return commonPrefixLength([]rune(text1), []rune(text2)) +} + +// DiffCommonSuffix determines the common suffix length of two strings. +func (dmp *DiffMatchPatch) DiffCommonSuffix(text1, text2 string) int { + // Unused in this code, but retained for interface compatibility. + return commonSuffixLength([]rune(text1), []rune(text2)) +} + +// commonPrefixLength returns the length of the common prefix of two rune slices. +func commonPrefixLength(text1, text2 []rune) int { + short, long := text1, text2 + if len(short) > len(long) { + short, long = long, short + } + for i, r := range short { + if r != long[i] { + return i + } + } + return len(short) +} + +// commonSuffixLength returns the length of the common suffix of two rune slices. +func commonSuffixLength(text1, text2 []rune) int { + n := min(len(text1), len(text2)) + for i := 0; i < n; i++ { + if text1[len(text1)-i-1] != text2[len(text2)-i-1] { + return i + } + } + return n + + // TODO research and benchmark this, why is it not activated? https://github.com/sergi/go-diff/issues/54 + // Binary search. + // Performance analysis: http://neil.fraser.name/news/2007/10/09/ + /* + pointermin := 0 + pointermax := math.Min(len(text1), len(text2)) + pointermid := pointermax + pointerend := 0 + for pointermin < pointermid { + if text1[len(text1)-pointermid:len(text1)-pointerend] == + text2[len(text2)-pointermid:len(text2)-pointerend] { + pointermin = pointermid + pointerend = pointermin + } else { + pointermax = pointermid + } + pointermid = math.Floor((pointermax-pointermin)/2 + pointermin) + } + return pointermid + */ +} + +// DiffCommonOverlap determines if the suffix of one string is the prefix of another. +func (dmp *DiffMatchPatch) DiffCommonOverlap(text1 string, text2 string) int { + // Cache the text lengths to prevent multiple calls. + text1Length := len(text1) + text2Length := len(text2) + // Eliminate the null case. + if text1Length == 0 || text2Length == 0 { + return 0 + } + // Truncate the longer string. + if text1Length > text2Length { + text1 = text1[text1Length-text2Length:] + } else if text1Length < text2Length { + text2 = text2[0:text1Length] + } + textLength := int(math.Min(float64(text1Length), float64(text2Length))) + // Quick check for the worst case. + if text1 == text2 { + return textLength + } + + // Start by looking for a single character match and increase length until no match is found. Performance analysis: http://neil.fraser.name/news/2010/11/04/ + best := 0 + length := 1 + for { + pattern := text1[textLength-length:] + found := strings.Index(text2, pattern) + if found == -1 { + break + } + length += found + if found == 0 || text1[textLength-length:] == text2[0:length] { + best = length + length++ + } + } + + return best +} + +// DiffHalfMatch checks whether the two texts share a substring which is at least half the length of the longer text. This speedup can produce non-minimal diffs. +func (dmp *DiffMatchPatch) DiffHalfMatch(text1, text2 string) []string { + // Unused in this code, but retained for interface compatibility. + runeSlices := dmp.diffHalfMatch([]rune(text1), []rune(text2)) + if runeSlices == nil { + return nil + } + + result := make([]string, len(runeSlices)) + for i, r := range runeSlices { + result[i] = string(r) + } + return result +} + +func (dmp *DiffMatchPatch) diffHalfMatch(text1, text2 []rune) [][]rune { + if dmp.DiffTimeout <= 0 { + // Don't risk returning a non-optimal diff if we have unlimited time. + return nil + } + + var longtext, shorttext []rune + if len(text1) > len(text2) { + longtext = text1 + shorttext = text2 + } else { + longtext = text2 + shorttext = text1 + } + + if len(longtext) < 4 || len(shorttext)*2 < len(longtext) { + return nil // Pointless. + } + + // First check if the second quarter is the seed for a half-match. + hm1 := dmp.diffHalfMatchI(longtext, shorttext, int(float64(len(longtext)+3)/4)) + + // Check again based on the third quarter. + hm2 := dmp.diffHalfMatchI(longtext, shorttext, int(float64(len(longtext)+1)/2)) + + hm := [][]rune{} + if hm1 == nil && hm2 == nil { + return nil + } else if hm2 == nil { + hm = hm1 + } else if hm1 == nil { + hm = hm2 + } else { + // Both matched. Select the longest. + if len(hm1[4]) > len(hm2[4]) { + hm = hm1 + } else { + hm = hm2 + } + } + + // A half-match was found, sort out the return data. + if len(text1) > len(text2) { + return hm + } + + return [][]rune{hm[2], hm[3], hm[0], hm[1], hm[4]} +} + +// diffHalfMatchI checks if a substring of shorttext exist within longtext such that the substring is at least half the length of longtext? +// Returns a slice containing the prefix of longtext, the suffix of longtext, the prefix of shorttext, the suffix of shorttext and the common middle, or null if there was no match. +func (dmp *DiffMatchPatch) diffHalfMatchI(l, s []rune, i int) [][]rune { + var bestCommonA []rune + var bestCommonB []rune + var bestCommonLen int + var bestLongtextA []rune + var bestLongtextB []rune + var bestShorttextA []rune + var bestShorttextB []rune + + // Start with a 1/4 length substring at position i as a seed. + seed := l[i : i+len(l)/4] + + for j := runesIndexOf(s, seed, 0); j != -1; j = runesIndexOf(s, seed, j+1) { + prefixLength := commonPrefixLength(l[i:], s[j:]) + suffixLength := commonSuffixLength(l[:i], s[:j]) + + if bestCommonLen < suffixLength+prefixLength { + bestCommonA = s[j-suffixLength : j] + bestCommonB = s[j : j+prefixLength] + bestCommonLen = len(bestCommonA) + len(bestCommonB) + bestLongtextA = l[:i-suffixLength] + bestLongtextB = l[i+prefixLength:] + bestShorttextA = s[:j-suffixLength] + bestShorttextB = s[j+prefixLength:] + } + } + + if bestCommonLen*2 < len(l) { + return nil + } + + return [][]rune{ + bestLongtextA, + bestLongtextB, + bestShorttextA, + bestShorttextB, + append(bestCommonA, bestCommonB...), + } +} + +// DiffCleanupSemantic reduces the number of edits by eliminating semantically trivial equalities. +func (dmp *DiffMatchPatch) DiffCleanupSemantic(diffs []Diff) []Diff { + changes := false + // Stack of indices where equalities are found. + type equality struct { + data int + next *equality + } + var equalities *equality + + var lastequality string + // Always equal to diffs[equalities[equalitiesLength - 1]][1] + var pointer int // Index of current position. + // Number of characters that changed prior to the equality. + var lengthInsertions1, lengthDeletions1 int + // Number of characters that changed after the equality. + var lengthInsertions2, lengthDeletions2 int + + for pointer < len(diffs) { + if diffs[pointer].Type == DiffEqual { + // Equality found. + + equalities = &equality{ + data: pointer, + next: equalities, + } + lengthInsertions1 = lengthInsertions2 + lengthDeletions1 = lengthDeletions2 + lengthInsertions2 = 0 + lengthDeletions2 = 0 + lastequality = diffs[pointer].Text + } else { + // An insertion or deletion. + + if diffs[pointer].Type == DiffInsert { + lengthInsertions2 += len(diffs[pointer].Text) + } else { + lengthDeletions2 += len(diffs[pointer].Text) + } + // Eliminate an equality that is smaller or equal to the edits on both sides of it. + difference1 := int(math.Max(float64(lengthInsertions1), float64(lengthDeletions1))) + difference2 := int(math.Max(float64(lengthInsertions2), float64(lengthDeletions2))) + if len(lastequality) > 0 && + (len(lastequality) <= difference1) && + (len(lastequality) <= difference2) { + // Duplicate record. + insPoint := equalities.data + diffs = append( + diffs[:insPoint], + append([]Diff{Diff{DiffDelete, lastequality}}, diffs[insPoint:]...)...) + + // Change second copy to insert. + diffs[insPoint+1].Type = DiffInsert + // Throw away the equality we just deleted. + equalities = equalities.next + + if equalities != nil { + equalities = equalities.next + } + if equalities != nil { + pointer = equalities.data + } else { + pointer = -1 + } + + lengthInsertions1 = 0 // Reset the counters. + lengthDeletions1 = 0 + lengthInsertions2 = 0 + lengthDeletions2 = 0 + lastequality = "" + changes = true + } + } + pointer++ + } + + // Normalize the diff. + if changes { + diffs = dmp.DiffCleanupMerge(diffs) + } + diffs = dmp.DiffCleanupSemanticLossless(diffs) + // Find any overlaps between deletions and insertions. + // e.g: abcxxxxxxdef + // -> abcxxxdef + // e.g: xxxabcdefxxx + // -> defxxxabc + // Only extract an overlap if it is as big as the edit ahead or behind it. + pointer = 1 + for pointer < len(diffs) { + if diffs[pointer-1].Type == DiffDelete && + diffs[pointer].Type == DiffInsert { + deletion := diffs[pointer-1].Text + insertion := diffs[pointer].Text + overlapLength1 := dmp.DiffCommonOverlap(deletion, insertion) + overlapLength2 := dmp.DiffCommonOverlap(insertion, deletion) + if overlapLength1 >= overlapLength2 { + if float64(overlapLength1) >= float64(len(deletion))/2 || + float64(overlapLength1) >= float64(len(insertion))/2 { + + // Overlap found. Insert an equality and trim the surrounding edits. + diffs = append( + diffs[:pointer], + append([]Diff{Diff{DiffEqual, insertion[:overlapLength1]}}, diffs[pointer:]...)...) + + diffs[pointer-1].Text = + deletion[0 : len(deletion)-overlapLength1] + diffs[pointer+1].Text = insertion[overlapLength1:] + pointer++ + } + } else { + if float64(overlapLength2) >= float64(len(deletion))/2 || + float64(overlapLength2) >= float64(len(insertion))/2 { + // Reverse overlap found. Insert an equality and swap and trim the surrounding edits. + overlap := Diff{DiffEqual, deletion[:overlapLength2]} + diffs = append( + diffs[:pointer], + append([]Diff{overlap}, diffs[pointer:]...)...) + + diffs[pointer-1].Type = DiffInsert + diffs[pointer-1].Text = insertion[0 : len(insertion)-overlapLength2] + diffs[pointer+1].Type = DiffDelete + diffs[pointer+1].Text = deletion[overlapLength2:] + pointer++ + } + } + pointer++ + } + pointer++ + } + + return diffs +} + +// Define some regex patterns for matching boundaries. +var ( + nonAlphaNumericRegex = regexp.MustCompile(`[^a-zA-Z0-9]`) + whitespaceRegex = regexp.MustCompile(`\s`) + linebreakRegex = regexp.MustCompile(`[\r\n]`) + blanklineEndRegex = regexp.MustCompile(`\n\r?\n$`) + blanklineStartRegex = regexp.MustCompile(`^\r?\n\r?\n`) +) + +// diffCleanupSemanticScore computes a score representing whether the internal boundary falls on logical boundaries. +// Scores range from 6 (best) to 0 (worst). Closure, but does not reference any external variables. +func diffCleanupSemanticScore(one, two string) int { + if len(one) == 0 || len(two) == 0 { + // Edges are the best. + return 6 + } + + // Each port of this function behaves slightly differently due to subtle differences in each language's definition of things like 'whitespace'. Since this function's purpose is largely cosmetic, the choice has been made to use each language's native features rather than force total conformity. + rune1, _ := utf8.DecodeLastRuneInString(one) + rune2, _ := utf8.DecodeRuneInString(two) + char1 := string(rune1) + char2 := string(rune2) + + nonAlphaNumeric1 := nonAlphaNumericRegex.MatchString(char1) + nonAlphaNumeric2 := nonAlphaNumericRegex.MatchString(char2) + whitespace1 := nonAlphaNumeric1 && whitespaceRegex.MatchString(char1) + whitespace2 := nonAlphaNumeric2 && whitespaceRegex.MatchString(char2) + lineBreak1 := whitespace1 && linebreakRegex.MatchString(char1) + lineBreak2 := whitespace2 && linebreakRegex.MatchString(char2) + blankLine1 := lineBreak1 && blanklineEndRegex.MatchString(one) + blankLine2 := lineBreak2 && blanklineEndRegex.MatchString(two) + + if blankLine1 || blankLine2 { + // Five points for blank lines. + return 5 + } else if lineBreak1 || lineBreak2 { + // Four points for line breaks. + return 4 + } else if nonAlphaNumeric1 && !whitespace1 && whitespace2 { + // Three points for end of sentences. + return 3 + } else if whitespace1 || whitespace2 { + // Two points for whitespace. + return 2 + } else if nonAlphaNumeric1 || nonAlphaNumeric2 { + // One point for non-alphanumeric. + return 1 + } + return 0 +} + +// DiffCleanupSemanticLossless looks for single edits surrounded on both sides by equalities which can be shifted sideways to align the edit to a word boundary. +// E.g: The cat came. -> The cat came. +func (dmp *DiffMatchPatch) DiffCleanupSemanticLossless(diffs []Diff) []Diff { + pointer := 1 + + // Intentionally ignore the first and last element (don't need checking). + for pointer < len(diffs)-1 { + if diffs[pointer-1].Type == DiffEqual && + diffs[pointer+1].Type == DiffEqual { + + // This is a single edit surrounded by equalities. + equality1 := diffs[pointer-1].Text + edit := diffs[pointer].Text + equality2 := diffs[pointer+1].Text + + // First, shift the edit as far left as possible. + commonOffset := dmp.DiffCommonSuffix(equality1, edit) + if commonOffset > 0 { + commonString := edit[len(edit)-commonOffset:] + equality1 = equality1[0 : len(equality1)-commonOffset] + edit = commonString + edit[:len(edit)-commonOffset] + equality2 = commonString + equality2 + } + + // Second, step character by character right, looking for the best fit. + bestEquality1 := equality1 + bestEdit := edit + bestEquality2 := equality2 + bestScore := diffCleanupSemanticScore(equality1, edit) + + diffCleanupSemanticScore(edit, equality2) + + for len(edit) != 0 && len(equality2) != 0 { + _, sz := utf8.DecodeRuneInString(edit) + if len(equality2) < sz || edit[:sz] != equality2[:sz] { + break + } + equality1 += edit[:sz] + edit = edit[sz:] + equality2[:sz] + equality2 = equality2[sz:] + score := diffCleanupSemanticScore(equality1, edit) + + diffCleanupSemanticScore(edit, equality2) + // The >= encourages trailing rather than leading whitespace on edits. + if score >= bestScore { + bestScore = score + bestEquality1 = equality1 + bestEdit = edit + bestEquality2 = equality2 + } + } + + if diffs[pointer-1].Text != bestEquality1 { + // We have an improvement, save it back to the diff. + if len(bestEquality1) != 0 { + diffs[pointer-1].Text = bestEquality1 + } else { + diffs = splice(diffs, pointer-1, 1) + pointer-- + } + + diffs[pointer].Text = bestEdit + if len(bestEquality2) != 0 { + diffs[pointer+1].Text = bestEquality2 + } else { + diffs = append(diffs[:pointer+1], diffs[pointer+2:]...) + pointer-- + } + } + } + pointer++ + } + + return diffs +} + +// DiffCleanupEfficiency reduces the number of edits by eliminating operationally trivial equalities. +func (dmp *DiffMatchPatch) DiffCleanupEfficiency(diffs []Diff) []Diff { + changes := false + // Stack of indices where equalities are found. + type equality struct { + data int + next *equality + } + var equalities *equality + // Always equal to equalities[equalitiesLength-1][1] + lastequality := "" + pointer := 0 // Index of current position. + // Is there an insertion operation before the last equality. + preIns := false + // Is there a deletion operation before the last equality. + preDel := false + // Is there an insertion operation after the last equality. + postIns := false + // Is there a deletion operation after the last equality. + postDel := false + for pointer < len(diffs) { + if diffs[pointer].Type == DiffEqual { // Equality found. + if len(diffs[pointer].Text) < dmp.DiffEditCost && + (postIns || postDel) { + // Candidate found. + equalities = &equality{ + data: pointer, + next: equalities, + } + preIns = postIns + preDel = postDel + lastequality = diffs[pointer].Text + } else { + // Not a candidate, and can never become one. + equalities = nil + lastequality = "" + } + postIns = false + postDel = false + } else { // An insertion or deletion. + if diffs[pointer].Type == DiffDelete { + postDel = true + } else { + postIns = true + } + + // Five types to be split: + // ABXYCD + // AXCD + // ABXC + // AXCD + // ABXC + var sumPres int + if preIns { + sumPres++ + } + if preDel { + sumPres++ + } + if postIns { + sumPres++ + } + if postDel { + sumPres++ + } + if len(lastequality) > 0 && + ((preIns && preDel && postIns && postDel) || + ((len(lastequality) < dmp.DiffEditCost/2) && sumPres == 3)) { + + insPoint := equalities.data + + // Duplicate record. + diffs = append(diffs[:insPoint], + append([]Diff{Diff{DiffDelete, lastequality}}, diffs[insPoint:]...)...) + + // Change second copy to insert. + diffs[insPoint+1].Type = DiffInsert + // Throw away the equality we just deleted. + equalities = equalities.next + lastequality = "" + + if preIns && preDel { + // No changes made which could affect previous entry, keep going. + postIns = true + postDel = true + equalities = nil + } else { + if equalities != nil { + equalities = equalities.next + } + if equalities != nil { + pointer = equalities.data + } else { + pointer = -1 + } + postIns = false + postDel = false + } + changes = true + } + } + pointer++ + } + + if changes { + diffs = dmp.DiffCleanupMerge(diffs) + } + + return diffs +} + +// DiffCleanupMerge reorders and merges like edit sections. Merge equalities. +// Any edit section can move as long as it doesn't cross an equality. +func (dmp *DiffMatchPatch) DiffCleanupMerge(diffs []Diff) []Diff { + // Add a dummy entry at the end. + diffs = append(diffs, Diff{DiffEqual, ""}) + pointer := 0 + countDelete := 0 + countInsert := 0 + commonlength := 0 + textDelete := []rune(nil) + textInsert := []rune(nil) + + for pointer < len(diffs) { + switch diffs[pointer].Type { + case DiffInsert: + countInsert++ + textInsert = append(textInsert, []rune(diffs[pointer].Text)...) + pointer++ + break + case DiffDelete: + countDelete++ + textDelete = append(textDelete, []rune(diffs[pointer].Text)...) + pointer++ + break + case DiffEqual: + // Upon reaching an equality, check for prior redundancies. + if countDelete+countInsert > 1 { + if countDelete != 0 && countInsert != 0 { + // Factor out any common prefixies. + commonlength = commonPrefixLength(textInsert, textDelete) + if commonlength != 0 { + x := pointer - countDelete - countInsert + if x > 0 && diffs[x-1].Type == DiffEqual { + diffs[x-1].Text += string(textInsert[:commonlength]) + } else { + diffs = append([]Diff{Diff{DiffEqual, string(textInsert[:commonlength])}}, diffs...) + pointer++ + } + textInsert = textInsert[commonlength:] + textDelete = textDelete[commonlength:] + } + // Factor out any common suffixies. + commonlength = commonSuffixLength(textInsert, textDelete) + if commonlength != 0 { + insertIndex := len(textInsert) - commonlength + deleteIndex := len(textDelete) - commonlength + diffs[pointer].Text = string(textInsert[insertIndex:]) + diffs[pointer].Text + textInsert = textInsert[:insertIndex] + textDelete = textDelete[:deleteIndex] + } + } + // Delete the offending records and add the merged ones. + if countDelete == 0 { + diffs = splice(diffs, pointer-countInsert, + countDelete+countInsert, + Diff{DiffInsert, string(textInsert)}) + } else if countInsert == 0 { + diffs = splice(diffs, pointer-countDelete, + countDelete+countInsert, + Diff{DiffDelete, string(textDelete)}) + } else { + diffs = splice(diffs, pointer-countDelete-countInsert, + countDelete+countInsert, + Diff{DiffDelete, string(textDelete)}, + Diff{DiffInsert, string(textInsert)}) + } + + pointer = pointer - countDelete - countInsert + 1 + if countDelete != 0 { + pointer++ + } + if countInsert != 0 { + pointer++ + } + } else if pointer != 0 && diffs[pointer-1].Type == DiffEqual { + // Merge this equality with the previous one. + diffs[pointer-1].Text += diffs[pointer].Text + diffs = append(diffs[:pointer], diffs[pointer+1:]...) + } else { + pointer++ + } + countInsert = 0 + countDelete = 0 + textDelete = nil + textInsert = nil + break + } + } + + if len(diffs[len(diffs)-1].Text) == 0 { + diffs = diffs[0 : len(diffs)-1] // Remove the dummy entry at the end. + } + + // Second pass: look for single edits surrounded on both sides by equalities which can be shifted sideways to eliminate an equality. E.g: ABAC -> ABAC + changes := false + pointer = 1 + // Intentionally ignore the first and last element (don't need checking). + for pointer < (len(diffs) - 1) { + if diffs[pointer-1].Type == DiffEqual && + diffs[pointer+1].Type == DiffEqual { + // This is a single edit surrounded by equalities. + if strings.HasSuffix(diffs[pointer].Text, diffs[pointer-1].Text) { + // Shift the edit over the previous equality. + diffs[pointer].Text = diffs[pointer-1].Text + + diffs[pointer].Text[:len(diffs[pointer].Text)-len(diffs[pointer-1].Text)] + diffs[pointer+1].Text = diffs[pointer-1].Text + diffs[pointer+1].Text + diffs = splice(diffs, pointer-1, 1) + changes = true + } else if strings.HasPrefix(diffs[pointer].Text, diffs[pointer+1].Text) { + // Shift the edit over the next equality. + diffs[pointer-1].Text += diffs[pointer+1].Text + diffs[pointer].Text = + diffs[pointer].Text[len(diffs[pointer+1].Text):] + diffs[pointer+1].Text + diffs = splice(diffs, pointer+1, 1) + changes = true + } + } + pointer++ + } + + // If shifts were made, the diff needs reordering and another shift sweep. + if changes { + diffs = dmp.DiffCleanupMerge(diffs) + } + + return diffs +} + +// DiffXIndex returns the equivalent location in s2. +func (dmp *DiffMatchPatch) DiffXIndex(diffs []Diff, loc int) int { + chars1 := 0 + chars2 := 0 + lastChars1 := 0 + lastChars2 := 0 + lastDiff := Diff{} + for i := 0; i < len(diffs); i++ { + aDiff := diffs[i] + if aDiff.Type != DiffInsert { + // Equality or deletion. + chars1 += len(aDiff.Text) + } + if aDiff.Type != DiffDelete { + // Equality or insertion. + chars2 += len(aDiff.Text) + } + if chars1 > loc { + // Overshot the location. + lastDiff = aDiff + break + } + lastChars1 = chars1 + lastChars2 = chars2 + } + if lastDiff.Type == DiffDelete { + // The location was deleted. + return lastChars2 + } + // Add the remaining character length. + return lastChars2 + (loc - lastChars1) +} + +// DiffPrettyHtml converts a []Diff into a pretty HTML report. +// It is intended as an example from which to write one's own display functions. +func (dmp *DiffMatchPatch) DiffPrettyHtml(diffs []Diff) string { + var buff bytes.Buffer + for _, diff := range diffs { + text := strings.Replace(html.EscapeString(diff.Text), "\n", "¶
", -1) + switch diff.Type { + case DiffInsert: + _, _ = buff.WriteString("") + _, _ = buff.WriteString(text) + _, _ = buff.WriteString("") + case DiffDelete: + _, _ = buff.WriteString("") + _, _ = buff.WriteString(text) + _, _ = buff.WriteString("") + case DiffEqual: + _, _ = buff.WriteString("") + _, _ = buff.WriteString(text) + _, _ = buff.WriteString("") + } + } + return buff.String() +} + +// DiffPrettyText converts a []Diff into a colored text report. +func (dmp *DiffMatchPatch) DiffPrettyText(diffs []Diff) string { + var buff bytes.Buffer + for _, diff := range diffs { + text := diff.Text + + switch diff.Type { + case DiffInsert: + _, _ = buff.WriteString("\x1b[32m") + _, _ = buff.WriteString(text) + _, _ = buff.WriteString("\x1b[0m") + case DiffDelete: + _, _ = buff.WriteString("\x1b[31m") + _, _ = buff.WriteString(text) + _, _ = buff.WriteString("\x1b[0m") + case DiffEqual: + _, _ = buff.WriteString(text) + } + } + + return buff.String() +} + +// DiffText1 computes and returns the source text (all equalities and deletions). +func (dmp *DiffMatchPatch) DiffText1(diffs []Diff) string { + //StringBuilder text = new StringBuilder() + var text bytes.Buffer + + for _, aDiff := range diffs { + if aDiff.Type != DiffInsert { + _, _ = text.WriteString(aDiff.Text) + } + } + return text.String() +} + +// DiffText2 computes and returns the destination text (all equalities and insertions). +func (dmp *DiffMatchPatch) DiffText2(diffs []Diff) string { + var text bytes.Buffer + + for _, aDiff := range diffs { + if aDiff.Type != DiffDelete { + _, _ = text.WriteString(aDiff.Text) + } + } + return text.String() +} + +// DiffLevenshtein computes the Levenshtein distance that is the number of inserted, deleted or substituted characters. +func (dmp *DiffMatchPatch) DiffLevenshtein(diffs []Diff) int { + levenshtein := 0 + insertions := 0 + deletions := 0 + + for _, aDiff := range diffs { + switch aDiff.Type { + case DiffInsert: + insertions += len(aDiff.Text) + case DiffDelete: + deletions += len(aDiff.Text) + case DiffEqual: + // A deletion and an insertion is one substitution. + levenshtein += max(insertions, deletions) + insertions = 0 + deletions = 0 + } + } + + levenshtein += max(insertions, deletions) + return levenshtein +} + +// DiffToDelta crushes the diff into an encoded string which describes the operations required to transform text1 into text2. +// E.g. =3\t-2\t+ing -> Keep 3 chars, delete 2 chars, insert 'ing'. Operations are tab-separated. Inserted text is escaped using %xx notation. +func (dmp *DiffMatchPatch) DiffToDelta(diffs []Diff) string { + var text bytes.Buffer + for _, aDiff := range diffs { + switch aDiff.Type { + case DiffInsert: + _, _ = text.WriteString("+") + _, _ = text.WriteString(strings.Replace(url.QueryEscape(aDiff.Text), "+", " ", -1)) + _, _ = text.WriteString("\t") + break + case DiffDelete: + _, _ = text.WriteString("-") + _, _ = text.WriteString(strconv.Itoa(utf8.RuneCountInString(aDiff.Text))) + _, _ = text.WriteString("\t") + break + case DiffEqual: + _, _ = text.WriteString("=") + _, _ = text.WriteString(strconv.Itoa(utf8.RuneCountInString(aDiff.Text))) + _, _ = text.WriteString("\t") + break + } + } + delta := text.String() + if len(delta) != 0 { + // Strip off trailing tab character. + delta = delta[0 : utf8.RuneCountInString(delta)-1] + delta = unescaper.Replace(delta) + } + return delta +} + +// DiffFromDelta given the original text1, and an encoded string which describes the operations required to transform text1 into text2, comAdde the full diff. +func (dmp *DiffMatchPatch) DiffFromDelta(text1 string, delta string) (diffs []Diff, err error) { + i := 0 + runes := []rune(text1) + + for _, token := range strings.Split(delta, "\t") { + if len(token) == 0 { + // Blank tokens are ok (from a trailing \t). + continue + } + + // Each token begins with a one character parameter which specifies the operation of this token (delete, insert, equality). + param := token[1:] + + switch op := token[0]; op { + case '+': + // Decode would Diff all "+" to " " + param = strings.Replace(param, "+", "%2b", -1) + param, err = url.QueryUnescape(param) + if err != nil { + return nil, err + } + if !utf8.ValidString(param) { + return nil, fmt.Errorf("invalid UTF-8 token: %q", param) + } + + diffs = append(diffs, Diff{DiffInsert, param}) + case '=', '-': + n, err := strconv.ParseInt(param, 10, 0) + if err != nil { + return nil, err + } else if n < 0 { + return nil, errors.New("Negative number in DiffFromDelta: " + param) + } + + i += int(n) + // Break out if we are out of bounds, go1.6 can't handle this very well + if i > len(runes) { + break + } + // Remember that string slicing is by byte - we want by rune here. + text := string(runes[i-int(n) : i]) + + if op == '=' { + diffs = append(diffs, Diff{DiffEqual, text}) + } else { + diffs = append(diffs, Diff{DiffDelete, text}) + } + default: + // Anything else is an error. + return nil, errors.New("Invalid diff operation in DiffFromDelta: " + string(token[0])) + } + } + + if i != len(runes) { + return nil, fmt.Errorf("Delta length (%v) is different from source text length (%v)", i, len(text1)) + } + + return diffs, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sergi/go-diff/diffmatchpatch/diffmatchpatch.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sergi/go-diff/diffmatchpatch/diffmatchpatch.go new file mode 100644 index 00000000..d3acc32c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sergi/go-diff/diffmatchpatch/diffmatchpatch.go @@ -0,0 +1,46 @@ +// Copyright (c) 2012-2016 The go-diff authors. All rights reserved. +// https://github.com/sergi/go-diff +// See the included LICENSE file for license details. +// +// go-diff is a Go implementation of Google's Diff, Match, and Patch library +// Original library is Copyright (c) 2006 Google Inc. +// http://code.google.com/p/google-diff-match-patch/ + +// Package diffmatchpatch offers robust algorithms to perform the operations required for synchronizing plain text. +package diffmatchpatch + +import ( + "time" +) + +// DiffMatchPatch holds the configuration for diff-match-patch operations. +type DiffMatchPatch struct { + // Number of seconds to map a diff before giving up (0 for infinity). + DiffTimeout time.Duration + // Cost of an empty edit operation in terms of edit characters. + DiffEditCost int + // How far to search for a match (0 = exact location, 1000+ = broad match). A match this many characters away from the expected location will add 1.0 to the score (0.0 is a perfect match). + MatchDistance int + // When deleting a large block of text (over ~64 characters), how close do the contents have to be to match the expected contents. (0.0 = perfection, 1.0 = very loose). Note that MatchThreshold controls how closely the end points of a delete need to match. + PatchDeleteThreshold float64 + // Chunk size for context length. + PatchMargin int + // The number of bits in an int. + MatchMaxBits int + // At what point is no match declared (0.0 = perfection, 1.0 = very loose). + MatchThreshold float64 +} + +// New creates a new DiffMatchPatch object with default parameters. +func New() *DiffMatchPatch { + // Defaults. + return &DiffMatchPatch{ + DiffTimeout: time.Second, + DiffEditCost: 4, + MatchThreshold: 0.5, + MatchDistance: 1000, + PatchDeleteThreshold: 0.5, + PatchMargin: 4, + MatchMaxBits: 32, + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sergi/go-diff/diffmatchpatch/match.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sergi/go-diff/diffmatchpatch/match.go new file mode 100644 index 00000000..17374e10 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sergi/go-diff/diffmatchpatch/match.go @@ -0,0 +1,160 @@ +// Copyright (c) 2012-2016 The go-diff authors. All rights reserved. +// https://github.com/sergi/go-diff +// See the included LICENSE file for license details. +// +// go-diff is a Go implementation of Google's Diff, Match, and Patch library +// Original library is Copyright (c) 2006 Google Inc. +// http://code.google.com/p/google-diff-match-patch/ + +package diffmatchpatch + +import ( + "math" +) + +// MatchMain locates the best instance of 'pattern' in 'text' near 'loc'. +// Returns -1 if no match found. +func (dmp *DiffMatchPatch) MatchMain(text, pattern string, loc int) int { + // Check for null inputs not needed since null can't be passed in C#. + + loc = int(math.Max(0, math.Min(float64(loc), float64(len(text))))) + if text == pattern { + // Shortcut (potentially not guaranteed by the algorithm) + return 0 + } else if len(text) == 0 { + // Nothing to match. + return -1 + } else if loc+len(pattern) <= len(text) && text[loc:loc+len(pattern)] == pattern { + // Perfect match at the perfect spot! (Includes case of null pattern) + return loc + } + // Do a fuzzy compare. + return dmp.MatchBitap(text, pattern, loc) +} + +// MatchBitap locates the best instance of 'pattern' in 'text' near 'loc' using the Bitap algorithm. +// Returns -1 if no match was found. +func (dmp *DiffMatchPatch) MatchBitap(text, pattern string, loc int) int { + // Initialise the alphabet. + s := dmp.MatchAlphabet(pattern) + + // Highest score beyond which we give up. + scoreThreshold := dmp.MatchThreshold + // Is there a nearby exact match? (speedup) + bestLoc := indexOf(text, pattern, loc) + if bestLoc != -1 { + scoreThreshold = math.Min(dmp.matchBitapScore(0, bestLoc, loc, + pattern), scoreThreshold) + // What about in the other direction? (speedup) + bestLoc = lastIndexOf(text, pattern, loc+len(pattern)) + if bestLoc != -1 { + scoreThreshold = math.Min(dmp.matchBitapScore(0, bestLoc, loc, + pattern), scoreThreshold) + } + } + + // Initialise the bit arrays. + matchmask := 1 << uint((len(pattern) - 1)) + bestLoc = -1 + + var binMin, binMid int + binMax := len(pattern) + len(text) + lastRd := []int{} + for d := 0; d < len(pattern); d++ { + // Scan for the best match; each iteration allows for one more error. Run a binary search to determine how far from 'loc' we can stray at this error level. + binMin = 0 + binMid = binMax + for binMin < binMid { + if dmp.matchBitapScore(d, loc+binMid, loc, pattern) <= scoreThreshold { + binMin = binMid + } else { + binMax = binMid + } + binMid = (binMax-binMin)/2 + binMin + } + // Use the result from this iteration as the maximum for the next. + binMax = binMid + start := int(math.Max(1, float64(loc-binMid+1))) + finish := int(math.Min(float64(loc+binMid), float64(len(text))) + float64(len(pattern))) + + rd := make([]int, finish+2) + rd[finish+1] = (1 << uint(d)) - 1 + + for j := finish; j >= start; j-- { + var charMatch int + if len(text) <= j-1 { + // Out of range. + charMatch = 0 + } else if _, ok := s[text[j-1]]; !ok { + charMatch = 0 + } else { + charMatch = s[text[j-1]] + } + + if d == 0 { + // First pass: exact match. + rd[j] = ((rd[j+1] << 1) | 1) & charMatch + } else { + // Subsequent passes: fuzzy match. + rd[j] = ((rd[j+1]<<1)|1)&charMatch | (((lastRd[j+1] | lastRd[j]) << 1) | 1) | lastRd[j+1] + } + if (rd[j] & matchmask) != 0 { + score := dmp.matchBitapScore(d, j-1, loc, pattern) + // This match will almost certainly be better than any existing match. But check anyway. + if score <= scoreThreshold { + // Told you so. + scoreThreshold = score + bestLoc = j - 1 + if bestLoc > loc { + // When passing loc, don't exceed our current distance from loc. + start = int(math.Max(1, float64(2*loc-bestLoc))) + } else { + // Already passed loc, downhill from here on in. + break + } + } + } + } + if dmp.matchBitapScore(d+1, loc, loc, pattern) > scoreThreshold { + // No hope for a (better) match at greater error levels. + break + } + lastRd = rd + } + return bestLoc +} + +// matchBitapScore computes and returns the score for a match with e errors and x location. +func (dmp *DiffMatchPatch) matchBitapScore(e, x, loc int, pattern string) float64 { + accuracy := float64(e) / float64(len(pattern)) + proximity := math.Abs(float64(loc - x)) + if dmp.MatchDistance == 0 { + // Dodge divide by zero error. + if proximity == 0 { + return accuracy + } + + return 1.0 + } + return accuracy + (proximity / float64(dmp.MatchDistance)) +} + +// MatchAlphabet initialises the alphabet for the Bitap algorithm. +func (dmp *DiffMatchPatch) MatchAlphabet(pattern string) map[byte]int { + s := map[byte]int{} + charPattern := []byte(pattern) + for _, c := range charPattern { + _, ok := s[c] + if !ok { + s[c] = 0 + } + } + i := 0 + + for _, c := range charPattern { + value := s[c] | int(uint(1)< y { + return x + } + return y +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sergi/go-diff/diffmatchpatch/patch.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sergi/go-diff/diffmatchpatch/patch.go new file mode 100644 index 00000000..223c43c4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sergi/go-diff/diffmatchpatch/patch.go @@ -0,0 +1,556 @@ +// Copyright (c) 2012-2016 The go-diff authors. All rights reserved. +// https://github.com/sergi/go-diff +// See the included LICENSE file for license details. +// +// go-diff is a Go implementation of Google's Diff, Match, and Patch library +// Original library is Copyright (c) 2006 Google Inc. +// http://code.google.com/p/google-diff-match-patch/ + +package diffmatchpatch + +import ( + "bytes" + "errors" + "math" + "net/url" + "regexp" + "strconv" + "strings" +) + +// Patch represents one patch operation. +type Patch struct { + diffs []Diff + Start1 int + Start2 int + Length1 int + Length2 int +} + +// String emulates GNU diff's format. +// Header: @@ -382,8 +481,9 @@ +// Indices are printed as 1-based, not 0-based. +func (p *Patch) String() string { + var coords1, coords2 string + + if p.Length1 == 0 { + coords1 = strconv.Itoa(p.Start1) + ",0" + } else if p.Length1 == 1 { + coords1 = strconv.Itoa(p.Start1 + 1) + } else { + coords1 = strconv.Itoa(p.Start1+1) + "," + strconv.Itoa(p.Length1) + } + + if p.Length2 == 0 { + coords2 = strconv.Itoa(p.Start2) + ",0" + } else if p.Length2 == 1 { + coords2 = strconv.Itoa(p.Start2 + 1) + } else { + coords2 = strconv.Itoa(p.Start2+1) + "," + strconv.Itoa(p.Length2) + } + + var text bytes.Buffer + _, _ = text.WriteString("@@ -" + coords1 + " +" + coords2 + " @@\n") + + // Escape the body of the patch with %xx notation. + for _, aDiff := range p.diffs { + switch aDiff.Type { + case DiffInsert: + _, _ = text.WriteString("+") + case DiffDelete: + _, _ = text.WriteString("-") + case DiffEqual: + _, _ = text.WriteString(" ") + } + + _, _ = text.WriteString(strings.Replace(url.QueryEscape(aDiff.Text), "+", " ", -1)) + _, _ = text.WriteString("\n") + } + + return unescaper.Replace(text.String()) +} + +// PatchAddContext increases the context until it is unique, but doesn't let the pattern expand beyond MatchMaxBits. +func (dmp *DiffMatchPatch) PatchAddContext(patch Patch, text string) Patch { + if len(text) == 0 { + return patch + } + + pattern := text[patch.Start2 : patch.Start2+patch.Length1] + padding := 0 + + // Look for the first and last matches of pattern in text. If two different matches are found, increase the pattern length. + for strings.Index(text, pattern) != strings.LastIndex(text, pattern) && + len(pattern) < dmp.MatchMaxBits-2*dmp.PatchMargin { + padding += dmp.PatchMargin + maxStart := max(0, patch.Start2-padding) + minEnd := min(len(text), patch.Start2+patch.Length1+padding) + pattern = text[maxStart:minEnd] + } + // Add one chunk for good luck. + padding += dmp.PatchMargin + + // Add the prefix. + prefix := text[max(0, patch.Start2-padding):patch.Start2] + if len(prefix) != 0 { + patch.diffs = append([]Diff{Diff{DiffEqual, prefix}}, patch.diffs...) + } + // Add the suffix. + suffix := text[patch.Start2+patch.Length1 : min(len(text), patch.Start2+patch.Length1+padding)] + if len(suffix) != 0 { + patch.diffs = append(patch.diffs, Diff{DiffEqual, suffix}) + } + + // Roll back the start points. + patch.Start1 -= len(prefix) + patch.Start2 -= len(prefix) + // Extend the lengths. + patch.Length1 += len(prefix) + len(suffix) + patch.Length2 += len(prefix) + len(suffix) + + return patch +} + +// PatchMake computes a list of patches. +func (dmp *DiffMatchPatch) PatchMake(opt ...interface{}) []Patch { + if len(opt) == 1 { + diffs, _ := opt[0].([]Diff) + text1 := dmp.DiffText1(diffs) + return dmp.PatchMake(text1, diffs) + } else if len(opt) == 2 { + text1 := opt[0].(string) + switch t := opt[1].(type) { + case string: + diffs := dmp.DiffMain(text1, t, true) + if len(diffs) > 2 { + diffs = dmp.DiffCleanupSemantic(diffs) + diffs = dmp.DiffCleanupEfficiency(diffs) + } + return dmp.PatchMake(text1, diffs) + case []Diff: + return dmp.patchMake2(text1, t) + } + } else if len(opt) == 3 { + return dmp.PatchMake(opt[0], opt[2]) + } + return []Patch{} +} + +// patchMake2 computes a list of patches to turn text1 into text2. +// text2 is not provided, diffs are the delta between text1 and text2. +func (dmp *DiffMatchPatch) patchMake2(text1 string, diffs []Diff) []Patch { + // Check for null inputs not needed since null can't be passed in C#. + patches := []Patch{} + if len(diffs) == 0 { + return patches // Get rid of the null case. + } + + patch := Patch{} + charCount1 := 0 // Number of characters into the text1 string. + charCount2 := 0 // Number of characters into the text2 string. + // Start with text1 (prepatchText) and apply the diffs until we arrive at text2 (postpatchText). We recreate the patches one by one to determine context info. + prepatchText := text1 + postpatchText := text1 + + for i, aDiff := range diffs { + if len(patch.diffs) == 0 && aDiff.Type != DiffEqual { + // A new patch starts here. + patch.Start1 = charCount1 + patch.Start2 = charCount2 + } + + switch aDiff.Type { + case DiffInsert: + patch.diffs = append(patch.diffs, aDiff) + patch.Length2 += len(aDiff.Text) + postpatchText = postpatchText[:charCount2] + + aDiff.Text + postpatchText[charCount2:] + case DiffDelete: + patch.Length1 += len(aDiff.Text) + patch.diffs = append(patch.diffs, aDiff) + postpatchText = postpatchText[:charCount2] + postpatchText[charCount2+len(aDiff.Text):] + case DiffEqual: + if len(aDiff.Text) <= 2*dmp.PatchMargin && + len(patch.diffs) != 0 && i != len(diffs)-1 { + // Small equality inside a patch. + patch.diffs = append(patch.diffs, aDiff) + patch.Length1 += len(aDiff.Text) + patch.Length2 += len(aDiff.Text) + } + if len(aDiff.Text) >= 2*dmp.PatchMargin { + // Time for a new patch. + if len(patch.diffs) != 0 { + patch = dmp.PatchAddContext(patch, prepatchText) + patches = append(patches, patch) + patch = Patch{} + // Unlike Unidiff, our patch lists have a rolling context. http://code.google.com/p/google-diff-match-patch/wiki/Unidiff Update prepatch text & pos to reflect the application of the just completed patch. + prepatchText = postpatchText + charCount1 = charCount2 + } + } + } + + // Update the current character count. + if aDiff.Type != DiffInsert { + charCount1 += len(aDiff.Text) + } + if aDiff.Type != DiffDelete { + charCount2 += len(aDiff.Text) + } + } + + // Pick up the leftover patch if not empty. + if len(patch.diffs) != 0 { + patch = dmp.PatchAddContext(patch, prepatchText) + patches = append(patches, patch) + } + + return patches +} + +// PatchDeepCopy returns an array that is identical to a given an array of patches. +func (dmp *DiffMatchPatch) PatchDeepCopy(patches []Patch) []Patch { + patchesCopy := []Patch{} + for _, aPatch := range patches { + patchCopy := Patch{} + for _, aDiff := range aPatch.diffs { + patchCopy.diffs = append(patchCopy.diffs, Diff{ + aDiff.Type, + aDiff.Text, + }) + } + patchCopy.Start1 = aPatch.Start1 + patchCopy.Start2 = aPatch.Start2 + patchCopy.Length1 = aPatch.Length1 + patchCopy.Length2 = aPatch.Length2 + patchesCopy = append(patchesCopy, patchCopy) + } + return patchesCopy +} + +// PatchApply merges a set of patches onto the text. Returns a patched text, as well as an array of true/false values indicating which patches were applied. +func (dmp *DiffMatchPatch) PatchApply(patches []Patch, text string) (string, []bool) { + if len(patches) == 0 { + return text, []bool{} + } + + // Deep copy the patches so that no changes are made to originals. + patches = dmp.PatchDeepCopy(patches) + + nullPadding := dmp.PatchAddPadding(patches) + text = nullPadding + text + nullPadding + patches = dmp.PatchSplitMax(patches) + + x := 0 + // delta keeps track of the offset between the expected and actual location of the previous patch. If there are patches expected at positions 10 and 20, but the first patch was found at 12, delta is 2 and the second patch has an effective expected position of 22. + delta := 0 + results := make([]bool, len(patches)) + for _, aPatch := range patches { + expectedLoc := aPatch.Start2 + delta + text1 := dmp.DiffText1(aPatch.diffs) + var startLoc int + endLoc := -1 + if len(text1) > dmp.MatchMaxBits { + // PatchSplitMax will only provide an oversized pattern in the case of a monster delete. + startLoc = dmp.MatchMain(text, text1[:dmp.MatchMaxBits], expectedLoc) + if startLoc != -1 { + endLoc = dmp.MatchMain(text, + text1[len(text1)-dmp.MatchMaxBits:], expectedLoc+len(text1)-dmp.MatchMaxBits) + if endLoc == -1 || startLoc >= endLoc { + // Can't find valid trailing context. Drop this patch. + startLoc = -1 + } + } + } else { + startLoc = dmp.MatchMain(text, text1, expectedLoc) + } + if startLoc == -1 { + // No match found. :( + results[x] = false + // Subtract the delta for this failed patch from subsequent patches. + delta -= aPatch.Length2 - aPatch.Length1 + } else { + // Found a match. :) + results[x] = true + delta = startLoc - expectedLoc + var text2 string + if endLoc == -1 { + text2 = text[startLoc:int(math.Min(float64(startLoc+len(text1)), float64(len(text))))] + } else { + text2 = text[startLoc:int(math.Min(float64(endLoc+dmp.MatchMaxBits), float64(len(text))))] + } + if text1 == text2 { + // Perfect match, just shove the Replacement text in. + text = text[:startLoc] + dmp.DiffText2(aPatch.diffs) + text[startLoc+len(text1):] + } else { + // Imperfect match. Run a diff to get a framework of equivalent indices. + diffs := dmp.DiffMain(text1, text2, false) + if len(text1) > dmp.MatchMaxBits && float64(dmp.DiffLevenshtein(diffs))/float64(len(text1)) > dmp.PatchDeleteThreshold { + // The end points match, but the content is unacceptably bad. + results[x] = false + } else { + diffs = dmp.DiffCleanupSemanticLossless(diffs) + index1 := 0 + for _, aDiff := range aPatch.diffs { + if aDiff.Type != DiffEqual { + index2 := dmp.DiffXIndex(diffs, index1) + if aDiff.Type == DiffInsert { + // Insertion + text = text[:startLoc+index2] + aDiff.Text + text[startLoc+index2:] + } else if aDiff.Type == DiffDelete { + // Deletion + startIndex := startLoc + index2 + text = text[:startIndex] + + text[startIndex+dmp.DiffXIndex(diffs, index1+len(aDiff.Text))-index2:] + } + } + if aDiff.Type != DiffDelete { + index1 += len(aDiff.Text) + } + } + } + } + } + x++ + } + // Strip the padding off. + text = text[len(nullPadding) : len(nullPadding)+(len(text)-2*len(nullPadding))] + return text, results +} + +// PatchAddPadding adds some padding on text start and end so that edges can match something. +// Intended to be called only from within patchApply. +func (dmp *DiffMatchPatch) PatchAddPadding(patches []Patch) string { + paddingLength := dmp.PatchMargin + nullPadding := "" + for x := 1; x <= paddingLength; x++ { + nullPadding += string(x) + } + + // Bump all the patches forward. + for i := range patches { + patches[i].Start1 += paddingLength + patches[i].Start2 += paddingLength + } + + // Add some padding on start of first diff. + if len(patches[0].diffs) == 0 || patches[0].diffs[0].Type != DiffEqual { + // Add nullPadding equality. + patches[0].diffs = append([]Diff{Diff{DiffEqual, nullPadding}}, patches[0].diffs...) + patches[0].Start1 -= paddingLength // Should be 0. + patches[0].Start2 -= paddingLength // Should be 0. + patches[0].Length1 += paddingLength + patches[0].Length2 += paddingLength + } else if paddingLength > len(patches[0].diffs[0].Text) { + // Grow first equality. + extraLength := paddingLength - len(patches[0].diffs[0].Text) + patches[0].diffs[0].Text = nullPadding[len(patches[0].diffs[0].Text):] + patches[0].diffs[0].Text + patches[0].Start1 -= extraLength + patches[0].Start2 -= extraLength + patches[0].Length1 += extraLength + patches[0].Length2 += extraLength + } + + // Add some padding on end of last diff. + last := len(patches) - 1 + if len(patches[last].diffs) == 0 || patches[last].diffs[len(patches[last].diffs)-1].Type != DiffEqual { + // Add nullPadding equality. + patches[last].diffs = append(patches[last].diffs, Diff{DiffEqual, nullPadding}) + patches[last].Length1 += paddingLength + patches[last].Length2 += paddingLength + } else if paddingLength > len(patches[last].diffs[len(patches[last].diffs)-1].Text) { + // Grow last equality. + lastDiff := patches[last].diffs[len(patches[last].diffs)-1] + extraLength := paddingLength - len(lastDiff.Text) + patches[last].diffs[len(patches[last].diffs)-1].Text += nullPadding[:extraLength] + patches[last].Length1 += extraLength + patches[last].Length2 += extraLength + } + + return nullPadding +} + +// PatchSplitMax looks through the patches and breaks up any which are longer than the maximum limit of the match algorithm. +// Intended to be called only from within patchApply. +func (dmp *DiffMatchPatch) PatchSplitMax(patches []Patch) []Patch { + patchSize := dmp.MatchMaxBits + for x := 0; x < len(patches); x++ { + if patches[x].Length1 <= patchSize { + continue + } + bigpatch := patches[x] + // Remove the big old patch. + patches = append(patches[:x], patches[x+1:]...) + x-- + + Start1 := bigpatch.Start1 + Start2 := bigpatch.Start2 + precontext := "" + for len(bigpatch.diffs) != 0 { + // Create one of several smaller patches. + patch := Patch{} + empty := true + patch.Start1 = Start1 - len(precontext) + patch.Start2 = Start2 - len(precontext) + if len(precontext) != 0 { + patch.Length1 = len(precontext) + patch.Length2 = len(precontext) + patch.diffs = append(patch.diffs, Diff{DiffEqual, precontext}) + } + for len(bigpatch.diffs) != 0 && patch.Length1 < patchSize-dmp.PatchMargin { + diffType := bigpatch.diffs[0].Type + diffText := bigpatch.diffs[0].Text + if diffType == DiffInsert { + // Insertions are harmless. + patch.Length2 += len(diffText) + Start2 += len(diffText) + patch.diffs = append(patch.diffs, bigpatch.diffs[0]) + bigpatch.diffs = bigpatch.diffs[1:] + empty = false + } else if diffType == DiffDelete && len(patch.diffs) == 1 && patch.diffs[0].Type == DiffEqual && len(diffText) > 2*patchSize { + // This is a large deletion. Let it pass in one chunk. + patch.Length1 += len(diffText) + Start1 += len(diffText) + empty = false + patch.diffs = append(patch.diffs, Diff{diffType, diffText}) + bigpatch.diffs = bigpatch.diffs[1:] + } else { + // Deletion or equality. Only take as much as we can stomach. + diffText = diffText[:min(len(diffText), patchSize-patch.Length1-dmp.PatchMargin)] + + patch.Length1 += len(diffText) + Start1 += len(diffText) + if diffType == DiffEqual { + patch.Length2 += len(diffText) + Start2 += len(diffText) + } else { + empty = false + } + patch.diffs = append(patch.diffs, Diff{diffType, diffText}) + if diffText == bigpatch.diffs[0].Text { + bigpatch.diffs = bigpatch.diffs[1:] + } else { + bigpatch.diffs[0].Text = + bigpatch.diffs[0].Text[len(diffText):] + } + } + } + // Compute the head context for the next patch. + precontext = dmp.DiffText2(patch.diffs) + precontext = precontext[max(0, len(precontext)-dmp.PatchMargin):] + + postcontext := "" + // Append the end context for this patch. + if len(dmp.DiffText1(bigpatch.diffs)) > dmp.PatchMargin { + postcontext = dmp.DiffText1(bigpatch.diffs)[:dmp.PatchMargin] + } else { + postcontext = dmp.DiffText1(bigpatch.diffs) + } + + if len(postcontext) != 0 { + patch.Length1 += len(postcontext) + patch.Length2 += len(postcontext) + if len(patch.diffs) != 0 && patch.diffs[len(patch.diffs)-1].Type == DiffEqual { + patch.diffs[len(patch.diffs)-1].Text += postcontext + } else { + patch.diffs = append(patch.diffs, Diff{DiffEqual, postcontext}) + } + } + if !empty { + x++ + patches = append(patches[:x], append([]Patch{patch}, patches[x:]...)...) + } + } + } + return patches +} + +// PatchToText takes a list of patches and returns a textual representation. +func (dmp *DiffMatchPatch) PatchToText(patches []Patch) string { + var text bytes.Buffer + for _, aPatch := range patches { + _, _ = text.WriteString(aPatch.String()) + } + return text.String() +} + +// PatchFromText parses a textual representation of patches and returns a List of Patch objects. +func (dmp *DiffMatchPatch) PatchFromText(textline string) ([]Patch, error) { + patches := []Patch{} + if len(textline) == 0 { + return patches, nil + } + text := strings.Split(textline, "\n") + textPointer := 0 + patchHeader := regexp.MustCompile("^@@ -(\\d+),?(\\d*) \\+(\\d+),?(\\d*) @@$") + + var patch Patch + var sign uint8 + var line string + for textPointer < len(text) { + + if !patchHeader.MatchString(text[textPointer]) { + return patches, errors.New("Invalid patch string: " + text[textPointer]) + } + + patch = Patch{} + m := patchHeader.FindStringSubmatch(text[textPointer]) + + patch.Start1, _ = strconv.Atoi(m[1]) + if len(m[2]) == 0 { + patch.Start1-- + patch.Length1 = 1 + } else if m[2] == "0" { + patch.Length1 = 0 + } else { + patch.Start1-- + patch.Length1, _ = strconv.Atoi(m[2]) + } + + patch.Start2, _ = strconv.Atoi(m[3]) + + if len(m[4]) == 0 { + patch.Start2-- + patch.Length2 = 1 + } else if m[4] == "0" { + patch.Length2 = 0 + } else { + patch.Start2-- + patch.Length2, _ = strconv.Atoi(m[4]) + } + textPointer++ + + for textPointer < len(text) { + if len(text[textPointer]) > 0 { + sign = text[textPointer][0] + } else { + textPointer++ + continue + } + + line = text[textPointer][1:] + line = strings.Replace(line, "+", "%2b", -1) + line, _ = url.QueryUnescape(line) + if sign == '-' { + // Deletion. + patch.diffs = append(patch.diffs, Diff{DiffDelete, line}) + } else if sign == '+' { + // Insertion. + patch.diffs = append(patch.diffs, Diff{DiffInsert, line}) + } else if sign == ' ' { + // Minor equality. + patch.diffs = append(patch.diffs, Diff{DiffEqual, line}) + } else if sign == '@' { + // Start of next patch. + break + } else { + // WTF? + return patches, errors.New("Invalid patch mode '" + string(sign) + "' in: " + string(line)) + } + textPointer++ + } + + patches = append(patches, patch) + } + return patches, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sergi/go-diff/diffmatchpatch/stringutil.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sergi/go-diff/diffmatchpatch/stringutil.go new file mode 100644 index 00000000..265f29cc --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sergi/go-diff/diffmatchpatch/stringutil.go @@ -0,0 +1,88 @@ +// Copyright (c) 2012-2016 The go-diff authors. All rights reserved. +// https://github.com/sergi/go-diff +// See the included LICENSE file for license details. +// +// go-diff is a Go implementation of Google's Diff, Match, and Patch library +// Original library is Copyright (c) 2006 Google Inc. +// http://code.google.com/p/google-diff-match-patch/ + +package diffmatchpatch + +import ( + "strings" + "unicode/utf8" +) + +// unescaper unescapes selected chars for compatibility with JavaScript's encodeURI. +// In speed critical applications this could be dropped since the receiving application will certainly decode these fine. Note that this function is case-sensitive. Thus "%3F" would not be unescaped. But this is ok because it is only called with the output of HttpUtility.UrlEncode which returns lowercase hex. Example: "%3f" -> "?", "%24" -> "$", etc. +var unescaper = strings.NewReplacer( + "%21", "!", "%7E", "~", "%27", "'", + "%28", "(", "%29", ")", "%3B", ";", + "%2F", "/", "%3F", "?", "%3A", ":", + "%40", "@", "%26", "&", "%3D", "=", + "%2B", "+", "%24", "$", "%2C", ",", "%23", "#", "%2A", "*") + +// indexOf returns the first index of pattern in str, starting at str[i]. +func indexOf(str string, pattern string, i int) int { + if i > len(str)-1 { + return -1 + } + if i <= 0 { + return strings.Index(str, pattern) + } + ind := strings.Index(str[i:], pattern) + if ind == -1 { + return -1 + } + return ind + i +} + +// lastIndexOf returns the last index of pattern in str, starting at str[i]. +func lastIndexOf(str string, pattern string, i int) int { + if i < 0 { + return -1 + } + if i >= len(str) { + return strings.LastIndex(str, pattern) + } + _, size := utf8.DecodeRuneInString(str[i:]) + return strings.LastIndex(str[:i+size], pattern) +} + +// runesIndexOf returns the index of pattern in target, starting at target[i]. +func runesIndexOf(target, pattern []rune, i int) int { + if i > len(target)-1 { + return -1 + } + if i <= 0 { + return runesIndex(target, pattern) + } + ind := runesIndex(target[i:], pattern) + if ind == -1 { + return -1 + } + return ind + i +} + +func runesEqual(r1, r2 []rune) bool { + if len(r1) != len(r2) { + return false + } + for i, c := range r1 { + if c != r2[i] { + return false + } + } + return true +} + +// runesIndex is the equivalent of strings.Index for rune slices. +func runesIndex(r1, r2 []rune) int { + last := len(r1) - len(r2) + for i := 0; i <= last; i++ { + if runesEqual(r1[i:i+len(r2)], r2) { + return i + } + } + return -1 +} diff --git a/vendor/github.com/shopspring/decimal/.gitignore b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/shopspring/decimal/.gitignore similarity index 100% rename from vendor/github.com/shopspring/decimal/.gitignore rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/shopspring/decimal/.gitignore diff --git a/vendor/github.com/shopspring/decimal/.travis.yml b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/shopspring/decimal/.travis.yml similarity index 100% rename from vendor/github.com/shopspring/decimal/.travis.yml rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/shopspring/decimal/.travis.yml diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/shopspring/decimal/LICENSE b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/shopspring/decimal/LICENSE new file mode 100644 index 00000000..ad2148aa --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/shopspring/decimal/LICENSE @@ -0,0 +1,45 @@ +The MIT License (MIT) + +Copyright (c) 2015 Spring, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +- Based on https://github.com/oguzbilgic/fpd, which has the following license: +""" +The MIT License (MIT) + +Copyright (c) 2013 Oguz Bilgic + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +""" diff --git a/vendor/github.com/shopspring/decimal/README.md b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/shopspring/decimal/README.md similarity index 100% rename from vendor/github.com/shopspring/decimal/README.md rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/shopspring/decimal/README.md diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/shopspring/decimal/decimal-go.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/shopspring/decimal/decimal-go.go new file mode 100644 index 00000000..e08a15ce --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/shopspring/decimal/decimal-go.go @@ -0,0 +1,414 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Multiprecision decimal numbers. +// For floating-point formatting only; not general purpose. +// Only operations are assign and (binary) left/right shift. +// Can do binary floating point in multiprecision decimal precisely +// because 2 divides 10; cannot do decimal floating point +// in multiprecision binary precisely. +package decimal + +type decimal struct { + d [800]byte // digits, big-endian representation + nd int // number of digits used + dp int // decimal point + neg bool // negative flag + trunc bool // discarded nonzero digits beyond d[:nd] +} + +func (a *decimal) String() string { + n := 10 + a.nd + if a.dp > 0 { + n += a.dp + } + if a.dp < 0 { + n += -a.dp + } + + buf := make([]byte, n) + w := 0 + switch { + case a.nd == 0: + return "0" + + case a.dp <= 0: + // zeros fill space between decimal point and digits + buf[w] = '0' + w++ + buf[w] = '.' + w++ + w += digitZero(buf[w : w+-a.dp]) + w += copy(buf[w:], a.d[0:a.nd]) + + case a.dp < a.nd: + // decimal point in middle of digits + w += copy(buf[w:], a.d[0:a.dp]) + buf[w] = '.' + w++ + w += copy(buf[w:], a.d[a.dp:a.nd]) + + default: + // zeros fill space between digits and decimal point + w += copy(buf[w:], a.d[0:a.nd]) + w += digitZero(buf[w : w+a.dp-a.nd]) + } + return string(buf[0:w]) +} + +func digitZero(dst []byte) int { + for i := range dst { + dst[i] = '0' + } + return len(dst) +} + +// trim trailing zeros from number. +// (They are meaningless; the decimal point is tracked +// independent of the number of digits.) +func trim(a *decimal) { + for a.nd > 0 && a.d[a.nd-1] == '0' { + a.nd-- + } + if a.nd == 0 { + a.dp = 0 + } +} + +// Assign v to a. +func (a *decimal) Assign(v uint64) { + var buf [24]byte + + // Write reversed decimal in buf. + n := 0 + for v > 0 { + v1 := v / 10 + v -= 10 * v1 + buf[n] = byte(v + '0') + n++ + v = v1 + } + + // Reverse again to produce forward decimal in a.d. + a.nd = 0 + for n--; n >= 0; n-- { + a.d[a.nd] = buf[n] + a.nd++ + } + a.dp = a.nd + trim(a) +} + +// Maximum shift that we can do in one pass without overflow. +// A uint has 32 or 64 bits, and we have to be able to accommodate 9<> 63) +const maxShift = uintSize - 4 + +// Binary shift right (/ 2) by k bits. k <= maxShift to avoid overflow. +func rightShift(a *decimal, k uint) { + r := 0 // read pointer + w := 0 // write pointer + + // Pick up enough leading digits to cover first shift. + var n uint + for ; n>>k == 0; r++ { + if r >= a.nd { + if n == 0 { + // a == 0; shouldn't get here, but handle anyway. + a.nd = 0 + return + } + for n>>k == 0 { + n = n * 10 + r++ + } + break + } + c := uint(a.d[r]) + n = n*10 + c - '0' + } + a.dp -= r - 1 + + var mask uint = (1 << k) - 1 + + // Pick up a digit, put down a digit. + for ; r < a.nd; r++ { + c := uint(a.d[r]) + dig := n >> k + n &= mask + a.d[w] = byte(dig + '0') + w++ + n = n*10 + c - '0' + } + + // Put down extra digits. + for n > 0 { + dig := n >> k + n &= mask + if w < len(a.d) { + a.d[w] = byte(dig + '0') + w++ + } else if dig > 0 { + a.trunc = true + } + n = n * 10 + } + + a.nd = w + trim(a) +} + +// Cheat sheet for left shift: table indexed by shift count giving +// number of new digits that will be introduced by that shift. +// +// For example, leftcheats[4] = {2, "625"}. That means that +// if we are shifting by 4 (multiplying by 16), it will add 2 digits +// when the string prefix is "625" through "999", and one fewer digit +// if the string prefix is "000" through "624". +// +// Credit for this trick goes to Ken. + +type leftCheat struct { + delta int // number of new digits + cutoff string // minus one digit if original < a. +} + +var leftcheats = []leftCheat{ + // Leading digits of 1/2^i = 5^i. + // 5^23 is not an exact 64-bit floating point number, + // so have to use bc for the math. + // Go up to 60 to be large enough for 32bit and 64bit platforms. + /* + seq 60 | sed 's/^/5^/' | bc | + awk 'BEGIN{ print "\t{ 0, \"\" }," } + { + log2 = log(2)/log(10) + printf("\t{ %d, \"%s\" },\t// * %d\n", + int(log2*NR+1), $0, 2**NR) + }' + */ + {0, ""}, + {1, "5"}, // * 2 + {1, "25"}, // * 4 + {1, "125"}, // * 8 + {2, "625"}, // * 16 + {2, "3125"}, // * 32 + {2, "15625"}, // * 64 + {3, "78125"}, // * 128 + {3, "390625"}, // * 256 + {3, "1953125"}, // * 512 + {4, "9765625"}, // * 1024 + {4, "48828125"}, // * 2048 + {4, "244140625"}, // * 4096 + {4, "1220703125"}, // * 8192 + {5, "6103515625"}, // * 16384 + {5, "30517578125"}, // * 32768 + {5, "152587890625"}, // * 65536 + {6, "762939453125"}, // * 131072 + {6, "3814697265625"}, // * 262144 + {6, "19073486328125"}, // * 524288 + {7, "95367431640625"}, // * 1048576 + {7, "476837158203125"}, // * 2097152 + {7, "2384185791015625"}, // * 4194304 + {7, "11920928955078125"}, // * 8388608 + {8, "59604644775390625"}, // * 16777216 + {8, "298023223876953125"}, // * 33554432 + {8, "1490116119384765625"}, // * 67108864 + {9, "7450580596923828125"}, // * 134217728 + {9, "37252902984619140625"}, // * 268435456 + {9, "186264514923095703125"}, // * 536870912 + {10, "931322574615478515625"}, // * 1073741824 + {10, "4656612873077392578125"}, // * 2147483648 + {10, "23283064365386962890625"}, // * 4294967296 + {10, "116415321826934814453125"}, // * 8589934592 + {11, "582076609134674072265625"}, // * 17179869184 + {11, "2910383045673370361328125"}, // * 34359738368 + {11, "14551915228366851806640625"}, // * 68719476736 + {12, "72759576141834259033203125"}, // * 137438953472 + {12, "363797880709171295166015625"}, // * 274877906944 + {12, "1818989403545856475830078125"}, // * 549755813888 + {13, "9094947017729282379150390625"}, // * 1099511627776 + {13, "45474735088646411895751953125"}, // * 2199023255552 + {13, "227373675443232059478759765625"}, // * 4398046511104 + {13, "1136868377216160297393798828125"}, // * 8796093022208 + {14, "5684341886080801486968994140625"}, // * 17592186044416 + {14, "28421709430404007434844970703125"}, // * 35184372088832 + {14, "142108547152020037174224853515625"}, // * 70368744177664 + {15, "710542735760100185871124267578125"}, // * 140737488355328 + {15, "3552713678800500929355621337890625"}, // * 281474976710656 + {15, "17763568394002504646778106689453125"}, // * 562949953421312 + {16, "88817841970012523233890533447265625"}, // * 1125899906842624 + {16, "444089209850062616169452667236328125"}, // * 2251799813685248 + {16, "2220446049250313080847263336181640625"}, // * 4503599627370496 + {16, "11102230246251565404236316680908203125"}, // * 9007199254740992 + {17, "55511151231257827021181583404541015625"}, // * 18014398509481984 + {17, "277555756156289135105907917022705078125"}, // * 36028797018963968 + {17, "1387778780781445675529539585113525390625"}, // * 72057594037927936 + {18, "6938893903907228377647697925567626953125"}, // * 144115188075855872 + {18, "34694469519536141888238489627838134765625"}, // * 288230376151711744 + {18, "173472347597680709441192448139190673828125"}, // * 576460752303423488 + {19, "867361737988403547205962240695953369140625"}, // * 1152921504606846976 +} + +// Is the leading prefix of b lexicographically less than s? +func prefixIsLessThan(b []byte, s string) bool { + for i := 0; i < len(s); i++ { + if i >= len(b) { + return true + } + if b[i] != s[i] { + return b[i] < s[i] + } + } + return false +} + +// Binary shift left (* 2) by k bits. k <= maxShift to avoid overflow. +func leftShift(a *decimal, k uint) { + delta := leftcheats[k].delta + if prefixIsLessThan(a.d[0:a.nd], leftcheats[k].cutoff) { + delta-- + } + + r := a.nd // read index + w := a.nd + delta // write index + + // Pick up a digit, put down a digit. + var n uint + for r--; r >= 0; r-- { + n += (uint(a.d[r]) - '0') << k + quo := n / 10 + rem := n - 10*quo + w-- + if w < len(a.d) { + a.d[w] = byte(rem + '0') + } else if rem != 0 { + a.trunc = true + } + n = quo + } + + // Put down extra digits. + for n > 0 { + quo := n / 10 + rem := n - 10*quo + w-- + if w < len(a.d) { + a.d[w] = byte(rem + '0') + } else if rem != 0 { + a.trunc = true + } + n = quo + } + + a.nd += delta + if a.nd >= len(a.d) { + a.nd = len(a.d) + } + a.dp += delta + trim(a) +} + +// Binary shift left (k > 0) or right (k < 0). +func (a *decimal) Shift(k int) { + switch { + case a.nd == 0: + // nothing to do: a == 0 + case k > 0: + for k > maxShift { + leftShift(a, maxShift) + k -= maxShift + } + leftShift(a, uint(k)) + case k < 0: + for k < -maxShift { + rightShift(a, maxShift) + k += maxShift + } + rightShift(a, uint(-k)) + } +} + +// If we chop a at nd digits, should we round up? +func shouldRoundUp(a *decimal, nd int) bool { + if nd < 0 || nd >= a.nd { + return false + } + if a.d[nd] == '5' && nd+1 == a.nd { // exactly halfway - round to even + // if we truncated, a little higher than what's recorded - always round up + if a.trunc { + return true + } + return nd > 0 && (a.d[nd-1]-'0')%2 != 0 + } + // not halfway - digit tells all + return a.d[nd] >= '5' +} + +// Round a to nd digits (or fewer). +// If nd is zero, it means we're rounding +// just to the left of the digits, as in +// 0.09 -> 0.1. +func (a *decimal) Round(nd int) { + if nd < 0 || nd >= a.nd { + return + } + if shouldRoundUp(a, nd) { + a.RoundUp(nd) + } else { + a.RoundDown(nd) + } +} + +// Round a down to nd digits (or fewer). +func (a *decimal) RoundDown(nd int) { + if nd < 0 || nd >= a.nd { + return + } + a.nd = nd + trim(a) +} + +// Round a up to nd digits (or fewer). +func (a *decimal) RoundUp(nd int) { + if nd < 0 || nd >= a.nd { + return + } + + // round up + for i := nd - 1; i >= 0; i-- { + c := a.d[i] + if c < '9' { // can stop after this digit + a.d[i]++ + a.nd = i + 1 + return + } + } + + // Number is all 9s. + // Change to single 1 with adjusted decimal point. + a.d[0] = '1' + a.nd = 1 + a.dp++ +} + +// Extract integer part, rounded appropriately. +// No guarantees about overflow. +func (a *decimal) RoundedInteger() uint64 { + if a.dp > 20 { + return 0xFFFFFFFFFFFFFFFF + } + var i int + n := uint64(0) + for i = 0; i < a.dp && i < a.nd; i++ { + n = n*10 + uint64(a.d[i]-'0') + } + for ; i < a.dp; i++ { + n *= 10 + } + if shouldRoundUp(a, a.dp) { + n++ + } + return n +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/shopspring/decimal/decimal.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/shopspring/decimal/decimal.go new file mode 100644 index 00000000..134ece2f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/shopspring/decimal/decimal.go @@ -0,0 +1,1434 @@ +// Package decimal implements an arbitrary precision fixed-point decimal. +// +// To use as part of a struct: +// +// type Struct struct { +// Number Decimal +// } +// +// The zero-value of a Decimal is 0, as you would expect. +// +// The best way to create a new Decimal is to use decimal.NewFromString, ex: +// +// n, err := decimal.NewFromString("-123.4567") +// n.String() // output: "-123.4567" +// +// NOTE: This can "only" represent numbers with a maximum of 2^31 digits +// after the decimal point. +package decimal + +import ( + "database/sql/driver" + "encoding/binary" + "fmt" + "math" + "math/big" + "strconv" + "strings" +) + +// DivisionPrecision is the number of decimal places in the result when it +// doesn't divide exactly. +// +// Example: +// +// d1 := decimal.NewFromFloat(2).Div(decimal.NewFromFloat(3) +// d1.String() // output: "0.6666666666666667" +// d2 := decimal.NewFromFloat(2).Div(decimal.NewFromFloat(30000) +// d2.String() // output: "0.0000666666666667" +// d3 := decimal.NewFromFloat(20000).Div(decimal.NewFromFloat(3) +// d3.String() // output: "6666.6666666666666667" +// decimal.DivisionPrecision = 3 +// d4 := decimal.NewFromFloat(2).Div(decimal.NewFromFloat(3) +// d4.String() // output: "0.667" +// +var DivisionPrecision = 16 + +// MarshalJSONWithoutQuotes should be set to true if you want the decimal to +// be JSON marshaled as a number, instead of as a string. +// WARNING: this is dangerous for decimals with many digits, since many JSON +// unmarshallers (ex: Javascript's) will unmarshal JSON numbers to IEEE 754 +// double-precision floating point numbers, which means you can potentially +// silently lose precision. +var MarshalJSONWithoutQuotes = false + +// Zero constant, to make computations faster. +var Zero = New(0, 1) + +// fiveDec used in Cash Rounding +var fiveDec = New(5, 0) + +var zeroInt = big.NewInt(0) +var oneInt = big.NewInt(1) +var twoInt = big.NewInt(2) +var fourInt = big.NewInt(4) +var fiveInt = big.NewInt(5) +var tenInt = big.NewInt(10) +var twentyInt = big.NewInt(20) + +// Decimal represents a fixed-point decimal. It is immutable. +// number = value * 10 ^ exp +type Decimal struct { + value *big.Int + + // NOTE(vadim): this must be an int32, because we cast it to float64 during + // calculations. If exp is 64 bit, we might lose precision. + // If we cared about being able to represent every possible decimal, we + // could make exp a *big.Int but it would hurt performance and numbers + // like that are unrealistic. + exp int32 +} + +// New returns a new fixed-point decimal, value * 10 ^ exp. +func New(value int64, exp int32) Decimal { + return Decimal{ + value: big.NewInt(value), + exp: exp, + } +} + +// NewFromBigInt returns a new Decimal from a big.Int, value * 10 ^ exp +func NewFromBigInt(value *big.Int, exp int32) Decimal { + return Decimal{ + value: big.NewInt(0).Set(value), + exp: exp, + } +} + +// NewFromString returns a new Decimal from a string representation. +// +// Example: +// +// d, err := NewFromString("-123.45") +// d2, err := NewFromString(".0001") +// +func NewFromString(value string) (Decimal, error) { + originalInput := value + var intString string + var exp int64 + + // Check if number is using scientific notation + eIndex := strings.IndexAny(value, "Ee") + if eIndex != -1 { + expInt, err := strconv.ParseInt(value[eIndex+1:], 10, 32) + if err != nil { + if e, ok := err.(*strconv.NumError); ok && e.Err == strconv.ErrRange { + return Decimal{}, fmt.Errorf("can't convert %s to decimal: fractional part too long", value) + } + return Decimal{}, fmt.Errorf("can't convert %s to decimal: exponent is not numeric", value) + } + value = value[:eIndex] + exp = expInt + } + + parts := strings.Split(value, ".") + if len(parts) == 1 { + // There is no decimal point, we can just parse the original string as + // an int + intString = value + } else if len(parts) == 2 { + // strip the insignificant digits for more accurate comparisons. + decimalPart := strings.TrimRight(parts[1], "0") + intString = parts[0] + decimalPart + expInt := -len(decimalPart) + exp += int64(expInt) + } else { + return Decimal{}, fmt.Errorf("can't convert %s to decimal: too many .s", value) + } + + dValue := new(big.Int) + _, ok := dValue.SetString(intString, 10) + if !ok { + return Decimal{}, fmt.Errorf("can't convert %s to decimal", value) + } + + if exp < math.MinInt32 || exp > math.MaxInt32 { + // NOTE(vadim): I doubt a string could realistically be this long + return Decimal{}, fmt.Errorf("can't convert %s to decimal: fractional part too long", originalInput) + } + + return Decimal{ + value: dValue, + exp: int32(exp), + }, nil +} + +// RequireFromString returns a new Decimal from a string representation +// or panics if NewFromString would have returned an error. +// +// Example: +// +// d := RequireFromString("-123.45") +// d2 := RequireFromString(".0001") +// +func RequireFromString(value string) Decimal { + dec, err := NewFromString(value) + if err != nil { + panic(err) + } + return dec +} + +// NewFromFloat converts a float64 to Decimal. +// +// The converted number will contain the number of significant digits that can be +// represented in a float with reliable roundtrip. +// This is typically 15 digits, but may be more in some cases. +// See https://www.exploringbinary.com/decimal-precision-of-binary-floating-point-numbers/ for more information. +// +// For slightly faster conversion, use NewFromFloatWithExponent where you can specify the precision in absolute terms. +// +// NOTE: this will panic on NaN, +/-inf +func NewFromFloat(value float64) Decimal { + if value == 0 { + return New(0, 0) + } + return newFromFloat(value, math.Float64bits(value), &float64info) +} + +// NewFromFloat converts a float32 to Decimal. +// +// The converted number will contain the number of significant digits that can be +// represented in a float with reliable roundtrip. +// This is typically 6-8 digits depending on the input. +// See https://www.exploringbinary.com/decimal-precision-of-binary-floating-point-numbers/ for more information. +// +// For slightly faster conversion, use NewFromFloatWithExponent where you can specify the precision in absolute terms. +// +// NOTE: this will panic on NaN, +/-inf +func NewFromFloat32(value float32) Decimal { + if value == 0 { + return New(0, 0) + } + // XOR is workaround for https://github.com/golang/go/issues/26285 + a := math.Float32bits(value) ^ 0x80808080 + return newFromFloat(float64(value), uint64(a)^0x80808080, &float32info) +} + +func newFromFloat(val float64, bits uint64, flt *floatInfo) Decimal { + if math.IsNaN(val) || math.IsInf(val, 0) { + panic(fmt.Sprintf("Cannot create a Decimal from %v", val)) + } + exp := int(bits>>flt.mantbits) & (1<>(flt.expbits+flt.mantbits) != 0 + + roundShortest(&d, mant, exp, flt) + // If less than 19 digits, we can do calculation in an int64. + if d.nd < 19 { + tmp := int64(0) + m := int64(1) + for i := d.nd - 1; i >= 0; i-- { + tmp += m * int64(d.d[i]-'0') + m *= 10 + } + if d.neg { + tmp *= -1 + } + return Decimal{value: big.NewInt(tmp), exp: int32(d.dp) - int32(d.nd)} + } + dValue := new(big.Int) + dValue, ok := dValue.SetString(string(d.d[:d.nd]), 10) + if ok { + return Decimal{value: dValue, exp: int32(d.dp) - int32(d.nd)} + } + + return NewFromFloatWithExponent(val, int32(d.dp)-int32(d.nd)) +} + +// NewFromFloatWithExponent converts a float64 to Decimal, with an arbitrary +// number of fractional digits. +// +// Example: +// +// NewFromFloatWithExponent(123.456, -2).String() // output: "123.46" +// +func NewFromFloatWithExponent(value float64, exp int32) Decimal { + if math.IsNaN(value) || math.IsInf(value, 0) { + panic(fmt.Sprintf("Cannot create a Decimal from %v", value)) + } + + bits := math.Float64bits(value) + mant := bits & (1<<52 - 1) + exp2 := int32((bits >> 52) & (1<<11 - 1)) + sign := bits >> 63 + + if exp2 == 0 { + // specials + if mant == 0 { + return Decimal{} + } else { + // subnormal + exp2++ + } + } else { + // normal + mant |= 1 << 52 + } + + exp2 -= 1023 + 52 + + // normalizing base-2 values + for mant&1 == 0 { + mant = mant >> 1 + exp2++ + } + + // maximum number of fractional base-10 digits to represent 2^N exactly cannot be more than -N if N<0 + if exp < 0 && exp < exp2 { + if exp2 < 0 { + exp = exp2 + } else { + exp = 0 + } + } + + // representing 10^M * 2^N as 5^M * 2^(M+N) + exp2 -= exp + + temp := big.NewInt(1) + dMant := big.NewInt(int64(mant)) + + // applying 5^M + if exp > 0 { + temp = temp.SetInt64(int64(exp)) + temp = temp.Exp(fiveInt, temp, nil) + } else if exp < 0 { + temp = temp.SetInt64(-int64(exp)) + temp = temp.Exp(fiveInt, temp, nil) + dMant = dMant.Mul(dMant, temp) + temp = temp.SetUint64(1) + } + + // applying 2^(M+N) + if exp2 > 0 { + dMant = dMant.Lsh(dMant, uint(exp2)) + } else if exp2 < 0 { + temp = temp.Lsh(temp, uint(-exp2)) + } + + // rounding and downscaling + if exp > 0 || exp2 < 0 { + halfDown := new(big.Int).Rsh(temp, 1) + dMant = dMant.Add(dMant, halfDown) + dMant = dMant.Quo(dMant, temp) + } + + if sign == 1 { + dMant = dMant.Neg(dMant) + } + + return Decimal{ + value: dMant, + exp: exp, + } +} + +// rescale returns a rescaled version of the decimal. Returned +// decimal may be less precise if the given exponent is bigger +// than the initial exponent of the Decimal. +// NOTE: this will truncate, NOT round +// +// Example: +// +// d := New(12345, -4) +// d2 := d.rescale(-1) +// d3 := d2.rescale(-4) +// println(d1) +// println(d2) +// println(d3) +// +// Output: +// +// 1.2345 +// 1.2 +// 1.2000 +// +func (d Decimal) rescale(exp int32) Decimal { + d.ensureInitialized() + // NOTE(vadim): must convert exps to float64 before - to prevent overflow + diff := math.Abs(float64(exp) - float64(d.exp)) + value := new(big.Int).Set(d.value) + + expScale := new(big.Int).Exp(tenInt, big.NewInt(int64(diff)), nil) + if exp > d.exp { + value = value.Quo(value, expScale) + } else if exp < d.exp { + value = value.Mul(value, expScale) + } + + return Decimal{ + value: value, + exp: exp, + } +} + +// Abs returns the absolute value of the decimal. +func (d Decimal) Abs() Decimal { + d.ensureInitialized() + d2Value := new(big.Int).Abs(d.value) + return Decimal{ + value: d2Value, + exp: d.exp, + } +} + +// Add returns d + d2. +func (d Decimal) Add(d2 Decimal) Decimal { + baseScale := min(d.exp, d2.exp) + rd := d.rescale(baseScale) + rd2 := d2.rescale(baseScale) + + d3Value := new(big.Int).Add(rd.value, rd2.value) + return Decimal{ + value: d3Value, + exp: baseScale, + } +} + +// Sub returns d - d2. +func (d Decimal) Sub(d2 Decimal) Decimal { + baseScale := min(d.exp, d2.exp) + rd := d.rescale(baseScale) + rd2 := d2.rescale(baseScale) + + d3Value := new(big.Int).Sub(rd.value, rd2.value) + return Decimal{ + value: d3Value, + exp: baseScale, + } +} + +// Neg returns -d. +func (d Decimal) Neg() Decimal { + d.ensureInitialized() + val := new(big.Int).Neg(d.value) + return Decimal{ + value: val, + exp: d.exp, + } +} + +// Mul returns d * d2. +func (d Decimal) Mul(d2 Decimal) Decimal { + d.ensureInitialized() + d2.ensureInitialized() + + expInt64 := int64(d.exp) + int64(d2.exp) + if expInt64 > math.MaxInt32 || expInt64 < math.MinInt32 { + // NOTE(vadim): better to panic than give incorrect results, as + // Decimals are usually used for money + panic(fmt.Sprintf("exponent %v overflows an int32!", expInt64)) + } + + d3Value := new(big.Int).Mul(d.value, d2.value) + return Decimal{ + value: d3Value, + exp: int32(expInt64), + } +} + +// Shift shifts the decimal in base 10. +// It shifts left when shift is positive and right if shift is negative. +// In simpler terms, the given value for shift is added to the exponent +// of the decimal. +func (d Decimal) Shift(shift int32) Decimal { + d.ensureInitialized() + return Decimal{ + value: new(big.Int).Set(d.value), + exp: d.exp + shift, + } +} + +// Div returns d / d2. If it doesn't divide exactly, the result will have +// DivisionPrecision digits after the decimal point. +func (d Decimal) Div(d2 Decimal) Decimal { + return d.DivRound(d2, int32(DivisionPrecision)) +} + +// QuoRem does divsion with remainder +// d.QuoRem(d2,precision) returns quotient q and remainder r such that +// d = d2 * q + r, q an integer multiple of 10^(-precision) +// 0 <= r < abs(d2) * 10 ^(-precision) if d>=0 +// 0 >= r > -abs(d2) * 10 ^(-precision) if d<0 +// Note that precision<0 is allowed as input. +func (d Decimal) QuoRem(d2 Decimal, precision int32) (Decimal, Decimal) { + d.ensureInitialized() + d2.ensureInitialized() + if d2.value.Sign() == 0 { + panic("decimal division by 0") + } + scale := -precision + e := int64(d.exp - d2.exp - scale) + if e > math.MaxInt32 || e < math.MinInt32 { + panic("overflow in decimal QuoRem") + } + var aa, bb, expo big.Int + var scalerest int32 + // d = a 10^ea + // d2 = b 10^eb + if e < 0 { + aa = *d.value + expo.SetInt64(-e) + bb.Exp(tenInt, &expo, nil) + bb.Mul(d2.value, &bb) + scalerest = d.exp + // now aa = a + // bb = b 10^(scale + eb - ea) + } else { + expo.SetInt64(e) + aa.Exp(tenInt, &expo, nil) + aa.Mul(d.value, &aa) + bb = *d2.value + scalerest = scale + d2.exp + // now aa = a ^ (ea - eb - scale) + // bb = b + } + var q, r big.Int + q.QuoRem(&aa, &bb, &r) + dq := Decimal{value: &q, exp: scale} + dr := Decimal{value: &r, exp: scalerest} + return dq, dr +} + +// DivRound divides and rounds to a given precision +// i.e. to an integer multiple of 10^(-precision) +// for a positive quotient digit 5 is rounded up, away from 0 +// if the quotient is negative then digit 5 is rounded down, away from 0 +// Note that precision<0 is allowed as input. +func (d Decimal) DivRound(d2 Decimal, precision int32) Decimal { + // QuoRem already checks initialization + q, r := d.QuoRem(d2, precision) + // the actual rounding decision is based on comparing r*10^precision and d2/2 + // instead compare 2 r 10 ^precision and d2 + var rv2 big.Int + rv2.Abs(r.value) + rv2.Lsh(&rv2, 1) + // now rv2 = abs(r.value) * 2 + r2 := Decimal{value: &rv2, exp: r.exp + precision} + // r2 is now 2 * r * 10 ^ precision + var c = r2.Cmp(d2.Abs()) + + if c < 0 { + return q + } + + if d.value.Sign()*d2.value.Sign() < 0 { + return q.Sub(New(1, -precision)) + } + + return q.Add(New(1, -precision)) +} + +// Mod returns d % d2. +func (d Decimal) Mod(d2 Decimal) Decimal { + quo := d.Div(d2).Truncate(0) + return d.Sub(d2.Mul(quo)) +} + +// Pow returns d to the power d2 +func (d Decimal) Pow(d2 Decimal) Decimal { + var temp Decimal + if d2.IntPart() == 0 { + return NewFromFloat(1) + } + temp = d.Pow(d2.Div(NewFromFloat(2))) + if d2.IntPart()%2 == 0 { + return temp.Mul(temp) + } + if d2.IntPart() > 0 { + return temp.Mul(temp).Mul(d) + } + return temp.Mul(temp).Div(d) +} + +// Cmp compares the numbers represented by d and d2 and returns: +// +// -1 if d < d2 +// 0 if d == d2 +// +1 if d > d2 +// +func (d Decimal) Cmp(d2 Decimal) int { + d.ensureInitialized() + d2.ensureInitialized() + + if d.exp == d2.exp { + return d.value.Cmp(d2.value) + } + + baseExp := min(d.exp, d2.exp) + rd := d.rescale(baseExp) + rd2 := d2.rescale(baseExp) + + return rd.value.Cmp(rd2.value) +} + +// Equal returns whether the numbers represented by d and d2 are equal. +func (d Decimal) Equal(d2 Decimal) bool { + return d.Cmp(d2) == 0 +} + +// Equals is deprecated, please use Equal method instead +func (d Decimal) Equals(d2 Decimal) bool { + return d.Equal(d2) +} + +// GreaterThan (GT) returns true when d is greater than d2. +func (d Decimal) GreaterThan(d2 Decimal) bool { + return d.Cmp(d2) == 1 +} + +// GreaterThanOrEqual (GTE) returns true when d is greater than or equal to d2. +func (d Decimal) GreaterThanOrEqual(d2 Decimal) bool { + cmp := d.Cmp(d2) + return cmp == 1 || cmp == 0 +} + +// LessThan (LT) returns true when d is less than d2. +func (d Decimal) LessThan(d2 Decimal) bool { + return d.Cmp(d2) == -1 +} + +// LessThanOrEqual (LTE) returns true when d is less than or equal to d2. +func (d Decimal) LessThanOrEqual(d2 Decimal) bool { + cmp := d.Cmp(d2) + return cmp == -1 || cmp == 0 +} + +// Sign returns: +// +// -1 if d < 0 +// 0 if d == 0 +// +1 if d > 0 +// +func (d Decimal) Sign() int { + if d.value == nil { + return 0 + } + return d.value.Sign() +} + +// IsPositive return +// +// true if d > 0 +// false if d == 0 +// false if d < 0 +func (d Decimal) IsPositive() bool { + return d.Sign() == 1 +} + +// IsNegative return +// +// true if d < 0 +// false if d == 0 +// false if d > 0 +func (d Decimal) IsNegative() bool { + return d.Sign() == -1 +} + +// IsZero return +// +// true if d == 0 +// false if d > 0 +// false if d < 0 +func (d Decimal) IsZero() bool { + return d.Sign() == 0 +} + +// Exponent returns the exponent, or scale component of the decimal. +func (d Decimal) Exponent() int32 { + return d.exp +} + +// Coefficient returns the coefficient of the decimal. It is scaled by 10^Exponent() +func (d Decimal) Coefficient() *big.Int { + // we copy the coefficient so that mutating the result does not mutate the + // Decimal. + return big.NewInt(0).Set(d.value) +} + +// IntPart returns the integer component of the decimal. +func (d Decimal) IntPart() int64 { + scaledD := d.rescale(0) + return scaledD.value.Int64() +} + +// Rat returns a rational number representation of the decimal. +func (d Decimal) Rat() *big.Rat { + d.ensureInitialized() + if d.exp <= 0 { + // NOTE(vadim): must negate after casting to prevent int32 overflow + denom := new(big.Int).Exp(tenInt, big.NewInt(-int64(d.exp)), nil) + return new(big.Rat).SetFrac(d.value, denom) + } + + mul := new(big.Int).Exp(tenInt, big.NewInt(int64(d.exp)), nil) + num := new(big.Int).Mul(d.value, mul) + return new(big.Rat).SetFrac(num, oneInt) +} + +// Float64 returns the nearest float64 value for d and a bool indicating +// whether f represents d exactly. +// For more details, see the documentation for big.Rat.Float64 +func (d Decimal) Float64() (f float64, exact bool) { + return d.Rat().Float64() +} + +// String returns the string representation of the decimal +// with the fixed point. +// +// Example: +// +// d := New(-12345, -3) +// println(d.String()) +// +// Output: +// +// -12.345 +// +func (d Decimal) String() string { + return d.string(true) +} + +// StringFixed returns a rounded fixed-point string with places digits after +// the decimal point. +// +// Example: +// +// NewFromFloat(0).StringFixed(2) // output: "0.00" +// NewFromFloat(0).StringFixed(0) // output: "0" +// NewFromFloat(5.45).StringFixed(0) // output: "5" +// NewFromFloat(5.45).StringFixed(1) // output: "5.5" +// NewFromFloat(5.45).StringFixed(2) // output: "5.45" +// NewFromFloat(5.45).StringFixed(3) // output: "5.450" +// NewFromFloat(545).StringFixed(-1) // output: "550" +// +func (d Decimal) StringFixed(places int32) string { + rounded := d.Round(places) + return rounded.string(false) +} + +// StringFixedBank returns a banker rounded fixed-point string with places digits +// after the decimal point. +// +// Example: +// +// NewFromFloat(0).StringFixed(2) // output: "0.00" +// NewFromFloat(0).StringFixed(0) // output: "0" +// NewFromFloat(5.45).StringFixed(0) // output: "5" +// NewFromFloat(5.45).StringFixed(1) // output: "5.4" +// NewFromFloat(5.45).StringFixed(2) // output: "5.45" +// NewFromFloat(5.45).StringFixed(3) // output: "5.450" +// NewFromFloat(545).StringFixed(-1) // output: "550" +// +func (d Decimal) StringFixedBank(places int32) string { + rounded := d.RoundBank(places) + return rounded.string(false) +} + +// StringFixedCash returns a Swedish/Cash rounded fixed-point string. For +// more details see the documentation at function RoundCash. +func (d Decimal) StringFixedCash(interval uint8) string { + rounded := d.RoundCash(interval) + return rounded.string(false) +} + +// Round rounds the decimal to places decimal places. +// If places < 0, it will round the integer part to the nearest 10^(-places). +// +// Example: +// +// NewFromFloat(5.45).Round(1).String() // output: "5.5" +// NewFromFloat(545).Round(-1).String() // output: "550" +// +func (d Decimal) Round(places int32) Decimal { + // truncate to places + 1 + ret := d.rescale(-places - 1) + + // add sign(d) * 0.5 + if ret.value.Sign() < 0 { + ret.value.Sub(ret.value, fiveInt) + } else { + ret.value.Add(ret.value, fiveInt) + } + + // floor for positive numbers, ceil for negative numbers + _, m := ret.value.DivMod(ret.value, tenInt, new(big.Int)) + ret.exp++ + if ret.value.Sign() < 0 && m.Cmp(zeroInt) != 0 { + ret.value.Add(ret.value, oneInt) + } + + return ret +} + +// RoundBank rounds the decimal to places decimal places. +// If the final digit to round is equidistant from the nearest two integers the +// rounded value is taken as the even number +// +// If places < 0, it will round the integer part to the nearest 10^(-places). +// +// Examples: +// +// NewFromFloat(5.45).Round(1).String() // output: "5.4" +// NewFromFloat(545).Round(-1).String() // output: "540" +// NewFromFloat(5.46).Round(1).String() // output: "5.5" +// NewFromFloat(546).Round(-1).String() // output: "550" +// NewFromFloat(5.55).Round(1).String() // output: "5.6" +// NewFromFloat(555).Round(-1).String() // output: "560" +// +func (d Decimal) RoundBank(places int32) Decimal { + + round := d.Round(places) + remainder := d.Sub(round).Abs() + + half := New(5, -places-1) + if remainder.Cmp(half) == 0 && round.value.Bit(0) != 0 { + if round.value.Sign() < 0 { + round.value.Add(round.value, oneInt) + } else { + round.value.Sub(round.value, oneInt) + } + } + + return round +} + +// RoundCash aka Cash/Penny/öre rounding rounds decimal to a specific +// interval. The amount payable for a cash transaction is rounded to the nearest +// multiple of the minimum currency unit available. The following intervals are +// available: 5, 10, 15, 25, 50 and 100; any other number throws a panic. +// 5: 5 cent rounding 3.43 => 3.45 +// 10: 10 cent rounding 3.45 => 3.50 (5 gets rounded up) +// 15: 10 cent rounding 3.45 => 3.40 (5 gets rounded down) +// 25: 25 cent rounding 3.41 => 3.50 +// 50: 50 cent rounding 3.75 => 4.00 +// 100: 100 cent rounding 3.50 => 4.00 +// For more details: https://en.wikipedia.org/wiki/Cash_rounding +func (d Decimal) RoundCash(interval uint8) Decimal { + var iVal *big.Int + switch interval { + case 5: + iVal = twentyInt + case 10: + iVal = tenInt + case 15: + if d.exp < 0 { + // TODO: optimize and reduce allocations + orgExp := d.exp + dOne := New(10^-int64(orgExp), orgExp) + d2 := d + d2.exp = 0 + if d2.Mod(fiveDec).Equal(Zero) { + d2.exp = orgExp + d2 = d2.Sub(dOne) + d = d2 + } + } + iVal = tenInt + case 25: + iVal = fourInt + case 50: + iVal = twoInt + case 100: + iVal = oneInt + default: + panic(fmt.Sprintf("Decimal does not support this Cash rounding interval `%d`. Supported: 5, 10, 15, 25, 50, 100", interval)) + } + dVal := Decimal{ + value: iVal, + } + // TODO: optimize those calculations to reduce the high allocations (~29 allocs). + return d.Mul(dVal).Round(0).Div(dVal).Truncate(2) +} + +// Floor returns the nearest integer value less than or equal to d. +func (d Decimal) Floor() Decimal { + d.ensureInitialized() + + if d.exp >= 0 { + return d + } + + exp := big.NewInt(10) + + // NOTE(vadim): must negate after casting to prevent int32 overflow + exp.Exp(exp, big.NewInt(-int64(d.exp)), nil) + + z := new(big.Int).Div(d.value, exp) + return Decimal{value: z, exp: 0} +} + +// Ceil returns the nearest integer value greater than or equal to d. +func (d Decimal) Ceil() Decimal { + d.ensureInitialized() + + if d.exp >= 0 { + return d + } + + exp := big.NewInt(10) + + // NOTE(vadim): must negate after casting to prevent int32 overflow + exp.Exp(exp, big.NewInt(-int64(d.exp)), nil) + + z, m := new(big.Int).DivMod(d.value, exp, new(big.Int)) + if m.Cmp(zeroInt) != 0 { + z.Add(z, oneInt) + } + return Decimal{value: z, exp: 0} +} + +// Truncate truncates off digits from the number, without rounding. +// +// NOTE: precision is the last digit that will not be truncated (must be >= 0). +// +// Example: +// +// decimal.NewFromString("123.456").Truncate(2).String() // "123.45" +// +func (d Decimal) Truncate(precision int32) Decimal { + d.ensureInitialized() + if precision >= 0 && -precision > d.exp { + return d.rescale(-precision) + } + return d +} + +// UnmarshalJSON implements the json.Unmarshaler interface. +func (d *Decimal) UnmarshalJSON(decimalBytes []byte) error { + if string(decimalBytes) == "null" { + return nil + } + + str, err := unquoteIfQuoted(decimalBytes) + if err != nil { + return fmt.Errorf("Error decoding string '%s': %s", decimalBytes, err) + } + + decimal, err := NewFromString(str) + *d = decimal + if err != nil { + return fmt.Errorf("Error decoding string '%s': %s", str, err) + } + return nil +} + +// MarshalJSON implements the json.Marshaler interface. +func (d Decimal) MarshalJSON() ([]byte, error) { + var str string + if MarshalJSONWithoutQuotes { + str = d.String() + } else { + str = "\"" + d.String() + "\"" + } + return []byte(str), nil +} + +// UnmarshalBinary implements the encoding.BinaryUnmarshaler interface. As a string representation +// is already used when encoding to text, this method stores that string as []byte +func (d *Decimal) UnmarshalBinary(data []byte) error { + // Extract the exponent + d.exp = int32(binary.BigEndian.Uint32(data[:4])) + + // Extract the value + d.value = new(big.Int) + return d.value.GobDecode(data[4:]) +} + +// MarshalBinary implements the encoding.BinaryMarshaler interface. +func (d Decimal) MarshalBinary() (data []byte, err error) { + // Write the exponent first since it's a fixed size + v1 := make([]byte, 4) + binary.BigEndian.PutUint32(v1, uint32(d.exp)) + + // Add the value + var v2 []byte + if v2, err = d.value.GobEncode(); err != nil { + return + } + + // Return the byte array + data = append(v1, v2...) + return +} + +// Scan implements the sql.Scanner interface for database deserialization. +func (d *Decimal) Scan(value interface{}) error { + // first try to see if the data is stored in database as a Numeric datatype + switch v := value.(type) { + + case float32: + *d = NewFromFloat(float64(v)) + return nil + + case float64: + // numeric in sqlite3 sends us float64 + *d = NewFromFloat(v) + return nil + + case int64: + // at least in sqlite3 when the value is 0 in db, the data is sent + // to us as an int64 instead of a float64 ... + *d = New(v, 0) + return nil + + default: + // default is trying to interpret value stored as string + str, err := unquoteIfQuoted(v) + if err != nil { + return err + } + *d, err = NewFromString(str) + return err + } +} + +// Value implements the driver.Valuer interface for database serialization. +func (d Decimal) Value() (driver.Value, error) { + return d.String(), nil +} + +// UnmarshalText implements the encoding.TextUnmarshaler interface for XML +// deserialization. +func (d *Decimal) UnmarshalText(text []byte) error { + str := string(text) + + dec, err := NewFromString(str) + *d = dec + if err != nil { + return fmt.Errorf("Error decoding string '%s': %s", str, err) + } + + return nil +} + +// MarshalText implements the encoding.TextMarshaler interface for XML +// serialization. +func (d Decimal) MarshalText() (text []byte, err error) { + return []byte(d.String()), nil +} + +// GobEncode implements the gob.GobEncoder interface for gob serialization. +func (d Decimal) GobEncode() ([]byte, error) { + return d.MarshalBinary() +} + +// GobDecode implements the gob.GobDecoder interface for gob serialization. +func (d *Decimal) GobDecode(data []byte) error { + return d.UnmarshalBinary(data) +} + +// StringScaled first scales the decimal then calls .String() on it. +// NOTE: buggy, unintuitive, and DEPRECATED! Use StringFixed instead. +func (d Decimal) StringScaled(exp int32) string { + return d.rescale(exp).String() +} + +func (d Decimal) string(trimTrailingZeros bool) string { + if d.exp >= 0 { + return d.rescale(0).value.String() + } + + abs := new(big.Int).Abs(d.value) + str := abs.String() + + var intPart, fractionalPart string + + // NOTE(vadim): this cast to int will cause bugs if d.exp == INT_MIN + // and you are on a 32-bit machine. Won't fix this super-edge case. + dExpInt := int(d.exp) + if len(str) > -dExpInt { + intPart = str[:len(str)+dExpInt] + fractionalPart = str[len(str)+dExpInt:] + } else { + intPart = "0" + + num0s := -dExpInt - len(str) + fractionalPart = strings.Repeat("0", num0s) + str + } + + if trimTrailingZeros { + i := len(fractionalPart) - 1 + for ; i >= 0; i-- { + if fractionalPart[i] != '0' { + break + } + } + fractionalPart = fractionalPart[:i+1] + } + + number := intPart + if len(fractionalPart) > 0 { + number += "." + fractionalPart + } + + if d.value.Sign() < 0 { + return "-" + number + } + + return number +} + +func (d *Decimal) ensureInitialized() { + if d.value == nil { + d.value = new(big.Int) + } +} + +// Min returns the smallest Decimal that was passed in the arguments. +// +// To call this function with an array, you must do: +// +// Min(arr[0], arr[1:]...) +// +// This makes it harder to accidentally call Min with 0 arguments. +func Min(first Decimal, rest ...Decimal) Decimal { + ans := first + for _, item := range rest { + if item.Cmp(ans) < 0 { + ans = item + } + } + return ans +} + +// Max returns the largest Decimal that was passed in the arguments. +// +// To call this function with an array, you must do: +// +// Max(arr[0], arr[1:]...) +// +// This makes it harder to accidentally call Max with 0 arguments. +func Max(first Decimal, rest ...Decimal) Decimal { + ans := first + for _, item := range rest { + if item.Cmp(ans) > 0 { + ans = item + } + } + return ans +} + +// Sum returns the combined total of the provided first and rest Decimals +func Sum(first Decimal, rest ...Decimal) Decimal { + total := first + for _, item := range rest { + total = total.Add(item) + } + + return total +} + +// Avg returns the average value of the provided first and rest Decimals +func Avg(first Decimal, rest ...Decimal) Decimal { + count := New(int64(len(rest)+1), 0) + sum := Sum(first, rest...) + return sum.Div(count) +} + +func min(x, y int32) int32 { + if x >= y { + return y + } + return x +} + +func unquoteIfQuoted(value interface{}) (string, error) { + var bytes []byte + + switch v := value.(type) { + case string: + bytes = []byte(v) + case []byte: + bytes = v + default: + return "", fmt.Errorf("Could not convert value '%+v' to byte array of type '%T'", + value, value) + } + + // If the amount is quoted, strip the quotes + if len(bytes) > 2 && bytes[0] == '"' && bytes[len(bytes)-1] == '"' { + bytes = bytes[1 : len(bytes)-1] + } + return string(bytes), nil +} + +// NullDecimal represents a nullable decimal with compatibility for +// scanning null values from the database. +type NullDecimal struct { + Decimal Decimal + Valid bool +} + +// Scan implements the sql.Scanner interface for database deserialization. +func (d *NullDecimal) Scan(value interface{}) error { + if value == nil { + d.Valid = false + return nil + } + d.Valid = true + return d.Decimal.Scan(value) +} + +// Value implements the driver.Valuer interface for database serialization. +func (d NullDecimal) Value() (driver.Value, error) { + if !d.Valid { + return nil, nil + } + return d.Decimal.Value() +} + +// UnmarshalJSON implements the json.Unmarshaler interface. +func (d *NullDecimal) UnmarshalJSON(decimalBytes []byte) error { + if string(decimalBytes) == "null" { + d.Valid = false + return nil + } + d.Valid = true + return d.Decimal.UnmarshalJSON(decimalBytes) +} + +// MarshalJSON implements the json.Marshaler interface. +func (d NullDecimal) MarshalJSON() ([]byte, error) { + if !d.Valid { + return []byte("null"), nil + } + return d.Decimal.MarshalJSON() +} + +// Trig functions + +// Atan returns the arctangent, in radians, of x. +func (x Decimal) Atan() Decimal { + if x.Equal(NewFromFloat(0.0)) { + return x + } + if x.GreaterThan(NewFromFloat(0.0)) { + return x.satan() + } + return x.Neg().satan().Neg() +} + +func (d Decimal) xatan() Decimal { + P0 := NewFromFloat(-8.750608600031904122785e-01) + P1 := NewFromFloat(-1.615753718733365076637e+01) + P2 := NewFromFloat(-7.500855792314704667340e+01) + P3 := NewFromFloat(-1.228866684490136173410e+02) + P4 := NewFromFloat(-6.485021904942025371773e+01) + Q0 := NewFromFloat(2.485846490142306297962e+01) + Q1 := NewFromFloat(1.650270098316988542046e+02) + Q2 := NewFromFloat(4.328810604912902668951e+02) + Q3 := NewFromFloat(4.853903996359136964868e+02) + Q4 := NewFromFloat(1.945506571482613964425e+02) + z := d.Mul(d) + b1 := P0.Mul(z).Add(P1).Mul(z).Add(P2).Mul(z).Add(P3).Mul(z).Add(P4).Mul(z) + b2 := z.Add(Q0).Mul(z).Add(Q1).Mul(z).Add(Q2).Mul(z).Add(Q3).Mul(z).Add(Q4) + z = b1.Div(b2) + z = d.Mul(z).Add(d) + return z +} + +// satan reduces its argument (known to be positive) +// to the range [0, 0.66] and calls xatan. +func (d Decimal) satan() Decimal { + Morebits := NewFromFloat(6.123233995736765886130e-17) // pi/2 = PIO2 + Morebits + Tan3pio8 := NewFromFloat(2.41421356237309504880) // tan(3*pi/8) + pi := NewFromFloat(3.14159265358979323846264338327950288419716939937510582097494459) + + if d.LessThanOrEqual(NewFromFloat(0.66)) { + return d.xatan() + } + if d.GreaterThan(Tan3pio8) { + return pi.Div(NewFromFloat(2.0)).Sub(NewFromFloat(1.0).Div(d).xatan()).Add(Morebits) + } + return pi.Div(NewFromFloat(4.0)).Add((d.Sub(NewFromFloat(1.0)).Div(d.Add(NewFromFloat(1.0)))).xatan()).Add(NewFromFloat(0.5).Mul(Morebits)) +} + +// sin coefficients + var _sin = [...]Decimal{ + NewFromFloat(1.58962301576546568060E-10), // 0x3de5d8fd1fd19ccd + NewFromFloat(-2.50507477628578072866E-8), // 0xbe5ae5e5a9291f5d + NewFromFloat(2.75573136213857245213E-6), // 0x3ec71de3567d48a1 + NewFromFloat(-1.98412698295895385996E-4), // 0xbf2a01a019bfdf03 + NewFromFloat(8.33333333332211858878E-3), // 0x3f8111111110f7d0 + NewFromFloat(-1.66666666666666307295E-1), // 0xbfc5555555555548 + } + +// Sin returns the sine of the radian argument x. + func (d Decimal) Sin() Decimal { + PI4A := NewFromFloat(7.85398125648498535156E-1) // 0x3fe921fb40000000, Pi/4 split into three parts + PI4B := NewFromFloat(3.77489470793079817668E-8) // 0x3e64442d00000000, + PI4C := NewFromFloat(2.69515142907905952645E-15) // 0x3ce8469898cc5170, + M4PI := NewFromFloat(1.273239544735162542821171882678754627704620361328125) // 4/pi + + if d.Equal(NewFromFloat(0.0)) { + return d + } + // make argument positive but save the sign + sign := false + if d.LessThan(NewFromFloat(0.0)) { + d = d.Neg() + sign = true + } + + j := d.Mul(M4PI).IntPart() // integer part of x/(Pi/4), as integer for tests on the phase angle + y := NewFromFloat(float64(j)) // integer part of x/(Pi/4), as float + + // map zeros to origin + if j&1 == 1 { + j++ + y = y.Add(NewFromFloat(1.0)) + } + j &= 7 // octant modulo 2Pi radians (360 degrees) + // reflect in x axis + if j > 3 { + sign = !sign + j -= 4 + } + z := d.Sub(y.Mul(PI4A)).Sub(y.Mul(PI4B)).Sub(y.Mul(PI4C)) // Extended precision modular arithmetic + zz := z.Mul(z) + + if j == 1 || j == 2 { + w := zz.Mul(zz).Mul(_cos[0].Mul(zz).Add(_cos[1]).Mul(zz).Add(_cos[2]).Mul(zz).Add(_cos[3]).Mul(zz).Add(_cos[4]).Mul(zz).Add(_cos[5])) + y = NewFromFloat(1.0).Sub(NewFromFloat(0.5).Mul(zz)).Add(w) + } else { + y = z.Add(z.Mul(zz).Mul(_sin[0].Mul(zz).Add(_sin[1]).Mul(zz).Add(_sin[2]).Mul(zz).Add(_sin[3]).Mul(zz).Add(_sin[4]).Mul(zz).Add(_sin[5]))) + } + if sign { + y = y.Neg() + } + return y + } + + // cos coefficients + var _cos = [...]Decimal{ + NewFromFloat(-1.13585365213876817300E-11), // 0xbda8fa49a0861a9b + NewFromFloat(2.08757008419747316778E-9), // 0x3e21ee9d7b4e3f05 + NewFromFloat(-2.75573141792967388112E-7), // 0xbe927e4f7eac4bc6 + NewFromFloat(2.48015872888517045348E-5), // 0x3efa01a019c844f5 + NewFromFloat(-1.38888888888730564116E-3), // 0xbf56c16c16c14f91 + NewFromFloat(4.16666666666665929218E-2), // 0x3fa555555555554b + } + + // Cos returns the cosine of the radian argument x. + func (d Decimal) Cos() Decimal { + + PI4A := NewFromFloat(7.85398125648498535156E-1) // 0x3fe921fb40000000, Pi/4 split into three parts + PI4B := NewFromFloat(3.77489470793079817668E-8) // 0x3e64442d00000000, + PI4C := NewFromFloat(2.69515142907905952645E-15) // 0x3ce8469898cc5170, + M4PI := NewFromFloat(1.273239544735162542821171882678754627704620361328125) // 4/pi + + // make argument positive + sign := false + if d.LessThan(NewFromFloat(0.0)) { + d = d.Neg() + } + + j := d.Mul(M4PI).IntPart() // integer part of x/(Pi/4), as integer for tests on the phase angle + y := NewFromFloat(float64(j)) // integer part of x/(Pi/4), as float + + // map zeros to origin + if j&1 == 1 { + j++ + y = y.Add(NewFromFloat(1.0)) + } + j &= 7 // octant modulo 2Pi radians (360 degrees) + // reflect in x axis + if j > 3 { + sign = !sign + j -= 4 + } + if j > 1 { + sign = !sign + } + + z := d.Sub(y.Mul(PI4A)).Sub(y.Mul(PI4B)).Sub(y.Mul(PI4C)) // Extended precision modular arithmetic + zz := z.Mul(z) + + if j == 1 || j == 2 { + y = z.Add(z.Mul(zz).Mul(_sin[0].Mul(zz).Add(_sin[1]).Mul(zz).Add(_sin[2]).Mul(zz).Add(_sin[3]).Mul(zz).Add(_sin[4]).Mul(zz).Add(_sin[5]))) + } else { + w := zz.Mul(zz).Mul(_cos[0].Mul(zz).Add(_cos[1]).Mul(zz).Add(_cos[2]).Mul(zz).Add(_cos[3]).Mul(zz).Add(_cos[4]).Mul(zz).Add(_cos[5])) + y = NewFromFloat(1.0).Sub(NewFromFloat(0.5).Mul(zz)).Add(w) + } + if sign { + y = y.Neg() + } + return y + } + + var _tanP = [...]Decimal{ + NewFromFloat(-1.30936939181383777646E+4), // 0xc0c992d8d24f3f38 + NewFromFloat(1.15351664838587416140E+6), // 0x413199eca5fc9ddd + NewFromFloat(-1.79565251976484877988E+7), // 0xc1711fead3299176 + } + var _tanQ = [...]Decimal{ + NewFromFloat(1.00000000000000000000E+0), + NewFromFloat(1.36812963470692954678E+4), //0x40cab8a5eeb36572 + NewFromFloat(-1.32089234440210967447E+6), //0xc13427bc582abc96 + NewFromFloat(2.50083801823357915839E+7), //0x4177d98fc2ead8ef + NewFromFloat(-5.38695755929454629881E+7), //0xc189afe03cbe5a31 + } + + // Tan returns the tangent of the radian argument x. + func (d Decimal) Tan() Decimal { + + PI4A := NewFromFloat(7.85398125648498535156E-1) // 0x3fe921fb40000000, Pi/4 split into three parts + PI4B := NewFromFloat(3.77489470793079817668E-8) // 0x3e64442d00000000, + PI4C := NewFromFloat(2.69515142907905952645E-15) // 0x3ce8469898cc5170, + M4PI := NewFromFloat(1.273239544735162542821171882678754627704620361328125) // 4/pi + + if d.Equal(NewFromFloat(0.0)) { + return d + } + + // make argument positive but save the sign + sign := false + if d.LessThan(NewFromFloat(0.0)) { + d = d.Neg() + sign = true + } + + j := d.Mul(M4PI).IntPart() // integer part of x/(Pi/4), as integer for tests on the phase angle + y := NewFromFloat(float64(j)) // integer part of x/(Pi/4), as float + + // map zeros to origin + if j&1 == 1 { + j++ + y = y.Add(NewFromFloat(1.0)) + } + + z := d.Sub(y.Mul(PI4A)).Sub(y.Mul(PI4B)).Sub(y.Mul(PI4C)) // Extended precision modular arithmetic + zz := z.Mul(z) + + if zz.GreaterThan(NewFromFloat(1e-14)) { + w := zz.Mul(_tanP[0].Mul(zz).Add(_tanP[1]).Mul(zz).Add(_tanP[2])) + x := zz.Add(_tanQ[1]).Mul(zz).Add(_tanQ[2]).Mul(zz).Add(_tanQ[3]).Mul(zz).Add(_tanQ[4]) + y = z.Add(z.Mul(w.Div(x))) + } else { + y = z + } + if j&2 == 2 { + y = NewFromFloat(-1.0).Div(y) + } + if sign { + y = y.Neg() + } + return y + } diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/shopspring/decimal/rounding.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/shopspring/decimal/rounding.go new file mode 100644 index 00000000..fdd74eaa --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/shopspring/decimal/rounding.go @@ -0,0 +1,118 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Multiprecision decimal numbers. +// For floating-point formatting only; not general purpose. +// Only operations are assign and (binary) left/right shift. +// Can do binary floating point in multiprecision decimal precisely +// because 2 divides 10; cannot do decimal floating point +// in multiprecision binary precisely. +package decimal + +type floatInfo struct { + mantbits uint + expbits uint + bias int +} + +var float32info = floatInfo{23, 8, -127} +var float64info = floatInfo{52, 11, -1023} + +// roundShortest rounds d (= mant * 2^exp) to the shortest number of digits +// that will let the original floating point value be precisely reconstructed. +func roundShortest(d *decimal, mant uint64, exp int, flt *floatInfo) { + // If mantissa is zero, the number is zero; stop now. + if mant == 0 { + d.nd = 0 + return + } + + // Compute upper and lower such that any decimal number + // between upper and lower (possibly inclusive) + // will round to the original floating point number. + + // We may see at once that the number is already shortest. + // + // Suppose d is not denormal, so that 2^exp <= d < 10^dp. + // The closest shorter number is at least 10^(dp-nd) away. + // The lower/upper bounds computed below are at distance + // at most 2^(exp-mantbits). + // + // So the number is already shortest if 10^(dp-nd) > 2^(exp-mantbits), + // or equivalently log2(10)*(dp-nd) > exp-mantbits. + // It is true if 332/100*(dp-nd) >= exp-mantbits (log2(10) > 3.32). + minexp := flt.bias + 1 // minimum possible exponent + if exp > minexp && 332*(d.dp-d.nd) >= 100*(exp-int(flt.mantbits)) { + // The number is already shortest. + return + } + + // d = mant << (exp - mantbits) + // Next highest floating point number is mant+1 << exp-mantbits. + // Our upper bound is halfway between, mant*2+1 << exp-mantbits-1. + upper := new(decimal) + upper.Assign(mant*2 + 1) + upper.Shift(exp - int(flt.mantbits) - 1) + + // d = mant << (exp - mantbits) + // Next lowest floating point number is mant-1 << exp-mantbits, + // unless mant-1 drops the significant bit and exp is not the minimum exp, + // in which case the next lowest is mant*2-1 << exp-mantbits-1. + // Either way, call it mantlo << explo-mantbits. + // Our lower bound is halfway between, mantlo*2+1 << explo-mantbits-1. + var mantlo uint64 + var explo int + if mant > 1<. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +import ( + "fmt" + "os" +) + +var handlers = []func(){} + +func runHandler(handler func()) { + defer func() { + if err := recover(); err != nil { + fmt.Fprintln(os.Stderr, "Error: Logrus exit handler error:", err) + } + }() + + handler() +} + +func runHandlers() { + for _, handler := range handlers { + runHandler(handler) + } +} + +// Exit runs all the Logrus atexit handlers and then terminates the program using os.Exit(code) +func Exit(code int) { + runHandlers() + os.Exit(code) +} + +// RegisterExitHandler adds a Logrus Exit handler, call logrus.Exit to invoke +// all handlers. The handlers will also be invoked when any Fatal log entry is +// made. +// +// This method is useful when a caller wishes to use logrus to log a fatal +// message but also needs to gracefully shutdown. An example usecase could be +// closing database connections, or sending a alert that the application is +// closing. +func RegisterExitHandler(handler func()) { + handlers = append(handlers, handler) +} diff --git a/vendor/github.com/sirupsen/logrus/appveyor.yml b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sirupsen/logrus/appveyor.yml similarity index 100% rename from vendor/github.com/sirupsen/logrus/appveyor.yml rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sirupsen/logrus/appveyor.yml diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sirupsen/logrus/doc.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sirupsen/logrus/doc.go new file mode 100644 index 00000000..da67aba0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sirupsen/logrus/doc.go @@ -0,0 +1,26 @@ +/* +Package logrus is a structured logger for Go, completely API compatible with the standard library logger. + + +The simplest way to use Logrus is simply the package-level exported logger: + + package main + + import ( + log "github.com/sirupsen/logrus" + ) + + func main() { + log.WithFields(log.Fields{ + "animal": "walrus", + "number": 1, + "size": 10, + }).Info("A walrus appears") + } + +Output: + time="2015-09-07T08:48:33Z" level=info msg="A walrus appears" animal=walrus number=1 size=10 + +For a full guide visit https://github.com/sirupsen/logrus +*/ +package logrus diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sirupsen/logrus/entry.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sirupsen/logrus/entry.go new file mode 100644 index 00000000..ca634a60 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sirupsen/logrus/entry.go @@ -0,0 +1,312 @@ +package logrus + +import ( + "bytes" + "fmt" + "os" + "reflect" + "sync" + "time" +) + +var bufferPool *sync.Pool + +func init() { + bufferPool = &sync.Pool{ + New: func() interface{} { + return new(bytes.Buffer) + }, + } +} + +// Defines the key when adding errors using WithError. +var ErrorKey = "error" + +// An entry is the final or intermediate Logrus logging entry. It contains all +// the fields passed with WithField{,s}. It's finally logged when Debug, Info, +// Warn, Error, Fatal or Panic is called on it. These objects can be reused and +// passed around as much as you wish to avoid field duplication. +type Entry struct { + Logger *Logger + + // Contains all the fields set by the user. + Data Fields + + // Time at which the log entry was created + Time time.Time + + // Level the log entry was logged at: Debug, Info, Warn, Error, Fatal or Panic + // This field will be set on entry firing and the value will be equal to the one in Logger struct field. + Level Level + + // Message passed to Debug, Info, Warn, Error, Fatal or Panic + Message string + + // When formatter is called in entry.log(), a Buffer may be set to entry + Buffer *bytes.Buffer + + // err may contain a field formatting error + err string +} + +func NewEntry(logger *Logger) *Entry { + return &Entry{ + Logger: logger, + // Default is five fields, give a little extra room + Data: make(Fields, 5), + } +} + +// Returns the string representation from the reader and ultimately the +// formatter. +func (entry *Entry) String() (string, error) { + serialized, err := entry.Logger.Formatter.Format(entry) + if err != nil { + return "", err + } + str := string(serialized) + return str, nil +} + +// Add an error as single field (using the key defined in ErrorKey) to the Entry. +func (entry *Entry) WithError(err error) *Entry { + return entry.WithField(ErrorKey, err) +} + +// Add a single field to the Entry. +func (entry *Entry) WithField(key string, value interface{}) *Entry { + return entry.WithFields(Fields{key: value}) +} + +// Add a map of fields to the Entry. +func (entry *Entry) WithFields(fields Fields) *Entry { + data := make(Fields, len(entry.Data)+len(fields)) + for k, v := range entry.Data { + data[k] = v + } + var field_err string + for k, v := range fields { + if t := reflect.TypeOf(v); t != nil && t.Kind() == reflect.Func { + field_err = fmt.Sprintf("can not add field %q", k) + if entry.err != "" { + field_err = entry.err + ", " + field_err + } + } else { + data[k] = v + } + } + return &Entry{Logger: entry.Logger, Data: data, Time: entry.Time, err: field_err} +} + +// Overrides the time of the Entry. +func (entry *Entry) WithTime(t time.Time) *Entry { + return &Entry{Logger: entry.Logger, Data: entry.Data, Time: t} +} + +// This function is not declared with a pointer value because otherwise +// race conditions will occur when using multiple goroutines +func (entry Entry) log(level Level, msg string) { + var buffer *bytes.Buffer + + // Default to now, but allow users to override if they want. + // + // We don't have to worry about polluting future calls to Entry#log() + // with this assignment because this function is declared with a + // non-pointer receiver. + if entry.Time.IsZero() { + entry.Time = time.Now() + } + + entry.Level = level + entry.Message = msg + + entry.fireHooks() + + buffer = bufferPool.Get().(*bytes.Buffer) + buffer.Reset() + defer bufferPool.Put(buffer) + entry.Buffer = buffer + + entry.write() + + entry.Buffer = nil + + // To avoid Entry#log() returning a value that only would make sense for + // panic() to use in Entry#Panic(), we avoid the allocation by checking + // directly here. + if level <= PanicLevel { + panic(&entry) + } +} + +func (entry *Entry) fireHooks() { + entry.Logger.mu.Lock() + defer entry.Logger.mu.Unlock() + err := entry.Logger.Hooks.Fire(entry.Level, entry) + if err != nil { + fmt.Fprintf(os.Stderr, "Failed to fire hook: %v\n", err) + } +} + +func (entry *Entry) write() { + entry.Logger.mu.Lock() + defer entry.Logger.mu.Unlock() + serialized, err := entry.Logger.Formatter.Format(entry) + if err != nil { + fmt.Fprintf(os.Stderr, "Failed to obtain reader, %v\n", err) + } else { + _, err = entry.Logger.Out.Write(serialized) + if err != nil { + fmt.Fprintf(os.Stderr, "Failed to write to log, %v\n", err) + } + } +} + +func (entry *Entry) Debug(args ...interface{}) { + if entry.Logger.IsLevelEnabled(DebugLevel) { + entry.log(DebugLevel, fmt.Sprint(args...)) + } +} + +func (entry *Entry) Print(args ...interface{}) { + entry.Info(args...) +} + +func (entry *Entry) Info(args ...interface{}) { + if entry.Logger.IsLevelEnabled(InfoLevel) { + entry.log(InfoLevel, fmt.Sprint(args...)) + } +} + +func (entry *Entry) Warn(args ...interface{}) { + if entry.Logger.IsLevelEnabled(WarnLevel) { + entry.log(WarnLevel, fmt.Sprint(args...)) + } +} + +func (entry *Entry) Warning(args ...interface{}) { + entry.Warn(args...) +} + +func (entry *Entry) Error(args ...interface{}) { + if entry.Logger.IsLevelEnabled(ErrorLevel) { + entry.log(ErrorLevel, fmt.Sprint(args...)) + } +} + +func (entry *Entry) Fatal(args ...interface{}) { + if entry.Logger.IsLevelEnabled(FatalLevel) { + entry.log(FatalLevel, fmt.Sprint(args...)) + } + Exit(1) +} + +func (entry *Entry) Panic(args ...interface{}) { + if entry.Logger.IsLevelEnabled(PanicLevel) { + entry.log(PanicLevel, fmt.Sprint(args...)) + } + panic(fmt.Sprint(args...)) +} + +// Entry Printf family functions + +func (entry *Entry) Debugf(format string, args ...interface{}) { + if entry.Logger.IsLevelEnabled(DebugLevel) { + entry.Debug(fmt.Sprintf(format, args...)) + } +} + +func (entry *Entry) Infof(format string, args ...interface{}) { + if entry.Logger.IsLevelEnabled(InfoLevel) { + entry.Info(fmt.Sprintf(format, args...)) + } +} + +func (entry *Entry) Printf(format string, args ...interface{}) { + entry.Infof(format, args...) +} + +func (entry *Entry) Warnf(format string, args ...interface{}) { + if entry.Logger.IsLevelEnabled(WarnLevel) { + entry.Warn(fmt.Sprintf(format, args...)) + } +} + +func (entry *Entry) Warningf(format string, args ...interface{}) { + entry.Warnf(format, args...) +} + +func (entry *Entry) Errorf(format string, args ...interface{}) { + if entry.Logger.IsLevelEnabled(ErrorLevel) { + entry.Error(fmt.Sprintf(format, args...)) + } +} + +func (entry *Entry) Fatalf(format string, args ...interface{}) { + if entry.Logger.IsLevelEnabled(FatalLevel) { + entry.Fatal(fmt.Sprintf(format, args...)) + } + Exit(1) +} + +func (entry *Entry) Panicf(format string, args ...interface{}) { + if entry.Logger.IsLevelEnabled(PanicLevel) { + entry.Panic(fmt.Sprintf(format, args...)) + } +} + +// Entry Println family functions + +func (entry *Entry) Debugln(args ...interface{}) { + if entry.Logger.IsLevelEnabled(DebugLevel) { + entry.Debug(entry.sprintlnn(args...)) + } +} + +func (entry *Entry) Infoln(args ...interface{}) { + if entry.Logger.IsLevelEnabled(InfoLevel) { + entry.Info(entry.sprintlnn(args...)) + } +} + +func (entry *Entry) Println(args ...interface{}) { + entry.Infoln(args...) +} + +func (entry *Entry) Warnln(args ...interface{}) { + if entry.Logger.IsLevelEnabled(WarnLevel) { + entry.Warn(entry.sprintlnn(args...)) + } +} + +func (entry *Entry) Warningln(args ...interface{}) { + entry.Warnln(args...) +} + +func (entry *Entry) Errorln(args ...interface{}) { + if entry.Logger.IsLevelEnabled(ErrorLevel) { + entry.Error(entry.sprintlnn(args...)) + } +} + +func (entry *Entry) Fatalln(args ...interface{}) { + if entry.Logger.IsLevelEnabled(FatalLevel) { + entry.Fatal(entry.sprintlnn(args...)) + } + Exit(1) +} + +func (entry *Entry) Panicln(args ...interface{}) { + if entry.Logger.IsLevelEnabled(PanicLevel) { + entry.Panic(entry.sprintlnn(args...)) + } +} + +// Sprintlnn => Sprint no newline. This is to get the behavior of how +// fmt.Sprintln where spaces are always added between operands, regardless of +// their type. Instead of vendoring the Sprintln implementation to spare a +// string allocation, we do the simplest thing. +func (entry *Entry) sprintlnn(args ...interface{}) string { + msg := fmt.Sprintln(args...) + return msg[:len(msg)-1] +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sirupsen/logrus/exported.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sirupsen/logrus/exported.go new file mode 100644 index 00000000..fb2a7a1f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sirupsen/logrus/exported.go @@ -0,0 +1,198 @@ +package logrus + +import ( + "io" + "time" +) + +var ( + // std is the name of the standard logger in stdlib `log` + std = New() +) + +func StandardLogger() *Logger { + return std +} + +// SetOutput sets the standard logger output. +func SetOutput(out io.Writer) { + std.SetOutput(out) +} + +// SetFormatter sets the standard logger formatter. +func SetFormatter(formatter Formatter) { + std.SetFormatter(formatter) +} + +// SetLevel sets the standard logger level. +func SetLevel(level Level) { + std.SetLevel(level) +} + +// GetLevel returns the standard logger level. +func GetLevel() Level { + return std.GetLevel() +} + +// IsLevelEnabled checks if the log level of the standard logger is greater than the level param +func IsLevelEnabled(level Level) bool { + return std.IsLevelEnabled(level) +} + +// AddHook adds a hook to the standard logger hooks. +func AddHook(hook Hook) { + std.AddHook(hook) +} + +// WithError creates an entry from the standard logger and adds an error to it, using the value defined in ErrorKey as key. +func WithError(err error) *Entry { + return std.WithField(ErrorKey, err) +} + +// WithField creates an entry from the standard logger and adds a field to +// it. If you want multiple fields, use `WithFields`. +// +// Note that it doesn't log until you call Debug, Print, Info, Warn, Fatal +// or Panic on the Entry it returns. +func WithField(key string, value interface{}) *Entry { + return std.WithField(key, value) +} + +// WithFields creates an entry from the standard logger and adds multiple +// fields to it. This is simply a helper for `WithField`, invoking it +// once for each field. +// +// Note that it doesn't log until you call Debug, Print, Info, Warn, Fatal +// or Panic on the Entry it returns. +func WithFields(fields Fields) *Entry { + return std.WithFields(fields) +} + +// WithTime creats an entry from the standard logger and overrides the time of +// logs generated with it. +// +// Note that it doesn't log until you call Debug, Print, Info, Warn, Fatal +// or Panic on the Entry it returns. +func WithTime(t time.Time) *Entry { + return std.WithTime(t) +} + +// Debug logs a message at level Debug on the standard logger. +func Debug(args ...interface{}) { + std.Debug(args...) +} + +// Print logs a message at level Info on the standard logger. +func Print(args ...interface{}) { + std.Print(args...) +} + +// Info logs a message at level Info on the standard logger. +func Info(args ...interface{}) { + std.Info(args...) +} + +// Warn logs a message at level Warn on the standard logger. +func Warn(args ...interface{}) { + std.Warn(args...) +} + +// Warning logs a message at level Warn on the standard logger. +func Warning(args ...interface{}) { + std.Warning(args...) +} + +// Error logs a message at level Error on the standard logger. +func Error(args ...interface{}) { + std.Error(args...) +} + +// Panic logs a message at level Panic on the standard logger. +func Panic(args ...interface{}) { + std.Panic(args...) +} + +// Fatal logs a message at level Fatal on the standard logger then the process will exit with status set to 1. +func Fatal(args ...interface{}) { + std.Fatal(args...) +} + +// Debugf logs a message at level Debug on the standard logger. +func Debugf(format string, args ...interface{}) { + std.Debugf(format, args...) +} + +// Printf logs a message at level Info on the standard logger. +func Printf(format string, args ...interface{}) { + std.Printf(format, args...) +} + +// Infof logs a message at level Info on the standard logger. +func Infof(format string, args ...interface{}) { + std.Infof(format, args...) +} + +// Warnf logs a message at level Warn on the standard logger. +func Warnf(format string, args ...interface{}) { + std.Warnf(format, args...) +} + +// Warningf logs a message at level Warn on the standard logger. +func Warningf(format string, args ...interface{}) { + std.Warningf(format, args...) +} + +// Errorf logs a message at level Error on the standard logger. +func Errorf(format string, args ...interface{}) { + std.Errorf(format, args...) +} + +// Panicf logs a message at level Panic on the standard logger. +func Panicf(format string, args ...interface{}) { + std.Panicf(format, args...) +} + +// Fatalf logs a message at level Fatal on the standard logger then the process will exit with status set to 1. +func Fatalf(format string, args ...interface{}) { + std.Fatalf(format, args...) +} + +// Debugln logs a message at level Debug on the standard logger. +func Debugln(args ...interface{}) { + std.Debugln(args...) +} + +// Println logs a message at level Info on the standard logger. +func Println(args ...interface{}) { + std.Println(args...) +} + +// Infoln logs a message at level Info on the standard logger. +func Infoln(args ...interface{}) { + std.Infoln(args...) +} + +// Warnln logs a message at level Warn on the standard logger. +func Warnln(args ...interface{}) { + std.Warnln(args...) +} + +// Warningln logs a message at level Warn on the standard logger. +func Warningln(args ...interface{}) { + std.Warningln(args...) +} + +// Errorln logs a message at level Error on the standard logger. +func Errorln(args ...interface{}) { + std.Errorln(args...) +} + +// Panicln logs a message at level Panic on the standard logger. +func Panicln(args ...interface{}) { + std.Panicln(args...) +} + +// Fatalln logs a message at level Fatal on the standard logger then the process will exit with status set to 1. +func Fatalln(args ...interface{}) { + std.Fatalln(args...) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sirupsen/logrus/formatter.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sirupsen/logrus/formatter.go new file mode 100644 index 00000000..be2f3fce --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sirupsen/logrus/formatter.go @@ -0,0 +1,64 @@ +package logrus + +import "time" + +// Default key names for the default fields +const ( + defaultTimestampFormat = time.RFC3339 + FieldKeyMsg = "msg" + FieldKeyLevel = "level" + FieldKeyTime = "time" + FieldKeyLogrusError = "logrus_error" +) + +// The Formatter interface is used to implement a custom Formatter. It takes an +// `Entry`. It exposes all the fields, including the default ones: +// +// * `entry.Data["msg"]`. The message passed from Info, Warn, Error .. +// * `entry.Data["time"]`. The timestamp. +// * `entry.Data["level"]. The level the entry was logged at. +// +// Any additional fields added with `WithField` or `WithFields` are also in +// `entry.Data`. Format is expected to return an array of bytes which are then +// logged to `logger.Out`. +type Formatter interface { + Format(*Entry) ([]byte, error) +} + +// This is to not silently overwrite `time`, `msg` and `level` fields when +// dumping it. If this code wasn't there doing: +// +// logrus.WithField("level", 1).Info("hello") +// +// Would just silently drop the user provided level. Instead with this code +// it'll logged as: +// +// {"level": "info", "fields.level": 1, "msg": "hello", "time": "..."} +// +// It's not exported because it's still using Data in an opinionated way. It's to +// avoid code duplication between the two default formatters. +func prefixFieldClashes(data Fields, fieldMap FieldMap) { + timeKey := fieldMap.resolve(FieldKeyTime) + if t, ok := data[timeKey]; ok { + data["fields."+timeKey] = t + delete(data, timeKey) + } + + msgKey := fieldMap.resolve(FieldKeyMsg) + if m, ok := data[msgKey]; ok { + data["fields."+msgKey] = m + delete(data, msgKey) + } + + levelKey := fieldMap.resolve(FieldKeyLevel) + if l, ok := data[levelKey]; ok { + data["fields."+levelKey] = l + delete(data, levelKey) + } + + logrusErrKey := fieldMap.resolve(FieldKeyLogrusError) + if l, ok := data[logrusErrKey]; ok { + data["fields."+logrusErrKey] = l + delete(data, logrusErrKey) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sirupsen/logrus/go.mod b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sirupsen/logrus/go.mod new file mode 100644 index 00000000..f4fed02f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sirupsen/logrus/go.mod @@ -0,0 +1,10 @@ +module github.com/sirupsen/logrus + +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/konsorten/go-windows-terminal-sequences v0.0.0-20180402223658-b729f2633dfe + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/stretchr/testify v1.2.2 + golang.org/x/crypto v0.0.0-20180904163835-0709b304e793 + golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33 +) diff --git a/vendor/github.com/sirupsen/logrus/go.sum b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sirupsen/logrus/go.sum similarity index 62% rename from vendor/github.com/sirupsen/logrus/go.sum rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sirupsen/logrus/go.sum index 596c318b..1f0d7196 100644 --- a/vendor/github.com/sirupsen/logrus/go.sum +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sirupsen/logrus/go.sum @@ -2,15 +2,11 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/konsorten/go-windows-terminal-sequences v0.0.0-20180402223658-b729f2633dfe h1:CHRGQ8V7OlCYtwaKPJi3iA7J+YdNKdo8j7nG5IgDhjs= github.com/konsorten/go-windows-terminal-sequences v0.0.0-20180402223658-b729f2633dfe/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793 h1:u+LnwYTOOW7Ukr/fppxEb1Nwz0AtPflrblfvUudpo+I= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33 h1:I6FyU15t786LL7oL/hn43zqTuEGr4PN7F4XJ1p4E3Y8= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894 h1:Cz4ceDQGXuKRnVBDTS23GTn/pU5OE2C0WrNTOYK1Uuc= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sirupsen/logrus/hooks.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sirupsen/logrus/hooks.go new file mode 100644 index 00000000..3f151cdc --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sirupsen/logrus/hooks.go @@ -0,0 +1,34 @@ +package logrus + +// A hook to be fired when logging on the logging levels returned from +// `Levels()` on your implementation of the interface. Note that this is not +// fired in a goroutine or a channel with workers, you should handle such +// functionality yourself if your call is non-blocking and you don't wish for +// the logging calls for levels returned from `Levels()` to block. +type Hook interface { + Levels() []Level + Fire(*Entry) error +} + +// Internal type for storing the hooks on a logger instance. +type LevelHooks map[Level][]Hook + +// Add a hook to an instance of logger. This is called with +// `log.Hooks.Add(new(MyHook))` where `MyHook` implements the `Hook` interface. +func (hooks LevelHooks) Add(hook Hook) { + for _, level := range hook.Levels() { + hooks[level] = append(hooks[level], hook) + } +} + +// Fire all the hooks for the passed level. Used by `entry.log` to fire +// appropriate hooks for a log entry. +func (hooks LevelHooks) Fire(level Level, entry *Entry) error { + for _, hook := range hooks[level] { + if err := hook.Fire(entry); err != nil { + return err + } + } + + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sirupsen/logrus/json_formatter.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sirupsen/logrus/json_formatter.go new file mode 100644 index 00000000..ef8d0746 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sirupsen/logrus/json_formatter.go @@ -0,0 +1,100 @@ +package logrus + +import ( + "bytes" + "encoding/json" + "fmt" +) + +type fieldKey string + +// FieldMap allows customization of the key names for default fields. +type FieldMap map[fieldKey]string + +func (f FieldMap) resolve(key fieldKey) string { + if k, ok := f[key]; ok { + return k + } + + return string(key) +} + +// JSONFormatter formats logs into parsable json +type JSONFormatter struct { + // TimestampFormat sets the format used for marshaling timestamps. + TimestampFormat string + + // DisableTimestamp allows disabling automatic timestamps in output + DisableTimestamp bool + + // DataKey allows users to put all the log entry parameters into a nested dictionary at a given key. + DataKey string + + // FieldMap allows users to customize the names of keys for default fields. + // As an example: + // formatter := &JSONFormatter{ + // FieldMap: FieldMap{ + // FieldKeyTime: "@timestamp", + // FieldKeyLevel: "@level", + // FieldKeyMsg: "@message", + // }, + // } + FieldMap FieldMap + + // PrettyPrint will indent all json logs + PrettyPrint bool +} + +// Format renders a single log entry +func (f *JSONFormatter) Format(entry *Entry) ([]byte, error) { + data := make(Fields, len(entry.Data)+3) + for k, v := range entry.Data { + switch v := v.(type) { + case error: + // Otherwise errors are ignored by `encoding/json` + // https://github.com/sirupsen/logrus/issues/137 + data[k] = v.Error() + default: + data[k] = v + } + } + + if f.DataKey != "" { + newData := make(Fields, 4) + newData[f.DataKey] = data + data = newData + } + + prefixFieldClashes(data, f.FieldMap) + + timestampFormat := f.TimestampFormat + if timestampFormat == "" { + timestampFormat = defaultTimestampFormat + } + + if entry.err != "" { + data[f.FieldMap.resolve(FieldKeyLogrusError)] = entry.err + } + if !f.DisableTimestamp { + data[f.FieldMap.resolve(FieldKeyTime)] = entry.Time.Format(timestampFormat) + } + data[f.FieldMap.resolve(FieldKeyMsg)] = entry.Message + data[f.FieldMap.resolve(FieldKeyLevel)] = entry.Level.String() + + var b *bytes.Buffer + if entry.Buffer != nil { + b = entry.Buffer + } else { + b = &bytes.Buffer{} + } + + encoder := json.NewEncoder(b) + if f.PrettyPrint { + encoder.SetIndent("", " ") + } + if err := encoder.Encode(data); err != nil { + return nil, fmt.Errorf("Failed to marshal fields to JSON, %v", err) + } + + return b.Bytes(), nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sirupsen/logrus/logger.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sirupsen/logrus/logger.go new file mode 100644 index 00000000..b67bfcbd --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sirupsen/logrus/logger.go @@ -0,0 +1,367 @@ +package logrus + +import ( + "io" + "os" + "sync" + "sync/atomic" + "time" +) + +type Logger struct { + // The logs are `io.Copy`'d to this in a mutex. It's common to set this to a + // file, or leave it default which is `os.Stderr`. You can also set this to + // something more adventurous, such as logging to Kafka. + Out io.Writer + // Hooks for the logger instance. These allow firing events based on logging + // levels and log entries. For example, to send errors to an error tracking + // service, log to StatsD or dump the core on fatal errors. + Hooks LevelHooks + // All log entries pass through the formatter before logged to Out. The + // included formatters are `TextFormatter` and `JSONFormatter` for which + // TextFormatter is the default. In development (when a TTY is attached) it + // logs with colors, but to a file it wouldn't. You can easily implement your + // own that implements the `Formatter` interface, see the `README` or included + // formatters for examples. + Formatter Formatter + // The logging level the logger should log at. This is typically (and defaults + // to) `logrus.Info`, which allows Info(), Warn(), Error() and Fatal() to be + // logged. + Level Level + // Used to sync writing to the log. Locking is enabled by Default + mu MutexWrap + // Reusable empty entry + entryPool sync.Pool +} + +type MutexWrap struct { + lock sync.Mutex + disabled bool +} + +func (mw *MutexWrap) Lock() { + if !mw.disabled { + mw.lock.Lock() + } +} + +func (mw *MutexWrap) Unlock() { + if !mw.disabled { + mw.lock.Unlock() + } +} + +func (mw *MutexWrap) Disable() { + mw.disabled = true +} + +// Creates a new logger. Configuration should be set by changing `Formatter`, +// `Out` and `Hooks` directly on the default logger instance. You can also just +// instantiate your own: +// +// var log = &Logger{ +// Out: os.Stderr, +// Formatter: new(JSONFormatter), +// Hooks: make(LevelHooks), +// Level: logrus.DebugLevel, +// } +// +// It's recommended to make this a global instance called `log`. +func New() *Logger { + return &Logger{ + Out: os.Stderr, + Formatter: new(TextFormatter), + Hooks: make(LevelHooks), + Level: InfoLevel, + } +} + +func (logger *Logger) newEntry() *Entry { + entry, ok := logger.entryPool.Get().(*Entry) + if ok { + return entry + } + return NewEntry(logger) +} + +func (logger *Logger) releaseEntry(entry *Entry) { + entry.Data = map[string]interface{}{} + logger.entryPool.Put(entry) +} + +// Adds a field to the log entry, note that it doesn't log until you call +// Debug, Print, Info, Warn, Error, Fatal or Panic. It only creates a log entry. +// If you want multiple fields, use `WithFields`. +func (logger *Logger) WithField(key string, value interface{}) *Entry { + entry := logger.newEntry() + defer logger.releaseEntry(entry) + return entry.WithField(key, value) +} + +// Adds a struct of fields to the log entry. All it does is call `WithField` for +// each `Field`. +func (logger *Logger) WithFields(fields Fields) *Entry { + entry := logger.newEntry() + defer logger.releaseEntry(entry) + return entry.WithFields(fields) +} + +// Add an error as single field to the log entry. All it does is call +// `WithError` for the given `error`. +func (logger *Logger) WithError(err error) *Entry { + entry := logger.newEntry() + defer logger.releaseEntry(entry) + return entry.WithError(err) +} + +// Overrides the time of the log entry. +func (logger *Logger) WithTime(t time.Time) *Entry { + entry := logger.newEntry() + defer logger.releaseEntry(entry) + return entry.WithTime(t) +} + +func (logger *Logger) Debugf(format string, args ...interface{}) { + if logger.IsLevelEnabled(DebugLevel) { + entry := logger.newEntry() + entry.Debugf(format, args...) + logger.releaseEntry(entry) + } +} + +func (logger *Logger) Infof(format string, args ...interface{}) { + if logger.IsLevelEnabled(InfoLevel) { + entry := logger.newEntry() + entry.Infof(format, args...) + logger.releaseEntry(entry) + } +} + +func (logger *Logger) Printf(format string, args ...interface{}) { + entry := logger.newEntry() + entry.Printf(format, args...) + logger.releaseEntry(entry) +} + +func (logger *Logger) Warnf(format string, args ...interface{}) { + if logger.IsLevelEnabled(WarnLevel) { + entry := logger.newEntry() + entry.Warnf(format, args...) + logger.releaseEntry(entry) + } +} + +func (logger *Logger) Warningf(format string, args ...interface{}) { + if logger.IsLevelEnabled(WarnLevel) { + entry := logger.newEntry() + entry.Warnf(format, args...) + logger.releaseEntry(entry) + } +} + +func (logger *Logger) Errorf(format string, args ...interface{}) { + if logger.IsLevelEnabled(ErrorLevel) { + entry := logger.newEntry() + entry.Errorf(format, args...) + logger.releaseEntry(entry) + } +} + +func (logger *Logger) Fatalf(format string, args ...interface{}) { + if logger.IsLevelEnabled(FatalLevel) { + entry := logger.newEntry() + entry.Fatalf(format, args...) + logger.releaseEntry(entry) + } + Exit(1) +} + +func (logger *Logger) Panicf(format string, args ...interface{}) { + if logger.IsLevelEnabled(PanicLevel) { + entry := logger.newEntry() + entry.Panicf(format, args...) + logger.releaseEntry(entry) + } +} + +func (logger *Logger) Debug(args ...interface{}) { + if logger.IsLevelEnabled(DebugLevel) { + entry := logger.newEntry() + entry.Debug(args...) + logger.releaseEntry(entry) + } +} + +func (logger *Logger) Info(args ...interface{}) { + if logger.IsLevelEnabled(InfoLevel) { + entry := logger.newEntry() + entry.Info(args...) + logger.releaseEntry(entry) + } +} + +func (logger *Logger) Print(args ...interface{}) { + entry := logger.newEntry() + entry.Info(args...) + logger.releaseEntry(entry) +} + +func (logger *Logger) Warn(args ...interface{}) { + if logger.IsLevelEnabled(WarnLevel) { + entry := logger.newEntry() + entry.Warn(args...) + logger.releaseEntry(entry) + } +} + +func (logger *Logger) Warning(args ...interface{}) { + if logger.IsLevelEnabled(WarnLevel) { + entry := logger.newEntry() + entry.Warn(args...) + logger.releaseEntry(entry) + } +} + +func (logger *Logger) Error(args ...interface{}) { + if logger.IsLevelEnabled(ErrorLevel) { + entry := logger.newEntry() + entry.Error(args...) + logger.releaseEntry(entry) + } +} + +func (logger *Logger) Fatal(args ...interface{}) { + if logger.IsLevelEnabled(FatalLevel) { + entry := logger.newEntry() + entry.Fatal(args...) + logger.releaseEntry(entry) + } + Exit(1) +} + +func (logger *Logger) Panic(args ...interface{}) { + if logger.IsLevelEnabled(PanicLevel) { + entry := logger.newEntry() + entry.Panic(args...) + logger.releaseEntry(entry) + } +} + +func (logger *Logger) Debugln(args ...interface{}) { + if logger.IsLevelEnabled(DebugLevel) { + entry := logger.newEntry() + entry.Debugln(args...) + logger.releaseEntry(entry) + } +} + +func (logger *Logger) Infoln(args ...interface{}) { + if logger.IsLevelEnabled(InfoLevel) { + entry := logger.newEntry() + entry.Infoln(args...) + logger.releaseEntry(entry) + } +} + +func (logger *Logger) Println(args ...interface{}) { + entry := logger.newEntry() + entry.Println(args...) + logger.releaseEntry(entry) +} + +func (logger *Logger) Warnln(args ...interface{}) { + if logger.IsLevelEnabled(WarnLevel) { + entry := logger.newEntry() + entry.Warnln(args...) + logger.releaseEntry(entry) + } +} + +func (logger *Logger) Warningln(args ...interface{}) { + if logger.IsLevelEnabled(WarnLevel) { + entry := logger.newEntry() + entry.Warnln(args...) + logger.releaseEntry(entry) + } +} + +func (logger *Logger) Errorln(args ...interface{}) { + if logger.IsLevelEnabled(ErrorLevel) { + entry := logger.newEntry() + entry.Errorln(args...) + logger.releaseEntry(entry) + } +} + +func (logger *Logger) Fatalln(args ...interface{}) { + if logger.IsLevelEnabled(FatalLevel) { + entry := logger.newEntry() + entry.Fatalln(args...) + logger.releaseEntry(entry) + } + Exit(1) +} + +func (logger *Logger) Panicln(args ...interface{}) { + if logger.IsLevelEnabled(PanicLevel) { + entry := logger.newEntry() + entry.Panicln(args...) + logger.releaseEntry(entry) + } +} + +//When file is opened with appending mode, it's safe to +//write concurrently to a file (within 4k message on Linux). +//In these cases user can choose to disable the lock. +func (logger *Logger) SetNoLock() { + logger.mu.Disable() +} + +func (logger *Logger) level() Level { + return Level(atomic.LoadUint32((*uint32)(&logger.Level))) +} + +// SetLevel sets the logger level. +func (logger *Logger) SetLevel(level Level) { + atomic.StoreUint32((*uint32)(&logger.Level), uint32(level)) +} + +// GetLevel returns the logger level. +func (logger *Logger) GetLevel() Level { + return logger.level() +} + +// AddHook adds a hook to the logger hooks. +func (logger *Logger) AddHook(hook Hook) { + logger.mu.Lock() + defer logger.mu.Unlock() + logger.Hooks.Add(hook) +} + +// IsLevelEnabled checks if the log level of the logger is greater than the level param +func (logger *Logger) IsLevelEnabled(level Level) bool { + return logger.level() >= level +} + +// SetFormatter sets the logger formatter. +func (logger *Logger) SetFormatter(formatter Formatter) { + logger.mu.Lock() + defer logger.mu.Unlock() + logger.Formatter = formatter +} + +// SetOutput sets the logger output. +func (logger *Logger) SetOutput(output io.Writer) { + logger.mu.Lock() + defer logger.mu.Unlock() + logger.Out = output +} + +// ReplaceHooks replaces the logger hooks and returns the old ones +func (logger *Logger) ReplaceHooks(hooks LevelHooks) LevelHooks { + logger.mu.Lock() + oldHooks := logger.Hooks + logger.Hooks = hooks + logger.mu.Unlock() + return oldHooks +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sirupsen/logrus/logrus.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sirupsen/logrus/logrus.go new file mode 100644 index 00000000..fa0b9dea --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sirupsen/logrus/logrus.go @@ -0,0 +1,150 @@ +package logrus + +import ( + "fmt" + "log" + "strings" +) + +// Fields type, used to pass to `WithFields`. +type Fields map[string]interface{} + +// Level type +type Level uint32 + +// Convert the Level to a string. E.g. PanicLevel becomes "panic". +func (level Level) String() string { + switch level { + case DebugLevel: + return "debug" + case InfoLevel: + return "info" + case WarnLevel: + return "warning" + case ErrorLevel: + return "error" + case FatalLevel: + return "fatal" + case PanicLevel: + return "panic" + } + + return "unknown" +} + +// ParseLevel takes a string level and returns the Logrus log level constant. +func ParseLevel(lvl string) (Level, error) { + switch strings.ToLower(lvl) { + case "panic": + return PanicLevel, nil + case "fatal": + return FatalLevel, nil + case "error": + return ErrorLevel, nil + case "warn", "warning": + return WarnLevel, nil + case "info": + return InfoLevel, nil + case "debug": + return DebugLevel, nil + } + + var l Level + return l, fmt.Errorf("not a valid logrus Level: %q", lvl) +} + +// A constant exposing all logging levels +var AllLevels = []Level{ + PanicLevel, + FatalLevel, + ErrorLevel, + WarnLevel, + InfoLevel, + DebugLevel, +} + +// These are the different logging levels. You can set the logging level to log +// on your instance of logger, obtained with `logrus.New()`. +const ( + // PanicLevel level, highest level of severity. Logs and then calls panic with the + // message passed to Debug, Info, ... + PanicLevel Level = iota + // FatalLevel level. Logs and then calls `os.Exit(1)`. It will exit even if the + // logging level is set to Panic. + FatalLevel + // ErrorLevel level. Logs. Used for errors that should definitely be noted. + // Commonly used for hooks to send errors to an error tracking service. + ErrorLevel + // WarnLevel level. Non-critical entries that deserve eyes. + WarnLevel + // InfoLevel level. General operational entries about what's going on inside the + // application. + InfoLevel + // DebugLevel level. Usually only enabled when debugging. Very verbose logging. + DebugLevel +) + +// Won't compile if StdLogger can't be realized by a log.Logger +var ( + _ StdLogger = &log.Logger{} + _ StdLogger = &Entry{} + _ StdLogger = &Logger{} +) + +// StdLogger is what your logrus-enabled library should take, that way +// it'll accept a stdlib logger and a logrus logger. There's no standard +// interface, this is the closest we get, unfortunately. +type StdLogger interface { + Print(...interface{}) + Printf(string, ...interface{}) + Println(...interface{}) + + Fatal(...interface{}) + Fatalf(string, ...interface{}) + Fatalln(...interface{}) + + Panic(...interface{}) + Panicf(string, ...interface{}) + Panicln(...interface{}) +} + +// The FieldLogger interface generalizes the Entry and Logger types +type FieldLogger interface { + WithField(key string, value interface{}) *Entry + WithFields(fields Fields) *Entry + WithError(err error) *Entry + + Debugf(format string, args ...interface{}) + Infof(format string, args ...interface{}) + Printf(format string, args ...interface{}) + Warnf(format string, args ...interface{}) + Warningf(format string, args ...interface{}) + Errorf(format string, args ...interface{}) + Fatalf(format string, args ...interface{}) + Panicf(format string, args ...interface{}) + + Debug(args ...interface{}) + Info(args ...interface{}) + Print(args ...interface{}) + Warn(args ...interface{}) + Warning(args ...interface{}) + Error(args ...interface{}) + Fatal(args ...interface{}) + Panic(args ...interface{}) + + Debugln(args ...interface{}) + Infoln(args ...interface{}) + Println(args ...interface{}) + Warnln(args ...interface{}) + Warningln(args ...interface{}) + Errorln(args ...interface{}) + Fatalln(args ...interface{}) + Panicln(args ...interface{}) + + // IsDebugEnabled() bool + // IsInfoEnabled() bool + // IsWarnEnabled() bool + // IsErrorEnabled() bool + // IsFatalEnabled() bool + // IsPanicEnabled() bool +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sirupsen/logrus/terminal_check_appengine.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sirupsen/logrus/terminal_check_appengine.go new file mode 100644 index 00000000..2403de98 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sirupsen/logrus/terminal_check_appengine.go @@ -0,0 +1,11 @@ +// +build appengine + +package logrus + +import ( + "io" +) + +func checkIfTerminal(w io.Writer) bool { + return true +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sirupsen/logrus/terminal_check_js.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sirupsen/logrus/terminal_check_js.go new file mode 100644 index 00000000..0c209750 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sirupsen/logrus/terminal_check_js.go @@ -0,0 +1,11 @@ +// +build js + +package logrus + +import ( + "io" +) + +func checkIfTerminal(w io.Writer) bool { + return false +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sirupsen/logrus/terminal_check_notappengine.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sirupsen/logrus/terminal_check_notappengine.go new file mode 100644 index 00000000..cf309d6f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sirupsen/logrus/terminal_check_notappengine.go @@ -0,0 +1,19 @@ +// +build !appengine,!js,!windows + +package logrus + +import ( + "io" + "os" + + "golang.org/x/crypto/ssh/terminal" +) + +func checkIfTerminal(w io.Writer) bool { + switch v := w.(type) { + case *os.File: + return terminal.IsTerminal(int(v.Fd())) + default: + return false + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sirupsen/logrus/terminal_check_windows.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sirupsen/logrus/terminal_check_windows.go new file mode 100644 index 00000000..3b9d2864 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sirupsen/logrus/terminal_check_windows.go @@ -0,0 +1,20 @@ +// +build !appengine,!js,windows + +package logrus + +import ( + "io" + "os" + "syscall" +) + +func checkIfTerminal(w io.Writer) bool { + switch v := w.(type) { + case *os.File: + var mode uint32 + err := syscall.GetConsoleMode(syscall.Handle(v.Fd()), &mode) + return err == nil + default: + return false + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sirupsen/logrus/terminal_notwindows.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sirupsen/logrus/terminal_notwindows.go new file mode 100644 index 00000000..3dbd2372 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sirupsen/logrus/terminal_notwindows.go @@ -0,0 +1,8 @@ +// +build !windows + +package logrus + +import "io" + +func initTerminal(w io.Writer) { +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sirupsen/logrus/terminal_windows.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sirupsen/logrus/terminal_windows.go new file mode 100644 index 00000000..b4ef5286 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sirupsen/logrus/terminal_windows.go @@ -0,0 +1,18 @@ +// +build !appengine,!js,windows + +package logrus + +import ( + "io" + "os" + "syscall" + + sequences "github.com/konsorten/go-windows-terminal-sequences" +) + +func initTerminal(w io.Writer) { + switch v := w.(type) { + case *os.File: + sequences.EnableVirtualTerminalProcessing(syscall.Handle(v.Fd()), true) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sirupsen/logrus/text_formatter.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sirupsen/logrus/text_formatter.go new file mode 100644 index 00000000..d4663b8c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sirupsen/logrus/text_formatter.go @@ -0,0 +1,254 @@ +package logrus + +import ( + "bytes" + "fmt" + "os" + "sort" + "strings" + "sync" + "time" +) + +const ( + nocolor = 0 + red = 31 + green = 32 + yellow = 33 + blue = 36 + gray = 37 +) + +var ( + baseTimestamp time.Time + emptyFieldMap FieldMap +) + +func init() { + baseTimestamp = time.Now() +} + +// TextFormatter formats logs into text +type TextFormatter struct { + // Set to true to bypass checking for a TTY before outputting colors. + ForceColors bool + + // Force disabling colors. + DisableColors bool + + // Override coloring based on CLICOLOR and CLICOLOR_FORCE. - https://bixense.com/clicolors/ + EnvironmentOverrideColors bool + + // Disable timestamp logging. useful when output is redirected to logging + // system that already adds timestamps. + DisableTimestamp bool + + // Enable logging the full timestamp when a TTY is attached instead of just + // the time passed since beginning of execution. + FullTimestamp bool + + // TimestampFormat to use for display when a full timestamp is printed + TimestampFormat string + + // The fields are sorted by default for a consistent output. For applications + // that log extremely frequently and don't use the JSON formatter this may not + // be desired. + DisableSorting bool + + // The keys sorting function, when uninitialized it uses sort.Strings. + SortingFunc func([]string) + + // Disables the truncation of the level text to 4 characters. + DisableLevelTruncation bool + + // QuoteEmptyFields will wrap empty fields in quotes if true + QuoteEmptyFields bool + + // Whether the logger's out is to a terminal + isTerminal bool + + // FieldMap allows users to customize the names of keys for default fields. + // As an example: + // formatter := &TextFormatter{ + // FieldMap: FieldMap{ + // FieldKeyTime: "@timestamp", + // FieldKeyLevel: "@level", + // FieldKeyMsg: "@message"}} + FieldMap FieldMap + + terminalInitOnce sync.Once +} + +func (f *TextFormatter) init(entry *Entry) { + if entry.Logger != nil { + f.isTerminal = checkIfTerminal(entry.Logger.Out) + + if f.isTerminal { + initTerminal(entry.Logger.Out) + } + } +} + +func (f *TextFormatter) isColored() bool { + isColored := f.ForceColors || f.isTerminal + + if f.EnvironmentOverrideColors { + if force, ok := os.LookupEnv("CLICOLOR_FORCE"); ok && force != "0" { + isColored = true + } else if ok && force == "0" { + isColored = false + } else if os.Getenv("CLICOLOR") == "0" { + isColored = false + } + } + + return isColored && !f.DisableColors +} + +// Format renders a single log entry +func (f *TextFormatter) Format(entry *Entry) ([]byte, error) { + prefixFieldClashes(entry.Data, f.FieldMap) + + keys := make([]string, 0, len(entry.Data)) + for k := range entry.Data { + keys = append(keys, k) + } + + fixedKeys := make([]string, 0, 4+len(entry.Data)) + if !f.DisableTimestamp { + fixedKeys = append(fixedKeys, f.FieldMap.resolve(FieldKeyTime)) + } + fixedKeys = append(fixedKeys, f.FieldMap.resolve(FieldKeyLevel)) + if entry.Message != "" { + fixedKeys = append(fixedKeys, f.FieldMap.resolve(FieldKeyMsg)) + } + if entry.err != "" { + fixedKeys = append(fixedKeys, f.FieldMap.resolve(FieldKeyLogrusError)) + } + + if !f.DisableSorting { + if f.SortingFunc == nil { + sort.Strings(keys) + fixedKeys = append(fixedKeys, keys...) + } else { + if !f.isColored() { + fixedKeys = append(fixedKeys, keys...) + f.SortingFunc(fixedKeys) + } else { + f.SortingFunc(keys) + } + } + } else { + fixedKeys = append(fixedKeys, keys...) + } + + var b *bytes.Buffer + if entry.Buffer != nil { + b = entry.Buffer + } else { + b = &bytes.Buffer{} + } + + f.terminalInitOnce.Do(func() { f.init(entry) }) + + timestampFormat := f.TimestampFormat + if timestampFormat == "" { + timestampFormat = defaultTimestampFormat + } + if f.isColored() { + f.printColored(b, entry, keys, timestampFormat) + } else { + for _, key := range fixedKeys { + var value interface{} + switch key { + case f.FieldMap.resolve(FieldKeyTime): + value = entry.Time.Format(timestampFormat) + case f.FieldMap.resolve(FieldKeyLevel): + value = entry.Level.String() + case f.FieldMap.resolve(FieldKeyMsg): + value = entry.Message + case f.FieldMap.resolve(FieldKeyLogrusError): + value = entry.err + default: + value = entry.Data[key] + } + f.appendKeyValue(b, key, value) + } + } + + b.WriteByte('\n') + return b.Bytes(), nil +} + +func (f *TextFormatter) printColored(b *bytes.Buffer, entry *Entry, keys []string, timestampFormat string) { + var levelColor int + switch entry.Level { + case DebugLevel: + levelColor = gray + case WarnLevel: + levelColor = yellow + case ErrorLevel, FatalLevel, PanicLevel: + levelColor = red + default: + levelColor = blue + } + + levelText := strings.ToUpper(entry.Level.String()) + if !f.DisableLevelTruncation { + levelText = levelText[0:4] + } + + // Remove a single newline if it already exists in the message to keep + // the behavior of logrus text_formatter the same as the stdlib log package + entry.Message = strings.TrimSuffix(entry.Message, "\n") + + if f.DisableTimestamp { + fmt.Fprintf(b, "\x1b[%dm%s\x1b[0m %-44s ", levelColor, levelText, entry.Message) + } else if !f.FullTimestamp { + fmt.Fprintf(b, "\x1b[%dm%s\x1b[0m[%04d] %-44s ", levelColor, levelText, int(entry.Time.Sub(baseTimestamp)/time.Second), entry.Message) + } else { + fmt.Fprintf(b, "\x1b[%dm%s\x1b[0m[%s] %-44s ", levelColor, levelText, entry.Time.Format(timestampFormat), entry.Message) + } + for _, k := range keys { + v := entry.Data[k] + fmt.Fprintf(b, " \x1b[%dm%s\x1b[0m=", levelColor, k) + f.appendValue(b, v) + } +} + +func (f *TextFormatter) needsQuoting(text string) bool { + if f.QuoteEmptyFields && len(text) == 0 { + return true + } + for _, ch := range text { + if !((ch >= 'a' && ch <= 'z') || + (ch >= 'A' && ch <= 'Z') || + (ch >= '0' && ch <= '9') || + ch == '-' || ch == '.' || ch == '_' || ch == '/' || ch == '@' || ch == '^' || ch == '+') { + return true + } + } + return false +} + +func (f *TextFormatter) appendKeyValue(b *bytes.Buffer, key string, value interface{}) { + if b.Len() > 0 { + b.WriteByte(' ') + } + b.WriteString(key) + b.WriteByte('=') + f.appendValue(b, value) +} + +func (f *TextFormatter) appendValue(b *bytes.Buffer, value interface{}) { + stringVal, ok := value.(string) + if !ok { + stringVal = fmt.Sprint(value) + } + + if !f.needsQuoting(stringVal) { + b.WriteString(stringVal) + } else { + b.WriteString(fmt.Sprintf("%q", stringVal)) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sirupsen/logrus/writer.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sirupsen/logrus/writer.go new file mode 100644 index 00000000..7bdebedc --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/sirupsen/logrus/writer.go @@ -0,0 +1,62 @@ +package logrus + +import ( + "bufio" + "io" + "runtime" +) + +func (logger *Logger) Writer() *io.PipeWriter { + return logger.WriterLevel(InfoLevel) +} + +func (logger *Logger) WriterLevel(level Level) *io.PipeWriter { + return NewEntry(logger).WriterLevel(level) +} + +func (entry *Entry) Writer() *io.PipeWriter { + return entry.WriterLevel(InfoLevel) +} + +func (entry *Entry) WriterLevel(level Level) *io.PipeWriter { + reader, writer := io.Pipe() + + var printFunc func(args ...interface{}) + + switch level { + case DebugLevel: + printFunc = entry.Debug + case InfoLevel: + printFunc = entry.Info + case WarnLevel: + printFunc = entry.Warn + case ErrorLevel: + printFunc = entry.Error + case FatalLevel: + printFunc = entry.Fatal + case PanicLevel: + printFunc = entry.Panic + default: + printFunc = entry.Print + } + + go entry.writerScanner(reader, printFunc) + runtime.SetFinalizer(writer, writerFinalizer) + + return writer +} + +func (entry *Entry) writerScanner(reader *io.PipeReader, printFunc func(args ...interface{})) { + scanner := bufio.NewScanner(reader) + for scanner.Scan() { + printFunc(scanner.Text()) + } + if err := scanner.Err(); err != nil { + entry.Errorf("Error while reading from Writer: %s", err) + } + reader.Close() +} + +func writerFinalizer(writer *io.PipeWriter) { + writer.Close() +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/.travis.yml b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/.travis.yml new file mode 100644 index 00000000..0637db72 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/.travis.yml @@ -0,0 +1,21 @@ +sudo: false +language: go + +go: + - 1.9 + - "1.10" + - tip + +os: + - linux + - osx + +matrix: + allow_failures: + - go: tip + fast_finish: true + +script: + - go build + - go test -race -v ./... + diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/LICENSE.txt b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/LICENSE.txt new file mode 100644 index 00000000..298f0e26 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/LICENSE.txt @@ -0,0 +1,174 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/README.md b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/README.md new file mode 100644 index 00000000..0c9b04b5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/README.md @@ -0,0 +1,452 @@ +![afero logo-sm](https://cloud.githubusercontent.com/assets/173412/11490338/d50e16dc-97a5-11e5-8b12-019a300d0fcb.png) + +A FileSystem Abstraction System for Go + +[![Build Status](https://travis-ci.org/spf13/afero.svg)](https://travis-ci.org/spf13/afero) [![Build status](https://ci.appveyor.com/api/projects/status/github/spf13/afero?branch=master&svg=true)](https://ci.appveyor.com/project/spf13/afero) [![GoDoc](https://godoc.org/github.com/spf13/afero?status.svg)](https://godoc.org/github.com/spf13/afero) [![Join the chat at https://gitter.im/spf13/afero](https://badges.gitter.im/Dev%20Chat.svg)](https://gitter.im/spf13/afero?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) + +# Overview + +Afero is an filesystem framework providing a simple, uniform and universal API +interacting with any filesystem, as an abstraction layer providing interfaces, +types and methods. Afero has an exceptionally clean interface and simple design +without needless constructors or initialization methods. + +Afero is also a library providing a base set of interoperable backend +filesystems that make it easy to work with afero while retaining all the power +and benefit of the os and ioutil packages. + +Afero provides significant improvements over using the os package alone, most +notably the ability to create mock and testing filesystems without relying on the disk. + +It is suitable for use in a any situation where you would consider using the OS +package as it provides an additional abstraction that makes it easy to use a +memory backed file system during testing. It also adds support for the http +filesystem for full interoperability. + + +## Afero Features + +* A single consistent API for accessing a variety of filesystems +* Interoperation between a variety of file system types +* A set of interfaces to encourage and enforce interoperability between backends +* An atomic cross platform memory backed file system +* Support for compositional (union) file systems by combining multiple file systems acting as one +* Specialized backends which modify existing filesystems (Read Only, Regexp filtered) +* A set of utility functions ported from io, ioutil & hugo to be afero aware + + +# Using Afero + +Afero is easy to use and easier to adopt. + +A few different ways you could use Afero: + +* Use the interfaces alone to define you own file system. +* Wrap for the OS packages. +* Define different filesystems for different parts of your application. +* Use Afero for mock filesystems while testing + +## Step 1: Install Afero + +First use go get to install the latest version of the library. + + $ go get github.com/spf13/afero + +Next include Afero in your application. +```go +import "github.com/spf13/afero" +``` + +## Step 2: Declare a backend + +First define a package variable and set it to a pointer to a filesystem. +```go +var AppFs = afero.NewMemMapFs() + +or + +var AppFs = afero.NewOsFs() +``` +It is important to note that if you repeat the composite literal you +will be using a completely new and isolated filesystem. In the case of +OsFs it will still use the same underlying filesystem but will reduce +the ability to drop in other filesystems as desired. + +## Step 3: Use it like you would the OS package + +Throughout your application use any function and method like you normally +would. + +So if my application before had: +```go +os.Open('/tmp/foo') +``` +We would replace it with: +```go +AppFs.Open('/tmp/foo') +``` + +`AppFs` being the variable we defined above. + + +## List of all available functions + +File System Methods Available: +```go +Chmod(name string, mode os.FileMode) : error +Chtimes(name string, atime time.Time, mtime time.Time) : error +Create(name string) : File, error +Mkdir(name string, perm os.FileMode) : error +MkdirAll(path string, perm os.FileMode) : error +Name() : string +Open(name string) : File, error +OpenFile(name string, flag int, perm os.FileMode) : File, error +Remove(name string) : error +RemoveAll(path string) : error +Rename(oldname, newname string) : error +Stat(name string) : os.FileInfo, error +``` +File Interfaces and Methods Available: +```go +io.Closer +io.Reader +io.ReaderAt +io.Seeker +io.Writer +io.WriterAt + +Name() : string +Readdir(count int) : []os.FileInfo, error +Readdirnames(n int) : []string, error +Stat() : os.FileInfo, error +Sync() : error +Truncate(size int64) : error +WriteString(s string) : ret int, err error +``` +In some applications it may make sense to define a new package that +simply exports the file system variable for easy access from anywhere. + +## Using Afero's utility functions + +Afero provides a set of functions to make it easier to use the underlying file systems. +These functions have been primarily ported from io & ioutil with some developed for Hugo. + +The afero utilities support all afero compatible backends. + +The list of utilities includes: + +```go +DirExists(path string) (bool, error) +Exists(path string) (bool, error) +FileContainsBytes(filename string, subslice []byte) (bool, error) +GetTempDir(subPath string) string +IsDir(path string) (bool, error) +IsEmpty(path string) (bool, error) +ReadDir(dirname string) ([]os.FileInfo, error) +ReadFile(filename string) ([]byte, error) +SafeWriteReader(path string, r io.Reader) (err error) +TempDir(dir, prefix string) (name string, err error) +TempFile(dir, prefix string) (f File, err error) +Walk(root string, walkFn filepath.WalkFunc) error +WriteFile(filename string, data []byte, perm os.FileMode) error +WriteReader(path string, r io.Reader) (err error) +``` +For a complete list see [Afero's GoDoc](https://godoc.org/github.com/spf13/afero) + +They are available under two different approaches to use. You can either call +them directly where the first parameter of each function will be the file +system, or you can declare a new `Afero`, a custom type used to bind these +functions as methods to a given filesystem. + +### Calling utilities directly + +```go +fs := new(afero.MemMapFs) +f, err := afero.TempFile(fs,"", "ioutil-test") + +``` + +### Calling via Afero + +```go +fs := afero.NewMemMapFs() +afs := &afero.Afero{Fs: fs} +f, err := afs.TempFile("", "ioutil-test") +``` + +## Using Afero for Testing + +There is a large benefit to using a mock filesystem for testing. It has a +completely blank state every time it is initialized and can be easily +reproducible regardless of OS. You could create files to your heart’s content +and the file access would be fast while also saving you from all the annoying +issues with deleting temporary files, Windows file locking, etc. The MemMapFs +backend is perfect for testing. + +* Much faster than performing I/O operations on disk +* Avoid security issues and permissions +* Far more control. 'rm -rf /' with confidence +* Test setup is far more easier to do +* No test cleanup needed + +One way to accomplish this is to define a variable as mentioned above. +In your application this will be set to afero.NewOsFs() during testing you +can set it to afero.NewMemMapFs(). + +It wouldn't be uncommon to have each test initialize a blank slate memory +backend. To do this I would define my `appFS = afero.NewOsFs()` somewhere +appropriate in my application code. This approach ensures that Tests are order +independent, with no test relying on the state left by an earlier test. + +Then in my tests I would initialize a new MemMapFs for each test: +```go +func TestExist(t *testing.T) { + appFS := afero.NewMemMapFs() + // create test files and directories + appFS.MkdirAll("src/a", 0755) + afero.WriteFile(appFS, "src/a/b", []byte("file b"), 0644) + afero.WriteFile(appFS, "src/c", []byte("file c"), 0644) + name := "src/c" + _, err := appFS.Stat(name) + if os.IsNotExist(err) { + t.Errorf("file \"%s\" does not exist.\n", name) + } +} +``` + +# Available Backends + +## Operating System Native + +### OsFs + +The first is simply a wrapper around the native OS calls. This makes it +very easy to use as all of the calls are the same as the existing OS +calls. It also makes it trivial to have your code use the OS during +operation and a mock filesystem during testing or as needed. + +```go +appfs := afero.NewOsFs() +appfs.MkdirAll("src/a", 0755)) +``` + +## Memory Backed Storage + +### MemMapFs + +Afero also provides a fully atomic memory backed filesystem perfect for use in +mocking and to speed up unnecessary disk io when persistence isn’t +necessary. It is fully concurrent and will work within go routines +safely. + +```go +mm := afero.NewMemMapFs() +mm.MkdirAll("src/a", 0755)) +``` + +#### InMemoryFile + +As part of MemMapFs, Afero also provides an atomic, fully concurrent memory +backed file implementation. This can be used in other memory backed file +systems with ease. Plans are to add a radix tree memory stored file +system using InMemoryFile. + +## Network Interfaces + +### SftpFs + +Afero has experimental support for secure file transfer protocol (sftp). Which can +be used to perform file operations over a encrypted channel. + +## Filtering Backends + +### BasePathFs + +The BasePathFs restricts all operations to a given path within an Fs. +The given file name to the operations on this Fs will be prepended with +the base path before calling the source Fs. + +```go +bp := afero.NewBasePathFs(afero.NewOsFs(), "/base/path") +``` + +### ReadOnlyFs + +A thin wrapper around the source Fs providing a read only view. + +```go +fs := afero.NewReadOnlyFs(afero.NewOsFs()) +_, err := fs.Create("/file.txt") +// err = syscall.EPERM +``` + +# RegexpFs + +A filtered view on file names, any file NOT matching +the passed regexp will be treated as non-existing. +Files not matching the regexp provided will not be created. +Directories are not filtered. + +```go +fs := afero.NewRegexpFs(afero.NewMemMapFs(), regexp.MustCompile(`\.txt$`)) +_, err := fs.Create("/file.html") +// err = syscall.ENOENT +``` + +### HttpFs + +Afero provides an http compatible backend which can wrap any of the existing +backends. + +The Http package requires a slightly specific version of Open which +returns an http.File type. + +Afero provides an httpFs file system which satisfies this requirement. +Any Afero FileSystem can be used as an httpFs. + +```go +httpFs := afero.NewHttpFs() +fileserver := http.FileServer(httpFs.Dir())) +http.Handle("/", fileserver) +``` + +## Composite Backends + +Afero provides the ability have two filesystems (or more) act as a single +file system. + +### CacheOnReadFs + +The CacheOnReadFs will lazily make copies of any accessed files from the base +layer into the overlay. Subsequent reads will be pulled from the overlay +directly permitting the request is within the cache duration of when it was +created in the overlay. + +If the base filesystem is writeable, any changes to files will be +done first to the base, then to the overlay layer. Write calls to open file +handles like `Write()` or `Truncate()` to the overlay first. + +To writing files to the overlay only, you can use the overlay Fs directly (not +via the union Fs). + +Cache files in the layer for the given time.Duration, a cache duration of 0 +means "forever" meaning the file will not be re-requested from the base ever. + +A read-only base will make the overlay also read-only but still copy files +from the base to the overlay when they're not present (or outdated) in the +caching layer. + +```go +base := afero.NewOsFs() +layer := afero.NewMemMapFs() +ufs := afero.NewCacheOnReadFs(base, layer, 100 * time.Second) +``` + +### CopyOnWriteFs() + +The CopyOnWriteFs is a read only base file system with a potentially +writeable layer on top. + +Read operations will first look in the overlay and if not found there, will +serve the file from the base. + +Changes to the file system will only be made in the overlay. + +Any attempt to modify a file found only in the base will copy the file to the +overlay layer before modification (including opening a file with a writable +handle). + +Removing and Renaming files present only in the base layer is not currently +permitted. If a file is present in the base layer and the overlay, only the +overlay will be removed/renamed. + +```go + base := afero.NewOsFs() + roBase := afero.NewReadOnlyFs(base) + ufs := afero.NewCopyOnWriteFs(roBase, afero.NewMemMapFs()) + + fh, _ = ufs.Create("/home/test/file2.txt") + fh.WriteString("This is a test") + fh.Close() +``` + +In this example all write operations will only occur in memory (MemMapFs) +leaving the base filesystem (OsFs) untouched. + + +## Desired/possible backends + +The following is a short list of possible backends we hope someone will +implement: + +* SSH +* ZIP +* TAR +* S3 + +# About the project + +## What's in the name + +Afero comes from the latin roots Ad-Facere. + +**"Ad"** is a prefix meaning "to". + +**"Facere"** is a form of the root "faciÅ" making "make or do". + +The literal meaning of afero is "to make" or "to do" which seems very fitting +for a library that allows one to make files and directories and do things with them. + +The English word that shares the same roots as Afero is "affair". Affair shares +the same concept but as a noun it means "something that is made or done" or "an +object of a particular type". + +It's also nice that unlike some of my other libraries (hugo, cobra, viper) it +Googles very well. + +## Release Notes + +* **0.10.0** 2015.12.10 + * Full compatibility with Windows + * Introduction of afero utilities + * Test suite rewritten to work cross platform + * Normalize paths for MemMapFs + * Adding Sync to the file interface + * **Breaking Change** Walk and ReadDir have changed parameter order + * Moving types used by MemMapFs to a subpackage + * General bugfixes and improvements +* **0.9.0** 2015.11.05 + * New Walk function similar to filepath.Walk + * MemMapFs.OpenFile handles O_CREATE, O_APPEND, O_TRUNC + * MemMapFs.Remove now really deletes the file + * InMemoryFile.Readdir and Readdirnames work correctly + * InMemoryFile functions lock it for concurrent access + * Test suite improvements +* **0.8.0** 2014.10.28 + * First public version + * Interfaces feel ready for people to build using + * Interfaces satisfy all known uses + * MemMapFs passes the majority of the OS test suite + * OsFs passes the majority of the OS test suite + +## Contributing + +1. Fork it +2. Create your feature branch (`git checkout -b my-new-feature`) +3. Commit your changes (`git commit -am 'Add some feature'`) +4. Push to the branch (`git push origin my-new-feature`) +5. Create new Pull Request + +## Contributors + +Names in no particular order: + +* [spf13](https://github.com/spf13) +* [jaqx0r](https://github.com/jaqx0r) +* [mbertschler](https://github.com/mbertschler) +* [xor-gate](https://github.com/xor-gate) + +## License + +Afero is released under the Apache 2.0 license. See +[LICENSE.txt](https://github.com/spf13/afero/blob/master/LICENSE.txt) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/afero.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/afero.go new file mode 100644 index 00000000..f5b5e127 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/afero.go @@ -0,0 +1,108 @@ +// Copyright © 2014 Steve Francia . +// Copyright 2013 tsuru authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package afero provides types and methods for interacting with the filesystem, +// as an abstraction layer. + +// Afero also provides a few implementations that are mostly interoperable. One that +// uses the operating system filesystem, one that uses memory to store files +// (cross platform) and an interface that should be implemented if you want to +// provide your own filesystem. + +package afero + +import ( + "errors" + "io" + "os" + "time" +) + +type Afero struct { + Fs +} + +// File represents a file in the filesystem. +type File interface { + io.Closer + io.Reader + io.ReaderAt + io.Seeker + io.Writer + io.WriterAt + + Name() string + Readdir(count int) ([]os.FileInfo, error) + Readdirnames(n int) ([]string, error) + Stat() (os.FileInfo, error) + Sync() error + Truncate(size int64) error + WriteString(s string) (ret int, err error) +} + +// Fs is the filesystem interface. +// +// Any simulated or real filesystem should implement this interface. +type Fs interface { + // Create creates a file in the filesystem, returning the file and an + // error, if any happens. + Create(name string) (File, error) + + // Mkdir creates a directory in the filesystem, return an error if any + // happens. + Mkdir(name string, perm os.FileMode) error + + // MkdirAll creates a directory path and all parents that does not exist + // yet. + MkdirAll(path string, perm os.FileMode) error + + // Open opens a file, returning it or an error, if any happens. + Open(name string) (File, error) + + // OpenFile opens a file using the given flags and the given mode. + OpenFile(name string, flag int, perm os.FileMode) (File, error) + + // Remove removes a file identified by name, returning an error, if any + // happens. + Remove(name string) error + + // RemoveAll removes a directory path and any children it contains. It + // does not fail if the path does not exist (return nil). + RemoveAll(path string) error + + // Rename renames a file. + Rename(oldname, newname string) error + + // Stat returns a FileInfo describing the named file, or an error, if any + // happens. + Stat(name string) (os.FileInfo, error) + + // The name of this FileSystem + Name() string + + //Chmod changes the mode of the named file to mode. + Chmod(name string, mode os.FileMode) error + + //Chtimes changes the access and modification times of the named file + Chtimes(name string, atime time.Time, mtime time.Time) error +} + +var ( + ErrFileClosed = errors.New("File is closed") + ErrOutOfRange = errors.New("Out of range") + ErrTooLarge = errors.New("Too large") + ErrFileNotFound = os.ErrNotExist + ErrFileExists = os.ErrExist + ErrDestinationExists = os.ErrExist +) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/appveyor.yml b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/appveyor.yml new file mode 100644 index 00000000..a633ad50 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/appveyor.yml @@ -0,0 +1,15 @@ +version: '{build}' +clone_folder: C:\gopath\src\github.com\spf13\afero +environment: + GOPATH: C:\gopath +build_script: +- cmd: >- + go version + + go env + + go get -v github.com/spf13/afero/... + + go build github.com/spf13/afero +test_script: +- cmd: go test -race -v github.com/spf13/afero/... diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/basepath.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/basepath.go new file mode 100644 index 00000000..616ff8ff --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/basepath.go @@ -0,0 +1,180 @@ +package afero + +import ( + "os" + "path/filepath" + "runtime" + "strings" + "time" +) + +var _ Lstater = (*BasePathFs)(nil) + +// The BasePathFs restricts all operations to a given path within an Fs. +// The given file name to the operations on this Fs will be prepended with +// the base path before calling the base Fs. +// Any file name (after filepath.Clean()) outside this base path will be +// treated as non existing file. +// +// Note that it does not clean the error messages on return, so you may +// reveal the real path on errors. +type BasePathFs struct { + source Fs + path string +} + +type BasePathFile struct { + File + path string +} + +func (f *BasePathFile) Name() string { + sourcename := f.File.Name() + return strings.TrimPrefix(sourcename, filepath.Clean(f.path)) +} + +func NewBasePathFs(source Fs, path string) Fs { + return &BasePathFs{source: source, path: path} +} + +// on a file outside the base path it returns the given file name and an error, +// else the given file with the base path prepended +func (b *BasePathFs) RealPath(name string) (path string, err error) { + if err := validateBasePathName(name); err != nil { + return name, err + } + + bpath := filepath.Clean(b.path) + path = filepath.Clean(filepath.Join(bpath, name)) + if !strings.HasPrefix(path, bpath) { + return name, os.ErrNotExist + } + + return path, nil +} + +func validateBasePathName(name string) error { + if runtime.GOOS != "windows" { + // Not much to do here; + // the virtual file paths all look absolute on *nix. + return nil + } + + // On Windows a common mistake would be to provide an absolute OS path + // We could strip out the base part, but that would not be very portable. + if filepath.IsAbs(name) { + return os.ErrNotExist + } + + return nil +} + +func (b *BasePathFs) Chtimes(name string, atime, mtime time.Time) (err error) { + if name, err = b.RealPath(name); err != nil { + return &os.PathError{Op: "chtimes", Path: name, Err: err} + } + return b.source.Chtimes(name, atime, mtime) +} + +func (b *BasePathFs) Chmod(name string, mode os.FileMode) (err error) { + if name, err = b.RealPath(name); err != nil { + return &os.PathError{Op: "chmod", Path: name, Err: err} + } + return b.source.Chmod(name, mode) +} + +func (b *BasePathFs) Name() string { + return "BasePathFs" +} + +func (b *BasePathFs) Stat(name string) (fi os.FileInfo, err error) { + if name, err = b.RealPath(name); err != nil { + return nil, &os.PathError{Op: "stat", Path: name, Err: err} + } + return b.source.Stat(name) +} + +func (b *BasePathFs) Rename(oldname, newname string) (err error) { + if oldname, err = b.RealPath(oldname); err != nil { + return &os.PathError{Op: "rename", Path: oldname, Err: err} + } + if newname, err = b.RealPath(newname); err != nil { + return &os.PathError{Op: "rename", Path: newname, Err: err} + } + return b.source.Rename(oldname, newname) +} + +func (b *BasePathFs) RemoveAll(name string) (err error) { + if name, err = b.RealPath(name); err != nil { + return &os.PathError{Op: "remove_all", Path: name, Err: err} + } + return b.source.RemoveAll(name) +} + +func (b *BasePathFs) Remove(name string) (err error) { + if name, err = b.RealPath(name); err != nil { + return &os.PathError{Op: "remove", Path: name, Err: err} + } + return b.source.Remove(name) +} + +func (b *BasePathFs) OpenFile(name string, flag int, mode os.FileMode) (f File, err error) { + if name, err = b.RealPath(name); err != nil { + return nil, &os.PathError{Op: "openfile", Path: name, Err: err} + } + sourcef, err := b.source.OpenFile(name, flag, mode) + if err != nil { + return nil, err + } + return &BasePathFile{sourcef, b.path}, nil +} + +func (b *BasePathFs) Open(name string) (f File, err error) { + if name, err = b.RealPath(name); err != nil { + return nil, &os.PathError{Op: "open", Path: name, Err: err} + } + sourcef, err := b.source.Open(name) + if err != nil { + return nil, err + } + return &BasePathFile{File: sourcef, path: b.path}, nil +} + +func (b *BasePathFs) Mkdir(name string, mode os.FileMode) (err error) { + if name, err = b.RealPath(name); err != nil { + return &os.PathError{Op: "mkdir", Path: name, Err: err} + } + return b.source.Mkdir(name, mode) +} + +func (b *BasePathFs) MkdirAll(name string, mode os.FileMode) (err error) { + if name, err = b.RealPath(name); err != nil { + return &os.PathError{Op: "mkdir", Path: name, Err: err} + } + return b.source.MkdirAll(name, mode) +} + +func (b *BasePathFs) Create(name string) (f File, err error) { + if name, err = b.RealPath(name); err != nil { + return nil, &os.PathError{Op: "create", Path: name, Err: err} + } + sourcef, err := b.source.Create(name) + if err != nil { + return nil, err + } + return &BasePathFile{File: sourcef, path: b.path}, nil +} + +func (b *BasePathFs) LstatIfPossible(name string) (os.FileInfo, bool, error) { + name, err := b.RealPath(name) + if err != nil { + return nil, false, &os.PathError{Op: "lstat", Path: name, Err: err} + } + if lstater, ok := b.source.(Lstater); ok { + return lstater.LstatIfPossible(name) + } + fi, err := b.source.Stat(name) + return fi, false, err +} + +// vim: ts=4 sw=4 noexpandtab nolist syn=go diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/cacheOnReadFs.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/cacheOnReadFs.go new file mode 100644 index 00000000..29a26c67 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/cacheOnReadFs.go @@ -0,0 +1,290 @@ +package afero + +import ( + "os" + "syscall" + "time" +) + +// If the cache duration is 0, cache time will be unlimited, i.e. once +// a file is in the layer, the base will never be read again for this file. +// +// For cache times greater than 0, the modification time of a file is +// checked. Note that a lot of file system implementations only allow a +// resolution of a second for timestamps... or as the godoc for os.Chtimes() +// states: "The underlying filesystem may truncate or round the values to a +// less precise time unit." +// +// This caching union will forward all write calls also to the base file +// system first. To prevent writing to the base Fs, wrap it in a read-only +// filter - Note: this will also make the overlay read-only, for writing files +// in the overlay, use the overlay Fs directly, not via the union Fs. +type CacheOnReadFs struct { + base Fs + layer Fs + cacheTime time.Duration +} + +func NewCacheOnReadFs(base Fs, layer Fs, cacheTime time.Duration) Fs { + return &CacheOnReadFs{base: base, layer: layer, cacheTime: cacheTime} +} + +type cacheState int + +const ( + // not present in the overlay, unknown if it exists in the base: + cacheMiss cacheState = iota + // present in the overlay and in base, base file is newer: + cacheStale + // present in the overlay - with cache time == 0 it may exist in the base, + // with cacheTime > 0 it exists in the base and is same age or newer in the + // overlay + cacheHit + // happens if someone writes directly to the overlay without + // going through this union + cacheLocal +) + +func (u *CacheOnReadFs) cacheStatus(name string) (state cacheState, fi os.FileInfo, err error) { + var lfi, bfi os.FileInfo + lfi, err = u.layer.Stat(name) + if err == nil { + if u.cacheTime == 0 { + return cacheHit, lfi, nil + } + if lfi.ModTime().Add(u.cacheTime).Before(time.Now()) { + bfi, err = u.base.Stat(name) + if err != nil { + return cacheLocal, lfi, nil + } + if bfi.ModTime().After(lfi.ModTime()) { + return cacheStale, bfi, nil + } + } + return cacheHit, lfi, nil + } + + if err == syscall.ENOENT || os.IsNotExist(err) { + return cacheMiss, nil, nil + } + + return cacheMiss, nil, err +} + +func (u *CacheOnReadFs) copyToLayer(name string) error { + return copyToLayer(u.base, u.layer, name) +} + +func (u *CacheOnReadFs) Chtimes(name string, atime, mtime time.Time) error { + st, _, err := u.cacheStatus(name) + if err != nil { + return err + } + switch st { + case cacheLocal: + case cacheHit: + err = u.base.Chtimes(name, atime, mtime) + case cacheStale, cacheMiss: + if err := u.copyToLayer(name); err != nil { + return err + } + err = u.base.Chtimes(name, atime, mtime) + } + if err != nil { + return err + } + return u.layer.Chtimes(name, atime, mtime) +} + +func (u *CacheOnReadFs) Chmod(name string, mode os.FileMode) error { + st, _, err := u.cacheStatus(name) + if err != nil { + return err + } + switch st { + case cacheLocal: + case cacheHit: + err = u.base.Chmod(name, mode) + case cacheStale, cacheMiss: + if err := u.copyToLayer(name); err != nil { + return err + } + err = u.base.Chmod(name, mode) + } + if err != nil { + return err + } + return u.layer.Chmod(name, mode) +} + +func (u *CacheOnReadFs) Stat(name string) (os.FileInfo, error) { + st, fi, err := u.cacheStatus(name) + if err != nil { + return nil, err + } + switch st { + case cacheMiss: + return u.base.Stat(name) + default: // cacheStale has base, cacheHit and cacheLocal the layer os.FileInfo + return fi, nil + } +} + +func (u *CacheOnReadFs) Rename(oldname, newname string) error { + st, _, err := u.cacheStatus(oldname) + if err != nil { + return err + } + switch st { + case cacheLocal: + case cacheHit: + err = u.base.Rename(oldname, newname) + case cacheStale, cacheMiss: + if err := u.copyToLayer(oldname); err != nil { + return err + } + err = u.base.Rename(oldname, newname) + } + if err != nil { + return err + } + return u.layer.Rename(oldname, newname) +} + +func (u *CacheOnReadFs) Remove(name string) error { + st, _, err := u.cacheStatus(name) + if err != nil { + return err + } + switch st { + case cacheLocal: + case cacheHit, cacheStale, cacheMiss: + err = u.base.Remove(name) + } + if err != nil { + return err + } + return u.layer.Remove(name) +} + +func (u *CacheOnReadFs) RemoveAll(name string) error { + st, _, err := u.cacheStatus(name) + if err != nil { + return err + } + switch st { + case cacheLocal: + case cacheHit, cacheStale, cacheMiss: + err = u.base.RemoveAll(name) + } + if err != nil { + return err + } + return u.layer.RemoveAll(name) +} + +func (u *CacheOnReadFs) OpenFile(name string, flag int, perm os.FileMode) (File, error) { + st, _, err := u.cacheStatus(name) + if err != nil { + return nil, err + } + switch st { + case cacheLocal, cacheHit: + default: + if err := u.copyToLayer(name); err != nil { + return nil, err + } + } + if flag&(os.O_WRONLY|syscall.O_RDWR|os.O_APPEND|os.O_CREATE|os.O_TRUNC) != 0 { + bfi, err := u.base.OpenFile(name, flag, perm) + if err != nil { + return nil, err + } + lfi, err := u.layer.OpenFile(name, flag, perm) + if err != nil { + bfi.Close() // oops, what if O_TRUNC was set and file opening in the layer failed...? + return nil, err + } + return &UnionFile{Base: bfi, Layer: lfi}, nil + } + return u.layer.OpenFile(name, flag, perm) +} + +func (u *CacheOnReadFs) Open(name string) (File, error) { + st, fi, err := u.cacheStatus(name) + if err != nil { + return nil, err + } + + switch st { + case cacheLocal: + return u.layer.Open(name) + + case cacheMiss: + bfi, err := u.base.Stat(name) + if err != nil { + return nil, err + } + if bfi.IsDir() { + return u.base.Open(name) + } + if err := u.copyToLayer(name); err != nil { + return nil, err + } + return u.layer.Open(name) + + case cacheStale: + if !fi.IsDir() { + if err := u.copyToLayer(name); err != nil { + return nil, err + } + return u.layer.Open(name) + } + case cacheHit: + if !fi.IsDir() { + return u.layer.Open(name) + } + } + // the dirs from cacheHit, cacheStale fall down here: + bfile, _ := u.base.Open(name) + lfile, err := u.layer.Open(name) + if err != nil && bfile == nil { + return nil, err + } + return &UnionFile{Base: bfile, Layer: lfile}, nil +} + +func (u *CacheOnReadFs) Mkdir(name string, perm os.FileMode) error { + err := u.base.Mkdir(name, perm) + if err != nil { + return err + } + return u.layer.MkdirAll(name, perm) // yes, MkdirAll... we cannot assume it exists in the cache +} + +func (u *CacheOnReadFs) Name() string { + return "CacheOnReadFs" +} + +func (u *CacheOnReadFs) MkdirAll(name string, perm os.FileMode) error { + err := u.base.MkdirAll(name, perm) + if err != nil { + return err + } + return u.layer.MkdirAll(name, perm) +} + +func (u *CacheOnReadFs) Create(name string) (File, error) { + bfh, err := u.base.Create(name) + if err != nil { + return nil, err + } + lfh, err := u.layer.Create(name) + if err != nil { + // oops, see comment about OS_TRUNC above, should we remove? then we have to + // remember if the file did not exist before + bfh.Close() + return nil, err + } + return &UnionFile{Base: bfh, Layer: lfh}, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/const_bsds.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/const_bsds.go new file mode 100644 index 00000000..5728243d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/const_bsds.go @@ -0,0 +1,22 @@ +// Copyright © 2016 Steve Francia . +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build darwin openbsd freebsd netbsd dragonfly + +package afero + +import ( + "syscall" +) + +const BADFD = syscall.EBADF diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/const_win_unix.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/const_win_unix.go new file mode 100644 index 00000000..968fc278 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/const_win_unix.go @@ -0,0 +1,25 @@ +// Copyright © 2016 Steve Francia . +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +build !darwin +// +build !openbsd +// +build !freebsd +// +build !dragonfly +// +build !netbsd + +package afero + +import ( + "syscall" +) + +const BADFD = syscall.EBADFD diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/copyOnWriteFs.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/copyOnWriteFs.go new file mode 100644 index 00000000..9aef3979 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/copyOnWriteFs.go @@ -0,0 +1,292 @@ +package afero + +import ( + "fmt" + "os" + "path/filepath" + "syscall" + "time" +) + +var _ Lstater = (*CopyOnWriteFs)(nil) + +// The CopyOnWriteFs is a union filesystem: a read only base file system with +// a possibly writeable layer on top. Changes to the file system will only +// be made in the overlay: Changing an existing file in the base layer which +// is not present in the overlay will copy the file to the overlay ("changing" +// includes also calls to e.g. Chtimes() and Chmod()). +// +// Reading directories is currently only supported via Open(), not OpenFile(). +type CopyOnWriteFs struct { + base Fs + layer Fs +} + +func NewCopyOnWriteFs(base Fs, layer Fs) Fs { + return &CopyOnWriteFs{base: base, layer: layer} +} + +// Returns true if the file is not in the overlay +func (u *CopyOnWriteFs) isBaseFile(name string) (bool, error) { + if _, err := u.layer.Stat(name); err == nil { + return false, nil + } + _, err := u.base.Stat(name) + if err != nil { + if oerr, ok := err.(*os.PathError); ok { + if oerr.Err == os.ErrNotExist || oerr.Err == syscall.ENOENT || oerr.Err == syscall.ENOTDIR { + return false, nil + } + } + if err == syscall.ENOENT { + return false, nil + } + } + return true, err +} + +func (u *CopyOnWriteFs) copyToLayer(name string) error { + return copyToLayer(u.base, u.layer, name) +} + +func (u *CopyOnWriteFs) Chtimes(name string, atime, mtime time.Time) error { + b, err := u.isBaseFile(name) + if err != nil { + return err + } + if b { + if err := u.copyToLayer(name); err != nil { + return err + } + } + return u.layer.Chtimes(name, atime, mtime) +} + +func (u *CopyOnWriteFs) Chmod(name string, mode os.FileMode) error { + b, err := u.isBaseFile(name) + if err != nil { + return err + } + if b { + if err := u.copyToLayer(name); err != nil { + return err + } + } + return u.layer.Chmod(name, mode) +} + +func (u *CopyOnWriteFs) Stat(name string) (os.FileInfo, error) { + fi, err := u.layer.Stat(name) + if err != nil { + isNotExist := u.isNotExist(err) + if isNotExist { + return u.base.Stat(name) + } + return nil, err + } + return fi, nil +} + +func (u *CopyOnWriteFs) LstatIfPossible(name string) (os.FileInfo, bool, error) { + llayer, ok1 := u.layer.(Lstater) + lbase, ok2 := u.base.(Lstater) + + if ok1 { + fi, b, err := llayer.LstatIfPossible(name) + if err == nil { + return fi, b, nil + } + + if !u.isNotExist(err) { + return nil, b, err + } + } + + if ok2 { + fi, b, err := lbase.LstatIfPossible(name) + if err == nil { + return fi, b, nil + } + if !u.isNotExist(err) { + return nil, b, err + } + } + + fi, err := u.Stat(name) + + return fi, false, err +} + +func (u *CopyOnWriteFs) isNotExist(err error) bool { + if e, ok := err.(*os.PathError); ok { + err = e.Err + } + if err == os.ErrNotExist || err == syscall.ENOENT || err == syscall.ENOTDIR { + return true + } + return false +} + +// Renaming files present only in the base layer is not permitted +func (u *CopyOnWriteFs) Rename(oldname, newname string) error { + b, err := u.isBaseFile(oldname) + if err != nil { + return err + } + if b { + return syscall.EPERM + } + return u.layer.Rename(oldname, newname) +} + +// Removing files present only in the base layer is not permitted. If +// a file is present in the base layer and the overlay, only the overlay +// will be removed. +func (u *CopyOnWriteFs) Remove(name string) error { + err := u.layer.Remove(name) + switch err { + case syscall.ENOENT: + _, err = u.base.Stat(name) + if err == nil { + return syscall.EPERM + } + return syscall.ENOENT + default: + return err + } +} + +func (u *CopyOnWriteFs) RemoveAll(name string) error { + err := u.layer.RemoveAll(name) + switch err { + case syscall.ENOENT: + _, err = u.base.Stat(name) + if err == nil { + return syscall.EPERM + } + return syscall.ENOENT + default: + return err + } +} + +func (u *CopyOnWriteFs) OpenFile(name string, flag int, perm os.FileMode) (File, error) { + b, err := u.isBaseFile(name) + if err != nil { + return nil, err + } + + if flag&(os.O_WRONLY|os.O_RDWR|os.O_APPEND|os.O_CREATE|os.O_TRUNC) != 0 { + if b { + if err = u.copyToLayer(name); err != nil { + return nil, err + } + return u.layer.OpenFile(name, flag, perm) + } + + dir := filepath.Dir(name) + isaDir, err := IsDir(u.base, dir) + if err != nil && !os.IsNotExist(err) { + return nil, err + } + if isaDir { + if err = u.layer.MkdirAll(dir, 0777); err != nil { + return nil, err + } + return u.layer.OpenFile(name, flag, perm) + } + + isaDir, err = IsDir(u.layer, dir) + if err != nil { + return nil, err + } + if isaDir { + return u.layer.OpenFile(name, flag, perm) + } + + return nil, &os.PathError{Op: "open", Path: name, Err: syscall.ENOTDIR} // ...or os.ErrNotExist? + } + if b { + return u.base.OpenFile(name, flag, perm) + } + return u.layer.OpenFile(name, flag, perm) +} + +// This function handles the 9 different possibilities caused +// by the union which are the intersection of the following... +// layer: doesn't exist, exists as a file, and exists as a directory +// base: doesn't exist, exists as a file, and exists as a directory +func (u *CopyOnWriteFs) Open(name string) (File, error) { + // Since the overlay overrides the base we check that first + b, err := u.isBaseFile(name) + if err != nil { + return nil, err + } + + // If overlay doesn't exist, return the base (base state irrelevant) + if b { + return u.base.Open(name) + } + + // If overlay is a file, return it (base state irrelevant) + dir, err := IsDir(u.layer, name) + if err != nil { + return nil, err + } + if !dir { + return u.layer.Open(name) + } + + // Overlay is a directory, base state now matters. + // Base state has 3 states to check but 2 outcomes: + // A. It's a file or non-readable in the base (return just the overlay) + // B. It's an accessible directory in the base (return a UnionFile) + + // If base is file or nonreadable, return overlay + dir, err = IsDir(u.base, name) + if !dir || err != nil { + return u.layer.Open(name) + } + + // Both base & layer are directories + // Return union file (if opens are without error) + bfile, bErr := u.base.Open(name) + lfile, lErr := u.layer.Open(name) + + // If either have errors at this point something is very wrong. Return nil and the errors + if bErr != nil || lErr != nil { + return nil, fmt.Errorf("BaseErr: %v\nOverlayErr: %v", bErr, lErr) + } + + return &UnionFile{Base: bfile, Layer: lfile}, nil +} + +func (u *CopyOnWriteFs) Mkdir(name string, perm os.FileMode) error { + dir, err := IsDir(u.base, name) + if err != nil { + return u.layer.MkdirAll(name, perm) + } + if dir { + return syscall.EEXIST + } + return u.layer.MkdirAll(name, perm) +} + +func (u *CopyOnWriteFs) Name() string { + return "CopyOnWriteFs" +} + +func (u *CopyOnWriteFs) MkdirAll(name string, perm os.FileMode) error { + dir, err := IsDir(u.base, name) + if err != nil { + return u.layer.MkdirAll(name, perm) + } + if dir { + return syscall.EEXIST + } + return u.layer.MkdirAll(name, perm) +} + +func (u *CopyOnWriteFs) Create(name string) (File, error) { + return u.OpenFile(name, os.O_CREATE|os.O_TRUNC|os.O_RDWR, 0666) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/go.mod b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/go.mod new file mode 100644 index 00000000..9eff4fed --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/go.mod @@ -0,0 +1 @@ +module github.com/spf13/afero diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/httpFs.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/httpFs.go new file mode 100644 index 00000000..c4219368 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/httpFs.go @@ -0,0 +1,110 @@ +// Copyright © 2014 Steve Francia . +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package afero + +import ( + "errors" + "net/http" + "os" + "path" + "path/filepath" + "strings" + "time" +) + +type httpDir struct { + basePath string + fs HttpFs +} + +func (d httpDir) Open(name string) (http.File, error) { + if filepath.Separator != '/' && strings.IndexRune(name, filepath.Separator) >= 0 || + strings.Contains(name, "\x00") { + return nil, errors.New("http: invalid character in file path") + } + dir := string(d.basePath) + if dir == "" { + dir = "." + } + + f, err := d.fs.Open(filepath.Join(dir, filepath.FromSlash(path.Clean("/"+name)))) + if err != nil { + return nil, err + } + return f, nil +} + +type HttpFs struct { + source Fs +} + +func NewHttpFs(source Fs) *HttpFs { + return &HttpFs{source: source} +} + +func (h HttpFs) Dir(s string) *httpDir { + return &httpDir{basePath: s, fs: h} +} + +func (h HttpFs) Name() string { return "h HttpFs" } + +func (h HttpFs) Create(name string) (File, error) { + return h.source.Create(name) +} + +func (h HttpFs) Chmod(name string, mode os.FileMode) error { + return h.source.Chmod(name, mode) +} + +func (h HttpFs) Chtimes(name string, atime time.Time, mtime time.Time) error { + return h.source.Chtimes(name, atime, mtime) +} + +func (h HttpFs) Mkdir(name string, perm os.FileMode) error { + return h.source.Mkdir(name, perm) +} + +func (h HttpFs) MkdirAll(path string, perm os.FileMode) error { + return h.source.MkdirAll(path, perm) +} + +func (h HttpFs) Open(name string) (http.File, error) { + f, err := h.source.Open(name) + if err == nil { + if httpfile, ok := f.(http.File); ok { + return httpfile, nil + } + } + return nil, err +} + +func (h HttpFs) OpenFile(name string, flag int, perm os.FileMode) (File, error) { + return h.source.OpenFile(name, flag, perm) +} + +func (h HttpFs) Remove(name string) error { + return h.source.Remove(name) +} + +func (h HttpFs) RemoveAll(path string) error { + return h.source.RemoveAll(path) +} + +func (h HttpFs) Rename(oldname, newname string) error { + return h.source.Rename(oldname, newname) +} + +func (h HttpFs) Stat(name string) (os.FileInfo, error) { + return h.source.Stat(name) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/ioutil.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/ioutil.go new file mode 100644 index 00000000..5c3a3d8f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/ioutil.go @@ -0,0 +1,230 @@ +// Copyright ©2015 The Go Authors +// Copyright ©2015 Steve Francia +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package afero + +import ( + "bytes" + "io" + "os" + "path/filepath" + "sort" + "strconv" + "sync" + "time" +) + +// byName implements sort.Interface. +type byName []os.FileInfo + +func (f byName) Len() int { return len(f) } +func (f byName) Less(i, j int) bool { return f[i].Name() < f[j].Name() } +func (f byName) Swap(i, j int) { f[i], f[j] = f[j], f[i] } + +// ReadDir reads the directory named by dirname and returns +// a list of sorted directory entries. +func (a Afero) ReadDir(dirname string) ([]os.FileInfo, error) { + return ReadDir(a.Fs, dirname) +} + +func ReadDir(fs Fs, dirname string) ([]os.FileInfo, error) { + f, err := fs.Open(dirname) + if err != nil { + return nil, err + } + list, err := f.Readdir(-1) + f.Close() + if err != nil { + return nil, err + } + sort.Sort(byName(list)) + return list, nil +} + +// ReadFile reads the file named by filename and returns the contents. +// A successful call returns err == nil, not err == EOF. Because ReadFile +// reads the whole file, it does not treat an EOF from Read as an error +// to be reported. +func (a Afero) ReadFile(filename string) ([]byte, error) { + return ReadFile(a.Fs, filename) +} + +func ReadFile(fs Fs, filename string) ([]byte, error) { + f, err := fs.Open(filename) + if err != nil { + return nil, err + } + defer f.Close() + // It's a good but not certain bet that FileInfo will tell us exactly how much to + // read, so let's try it but be prepared for the answer to be wrong. + var n int64 + + if fi, err := f.Stat(); err == nil { + // Don't preallocate a huge buffer, just in case. + if size := fi.Size(); size < 1e9 { + n = size + } + } + // As initial capacity for readAll, use n + a little extra in case Size is zero, + // and to avoid another allocation after Read has filled the buffer. The readAll + // call will read into its allocated internal buffer cheaply. If the size was + // wrong, we'll either waste some space off the end or reallocate as needed, but + // in the overwhelmingly common case we'll get it just right. + return readAll(f, n+bytes.MinRead) +} + +// readAll reads from r until an error or EOF and returns the data it read +// from the internal buffer allocated with a specified capacity. +func readAll(r io.Reader, capacity int64) (b []byte, err error) { + buf := bytes.NewBuffer(make([]byte, 0, capacity)) + // If the buffer overflows, we will get bytes.ErrTooLarge. + // Return that as an error. Any other panic remains. + defer func() { + e := recover() + if e == nil { + return + } + if panicErr, ok := e.(error); ok && panicErr == bytes.ErrTooLarge { + err = panicErr + } else { + panic(e) + } + }() + _, err = buf.ReadFrom(r) + return buf.Bytes(), err +} + +// ReadAll reads from r until an error or EOF and returns the data it read. +// A successful call returns err == nil, not err == EOF. Because ReadAll is +// defined to read from src until EOF, it does not treat an EOF from Read +// as an error to be reported. +func ReadAll(r io.Reader) ([]byte, error) { + return readAll(r, bytes.MinRead) +} + +// WriteFile writes data to a file named by filename. +// If the file does not exist, WriteFile creates it with permissions perm; +// otherwise WriteFile truncates it before writing. +func (a Afero) WriteFile(filename string, data []byte, perm os.FileMode) error { + return WriteFile(a.Fs, filename, data, perm) +} + +func WriteFile(fs Fs, filename string, data []byte, perm os.FileMode) error { + f, err := fs.OpenFile(filename, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, perm) + if err != nil { + return err + } + n, err := f.Write(data) + if err == nil && n < len(data) { + err = io.ErrShortWrite + } + if err1 := f.Close(); err == nil { + err = err1 + } + return err +} + +// Random number state. +// We generate random temporary file names so that there's a good +// chance the file doesn't exist yet - keeps the number of tries in +// TempFile to a minimum. +var rand uint32 +var randmu sync.Mutex + +func reseed() uint32 { + return uint32(time.Now().UnixNano() + int64(os.Getpid())) +} + +func nextSuffix() string { + randmu.Lock() + r := rand + if r == 0 { + r = reseed() + } + r = r*1664525 + 1013904223 // constants from Numerical Recipes + rand = r + randmu.Unlock() + return strconv.Itoa(int(1e9 + r%1e9))[1:] +} + +// TempFile creates a new temporary file in the directory dir +// with a name beginning with prefix, opens the file for reading +// and writing, and returns the resulting *File. +// If dir is the empty string, TempFile uses the default directory +// for temporary files (see os.TempDir). +// Multiple programs calling TempFile simultaneously +// will not choose the same file. The caller can use f.Name() +// to find the pathname of the file. It is the caller's responsibility +// to remove the file when no longer needed. +func (a Afero) TempFile(dir, prefix string) (f File, err error) { + return TempFile(a.Fs, dir, prefix) +} + +func TempFile(fs Fs, dir, prefix string) (f File, err error) { + if dir == "" { + dir = os.TempDir() + } + + nconflict := 0 + for i := 0; i < 10000; i++ { + name := filepath.Join(dir, prefix+nextSuffix()) + f, err = fs.OpenFile(name, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0600) + if os.IsExist(err) { + if nconflict++; nconflict > 10 { + randmu.Lock() + rand = reseed() + randmu.Unlock() + } + continue + } + break + } + return +} + +// TempDir creates a new temporary directory in the directory dir +// with a name beginning with prefix and returns the path of the +// new directory. If dir is the empty string, TempDir uses the +// default directory for temporary files (see os.TempDir). +// Multiple programs calling TempDir simultaneously +// will not choose the same directory. It is the caller's responsibility +// to remove the directory when no longer needed. +func (a Afero) TempDir(dir, prefix string) (name string, err error) { + return TempDir(a.Fs, dir, prefix) +} +func TempDir(fs Fs, dir, prefix string) (name string, err error) { + if dir == "" { + dir = os.TempDir() + } + + nconflict := 0 + for i := 0; i < 10000; i++ { + try := filepath.Join(dir, prefix+nextSuffix()) + err = fs.Mkdir(try, 0700) + if os.IsExist(err) { + if nconflict++; nconflict > 10 { + randmu.Lock() + rand = reseed() + randmu.Unlock() + } + continue + } + if err == nil { + name = try + } + break + } + return +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/lstater.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/lstater.go new file mode 100644 index 00000000..89c1bfc0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/lstater.go @@ -0,0 +1,27 @@ +// Copyright © 2018 Steve Francia . +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package afero + +import ( + "os" +) + +// Lstater is an optional interface in Afero. It is only implemented by the +// filesystems saying so. +// It will call Lstat if the filesystem iself is, or it delegates to, the os filesystem. +// Else it will call Stat. +// In addtion to the FileInfo, it will return a boolean telling whether Lstat was called or not. +type Lstater interface { + LstatIfPossible(name string) (os.FileInfo, bool, error) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/match.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/match.go new file mode 100644 index 00000000..c18a87fb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/match.go @@ -0,0 +1,110 @@ +// Copyright © 2014 Steve Francia . +// Copyright 2009 The Go Authors. All rights reserved. + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package afero + +import ( + "path/filepath" + "sort" + "strings" +) + +// Glob returns the names of all files matching pattern or nil +// if there is no matching file. The syntax of patterns is the same +// as in Match. The pattern may describe hierarchical names such as +// /usr/*/bin/ed (assuming the Separator is '/'). +// +// Glob ignores file system errors such as I/O errors reading directories. +// The only possible returned error is ErrBadPattern, when pattern +// is malformed. +// +// This was adapted from (http://golang.org/pkg/path/filepath) and uses several +// built-ins from that package. +func Glob(fs Fs, pattern string) (matches []string, err error) { + if !hasMeta(pattern) { + // Lstat not supported by a ll filesystems. + if _, err = lstatIfPossible(fs, pattern); err != nil { + return nil, nil + } + return []string{pattern}, nil + } + + dir, file := filepath.Split(pattern) + switch dir { + case "": + dir = "." + case string(filepath.Separator): + // nothing + default: + dir = dir[0 : len(dir)-1] // chop off trailing separator + } + + if !hasMeta(dir) { + return glob(fs, dir, file, nil) + } + + var m []string + m, err = Glob(fs, dir) + if err != nil { + return + } + for _, d := range m { + matches, err = glob(fs, d, file, matches) + if err != nil { + return + } + } + return +} + +// glob searches for files matching pattern in the directory dir +// and appends them to matches. If the directory cannot be +// opened, it returns the existing matches. New matches are +// added in lexicographical order. +func glob(fs Fs, dir, pattern string, matches []string) (m []string, e error) { + m = matches + fi, err := fs.Stat(dir) + if err != nil { + return + } + if !fi.IsDir() { + return + } + d, err := fs.Open(dir) + if err != nil { + return + } + defer d.Close() + + names, _ := d.Readdirnames(-1) + sort.Strings(names) + + for _, n := range names { + matched, err := filepath.Match(pattern, n) + if err != nil { + return m, err + } + if matched { + m = append(m, filepath.Join(dir, n)) + } + } + return +} + +// hasMeta reports whether path contains any of the magic characters +// recognized by Match. +func hasMeta(path string) bool { + // TODO(niemeyer): Should other magic characters be added here? + return strings.IndexAny(path, "*?[") >= 0 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/mem/dir.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/mem/dir.go new file mode 100644 index 00000000..e104013f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/mem/dir.go @@ -0,0 +1,37 @@ +// Copyright © 2014 Steve Francia . +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package mem + +type Dir interface { + Len() int + Names() []string + Files() []*FileData + Add(*FileData) + Remove(*FileData) +} + +func RemoveFromMemDir(dir *FileData, f *FileData) { + dir.memDir.Remove(f) +} + +func AddToMemDir(dir *FileData, f *FileData) { + dir.memDir.Add(f) +} + +func InitializeDir(d *FileData) { + if d.memDir == nil { + d.dir = true + d.memDir = &DirMap{} + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/mem/dirmap.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/mem/dirmap.go new file mode 100644 index 00000000..03a57ee5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/mem/dirmap.go @@ -0,0 +1,43 @@ +// Copyright © 2015 Steve Francia . +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package mem + +import "sort" + +type DirMap map[string]*FileData + +func (m DirMap) Len() int { return len(m) } +func (m DirMap) Add(f *FileData) { m[f.name] = f } +func (m DirMap) Remove(f *FileData) { delete(m, f.name) } +func (m DirMap) Files() (files []*FileData) { + for _, f := range m { + files = append(files, f) + } + sort.Sort(filesSorter(files)) + return files +} + +// implement sort.Interface for []*FileData +type filesSorter []*FileData + +func (s filesSorter) Len() int { return len(s) } +func (s filesSorter) Swap(i, j int) { s[i], s[j] = s[j], s[i] } +func (s filesSorter) Less(i, j int) bool { return s[i].name < s[j].name } + +func (m DirMap) Names() (names []string) { + for x := range m { + names = append(names, x) + } + return names +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/mem/file.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/mem/file.go new file mode 100644 index 00000000..7af2fb56 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/mem/file.go @@ -0,0 +1,317 @@ +// Copyright © 2015 Steve Francia . +// Copyright 2013 tsuru authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package mem + +import ( + "bytes" + "errors" + "io" + "os" + "path/filepath" + "sync" + "sync/atomic" +) + +import "time" + +const FilePathSeparator = string(filepath.Separator) + +type File struct { + // atomic requires 64-bit alignment for struct field access + at int64 + readDirCount int64 + closed bool + readOnly bool + fileData *FileData +} + +func NewFileHandle(data *FileData) *File { + return &File{fileData: data} +} + +func NewReadOnlyFileHandle(data *FileData) *File { + return &File{fileData: data, readOnly: true} +} + +func (f File) Data() *FileData { + return f.fileData +} + +type FileData struct { + sync.Mutex + name string + data []byte + memDir Dir + dir bool + mode os.FileMode + modtime time.Time +} + +func (d *FileData) Name() string { + d.Lock() + defer d.Unlock() + return d.name +} + +func CreateFile(name string) *FileData { + return &FileData{name: name, mode: os.ModeTemporary, modtime: time.Now()} +} + +func CreateDir(name string) *FileData { + return &FileData{name: name, memDir: &DirMap{}, dir: true} +} + +func ChangeFileName(f *FileData, newname string) { + f.Lock() + f.name = newname + f.Unlock() +} + +func SetMode(f *FileData, mode os.FileMode) { + f.Lock() + f.mode = mode + f.Unlock() +} + +func SetModTime(f *FileData, mtime time.Time) { + f.Lock() + setModTime(f, mtime) + f.Unlock() +} + +func setModTime(f *FileData, mtime time.Time) { + f.modtime = mtime +} + +func GetFileInfo(f *FileData) *FileInfo { + return &FileInfo{f} +} + +func (f *File) Open() error { + atomic.StoreInt64(&f.at, 0) + atomic.StoreInt64(&f.readDirCount, 0) + f.fileData.Lock() + f.closed = false + f.fileData.Unlock() + return nil +} + +func (f *File) Close() error { + f.fileData.Lock() + f.closed = true + if !f.readOnly { + setModTime(f.fileData, time.Now()) + } + f.fileData.Unlock() + return nil +} + +func (f *File) Name() string { + return f.fileData.Name() +} + +func (f *File) Stat() (os.FileInfo, error) { + return &FileInfo{f.fileData}, nil +} + +func (f *File) Sync() error { + return nil +} + +func (f *File) Readdir(count int) (res []os.FileInfo, err error) { + if !f.fileData.dir { + return nil, &os.PathError{Op: "readdir", Path: f.fileData.name, Err: errors.New("not a dir")} + } + var outLength int64 + + f.fileData.Lock() + files := f.fileData.memDir.Files()[f.readDirCount:] + if count > 0 { + if len(files) < count { + outLength = int64(len(files)) + } else { + outLength = int64(count) + } + if len(files) == 0 { + err = io.EOF + } + } else { + outLength = int64(len(files)) + } + f.readDirCount += outLength + f.fileData.Unlock() + + res = make([]os.FileInfo, outLength) + for i := range res { + res[i] = &FileInfo{files[i]} + } + + return res, err +} + +func (f *File) Readdirnames(n int) (names []string, err error) { + fi, err := f.Readdir(n) + names = make([]string, len(fi)) + for i, f := range fi { + _, names[i] = filepath.Split(f.Name()) + } + return names, err +} + +func (f *File) Read(b []byte) (n int, err error) { + f.fileData.Lock() + defer f.fileData.Unlock() + if f.closed == true { + return 0, ErrFileClosed + } + if len(b) > 0 && int(f.at) == len(f.fileData.data) { + return 0, io.EOF + } + if int(f.at) > len(f.fileData.data) { + return 0, io.ErrUnexpectedEOF + } + if len(f.fileData.data)-int(f.at) >= len(b) { + n = len(b) + } else { + n = len(f.fileData.data) - int(f.at) + } + copy(b, f.fileData.data[f.at:f.at+int64(n)]) + atomic.AddInt64(&f.at, int64(n)) + return +} + +func (f *File) ReadAt(b []byte, off int64) (n int, err error) { + atomic.StoreInt64(&f.at, off) + return f.Read(b) +} + +func (f *File) Truncate(size int64) error { + if f.closed == true { + return ErrFileClosed + } + if f.readOnly { + return &os.PathError{Op: "truncate", Path: f.fileData.name, Err: errors.New("file handle is read only")} + } + if size < 0 { + return ErrOutOfRange + } + if size > int64(len(f.fileData.data)) { + diff := size - int64(len(f.fileData.data)) + f.fileData.data = append(f.fileData.data, bytes.Repeat([]byte{00}, int(diff))...) + } else { + f.fileData.data = f.fileData.data[0:size] + } + setModTime(f.fileData, time.Now()) + return nil +} + +func (f *File) Seek(offset int64, whence int) (int64, error) { + if f.closed == true { + return 0, ErrFileClosed + } + switch whence { + case 0: + atomic.StoreInt64(&f.at, offset) + case 1: + atomic.AddInt64(&f.at, int64(offset)) + case 2: + atomic.StoreInt64(&f.at, int64(len(f.fileData.data))+offset) + } + return f.at, nil +} + +func (f *File) Write(b []byte) (n int, err error) { + if f.readOnly { + return 0, &os.PathError{Op: "write", Path: f.fileData.name, Err: errors.New("file handle is read only")} + } + n = len(b) + cur := atomic.LoadInt64(&f.at) + f.fileData.Lock() + defer f.fileData.Unlock() + diff := cur - int64(len(f.fileData.data)) + var tail []byte + if n+int(cur) < len(f.fileData.data) { + tail = f.fileData.data[n+int(cur):] + } + if diff > 0 { + f.fileData.data = append(bytes.Repeat([]byte{00}, int(diff)), b...) + f.fileData.data = append(f.fileData.data, tail...) + } else { + f.fileData.data = append(f.fileData.data[:cur], b...) + f.fileData.data = append(f.fileData.data, tail...) + } + setModTime(f.fileData, time.Now()) + + atomic.StoreInt64(&f.at, int64(len(f.fileData.data))) + return +} + +func (f *File) WriteAt(b []byte, off int64) (n int, err error) { + atomic.StoreInt64(&f.at, off) + return f.Write(b) +} + +func (f *File) WriteString(s string) (ret int, err error) { + return f.Write([]byte(s)) +} + +func (f *File) Info() *FileInfo { + return &FileInfo{f.fileData} +} + +type FileInfo struct { + *FileData +} + +// Implements os.FileInfo +func (s *FileInfo) Name() string { + s.Lock() + _, name := filepath.Split(s.name) + s.Unlock() + return name +} +func (s *FileInfo) Mode() os.FileMode { + s.Lock() + defer s.Unlock() + return s.mode +} +func (s *FileInfo) ModTime() time.Time { + s.Lock() + defer s.Unlock() + return s.modtime +} +func (s *FileInfo) IsDir() bool { + s.Lock() + defer s.Unlock() + return s.dir +} +func (s *FileInfo) Sys() interface{} { return nil } +func (s *FileInfo) Size() int64 { + if s.IsDir() { + return int64(42) + } + s.Lock() + defer s.Unlock() + return int64(len(s.data)) +} + +var ( + ErrFileClosed = errors.New("File is closed") + ErrOutOfRange = errors.New("Out of range") + ErrTooLarge = errors.New("Too large") + ErrFileNotFound = os.ErrNotExist + ErrFileExists = os.ErrExist + ErrDestinationExists = os.ErrExist +) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/memmap.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/memmap.go new file mode 100644 index 00000000..09498e70 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/memmap.go @@ -0,0 +1,365 @@ +// Copyright © 2014 Steve Francia . +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package afero + +import ( + "fmt" + "log" + "os" + "path/filepath" + "strings" + "sync" + "time" + + "github.com/spf13/afero/mem" +) + +type MemMapFs struct { + mu sync.RWMutex + data map[string]*mem.FileData + init sync.Once +} + +func NewMemMapFs() Fs { + return &MemMapFs{} +} + +func (m *MemMapFs) getData() map[string]*mem.FileData { + m.init.Do(func() { + m.data = make(map[string]*mem.FileData) + // Root should always exist, right? + // TODO: what about windows? + m.data[FilePathSeparator] = mem.CreateDir(FilePathSeparator) + }) + return m.data +} + +func (*MemMapFs) Name() string { return "MemMapFS" } + +func (m *MemMapFs) Create(name string) (File, error) { + name = normalizePath(name) + m.mu.Lock() + file := mem.CreateFile(name) + m.getData()[name] = file + m.registerWithParent(file) + m.mu.Unlock() + return mem.NewFileHandle(file), nil +} + +func (m *MemMapFs) unRegisterWithParent(fileName string) error { + f, err := m.lockfreeOpen(fileName) + if err != nil { + return err + } + parent := m.findParent(f) + if parent == nil { + log.Panic("parent of ", f.Name(), " is nil") + } + + parent.Lock() + mem.RemoveFromMemDir(parent, f) + parent.Unlock() + return nil +} + +func (m *MemMapFs) findParent(f *mem.FileData) *mem.FileData { + pdir, _ := filepath.Split(f.Name()) + pdir = filepath.Clean(pdir) + pfile, err := m.lockfreeOpen(pdir) + if err != nil { + return nil + } + return pfile +} + +func (m *MemMapFs) registerWithParent(f *mem.FileData) { + if f == nil { + return + } + parent := m.findParent(f) + if parent == nil { + pdir := filepath.Dir(filepath.Clean(f.Name())) + err := m.lockfreeMkdir(pdir, 0777) + if err != nil { + //log.Println("Mkdir error:", err) + return + } + parent, err = m.lockfreeOpen(pdir) + if err != nil { + //log.Println("Open after Mkdir error:", err) + return + } + } + + parent.Lock() + mem.InitializeDir(parent) + mem.AddToMemDir(parent, f) + parent.Unlock() +} + +func (m *MemMapFs) lockfreeMkdir(name string, perm os.FileMode) error { + name = normalizePath(name) + x, ok := m.getData()[name] + if ok { + // Only return ErrFileExists if it's a file, not a directory. + i := mem.FileInfo{FileData: x} + if !i.IsDir() { + return ErrFileExists + } + } else { + item := mem.CreateDir(name) + m.getData()[name] = item + m.registerWithParent(item) + } + return nil +} + +func (m *MemMapFs) Mkdir(name string, perm os.FileMode) error { + name = normalizePath(name) + + m.mu.RLock() + _, ok := m.getData()[name] + m.mu.RUnlock() + if ok { + return &os.PathError{Op: "mkdir", Path: name, Err: ErrFileExists} + } + + m.mu.Lock() + item := mem.CreateDir(name) + m.getData()[name] = item + m.registerWithParent(item) + m.mu.Unlock() + + m.Chmod(name, perm|os.ModeDir) + + return nil +} + +func (m *MemMapFs) MkdirAll(path string, perm os.FileMode) error { + err := m.Mkdir(path, perm) + if err != nil { + if err.(*os.PathError).Err == ErrFileExists { + return nil + } + return err + } + return nil +} + +// Handle some relative paths +func normalizePath(path string) string { + path = filepath.Clean(path) + + switch path { + case ".": + return FilePathSeparator + case "..": + return FilePathSeparator + default: + return path + } +} + +func (m *MemMapFs) Open(name string) (File, error) { + f, err := m.open(name) + if f != nil { + return mem.NewReadOnlyFileHandle(f), err + } + return nil, err +} + +func (m *MemMapFs) openWrite(name string) (File, error) { + f, err := m.open(name) + if f != nil { + return mem.NewFileHandle(f), err + } + return nil, err +} + +func (m *MemMapFs) open(name string) (*mem.FileData, error) { + name = normalizePath(name) + + m.mu.RLock() + f, ok := m.getData()[name] + m.mu.RUnlock() + if !ok { + return nil, &os.PathError{Op: "open", Path: name, Err: ErrFileNotFound} + } + return f, nil +} + +func (m *MemMapFs) lockfreeOpen(name string) (*mem.FileData, error) { + name = normalizePath(name) + f, ok := m.getData()[name] + if ok { + return f, nil + } else { + return nil, ErrFileNotFound + } +} + +func (m *MemMapFs) OpenFile(name string, flag int, perm os.FileMode) (File, error) { + chmod := false + file, err := m.openWrite(name) + if os.IsNotExist(err) && (flag&os.O_CREATE > 0) { + file, err = m.Create(name) + chmod = true + } + if err != nil { + return nil, err + } + if flag == os.O_RDONLY { + file = mem.NewReadOnlyFileHandle(file.(*mem.File).Data()) + } + if flag&os.O_APPEND > 0 { + _, err = file.Seek(0, os.SEEK_END) + if err != nil { + file.Close() + return nil, err + } + } + if flag&os.O_TRUNC > 0 && flag&(os.O_RDWR|os.O_WRONLY) > 0 { + err = file.Truncate(0) + if err != nil { + file.Close() + return nil, err + } + } + if chmod { + m.Chmod(name, perm) + } + return file, nil +} + +func (m *MemMapFs) Remove(name string) error { + name = normalizePath(name) + + m.mu.Lock() + defer m.mu.Unlock() + + if _, ok := m.getData()[name]; ok { + err := m.unRegisterWithParent(name) + if err != nil { + return &os.PathError{Op: "remove", Path: name, Err: err} + } + delete(m.getData(), name) + } else { + return &os.PathError{Op: "remove", Path: name, Err: os.ErrNotExist} + } + return nil +} + +func (m *MemMapFs) RemoveAll(path string) error { + path = normalizePath(path) + m.mu.Lock() + m.unRegisterWithParent(path) + m.mu.Unlock() + + m.mu.RLock() + defer m.mu.RUnlock() + + for p, _ := range m.getData() { + if strings.HasPrefix(p, path) { + m.mu.RUnlock() + m.mu.Lock() + delete(m.getData(), p) + m.mu.Unlock() + m.mu.RLock() + } + } + return nil +} + +func (m *MemMapFs) Rename(oldname, newname string) error { + oldname = normalizePath(oldname) + newname = normalizePath(newname) + + if oldname == newname { + return nil + } + + m.mu.RLock() + defer m.mu.RUnlock() + if _, ok := m.getData()[oldname]; ok { + m.mu.RUnlock() + m.mu.Lock() + m.unRegisterWithParent(oldname) + fileData := m.getData()[oldname] + delete(m.getData(), oldname) + mem.ChangeFileName(fileData, newname) + m.getData()[newname] = fileData + m.registerWithParent(fileData) + m.mu.Unlock() + m.mu.RLock() + } else { + return &os.PathError{Op: "rename", Path: oldname, Err: ErrFileNotFound} + } + return nil +} + +func (m *MemMapFs) Stat(name string) (os.FileInfo, error) { + f, err := m.Open(name) + if err != nil { + return nil, err + } + fi := mem.GetFileInfo(f.(*mem.File).Data()) + return fi, nil +} + +func (m *MemMapFs) Chmod(name string, mode os.FileMode) error { + name = normalizePath(name) + + m.mu.RLock() + f, ok := m.getData()[name] + m.mu.RUnlock() + if !ok { + return &os.PathError{Op: "chmod", Path: name, Err: ErrFileNotFound} + } + + m.mu.Lock() + mem.SetMode(f, mode) + m.mu.Unlock() + + return nil +} + +func (m *MemMapFs) Chtimes(name string, atime time.Time, mtime time.Time) error { + name = normalizePath(name) + + m.mu.RLock() + f, ok := m.getData()[name] + m.mu.RUnlock() + if !ok { + return &os.PathError{Op: "chtimes", Path: name, Err: ErrFileNotFound} + } + + m.mu.Lock() + mem.SetModTime(f, mtime) + m.mu.Unlock() + + return nil +} + +func (m *MemMapFs) List() { + for _, x := range m.data { + y := mem.FileInfo{FileData: x} + fmt.Println(x.Name(), y.Size()) + } +} + +// func debugMemMapList(fs Fs) { +// if x, ok := fs.(*MemMapFs); ok { +// x.List() +// } +// } diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/os.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/os.go new file mode 100644 index 00000000..13cc1b84 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/os.go @@ -0,0 +1,101 @@ +// Copyright © 2014 Steve Francia . +// Copyright 2013 tsuru authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package afero + +import ( + "os" + "time" +) + +var _ Lstater = (*OsFs)(nil) + +// OsFs is a Fs implementation that uses functions provided by the os package. +// +// For details in any method, check the documentation of the os package +// (http://golang.org/pkg/os/). +type OsFs struct{} + +func NewOsFs() Fs { + return &OsFs{} +} + +func (OsFs) Name() string { return "OsFs" } + +func (OsFs) Create(name string) (File, error) { + f, e := os.Create(name) + if f == nil { + // while this looks strange, we need to return a bare nil (of type nil) not + // a nil value of type *os.File or nil won't be nil + return nil, e + } + return f, e +} + +func (OsFs) Mkdir(name string, perm os.FileMode) error { + return os.Mkdir(name, perm) +} + +func (OsFs) MkdirAll(path string, perm os.FileMode) error { + return os.MkdirAll(path, perm) +} + +func (OsFs) Open(name string) (File, error) { + f, e := os.Open(name) + if f == nil { + // while this looks strange, we need to return a bare nil (of type nil) not + // a nil value of type *os.File or nil won't be nil + return nil, e + } + return f, e +} + +func (OsFs) OpenFile(name string, flag int, perm os.FileMode) (File, error) { + f, e := os.OpenFile(name, flag, perm) + if f == nil { + // while this looks strange, we need to return a bare nil (of type nil) not + // a nil value of type *os.File or nil won't be nil + return nil, e + } + return f, e +} + +func (OsFs) Remove(name string) error { + return os.Remove(name) +} + +func (OsFs) RemoveAll(path string) error { + return os.RemoveAll(path) +} + +func (OsFs) Rename(oldname, newname string) error { + return os.Rename(oldname, newname) +} + +func (OsFs) Stat(name string) (os.FileInfo, error) { + return os.Stat(name) +} + +func (OsFs) Chmod(name string, mode os.FileMode) error { + return os.Chmod(name, mode) +} + +func (OsFs) Chtimes(name string, atime time.Time, mtime time.Time) error { + return os.Chtimes(name, atime, mtime) +} + +func (OsFs) LstatIfPossible(name string) (os.FileInfo, bool, error) { + fi, err := os.Lstat(name) + return fi, true, err +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/path.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/path.go new file mode 100644 index 00000000..18f60a0f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/path.go @@ -0,0 +1,106 @@ +// Copyright ©2015 The Go Authors +// Copyright ©2015 Steve Francia +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package afero + +import ( + "os" + "path/filepath" + "sort" +) + +// readDirNames reads the directory named by dirname and returns +// a sorted list of directory entries. +// adapted from https://golang.org/src/path/filepath/path.go +func readDirNames(fs Fs, dirname string) ([]string, error) { + f, err := fs.Open(dirname) + if err != nil { + return nil, err + } + names, err := f.Readdirnames(-1) + f.Close() + if err != nil { + return nil, err + } + sort.Strings(names) + return names, nil +} + +// walk recursively descends path, calling walkFn +// adapted from https://golang.org/src/path/filepath/path.go +func walk(fs Fs, path string, info os.FileInfo, walkFn filepath.WalkFunc) error { + err := walkFn(path, info, nil) + if err != nil { + if info.IsDir() && err == filepath.SkipDir { + return nil + } + return err + } + + if !info.IsDir() { + return nil + } + + names, err := readDirNames(fs, path) + if err != nil { + return walkFn(path, info, err) + } + + for _, name := range names { + filename := filepath.Join(path, name) + fileInfo, err := lstatIfPossible(fs, filename) + if err != nil { + if err := walkFn(filename, fileInfo, err); err != nil && err != filepath.SkipDir { + return err + } + } else { + err = walk(fs, filename, fileInfo, walkFn) + if err != nil { + if !fileInfo.IsDir() || err != filepath.SkipDir { + return err + } + } + } + } + return nil +} + +// if the filesystem supports it, use Lstat, else use fs.Stat +func lstatIfPossible(fs Fs, path string) (os.FileInfo, error) { + if lfs, ok := fs.(Lstater); ok { + fi, _, err := lfs.LstatIfPossible(path) + return fi, err + } + return fs.Stat(path) +} + +// Walk walks the file tree rooted at root, calling walkFn for each file or +// directory in the tree, including root. All errors that arise visiting files +// and directories are filtered by walkFn. The files are walked in lexical +// order, which makes the output deterministic but means that for very +// large directories Walk can be inefficient. +// Walk does not follow symbolic links. + +func (a Afero) Walk(root string, walkFn filepath.WalkFunc) error { + return Walk(a.Fs, root, walkFn) +} + +func Walk(fs Fs, root string, walkFn filepath.WalkFunc) error { + info, err := lstatIfPossible(fs, root) + if err != nil { + return walkFn(root, nil, err) + } + return walk(fs, root, info, walkFn) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/readonlyfs.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/readonlyfs.go new file mode 100644 index 00000000..c6376ec3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/readonlyfs.go @@ -0,0 +1,80 @@ +package afero + +import ( + "os" + "syscall" + "time" +) + +var _ Lstater = (*ReadOnlyFs)(nil) + +type ReadOnlyFs struct { + source Fs +} + +func NewReadOnlyFs(source Fs) Fs { + return &ReadOnlyFs{source: source} +} + +func (r *ReadOnlyFs) ReadDir(name string) ([]os.FileInfo, error) { + return ReadDir(r.source, name) +} + +func (r *ReadOnlyFs) Chtimes(n string, a, m time.Time) error { + return syscall.EPERM +} + +func (r *ReadOnlyFs) Chmod(n string, m os.FileMode) error { + return syscall.EPERM +} + +func (r *ReadOnlyFs) Name() string { + return "ReadOnlyFilter" +} + +func (r *ReadOnlyFs) Stat(name string) (os.FileInfo, error) { + return r.source.Stat(name) +} + +func (r *ReadOnlyFs) LstatIfPossible(name string) (os.FileInfo, bool, error) { + if lsf, ok := r.source.(Lstater); ok { + return lsf.LstatIfPossible(name) + } + fi, err := r.Stat(name) + return fi, false, err +} + +func (r *ReadOnlyFs) Rename(o, n string) error { + return syscall.EPERM +} + +func (r *ReadOnlyFs) RemoveAll(p string) error { + return syscall.EPERM +} + +func (r *ReadOnlyFs) Remove(n string) error { + return syscall.EPERM +} + +func (r *ReadOnlyFs) OpenFile(name string, flag int, perm os.FileMode) (File, error) { + if flag&(os.O_WRONLY|syscall.O_RDWR|os.O_APPEND|os.O_CREATE|os.O_TRUNC) != 0 { + return nil, syscall.EPERM + } + return r.source.OpenFile(name, flag, perm) +} + +func (r *ReadOnlyFs) Open(n string) (File, error) { + return r.source.Open(n) +} + +func (r *ReadOnlyFs) Mkdir(n string, p os.FileMode) error { + return syscall.EPERM +} + +func (r *ReadOnlyFs) MkdirAll(n string, p os.FileMode) error { + return syscall.EPERM +} + +func (r *ReadOnlyFs) Create(n string) (File, error) { + return nil, syscall.EPERM +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/regexpfs.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/regexpfs.go new file mode 100644 index 00000000..9d92dbc0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/regexpfs.go @@ -0,0 +1,214 @@ +package afero + +import ( + "os" + "regexp" + "syscall" + "time" +) + +// The RegexpFs filters files (not directories) by regular expression. Only +// files matching the given regexp will be allowed, all others get a ENOENT error ( +// "No such file or directory"). +// +type RegexpFs struct { + re *regexp.Regexp + source Fs +} + +func NewRegexpFs(source Fs, re *regexp.Regexp) Fs { + return &RegexpFs{source: source, re: re} +} + +type RegexpFile struct { + f File + re *regexp.Regexp +} + +func (r *RegexpFs) matchesName(name string) error { + if r.re == nil { + return nil + } + if r.re.MatchString(name) { + return nil + } + return syscall.ENOENT +} + +func (r *RegexpFs) dirOrMatches(name string) error { + dir, err := IsDir(r.source, name) + if err != nil { + return err + } + if dir { + return nil + } + return r.matchesName(name) +} + +func (r *RegexpFs) Chtimes(name string, a, m time.Time) error { + if err := r.dirOrMatches(name); err != nil { + return err + } + return r.source.Chtimes(name, a, m) +} + +func (r *RegexpFs) Chmod(name string, mode os.FileMode) error { + if err := r.dirOrMatches(name); err != nil { + return err + } + return r.source.Chmod(name, mode) +} + +func (r *RegexpFs) Name() string { + return "RegexpFs" +} + +func (r *RegexpFs) Stat(name string) (os.FileInfo, error) { + if err := r.dirOrMatches(name); err != nil { + return nil, err + } + return r.source.Stat(name) +} + +func (r *RegexpFs) Rename(oldname, newname string) error { + dir, err := IsDir(r.source, oldname) + if err != nil { + return err + } + if dir { + return nil + } + if err := r.matchesName(oldname); err != nil { + return err + } + if err := r.matchesName(newname); err != nil { + return err + } + return r.source.Rename(oldname, newname) +} + +func (r *RegexpFs) RemoveAll(p string) error { + dir, err := IsDir(r.source, p) + if err != nil { + return err + } + if !dir { + if err := r.matchesName(p); err != nil { + return err + } + } + return r.source.RemoveAll(p) +} + +func (r *RegexpFs) Remove(name string) error { + if err := r.dirOrMatches(name); err != nil { + return err + } + return r.source.Remove(name) +} + +func (r *RegexpFs) OpenFile(name string, flag int, perm os.FileMode) (File, error) { + if err := r.dirOrMatches(name); err != nil { + return nil, err + } + return r.source.OpenFile(name, flag, perm) +} + +func (r *RegexpFs) Open(name string) (File, error) { + dir, err := IsDir(r.source, name) + if err != nil { + return nil, err + } + if !dir { + if err := r.matchesName(name); err != nil { + return nil, err + } + } + f, err := r.source.Open(name) + return &RegexpFile{f: f, re: r.re}, nil +} + +func (r *RegexpFs) Mkdir(n string, p os.FileMode) error { + return r.source.Mkdir(n, p) +} + +func (r *RegexpFs) MkdirAll(n string, p os.FileMode) error { + return r.source.MkdirAll(n, p) +} + +func (r *RegexpFs) Create(name string) (File, error) { + if err := r.matchesName(name); err != nil { + return nil, err + } + return r.source.Create(name) +} + +func (f *RegexpFile) Close() error { + return f.f.Close() +} + +func (f *RegexpFile) Read(s []byte) (int, error) { + return f.f.Read(s) +} + +func (f *RegexpFile) ReadAt(s []byte, o int64) (int, error) { + return f.f.ReadAt(s, o) +} + +func (f *RegexpFile) Seek(o int64, w int) (int64, error) { + return f.f.Seek(o, w) +} + +func (f *RegexpFile) Write(s []byte) (int, error) { + return f.f.Write(s) +} + +func (f *RegexpFile) WriteAt(s []byte, o int64) (int, error) { + return f.f.WriteAt(s, o) +} + +func (f *RegexpFile) Name() string { + return f.f.Name() +} + +func (f *RegexpFile) Readdir(c int) (fi []os.FileInfo, err error) { + var rfi []os.FileInfo + rfi, err = f.f.Readdir(c) + if err != nil { + return nil, err + } + for _, i := range rfi { + if i.IsDir() || f.re.MatchString(i.Name()) { + fi = append(fi, i) + } + } + return fi, nil +} + +func (f *RegexpFile) Readdirnames(c int) (n []string, err error) { + fi, err := f.Readdir(c) + if err != nil { + return nil, err + } + for _, s := range fi { + n = append(n, s.Name()) + } + return n, nil +} + +func (f *RegexpFile) Stat() (os.FileInfo, error) { + return f.f.Stat() +} + +func (f *RegexpFile) Sync() error { + return f.f.Sync() +} + +func (f *RegexpFile) Truncate(s int64) error { + return f.f.Truncate(s) +} + +func (f *RegexpFile) WriteString(s string) (int, error) { + return f.f.WriteString(s) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/unionFile.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/unionFile.go new file mode 100644 index 00000000..1e78f7d1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/unionFile.go @@ -0,0 +1,305 @@ +package afero + +import ( + "io" + "os" + "path/filepath" + "syscall" +) + +// The UnionFile implements the afero.File interface and will be returned +// when reading a directory present at least in the overlay or opening a file +// for writing. +// +// The calls to +// Readdir() and Readdirnames() merge the file os.FileInfo / names from the +// base and the overlay - for files present in both layers, only those +// from the overlay will be used. +// +// When opening files for writing (Create() / OpenFile() with the right flags) +// the operations will be done in both layers, starting with the overlay. A +// successful read in the overlay will move the cursor position in the base layer +// by the number of bytes read. +type UnionFile struct { + Base File + Layer File + Merger DirsMerger + off int + files []os.FileInfo +} + +func (f *UnionFile) Close() error { + // first close base, so we have a newer timestamp in the overlay. If we'd close + // the overlay first, we'd get a cacheStale the next time we access this file + // -> cache would be useless ;-) + if f.Base != nil { + f.Base.Close() + } + if f.Layer != nil { + return f.Layer.Close() + } + return BADFD +} + +func (f *UnionFile) Read(s []byte) (int, error) { + if f.Layer != nil { + n, err := f.Layer.Read(s) + if (err == nil || err == io.EOF) && f.Base != nil { + // advance the file position also in the base file, the next + // call may be a write at this position (or a seek with SEEK_CUR) + if _, seekErr := f.Base.Seek(int64(n), os.SEEK_CUR); seekErr != nil { + // only overwrite err in case the seek fails: we need to + // report an eventual io.EOF to the caller + err = seekErr + } + } + return n, err + } + if f.Base != nil { + return f.Base.Read(s) + } + return 0, BADFD +} + +func (f *UnionFile) ReadAt(s []byte, o int64) (int, error) { + if f.Layer != nil { + n, err := f.Layer.ReadAt(s, o) + if (err == nil || err == io.EOF) && f.Base != nil { + _, err = f.Base.Seek(o+int64(n), os.SEEK_SET) + } + return n, err + } + if f.Base != nil { + return f.Base.ReadAt(s, o) + } + return 0, BADFD +} + +func (f *UnionFile) Seek(o int64, w int) (pos int64, err error) { + if f.Layer != nil { + pos, err = f.Layer.Seek(o, w) + if (err == nil || err == io.EOF) && f.Base != nil { + _, err = f.Base.Seek(o, w) + } + return pos, err + } + if f.Base != nil { + return f.Base.Seek(o, w) + } + return 0, BADFD +} + +func (f *UnionFile) Write(s []byte) (n int, err error) { + if f.Layer != nil { + n, err = f.Layer.Write(s) + if err == nil && f.Base != nil { // hmm, do we have fixed size files where a write may hit the EOF mark? + _, err = f.Base.Write(s) + } + return n, err + } + if f.Base != nil { + return f.Base.Write(s) + } + return 0, BADFD +} + +func (f *UnionFile) WriteAt(s []byte, o int64) (n int, err error) { + if f.Layer != nil { + n, err = f.Layer.WriteAt(s, o) + if err == nil && f.Base != nil { + _, err = f.Base.WriteAt(s, o) + } + return n, err + } + if f.Base != nil { + return f.Base.WriteAt(s, o) + } + return 0, BADFD +} + +func (f *UnionFile) Name() string { + if f.Layer != nil { + return f.Layer.Name() + } + return f.Base.Name() +} + +// DirsMerger is how UnionFile weaves two directories together. +// It takes the FileInfo slices from the layer and the base and returns a +// single view. +type DirsMerger func(lofi, bofi []os.FileInfo) ([]os.FileInfo, error) + +var defaultUnionMergeDirsFn = func(lofi, bofi []os.FileInfo) ([]os.FileInfo, error) { + var files = make(map[string]os.FileInfo) + + for _, fi := range lofi { + files[fi.Name()] = fi + } + + for _, fi := range bofi { + if _, exists := files[fi.Name()]; !exists { + files[fi.Name()] = fi + } + } + + rfi := make([]os.FileInfo, len(files)) + + i := 0 + for _, fi := range files { + rfi[i] = fi + i++ + } + + return rfi, nil + +} + +// Readdir will weave the two directories together and +// return a single view of the overlayed directories +func (f *UnionFile) Readdir(c int) (ofi []os.FileInfo, err error) { + var merge DirsMerger = f.Merger + if merge == nil { + merge = defaultUnionMergeDirsFn + } + + if f.off == 0 { + var lfi []os.FileInfo + if f.Layer != nil { + lfi, err = f.Layer.Readdir(-1) + if err != nil { + return nil, err + } + } + + var bfi []os.FileInfo + if f.Base != nil { + bfi, err = f.Base.Readdir(-1) + if err != nil { + return nil, err + } + + } + merged, err := merge(lfi, bfi) + if err != nil { + return nil, err + } + f.files = append(f.files, merged...) + } + if c == -1 { + return f.files[f.off:], nil + } + defer func() { f.off += c }() + return f.files[f.off:c], nil +} + +func (f *UnionFile) Readdirnames(c int) ([]string, error) { + rfi, err := f.Readdir(c) + if err != nil { + return nil, err + } + var names []string + for _, fi := range rfi { + names = append(names, fi.Name()) + } + return names, nil +} + +func (f *UnionFile) Stat() (os.FileInfo, error) { + if f.Layer != nil { + return f.Layer.Stat() + } + if f.Base != nil { + return f.Base.Stat() + } + return nil, BADFD +} + +func (f *UnionFile) Sync() (err error) { + if f.Layer != nil { + err = f.Layer.Sync() + if err == nil && f.Base != nil { + err = f.Base.Sync() + } + return err + } + if f.Base != nil { + return f.Base.Sync() + } + return BADFD +} + +func (f *UnionFile) Truncate(s int64) (err error) { + if f.Layer != nil { + err = f.Layer.Truncate(s) + if err == nil && f.Base != nil { + err = f.Base.Truncate(s) + } + return err + } + if f.Base != nil { + return f.Base.Truncate(s) + } + return BADFD +} + +func (f *UnionFile) WriteString(s string) (n int, err error) { + if f.Layer != nil { + n, err = f.Layer.WriteString(s) + if err == nil && f.Base != nil { + _, err = f.Base.WriteString(s) + } + return n, err + } + if f.Base != nil { + return f.Base.WriteString(s) + } + return 0, BADFD +} + +func copyToLayer(base Fs, layer Fs, name string) error { + bfh, err := base.Open(name) + if err != nil { + return err + } + defer bfh.Close() + + // First make sure the directory exists + exists, err := Exists(layer, filepath.Dir(name)) + if err != nil { + return err + } + if !exists { + err = layer.MkdirAll(filepath.Dir(name), 0777) // FIXME? + if err != nil { + return err + } + } + + // Create the file on the overlay + lfh, err := layer.Create(name) + if err != nil { + return err + } + n, err := io.Copy(lfh, bfh) + if err != nil { + // If anything fails, clean up the file + layer.Remove(name) + lfh.Close() + return err + } + + bfi, err := bfh.Stat() + if err != nil || bfi.Size() != n { + layer.Remove(name) + lfh.Close() + return syscall.EIO + } + + err = lfh.Close() + if err != nil { + layer.Remove(name) + lfh.Close() + return err + } + return layer.Chtimes(name, bfi.ModTime(), bfi.ModTime()) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/util.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/util.go new file mode 100644 index 00000000..4f253f48 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/afero/util.go @@ -0,0 +1,330 @@ +// Copyright ©2015 Steve Francia +// Portions Copyright ©2015 The Hugo Authors +// Portions Copyright 2016-present Bjørn Erik Pedersen +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package afero + +import ( + "bytes" + "fmt" + "io" + "os" + "path/filepath" + "strings" + "unicode" + + "golang.org/x/text/transform" + "golang.org/x/text/unicode/norm" +) + +// Filepath separator defined by os.Separator. +const FilePathSeparator = string(filepath.Separator) + +// Takes a reader and a path and writes the content +func (a Afero) WriteReader(path string, r io.Reader) (err error) { + return WriteReader(a.Fs, path, r) +} + +func WriteReader(fs Fs, path string, r io.Reader) (err error) { + dir, _ := filepath.Split(path) + ospath := filepath.FromSlash(dir) + + if ospath != "" { + err = fs.MkdirAll(ospath, 0777) // rwx, rw, r + if err != nil { + if err != os.ErrExist { + return err + } + } + } + + file, err := fs.Create(path) + if err != nil { + return + } + defer file.Close() + + _, err = io.Copy(file, r) + return +} + +// Same as WriteReader but checks to see if file/directory already exists. +func (a Afero) SafeWriteReader(path string, r io.Reader) (err error) { + return SafeWriteReader(a.Fs, path, r) +} + +func SafeWriteReader(fs Fs, path string, r io.Reader) (err error) { + dir, _ := filepath.Split(path) + ospath := filepath.FromSlash(dir) + + if ospath != "" { + err = fs.MkdirAll(ospath, 0777) // rwx, rw, r + if err != nil { + return + } + } + + exists, err := Exists(fs, path) + if err != nil { + return + } + if exists { + return fmt.Errorf("%v already exists", path) + } + + file, err := fs.Create(path) + if err != nil { + return + } + defer file.Close() + + _, err = io.Copy(file, r) + return +} + +func (a Afero) GetTempDir(subPath string) string { + return GetTempDir(a.Fs, subPath) +} + +// GetTempDir returns the default temp directory with trailing slash +// if subPath is not empty then it will be created recursively with mode 777 rwx rwx rwx +func GetTempDir(fs Fs, subPath string) string { + addSlash := func(p string) string { + if FilePathSeparator != p[len(p)-1:] { + p = p + FilePathSeparator + } + return p + } + dir := addSlash(os.TempDir()) + + if subPath != "" { + // preserve windows backslash :-( + if FilePathSeparator == "\\" { + subPath = strings.Replace(subPath, "\\", "____", -1) + } + dir = dir + UnicodeSanitize((subPath)) + if FilePathSeparator == "\\" { + dir = strings.Replace(dir, "____", "\\", -1) + } + + if exists, _ := Exists(fs, dir); exists { + return addSlash(dir) + } + + err := fs.MkdirAll(dir, 0777) + if err != nil { + panic(err) + } + dir = addSlash(dir) + } + return dir +} + +// Rewrite string to remove non-standard path characters +func UnicodeSanitize(s string) string { + source := []rune(s) + target := make([]rune, 0, len(source)) + + for _, r := range source { + if unicode.IsLetter(r) || + unicode.IsDigit(r) || + unicode.IsMark(r) || + r == '.' || + r == '/' || + r == '\\' || + r == '_' || + r == '-' || + r == '%' || + r == ' ' || + r == '#' { + target = append(target, r) + } + } + + return string(target) +} + +// Transform characters with accents into plain forms. +func NeuterAccents(s string) string { + t := transform.Chain(norm.NFD, transform.RemoveFunc(isMn), norm.NFC) + result, _, _ := transform.String(t, string(s)) + + return result +} + +func isMn(r rune) bool { + return unicode.Is(unicode.Mn, r) // Mn: nonspacing marks +} + +func (a Afero) FileContainsBytes(filename string, subslice []byte) (bool, error) { + return FileContainsBytes(a.Fs, filename, subslice) +} + +// Check if a file contains a specified byte slice. +func FileContainsBytes(fs Fs, filename string, subslice []byte) (bool, error) { + f, err := fs.Open(filename) + if err != nil { + return false, err + } + defer f.Close() + + return readerContainsAny(f, subslice), nil +} + +func (a Afero) FileContainsAnyBytes(filename string, subslices [][]byte) (bool, error) { + return FileContainsAnyBytes(a.Fs, filename, subslices) +} + +// Check if a file contains any of the specified byte slices. +func FileContainsAnyBytes(fs Fs, filename string, subslices [][]byte) (bool, error) { + f, err := fs.Open(filename) + if err != nil { + return false, err + } + defer f.Close() + + return readerContainsAny(f, subslices...), nil +} + +// readerContains reports whether any of the subslices is within r. +func readerContainsAny(r io.Reader, subslices ...[]byte) bool { + + if r == nil || len(subslices) == 0 { + return false + } + + largestSlice := 0 + + for _, sl := range subslices { + if len(sl) > largestSlice { + largestSlice = len(sl) + } + } + + if largestSlice == 0 { + return false + } + + bufflen := largestSlice * 4 + halflen := bufflen / 2 + buff := make([]byte, bufflen) + var err error + var n, i int + + for { + i++ + if i == 1 { + n, err = io.ReadAtLeast(r, buff[:halflen], halflen) + } else { + if i != 2 { + // shift left to catch overlapping matches + copy(buff[:], buff[halflen:]) + } + n, err = io.ReadAtLeast(r, buff[halflen:], halflen) + } + + if n > 0 { + for _, sl := range subslices { + if bytes.Contains(buff, sl) { + return true + } + } + } + + if err != nil { + break + } + } + return false +} + +func (a Afero) DirExists(path string) (bool, error) { + return DirExists(a.Fs, path) +} + +// DirExists checks if a path exists and is a directory. +func DirExists(fs Fs, path string) (bool, error) { + fi, err := fs.Stat(path) + if err == nil && fi.IsDir() { + return true, nil + } + if os.IsNotExist(err) { + return false, nil + } + return false, err +} + +func (a Afero) IsDir(path string) (bool, error) { + return IsDir(a.Fs, path) +} + +// IsDir checks if a given path is a directory. +func IsDir(fs Fs, path string) (bool, error) { + fi, err := fs.Stat(path) + if err != nil { + return false, err + } + return fi.IsDir(), nil +} + +func (a Afero) IsEmpty(path string) (bool, error) { + return IsEmpty(a.Fs, path) +} + +// IsEmpty checks if a given file or directory is empty. +func IsEmpty(fs Fs, path string) (bool, error) { + if b, _ := Exists(fs, path); !b { + return false, fmt.Errorf("%q path does not exist", path) + } + fi, err := fs.Stat(path) + if err != nil { + return false, err + } + if fi.IsDir() { + f, err := fs.Open(path) + if err != nil { + return false, err + } + defer f.Close() + list, err := f.Readdir(-1) + return len(list) == 0, nil + } + return fi.Size() == 0, nil +} + +func (a Afero) Exists(path string) (bool, error) { + return Exists(a.Fs, path) +} + +// Check if a file or directory exists. +func Exists(fs Fs, path string) (bool, error) { + _, err := fs.Stat(path) + if err == nil { + return true, nil + } + if os.IsNotExist(err) { + return false, nil + } + return false, err +} + +func FullBaseFsPath(basePathFs *BasePathFs, relativePath string) string { + combinedPath := filepath.Join(basePathFs.path, relativePath) + if parent, ok := basePathFs.source.(*BasePathFs); ok { + return FullBaseFsPath(parent, combinedPath) + } + + return combinedPath +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cast/.gitignore b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cast/.gitignore new file mode 100644 index 00000000..53053a8a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cast/.gitignore @@ -0,0 +1,25 @@ +# Compiled Object files, Static and Dynamic libs (Shared Objects) +*.o +*.a +*.so + +# Folders +_obj +_test + +# Architecture specific extensions/prefixes +*.[568vq] +[568vq].out + +*.cgo1.go +*.cgo2.c +_cgo_defun.c +_cgo_gotypes.go +_cgo_export.* + +_testmain.go + +*.exe +*.test + +*.bench diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cast/.travis.yml b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cast/.travis.yml new file mode 100644 index 00000000..4da97668 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cast/.travis.yml @@ -0,0 +1,14 @@ +language: go +sudo: required +go: + - 1.7.5 + - 1.8 + - tip +os: + - linux +matrix: + allow_failures: + - go: tip + fast_finish: true +script: + - make check diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cast/LICENSE b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cast/LICENSE new file mode 100644 index 00000000..4527efb9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cast/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Steve Francia + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cast/Makefile b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cast/Makefile new file mode 100644 index 00000000..7ccf8930 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cast/Makefile @@ -0,0 +1,38 @@ +# A Self-Documenting Makefile: http://marmelab.com/blog/2016/02/29/auto-documented-makefile.html + +.PHONY: check fmt lint test test-race vet test-cover-html help +.DEFAULT_GOAL := help + +check: test-race fmt vet lint ## Run tests and linters + +test: ## Run tests + go test ./... + +test-race: ## Run tests with race detector + go test -race ./... + +fmt: ## Run gofmt linter + @for d in `go list` ; do \ + if [ "`gofmt -l -s $$GOPATH/src/$$d | tee /dev/stderr`" ]; then \ + echo "^ improperly formatted go files" && echo && exit 1; \ + fi \ + done + +lint: ## Run golint linter + @for d in `go list` ; do \ + if [ "`golint $$d | tee /dev/stderr`" ]; then \ + echo "^ golint errors!" && echo && exit 1; \ + fi \ + done + +vet: ## Run go vet linter + @if [ "`go vet | tee /dev/stderr`" ]; then \ + echo "^ go vet errors!" && echo && exit 1; \ + fi + +test-cover-html: ## Generate test coverage report + go test -coverprofile=coverage.out -covermode=count + go tool cover -func=coverage.out + +help: + @grep -E '^[a-zA-Z0-9_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cast/README.md b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cast/README.md new file mode 100644 index 00000000..e6939397 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cast/README.md @@ -0,0 +1,75 @@ +cast +==== +[![GoDoc](https://godoc.org/github.com/spf13/cast?status.svg)](https://godoc.org/github.com/spf13/cast) +[![Build Status](https://api.travis-ci.org/spf13/cast.svg?branch=master)](https://travis-ci.org/spf13/cast) +[![Go Report Card](https://goreportcard.com/badge/github.com/spf13/cast)](https://goreportcard.com/report/github.com/spf13/cast) + +Easy and safe casting from one type to another in Go + +Don’t Panic! ... Cast + +## What is Cast? + +Cast is a library to convert between different go types in a consistent and easy way. + +Cast provides simple functions to easily convert a number to a string, an +interface into a bool, etc. Cast does this intelligently when an obvious +conversion is possible. It doesn’t make any attempts to guess what you meant, +for example you can only convert a string to an int when it is a string +representation of an int such as “8â€. Cast was developed for use in +[Hugo](http://hugo.spf13.com), a website engine which uses YAML, TOML or JSON +for meta data. + +## Why use Cast? + +When working with dynamic data in Go you often need to cast or convert the data +from one type into another. Cast goes beyond just using type assertion (though +it uses that when possible) to provide a very straightforward and convenient +library. + +If you are working with interfaces to handle things like dynamic content +you’ll need an easy way to convert an interface into a given type. This +is the library for you. + +If you are taking in data from YAML, TOML or JSON or other formats which lack +full types, then Cast is the library for you. + +## Usage + +Cast provides a handful of To_____ methods. These methods will always return +the desired type. **If input is provided that will not convert to that type, the +0 or nil value for that type will be returned**. + +Cast also provides identical methods To_____E. These return the same result as +the To_____ methods, plus an additional error which tells you if it successfully +converted. Using these methods you can tell the difference between when the +input matched the zero value or when the conversion failed and the zero value +was returned. + +The following examples are merely a sample of what is available. Please review +the code for a complete set. + +### Example ‘ToString’: + + cast.ToString("mayonegg") // "mayonegg" + cast.ToString(8) // "8" + cast.ToString(8.31) // "8.31" + cast.ToString([]byte("one time")) // "one time" + cast.ToString(nil) // "" + + var foo interface{} = "one more time" + cast.ToString(foo) // "one more time" + + +### Example ‘ToInt’: + + cast.ToInt(8) // 8 + cast.ToInt(8.31) // 8 + cast.ToInt("8") // 8 + cast.ToInt(true) // 1 + cast.ToInt(false) // 0 + + var eight interface{} = 8 + cast.ToInt(eight) // 8 + cast.ToInt(nil) // 0 + diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cast/cast.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cast/cast.go new file mode 100644 index 00000000..8b8c208b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cast/cast.go @@ -0,0 +1,159 @@ +// Copyright © 2014 Steve Francia . +// +// Use of this source code is governed by an MIT-style +// license that can be found in the LICENSE file. + +// Package cast provides easy and safe casting in Go. +package cast + +import "time" + +// ToBool casts an interface to a bool type. +func ToBool(i interface{}) bool { + v, _ := ToBoolE(i) + return v +} + +// ToTime casts an interface to a time.Time type. +func ToTime(i interface{}) time.Time { + v, _ := ToTimeE(i) + return v +} + +// ToDuration casts an interface to a time.Duration type. +func ToDuration(i interface{}) time.Duration { + v, _ := ToDurationE(i) + return v +} + +// ToFloat64 casts an interface to a float64 type. +func ToFloat64(i interface{}) float64 { + v, _ := ToFloat64E(i) + return v +} + +// ToFloat32 casts an interface to a float32 type. +func ToFloat32(i interface{}) float32 { + v, _ := ToFloat32E(i) + return v +} + +// ToInt64 casts an interface to an int64 type. +func ToInt64(i interface{}) int64 { + v, _ := ToInt64E(i) + return v +} + +// ToInt32 casts an interface to an int32 type. +func ToInt32(i interface{}) int32 { + v, _ := ToInt32E(i) + return v +} + +// ToInt16 casts an interface to an int16 type. +func ToInt16(i interface{}) int16 { + v, _ := ToInt16E(i) + return v +} + +// ToInt8 casts an interface to an int8 type. +func ToInt8(i interface{}) int8 { + v, _ := ToInt8E(i) + return v +} + +// ToInt casts an interface to an int type. +func ToInt(i interface{}) int { + v, _ := ToIntE(i) + return v +} + +// ToUint casts an interface to a uint type. +func ToUint(i interface{}) uint { + v, _ := ToUintE(i) + return v +} + +// ToUint64 casts an interface to a uint64 type. +func ToUint64(i interface{}) uint64 { + v, _ := ToUint64E(i) + return v +} + +// ToUint32 casts an interface to a uint32 type. +func ToUint32(i interface{}) uint32 { + v, _ := ToUint32E(i) + return v +} + +// ToUint16 casts an interface to a uint16 type. +func ToUint16(i interface{}) uint16 { + v, _ := ToUint16E(i) + return v +} + +// ToUint8 casts an interface to a uint8 type. +func ToUint8(i interface{}) uint8 { + v, _ := ToUint8E(i) + return v +} + +// ToString casts an interface to a string type. +func ToString(i interface{}) string { + v, _ := ToStringE(i) + return v +} + +// ToStringMapString casts an interface to a map[string]string type. +func ToStringMapString(i interface{}) map[string]string { + v, _ := ToStringMapStringE(i) + return v +} + +// ToStringMapStringSlice casts an interface to a map[string][]string type. +func ToStringMapStringSlice(i interface{}) map[string][]string { + v, _ := ToStringMapStringSliceE(i) + return v +} + +// ToStringMapBool casts an interface to a map[string]bool type. +func ToStringMapBool(i interface{}) map[string]bool { + v, _ := ToStringMapBoolE(i) + return v +} + +// ToStringMap casts an interface to a map[string]interface{} type. +func ToStringMap(i interface{}) map[string]interface{} { + v, _ := ToStringMapE(i) + return v +} + +// ToSlice casts an interface to a []interface{} type. +func ToSlice(i interface{}) []interface{} { + v, _ := ToSliceE(i) + return v +} + +// ToBoolSlice casts an interface to a []bool type. +func ToBoolSlice(i interface{}) []bool { + v, _ := ToBoolSliceE(i) + return v +} + +// ToStringSlice casts an interface to a []string type. +func ToStringSlice(i interface{}) []string { + v, _ := ToStringSliceE(i) + return v +} + +// ToIntSlice casts an interface to a []int type. +func ToIntSlice(i interface{}) []int { + v, _ := ToIntSliceE(i) + return v +} + +// ToDurationSlice casts an interface to a []time.Duration type. +func ToDurationSlice(i interface{}) []time.Duration { + v, _ := ToDurationSliceE(i) + return v +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cast/caste.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cast/caste.go new file mode 100644 index 00000000..4fe19289 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cast/caste.go @@ -0,0 +1,1166 @@ +// Copyright © 2014 Steve Francia . +// +// Use of this source code is governed by an MIT-style +// license that can be found in the LICENSE file. + +package cast + +import ( + "encoding/json" + "errors" + "fmt" + "html/template" + "reflect" + "strconv" + "strings" + "time" +) + +var errNegativeNotAllowed = errors.New("unable to cast negative value") + +// ToTimeE casts an interface to a time.Time type. +func ToTimeE(i interface{}) (tim time.Time, err error) { + i = indirect(i) + + switch v := i.(type) { + case time.Time: + return v, nil + case string: + return StringToDate(v) + case int: + return time.Unix(int64(v), 0), nil + case int64: + return time.Unix(v, 0), nil + case int32: + return time.Unix(int64(v), 0), nil + case uint: + return time.Unix(int64(v), 0), nil + case uint64: + return time.Unix(int64(v), 0), nil + case uint32: + return time.Unix(int64(v), 0), nil + default: + return time.Time{}, fmt.Errorf("unable to cast %#v of type %T to Time", i, i) + } +} + +// ToDurationE casts an interface to a time.Duration type. +func ToDurationE(i interface{}) (d time.Duration, err error) { + i = indirect(i) + + switch s := i.(type) { + case time.Duration: + return s, nil + case int, int64, int32, int16, int8, uint, uint64, uint32, uint16, uint8: + d = time.Duration(ToInt64(s)) + return + case float32, float64: + d = time.Duration(ToFloat64(s)) + return + case string: + if strings.ContainsAny(s, "nsuµmh") { + d, err = time.ParseDuration(s) + } else { + d, err = time.ParseDuration(s + "ns") + } + return + default: + err = fmt.Errorf("unable to cast %#v of type %T to Duration", i, i) + return + } +} + +// ToBoolE casts an interface to a bool type. +func ToBoolE(i interface{}) (bool, error) { + i = indirect(i) + + switch b := i.(type) { + case bool: + return b, nil + case nil: + return false, nil + case int: + if i.(int) != 0 { + return true, nil + } + return false, nil + case string: + return strconv.ParseBool(i.(string)) + default: + return false, fmt.Errorf("unable to cast %#v of type %T to bool", i, i) + } +} + +// ToFloat64E casts an interface to a float64 type. +func ToFloat64E(i interface{}) (float64, error) { + i = indirect(i) + + switch s := i.(type) { + case float64: + return s, nil + case float32: + return float64(s), nil + case int: + return float64(s), nil + case int64: + return float64(s), nil + case int32: + return float64(s), nil + case int16: + return float64(s), nil + case int8: + return float64(s), nil + case uint: + return float64(s), nil + case uint64: + return float64(s), nil + case uint32: + return float64(s), nil + case uint16: + return float64(s), nil + case uint8: + return float64(s), nil + case string: + v, err := strconv.ParseFloat(s, 64) + if err == nil { + return v, nil + } + return 0, fmt.Errorf("unable to cast %#v of type %T to float64", i, i) + case bool: + if s { + return 1, nil + } + return 0, nil + default: + return 0, fmt.Errorf("unable to cast %#v of type %T to float64", i, i) + } +} + +// ToFloat32E casts an interface to a float32 type. +func ToFloat32E(i interface{}) (float32, error) { + i = indirect(i) + + switch s := i.(type) { + case float64: + return float32(s), nil + case float32: + return s, nil + case int: + return float32(s), nil + case int64: + return float32(s), nil + case int32: + return float32(s), nil + case int16: + return float32(s), nil + case int8: + return float32(s), nil + case uint: + return float32(s), nil + case uint64: + return float32(s), nil + case uint32: + return float32(s), nil + case uint16: + return float32(s), nil + case uint8: + return float32(s), nil + case string: + v, err := strconv.ParseFloat(s, 32) + if err == nil { + return float32(v), nil + } + return 0, fmt.Errorf("unable to cast %#v of type %T to float32", i, i) + case bool: + if s { + return 1, nil + } + return 0, nil + default: + return 0, fmt.Errorf("unable to cast %#v of type %T to float32", i, i) + } +} + +// ToInt64E casts an interface to an int64 type. +func ToInt64E(i interface{}) (int64, error) { + i = indirect(i) + + switch s := i.(type) { + case int: + return int64(s), nil + case int64: + return s, nil + case int32: + return int64(s), nil + case int16: + return int64(s), nil + case int8: + return int64(s), nil + case uint: + return int64(s), nil + case uint64: + return int64(s), nil + case uint32: + return int64(s), nil + case uint16: + return int64(s), nil + case uint8: + return int64(s), nil + case float64: + return int64(s), nil + case float32: + return int64(s), nil + case string: + v, err := strconv.ParseInt(s, 0, 0) + if err == nil { + return v, nil + } + return 0, fmt.Errorf("unable to cast %#v of type %T to int64", i, i) + case bool: + if s { + return 1, nil + } + return 0, nil + case nil: + return 0, nil + default: + return 0, fmt.Errorf("unable to cast %#v of type %T to int64", i, i) + } +} + +// ToInt32E casts an interface to an int32 type. +func ToInt32E(i interface{}) (int32, error) { + i = indirect(i) + + switch s := i.(type) { + case int: + return int32(s), nil + case int64: + return int32(s), nil + case int32: + return s, nil + case int16: + return int32(s), nil + case int8: + return int32(s), nil + case uint: + return int32(s), nil + case uint64: + return int32(s), nil + case uint32: + return int32(s), nil + case uint16: + return int32(s), nil + case uint8: + return int32(s), nil + case float64: + return int32(s), nil + case float32: + return int32(s), nil + case string: + v, err := strconv.ParseInt(s, 0, 0) + if err == nil { + return int32(v), nil + } + return 0, fmt.Errorf("unable to cast %#v of type %T to int32", i, i) + case bool: + if s { + return 1, nil + } + return 0, nil + case nil: + return 0, nil + default: + return 0, fmt.Errorf("unable to cast %#v of type %T to int32", i, i) + } +} + +// ToInt16E casts an interface to an int16 type. +func ToInt16E(i interface{}) (int16, error) { + i = indirect(i) + + switch s := i.(type) { + case int: + return int16(s), nil + case int64: + return int16(s), nil + case int32: + return int16(s), nil + case int16: + return s, nil + case int8: + return int16(s), nil + case uint: + return int16(s), nil + case uint64: + return int16(s), nil + case uint32: + return int16(s), nil + case uint16: + return int16(s), nil + case uint8: + return int16(s), nil + case float64: + return int16(s), nil + case float32: + return int16(s), nil + case string: + v, err := strconv.ParseInt(s, 0, 0) + if err == nil { + return int16(v), nil + } + return 0, fmt.Errorf("unable to cast %#v of type %T to int16", i, i) + case bool: + if s { + return 1, nil + } + return 0, nil + case nil: + return 0, nil + default: + return 0, fmt.Errorf("unable to cast %#v of type %T to int16", i, i) + } +} + +// ToInt8E casts an interface to an int8 type. +func ToInt8E(i interface{}) (int8, error) { + i = indirect(i) + + switch s := i.(type) { + case int: + return int8(s), nil + case int64: + return int8(s), nil + case int32: + return int8(s), nil + case int16: + return int8(s), nil + case int8: + return s, nil + case uint: + return int8(s), nil + case uint64: + return int8(s), nil + case uint32: + return int8(s), nil + case uint16: + return int8(s), nil + case uint8: + return int8(s), nil + case float64: + return int8(s), nil + case float32: + return int8(s), nil + case string: + v, err := strconv.ParseInt(s, 0, 0) + if err == nil { + return int8(v), nil + } + return 0, fmt.Errorf("unable to cast %#v of type %T to int8", i, i) + case bool: + if s { + return 1, nil + } + return 0, nil + case nil: + return 0, nil + default: + return 0, fmt.Errorf("unable to cast %#v of type %T to int8", i, i) + } +} + +// ToIntE casts an interface to an int type. +func ToIntE(i interface{}) (int, error) { + i = indirect(i) + + switch s := i.(type) { + case int: + return s, nil + case int64: + return int(s), nil + case int32: + return int(s), nil + case int16: + return int(s), nil + case int8: + return int(s), nil + case uint: + return int(s), nil + case uint64: + return int(s), nil + case uint32: + return int(s), nil + case uint16: + return int(s), nil + case uint8: + return int(s), nil + case float64: + return int(s), nil + case float32: + return int(s), nil + case string: + v, err := strconv.ParseInt(s, 0, 0) + if err == nil { + return int(v), nil + } + return 0, fmt.Errorf("unable to cast %#v of type %T to int", i, i) + case bool: + if s { + return 1, nil + } + return 0, nil + case nil: + return 0, nil + default: + return 0, fmt.Errorf("unable to cast %#v of type %T to int", i, i) + } +} + +// ToUintE casts an interface to a uint type. +func ToUintE(i interface{}) (uint, error) { + i = indirect(i) + + switch s := i.(type) { + case string: + v, err := strconv.ParseUint(s, 0, 0) + if err == nil { + return uint(v), nil + } + return 0, fmt.Errorf("unable to cast %#v to uint: %s", i, err) + case int: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint(s), nil + case int64: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint(s), nil + case int32: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint(s), nil + case int16: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint(s), nil + case int8: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint(s), nil + case uint: + return s, nil + case uint64: + return uint(s), nil + case uint32: + return uint(s), nil + case uint16: + return uint(s), nil + case uint8: + return uint(s), nil + case float64: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint(s), nil + case float32: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint(s), nil + case bool: + if s { + return 1, nil + } + return 0, nil + case nil: + return 0, nil + default: + return 0, fmt.Errorf("unable to cast %#v of type %T to uint", i, i) + } +} + +// ToUint64E casts an interface to a uint64 type. +func ToUint64E(i interface{}) (uint64, error) { + i = indirect(i) + + switch s := i.(type) { + case string: + v, err := strconv.ParseUint(s, 0, 64) + if err == nil { + return v, nil + } + return 0, fmt.Errorf("unable to cast %#v to uint64: %s", i, err) + case int: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint64(s), nil + case int64: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint64(s), nil + case int32: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint64(s), nil + case int16: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint64(s), nil + case int8: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint64(s), nil + case uint: + return uint64(s), nil + case uint64: + return s, nil + case uint32: + return uint64(s), nil + case uint16: + return uint64(s), nil + case uint8: + return uint64(s), nil + case float32: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint64(s), nil + case float64: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint64(s), nil + case bool: + if s { + return 1, nil + } + return 0, nil + case nil: + return 0, nil + default: + return 0, fmt.Errorf("unable to cast %#v of type %T to uint64", i, i) + } +} + +// ToUint32E casts an interface to a uint32 type. +func ToUint32E(i interface{}) (uint32, error) { + i = indirect(i) + + switch s := i.(type) { + case string: + v, err := strconv.ParseUint(s, 0, 32) + if err == nil { + return uint32(v), nil + } + return 0, fmt.Errorf("unable to cast %#v to uint32: %s", i, err) + case int: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint32(s), nil + case int64: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint32(s), nil + case int32: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint32(s), nil + case int16: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint32(s), nil + case int8: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint32(s), nil + case uint: + return uint32(s), nil + case uint64: + return uint32(s), nil + case uint32: + return s, nil + case uint16: + return uint32(s), nil + case uint8: + return uint32(s), nil + case float64: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint32(s), nil + case float32: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint32(s), nil + case bool: + if s { + return 1, nil + } + return 0, nil + case nil: + return 0, nil + default: + return 0, fmt.Errorf("unable to cast %#v of type %T to uint32", i, i) + } +} + +// ToUint16E casts an interface to a uint16 type. +func ToUint16E(i interface{}) (uint16, error) { + i = indirect(i) + + switch s := i.(type) { + case string: + v, err := strconv.ParseUint(s, 0, 16) + if err == nil { + return uint16(v), nil + } + return 0, fmt.Errorf("unable to cast %#v to uint16: %s", i, err) + case int: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint16(s), nil + case int64: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint16(s), nil + case int32: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint16(s), nil + case int16: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint16(s), nil + case int8: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint16(s), nil + case uint: + return uint16(s), nil + case uint64: + return uint16(s), nil + case uint32: + return uint16(s), nil + case uint16: + return s, nil + case uint8: + return uint16(s), nil + case float64: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint16(s), nil + case float32: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint16(s), nil + case bool: + if s { + return 1, nil + } + return 0, nil + case nil: + return 0, nil + default: + return 0, fmt.Errorf("unable to cast %#v of type %T to uint16", i, i) + } +} + +// ToUint8E casts an interface to a uint type. +func ToUint8E(i interface{}) (uint8, error) { + i = indirect(i) + + switch s := i.(type) { + case string: + v, err := strconv.ParseUint(s, 0, 8) + if err == nil { + return uint8(v), nil + } + return 0, fmt.Errorf("unable to cast %#v to uint8: %s", i, err) + case int: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint8(s), nil + case int64: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint8(s), nil + case int32: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint8(s), nil + case int16: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint8(s), nil + case int8: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint8(s), nil + case uint: + return uint8(s), nil + case uint64: + return uint8(s), nil + case uint32: + return uint8(s), nil + case uint16: + return uint8(s), nil + case uint8: + return s, nil + case float64: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint8(s), nil + case float32: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint8(s), nil + case bool: + if s { + return 1, nil + } + return 0, nil + case nil: + return 0, nil + default: + return 0, fmt.Errorf("unable to cast %#v of type %T to uint8", i, i) + } +} + +// From html/template/content.go +// Copyright 2011 The Go Authors. All rights reserved. +// indirect returns the value, after dereferencing as many times +// as necessary to reach the base type (or nil). +func indirect(a interface{}) interface{} { + if a == nil { + return nil + } + if t := reflect.TypeOf(a); t.Kind() != reflect.Ptr { + // Avoid creating a reflect.Value if it's not a pointer. + return a + } + v := reflect.ValueOf(a) + for v.Kind() == reflect.Ptr && !v.IsNil() { + v = v.Elem() + } + return v.Interface() +} + +// From html/template/content.go +// Copyright 2011 The Go Authors. All rights reserved. +// indirectToStringerOrError returns the value, after dereferencing as many times +// as necessary to reach the base type (or nil) or an implementation of fmt.Stringer +// or error, +func indirectToStringerOrError(a interface{}) interface{} { + if a == nil { + return nil + } + + var errorType = reflect.TypeOf((*error)(nil)).Elem() + var fmtStringerType = reflect.TypeOf((*fmt.Stringer)(nil)).Elem() + + v := reflect.ValueOf(a) + for !v.Type().Implements(fmtStringerType) && !v.Type().Implements(errorType) && v.Kind() == reflect.Ptr && !v.IsNil() { + v = v.Elem() + } + return v.Interface() +} + +// ToStringE casts an interface to a string type. +func ToStringE(i interface{}) (string, error) { + i = indirectToStringerOrError(i) + + switch s := i.(type) { + case string: + return s, nil + case bool: + return strconv.FormatBool(s), nil + case float64: + return strconv.FormatFloat(s, 'f', -1, 64), nil + case float32: + return strconv.FormatFloat(float64(s), 'f', -1, 32), nil + case int: + return strconv.Itoa(s), nil + case int64: + return strconv.FormatInt(s, 10), nil + case int32: + return strconv.Itoa(int(s)), nil + case int16: + return strconv.FormatInt(int64(s), 10), nil + case int8: + return strconv.FormatInt(int64(s), 10), nil + case uint: + return strconv.FormatInt(int64(s), 10), nil + case uint64: + return strconv.FormatInt(int64(s), 10), nil + case uint32: + return strconv.FormatInt(int64(s), 10), nil + case uint16: + return strconv.FormatInt(int64(s), 10), nil + case uint8: + return strconv.FormatInt(int64(s), 10), nil + case []byte: + return string(s), nil + case template.HTML: + return string(s), nil + case template.URL: + return string(s), nil + case template.JS: + return string(s), nil + case template.CSS: + return string(s), nil + case template.HTMLAttr: + return string(s), nil + case nil: + return "", nil + case fmt.Stringer: + return s.String(), nil + case error: + return s.Error(), nil + default: + return "", fmt.Errorf("unable to cast %#v of type %T to string", i, i) + } +} + +// ToStringMapStringE casts an interface to a map[string]string type. +func ToStringMapStringE(i interface{}) (map[string]string, error) { + var m = map[string]string{} + + switch v := i.(type) { + case map[string]string: + return v, nil + case map[string]interface{}: + for k, val := range v { + m[ToString(k)] = ToString(val) + } + return m, nil + case map[interface{}]string: + for k, val := range v { + m[ToString(k)] = ToString(val) + } + return m, nil + case map[interface{}]interface{}: + for k, val := range v { + m[ToString(k)] = ToString(val) + } + return m, nil + case string: + err := jsonStringToObject(v, &m) + return m, err + default: + return m, fmt.Errorf("unable to cast %#v of type %T to map[string]string", i, i) + } +} + +// ToStringMapStringSliceE casts an interface to a map[string][]string type. +func ToStringMapStringSliceE(i interface{}) (map[string][]string, error) { + var m = map[string][]string{} + + switch v := i.(type) { + case map[string][]string: + return v, nil + case map[string][]interface{}: + for k, val := range v { + m[ToString(k)] = ToStringSlice(val) + } + return m, nil + case map[string]string: + for k, val := range v { + m[ToString(k)] = []string{val} + } + case map[string]interface{}: + for k, val := range v { + switch vt := val.(type) { + case []interface{}: + m[ToString(k)] = ToStringSlice(vt) + case []string: + m[ToString(k)] = vt + default: + m[ToString(k)] = []string{ToString(val)} + } + } + return m, nil + case map[interface{}][]string: + for k, val := range v { + m[ToString(k)] = ToStringSlice(val) + } + return m, nil + case map[interface{}]string: + for k, val := range v { + m[ToString(k)] = ToStringSlice(val) + } + return m, nil + case map[interface{}][]interface{}: + for k, val := range v { + m[ToString(k)] = ToStringSlice(val) + } + return m, nil + case map[interface{}]interface{}: + for k, val := range v { + key, err := ToStringE(k) + if err != nil { + return m, fmt.Errorf("unable to cast %#v of type %T to map[string][]string", i, i) + } + value, err := ToStringSliceE(val) + if err != nil { + return m, fmt.Errorf("unable to cast %#v of type %T to map[string][]string", i, i) + } + m[key] = value + } + case string: + err := jsonStringToObject(v, &m) + return m, err + default: + return m, fmt.Errorf("unable to cast %#v of type %T to map[string][]string", i, i) + } + return m, nil +} + +// ToStringMapBoolE casts an interface to a map[string]bool type. +func ToStringMapBoolE(i interface{}) (map[string]bool, error) { + var m = map[string]bool{} + + switch v := i.(type) { + case map[interface{}]interface{}: + for k, val := range v { + m[ToString(k)] = ToBool(val) + } + return m, nil + case map[string]interface{}: + for k, val := range v { + m[ToString(k)] = ToBool(val) + } + return m, nil + case map[string]bool: + return v, nil + case string: + err := jsonStringToObject(v, &m) + return m, err + default: + return m, fmt.Errorf("unable to cast %#v of type %T to map[string]bool", i, i) + } +} + +// ToStringMapE casts an interface to a map[string]interface{} type. +func ToStringMapE(i interface{}) (map[string]interface{}, error) { + var m = map[string]interface{}{} + + switch v := i.(type) { + case map[interface{}]interface{}: + for k, val := range v { + m[ToString(k)] = val + } + return m, nil + case map[string]interface{}: + return v, nil + case string: + err := jsonStringToObject(v, &m) + return m, err + default: + return m, fmt.Errorf("unable to cast %#v of type %T to map[string]interface{}", i, i) + } +} + +// ToSliceE casts an interface to a []interface{} type. +func ToSliceE(i interface{}) ([]interface{}, error) { + var s []interface{} + + switch v := i.(type) { + case []interface{}: + return append(s, v...), nil + case []map[string]interface{}: + for _, u := range v { + s = append(s, u) + } + return s, nil + default: + return s, fmt.Errorf("unable to cast %#v of type %T to []interface{}", i, i) + } +} + +// ToBoolSliceE casts an interface to a []bool type. +func ToBoolSliceE(i interface{}) ([]bool, error) { + if i == nil { + return []bool{}, fmt.Errorf("unable to cast %#v of type %T to []bool", i, i) + } + + switch v := i.(type) { + case []bool: + return v, nil + } + + kind := reflect.TypeOf(i).Kind() + switch kind { + case reflect.Slice, reflect.Array: + s := reflect.ValueOf(i) + a := make([]bool, s.Len()) + for j := 0; j < s.Len(); j++ { + val, err := ToBoolE(s.Index(j).Interface()) + if err != nil { + return []bool{}, fmt.Errorf("unable to cast %#v of type %T to []bool", i, i) + } + a[j] = val + } + return a, nil + default: + return []bool{}, fmt.Errorf("unable to cast %#v of type %T to []bool", i, i) + } +} + +// ToStringSliceE casts an interface to a []string type. +func ToStringSliceE(i interface{}) ([]string, error) { + var a []string + + switch v := i.(type) { + case []interface{}: + for _, u := range v { + a = append(a, ToString(u)) + } + return a, nil + case []string: + return v, nil + case string: + return strings.Fields(v), nil + case interface{}: + str, err := ToStringE(v) + if err != nil { + return a, fmt.Errorf("unable to cast %#v of type %T to []string", i, i) + } + return []string{str}, nil + default: + return a, fmt.Errorf("unable to cast %#v of type %T to []string", i, i) + } +} + +// ToIntSliceE casts an interface to a []int type. +func ToIntSliceE(i interface{}) ([]int, error) { + if i == nil { + return []int{}, fmt.Errorf("unable to cast %#v of type %T to []int", i, i) + } + + switch v := i.(type) { + case []int: + return v, nil + } + + kind := reflect.TypeOf(i).Kind() + switch kind { + case reflect.Slice, reflect.Array: + s := reflect.ValueOf(i) + a := make([]int, s.Len()) + for j := 0; j < s.Len(); j++ { + val, err := ToIntE(s.Index(j).Interface()) + if err != nil { + return []int{}, fmt.Errorf("unable to cast %#v of type %T to []int", i, i) + } + a[j] = val + } + return a, nil + default: + return []int{}, fmt.Errorf("unable to cast %#v of type %T to []int", i, i) + } +} + +// ToDurationSliceE casts an interface to a []time.Duration type. +func ToDurationSliceE(i interface{}) ([]time.Duration, error) { + if i == nil { + return []time.Duration{}, fmt.Errorf("unable to cast %#v of type %T to []time.Duration", i, i) + } + + switch v := i.(type) { + case []time.Duration: + return v, nil + } + + kind := reflect.TypeOf(i).Kind() + switch kind { + case reflect.Slice, reflect.Array: + s := reflect.ValueOf(i) + a := make([]time.Duration, s.Len()) + for j := 0; j < s.Len(); j++ { + val, err := ToDurationE(s.Index(j).Interface()) + if err != nil { + return []time.Duration{}, fmt.Errorf("unable to cast %#v of type %T to []time.Duration", i, i) + } + a[j] = val + } + return a, nil + default: + return []time.Duration{}, fmt.Errorf("unable to cast %#v of type %T to []time.Duration", i, i) + } +} + +// StringToDate attempts to parse a string into a time.Time type using a +// predefined list of formats. If no suitable format is found, an error is +// returned. +func StringToDate(s string) (time.Time, error) { + return parseDateWith(s, []string{ + time.RFC3339, + "2006-01-02T15:04:05", // iso8601 without timezone + time.RFC1123Z, + time.RFC1123, + time.RFC822Z, + time.RFC822, + time.RFC850, + time.ANSIC, + time.UnixDate, + time.RubyDate, + "2006-01-02 15:04:05.999999999 -0700 MST", // Time.String() + "2006-01-02", + "02 Jan 2006", + "2006-01-02 15:04:05 -07:00", + "2006-01-02 15:04:05 -0700", + "2006-01-02 15:04:05Z07:00", // RFC3339 without T + "2006-01-02 15:04:05", + time.Kitchen, + time.Stamp, + time.StampMilli, + time.StampMicro, + time.StampNano, + }) +} + +func parseDateWith(s string, dates []string) (d time.Time, e error) { + for _, dateType := range dates { + if d, e = time.Parse(dateType, s); e == nil { + return + } + } + return d, fmt.Errorf("unable to parse date: %s", s) +} + +// jsonStringToObject attempts to unmarshall a string as JSON into +// the object passed as pointer. +func jsonStringToObject(s string, v interface{}) error { + data := []byte(s) + return json.Unmarshal(data, v) +} diff --git a/vendor/github.com/spf13/cobra/.gitignore b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cobra/.gitignore similarity index 98% rename from vendor/github.com/spf13/cobra/.gitignore rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cobra/.gitignore index 3b053c59..1b8c7c26 100644 --- a/vendor/github.com/spf13/cobra/.gitignore +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cobra/.gitignore @@ -34,5 +34,3 @@ tags *.exe cobra.test - -.idea/* diff --git a/vendor/github.com/spf13/cobra/.mailmap b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cobra/.mailmap similarity index 100% rename from vendor/github.com/spf13/cobra/.mailmap rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cobra/.mailmap diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cobra/.travis.yml b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cobra/.travis.yml new file mode 100644 index 00000000..5afcb209 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cobra/.travis.yml @@ -0,0 +1,21 @@ +language: go + +matrix: + include: + - go: 1.9.4 + - go: 1.10.0 + - go: tip + allow_failures: + - go: tip + +before_install: + - mkdir -p bin + - curl -Lso bin/shellcheck https://github.com/caarlos0/shellcheck-docker/releases/download/v0.4.3/shellcheck + - chmod +x bin/shellcheck +script: + - PATH=$PATH:$PWD/bin go test -v ./... + - go build + - diff -u <(echo -n) <(gofmt -d -s .) + - if [ -z $NOVET ]; then + diff -u <(echo -n) <(go tool vet . 2>&1 | grep -vE 'ExampleCommand|bash_completions.*Fprint'); + fi diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cobra/LICENSE.txt b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cobra/LICENSE.txt new file mode 100644 index 00000000..298f0e26 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cobra/LICENSE.txt @@ -0,0 +1,174 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. diff --git a/vendor/github.com/spf13/cobra/README.md b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cobra/README.md similarity index 93% rename from vendor/github.com/spf13/cobra/README.md rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cobra/README.md index 60c5a425..851fcc08 100644 --- a/vendor/github.com/spf13/cobra/README.md +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cobra/README.md @@ -2,29 +2,25 @@ Cobra is both a library for creating powerful modern CLI applications as well as a program to generate applications and command files. -Many of the most widely used Go projects are built using Cobra, such as: -[Kubernetes](http://kubernetes.io/), -[Hugo](http://gohugo.io), -[rkt](https://github.com/coreos/rkt), -[etcd](https://github.com/coreos/etcd), -[Moby (former Docker)](https://github.com/moby/moby), -[Docker (distribution)](https://github.com/docker/distribution), -[OpenShift](https://www.openshift.com/), -[Delve](https://github.com/derekparker/delve), -[GopherJS](http://www.gopherjs.org/), -[CockroachDB](http://www.cockroachlabs.com/), -[Bleve](http://www.blevesearch.com/), -[ProjectAtomic (enterprise)](http://www.projectatomic.io/), -[Giant Swarm's gsctl](https://github.com/giantswarm/gsctl), -[Nanobox](https://github.com/nanobox-io/nanobox)/[Nanopack](https://github.com/nanopack), -[rclone](http://rclone.org/), -[nehm](https://github.com/bogem/nehm), -[Pouch](https://github.com/alibaba/pouch), -[Istio](https://istio.io), -[Prototool](https://github.com/uber/prototool), -[mattermost-server](https://github.com/mattermost/mattermost-server), -[Gardener](https://github.com/gardener/gardenctl), -etc. +Many of the most widely used Go projects are built using Cobra including: + +* [Kubernetes](http://kubernetes.io/) +* [Hugo](http://gohugo.io) +* [rkt](https://github.com/coreos/rkt) +* [etcd](https://github.com/coreos/etcd) +* [Moby (former Docker)](https://github.com/moby/moby) +* [Docker (distribution)](https://github.com/docker/distribution) +* [OpenShift](https://www.openshift.com/) +* [Delve](https://github.com/derekparker/delve) +* [GopherJS](http://www.gopherjs.org/) +* [CockroachDB](http://www.cockroachlabs.com/) +* [Bleve](http://www.blevesearch.com/) +* [ProjectAtomic (enterprise)](http://www.projectatomic.io/) +* [GiantSwarm's swarm](https://github.com/giantswarm/cli) +* [Nanobox](https://github.com/nanobox-io/nanobox)/[Nanopack](https://github.com/nanopack) +* [rclone](http://rclone.org/) +* [nehm](https://github.com/bogem/nehm) +* [Pouch](https://github.com/alibaba/pouch) [![Build Status](https://travis-ci.org/spf13/cobra.svg "Travis CI status")](https://travis-ci.org/spf13/cobra) [![CircleCI status](https://circleci.com/gh/spf13/cobra.png?circle-token=:circle-token "CircleCI status")](https://circleci.com/gh/spf13/cobra) @@ -49,7 +45,6 @@ etc. * [Suggestions when "unknown command" happens](#suggestions-when-unknown-command-happens) * [Generating documentation for your command](#generating-documentation-for-your-command) * [Generating bash completions](#generating-bash-completions) - * [Generating zsh completions](#generating-zsh-completions) - [Contributing](#contributing) - [License](#license) @@ -157,6 +152,9 @@ In a Cobra app, typically the main.go file is very bare. It serves one purpose: package main import ( + "fmt" + "os" + "{pathToYourApp}/cmd" ) @@ -267,6 +265,9 @@ In a Cobra app, typically the main.go file is very bare. It serves, one purpose, package main import ( + "fmt" + "os" + "{pathToYourApp}/cmd" ) @@ -338,7 +339,7 @@ rootCmd.PersistentFlags().BoolVarP(&Verbose, "verbose", "v", false, "verbose out A flag can also be assigned locally which will only apply to that specific command. ```go -localCmd.Flags().StringVarP(&Source, "source", "s", "", "Source directory to read from") +rootCmd.Flags().StringVarP(&Source, "source", "s", "", "Source directory to read from") ``` ### Local Flag on Parent Commands @@ -394,7 +395,6 @@ The following validators are built in: - `MinimumNArgs(int)` - the command will report an error if there are not at least N positional args. - `MaximumNArgs(int)` - the command will report an error if there are more than N positional args. - `ExactArgs(int)` - the command will report an error if there are not exactly N positional args. -- `ExactValidArgs(int)` - the command will report an error if there are not exactly N positional args OR if there are any positional args that are not in the `ValidArgs` field of `Command` - `RangeArgs(min, max)` - the command will report an error if the number of args is not between the minimum and maximum number of expected args. An example of setting the custom validator: @@ -404,7 +404,7 @@ var cmd = &cobra.Command{ Short: "hello", Args: func(cmd *cobra.Command, args []string) error { if len(args) < 1 { - return errors.New("requires a color argument") + return errors.New("requires at least one arg") } if myapp.IsValidColor(args[0]) { return nil @@ -464,7 +464,7 @@ Echo works a lot like print, except it has a child command.`, } var cmdTimes = &cobra.Command{ - Use: "times [string to echo]", + Use: "times [# times] [string to echo]", Short: "Echo anything to the screen more times", Long: `echo things multiple times back to the user by providing a count and a string.`, @@ -721,11 +721,6 @@ Cobra can generate documentation based on subcommands, flags, etc. in the follow Cobra can generate a bash-completion file. If you add more information to your command, these completions can be amazingly powerful and flexible. Read more about it in [Bash Completions](bash_completions.md). -## Generating zsh completions - -Cobra can generate zsh-completion file. Read more about it in -[Zsh Completions](zsh_completions.md). - # Contributing 1. Fork it diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cobra/args.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cobra/args.go new file mode 100644 index 00000000..a5d8a927 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cobra/args.go @@ -0,0 +1,89 @@ +package cobra + +import ( + "fmt" +) + +type PositionalArgs func(cmd *Command, args []string) error + +// Legacy arg validation has the following behaviour: +// - root commands with no subcommands can take arbitrary arguments +// - root commands with subcommands will do subcommand validity checking +// - subcommands will always accept arbitrary arguments +func legacyArgs(cmd *Command, args []string) error { + // no subcommand, always take args + if !cmd.HasSubCommands() { + return nil + } + + // root command with subcommands, do subcommand checking. + if !cmd.HasParent() && len(args) > 0 { + return fmt.Errorf("unknown command %q for %q%s", args[0], cmd.CommandPath(), cmd.findSuggestions(args[0])) + } + return nil +} + +// NoArgs returns an error if any args are included. +func NoArgs(cmd *Command, args []string) error { + if len(args) > 0 { + return fmt.Errorf("unknown command %q for %q", args[0], cmd.CommandPath()) + } + return nil +} + +// OnlyValidArgs returns an error if any args are not in the list of ValidArgs. +func OnlyValidArgs(cmd *Command, args []string) error { + if len(cmd.ValidArgs) > 0 { + for _, v := range args { + if !stringInSlice(v, cmd.ValidArgs) { + return fmt.Errorf("invalid argument %q for %q%s", v, cmd.CommandPath(), cmd.findSuggestions(args[0])) + } + } + } + return nil +} + +// ArbitraryArgs never returns an error. +func ArbitraryArgs(cmd *Command, args []string) error { + return nil +} + +// MinimumNArgs returns an error if there is not at least N args. +func MinimumNArgs(n int) PositionalArgs { + return func(cmd *Command, args []string) error { + if len(args) < n { + return fmt.Errorf("requires at least %d arg(s), only received %d", n, len(args)) + } + return nil + } +} + +// MaximumNArgs returns an error if there are more than N args. +func MaximumNArgs(n int) PositionalArgs { + return func(cmd *Command, args []string) error { + if len(args) > n { + return fmt.Errorf("accepts at most %d arg(s), received %d", n, len(args)) + } + return nil + } +} + +// ExactArgs returns an error if there are not exactly n args. +func ExactArgs(n int) PositionalArgs { + return func(cmd *Command, args []string) error { + if len(args) != n { + return fmt.Errorf("accepts %d arg(s), received %d", n, len(args)) + } + return nil + } +} + +// RangeArgs returns an error if the number of args is not within the expected range. +func RangeArgs(min int, max int) PositionalArgs { + return func(cmd *Command, args []string) error { + if len(args) < min || len(args) > max { + return fmt.Errorf("accepts between %d and %d arg(s), received %d", min, max, len(args)) + } + return nil + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cobra/bash_completions.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cobra/bash_completions.go new file mode 100644 index 00000000..8fa8f486 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cobra/bash_completions.go @@ -0,0 +1,584 @@ +package cobra + +import ( + "bytes" + "fmt" + "io" + "os" + "sort" + "strings" + + "github.com/spf13/pflag" +) + +// Annotations for Bash completion. +const ( + BashCompFilenameExt = "cobra_annotation_bash_completion_filename_extensions" + BashCompCustom = "cobra_annotation_bash_completion_custom" + BashCompOneRequiredFlag = "cobra_annotation_bash_completion_one_required_flag" + BashCompSubdirsInDir = "cobra_annotation_bash_completion_subdirs_in_dir" +) + +func writePreamble(buf *bytes.Buffer, name string) { + buf.WriteString(fmt.Sprintf("# bash completion for %-36s -*- shell-script -*-\n", name)) + buf.WriteString(fmt.Sprintf(` +__%[1]s_debug() +{ + if [[ -n ${BASH_COMP_DEBUG_FILE} ]]; then + echo "$*" >> "${BASH_COMP_DEBUG_FILE}" + fi +} + +# Homebrew on Macs have version 1.3 of bash-completion which doesn't include +# _init_completion. This is a very minimal version of that function. +__%[1]s_init_completion() +{ + COMPREPLY=() + _get_comp_words_by_ref "$@" cur prev words cword +} + +__%[1]s_index_of_word() +{ + local w word=$1 + shift + index=0 + for w in "$@"; do + [[ $w = "$word" ]] && return + index=$((index+1)) + done + index=-1 +} + +__%[1]s_contains_word() +{ + local w word=$1; shift + for w in "$@"; do + [[ $w = "$word" ]] && return + done + return 1 +} + +__%[1]s_handle_reply() +{ + __%[1]s_debug "${FUNCNAME[0]}" + case $cur in + -*) + if [[ $(type -t compopt) = "builtin" ]]; then + compopt -o nospace + fi + local allflags + if [ ${#must_have_one_flag[@]} -ne 0 ]; then + allflags=("${must_have_one_flag[@]}") + else + allflags=("${flags[*]} ${two_word_flags[*]}") + fi + COMPREPLY=( $(compgen -W "${allflags[*]}" -- "$cur") ) + if [[ $(type -t compopt) = "builtin" ]]; then + [[ "${COMPREPLY[0]}" == *= ]] || compopt +o nospace + fi + + # complete after --flag=abc + if [[ $cur == *=* ]]; then + if [[ $(type -t compopt) = "builtin" ]]; then + compopt +o nospace + fi + + local index flag + flag="${cur%%=*}" + __%[1]s_index_of_word "${flag}" "${flags_with_completion[@]}" + COMPREPLY=() + if [[ ${index} -ge 0 ]]; then + PREFIX="" + cur="${cur#*=}" + ${flags_completion[${index}]} + if [ -n "${ZSH_VERSION}" ]; then + # zsh completion needs --flag= prefix + eval "COMPREPLY=( \"\${COMPREPLY[@]/#/${flag}=}\" )" + fi + fi + fi + return 0; + ;; + esac + + # check if we are handling a flag with special work handling + local index + __%[1]s_index_of_word "${prev}" "${flags_with_completion[@]}" + if [[ ${index} -ge 0 ]]; then + ${flags_completion[${index}]} + return + fi + + # we are parsing a flag and don't have a special handler, no completion + if [[ ${cur} != "${words[cword]}" ]]; then + return + fi + + local completions + completions=("${commands[@]}") + if [[ ${#must_have_one_noun[@]} -ne 0 ]]; then + completions=("${must_have_one_noun[@]}") + fi + if [[ ${#must_have_one_flag[@]} -ne 0 ]]; then + completions+=("${must_have_one_flag[@]}") + fi + COMPREPLY=( $(compgen -W "${completions[*]}" -- "$cur") ) + + if [[ ${#COMPREPLY[@]} -eq 0 && ${#noun_aliases[@]} -gt 0 && ${#must_have_one_noun[@]} -ne 0 ]]; then + COMPREPLY=( $(compgen -W "${noun_aliases[*]}" -- "$cur") ) + fi + + if [[ ${#COMPREPLY[@]} -eq 0 ]]; then + declare -F __custom_func >/dev/null && __custom_func + fi + + # available in bash-completion >= 2, not always present on macOS + if declare -F __ltrim_colon_completions >/dev/null; then + __ltrim_colon_completions "$cur" + fi + + # If there is only 1 completion and it is a flag with an = it will be completed + # but we don't want a space after the = + if [[ "${#COMPREPLY[@]}" -eq "1" ]] && [[ $(type -t compopt) = "builtin" ]] && [[ "${COMPREPLY[0]}" == --*= ]]; then + compopt -o nospace + fi +} + +# The arguments should be in the form "ext1|ext2|extn" +__%[1]s_handle_filename_extension_flag() +{ + local ext="$1" + _filedir "@(${ext})" +} + +__%[1]s_handle_subdirs_in_dir_flag() +{ + local dir="$1" + pushd "${dir}" >/dev/null 2>&1 && _filedir -d && popd >/dev/null 2>&1 +} + +__%[1]s_handle_flag() +{ + __%[1]s_debug "${FUNCNAME[0]}: c is $c words[c] is ${words[c]}" + + # if a command required a flag, and we found it, unset must_have_one_flag() + local flagname=${words[c]} + local flagvalue + # if the word contained an = + if [[ ${words[c]} == *"="* ]]; then + flagvalue=${flagname#*=} # take in as flagvalue after the = + flagname=${flagname%%=*} # strip everything after the = + flagname="${flagname}=" # but put the = back + fi + __%[1]s_debug "${FUNCNAME[0]}: looking for ${flagname}" + if __%[1]s_contains_word "${flagname}" "${must_have_one_flag[@]}"; then + must_have_one_flag=() + fi + + # if you set a flag which only applies to this command, don't show subcommands + if __%[1]s_contains_word "${flagname}" "${local_nonpersistent_flags[@]}"; then + commands=() + fi + + # keep flag value with flagname as flaghash + # flaghash variable is an associative array which is only supported in bash > 3. + if [[ -z "${BASH_VERSION}" || "${BASH_VERSINFO[0]}" -gt 3 ]]; then + if [ -n "${flagvalue}" ] ; then + flaghash[${flagname}]=${flagvalue} + elif [ -n "${words[ $((c+1)) ]}" ] ; then + flaghash[${flagname}]=${words[ $((c+1)) ]} + else + flaghash[${flagname}]="true" # pad "true" for bool flag + fi + fi + + # skip the argument to a two word flag + if __%[1]s_contains_word "${words[c]}" "${two_word_flags[@]}"; then + c=$((c+1)) + # if we are looking for a flags value, don't show commands + if [[ $c -eq $cword ]]; then + commands=() + fi + fi + + c=$((c+1)) + +} + +__%[1]s_handle_noun() +{ + __%[1]s_debug "${FUNCNAME[0]}: c is $c words[c] is ${words[c]}" + + if __%[1]s_contains_word "${words[c]}" "${must_have_one_noun[@]}"; then + must_have_one_noun=() + elif __%[1]s_contains_word "${words[c]}" "${noun_aliases[@]}"; then + must_have_one_noun=() + fi + + nouns+=("${words[c]}") + c=$((c+1)) +} + +__%[1]s_handle_command() +{ + __%[1]s_debug "${FUNCNAME[0]}: c is $c words[c] is ${words[c]}" + + local next_command + if [[ -n ${last_command} ]]; then + next_command="_${last_command}_${words[c]//:/__}" + else + if [[ $c -eq 0 ]]; then + next_command="_%[1]s_root_command" + else + next_command="_${words[c]//:/__}" + fi + fi + c=$((c+1)) + __%[1]s_debug "${FUNCNAME[0]}: looking for ${next_command}" + declare -F "$next_command" >/dev/null && $next_command +} + +__%[1]s_handle_word() +{ + if [[ $c -ge $cword ]]; then + __%[1]s_handle_reply + return + fi + __%[1]s_debug "${FUNCNAME[0]}: c is $c words[c] is ${words[c]}" + if [[ "${words[c]}" == -* ]]; then + __%[1]s_handle_flag + elif __%[1]s_contains_word "${words[c]}" "${commands[@]}"; then + __%[1]s_handle_command + elif [[ $c -eq 0 ]]; then + __%[1]s_handle_command + elif __%[1]s_contains_word "${words[c]}" "${command_aliases[@]}"; then + # aliashash variable is an associative array which is only supported in bash > 3. + if [[ -z "${BASH_VERSION}" || "${BASH_VERSINFO[0]}" -gt 3 ]]; then + words[c]=${aliashash[${words[c]}]} + __%[1]s_handle_command + else + __%[1]s_handle_noun + fi + else + __%[1]s_handle_noun + fi + __%[1]s_handle_word +} + +`, name)) +} + +func writePostscript(buf *bytes.Buffer, name string) { + name = strings.Replace(name, ":", "__", -1) + buf.WriteString(fmt.Sprintf("__start_%s()\n", name)) + buf.WriteString(fmt.Sprintf(`{ + local cur prev words cword + declare -A flaghash 2>/dev/null || : + declare -A aliashash 2>/dev/null || : + if declare -F _init_completion >/dev/null 2>&1; then + _init_completion -s || return + else + __%[1]s_init_completion -n "=" || return + fi + + local c=0 + local flags=() + local two_word_flags=() + local local_nonpersistent_flags=() + local flags_with_completion=() + local flags_completion=() + local commands=("%[1]s") + local must_have_one_flag=() + local must_have_one_noun=() + local last_command + local nouns=() + + __%[1]s_handle_word +} + +`, name)) + buf.WriteString(fmt.Sprintf(`if [[ $(type -t compopt) = "builtin" ]]; then + complete -o default -F __start_%s %s +else + complete -o default -o nospace -F __start_%s %s +fi + +`, name, name, name, name)) + buf.WriteString("# ex: ts=4 sw=4 et filetype=sh\n") +} + +func writeCommands(buf *bytes.Buffer, cmd *Command) { + buf.WriteString(" commands=()\n") + for _, c := range cmd.Commands() { + if !c.IsAvailableCommand() || c == cmd.helpCommand { + continue + } + buf.WriteString(fmt.Sprintf(" commands+=(%q)\n", c.Name())) + writeCmdAliases(buf, c) + } + buf.WriteString("\n") +} + +func writeFlagHandler(buf *bytes.Buffer, name string, annotations map[string][]string, cmd *Command) { + for key, value := range annotations { + switch key { + case BashCompFilenameExt: + buf.WriteString(fmt.Sprintf(" flags_with_completion+=(%q)\n", name)) + + var ext string + if len(value) > 0 { + ext = fmt.Sprintf("__%s_handle_filename_extension_flag ", cmd.Root().Name()) + strings.Join(value, "|") + } else { + ext = "_filedir" + } + buf.WriteString(fmt.Sprintf(" flags_completion+=(%q)\n", ext)) + case BashCompCustom: + buf.WriteString(fmt.Sprintf(" flags_with_completion+=(%q)\n", name)) + if len(value) > 0 { + handlers := strings.Join(value, "; ") + buf.WriteString(fmt.Sprintf(" flags_completion+=(%q)\n", handlers)) + } else { + buf.WriteString(" flags_completion+=(:)\n") + } + case BashCompSubdirsInDir: + buf.WriteString(fmt.Sprintf(" flags_with_completion+=(%q)\n", name)) + + var ext string + if len(value) == 1 { + ext = fmt.Sprintf("__%s_handle_subdirs_in_dir_flag ", cmd.Root().Name()) + value[0] + } else { + ext = "_filedir -d" + } + buf.WriteString(fmt.Sprintf(" flags_completion+=(%q)\n", ext)) + } + } +} + +func writeShortFlag(buf *bytes.Buffer, flag *pflag.Flag, cmd *Command) { + name := flag.Shorthand + format := " " + if len(flag.NoOptDefVal) == 0 { + format += "two_word_" + } + format += "flags+=(\"-%s\")\n" + buf.WriteString(fmt.Sprintf(format, name)) + writeFlagHandler(buf, "-"+name, flag.Annotations, cmd) +} + +func writeFlag(buf *bytes.Buffer, flag *pflag.Flag, cmd *Command) { + name := flag.Name + format := " flags+=(\"--%s" + if len(flag.NoOptDefVal) == 0 { + format += "=" + } + format += "\")\n" + buf.WriteString(fmt.Sprintf(format, name)) + writeFlagHandler(buf, "--"+name, flag.Annotations, cmd) +} + +func writeLocalNonPersistentFlag(buf *bytes.Buffer, flag *pflag.Flag) { + name := flag.Name + format := " local_nonpersistent_flags+=(\"--%s" + if len(flag.NoOptDefVal) == 0 { + format += "=" + } + format += "\")\n" + buf.WriteString(fmt.Sprintf(format, name)) +} + +func writeFlags(buf *bytes.Buffer, cmd *Command) { + buf.WriteString(` flags=() + two_word_flags=() + local_nonpersistent_flags=() + flags_with_completion=() + flags_completion=() + +`) + localNonPersistentFlags := cmd.LocalNonPersistentFlags() + cmd.NonInheritedFlags().VisitAll(func(flag *pflag.Flag) { + if nonCompletableFlag(flag) { + return + } + writeFlag(buf, flag, cmd) + if len(flag.Shorthand) > 0 { + writeShortFlag(buf, flag, cmd) + } + if localNonPersistentFlags.Lookup(flag.Name) != nil { + writeLocalNonPersistentFlag(buf, flag) + } + }) + cmd.InheritedFlags().VisitAll(func(flag *pflag.Flag) { + if nonCompletableFlag(flag) { + return + } + writeFlag(buf, flag, cmd) + if len(flag.Shorthand) > 0 { + writeShortFlag(buf, flag, cmd) + } + }) + + buf.WriteString("\n") +} + +func writeRequiredFlag(buf *bytes.Buffer, cmd *Command) { + buf.WriteString(" must_have_one_flag=()\n") + flags := cmd.NonInheritedFlags() + flags.VisitAll(func(flag *pflag.Flag) { + if nonCompletableFlag(flag) { + return + } + for key := range flag.Annotations { + switch key { + case BashCompOneRequiredFlag: + format := " must_have_one_flag+=(\"--%s" + if flag.Value.Type() != "bool" { + format += "=" + } + format += "\")\n" + buf.WriteString(fmt.Sprintf(format, flag.Name)) + + if len(flag.Shorthand) > 0 { + buf.WriteString(fmt.Sprintf(" must_have_one_flag+=(\"-%s\")\n", flag.Shorthand)) + } + } + } + }) +} + +func writeRequiredNouns(buf *bytes.Buffer, cmd *Command) { + buf.WriteString(" must_have_one_noun=()\n") + sort.Sort(sort.StringSlice(cmd.ValidArgs)) + for _, value := range cmd.ValidArgs { + buf.WriteString(fmt.Sprintf(" must_have_one_noun+=(%q)\n", value)) + } +} + +func writeCmdAliases(buf *bytes.Buffer, cmd *Command) { + if len(cmd.Aliases) == 0 { + return + } + + sort.Sort(sort.StringSlice(cmd.Aliases)) + + buf.WriteString(fmt.Sprint(` if [[ -z "${BASH_VERSION}" || "${BASH_VERSINFO[0]}" -gt 3 ]]; then`, "\n")) + for _, value := range cmd.Aliases { + buf.WriteString(fmt.Sprintf(" command_aliases+=(%q)\n", value)) + buf.WriteString(fmt.Sprintf(" aliashash[%q]=%q\n", value, cmd.Name())) + } + buf.WriteString(` fi`) + buf.WriteString("\n") +} +func writeArgAliases(buf *bytes.Buffer, cmd *Command) { + buf.WriteString(" noun_aliases=()\n") + sort.Sort(sort.StringSlice(cmd.ArgAliases)) + for _, value := range cmd.ArgAliases { + buf.WriteString(fmt.Sprintf(" noun_aliases+=(%q)\n", value)) + } +} + +func gen(buf *bytes.Buffer, cmd *Command) { + for _, c := range cmd.Commands() { + if !c.IsAvailableCommand() || c == cmd.helpCommand { + continue + } + gen(buf, c) + } + commandName := cmd.CommandPath() + commandName = strings.Replace(commandName, " ", "_", -1) + commandName = strings.Replace(commandName, ":", "__", -1) + + if cmd.Root() == cmd { + buf.WriteString(fmt.Sprintf("_%s_root_command()\n{\n", commandName)) + } else { + buf.WriteString(fmt.Sprintf("_%s()\n{\n", commandName)) + } + + buf.WriteString(fmt.Sprintf(" last_command=%q\n", commandName)) + buf.WriteString("\n") + buf.WriteString(" command_aliases=()\n") + buf.WriteString("\n") + + writeCommands(buf, cmd) + writeFlags(buf, cmd) + writeRequiredFlag(buf, cmd) + writeRequiredNouns(buf, cmd) + writeArgAliases(buf, cmd) + buf.WriteString("}\n\n") +} + +// GenBashCompletion generates bash completion file and writes to the passed writer. +func (c *Command) GenBashCompletion(w io.Writer) error { + buf := new(bytes.Buffer) + writePreamble(buf, c.Name()) + if len(c.BashCompletionFunction) > 0 { + buf.WriteString(c.BashCompletionFunction + "\n") + } + gen(buf, c) + writePostscript(buf, c.Name()) + + _, err := buf.WriteTo(w) + return err +} + +func nonCompletableFlag(flag *pflag.Flag) bool { + return flag.Hidden || len(flag.Deprecated) > 0 +} + +// GenBashCompletionFile generates bash completion file. +func (c *Command) GenBashCompletionFile(filename string) error { + outFile, err := os.Create(filename) + if err != nil { + return err + } + defer outFile.Close() + + return c.GenBashCompletion(outFile) +} + +// MarkFlagRequired adds the BashCompOneRequiredFlag annotation to the named flag if it exists, +// and causes your command to report an error if invoked without the flag. +func (c *Command) MarkFlagRequired(name string) error { + return MarkFlagRequired(c.Flags(), name) +} + +// MarkPersistentFlagRequired adds the BashCompOneRequiredFlag annotation to the named persistent flag if it exists, +// and causes your command to report an error if invoked without the flag. +func (c *Command) MarkPersistentFlagRequired(name string) error { + return MarkFlagRequired(c.PersistentFlags(), name) +} + +// MarkFlagRequired adds the BashCompOneRequiredFlag annotation to the named flag if it exists, +// and causes your command to report an error if invoked without the flag. +func MarkFlagRequired(flags *pflag.FlagSet, name string) error { + return flags.SetAnnotation(name, BashCompOneRequiredFlag, []string{"true"}) +} + +// MarkFlagFilename adds the BashCompFilenameExt annotation to the named flag, if it exists. +// Generated bash autocompletion will select filenames for the flag, limiting to named extensions if provided. +func (c *Command) MarkFlagFilename(name string, extensions ...string) error { + return MarkFlagFilename(c.Flags(), name, extensions...) +} + +// MarkFlagCustom adds the BashCompCustom annotation to the named flag, if it exists. +// Generated bash autocompletion will call the bash function f for the flag. +func (c *Command) MarkFlagCustom(name string, f string) error { + return MarkFlagCustom(c.Flags(), name, f) +} + +// MarkPersistentFlagFilename adds the BashCompFilenameExt annotation to the named persistent flag, if it exists. +// Generated bash autocompletion will select filenames for the flag, limiting to named extensions if provided. +func (c *Command) MarkPersistentFlagFilename(name string, extensions ...string) error { + return MarkFlagFilename(c.PersistentFlags(), name, extensions...) +} + +// MarkFlagFilename adds the BashCompFilenameExt annotation to the named flag in the flag set, if it exists. +// Generated bash autocompletion will select filenames for the flag, limiting to named extensions if provided. +func MarkFlagFilename(flags *pflag.FlagSet, name string, extensions ...string) error { + return flags.SetAnnotation(name, BashCompFilenameExt, extensions) +} + +// MarkFlagCustom adds the BashCompCustom annotation to the named flag in the flag set, if it exists. +// Generated bash autocompletion will call the bash function f for the flag. +func MarkFlagCustom(flags *pflag.FlagSet, name string, f string) error { + return flags.SetAnnotation(name, BashCompCustom, []string{f}) +} diff --git a/vendor/github.com/spf13/cobra/bash_completions.md b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cobra/bash_completions.md similarity index 77% rename from vendor/github.com/spf13/cobra/bash_completions.md rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cobra/bash_completions.md index 4ac61ee1..e79d4769 100644 --- a/vendor/github.com/spf13/cobra/bash_completions.md +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cobra/bash_completions.md @@ -1,40 +1,5 @@ # Generating Bash Completions For Your Own cobra.Command -If you are using the generator you can create a completion command by running - -```bash -cobra add completion -``` - -Update the help text show how to install the bash_completion Linux show here [Kubectl docs show mac options](https://kubernetes.io/docs/tasks/tools/install-kubectl/#enabling-shell-autocompletion) - -Writing the shell script to stdout allows the most flexible use. - -```go -// completionCmd represents the completion command -var completionCmd = &cobra.Command{ - Use: "completion", - Short: "Generates bash completion scripts", - Long: `To load completion run - -. <(bitbucket completion) - -To configure your bash shell to load completions for each session add to your bashrc - -# ~/.bashrc or ~/.profile -. <(bitbucket completion) -`, - Run: func(cmd *cobra.Command, args []string) { - rootCmd.GenBashCompletion(os.Stdout); - }, -} -``` - -**Note:** The cobra generator may include messages printed to stdout for example if the config file is loaded, this will break the auto complete script - - -## Example from kubectl - Generating bash completions from a cobra command is incredibly easy. An actual program which does so for the kubernetes kubectl binary is as follows: ```go @@ -82,7 +47,7 @@ __kubectl_get_resource() fi } -__kubectl_custom_func() { +__custom_func() { case ${last_command} in kubectl_get | kubectl_describe | kubectl_delete | kubectl_stop) __kubectl_get_resource @@ -109,7 +74,7 @@ Find more information at https://github.com/GoogleCloudPlatform/kubernetes.`, } ``` -The `BashCompletionFunction` option is really only valid/useful on the root command. Doing the above will cause `__kubectl_custom_func()` (`___custom_func()`) to be called when the built in processor was unable to find a solution. In the case of kubernetes a valid command might look something like `kubectl get pod [mypod]`. If you type `kubectl get pod [tab][tab]` the `__kubectl_customc_func()` will run because the cobra.Command only understood "kubectl" and "get." `__kubectl_custom_func()` will see that the cobra.Command is "kubectl_get" and will thus call another helper `__kubectl_get_resource()`. `__kubectl_get_resource` will look at the 'nouns' collected. In our example the only noun will be `pod`. So it will call `__kubectl_parse_get pod`. `__kubectl_parse_get` will actually call out to kubernetes and get any pods. It will then set `COMPREPLY` to valid pods! +The `BashCompletionFunction` option is really only valid/useful on the root command. Doing the above will cause `__custom_func()` to be called when the built in processor was unable to find a solution. In the case of kubernetes a valid command might look something like `kubectl get pod [mypod]`. If you type `kubectl get pod [tab][tab]` the `__customc_func()` will run because the cobra.Command only understood "kubectl" and "get." `__custom_func()` will see that the cobra.Command is "kubectl_get" and will thus call another helper `__kubectl_get_resource()`. `__kubectl_get_resource` will look at the 'nouns' collected. In our example the only noun will be `pod`. So it will call `__kubectl_parse_get pod`. `__kubectl_parse_get` will actually call out to kubernetes and get any pods. It will then set `COMPREPLY` to valid pods! ## Have the completions code complete your 'nouns' diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cobra/cobra.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cobra/cobra.go new file mode 100644 index 00000000..7010fd15 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cobra/cobra.go @@ -0,0 +1,200 @@ +// Copyright © 2013 Steve Francia . +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Commands similar to git, go tools and other modern CLI tools +// inspired by go, go-Commander, gh and subcommand + +package cobra + +import ( + "fmt" + "io" + "reflect" + "strconv" + "strings" + "text/template" + "unicode" +) + +var templateFuncs = template.FuncMap{ + "trim": strings.TrimSpace, + "trimRightSpace": trimRightSpace, + "trimTrailingWhitespaces": trimRightSpace, + "appendIfNotPresent": appendIfNotPresent, + "rpad": rpad, + "gt": Gt, + "eq": Eq, +} + +var initializers []func() + +// EnablePrefixMatching allows to set automatic prefix matching. Automatic prefix matching can be a dangerous thing +// to automatically enable in CLI tools. +// Set this to true to enable it. +var EnablePrefixMatching = false + +// EnableCommandSorting controls sorting of the slice of commands, which is turned on by default. +// To disable sorting, set it to false. +var EnableCommandSorting = true + +// MousetrapHelpText enables an information splash screen on Windows +// if the CLI is started from explorer.exe. +// To disable the mousetrap, just set this variable to blank string (""). +// Works only on Microsoft Windows. +var MousetrapHelpText string = `This is a command line tool. + +You need to open cmd.exe and run it from there. +` + +// AddTemplateFunc adds a template function that's available to Usage and Help +// template generation. +func AddTemplateFunc(name string, tmplFunc interface{}) { + templateFuncs[name] = tmplFunc +} + +// AddTemplateFuncs adds multiple template functions that are available to Usage and +// Help template generation. +func AddTemplateFuncs(tmplFuncs template.FuncMap) { + for k, v := range tmplFuncs { + templateFuncs[k] = v + } +} + +// OnInitialize sets the passed functions to be run when each command's +// Execute method is called. +func OnInitialize(y ...func()) { + initializers = append(initializers, y...) +} + +// FIXME Gt is unused by cobra and should be removed in a version 2. It exists only for compatibility with users of cobra. + +// Gt takes two types and checks whether the first type is greater than the second. In case of types Arrays, Chans, +// Maps and Slices, Gt will compare their lengths. Ints are compared directly while strings are first parsed as +// ints and then compared. +func Gt(a interface{}, b interface{}) bool { + var left, right int64 + av := reflect.ValueOf(a) + + switch av.Kind() { + case reflect.Array, reflect.Chan, reflect.Map, reflect.Slice: + left = int64(av.Len()) + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + left = av.Int() + case reflect.String: + left, _ = strconv.ParseInt(av.String(), 10, 64) + } + + bv := reflect.ValueOf(b) + + switch bv.Kind() { + case reflect.Array, reflect.Chan, reflect.Map, reflect.Slice: + right = int64(bv.Len()) + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + right = bv.Int() + case reflect.String: + right, _ = strconv.ParseInt(bv.String(), 10, 64) + } + + return left > right +} + +// FIXME Eq is unused by cobra and should be removed in a version 2. It exists only for compatibility with users of cobra. + +// Eq takes two types and checks whether they are equal. Supported types are int and string. Unsupported types will panic. +func Eq(a interface{}, b interface{}) bool { + av := reflect.ValueOf(a) + bv := reflect.ValueOf(b) + + switch av.Kind() { + case reflect.Array, reflect.Chan, reflect.Map, reflect.Slice: + panic("Eq called on unsupported type") + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return av.Int() == bv.Int() + case reflect.String: + return av.String() == bv.String() + } + return false +} + +func trimRightSpace(s string) string { + return strings.TrimRightFunc(s, unicode.IsSpace) +} + +// FIXME appendIfNotPresent is unused by cobra and should be removed in a version 2. It exists only for compatibility with users of cobra. + +// appendIfNotPresent will append stringToAppend to the end of s, but only if it's not yet present in s. +func appendIfNotPresent(s, stringToAppend string) string { + if strings.Contains(s, stringToAppend) { + return s + } + return s + " " + stringToAppend +} + +// rpad adds padding to the right of a string. +func rpad(s string, padding int) string { + template := fmt.Sprintf("%%-%ds", padding) + return fmt.Sprintf(template, s) +} + +// tmpl executes the given template text on data, writing the result to w. +func tmpl(w io.Writer, text string, data interface{}) error { + t := template.New("top") + t.Funcs(templateFuncs) + template.Must(t.Parse(text)) + return t.Execute(w, data) +} + +// ld compares two strings and returns the levenshtein distance between them. +func ld(s, t string, ignoreCase bool) int { + if ignoreCase { + s = strings.ToLower(s) + t = strings.ToLower(t) + } + d := make([][]int, len(s)+1) + for i := range d { + d[i] = make([]int, len(t)+1) + } + for i := range d { + d[i][0] = i + } + for j := range d[0] { + d[0][j] = j + } + for j := 1; j <= len(t); j++ { + for i := 1; i <= len(s); i++ { + if s[i-1] == t[j-1] { + d[i][j] = d[i-1][j-1] + } else { + min := d[i-1][j] + if d[i][j-1] < min { + min = d[i][j-1] + } + if d[i-1][j-1] < min { + min = d[i-1][j-1] + } + d[i][j] = min + 1 + } + } + + } + return d[len(s)][len(t)] +} + +func stringInSlice(a string, list []string) bool { + for _, b := range list { + if b == a { + return true + } + } + return false +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cobra/cobra/cmd/testdata/LICENSE.golden b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cobra/cobra/cmd/testdata/LICENSE.golden new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cobra/cobra/cmd/testdata/LICENSE.golden @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cobra/command.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cobra/command.go new file mode 100644 index 00000000..34d1bf36 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cobra/command.go @@ -0,0 +1,1517 @@ +// Copyright © 2013 Steve Francia . +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package cobra is a commander providing a simple interface to create powerful modern CLI interfaces. +// In addition to providing an interface, Cobra simultaneously provides a controller to organize your application code. +package cobra + +import ( + "bytes" + "fmt" + "io" + "os" + "path/filepath" + "sort" + "strings" + + flag "github.com/spf13/pflag" +) + +// FParseErrWhitelist configures Flag parse errors to be ignored +type FParseErrWhitelist flag.ParseErrorsWhitelist + +// Command is just that, a command for your application. +// E.g. 'go run ...' - 'run' is the command. Cobra requires +// you to define the usage and description as part of your command +// definition to ensure usability. +type Command struct { + // Use is the one-line usage message. + Use string + + // Aliases is an array of aliases that can be used instead of the first word in Use. + Aliases []string + + // SuggestFor is an array of command names for which this command will be suggested - + // similar to aliases but only suggests. + SuggestFor []string + + // Short is the short description shown in the 'help' output. + Short string + + // Long is the long message shown in the 'help ' output. + Long string + + // Example is examples of how to use the command. + Example string + + // ValidArgs is list of all valid non-flag arguments that are accepted in bash completions + ValidArgs []string + + // Expected arguments + Args PositionalArgs + + // ArgAliases is List of aliases for ValidArgs. + // These are not suggested to the user in the bash completion, + // but accepted if entered manually. + ArgAliases []string + + // BashCompletionFunction is custom functions used by the bash autocompletion generator. + BashCompletionFunction string + + // Deprecated defines, if this command is deprecated and should print this string when used. + Deprecated string + + // Hidden defines, if this command is hidden and should NOT show up in the list of available commands. + Hidden bool + + // Annotations are key/value pairs that can be used by applications to identify or + // group commands. + Annotations map[string]string + + // Version defines the version for this command. If this value is non-empty and the command does not + // define a "version" flag, a "version" boolean flag will be added to the command and, if specified, + // will print content of the "Version" variable. + Version string + + // The *Run functions are executed in the following order: + // * PersistentPreRun() + // * PreRun() + // * Run() + // * PostRun() + // * PersistentPostRun() + // All functions get the same args, the arguments after the command name. + // + // PersistentPreRun: children of this command will inherit and execute. + PersistentPreRun func(cmd *Command, args []string) + // PersistentPreRunE: PersistentPreRun but returns an error. + PersistentPreRunE func(cmd *Command, args []string) error + // PreRun: children of this command will not inherit. + PreRun func(cmd *Command, args []string) + // PreRunE: PreRun but returns an error. + PreRunE func(cmd *Command, args []string) error + // Run: Typically the actual work function. Most commands will only implement this. + Run func(cmd *Command, args []string) + // RunE: Run but returns an error. + RunE func(cmd *Command, args []string) error + // PostRun: run after the Run command. + PostRun func(cmd *Command, args []string) + // PostRunE: PostRun but returns an error. + PostRunE func(cmd *Command, args []string) error + // PersistentPostRun: children of this command will inherit and execute after PostRun. + PersistentPostRun func(cmd *Command, args []string) + // PersistentPostRunE: PersistentPostRun but returns an error. + PersistentPostRunE func(cmd *Command, args []string) error + + // SilenceErrors is an option to quiet errors down stream. + SilenceErrors bool + + // SilenceUsage is an option to silence usage when an error occurs. + SilenceUsage bool + + // DisableFlagParsing disables the flag parsing. + // If this is true all flags will be passed to the command as arguments. + DisableFlagParsing bool + + // DisableAutoGenTag defines, if gen tag ("Auto generated by spf13/cobra...") + // will be printed by generating docs for this command. + DisableAutoGenTag bool + + // DisableFlagsInUseLine will disable the addition of [flags] to the usage + // line of a command when printing help or generating docs + DisableFlagsInUseLine bool + + // DisableSuggestions disables the suggestions based on Levenshtein distance + // that go along with 'unknown command' messages. + DisableSuggestions bool + // SuggestionsMinimumDistance defines minimum levenshtein distance to display suggestions. + // Must be > 0. + SuggestionsMinimumDistance int + + // TraverseChildren parses flags on all parents before executing child command. + TraverseChildren bool + + //FParseErrWhitelist flag parse errors to be ignored + FParseErrWhitelist FParseErrWhitelist + + // commands is the list of commands supported by this program. + commands []*Command + // parent is a parent command for this command. + parent *Command + // Max lengths of commands' string lengths for use in padding. + commandsMaxUseLen int + commandsMaxCommandPathLen int + commandsMaxNameLen int + // commandsAreSorted defines, if command slice are sorted or not. + commandsAreSorted bool + // commandCalledAs is the name or alias value used to call this command. + commandCalledAs struct { + name string + called bool + } + + // args is actual args parsed from flags. + args []string + // flagErrorBuf contains all error messages from pflag. + flagErrorBuf *bytes.Buffer + // flags is full set of flags. + flags *flag.FlagSet + // pflags contains persistent flags. + pflags *flag.FlagSet + // lflags contains local flags. + lflags *flag.FlagSet + // iflags contains inherited flags. + iflags *flag.FlagSet + // parentsPflags is all persistent flags of cmd's parents. + parentsPflags *flag.FlagSet + // globNormFunc is the global normalization function + // that we can use on every pflag set and children commands + globNormFunc func(f *flag.FlagSet, name string) flag.NormalizedName + + // output is an output writer defined by user. + output io.Writer + // usageFunc is usage func defined by user. + usageFunc func(*Command) error + // usageTemplate is usage template defined by user. + usageTemplate string + // flagErrorFunc is func defined by user and it's called when the parsing of + // flags returns an error. + flagErrorFunc func(*Command, error) error + // helpTemplate is help template defined by user. + helpTemplate string + // helpFunc is help func defined by user. + helpFunc func(*Command, []string) + // helpCommand is command with usage 'help'. If it's not defined by user, + // cobra uses default help command. + helpCommand *Command + // versionTemplate is the version template defined by user. + versionTemplate string +} + +// SetArgs sets arguments for the command. It is set to os.Args[1:] by default, if desired, can be overridden +// particularly useful when testing. +func (c *Command) SetArgs(a []string) { + c.args = a +} + +// SetOutput sets the destination for usage and error messages. +// If output is nil, os.Stderr is used. +func (c *Command) SetOutput(output io.Writer) { + c.output = output +} + +// SetUsageFunc sets usage function. Usage can be defined by application. +func (c *Command) SetUsageFunc(f func(*Command) error) { + c.usageFunc = f +} + +// SetUsageTemplate sets usage template. Can be defined by Application. +func (c *Command) SetUsageTemplate(s string) { + c.usageTemplate = s +} + +// SetFlagErrorFunc sets a function to generate an error when flag parsing +// fails. +func (c *Command) SetFlagErrorFunc(f func(*Command, error) error) { + c.flagErrorFunc = f +} + +// SetHelpFunc sets help function. Can be defined by Application. +func (c *Command) SetHelpFunc(f func(*Command, []string)) { + c.helpFunc = f +} + +// SetHelpCommand sets help command. +func (c *Command) SetHelpCommand(cmd *Command) { + c.helpCommand = cmd +} + +// SetHelpTemplate sets help template to be used. Application can use it to set custom template. +func (c *Command) SetHelpTemplate(s string) { + c.helpTemplate = s +} + +// SetVersionTemplate sets version template to be used. Application can use it to set custom template. +func (c *Command) SetVersionTemplate(s string) { + c.versionTemplate = s +} + +// SetGlobalNormalizationFunc sets a normalization function to all flag sets and also to child commands. +// The user should not have a cyclic dependency on commands. +func (c *Command) SetGlobalNormalizationFunc(n func(f *flag.FlagSet, name string) flag.NormalizedName) { + c.Flags().SetNormalizeFunc(n) + c.PersistentFlags().SetNormalizeFunc(n) + c.globNormFunc = n + + for _, command := range c.commands { + command.SetGlobalNormalizationFunc(n) + } +} + +// OutOrStdout returns output to stdout. +func (c *Command) OutOrStdout() io.Writer { + return c.getOut(os.Stdout) +} + +// OutOrStderr returns output to stderr +func (c *Command) OutOrStderr() io.Writer { + return c.getOut(os.Stderr) +} + +func (c *Command) getOut(def io.Writer) io.Writer { + if c.output != nil { + return c.output + } + if c.HasParent() { + return c.parent.getOut(def) + } + return def +} + +// UsageFunc returns either the function set by SetUsageFunc for this command +// or a parent, or it returns a default usage function. +func (c *Command) UsageFunc() (f func(*Command) error) { + if c.usageFunc != nil { + return c.usageFunc + } + if c.HasParent() { + return c.Parent().UsageFunc() + } + return func(c *Command) error { + c.mergePersistentFlags() + err := tmpl(c.OutOrStderr(), c.UsageTemplate(), c) + if err != nil { + c.Println(err) + } + return err + } +} + +// Usage puts out the usage for the command. +// Used when a user provides invalid input. +// Can be defined by user by overriding UsageFunc. +func (c *Command) Usage() error { + return c.UsageFunc()(c) +} + +// HelpFunc returns either the function set by SetHelpFunc for this command +// or a parent, or it returns a function with default help behavior. +func (c *Command) HelpFunc() func(*Command, []string) { + if c.helpFunc != nil { + return c.helpFunc + } + if c.HasParent() { + return c.Parent().HelpFunc() + } + return func(c *Command, a []string) { + c.mergePersistentFlags() + err := tmpl(c.OutOrStdout(), c.HelpTemplate(), c) + if err != nil { + c.Println(err) + } + } +} + +// Help puts out the help for the command. +// Used when a user calls help [command]. +// Can be defined by user by overriding HelpFunc. +func (c *Command) Help() error { + c.HelpFunc()(c, []string{}) + return nil +} + +// UsageString return usage string. +func (c *Command) UsageString() string { + tmpOutput := c.output + bb := new(bytes.Buffer) + c.SetOutput(bb) + c.Usage() + c.output = tmpOutput + return bb.String() +} + +// FlagErrorFunc returns either the function set by SetFlagErrorFunc for this +// command or a parent, or it returns a function which returns the original +// error. +func (c *Command) FlagErrorFunc() (f func(*Command, error) error) { + if c.flagErrorFunc != nil { + return c.flagErrorFunc + } + + if c.HasParent() { + return c.parent.FlagErrorFunc() + } + return func(c *Command, err error) error { + return err + } +} + +var minUsagePadding = 25 + +// UsagePadding return padding for the usage. +func (c *Command) UsagePadding() int { + if c.parent == nil || minUsagePadding > c.parent.commandsMaxUseLen { + return minUsagePadding + } + return c.parent.commandsMaxUseLen +} + +var minCommandPathPadding = 11 + +// CommandPathPadding return padding for the command path. +func (c *Command) CommandPathPadding() int { + if c.parent == nil || minCommandPathPadding > c.parent.commandsMaxCommandPathLen { + return minCommandPathPadding + } + return c.parent.commandsMaxCommandPathLen +} + +var minNamePadding = 11 + +// NamePadding returns padding for the name. +func (c *Command) NamePadding() int { + if c.parent == nil || minNamePadding > c.parent.commandsMaxNameLen { + return minNamePadding + } + return c.parent.commandsMaxNameLen +} + +// UsageTemplate returns usage template for the command. +func (c *Command) UsageTemplate() string { + if c.usageTemplate != "" { + return c.usageTemplate + } + + if c.HasParent() { + return c.parent.UsageTemplate() + } + return `Usage:{{if .Runnable}} + {{.UseLine}}{{end}}{{if .HasAvailableSubCommands}} + {{.CommandPath}} [command]{{end}}{{if gt (len .Aliases) 0}} + +Aliases: + {{.NameAndAliases}}{{end}}{{if .HasExample}} + +Examples: +{{.Example}}{{end}}{{if .HasAvailableSubCommands}} + +Available Commands:{{range .Commands}}{{if (or .IsAvailableCommand (eq .Name "help"))}} + {{rpad .Name .NamePadding }} {{.Short}}{{end}}{{end}}{{end}}{{if .HasAvailableLocalFlags}} + +Flags: +{{.LocalFlags.FlagUsages | trimTrailingWhitespaces}}{{end}}{{if .HasAvailableInheritedFlags}} + +Global Flags: +{{.InheritedFlags.FlagUsages | trimTrailingWhitespaces}}{{end}}{{if .HasHelpSubCommands}} + +Additional help topics:{{range .Commands}}{{if .IsAdditionalHelpTopicCommand}} + {{rpad .CommandPath .CommandPathPadding}} {{.Short}}{{end}}{{end}}{{end}}{{if .HasAvailableSubCommands}} + +Use "{{.CommandPath}} [command] --help" for more information about a command.{{end}} +` +} + +// HelpTemplate return help template for the command. +func (c *Command) HelpTemplate() string { + if c.helpTemplate != "" { + return c.helpTemplate + } + + if c.HasParent() { + return c.parent.HelpTemplate() + } + return `{{with (or .Long .Short)}}{{. | trimTrailingWhitespaces}} + +{{end}}{{if or .Runnable .HasSubCommands}}{{.UsageString}}{{end}}` +} + +// VersionTemplate return version template for the command. +func (c *Command) VersionTemplate() string { + if c.versionTemplate != "" { + return c.versionTemplate + } + + if c.HasParent() { + return c.parent.VersionTemplate() + } + return `{{with .Name}}{{printf "%s " .}}{{end}}{{printf "version %s" .Version}} +` +} + +func hasNoOptDefVal(name string, fs *flag.FlagSet) bool { + flag := fs.Lookup(name) + if flag == nil { + return false + } + return flag.NoOptDefVal != "" +} + +func shortHasNoOptDefVal(name string, fs *flag.FlagSet) bool { + if len(name) == 0 { + return false + } + + flag := fs.ShorthandLookup(name[:1]) + if flag == nil { + return false + } + return flag.NoOptDefVal != "" +} + +func stripFlags(args []string, c *Command) []string { + if len(args) == 0 { + return args + } + c.mergePersistentFlags() + + commands := []string{} + flags := c.Flags() + +Loop: + for len(args) > 0 { + s := args[0] + args = args[1:] + switch { + case s == "--": + // "--" terminates the flags + break Loop + case strings.HasPrefix(s, "--") && !strings.Contains(s, "=") && !hasNoOptDefVal(s[2:], flags): + // If '--flag arg' then + // delete arg from args. + fallthrough // (do the same as below) + case strings.HasPrefix(s, "-") && !strings.Contains(s, "=") && len(s) == 2 && !shortHasNoOptDefVal(s[1:], flags): + // If '-f arg' then + // delete 'arg' from args or break the loop if len(args) <= 1. + if len(args) <= 1 { + break Loop + } else { + args = args[1:] + continue + } + case s != "" && !strings.HasPrefix(s, "-"): + commands = append(commands, s) + } + } + + return commands +} + +// argsMinusFirstX removes only the first x from args. Otherwise, commands that look like +// openshift admin policy add-role-to-user admin my-user, lose the admin argument (arg[4]). +func argsMinusFirstX(args []string, x string) []string { + for i, y := range args { + if x == y { + ret := []string{} + ret = append(ret, args[:i]...) + ret = append(ret, args[i+1:]...) + return ret + } + } + return args +} + +func isFlagArg(arg string) bool { + return ((len(arg) >= 3 && arg[1] == '-') || + (len(arg) >= 2 && arg[0] == '-' && arg[1] != '-')) +} + +// Find the target command given the args and command tree +// Meant to be run on the highest node. Only searches down. +func (c *Command) Find(args []string) (*Command, []string, error) { + var innerfind func(*Command, []string) (*Command, []string) + + innerfind = func(c *Command, innerArgs []string) (*Command, []string) { + argsWOflags := stripFlags(innerArgs, c) + if len(argsWOflags) == 0 { + return c, innerArgs + } + nextSubCmd := argsWOflags[0] + + cmd := c.findNext(nextSubCmd) + if cmd != nil { + return innerfind(cmd, argsMinusFirstX(innerArgs, nextSubCmd)) + } + return c, innerArgs + } + + commandFound, a := innerfind(c, args) + if commandFound.Args == nil { + return commandFound, a, legacyArgs(commandFound, stripFlags(a, commandFound)) + } + return commandFound, a, nil +} + +func (c *Command) findSuggestions(arg string) string { + if c.DisableSuggestions { + return "" + } + if c.SuggestionsMinimumDistance <= 0 { + c.SuggestionsMinimumDistance = 2 + } + suggestionsString := "" + if suggestions := c.SuggestionsFor(arg); len(suggestions) > 0 { + suggestionsString += "\n\nDid you mean this?\n" + for _, s := range suggestions { + suggestionsString += fmt.Sprintf("\t%v\n", s) + } + } + return suggestionsString +} + +func (c *Command) findNext(next string) *Command { + matches := make([]*Command, 0) + for _, cmd := range c.commands { + if cmd.Name() == next || cmd.HasAlias(next) { + cmd.commandCalledAs.name = next + return cmd + } + if EnablePrefixMatching && cmd.hasNameOrAliasPrefix(next) { + matches = append(matches, cmd) + } + } + + if len(matches) == 1 { + return matches[0] + } + + return nil +} + +// Traverse the command tree to find the command, and parse args for +// each parent. +func (c *Command) Traverse(args []string) (*Command, []string, error) { + flags := []string{} + inFlag := false + + for i, arg := range args { + switch { + // A long flag with a space separated value + case strings.HasPrefix(arg, "--") && !strings.Contains(arg, "="): + // TODO: this isn't quite right, we should really check ahead for 'true' or 'false' + inFlag = !hasNoOptDefVal(arg[2:], c.Flags()) + flags = append(flags, arg) + continue + // A short flag with a space separated value + case strings.HasPrefix(arg, "-") && !strings.Contains(arg, "=") && len(arg) == 2 && !shortHasNoOptDefVal(arg[1:], c.Flags()): + inFlag = true + flags = append(flags, arg) + continue + // The value for a flag + case inFlag: + inFlag = false + flags = append(flags, arg) + continue + // A flag without a value, or with an `=` separated value + case isFlagArg(arg): + flags = append(flags, arg) + continue + } + + cmd := c.findNext(arg) + if cmd == nil { + return c, args, nil + } + + if err := c.ParseFlags(flags); err != nil { + return nil, args, err + } + return cmd.Traverse(args[i+1:]) + } + return c, args, nil +} + +// SuggestionsFor provides suggestions for the typedName. +func (c *Command) SuggestionsFor(typedName string) []string { + suggestions := []string{} + for _, cmd := range c.commands { + if cmd.IsAvailableCommand() { + levenshteinDistance := ld(typedName, cmd.Name(), true) + suggestByLevenshtein := levenshteinDistance <= c.SuggestionsMinimumDistance + suggestByPrefix := strings.HasPrefix(strings.ToLower(cmd.Name()), strings.ToLower(typedName)) + if suggestByLevenshtein || suggestByPrefix { + suggestions = append(suggestions, cmd.Name()) + } + for _, explicitSuggestion := range cmd.SuggestFor { + if strings.EqualFold(typedName, explicitSuggestion) { + suggestions = append(suggestions, cmd.Name()) + } + } + } + } + return suggestions +} + +// VisitParents visits all parents of the command and invokes fn on each parent. +func (c *Command) VisitParents(fn func(*Command)) { + if c.HasParent() { + fn(c.Parent()) + c.Parent().VisitParents(fn) + } +} + +// Root finds root command. +func (c *Command) Root() *Command { + if c.HasParent() { + return c.Parent().Root() + } + return c +} + +// ArgsLenAtDash will return the length of c.Flags().Args at the moment +// when a -- was found during args parsing. +func (c *Command) ArgsLenAtDash() int { + return c.Flags().ArgsLenAtDash() +} + +func (c *Command) execute(a []string) (err error) { + if c == nil { + return fmt.Errorf("Called Execute() on a nil Command") + } + + if len(c.Deprecated) > 0 { + c.Printf("Command %q is deprecated, %s\n", c.Name(), c.Deprecated) + } + + // initialize help and version flag at the last point possible to allow for user + // overriding + c.InitDefaultHelpFlag() + c.InitDefaultVersionFlag() + + err = c.ParseFlags(a) + if err != nil { + return c.FlagErrorFunc()(c, err) + } + + // If help is called, regardless of other flags, return we want help. + // Also say we need help if the command isn't runnable. + helpVal, err := c.Flags().GetBool("help") + if err != nil { + // should be impossible to get here as we always declare a help + // flag in InitDefaultHelpFlag() + c.Println("\"help\" flag declared as non-bool. Please correct your code") + return err + } + + if helpVal { + return flag.ErrHelp + } + + // for back-compat, only add version flag behavior if version is defined + if c.Version != "" { + versionVal, err := c.Flags().GetBool("version") + if err != nil { + c.Println("\"version\" flag declared as non-bool. Please correct your code") + return err + } + if versionVal { + err := tmpl(c.OutOrStdout(), c.VersionTemplate(), c) + if err != nil { + c.Println(err) + } + return err + } + } + + if !c.Runnable() { + return flag.ErrHelp + } + + c.preRun() + + argWoFlags := c.Flags().Args() + if c.DisableFlagParsing { + argWoFlags = a + } + + if err := c.ValidateArgs(argWoFlags); err != nil { + return err + } + + for p := c; p != nil; p = p.Parent() { + if p.PersistentPreRunE != nil { + if err := p.PersistentPreRunE(c, argWoFlags); err != nil { + return err + } + break + } else if p.PersistentPreRun != nil { + p.PersistentPreRun(c, argWoFlags) + break + } + } + if c.PreRunE != nil { + if err := c.PreRunE(c, argWoFlags); err != nil { + return err + } + } else if c.PreRun != nil { + c.PreRun(c, argWoFlags) + } + + if err := c.validateRequiredFlags(); err != nil { + return err + } + if c.RunE != nil { + if err := c.RunE(c, argWoFlags); err != nil { + return err + } + } else { + c.Run(c, argWoFlags) + } + if c.PostRunE != nil { + if err := c.PostRunE(c, argWoFlags); err != nil { + return err + } + } else if c.PostRun != nil { + c.PostRun(c, argWoFlags) + } + for p := c; p != nil; p = p.Parent() { + if p.PersistentPostRunE != nil { + if err := p.PersistentPostRunE(c, argWoFlags); err != nil { + return err + } + break + } else if p.PersistentPostRun != nil { + p.PersistentPostRun(c, argWoFlags) + break + } + } + + return nil +} + +func (c *Command) preRun() { + for _, x := range initializers { + x() + } +} + +// Execute uses the args (os.Args[1:] by default) +// and run through the command tree finding appropriate matches +// for commands and then corresponding flags. +func (c *Command) Execute() error { + _, err := c.ExecuteC() + return err +} + +// ExecuteC executes the command. +func (c *Command) ExecuteC() (cmd *Command, err error) { + // Regardless of what command execute is called on, run on Root only + if c.HasParent() { + return c.Root().ExecuteC() + } + + // windows hook + if preExecHookFn != nil { + preExecHookFn(c) + } + + // initialize help as the last point possible to allow for user + // overriding + c.InitDefaultHelpCmd() + + var args []string + + // Workaround FAIL with "go test -v" or "cobra.test -test.v", see #155 + if c.args == nil && filepath.Base(os.Args[0]) != "cobra.test" { + args = os.Args[1:] + } else { + args = c.args + } + + var flags []string + if c.TraverseChildren { + cmd, flags, err = c.Traverse(args) + } else { + cmd, flags, err = c.Find(args) + } + if err != nil { + // If found parse to a subcommand and then failed, talk about the subcommand + if cmd != nil { + c = cmd + } + if !c.SilenceErrors { + c.Println("Error:", err.Error()) + c.Printf("Run '%v --help' for usage.\n", c.CommandPath()) + } + return c, err + } + + cmd.commandCalledAs.called = true + if cmd.commandCalledAs.name == "" { + cmd.commandCalledAs.name = cmd.Name() + } + + err = cmd.execute(flags) + if err != nil { + // Always show help if requested, even if SilenceErrors is in + // effect + if err == flag.ErrHelp { + cmd.HelpFunc()(cmd, args) + return cmd, nil + } + + // If root command has SilentErrors flagged, + // all subcommands should respect it + if !cmd.SilenceErrors && !c.SilenceErrors { + c.Println("Error:", err.Error()) + } + + // If root command has SilentUsage flagged, + // all subcommands should respect it + if !cmd.SilenceUsage && !c.SilenceUsage { + c.Println(cmd.UsageString()) + } + } + return cmd, err +} + +func (c *Command) ValidateArgs(args []string) error { + if c.Args == nil { + return nil + } + return c.Args(c, args) +} + +func (c *Command) validateRequiredFlags() error { + flags := c.Flags() + missingFlagNames := []string{} + flags.VisitAll(func(pflag *flag.Flag) { + requiredAnnotation, found := pflag.Annotations[BashCompOneRequiredFlag] + if !found { + return + } + if (requiredAnnotation[0] == "true") && !pflag.Changed { + missingFlagNames = append(missingFlagNames, pflag.Name) + } + }) + + if len(missingFlagNames) > 0 { + return fmt.Errorf(`required flag(s) "%s" not set`, strings.Join(missingFlagNames, `", "`)) + } + return nil +} + +// InitDefaultHelpFlag adds default help flag to c. +// It is called automatically by executing the c or by calling help and usage. +// If c already has help flag, it will do nothing. +func (c *Command) InitDefaultHelpFlag() { + c.mergePersistentFlags() + if c.Flags().Lookup("help") == nil { + usage := "help for " + if c.Name() == "" { + usage += "this command" + } else { + usage += c.Name() + } + c.Flags().BoolP("help", "h", false, usage) + } +} + +// InitDefaultVersionFlag adds default version flag to c. +// It is called automatically by executing the c. +// If c already has a version flag, it will do nothing. +// If c.Version is empty, it will do nothing. +func (c *Command) InitDefaultVersionFlag() { + if c.Version == "" { + return + } + + c.mergePersistentFlags() + if c.Flags().Lookup("version") == nil { + usage := "version for " + if c.Name() == "" { + usage += "this command" + } else { + usage += c.Name() + } + c.Flags().Bool("version", false, usage) + } +} + +// InitDefaultHelpCmd adds default help command to c. +// It is called automatically by executing the c or by calling help and usage. +// If c already has help command or c has no subcommands, it will do nothing. +func (c *Command) InitDefaultHelpCmd() { + if !c.HasSubCommands() { + return + } + + if c.helpCommand == nil { + c.helpCommand = &Command{ + Use: "help [command]", + Short: "Help about any command", + Long: `Help provides help for any command in the application. +Simply type ` + c.Name() + ` help [path to command] for full details.`, + + Run: func(c *Command, args []string) { + cmd, _, e := c.Root().Find(args) + if cmd == nil || e != nil { + c.Printf("Unknown help topic %#q\n", args) + c.Root().Usage() + } else { + cmd.InitDefaultHelpFlag() // make possible 'help' flag to be shown + cmd.Help() + } + }, + } + } + c.RemoveCommand(c.helpCommand) + c.AddCommand(c.helpCommand) +} + +// ResetCommands delete parent, subcommand and help command from c. +func (c *Command) ResetCommands() { + c.parent = nil + c.commands = nil + c.helpCommand = nil + c.parentsPflags = nil +} + +// Sorts commands by their names. +type commandSorterByName []*Command + +func (c commandSorterByName) Len() int { return len(c) } +func (c commandSorterByName) Swap(i, j int) { c[i], c[j] = c[j], c[i] } +func (c commandSorterByName) Less(i, j int) bool { return c[i].Name() < c[j].Name() } + +// Commands returns a sorted slice of child commands. +func (c *Command) Commands() []*Command { + // do not sort commands if it already sorted or sorting was disabled + if EnableCommandSorting && !c.commandsAreSorted { + sort.Sort(commandSorterByName(c.commands)) + c.commandsAreSorted = true + } + return c.commands +} + +// AddCommand adds one or more commands to this parent command. +func (c *Command) AddCommand(cmds ...*Command) { + for i, x := range cmds { + if cmds[i] == c { + panic("Command can't be a child of itself") + } + cmds[i].parent = c + // update max lengths + usageLen := len(x.Use) + if usageLen > c.commandsMaxUseLen { + c.commandsMaxUseLen = usageLen + } + commandPathLen := len(x.CommandPath()) + if commandPathLen > c.commandsMaxCommandPathLen { + c.commandsMaxCommandPathLen = commandPathLen + } + nameLen := len(x.Name()) + if nameLen > c.commandsMaxNameLen { + c.commandsMaxNameLen = nameLen + } + // If global normalization function exists, update all children + if c.globNormFunc != nil { + x.SetGlobalNormalizationFunc(c.globNormFunc) + } + c.commands = append(c.commands, x) + c.commandsAreSorted = false + } +} + +// RemoveCommand removes one or more commands from a parent command. +func (c *Command) RemoveCommand(cmds ...*Command) { + commands := []*Command{} +main: + for _, command := range c.commands { + for _, cmd := range cmds { + if command == cmd { + command.parent = nil + continue main + } + } + commands = append(commands, command) + } + c.commands = commands + // recompute all lengths + c.commandsMaxUseLen = 0 + c.commandsMaxCommandPathLen = 0 + c.commandsMaxNameLen = 0 + for _, command := range c.commands { + usageLen := len(command.Use) + if usageLen > c.commandsMaxUseLen { + c.commandsMaxUseLen = usageLen + } + commandPathLen := len(command.CommandPath()) + if commandPathLen > c.commandsMaxCommandPathLen { + c.commandsMaxCommandPathLen = commandPathLen + } + nameLen := len(command.Name()) + if nameLen > c.commandsMaxNameLen { + c.commandsMaxNameLen = nameLen + } + } +} + +// Print is a convenience method to Print to the defined output, fallback to Stderr if not set. +func (c *Command) Print(i ...interface{}) { + fmt.Fprint(c.OutOrStderr(), i...) +} + +// Println is a convenience method to Println to the defined output, fallback to Stderr if not set. +func (c *Command) Println(i ...interface{}) { + c.Print(fmt.Sprintln(i...)) +} + +// Printf is a convenience method to Printf to the defined output, fallback to Stderr if not set. +func (c *Command) Printf(format string, i ...interface{}) { + c.Print(fmt.Sprintf(format, i...)) +} + +// CommandPath returns the full path to this command. +func (c *Command) CommandPath() string { + if c.HasParent() { + return c.Parent().CommandPath() + " " + c.Name() + } + return c.Name() +} + +// UseLine puts out the full usage for a given command (including parents). +func (c *Command) UseLine() string { + var useline string + if c.HasParent() { + useline = c.parent.CommandPath() + " " + c.Use + } else { + useline = c.Use + } + if c.DisableFlagsInUseLine { + return useline + } + if c.HasAvailableFlags() && !strings.Contains(useline, "[flags]") { + useline += " [flags]" + } + return useline +} + +// DebugFlags used to determine which flags have been assigned to which commands +// and which persist. +func (c *Command) DebugFlags() { + c.Println("DebugFlags called on", c.Name()) + var debugflags func(*Command) + + debugflags = func(x *Command) { + if x.HasFlags() || x.HasPersistentFlags() { + c.Println(x.Name()) + } + if x.HasFlags() { + x.flags.VisitAll(func(f *flag.Flag) { + if x.HasPersistentFlags() && x.persistentFlag(f.Name) != nil { + c.Println(" -"+f.Shorthand+",", "--"+f.Name, "["+f.DefValue+"]", "", f.Value, " [LP]") + } else { + c.Println(" -"+f.Shorthand+",", "--"+f.Name, "["+f.DefValue+"]", "", f.Value, " [L]") + } + }) + } + if x.HasPersistentFlags() { + x.pflags.VisitAll(func(f *flag.Flag) { + if x.HasFlags() { + if x.flags.Lookup(f.Name) == nil { + c.Println(" -"+f.Shorthand+",", "--"+f.Name, "["+f.DefValue+"]", "", f.Value, " [P]") + } + } else { + c.Println(" -"+f.Shorthand+",", "--"+f.Name, "["+f.DefValue+"]", "", f.Value, " [P]") + } + }) + } + c.Println(x.flagErrorBuf) + if x.HasSubCommands() { + for _, y := range x.commands { + debugflags(y) + } + } + } + + debugflags(c) +} + +// Name returns the command's name: the first word in the use line. +func (c *Command) Name() string { + name := c.Use + i := strings.Index(name, " ") + if i >= 0 { + name = name[:i] + } + return name +} + +// HasAlias determines if a given string is an alias of the command. +func (c *Command) HasAlias(s string) bool { + for _, a := range c.Aliases { + if a == s { + return true + } + } + return false +} + +// CalledAs returns the command name or alias that was used to invoke +// this command or an empty string if the command has not been called. +func (c *Command) CalledAs() string { + if c.commandCalledAs.called { + return c.commandCalledAs.name + } + return "" +} + +// hasNameOrAliasPrefix returns true if the Name or any of aliases start +// with prefix +func (c *Command) hasNameOrAliasPrefix(prefix string) bool { + if strings.HasPrefix(c.Name(), prefix) { + c.commandCalledAs.name = c.Name() + return true + } + for _, alias := range c.Aliases { + if strings.HasPrefix(alias, prefix) { + c.commandCalledAs.name = alias + return true + } + } + return false +} + +// NameAndAliases returns a list of the command name and all aliases +func (c *Command) NameAndAliases() string { + return strings.Join(append([]string{c.Name()}, c.Aliases...), ", ") +} + +// HasExample determines if the command has example. +func (c *Command) HasExample() bool { + return len(c.Example) > 0 +} + +// Runnable determines if the command is itself runnable. +func (c *Command) Runnable() bool { + return c.Run != nil || c.RunE != nil +} + +// HasSubCommands determines if the command has children commands. +func (c *Command) HasSubCommands() bool { + return len(c.commands) > 0 +} + +// IsAvailableCommand determines if a command is available as a non-help command +// (this includes all non deprecated/hidden commands). +func (c *Command) IsAvailableCommand() bool { + if len(c.Deprecated) != 0 || c.Hidden { + return false + } + + if c.HasParent() && c.Parent().helpCommand == c { + return false + } + + if c.Runnable() || c.HasAvailableSubCommands() { + return true + } + + return false +} + +// IsAdditionalHelpTopicCommand determines if a command is an additional +// help topic command; additional help topic command is determined by the +// fact that it is NOT runnable/hidden/deprecated, and has no sub commands that +// are runnable/hidden/deprecated. +// Concrete example: https://github.com/spf13/cobra/issues/393#issuecomment-282741924. +func (c *Command) IsAdditionalHelpTopicCommand() bool { + // if a command is runnable, deprecated, or hidden it is not a 'help' command + if c.Runnable() || len(c.Deprecated) != 0 || c.Hidden { + return false + } + + // if any non-help sub commands are found, the command is not a 'help' command + for _, sub := range c.commands { + if !sub.IsAdditionalHelpTopicCommand() { + return false + } + } + + // the command either has no sub commands, or no non-help sub commands + return true +} + +// HasHelpSubCommands determines if a command has any available 'help' sub commands +// that need to be shown in the usage/help default template under 'additional help +// topics'. +func (c *Command) HasHelpSubCommands() bool { + // return true on the first found available 'help' sub command + for _, sub := range c.commands { + if sub.IsAdditionalHelpTopicCommand() { + return true + } + } + + // the command either has no sub commands, or no available 'help' sub commands + return false +} + +// HasAvailableSubCommands determines if a command has available sub commands that +// need to be shown in the usage/help default template under 'available commands'. +func (c *Command) HasAvailableSubCommands() bool { + // return true on the first found available (non deprecated/help/hidden) + // sub command + for _, sub := range c.commands { + if sub.IsAvailableCommand() { + return true + } + } + + // the command either has no sub commands, or no available (non deprecated/help/hidden) + // sub commands + return false +} + +// HasParent determines if the command is a child command. +func (c *Command) HasParent() bool { + return c.parent != nil +} + +// GlobalNormalizationFunc returns the global normalization function or nil if it doesn't exist. +func (c *Command) GlobalNormalizationFunc() func(f *flag.FlagSet, name string) flag.NormalizedName { + return c.globNormFunc +} + +// Flags returns the complete FlagSet that applies +// to this command (local and persistent declared here and by all parents). +func (c *Command) Flags() *flag.FlagSet { + if c.flags == nil { + c.flags = flag.NewFlagSet(c.Name(), flag.ContinueOnError) + if c.flagErrorBuf == nil { + c.flagErrorBuf = new(bytes.Buffer) + } + c.flags.SetOutput(c.flagErrorBuf) + } + + return c.flags +} + +// LocalNonPersistentFlags are flags specific to this command which will NOT persist to subcommands. +func (c *Command) LocalNonPersistentFlags() *flag.FlagSet { + persistentFlags := c.PersistentFlags() + + out := flag.NewFlagSet(c.Name(), flag.ContinueOnError) + c.LocalFlags().VisitAll(func(f *flag.Flag) { + if persistentFlags.Lookup(f.Name) == nil { + out.AddFlag(f) + } + }) + return out +} + +// LocalFlags returns the local FlagSet specifically set in the current command. +func (c *Command) LocalFlags() *flag.FlagSet { + c.mergePersistentFlags() + + if c.lflags == nil { + c.lflags = flag.NewFlagSet(c.Name(), flag.ContinueOnError) + if c.flagErrorBuf == nil { + c.flagErrorBuf = new(bytes.Buffer) + } + c.lflags.SetOutput(c.flagErrorBuf) + } + c.lflags.SortFlags = c.Flags().SortFlags + if c.globNormFunc != nil { + c.lflags.SetNormalizeFunc(c.globNormFunc) + } + + addToLocal := func(f *flag.Flag) { + if c.lflags.Lookup(f.Name) == nil && c.parentsPflags.Lookup(f.Name) == nil { + c.lflags.AddFlag(f) + } + } + c.Flags().VisitAll(addToLocal) + c.PersistentFlags().VisitAll(addToLocal) + return c.lflags +} + +// InheritedFlags returns all flags which were inherited from parents commands. +func (c *Command) InheritedFlags() *flag.FlagSet { + c.mergePersistentFlags() + + if c.iflags == nil { + c.iflags = flag.NewFlagSet(c.Name(), flag.ContinueOnError) + if c.flagErrorBuf == nil { + c.flagErrorBuf = new(bytes.Buffer) + } + c.iflags.SetOutput(c.flagErrorBuf) + } + + local := c.LocalFlags() + if c.globNormFunc != nil { + c.iflags.SetNormalizeFunc(c.globNormFunc) + } + + c.parentsPflags.VisitAll(func(f *flag.Flag) { + if c.iflags.Lookup(f.Name) == nil && local.Lookup(f.Name) == nil { + c.iflags.AddFlag(f) + } + }) + return c.iflags +} + +// NonInheritedFlags returns all flags which were not inherited from parent commands. +func (c *Command) NonInheritedFlags() *flag.FlagSet { + return c.LocalFlags() +} + +// PersistentFlags returns the persistent FlagSet specifically set in the current command. +func (c *Command) PersistentFlags() *flag.FlagSet { + if c.pflags == nil { + c.pflags = flag.NewFlagSet(c.Name(), flag.ContinueOnError) + if c.flagErrorBuf == nil { + c.flagErrorBuf = new(bytes.Buffer) + } + c.pflags.SetOutput(c.flagErrorBuf) + } + return c.pflags +} + +// ResetFlags deletes all flags from command. +func (c *Command) ResetFlags() { + c.flagErrorBuf = new(bytes.Buffer) + c.flagErrorBuf.Reset() + c.flags = flag.NewFlagSet(c.Name(), flag.ContinueOnError) + c.flags.SetOutput(c.flagErrorBuf) + c.pflags = flag.NewFlagSet(c.Name(), flag.ContinueOnError) + c.pflags.SetOutput(c.flagErrorBuf) + + c.lflags = nil + c.iflags = nil + c.parentsPflags = nil +} + +// HasFlags checks if the command contains any flags (local plus persistent from the entire structure). +func (c *Command) HasFlags() bool { + return c.Flags().HasFlags() +} + +// HasPersistentFlags checks if the command contains persistent flags. +func (c *Command) HasPersistentFlags() bool { + return c.PersistentFlags().HasFlags() +} + +// HasLocalFlags checks if the command has flags specifically declared locally. +func (c *Command) HasLocalFlags() bool { + return c.LocalFlags().HasFlags() +} + +// HasInheritedFlags checks if the command has flags inherited from its parent command. +func (c *Command) HasInheritedFlags() bool { + return c.InheritedFlags().HasFlags() +} + +// HasAvailableFlags checks if the command contains any flags (local plus persistent from the entire +// structure) which are not hidden or deprecated. +func (c *Command) HasAvailableFlags() bool { + return c.Flags().HasAvailableFlags() +} + +// HasAvailablePersistentFlags checks if the command contains persistent flags which are not hidden or deprecated. +func (c *Command) HasAvailablePersistentFlags() bool { + return c.PersistentFlags().HasAvailableFlags() +} + +// HasAvailableLocalFlags checks if the command has flags specifically declared locally which are not hidden +// or deprecated. +func (c *Command) HasAvailableLocalFlags() bool { + return c.LocalFlags().HasAvailableFlags() +} + +// HasAvailableInheritedFlags checks if the command has flags inherited from its parent command which are +// not hidden or deprecated. +func (c *Command) HasAvailableInheritedFlags() bool { + return c.InheritedFlags().HasAvailableFlags() +} + +// Flag climbs up the command tree looking for matching flag. +func (c *Command) Flag(name string) (flag *flag.Flag) { + flag = c.Flags().Lookup(name) + + if flag == nil { + flag = c.persistentFlag(name) + } + + return +} + +// Recursively find matching persistent flag. +func (c *Command) persistentFlag(name string) (flag *flag.Flag) { + if c.HasPersistentFlags() { + flag = c.PersistentFlags().Lookup(name) + } + + if flag == nil { + c.updateParentsPflags() + flag = c.parentsPflags.Lookup(name) + } + return +} + +// ParseFlags parses persistent flag tree and local flags. +func (c *Command) ParseFlags(args []string) error { + if c.DisableFlagParsing { + return nil + } + + if c.flagErrorBuf == nil { + c.flagErrorBuf = new(bytes.Buffer) + } + beforeErrorBufLen := c.flagErrorBuf.Len() + c.mergePersistentFlags() + + //do it here after merging all flags and just before parse + c.Flags().ParseErrorsWhitelist = flag.ParseErrorsWhitelist(c.FParseErrWhitelist) + + err := c.Flags().Parse(args) + // Print warnings if they occurred (e.g. deprecated flag messages). + if c.flagErrorBuf.Len()-beforeErrorBufLen > 0 && err == nil { + c.Print(c.flagErrorBuf.String()) + } + + return err +} + +// Parent returns a commands parent command. +func (c *Command) Parent() *Command { + return c.parent +} + +// mergePersistentFlags merges c.PersistentFlags() to c.Flags() +// and adds missing persistent flags of all parents. +func (c *Command) mergePersistentFlags() { + c.updateParentsPflags() + c.Flags().AddFlagSet(c.PersistentFlags()) + c.Flags().AddFlagSet(c.parentsPflags) +} + +// updateParentsPflags updates c.parentsPflags by adding +// new persistent flags of all parents. +// If c.parentsPflags == nil, it makes new. +func (c *Command) updateParentsPflags() { + if c.parentsPflags == nil { + c.parentsPflags = flag.NewFlagSet(c.Name(), flag.ContinueOnError) + c.parentsPflags.SetOutput(c.flagErrorBuf) + c.parentsPflags.SortFlags = false + } + + if c.globNormFunc != nil { + c.parentsPflags.SetNormalizeFunc(c.globNormFunc) + } + + c.Root().PersistentFlags().AddFlagSet(flag.CommandLine) + + c.VisitParents(func(parent *Command) { + c.parentsPflags.AddFlagSet(parent.PersistentFlags()) + }) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cobra/command_notwin.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cobra/command_notwin.go new file mode 100644 index 00000000..6159c1cc --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cobra/command_notwin.go @@ -0,0 +1,5 @@ +// +build !windows + +package cobra + +var preExecHookFn func(*Command) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cobra/command_win.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cobra/command_win.go new file mode 100644 index 00000000..edec728e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cobra/command_win.go @@ -0,0 +1,20 @@ +// +build windows + +package cobra + +import ( + "os" + "time" + + "github.com/inconshreveable/mousetrap" +) + +var preExecHookFn = preExecHook + +func preExecHook(c *Command) { + if MousetrapHelpText != "" && mousetrap.StartedByExplorer() { + c.Print(MousetrapHelpText) + time.Sleep(5 * time.Second) + os.Exit(1) + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cobra/zsh_completions.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cobra/zsh_completions.go new file mode 100644 index 00000000..889c22e2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/cobra/zsh_completions.go @@ -0,0 +1,126 @@ +package cobra + +import ( + "bytes" + "fmt" + "io" + "os" + "strings" +) + +// GenZshCompletionFile generates zsh completion file. +func (c *Command) GenZshCompletionFile(filename string) error { + outFile, err := os.Create(filename) + if err != nil { + return err + } + defer outFile.Close() + + return c.GenZshCompletion(outFile) +} + +// GenZshCompletion generates a zsh completion file and writes to the passed writer. +func (c *Command) GenZshCompletion(w io.Writer) error { + buf := new(bytes.Buffer) + + writeHeader(buf, c) + maxDepth := maxDepth(c) + writeLevelMapping(buf, maxDepth) + writeLevelCases(buf, maxDepth, c) + + _, err := buf.WriteTo(w) + return err +} + +func writeHeader(w io.Writer, cmd *Command) { + fmt.Fprintf(w, "#compdef %s\n\n", cmd.Name()) +} + +func maxDepth(c *Command) int { + if len(c.Commands()) == 0 { + return 0 + } + maxDepthSub := 0 + for _, s := range c.Commands() { + subDepth := maxDepth(s) + if subDepth > maxDepthSub { + maxDepthSub = subDepth + } + } + return 1 + maxDepthSub +} + +func writeLevelMapping(w io.Writer, numLevels int) { + fmt.Fprintln(w, `_arguments \`) + for i := 1; i <= numLevels; i++ { + fmt.Fprintf(w, ` '%d: :->level%d' \`, i, i) + fmt.Fprintln(w) + } + fmt.Fprintf(w, ` '%d: :%s'`, numLevels+1, "_files") + fmt.Fprintln(w) +} + +func writeLevelCases(w io.Writer, maxDepth int, root *Command) { + fmt.Fprintln(w, "case $state in") + defer fmt.Fprintln(w, "esac") + + for i := 1; i <= maxDepth; i++ { + fmt.Fprintf(w, " level%d)\n", i) + writeLevel(w, root, i) + fmt.Fprintln(w, " ;;") + } + fmt.Fprintln(w, " *)") + fmt.Fprintln(w, " _arguments '*: :_files'") + fmt.Fprintln(w, " ;;") +} + +func writeLevel(w io.Writer, root *Command, i int) { + fmt.Fprintf(w, " case $words[%d] in\n", i) + defer fmt.Fprintln(w, " esac") + + commands := filterByLevel(root, i) + byParent := groupByParent(commands) + + for p, c := range byParent { + names := names(c) + fmt.Fprintf(w, " %s)\n", p) + fmt.Fprintf(w, " _arguments '%d: :(%s)'\n", i, strings.Join(names, " ")) + fmt.Fprintln(w, " ;;") + } + fmt.Fprintln(w, " *)") + fmt.Fprintln(w, " _arguments '*: :_files'") + fmt.Fprintln(w, " ;;") + +} + +func filterByLevel(c *Command, l int) []*Command { + cs := make([]*Command, 0) + if l == 0 { + cs = append(cs, c) + return cs + } + for _, s := range c.Commands() { + cs = append(cs, filterByLevel(s, l-1)...) + } + return cs +} + +func groupByParent(commands []*Command) map[string][]*Command { + m := make(map[string][]*Command) + for _, c := range commands { + parent := c.Parent() + if parent == nil { + continue + } + m[parent.Name()] = append(m[parent.Name()], c) + } + return m +} + +func names(commands []*Command) []string { + ns := make([]string, len(commands)) + for i, c := range commands { + ns[i] = c.Name() + } + return ns +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/jwalterweatherman/.gitignore b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/jwalterweatherman/.gitignore new file mode 100644 index 00000000..00268614 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/jwalterweatherman/.gitignore @@ -0,0 +1,22 @@ +# Compiled Object files, Static and Dynamic libs (Shared Objects) +*.o +*.a +*.so + +# Folders +_obj +_test + +# Architecture specific extensions/prefixes +*.[568vq] +[568vq].out + +*.cgo1.go +*.cgo2.c +_cgo_defun.c +_cgo_gotypes.go +_cgo_export.* + +_testmain.go + +*.exe diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/jwalterweatherman/LICENSE b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/jwalterweatherman/LICENSE new file mode 100644 index 00000000..4527efb9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/jwalterweatherman/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Steve Francia + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/jwalterweatherman/README.md b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/jwalterweatherman/README.md new file mode 100644 index 00000000..932a23fc --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/jwalterweatherman/README.md @@ -0,0 +1,148 @@ +jWalterWeatherman +================= + +Seamless printing to the terminal (stdout) and logging to a io.Writer +(file) that’s as easy to use as fmt.Println. + +![and_that__s_why_you_always_leave_a_note_by_jonnyetc-d57q7um](https://cloud.githubusercontent.com/assets/173412/11002937/ccd01654-847d-11e5-828e-12ebaf582eaf.jpg) +Graphic by [JonnyEtc](http://jonnyetc.deviantart.com/art/And-That-s-Why-You-Always-Leave-a-Note-315311422) + +JWW is primarily a wrapper around the excellent standard log library. It +provides a few advantages over using the standard log library alone. + +1. Ready to go out of the box. +2. One library for both printing to the terminal and logging (to files). +3. Really easy to log to either a temp file or a file you specify. + + +I really wanted a very straightforward library that could seamlessly do +the following things. + +1. Replace all the println, printf, etc statements thoughout my code with + something more useful +2. Allow the user to easily control what levels are printed to stdout +3. Allow the user to easily control what levels are logged +4. Provide an easy mechanism (like fmt.Println) to print info to the user + which can be easily logged as well +5. Due to 2 & 3 provide easy verbose mode for output and logs +6. Not have any unnecessary initialization cruft. Just use it. + +# Usage + +## Step 1. Use it +Put calls throughout your source based on type of feedback. +No initialization or setup needs to happen. Just start calling things. + +Available Loggers are: + + * TRACE + * DEBUG + * INFO + * WARN + * ERROR + * CRITICAL + * FATAL + +These each are loggers based on the log standard library and follow the +standard usage. Eg. + +```go + import ( + jww "github.com/spf13/jwalterweatherman" + ) + + ... + + if err != nil { + + // This is a pretty serious error and the user should know about + // it. It will be printed to the terminal as well as logged under the + // default thresholds. + + jww.ERROR.Println(err) + } + + if err2 != nil { + // This error isn’t going to materially change the behavior of the + // application, but it’s something that may not be what the user + // expects. Under the default thresholds, Warn will be logged, but + // not printed to the terminal. + + jww.WARN.Println(err2) + } + + // Information that’s relevant to what’s happening, but not very + // important for the user. Under the default thresholds this will be + // discarded. + + jww.INFO.Printf("information %q", response) + +``` + +NOTE: You can also use the library in a non-global setting by creating an instance of a Notebook: + +```go +notepad = jww.NewNotepad(jww.LevelInfo, jww.LevelTrace, os.Stdout, ioutil.Discard, "", log.Ldate|log.Ltime) +notepad.WARN.Println("Some warning"") +``` + +_Why 7 levels?_ + +Maybe you think that 7 levels are too much for any application... and you +are probably correct. Just because there are seven levels doesn’t mean +that you should be using all 7 levels. Pick the right set for your needs. +Remember they only have to mean something to your project. + +## Step 2. Optionally configure JWW + +Under the default thresholds : + + * Debug, Trace & Info goto /dev/null + * Warn and above is logged (when a log file/io.Writer is provided) + * Error and above is printed to the terminal (stdout) + +### Changing the thresholds + +The threshold can be changed at any time, but will only affect calls that +execute after the change was made. + +This is very useful if your application has a verbose mode. Of course you +can decide what verbose means to you or even have multiple levels of +verbosity. + + +```go + import ( + jww "github.com/spf13/jwalterweatherman" + ) + + if Verbose { + jww.SetLogThreshold(jww.LevelTrace) + jww.SetStdoutThreshold(jww.LevelInfo) + } +``` + +Note that JWW's own internal output uses log levels as well, so set the log +level before making any other calls if you want to see what it's up to. + + +### Setting a log file + +JWW can log to any `io.Writer`: + + +```go + + jww.SetLogOutput(customWriter) + +``` + + +# More information + +This is an early release. I’ve been using it for a while and this is the +third interface I’ve tried. I like this one pretty well, but no guarantees +that it won’t change a bit. + +I wrote this for use in [hugo](https://gohugo.io). If you are looking +for a static website engine that’s super fast please checkout Hugo. diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/jwalterweatherman/default_notepad.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/jwalterweatherman/default_notepad.go new file mode 100644 index 00000000..bcb76340 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/jwalterweatherman/default_notepad.go @@ -0,0 +1,113 @@ +// Copyright © 2016 Steve Francia . +// +// Use of this source code is governed by an MIT-style +// license that can be found in the LICENSE file. + +package jwalterweatherman + +import ( + "io" + "io/ioutil" + "log" + "os" +) + +var ( + TRACE *log.Logger + DEBUG *log.Logger + INFO *log.Logger + WARN *log.Logger + ERROR *log.Logger + CRITICAL *log.Logger + FATAL *log.Logger + + LOG *log.Logger + FEEDBACK *Feedback + + defaultNotepad *Notepad +) + +func reloadDefaultNotepad() { + TRACE = defaultNotepad.TRACE + DEBUG = defaultNotepad.DEBUG + INFO = defaultNotepad.INFO + WARN = defaultNotepad.WARN + ERROR = defaultNotepad.ERROR + CRITICAL = defaultNotepad.CRITICAL + FATAL = defaultNotepad.FATAL + + LOG = defaultNotepad.LOG + FEEDBACK = defaultNotepad.FEEDBACK +} + +func init() { + defaultNotepad = NewNotepad(LevelError, LevelWarn, os.Stdout, ioutil.Discard, "", log.Ldate|log.Ltime) + reloadDefaultNotepad() +} + +// SetLogThreshold set the log threshold for the default notepad. Trace by default. +func SetLogThreshold(threshold Threshold) { + defaultNotepad.SetLogThreshold(threshold) + reloadDefaultNotepad() +} + +// SetLogOutput set the log output for the default notepad. Discarded by default. +func SetLogOutput(handle io.Writer) { + defaultNotepad.SetLogOutput(handle) + reloadDefaultNotepad() +} + +// SetStdoutThreshold set the standard output threshold for the default notepad. +// Info by default. +func SetStdoutThreshold(threshold Threshold) { + defaultNotepad.SetStdoutThreshold(threshold) + reloadDefaultNotepad() +} + +// SetPrefix set the prefix for the default logger. Empty by default. +func SetPrefix(prefix string) { + defaultNotepad.SetPrefix(prefix) + reloadDefaultNotepad() +} + +// SetFlags set the flags for the default logger. "log.Ldate | log.Ltime" by default. +func SetFlags(flags int) { + defaultNotepad.SetFlags(flags) + reloadDefaultNotepad() +} + +// Level returns the current global log threshold. +func LogThreshold() Threshold { + return defaultNotepad.logThreshold +} + +// Level returns the current global output threshold. +func StdoutThreshold() Threshold { + return defaultNotepad.stdoutThreshold +} + +// GetStdoutThreshold returns the defined Treshold for the log logger. +func GetLogThreshold() Threshold { + return defaultNotepad.GetLogThreshold() +} + +// GetStdoutThreshold returns the Treshold for the stdout logger. +func GetStdoutThreshold() Threshold { + return defaultNotepad.GetStdoutThreshold() +} + +// LogCountForLevel returns the number of log invocations for a given threshold. +func LogCountForLevel(l Threshold) uint64 { + return defaultNotepad.LogCountForLevel(l) +} + +// LogCountForLevelsGreaterThanorEqualTo returns the number of log invocations +// greater than or equal to a given threshold. +func LogCountForLevelsGreaterThanorEqualTo(threshold Threshold) uint64 { + return defaultNotepad.LogCountForLevelsGreaterThanorEqualTo(threshold) +} + +// ResetLogCounters resets the invocation counters for all levels. +func ResetLogCounters() { + defaultNotepad.ResetLogCounters() +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/jwalterweatherman/go.mod b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/jwalterweatherman/go.mod new file mode 100644 index 00000000..bce549c0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/jwalterweatherman/go.mod @@ -0,0 +1 @@ +module github.com/spf13/jwalterweatherman diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/jwalterweatherman/log_counter.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/jwalterweatherman/log_counter.go new file mode 100644 index 00000000..11423ac4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/jwalterweatherman/log_counter.go @@ -0,0 +1,55 @@ +// Copyright © 2016 Steve Francia . +// +// Use of this source code is governed by an MIT-style +// license that can be found in the LICENSE file. + +package jwalterweatherman + +import ( + "sync/atomic" +) + +type logCounter struct { + counter uint64 +} + +func (c *logCounter) incr() { + atomic.AddUint64(&c.counter, 1) +} + +func (c *logCounter) resetCounter() { + atomic.StoreUint64(&c.counter, 0) +} + +func (c *logCounter) getCount() uint64 { + return atomic.LoadUint64(&c.counter) +} + +func (c *logCounter) Write(p []byte) (n int, err error) { + c.incr() + return len(p), nil +} + +// LogCountForLevel returns the number of log invocations for a given threshold. +func (n *Notepad) LogCountForLevel(l Threshold) uint64 { + return n.logCounters[l].getCount() +} + +// LogCountForLevelsGreaterThanorEqualTo returns the number of log invocations +// greater than or equal to a given threshold. +func (n *Notepad) LogCountForLevelsGreaterThanorEqualTo(threshold Threshold) uint64 { + var cnt uint64 + + for i := int(threshold); i < len(n.logCounters); i++ { + cnt += n.LogCountForLevel(Threshold(i)) + } + + return cnt +} + +// ResetLogCounters resets the invocation counters for all levels. +func (n *Notepad) ResetLogCounters() { + for _, np := range n.logCounters { + np.resetCounter() + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/jwalterweatherman/notepad.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/jwalterweatherman/notepad.go new file mode 100644 index 00000000..ae5aaf71 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/jwalterweatherman/notepad.go @@ -0,0 +1,194 @@ +// Copyright © 2016 Steve Francia . +// +// Use of this source code is governed by an MIT-style +// license that can be found in the LICENSE file. + +package jwalterweatherman + +import ( + "fmt" + "io" + "log" +) + +type Threshold int + +func (t Threshold) String() string { + return prefixes[t] +} + +const ( + LevelTrace Threshold = iota + LevelDebug + LevelInfo + LevelWarn + LevelError + LevelCritical + LevelFatal +) + +var prefixes map[Threshold]string = map[Threshold]string{ + LevelTrace: "TRACE", + LevelDebug: "DEBUG", + LevelInfo: "INFO", + LevelWarn: "WARN", + LevelError: "ERROR", + LevelCritical: "CRITICAL", + LevelFatal: "FATAL", +} + +// Notepad is where you leave a note! +type Notepad struct { + TRACE *log.Logger + DEBUG *log.Logger + INFO *log.Logger + WARN *log.Logger + ERROR *log.Logger + CRITICAL *log.Logger + FATAL *log.Logger + + LOG *log.Logger + FEEDBACK *Feedback + + loggers [7]**log.Logger + logHandle io.Writer + outHandle io.Writer + logThreshold Threshold + stdoutThreshold Threshold + prefix string + flags int + + // One per Threshold + logCounters [7]*logCounter +} + +// NewNotepad create a new notepad. +func NewNotepad(outThreshold Threshold, logThreshold Threshold, outHandle, logHandle io.Writer, prefix string, flags int) *Notepad { + n := &Notepad{} + + n.loggers = [7]**log.Logger{&n.TRACE, &n.DEBUG, &n.INFO, &n.WARN, &n.ERROR, &n.CRITICAL, &n.FATAL} + n.outHandle = outHandle + n.logHandle = logHandle + n.stdoutThreshold = outThreshold + n.logThreshold = logThreshold + + if len(prefix) != 0 { + n.prefix = "[" + prefix + "] " + } else { + n.prefix = "" + } + + n.flags = flags + + n.LOG = log.New(n.logHandle, + "LOG: ", + n.flags) + n.FEEDBACK = &Feedback{out: log.New(outHandle, "", 0), log: n.LOG} + + n.init() + return n +} + +// init creates the loggers for each level depending on the notepad thresholds. +func (n *Notepad) init() { + logAndOut := io.MultiWriter(n.outHandle, n.logHandle) + + for t, logger := range n.loggers { + threshold := Threshold(t) + counter := &logCounter{} + n.logCounters[t] = counter + prefix := n.prefix + threshold.String() + " " + + switch { + case threshold >= n.logThreshold && threshold >= n.stdoutThreshold: + *logger = log.New(io.MultiWriter(counter, logAndOut), prefix, n.flags) + + case threshold >= n.logThreshold: + *logger = log.New(io.MultiWriter(counter, n.logHandle), prefix, n.flags) + + case threshold >= n.stdoutThreshold: + *logger = log.New(io.MultiWriter(counter, n.outHandle), prefix, n.flags) + + default: + // counter doesn't care about prefix and flags, so don't use them + // for performance. + *logger = log.New(counter, "", 0) + } + } +} + +// SetLogThreshold changes the threshold above which messages are written to the +// log file. +func (n *Notepad) SetLogThreshold(threshold Threshold) { + n.logThreshold = threshold + n.init() +} + +// SetLogOutput changes the file where log messages are written. +func (n *Notepad) SetLogOutput(handle io.Writer) { + n.logHandle = handle + n.init() +} + +// GetStdoutThreshold returns the defined Treshold for the log logger. +func (n *Notepad) GetLogThreshold() Threshold { + return n.logThreshold +} + +// SetStdoutThreshold changes the threshold above which messages are written to the +// standard output. +func (n *Notepad) SetStdoutThreshold(threshold Threshold) { + n.stdoutThreshold = threshold + n.init() +} + +// GetStdoutThreshold returns the Treshold for the stdout logger. +func (n *Notepad) GetStdoutThreshold() Threshold { + return n.stdoutThreshold +} + +// SetPrefix changes the prefix used by the notepad. Prefixes are displayed between +// brackets at the beginning of the line. An empty prefix won't be displayed at all. +func (n *Notepad) SetPrefix(prefix string) { + if len(prefix) != 0 { + n.prefix = "[" + prefix + "] " + } else { + n.prefix = "" + } + n.init() +} + +// SetFlags choose which flags the logger will display (after prefix and message +// level). See the package log for more informations on this. +func (n *Notepad) SetFlags(flags int) { + n.flags = flags + n.init() +} + +// Feedback writes plainly to the outHandle while +// logging with the standard extra information (date, file, etc). +type Feedback struct { + out *log.Logger + log *log.Logger +} + +func (fb *Feedback) Println(v ...interface{}) { + fb.output(fmt.Sprintln(v...)) +} + +func (fb *Feedback) Printf(format string, v ...interface{}) { + fb.output(fmt.Sprintf(format, v...)) +} + +func (fb *Feedback) Print(v ...interface{}) { + fb.output(fmt.Sprint(v...)) +} + +func (fb *Feedback) output(s string) { + if fb.out != nil { + fb.out.Output(2, s) + } + if fb.log != nil { + fb.log.Output(2, s) + } +} diff --git a/vendor/github.com/spf13/pflag/.gitignore b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/.gitignore similarity index 100% rename from vendor/github.com/spf13/pflag/.gitignore rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/.gitignore diff --git a/vendor/github.com/spf13/pflag/.travis.yml b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/.travis.yml similarity index 73% rename from vendor/github.com/spf13/pflag/.travis.yml rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/.travis.yml index 00d04cb9..f8a63b30 100644 --- a/vendor/github.com/spf13/pflag/.travis.yml +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/.travis.yml @@ -3,9 +3,8 @@ sudo: false language: go go: - - 1.9.x - - 1.10.x - - 1.11.x + - 1.7.3 + - 1.8.1 - tip matrix: @@ -13,7 +12,7 @@ matrix: - go: tip install: - - go get golang.org/x/lint/golint + - go get github.com/golang/lint/golint - export PATH=$GOPATH/bin:$PATH - go install ./... diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/LICENSE b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/LICENSE new file mode 100644 index 00000000..63ed1cfe --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/LICENSE @@ -0,0 +1,28 @@ +Copyright (c) 2012 Alex Ogier. All rights reserved. +Copyright (c) 2012 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/spf13/pflag/README.md b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/README.md similarity index 98% rename from vendor/github.com/spf13/pflag/README.md rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/README.md index 7eacc5bd..b052414d 100644 --- a/vendor/github.com/spf13/pflag/README.md +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/README.md @@ -86,8 +86,8 @@ fmt.Println("ip has value ", *ip) fmt.Println("flagvar has value ", flagvar) ``` -There are helper functions available to get the value stored in a Flag if you have a FlagSet but find -it difficult to keep up with all of the pointers in your code. +There are helpers function to get values later if you have the FlagSet but +it was difficult to keep up with all of the flag pointers in your code. If you have a pflag.FlagSet with a flag called 'flagname' of type int you can use GetInt() to get the int value. But notice that 'flagname' must exist and it must be an int. GetString("flagname") will fail. diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/bool.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/bool.go new file mode 100644 index 00000000..c4c5c0bf --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/bool.go @@ -0,0 +1,94 @@ +package pflag + +import "strconv" + +// optional interface to indicate boolean flags that can be +// supplied without "=value" text +type boolFlag interface { + Value + IsBoolFlag() bool +} + +// -- bool Value +type boolValue bool + +func newBoolValue(val bool, p *bool) *boolValue { + *p = val + return (*boolValue)(p) +} + +func (b *boolValue) Set(s string) error { + v, err := strconv.ParseBool(s) + *b = boolValue(v) + return err +} + +func (b *boolValue) Type() string { + return "bool" +} + +func (b *boolValue) String() string { return strconv.FormatBool(bool(*b)) } + +func (b *boolValue) IsBoolFlag() bool { return true } + +func boolConv(sval string) (interface{}, error) { + return strconv.ParseBool(sval) +} + +// GetBool return the bool value of a flag with the given name +func (f *FlagSet) GetBool(name string) (bool, error) { + val, err := f.getFlagType(name, "bool", boolConv) + if err != nil { + return false, err + } + return val.(bool), nil +} + +// BoolVar defines a bool flag with specified name, default value, and usage string. +// The argument p points to a bool variable in which to store the value of the flag. +func (f *FlagSet) BoolVar(p *bool, name string, value bool, usage string) { + f.BoolVarP(p, name, "", value, usage) +} + +// BoolVarP is like BoolVar, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) BoolVarP(p *bool, name, shorthand string, value bool, usage string) { + flag := f.VarPF(newBoolValue(value, p), name, shorthand, usage) + flag.NoOptDefVal = "true" +} + +// BoolVar defines a bool flag with specified name, default value, and usage string. +// The argument p points to a bool variable in which to store the value of the flag. +func BoolVar(p *bool, name string, value bool, usage string) { + BoolVarP(p, name, "", value, usage) +} + +// BoolVarP is like BoolVar, but accepts a shorthand letter that can be used after a single dash. +func BoolVarP(p *bool, name, shorthand string, value bool, usage string) { + flag := CommandLine.VarPF(newBoolValue(value, p), name, shorthand, usage) + flag.NoOptDefVal = "true" +} + +// Bool defines a bool flag with specified name, default value, and usage string. +// The return value is the address of a bool variable that stores the value of the flag. +func (f *FlagSet) Bool(name string, value bool, usage string) *bool { + return f.BoolP(name, "", value, usage) +} + +// BoolP is like Bool, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) BoolP(name, shorthand string, value bool, usage string) *bool { + p := new(bool) + f.BoolVarP(p, name, shorthand, value, usage) + return p +} + +// Bool defines a bool flag with specified name, default value, and usage string. +// The return value is the address of a bool variable that stores the value of the flag. +func Bool(name string, value bool, usage string) *bool { + return BoolP(name, "", value, usage) +} + +// BoolP is like Bool, but accepts a shorthand letter that can be used after a single dash. +func BoolP(name, shorthand string, value bool, usage string) *bool { + b := CommandLine.BoolP(name, shorthand, value, usage) + return b +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/bool_slice.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/bool_slice.go new file mode 100644 index 00000000..5af02f1a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/bool_slice.go @@ -0,0 +1,147 @@ +package pflag + +import ( + "io" + "strconv" + "strings" +) + +// -- boolSlice Value +type boolSliceValue struct { + value *[]bool + changed bool +} + +func newBoolSliceValue(val []bool, p *[]bool) *boolSliceValue { + bsv := new(boolSliceValue) + bsv.value = p + *bsv.value = val + return bsv +} + +// Set converts, and assigns, the comma-separated boolean argument string representation as the []bool value of this flag. +// If Set is called on a flag that already has a []bool assigned, the newly converted values will be appended. +func (s *boolSliceValue) Set(val string) error { + + // remove all quote characters + rmQuote := strings.NewReplacer(`"`, "", `'`, "", "`", "") + + // read flag arguments with CSV parser + boolStrSlice, err := readAsCSV(rmQuote.Replace(val)) + if err != nil && err != io.EOF { + return err + } + + // parse boolean values into slice + out := make([]bool, 0, len(boolStrSlice)) + for _, boolStr := range boolStrSlice { + b, err := strconv.ParseBool(strings.TrimSpace(boolStr)) + if err != nil { + return err + } + out = append(out, b) + } + + if !s.changed { + *s.value = out + } else { + *s.value = append(*s.value, out...) + } + + s.changed = true + + return nil +} + +// Type returns a string that uniquely represents this flag's type. +func (s *boolSliceValue) Type() string { + return "boolSlice" +} + +// String defines a "native" format for this boolean slice flag value. +func (s *boolSliceValue) String() string { + + boolStrSlice := make([]string, len(*s.value)) + for i, b := range *s.value { + boolStrSlice[i] = strconv.FormatBool(b) + } + + out, _ := writeAsCSV(boolStrSlice) + + return "[" + out + "]" +} + +func boolSliceConv(val string) (interface{}, error) { + val = strings.Trim(val, "[]") + // Empty string would cause a slice with one (empty) entry + if len(val) == 0 { + return []bool{}, nil + } + ss := strings.Split(val, ",") + out := make([]bool, len(ss)) + for i, t := range ss { + var err error + out[i], err = strconv.ParseBool(t) + if err != nil { + return nil, err + } + } + return out, nil +} + +// GetBoolSlice returns the []bool value of a flag with the given name. +func (f *FlagSet) GetBoolSlice(name string) ([]bool, error) { + val, err := f.getFlagType(name, "boolSlice", boolSliceConv) + if err != nil { + return []bool{}, err + } + return val.([]bool), nil +} + +// BoolSliceVar defines a boolSlice flag with specified name, default value, and usage string. +// The argument p points to a []bool variable in which to store the value of the flag. +func (f *FlagSet) BoolSliceVar(p *[]bool, name string, value []bool, usage string) { + f.VarP(newBoolSliceValue(value, p), name, "", usage) +} + +// BoolSliceVarP is like BoolSliceVar, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) BoolSliceVarP(p *[]bool, name, shorthand string, value []bool, usage string) { + f.VarP(newBoolSliceValue(value, p), name, shorthand, usage) +} + +// BoolSliceVar defines a []bool flag with specified name, default value, and usage string. +// The argument p points to a []bool variable in which to store the value of the flag. +func BoolSliceVar(p *[]bool, name string, value []bool, usage string) { + CommandLine.VarP(newBoolSliceValue(value, p), name, "", usage) +} + +// BoolSliceVarP is like BoolSliceVar, but accepts a shorthand letter that can be used after a single dash. +func BoolSliceVarP(p *[]bool, name, shorthand string, value []bool, usage string) { + CommandLine.VarP(newBoolSliceValue(value, p), name, shorthand, usage) +} + +// BoolSlice defines a []bool flag with specified name, default value, and usage string. +// The return value is the address of a []bool variable that stores the value of the flag. +func (f *FlagSet) BoolSlice(name string, value []bool, usage string) *[]bool { + p := []bool{} + f.BoolSliceVarP(&p, name, "", value, usage) + return &p +} + +// BoolSliceP is like BoolSlice, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) BoolSliceP(name, shorthand string, value []bool, usage string) *[]bool { + p := []bool{} + f.BoolSliceVarP(&p, name, shorthand, value, usage) + return &p +} + +// BoolSlice defines a []bool flag with specified name, default value, and usage string. +// The return value is the address of a []bool variable that stores the value of the flag. +func BoolSlice(name string, value []bool, usage string) *[]bool { + return CommandLine.BoolSliceP(name, "", value, usage) +} + +// BoolSliceP is like BoolSlice, but accepts a shorthand letter that can be used after a single dash. +func BoolSliceP(name, shorthand string, value []bool, usage string) *[]bool { + return CommandLine.BoolSliceP(name, shorthand, value, usage) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/bytes.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/bytes.go new file mode 100644 index 00000000..67d53045 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/bytes.go @@ -0,0 +1,209 @@ +package pflag + +import ( + "encoding/base64" + "encoding/hex" + "fmt" + "strings" +) + +// BytesHex adapts []byte for use as a flag. Value of flag is HEX encoded +type bytesHexValue []byte + +// String implements pflag.Value.String. +func (bytesHex bytesHexValue) String() string { + return fmt.Sprintf("%X", []byte(bytesHex)) +} + +// Set implements pflag.Value.Set. +func (bytesHex *bytesHexValue) Set(value string) error { + bin, err := hex.DecodeString(strings.TrimSpace(value)) + + if err != nil { + return err + } + + *bytesHex = bin + + return nil +} + +// Type implements pflag.Value.Type. +func (*bytesHexValue) Type() string { + return "bytesHex" +} + +func newBytesHexValue(val []byte, p *[]byte) *bytesHexValue { + *p = val + return (*bytesHexValue)(p) +} + +func bytesHexConv(sval string) (interface{}, error) { + + bin, err := hex.DecodeString(sval) + + if err == nil { + return bin, nil + } + + return nil, fmt.Errorf("invalid string being converted to Bytes: %s %s", sval, err) +} + +// GetBytesHex return the []byte value of a flag with the given name +func (f *FlagSet) GetBytesHex(name string) ([]byte, error) { + val, err := f.getFlagType(name, "bytesHex", bytesHexConv) + + if err != nil { + return []byte{}, err + } + + return val.([]byte), nil +} + +// BytesHexVar defines an []byte flag with specified name, default value, and usage string. +// The argument p points to an []byte variable in which to store the value of the flag. +func (f *FlagSet) BytesHexVar(p *[]byte, name string, value []byte, usage string) { + f.VarP(newBytesHexValue(value, p), name, "", usage) +} + +// BytesHexVarP is like BytesHexVar, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) BytesHexVarP(p *[]byte, name, shorthand string, value []byte, usage string) { + f.VarP(newBytesHexValue(value, p), name, shorthand, usage) +} + +// BytesHexVar defines an []byte flag with specified name, default value, and usage string. +// The argument p points to an []byte variable in which to store the value of the flag. +func BytesHexVar(p *[]byte, name string, value []byte, usage string) { + CommandLine.VarP(newBytesHexValue(value, p), name, "", usage) +} + +// BytesHexVarP is like BytesHexVar, but accepts a shorthand letter that can be used after a single dash. +func BytesHexVarP(p *[]byte, name, shorthand string, value []byte, usage string) { + CommandLine.VarP(newBytesHexValue(value, p), name, shorthand, usage) +} + +// BytesHex defines an []byte flag with specified name, default value, and usage string. +// The return value is the address of an []byte variable that stores the value of the flag. +func (f *FlagSet) BytesHex(name string, value []byte, usage string) *[]byte { + p := new([]byte) + f.BytesHexVarP(p, name, "", value, usage) + return p +} + +// BytesHexP is like BytesHex, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) BytesHexP(name, shorthand string, value []byte, usage string) *[]byte { + p := new([]byte) + f.BytesHexVarP(p, name, shorthand, value, usage) + return p +} + +// BytesHex defines an []byte flag with specified name, default value, and usage string. +// The return value is the address of an []byte variable that stores the value of the flag. +func BytesHex(name string, value []byte, usage string) *[]byte { + return CommandLine.BytesHexP(name, "", value, usage) +} + +// BytesHexP is like BytesHex, but accepts a shorthand letter that can be used after a single dash. +func BytesHexP(name, shorthand string, value []byte, usage string) *[]byte { + return CommandLine.BytesHexP(name, shorthand, value, usage) +} + +// BytesBase64 adapts []byte for use as a flag. Value of flag is Base64 encoded +type bytesBase64Value []byte + +// String implements pflag.Value.String. +func (bytesBase64 bytesBase64Value) String() string { + return base64.StdEncoding.EncodeToString([]byte(bytesBase64)) +} + +// Set implements pflag.Value.Set. +func (bytesBase64 *bytesBase64Value) Set(value string) error { + bin, err := base64.StdEncoding.DecodeString(strings.TrimSpace(value)) + + if err != nil { + return err + } + + *bytesBase64 = bin + + return nil +} + +// Type implements pflag.Value.Type. +func (*bytesBase64Value) Type() string { + return "bytesBase64" +} + +func newBytesBase64Value(val []byte, p *[]byte) *bytesBase64Value { + *p = val + return (*bytesBase64Value)(p) +} + +func bytesBase64ValueConv(sval string) (interface{}, error) { + + bin, err := base64.StdEncoding.DecodeString(sval) + if err == nil { + return bin, nil + } + + return nil, fmt.Errorf("invalid string being converted to Bytes: %s %s", sval, err) +} + +// GetBytesBase64 return the []byte value of a flag with the given name +func (f *FlagSet) GetBytesBase64(name string) ([]byte, error) { + val, err := f.getFlagType(name, "bytesBase64", bytesBase64ValueConv) + + if err != nil { + return []byte{}, err + } + + return val.([]byte), nil +} + +// BytesBase64Var defines an []byte flag with specified name, default value, and usage string. +// The argument p points to an []byte variable in which to store the value of the flag. +func (f *FlagSet) BytesBase64Var(p *[]byte, name string, value []byte, usage string) { + f.VarP(newBytesBase64Value(value, p), name, "", usage) +} + +// BytesBase64VarP is like BytesBase64Var, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) BytesBase64VarP(p *[]byte, name, shorthand string, value []byte, usage string) { + f.VarP(newBytesBase64Value(value, p), name, shorthand, usage) +} + +// BytesBase64Var defines an []byte flag with specified name, default value, and usage string. +// The argument p points to an []byte variable in which to store the value of the flag. +func BytesBase64Var(p *[]byte, name string, value []byte, usage string) { + CommandLine.VarP(newBytesBase64Value(value, p), name, "", usage) +} + +// BytesBase64VarP is like BytesBase64Var, but accepts a shorthand letter that can be used after a single dash. +func BytesBase64VarP(p *[]byte, name, shorthand string, value []byte, usage string) { + CommandLine.VarP(newBytesBase64Value(value, p), name, shorthand, usage) +} + +// BytesBase64 defines an []byte flag with specified name, default value, and usage string. +// The return value is the address of an []byte variable that stores the value of the flag. +func (f *FlagSet) BytesBase64(name string, value []byte, usage string) *[]byte { + p := new([]byte) + f.BytesBase64VarP(p, name, "", value, usage) + return p +} + +// BytesBase64P is like BytesBase64, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) BytesBase64P(name, shorthand string, value []byte, usage string) *[]byte { + p := new([]byte) + f.BytesBase64VarP(p, name, shorthand, value, usage) + return p +} + +// BytesBase64 defines an []byte flag with specified name, default value, and usage string. +// The return value is the address of an []byte variable that stores the value of the flag. +func BytesBase64(name string, value []byte, usage string) *[]byte { + return CommandLine.BytesBase64P(name, "", value, usage) +} + +// BytesBase64P is like BytesBase64, but accepts a shorthand letter that can be used after a single dash. +func BytesBase64P(name, shorthand string, value []byte, usage string) *[]byte { + return CommandLine.BytesBase64P(name, shorthand, value, usage) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/count.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/count.go new file mode 100644 index 00000000..aa126e44 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/count.go @@ -0,0 +1,96 @@ +package pflag + +import "strconv" + +// -- count Value +type countValue int + +func newCountValue(val int, p *int) *countValue { + *p = val + return (*countValue)(p) +} + +func (i *countValue) Set(s string) error { + // "+1" means that no specific value was passed, so increment + if s == "+1" { + *i = countValue(*i + 1) + return nil + } + v, err := strconv.ParseInt(s, 0, 0) + *i = countValue(v) + return err +} + +func (i *countValue) Type() string { + return "count" +} + +func (i *countValue) String() string { return strconv.Itoa(int(*i)) } + +func countConv(sval string) (interface{}, error) { + i, err := strconv.Atoi(sval) + if err != nil { + return nil, err + } + return i, nil +} + +// GetCount return the int value of a flag with the given name +func (f *FlagSet) GetCount(name string) (int, error) { + val, err := f.getFlagType(name, "count", countConv) + if err != nil { + return 0, err + } + return val.(int), nil +} + +// CountVar defines a count flag with specified name, default value, and usage string. +// The argument p points to an int variable in which to store the value of the flag. +// A count flag will add 1 to its value evey time it is found on the command line +func (f *FlagSet) CountVar(p *int, name string, usage string) { + f.CountVarP(p, name, "", usage) +} + +// CountVarP is like CountVar only take a shorthand for the flag name. +func (f *FlagSet) CountVarP(p *int, name, shorthand string, usage string) { + flag := f.VarPF(newCountValue(0, p), name, shorthand, usage) + flag.NoOptDefVal = "+1" +} + +// CountVar like CountVar only the flag is placed on the CommandLine instead of a given flag set +func CountVar(p *int, name string, usage string) { + CommandLine.CountVar(p, name, usage) +} + +// CountVarP is like CountVar only take a shorthand for the flag name. +func CountVarP(p *int, name, shorthand string, usage string) { + CommandLine.CountVarP(p, name, shorthand, usage) +} + +// Count defines a count flag with specified name, default value, and usage string. +// The return value is the address of an int variable that stores the value of the flag. +// A count flag will add 1 to its value evey time it is found on the command line +func (f *FlagSet) Count(name string, usage string) *int { + p := new(int) + f.CountVarP(p, name, "", usage) + return p +} + +// CountP is like Count only takes a shorthand for the flag name. +func (f *FlagSet) CountP(name, shorthand string, usage string) *int { + p := new(int) + f.CountVarP(p, name, shorthand, usage) + return p +} + +// Count defines a count flag with specified name, default value, and usage string. +// The return value is the address of an int variable that stores the value of the flag. +// A count flag will add 1 to its value evey time it is found on the command line +func Count(name string, usage string) *int { + return CommandLine.CountP(name, "", usage) +} + +// CountP is like Count only takes a shorthand for the flag name. +func CountP(name, shorthand string, usage string) *int { + return CommandLine.CountP(name, shorthand, usage) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/duration.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/duration.go new file mode 100644 index 00000000..e9debef8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/duration.go @@ -0,0 +1,86 @@ +package pflag + +import ( + "time" +) + +// -- time.Duration Value +type durationValue time.Duration + +func newDurationValue(val time.Duration, p *time.Duration) *durationValue { + *p = val + return (*durationValue)(p) +} + +func (d *durationValue) Set(s string) error { + v, err := time.ParseDuration(s) + *d = durationValue(v) + return err +} + +func (d *durationValue) Type() string { + return "duration" +} + +func (d *durationValue) String() string { return (*time.Duration)(d).String() } + +func durationConv(sval string) (interface{}, error) { + return time.ParseDuration(sval) +} + +// GetDuration return the duration value of a flag with the given name +func (f *FlagSet) GetDuration(name string) (time.Duration, error) { + val, err := f.getFlagType(name, "duration", durationConv) + if err != nil { + return 0, err + } + return val.(time.Duration), nil +} + +// DurationVar defines a time.Duration flag with specified name, default value, and usage string. +// The argument p points to a time.Duration variable in which to store the value of the flag. +func (f *FlagSet) DurationVar(p *time.Duration, name string, value time.Duration, usage string) { + f.VarP(newDurationValue(value, p), name, "", usage) +} + +// DurationVarP is like DurationVar, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) DurationVarP(p *time.Duration, name, shorthand string, value time.Duration, usage string) { + f.VarP(newDurationValue(value, p), name, shorthand, usage) +} + +// DurationVar defines a time.Duration flag with specified name, default value, and usage string. +// The argument p points to a time.Duration variable in which to store the value of the flag. +func DurationVar(p *time.Duration, name string, value time.Duration, usage string) { + CommandLine.VarP(newDurationValue(value, p), name, "", usage) +} + +// DurationVarP is like DurationVar, but accepts a shorthand letter that can be used after a single dash. +func DurationVarP(p *time.Duration, name, shorthand string, value time.Duration, usage string) { + CommandLine.VarP(newDurationValue(value, p), name, shorthand, usage) +} + +// Duration defines a time.Duration flag with specified name, default value, and usage string. +// The return value is the address of a time.Duration variable that stores the value of the flag. +func (f *FlagSet) Duration(name string, value time.Duration, usage string) *time.Duration { + p := new(time.Duration) + f.DurationVarP(p, name, "", value, usage) + return p +} + +// DurationP is like Duration, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) DurationP(name, shorthand string, value time.Duration, usage string) *time.Duration { + p := new(time.Duration) + f.DurationVarP(p, name, shorthand, value, usage) + return p +} + +// Duration defines a time.Duration flag with specified name, default value, and usage string. +// The return value is the address of a time.Duration variable that stores the value of the flag. +func Duration(name string, value time.Duration, usage string) *time.Duration { + return CommandLine.DurationP(name, "", value, usage) +} + +// DurationP is like Duration, but accepts a shorthand letter that can be used after a single dash. +func DurationP(name, shorthand string, value time.Duration, usage string) *time.Duration { + return CommandLine.DurationP(name, shorthand, value, usage) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/duration_slice.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/duration_slice.go new file mode 100644 index 00000000..52c6b6dc --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/duration_slice.go @@ -0,0 +1,128 @@ +package pflag + +import ( + "fmt" + "strings" + "time" +) + +// -- durationSlice Value +type durationSliceValue struct { + value *[]time.Duration + changed bool +} + +func newDurationSliceValue(val []time.Duration, p *[]time.Duration) *durationSliceValue { + dsv := new(durationSliceValue) + dsv.value = p + *dsv.value = val + return dsv +} + +func (s *durationSliceValue) Set(val string) error { + ss := strings.Split(val, ",") + out := make([]time.Duration, len(ss)) + for i, d := range ss { + var err error + out[i], err = time.ParseDuration(d) + if err != nil { + return err + } + + } + if !s.changed { + *s.value = out + } else { + *s.value = append(*s.value, out...) + } + s.changed = true + return nil +} + +func (s *durationSliceValue) Type() string { + return "durationSlice" +} + +func (s *durationSliceValue) String() string { + out := make([]string, len(*s.value)) + for i, d := range *s.value { + out[i] = fmt.Sprintf("%s", d) + } + return "[" + strings.Join(out, ",") + "]" +} + +func durationSliceConv(val string) (interface{}, error) { + val = strings.Trim(val, "[]") + // Empty string would cause a slice with one (empty) entry + if len(val) == 0 { + return []time.Duration{}, nil + } + ss := strings.Split(val, ",") + out := make([]time.Duration, len(ss)) + for i, d := range ss { + var err error + out[i], err = time.ParseDuration(d) + if err != nil { + return nil, err + } + + } + return out, nil +} + +// GetDurationSlice returns the []time.Duration value of a flag with the given name +func (f *FlagSet) GetDurationSlice(name string) ([]time.Duration, error) { + val, err := f.getFlagType(name, "durationSlice", durationSliceConv) + if err != nil { + return []time.Duration{}, err + } + return val.([]time.Duration), nil +} + +// DurationSliceVar defines a durationSlice flag with specified name, default value, and usage string. +// The argument p points to a []time.Duration variable in which to store the value of the flag. +func (f *FlagSet) DurationSliceVar(p *[]time.Duration, name string, value []time.Duration, usage string) { + f.VarP(newDurationSliceValue(value, p), name, "", usage) +} + +// DurationSliceVarP is like DurationSliceVar, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) DurationSliceVarP(p *[]time.Duration, name, shorthand string, value []time.Duration, usage string) { + f.VarP(newDurationSliceValue(value, p), name, shorthand, usage) +} + +// DurationSliceVar defines a duration[] flag with specified name, default value, and usage string. +// The argument p points to a duration[] variable in which to store the value of the flag. +func DurationSliceVar(p *[]time.Duration, name string, value []time.Duration, usage string) { + CommandLine.VarP(newDurationSliceValue(value, p), name, "", usage) +} + +// DurationSliceVarP is like DurationSliceVar, but accepts a shorthand letter that can be used after a single dash. +func DurationSliceVarP(p *[]time.Duration, name, shorthand string, value []time.Duration, usage string) { + CommandLine.VarP(newDurationSliceValue(value, p), name, shorthand, usage) +} + +// DurationSlice defines a []time.Duration flag with specified name, default value, and usage string. +// The return value is the address of a []time.Duration variable that stores the value of the flag. +func (f *FlagSet) DurationSlice(name string, value []time.Duration, usage string) *[]time.Duration { + p := []time.Duration{} + f.DurationSliceVarP(&p, name, "", value, usage) + return &p +} + +// DurationSliceP is like DurationSlice, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) DurationSliceP(name, shorthand string, value []time.Duration, usage string) *[]time.Duration { + p := []time.Duration{} + f.DurationSliceVarP(&p, name, shorthand, value, usage) + return &p +} + +// DurationSlice defines a []time.Duration flag with specified name, default value, and usage string. +// The return value is the address of a []time.Duration variable that stores the value of the flag. +func DurationSlice(name string, value []time.Duration, usage string) *[]time.Duration { + return CommandLine.DurationSliceP(name, "", value, usage) +} + +// DurationSliceP is like DurationSlice, but accepts a shorthand letter that can be used after a single dash. +func DurationSliceP(name, shorthand string, value []time.Duration, usage string) *[]time.Duration { + return CommandLine.DurationSliceP(name, shorthand, value, usage) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/flag.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/flag.go new file mode 100644 index 00000000..9beeda8e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/flag.go @@ -0,0 +1,1227 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +/* +Package pflag is a drop-in replacement for Go's flag package, implementing +POSIX/GNU-style --flags. + +pflag is compatible with the GNU extensions to the POSIX recommendations +for command-line options. See +http://www.gnu.org/software/libc/manual/html_node/Argument-Syntax.html + +Usage: + +pflag is a drop-in replacement of Go's native flag package. If you import +pflag under the name "flag" then all code should continue to function +with no changes. + + import flag "github.com/spf13/pflag" + +There is one exception to this: if you directly instantiate the Flag struct +there is one more field "Shorthand" that you will need to set. +Most code never instantiates this struct directly, and instead uses +functions such as String(), BoolVar(), and Var(), and is therefore +unaffected. + +Define flags using flag.String(), Bool(), Int(), etc. + +This declares an integer flag, -flagname, stored in the pointer ip, with type *int. + var ip = flag.Int("flagname", 1234, "help message for flagname") +If you like, you can bind the flag to a variable using the Var() functions. + var flagvar int + func init() { + flag.IntVar(&flagvar, "flagname", 1234, "help message for flagname") + } +Or you can create custom flags that satisfy the Value interface (with +pointer receivers) and couple them to flag parsing by + flag.Var(&flagVal, "name", "help message for flagname") +For such flags, the default value is just the initial value of the variable. + +After all flags are defined, call + flag.Parse() +to parse the command line into the defined flags. + +Flags may then be used directly. If you're using the flags themselves, +they are all pointers; if you bind to variables, they're values. + fmt.Println("ip has value ", *ip) + fmt.Println("flagvar has value ", flagvar) + +After parsing, the arguments after the flag are available as the +slice flag.Args() or individually as flag.Arg(i). +The arguments are indexed from 0 through flag.NArg()-1. + +The pflag package also defines some new functions that are not in flag, +that give one-letter shorthands for flags. You can use these by appending +'P' to the name of any function that defines a flag. + var ip = flag.IntP("flagname", "f", 1234, "help message") + var flagvar bool + func init() { + flag.BoolVarP("boolname", "b", true, "help message") + } + flag.VarP(&flagVar, "varname", "v", 1234, "help message") +Shorthand letters can be used with single dashes on the command line. +Boolean shorthand flags can be combined with other shorthand flags. + +Command line flag syntax: + --flag // boolean flags only + --flag=x + +Unlike the flag package, a single dash before an option means something +different than a double dash. Single dashes signify a series of shorthand +letters for flags. All but the last shorthand letter must be boolean flags. + // boolean flags + -f + -abc + // non-boolean flags + -n 1234 + -Ifile + // mixed + -abcs "hello" + -abcn1234 + +Flag parsing stops after the terminator "--". Unlike the flag package, +flags can be interspersed with arguments anywhere on the command line +before this terminator. + +Integer flags accept 1234, 0664, 0x1234 and may be negative. +Boolean flags (in their long form) accept 1, 0, t, f, true, false, +TRUE, FALSE, True, False. +Duration flags accept any input valid for time.ParseDuration. + +The default set of command-line flags is controlled by +top-level functions. The FlagSet type allows one to define +independent sets of flags, such as to implement subcommands +in a command-line interface. The methods of FlagSet are +analogous to the top-level functions for the command-line +flag set. +*/ +package pflag + +import ( + "bytes" + "errors" + goflag "flag" + "fmt" + "io" + "os" + "sort" + "strings" +) + +// ErrHelp is the error returned if the flag -help is invoked but no such flag is defined. +var ErrHelp = errors.New("pflag: help requested") + +// ErrorHandling defines how to handle flag parsing errors. +type ErrorHandling int + +const ( + // ContinueOnError will return an err from Parse() if an error is found + ContinueOnError ErrorHandling = iota + // ExitOnError will call os.Exit(2) if an error is found when parsing + ExitOnError + // PanicOnError will panic() if an error is found when parsing flags + PanicOnError +) + +// ParseErrorsWhitelist defines the parsing errors that can be ignored +type ParseErrorsWhitelist struct { + // UnknownFlags will ignore unknown flags errors and continue parsing rest of the flags + UnknownFlags bool +} + +// NormalizedName is a flag name that has been normalized according to rules +// for the FlagSet (e.g. making '-' and '_' equivalent). +type NormalizedName string + +// A FlagSet represents a set of defined flags. +type FlagSet struct { + // Usage is the function called when an error occurs while parsing flags. + // The field is a function (not a method) that may be changed to point to + // a custom error handler. + Usage func() + + // SortFlags is used to indicate, if user wants to have sorted flags in + // help/usage messages. + SortFlags bool + + // ParseErrorsWhitelist is used to configure a whitelist of errors + ParseErrorsWhitelist ParseErrorsWhitelist + + name string + parsed bool + actual map[NormalizedName]*Flag + orderedActual []*Flag + sortedActual []*Flag + formal map[NormalizedName]*Flag + orderedFormal []*Flag + sortedFormal []*Flag + shorthands map[byte]*Flag + args []string // arguments after flags + argsLenAtDash int // len(args) when a '--' was located when parsing, or -1 if no -- + errorHandling ErrorHandling + output io.Writer // nil means stderr; use out() accessor + interspersed bool // allow interspersed option/non-option args + normalizeNameFunc func(f *FlagSet, name string) NormalizedName + + addedGoFlagSets []*goflag.FlagSet +} + +// A Flag represents the state of a flag. +type Flag struct { + Name string // name as it appears on command line + Shorthand string // one-letter abbreviated flag + Usage string // help message + Value Value // value as set + DefValue string // default value (as text); for usage message + Changed bool // If the user set the value (or if left to default) + NoOptDefVal string // default value (as text); if the flag is on the command line without any options + Deprecated string // If this flag is deprecated, this string is the new or now thing to use + Hidden bool // used by cobra.Command to allow flags to be hidden from help/usage text + ShorthandDeprecated string // If the shorthand of this flag is deprecated, this string is the new or now thing to use + Annotations map[string][]string // used by cobra.Command bash autocomple code +} + +// Value is the interface to the dynamic value stored in a flag. +// (The default value is represented as a string.) +type Value interface { + String() string + Set(string) error + Type() string +} + +// sortFlags returns the flags as a slice in lexicographical sorted order. +func sortFlags(flags map[NormalizedName]*Flag) []*Flag { + list := make(sort.StringSlice, len(flags)) + i := 0 + for k := range flags { + list[i] = string(k) + i++ + } + list.Sort() + result := make([]*Flag, len(list)) + for i, name := range list { + result[i] = flags[NormalizedName(name)] + } + return result +} + +// SetNormalizeFunc allows you to add a function which can translate flag names. +// Flags added to the FlagSet will be translated and then when anything tries to +// look up the flag that will also be translated. So it would be possible to create +// a flag named "getURL" and have it translated to "geturl". A user could then pass +// "--getUrl" which may also be translated to "geturl" and everything will work. +func (f *FlagSet) SetNormalizeFunc(n func(f *FlagSet, name string) NormalizedName) { + f.normalizeNameFunc = n + f.sortedFormal = f.sortedFormal[:0] + for fname, flag := range f.formal { + nname := f.normalizeFlagName(flag.Name) + if fname == nname { + continue + } + flag.Name = string(nname) + delete(f.formal, fname) + f.formal[nname] = flag + if _, set := f.actual[fname]; set { + delete(f.actual, fname) + f.actual[nname] = flag + } + } +} + +// GetNormalizeFunc returns the previously set NormalizeFunc of a function which +// does no translation, if not set previously. +func (f *FlagSet) GetNormalizeFunc() func(f *FlagSet, name string) NormalizedName { + if f.normalizeNameFunc != nil { + return f.normalizeNameFunc + } + return func(f *FlagSet, name string) NormalizedName { return NormalizedName(name) } +} + +func (f *FlagSet) normalizeFlagName(name string) NormalizedName { + n := f.GetNormalizeFunc() + return n(f, name) +} + +func (f *FlagSet) out() io.Writer { + if f.output == nil { + return os.Stderr + } + return f.output +} + +// SetOutput sets the destination for usage and error messages. +// If output is nil, os.Stderr is used. +func (f *FlagSet) SetOutput(output io.Writer) { + f.output = output +} + +// VisitAll visits the flags in lexicographical order or +// in primordial order if f.SortFlags is false, calling fn for each. +// It visits all flags, even those not set. +func (f *FlagSet) VisitAll(fn func(*Flag)) { + if len(f.formal) == 0 { + return + } + + var flags []*Flag + if f.SortFlags { + if len(f.formal) != len(f.sortedFormal) { + f.sortedFormal = sortFlags(f.formal) + } + flags = f.sortedFormal + } else { + flags = f.orderedFormal + } + + for _, flag := range flags { + fn(flag) + } +} + +// HasFlags returns a bool to indicate if the FlagSet has any flags defined. +func (f *FlagSet) HasFlags() bool { + return len(f.formal) > 0 +} + +// HasAvailableFlags returns a bool to indicate if the FlagSet has any flags +// that are not hidden. +func (f *FlagSet) HasAvailableFlags() bool { + for _, flag := range f.formal { + if !flag.Hidden { + return true + } + } + return false +} + +// VisitAll visits the command-line flags in lexicographical order or +// in primordial order if f.SortFlags is false, calling fn for each. +// It visits all flags, even those not set. +func VisitAll(fn func(*Flag)) { + CommandLine.VisitAll(fn) +} + +// Visit visits the flags in lexicographical order or +// in primordial order if f.SortFlags is false, calling fn for each. +// It visits only those flags that have been set. +func (f *FlagSet) Visit(fn func(*Flag)) { + if len(f.actual) == 0 { + return + } + + var flags []*Flag + if f.SortFlags { + if len(f.actual) != len(f.sortedActual) { + f.sortedActual = sortFlags(f.actual) + } + flags = f.sortedActual + } else { + flags = f.orderedActual + } + + for _, flag := range flags { + fn(flag) + } +} + +// Visit visits the command-line flags in lexicographical order or +// in primordial order if f.SortFlags is false, calling fn for each. +// It visits only those flags that have been set. +func Visit(fn func(*Flag)) { + CommandLine.Visit(fn) +} + +// Lookup returns the Flag structure of the named flag, returning nil if none exists. +func (f *FlagSet) Lookup(name string) *Flag { + return f.lookup(f.normalizeFlagName(name)) +} + +// ShorthandLookup returns the Flag structure of the short handed flag, +// returning nil if none exists. +// It panics, if len(name) > 1. +func (f *FlagSet) ShorthandLookup(name string) *Flag { + if name == "" { + return nil + } + if len(name) > 1 { + msg := fmt.Sprintf("can not look up shorthand which is more than one ASCII character: %q", name) + fmt.Fprintf(f.out(), msg) + panic(msg) + } + c := name[0] + return f.shorthands[c] +} + +// lookup returns the Flag structure of the named flag, returning nil if none exists. +func (f *FlagSet) lookup(name NormalizedName) *Flag { + return f.formal[name] +} + +// func to return a given type for a given flag name +func (f *FlagSet) getFlagType(name string, ftype string, convFunc func(sval string) (interface{}, error)) (interface{}, error) { + flag := f.Lookup(name) + if flag == nil { + err := fmt.Errorf("flag accessed but not defined: %s", name) + return nil, err + } + + if flag.Value.Type() != ftype { + err := fmt.Errorf("trying to get %s value of flag of type %s", ftype, flag.Value.Type()) + return nil, err + } + + sval := flag.Value.String() + result, err := convFunc(sval) + if err != nil { + return nil, err + } + return result, nil +} + +// ArgsLenAtDash will return the length of f.Args at the moment when a -- was +// found during arg parsing. This allows your program to know which args were +// before the -- and which came after. +func (f *FlagSet) ArgsLenAtDash() int { + return f.argsLenAtDash +} + +// MarkDeprecated indicated that a flag is deprecated in your program. It will +// continue to function but will not show up in help or usage messages. Using +// this flag will also print the given usageMessage. +func (f *FlagSet) MarkDeprecated(name string, usageMessage string) error { + flag := f.Lookup(name) + if flag == nil { + return fmt.Errorf("flag %q does not exist", name) + } + if usageMessage == "" { + return fmt.Errorf("deprecated message for flag %q must be set", name) + } + flag.Deprecated = usageMessage + flag.Hidden = true + return nil +} + +// MarkShorthandDeprecated will mark the shorthand of a flag deprecated in your +// program. It will continue to function but will not show up in help or usage +// messages. Using this flag will also print the given usageMessage. +func (f *FlagSet) MarkShorthandDeprecated(name string, usageMessage string) error { + flag := f.Lookup(name) + if flag == nil { + return fmt.Errorf("flag %q does not exist", name) + } + if usageMessage == "" { + return fmt.Errorf("deprecated message for flag %q must be set", name) + } + flag.ShorthandDeprecated = usageMessage + return nil +} + +// MarkHidden sets a flag to 'hidden' in your program. It will continue to +// function but will not show up in help or usage messages. +func (f *FlagSet) MarkHidden(name string) error { + flag := f.Lookup(name) + if flag == nil { + return fmt.Errorf("flag %q does not exist", name) + } + flag.Hidden = true + return nil +} + +// Lookup returns the Flag structure of the named command-line flag, +// returning nil if none exists. +func Lookup(name string) *Flag { + return CommandLine.Lookup(name) +} + +// ShorthandLookup returns the Flag structure of the short handed flag, +// returning nil if none exists. +func ShorthandLookup(name string) *Flag { + return CommandLine.ShorthandLookup(name) +} + +// Set sets the value of the named flag. +func (f *FlagSet) Set(name, value string) error { + normalName := f.normalizeFlagName(name) + flag, ok := f.formal[normalName] + if !ok { + return fmt.Errorf("no such flag -%v", name) + } + + err := flag.Value.Set(value) + if err != nil { + var flagName string + if flag.Shorthand != "" && flag.ShorthandDeprecated == "" { + flagName = fmt.Sprintf("-%s, --%s", flag.Shorthand, flag.Name) + } else { + flagName = fmt.Sprintf("--%s", flag.Name) + } + return fmt.Errorf("invalid argument %q for %q flag: %v", value, flagName, err) + } + + if !flag.Changed { + if f.actual == nil { + f.actual = make(map[NormalizedName]*Flag) + } + f.actual[normalName] = flag + f.orderedActual = append(f.orderedActual, flag) + + flag.Changed = true + } + + if flag.Deprecated != "" { + fmt.Fprintf(f.out(), "Flag --%s has been deprecated, %s\n", flag.Name, flag.Deprecated) + } + return nil +} + +// SetAnnotation allows one to set arbitrary annotations on a flag in the FlagSet. +// This is sometimes used by spf13/cobra programs which want to generate additional +// bash completion information. +func (f *FlagSet) SetAnnotation(name, key string, values []string) error { + normalName := f.normalizeFlagName(name) + flag, ok := f.formal[normalName] + if !ok { + return fmt.Errorf("no such flag -%v", name) + } + if flag.Annotations == nil { + flag.Annotations = map[string][]string{} + } + flag.Annotations[key] = values + return nil +} + +// Changed returns true if the flag was explicitly set during Parse() and false +// otherwise +func (f *FlagSet) Changed(name string) bool { + flag := f.Lookup(name) + // If a flag doesn't exist, it wasn't changed.... + if flag == nil { + return false + } + return flag.Changed +} + +// Set sets the value of the named command-line flag. +func Set(name, value string) error { + return CommandLine.Set(name, value) +} + +// PrintDefaults prints, to standard error unless configured +// otherwise, the default values of all defined flags in the set. +func (f *FlagSet) PrintDefaults() { + usages := f.FlagUsages() + fmt.Fprint(f.out(), usages) +} + +// defaultIsZeroValue returns true if the default value for this flag represents +// a zero value. +func (f *Flag) defaultIsZeroValue() bool { + switch f.Value.(type) { + case boolFlag: + return f.DefValue == "false" + case *durationValue: + // Beginning in Go 1.7, duration zero values are "0s" + return f.DefValue == "0" || f.DefValue == "0s" + case *intValue, *int8Value, *int32Value, *int64Value, *uintValue, *uint8Value, *uint16Value, *uint32Value, *uint64Value, *countValue, *float32Value, *float64Value: + return f.DefValue == "0" + case *stringValue: + return f.DefValue == "" + case *ipValue, *ipMaskValue, *ipNetValue: + return f.DefValue == "" + case *intSliceValue, *stringSliceValue, *stringArrayValue: + return f.DefValue == "[]" + default: + switch f.Value.String() { + case "false": + return true + case "": + return true + case "": + return true + case "0": + return true + } + return false + } +} + +// UnquoteUsage extracts a back-quoted name from the usage +// string for a flag and returns it and the un-quoted usage. +// Given "a `name` to show" it returns ("name", "a name to show"). +// If there are no back quotes, the name is an educated guess of the +// type of the flag's value, or the empty string if the flag is boolean. +func UnquoteUsage(flag *Flag) (name string, usage string) { + // Look for a back-quoted name, but avoid the strings package. + usage = flag.Usage + for i := 0; i < len(usage); i++ { + if usage[i] == '`' { + for j := i + 1; j < len(usage); j++ { + if usage[j] == '`' { + name = usage[i+1 : j] + usage = usage[:i] + name + usage[j+1:] + return name, usage + } + } + break // Only one back quote; use type name. + } + } + + name = flag.Value.Type() + switch name { + case "bool": + name = "" + case "float64": + name = "float" + case "int64": + name = "int" + case "uint64": + name = "uint" + case "stringSlice": + name = "strings" + case "intSlice": + name = "ints" + case "uintSlice": + name = "uints" + case "boolSlice": + name = "bools" + } + + return +} + +// Splits the string `s` on whitespace into an initial substring up to +// `i` runes in length and the remainder. Will go `slop` over `i` if +// that encompasses the entire string (which allows the caller to +// avoid short orphan words on the final line). +func wrapN(i, slop int, s string) (string, string) { + if i+slop > len(s) { + return s, "" + } + + w := strings.LastIndexAny(s[:i], " \t\n") + if w <= 0 { + return s, "" + } + nlPos := strings.LastIndex(s[:i], "\n") + if nlPos > 0 && nlPos < w { + return s[:nlPos], s[nlPos+1:] + } + return s[:w], s[w+1:] +} + +// Wraps the string `s` to a maximum width `w` with leading indent +// `i`. The first line is not indented (this is assumed to be done by +// caller). Pass `w` == 0 to do no wrapping +func wrap(i, w int, s string) string { + if w == 0 { + return strings.Replace(s, "\n", "\n"+strings.Repeat(" ", i), -1) + } + + // space between indent i and end of line width w into which + // we should wrap the text. + wrap := w - i + + var r, l string + + // Not enough space for sensible wrapping. Wrap as a block on + // the next line instead. + if wrap < 24 { + i = 16 + wrap = w - i + r += "\n" + strings.Repeat(" ", i) + } + // If still not enough space then don't even try to wrap. + if wrap < 24 { + return strings.Replace(s, "\n", r, -1) + } + + // Try to avoid short orphan words on the final line, by + // allowing wrapN to go a bit over if that would fit in the + // remainder of the line. + slop := 5 + wrap = wrap - slop + + // Handle first line, which is indented by the caller (or the + // special case above) + l, s = wrapN(wrap, slop, s) + r = r + strings.Replace(l, "\n", "\n"+strings.Repeat(" ", i), -1) + + // Now wrap the rest + for s != "" { + var t string + + t, s = wrapN(wrap, slop, s) + r = r + "\n" + strings.Repeat(" ", i) + strings.Replace(t, "\n", "\n"+strings.Repeat(" ", i), -1) + } + + return r + +} + +// FlagUsagesWrapped returns a string containing the usage information +// for all flags in the FlagSet. Wrapped to `cols` columns (0 for no +// wrapping) +func (f *FlagSet) FlagUsagesWrapped(cols int) string { + buf := new(bytes.Buffer) + + lines := make([]string, 0, len(f.formal)) + + maxlen := 0 + f.VisitAll(func(flag *Flag) { + if flag.Hidden { + return + } + + line := "" + if flag.Shorthand != "" && flag.ShorthandDeprecated == "" { + line = fmt.Sprintf(" -%s, --%s", flag.Shorthand, flag.Name) + } else { + line = fmt.Sprintf(" --%s", flag.Name) + } + + varname, usage := UnquoteUsage(flag) + if varname != "" { + line += " " + varname + } + if flag.NoOptDefVal != "" { + switch flag.Value.Type() { + case "string": + line += fmt.Sprintf("[=\"%s\"]", flag.NoOptDefVal) + case "bool": + if flag.NoOptDefVal != "true" { + line += fmt.Sprintf("[=%s]", flag.NoOptDefVal) + } + case "count": + if flag.NoOptDefVal != "+1" { + line += fmt.Sprintf("[=%s]", flag.NoOptDefVal) + } + default: + line += fmt.Sprintf("[=%s]", flag.NoOptDefVal) + } + } + + // This special character will be replaced with spacing once the + // correct alignment is calculated + line += "\x00" + if len(line) > maxlen { + maxlen = len(line) + } + + line += usage + if !flag.defaultIsZeroValue() { + if flag.Value.Type() == "string" { + line += fmt.Sprintf(" (default %q)", flag.DefValue) + } else { + line += fmt.Sprintf(" (default %s)", flag.DefValue) + } + } + if len(flag.Deprecated) != 0 { + line += fmt.Sprintf(" (DEPRECATED: %s)", flag.Deprecated) + } + + lines = append(lines, line) + }) + + for _, line := range lines { + sidx := strings.Index(line, "\x00") + spacing := strings.Repeat(" ", maxlen-sidx) + // maxlen + 2 comes from + 1 for the \x00 and + 1 for the (deliberate) off-by-one in maxlen-sidx + fmt.Fprintln(buf, line[:sidx], spacing, wrap(maxlen+2, cols, line[sidx+1:])) + } + + return buf.String() +} + +// FlagUsages returns a string containing the usage information for all flags in +// the FlagSet +func (f *FlagSet) FlagUsages() string { + return f.FlagUsagesWrapped(0) +} + +// PrintDefaults prints to standard error the default values of all defined command-line flags. +func PrintDefaults() { + CommandLine.PrintDefaults() +} + +// defaultUsage is the default function to print a usage message. +func defaultUsage(f *FlagSet) { + fmt.Fprintf(f.out(), "Usage of %s:\n", f.name) + f.PrintDefaults() +} + +// NOTE: Usage is not just defaultUsage(CommandLine) +// because it serves (via godoc flag Usage) as the example +// for how to write your own usage function. + +// Usage prints to standard error a usage message documenting all defined command-line flags. +// The function is a variable that may be changed to point to a custom function. +// By default it prints a simple header and calls PrintDefaults; for details about the +// format of the output and how to control it, see the documentation for PrintDefaults. +var Usage = func() { + fmt.Fprintf(os.Stderr, "Usage of %s:\n", os.Args[0]) + PrintDefaults() +} + +// NFlag returns the number of flags that have been set. +func (f *FlagSet) NFlag() int { return len(f.actual) } + +// NFlag returns the number of command-line flags that have been set. +func NFlag() int { return len(CommandLine.actual) } + +// Arg returns the i'th argument. Arg(0) is the first remaining argument +// after flags have been processed. +func (f *FlagSet) Arg(i int) string { + if i < 0 || i >= len(f.args) { + return "" + } + return f.args[i] +} + +// Arg returns the i'th command-line argument. Arg(0) is the first remaining argument +// after flags have been processed. +func Arg(i int) string { + return CommandLine.Arg(i) +} + +// NArg is the number of arguments remaining after flags have been processed. +func (f *FlagSet) NArg() int { return len(f.args) } + +// NArg is the number of arguments remaining after flags have been processed. +func NArg() int { return len(CommandLine.args) } + +// Args returns the non-flag arguments. +func (f *FlagSet) Args() []string { return f.args } + +// Args returns the non-flag command-line arguments. +func Args() []string { return CommandLine.args } + +// Var defines a flag with the specified name and usage string. The type and +// value of the flag are represented by the first argument, of type Value, which +// typically holds a user-defined implementation of Value. For instance, the +// caller could create a flag that turns a comma-separated string into a slice +// of strings by giving the slice the methods of Value; in particular, Set would +// decompose the comma-separated string into the slice. +func (f *FlagSet) Var(value Value, name string, usage string) { + f.VarP(value, name, "", usage) +} + +// VarPF is like VarP, but returns the flag created +func (f *FlagSet) VarPF(value Value, name, shorthand, usage string) *Flag { + // Remember the default value as a string; it won't change. + flag := &Flag{ + Name: name, + Shorthand: shorthand, + Usage: usage, + Value: value, + DefValue: value.String(), + } + f.AddFlag(flag) + return flag +} + +// VarP is like Var, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) VarP(value Value, name, shorthand, usage string) { + f.VarPF(value, name, shorthand, usage) +} + +// AddFlag will add the flag to the FlagSet +func (f *FlagSet) AddFlag(flag *Flag) { + normalizedFlagName := f.normalizeFlagName(flag.Name) + + _, alreadyThere := f.formal[normalizedFlagName] + if alreadyThere { + msg := fmt.Sprintf("%s flag redefined: %s", f.name, flag.Name) + fmt.Fprintln(f.out(), msg) + panic(msg) // Happens only if flags are declared with identical names + } + if f.formal == nil { + f.formal = make(map[NormalizedName]*Flag) + } + + flag.Name = string(normalizedFlagName) + f.formal[normalizedFlagName] = flag + f.orderedFormal = append(f.orderedFormal, flag) + + if flag.Shorthand == "" { + return + } + if len(flag.Shorthand) > 1 { + msg := fmt.Sprintf("%q shorthand is more than one ASCII character", flag.Shorthand) + fmt.Fprintf(f.out(), msg) + panic(msg) + } + if f.shorthands == nil { + f.shorthands = make(map[byte]*Flag) + } + c := flag.Shorthand[0] + used, alreadyThere := f.shorthands[c] + if alreadyThere { + msg := fmt.Sprintf("unable to redefine %q shorthand in %q flagset: it's already used for %q flag", c, f.name, used.Name) + fmt.Fprintf(f.out(), msg) + panic(msg) + } + f.shorthands[c] = flag +} + +// AddFlagSet adds one FlagSet to another. If a flag is already present in f +// the flag from newSet will be ignored. +func (f *FlagSet) AddFlagSet(newSet *FlagSet) { + if newSet == nil { + return + } + newSet.VisitAll(func(flag *Flag) { + if f.Lookup(flag.Name) == nil { + f.AddFlag(flag) + } + }) +} + +// Var defines a flag with the specified name and usage string. The type and +// value of the flag are represented by the first argument, of type Value, which +// typically holds a user-defined implementation of Value. For instance, the +// caller could create a flag that turns a comma-separated string into a slice +// of strings by giving the slice the methods of Value; in particular, Set would +// decompose the comma-separated string into the slice. +func Var(value Value, name string, usage string) { + CommandLine.VarP(value, name, "", usage) +} + +// VarP is like Var, but accepts a shorthand letter that can be used after a single dash. +func VarP(value Value, name, shorthand, usage string) { + CommandLine.VarP(value, name, shorthand, usage) +} + +// failf prints to standard error a formatted error and usage message and +// returns the error. +func (f *FlagSet) failf(format string, a ...interface{}) error { + err := fmt.Errorf(format, a...) + if f.errorHandling != ContinueOnError { + fmt.Fprintln(f.out(), err) + f.usage() + } + return err +} + +// usage calls the Usage method for the flag set, or the usage function if +// the flag set is CommandLine. +func (f *FlagSet) usage() { + if f == CommandLine { + Usage() + } else if f.Usage == nil { + defaultUsage(f) + } else { + f.Usage() + } +} + +//--unknown (args will be empty) +//--unknown --next-flag ... (args will be --next-flag ...) +//--unknown arg ... (args will be arg ...) +func stripUnknownFlagValue(args []string) []string { + if len(args) == 0 { + //--unknown + return args + } + + first := args[0] + if len(first) > 0 && first[0] == '-' { + //--unknown --next-flag ... + return args + } + + //--unknown arg ... (args will be arg ...) + if len(args) > 1 { + return args[1:] + } + return nil +} + +func (f *FlagSet) parseLongArg(s string, args []string, fn parseFunc) (a []string, err error) { + a = args + name := s[2:] + if len(name) == 0 || name[0] == '-' || name[0] == '=' { + err = f.failf("bad flag syntax: %s", s) + return + } + + split := strings.SplitN(name, "=", 2) + name = split[0] + flag, exists := f.formal[f.normalizeFlagName(name)] + + if !exists { + switch { + case name == "help": + f.usage() + return a, ErrHelp + case f.ParseErrorsWhitelist.UnknownFlags: + // --unknown=unknownval arg ... + // we do not want to lose arg in this case + if len(split) >= 2 { + return a, nil + } + + return stripUnknownFlagValue(a), nil + default: + err = f.failf("unknown flag: --%s", name) + return + } + } + + var value string + if len(split) == 2 { + // '--flag=arg' + value = split[1] + } else if flag.NoOptDefVal != "" { + // '--flag' (arg was optional) + value = flag.NoOptDefVal + } else if len(a) > 0 { + // '--flag arg' + value = a[0] + a = a[1:] + } else { + // '--flag' (arg was required) + err = f.failf("flag needs an argument: %s", s) + return + } + + err = fn(flag, value) + if err != nil { + f.failf(err.Error()) + } + return +} + +func (f *FlagSet) parseSingleShortArg(shorthands string, args []string, fn parseFunc) (outShorts string, outArgs []string, err error) { + outArgs = args + + if strings.HasPrefix(shorthands, "test.") { + return + } + + outShorts = shorthands[1:] + c := shorthands[0] + + flag, exists := f.shorthands[c] + if !exists { + switch { + case c == 'h': + f.usage() + err = ErrHelp + return + case f.ParseErrorsWhitelist.UnknownFlags: + // '-f=arg arg ...' + // we do not want to lose arg in this case + if len(shorthands) > 2 && shorthands[1] == '=' { + outShorts = "" + return + } + + outArgs = stripUnknownFlagValue(outArgs) + return + default: + err = f.failf("unknown shorthand flag: %q in -%s", c, shorthands) + return + } + } + + var value string + if len(shorthands) > 2 && shorthands[1] == '=' { + // '-f=arg' + value = shorthands[2:] + outShorts = "" + } else if flag.NoOptDefVal != "" { + // '-f' (arg was optional) + value = flag.NoOptDefVal + } else if len(shorthands) > 1 { + // '-farg' + value = shorthands[1:] + outShorts = "" + } else if len(args) > 0 { + // '-f arg' + value = args[0] + outArgs = args[1:] + } else { + // '-f' (arg was required) + err = f.failf("flag needs an argument: %q in -%s", c, shorthands) + return + } + + if flag.ShorthandDeprecated != "" { + fmt.Fprintf(f.out(), "Flag shorthand -%s has been deprecated, %s\n", flag.Shorthand, flag.ShorthandDeprecated) + } + + err = fn(flag, value) + if err != nil { + f.failf(err.Error()) + } + return +} + +func (f *FlagSet) parseShortArg(s string, args []string, fn parseFunc) (a []string, err error) { + a = args + shorthands := s[1:] + + // "shorthands" can be a series of shorthand letters of flags (e.g. "-vvv"). + for len(shorthands) > 0 { + shorthands, a, err = f.parseSingleShortArg(shorthands, args, fn) + if err != nil { + return + } + } + + return +} + +func (f *FlagSet) parseArgs(args []string, fn parseFunc) (err error) { + for len(args) > 0 { + s := args[0] + args = args[1:] + if len(s) == 0 || s[0] != '-' || len(s) == 1 { + if !f.interspersed { + f.args = append(f.args, s) + f.args = append(f.args, args...) + return nil + } + f.args = append(f.args, s) + continue + } + + if s[1] == '-' { + if len(s) == 2 { // "--" terminates the flags + f.argsLenAtDash = len(f.args) + f.args = append(f.args, args...) + break + } + args, err = f.parseLongArg(s, args, fn) + } else { + args, err = f.parseShortArg(s, args, fn) + } + if err != nil { + return + } + } + return +} + +// Parse parses flag definitions from the argument list, which should not +// include the command name. Must be called after all flags in the FlagSet +// are defined and before flags are accessed by the program. +// The return value will be ErrHelp if -help was set but not defined. +func (f *FlagSet) Parse(arguments []string) error { + if f.addedGoFlagSets != nil { + for _, goFlagSet := range f.addedGoFlagSets { + goFlagSet.Parse(nil) + } + } + f.parsed = true + + if len(arguments) < 0 { + return nil + } + + f.args = make([]string, 0, len(arguments)) + + set := func(flag *Flag, value string) error { + return f.Set(flag.Name, value) + } + + err := f.parseArgs(arguments, set) + if err != nil { + switch f.errorHandling { + case ContinueOnError: + return err + case ExitOnError: + fmt.Println(err) + os.Exit(2) + case PanicOnError: + panic(err) + } + } + return nil +} + +type parseFunc func(flag *Flag, value string) error + +// ParseAll parses flag definitions from the argument list, which should not +// include the command name. The arguments for fn are flag and value. Must be +// called after all flags in the FlagSet are defined and before flags are +// accessed by the program. The return value will be ErrHelp if -help was set +// but not defined. +func (f *FlagSet) ParseAll(arguments []string, fn func(flag *Flag, value string) error) error { + f.parsed = true + f.args = make([]string, 0, len(arguments)) + + err := f.parseArgs(arguments, fn) + if err != nil { + switch f.errorHandling { + case ContinueOnError: + return err + case ExitOnError: + os.Exit(2) + case PanicOnError: + panic(err) + } + } + return nil +} + +// Parsed reports whether f.Parse has been called. +func (f *FlagSet) Parsed() bool { + return f.parsed +} + +// Parse parses the command-line flags from os.Args[1:]. Must be called +// after all flags are defined and before flags are accessed by the program. +func Parse() { + // Ignore errors; CommandLine is set for ExitOnError. + CommandLine.Parse(os.Args[1:]) +} + +// ParseAll parses the command-line flags from os.Args[1:] and called fn for each. +// The arguments for fn are flag and value. Must be called after all flags are +// defined and before flags are accessed by the program. +func ParseAll(fn func(flag *Flag, value string) error) { + // Ignore errors; CommandLine is set for ExitOnError. + CommandLine.ParseAll(os.Args[1:], fn) +} + +// SetInterspersed sets whether to support interspersed option/non-option arguments. +func SetInterspersed(interspersed bool) { + CommandLine.SetInterspersed(interspersed) +} + +// Parsed returns true if the command-line flags have been parsed. +func Parsed() bool { + return CommandLine.Parsed() +} + +// CommandLine is the default set of command-line flags, parsed from os.Args. +var CommandLine = NewFlagSet(os.Args[0], ExitOnError) + +// NewFlagSet returns a new, empty flag set with the specified name, +// error handling property and SortFlags set to true. +func NewFlagSet(name string, errorHandling ErrorHandling) *FlagSet { + f := &FlagSet{ + name: name, + errorHandling: errorHandling, + argsLenAtDash: -1, + interspersed: true, + SortFlags: true, + } + return f +} + +// SetInterspersed sets whether to support interspersed option/non-option arguments. +func (f *FlagSet) SetInterspersed(interspersed bool) { + f.interspersed = interspersed +} + +// Init sets the name and error handling property for a flag set. +// By default, the zero FlagSet uses an empty name and the +// ContinueOnError error handling policy. +func (f *FlagSet) Init(name string, errorHandling ErrorHandling) { + f.name = name + f.errorHandling = errorHandling + f.argsLenAtDash = -1 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/float32.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/float32.go new file mode 100644 index 00000000..a243f81f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/float32.go @@ -0,0 +1,88 @@ +package pflag + +import "strconv" + +// -- float32 Value +type float32Value float32 + +func newFloat32Value(val float32, p *float32) *float32Value { + *p = val + return (*float32Value)(p) +} + +func (f *float32Value) Set(s string) error { + v, err := strconv.ParseFloat(s, 32) + *f = float32Value(v) + return err +} + +func (f *float32Value) Type() string { + return "float32" +} + +func (f *float32Value) String() string { return strconv.FormatFloat(float64(*f), 'g', -1, 32) } + +func float32Conv(sval string) (interface{}, error) { + v, err := strconv.ParseFloat(sval, 32) + if err != nil { + return 0, err + } + return float32(v), nil +} + +// GetFloat32 return the float32 value of a flag with the given name +func (f *FlagSet) GetFloat32(name string) (float32, error) { + val, err := f.getFlagType(name, "float32", float32Conv) + if err != nil { + return 0, err + } + return val.(float32), nil +} + +// Float32Var defines a float32 flag with specified name, default value, and usage string. +// The argument p points to a float32 variable in which to store the value of the flag. +func (f *FlagSet) Float32Var(p *float32, name string, value float32, usage string) { + f.VarP(newFloat32Value(value, p), name, "", usage) +} + +// Float32VarP is like Float32Var, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) Float32VarP(p *float32, name, shorthand string, value float32, usage string) { + f.VarP(newFloat32Value(value, p), name, shorthand, usage) +} + +// Float32Var defines a float32 flag with specified name, default value, and usage string. +// The argument p points to a float32 variable in which to store the value of the flag. +func Float32Var(p *float32, name string, value float32, usage string) { + CommandLine.VarP(newFloat32Value(value, p), name, "", usage) +} + +// Float32VarP is like Float32Var, but accepts a shorthand letter that can be used after a single dash. +func Float32VarP(p *float32, name, shorthand string, value float32, usage string) { + CommandLine.VarP(newFloat32Value(value, p), name, shorthand, usage) +} + +// Float32 defines a float32 flag with specified name, default value, and usage string. +// The return value is the address of a float32 variable that stores the value of the flag. +func (f *FlagSet) Float32(name string, value float32, usage string) *float32 { + p := new(float32) + f.Float32VarP(p, name, "", value, usage) + return p +} + +// Float32P is like Float32, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) Float32P(name, shorthand string, value float32, usage string) *float32 { + p := new(float32) + f.Float32VarP(p, name, shorthand, value, usage) + return p +} + +// Float32 defines a float32 flag with specified name, default value, and usage string. +// The return value is the address of a float32 variable that stores the value of the flag. +func Float32(name string, value float32, usage string) *float32 { + return CommandLine.Float32P(name, "", value, usage) +} + +// Float32P is like Float32, but accepts a shorthand letter that can be used after a single dash. +func Float32P(name, shorthand string, value float32, usage string) *float32 { + return CommandLine.Float32P(name, shorthand, value, usage) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/float64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/float64.go new file mode 100644 index 00000000..04b5492a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/float64.go @@ -0,0 +1,84 @@ +package pflag + +import "strconv" + +// -- float64 Value +type float64Value float64 + +func newFloat64Value(val float64, p *float64) *float64Value { + *p = val + return (*float64Value)(p) +} + +func (f *float64Value) Set(s string) error { + v, err := strconv.ParseFloat(s, 64) + *f = float64Value(v) + return err +} + +func (f *float64Value) Type() string { + return "float64" +} + +func (f *float64Value) String() string { return strconv.FormatFloat(float64(*f), 'g', -1, 64) } + +func float64Conv(sval string) (interface{}, error) { + return strconv.ParseFloat(sval, 64) +} + +// GetFloat64 return the float64 value of a flag with the given name +func (f *FlagSet) GetFloat64(name string) (float64, error) { + val, err := f.getFlagType(name, "float64", float64Conv) + if err != nil { + return 0, err + } + return val.(float64), nil +} + +// Float64Var defines a float64 flag with specified name, default value, and usage string. +// The argument p points to a float64 variable in which to store the value of the flag. +func (f *FlagSet) Float64Var(p *float64, name string, value float64, usage string) { + f.VarP(newFloat64Value(value, p), name, "", usage) +} + +// Float64VarP is like Float64Var, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) Float64VarP(p *float64, name, shorthand string, value float64, usage string) { + f.VarP(newFloat64Value(value, p), name, shorthand, usage) +} + +// Float64Var defines a float64 flag with specified name, default value, and usage string. +// The argument p points to a float64 variable in which to store the value of the flag. +func Float64Var(p *float64, name string, value float64, usage string) { + CommandLine.VarP(newFloat64Value(value, p), name, "", usage) +} + +// Float64VarP is like Float64Var, but accepts a shorthand letter that can be used after a single dash. +func Float64VarP(p *float64, name, shorthand string, value float64, usage string) { + CommandLine.VarP(newFloat64Value(value, p), name, shorthand, usage) +} + +// Float64 defines a float64 flag with specified name, default value, and usage string. +// The return value is the address of a float64 variable that stores the value of the flag. +func (f *FlagSet) Float64(name string, value float64, usage string) *float64 { + p := new(float64) + f.Float64VarP(p, name, "", value, usage) + return p +} + +// Float64P is like Float64, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) Float64P(name, shorthand string, value float64, usage string) *float64 { + p := new(float64) + f.Float64VarP(p, name, shorthand, value, usage) + return p +} + +// Float64 defines a float64 flag with specified name, default value, and usage string. +// The return value is the address of a float64 variable that stores the value of the flag. +func Float64(name string, value float64, usage string) *float64 { + return CommandLine.Float64P(name, "", value, usage) +} + +// Float64P is like Float64, but accepts a shorthand letter that can be used after a single dash. +func Float64P(name, shorthand string, value float64, usage string) *float64 { + return CommandLine.Float64P(name, shorthand, value, usage) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/golangflag.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/golangflag.go new file mode 100644 index 00000000..d3dd72b7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/golangflag.go @@ -0,0 +1,105 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package pflag + +import ( + goflag "flag" + "reflect" + "strings" +) + +// flagValueWrapper implements pflag.Value around a flag.Value. The main +// difference here is the addition of the Type method that returns a string +// name of the type. As this is generally unknown, we approximate that with +// reflection. +type flagValueWrapper struct { + inner goflag.Value + flagType string +} + +// We are just copying the boolFlag interface out of goflag as that is what +// they use to decide if a flag should get "true" when no arg is given. +type goBoolFlag interface { + goflag.Value + IsBoolFlag() bool +} + +func wrapFlagValue(v goflag.Value) Value { + // If the flag.Value happens to also be a pflag.Value, just use it directly. + if pv, ok := v.(Value); ok { + return pv + } + + pv := &flagValueWrapper{ + inner: v, + } + + t := reflect.TypeOf(v) + if t.Kind() == reflect.Interface || t.Kind() == reflect.Ptr { + t = t.Elem() + } + + pv.flagType = strings.TrimSuffix(t.Name(), "Value") + return pv +} + +func (v *flagValueWrapper) String() string { + return v.inner.String() +} + +func (v *flagValueWrapper) Set(s string) error { + return v.inner.Set(s) +} + +func (v *flagValueWrapper) Type() string { + return v.flagType +} + +// PFlagFromGoFlag will return a *pflag.Flag given a *flag.Flag +// If the *flag.Flag.Name was a single character (ex: `v`) it will be accessiblei +// with both `-v` and `--v` in flags. If the golang flag was more than a single +// character (ex: `verbose`) it will only be accessible via `--verbose` +func PFlagFromGoFlag(goflag *goflag.Flag) *Flag { + // Remember the default value as a string; it won't change. + flag := &Flag{ + Name: goflag.Name, + Usage: goflag.Usage, + Value: wrapFlagValue(goflag.Value), + // Looks like golang flags don't set DefValue correctly :-( + //DefValue: goflag.DefValue, + DefValue: goflag.Value.String(), + } + // Ex: if the golang flag was -v, allow both -v and --v to work + if len(flag.Name) == 1 { + flag.Shorthand = flag.Name + } + if fv, ok := goflag.Value.(goBoolFlag); ok && fv.IsBoolFlag() { + flag.NoOptDefVal = "true" + } + return flag +} + +// AddGoFlag will add the given *flag.Flag to the pflag.FlagSet +func (f *FlagSet) AddGoFlag(goflag *goflag.Flag) { + if f.Lookup(goflag.Name) != nil { + return + } + newflag := PFlagFromGoFlag(goflag) + f.AddFlag(newflag) +} + +// AddGoFlagSet will add the given *flag.FlagSet to the pflag.FlagSet +func (f *FlagSet) AddGoFlagSet(newSet *goflag.FlagSet) { + if newSet == nil { + return + } + newSet.VisitAll(func(goflag *goflag.Flag) { + f.AddGoFlag(goflag) + }) + if f.addedGoFlagSets == nil { + f.addedGoFlagSets = make([]*goflag.FlagSet, 0) + } + f.addedGoFlagSets = append(f.addedGoFlagSets, newSet) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/int.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/int.go new file mode 100644 index 00000000..1474b89d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/int.go @@ -0,0 +1,84 @@ +package pflag + +import "strconv" + +// -- int Value +type intValue int + +func newIntValue(val int, p *int) *intValue { + *p = val + return (*intValue)(p) +} + +func (i *intValue) Set(s string) error { + v, err := strconv.ParseInt(s, 0, 64) + *i = intValue(v) + return err +} + +func (i *intValue) Type() string { + return "int" +} + +func (i *intValue) String() string { return strconv.Itoa(int(*i)) } + +func intConv(sval string) (interface{}, error) { + return strconv.Atoi(sval) +} + +// GetInt return the int value of a flag with the given name +func (f *FlagSet) GetInt(name string) (int, error) { + val, err := f.getFlagType(name, "int", intConv) + if err != nil { + return 0, err + } + return val.(int), nil +} + +// IntVar defines an int flag with specified name, default value, and usage string. +// The argument p points to an int variable in which to store the value of the flag. +func (f *FlagSet) IntVar(p *int, name string, value int, usage string) { + f.VarP(newIntValue(value, p), name, "", usage) +} + +// IntVarP is like IntVar, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) IntVarP(p *int, name, shorthand string, value int, usage string) { + f.VarP(newIntValue(value, p), name, shorthand, usage) +} + +// IntVar defines an int flag with specified name, default value, and usage string. +// The argument p points to an int variable in which to store the value of the flag. +func IntVar(p *int, name string, value int, usage string) { + CommandLine.VarP(newIntValue(value, p), name, "", usage) +} + +// IntVarP is like IntVar, but accepts a shorthand letter that can be used after a single dash. +func IntVarP(p *int, name, shorthand string, value int, usage string) { + CommandLine.VarP(newIntValue(value, p), name, shorthand, usage) +} + +// Int defines an int flag with specified name, default value, and usage string. +// The return value is the address of an int variable that stores the value of the flag. +func (f *FlagSet) Int(name string, value int, usage string) *int { + p := new(int) + f.IntVarP(p, name, "", value, usage) + return p +} + +// IntP is like Int, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) IntP(name, shorthand string, value int, usage string) *int { + p := new(int) + f.IntVarP(p, name, shorthand, value, usage) + return p +} + +// Int defines an int flag with specified name, default value, and usage string. +// The return value is the address of an int variable that stores the value of the flag. +func Int(name string, value int, usage string) *int { + return CommandLine.IntP(name, "", value, usage) +} + +// IntP is like Int, but accepts a shorthand letter that can be used after a single dash. +func IntP(name, shorthand string, value int, usage string) *int { + return CommandLine.IntP(name, shorthand, value, usage) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/int16.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/int16.go new file mode 100644 index 00000000..f1a01d05 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/int16.go @@ -0,0 +1,88 @@ +package pflag + +import "strconv" + +// -- int16 Value +type int16Value int16 + +func newInt16Value(val int16, p *int16) *int16Value { + *p = val + return (*int16Value)(p) +} + +func (i *int16Value) Set(s string) error { + v, err := strconv.ParseInt(s, 0, 16) + *i = int16Value(v) + return err +} + +func (i *int16Value) Type() string { + return "int16" +} + +func (i *int16Value) String() string { return strconv.FormatInt(int64(*i), 10) } + +func int16Conv(sval string) (interface{}, error) { + v, err := strconv.ParseInt(sval, 0, 16) + if err != nil { + return 0, err + } + return int16(v), nil +} + +// GetInt16 returns the int16 value of a flag with the given name +func (f *FlagSet) GetInt16(name string) (int16, error) { + val, err := f.getFlagType(name, "int16", int16Conv) + if err != nil { + return 0, err + } + return val.(int16), nil +} + +// Int16Var defines an int16 flag with specified name, default value, and usage string. +// The argument p points to an int16 variable in which to store the value of the flag. +func (f *FlagSet) Int16Var(p *int16, name string, value int16, usage string) { + f.VarP(newInt16Value(value, p), name, "", usage) +} + +// Int16VarP is like Int16Var, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) Int16VarP(p *int16, name, shorthand string, value int16, usage string) { + f.VarP(newInt16Value(value, p), name, shorthand, usage) +} + +// Int16Var defines an int16 flag with specified name, default value, and usage string. +// The argument p points to an int16 variable in which to store the value of the flag. +func Int16Var(p *int16, name string, value int16, usage string) { + CommandLine.VarP(newInt16Value(value, p), name, "", usage) +} + +// Int16VarP is like Int16Var, but accepts a shorthand letter that can be used after a single dash. +func Int16VarP(p *int16, name, shorthand string, value int16, usage string) { + CommandLine.VarP(newInt16Value(value, p), name, shorthand, usage) +} + +// Int16 defines an int16 flag with specified name, default value, and usage string. +// The return value is the address of an int16 variable that stores the value of the flag. +func (f *FlagSet) Int16(name string, value int16, usage string) *int16 { + p := new(int16) + f.Int16VarP(p, name, "", value, usage) + return p +} + +// Int16P is like Int16, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) Int16P(name, shorthand string, value int16, usage string) *int16 { + p := new(int16) + f.Int16VarP(p, name, shorthand, value, usage) + return p +} + +// Int16 defines an int16 flag with specified name, default value, and usage string. +// The return value is the address of an int16 variable that stores the value of the flag. +func Int16(name string, value int16, usage string) *int16 { + return CommandLine.Int16P(name, "", value, usage) +} + +// Int16P is like Int16, but accepts a shorthand letter that can be used after a single dash. +func Int16P(name, shorthand string, value int16, usage string) *int16 { + return CommandLine.Int16P(name, shorthand, value, usage) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/int32.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/int32.go new file mode 100644 index 00000000..9b95944f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/int32.go @@ -0,0 +1,88 @@ +package pflag + +import "strconv" + +// -- int32 Value +type int32Value int32 + +func newInt32Value(val int32, p *int32) *int32Value { + *p = val + return (*int32Value)(p) +} + +func (i *int32Value) Set(s string) error { + v, err := strconv.ParseInt(s, 0, 32) + *i = int32Value(v) + return err +} + +func (i *int32Value) Type() string { + return "int32" +} + +func (i *int32Value) String() string { return strconv.FormatInt(int64(*i), 10) } + +func int32Conv(sval string) (interface{}, error) { + v, err := strconv.ParseInt(sval, 0, 32) + if err != nil { + return 0, err + } + return int32(v), nil +} + +// GetInt32 return the int32 value of a flag with the given name +func (f *FlagSet) GetInt32(name string) (int32, error) { + val, err := f.getFlagType(name, "int32", int32Conv) + if err != nil { + return 0, err + } + return val.(int32), nil +} + +// Int32Var defines an int32 flag with specified name, default value, and usage string. +// The argument p points to an int32 variable in which to store the value of the flag. +func (f *FlagSet) Int32Var(p *int32, name string, value int32, usage string) { + f.VarP(newInt32Value(value, p), name, "", usage) +} + +// Int32VarP is like Int32Var, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) Int32VarP(p *int32, name, shorthand string, value int32, usage string) { + f.VarP(newInt32Value(value, p), name, shorthand, usage) +} + +// Int32Var defines an int32 flag with specified name, default value, and usage string. +// The argument p points to an int32 variable in which to store the value of the flag. +func Int32Var(p *int32, name string, value int32, usage string) { + CommandLine.VarP(newInt32Value(value, p), name, "", usage) +} + +// Int32VarP is like Int32Var, but accepts a shorthand letter that can be used after a single dash. +func Int32VarP(p *int32, name, shorthand string, value int32, usage string) { + CommandLine.VarP(newInt32Value(value, p), name, shorthand, usage) +} + +// Int32 defines an int32 flag with specified name, default value, and usage string. +// The return value is the address of an int32 variable that stores the value of the flag. +func (f *FlagSet) Int32(name string, value int32, usage string) *int32 { + p := new(int32) + f.Int32VarP(p, name, "", value, usage) + return p +} + +// Int32P is like Int32, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) Int32P(name, shorthand string, value int32, usage string) *int32 { + p := new(int32) + f.Int32VarP(p, name, shorthand, value, usage) + return p +} + +// Int32 defines an int32 flag with specified name, default value, and usage string. +// The return value is the address of an int32 variable that stores the value of the flag. +func Int32(name string, value int32, usage string) *int32 { + return CommandLine.Int32P(name, "", value, usage) +} + +// Int32P is like Int32, but accepts a shorthand letter that can be used after a single dash. +func Int32P(name, shorthand string, value int32, usage string) *int32 { + return CommandLine.Int32P(name, shorthand, value, usage) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/int64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/int64.go new file mode 100644 index 00000000..0026d781 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/int64.go @@ -0,0 +1,84 @@ +package pflag + +import "strconv" + +// -- int64 Value +type int64Value int64 + +func newInt64Value(val int64, p *int64) *int64Value { + *p = val + return (*int64Value)(p) +} + +func (i *int64Value) Set(s string) error { + v, err := strconv.ParseInt(s, 0, 64) + *i = int64Value(v) + return err +} + +func (i *int64Value) Type() string { + return "int64" +} + +func (i *int64Value) String() string { return strconv.FormatInt(int64(*i), 10) } + +func int64Conv(sval string) (interface{}, error) { + return strconv.ParseInt(sval, 0, 64) +} + +// GetInt64 return the int64 value of a flag with the given name +func (f *FlagSet) GetInt64(name string) (int64, error) { + val, err := f.getFlagType(name, "int64", int64Conv) + if err != nil { + return 0, err + } + return val.(int64), nil +} + +// Int64Var defines an int64 flag with specified name, default value, and usage string. +// The argument p points to an int64 variable in which to store the value of the flag. +func (f *FlagSet) Int64Var(p *int64, name string, value int64, usage string) { + f.VarP(newInt64Value(value, p), name, "", usage) +} + +// Int64VarP is like Int64Var, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) Int64VarP(p *int64, name, shorthand string, value int64, usage string) { + f.VarP(newInt64Value(value, p), name, shorthand, usage) +} + +// Int64Var defines an int64 flag with specified name, default value, and usage string. +// The argument p points to an int64 variable in which to store the value of the flag. +func Int64Var(p *int64, name string, value int64, usage string) { + CommandLine.VarP(newInt64Value(value, p), name, "", usage) +} + +// Int64VarP is like Int64Var, but accepts a shorthand letter that can be used after a single dash. +func Int64VarP(p *int64, name, shorthand string, value int64, usage string) { + CommandLine.VarP(newInt64Value(value, p), name, shorthand, usage) +} + +// Int64 defines an int64 flag with specified name, default value, and usage string. +// The return value is the address of an int64 variable that stores the value of the flag. +func (f *FlagSet) Int64(name string, value int64, usage string) *int64 { + p := new(int64) + f.Int64VarP(p, name, "", value, usage) + return p +} + +// Int64P is like Int64, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) Int64P(name, shorthand string, value int64, usage string) *int64 { + p := new(int64) + f.Int64VarP(p, name, shorthand, value, usage) + return p +} + +// Int64 defines an int64 flag with specified name, default value, and usage string. +// The return value is the address of an int64 variable that stores the value of the flag. +func Int64(name string, value int64, usage string) *int64 { + return CommandLine.Int64P(name, "", value, usage) +} + +// Int64P is like Int64, but accepts a shorthand letter that can be used after a single dash. +func Int64P(name, shorthand string, value int64, usage string) *int64 { + return CommandLine.Int64P(name, shorthand, value, usage) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/int8.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/int8.go new file mode 100644 index 00000000..4da92228 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/int8.go @@ -0,0 +1,88 @@ +package pflag + +import "strconv" + +// -- int8 Value +type int8Value int8 + +func newInt8Value(val int8, p *int8) *int8Value { + *p = val + return (*int8Value)(p) +} + +func (i *int8Value) Set(s string) error { + v, err := strconv.ParseInt(s, 0, 8) + *i = int8Value(v) + return err +} + +func (i *int8Value) Type() string { + return "int8" +} + +func (i *int8Value) String() string { return strconv.FormatInt(int64(*i), 10) } + +func int8Conv(sval string) (interface{}, error) { + v, err := strconv.ParseInt(sval, 0, 8) + if err != nil { + return 0, err + } + return int8(v), nil +} + +// GetInt8 return the int8 value of a flag with the given name +func (f *FlagSet) GetInt8(name string) (int8, error) { + val, err := f.getFlagType(name, "int8", int8Conv) + if err != nil { + return 0, err + } + return val.(int8), nil +} + +// Int8Var defines an int8 flag with specified name, default value, and usage string. +// The argument p points to an int8 variable in which to store the value of the flag. +func (f *FlagSet) Int8Var(p *int8, name string, value int8, usage string) { + f.VarP(newInt8Value(value, p), name, "", usage) +} + +// Int8VarP is like Int8Var, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) Int8VarP(p *int8, name, shorthand string, value int8, usage string) { + f.VarP(newInt8Value(value, p), name, shorthand, usage) +} + +// Int8Var defines an int8 flag with specified name, default value, and usage string. +// The argument p points to an int8 variable in which to store the value of the flag. +func Int8Var(p *int8, name string, value int8, usage string) { + CommandLine.VarP(newInt8Value(value, p), name, "", usage) +} + +// Int8VarP is like Int8Var, but accepts a shorthand letter that can be used after a single dash. +func Int8VarP(p *int8, name, shorthand string, value int8, usage string) { + CommandLine.VarP(newInt8Value(value, p), name, shorthand, usage) +} + +// Int8 defines an int8 flag with specified name, default value, and usage string. +// The return value is the address of an int8 variable that stores the value of the flag. +func (f *FlagSet) Int8(name string, value int8, usage string) *int8 { + p := new(int8) + f.Int8VarP(p, name, "", value, usage) + return p +} + +// Int8P is like Int8, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) Int8P(name, shorthand string, value int8, usage string) *int8 { + p := new(int8) + f.Int8VarP(p, name, shorthand, value, usage) + return p +} + +// Int8 defines an int8 flag with specified name, default value, and usage string. +// The return value is the address of an int8 variable that stores the value of the flag. +func Int8(name string, value int8, usage string) *int8 { + return CommandLine.Int8P(name, "", value, usage) +} + +// Int8P is like Int8, but accepts a shorthand letter that can be used after a single dash. +func Int8P(name, shorthand string, value int8, usage string) *int8 { + return CommandLine.Int8P(name, shorthand, value, usage) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/int_slice.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/int_slice.go new file mode 100644 index 00000000..1e7c9edd --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/int_slice.go @@ -0,0 +1,128 @@ +package pflag + +import ( + "fmt" + "strconv" + "strings" +) + +// -- intSlice Value +type intSliceValue struct { + value *[]int + changed bool +} + +func newIntSliceValue(val []int, p *[]int) *intSliceValue { + isv := new(intSliceValue) + isv.value = p + *isv.value = val + return isv +} + +func (s *intSliceValue) Set(val string) error { + ss := strings.Split(val, ",") + out := make([]int, len(ss)) + for i, d := range ss { + var err error + out[i], err = strconv.Atoi(d) + if err != nil { + return err + } + + } + if !s.changed { + *s.value = out + } else { + *s.value = append(*s.value, out...) + } + s.changed = true + return nil +} + +func (s *intSliceValue) Type() string { + return "intSlice" +} + +func (s *intSliceValue) String() string { + out := make([]string, len(*s.value)) + for i, d := range *s.value { + out[i] = fmt.Sprintf("%d", d) + } + return "[" + strings.Join(out, ",") + "]" +} + +func intSliceConv(val string) (interface{}, error) { + val = strings.Trim(val, "[]") + // Empty string would cause a slice with one (empty) entry + if len(val) == 0 { + return []int{}, nil + } + ss := strings.Split(val, ",") + out := make([]int, len(ss)) + for i, d := range ss { + var err error + out[i], err = strconv.Atoi(d) + if err != nil { + return nil, err + } + + } + return out, nil +} + +// GetIntSlice return the []int value of a flag with the given name +func (f *FlagSet) GetIntSlice(name string) ([]int, error) { + val, err := f.getFlagType(name, "intSlice", intSliceConv) + if err != nil { + return []int{}, err + } + return val.([]int), nil +} + +// IntSliceVar defines a intSlice flag with specified name, default value, and usage string. +// The argument p points to a []int variable in which to store the value of the flag. +func (f *FlagSet) IntSliceVar(p *[]int, name string, value []int, usage string) { + f.VarP(newIntSliceValue(value, p), name, "", usage) +} + +// IntSliceVarP is like IntSliceVar, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) IntSliceVarP(p *[]int, name, shorthand string, value []int, usage string) { + f.VarP(newIntSliceValue(value, p), name, shorthand, usage) +} + +// IntSliceVar defines a int[] flag with specified name, default value, and usage string. +// The argument p points to a int[] variable in which to store the value of the flag. +func IntSliceVar(p *[]int, name string, value []int, usage string) { + CommandLine.VarP(newIntSliceValue(value, p), name, "", usage) +} + +// IntSliceVarP is like IntSliceVar, but accepts a shorthand letter that can be used after a single dash. +func IntSliceVarP(p *[]int, name, shorthand string, value []int, usage string) { + CommandLine.VarP(newIntSliceValue(value, p), name, shorthand, usage) +} + +// IntSlice defines a []int flag with specified name, default value, and usage string. +// The return value is the address of a []int variable that stores the value of the flag. +func (f *FlagSet) IntSlice(name string, value []int, usage string) *[]int { + p := []int{} + f.IntSliceVarP(&p, name, "", value, usage) + return &p +} + +// IntSliceP is like IntSlice, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) IntSliceP(name, shorthand string, value []int, usage string) *[]int { + p := []int{} + f.IntSliceVarP(&p, name, shorthand, value, usage) + return &p +} + +// IntSlice defines a []int flag with specified name, default value, and usage string. +// The return value is the address of a []int variable that stores the value of the flag. +func IntSlice(name string, value []int, usage string) *[]int { + return CommandLine.IntSliceP(name, "", value, usage) +} + +// IntSliceP is like IntSlice, but accepts a shorthand letter that can be used after a single dash. +func IntSliceP(name, shorthand string, value []int, usage string) *[]int { + return CommandLine.IntSliceP(name, shorthand, value, usage) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/ip.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/ip.go new file mode 100644 index 00000000..3d414ba6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/ip.go @@ -0,0 +1,94 @@ +package pflag + +import ( + "fmt" + "net" + "strings" +) + +// -- net.IP value +type ipValue net.IP + +func newIPValue(val net.IP, p *net.IP) *ipValue { + *p = val + return (*ipValue)(p) +} + +func (i *ipValue) String() string { return net.IP(*i).String() } +func (i *ipValue) Set(s string) error { + ip := net.ParseIP(strings.TrimSpace(s)) + if ip == nil { + return fmt.Errorf("failed to parse IP: %q", s) + } + *i = ipValue(ip) + return nil +} + +func (i *ipValue) Type() string { + return "ip" +} + +func ipConv(sval string) (interface{}, error) { + ip := net.ParseIP(sval) + if ip != nil { + return ip, nil + } + return nil, fmt.Errorf("invalid string being converted to IP address: %s", sval) +} + +// GetIP return the net.IP value of a flag with the given name +func (f *FlagSet) GetIP(name string) (net.IP, error) { + val, err := f.getFlagType(name, "ip", ipConv) + if err != nil { + return nil, err + } + return val.(net.IP), nil +} + +// IPVar defines an net.IP flag with specified name, default value, and usage string. +// The argument p points to an net.IP variable in which to store the value of the flag. +func (f *FlagSet) IPVar(p *net.IP, name string, value net.IP, usage string) { + f.VarP(newIPValue(value, p), name, "", usage) +} + +// IPVarP is like IPVar, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) IPVarP(p *net.IP, name, shorthand string, value net.IP, usage string) { + f.VarP(newIPValue(value, p), name, shorthand, usage) +} + +// IPVar defines an net.IP flag with specified name, default value, and usage string. +// The argument p points to an net.IP variable in which to store the value of the flag. +func IPVar(p *net.IP, name string, value net.IP, usage string) { + CommandLine.VarP(newIPValue(value, p), name, "", usage) +} + +// IPVarP is like IPVar, but accepts a shorthand letter that can be used after a single dash. +func IPVarP(p *net.IP, name, shorthand string, value net.IP, usage string) { + CommandLine.VarP(newIPValue(value, p), name, shorthand, usage) +} + +// IP defines an net.IP flag with specified name, default value, and usage string. +// The return value is the address of an net.IP variable that stores the value of the flag. +func (f *FlagSet) IP(name string, value net.IP, usage string) *net.IP { + p := new(net.IP) + f.IPVarP(p, name, "", value, usage) + return p +} + +// IPP is like IP, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) IPP(name, shorthand string, value net.IP, usage string) *net.IP { + p := new(net.IP) + f.IPVarP(p, name, shorthand, value, usage) + return p +} + +// IP defines an net.IP flag with specified name, default value, and usage string. +// The return value is the address of an net.IP variable that stores the value of the flag. +func IP(name string, value net.IP, usage string) *net.IP { + return CommandLine.IPP(name, "", value, usage) +} + +// IPP is like IP, but accepts a shorthand letter that can be used after a single dash. +func IPP(name, shorthand string, value net.IP, usage string) *net.IP { + return CommandLine.IPP(name, shorthand, value, usage) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/ip_slice.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/ip_slice.go new file mode 100644 index 00000000..7dd196fe --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/ip_slice.go @@ -0,0 +1,148 @@ +package pflag + +import ( + "fmt" + "io" + "net" + "strings" +) + +// -- ipSlice Value +type ipSliceValue struct { + value *[]net.IP + changed bool +} + +func newIPSliceValue(val []net.IP, p *[]net.IP) *ipSliceValue { + ipsv := new(ipSliceValue) + ipsv.value = p + *ipsv.value = val + return ipsv +} + +// Set converts, and assigns, the comma-separated IP argument string representation as the []net.IP value of this flag. +// If Set is called on a flag that already has a []net.IP assigned, the newly converted values will be appended. +func (s *ipSliceValue) Set(val string) error { + + // remove all quote characters + rmQuote := strings.NewReplacer(`"`, "", `'`, "", "`", "") + + // read flag arguments with CSV parser + ipStrSlice, err := readAsCSV(rmQuote.Replace(val)) + if err != nil && err != io.EOF { + return err + } + + // parse ip values into slice + out := make([]net.IP, 0, len(ipStrSlice)) + for _, ipStr := range ipStrSlice { + ip := net.ParseIP(strings.TrimSpace(ipStr)) + if ip == nil { + return fmt.Errorf("invalid string being converted to IP address: %s", ipStr) + } + out = append(out, ip) + } + + if !s.changed { + *s.value = out + } else { + *s.value = append(*s.value, out...) + } + + s.changed = true + + return nil +} + +// Type returns a string that uniquely represents this flag's type. +func (s *ipSliceValue) Type() string { + return "ipSlice" +} + +// String defines a "native" format for this net.IP slice flag value. +func (s *ipSliceValue) String() string { + + ipStrSlice := make([]string, len(*s.value)) + for i, ip := range *s.value { + ipStrSlice[i] = ip.String() + } + + out, _ := writeAsCSV(ipStrSlice) + + return "[" + out + "]" +} + +func ipSliceConv(val string) (interface{}, error) { + val = strings.Trim(val, "[]") + // Emtpy string would cause a slice with one (empty) entry + if len(val) == 0 { + return []net.IP{}, nil + } + ss := strings.Split(val, ",") + out := make([]net.IP, len(ss)) + for i, sval := range ss { + ip := net.ParseIP(strings.TrimSpace(sval)) + if ip == nil { + return nil, fmt.Errorf("invalid string being converted to IP address: %s", sval) + } + out[i] = ip + } + return out, nil +} + +// GetIPSlice returns the []net.IP value of a flag with the given name +func (f *FlagSet) GetIPSlice(name string) ([]net.IP, error) { + val, err := f.getFlagType(name, "ipSlice", ipSliceConv) + if err != nil { + return []net.IP{}, err + } + return val.([]net.IP), nil +} + +// IPSliceVar defines a ipSlice flag with specified name, default value, and usage string. +// The argument p points to a []net.IP variable in which to store the value of the flag. +func (f *FlagSet) IPSliceVar(p *[]net.IP, name string, value []net.IP, usage string) { + f.VarP(newIPSliceValue(value, p), name, "", usage) +} + +// IPSliceVarP is like IPSliceVar, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) IPSliceVarP(p *[]net.IP, name, shorthand string, value []net.IP, usage string) { + f.VarP(newIPSliceValue(value, p), name, shorthand, usage) +} + +// IPSliceVar defines a []net.IP flag with specified name, default value, and usage string. +// The argument p points to a []net.IP variable in which to store the value of the flag. +func IPSliceVar(p *[]net.IP, name string, value []net.IP, usage string) { + CommandLine.VarP(newIPSliceValue(value, p), name, "", usage) +} + +// IPSliceVarP is like IPSliceVar, but accepts a shorthand letter that can be used after a single dash. +func IPSliceVarP(p *[]net.IP, name, shorthand string, value []net.IP, usage string) { + CommandLine.VarP(newIPSliceValue(value, p), name, shorthand, usage) +} + +// IPSlice defines a []net.IP flag with specified name, default value, and usage string. +// The return value is the address of a []net.IP variable that stores the value of that flag. +func (f *FlagSet) IPSlice(name string, value []net.IP, usage string) *[]net.IP { + p := []net.IP{} + f.IPSliceVarP(&p, name, "", value, usage) + return &p +} + +// IPSliceP is like IPSlice, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) IPSliceP(name, shorthand string, value []net.IP, usage string) *[]net.IP { + p := []net.IP{} + f.IPSliceVarP(&p, name, shorthand, value, usage) + return &p +} + +// IPSlice defines a []net.IP flag with specified name, default value, and usage string. +// The return value is the address of a []net.IP variable that stores the value of the flag. +func IPSlice(name string, value []net.IP, usage string) *[]net.IP { + return CommandLine.IPSliceP(name, "", value, usage) +} + +// IPSliceP is like IPSlice, but accepts a shorthand letter that can be used after a single dash. +func IPSliceP(name, shorthand string, value []net.IP, usage string) *[]net.IP { + return CommandLine.IPSliceP(name, shorthand, value, usage) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/ipmask.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/ipmask.go new file mode 100644 index 00000000..5bd44bd2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/ipmask.go @@ -0,0 +1,122 @@ +package pflag + +import ( + "fmt" + "net" + "strconv" +) + +// -- net.IPMask value +type ipMaskValue net.IPMask + +func newIPMaskValue(val net.IPMask, p *net.IPMask) *ipMaskValue { + *p = val + return (*ipMaskValue)(p) +} + +func (i *ipMaskValue) String() string { return net.IPMask(*i).String() } +func (i *ipMaskValue) Set(s string) error { + ip := ParseIPv4Mask(s) + if ip == nil { + return fmt.Errorf("failed to parse IP mask: %q", s) + } + *i = ipMaskValue(ip) + return nil +} + +func (i *ipMaskValue) Type() string { + return "ipMask" +} + +// ParseIPv4Mask written in IP form (e.g. 255.255.255.0). +// This function should really belong to the net package. +func ParseIPv4Mask(s string) net.IPMask { + mask := net.ParseIP(s) + if mask == nil { + if len(s) != 8 { + return nil + } + // net.IPMask.String() actually outputs things like ffffff00 + // so write a horrible parser for that as well :-( + m := []int{} + for i := 0; i < 4; i++ { + b := "0x" + s[2*i:2*i+2] + d, err := strconv.ParseInt(b, 0, 0) + if err != nil { + return nil + } + m = append(m, int(d)) + } + s := fmt.Sprintf("%d.%d.%d.%d", m[0], m[1], m[2], m[3]) + mask = net.ParseIP(s) + if mask == nil { + return nil + } + } + return net.IPv4Mask(mask[12], mask[13], mask[14], mask[15]) +} + +func parseIPv4Mask(sval string) (interface{}, error) { + mask := ParseIPv4Mask(sval) + if mask == nil { + return nil, fmt.Errorf("unable to parse %s as net.IPMask", sval) + } + return mask, nil +} + +// GetIPv4Mask return the net.IPv4Mask value of a flag with the given name +func (f *FlagSet) GetIPv4Mask(name string) (net.IPMask, error) { + val, err := f.getFlagType(name, "ipMask", parseIPv4Mask) + if err != nil { + return nil, err + } + return val.(net.IPMask), nil +} + +// IPMaskVar defines an net.IPMask flag with specified name, default value, and usage string. +// The argument p points to an net.IPMask variable in which to store the value of the flag. +func (f *FlagSet) IPMaskVar(p *net.IPMask, name string, value net.IPMask, usage string) { + f.VarP(newIPMaskValue(value, p), name, "", usage) +} + +// IPMaskVarP is like IPMaskVar, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) IPMaskVarP(p *net.IPMask, name, shorthand string, value net.IPMask, usage string) { + f.VarP(newIPMaskValue(value, p), name, shorthand, usage) +} + +// IPMaskVar defines an net.IPMask flag with specified name, default value, and usage string. +// The argument p points to an net.IPMask variable in which to store the value of the flag. +func IPMaskVar(p *net.IPMask, name string, value net.IPMask, usage string) { + CommandLine.VarP(newIPMaskValue(value, p), name, "", usage) +} + +// IPMaskVarP is like IPMaskVar, but accepts a shorthand letter that can be used after a single dash. +func IPMaskVarP(p *net.IPMask, name, shorthand string, value net.IPMask, usage string) { + CommandLine.VarP(newIPMaskValue(value, p), name, shorthand, usage) +} + +// IPMask defines an net.IPMask flag with specified name, default value, and usage string. +// The return value is the address of an net.IPMask variable that stores the value of the flag. +func (f *FlagSet) IPMask(name string, value net.IPMask, usage string) *net.IPMask { + p := new(net.IPMask) + f.IPMaskVarP(p, name, "", value, usage) + return p +} + +// IPMaskP is like IPMask, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) IPMaskP(name, shorthand string, value net.IPMask, usage string) *net.IPMask { + p := new(net.IPMask) + f.IPMaskVarP(p, name, shorthand, value, usage) + return p +} + +// IPMask defines an net.IPMask flag with specified name, default value, and usage string. +// The return value is the address of an net.IPMask variable that stores the value of the flag. +func IPMask(name string, value net.IPMask, usage string) *net.IPMask { + return CommandLine.IPMaskP(name, "", value, usage) +} + +// IPMaskP is like IP, but accepts a shorthand letter that can be used after a single dash. +func IPMaskP(name, shorthand string, value net.IPMask, usage string) *net.IPMask { + return CommandLine.IPMaskP(name, shorthand, value, usage) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/ipnet.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/ipnet.go new file mode 100644 index 00000000..e2c1b8bc --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/ipnet.go @@ -0,0 +1,98 @@ +package pflag + +import ( + "fmt" + "net" + "strings" +) + +// IPNet adapts net.IPNet for use as a flag. +type ipNetValue net.IPNet + +func (ipnet ipNetValue) String() string { + n := net.IPNet(ipnet) + return n.String() +} + +func (ipnet *ipNetValue) Set(value string) error { + _, n, err := net.ParseCIDR(strings.TrimSpace(value)) + if err != nil { + return err + } + *ipnet = ipNetValue(*n) + return nil +} + +func (*ipNetValue) Type() string { + return "ipNet" +} + +func newIPNetValue(val net.IPNet, p *net.IPNet) *ipNetValue { + *p = val + return (*ipNetValue)(p) +} + +func ipNetConv(sval string) (interface{}, error) { + _, n, err := net.ParseCIDR(strings.TrimSpace(sval)) + if err == nil { + return *n, nil + } + return nil, fmt.Errorf("invalid string being converted to IPNet: %s", sval) +} + +// GetIPNet return the net.IPNet value of a flag with the given name +func (f *FlagSet) GetIPNet(name string) (net.IPNet, error) { + val, err := f.getFlagType(name, "ipNet", ipNetConv) + if err != nil { + return net.IPNet{}, err + } + return val.(net.IPNet), nil +} + +// IPNetVar defines an net.IPNet flag with specified name, default value, and usage string. +// The argument p points to an net.IPNet variable in which to store the value of the flag. +func (f *FlagSet) IPNetVar(p *net.IPNet, name string, value net.IPNet, usage string) { + f.VarP(newIPNetValue(value, p), name, "", usage) +} + +// IPNetVarP is like IPNetVar, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) IPNetVarP(p *net.IPNet, name, shorthand string, value net.IPNet, usage string) { + f.VarP(newIPNetValue(value, p), name, shorthand, usage) +} + +// IPNetVar defines an net.IPNet flag with specified name, default value, and usage string. +// The argument p points to an net.IPNet variable in which to store the value of the flag. +func IPNetVar(p *net.IPNet, name string, value net.IPNet, usage string) { + CommandLine.VarP(newIPNetValue(value, p), name, "", usage) +} + +// IPNetVarP is like IPNetVar, but accepts a shorthand letter that can be used after a single dash. +func IPNetVarP(p *net.IPNet, name, shorthand string, value net.IPNet, usage string) { + CommandLine.VarP(newIPNetValue(value, p), name, shorthand, usage) +} + +// IPNet defines an net.IPNet flag with specified name, default value, and usage string. +// The return value is the address of an net.IPNet variable that stores the value of the flag. +func (f *FlagSet) IPNet(name string, value net.IPNet, usage string) *net.IPNet { + p := new(net.IPNet) + f.IPNetVarP(p, name, "", value, usage) + return p +} + +// IPNetP is like IPNet, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) IPNetP(name, shorthand string, value net.IPNet, usage string) *net.IPNet { + p := new(net.IPNet) + f.IPNetVarP(p, name, shorthand, value, usage) + return p +} + +// IPNet defines an net.IPNet flag with specified name, default value, and usage string. +// The return value is the address of an net.IPNet variable that stores the value of the flag. +func IPNet(name string, value net.IPNet, usage string) *net.IPNet { + return CommandLine.IPNetP(name, "", value, usage) +} + +// IPNetP is like IPNet, but accepts a shorthand letter that can be used after a single dash. +func IPNetP(name, shorthand string, value net.IPNet, usage string) *net.IPNet { + return CommandLine.IPNetP(name, shorthand, value, usage) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/string.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/string.go new file mode 100644 index 00000000..04e0a26f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/string.go @@ -0,0 +1,80 @@ +package pflag + +// -- string Value +type stringValue string + +func newStringValue(val string, p *string) *stringValue { + *p = val + return (*stringValue)(p) +} + +func (s *stringValue) Set(val string) error { + *s = stringValue(val) + return nil +} +func (s *stringValue) Type() string { + return "string" +} + +func (s *stringValue) String() string { return string(*s) } + +func stringConv(sval string) (interface{}, error) { + return sval, nil +} + +// GetString return the string value of a flag with the given name +func (f *FlagSet) GetString(name string) (string, error) { + val, err := f.getFlagType(name, "string", stringConv) + if err != nil { + return "", err + } + return val.(string), nil +} + +// StringVar defines a string flag with specified name, default value, and usage string. +// The argument p points to a string variable in which to store the value of the flag. +func (f *FlagSet) StringVar(p *string, name string, value string, usage string) { + f.VarP(newStringValue(value, p), name, "", usage) +} + +// StringVarP is like StringVar, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) StringVarP(p *string, name, shorthand string, value string, usage string) { + f.VarP(newStringValue(value, p), name, shorthand, usage) +} + +// StringVar defines a string flag with specified name, default value, and usage string. +// The argument p points to a string variable in which to store the value of the flag. +func StringVar(p *string, name string, value string, usage string) { + CommandLine.VarP(newStringValue(value, p), name, "", usage) +} + +// StringVarP is like StringVar, but accepts a shorthand letter that can be used after a single dash. +func StringVarP(p *string, name, shorthand string, value string, usage string) { + CommandLine.VarP(newStringValue(value, p), name, shorthand, usage) +} + +// String defines a string flag with specified name, default value, and usage string. +// The return value is the address of a string variable that stores the value of the flag. +func (f *FlagSet) String(name string, value string, usage string) *string { + p := new(string) + f.StringVarP(p, name, "", value, usage) + return p +} + +// StringP is like String, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) StringP(name, shorthand string, value string, usage string) *string { + p := new(string) + f.StringVarP(p, name, shorthand, value, usage) + return p +} + +// String defines a string flag with specified name, default value, and usage string. +// The return value is the address of a string variable that stores the value of the flag. +func String(name string, value string, usage string) *string { + return CommandLine.StringP(name, "", value, usage) +} + +// StringP is like String, but accepts a shorthand letter that can be used after a single dash. +func StringP(name, shorthand string, value string, usage string) *string { + return CommandLine.StringP(name, shorthand, value, usage) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/string_array.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/string_array.go new file mode 100644 index 00000000..fa7bc601 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/string_array.go @@ -0,0 +1,103 @@ +package pflag + +// -- stringArray Value +type stringArrayValue struct { + value *[]string + changed bool +} + +func newStringArrayValue(val []string, p *[]string) *stringArrayValue { + ssv := new(stringArrayValue) + ssv.value = p + *ssv.value = val + return ssv +} + +func (s *stringArrayValue) Set(val string) error { + if !s.changed { + *s.value = []string{val} + s.changed = true + } else { + *s.value = append(*s.value, val) + } + return nil +} + +func (s *stringArrayValue) Type() string { + return "stringArray" +} + +func (s *stringArrayValue) String() string { + str, _ := writeAsCSV(*s.value) + return "[" + str + "]" +} + +func stringArrayConv(sval string) (interface{}, error) { + sval = sval[1 : len(sval)-1] + // An empty string would cause a array with one (empty) string + if len(sval) == 0 { + return []string{}, nil + } + return readAsCSV(sval) +} + +// GetStringArray return the []string value of a flag with the given name +func (f *FlagSet) GetStringArray(name string) ([]string, error) { + val, err := f.getFlagType(name, "stringArray", stringArrayConv) + if err != nil { + return []string{}, err + } + return val.([]string), nil +} + +// StringArrayVar defines a string flag with specified name, default value, and usage string. +// The argument p points to a []string variable in which to store the values of the multiple flags. +// The value of each argument will not try to be separated by comma. Use a StringSlice for that. +func (f *FlagSet) StringArrayVar(p *[]string, name string, value []string, usage string) { + f.VarP(newStringArrayValue(value, p), name, "", usage) +} + +// StringArrayVarP is like StringArrayVar, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) StringArrayVarP(p *[]string, name, shorthand string, value []string, usage string) { + f.VarP(newStringArrayValue(value, p), name, shorthand, usage) +} + +// StringArrayVar defines a string flag with specified name, default value, and usage string. +// The argument p points to a []string variable in which to store the value of the flag. +// The value of each argument will not try to be separated by comma. Use a StringSlice for that. +func StringArrayVar(p *[]string, name string, value []string, usage string) { + CommandLine.VarP(newStringArrayValue(value, p), name, "", usage) +} + +// StringArrayVarP is like StringArrayVar, but accepts a shorthand letter that can be used after a single dash. +func StringArrayVarP(p *[]string, name, shorthand string, value []string, usage string) { + CommandLine.VarP(newStringArrayValue(value, p), name, shorthand, usage) +} + +// StringArray defines a string flag with specified name, default value, and usage string. +// The return value is the address of a []string variable that stores the value of the flag. +// The value of each argument will not try to be separated by comma. Use a StringSlice for that. +func (f *FlagSet) StringArray(name string, value []string, usage string) *[]string { + p := []string{} + f.StringArrayVarP(&p, name, "", value, usage) + return &p +} + +// StringArrayP is like StringArray, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) StringArrayP(name, shorthand string, value []string, usage string) *[]string { + p := []string{} + f.StringArrayVarP(&p, name, shorthand, value, usage) + return &p +} + +// StringArray defines a string flag with specified name, default value, and usage string. +// The return value is the address of a []string variable that stores the value of the flag. +// The value of each argument will not try to be separated by comma. Use a StringSlice for that. +func StringArray(name string, value []string, usage string) *[]string { + return CommandLine.StringArrayP(name, "", value, usage) +} + +// StringArrayP is like StringArray, but accepts a shorthand letter that can be used after a single dash. +func StringArrayP(name, shorthand string, value []string, usage string) *[]string { + return CommandLine.StringArrayP(name, shorthand, value, usage) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/string_slice.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/string_slice.go new file mode 100644 index 00000000..0cd3ccc0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/string_slice.go @@ -0,0 +1,149 @@ +package pflag + +import ( + "bytes" + "encoding/csv" + "strings" +) + +// -- stringSlice Value +type stringSliceValue struct { + value *[]string + changed bool +} + +func newStringSliceValue(val []string, p *[]string) *stringSliceValue { + ssv := new(stringSliceValue) + ssv.value = p + *ssv.value = val + return ssv +} + +func readAsCSV(val string) ([]string, error) { + if val == "" { + return []string{}, nil + } + stringReader := strings.NewReader(val) + csvReader := csv.NewReader(stringReader) + return csvReader.Read() +} + +func writeAsCSV(vals []string) (string, error) { + b := &bytes.Buffer{} + w := csv.NewWriter(b) + err := w.Write(vals) + if err != nil { + return "", err + } + w.Flush() + return strings.TrimSuffix(b.String(), "\n"), nil +} + +func (s *stringSliceValue) Set(val string) error { + v, err := readAsCSV(val) + if err != nil { + return err + } + if !s.changed { + *s.value = v + } else { + *s.value = append(*s.value, v...) + } + s.changed = true + return nil +} + +func (s *stringSliceValue) Type() string { + return "stringSlice" +} + +func (s *stringSliceValue) String() string { + str, _ := writeAsCSV(*s.value) + return "[" + str + "]" +} + +func stringSliceConv(sval string) (interface{}, error) { + sval = sval[1 : len(sval)-1] + // An empty string would cause a slice with one (empty) string + if len(sval) == 0 { + return []string{}, nil + } + return readAsCSV(sval) +} + +// GetStringSlice return the []string value of a flag with the given name +func (f *FlagSet) GetStringSlice(name string) ([]string, error) { + val, err := f.getFlagType(name, "stringSlice", stringSliceConv) + if err != nil { + return []string{}, err + } + return val.([]string), nil +} + +// StringSliceVar defines a string flag with specified name, default value, and usage string. +// The argument p points to a []string variable in which to store the value of the flag. +// Compared to StringArray flags, StringSlice flags take comma-separated value as arguments and split them accordingly. +// For example: +// --ss="v1,v2" -ss="v3" +// will result in +// []string{"v1", "v2", "v3"} +func (f *FlagSet) StringSliceVar(p *[]string, name string, value []string, usage string) { + f.VarP(newStringSliceValue(value, p), name, "", usage) +} + +// StringSliceVarP is like StringSliceVar, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) StringSliceVarP(p *[]string, name, shorthand string, value []string, usage string) { + f.VarP(newStringSliceValue(value, p), name, shorthand, usage) +} + +// StringSliceVar defines a string flag with specified name, default value, and usage string. +// The argument p points to a []string variable in which to store the value of the flag. +// Compared to StringArray flags, StringSlice flags take comma-separated value as arguments and split them accordingly. +// For example: +// --ss="v1,v2" -ss="v3" +// will result in +// []string{"v1", "v2", "v3"} +func StringSliceVar(p *[]string, name string, value []string, usage string) { + CommandLine.VarP(newStringSliceValue(value, p), name, "", usage) +} + +// StringSliceVarP is like StringSliceVar, but accepts a shorthand letter that can be used after a single dash. +func StringSliceVarP(p *[]string, name, shorthand string, value []string, usage string) { + CommandLine.VarP(newStringSliceValue(value, p), name, shorthand, usage) +} + +// StringSlice defines a string flag with specified name, default value, and usage string. +// The return value is the address of a []string variable that stores the value of the flag. +// Compared to StringArray flags, StringSlice flags take comma-separated value as arguments and split them accordingly. +// For example: +// --ss="v1,v2" -ss="v3" +// will result in +// []string{"v1", "v2", "v3"} +func (f *FlagSet) StringSlice(name string, value []string, usage string) *[]string { + p := []string{} + f.StringSliceVarP(&p, name, "", value, usage) + return &p +} + +// StringSliceP is like StringSlice, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) StringSliceP(name, shorthand string, value []string, usage string) *[]string { + p := []string{} + f.StringSliceVarP(&p, name, shorthand, value, usage) + return &p +} + +// StringSlice defines a string flag with specified name, default value, and usage string. +// The return value is the address of a []string variable that stores the value of the flag. +// Compared to StringArray flags, StringSlice flags take comma-separated value as arguments and split them accordingly. +// For example: +// --ss="v1,v2" -ss="v3" +// will result in +// []string{"v1", "v2", "v3"} +func StringSlice(name string, value []string, usage string) *[]string { + return CommandLine.StringSliceP(name, "", value, usage) +} + +// StringSliceP is like StringSlice, but accepts a shorthand letter that can be used after a single dash. +func StringSliceP(name, shorthand string, value []string, usage string) *[]string { + return CommandLine.StringSliceP(name, shorthand, value, usage) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/string_to_int.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/string_to_int.go new file mode 100644 index 00000000..5ceda396 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/string_to_int.go @@ -0,0 +1,149 @@ +package pflag + +import ( + "bytes" + "fmt" + "strconv" + "strings" +) + +// -- stringToInt Value +type stringToIntValue struct { + value *map[string]int + changed bool +} + +func newStringToIntValue(val map[string]int, p *map[string]int) *stringToIntValue { + ssv := new(stringToIntValue) + ssv.value = p + *ssv.value = val + return ssv +} + +// Format: a=1,b=2 +func (s *stringToIntValue) Set(val string) error { + ss := strings.Split(val, ",") + out := make(map[string]int, len(ss)) + for _, pair := range ss { + kv := strings.SplitN(pair, "=", 2) + if len(kv) != 2 { + return fmt.Errorf("%s must be formatted as key=value", pair) + } + var err error + out[kv[0]], err = strconv.Atoi(kv[1]) + if err != nil { + return err + } + } + if !s.changed { + *s.value = out + } else { + for k, v := range out { + (*s.value)[k] = v + } + } + s.changed = true + return nil +} + +func (s *stringToIntValue) Type() string { + return "stringToInt" +} + +func (s *stringToIntValue) String() string { + var buf bytes.Buffer + i := 0 + for k, v := range *s.value { + if i > 0 { + buf.WriteRune(',') + } + buf.WriteString(k) + buf.WriteRune('=') + buf.WriteString(strconv.Itoa(v)) + i++ + } + return "[" + buf.String() + "]" +} + +func stringToIntConv(val string) (interface{}, error) { + val = strings.Trim(val, "[]") + // An empty string would cause an empty map + if len(val) == 0 { + return map[string]int{}, nil + } + ss := strings.Split(val, ",") + out := make(map[string]int, len(ss)) + for _, pair := range ss { + kv := strings.SplitN(pair, "=", 2) + if len(kv) != 2 { + return nil, fmt.Errorf("%s must be formatted as key=value", pair) + } + var err error + out[kv[0]], err = strconv.Atoi(kv[1]) + if err != nil { + return nil, err + } + } + return out, nil +} + +// GetStringToInt return the map[string]int value of a flag with the given name +func (f *FlagSet) GetStringToInt(name string) (map[string]int, error) { + val, err := f.getFlagType(name, "stringToInt", stringToIntConv) + if err != nil { + return map[string]int{}, err + } + return val.(map[string]int), nil +} + +// StringToIntVar defines a string flag with specified name, default value, and usage string. +// The argument p points to a map[string]int variable in which to store the values of the multiple flags. +// The value of each argument will not try to be separated by comma +func (f *FlagSet) StringToIntVar(p *map[string]int, name string, value map[string]int, usage string) { + f.VarP(newStringToIntValue(value, p), name, "", usage) +} + +// StringToIntVarP is like StringToIntVar, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) StringToIntVarP(p *map[string]int, name, shorthand string, value map[string]int, usage string) { + f.VarP(newStringToIntValue(value, p), name, shorthand, usage) +} + +// StringToIntVar defines a string flag with specified name, default value, and usage string. +// The argument p points to a map[string]int variable in which to store the value of the flag. +// The value of each argument will not try to be separated by comma +func StringToIntVar(p *map[string]int, name string, value map[string]int, usage string) { + CommandLine.VarP(newStringToIntValue(value, p), name, "", usage) +} + +// StringToIntVarP is like StringToIntVar, but accepts a shorthand letter that can be used after a single dash. +func StringToIntVarP(p *map[string]int, name, shorthand string, value map[string]int, usage string) { + CommandLine.VarP(newStringToIntValue(value, p), name, shorthand, usage) +} + +// StringToInt defines a string flag with specified name, default value, and usage string. +// The return value is the address of a map[string]int variable that stores the value of the flag. +// The value of each argument will not try to be separated by comma +func (f *FlagSet) StringToInt(name string, value map[string]int, usage string) *map[string]int { + p := map[string]int{} + f.StringToIntVarP(&p, name, "", value, usage) + return &p +} + +// StringToIntP is like StringToInt, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) StringToIntP(name, shorthand string, value map[string]int, usage string) *map[string]int { + p := map[string]int{} + f.StringToIntVarP(&p, name, shorthand, value, usage) + return &p +} + +// StringToInt defines a string flag with specified name, default value, and usage string. +// The return value is the address of a map[string]int variable that stores the value of the flag. +// The value of each argument will not try to be separated by comma +func StringToInt(name string, value map[string]int, usage string) *map[string]int { + return CommandLine.StringToIntP(name, "", value, usage) +} + +// StringToIntP is like StringToInt, but accepts a shorthand letter that can be used after a single dash. +func StringToIntP(name, shorthand string, value map[string]int, usage string) *map[string]int { + return CommandLine.StringToIntP(name, shorthand, value, usage) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/string_to_string.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/string_to_string.go new file mode 100644 index 00000000..890a01af --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/string_to_string.go @@ -0,0 +1,160 @@ +package pflag + +import ( + "bytes" + "encoding/csv" + "fmt" + "strings" +) + +// -- stringToString Value +type stringToStringValue struct { + value *map[string]string + changed bool +} + +func newStringToStringValue(val map[string]string, p *map[string]string) *stringToStringValue { + ssv := new(stringToStringValue) + ssv.value = p + *ssv.value = val + return ssv +} + +// Format: a=1,b=2 +func (s *stringToStringValue) Set(val string) error { + var ss []string + n := strings.Count(val, "=") + switch n { + case 0: + return fmt.Errorf("%s must be formatted as key=value", val) + case 1: + ss = append(ss, strings.Trim(val, `"`)) + default: + r := csv.NewReader(strings.NewReader(val)) + var err error + ss, err = r.Read() + if err != nil { + return err + } + } + + out := make(map[string]string, len(ss)) + for _, pair := range ss { + kv := strings.SplitN(pair, "=", 2) + if len(kv) != 2 { + return fmt.Errorf("%s must be formatted as key=value", pair) + } + out[kv[0]] = kv[1] + } + if !s.changed { + *s.value = out + } else { + for k, v := range out { + (*s.value)[k] = v + } + } + s.changed = true + return nil +} + +func (s *stringToStringValue) Type() string { + return "stringToString" +} + +func (s *stringToStringValue) String() string { + records := make([]string, 0, len(*s.value)>>1) + for k, v := range *s.value { + records = append(records, k+"="+v) + } + + var buf bytes.Buffer + w := csv.NewWriter(&buf) + if err := w.Write(records); err != nil { + panic(err) + } + w.Flush() + return "[" + strings.TrimSpace(buf.String()) + "]" +} + +func stringToStringConv(val string) (interface{}, error) { + val = strings.Trim(val, "[]") + // An empty string would cause an empty map + if len(val) == 0 { + return map[string]string{}, nil + } + r := csv.NewReader(strings.NewReader(val)) + ss, err := r.Read() + if err != nil { + return nil, err + } + out := make(map[string]string, len(ss)) + for _, pair := range ss { + kv := strings.SplitN(pair, "=", 2) + if len(kv) != 2 { + return nil, fmt.Errorf("%s must be formatted as key=value", pair) + } + out[kv[0]] = kv[1] + } + return out, nil +} + +// GetStringToString return the map[string]string value of a flag with the given name +func (f *FlagSet) GetStringToString(name string) (map[string]string, error) { + val, err := f.getFlagType(name, "stringToString", stringToStringConv) + if err != nil { + return map[string]string{}, err + } + return val.(map[string]string), nil +} + +// StringToStringVar defines a string flag with specified name, default value, and usage string. +// The argument p points to a map[string]string variable in which to store the values of the multiple flags. +// The value of each argument will not try to be separated by comma +func (f *FlagSet) StringToStringVar(p *map[string]string, name string, value map[string]string, usage string) { + f.VarP(newStringToStringValue(value, p), name, "", usage) +} + +// StringToStringVarP is like StringToStringVar, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) StringToStringVarP(p *map[string]string, name, shorthand string, value map[string]string, usage string) { + f.VarP(newStringToStringValue(value, p), name, shorthand, usage) +} + +// StringToStringVar defines a string flag with specified name, default value, and usage string. +// The argument p points to a map[string]string variable in which to store the value of the flag. +// The value of each argument will not try to be separated by comma +func StringToStringVar(p *map[string]string, name string, value map[string]string, usage string) { + CommandLine.VarP(newStringToStringValue(value, p), name, "", usage) +} + +// StringToStringVarP is like StringToStringVar, but accepts a shorthand letter that can be used after a single dash. +func StringToStringVarP(p *map[string]string, name, shorthand string, value map[string]string, usage string) { + CommandLine.VarP(newStringToStringValue(value, p), name, shorthand, usage) +} + +// StringToString defines a string flag with specified name, default value, and usage string. +// The return value is the address of a map[string]string variable that stores the value of the flag. +// The value of each argument will not try to be separated by comma +func (f *FlagSet) StringToString(name string, value map[string]string, usage string) *map[string]string { + p := map[string]string{} + f.StringToStringVarP(&p, name, "", value, usage) + return &p +} + +// StringToStringP is like StringToString, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) StringToStringP(name, shorthand string, value map[string]string, usage string) *map[string]string { + p := map[string]string{} + f.StringToStringVarP(&p, name, shorthand, value, usage) + return &p +} + +// StringToString defines a string flag with specified name, default value, and usage string. +// The return value is the address of a map[string]string variable that stores the value of the flag. +// The value of each argument will not try to be separated by comma +func StringToString(name string, value map[string]string, usage string) *map[string]string { + return CommandLine.StringToStringP(name, "", value, usage) +} + +// StringToStringP is like StringToString, but accepts a shorthand letter that can be used after a single dash. +func StringToStringP(name, shorthand string, value map[string]string, usage string) *map[string]string { + return CommandLine.StringToStringP(name, shorthand, value, usage) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/uint.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/uint.go new file mode 100644 index 00000000..dcbc2b75 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/uint.go @@ -0,0 +1,88 @@ +package pflag + +import "strconv" + +// -- uint Value +type uintValue uint + +func newUintValue(val uint, p *uint) *uintValue { + *p = val + return (*uintValue)(p) +} + +func (i *uintValue) Set(s string) error { + v, err := strconv.ParseUint(s, 0, 64) + *i = uintValue(v) + return err +} + +func (i *uintValue) Type() string { + return "uint" +} + +func (i *uintValue) String() string { return strconv.FormatUint(uint64(*i), 10) } + +func uintConv(sval string) (interface{}, error) { + v, err := strconv.ParseUint(sval, 0, 0) + if err != nil { + return 0, err + } + return uint(v), nil +} + +// GetUint return the uint value of a flag with the given name +func (f *FlagSet) GetUint(name string) (uint, error) { + val, err := f.getFlagType(name, "uint", uintConv) + if err != nil { + return 0, err + } + return val.(uint), nil +} + +// UintVar defines a uint flag with specified name, default value, and usage string. +// The argument p points to a uint variable in which to store the value of the flag. +func (f *FlagSet) UintVar(p *uint, name string, value uint, usage string) { + f.VarP(newUintValue(value, p), name, "", usage) +} + +// UintVarP is like UintVar, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) UintVarP(p *uint, name, shorthand string, value uint, usage string) { + f.VarP(newUintValue(value, p), name, shorthand, usage) +} + +// UintVar defines a uint flag with specified name, default value, and usage string. +// The argument p points to a uint variable in which to store the value of the flag. +func UintVar(p *uint, name string, value uint, usage string) { + CommandLine.VarP(newUintValue(value, p), name, "", usage) +} + +// UintVarP is like UintVar, but accepts a shorthand letter that can be used after a single dash. +func UintVarP(p *uint, name, shorthand string, value uint, usage string) { + CommandLine.VarP(newUintValue(value, p), name, shorthand, usage) +} + +// Uint defines a uint flag with specified name, default value, and usage string. +// The return value is the address of a uint variable that stores the value of the flag. +func (f *FlagSet) Uint(name string, value uint, usage string) *uint { + p := new(uint) + f.UintVarP(p, name, "", value, usage) + return p +} + +// UintP is like Uint, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) UintP(name, shorthand string, value uint, usage string) *uint { + p := new(uint) + f.UintVarP(p, name, shorthand, value, usage) + return p +} + +// Uint defines a uint flag with specified name, default value, and usage string. +// The return value is the address of a uint variable that stores the value of the flag. +func Uint(name string, value uint, usage string) *uint { + return CommandLine.UintP(name, "", value, usage) +} + +// UintP is like Uint, but accepts a shorthand letter that can be used after a single dash. +func UintP(name, shorthand string, value uint, usage string) *uint { + return CommandLine.UintP(name, shorthand, value, usage) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/uint16.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/uint16.go new file mode 100644 index 00000000..7e9914ed --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/uint16.go @@ -0,0 +1,88 @@ +package pflag + +import "strconv" + +// -- uint16 value +type uint16Value uint16 + +func newUint16Value(val uint16, p *uint16) *uint16Value { + *p = val + return (*uint16Value)(p) +} + +func (i *uint16Value) Set(s string) error { + v, err := strconv.ParseUint(s, 0, 16) + *i = uint16Value(v) + return err +} + +func (i *uint16Value) Type() string { + return "uint16" +} + +func (i *uint16Value) String() string { return strconv.FormatUint(uint64(*i), 10) } + +func uint16Conv(sval string) (interface{}, error) { + v, err := strconv.ParseUint(sval, 0, 16) + if err != nil { + return 0, err + } + return uint16(v), nil +} + +// GetUint16 return the uint16 value of a flag with the given name +func (f *FlagSet) GetUint16(name string) (uint16, error) { + val, err := f.getFlagType(name, "uint16", uint16Conv) + if err != nil { + return 0, err + } + return val.(uint16), nil +} + +// Uint16Var defines a uint flag with specified name, default value, and usage string. +// The argument p points to a uint variable in which to store the value of the flag. +func (f *FlagSet) Uint16Var(p *uint16, name string, value uint16, usage string) { + f.VarP(newUint16Value(value, p), name, "", usage) +} + +// Uint16VarP is like Uint16Var, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) Uint16VarP(p *uint16, name, shorthand string, value uint16, usage string) { + f.VarP(newUint16Value(value, p), name, shorthand, usage) +} + +// Uint16Var defines a uint flag with specified name, default value, and usage string. +// The argument p points to a uint variable in which to store the value of the flag. +func Uint16Var(p *uint16, name string, value uint16, usage string) { + CommandLine.VarP(newUint16Value(value, p), name, "", usage) +} + +// Uint16VarP is like Uint16Var, but accepts a shorthand letter that can be used after a single dash. +func Uint16VarP(p *uint16, name, shorthand string, value uint16, usage string) { + CommandLine.VarP(newUint16Value(value, p), name, shorthand, usage) +} + +// Uint16 defines a uint flag with specified name, default value, and usage string. +// The return value is the address of a uint variable that stores the value of the flag. +func (f *FlagSet) Uint16(name string, value uint16, usage string) *uint16 { + p := new(uint16) + f.Uint16VarP(p, name, "", value, usage) + return p +} + +// Uint16P is like Uint16, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) Uint16P(name, shorthand string, value uint16, usage string) *uint16 { + p := new(uint16) + f.Uint16VarP(p, name, shorthand, value, usage) + return p +} + +// Uint16 defines a uint flag with specified name, default value, and usage string. +// The return value is the address of a uint variable that stores the value of the flag. +func Uint16(name string, value uint16, usage string) *uint16 { + return CommandLine.Uint16P(name, "", value, usage) +} + +// Uint16P is like Uint16, but accepts a shorthand letter that can be used after a single dash. +func Uint16P(name, shorthand string, value uint16, usage string) *uint16 { + return CommandLine.Uint16P(name, shorthand, value, usage) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/uint32.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/uint32.go new file mode 100644 index 00000000..d8024539 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/uint32.go @@ -0,0 +1,88 @@ +package pflag + +import "strconv" + +// -- uint32 value +type uint32Value uint32 + +func newUint32Value(val uint32, p *uint32) *uint32Value { + *p = val + return (*uint32Value)(p) +} + +func (i *uint32Value) Set(s string) error { + v, err := strconv.ParseUint(s, 0, 32) + *i = uint32Value(v) + return err +} + +func (i *uint32Value) Type() string { + return "uint32" +} + +func (i *uint32Value) String() string { return strconv.FormatUint(uint64(*i), 10) } + +func uint32Conv(sval string) (interface{}, error) { + v, err := strconv.ParseUint(sval, 0, 32) + if err != nil { + return 0, err + } + return uint32(v), nil +} + +// GetUint32 return the uint32 value of a flag with the given name +func (f *FlagSet) GetUint32(name string) (uint32, error) { + val, err := f.getFlagType(name, "uint32", uint32Conv) + if err != nil { + return 0, err + } + return val.(uint32), nil +} + +// Uint32Var defines a uint32 flag with specified name, default value, and usage string. +// The argument p points to a uint32 variable in which to store the value of the flag. +func (f *FlagSet) Uint32Var(p *uint32, name string, value uint32, usage string) { + f.VarP(newUint32Value(value, p), name, "", usage) +} + +// Uint32VarP is like Uint32Var, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) Uint32VarP(p *uint32, name, shorthand string, value uint32, usage string) { + f.VarP(newUint32Value(value, p), name, shorthand, usage) +} + +// Uint32Var defines a uint32 flag with specified name, default value, and usage string. +// The argument p points to a uint32 variable in which to store the value of the flag. +func Uint32Var(p *uint32, name string, value uint32, usage string) { + CommandLine.VarP(newUint32Value(value, p), name, "", usage) +} + +// Uint32VarP is like Uint32Var, but accepts a shorthand letter that can be used after a single dash. +func Uint32VarP(p *uint32, name, shorthand string, value uint32, usage string) { + CommandLine.VarP(newUint32Value(value, p), name, shorthand, usage) +} + +// Uint32 defines a uint32 flag with specified name, default value, and usage string. +// The return value is the address of a uint32 variable that stores the value of the flag. +func (f *FlagSet) Uint32(name string, value uint32, usage string) *uint32 { + p := new(uint32) + f.Uint32VarP(p, name, "", value, usage) + return p +} + +// Uint32P is like Uint32, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) Uint32P(name, shorthand string, value uint32, usage string) *uint32 { + p := new(uint32) + f.Uint32VarP(p, name, shorthand, value, usage) + return p +} + +// Uint32 defines a uint32 flag with specified name, default value, and usage string. +// The return value is the address of a uint32 variable that stores the value of the flag. +func Uint32(name string, value uint32, usage string) *uint32 { + return CommandLine.Uint32P(name, "", value, usage) +} + +// Uint32P is like Uint32, but accepts a shorthand letter that can be used after a single dash. +func Uint32P(name, shorthand string, value uint32, usage string) *uint32 { + return CommandLine.Uint32P(name, shorthand, value, usage) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/uint64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/uint64.go new file mode 100644 index 00000000..f62240f2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/uint64.go @@ -0,0 +1,88 @@ +package pflag + +import "strconv" + +// -- uint64 Value +type uint64Value uint64 + +func newUint64Value(val uint64, p *uint64) *uint64Value { + *p = val + return (*uint64Value)(p) +} + +func (i *uint64Value) Set(s string) error { + v, err := strconv.ParseUint(s, 0, 64) + *i = uint64Value(v) + return err +} + +func (i *uint64Value) Type() string { + return "uint64" +} + +func (i *uint64Value) String() string { return strconv.FormatUint(uint64(*i), 10) } + +func uint64Conv(sval string) (interface{}, error) { + v, err := strconv.ParseUint(sval, 0, 64) + if err != nil { + return 0, err + } + return uint64(v), nil +} + +// GetUint64 return the uint64 value of a flag with the given name +func (f *FlagSet) GetUint64(name string) (uint64, error) { + val, err := f.getFlagType(name, "uint64", uint64Conv) + if err != nil { + return 0, err + } + return val.(uint64), nil +} + +// Uint64Var defines a uint64 flag with specified name, default value, and usage string. +// The argument p points to a uint64 variable in which to store the value of the flag. +func (f *FlagSet) Uint64Var(p *uint64, name string, value uint64, usage string) { + f.VarP(newUint64Value(value, p), name, "", usage) +} + +// Uint64VarP is like Uint64Var, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) Uint64VarP(p *uint64, name, shorthand string, value uint64, usage string) { + f.VarP(newUint64Value(value, p), name, shorthand, usage) +} + +// Uint64Var defines a uint64 flag with specified name, default value, and usage string. +// The argument p points to a uint64 variable in which to store the value of the flag. +func Uint64Var(p *uint64, name string, value uint64, usage string) { + CommandLine.VarP(newUint64Value(value, p), name, "", usage) +} + +// Uint64VarP is like Uint64Var, but accepts a shorthand letter that can be used after a single dash. +func Uint64VarP(p *uint64, name, shorthand string, value uint64, usage string) { + CommandLine.VarP(newUint64Value(value, p), name, shorthand, usage) +} + +// Uint64 defines a uint64 flag with specified name, default value, and usage string. +// The return value is the address of a uint64 variable that stores the value of the flag. +func (f *FlagSet) Uint64(name string, value uint64, usage string) *uint64 { + p := new(uint64) + f.Uint64VarP(p, name, "", value, usage) + return p +} + +// Uint64P is like Uint64, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) Uint64P(name, shorthand string, value uint64, usage string) *uint64 { + p := new(uint64) + f.Uint64VarP(p, name, shorthand, value, usage) + return p +} + +// Uint64 defines a uint64 flag with specified name, default value, and usage string. +// The return value is the address of a uint64 variable that stores the value of the flag. +func Uint64(name string, value uint64, usage string) *uint64 { + return CommandLine.Uint64P(name, "", value, usage) +} + +// Uint64P is like Uint64, but accepts a shorthand letter that can be used after a single dash. +func Uint64P(name, shorthand string, value uint64, usage string) *uint64 { + return CommandLine.Uint64P(name, shorthand, value, usage) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/uint8.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/uint8.go new file mode 100644 index 00000000..bb0e83c1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/uint8.go @@ -0,0 +1,88 @@ +package pflag + +import "strconv" + +// -- uint8 Value +type uint8Value uint8 + +func newUint8Value(val uint8, p *uint8) *uint8Value { + *p = val + return (*uint8Value)(p) +} + +func (i *uint8Value) Set(s string) error { + v, err := strconv.ParseUint(s, 0, 8) + *i = uint8Value(v) + return err +} + +func (i *uint8Value) Type() string { + return "uint8" +} + +func (i *uint8Value) String() string { return strconv.FormatUint(uint64(*i), 10) } + +func uint8Conv(sval string) (interface{}, error) { + v, err := strconv.ParseUint(sval, 0, 8) + if err != nil { + return 0, err + } + return uint8(v), nil +} + +// GetUint8 return the uint8 value of a flag with the given name +func (f *FlagSet) GetUint8(name string) (uint8, error) { + val, err := f.getFlagType(name, "uint8", uint8Conv) + if err != nil { + return 0, err + } + return val.(uint8), nil +} + +// Uint8Var defines a uint8 flag with specified name, default value, and usage string. +// The argument p points to a uint8 variable in which to store the value of the flag. +func (f *FlagSet) Uint8Var(p *uint8, name string, value uint8, usage string) { + f.VarP(newUint8Value(value, p), name, "", usage) +} + +// Uint8VarP is like Uint8Var, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) Uint8VarP(p *uint8, name, shorthand string, value uint8, usage string) { + f.VarP(newUint8Value(value, p), name, shorthand, usage) +} + +// Uint8Var defines a uint8 flag with specified name, default value, and usage string. +// The argument p points to a uint8 variable in which to store the value of the flag. +func Uint8Var(p *uint8, name string, value uint8, usage string) { + CommandLine.VarP(newUint8Value(value, p), name, "", usage) +} + +// Uint8VarP is like Uint8Var, but accepts a shorthand letter that can be used after a single dash. +func Uint8VarP(p *uint8, name, shorthand string, value uint8, usage string) { + CommandLine.VarP(newUint8Value(value, p), name, shorthand, usage) +} + +// Uint8 defines a uint8 flag with specified name, default value, and usage string. +// The return value is the address of a uint8 variable that stores the value of the flag. +func (f *FlagSet) Uint8(name string, value uint8, usage string) *uint8 { + p := new(uint8) + f.Uint8VarP(p, name, "", value, usage) + return p +} + +// Uint8P is like Uint8, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) Uint8P(name, shorthand string, value uint8, usage string) *uint8 { + p := new(uint8) + f.Uint8VarP(p, name, shorthand, value, usage) + return p +} + +// Uint8 defines a uint8 flag with specified name, default value, and usage string. +// The return value is the address of a uint8 variable that stores the value of the flag. +func Uint8(name string, value uint8, usage string) *uint8 { + return CommandLine.Uint8P(name, "", value, usage) +} + +// Uint8P is like Uint8, but accepts a shorthand letter that can be used after a single dash. +func Uint8P(name, shorthand string, value uint8, usage string) *uint8 { + return CommandLine.Uint8P(name, shorthand, value, usage) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/uint_slice.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/uint_slice.go new file mode 100644 index 00000000..edd94c60 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/pflag/uint_slice.go @@ -0,0 +1,126 @@ +package pflag + +import ( + "fmt" + "strconv" + "strings" +) + +// -- uintSlice Value +type uintSliceValue struct { + value *[]uint + changed bool +} + +func newUintSliceValue(val []uint, p *[]uint) *uintSliceValue { + uisv := new(uintSliceValue) + uisv.value = p + *uisv.value = val + return uisv +} + +func (s *uintSliceValue) Set(val string) error { + ss := strings.Split(val, ",") + out := make([]uint, len(ss)) + for i, d := range ss { + u, err := strconv.ParseUint(d, 10, 0) + if err != nil { + return err + } + out[i] = uint(u) + } + if !s.changed { + *s.value = out + } else { + *s.value = append(*s.value, out...) + } + s.changed = true + return nil +} + +func (s *uintSliceValue) Type() string { + return "uintSlice" +} + +func (s *uintSliceValue) String() string { + out := make([]string, len(*s.value)) + for i, d := range *s.value { + out[i] = fmt.Sprintf("%d", d) + } + return "[" + strings.Join(out, ",") + "]" +} + +func uintSliceConv(val string) (interface{}, error) { + val = strings.Trim(val, "[]") + // Empty string would cause a slice with one (empty) entry + if len(val) == 0 { + return []uint{}, nil + } + ss := strings.Split(val, ",") + out := make([]uint, len(ss)) + for i, d := range ss { + u, err := strconv.ParseUint(d, 10, 0) + if err != nil { + return nil, err + } + out[i] = uint(u) + } + return out, nil +} + +// GetUintSlice returns the []uint value of a flag with the given name. +func (f *FlagSet) GetUintSlice(name string) ([]uint, error) { + val, err := f.getFlagType(name, "uintSlice", uintSliceConv) + if err != nil { + return []uint{}, err + } + return val.([]uint), nil +} + +// UintSliceVar defines a uintSlice flag with specified name, default value, and usage string. +// The argument p points to a []uint variable in which to store the value of the flag. +func (f *FlagSet) UintSliceVar(p *[]uint, name string, value []uint, usage string) { + f.VarP(newUintSliceValue(value, p), name, "", usage) +} + +// UintSliceVarP is like UintSliceVar, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) UintSliceVarP(p *[]uint, name, shorthand string, value []uint, usage string) { + f.VarP(newUintSliceValue(value, p), name, shorthand, usage) +} + +// UintSliceVar defines a uint[] flag with specified name, default value, and usage string. +// The argument p points to a uint[] variable in which to store the value of the flag. +func UintSliceVar(p *[]uint, name string, value []uint, usage string) { + CommandLine.VarP(newUintSliceValue(value, p), name, "", usage) +} + +// UintSliceVarP is like the UintSliceVar, but accepts a shorthand letter that can be used after a single dash. +func UintSliceVarP(p *[]uint, name, shorthand string, value []uint, usage string) { + CommandLine.VarP(newUintSliceValue(value, p), name, shorthand, usage) +} + +// UintSlice defines a []uint flag with specified name, default value, and usage string. +// The return value is the address of a []uint variable that stores the value of the flag. +func (f *FlagSet) UintSlice(name string, value []uint, usage string) *[]uint { + p := []uint{} + f.UintSliceVarP(&p, name, "", value, usage) + return &p +} + +// UintSliceP is like UintSlice, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) UintSliceP(name, shorthand string, value []uint, usage string) *[]uint { + p := []uint{} + f.UintSliceVarP(&p, name, shorthand, value, usage) + return &p +} + +// UintSlice defines a []uint flag with specified name, default value, and usage string. +// The return value is the address of a []uint variable that stores the value of the flag. +func UintSlice(name string, value []uint, usage string) *[]uint { + return CommandLine.UintSliceP(name, "", value, usage) +} + +// UintSliceP is like UintSlice, but accepts a shorthand letter that can be used after a single dash. +func UintSliceP(name, shorthand string, value []uint, usage string) *[]uint { + return CommandLine.UintSliceP(name, shorthand, value, usage) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/viper/.gitignore b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/viper/.gitignore new file mode 100644 index 00000000..352a34a5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/viper/.gitignore @@ -0,0 +1,24 @@ +# Compiled Object files, Static and Dynamic libs (Shared Objects) +*.o +*.a +*.so + +# Folders +_obj +_test + +# Architecture specific extensions/prefixes +*.[568vq] +[568vq].out + +*.cgo1.go +*.cgo2.c +_cgo_defun.c +_cgo_gotypes.go +_cgo_export.* + +_testmain.go + +*.exe +*.test +*.bench \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/viper/.travis.yml b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/viper/.travis.yml new file mode 100644 index 00000000..22a8a00e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/viper/.travis.yml @@ -0,0 +1,27 @@ +go_import_path: github.com/spf13/viper + +language: go +go: + - 1.10.x + - 1.11.x + - tip + +os: + - linux + - osx + +matrix: + allow_failures: + - go: tip + fast_finish: true + +script: + - go install ./... + - diff -u <(echo -n) <(gofmt -d .) + - go test -v ./... + +after_success: + - go get -u -d github.com/spf13/hugo + - cd $GOPATH/src/github.com/spf13/hugo && make && ./hugo -s docs && cd - + +sudo: false diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/viper/LICENSE b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/viper/LICENSE new file mode 100644 index 00000000..4527efb9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/viper/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Steve Francia + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/viper/README.md b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/viper/README.md new file mode 100644 index 00000000..87bbc8b4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/viper/README.md @@ -0,0 +1,686 @@ +![viper logo](https://cloud.githubusercontent.com/assets/173412/10886745/998df88a-8151-11e5-9448-4736db51020d.png) + +Go configuration with fangs! + +Many Go projects are built using Viper including: + +* [Hugo](http://gohugo.io) +* [EMC RexRay](http://rexray.readthedocs.org/en/stable/) +* [Imgur’s Incus](https://github.com/Imgur/incus) +* [Nanobox](https://github.com/nanobox-io/nanobox)/[Nanopack](https://github.com/nanopack) +* [Docker Notary](https://github.com/docker/Notary) +* [BloomApi](https://www.bloomapi.com/) +* [doctl](https://github.com/digitalocean/doctl) +* [Clairctl](https://github.com/jgsqware/clairctl) + +[![Build Status](https://travis-ci.org/spf13/viper.svg)](https://travis-ci.org/spf13/viper) [![Join the chat at https://gitter.im/spf13/viper](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/spf13/viper?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![GoDoc](https://godoc.org/github.com/spf13/viper?status.svg)](https://godoc.org/github.com/spf13/viper) + + +## What is Viper? + +Viper is a complete configuration solution for Go applications including 12-Factor apps. It is designed +to work within an application, and can handle all types of configuration needs +and formats. It supports: + +* setting defaults +* reading from JSON, TOML, YAML, HCL, and Java properties config files +* live watching and re-reading of config files (optional) +* reading from environment variables +* reading from remote config systems (etcd or Consul), and watching changes +* reading from command line flags +* reading from buffer +* setting explicit values + +Viper can be thought of as a registry for all of your applications +configuration needs. + +## Why Viper? + +When building a modern application, you don’t want to worry about +configuration file formats; you want to focus on building awesome software. +Viper is here to help with that. + +Viper does the following for you: + +1. Find, load, and unmarshal a configuration file in JSON, TOML, YAML, HCL, or Java properties formats. +2. Provide a mechanism to set default values for your different + configuration options. +3. Provide a mechanism to set override values for options specified through + command line flags. +4. Provide an alias system to easily rename parameters without breaking existing + code. +5. Make it easy to tell the difference between when a user has provided a + command line or config file which is the same as the default. + +Viper uses the following precedence order. Each item takes precedence over the +item below it: + + * explicit call to Set + * flag + * env + * config + * key/value store + * default + +Viper configuration keys are case insensitive. + +## Putting Values into Viper + +### Establishing Defaults + +A good configuration system will support default values. A default value is not +required for a key, but it’s useful in the event that a key hasn’t been set via +config file, environment variable, remote configuration or flag. + +Examples: + +```go +viper.SetDefault("ContentDir", "content") +viper.SetDefault("LayoutDir", "layouts") +viper.SetDefault("Taxonomies", map[string]string{"tag": "tags", "category": "categories"}) +``` + +### Reading Config Files + +Viper requires minimal configuration so it knows where to look for config files. +Viper supports JSON, TOML, YAML, HCL, and Java Properties files. Viper can search multiple paths, but +currently a single Viper instance only supports a single configuration file. +Viper does not default to any configuration search paths leaving defaults decision +to an application. + +Here is an example of how to use Viper to search for and read a configuration file. +None of the specific paths are required, but at least one path should be provided +where a configuration file is expected. + +```go +viper.SetConfigName("config") // name of config file (without extension) +viper.AddConfigPath("/etc/appname/") // path to look for the config file in +viper.AddConfigPath("$HOME/.appname") // call multiple times to add many search paths +viper.AddConfigPath(".") // optionally look for config in the working directory +err := viper.ReadInConfig() // Find and read the config file +if err != nil { // Handle errors reading the config file + panic(fmt.Errorf("Fatal error config file: %s \n", err)) +} +``` + +### Watching and re-reading config files + +Viper supports the ability to have your application live read a config file while running. + +Gone are the days of needing to restart a server to have a config take effect, +viper powered applications can read an update to a config file while running and +not miss a beat. + +Simply tell the viper instance to watchConfig. +Optionally you can provide a function for Viper to run each time a change occurs. + +**Make sure you add all of the configPaths prior to calling `WatchConfig()`** + +```go +viper.WatchConfig() +viper.OnConfigChange(func(e fsnotify.Event) { + fmt.Println("Config file changed:", e.Name) +}) +``` + +### Reading Config from io.Reader + +Viper predefines many configuration sources such as files, environment +variables, flags, and remote K/V store, but you are not bound to them. You can +also implement your own required configuration source and feed it to viper. + +```go +viper.SetConfigType("yaml") // or viper.SetConfigType("YAML") + +// any approach to require this configuration into your program. +var yamlExample = []byte(` +Hacker: true +name: steve +hobbies: +- skateboarding +- snowboarding +- go +clothing: + jacket: leather + trousers: denim +age: 35 +eyes : brown +beard: true +`) + +viper.ReadConfig(bytes.NewBuffer(yamlExample)) + +viper.Get("name") // this would be "steve" +``` + +### Setting Overrides + +These could be from a command line flag, or from your own application logic. + +```go +viper.Set("Verbose", true) +viper.Set("LogFile", LogFile) +``` + +### Registering and Using Aliases + +Aliases permit a single value to be referenced by multiple keys + +```go +viper.RegisterAlias("loud", "Verbose") + +viper.Set("verbose", true) // same result as next line +viper.Set("loud", true) // same result as prior line + +viper.GetBool("loud") // true +viper.GetBool("verbose") // true +``` + +### Working with Environment Variables + +Viper has full support for environment variables. This enables 12 factor +applications out of the box. There are four methods that exist to aid working +with ENV: + + * `AutomaticEnv()` + * `BindEnv(string...) : error` + * `SetEnvPrefix(string)` + * `SetEnvKeyReplacer(string...) *strings.Replacer` + +_When working with ENV variables, it’s important to recognize that Viper +treats ENV variables as case sensitive._ + +Viper provides a mechanism to try to ensure that ENV variables are unique. By +using `SetEnvPrefix`, you can tell Viper to use a prefix while reading from +the environment variables. Both `BindEnv` and `AutomaticEnv` will use this +prefix. + +`BindEnv` takes one or two parameters. The first parameter is the key name, the +second is the name of the environment variable. The name of the environment +variable is case sensitive. If the ENV variable name is not provided, then +Viper will automatically assume that the key name matches the ENV variable name, +but the ENV variable is IN ALL CAPS. When you explicitly provide the ENV +variable name, it **does not** automatically add the prefix. + +One important thing to recognize when working with ENV variables is that the +value will be read each time it is accessed. Viper does not fix the value when +the `BindEnv` is called. + +`AutomaticEnv` is a powerful helper especially when combined with +`SetEnvPrefix`. When called, Viper will check for an environment variable any +time a `viper.Get` request is made. It will apply the following rules. It will +check for a environment variable with a name matching the key uppercased and +prefixed with the `EnvPrefix` if set. + +`SetEnvKeyReplacer` allows you to use a `strings.Replacer` object to rewrite Env +keys to an extent. This is useful if you want to use `-` or something in your +`Get()` calls, but want your environmental variables to use `_` delimiters. An +example of using it can be found in `viper_test.go`. + +#### Env example + +```go +SetEnvPrefix("spf") // will be uppercased automatically +BindEnv("id") + +os.Setenv("SPF_ID", "13") // typically done outside of the app + +id := Get("id") // 13 +``` + +### Working with Flags + +Viper has the ability to bind to flags. Specifically, Viper supports `Pflags` +as used in the [Cobra](https://github.com/spf13/cobra) library. + +Like `BindEnv`, the value is not set when the binding method is called, but when +it is accessed. This means you can bind as early as you want, even in an +`init()` function. + +For individual flags, the `BindPFlag()` method provides this functionality. + +Example: + +```go +serverCmd.Flags().Int("port", 1138, "Port to run Application server on") +viper.BindPFlag("port", serverCmd.Flags().Lookup("port")) +``` + +You can also bind an existing set of pflags (pflag.FlagSet): + +Example: + +```go +pflag.Int("flagname", 1234, "help message for flagname") + +pflag.Parse() +viper.BindPFlags(pflag.CommandLine) + +i := viper.GetInt("flagname") // retrieve values from viper instead of pflag +``` + +The use of [pflag](https://github.com/spf13/pflag/) in Viper does not preclude +the use of other packages that use the [flag](https://golang.org/pkg/flag/) +package from the standard library. The pflag package can handle the flags +defined for the flag package by importing these flags. This is accomplished +by a calling a convenience function provided by the pflag package called +AddGoFlagSet(). + +Example: + +```go +package main + +import ( + "flag" + "github.com/spf13/pflag" +) + +func main() { + + // using standard library "flag" package + flag.Int("flagname", 1234, "help message for flagname") + + pflag.CommandLine.AddGoFlagSet(flag.CommandLine) + pflag.Parse() + viper.BindPFlags(pflag.CommandLine) + + i := viper.GetInt("flagname") // retrieve value from viper + + ... +} +``` + +#### Flag interfaces + +Viper provides two Go interfaces to bind other flag systems if you don’t use `Pflags`. + +`FlagValue` represents a single flag. This is a very simple example on how to implement this interface: + +```go +type myFlag struct {} +func (f myFlag) HasChanged() bool { return false } +func (f myFlag) Name() string { return "my-flag-name" } +func (f myFlag) ValueString() string { return "my-flag-value" } +func (f myFlag) ValueType() string { return "string" } +``` + +Once your flag implements this interface, you can simply tell Viper to bind it: + +```go +viper.BindFlagValue("my-flag-name", myFlag{}) +``` + +`FlagValueSet` represents a group of flags. This is a very simple example on how to implement this interface: + +```go +type myFlagSet struct { + flags []myFlag +} + +func (f myFlagSet) VisitAll(fn func(FlagValue)) { + for _, flag := range flags { + fn(flag) + } +} +``` + +Once your flag set implements this interface, you can simply tell Viper to bind it: + +```go +fSet := myFlagSet{ + flags: []myFlag{myFlag{}, myFlag{}}, +} +viper.BindFlagValues("my-flags", fSet) +``` + +### Remote Key/Value Store Support + +To enable remote support in Viper, do a blank import of the `viper/remote` +package: + +`import _ "github.com/spf13/viper/remote"` + +Viper will read a config string (as JSON, TOML, YAML or HCL) retrieved from a path +in a Key/Value store such as etcd or Consul. These values take precedence over +default values, but are overridden by configuration values retrieved from disk, +flags, or environment variables. + +Viper uses [crypt](https://github.com/xordataexchange/crypt) to retrieve +configuration from the K/V store, which means that you can store your +configuration values encrypted and have them automatically decrypted if you have +the correct gpg keyring. Encryption is optional. + +You can use remote configuration in conjunction with local configuration, or +independently of it. + +`crypt` has a command-line helper that you can use to put configurations in your +K/V store. `crypt` defaults to etcd on http://127.0.0.1:4001. + +```bash +$ go get github.com/xordataexchange/crypt/bin/crypt +$ crypt set -plaintext /config/hugo.json /Users/hugo/settings/config.json +``` + +Confirm that your value was set: + +```bash +$ crypt get -plaintext /config/hugo.json +``` + +See the `crypt` documentation for examples of how to set encrypted values, or +how to use Consul. + +### Remote Key/Value Store Example - Unencrypted + +#### etcd +```go +viper.AddRemoteProvider("etcd", "http://127.0.0.1:4001","/config/hugo.json") +viper.SetConfigType("json") // because there is no file extension in a stream of bytes, supported extensions are "json", "toml", "yaml", "yml", "properties", "props", "prop" +err := viper.ReadRemoteConfig() +``` + +#### Consul +You need to set a key to Consul key/value storage with JSON value containing your desired config. +For example, create a Consul key/value store key `MY_CONSUL_KEY` with value: + +```json +{ + "port": 8080, + "hostname": "myhostname.com" +} +``` + +```go +viper.AddRemoteProvider("consul", "localhost:8500", "MY_CONSUL_KEY") +viper.SetConfigType("json") // Need to explicitly set this to json +err := viper.ReadRemoteConfig() + +fmt.Println(viper.Get("port")) // 8080 +fmt.Println(viper.Get("hostname")) // myhostname.com +``` + +### Remote Key/Value Store Example - Encrypted + +```go +viper.AddSecureRemoteProvider("etcd","http://127.0.0.1:4001","/config/hugo.json","/etc/secrets/mykeyring.gpg") +viper.SetConfigType("json") // because there is no file extension in a stream of bytes, supported extensions are "json", "toml", "yaml", "yml", "properties", "props", "prop" +err := viper.ReadRemoteConfig() +``` + +### Watching Changes in etcd - Unencrypted + +```go +// alternatively, you can create a new viper instance. +var runtime_viper = viper.New() + +runtime_viper.AddRemoteProvider("etcd", "http://127.0.0.1:4001", "/config/hugo.yml") +runtime_viper.SetConfigType("yaml") // because there is no file extension in a stream of bytes, supported extensions are "json", "toml", "yaml", "yml", "properties", "props", "prop" + +// read from remote config the first time. +err := runtime_viper.ReadRemoteConfig() + +// unmarshal config +runtime_viper.Unmarshal(&runtime_conf) + +// open a goroutine to watch remote changes forever +go func(){ + for { + time.Sleep(time.Second * 5) // delay after each request + + // currently, only tested with etcd support + err := runtime_viper.WatchRemoteConfig() + if err != nil { + log.Errorf("unable to read remote config: %v", err) + continue + } + + // unmarshal new config into our runtime config struct. you can also use channel + // to implement a signal to notify the system of the changes + runtime_viper.Unmarshal(&runtime_conf) + } +}() +``` + +## Getting Values From Viper + +In Viper, there are a few ways to get a value depending on the value’s type. +The following functions and methods exist: + + * `Get(key string) : interface{}` + * `GetBool(key string) : bool` + * `GetFloat64(key string) : float64` + * `GetInt(key string) : int` + * `GetString(key string) : string` + * `GetStringMap(key string) : map[string]interface{}` + * `GetStringMapString(key string) : map[string]string` + * `GetStringSlice(key string) : []string` + * `GetTime(key string) : time.Time` + * `GetDuration(key string) : time.Duration` + * `IsSet(key string) : bool` + * `AllSettings() : map[string]interface{}` + +One important thing to recognize is that each Get function will return a zero +value if it’s not found. To check if a given key exists, the `IsSet()` method +has been provided. + +Example: +```go +viper.GetString("logfile") // case-insensitive Setting & Getting +if viper.GetBool("verbose") { + fmt.Println("verbose enabled") +} +``` +### Accessing nested keys + +The accessor methods also accept formatted paths to deeply nested keys. For +example, if the following JSON file is loaded: + +```json +{ + "host": { + "address": "localhost", + "port": 5799 + }, + "datastore": { + "metric": { + "host": "127.0.0.1", + "port": 3099 + }, + "warehouse": { + "host": "198.0.0.1", + "port": 2112 + } + } +} + +``` + +Viper can access a nested field by passing a `.` delimited path of keys: + +```go +GetString("datastore.metric.host") // (returns "127.0.0.1") +``` + +This obeys the precedence rules established above; the search for the path +will cascade through the remaining configuration registries until found. + +For example, given this configuration file, both `datastore.metric.host` and +`datastore.metric.port` are already defined (and may be overridden). If in addition +`datastore.metric.protocol` was defined in the defaults, Viper would also find it. + +However, if `datastore.metric` was overridden (by a flag, an environment variable, +the `Set()` method, …) with an immediate value, then all sub-keys of +`datastore.metric` become undefined, they are “shadowed†by the higher-priority +configuration level. + +Lastly, if there exists a key that matches the delimited key path, its value +will be returned instead. E.g. + +```json +{ + "datastore.metric.host": "0.0.0.0", + "host": { + "address": "localhost", + "port": 5799 + }, + "datastore": { + "metric": { + "host": "127.0.0.1", + "port": 3099 + }, + "warehouse": { + "host": "198.0.0.1", + "port": 2112 + } + } +} + +GetString("datastore.metric.host") // returns "0.0.0.0" +``` + +### Extract sub-tree + +Extract sub-tree from Viper. + +For example, `viper` represents: + +```json +app: + cache1: + max-items: 100 + item-size: 64 + cache2: + max-items: 200 + item-size: 80 +``` + +After executing: + +```go +subv := viper.Sub("app.cache1") +``` + +`subv` represents: + +```json +max-items: 100 +item-size: 64 +``` + +Suppose we have: + +```go +func NewCache(cfg *Viper) *Cache {...} +``` + +which creates a cache based on config information formatted as `subv`. +Now it’s easy to create these 2 caches separately as: + +```go +cfg1 := viper.Sub("app.cache1") +cache1 := NewCache(cfg1) + +cfg2 := viper.Sub("app.cache2") +cache2 := NewCache(cfg2) +``` + +### Unmarshaling + +You also have the option of Unmarshaling all or a specific value to a struct, map, +etc. + +There are two methods to do this: + + * `Unmarshal(rawVal interface{}) : error` + * `UnmarshalKey(key string, rawVal interface{}) : error` + +Example: + +```go +type config struct { + Port int + Name string + PathMap string `mapstructure:"path_map"` +} + +var C config + +err := Unmarshal(&C) +if err != nil { + t.Fatalf("unable to decode into struct, %v", err) +} +``` + +### Marshalling to string + +You may need to marhsal all the settings held in viper into a string rather than write them to a file. +You can use your favorite format's marshaller with the config returned by `AllSettings()`. + +```go +import ( + yaml "gopkg.in/yaml.v2" + // ... +) + +func yamlStringSettings() string { + c := viper.AllSettings() + bs, err := yaml.Marshal(c) + if err != nil { + t.Fatalf("unable to marshal config to YAML: %v", err) + } + return string(bs) +} +``` + +## Viper or Vipers? + +Viper comes ready to use out of the box. There is no configuration or +initialization needed to begin using Viper. Since most applications will want +to use a single central repository for their configuration, the viper package +provides this. It is similar to a singleton. + +In all of the examples above, they demonstrate using viper in its singleton +style approach. + +### Working with multiple vipers + +You can also create many different vipers for use in your application. Each will +have its own unique set of configurations and values. Each can read from a +different config file, key value store, etc. All of the functions that viper +package supports are mirrored as methods on a viper. + +Example: + +```go +x := viper.New() +y := viper.New() + +x.SetDefault("ContentDir", "content") +y.SetDefault("ContentDir", "foobar") + +//... +``` + +When working with multiple vipers, it is up to the user to keep track of the +different vipers. + +## Q & A + +Q: Why not INI files? + +A: Ini files are pretty awful. There’s no standard format, and they are hard to +validate. Viper is designed to work with JSON, TOML or YAML files. If someone +really wants to add this feature, I’d be happy to merge it. It’s easy to specify +which formats your application will permit. + +Q: Why is it called “Viperâ€? + +A: Viper is designed to be a [companion](http://en.wikipedia.org/wiki/Viper_(G.I._Joe)) +to [Cobra](https://github.com/spf13/cobra). While both can operate completely +independently, together they make a powerful pair to handle much of your +application foundation needs. + +Q: Why is it called “Cobraâ€? + +A: Is there a better name for a [commander](http://en.wikipedia.org/wiki/Cobra_Commander)? diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/viper/flags.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/viper/flags.go new file mode 100644 index 00000000..dd32f4e1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/viper/flags.go @@ -0,0 +1,57 @@ +package viper + +import "github.com/spf13/pflag" + +// FlagValueSet is an interface that users can implement +// to bind a set of flags to viper. +type FlagValueSet interface { + VisitAll(fn func(FlagValue)) +} + +// FlagValue is an interface that users can implement +// to bind different flags to viper. +type FlagValue interface { + HasChanged() bool + Name() string + ValueString() string + ValueType() string +} + +// pflagValueSet is a wrapper around *pflag.ValueSet +// that implements FlagValueSet. +type pflagValueSet struct { + flags *pflag.FlagSet +} + +// VisitAll iterates over all *pflag.Flag inside the *pflag.FlagSet. +func (p pflagValueSet) VisitAll(fn func(flag FlagValue)) { + p.flags.VisitAll(func(flag *pflag.Flag) { + fn(pflagValue{flag}) + }) +} + +// pflagValue is a wrapper aroung *pflag.flag +// that implements FlagValue +type pflagValue struct { + flag *pflag.Flag +} + +// HasChanges returns whether the flag has changes or not. +func (p pflagValue) HasChanged() bool { + return p.flag.Changed +} + +// Name returns the name of the flag. +func (p pflagValue) Name() string { + return p.flag.Name +} + +// ValueString returns the value of the flag as a string. +func (p pflagValue) ValueString() string { + return p.flag.Value.String() +} + +// ValueType returns the type of the flag as a string. +func (p pflagValue) ValueType() string { + return p.flag.Value.Type() +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/viper/go.mod b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/viper/go.mod new file mode 100644 index 00000000..3f4e1c22 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/viper/go.mod @@ -0,0 +1,16 @@ +module github.com/spf13/viper + +require ( + github.com/fsnotify/fsnotify v1.4.7 + github.com/hashicorp/hcl v1.0.0 + github.com/magiconair/properties v1.8.0 + github.com/mitchellh/mapstructure v1.0.0 + github.com/pelletier/go-toml v1.2.0 + github.com/spf13/afero v1.1.2 + github.com/spf13/cast v1.2.0 + github.com/spf13/jwalterweatherman v1.0.0 + github.com/spf13/pflag v1.0.2 + golang.org/x/sys v0.0.0-20180906133057-8cf3aee42992 // indirect + golang.org/x/text v0.3.0 // indirect + gopkg.in/yaml.v2 v2.2.1 +) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/viper/go.sum b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/viper/go.sum new file mode 100644 index 00000000..3e3b874b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/viper/go.sum @@ -0,0 +1,26 @@ +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mitchellh/mapstructure v1.0.0 h1:vVpGvMXJPqSDh2VYHF7gsfQj8Ncx+Xw5Y1KHeTRY+7I= +github.com/mitchellh/mapstructure v1.0.0/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/cast v1.2.0 h1:HHl1DSRbEQN2i8tJmtS6ViPyHx35+p51amrdsiTCrkg= +github.com/spf13/cast v1.2.0/go.mod h1:r2rcYCSwa1IExKTDiTfzaxqT2FNHs8hODu4LnUfgKEg= +github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v1.0.2 h1:Fy0orTDgHdbnzHcsOgfCN4LtHf0ec3wwtiwJqwvf3Gc= +github.com/spf13/pflag v1.0.2/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +golang.org/x/sys v0.0.0-20180906133057-8cf3aee42992 h1:BH3eQWeGbwRU2+wxxuuPOdFBmaiBH81O8BugSjHeTFg= +golang.org/x/sys v0.0.0-20180906133057-8cf3aee42992/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/viper/util.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/viper/util.go new file mode 100644 index 00000000..952cad44 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/viper/util.go @@ -0,0 +1,221 @@ +// Copyright © 2014 Steve Francia . +// +// Use of this source code is governed by an MIT-style +// license that can be found in the LICENSE file. + +// Viper is a application configuration system. +// It believes that applications can be configured a variety of ways +// via flags, ENVIRONMENT variables, configuration files retrieved +// from the file system, or a remote key/value store. + +package viper + +import ( + "fmt" + "os" + "path/filepath" + "runtime" + "strings" + "unicode" + + "github.com/spf13/afero" + "github.com/spf13/cast" + jww "github.com/spf13/jwalterweatherman" +) + +// ConfigParseError denotes failing to parse configuration file. +type ConfigParseError struct { + err error +} + +// Error returns the formatted configuration error. +func (pe ConfigParseError) Error() string { + return fmt.Sprintf("While parsing config: %s", pe.err.Error()) +} + +// toCaseInsensitiveValue checks if the value is a map; +// if so, create a copy and lower-case the keys recursively. +func toCaseInsensitiveValue(value interface{}) interface{} { + switch v := value.(type) { + case map[interface{}]interface{}: + value = copyAndInsensitiviseMap(cast.ToStringMap(v)) + case map[string]interface{}: + value = copyAndInsensitiviseMap(v) + } + + return value +} + +// copyAndInsensitiviseMap behaves like insensitiviseMap, but creates a copy of +// any map it makes case insensitive. +func copyAndInsensitiviseMap(m map[string]interface{}) map[string]interface{} { + nm := make(map[string]interface{}) + + for key, val := range m { + lkey := strings.ToLower(key) + switch v := val.(type) { + case map[interface{}]interface{}: + nm[lkey] = copyAndInsensitiviseMap(cast.ToStringMap(v)) + case map[string]interface{}: + nm[lkey] = copyAndInsensitiviseMap(v) + default: + nm[lkey] = v + } + } + + return nm +} + +func insensitiviseMap(m map[string]interface{}) { + for key, val := range m { + switch val.(type) { + case map[interface{}]interface{}: + // nested map: cast and recursively insensitivise + val = cast.ToStringMap(val) + insensitiviseMap(val.(map[string]interface{})) + case map[string]interface{}: + // nested map: recursively insensitivise + insensitiviseMap(val.(map[string]interface{})) + } + + lower := strings.ToLower(key) + if key != lower { + // remove old key (not lower-cased) + delete(m, key) + } + // update map + m[lower] = val + } +} + +func absPathify(inPath string) string { + jww.INFO.Println("Trying to resolve absolute path to", inPath) + + if strings.HasPrefix(inPath, "$HOME") { + inPath = userHomeDir() + inPath[5:] + } + + if strings.HasPrefix(inPath, "$") { + end := strings.Index(inPath, string(os.PathSeparator)) + inPath = os.Getenv(inPath[1:end]) + inPath[end:] + } + + if filepath.IsAbs(inPath) { + return filepath.Clean(inPath) + } + + p, err := filepath.Abs(inPath) + if err == nil { + return filepath.Clean(p) + } + + jww.ERROR.Println("Couldn't discover absolute path") + jww.ERROR.Println(err) + return "" +} + +// Check if File / Directory Exists +func exists(fs afero.Fs, path string) (bool, error) { + _, err := fs.Stat(path) + if err == nil { + return true, nil + } + if os.IsNotExist(err) { + return false, nil + } + return false, err +} + +func stringInSlice(a string, list []string) bool { + for _, b := range list { + if b == a { + return true + } + } + return false +} + +func userHomeDir() string { + if runtime.GOOS == "windows" { + home := os.Getenv("HOMEDRIVE") + os.Getenv("HOMEPATH") + if home == "" { + home = os.Getenv("USERPROFILE") + } + return home + } + return os.Getenv("HOME") +} + +func safeMul(a, b uint) uint { + c := a * b + if a > 1 && b > 1 && c/b != a { + return 0 + } + return c +} + +// parseSizeInBytes converts strings like 1GB or 12 mb into an unsigned integer number of bytes +func parseSizeInBytes(sizeStr string) uint { + sizeStr = strings.TrimSpace(sizeStr) + lastChar := len(sizeStr) - 1 + multiplier := uint(1) + + if lastChar > 0 { + if sizeStr[lastChar] == 'b' || sizeStr[lastChar] == 'B' { + if lastChar > 1 { + switch unicode.ToLower(rune(sizeStr[lastChar-1])) { + case 'k': + multiplier = 1 << 10 + sizeStr = strings.TrimSpace(sizeStr[:lastChar-1]) + case 'm': + multiplier = 1 << 20 + sizeStr = strings.TrimSpace(sizeStr[:lastChar-1]) + case 'g': + multiplier = 1 << 30 + sizeStr = strings.TrimSpace(sizeStr[:lastChar-1]) + default: + multiplier = 1 + sizeStr = strings.TrimSpace(sizeStr[:lastChar]) + } + } + } + } + + size := cast.ToInt(sizeStr) + if size < 0 { + size = 0 + } + + return safeMul(uint(size), multiplier) +} + +// deepSearch scans deep maps, following the key indexes listed in the +// sequence "path". +// The last value is expected to be another map, and is returned. +// +// In case intermediate keys do not exist, or map to a non-map value, +// a new map is created and inserted, and the search continues from there: +// the initial map "m" may be modified! +func deepSearch(m map[string]interface{}, path []string) map[string]interface{} { + for _, k := range path { + m2, ok := m[k] + if !ok { + // intermediate key does not exist + // => create it and continue from there + m3 := make(map[string]interface{}) + m[k] = m3 + m = m3 + continue + } + m3, ok := m2.(map[string]interface{}) + if !ok { + // intermediate key is a value + // => replace with a new map + m3 = make(map[string]interface{}) + m[k] = m3 + } + // continue search from here + m = m3 + } + return m +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/viper/viper.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/viper/viper.go new file mode 100644 index 00000000..3debcdec --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/spf13/viper/viper.go @@ -0,0 +1,1806 @@ +// Copyright © 2014 Steve Francia . +// +// Use of this source code is governed by an MIT-style +// license that can be found in the LICENSE file. + +// Viper is a application configuration system. +// It believes that applications can be configured a variety of ways +// via flags, ENVIRONMENT variables, configuration files retrieved +// from the file system, or a remote key/value store. + +// Each item takes precedence over the item below it: + +// overrides +// flag +// env +// config +// key/value store +// default + +package viper + +import ( + "bytes" + "encoding/csv" + "encoding/json" + "fmt" + "io" + "log" + "os" + "path/filepath" + "reflect" + "strings" + "time" + + yaml "gopkg.in/yaml.v2" + + "github.com/fsnotify/fsnotify" + "github.com/hashicorp/hcl" + "github.com/hashicorp/hcl/hcl/printer" + "github.com/magiconair/properties" + "github.com/mitchellh/mapstructure" + toml "github.com/pelletier/go-toml" + "github.com/spf13/afero" + "github.com/spf13/cast" + jww "github.com/spf13/jwalterweatherman" + "github.com/spf13/pflag" +) + +// ConfigMarshalError happens when failing to marshal the configuration. +type ConfigMarshalError struct { + err error +} + +// Error returns the formatted configuration error. +func (e ConfigMarshalError) Error() string { + return fmt.Sprintf("While marshaling config: %s", e.err.Error()) +} + +var v *Viper + +type RemoteResponse struct { + Value []byte + Error error +} + +func init() { + v = New() +} + +type remoteConfigFactory interface { + Get(rp RemoteProvider) (io.Reader, error) + Watch(rp RemoteProvider) (io.Reader, error) + WatchChannel(rp RemoteProvider) (<-chan *RemoteResponse, chan bool) +} + +// RemoteConfig is optional, see the remote package +var RemoteConfig remoteConfigFactory + +// UnsupportedConfigError denotes encountering an unsupported +// configuration filetype. +type UnsupportedConfigError string + +// Error returns the formatted configuration error. +func (str UnsupportedConfigError) Error() string { + return fmt.Sprintf("Unsupported Config Type %q", string(str)) +} + +// UnsupportedRemoteProviderError denotes encountering an unsupported remote +// provider. Currently only etcd and Consul are supported. +type UnsupportedRemoteProviderError string + +// Error returns the formatted remote provider error. +func (str UnsupportedRemoteProviderError) Error() string { + return fmt.Sprintf("Unsupported Remote Provider Type %q", string(str)) +} + +// RemoteConfigError denotes encountering an error while trying to +// pull the configuration from the remote provider. +type RemoteConfigError string + +// Error returns the formatted remote provider error +func (rce RemoteConfigError) Error() string { + return fmt.Sprintf("Remote Configurations Error: %s", string(rce)) +} + +// ConfigFileNotFoundError denotes failing to find configuration file. +type ConfigFileNotFoundError struct { + name, locations string +} + +// Error returns the formatted configuration error. +func (fnfe ConfigFileNotFoundError) Error() string { + return fmt.Sprintf("Config File %q Not Found in %q", fnfe.name, fnfe.locations) +} + +// A DecoderConfigOption can be passed to viper.Unmarshal to configure +// mapstructure.DecoderConfig options +type DecoderConfigOption func(*mapstructure.DecoderConfig) + +// DecodeHook returns a DecoderConfigOption which overrides the default +// DecoderConfig.DecodeHook value, the default is: +// +// mapstructure.ComposeDecodeHookFunc( +// mapstructure.StringToTimeDurationHookFunc(), +// mapstructure.StringToSliceHookFunc(","), +// ) +func DecodeHook(hook mapstructure.DecodeHookFunc) DecoderConfigOption { + return func(c *mapstructure.DecoderConfig) { + c.DecodeHook = hook + } +} + +// Viper is a prioritized configuration registry. It +// maintains a set of configuration sources, fetches +// values to populate those, and provides them according +// to the source's priority. +// The priority of the sources is the following: +// 1. overrides +// 2. flags +// 3. env. variables +// 4. config file +// 5. key/value store +// 6. defaults +// +// For example, if values from the following sources were loaded: +// +// Defaults : { +// "secret": "", +// "user": "default", +// "endpoint": "https://localhost" +// } +// Config : { +// "user": "root" +// "secret": "defaultsecret" +// } +// Env : { +// "secret": "somesecretkey" +// } +// +// The resulting config will have the following values: +// +// { +// "secret": "somesecretkey", +// "user": "root", +// "endpoint": "https://localhost" +// } +type Viper struct { + // Delimiter that separates a list of keys + // used to access a nested value in one go + keyDelim string + + // A set of paths to look for the config file in + configPaths []string + + // The filesystem to read config from. + fs afero.Fs + + // A set of remote providers to search for the configuration + remoteProviders []*defaultRemoteProvider + + // Name of file to look for inside the path + configName string + configFile string + configType string + envPrefix string + + automaticEnvApplied bool + envKeyReplacer *strings.Replacer + + config map[string]interface{} + override map[string]interface{} + defaults map[string]interface{} + kvstore map[string]interface{} + pflags map[string]FlagValue + env map[string]string + aliases map[string]string + typeByDefValue bool + + // Store read properties on the object so that we can write back in order with comments. + // This will only be used if the configuration read is a properties file. + properties *properties.Properties + + onConfigChange func(fsnotify.Event) +} + +// New returns an initialized Viper instance. +func New() *Viper { + v := new(Viper) + v.keyDelim = "." + v.configName = "config" + v.fs = afero.NewOsFs() + v.config = make(map[string]interface{}) + v.override = make(map[string]interface{}) + v.defaults = make(map[string]interface{}) + v.kvstore = make(map[string]interface{}) + v.pflags = make(map[string]FlagValue) + v.env = make(map[string]string) + v.aliases = make(map[string]string) + v.typeByDefValue = false + + return v +} + +// Intended for testing, will reset all to default settings. +// In the public interface for the viper package so applications +// can use it in their testing as well. +func Reset() { + v = New() + SupportedExts = []string{"json", "toml", "yaml", "yml", "properties", "props", "prop", "hcl"} + SupportedRemoteProviders = []string{"etcd", "consul"} +} + +type defaultRemoteProvider struct { + provider string + endpoint string + path string + secretKeyring string +} + +func (rp defaultRemoteProvider) Provider() string { + return rp.provider +} + +func (rp defaultRemoteProvider) Endpoint() string { + return rp.endpoint +} + +func (rp defaultRemoteProvider) Path() string { + return rp.path +} + +func (rp defaultRemoteProvider) SecretKeyring() string { + return rp.secretKeyring +} + +// RemoteProvider stores the configuration necessary +// to connect to a remote key/value store. +// Optional secretKeyring to unencrypt encrypted values +// can be provided. +type RemoteProvider interface { + Provider() string + Endpoint() string + Path() string + SecretKeyring() string +} + +// SupportedExts are universally supported extensions. +var SupportedExts = []string{"json", "toml", "yaml", "yml", "properties", "props", "prop", "hcl"} + +// SupportedRemoteProviders are universally supported remote providers. +var SupportedRemoteProviders = []string{"etcd", "consul"} + +func OnConfigChange(run func(in fsnotify.Event)) { v.OnConfigChange(run) } +func (v *Viper) OnConfigChange(run func(in fsnotify.Event)) { + v.onConfigChange = run +} + +func WatchConfig() { v.WatchConfig() } +func (v *Viper) WatchConfig() { + go func() { + watcher, err := fsnotify.NewWatcher() + if err != nil { + log.Fatal(err) + } + defer watcher.Close() + + // we have to watch the entire directory to pick up renames/atomic saves in a cross-platform way + filename, err := v.getConfigFile() + if err != nil { + log.Println("error:", err) + return + } + + configFile := filepath.Clean(filename) + configDir, _ := filepath.Split(configFile) + + done := make(chan bool) + go func() { + for { + select { + case event := <-watcher.Events: + // we only care about the config file + if filepath.Clean(event.Name) == configFile { + if event.Op&fsnotify.Write == fsnotify.Write || event.Op&fsnotify.Create == fsnotify.Create { + err := v.ReadInConfig() + if err != nil { + log.Println("error:", err) + } + if v.onConfigChange != nil { + v.onConfigChange(event) + } + } + } + case err := <-watcher.Errors: + log.Println("error:", err) + } + } + }() + + watcher.Add(configDir) + <-done + }() +} + +// SetConfigFile explicitly defines the path, name and extension of the config file. +// Viper will use this and not check any of the config paths. +func SetConfigFile(in string) { v.SetConfigFile(in) } +func (v *Viper) SetConfigFile(in string) { + if in != "" { + v.configFile = in + } +} + +// SetEnvPrefix defines a prefix that ENVIRONMENT variables will use. +// E.g. if your prefix is "spf", the env registry will look for env +// variables that start with "SPF_". +func SetEnvPrefix(in string) { v.SetEnvPrefix(in) } +func (v *Viper) SetEnvPrefix(in string) { + if in != "" { + v.envPrefix = in + } +} + +func (v *Viper) mergeWithEnvPrefix(in string) string { + if v.envPrefix != "" { + return strings.ToUpper(v.envPrefix + "_" + in) + } + + return strings.ToUpper(in) +} + +// TODO: should getEnv logic be moved into find(). Can generalize the use of +// rewriting keys many things, Ex: Get('someKey') -> some_key +// (camel case to snake case for JSON keys perhaps) + +// getEnv is a wrapper around os.Getenv which replaces characters in the original +// key. This allows env vars which have different keys than the config object +// keys. +func (v *Viper) getEnv(key string) string { + if v.envKeyReplacer != nil { + key = v.envKeyReplacer.Replace(key) + } + return os.Getenv(key) +} + +// ConfigFileUsed returns the file used to populate the config registry. +func ConfigFileUsed() string { return v.ConfigFileUsed() } +func (v *Viper) ConfigFileUsed() string { return v.configFile } + +// AddConfigPath adds a path for Viper to search for the config file in. +// Can be called multiple times to define multiple search paths. +func AddConfigPath(in string) { v.AddConfigPath(in) } +func (v *Viper) AddConfigPath(in string) { + if in != "" { + absin := absPathify(in) + jww.INFO.Println("adding", absin, "to paths to search") + if !stringInSlice(absin, v.configPaths) { + v.configPaths = append(v.configPaths, absin) + } + } +} + +// AddRemoteProvider adds a remote configuration source. +// Remote Providers are searched in the order they are added. +// provider is a string value, "etcd" or "consul" are currently supported. +// endpoint is the url. etcd requires http://ip:port consul requires ip:port +// path is the path in the k/v store to retrieve configuration +// To retrieve a config file called myapp.json from /configs/myapp.json +// you should set path to /configs and set config name (SetConfigName()) to +// "myapp" +func AddRemoteProvider(provider, endpoint, path string) error { + return v.AddRemoteProvider(provider, endpoint, path) +} +func (v *Viper) AddRemoteProvider(provider, endpoint, path string) error { + if !stringInSlice(provider, SupportedRemoteProviders) { + return UnsupportedRemoteProviderError(provider) + } + if provider != "" && endpoint != "" { + jww.INFO.Printf("adding %s:%s to remote provider list", provider, endpoint) + rp := &defaultRemoteProvider{ + endpoint: endpoint, + provider: provider, + path: path, + } + if !v.providerPathExists(rp) { + v.remoteProviders = append(v.remoteProviders, rp) + } + } + return nil +} + +// AddSecureRemoteProvider adds a remote configuration source. +// Secure Remote Providers are searched in the order they are added. +// provider is a string value, "etcd" or "consul" are currently supported. +// endpoint is the url. etcd requires http://ip:port consul requires ip:port +// secretkeyring is the filepath to your openpgp secret keyring. e.g. /etc/secrets/myring.gpg +// path is the path in the k/v store to retrieve configuration +// To retrieve a config file called myapp.json from /configs/myapp.json +// you should set path to /configs and set config name (SetConfigName()) to +// "myapp" +// Secure Remote Providers are implemented with github.com/xordataexchange/crypt +func AddSecureRemoteProvider(provider, endpoint, path, secretkeyring string) error { + return v.AddSecureRemoteProvider(provider, endpoint, path, secretkeyring) +} + +func (v *Viper) AddSecureRemoteProvider(provider, endpoint, path, secretkeyring string) error { + if !stringInSlice(provider, SupportedRemoteProviders) { + return UnsupportedRemoteProviderError(provider) + } + if provider != "" && endpoint != "" { + jww.INFO.Printf("adding %s:%s to remote provider list", provider, endpoint) + rp := &defaultRemoteProvider{ + endpoint: endpoint, + provider: provider, + path: path, + secretKeyring: secretkeyring, + } + if !v.providerPathExists(rp) { + v.remoteProviders = append(v.remoteProviders, rp) + } + } + return nil +} + +func (v *Viper) providerPathExists(p *defaultRemoteProvider) bool { + for _, y := range v.remoteProviders { + if reflect.DeepEqual(y, p) { + return true + } + } + return false +} + +// searchMap recursively searches for a value for path in source map. +// Returns nil if not found. +// Note: This assumes that the path entries and map keys are lower cased. +func (v *Viper) searchMap(source map[string]interface{}, path []string) interface{} { + if len(path) == 0 { + return source + } + + next, ok := source[path[0]] + if ok { + // Fast path + if len(path) == 1 { + return next + } + + // Nested case + switch next.(type) { + case map[interface{}]interface{}: + return v.searchMap(cast.ToStringMap(next), path[1:]) + case map[string]interface{}: + // Type assertion is safe here since it is only reached + // if the type of `next` is the same as the type being asserted + return v.searchMap(next.(map[string]interface{}), path[1:]) + default: + // got a value but nested key expected, return "nil" for not found + return nil + } + } + return nil +} + +// searchMapWithPathPrefixes recursively searches for a value for path in source map. +// +// While searchMap() considers each path element as a single map key, this +// function searches for, and prioritizes, merged path elements. +// e.g., if in the source, "foo" is defined with a sub-key "bar", and "foo.bar" +// is also defined, this latter value is returned for path ["foo", "bar"]. +// +// This should be useful only at config level (other maps may not contain dots +// in their keys). +// +// Note: This assumes that the path entries and map keys are lower cased. +func (v *Viper) searchMapWithPathPrefixes(source map[string]interface{}, path []string) interface{} { + if len(path) == 0 { + return source + } + + // search for path prefixes, starting from the longest one + for i := len(path); i > 0; i-- { + prefixKey := strings.ToLower(strings.Join(path[0:i], v.keyDelim)) + + next, ok := source[prefixKey] + if ok { + // Fast path + if i == len(path) { + return next + } + + // Nested case + var val interface{} + switch next.(type) { + case map[interface{}]interface{}: + val = v.searchMapWithPathPrefixes(cast.ToStringMap(next), path[i:]) + case map[string]interface{}: + // Type assertion is safe here since it is only reached + // if the type of `next` is the same as the type being asserted + val = v.searchMapWithPathPrefixes(next.(map[string]interface{}), path[i:]) + default: + // got a value but nested key expected, do nothing and look for next prefix + } + if val != nil { + return val + } + } + } + + // not found + return nil +} + +// isPathShadowedInDeepMap makes sure the given path is not shadowed somewhere +// on its path in the map. +// e.g., if "foo.bar" has a value in the given map, it “shadows†+// "foo.bar.baz" in a lower-priority map +func (v *Viper) isPathShadowedInDeepMap(path []string, m map[string]interface{}) string { + var parentVal interface{} + for i := 1; i < len(path); i++ { + parentVal = v.searchMap(m, path[0:i]) + if parentVal == nil { + // not found, no need to add more path elements + return "" + } + switch parentVal.(type) { + case map[interface{}]interface{}: + continue + case map[string]interface{}: + continue + default: + // parentVal is a regular value which shadows "path" + return strings.Join(path[0:i], v.keyDelim) + } + } + return "" +} + +// isPathShadowedInFlatMap makes sure the given path is not shadowed somewhere +// in a sub-path of the map. +// e.g., if "foo.bar" has a value in the given map, it “shadows†+// "foo.bar.baz" in a lower-priority map +func (v *Viper) isPathShadowedInFlatMap(path []string, mi interface{}) string { + // unify input map + var m map[string]interface{} + switch mi.(type) { + case map[string]string, map[string]FlagValue: + m = cast.ToStringMap(mi) + default: + return "" + } + + // scan paths + var parentKey string + for i := 1; i < len(path); i++ { + parentKey = strings.Join(path[0:i], v.keyDelim) + if _, ok := m[parentKey]; ok { + return parentKey + } + } + return "" +} + +// isPathShadowedInAutoEnv makes sure the given path is not shadowed somewhere +// in the environment, when automatic env is on. +// e.g., if "foo.bar" has a value in the environment, it “shadows†+// "foo.bar.baz" in a lower-priority map +func (v *Viper) isPathShadowedInAutoEnv(path []string) string { + var parentKey string + var val string + for i := 1; i < len(path); i++ { + parentKey = strings.Join(path[0:i], v.keyDelim) + if val = v.getEnv(v.mergeWithEnvPrefix(parentKey)); val != "" { + return parentKey + } + } + return "" +} + +// SetTypeByDefaultValue enables or disables the inference of a key value's +// type when the Get function is used based upon a key's default value as +// opposed to the value returned based on the normal fetch logic. +// +// For example, if a key has a default value of []string{} and the same key +// is set via an environment variable to "a b c", a call to the Get function +// would return a string slice for the key if the key's type is inferred by +// the default value and the Get function would return: +// +// []string {"a", "b", "c"} +// +// Otherwise the Get function would return: +// +// "a b c" +func SetTypeByDefaultValue(enable bool) { v.SetTypeByDefaultValue(enable) } +func (v *Viper) SetTypeByDefaultValue(enable bool) { + v.typeByDefValue = enable +} + +// GetViper gets the global Viper instance. +func GetViper() *Viper { + return v +} + +// Get can retrieve any value given the key to use. +// Get is case-insensitive for a key. +// Get has the behavior of returning the value associated with the first +// place from where it is set. Viper will check in the following order: +// override, flag, env, config file, key/value store, default +// +// Get returns an interface. For a specific value use one of the Get____ methods. +func Get(key string) interface{} { return v.Get(key) } +func (v *Viper) Get(key string) interface{} { + lcaseKey := strings.ToLower(key) + val := v.find(lcaseKey) + if val == nil { + return nil + } + + if v.typeByDefValue { + // TODO(bep) this branch isn't covered by a single test. + valType := val + path := strings.Split(lcaseKey, v.keyDelim) + defVal := v.searchMap(v.defaults, path) + if defVal != nil { + valType = defVal + } + + switch valType.(type) { + case bool: + return cast.ToBool(val) + case string: + return cast.ToString(val) + case int32, int16, int8, int: + return cast.ToInt(val) + case int64: + return cast.ToInt64(val) + case float64, float32: + return cast.ToFloat64(val) + case time.Time: + return cast.ToTime(val) + case time.Duration: + return cast.ToDuration(val) + case []string: + return cast.ToStringSlice(val) + } + } + + return val +} + +// Sub returns new Viper instance representing a sub tree of this instance. +// Sub is case-insensitive for a key. +func Sub(key string) *Viper { return v.Sub(key) } +func (v *Viper) Sub(key string) *Viper { + subv := New() + data := v.Get(key) + if data == nil { + return nil + } + + if reflect.TypeOf(data).Kind() == reflect.Map { + subv.config = cast.ToStringMap(data) + return subv + } + return nil +} + +// GetString returns the value associated with the key as a string. +func GetString(key string) string { return v.GetString(key) } +func (v *Viper) GetString(key string) string { + return cast.ToString(v.Get(key)) +} + +// GetBool returns the value associated with the key as a boolean. +func GetBool(key string) bool { return v.GetBool(key) } +func (v *Viper) GetBool(key string) bool { + return cast.ToBool(v.Get(key)) +} + +// GetInt returns the value associated with the key as an integer. +func GetInt(key string) int { return v.GetInt(key) } +func (v *Viper) GetInt(key string) int { + return cast.ToInt(v.Get(key)) +} + +// GetInt32 returns the value associated with the key as an integer. +func GetInt32(key string) int32 { return v.GetInt32(key) } +func (v *Viper) GetInt32(key string) int32 { + return cast.ToInt32(v.Get(key)) +} + +// GetInt64 returns the value associated with the key as an integer. +func GetInt64(key string) int64 { return v.GetInt64(key) } +func (v *Viper) GetInt64(key string) int64 { + return cast.ToInt64(v.Get(key)) +} + +// GetFloat64 returns the value associated with the key as a float64. +func GetFloat64(key string) float64 { return v.GetFloat64(key) } +func (v *Viper) GetFloat64(key string) float64 { + return cast.ToFloat64(v.Get(key)) +} + +// GetTime returns the value associated with the key as time. +func GetTime(key string) time.Time { return v.GetTime(key) } +func (v *Viper) GetTime(key string) time.Time { + return cast.ToTime(v.Get(key)) +} + +// GetDuration returns the value associated with the key as a duration. +func GetDuration(key string) time.Duration { return v.GetDuration(key) } +func (v *Viper) GetDuration(key string) time.Duration { + return cast.ToDuration(v.Get(key)) +} + +// GetStringSlice returns the value associated with the key as a slice of strings. +func GetStringSlice(key string) []string { return v.GetStringSlice(key) } +func (v *Viper) GetStringSlice(key string) []string { + return cast.ToStringSlice(v.Get(key)) +} + +// GetStringMap returns the value associated with the key as a map of interfaces. +func GetStringMap(key string) map[string]interface{} { return v.GetStringMap(key) } +func (v *Viper) GetStringMap(key string) map[string]interface{} { + return cast.ToStringMap(v.Get(key)) +} + +// GetStringMapString returns the value associated with the key as a map of strings. +func GetStringMapString(key string) map[string]string { return v.GetStringMapString(key) } +func (v *Viper) GetStringMapString(key string) map[string]string { + return cast.ToStringMapString(v.Get(key)) +} + +// GetStringMapStringSlice returns the value associated with the key as a map to a slice of strings. +func GetStringMapStringSlice(key string) map[string][]string { return v.GetStringMapStringSlice(key) } +func (v *Viper) GetStringMapStringSlice(key string) map[string][]string { + return cast.ToStringMapStringSlice(v.Get(key)) +} + +// GetSizeInBytes returns the size of the value associated with the given key +// in bytes. +func GetSizeInBytes(key string) uint { return v.GetSizeInBytes(key) } +func (v *Viper) GetSizeInBytes(key string) uint { + sizeStr := cast.ToString(v.Get(key)) + return parseSizeInBytes(sizeStr) +} + +// UnmarshalKey takes a single key and unmarshals it into a Struct. +func UnmarshalKey(key string, rawVal interface{}, opts ...DecoderConfigOption) error { + return v.UnmarshalKey(key, rawVal, opts...) +} +func (v *Viper) UnmarshalKey(key string, rawVal interface{}, opts ...DecoderConfigOption) error { + err := decode(v.Get(key), defaultDecoderConfig(rawVal, opts...)) + + if err != nil { + return err + } + + v.insensitiviseMaps() + + return nil +} + +// Unmarshal unmarshals the config into a Struct. Make sure that the tags +// on the fields of the structure are properly set. +func Unmarshal(rawVal interface{}, opts ...DecoderConfigOption) error { + return v.Unmarshal(rawVal, opts...) +} +func (v *Viper) Unmarshal(rawVal interface{}, opts ...DecoderConfigOption) error { + err := decode(v.AllSettings(), defaultDecoderConfig(rawVal, opts...)) + + if err != nil { + return err + } + + v.insensitiviseMaps() + + return nil +} + +// defaultDecoderConfig returns default mapsstructure.DecoderConfig with suppot +// of time.Duration values & string slices +func defaultDecoderConfig(output interface{}, opts ...DecoderConfigOption) *mapstructure.DecoderConfig { + c := &mapstructure.DecoderConfig{ + Metadata: nil, + Result: output, + WeaklyTypedInput: true, + DecodeHook: mapstructure.ComposeDecodeHookFunc( + mapstructure.StringToTimeDurationHookFunc(), + mapstructure.StringToSliceHookFunc(","), + ), + } + for _, opt := range opts { + opt(c) + } + return c +} + +// A wrapper around mapstructure.Decode that mimics the WeakDecode functionality +func decode(input interface{}, config *mapstructure.DecoderConfig) error { + decoder, err := mapstructure.NewDecoder(config) + if err != nil { + return err + } + return decoder.Decode(input) +} + +// UnmarshalExact unmarshals the config into a Struct, erroring if a field is nonexistent +// in the destination struct. +func (v *Viper) UnmarshalExact(rawVal interface{}) error { + config := defaultDecoderConfig(rawVal) + config.ErrorUnused = true + + err := decode(v.AllSettings(), config) + + if err != nil { + return err + } + + v.insensitiviseMaps() + + return nil +} + +// BindPFlags binds a full flag set to the configuration, using each flag's long +// name as the config key. +func BindPFlags(flags *pflag.FlagSet) error { return v.BindPFlags(flags) } +func (v *Viper) BindPFlags(flags *pflag.FlagSet) error { + return v.BindFlagValues(pflagValueSet{flags}) +} + +// BindPFlag binds a specific key to a pflag (as used by cobra). +// Example (where serverCmd is a Cobra instance): +// +// serverCmd.Flags().Int("port", 1138, "Port to run Application server on") +// Viper.BindPFlag("port", serverCmd.Flags().Lookup("port")) +// +func BindPFlag(key string, flag *pflag.Flag) error { return v.BindPFlag(key, flag) } +func (v *Viper) BindPFlag(key string, flag *pflag.Flag) error { + return v.BindFlagValue(key, pflagValue{flag}) +} + +// BindFlagValues binds a full FlagValue set to the configuration, using each flag's long +// name as the config key. +func BindFlagValues(flags FlagValueSet) error { return v.BindFlagValues(flags) } +func (v *Viper) BindFlagValues(flags FlagValueSet) (err error) { + flags.VisitAll(func(flag FlagValue) { + if err = v.BindFlagValue(flag.Name(), flag); err != nil { + return + } + }) + return nil +} + +// BindFlagValue binds a specific key to a FlagValue. +// Example (where serverCmd is a Cobra instance): +// +// serverCmd.Flags().Int("port", 1138, "Port to run Application server on") +// Viper.BindFlagValue("port", serverCmd.Flags().Lookup("port")) +// +func BindFlagValue(key string, flag FlagValue) error { return v.BindFlagValue(key, flag) } +func (v *Viper) BindFlagValue(key string, flag FlagValue) error { + if flag == nil { + return fmt.Errorf("flag for %q is nil", key) + } + v.pflags[strings.ToLower(key)] = flag + return nil +} + +// BindEnv binds a Viper key to a ENV variable. +// ENV variables are case sensitive. +// If only a key is provided, it will use the env key matching the key, uppercased. +// EnvPrefix will be used when set when env name is not provided. +func BindEnv(input ...string) error { return v.BindEnv(input...) } +func (v *Viper) BindEnv(input ...string) error { + var key, envkey string + if len(input) == 0 { + return fmt.Errorf("BindEnv missing key to bind to") + } + + key = strings.ToLower(input[0]) + + if len(input) == 1 { + envkey = v.mergeWithEnvPrefix(key) + } else { + envkey = input[1] + } + + v.env[key] = envkey + + return nil +} + +// Given a key, find the value. +// Viper will check in the following order: +// flag, env, config file, key/value store, default. +// Viper will check to see if an alias exists first. +// Note: this assumes a lower-cased key given. +func (v *Viper) find(lcaseKey string) interface{} { + + var ( + val interface{} + exists bool + path = strings.Split(lcaseKey, v.keyDelim) + nested = len(path) > 1 + ) + + // compute the path through the nested maps to the nested value + if nested && v.isPathShadowedInDeepMap(path, castMapStringToMapInterface(v.aliases)) != "" { + return nil + } + + // if the requested key is an alias, then return the proper key + lcaseKey = v.realKey(lcaseKey) + path = strings.Split(lcaseKey, v.keyDelim) + nested = len(path) > 1 + + // Set() override first + val = v.searchMap(v.override, path) + if val != nil { + return val + } + if nested && v.isPathShadowedInDeepMap(path, v.override) != "" { + return nil + } + + // PFlag override next + flag, exists := v.pflags[lcaseKey] + if exists && flag.HasChanged() { + switch flag.ValueType() { + case "int", "int8", "int16", "int32", "int64": + return cast.ToInt(flag.ValueString()) + case "bool": + return cast.ToBool(flag.ValueString()) + case "stringSlice": + s := strings.TrimPrefix(flag.ValueString(), "[") + s = strings.TrimSuffix(s, "]") + res, _ := readAsCSV(s) + return res + default: + return flag.ValueString() + } + } + if nested && v.isPathShadowedInFlatMap(path, v.pflags) != "" { + return nil + } + + // Env override next + if v.automaticEnvApplied { + // even if it hasn't been registered, if automaticEnv is used, + // check any Get request + if val = v.getEnv(v.mergeWithEnvPrefix(lcaseKey)); val != "" { + return val + } + if nested && v.isPathShadowedInAutoEnv(path) != "" { + return nil + } + } + envkey, exists := v.env[lcaseKey] + if exists { + if val = v.getEnv(envkey); val != "" { + return val + } + } + if nested && v.isPathShadowedInFlatMap(path, v.env) != "" { + return nil + } + + // Config file next + val = v.searchMapWithPathPrefixes(v.config, path) + if val != nil { + return val + } + if nested && v.isPathShadowedInDeepMap(path, v.config) != "" { + return nil + } + + // K/V store next + val = v.searchMap(v.kvstore, path) + if val != nil { + return val + } + if nested && v.isPathShadowedInDeepMap(path, v.kvstore) != "" { + return nil + } + + // Default next + val = v.searchMap(v.defaults, path) + if val != nil { + return val + } + if nested && v.isPathShadowedInDeepMap(path, v.defaults) != "" { + return nil + } + + // last chance: if no other value is returned and a flag does exist for the value, + // get the flag's value even if the flag's value has not changed + if flag, exists := v.pflags[lcaseKey]; exists { + switch flag.ValueType() { + case "int", "int8", "int16", "int32", "int64": + return cast.ToInt(flag.ValueString()) + case "bool": + return cast.ToBool(flag.ValueString()) + case "stringSlice": + s := strings.TrimPrefix(flag.ValueString(), "[") + s = strings.TrimSuffix(s, "]") + res, _ := readAsCSV(s) + return res + default: + return flag.ValueString() + } + } + // last item, no need to check shadowing + + return nil +} + +func readAsCSV(val string) ([]string, error) { + if val == "" { + return []string{}, nil + } + stringReader := strings.NewReader(val) + csvReader := csv.NewReader(stringReader) + return csvReader.Read() +} + +// IsSet checks to see if the key has been set in any of the data locations. +// IsSet is case-insensitive for a key. +func IsSet(key string) bool { return v.IsSet(key) } +func (v *Viper) IsSet(key string) bool { + lcaseKey := strings.ToLower(key) + val := v.find(lcaseKey) + return val != nil +} + +// AutomaticEnv has Viper check ENV variables for all. +// keys set in config, default & flags +func AutomaticEnv() { v.AutomaticEnv() } +func (v *Viper) AutomaticEnv() { + v.automaticEnvApplied = true +} + +// SetEnvKeyReplacer sets the strings.Replacer on the viper object +// Useful for mapping an environmental variable to a key that does +// not match it. +func SetEnvKeyReplacer(r *strings.Replacer) { v.SetEnvKeyReplacer(r) } +func (v *Viper) SetEnvKeyReplacer(r *strings.Replacer) { + v.envKeyReplacer = r +} + +// Aliases provide another accessor for the same key. +// This enables one to change a name without breaking the application +func RegisterAlias(alias string, key string) { v.RegisterAlias(alias, key) } +func (v *Viper) RegisterAlias(alias string, key string) { + v.registerAlias(alias, strings.ToLower(key)) +} + +func (v *Viper) registerAlias(alias string, key string) { + alias = strings.ToLower(alias) + if alias != key && alias != v.realKey(key) { + _, exists := v.aliases[alias] + + if !exists { + // if we alias something that exists in one of the maps to another + // name, we'll never be able to get that value using the original + // name, so move the config value to the new realkey. + if val, ok := v.config[alias]; ok { + delete(v.config, alias) + v.config[key] = val + } + if val, ok := v.kvstore[alias]; ok { + delete(v.kvstore, alias) + v.kvstore[key] = val + } + if val, ok := v.defaults[alias]; ok { + delete(v.defaults, alias) + v.defaults[key] = val + } + if val, ok := v.override[alias]; ok { + delete(v.override, alias) + v.override[key] = val + } + v.aliases[alias] = key + } + } else { + jww.WARN.Println("Creating circular reference alias", alias, key, v.realKey(key)) + } +} + +func (v *Viper) realKey(key string) string { + newkey, exists := v.aliases[key] + if exists { + jww.DEBUG.Println("Alias", key, "to", newkey) + return v.realKey(newkey) + } + return key +} + +// InConfig checks to see if the given key (or an alias) is in the config file. +func InConfig(key string) bool { return v.InConfig(key) } +func (v *Viper) InConfig(key string) bool { + // if the requested key is an alias, then return the proper key + key = v.realKey(key) + + _, exists := v.config[key] + return exists +} + +// SetDefault sets the default value for this key. +// SetDefault is case-insensitive for a key. +// Default only used when no value is provided by the user via flag, config or ENV. +func SetDefault(key string, value interface{}) { v.SetDefault(key, value) } +func (v *Viper) SetDefault(key string, value interface{}) { + // If alias passed in, then set the proper default + key = v.realKey(strings.ToLower(key)) + value = toCaseInsensitiveValue(value) + + path := strings.Split(key, v.keyDelim) + lastKey := strings.ToLower(path[len(path)-1]) + deepestMap := deepSearch(v.defaults, path[0:len(path)-1]) + + // set innermost value + deepestMap[lastKey] = value +} + +// Set sets the value for the key in the override register. +// Set is case-insensitive for a key. +// Will be used instead of values obtained via +// flags, config file, ENV, default, or key/value store. +func Set(key string, value interface{}) { v.Set(key, value) } +func (v *Viper) Set(key string, value interface{}) { + // If alias passed in, then set the proper override + key = v.realKey(strings.ToLower(key)) + value = toCaseInsensitiveValue(value) + + path := strings.Split(key, v.keyDelim) + lastKey := strings.ToLower(path[len(path)-1]) + deepestMap := deepSearch(v.override, path[0:len(path)-1]) + + // set innermost value + deepestMap[lastKey] = value +} + +// ReadInConfig will discover and load the configuration file from disk +// and key/value stores, searching in one of the defined paths. +func ReadInConfig() error { return v.ReadInConfig() } +func (v *Viper) ReadInConfig() error { + jww.INFO.Println("Attempting to read in config file") + filename, err := v.getConfigFile() + if err != nil { + return err + } + + if !stringInSlice(v.getConfigType(), SupportedExts) { + return UnsupportedConfigError(v.getConfigType()) + } + + jww.DEBUG.Println("Reading file: ", filename) + file, err := afero.ReadFile(v.fs, filename) + if err != nil { + return err + } + + config := make(map[string]interface{}) + + err = v.unmarshalReader(bytes.NewReader(file), config) + if err != nil { + return err + } + + v.config = config + return nil +} + +// MergeInConfig merges a new configuration with an existing config. +func MergeInConfig() error { return v.MergeInConfig() } +func (v *Viper) MergeInConfig() error { + jww.INFO.Println("Attempting to merge in config file") + filename, err := v.getConfigFile() + if err != nil { + return err + } + + if !stringInSlice(v.getConfigType(), SupportedExts) { + return UnsupportedConfigError(v.getConfigType()) + } + + file, err := afero.ReadFile(v.fs, filename) + if err != nil { + return err + } + + return v.MergeConfig(bytes.NewReader(file)) +} + +// ReadConfig will read a configuration file, setting existing keys to nil if the +// key does not exist in the file. +func ReadConfig(in io.Reader) error { return v.ReadConfig(in) } +func (v *Viper) ReadConfig(in io.Reader) error { + v.config = make(map[string]interface{}) + return v.unmarshalReader(in, v.config) +} + +// MergeConfig merges a new configuration with an existing config. +func MergeConfig(in io.Reader) error { return v.MergeConfig(in) } +func (v *Viper) MergeConfig(in io.Reader) error { + if v.config == nil { + v.config = make(map[string]interface{}) + } + cfg := make(map[string]interface{}) + if err := v.unmarshalReader(in, cfg); err != nil { + return err + } + mergeMaps(cfg, v.config, nil) + return nil +} + +// WriteConfig writes the current configuration to a file. +func WriteConfig() error { return v.WriteConfig() } +func (v *Viper) WriteConfig() error { + filename, err := v.getConfigFile() + if err != nil { + return err + } + return v.writeConfig(filename, true) +} + +// SafeWriteConfig writes current configuration to file only if the file does not exist. +func SafeWriteConfig() error { return v.SafeWriteConfig() } +func (v *Viper) SafeWriteConfig() error { + filename, err := v.getConfigFile() + if err != nil { + return err + } + return v.writeConfig(filename, false) +} + +// WriteConfigAs writes current configuration to a given filename. +func WriteConfigAs(filename string) error { return v.WriteConfigAs(filename) } +func (v *Viper) WriteConfigAs(filename string) error { + return v.writeConfig(filename, true) +} + +// SafeWriteConfigAs writes current configuration to a given filename if it does not exist. +func SafeWriteConfigAs(filename string) error { return v.SafeWriteConfigAs(filename) } +func (v *Viper) SafeWriteConfigAs(filename string) error { + return v.writeConfig(filename, false) +} + +func writeConfig(filename string, force bool) error { return v.writeConfig(filename, force) } +func (v *Viper) writeConfig(filename string, force bool) error { + jww.INFO.Println("Attempting to write configuration to file.") + ext := filepath.Ext(filename) + if len(ext) <= 1 { + return fmt.Errorf("Filename: %s requires valid extension.", filename) + } + configType := ext[1:] + if !stringInSlice(configType, SupportedExts) { + return UnsupportedConfigError(configType) + } + if v.config == nil { + v.config = make(map[string]interface{}) + } + var flags int + if force == true { + flags = os.O_CREATE | os.O_TRUNC | os.O_WRONLY + } else { + if _, err := os.Stat(filename); os.IsNotExist(err) { + flags = os.O_WRONLY + } else { + return fmt.Errorf("File: %s exists. Use WriteConfig to overwrite.", filename) + } + } + f, err := v.fs.OpenFile(filename, flags, os.FileMode(0644)) + if err != nil { + return err + } + return v.marshalWriter(f, configType) +} + +// Unmarshal a Reader into a map. +// Should probably be an unexported function. +func unmarshalReader(in io.Reader, c map[string]interface{}) error { + return v.unmarshalReader(in, c) +} +func (v *Viper) unmarshalReader(in io.Reader, c map[string]interface{}) error { + buf := new(bytes.Buffer) + buf.ReadFrom(in) + + switch strings.ToLower(v.getConfigType()) { + case "yaml", "yml": + if err := yaml.Unmarshal(buf.Bytes(), &c); err != nil { + return ConfigParseError{err} + } + + case "json": + if err := json.Unmarshal(buf.Bytes(), &c); err != nil { + return ConfigParseError{err} + } + + case "hcl": + obj, err := hcl.Parse(string(buf.Bytes())) + if err != nil { + return ConfigParseError{err} + } + if err = hcl.DecodeObject(&c, obj); err != nil { + return ConfigParseError{err} + } + + case "toml": + tree, err := toml.LoadReader(buf) + if err != nil { + return ConfigParseError{err} + } + tmap := tree.ToMap() + for k, v := range tmap { + c[k] = v + } + + case "properties", "props", "prop": + v.properties = properties.NewProperties() + var err error + if v.properties, err = properties.Load(buf.Bytes(), properties.UTF8); err != nil { + return ConfigParseError{err} + } + for _, key := range v.properties.Keys() { + value, _ := v.properties.Get(key) + // recursively build nested maps + path := strings.Split(key, ".") + lastKey := strings.ToLower(path[len(path)-1]) + deepestMap := deepSearch(c, path[0:len(path)-1]) + // set innermost value + deepestMap[lastKey] = value + } + } + + insensitiviseMap(c) + return nil +} + +// Marshal a map into Writer. +func marshalWriter(f afero.File, configType string) error { + return v.marshalWriter(f, configType) +} +func (v *Viper) marshalWriter(f afero.File, configType string) error { + c := v.AllSettings() + switch configType { + case "json": + b, err := json.MarshalIndent(c, "", " ") + if err != nil { + return ConfigMarshalError{err} + } + _, err = f.WriteString(string(b)) + if err != nil { + return ConfigMarshalError{err} + } + + case "hcl": + b, err := json.Marshal(c) + ast, err := hcl.Parse(string(b)) + if err != nil { + return ConfigMarshalError{err} + } + err = printer.Fprint(f, ast.Node) + if err != nil { + return ConfigMarshalError{err} + } + + case "prop", "props", "properties": + if v.properties == nil { + v.properties = properties.NewProperties() + } + p := v.properties + for _, key := range v.AllKeys() { + _, _, err := p.Set(key, v.GetString(key)) + if err != nil { + return ConfigMarshalError{err} + } + } + _, err := p.WriteComment(f, "#", properties.UTF8) + if err != nil { + return ConfigMarshalError{err} + } + + case "toml": + t, err := toml.TreeFromMap(c) + if err != nil { + return ConfigMarshalError{err} + } + s := t.String() + if _, err := f.WriteString(s); err != nil { + return ConfigMarshalError{err} + } + + case "yaml", "yml": + b, err := yaml.Marshal(c) + if err != nil { + return ConfigMarshalError{err} + } + if _, err = f.WriteString(string(b)); err != nil { + return ConfigMarshalError{err} + } + } + return nil +} + +func keyExists(k string, m map[string]interface{}) string { + lk := strings.ToLower(k) + for mk := range m { + lmk := strings.ToLower(mk) + if lmk == lk { + return mk + } + } + return "" +} + +func castToMapStringInterface( + src map[interface{}]interface{}) map[string]interface{} { + tgt := map[string]interface{}{} + for k, v := range src { + tgt[fmt.Sprintf("%v", k)] = v + } + return tgt +} + +func castMapStringToMapInterface(src map[string]string) map[string]interface{} { + tgt := map[string]interface{}{} + for k, v := range src { + tgt[k] = v + } + return tgt +} + +func castMapFlagToMapInterface(src map[string]FlagValue) map[string]interface{} { + tgt := map[string]interface{}{} + for k, v := range src { + tgt[k] = v + } + return tgt +} + +// mergeMaps merges two maps. The `itgt` parameter is for handling go-yaml's +// insistence on parsing nested structures as `map[interface{}]interface{}` +// instead of using a `string` as the key for nest structures beyond one level +// deep. Both map types are supported as there is a go-yaml fork that uses +// `map[string]interface{}` instead. +func mergeMaps( + src, tgt map[string]interface{}, itgt map[interface{}]interface{}) { + for sk, sv := range src { + tk := keyExists(sk, tgt) + if tk == "" { + jww.TRACE.Printf("tk=\"\", tgt[%s]=%v", sk, sv) + tgt[sk] = sv + if itgt != nil { + itgt[sk] = sv + } + continue + } + + tv, ok := tgt[tk] + if !ok { + jww.TRACE.Printf("tgt[%s] != ok, tgt[%s]=%v", tk, sk, sv) + tgt[sk] = sv + if itgt != nil { + itgt[sk] = sv + } + continue + } + + svType := reflect.TypeOf(sv) + tvType := reflect.TypeOf(tv) + if svType != tvType { + jww.ERROR.Printf( + "svType != tvType; key=%s, st=%v, tt=%v, sv=%v, tv=%v", + sk, svType, tvType, sv, tv) + continue + } + + jww.TRACE.Printf("processing key=%s, st=%v, tt=%v, sv=%v, tv=%v", + sk, svType, tvType, sv, tv) + + switch ttv := tv.(type) { + case map[interface{}]interface{}: + jww.TRACE.Printf("merging maps (must convert)") + tsv := sv.(map[interface{}]interface{}) + ssv := castToMapStringInterface(tsv) + stv := castToMapStringInterface(ttv) + mergeMaps(ssv, stv, ttv) + case map[string]interface{}: + jww.TRACE.Printf("merging maps") + mergeMaps(sv.(map[string]interface{}), ttv, nil) + default: + jww.TRACE.Printf("setting value") + tgt[tk] = sv + if itgt != nil { + itgt[tk] = sv + } + } + } +} + +// ReadRemoteConfig attempts to get configuration from a remote source +// and read it in the remote configuration registry. +func ReadRemoteConfig() error { return v.ReadRemoteConfig() } +func (v *Viper) ReadRemoteConfig() error { + return v.getKeyValueConfig() +} + +func WatchRemoteConfig() error { return v.WatchRemoteConfig() } +func (v *Viper) WatchRemoteConfig() error { + return v.watchKeyValueConfig() +} + +func (v *Viper) WatchRemoteConfigOnChannel() error { + return v.watchKeyValueConfigOnChannel() +} + +func (v *Viper) insensitiviseMaps() { + insensitiviseMap(v.config) + insensitiviseMap(v.defaults) + insensitiviseMap(v.override) + insensitiviseMap(v.kvstore) +} + +// Retrieve the first found remote configuration. +func (v *Viper) getKeyValueConfig() error { + if RemoteConfig == nil { + return RemoteConfigError("Enable the remote features by doing a blank import of the viper/remote package: '_ github.com/spf13/viper/remote'") + } + + for _, rp := range v.remoteProviders { + val, err := v.getRemoteConfig(rp) + if err != nil { + continue + } + v.kvstore = val + return nil + } + return RemoteConfigError("No Files Found") +} + +func (v *Viper) getRemoteConfig(provider RemoteProvider) (map[string]interface{}, error) { + reader, err := RemoteConfig.Get(provider) + if err != nil { + return nil, err + } + err = v.unmarshalReader(reader, v.kvstore) + return v.kvstore, err +} + +// Retrieve the first found remote configuration. +func (v *Viper) watchKeyValueConfigOnChannel() error { + for _, rp := range v.remoteProviders { + respc, _ := RemoteConfig.WatchChannel(rp) + //Todo: Add quit channel + go func(rc <-chan *RemoteResponse) { + for { + b := <-rc + reader := bytes.NewReader(b.Value) + v.unmarshalReader(reader, v.kvstore) + } + }(respc) + return nil + } + return RemoteConfigError("No Files Found") +} + +// Retrieve the first found remote configuration. +func (v *Viper) watchKeyValueConfig() error { + for _, rp := range v.remoteProviders { + val, err := v.watchRemoteConfig(rp) + if err != nil { + continue + } + v.kvstore = val + return nil + } + return RemoteConfigError("No Files Found") +} + +func (v *Viper) watchRemoteConfig(provider RemoteProvider) (map[string]interface{}, error) { + reader, err := RemoteConfig.Watch(provider) + if err != nil { + return nil, err + } + err = v.unmarshalReader(reader, v.kvstore) + return v.kvstore, err +} + +// AllKeys returns all keys holding a value, regardless of where they are set. +// Nested keys are returned with a v.keyDelim (= ".") separator +func AllKeys() []string { return v.AllKeys() } +func (v *Viper) AllKeys() []string { + m := map[string]bool{} + // add all paths, by order of descending priority to ensure correct shadowing + m = v.flattenAndMergeMap(m, castMapStringToMapInterface(v.aliases), "") + m = v.flattenAndMergeMap(m, v.override, "") + m = v.mergeFlatMap(m, castMapFlagToMapInterface(v.pflags)) + m = v.mergeFlatMap(m, castMapStringToMapInterface(v.env)) + m = v.flattenAndMergeMap(m, v.config, "") + m = v.flattenAndMergeMap(m, v.kvstore, "") + m = v.flattenAndMergeMap(m, v.defaults, "") + + // convert set of paths to list + a := []string{} + for x := range m { + a = append(a, x) + } + return a +} + +// flattenAndMergeMap recursively flattens the given map into a map[string]bool +// of key paths (used as a set, easier to manipulate than a []string): +// - each path is merged into a single key string, delimited with v.keyDelim (= ".") +// - if a path is shadowed by an earlier value in the initial shadow map, +// it is skipped. +// The resulting set of paths is merged to the given shadow set at the same time. +func (v *Viper) flattenAndMergeMap(shadow map[string]bool, m map[string]interface{}, prefix string) map[string]bool { + if shadow != nil && prefix != "" && shadow[prefix] { + // prefix is shadowed => nothing more to flatten + return shadow + } + if shadow == nil { + shadow = make(map[string]bool) + } + + var m2 map[string]interface{} + if prefix != "" { + prefix += v.keyDelim + } + for k, val := range m { + fullKey := prefix + k + switch val.(type) { + case map[string]interface{}: + m2 = val.(map[string]interface{}) + case map[interface{}]interface{}: + m2 = cast.ToStringMap(val) + default: + // immediate value + shadow[strings.ToLower(fullKey)] = true + continue + } + // recursively merge to shadow map + shadow = v.flattenAndMergeMap(shadow, m2, fullKey) + } + return shadow +} + +// mergeFlatMap merges the given maps, excluding values of the second map +// shadowed by values from the first map. +func (v *Viper) mergeFlatMap(shadow map[string]bool, m map[string]interface{}) map[string]bool { + // scan keys +outer: + for k, _ := range m { + path := strings.Split(k, v.keyDelim) + // scan intermediate paths + var parentKey string + for i := 1; i < len(path); i++ { + parentKey = strings.Join(path[0:i], v.keyDelim) + if shadow[parentKey] { + // path is shadowed, continue + continue outer + } + } + // add key + shadow[strings.ToLower(k)] = true + } + return shadow +} + +// AllSettings merges all settings and returns them as a map[string]interface{}. +func AllSettings() map[string]interface{} { return v.AllSettings() } +func (v *Viper) AllSettings() map[string]interface{} { + m := map[string]interface{}{} + // start from the list of keys, and construct the map one value at a time + for _, k := range v.AllKeys() { + value := v.Get(k) + if value == nil { + // should not happen, since AllKeys() returns only keys holding a value, + // check just in case anything changes + continue + } + path := strings.Split(k, v.keyDelim) + lastKey := strings.ToLower(path[len(path)-1]) + deepestMap := deepSearch(m, path[0:len(path)-1]) + // set innermost value + deepestMap[lastKey] = value + } + return m +} + +// SetFs sets the filesystem to use to read configuration. +func SetFs(fs afero.Fs) { v.SetFs(fs) } +func (v *Viper) SetFs(fs afero.Fs) { + v.fs = fs +} + +// SetConfigName sets name for the config file. +// Does not include extension. +func SetConfigName(in string) { v.SetConfigName(in) } +func (v *Viper) SetConfigName(in string) { + if in != "" { + v.configName = in + v.configFile = "" + } +} + +// SetConfigType sets the type of the configuration returned by the +// remote source, e.g. "json". +func SetConfigType(in string) { v.SetConfigType(in) } +func (v *Viper) SetConfigType(in string) { + if in != "" { + v.configType = in + } +} + +func (v *Viper) getConfigType() string { + if v.configType != "" { + return v.configType + } + + cf, err := v.getConfigFile() + if err != nil { + return "" + } + + ext := filepath.Ext(cf) + + if len(ext) > 1 { + return ext[1:] + } + + return "" +} + +func (v *Viper) getConfigFile() (string, error) { + if v.configFile == "" { + cf, err := v.findConfigFile() + if err != nil { + return "", err + } + v.configFile = cf + } + return v.configFile, nil +} + +func (v *Viper) searchInPath(in string) (filename string) { + jww.DEBUG.Println("Searching for config in ", in) + for _, ext := range SupportedExts { + jww.DEBUG.Println("Checking for", filepath.Join(in, v.configName+"."+ext)) + if b, _ := exists(v.fs, filepath.Join(in, v.configName+"."+ext)); b { + jww.DEBUG.Println("Found: ", filepath.Join(in, v.configName+"."+ext)) + return filepath.Join(in, v.configName+"."+ext) + } + } + + return "" +} + +// Search all configPaths for any config file. +// Returns the first path that exists (and is a config file). +func (v *Viper) findConfigFile() (string, error) { + jww.INFO.Println("Searching for config in ", v.configPaths) + + for _, cp := range v.configPaths { + file := v.searchInPath(cp) + if file != "" { + return file, nil + } + } + return "", ConfigFileNotFoundError{v.configName, fmt.Sprintf("%s", v.configPaths)} +} + +// Debug prints all configuration registries for debugging +// purposes. +func Debug() { v.Debug() } +func (v *Viper) Debug() { + fmt.Printf("Aliases:\n%#v\n", v.aliases) + fmt.Printf("Override:\n%#v\n", v.override) + fmt.Printf("PFlags:\n%#v\n", v.pflags) + fmt.Printf("Env:\n%#v\n", v.env) + fmt.Printf("Key/Value Store:\n%#v\n", v.kvstore) + fmt.Printf("Config:\n%#v\n", v.config) + fmt.Printf("Defaults:\n%#v\n", v.defaults) +} diff --git a/vendor/github.com/stretchr/objx/.codeclimate.yml b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/objx/.codeclimate.yml similarity index 54% rename from vendor/github.com/stretchr/objx/.codeclimate.yml rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/objx/.codeclimate.yml index 559fa399..010d4ccd 100644 --- a/vendor/github.com/stretchr/objx/.codeclimate.yml +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/objx/.codeclimate.yml @@ -10,12 +10,4 @@ exclude_patterns: - ".github/" - "vendor/" - "codegen/" -- "*.yml" -- ".*.yml" -- "*.md" -- "Gopkg.*" - "doc.go" -- "type_specific_codegen_test.go" -- "type_specific_codegen.go" -- ".gitignore" -- "LICENSE" diff --git a/vendor/github.com/stretchr/objx/.gitignore b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/objx/.gitignore similarity index 100% rename from vendor/github.com/stretchr/objx/.gitignore rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/objx/.gitignore diff --git a/vendor/github.com/stretchr/objx/.travis.yml b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/objx/.travis.yml similarity index 64% rename from vendor/github.com/stretchr/objx/.travis.yml rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/objx/.travis.yml index cde6eb2a..a63efa59 100644 --- a/vendor/github.com/stretchr/objx/.travis.yml +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/objx/.travis.yml @@ -1,14 +1,8 @@ language: go go: - - "1.10.x" - - "1.11.x" - - "1.12.x" - - master - -matrix: - allow_failures: - - go: master -fast_finish: true + - 1.8 + - 1.9 + - tip env: global: @@ -20,11 +14,12 @@ before_script: - ./cc-test-reporter before-build install: - - curl -sL https://taskfile.dev/install.sh | sh +- go get github.com/go-task/task/cmd/task script: - - diff -u <(echo -n) <(./bin/task lint) - - ./bin/task test-coverage +- task dl-deps +- task lint +- task test-coverage after_script: - ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/objx/Gopkg.lock b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/objx/Gopkg.lock new file mode 100644 index 00000000..eebe342a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/objx/Gopkg.lock @@ -0,0 +1,30 @@ +# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. + + +[[projects]] + name = "github.com/davecgh/go-spew" + packages = ["spew"] + revision = "346938d642f2ec3594ed81d874461961cd0faa76" + version = "v1.1.0" + +[[projects]] + name = "github.com/pmezard/go-difflib" + packages = ["difflib"] + revision = "792786c7400a136282c1664665ae0a8db921c6c2" + version = "v1.0.0" + +[[projects]] + name = "github.com/stretchr/testify" + packages = [ + "assert", + "require" + ] + revision = "b91bfb9ebec76498946beb6af7c0230c7cc7ba6c" + version = "v1.2.0" + +[solve-meta] + analyzer-name = "dep" + analyzer-version = 1 + inputs-digest = "2d160a7dea4ffd13c6c31dab40373822f9d78c73beba016d662bef8f7a998876" + solver-name = "gps-cdcl" + solver-version = 1 diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/objx/Gopkg.toml b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/objx/Gopkg.toml new file mode 100644 index 00000000..d70f1570 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/objx/Gopkg.toml @@ -0,0 +1,8 @@ +[prune] + unused-packages = true + non-go = true + go-tests = true + +[[constraint]] + name = "github.com/stretchr/testify" + version = "~1.2.0" diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/objx/LICENSE b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/objx/LICENSE new file mode 100644 index 00000000..44d4d9d5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/objx/LICENSE @@ -0,0 +1,22 @@ +The MIT License + +Copyright (c) 2014 Stretchr, Inc. +Copyright (c) 2017-2018 objx contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/stretchr/objx/README.md b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/objx/README.md similarity index 97% rename from vendor/github.com/stretchr/objx/README.md rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/objx/README.md index 246660b2..be5750c9 100644 --- a/vendor/github.com/stretchr/objx/README.md +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/objx/README.md @@ -74,7 +74,7 @@ To update Objx to the latest version, run: go get -u github.com/stretchr/objx ### Supported go versions -We support the lastest three major Go versions, which are 1.10, 1.11 and 1.12 at the moment. +We support the lastest two major Go versions, which are 1.8 and 1.9 at the moment. ## Contributing Please feel free to submit issues, fork the repository and send pull requests! diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/objx/Taskfile.yml b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/objx/Taskfile.yml new file mode 100644 index 00000000..f8035641 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/objx/Taskfile.yml @@ -0,0 +1,32 @@ +default: + deps: [test] + +dl-deps: + desc: Downloads cli dependencies + cmds: + - go get -u github.com/golang/lint/golint + - go get -u github.com/golang/dep/cmd/dep + +update-deps: + desc: Updates dependencies + cmds: + - dep ensure + - dep ensure -update + +lint: + desc: Runs golint + cmds: + - go fmt $(go list ./... | grep -v /vendor/) + - go vet $(go list ./... | grep -v /vendor/) + - golint $(ls *.go | grep -v "doc.go") + silent: true + +test: + desc: Runs go tests + cmds: + - go test -race . + +test-coverage: + desc: Runs go tests and calucates test coverage + cmds: + - go test -coverprofile=c.out . diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/objx/accessors.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/objx/accessors.go new file mode 100644 index 00000000..204356a2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/objx/accessors.go @@ -0,0 +1,148 @@ +package objx + +import ( + "regexp" + "strconv" + "strings" +) + +// arrayAccesRegexString is the regex used to extract the array number +// from the access path +const arrayAccesRegexString = `^(.+)\[([0-9]+)\]$` + +// arrayAccesRegex is the compiled arrayAccesRegexString +var arrayAccesRegex = regexp.MustCompile(arrayAccesRegexString) + +// Get gets the value using the specified selector and +// returns it inside a new Obj object. +// +// If it cannot find the value, Get will return a nil +// value inside an instance of Obj. +// +// Get can only operate directly on map[string]interface{} and []interface. +// +// Example +// +// To access the title of the third chapter of the second book, do: +// +// o.Get("books[1].chapters[2].title") +func (m Map) Get(selector string) *Value { + rawObj := access(m, selector, nil, false) + return &Value{data: rawObj} +} + +// Set sets the value using the specified selector and +// returns the object on which Set was called. +// +// Set can only operate directly on map[string]interface{} and []interface +// +// Example +// +// To set the title of the third chapter of the second book, do: +// +// o.Set("books[1].chapters[2].title","Time to Go") +func (m Map) Set(selector string, value interface{}) Map { + access(m, selector, value, true) + return m +} + +// access accesses the object using the selector and performs the +// appropriate action. +func access(current, selector, value interface{}, isSet bool) interface{} { + switch selector.(type) { + case int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64: + if array, ok := current.([]interface{}); ok { + index := intFromInterface(selector) + if index >= len(array) { + return nil + } + return array[index] + } + return nil + + case string: + selStr := selector.(string) + selSegs := strings.SplitN(selStr, PathSeparator, 2) + thisSel := selSegs[0] + index := -1 + var err error + + if strings.Contains(thisSel, "[") { + arrayMatches := arrayAccesRegex.FindStringSubmatch(thisSel) + if len(arrayMatches) > 0 { + // Get the key into the map + thisSel = arrayMatches[1] + + // Get the index into the array at the key + index, err = strconv.Atoi(arrayMatches[2]) + + if err != nil { + // This should never happen. If it does, something has gone + // seriously wrong. Panic. + panic("objx: Array index is not an integer. Must use array[int].") + } + } + } + if curMap, ok := current.(Map); ok { + current = map[string]interface{}(curMap) + } + // get the object in question + switch current.(type) { + case map[string]interface{}: + curMSI := current.(map[string]interface{}) + if len(selSegs) <= 1 && isSet { + curMSI[thisSel] = value + return nil + } + current = curMSI[thisSel] + default: + current = nil + } + // do we need to access the item of an array? + if index > -1 { + if array, ok := current.([]interface{}); ok { + if index < len(array) { + current = array[index] + } else { + current = nil + } + } + } + if len(selSegs) > 1 { + current = access(current, selSegs[1], value, isSet) + } + } + return current +} + +// intFromInterface converts an interface object to the largest +// representation of an unsigned integer using a type switch and +// assertions +func intFromInterface(selector interface{}) int { + var value int + switch selector.(type) { + case int: + value = selector.(int) + case int8: + value = int(selector.(int8)) + case int16: + value = int(selector.(int16)) + case int32: + value = int(selector.(int32)) + case int64: + value = int(selector.(int64)) + case uint: + value = int(selector.(uint)) + case uint8: + value = int(selector.(uint8)) + case uint16: + value = int(selector.(uint16)) + case uint32: + value = int(selector.(uint32)) + case uint64: + value = int(selector.(uint64)) + default: + return 0 + } + return value +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/objx/constants.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/objx/constants.go new file mode 100644 index 00000000..f9eb42a2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/objx/constants.go @@ -0,0 +1,13 @@ +package objx + +const ( + // PathSeparator is the character used to separate the elements + // of the keypath. + // + // For example, `location.address.city` + PathSeparator string = "." + + // SignatureSeparator is the character that is used to + // separate the Base64 string from the security signature. + SignatureSeparator = "_" +) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/objx/conversions.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/objx/conversions.go new file mode 100644 index 00000000..5e020f31 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/objx/conversions.go @@ -0,0 +1,108 @@ +package objx + +import ( + "bytes" + "encoding/base64" + "encoding/json" + "errors" + "fmt" + "net/url" +) + +// JSON converts the contained object to a JSON string +// representation +func (m Map) JSON() (string, error) { + result, err := json.Marshal(m) + if err != nil { + err = errors.New("objx: JSON encode failed with: " + err.Error()) + } + return string(result), err +} + +// MustJSON converts the contained object to a JSON string +// representation and panics if there is an error +func (m Map) MustJSON() string { + result, err := m.JSON() + if err != nil { + panic(err.Error()) + } + return result +} + +// Base64 converts the contained object to a Base64 string +// representation of the JSON string representation +func (m Map) Base64() (string, error) { + var buf bytes.Buffer + + jsonData, err := m.JSON() + if err != nil { + return "", err + } + + encoder := base64.NewEncoder(base64.StdEncoding, &buf) + _, err = encoder.Write([]byte(jsonData)) + if err != nil { + return "", err + } + _ = encoder.Close() + + return buf.String(), nil +} + +// MustBase64 converts the contained object to a Base64 string +// representation of the JSON string representation and panics +// if there is an error +func (m Map) MustBase64() string { + result, err := m.Base64() + if err != nil { + panic(err.Error()) + } + return result +} + +// SignedBase64 converts the contained object to a Base64 string +// representation of the JSON string representation and signs it +// using the provided key. +func (m Map) SignedBase64(key string) (string, error) { + base64, err := m.Base64() + if err != nil { + return "", err + } + + sig := HashWithKey(base64, key) + return base64 + SignatureSeparator + sig, nil +} + +// MustSignedBase64 converts the contained object to a Base64 string +// representation of the JSON string representation and signs it +// using the provided key and panics if there is an error +func (m Map) MustSignedBase64(key string) string { + result, err := m.SignedBase64(key) + if err != nil { + panic(err.Error()) + } + return result +} + +/* + URL Query + ------------------------------------------------ +*/ + +// URLValues creates a url.Values object from an Obj. This +// function requires that the wrapped object be a map[string]interface{} +func (m Map) URLValues() url.Values { + vals := make(url.Values) + for k, v := range m { + //TODO: can this be done without sprintf? + vals.Set(k, fmt.Sprintf("%v", v)) + } + return vals +} + +// URLQuery gets an encoded URL query representing the given +// Obj. This function requires that the wrapped object be a +// map[string]interface{} +func (m Map) URLQuery() (string, error) { + return m.URLValues().Encode(), nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/objx/doc.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/objx/doc.go new file mode 100644 index 00000000..6d6af1a8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/objx/doc.go @@ -0,0 +1,66 @@ +/* +Objx - Go package for dealing with maps, slices, JSON and other data. + +Overview + +Objx provides the `objx.Map` type, which is a `map[string]interface{}` that exposes +a powerful `Get` method (among others) that allows you to easily and quickly get +access to data within the map, without having to worry too much about type assertions, +missing data, default values etc. + +Pattern + +Objx uses a preditable pattern to make access data from within `map[string]interface{}` easy. +Call one of the `objx.` functions to create your `objx.Map` to get going: + + m, err := objx.FromJSON(json) + +NOTE: Any methods or functions with the `Must` prefix will panic if something goes wrong, +the rest will be optimistic and try to figure things out without panicking. + +Use `Get` to access the value you're interested in. You can use dot and array +notation too: + + m.Get("places[0].latlng") + +Once you have sought the `Value` you're interested in, you can use the `Is*` methods to determine its type. + + if m.Get("code").IsStr() { // Your code... } + +Or you can just assume the type, and use one of the strong type methods to extract the real value: + + m.Get("code").Int() + +If there's no value there (or if it's the wrong type) then a default value will be returned, +or you can be explicit about the default value. + + Get("code").Int(-1) + +If you're dealing with a slice of data as a value, Objx provides many useful methods for iterating, +manipulating and selecting that data. You can find out more by exploring the index below. + +Reading data + +A simple example of how to use Objx: + + // Use MustFromJSON to make an objx.Map from some JSON + m := objx.MustFromJSON(`{"name": "Mat", "age": 30}`) + + // Get the details + name := m.Get("name").Str() + age := m.Get("age").Int() + + // Get their nickname (or use their name if they don't have one) + nickname := m.Get("nickname").Str(name) + +Ranging + +Since `objx.Map` is a `map[string]interface{}` you can treat it as such. +For example, to `range` the data, do what you would expect: + + m := objx.MustFromJSON(json) + for key, value := range m { + // Your code... + } +*/ +package objx diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/objx/map.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/objx/map.go new file mode 100644 index 00000000..406bc892 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/objx/map.go @@ -0,0 +1,190 @@ +package objx + +import ( + "encoding/base64" + "encoding/json" + "errors" + "io/ioutil" + "net/url" + "strings" +) + +// MSIConvertable is an interface that defines methods for converting your +// custom types to a map[string]interface{} representation. +type MSIConvertable interface { + // MSI gets a map[string]interface{} (msi) representing the + // object. + MSI() map[string]interface{} +} + +// Map provides extended functionality for working with +// untyped data, in particular map[string]interface (msi). +type Map map[string]interface{} + +// Value returns the internal value instance +func (m Map) Value() *Value { + return &Value{data: m} +} + +// Nil represents a nil Map. +var Nil = New(nil) + +// New creates a new Map containing the map[string]interface{} in the data argument. +// If the data argument is not a map[string]interface, New attempts to call the +// MSI() method on the MSIConvertable interface to create one. +func New(data interface{}) Map { + if _, ok := data.(map[string]interface{}); !ok { + if converter, ok := data.(MSIConvertable); ok { + data = converter.MSI() + } else { + return nil + } + } + return Map(data.(map[string]interface{})) +} + +// MSI creates a map[string]interface{} and puts it inside a new Map. +// +// The arguments follow a key, value pattern. +// +// +// Returns nil if any key argument is non-string or if there are an odd number of arguments. +// +// Example +// +// To easily create Maps: +// +// m := objx.MSI("name", "Mat", "age", 29, "subobj", objx.MSI("active", true)) +// +// // creates an Map equivalent to +// m := objx.Map{"name": "Mat", "age": 29, "subobj": objx.Map{"active": true}} +func MSI(keyAndValuePairs ...interface{}) Map { + newMap := Map{} + keyAndValuePairsLen := len(keyAndValuePairs) + if keyAndValuePairsLen%2 != 0 { + return nil + } + for i := 0; i < keyAndValuePairsLen; i = i + 2 { + key := keyAndValuePairs[i] + value := keyAndValuePairs[i+1] + + // make sure the key is a string + keyString, keyStringOK := key.(string) + if !keyStringOK { + return nil + } + newMap[keyString] = value + } + return newMap +} + +// ****** Conversion Constructors + +// MustFromJSON creates a new Map containing the data specified in the +// jsonString. +// +// Panics if the JSON is invalid. +func MustFromJSON(jsonString string) Map { + o, err := FromJSON(jsonString) + if err != nil { + panic("objx: MustFromJSON failed with error: " + err.Error()) + } + return o +} + +// FromJSON creates a new Map containing the data specified in the +// jsonString. +// +// Returns an error if the JSON is invalid. +func FromJSON(jsonString string) (Map, error) { + var data interface{} + err := json.Unmarshal([]byte(jsonString), &data) + if err != nil { + return Nil, err + } + return New(data), nil +} + +// FromBase64 creates a new Obj containing the data specified +// in the Base64 string. +// +// The string is an encoded JSON string returned by Base64 +func FromBase64(base64String string) (Map, error) { + decoder := base64.NewDecoder(base64.StdEncoding, strings.NewReader(base64String)) + decoded, err := ioutil.ReadAll(decoder) + if err != nil { + return nil, err + } + return FromJSON(string(decoded)) +} + +// MustFromBase64 creates a new Obj containing the data specified +// in the Base64 string and panics if there is an error. +// +// The string is an encoded JSON string returned by Base64 +func MustFromBase64(base64String string) Map { + result, err := FromBase64(base64String) + if err != nil { + panic("objx: MustFromBase64 failed with error: " + err.Error()) + } + return result +} + +// FromSignedBase64 creates a new Obj containing the data specified +// in the Base64 string. +// +// The string is an encoded JSON string returned by SignedBase64 +func FromSignedBase64(base64String, key string) (Map, error) { + parts := strings.Split(base64String, SignatureSeparator) + if len(parts) != 2 { + return nil, errors.New("objx: Signed base64 string is malformed") + } + + sig := HashWithKey(parts[0], key) + if parts[1] != sig { + return nil, errors.New("objx: Signature for base64 data does not match") + } + return FromBase64(parts[0]) +} + +// MustFromSignedBase64 creates a new Obj containing the data specified +// in the Base64 string and panics if there is an error. +// +// The string is an encoded JSON string returned by Base64 +func MustFromSignedBase64(base64String, key string) Map { + result, err := FromSignedBase64(base64String, key) + if err != nil { + panic("objx: MustFromSignedBase64 failed with error: " + err.Error()) + } + return result +} + +// FromURLQuery generates a new Obj by parsing the specified +// query. +// +// For queries with multiple values, the first value is selected. +func FromURLQuery(query string) (Map, error) { + vals, err := url.ParseQuery(query) + if err != nil { + return nil, err + } + m := Map{} + for k, vals := range vals { + m[k] = vals[0] + } + return m, nil +} + +// MustFromURLQuery generates a new Obj by parsing the specified +// query. +// +// For queries with multiple values, the first value is selected. +// +// Panics if it encounters an error +func MustFromURLQuery(query string) Map { + o, err := FromURLQuery(query) + if err != nil { + panic("objx: MustFromURLQuery failed with error: " + err.Error()) + } + return o +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/objx/mutations.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/objx/mutations.go new file mode 100644 index 00000000..c3400a3f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/objx/mutations.go @@ -0,0 +1,77 @@ +package objx + +// Exclude returns a new Map with the keys in the specified []string +// excluded. +func (m Map) Exclude(exclude []string) Map { + excluded := make(Map) + for k, v := range m { + if !contains(exclude, k) { + excluded[k] = v + } + } + return excluded +} + +// Copy creates a shallow copy of the Obj. +func (m Map) Copy() Map { + copied := Map{} + for k, v := range m { + copied[k] = v + } + return copied +} + +// Merge blends the specified map with a copy of this map and returns the result. +// +// Keys that appear in both will be selected from the specified map. +// This method requires that the wrapped object be a map[string]interface{} +func (m Map) Merge(merge Map) Map { + return m.Copy().MergeHere(merge) +} + +// MergeHere blends the specified map with this map and returns the current map. +// +// Keys that appear in both will be selected from the specified map. The original map +// will be modified. This method requires that +// the wrapped object be a map[string]interface{} +func (m Map) MergeHere(merge Map) Map { + for k, v := range merge { + m[k] = v + } + return m +} + +// Transform builds a new Obj giving the transformer a chance +// to change the keys and values as it goes. This method requires that +// the wrapped object be a map[string]interface{} +func (m Map) Transform(transformer func(key string, value interface{}) (string, interface{})) Map { + newMap := Map{} + for k, v := range m { + modifiedKey, modifiedVal := transformer(k, v) + newMap[modifiedKey] = modifiedVal + } + return newMap +} + +// TransformKeys builds a new map using the specified key mapping. +// +// Unspecified keys will be unaltered. +// This method requires that the wrapped object be a map[string]interface{} +func (m Map) TransformKeys(mapping map[string]string) Map { + return m.Transform(func(key string, value interface{}) (string, interface{}) { + if newKey, ok := mapping[key]; ok { + return newKey, value + } + return key, value + }) +} + +// Checks if a string slice contains a string +func contains(s []string, e string) bool { + for _, a := range s { + if a == e { + return true + } + } + return false +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/objx/security.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/objx/security.go new file mode 100644 index 00000000..692be8e2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/objx/security.go @@ -0,0 +1,12 @@ +package objx + +import ( + "crypto/sha1" + "encoding/hex" +) + +// HashWithKey hashes the specified string using the security key +func HashWithKey(data, key string) string { + d := sha1.Sum([]byte(data + ":" + key)) + return hex.EncodeToString(d[:]) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/objx/tests.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/objx/tests.go new file mode 100644 index 00000000..d9e0b479 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/objx/tests.go @@ -0,0 +1,17 @@ +package objx + +// Has gets whether there is something at the specified selector +// or not. +// +// If m is nil, Has will always return false. +func (m Map) Has(selector string) bool { + if m == nil { + return false + } + return !m.Get(selector).IsNil() +} + +// IsNil gets whether the data is nil or not. +func (v *Value) IsNil() bool { + return v == nil || v.data == nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/objx/type_specific_codegen.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/objx/type_specific_codegen.go new file mode 100644 index 00000000..202a91f8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/objx/type_specific_codegen.go @@ -0,0 +1,2501 @@ +package objx + +/* + Inter (interface{} and []interface{}) +*/ + +// Inter gets the value as a interface{}, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) Inter(optionalDefault ...interface{}) interface{} { + if s, ok := v.data.(interface{}); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustInter gets the value as a interface{}. +// +// Panics if the object is not a interface{}. +func (v *Value) MustInter() interface{} { + return v.data.(interface{}) +} + +// InterSlice gets the value as a []interface{}, returns the optionalDefault +// value or nil if the value is not a []interface{}. +func (v *Value) InterSlice(optionalDefault ...[]interface{}) []interface{} { + if s, ok := v.data.([]interface{}); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustInterSlice gets the value as a []interface{}. +// +// Panics if the object is not a []interface{}. +func (v *Value) MustInterSlice() []interface{} { + return v.data.([]interface{}) +} + +// IsInter gets whether the object contained is a interface{} or not. +func (v *Value) IsInter() bool { + _, ok := v.data.(interface{}) + return ok +} + +// IsInterSlice gets whether the object contained is a []interface{} or not. +func (v *Value) IsInterSlice() bool { + _, ok := v.data.([]interface{}) + return ok +} + +// EachInter calls the specified callback for each object +// in the []interface{}. +// +// Panics if the object is the wrong type. +func (v *Value) EachInter(callback func(int, interface{}) bool) *Value { + for index, val := range v.MustInterSlice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereInter uses the specified decider function to select items +// from the []interface{}. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereInter(decider func(int, interface{}) bool) *Value { + var selected []interface{} + v.EachInter(func(index int, val interface{}) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupInter uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]interface{}. +func (v *Value) GroupInter(grouper func(int, interface{}) string) *Value { + groups := make(map[string][]interface{}) + v.EachInter(func(index int, val interface{}) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]interface{}, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceInter uses the specified function to replace each interface{}s +// by iterating each item. The data in the returned result will be a +// []interface{} containing the replaced items. +func (v *Value) ReplaceInter(replacer func(int, interface{}) interface{}) *Value { + arr := v.MustInterSlice() + replaced := make([]interface{}, len(arr)) + v.EachInter(func(index int, val interface{}) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectInter uses the specified collector function to collect a value +// for each of the interface{}s in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectInter(collector func(int, interface{}) interface{}) *Value { + arr := v.MustInterSlice() + collected := make([]interface{}, len(arr)) + v.EachInter(func(index int, val interface{}) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + MSI (map[string]interface{} and []map[string]interface{}) +*/ + +// MSI gets the value as a map[string]interface{}, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) MSI(optionalDefault ...map[string]interface{}) map[string]interface{} { + if s, ok := v.data.(map[string]interface{}); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustMSI gets the value as a map[string]interface{}. +// +// Panics if the object is not a map[string]interface{}. +func (v *Value) MustMSI() map[string]interface{} { + return v.data.(map[string]interface{}) +} + +// MSISlice gets the value as a []map[string]interface{}, returns the optionalDefault +// value or nil if the value is not a []map[string]interface{}. +func (v *Value) MSISlice(optionalDefault ...[]map[string]interface{}) []map[string]interface{} { + if s, ok := v.data.([]map[string]interface{}); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustMSISlice gets the value as a []map[string]interface{}. +// +// Panics if the object is not a []map[string]interface{}. +func (v *Value) MustMSISlice() []map[string]interface{} { + return v.data.([]map[string]interface{}) +} + +// IsMSI gets whether the object contained is a map[string]interface{} or not. +func (v *Value) IsMSI() bool { + _, ok := v.data.(map[string]interface{}) + return ok +} + +// IsMSISlice gets whether the object contained is a []map[string]interface{} or not. +func (v *Value) IsMSISlice() bool { + _, ok := v.data.([]map[string]interface{}) + return ok +} + +// EachMSI calls the specified callback for each object +// in the []map[string]interface{}. +// +// Panics if the object is the wrong type. +func (v *Value) EachMSI(callback func(int, map[string]interface{}) bool) *Value { + for index, val := range v.MustMSISlice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereMSI uses the specified decider function to select items +// from the []map[string]interface{}. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereMSI(decider func(int, map[string]interface{}) bool) *Value { + var selected []map[string]interface{} + v.EachMSI(func(index int, val map[string]interface{}) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupMSI uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]map[string]interface{}. +func (v *Value) GroupMSI(grouper func(int, map[string]interface{}) string) *Value { + groups := make(map[string][]map[string]interface{}) + v.EachMSI(func(index int, val map[string]interface{}) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]map[string]interface{}, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceMSI uses the specified function to replace each map[string]interface{}s +// by iterating each item. The data in the returned result will be a +// []map[string]interface{} containing the replaced items. +func (v *Value) ReplaceMSI(replacer func(int, map[string]interface{}) map[string]interface{}) *Value { + arr := v.MustMSISlice() + replaced := make([]map[string]interface{}, len(arr)) + v.EachMSI(func(index int, val map[string]interface{}) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectMSI uses the specified collector function to collect a value +// for each of the map[string]interface{}s in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectMSI(collector func(int, map[string]interface{}) interface{}) *Value { + arr := v.MustMSISlice() + collected := make([]interface{}, len(arr)) + v.EachMSI(func(index int, val map[string]interface{}) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + ObjxMap ((Map) and [](Map)) +*/ + +// ObjxMap gets the value as a (Map), returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) ObjxMap(optionalDefault ...(Map)) Map { + if s, ok := v.data.((Map)); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return New(nil) +} + +// MustObjxMap gets the value as a (Map). +// +// Panics if the object is not a (Map). +func (v *Value) MustObjxMap() Map { + return v.data.((Map)) +} + +// ObjxMapSlice gets the value as a [](Map), returns the optionalDefault +// value or nil if the value is not a [](Map). +func (v *Value) ObjxMapSlice(optionalDefault ...[](Map)) [](Map) { + if s, ok := v.data.([](Map)); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustObjxMapSlice gets the value as a [](Map). +// +// Panics if the object is not a [](Map). +func (v *Value) MustObjxMapSlice() [](Map) { + return v.data.([](Map)) +} + +// IsObjxMap gets whether the object contained is a (Map) or not. +func (v *Value) IsObjxMap() bool { + _, ok := v.data.((Map)) + return ok +} + +// IsObjxMapSlice gets whether the object contained is a [](Map) or not. +func (v *Value) IsObjxMapSlice() bool { + _, ok := v.data.([](Map)) + return ok +} + +// EachObjxMap calls the specified callback for each object +// in the [](Map). +// +// Panics if the object is the wrong type. +func (v *Value) EachObjxMap(callback func(int, Map) bool) *Value { + for index, val := range v.MustObjxMapSlice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereObjxMap uses the specified decider function to select items +// from the [](Map). The object contained in the result will contain +// only the selected items. +func (v *Value) WhereObjxMap(decider func(int, Map) bool) *Value { + var selected [](Map) + v.EachObjxMap(func(index int, val Map) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupObjxMap uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][](Map). +func (v *Value) GroupObjxMap(grouper func(int, Map) string) *Value { + groups := make(map[string][](Map)) + v.EachObjxMap(func(index int, val Map) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([](Map), 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceObjxMap uses the specified function to replace each (Map)s +// by iterating each item. The data in the returned result will be a +// [](Map) containing the replaced items. +func (v *Value) ReplaceObjxMap(replacer func(int, Map) Map) *Value { + arr := v.MustObjxMapSlice() + replaced := make([](Map), len(arr)) + v.EachObjxMap(func(index int, val Map) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectObjxMap uses the specified collector function to collect a value +// for each of the (Map)s in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectObjxMap(collector func(int, Map) interface{}) *Value { + arr := v.MustObjxMapSlice() + collected := make([]interface{}, len(arr)) + v.EachObjxMap(func(index int, val Map) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + Bool (bool and []bool) +*/ + +// Bool gets the value as a bool, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) Bool(optionalDefault ...bool) bool { + if s, ok := v.data.(bool); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return false +} + +// MustBool gets the value as a bool. +// +// Panics if the object is not a bool. +func (v *Value) MustBool() bool { + return v.data.(bool) +} + +// BoolSlice gets the value as a []bool, returns the optionalDefault +// value or nil if the value is not a []bool. +func (v *Value) BoolSlice(optionalDefault ...[]bool) []bool { + if s, ok := v.data.([]bool); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustBoolSlice gets the value as a []bool. +// +// Panics if the object is not a []bool. +func (v *Value) MustBoolSlice() []bool { + return v.data.([]bool) +} + +// IsBool gets whether the object contained is a bool or not. +func (v *Value) IsBool() bool { + _, ok := v.data.(bool) + return ok +} + +// IsBoolSlice gets whether the object contained is a []bool or not. +func (v *Value) IsBoolSlice() bool { + _, ok := v.data.([]bool) + return ok +} + +// EachBool calls the specified callback for each object +// in the []bool. +// +// Panics if the object is the wrong type. +func (v *Value) EachBool(callback func(int, bool) bool) *Value { + for index, val := range v.MustBoolSlice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereBool uses the specified decider function to select items +// from the []bool. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereBool(decider func(int, bool) bool) *Value { + var selected []bool + v.EachBool(func(index int, val bool) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupBool uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]bool. +func (v *Value) GroupBool(grouper func(int, bool) string) *Value { + groups := make(map[string][]bool) + v.EachBool(func(index int, val bool) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]bool, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceBool uses the specified function to replace each bools +// by iterating each item. The data in the returned result will be a +// []bool containing the replaced items. +func (v *Value) ReplaceBool(replacer func(int, bool) bool) *Value { + arr := v.MustBoolSlice() + replaced := make([]bool, len(arr)) + v.EachBool(func(index int, val bool) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectBool uses the specified collector function to collect a value +// for each of the bools in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectBool(collector func(int, bool) interface{}) *Value { + arr := v.MustBoolSlice() + collected := make([]interface{}, len(arr)) + v.EachBool(func(index int, val bool) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + Str (string and []string) +*/ + +// Str gets the value as a string, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) Str(optionalDefault ...string) string { + if s, ok := v.data.(string); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return "" +} + +// MustStr gets the value as a string. +// +// Panics if the object is not a string. +func (v *Value) MustStr() string { + return v.data.(string) +} + +// StrSlice gets the value as a []string, returns the optionalDefault +// value or nil if the value is not a []string. +func (v *Value) StrSlice(optionalDefault ...[]string) []string { + if s, ok := v.data.([]string); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustStrSlice gets the value as a []string. +// +// Panics if the object is not a []string. +func (v *Value) MustStrSlice() []string { + return v.data.([]string) +} + +// IsStr gets whether the object contained is a string or not. +func (v *Value) IsStr() bool { + _, ok := v.data.(string) + return ok +} + +// IsStrSlice gets whether the object contained is a []string or not. +func (v *Value) IsStrSlice() bool { + _, ok := v.data.([]string) + return ok +} + +// EachStr calls the specified callback for each object +// in the []string. +// +// Panics if the object is the wrong type. +func (v *Value) EachStr(callback func(int, string) bool) *Value { + for index, val := range v.MustStrSlice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereStr uses the specified decider function to select items +// from the []string. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereStr(decider func(int, string) bool) *Value { + var selected []string + v.EachStr(func(index int, val string) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupStr uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]string. +func (v *Value) GroupStr(grouper func(int, string) string) *Value { + groups := make(map[string][]string) + v.EachStr(func(index int, val string) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]string, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceStr uses the specified function to replace each strings +// by iterating each item. The data in the returned result will be a +// []string containing the replaced items. +func (v *Value) ReplaceStr(replacer func(int, string) string) *Value { + arr := v.MustStrSlice() + replaced := make([]string, len(arr)) + v.EachStr(func(index int, val string) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectStr uses the specified collector function to collect a value +// for each of the strings in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectStr(collector func(int, string) interface{}) *Value { + arr := v.MustStrSlice() + collected := make([]interface{}, len(arr)) + v.EachStr(func(index int, val string) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + Int (int and []int) +*/ + +// Int gets the value as a int, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) Int(optionalDefault ...int) int { + if s, ok := v.data.(int); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return 0 +} + +// MustInt gets the value as a int. +// +// Panics if the object is not a int. +func (v *Value) MustInt() int { + return v.data.(int) +} + +// IntSlice gets the value as a []int, returns the optionalDefault +// value or nil if the value is not a []int. +func (v *Value) IntSlice(optionalDefault ...[]int) []int { + if s, ok := v.data.([]int); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustIntSlice gets the value as a []int. +// +// Panics if the object is not a []int. +func (v *Value) MustIntSlice() []int { + return v.data.([]int) +} + +// IsInt gets whether the object contained is a int or not. +func (v *Value) IsInt() bool { + _, ok := v.data.(int) + return ok +} + +// IsIntSlice gets whether the object contained is a []int or not. +func (v *Value) IsIntSlice() bool { + _, ok := v.data.([]int) + return ok +} + +// EachInt calls the specified callback for each object +// in the []int. +// +// Panics if the object is the wrong type. +func (v *Value) EachInt(callback func(int, int) bool) *Value { + for index, val := range v.MustIntSlice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereInt uses the specified decider function to select items +// from the []int. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereInt(decider func(int, int) bool) *Value { + var selected []int + v.EachInt(func(index int, val int) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupInt uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]int. +func (v *Value) GroupInt(grouper func(int, int) string) *Value { + groups := make(map[string][]int) + v.EachInt(func(index int, val int) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]int, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceInt uses the specified function to replace each ints +// by iterating each item. The data in the returned result will be a +// []int containing the replaced items. +func (v *Value) ReplaceInt(replacer func(int, int) int) *Value { + arr := v.MustIntSlice() + replaced := make([]int, len(arr)) + v.EachInt(func(index int, val int) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectInt uses the specified collector function to collect a value +// for each of the ints in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectInt(collector func(int, int) interface{}) *Value { + arr := v.MustIntSlice() + collected := make([]interface{}, len(arr)) + v.EachInt(func(index int, val int) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + Int8 (int8 and []int8) +*/ + +// Int8 gets the value as a int8, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) Int8(optionalDefault ...int8) int8 { + if s, ok := v.data.(int8); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return 0 +} + +// MustInt8 gets the value as a int8. +// +// Panics if the object is not a int8. +func (v *Value) MustInt8() int8 { + return v.data.(int8) +} + +// Int8Slice gets the value as a []int8, returns the optionalDefault +// value or nil if the value is not a []int8. +func (v *Value) Int8Slice(optionalDefault ...[]int8) []int8 { + if s, ok := v.data.([]int8); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustInt8Slice gets the value as a []int8. +// +// Panics if the object is not a []int8. +func (v *Value) MustInt8Slice() []int8 { + return v.data.([]int8) +} + +// IsInt8 gets whether the object contained is a int8 or not. +func (v *Value) IsInt8() bool { + _, ok := v.data.(int8) + return ok +} + +// IsInt8Slice gets whether the object contained is a []int8 or not. +func (v *Value) IsInt8Slice() bool { + _, ok := v.data.([]int8) + return ok +} + +// EachInt8 calls the specified callback for each object +// in the []int8. +// +// Panics if the object is the wrong type. +func (v *Value) EachInt8(callback func(int, int8) bool) *Value { + for index, val := range v.MustInt8Slice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereInt8 uses the specified decider function to select items +// from the []int8. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereInt8(decider func(int, int8) bool) *Value { + var selected []int8 + v.EachInt8(func(index int, val int8) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupInt8 uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]int8. +func (v *Value) GroupInt8(grouper func(int, int8) string) *Value { + groups := make(map[string][]int8) + v.EachInt8(func(index int, val int8) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]int8, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceInt8 uses the specified function to replace each int8s +// by iterating each item. The data in the returned result will be a +// []int8 containing the replaced items. +func (v *Value) ReplaceInt8(replacer func(int, int8) int8) *Value { + arr := v.MustInt8Slice() + replaced := make([]int8, len(arr)) + v.EachInt8(func(index int, val int8) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectInt8 uses the specified collector function to collect a value +// for each of the int8s in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectInt8(collector func(int, int8) interface{}) *Value { + arr := v.MustInt8Slice() + collected := make([]interface{}, len(arr)) + v.EachInt8(func(index int, val int8) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + Int16 (int16 and []int16) +*/ + +// Int16 gets the value as a int16, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) Int16(optionalDefault ...int16) int16 { + if s, ok := v.data.(int16); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return 0 +} + +// MustInt16 gets the value as a int16. +// +// Panics if the object is not a int16. +func (v *Value) MustInt16() int16 { + return v.data.(int16) +} + +// Int16Slice gets the value as a []int16, returns the optionalDefault +// value or nil if the value is not a []int16. +func (v *Value) Int16Slice(optionalDefault ...[]int16) []int16 { + if s, ok := v.data.([]int16); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustInt16Slice gets the value as a []int16. +// +// Panics if the object is not a []int16. +func (v *Value) MustInt16Slice() []int16 { + return v.data.([]int16) +} + +// IsInt16 gets whether the object contained is a int16 or not. +func (v *Value) IsInt16() bool { + _, ok := v.data.(int16) + return ok +} + +// IsInt16Slice gets whether the object contained is a []int16 or not. +func (v *Value) IsInt16Slice() bool { + _, ok := v.data.([]int16) + return ok +} + +// EachInt16 calls the specified callback for each object +// in the []int16. +// +// Panics if the object is the wrong type. +func (v *Value) EachInt16(callback func(int, int16) bool) *Value { + for index, val := range v.MustInt16Slice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereInt16 uses the specified decider function to select items +// from the []int16. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereInt16(decider func(int, int16) bool) *Value { + var selected []int16 + v.EachInt16(func(index int, val int16) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupInt16 uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]int16. +func (v *Value) GroupInt16(grouper func(int, int16) string) *Value { + groups := make(map[string][]int16) + v.EachInt16(func(index int, val int16) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]int16, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceInt16 uses the specified function to replace each int16s +// by iterating each item. The data in the returned result will be a +// []int16 containing the replaced items. +func (v *Value) ReplaceInt16(replacer func(int, int16) int16) *Value { + arr := v.MustInt16Slice() + replaced := make([]int16, len(arr)) + v.EachInt16(func(index int, val int16) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectInt16 uses the specified collector function to collect a value +// for each of the int16s in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectInt16(collector func(int, int16) interface{}) *Value { + arr := v.MustInt16Slice() + collected := make([]interface{}, len(arr)) + v.EachInt16(func(index int, val int16) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + Int32 (int32 and []int32) +*/ + +// Int32 gets the value as a int32, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) Int32(optionalDefault ...int32) int32 { + if s, ok := v.data.(int32); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return 0 +} + +// MustInt32 gets the value as a int32. +// +// Panics if the object is not a int32. +func (v *Value) MustInt32() int32 { + return v.data.(int32) +} + +// Int32Slice gets the value as a []int32, returns the optionalDefault +// value or nil if the value is not a []int32. +func (v *Value) Int32Slice(optionalDefault ...[]int32) []int32 { + if s, ok := v.data.([]int32); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustInt32Slice gets the value as a []int32. +// +// Panics if the object is not a []int32. +func (v *Value) MustInt32Slice() []int32 { + return v.data.([]int32) +} + +// IsInt32 gets whether the object contained is a int32 or not. +func (v *Value) IsInt32() bool { + _, ok := v.data.(int32) + return ok +} + +// IsInt32Slice gets whether the object contained is a []int32 or not. +func (v *Value) IsInt32Slice() bool { + _, ok := v.data.([]int32) + return ok +} + +// EachInt32 calls the specified callback for each object +// in the []int32. +// +// Panics if the object is the wrong type. +func (v *Value) EachInt32(callback func(int, int32) bool) *Value { + for index, val := range v.MustInt32Slice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereInt32 uses the specified decider function to select items +// from the []int32. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereInt32(decider func(int, int32) bool) *Value { + var selected []int32 + v.EachInt32(func(index int, val int32) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupInt32 uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]int32. +func (v *Value) GroupInt32(grouper func(int, int32) string) *Value { + groups := make(map[string][]int32) + v.EachInt32(func(index int, val int32) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]int32, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceInt32 uses the specified function to replace each int32s +// by iterating each item. The data in the returned result will be a +// []int32 containing the replaced items. +func (v *Value) ReplaceInt32(replacer func(int, int32) int32) *Value { + arr := v.MustInt32Slice() + replaced := make([]int32, len(arr)) + v.EachInt32(func(index int, val int32) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectInt32 uses the specified collector function to collect a value +// for each of the int32s in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectInt32(collector func(int, int32) interface{}) *Value { + arr := v.MustInt32Slice() + collected := make([]interface{}, len(arr)) + v.EachInt32(func(index int, val int32) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + Int64 (int64 and []int64) +*/ + +// Int64 gets the value as a int64, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) Int64(optionalDefault ...int64) int64 { + if s, ok := v.data.(int64); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return 0 +} + +// MustInt64 gets the value as a int64. +// +// Panics if the object is not a int64. +func (v *Value) MustInt64() int64 { + return v.data.(int64) +} + +// Int64Slice gets the value as a []int64, returns the optionalDefault +// value or nil if the value is not a []int64. +func (v *Value) Int64Slice(optionalDefault ...[]int64) []int64 { + if s, ok := v.data.([]int64); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustInt64Slice gets the value as a []int64. +// +// Panics if the object is not a []int64. +func (v *Value) MustInt64Slice() []int64 { + return v.data.([]int64) +} + +// IsInt64 gets whether the object contained is a int64 or not. +func (v *Value) IsInt64() bool { + _, ok := v.data.(int64) + return ok +} + +// IsInt64Slice gets whether the object contained is a []int64 or not. +func (v *Value) IsInt64Slice() bool { + _, ok := v.data.([]int64) + return ok +} + +// EachInt64 calls the specified callback for each object +// in the []int64. +// +// Panics if the object is the wrong type. +func (v *Value) EachInt64(callback func(int, int64) bool) *Value { + for index, val := range v.MustInt64Slice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereInt64 uses the specified decider function to select items +// from the []int64. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereInt64(decider func(int, int64) bool) *Value { + var selected []int64 + v.EachInt64(func(index int, val int64) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupInt64 uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]int64. +func (v *Value) GroupInt64(grouper func(int, int64) string) *Value { + groups := make(map[string][]int64) + v.EachInt64(func(index int, val int64) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]int64, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceInt64 uses the specified function to replace each int64s +// by iterating each item. The data in the returned result will be a +// []int64 containing the replaced items. +func (v *Value) ReplaceInt64(replacer func(int, int64) int64) *Value { + arr := v.MustInt64Slice() + replaced := make([]int64, len(arr)) + v.EachInt64(func(index int, val int64) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectInt64 uses the specified collector function to collect a value +// for each of the int64s in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectInt64(collector func(int, int64) interface{}) *Value { + arr := v.MustInt64Slice() + collected := make([]interface{}, len(arr)) + v.EachInt64(func(index int, val int64) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + Uint (uint and []uint) +*/ + +// Uint gets the value as a uint, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) Uint(optionalDefault ...uint) uint { + if s, ok := v.data.(uint); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return 0 +} + +// MustUint gets the value as a uint. +// +// Panics if the object is not a uint. +func (v *Value) MustUint() uint { + return v.data.(uint) +} + +// UintSlice gets the value as a []uint, returns the optionalDefault +// value or nil if the value is not a []uint. +func (v *Value) UintSlice(optionalDefault ...[]uint) []uint { + if s, ok := v.data.([]uint); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustUintSlice gets the value as a []uint. +// +// Panics if the object is not a []uint. +func (v *Value) MustUintSlice() []uint { + return v.data.([]uint) +} + +// IsUint gets whether the object contained is a uint or not. +func (v *Value) IsUint() bool { + _, ok := v.data.(uint) + return ok +} + +// IsUintSlice gets whether the object contained is a []uint or not. +func (v *Value) IsUintSlice() bool { + _, ok := v.data.([]uint) + return ok +} + +// EachUint calls the specified callback for each object +// in the []uint. +// +// Panics if the object is the wrong type. +func (v *Value) EachUint(callback func(int, uint) bool) *Value { + for index, val := range v.MustUintSlice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereUint uses the specified decider function to select items +// from the []uint. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereUint(decider func(int, uint) bool) *Value { + var selected []uint + v.EachUint(func(index int, val uint) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupUint uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]uint. +func (v *Value) GroupUint(grouper func(int, uint) string) *Value { + groups := make(map[string][]uint) + v.EachUint(func(index int, val uint) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]uint, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceUint uses the specified function to replace each uints +// by iterating each item. The data in the returned result will be a +// []uint containing the replaced items. +func (v *Value) ReplaceUint(replacer func(int, uint) uint) *Value { + arr := v.MustUintSlice() + replaced := make([]uint, len(arr)) + v.EachUint(func(index int, val uint) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectUint uses the specified collector function to collect a value +// for each of the uints in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectUint(collector func(int, uint) interface{}) *Value { + arr := v.MustUintSlice() + collected := make([]interface{}, len(arr)) + v.EachUint(func(index int, val uint) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + Uint8 (uint8 and []uint8) +*/ + +// Uint8 gets the value as a uint8, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) Uint8(optionalDefault ...uint8) uint8 { + if s, ok := v.data.(uint8); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return 0 +} + +// MustUint8 gets the value as a uint8. +// +// Panics if the object is not a uint8. +func (v *Value) MustUint8() uint8 { + return v.data.(uint8) +} + +// Uint8Slice gets the value as a []uint8, returns the optionalDefault +// value or nil if the value is not a []uint8. +func (v *Value) Uint8Slice(optionalDefault ...[]uint8) []uint8 { + if s, ok := v.data.([]uint8); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustUint8Slice gets the value as a []uint8. +// +// Panics if the object is not a []uint8. +func (v *Value) MustUint8Slice() []uint8 { + return v.data.([]uint8) +} + +// IsUint8 gets whether the object contained is a uint8 or not. +func (v *Value) IsUint8() bool { + _, ok := v.data.(uint8) + return ok +} + +// IsUint8Slice gets whether the object contained is a []uint8 or not. +func (v *Value) IsUint8Slice() bool { + _, ok := v.data.([]uint8) + return ok +} + +// EachUint8 calls the specified callback for each object +// in the []uint8. +// +// Panics if the object is the wrong type. +func (v *Value) EachUint8(callback func(int, uint8) bool) *Value { + for index, val := range v.MustUint8Slice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereUint8 uses the specified decider function to select items +// from the []uint8. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereUint8(decider func(int, uint8) bool) *Value { + var selected []uint8 + v.EachUint8(func(index int, val uint8) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupUint8 uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]uint8. +func (v *Value) GroupUint8(grouper func(int, uint8) string) *Value { + groups := make(map[string][]uint8) + v.EachUint8(func(index int, val uint8) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]uint8, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceUint8 uses the specified function to replace each uint8s +// by iterating each item. The data in the returned result will be a +// []uint8 containing the replaced items. +func (v *Value) ReplaceUint8(replacer func(int, uint8) uint8) *Value { + arr := v.MustUint8Slice() + replaced := make([]uint8, len(arr)) + v.EachUint8(func(index int, val uint8) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectUint8 uses the specified collector function to collect a value +// for each of the uint8s in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectUint8(collector func(int, uint8) interface{}) *Value { + arr := v.MustUint8Slice() + collected := make([]interface{}, len(arr)) + v.EachUint8(func(index int, val uint8) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + Uint16 (uint16 and []uint16) +*/ + +// Uint16 gets the value as a uint16, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) Uint16(optionalDefault ...uint16) uint16 { + if s, ok := v.data.(uint16); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return 0 +} + +// MustUint16 gets the value as a uint16. +// +// Panics if the object is not a uint16. +func (v *Value) MustUint16() uint16 { + return v.data.(uint16) +} + +// Uint16Slice gets the value as a []uint16, returns the optionalDefault +// value or nil if the value is not a []uint16. +func (v *Value) Uint16Slice(optionalDefault ...[]uint16) []uint16 { + if s, ok := v.data.([]uint16); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustUint16Slice gets the value as a []uint16. +// +// Panics if the object is not a []uint16. +func (v *Value) MustUint16Slice() []uint16 { + return v.data.([]uint16) +} + +// IsUint16 gets whether the object contained is a uint16 or not. +func (v *Value) IsUint16() bool { + _, ok := v.data.(uint16) + return ok +} + +// IsUint16Slice gets whether the object contained is a []uint16 or not. +func (v *Value) IsUint16Slice() bool { + _, ok := v.data.([]uint16) + return ok +} + +// EachUint16 calls the specified callback for each object +// in the []uint16. +// +// Panics if the object is the wrong type. +func (v *Value) EachUint16(callback func(int, uint16) bool) *Value { + for index, val := range v.MustUint16Slice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereUint16 uses the specified decider function to select items +// from the []uint16. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereUint16(decider func(int, uint16) bool) *Value { + var selected []uint16 + v.EachUint16(func(index int, val uint16) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupUint16 uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]uint16. +func (v *Value) GroupUint16(grouper func(int, uint16) string) *Value { + groups := make(map[string][]uint16) + v.EachUint16(func(index int, val uint16) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]uint16, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceUint16 uses the specified function to replace each uint16s +// by iterating each item. The data in the returned result will be a +// []uint16 containing the replaced items. +func (v *Value) ReplaceUint16(replacer func(int, uint16) uint16) *Value { + arr := v.MustUint16Slice() + replaced := make([]uint16, len(arr)) + v.EachUint16(func(index int, val uint16) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectUint16 uses the specified collector function to collect a value +// for each of the uint16s in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectUint16(collector func(int, uint16) interface{}) *Value { + arr := v.MustUint16Slice() + collected := make([]interface{}, len(arr)) + v.EachUint16(func(index int, val uint16) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + Uint32 (uint32 and []uint32) +*/ + +// Uint32 gets the value as a uint32, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) Uint32(optionalDefault ...uint32) uint32 { + if s, ok := v.data.(uint32); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return 0 +} + +// MustUint32 gets the value as a uint32. +// +// Panics if the object is not a uint32. +func (v *Value) MustUint32() uint32 { + return v.data.(uint32) +} + +// Uint32Slice gets the value as a []uint32, returns the optionalDefault +// value or nil if the value is not a []uint32. +func (v *Value) Uint32Slice(optionalDefault ...[]uint32) []uint32 { + if s, ok := v.data.([]uint32); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustUint32Slice gets the value as a []uint32. +// +// Panics if the object is not a []uint32. +func (v *Value) MustUint32Slice() []uint32 { + return v.data.([]uint32) +} + +// IsUint32 gets whether the object contained is a uint32 or not. +func (v *Value) IsUint32() bool { + _, ok := v.data.(uint32) + return ok +} + +// IsUint32Slice gets whether the object contained is a []uint32 or not. +func (v *Value) IsUint32Slice() bool { + _, ok := v.data.([]uint32) + return ok +} + +// EachUint32 calls the specified callback for each object +// in the []uint32. +// +// Panics if the object is the wrong type. +func (v *Value) EachUint32(callback func(int, uint32) bool) *Value { + for index, val := range v.MustUint32Slice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereUint32 uses the specified decider function to select items +// from the []uint32. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereUint32(decider func(int, uint32) bool) *Value { + var selected []uint32 + v.EachUint32(func(index int, val uint32) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupUint32 uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]uint32. +func (v *Value) GroupUint32(grouper func(int, uint32) string) *Value { + groups := make(map[string][]uint32) + v.EachUint32(func(index int, val uint32) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]uint32, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceUint32 uses the specified function to replace each uint32s +// by iterating each item. The data in the returned result will be a +// []uint32 containing the replaced items. +func (v *Value) ReplaceUint32(replacer func(int, uint32) uint32) *Value { + arr := v.MustUint32Slice() + replaced := make([]uint32, len(arr)) + v.EachUint32(func(index int, val uint32) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectUint32 uses the specified collector function to collect a value +// for each of the uint32s in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectUint32(collector func(int, uint32) interface{}) *Value { + arr := v.MustUint32Slice() + collected := make([]interface{}, len(arr)) + v.EachUint32(func(index int, val uint32) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + Uint64 (uint64 and []uint64) +*/ + +// Uint64 gets the value as a uint64, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) Uint64(optionalDefault ...uint64) uint64 { + if s, ok := v.data.(uint64); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return 0 +} + +// MustUint64 gets the value as a uint64. +// +// Panics if the object is not a uint64. +func (v *Value) MustUint64() uint64 { + return v.data.(uint64) +} + +// Uint64Slice gets the value as a []uint64, returns the optionalDefault +// value or nil if the value is not a []uint64. +func (v *Value) Uint64Slice(optionalDefault ...[]uint64) []uint64 { + if s, ok := v.data.([]uint64); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustUint64Slice gets the value as a []uint64. +// +// Panics if the object is not a []uint64. +func (v *Value) MustUint64Slice() []uint64 { + return v.data.([]uint64) +} + +// IsUint64 gets whether the object contained is a uint64 or not. +func (v *Value) IsUint64() bool { + _, ok := v.data.(uint64) + return ok +} + +// IsUint64Slice gets whether the object contained is a []uint64 or not. +func (v *Value) IsUint64Slice() bool { + _, ok := v.data.([]uint64) + return ok +} + +// EachUint64 calls the specified callback for each object +// in the []uint64. +// +// Panics if the object is the wrong type. +func (v *Value) EachUint64(callback func(int, uint64) bool) *Value { + for index, val := range v.MustUint64Slice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereUint64 uses the specified decider function to select items +// from the []uint64. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereUint64(decider func(int, uint64) bool) *Value { + var selected []uint64 + v.EachUint64(func(index int, val uint64) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupUint64 uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]uint64. +func (v *Value) GroupUint64(grouper func(int, uint64) string) *Value { + groups := make(map[string][]uint64) + v.EachUint64(func(index int, val uint64) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]uint64, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceUint64 uses the specified function to replace each uint64s +// by iterating each item. The data in the returned result will be a +// []uint64 containing the replaced items. +func (v *Value) ReplaceUint64(replacer func(int, uint64) uint64) *Value { + arr := v.MustUint64Slice() + replaced := make([]uint64, len(arr)) + v.EachUint64(func(index int, val uint64) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectUint64 uses the specified collector function to collect a value +// for each of the uint64s in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectUint64(collector func(int, uint64) interface{}) *Value { + arr := v.MustUint64Slice() + collected := make([]interface{}, len(arr)) + v.EachUint64(func(index int, val uint64) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + Uintptr (uintptr and []uintptr) +*/ + +// Uintptr gets the value as a uintptr, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) Uintptr(optionalDefault ...uintptr) uintptr { + if s, ok := v.data.(uintptr); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return 0 +} + +// MustUintptr gets the value as a uintptr. +// +// Panics if the object is not a uintptr. +func (v *Value) MustUintptr() uintptr { + return v.data.(uintptr) +} + +// UintptrSlice gets the value as a []uintptr, returns the optionalDefault +// value or nil if the value is not a []uintptr. +func (v *Value) UintptrSlice(optionalDefault ...[]uintptr) []uintptr { + if s, ok := v.data.([]uintptr); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustUintptrSlice gets the value as a []uintptr. +// +// Panics if the object is not a []uintptr. +func (v *Value) MustUintptrSlice() []uintptr { + return v.data.([]uintptr) +} + +// IsUintptr gets whether the object contained is a uintptr or not. +func (v *Value) IsUintptr() bool { + _, ok := v.data.(uintptr) + return ok +} + +// IsUintptrSlice gets whether the object contained is a []uintptr or not. +func (v *Value) IsUintptrSlice() bool { + _, ok := v.data.([]uintptr) + return ok +} + +// EachUintptr calls the specified callback for each object +// in the []uintptr. +// +// Panics if the object is the wrong type. +func (v *Value) EachUintptr(callback func(int, uintptr) bool) *Value { + for index, val := range v.MustUintptrSlice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereUintptr uses the specified decider function to select items +// from the []uintptr. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereUintptr(decider func(int, uintptr) bool) *Value { + var selected []uintptr + v.EachUintptr(func(index int, val uintptr) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupUintptr uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]uintptr. +func (v *Value) GroupUintptr(grouper func(int, uintptr) string) *Value { + groups := make(map[string][]uintptr) + v.EachUintptr(func(index int, val uintptr) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]uintptr, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceUintptr uses the specified function to replace each uintptrs +// by iterating each item. The data in the returned result will be a +// []uintptr containing the replaced items. +func (v *Value) ReplaceUintptr(replacer func(int, uintptr) uintptr) *Value { + arr := v.MustUintptrSlice() + replaced := make([]uintptr, len(arr)) + v.EachUintptr(func(index int, val uintptr) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectUintptr uses the specified collector function to collect a value +// for each of the uintptrs in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectUintptr(collector func(int, uintptr) interface{}) *Value { + arr := v.MustUintptrSlice() + collected := make([]interface{}, len(arr)) + v.EachUintptr(func(index int, val uintptr) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + Float32 (float32 and []float32) +*/ + +// Float32 gets the value as a float32, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) Float32(optionalDefault ...float32) float32 { + if s, ok := v.data.(float32); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return 0 +} + +// MustFloat32 gets the value as a float32. +// +// Panics if the object is not a float32. +func (v *Value) MustFloat32() float32 { + return v.data.(float32) +} + +// Float32Slice gets the value as a []float32, returns the optionalDefault +// value or nil if the value is not a []float32. +func (v *Value) Float32Slice(optionalDefault ...[]float32) []float32 { + if s, ok := v.data.([]float32); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustFloat32Slice gets the value as a []float32. +// +// Panics if the object is not a []float32. +func (v *Value) MustFloat32Slice() []float32 { + return v.data.([]float32) +} + +// IsFloat32 gets whether the object contained is a float32 or not. +func (v *Value) IsFloat32() bool { + _, ok := v.data.(float32) + return ok +} + +// IsFloat32Slice gets whether the object contained is a []float32 or not. +func (v *Value) IsFloat32Slice() bool { + _, ok := v.data.([]float32) + return ok +} + +// EachFloat32 calls the specified callback for each object +// in the []float32. +// +// Panics if the object is the wrong type. +func (v *Value) EachFloat32(callback func(int, float32) bool) *Value { + for index, val := range v.MustFloat32Slice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereFloat32 uses the specified decider function to select items +// from the []float32. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereFloat32(decider func(int, float32) bool) *Value { + var selected []float32 + v.EachFloat32(func(index int, val float32) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupFloat32 uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]float32. +func (v *Value) GroupFloat32(grouper func(int, float32) string) *Value { + groups := make(map[string][]float32) + v.EachFloat32(func(index int, val float32) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]float32, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceFloat32 uses the specified function to replace each float32s +// by iterating each item. The data in the returned result will be a +// []float32 containing the replaced items. +func (v *Value) ReplaceFloat32(replacer func(int, float32) float32) *Value { + arr := v.MustFloat32Slice() + replaced := make([]float32, len(arr)) + v.EachFloat32(func(index int, val float32) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectFloat32 uses the specified collector function to collect a value +// for each of the float32s in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectFloat32(collector func(int, float32) interface{}) *Value { + arr := v.MustFloat32Slice() + collected := make([]interface{}, len(arr)) + v.EachFloat32(func(index int, val float32) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + Float64 (float64 and []float64) +*/ + +// Float64 gets the value as a float64, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) Float64(optionalDefault ...float64) float64 { + if s, ok := v.data.(float64); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return 0 +} + +// MustFloat64 gets the value as a float64. +// +// Panics if the object is not a float64. +func (v *Value) MustFloat64() float64 { + return v.data.(float64) +} + +// Float64Slice gets the value as a []float64, returns the optionalDefault +// value or nil if the value is not a []float64. +func (v *Value) Float64Slice(optionalDefault ...[]float64) []float64 { + if s, ok := v.data.([]float64); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustFloat64Slice gets the value as a []float64. +// +// Panics if the object is not a []float64. +func (v *Value) MustFloat64Slice() []float64 { + return v.data.([]float64) +} + +// IsFloat64 gets whether the object contained is a float64 or not. +func (v *Value) IsFloat64() bool { + _, ok := v.data.(float64) + return ok +} + +// IsFloat64Slice gets whether the object contained is a []float64 or not. +func (v *Value) IsFloat64Slice() bool { + _, ok := v.data.([]float64) + return ok +} + +// EachFloat64 calls the specified callback for each object +// in the []float64. +// +// Panics if the object is the wrong type. +func (v *Value) EachFloat64(callback func(int, float64) bool) *Value { + for index, val := range v.MustFloat64Slice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereFloat64 uses the specified decider function to select items +// from the []float64. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereFloat64(decider func(int, float64) bool) *Value { + var selected []float64 + v.EachFloat64(func(index int, val float64) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupFloat64 uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]float64. +func (v *Value) GroupFloat64(grouper func(int, float64) string) *Value { + groups := make(map[string][]float64) + v.EachFloat64(func(index int, val float64) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]float64, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceFloat64 uses the specified function to replace each float64s +// by iterating each item. The data in the returned result will be a +// []float64 containing the replaced items. +func (v *Value) ReplaceFloat64(replacer func(int, float64) float64) *Value { + arr := v.MustFloat64Slice() + replaced := make([]float64, len(arr)) + v.EachFloat64(func(index int, val float64) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectFloat64 uses the specified collector function to collect a value +// for each of the float64s in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectFloat64(collector func(int, float64) interface{}) *Value { + arr := v.MustFloat64Slice() + collected := make([]interface{}, len(arr)) + v.EachFloat64(func(index int, val float64) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + Complex64 (complex64 and []complex64) +*/ + +// Complex64 gets the value as a complex64, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) Complex64(optionalDefault ...complex64) complex64 { + if s, ok := v.data.(complex64); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return 0 +} + +// MustComplex64 gets the value as a complex64. +// +// Panics if the object is not a complex64. +func (v *Value) MustComplex64() complex64 { + return v.data.(complex64) +} + +// Complex64Slice gets the value as a []complex64, returns the optionalDefault +// value or nil if the value is not a []complex64. +func (v *Value) Complex64Slice(optionalDefault ...[]complex64) []complex64 { + if s, ok := v.data.([]complex64); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustComplex64Slice gets the value as a []complex64. +// +// Panics if the object is not a []complex64. +func (v *Value) MustComplex64Slice() []complex64 { + return v.data.([]complex64) +} + +// IsComplex64 gets whether the object contained is a complex64 or not. +func (v *Value) IsComplex64() bool { + _, ok := v.data.(complex64) + return ok +} + +// IsComplex64Slice gets whether the object contained is a []complex64 or not. +func (v *Value) IsComplex64Slice() bool { + _, ok := v.data.([]complex64) + return ok +} + +// EachComplex64 calls the specified callback for each object +// in the []complex64. +// +// Panics if the object is the wrong type. +func (v *Value) EachComplex64(callback func(int, complex64) bool) *Value { + for index, val := range v.MustComplex64Slice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereComplex64 uses the specified decider function to select items +// from the []complex64. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereComplex64(decider func(int, complex64) bool) *Value { + var selected []complex64 + v.EachComplex64(func(index int, val complex64) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupComplex64 uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]complex64. +func (v *Value) GroupComplex64(grouper func(int, complex64) string) *Value { + groups := make(map[string][]complex64) + v.EachComplex64(func(index int, val complex64) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]complex64, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceComplex64 uses the specified function to replace each complex64s +// by iterating each item. The data in the returned result will be a +// []complex64 containing the replaced items. +func (v *Value) ReplaceComplex64(replacer func(int, complex64) complex64) *Value { + arr := v.MustComplex64Slice() + replaced := make([]complex64, len(arr)) + v.EachComplex64(func(index int, val complex64) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectComplex64 uses the specified collector function to collect a value +// for each of the complex64s in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectComplex64(collector func(int, complex64) interface{}) *Value { + arr := v.MustComplex64Slice() + collected := make([]interface{}, len(arr)) + v.EachComplex64(func(index int, val complex64) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + Complex128 (complex128 and []complex128) +*/ + +// Complex128 gets the value as a complex128, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) Complex128(optionalDefault ...complex128) complex128 { + if s, ok := v.data.(complex128); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return 0 +} + +// MustComplex128 gets the value as a complex128. +// +// Panics if the object is not a complex128. +func (v *Value) MustComplex128() complex128 { + return v.data.(complex128) +} + +// Complex128Slice gets the value as a []complex128, returns the optionalDefault +// value or nil if the value is not a []complex128. +func (v *Value) Complex128Slice(optionalDefault ...[]complex128) []complex128 { + if s, ok := v.data.([]complex128); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustComplex128Slice gets the value as a []complex128. +// +// Panics if the object is not a []complex128. +func (v *Value) MustComplex128Slice() []complex128 { + return v.data.([]complex128) +} + +// IsComplex128 gets whether the object contained is a complex128 or not. +func (v *Value) IsComplex128() bool { + _, ok := v.data.(complex128) + return ok +} + +// IsComplex128Slice gets whether the object contained is a []complex128 or not. +func (v *Value) IsComplex128Slice() bool { + _, ok := v.data.([]complex128) + return ok +} + +// EachComplex128 calls the specified callback for each object +// in the []complex128. +// +// Panics if the object is the wrong type. +func (v *Value) EachComplex128(callback func(int, complex128) bool) *Value { + for index, val := range v.MustComplex128Slice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereComplex128 uses the specified decider function to select items +// from the []complex128. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereComplex128(decider func(int, complex128) bool) *Value { + var selected []complex128 + v.EachComplex128(func(index int, val complex128) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupComplex128 uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]complex128. +func (v *Value) GroupComplex128(grouper func(int, complex128) string) *Value { + groups := make(map[string][]complex128) + v.EachComplex128(func(index int, val complex128) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]complex128, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceComplex128 uses the specified function to replace each complex128s +// by iterating each item. The data in the returned result will be a +// []complex128 containing the replaced items. +func (v *Value) ReplaceComplex128(replacer func(int, complex128) complex128) *Value { + arr := v.MustComplex128Slice() + replaced := make([]complex128, len(arr)) + v.EachComplex128(func(index int, val complex128) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectComplex128 uses the specified collector function to collect a value +// for each of the complex128s in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectComplex128(collector func(int, complex128) interface{}) *Value { + arr := v.MustComplex128Slice() + collected := make([]interface{}, len(arr)) + v.EachComplex128(func(index int, val complex128) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/objx/value.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/objx/value.go new file mode 100644 index 00000000..e4b4a143 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/objx/value.go @@ -0,0 +1,53 @@ +package objx + +import ( + "fmt" + "strconv" +) + +// Value provides methods for extracting interface{} data in various +// types. +type Value struct { + // data contains the raw data being managed by this Value + data interface{} +} + +// Data returns the raw data contained by this Value +func (v *Value) Data() interface{} { + return v.data +} + +// String returns the value always as a string +func (v *Value) String() string { + switch { + case v.IsStr(): + return v.Str() + case v.IsBool(): + return strconv.FormatBool(v.Bool()) + case v.IsFloat32(): + return strconv.FormatFloat(float64(v.Float32()), 'f', -1, 32) + case v.IsFloat64(): + return strconv.FormatFloat(v.Float64(), 'f', -1, 64) + case v.IsInt(): + return strconv.FormatInt(int64(v.Int()), 10) + case v.IsInt8(): + return strconv.FormatInt(int64(v.Int8()), 10) + case v.IsInt16(): + return strconv.FormatInt(int64(v.Int16()), 10) + case v.IsInt32(): + return strconv.FormatInt(int64(v.Int32()), 10) + case v.IsInt64(): + return strconv.FormatInt(v.Int64(), 10) + case v.IsUint(): + return strconv.FormatUint(uint64(v.Uint()), 10) + case v.IsUint8(): + return strconv.FormatUint(uint64(v.Uint8()), 10) + case v.IsUint16(): + return strconv.FormatUint(uint64(v.Uint16()), 10) + case v.IsUint32(): + return strconv.FormatUint(uint64(v.Uint32()), 10) + case v.IsUint64(): + return strconv.FormatUint(v.Uint64(), 10) + } + return fmt.Sprintf("%#v", v.Data()) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/testify/LICENCE.txt b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/testify/LICENCE.txt new file mode 100644 index 00000000..473b670a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/testify/LICENCE.txt @@ -0,0 +1,22 @@ +Copyright (c) 2012 - 2013 Mat Ryer and Tyler Bunnell + +Please consider promoting this project if you find it useful. + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, +and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT +OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE +OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/testify/LICENSE b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/testify/LICENSE new file mode 100644 index 00000000..473b670a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/testify/LICENSE @@ -0,0 +1,22 @@ +Copyright (c) 2012 - 2013 Mat Ryer and Tyler Bunnell + +Please consider promoting this project if you find it useful. + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, +and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT +OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE +OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/testify/assert/assertion_format.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/testify/assert/assertion_format.go new file mode 100644 index 00000000..23838c4c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/testify/assert/assertion_format.go @@ -0,0 +1,379 @@ +/* +* CODE GENERATED AUTOMATICALLY WITH github.com/stretchr/testify/_codegen +* THIS FILE MUST NOT BE EDITED BY HAND + */ + +package assert + +import ( + http "net/http" + url "net/url" + time "time" +) + +// Conditionf uses a Comparison to assert a complex condition. +func Conditionf(t TestingT, comp Comparison, msg string, args ...interface{}) bool { + return Condition(t, comp, append([]interface{}{msg}, args...)...) +} + +// Containsf asserts that the specified string, list(array, slice...) or map contains the +// specified substring or element. +// +// assert.Containsf(t, "Hello World", "World", "error message %s", "formatted") +// assert.Containsf(t, ["Hello", "World"], "World", "error message %s", "formatted") +// assert.Containsf(t, {"Hello": "World"}, "Hello", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func Containsf(t TestingT, s interface{}, contains interface{}, msg string, args ...interface{}) bool { + return Contains(t, s, contains, append([]interface{}{msg}, args...)...) +} + +// Emptyf asserts that the specified object is empty. I.e. nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// assert.Emptyf(t, obj, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func Emptyf(t TestingT, object interface{}, msg string, args ...interface{}) bool { + return Empty(t, object, append([]interface{}{msg}, args...)...) +} + +// Equalf asserts that two objects are equal. +// +// assert.Equalf(t, 123, 123, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). Function equality +// cannot be determined and will always fail. +func Equalf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + return Equal(t, expected, actual, append([]interface{}{msg}, args...)...) +} + +// EqualErrorf asserts that a function returned an error (i.e. not `nil`) +// and that it is equal to the provided error. +// +// actualObj, err := SomeFunction() +// assert.EqualErrorf(t, err, expectedErrorString, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func EqualErrorf(t TestingT, theError error, errString string, msg string, args ...interface{}) bool { + return EqualError(t, theError, errString, append([]interface{}{msg}, args...)...) +} + +// EqualValuesf asserts that two objects are equal or convertable to the same types +// and equal. +// +// assert.EqualValuesf(t, uint32(123, "error message %s", "formatted"), int32(123)) +// +// Returns whether the assertion was successful (true) or not (false). +func EqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + return EqualValues(t, expected, actual, append([]interface{}{msg}, args...)...) +} + +// Errorf asserts that a function returned an error (i.e. not `nil`). +// +// actualObj, err := SomeFunction() +// if assert.Errorf(t, err, "error message %s", "formatted") { +// assert.Equal(t, expectedErrorf, err) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func Errorf(t TestingT, err error, msg string, args ...interface{}) bool { + return Error(t, err, append([]interface{}{msg}, args...)...) +} + +// Exactlyf asserts that two objects are equal is value and type. +// +// assert.Exactlyf(t, int32(123, "error message %s", "formatted"), int64(123)) +// +// Returns whether the assertion was successful (true) or not (false). +func Exactlyf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + return Exactly(t, expected, actual, append([]interface{}{msg}, args...)...) +} + +// Failf reports a failure through +func Failf(t TestingT, failureMessage string, msg string, args ...interface{}) bool { + return Fail(t, failureMessage, append([]interface{}{msg}, args...)...) +} + +// FailNowf fails test +func FailNowf(t TestingT, failureMessage string, msg string, args ...interface{}) bool { + return FailNow(t, failureMessage, append([]interface{}{msg}, args...)...) +} + +// Falsef asserts that the specified value is false. +// +// assert.Falsef(t, myBool, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func Falsef(t TestingT, value bool, msg string, args ...interface{}) bool { + return False(t, value, append([]interface{}{msg}, args...)...) +} + +// HTTPBodyContainsf asserts that a specified handler returns a +// body that contains a string. +// +// assert.HTTPBodyContainsf(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPBodyContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) bool { + return HTTPBodyContains(t, handler, method, url, values, str) +} + +// HTTPBodyNotContainsf asserts that a specified handler returns a +// body that does not contain a string. +// +// assert.HTTPBodyNotContainsf(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPBodyNotContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) bool { + return HTTPBodyNotContains(t, handler, method, url, values, str) +} + +// HTTPErrorf asserts that a specified handler returns an error status code. +// +// assert.HTTPErrorf(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). +func HTTPErrorf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values) bool { + return HTTPError(t, handler, method, url, values) +} + +// HTTPRedirectf asserts that a specified handler returns a redirect status code. +// +// assert.HTTPRedirectf(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). +func HTTPRedirectf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values) bool { + return HTTPRedirect(t, handler, method, url, values) +} + +// HTTPSuccessf asserts that a specified handler returns a success status code. +// +// assert.HTTPSuccessf(t, myHandler, "POST", "http://www.google.com", nil, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPSuccessf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values) bool { + return HTTPSuccess(t, handler, method, url, values) +} + +// Implementsf asserts that an object is implemented by the specified interface. +// +// assert.Implementsf(t, (*MyInterface, "error message %s", "formatted")(nil), new(MyObject)) +func Implementsf(t TestingT, interfaceObject interface{}, object interface{}, msg string, args ...interface{}) bool { + return Implements(t, interfaceObject, object, append([]interface{}{msg}, args...)...) +} + +// InDeltaf asserts that the two numerals are within delta of each other. +// +// assert.InDeltaf(t, math.Pi, (22 / 7.0, "error message %s", "formatted"), 0.01) +// +// Returns whether the assertion was successful (true) or not (false). +func InDeltaf(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool { + return InDelta(t, expected, actual, delta, append([]interface{}{msg}, args...)...) +} + +// InDeltaSlicef is the same as InDelta, except it compares two slices. +func InDeltaSlicef(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool { + return InDeltaSlice(t, expected, actual, delta, append([]interface{}{msg}, args...)...) +} + +// InEpsilonf asserts that expected and actual have a relative error less than epsilon +// +// Returns whether the assertion was successful (true) or not (false). +func InEpsilonf(t TestingT, expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) bool { + return InEpsilon(t, expected, actual, epsilon, append([]interface{}{msg}, args...)...) +} + +// InEpsilonSlicef is the same as InEpsilon, except it compares each value from two slices. +func InEpsilonSlicef(t TestingT, expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) bool { + return InEpsilonSlice(t, expected, actual, epsilon, append([]interface{}{msg}, args...)...) +} + +// IsTypef asserts that the specified objects are of the same type. +func IsTypef(t TestingT, expectedType interface{}, object interface{}, msg string, args ...interface{}) bool { + return IsType(t, expectedType, object, append([]interface{}{msg}, args...)...) +} + +// JSONEqf asserts that two JSON strings are equivalent. +// +// assert.JSONEqf(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func JSONEqf(t TestingT, expected string, actual string, msg string, args ...interface{}) bool { + return JSONEq(t, expected, actual, append([]interface{}{msg}, args...)...) +} + +// Lenf asserts that the specified object has specific length. +// Lenf also fails if the object has a type that len() not accept. +// +// assert.Lenf(t, mySlice, 3, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func Lenf(t TestingT, object interface{}, length int, msg string, args ...interface{}) bool { + return Len(t, object, length, append([]interface{}{msg}, args...)...) +} + +// Nilf asserts that the specified object is nil. +// +// assert.Nilf(t, err, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func Nilf(t TestingT, object interface{}, msg string, args ...interface{}) bool { + return Nil(t, object, append([]interface{}{msg}, args...)...) +} + +// NoErrorf asserts that a function returned no error (i.e. `nil`). +// +// actualObj, err := SomeFunction() +// if assert.NoErrorf(t, err, "error message %s", "formatted") { +// assert.Equal(t, expectedObj, actualObj) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func NoErrorf(t TestingT, err error, msg string, args ...interface{}) bool { + return NoError(t, err, append([]interface{}{msg}, args...)...) +} + +// NotContainsf asserts that the specified string, list(array, slice...) or map does NOT contain the +// specified substring or element. +// +// assert.NotContainsf(t, "Hello World", "Earth", "error message %s", "formatted") +// assert.NotContainsf(t, ["Hello", "World"], "Earth", "error message %s", "formatted") +// assert.NotContainsf(t, {"Hello": "World"}, "Earth", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func NotContainsf(t TestingT, s interface{}, contains interface{}, msg string, args ...interface{}) bool { + return NotContains(t, s, contains, append([]interface{}{msg}, args...)...) +} + +// NotEmptyf asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// if assert.NotEmptyf(t, obj, "error message %s", "formatted") { +// assert.Equal(t, "two", obj[1]) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func NotEmptyf(t TestingT, object interface{}, msg string, args ...interface{}) bool { + return NotEmpty(t, object, append([]interface{}{msg}, args...)...) +} + +// NotEqualf asserts that the specified values are NOT equal. +// +// assert.NotEqualf(t, obj1, obj2, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). +func NotEqualf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + return NotEqual(t, expected, actual, append([]interface{}{msg}, args...)...) +} + +// NotNilf asserts that the specified object is not nil. +// +// assert.NotNilf(t, err, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func NotNilf(t TestingT, object interface{}, msg string, args ...interface{}) bool { + return NotNil(t, object, append([]interface{}{msg}, args...)...) +} + +// NotPanicsf asserts that the code inside the specified PanicTestFunc does NOT panic. +// +// assert.NotPanicsf(t, func(){ RemainCalm() }, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func NotPanicsf(t TestingT, f PanicTestFunc, msg string, args ...interface{}) bool { + return NotPanics(t, f, append([]interface{}{msg}, args...)...) +} + +// NotRegexpf asserts that a specified regexp does not match a string. +// +// assert.NotRegexpf(t, regexp.MustCompile("starts", "error message %s", "formatted"), "it's starting") +// assert.NotRegexpf(t, "^start", "it's not starting", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func NotRegexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) bool { + return NotRegexp(t, rx, str, append([]interface{}{msg}, args...)...) +} + +// NotSubsetf asserts that the specified list(array, slice...) contains not all +// elements given in the specified subset(array, slice...). +// +// assert.NotSubsetf(t, [1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func NotSubsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) bool { + return NotSubset(t, list, subset, append([]interface{}{msg}, args...)...) +} + +// NotZerof asserts that i is not the zero value for its type and returns the truth. +func NotZerof(t TestingT, i interface{}, msg string, args ...interface{}) bool { + return NotZero(t, i, append([]interface{}{msg}, args...)...) +} + +// Panicsf asserts that the code inside the specified PanicTestFunc panics. +// +// assert.Panicsf(t, func(){ GoCrazy() }, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func Panicsf(t TestingT, f PanicTestFunc, msg string, args ...interface{}) bool { + return Panics(t, f, append([]interface{}{msg}, args...)...) +} + +// PanicsWithValuef asserts that the code inside the specified PanicTestFunc panics, and that +// the recovered panic value equals the expected panic value. +// +// assert.PanicsWithValuef(t, "crazy error", func(){ GoCrazy() }, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func PanicsWithValuef(t TestingT, expected interface{}, f PanicTestFunc, msg string, args ...interface{}) bool { + return PanicsWithValue(t, expected, f, append([]interface{}{msg}, args...)...) +} + +// Regexpf asserts that a specified regexp matches a string. +// +// assert.Regexpf(t, regexp.MustCompile("start", "error message %s", "formatted"), "it's starting") +// assert.Regexpf(t, "start...$", "it's not starting", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func Regexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) bool { + return Regexp(t, rx, str, append([]interface{}{msg}, args...)...) +} + +// Subsetf asserts that the specified list(array, slice...) contains all +// elements given in the specified subset(array, slice...). +// +// assert.Subsetf(t, [1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func Subsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) bool { + return Subset(t, list, subset, append([]interface{}{msg}, args...)...) +} + +// Truef asserts that the specified value is true. +// +// assert.Truef(t, myBool, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func Truef(t TestingT, value bool, msg string, args ...interface{}) bool { + return True(t, value, append([]interface{}{msg}, args...)...) +} + +// WithinDurationf asserts that the two times are within duration delta of each other. +// +// assert.WithinDurationf(t, time.Now(), time.Now(), 10*time.Second, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func WithinDurationf(t TestingT, expected time.Time, actual time.Time, delta time.Duration, msg string, args ...interface{}) bool { + return WithinDuration(t, expected, actual, delta, append([]interface{}{msg}, args...)...) +} + +// Zerof asserts that i is the zero value for its type and returns the truth. +func Zerof(t TestingT, i interface{}, msg string, args ...interface{}) bool { + return Zero(t, i, append([]interface{}{msg}, args...)...) +} diff --git a/vendor/github.com/stretchr/testify/assert/assertion_format.go.tmpl b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/testify/assert/assertion_format.go.tmpl similarity index 100% rename from vendor/github.com/stretchr/testify/assert/assertion_format.go.tmpl rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/testify/assert/assertion_format.go.tmpl diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/testify/assert/assertion_forward.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/testify/assert/assertion_forward.go new file mode 100644 index 00000000..fcccbd01 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/testify/assert/assertion_forward.go @@ -0,0 +1,746 @@ +/* +* CODE GENERATED AUTOMATICALLY WITH github.com/stretchr/testify/_codegen +* THIS FILE MUST NOT BE EDITED BY HAND + */ + +package assert + +import ( + http "net/http" + url "net/url" + time "time" +) + +// Condition uses a Comparison to assert a complex condition. +func (a *Assertions) Condition(comp Comparison, msgAndArgs ...interface{}) bool { + return Condition(a.t, comp, msgAndArgs...) +} + +// Conditionf uses a Comparison to assert a complex condition. +func (a *Assertions) Conditionf(comp Comparison, msg string, args ...interface{}) bool { + return Conditionf(a.t, comp, msg, args...) +} + +// Contains asserts that the specified string, list(array, slice...) or map contains the +// specified substring or element. +// +// a.Contains("Hello World", "World") +// a.Contains(["Hello", "World"], "World") +// a.Contains({"Hello": "World"}, "Hello") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Contains(s interface{}, contains interface{}, msgAndArgs ...interface{}) bool { + return Contains(a.t, s, contains, msgAndArgs...) +} + +// Containsf asserts that the specified string, list(array, slice...) or map contains the +// specified substring or element. +// +// a.Containsf("Hello World", "World", "error message %s", "formatted") +// a.Containsf(["Hello", "World"], "World", "error message %s", "formatted") +// a.Containsf({"Hello": "World"}, "Hello", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Containsf(s interface{}, contains interface{}, msg string, args ...interface{}) bool { + return Containsf(a.t, s, contains, msg, args...) +} + +// Empty asserts that the specified object is empty. I.e. nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// a.Empty(obj) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Empty(object interface{}, msgAndArgs ...interface{}) bool { + return Empty(a.t, object, msgAndArgs...) +} + +// Emptyf asserts that the specified object is empty. I.e. nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// a.Emptyf(obj, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Emptyf(object interface{}, msg string, args ...interface{}) bool { + return Emptyf(a.t, object, msg, args...) +} + +// Equal asserts that two objects are equal. +// +// a.Equal(123, 123) +// +// Returns whether the assertion was successful (true) or not (false). +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). Function equality +// cannot be determined and will always fail. +func (a *Assertions) Equal(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool { + return Equal(a.t, expected, actual, msgAndArgs...) +} + +// EqualError asserts that a function returned an error (i.e. not `nil`) +// and that it is equal to the provided error. +// +// actualObj, err := SomeFunction() +// a.EqualError(err, expectedErrorString) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) EqualError(theError error, errString string, msgAndArgs ...interface{}) bool { + return EqualError(a.t, theError, errString, msgAndArgs...) +} + +// EqualErrorf asserts that a function returned an error (i.e. not `nil`) +// and that it is equal to the provided error. +// +// actualObj, err := SomeFunction() +// a.EqualErrorf(err, expectedErrorString, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) EqualErrorf(theError error, errString string, msg string, args ...interface{}) bool { + return EqualErrorf(a.t, theError, errString, msg, args...) +} + +// EqualValues asserts that two objects are equal or convertable to the same types +// and equal. +// +// a.EqualValues(uint32(123), int32(123)) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool { + return EqualValues(a.t, expected, actual, msgAndArgs...) +} + +// EqualValuesf asserts that two objects are equal or convertable to the same types +// and equal. +// +// a.EqualValuesf(uint32(123, "error message %s", "formatted"), int32(123)) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) EqualValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + return EqualValuesf(a.t, expected, actual, msg, args...) +} + +// Equalf asserts that two objects are equal. +// +// a.Equalf(123, 123, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). Function equality +// cannot be determined and will always fail. +func (a *Assertions) Equalf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + return Equalf(a.t, expected, actual, msg, args...) +} + +// Error asserts that a function returned an error (i.e. not `nil`). +// +// actualObj, err := SomeFunction() +// if a.Error(err) { +// assert.Equal(t, expectedError, err) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Error(err error, msgAndArgs ...interface{}) bool { + return Error(a.t, err, msgAndArgs...) +} + +// Errorf asserts that a function returned an error (i.e. not `nil`). +// +// actualObj, err := SomeFunction() +// if a.Errorf(err, "error message %s", "formatted") { +// assert.Equal(t, expectedErrorf, err) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Errorf(err error, msg string, args ...interface{}) bool { + return Errorf(a.t, err, msg, args...) +} + +// Exactly asserts that two objects are equal is value and type. +// +// a.Exactly(int32(123), int64(123)) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Exactly(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool { + return Exactly(a.t, expected, actual, msgAndArgs...) +} + +// Exactlyf asserts that two objects are equal is value and type. +// +// a.Exactlyf(int32(123, "error message %s", "formatted"), int64(123)) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Exactlyf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + return Exactlyf(a.t, expected, actual, msg, args...) +} + +// Fail reports a failure through +func (a *Assertions) Fail(failureMessage string, msgAndArgs ...interface{}) bool { + return Fail(a.t, failureMessage, msgAndArgs...) +} + +// FailNow fails test +func (a *Assertions) FailNow(failureMessage string, msgAndArgs ...interface{}) bool { + return FailNow(a.t, failureMessage, msgAndArgs...) +} + +// FailNowf fails test +func (a *Assertions) FailNowf(failureMessage string, msg string, args ...interface{}) bool { + return FailNowf(a.t, failureMessage, msg, args...) +} + +// Failf reports a failure through +func (a *Assertions) Failf(failureMessage string, msg string, args ...interface{}) bool { + return Failf(a.t, failureMessage, msg, args...) +} + +// False asserts that the specified value is false. +// +// a.False(myBool) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) False(value bool, msgAndArgs ...interface{}) bool { + return False(a.t, value, msgAndArgs...) +} + +// Falsef asserts that the specified value is false. +// +// a.Falsef(myBool, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Falsef(value bool, msg string, args ...interface{}) bool { + return Falsef(a.t, value, msg, args...) +} + +// HTTPBodyContains asserts that a specified handler returns a +// body that contains a string. +// +// a.HTTPBodyContains(myHandler, "www.google.com", nil, "I'm Feeling Lucky") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPBodyContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) bool { + return HTTPBodyContains(a.t, handler, method, url, values, str) +} + +// HTTPBodyContainsf asserts that a specified handler returns a +// body that contains a string. +// +// a.HTTPBodyContainsf(myHandler, "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPBodyContainsf(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) bool { + return HTTPBodyContainsf(a.t, handler, method, url, values, str) +} + +// HTTPBodyNotContains asserts that a specified handler returns a +// body that does not contain a string. +// +// a.HTTPBodyNotContains(myHandler, "www.google.com", nil, "I'm Feeling Lucky") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPBodyNotContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) bool { + return HTTPBodyNotContains(a.t, handler, method, url, values, str) +} + +// HTTPBodyNotContainsf asserts that a specified handler returns a +// body that does not contain a string. +// +// a.HTTPBodyNotContainsf(myHandler, "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPBodyNotContainsf(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) bool { + return HTTPBodyNotContainsf(a.t, handler, method, url, values, str) +} + +// HTTPError asserts that a specified handler returns an error status code. +// +// a.HTTPError(myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPError(handler http.HandlerFunc, method string, url string, values url.Values) bool { + return HTTPError(a.t, handler, method, url, values) +} + +// HTTPErrorf asserts that a specified handler returns an error status code. +// +// a.HTTPErrorf(myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). +func (a *Assertions) HTTPErrorf(handler http.HandlerFunc, method string, url string, values url.Values) bool { + return HTTPErrorf(a.t, handler, method, url, values) +} + +// HTTPRedirect asserts that a specified handler returns a redirect status code. +// +// a.HTTPRedirect(myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPRedirect(handler http.HandlerFunc, method string, url string, values url.Values) bool { + return HTTPRedirect(a.t, handler, method, url, values) +} + +// HTTPRedirectf asserts that a specified handler returns a redirect status code. +// +// a.HTTPRedirectf(myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). +func (a *Assertions) HTTPRedirectf(handler http.HandlerFunc, method string, url string, values url.Values) bool { + return HTTPRedirectf(a.t, handler, method, url, values) +} + +// HTTPSuccess asserts that a specified handler returns a success status code. +// +// a.HTTPSuccess(myHandler, "POST", "http://www.google.com", nil) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPSuccess(handler http.HandlerFunc, method string, url string, values url.Values) bool { + return HTTPSuccess(a.t, handler, method, url, values) +} + +// HTTPSuccessf asserts that a specified handler returns a success status code. +// +// a.HTTPSuccessf(myHandler, "POST", "http://www.google.com", nil, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPSuccessf(handler http.HandlerFunc, method string, url string, values url.Values) bool { + return HTTPSuccessf(a.t, handler, method, url, values) +} + +// Implements asserts that an object is implemented by the specified interface. +// +// a.Implements((*MyInterface)(nil), new(MyObject)) +func (a *Assertions) Implements(interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) bool { + return Implements(a.t, interfaceObject, object, msgAndArgs...) +} + +// Implementsf asserts that an object is implemented by the specified interface. +// +// a.Implementsf((*MyInterface, "error message %s", "formatted")(nil), new(MyObject)) +func (a *Assertions) Implementsf(interfaceObject interface{}, object interface{}, msg string, args ...interface{}) bool { + return Implementsf(a.t, interfaceObject, object, msg, args...) +} + +// InDelta asserts that the two numerals are within delta of each other. +// +// a.InDelta(math.Pi, (22 / 7.0), 0.01) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) InDelta(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) bool { + return InDelta(a.t, expected, actual, delta, msgAndArgs...) +} + +// InDeltaSlice is the same as InDelta, except it compares two slices. +func (a *Assertions) InDeltaSlice(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) bool { + return InDeltaSlice(a.t, expected, actual, delta, msgAndArgs...) +} + +// InDeltaSlicef is the same as InDelta, except it compares two slices. +func (a *Assertions) InDeltaSlicef(expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool { + return InDeltaSlicef(a.t, expected, actual, delta, msg, args...) +} + +// InDeltaf asserts that the two numerals are within delta of each other. +// +// a.InDeltaf(math.Pi, (22 / 7.0, "error message %s", "formatted"), 0.01) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) InDeltaf(expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool { + return InDeltaf(a.t, expected, actual, delta, msg, args...) +} + +// InEpsilon asserts that expected and actual have a relative error less than epsilon +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) InEpsilon(expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) bool { + return InEpsilon(a.t, expected, actual, epsilon, msgAndArgs...) +} + +// InEpsilonSlice is the same as InEpsilon, except it compares each value from two slices. +func (a *Assertions) InEpsilonSlice(expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) bool { + return InEpsilonSlice(a.t, expected, actual, epsilon, msgAndArgs...) +} + +// InEpsilonSlicef is the same as InEpsilon, except it compares each value from two slices. +func (a *Assertions) InEpsilonSlicef(expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) bool { + return InEpsilonSlicef(a.t, expected, actual, epsilon, msg, args...) +} + +// InEpsilonf asserts that expected and actual have a relative error less than epsilon +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) InEpsilonf(expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) bool { + return InEpsilonf(a.t, expected, actual, epsilon, msg, args...) +} + +// IsType asserts that the specified objects are of the same type. +func (a *Assertions) IsType(expectedType interface{}, object interface{}, msgAndArgs ...interface{}) bool { + return IsType(a.t, expectedType, object, msgAndArgs...) +} + +// IsTypef asserts that the specified objects are of the same type. +func (a *Assertions) IsTypef(expectedType interface{}, object interface{}, msg string, args ...interface{}) bool { + return IsTypef(a.t, expectedType, object, msg, args...) +} + +// JSONEq asserts that two JSON strings are equivalent. +// +// a.JSONEq(`{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) JSONEq(expected string, actual string, msgAndArgs ...interface{}) bool { + return JSONEq(a.t, expected, actual, msgAndArgs...) +} + +// JSONEqf asserts that two JSON strings are equivalent. +// +// a.JSONEqf(`{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) JSONEqf(expected string, actual string, msg string, args ...interface{}) bool { + return JSONEqf(a.t, expected, actual, msg, args...) +} + +// Len asserts that the specified object has specific length. +// Len also fails if the object has a type that len() not accept. +// +// a.Len(mySlice, 3) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Len(object interface{}, length int, msgAndArgs ...interface{}) bool { + return Len(a.t, object, length, msgAndArgs...) +} + +// Lenf asserts that the specified object has specific length. +// Lenf also fails if the object has a type that len() not accept. +// +// a.Lenf(mySlice, 3, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Lenf(object interface{}, length int, msg string, args ...interface{}) bool { + return Lenf(a.t, object, length, msg, args...) +} + +// Nil asserts that the specified object is nil. +// +// a.Nil(err) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Nil(object interface{}, msgAndArgs ...interface{}) bool { + return Nil(a.t, object, msgAndArgs...) +} + +// Nilf asserts that the specified object is nil. +// +// a.Nilf(err, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Nilf(object interface{}, msg string, args ...interface{}) bool { + return Nilf(a.t, object, msg, args...) +} + +// NoError asserts that a function returned no error (i.e. `nil`). +// +// actualObj, err := SomeFunction() +// if a.NoError(err) { +// assert.Equal(t, expectedObj, actualObj) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NoError(err error, msgAndArgs ...interface{}) bool { + return NoError(a.t, err, msgAndArgs...) +} + +// NoErrorf asserts that a function returned no error (i.e. `nil`). +// +// actualObj, err := SomeFunction() +// if a.NoErrorf(err, "error message %s", "formatted") { +// assert.Equal(t, expectedObj, actualObj) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NoErrorf(err error, msg string, args ...interface{}) bool { + return NoErrorf(a.t, err, msg, args...) +} + +// NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the +// specified substring or element. +// +// a.NotContains("Hello World", "Earth") +// a.NotContains(["Hello", "World"], "Earth") +// a.NotContains({"Hello": "World"}, "Earth") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotContains(s interface{}, contains interface{}, msgAndArgs ...interface{}) bool { + return NotContains(a.t, s, contains, msgAndArgs...) +} + +// NotContainsf asserts that the specified string, list(array, slice...) or map does NOT contain the +// specified substring or element. +// +// a.NotContainsf("Hello World", "Earth", "error message %s", "formatted") +// a.NotContainsf(["Hello", "World"], "Earth", "error message %s", "formatted") +// a.NotContainsf({"Hello": "World"}, "Earth", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotContainsf(s interface{}, contains interface{}, msg string, args ...interface{}) bool { + return NotContainsf(a.t, s, contains, msg, args...) +} + +// NotEmpty asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// if a.NotEmpty(obj) { +// assert.Equal(t, "two", obj[1]) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotEmpty(object interface{}, msgAndArgs ...interface{}) bool { + return NotEmpty(a.t, object, msgAndArgs...) +} + +// NotEmptyf asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// if a.NotEmptyf(obj, "error message %s", "formatted") { +// assert.Equal(t, "two", obj[1]) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotEmptyf(object interface{}, msg string, args ...interface{}) bool { + return NotEmptyf(a.t, object, msg, args...) +} + +// NotEqual asserts that the specified values are NOT equal. +// +// a.NotEqual(obj1, obj2) +// +// Returns whether the assertion was successful (true) or not (false). +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). +func (a *Assertions) NotEqual(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool { + return NotEqual(a.t, expected, actual, msgAndArgs...) +} + +// NotEqualf asserts that the specified values are NOT equal. +// +// a.NotEqualf(obj1, obj2, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). +func (a *Assertions) NotEqualf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + return NotEqualf(a.t, expected, actual, msg, args...) +} + +// NotNil asserts that the specified object is not nil. +// +// a.NotNil(err) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotNil(object interface{}, msgAndArgs ...interface{}) bool { + return NotNil(a.t, object, msgAndArgs...) +} + +// NotNilf asserts that the specified object is not nil. +// +// a.NotNilf(err, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotNilf(object interface{}, msg string, args ...interface{}) bool { + return NotNilf(a.t, object, msg, args...) +} + +// NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic. +// +// a.NotPanics(func(){ RemainCalm() }) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotPanics(f PanicTestFunc, msgAndArgs ...interface{}) bool { + return NotPanics(a.t, f, msgAndArgs...) +} + +// NotPanicsf asserts that the code inside the specified PanicTestFunc does NOT panic. +// +// a.NotPanicsf(func(){ RemainCalm() }, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotPanicsf(f PanicTestFunc, msg string, args ...interface{}) bool { + return NotPanicsf(a.t, f, msg, args...) +} + +// NotRegexp asserts that a specified regexp does not match a string. +// +// a.NotRegexp(regexp.MustCompile("starts"), "it's starting") +// a.NotRegexp("^start", "it's not starting") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotRegexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) bool { + return NotRegexp(a.t, rx, str, msgAndArgs...) +} + +// NotRegexpf asserts that a specified regexp does not match a string. +// +// a.NotRegexpf(regexp.MustCompile("starts", "error message %s", "formatted"), "it's starting") +// a.NotRegexpf("^start", "it's not starting", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotRegexpf(rx interface{}, str interface{}, msg string, args ...interface{}) bool { + return NotRegexpf(a.t, rx, str, msg, args...) +} + +// NotSubset asserts that the specified list(array, slice...) contains not all +// elements given in the specified subset(array, slice...). +// +// a.NotSubset([1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotSubset(list interface{}, subset interface{}, msgAndArgs ...interface{}) bool { + return NotSubset(a.t, list, subset, msgAndArgs...) +} + +// NotSubsetf asserts that the specified list(array, slice...) contains not all +// elements given in the specified subset(array, slice...). +// +// a.NotSubsetf([1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotSubsetf(list interface{}, subset interface{}, msg string, args ...interface{}) bool { + return NotSubsetf(a.t, list, subset, msg, args...) +} + +// NotZero asserts that i is not the zero value for its type and returns the truth. +func (a *Assertions) NotZero(i interface{}, msgAndArgs ...interface{}) bool { + return NotZero(a.t, i, msgAndArgs...) +} + +// NotZerof asserts that i is not the zero value for its type and returns the truth. +func (a *Assertions) NotZerof(i interface{}, msg string, args ...interface{}) bool { + return NotZerof(a.t, i, msg, args...) +} + +// Panics asserts that the code inside the specified PanicTestFunc panics. +// +// a.Panics(func(){ GoCrazy() }) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Panics(f PanicTestFunc, msgAndArgs ...interface{}) bool { + return Panics(a.t, f, msgAndArgs...) +} + +// PanicsWithValue asserts that the code inside the specified PanicTestFunc panics, and that +// the recovered panic value equals the expected panic value. +// +// a.PanicsWithValue("crazy error", func(){ GoCrazy() }) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) PanicsWithValue(expected interface{}, f PanicTestFunc, msgAndArgs ...interface{}) bool { + return PanicsWithValue(a.t, expected, f, msgAndArgs...) +} + +// PanicsWithValuef asserts that the code inside the specified PanicTestFunc panics, and that +// the recovered panic value equals the expected panic value. +// +// a.PanicsWithValuef("crazy error", func(){ GoCrazy() }, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) PanicsWithValuef(expected interface{}, f PanicTestFunc, msg string, args ...interface{}) bool { + return PanicsWithValuef(a.t, expected, f, msg, args...) +} + +// Panicsf asserts that the code inside the specified PanicTestFunc panics. +// +// a.Panicsf(func(){ GoCrazy() }, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Panicsf(f PanicTestFunc, msg string, args ...interface{}) bool { + return Panicsf(a.t, f, msg, args...) +} + +// Regexp asserts that a specified regexp matches a string. +// +// a.Regexp(regexp.MustCompile("start"), "it's starting") +// a.Regexp("start...$", "it's not starting") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Regexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) bool { + return Regexp(a.t, rx, str, msgAndArgs...) +} + +// Regexpf asserts that a specified regexp matches a string. +// +// a.Regexpf(regexp.MustCompile("start", "error message %s", "formatted"), "it's starting") +// a.Regexpf("start...$", "it's not starting", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Regexpf(rx interface{}, str interface{}, msg string, args ...interface{}) bool { + return Regexpf(a.t, rx, str, msg, args...) +} + +// Subset asserts that the specified list(array, slice...) contains all +// elements given in the specified subset(array, slice...). +// +// a.Subset([1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Subset(list interface{}, subset interface{}, msgAndArgs ...interface{}) bool { + return Subset(a.t, list, subset, msgAndArgs...) +} + +// Subsetf asserts that the specified list(array, slice...) contains all +// elements given in the specified subset(array, slice...). +// +// a.Subsetf([1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Subsetf(list interface{}, subset interface{}, msg string, args ...interface{}) bool { + return Subsetf(a.t, list, subset, msg, args...) +} + +// True asserts that the specified value is true. +// +// a.True(myBool) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) True(value bool, msgAndArgs ...interface{}) bool { + return True(a.t, value, msgAndArgs...) +} + +// Truef asserts that the specified value is true. +// +// a.Truef(myBool, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Truef(value bool, msg string, args ...interface{}) bool { + return Truef(a.t, value, msg, args...) +} + +// WithinDuration asserts that the two times are within duration delta of each other. +// +// a.WithinDuration(time.Now(), time.Now(), 10*time.Second) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) WithinDuration(expected time.Time, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) bool { + return WithinDuration(a.t, expected, actual, delta, msgAndArgs...) +} + +// WithinDurationf asserts that the two times are within duration delta of each other. +// +// a.WithinDurationf(time.Now(), time.Now(), 10*time.Second, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) WithinDurationf(expected time.Time, actual time.Time, delta time.Duration, msg string, args ...interface{}) bool { + return WithinDurationf(a.t, expected, actual, delta, msg, args...) +} + +// Zero asserts that i is the zero value for its type and returns the truth. +func (a *Assertions) Zero(i interface{}, msgAndArgs ...interface{}) bool { + return Zero(a.t, i, msgAndArgs...) +} + +// Zerof asserts that i is the zero value for its type and returns the truth. +func (a *Assertions) Zerof(i interface{}, msg string, args ...interface{}) bool { + return Zerof(a.t, i, msg, args...) +} diff --git a/vendor/github.com/stretchr/testify/assert/assertion_forward.go.tmpl b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/testify/assert/assertion_forward.go.tmpl similarity index 100% rename from vendor/github.com/stretchr/testify/assert/assertion_forward.go.tmpl rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/testify/assert/assertion_forward.go.tmpl diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/testify/assert/assertions.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/testify/assert/assertions.go new file mode 100644 index 00000000..82590507 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/testify/assert/assertions.go @@ -0,0 +1,1208 @@ +package assert + +import ( + "bufio" + "bytes" + "encoding/json" + "errors" + "fmt" + "math" + "reflect" + "regexp" + "runtime" + "strings" + "time" + "unicode" + "unicode/utf8" + + "github.com/davecgh/go-spew/spew" + "github.com/pmezard/go-difflib/difflib" +) + +//go:generate go run ../_codegen/main.go -output-package=assert -template=assertion_format.go.tmpl + +// TestingT is an interface wrapper around *testing.T +type TestingT interface { + Errorf(format string, args ...interface{}) +} + +// Comparison a custom function that returns true on success and false on failure +type Comparison func() (success bool) + +/* + Helper functions +*/ + +// ObjectsAreEqual determines if two objects are considered equal. +// +// This function does no assertion of any kind. +func ObjectsAreEqual(expected, actual interface{}) bool { + + if expected == nil || actual == nil { + return expected == actual + } + if exp, ok := expected.([]byte); ok { + act, ok := actual.([]byte) + if !ok { + return false + } else if exp == nil || act == nil { + return exp == nil && act == nil + } + return bytes.Equal(exp, act) + } + return reflect.DeepEqual(expected, actual) + +} + +// ObjectsAreEqualValues gets whether two objects are equal, or if their +// values are equal. +func ObjectsAreEqualValues(expected, actual interface{}) bool { + if ObjectsAreEqual(expected, actual) { + return true + } + + actualType := reflect.TypeOf(actual) + if actualType == nil { + return false + } + expectedValue := reflect.ValueOf(expected) + if expectedValue.IsValid() && expectedValue.Type().ConvertibleTo(actualType) { + // Attempt comparison after type conversion + return reflect.DeepEqual(expectedValue.Convert(actualType).Interface(), actual) + } + + return false +} + +/* CallerInfo is necessary because the assert functions use the testing object +internally, causing it to print the file:line of the assert method, rather than where +the problem actually occurred in calling code.*/ + +// CallerInfo returns an array of strings containing the file and line number +// of each stack frame leading from the current test to the assert call that +// failed. +func CallerInfo() []string { + + pc := uintptr(0) + file := "" + line := 0 + ok := false + name := "" + + callers := []string{} + for i := 0; ; i++ { + pc, file, line, ok = runtime.Caller(i) + if !ok { + // The breaks below failed to terminate the loop, and we ran off the + // end of the call stack. + break + } + + // This is a huge edge case, but it will panic if this is the case, see #180 + if file == "" { + break + } + + f := runtime.FuncForPC(pc) + if f == nil { + break + } + name = f.Name() + + // testing.tRunner is the standard library function that calls + // tests. Subtests are called directly by tRunner, without going through + // the Test/Benchmark/Example function that contains the t.Run calls, so + // with subtests we should break when we hit tRunner, without adding it + // to the list of callers. + if name == "testing.tRunner" { + break + } + + parts := strings.Split(file, "/") + file = parts[len(parts)-1] + if len(parts) > 1 { + dir := parts[len(parts)-2] + if (dir != "assert" && dir != "mock" && dir != "require") || file == "mock_test.go" { + callers = append(callers, fmt.Sprintf("%s:%d", file, line)) + } + } + + // Drop the package + segments := strings.Split(name, ".") + name = segments[len(segments)-1] + if isTest(name, "Test") || + isTest(name, "Benchmark") || + isTest(name, "Example") { + break + } + } + + return callers +} + +// Stolen from the `go test` tool. +// isTest tells whether name looks like a test (or benchmark, according to prefix). +// It is a Test (say) if there is a character after Test that is not a lower-case letter. +// We don't want TesticularCancer. +func isTest(name, prefix string) bool { + if !strings.HasPrefix(name, prefix) { + return false + } + if len(name) == len(prefix) { // "Test" is ok + return true + } + rune, _ := utf8.DecodeRuneInString(name[len(prefix):]) + return !unicode.IsLower(rune) +} + +// getWhitespaceString returns a string that is long enough to overwrite the default +// output from the go testing framework. +func getWhitespaceString() string { + + _, file, line, ok := runtime.Caller(1) + if !ok { + return "" + } + parts := strings.Split(file, "/") + file = parts[len(parts)-1] + + return strings.Repeat(" ", len(fmt.Sprintf("%s:%d: ", file, line))) + +} + +func messageFromMsgAndArgs(msgAndArgs ...interface{}) string { + if len(msgAndArgs) == 0 || msgAndArgs == nil { + return "" + } + if len(msgAndArgs) == 1 { + return msgAndArgs[0].(string) + } + if len(msgAndArgs) > 1 { + return fmt.Sprintf(msgAndArgs[0].(string), msgAndArgs[1:]...) + } + return "" +} + +// Aligns the provided message so that all lines after the first line start at the same location as the first line. +// Assumes that the first line starts at the correct location (after carriage return, tab, label, spacer and tab). +// The longestLabelLen parameter specifies the length of the longest label in the output (required becaues this is the +// basis on which the alignment occurs). +func indentMessageLines(message string, longestLabelLen int) string { + outBuf := new(bytes.Buffer) + + for i, scanner := 0, bufio.NewScanner(strings.NewReader(message)); scanner.Scan(); i++ { + // no need to align first line because it starts at the correct location (after the label) + if i != 0 { + // append alignLen+1 spaces to align with "{{longestLabel}}:" before adding tab + outBuf.WriteString("\n\r\t" + strings.Repeat(" ", longestLabelLen+1) + "\t") + } + outBuf.WriteString(scanner.Text()) + } + + return outBuf.String() +} + +type failNower interface { + FailNow() +} + +// FailNow fails test +func FailNow(t TestingT, failureMessage string, msgAndArgs ...interface{}) bool { + Fail(t, failureMessage, msgAndArgs...) + + // We cannot extend TestingT with FailNow() and + // maintain backwards compatibility, so we fallback + // to panicking when FailNow is not available in + // TestingT. + // See issue #263 + + if t, ok := t.(failNower); ok { + t.FailNow() + } else { + panic("test failed and t is missing `FailNow()`") + } + return false +} + +// Fail reports a failure through +func Fail(t TestingT, failureMessage string, msgAndArgs ...interface{}) bool { + content := []labeledContent{ + {"Error Trace", strings.Join(CallerInfo(), "\n\r\t\t\t")}, + {"Error", failureMessage}, + } + + message := messageFromMsgAndArgs(msgAndArgs...) + if len(message) > 0 { + content = append(content, labeledContent{"Messages", message}) + } + + t.Errorf("%s", "\r"+getWhitespaceString()+labeledOutput(content...)) + + return false +} + +type labeledContent struct { + label string + content string +} + +// labeledOutput returns a string consisting of the provided labeledContent. Each labeled output is appended in the following manner: +// +// \r\t{{label}}:{{align_spaces}}\t{{content}}\n +// +// The initial carriage return is required to undo/erase any padding added by testing.T.Errorf. The "\t{{label}}:" is for the label. +// If a label is shorter than the longest label provided, padding spaces are added to make all the labels match in length. Once this +// alignment is achieved, "\t{{content}}\n" is added for the output. +// +// If the content of the labeledOutput contains line breaks, the subsequent lines are aligned so that they start at the same location as the first line. +func labeledOutput(content ...labeledContent) string { + longestLabel := 0 + for _, v := range content { + if len(v.label) > longestLabel { + longestLabel = len(v.label) + } + } + var output string + for _, v := range content { + output += "\r\t" + v.label + ":" + strings.Repeat(" ", longestLabel-len(v.label)) + "\t" + indentMessageLines(v.content, longestLabel) + "\n" + } + return output +} + +// Implements asserts that an object is implemented by the specified interface. +// +// assert.Implements(t, (*MyInterface)(nil), new(MyObject)) +func Implements(t TestingT, interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) bool { + + interfaceType := reflect.TypeOf(interfaceObject).Elem() + + if !reflect.TypeOf(object).Implements(interfaceType) { + return Fail(t, fmt.Sprintf("%T must implement %v", object, interfaceType), msgAndArgs...) + } + + return true + +} + +// IsType asserts that the specified objects are of the same type. +func IsType(t TestingT, expectedType interface{}, object interface{}, msgAndArgs ...interface{}) bool { + + if !ObjectsAreEqual(reflect.TypeOf(object), reflect.TypeOf(expectedType)) { + return Fail(t, fmt.Sprintf("Object expected to be of type %v, but was %v", reflect.TypeOf(expectedType), reflect.TypeOf(object)), msgAndArgs...) + } + + return true +} + +// Equal asserts that two objects are equal. +// +// assert.Equal(t, 123, 123) +// +// Returns whether the assertion was successful (true) or not (false). +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). Function equality +// cannot be determined and will always fail. +func Equal(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool { + if err := validateEqualArgs(expected, actual); err != nil { + return Fail(t, fmt.Sprintf("Invalid operation: %#v == %#v (%s)", + expected, actual, err), msgAndArgs...) + } + + if !ObjectsAreEqual(expected, actual) { + diff := diff(expected, actual) + expected, actual = formatUnequalValues(expected, actual) + return Fail(t, fmt.Sprintf("Not equal: \n"+ + "expected: %s\n"+ + "actual: %s%s", expected, actual, diff), msgAndArgs...) + } + + return true + +} + +// formatUnequalValues takes two values of arbitrary types and returns string +// representations appropriate to be presented to the user. +// +// If the values are not of like type, the returned strings will be prefixed +// with the type name, and the value will be enclosed in parenthesis similar +// to a type conversion in the Go grammar. +func formatUnequalValues(expected, actual interface{}) (e string, a string) { + if reflect.TypeOf(expected) != reflect.TypeOf(actual) { + return fmt.Sprintf("%T(%#v)", expected, expected), + fmt.Sprintf("%T(%#v)", actual, actual) + } + + return fmt.Sprintf("%#v", expected), + fmt.Sprintf("%#v", actual) +} + +// EqualValues asserts that two objects are equal or convertable to the same types +// and equal. +// +// assert.EqualValues(t, uint32(123), int32(123)) +// +// Returns whether the assertion was successful (true) or not (false). +func EqualValues(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool { + + if !ObjectsAreEqualValues(expected, actual) { + diff := diff(expected, actual) + expected, actual = formatUnequalValues(expected, actual) + return Fail(t, fmt.Sprintf("Not equal: \n"+ + "expected: %s\n"+ + "actual: %s%s", expected, actual, diff), msgAndArgs...) + } + + return true + +} + +// Exactly asserts that two objects are equal is value and type. +// +// assert.Exactly(t, int32(123), int64(123)) +// +// Returns whether the assertion was successful (true) or not (false). +func Exactly(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool { + + aType := reflect.TypeOf(expected) + bType := reflect.TypeOf(actual) + + if aType != bType { + return Fail(t, fmt.Sprintf("Types expected to match exactly\n\r\t%v != %v", aType, bType), msgAndArgs...) + } + + return Equal(t, expected, actual, msgAndArgs...) + +} + +// NotNil asserts that the specified object is not nil. +// +// assert.NotNil(t, err) +// +// Returns whether the assertion was successful (true) or not (false). +func NotNil(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { + if !isNil(object) { + return true + } + return Fail(t, "Expected value not to be nil.", msgAndArgs...) +} + +// isNil checks if a specified object is nil or not, without Failing. +func isNil(object interface{}) bool { + if object == nil { + return true + } + + value := reflect.ValueOf(object) + kind := value.Kind() + if kind >= reflect.Chan && kind <= reflect.Slice && value.IsNil() { + return true + } + + return false +} + +// Nil asserts that the specified object is nil. +// +// assert.Nil(t, err) +// +// Returns whether the assertion was successful (true) or not (false). +func Nil(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { + if isNil(object) { + return true + } + return Fail(t, fmt.Sprintf("Expected nil, but got: %#v", object), msgAndArgs...) +} + +var numericZeros = []interface{}{ + int(0), + int8(0), + int16(0), + int32(0), + int64(0), + uint(0), + uint8(0), + uint16(0), + uint32(0), + uint64(0), + float32(0), + float64(0), +} + +// isEmpty gets whether the specified object is considered empty or not. +func isEmpty(object interface{}) bool { + + if object == nil { + return true + } else if object == "" { + return true + } else if object == false { + return true + } + + for _, v := range numericZeros { + if object == v { + return true + } + } + + objValue := reflect.ValueOf(object) + + switch objValue.Kind() { + case reflect.Array, reflect.Chan, reflect.Map, reflect.Slice, reflect.String: + { + return (objValue.Len() == 0) + } + case reflect.Struct: + switch object.(type) { + case time.Time: + return object.(time.Time).IsZero() + } + case reflect.Ptr: + { + if objValue.IsNil() { + return true + } + switch object.(type) { + case *time.Time: + return object.(*time.Time).IsZero() + default: + return false + } + } + } + return false +} + +// Empty asserts that the specified object is empty. I.e. nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// assert.Empty(t, obj) +// +// Returns whether the assertion was successful (true) or not (false). +func Empty(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { + + pass := isEmpty(object) + if !pass { + Fail(t, fmt.Sprintf("Should be empty, but was %v", object), msgAndArgs...) + } + + return pass + +} + +// NotEmpty asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// if assert.NotEmpty(t, obj) { +// assert.Equal(t, "two", obj[1]) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func NotEmpty(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { + + pass := !isEmpty(object) + if !pass { + Fail(t, fmt.Sprintf("Should NOT be empty, but was %v", object), msgAndArgs...) + } + + return pass + +} + +// getLen try to get length of object. +// return (false, 0) if impossible. +func getLen(x interface{}) (ok bool, length int) { + v := reflect.ValueOf(x) + defer func() { + if e := recover(); e != nil { + ok = false + } + }() + return true, v.Len() +} + +// Len asserts that the specified object has specific length. +// Len also fails if the object has a type that len() not accept. +// +// assert.Len(t, mySlice, 3) +// +// Returns whether the assertion was successful (true) or not (false). +func Len(t TestingT, object interface{}, length int, msgAndArgs ...interface{}) bool { + ok, l := getLen(object) + if !ok { + return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", object), msgAndArgs...) + } + + if l != length { + return Fail(t, fmt.Sprintf("\"%s\" should have %d item(s), but has %d", object, length, l), msgAndArgs...) + } + return true +} + +// True asserts that the specified value is true. +// +// assert.True(t, myBool) +// +// Returns whether the assertion was successful (true) or not (false). +func True(t TestingT, value bool, msgAndArgs ...interface{}) bool { + + if value != true { + return Fail(t, "Should be true", msgAndArgs...) + } + + return true + +} + +// False asserts that the specified value is false. +// +// assert.False(t, myBool) +// +// Returns whether the assertion was successful (true) or not (false). +func False(t TestingT, value bool, msgAndArgs ...interface{}) bool { + + if value != false { + return Fail(t, "Should be false", msgAndArgs...) + } + + return true + +} + +// NotEqual asserts that the specified values are NOT equal. +// +// assert.NotEqual(t, obj1, obj2) +// +// Returns whether the assertion was successful (true) or not (false). +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). +func NotEqual(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool { + if err := validateEqualArgs(expected, actual); err != nil { + return Fail(t, fmt.Sprintf("Invalid operation: %#v != %#v (%s)", + expected, actual, err), msgAndArgs...) + } + + if ObjectsAreEqual(expected, actual) { + return Fail(t, fmt.Sprintf("Should not be: %#v\n", actual), msgAndArgs...) + } + + return true + +} + +// containsElement try loop over the list check if the list includes the element. +// return (false, false) if impossible. +// return (true, false) if element was not found. +// return (true, true) if element was found. +func includeElement(list interface{}, element interface{}) (ok, found bool) { + + listValue := reflect.ValueOf(list) + elementValue := reflect.ValueOf(element) + defer func() { + if e := recover(); e != nil { + ok = false + found = false + } + }() + + if reflect.TypeOf(list).Kind() == reflect.String { + return true, strings.Contains(listValue.String(), elementValue.String()) + } + + if reflect.TypeOf(list).Kind() == reflect.Map { + mapKeys := listValue.MapKeys() + for i := 0; i < len(mapKeys); i++ { + if ObjectsAreEqual(mapKeys[i].Interface(), element) { + return true, true + } + } + return true, false + } + + for i := 0; i < listValue.Len(); i++ { + if ObjectsAreEqual(listValue.Index(i).Interface(), element) { + return true, true + } + } + return true, false + +} + +// Contains asserts that the specified string, list(array, slice...) or map contains the +// specified substring or element. +// +// assert.Contains(t, "Hello World", "World") +// assert.Contains(t, ["Hello", "World"], "World") +// assert.Contains(t, {"Hello": "World"}, "Hello") +// +// Returns whether the assertion was successful (true) or not (false). +func Contains(t TestingT, s, contains interface{}, msgAndArgs ...interface{}) bool { + + ok, found := includeElement(s, contains) + if !ok { + return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", s), msgAndArgs...) + } + if !found { + return Fail(t, fmt.Sprintf("\"%s\" does not contain \"%s\"", s, contains), msgAndArgs...) + } + + return true + +} + +// NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the +// specified substring or element. +// +// assert.NotContains(t, "Hello World", "Earth") +// assert.NotContains(t, ["Hello", "World"], "Earth") +// assert.NotContains(t, {"Hello": "World"}, "Earth") +// +// Returns whether the assertion was successful (true) or not (false). +func NotContains(t TestingT, s, contains interface{}, msgAndArgs ...interface{}) bool { + + ok, found := includeElement(s, contains) + if !ok { + return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", s), msgAndArgs...) + } + if found { + return Fail(t, fmt.Sprintf("\"%s\" should not contain \"%s\"", s, contains), msgAndArgs...) + } + + return true + +} + +// Subset asserts that the specified list(array, slice...) contains all +// elements given in the specified subset(array, slice...). +// +// assert.Subset(t, [1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]") +// +// Returns whether the assertion was successful (true) or not (false). +func Subset(t TestingT, list, subset interface{}, msgAndArgs ...interface{}) (ok bool) { + if subset == nil { + return true // we consider nil to be equal to the nil set + } + + subsetValue := reflect.ValueOf(subset) + defer func() { + if e := recover(); e != nil { + ok = false + } + }() + + listKind := reflect.TypeOf(list).Kind() + subsetKind := reflect.TypeOf(subset).Kind() + + if listKind != reflect.Array && listKind != reflect.Slice { + return Fail(t, fmt.Sprintf("%q has an unsupported type %s", list, listKind), msgAndArgs...) + } + + if subsetKind != reflect.Array && subsetKind != reflect.Slice { + return Fail(t, fmt.Sprintf("%q has an unsupported type %s", subset, subsetKind), msgAndArgs...) + } + + for i := 0; i < subsetValue.Len(); i++ { + element := subsetValue.Index(i).Interface() + ok, found := includeElement(list, element) + if !ok { + return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", list), msgAndArgs...) + } + if !found { + return Fail(t, fmt.Sprintf("\"%s\" does not contain \"%s\"", list, element), msgAndArgs...) + } + } + + return true +} + +// NotSubset asserts that the specified list(array, slice...) contains not all +// elements given in the specified subset(array, slice...). +// +// assert.NotSubset(t, [1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]") +// +// Returns whether the assertion was successful (true) or not (false). +func NotSubset(t TestingT, list, subset interface{}, msgAndArgs ...interface{}) (ok bool) { + if subset == nil { + return false // we consider nil to be equal to the nil set + } + + subsetValue := reflect.ValueOf(subset) + defer func() { + if e := recover(); e != nil { + ok = false + } + }() + + listKind := reflect.TypeOf(list).Kind() + subsetKind := reflect.TypeOf(subset).Kind() + + if listKind != reflect.Array && listKind != reflect.Slice { + return Fail(t, fmt.Sprintf("%q has an unsupported type %s", list, listKind), msgAndArgs...) + } + + if subsetKind != reflect.Array && subsetKind != reflect.Slice { + return Fail(t, fmt.Sprintf("%q has an unsupported type %s", subset, subsetKind), msgAndArgs...) + } + + for i := 0; i < subsetValue.Len(); i++ { + element := subsetValue.Index(i).Interface() + ok, found := includeElement(list, element) + if !ok { + return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", list), msgAndArgs...) + } + if !found { + return true + } + } + + return Fail(t, fmt.Sprintf("%q is a subset of %q", subset, list), msgAndArgs...) +} + +// Condition uses a Comparison to assert a complex condition. +func Condition(t TestingT, comp Comparison, msgAndArgs ...interface{}) bool { + result := comp() + if !result { + Fail(t, "Condition failed!", msgAndArgs...) + } + return result +} + +// PanicTestFunc defines a func that should be passed to the assert.Panics and assert.NotPanics +// methods, and represents a simple func that takes no arguments, and returns nothing. +type PanicTestFunc func() + +// didPanic returns true if the function passed to it panics. Otherwise, it returns false. +func didPanic(f PanicTestFunc) (bool, interface{}) { + + didPanic := false + var message interface{} + func() { + + defer func() { + if message = recover(); message != nil { + didPanic = true + } + }() + + // call the target function + f() + + }() + + return didPanic, message + +} + +// Panics asserts that the code inside the specified PanicTestFunc panics. +// +// assert.Panics(t, func(){ GoCrazy() }) +// +// Returns whether the assertion was successful (true) or not (false). +func Panics(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool { + + if funcDidPanic, panicValue := didPanic(f); !funcDidPanic { + return Fail(t, fmt.Sprintf("func %#v should panic\n\r\tPanic value:\t%v", f, panicValue), msgAndArgs...) + } + + return true +} + +// PanicsWithValue asserts that the code inside the specified PanicTestFunc panics, and that +// the recovered panic value equals the expected panic value. +// +// assert.PanicsWithValue(t, "crazy error", func(){ GoCrazy() }) +// +// Returns whether the assertion was successful (true) or not (false). +func PanicsWithValue(t TestingT, expected interface{}, f PanicTestFunc, msgAndArgs ...interface{}) bool { + + funcDidPanic, panicValue := didPanic(f) + if !funcDidPanic { + return Fail(t, fmt.Sprintf("func %#v should panic\n\r\tPanic value:\t%v", f, panicValue), msgAndArgs...) + } + if panicValue != expected { + return Fail(t, fmt.Sprintf("func %#v should panic with value:\t%v\n\r\tPanic value:\t%v", f, expected, panicValue), msgAndArgs...) + } + + return true +} + +// NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic. +// +// assert.NotPanics(t, func(){ RemainCalm() }) +// +// Returns whether the assertion was successful (true) or not (false). +func NotPanics(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool { + + if funcDidPanic, panicValue := didPanic(f); funcDidPanic { + return Fail(t, fmt.Sprintf("func %#v should not panic\n\r\tPanic value:\t%v", f, panicValue), msgAndArgs...) + } + + return true +} + +// WithinDuration asserts that the two times are within duration delta of each other. +// +// assert.WithinDuration(t, time.Now(), time.Now(), 10*time.Second) +// +// Returns whether the assertion was successful (true) or not (false). +func WithinDuration(t TestingT, expected, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) bool { + + dt := expected.Sub(actual) + if dt < -delta || dt > delta { + return Fail(t, fmt.Sprintf("Max difference between %v and %v allowed is %v, but difference was %v", expected, actual, delta, dt), msgAndArgs...) + } + + return true +} + +func toFloat(x interface{}) (float64, bool) { + var xf float64 + xok := true + + switch xn := x.(type) { + case uint8: + xf = float64(xn) + case uint16: + xf = float64(xn) + case uint32: + xf = float64(xn) + case uint64: + xf = float64(xn) + case int: + xf = float64(xn) + case int8: + xf = float64(xn) + case int16: + xf = float64(xn) + case int32: + xf = float64(xn) + case int64: + xf = float64(xn) + case float32: + xf = float64(xn) + case float64: + xf = float64(xn) + case time.Duration: + xf = float64(xn) + default: + xok = false + } + + return xf, xok +} + +// InDelta asserts that the two numerals are within delta of each other. +// +// assert.InDelta(t, math.Pi, (22 / 7.0), 0.01) +// +// Returns whether the assertion was successful (true) or not (false). +func InDelta(t TestingT, expected, actual interface{}, delta float64, msgAndArgs ...interface{}) bool { + + af, aok := toFloat(expected) + bf, bok := toFloat(actual) + + if !aok || !bok { + return Fail(t, fmt.Sprintf("Parameters must be numerical"), msgAndArgs...) + } + + if math.IsNaN(af) { + return Fail(t, fmt.Sprintf("Expected must not be NaN"), msgAndArgs...) + } + + if math.IsNaN(bf) { + return Fail(t, fmt.Sprintf("Expected %v with delta %v, but was NaN", expected, delta), msgAndArgs...) + } + + dt := af - bf + if dt < -delta || dt > delta { + return Fail(t, fmt.Sprintf("Max difference between %v and %v allowed is %v, but difference was %v", expected, actual, delta, dt), msgAndArgs...) + } + + return true +} + +// InDeltaSlice is the same as InDelta, except it compares two slices. +func InDeltaSlice(t TestingT, expected, actual interface{}, delta float64, msgAndArgs ...interface{}) bool { + if expected == nil || actual == nil || + reflect.TypeOf(actual).Kind() != reflect.Slice || + reflect.TypeOf(expected).Kind() != reflect.Slice { + return Fail(t, fmt.Sprintf("Parameters must be slice"), msgAndArgs...) + } + + actualSlice := reflect.ValueOf(actual) + expectedSlice := reflect.ValueOf(expected) + + for i := 0; i < actualSlice.Len(); i++ { + result := InDelta(t, actualSlice.Index(i).Interface(), expectedSlice.Index(i).Interface(), delta, msgAndArgs...) + if !result { + return result + } + } + + return true +} + +func calcRelativeError(expected, actual interface{}) (float64, error) { + af, aok := toFloat(expected) + if !aok { + return 0, fmt.Errorf("expected value %q cannot be converted to float", expected) + } + if af == 0 { + return 0, fmt.Errorf("expected value must have a value other than zero to calculate the relative error") + } + bf, bok := toFloat(actual) + if !bok { + return 0, fmt.Errorf("actual value %q cannot be converted to float", actual) + } + + return math.Abs(af-bf) / math.Abs(af), nil +} + +// InEpsilon asserts that expected and actual have a relative error less than epsilon +// +// Returns whether the assertion was successful (true) or not (false). +func InEpsilon(t TestingT, expected, actual interface{}, epsilon float64, msgAndArgs ...interface{}) bool { + actualEpsilon, err := calcRelativeError(expected, actual) + if err != nil { + return Fail(t, err.Error(), msgAndArgs...) + } + if actualEpsilon > epsilon { + return Fail(t, fmt.Sprintf("Relative error is too high: %#v (expected)\n"+ + " < %#v (actual)", epsilon, actualEpsilon), msgAndArgs...) + } + + return true +} + +// InEpsilonSlice is the same as InEpsilon, except it compares each value from two slices. +func InEpsilonSlice(t TestingT, expected, actual interface{}, epsilon float64, msgAndArgs ...interface{}) bool { + if expected == nil || actual == nil || + reflect.TypeOf(actual).Kind() != reflect.Slice || + reflect.TypeOf(expected).Kind() != reflect.Slice { + return Fail(t, fmt.Sprintf("Parameters must be slice"), msgAndArgs...) + } + + actualSlice := reflect.ValueOf(actual) + expectedSlice := reflect.ValueOf(expected) + + for i := 0; i < actualSlice.Len(); i++ { + result := InEpsilon(t, actualSlice.Index(i).Interface(), expectedSlice.Index(i).Interface(), epsilon) + if !result { + return result + } + } + + return true +} + +/* + Errors +*/ + +// NoError asserts that a function returned no error (i.e. `nil`). +// +// actualObj, err := SomeFunction() +// if assert.NoError(t, err) { +// assert.Equal(t, expectedObj, actualObj) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func NoError(t TestingT, err error, msgAndArgs ...interface{}) bool { + if err != nil { + return Fail(t, fmt.Sprintf("Received unexpected error:\n%+v", err), msgAndArgs...) + } + + return true +} + +// Error asserts that a function returned an error (i.e. not `nil`). +// +// actualObj, err := SomeFunction() +// if assert.Error(t, err) { +// assert.Equal(t, expectedError, err) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func Error(t TestingT, err error, msgAndArgs ...interface{}) bool { + + if err == nil { + return Fail(t, "An error is expected but got nil.", msgAndArgs...) + } + + return true +} + +// EqualError asserts that a function returned an error (i.e. not `nil`) +// and that it is equal to the provided error. +// +// actualObj, err := SomeFunction() +// assert.EqualError(t, err, expectedErrorString) +// +// Returns whether the assertion was successful (true) or not (false). +func EqualError(t TestingT, theError error, errString string, msgAndArgs ...interface{}) bool { + if !Error(t, theError, msgAndArgs...) { + return false + } + expected := errString + actual := theError.Error() + // don't need to use deep equals here, we know they are both strings + if expected != actual { + return Fail(t, fmt.Sprintf("Error message not equal:\n"+ + "expected: %q\n"+ + "actual: %q", expected, actual), msgAndArgs...) + } + return true +} + +// matchRegexp return true if a specified regexp matches a string. +func matchRegexp(rx interface{}, str interface{}) bool { + + var r *regexp.Regexp + if rr, ok := rx.(*regexp.Regexp); ok { + r = rr + } else { + r = regexp.MustCompile(fmt.Sprint(rx)) + } + + return (r.FindStringIndex(fmt.Sprint(str)) != nil) + +} + +// Regexp asserts that a specified regexp matches a string. +// +// assert.Regexp(t, regexp.MustCompile("start"), "it's starting") +// assert.Regexp(t, "start...$", "it's not starting") +// +// Returns whether the assertion was successful (true) or not (false). +func Regexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) bool { + + match := matchRegexp(rx, str) + + if !match { + Fail(t, fmt.Sprintf("Expect \"%v\" to match \"%v\"", str, rx), msgAndArgs...) + } + + return match +} + +// NotRegexp asserts that a specified regexp does not match a string. +// +// assert.NotRegexp(t, regexp.MustCompile("starts"), "it's starting") +// assert.NotRegexp(t, "^start", "it's not starting") +// +// Returns whether the assertion was successful (true) or not (false). +func NotRegexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) bool { + match := matchRegexp(rx, str) + + if match { + Fail(t, fmt.Sprintf("Expect \"%v\" to NOT match \"%v\"", str, rx), msgAndArgs...) + } + + return !match + +} + +// Zero asserts that i is the zero value for its type and returns the truth. +func Zero(t TestingT, i interface{}, msgAndArgs ...interface{}) bool { + if i != nil && !reflect.DeepEqual(i, reflect.Zero(reflect.TypeOf(i)).Interface()) { + return Fail(t, fmt.Sprintf("Should be zero, but was %v", i), msgAndArgs...) + } + return true +} + +// NotZero asserts that i is not the zero value for its type and returns the truth. +func NotZero(t TestingT, i interface{}, msgAndArgs ...interface{}) bool { + if i == nil || reflect.DeepEqual(i, reflect.Zero(reflect.TypeOf(i)).Interface()) { + return Fail(t, fmt.Sprintf("Should not be zero, but was %v", i), msgAndArgs...) + } + return true +} + +// JSONEq asserts that two JSON strings are equivalent. +// +// assert.JSONEq(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`) +// +// Returns whether the assertion was successful (true) or not (false). +func JSONEq(t TestingT, expected string, actual string, msgAndArgs ...interface{}) bool { + var expectedJSONAsInterface, actualJSONAsInterface interface{} + + if err := json.Unmarshal([]byte(expected), &expectedJSONAsInterface); err != nil { + return Fail(t, fmt.Sprintf("Expected value ('%s') is not valid json.\nJSON parsing error: '%s'", expected, err.Error()), msgAndArgs...) + } + + if err := json.Unmarshal([]byte(actual), &actualJSONAsInterface); err != nil { + return Fail(t, fmt.Sprintf("Input ('%s') needs to be valid json.\nJSON parsing error: '%s'", actual, err.Error()), msgAndArgs...) + } + + return Equal(t, expectedJSONAsInterface, actualJSONAsInterface, msgAndArgs...) +} + +func typeAndKind(v interface{}) (reflect.Type, reflect.Kind) { + t := reflect.TypeOf(v) + k := t.Kind() + + if k == reflect.Ptr { + t = t.Elem() + k = t.Kind() + } + return t, k +} + +// diff returns a diff of both values as long as both are of the same type and +// are a struct, map, slice or array. Otherwise it returns an empty string. +func diff(expected interface{}, actual interface{}) string { + if expected == nil || actual == nil { + return "" + } + + et, ek := typeAndKind(expected) + at, _ := typeAndKind(actual) + + if et != at { + return "" + } + + if ek != reflect.Struct && ek != reflect.Map && ek != reflect.Slice && ek != reflect.Array { + return "" + } + + e := spewConfig.Sdump(expected) + a := spewConfig.Sdump(actual) + + diff, _ := difflib.GetUnifiedDiffString(difflib.UnifiedDiff{ + A: difflib.SplitLines(e), + B: difflib.SplitLines(a), + FromFile: "Expected", + FromDate: "", + ToFile: "Actual", + ToDate: "", + Context: 1, + }) + + return "\n\nDiff:\n" + diff +} + +// validateEqualArgs checks whether provided arguments can be safely used in the +// Equal/NotEqual functions. +func validateEqualArgs(expected, actual interface{}) error { + if isFunction(expected) || isFunction(actual) { + return errors.New("cannot take func type as argument") + } + return nil +} + +func isFunction(arg interface{}) bool { + if arg == nil { + return false + } + return reflect.TypeOf(arg).Kind() == reflect.Func +} + +var spewConfig = spew.ConfigState{ + Indent: " ", + DisablePointerAddresses: true, + DisableCapacities: true, + SortKeys: true, +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/testify/assert/doc.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/testify/assert/doc.go new file mode 100644 index 00000000..c9dccc4d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/testify/assert/doc.go @@ -0,0 +1,45 @@ +// Package assert provides a set of comprehensive testing tools for use with the normal Go testing system. +// +// Example Usage +// +// The following is a complete example using assert in a standard test function: +// import ( +// "testing" +// "github.com/stretchr/testify/assert" +// ) +// +// func TestSomething(t *testing.T) { +// +// var a string = "Hello" +// var b string = "Hello" +// +// assert.Equal(t, a, b, "The two words should be the same.") +// +// } +// +// if you assert many times, use the format below: +// +// import ( +// "testing" +// "github.com/stretchr/testify/assert" +// ) +// +// func TestSomething(t *testing.T) { +// assert := assert.New(t) +// +// var a string = "Hello" +// var b string = "Hello" +// +// assert.Equal(a, b, "The two words should be the same.") +// } +// +// Assertions +// +// Assertions allow you to easily write test code, and are global funcs in the `assert` package. +// All assertion functions take, as the first argument, the `*testing.T` object provided by the +// testing framework. This allows the assertion funcs to write the failings and other details to +// the correct place. +// +// Every assertion function also takes an optional string message as the final argument, +// allowing custom error messages to be appended to the message the assertion method outputs. +package assert diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/testify/assert/errors.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/testify/assert/errors.go new file mode 100644 index 00000000..ac9dc9d1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/testify/assert/errors.go @@ -0,0 +1,10 @@ +package assert + +import ( + "errors" +) + +// AnError is an error instance useful for testing. If the code does not care +// about error specifics, and only needs to return the error for example, this +// error should be used to make the test code more readable. +var AnError = errors.New("assert.AnError general error for testing") diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/testify/assert/forward_assertions.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/testify/assert/forward_assertions.go new file mode 100644 index 00000000..9ad56851 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/testify/assert/forward_assertions.go @@ -0,0 +1,16 @@ +package assert + +// Assertions provides assertion methods around the +// TestingT interface. +type Assertions struct { + t TestingT +} + +// New makes a new Assertions object for the specified TestingT. +func New(t TestingT) *Assertions { + return &Assertions{ + t: t, + } +} + +//go:generate go run ../_codegen/main.go -output-package=assert -template=assertion_forward.go.tmpl -include-format-funcs diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/testify/assert/http_assertions.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/testify/assert/http_assertions.go new file mode 100644 index 00000000..ba811c04 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/testify/assert/http_assertions.go @@ -0,0 +1,127 @@ +package assert + +import ( + "fmt" + "net/http" + "net/http/httptest" + "net/url" + "strings" +) + +// httpCode is a helper that returns HTTP code of the response. It returns -1 and +// an error if building a new request fails. +func httpCode(handler http.HandlerFunc, method, url string, values url.Values) (int, error) { + w := httptest.NewRecorder() + req, err := http.NewRequest(method, url+"?"+values.Encode(), nil) + if err != nil { + return -1, err + } + handler(w, req) + return w.Code, nil +} + +// HTTPSuccess asserts that a specified handler returns a success status code. +// +// assert.HTTPSuccess(t, myHandler, "POST", "http://www.google.com", nil) +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPSuccess(t TestingT, handler http.HandlerFunc, method, url string, values url.Values) bool { + code, err := httpCode(handler, method, url, values) + if err != nil { + Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err)) + return false + } + + isSuccessCode := code >= http.StatusOK && code <= http.StatusPartialContent + if !isSuccessCode { + Fail(t, fmt.Sprintf("Expected HTTP success status code for %q but received %d", url+"?"+values.Encode(), code)) + } + + return isSuccessCode +} + +// HTTPRedirect asserts that a specified handler returns a redirect status code. +// +// assert.HTTPRedirect(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPRedirect(t TestingT, handler http.HandlerFunc, method, url string, values url.Values) bool { + code, err := httpCode(handler, method, url, values) + if err != nil { + Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err)) + return false + } + + isRedirectCode := code >= http.StatusMultipleChoices && code <= http.StatusTemporaryRedirect + if !isRedirectCode { + Fail(t, fmt.Sprintf("Expected HTTP redirect status code for %q but received %d", url+"?"+values.Encode(), code)) + } + + return isRedirectCode +} + +// HTTPError asserts that a specified handler returns an error status code. +// +// assert.HTTPError(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPError(t TestingT, handler http.HandlerFunc, method, url string, values url.Values) bool { + code, err := httpCode(handler, method, url, values) + if err != nil { + Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err)) + return false + } + + isErrorCode := code >= http.StatusBadRequest + if !isErrorCode { + Fail(t, fmt.Sprintf("Expected HTTP error status code for %q but received %d", url+"?"+values.Encode(), code)) + } + + return isErrorCode +} + +// HTTPBody is a helper that returns HTTP body of the response. It returns +// empty string if building a new request fails. +func HTTPBody(handler http.HandlerFunc, method, url string, values url.Values) string { + w := httptest.NewRecorder() + req, err := http.NewRequest(method, url+"?"+values.Encode(), nil) + if err != nil { + return "" + } + handler(w, req) + return w.Body.String() +} + +// HTTPBodyContains asserts that a specified handler returns a +// body that contains a string. +// +// assert.HTTPBodyContains(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPBodyContains(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, str interface{}) bool { + body := HTTPBody(handler, method, url, values) + + contains := strings.Contains(body, fmt.Sprint(str)) + if !contains { + Fail(t, fmt.Sprintf("Expected response body for \"%s\" to contain \"%s\" but found \"%s\"", url+"?"+values.Encode(), str, body)) + } + + return contains +} + +// HTTPBodyNotContains asserts that a specified handler returns a +// body that does not contain a string. +// +// assert.HTTPBodyNotContains(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPBodyNotContains(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, str interface{}) bool { + body := HTTPBody(handler, method, url, values) + + contains := strings.Contains(body, fmt.Sprint(str)) + if contains { + Fail(t, fmt.Sprintf("Expected response body for \"%s\" to NOT contain \"%s\" but found \"%s\"", url+"?"+values.Encode(), str, body)) + } + + return !contains +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/testify/mock/doc.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/testify/mock/doc.go new file mode 100644 index 00000000..7324128e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/testify/mock/doc.go @@ -0,0 +1,44 @@ +// Package mock provides a system by which it is possible to mock your objects +// and verify calls are happening as expected. +// +// Example Usage +// +// The mock package provides an object, Mock, that tracks activity on another object. It is usually +// embedded into a test object as shown below: +// +// type MyTestObject struct { +// // add a Mock object instance +// mock.Mock +// +// // other fields go here as normal +// } +// +// When implementing the methods of an interface, you wire your functions up +// to call the Mock.Called(args...) method, and return the appropriate values. +// +// For example, to mock a method that saves the name and age of a person and returns +// the year of their birth or an error, you might write this: +// +// func (o *MyTestObject) SavePersonDetails(firstname, lastname string, age int) (int, error) { +// args := o.Called(firstname, lastname, age) +// return args.Int(0), args.Error(1) +// } +// +// The Int, Error and Bool methods are examples of strongly typed getters that take the argument +// index position. Given this argument list: +// +// (12, true, "Something") +// +// You could read them out strongly typed like this: +// +// args.Int(0) +// args.Bool(1) +// args.String(2) +// +// For objects of your own type, use the generic Arguments.Get(index) method and make a type assertion: +// +// return args.Get(0).(*MyObject), args.Get(1).(*AnotherObjectOfMine) +// +// This may cause a panic if the object you are getting is nil (the type assertion will fail), in those +// cases you should check for nil first. +package mock diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/testify/mock/mock.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/testify/mock/mock.go new file mode 100644 index 00000000..5c171240 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/testify/mock/mock.go @@ -0,0 +1,784 @@ +package mock + +import ( + "fmt" + "reflect" + "regexp" + "runtime" + "strings" + "sync" + "time" + + "github.com/davecgh/go-spew/spew" + "github.com/pmezard/go-difflib/difflib" + "github.com/stretchr/objx" + "github.com/stretchr/testify/assert" +) + +// TestingT is an interface wrapper around *testing.T +type TestingT interface { + Logf(format string, args ...interface{}) + Errorf(format string, args ...interface{}) + FailNow() +} + +/* + Call +*/ + +// Call represents a method call and is used for setting expectations, +// as well as recording activity. +type Call struct { + Parent *Mock + + // The name of the method that was or will be called. + Method string + + // Holds the arguments of the method. + Arguments Arguments + + // Holds the arguments that should be returned when + // this method is called. + ReturnArguments Arguments + + // The number of times to return the return arguments when setting + // expectations. 0 means to always return the value. + Repeatability int + + // Amount of times this call has been called + totalCalls int + + // Holds a channel that will be used to block the Return until it either + // receives a message or is closed. nil means it returns immediately. + WaitFor <-chan time.Time + + // Holds a handler used to manipulate arguments content that are passed by + // reference. It's useful when mocking methods such as unmarshalers or + // decoders. + RunFn func(Arguments) +} + +func newCall(parent *Mock, methodName string, methodArguments ...interface{}) *Call { + return &Call{ + Parent: parent, + Method: methodName, + Arguments: methodArguments, + ReturnArguments: make([]interface{}, 0), + Repeatability: 0, + WaitFor: nil, + RunFn: nil, + } +} + +func (c *Call) lock() { + c.Parent.mutex.Lock() +} + +func (c *Call) unlock() { + c.Parent.mutex.Unlock() +} + +// Return specifies the return arguments for the expectation. +// +// Mock.On("DoSomething").Return(errors.New("failed")) +func (c *Call) Return(returnArguments ...interface{}) *Call { + c.lock() + defer c.unlock() + + c.ReturnArguments = returnArguments + + return c +} + +// Once indicates that that the mock should only return the value once. +// +// Mock.On("MyMethod", arg1, arg2).Return(returnArg1, returnArg2).Once() +func (c *Call) Once() *Call { + return c.Times(1) +} + +// Twice indicates that that the mock should only return the value twice. +// +// Mock.On("MyMethod", arg1, arg2).Return(returnArg1, returnArg2).Twice() +func (c *Call) Twice() *Call { + return c.Times(2) +} + +// Times indicates that that the mock should only return the indicated number +// of times. +// +// Mock.On("MyMethod", arg1, arg2).Return(returnArg1, returnArg2).Times(5) +func (c *Call) Times(i int) *Call { + c.lock() + defer c.unlock() + c.Repeatability = i + return c +} + +// WaitUntil sets the channel that will block the mock's return until its closed +// or a message is received. +// +// Mock.On("MyMethod", arg1, arg2).WaitUntil(time.After(time.Second)) +func (c *Call) WaitUntil(w <-chan time.Time) *Call { + c.lock() + defer c.unlock() + c.WaitFor = w + return c +} + +// After sets how long to block until the call returns +// +// Mock.On("MyMethod", arg1, arg2).After(time.Second) +func (c *Call) After(d time.Duration) *Call { + return c.WaitUntil(time.After(d)) +} + +// Run sets a handler to be called before returning. It can be used when +// mocking a method such as unmarshalers that takes a pointer to a struct and +// sets properties in such struct +// +// Mock.On("Unmarshal", AnythingOfType("*map[string]interface{}").Return().Run(func(args Arguments) { +// arg := args.Get(0).(*map[string]interface{}) +// arg["foo"] = "bar" +// }) +func (c *Call) Run(fn func(args Arguments)) *Call { + c.lock() + defer c.unlock() + c.RunFn = fn + return c +} + +// On chains a new expectation description onto the mocked interface. This +// allows syntax like. +// +// Mock. +// On("MyMethod", 1).Return(nil). +// On("MyOtherMethod", 'a', 'b', 'c').Return(errors.New("Some Error")) +func (c *Call) On(methodName string, arguments ...interface{}) *Call { + return c.Parent.On(methodName, arguments...) +} + +// Mock is the workhorse used to track activity on another object. +// For an example of its usage, refer to the "Example Usage" section at the top +// of this document. +type Mock struct { + // Represents the calls that are expected of + // an object. + ExpectedCalls []*Call + + // Holds the calls that were made to this mocked object. + Calls []Call + + // TestData holds any data that might be useful for testing. Testify ignores + // this data completely allowing you to do whatever you like with it. + testData objx.Map + + mutex sync.Mutex +} + +// TestData holds any data that might be useful for testing. Testify ignores +// this data completely allowing you to do whatever you like with it. +func (m *Mock) TestData() objx.Map { + + if m.testData == nil { + m.testData = make(objx.Map) + } + + return m.testData +} + +/* + Setting expectations +*/ + +// On starts a description of an expectation of the specified method +// being called. +// +// Mock.On("MyMethod", arg1, arg2) +func (m *Mock) On(methodName string, arguments ...interface{}) *Call { + for _, arg := range arguments { + if v := reflect.ValueOf(arg); v.Kind() == reflect.Func { + panic(fmt.Sprintf("cannot use Func in expectations. Use mock.AnythingOfType(\"%T\")", arg)) + } + } + + m.mutex.Lock() + defer m.mutex.Unlock() + c := newCall(m, methodName, arguments...) + m.ExpectedCalls = append(m.ExpectedCalls, c) + return c +} + +// /* +// Recording and responding to activity +// */ + +func (m *Mock) findExpectedCall(method string, arguments ...interface{}) (int, *Call) { + for i, call := range m.ExpectedCalls { + if call.Method == method && call.Repeatability > -1 { + + _, diffCount := call.Arguments.Diff(arguments) + if diffCount == 0 { + return i, call + } + + } + } + return -1, nil +} + +func (m *Mock) findClosestCall(method string, arguments ...interface{}) (bool, *Call) { + diffCount := 0 + var closestCall *Call + + for _, call := range m.expectedCalls() { + if call.Method == method { + + _, tempDiffCount := call.Arguments.Diff(arguments) + if tempDiffCount < diffCount || diffCount == 0 { + diffCount = tempDiffCount + closestCall = call + } + + } + } + + if closestCall == nil { + return false, nil + } + + return true, closestCall +} + +func callString(method string, arguments Arguments, includeArgumentValues bool) string { + + var argValsString string + if includeArgumentValues { + var argVals []string + for argIndex, arg := range arguments { + argVals = append(argVals, fmt.Sprintf("%d: %#v", argIndex, arg)) + } + argValsString = fmt.Sprintf("\n\t\t%s", strings.Join(argVals, "\n\t\t")) + } + + return fmt.Sprintf("%s(%s)%s", method, arguments.String(), argValsString) +} + +// Called tells the mock object that a method has been called, and gets an array +// of arguments to return. Panics if the call is unexpected (i.e. not preceded by +// appropriate .On .Return() calls) +// If Call.WaitFor is set, blocks until the channel is closed or receives a message. +func (m *Mock) Called(arguments ...interface{}) Arguments { + // get the calling function's name + pc, _, _, ok := runtime.Caller(1) + if !ok { + panic("Couldn't get the caller information") + } + functionPath := runtime.FuncForPC(pc).Name() + //Next four lines are required to use GCCGO function naming conventions. + //For Ex: github_com_docker_libkv_store_mock.WatchTree.pN39_github_com_docker_libkv_store_mock.Mock + //uses interface information unlike golang github.com/docker/libkv/store/mock.(*Mock).WatchTree + //With GCCGO we need to remove interface information starting from pN
. + re := regexp.MustCompile("\\.pN\\d+_") + if re.MatchString(functionPath) { + functionPath = re.Split(functionPath, -1)[0] + } + parts := strings.Split(functionPath, ".") + functionName := parts[len(parts)-1] + return m.MethodCalled(functionName, arguments...) +} + +// MethodCalled tells the mock object that the given method has been called, and gets +// an array of arguments to return. Panics if the call is unexpected (i.e. not preceded +// by appropriate .On .Return() calls) +// If Call.WaitFor is set, blocks until the channel is closed or receives a message. +func (m *Mock) MethodCalled(methodName string, arguments ...interface{}) Arguments { + m.mutex.Lock() + found, call := m.findExpectedCall(methodName, arguments...) + + if found < 0 { + // we have to fail here - because we don't know what to do + // as the return arguments. This is because: + // + // a) this is a totally unexpected call to this method, + // b) the arguments are not what was expected, or + // c) the developer has forgotten to add an accompanying On...Return pair. + + closestFound, closestCall := m.findClosestCall(methodName, arguments...) + m.mutex.Unlock() + + if closestFound { + panic(fmt.Sprintf("\n\nmock: Unexpected Method Call\n-----------------------------\n\n%s\n\nThe closest call I have is: \n\n%s\n\n%s\n", callString(methodName, arguments, true), callString(methodName, closestCall.Arguments, true), diffArguments(arguments, closestCall.Arguments))) + } else { + panic(fmt.Sprintf("\nassert: mock: I don't know what to return because the method call was unexpected.\n\tEither do Mock.On(\"%s\").Return(...) first, or remove the %s() call.\n\tThis method was unexpected:\n\t\t%s\n\tat: %s", methodName, methodName, callString(methodName, arguments, true), assert.CallerInfo())) + } + } + + switch { + case call.Repeatability == 1: + call.Repeatability = -1 + call.totalCalls++ + + case call.Repeatability > 1: + call.Repeatability-- + call.totalCalls++ + + case call.Repeatability == 0: + call.totalCalls++ + } + + // add the call + m.Calls = append(m.Calls, *newCall(m, methodName, arguments...)) + m.mutex.Unlock() + + // block if specified + if call.WaitFor != nil { + <-call.WaitFor + } + + m.mutex.Lock() + runFn := call.RunFn + m.mutex.Unlock() + + if runFn != nil { + runFn(arguments) + } + + m.mutex.Lock() + returnArgs := call.ReturnArguments + m.mutex.Unlock() + + return returnArgs +} + +/* + Assertions +*/ + +type assertExpectationser interface { + AssertExpectations(TestingT) bool +} + +// AssertExpectationsForObjects asserts that everything specified with On and Return +// of the specified objects was in fact called as expected. +// +// Calls may have occurred in any order. +func AssertExpectationsForObjects(t TestingT, testObjects ...interface{}) bool { + for _, obj := range testObjects { + if m, ok := obj.(Mock); ok { + t.Logf("Deprecated mock.AssertExpectationsForObjects(myMock.Mock) use mock.AssertExpectationsForObjects(myMock)") + obj = &m + } + m := obj.(assertExpectationser) + if !m.AssertExpectations(t) { + return false + } + } + return true +} + +// AssertExpectations asserts that everything specified with On and Return was +// in fact called as expected. Calls may have occurred in any order. +func (m *Mock) AssertExpectations(t TestingT) bool { + m.mutex.Lock() + defer m.mutex.Unlock() + var somethingMissing bool + var failedExpectations int + + // iterate through each expectation + expectedCalls := m.expectedCalls() + for _, expectedCall := range expectedCalls { + if !m.methodWasCalled(expectedCall.Method, expectedCall.Arguments) && expectedCall.totalCalls == 0 { + somethingMissing = true + failedExpectations++ + t.Logf("\u274C\t%s(%s)", expectedCall.Method, expectedCall.Arguments.String()) + } else { + if expectedCall.Repeatability > 0 { + somethingMissing = true + failedExpectations++ + } else { + t.Logf("\u2705\t%s(%s)", expectedCall.Method, expectedCall.Arguments.String()) + } + } + } + + if somethingMissing { + t.Errorf("FAIL: %d out of %d expectation(s) were met.\n\tThe code you are testing needs to make %d more call(s).\n\tat: %s", len(expectedCalls)-failedExpectations, len(expectedCalls), failedExpectations, assert.CallerInfo()) + } + + return !somethingMissing +} + +// AssertNumberOfCalls asserts that the method was called expectedCalls times. +func (m *Mock) AssertNumberOfCalls(t TestingT, methodName string, expectedCalls int) bool { + m.mutex.Lock() + defer m.mutex.Unlock() + var actualCalls int + for _, call := range m.calls() { + if call.Method == methodName { + actualCalls++ + } + } + return assert.Equal(t, expectedCalls, actualCalls, fmt.Sprintf("Expected number of calls (%d) does not match the actual number of calls (%d).", expectedCalls, actualCalls)) +} + +// AssertCalled asserts that the method was called. +// It can produce a false result when an argument is a pointer type and the underlying value changed after calling the mocked method. +func (m *Mock) AssertCalled(t TestingT, methodName string, arguments ...interface{}) bool { + m.mutex.Lock() + defer m.mutex.Unlock() + if !assert.True(t, m.methodWasCalled(methodName, arguments), fmt.Sprintf("The \"%s\" method should have been called with %d argument(s), but was not.", methodName, len(arguments))) { + t.Logf("%v", m.expectedCalls()) + return false + } + return true +} + +// AssertNotCalled asserts that the method was not called. +// It can produce a false result when an argument is a pointer type and the underlying value changed after calling the mocked method. +func (m *Mock) AssertNotCalled(t TestingT, methodName string, arguments ...interface{}) bool { + m.mutex.Lock() + defer m.mutex.Unlock() + if !assert.False(t, m.methodWasCalled(methodName, arguments), fmt.Sprintf("The \"%s\" method was called with %d argument(s), but should NOT have been.", methodName, len(arguments))) { + t.Logf("%v", m.expectedCalls()) + return false + } + return true +} + +func (m *Mock) methodWasCalled(methodName string, expected []interface{}) bool { + for _, call := range m.calls() { + if call.Method == methodName { + + _, differences := Arguments(expected).Diff(call.Arguments) + + if differences == 0 { + // found the expected call + return true + } + + } + } + // we didn't find the expected call + return false +} + +func (m *Mock) expectedCalls() []*Call { + return append([]*Call{}, m.ExpectedCalls...) +} + +func (m *Mock) calls() []Call { + return append([]Call{}, m.Calls...) +} + +/* + Arguments +*/ + +// Arguments holds an array of method arguments or return values. +type Arguments []interface{} + +const ( + // Anything is used in Diff and Assert when the argument being tested + // shouldn't be taken into consideration. + Anything string = "mock.Anything" +) + +// AnythingOfTypeArgument is a string that contains the type of an argument +// for use when type checking. Used in Diff and Assert. +type AnythingOfTypeArgument string + +// AnythingOfType returns an AnythingOfTypeArgument object containing the +// name of the type to check for. Used in Diff and Assert. +// +// For example: +// Assert(t, AnythingOfType("string"), AnythingOfType("int")) +func AnythingOfType(t string) AnythingOfTypeArgument { + return AnythingOfTypeArgument(t) +} + +// argumentMatcher performs custom argument matching, returning whether or +// not the argument is matched by the expectation fixture function. +type argumentMatcher struct { + // fn is a function which accepts one argument, and returns a bool. + fn reflect.Value +} + +func (f argumentMatcher) Matches(argument interface{}) bool { + expectType := f.fn.Type().In(0) + + if reflect.TypeOf(argument).AssignableTo(expectType) { + result := f.fn.Call([]reflect.Value{reflect.ValueOf(argument)}) + return result[0].Bool() + } + return false +} + +func (f argumentMatcher) String() string { + return fmt.Sprintf("func(%s) bool", f.fn.Type().In(0).Name()) +} + +// MatchedBy can be used to match a mock call based on only certain properties +// from a complex struct or some calculation. It takes a function that will be +// evaluated with the called argument and will return true when there's a match +// and false otherwise. +// +// Example: +// m.On("Do", MatchedBy(func(req *http.Request) bool { return req.Host == "example.com" })) +// +// |fn|, must be a function accepting a single argument (of the expected type) +// which returns a bool. If |fn| doesn't match the required signature, +// MatchedBy() panics. +func MatchedBy(fn interface{}) argumentMatcher { + fnType := reflect.TypeOf(fn) + + if fnType.Kind() != reflect.Func { + panic(fmt.Sprintf("assert: arguments: %s is not a func", fn)) + } + if fnType.NumIn() != 1 { + panic(fmt.Sprintf("assert: arguments: %s does not take exactly one argument", fn)) + } + if fnType.NumOut() != 1 || fnType.Out(0).Kind() != reflect.Bool { + panic(fmt.Sprintf("assert: arguments: %s does not return a bool", fn)) + } + + return argumentMatcher{fn: reflect.ValueOf(fn)} +} + +// Get Returns the argument at the specified index. +func (args Arguments) Get(index int) interface{} { + if index+1 > len(args) { + panic(fmt.Sprintf("assert: arguments: Cannot call Get(%d) because there are %d argument(s).", index, len(args))) + } + return args[index] +} + +// Is gets whether the objects match the arguments specified. +func (args Arguments) Is(objects ...interface{}) bool { + for i, obj := range args { + if obj != objects[i] { + return false + } + } + return true +} + +// Diff gets a string describing the differences between the arguments +// and the specified objects. +// +// Returns the diff string and number of differences found. +func (args Arguments) Diff(objects []interface{}) (string, int) { + + var output = "\n" + var differences int + + var maxArgCount = len(args) + if len(objects) > maxArgCount { + maxArgCount = len(objects) + } + + for i := 0; i < maxArgCount; i++ { + var actual, expected interface{} + + if len(objects) <= i { + actual = "(Missing)" + } else { + actual = objects[i] + } + + if len(args) <= i { + expected = "(Missing)" + } else { + expected = args[i] + } + + if matcher, ok := expected.(argumentMatcher); ok { + if matcher.Matches(actual) { + output = fmt.Sprintf("%s\t%d: \u2705 %s matched by %s\n", output, i, actual, matcher) + } else { + differences++ + output = fmt.Sprintf("%s\t%d: \u2705 %s not matched by %s\n", output, i, actual, matcher) + } + } else if reflect.TypeOf(expected) == reflect.TypeOf((*AnythingOfTypeArgument)(nil)).Elem() { + + // type checking + if reflect.TypeOf(actual).Name() != string(expected.(AnythingOfTypeArgument)) && reflect.TypeOf(actual).String() != string(expected.(AnythingOfTypeArgument)) { + // not match + differences++ + output = fmt.Sprintf("%s\t%d: \u274C type %s != type %s - %s\n", output, i, expected, reflect.TypeOf(actual).Name(), actual) + } + + } else { + + // normal checking + + if assert.ObjectsAreEqual(expected, Anything) || assert.ObjectsAreEqual(actual, Anything) || assert.ObjectsAreEqual(actual, expected) { + // match + output = fmt.Sprintf("%s\t%d: \u2705 %s == %s\n", output, i, actual, expected) + } else { + // not match + differences++ + output = fmt.Sprintf("%s\t%d: \u274C %s != %s\n", output, i, actual, expected) + } + } + + } + + if differences == 0 { + return "No differences.", differences + } + + return output, differences + +} + +// Assert compares the arguments with the specified objects and fails if +// they do not exactly match. +func (args Arguments) Assert(t TestingT, objects ...interface{}) bool { + + // get the differences + diff, diffCount := args.Diff(objects) + + if diffCount == 0 { + return true + } + + // there are differences... report them... + t.Logf(diff) + t.Errorf("%sArguments do not match.", assert.CallerInfo()) + + return false + +} + +// String gets the argument at the specified index. Panics if there is no argument, or +// if the argument is of the wrong type. +// +// If no index is provided, String() returns a complete string representation +// of the arguments. +func (args Arguments) String(indexOrNil ...int) string { + + if len(indexOrNil) == 0 { + // normal String() method - return a string representation of the args + var argsStr []string + for _, arg := range args { + argsStr = append(argsStr, fmt.Sprintf("%s", reflect.TypeOf(arg))) + } + return strings.Join(argsStr, ",") + } else if len(indexOrNil) == 1 { + // Index has been specified - get the argument at that index + var index = indexOrNil[0] + var s string + var ok bool + if s, ok = args.Get(index).(string); !ok { + panic(fmt.Sprintf("assert: arguments: String(%d) failed because object wasn't correct type: %s", index, args.Get(index))) + } + return s + } + + panic(fmt.Sprintf("assert: arguments: Wrong number of arguments passed to String. Must be 0 or 1, not %d", len(indexOrNil))) + +} + +// Int gets the argument at the specified index. Panics if there is no argument, or +// if the argument is of the wrong type. +func (args Arguments) Int(index int) int { + var s int + var ok bool + if s, ok = args.Get(index).(int); !ok { + panic(fmt.Sprintf("assert: arguments: Int(%d) failed because object wasn't correct type: %v", index, args.Get(index))) + } + return s +} + +// Error gets the argument at the specified index. Panics if there is no argument, or +// if the argument is of the wrong type. +func (args Arguments) Error(index int) error { + obj := args.Get(index) + var s error + var ok bool + if obj == nil { + return nil + } + if s, ok = obj.(error); !ok { + panic(fmt.Sprintf("assert: arguments: Error(%d) failed because object wasn't correct type: %v", index, args.Get(index))) + } + return s +} + +// Bool gets the argument at the specified index. Panics if there is no argument, or +// if the argument is of the wrong type. +func (args Arguments) Bool(index int) bool { + var s bool + var ok bool + if s, ok = args.Get(index).(bool); !ok { + panic(fmt.Sprintf("assert: arguments: Bool(%d) failed because object wasn't correct type: %v", index, args.Get(index))) + } + return s +} + +func typeAndKind(v interface{}) (reflect.Type, reflect.Kind) { + t := reflect.TypeOf(v) + k := t.Kind() + + if k == reflect.Ptr { + t = t.Elem() + k = t.Kind() + } + return t, k +} + +func diffArguments(expected Arguments, actual Arguments) string { + if len(expected) != len(actual) { + return fmt.Sprintf("Provided %v arguments, mocked for %v arguments", len(expected), len(actual)) + } + + for x := range expected { + if diffString := diff(expected[x], actual[x]); diffString != "" { + return fmt.Sprintf("Difference found in argument %v:\n\n%s", x, diffString) + } + } + + return "" +} + +// diff returns a diff of both values as long as both are of the same type and +// are a struct, map, slice or array. Otherwise it returns an empty string. +func diff(expected interface{}, actual interface{}) string { + if expected == nil || actual == nil { + return "" + } + + et, ek := typeAndKind(expected) + at, _ := typeAndKind(actual) + + if et != at { + return "" + } + + if ek != reflect.Struct && ek != reflect.Map && ek != reflect.Slice && ek != reflect.Array { + return "" + } + + e := spewConfig.Sdump(expected) + a := spewConfig.Sdump(actual) + + diff, _ := difflib.GetUnifiedDiffString(difflib.UnifiedDiff{ + A: difflib.SplitLines(e), + B: difflib.SplitLines(a), + FromFile: "Expected", + FromDate: "", + ToFile: "Actual", + ToDate: "", + Context: 1, + }) + + return diff +} + +var spewConfig = spew.ConfigState{ + Indent: " ", + DisablePointerAddresses: true, + DisableCapacities: true, + SortKeys: true, +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/testify/require/doc.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/testify/require/doc.go new file mode 100644 index 00000000..169de392 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/testify/require/doc.go @@ -0,0 +1,28 @@ +// Package require implements the same assertions as the `assert` package but +// stops test execution when a test fails. +// +// Example Usage +// +// The following is a complete example using require in a standard test function: +// import ( +// "testing" +// "github.com/stretchr/testify/require" +// ) +// +// func TestSomething(t *testing.T) { +// +// var a string = "Hello" +// var b string = "Hello" +// +// require.Equal(t, a, b, "The two words should be the same.") +// +// } +// +// Assertions +// +// The `require` package have same global functions as in the `assert` package, +// but instead of returning a boolean result they call `t.FailNow()`. +// +// Every assertion function also takes an optional string message as the final argument, +// allowing custom error messages to be appended to the message the assertion method outputs. +package require diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/testify/require/forward_requirements.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/testify/require/forward_requirements.go new file mode 100644 index 00000000..ac71d405 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/testify/require/forward_requirements.go @@ -0,0 +1,16 @@ +package require + +// Assertions provides assertion methods around the +// TestingT interface. +type Assertions struct { + t TestingT +} + +// New makes a new Assertions object for the specified TestingT. +func New(t TestingT) *Assertions { + return &Assertions{ + t: t, + } +} + +//go:generate go run ../_codegen/main.go -output-package=require -template=require_forward.go.tmpl -include-format-funcs diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/testify/require/require.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/testify/require/require.go new file mode 100644 index 00000000..2fe05578 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/testify/require/require.go @@ -0,0 +1,911 @@ +/* +* CODE GENERATED AUTOMATICALLY WITH github.com/stretchr/testify/_codegen +* THIS FILE MUST NOT BE EDITED BY HAND + */ + +package require + +import ( + assert "github.com/stretchr/testify/assert" + http "net/http" + url "net/url" + time "time" +) + +// Condition uses a Comparison to assert a complex condition. +func Condition(t TestingT, comp assert.Comparison, msgAndArgs ...interface{}) { + if !assert.Condition(t, comp, msgAndArgs...) { + t.FailNow() + } +} + +// Conditionf uses a Comparison to assert a complex condition. +func Conditionf(t TestingT, comp assert.Comparison, msg string, args ...interface{}) { + if !assert.Conditionf(t, comp, msg, args...) { + t.FailNow() + } +} + +// Contains asserts that the specified string, list(array, slice...) or map contains the +// specified substring or element. +// +// assert.Contains(t, "Hello World", "World") +// assert.Contains(t, ["Hello", "World"], "World") +// assert.Contains(t, {"Hello": "World"}, "Hello") +// +// Returns whether the assertion was successful (true) or not (false). +func Contains(t TestingT, s interface{}, contains interface{}, msgAndArgs ...interface{}) { + if !assert.Contains(t, s, contains, msgAndArgs...) { + t.FailNow() + } +} + +// Containsf asserts that the specified string, list(array, slice...) or map contains the +// specified substring or element. +// +// assert.Containsf(t, "Hello World", "World", "error message %s", "formatted") +// assert.Containsf(t, ["Hello", "World"], "World", "error message %s", "formatted") +// assert.Containsf(t, {"Hello": "World"}, "Hello", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func Containsf(t TestingT, s interface{}, contains interface{}, msg string, args ...interface{}) { + if !assert.Containsf(t, s, contains, msg, args...) { + t.FailNow() + } +} + +// Empty asserts that the specified object is empty. I.e. nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// assert.Empty(t, obj) +// +// Returns whether the assertion was successful (true) or not (false). +func Empty(t TestingT, object interface{}, msgAndArgs ...interface{}) { + if !assert.Empty(t, object, msgAndArgs...) { + t.FailNow() + } +} + +// Emptyf asserts that the specified object is empty. I.e. nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// assert.Emptyf(t, obj, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func Emptyf(t TestingT, object interface{}, msg string, args ...interface{}) { + if !assert.Emptyf(t, object, msg, args...) { + t.FailNow() + } +} + +// Equal asserts that two objects are equal. +// +// assert.Equal(t, 123, 123) +// +// Returns whether the assertion was successful (true) or not (false). +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). Function equality +// cannot be determined and will always fail. +func Equal(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + if !assert.Equal(t, expected, actual, msgAndArgs...) { + t.FailNow() + } +} + +// EqualError asserts that a function returned an error (i.e. not `nil`) +// and that it is equal to the provided error. +// +// actualObj, err := SomeFunction() +// assert.EqualError(t, err, expectedErrorString) +// +// Returns whether the assertion was successful (true) or not (false). +func EqualError(t TestingT, theError error, errString string, msgAndArgs ...interface{}) { + if !assert.EqualError(t, theError, errString, msgAndArgs...) { + t.FailNow() + } +} + +// EqualErrorf asserts that a function returned an error (i.e. not `nil`) +// and that it is equal to the provided error. +// +// actualObj, err := SomeFunction() +// assert.EqualErrorf(t, err, expectedErrorString, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func EqualErrorf(t TestingT, theError error, errString string, msg string, args ...interface{}) { + if !assert.EqualErrorf(t, theError, errString, msg, args...) { + t.FailNow() + } +} + +// EqualValues asserts that two objects are equal or convertable to the same types +// and equal. +// +// assert.EqualValues(t, uint32(123), int32(123)) +// +// Returns whether the assertion was successful (true) or not (false). +func EqualValues(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + if !assert.EqualValues(t, expected, actual, msgAndArgs...) { + t.FailNow() + } +} + +// EqualValuesf asserts that two objects are equal or convertable to the same types +// and equal. +// +// assert.EqualValuesf(t, uint32(123, "error message %s", "formatted"), int32(123)) +// +// Returns whether the assertion was successful (true) or not (false). +func EqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) { + if !assert.EqualValuesf(t, expected, actual, msg, args...) { + t.FailNow() + } +} + +// Equalf asserts that two objects are equal. +// +// assert.Equalf(t, 123, 123, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). Function equality +// cannot be determined and will always fail. +func Equalf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) { + if !assert.Equalf(t, expected, actual, msg, args...) { + t.FailNow() + } +} + +// Error asserts that a function returned an error (i.e. not `nil`). +// +// actualObj, err := SomeFunction() +// if assert.Error(t, err) { +// assert.Equal(t, expectedError, err) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func Error(t TestingT, err error, msgAndArgs ...interface{}) { + if !assert.Error(t, err, msgAndArgs...) { + t.FailNow() + } +} + +// Errorf asserts that a function returned an error (i.e. not `nil`). +// +// actualObj, err := SomeFunction() +// if assert.Errorf(t, err, "error message %s", "formatted") { +// assert.Equal(t, expectedErrorf, err) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func Errorf(t TestingT, err error, msg string, args ...interface{}) { + if !assert.Errorf(t, err, msg, args...) { + t.FailNow() + } +} + +// Exactly asserts that two objects are equal is value and type. +// +// assert.Exactly(t, int32(123), int64(123)) +// +// Returns whether the assertion was successful (true) or not (false). +func Exactly(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + if !assert.Exactly(t, expected, actual, msgAndArgs...) { + t.FailNow() + } +} + +// Exactlyf asserts that two objects are equal is value and type. +// +// assert.Exactlyf(t, int32(123, "error message %s", "formatted"), int64(123)) +// +// Returns whether the assertion was successful (true) or not (false). +func Exactlyf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) { + if !assert.Exactlyf(t, expected, actual, msg, args...) { + t.FailNow() + } +} + +// Fail reports a failure through +func Fail(t TestingT, failureMessage string, msgAndArgs ...interface{}) { + if !assert.Fail(t, failureMessage, msgAndArgs...) { + t.FailNow() + } +} + +// FailNow fails test +func FailNow(t TestingT, failureMessage string, msgAndArgs ...interface{}) { + if !assert.FailNow(t, failureMessage, msgAndArgs...) { + t.FailNow() + } +} + +// FailNowf fails test +func FailNowf(t TestingT, failureMessage string, msg string, args ...interface{}) { + if !assert.FailNowf(t, failureMessage, msg, args...) { + t.FailNow() + } +} + +// Failf reports a failure through +func Failf(t TestingT, failureMessage string, msg string, args ...interface{}) { + if !assert.Failf(t, failureMessage, msg, args...) { + t.FailNow() + } +} + +// False asserts that the specified value is false. +// +// assert.False(t, myBool) +// +// Returns whether the assertion was successful (true) or not (false). +func False(t TestingT, value bool, msgAndArgs ...interface{}) { + if !assert.False(t, value, msgAndArgs...) { + t.FailNow() + } +} + +// Falsef asserts that the specified value is false. +// +// assert.Falsef(t, myBool, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func Falsef(t TestingT, value bool, msg string, args ...interface{}) { + if !assert.Falsef(t, value, msg, args...) { + t.FailNow() + } +} + +// HTTPBodyContains asserts that a specified handler returns a +// body that contains a string. +// +// assert.HTTPBodyContains(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPBodyContains(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) { + if !assert.HTTPBodyContains(t, handler, method, url, values, str) { + t.FailNow() + } +} + +// HTTPBodyContainsf asserts that a specified handler returns a +// body that contains a string. +// +// assert.HTTPBodyContainsf(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPBodyContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) { + if !assert.HTTPBodyContainsf(t, handler, method, url, values, str) { + t.FailNow() + } +} + +// HTTPBodyNotContains asserts that a specified handler returns a +// body that does not contain a string. +// +// assert.HTTPBodyNotContains(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPBodyNotContains(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) { + if !assert.HTTPBodyNotContains(t, handler, method, url, values, str) { + t.FailNow() + } +} + +// HTTPBodyNotContainsf asserts that a specified handler returns a +// body that does not contain a string. +// +// assert.HTTPBodyNotContainsf(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPBodyNotContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) { + if !assert.HTTPBodyNotContainsf(t, handler, method, url, values, str) { + t.FailNow() + } +} + +// HTTPError asserts that a specified handler returns an error status code. +// +// assert.HTTPError(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPError(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values) { + if !assert.HTTPError(t, handler, method, url, values) { + t.FailNow() + } +} + +// HTTPErrorf asserts that a specified handler returns an error status code. +// +// assert.HTTPErrorf(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). +func HTTPErrorf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values) { + if !assert.HTTPErrorf(t, handler, method, url, values) { + t.FailNow() + } +} + +// HTTPRedirect asserts that a specified handler returns a redirect status code. +// +// assert.HTTPRedirect(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPRedirect(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values) { + if !assert.HTTPRedirect(t, handler, method, url, values) { + t.FailNow() + } +} + +// HTTPRedirectf asserts that a specified handler returns a redirect status code. +// +// assert.HTTPRedirectf(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). +func HTTPRedirectf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values) { + if !assert.HTTPRedirectf(t, handler, method, url, values) { + t.FailNow() + } +} + +// HTTPSuccess asserts that a specified handler returns a success status code. +// +// assert.HTTPSuccess(t, myHandler, "POST", "http://www.google.com", nil) +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPSuccess(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values) { + if !assert.HTTPSuccess(t, handler, method, url, values) { + t.FailNow() + } +} + +// HTTPSuccessf asserts that a specified handler returns a success status code. +// +// assert.HTTPSuccessf(t, myHandler, "POST", "http://www.google.com", nil, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPSuccessf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values) { + if !assert.HTTPSuccessf(t, handler, method, url, values) { + t.FailNow() + } +} + +// Implements asserts that an object is implemented by the specified interface. +// +// assert.Implements(t, (*MyInterface)(nil), new(MyObject)) +func Implements(t TestingT, interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) { + if !assert.Implements(t, interfaceObject, object, msgAndArgs...) { + t.FailNow() + } +} + +// Implementsf asserts that an object is implemented by the specified interface. +// +// assert.Implementsf(t, (*MyInterface, "error message %s", "formatted")(nil), new(MyObject)) +func Implementsf(t TestingT, interfaceObject interface{}, object interface{}, msg string, args ...interface{}) { + if !assert.Implementsf(t, interfaceObject, object, msg, args...) { + t.FailNow() + } +} + +// InDelta asserts that the two numerals are within delta of each other. +// +// assert.InDelta(t, math.Pi, (22 / 7.0), 0.01) +// +// Returns whether the assertion was successful (true) or not (false). +func InDelta(t TestingT, expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) { + if !assert.InDelta(t, expected, actual, delta, msgAndArgs...) { + t.FailNow() + } +} + +// InDeltaSlice is the same as InDelta, except it compares two slices. +func InDeltaSlice(t TestingT, expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) { + if !assert.InDeltaSlice(t, expected, actual, delta, msgAndArgs...) { + t.FailNow() + } +} + +// InDeltaSlicef is the same as InDelta, except it compares two slices. +func InDeltaSlicef(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) { + if !assert.InDeltaSlicef(t, expected, actual, delta, msg, args...) { + t.FailNow() + } +} + +// InDeltaf asserts that the two numerals are within delta of each other. +// +// assert.InDeltaf(t, math.Pi, (22 / 7.0, "error message %s", "formatted"), 0.01) +// +// Returns whether the assertion was successful (true) or not (false). +func InDeltaf(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) { + if !assert.InDeltaf(t, expected, actual, delta, msg, args...) { + t.FailNow() + } +} + +// InEpsilon asserts that expected and actual have a relative error less than epsilon +// +// Returns whether the assertion was successful (true) or not (false). +func InEpsilon(t TestingT, expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) { + if !assert.InEpsilon(t, expected, actual, epsilon, msgAndArgs...) { + t.FailNow() + } +} + +// InEpsilonSlice is the same as InEpsilon, except it compares each value from two slices. +func InEpsilonSlice(t TestingT, expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) { + if !assert.InEpsilonSlice(t, expected, actual, epsilon, msgAndArgs...) { + t.FailNow() + } +} + +// InEpsilonSlicef is the same as InEpsilon, except it compares each value from two slices. +func InEpsilonSlicef(t TestingT, expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) { + if !assert.InEpsilonSlicef(t, expected, actual, epsilon, msg, args...) { + t.FailNow() + } +} + +// InEpsilonf asserts that expected and actual have a relative error less than epsilon +// +// Returns whether the assertion was successful (true) or not (false). +func InEpsilonf(t TestingT, expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) { + if !assert.InEpsilonf(t, expected, actual, epsilon, msg, args...) { + t.FailNow() + } +} + +// IsType asserts that the specified objects are of the same type. +func IsType(t TestingT, expectedType interface{}, object interface{}, msgAndArgs ...interface{}) { + if !assert.IsType(t, expectedType, object, msgAndArgs...) { + t.FailNow() + } +} + +// IsTypef asserts that the specified objects are of the same type. +func IsTypef(t TestingT, expectedType interface{}, object interface{}, msg string, args ...interface{}) { + if !assert.IsTypef(t, expectedType, object, msg, args...) { + t.FailNow() + } +} + +// JSONEq asserts that two JSON strings are equivalent. +// +// assert.JSONEq(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`) +// +// Returns whether the assertion was successful (true) or not (false). +func JSONEq(t TestingT, expected string, actual string, msgAndArgs ...interface{}) { + if !assert.JSONEq(t, expected, actual, msgAndArgs...) { + t.FailNow() + } +} + +// JSONEqf asserts that two JSON strings are equivalent. +// +// assert.JSONEqf(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func JSONEqf(t TestingT, expected string, actual string, msg string, args ...interface{}) { + if !assert.JSONEqf(t, expected, actual, msg, args...) { + t.FailNow() + } +} + +// Len asserts that the specified object has specific length. +// Len also fails if the object has a type that len() not accept. +// +// assert.Len(t, mySlice, 3) +// +// Returns whether the assertion was successful (true) or not (false). +func Len(t TestingT, object interface{}, length int, msgAndArgs ...interface{}) { + if !assert.Len(t, object, length, msgAndArgs...) { + t.FailNow() + } +} + +// Lenf asserts that the specified object has specific length. +// Lenf also fails if the object has a type that len() not accept. +// +// assert.Lenf(t, mySlice, 3, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func Lenf(t TestingT, object interface{}, length int, msg string, args ...interface{}) { + if !assert.Lenf(t, object, length, msg, args...) { + t.FailNow() + } +} + +// Nil asserts that the specified object is nil. +// +// assert.Nil(t, err) +// +// Returns whether the assertion was successful (true) or not (false). +func Nil(t TestingT, object interface{}, msgAndArgs ...interface{}) { + if !assert.Nil(t, object, msgAndArgs...) { + t.FailNow() + } +} + +// Nilf asserts that the specified object is nil. +// +// assert.Nilf(t, err, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func Nilf(t TestingT, object interface{}, msg string, args ...interface{}) { + if !assert.Nilf(t, object, msg, args...) { + t.FailNow() + } +} + +// NoError asserts that a function returned no error (i.e. `nil`). +// +// actualObj, err := SomeFunction() +// if assert.NoError(t, err) { +// assert.Equal(t, expectedObj, actualObj) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func NoError(t TestingT, err error, msgAndArgs ...interface{}) { + if !assert.NoError(t, err, msgAndArgs...) { + t.FailNow() + } +} + +// NoErrorf asserts that a function returned no error (i.e. `nil`). +// +// actualObj, err := SomeFunction() +// if assert.NoErrorf(t, err, "error message %s", "formatted") { +// assert.Equal(t, expectedObj, actualObj) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func NoErrorf(t TestingT, err error, msg string, args ...interface{}) { + if !assert.NoErrorf(t, err, msg, args...) { + t.FailNow() + } +} + +// NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the +// specified substring or element. +// +// assert.NotContains(t, "Hello World", "Earth") +// assert.NotContains(t, ["Hello", "World"], "Earth") +// assert.NotContains(t, {"Hello": "World"}, "Earth") +// +// Returns whether the assertion was successful (true) or not (false). +func NotContains(t TestingT, s interface{}, contains interface{}, msgAndArgs ...interface{}) { + if !assert.NotContains(t, s, contains, msgAndArgs...) { + t.FailNow() + } +} + +// NotContainsf asserts that the specified string, list(array, slice...) or map does NOT contain the +// specified substring or element. +// +// assert.NotContainsf(t, "Hello World", "Earth", "error message %s", "formatted") +// assert.NotContainsf(t, ["Hello", "World"], "Earth", "error message %s", "formatted") +// assert.NotContainsf(t, {"Hello": "World"}, "Earth", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func NotContainsf(t TestingT, s interface{}, contains interface{}, msg string, args ...interface{}) { + if !assert.NotContainsf(t, s, contains, msg, args...) { + t.FailNow() + } +} + +// NotEmpty asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// if assert.NotEmpty(t, obj) { +// assert.Equal(t, "two", obj[1]) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func NotEmpty(t TestingT, object interface{}, msgAndArgs ...interface{}) { + if !assert.NotEmpty(t, object, msgAndArgs...) { + t.FailNow() + } +} + +// NotEmptyf asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// if assert.NotEmptyf(t, obj, "error message %s", "formatted") { +// assert.Equal(t, "two", obj[1]) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func NotEmptyf(t TestingT, object interface{}, msg string, args ...interface{}) { + if !assert.NotEmptyf(t, object, msg, args...) { + t.FailNow() + } +} + +// NotEqual asserts that the specified values are NOT equal. +// +// assert.NotEqual(t, obj1, obj2) +// +// Returns whether the assertion was successful (true) or not (false). +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). +func NotEqual(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + if !assert.NotEqual(t, expected, actual, msgAndArgs...) { + t.FailNow() + } +} + +// NotEqualf asserts that the specified values are NOT equal. +// +// assert.NotEqualf(t, obj1, obj2, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). +func NotEqualf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) { + if !assert.NotEqualf(t, expected, actual, msg, args...) { + t.FailNow() + } +} + +// NotNil asserts that the specified object is not nil. +// +// assert.NotNil(t, err) +// +// Returns whether the assertion was successful (true) or not (false). +func NotNil(t TestingT, object interface{}, msgAndArgs ...interface{}) { + if !assert.NotNil(t, object, msgAndArgs...) { + t.FailNow() + } +} + +// NotNilf asserts that the specified object is not nil. +// +// assert.NotNilf(t, err, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func NotNilf(t TestingT, object interface{}, msg string, args ...interface{}) { + if !assert.NotNilf(t, object, msg, args...) { + t.FailNow() + } +} + +// NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic. +// +// assert.NotPanics(t, func(){ RemainCalm() }) +// +// Returns whether the assertion was successful (true) or not (false). +func NotPanics(t TestingT, f assert.PanicTestFunc, msgAndArgs ...interface{}) { + if !assert.NotPanics(t, f, msgAndArgs...) { + t.FailNow() + } +} + +// NotPanicsf asserts that the code inside the specified PanicTestFunc does NOT panic. +// +// assert.NotPanicsf(t, func(){ RemainCalm() }, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func NotPanicsf(t TestingT, f assert.PanicTestFunc, msg string, args ...interface{}) { + if !assert.NotPanicsf(t, f, msg, args...) { + t.FailNow() + } +} + +// NotRegexp asserts that a specified regexp does not match a string. +// +// assert.NotRegexp(t, regexp.MustCompile("starts"), "it's starting") +// assert.NotRegexp(t, "^start", "it's not starting") +// +// Returns whether the assertion was successful (true) or not (false). +func NotRegexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) { + if !assert.NotRegexp(t, rx, str, msgAndArgs...) { + t.FailNow() + } +} + +// NotRegexpf asserts that a specified regexp does not match a string. +// +// assert.NotRegexpf(t, regexp.MustCompile("starts", "error message %s", "formatted"), "it's starting") +// assert.NotRegexpf(t, "^start", "it's not starting", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func NotRegexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) { + if !assert.NotRegexpf(t, rx, str, msg, args...) { + t.FailNow() + } +} + +// NotSubset asserts that the specified list(array, slice...) contains not all +// elements given in the specified subset(array, slice...). +// +// assert.NotSubset(t, [1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]") +// +// Returns whether the assertion was successful (true) or not (false). +func NotSubset(t TestingT, list interface{}, subset interface{}, msgAndArgs ...interface{}) { + if !assert.NotSubset(t, list, subset, msgAndArgs...) { + t.FailNow() + } +} + +// NotSubsetf asserts that the specified list(array, slice...) contains not all +// elements given in the specified subset(array, slice...). +// +// assert.NotSubsetf(t, [1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func NotSubsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) { + if !assert.NotSubsetf(t, list, subset, msg, args...) { + t.FailNow() + } +} + +// NotZero asserts that i is not the zero value for its type and returns the truth. +func NotZero(t TestingT, i interface{}, msgAndArgs ...interface{}) { + if !assert.NotZero(t, i, msgAndArgs...) { + t.FailNow() + } +} + +// NotZerof asserts that i is not the zero value for its type and returns the truth. +func NotZerof(t TestingT, i interface{}, msg string, args ...interface{}) { + if !assert.NotZerof(t, i, msg, args...) { + t.FailNow() + } +} + +// Panics asserts that the code inside the specified PanicTestFunc panics. +// +// assert.Panics(t, func(){ GoCrazy() }) +// +// Returns whether the assertion was successful (true) or not (false). +func Panics(t TestingT, f assert.PanicTestFunc, msgAndArgs ...interface{}) { + if !assert.Panics(t, f, msgAndArgs...) { + t.FailNow() + } +} + +// PanicsWithValue asserts that the code inside the specified PanicTestFunc panics, and that +// the recovered panic value equals the expected panic value. +// +// assert.PanicsWithValue(t, "crazy error", func(){ GoCrazy() }) +// +// Returns whether the assertion was successful (true) or not (false). +func PanicsWithValue(t TestingT, expected interface{}, f assert.PanicTestFunc, msgAndArgs ...interface{}) { + if !assert.PanicsWithValue(t, expected, f, msgAndArgs...) { + t.FailNow() + } +} + +// PanicsWithValuef asserts that the code inside the specified PanicTestFunc panics, and that +// the recovered panic value equals the expected panic value. +// +// assert.PanicsWithValuef(t, "crazy error", func(){ GoCrazy() }, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func PanicsWithValuef(t TestingT, expected interface{}, f assert.PanicTestFunc, msg string, args ...interface{}) { + if !assert.PanicsWithValuef(t, expected, f, msg, args...) { + t.FailNow() + } +} + +// Panicsf asserts that the code inside the specified PanicTestFunc panics. +// +// assert.Panicsf(t, func(){ GoCrazy() }, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func Panicsf(t TestingT, f assert.PanicTestFunc, msg string, args ...interface{}) { + if !assert.Panicsf(t, f, msg, args...) { + t.FailNow() + } +} + +// Regexp asserts that a specified regexp matches a string. +// +// assert.Regexp(t, regexp.MustCompile("start"), "it's starting") +// assert.Regexp(t, "start...$", "it's not starting") +// +// Returns whether the assertion was successful (true) or not (false). +func Regexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) { + if !assert.Regexp(t, rx, str, msgAndArgs...) { + t.FailNow() + } +} + +// Regexpf asserts that a specified regexp matches a string. +// +// assert.Regexpf(t, regexp.MustCompile("start", "error message %s", "formatted"), "it's starting") +// assert.Regexpf(t, "start...$", "it's not starting", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func Regexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) { + if !assert.Regexpf(t, rx, str, msg, args...) { + t.FailNow() + } +} + +// Subset asserts that the specified list(array, slice...) contains all +// elements given in the specified subset(array, slice...). +// +// assert.Subset(t, [1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]") +// +// Returns whether the assertion was successful (true) or not (false). +func Subset(t TestingT, list interface{}, subset interface{}, msgAndArgs ...interface{}) { + if !assert.Subset(t, list, subset, msgAndArgs...) { + t.FailNow() + } +} + +// Subsetf asserts that the specified list(array, slice...) contains all +// elements given in the specified subset(array, slice...). +// +// assert.Subsetf(t, [1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func Subsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) { + if !assert.Subsetf(t, list, subset, msg, args...) { + t.FailNow() + } +} + +// True asserts that the specified value is true. +// +// assert.True(t, myBool) +// +// Returns whether the assertion was successful (true) or not (false). +func True(t TestingT, value bool, msgAndArgs ...interface{}) { + if !assert.True(t, value, msgAndArgs...) { + t.FailNow() + } +} + +// Truef asserts that the specified value is true. +// +// assert.Truef(t, myBool, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func Truef(t TestingT, value bool, msg string, args ...interface{}) { + if !assert.Truef(t, value, msg, args...) { + t.FailNow() + } +} + +// WithinDuration asserts that the two times are within duration delta of each other. +// +// assert.WithinDuration(t, time.Now(), time.Now(), 10*time.Second) +// +// Returns whether the assertion was successful (true) or not (false). +func WithinDuration(t TestingT, expected time.Time, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) { + if !assert.WithinDuration(t, expected, actual, delta, msgAndArgs...) { + t.FailNow() + } +} + +// WithinDurationf asserts that the two times are within duration delta of each other. +// +// assert.WithinDurationf(t, time.Now(), time.Now(), 10*time.Second, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func WithinDurationf(t TestingT, expected time.Time, actual time.Time, delta time.Duration, msg string, args ...interface{}) { + if !assert.WithinDurationf(t, expected, actual, delta, msg, args...) { + t.FailNow() + } +} + +// Zero asserts that i is the zero value for its type and returns the truth. +func Zero(t TestingT, i interface{}, msgAndArgs ...interface{}) { + if !assert.Zero(t, i, msgAndArgs...) { + t.FailNow() + } +} + +// Zerof asserts that i is the zero value for its type and returns the truth. +func Zerof(t TestingT, i interface{}, msg string, args ...interface{}) { + if !assert.Zerof(t, i, msg, args...) { + t.FailNow() + } +} diff --git a/vendor/github.com/stretchr/testify/require/require.go.tmpl b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/testify/require/require.go.tmpl similarity index 100% rename from vendor/github.com/stretchr/testify/require/require.go.tmpl rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/testify/require/require.go.tmpl diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/testify/require/require_forward.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/testify/require/require_forward.go new file mode 100644 index 00000000..c59c3c7b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/testify/require/require_forward.go @@ -0,0 +1,747 @@ +/* +* CODE GENERATED AUTOMATICALLY WITH github.com/stretchr/testify/_codegen +* THIS FILE MUST NOT BE EDITED BY HAND + */ + +package require + +import ( + assert "github.com/stretchr/testify/assert" + http "net/http" + url "net/url" + time "time" +) + +// Condition uses a Comparison to assert a complex condition. +func (a *Assertions) Condition(comp assert.Comparison, msgAndArgs ...interface{}) { + Condition(a.t, comp, msgAndArgs...) +} + +// Conditionf uses a Comparison to assert a complex condition. +func (a *Assertions) Conditionf(comp assert.Comparison, msg string, args ...interface{}) { + Conditionf(a.t, comp, msg, args...) +} + +// Contains asserts that the specified string, list(array, slice...) or map contains the +// specified substring or element. +// +// a.Contains("Hello World", "World") +// a.Contains(["Hello", "World"], "World") +// a.Contains({"Hello": "World"}, "Hello") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Contains(s interface{}, contains interface{}, msgAndArgs ...interface{}) { + Contains(a.t, s, contains, msgAndArgs...) +} + +// Containsf asserts that the specified string, list(array, slice...) or map contains the +// specified substring or element. +// +// a.Containsf("Hello World", "World", "error message %s", "formatted") +// a.Containsf(["Hello", "World"], "World", "error message %s", "formatted") +// a.Containsf({"Hello": "World"}, "Hello", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Containsf(s interface{}, contains interface{}, msg string, args ...interface{}) { + Containsf(a.t, s, contains, msg, args...) +} + +// Empty asserts that the specified object is empty. I.e. nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// a.Empty(obj) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Empty(object interface{}, msgAndArgs ...interface{}) { + Empty(a.t, object, msgAndArgs...) +} + +// Emptyf asserts that the specified object is empty. I.e. nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// a.Emptyf(obj, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Emptyf(object interface{}, msg string, args ...interface{}) { + Emptyf(a.t, object, msg, args...) +} + +// Equal asserts that two objects are equal. +// +// a.Equal(123, 123) +// +// Returns whether the assertion was successful (true) or not (false). +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). Function equality +// cannot be determined and will always fail. +func (a *Assertions) Equal(expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + Equal(a.t, expected, actual, msgAndArgs...) +} + +// EqualError asserts that a function returned an error (i.e. not `nil`) +// and that it is equal to the provided error. +// +// actualObj, err := SomeFunction() +// a.EqualError(err, expectedErrorString) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) EqualError(theError error, errString string, msgAndArgs ...interface{}) { + EqualError(a.t, theError, errString, msgAndArgs...) +} + +// EqualErrorf asserts that a function returned an error (i.e. not `nil`) +// and that it is equal to the provided error. +// +// actualObj, err := SomeFunction() +// a.EqualErrorf(err, expectedErrorString, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) EqualErrorf(theError error, errString string, msg string, args ...interface{}) { + EqualErrorf(a.t, theError, errString, msg, args...) +} + +// EqualValues asserts that two objects are equal or convertable to the same types +// and equal. +// +// a.EqualValues(uint32(123), int32(123)) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + EqualValues(a.t, expected, actual, msgAndArgs...) +} + +// EqualValuesf asserts that two objects are equal or convertable to the same types +// and equal. +// +// a.EqualValuesf(uint32(123, "error message %s", "formatted"), int32(123)) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) EqualValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) { + EqualValuesf(a.t, expected, actual, msg, args...) +} + +// Equalf asserts that two objects are equal. +// +// a.Equalf(123, 123, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). Function equality +// cannot be determined and will always fail. +func (a *Assertions) Equalf(expected interface{}, actual interface{}, msg string, args ...interface{}) { + Equalf(a.t, expected, actual, msg, args...) +} + +// Error asserts that a function returned an error (i.e. not `nil`). +// +// actualObj, err := SomeFunction() +// if a.Error(err) { +// assert.Equal(t, expectedError, err) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Error(err error, msgAndArgs ...interface{}) { + Error(a.t, err, msgAndArgs...) +} + +// Errorf asserts that a function returned an error (i.e. not `nil`). +// +// actualObj, err := SomeFunction() +// if a.Errorf(err, "error message %s", "formatted") { +// assert.Equal(t, expectedErrorf, err) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Errorf(err error, msg string, args ...interface{}) { + Errorf(a.t, err, msg, args...) +} + +// Exactly asserts that two objects are equal is value and type. +// +// a.Exactly(int32(123), int64(123)) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Exactly(expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + Exactly(a.t, expected, actual, msgAndArgs...) +} + +// Exactlyf asserts that two objects are equal is value and type. +// +// a.Exactlyf(int32(123, "error message %s", "formatted"), int64(123)) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Exactlyf(expected interface{}, actual interface{}, msg string, args ...interface{}) { + Exactlyf(a.t, expected, actual, msg, args...) +} + +// Fail reports a failure through +func (a *Assertions) Fail(failureMessage string, msgAndArgs ...interface{}) { + Fail(a.t, failureMessage, msgAndArgs...) +} + +// FailNow fails test +func (a *Assertions) FailNow(failureMessage string, msgAndArgs ...interface{}) { + FailNow(a.t, failureMessage, msgAndArgs...) +} + +// FailNowf fails test +func (a *Assertions) FailNowf(failureMessage string, msg string, args ...interface{}) { + FailNowf(a.t, failureMessage, msg, args...) +} + +// Failf reports a failure through +func (a *Assertions) Failf(failureMessage string, msg string, args ...interface{}) { + Failf(a.t, failureMessage, msg, args...) +} + +// False asserts that the specified value is false. +// +// a.False(myBool) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) False(value bool, msgAndArgs ...interface{}) { + False(a.t, value, msgAndArgs...) +} + +// Falsef asserts that the specified value is false. +// +// a.Falsef(myBool, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Falsef(value bool, msg string, args ...interface{}) { + Falsef(a.t, value, msg, args...) +} + +// HTTPBodyContains asserts that a specified handler returns a +// body that contains a string. +// +// a.HTTPBodyContains(myHandler, "www.google.com", nil, "I'm Feeling Lucky") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPBodyContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) { + HTTPBodyContains(a.t, handler, method, url, values, str) +} + +// HTTPBodyContainsf asserts that a specified handler returns a +// body that contains a string. +// +// a.HTTPBodyContainsf(myHandler, "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPBodyContainsf(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) { + HTTPBodyContainsf(a.t, handler, method, url, values, str) +} + +// HTTPBodyNotContains asserts that a specified handler returns a +// body that does not contain a string. +// +// a.HTTPBodyNotContains(myHandler, "www.google.com", nil, "I'm Feeling Lucky") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPBodyNotContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) { + HTTPBodyNotContains(a.t, handler, method, url, values, str) +} + +// HTTPBodyNotContainsf asserts that a specified handler returns a +// body that does not contain a string. +// +// a.HTTPBodyNotContainsf(myHandler, "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPBodyNotContainsf(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) { + HTTPBodyNotContainsf(a.t, handler, method, url, values, str) +} + +// HTTPError asserts that a specified handler returns an error status code. +// +// a.HTTPError(myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPError(handler http.HandlerFunc, method string, url string, values url.Values) { + HTTPError(a.t, handler, method, url, values) +} + +// HTTPErrorf asserts that a specified handler returns an error status code. +// +// a.HTTPErrorf(myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). +func (a *Assertions) HTTPErrorf(handler http.HandlerFunc, method string, url string, values url.Values) { + HTTPErrorf(a.t, handler, method, url, values) +} + +// HTTPRedirect asserts that a specified handler returns a redirect status code. +// +// a.HTTPRedirect(myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPRedirect(handler http.HandlerFunc, method string, url string, values url.Values) { + HTTPRedirect(a.t, handler, method, url, values) +} + +// HTTPRedirectf asserts that a specified handler returns a redirect status code. +// +// a.HTTPRedirectf(myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). +func (a *Assertions) HTTPRedirectf(handler http.HandlerFunc, method string, url string, values url.Values) { + HTTPRedirectf(a.t, handler, method, url, values) +} + +// HTTPSuccess asserts that a specified handler returns a success status code. +// +// a.HTTPSuccess(myHandler, "POST", "http://www.google.com", nil) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPSuccess(handler http.HandlerFunc, method string, url string, values url.Values) { + HTTPSuccess(a.t, handler, method, url, values) +} + +// HTTPSuccessf asserts that a specified handler returns a success status code. +// +// a.HTTPSuccessf(myHandler, "POST", "http://www.google.com", nil, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPSuccessf(handler http.HandlerFunc, method string, url string, values url.Values) { + HTTPSuccessf(a.t, handler, method, url, values) +} + +// Implements asserts that an object is implemented by the specified interface. +// +// a.Implements((*MyInterface)(nil), new(MyObject)) +func (a *Assertions) Implements(interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) { + Implements(a.t, interfaceObject, object, msgAndArgs...) +} + +// Implementsf asserts that an object is implemented by the specified interface. +// +// a.Implementsf((*MyInterface, "error message %s", "formatted")(nil), new(MyObject)) +func (a *Assertions) Implementsf(interfaceObject interface{}, object interface{}, msg string, args ...interface{}) { + Implementsf(a.t, interfaceObject, object, msg, args...) +} + +// InDelta asserts that the two numerals are within delta of each other. +// +// a.InDelta(math.Pi, (22 / 7.0), 0.01) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) InDelta(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) { + InDelta(a.t, expected, actual, delta, msgAndArgs...) +} + +// InDeltaSlice is the same as InDelta, except it compares two slices. +func (a *Assertions) InDeltaSlice(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) { + InDeltaSlice(a.t, expected, actual, delta, msgAndArgs...) +} + +// InDeltaSlicef is the same as InDelta, except it compares two slices. +func (a *Assertions) InDeltaSlicef(expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) { + InDeltaSlicef(a.t, expected, actual, delta, msg, args...) +} + +// InDeltaf asserts that the two numerals are within delta of each other. +// +// a.InDeltaf(math.Pi, (22 / 7.0, "error message %s", "formatted"), 0.01) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) InDeltaf(expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) { + InDeltaf(a.t, expected, actual, delta, msg, args...) +} + +// InEpsilon asserts that expected and actual have a relative error less than epsilon +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) InEpsilon(expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) { + InEpsilon(a.t, expected, actual, epsilon, msgAndArgs...) +} + +// InEpsilonSlice is the same as InEpsilon, except it compares each value from two slices. +func (a *Assertions) InEpsilonSlice(expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) { + InEpsilonSlice(a.t, expected, actual, epsilon, msgAndArgs...) +} + +// InEpsilonSlicef is the same as InEpsilon, except it compares each value from two slices. +func (a *Assertions) InEpsilonSlicef(expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) { + InEpsilonSlicef(a.t, expected, actual, epsilon, msg, args...) +} + +// InEpsilonf asserts that expected and actual have a relative error less than epsilon +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) InEpsilonf(expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) { + InEpsilonf(a.t, expected, actual, epsilon, msg, args...) +} + +// IsType asserts that the specified objects are of the same type. +func (a *Assertions) IsType(expectedType interface{}, object interface{}, msgAndArgs ...interface{}) { + IsType(a.t, expectedType, object, msgAndArgs...) +} + +// IsTypef asserts that the specified objects are of the same type. +func (a *Assertions) IsTypef(expectedType interface{}, object interface{}, msg string, args ...interface{}) { + IsTypef(a.t, expectedType, object, msg, args...) +} + +// JSONEq asserts that two JSON strings are equivalent. +// +// a.JSONEq(`{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) JSONEq(expected string, actual string, msgAndArgs ...interface{}) { + JSONEq(a.t, expected, actual, msgAndArgs...) +} + +// JSONEqf asserts that two JSON strings are equivalent. +// +// a.JSONEqf(`{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) JSONEqf(expected string, actual string, msg string, args ...interface{}) { + JSONEqf(a.t, expected, actual, msg, args...) +} + +// Len asserts that the specified object has specific length. +// Len also fails if the object has a type that len() not accept. +// +// a.Len(mySlice, 3) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Len(object interface{}, length int, msgAndArgs ...interface{}) { + Len(a.t, object, length, msgAndArgs...) +} + +// Lenf asserts that the specified object has specific length. +// Lenf also fails if the object has a type that len() not accept. +// +// a.Lenf(mySlice, 3, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Lenf(object interface{}, length int, msg string, args ...interface{}) { + Lenf(a.t, object, length, msg, args...) +} + +// Nil asserts that the specified object is nil. +// +// a.Nil(err) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Nil(object interface{}, msgAndArgs ...interface{}) { + Nil(a.t, object, msgAndArgs...) +} + +// Nilf asserts that the specified object is nil. +// +// a.Nilf(err, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Nilf(object interface{}, msg string, args ...interface{}) { + Nilf(a.t, object, msg, args...) +} + +// NoError asserts that a function returned no error (i.e. `nil`). +// +// actualObj, err := SomeFunction() +// if a.NoError(err) { +// assert.Equal(t, expectedObj, actualObj) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NoError(err error, msgAndArgs ...interface{}) { + NoError(a.t, err, msgAndArgs...) +} + +// NoErrorf asserts that a function returned no error (i.e. `nil`). +// +// actualObj, err := SomeFunction() +// if a.NoErrorf(err, "error message %s", "formatted") { +// assert.Equal(t, expectedObj, actualObj) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NoErrorf(err error, msg string, args ...interface{}) { + NoErrorf(a.t, err, msg, args...) +} + +// NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the +// specified substring or element. +// +// a.NotContains("Hello World", "Earth") +// a.NotContains(["Hello", "World"], "Earth") +// a.NotContains({"Hello": "World"}, "Earth") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotContains(s interface{}, contains interface{}, msgAndArgs ...interface{}) { + NotContains(a.t, s, contains, msgAndArgs...) +} + +// NotContainsf asserts that the specified string, list(array, slice...) or map does NOT contain the +// specified substring or element. +// +// a.NotContainsf("Hello World", "Earth", "error message %s", "formatted") +// a.NotContainsf(["Hello", "World"], "Earth", "error message %s", "formatted") +// a.NotContainsf({"Hello": "World"}, "Earth", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotContainsf(s interface{}, contains interface{}, msg string, args ...interface{}) { + NotContainsf(a.t, s, contains, msg, args...) +} + +// NotEmpty asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// if a.NotEmpty(obj) { +// assert.Equal(t, "two", obj[1]) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotEmpty(object interface{}, msgAndArgs ...interface{}) { + NotEmpty(a.t, object, msgAndArgs...) +} + +// NotEmptyf asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// if a.NotEmptyf(obj, "error message %s", "formatted") { +// assert.Equal(t, "two", obj[1]) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotEmptyf(object interface{}, msg string, args ...interface{}) { + NotEmptyf(a.t, object, msg, args...) +} + +// NotEqual asserts that the specified values are NOT equal. +// +// a.NotEqual(obj1, obj2) +// +// Returns whether the assertion was successful (true) or not (false). +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). +func (a *Assertions) NotEqual(expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + NotEqual(a.t, expected, actual, msgAndArgs...) +} + +// NotEqualf asserts that the specified values are NOT equal. +// +// a.NotEqualf(obj1, obj2, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). +func (a *Assertions) NotEqualf(expected interface{}, actual interface{}, msg string, args ...interface{}) { + NotEqualf(a.t, expected, actual, msg, args...) +} + +// NotNil asserts that the specified object is not nil. +// +// a.NotNil(err) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotNil(object interface{}, msgAndArgs ...interface{}) { + NotNil(a.t, object, msgAndArgs...) +} + +// NotNilf asserts that the specified object is not nil. +// +// a.NotNilf(err, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotNilf(object interface{}, msg string, args ...interface{}) { + NotNilf(a.t, object, msg, args...) +} + +// NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic. +// +// a.NotPanics(func(){ RemainCalm() }) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotPanics(f assert.PanicTestFunc, msgAndArgs ...interface{}) { + NotPanics(a.t, f, msgAndArgs...) +} + +// NotPanicsf asserts that the code inside the specified PanicTestFunc does NOT panic. +// +// a.NotPanicsf(func(){ RemainCalm() }, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotPanicsf(f assert.PanicTestFunc, msg string, args ...interface{}) { + NotPanicsf(a.t, f, msg, args...) +} + +// NotRegexp asserts that a specified regexp does not match a string. +// +// a.NotRegexp(regexp.MustCompile("starts"), "it's starting") +// a.NotRegexp("^start", "it's not starting") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotRegexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) { + NotRegexp(a.t, rx, str, msgAndArgs...) +} + +// NotRegexpf asserts that a specified regexp does not match a string. +// +// a.NotRegexpf(regexp.MustCompile("starts", "error message %s", "formatted"), "it's starting") +// a.NotRegexpf("^start", "it's not starting", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotRegexpf(rx interface{}, str interface{}, msg string, args ...interface{}) { + NotRegexpf(a.t, rx, str, msg, args...) +} + +// NotSubset asserts that the specified list(array, slice...) contains not all +// elements given in the specified subset(array, slice...). +// +// a.NotSubset([1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotSubset(list interface{}, subset interface{}, msgAndArgs ...interface{}) { + NotSubset(a.t, list, subset, msgAndArgs...) +} + +// NotSubsetf asserts that the specified list(array, slice...) contains not all +// elements given in the specified subset(array, slice...). +// +// a.NotSubsetf([1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotSubsetf(list interface{}, subset interface{}, msg string, args ...interface{}) { + NotSubsetf(a.t, list, subset, msg, args...) +} + +// NotZero asserts that i is not the zero value for its type and returns the truth. +func (a *Assertions) NotZero(i interface{}, msgAndArgs ...interface{}) { + NotZero(a.t, i, msgAndArgs...) +} + +// NotZerof asserts that i is not the zero value for its type and returns the truth. +func (a *Assertions) NotZerof(i interface{}, msg string, args ...interface{}) { + NotZerof(a.t, i, msg, args...) +} + +// Panics asserts that the code inside the specified PanicTestFunc panics. +// +// a.Panics(func(){ GoCrazy() }) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Panics(f assert.PanicTestFunc, msgAndArgs ...interface{}) { + Panics(a.t, f, msgAndArgs...) +} + +// PanicsWithValue asserts that the code inside the specified PanicTestFunc panics, and that +// the recovered panic value equals the expected panic value. +// +// a.PanicsWithValue("crazy error", func(){ GoCrazy() }) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) PanicsWithValue(expected interface{}, f assert.PanicTestFunc, msgAndArgs ...interface{}) { + PanicsWithValue(a.t, expected, f, msgAndArgs...) +} + +// PanicsWithValuef asserts that the code inside the specified PanicTestFunc panics, and that +// the recovered panic value equals the expected panic value. +// +// a.PanicsWithValuef("crazy error", func(){ GoCrazy() }, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) PanicsWithValuef(expected interface{}, f assert.PanicTestFunc, msg string, args ...interface{}) { + PanicsWithValuef(a.t, expected, f, msg, args...) +} + +// Panicsf asserts that the code inside the specified PanicTestFunc panics. +// +// a.Panicsf(func(){ GoCrazy() }, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Panicsf(f assert.PanicTestFunc, msg string, args ...interface{}) { + Panicsf(a.t, f, msg, args...) +} + +// Regexp asserts that a specified regexp matches a string. +// +// a.Regexp(regexp.MustCompile("start"), "it's starting") +// a.Regexp("start...$", "it's not starting") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Regexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) { + Regexp(a.t, rx, str, msgAndArgs...) +} + +// Regexpf asserts that a specified regexp matches a string. +// +// a.Regexpf(regexp.MustCompile("start", "error message %s", "formatted"), "it's starting") +// a.Regexpf("start...$", "it's not starting", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Regexpf(rx interface{}, str interface{}, msg string, args ...interface{}) { + Regexpf(a.t, rx, str, msg, args...) +} + +// Subset asserts that the specified list(array, slice...) contains all +// elements given in the specified subset(array, slice...). +// +// a.Subset([1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Subset(list interface{}, subset interface{}, msgAndArgs ...interface{}) { + Subset(a.t, list, subset, msgAndArgs...) +} + +// Subsetf asserts that the specified list(array, slice...) contains all +// elements given in the specified subset(array, slice...). +// +// a.Subsetf([1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Subsetf(list interface{}, subset interface{}, msg string, args ...interface{}) { + Subsetf(a.t, list, subset, msg, args...) +} + +// True asserts that the specified value is true. +// +// a.True(myBool) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) True(value bool, msgAndArgs ...interface{}) { + True(a.t, value, msgAndArgs...) +} + +// Truef asserts that the specified value is true. +// +// a.Truef(myBool, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Truef(value bool, msg string, args ...interface{}) { + Truef(a.t, value, msg, args...) +} + +// WithinDuration asserts that the two times are within duration delta of each other. +// +// a.WithinDuration(time.Now(), time.Now(), 10*time.Second) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) WithinDuration(expected time.Time, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) { + WithinDuration(a.t, expected, actual, delta, msgAndArgs...) +} + +// WithinDurationf asserts that the two times are within duration delta of each other. +// +// a.WithinDurationf(time.Now(), time.Now(), 10*time.Second, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) WithinDurationf(expected time.Time, actual time.Time, delta time.Duration, msg string, args ...interface{}) { + WithinDurationf(a.t, expected, actual, delta, msg, args...) +} + +// Zero asserts that i is the zero value for its type and returns the truth. +func (a *Assertions) Zero(i interface{}, msgAndArgs ...interface{}) { + Zero(a.t, i, msgAndArgs...) +} + +// Zerof asserts that i is the zero value for its type and returns the truth. +func (a *Assertions) Zerof(i interface{}, msg string, args ...interface{}) { + Zerof(a.t, i, msg, args...) +} diff --git a/vendor/github.com/stretchr/testify/require/require_forward.go.tmpl b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/testify/require/require_forward.go.tmpl similarity index 100% rename from vendor/github.com/stretchr/testify/require/require_forward.go.tmpl rename to vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/testify/require/require_forward.go.tmpl diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/testify/require/requirements.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/testify/require/requirements.go new file mode 100644 index 00000000..e404f016 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/stretchr/testify/require/requirements.go @@ -0,0 +1,9 @@ +package require + +// TestingT is an interface wrapper around *testing.T +type TestingT interface { + Errorf(format string, args ...interface{}) + FailNow() +} + +//go:generate go run ../_codegen/main.go -output-package=require -template=require.go.tmpl -include-format-funcs diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/toqueteos/webbrowser/.travis.yml b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/toqueteos/webbrowser/.travis.yml new file mode 100644 index 00000000..adfd4e21 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/toqueteos/webbrowser/.travis.yml @@ -0,0 +1,12 @@ +language: go + +go: + - 1.2 + - 1.3 + - 1.4 + - 1.5 + - tip + +script: + - go get -t ./... + - go test ./... diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/toqueteos/webbrowser/CONTRIBUTING.md b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/toqueteos/webbrowser/CONTRIBUTING.md new file mode 100644 index 00000000..b9f7bf82 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/toqueteos/webbrowser/CONTRIBUTING.md @@ -0,0 +1,11 @@ +# webbrowser contributing guide + +Any changes are welcomed! + +1. Be nice. +2. Don't be afraid to ask, but please try search first. + +## Looking for contact info? + +- Twitter: [@toqueteos](https://twitter.com/toqueteos) +- Mail: `toqueteos AT gmail DOT com` diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/toqueteos/webbrowser/LICENSE.md b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/toqueteos/webbrowser/LICENSE.md new file mode 100644 index 00000000..4b7314ce --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/toqueteos/webbrowser/LICENSE.md @@ -0,0 +1,19 @@ +The MIT License (MIT) +Copyright (c) 2013-17 by Carlos Cobo and contributors. + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/toqueteos/webbrowser/README.md b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/toqueteos/webbrowser/README.md new file mode 100644 index 00000000..ae6a9799 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/toqueteos/webbrowser/README.md @@ -0,0 +1,42 @@ +# webbrowser [![Build Status](https://travis-ci.org/toqueteos/webbrowser.png?branch=master)](https://travis-ci.org/toqueteos/webbrowser) [![GoDoc](http://godoc.org/github.com/toqueteos/webbrowser?status.png)](http://godoc.org/github.com/toqueteos/webbrowser) + +webbrowser provides a simple API for opening web pages on your default browser. It's inspired on [Python's webbrowser](http://docs.python.org/3/library/webbrowser.html) package but lacks some of its features (open new window). + +It just opens a webpage, most browsers will open it on a new tab. + +## Installation + +As simple as: `go get -u github.com/toqueteos/webbrowser` + +## Usage + +```go +package main + +import "github.com/toqueteos/webbrowser" + +func main() { + webbrowser.Open("http://golang.org") +} +``` + +That's it! + +## Already disliking it? + +No problem! There's alternative libraries that may be better to your needs: + +- https://github.com/pkg/browser, it does what webbrowser does and more! +- https://github.com/skratchdot/open-golang, it even provides a `xdg-open` implementation in case you don't have it! + +## Crossplatform support + +The package is guaranteed to work on `windows`, `linux` and `darwin`. It also has default support for `freebsd`, `openbsd` and `netbsd` but these three have not been tested yet (that I'm aware of). + +## License + +It is licensed under the MIT open source license, please see the [LICENSE.md] file for more information. + +## Thanks... + +Miki Tebeka wrote a nicer version that wasn't on godoc.org when I did this, [check it out!](https://bitbucket.org/tebeka/go-wise/src/d8db9bf5c4d1/desktop.go?at=default). diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/toqueteos/webbrowser/webbrowser.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/toqueteos/webbrowser/webbrowser.go new file mode 100644 index 00000000..f4f19b6b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/toqueteos/webbrowser/webbrowser.go @@ -0,0 +1,137 @@ +// Package webbrowser provides a simple API for opening web pages on your +// default browser. +package webbrowser + +import ( + "errors" + "fmt" + "net/url" + "os" + "os/exec" + "runtime" + "strings" +) + +var ( + ErrCantOpenBrowser = errors.New("webbrowser: can't open browser") + ErrNoCandidates = errors.New("webbrowser: no browser candidate found for your OS") +) + +// Candidates contains a list of registered `Browser`s that will be tried with Open. +var Candidates []Browser + +type Browser interface { + // Command returns a ready to be used Cmd that will open an URL. + Command(string) (*exec.Cmd, error) + // Open tries to open a URL in your default browser. NOTE: This may cause + // your program to hang until the browser process is closed in some OSes, + // see https://github.com/toqueteos/webbrowser/issues/4. + Open(string) error +} + +// Open tries to open a URL in your default browser ensuring you have a display +// set up and not running this from SSH. NOTE: This may cause your program to +// hang until the browser process is closed in some OSes, see +// https://github.com/toqueteos/webbrowser/issues/4. +func Open(s string) (err error) { + if len(Candidates) == 0 { + return ErrNoCandidates + } + + // Try to determine if there's a display available (only linux) and we + // aren't on a terminal (all but windows). + switch runtime.GOOS { + case "linux": + // No display, no need to open a browser. Lynx users **MAY** have + // something to say about this. + if os.Getenv("DISPLAY") == "" { + return fmt.Errorf("webbrowser: tried to open %q, no screen found", s) + } + fallthrough + case "darwin": + // Check SSH env vars. + if os.Getenv("SSH_CLIENT") != "" || os.Getenv("SSH_TTY") != "" { + return fmt.Errorf("webbrowser: tried to open %q, but you are running a shell session", s) + } + } + + // Try all candidates + for _, candidate := range Candidates { + err := candidate.Open(s) + if err == nil { + return nil + } + } + + return ErrCantOpenBrowser +} + +func init() { + // Register the default Browser for current OS, if it exists. + if os, ok := osCommand[runtime.GOOS]; ok { + Candidates = append(Candidates, browserCommand{os.cmd, os.args}) + } +} + +var ( + osCommand = map[string]*browserCommand{ + "android": &browserCommand{"xdg-open", nil}, + "darwin": &browserCommand{"open", nil}, + "freebsd": &browserCommand{"xdg-open", nil}, + "linux": &browserCommand{"xdg-open", nil}, + "netbsd": &browserCommand{"xdg-open", nil}, + "openbsd": &browserCommand{"xdg-open", nil}, // It may be open instead + "windows": &browserCommand{"cmd", []string{"/c", "start"}}, + } + winSchemes = [3]string{"https", "http", "file"} +) + +type browserCommand struct { + cmd string + args []string +} + +func (b browserCommand) Command(s string) (*exec.Cmd, error) { + u, err := url.Parse(s) + if err != nil { + return nil, err + } + + validUrl := ensureValidURL(u) + + b.args = append(b.args, validUrl) + + return exec.Command(b.cmd, b.args...), nil +} + +func (b browserCommand) Open(s string) error { + cmd, err := b.Command(s) + if err != nil { + return err + } + + return cmd.Run() +} + +func ensureScheme(u *url.URL) { + for _, s := range winSchemes { + if u.Scheme == s { + return + } + } + u.Scheme = "http" +} + +func ensureValidURL(u *url.URL) string { + // Enforce a scheme (windows requires scheme to be set to work properly). + ensureScheme(u) + s := u.String() + + // Escape characters not allowed by cmd/bash + switch runtime.GOOS { + case "windows": + s = strings.Replace(s, "&", `^&`, -1) + } + + return s +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/.flake8 b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/.flake8 new file mode 100644 index 00000000..6deafc26 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/.flake8 @@ -0,0 +1,2 @@ +[flake8] +max-line-length = 120 diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/.gitignore b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/.gitignore new file mode 100644 index 00000000..faf70c4c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/.gitignore @@ -0,0 +1,2 @@ +*.coverprofile +node_modules/ diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/.travis.yml b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/.travis.yml new file mode 100644 index 00000000..cf8d0980 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/.travis.yml @@ -0,0 +1,27 @@ +language: go +sudo: false +dist: trusty +osx_image: xcode8.3 +go: 1.8.x + +os: +- linux +- osx + +cache: + directories: + - node_modules + +before_script: +- go get github.com/urfave/gfmrun/... || true +- go get golang.org/x/tools/cmd/goimports +- if [ ! -f node_modules/.bin/markdown-toc ] ; then + npm install markdown-toc ; + fi + +script: +- ./runtests gen +- ./runtests vet +- ./runtests test +- ./runtests gfmrun +- ./runtests toc diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/CHANGELOG.md b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/CHANGELOG.md new file mode 100644 index 00000000..401eae5a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/CHANGELOG.md @@ -0,0 +1,435 @@ +# Change Log + +**ATTN**: This project uses [semantic versioning](http://semver.org/). + +## [Unreleased] + +## 1.20.0 - 2017-08-10 + +### Fixed + +* `HandleExitCoder` is now correctly iterates over all errors in + a `MultiError`. The exit code is the exit code of the last error or `1` if + there are no `ExitCoder`s in the `MultiError`. +* Fixed YAML file loading on Windows (previously would fail validate the file path) +* Subcommand `Usage`, `Description`, `ArgsUsage`, `OnUsageError` correctly + propogated +* `ErrWriter` is now passed downwards through command structure to avoid the + need to redefine it +* Pass `Command` context into `OnUsageError` rather than parent context so that + all fields are avaiable +* Errors occuring in `Before` funcs are no longer double printed +* Use `UsageText` in the help templates for commands and subcommands if + defined; otherwise build the usage as before (was previously ignoring this + field) +* `IsSet` and `GlobalIsSet` now correctly return whether a flag is set if + a program calls `Set` or `GlobalSet` directly after flag parsing (would + previously only return `true` if the flag was set during parsing) + +### Changed + +* No longer exit the program on command/subcommand error if the error raised is + not an `OsExiter`. This exiting behavior was introduced in 1.19.0, but was + determined to be a regression in functionality. See [the + PR](https://github.com/urfave/cli/pull/595) for discussion. + +### Added + +* `CommandsByName` type was added to make it easy to sort `Command`s by name, + alphabetically +* `altsrc` now handles loading of string and int arrays from TOML +* Support for definition of custom help templates for `App` via + `CustomAppHelpTemplate` +* Support for arbitrary key/value fields on `App` to be used with + `CustomAppHelpTemplate` via `ExtraInfo` +* `HelpFlag`, `VersionFlag`, and `BashCompletionFlag` changed to explictly be + `cli.Flag`s allowing for the use of custom flags satisfying the `cli.Flag` + interface to be used. + + +## [1.19.1] - 2016-11-21 + +### Fixed + +- Fixes regression introduced in 1.19.0 where using an `ActionFunc` as + the `Action` for a command would cause it to error rather than calling the + function. Should not have a affected declarative cases using `func(c + *cli.Context) err)`. +- Shell completion now handles the case where the user specifies + `--generate-bash-completion` immediately after a flag that takes an argument. + Previously it call the application with `--generate-bash-completion` as the + flag value. + +## [1.19.0] - 2016-11-19 +### Added +- `FlagsByName` was added to make it easy to sort flags (e.g. `sort.Sort(cli.FlagsByName(app.Flags))`) +- A `Description` field was added to `App` for a more detailed description of + the application (similar to the existing `Description` field on `Command`) +- Flag type code generation via `go generate` +- Write to stderr and exit 1 if action returns non-nil error +- Added support for TOML to the `altsrc` loader +- `SkipArgReorder` was added to allow users to skip the argument reordering. + This is useful if you want to consider all "flags" after an argument as + arguments rather than flags (the default behavior of the stdlib `flag` + library). This is backported functionality from the [removal of the flag + reordering](https://github.com/urfave/cli/pull/398) in the unreleased version + 2 +- For formatted errors (those implementing `ErrorFormatter`), the errors will + be formatted during output. Compatible with `pkg/errors`. + +### Changed +- Raise minimum tested/supported Go version to 1.2+ + +### Fixed +- Consider empty environment variables as set (previously environment variables + with the equivalent of `""` would be skipped rather than their value used). +- Return an error if the value in a given environment variable cannot be parsed + as the flag type. Previously these errors were silently swallowed. +- Print full error when an invalid flag is specified (which includes the invalid flag) +- `App.Writer` defaults to `stdout` when `nil` +- If no action is specified on a command or app, the help is now printed instead of `panic`ing +- `App.Metadata` is initialized automatically now (previously was `nil` unless initialized) +- Correctly show help message if `-h` is provided to a subcommand +- `context.(Global)IsSet` now respects environment variables. Previously it + would return `false` if a flag was specified in the environment rather than + as an argument +- Removed deprecation warnings to STDERR to avoid them leaking to the end-user +- `altsrc`s import paths were updated to use `gopkg.in/urfave/cli.v1`. This + fixes issues that occurred when `gopkg.in/urfave/cli.v1` was imported as well + as `altsrc` where Go would complain that the types didn't match + +## [1.18.1] - 2016-08-28 +### Fixed +- Removed deprecation warnings to STDERR to avoid them leaking to the end-user (backported) + +## [1.18.0] - 2016-06-27 +### Added +- `./runtests` test runner with coverage tracking by default +- testing on OS X +- testing on Windows +- `UintFlag`, `Uint64Flag`, and `Int64Flag` types and supporting code + +### Changed +- Use spaces for alignment in help/usage output instead of tabs, making the + output alignment consistent regardless of tab width + +### Fixed +- Printing of command aliases in help text +- Printing of visible flags for both struct and struct pointer flags +- Display the `help` subcommand when using `CommandCategories` +- No longer swallows `panic`s that occur within the `Action`s themselves when + detecting the signature of the `Action` field + +## [1.17.1] - 2016-08-28 +### Fixed +- Removed deprecation warnings to STDERR to avoid them leaking to the end-user + +## [1.17.0] - 2016-05-09 +### Added +- Pluggable flag-level help text rendering via `cli.DefaultFlagStringFunc` +- `context.GlobalBoolT` was added as an analogue to `context.GlobalBool` +- Support for hiding commands by setting `Hidden: true` -- this will hide the + commands in help output + +### Changed +- `Float64Flag`, `IntFlag`, and `DurationFlag` default values are no longer + quoted in help text output. +- All flag types now include `(default: {value})` strings following usage when a + default value can be (reasonably) detected. +- `IntSliceFlag` and `StringSliceFlag` usage strings are now more consistent + with non-slice flag types +- Apps now exit with a code of 3 if an unknown subcommand is specified + (previously they printed "No help topic for...", but still exited 0. This + makes it easier to script around apps built using `cli` since they can trust + that a 0 exit code indicated a successful execution. +- cleanups based on [Go Report Card + feedback](https://goreportcard.com/report/github.com/urfave/cli) + +## [1.16.1] - 2016-08-28 +### Fixed +- Removed deprecation warnings to STDERR to avoid them leaking to the end-user + +## [1.16.0] - 2016-05-02 +### Added +- `Hidden` field on all flag struct types to omit from generated help text + +### Changed +- `BashCompletionFlag` (`--enable-bash-completion`) is now omitted from +generated help text via the `Hidden` field + +### Fixed +- handling of error values in `HandleAction` and `HandleExitCoder` + +## [1.15.0] - 2016-04-30 +### Added +- This file! +- Support for placeholders in flag usage strings +- `App.Metadata` map for arbitrary data/state management +- `Set` and `GlobalSet` methods on `*cli.Context` for altering values after +parsing. +- Support for nested lookup of dot-delimited keys in structures loaded from +YAML. + +### Changed +- The `App.Action` and `Command.Action` now prefer a return signature of +`func(*cli.Context) error`, as defined by `cli.ActionFunc`. If a non-nil +`error` is returned, there may be two outcomes: + - If the error fulfills `cli.ExitCoder`, then `os.Exit` will be called + automatically + - Else the error is bubbled up and returned from `App.Run` +- Specifying an `Action` with the legacy return signature of +`func(*cli.Context)` will produce a deprecation message to stderr +- Specifying an `Action` that is not a `func` type will produce a non-zero exit +from `App.Run` +- Specifying an `Action` func that has an invalid (input) signature will +produce a non-zero exit from `App.Run` + +### Deprecated +- +`cli.App.RunAndExitOnError`, which should now be done by returning an error +that fulfills `cli.ExitCoder` to `cli.App.Run`. +- the legacy signature for +`cli.App.Action` of `func(*cli.Context)`, which should now have a return +signature of `func(*cli.Context) error`, as defined by `cli.ActionFunc`. + +### Fixed +- Added missing `*cli.Context.GlobalFloat64` method + +## [1.14.0] - 2016-04-03 (backfilled 2016-04-25) +### Added +- Codebeat badge +- Support for categorization via `CategorizedHelp` and `Categories` on app. + +### Changed +- Use `filepath.Base` instead of `path.Base` in `Name` and `HelpName`. + +### Fixed +- Ensure version is not shown in help text when `HideVersion` set. + +## [1.13.0] - 2016-03-06 (backfilled 2016-04-25) +### Added +- YAML file input support. +- `NArg` method on context. + +## [1.12.0] - 2016-02-17 (backfilled 2016-04-25) +### Added +- Custom usage error handling. +- Custom text support in `USAGE` section of help output. +- Improved help messages for empty strings. +- AppVeyor CI configuration. + +### Changed +- Removed `panic` from default help printer func. +- De-duping and optimizations. + +### Fixed +- Correctly handle `Before`/`After` at command level when no subcommands. +- Case of literal `-` argument causing flag reordering. +- Environment variable hints on Windows. +- Docs updates. + +## [1.11.1] - 2015-12-21 (backfilled 2016-04-25) +### Changed +- Use `path.Base` in `Name` and `HelpName` +- Export `GetName` on flag types. + +### Fixed +- Flag parsing when skipping is enabled. +- Test output cleanup. +- Move completion check to account for empty input case. + +## [1.11.0] - 2015-11-15 (backfilled 2016-04-25) +### Added +- Destination scan support for flags. +- Testing against `tip` in Travis CI config. + +### Changed +- Go version in Travis CI config. + +### Fixed +- Removed redundant tests. +- Use correct example naming in tests. + +## [1.10.2] - 2015-10-29 (backfilled 2016-04-25) +### Fixed +- Remove unused var in bash completion. + +## [1.10.1] - 2015-10-21 (backfilled 2016-04-25) +### Added +- Coverage and reference logos in README. + +### Fixed +- Use specified values in help and version parsing. +- Only display app version and help message once. + +## [1.10.0] - 2015-10-06 (backfilled 2016-04-25) +### Added +- More tests for existing functionality. +- `ArgsUsage` at app and command level for help text flexibility. + +### Fixed +- Honor `HideHelp` and `HideVersion` in `App.Run`. +- Remove juvenile word from README. + +## [1.9.0] - 2015-09-08 (backfilled 2016-04-25) +### Added +- `FullName` on command with accompanying help output update. +- Set default `$PROG` in bash completion. + +### Changed +- Docs formatting. + +### Fixed +- Removed self-referential imports in tests. + +## [1.8.0] - 2015-06-30 (backfilled 2016-04-25) +### Added +- Support for `Copyright` at app level. +- `Parent` func at context level to walk up context lineage. + +### Fixed +- Global flag processing at top level. + +## [1.7.1] - 2015-06-11 (backfilled 2016-04-25) +### Added +- Aggregate errors from `Before`/`After` funcs. +- Doc comments on flag structs. +- Include non-global flags when checking version and help. +- Travis CI config updates. + +### Fixed +- Ensure slice type flags have non-nil values. +- Collect global flags from the full command hierarchy. +- Docs prose. + +## [1.7.0] - 2015-05-03 (backfilled 2016-04-25) +### Changed +- `HelpPrinter` signature includes output writer. + +### Fixed +- Specify go 1.1+ in docs. +- Set `Writer` when running command as app. + +## [1.6.0] - 2015-03-23 (backfilled 2016-04-25) +### Added +- Multiple author support. +- `NumFlags` at context level. +- `Aliases` at command level. + +### Deprecated +- `ShortName` at command level. + +### Fixed +- Subcommand help output. +- Backward compatible support for deprecated `Author` and `Email` fields. +- Docs regarding `Names`/`Aliases`. + +## [1.5.0] - 2015-02-20 (backfilled 2016-04-25) +### Added +- `After` hook func support at app and command level. + +### Fixed +- Use parsed context when running command as subcommand. +- Docs prose. + +## [1.4.1] - 2015-01-09 (backfilled 2016-04-25) +### Added +- Support for hiding `-h / --help` flags, but not `help` subcommand. +- Stop flag parsing after `--`. + +### Fixed +- Help text for generic flags to specify single value. +- Use double quotes in output for defaults. +- Use `ParseInt` instead of `ParseUint` for int environment var values. +- Use `0` as base when parsing int environment var values. + +## [1.4.0] - 2014-12-12 (backfilled 2016-04-25) +### Added +- Support for environment variable lookup "cascade". +- Support for `Stdout` on app for output redirection. + +### Fixed +- Print command help instead of app help in `ShowCommandHelp`. + +## [1.3.1] - 2014-11-13 (backfilled 2016-04-25) +### Added +- Docs and example code updates. + +### Changed +- Default `-v / --version` flag made optional. + +## [1.3.0] - 2014-08-10 (backfilled 2016-04-25) +### Added +- `FlagNames` at context level. +- Exposed `VersionPrinter` var for more control over version output. +- Zsh completion hook. +- `AUTHOR` section in default app help template. +- Contribution guidelines. +- `DurationFlag` type. + +## [1.2.0] - 2014-08-02 +### Added +- Support for environment variable defaults on flags plus tests. + +## [1.1.0] - 2014-07-15 +### Added +- Bash completion. +- Optional hiding of built-in help command. +- Optional skipping of flag parsing at command level. +- `Author`, `Email`, and `Compiled` metadata on app. +- `Before` hook func support at app and command level. +- `CommandNotFound` func support at app level. +- Command reference available on context. +- `GenericFlag` type. +- `Float64Flag` type. +- `BoolTFlag` type. +- `IsSet` flag helper on context. +- More flag lookup funcs at context level. +- More tests & docs. + +### Changed +- Help template updates to account for presence/absence of flags. +- Separated subcommand help template. +- Exposed `HelpPrinter` var for more control over help output. + +## [1.0.0] - 2013-11-01 +### Added +- `help` flag in default app flag set and each command flag set. +- Custom handling of argument parsing errors. +- Command lookup by name at app level. +- `StringSliceFlag` type and supporting `StringSlice` type. +- `IntSliceFlag` type and supporting `IntSlice` type. +- Slice type flag lookups by name at context level. +- Export of app and command help functions. +- More tests & docs. + +## 0.1.0 - 2013-07-22 +### Added +- Initial implementation. + +[Unreleased]: https://github.com/urfave/cli/compare/v1.18.0...HEAD +[1.18.0]: https://github.com/urfave/cli/compare/v1.17.0...v1.18.0 +[1.17.0]: https://github.com/urfave/cli/compare/v1.16.0...v1.17.0 +[1.16.0]: https://github.com/urfave/cli/compare/v1.15.0...v1.16.0 +[1.15.0]: https://github.com/urfave/cli/compare/v1.14.0...v1.15.0 +[1.14.0]: https://github.com/urfave/cli/compare/v1.13.0...v1.14.0 +[1.13.0]: https://github.com/urfave/cli/compare/v1.12.0...v1.13.0 +[1.12.0]: https://github.com/urfave/cli/compare/v1.11.1...v1.12.0 +[1.11.1]: https://github.com/urfave/cli/compare/v1.11.0...v1.11.1 +[1.11.0]: https://github.com/urfave/cli/compare/v1.10.2...v1.11.0 +[1.10.2]: https://github.com/urfave/cli/compare/v1.10.1...v1.10.2 +[1.10.1]: https://github.com/urfave/cli/compare/v1.10.0...v1.10.1 +[1.10.0]: https://github.com/urfave/cli/compare/v1.9.0...v1.10.0 +[1.9.0]: https://github.com/urfave/cli/compare/v1.8.0...v1.9.0 +[1.8.0]: https://github.com/urfave/cli/compare/v1.7.1...v1.8.0 +[1.7.1]: https://github.com/urfave/cli/compare/v1.7.0...v1.7.1 +[1.7.0]: https://github.com/urfave/cli/compare/v1.6.0...v1.7.0 +[1.6.0]: https://github.com/urfave/cli/compare/v1.5.0...v1.6.0 +[1.5.0]: https://github.com/urfave/cli/compare/v1.4.1...v1.5.0 +[1.4.1]: https://github.com/urfave/cli/compare/v1.4.0...v1.4.1 +[1.4.0]: https://github.com/urfave/cli/compare/v1.3.1...v1.4.0 +[1.3.1]: https://github.com/urfave/cli/compare/v1.3.0...v1.3.1 +[1.3.0]: https://github.com/urfave/cli/compare/v1.2.0...v1.3.0 +[1.2.0]: https://github.com/urfave/cli/compare/v1.1.0...v1.2.0 +[1.1.0]: https://github.com/urfave/cli/compare/v1.0.0...v1.1.0 +[1.0.0]: https://github.com/urfave/cli/compare/v0.1.0...v1.0.0 diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/LICENSE b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/LICENSE new file mode 100644 index 00000000..42a597e2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2016 Jeremy Saenz & Contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/README.md b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/README.md new file mode 100644 index 00000000..2bbbd8ea --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/README.md @@ -0,0 +1,1381 @@ +cli +=== + +[![Build Status](https://travis-ci.org/urfave/cli.svg?branch=master)](https://travis-ci.org/urfave/cli) +[![Windows Build Status](https://ci.appveyor.com/api/projects/status/rtgk5xufi932pb2v?svg=true)](https://ci.appveyor.com/project/urfave/cli) +[![GoDoc](https://godoc.org/github.com/urfave/cli?status.svg)](https://godoc.org/github.com/urfave/cli) +[![codebeat](https://codebeat.co/badges/0a8f30aa-f975-404b-b878-5fab3ae1cc5f)](https://codebeat.co/projects/github-com-urfave-cli) +[![Go Report Card](https://goreportcard.com/badge/urfave/cli)](https://goreportcard.com/report/urfave/cli) +[![top level coverage](https://gocover.io/_badge/github.com/urfave/cli?0 "top level coverage")](http://gocover.io/github.com/urfave/cli) / +[![altsrc coverage](https://gocover.io/_badge/github.com/urfave/cli/altsrc?0 "altsrc coverage")](http://gocover.io/github.com/urfave/cli/altsrc) + +**Notice:** This is the library formerly known as +`github.com/codegangsta/cli` -- Github will automatically redirect requests +to this repository, but we recommend updating your references for clarity. + +cli is a simple, fast, and fun package for building command line apps in Go. The +goal is to enable developers to write fast and distributable command line +applications in an expressive way. + + + +- [Overview](#overview) +- [Installation](#installation) + * [Supported platforms](#supported-platforms) + * [Using the `v2` branch](#using-the-v2-branch) + * [Pinning to the `v1` releases](#pinning-to-the-v1-releases) +- [Getting Started](#getting-started) +- [Examples](#examples) + * [Arguments](#arguments) + * [Flags](#flags) + + [Placeholder Values](#placeholder-values) + + [Alternate Names](#alternate-names) + + [Ordering](#ordering) + + [Values from the Environment](#values-from-the-environment) + + [Values from alternate input sources (YAML, TOML, and others)](#values-from-alternate-input-sources-yaml-toml-and-others) + * [Subcommands](#subcommands) + * [Subcommands categories](#subcommands-categories) + * [Exit code](#exit-code) + * [Bash Completion](#bash-completion) + + [Enabling](#enabling) + + [Distribution](#distribution) + + [Customization](#customization) + * [Generated Help Text](#generated-help-text) + + [Customization](#customization-1) + * [Version Flag](#version-flag) + + [Customization](#customization-2) + + [Full API Example](#full-api-example) +- [Contribution Guidelines](#contribution-guidelines) + + + +## Overview + +Command line apps are usually so tiny that there is absolutely no reason why +your code should *not* be self-documenting. Things like generating help text and +parsing command flags/options should not hinder productivity when writing a +command line app. + +**This is where cli comes into play.** cli makes command line programming fun, +organized, and expressive! + +## Installation + +Make sure you have a working Go environment. Go version 1.2+ is supported. [See +the install instructions for Go](http://golang.org/doc/install.html). + +To install cli, simply run: +``` +$ go get github.com/urfave/cli +``` + +Make sure your `PATH` includes the `$GOPATH/bin` directory so your commands can +be easily used: +``` +export PATH=$PATH:$GOPATH/bin +``` + +### Supported platforms + +cli is tested against multiple versions of Go on Linux, and against the latest +released version of Go on OS X and Windows. For full details, see +[`./.travis.yml`](./.travis.yml) and [`./appveyor.yml`](./appveyor.yml). + +### Using the `v2` branch + +**Warning**: The `v2` branch is currently unreleased and considered unstable. + +There is currently a long-lived branch named `v2` that is intended to land as +the new `master` branch once development there has settled down. The current +`master` branch (mirrored as `v1`) is being manually merged into `v2` on +an irregular human-based schedule, but generally if one wants to "upgrade" to +`v2` *now* and accept the volatility (read: "awesomeness") that comes along with +that, please use whatever version pinning of your preference, such as via +`gopkg.in`: + +``` +$ go get gopkg.in/urfave/cli.v2 +``` + +``` go +... +import ( + "gopkg.in/urfave/cli.v2" // imports as package "cli" +) +... +``` + +### Pinning to the `v1` releases + +Similarly to the section above describing use of the `v2` branch, if one wants +to avoid any unexpected compatibility pains once `v2` becomes `master`, then +pinning to `v1` is an acceptable option, e.g.: + +``` +$ go get gopkg.in/urfave/cli.v1 +``` + +``` go +... +import ( + "gopkg.in/urfave/cli.v1" // imports as package "cli" +) +... +``` + +This will pull the latest tagged `v1` release (e.g. `v1.18.1` at the time of writing). + +## Getting Started + +One of the philosophies behind cli is that an API should be playful and full of +discovery. So a cli app can be as little as one line of code in `main()`. + + +``` go +package main + +import ( + "os" + + "github.com/urfave/cli" +) + +func main() { + cli.NewApp().Run(os.Args) +} +``` + +This app will run and show help text, but is not very useful. Let's give an +action to execute and some help documentation: + + +``` go +package main + +import ( + "fmt" + "os" + + "github.com/urfave/cli" +) + +func main() { + app := cli.NewApp() + app.Name = "boom" + app.Usage = "make an explosive entrance" + app.Action = func(c *cli.Context) error { + fmt.Println("boom! I say!") + return nil + } + + app.Run(os.Args) +} +``` + +Running this already gives you a ton of functionality, plus support for things +like subcommands and flags, which are covered below. + +## Examples + +Being a programmer can be a lonely job. Thankfully by the power of automation +that is not the case! Let's create a greeter app to fend off our demons of +loneliness! + +Start by creating a directory named `greet`, and within it, add a file, +`greet.go` with the following code in it: + + +``` go +package main + +import ( + "fmt" + "os" + + "github.com/urfave/cli" +) + +func main() { + app := cli.NewApp() + app.Name = "greet" + app.Usage = "fight the loneliness!" + app.Action = func(c *cli.Context) error { + fmt.Println("Hello friend!") + return nil + } + + app.Run(os.Args) +} +``` + +Install our command to the `$GOPATH/bin` directory: + +``` +$ go install +``` + +Finally run our new command: + +``` +$ greet +Hello friend! +``` + +cli also generates neat help text: + +``` +$ greet help +NAME: + greet - fight the loneliness! + +USAGE: + greet [global options] command [command options] [arguments...] + +VERSION: + 0.0.0 + +COMMANDS: + help, h Shows a list of commands or help for one command + +GLOBAL OPTIONS + --version Shows version information +``` + +### Arguments + +You can lookup arguments by calling the `Args` function on `cli.Context`, e.g.: + + +``` go +package main + +import ( + "fmt" + "os" + + "github.com/urfave/cli" +) + +func main() { + app := cli.NewApp() + + app.Action = func(c *cli.Context) error { + fmt.Printf("Hello %q", c.Args().Get(0)) + return nil + } + + app.Run(os.Args) +} +``` + +### Flags + +Setting and querying flags is simple. + + +``` go +package main + +import ( + "fmt" + "os" + + "github.com/urfave/cli" +) + +func main() { + app := cli.NewApp() + + app.Flags = []cli.Flag { + cli.StringFlag{ + Name: "lang", + Value: "english", + Usage: "language for the greeting", + }, + } + + app.Action = func(c *cli.Context) error { + name := "Nefertiti" + if c.NArg() > 0 { + name = c.Args().Get(0) + } + if c.String("lang") == "spanish" { + fmt.Println("Hola", name) + } else { + fmt.Println("Hello", name) + } + return nil + } + + app.Run(os.Args) +} +``` + +You can also set a destination variable for a flag, to which the content will be +scanned. + + +``` go +package main + +import ( + "os" + "fmt" + + "github.com/urfave/cli" +) + +func main() { + var language string + + app := cli.NewApp() + + app.Flags = []cli.Flag { + cli.StringFlag{ + Name: "lang", + Value: "english", + Usage: "language for the greeting", + Destination: &language, + }, + } + + app.Action = func(c *cli.Context) error { + name := "someone" + if c.NArg() > 0 { + name = c.Args()[0] + } + if language == "spanish" { + fmt.Println("Hola", name) + } else { + fmt.Println("Hello", name) + } + return nil + } + + app.Run(os.Args) +} +``` + +See full list of flags at http://godoc.org/github.com/urfave/cli + +#### Placeholder Values + +Sometimes it's useful to specify a flag's value within the usage string itself. +Such placeholders are indicated with back quotes. + +For example this: + + +```go +package main + +import ( + "os" + + "github.com/urfave/cli" +) + +func main() { + app := cli.NewApp() + + app.Flags = []cli.Flag{ + cli.StringFlag{ + Name: "config, c", + Usage: "Load configuration from `FILE`", + }, + } + + app.Run(os.Args) +} +``` + +Will result in help output like: + +``` +--config FILE, -c FILE Load configuration from FILE +``` + +Note that only the first placeholder is used. Subsequent back-quoted words will +be left as-is. + +#### Alternate Names + +You can set alternate (or short) names for flags by providing a comma-delimited +list for the `Name`. e.g. + + +``` go +package main + +import ( + "os" + + "github.com/urfave/cli" +) + +func main() { + app := cli.NewApp() + + app.Flags = []cli.Flag { + cli.StringFlag{ + Name: "lang, l", + Value: "english", + Usage: "language for the greeting", + }, + } + + app.Run(os.Args) +} +``` + +That flag can then be set with `--lang spanish` or `-l spanish`. Note that +giving two different forms of the same flag in the same command invocation is an +error. + +#### Ordering + +Flags for the application and commands are shown in the order they are defined. +However, it's possible to sort them from outside this library by using `FlagsByName` +or `CommandsByName` with `sort`. + +For example this: + + +``` go +package main + +import ( + "os" + "sort" + + "github.com/urfave/cli" +) + +func main() { + app := cli.NewApp() + + app.Flags = []cli.Flag { + cli.StringFlag{ + Name: "lang, l", + Value: "english", + Usage: "Language for the greeting", + }, + cli.StringFlag{ + Name: "config, c", + Usage: "Load configuration from `FILE`", + }, + } + + app.Commands = []cli.Command{ + { + Name: "complete", + Aliases: []string{"c"}, + Usage: "complete a task on the list", + Action: func(c *cli.Context) error { + return nil + }, + }, + { + Name: "add", + Aliases: []string{"a"}, + Usage: "add a task to the list", + Action: func(c *cli.Context) error { + return nil + }, + }, + } + + sort.Sort(cli.FlagsByName(app.Flags)) + sort.Sort(cli.CommandsByName(app.Commands)) + + app.Run(os.Args) +} +``` + +Will result in help output like: + +``` +--config FILE, -c FILE Load configuration from FILE +--lang value, -l value Language for the greeting (default: "english") +``` + +#### Values from the Environment + +You can also have the default value set from the environment via `EnvVar`. e.g. + + +``` go +package main + +import ( + "os" + + "github.com/urfave/cli" +) + +func main() { + app := cli.NewApp() + + app.Flags = []cli.Flag { + cli.StringFlag{ + Name: "lang, l", + Value: "english", + Usage: "language for the greeting", + EnvVar: "APP_LANG", + }, + } + + app.Run(os.Args) +} +``` + +The `EnvVar` may also be given as a comma-delimited "cascade", where the first +environment variable that resolves is used as the default. + + +``` go +package main + +import ( + "os" + + "github.com/urfave/cli" +) + +func main() { + app := cli.NewApp() + + app.Flags = []cli.Flag { + cli.StringFlag{ + Name: "lang, l", + Value: "english", + Usage: "language for the greeting", + EnvVar: "LEGACY_COMPAT_LANG,APP_LANG,LANG", + }, + } + + app.Run(os.Args) +} +``` + +#### Values from alternate input sources (YAML, TOML, and others) + +There is a separate package altsrc that adds support for getting flag values +from other file input sources. + +Currently supported input source formats: +* YAML +* TOML + +In order to get values for a flag from an alternate input source the following +code would be added to wrap an existing cli.Flag like below: + +``` go + altsrc.NewIntFlag(cli.IntFlag{Name: "test"}) +``` + +Initialization must also occur for these flags. Below is an example initializing +getting data from a yaml file below. + +``` go + command.Before = altsrc.InitInputSourceWithContext(command.Flags, NewYamlSourceFromFlagFunc("load")) +``` + +The code above will use the "load" string as a flag name to get the file name of +a yaml file from the cli.Context. It will then use that file name to initialize +the yaml input source for any flags that are defined on that command. As a note +the "load" flag used would also have to be defined on the command flags in order +for this code snipped to work. + +Currently only the aboved specified formats are supported but developers can +add support for other input sources by implementing the +altsrc.InputSourceContext for their given sources. + +Here is a more complete sample of a command using YAML support: + + +``` go +package notmain + +import ( + "fmt" + "os" + + "github.com/urfave/cli" + "github.com/urfave/cli/altsrc" +) + +func main() { + app := cli.NewApp() + + flags := []cli.Flag{ + altsrc.NewIntFlag(cli.IntFlag{Name: "test"}), + cli.StringFlag{Name: "load"}, + } + + app.Action = func(c *cli.Context) error { + fmt.Println("yaml ist rad") + return nil + } + + app.Before = altsrc.InitInputSourceWithContext(flags, altsrc.NewYamlSourceFromFlagFunc("load")) + app.Flags = flags + + app.Run(os.Args) +} +``` + +### Subcommands + +Subcommands can be defined for a more git-like command line app. + + +```go +package main + +import ( + "fmt" + "os" + + "github.com/urfave/cli" +) + +func main() { + app := cli.NewApp() + + app.Commands = []cli.Command{ + { + Name: "add", + Aliases: []string{"a"}, + Usage: "add a task to the list", + Action: func(c *cli.Context) error { + fmt.Println("added task: ", c.Args().First()) + return nil + }, + }, + { + Name: "complete", + Aliases: []string{"c"}, + Usage: "complete a task on the list", + Action: func(c *cli.Context) error { + fmt.Println("completed task: ", c.Args().First()) + return nil + }, + }, + { + Name: "template", + Aliases: []string{"t"}, + Usage: "options for task templates", + Subcommands: []cli.Command{ + { + Name: "add", + Usage: "add a new template", + Action: func(c *cli.Context) error { + fmt.Println("new task template: ", c.Args().First()) + return nil + }, + }, + { + Name: "remove", + Usage: "remove an existing template", + Action: func(c *cli.Context) error { + fmt.Println("removed task template: ", c.Args().First()) + return nil + }, + }, + }, + }, + } + + app.Run(os.Args) +} +``` + +### Subcommands categories + +For additional organization in apps that have many subcommands, you can +associate a category for each command to group them together in the help +output. + +E.g. + +```go +package main + +import ( + "os" + + "github.com/urfave/cli" +) + +func main() { + app := cli.NewApp() + + app.Commands = []cli.Command{ + { + Name: "noop", + }, + { + Name: "add", + Category: "template", + }, + { + Name: "remove", + Category: "template", + }, + } + + app.Run(os.Args) +} +``` + +Will include: + +``` +COMMANDS: + noop + + Template actions: + add + remove +``` + +### Exit code + +Calling `App.Run` will not automatically call `os.Exit`, which means that by +default the exit code will "fall through" to being `0`. An explicit exit code +may be set by returning a non-nil error that fulfills `cli.ExitCoder`, *or* a +`cli.MultiError` that includes an error that fulfills `cli.ExitCoder`, e.g.: + +``` go +package main + +import ( + "os" + + "github.com/urfave/cli" +) + +func main() { + app := cli.NewApp() + app.Flags = []cli.Flag{ + cli.BoolTFlag{ + Name: "ginger-crouton", + Usage: "is it in the soup?", + }, + } + app.Action = func(ctx *cli.Context) error { + if !ctx.Bool("ginger-crouton") { + return cli.NewExitError("it is not in the soup", 86) + } + return nil + } + + app.Run(os.Args) +} +``` + +### Bash Completion + +You can enable completion commands by setting the `EnableBashCompletion` +flag on the `App` object. By default, this setting will only auto-complete to +show an app's subcommands, but you can write your own completion methods for +the App or its subcommands. + + +``` go +package main + +import ( + "fmt" + "os" + + "github.com/urfave/cli" +) + +func main() { + tasks := []string{"cook", "clean", "laundry", "eat", "sleep", "code"} + + app := cli.NewApp() + app.EnableBashCompletion = true + app.Commands = []cli.Command{ + { + Name: "complete", + Aliases: []string{"c"}, + Usage: "complete a task on the list", + Action: func(c *cli.Context) error { + fmt.Println("completed task: ", c.Args().First()) + return nil + }, + BashComplete: func(c *cli.Context) { + // This will complete if no args are passed + if c.NArg() > 0 { + return + } + for _, t := range tasks { + fmt.Println(t) + } + }, + }, + } + + app.Run(os.Args) +} +``` + +#### Enabling + +Source the `autocomplete/bash_autocomplete` file in your `.bashrc` file while +setting the `PROG` variable to the name of your program: + +`PROG=myprogram source /.../cli/autocomplete/bash_autocomplete` + +#### Distribution + +Copy `autocomplete/bash_autocomplete` into `/etc/bash_completion.d/` and rename +it to the name of the program you wish to add autocomplete support for (or +automatically install it there if you are distributing a package). Don't forget +to source the file to make it active in the current shell. + +``` +sudo cp src/bash_autocomplete /etc/bash_completion.d/ +source /etc/bash_completion.d/ +``` + +Alternatively, you can just document that users should source the generic +`autocomplete/bash_autocomplete` in their bash configuration with `$PROG` set +to the name of their program (as above). + +#### Customization + +The default bash completion flag (`--generate-bash-completion`) is defined as +`cli.BashCompletionFlag`, and may be redefined if desired, e.g.: + + +``` go +package main + +import ( + "os" + + "github.com/urfave/cli" +) + +func main() { + cli.BashCompletionFlag = cli.BoolFlag{ + Name: "compgen", + Hidden: true, + } + + app := cli.NewApp() + app.EnableBashCompletion = true + app.Commands = []cli.Command{ + { + Name: "wat", + }, + } + app.Run(os.Args) +} +``` + +### Generated Help Text + +The default help flag (`-h/--help`) is defined as `cli.HelpFlag` and is checked +by the cli internals in order to print generated help text for the app, command, +or subcommand, and break execution. + +#### Customization + +All of the help text generation may be customized, and at multiple levels. The +templates are exposed as variables `AppHelpTemplate`, `CommandHelpTemplate`, and +`SubcommandHelpTemplate` which may be reassigned or augmented, and full override +is possible by assigning a compatible func to the `cli.HelpPrinter` variable, +e.g.: + + +``` go +package main + +import ( + "fmt" + "io" + "os" + + "github.com/urfave/cli" +) + +func main() { + // EXAMPLE: Append to an existing template + cli.AppHelpTemplate = fmt.Sprintf(`%s + +WEBSITE: http://awesometown.example.com + +SUPPORT: support@awesometown.example.com + +`, cli.AppHelpTemplate) + + // EXAMPLE: Override a template + cli.AppHelpTemplate = `NAME: + {{.Name}} - {{.Usage}} +USAGE: + {{.HelpName}} {{if .VisibleFlags}}[global options]{{end}}{{if .Commands}} command [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}} + {{if len .Authors}} +AUTHOR: + {{range .Authors}}{{ . }}{{end}} + {{end}}{{if .Commands}} +COMMANDS: +{{range .Commands}}{{if not .HideHelp}} {{join .Names ", "}}{{ "\t"}}{{.Usage}}{{ "\n" }}{{end}}{{end}}{{end}}{{if .VisibleFlags}} +GLOBAL OPTIONS: + {{range .VisibleFlags}}{{.}} + {{end}}{{end}}{{if .Copyright }} +COPYRIGHT: + {{.Copyright}} + {{end}}{{if .Version}} +VERSION: + {{.Version}} + {{end}} +` + + // EXAMPLE: Replace the `HelpPrinter` func + cli.HelpPrinter = func(w io.Writer, templ string, data interface{}) { + fmt.Println("Ha HA. I pwnd the help!!1") + } + + cli.NewApp().Run(os.Args) +} +``` + +The default flag may be customized to something other than `-h/--help` by +setting `cli.HelpFlag`, e.g.: + + +``` go +package main + +import ( + "os" + + "github.com/urfave/cli" +) + +func main() { + cli.HelpFlag = cli.BoolFlag{ + Name: "halp, haaaaalp", + Usage: "HALP", + EnvVar: "SHOW_HALP,HALPPLZ", + } + + cli.NewApp().Run(os.Args) +} +``` + +### Version Flag + +The default version flag (`-v/--version`) is defined as `cli.VersionFlag`, which +is checked by the cli internals in order to print the `App.Version` via +`cli.VersionPrinter` and break execution. + +#### Customization + +The default flag may be customized to something other than `-v/--version` by +setting `cli.VersionFlag`, e.g.: + + +``` go +package main + +import ( + "os" + + "github.com/urfave/cli" +) + +func main() { + cli.VersionFlag = cli.BoolFlag{ + Name: "print-version, V", + Usage: "print only the version", + } + + app := cli.NewApp() + app.Name = "partay" + app.Version = "19.99.0" + app.Run(os.Args) +} +``` + +Alternatively, the version printer at `cli.VersionPrinter` may be overridden, e.g.: + + +``` go +package main + +import ( + "fmt" + "os" + + "github.com/urfave/cli" +) + +var ( + Revision = "fafafaf" +) + +func main() { + cli.VersionPrinter = func(c *cli.Context) { + fmt.Printf("version=%s revision=%s\n", c.App.Version, Revision) + } + + app := cli.NewApp() + app.Name = "partay" + app.Version = "19.99.0" + app.Run(os.Args) +} +``` + +#### Full API Example + +**Notice**: This is a contrived (functioning) example meant strictly for API +demonstration purposes. Use of one's imagination is encouraged. + + +``` go +package main + +import ( + "errors" + "flag" + "fmt" + "io" + "io/ioutil" + "os" + "time" + + "github.com/urfave/cli" +) + +func init() { + cli.AppHelpTemplate += "\nCUSTOMIZED: you bet ur muffins\n" + cli.CommandHelpTemplate += "\nYMMV\n" + cli.SubcommandHelpTemplate += "\nor something\n" + + cli.HelpFlag = cli.BoolFlag{Name: "halp"} + cli.BashCompletionFlag = cli.BoolFlag{Name: "compgen", Hidden: true} + cli.VersionFlag = cli.BoolFlag{Name: "print-version, V"} + + cli.HelpPrinter = func(w io.Writer, templ string, data interface{}) { + fmt.Fprintf(w, "best of luck to you\n") + } + cli.VersionPrinter = func(c *cli.Context) { + fmt.Fprintf(c.App.Writer, "version=%s\n", c.App.Version) + } + cli.OsExiter = func(c int) { + fmt.Fprintf(cli.ErrWriter, "refusing to exit %d\n", c) + } + cli.ErrWriter = ioutil.Discard + cli.FlagStringer = func(fl cli.Flag) string { + return fmt.Sprintf("\t\t%s", fl.GetName()) + } +} + +type hexWriter struct{} + +func (w *hexWriter) Write(p []byte) (int, error) { + for _, b := range p { + fmt.Printf("%x", b) + } + fmt.Printf("\n") + + return len(p), nil +} + +type genericType struct{ + s string +} + +func (g *genericType) Set(value string) error { + g.s = value + return nil +} + +func (g *genericType) String() string { + return g.s +} + +func main() { + app := cli.NewApp() + app.Name = "kənˈtrīv" + app.Version = "19.99.0" + app.Compiled = time.Now() + app.Authors = []cli.Author{ + cli.Author{ + Name: "Example Human", + Email: "human@example.com", + }, + } + app.Copyright = "(c) 1999 Serious Enterprise" + app.HelpName = "contrive" + app.Usage = "demonstrate available API" + app.UsageText = "contrive - demonstrating the available API" + app.ArgsUsage = "[args and such]" + app.Commands = []cli.Command{ + cli.Command{ + Name: "doo", + Aliases: []string{"do"}, + Category: "motion", + Usage: "do the doo", + UsageText: "doo - does the dooing", + Description: "no really, there is a lot of dooing to be done", + ArgsUsage: "[arrgh]", + Flags: []cli.Flag{ + cli.BoolFlag{Name: "forever, forevvarr"}, + }, + Subcommands: cli.Commands{ + cli.Command{ + Name: "wop", + Action: wopAction, + }, + }, + SkipFlagParsing: false, + HideHelp: false, + Hidden: false, + HelpName: "doo!", + BashComplete: func(c *cli.Context) { + fmt.Fprintf(c.App.Writer, "--better\n") + }, + Before: func(c *cli.Context) error { + fmt.Fprintf(c.App.Writer, "brace for impact\n") + return nil + }, + After: func(c *cli.Context) error { + fmt.Fprintf(c.App.Writer, "did we lose anyone?\n") + return nil + }, + Action: func(c *cli.Context) error { + c.Command.FullName() + c.Command.HasName("wop") + c.Command.Names() + c.Command.VisibleFlags() + fmt.Fprintf(c.App.Writer, "dodododododoodododddooooododododooo\n") + if c.Bool("forever") { + c.Command.Run(c) + } + return nil + }, + OnUsageError: func(c *cli.Context, err error, isSubcommand bool) error { + fmt.Fprintf(c.App.Writer, "for shame\n") + return err + }, + }, + } + app.Flags = []cli.Flag{ + cli.BoolFlag{Name: "fancy"}, + cli.BoolTFlag{Name: "fancier"}, + cli.DurationFlag{Name: "howlong, H", Value: time.Second * 3}, + cli.Float64Flag{Name: "howmuch"}, + cli.GenericFlag{Name: "wat", Value: &genericType{}}, + cli.Int64Flag{Name: "longdistance"}, + cli.Int64SliceFlag{Name: "intervals"}, + cli.IntFlag{Name: "distance"}, + cli.IntSliceFlag{Name: "times"}, + cli.StringFlag{Name: "dance-move, d"}, + cli.StringSliceFlag{Name: "names, N"}, + cli.UintFlag{Name: "age"}, + cli.Uint64Flag{Name: "bigage"}, + } + app.EnableBashCompletion = true + app.HideHelp = false + app.HideVersion = false + app.BashComplete = func(c *cli.Context) { + fmt.Fprintf(c.App.Writer, "lipstick\nkiss\nme\nlipstick\nringo\n") + } + app.Before = func(c *cli.Context) error { + fmt.Fprintf(c.App.Writer, "HEEEERE GOES\n") + return nil + } + app.After = func(c *cli.Context) error { + fmt.Fprintf(c.App.Writer, "Phew!\n") + return nil + } + app.CommandNotFound = func(c *cli.Context, command string) { + fmt.Fprintf(c.App.Writer, "Thar be no %q here.\n", command) + } + app.OnUsageError = func(c *cli.Context, err error, isSubcommand bool) error { + if isSubcommand { + return err + } + + fmt.Fprintf(c.App.Writer, "WRONG: %#v\n", err) + return nil + } + app.Action = func(c *cli.Context) error { + cli.DefaultAppComplete(c) + cli.HandleExitCoder(errors.New("not an exit coder, though")) + cli.ShowAppHelp(c) + cli.ShowCommandCompletions(c, "nope") + cli.ShowCommandHelp(c, "also-nope") + cli.ShowCompletions(c) + cli.ShowSubcommandHelp(c) + cli.ShowVersion(c) + + categories := c.App.Categories() + categories.AddCommand("sounds", cli.Command{ + Name: "bloop", + }) + + for _, category := range c.App.Categories() { + fmt.Fprintf(c.App.Writer, "%s\n", category.Name) + fmt.Fprintf(c.App.Writer, "%#v\n", category.Commands) + fmt.Fprintf(c.App.Writer, "%#v\n", category.VisibleCommands()) + } + + fmt.Printf("%#v\n", c.App.Command("doo")) + if c.Bool("infinite") { + c.App.Run([]string{"app", "doo", "wop"}) + } + + if c.Bool("forevar") { + c.App.RunAsSubcommand(c) + } + c.App.Setup() + fmt.Printf("%#v\n", c.App.VisibleCategories()) + fmt.Printf("%#v\n", c.App.VisibleCommands()) + fmt.Printf("%#v\n", c.App.VisibleFlags()) + + fmt.Printf("%#v\n", c.Args().First()) + if len(c.Args()) > 0 { + fmt.Printf("%#v\n", c.Args()[1]) + } + fmt.Printf("%#v\n", c.Args().Present()) + fmt.Printf("%#v\n", c.Args().Tail()) + + set := flag.NewFlagSet("contrive", 0) + nc := cli.NewContext(c.App, set, c) + + fmt.Printf("%#v\n", nc.Args()) + fmt.Printf("%#v\n", nc.Bool("nope")) + fmt.Printf("%#v\n", nc.BoolT("nerp")) + fmt.Printf("%#v\n", nc.Duration("howlong")) + fmt.Printf("%#v\n", nc.Float64("hay")) + fmt.Printf("%#v\n", nc.Generic("bloop")) + fmt.Printf("%#v\n", nc.Int64("bonk")) + fmt.Printf("%#v\n", nc.Int64Slice("burnks")) + fmt.Printf("%#v\n", nc.Int("bips")) + fmt.Printf("%#v\n", nc.IntSlice("blups")) + fmt.Printf("%#v\n", nc.String("snurt")) + fmt.Printf("%#v\n", nc.StringSlice("snurkles")) + fmt.Printf("%#v\n", nc.Uint("flub")) + fmt.Printf("%#v\n", nc.Uint64("florb")) + fmt.Printf("%#v\n", nc.GlobalBool("global-nope")) + fmt.Printf("%#v\n", nc.GlobalBoolT("global-nerp")) + fmt.Printf("%#v\n", nc.GlobalDuration("global-howlong")) + fmt.Printf("%#v\n", nc.GlobalFloat64("global-hay")) + fmt.Printf("%#v\n", nc.GlobalGeneric("global-bloop")) + fmt.Printf("%#v\n", nc.GlobalInt("global-bips")) + fmt.Printf("%#v\n", nc.GlobalIntSlice("global-blups")) + fmt.Printf("%#v\n", nc.GlobalString("global-snurt")) + fmt.Printf("%#v\n", nc.GlobalStringSlice("global-snurkles")) + + fmt.Printf("%#v\n", nc.FlagNames()) + fmt.Printf("%#v\n", nc.GlobalFlagNames()) + fmt.Printf("%#v\n", nc.GlobalIsSet("wat")) + fmt.Printf("%#v\n", nc.GlobalSet("wat", "nope")) + fmt.Printf("%#v\n", nc.NArg()) + fmt.Printf("%#v\n", nc.NumFlags()) + fmt.Printf("%#v\n", nc.Parent()) + + nc.Set("wat", "also-nope") + + ec := cli.NewExitError("ohwell", 86) + fmt.Fprintf(c.App.Writer, "%d", ec.ExitCode()) + fmt.Printf("made it!\n") + return ec + } + + if os.Getenv("HEXY") != "" { + app.Writer = &hexWriter{} + app.ErrWriter = &hexWriter{} + } + + app.Metadata = map[string]interface{}{ + "layers": "many", + "explicable": false, + "whatever-values": 19.99, + } + + app.Run(os.Args) +} + +func wopAction(c *cli.Context) error { + fmt.Fprintf(c.App.Writer, ":wave: over here, eh\n") + return nil +} +``` + +## Contribution Guidelines + +Feel free to put up a pull request to fix a bug or maybe add a feature. I will +give it a code review and make sure that it does not break backwards +compatibility. If I or any other collaborators agree that it is in line with +the vision of the project, we will work with you to get the code into +a mergeable state and merge it into the master branch. + +If you have contributed something significant to the project, we will most +likely add you as a collaborator. As a collaborator you are given the ability +to merge others pull requests. It is very important that new code does not +break existing code, so be careful about what code you do choose to merge. + +If you feel like you have contributed to the project but have not yet been +added as a collaborator, we probably forgot to add you, please open an issue. diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/app.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/app.go new file mode 100644 index 00000000..51fc45d8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/app.go @@ -0,0 +1,497 @@ +package cli + +import ( + "fmt" + "io" + "io/ioutil" + "os" + "path/filepath" + "sort" + "time" +) + +var ( + changeLogURL = "https://github.com/urfave/cli/blob/master/CHANGELOG.md" + appActionDeprecationURL = fmt.Sprintf("%s#deprecated-cli-app-action-signature", changeLogURL) + runAndExitOnErrorDeprecationURL = fmt.Sprintf("%s#deprecated-cli-app-runandexitonerror", changeLogURL) + + contactSysadmin = "This is an error in the application. Please contact the distributor of this application if this is not you." + + errInvalidActionType = NewExitError("ERROR invalid Action type. "+ + fmt.Sprintf("Must be `func(*Context`)` or `func(*Context) error). %s", contactSysadmin)+ + fmt.Sprintf("See %s", appActionDeprecationURL), 2) +) + +// App is the main structure of a cli application. It is recommended that +// an app be created with the cli.NewApp() function +type App struct { + // The name of the program. Defaults to path.Base(os.Args[0]) + Name string + // Full name of command for help, defaults to Name + HelpName string + // Description of the program. + Usage string + // Text to override the USAGE section of help + UsageText string + // Description of the program argument format. + ArgsUsage string + // Version of the program + Version string + // Description of the program + Description string + // List of commands to execute + Commands []Command + // List of flags to parse + Flags []Flag + // Boolean to enable bash completion commands + EnableBashCompletion bool + // Boolean to hide built-in help command + HideHelp bool + // Boolean to hide built-in version flag and the VERSION section of help + HideVersion bool + // Populate on app startup, only gettable through method Categories() + categories CommandCategories + // An action to execute when the bash-completion flag is set + BashComplete BashCompleteFunc + // An action to execute before any subcommands are run, but after the context is ready + // If a non-nil error is returned, no subcommands are run + Before BeforeFunc + // An action to execute after any subcommands are run, but after the subcommand has finished + // It is run even if Action() panics + After AfterFunc + + // The action to execute when no subcommands are specified + // Expects a `cli.ActionFunc` but will accept the *deprecated* signature of `func(*cli.Context) {}` + // *Note*: support for the deprecated `Action` signature will be removed in a future version + Action interface{} + + // Execute this function if the proper command cannot be found + CommandNotFound CommandNotFoundFunc + // Execute this function if an usage error occurs + OnUsageError OnUsageErrorFunc + // Compilation date + Compiled time.Time + // List of all authors who contributed + Authors []Author + // Copyright of the binary if any + Copyright string + // Name of Author (Note: Use App.Authors, this is deprecated) + Author string + // Email of Author (Note: Use App.Authors, this is deprecated) + Email string + // Writer writer to write output to + Writer io.Writer + // ErrWriter writes error output + ErrWriter io.Writer + // Other custom info + Metadata map[string]interface{} + // Carries a function which returns app specific info. + ExtraInfo func() map[string]string + // CustomAppHelpTemplate the text template for app help topic. + // cli.go uses text/template to render templates. You can + // render custom help text by setting this variable. + CustomAppHelpTemplate string + + didSetup bool +} + +// Tries to find out when this binary was compiled. +// Returns the current time if it fails to find it. +func compileTime() time.Time { + info, err := os.Stat(os.Args[0]) + if err != nil { + return time.Now() + } + return info.ModTime() +} + +// NewApp creates a new cli Application with some reasonable defaults for Name, +// Usage, Version and Action. +func NewApp() *App { + return &App{ + Name: filepath.Base(os.Args[0]), + HelpName: filepath.Base(os.Args[0]), + Usage: "A new cli application", + UsageText: "", + Version: "0.0.0", + BashComplete: DefaultAppComplete, + Action: helpCommand.Action, + Compiled: compileTime(), + Writer: os.Stdout, + } +} + +// Setup runs initialization code to ensure all data structures are ready for +// `Run` or inspection prior to `Run`. It is internally called by `Run`, but +// will return early if setup has already happened. +func (a *App) Setup() { + if a.didSetup { + return + } + + a.didSetup = true + + if a.Author != "" || a.Email != "" { + a.Authors = append(a.Authors, Author{Name: a.Author, Email: a.Email}) + } + + newCmds := []Command{} + for _, c := range a.Commands { + if c.HelpName == "" { + c.HelpName = fmt.Sprintf("%s %s", a.HelpName, c.Name) + } + newCmds = append(newCmds, c) + } + a.Commands = newCmds + + if a.Command(helpCommand.Name) == nil && !a.HideHelp { + a.Commands = append(a.Commands, helpCommand) + if (HelpFlag != BoolFlag{}) { + a.appendFlag(HelpFlag) + } + } + + if !a.HideVersion { + a.appendFlag(VersionFlag) + } + + a.categories = CommandCategories{} + for _, command := range a.Commands { + a.categories = a.categories.AddCommand(command.Category, command) + } + sort.Sort(a.categories) + + if a.Metadata == nil { + a.Metadata = make(map[string]interface{}) + } + + if a.Writer == nil { + a.Writer = os.Stdout + } +} + +// Run is the entry point to the cli app. Parses the arguments slice and routes +// to the proper flag/args combination +func (a *App) Run(arguments []string) (err error) { + a.Setup() + + // handle the completion flag separately from the flagset since + // completion could be attempted after a flag, but before its value was put + // on the command line. this causes the flagset to interpret the completion + // flag name as the value of the flag before it which is undesirable + // note that we can only do this because the shell autocomplete function + // always appends the completion flag at the end of the command + shellComplete, arguments := checkShellCompleteFlag(a, arguments) + + // parse flags + set, err := flagSet(a.Name, a.Flags) + if err != nil { + return err + } + + set.SetOutput(ioutil.Discard) + err = set.Parse(arguments[1:]) + nerr := normalizeFlags(a.Flags, set) + context := NewContext(a, set, nil) + if nerr != nil { + fmt.Fprintln(a.Writer, nerr) + ShowAppHelp(context) + return nerr + } + context.shellComplete = shellComplete + + if checkCompletions(context) { + return nil + } + + if err != nil { + if a.OnUsageError != nil { + err := a.OnUsageError(context, err, false) + HandleExitCoder(err) + return err + } + fmt.Fprintf(a.Writer, "%s %s\n\n", "Incorrect Usage.", err.Error()) + ShowAppHelp(context) + return err + } + + if !a.HideHelp && checkHelp(context) { + ShowAppHelp(context) + return nil + } + + if !a.HideVersion && checkVersion(context) { + ShowVersion(context) + return nil + } + + if a.After != nil { + defer func() { + if afterErr := a.After(context); afterErr != nil { + if err != nil { + err = NewMultiError(err, afterErr) + } else { + err = afterErr + } + } + }() + } + + if a.Before != nil { + beforeErr := a.Before(context) + if beforeErr != nil { + ShowAppHelp(context) + HandleExitCoder(beforeErr) + err = beforeErr + return err + } + } + + args := context.Args() + if args.Present() { + name := args.First() + c := a.Command(name) + if c != nil { + return c.Run(context) + } + } + + if a.Action == nil { + a.Action = helpCommand.Action + } + + // Run default Action + err = HandleAction(a.Action, context) + + HandleExitCoder(err) + return err +} + +// RunAndExitOnError calls .Run() and exits non-zero if an error was returned +// +// Deprecated: instead you should return an error that fulfills cli.ExitCoder +// to cli.App.Run. This will cause the application to exit with the given eror +// code in the cli.ExitCoder +func (a *App) RunAndExitOnError() { + if err := a.Run(os.Args); err != nil { + fmt.Fprintln(a.errWriter(), err) + OsExiter(1) + } +} + +// RunAsSubcommand invokes the subcommand given the context, parses ctx.Args() to +// generate command-specific flags +func (a *App) RunAsSubcommand(ctx *Context) (err error) { + // append help to commands + if len(a.Commands) > 0 { + if a.Command(helpCommand.Name) == nil && !a.HideHelp { + a.Commands = append(a.Commands, helpCommand) + if (HelpFlag != BoolFlag{}) { + a.appendFlag(HelpFlag) + } + } + } + + newCmds := []Command{} + for _, c := range a.Commands { + if c.HelpName == "" { + c.HelpName = fmt.Sprintf("%s %s", a.HelpName, c.Name) + } + newCmds = append(newCmds, c) + } + a.Commands = newCmds + + // parse flags + set, err := flagSet(a.Name, a.Flags) + if err != nil { + return err + } + + set.SetOutput(ioutil.Discard) + err = set.Parse(ctx.Args().Tail()) + nerr := normalizeFlags(a.Flags, set) + context := NewContext(a, set, ctx) + + if nerr != nil { + fmt.Fprintln(a.Writer, nerr) + fmt.Fprintln(a.Writer) + if len(a.Commands) > 0 { + ShowSubcommandHelp(context) + } else { + ShowCommandHelp(ctx, context.Args().First()) + } + return nerr + } + + if checkCompletions(context) { + return nil + } + + if err != nil { + if a.OnUsageError != nil { + err = a.OnUsageError(context, err, true) + HandleExitCoder(err) + return err + } + fmt.Fprintf(a.Writer, "%s %s\n\n", "Incorrect Usage.", err.Error()) + ShowSubcommandHelp(context) + return err + } + + if len(a.Commands) > 0 { + if checkSubcommandHelp(context) { + return nil + } + } else { + if checkCommandHelp(ctx, context.Args().First()) { + return nil + } + } + + if a.After != nil { + defer func() { + afterErr := a.After(context) + if afterErr != nil { + HandleExitCoder(err) + if err != nil { + err = NewMultiError(err, afterErr) + } else { + err = afterErr + } + } + }() + } + + if a.Before != nil { + beforeErr := a.Before(context) + if beforeErr != nil { + HandleExitCoder(beforeErr) + err = beforeErr + return err + } + } + + args := context.Args() + if args.Present() { + name := args.First() + c := a.Command(name) + if c != nil { + return c.Run(context) + } + } + + // Run default Action + err = HandleAction(a.Action, context) + + HandleExitCoder(err) + return err +} + +// Command returns the named command on App. Returns nil if the command does not exist +func (a *App) Command(name string) *Command { + for _, c := range a.Commands { + if c.HasName(name) { + return &c + } + } + + return nil +} + +// Categories returns a slice containing all the categories with the commands they contain +func (a *App) Categories() CommandCategories { + return a.categories +} + +// VisibleCategories returns a slice of categories and commands that are +// Hidden=false +func (a *App) VisibleCategories() []*CommandCategory { + ret := []*CommandCategory{} + for _, category := range a.categories { + if visible := func() *CommandCategory { + for _, command := range category.Commands { + if !command.Hidden { + return category + } + } + return nil + }(); visible != nil { + ret = append(ret, visible) + } + } + return ret +} + +// VisibleCommands returns a slice of the Commands with Hidden=false +func (a *App) VisibleCommands() []Command { + ret := []Command{} + for _, command := range a.Commands { + if !command.Hidden { + ret = append(ret, command) + } + } + return ret +} + +// VisibleFlags returns a slice of the Flags with Hidden=false +func (a *App) VisibleFlags() []Flag { + return visibleFlags(a.Flags) +} + +func (a *App) hasFlag(flag Flag) bool { + for _, f := range a.Flags { + if flag == f { + return true + } + } + + return false +} + +func (a *App) errWriter() io.Writer { + + // When the app ErrWriter is nil use the package level one. + if a.ErrWriter == nil { + return ErrWriter + } + + return a.ErrWriter +} + +func (a *App) appendFlag(flag Flag) { + if !a.hasFlag(flag) { + a.Flags = append(a.Flags, flag) + } +} + +// Author represents someone who has contributed to a cli project. +type Author struct { + Name string // The Authors name + Email string // The Authors email +} + +// String makes Author comply to the Stringer interface, to allow an easy print in the templating process +func (a Author) String() string { + e := "" + if a.Email != "" { + e = " <" + a.Email + ">" + } + + return fmt.Sprintf("%v%v", a.Name, e) +} + +// HandleAction attempts to figure out which Action signature was used. If +// it's an ActionFunc or a func with the legacy signature for Action, the func +// is run! +func HandleAction(action interface{}, context *Context) (err error) { + if a, ok := action.(ActionFunc); ok { + return a(context) + } else if a, ok := action.(func(*Context) error); ok { + return a(context) + } else if a, ok := action.(func(*Context)); ok { // deprecated function signature + a(context) + return nil + } else { + return errInvalidActionType + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/appveyor.yml b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/appveyor.yml new file mode 100644 index 00000000..1e1489c3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/appveyor.yml @@ -0,0 +1,26 @@ +version: "{build}" + +os: Windows Server 2016 + +image: Visual Studio 2017 + +clone_folder: c:\gopath\src\github.com\urfave\cli + +environment: + GOPATH: C:\gopath + GOVERSION: 1.8.x + PYTHON: C:\Python36-x64 + PYTHON_VERSION: 3.6.x + PYTHON_ARCH: 64 + +install: +- set PATH=%GOPATH%\bin;C:\go\bin;%PATH% +- go version +- go env +- go get github.com/urfave/gfmrun/... +- go get -v -t ./... + +build_script: +- python runtests vet +- python runtests test +- python runtests gfmrun diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/category.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/category.go new file mode 100644 index 00000000..1a605502 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/category.go @@ -0,0 +1,44 @@ +package cli + +// CommandCategories is a slice of *CommandCategory. +type CommandCategories []*CommandCategory + +// CommandCategory is a category containing commands. +type CommandCategory struct { + Name string + Commands Commands +} + +func (c CommandCategories) Less(i, j int) bool { + return c[i].Name < c[j].Name +} + +func (c CommandCategories) Len() int { + return len(c) +} + +func (c CommandCategories) Swap(i, j int) { + c[i], c[j] = c[j], c[i] +} + +// AddCommand adds a command to a category. +func (c CommandCategories) AddCommand(category string, command Command) CommandCategories { + for _, commandCategory := range c { + if commandCategory.Name == category { + commandCategory.Commands = append(commandCategory.Commands, command) + return c + } + } + return append(c, &CommandCategory{Name: category, Commands: []Command{command}}) +} + +// VisibleCommands returns a slice of the Commands with Hidden=false +func (c *CommandCategory) VisibleCommands() []Command { + ret := []Command{} + for _, command := range c.Commands { + if !command.Hidden { + ret = append(ret, command) + } + } + return ret +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/cli.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/cli.go new file mode 100644 index 00000000..90c07eb8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/cli.go @@ -0,0 +1,22 @@ +// Package cli provides a minimal framework for creating and organizing command line +// Go applications. cli is designed to be easy to understand and write, the most simple +// cli application can be written as follows: +// func main() { +// cli.NewApp().Run(os.Args) +// } +// +// Of course this application does not do much, so let's make this an actual application: +// func main() { +// app := cli.NewApp() +// app.Name = "greet" +// app.Usage = "say a greeting" +// app.Action = func(c *cli.Context) error { +// println("Greetings") +// return nil +// } +// +// app.Run(os.Args) +// } +package cli + +//go:generate python ./generate-flag-types cli -i flag-types.json -o flag_generated.go diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/command.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/command.go new file mode 100644 index 00000000..23de2944 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/command.go @@ -0,0 +1,304 @@ +package cli + +import ( + "fmt" + "io/ioutil" + "sort" + "strings" +) + +// Command is a subcommand for a cli.App. +type Command struct { + // The name of the command + Name string + // short name of the command. Typically one character (deprecated, use `Aliases`) + ShortName string + // A list of aliases for the command + Aliases []string + // A short description of the usage of this command + Usage string + // Custom text to show on USAGE section of help + UsageText string + // A longer explanation of how the command works + Description string + // A short description of the arguments of this command + ArgsUsage string + // The category the command is part of + Category string + // The function to call when checking for bash command completions + BashComplete BashCompleteFunc + // An action to execute before any sub-subcommands are run, but after the context is ready + // If a non-nil error is returned, no sub-subcommands are run + Before BeforeFunc + // An action to execute after any subcommands are run, but after the subcommand has finished + // It is run even if Action() panics + After AfterFunc + // The function to call when this command is invoked + Action interface{} + // TODO: replace `Action: interface{}` with `Action: ActionFunc` once some kind + // of deprecation period has passed, maybe? + + // Execute this function if a usage error occurs. + OnUsageError OnUsageErrorFunc + // List of child commands + Subcommands Commands + // List of flags to parse + Flags []Flag + // Treat all flags as normal arguments if true + SkipFlagParsing bool + // Skip argument reordering which attempts to move flags before arguments, + // but only works if all flags appear after all arguments. This behavior was + // removed n version 2 since it only works under specific conditions so we + // backport here by exposing it as an option for compatibility. + SkipArgReorder bool + // Boolean to hide built-in help command + HideHelp bool + // Boolean to hide this command from help or completion + Hidden bool + + // Full name of command for help, defaults to full command name, including parent commands. + HelpName string + commandNamePath []string + + // CustomHelpTemplate the text template for the command help topic. + // cli.go uses text/template to render templates. You can + // render custom help text by setting this variable. + CustomHelpTemplate string +} + +type CommandsByName []Command + +func (c CommandsByName) Len() int { + return len(c) +} + +func (c CommandsByName) Less(i, j int) bool { + return c[i].Name < c[j].Name +} + +func (c CommandsByName) Swap(i, j int) { + c[i], c[j] = c[j], c[i] +} + +// FullName returns the full name of the command. +// For subcommands this ensures that parent commands are part of the command path +func (c Command) FullName() string { + if c.commandNamePath == nil { + return c.Name + } + return strings.Join(c.commandNamePath, " ") +} + +// Commands is a slice of Command +type Commands []Command + +// Run invokes the command given the context, parses ctx.Args() to generate command-specific flags +func (c Command) Run(ctx *Context) (err error) { + if len(c.Subcommands) > 0 { + return c.startApp(ctx) + } + + if !c.HideHelp && (HelpFlag != BoolFlag{}) { + // append help to flags + c.Flags = append( + c.Flags, + HelpFlag, + ) + } + + set, err := flagSet(c.Name, c.Flags) + if err != nil { + return err + } + set.SetOutput(ioutil.Discard) + + if c.SkipFlagParsing { + err = set.Parse(append([]string{"--"}, ctx.Args().Tail()...)) + } else if !c.SkipArgReorder { + firstFlagIndex := -1 + terminatorIndex := -1 + for index, arg := range ctx.Args() { + if arg == "--" { + terminatorIndex = index + break + } else if arg == "-" { + // Do nothing. A dash alone is not really a flag. + continue + } else if strings.HasPrefix(arg, "-") && firstFlagIndex == -1 { + firstFlagIndex = index + } + } + + if firstFlagIndex > -1 { + args := ctx.Args() + regularArgs := make([]string, len(args[1:firstFlagIndex])) + copy(regularArgs, args[1:firstFlagIndex]) + + var flagArgs []string + if terminatorIndex > -1 { + flagArgs = args[firstFlagIndex:terminatorIndex] + regularArgs = append(regularArgs, args[terminatorIndex:]...) + } else { + flagArgs = args[firstFlagIndex:] + } + + err = set.Parse(append(flagArgs, regularArgs...)) + } else { + err = set.Parse(ctx.Args().Tail()) + } + } else { + err = set.Parse(ctx.Args().Tail()) + } + + nerr := normalizeFlags(c.Flags, set) + if nerr != nil { + fmt.Fprintln(ctx.App.Writer, nerr) + fmt.Fprintln(ctx.App.Writer) + ShowCommandHelp(ctx, c.Name) + return nerr + } + + context := NewContext(ctx.App, set, ctx) + context.Command = c + if checkCommandCompletions(context, c.Name) { + return nil + } + + if err != nil { + if c.OnUsageError != nil { + err := c.OnUsageError(context, err, false) + HandleExitCoder(err) + return err + } + fmt.Fprintln(context.App.Writer, "Incorrect Usage:", err.Error()) + fmt.Fprintln(context.App.Writer) + ShowCommandHelp(context, c.Name) + return err + } + + if checkCommandHelp(context, c.Name) { + return nil + } + + if c.After != nil { + defer func() { + afterErr := c.After(context) + if afterErr != nil { + HandleExitCoder(err) + if err != nil { + err = NewMultiError(err, afterErr) + } else { + err = afterErr + } + } + }() + } + + if c.Before != nil { + err = c.Before(context) + if err != nil { + ShowCommandHelp(context, c.Name) + HandleExitCoder(err) + return err + } + } + + if c.Action == nil { + c.Action = helpSubcommand.Action + } + + err = HandleAction(c.Action, context) + + if err != nil { + HandleExitCoder(err) + } + return err +} + +// Names returns the names including short names and aliases. +func (c Command) Names() []string { + names := []string{c.Name} + + if c.ShortName != "" { + names = append(names, c.ShortName) + } + + return append(names, c.Aliases...) +} + +// HasName returns true if Command.Name or Command.ShortName matches given name +func (c Command) HasName(name string) bool { + for _, n := range c.Names() { + if n == name { + return true + } + } + return false +} + +func (c Command) startApp(ctx *Context) error { + app := NewApp() + app.Metadata = ctx.App.Metadata + // set the name and usage + app.Name = fmt.Sprintf("%s %s", ctx.App.Name, c.Name) + if c.HelpName == "" { + app.HelpName = c.HelpName + } else { + app.HelpName = app.Name + } + + app.Usage = c.Usage + app.Description = c.Description + app.ArgsUsage = c.ArgsUsage + + // set CommandNotFound + app.CommandNotFound = ctx.App.CommandNotFound + app.CustomAppHelpTemplate = c.CustomHelpTemplate + + // set the flags and commands + app.Commands = c.Subcommands + app.Flags = c.Flags + app.HideHelp = c.HideHelp + + app.Version = ctx.App.Version + app.HideVersion = ctx.App.HideVersion + app.Compiled = ctx.App.Compiled + app.Author = ctx.App.Author + app.Email = ctx.App.Email + app.Writer = ctx.App.Writer + app.ErrWriter = ctx.App.ErrWriter + + app.categories = CommandCategories{} + for _, command := range c.Subcommands { + app.categories = app.categories.AddCommand(command.Category, command) + } + + sort.Sort(app.categories) + + // bash completion + app.EnableBashCompletion = ctx.App.EnableBashCompletion + if c.BashComplete != nil { + app.BashComplete = c.BashComplete + } + + // set the actions + app.Before = c.Before + app.After = c.After + if c.Action != nil { + app.Action = c.Action + } else { + app.Action = helpSubcommand.Action + } + app.OnUsageError = c.OnUsageError + + for index, cc := range app.Commands { + app.Commands[index].commandNamePath = []string{c.Name, cc.Name} + } + + return app.RunAsSubcommand(ctx) +} + +// VisibleFlags returns a slice of the Flags with Hidden=false +func (c Command) VisibleFlags() []Flag { + return visibleFlags(c.Flags) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/context.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/context.go new file mode 100644 index 00000000..db94191e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/context.go @@ -0,0 +1,278 @@ +package cli + +import ( + "errors" + "flag" + "reflect" + "strings" + "syscall" +) + +// Context is a type that is passed through to +// each Handler action in a cli application. Context +// can be used to retrieve context-specific Args and +// parsed command-line options. +type Context struct { + App *App + Command Command + shellComplete bool + flagSet *flag.FlagSet + setFlags map[string]bool + parentContext *Context +} + +// NewContext creates a new context. For use in when invoking an App or Command action. +func NewContext(app *App, set *flag.FlagSet, parentCtx *Context) *Context { + c := &Context{App: app, flagSet: set, parentContext: parentCtx} + + if parentCtx != nil { + c.shellComplete = parentCtx.shellComplete + } + + return c +} + +// NumFlags returns the number of flags set +func (c *Context) NumFlags() int { + return c.flagSet.NFlag() +} + +// Set sets a context flag to a value. +func (c *Context) Set(name, value string) error { + c.setFlags = nil + return c.flagSet.Set(name, value) +} + +// GlobalSet sets a context flag to a value on the global flagset +func (c *Context) GlobalSet(name, value string) error { + globalContext(c).setFlags = nil + return globalContext(c).flagSet.Set(name, value) +} + +// IsSet determines if the flag was actually set +func (c *Context) IsSet(name string) bool { + if c.setFlags == nil { + c.setFlags = make(map[string]bool) + + c.flagSet.Visit(func(f *flag.Flag) { + c.setFlags[f.Name] = true + }) + + c.flagSet.VisitAll(func(f *flag.Flag) { + if _, ok := c.setFlags[f.Name]; ok { + return + } + c.setFlags[f.Name] = false + }) + + // XXX hack to support IsSet for flags with EnvVar + // + // There isn't an easy way to do this with the current implementation since + // whether a flag was set via an environment variable is very difficult to + // determine here. Instead, we intend to introduce a backwards incompatible + // change in version 2 to add `IsSet` to the Flag interface to push the + // responsibility closer to where the information required to determine + // whether a flag is set by non-standard means such as environment + // variables is avaliable. + // + // See https://github.com/urfave/cli/issues/294 for additional discussion + flags := c.Command.Flags + if c.Command.Name == "" { // cannot == Command{} since it contains slice types + if c.App != nil { + flags = c.App.Flags + } + } + for _, f := range flags { + eachName(f.GetName(), func(name string) { + if isSet, ok := c.setFlags[name]; isSet || !ok { + return + } + + val := reflect.ValueOf(f) + if val.Kind() == reflect.Ptr { + val = val.Elem() + } + + envVarValue := val.FieldByName("EnvVar") + if !envVarValue.IsValid() { + return + } + + eachName(envVarValue.String(), func(envVar string) { + envVar = strings.TrimSpace(envVar) + if _, ok := syscall.Getenv(envVar); ok { + c.setFlags[name] = true + return + } + }) + }) + } + } + + return c.setFlags[name] +} + +// GlobalIsSet determines if the global flag was actually set +func (c *Context) GlobalIsSet(name string) bool { + ctx := c + if ctx.parentContext != nil { + ctx = ctx.parentContext + } + + for ; ctx != nil; ctx = ctx.parentContext { + if ctx.IsSet(name) { + return true + } + } + return false +} + +// FlagNames returns a slice of flag names used in this context. +func (c *Context) FlagNames() (names []string) { + for _, flag := range c.Command.Flags { + name := strings.Split(flag.GetName(), ",")[0] + if name == "help" { + continue + } + names = append(names, name) + } + return +} + +// GlobalFlagNames returns a slice of global flag names used by the app. +func (c *Context) GlobalFlagNames() (names []string) { + for _, flag := range c.App.Flags { + name := strings.Split(flag.GetName(), ",")[0] + if name == "help" || name == "version" { + continue + } + names = append(names, name) + } + return +} + +// Parent returns the parent context, if any +func (c *Context) Parent() *Context { + return c.parentContext +} + +// value returns the value of the flag coressponding to `name` +func (c *Context) value(name string) interface{} { + return c.flagSet.Lookup(name).Value.(flag.Getter).Get() +} + +// Args contains apps console arguments +type Args []string + +// Args returns the command line arguments associated with the context. +func (c *Context) Args() Args { + args := Args(c.flagSet.Args()) + return args +} + +// NArg returns the number of the command line arguments. +func (c *Context) NArg() int { + return len(c.Args()) +} + +// Get returns the nth argument, or else a blank string +func (a Args) Get(n int) string { + if len(a) > n { + return a[n] + } + return "" +} + +// First returns the first argument, or else a blank string +func (a Args) First() string { + return a.Get(0) +} + +// Tail returns the rest of the arguments (not the first one) +// or else an empty string slice +func (a Args) Tail() []string { + if len(a) >= 2 { + return []string(a)[1:] + } + return []string{} +} + +// Present checks if there are any arguments present +func (a Args) Present() bool { + return len(a) != 0 +} + +// Swap swaps arguments at the given indexes +func (a Args) Swap(from, to int) error { + if from >= len(a) || to >= len(a) { + return errors.New("index out of range") + } + a[from], a[to] = a[to], a[from] + return nil +} + +func globalContext(ctx *Context) *Context { + if ctx == nil { + return nil + } + + for { + if ctx.parentContext == nil { + return ctx + } + ctx = ctx.parentContext + } +} + +func lookupGlobalFlagSet(name string, ctx *Context) *flag.FlagSet { + if ctx.parentContext != nil { + ctx = ctx.parentContext + } + for ; ctx != nil; ctx = ctx.parentContext { + if f := ctx.flagSet.Lookup(name); f != nil { + return ctx.flagSet + } + } + return nil +} + +func copyFlag(name string, ff *flag.Flag, set *flag.FlagSet) { + switch ff.Value.(type) { + case *StringSlice: + default: + set.Set(name, ff.Value.String()) + } +} + +func normalizeFlags(flags []Flag, set *flag.FlagSet) error { + visited := make(map[string]bool) + set.Visit(func(f *flag.Flag) { + visited[f.Name] = true + }) + for _, f := range flags { + parts := strings.Split(f.GetName(), ",") + if len(parts) == 1 { + continue + } + var ff *flag.Flag + for _, name := range parts { + name = strings.Trim(name, " ") + if visited[name] { + if ff != nil { + return errors.New("Cannot use two forms of the same flag: " + name + " " + ff.Name) + } + ff = set.Lookup(name) + } + } + if ff == nil { + continue + } + for _, name := range parts { + name = strings.Trim(name, " ") + if !visited[name] { + copyFlag(name, ff, set) + } + } + } + return nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/errors.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/errors.go new file mode 100644 index 00000000..562b2953 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/errors.go @@ -0,0 +1,115 @@ +package cli + +import ( + "fmt" + "io" + "os" + "strings" +) + +// OsExiter is the function used when the app exits. If not set defaults to os.Exit. +var OsExiter = os.Exit + +// ErrWriter is used to write errors to the user. This can be anything +// implementing the io.Writer interface and defaults to os.Stderr. +var ErrWriter io.Writer = os.Stderr + +// MultiError is an error that wraps multiple errors. +type MultiError struct { + Errors []error +} + +// NewMultiError creates a new MultiError. Pass in one or more errors. +func NewMultiError(err ...error) MultiError { + return MultiError{Errors: err} +} + +// Error implements the error interface. +func (m MultiError) Error() string { + errs := make([]string, len(m.Errors)) + for i, err := range m.Errors { + errs[i] = err.Error() + } + + return strings.Join(errs, "\n") +} + +type ErrorFormatter interface { + Format(s fmt.State, verb rune) +} + +// ExitCoder is the interface checked by `App` and `Command` for a custom exit +// code +type ExitCoder interface { + error + ExitCode() int +} + +// ExitError fulfills both the builtin `error` interface and `ExitCoder` +type ExitError struct { + exitCode int + message interface{} +} + +// NewExitError makes a new *ExitError +func NewExitError(message interface{}, exitCode int) *ExitError { + return &ExitError{ + exitCode: exitCode, + message: message, + } +} + +// Error returns the string message, fulfilling the interface required by +// `error` +func (ee *ExitError) Error() string { + return fmt.Sprintf("%v", ee.message) +} + +// ExitCode returns the exit code, fulfilling the interface required by +// `ExitCoder` +func (ee *ExitError) ExitCode() int { + return ee.exitCode +} + +// HandleExitCoder checks if the error fulfills the ExitCoder interface, and if +// so prints the error to stderr (if it is non-empty) and calls OsExiter with the +// given exit code. If the given error is a MultiError, then this func is +// called on all members of the Errors slice and calls OsExiter with the last exit code. +func HandleExitCoder(err error) { + if err == nil { + return + } + + if exitErr, ok := err.(ExitCoder); ok { + if err.Error() != "" { + if _, ok := exitErr.(ErrorFormatter); ok { + fmt.Fprintf(ErrWriter, "%+v\n", err) + } else { + fmt.Fprintln(ErrWriter, err) + } + } + OsExiter(exitErr.ExitCode()) + return + } + + if multiErr, ok := err.(MultiError); ok { + code := handleMultiError(multiErr) + OsExiter(code) + return + } +} + +func handleMultiError(multiErr MultiError) int { + code := 1 + for _, merr := range multiErr.Errors { + if multiErr2, ok := merr.(MultiError); ok { + code = handleMultiError(multiErr2) + } else { + fmt.Fprintln(ErrWriter, merr) + if exitErr, ok := merr.(ExitCoder); ok { + code = exitErr.ExitCode() + } + } + } + return code +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/flag-types.json b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/flag-types.json new file mode 100644 index 00000000..12231078 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/flag-types.json @@ -0,0 +1,93 @@ +[ + { + "name": "Bool", + "type": "bool", + "value": false, + "context_default": "false", + "parser": "strconv.ParseBool(f.Value.String())" + }, + { + "name": "BoolT", + "type": "bool", + "value": false, + "doctail": " that is true by default", + "context_default": "false", + "parser": "strconv.ParseBool(f.Value.String())" + }, + { + "name": "Duration", + "type": "time.Duration", + "doctail": " (see https://golang.org/pkg/time/#ParseDuration)", + "context_default": "0", + "parser": "time.ParseDuration(f.Value.String())" + }, + { + "name": "Float64", + "type": "float64", + "context_default": "0", + "parser": "strconv.ParseFloat(f.Value.String(), 64)" + }, + { + "name": "Generic", + "type": "Generic", + "dest": false, + "context_default": "nil", + "context_type": "interface{}" + }, + { + "name": "Int64", + "type": "int64", + "context_default": "0", + "parser": "strconv.ParseInt(f.Value.String(), 0, 64)" + }, + { + "name": "Int", + "type": "int", + "context_default": "0", + "parser": "strconv.ParseInt(f.Value.String(), 0, 64)", + "parser_cast": "int(parsed)" + }, + { + "name": "IntSlice", + "type": "*IntSlice", + "dest": false, + "context_default": "nil", + "context_type": "[]int", + "parser": "(f.Value.(*IntSlice)).Value(), error(nil)" + }, + { + "name": "Int64Slice", + "type": "*Int64Slice", + "dest": false, + "context_default": "nil", + "context_type": "[]int64", + "parser": "(f.Value.(*Int64Slice)).Value(), error(nil)" + }, + { + "name": "String", + "type": "string", + "context_default": "\"\"", + "parser": "f.Value.String(), error(nil)" + }, + { + "name": "StringSlice", + "type": "*StringSlice", + "dest": false, + "context_default": "nil", + "context_type": "[]string", + "parser": "(f.Value.(*StringSlice)).Value(), error(nil)" + }, + { + "name": "Uint64", + "type": "uint64", + "context_default": "0", + "parser": "strconv.ParseUint(f.Value.String(), 0, 64)" + }, + { + "name": "Uint", + "type": "uint", + "context_default": "0", + "parser": "strconv.ParseUint(f.Value.String(), 0, 64)", + "parser_cast": "uint(parsed)" + } +] diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/flag.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/flag.go new file mode 100644 index 00000000..877ff352 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/flag.go @@ -0,0 +1,799 @@ +package cli + +import ( + "flag" + "fmt" + "reflect" + "runtime" + "strconv" + "strings" + "syscall" + "time" +) + +const defaultPlaceholder = "value" + +// BashCompletionFlag enables bash-completion for all commands and subcommands +var BashCompletionFlag Flag = BoolFlag{ + Name: "generate-bash-completion", + Hidden: true, +} + +// VersionFlag prints the version for the application +var VersionFlag Flag = BoolFlag{ + Name: "version, v", + Usage: "print the version", +} + +// HelpFlag prints the help for all commands and subcommands +// Set to the zero value (BoolFlag{}) to disable flag -- keeps subcommand +// unless HideHelp is set to true) +var HelpFlag Flag = BoolFlag{ + Name: "help, h", + Usage: "show help", +} + +// FlagStringer converts a flag definition to a string. This is used by help +// to display a flag. +var FlagStringer FlagStringFunc = stringifyFlag + +// FlagsByName is a slice of Flag. +type FlagsByName []Flag + +func (f FlagsByName) Len() int { + return len(f) +} + +func (f FlagsByName) Less(i, j int) bool { + return f[i].GetName() < f[j].GetName() +} + +func (f FlagsByName) Swap(i, j int) { + f[i], f[j] = f[j], f[i] +} + +// Flag is a common interface related to parsing flags in cli. +// For more advanced flag parsing techniques, it is recommended that +// this interface be implemented. +type Flag interface { + fmt.Stringer + // Apply Flag settings to the given flag set + Apply(*flag.FlagSet) + GetName() string +} + +// errorableFlag is an interface that allows us to return errors during apply +// it allows flags defined in this library to return errors in a fashion backwards compatible +// TODO remove in v2 and modify the existing Flag interface to return errors +type errorableFlag interface { + Flag + + ApplyWithError(*flag.FlagSet) error +} + +func flagSet(name string, flags []Flag) (*flag.FlagSet, error) { + set := flag.NewFlagSet(name, flag.ContinueOnError) + + for _, f := range flags { + //TODO remove in v2 when errorableFlag is removed + if ef, ok := f.(errorableFlag); ok { + if err := ef.ApplyWithError(set); err != nil { + return nil, err + } + } else { + f.Apply(set) + } + } + return set, nil +} + +func eachName(longName string, fn func(string)) { + parts := strings.Split(longName, ",") + for _, name := range parts { + name = strings.Trim(name, " ") + fn(name) + } +} + +// Generic is a generic parseable type identified by a specific flag +type Generic interface { + Set(value string) error + String() string +} + +// Apply takes the flagset and calls Set on the generic flag with the value +// provided by the user for parsing by the flag +// Ignores parsing errors +func (f GenericFlag) Apply(set *flag.FlagSet) { + f.ApplyWithError(set) +} + +// ApplyWithError takes the flagset and calls Set on the generic flag with the value +// provided by the user for parsing by the flag +func (f GenericFlag) ApplyWithError(set *flag.FlagSet) error { + val := f.Value + if f.EnvVar != "" { + for _, envVar := range strings.Split(f.EnvVar, ",") { + envVar = strings.TrimSpace(envVar) + if envVal, ok := syscall.Getenv(envVar); ok { + if err := val.Set(envVal); err != nil { + return fmt.Errorf("could not parse %s as value for flag %s: %s", envVal, f.Name, err) + } + break + } + } + } + + eachName(f.Name, func(name string) { + set.Var(f.Value, name, f.Usage) + }) + + return nil +} + +// StringSlice is an opaque type for []string to satisfy flag.Value and flag.Getter +type StringSlice []string + +// Set appends the string value to the list of values +func (f *StringSlice) Set(value string) error { + *f = append(*f, value) + return nil +} + +// String returns a readable representation of this value (for usage defaults) +func (f *StringSlice) String() string { + return fmt.Sprintf("%s", *f) +} + +// Value returns the slice of strings set by this flag +func (f *StringSlice) Value() []string { + return *f +} + +// Get returns the slice of strings set by this flag +func (f *StringSlice) Get() interface{} { + return *f +} + +// Apply populates the flag given the flag set and environment +// Ignores errors +func (f StringSliceFlag) Apply(set *flag.FlagSet) { + f.ApplyWithError(set) +} + +// ApplyWithError populates the flag given the flag set and environment +func (f StringSliceFlag) ApplyWithError(set *flag.FlagSet) error { + if f.EnvVar != "" { + for _, envVar := range strings.Split(f.EnvVar, ",") { + envVar = strings.TrimSpace(envVar) + if envVal, ok := syscall.Getenv(envVar); ok { + newVal := &StringSlice{} + for _, s := range strings.Split(envVal, ",") { + s = strings.TrimSpace(s) + if err := newVal.Set(s); err != nil { + return fmt.Errorf("could not parse %s as string value for flag %s: %s", envVal, f.Name, err) + } + } + f.Value = newVal + break + } + } + } + + eachName(f.Name, func(name string) { + if f.Value == nil { + f.Value = &StringSlice{} + } + set.Var(f.Value, name, f.Usage) + }) + + return nil +} + +// IntSlice is an opaque type for []int to satisfy flag.Value and flag.Getter +type IntSlice []int + +// Set parses the value into an integer and appends it to the list of values +func (f *IntSlice) Set(value string) error { + tmp, err := strconv.Atoi(value) + if err != nil { + return err + } + *f = append(*f, tmp) + return nil +} + +// String returns a readable representation of this value (for usage defaults) +func (f *IntSlice) String() string { + return fmt.Sprintf("%#v", *f) +} + +// Value returns the slice of ints set by this flag +func (f *IntSlice) Value() []int { + return *f +} + +// Get returns the slice of ints set by this flag +func (f *IntSlice) Get() interface{} { + return *f +} + +// Apply populates the flag given the flag set and environment +// Ignores errors +func (f IntSliceFlag) Apply(set *flag.FlagSet) { + f.ApplyWithError(set) +} + +// ApplyWithError populates the flag given the flag set and environment +func (f IntSliceFlag) ApplyWithError(set *flag.FlagSet) error { + if f.EnvVar != "" { + for _, envVar := range strings.Split(f.EnvVar, ",") { + envVar = strings.TrimSpace(envVar) + if envVal, ok := syscall.Getenv(envVar); ok { + newVal := &IntSlice{} + for _, s := range strings.Split(envVal, ",") { + s = strings.TrimSpace(s) + if err := newVal.Set(s); err != nil { + return fmt.Errorf("could not parse %s as int slice value for flag %s: %s", envVal, f.Name, err) + } + } + f.Value = newVal + break + } + } + } + + eachName(f.Name, func(name string) { + if f.Value == nil { + f.Value = &IntSlice{} + } + set.Var(f.Value, name, f.Usage) + }) + + return nil +} + +// Int64Slice is an opaque type for []int to satisfy flag.Value and flag.Getter +type Int64Slice []int64 + +// Set parses the value into an integer and appends it to the list of values +func (f *Int64Slice) Set(value string) error { + tmp, err := strconv.ParseInt(value, 10, 64) + if err != nil { + return err + } + *f = append(*f, tmp) + return nil +} + +// String returns a readable representation of this value (for usage defaults) +func (f *Int64Slice) String() string { + return fmt.Sprintf("%#v", *f) +} + +// Value returns the slice of ints set by this flag +func (f *Int64Slice) Value() []int64 { + return *f +} + +// Get returns the slice of ints set by this flag +func (f *Int64Slice) Get() interface{} { + return *f +} + +// Apply populates the flag given the flag set and environment +// Ignores errors +func (f Int64SliceFlag) Apply(set *flag.FlagSet) { + f.ApplyWithError(set) +} + +// ApplyWithError populates the flag given the flag set and environment +func (f Int64SliceFlag) ApplyWithError(set *flag.FlagSet) error { + if f.EnvVar != "" { + for _, envVar := range strings.Split(f.EnvVar, ",") { + envVar = strings.TrimSpace(envVar) + if envVal, ok := syscall.Getenv(envVar); ok { + newVal := &Int64Slice{} + for _, s := range strings.Split(envVal, ",") { + s = strings.TrimSpace(s) + if err := newVal.Set(s); err != nil { + return fmt.Errorf("could not parse %s as int64 slice value for flag %s: %s", envVal, f.Name, err) + } + } + f.Value = newVal + break + } + } + } + + eachName(f.Name, func(name string) { + if f.Value == nil { + f.Value = &Int64Slice{} + } + set.Var(f.Value, name, f.Usage) + }) + return nil +} + +// Apply populates the flag given the flag set and environment +// Ignores errors +func (f BoolFlag) Apply(set *flag.FlagSet) { + f.ApplyWithError(set) +} + +// ApplyWithError populates the flag given the flag set and environment +func (f BoolFlag) ApplyWithError(set *flag.FlagSet) error { + val := false + if f.EnvVar != "" { + for _, envVar := range strings.Split(f.EnvVar, ",") { + envVar = strings.TrimSpace(envVar) + if envVal, ok := syscall.Getenv(envVar); ok { + if envVal == "" { + val = false + break + } + + envValBool, err := strconv.ParseBool(envVal) + if err != nil { + return fmt.Errorf("could not parse %s as bool value for flag %s: %s", envVal, f.Name, err) + } + + val = envValBool + break + } + } + } + + eachName(f.Name, func(name string) { + if f.Destination != nil { + set.BoolVar(f.Destination, name, val, f.Usage) + return + } + set.Bool(name, val, f.Usage) + }) + + return nil +} + +// Apply populates the flag given the flag set and environment +// Ignores errors +func (f BoolTFlag) Apply(set *flag.FlagSet) { + f.ApplyWithError(set) +} + +// ApplyWithError populates the flag given the flag set and environment +func (f BoolTFlag) ApplyWithError(set *flag.FlagSet) error { + val := true + if f.EnvVar != "" { + for _, envVar := range strings.Split(f.EnvVar, ",") { + envVar = strings.TrimSpace(envVar) + if envVal, ok := syscall.Getenv(envVar); ok { + if envVal == "" { + val = false + break + } + + envValBool, err := strconv.ParseBool(envVal) + if err != nil { + return fmt.Errorf("could not parse %s as bool value for flag %s: %s", envVal, f.Name, err) + } + + val = envValBool + break + } + } + } + + eachName(f.Name, func(name string) { + if f.Destination != nil { + set.BoolVar(f.Destination, name, val, f.Usage) + return + } + set.Bool(name, val, f.Usage) + }) + + return nil +} + +// Apply populates the flag given the flag set and environment +// Ignores errors +func (f StringFlag) Apply(set *flag.FlagSet) { + f.ApplyWithError(set) +} + +// ApplyWithError populates the flag given the flag set and environment +func (f StringFlag) ApplyWithError(set *flag.FlagSet) error { + if f.EnvVar != "" { + for _, envVar := range strings.Split(f.EnvVar, ",") { + envVar = strings.TrimSpace(envVar) + if envVal, ok := syscall.Getenv(envVar); ok { + f.Value = envVal + break + } + } + } + + eachName(f.Name, func(name string) { + if f.Destination != nil { + set.StringVar(f.Destination, name, f.Value, f.Usage) + return + } + set.String(name, f.Value, f.Usage) + }) + + return nil +} + +// Apply populates the flag given the flag set and environment +// Ignores errors +func (f IntFlag) Apply(set *flag.FlagSet) { + f.ApplyWithError(set) +} + +// ApplyWithError populates the flag given the flag set and environment +func (f IntFlag) ApplyWithError(set *flag.FlagSet) error { + if f.EnvVar != "" { + for _, envVar := range strings.Split(f.EnvVar, ",") { + envVar = strings.TrimSpace(envVar) + if envVal, ok := syscall.Getenv(envVar); ok { + envValInt, err := strconv.ParseInt(envVal, 0, 64) + if err != nil { + return fmt.Errorf("could not parse %s as int value for flag %s: %s", envVal, f.Name, err) + } + f.Value = int(envValInt) + break + } + } + } + + eachName(f.Name, func(name string) { + if f.Destination != nil { + set.IntVar(f.Destination, name, f.Value, f.Usage) + return + } + set.Int(name, f.Value, f.Usage) + }) + + return nil +} + +// Apply populates the flag given the flag set and environment +// Ignores errors +func (f Int64Flag) Apply(set *flag.FlagSet) { + f.ApplyWithError(set) +} + +// ApplyWithError populates the flag given the flag set and environment +func (f Int64Flag) ApplyWithError(set *flag.FlagSet) error { + if f.EnvVar != "" { + for _, envVar := range strings.Split(f.EnvVar, ",") { + envVar = strings.TrimSpace(envVar) + if envVal, ok := syscall.Getenv(envVar); ok { + envValInt, err := strconv.ParseInt(envVal, 0, 64) + if err != nil { + return fmt.Errorf("could not parse %s as int value for flag %s: %s", envVal, f.Name, err) + } + + f.Value = envValInt + break + } + } + } + + eachName(f.Name, func(name string) { + if f.Destination != nil { + set.Int64Var(f.Destination, name, f.Value, f.Usage) + return + } + set.Int64(name, f.Value, f.Usage) + }) + + return nil +} + +// Apply populates the flag given the flag set and environment +// Ignores errors +func (f UintFlag) Apply(set *flag.FlagSet) { + f.ApplyWithError(set) +} + +// ApplyWithError populates the flag given the flag set and environment +func (f UintFlag) ApplyWithError(set *flag.FlagSet) error { + if f.EnvVar != "" { + for _, envVar := range strings.Split(f.EnvVar, ",") { + envVar = strings.TrimSpace(envVar) + if envVal, ok := syscall.Getenv(envVar); ok { + envValInt, err := strconv.ParseUint(envVal, 0, 64) + if err != nil { + return fmt.Errorf("could not parse %s as uint value for flag %s: %s", envVal, f.Name, err) + } + + f.Value = uint(envValInt) + break + } + } + } + + eachName(f.Name, func(name string) { + if f.Destination != nil { + set.UintVar(f.Destination, name, f.Value, f.Usage) + return + } + set.Uint(name, f.Value, f.Usage) + }) + + return nil +} + +// Apply populates the flag given the flag set and environment +// Ignores errors +func (f Uint64Flag) Apply(set *flag.FlagSet) { + f.ApplyWithError(set) +} + +// ApplyWithError populates the flag given the flag set and environment +func (f Uint64Flag) ApplyWithError(set *flag.FlagSet) error { + if f.EnvVar != "" { + for _, envVar := range strings.Split(f.EnvVar, ",") { + envVar = strings.TrimSpace(envVar) + if envVal, ok := syscall.Getenv(envVar); ok { + envValInt, err := strconv.ParseUint(envVal, 0, 64) + if err != nil { + return fmt.Errorf("could not parse %s as uint64 value for flag %s: %s", envVal, f.Name, err) + } + + f.Value = uint64(envValInt) + break + } + } + } + + eachName(f.Name, func(name string) { + if f.Destination != nil { + set.Uint64Var(f.Destination, name, f.Value, f.Usage) + return + } + set.Uint64(name, f.Value, f.Usage) + }) + + return nil +} + +// Apply populates the flag given the flag set and environment +// Ignores errors +func (f DurationFlag) Apply(set *flag.FlagSet) { + f.ApplyWithError(set) +} + +// ApplyWithError populates the flag given the flag set and environment +func (f DurationFlag) ApplyWithError(set *flag.FlagSet) error { + if f.EnvVar != "" { + for _, envVar := range strings.Split(f.EnvVar, ",") { + envVar = strings.TrimSpace(envVar) + if envVal, ok := syscall.Getenv(envVar); ok { + envValDuration, err := time.ParseDuration(envVal) + if err != nil { + return fmt.Errorf("could not parse %s as duration for flag %s: %s", envVal, f.Name, err) + } + + f.Value = envValDuration + break + } + } + } + + eachName(f.Name, func(name string) { + if f.Destination != nil { + set.DurationVar(f.Destination, name, f.Value, f.Usage) + return + } + set.Duration(name, f.Value, f.Usage) + }) + + return nil +} + +// Apply populates the flag given the flag set and environment +// Ignores errors +func (f Float64Flag) Apply(set *flag.FlagSet) { + f.ApplyWithError(set) +} + +// ApplyWithError populates the flag given the flag set and environment +func (f Float64Flag) ApplyWithError(set *flag.FlagSet) error { + if f.EnvVar != "" { + for _, envVar := range strings.Split(f.EnvVar, ",") { + envVar = strings.TrimSpace(envVar) + if envVal, ok := syscall.Getenv(envVar); ok { + envValFloat, err := strconv.ParseFloat(envVal, 10) + if err != nil { + return fmt.Errorf("could not parse %s as float64 value for flag %s: %s", envVal, f.Name, err) + } + + f.Value = float64(envValFloat) + break + } + } + } + + eachName(f.Name, func(name string) { + if f.Destination != nil { + set.Float64Var(f.Destination, name, f.Value, f.Usage) + return + } + set.Float64(name, f.Value, f.Usage) + }) + + return nil +} + +func visibleFlags(fl []Flag) []Flag { + visible := []Flag{} + for _, flag := range fl { + field := flagValue(flag).FieldByName("Hidden") + if !field.IsValid() || !field.Bool() { + visible = append(visible, flag) + } + } + return visible +} + +func prefixFor(name string) (prefix string) { + if len(name) == 1 { + prefix = "-" + } else { + prefix = "--" + } + + return +} + +// Returns the placeholder, if any, and the unquoted usage string. +func unquoteUsage(usage string) (string, string) { + for i := 0; i < len(usage); i++ { + if usage[i] == '`' { + for j := i + 1; j < len(usage); j++ { + if usage[j] == '`' { + name := usage[i+1 : j] + usage = usage[:i] + name + usage[j+1:] + return name, usage + } + } + break + } + } + return "", usage +} + +func prefixedNames(fullName, placeholder string) string { + var prefixed string + parts := strings.Split(fullName, ",") + for i, name := range parts { + name = strings.Trim(name, " ") + prefixed += prefixFor(name) + name + if placeholder != "" { + prefixed += " " + placeholder + } + if i < len(parts)-1 { + prefixed += ", " + } + } + return prefixed +} + +func withEnvHint(envVar, str string) string { + envText := "" + if envVar != "" { + prefix := "$" + suffix := "" + sep := ", $" + if runtime.GOOS == "windows" { + prefix = "%" + suffix = "%" + sep = "%, %" + } + envText = fmt.Sprintf(" [%s%s%s]", prefix, strings.Join(strings.Split(envVar, ","), sep), suffix) + } + return str + envText +} + +func flagValue(f Flag) reflect.Value { + fv := reflect.ValueOf(f) + for fv.Kind() == reflect.Ptr { + fv = reflect.Indirect(fv) + } + return fv +} + +func stringifyFlag(f Flag) string { + fv := flagValue(f) + + switch f.(type) { + case IntSliceFlag: + return withEnvHint(fv.FieldByName("EnvVar").String(), + stringifyIntSliceFlag(f.(IntSliceFlag))) + case Int64SliceFlag: + return withEnvHint(fv.FieldByName("EnvVar").String(), + stringifyInt64SliceFlag(f.(Int64SliceFlag))) + case StringSliceFlag: + return withEnvHint(fv.FieldByName("EnvVar").String(), + stringifyStringSliceFlag(f.(StringSliceFlag))) + } + + placeholder, usage := unquoteUsage(fv.FieldByName("Usage").String()) + + needsPlaceholder := false + defaultValueString := "" + + if val := fv.FieldByName("Value"); val.IsValid() { + needsPlaceholder = true + defaultValueString = fmt.Sprintf(" (default: %v)", val.Interface()) + + if val.Kind() == reflect.String && val.String() != "" { + defaultValueString = fmt.Sprintf(" (default: %q)", val.String()) + } + } + + if defaultValueString == " (default: )" { + defaultValueString = "" + } + + if needsPlaceholder && placeholder == "" { + placeholder = defaultPlaceholder + } + + usageWithDefault := strings.TrimSpace(fmt.Sprintf("%s%s", usage, defaultValueString)) + + return withEnvHint(fv.FieldByName("EnvVar").String(), + fmt.Sprintf("%s\t%s", prefixedNames(fv.FieldByName("Name").String(), placeholder), usageWithDefault)) +} + +func stringifyIntSliceFlag(f IntSliceFlag) string { + defaultVals := []string{} + if f.Value != nil && len(f.Value.Value()) > 0 { + for _, i := range f.Value.Value() { + defaultVals = append(defaultVals, fmt.Sprintf("%d", i)) + } + } + + return stringifySliceFlag(f.Usage, f.Name, defaultVals) +} + +func stringifyInt64SliceFlag(f Int64SliceFlag) string { + defaultVals := []string{} + if f.Value != nil && len(f.Value.Value()) > 0 { + for _, i := range f.Value.Value() { + defaultVals = append(defaultVals, fmt.Sprintf("%d", i)) + } + } + + return stringifySliceFlag(f.Usage, f.Name, defaultVals) +} + +func stringifyStringSliceFlag(f StringSliceFlag) string { + defaultVals := []string{} + if f.Value != nil && len(f.Value.Value()) > 0 { + for _, s := range f.Value.Value() { + if len(s) > 0 { + defaultVals = append(defaultVals, fmt.Sprintf("%q", s)) + } + } + } + + return stringifySliceFlag(f.Usage, f.Name, defaultVals) +} + +func stringifySliceFlag(usage, name string, defaultVals []string) string { + placeholder, usage := unquoteUsage(usage) + if placeholder == "" { + placeholder = defaultPlaceholder + } + + defaultVal := "" + if len(defaultVals) > 0 { + defaultVal = fmt.Sprintf(" (default: %s)", strings.Join(defaultVals, ", ")) + } + + usageWithDefault := strings.TrimSpace(fmt.Sprintf("%s%s", usage, defaultVal)) + return fmt.Sprintf("%s\t%s", prefixedNames(name, placeholder), usageWithDefault) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/flag_generated.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/flag_generated.go new file mode 100644 index 00000000..491b6195 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/flag_generated.go @@ -0,0 +1,627 @@ +package cli + +import ( + "flag" + "strconv" + "time" +) + +// WARNING: This file is generated! + +// BoolFlag is a flag with type bool +type BoolFlag struct { + Name string + Usage string + EnvVar string + Hidden bool + Destination *bool +} + +// String returns a readable representation of this value +// (for usage defaults) +func (f BoolFlag) String() string { + return FlagStringer(f) +} + +// GetName returns the name of the flag +func (f BoolFlag) GetName() string { + return f.Name +} + +// Bool looks up the value of a local BoolFlag, returns +// false if not found +func (c *Context) Bool(name string) bool { + return lookupBool(name, c.flagSet) +} + +// GlobalBool looks up the value of a global BoolFlag, returns +// false if not found +func (c *Context) GlobalBool(name string) bool { + if fs := lookupGlobalFlagSet(name, c); fs != nil { + return lookupBool(name, fs) + } + return false +} + +func lookupBool(name string, set *flag.FlagSet) bool { + f := set.Lookup(name) + if f != nil { + parsed, err := strconv.ParseBool(f.Value.String()) + if err != nil { + return false + } + return parsed + } + return false +} + +// BoolTFlag is a flag with type bool that is true by default +type BoolTFlag struct { + Name string + Usage string + EnvVar string + Hidden bool + Destination *bool +} + +// String returns a readable representation of this value +// (for usage defaults) +func (f BoolTFlag) String() string { + return FlagStringer(f) +} + +// GetName returns the name of the flag +func (f BoolTFlag) GetName() string { + return f.Name +} + +// BoolT looks up the value of a local BoolTFlag, returns +// false if not found +func (c *Context) BoolT(name string) bool { + return lookupBoolT(name, c.flagSet) +} + +// GlobalBoolT looks up the value of a global BoolTFlag, returns +// false if not found +func (c *Context) GlobalBoolT(name string) bool { + if fs := lookupGlobalFlagSet(name, c); fs != nil { + return lookupBoolT(name, fs) + } + return false +} + +func lookupBoolT(name string, set *flag.FlagSet) bool { + f := set.Lookup(name) + if f != nil { + parsed, err := strconv.ParseBool(f.Value.String()) + if err != nil { + return false + } + return parsed + } + return false +} + +// DurationFlag is a flag with type time.Duration (see https://golang.org/pkg/time/#ParseDuration) +type DurationFlag struct { + Name string + Usage string + EnvVar string + Hidden bool + Value time.Duration + Destination *time.Duration +} + +// String returns a readable representation of this value +// (for usage defaults) +func (f DurationFlag) String() string { + return FlagStringer(f) +} + +// GetName returns the name of the flag +func (f DurationFlag) GetName() string { + return f.Name +} + +// Duration looks up the value of a local DurationFlag, returns +// 0 if not found +func (c *Context) Duration(name string) time.Duration { + return lookupDuration(name, c.flagSet) +} + +// GlobalDuration looks up the value of a global DurationFlag, returns +// 0 if not found +func (c *Context) GlobalDuration(name string) time.Duration { + if fs := lookupGlobalFlagSet(name, c); fs != nil { + return lookupDuration(name, fs) + } + return 0 +} + +func lookupDuration(name string, set *flag.FlagSet) time.Duration { + f := set.Lookup(name) + if f != nil { + parsed, err := time.ParseDuration(f.Value.String()) + if err != nil { + return 0 + } + return parsed + } + return 0 +} + +// Float64Flag is a flag with type float64 +type Float64Flag struct { + Name string + Usage string + EnvVar string + Hidden bool + Value float64 + Destination *float64 +} + +// String returns a readable representation of this value +// (for usage defaults) +func (f Float64Flag) String() string { + return FlagStringer(f) +} + +// GetName returns the name of the flag +func (f Float64Flag) GetName() string { + return f.Name +} + +// Float64 looks up the value of a local Float64Flag, returns +// 0 if not found +func (c *Context) Float64(name string) float64 { + return lookupFloat64(name, c.flagSet) +} + +// GlobalFloat64 looks up the value of a global Float64Flag, returns +// 0 if not found +func (c *Context) GlobalFloat64(name string) float64 { + if fs := lookupGlobalFlagSet(name, c); fs != nil { + return lookupFloat64(name, fs) + } + return 0 +} + +func lookupFloat64(name string, set *flag.FlagSet) float64 { + f := set.Lookup(name) + if f != nil { + parsed, err := strconv.ParseFloat(f.Value.String(), 64) + if err != nil { + return 0 + } + return parsed + } + return 0 +} + +// GenericFlag is a flag with type Generic +type GenericFlag struct { + Name string + Usage string + EnvVar string + Hidden bool + Value Generic +} + +// String returns a readable representation of this value +// (for usage defaults) +func (f GenericFlag) String() string { + return FlagStringer(f) +} + +// GetName returns the name of the flag +func (f GenericFlag) GetName() string { + return f.Name +} + +// Generic looks up the value of a local GenericFlag, returns +// nil if not found +func (c *Context) Generic(name string) interface{} { + return lookupGeneric(name, c.flagSet) +} + +// GlobalGeneric looks up the value of a global GenericFlag, returns +// nil if not found +func (c *Context) GlobalGeneric(name string) interface{} { + if fs := lookupGlobalFlagSet(name, c); fs != nil { + return lookupGeneric(name, fs) + } + return nil +} + +func lookupGeneric(name string, set *flag.FlagSet) interface{} { + f := set.Lookup(name) + if f != nil { + parsed, err := f.Value, error(nil) + if err != nil { + return nil + } + return parsed + } + return nil +} + +// Int64Flag is a flag with type int64 +type Int64Flag struct { + Name string + Usage string + EnvVar string + Hidden bool + Value int64 + Destination *int64 +} + +// String returns a readable representation of this value +// (for usage defaults) +func (f Int64Flag) String() string { + return FlagStringer(f) +} + +// GetName returns the name of the flag +func (f Int64Flag) GetName() string { + return f.Name +} + +// Int64 looks up the value of a local Int64Flag, returns +// 0 if not found +func (c *Context) Int64(name string) int64 { + return lookupInt64(name, c.flagSet) +} + +// GlobalInt64 looks up the value of a global Int64Flag, returns +// 0 if not found +func (c *Context) GlobalInt64(name string) int64 { + if fs := lookupGlobalFlagSet(name, c); fs != nil { + return lookupInt64(name, fs) + } + return 0 +} + +func lookupInt64(name string, set *flag.FlagSet) int64 { + f := set.Lookup(name) + if f != nil { + parsed, err := strconv.ParseInt(f.Value.String(), 0, 64) + if err != nil { + return 0 + } + return parsed + } + return 0 +} + +// IntFlag is a flag with type int +type IntFlag struct { + Name string + Usage string + EnvVar string + Hidden bool + Value int + Destination *int +} + +// String returns a readable representation of this value +// (for usage defaults) +func (f IntFlag) String() string { + return FlagStringer(f) +} + +// GetName returns the name of the flag +func (f IntFlag) GetName() string { + return f.Name +} + +// Int looks up the value of a local IntFlag, returns +// 0 if not found +func (c *Context) Int(name string) int { + return lookupInt(name, c.flagSet) +} + +// GlobalInt looks up the value of a global IntFlag, returns +// 0 if not found +func (c *Context) GlobalInt(name string) int { + if fs := lookupGlobalFlagSet(name, c); fs != nil { + return lookupInt(name, fs) + } + return 0 +} + +func lookupInt(name string, set *flag.FlagSet) int { + f := set.Lookup(name) + if f != nil { + parsed, err := strconv.ParseInt(f.Value.String(), 0, 64) + if err != nil { + return 0 + } + return int(parsed) + } + return 0 +} + +// IntSliceFlag is a flag with type *IntSlice +type IntSliceFlag struct { + Name string + Usage string + EnvVar string + Hidden bool + Value *IntSlice +} + +// String returns a readable representation of this value +// (for usage defaults) +func (f IntSliceFlag) String() string { + return FlagStringer(f) +} + +// GetName returns the name of the flag +func (f IntSliceFlag) GetName() string { + return f.Name +} + +// IntSlice looks up the value of a local IntSliceFlag, returns +// nil if not found +func (c *Context) IntSlice(name string) []int { + return lookupIntSlice(name, c.flagSet) +} + +// GlobalIntSlice looks up the value of a global IntSliceFlag, returns +// nil if not found +func (c *Context) GlobalIntSlice(name string) []int { + if fs := lookupGlobalFlagSet(name, c); fs != nil { + return lookupIntSlice(name, fs) + } + return nil +} + +func lookupIntSlice(name string, set *flag.FlagSet) []int { + f := set.Lookup(name) + if f != nil { + parsed, err := (f.Value.(*IntSlice)).Value(), error(nil) + if err != nil { + return nil + } + return parsed + } + return nil +} + +// Int64SliceFlag is a flag with type *Int64Slice +type Int64SliceFlag struct { + Name string + Usage string + EnvVar string + Hidden bool + Value *Int64Slice +} + +// String returns a readable representation of this value +// (for usage defaults) +func (f Int64SliceFlag) String() string { + return FlagStringer(f) +} + +// GetName returns the name of the flag +func (f Int64SliceFlag) GetName() string { + return f.Name +} + +// Int64Slice looks up the value of a local Int64SliceFlag, returns +// nil if not found +func (c *Context) Int64Slice(name string) []int64 { + return lookupInt64Slice(name, c.flagSet) +} + +// GlobalInt64Slice looks up the value of a global Int64SliceFlag, returns +// nil if not found +func (c *Context) GlobalInt64Slice(name string) []int64 { + if fs := lookupGlobalFlagSet(name, c); fs != nil { + return lookupInt64Slice(name, fs) + } + return nil +} + +func lookupInt64Slice(name string, set *flag.FlagSet) []int64 { + f := set.Lookup(name) + if f != nil { + parsed, err := (f.Value.(*Int64Slice)).Value(), error(nil) + if err != nil { + return nil + } + return parsed + } + return nil +} + +// StringFlag is a flag with type string +type StringFlag struct { + Name string + Usage string + EnvVar string + Hidden bool + Value string + Destination *string +} + +// String returns a readable representation of this value +// (for usage defaults) +func (f StringFlag) String() string { + return FlagStringer(f) +} + +// GetName returns the name of the flag +func (f StringFlag) GetName() string { + return f.Name +} + +// String looks up the value of a local StringFlag, returns +// "" if not found +func (c *Context) String(name string) string { + return lookupString(name, c.flagSet) +} + +// GlobalString looks up the value of a global StringFlag, returns +// "" if not found +func (c *Context) GlobalString(name string) string { + if fs := lookupGlobalFlagSet(name, c); fs != nil { + return lookupString(name, fs) + } + return "" +} + +func lookupString(name string, set *flag.FlagSet) string { + f := set.Lookup(name) + if f != nil { + parsed, err := f.Value.String(), error(nil) + if err != nil { + return "" + } + return parsed + } + return "" +} + +// StringSliceFlag is a flag with type *StringSlice +type StringSliceFlag struct { + Name string + Usage string + EnvVar string + Hidden bool + Value *StringSlice +} + +// String returns a readable representation of this value +// (for usage defaults) +func (f StringSliceFlag) String() string { + return FlagStringer(f) +} + +// GetName returns the name of the flag +func (f StringSliceFlag) GetName() string { + return f.Name +} + +// StringSlice looks up the value of a local StringSliceFlag, returns +// nil if not found +func (c *Context) StringSlice(name string) []string { + return lookupStringSlice(name, c.flagSet) +} + +// GlobalStringSlice looks up the value of a global StringSliceFlag, returns +// nil if not found +func (c *Context) GlobalStringSlice(name string) []string { + if fs := lookupGlobalFlagSet(name, c); fs != nil { + return lookupStringSlice(name, fs) + } + return nil +} + +func lookupStringSlice(name string, set *flag.FlagSet) []string { + f := set.Lookup(name) + if f != nil { + parsed, err := (f.Value.(*StringSlice)).Value(), error(nil) + if err != nil { + return nil + } + return parsed + } + return nil +} + +// Uint64Flag is a flag with type uint64 +type Uint64Flag struct { + Name string + Usage string + EnvVar string + Hidden bool + Value uint64 + Destination *uint64 +} + +// String returns a readable representation of this value +// (for usage defaults) +func (f Uint64Flag) String() string { + return FlagStringer(f) +} + +// GetName returns the name of the flag +func (f Uint64Flag) GetName() string { + return f.Name +} + +// Uint64 looks up the value of a local Uint64Flag, returns +// 0 if not found +func (c *Context) Uint64(name string) uint64 { + return lookupUint64(name, c.flagSet) +} + +// GlobalUint64 looks up the value of a global Uint64Flag, returns +// 0 if not found +func (c *Context) GlobalUint64(name string) uint64 { + if fs := lookupGlobalFlagSet(name, c); fs != nil { + return lookupUint64(name, fs) + } + return 0 +} + +func lookupUint64(name string, set *flag.FlagSet) uint64 { + f := set.Lookup(name) + if f != nil { + parsed, err := strconv.ParseUint(f.Value.String(), 0, 64) + if err != nil { + return 0 + } + return parsed + } + return 0 +} + +// UintFlag is a flag with type uint +type UintFlag struct { + Name string + Usage string + EnvVar string + Hidden bool + Value uint + Destination *uint +} + +// String returns a readable representation of this value +// (for usage defaults) +func (f UintFlag) String() string { + return FlagStringer(f) +} + +// GetName returns the name of the flag +func (f UintFlag) GetName() string { + return f.Name +} + +// Uint looks up the value of a local UintFlag, returns +// 0 if not found +func (c *Context) Uint(name string) uint { + return lookupUint(name, c.flagSet) +} + +// GlobalUint looks up the value of a global UintFlag, returns +// 0 if not found +func (c *Context) GlobalUint(name string) uint { + if fs := lookupGlobalFlagSet(name, c); fs != nil { + return lookupUint(name, fs) + } + return 0 +} + +func lookupUint(name string, set *flag.FlagSet) uint { + f := set.Lookup(name) + if f != nil { + parsed, err := strconv.ParseUint(f.Value.String(), 0, 64) + if err != nil { + return 0 + } + return uint(parsed) + } + return 0 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/funcs.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/funcs.go new file mode 100644 index 00000000..cba5e6cb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/funcs.go @@ -0,0 +1,28 @@ +package cli + +// BashCompleteFunc is an action to execute when the bash-completion flag is set +type BashCompleteFunc func(*Context) + +// BeforeFunc is an action to execute before any subcommands are run, but after +// the context is ready if a non-nil error is returned, no subcommands are run +type BeforeFunc func(*Context) error + +// AfterFunc is an action to execute after any subcommands are run, but after the +// subcommand has finished it is run even if Action() panics +type AfterFunc func(*Context) error + +// ActionFunc is the action to execute when no subcommands are specified +type ActionFunc func(*Context) error + +// CommandNotFoundFunc is executed if the proper command cannot be found +type CommandNotFoundFunc func(*Context, string) + +// OnUsageErrorFunc is executed if an usage error occurs. This is useful for displaying +// customized usage error messages. This function is able to replace the +// original error messages. If this function is not set, the "Incorrect usage" +// is displayed and the execution is interrupted. +type OnUsageErrorFunc func(context *Context, err error, isSubcommand bool) error + +// FlagStringFunc is used by the help generation to display a flag, which is +// expected to be a single line. +type FlagStringFunc func(Flag) string diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/generate-flag-types b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/generate-flag-types new file mode 100755 index 00000000..7147381c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/generate-flag-types @@ -0,0 +1,255 @@ +#!/usr/bin/env python +""" +The flag types that ship with the cli library have many things in common, and +so we can take advantage of the `go generate` command to create much of the +source code from a list of definitions. These definitions attempt to cover +the parts that vary between flag types, and should evolve as needed. + +An example of the minimum definition needed is: + + { + "name": "SomeType", + "type": "sometype", + "context_default": "nil" + } + +In this example, the code generated for the `cli` package will include a type +named `SomeTypeFlag` that is expected to wrap a value of type `sometype`. +Fetching values by name via `*cli.Context` will default to a value of `nil`. + +A more complete, albeit somewhat redundant, example showing all available +definition keys is: + + { + "name": "VeryMuchType", + "type": "*VeryMuchType", + "value": true, + "dest": false, + "doctail": " which really only wraps a []float64, oh well!", + "context_type": "[]float64", + "context_default": "nil", + "parser": "parseVeryMuchType(f.Value.String())", + "parser_cast": "[]float64(parsed)" + } + +The meaning of each field is as follows: + + name (string) - The type "name", which will be suffixed with + `Flag` when generating the type definition + for `cli` and the wrapper type for `altsrc` + type (string) - The type that the generated `Flag` type for `cli` + is expected to "contain" as its `.Value` member + value (bool) - Should the generated `cli` type have a `Value` + member? + dest (bool) - Should the generated `cli` type support a + destination pointer? + doctail (string) - Additional docs for the `cli` flag type comment + context_type (string) - The literal type used in the `*cli.Context` + reader func signature + context_default (string) - The literal value used as the default by the + `*cli.Context` reader funcs when no value is + present + parser (string) - Literal code used to parse the flag `f`, + expected to have a return signature of + (value, error) + parser_cast (string) - Literal code used to cast the `parsed` value + returned from the `parser` code +""" + +from __future__ import print_function, unicode_literals + +import argparse +import json +import os +import subprocess +import sys +import tempfile +import textwrap + + +class _FancyFormatter(argparse.ArgumentDefaultsHelpFormatter, + argparse.RawDescriptionHelpFormatter): + pass + + +def main(sysargs=sys.argv[:]): + parser = argparse.ArgumentParser( + description='Generate flag type code!', + formatter_class=_FancyFormatter) + parser.add_argument( + 'package', + type=str, default='cli', choices=_WRITEFUNCS.keys(), + help='Package for which flag types will be generated' + ) + parser.add_argument( + '-i', '--in-json', + type=argparse.FileType('r'), + default=sys.stdin, + help='Input JSON file which defines each type to be generated' + ) + parser.add_argument( + '-o', '--out-go', + type=argparse.FileType('w'), + default=sys.stdout, + help='Output file/stream to which generated source will be written' + ) + parser.epilog = __doc__ + + args = parser.parse_args(sysargs[1:]) + _generate_flag_types(_WRITEFUNCS[args.package], args.out_go, args.in_json) + return 0 + + +def _generate_flag_types(writefunc, output_go, input_json): + types = json.load(input_json) + + tmp = tempfile.NamedTemporaryFile(suffix='.go', delete=False) + writefunc(tmp, types) + tmp.close() + + new_content = subprocess.check_output( + ['goimports', tmp.name] + ).decode('utf-8') + + print(new_content, file=output_go, end='') + output_go.flush() + os.remove(tmp.name) + + +def _set_typedef_defaults(typedef): + typedef.setdefault('doctail', '') + typedef.setdefault('context_type', typedef['type']) + typedef.setdefault('dest', True) + typedef.setdefault('value', True) + typedef.setdefault('parser', 'f.Value, error(nil)') + typedef.setdefault('parser_cast', 'parsed') + + +def _write_cli_flag_types(outfile, types): + _fwrite(outfile, """\ + package cli + + // WARNING: This file is generated! + + """) + + for typedef in types: + _set_typedef_defaults(typedef) + + _fwrite(outfile, """\ + // {name}Flag is a flag with type {type}{doctail} + type {name}Flag struct {{ + Name string + Usage string + EnvVar string + Hidden bool + """.format(**typedef)) + + if typedef['value']: + _fwrite(outfile, """\ + Value {type} + """.format(**typedef)) + + if typedef['dest']: + _fwrite(outfile, """\ + Destination *{type} + """.format(**typedef)) + + _fwrite(outfile, "\n}\n\n") + + _fwrite(outfile, """\ + // String returns a readable representation of this value + // (for usage defaults) + func (f {name}Flag) String() string {{ + return FlagStringer(f) + }} + + // GetName returns the name of the flag + func (f {name}Flag) GetName() string {{ + return f.Name + }} + + // {name} looks up the value of a local {name}Flag, returns + // {context_default} if not found + func (c *Context) {name}(name string) {context_type} {{ + return lookup{name}(name, c.flagSet) + }} + + // Global{name} looks up the value of a global {name}Flag, returns + // {context_default} if not found + func (c *Context) Global{name}(name string) {context_type} {{ + if fs := lookupGlobalFlagSet(name, c); fs != nil {{ + return lookup{name}(name, fs) + }} + return {context_default} + }} + + func lookup{name}(name string, set *flag.FlagSet) {context_type} {{ + f := set.Lookup(name) + if f != nil {{ + parsed, err := {parser} + if err != nil {{ + return {context_default} + }} + return {parser_cast} + }} + return {context_default} + }} + """.format(**typedef)) + + +def _write_altsrc_flag_types(outfile, types): + _fwrite(outfile, """\ + package altsrc + + import ( + "gopkg.in/urfave/cli.v1" + ) + + // WARNING: This file is generated! + + """) + + for typedef in types: + _set_typedef_defaults(typedef) + + _fwrite(outfile, """\ + // {name}Flag is the flag type that wraps cli.{name}Flag to allow + // for other values to be specified + type {name}Flag struct {{ + cli.{name}Flag + set *flag.FlagSet + }} + + // New{name}Flag creates a new {name}Flag + func New{name}Flag(fl cli.{name}Flag) *{name}Flag {{ + return &{name}Flag{{{name}Flag: fl, set: nil}} + }} + + // Apply saves the flagSet for later usage calls, then calls the + // wrapped {name}Flag.Apply + func (f *{name}Flag) Apply(set *flag.FlagSet) {{ + f.set = set + f.{name}Flag.Apply(set) + }} + + // ApplyWithError saves the flagSet for later usage calls, then calls the + // wrapped {name}Flag.ApplyWithError + func (f *{name}Flag) ApplyWithError(set *flag.FlagSet) error {{ + f.set = set + return f.{name}Flag.ApplyWithError(set) + }} + """.format(**typedef)) + + +def _fwrite(outfile, text): + print(textwrap.dedent(text), end='', file=outfile) + + +_WRITEFUNCS = { + 'cli': _write_cli_flag_types, + 'altsrc': _write_altsrc_flag_types +} + +if __name__ == '__main__': + sys.exit(main()) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/help.go b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/help.go new file mode 100644 index 00000000..57ec98d5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/help.go @@ -0,0 +1,338 @@ +package cli + +import ( + "fmt" + "io" + "os" + "strings" + "text/tabwriter" + "text/template" +) + +// AppHelpTemplate is the text template for the Default help topic. +// cli.go uses text/template to render templates. You can +// render custom help text by setting this variable. +var AppHelpTemplate = `NAME: + {{.Name}}{{if .Usage}} - {{.Usage}}{{end}} + +USAGE: + {{if .UsageText}}{{.UsageText}}{{else}}{{.HelpName}} {{if .VisibleFlags}}[global options]{{end}}{{if .Commands}} command [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}}{{if .Version}}{{if not .HideVersion}} + +VERSION: + {{.Version}}{{end}}{{end}}{{if .Description}} + +DESCRIPTION: + {{.Description}}{{end}}{{if len .Authors}} + +AUTHOR{{with $length := len .Authors}}{{if ne 1 $length}}S{{end}}{{end}}: + {{range $index, $author := .Authors}}{{if $index}} + {{end}}{{$author}}{{end}}{{end}}{{if .VisibleCommands}} + +COMMANDS:{{range .VisibleCategories}}{{if .Name}} + {{.Name}}:{{end}}{{range .VisibleCommands}} + {{join .Names ", "}}{{"\t"}}{{.Usage}}{{end}}{{end}}{{end}}{{if .VisibleFlags}} + +GLOBAL OPTIONS: + {{range $index, $option := .VisibleFlags}}{{if $index}} + {{end}}{{$option}}{{end}}{{end}}{{if .Copyright}} + +COPYRIGHT: + {{.Copyright}}{{end}} +` + +// CommandHelpTemplate is the text template for the command help topic. +// cli.go uses text/template to render templates. You can +// render custom help text by setting this variable. +var CommandHelpTemplate = `NAME: + {{.HelpName}} - {{.Usage}} + +USAGE: + {{if .UsageText}}{{.UsageText}}{{else}}{{.HelpName}}{{if .VisibleFlags}} [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}}{{if .Category}} + +CATEGORY: + {{.Category}}{{end}}{{if .Description}} + +DESCRIPTION: + {{.Description}}{{end}}{{if .VisibleFlags}} + +OPTIONS: + {{range .VisibleFlags}}{{.}} + {{end}}{{end}} +` + +// SubcommandHelpTemplate is the text template for the subcommand help topic. +// cli.go uses text/template to render templates. You can +// render custom help text by setting this variable. +var SubcommandHelpTemplate = `NAME: + {{.HelpName}} - {{if .Description}}{{.Description}}{{else}}{{.Usage}}{{end}} + +USAGE: + {{if .UsageText}}{{.UsageText}}{{else}}{{.HelpName}} command{{if .VisibleFlags}} [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}} + +COMMANDS:{{range .VisibleCategories}}{{if .Name}} + {{.Name}}:{{end}}{{range .VisibleCommands}} + {{join .Names ", "}}{{"\t"}}{{.Usage}}{{end}} +{{end}}{{if .VisibleFlags}} +OPTIONS: + {{range .VisibleFlags}}{{.}} + {{end}}{{end}} +` + +var helpCommand = Command{ + Name: "help", + Aliases: []string{"h"}, + Usage: "Shows a list of commands or help for one command", + ArgsUsage: "[command]", + Action: func(c *Context) error { + args := c.Args() + if args.Present() { + return ShowCommandHelp(c, args.First()) + } + + ShowAppHelp(c) + return nil + }, +} + +var helpSubcommand = Command{ + Name: "help", + Aliases: []string{"h"}, + Usage: "Shows a list of commands or help for one command", + ArgsUsage: "[command]", + Action: func(c *Context) error { + args := c.Args() + if args.Present() { + return ShowCommandHelp(c, args.First()) + } + + return ShowSubcommandHelp(c) + }, +} + +// Prints help for the App or Command +type helpPrinter func(w io.Writer, templ string, data interface{}) + +// Prints help for the App or Command with custom template function. +type helpPrinterCustom func(w io.Writer, templ string, data interface{}, customFunc map[string]interface{}) + +// HelpPrinter is a function that writes the help output. If not set a default +// is used. The function signature is: +// func(w io.Writer, templ string, data interface{}) +var HelpPrinter helpPrinter = printHelp + +// HelpPrinterCustom is same as HelpPrinter but +// takes a custom function for template function map. +var HelpPrinterCustom helpPrinterCustom = printHelpCustom + +// VersionPrinter prints the version for the App +var VersionPrinter = printVersion + +// ShowAppHelpAndExit - Prints the list of subcommands for the app and exits with exit code. +func ShowAppHelpAndExit(c *Context, exitCode int) { + ShowAppHelp(c) + os.Exit(exitCode) +} + +// ShowAppHelp is an action that displays the help. +func ShowAppHelp(c *Context) (err error) { + if c.App.CustomAppHelpTemplate == "" { + HelpPrinter(c.App.Writer, AppHelpTemplate, c.App) + return + } + customAppData := func() map[string]interface{} { + if c.App.ExtraInfo == nil { + return nil + } + return map[string]interface{}{ + "ExtraInfo": c.App.ExtraInfo, + } + } + HelpPrinterCustom(c.App.Writer, c.App.CustomAppHelpTemplate, c.App, customAppData()) + return nil +} + +// DefaultAppComplete prints the list of subcommands as the default app completion method +func DefaultAppComplete(c *Context) { + for _, command := range c.App.Commands { + if command.Hidden { + continue + } + for _, name := range command.Names() { + fmt.Fprintln(c.App.Writer, name) + } + } +} + +// ShowCommandHelpAndExit - exits with code after showing help +func ShowCommandHelpAndExit(c *Context, command string, code int) { + ShowCommandHelp(c, command) + os.Exit(code) +} + +// ShowCommandHelp prints help for the given command +func ShowCommandHelp(ctx *Context, command string) error { + // show the subcommand help for a command with subcommands + if command == "" { + HelpPrinter(ctx.App.Writer, SubcommandHelpTemplate, ctx.App) + return nil + } + + for _, c := range ctx.App.Commands { + if c.HasName(command) { + if c.CustomHelpTemplate != "" { + HelpPrinterCustom(ctx.App.Writer, c.CustomHelpTemplate, c, nil) + } else { + HelpPrinter(ctx.App.Writer, CommandHelpTemplate, c) + } + return nil + } + } + + if ctx.App.CommandNotFound == nil { + return NewExitError(fmt.Sprintf("No help topic for '%v'", command), 3) + } + + ctx.App.CommandNotFound(ctx, command) + return nil +} + +// ShowSubcommandHelp prints help for the given subcommand +func ShowSubcommandHelp(c *Context) error { + return ShowCommandHelp(c, c.Command.Name) +} + +// ShowVersion prints the version number of the App +func ShowVersion(c *Context) { + VersionPrinter(c) +} + +func printVersion(c *Context) { + fmt.Fprintf(c.App.Writer, "%v version %v\n", c.App.Name, c.App.Version) +} + +// ShowCompletions prints the lists of commands within a given context +func ShowCompletions(c *Context) { + a := c.App + if a != nil && a.BashComplete != nil { + a.BashComplete(c) + } +} + +// ShowCommandCompletions prints the custom completions for a given command +func ShowCommandCompletions(ctx *Context, command string) { + c := ctx.App.Command(command) + if c != nil && c.BashComplete != nil { + c.BashComplete(ctx) + } +} + +func printHelpCustom(out io.Writer, templ string, data interface{}, customFunc map[string]interface{}) { + funcMap := template.FuncMap{ + "join": strings.Join, + } + if customFunc != nil { + for key, value := range customFunc { + funcMap[key] = value + } + } + + w := tabwriter.NewWriter(out, 1, 8, 2, ' ', 0) + t := template.Must(template.New("help").Funcs(funcMap).Parse(templ)) + err := t.Execute(w, data) + if err != nil { + // If the writer is closed, t.Execute will fail, and there's nothing + // we can do to recover. + if os.Getenv("CLI_TEMPLATE_ERROR_DEBUG") != "" { + fmt.Fprintf(ErrWriter, "CLI TEMPLATE ERROR: %#v\n", err) + } + return + } + w.Flush() +} + +func printHelp(out io.Writer, templ string, data interface{}) { + printHelpCustom(out, templ, data, nil) +} + +func checkVersion(c *Context) bool { + found := false + if VersionFlag.GetName() != "" { + eachName(VersionFlag.GetName(), func(name string) { + if c.GlobalBool(name) || c.Bool(name) { + found = true + } + }) + } + return found +} + +func checkHelp(c *Context) bool { + found := false + if HelpFlag.GetName() != "" { + eachName(HelpFlag.GetName(), func(name string) { + if c.GlobalBool(name) || c.Bool(name) { + found = true + } + }) + } + return found +} + +func checkCommandHelp(c *Context, name string) bool { + if c.Bool("h") || c.Bool("help") { + ShowCommandHelp(c, name) + return true + } + + return false +} + +func checkSubcommandHelp(c *Context) bool { + if c.Bool("h") || c.Bool("help") { + ShowSubcommandHelp(c) + return true + } + + return false +} + +func checkShellCompleteFlag(a *App, arguments []string) (bool, []string) { + if !a.EnableBashCompletion { + return false, arguments + } + + pos := len(arguments) - 1 + lastArg := arguments[pos] + + if lastArg != "--"+BashCompletionFlag.GetName() { + return false, arguments + } + + return true, arguments[:pos] +} + +func checkCompletions(c *Context) bool { + if !c.shellComplete { + return false + } + + if args := c.Args(); args.Present() { + name := args.First() + if cmd := c.App.Command(name); cmd != nil { + // let the command handle the completion + return false + } + } + + ShowCompletions(c) + return true +} + +func checkCommandCompletions(c *Context, name string) bool { + if !c.shellComplete { + return false + } + + ShowCommandCompletions(c, name) + return true +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/runtests b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/runtests new file mode 100755 index 00000000..ee22bdee --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/github.com/urfave/cli/runtests @@ -0,0 +1,122 @@ +#!/usr/bin/env python +from __future__ import print_function + +import argparse +import os +import sys +import tempfile + +from subprocess import check_call, check_output + + +PACKAGE_NAME = os.environ.get( + 'CLI_PACKAGE_NAME', 'github.com/urfave/cli' +) + + +def main(sysargs=sys.argv[:]): + targets = { + 'vet': _vet, + 'test': _test, + 'gfmrun': _gfmrun, + 'toc': _toc, + 'gen': _gen, + } + + parser = argparse.ArgumentParser() + parser.add_argument( + 'target', nargs='?', choices=tuple(targets.keys()), default='test' + ) + args = parser.parse_args(sysargs[1:]) + + targets[args.target]() + return 0 + + +def _test(): + if check_output('go version'.split()).split()[2] < 'go1.2': + _run('go test -v .') + return + + coverprofiles = [] + for subpackage in ['', 'altsrc']: + coverprofile = 'cli.coverprofile' + if subpackage != '': + coverprofile = '{}.coverprofile'.format(subpackage) + + coverprofiles.append(coverprofile) + + _run('go test -v'.split() + [ + '-coverprofile={}'.format(coverprofile), + ('{}/{}'.format(PACKAGE_NAME, subpackage)).rstrip('/') + ]) + + combined_name = _combine_coverprofiles(coverprofiles) + _run('go tool cover -func={}'.format(combined_name)) + os.remove(combined_name) + + +def _gfmrun(): + go_version = check_output('go version'.split()).split()[2] + if go_version < 'go1.3': + print('runtests: skip on {}'.format(go_version), file=sys.stderr) + return + _run(['gfmrun', '-c', str(_gfmrun_count()), '-s', 'README.md']) + + +def _vet(): + _run('go vet ./...') + + +def _toc(): + _run('node_modules/.bin/markdown-toc -i README.md') + _run('git diff --exit-code') + + +def _gen(): + go_version = check_output('go version'.split()).split()[2] + if go_version < 'go1.5': + print('runtests: skip on {}'.format(go_version), file=sys.stderr) + return + + _run('go generate ./...') + _run('git diff --exit-code') + + +def _run(command): + if hasattr(command, 'split'): + command = command.split() + print('runtests: {}'.format(' '.join(command)), file=sys.stderr) + check_call(command) + + +def _gfmrun_count(): + with open('README.md') as infile: + lines = infile.read().splitlines() + return len(filter(_is_go_runnable, lines)) + + +def _is_go_runnable(line): + return line.startswith('package main') + + +def _combine_coverprofiles(coverprofiles): + combined = tempfile.NamedTemporaryFile( + suffix='.coverprofile', delete=False + ) + combined.write('mode: set\n') + + for coverprofile in coverprofiles: + with open(coverprofile, 'r') as infile: + for line in infile.readlines(): + if not line.startswith('mode: '): + combined.write(line) + + combined.flush() + name = combined.name + combined.close() + return name + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/crypto/AUTHORS b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/crypto/AUTHORS new file mode 100644 index 00000000..2b00ddba --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/crypto/AUTHORS @@ -0,0 +1,3 @@ +# This source code refers to The Go Authors for copyright purposes. +# The master list of authors is in the main Go distribution, +# visible at https://tip.golang.org/AUTHORS. diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/crypto/CONTRIBUTORS b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/crypto/CONTRIBUTORS new file mode 100644 index 00000000..1fbd3e97 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/crypto/CONTRIBUTORS @@ -0,0 +1,3 @@ +# This source code was written by the Go contributors. +# The master list of contributors is in the main Go distribution, +# visible at https://tip.golang.org/CONTRIBUTORS. diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/crypto/LICENSE b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/crypto/LICENSE new file mode 100644 index 00000000..6a66aea5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/crypto/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2009 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/crypto/PATENTS b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/crypto/PATENTS new file mode 100644 index 00000000..73309904 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/crypto/PATENTS @@ -0,0 +1,22 @@ +Additional IP Rights Grant (Patents) + +"This implementation" means the copyrightable works distributed by +Google as part of the Go project. + +Google hereby grants to You a perpetual, worldwide, non-exclusive, +no-charge, royalty-free, irrevocable (except as stated in this section) +patent license to make, have made, use, offer to sell, sell, import, +transfer and otherwise run, modify and propagate the contents of this +implementation of Go, where such license applies only to those patent +claims, both currently owned or controlled by Google and acquired in +the future, licensable by Google that are necessarily infringed by this +implementation of Go. This grant does not include claims that would be +infringed only as a consequence of further modification of this +implementation. If you or your agent or exclusive licensee institute or +order or agree to the institution of patent litigation against any +entity (including a cross-claim or counterclaim in a lawsuit) alleging +that this implementation of Go or any code incorporated within this +implementation of Go constitutes direct or contributory patent +infringement, or inducement of patent infringement, then any patent +rights granted to you under this License for this implementation of Go +shall terminate as of the date such litigation is filed. diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/crypto/ssh/terminal/terminal.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/crypto/ssh/terminal/terminal.go new file mode 100644 index 00000000..9a887598 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/crypto/ssh/terminal/terminal.go @@ -0,0 +1,951 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package terminal + +import ( + "bytes" + "io" + "sync" + "unicode/utf8" +) + +// EscapeCodes contains escape sequences that can be written to the terminal in +// order to achieve different styles of text. +type EscapeCodes struct { + // Foreground colors + Black, Red, Green, Yellow, Blue, Magenta, Cyan, White []byte + + // Reset all attributes + Reset []byte +} + +var vt100EscapeCodes = EscapeCodes{ + Black: []byte{keyEscape, '[', '3', '0', 'm'}, + Red: []byte{keyEscape, '[', '3', '1', 'm'}, + Green: []byte{keyEscape, '[', '3', '2', 'm'}, + Yellow: []byte{keyEscape, '[', '3', '3', 'm'}, + Blue: []byte{keyEscape, '[', '3', '4', 'm'}, + Magenta: []byte{keyEscape, '[', '3', '5', 'm'}, + Cyan: []byte{keyEscape, '[', '3', '6', 'm'}, + White: []byte{keyEscape, '[', '3', '7', 'm'}, + + Reset: []byte{keyEscape, '[', '0', 'm'}, +} + +// Terminal contains the state for running a VT100 terminal that is capable of +// reading lines of input. +type Terminal struct { + // AutoCompleteCallback, if non-null, is called for each keypress with + // the full input line and the current position of the cursor (in + // bytes, as an index into |line|). If it returns ok=false, the key + // press is processed normally. Otherwise it returns a replacement line + // and the new cursor position. + AutoCompleteCallback func(line string, pos int, key rune) (newLine string, newPos int, ok bool) + + // Escape contains a pointer to the escape codes for this terminal. + // It's always a valid pointer, although the escape codes themselves + // may be empty if the terminal doesn't support them. + Escape *EscapeCodes + + // lock protects the terminal and the state in this object from + // concurrent processing of a key press and a Write() call. + lock sync.Mutex + + c io.ReadWriter + prompt []rune + + // line is the current line being entered. + line []rune + // pos is the logical position of the cursor in line + pos int + // echo is true if local echo is enabled + echo bool + // pasteActive is true iff there is a bracketed paste operation in + // progress. + pasteActive bool + + // cursorX contains the current X value of the cursor where the left + // edge is 0. cursorY contains the row number where the first row of + // the current line is 0. + cursorX, cursorY int + // maxLine is the greatest value of cursorY so far. + maxLine int + + termWidth, termHeight int + + // outBuf contains the terminal data to be sent. + outBuf []byte + // remainder contains the remainder of any partial key sequences after + // a read. It aliases into inBuf. + remainder []byte + inBuf [256]byte + + // history contains previously entered commands so that they can be + // accessed with the up and down keys. + history stRingBuffer + // historyIndex stores the currently accessed history entry, where zero + // means the immediately previous entry. + historyIndex int + // When navigating up and down the history it's possible to return to + // the incomplete, initial line. That value is stored in + // historyPending. + historyPending string +} + +// NewTerminal runs a VT100 terminal on the given ReadWriter. If the ReadWriter is +// a local terminal, that terminal must first have been put into raw mode. +// prompt is a string that is written at the start of each input line (i.e. +// "> "). +func NewTerminal(c io.ReadWriter, prompt string) *Terminal { + return &Terminal{ + Escape: &vt100EscapeCodes, + c: c, + prompt: []rune(prompt), + termWidth: 80, + termHeight: 24, + echo: true, + historyIndex: -1, + } +} + +const ( + keyCtrlD = 4 + keyCtrlU = 21 + keyEnter = '\r' + keyEscape = 27 + keyBackspace = 127 + keyUnknown = 0xd800 /* UTF-16 surrogate area */ + iota + keyUp + keyDown + keyLeft + keyRight + keyAltLeft + keyAltRight + keyHome + keyEnd + keyDeleteWord + keyDeleteLine + keyClearScreen + keyPasteStart + keyPasteEnd +) + +var ( + crlf = []byte{'\r', '\n'} + pasteStart = []byte{keyEscape, '[', '2', '0', '0', '~'} + pasteEnd = []byte{keyEscape, '[', '2', '0', '1', '~'} +) + +// bytesToKey tries to parse a key sequence from b. If successful, it returns +// the key and the remainder of the input. Otherwise it returns utf8.RuneError. +func bytesToKey(b []byte, pasteActive bool) (rune, []byte) { + if len(b) == 0 { + return utf8.RuneError, nil + } + + if !pasteActive { + switch b[0] { + case 1: // ^A + return keyHome, b[1:] + case 5: // ^E + return keyEnd, b[1:] + case 8: // ^H + return keyBackspace, b[1:] + case 11: // ^K + return keyDeleteLine, b[1:] + case 12: // ^L + return keyClearScreen, b[1:] + case 23: // ^W + return keyDeleteWord, b[1:] + } + } + + if b[0] != keyEscape { + if !utf8.FullRune(b) { + return utf8.RuneError, b + } + r, l := utf8.DecodeRune(b) + return r, b[l:] + } + + if !pasteActive && len(b) >= 3 && b[0] == keyEscape && b[1] == '[' { + switch b[2] { + case 'A': + return keyUp, b[3:] + case 'B': + return keyDown, b[3:] + case 'C': + return keyRight, b[3:] + case 'D': + return keyLeft, b[3:] + case 'H': + return keyHome, b[3:] + case 'F': + return keyEnd, b[3:] + } + } + + if !pasteActive && len(b) >= 6 && b[0] == keyEscape && b[1] == '[' && b[2] == '1' && b[3] == ';' && b[4] == '3' { + switch b[5] { + case 'C': + return keyAltRight, b[6:] + case 'D': + return keyAltLeft, b[6:] + } + } + + if !pasteActive && len(b) >= 6 && bytes.Equal(b[:6], pasteStart) { + return keyPasteStart, b[6:] + } + + if pasteActive && len(b) >= 6 && bytes.Equal(b[:6], pasteEnd) { + return keyPasteEnd, b[6:] + } + + // If we get here then we have a key that we don't recognise, or a + // partial sequence. It's not clear how one should find the end of a + // sequence without knowing them all, but it seems that [a-zA-Z~] only + // appears at the end of a sequence. + for i, c := range b[0:] { + if c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c == '~' { + return keyUnknown, b[i+1:] + } + } + + return utf8.RuneError, b +} + +// queue appends data to the end of t.outBuf +func (t *Terminal) queue(data []rune) { + t.outBuf = append(t.outBuf, []byte(string(data))...) +} + +var eraseUnderCursor = []rune{' ', keyEscape, '[', 'D'} +var space = []rune{' '} + +func isPrintable(key rune) bool { + isInSurrogateArea := key >= 0xd800 && key <= 0xdbff + return key >= 32 && !isInSurrogateArea +} + +// moveCursorToPos appends data to t.outBuf which will move the cursor to the +// given, logical position in the text. +func (t *Terminal) moveCursorToPos(pos int) { + if !t.echo { + return + } + + x := visualLength(t.prompt) + pos + y := x / t.termWidth + x = x % t.termWidth + + up := 0 + if y < t.cursorY { + up = t.cursorY - y + } + + down := 0 + if y > t.cursorY { + down = y - t.cursorY + } + + left := 0 + if x < t.cursorX { + left = t.cursorX - x + } + + right := 0 + if x > t.cursorX { + right = x - t.cursorX + } + + t.cursorX = x + t.cursorY = y + t.move(up, down, left, right) +} + +func (t *Terminal) move(up, down, left, right int) { + movement := make([]rune, 3*(up+down+left+right)) + m := movement + for i := 0; i < up; i++ { + m[0] = keyEscape + m[1] = '[' + m[2] = 'A' + m = m[3:] + } + for i := 0; i < down; i++ { + m[0] = keyEscape + m[1] = '[' + m[2] = 'B' + m = m[3:] + } + for i := 0; i < left; i++ { + m[0] = keyEscape + m[1] = '[' + m[2] = 'D' + m = m[3:] + } + for i := 0; i < right; i++ { + m[0] = keyEscape + m[1] = '[' + m[2] = 'C' + m = m[3:] + } + + t.queue(movement) +} + +func (t *Terminal) clearLineToRight() { + op := []rune{keyEscape, '[', 'K'} + t.queue(op) +} + +const maxLineLength = 4096 + +func (t *Terminal) setLine(newLine []rune, newPos int) { + if t.echo { + t.moveCursorToPos(0) + t.writeLine(newLine) + for i := len(newLine); i < len(t.line); i++ { + t.writeLine(space) + } + t.moveCursorToPos(newPos) + } + t.line = newLine + t.pos = newPos +} + +func (t *Terminal) advanceCursor(places int) { + t.cursorX += places + t.cursorY += t.cursorX / t.termWidth + if t.cursorY > t.maxLine { + t.maxLine = t.cursorY + } + t.cursorX = t.cursorX % t.termWidth + + if places > 0 && t.cursorX == 0 { + // Normally terminals will advance the current position + // when writing a character. But that doesn't happen + // for the last character in a line. However, when + // writing a character (except a new line) that causes + // a line wrap, the position will be advanced two + // places. + // + // So, if we are stopping at the end of a line, we + // need to write a newline so that our cursor can be + // advanced to the next line. + t.outBuf = append(t.outBuf, '\r', '\n') + } +} + +func (t *Terminal) eraseNPreviousChars(n int) { + if n == 0 { + return + } + + if t.pos < n { + n = t.pos + } + t.pos -= n + t.moveCursorToPos(t.pos) + + copy(t.line[t.pos:], t.line[n+t.pos:]) + t.line = t.line[:len(t.line)-n] + if t.echo { + t.writeLine(t.line[t.pos:]) + for i := 0; i < n; i++ { + t.queue(space) + } + t.advanceCursor(n) + t.moveCursorToPos(t.pos) + } +} + +// countToLeftWord returns then number of characters from the cursor to the +// start of the previous word. +func (t *Terminal) countToLeftWord() int { + if t.pos == 0 { + return 0 + } + + pos := t.pos - 1 + for pos > 0 { + if t.line[pos] != ' ' { + break + } + pos-- + } + for pos > 0 { + if t.line[pos] == ' ' { + pos++ + break + } + pos-- + } + + return t.pos - pos +} + +// countToRightWord returns then number of characters from the cursor to the +// start of the next word. +func (t *Terminal) countToRightWord() int { + pos := t.pos + for pos < len(t.line) { + if t.line[pos] == ' ' { + break + } + pos++ + } + for pos < len(t.line) { + if t.line[pos] != ' ' { + break + } + pos++ + } + return pos - t.pos +} + +// visualLength returns the number of visible glyphs in s. +func visualLength(runes []rune) int { + inEscapeSeq := false + length := 0 + + for _, r := range runes { + switch { + case inEscapeSeq: + if (r >= 'a' && r <= 'z') || (r >= 'A' && r <= 'Z') { + inEscapeSeq = false + } + case r == '\x1b': + inEscapeSeq = true + default: + length++ + } + } + + return length +} + +// handleKey processes the given key and, optionally, returns a line of text +// that the user has entered. +func (t *Terminal) handleKey(key rune) (line string, ok bool) { + if t.pasteActive && key != keyEnter { + t.addKeyToLine(key) + return + } + + switch key { + case keyBackspace: + if t.pos == 0 { + return + } + t.eraseNPreviousChars(1) + case keyAltLeft: + // move left by a word. + t.pos -= t.countToLeftWord() + t.moveCursorToPos(t.pos) + case keyAltRight: + // move right by a word. + t.pos += t.countToRightWord() + t.moveCursorToPos(t.pos) + case keyLeft: + if t.pos == 0 { + return + } + t.pos-- + t.moveCursorToPos(t.pos) + case keyRight: + if t.pos == len(t.line) { + return + } + t.pos++ + t.moveCursorToPos(t.pos) + case keyHome: + if t.pos == 0 { + return + } + t.pos = 0 + t.moveCursorToPos(t.pos) + case keyEnd: + if t.pos == len(t.line) { + return + } + t.pos = len(t.line) + t.moveCursorToPos(t.pos) + case keyUp: + entry, ok := t.history.NthPreviousEntry(t.historyIndex + 1) + if !ok { + return "", false + } + if t.historyIndex == -1 { + t.historyPending = string(t.line) + } + t.historyIndex++ + runes := []rune(entry) + t.setLine(runes, len(runes)) + case keyDown: + switch t.historyIndex { + case -1: + return + case 0: + runes := []rune(t.historyPending) + t.setLine(runes, len(runes)) + t.historyIndex-- + default: + entry, ok := t.history.NthPreviousEntry(t.historyIndex - 1) + if ok { + t.historyIndex-- + runes := []rune(entry) + t.setLine(runes, len(runes)) + } + } + case keyEnter: + t.moveCursorToPos(len(t.line)) + t.queue([]rune("\r\n")) + line = string(t.line) + ok = true + t.line = t.line[:0] + t.pos = 0 + t.cursorX = 0 + t.cursorY = 0 + t.maxLine = 0 + case keyDeleteWord: + // Delete zero or more spaces and then one or more characters. + t.eraseNPreviousChars(t.countToLeftWord()) + case keyDeleteLine: + // Delete everything from the current cursor position to the + // end of line. + for i := t.pos; i < len(t.line); i++ { + t.queue(space) + t.advanceCursor(1) + } + t.line = t.line[:t.pos] + t.moveCursorToPos(t.pos) + case keyCtrlD: + // Erase the character under the current position. + // The EOF case when the line is empty is handled in + // readLine(). + if t.pos < len(t.line) { + t.pos++ + t.eraseNPreviousChars(1) + } + case keyCtrlU: + t.eraseNPreviousChars(t.pos) + case keyClearScreen: + // Erases the screen and moves the cursor to the home position. + t.queue([]rune("\x1b[2J\x1b[H")) + t.queue(t.prompt) + t.cursorX, t.cursorY = 0, 0 + t.advanceCursor(visualLength(t.prompt)) + t.setLine(t.line, t.pos) + default: + if t.AutoCompleteCallback != nil { + prefix := string(t.line[:t.pos]) + suffix := string(t.line[t.pos:]) + + t.lock.Unlock() + newLine, newPos, completeOk := t.AutoCompleteCallback(prefix+suffix, len(prefix), key) + t.lock.Lock() + + if completeOk { + t.setLine([]rune(newLine), utf8.RuneCount([]byte(newLine)[:newPos])) + return + } + } + if !isPrintable(key) { + return + } + if len(t.line) == maxLineLength { + return + } + t.addKeyToLine(key) + } + return +} + +// addKeyToLine inserts the given key at the current position in the current +// line. +func (t *Terminal) addKeyToLine(key rune) { + if len(t.line) == cap(t.line) { + newLine := make([]rune, len(t.line), 2*(1+len(t.line))) + copy(newLine, t.line) + t.line = newLine + } + t.line = t.line[:len(t.line)+1] + copy(t.line[t.pos+1:], t.line[t.pos:]) + t.line[t.pos] = key + if t.echo { + t.writeLine(t.line[t.pos:]) + } + t.pos++ + t.moveCursorToPos(t.pos) +} + +func (t *Terminal) writeLine(line []rune) { + for len(line) != 0 { + remainingOnLine := t.termWidth - t.cursorX + todo := len(line) + if todo > remainingOnLine { + todo = remainingOnLine + } + t.queue(line[:todo]) + t.advanceCursor(visualLength(line[:todo])) + line = line[todo:] + } +} + +// writeWithCRLF writes buf to w but replaces all occurrences of \n with \r\n. +func writeWithCRLF(w io.Writer, buf []byte) (n int, err error) { + for len(buf) > 0 { + i := bytes.IndexByte(buf, '\n') + todo := len(buf) + if i >= 0 { + todo = i + } + + var nn int + nn, err = w.Write(buf[:todo]) + n += nn + if err != nil { + return n, err + } + buf = buf[todo:] + + if i >= 0 { + if _, err = w.Write(crlf); err != nil { + return n, err + } + n++ + buf = buf[1:] + } + } + + return n, nil +} + +func (t *Terminal) Write(buf []byte) (n int, err error) { + t.lock.Lock() + defer t.lock.Unlock() + + if t.cursorX == 0 && t.cursorY == 0 { + // This is the easy case: there's nothing on the screen that we + // have to move out of the way. + return writeWithCRLF(t.c, buf) + } + + // We have a prompt and possibly user input on the screen. We + // have to clear it first. + t.move(0 /* up */, 0 /* down */, t.cursorX /* left */, 0 /* right */) + t.cursorX = 0 + t.clearLineToRight() + + for t.cursorY > 0 { + t.move(1 /* up */, 0, 0, 0) + t.cursorY-- + t.clearLineToRight() + } + + if _, err = t.c.Write(t.outBuf); err != nil { + return + } + t.outBuf = t.outBuf[:0] + + if n, err = writeWithCRLF(t.c, buf); err != nil { + return + } + + t.writeLine(t.prompt) + if t.echo { + t.writeLine(t.line) + } + + t.moveCursorToPos(t.pos) + + if _, err = t.c.Write(t.outBuf); err != nil { + return + } + t.outBuf = t.outBuf[:0] + return +} + +// ReadPassword temporarily changes the prompt and reads a password, without +// echo, from the terminal. +func (t *Terminal) ReadPassword(prompt string) (line string, err error) { + t.lock.Lock() + defer t.lock.Unlock() + + oldPrompt := t.prompt + t.prompt = []rune(prompt) + t.echo = false + + line, err = t.readLine() + + t.prompt = oldPrompt + t.echo = true + + return +} + +// ReadLine returns a line of input from the terminal. +func (t *Terminal) ReadLine() (line string, err error) { + t.lock.Lock() + defer t.lock.Unlock() + + return t.readLine() +} + +func (t *Terminal) readLine() (line string, err error) { + // t.lock must be held at this point + + if t.cursorX == 0 && t.cursorY == 0 { + t.writeLine(t.prompt) + t.c.Write(t.outBuf) + t.outBuf = t.outBuf[:0] + } + + lineIsPasted := t.pasteActive + + for { + rest := t.remainder + lineOk := false + for !lineOk { + var key rune + key, rest = bytesToKey(rest, t.pasteActive) + if key == utf8.RuneError { + break + } + if !t.pasteActive { + if key == keyCtrlD { + if len(t.line) == 0 { + return "", io.EOF + } + } + if key == keyPasteStart { + t.pasteActive = true + if len(t.line) == 0 { + lineIsPasted = true + } + continue + } + } else if key == keyPasteEnd { + t.pasteActive = false + continue + } + if !t.pasteActive { + lineIsPasted = false + } + line, lineOk = t.handleKey(key) + } + if len(rest) > 0 { + n := copy(t.inBuf[:], rest) + t.remainder = t.inBuf[:n] + } else { + t.remainder = nil + } + t.c.Write(t.outBuf) + t.outBuf = t.outBuf[:0] + if lineOk { + if t.echo { + t.historyIndex = -1 + t.history.Add(line) + } + if lineIsPasted { + err = ErrPasteIndicator + } + return + } + + // t.remainder is a slice at the beginning of t.inBuf + // containing a partial key sequence + readBuf := t.inBuf[len(t.remainder):] + var n int + + t.lock.Unlock() + n, err = t.c.Read(readBuf) + t.lock.Lock() + + if err != nil { + return + } + + t.remainder = t.inBuf[:n+len(t.remainder)] + } +} + +// SetPrompt sets the prompt to be used when reading subsequent lines. +func (t *Terminal) SetPrompt(prompt string) { + t.lock.Lock() + defer t.lock.Unlock() + + t.prompt = []rune(prompt) +} + +func (t *Terminal) clearAndRepaintLinePlusNPrevious(numPrevLines int) { + // Move cursor to column zero at the start of the line. + t.move(t.cursorY, 0, t.cursorX, 0) + t.cursorX, t.cursorY = 0, 0 + t.clearLineToRight() + for t.cursorY < numPrevLines { + // Move down a line + t.move(0, 1, 0, 0) + t.cursorY++ + t.clearLineToRight() + } + // Move back to beginning. + t.move(t.cursorY, 0, 0, 0) + t.cursorX, t.cursorY = 0, 0 + + t.queue(t.prompt) + t.advanceCursor(visualLength(t.prompt)) + t.writeLine(t.line) + t.moveCursorToPos(t.pos) +} + +func (t *Terminal) SetSize(width, height int) error { + t.lock.Lock() + defer t.lock.Unlock() + + if width == 0 { + width = 1 + } + + oldWidth := t.termWidth + t.termWidth, t.termHeight = width, height + + switch { + case width == oldWidth: + // If the width didn't change then nothing else needs to be + // done. + return nil + case len(t.line) == 0 && t.cursorX == 0 && t.cursorY == 0: + // If there is nothing on current line and no prompt printed, + // just do nothing + return nil + case width < oldWidth: + // Some terminals (e.g. xterm) will truncate lines that were + // too long when shinking. Others, (e.g. gnome-terminal) will + // attempt to wrap them. For the former, repainting t.maxLine + // works great, but that behaviour goes badly wrong in the case + // of the latter because they have doubled every full line. + + // We assume that we are working on a terminal that wraps lines + // and adjust the cursor position based on every previous line + // wrapping and turning into two. This causes the prompt on + // xterms to move upwards, which isn't great, but it avoids a + // huge mess with gnome-terminal. + if t.cursorX >= t.termWidth { + t.cursorX = t.termWidth - 1 + } + t.cursorY *= 2 + t.clearAndRepaintLinePlusNPrevious(t.maxLine * 2) + case width > oldWidth: + // If the terminal expands then our position calculations will + // be wrong in the future because we think the cursor is + // |t.pos| chars into the string, but there will be a gap at + // the end of any wrapped line. + // + // But the position will actually be correct until we move, so + // we can move back to the beginning and repaint everything. + t.clearAndRepaintLinePlusNPrevious(t.maxLine) + } + + _, err := t.c.Write(t.outBuf) + t.outBuf = t.outBuf[:0] + return err +} + +type pasteIndicatorError struct{} + +func (pasteIndicatorError) Error() string { + return "terminal: ErrPasteIndicator not correctly handled" +} + +// ErrPasteIndicator may be returned from ReadLine as the error, in addition +// to valid line data. It indicates that bracketed paste mode is enabled and +// that the returned line consists only of pasted data. Programs may wish to +// interpret pasted data more literally than typed data. +var ErrPasteIndicator = pasteIndicatorError{} + +// SetBracketedPasteMode requests that the terminal bracket paste operations +// with markers. Not all terminals support this but, if it is supported, then +// enabling this mode will stop any autocomplete callback from running due to +// pastes. Additionally, any lines that are completely pasted will be returned +// from ReadLine with the error set to ErrPasteIndicator. +func (t *Terminal) SetBracketedPasteMode(on bool) { + if on { + io.WriteString(t.c, "\x1b[?2004h") + } else { + io.WriteString(t.c, "\x1b[?2004l") + } +} + +// stRingBuffer is a ring buffer of strings. +type stRingBuffer struct { + // entries contains max elements. + entries []string + max int + // head contains the index of the element most recently added to the ring. + head int + // size contains the number of elements in the ring. + size int +} + +func (s *stRingBuffer) Add(a string) { + if s.entries == nil { + const defaultNumEntries = 100 + s.entries = make([]string, defaultNumEntries) + s.max = defaultNumEntries + } + + s.head = (s.head + 1) % s.max + s.entries[s.head] = a + if s.size < s.max { + s.size++ + } +} + +// NthPreviousEntry returns the value passed to the nth previous call to Add. +// If n is zero then the immediately prior value is returned, if one, then the +// next most recent, and so on. If such an element doesn't exist then ok is +// false. +func (s *stRingBuffer) NthPreviousEntry(n int) (value string, ok bool) { + if n >= s.size { + return "", false + } + index := s.head - n + if index < 0 { + index += s.max + } + return s.entries[index], true +} + +// readPasswordLine reads from reader until it finds \n or io.EOF. +// The slice returned does not include the \n. +// readPasswordLine also ignores any \r it finds. +func readPasswordLine(reader io.Reader) ([]byte, error) { + var buf [1]byte + var ret []byte + + for { + n, err := reader.Read(buf[:]) + if n > 0 { + switch buf[0] { + case '\n': + return ret, nil + case '\r': + // remove \r from passwords on Windows + default: + ret = append(ret, buf[0]) + } + continue + } + if err != nil { + if err == io.EOF && len(ret) > 0 { + return ret, nil + } + return ret, err + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/crypto/ssh/terminal/util.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/crypto/ssh/terminal/util.go new file mode 100644 index 00000000..731c89a2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/crypto/ssh/terminal/util.go @@ -0,0 +1,114 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build darwin dragonfly freebsd linux,!appengine netbsd openbsd + +// Package terminal provides support functions for dealing with terminals, as +// commonly found on UNIX systems. +// +// Putting a terminal into raw mode is the most common requirement: +// +// oldState, err := terminal.MakeRaw(0) +// if err != nil { +// panic(err) +// } +// defer terminal.Restore(0, oldState) +package terminal // import "golang.org/x/crypto/ssh/terminal" + +import ( + "golang.org/x/sys/unix" +) + +// State contains the state of a terminal. +type State struct { + termios unix.Termios +} + +// IsTerminal returns true if the given file descriptor is a terminal. +func IsTerminal(fd int) bool { + _, err := unix.IoctlGetTermios(fd, ioctlReadTermios) + return err == nil +} + +// MakeRaw put the terminal connected to the given file descriptor into raw +// mode and returns the previous state of the terminal so that it can be +// restored. +func MakeRaw(fd int) (*State, error) { + termios, err := unix.IoctlGetTermios(fd, ioctlReadTermios) + if err != nil { + return nil, err + } + + oldState := State{termios: *termios} + + // This attempts to replicate the behaviour documented for cfmakeraw in + // the termios(3) manpage. + termios.Iflag &^= unix.IGNBRK | unix.BRKINT | unix.PARMRK | unix.ISTRIP | unix.INLCR | unix.IGNCR | unix.ICRNL | unix.IXON + termios.Oflag &^= unix.OPOST + termios.Lflag &^= unix.ECHO | unix.ECHONL | unix.ICANON | unix.ISIG | unix.IEXTEN + termios.Cflag &^= unix.CSIZE | unix.PARENB + termios.Cflag |= unix.CS8 + termios.Cc[unix.VMIN] = 1 + termios.Cc[unix.VTIME] = 0 + if err := unix.IoctlSetTermios(fd, ioctlWriteTermios, termios); err != nil { + return nil, err + } + + return &oldState, nil +} + +// GetState returns the current state of a terminal which may be useful to +// restore the terminal after a signal. +func GetState(fd int) (*State, error) { + termios, err := unix.IoctlGetTermios(fd, ioctlReadTermios) + if err != nil { + return nil, err + } + + return &State{termios: *termios}, nil +} + +// Restore restores the terminal connected to the given file descriptor to a +// previous state. +func Restore(fd int, state *State) error { + return unix.IoctlSetTermios(fd, ioctlWriteTermios, &state.termios) +} + +// GetSize returns the dimensions of the given terminal. +func GetSize(fd int) (width, height int, err error) { + ws, err := unix.IoctlGetWinsize(fd, unix.TIOCGWINSZ) + if err != nil { + return -1, -1, err + } + return int(ws.Col), int(ws.Row), nil +} + +// passwordReader is an io.Reader that reads from a specific file descriptor. +type passwordReader int + +func (r passwordReader) Read(buf []byte) (int, error) { + return unix.Read(int(r), buf) +} + +// ReadPassword reads a line of input from a terminal without local echo. This +// is commonly used for inputting passwords and other sensitive data. The slice +// returned does not include the \n. +func ReadPassword(fd int) ([]byte, error) { + termios, err := unix.IoctlGetTermios(fd, ioctlReadTermios) + if err != nil { + return nil, err + } + + newState := *termios + newState.Lflag &^= unix.ECHO + newState.Lflag |= unix.ICANON | unix.ISIG + newState.Iflag |= unix.ICRNL + if err := unix.IoctlSetTermios(fd, ioctlWriteTermios, &newState); err != nil { + return nil, err + } + + defer unix.IoctlSetTermios(fd, ioctlWriteTermios, termios) + + return readPasswordLine(passwordReader(fd)) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/crypto/ssh/terminal/util_bsd.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/crypto/ssh/terminal/util_bsd.go new file mode 100644 index 00000000..cb23a590 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/crypto/ssh/terminal/util_bsd.go @@ -0,0 +1,12 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build darwin dragonfly freebsd netbsd openbsd + +package terminal + +import "golang.org/x/sys/unix" + +const ioctlReadTermios = unix.TIOCGETA +const ioctlWriteTermios = unix.TIOCSETA diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/crypto/ssh/terminal/util_linux.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/crypto/ssh/terminal/util_linux.go new file mode 100644 index 00000000..5fadfe8a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/crypto/ssh/terminal/util_linux.go @@ -0,0 +1,10 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package terminal + +import "golang.org/x/sys/unix" + +const ioctlReadTermios = unix.TCGETS +const ioctlWriteTermios = unix.TCSETS diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/crypto/ssh/terminal/util_plan9.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/crypto/ssh/terminal/util_plan9.go new file mode 100644 index 00000000..799f049f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/crypto/ssh/terminal/util_plan9.go @@ -0,0 +1,58 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package terminal provides support functions for dealing with terminals, as +// commonly found on UNIX systems. +// +// Putting a terminal into raw mode is the most common requirement: +// +// oldState, err := terminal.MakeRaw(0) +// if err != nil { +// panic(err) +// } +// defer terminal.Restore(0, oldState) +package terminal + +import ( + "fmt" + "runtime" +) + +type State struct{} + +// IsTerminal returns true if the given file descriptor is a terminal. +func IsTerminal(fd int) bool { + return false +} + +// MakeRaw put the terminal connected to the given file descriptor into raw +// mode and returns the previous state of the terminal so that it can be +// restored. +func MakeRaw(fd int) (*State, error) { + return nil, fmt.Errorf("terminal: MakeRaw not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) +} + +// GetState returns the current state of a terminal which may be useful to +// restore the terminal after a signal. +func GetState(fd int) (*State, error) { + return nil, fmt.Errorf("terminal: GetState not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) +} + +// Restore restores the terminal connected to the given file descriptor to a +// previous state. +func Restore(fd int, state *State) error { + return fmt.Errorf("terminal: Restore not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) +} + +// GetSize returns the dimensions of the given terminal. +func GetSize(fd int) (width, height int, err error) { + return 0, 0, fmt.Errorf("terminal: GetSize not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) +} + +// ReadPassword reads a line of input from a terminal without local echo. This +// is commonly used for inputting passwords and other sensitive data. The slice +// returned does not include the \n. +func ReadPassword(fd int) ([]byte, error) { + return nil, fmt.Errorf("terminal: ReadPassword not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/crypto/ssh/terminal/util_solaris.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/crypto/ssh/terminal/util_solaris.go new file mode 100644 index 00000000..9e41b9f4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/crypto/ssh/terminal/util_solaris.go @@ -0,0 +1,124 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build solaris + +package terminal // import "golang.org/x/crypto/ssh/terminal" + +import ( + "golang.org/x/sys/unix" + "io" + "syscall" +) + +// State contains the state of a terminal. +type State struct { + termios unix.Termios +} + +// IsTerminal returns true if the given file descriptor is a terminal. +func IsTerminal(fd int) bool { + _, err := unix.IoctlGetTermio(fd, unix.TCGETA) + return err == nil +} + +// ReadPassword reads a line of input from a terminal without local echo. This +// is commonly used for inputting passwords and other sensitive data. The slice +// returned does not include the \n. +func ReadPassword(fd int) ([]byte, error) { + // see also: http://src.illumos.org/source/xref/illumos-gate/usr/src/lib/libast/common/uwin/getpass.c + val, err := unix.IoctlGetTermios(fd, unix.TCGETS) + if err != nil { + return nil, err + } + oldState := *val + + newState := oldState + newState.Lflag &^= syscall.ECHO + newState.Lflag |= syscall.ICANON | syscall.ISIG + newState.Iflag |= syscall.ICRNL + err = unix.IoctlSetTermios(fd, unix.TCSETS, &newState) + if err != nil { + return nil, err + } + + defer unix.IoctlSetTermios(fd, unix.TCSETS, &oldState) + + var buf [16]byte + var ret []byte + for { + n, err := syscall.Read(fd, buf[:]) + if err != nil { + return nil, err + } + if n == 0 { + if len(ret) == 0 { + return nil, io.EOF + } + break + } + if buf[n-1] == '\n' { + n-- + } + ret = append(ret, buf[:n]...) + if n < len(buf) { + break + } + } + + return ret, nil +} + +// MakeRaw puts the terminal connected to the given file descriptor into raw +// mode and returns the previous state of the terminal so that it can be +// restored. +// see http://cr.illumos.org/~webrev/andy_js/1060/ +func MakeRaw(fd int) (*State, error) { + termios, err := unix.IoctlGetTermios(fd, unix.TCGETS) + if err != nil { + return nil, err + } + + oldState := State{termios: *termios} + + termios.Iflag &^= unix.IGNBRK | unix.BRKINT | unix.PARMRK | unix.ISTRIP | unix.INLCR | unix.IGNCR | unix.ICRNL | unix.IXON + termios.Oflag &^= unix.OPOST + termios.Lflag &^= unix.ECHO | unix.ECHONL | unix.ICANON | unix.ISIG | unix.IEXTEN + termios.Cflag &^= unix.CSIZE | unix.PARENB + termios.Cflag |= unix.CS8 + termios.Cc[unix.VMIN] = 1 + termios.Cc[unix.VTIME] = 0 + + if err := unix.IoctlSetTermios(fd, unix.TCSETS, termios); err != nil { + return nil, err + } + + return &oldState, nil +} + +// Restore restores the terminal connected to the given file descriptor to a +// previous state. +func Restore(fd int, oldState *State) error { + return unix.IoctlSetTermios(fd, unix.TCSETS, &oldState.termios) +} + +// GetState returns the current state of a terminal which may be useful to +// restore the terminal after a signal. +func GetState(fd int) (*State, error) { + termios, err := unix.IoctlGetTermios(fd, unix.TCGETS) + if err != nil { + return nil, err + } + + return &State{termios: *termios}, nil +} + +// GetSize returns the dimensions of the given terminal. +func GetSize(fd int) (width, height int, err error) { + ws, err := unix.IoctlGetWinsize(fd, unix.TIOCGWINSZ) + if err != nil { + return 0, 0, err + } + return int(ws.Col), int(ws.Row), nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/crypto/ssh/terminal/util_windows.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/crypto/ssh/terminal/util_windows.go new file mode 100644 index 00000000..8618955d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/crypto/ssh/terminal/util_windows.go @@ -0,0 +1,103 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build windows + +// Package terminal provides support functions for dealing with terminals, as +// commonly found on UNIX systems. +// +// Putting a terminal into raw mode is the most common requirement: +// +// oldState, err := terminal.MakeRaw(0) +// if err != nil { +// panic(err) +// } +// defer terminal.Restore(0, oldState) +package terminal + +import ( + "os" + + "golang.org/x/sys/windows" +) + +type State struct { + mode uint32 +} + +// IsTerminal returns true if the given file descriptor is a terminal. +func IsTerminal(fd int) bool { + var st uint32 + err := windows.GetConsoleMode(windows.Handle(fd), &st) + return err == nil +} + +// MakeRaw put the terminal connected to the given file descriptor into raw +// mode and returns the previous state of the terminal so that it can be +// restored. +func MakeRaw(fd int) (*State, error) { + var st uint32 + if err := windows.GetConsoleMode(windows.Handle(fd), &st); err != nil { + return nil, err + } + raw := st &^ (windows.ENABLE_ECHO_INPUT | windows.ENABLE_PROCESSED_INPUT | windows.ENABLE_LINE_INPUT | windows.ENABLE_PROCESSED_OUTPUT) + if err := windows.SetConsoleMode(windows.Handle(fd), raw); err != nil { + return nil, err + } + return &State{st}, nil +} + +// GetState returns the current state of a terminal which may be useful to +// restore the terminal after a signal. +func GetState(fd int) (*State, error) { + var st uint32 + if err := windows.GetConsoleMode(windows.Handle(fd), &st); err != nil { + return nil, err + } + return &State{st}, nil +} + +// Restore restores the terminal connected to the given file descriptor to a +// previous state. +func Restore(fd int, state *State) error { + return windows.SetConsoleMode(windows.Handle(fd), state.mode) +} + +// GetSize returns the dimensions of the given terminal. +func GetSize(fd int) (width, height int, err error) { + var info windows.ConsoleScreenBufferInfo + if err := windows.GetConsoleScreenBufferInfo(windows.Handle(fd), &info); err != nil { + return 0, 0, err + } + return int(info.Size.X), int(info.Size.Y), nil +} + +// ReadPassword reads a line of input from a terminal without local echo. This +// is commonly used for inputting passwords and other sensitive data. The slice +// returned does not include the \n. +func ReadPassword(fd int) ([]byte, error) { + var st uint32 + if err := windows.GetConsoleMode(windows.Handle(fd), &st); err != nil { + return nil, err + } + old := st + + st &^= (windows.ENABLE_ECHO_INPUT) + st |= (windows.ENABLE_PROCESSED_INPUT | windows.ENABLE_LINE_INPUT | windows.ENABLE_PROCESSED_OUTPUT) + if err := windows.SetConsoleMode(windows.Handle(fd), st); err != nil { + return nil, err + } + + defer windows.SetConsoleMode(windows.Handle(fd), old) + + var h windows.Handle + p, _ := windows.GetCurrentProcess() + if err := windows.DuplicateHandle(p, windows.Handle(fd), p, &h, 0, false, windows.DUPLICATE_SAME_ACCESS); err != nil { + return nil, err + } + + f := os.NewFile(uintptr(h), "stdin") + defer f.Close() + return readPasswordLine(f) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/net/AUTHORS b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/net/AUTHORS new file mode 100644 index 00000000..15167cd7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/net/AUTHORS @@ -0,0 +1,3 @@ +# This source code refers to The Go Authors for copyright purposes. +# The master list of authors is in the main Go distribution, +# visible at http://tip.golang.org/AUTHORS. diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/net/CONTRIBUTORS b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/net/CONTRIBUTORS new file mode 100644 index 00000000..1c4577e9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/net/CONTRIBUTORS @@ -0,0 +1,3 @@ +# This source code was written by the Go contributors. +# The master list of contributors is in the main Go distribution, +# visible at http://tip.golang.org/CONTRIBUTORS. diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/net/LICENSE b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/net/LICENSE new file mode 100644 index 00000000..6a66aea5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/net/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2009 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/net/PATENTS b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/net/PATENTS new file mode 100644 index 00000000..73309904 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/net/PATENTS @@ -0,0 +1,22 @@ +Additional IP Rights Grant (Patents) + +"This implementation" means the copyrightable works distributed by +Google as part of the Go project. + +Google hereby grants to You a perpetual, worldwide, non-exclusive, +no-charge, royalty-free, irrevocable (except as stated in this section) +patent license to make, have made, use, offer to sell, sell, import, +transfer and otherwise run, modify and propagate the contents of this +implementation of Go, where such license applies only to those patent +claims, both currently owned or controlled by Google and acquired in +the future, licensable by Google that are necessarily infringed by this +implementation of Go. This grant does not include claims that would be +infringed only as a consequence of further modification of this +implementation. If you or your agent or exclusive licensee institute or +order or agree to the institution of patent litigation against any +entity (including a cross-claim or counterclaim in a lawsuit) alleging +that this implementation of Go or any code incorporated within this +implementation of Go constitutes direct or contributory patent +infringement, or inducement of patent infringement, then any patent +rights granted to you under this License for this implementation of Go +shall terminate as of the date such litigation is filed. diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/net/context/context.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/net/context/context.go new file mode 100644 index 00000000..a3c021d3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/net/context/context.go @@ -0,0 +1,56 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package context defines the Context type, which carries deadlines, +// cancelation signals, and other request-scoped values across API boundaries +// and between processes. +// As of Go 1.7 this package is available in the standard library under the +// name context. https://golang.org/pkg/context. +// +// Incoming requests to a server should create a Context, and outgoing calls to +// servers should accept a Context. The chain of function calls between must +// propagate the Context, optionally replacing it with a modified copy created +// using WithDeadline, WithTimeout, WithCancel, or WithValue. +// +// Programs that use Contexts should follow these rules to keep interfaces +// consistent across packages and enable static analysis tools to check context +// propagation: +// +// Do not store Contexts inside a struct type; instead, pass a Context +// explicitly to each function that needs it. The Context should be the first +// parameter, typically named ctx: +// +// func DoSomething(ctx context.Context, arg Arg) error { +// // ... use ctx ... +// } +// +// Do not pass a nil Context, even if a function permits it. Pass context.TODO +// if you are unsure about which Context to use. +// +// Use context Values only for request-scoped data that transits processes and +// APIs, not for passing optional parameters to functions. +// +// The same Context may be passed to functions running in different goroutines; +// Contexts are safe for simultaneous use by multiple goroutines. +// +// See http://blog.golang.org/context for example code for a server that uses +// Contexts. +package context // import "golang.org/x/net/context" + +// Background returns a non-nil, empty Context. It is never canceled, has no +// values, and has no deadline. It is typically used by the main function, +// initialization, and tests, and as the top-level Context for incoming +// requests. +func Background() Context { + return background +} + +// TODO returns a non-nil, empty Context. Code should use context.TODO when +// it's unclear which Context to use or it is not yet available (because the +// surrounding function has not yet been extended to accept a Context +// parameter). TODO is recognized by static analysis tools that determine +// whether Contexts are propagated correctly in a program. +func TODO() Context { + return todo +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/net/context/go17.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/net/context/go17.go new file mode 100644 index 00000000..d20f52b7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/net/context/go17.go @@ -0,0 +1,72 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build go1.7 + +package context + +import ( + "context" // standard library's context, as of Go 1.7 + "time" +) + +var ( + todo = context.TODO() + background = context.Background() +) + +// Canceled is the error returned by Context.Err when the context is canceled. +var Canceled = context.Canceled + +// DeadlineExceeded is the error returned by Context.Err when the context's +// deadline passes. +var DeadlineExceeded = context.DeadlineExceeded + +// WithCancel returns a copy of parent with a new Done channel. The returned +// context's Done channel is closed when the returned cancel function is called +// or when the parent context's Done channel is closed, whichever happens first. +// +// Canceling this context releases resources associated with it, so code should +// call cancel as soon as the operations running in this Context complete. +func WithCancel(parent Context) (ctx Context, cancel CancelFunc) { + ctx, f := context.WithCancel(parent) + return ctx, CancelFunc(f) +} + +// WithDeadline returns a copy of the parent context with the deadline adjusted +// to be no later than d. If the parent's deadline is already earlier than d, +// WithDeadline(parent, d) is semantically equivalent to parent. The returned +// context's Done channel is closed when the deadline expires, when the returned +// cancel function is called, or when the parent context's Done channel is +// closed, whichever happens first. +// +// Canceling this context releases resources associated with it, so code should +// call cancel as soon as the operations running in this Context complete. +func WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc) { + ctx, f := context.WithDeadline(parent, deadline) + return ctx, CancelFunc(f) +} + +// WithTimeout returns WithDeadline(parent, time.Now().Add(timeout)). +// +// Canceling this context releases resources associated with it, so code should +// call cancel as soon as the operations running in this Context complete: +// +// func slowOperationWithTimeout(ctx context.Context) (Result, error) { +// ctx, cancel := context.WithTimeout(ctx, 100*time.Millisecond) +// defer cancel() // releases resources if slowOperation completes before timeout elapses +// return slowOperation(ctx) +// } +func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc) { + return WithDeadline(parent, time.Now().Add(timeout)) +} + +// WithValue returns a copy of parent in which the value associated with key is +// val. +// +// Use context Values only for request-scoped data that transits processes and +// APIs, not for passing optional parameters to functions. +func WithValue(parent Context, key interface{}, val interface{}) Context { + return context.WithValue(parent, key, val) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/net/context/go19.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/net/context/go19.go new file mode 100644 index 00000000..d88bd1db --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/net/context/go19.go @@ -0,0 +1,20 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build go1.9 + +package context + +import "context" // standard library's context, as of Go 1.7 + +// A Context carries a deadline, a cancelation signal, and other values across +// API boundaries. +// +// Context's methods may be called by multiple goroutines simultaneously. +type Context = context.Context + +// A CancelFunc tells an operation to abandon its work. +// A CancelFunc does not wait for the work to stop. +// After the first call, subsequent calls to a CancelFunc do nothing. +type CancelFunc = context.CancelFunc diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/net/context/pre_go17.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/net/context/pre_go17.go new file mode 100644 index 00000000..0f35592d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/net/context/pre_go17.go @@ -0,0 +1,300 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !go1.7 + +package context + +import ( + "errors" + "fmt" + "sync" + "time" +) + +// An emptyCtx is never canceled, has no values, and has no deadline. It is not +// struct{}, since vars of this type must have distinct addresses. +type emptyCtx int + +func (*emptyCtx) Deadline() (deadline time.Time, ok bool) { + return +} + +func (*emptyCtx) Done() <-chan struct{} { + return nil +} + +func (*emptyCtx) Err() error { + return nil +} + +func (*emptyCtx) Value(key interface{}) interface{} { + return nil +} + +func (e *emptyCtx) String() string { + switch e { + case background: + return "context.Background" + case todo: + return "context.TODO" + } + return "unknown empty Context" +} + +var ( + background = new(emptyCtx) + todo = new(emptyCtx) +) + +// Canceled is the error returned by Context.Err when the context is canceled. +var Canceled = errors.New("context canceled") + +// DeadlineExceeded is the error returned by Context.Err when the context's +// deadline passes. +var DeadlineExceeded = errors.New("context deadline exceeded") + +// WithCancel returns a copy of parent with a new Done channel. The returned +// context's Done channel is closed when the returned cancel function is called +// or when the parent context's Done channel is closed, whichever happens first. +// +// Canceling this context releases resources associated with it, so code should +// call cancel as soon as the operations running in this Context complete. +func WithCancel(parent Context) (ctx Context, cancel CancelFunc) { + c := newCancelCtx(parent) + propagateCancel(parent, c) + return c, func() { c.cancel(true, Canceled) } +} + +// newCancelCtx returns an initialized cancelCtx. +func newCancelCtx(parent Context) *cancelCtx { + return &cancelCtx{ + Context: parent, + done: make(chan struct{}), + } +} + +// propagateCancel arranges for child to be canceled when parent is. +func propagateCancel(parent Context, child canceler) { + if parent.Done() == nil { + return // parent is never canceled + } + if p, ok := parentCancelCtx(parent); ok { + p.mu.Lock() + if p.err != nil { + // parent has already been canceled + child.cancel(false, p.err) + } else { + if p.children == nil { + p.children = make(map[canceler]bool) + } + p.children[child] = true + } + p.mu.Unlock() + } else { + go func() { + select { + case <-parent.Done(): + child.cancel(false, parent.Err()) + case <-child.Done(): + } + }() + } +} + +// parentCancelCtx follows a chain of parent references until it finds a +// *cancelCtx. This function understands how each of the concrete types in this +// package represents its parent. +func parentCancelCtx(parent Context) (*cancelCtx, bool) { + for { + switch c := parent.(type) { + case *cancelCtx: + return c, true + case *timerCtx: + return c.cancelCtx, true + case *valueCtx: + parent = c.Context + default: + return nil, false + } + } +} + +// removeChild removes a context from its parent. +func removeChild(parent Context, child canceler) { + p, ok := parentCancelCtx(parent) + if !ok { + return + } + p.mu.Lock() + if p.children != nil { + delete(p.children, child) + } + p.mu.Unlock() +} + +// A canceler is a context type that can be canceled directly. The +// implementations are *cancelCtx and *timerCtx. +type canceler interface { + cancel(removeFromParent bool, err error) + Done() <-chan struct{} +} + +// A cancelCtx can be canceled. When canceled, it also cancels any children +// that implement canceler. +type cancelCtx struct { + Context + + done chan struct{} // closed by the first cancel call. + + mu sync.Mutex + children map[canceler]bool // set to nil by the first cancel call + err error // set to non-nil by the first cancel call +} + +func (c *cancelCtx) Done() <-chan struct{} { + return c.done +} + +func (c *cancelCtx) Err() error { + c.mu.Lock() + defer c.mu.Unlock() + return c.err +} + +func (c *cancelCtx) String() string { + return fmt.Sprintf("%v.WithCancel", c.Context) +} + +// cancel closes c.done, cancels each of c's children, and, if +// removeFromParent is true, removes c from its parent's children. +func (c *cancelCtx) cancel(removeFromParent bool, err error) { + if err == nil { + panic("context: internal error: missing cancel error") + } + c.mu.Lock() + if c.err != nil { + c.mu.Unlock() + return // already canceled + } + c.err = err + close(c.done) + for child := range c.children { + // NOTE: acquiring the child's lock while holding parent's lock. + child.cancel(false, err) + } + c.children = nil + c.mu.Unlock() + + if removeFromParent { + removeChild(c.Context, c) + } +} + +// WithDeadline returns a copy of the parent context with the deadline adjusted +// to be no later than d. If the parent's deadline is already earlier than d, +// WithDeadline(parent, d) is semantically equivalent to parent. The returned +// context's Done channel is closed when the deadline expires, when the returned +// cancel function is called, or when the parent context's Done channel is +// closed, whichever happens first. +// +// Canceling this context releases resources associated with it, so code should +// call cancel as soon as the operations running in this Context complete. +func WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc) { + if cur, ok := parent.Deadline(); ok && cur.Before(deadline) { + // The current deadline is already sooner than the new one. + return WithCancel(parent) + } + c := &timerCtx{ + cancelCtx: newCancelCtx(parent), + deadline: deadline, + } + propagateCancel(parent, c) + d := deadline.Sub(time.Now()) + if d <= 0 { + c.cancel(true, DeadlineExceeded) // deadline has already passed + return c, func() { c.cancel(true, Canceled) } + } + c.mu.Lock() + defer c.mu.Unlock() + if c.err == nil { + c.timer = time.AfterFunc(d, func() { + c.cancel(true, DeadlineExceeded) + }) + } + return c, func() { c.cancel(true, Canceled) } +} + +// A timerCtx carries a timer and a deadline. It embeds a cancelCtx to +// implement Done and Err. It implements cancel by stopping its timer then +// delegating to cancelCtx.cancel. +type timerCtx struct { + *cancelCtx + timer *time.Timer // Under cancelCtx.mu. + + deadline time.Time +} + +func (c *timerCtx) Deadline() (deadline time.Time, ok bool) { + return c.deadline, true +} + +func (c *timerCtx) String() string { + return fmt.Sprintf("%v.WithDeadline(%s [%s])", c.cancelCtx.Context, c.deadline, c.deadline.Sub(time.Now())) +} + +func (c *timerCtx) cancel(removeFromParent bool, err error) { + c.cancelCtx.cancel(false, err) + if removeFromParent { + // Remove this timerCtx from its parent cancelCtx's children. + removeChild(c.cancelCtx.Context, c) + } + c.mu.Lock() + if c.timer != nil { + c.timer.Stop() + c.timer = nil + } + c.mu.Unlock() +} + +// WithTimeout returns WithDeadline(parent, time.Now().Add(timeout)). +// +// Canceling this context releases resources associated with it, so code should +// call cancel as soon as the operations running in this Context complete: +// +// func slowOperationWithTimeout(ctx context.Context) (Result, error) { +// ctx, cancel := context.WithTimeout(ctx, 100*time.Millisecond) +// defer cancel() // releases resources if slowOperation completes before timeout elapses +// return slowOperation(ctx) +// } +func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc) { + return WithDeadline(parent, time.Now().Add(timeout)) +} + +// WithValue returns a copy of parent in which the value associated with key is +// val. +// +// Use context Values only for request-scoped data that transits processes and +// APIs, not for passing optional parameters to functions. +func WithValue(parent Context, key interface{}, val interface{}) Context { + return &valueCtx{parent, key, val} +} + +// A valueCtx carries a key-value pair. It implements Value for that key and +// delegates all other calls to the embedded Context. +type valueCtx struct { + Context + key, val interface{} +} + +func (c *valueCtx) String() string { + return fmt.Sprintf("%v.WithValue(%#v, %#v)", c.Context, c.key, c.val) +} + +func (c *valueCtx) Value(key interface{}) interface{} { + if c.key == key { + return c.val + } + return c.Context.Value(key) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/net/context/pre_go19.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/net/context/pre_go19.go new file mode 100644 index 00000000..b105f80b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/net/context/pre_go19.go @@ -0,0 +1,109 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !go1.9 + +package context + +import "time" + +// A Context carries a deadline, a cancelation signal, and other values across +// API boundaries. +// +// Context's methods may be called by multiple goroutines simultaneously. +type Context interface { + // Deadline returns the time when work done on behalf of this context + // should be canceled. Deadline returns ok==false when no deadline is + // set. Successive calls to Deadline return the same results. + Deadline() (deadline time.Time, ok bool) + + // Done returns a channel that's closed when work done on behalf of this + // context should be canceled. Done may return nil if this context can + // never be canceled. Successive calls to Done return the same value. + // + // WithCancel arranges for Done to be closed when cancel is called; + // WithDeadline arranges for Done to be closed when the deadline + // expires; WithTimeout arranges for Done to be closed when the timeout + // elapses. + // + // Done is provided for use in select statements: + // + // // Stream generates values with DoSomething and sends them to out + // // until DoSomething returns an error or ctx.Done is closed. + // func Stream(ctx context.Context, out chan<- Value) error { + // for { + // v, err := DoSomething(ctx) + // if err != nil { + // return err + // } + // select { + // case <-ctx.Done(): + // return ctx.Err() + // case out <- v: + // } + // } + // } + // + // See http://blog.golang.org/pipelines for more examples of how to use + // a Done channel for cancelation. + Done() <-chan struct{} + + // Err returns a non-nil error value after Done is closed. Err returns + // Canceled if the context was canceled or DeadlineExceeded if the + // context's deadline passed. No other values for Err are defined. + // After Done is closed, successive calls to Err return the same value. + Err() error + + // Value returns the value associated with this context for key, or nil + // if no value is associated with key. Successive calls to Value with + // the same key returns the same result. + // + // Use context values only for request-scoped data that transits + // processes and API boundaries, not for passing optional parameters to + // functions. + // + // A key identifies a specific value in a Context. Functions that wish + // to store values in Context typically allocate a key in a global + // variable then use that key as the argument to context.WithValue and + // Context.Value. A key can be any type that supports equality; + // packages should define keys as an unexported type to avoid + // collisions. + // + // Packages that define a Context key should provide type-safe accessors + // for the values stores using that key: + // + // // Package user defines a User type that's stored in Contexts. + // package user + // + // import "golang.org/x/net/context" + // + // // User is the type of value stored in the Contexts. + // type User struct {...} + // + // // key is an unexported type for keys defined in this package. + // // This prevents collisions with keys defined in other packages. + // type key int + // + // // userKey is the key for user.User values in Contexts. It is + // // unexported; clients use user.NewContext and user.FromContext + // // instead of using this key directly. + // var userKey key = 0 + // + // // NewContext returns a new Context that carries value u. + // func NewContext(ctx context.Context, u *User) context.Context { + // return context.WithValue(ctx, userKey, u) + // } + // + // // FromContext returns the User value stored in ctx, if any. + // func FromContext(ctx context.Context) (*User, bool) { + // u, ok := ctx.Value(userKey).(*User) + // return u, ok + // } + Value(key interface{}) interface{} +} + +// A CancelFunc tells an operation to abandon its work. +// A CancelFunc does not wait for the work to stop. +// After the first call, subsequent calls to a CancelFunc do nothing. +type CancelFunc func() diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/AUTHORS b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/AUTHORS new file mode 100644 index 00000000..15167cd7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/AUTHORS @@ -0,0 +1,3 @@ +# This source code refers to The Go Authors for copyright purposes. +# The master list of authors is in the main Go distribution, +# visible at http://tip.golang.org/AUTHORS. diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/CONTRIBUTORS b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/CONTRIBUTORS new file mode 100644 index 00000000..1c4577e9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/CONTRIBUTORS @@ -0,0 +1,3 @@ +# This source code was written by the Go contributors. +# The master list of contributors is in the main Go distribution, +# visible at http://tip.golang.org/CONTRIBUTORS. diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/LICENSE b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/LICENSE new file mode 100644 index 00000000..6a66aea5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2009 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/PATENTS b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/PATENTS new file mode 100644 index 00000000..73309904 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/PATENTS @@ -0,0 +1,22 @@ +Additional IP Rights Grant (Patents) + +"This implementation" means the copyrightable works distributed by +Google as part of the Go project. + +Google hereby grants to You a perpetual, worldwide, non-exclusive, +no-charge, royalty-free, irrevocable (except as stated in this section) +patent license to make, have made, use, offer to sell, sell, import, +transfer and otherwise run, modify and propagate the contents of this +implementation of Go, where such license applies only to those patent +claims, both currently owned or controlled by Google and acquired in +the future, licensable by Google that are necessarily infringed by this +implementation of Go. This grant does not include claims that would be +infringed only as a consequence of further modification of this +implementation. If you or your agent or exclusive licensee institute or +order or agree to the institution of patent litigation against any +entity (including a cross-claim or counterclaim in a lawsuit) alleging +that this implementation of Go or any code incorporated within this +implementation of Go constitutes direct or contributory patent +infringement, or inducement of patent infringement, then any patent +rights granted to you under this License for this implementation of Go +shall terminate as of the date such litigation is filed. diff --git a/vendor/golang.org/x/sys/unix/.gitignore b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/.gitignore similarity index 100% rename from vendor/golang.org/x/sys/unix/.gitignore rename to vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/.gitignore diff --git a/vendor/golang.org/x/sys/unix/README.md b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/README.md similarity index 92% rename from vendor/golang.org/x/sys/unix/README.md rename to vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/README.md index eb2f78ae..bc6f6031 100644 --- a/vendor/golang.org/x/sys/unix/README.md +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/README.md @@ -14,7 +14,7 @@ migrating the build system to use containers so the builds are reproducible. This is being done on an OS-by-OS basis. Please update this documentation as components of the build system change. -### Old Build System (currently for `GOOS != "linux"`) +### Old Build System (currently for `GOOS != "Linux" || GOARCH == "sparc64"`) The old build system generates the Go files based on the C header files present on your system. This means that files @@ -32,9 +32,9 @@ To build the files for your current OS and architecture, make sure GOOS and GOARCH are set correctly and run `mkall.sh`. This will generate the files for your specific system. Running `mkall.sh -n` shows the commands that will be run. -Requirements: bash, go +Requirements: bash, perl, go -### New Build System (currently for `GOOS == "linux"`) +### New Build System (currently for `GOOS == "Linux" && GOARCH != "sparc64"`) The new build system uses a Docker container to generate the go files directly from source checkouts of the kernel and various system libraries. This means @@ -52,14 +52,14 @@ system and have your GOOS and GOARCH set accordingly. Running `mkall.sh` will then generate all of the files for all of the GOOS/GOARCH pairs in the new build system. Running `mkall.sh -n` shows the commands that will be run. -Requirements: bash, go, docker +Requirements: bash, perl, go, docker ## Component files This section describes the various files used in the code generation process. It also contains instructions on how to modify these files to add a new architecture/OS or to add additional syscalls, types, or constants. Note that -if you are using the new build system, the scripts/programs cannot be called normally. +if you are using the new build system, the scripts cannot be called normally. They must be called from within the docker container. ### asm files @@ -81,8 +81,8 @@ each GOOS/GOARCH pair. ### mksysnum -Mksysnum is a Go program located at `${GOOS}/mksysnum.go` (or `mksysnum_${GOOS}.go` -for the old system). This program takes in a list of header files containing the +Mksysnum is a script located at `${GOOS}/mksysnum.pl` (or `mksysnum_${GOOS}.pl` +for the old system). This script takes in a list of header files containing the syscall number declarations and parses them to produce the corresponding list of Go numeric constants. See `zsysnum_${GOOS}_${GOARCH}.go` for the generated constants. @@ -92,14 +92,14 @@ new installation of the target OS (or updating the source checkouts for the new build system). However, depending on the OS, you make need to update the parsing in mksysnum. -### mksyscall.go +### mksyscall.pl The `syscall.go`, `syscall_${GOOS}.go`, `syscall_${GOOS}_${GOARCH}.go` are hand-written Go files which implement system calls (for unix, the specific OS, or the specific OS/Architecture pair respectively) that need special handling and list `//sys` comments giving prototypes for ones that can be generated. -The mksyscall.go program takes the `//sys` and `//sysnb` comments and converts +The mksyscall.pl script takes the `//sys` and `//sysnb` comments and converts them into syscalls. This requires the name of the prototype in the comment to match a syscall number in the `zsysnum_${GOOS}_${GOARCH}.go` file. The function prototype can be exported (capitalized) or not. @@ -160,7 +160,7 @@ signal numbers, and constants. Generated by `mkerrors.sh` (see above). ### `zsyscall_${GOOS}_${GOARCH}.go` A file containing all the generated syscalls for a specific GOOS and GOARCH. -Generated by `mksyscall.go` (see above). +Generated by `mksyscall.pl` (see above). ### `zsysnum_${GOOS}_${GOARCH}.go` diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/affinity_linux.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/affinity_linux.go new file mode 100644 index 00000000..72afe333 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/affinity_linux.go @@ -0,0 +1,124 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// CPU affinity functions + +package unix + +import ( + "unsafe" +) + +const cpuSetSize = _CPU_SETSIZE / _NCPUBITS + +// CPUSet represents a CPU affinity mask. +type CPUSet [cpuSetSize]cpuMask + +func schedAffinity(trap uintptr, pid int, set *CPUSet) error { + _, _, e := RawSyscall(trap, uintptr(pid), uintptr(unsafe.Sizeof(*set)), uintptr(unsafe.Pointer(set))) + if e != 0 { + return errnoErr(e) + } + return nil +} + +// SchedGetaffinity gets the CPU affinity mask of the thread specified by pid. +// If pid is 0 the calling thread is used. +func SchedGetaffinity(pid int, set *CPUSet) error { + return schedAffinity(SYS_SCHED_GETAFFINITY, pid, set) +} + +// SchedSetaffinity sets the CPU affinity mask of the thread specified by pid. +// If pid is 0 the calling thread is used. +func SchedSetaffinity(pid int, set *CPUSet) error { + return schedAffinity(SYS_SCHED_SETAFFINITY, pid, set) +} + +// Zero clears the set s, so that it contains no CPUs. +func (s *CPUSet) Zero() { + for i := range s { + s[i] = 0 + } +} + +func cpuBitsIndex(cpu int) int { + return cpu / _NCPUBITS +} + +func cpuBitsMask(cpu int) cpuMask { + return cpuMask(1 << (uint(cpu) % _NCPUBITS)) +} + +// Set adds cpu to the set s. +func (s *CPUSet) Set(cpu int) { + i := cpuBitsIndex(cpu) + if i < len(s) { + s[i] |= cpuBitsMask(cpu) + } +} + +// Clear removes cpu from the set s. +func (s *CPUSet) Clear(cpu int) { + i := cpuBitsIndex(cpu) + if i < len(s) { + s[i] &^= cpuBitsMask(cpu) + } +} + +// IsSet reports whether cpu is in the set s. +func (s *CPUSet) IsSet(cpu int) bool { + i := cpuBitsIndex(cpu) + if i < len(s) { + return s[i]&cpuBitsMask(cpu) != 0 + } + return false +} + +// Count returns the number of CPUs in the set s. +func (s *CPUSet) Count() int { + c := 0 + for _, b := range s { + c += onesCount64(uint64(b)) + } + return c +} + +// onesCount64 is a copy of Go 1.9's math/bits.OnesCount64. +// Once this package can require Go 1.9, we can delete this +// and update the caller to use bits.OnesCount64. +func onesCount64(x uint64) int { + const m0 = 0x5555555555555555 // 01010101 ... + const m1 = 0x3333333333333333 // 00110011 ... + const m2 = 0x0f0f0f0f0f0f0f0f // 00001111 ... + const m3 = 0x00ff00ff00ff00ff // etc. + const m4 = 0x0000ffff0000ffff + + // Implementation: Parallel summing of adjacent bits. + // See "Hacker's Delight", Chap. 5: Counting Bits. + // The following pattern shows the general approach: + // + // x = x>>1&(m0&m) + x&(m0&m) + // x = x>>2&(m1&m) + x&(m1&m) + // x = x>>4&(m2&m) + x&(m2&m) + // x = x>>8&(m3&m) + x&(m3&m) + // x = x>>16&(m4&m) + x&(m4&m) + // x = x>>32&(m5&m) + x&(m5&m) + // return int(x) + // + // Masking (& operations) can be left away when there's no + // danger that a field's sum will carry over into the next + // field: Since the result cannot be > 64, 8 bits is enough + // and we can ignore the masks for the shifts by 8 and up. + // Per "Hacker's Delight", the first line can be simplified + // more, but it saves at best one instruction, so we leave + // it alone for clarity. + const m = 1<<64 - 1 + x = x>>1&(m0&m) + x&(m0&m) + x = x>>2&(m1&m) + x&(m1&m) + x = (x>>4 + x) & (m2 & m) + x += x >> 8 + x += x >> 16 + x += x >> 32 + return int(x) & (1<<7 - 1) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/aliases.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/aliases.go new file mode 100644 index 00000000..951fce4d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/aliases.go @@ -0,0 +1,14 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris +// +build go1.9 + +package unix + +import "syscall" + +type Signal = syscall.Signal +type Errno = syscall.Errno +type SysProcAttr = syscall.SysProcAttr diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_aix_ppc64.s b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_aix_ppc64.s new file mode 100644 index 00000000..06f84b85 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_aix_ppc64.s @@ -0,0 +1,17 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +#include "textflag.h" + +// +// System calls for ppc64, AIX are implemented in runtime/syscall_aix.go +// + +TEXT ·syscall6(SB),NOSPLIT,$0-88 + JMP syscall·syscall6(SB) + +TEXT ·rawSyscall6(SB),NOSPLIT,$0-88 + JMP syscall·rawSyscall6(SB) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_darwin_386.s b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_darwin_386.s new file mode 100644 index 00000000..8a727831 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_darwin_386.s @@ -0,0 +1,29 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for 386, Darwin +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-28 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-40 + JMP syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-52 + JMP syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + JMP syscall·RawSyscall6(SB) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_darwin_amd64.s b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_darwin_amd64.s new file mode 100644 index 00000000..6321421f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_darwin_amd64.s @@ -0,0 +1,29 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for AMD64, Darwin +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-56 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + JMP syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-104 + JMP syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + JMP syscall·RawSyscall6(SB) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_darwin_arm.s b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_darwin_arm.s new file mode 100644 index 00000000..333242d5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_darwin_arm.s @@ -0,0 +1,30 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo +// +build arm,darwin + +#include "textflag.h" + +// +// System call support for ARM, Darwin +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-28 + B syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-40 + B syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-52 + B syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + B syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + B syscall·RawSyscall6(SB) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_darwin_arm64.s b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_darwin_arm64.s new file mode 100644 index 00000000..97e01743 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_darwin_arm64.s @@ -0,0 +1,30 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo +// +build arm64,darwin + +#include "textflag.h" + +// +// System call support for AMD64, Darwin +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-56 + B syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + B syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-104 + B syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + B syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + B syscall·RawSyscall6(SB) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_dragonfly_amd64.s b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_dragonfly_amd64.s new file mode 100644 index 00000000..603dd572 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_dragonfly_amd64.s @@ -0,0 +1,29 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for AMD64, DragonFly +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-56 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + JMP syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-104 + JMP syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + JMP syscall·RawSyscall6(SB) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_freebsd_386.s b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_freebsd_386.s new file mode 100644 index 00000000..c9a0a260 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_freebsd_386.s @@ -0,0 +1,29 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for 386, FreeBSD +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-28 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-40 + JMP syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-52 + JMP syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + JMP syscall·RawSyscall6(SB) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_freebsd_amd64.s b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_freebsd_amd64.s new file mode 100644 index 00000000..35172477 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_freebsd_amd64.s @@ -0,0 +1,29 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for AMD64, FreeBSD +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-56 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + JMP syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-104 + JMP syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + JMP syscall·RawSyscall6(SB) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_freebsd_arm.s b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_freebsd_arm.s new file mode 100644 index 00000000..9227c875 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_freebsd_arm.s @@ -0,0 +1,29 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for ARM, FreeBSD +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-28 + B syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-40 + B syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-52 + B syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + B syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + B syscall·RawSyscall6(SB) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_linux_386.s b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_linux_386.s new file mode 100644 index 00000000..448bebbb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_linux_386.s @@ -0,0 +1,65 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +#include "textflag.h" + +// +// System calls for 386, Linux +// + +// See ../runtime/sys_linux_386.s for the reason why we always use int 0x80 +// instead of the glibc-specific "CALL 0x10(GS)". +#define INVOKE_SYSCALL INT $0x80 + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-28 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-40 + JMP syscall·Syscall6(SB) + +TEXT ·SyscallNoError(SB),NOSPLIT,$0-24 + CALL runtime·entersyscall(SB) + MOVL trap+0(FP), AX // syscall entry + MOVL a1+4(FP), BX + MOVL a2+8(FP), CX + MOVL a3+12(FP), DX + MOVL $0, SI + MOVL $0, DI + INVOKE_SYSCALL + MOVL AX, r1+16(FP) + MOVL DX, r2+20(FP) + CALL runtime·exitsyscall(SB) + RET + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + JMP syscall·RawSyscall6(SB) + +TEXT ·RawSyscallNoError(SB),NOSPLIT,$0-24 + MOVL trap+0(FP), AX // syscall entry + MOVL a1+4(FP), BX + MOVL a2+8(FP), CX + MOVL a3+12(FP), DX + MOVL $0, SI + MOVL $0, DI + INVOKE_SYSCALL + MOVL AX, r1+16(FP) + MOVL DX, r2+20(FP) + RET + +TEXT ·socketcall(SB),NOSPLIT,$0-36 + JMP syscall·socketcall(SB) + +TEXT ·rawsocketcall(SB),NOSPLIT,$0-36 + JMP syscall·rawsocketcall(SB) + +TEXT ·seek(SB),NOSPLIT,$0-28 + JMP syscall·seek(SB) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_linux_amd64.s b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_linux_amd64.s new file mode 100644 index 00000000..c6468a95 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_linux_amd64.s @@ -0,0 +1,57 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +#include "textflag.h" + +// +// System calls for AMD64, Linux +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-56 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + JMP syscall·Syscall6(SB) + +TEXT ·SyscallNoError(SB),NOSPLIT,$0-48 + CALL runtime·entersyscall(SB) + MOVQ a1+8(FP), DI + MOVQ a2+16(FP), SI + MOVQ a3+24(FP), DX + MOVQ $0, R10 + MOVQ $0, R8 + MOVQ $0, R9 + MOVQ trap+0(FP), AX // syscall entry + SYSCALL + MOVQ AX, r1+32(FP) + MOVQ DX, r2+40(FP) + CALL runtime·exitsyscall(SB) + RET + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + JMP syscall·RawSyscall6(SB) + +TEXT ·RawSyscallNoError(SB),NOSPLIT,$0-48 + MOVQ a1+8(FP), DI + MOVQ a2+16(FP), SI + MOVQ a3+24(FP), DX + MOVQ $0, R10 + MOVQ $0, R8 + MOVQ $0, R9 + MOVQ trap+0(FP), AX // syscall entry + SYSCALL + MOVQ AX, r1+32(FP) + MOVQ DX, r2+40(FP) + RET + +TEXT ·gettimeofday(SB),NOSPLIT,$0-16 + JMP syscall·gettimeofday(SB) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_linux_arm.s b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_linux_arm.s new file mode 100644 index 00000000..cf0f3575 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_linux_arm.s @@ -0,0 +1,56 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +#include "textflag.h" + +// +// System calls for arm, Linux +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-28 + B syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-40 + B syscall·Syscall6(SB) + +TEXT ·SyscallNoError(SB),NOSPLIT,$0-24 + BL runtime·entersyscall(SB) + MOVW trap+0(FP), R7 + MOVW a1+4(FP), R0 + MOVW a2+8(FP), R1 + MOVW a3+12(FP), R2 + MOVW $0, R3 + MOVW $0, R4 + MOVW $0, R5 + SWI $0 + MOVW R0, r1+16(FP) + MOVW $0, R0 + MOVW R0, r2+20(FP) + BL runtime·exitsyscall(SB) + RET + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + B syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + B syscall·RawSyscall6(SB) + +TEXT ·RawSyscallNoError(SB),NOSPLIT,$0-24 + MOVW trap+0(FP), R7 // syscall entry + MOVW a1+4(FP), R0 + MOVW a2+8(FP), R1 + MOVW a3+12(FP), R2 + SWI $0 + MOVW R0, r1+16(FP) + MOVW $0, R0 + MOVW R0, r2+20(FP) + RET + +TEXT ·seek(SB),NOSPLIT,$0-28 + B syscall·seek(SB) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_linux_arm64.s b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_linux_arm64.s new file mode 100644 index 00000000..afe6fdf6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_linux_arm64.s @@ -0,0 +1,52 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build linux +// +build arm64 +// +build !gccgo + +#include "textflag.h" + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-56 + B syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + B syscall·Syscall6(SB) + +TEXT ·SyscallNoError(SB),NOSPLIT,$0-48 + BL runtime·entersyscall(SB) + MOVD a1+8(FP), R0 + MOVD a2+16(FP), R1 + MOVD a3+24(FP), R2 + MOVD $0, R3 + MOVD $0, R4 + MOVD $0, R5 + MOVD trap+0(FP), R8 // syscall entry + SVC + MOVD R0, r1+32(FP) // r1 + MOVD R1, r2+40(FP) // r2 + BL runtime·exitsyscall(SB) + RET + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + B syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + B syscall·RawSyscall6(SB) + +TEXT ·RawSyscallNoError(SB),NOSPLIT,$0-48 + MOVD a1+8(FP), R0 + MOVD a2+16(FP), R1 + MOVD a3+24(FP), R2 + MOVD $0, R3 + MOVD $0, R4 + MOVD $0, R5 + MOVD trap+0(FP), R8 // syscall entry + SVC + MOVD R0, r1+32(FP) + MOVD R1, r2+40(FP) + RET diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_linux_mips64x.s b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_linux_mips64x.s new file mode 100644 index 00000000..ab9d6383 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_linux_mips64x.s @@ -0,0 +1,56 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build linux +// +build mips64 mips64le +// +build !gccgo + +#include "textflag.h" + +// +// System calls for mips64, Linux +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-56 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + JMP syscall·Syscall6(SB) + +TEXT ·SyscallNoError(SB),NOSPLIT,$0-48 + JAL runtime·entersyscall(SB) + MOVV a1+8(FP), R4 + MOVV a2+16(FP), R5 + MOVV a3+24(FP), R6 + MOVV R0, R7 + MOVV R0, R8 + MOVV R0, R9 + MOVV trap+0(FP), R2 // syscall entry + SYSCALL + MOVV R2, r1+32(FP) + MOVV R3, r2+40(FP) + JAL runtime·exitsyscall(SB) + RET + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + JMP syscall·RawSyscall6(SB) + +TEXT ·RawSyscallNoError(SB),NOSPLIT,$0-48 + MOVV a1+8(FP), R4 + MOVV a2+16(FP), R5 + MOVV a3+24(FP), R6 + MOVV R0, R7 + MOVV R0, R8 + MOVV R0, R9 + MOVV trap+0(FP), R2 // syscall entry + SYSCALL + MOVV R2, r1+32(FP) + MOVV R3, r2+40(FP) + RET diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_linux_mipsx.s b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_linux_mipsx.s new file mode 100644 index 00000000..99e53990 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_linux_mipsx.s @@ -0,0 +1,54 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build linux +// +build mips mipsle +// +build !gccgo + +#include "textflag.h" + +// +// System calls for mips, Linux +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-28 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-40 + JMP syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-52 + JMP syscall·Syscall9(SB) + +TEXT ·SyscallNoError(SB),NOSPLIT,$0-24 + JAL runtime·entersyscall(SB) + MOVW a1+4(FP), R4 + MOVW a2+8(FP), R5 + MOVW a3+12(FP), R6 + MOVW R0, R7 + MOVW trap+0(FP), R2 // syscall entry + SYSCALL + MOVW R2, r1+16(FP) // r1 + MOVW R3, r2+20(FP) // r2 + JAL runtime·exitsyscall(SB) + RET + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + JMP syscall·RawSyscall6(SB) + +TEXT ·RawSyscallNoError(SB),NOSPLIT,$0-24 + MOVW a1+4(FP), R4 + MOVW a2+8(FP), R5 + MOVW a3+12(FP), R6 + MOVW trap+0(FP), R2 // syscall entry + SYSCALL + MOVW R2, r1+16(FP) + MOVW R3, r2+20(FP) + RET diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_linux_ppc64x.s b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_linux_ppc64x.s new file mode 100644 index 00000000..649e5871 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_linux_ppc64x.s @@ -0,0 +1,56 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build linux +// +build ppc64 ppc64le +// +build !gccgo + +#include "textflag.h" + +// +// System calls for ppc64, Linux +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-56 + BR syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + BR syscall·Syscall6(SB) + +TEXT ·SyscallNoError(SB),NOSPLIT,$0-48 + BL runtime·entersyscall(SB) + MOVD a1+8(FP), R3 + MOVD a2+16(FP), R4 + MOVD a3+24(FP), R5 + MOVD R0, R6 + MOVD R0, R7 + MOVD R0, R8 + MOVD trap+0(FP), R9 // syscall entry + SYSCALL R9 + MOVD R3, r1+32(FP) + MOVD R4, r2+40(FP) + BL runtime·exitsyscall(SB) + RET + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + BR syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + BR syscall·RawSyscall6(SB) + +TEXT ·RawSyscallNoError(SB),NOSPLIT,$0-48 + MOVD a1+8(FP), R3 + MOVD a2+16(FP), R4 + MOVD a3+24(FP), R5 + MOVD R0, R6 + MOVD R0, R7 + MOVD R0, R8 + MOVD trap+0(FP), R9 // syscall entry + SYSCALL R9 + MOVD R3, r1+32(FP) + MOVD R4, r2+40(FP) + RET diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_linux_s390x.s b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_linux_s390x.s new file mode 100644 index 00000000..a5a863c6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_linux_s390x.s @@ -0,0 +1,56 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build s390x +// +build linux +// +build !gccgo + +#include "textflag.h" + +// +// System calls for s390x, Linux +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-56 + BR syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + BR syscall·Syscall6(SB) + +TEXT ·SyscallNoError(SB),NOSPLIT,$0-48 + BL runtime·entersyscall(SB) + MOVD a1+8(FP), R2 + MOVD a2+16(FP), R3 + MOVD a3+24(FP), R4 + MOVD $0, R5 + MOVD $0, R6 + MOVD $0, R7 + MOVD trap+0(FP), R1 // syscall entry + SYSCALL + MOVD R2, r1+32(FP) + MOVD R3, r2+40(FP) + BL runtime·exitsyscall(SB) + RET + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + BR syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + BR syscall·RawSyscall6(SB) + +TEXT ·RawSyscallNoError(SB),NOSPLIT,$0-48 + MOVD a1+8(FP), R2 + MOVD a2+16(FP), R3 + MOVD a3+24(FP), R4 + MOVD $0, R5 + MOVD $0, R6 + MOVD $0, R7 + MOVD trap+0(FP), R1 // syscall entry + SYSCALL + MOVD R2, r1+32(FP) + MOVD R3, r2+40(FP) + RET diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_netbsd_386.s b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_netbsd_386.s new file mode 100644 index 00000000..48bdcd76 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_netbsd_386.s @@ -0,0 +1,29 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for 386, NetBSD +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-28 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-40 + JMP syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-52 + JMP syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + JMP syscall·RawSyscall6(SB) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_netbsd_amd64.s b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_netbsd_amd64.s new file mode 100644 index 00000000..2ede05c7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_netbsd_amd64.s @@ -0,0 +1,29 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for AMD64, NetBSD +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-56 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + JMP syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-104 + JMP syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + JMP syscall·RawSyscall6(SB) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_netbsd_arm.s b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_netbsd_arm.s new file mode 100644 index 00000000..e8928571 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_netbsd_arm.s @@ -0,0 +1,29 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for ARM, NetBSD +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-28 + B syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-40 + B syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-52 + B syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + B syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + B syscall·RawSyscall6(SB) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_openbsd_386.s b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_openbsd_386.s new file mode 100644 index 00000000..00576f3c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_openbsd_386.s @@ -0,0 +1,29 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for 386, OpenBSD +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-28 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-40 + JMP syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-52 + JMP syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + JMP syscall·RawSyscall6(SB) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_openbsd_amd64.s b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_openbsd_amd64.s new file mode 100644 index 00000000..790ef77f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_openbsd_amd64.s @@ -0,0 +1,29 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for AMD64, OpenBSD +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-56 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + JMP syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-104 + JMP syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + JMP syscall·RawSyscall6(SB) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_openbsd_arm.s b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_openbsd_arm.s new file mode 100644 index 00000000..469bfa10 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_openbsd_arm.s @@ -0,0 +1,29 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for ARM, OpenBSD +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-28 + B syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-40 + B syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-52 + B syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + B syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + B syscall·RawSyscall6(SB) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_solaris_amd64.s b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_solaris_amd64.s new file mode 100644 index 00000000..ded8260f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/asm_solaris_amd64.s @@ -0,0 +1,17 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +#include "textflag.h" + +// +// System calls for amd64, Solaris are implemented in runtime/syscall_solaris.go +// + +TEXT ·sysvicall6(SB),NOSPLIT,$0-88 + JMP syscall·sysvicall6(SB) + +TEXT ·rawSysvicall6(SB),NOSPLIT,$0-88 + JMP syscall·rawSysvicall6(SB) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/bluetooth_linux.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/bluetooth_linux.go new file mode 100644 index 00000000..6e322969 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/bluetooth_linux.go @@ -0,0 +1,35 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Bluetooth sockets and messages + +package unix + +// Bluetooth Protocols +const ( + BTPROTO_L2CAP = 0 + BTPROTO_HCI = 1 + BTPROTO_SCO = 2 + BTPROTO_RFCOMM = 3 + BTPROTO_BNEP = 4 + BTPROTO_CMTP = 5 + BTPROTO_HIDP = 6 + BTPROTO_AVDTP = 7 +) + +const ( + HCI_CHANNEL_RAW = 0 + HCI_CHANNEL_USER = 1 + HCI_CHANNEL_MONITOR = 2 + HCI_CHANNEL_CONTROL = 3 +) + +// Socketoption Level +const ( + SOL_BLUETOOTH = 0x112 + SOL_HCI = 0x0 + SOL_L2CAP = 0x6 + SOL_RFCOMM = 0x12 + SOL_SCO = 0x11 +) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/cap_freebsd.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/cap_freebsd.go new file mode 100644 index 00000000..df520487 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/cap_freebsd.go @@ -0,0 +1,195 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build freebsd + +package unix + +import ( + "errors" + "fmt" +) + +// Go implementation of C mostly found in /usr/src/sys/kern/subr_capability.c + +const ( + // This is the version of CapRights this package understands. See C implementation for parallels. + capRightsGoVersion = CAP_RIGHTS_VERSION_00 + capArSizeMin = CAP_RIGHTS_VERSION_00 + 2 + capArSizeMax = capRightsGoVersion + 2 +) + +var ( + bit2idx = []int{ + -1, 0, 1, -1, 2, -1, -1, -1, 3, -1, -1, -1, -1, -1, -1, -1, + 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + } +) + +func capidxbit(right uint64) int { + return int((right >> 57) & 0x1f) +} + +func rightToIndex(right uint64) (int, error) { + idx := capidxbit(right) + if idx < 0 || idx >= len(bit2idx) { + return -2, fmt.Errorf("index for right 0x%x out of range", right) + } + return bit2idx[idx], nil +} + +func caprver(right uint64) int { + return int(right >> 62) +} + +func capver(rights *CapRights) int { + return caprver(rights.Rights[0]) +} + +func caparsize(rights *CapRights) int { + return capver(rights) + 2 +} + +// CapRightsSet sets the permissions in setrights in rights. +func CapRightsSet(rights *CapRights, setrights []uint64) error { + // This is essentially a copy of cap_rights_vset() + if capver(rights) != CAP_RIGHTS_VERSION_00 { + return fmt.Errorf("bad rights version %d", capver(rights)) + } + + n := caparsize(rights) + if n < capArSizeMin || n > capArSizeMax { + return errors.New("bad rights size") + } + + for _, right := range setrights { + if caprver(right) != CAP_RIGHTS_VERSION_00 { + return errors.New("bad right version") + } + i, err := rightToIndex(right) + if err != nil { + return err + } + if i >= n { + return errors.New("index overflow") + } + if capidxbit(rights.Rights[i]) != capidxbit(right) { + return errors.New("index mismatch") + } + rights.Rights[i] |= right + if capidxbit(rights.Rights[i]) != capidxbit(right) { + return errors.New("index mismatch (after assign)") + } + } + + return nil +} + +// CapRightsClear clears the permissions in clearrights from rights. +func CapRightsClear(rights *CapRights, clearrights []uint64) error { + // This is essentially a copy of cap_rights_vclear() + if capver(rights) != CAP_RIGHTS_VERSION_00 { + return fmt.Errorf("bad rights version %d", capver(rights)) + } + + n := caparsize(rights) + if n < capArSizeMin || n > capArSizeMax { + return errors.New("bad rights size") + } + + for _, right := range clearrights { + if caprver(right) != CAP_RIGHTS_VERSION_00 { + return errors.New("bad right version") + } + i, err := rightToIndex(right) + if err != nil { + return err + } + if i >= n { + return errors.New("index overflow") + } + if capidxbit(rights.Rights[i]) != capidxbit(right) { + return errors.New("index mismatch") + } + rights.Rights[i] &= ^(right & 0x01FFFFFFFFFFFFFF) + if capidxbit(rights.Rights[i]) != capidxbit(right) { + return errors.New("index mismatch (after assign)") + } + } + + return nil +} + +// CapRightsIsSet checks whether all the permissions in setrights are present in rights. +func CapRightsIsSet(rights *CapRights, setrights []uint64) (bool, error) { + // This is essentially a copy of cap_rights_is_vset() + if capver(rights) != CAP_RIGHTS_VERSION_00 { + return false, fmt.Errorf("bad rights version %d", capver(rights)) + } + + n := caparsize(rights) + if n < capArSizeMin || n > capArSizeMax { + return false, errors.New("bad rights size") + } + + for _, right := range setrights { + if caprver(right) != CAP_RIGHTS_VERSION_00 { + return false, errors.New("bad right version") + } + i, err := rightToIndex(right) + if err != nil { + return false, err + } + if i >= n { + return false, errors.New("index overflow") + } + if capidxbit(rights.Rights[i]) != capidxbit(right) { + return false, errors.New("index mismatch") + } + if (rights.Rights[i] & right) != right { + return false, nil + } + } + + return true, nil +} + +func capright(idx uint64, bit uint64) uint64 { + return ((1 << (57 + idx)) | bit) +} + +// CapRightsInit returns a pointer to an initialised CapRights structure filled with rights. +// See man cap_rights_init(3) and rights(4). +func CapRightsInit(rights []uint64) (*CapRights, error) { + var r CapRights + r.Rights[0] = (capRightsGoVersion << 62) | capright(0, 0) + r.Rights[1] = capright(1, 0) + + err := CapRightsSet(&r, rights) + if err != nil { + return nil, err + } + return &r, nil +} + +// CapRightsLimit reduces the operations permitted on fd to at most those contained in rights. +// The capability rights on fd can never be increased by CapRightsLimit. +// See man cap_rights_limit(2) and rights(4). +func CapRightsLimit(fd uintptr, rights *CapRights) error { + return capRightsLimit(int(fd), rights) +} + +// CapRightsGet returns a CapRights structure containing the operations permitted on fd. +// See man cap_rights_get(3) and rights(4). +func CapRightsGet(fd uintptr) (*CapRights, error) { + r, err := CapRightsInit(nil) + if err != nil { + return nil, err + } + err = capRightsGet(capRightsGoVersion, int(fd), r) + if err != nil { + return nil, err + } + return r, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/constants.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/constants.go new file mode 100644 index 00000000..3a6ac648 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/constants.go @@ -0,0 +1,13 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris + +package unix + +const ( + R_OK = 0x4 + W_OK = 0x2 + X_OK = 0x1 +) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/dev_aix_ppc.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/dev_aix_ppc.go new file mode 100644 index 00000000..5e5fb451 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/dev_aix_ppc.go @@ -0,0 +1,27 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build aix +// +build ppc + +// Functions to access/create device major and minor numbers matching the +// encoding used by AIX. + +package unix + +// Major returns the major component of a Linux device number. +func Major(dev uint64) uint32 { + return uint32((dev >> 16) & 0xffff) +} + +// Minor returns the minor component of a Linux device number. +func Minor(dev uint64) uint32 { + return uint32(dev & 0xffff) +} + +// Mkdev returns a Linux device number generated from the given major and minor +// components. +func Mkdev(major, minor uint32) uint64 { + return uint64(((major) << 16) | (minor)) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/dev_aix_ppc64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/dev_aix_ppc64.go new file mode 100644 index 00000000..8b401244 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/dev_aix_ppc64.go @@ -0,0 +1,29 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build aix +// +build ppc64 + +// Functions to access/create device major and minor numbers matching the +// encoding used AIX. + +package unix + +// Major returns the major component of a Linux device number. +func Major(dev uint64) uint32 { + return uint32((dev & 0x3fffffff00000000) >> 32) +} + +// Minor returns the minor component of a Linux device number. +func Minor(dev uint64) uint32 { + return uint32((dev & 0x00000000ffffffff) >> 0) +} + +// Mkdev returns a Linux device number generated from the given major and minor +// components. +func Mkdev(major, minor uint32) uint64 { + var DEVNO64 uint64 + DEVNO64 = 0x8000000000000000 + return ((uint64(major) << 32) | (uint64(minor) & 0x00000000FFFFFFFF) | DEVNO64) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/dev_darwin.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/dev_darwin.go new file mode 100644 index 00000000..8d1dc0fa --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/dev_darwin.go @@ -0,0 +1,24 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Functions to access/create device major and minor numbers matching the +// encoding used in Darwin's sys/types.h header. + +package unix + +// Major returns the major component of a Darwin device number. +func Major(dev uint64) uint32 { + return uint32((dev >> 24) & 0xff) +} + +// Minor returns the minor component of a Darwin device number. +func Minor(dev uint64) uint32 { + return uint32(dev & 0xffffff) +} + +// Mkdev returns a Darwin device number generated from the given major and minor +// components. +func Mkdev(major, minor uint32) uint64 { + return (uint64(major) << 24) | uint64(minor) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/dev_dragonfly.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/dev_dragonfly.go new file mode 100644 index 00000000..8502f202 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/dev_dragonfly.go @@ -0,0 +1,30 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Functions to access/create device major and minor numbers matching the +// encoding used in Dragonfly's sys/types.h header. +// +// The information below is extracted and adapted from sys/types.h: +// +// Minor gives a cookie instead of an index since in order to avoid changing the +// meanings of bits 0-15 or wasting time and space shifting bits 16-31 for +// devices that don't use them. + +package unix + +// Major returns the major component of a DragonFlyBSD device number. +func Major(dev uint64) uint32 { + return uint32((dev >> 8) & 0xff) +} + +// Minor returns the minor component of a DragonFlyBSD device number. +func Minor(dev uint64) uint32 { + return uint32(dev & 0xffff00ff) +} + +// Mkdev returns a DragonFlyBSD device number generated from the given major and +// minor components. +func Mkdev(major, minor uint32) uint64 { + return (uint64(major) << 8) | uint64(minor) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/dev_freebsd.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/dev_freebsd.go new file mode 100644 index 00000000..eba3b4bd --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/dev_freebsd.go @@ -0,0 +1,30 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Functions to access/create device major and minor numbers matching the +// encoding used in FreeBSD's sys/types.h header. +// +// The information below is extracted and adapted from sys/types.h: +// +// Minor gives a cookie instead of an index since in order to avoid changing the +// meanings of bits 0-15 or wasting time and space shifting bits 16-31 for +// devices that don't use them. + +package unix + +// Major returns the major component of a FreeBSD device number. +func Major(dev uint64) uint32 { + return uint32((dev >> 8) & 0xff) +} + +// Minor returns the minor component of a FreeBSD device number. +func Minor(dev uint64) uint32 { + return uint32(dev & 0xffff00ff) +} + +// Mkdev returns a FreeBSD device number generated from the given major and +// minor components. +func Mkdev(major, minor uint32) uint64 { + return (uint64(major) << 8) | uint64(minor) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/dev_linux.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/dev_linux.go new file mode 100644 index 00000000..d165d6f3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/dev_linux.go @@ -0,0 +1,42 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Functions to access/create device major and minor numbers matching the +// encoding used by the Linux kernel and glibc. +// +// The information below is extracted and adapted from bits/sysmacros.h in the +// glibc sources: +// +// dev_t in glibc is 64-bit, with 32-bit major and minor numbers. glibc's +// default encoding is MMMM Mmmm mmmM MMmm, where M is a hex digit of the major +// number and m is a hex digit of the minor number. This is backward compatible +// with legacy systems where dev_t is 16 bits wide, encoded as MMmm. It is also +// backward compatible with the Linux kernel, which for some architectures uses +// 32-bit dev_t, encoded as mmmM MMmm. + +package unix + +// Major returns the major component of a Linux device number. +func Major(dev uint64) uint32 { + major := uint32((dev & 0x00000000000fff00) >> 8) + major |= uint32((dev & 0xfffff00000000000) >> 32) + return major +} + +// Minor returns the minor component of a Linux device number. +func Minor(dev uint64) uint32 { + minor := uint32((dev & 0x00000000000000ff) >> 0) + minor |= uint32((dev & 0x00000ffffff00000) >> 12) + return minor +} + +// Mkdev returns a Linux device number generated from the given major and minor +// components. +func Mkdev(major, minor uint32) uint64 { + dev := (uint64(major) & 0x00000fff) << 8 + dev |= (uint64(major) & 0xfffff000) << 32 + dev |= (uint64(minor) & 0x000000ff) << 0 + dev |= (uint64(minor) & 0xffffff00) << 12 + return dev +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/dev_netbsd.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/dev_netbsd.go new file mode 100644 index 00000000..b4a203d0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/dev_netbsd.go @@ -0,0 +1,29 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Functions to access/create device major and minor numbers matching the +// encoding used in NetBSD's sys/types.h header. + +package unix + +// Major returns the major component of a NetBSD device number. +func Major(dev uint64) uint32 { + return uint32((dev & 0x000fff00) >> 8) +} + +// Minor returns the minor component of a NetBSD device number. +func Minor(dev uint64) uint32 { + minor := uint32((dev & 0x000000ff) >> 0) + minor |= uint32((dev & 0xfff00000) >> 12) + return minor +} + +// Mkdev returns a NetBSD device number generated from the given major and minor +// components. +func Mkdev(major, minor uint32) uint64 { + dev := (uint64(major) << 8) & 0x000fff00 + dev |= (uint64(minor) << 12) & 0xfff00000 + dev |= (uint64(minor) << 0) & 0x000000ff + return dev +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/dev_openbsd.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/dev_openbsd.go new file mode 100644 index 00000000..f3430c42 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/dev_openbsd.go @@ -0,0 +1,29 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Functions to access/create device major and minor numbers matching the +// encoding used in OpenBSD's sys/types.h header. + +package unix + +// Major returns the major component of an OpenBSD device number. +func Major(dev uint64) uint32 { + return uint32((dev & 0x0000ff00) >> 8) +} + +// Minor returns the minor component of an OpenBSD device number. +func Minor(dev uint64) uint32 { + minor := uint32((dev & 0x000000ff) >> 0) + minor |= uint32((dev & 0xffff0000) >> 8) + return minor +} + +// Mkdev returns an OpenBSD device number generated from the given major and minor +// components. +func Mkdev(major, minor uint32) uint64 { + dev := (uint64(major) << 8) & 0x0000ff00 + dev |= (uint64(minor) << 8) & 0xffff0000 + dev |= (uint64(minor) << 0) & 0x000000ff + return dev +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/dirent.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/dirent.go new file mode 100644 index 00000000..4407c505 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/dirent.go @@ -0,0 +1,17 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build aix darwin dragonfly freebsd linux nacl netbsd openbsd solaris + +package unix + +import "syscall" + +// ParseDirent parses up to max directory entries in buf, +// appending the names to names. It returns the number of +// bytes consumed from buf, the number of entries added +// to names, and the new names slice. +func ParseDirent(buf []byte, max int, names []string) (consumed int, count int, newnames []string) { + return syscall.ParseDirent(buf, max, names) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/endian_big.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/endian_big.go new file mode 100644 index 00000000..5e926906 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/endian_big.go @@ -0,0 +1,9 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. +// +// +build ppc64 s390x mips mips64 + +package unix + +const isBigEndian = true diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/endian_little.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/endian_little.go new file mode 100644 index 00000000..085df2d8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/endian_little.go @@ -0,0 +1,9 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. +// +// +build 386 amd64 amd64p32 arm arm64 ppc64le mipsle mips64le + +package unix + +const isBigEndian = false diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/env_unix.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/env_unix.go new file mode 100644 index 00000000..84178b0a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/env_unix.go @@ -0,0 +1,31 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris + +// Unix environment variables. + +package unix + +import "syscall" + +func Getenv(key string) (value string, found bool) { + return syscall.Getenv(key) +} + +func Setenv(key, value string) error { + return syscall.Setenv(key, value) +} + +func Clearenv() { + syscall.Clearenv() +} + +func Environ() []string { + return syscall.Environ() +} + +func Unsetenv(key string) error { + return syscall.Unsetenv(key) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/errors_freebsd_386.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/errors_freebsd_386.go new file mode 100644 index 00000000..c56bc8b0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/errors_freebsd_386.go @@ -0,0 +1,227 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Constants that were deprecated or moved to enums in the FreeBSD headers. Keep +// them here for backwards compatibility. + +package unix + +const ( + IFF_SMART = 0x20 + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BSC = 0x53 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAITH = 0xf2 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_INTERLEAVE = 0x7c + IFT_IP = 0x7e + IFT_IPFORWARD = 0x8e + IFT_IPOVERATM = 0x72 + IFT_IPOVERCDLC = 0x6d + IFT_IPOVERCLAW = 0x6e + IFT_IPSWITCH = 0x4e + IFT_IPXIP = 0xf9 + IFT_ISDN = 0x3f + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISDNS = 0x4b + IFT_ISDNU = 0x4c + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88025CRFPINT = 0x62 + IFT_ISO88025DTR = 0x56 + IFT_ISO88025FIBER = 0x73 + IFT_ISO88026 = 0xa + IFT_ISUP = 0xb3 + IFT_L3IPXVLAN = 0x89 + IFT_LAPB = 0x10 + IFT_LAPD = 0x4d + IFT_LAPF = 0x77 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf6 + IFT_PFSYNC = 0xf7 + IFT_PLC = 0xae + IFT_POS = 0xab + IFT_PPPMULTILINKBUNDLE = 0x6c + IFT_PROPBWAP2MP = 0xb8 + IFT_PROPCNLS = 0x59 + IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 + IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 + IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 + IFT_PROPMUX = 0x36 + IFT_PROPWIRELESSP2P = 0x9d + IFT_PTPSERIAL = 0x16 + IFT_PVC = 0xf1 + IFT_QLLC = 0x44 + IFT_RADIOMAC = 0xbc + IFT_RADSL = 0x5f + IFT_REACHDSL = 0xc0 + IFT_RFC1483 = 0x9f + IFT_RS232 = 0x21 + IFT_RSRB = 0x4f + IFT_SDLC = 0x11 + IFT_SDSL = 0x60 + IFT_SHDSL = 0xa9 + IFT_SIP = 0x1f + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETOVERHEADCHANNEL = 0xb9 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_SRP = 0x97 + IFT_SS7SIGLINK = 0x9c + IFT_STACKTOSTACK = 0x6f + IFT_STARLAN = 0xb + IFT_STF = 0xd7 + IFT_T1 = 0x12 + IFT_TDLC = 0x74 + IFT_TERMPAD = 0x5b + IFT_TR008 = 0xb0 + IFT_TRANSPHDLC = 0x7b + IFT_TUNNEL = 0x83 + IFT_ULTRA = 0x1d + IFT_USB = 0xa0 + IFT_V11 = 0x40 + IFT_V35 = 0x2d + IFT_V36 = 0x41 + IFT_V37 = 0x78 + IFT_VDSL = 0x61 + IFT_VIRTUALIPADDRESS = 0x70 + IFT_VOICEEM = 0x64 + IFT_VOICEENCAP = 0x67 + IFT_VOICEFXO = 0x65 + IFT_VOICEFXS = 0x66 + IFT_VOICEOVERATM = 0x98 + IFT_VOICEOVERFRAMERELAY = 0x99 + IFT_VOICEOVERIP = 0x68 + IFT_X213 = 0x5d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25HUNTGROUP = 0x7a + IFT_X25MLP = 0x79 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IPPROTO_MAXID = 0x34 + IPV6_FAITH = 0x1d + IP_FAITH = 0x16 + MAP_NORESERVE = 0x40 + MAP_RENAME = 0x20 + NET_RT_MAXID = 0x6 + RTF_PRCLONING = 0x10000 + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + SIOCADDRT = 0x8030720a + SIOCALIFADDR = 0x8118691b + SIOCDELRT = 0x8030720b + SIOCDLIFADDR = 0x8118691d + SIOCGLIFADDR = 0xc118691c + SIOCGLIFPHYADDR = 0xc118694b + SIOCSLIFPHYADDR = 0x8118694a +) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/errors_freebsd_amd64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/errors_freebsd_amd64.go new file mode 100644 index 00000000..3e977117 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/errors_freebsd_amd64.go @@ -0,0 +1,227 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Constants that were deprecated or moved to enums in the FreeBSD headers. Keep +// them here for backwards compatibility. + +package unix + +const ( + IFF_SMART = 0x20 + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BSC = 0x53 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAITH = 0xf2 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_INTERLEAVE = 0x7c + IFT_IP = 0x7e + IFT_IPFORWARD = 0x8e + IFT_IPOVERATM = 0x72 + IFT_IPOVERCDLC = 0x6d + IFT_IPOVERCLAW = 0x6e + IFT_IPSWITCH = 0x4e + IFT_IPXIP = 0xf9 + IFT_ISDN = 0x3f + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISDNS = 0x4b + IFT_ISDNU = 0x4c + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88025CRFPINT = 0x62 + IFT_ISO88025DTR = 0x56 + IFT_ISO88025FIBER = 0x73 + IFT_ISO88026 = 0xa + IFT_ISUP = 0xb3 + IFT_L3IPXVLAN = 0x89 + IFT_LAPB = 0x10 + IFT_LAPD = 0x4d + IFT_LAPF = 0x77 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf6 + IFT_PFSYNC = 0xf7 + IFT_PLC = 0xae + IFT_POS = 0xab + IFT_PPPMULTILINKBUNDLE = 0x6c + IFT_PROPBWAP2MP = 0xb8 + IFT_PROPCNLS = 0x59 + IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 + IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 + IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 + IFT_PROPMUX = 0x36 + IFT_PROPWIRELESSP2P = 0x9d + IFT_PTPSERIAL = 0x16 + IFT_PVC = 0xf1 + IFT_QLLC = 0x44 + IFT_RADIOMAC = 0xbc + IFT_RADSL = 0x5f + IFT_REACHDSL = 0xc0 + IFT_RFC1483 = 0x9f + IFT_RS232 = 0x21 + IFT_RSRB = 0x4f + IFT_SDLC = 0x11 + IFT_SDSL = 0x60 + IFT_SHDSL = 0xa9 + IFT_SIP = 0x1f + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETOVERHEADCHANNEL = 0xb9 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_SRP = 0x97 + IFT_SS7SIGLINK = 0x9c + IFT_STACKTOSTACK = 0x6f + IFT_STARLAN = 0xb + IFT_STF = 0xd7 + IFT_T1 = 0x12 + IFT_TDLC = 0x74 + IFT_TERMPAD = 0x5b + IFT_TR008 = 0xb0 + IFT_TRANSPHDLC = 0x7b + IFT_TUNNEL = 0x83 + IFT_ULTRA = 0x1d + IFT_USB = 0xa0 + IFT_V11 = 0x40 + IFT_V35 = 0x2d + IFT_V36 = 0x41 + IFT_V37 = 0x78 + IFT_VDSL = 0x61 + IFT_VIRTUALIPADDRESS = 0x70 + IFT_VOICEEM = 0x64 + IFT_VOICEENCAP = 0x67 + IFT_VOICEFXO = 0x65 + IFT_VOICEFXS = 0x66 + IFT_VOICEOVERATM = 0x98 + IFT_VOICEOVERFRAMERELAY = 0x99 + IFT_VOICEOVERIP = 0x68 + IFT_X213 = 0x5d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25HUNTGROUP = 0x7a + IFT_X25MLP = 0x79 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IPPROTO_MAXID = 0x34 + IPV6_FAITH = 0x1d + IP_FAITH = 0x16 + MAP_NORESERVE = 0x40 + MAP_RENAME = 0x20 + NET_RT_MAXID = 0x6 + RTF_PRCLONING = 0x10000 + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + SIOCADDRT = 0x8040720a + SIOCALIFADDR = 0x8118691b + SIOCDELRT = 0x8040720b + SIOCDLIFADDR = 0x8118691d + SIOCGLIFADDR = 0xc118691c + SIOCGLIFPHYADDR = 0xc118694b + SIOCSLIFPHYADDR = 0x8118694a +) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/errors_freebsd_arm.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/errors_freebsd_arm.go new file mode 100644 index 00000000..856dca32 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/errors_freebsd_arm.go @@ -0,0 +1,226 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package unix + +const ( + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BSC = 0x53 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_INTERLEAVE = 0x7c + IFT_IP = 0x7e + IFT_IPFORWARD = 0x8e + IFT_IPOVERATM = 0x72 + IFT_IPOVERCDLC = 0x6d + IFT_IPOVERCLAW = 0x6e + IFT_IPSWITCH = 0x4e + IFT_ISDN = 0x3f + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISDNS = 0x4b + IFT_ISDNU = 0x4c + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88025CRFPINT = 0x62 + IFT_ISO88025DTR = 0x56 + IFT_ISO88025FIBER = 0x73 + IFT_ISO88026 = 0xa + IFT_ISUP = 0xb3 + IFT_L3IPXVLAN = 0x89 + IFT_LAPB = 0x10 + IFT_LAPD = 0x4d + IFT_LAPF = 0x77 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf6 + IFT_PFSYNC = 0xf7 + IFT_PLC = 0xae + IFT_POS = 0xab + IFT_PPPMULTILINKBUNDLE = 0x6c + IFT_PROPBWAP2MP = 0xb8 + IFT_PROPCNLS = 0x59 + IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 + IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 + IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 + IFT_PROPMUX = 0x36 + IFT_PROPWIRELESSP2P = 0x9d + IFT_PTPSERIAL = 0x16 + IFT_PVC = 0xf1 + IFT_QLLC = 0x44 + IFT_RADIOMAC = 0xbc + IFT_RADSL = 0x5f + IFT_REACHDSL = 0xc0 + IFT_RFC1483 = 0x9f + IFT_RS232 = 0x21 + IFT_RSRB = 0x4f + IFT_SDLC = 0x11 + IFT_SDSL = 0x60 + IFT_SHDSL = 0xa9 + IFT_SIP = 0x1f + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETOVERHEADCHANNEL = 0xb9 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_SRP = 0x97 + IFT_SS7SIGLINK = 0x9c + IFT_STACKTOSTACK = 0x6f + IFT_STARLAN = 0xb + IFT_STF = 0xd7 + IFT_T1 = 0x12 + IFT_TDLC = 0x74 + IFT_TERMPAD = 0x5b + IFT_TR008 = 0xb0 + IFT_TRANSPHDLC = 0x7b + IFT_TUNNEL = 0x83 + IFT_ULTRA = 0x1d + IFT_USB = 0xa0 + IFT_V11 = 0x40 + IFT_V35 = 0x2d + IFT_V36 = 0x41 + IFT_V37 = 0x78 + IFT_VDSL = 0x61 + IFT_VIRTUALIPADDRESS = 0x70 + IFT_VOICEEM = 0x64 + IFT_VOICEENCAP = 0x67 + IFT_VOICEFXO = 0x65 + IFT_VOICEFXS = 0x66 + IFT_VOICEOVERATM = 0x98 + IFT_VOICEOVERFRAMERELAY = 0x99 + IFT_VOICEOVERIP = 0x68 + IFT_X213 = 0x5d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25HUNTGROUP = 0x7a + IFT_X25MLP = 0x79 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + + // missing constants on FreeBSD-11.1-RELEASE, copied from old values in ztypes_freebsd_arm.go + IFF_SMART = 0x20 + IFT_FAITH = 0xf2 + IFT_IPXIP = 0xf9 + IPPROTO_MAXID = 0x34 + IPV6_FAITH = 0x1d + IP_FAITH = 0x16 + MAP_NORESERVE = 0x40 + MAP_RENAME = 0x20 + NET_RT_MAXID = 0x6 + RTF_PRCLONING = 0x10000 + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + SIOCADDRT = 0x8030720a + SIOCALIFADDR = 0x8118691b + SIOCDELRT = 0x8030720b + SIOCDLIFADDR = 0x8118691d + SIOCGLIFADDR = 0xc118691c + SIOCGLIFPHYADDR = 0xc118694b + SIOCSLIFPHYADDR = 0x8118694a +) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/fcntl.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/fcntl.go new file mode 100644 index 00000000..9379ba9c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/fcntl.go @@ -0,0 +1,32 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build darwin dragonfly freebsd linux netbsd openbsd + +package unix + +import "unsafe" + +// fcntl64Syscall is usually SYS_FCNTL, but is overridden on 32-bit Linux +// systems by flock_linux_32bit.go to be SYS_FCNTL64. +var fcntl64Syscall uintptr = SYS_FCNTL + +// FcntlInt performs a fcntl syscall on fd with the provided command and argument. +func FcntlInt(fd uintptr, cmd, arg int) (int, error) { + valptr, _, errno := Syscall(fcntl64Syscall, fd, uintptr(cmd), uintptr(arg)) + var err error + if errno != 0 { + err = errno + } + return int(valptr), err +} + +// FcntlFlock performs a fcntl syscall for the F_GETLK, F_SETLK or F_SETLKW command. +func FcntlFlock(fd uintptr, cmd int, lk *Flock_t) error { + _, _, errno := Syscall(fcntl64Syscall, fd, uintptr(cmd), uintptr(unsafe.Pointer(lk))) + if errno == 0 { + return nil + } + return errno +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/fcntl_linux_32bit.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/fcntl_linux_32bit.go new file mode 100644 index 00000000..fc0e50e0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/fcntl_linux_32bit.go @@ -0,0 +1,13 @@ +// +build linux,386 linux,arm linux,mips linux,mipsle + +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package unix + +func init() { + // On 32-bit Linux systems, the fcntl syscall that matches Go's + // Flock_t type is SYS_FCNTL64, not SYS_FCNTL. + fcntl64Syscall = SYS_FCNTL64 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/gccgo.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/gccgo.go new file mode 100644 index 00000000..cd6f5a61 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/gccgo.go @@ -0,0 +1,62 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build gccgo +// +build !aix + +package unix + +import "syscall" + +// We can't use the gc-syntax .s files for gccgo. On the plus side +// much of the functionality can be written directly in Go. + +//extern gccgoRealSyscallNoError +func realSyscallNoError(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r uintptr) + +//extern gccgoRealSyscall +func realSyscall(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r, errno uintptr) + +func SyscallNoError(trap, a1, a2, a3 uintptr) (r1, r2 uintptr) { + syscall.Entersyscall() + r := realSyscallNoError(trap, a1, a2, a3, 0, 0, 0, 0, 0, 0) + syscall.Exitsyscall() + return r, 0 +} + +func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno) { + syscall.Entersyscall() + r, errno := realSyscall(trap, a1, a2, a3, 0, 0, 0, 0, 0, 0) + syscall.Exitsyscall() + return r, 0, syscall.Errno(errno) +} + +func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) { + syscall.Entersyscall() + r, errno := realSyscall(trap, a1, a2, a3, a4, a5, a6, 0, 0, 0) + syscall.Exitsyscall() + return r, 0, syscall.Errno(errno) +} + +func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) { + syscall.Entersyscall() + r, errno := realSyscall(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9) + syscall.Exitsyscall() + return r, 0, syscall.Errno(errno) +} + +func RawSyscallNoError(trap, a1, a2, a3 uintptr) (r1, r2 uintptr) { + r := realSyscallNoError(trap, a1, a2, a3, 0, 0, 0, 0, 0, 0) + return r, 0 +} + +func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno) { + r, errno := realSyscall(trap, a1, a2, a3, 0, 0, 0, 0, 0, 0) + return r, 0, syscall.Errno(errno) +} + +func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) { + r, errno := realSyscall(trap, a1, a2, a3, a4, a5, a6, 0, 0, 0) + return r, 0, syscall.Errno(errno) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/gccgo_c.c b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/gccgo_c.c new file mode 100644 index 00000000..c44730c5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/gccgo_c.c @@ -0,0 +1,39 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build gccgo +// +build !aix + +#include +#include +#include + +#define _STRINGIFY2_(x) #x +#define _STRINGIFY_(x) _STRINGIFY2_(x) +#define GOSYM_PREFIX _STRINGIFY_(__USER_LABEL_PREFIX__) + +// Call syscall from C code because the gccgo support for calling from +// Go to C does not support varargs functions. + +struct ret { + uintptr_t r; + uintptr_t err; +}; + +struct ret +gccgoRealSyscall(uintptr_t trap, uintptr_t a1, uintptr_t a2, uintptr_t a3, uintptr_t a4, uintptr_t a5, uintptr_t a6, uintptr_t a7, uintptr_t a8, uintptr_t a9) +{ + struct ret r; + + errno = 0; + r.r = syscall(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9); + r.err = errno; + return r; +} + +uintptr_t +gccgoRealSyscallNoError(uintptr_t trap, uintptr_t a1, uintptr_t a2, uintptr_t a3, uintptr_t a4, uintptr_t a5, uintptr_t a6, uintptr_t a7, uintptr_t a8, uintptr_t a9) +{ + return syscall(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9); +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/gccgo_linux_amd64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/gccgo_linux_amd64.go new file mode 100644 index 00000000..251a977a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/gccgo_linux_amd64.go @@ -0,0 +1,20 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build gccgo,linux,amd64 + +package unix + +import "syscall" + +//extern gettimeofday +func realGettimeofday(*Timeval, *byte) int32 + +func gettimeofday(tv *Timeval) (err syscall.Errno) { + r := realGettimeofday(tv, nil) + if r < 0 { + return syscall.GetErrno() + } + return 0 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ioctl.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ioctl.go new file mode 100644 index 00000000..f121a8d6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ioctl.go @@ -0,0 +1,30 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris + +package unix + +import "runtime" + +// IoctlSetWinsize performs an ioctl on fd with a *Winsize argument. +// +// To change fd's window size, the req argument should be TIOCSWINSZ. +func IoctlSetWinsize(fd int, req uint, value *Winsize) error { + // TODO: if we get the chance, remove the req parameter and + // hardcode TIOCSWINSZ. + err := ioctlSetWinsize(fd, req, value) + runtime.KeepAlive(value) + return err +} + +// IoctlSetTermios performs an ioctl on fd with a *Termios. +// +// The req value will usually be TCSETA or TIOCSETA. +func IoctlSetTermios(fd int, req uint, value *Termios) error { + // TODO: if we get the chance, remove the req parameter. + err := ioctlSetTermios(fd, req, value) + runtime.KeepAlive(value) + return err +} diff --git a/vendor/golang.org/x/sys/unix/mkall.sh b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/mkall.sh similarity index 51% rename from vendor/golang.org/x/sys/unix/mkall.sh rename to vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/mkall.sh index 890ec464..9b76ad66 100755 --- a/vendor/golang.org/x/sys/unix/mkall.sh +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/mkall.sh @@ -10,14 +10,13 @@ GOOSARCH="${GOOS}_${GOARCH}" # defaults -mksyscall="go run mksyscall.go" +mksyscall="./mksyscall.pl" mkerrors="./mkerrors.sh" zerrors="zerrors_$GOOSARCH.go" mksysctl="" zsysctl="zsysctl_$GOOSARCH.go" mksysnum= mktypes= -mkasm= run="sh" cmd="" @@ -46,8 +45,8 @@ case "$#" in exit 2 esac -if [[ "$GOOS" = "linux" ]]; then - # Use the Docker-based build system +if [[ "$GOOS" = "linux" ]] && [[ "$GOARCH" != "sparc64" ]]; then + # Use then new build system # Files generated through docker (use $cmd so you can Ctl-C the build or run) $cmd docker build --tag generate:$GOOS $GOOS $cmd docker run --interactive --tty --volume $(dirname "$(readlink -f "$0")"):/build generate:$GOOS @@ -62,130 +61,112 @@ _* | *_ | _) ;; aix_ppc) mkerrors="$mkerrors -maix32" - mksyscall="go run mksyscall_aix_ppc.go -aix" + mksyscall="./mksyscall_aix_ppc.pl -aix" mktypes="GOARCH=$GOARCH go tool cgo -godefs" ;; aix_ppc64) mkerrors="$mkerrors -maix64" - mksyscall="go run mksyscall_aix_ppc64.go -aix" + mksyscall="./mksyscall_aix_ppc64.pl -aix" mktypes="GOARCH=$GOARCH go tool cgo -godefs" ;; darwin_386) mkerrors="$mkerrors -m32" - mksyscall="go run mksyscall.go -l32" - mksysnum="go run mksysnum.go $(xcrun --show-sdk-path --sdk macosx)/usr/include/sys/syscall.h" + mksyscall="./mksyscall.pl -l32" + mksysnum="./mksysnum_darwin.pl $(xcrun --show-sdk-path --sdk macosx)/usr/include/sys/syscall.h" mktypes="GOARCH=$GOARCH go tool cgo -godefs" - mkasm="go run mkasm_darwin.go" ;; darwin_amd64) mkerrors="$mkerrors -m64" - mksysnum="go run mksysnum.go $(xcrun --show-sdk-path --sdk macosx)/usr/include/sys/syscall.h" + mksysnum="./mksysnum_darwin.pl $(xcrun --show-sdk-path --sdk macosx)/usr/include/sys/syscall.h" mktypes="GOARCH=$GOARCH go tool cgo -godefs" - mkasm="go run mkasm_darwin.go" ;; darwin_arm) mkerrors="$mkerrors" - mksyscall="go run mksyscall.go -l32" - mksysnum="go run mksysnum.go $(xcrun --show-sdk-path --sdk iphoneos)/usr/include/sys/syscall.h" + mksysnum="./mksysnum_darwin.pl $(xcrun --show-sdk-path --sdk iphoneos)/usr/include/sys/syscall.h" mktypes="GOARCH=$GOARCH go tool cgo -godefs" - mkasm="go run mkasm_darwin.go" ;; darwin_arm64) mkerrors="$mkerrors -m64" - mksysnum="go run mksysnum.go $(xcrun --show-sdk-path --sdk iphoneos)/usr/include/sys/syscall.h" + mksysnum="./mksysnum_darwin.pl $(xcrun --show-sdk-path --sdk iphoneos)/usr/include/sys/syscall.h" mktypes="GOARCH=$GOARCH go tool cgo -godefs" - mkasm="go run mkasm_darwin.go" ;; dragonfly_amd64) mkerrors="$mkerrors -m64" - mksyscall="go run mksyscall.go -dragonfly" - mksysnum="go run mksysnum.go 'https://gitweb.dragonflybsd.org/dragonfly.git/blob_plain/HEAD:/sys/kern/syscalls.master'" + mksyscall="./mksyscall.pl -dragonfly" + mksysnum="curl -s 'http://gitweb.dragonflybsd.org/dragonfly.git/blob_plain/HEAD:/sys/kern/syscalls.master' | ./mksysnum_dragonfly.pl" mktypes="GOARCH=$GOARCH go tool cgo -godefs" ;; freebsd_386) mkerrors="$mkerrors -m32" - mksyscall="go run mksyscall.go -l32" - mksysnum="go run mksysnum.go 'https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master'" + mksyscall="./mksyscall.pl -l32" + mksysnum="curl -s 'http://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master' | ./mksysnum_freebsd.pl" mktypes="GOARCH=$GOARCH go tool cgo -godefs" ;; freebsd_amd64) mkerrors="$mkerrors -m64" - mksysnum="go run mksysnum.go 'https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master'" + mksysnum="curl -s 'http://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master' | ./mksysnum_freebsd.pl" mktypes="GOARCH=$GOARCH go tool cgo -godefs" ;; freebsd_arm) mkerrors="$mkerrors" - mksyscall="go run mksyscall.go -l32 -arm" - mksysnum="go run mksysnum.go 'https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master'" + mksyscall="./mksyscall.pl -l32 -arm" + mksysnum="curl -s 'http://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master' | ./mksysnum_freebsd.pl" # Let the type of C char be signed for making the bare syscall # API consistent across platforms. mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" ;; -freebsd_arm64) +linux_sparc64) + GOOSARCH_in=syscall_linux_sparc64.go + unistd_h=/usr/include/sparc64-linux-gnu/asm/unistd.h mkerrors="$mkerrors -m64" - mksysnum="go run mksysnum.go 'https://svn.freebsd.org/base/stable/11/sys/kern/syscalls.master'" + mksysnum="./mksysnum_linux.pl $unistd_h" mktypes="GOARCH=$GOARCH go tool cgo -godefs" ;; netbsd_386) mkerrors="$mkerrors -m32" - mksyscall="go run mksyscall.go -l32 -netbsd" - mksysnum="go run mksysnum.go 'http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/sys/kern/syscalls.master'" + mksyscall="./mksyscall.pl -l32 -netbsd" + mksysnum="curl -s 'http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_netbsd.pl" mktypes="GOARCH=$GOARCH go tool cgo -godefs" ;; netbsd_amd64) mkerrors="$mkerrors -m64" - mksyscall="go run mksyscall.go -netbsd" - mksysnum="go run mksysnum.go 'http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/sys/kern/syscalls.master'" + mksyscall="./mksyscall.pl -netbsd" + mksysnum="curl -s 'http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_netbsd.pl" mktypes="GOARCH=$GOARCH go tool cgo -godefs" ;; netbsd_arm) mkerrors="$mkerrors" - mksyscall="go run mksyscall.go -l32 -netbsd -arm" - mksysnum="go run mksysnum.go 'http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/sys/kern/syscalls.master'" + mksyscall="./mksyscall.pl -l32 -netbsd -arm" + mksysnum="curl -s 'http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_netbsd.pl" # Let the type of C char be signed for making the bare syscall # API consistent across platforms. mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" ;; -netbsd_arm64) - mkerrors="$mkerrors -m64" - mksyscall="go run mksyscall.go -netbsd" - mksysnum="go run mksysnum.go 'http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/sys/kern/syscalls.master'" - mktypes="GOARCH=$GOARCH go tool cgo -godefs" - ;; openbsd_386) mkerrors="$mkerrors -m32" - mksyscall="go run mksyscall.go -l32 -openbsd" - mksysctl="go run mksysctl_openbsd.go" - mksysnum="go run mksysnum.go 'https://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master'" + mksyscall="./mksyscall.pl -l32 -openbsd" + mksysctl="./mksysctl_openbsd.pl" + mksysnum="curl -s 'http://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_openbsd.pl" mktypes="GOARCH=$GOARCH go tool cgo -godefs" ;; openbsd_amd64) mkerrors="$mkerrors -m64" - mksyscall="go run mksyscall.go -openbsd" - mksysctl="go run mksysctl_openbsd.go" - mksysnum="go run mksysnum.go 'https://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master'" + mksyscall="./mksyscall.pl -openbsd" + mksysctl="./mksysctl_openbsd.pl" + mksysnum="curl -s 'http://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_openbsd.pl" mktypes="GOARCH=$GOARCH go tool cgo -godefs" ;; openbsd_arm) mkerrors="$mkerrors" - mksyscall="go run mksyscall.go -l32 -openbsd -arm" - mksysctl="go run mksysctl_openbsd.go" - mksysnum="go run mksysnum.go 'https://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master'" - # Let the type of C char be signed for making the bare syscall - # API consistent across platforms. - mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" - ;; -openbsd_arm64) - mkerrors="$mkerrors -m64" - mksyscall="go run mksyscall.go -openbsd" - mksysctl="go run mksysctl_openbsd.go" - mksysnum="go run mksysnum.go 'https://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master'" + mksyscall="./mksyscall.pl -l32 -openbsd -arm" + mksysctl="./mksysctl_openbsd.pl" + mksysnum="curl -s 'http://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_openbsd.pl" # Let the type of C char be signed for making the bare syscall # API consistent across platforms. mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" ;; solaris_amd64) - mksyscall="go run mksyscall_solaris.go" + mksyscall="./mksyscall_solaris.pl" mkerrors="$mkerrors -m64" mksysnum= mktypes="GOARCH=$GOARCH go tool cgo -godefs" @@ -210,13 +191,6 @@ esac if [ "$GOOSARCH" == "aix_ppc64" ]; then # aix/ppc64 script generates files instead of writing to stdin. echo "$mksyscall -tags $GOOS,$GOARCH $syscall_goos $GOOSARCH_in && gofmt -w zsyscall_$GOOSARCH.go && gofmt -w zsyscall_"$GOOSARCH"_gccgo.go && gofmt -w zsyscall_"$GOOSARCH"_gc.go " ; - elif [ "$GOOS" == "darwin" ]; then - # pre-1.12, direct syscalls - echo "$mksyscall -tags $GOOS,$GOARCH,!go1.12 $syscall_goos syscall_darwin_${GOARCH}.1_11.go $GOOSARCH_in |gofmt >zsyscall_$GOOSARCH.1_11.go"; - # 1.12 and later, syscalls via libSystem - echo "$mksyscall -tags $GOOS,$GOARCH,go1.12 $syscall_goos $GOOSARCH_in |gofmt >zsyscall_$GOOSARCH.go"; - # 1.13 and later, syscalls via libSystem (including syscallPtr) - echo "$mksyscall -tags $GOOS,$GOARCH,go1.13 syscall_darwin.1_13.go |gofmt >zsyscall_$GOOSARCH.1_13.go"; else echo "$mksyscall -tags $GOOS,$GOARCH $syscall_goos $GOOSARCH_in |gofmt >zsyscall_$GOOSARCH.go"; fi @@ -224,6 +198,7 @@ esac esac if [ -n "$mksysctl" ]; then echo "$mksysctl |gofmt >$zsysctl"; fi if [ -n "$mksysnum" ]; then echo "$mksysnum |gofmt >zsysnum_$GOOSARCH.go"; fi - if [ -n "$mktypes" ]; then echo "$mktypes types_$GOOS.go | go run mkpost.go > ztypes_$GOOSARCH.go"; fi - if [ -n "$mkasm" ]; then echo "$mkasm $GOARCH"; fi + if [ -n "$mktypes" ]; then + echo "$mktypes types_$GOOS.go | go run mkpost.go > ztypes_$GOOSARCH.go"; + fi ) | $run diff --git a/vendor/golang.org/x/sys/unix/mkerrors.sh b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/mkerrors.sh similarity index 90% rename from vendor/golang.org/x/sys/unix/mkerrors.sh rename to vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/mkerrors.sh index 67b84828..7943853f 100755 --- a/vendor/golang.org/x/sys/unix/mkerrors.sh +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/mkerrors.sh @@ -17,10 +17,12 @@ if test -z "$GOARCH" -o -z "$GOOS"; then fi # Check that we are using the new build system if we should -if [[ "$GOOS" = "linux" ]] && [[ "$GOLANG_SYS_BUILD" != "docker" ]]; then - echo 1>&2 "In the Docker based build system, mkerrors should not be called directly." - echo 1>&2 "See README.md" - exit 1 +if [[ "$GOOS" = "linux" ]] && [[ "$GOARCH" != "sparc64" ]]; then + if [[ "$GOLANG_SYS_BUILD" != "docker" ]]; then + echo 1>&2 "In the new build system, mkerrors should not be called directly." + echo 1>&2 "See README.md" + exit 1 + fi fi if [[ "$GOOS" = "aix" ]]; then @@ -60,7 +62,6 @@ includes_Darwin=' #include #include #include -#include #include #include #include @@ -81,7 +82,6 @@ includes_Darwin=' includes_DragonFly=' #include #include -#include #include #include #include @@ -101,11 +101,10 @@ includes_DragonFly=' ' includes_FreeBSD=' -#include +#include #include #include #include -#include #include #include #include @@ -182,68 +181,47 @@ struct ltchars { #include #include #include -#include -#include #include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include #include -#include #include #include #include -#include #include #include -#include +#include +#include +#include +#include #include #include -#include #include #include -#include #include #include #include -#include #include -#include #include #include -#include #include +#include #include #include -#include #include -#include -#include -#include #include +#include +#include +#include +#include +#include +#include #include - +#include +#include +#include #include #include - -#if defined(__sparc__) -// On sparc{,64}, the kernel defines struct termios2 itself which clashes with the -// definition in glibc. As only the error constants are needed here, include the -// generic termibits.h (which is included by termbits.h on sparc). -#include -#else #include -#endif #ifndef MSG_FASTOPEN #define MSG_FASTOPEN 0x20000000 @@ -272,10 +250,15 @@ struct ltchars { #define FS_KEY_DESC_PREFIX_SIZE 8 #define FS_MAX_KEY_SIZE 64 -// The code generator produces -0x1 for (~0), but an unsigned value is necessary -// for the tipc_subscr timeout __u32 field. -#undef TIPC_WAIT_FOREVER -#define TIPC_WAIT_FOREVER 0xffffffff +// XDP socket constants do not appear to be picked up otherwise. +// Copied from samples/bpf/xdpsock_user.c. +#ifndef SOL_XDP +#define SOL_XDP 283 +#endif + +#ifndef AF_XDP +#define AF_XDP 44 +#endif ' includes_NetBSD=' @@ -285,7 +268,6 @@ includes_NetBSD=' #include #include #include -#include #include #include #include @@ -312,7 +294,6 @@ includes_OpenBSD=' #include #include #include -#include #include #include #include @@ -349,7 +330,6 @@ includes_OpenBSD=' includes_SunOS=' #include #include -#include #include #include #include @@ -442,7 +422,6 @@ ccflags="$@" $2 == "XCASE" || $2 == "ALTWERASE" || $2 == "NOKERNINFO" || - $2 == "NFDBITS" || $2 ~ /^PAR/ || $2 ~ /^SIG[^_]/ || $2 ~ /^O[CNPFPL][A-Z]+[^_][A-Z]+$/ || @@ -452,9 +431,7 @@ ccflags="$@" $2 ~ /^TC[IO](ON|OFF)$/ || $2 ~ /^IN_/ || $2 ~ /^LOCK_(SH|EX|NB|UN)$/ || - $2 ~ /^LO_(KEY|NAME)_SIZE$/ || - $2 ~ /^LOOP_(CLR|CTL|GET|SET)_/ || - $2 ~ /^(AF|SOCK|SO|SOL|IPPROTO|IP|IPV6|ICMP6|TCP|MCAST|EVFILT|NOTE|EV|SHUT|PROT|MAP|MFD|T?PACKET|MSG|SCM|MCL|DT|MADV|PR)_/ || + $2 ~ /^(AF|SOCK|SO|SOL|IPPROTO|IP|IPV6|ICMP6|TCP|EVFILT|NOTE|EV|SHUT|PROT|MAP|MFD|T?PACKET|MSG|SCM|MCL|DT|MADV|PR)_/ || $2 ~ /^TP_STATUS_/ || $2 ~ /^FALLOC_/ || $2 == "ICMPV6_FILTER" || @@ -467,13 +444,11 @@ ccflags="$@" $2 ~ /^SYSCTL_VERS/ || $2 !~ "MNT_BITS" && $2 ~ /^(MS|MNT|UMOUNT)_/ || - $2 ~ /^NS_GET_/ || $2 ~ /^TUN(SET|GET|ATTACH|DETACH)/ || - $2 ~ /^(O|F|[ES]?FD|NAME|S|PTRACE|PT)_/ || + $2 ~ /^(O|F|E?FD|NAME|S|PTRACE|PT)_/ || $2 ~ /^KEXEC_/ || $2 ~ /^LINUX_REBOOT_CMD_/ || $2 ~ /^LINUX_REBOOT_MAGIC[12]$/ || - $2 ~ /^MODULE_INIT_/ || $2 !~ "NLA_TYPE_MASK" && $2 ~ /^(NETLINK|NLM|NLMSG|NLA|IFA|IFAN|RT|RTC|RTCF|RTN|RTPROT|RTNH|ARPHRD|ETH_P|NETNSA)_/ || $2 ~ /^SIOC/ || @@ -488,15 +463,14 @@ ccflags="$@" $2 ~ /^RLIMIT_(AS|CORE|CPU|DATA|FSIZE|LOCKS|MEMLOCK|MSGQUEUE|NICE|NOFILE|NPROC|RSS|RTPRIO|RTTIME|SIGPENDING|STACK)|RLIM_INFINITY/ || $2 ~ /^PRIO_(PROCESS|PGRP|USER)/ || $2 ~ /^CLONE_[A-Z_]+/ || - $2 !~ /^(BPF_TIMEVAL|BPF_FIB_LOOKUP_[A-Z]+)$/ && + $2 !~ /^(BPF_TIMEVAL)$/ && $2 ~ /^(BPF|DLT)_/ || - $2 ~ /^(CLOCK|TIMER)_/ || + $2 ~ /^CLOCK_/ || $2 ~ /^CAN_/ || $2 ~ /^CAP_/ || $2 ~ /^ALG_/ || $2 ~ /^FS_(POLICY_FLAGS|KEY_DESC|ENCRYPTION_MODE|[A-Z0-9_]+_KEY_SIZE|IOC_(GET|SET)_ENCRYPTION)/ || $2 ~ /^GRND_/ || - $2 ~ /^RND/ || $2 ~ /^KEY_(SPEC|REQKEY_DEFL)_/ || $2 ~ /^KEYCTL_/ || $2 ~ /^PERF_EVENT_IOC_/ || @@ -522,12 +496,8 @@ ccflags="$@" $2 ~ /^NFN/ || $2 ~ /^XDP_/ || $2 ~ /^(HDIO|WIN|SMART)_/ || - $2 ~ /^CRYPTO_/ || - $2 ~ /^TIPC_/ || $2 !~ "WMESGLEN" && $2 ~ /^W[A-Z0-9]+$/ || - $2 ~/^PPPIOC/ || - $2 ~ /^FAN_|FANOTIFY_/ || $2 ~ /^BLK[A-Z]*(GET$|SET$|BUF$|PART$|SIZE)/ {printf("\t%s = C.%s\n", $2, $2)} $2 ~ /^__WCOREFLAG$/ {next} $2 ~ /^__W[A-Z0-9]+$/ {printf("\t%s = C.%s\n", substr($2,3), $2)} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/mkpost.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/mkpost.go new file mode 100644 index 00000000..7e5c22c4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/mkpost.go @@ -0,0 +1,98 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +// mkpost processes the output of cgo -godefs to +// modify the generated types. It is used to clean up +// the sys API in an architecture specific manner. +// +// mkpost is run after cgo -godefs; see README.md. +package main + +import ( + "bytes" + "fmt" + "go/format" + "io/ioutil" + "log" + "os" + "regexp" +) + +func main() { + // Get the OS and architecture (using GOARCH_TARGET if it exists) + goos := os.Getenv("GOOS") + goarch := os.Getenv("GOARCH_TARGET") + if goarch == "" { + goarch = os.Getenv("GOARCH") + } + // Check that we are using the new build system if we should be. + if goos == "linux" && goarch != "sparc64" { + if os.Getenv("GOLANG_SYS_BUILD") != "docker" { + os.Stderr.WriteString("In the new build system, mkpost should not be called directly.\n") + os.Stderr.WriteString("See README.md\n") + os.Exit(1) + } + } + + b, err := ioutil.ReadAll(os.Stdin) + if err != nil { + log.Fatal(err) + } + + // Intentionally export __val fields in Fsid and Sigset_t + valRegex := regexp.MustCompile(`type (Fsid|Sigset_t) struct {(\s+)X__val(\s+\S+\s+)}`) + b = valRegex.ReplaceAll(b, []byte("type $1 struct {${2}Val$3}")) + + // If we have empty Ptrace structs, we should delete them. Only s390x emits + // nonempty Ptrace structs. + ptraceRexexp := regexp.MustCompile(`type Ptrace((Psw|Fpregs|Per) struct {\s*})`) + b = ptraceRexexp.ReplaceAll(b, nil) + + // Replace the control_regs union with a blank identifier for now. + controlRegsRegex := regexp.MustCompile(`(Control_regs)\s+\[0\]uint64`) + b = controlRegsRegex.ReplaceAll(b, []byte("_ [0]uint64")) + + // Remove fields that are added by glibc + // Note that this is unstable as the identifers are private. + removeFieldsRegex := regexp.MustCompile(`X__glibc\S*`) + b = removeFieldsRegex.ReplaceAll(b, []byte("_")) + + // Convert [65]int8 to [65]byte in Utsname members to simplify + // conversion to string; see golang.org/issue/20753 + convertUtsnameRegex := regexp.MustCompile(`((Sys|Node|Domain)name|Release|Version|Machine)(\s+)\[(\d+)\]u?int8`) + b = convertUtsnameRegex.ReplaceAll(b, []byte("$1$3[$4]byte")) + + // Remove spare fields (e.g. in Statx_t) + spareFieldsRegex := regexp.MustCompile(`X__spare\S*`) + b = spareFieldsRegex.ReplaceAll(b, []byte("_")) + + // Remove cgo padding fields + removePaddingFieldsRegex := regexp.MustCompile(`Pad_cgo_\d+`) + b = removePaddingFieldsRegex.ReplaceAll(b, []byte("_")) + + // Remove padding, hidden, or unused fields + removeFieldsRegex = regexp.MustCompile(`\b(X_\S+|Padding)`) + b = removeFieldsRegex.ReplaceAll(b, []byte("_")) + + // Remove the first line of warning from cgo + b = b[bytes.IndexByte(b, '\n')+1:] + // Modify the command in the header to include: + // mkpost, our own warning, and a build tag. + replacement := fmt.Sprintf(`$1 | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build %s,%s`, goarch, goos) + cgoCommandRegex := regexp.MustCompile(`(cgo -godefs .*)`) + b = cgoCommandRegex.ReplaceAll(b, []byte(replacement)) + + // gofmt + b, err = format.Source(b) + if err != nil { + log.Fatal(err) + } + + os.Stdout.Write(b) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/mksyscall.pl b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/mksyscall.pl new file mode 100755 index 00000000..1f6b926f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/mksyscall.pl @@ -0,0 +1,341 @@ +#!/usr/bin/env perl +# Copyright 2009 The Go Authors. All rights reserved. +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file. + +# This program reads a file containing function prototypes +# (like syscall_darwin.go) and generates system call bodies. +# The prototypes are marked by lines beginning with "//sys" +# and read like func declarations if //sys is replaced by func, but: +# * The parameter lists must give a name for each argument. +# This includes return parameters. +# * The parameter lists must give a type for each argument: +# the (x, y, z int) shorthand is not allowed. +# * If the return parameter is an error number, it must be named errno. + +# A line beginning with //sysnb is like //sys, except that the +# goroutine will not be suspended during the execution of the system +# call. This must only be used for system calls which can never +# block, as otherwise the system call could cause all goroutines to +# hang. + +use strict; + +my $cmdline = "mksyscall.pl " . join(' ', @ARGV); +my $errors = 0; +my $_32bit = ""; +my $plan9 = 0; +my $openbsd = 0; +my $netbsd = 0; +my $dragonfly = 0; +my $arm = 0; # 64-bit value should use (even, odd)-pair +my $tags = ""; # build tags + +if($ARGV[0] eq "-b32") { + $_32bit = "big-endian"; + shift; +} elsif($ARGV[0] eq "-l32") { + $_32bit = "little-endian"; + shift; +} +if($ARGV[0] eq "-plan9") { + $plan9 = 1; + shift; +} +if($ARGV[0] eq "-openbsd") { + $openbsd = 1; + shift; +} +if($ARGV[0] eq "-netbsd") { + $netbsd = 1; + shift; +} +if($ARGV[0] eq "-dragonfly") { + $dragonfly = 1; + shift; +} +if($ARGV[0] eq "-arm") { + $arm = 1; + shift; +} +if($ARGV[0] eq "-tags") { + shift; + $tags = $ARGV[0]; + shift; +} + +if($ARGV[0] =~ /^-/) { + print STDERR "usage: mksyscall.pl [-b32 | -l32] [-tags x,y] [file ...]\n"; + exit 1; +} + +# Check that we are using the new build system if we should +if($ENV{'GOOS'} eq "linux" && $ENV{'GOARCH'} ne "sparc64") { + if($ENV{'GOLANG_SYS_BUILD'} ne "docker") { + print STDERR "In the new build system, mksyscall should not be called directly.\n"; + print STDERR "See README.md\n"; + exit 1; + } +} + + +sub parseparamlist($) { + my ($list) = @_; + $list =~ s/^\s*//; + $list =~ s/\s*$//; + if($list eq "") { + return (); + } + return split(/\s*,\s*/, $list); +} + +sub parseparam($) { + my ($p) = @_; + if($p !~ /^(\S*) (\S*)$/) { + print STDERR "$ARGV:$.: malformed parameter: $p\n"; + $errors = 1; + return ("xx", "int"); + } + return ($1, $2); +} + +my $text = ""; +while(<>) { + chomp; + s/\s+/ /g; + s/^\s+//; + s/\s+$//; + my $nonblock = /^\/\/sysnb /; + next if !/^\/\/sys / && !$nonblock; + + # Line must be of the form + # func Open(path string, mode int, perm int) (fd int, errno error) + # Split into name, in params, out params. + if(!/^\/\/sys(nb)? (\w+)\(([^()]*)\)\s*(?:\(([^()]+)\))?\s*(?:=\s*((?i)SYS_[A-Z0-9_]+))?$/) { + print STDERR "$ARGV:$.: malformed //sys declaration\n"; + $errors = 1; + next; + } + my ($func, $in, $out, $sysname) = ($2, $3, $4, $5); + + # Split argument lists on comma. + my @in = parseparamlist($in); + my @out = parseparamlist($out); + + # Try in vain to keep people from editing this file. + # The theory is that they jump into the middle of the file + # without reading the header. + $text .= "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n"; + + # Go function header. + my $out_decl = @out ? sprintf(" (%s)", join(', ', @out)) : ""; + $text .= sprintf "func %s(%s)%s {\n", $func, join(', ', @in), $out_decl; + + # Check if err return available + my $errvar = ""; + foreach my $p (@out) { + my ($name, $type) = parseparam($p); + if($type eq "error") { + $errvar = $name; + last; + } + } + + # Prepare arguments to Syscall. + my @args = (); + my $n = 0; + foreach my $p (@in) { + my ($name, $type) = parseparam($p); + if($type =~ /^\*/) { + push @args, "uintptr(unsafe.Pointer($name))"; + } elsif($type eq "string" && $errvar ne "") { + $text .= "\tvar _p$n *byte\n"; + $text .= "\t_p$n, $errvar = BytePtrFromString($name)\n"; + $text .= "\tif $errvar != nil {\n\t\treturn\n\t}\n"; + push @args, "uintptr(unsafe.Pointer(_p$n))"; + $n++; + } elsif($type eq "string") { + print STDERR "$ARGV:$.: $func uses string arguments, but has no error return\n"; + $text .= "\tvar _p$n *byte\n"; + $text .= "\t_p$n, _ = BytePtrFromString($name)\n"; + push @args, "uintptr(unsafe.Pointer(_p$n))"; + $n++; + } elsif($type =~ /^\[\](.*)/) { + # Convert slice into pointer, length. + # Have to be careful not to take address of &a[0] if len == 0: + # pass dummy pointer in that case. + # Used to pass nil, but some OSes or simulators reject write(fd, nil, 0). + $text .= "\tvar _p$n unsafe.Pointer\n"; + $text .= "\tif len($name) > 0 {\n\t\t_p$n = unsafe.Pointer(\&${name}[0])\n\t}"; + $text .= " else {\n\t\t_p$n = unsafe.Pointer(&_zero)\n\t}"; + $text .= "\n"; + push @args, "uintptr(_p$n)", "uintptr(len($name))"; + $n++; + } elsif($type eq "int64" && ($openbsd || $netbsd)) { + push @args, "0"; + if($_32bit eq "big-endian") { + push @args, "uintptr($name>>32)", "uintptr($name)"; + } elsif($_32bit eq "little-endian") { + push @args, "uintptr($name)", "uintptr($name>>32)"; + } else { + push @args, "uintptr($name)"; + } + } elsif($type eq "int64" && $dragonfly) { + if ($func !~ /^extp(read|write)/i) { + push @args, "0"; + } + if($_32bit eq "big-endian") { + push @args, "uintptr($name>>32)", "uintptr($name)"; + } elsif($_32bit eq "little-endian") { + push @args, "uintptr($name)", "uintptr($name>>32)"; + } else { + push @args, "uintptr($name)"; + } + } elsif($type eq "int64" && $_32bit ne "") { + if(@args % 2 && $arm) { + # arm abi specifies 64-bit argument uses + # (even, odd) pair + push @args, "0" + } + if($_32bit eq "big-endian") { + push @args, "uintptr($name>>32)", "uintptr($name)"; + } else { + push @args, "uintptr($name)", "uintptr($name>>32)"; + } + } else { + push @args, "uintptr($name)"; + } + } + + # Determine which form to use; pad args with zeros. + my $asm = "Syscall"; + if ($nonblock) { + if ($errvar eq "" && $ENV{'GOOS'} eq "linux") { + $asm = "RawSyscallNoError"; + } else { + $asm = "RawSyscall"; + } + } else { + if ($errvar eq "" && $ENV{'GOOS'} eq "linux") { + $asm = "SyscallNoError"; + } + } + if(@args <= 3) { + while(@args < 3) { + push @args, "0"; + } + } elsif(@args <= 6) { + $asm .= "6"; + while(@args < 6) { + push @args, "0"; + } + } elsif(@args <= 9) { + $asm .= "9"; + while(@args < 9) { + push @args, "0"; + } + } else { + print STDERR "$ARGV:$.: too many arguments to system call\n"; + } + + # System call number. + if($sysname eq "") { + $sysname = "SYS_$func"; + $sysname =~ s/([a-z])([A-Z])/${1}_$2/g; # turn FooBar into Foo_Bar + $sysname =~ y/a-z/A-Z/; + } + + # Actual call. + my $args = join(', ', @args); + my $call = "$asm($sysname, $args)"; + + # Assign return values. + my $body = ""; + my @ret = ("_", "_", "_"); + my $do_errno = 0; + for(my $i=0; $i<@out; $i++) { + my $p = $out[$i]; + my ($name, $type) = parseparam($p); + my $reg = ""; + if($name eq "err" && !$plan9) { + $reg = "e1"; + $ret[2] = $reg; + $do_errno = 1; + } elsif($name eq "err" && $plan9) { + $ret[0] = "r0"; + $ret[2] = "e1"; + next; + } else { + $reg = sprintf("r%d", $i); + $ret[$i] = $reg; + } + if($type eq "bool") { + $reg = "$reg != 0"; + } + if($type eq "int64" && $_32bit ne "") { + # 64-bit number in r1:r0 or r0:r1. + if($i+2 > @out) { + print STDERR "$ARGV:$.: not enough registers for int64 return\n"; + } + if($_32bit eq "big-endian") { + $reg = sprintf("int64(r%d)<<32 | int64(r%d)", $i, $i+1); + } else { + $reg = sprintf("int64(r%d)<<32 | int64(r%d)", $i+1, $i); + } + $ret[$i] = sprintf("r%d", $i); + $ret[$i+1] = sprintf("r%d", $i+1); + } + if($reg ne "e1" || $plan9) { + $body .= "\t$name = $type($reg)\n"; + } + } + if ($ret[0] eq "_" && $ret[1] eq "_" && $ret[2] eq "_") { + $text .= "\t$call\n"; + } else { + if ($errvar eq "" && $ENV{'GOOS'} eq "linux") { + # raw syscall without error on Linux, see golang.org/issue/22924 + $text .= "\t$ret[0], $ret[1] := $call\n"; + } else { + $text .= "\t$ret[0], $ret[1], $ret[2] := $call\n"; + } + } + $text .= $body; + + if ($plan9 && $ret[2] eq "e1") { + $text .= "\tif int32(r0) == -1 {\n"; + $text .= "\t\terr = e1\n"; + $text .= "\t}\n"; + } elsif ($do_errno) { + $text .= "\tif e1 != 0 {\n"; + $text .= "\t\terr = errnoErr(e1)\n"; + $text .= "\t}\n"; + } + $text .= "\treturn\n"; + $text .= "}\n\n"; +} + +chomp $text; +chomp $text; + +if($errors) { + exit 1; +} + +print <) { + chomp; + s/\s+/ /g; + s/^\s+//; + s/\s+$//; + $package = $1 if !$package && /^package (\S+)$/; + my $nonblock = /^\/\/sysnb /; + next if !/^\/\/sys / && !$nonblock; + + # Line must be of the form + # func Open(path string, mode int, perm int) (fd int, err error) + # Split into name, in params, out params. + if(!/^\/\/sys(nb)? (\w+)\(([^()]*)\)\s*(?:\(([^()]+)\))?\s*(?:=\s*(?:(\w*)\.)?(\w*))?$/) { + print STDERR "$ARGV:$.: malformed //sys declaration\n"; + $errors = 1; + next; + } + my ($nb, $func, $in, $out, $modname, $sysname) = ($1, $2, $3, $4, $5, $6); + + # Split argument lists on comma. + my @in = parseparamlist($in); + my @out = parseparamlist($out); + + $in = join(', ', @in); + $out = join(', ', @out); + + # Try in vain to keep people from editing this file. + # The theory is that they jump into the middle of the file + # without reading the header. + $text .= "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n"; + + # Check if value return, err return available + my $errvar = ""; + my $retvar = ""; + my $rettype = ""; + foreach my $p (@out) { + my ($name, $type) = parseparam($p); + if($type eq "error") { + $errvar = $name; + } else { + $retvar = $name; + $rettype = $type; + } + } + + # System call name. + #if($func ne "fcntl") { + + if($sysname eq "") { + $sysname = "$func"; + } + + $sysname =~ s/([a-z])([A-Z])/${1}_$2/g; + $sysname =~ y/A-Z/a-z/; # All libc functions are lowercase. + + my $C_rettype = ""; + if($rettype eq "unsafe.Pointer") { + $C_rettype = "uintptr_t"; + } elsif($rettype eq "uintptr") { + $C_rettype = "uintptr_t"; + } elsif($rettype =~ /^_/) { + $C_rettype = "uintptr_t"; + } elsif($rettype eq "int") { + $C_rettype = "int"; + } elsif($rettype eq "int32") { + $C_rettype = "int"; + } elsif($rettype eq "int64") { + $C_rettype = "long long"; + } elsif($rettype eq "uint32") { + $C_rettype = "unsigned int"; + } elsif($rettype eq "uint64") { + $C_rettype = "unsigned long long"; + } else { + $C_rettype = "int"; + } + if($sysname eq "exit") { + $C_rettype = "void"; + } + + # Change types to c + my @c_in = (); + foreach my $p (@in) { + my ($name, $type) = parseparam($p); + if($type =~ /^\*/) { + push @c_in, "uintptr_t"; + } elsif($type eq "string") { + push @c_in, "uintptr_t"; + } elsif($type =~ /^\[\](.*)/) { + push @c_in, "uintptr_t", "size_t"; + } elsif($type eq "unsafe.Pointer") { + push @c_in, "uintptr_t"; + } elsif($type eq "uintptr") { + push @c_in, "uintptr_t"; + } elsif($type =~ /^_/) { + push @c_in, "uintptr_t"; + } elsif($type eq "int") { + push @c_in, "int"; + } elsif($type eq "int32") { + push @c_in, "int"; + } elsif($type eq "int64") { + push @c_in, "long long"; + } elsif($type eq "uint32") { + push @c_in, "unsigned int"; + } elsif($type eq "uint64") { + push @c_in, "unsigned long long"; + } else { + push @c_in, "int"; + } + } + + if ($func ne "fcntl" && $func ne "FcntlInt" && $func ne "readlen" && $func ne "writelen") { + # Imports of system calls from libc + $c_extern .= "$C_rettype $sysname"; + my $c_in = join(', ', @c_in); + $c_extern .= "($c_in);\n"; + } + + # So file name. + if($aix) { + if($modname eq "") { + $modname = "libc.a/shr_64.o"; + } else { + print STDERR "$func: only syscall using libc are available\n"; + $errors = 1; + next; + } + } + + my $strconvfunc = "C.CString"; + my $strconvtype = "*byte"; + + # Go function header. + if($out ne "") { + $out = " ($out)"; + } + if($text ne "") { + $text .= "\n" + } + + $text .= sprintf "func %s(%s)%s {\n", $func, join(', ', @in), $out ; + + # Prepare arguments to call. + my @args = (); + my $n = 0; + my $arg_n = 0; + foreach my $p (@in) { + my ($name, $type) = parseparam($p); + if($type =~ /^\*/) { + push @args, "C.uintptr_t(uintptr(unsafe.Pointer($name)))"; + } elsif($type eq "string" && $errvar ne "") { + $text .= "\t_p$n := uintptr(unsafe.Pointer($strconvfunc($name)))\n"; + push @args, "C.uintptr_t(_p$n)"; + $n++; + } elsif($type eq "string") { + print STDERR "$ARGV:$.: $func uses string arguments, but has no error return\n"; + $text .= "\t_p$n := uintptr(unsafe.Pointer($strconvfunc($name)))\n"; + push @args, "C.uintptr_t(_p$n)"; + $n++; + } elsif($type =~ /^\[\](.*)/) { + # Convert slice into pointer, length. + # Have to be careful not to take address of &a[0] if len == 0: + # pass nil in that case. + $text .= "\tvar _p$n *$1\n"; + $text .= "\tif len($name) > 0 {\n\t\t_p$n = \&$name\[0]\n\t}\n"; + push @args, "C.uintptr_t(uintptr(unsafe.Pointer(_p$n)))"; + $n++; + $text .= "\tvar _p$n int\n"; + $text .= "\t_p$n = len($name)\n"; + push @args, "C.size_t(_p$n)"; + $n++; + } elsif($type eq "int64" && $_32bit ne "") { + if($_32bit eq "big-endian") { + push @args, "uintptr($name >> 32)", "uintptr($name)"; + } else { + push @args, "uintptr($name)", "uintptr($name >> 32)"; + } + $n++; + } elsif($type eq "bool") { + $text .= "\tvar _p$n uint32\n"; + $text .= "\tif $name {\n\t\t_p$n = 1\n\t} else {\n\t\t_p$n = 0\n\t}\n"; + push @args, "_p$n"; + $n++; + } elsif($type =~ /^_/) { + push @args, "C.uintptr_t(uintptr($name))"; + } elsif($type eq "unsafe.Pointer") { + push @args, "C.uintptr_t(uintptr($name))"; + } elsif($type eq "int") { + if (($arg_n == 2) && (($func eq "readlen") || ($func eq "writelen"))) { + push @args, "C.size_t($name)"; + } elsif ($arg_n == 0 && $func eq "fcntl") { + push @args, "C.uintptr_t($name)"; + } elsif (($arg_n == 2) && (($func eq "fcntl") || ($func eq "FcntlInt"))) { + push @args, "C.uintptr_t($name)"; + } else { + push @args, "C.int($name)"; + } + } elsif($type eq "int32") { + push @args, "C.int($name)"; + } elsif($type eq "int64") { + push @args, "C.longlong($name)"; + } elsif($type eq "uint32") { + push @args, "C.uint($name)"; + } elsif($type eq "uint64") { + push @args, "C.ulonglong($name)"; + } elsif($type eq "uintptr") { + push @args, "C.uintptr_t($name)"; + } else { + push @args, "C.int($name)"; + } + $arg_n++; + } + my $nargs = @args; + + + # Determine which form to use; pad args with zeros. + if ($nonblock) { + } + + my $args = join(', ', @args); + my $call = ""; + if ($sysname eq "exit") { + if ($errvar ne "") { + $call .= "er :="; + } else { + $call .= ""; + } + } elsif ($errvar ne "") { + $call .= "r0,er :="; + } elsif ($retvar ne "") { + $call .= "r0,_ :="; + } else { + $call .= "" + } + $call .= "C.$sysname($args)"; + + # Assign return values. + my $body = ""; + my $failexpr = ""; + + for(my $i=0; $i<@out; $i++) { + my $p = $out[$i]; + my ($name, $type) = parseparam($p); + my $reg = ""; + if($name eq "err") { + $reg = "e1"; + } else { + $reg = "r0"; + } + if($reg ne "e1" ) { + $body .= "\t$name = $type($reg)\n"; + } + } + + # verify return + if ($sysname ne "exit" && $errvar ne "") { + if ($C_rettype =~ /^uintptr/) { + $body .= "\tif \(uintptr\(r0\) ==\^uintptr\(0\) && er != nil\) {\n"; + $body .= "\t\t$errvar = er\n"; + $body .= "\t}\n"; + } else { + $body .= "\tif \(r0 ==-1 && er != nil\) {\n"; + $body .= "\t\t$errvar = er\n"; + $body .= "\t}\n"; + } + } elsif ($errvar ne "") { + $body .= "\tif \(er != nil\) {\n"; + $body .= "\t\t$errvar = er\n"; + $body .= "\t}\n"; + } + + $text .= "\t$call\n"; + $text .= $body; + + $text .= "\treturn\n"; + $text .= "}\n"; +} + +if($errors) { + exit 1; +} + +print <) { + chomp; + s/\s+/ /g; + s/^\s+//; + s/\s+$//; + $package = $1 if !$package && /^package (\S+)$/; + my $nonblock = /^\/\/sysnb /; + next if !/^\/\/sys / && !$nonblock; + + # Line must be of the form + # func Open(path string, mode int, perm int) (fd int, err error) + # Split into name, in params, out params. + if(!/^\/\/sys(nb)? (\w+)\(([^()]*)\)\s*(?:\(([^()]+)\))?\s*(?:=\s*(?:(\w*)\.)?(\w*))?$/) { + print STDERR "$ARGV:$.: malformed //sys declaration\n"; + $errors = 1; + next; + } + my ($nb, $func, $in, $out, $modname, $sysname) = ($1, $2, $3, $4, $5, $6); + + # Split argument lists on comma. + my @in = parseparamlist($in); + my @out = parseparamlist($out); + + $in = join(', ', @in); + $out = join(', ', @out); + + if($sysname eq "") { + $sysname = "$func"; + } + + my $onlyCommon = 0; + if ($func eq "readlen" || $func eq "writelen" || $func eq "FcntlInt" || $func eq "FcntlFlock") { + # This function call another syscall which is already implemented. + # Therefore, the gc and gccgo part must not be generated. + $onlyCommon = 1 + } + + # Try in vain to keep people from editing this file. + # The theory is that they jump into the middle of the file + # without reading the header. + + $textcommon .= "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n"; + if (!$onlyCommon) { + $textgccgo .= "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n"; + $textgc .= "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n"; + } + + + # Check if value return, err return available + my $errvar = ""; + my $retvar = ""; + my $rettype = ""; + foreach my $p (@out) { + my ($name, $type) = parseparam($p); + if($type eq "error") { + $errvar = $name; + } else { + $retvar = $name; + $rettype = $type; + } + } + + + $sysname =~ s/([a-z])([A-Z])/${1}_$2/g; + $sysname =~ y/A-Z/a-z/; # All libc functions are lowercase. + + # GCCGO Prototype return type + my $C_rettype = ""; + if($rettype eq "unsafe.Pointer") { + $C_rettype = "uintptr_t"; + } elsif($rettype eq "uintptr") { + $C_rettype = "uintptr_t"; + } elsif($rettype =~ /^_/) { + $C_rettype = "uintptr_t"; + } elsif($rettype eq "int") { + $C_rettype = "int"; + } elsif($rettype eq "int32") { + $C_rettype = "int"; + } elsif($rettype eq "int64") { + $C_rettype = "long long"; + } elsif($rettype eq "uint32") { + $C_rettype = "unsigned int"; + } elsif($rettype eq "uint64") { + $C_rettype = "unsigned long long"; + } else { + $C_rettype = "int"; + } + if($sysname eq "exit") { + $C_rettype = "void"; + } + + # GCCGO Prototype arguments type + my @c_in = (); + foreach my $i (0 .. $#in) { + my ($name, $type) = parseparam($in[$i]); + if($type =~ /^\*/) { + push @c_in, "uintptr_t"; + } elsif($type eq "string") { + push @c_in, "uintptr_t"; + } elsif($type =~ /^\[\](.*)/) { + push @c_in, "uintptr_t", "size_t"; + } elsif($type eq "unsafe.Pointer") { + push @c_in, "uintptr_t"; + } elsif($type eq "uintptr") { + push @c_in, "uintptr_t"; + } elsif($type =~ /^_/) { + push @c_in, "uintptr_t"; + } elsif($type eq "int") { + if (($i == 0 || $i == 2) && $func eq "fcntl"){ + # These fcntl arguments needs to be uintptr to be able to call FcntlInt and FcntlFlock + push @c_in, "uintptr_t"; + } else { + push @c_in, "int"; + } + } elsif($type eq "int32") { + push @c_in, "int"; + } elsif($type eq "int64") { + push @c_in, "long long"; + } elsif($type eq "uint32") { + push @c_in, "unsigned int"; + } elsif($type eq "uint64") { + push @c_in, "unsigned long long"; + } else { + push @c_in, "int"; + } + } + + if (!$onlyCommon){ + # GCCGO Prototype Generation + # Imports of system calls from libc + $c_extern .= "$C_rettype $sysname"; + my $c_in = join(', ', @c_in); + $c_extern .= "($c_in);\n"; + } + + # GC Library name + if($modname eq "") { + $modname = "libc.a/shr_64.o"; + } else { + print STDERR "$func: only syscall using libc are available\n"; + $errors = 1; + next; + } + my $sysvarname = "libc_${sysname}"; + + if (!$onlyCommon){ + # GC Runtime import of function to allow cross-platform builds. + $dynimports .= "//go:cgo_import_dynamic ${sysvarname} ${sysname} \"$modname\"\n"; + # GC Link symbol to proc address variable. + $linknames .= "//go:linkname ${sysvarname} ${sysvarname}\n"; + # GC Library proc address variable. + push @vars, $sysvarname; + } + + my $strconvfunc ="BytePtrFromString"; + my $strconvtype = "*byte"; + + # Go function header. + if($out ne "") { + $out = " ($out)"; + } + if($textcommon ne "") { + $textcommon .= "\n" + } + + $textcommon .= sprintf "func %s(%s)%s {\n", $func, join(', ', @in), $out ; + + # Prepare arguments to call. + my @argscommun = (); # Arguments in the commun part + my @argscall = (); # Arguments for call prototype + my @argsgc = (); # Arguments for gc call (with syscall6) + my @argsgccgo = (); # Arguments for gccgo call (with C.name_of_syscall) + my $n = 0; + my $arg_n = 0; + foreach my $p (@in) { + my ($name, $type) = parseparam($p); + if($type =~ /^\*/) { + push @argscommun, "uintptr(unsafe.Pointer($name))"; + push @argscall, "$name uintptr"; + push @argsgc, "$name"; + push @argsgccgo, "C.uintptr_t($name)"; + } elsif($type eq "string" && $errvar ne "") { + $textcommon .= "\tvar _p$n $strconvtype\n"; + $textcommon .= "\t_p$n, $errvar = $strconvfunc($name)\n"; + $textcommon .= "\tif $errvar != nil {\n\t\treturn\n\t}\n"; + + push @argscommun, "uintptr(unsafe.Pointer(_p$n))"; + push @argscall, "_p$n uintptr "; + push @argsgc, "_p$n"; + push @argsgccgo, "C.uintptr_t(_p$n)"; + $n++; + } elsif($type eq "string") { + print STDERR "$ARGV:$.: $func uses string arguments, but has no error return\n"; + $textcommon .= "\tvar _p$n $strconvtype\n"; + $textcommon .= "\t_p$n, $errvar = $strconvfunc($name)\n"; + $textcommon .= "\tif $errvar != nil {\n\t\treturn\n\t}\n"; + + push @argscommun, "uintptr(unsafe.Pointer(_p$n))"; + push @argscall, "_p$n uintptr"; + push @argsgc, "_p$n"; + push @argsgccgo, "C.uintptr_t(_p$n)"; + $n++; + } elsif($type =~ /^\[\](.*)/) { + # Convert slice into pointer, length. + # Have to be careful not to take address of &a[0] if len == 0: + # pass nil in that case. + $textcommon .= "\tvar _p$n *$1\n"; + $textcommon .= "\tif len($name) > 0 {\n\t\t_p$n = \&$name\[0]\n\t}\n"; + push @argscommun, "uintptr(unsafe.Pointer(_p$n))", "len($name)"; + push @argscall, "_p$n uintptr", "_lenp$n int"; + push @argsgc, "_p$n", "uintptr(_lenp$n)"; + push @argsgccgo, "C.uintptr_t(_p$n)", "C.size_t(_lenp$n)"; + $n++; + } elsif($type eq "int64" && $_32bit ne "") { + print STDERR "$ARGV:$.: $func uses int64 with 32 bits mode. Case not yet implemented\n"; + # if($_32bit eq "big-endian") { + # push @args, "uintptr($name >> 32)", "uintptr($name)"; + # } else { + # push @args, "uintptr($name)", "uintptr($name >> 32)"; + # } + # $n++; + } elsif($type eq "bool") { + print STDERR "$ARGV:$.: $func uses bool. Case not yet implemented\n"; + # $text .= "\tvar _p$n uint32\n"; + # $text .= "\tif $name {\n\t\t_p$n = 1\n\t} else {\n\t\t_p$n = 0\n\t}\n"; + # push @args, "_p$n"; + # $n++; + } elsif($type =~ /^_/ ||$type eq "unsafe.Pointer") { + push @argscommun, "uintptr($name)"; + push @argscall, "$name uintptr"; + push @argsgc, "$name"; + push @argsgccgo, "C.uintptr_t($name)"; + } elsif($type eq "int") { + if (($arg_n == 0 || $arg_n == 2) && ($func eq "fcntl" || $func eq "FcntlInt" || $func eq "FcntlFlock")) { + # These fcntl arguments need to be uintptr to be able to call FcntlInt and FcntlFlock + push @argscommun, "uintptr($name)"; + push @argscall, "$name uintptr"; + push @argsgc, "$name"; + push @argsgccgo, "C.uintptr_t($name)"; + } else { + push @argscommun, "$name"; + push @argscall, "$name int"; + push @argsgc, "uintptr($name)"; + push @argsgccgo, "C.int($name)"; + } + } elsif($type eq "int32") { + push @argscommun, "$name"; + push @argscall, "$name int32"; + push @argsgc, "uintptr($name)"; + push @argsgccgo, "C.int($name)"; + } elsif($type eq "int64") { + push @argscommun, "$name"; + push @argscall, "$name int64"; + push @argsgc, "uintptr($name)"; + push @argsgccgo, "C.longlong($name)"; + } elsif($type eq "uint32") { + push @argscommun, "$name"; + push @argscall, "$name uint32"; + push @argsgc, "uintptr($name)"; + push @argsgccgo, "C.uint($name)"; + } elsif($type eq "uint64") { + push @argscommun, "$name"; + push @argscall, "$name uint64"; + push @argsgc, "uintptr($name)"; + push @argsgccgo, "C.ulonglong($name)"; + } elsif($type eq "uintptr") { + push @argscommun, "$name"; + push @argscall, "$name uintptr"; + push @argsgc, "$name"; + push @argsgccgo, "C.uintptr_t($name)"; + } else { + push @argscommun, "int($name)"; + push @argscall, "$name int"; + push @argsgc, "uintptr($name)"; + push @argsgccgo, "C.int($name)"; + } + $arg_n++; + } + my $nargs = @argsgc; + + # COMMUN function generation + my $argscommun = join(', ', @argscommun); + my $callcommun = "call$sysname($argscommun)"; + my @ret = ("_", "_"); + my $body = ""; + my $do_errno = 0; + for(my $i=0; $i<@out; $i++) { + my $p = $out[$i]; + my ($name, $type) = parseparam($p); + my $reg = ""; + if($name eq "err") { + $reg = "e1"; + $ret[1] = $reg; + $do_errno = 1; + } else { + $reg = "r0"; + $ret[0] = $reg; + } + if($type eq "bool") { + $reg = "$reg != 0"; + } + if($reg ne "e1") { + $body .= "\t$name = $type($reg)\n"; + } + } + if ($ret[0] eq "_" && $ret[1] eq "_") { + $textcommon .= "\t$callcommun\n"; + } else { + $textcommon .= "\t$ret[0], $ret[1] := $callcommun\n"; + } + $textcommon .= $body; + + if ($do_errno) { + $textcommon .= "\tif e1 != 0 {\n"; + $textcommon .= "\t\terr = errnoErr(e1)\n"; + $textcommon .= "\t}\n"; + } + $textcommon .= "\treturn\n"; + $textcommon .= "}\n"; + + if ($onlyCommon){ + next + } + # CALL Prototype + my $callProto = sprintf "func call%s(%s) (r1 uintptr, e1 Errno) {\n", $sysname, join(', ', @argscall); + + # GC function generation + my $asm = "syscall6"; + if ($nonblock) { + $asm = "rawSyscall6"; + } + + if(@argsgc <= 6) { + while(@argsgc < 6) { + push @argsgc, "0"; + } + } else { + print STDERR "$ARGV:$.: too many arguments to system call\n"; + } + my $argsgc = join(', ', @argsgc); + my $callgc = "$asm(uintptr(unsafe.Pointer(&$sysvarname)), $nargs, $argsgc)"; + + $textgc .= $callProto; + $textgc .= "\tr1, _, e1 = $callgc\n"; + $textgc .= "\treturn\n}\n"; + + # GCCGO function generation + my $argsgccgo = join(', ', @argsgccgo); + my $callgccgo = "C.$sysname($argsgccgo)"; + $textgccgo .= $callProto; + $textgccgo .= "\tr1 = uintptr($callgccgo)\n"; + $textgccgo .= "\te1 = syscall.GetErrno()\n"; + $textgccgo .= "\treturn\n}\n"; +} + +if($errors) { + exit 1; +} + +# Print zsyscall_aix_ppc64.go +open(my $fcommun, '>', 'zsyscall_aix_ppc64.go'); +my $tofcommun = <', 'zsyscall_aix_ppc64_gc.go'); +my $tofgc = <', 'zsyscall_aix_ppc64_gccgo.go'); +my $tofgccgo = <) { + chomp; + s/\s+/ /g; + s/^\s+//; + s/\s+$//; + $package = $1 if !$package && /^package (\S+)$/; + my $nonblock = /^\/\/sysnb /; + next if !/^\/\/sys / && !$nonblock; + + # Line must be of the form + # func Open(path string, mode int, perm int) (fd int, err error) + # Split into name, in params, out params. + if(!/^\/\/sys(nb)? (\w+)\(([^()]*)\)\s*(?:\(([^()]+)\))?\s*(?:=\s*(?:(\w*)\.)?(\w*))?$/) { + print STDERR "$ARGV:$.: malformed //sys declaration\n"; + $errors = 1; + next; + } + my ($nb, $func, $in, $out, $modname, $sysname) = ($1, $2, $3, $4, $5, $6); + + # Split argument lists on comma. + my @in = parseparamlist($in); + my @out = parseparamlist($out); + + # Try in vain to keep people from editing this file. + # The theory is that they jump into the middle of the file + # without reading the header. + $text .= "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n"; + + # So file name. + if($modname eq "") { + $modname = "libc"; + } + + # System call name. + if($sysname eq "") { + $sysname = "$func"; + } + + # System call pointer variable name. + my $sysvarname = "proc$sysname"; + + my $strconvfunc = "BytePtrFromString"; + my $strconvtype = "*byte"; + + $sysname =~ y/A-Z/a-z/; # All libc functions are lowercase. + + # Runtime import of function to allow cross-platform builds. + $dynimports .= "//go:cgo_import_dynamic libc_${sysname} ${sysname} \"$modname.so\"\n"; + # Link symbol to proc address variable. + $linknames .= "//go:linkname ${sysvarname} libc_${sysname}\n"; + # Library proc address variable. + push @vars, $sysvarname; + + # Go function header. + $out = join(', ', @out); + if($out ne "") { + $out = " ($out)"; + } + if($text ne "") { + $text .= "\n" + } + $text .= sprintf "func %s(%s)%s {\n", $func, join(', ', @in), $out; + + # Check if err return available + my $errvar = ""; + foreach my $p (@out) { + my ($name, $type) = parseparam($p); + if($type eq "error") { + $errvar = $name; + last; + } + } + + # Prepare arguments to Syscall. + my @args = (); + my $n = 0; + foreach my $p (@in) { + my ($name, $type) = parseparam($p); + if($type =~ /^\*/) { + push @args, "uintptr(unsafe.Pointer($name))"; + } elsif($type eq "string" && $errvar ne "") { + $text .= "\tvar _p$n $strconvtype\n"; + $text .= "\t_p$n, $errvar = $strconvfunc($name)\n"; + $text .= "\tif $errvar != nil {\n\t\treturn\n\t}\n"; + push @args, "uintptr(unsafe.Pointer(_p$n))"; + $n++; + } elsif($type eq "string") { + print STDERR "$ARGV:$.: $func uses string arguments, but has no error return\n"; + $text .= "\tvar _p$n $strconvtype\n"; + $text .= "\t_p$n, _ = $strconvfunc($name)\n"; + push @args, "uintptr(unsafe.Pointer(_p$n))"; + $n++; + } elsif($type =~ /^\[\](.*)/) { + # Convert slice into pointer, length. + # Have to be careful not to take address of &a[0] if len == 0: + # pass nil in that case. + $text .= "\tvar _p$n *$1\n"; + $text .= "\tif len($name) > 0 {\n\t\t_p$n = \&$name\[0]\n\t}\n"; + push @args, "uintptr(unsafe.Pointer(_p$n))", "uintptr(len($name))"; + $n++; + } elsif($type eq "int64" && $_32bit ne "") { + if($_32bit eq "big-endian") { + push @args, "uintptr($name >> 32)", "uintptr($name)"; + } else { + push @args, "uintptr($name)", "uintptr($name >> 32)"; + } + } elsif($type eq "bool") { + $text .= "\tvar _p$n uint32\n"; + $text .= "\tif $name {\n\t\t_p$n = 1\n\t} else {\n\t\t_p$n = 0\n\t}\n"; + push @args, "uintptr(_p$n)"; + $n++; + } else { + push @args, "uintptr($name)"; + } + } + my $nargs = @args; + + # Determine which form to use; pad args with zeros. + my $asm = "sysvicall6"; + if ($nonblock) { + $asm = "rawSysvicall6"; + } + if(@args <= 6) { + while(@args < 6) { + push @args, "0"; + } + } else { + print STDERR "$ARGV:$.: too many arguments to system call\n"; + } + + # Actual call. + my $args = join(', ', @args); + my $call = "$asm(uintptr(unsafe.Pointer(&$sysvarname)), $nargs, $args)"; + + # Assign return values. + my $body = ""; + my $failexpr = ""; + my @ret = ("_", "_", "_"); + my @pout= (); + my $do_errno = 0; + for(my $i=0; $i<@out; $i++) { + my $p = $out[$i]; + my ($name, $type) = parseparam($p); + my $reg = ""; + if($name eq "err") { + $reg = "e1"; + $ret[2] = $reg; + $do_errno = 1; + } else { + $reg = sprintf("r%d", $i); + $ret[$i] = $reg; + } + if($type eq "bool") { + $reg = "$reg != 0"; + } + if($type eq "int64" && $_32bit ne "") { + # 64-bit number in r1:r0 or r0:r1. + if($i+2 > @out) { + print STDERR "$ARGV:$.: not enough registers for int64 return\n"; + } + if($_32bit eq "big-endian") { + $reg = sprintf("int64(r%d)<<32 | int64(r%d)", $i, $i+1); + } else { + $reg = sprintf("int64(r%d)<<32 | int64(r%d)", $i+1, $i); + } + $ret[$i] = sprintf("r%d", $i); + $ret[$i+1] = sprintf("r%d", $i+1); + } + if($reg ne "e1") { + $body .= "\t$name = $type($reg)\n"; + } + } + if ($ret[0] eq "_" && $ret[1] eq "_" && $ret[2] eq "_") { + $text .= "\t$call\n"; + } else { + $text .= "\t$ret[0], $ret[1], $ret[2] := $call\n"; + } + $text .= $body; + + if ($do_errno) { + $text .= "\tif e1 != 0 {\n"; + $text .= "\t\terr = e1\n"; + $text .= "\t}\n"; + } + $text .= "\treturn\n"; + $text .= "}\n"; +} + +if($errors) { + exit 1; +} + +print < "net.inet", + "net.inet.ipproto" => "net.inet", + "net.inet6.ipv6proto" => "net.inet6", + "net.inet6.ipv6" => "net.inet6.ip6", + "net.inet.icmpv6" => "net.inet6.icmp6", + "net.inet6.divert6" => "net.inet6.divert", + "net.inet6.tcp6" => "net.inet.tcp", + "net.inet6.udp6" => "net.inet.udp", + "mpls" => "net.mpls", + "swpenc" => "vm.swapencrypt" +); + +# Node mappings +my %node_map = ( + "net.inet.ip.ifq" => "net.ifq", + "net.inet.pfsync" => "net.pfsync", + "net.mpls.ifq" => "net.ifq" +); + +my $ctlname; +my %mib = (); +my %sysctl = (); +my $node; + +sub debug() { + print STDERR "$_[0]\n" if $debug; +} + +# Walk the MIB and build a sysctl name to OID mapping. +sub build_sysctl() { + my ($node, $name, $oid) = @_; + my %node = %{$node}; + my @oid = @{$oid}; + + foreach my $key (sort keys %node) { + my @node = @{$node{$key}}; + my $nodename = $name.($name ne '' ? '.' : '').$key; + my @nodeoid = (@oid, $node[0]); + if ($node[1] eq 'CTLTYPE_NODE') { + if (exists $node_map{$nodename}) { + $node = \%mib; + $ctlname = $node_map{$nodename}; + foreach my $part (split /\./, $ctlname) { + $node = \%{@{$$node{$part}}[2]}; + } + } else { + $node = $node[2]; + } + &build_sysctl($node, $nodename, \@nodeoid); + } elsif ($node[1] ne '') { + $sysctl{$nodename} = \@nodeoid; + } + } +} + +foreach my $ctl (@ctls) { + $ctls{$ctl} = $ctl; +} + +# Build MIB +foreach my $header (@headers) { + &debug("Processing $header..."); + open HEADER, "/usr/include/$header" || + print STDERR "Failed to open $header\n"; + while (
) { + if ($_ =~ /^#define\s+(CTL_NAMES)\s+{/ || + $_ =~ /^#define\s+(CTL_(.*)_NAMES)\s+{/ || + $_ =~ /^#define\s+((.*)CTL_NAMES)\s+{/) { + if ($1 eq 'CTL_NAMES') { + # Top level. + $node = \%mib; + } else { + # Node. + my $nodename = lc($2); + if ($header =~ /^netinet\//) { + $ctlname = "net.inet.$nodename"; + } elsif ($header =~ /^netinet6\//) { + $ctlname = "net.inet6.$nodename"; + } elsif ($header =~ /^net\//) { + $ctlname = "net.$nodename"; + } else { + $ctlname = "$nodename"; + $ctlname =~ s/^(fs|net|kern)_/$1\./; + } + if (exists $ctl_map{$ctlname}) { + $ctlname = $ctl_map{$ctlname}; + } + if (not exists $ctls{$ctlname}) { + &debug("Ignoring $ctlname..."); + next; + } + + # Walk down from the top of the MIB. + $node = \%mib; + foreach my $part (split /\./, $ctlname) { + if (not exists $$node{$part}) { + &debug("Missing node $part"); + $$node{$part} = [ 0, '', {} ]; + } + $node = \%{@{$$node{$part}}[2]}; + } + } + + # Populate current node with entries. + my $i = -1; + while (defined($_) && $_ !~ /^}/) { + $_ =
; + $i++ if $_ =~ /{.*}/; + next if $_ !~ /{\s+"(\w+)",\s+(CTLTYPE_[A-Z]+)\s+}/; + $$node{$1} = [ $i, $2, {} ]; + } + } + } + close HEADER; +} + +&build_sysctl(\%mib, "", []); + +print <){ + if(/^#define\s+SYS_(\w+)\s+([0-9]+)/){ + my $name = $1; + my $num = $2; + $name =~ y/a-z/A-Z/; + print " SYS_$name = $num;" + } +} + +print <){ + if(/^([0-9]+)\s+STD\s+({ \S+\s+(\w+).*)$/){ + my $num = $1; + my $proto = $2; + my $name = "SYS_$3"; + $name =~ y/a-z/A-Z/; + + # There are multiple entries for enosys and nosys, so comment them out. + if($name =~ /^SYS_E?NOSYS$/){ + $name = "// $name"; + } + if($name eq 'SYS_SYS_EXIT'){ + $name = 'SYS_EXIT'; + } + + print " $name = $num; // $proto\n"; + } +} + +print <){ + if(/^([0-9]+)\s+\S+\s+(?:NO)?STD\s+({ \S+\s+(\w+).*)$/){ + my $num = $1; + my $proto = $2; + my $name = "SYS_$3"; + $name =~ y/a-z/A-Z/; + + # There are multiple entries for enosys and nosys, so comment them out. + if($name =~ /^SYS_E?NOSYS$/){ + $name = "// $name"; + } + if($name eq 'SYS_SYS_EXIT'){ + $name = 'SYS_EXIT'; + } + + print " $name = $num; // $proto\n"; + } +} + +print <){ + if($line =~ /^(.*)\\$/) { + # Handle continuation + $line = $1; + $_ =~ s/^\s+//; + $line .= $_; + } else { + # New line + $line = $_; + } + next if $line =~ /\\$/; + if($line =~ /^([0-9]+)\s+((STD)|(NOERR))\s+(RUMP\s+)?({\s+\S+\s*\*?\s*\|(\S+)\|(\S*)\|(\w+).*\s+})(\s+(\S+))?$/) { + my $num = $1; + my $proto = $6; + my $compat = $8; + my $name = "$7_$9"; + + $name = "$7_$11" if $11 ne ''; + $name =~ y/a-z/A-Z/; + + if($compat eq '' || $compat eq '13' || $compat eq '30' || $compat eq '50') { + print " $name = $num; // $proto\n"; + } + } +} + +print <){ + if(/^([0-9]+)\s+STD\s+(NOLOCK\s+)?({ \S+\s+\*?(\w+).*)$/){ + my $num = $1; + my $proto = $3; + my $name = $4; + $name =~ y/a-z/A-Z/; + + # There are multiple entries for enosys and nosys, so comment them out. + if($name =~ /^SYS_E?NOSYS$/){ + $name = "// $name"; + } + if($name eq 'SYS_SYS_EXIT'){ + $name = 'SYS_EXIT'; + } + + print " $name = $num; // $proto\n"; + } +} + +print < 6.2, pass execpromises to the syscall. + if maj > 6 || (maj == 6 && min > 2) { + exptr, err := syscall.BytePtrFromString(execpromises) + if err != nil { + return err + } + expr = unsafe.Pointer(exptr) + } + + _, _, e := syscall.Syscall(SYS_PLEDGE, uintptr(unsafe.Pointer(pptr)), uintptr(expr), 0) + if e != 0 { + return e + } + + return nil +} + +// majmin returns major and minor version number for an OpenBSD system. +func majmin() (major int, minor int, err error) { + var v Utsname + err = Uname(&v) + if err != nil { + return + } + + major, err = strconv.Atoi(string(v.Release[0])) + if err != nil { + err = errors.New("cannot parse major version number returned by uname") + return + } + + minor, err = strconv.Atoi(string(v.Release[2])) + if err != nil { + err = errors.New("cannot parse minor version number returned by uname") + return + } + + return +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/pagesize_unix.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/pagesize_unix.go new file mode 100644 index 00000000..bc2f3629 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/pagesize_unix.go @@ -0,0 +1,15 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris + +// For Unix, get the pagesize from the runtime. + +package unix + +import "syscall" + +func Getpagesize() int { + return syscall.Getpagesize() +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/race.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/race.go new file mode 100644 index 00000000..61712b51 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/race.go @@ -0,0 +1,30 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build darwin,race linux,race freebsd,race + +package unix + +import ( + "runtime" + "unsafe" +) + +const raceenabled = true + +func raceAcquire(addr unsafe.Pointer) { + runtime.RaceAcquire(addr) +} + +func raceReleaseMerge(addr unsafe.Pointer) { + runtime.RaceReleaseMerge(addr) +} + +func raceReadRange(addr unsafe.Pointer, len int) { + runtime.RaceReadRange(addr, len) +} + +func raceWriteRange(addr unsafe.Pointer, len int) { + runtime.RaceWriteRange(addr, len) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/race0.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/race0.go new file mode 100644 index 00000000..ad026678 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/race0.go @@ -0,0 +1,25 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build aix darwin,!race linux,!race freebsd,!race netbsd openbsd solaris dragonfly + +package unix + +import ( + "unsafe" +) + +const raceenabled = false + +func raceAcquire(addr unsafe.Pointer) { +} + +func raceReleaseMerge(addr unsafe.Pointer) { +} + +func raceReadRange(addr unsafe.Pointer, len int) { +} + +func raceWriteRange(addr unsafe.Pointer, len int) { +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/sockcmsg_linux.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/sockcmsg_linux.go new file mode 100644 index 00000000..6079eb4a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/sockcmsg_linux.go @@ -0,0 +1,36 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Socket control messages + +package unix + +import "unsafe" + +// UnixCredentials encodes credentials into a socket control message +// for sending to another process. This can be used for +// authentication. +func UnixCredentials(ucred *Ucred) []byte { + b := make([]byte, CmsgSpace(SizeofUcred)) + h := (*Cmsghdr)(unsafe.Pointer(&b[0])) + h.Level = SOL_SOCKET + h.Type = SCM_CREDENTIALS + h.SetLen(CmsgLen(SizeofUcred)) + *((*Ucred)(cmsgData(h))) = *ucred + return b +} + +// ParseUnixCredentials decodes a socket control message that contains +// credentials in a Ucred structure. To receive such a message, the +// SO_PASSCRED option must be enabled on the socket. +func ParseUnixCredentials(m *SocketControlMessage) (*Ucred, error) { + if m.Header.Level != SOL_SOCKET { + return nil, EINVAL + } + if m.Header.Type != SCM_CREDENTIALS { + return nil, EINVAL + } + ucred := *(*Ucred)(unsafe.Pointer(&m.Data[0])) + return &ucred, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/sockcmsg_unix.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/sockcmsg_unix.go new file mode 100644 index 00000000..9dd2f32f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/sockcmsg_unix.go @@ -0,0 +1,104 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris + +// Socket control messages + +package unix + +import "unsafe" + +// Round the length of a raw sockaddr up to align it properly. +func cmsgAlignOf(salen int) int { + salign := SizeofPtr + // NOTE: It seems like 64-bit Darwin, DragonFly BSD and + // Solaris kernels still require 32-bit aligned access to + // network subsystem. + if darwin64Bit || dragonfly64Bit || solaris64Bit { + salign = 4 + } + return (salen + salign - 1) & ^(salign - 1) +} + +// CmsgLen returns the value to store in the Len field of the Cmsghdr +// structure, taking into account any necessary alignment. +func CmsgLen(datalen int) int { + return cmsgAlignOf(SizeofCmsghdr) + datalen +} + +// CmsgSpace returns the number of bytes an ancillary element with +// payload of the passed data length occupies. +func CmsgSpace(datalen int) int { + return cmsgAlignOf(SizeofCmsghdr) + cmsgAlignOf(datalen) +} + +func cmsgData(h *Cmsghdr) unsafe.Pointer { + return unsafe.Pointer(uintptr(unsafe.Pointer(h)) + uintptr(cmsgAlignOf(SizeofCmsghdr))) +} + +// SocketControlMessage represents a socket control message. +type SocketControlMessage struct { + Header Cmsghdr + Data []byte +} + +// ParseSocketControlMessage parses b as an array of socket control +// messages. +func ParseSocketControlMessage(b []byte) ([]SocketControlMessage, error) { + var msgs []SocketControlMessage + i := 0 + for i+CmsgLen(0) <= len(b) { + h, dbuf, err := socketControlMessageHeaderAndData(b[i:]) + if err != nil { + return nil, err + } + m := SocketControlMessage{Header: *h, Data: dbuf} + msgs = append(msgs, m) + i += cmsgAlignOf(int(h.Len)) + } + return msgs, nil +} + +func socketControlMessageHeaderAndData(b []byte) (*Cmsghdr, []byte, error) { + h := (*Cmsghdr)(unsafe.Pointer(&b[0])) + if h.Len < SizeofCmsghdr || uint64(h.Len) > uint64(len(b)) { + return nil, nil, EINVAL + } + return h, b[cmsgAlignOf(SizeofCmsghdr):h.Len], nil +} + +// UnixRights encodes a set of open file descriptors into a socket +// control message for sending to another process. +func UnixRights(fds ...int) []byte { + datalen := len(fds) * 4 + b := make([]byte, CmsgSpace(datalen)) + h := (*Cmsghdr)(unsafe.Pointer(&b[0])) + h.Level = SOL_SOCKET + h.Type = SCM_RIGHTS + h.SetLen(CmsgLen(datalen)) + data := cmsgData(h) + for _, fd := range fds { + *(*int32)(data) = int32(fd) + data = unsafe.Pointer(uintptr(data) + 4) + } + return b +} + +// ParseUnixRights decodes a socket control message that contains an +// integer array of open file descriptors from another process. +func ParseUnixRights(m *SocketControlMessage) ([]int, error) { + if m.Header.Level != SOL_SOCKET { + return nil, EINVAL + } + if m.Header.Type != SCM_RIGHTS { + return nil, EINVAL + } + fds := make([]int, len(m.Data)>>2) + for i, j := 0, 0; i < len(m.Data); i += 4 { + fds[j] = int(*(*int32)(unsafe.Pointer(&m.Data[i]))) + j++ + } + return fds, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/str.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/str.go new file mode 100644 index 00000000..17fb6986 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/str.go @@ -0,0 +1,26 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris + +package unix + +func itoa(val int) string { // do it here rather than with fmt to avoid dependency + if val < 0 { + return "-" + uitoa(uint(-val)) + } + return uitoa(uint(val)) +} + +func uitoa(val uint) string { + var buf [32]byte // big enough for int64 + i := len(buf) - 1 + for val >= 10 { + buf[i] = byte(val%10 + '0') + i-- + val /= 10 + } + buf[i] = byte(val + '0') + return string(buf[i:]) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall.go new file mode 100644 index 00000000..0d4b1d7a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall.go @@ -0,0 +1,54 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris + +// Package unix contains an interface to the low-level operating system +// primitives. OS details vary depending on the underlying system, and +// by default, godoc will display OS-specific documentation for the current +// system. If you want godoc to display OS documentation for another +// system, set $GOOS and $GOARCH to the desired system. For example, if +// you want to view documentation for freebsd/arm on linux/amd64, set $GOOS +// to freebsd and $GOARCH to arm. +// +// The primary use of this package is inside other packages that provide a more +// portable interface to the system, such as "os", "time" and "net". Use +// those packages rather than this one if you can. +// +// For details of the functions and data types in this package consult +// the manuals for the appropriate operating system. +// +// These calls return err == nil to indicate success; otherwise +// err represents an operating system error describing the failure and +// holds a value of type syscall.Errno. +package unix // import "golang.org/x/sys/unix" + +import "strings" + +// ByteSliceFromString returns a NUL-terminated slice of bytes +// containing the text of s. If s contains a NUL byte at any +// location, it returns (nil, EINVAL). +func ByteSliceFromString(s string) ([]byte, error) { + if strings.IndexByte(s, 0) != -1 { + return nil, EINVAL + } + a := make([]byte, len(s)+1) + copy(a, s) + return a, nil +} + +// BytePtrFromString returns a pointer to a NUL-terminated array of +// bytes containing the text of s. If s contains a NUL byte at any +// location, it returns (nil, EINVAL). +func BytePtrFromString(s string) (*byte, error) { + a, err := ByteSliceFromString(s) + if err != nil { + return nil, err + } + return &a[0], nil +} + +// Single-word zero for use when we need a valid pointer to 0 bytes. +// See mkunix.pl. +var _zero uintptr diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_aix.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_aix.go new file mode 100644 index 00000000..f8eac174 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_aix.go @@ -0,0 +1,547 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build aix + +// Aix system calls. +// This file is compiled as ordinary Go code, +// but it is also input to mksyscall, +// which parses the //sys lines and generates system call stubs. +// Note that sometimes we use a lowercase //sys name and +// wrap it in our own nicer implementation. + +package unix + +import ( + "syscall" + "unsafe" +) + +/* + * Wrapped + */ + +//sys utimes(path string, times *[2]Timeval) (err error) +func Utimes(path string, tv []Timeval) error { + if len(tv) != 2 { + return EINVAL + } + return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) +} + +//sys utimensat(dirfd int, path string, times *[2]Timespec, flag int) (err error) +func UtimesNano(path string, ts []Timespec) error { + if len(ts) != 2 { + return EINVAL + } + return utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0) +} + +func UtimesNanoAt(dirfd int, path string, ts []Timespec, flags int) error { + if ts == nil { + return utimensat(dirfd, path, nil, flags) + } + if len(ts) != 2 { + return EINVAL + } + return utimensat(dirfd, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), flags) +} + +func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, _Socklen, error) { + if sa.Port < 0 || sa.Port > 0xFFFF { + return nil, 0, EINVAL + } + sa.raw.Family = AF_INET + p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) + p[0] = byte(sa.Port >> 8) + p[1] = byte(sa.Port) + for i := 0; i < len(sa.Addr); i++ { + sa.raw.Addr[i] = sa.Addr[i] + } + return unsafe.Pointer(&sa.raw), SizeofSockaddrInet4, nil +} + +func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, _Socklen, error) { + if sa.Port < 0 || sa.Port > 0xFFFF { + return nil, 0, EINVAL + } + sa.raw.Family = AF_INET6 + p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) + p[0] = byte(sa.Port >> 8) + p[1] = byte(sa.Port) + sa.raw.Scope_id = sa.ZoneId + for i := 0; i < len(sa.Addr); i++ { + sa.raw.Addr[i] = sa.Addr[i] + } + return unsafe.Pointer(&sa.raw), SizeofSockaddrInet6, nil +} + +func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, _Socklen, error) { + name := sa.Name + n := len(name) + if n > len(sa.raw.Path) { + return nil, 0, EINVAL + } + if n == len(sa.raw.Path) && name[0] != '@' { + return nil, 0, EINVAL + } + sa.raw.Family = AF_UNIX + for i := 0; i < n; i++ { + sa.raw.Path[i] = uint8(name[i]) + } + // length is family (uint16), name, NUL. + sl := _Socklen(2) + if n > 0 { + sl += _Socklen(n) + 1 + } + if sa.raw.Path[0] == '@' { + sa.raw.Path[0] = 0 + // Don't count trailing NUL for abstract address. + sl-- + } + + return unsafe.Pointer(&sa.raw), sl, nil +} + +func Getsockname(fd int) (sa Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + if err = getsockname(fd, &rsa, &len); err != nil { + return + } + return anyToSockaddr(fd, &rsa) +} + +//sys getcwd(buf []byte) (err error) + +const ImplementsGetwd = true + +func Getwd() (ret string, err error) { + for len := uint64(4096); ; len *= 2 { + b := make([]byte, len) + err := getcwd(b) + if err == nil { + i := 0 + for b[i] != 0 { + i++ + } + return string(b[0:i]), nil + } + if err != ERANGE { + return "", err + } + } +} + +func Getcwd(buf []byte) (n int, err error) { + err = getcwd(buf) + if err == nil { + i := 0 + for buf[i] != 0 { + i++ + } + n = i + 1 + } + return +} + +func Getgroups() (gids []int, err error) { + n, err := getgroups(0, nil) + if err != nil { + return nil, err + } + if n == 0 { + return nil, nil + } + + // Sanity check group count. Max is 16 on BSD. + if n < 0 || n > 1000 { + return nil, EINVAL + } + + a := make([]_Gid_t, n) + n, err = getgroups(n, &a[0]) + if err != nil { + return nil, err + } + gids = make([]int, n) + for i, v := range a[0:n] { + gids[i] = int(v) + } + return +} + +func Setgroups(gids []int) (err error) { + if len(gids) == 0 { + return setgroups(0, nil) + } + + a := make([]_Gid_t, len(gids)) + for i, v := range gids { + a[i] = _Gid_t(v) + } + return setgroups(len(a), &a[0]) +} + +/* + * Socket + */ + +//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) + +func Accept(fd int) (nfd int, sa Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + nfd, err = accept(fd, &rsa, &len) + if nfd == -1 { + return + } + sa, err = anyToSockaddr(fd, &rsa) + if err != nil { + Close(nfd) + nfd = 0 + } + return +} + +func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) { + // Recvmsg not implemented on AIX + sa := new(SockaddrUnix) + return -1, -1, -1, sa, ENOSYS +} + +func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) { + _, err = SendmsgN(fd, p, oob, to, flags) + return +} + +func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) { + // SendmsgN not implemented on AIX + return -1, ENOSYS +} + +func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) { + switch rsa.Addr.Family { + + case AF_UNIX: + pp := (*RawSockaddrUnix)(unsafe.Pointer(rsa)) + sa := new(SockaddrUnix) + + // Some versions of AIX have a bug in getsockname (see IV78655). + // We can't rely on sa.Len being set correctly. + n := SizeofSockaddrUnix - 3 // substract leading Family, Len, terminating NUL. + for i := 0; i < n; i++ { + if pp.Path[i] == 0 { + n = i + break + } + } + + bytes := (*[10000]byte)(unsafe.Pointer(&pp.Path[0]))[0:n] + sa.Name = string(bytes) + return sa, nil + + case AF_INET: + pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa)) + sa := new(SockaddrInet4) + p := (*[2]byte)(unsafe.Pointer(&pp.Port)) + sa.Port = int(p[0])<<8 + int(p[1]) + for i := 0; i < len(sa.Addr); i++ { + sa.Addr[i] = pp.Addr[i] + } + return sa, nil + + case AF_INET6: + pp := (*RawSockaddrInet6)(unsafe.Pointer(rsa)) + sa := new(SockaddrInet6) + p := (*[2]byte)(unsafe.Pointer(&pp.Port)) + sa.Port = int(p[0])<<8 + int(p[1]) + sa.ZoneId = pp.Scope_id + for i := 0; i < len(sa.Addr); i++ { + sa.Addr[i] = pp.Addr[i] + } + return sa, nil + } + return nil, EAFNOSUPPORT +} + +func Gettimeofday(tv *Timeval) (err error) { + err = gettimeofday(tv, nil) + return +} + +// TODO +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + return -1, ENOSYS +} + +//sys getdirent(fd int, buf []byte) (n int, err error) +func ReadDirent(fd int, buf []byte) (n int, err error) { + return getdirent(fd, buf) +} + +//sys wait4(pid Pid_t, status *_C_int, options int, rusage *Rusage) (wpid Pid_t, err error) +func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, err error) { + var status _C_int + var r Pid_t + err = ERESTART + // AIX wait4 may return with ERESTART errno, while the processus is still + // active. + for err == ERESTART { + r, err = wait4(Pid_t(pid), &status, options, rusage) + } + wpid = int(r) + if wstatus != nil { + *wstatus = WaitStatus(status) + } + return +} + +/* + * Wait + */ + +type WaitStatus uint32 + +func (w WaitStatus) Stopped() bool { return w&0x40 != 0 } +func (w WaitStatus) StopSignal() Signal { + if !w.Stopped() { + return -1 + } + return Signal(w>>8) & 0xFF +} + +func (w WaitStatus) Exited() bool { return w&0xFF == 0 } +func (w WaitStatus) ExitStatus() int { + if !w.Exited() { + return -1 + } + return int((w >> 8) & 0xFF) +} + +func (w WaitStatus) Signaled() bool { return w&0x40 == 0 && w&0xFF != 0 } +func (w WaitStatus) Signal() Signal { + if !w.Signaled() { + return -1 + } + return Signal(w>>16) & 0xFF +} + +func (w WaitStatus) Continued() bool { return w&0x01000000 != 0 } + +func (w WaitStatus) CoreDump() bool { return w&0x200 != 0 } + +func (w WaitStatus) TrapCause() int { return -1 } + +//sys ioctl(fd int, req uint, arg uintptr) (err error) + +// ioctl itself should not be exposed directly, but additional get/set +// functions for specific types are permissible. + +// IoctlSetInt performs an ioctl operation which sets an integer value +// on fd, using the specified request number. +func IoctlSetInt(fd int, req uint, value int) error { + return ioctl(fd, req, uintptr(value)) +} + +func ioctlSetWinsize(fd int, req uint, value *Winsize) error { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +func ioctlSetTermios(fd int, req uint, value *Termios) error { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +// IoctlGetInt performs an ioctl operation which gets an integer value +// from fd, using the specified request number. +func IoctlGetInt(fd int, req uint) (int, error) { + var value int + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return value, err +} + +func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { + var value Winsize + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func IoctlGetTermios(fd int, req uint) (*Termios, error) { + var value Termios + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +// fcntl must never be called with cmd=F_DUP2FD because it doesn't work on AIX +// There is no way to create a custom fcntl and to keep //sys fcntl easily, +// Therefore, the programmer must call dup2 instead of fcntl in this case. + +// FcntlInt performs a fcntl syscall on fd with the provided command and argument. +//sys FcntlInt(fd uintptr, cmd int, arg int) (r int,err error) = fcntl + +// FcntlFlock performs a fcntl syscall for the F_GETLK, F_SETLK or F_SETLKW command. +//sys FcntlFlock(fd uintptr, cmd int, lk *Flock_t) (err error) = fcntl + +//sys fcntl(fd int, cmd int, arg int) (val int, err error) + +func Flock(fd int, how int) (err error) { + return syscall.Flock(fd, how) +} + +/* + * Direct access + */ + +//sys Acct(path string) (err error) +//sys Chdir(path string) (err error) +//sys Chroot(path string) (err error) +//sys Close(fd int) (err error) +//sys Dup(oldfd int) (fd int, err error) +//sys Exit(code int) +//sys Faccessat(dirfd int, path string, mode uint32, flags int) (err error) +//sys Fchdir(fd int) (err error) +//sys Fchmod(fd int, mode uint32) (err error) +//sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) +//sys Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) +//sys Fdatasync(fd int) (err error) +//sys Fsync(fd int) (err error) +// readdir_r +//sysnb Getpgid(pid int) (pgid int, err error) + +//sys Getpgrp() (pid int) + +//sysnb Getpid() (pid int) +//sysnb Getppid() (ppid int) +//sys Getpriority(which int, who int) (prio int, err error) +//sysnb Getrusage(who int, rusage *Rusage) (err error) +//sysnb Getsid(pid int) (sid int, err error) +//sysnb Kill(pid int, sig Signal) (err error) +//sys Klogctl(typ int, buf []byte) (n int, err error) = syslog +//sys Mkdir(dirfd int, path string, mode uint32) (err error) +//sys Mkdirat(dirfd int, path string, mode uint32) (err error) +//sys Mkfifo(path string, mode uint32) (err error) +//sys Mknod(path string, mode uint32, dev int) (err error) +//sys Mknodat(dirfd int, path string, mode uint32, dev int) (err error) +//sys Nanosleep(time *Timespec, leftover *Timespec) (err error) +//sys Open(path string, mode int, perm uint32) (fd int, err error) = open64 +//sys Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) +//sys read(fd int, p []byte) (n int, err error) +//sys Readlink(path string, buf []byte) (n int, err error) +//sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) +//sys Setdomainname(p []byte) (err error) +//sys Sethostname(p []byte) (err error) +//sysnb Setpgid(pid int, pgid int) (err error) +//sysnb Setsid() (pid int, err error) +//sysnb Settimeofday(tv *Timeval) (err error) + +//sys Setuid(uid int) (err error) +//sys Setgid(uid int) (err error) + +//sys Setpriority(which int, who int, prio int) (err error) +//sys Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) +//sys Sync() +//sysnb Times(tms *Tms) (ticks uintptr, err error) +//sysnb Umask(mask int) (oldmask int) +//sysnb Uname(buf *Utsname) (err error) +//TODO umount +// //sys Unmount(target string, flags int) (err error) = umount +//sys Unlink(path string) (err error) +//sys Unlinkat(dirfd int, path string, flags int) (err error) +//sys Ustat(dev int, ubuf *Ustat_t) (err error) +//sys write(fd int, p []byte) (n int, err error) +//sys readlen(fd int, p *byte, np int) (n int, err error) = read +//sys writelen(fd int, p *byte, np int) (n int, err error) = write + +//sys Dup2(oldfd int, newfd int) (err error) +//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = posix_fadvise64 +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Fstat(fd int, stat *Stat_t) (err error) +//sys Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = fstatat +//sys Fstatfs(fd int, buf *Statfs_t) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (euid int) +//sysnb Getgid() (gid int) +//sysnb Getuid() (uid int) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Listen(s int, n int) (err error) +//sys Lstat(path string, stat *Stat_t) (err error) +//sys Pause() (err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) = pread64 +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = pwrite64 +//TODO Select +// //sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) +//sys Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sys Shutdown(fd int, how int) (err error) +//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) +//sys Stat(path string, stat *Stat_t) (err error) +//sys Statfs(path string, buf *Statfs_t) (err error) +//sys Truncate(path string, length int64) (err error) + +//sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) +//sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) +//sysnb getgroups(n int, list *_Gid_t) (nn int, err error) +//sysnb setgroups(n int, list *_Gid_t) (err error) +//sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) +//sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) +//sysnb socket(domain int, typ int, proto int) (fd int, err error) +//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) +//sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) +//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) +//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) + +//sys munmap(addr uintptr, length uintptr) (err error) + +var mapper = &mmapper{ + active: make(map[*byte][]byte), + mmap: mmap, + munmap: munmap, +} + +func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { + return mapper.Mmap(fd, offset, length, prot, flags) +} + +func Munmap(b []byte) (err error) { + return mapper.Munmap(b) +} + +//sys Madvise(b []byte, advice int) (err error) +//sys Mprotect(b []byte, prot int) (err error) +//sys Mlock(b []byte) (err error) +//sys Mlockall(flags int) (err error) +//sys Msync(b []byte, flags int) (err error) +//sys Munlock(b []byte) (err error) +//sys Munlockall() (err error) + +//sysnb pipe(p *[2]_C_int) (err error) + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe(&pp) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) + +func Poll(fds []PollFd, timeout int) (n int, err error) { + if len(fds) == 0 { + return poll(nil, 0, timeout) + } + return poll(&fds[0], len(fds), timeout) +} + +//sys gettimeofday(tv *Timeval, tzp *Timezone) (err error) +//sysnb Time(t *Time_t) (tt Time_t, err error) +//sys Utime(path string, buf *Utimbuf) (err error) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_aix_ppc.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_aix_ppc.go new file mode 100644 index 00000000..c28af1f8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_aix_ppc.go @@ -0,0 +1,34 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build aix +// +build ppc + +package unix + +//sysnb Getrlimit(resource int, rlim *Rlimit) (err error) = getrlimit64 +//sysnb Setrlimit(resource int, rlim *Rlimit) (err error) = setrlimit64 +//sys Seek(fd int, offset int64, whence int) (off int64, err error) = lseek64 + +//sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: int32(sec), Nsec: int32(nsec)} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: int32(sec), Usec: int32(usec)} +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint32(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_aix_ppc64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_aix_ppc64.go new file mode 100644 index 00000000..881cacc6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_aix_ppc64.go @@ -0,0 +1,34 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build aix +// +build ppc64 + +package unix + +//sysnb Getrlimit(resource int, rlim *Rlimit) (err error) +//sysnb Setrlimit(resource int, rlim *Rlimit) (err error) +//sys Seek(fd int, offset int64, whence int) (off int64, err error) = lseek + +//sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) = mmap64 + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: nsec} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: int64(sec), Usec: int32(usec)} +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_bsd.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_bsd.go new file mode 100644 index 00000000..33c8b5f0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_bsd.go @@ -0,0 +1,624 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build darwin dragonfly freebsd netbsd openbsd + +// BSD system call wrappers shared by *BSD based systems +// including OS X (Darwin) and FreeBSD. Like the other +// syscall_*.go files it is compiled as Go code but also +// used as input to mksyscall which parses the //sys +// lines and generates system call stubs. + +package unix + +import ( + "runtime" + "syscall" + "unsafe" +) + +/* + * Wrapped + */ + +//sysnb getgroups(ngid int, gid *_Gid_t) (n int, err error) +//sysnb setgroups(ngid int, gid *_Gid_t) (err error) + +func Getgroups() (gids []int, err error) { + n, err := getgroups(0, nil) + if err != nil { + return nil, err + } + if n == 0 { + return nil, nil + } + + // Sanity check group count. Max is 16 on BSD. + if n < 0 || n > 1000 { + return nil, EINVAL + } + + a := make([]_Gid_t, n) + n, err = getgroups(n, &a[0]) + if err != nil { + return nil, err + } + gids = make([]int, n) + for i, v := range a[0:n] { + gids[i] = int(v) + } + return +} + +func Setgroups(gids []int) (err error) { + if len(gids) == 0 { + return setgroups(0, nil) + } + + a := make([]_Gid_t, len(gids)) + for i, v := range gids { + a[i] = _Gid_t(v) + } + return setgroups(len(a), &a[0]) +} + +func ReadDirent(fd int, buf []byte) (n int, err error) { + // Final argument is (basep *uintptr) and the syscall doesn't take nil. + // 64 bits should be enough. (32 bits isn't even on 386). Since the + // actual system call is getdirentries64, 64 is a good guess. + // TODO(rsc): Can we use a single global basep for all calls? + var base = (*uintptr)(unsafe.Pointer(new(uint64))) + return Getdirentries(fd, buf, base) +} + +// Wait status is 7 bits at bottom, either 0 (exited), +// 0x7F (stopped), or a signal number that caused an exit. +// The 0x80 bit is whether there was a core dump. +// An extra number (exit code, signal causing a stop) +// is in the high bits. + +type WaitStatus uint32 + +const ( + mask = 0x7F + core = 0x80 + shift = 8 + + exited = 0 + stopped = 0x7F +) + +func (w WaitStatus) Exited() bool { return w&mask == exited } + +func (w WaitStatus) ExitStatus() int { + if w&mask != exited { + return -1 + } + return int(w >> shift) +} + +func (w WaitStatus) Signaled() bool { return w&mask != stopped && w&mask != 0 } + +func (w WaitStatus) Signal() syscall.Signal { + sig := syscall.Signal(w & mask) + if sig == stopped || sig == 0 { + return -1 + } + return sig +} + +func (w WaitStatus) CoreDump() bool { return w.Signaled() && w&core != 0 } + +func (w WaitStatus) Stopped() bool { return w&mask == stopped && syscall.Signal(w>>shift) != SIGSTOP } + +func (w WaitStatus) Continued() bool { return w&mask == stopped && syscall.Signal(w>>shift) == SIGSTOP } + +func (w WaitStatus) StopSignal() syscall.Signal { + if !w.Stopped() { + return -1 + } + return syscall.Signal(w>>shift) & 0xFF +} + +func (w WaitStatus) TrapCause() int { return -1 } + +//sys wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) + +func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, err error) { + var status _C_int + wpid, err = wait4(pid, &status, options, rusage) + if wstatus != nil { + *wstatus = WaitStatus(status) + } + return +} + +//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) +//sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) +//sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) +//sysnb socket(domain int, typ int, proto int) (fd int, err error) +//sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) +//sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) +//sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sys Shutdown(s int, how int) (err error) + +func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, _Socklen, error) { + if sa.Port < 0 || sa.Port > 0xFFFF { + return nil, 0, EINVAL + } + sa.raw.Len = SizeofSockaddrInet4 + sa.raw.Family = AF_INET + p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) + p[0] = byte(sa.Port >> 8) + p[1] = byte(sa.Port) + for i := 0; i < len(sa.Addr); i++ { + sa.raw.Addr[i] = sa.Addr[i] + } + return unsafe.Pointer(&sa.raw), _Socklen(sa.raw.Len), nil +} + +func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, _Socklen, error) { + if sa.Port < 0 || sa.Port > 0xFFFF { + return nil, 0, EINVAL + } + sa.raw.Len = SizeofSockaddrInet6 + sa.raw.Family = AF_INET6 + p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) + p[0] = byte(sa.Port >> 8) + p[1] = byte(sa.Port) + sa.raw.Scope_id = sa.ZoneId + for i := 0; i < len(sa.Addr); i++ { + sa.raw.Addr[i] = sa.Addr[i] + } + return unsafe.Pointer(&sa.raw), _Socklen(sa.raw.Len), nil +} + +func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, _Socklen, error) { + name := sa.Name + n := len(name) + if n >= len(sa.raw.Path) || n == 0 { + return nil, 0, EINVAL + } + sa.raw.Len = byte(3 + n) // 2 for Family, Len; 1 for NUL + sa.raw.Family = AF_UNIX + for i := 0; i < n; i++ { + sa.raw.Path[i] = int8(name[i]) + } + return unsafe.Pointer(&sa.raw), _Socklen(sa.raw.Len), nil +} + +func (sa *SockaddrDatalink) sockaddr() (unsafe.Pointer, _Socklen, error) { + if sa.Index == 0 { + return nil, 0, EINVAL + } + sa.raw.Len = sa.Len + sa.raw.Family = AF_LINK + sa.raw.Index = sa.Index + sa.raw.Type = sa.Type + sa.raw.Nlen = sa.Nlen + sa.raw.Alen = sa.Alen + sa.raw.Slen = sa.Slen + for i := 0; i < len(sa.raw.Data); i++ { + sa.raw.Data[i] = sa.Data[i] + } + return unsafe.Pointer(&sa.raw), SizeofSockaddrDatalink, nil +} + +func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) { + switch rsa.Addr.Family { + case AF_LINK: + pp := (*RawSockaddrDatalink)(unsafe.Pointer(rsa)) + sa := new(SockaddrDatalink) + sa.Len = pp.Len + sa.Family = pp.Family + sa.Index = pp.Index + sa.Type = pp.Type + sa.Nlen = pp.Nlen + sa.Alen = pp.Alen + sa.Slen = pp.Slen + for i := 0; i < len(sa.Data); i++ { + sa.Data[i] = pp.Data[i] + } + return sa, nil + + case AF_UNIX: + pp := (*RawSockaddrUnix)(unsafe.Pointer(rsa)) + if pp.Len < 2 || pp.Len > SizeofSockaddrUnix { + return nil, EINVAL + } + sa := new(SockaddrUnix) + + // Some BSDs include the trailing NUL in the length, whereas + // others do not. Work around this by subtracting the leading + // family and len. The path is then scanned to see if a NUL + // terminator still exists within the length. + n := int(pp.Len) - 2 // subtract leading Family, Len + for i := 0; i < n; i++ { + if pp.Path[i] == 0 { + // found early NUL; assume Len included the NUL + // or was overestimating. + n = i + break + } + } + bytes := (*[10000]byte)(unsafe.Pointer(&pp.Path[0]))[0:n] + sa.Name = string(bytes) + return sa, nil + + case AF_INET: + pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa)) + sa := new(SockaddrInet4) + p := (*[2]byte)(unsafe.Pointer(&pp.Port)) + sa.Port = int(p[0])<<8 + int(p[1]) + for i := 0; i < len(sa.Addr); i++ { + sa.Addr[i] = pp.Addr[i] + } + return sa, nil + + case AF_INET6: + pp := (*RawSockaddrInet6)(unsafe.Pointer(rsa)) + sa := new(SockaddrInet6) + p := (*[2]byte)(unsafe.Pointer(&pp.Port)) + sa.Port = int(p[0])<<8 + int(p[1]) + sa.ZoneId = pp.Scope_id + for i := 0; i < len(sa.Addr); i++ { + sa.Addr[i] = pp.Addr[i] + } + return sa, nil + } + return nil, EAFNOSUPPORT +} + +func Accept(fd int) (nfd int, sa Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + nfd, err = accept(fd, &rsa, &len) + if err != nil { + return + } + if runtime.GOOS == "darwin" && len == 0 { + // Accepted socket has no address. + // This is likely due to a bug in xnu kernels, + // where instead of ECONNABORTED error socket + // is accepted, but has no address. + Close(nfd) + return 0, nil, ECONNABORTED + } + sa, err = anyToSockaddr(fd, &rsa) + if err != nil { + Close(nfd) + nfd = 0 + } + return +} + +func Getsockname(fd int) (sa Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + if err = getsockname(fd, &rsa, &len); err != nil { + return + } + // TODO(jsing): DragonFly has a "bug" (see issue 3349), which should be + // reported upstream. + if runtime.GOOS == "dragonfly" && rsa.Addr.Family == AF_UNSPEC && rsa.Addr.Len == 0 { + rsa.Addr.Family = AF_UNIX + rsa.Addr.Len = SizeofSockaddrUnix + } + return anyToSockaddr(fd, &rsa) +} + +//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) + +// GetsockoptString returns the string value of the socket option opt for the +// socket associated with fd at the given socket level. +func GetsockoptString(fd, level, opt int) (string, error) { + buf := make([]byte, 256) + vallen := _Socklen(len(buf)) + err := getsockopt(fd, level, opt, unsafe.Pointer(&buf[0]), &vallen) + if err != nil { + return "", err + } + return string(buf[:vallen-1]), nil +} + +//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) +//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) +//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) + +func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) { + var msg Msghdr + var rsa RawSockaddrAny + msg.Name = (*byte)(unsafe.Pointer(&rsa)) + msg.Namelen = uint32(SizeofSockaddrAny) + var iov Iovec + if len(p) > 0 { + iov.Base = (*byte)(unsafe.Pointer(&p[0])) + iov.SetLen(len(p)) + } + var dummy byte + if len(oob) > 0 { + // receive at least one normal byte + if len(p) == 0 { + iov.Base = &dummy + iov.SetLen(1) + } + msg.Control = (*byte)(unsafe.Pointer(&oob[0])) + msg.SetControllen(len(oob)) + } + msg.Iov = &iov + msg.Iovlen = 1 + if n, err = recvmsg(fd, &msg, flags); err != nil { + return + } + oobn = int(msg.Controllen) + recvflags = int(msg.Flags) + // source address is only specified if the socket is unconnected + if rsa.Addr.Family != AF_UNSPEC { + from, err = anyToSockaddr(fd, &rsa) + } + return +} + +//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) + +func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) { + _, err = SendmsgN(fd, p, oob, to, flags) + return +} + +func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) { + var ptr unsafe.Pointer + var salen _Socklen + if to != nil { + ptr, salen, err = to.sockaddr() + if err != nil { + return 0, err + } + } + var msg Msghdr + msg.Name = (*byte)(unsafe.Pointer(ptr)) + msg.Namelen = uint32(salen) + var iov Iovec + if len(p) > 0 { + iov.Base = (*byte)(unsafe.Pointer(&p[0])) + iov.SetLen(len(p)) + } + var dummy byte + if len(oob) > 0 { + // send at least one normal byte + if len(p) == 0 { + iov.Base = &dummy + iov.SetLen(1) + } + msg.Control = (*byte)(unsafe.Pointer(&oob[0])) + msg.SetControllen(len(oob)) + } + msg.Iov = &iov + msg.Iovlen = 1 + if n, err = sendmsg(fd, &msg, flags); err != nil { + return 0, err + } + if len(oob) > 0 && len(p) == 0 { + n = 0 + } + return n, nil +} + +//sys kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) + +func Kevent(kq int, changes, events []Kevent_t, timeout *Timespec) (n int, err error) { + var change, event unsafe.Pointer + if len(changes) > 0 { + change = unsafe.Pointer(&changes[0]) + } + if len(events) > 0 { + event = unsafe.Pointer(&events[0]) + } + return kevent(kq, change, len(changes), event, len(events), timeout) +} + +//sys sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS___SYSCTL + +// sysctlmib translates name to mib number and appends any additional args. +func sysctlmib(name string, args ...int) ([]_C_int, error) { + // Translate name to mib number. + mib, err := nametomib(name) + if err != nil { + return nil, err + } + + for _, a := range args { + mib = append(mib, _C_int(a)) + } + + return mib, nil +} + +func Sysctl(name string) (string, error) { + return SysctlArgs(name) +} + +func SysctlArgs(name string, args ...int) (string, error) { + buf, err := SysctlRaw(name, args...) + if err != nil { + return "", err + } + n := len(buf) + + // Throw away terminating NUL. + if n > 0 && buf[n-1] == '\x00' { + n-- + } + return string(buf[0:n]), nil +} + +func SysctlUint32(name string) (uint32, error) { + return SysctlUint32Args(name) +} + +func SysctlUint32Args(name string, args ...int) (uint32, error) { + mib, err := sysctlmib(name, args...) + if err != nil { + return 0, err + } + + n := uintptr(4) + buf := make([]byte, 4) + if err := sysctl(mib, &buf[0], &n, nil, 0); err != nil { + return 0, err + } + if n != 4 { + return 0, EIO + } + return *(*uint32)(unsafe.Pointer(&buf[0])), nil +} + +func SysctlUint64(name string, args ...int) (uint64, error) { + mib, err := sysctlmib(name, args...) + if err != nil { + return 0, err + } + + n := uintptr(8) + buf := make([]byte, 8) + if err := sysctl(mib, &buf[0], &n, nil, 0); err != nil { + return 0, err + } + if n != 8 { + return 0, EIO + } + return *(*uint64)(unsafe.Pointer(&buf[0])), nil +} + +func SysctlRaw(name string, args ...int) ([]byte, error) { + mib, err := sysctlmib(name, args...) + if err != nil { + return nil, err + } + + // Find size. + n := uintptr(0) + if err := sysctl(mib, nil, &n, nil, 0); err != nil { + return nil, err + } + if n == 0 { + return nil, nil + } + + // Read into buffer of that size. + buf := make([]byte, n) + if err := sysctl(mib, &buf[0], &n, nil, 0); err != nil { + return nil, err + } + + // The actual call may return less than the original reported required + // size so ensure we deal with that. + return buf[:n], nil +} + +//sys utimes(path string, timeval *[2]Timeval) (err error) + +func Utimes(path string, tv []Timeval) error { + if tv == nil { + return utimes(path, nil) + } + if len(tv) != 2 { + return EINVAL + } + return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) +} + +func UtimesNano(path string, ts []Timespec) error { + if ts == nil { + err := utimensat(AT_FDCWD, path, nil, 0) + if err != ENOSYS { + return err + } + return utimes(path, nil) + } + if len(ts) != 2 { + return EINVAL + } + // Darwin setattrlist can set nanosecond timestamps + err := setattrlistTimes(path, ts, 0) + if err != ENOSYS { + return err + } + err = utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0) + if err != ENOSYS { + return err + } + // Not as efficient as it could be because Timespec and + // Timeval have different types in the different OSes + tv := [2]Timeval{ + NsecToTimeval(TimespecToNsec(ts[0])), + NsecToTimeval(TimespecToNsec(ts[1])), + } + return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) +} + +func UtimesNanoAt(dirfd int, path string, ts []Timespec, flags int) error { + if ts == nil { + return utimensat(dirfd, path, nil, flags) + } + if len(ts) != 2 { + return EINVAL + } + err := setattrlistTimes(path, ts, flags) + if err != ENOSYS { + return err + } + return utimensat(dirfd, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), flags) +} + +//sys futimes(fd int, timeval *[2]Timeval) (err error) + +func Futimes(fd int, tv []Timeval) error { + if tv == nil { + return futimes(fd, nil) + } + if len(tv) != 2 { + return EINVAL + } + return futimes(fd, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) +} + +//sys fcntl(fd int, cmd int, arg int) (val int, err error) + +//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) + +func Poll(fds []PollFd, timeout int) (n int, err error) { + if len(fds) == 0 { + return poll(nil, 0, timeout) + } + return poll(&fds[0], len(fds), timeout) +} + +// TODO: wrap +// Acct(name nil-string) (err error) +// Gethostuuid(uuid *byte, timeout *Timespec) (err error) +// Ptrace(req int, pid int, addr uintptr, data int) (ret uintptr, err error) + +var mapper = &mmapper{ + active: make(map[*byte][]byte), + mmap: mmap, + munmap: munmap, +} + +func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { + return mapper.Mmap(fd, offset, length, prot, flags) +} + +func Munmap(b []byte) (err error) { + return mapper.Munmap(b) +} + +//sys Madvise(b []byte, behav int) (err error) +//sys Mlock(b []byte) (err error) +//sys Mlockall(flags int) (err error) +//sys Mprotect(b []byte, prot int) (err error) +//sys Msync(b []byte, flags int) (err error) +//sys Munlock(b []byte) (err error) +//sys Munlockall() (err error) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_darwin.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_darwin.go new file mode 100644 index 00000000..1aabc560 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_darwin.go @@ -0,0 +1,700 @@ +// Copyright 2009,2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Darwin system calls. +// This file is compiled as ordinary Go code, +// but it is also input to mksyscall, +// which parses the //sys lines and generates system call stubs. +// Note that sometimes we use a lowercase //sys name and wrap +// it in our own nicer implementation, either here or in +// syscall_bsd.go or syscall_unix.go. + +package unix + +import ( + "errors" + "syscall" + "unsafe" +) + +const ImplementsGetwd = true + +func Getwd() (string, error) { + buf := make([]byte, 2048) + attrs, err := getAttrList(".", attrList{CommonAttr: attrCmnFullpath}, buf, 0) + if err == nil && len(attrs) == 1 && len(attrs[0]) >= 2 { + wd := string(attrs[0]) + // Sanity check that it's an absolute path and ends + // in a null byte, which we then strip. + if wd[0] == '/' && wd[len(wd)-1] == 0 { + return wd[:len(wd)-1], nil + } + } + // If pkg/os/getwd.go gets ENOTSUP, it will fall back to the + // slow algorithm. + return "", ENOTSUP +} + +// SockaddrDatalink implements the Sockaddr interface for AF_LINK type sockets. +type SockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [12]int8 + raw RawSockaddrDatalink +} + +// Translate "kern.hostname" to []_C_int{0,1,2,3}. +func nametomib(name string) (mib []_C_int, err error) { + const siz = unsafe.Sizeof(mib[0]) + + // NOTE(rsc): It seems strange to set the buffer to have + // size CTL_MAXNAME+2 but use only CTL_MAXNAME + // as the size. I don't know why the +2 is here, but the + // kernel uses +2 for its own implementation of this function. + // I am scared that if we don't include the +2 here, the kernel + // will silently write 2 words farther than we specify + // and we'll get memory corruption. + var buf [CTL_MAXNAME + 2]_C_int + n := uintptr(CTL_MAXNAME) * siz + + p := (*byte)(unsafe.Pointer(&buf[0])) + bytes, err := ByteSliceFromString(name) + if err != nil { + return nil, err + } + + // Magic sysctl: "setting" 0.3 to a string name + // lets you read back the array of integers form. + if err = sysctl([]_C_int{0, 3}, p, &n, &bytes[0], uintptr(len(name))); err != nil { + return nil, err + } + return buf[0 : n/siz], nil +} + +//sys ptrace(request int, pid int, addr uintptr, data uintptr) (err error) +func PtraceAttach(pid int) (err error) { return ptrace(PT_ATTACH, pid, 0, 0) } +func PtraceDetach(pid int) (err error) { return ptrace(PT_DETACH, pid, 0, 0) } + +const ( + attrBitMapCount = 5 + attrCmnFullpath = 0x08000000 +) + +type attrList struct { + bitmapCount uint16 + _ uint16 + CommonAttr uint32 + VolAttr uint32 + DirAttr uint32 + FileAttr uint32 + Forkattr uint32 +} + +func getAttrList(path string, attrList attrList, attrBuf []byte, options uint) (attrs [][]byte, err error) { + if len(attrBuf) < 4 { + return nil, errors.New("attrBuf too small") + } + attrList.bitmapCount = attrBitMapCount + + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return nil, err + } + + _, _, e1 := Syscall6( + SYS_GETATTRLIST, + uintptr(unsafe.Pointer(_p0)), + uintptr(unsafe.Pointer(&attrList)), + uintptr(unsafe.Pointer(&attrBuf[0])), + uintptr(len(attrBuf)), + uintptr(options), + 0, + ) + if e1 != 0 { + return nil, e1 + } + size := *(*uint32)(unsafe.Pointer(&attrBuf[0])) + + // dat is the section of attrBuf that contains valid data, + // without the 4 byte length header. All attribute offsets + // are relative to dat. + dat := attrBuf + if int(size) < len(attrBuf) { + dat = dat[:size] + } + dat = dat[4:] // remove length prefix + + for i := uint32(0); int(i) < len(dat); { + header := dat[i:] + if len(header) < 8 { + return attrs, errors.New("truncated attribute header") + } + datOff := *(*int32)(unsafe.Pointer(&header[0])) + attrLen := *(*uint32)(unsafe.Pointer(&header[4])) + if datOff < 0 || uint32(datOff)+attrLen > uint32(len(dat)) { + return attrs, errors.New("truncated results; attrBuf too small") + } + end := uint32(datOff) + attrLen + attrs = append(attrs, dat[datOff:end]) + i = end + if r := i % 4; r != 0 { + i += (4 - r) + } + } + return +} + +//sysnb pipe() (r int, w int, err error) + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + p[0], p[1], err = pipe() + return +} + +func Getfsstat(buf []Statfs_t, flags int) (n int, err error) { + var _p0 unsafe.Pointer + var bufsize uintptr + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + bufsize = unsafe.Sizeof(Statfs_t{}) * uintptr(len(buf)) + } + r0, _, e1 := Syscall(SYS_GETFSSTAT64, uintptr(_p0), bufsize, uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func xattrPointer(dest []byte) *byte { + // It's only when dest is set to NULL that the OS X implementations of + // getxattr() and listxattr() return the current sizes of the named attributes. + // An empty byte array is not sufficient. To maintain the same behaviour as the + // linux implementation, we wrap around the system calls and pass in NULL when + // dest is empty. + var destp *byte + if len(dest) > 0 { + destp = &dest[0] + } + return destp +} + +//sys getxattr(path string, attr string, dest *byte, size int, position uint32, options int) (sz int, err error) + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + return getxattr(path, attr, xattrPointer(dest), len(dest), 0, 0) +} + +func Lgetxattr(link string, attr string, dest []byte) (sz int, err error) { + return getxattr(link, attr, xattrPointer(dest), len(dest), 0, XATTR_NOFOLLOW) +} + +//sys fgetxattr(fd int, attr string, dest *byte, size int, position uint32, options int) (sz int, err error) + +func Fgetxattr(fd int, attr string, dest []byte) (sz int, err error) { + return fgetxattr(fd, attr, xattrPointer(dest), len(dest), 0, 0) +} + +//sys setxattr(path string, attr string, data *byte, size int, position uint32, options int) (err error) + +func Setxattr(path string, attr string, data []byte, flags int) (err error) { + // The parameters for the OS X implementation vary slightly compared to the + // linux system call, specifically the position parameter: + // + // linux: + // int setxattr( + // const char *path, + // const char *name, + // const void *value, + // size_t size, + // int flags + // ); + // + // darwin: + // int setxattr( + // const char *path, + // const char *name, + // void *value, + // size_t size, + // u_int32_t position, + // int options + // ); + // + // position specifies the offset within the extended attribute. In the + // current implementation, only the resource fork extended attribute makes + // use of this argument. For all others, position is reserved. We simply + // default to setting it to zero. + return setxattr(path, attr, xattrPointer(data), len(data), 0, flags) +} + +func Lsetxattr(link string, attr string, data []byte, flags int) (err error) { + return setxattr(link, attr, xattrPointer(data), len(data), 0, flags|XATTR_NOFOLLOW) +} + +//sys fsetxattr(fd int, attr string, data *byte, size int, position uint32, options int) (err error) + +func Fsetxattr(fd int, attr string, data []byte, flags int) (err error) { + return fsetxattr(fd, attr, xattrPointer(data), len(data), 0, 0) +} + +//sys removexattr(path string, attr string, options int) (err error) + +func Removexattr(path string, attr string) (err error) { + // We wrap around and explicitly zero out the options provided to the OS X + // implementation of removexattr, we do so for interoperability with the + // linux variant. + return removexattr(path, attr, 0) +} + +func Lremovexattr(link string, attr string) (err error) { + return removexattr(link, attr, XATTR_NOFOLLOW) +} + +//sys fremovexattr(fd int, attr string, options int) (err error) + +func Fremovexattr(fd int, attr string) (err error) { + return fremovexattr(fd, attr, 0) +} + +//sys listxattr(path string, dest *byte, size int, options int) (sz int, err error) + +func Listxattr(path string, dest []byte) (sz int, err error) { + return listxattr(path, xattrPointer(dest), len(dest), 0) +} + +func Llistxattr(link string, dest []byte) (sz int, err error) { + return listxattr(link, xattrPointer(dest), len(dest), XATTR_NOFOLLOW) +} + +//sys flistxattr(fd int, dest *byte, size int, options int) (sz int, err error) + +func Flistxattr(fd int, dest []byte) (sz int, err error) { + return flistxattr(fd, xattrPointer(dest), len(dest), 0) +} + +func setattrlistTimes(path string, times []Timespec, flags int) error { + _p0, err := BytePtrFromString(path) + if err != nil { + return err + } + + var attrList attrList + attrList.bitmapCount = ATTR_BIT_MAP_COUNT + attrList.CommonAttr = ATTR_CMN_MODTIME | ATTR_CMN_ACCTIME + + // order is mtime, atime: the opposite of Chtimes + attributes := [2]Timespec{times[1], times[0]} + options := 0 + if flags&AT_SYMLINK_NOFOLLOW != 0 { + options |= FSOPT_NOFOLLOW + } + _, _, e1 := Syscall6( + SYS_SETATTRLIST, + uintptr(unsafe.Pointer(_p0)), + uintptr(unsafe.Pointer(&attrList)), + uintptr(unsafe.Pointer(&attributes)), + uintptr(unsafe.Sizeof(attributes)), + uintptr(options), + 0, + ) + if e1 != 0 { + return e1 + } + return nil +} + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) error { + // Darwin doesn't support SYS_UTIMENSAT + return ENOSYS +} + +/* + * Wrapped + */ + +//sys kill(pid int, signum int, posix int) (err error) + +func Kill(pid int, signum syscall.Signal) (err error) { return kill(pid, int(signum), 1) } + +//sys ioctl(fd int, req uint, arg uintptr) (err error) + +// ioctl itself should not be exposed directly, but additional get/set +// functions for specific types are permissible. + +// IoctlSetInt performs an ioctl operation which sets an integer value +// on fd, using the specified request number. +func IoctlSetInt(fd int, req uint, value int) error { + return ioctl(fd, req, uintptr(value)) +} + +func ioctlSetWinsize(fd int, req uint, value *Winsize) error { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +func ioctlSetTermios(fd int, req uint, value *Termios) error { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +// IoctlGetInt performs an ioctl operation which gets an integer value +// from fd, using the specified request number. +func IoctlGetInt(fd int, req uint) (int, error) { + var value int + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return value, err +} + +func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { + var value Winsize + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func IoctlGetTermios(fd int, req uint) (*Termios, error) { + var value Termios + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func Uname(uname *Utsname) error { + mib := []_C_int{CTL_KERN, KERN_OSTYPE} + n := unsafe.Sizeof(uname.Sysname) + if err := sysctl(mib, &uname.Sysname[0], &n, nil, 0); err != nil { + return err + } + + mib = []_C_int{CTL_KERN, KERN_HOSTNAME} + n = unsafe.Sizeof(uname.Nodename) + if err := sysctl(mib, &uname.Nodename[0], &n, nil, 0); err != nil { + return err + } + + mib = []_C_int{CTL_KERN, KERN_OSRELEASE} + n = unsafe.Sizeof(uname.Release) + if err := sysctl(mib, &uname.Release[0], &n, nil, 0); err != nil { + return err + } + + mib = []_C_int{CTL_KERN, KERN_VERSION} + n = unsafe.Sizeof(uname.Version) + if err := sysctl(mib, &uname.Version[0], &n, nil, 0); err != nil { + return err + } + + // The version might have newlines or tabs in it, convert them to + // spaces. + for i, b := range uname.Version { + if b == '\n' || b == '\t' { + if i == len(uname.Version)-1 { + uname.Version[i] = 0 + } else { + uname.Version[i] = ' ' + } + } + } + + mib = []_C_int{CTL_HW, HW_MACHINE} + n = unsafe.Sizeof(uname.Machine) + if err := sysctl(mib, &uname.Machine[0], &n, nil, 0); err != nil { + return err + } + + return nil +} + +/* + * Exposed directly + */ +//sys Access(path string, mode uint32) (err error) +//sys Adjtime(delta *Timeval, olddelta *Timeval) (err error) +//sys Chdir(path string) (err error) +//sys Chflags(path string, flags int) (err error) +//sys Chmod(path string, mode uint32) (err error) +//sys Chown(path string, uid int, gid int) (err error) +//sys Chroot(path string) (err error) +//sys Close(fd int) (err error) +//sys Dup(fd int) (nfd int, err error) +//sys Dup2(from int, to int) (err error) +//sys Exchangedata(path1 string, path2 string, options int) (err error) +//sys Exit(code int) +//sys Faccessat(dirfd int, path string, mode uint32, flags int) (err error) +//sys Fchdir(fd int) (err error) +//sys Fchflags(fd int, flags int) (err error) +//sys Fchmod(fd int, mode uint32) (err error) +//sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) +//sys Flock(fd int, how int) (err error) +//sys Fpathconf(fd int, name int) (val int, err error) +//sys Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64 +//sys Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) = SYS_FSTATAT64 +//sys Fstatfs(fd int, stat *Statfs_t) (err error) = SYS_FSTATFS64 +//sys Fsync(fd int) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sys Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) = SYS_GETDIRENTRIES64 +//sys Getdtablesize() (size int) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (uid int) +//sysnb Getgid() (gid int) +//sysnb Getpgid(pid int) (pgid int, err error) +//sysnb Getpgrp() (pgrp int) +//sysnb Getpid() (pid int) +//sysnb Getppid() (ppid int) +//sys Getpriority(which int, who int) (prio int, err error) +//sysnb Getrlimit(which int, lim *Rlimit) (err error) +//sysnb Getrusage(who int, rusage *Rusage) (err error) +//sysnb Getsid(pid int) (sid int, err error) +//sysnb Getuid() (uid int) +//sysnb Issetugid() (tainted bool) +//sys Kqueue() (fd int, err error) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Link(path string, link string) (err error) +//sys Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) +//sys Listen(s int, backlog int) (err error) +//sys Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64 +//sys Mkdir(path string, mode uint32) (err error) +//sys Mkdirat(dirfd int, path string, mode uint32) (err error) +//sys Mkfifo(path string, mode uint32) (err error) +//sys Mknod(path string, mode uint32, dev int) (err error) +//sys Open(path string, mode int, perm uint32) (fd int, err error) +//sys Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) +//sys Pathconf(path string, name int) (val int, err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) +//sys read(fd int, p []byte) (n int, err error) +//sys Readlink(path string, buf []byte) (n int, err error) +//sys Readlinkat(dirfd int, path string, buf []byte) (n int, err error) +//sys Rename(from string, to string) (err error) +//sys Renameat(fromfd int, from string, tofd int, to string) (err error) +//sys Revoke(path string) (err error) +//sys Rmdir(path string) (err error) +//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK +//sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) +//sys Setegid(egid int) (err error) +//sysnb Seteuid(euid int) (err error) +//sysnb Setgid(gid int) (err error) +//sys Setlogin(name string) (err error) +//sysnb Setpgid(pid int, pgid int) (err error) +//sys Setpriority(which int, who int, prio int) (err error) +//sys Setprivexec(flag int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sysnb Setrlimit(which int, lim *Rlimit) (err error) +//sysnb Setsid() (pid int, err error) +//sysnb Settimeofday(tp *Timeval) (err error) +//sysnb Setuid(uid int) (err error) +//sys Stat(path string, stat *Stat_t) (err error) = SYS_STAT64 +//sys Statfs(path string, stat *Statfs_t) (err error) = SYS_STATFS64 +//sys Symlink(path string, link string) (err error) +//sys Symlinkat(oldpath string, newdirfd int, newpath string) (err error) +//sys Sync() (err error) +//sys Truncate(path string, length int64) (err error) +//sys Umask(newmask int) (oldmask int) +//sys Undelete(path string) (err error) +//sys Unlink(path string) (err error) +//sys Unlinkat(dirfd int, path string, flags int) (err error) +//sys Unmount(path string, flags int) (err error) +//sys write(fd int, p []byte) (n int, err error) +//sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) +//sys munmap(addr uintptr, length uintptr) (err error) +//sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ +//sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE + +/* + * Unimplemented + */ +// Profil +// Sigaction +// Sigprocmask +// Getlogin +// Sigpending +// Sigaltstack +// Ioctl +// Reboot +// Execve +// Vfork +// Sbrk +// Sstk +// Ovadvise +// Mincore +// Setitimer +// Swapon +// Select +// Sigsuspend +// Readv +// Writev +// Nfssvc +// Getfh +// Quotactl +// Mount +// Csops +// Waitid +// Add_profil +// Kdebug_trace +// Sigreturn +// Atsocket +// Kqueue_from_portset_np +// Kqueue_portset +// Getattrlist +// Setattrlist +// Getdirentriesattr +// Searchfs +// Delete +// Copyfile +// Watchevent +// Waitevent +// Modwatch +// Fsctl +// Initgroups +// Posix_spawn +// Nfsclnt +// Fhopen +// Minherit +// Semsys +// Msgsys +// Shmsys +// Semctl +// Semget +// Semop +// Msgctl +// Msgget +// Msgsnd +// Msgrcv +// Shmat +// Shmctl +// Shmdt +// Shmget +// Shm_open +// Shm_unlink +// Sem_open +// Sem_close +// Sem_unlink +// Sem_wait +// Sem_trywait +// Sem_post +// Sem_getvalue +// Sem_init +// Sem_destroy +// Open_extended +// Umask_extended +// Stat_extended +// Lstat_extended +// Fstat_extended +// Chmod_extended +// Fchmod_extended +// Access_extended +// Settid +// Gettid +// Setsgroups +// Getsgroups +// Setwgroups +// Getwgroups +// Mkfifo_extended +// Mkdir_extended +// Identitysvc +// Shared_region_check_np +// Shared_region_map_np +// __pthread_mutex_destroy +// __pthread_mutex_init +// __pthread_mutex_lock +// __pthread_mutex_trylock +// __pthread_mutex_unlock +// __pthread_cond_init +// __pthread_cond_destroy +// __pthread_cond_broadcast +// __pthread_cond_signal +// Setsid_with_pid +// __pthread_cond_timedwait +// Aio_fsync +// Aio_return +// Aio_suspend +// Aio_cancel +// Aio_error +// Aio_read +// Aio_write +// Lio_listio +// __pthread_cond_wait +// Iopolicysys +// __pthread_kill +// __pthread_sigmask +// __sigwait +// __disable_threadsignal +// __pthread_markcancel +// __pthread_canceled +// __semwait_signal +// Proc_info +// sendfile +// Stat64_extended +// Lstat64_extended +// Fstat64_extended +// __pthread_chdir +// __pthread_fchdir +// Audit +// Auditon +// Getauid +// Setauid +// Getaudit +// Setaudit +// Getaudit_addr +// Setaudit_addr +// Auditctl +// Bsdthread_create +// Bsdthread_terminate +// Stack_snapshot +// Bsdthread_register +// Workq_open +// Workq_ops +// __mac_execve +// __mac_syscall +// __mac_get_file +// __mac_set_file +// __mac_get_link +// __mac_set_link +// __mac_get_proc +// __mac_set_proc +// __mac_get_fd +// __mac_set_fd +// __mac_get_pid +// __mac_get_lcid +// __mac_get_lctx +// __mac_set_lctx +// Setlcid +// Read_nocancel +// Write_nocancel +// Open_nocancel +// Close_nocancel +// Wait4_nocancel +// Recvmsg_nocancel +// Sendmsg_nocancel +// Recvfrom_nocancel +// Accept_nocancel +// Fcntl_nocancel +// Select_nocancel +// Fsync_nocancel +// Connect_nocancel +// Sigsuspend_nocancel +// Readv_nocancel +// Writev_nocancel +// Sendto_nocancel +// Pread_nocancel +// Pwrite_nocancel +// Waitid_nocancel +// Poll_nocancel +// Msgsnd_nocancel +// Msgrcv_nocancel +// Sem_wait_nocancel +// Aio_suspend_nocancel +// __sigwait_nocancel +// __semwait_signal_nocancel +// __mac_mount +// __mac_get_mount +// __mac_getfsstat diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_darwin_386.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_darwin_386.go new file mode 100644 index 00000000..b3ac109a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_darwin_386.go @@ -0,0 +1,68 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build 386,darwin + +package unix + +import ( + "syscall" + "unsafe" +) + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: int32(sec), Nsec: int32(nsec)} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: int32(sec), Usec: int32(usec)} +} + +//sysnb gettimeofday(tp *Timeval) (sec int32, usec int32, err error) +func Gettimeofday(tv *Timeval) (err error) { + // The tv passed to gettimeofday must be non-nil + // but is otherwise unused. The answers come back + // in the two registers. + sec, usec, err := gettimeofday(tv) + tv.Sec = int32(sec) + tv.Usec = int32(usec) + return err +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint32(fd) + k.Filter = int16(mode) + k.Flags = uint16(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint32(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + var length = uint64(count) + + _, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(*offset>>32), uintptr(unsafe.Pointer(&length)), 0, 0, 0, 0) + + written = int(length) + + if e1 != 0 { + err = e1 + } + return +} + +func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) + +// SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions +// of darwin/386 the syscall is called sysctl instead of __sysctl. +const SYS___SYSCTL = SYS_SYSCTL diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go new file mode 100644 index 00000000..75219444 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go @@ -0,0 +1,68 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build amd64,darwin + +package unix + +import ( + "syscall" + "unsafe" +) + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: nsec} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: int32(usec)} +} + +//sysnb gettimeofday(tp *Timeval) (sec int64, usec int32, err error) +func Gettimeofday(tv *Timeval) (err error) { + // The tv passed to gettimeofday must be non-nil + // but is otherwise unused. The answers come back + // in the two registers. + sec, usec, err := gettimeofday(tv) + tv.Sec = sec + tv.Usec = usec + return err +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint64(fd) + k.Filter = int16(mode) + k.Flags = uint16(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + var length = uint64(count) + + _, _, e1 := Syscall6(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(unsafe.Pointer(&length)), 0, 0) + + written = int(length) + + if e1 != 0 { + err = e1 + } + return +} + +func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) + +// SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions +// of darwin/amd64 the syscall is called sysctl instead of __sysctl. +const SYS___SYSCTL = SYS_SYSCTL diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_darwin_arm.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_darwin_arm.go new file mode 100644 index 00000000..faae207a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_darwin_arm.go @@ -0,0 +1,66 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package unix + +import ( + "syscall" + "unsafe" +) + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: int32(sec), Nsec: int32(nsec)} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: int32(sec), Usec: int32(usec)} +} + +//sysnb gettimeofday(tp *Timeval) (sec int32, usec int32, err error) +func Gettimeofday(tv *Timeval) (err error) { + // The tv passed to gettimeofday must be non-nil + // but is otherwise unused. The answers come back + // in the two registers. + sec, usec, err := gettimeofday(tv) + tv.Sec = int32(sec) + tv.Usec = int32(usec) + return err +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint32(fd) + k.Filter = int16(mode) + k.Flags = uint16(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint32(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + var length = uint64(count) + + _, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(*offset>>32), uintptr(unsafe.Pointer(&length)), 0, 0, 0, 0) + + written = int(length) + + if e1 != 0 { + err = e1 + } + return +} + +func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) // sic + +// SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions +// of darwin/arm the syscall is called sysctl instead of __sysctl. +const SYS___SYSCTL = SYS_SYSCTL diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go new file mode 100644 index 00000000..d6d96280 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go @@ -0,0 +1,68 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build arm64,darwin + +package unix + +import ( + "syscall" + "unsafe" +) + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: nsec} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: int32(usec)} +} + +//sysnb gettimeofday(tp *Timeval) (sec int64, usec int32, err error) +func Gettimeofday(tv *Timeval) (err error) { + // The tv passed to gettimeofday must be non-nil + // but is otherwise unused. The answers come back + // in the two registers. + sec, usec, err := gettimeofday(tv) + tv.Sec = sec + tv.Usec = usec + return err +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint64(fd) + k.Filter = int16(mode) + k.Flags = uint16(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + var length = uint64(count) + + _, _, e1 := Syscall6(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(unsafe.Pointer(&length)), 0, 0) + + written = int(length) + + if e1 != 0 { + err = e1 + } + return +} + +func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) // sic + +// SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions +// of darwin/arm64 the syscall is called sysctl instead of __sysctl. +const SYS___SYSCTL = SYS_SYSCTL diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_dragonfly.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_dragonfly.go new file mode 100644 index 00000000..79d125b3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_dragonfly.go @@ -0,0 +1,523 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// DragonFly BSD system calls. +// This file is compiled as ordinary Go code, +// but it is also input to mksyscall, +// which parses the //sys lines and generates system call stubs. +// Note that sometimes we use a lowercase //sys name and wrap +// it in our own nicer implementation, either here or in +// syscall_bsd.go or syscall_unix.go. + +package unix + +import "unsafe" + +// SockaddrDatalink implements the Sockaddr interface for AF_LINK type sockets. +type SockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [12]int8 + Rcf uint16 + Route [16]uint16 + raw RawSockaddrDatalink +} + +// Translate "kern.hostname" to []_C_int{0,1,2,3}. +func nametomib(name string) (mib []_C_int, err error) { + const siz = unsafe.Sizeof(mib[0]) + + // NOTE(rsc): It seems strange to set the buffer to have + // size CTL_MAXNAME+2 but use only CTL_MAXNAME + // as the size. I don't know why the +2 is here, but the + // kernel uses +2 for its own implementation of this function. + // I am scared that if we don't include the +2 here, the kernel + // will silently write 2 words farther than we specify + // and we'll get memory corruption. + var buf [CTL_MAXNAME + 2]_C_int + n := uintptr(CTL_MAXNAME) * siz + + p := (*byte)(unsafe.Pointer(&buf[0])) + bytes, err := ByteSliceFromString(name) + if err != nil { + return nil, err + } + + // Magic sysctl: "setting" 0.3 to a string name + // lets you read back the array of integers form. + if err = sysctl([]_C_int{0, 3}, p, &n, &bytes[0], uintptr(len(name))); err != nil { + return nil, err + } + return buf[0 : n/siz], nil +} + +//sysnb pipe() (r int, w int, err error) + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + p[0], p[1], err = pipe() + return +} + +//sys extpread(fd int, p []byte, flags int, offset int64) (n int, err error) +func Pread(fd int, p []byte, offset int64) (n int, err error) { + return extpread(fd, p, 0, offset) +} + +//sys extpwrite(fd int, p []byte, flags int, offset int64) (n int, err error) +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + return extpwrite(fd, p, 0, offset) +} + +func Accept4(fd, flags int) (nfd int, sa Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + nfd, err = accept4(fd, &rsa, &len, flags) + if err != nil { + return + } + if len > SizeofSockaddrAny { + panic("RawSockaddrAny too small") + } + sa, err = anyToSockaddr(fd, &rsa) + if err != nil { + Close(nfd) + nfd = 0 + } + return +} + +const ImplementsGetwd = true + +//sys Getcwd(buf []byte) (n int, err error) = SYS___GETCWD + +func Getwd() (string, error) { + var buf [PathMax]byte + _, err := Getcwd(buf[0:]) + if err != nil { + return "", err + } + n := clen(buf[:]) + if n < 1 { + return "", EINVAL + } + return string(buf[:n]), nil +} + +func Getfsstat(buf []Statfs_t, flags int) (n int, err error) { + var _p0 unsafe.Pointer + var bufsize uintptr + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + bufsize = unsafe.Sizeof(Statfs_t{}) * uintptr(len(buf)) + } + r0, _, e1 := Syscall(SYS_GETFSSTAT, uintptr(_p0), bufsize, uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func setattrlistTimes(path string, times []Timespec, flags int) error { + // used on Darwin for UtimesNano + return ENOSYS +} + +//sys ioctl(fd int, req uint, arg uintptr) (err error) + +// ioctl itself should not be exposed directly, but additional get/set +// functions for specific types are permissible. + +// IoctlSetInt performs an ioctl operation which sets an integer value +// on fd, using the specified request number. +func IoctlSetInt(fd int, req uint, value int) error { + return ioctl(fd, req, uintptr(value)) +} + +func ioctlSetWinsize(fd int, req uint, value *Winsize) error { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +func ioctlSetTermios(fd int, req uint, value *Termios) error { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +// IoctlGetInt performs an ioctl operation which gets an integer value +// from fd, using the specified request number. +func IoctlGetInt(fd int, req uint) (int, error) { + var value int + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return value, err +} + +func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { + var value Winsize + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func IoctlGetTermios(fd int, req uint) (*Termios, error) { + var value Termios + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func sysctlUname(mib []_C_int, old *byte, oldlen *uintptr) error { + err := sysctl(mib, old, oldlen, nil, 0) + if err != nil { + // Utsname members on Dragonfly are only 32 bytes and + // the syscall returns ENOMEM in case the actual value + // is longer. + if err == ENOMEM { + err = nil + } + } + return err +} + +func Uname(uname *Utsname) error { + mib := []_C_int{CTL_KERN, KERN_OSTYPE} + n := unsafe.Sizeof(uname.Sysname) + if err := sysctlUname(mib, &uname.Sysname[0], &n); err != nil { + return err + } + uname.Sysname[unsafe.Sizeof(uname.Sysname)-1] = 0 + + mib = []_C_int{CTL_KERN, KERN_HOSTNAME} + n = unsafe.Sizeof(uname.Nodename) + if err := sysctlUname(mib, &uname.Nodename[0], &n); err != nil { + return err + } + uname.Nodename[unsafe.Sizeof(uname.Nodename)-1] = 0 + + mib = []_C_int{CTL_KERN, KERN_OSRELEASE} + n = unsafe.Sizeof(uname.Release) + if err := sysctlUname(mib, &uname.Release[0], &n); err != nil { + return err + } + uname.Release[unsafe.Sizeof(uname.Release)-1] = 0 + + mib = []_C_int{CTL_KERN, KERN_VERSION} + n = unsafe.Sizeof(uname.Version) + if err := sysctlUname(mib, &uname.Version[0], &n); err != nil { + return err + } + + // The version might have newlines or tabs in it, convert them to + // spaces. + for i, b := range uname.Version { + if b == '\n' || b == '\t' { + if i == len(uname.Version)-1 { + uname.Version[i] = 0 + } else { + uname.Version[i] = ' ' + } + } + } + + mib = []_C_int{CTL_HW, HW_MACHINE} + n = unsafe.Sizeof(uname.Machine) + if err := sysctlUname(mib, &uname.Machine[0], &n); err != nil { + return err + } + uname.Machine[unsafe.Sizeof(uname.Machine)-1] = 0 + + return nil +} + +/* + * Exposed directly + */ +//sys Access(path string, mode uint32) (err error) +//sys Adjtime(delta *Timeval, olddelta *Timeval) (err error) +//sys Chdir(path string) (err error) +//sys Chflags(path string, flags int) (err error) +//sys Chmod(path string, mode uint32) (err error) +//sys Chown(path string, uid int, gid int) (err error) +//sys Chroot(path string) (err error) +//sys Close(fd int) (err error) +//sys Dup(fd int) (nfd int, err error) +//sys Dup2(from int, to int) (err error) +//sys Exit(code int) +//sys Fchdir(fd int) (err error) +//sys Fchflags(fd int, flags int) (err error) +//sys Fchmod(fd int, mode uint32) (err error) +//sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Flock(fd int, how int) (err error) +//sys Fpathconf(fd int, name int) (val int, err error) +//sys Fstat(fd int, stat *Stat_t) (err error) +//sys Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) +//sys Fstatfs(fd int, stat *Statfs_t) (err error) +//sys Fsync(fd int) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sys Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) +//sys Getdtablesize() (size int) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (uid int) +//sysnb Getgid() (gid int) +//sysnb Getpgid(pid int) (pgid int, err error) +//sysnb Getpgrp() (pgrp int) +//sysnb Getpid() (pid int) +//sysnb Getppid() (ppid int) +//sys Getpriority(which int, who int) (prio int, err error) +//sysnb Getrlimit(which int, lim *Rlimit) (err error) +//sysnb Getrusage(who int, rusage *Rusage) (err error) +//sysnb Getsid(pid int) (sid int, err error) +//sysnb Gettimeofday(tv *Timeval) (err error) +//sysnb Getuid() (uid int) +//sys Issetugid() (tainted bool) +//sys Kill(pid int, signum syscall.Signal) (err error) +//sys Kqueue() (fd int, err error) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Link(path string, link string) (err error) +//sys Listen(s int, backlog int) (err error) +//sys Lstat(path string, stat *Stat_t) (err error) +//sys Mkdir(path string, mode uint32) (err error) +//sys Mkfifo(path string, mode uint32) (err error) +//sys Mknod(path string, mode uint32, dev int) (err error) +//sys Nanosleep(time *Timespec, leftover *Timespec) (err error) +//sys Open(path string, mode int, perm uint32) (fd int, err error) +//sys Pathconf(path string, name int) (val int, err error) +//sys read(fd int, p []byte) (n int, err error) +//sys Readlink(path string, buf []byte) (n int, err error) +//sys Rename(from string, to string) (err error) +//sys Revoke(path string) (err error) +//sys Rmdir(path string) (err error) +//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK +//sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) +//sysnb Setegid(egid int) (err error) +//sysnb Seteuid(euid int) (err error) +//sysnb Setgid(gid int) (err error) +//sys Setlogin(name string) (err error) +//sysnb Setpgid(pid int, pgid int) (err error) +//sys Setpriority(which int, who int, prio int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) +//sysnb Setresuid(ruid int, euid int, suid int) (err error) +//sysnb Setrlimit(which int, lim *Rlimit) (err error) +//sysnb Setsid() (pid int, err error) +//sysnb Settimeofday(tp *Timeval) (err error) +//sysnb Setuid(uid int) (err error) +//sys Stat(path string, stat *Stat_t) (err error) +//sys Statfs(path string, stat *Statfs_t) (err error) +//sys Symlink(path string, link string) (err error) +//sys Sync() (err error) +//sys Truncate(path string, length int64) (err error) +//sys Umask(newmask int) (oldmask int) +//sys Undelete(path string) (err error) +//sys Unlink(path string) (err error) +//sys Unmount(path string, flags int) (err error) +//sys write(fd int, p []byte) (n int, err error) +//sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) +//sys munmap(addr uintptr, length uintptr) (err error) +//sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ +//sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE +//sys accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) +//sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) + +/* + * Unimplemented + * TODO(jsing): Update this list for DragonFly. + */ +// Profil +// Sigaction +// Sigprocmask +// Getlogin +// Sigpending +// Sigaltstack +// Reboot +// Execve +// Vfork +// Sbrk +// Sstk +// Ovadvise +// Mincore +// Setitimer +// Swapon +// Select +// Sigsuspend +// Readv +// Writev +// Nfssvc +// Getfh +// Quotactl +// Mount +// Csops +// Waitid +// Add_profil +// Kdebug_trace +// Sigreturn +// Atsocket +// Kqueue_from_portset_np +// Kqueue_portset +// Getattrlist +// Setattrlist +// Getdirentriesattr +// Searchfs +// Delete +// Copyfile +// Watchevent +// Waitevent +// Modwatch +// Getxattr +// Fgetxattr +// Setxattr +// Fsetxattr +// Removexattr +// Fremovexattr +// Listxattr +// Flistxattr +// Fsctl +// Initgroups +// Posix_spawn +// Nfsclnt +// Fhopen +// Minherit +// Semsys +// Msgsys +// Shmsys +// Semctl +// Semget +// Semop +// Msgctl +// Msgget +// Msgsnd +// Msgrcv +// Shmat +// Shmctl +// Shmdt +// Shmget +// Shm_open +// Shm_unlink +// Sem_open +// Sem_close +// Sem_unlink +// Sem_wait +// Sem_trywait +// Sem_post +// Sem_getvalue +// Sem_init +// Sem_destroy +// Open_extended +// Umask_extended +// Stat_extended +// Lstat_extended +// Fstat_extended +// Chmod_extended +// Fchmod_extended +// Access_extended +// Settid +// Gettid +// Setsgroups +// Getsgroups +// Setwgroups +// Getwgroups +// Mkfifo_extended +// Mkdir_extended +// Identitysvc +// Shared_region_check_np +// Shared_region_map_np +// __pthread_mutex_destroy +// __pthread_mutex_init +// __pthread_mutex_lock +// __pthread_mutex_trylock +// __pthread_mutex_unlock +// __pthread_cond_init +// __pthread_cond_destroy +// __pthread_cond_broadcast +// __pthread_cond_signal +// Setsid_with_pid +// __pthread_cond_timedwait +// Aio_fsync +// Aio_return +// Aio_suspend +// Aio_cancel +// Aio_error +// Aio_read +// Aio_write +// Lio_listio +// __pthread_cond_wait +// Iopolicysys +// __pthread_kill +// __pthread_sigmask +// __sigwait +// __disable_threadsignal +// __pthread_markcancel +// __pthread_canceled +// __semwait_signal +// Proc_info +// Stat64_extended +// Lstat64_extended +// Fstat64_extended +// __pthread_chdir +// __pthread_fchdir +// Audit +// Auditon +// Getauid +// Setauid +// Getaudit +// Setaudit +// Getaudit_addr +// Setaudit_addr +// Auditctl +// Bsdthread_create +// Bsdthread_terminate +// Stack_snapshot +// Bsdthread_register +// Workq_open +// Workq_ops +// __mac_execve +// __mac_syscall +// __mac_get_file +// __mac_set_file +// __mac_get_link +// __mac_set_link +// __mac_get_proc +// __mac_set_proc +// __mac_get_fd +// __mac_set_fd +// __mac_get_pid +// __mac_get_lcid +// __mac_get_lctx +// __mac_set_lctx +// Setlcid +// Read_nocancel +// Write_nocancel +// Open_nocancel +// Close_nocancel +// Wait4_nocancel +// Recvmsg_nocancel +// Sendmsg_nocancel +// Recvfrom_nocancel +// Accept_nocancel +// Fcntl_nocancel +// Select_nocancel +// Fsync_nocancel +// Connect_nocancel +// Sigsuspend_nocancel +// Readv_nocancel +// Writev_nocancel +// Sendto_nocancel +// Pread_nocancel +// Pwrite_nocancel +// Waitid_nocancel +// Msgsnd_nocancel +// Msgrcv_nocancel +// Sem_wait_nocancel +// Aio_suspend_nocancel +// __sigwait_nocancel +// __semwait_signal_nocancel +// __mac_mount +// __mac_get_mount +// __mac_getfsstat diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go new file mode 100644 index 00000000..9babb31e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go @@ -0,0 +1,52 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build amd64,dragonfly + +package unix + +import ( + "syscall" + "unsafe" +) + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: nsec} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: usec} +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint64(fd) + k.Filter = int16(mode) + k.Flags = uint16(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + var writtenOut uint64 = 0 + _, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(count), 0, uintptr(unsafe.Pointer(&writtenOut)), 0, 0, 0) + + written = int(writtenOut) + + if e1 != 0 { + err = e1 + } + return +} + +func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_freebsd.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_freebsd.go new file mode 100644 index 00000000..085a808c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_freebsd.go @@ -0,0 +1,817 @@ +// Copyright 2009,2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// FreeBSD system calls. +// This file is compiled as ordinary Go code, +// but it is also input to mksyscall, +// which parses the //sys lines and generates system call stubs. +// Note that sometimes we use a lowercase //sys name and wrap +// it in our own nicer implementation, either here or in +// syscall_bsd.go or syscall_unix.go. + +package unix + +import ( + "sync" + "unsafe" +) + +const ( + SYS_FSTAT_FREEBSD12 = 551 // { int fstat(int fd, _Out_ struct stat *sb); } + SYS_FSTATAT_FREEBSD12 = 552 // { int fstatat(int fd, _In_z_ char *path, \ + SYS_GETDIRENTRIES_FREEBSD12 = 554 // { ssize_t getdirentries(int fd, \ + SYS_STATFS_FREEBSD12 = 555 // { int statfs(_In_z_ char *path, \ + SYS_FSTATFS_FREEBSD12 = 556 // { int fstatfs(int fd, \ + SYS_GETFSSTAT_FREEBSD12 = 557 // { int getfsstat( \ + SYS_MKNODAT_FREEBSD12 = 559 // { int mknodat(int fd, _In_z_ char *path, \ +) + +// See https://www.freebsd.org/doc/en_US.ISO8859-1/books/porters-handbook/versions.html. +var ( + osreldateOnce sync.Once + osreldate uint32 +) + +// INO64_FIRST from /usr/src/lib/libc/sys/compat-ino64.h +const _ino64First = 1200031 + +func supportsABI(ver uint32) bool { + osreldateOnce.Do(func() { osreldate, _ = SysctlUint32("kern.osreldate") }) + return osreldate >= ver +} + +// SockaddrDatalink implements the Sockaddr interface for AF_LINK type sockets. +type SockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [46]int8 + raw RawSockaddrDatalink +} + +// Translate "kern.hostname" to []_C_int{0,1,2,3}. +func nametomib(name string) (mib []_C_int, err error) { + const siz = unsafe.Sizeof(mib[0]) + + // NOTE(rsc): It seems strange to set the buffer to have + // size CTL_MAXNAME+2 but use only CTL_MAXNAME + // as the size. I don't know why the +2 is here, but the + // kernel uses +2 for its own implementation of this function. + // I am scared that if we don't include the +2 here, the kernel + // will silently write 2 words farther than we specify + // and we'll get memory corruption. + var buf [CTL_MAXNAME + 2]_C_int + n := uintptr(CTL_MAXNAME) * siz + + p := (*byte)(unsafe.Pointer(&buf[0])) + bytes, err := ByteSliceFromString(name) + if err != nil { + return nil, err + } + + // Magic sysctl: "setting" 0.3 to a string name + // lets you read back the array of integers form. + if err = sysctl([]_C_int{0, 3}, p, &n, &bytes[0], uintptr(len(name))); err != nil { + return nil, err + } + return buf[0 : n/siz], nil +} + +func Pipe(p []int) (err error) { + return Pipe2(p, 0) +} + +//sysnb pipe2(p *[2]_C_int, flags int) (err error) + +func Pipe2(p []int, flags int) error { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err := pipe2(&pp, flags) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return err +} + +func GetsockoptIPMreqn(fd, level, opt int) (*IPMreqn, error) { + var value IPMreqn + vallen := _Socklen(SizeofIPMreqn) + errno := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, errno +} + +func SetsockoptIPMreqn(fd, level, opt int, mreq *IPMreqn) (err error) { + return setsockopt(fd, level, opt, unsafe.Pointer(mreq), unsafe.Sizeof(*mreq)) +} + +func Accept4(fd, flags int) (nfd int, sa Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + nfd, err = accept4(fd, &rsa, &len, flags) + if err != nil { + return + } + if len > SizeofSockaddrAny { + panic("RawSockaddrAny too small") + } + sa, err = anyToSockaddr(fd, &rsa) + if err != nil { + Close(nfd) + nfd = 0 + } + return +} + +const ImplementsGetwd = true + +//sys Getcwd(buf []byte) (n int, err error) = SYS___GETCWD + +func Getwd() (string, error) { + var buf [PathMax]byte + _, err := Getcwd(buf[0:]) + if err != nil { + return "", err + } + n := clen(buf[:]) + if n < 1 { + return "", EINVAL + } + return string(buf[:n]), nil +} + +func Getfsstat(buf []Statfs_t, flags int) (n int, err error) { + var ( + _p0 unsafe.Pointer + bufsize uintptr + oldBuf []statfs_freebsd11_t + needsConvert bool + ) + + if len(buf) > 0 { + if supportsABI(_ino64First) { + _p0 = unsafe.Pointer(&buf[0]) + bufsize = unsafe.Sizeof(Statfs_t{}) * uintptr(len(buf)) + } else { + n := len(buf) + oldBuf = make([]statfs_freebsd11_t, n) + _p0 = unsafe.Pointer(&oldBuf[0]) + bufsize = unsafe.Sizeof(statfs_freebsd11_t{}) * uintptr(n) + needsConvert = true + } + } + var sysno uintptr = SYS_GETFSSTAT + if supportsABI(_ino64First) { + sysno = SYS_GETFSSTAT_FREEBSD12 + } + r0, _, e1 := Syscall(sysno, uintptr(_p0), bufsize, uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = e1 + } + if e1 == 0 && needsConvert { + for i := range oldBuf { + buf[i].convertFrom(&oldBuf[i]) + } + } + return +} + +func setattrlistTimes(path string, times []Timespec, flags int) error { + // used on Darwin for UtimesNano + return ENOSYS +} + +//sys ioctl(fd int, req uint, arg uintptr) (err error) + +// ioctl itself should not be exposed directly, but additional get/set +// functions for specific types are permissible. + +// IoctlSetInt performs an ioctl operation which sets an integer value +// on fd, using the specified request number. +func IoctlSetInt(fd int, req uint, value int) error { + return ioctl(fd, req, uintptr(value)) +} + +func ioctlSetWinsize(fd int, req uint, value *Winsize) error { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +func ioctlSetTermios(fd int, req uint, value *Termios) error { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +// IoctlGetInt performs an ioctl operation which gets an integer value +// from fd, using the specified request number. +func IoctlGetInt(fd int, req uint) (int, error) { + var value int + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return value, err +} + +func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { + var value Winsize + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func IoctlGetTermios(fd int, req uint) (*Termios, error) { + var value Termios + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func Uname(uname *Utsname) error { + mib := []_C_int{CTL_KERN, KERN_OSTYPE} + n := unsafe.Sizeof(uname.Sysname) + if err := sysctl(mib, &uname.Sysname[0], &n, nil, 0); err != nil { + return err + } + + mib = []_C_int{CTL_KERN, KERN_HOSTNAME} + n = unsafe.Sizeof(uname.Nodename) + if err := sysctl(mib, &uname.Nodename[0], &n, nil, 0); err != nil { + return err + } + + mib = []_C_int{CTL_KERN, KERN_OSRELEASE} + n = unsafe.Sizeof(uname.Release) + if err := sysctl(mib, &uname.Release[0], &n, nil, 0); err != nil { + return err + } + + mib = []_C_int{CTL_KERN, KERN_VERSION} + n = unsafe.Sizeof(uname.Version) + if err := sysctl(mib, &uname.Version[0], &n, nil, 0); err != nil { + return err + } + + // The version might have newlines or tabs in it, convert them to + // spaces. + for i, b := range uname.Version { + if b == '\n' || b == '\t' { + if i == len(uname.Version)-1 { + uname.Version[i] = 0 + } else { + uname.Version[i] = ' ' + } + } + } + + mib = []_C_int{CTL_HW, HW_MACHINE} + n = unsafe.Sizeof(uname.Machine) + if err := sysctl(mib, &uname.Machine[0], &n, nil, 0); err != nil { + return err + } + + return nil +} + +func Stat(path string, st *Stat_t) (err error) { + var oldStat stat_freebsd11_t + if supportsABI(_ino64First) { + return fstatat_freebsd12(AT_FDCWD, path, st, 0) + } + err = stat(path, &oldStat) + if err != nil { + return err + } + + st.convertFrom(&oldStat) + return nil +} + +func Lstat(path string, st *Stat_t) (err error) { + var oldStat stat_freebsd11_t + if supportsABI(_ino64First) { + return fstatat_freebsd12(AT_FDCWD, path, st, AT_SYMLINK_NOFOLLOW) + } + err = lstat(path, &oldStat) + if err != nil { + return err + } + + st.convertFrom(&oldStat) + return nil +} + +func Fstat(fd int, st *Stat_t) (err error) { + var oldStat stat_freebsd11_t + if supportsABI(_ino64First) { + return fstat_freebsd12(fd, st) + } + err = fstat(fd, &oldStat) + if err != nil { + return err + } + + st.convertFrom(&oldStat) + return nil +} + +func Fstatat(fd int, path string, st *Stat_t, flags int) (err error) { + var oldStat stat_freebsd11_t + if supportsABI(_ino64First) { + return fstatat_freebsd12(fd, path, st, flags) + } + err = fstatat(fd, path, &oldStat, flags) + if err != nil { + return err + } + + st.convertFrom(&oldStat) + return nil +} + +func Statfs(path string, st *Statfs_t) (err error) { + var oldStatfs statfs_freebsd11_t + if supportsABI(_ino64First) { + return statfs_freebsd12(path, st) + } + err = statfs(path, &oldStatfs) + if err != nil { + return err + } + + st.convertFrom(&oldStatfs) + return nil +} + +func Fstatfs(fd int, st *Statfs_t) (err error) { + var oldStatfs statfs_freebsd11_t + if supportsABI(_ino64First) { + return fstatfs_freebsd12(fd, st) + } + err = fstatfs(fd, &oldStatfs) + if err != nil { + return err + } + + st.convertFrom(&oldStatfs) + return nil +} + +func Getdents(fd int, buf []byte) (n int, err error) { + return Getdirentries(fd, buf, nil) +} + +func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { + if supportsABI(_ino64First) { + return getdirentries_freebsd12(fd, buf, basep) + } + + // The old syscall entries are smaller than the new. Use 1/4 of the original + // buffer size rounded up to DIRBLKSIZ (see /usr/src/lib/libc/sys/getdirentries.c). + oldBufLen := roundup(len(buf)/4, _dirblksiz) + oldBuf := make([]byte, oldBufLen) + n, err = getdirentries(fd, oldBuf, basep) + if err == nil && n > 0 { + n = convertFromDirents11(buf, oldBuf[:n]) + } + return +} + +func Mknod(path string, mode uint32, dev uint64) (err error) { + var oldDev int + if supportsABI(_ino64First) { + return mknodat_freebsd12(AT_FDCWD, path, mode, dev) + } + oldDev = int(dev) + return mknod(path, mode, oldDev) +} + +func Mknodat(fd int, path string, mode uint32, dev uint64) (err error) { + var oldDev int + if supportsABI(_ino64First) { + return mknodat_freebsd12(fd, path, mode, dev) + } + oldDev = int(dev) + return mknodat(fd, path, mode, oldDev) +} + +// round x to the nearest multiple of y, larger or equal to x. +// +// from /usr/include/sys/param.h Macros for counting and rounding. +// #define roundup(x, y) ((((x)+((y)-1))/(y))*(y)) +func roundup(x, y int) int { + return ((x + y - 1) / y) * y +} + +func (s *Stat_t) convertFrom(old *stat_freebsd11_t) { + *s = Stat_t{ + Dev: uint64(old.Dev), + Ino: uint64(old.Ino), + Nlink: uint64(old.Nlink), + Mode: old.Mode, + Uid: old.Uid, + Gid: old.Gid, + Rdev: uint64(old.Rdev), + Atim: old.Atim, + Mtim: old.Mtim, + Ctim: old.Ctim, + Birthtim: old.Birthtim, + Size: old.Size, + Blocks: old.Blocks, + Blksize: old.Blksize, + Flags: old.Flags, + Gen: uint64(old.Gen), + } +} + +func (s *Statfs_t) convertFrom(old *statfs_freebsd11_t) { + *s = Statfs_t{ + Version: _statfsVersion, + Type: old.Type, + Flags: old.Flags, + Bsize: old.Bsize, + Iosize: old.Iosize, + Blocks: old.Blocks, + Bfree: old.Bfree, + Bavail: old.Bavail, + Files: old.Files, + Ffree: old.Ffree, + Syncwrites: old.Syncwrites, + Asyncwrites: old.Asyncwrites, + Syncreads: old.Syncreads, + Asyncreads: old.Asyncreads, + // Spare + Namemax: old.Namemax, + Owner: old.Owner, + Fsid: old.Fsid, + // Charspare + // Fstypename + // Mntfromname + // Mntonname + } + + sl := old.Fstypename[:] + n := clen(*(*[]byte)(unsafe.Pointer(&sl))) + copy(s.Fstypename[:], old.Fstypename[:n]) + + sl = old.Mntfromname[:] + n = clen(*(*[]byte)(unsafe.Pointer(&sl))) + copy(s.Mntfromname[:], old.Mntfromname[:n]) + + sl = old.Mntonname[:] + n = clen(*(*[]byte)(unsafe.Pointer(&sl))) + copy(s.Mntonname[:], old.Mntonname[:n]) +} + +func convertFromDirents11(buf []byte, old []byte) int { + const ( + fixedSize = int(unsafe.Offsetof(Dirent{}.Name)) + oldFixedSize = int(unsafe.Offsetof(dirent_freebsd11{}.Name)) + ) + + dstPos := 0 + srcPos := 0 + for dstPos+fixedSize < len(buf) && srcPos+oldFixedSize < len(old) { + dstDirent := (*Dirent)(unsafe.Pointer(&buf[dstPos])) + srcDirent := (*dirent_freebsd11)(unsafe.Pointer(&old[srcPos])) + + reclen := roundup(fixedSize+int(srcDirent.Namlen)+1, 8) + if dstPos+reclen > len(buf) { + break + } + + dstDirent.Fileno = uint64(srcDirent.Fileno) + dstDirent.Off = 0 + dstDirent.Reclen = uint16(reclen) + dstDirent.Type = srcDirent.Type + dstDirent.Pad0 = 0 + dstDirent.Namlen = uint16(srcDirent.Namlen) + dstDirent.Pad1 = 0 + + copy(dstDirent.Name[:], srcDirent.Name[:srcDirent.Namlen]) + padding := buf[dstPos+fixedSize+int(dstDirent.Namlen) : dstPos+reclen] + for i := range padding { + padding[i] = 0 + } + + dstPos += int(dstDirent.Reclen) + srcPos += int(srcDirent.Reclen) + } + + return dstPos +} + +/* + * Exposed directly + */ +//sys Access(path string, mode uint32) (err error) +//sys Adjtime(delta *Timeval, olddelta *Timeval) (err error) +//sys CapEnter() (err error) +//sys capRightsGet(version int, fd int, rightsp *CapRights) (err error) = SYS___CAP_RIGHTS_GET +//sys capRightsLimit(fd int, rightsp *CapRights) (err error) +//sys Chdir(path string) (err error) +//sys Chflags(path string, flags int) (err error) +//sys Chmod(path string, mode uint32) (err error) +//sys Chown(path string, uid int, gid int) (err error) +//sys Chroot(path string) (err error) +//sys Close(fd int) (err error) +//sys Dup(fd int) (nfd int, err error) +//sys Dup2(from int, to int) (err error) +//sys Exit(code int) +//sys ExtattrGetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) +//sys ExtattrSetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) +//sys ExtattrDeleteFd(fd int, attrnamespace int, attrname string) (err error) +//sys ExtattrListFd(fd int, attrnamespace int, data uintptr, nbytes int) (ret int, err error) +//sys ExtattrGetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) +//sys ExtattrSetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) +//sys ExtattrDeleteFile(file string, attrnamespace int, attrname string) (err error) +//sys ExtattrListFile(file string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) +//sys ExtattrGetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) +//sys ExtattrSetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) +//sys ExtattrDeleteLink(link string, attrnamespace int, attrname string) (err error) +//sys ExtattrListLink(link string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) +//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_POSIX_FADVISE +//sys Faccessat(dirfd int, path string, mode uint32, flags int) (err error) +//sys Fchdir(fd int) (err error) +//sys Fchflags(fd int, flags int) (err error) +//sys Fchmod(fd int, mode uint32) (err error) +//sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) +//sys Flock(fd int, how int) (err error) +//sys Fpathconf(fd int, name int) (val int, err error) +//sys fstat(fd int, stat *stat_freebsd11_t) (err error) +//sys fstat_freebsd12(fd int, stat *Stat_t) (err error) +//sys fstatat(fd int, path string, stat *stat_freebsd11_t, flags int) (err error) +//sys fstatat_freebsd12(fd int, path string, stat *Stat_t, flags int) (err error) +//sys fstatfs(fd int, stat *statfs_freebsd11_t) (err error) +//sys fstatfs_freebsd12(fd int, stat *Statfs_t) (err error) +//sys Fsync(fd int) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sys getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) +//sys getdirentries_freebsd12(fd int, buf []byte, basep *uintptr) (n int, err error) +//sys Getdtablesize() (size int) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (uid int) +//sysnb Getgid() (gid int) +//sysnb Getpgid(pid int) (pgid int, err error) +//sysnb Getpgrp() (pgrp int) +//sysnb Getpid() (pid int) +//sysnb Getppid() (ppid int) +//sys Getpriority(which int, who int) (prio int, err error) +//sysnb Getrlimit(which int, lim *Rlimit) (err error) +//sysnb Getrusage(who int, rusage *Rusage) (err error) +//sysnb Getsid(pid int) (sid int, err error) +//sysnb Gettimeofday(tv *Timeval) (err error) +//sysnb Getuid() (uid int) +//sys Issetugid() (tainted bool) +//sys Kill(pid int, signum syscall.Signal) (err error) +//sys Kqueue() (fd int, err error) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Link(path string, link string) (err error) +//sys Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) +//sys Listen(s int, backlog int) (err error) +//sys lstat(path string, stat *stat_freebsd11_t) (err error) +//sys Mkdir(path string, mode uint32) (err error) +//sys Mkdirat(dirfd int, path string, mode uint32) (err error) +//sys Mkfifo(path string, mode uint32) (err error) +//sys mknod(path string, mode uint32, dev int) (err error) +//sys mknodat(fd int, path string, mode uint32, dev int) (err error) +//sys mknodat_freebsd12(fd int, path string, mode uint32, dev uint64) (err error) +//sys Nanosleep(time *Timespec, leftover *Timespec) (err error) +//sys Open(path string, mode int, perm uint32) (fd int, err error) +//sys Openat(fdat int, path string, mode int, perm uint32) (fd int, err error) +//sys Pathconf(path string, name int) (val int, err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) +//sys read(fd int, p []byte) (n int, err error) +//sys Readlink(path string, buf []byte) (n int, err error) +//sys Readlinkat(dirfd int, path string, buf []byte) (n int, err error) +//sys Rename(from string, to string) (err error) +//sys Renameat(fromfd int, from string, tofd int, to string) (err error) +//sys Revoke(path string) (err error) +//sys Rmdir(path string) (err error) +//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK +//sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) +//sysnb Setegid(egid int) (err error) +//sysnb Seteuid(euid int) (err error) +//sysnb Setgid(gid int) (err error) +//sys Setlogin(name string) (err error) +//sysnb Setpgid(pid int, pgid int) (err error) +//sys Setpriority(which int, who int, prio int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) +//sysnb Setresuid(ruid int, euid int, suid int) (err error) +//sysnb Setrlimit(which int, lim *Rlimit) (err error) +//sysnb Setsid() (pid int, err error) +//sysnb Settimeofday(tp *Timeval) (err error) +//sysnb Setuid(uid int) (err error) +//sys stat(path string, stat *stat_freebsd11_t) (err error) +//sys statfs(path string, stat *statfs_freebsd11_t) (err error) +//sys statfs_freebsd12(path string, stat *Statfs_t) (err error) +//sys Symlink(path string, link string) (err error) +//sys Symlinkat(oldpath string, newdirfd int, newpath string) (err error) +//sys Sync() (err error) +//sys Truncate(path string, length int64) (err error) +//sys Umask(newmask int) (oldmask int) +//sys Undelete(path string) (err error) +//sys Unlink(path string) (err error) +//sys Unlinkat(dirfd int, path string, flags int) (err error) +//sys Unmount(path string, flags int) (err error) +//sys write(fd int, p []byte) (n int, err error) +//sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) +//sys munmap(addr uintptr, length uintptr) (err error) +//sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ +//sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE +//sys accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) +//sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) + +/* + * Unimplemented + */ +// Profil +// Sigaction +// Sigprocmask +// Getlogin +// Sigpending +// Sigaltstack +// Ioctl +// Reboot +// Execve +// Vfork +// Sbrk +// Sstk +// Ovadvise +// Mincore +// Setitimer +// Swapon +// Select +// Sigsuspend +// Readv +// Writev +// Nfssvc +// Getfh +// Quotactl +// Mount +// Csops +// Waitid +// Add_profil +// Kdebug_trace +// Sigreturn +// Atsocket +// Kqueue_from_portset_np +// Kqueue_portset +// Getattrlist +// Setattrlist +// Getdents +// Getdirentriesattr +// Searchfs +// Delete +// Copyfile +// Watchevent +// Waitevent +// Modwatch +// Fsctl +// Initgroups +// Posix_spawn +// Nfsclnt +// Fhopen +// Minherit +// Semsys +// Msgsys +// Shmsys +// Semctl +// Semget +// Semop +// Msgctl +// Msgget +// Msgsnd +// Msgrcv +// Shmat +// Shmctl +// Shmdt +// Shmget +// Shm_open +// Shm_unlink +// Sem_open +// Sem_close +// Sem_unlink +// Sem_wait +// Sem_trywait +// Sem_post +// Sem_getvalue +// Sem_init +// Sem_destroy +// Open_extended +// Umask_extended +// Stat_extended +// Lstat_extended +// Fstat_extended +// Chmod_extended +// Fchmod_extended +// Access_extended +// Settid +// Gettid +// Setsgroups +// Getsgroups +// Setwgroups +// Getwgroups +// Mkfifo_extended +// Mkdir_extended +// Identitysvc +// Shared_region_check_np +// Shared_region_map_np +// __pthread_mutex_destroy +// __pthread_mutex_init +// __pthread_mutex_lock +// __pthread_mutex_trylock +// __pthread_mutex_unlock +// __pthread_cond_init +// __pthread_cond_destroy +// __pthread_cond_broadcast +// __pthread_cond_signal +// Setsid_with_pid +// __pthread_cond_timedwait +// Aio_fsync +// Aio_return +// Aio_suspend +// Aio_cancel +// Aio_error +// Aio_read +// Aio_write +// Lio_listio +// __pthread_cond_wait +// Iopolicysys +// __pthread_kill +// __pthread_sigmask +// __sigwait +// __disable_threadsignal +// __pthread_markcancel +// __pthread_canceled +// __semwait_signal +// Proc_info +// Stat64_extended +// Lstat64_extended +// Fstat64_extended +// __pthread_chdir +// __pthread_fchdir +// Audit +// Auditon +// Getauid +// Setauid +// Getaudit +// Setaudit +// Getaudit_addr +// Setaudit_addr +// Auditctl +// Bsdthread_create +// Bsdthread_terminate +// Stack_snapshot +// Bsdthread_register +// Workq_open +// Workq_ops +// __mac_execve +// __mac_syscall +// __mac_get_file +// __mac_set_file +// __mac_get_link +// __mac_set_link +// __mac_get_proc +// __mac_set_proc +// __mac_get_fd +// __mac_set_fd +// __mac_get_pid +// __mac_get_lcid +// __mac_get_lctx +// __mac_set_lctx +// Setlcid +// Read_nocancel +// Write_nocancel +// Open_nocancel +// Close_nocancel +// Wait4_nocancel +// Recvmsg_nocancel +// Sendmsg_nocancel +// Recvfrom_nocancel +// Accept_nocancel +// Fcntl_nocancel +// Select_nocancel +// Fsync_nocancel +// Connect_nocancel +// Sigsuspend_nocancel +// Readv_nocancel +// Writev_nocancel +// Sendto_nocancel +// Pread_nocancel +// Pwrite_nocancel +// Waitid_nocancel +// Poll_nocancel +// Msgsnd_nocancel +// Msgrcv_nocancel +// Sem_wait_nocancel +// Aio_suspend_nocancel +// __sigwait_nocancel +// __semwait_signal_nocancel +// __mac_mount +// __mac_get_mount +// __mac_getfsstat diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go new file mode 100644 index 00000000..21e03958 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go @@ -0,0 +1,52 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build 386,freebsd + +package unix + +import ( + "syscall" + "unsafe" +) + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: int32(sec), Nsec: int32(nsec)} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: int32(sec), Usec: int32(usec)} +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint32(fd) + k.Filter = int16(mode) + k.Flags = uint16(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint32(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + var writtenOut uint64 = 0 + _, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr((*offset)>>32), uintptr(count), 0, uintptr(unsafe.Pointer(&writtenOut)), 0, 0) + + written = int(writtenOut) + + if e1 != 0 { + err = e1 + } + return +} + +func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go new file mode 100644 index 00000000..9c945a65 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go @@ -0,0 +1,52 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build amd64,freebsd + +package unix + +import ( + "syscall" + "unsafe" +) + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: nsec} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: usec} +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint64(fd) + k.Filter = int16(mode) + k.Flags = uint16(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + var writtenOut uint64 = 0 + _, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(count), 0, uintptr(unsafe.Pointer(&writtenOut)), 0, 0, 0) + + written = int(writtenOut) + + if e1 != 0 { + err = e1 + } + return +} + +func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go new file mode 100644 index 00000000..5cd6243f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go @@ -0,0 +1,52 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build arm,freebsd + +package unix + +import ( + "syscall" + "unsafe" +) + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: int32(nsec)} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: int32(usec)} +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint32(fd) + k.Filter = int16(mode) + k.Flags = uint16(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint32(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + var writtenOut uint64 = 0 + _, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr((*offset)>>32), uintptr(count), 0, uintptr(unsafe.Pointer(&writtenOut)), 0, 0) + + written = int(writtenOut) + + if e1 != 0 { + err = e1 + } + return +} + +func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_linux.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_linux.go new file mode 100644 index 00000000..bfa20a97 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_linux.go @@ -0,0 +1,1628 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Linux system calls. +// This file is compiled as ordinary Go code, +// but it is also input to mksyscall, +// which parses the //sys lines and generates system call stubs. +// Note that sometimes we use a lowercase //sys name and +// wrap it in our own nicer implementation. + +package unix + +import ( + "syscall" + "unsafe" +) + +/* + * Wrapped + */ + +func Access(path string, mode uint32) (err error) { + return Faccessat(AT_FDCWD, path, mode, 0) +} + +func Chmod(path string, mode uint32) (err error) { + return Fchmodat(AT_FDCWD, path, mode, 0) +} + +func Chown(path string, uid int, gid int) (err error) { + return Fchownat(AT_FDCWD, path, uid, gid, 0) +} + +func Creat(path string, mode uint32) (fd int, err error) { + return Open(path, O_CREAT|O_WRONLY|O_TRUNC, mode) +} + +//sys fchmodat(dirfd int, path string, mode uint32) (err error) + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + // Linux fchmodat doesn't support the flags parameter. Mimick glibc's behavior + // and check the flags. Otherwise the mode would be applied to the symlink + // destination which is not what the user expects. + if flags&^AT_SYMLINK_NOFOLLOW != 0 { + return EINVAL + } else if flags&AT_SYMLINK_NOFOLLOW != 0 { + return EOPNOTSUPP + } + return fchmodat(dirfd, path, mode) +} + +//sys ioctl(fd int, req uint, arg uintptr) (err error) + +// ioctl itself should not be exposed directly, but additional get/set +// functions for specific types are permissible. + +// IoctlSetInt performs an ioctl operation which sets an integer value +// on fd, using the specified request number. +func IoctlSetInt(fd int, req uint, value int) error { + return ioctl(fd, req, uintptr(value)) +} + +func ioctlSetWinsize(fd int, req uint, value *Winsize) error { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +func ioctlSetTermios(fd int, req uint, value *Termios) error { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +// IoctlGetInt performs an ioctl operation which gets an integer value +// from fd, using the specified request number. +func IoctlGetInt(fd int, req uint) (int, error) { + var value int + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return value, err +} + +func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { + var value Winsize + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func IoctlGetTermios(fd int, req uint) (*Termios, error) { + var value Termios + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +//sys Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) + +func Link(oldpath string, newpath string) (err error) { + return Linkat(AT_FDCWD, oldpath, AT_FDCWD, newpath, 0) +} + +func Mkdir(path string, mode uint32) (err error) { + return Mkdirat(AT_FDCWD, path, mode) +} + +func Mknod(path string, mode uint32, dev int) (err error) { + return Mknodat(AT_FDCWD, path, mode, dev) +} + +func Open(path string, mode int, perm uint32) (fd int, err error) { + return openat(AT_FDCWD, path, mode|O_LARGEFILE, perm) +} + +//sys openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) + +func Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + return openat(dirfd, path, flags|O_LARGEFILE, mode) +} + +//sys ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) + +func Ppoll(fds []PollFd, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + if len(fds) == 0 { + return ppoll(nil, 0, timeout, sigmask) + } + return ppoll(&fds[0], len(fds), timeout, sigmask) +} + +//sys Readlinkat(dirfd int, path string, buf []byte) (n int, err error) + +func Readlink(path string, buf []byte) (n int, err error) { + return Readlinkat(AT_FDCWD, path, buf) +} + +func Rename(oldpath string, newpath string) (err error) { + return Renameat(AT_FDCWD, oldpath, AT_FDCWD, newpath) +} + +func Rmdir(path string) error { + return Unlinkat(AT_FDCWD, path, AT_REMOVEDIR) +} + +//sys Symlinkat(oldpath string, newdirfd int, newpath string) (err error) + +func Symlink(oldpath string, newpath string) (err error) { + return Symlinkat(oldpath, AT_FDCWD, newpath) +} + +func Unlink(path string) error { + return Unlinkat(AT_FDCWD, path, 0) +} + +//sys Unlinkat(dirfd int, path string, flags int) (err error) + +func Utimes(path string, tv []Timeval) error { + if tv == nil { + err := utimensat(AT_FDCWD, path, nil, 0) + if err != ENOSYS { + return err + } + return utimes(path, nil) + } + if len(tv) != 2 { + return EINVAL + } + var ts [2]Timespec + ts[0] = NsecToTimespec(TimevalToNsec(tv[0])) + ts[1] = NsecToTimespec(TimevalToNsec(tv[1])) + err := utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0) + if err != ENOSYS { + return err + } + return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) +} + +//sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) + +func UtimesNano(path string, ts []Timespec) error { + if ts == nil { + err := utimensat(AT_FDCWD, path, nil, 0) + if err != ENOSYS { + return err + } + return utimes(path, nil) + } + if len(ts) != 2 { + return EINVAL + } + err := utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0) + if err != ENOSYS { + return err + } + // If the utimensat syscall isn't available (utimensat was added to Linux + // in 2.6.22, Released, 8 July 2007) then fall back to utimes + var tv [2]Timeval + for i := 0; i < 2; i++ { + tv[i] = NsecToTimeval(TimespecToNsec(ts[i])) + } + return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) +} + +func UtimesNanoAt(dirfd int, path string, ts []Timespec, flags int) error { + if ts == nil { + return utimensat(dirfd, path, nil, flags) + } + if len(ts) != 2 { + return EINVAL + } + return utimensat(dirfd, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), flags) +} + +func Futimesat(dirfd int, path string, tv []Timeval) error { + if tv == nil { + return futimesat(dirfd, path, nil) + } + if len(tv) != 2 { + return EINVAL + } + return futimesat(dirfd, path, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) +} + +func Futimes(fd int, tv []Timeval) (err error) { + // Believe it or not, this is the best we can do on Linux + // (and is what glibc does). + return Utimes("/proc/self/fd/"+itoa(fd), tv) +} + +const ImplementsGetwd = true + +//sys Getcwd(buf []byte) (n int, err error) + +func Getwd() (wd string, err error) { + var buf [PathMax]byte + n, err := Getcwd(buf[0:]) + if err != nil { + return "", err + } + // Getcwd returns the number of bytes written to buf, including the NUL. + if n < 1 || n > len(buf) || buf[n-1] != 0 { + return "", EINVAL + } + return string(buf[0 : n-1]), nil +} + +func Getgroups() (gids []int, err error) { + n, err := getgroups(0, nil) + if err != nil { + return nil, err + } + if n == 0 { + return nil, nil + } + + // Sanity check group count. Max is 1<<16 on Linux. + if n < 0 || n > 1<<20 { + return nil, EINVAL + } + + a := make([]_Gid_t, n) + n, err = getgroups(n, &a[0]) + if err != nil { + return nil, err + } + gids = make([]int, n) + for i, v := range a[0:n] { + gids[i] = int(v) + } + return +} + +func Setgroups(gids []int) (err error) { + if len(gids) == 0 { + return setgroups(0, nil) + } + + a := make([]_Gid_t, len(gids)) + for i, v := range gids { + a[i] = _Gid_t(v) + } + return setgroups(len(a), &a[0]) +} + +type WaitStatus uint32 + +// Wait status is 7 bits at bottom, either 0 (exited), +// 0x7F (stopped), or a signal number that caused an exit. +// The 0x80 bit is whether there was a core dump. +// An extra number (exit code, signal causing a stop) +// is in the high bits. At least that's the idea. +// There are various irregularities. For example, the +// "continued" status is 0xFFFF, distinguishing itself +// from stopped via the core dump bit. + +const ( + mask = 0x7F + core = 0x80 + exited = 0x00 + stopped = 0x7F + shift = 8 +) + +func (w WaitStatus) Exited() bool { return w&mask == exited } + +func (w WaitStatus) Signaled() bool { return w&mask != stopped && w&mask != exited } + +func (w WaitStatus) Stopped() bool { return w&0xFF == stopped } + +func (w WaitStatus) Continued() bool { return w == 0xFFFF } + +func (w WaitStatus) CoreDump() bool { return w.Signaled() && w&core != 0 } + +func (w WaitStatus) ExitStatus() int { + if !w.Exited() { + return -1 + } + return int(w>>shift) & 0xFF +} + +func (w WaitStatus) Signal() syscall.Signal { + if !w.Signaled() { + return -1 + } + return syscall.Signal(w & mask) +} + +func (w WaitStatus) StopSignal() syscall.Signal { + if !w.Stopped() { + return -1 + } + return syscall.Signal(w>>shift) & 0xFF +} + +func (w WaitStatus) TrapCause() int { + if w.StopSignal() != SIGTRAP { + return -1 + } + return int(w>>shift) >> 8 +} + +//sys wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) + +func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, err error) { + var status _C_int + wpid, err = wait4(pid, &status, options, rusage) + if wstatus != nil { + *wstatus = WaitStatus(status) + } + return +} + +func Mkfifo(path string, mode uint32) error { + return Mknod(path, mode|S_IFIFO, 0) +} + +func Mkfifoat(dirfd int, path string, mode uint32) error { + return Mknodat(dirfd, path, mode|S_IFIFO, 0) +} + +func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, _Socklen, error) { + if sa.Port < 0 || sa.Port > 0xFFFF { + return nil, 0, EINVAL + } + sa.raw.Family = AF_INET + p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) + p[0] = byte(sa.Port >> 8) + p[1] = byte(sa.Port) + for i := 0; i < len(sa.Addr); i++ { + sa.raw.Addr[i] = sa.Addr[i] + } + return unsafe.Pointer(&sa.raw), SizeofSockaddrInet4, nil +} + +func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, _Socklen, error) { + if sa.Port < 0 || sa.Port > 0xFFFF { + return nil, 0, EINVAL + } + sa.raw.Family = AF_INET6 + p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) + p[0] = byte(sa.Port >> 8) + p[1] = byte(sa.Port) + sa.raw.Scope_id = sa.ZoneId + for i := 0; i < len(sa.Addr); i++ { + sa.raw.Addr[i] = sa.Addr[i] + } + return unsafe.Pointer(&sa.raw), SizeofSockaddrInet6, nil +} + +func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, _Socklen, error) { + name := sa.Name + n := len(name) + if n >= len(sa.raw.Path) { + return nil, 0, EINVAL + } + sa.raw.Family = AF_UNIX + for i := 0; i < n; i++ { + sa.raw.Path[i] = int8(name[i]) + } + // length is family (uint16), name, NUL. + sl := _Socklen(2) + if n > 0 { + sl += _Socklen(n) + 1 + } + if sa.raw.Path[0] == '@' { + sa.raw.Path[0] = 0 + // Don't count trailing NUL for abstract address. + sl-- + } + + return unsafe.Pointer(&sa.raw), sl, nil +} + +// SockaddrLinklayer implements the Sockaddr interface for AF_PACKET type sockets. +type SockaddrLinklayer struct { + Protocol uint16 + Ifindex int + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]byte + raw RawSockaddrLinklayer +} + +func (sa *SockaddrLinklayer) sockaddr() (unsafe.Pointer, _Socklen, error) { + if sa.Ifindex < 0 || sa.Ifindex > 0x7fffffff { + return nil, 0, EINVAL + } + sa.raw.Family = AF_PACKET + sa.raw.Protocol = sa.Protocol + sa.raw.Ifindex = int32(sa.Ifindex) + sa.raw.Hatype = sa.Hatype + sa.raw.Pkttype = sa.Pkttype + sa.raw.Halen = sa.Halen + for i := 0; i < len(sa.Addr); i++ { + sa.raw.Addr[i] = sa.Addr[i] + } + return unsafe.Pointer(&sa.raw), SizeofSockaddrLinklayer, nil +} + +// SockaddrNetlink implements the Sockaddr interface for AF_NETLINK type sockets. +type SockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 + raw RawSockaddrNetlink +} + +func (sa *SockaddrNetlink) sockaddr() (unsafe.Pointer, _Socklen, error) { + sa.raw.Family = AF_NETLINK + sa.raw.Pad = sa.Pad + sa.raw.Pid = sa.Pid + sa.raw.Groups = sa.Groups + return unsafe.Pointer(&sa.raw), SizeofSockaddrNetlink, nil +} + +// SockaddrHCI implements the Sockaddr interface for AF_BLUETOOTH type sockets +// using the HCI protocol. +type SockaddrHCI struct { + Dev uint16 + Channel uint16 + raw RawSockaddrHCI +} + +func (sa *SockaddrHCI) sockaddr() (unsafe.Pointer, _Socklen, error) { + sa.raw.Family = AF_BLUETOOTH + sa.raw.Dev = sa.Dev + sa.raw.Channel = sa.Channel + return unsafe.Pointer(&sa.raw), SizeofSockaddrHCI, nil +} + +// SockaddrL2 implements the Sockaddr interface for AF_BLUETOOTH type sockets +// using the L2CAP protocol. +type SockaddrL2 struct { + PSM uint16 + CID uint16 + Addr [6]uint8 + AddrType uint8 + raw RawSockaddrL2 +} + +func (sa *SockaddrL2) sockaddr() (unsafe.Pointer, _Socklen, error) { + sa.raw.Family = AF_BLUETOOTH + psm := (*[2]byte)(unsafe.Pointer(&sa.raw.Psm)) + psm[0] = byte(sa.PSM) + psm[1] = byte(sa.PSM >> 8) + for i := 0; i < len(sa.Addr); i++ { + sa.raw.Bdaddr[i] = sa.Addr[len(sa.Addr)-1-i] + } + cid := (*[2]byte)(unsafe.Pointer(&sa.raw.Cid)) + cid[0] = byte(sa.CID) + cid[1] = byte(sa.CID >> 8) + sa.raw.Bdaddr_type = sa.AddrType + return unsafe.Pointer(&sa.raw), SizeofSockaddrL2, nil +} + +// SockaddrRFCOMM implements the Sockaddr interface for AF_BLUETOOTH type sockets +// using the RFCOMM protocol. +// +// Server example: +// +// fd, _ := Socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM) +// _ = unix.Bind(fd, &unix.SockaddrRFCOMM{ +// Channel: 1, +// Addr: [6]uint8{0, 0, 0, 0, 0, 0}, // BDADDR_ANY or 00:00:00:00:00:00 +// }) +// _ = Listen(fd, 1) +// nfd, sa, _ := Accept(fd) +// fmt.Printf("conn addr=%v fd=%d", sa.(*unix.SockaddrRFCOMM).Addr, nfd) +// Read(nfd, buf) +// +// Client example: +// +// fd, _ := Socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM) +// _ = Connect(fd, &SockaddrRFCOMM{ +// Channel: 1, +// Addr: [6]byte{0x11, 0x22, 0x33, 0xaa, 0xbb, 0xcc}, // CC:BB:AA:33:22:11 +// }) +// Write(fd, []byte(`hello`)) +type SockaddrRFCOMM struct { + // Addr represents a bluetooth address, byte ordering is little-endian. + Addr [6]uint8 + + // Channel is a designated bluetooth channel, only 1-30 are available for use. + // Since Linux 2.6.7 and further zero value is the first available channel. + Channel uint8 + + raw RawSockaddrRFCOMM +} + +func (sa *SockaddrRFCOMM) sockaddr() (unsafe.Pointer, _Socklen, error) { + sa.raw.Family = AF_BLUETOOTH + sa.raw.Channel = sa.Channel + sa.raw.Bdaddr = sa.Addr + return unsafe.Pointer(&sa.raw), SizeofSockaddrRFCOMM, nil +} + +// SockaddrCAN implements the Sockaddr interface for AF_CAN type sockets. +// The RxID and TxID fields are used for transport protocol addressing in +// (CAN_TP16, CAN_TP20, CAN_MCNET, and CAN_ISOTP), they can be left with +// zero values for CAN_RAW and CAN_BCM sockets as they have no meaning. +// +// The SockaddrCAN struct must be bound to the socket file descriptor +// using Bind before the CAN socket can be used. +// +// // Read one raw CAN frame +// fd, _ := Socket(AF_CAN, SOCK_RAW, CAN_RAW) +// addr := &SockaddrCAN{Ifindex: index} +// Bind(fd, addr) +// frame := make([]byte, 16) +// Read(fd, frame) +// +// The full SocketCAN documentation can be found in the linux kernel +// archives at: https://www.kernel.org/doc/Documentation/networking/can.txt +type SockaddrCAN struct { + Ifindex int + RxID uint32 + TxID uint32 + raw RawSockaddrCAN +} + +func (sa *SockaddrCAN) sockaddr() (unsafe.Pointer, _Socklen, error) { + if sa.Ifindex < 0 || sa.Ifindex > 0x7fffffff { + return nil, 0, EINVAL + } + sa.raw.Family = AF_CAN + sa.raw.Ifindex = int32(sa.Ifindex) + rx := (*[4]byte)(unsafe.Pointer(&sa.RxID)) + for i := 0; i < 4; i++ { + sa.raw.Addr[i] = rx[i] + } + tx := (*[4]byte)(unsafe.Pointer(&sa.TxID)) + for i := 0; i < 4; i++ { + sa.raw.Addr[i+4] = tx[i] + } + return unsafe.Pointer(&sa.raw), SizeofSockaddrCAN, nil +} + +// SockaddrALG implements the Sockaddr interface for AF_ALG type sockets. +// SockaddrALG enables userspace access to the Linux kernel's cryptography +// subsystem. The Type and Name fields specify which type of hash or cipher +// should be used with a given socket. +// +// To create a file descriptor that provides access to a hash or cipher, both +// Bind and Accept must be used. Once the setup process is complete, input +// data can be written to the socket, processed by the kernel, and then read +// back as hash output or ciphertext. +// +// Here is an example of using an AF_ALG socket with SHA1 hashing. +// The initial socket setup process is as follows: +// +// // Open a socket to perform SHA1 hashing. +// fd, _ := unix.Socket(unix.AF_ALG, unix.SOCK_SEQPACKET, 0) +// addr := &unix.SockaddrALG{Type: "hash", Name: "sha1"} +// unix.Bind(fd, addr) +// // Note: unix.Accept does not work at this time; must invoke accept() +// // manually using unix.Syscall. +// hashfd, _, _ := unix.Syscall(unix.SYS_ACCEPT, uintptr(fd), 0, 0) +// +// Once a file descriptor has been returned from Accept, it may be used to +// perform SHA1 hashing. The descriptor is not safe for concurrent use, but +// may be re-used repeatedly with subsequent Write and Read operations. +// +// When hashing a small byte slice or string, a single Write and Read may +// be used: +// +// // Assume hashfd is already configured using the setup process. +// hash := os.NewFile(hashfd, "sha1") +// // Hash an input string and read the results. Each Write discards +// // previous hash state. Read always reads the current state. +// b := make([]byte, 20) +// for i := 0; i < 2; i++ { +// io.WriteString(hash, "Hello, world.") +// hash.Read(b) +// fmt.Println(hex.EncodeToString(b)) +// } +// // Output: +// // 2ae01472317d1935a84797ec1983ae243fc6aa28 +// // 2ae01472317d1935a84797ec1983ae243fc6aa28 +// +// For hashing larger byte slices, or byte streams such as those read from +// a file or socket, use Sendto with MSG_MORE to instruct the kernel to update +// the hash digest instead of creating a new one for a given chunk and finalizing it. +// +// // Assume hashfd and addr are already configured using the setup process. +// hash := os.NewFile(hashfd, "sha1") +// // Hash the contents of a file. +// f, _ := os.Open("/tmp/linux-4.10-rc7.tar.xz") +// b := make([]byte, 4096) +// for { +// n, err := f.Read(b) +// if err == io.EOF { +// break +// } +// unix.Sendto(hashfd, b[:n], unix.MSG_MORE, addr) +// } +// hash.Read(b) +// fmt.Println(hex.EncodeToString(b)) +// // Output: 85cdcad0c06eef66f805ecce353bec9accbeecc5 +// +// For more information, see: http://www.chronox.de/crypto-API/crypto/userspace-if.html. +type SockaddrALG struct { + Type string + Name string + Feature uint32 + Mask uint32 + raw RawSockaddrALG +} + +func (sa *SockaddrALG) sockaddr() (unsafe.Pointer, _Socklen, error) { + // Leave room for NUL byte terminator. + if len(sa.Type) > 13 { + return nil, 0, EINVAL + } + if len(sa.Name) > 63 { + return nil, 0, EINVAL + } + + sa.raw.Family = AF_ALG + sa.raw.Feat = sa.Feature + sa.raw.Mask = sa.Mask + + typ, err := ByteSliceFromString(sa.Type) + if err != nil { + return nil, 0, err + } + name, err := ByteSliceFromString(sa.Name) + if err != nil { + return nil, 0, err + } + + copy(sa.raw.Type[:], typ) + copy(sa.raw.Name[:], name) + + return unsafe.Pointer(&sa.raw), SizeofSockaddrALG, nil +} + +// SockaddrVM implements the Sockaddr interface for AF_VSOCK type sockets. +// SockaddrVM provides access to Linux VM sockets: a mechanism that enables +// bidirectional communication between a hypervisor and its guest virtual +// machines. +type SockaddrVM struct { + // CID and Port specify a context ID and port address for a VM socket. + // Guests have a unique CID, and hosts may have a well-known CID of: + // - VMADDR_CID_HYPERVISOR: refers to the hypervisor process. + // - VMADDR_CID_HOST: refers to other processes on the host. + CID uint32 + Port uint32 + raw RawSockaddrVM +} + +func (sa *SockaddrVM) sockaddr() (unsafe.Pointer, _Socklen, error) { + sa.raw.Family = AF_VSOCK + sa.raw.Port = sa.Port + sa.raw.Cid = sa.CID + + return unsafe.Pointer(&sa.raw), SizeofSockaddrVM, nil +} + +type SockaddrXDP struct { + Flags uint16 + Ifindex uint32 + QueueID uint32 + SharedUmemFD uint32 + raw RawSockaddrXDP +} + +func (sa *SockaddrXDP) sockaddr() (unsafe.Pointer, _Socklen, error) { + sa.raw.Family = AF_XDP + sa.raw.Flags = sa.Flags + sa.raw.Ifindex = sa.Ifindex + sa.raw.Queue_id = sa.QueueID + sa.raw.Shared_umem_fd = sa.SharedUmemFD + + return unsafe.Pointer(&sa.raw), SizeofSockaddrXDP, nil +} + +func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) { + switch rsa.Addr.Family { + case AF_NETLINK: + pp := (*RawSockaddrNetlink)(unsafe.Pointer(rsa)) + sa := new(SockaddrNetlink) + sa.Family = pp.Family + sa.Pad = pp.Pad + sa.Pid = pp.Pid + sa.Groups = pp.Groups + return sa, nil + + case AF_PACKET: + pp := (*RawSockaddrLinklayer)(unsafe.Pointer(rsa)) + sa := new(SockaddrLinklayer) + sa.Protocol = pp.Protocol + sa.Ifindex = int(pp.Ifindex) + sa.Hatype = pp.Hatype + sa.Pkttype = pp.Pkttype + sa.Halen = pp.Halen + for i := 0; i < len(sa.Addr); i++ { + sa.Addr[i] = pp.Addr[i] + } + return sa, nil + + case AF_UNIX: + pp := (*RawSockaddrUnix)(unsafe.Pointer(rsa)) + sa := new(SockaddrUnix) + if pp.Path[0] == 0 { + // "Abstract" Unix domain socket. + // Rewrite leading NUL as @ for textual display. + // (This is the standard convention.) + // Not friendly to overwrite in place, + // but the callers below don't care. + pp.Path[0] = '@' + } + + // Assume path ends at NUL. + // This is not technically the Linux semantics for + // abstract Unix domain sockets--they are supposed + // to be uninterpreted fixed-size binary blobs--but + // everyone uses this convention. + n := 0 + for n < len(pp.Path) && pp.Path[n] != 0 { + n++ + } + bytes := (*[10000]byte)(unsafe.Pointer(&pp.Path[0]))[0:n] + sa.Name = string(bytes) + return sa, nil + + case AF_INET: + pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa)) + sa := new(SockaddrInet4) + p := (*[2]byte)(unsafe.Pointer(&pp.Port)) + sa.Port = int(p[0])<<8 + int(p[1]) + for i := 0; i < len(sa.Addr); i++ { + sa.Addr[i] = pp.Addr[i] + } + return sa, nil + + case AF_INET6: + pp := (*RawSockaddrInet6)(unsafe.Pointer(rsa)) + sa := new(SockaddrInet6) + p := (*[2]byte)(unsafe.Pointer(&pp.Port)) + sa.Port = int(p[0])<<8 + int(p[1]) + sa.ZoneId = pp.Scope_id + for i := 0; i < len(sa.Addr); i++ { + sa.Addr[i] = pp.Addr[i] + } + return sa, nil + + case AF_VSOCK: + pp := (*RawSockaddrVM)(unsafe.Pointer(rsa)) + sa := &SockaddrVM{ + CID: pp.Cid, + Port: pp.Port, + } + return sa, nil + case AF_BLUETOOTH: + proto, err := GetsockoptInt(fd, SOL_SOCKET, SO_PROTOCOL) + if err != nil { + return nil, err + } + // only BTPROTO_L2CAP and BTPROTO_RFCOMM can accept connections + switch proto { + case BTPROTO_L2CAP: + pp := (*RawSockaddrL2)(unsafe.Pointer(rsa)) + sa := &SockaddrL2{ + PSM: pp.Psm, + CID: pp.Cid, + Addr: pp.Bdaddr, + AddrType: pp.Bdaddr_type, + } + return sa, nil + case BTPROTO_RFCOMM: + pp := (*RawSockaddrRFCOMM)(unsafe.Pointer(rsa)) + sa := &SockaddrRFCOMM{ + Channel: pp.Channel, + Addr: pp.Bdaddr, + } + return sa, nil + } + case AF_XDP: + pp := (*RawSockaddrXDP)(unsafe.Pointer(rsa)) + sa := &SockaddrXDP{ + Flags: pp.Flags, + Ifindex: pp.Ifindex, + QueueID: pp.Queue_id, + SharedUmemFD: pp.Shared_umem_fd, + } + return sa, nil + } + return nil, EAFNOSUPPORT +} + +func Accept(fd int) (nfd int, sa Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + nfd, err = accept(fd, &rsa, &len) + if err != nil { + return + } + sa, err = anyToSockaddr(fd, &rsa) + if err != nil { + Close(nfd) + nfd = 0 + } + return +} + +func Accept4(fd int, flags int) (nfd int, sa Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + nfd, err = accept4(fd, &rsa, &len, flags) + if err != nil { + return + } + if len > SizeofSockaddrAny { + panic("RawSockaddrAny too small") + } + sa, err = anyToSockaddr(fd, &rsa) + if err != nil { + Close(nfd) + nfd = 0 + } + return +} + +func Getsockname(fd int) (sa Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + if err = getsockname(fd, &rsa, &len); err != nil { + return + } + return anyToSockaddr(fd, &rsa) +} + +func GetsockoptIPMreqn(fd, level, opt int) (*IPMreqn, error) { + var value IPMreqn + vallen := _Socklen(SizeofIPMreqn) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} + +func GetsockoptUcred(fd, level, opt int) (*Ucred, error) { + var value Ucred + vallen := _Socklen(SizeofUcred) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} + +func GetsockoptTCPInfo(fd, level, opt int) (*TCPInfo, error) { + var value TCPInfo + vallen := _Socklen(SizeofTCPInfo) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} + +// GetsockoptString returns the string value of the socket option opt for the +// socket associated with fd at the given socket level. +func GetsockoptString(fd, level, opt int) (string, error) { + buf := make([]byte, 256) + vallen := _Socklen(len(buf)) + err := getsockopt(fd, level, opt, unsafe.Pointer(&buf[0]), &vallen) + if err != nil { + if err == ERANGE { + buf = make([]byte, vallen) + err = getsockopt(fd, level, opt, unsafe.Pointer(&buf[0]), &vallen) + } + if err != nil { + return "", err + } + } + return string(buf[:vallen-1]), nil +} + +func SetsockoptIPMreqn(fd, level, opt int, mreq *IPMreqn) (err error) { + return setsockopt(fd, level, opt, unsafe.Pointer(mreq), unsafe.Sizeof(*mreq)) +} + +// Keyctl Commands (http://man7.org/linux/man-pages/man2/keyctl.2.html) + +// KeyctlInt calls keyctl commands in which each argument is an int. +// These commands are KEYCTL_REVOKE, KEYCTL_CHOWN, KEYCTL_CLEAR, KEYCTL_LINK, +// KEYCTL_UNLINK, KEYCTL_NEGATE, KEYCTL_SET_REQKEY_KEYRING, KEYCTL_SET_TIMEOUT, +// KEYCTL_ASSUME_AUTHORITY, KEYCTL_SESSION_TO_PARENT, KEYCTL_REJECT, +// KEYCTL_INVALIDATE, and KEYCTL_GET_PERSISTENT. +//sys KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) = SYS_KEYCTL + +// KeyctlBuffer calls keyctl commands in which the third and fourth +// arguments are a buffer and its length, respectively. +// These commands are KEYCTL_UPDATE, KEYCTL_READ, and KEYCTL_INSTANTIATE. +//sys KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) = SYS_KEYCTL + +// KeyctlString calls keyctl commands which return a string. +// These commands are KEYCTL_DESCRIBE and KEYCTL_GET_SECURITY. +func KeyctlString(cmd int, id int) (string, error) { + // We must loop as the string data may change in between the syscalls. + // We could allocate a large buffer here to reduce the chance that the + // syscall needs to be called twice; however, this is unnecessary as + // the performance loss is negligible. + var buffer []byte + for { + // Try to fill the buffer with data + length, err := KeyctlBuffer(cmd, id, buffer, 0) + if err != nil { + return "", err + } + + // Check if the data was written + if length <= len(buffer) { + // Exclude the null terminator + return string(buffer[:length-1]), nil + } + + // Make a bigger buffer if needed + buffer = make([]byte, length) + } +} + +// Keyctl commands with special signatures. + +// KeyctlGetKeyringID implements the KEYCTL_GET_KEYRING_ID command. +// See the full documentation at: +// http://man7.org/linux/man-pages/man3/keyctl_get_keyring_ID.3.html +func KeyctlGetKeyringID(id int, create bool) (ringid int, err error) { + createInt := 0 + if create { + createInt = 1 + } + return KeyctlInt(KEYCTL_GET_KEYRING_ID, id, createInt, 0, 0) +} + +// KeyctlSetperm implements the KEYCTL_SETPERM command. The perm value is the +// key handle permission mask as described in the "keyctl setperm" section of +// http://man7.org/linux/man-pages/man1/keyctl.1.html. +// See the full documentation at: +// http://man7.org/linux/man-pages/man3/keyctl_setperm.3.html +func KeyctlSetperm(id int, perm uint32) error { + _, err := KeyctlInt(KEYCTL_SETPERM, id, int(perm), 0, 0) + return err +} + +//sys keyctlJoin(cmd int, arg2 string) (ret int, err error) = SYS_KEYCTL + +// KeyctlJoinSessionKeyring implements the KEYCTL_JOIN_SESSION_KEYRING command. +// See the full documentation at: +// http://man7.org/linux/man-pages/man3/keyctl_join_session_keyring.3.html +func KeyctlJoinSessionKeyring(name string) (ringid int, err error) { + return keyctlJoin(KEYCTL_JOIN_SESSION_KEYRING, name) +} + +//sys keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) = SYS_KEYCTL + +// KeyctlSearch implements the KEYCTL_SEARCH command. +// See the full documentation at: +// http://man7.org/linux/man-pages/man3/keyctl_search.3.html +func KeyctlSearch(ringid int, keyType, description string, destRingid int) (id int, err error) { + return keyctlSearch(KEYCTL_SEARCH, ringid, keyType, description, destRingid) +} + +//sys keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) = SYS_KEYCTL + +// KeyctlInstantiateIOV implements the KEYCTL_INSTANTIATE_IOV command. This +// command is similar to KEYCTL_INSTANTIATE, except that the payload is a slice +// of Iovec (each of which represents a buffer) instead of a single buffer. +// See the full documentation at: +// http://man7.org/linux/man-pages/man3/keyctl_instantiate_iov.3.html +func KeyctlInstantiateIOV(id int, payload []Iovec, ringid int) error { + return keyctlIOV(KEYCTL_INSTANTIATE_IOV, id, payload, ringid) +} + +//sys keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) = SYS_KEYCTL + +// KeyctlDHCompute implements the KEYCTL_DH_COMPUTE command. This command +// computes a Diffie-Hellman shared secret based on the provide params. The +// secret is written to the provided buffer and the returned size is the number +// of bytes written (returning an error if there is insufficient space in the +// buffer). If a nil buffer is passed in, this function returns the minimum +// buffer length needed to store the appropriate data. Note that this differs +// from KEYCTL_READ's behavior which always returns the requested payload size. +// See the full documentation at: +// http://man7.org/linux/man-pages/man3/keyctl_dh_compute.3.html +func KeyctlDHCompute(params *KeyctlDHParams, buffer []byte) (size int, err error) { + return keyctlDH(KEYCTL_DH_COMPUTE, params, buffer) +} + +func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) { + var msg Msghdr + var rsa RawSockaddrAny + msg.Name = (*byte)(unsafe.Pointer(&rsa)) + msg.Namelen = uint32(SizeofSockaddrAny) + var iov Iovec + if len(p) > 0 { + iov.Base = &p[0] + iov.SetLen(len(p)) + } + var dummy byte + if len(oob) > 0 { + if len(p) == 0 { + var sockType int + sockType, err = GetsockoptInt(fd, SOL_SOCKET, SO_TYPE) + if err != nil { + return + } + // receive at least one normal byte + if sockType != SOCK_DGRAM { + iov.Base = &dummy + iov.SetLen(1) + } + } + msg.Control = &oob[0] + msg.SetControllen(len(oob)) + } + msg.Iov = &iov + msg.Iovlen = 1 + if n, err = recvmsg(fd, &msg, flags); err != nil { + return + } + oobn = int(msg.Controllen) + recvflags = int(msg.Flags) + // source address is only specified if the socket is unconnected + if rsa.Addr.Family != AF_UNSPEC { + from, err = anyToSockaddr(fd, &rsa) + } + return +} + +func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) { + _, err = SendmsgN(fd, p, oob, to, flags) + return +} + +func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) { + var ptr unsafe.Pointer + var salen _Socklen + if to != nil { + var err error + ptr, salen, err = to.sockaddr() + if err != nil { + return 0, err + } + } + var msg Msghdr + msg.Name = (*byte)(ptr) + msg.Namelen = uint32(salen) + var iov Iovec + if len(p) > 0 { + iov.Base = &p[0] + iov.SetLen(len(p)) + } + var dummy byte + if len(oob) > 0 { + if len(p) == 0 { + var sockType int + sockType, err = GetsockoptInt(fd, SOL_SOCKET, SO_TYPE) + if err != nil { + return 0, err + } + // send at least one normal byte + if sockType != SOCK_DGRAM { + iov.Base = &dummy + iov.SetLen(1) + } + } + msg.Control = &oob[0] + msg.SetControllen(len(oob)) + } + msg.Iov = &iov + msg.Iovlen = 1 + if n, err = sendmsg(fd, &msg, flags); err != nil { + return 0, err + } + if len(oob) > 0 && len(p) == 0 { + n = 0 + } + return n, nil +} + +// BindToDevice binds the socket associated with fd to device. +func BindToDevice(fd int, device string) (err error) { + return SetsockoptString(fd, SOL_SOCKET, SO_BINDTODEVICE, device) +} + +//sys ptrace(request int, pid int, addr uintptr, data uintptr) (err error) + +func ptracePeek(req int, pid int, addr uintptr, out []byte) (count int, err error) { + // The peek requests are machine-size oriented, so we wrap it + // to retrieve arbitrary-length data. + + // The ptrace syscall differs from glibc's ptrace. + // Peeks returns the word in *data, not as the return value. + + var buf [SizeofPtr]byte + + // Leading edge. PEEKTEXT/PEEKDATA don't require aligned + // access (PEEKUSER warns that it might), but if we don't + // align our reads, we might straddle an unmapped page + // boundary and not get the bytes leading up to the page + // boundary. + n := 0 + if addr%SizeofPtr != 0 { + err = ptrace(req, pid, addr-addr%SizeofPtr, uintptr(unsafe.Pointer(&buf[0]))) + if err != nil { + return 0, err + } + n += copy(out, buf[addr%SizeofPtr:]) + out = out[n:] + } + + // Remainder. + for len(out) > 0 { + // We use an internal buffer to guarantee alignment. + // It's not documented if this is necessary, but we're paranoid. + err = ptrace(req, pid, addr+uintptr(n), uintptr(unsafe.Pointer(&buf[0]))) + if err != nil { + return n, err + } + copied := copy(out, buf[0:]) + n += copied + out = out[copied:] + } + + return n, nil +} + +func PtracePeekText(pid int, addr uintptr, out []byte) (count int, err error) { + return ptracePeek(PTRACE_PEEKTEXT, pid, addr, out) +} + +func PtracePeekData(pid int, addr uintptr, out []byte) (count int, err error) { + return ptracePeek(PTRACE_PEEKDATA, pid, addr, out) +} + +func PtracePeekUser(pid int, addr uintptr, out []byte) (count int, err error) { + return ptracePeek(PTRACE_PEEKUSR, pid, addr, out) +} + +func ptracePoke(pokeReq int, peekReq int, pid int, addr uintptr, data []byte) (count int, err error) { + // As for ptracePeek, we need to align our accesses to deal + // with the possibility of straddling an invalid page. + + // Leading edge. + n := 0 + if addr%SizeofPtr != 0 { + var buf [SizeofPtr]byte + err = ptrace(peekReq, pid, addr-addr%SizeofPtr, uintptr(unsafe.Pointer(&buf[0]))) + if err != nil { + return 0, err + } + n += copy(buf[addr%SizeofPtr:], data) + word := *((*uintptr)(unsafe.Pointer(&buf[0]))) + err = ptrace(pokeReq, pid, addr-addr%SizeofPtr, word) + if err != nil { + return 0, err + } + data = data[n:] + } + + // Interior. + for len(data) > SizeofPtr { + word := *((*uintptr)(unsafe.Pointer(&data[0]))) + err = ptrace(pokeReq, pid, addr+uintptr(n), word) + if err != nil { + return n, err + } + n += SizeofPtr + data = data[SizeofPtr:] + } + + // Trailing edge. + if len(data) > 0 { + var buf [SizeofPtr]byte + err = ptrace(peekReq, pid, addr+uintptr(n), uintptr(unsafe.Pointer(&buf[0]))) + if err != nil { + return n, err + } + copy(buf[0:], data) + word := *((*uintptr)(unsafe.Pointer(&buf[0]))) + err = ptrace(pokeReq, pid, addr+uintptr(n), word) + if err != nil { + return n, err + } + n += len(data) + } + + return n, nil +} + +func PtracePokeText(pid int, addr uintptr, data []byte) (count int, err error) { + return ptracePoke(PTRACE_POKETEXT, PTRACE_PEEKTEXT, pid, addr, data) +} + +func PtracePokeData(pid int, addr uintptr, data []byte) (count int, err error) { + return ptracePoke(PTRACE_POKEDATA, PTRACE_PEEKDATA, pid, addr, data) +} + +func PtracePokeUser(pid int, addr uintptr, data []byte) (count int, err error) { + return ptracePoke(PTRACE_POKEUSR, PTRACE_PEEKUSR, pid, addr, data) +} + +func PtraceGetRegs(pid int, regsout *PtraceRegs) (err error) { + return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) +} + +func PtraceSetRegs(pid int, regs *PtraceRegs) (err error) { + return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs))) +} + +func PtraceSetOptions(pid int, options int) (err error) { + return ptrace(PTRACE_SETOPTIONS, pid, 0, uintptr(options)) +} + +func PtraceGetEventMsg(pid int) (msg uint, err error) { + var data _C_long + err = ptrace(PTRACE_GETEVENTMSG, pid, 0, uintptr(unsafe.Pointer(&data))) + msg = uint(data) + return +} + +func PtraceCont(pid int, signal int) (err error) { + return ptrace(PTRACE_CONT, pid, 0, uintptr(signal)) +} + +func PtraceSyscall(pid int, signal int) (err error) { + return ptrace(PTRACE_SYSCALL, pid, 0, uintptr(signal)) +} + +func PtraceSingleStep(pid int) (err error) { return ptrace(PTRACE_SINGLESTEP, pid, 0, 0) } + +func PtraceAttach(pid int) (err error) { return ptrace(PTRACE_ATTACH, pid, 0, 0) } + +func PtraceDetach(pid int) (err error) { return ptrace(PTRACE_DETACH, pid, 0, 0) } + +//sys reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) + +func Reboot(cmd int) (err error) { + return reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, cmd, "") +} + +func ReadDirent(fd int, buf []byte) (n int, err error) { + return Getdents(fd, buf) +} + +//sys mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) + +func Mount(source string, target string, fstype string, flags uintptr, data string) (err error) { + // Certain file systems get rather angry and EINVAL if you give + // them an empty string of data, rather than NULL. + if data == "" { + return mount(source, target, fstype, flags, nil) + } + datap, err := BytePtrFromString(data) + if err != nil { + return err + } + return mount(source, target, fstype, flags, datap) +} + +// Sendto +// Recvfrom +// Socketpair + +/* + * Direct access + */ +//sys Acct(path string) (err error) +//sys AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) +//sys Adjtimex(buf *Timex) (state int, err error) +//sys Chdir(path string) (err error) +//sys Chroot(path string) (err error) +//sys ClockGetres(clockid int32, res *Timespec) (err error) +//sys ClockGettime(clockid int32, time *Timespec) (err error) +//sys Close(fd int) (err error) +//sys CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) +//sys Dup(oldfd int) (fd int, err error) +//sys Dup3(oldfd int, newfd int, flags int) (err error) +//sysnb EpollCreate1(flag int) (fd int, err error) +//sysnb EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) +//sys Eventfd(initval uint, flags int) (fd int, err error) = SYS_EVENTFD2 +//sys Exit(code int) = SYS_EXIT_GROUP +//sys Fallocate(fd int, mode uint32, off int64, len int64) (err error) +//sys Fchdir(fd int) (err error) +//sys Fchmod(fd int, mode uint32) (err error) +//sys Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) +//sys fcntl(fd int, cmd int, arg int) (val int, err error) +//sys Fdatasync(fd int) (err error) +//sys Fgetxattr(fd int, attr string, dest []byte) (sz int, err error) +//sys Flistxattr(fd int, dest []byte) (sz int, err error) +//sys Flock(fd int, how int) (err error) +//sys Fremovexattr(fd int, attr string) (err error) +//sys Fsetxattr(fd int, attr string, dest []byte, flags int) (err error) +//sys Fsync(fd int) (err error) +//sys Getdents(fd int, buf []byte) (n int, err error) = SYS_GETDENTS64 +//sysnb Getpgid(pid int) (pgid int, err error) + +func Getpgrp() (pid int) { + pid, _ = Getpgid(0) + return +} + +//sysnb Getpid() (pid int) +//sysnb Getppid() (ppid int) +//sys Getpriority(which int, who int) (prio int, err error) +//sys Getrandom(buf []byte, flags int) (n int, err error) +//sysnb Getrusage(who int, rusage *Rusage) (err error) +//sysnb Getsid(pid int) (sid int, err error) +//sysnb Gettid() (tid int) +//sys Getxattr(path string, attr string, dest []byte) (sz int, err error) +//sys InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) +//sysnb InotifyInit1(flags int) (fd int, err error) +//sysnb InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) +//sysnb Kill(pid int, sig syscall.Signal) (err error) +//sys Klogctl(typ int, buf []byte) (n int, err error) = SYS_SYSLOG +//sys Lgetxattr(path string, attr string, dest []byte) (sz int, err error) +//sys Listxattr(path string, dest []byte) (sz int, err error) +//sys Llistxattr(path string, dest []byte) (sz int, err error) +//sys Lremovexattr(path string, attr string) (err error) +//sys Lsetxattr(path string, attr string, data []byte, flags int) (err error) +//sys MemfdCreate(name string, flags int) (fd int, err error) +//sys Mkdirat(dirfd int, path string, mode uint32) (err error) +//sys Mknodat(dirfd int, path string, mode uint32, dev int) (err error) +//sys Nanosleep(time *Timespec, leftover *Timespec) (err error) +//sys PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) +//sys PivotRoot(newroot string, putold string) (err error) = SYS_PIVOT_ROOT +//sysnb prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) = SYS_PRLIMIT64 +//sys Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) +//sys Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) = SYS_PSELECT6 +//sys read(fd int, p []byte) (n int, err error) +//sys Removexattr(path string, attr string) (err error) +//sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) +//sys Renameat2(olddirfd int, oldpath string, newdirfd int, newpath string, flags uint) (err error) +//sys RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) +//sys Setdomainname(p []byte) (err error) +//sys Sethostname(p []byte) (err error) +//sysnb Setpgid(pid int, pgid int) (err error) +//sysnb Setsid() (pid int, err error) +//sysnb Settimeofday(tv *Timeval) (err error) +//sys Setns(fd int, nstype int) (err error) + +// issue 1435. +// On linux Setuid and Setgid only affects the current thread, not the process. +// This does not match what most callers expect so we must return an error +// here rather than letting the caller think that the call succeeded. + +func Setuid(uid int) (err error) { + return EOPNOTSUPP +} + +func Setgid(uid int) (err error) { + return EOPNOTSUPP +} + +//sys Setpriority(which int, who int, prio int) (err error) +//sys Setxattr(path string, attr string, data []byte, flags int) (err error) +//sys Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) +//sys Sync() +//sys Syncfs(fd int) (err error) +//sysnb Sysinfo(info *Sysinfo_t) (err error) +//sys Tee(rfd int, wfd int, len int, flags int) (n int64, err error) +//sysnb Tgkill(tgid int, tid int, sig syscall.Signal) (err error) +//sysnb Times(tms *Tms) (ticks uintptr, err error) +//sysnb Umask(mask int) (oldmask int) +//sysnb Uname(buf *Utsname) (err error) +//sys Unmount(target string, flags int) (err error) = SYS_UMOUNT2 +//sys Unshare(flags int) (err error) +//sys write(fd int, p []byte) (n int, err error) +//sys exitThread(code int) (err error) = SYS_EXIT +//sys readlen(fd int, p *byte, np int) (n int, err error) = SYS_READ +//sys writelen(fd int, p *byte, np int) (n int, err error) = SYS_WRITE + +// mmap varies by architecture; see syscall_linux_*.go. +//sys munmap(addr uintptr, length uintptr) (err error) + +var mapper = &mmapper{ + active: make(map[*byte][]byte), + mmap: mmap, + munmap: munmap, +} + +func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { + return mapper.Mmap(fd, offset, length, prot, flags) +} + +func Munmap(b []byte) (err error) { + return mapper.Munmap(b) +} + +//sys Madvise(b []byte, advice int) (err error) +//sys Mprotect(b []byte, prot int) (err error) +//sys Mlock(b []byte) (err error) +//sys Mlockall(flags int) (err error) +//sys Msync(b []byte, flags int) (err error) +//sys Munlock(b []byte) (err error) +//sys Munlockall() (err error) + +// Vmsplice splices user pages from a slice of Iovecs into a pipe specified by fd, +// using the specified flags. +func Vmsplice(fd int, iovs []Iovec, flags int) (int, error) { + n, _, errno := Syscall6( + SYS_VMSPLICE, + uintptr(fd), + uintptr(unsafe.Pointer(&iovs[0])), + uintptr(len(iovs)), + uintptr(flags), + 0, + 0, + ) + if errno != 0 { + return 0, syscall.Errno(errno) + } + + return int(n), nil +} + +//sys faccessat(dirfd int, path string, mode uint32) (err error) + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + if flags & ^(AT_SYMLINK_NOFOLLOW|AT_EACCESS) != 0 { + return EINVAL + } + + // The Linux kernel faccessat system call does not take any flags. + // The glibc faccessat implements the flags itself; see + // https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/faccessat.c;hb=HEAD + // Because people naturally expect syscall.Faccessat to act + // like C faccessat, we do the same. + + if flags == 0 { + return faccessat(dirfd, path, mode) + } + + var st Stat_t + if err := Fstatat(dirfd, path, &st, flags&AT_SYMLINK_NOFOLLOW); err != nil { + return err + } + + mode &= 7 + if mode == 0 { + return nil + } + + var uid int + if flags&AT_EACCESS != 0 { + uid = Geteuid() + } else { + uid = Getuid() + } + + if uid == 0 { + if mode&1 == 0 { + // Root can read and write any file. + return nil + } + if st.Mode&0111 != 0 { + // Root can execute any file that anybody can execute. + return nil + } + return EACCES + } + + var fmode uint32 + if uint32(uid) == st.Uid { + fmode = (st.Mode >> 6) & 7 + } else { + var gid int + if flags&AT_EACCESS != 0 { + gid = Getegid() + } else { + gid = Getgid() + } + + if uint32(gid) == st.Gid { + fmode = (st.Mode >> 3) & 7 + } else { + fmode = st.Mode & 7 + } + } + + if fmode&mode == mode { + return nil + } + + return EACCES +} + +/* + * Unimplemented + */ +// AfsSyscall +// Alarm +// ArchPrctl +// Brk +// Capget +// Capset +// ClockNanosleep +// ClockSettime +// Clone +// CreateModule +// DeleteModule +// EpollCtlOld +// EpollPwait +// EpollWaitOld +// Execve +// Fork +// Futex +// GetKernelSyms +// GetMempolicy +// GetRobustList +// GetThreadArea +// Getitimer +// Getpmsg +// IoCancel +// IoDestroy +// IoGetevents +// IoSetup +// IoSubmit +// IoprioGet +// IoprioSet +// KexecLoad +// LookupDcookie +// Mbind +// MigratePages +// Mincore +// ModifyLdt +// Mount +// MovePages +// MqGetsetattr +// MqNotify +// MqOpen +// MqTimedreceive +// MqTimedsend +// MqUnlink +// Mremap +// Msgctl +// Msgget +// Msgrcv +// Msgsnd +// Nfsservctl +// Personality +// Pselect6 +// Ptrace +// Putpmsg +// QueryModule +// Quotactl +// Readahead +// Readv +// RemapFilePages +// RestartSyscall +// RtSigaction +// RtSigpending +// RtSigprocmask +// RtSigqueueinfo +// RtSigreturn +// RtSigsuspend +// RtSigtimedwait +// SchedGetPriorityMax +// SchedGetPriorityMin +// SchedGetparam +// SchedGetscheduler +// SchedRrGetInterval +// SchedSetparam +// SchedYield +// Security +// Semctl +// Semget +// Semop +// Semtimedop +// SetMempolicy +// SetRobustList +// SetThreadArea +// SetTidAddress +// Shmat +// Shmctl +// Shmdt +// Shmget +// Sigaltstack +// Signalfd +// Swapoff +// Swapon +// Sysfs +// TimerCreate +// TimerDelete +// TimerGetoverrun +// TimerGettime +// TimerSettime +// Timerfd +// Tkill (obsolete) +// Tuxcall +// Umount2 +// Uselib +// Utimensat +// Vfork +// Vhangup +// Vserver +// Waitid +// _Sysctl diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_386.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_386.go new file mode 100644 index 00000000..74bc098c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_386.go @@ -0,0 +1,385 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// TODO(rsc): Rewrite all nn(SP) references into name+(nn-8)(FP) +// so that go vet can check that they are correct. + +// +build 386,linux + +package unix + +import ( + "unsafe" +) + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: int32(sec), Nsec: int32(nsec)} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: int32(sec), Usec: int32(usec)} +} + +//sysnb pipe(p *[2]_C_int) (err error) + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe(&pp) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +//sysnb pipe2(p *[2]_C_int, flags int) (err error) + +func Pipe2(p []int, flags int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, flags) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +// 64-bit file system and 32-bit uid calls +// (386 default is 32-bit file system and 16-bit uid). +//sys Dup2(oldfd int, newfd int) (err error) +//sysnb EpollCreate(size int) (fd int, err error) +//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) +//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64_64 +//sys Fchown(fd int, uid int, gid int) (err error) = SYS_FCHOWN32 +//sys Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64 +//sys Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = SYS_FSTATAT64 +//sys Ftruncate(fd int, length int64) (err error) = SYS_FTRUNCATE64 +//sysnb Getegid() (egid int) = SYS_GETEGID32 +//sysnb Geteuid() (euid int) = SYS_GETEUID32 +//sysnb Getgid() (gid int) = SYS_GETGID32 +//sysnb Getuid() (uid int) = SYS_GETUID32 +//sysnb InotifyInit() (fd int, err error) +//sys Ioperm(from int, num int, on int) (err error) +//sys Iopl(level int) (err error) +//sys Lchown(path string, uid int, gid int) (err error) = SYS_LCHOWN32 +//sys Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64 +//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64 +//sys Setfsgid(gid int) (err error) = SYS_SETFSGID32 +//sys Setfsuid(uid int) (err error) = SYS_SETFSUID32 +//sysnb Setregid(rgid int, egid int) (err error) = SYS_SETREGID32 +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) = SYS_SETRESGID32 +//sysnb Setresuid(ruid int, euid int, suid int) (err error) = SYS_SETRESUID32 +//sysnb Setreuid(ruid int, euid int) (err error) = SYS_SETREUID32 +//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) +//sys Stat(path string, stat *Stat_t) (err error) = SYS_STAT64 +//sys SyncFileRange(fd int, off int64, n int64, flags int) (err error) +//sys Truncate(path string, length int64) (err error) = SYS_TRUNCATE64 +//sys Ustat(dev int, ubuf *Ustat_t) (err error) +//sysnb getgroups(n int, list *_Gid_t) (nn int, err error) = SYS_GETGROUPS32 +//sysnb setgroups(n int, list *_Gid_t) (err error) = SYS_SETGROUPS32 +//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT + +//sys mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error) +//sys Pause() (err error) + +func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + page := uintptr(offset / 4096) + if offset != int64(page)*4096 { + return 0, EINVAL + } + return mmap2(addr, length, prot, flags, fd, page) +} + +type rlimit32 struct { + Cur uint32 + Max uint32 +} + +//sysnb getrlimit(resource int, rlim *rlimit32) (err error) = SYS_GETRLIMIT + +const rlimInf32 = ^uint32(0) +const rlimInf64 = ^uint64(0) + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + err = prlimit(0, resource, nil, rlim) + if err != ENOSYS { + return err + } + + rl := rlimit32{} + err = getrlimit(resource, &rl) + if err != nil { + return + } + + if rl.Cur == rlimInf32 { + rlim.Cur = rlimInf64 + } else { + rlim.Cur = uint64(rl.Cur) + } + + if rl.Max == rlimInf32 { + rlim.Max = rlimInf64 + } else { + rlim.Max = uint64(rl.Max) + } + return +} + +//sysnb setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT + +func Setrlimit(resource int, rlim *Rlimit) (err error) { + err = prlimit(0, resource, rlim, nil) + if err != ENOSYS { + return err + } + + rl := rlimit32{} + if rlim.Cur == rlimInf64 { + rl.Cur = rlimInf32 + } else if rlim.Cur < uint64(rlimInf32) { + rl.Cur = uint32(rlim.Cur) + } else { + return EINVAL + } + if rlim.Max == rlimInf64 { + rl.Max = rlimInf32 + } else if rlim.Max < uint64(rlimInf32) { + rl.Max = uint32(rlim.Max) + } else { + return EINVAL + } + + return setrlimit(resource, &rl) +} + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + newoffset, errno := seek(fd, offset, whence) + if errno != 0 { + return 0, errno + } + return newoffset, nil +} + +//sys futimesat(dirfd int, path string, times *[2]Timeval) (err error) +//sysnb Gettimeofday(tv *Timeval) (err error) +//sysnb Time(t *Time_t) (tt Time_t, err error) +//sys Utime(path string, buf *Utimbuf) (err error) +//sys utimes(path string, times *[2]Timeval) (err error) + +// On x86 Linux, all the socket calls go through an extra indirection, +// I think because the 5-register system call interface can't handle +// the 6-argument calls like sendto and recvfrom. Instead the +// arguments to the underlying system call are the number below +// and a pointer to an array of uintptr. We hide the pointer in the +// socketcall assembly to avoid allocation on every system call. + +const ( + // see linux/net.h + _SOCKET = 1 + _BIND = 2 + _CONNECT = 3 + _LISTEN = 4 + _ACCEPT = 5 + _GETSOCKNAME = 6 + _GETPEERNAME = 7 + _SOCKETPAIR = 8 + _SEND = 9 + _RECV = 10 + _SENDTO = 11 + _RECVFROM = 12 + _SHUTDOWN = 13 + _SETSOCKOPT = 14 + _GETSOCKOPT = 15 + _SENDMSG = 16 + _RECVMSG = 17 + _ACCEPT4 = 18 + _RECVMMSG = 19 + _SENDMMSG = 20 +) + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + fd, e := socketcall(_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0) + if e != 0 { + err = e + } + return +} + +func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { + fd, e := socketcall(_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) + if e != 0 { + err = e + } + return +} + +func getsockname(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, e := rawsocketcall(_GETSOCKNAME, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0) + if e != 0 { + err = e + } + return +} + +func getpeername(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, e := rawsocketcall(_GETPEERNAME, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0) + if e != 0 { + err = e + } + return +} + +func socketpair(domain int, typ int, flags int, fd *[2]int32) (err error) { + _, e := rawsocketcall(_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(flags), uintptr(unsafe.Pointer(fd)), 0, 0) + if e != 0 { + err = e + } + return +} + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, e := socketcall(_BIND, uintptr(s), uintptr(addr), uintptr(addrlen), 0, 0, 0) + if e != 0 { + err = e + } + return +} + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, e := socketcall(_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen), 0, 0, 0) + if e != 0 { + err = e + } + return +} + +func socket(domain int, typ int, proto int) (fd int, err error) { + fd, e := rawsocketcall(_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto), 0, 0, 0) + if e != 0 { + err = e + } + return +} + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, e := socketcall(_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e != 0 { + err = e + } + return +} + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, e := socketcall(_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), vallen, 0) + if e != 0 { + err = e + } + return +} + +func recvfrom(s int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var base uintptr + if len(p) > 0 { + base = uintptr(unsafe.Pointer(&p[0])) + } + n, e := socketcall(_RECVFROM, uintptr(s), base, uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + if e != 0 { + err = e + } + return +} + +func sendto(s int, p []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var base uintptr + if len(p) > 0 { + base = uintptr(unsafe.Pointer(&p[0])) + } + _, e := socketcall(_SENDTO, uintptr(s), base, uintptr(len(p)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e != 0 { + err = e + } + return +} + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + n, e := socketcall(_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0) + if e != 0 { + err = e + } + return +} + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + n, e := socketcall(_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0) + if e != 0 { + err = e + } + return +} + +func Listen(s int, n int) (err error) { + _, e := socketcall(_LISTEN, uintptr(s), uintptr(n), 0, 0, 0, 0) + if e != 0 { + err = e + } + return +} + +func Shutdown(s, how int) (err error) { + _, e := socketcall(_SHUTDOWN, uintptr(s), uintptr(how), 0, 0, 0, 0) + if e != 0 { + err = e + } + return +} + +func Fstatfs(fd int, buf *Statfs_t) (err error) { + _, _, e := Syscall(SYS_FSTATFS64, uintptr(fd), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf))) + if e != 0 { + err = e + } + return +} + +func Statfs(path string, buf *Statfs_t) (err error) { + pathp, err := BytePtrFromString(path) + if err != nil { + return err + } + _, _, e := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(pathp)), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf))) + if e != 0 { + err = e + } + return +} + +func (r *PtraceRegs) PC() uint64 { return uint64(uint32(r.Eip)) } + +func (r *PtraceRegs) SetPC(pc uint64) { r.Eip = int32(pc) } + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint32(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) + +func Poll(fds []PollFd, timeout int) (n int, err error) { + if len(fds) == 0 { + return poll(nil, 0, timeout) + } + return poll(&fds[0], len(fds), timeout) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go new file mode 100644 index 00000000..5247d9f9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go @@ -0,0 +1,175 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build amd64,linux + +package unix + +//sys Dup2(oldfd int, newfd int) (err error) +//sysnb EpollCreate(size int) (fd int, err error) +//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) +//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64 +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Fstat(fd int, stat *Stat_t) (err error) +//sys Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = SYS_NEWFSTATAT +//sys Fstatfs(fd int, buf *Statfs_t) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (euid int) +//sysnb Getgid() (gid int) +//sysnb Getrlimit(resource int, rlim *Rlimit) (err error) +//sysnb Getuid() (uid int) +//sysnb InotifyInit() (fd int, err error) +//sys Ioperm(from int, num int, on int) (err error) +//sys Iopl(level int) (err error) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Listen(s int, n int) (err error) +//sys Lstat(path string, stat *Stat_t) (err error) +//sys Pause() (err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + var ts *Timespec + if timeout != nil { + ts = &Timespec{Sec: timeout.Sec, Nsec: timeout.Usec * 1000} + } + return Pselect(nfd, r, w, e, ts, nil) +} + +//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) +//sys Setfsgid(gid int) (err error) +//sys Setfsuid(uid int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) +//sysnb Setresuid(ruid int, euid int, suid int) (err error) +//sysnb Setrlimit(resource int, rlim *Rlimit) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sys Shutdown(fd int, how int) (err error) +//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) + +func Stat(path string, stat *Stat_t) (err error) { + // Use fstatat, because Android's seccomp policy blocks stat. + return Fstatat(AT_FDCWD, path, stat, 0) +} + +//sys Statfs(path string, buf *Statfs_t) (err error) +//sys SyncFileRange(fd int, off int64, n int64, flags int) (err error) +//sys Truncate(path string, length int64) (err error) +//sys Ustat(dev int, ubuf *Ustat_t) (err error) +//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) +//sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) +//sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) +//sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) +//sysnb getgroups(n int, list *_Gid_t) (nn int, err error) +//sysnb setgroups(n int, list *_Gid_t) (err error) +//sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) +//sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) +//sysnb socket(domain int, typ int, proto int) (fd int, err error) +//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) +//sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) +//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) +//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) + +//sys futimesat(dirfd int, path string, times *[2]Timeval) (err error) + +func Gettimeofday(tv *Timeval) (err error) { + errno := gettimeofday(tv) + if errno != 0 { + return errno + } + return nil +} + +func Time(t *Time_t) (tt Time_t, err error) { + var tv Timeval + errno := gettimeofday(&tv) + if errno != 0 { + return 0, errno + } + if t != nil { + *t = Time_t(tv.Sec) + } + return Time_t(tv.Sec), nil +} + +//sys Utime(path string, buf *Utimbuf) (err error) +//sys utimes(path string, times *[2]Timeval) (err error) + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: nsec} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: usec} +} + +//sysnb pipe(p *[2]_C_int) (err error) + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe(&pp) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +//sysnb pipe2(p *[2]_C_int, flags int) (err error) + +func Pipe2(p []int, flags int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, flags) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +func (r *PtraceRegs) PC() uint64 { return r.Rip } + +func (r *PtraceRegs) SetPC(pc uint64) { r.Rip = pc } + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint64(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint64(length) +} + +//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) + +func Poll(fds []PollFd, timeout int) (n int, err error) { + if len(fds) == 0 { + return poll(nil, 0, timeout) + } + return poll(&fds[0], len(fds), timeout) +} + +//sys kexecFileLoad(kernelFd int, initrdFd int, cmdlineLen int, cmdline string, flags int) (err error) + +func KexecFileLoad(kernelFd int, initrdFd int, cmdline string, flags int) error { + cmdlineLen := len(cmdline) + if cmdlineLen > 0 { + // Account for the additional NULL byte added by + // BytePtrFromString in kexecFileLoad. The kexec_file_load + // syscall expects a NULL-terminated string. + cmdlineLen++ + } + return kexecFileLoad(kernelFd, initrdFd, cmdlineLen, cmdline, flags) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_amd64_gc.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_amd64_gc.go new file mode 100644 index 00000000..21a4946b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_amd64_gc.go @@ -0,0 +1,13 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build amd64,linux +// +build !gccgo + +package unix + +import "syscall" + +//go:noescape +func gettimeofday(tv *Timeval) (err syscall.Errno) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_arm.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_arm.go new file mode 100644 index 00000000..3ec7a932 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_arm.go @@ -0,0 +1,259 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build arm,linux + +package unix + +import ( + "syscall" + "unsafe" +) + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: int32(sec), Nsec: int32(nsec)} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: int32(sec), Usec: int32(usec)} +} + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, 0) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +//sysnb pipe2(p *[2]_C_int, flags int) (err error) + +func Pipe2(p []int, flags int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, flags) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +// Underlying system call writes to newoffset via pointer. +// Implemented in assembly to avoid allocation. +func seek(fd int, offset int64, whence int) (newoffset int64, err syscall.Errno) + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + newoffset, errno := seek(fd, offset, whence) + if errno != 0 { + return 0, errno + } + return newoffset, nil +} + +//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) +//sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) +//sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) +//sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) +//sysnb getgroups(n int, list *_Gid_t) (nn int, err error) = SYS_GETGROUPS32 +//sysnb setgroups(n int, list *_Gid_t) (err error) = SYS_SETGROUPS32 +//sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) +//sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) +//sysnb socket(domain int, typ int, proto int) (fd int, err error) +//sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) +//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) +//sysnb socketpair(domain int, typ int, flags int, fd *[2]int32) (err error) +//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) + +// 64-bit file system and 32-bit uid calls +// (16-bit uid calls are not always supported in newer kernels) +//sys Dup2(oldfd int, newfd int) (err error) +//sysnb EpollCreate(size int) (fd int, err error) +//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) +//sys Fchown(fd int, uid int, gid int) (err error) = SYS_FCHOWN32 +//sys Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64 +//sys Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = SYS_FSTATAT64 +//sysnb Getegid() (egid int) = SYS_GETEGID32 +//sysnb Geteuid() (euid int) = SYS_GETEUID32 +//sysnb Getgid() (gid int) = SYS_GETGID32 +//sysnb Getuid() (uid int) = SYS_GETUID32 +//sysnb InotifyInit() (fd int, err error) +//sys Lchown(path string, uid int, gid int) (err error) = SYS_LCHOWN32 +//sys Listen(s int, n int) (err error) +//sys Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64 +//sys Pause() (err error) +//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64 +//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT +//sys Setfsgid(gid int) (err error) = SYS_SETFSGID32 +//sys Setfsuid(uid int) (err error) = SYS_SETFSUID32 +//sysnb Setregid(rgid int, egid int) (err error) = SYS_SETREGID32 +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) = SYS_SETRESGID32 +//sysnb Setresuid(ruid int, euid int, suid int) (err error) = SYS_SETRESUID32 +//sysnb Setreuid(ruid int, euid int) (err error) = SYS_SETREUID32 +//sys Shutdown(fd int, how int) (err error) +//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) +//sys Stat(path string, stat *Stat_t) (err error) = SYS_STAT64 +//sys Ustat(dev int, ubuf *Ustat_t) (err error) + +//sys futimesat(dirfd int, path string, times *[2]Timeval) (err error) +//sysnb Gettimeofday(tv *Timeval) (err error) + +func Time(t *Time_t) (Time_t, error) { + var tv Timeval + err := Gettimeofday(&tv) + if err != nil { + return 0, err + } + if t != nil { + *t = Time_t(tv.Sec) + } + return Time_t(tv.Sec), nil +} + +func Utime(path string, buf *Utimbuf) error { + tv := []Timeval{ + {Sec: buf.Actime}, + {Sec: buf.Modtime}, + } + return Utimes(path, tv) +} + +//sys utimes(path string, times *[2]Timeval) (err error) + +//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys Truncate(path string, length int64) (err error) = SYS_TRUNCATE64 +//sys Ftruncate(fd int, length int64) (err error) = SYS_FTRUNCATE64 + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall6(SYS_ARM_FADVISE64_64, uintptr(fd), uintptr(advice), uintptr(offset), uintptr(offset>>32), uintptr(length), uintptr(length>>32)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +//sys mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error) + +func Fstatfs(fd int, buf *Statfs_t) (err error) { + _, _, e := Syscall(SYS_FSTATFS64, uintptr(fd), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf))) + if e != 0 { + err = e + } + return +} + +func Statfs(path string, buf *Statfs_t) (err error) { + pathp, err := BytePtrFromString(path) + if err != nil { + return err + } + _, _, e := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(pathp)), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf))) + if e != 0 { + err = e + } + return +} + +func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + page := uintptr(offset / 4096) + if offset != int64(page)*4096 { + return 0, EINVAL + } + return mmap2(addr, length, prot, flags, fd, page) +} + +type rlimit32 struct { + Cur uint32 + Max uint32 +} + +//sysnb getrlimit(resource int, rlim *rlimit32) (err error) = SYS_UGETRLIMIT + +const rlimInf32 = ^uint32(0) +const rlimInf64 = ^uint64(0) + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + err = prlimit(0, resource, nil, rlim) + if err != ENOSYS { + return err + } + + rl := rlimit32{} + err = getrlimit(resource, &rl) + if err != nil { + return + } + + if rl.Cur == rlimInf32 { + rlim.Cur = rlimInf64 + } else { + rlim.Cur = uint64(rl.Cur) + } + + if rl.Max == rlimInf32 { + rlim.Max = rlimInf64 + } else { + rlim.Max = uint64(rl.Max) + } + return +} + +//sysnb setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT + +func Setrlimit(resource int, rlim *Rlimit) (err error) { + err = prlimit(0, resource, rlim, nil) + if err != ENOSYS { + return err + } + + rl := rlimit32{} + if rlim.Cur == rlimInf64 { + rl.Cur = rlimInf32 + } else if rlim.Cur < uint64(rlimInf32) { + rl.Cur = uint32(rlim.Cur) + } else { + return EINVAL + } + if rlim.Max == rlimInf64 { + rl.Max = rlimInf32 + } else if rlim.Max < uint64(rlimInf32) { + rl.Max = uint32(rlim.Max) + } else { + return EINVAL + } + + return setrlimit(resource, &rl) +} + +func (r *PtraceRegs) PC() uint64 { return uint64(r.Uregs[15]) } + +func (r *PtraceRegs) SetPC(pc uint64) { r.Uregs[15] = uint32(pc) } + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint32(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) + +func Poll(fds []PollFd, timeout int) (n int, err error) { + if len(fds) == 0 { + return poll(nil, 0, timeout) + } + return poll(&fds[0], len(fds), timeout) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go new file mode 100644 index 00000000..646f295a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go @@ -0,0 +1,212 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build arm64,linux + +package unix + +import "unsafe" + +func EpollCreate(size int) (fd int, err error) { + if size <= 0 { + return -1, EINVAL + } + return EpollCreate1(0) +} + +//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) = SYS_EPOLL_PWAIT +//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64 +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Fstat(fd int, stat *Stat_t) (err error) +//sys Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) +//sys Fstatfs(fd int, buf *Statfs_t) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (euid int) +//sysnb Getgid() (gid int) +//sysnb Getrlimit(resource int, rlim *Rlimit) (err error) +//sysnb Getuid() (uid int) +//sys Listen(s int, n int) (err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + var ts *Timespec + if timeout != nil { + ts = &Timespec{Sec: timeout.Sec, Nsec: timeout.Usec * 1000} + } + return Pselect(nfd, r, w, e, ts, nil) +} + +//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) +//sys Setfsgid(gid int) (err error) +//sys Setfsuid(uid int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) +//sysnb Setresuid(ruid int, euid int, suid int) (err error) +//sysnb Setrlimit(resource int, rlim *Rlimit) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sys Shutdown(fd int, how int) (err error) +//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) + +func Stat(path string, stat *Stat_t) (err error) { + return Fstatat(AT_FDCWD, path, stat, 0) +} + +func Lchown(path string, uid int, gid int) (err error) { + return Fchownat(AT_FDCWD, path, uid, gid, AT_SYMLINK_NOFOLLOW) +} + +func Lstat(path string, stat *Stat_t) (err error) { + return Fstatat(AT_FDCWD, path, stat, AT_SYMLINK_NOFOLLOW) +} + +//sys Statfs(path string, buf *Statfs_t) (err error) +//sys SyncFileRange(fd int, off int64, n int64, flags int) (err error) +//sys Truncate(path string, length int64) (err error) + +func Ustat(dev int, ubuf *Ustat_t) (err error) { + return ENOSYS +} + +//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) +//sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) +//sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) +//sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) +//sysnb getgroups(n int, list *_Gid_t) (nn int, err error) +//sysnb setgroups(n int, list *_Gid_t) (err error) +//sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) +//sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) +//sysnb socket(domain int, typ int, proto int) (fd int, err error) +//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) +//sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) +//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) +//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) + +//sysnb Gettimeofday(tv *Timeval) (err error) + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: nsec} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: usec} +} + +func futimesat(dirfd int, path string, tv *[2]Timeval) (err error) { + if tv == nil { + return utimensat(dirfd, path, nil, 0) + } + + ts := []Timespec{ + NsecToTimespec(TimevalToNsec(tv[0])), + NsecToTimespec(TimevalToNsec(tv[1])), + } + return utimensat(dirfd, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0) +} + +func Time(t *Time_t) (Time_t, error) { + var tv Timeval + err := Gettimeofday(&tv) + if err != nil { + return 0, err + } + if t != nil { + *t = Time_t(tv.Sec) + } + return Time_t(tv.Sec), nil +} + +func Utime(path string, buf *Utimbuf) error { + tv := []Timeval{ + {Sec: buf.Actime}, + {Sec: buf.Modtime}, + } + return Utimes(path, tv) +} + +func utimes(path string, tv *[2]Timeval) (err error) { + if tv == nil { + return utimensat(AT_FDCWD, path, nil, 0) + } + + ts := []Timespec{ + NsecToTimespec(TimevalToNsec(tv[0])), + NsecToTimespec(TimevalToNsec(tv[1])), + } + return utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0) +} + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, 0) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +//sysnb pipe2(p *[2]_C_int, flags int) (err error) + +func Pipe2(p []int, flags int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, flags) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +func (r *PtraceRegs) PC() uint64 { return r.Pc } + +func (r *PtraceRegs) SetPC(pc uint64) { r.Pc = pc } + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint64(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint64(length) +} + +func InotifyInit() (fd int, err error) { + return InotifyInit1(0) +} + +func Dup2(oldfd int, newfd int) (err error) { + return Dup3(oldfd, newfd, 0) +} + +func Pause() (err error) { + _, _, e1 := Syscall6(SYS_PPOLL, 0, 0, 0, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +func Poll(fds []PollFd, timeout int) (n int, err error) { + var ts *Timespec + if timeout >= 0 { + ts = new(Timespec) + *ts = NsecToTimespec(int64(timeout) * 1e6) + } + if len(fds) == 0 { + return ppoll(nil, 0, ts, nil) + } + return ppoll(&fds[0], len(fds), ts, nil) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_gc.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_gc.go new file mode 100644 index 00000000..c26e6ec2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_gc.go @@ -0,0 +1,14 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build linux,!gccgo + +package unix + +// SyscallNoError may be used instead of Syscall for syscalls that don't fail. +func SyscallNoError(trap, a1, a2, a3 uintptr) (r1, r2 uintptr) + +// RawSyscallNoError may be used instead of RawSyscall for syscalls that don't +// fail. +func RawSyscallNoError(trap, a1, a2, a3 uintptr) (r1, r2 uintptr) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_gc_386.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_gc_386.go new file mode 100644 index 00000000..070bd389 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_gc_386.go @@ -0,0 +1,16 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build linux,!gccgo,386 + +package unix + +import "syscall" + +// Underlying system call writes to newoffset via pointer. +// Implemented in assembly to avoid allocation. +func seek(fd int, offset int64, whence int) (newoffset int64, err syscall.Errno) + +func socketcall(call int, a0, a1, a2, a3, a4, a5 uintptr) (n int, err syscall.Errno) +func rawsocketcall(call int, a0, a1, a2, a3, a4, a5 uintptr) (n int, err syscall.Errno) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_gccgo_386.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_gccgo_386.go new file mode 100644 index 00000000..308eb7ae --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_gccgo_386.go @@ -0,0 +1,30 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build linux,gccgo,386 + +package unix + +import ( + "syscall" + "unsafe" +) + +func seek(fd int, offset int64, whence int) (int64, syscall.Errno) { + var newoffset int64 + offsetLow := uint32(offset & 0xffffffff) + offsetHigh := uint32((offset >> 32) & 0xffffffff) + _, _, err := Syscall6(SYS__LLSEEK, uintptr(fd), uintptr(offsetHigh), uintptr(offsetLow), uintptr(unsafe.Pointer(&newoffset)), uintptr(whence), 0) + return newoffset, err +} + +func socketcall(call int, a0, a1, a2, a3, a4, a5 uintptr) (int, syscall.Errno) { + fd, _, err := Syscall(SYS_SOCKETCALL, uintptr(call), uintptr(unsafe.Pointer(&a0)), 0) + return int(fd), err +} + +func rawsocketcall(call int, a0, a1, a2, a3, a4, a5 uintptr) (int, syscall.Errno) { + fd, _, err := RawSyscall(SYS_SOCKETCALL, uintptr(call), uintptr(unsafe.Pointer(&a0)), 0) + return int(fd), err +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_gccgo_arm.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_gccgo_arm.go new file mode 100644 index 00000000..aa7fc9e1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_gccgo_arm.go @@ -0,0 +1,20 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build linux,gccgo,arm + +package unix + +import ( + "syscall" + "unsafe" +) + +func seek(fd int, offset int64, whence int) (int64, syscall.Errno) { + var newoffset int64 + offsetLow := uint32(offset & 0xffffffff) + offsetHigh := uint32((offset >> 32) & 0xffffffff) + _, _, err := Syscall6(SYS__LLSEEK, uintptr(fd), uintptr(offsetHigh), uintptr(offsetLow), uintptr(unsafe.Pointer(&newoffset)), uintptr(whence), 0) + return newoffset, err +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go new file mode 100644 index 00000000..ad991031 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go @@ -0,0 +1,214 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build linux +// +build mips64 mips64le + +package unix + +//sys Dup2(oldfd int, newfd int) (err error) +//sysnb EpollCreate(size int) (fd int, err error) +//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) +//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64 +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = SYS_NEWFSTATAT +//sys Fstatfs(fd int, buf *Statfs_t) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (euid int) +//sysnb Getgid() (gid int) +//sysnb Getrlimit(resource int, rlim *Rlimit) (err error) +//sysnb Getuid() (uid int) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Listen(s int, n int) (err error) +//sys Pause() (err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + var ts *Timespec + if timeout != nil { + ts = &Timespec{Sec: timeout.Sec, Nsec: timeout.Usec * 1000} + } + return Pselect(nfd, r, w, e, ts, nil) +} + +//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) +//sys Setfsgid(gid int) (err error) +//sys Setfsuid(uid int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) +//sysnb Setresuid(ruid int, euid int, suid int) (err error) +//sysnb Setrlimit(resource int, rlim *Rlimit) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sys Shutdown(fd int, how int) (err error) +//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) +//sys Statfs(path string, buf *Statfs_t) (err error) +//sys SyncFileRange(fd int, off int64, n int64, flags int) (err error) +//sys Truncate(path string, length int64) (err error) +//sys Ustat(dev int, ubuf *Ustat_t) (err error) +//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) +//sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) +//sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) +//sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) +//sysnb getgroups(n int, list *_Gid_t) (nn int, err error) +//sysnb setgroups(n int, list *_Gid_t) (err error) +//sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) +//sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) +//sysnb socket(domain int, typ int, proto int) (fd int, err error) +//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) +//sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) +//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) +//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) + +//sys futimesat(dirfd int, path string, times *[2]Timeval) (err error) +//sysnb Gettimeofday(tv *Timeval) (err error) + +func Time(t *Time_t) (tt Time_t, err error) { + var tv Timeval + err = Gettimeofday(&tv) + if err != nil { + return 0, err + } + if t != nil { + *t = Time_t(tv.Sec) + } + return Time_t(tv.Sec), nil +} + +//sys Utime(path string, buf *Utimbuf) (err error) +//sys utimes(path string, times *[2]Timeval) (err error) + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: nsec} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: usec} +} + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, 0) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +//sysnb pipe2(p *[2]_C_int, flags int) (err error) + +func Pipe2(p []int, flags int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, flags) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +func Ioperm(from int, num int, on int) (err error) { + return ENOSYS +} + +func Iopl(level int) (err error) { + return ENOSYS +} + +type stat_t struct { + Dev uint32 + Pad0 [3]int32 + Ino uint64 + Mode uint32 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev uint32 + Pad1 [3]uint32 + Size int64 + Atime uint32 + Atime_nsec uint32 + Mtime uint32 + Mtime_nsec uint32 + Ctime uint32 + Ctime_nsec uint32 + Blksize uint32 + Pad2 uint32 + Blocks int64 +} + +//sys fstat(fd int, st *stat_t) (err error) +//sys lstat(path string, st *stat_t) (err error) +//sys stat(path string, st *stat_t) (err error) + +func Fstat(fd int, s *Stat_t) (err error) { + st := &stat_t{} + err = fstat(fd, st) + fillStat_t(s, st) + return +} + +func Lstat(path string, s *Stat_t) (err error) { + st := &stat_t{} + err = lstat(path, st) + fillStat_t(s, st) + return +} + +func Stat(path string, s *Stat_t) (err error) { + st := &stat_t{} + err = stat(path, st) + fillStat_t(s, st) + return +} + +func fillStat_t(s *Stat_t, st *stat_t) { + s.Dev = st.Dev + s.Ino = st.Ino + s.Mode = st.Mode + s.Nlink = st.Nlink + s.Uid = st.Uid + s.Gid = st.Gid + s.Rdev = st.Rdev + s.Size = st.Size + s.Atim = Timespec{int64(st.Atime), int64(st.Atime_nsec)} + s.Mtim = Timespec{int64(st.Mtime), int64(st.Mtime_nsec)} + s.Ctim = Timespec{int64(st.Ctime), int64(st.Ctime_nsec)} + s.Blksize = st.Blksize + s.Blocks = st.Blocks +} + +func (r *PtraceRegs) PC() uint64 { return r.Epc } + +func (r *PtraceRegs) SetPC(pc uint64) { r.Epc = pc } + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint64(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint64(length) +} + +//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) + +func Poll(fds []PollFd, timeout int) (n int, err error) { + if len(fds) == 0 { + return poll(nil, 0, timeout) + } + return poll(&fds[0], len(fds), timeout) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go new file mode 100644 index 00000000..99e0e999 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go @@ -0,0 +1,233 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build linux +// +build mips mipsle + +package unix + +import ( + "syscall" + "unsafe" +) + +func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) + +//sys Dup2(oldfd int, newfd int) (err error) +//sysnb EpollCreate(size int) (fd int, err error) +//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) +//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64 +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Ftruncate(fd int, length int64) (err error) = SYS_FTRUNCATE64 +//sysnb Getegid() (egid int) +//sysnb Geteuid() (euid int) +//sysnb Getgid() (gid int) +//sysnb Getuid() (uid int) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Listen(s int, n int) (err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT +//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64 +//sys Setfsgid(gid int) (err error) +//sys Setfsuid(uid int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) +//sysnb Setresuid(ruid int, euid int, suid int) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sys Shutdown(fd int, how int) (err error) +//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) +//sys SyncFileRange(fd int, off int64, n int64, flags int) (err error) +//sys Truncate(path string, length int64) (err error) = SYS_TRUNCATE64 +//sys Ustat(dev int, ubuf *Ustat_t) (err error) +//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) +//sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) +//sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) +//sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) +//sysnb getgroups(n int, list *_Gid_t) (nn int, err error) +//sysnb setgroups(n int, list *_Gid_t) (err error) +//sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) +//sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) +//sysnb socket(domain int, typ int, proto int) (fd int, err error) +//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) +//sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) +//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) +//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) + +//sysnb InotifyInit() (fd int, err error) +//sys Ioperm(from int, num int, on int) (err error) +//sys Iopl(level int) (err error) + +//sys futimesat(dirfd int, path string, times *[2]Timeval) (err error) +//sysnb Gettimeofday(tv *Timeval) (err error) +//sysnb Time(t *Time_t) (tt Time_t, err error) +//sys Utime(path string, buf *Utimbuf) (err error) +//sys utimes(path string, times *[2]Timeval) (err error) + +//sys Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64 +//sys Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64 +//sys Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = SYS_FSTATAT64 +//sys Stat(path string, stat *Stat_t) (err error) = SYS_STAT64 + +//sys Pause() (err error) + +func Fstatfs(fd int, buf *Statfs_t) (err error) { + _, _, e := Syscall(SYS_FSTATFS64, uintptr(fd), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf))) + if e != 0 { + err = errnoErr(e) + } + return +} + +func Statfs(path string, buf *Statfs_t) (err error) { + p, err := BytePtrFromString(path) + if err != nil { + return err + } + _, _, e := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(p)), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf))) + if e != 0 { + err = errnoErr(e) + } + return +} + +func Seek(fd int, offset int64, whence int) (off int64, err error) { + _, _, e := Syscall6(SYS__LLSEEK, uintptr(fd), uintptr(offset>>32), uintptr(offset), uintptr(unsafe.Pointer(&off)), uintptr(whence), 0) + if e != 0 { + err = errnoErr(e) + } + return +} + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: int32(sec), Nsec: int32(nsec)} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: int32(sec), Usec: int32(usec)} +} + +//sysnb pipe2(p *[2]_C_int, flags int) (err error) + +func Pipe2(p []int, flags int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, flags) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +//sysnb pipe() (p1 int, p2 int, err error) + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + p[0], p[1], err = pipe() + return +} + +//sys mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error) + +func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + page := uintptr(offset / 4096) + if offset != int64(page)*4096 { + return 0, EINVAL + } + return mmap2(addr, length, prot, flags, fd, page) +} + +const rlimInf32 = ^uint32(0) +const rlimInf64 = ^uint64(0) + +type rlimit32 struct { + Cur uint32 + Max uint32 +} + +//sysnb getrlimit(resource int, rlim *rlimit32) (err error) = SYS_GETRLIMIT + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + err = prlimit(0, resource, nil, rlim) + if err != ENOSYS { + return err + } + + rl := rlimit32{} + err = getrlimit(resource, &rl) + if err != nil { + return + } + + if rl.Cur == rlimInf32 { + rlim.Cur = rlimInf64 + } else { + rlim.Cur = uint64(rl.Cur) + } + + if rl.Max == rlimInf32 { + rlim.Max = rlimInf64 + } else { + rlim.Max = uint64(rl.Max) + } + return +} + +//sysnb setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT + +func Setrlimit(resource int, rlim *Rlimit) (err error) { + err = prlimit(0, resource, rlim, nil) + if err != ENOSYS { + return err + } + + rl := rlimit32{} + if rlim.Cur == rlimInf64 { + rl.Cur = rlimInf32 + } else if rlim.Cur < uint64(rlimInf32) { + rl.Cur = uint32(rlim.Cur) + } else { + return EINVAL + } + if rlim.Max == rlimInf64 { + rl.Max = rlimInf32 + } else if rlim.Max < uint64(rlimInf32) { + rl.Max = uint32(rlim.Max) + } else { + return EINVAL + } + + return setrlimit(resource, &rl) +} + +func (r *PtraceRegs) PC() uint64 { return r.Epc } + +func (r *PtraceRegs) SetPC(pc uint64) { r.Epc = pc } + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint32(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) + +func Poll(fds []PollFd, timeout int) (n int, err error) { + if len(fds) == 0 { + return poll(nil, 0, timeout) + } + return poll(&fds[0], len(fds), timeout) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go new file mode 100644 index 00000000..41451854 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go @@ -0,0 +1,151 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build linux +// +build ppc64 ppc64le + +package unix + +//sys Dup2(oldfd int, newfd int) (err error) +//sysnb EpollCreate(size int) (fd int, err error) +//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) +//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64 +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Fstat(fd int, stat *Stat_t) (err error) +//sys Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = SYS_NEWFSTATAT +//sys Fstatfs(fd int, buf *Statfs_t) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (euid int) +//sysnb Getgid() (gid int) +//sysnb Getrlimit(resource int, rlim *Rlimit) (err error) = SYS_UGETRLIMIT +//sysnb Getuid() (uid int) +//sysnb InotifyInit() (fd int, err error) +//sys Ioperm(from int, num int, on int) (err error) +//sys Iopl(level int) (err error) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Listen(s int, n int) (err error) +//sys Lstat(path string, stat *Stat_t) (err error) +//sys Pause() (err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK +//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT +//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) +//sys Setfsgid(gid int) (err error) +//sys Setfsuid(uid int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) +//sysnb Setresuid(ruid int, euid int, suid int) (err error) +//sysnb Setrlimit(resource int, rlim *Rlimit) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sys Shutdown(fd int, how int) (err error) +//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) +//sys Stat(path string, stat *Stat_t) (err error) +//sys Statfs(path string, buf *Statfs_t) (err error) +//sys Truncate(path string, length int64) (err error) +//sys Ustat(dev int, ubuf *Ustat_t) (err error) +//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) +//sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) +//sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) +//sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) +//sysnb getgroups(n int, list *_Gid_t) (nn int, err error) +//sysnb setgroups(n int, list *_Gid_t) (err error) +//sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) +//sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) +//sysnb socket(domain int, typ int, proto int) (fd int, err error) +//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) +//sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) +//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) +//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) + +//sys futimesat(dirfd int, path string, times *[2]Timeval) (err error) +//sysnb Gettimeofday(tv *Timeval) (err error) +//sysnb Time(t *Time_t) (tt Time_t, err error) +//sys Utime(path string, buf *Utimbuf) (err error) +//sys utimes(path string, times *[2]Timeval) (err error) + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: nsec} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: usec} +} + +func (r *PtraceRegs) PC() uint64 { return r.Nip } + +func (r *PtraceRegs) SetPC(pc uint64) { r.Nip = pc } + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint64(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint64(length) +} + +//sysnb pipe(p *[2]_C_int) (err error) + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe(&pp) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +//sysnb pipe2(p *[2]_C_int, flags int) (err error) + +func Pipe2(p []int, flags int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, flags) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) + +func Poll(fds []PollFd, timeout int) (n int, err error) { + if len(fds) == 0 { + return poll(nil, 0, timeout) + } + return poll(&fds[0], len(fds), timeout) +} + +//sys syncFileRange2(fd int, flags int, off int64, n int64) (err error) = SYS_SYNC_FILE_RANGE2 + +func SyncFileRange(fd int, off int64, n int64, flags int) error { + // The sync_file_range and sync_file_range2 syscalls differ only in the + // order of their arguments. + return syncFileRange2(fd, flags, off, n) +} + +//sys kexecFileLoad(kernelFd int, initrdFd int, cmdlineLen int, cmdline string, flags int) (err error) + +func KexecFileLoad(kernelFd int, initrdFd int, cmdline string, flags int) error { + cmdlineLen := len(cmdline) + if cmdlineLen > 0 { + // Account for the additional NULL byte added by + // BytePtrFromString in kexecFileLoad. The kexec_file_load + // syscall expects a NULL-terminated string. + cmdlineLen++ + } + return kexecFileLoad(kernelFd, initrdFd, cmdlineLen, cmdline, flags) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go new file mode 100644 index 00000000..512077fe --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go @@ -0,0 +1,212 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build riscv64,linux + +package unix + +import "unsafe" + +func EpollCreate(size int) (fd int, err error) { + if size <= 0 { + return -1, EINVAL + } + return EpollCreate1(0) +} + +//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) = SYS_EPOLL_PWAIT +//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64 +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Fstat(fd int, stat *Stat_t) (err error) +//sys Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) +//sys Fstatfs(fd int, buf *Statfs_t) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (euid int) +//sysnb Getgid() (gid int) +//sysnb Getrlimit(resource int, rlim *Rlimit) (err error) +//sysnb Getuid() (uid int) +//sys Listen(s int, n int) (err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + var ts *Timespec + if timeout != nil { + ts = &Timespec{Sec: timeout.Sec, Nsec: timeout.Usec * 1000} + } + return Pselect(nfd, r, w, e, ts, nil) +} + +//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) +//sys Setfsgid(gid int) (err error) +//sys Setfsuid(uid int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) +//sysnb Setresuid(ruid int, euid int, suid int) (err error) +//sysnb Setrlimit(resource int, rlim *Rlimit) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sys Shutdown(fd int, how int) (err error) +//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) + +func Stat(path string, stat *Stat_t) (err error) { + return Fstatat(AT_FDCWD, path, stat, 0) +} + +func Lchown(path string, uid int, gid int) (err error) { + return Fchownat(AT_FDCWD, path, uid, gid, AT_SYMLINK_NOFOLLOW) +} + +func Lstat(path string, stat *Stat_t) (err error) { + return Fstatat(AT_FDCWD, path, stat, AT_SYMLINK_NOFOLLOW) +} + +//sys Statfs(path string, buf *Statfs_t) (err error) +//sys SyncFileRange(fd int, off int64, n int64, flags int) (err error) +//sys Truncate(path string, length int64) (err error) + +func Ustat(dev int, ubuf *Ustat_t) (err error) { + return ENOSYS +} + +//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) +//sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) +//sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) +//sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) +//sysnb getgroups(n int, list *_Gid_t) (nn int, err error) +//sysnb setgroups(n int, list *_Gid_t) (err error) +//sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) +//sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) +//sysnb socket(domain int, typ int, proto int) (fd int, err error) +//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) +//sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) +//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) +//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) + +//sysnb Gettimeofday(tv *Timeval) (err error) + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: nsec} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: usec} +} + +func futimesat(dirfd int, path string, tv *[2]Timeval) (err error) { + if tv == nil { + return utimensat(dirfd, path, nil, 0) + } + + ts := []Timespec{ + NsecToTimespec(TimevalToNsec(tv[0])), + NsecToTimespec(TimevalToNsec(tv[1])), + } + return utimensat(dirfd, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0) +} + +func Time(t *Time_t) (Time_t, error) { + var tv Timeval + err := Gettimeofday(&tv) + if err != nil { + return 0, err + } + if t != nil { + *t = Time_t(tv.Sec) + } + return Time_t(tv.Sec), nil +} + +func Utime(path string, buf *Utimbuf) error { + tv := []Timeval{ + {Sec: buf.Actime}, + {Sec: buf.Modtime}, + } + return Utimes(path, tv) +} + +func utimes(path string, tv *[2]Timeval) (err error) { + if tv == nil { + return utimensat(AT_FDCWD, path, nil, 0) + } + + ts := []Timespec{ + NsecToTimespec(TimevalToNsec(tv[0])), + NsecToTimespec(TimevalToNsec(tv[1])), + } + return utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0) +} + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, 0) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +//sysnb pipe2(p *[2]_C_int, flags int) (err error) + +func Pipe2(p []int, flags int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, flags) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +func (r *PtraceRegs) PC() uint64 { return r.Pc } + +func (r *PtraceRegs) SetPC(pc uint64) { r.Pc = pc } + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint64(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint64(length) +} + +func InotifyInit() (fd int, err error) { + return InotifyInit1(0) +} + +func Dup2(oldfd int, newfd int) (err error) { + return Dup3(oldfd, newfd, 0) +} + +func Pause() (err error) { + _, _, e1 := Syscall6(SYS_PPOLL, 0, 0, 0, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +func Poll(fds []PollFd, timeout int) (n int, err error) { + var ts *Timespec + if timeout >= 0 { + ts = new(Timespec) + *ts = NsecToTimespec(int64(timeout) * 1e6) + } + if len(fds) == 0 { + return ppoll(nil, 0, ts, nil) + } + return ppoll(&fds[0], len(fds), ts, nil) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go new file mode 100644 index 00000000..f52f148f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go @@ -0,0 +1,337 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build s390x,linux + +package unix + +import ( + "unsafe" +) + +//sys Dup2(oldfd int, newfd int) (err error) +//sysnb EpollCreate(size int) (fd int, err error) +//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) +//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64 +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Fstat(fd int, stat *Stat_t) (err error) +//sys Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = SYS_NEWFSTATAT +//sys Fstatfs(fd int, buf *Statfs_t) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (euid int) +//sysnb Getgid() (gid int) +//sysnb Getrlimit(resource int, rlim *Rlimit) (err error) +//sysnb Getuid() (uid int) +//sysnb InotifyInit() (fd int, err error) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Lstat(path string, stat *Stat_t) (err error) +//sys Pause() (err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK +//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) +//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) +//sys Setfsgid(gid int) (err error) +//sys Setfsuid(uid int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) +//sysnb Setresuid(ruid int, euid int, suid int) (err error) +//sysnb Setrlimit(resource int, rlim *Rlimit) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) +//sys Stat(path string, stat *Stat_t) (err error) +//sys Statfs(path string, buf *Statfs_t) (err error) +//sys SyncFileRange(fd int, off int64, n int64, flags int) (err error) +//sys Truncate(path string, length int64) (err error) +//sys Ustat(dev int, ubuf *Ustat_t) (err error) +//sysnb getgroups(n int, list *_Gid_t) (nn int, err error) +//sysnb setgroups(n int, list *_Gid_t) (err error) + +//sys futimesat(dirfd int, path string, times *[2]Timeval) (err error) +//sysnb Gettimeofday(tv *Timeval) (err error) + +func Time(t *Time_t) (tt Time_t, err error) { + var tv Timeval + err = Gettimeofday(&tv) + if err != nil { + return 0, err + } + if t != nil { + *t = Time_t(tv.Sec) + } + return Time_t(tv.Sec), nil +} + +//sys Utime(path string, buf *Utimbuf) (err error) +//sys utimes(path string, times *[2]Timeval) (err error) + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: nsec} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: usec} +} + +//sysnb pipe2(p *[2]_C_int, flags int) (err error) + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, 0) // pipe2 is the same as pipe when flags are set to 0. + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +func Pipe2(p []int, flags int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, flags) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +func Ioperm(from int, num int, on int) (err error) { + return ENOSYS +} + +func Iopl(level int) (err error) { + return ENOSYS +} + +func (r *PtraceRegs) PC() uint64 { return r.Psw.Addr } + +func (r *PtraceRegs) SetPC(pc uint64) { r.Psw.Addr = pc } + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint64(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint64(length) +} + +// Linux on s390x uses the old mmap interface, which requires arguments to be passed in a struct. +// mmap2 also requires arguments to be passed in a struct; it is currently not exposed in . +func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + mmap_args := [6]uintptr{addr, length, uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)} + r0, _, e1 := Syscall(SYS_MMAP, uintptr(unsafe.Pointer(&mmap_args[0])), 0, 0) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// On s390x Linux, all the socket calls go through an extra indirection. +// The arguments to the underlying system call (SYS_SOCKETCALL) are the +// number below and a pointer to an array of uintptr. +const ( + // see linux/net.h + netSocket = 1 + netBind = 2 + netConnect = 3 + netListen = 4 + netAccept = 5 + netGetSockName = 6 + netGetPeerName = 7 + netSocketPair = 8 + netSend = 9 + netRecv = 10 + netSendTo = 11 + netRecvFrom = 12 + netShutdown = 13 + netSetSockOpt = 14 + netGetSockOpt = 15 + netSendMsg = 16 + netRecvMsg = 17 + netAccept4 = 18 + netRecvMMsg = 19 + netSendMMsg = 20 +) + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (int, error) { + args := [3]uintptr{uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))} + fd, _, err := Syscall(SYS_SOCKETCALL, netAccept, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return 0, err + } + return int(fd), nil +} + +func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (int, error) { + args := [4]uintptr{uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags)} + fd, _, err := Syscall(SYS_SOCKETCALL, netAccept4, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return 0, err + } + return int(fd), nil +} + +func getsockname(s int, rsa *RawSockaddrAny, addrlen *_Socklen) error { + args := [3]uintptr{uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))} + _, _, err := RawSyscall(SYS_SOCKETCALL, netGetSockName, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return err + } + return nil +} + +func getpeername(s int, rsa *RawSockaddrAny, addrlen *_Socklen) error { + args := [3]uintptr{uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))} + _, _, err := RawSyscall(SYS_SOCKETCALL, netGetPeerName, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return err + } + return nil +} + +func socketpair(domain int, typ int, flags int, fd *[2]int32) error { + args := [4]uintptr{uintptr(domain), uintptr(typ), uintptr(flags), uintptr(unsafe.Pointer(fd))} + _, _, err := RawSyscall(SYS_SOCKETCALL, netSocketPair, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return err + } + return nil +} + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) error { + args := [3]uintptr{uintptr(s), uintptr(addr), uintptr(addrlen)} + _, _, err := Syscall(SYS_SOCKETCALL, netBind, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return err + } + return nil +} + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) error { + args := [3]uintptr{uintptr(s), uintptr(addr), uintptr(addrlen)} + _, _, err := Syscall(SYS_SOCKETCALL, netConnect, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return err + } + return nil +} + +func socket(domain int, typ int, proto int) (int, error) { + args := [3]uintptr{uintptr(domain), uintptr(typ), uintptr(proto)} + fd, _, err := RawSyscall(SYS_SOCKETCALL, netSocket, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return 0, err + } + return int(fd), nil +} + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) error { + args := [5]uintptr{uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen))} + _, _, err := Syscall(SYS_SOCKETCALL, netGetSockOpt, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return err + } + return nil +} + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) error { + args := [4]uintptr{uintptr(s), uintptr(level), uintptr(name), uintptr(val)} + _, _, err := Syscall(SYS_SOCKETCALL, netSetSockOpt, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return err + } + return nil +} + +func recvfrom(s int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (int, error) { + var base uintptr + if len(p) > 0 { + base = uintptr(unsafe.Pointer(&p[0])) + } + args := [6]uintptr{uintptr(s), base, uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))} + n, _, err := Syscall(SYS_SOCKETCALL, netRecvFrom, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return 0, err + } + return int(n), nil +} + +func sendto(s int, p []byte, flags int, to unsafe.Pointer, addrlen _Socklen) error { + var base uintptr + if len(p) > 0 { + base = uintptr(unsafe.Pointer(&p[0])) + } + args := [6]uintptr{uintptr(s), base, uintptr(len(p)), uintptr(flags), uintptr(to), uintptr(addrlen)} + _, _, err := Syscall(SYS_SOCKETCALL, netSendTo, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return err + } + return nil +} + +func recvmsg(s int, msg *Msghdr, flags int) (int, error) { + args := [3]uintptr{uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)} + n, _, err := Syscall(SYS_SOCKETCALL, netRecvMsg, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return 0, err + } + return int(n), nil +} + +func sendmsg(s int, msg *Msghdr, flags int) (int, error) { + args := [3]uintptr{uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)} + n, _, err := Syscall(SYS_SOCKETCALL, netSendMsg, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return 0, err + } + return int(n), nil +} + +func Listen(s int, n int) error { + args := [2]uintptr{uintptr(s), uintptr(n)} + _, _, err := Syscall(SYS_SOCKETCALL, netListen, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return err + } + return nil +} + +func Shutdown(s, how int) error { + args := [2]uintptr{uintptr(s), uintptr(how)} + _, _, err := Syscall(SYS_SOCKETCALL, netShutdown, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return err + } + return nil +} + +//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) + +func Poll(fds []PollFd, timeout int) (n int, err error) { + if len(fds) == 0 { + return poll(nil, 0, timeout) + } + return poll(&fds[0], len(fds), timeout) +} + +//sys kexecFileLoad(kernelFd int, initrdFd int, cmdlineLen int, cmdline string, flags int) (err error) + +func KexecFileLoad(kernelFd int, initrdFd int, cmdline string, flags int) error { + cmdlineLen := len(cmdline) + if cmdlineLen > 0 { + // Account for the additional NULL byte added by + // BytePtrFromString in kexecFileLoad. The kexec_file_load + // syscall expects a NULL-terminated string. + cmdlineLen++ + } + return kexecFileLoad(kernelFd, initrdFd, cmdlineLen, cmdline, flags) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go new file mode 100644 index 00000000..72e64187 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go @@ -0,0 +1,146 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build sparc64,linux + +package unix + +//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) +//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64 +//sys Dup2(oldfd int, newfd int) (err error) +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Fstat(fd int, stat *Stat_t) (err error) +//sys Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = SYS_FSTATAT64 +//sys Fstatfs(fd int, buf *Statfs_t) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (euid int) +//sysnb Getgid() (gid int) +//sysnb Getrlimit(resource int, rlim *Rlimit) (err error) +//sysnb Getuid() (uid int) +//sysnb InotifyInit() (fd int, err error) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Listen(s int, n int) (err error) +//sys Lstat(path string, stat *Stat_t) (err error) +//sys Pause() (err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK +//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) +//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) +//sys Setfsgid(gid int) (err error) +//sys Setfsuid(uid int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) +//sysnb Setresuid(ruid int, euid int, suid int) (err error) +//sysnb Setrlimit(resource int, rlim *Rlimit) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sys Shutdown(fd int, how int) (err error) +//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) +//sys Stat(path string, stat *Stat_t) (err error) +//sys Statfs(path string, buf *Statfs_t) (err error) +//sys SyncFileRange(fd int, off int64, n int64, flags int) (err error) +//sys Truncate(path string, length int64) (err error) +//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) +//sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) +//sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) +//sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) +//sysnb getgroups(n int, list *_Gid_t) (nn int, err error) +//sysnb setgroups(n int, list *_Gid_t) (err error) +//sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) +//sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) +//sysnb socket(domain int, typ int, proto int) (fd int, err error) +//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) +//sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) +//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) +//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) + +func Ioperm(from int, num int, on int) (err error) { + return ENOSYS +} + +func Iopl(level int) (err error) { + return ENOSYS +} + +//sys futimesat(dirfd int, path string, times *[2]Timeval) (err error) +//sysnb Gettimeofday(tv *Timeval) (err error) + +func Time(t *Time_t) (tt Time_t, err error) { + var tv Timeval + err = Gettimeofday(&tv) + if err != nil { + return 0, err + } + if t != nil { + *t = Time_t(tv.Sec) + } + return Time_t(tv.Sec), nil +} + +//sys Utime(path string, buf *Utimbuf) (err error) +//sys utimes(path string, times *[2]Timeval) (err error) + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: nsec} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: int32(usec)} +} + +func (r *PtraceRegs) PC() uint64 { return r.Tpc } + +func (r *PtraceRegs) SetPC(pc uint64) { r.Tpc = pc } + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint64(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint64(length) +} + +//sysnb pipe(p *[2]_C_int) (err error) + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe(&pp) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +//sysnb pipe2(p *[2]_C_int, flags int) (err error) + +func Pipe2(p []int, flags int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, flags) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) + +func Poll(fds []PollFd, timeout int) (n int, err error) { + if len(fds) == 0 { + return poll(nil, 0, timeout) + } + return poll(&fds[0], len(fds), timeout) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_netbsd.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_netbsd.go new file mode 100644 index 00000000..206ce2af --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_netbsd.go @@ -0,0 +1,597 @@ +// Copyright 2009,2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// NetBSD system calls. +// This file is compiled as ordinary Go code, +// but it is also input to mksyscall, +// which parses the //sys lines and generates system call stubs. +// Note that sometimes we use a lowercase //sys name and wrap +// it in our own nicer implementation, either here or in +// syscall_bsd.go or syscall_unix.go. + +package unix + +import ( + "syscall" + "unsafe" +) + +// SockaddrDatalink implements the Sockaddr interface for AF_LINK type sockets. +type SockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [12]int8 + raw RawSockaddrDatalink +} + +func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) + +func sysctlNodes(mib []_C_int) (nodes []Sysctlnode, err error) { + var olen uintptr + + // Get a list of all sysctl nodes below the given MIB by performing + // a sysctl for the given MIB with CTL_QUERY appended. + mib = append(mib, CTL_QUERY) + qnode := Sysctlnode{Flags: SYSCTL_VERS_1} + qp := (*byte)(unsafe.Pointer(&qnode)) + sz := unsafe.Sizeof(qnode) + if err = sysctl(mib, nil, &olen, qp, sz); err != nil { + return nil, err + } + + // Now that we know the size, get the actual nodes. + nodes = make([]Sysctlnode, olen/sz) + np := (*byte)(unsafe.Pointer(&nodes[0])) + if err = sysctl(mib, np, &olen, qp, sz); err != nil { + return nil, err + } + + return nodes, nil +} + +func nametomib(name string) (mib []_C_int, err error) { + // Split name into components. + var parts []string + last := 0 + for i := 0; i < len(name); i++ { + if name[i] == '.' { + parts = append(parts, name[last:i]) + last = i + 1 + } + } + parts = append(parts, name[last:]) + + // Discover the nodes and construct the MIB OID. + for partno, part := range parts { + nodes, err := sysctlNodes(mib) + if err != nil { + return nil, err + } + for _, node := range nodes { + n := make([]byte, 0) + for i := range node.Name { + if node.Name[i] != 0 { + n = append(n, byte(node.Name[i])) + } + } + if string(n) == part { + mib = append(mib, _C_int(node.Num)) + break + } + } + if len(mib) != partno+1 { + return nil, EINVAL + } + } + + return mib, nil +} + +func SysctlClockinfo(name string) (*Clockinfo, error) { + mib, err := sysctlmib(name) + if err != nil { + return nil, err + } + + n := uintptr(SizeofClockinfo) + var ci Clockinfo + if err := sysctl(mib, (*byte)(unsafe.Pointer(&ci)), &n, nil, 0); err != nil { + return nil, err + } + if n != SizeofClockinfo { + return nil, EIO + } + return &ci, nil +} + +//sysnb pipe() (fd1 int, fd2 int, err error) +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + p[0], p[1], err = pipe() + return +} + +//sys getdents(fd int, buf []byte) (n int, err error) +func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { + return getdents(fd, buf) +} + +const ImplementsGetwd = true + +//sys Getcwd(buf []byte) (n int, err error) = SYS___GETCWD + +func Getwd() (string, error) { + var buf [PathMax]byte + _, err := Getcwd(buf[0:]) + if err != nil { + return "", err + } + n := clen(buf[:]) + if n < 1 { + return "", EINVAL + } + return string(buf[:n]), nil +} + +// TODO +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + return -1, ENOSYS +} + +func setattrlistTimes(path string, times []Timespec, flags int) error { + // used on Darwin for UtimesNano + return ENOSYS +} + +//sys ioctl(fd int, req uint, arg uintptr) (err error) + +// ioctl itself should not be exposed directly, but additional get/set +// functions for specific types are permissible. + +// IoctlSetInt performs an ioctl operation which sets an integer value +// on fd, using the specified request number. +func IoctlSetInt(fd int, req uint, value int) error { + return ioctl(fd, req, uintptr(value)) +} + +func ioctlSetWinsize(fd int, req uint, value *Winsize) error { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +func ioctlSetTermios(fd int, req uint, value *Termios) error { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +// IoctlGetInt performs an ioctl operation which gets an integer value +// from fd, using the specified request number. +func IoctlGetInt(fd int, req uint) (int, error) { + var value int + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return value, err +} + +func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { + var value Winsize + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func IoctlGetTermios(fd int, req uint) (*Termios, error) { + var value Termios + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func Uname(uname *Utsname) error { + mib := []_C_int{CTL_KERN, KERN_OSTYPE} + n := unsafe.Sizeof(uname.Sysname) + if err := sysctl(mib, &uname.Sysname[0], &n, nil, 0); err != nil { + return err + } + + mib = []_C_int{CTL_KERN, KERN_HOSTNAME} + n = unsafe.Sizeof(uname.Nodename) + if err := sysctl(mib, &uname.Nodename[0], &n, nil, 0); err != nil { + return err + } + + mib = []_C_int{CTL_KERN, KERN_OSRELEASE} + n = unsafe.Sizeof(uname.Release) + if err := sysctl(mib, &uname.Release[0], &n, nil, 0); err != nil { + return err + } + + mib = []_C_int{CTL_KERN, KERN_VERSION} + n = unsafe.Sizeof(uname.Version) + if err := sysctl(mib, &uname.Version[0], &n, nil, 0); err != nil { + return err + } + + // The version might have newlines or tabs in it, convert them to + // spaces. + for i, b := range uname.Version { + if b == '\n' || b == '\t' { + if i == len(uname.Version)-1 { + uname.Version[i] = 0 + } else { + uname.Version[i] = ' ' + } + } + } + + mib = []_C_int{CTL_HW, HW_MACHINE} + n = unsafe.Sizeof(uname.Machine) + if err := sysctl(mib, &uname.Machine[0], &n, nil, 0); err != nil { + return err + } + + return nil +} + +/* + * Exposed directly + */ +//sys Access(path string, mode uint32) (err error) +//sys Adjtime(delta *Timeval, olddelta *Timeval) (err error) +//sys Chdir(path string) (err error) +//sys Chflags(path string, flags int) (err error) +//sys Chmod(path string, mode uint32) (err error) +//sys Chown(path string, uid int, gid int) (err error) +//sys Chroot(path string) (err error) +//sys Close(fd int) (err error) +//sys Dup(fd int) (nfd int, err error) +//sys Dup2(from int, to int) (err error) +//sys Exit(code int) +//sys ExtattrGetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) +//sys ExtattrSetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) +//sys ExtattrDeleteFd(fd int, attrnamespace int, attrname string) (err error) +//sys ExtattrListFd(fd int, attrnamespace int, data uintptr, nbytes int) (ret int, err error) +//sys ExtattrGetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) +//sys ExtattrSetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) +//sys ExtattrDeleteFile(file string, attrnamespace int, attrname string) (err error) +//sys ExtattrListFile(file string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) +//sys ExtattrGetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) +//sys ExtattrSetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) +//sys ExtattrDeleteLink(link string, attrnamespace int, attrname string) (err error) +//sys ExtattrListLink(link string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) +//sys Faccessat(dirfd int, path string, mode uint32, flags int) (err error) +//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_POSIX_FADVISE +//sys Fchdir(fd int) (err error) +//sys Fchflags(fd int, flags int) (err error) +//sys Fchmod(fd int, mode uint32) (err error) +//sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Flock(fd int, how int) (err error) +//sys Fpathconf(fd int, name int) (val int, err error) +//sys Fstat(fd int, stat *Stat_t) (err error) +//sys Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) +//sys Fsync(fd int) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (uid int) +//sysnb Getgid() (gid int) +//sysnb Getpgid(pid int) (pgid int, err error) +//sysnb Getpgrp() (pgrp int) +//sysnb Getpid() (pid int) +//sysnb Getppid() (ppid int) +//sys Getpriority(which int, who int) (prio int, err error) +//sysnb Getrlimit(which int, lim *Rlimit) (err error) +//sysnb Getrusage(who int, rusage *Rusage) (err error) +//sysnb Getsid(pid int) (sid int, err error) +//sysnb Gettimeofday(tv *Timeval) (err error) +//sysnb Getuid() (uid int) +//sys Issetugid() (tainted bool) +//sys Kill(pid int, signum syscall.Signal) (err error) +//sys Kqueue() (fd int, err error) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Link(path string, link string) (err error) +//sys Listen(s int, backlog int) (err error) +//sys Lstat(path string, stat *Stat_t) (err error) +//sys Mkdir(path string, mode uint32) (err error) +//sys Mkfifo(path string, mode uint32) (err error) +//sys Mknod(path string, mode uint32, dev int) (err error) +//sys Nanosleep(time *Timespec, leftover *Timespec) (err error) +//sys Open(path string, mode int, perm uint32) (fd int, err error) +//sys Pathconf(path string, name int) (val int, err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) +//sys read(fd int, p []byte) (n int, err error) +//sys Readlink(path string, buf []byte) (n int, err error) +//sys Rename(from string, to string) (err error) +//sys Revoke(path string) (err error) +//sys Rmdir(path string) (err error) +//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK +//sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) +//sysnb Setegid(egid int) (err error) +//sysnb Seteuid(euid int) (err error) +//sysnb Setgid(gid int) (err error) +//sysnb Setpgid(pid int, pgid int) (err error) +//sys Setpriority(which int, who int, prio int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sysnb Setrlimit(which int, lim *Rlimit) (err error) +//sysnb Setsid() (pid int, err error) +//sysnb Settimeofday(tp *Timeval) (err error) +//sysnb Setuid(uid int) (err error) +//sys Stat(path string, stat *Stat_t) (err error) +//sys Symlink(path string, link string) (err error) +//sys Sync() (err error) +//sys Truncate(path string, length int64) (err error) +//sys Umask(newmask int) (oldmask int) +//sys Unlink(path string) (err error) +//sys Unmount(path string, flags int) (err error) +//sys write(fd int, p []byte) (n int, err error) +//sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) +//sys munmap(addr uintptr, length uintptr) (err error) +//sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ +//sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE +//sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) + +/* + * Unimplemented + */ +// ____semctl13 +// __clone +// __fhopen40 +// __fhstat40 +// __fhstatvfs140 +// __fstat30 +// __getcwd +// __getfh30 +// __getlogin +// __lstat30 +// __mount50 +// __msgctl13 +// __msync13 +// __ntp_gettime30 +// __posix_chown +// __posix_fchown +// __posix_lchown +// __posix_rename +// __setlogin +// __shmctl13 +// __sigaction_sigtramp +// __sigaltstack14 +// __sigpending14 +// __sigprocmask14 +// __sigsuspend14 +// __sigtimedwait +// __stat30 +// __syscall +// __vfork14 +// _ksem_close +// _ksem_destroy +// _ksem_getvalue +// _ksem_init +// _ksem_open +// _ksem_post +// _ksem_trywait +// _ksem_unlink +// _ksem_wait +// _lwp_continue +// _lwp_create +// _lwp_ctl +// _lwp_detach +// _lwp_exit +// _lwp_getname +// _lwp_getprivate +// _lwp_kill +// _lwp_park +// _lwp_self +// _lwp_setname +// _lwp_setprivate +// _lwp_suspend +// _lwp_unpark +// _lwp_unpark_all +// _lwp_wait +// _lwp_wakeup +// _pset_bind +// _sched_getaffinity +// _sched_getparam +// _sched_setaffinity +// _sched_setparam +// acct +// aio_cancel +// aio_error +// aio_fsync +// aio_read +// aio_return +// aio_suspend +// aio_write +// break +// clock_getres +// clock_gettime +// clock_settime +// compat_09_ogetdomainname +// compat_09_osetdomainname +// compat_09_ouname +// compat_10_omsgsys +// compat_10_osemsys +// compat_10_oshmsys +// compat_12_fstat12 +// compat_12_getdirentries +// compat_12_lstat12 +// compat_12_msync +// compat_12_oreboot +// compat_12_oswapon +// compat_12_stat12 +// compat_13_sigaction13 +// compat_13_sigaltstack13 +// compat_13_sigpending13 +// compat_13_sigprocmask13 +// compat_13_sigreturn13 +// compat_13_sigsuspend13 +// compat_14___semctl +// compat_14_msgctl +// compat_14_shmctl +// compat_16___sigaction14 +// compat_16___sigreturn14 +// compat_20_fhstatfs +// compat_20_fstatfs +// compat_20_getfsstat +// compat_20_statfs +// compat_30___fhstat30 +// compat_30___fstat13 +// compat_30___lstat13 +// compat_30___stat13 +// compat_30_fhopen +// compat_30_fhstat +// compat_30_fhstatvfs1 +// compat_30_getdents +// compat_30_getfh +// compat_30_ntp_gettime +// compat_30_socket +// compat_40_mount +// compat_43_fstat43 +// compat_43_lstat43 +// compat_43_oaccept +// compat_43_ocreat +// compat_43_oftruncate +// compat_43_ogetdirentries +// compat_43_ogetdtablesize +// compat_43_ogethostid +// compat_43_ogethostname +// compat_43_ogetkerninfo +// compat_43_ogetpagesize +// compat_43_ogetpeername +// compat_43_ogetrlimit +// compat_43_ogetsockname +// compat_43_okillpg +// compat_43_olseek +// compat_43_ommap +// compat_43_oquota +// compat_43_orecv +// compat_43_orecvfrom +// compat_43_orecvmsg +// compat_43_osend +// compat_43_osendmsg +// compat_43_osethostid +// compat_43_osethostname +// compat_43_osetrlimit +// compat_43_osigblock +// compat_43_osigsetmask +// compat_43_osigstack +// compat_43_osigvec +// compat_43_otruncate +// compat_43_owait +// compat_43_stat43 +// execve +// extattr_delete_fd +// extattr_delete_file +// extattr_delete_link +// extattr_get_fd +// extattr_get_file +// extattr_get_link +// extattr_list_fd +// extattr_list_file +// extattr_list_link +// extattr_set_fd +// extattr_set_file +// extattr_set_link +// extattrctl +// fchroot +// fdatasync +// fgetxattr +// fktrace +// flistxattr +// fork +// fremovexattr +// fsetxattr +// fstatvfs1 +// fsync_range +// getcontext +// getitimer +// getvfsstat +// getxattr +// ktrace +// lchflags +// lchmod +// lfs_bmapv +// lfs_markv +// lfs_segclean +// lfs_segwait +// lgetxattr +// lio_listio +// listxattr +// llistxattr +// lremovexattr +// lseek +// lsetxattr +// lutimes +// madvise +// mincore +// minherit +// modctl +// mq_close +// mq_getattr +// mq_notify +// mq_open +// mq_receive +// mq_send +// mq_setattr +// mq_timedreceive +// mq_timedsend +// mq_unlink +// mremap +// msgget +// msgrcv +// msgsnd +// nfssvc +// ntp_adjtime +// pmc_control +// pmc_get_info +// pollts +// preadv +// profil +// pselect +// pset_assign +// pset_create +// pset_destroy +// ptrace +// pwritev +// quotactl +// rasctl +// readv +// reboot +// removexattr +// sa_enable +// sa_preempt +// sa_register +// sa_setconcurrency +// sa_stacks +// sa_yield +// sbrk +// sched_yield +// semconfig +// semget +// semop +// setcontext +// setitimer +// setxattr +// shmat +// shmdt +// shmget +// sstk +// statvfs1 +// swapctl +// sysarch +// syscall +// timer_create +// timer_delete +// timer_getoverrun +// timer_gettime +// timer_settime +// undelete +// utrace +// uuidgen +// vadvise +// vfork +// writev diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_netbsd_386.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_netbsd_386.go new file mode 100644 index 00000000..24f74e58 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_netbsd_386.go @@ -0,0 +1,33 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build 386,netbsd + +package unix + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: int32(nsec)} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: int32(usec)} +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint32(fd) + k.Filter = uint32(mode) + k.Flags = uint32(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint32(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go new file mode 100644 index 00000000..6878bf7f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go @@ -0,0 +1,33 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build amd64,netbsd + +package unix + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: nsec} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: int32(usec)} +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint64(fd) + k.Filter = uint32(mode) + k.Flags = uint32(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_netbsd_arm.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_netbsd_arm.go new file mode 100644 index 00000000..dbbfcf71 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_netbsd_arm.go @@ -0,0 +1,33 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build arm,netbsd + +package unix + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: int32(nsec)} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: int32(usec)} +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint32(fd) + k.Filter = uint32(mode) + k.Flags = uint32(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint32(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_openbsd.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_openbsd.go new file mode 100644 index 00000000..38ea2ec6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_openbsd.go @@ -0,0 +1,394 @@ +// Copyright 2009,2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// OpenBSD system calls. +// This file is compiled as ordinary Go code, +// but it is also input to mksyscall, +// which parses the //sys lines and generates system call stubs. +// Note that sometimes we use a lowercase //sys name and wrap +// it in our own nicer implementation, either here or in +// syscall_bsd.go or syscall_unix.go. + +package unix + +import ( + "sort" + "syscall" + "unsafe" +) + +// SockaddrDatalink implements the Sockaddr interface for AF_LINK type sockets. +type SockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [24]int8 + raw RawSockaddrDatalink +} + +func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) + +func nametomib(name string) (mib []_C_int, err error) { + i := sort.Search(len(sysctlMib), func(i int) bool { + return sysctlMib[i].ctlname >= name + }) + if i < len(sysctlMib) && sysctlMib[i].ctlname == name { + return sysctlMib[i].ctloid, nil + } + return nil, EINVAL +} + +func SysctlUvmexp(name string) (*Uvmexp, error) { + mib, err := sysctlmib(name) + if err != nil { + return nil, err + } + + n := uintptr(SizeofUvmexp) + var u Uvmexp + if err := sysctl(mib, (*byte)(unsafe.Pointer(&u)), &n, nil, 0); err != nil { + return nil, err + } + if n != SizeofUvmexp { + return nil, EIO + } + return &u, nil +} + +//sysnb pipe(p *[2]_C_int) (err error) +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe(&pp) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +//sys getdents(fd int, buf []byte) (n int, err error) +func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { + return getdents(fd, buf) +} + +const ImplementsGetwd = true + +//sys Getcwd(buf []byte) (n int, err error) = SYS___GETCWD + +func Getwd() (string, error) { + var buf [PathMax]byte + _, err := Getcwd(buf[0:]) + if err != nil { + return "", err + } + n := clen(buf[:]) + if n < 1 { + return "", EINVAL + } + return string(buf[:n]), nil +} + +// TODO +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + return -1, ENOSYS +} + +func Getfsstat(buf []Statfs_t, flags int) (n int, err error) { + var _p0 unsafe.Pointer + var bufsize uintptr + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + bufsize = unsafe.Sizeof(Statfs_t{}) * uintptr(len(buf)) + } + r0, _, e1 := Syscall(SYS_GETFSSTAT, uintptr(_p0), bufsize, uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func setattrlistTimes(path string, times []Timespec, flags int) error { + // used on Darwin for UtimesNano + return ENOSYS +} + +//sys ioctl(fd int, req uint, arg uintptr) (err error) + +// ioctl itself should not be exposed directly, but additional get/set +// functions for specific types are permissible. + +// IoctlSetInt performs an ioctl operation which sets an integer value +// on fd, using the specified request number. +func IoctlSetInt(fd int, req uint, value int) error { + return ioctl(fd, req, uintptr(value)) +} + +func ioctlSetWinsize(fd int, req uint, value *Winsize) error { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +func ioctlSetTermios(fd int, req uint, value *Termios) error { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +// IoctlGetInt performs an ioctl operation which gets an integer value +// from fd, using the specified request number. +func IoctlGetInt(fd int, req uint) (int, error) { + var value int + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return value, err +} + +func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { + var value Winsize + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func IoctlGetTermios(fd int, req uint) (*Termios, error) { + var value Termios + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +//sys ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) + +func Ppoll(fds []PollFd, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + if len(fds) == 0 { + return ppoll(nil, 0, timeout, sigmask) + } + return ppoll(&fds[0], len(fds), timeout, sigmask) +} + +func Uname(uname *Utsname) error { + mib := []_C_int{CTL_KERN, KERN_OSTYPE} + n := unsafe.Sizeof(uname.Sysname) + if err := sysctl(mib, &uname.Sysname[0], &n, nil, 0); err != nil { + return err + } + + mib = []_C_int{CTL_KERN, KERN_HOSTNAME} + n = unsafe.Sizeof(uname.Nodename) + if err := sysctl(mib, &uname.Nodename[0], &n, nil, 0); err != nil { + return err + } + + mib = []_C_int{CTL_KERN, KERN_OSRELEASE} + n = unsafe.Sizeof(uname.Release) + if err := sysctl(mib, &uname.Release[0], &n, nil, 0); err != nil { + return err + } + + mib = []_C_int{CTL_KERN, KERN_VERSION} + n = unsafe.Sizeof(uname.Version) + if err := sysctl(mib, &uname.Version[0], &n, nil, 0); err != nil { + return err + } + + // The version might have newlines or tabs in it, convert them to + // spaces. + for i, b := range uname.Version { + if b == '\n' || b == '\t' { + if i == len(uname.Version)-1 { + uname.Version[i] = 0 + } else { + uname.Version[i] = ' ' + } + } + } + + mib = []_C_int{CTL_HW, HW_MACHINE} + n = unsafe.Sizeof(uname.Machine) + if err := sysctl(mib, &uname.Machine[0], &n, nil, 0); err != nil { + return err + } + + return nil +} + +/* + * Exposed directly + */ +//sys Access(path string, mode uint32) (err error) +//sys Adjtime(delta *Timeval, olddelta *Timeval) (err error) +//sys Chdir(path string) (err error) +//sys Chflags(path string, flags int) (err error) +//sys Chmod(path string, mode uint32) (err error) +//sys Chown(path string, uid int, gid int) (err error) +//sys Chroot(path string) (err error) +//sys Close(fd int) (err error) +//sys Dup(fd int) (nfd int, err error) +//sys Dup2(from int, to int) (err error) +//sys Exit(code int) +//sys Faccessat(dirfd int, path string, mode uint32, flags int) (err error) +//sys Fchdir(fd int) (err error) +//sys Fchflags(fd int, flags int) (err error) +//sys Fchmod(fd int, mode uint32) (err error) +//sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Flock(fd int, how int) (err error) +//sys Fpathconf(fd int, name int) (val int, err error) +//sys Fstat(fd int, stat *Stat_t) (err error) +//sys Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) +//sys Fstatfs(fd int, stat *Statfs_t) (err error) +//sys Fsync(fd int) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (uid int) +//sysnb Getgid() (gid int) +//sysnb Getpgid(pid int) (pgid int, err error) +//sysnb Getpgrp() (pgrp int) +//sysnb Getpid() (pid int) +//sysnb Getppid() (ppid int) +//sys Getpriority(which int, who int) (prio int, err error) +//sysnb Getrlimit(which int, lim *Rlimit) (err error) +//sysnb Getrtable() (rtable int, err error) +//sysnb Getrusage(who int, rusage *Rusage) (err error) +//sysnb Getsid(pid int) (sid int, err error) +//sysnb Gettimeofday(tv *Timeval) (err error) +//sysnb Getuid() (uid int) +//sys Issetugid() (tainted bool) +//sys Kill(pid int, signum syscall.Signal) (err error) +//sys Kqueue() (fd int, err error) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Link(path string, link string) (err error) +//sys Listen(s int, backlog int) (err error) +//sys Lstat(path string, stat *Stat_t) (err error) +//sys Mkdir(path string, mode uint32) (err error) +//sys Mkfifo(path string, mode uint32) (err error) +//sys Mknod(path string, mode uint32, dev int) (err error) +//sys Nanosleep(time *Timespec, leftover *Timespec) (err error) +//sys Open(path string, mode int, perm uint32) (fd int, err error) +//sys Pathconf(path string, name int) (val int, err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) +//sys read(fd int, p []byte) (n int, err error) +//sys Readlink(path string, buf []byte) (n int, err error) +//sys Rename(from string, to string) (err error) +//sys Revoke(path string) (err error) +//sys Rmdir(path string) (err error) +//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK +//sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) +//sysnb Setegid(egid int) (err error) +//sysnb Seteuid(euid int) (err error) +//sysnb Setgid(gid int) (err error) +//sys Setlogin(name string) (err error) +//sysnb Setpgid(pid int, pgid int) (err error) +//sys Setpriority(which int, who int, prio int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) +//sysnb Setresuid(ruid int, euid int, suid int) (err error) +//sysnb Setrlimit(which int, lim *Rlimit) (err error) +//sysnb Setrtable(rtable int) (err error) +//sysnb Setsid() (pid int, err error) +//sysnb Settimeofday(tp *Timeval) (err error) +//sysnb Setuid(uid int) (err error) +//sys Stat(path string, stat *Stat_t) (err error) +//sys Statfs(path string, stat *Statfs_t) (err error) +//sys Symlink(path string, link string) (err error) +//sys Sync() (err error) +//sys Truncate(path string, length int64) (err error) +//sys Umask(newmask int) (oldmask int) +//sys Unlink(path string) (err error) +//sys Unmount(path string, flags int) (err error) +//sys write(fd int, p []byte) (n int, err error) +//sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) +//sys munmap(addr uintptr, length uintptr) (err error) +//sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ +//sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE +//sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) + +/* + * Unimplemented + */ +// __getcwd +// __semctl +// __syscall +// __sysctl +// adjfreq +// break +// clock_getres +// clock_gettime +// clock_settime +// closefrom +// execve +// faccessat +// fchmodat +// fchownat +// fcntl +// fhopen +// fhstat +// fhstatfs +// fork +// fstatat +// futimens +// getfh +// getgid +// getitimer +// getlogin +// getresgid +// getresuid +// getthrid +// ktrace +// lfs_bmapv +// lfs_markv +// lfs_segclean +// lfs_segwait +// linkat +// mincore +// minherit +// mkdirat +// mkfifoat +// mknodat +// mount +// mquery +// msgctl +// msgget +// msgrcv +// msgsnd +// nfssvc +// nnpfspioctl +// openat +// preadv +// profil +// pwritev +// quotactl +// readlinkat +// readv +// reboot +// renameat +// rfork +// sched_yield +// semget +// semop +// setgroups +// setitimer +// setsockopt +// shmat +// shmctl +// shmdt +// shmget +// sigaction +// sigaltstack +// sigpending +// sigprocmask +// sigreturn +// sigsuspend +// symlinkat +// sysarch +// syscall +// threxit +// thrsigdivert +// thrsleep +// thrwakeup +// unlinkat +// vfork +// writev diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_openbsd_386.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_openbsd_386.go new file mode 100644 index 00000000..d62da60d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_openbsd_386.go @@ -0,0 +1,37 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build 386,openbsd + +package unix + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: int32(nsec)} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: int32(usec)} +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint32(fd) + k.Filter = int16(mode) + k.Flags = uint16(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint32(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +// SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions +// of openbsd/386 the syscall is called sysctl instead of __sysctl. +const SYS___SYSCTL = SYS_SYSCTL diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go new file mode 100644 index 00000000..9a35334c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go @@ -0,0 +1,37 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build amd64,openbsd + +package unix + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: nsec} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: usec} +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint64(fd) + k.Filter = int16(mode) + k.Flags = uint16(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +// SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions +// of openbsd/amd64 the syscall is called sysctl instead of __sysctl. +const SYS___SYSCTL = SYS_SYSCTL diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_openbsd_arm.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_openbsd_arm.go new file mode 100644 index 00000000..5d812aae --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_openbsd_arm.go @@ -0,0 +1,37 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build arm,openbsd + +package unix + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: int32(nsec)} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: int32(usec)} +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint32(fd) + k.Filter = int16(mode) + k.Flags = uint16(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint32(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +// SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions +// of openbsd/arm the syscall is called sysctl instead of __sysctl. +const SYS___SYSCTL = SYS_SYSCTL diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_solaris.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_solaris.go new file mode 100644 index 00000000..53b80782 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_solaris.go @@ -0,0 +1,730 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Solaris system calls. +// This file is compiled as ordinary Go code, +// but it is also input to mksyscall, +// which parses the //sys lines and generates system call stubs. +// Note that sometimes we use a lowercase //sys name and wrap +// it in our own nicer implementation, either here or in +// syscall_solaris.go or syscall_unix.go. + +package unix + +import ( + "syscall" + "unsafe" +) + +// Implemented in runtime/syscall_solaris.go. +type syscallFunc uintptr + +func rawSysvicall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) +func sysvicall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) + +// SockaddrDatalink implements the Sockaddr interface for AF_LINK type sockets. +type SockaddrDatalink struct { + Family uint16 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [244]int8 + raw RawSockaddrDatalink +} + +//sysnb pipe(p *[2]_C_int) (n int, err error) + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + n, err := pipe(&pp) + if n != 0 { + return err + } + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return nil +} + +func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, _Socklen, error) { + if sa.Port < 0 || sa.Port > 0xFFFF { + return nil, 0, EINVAL + } + sa.raw.Family = AF_INET + p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) + p[0] = byte(sa.Port >> 8) + p[1] = byte(sa.Port) + for i := 0; i < len(sa.Addr); i++ { + sa.raw.Addr[i] = sa.Addr[i] + } + return unsafe.Pointer(&sa.raw), SizeofSockaddrInet4, nil +} + +func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, _Socklen, error) { + if sa.Port < 0 || sa.Port > 0xFFFF { + return nil, 0, EINVAL + } + sa.raw.Family = AF_INET6 + p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) + p[0] = byte(sa.Port >> 8) + p[1] = byte(sa.Port) + sa.raw.Scope_id = sa.ZoneId + for i := 0; i < len(sa.Addr); i++ { + sa.raw.Addr[i] = sa.Addr[i] + } + return unsafe.Pointer(&sa.raw), SizeofSockaddrInet6, nil +} + +func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, _Socklen, error) { + name := sa.Name + n := len(name) + if n >= len(sa.raw.Path) { + return nil, 0, EINVAL + } + sa.raw.Family = AF_UNIX + for i := 0; i < n; i++ { + sa.raw.Path[i] = int8(name[i]) + } + // length is family (uint16), name, NUL. + sl := _Socklen(2) + if n > 0 { + sl += _Socklen(n) + 1 + } + if sa.raw.Path[0] == '@' { + sa.raw.Path[0] = 0 + // Don't count trailing NUL for abstract address. + sl-- + } + + return unsafe.Pointer(&sa.raw), sl, nil +} + +//sys getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) = libsocket.getsockname + +func Getsockname(fd int) (sa Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + if err = getsockname(fd, &rsa, &len); err != nil { + return + } + return anyToSockaddr(fd, &rsa) +} + +// GetsockoptString returns the string value of the socket option opt for the +// socket associated with fd at the given socket level. +func GetsockoptString(fd, level, opt int) (string, error) { + buf := make([]byte, 256) + vallen := _Socklen(len(buf)) + err := getsockopt(fd, level, opt, unsafe.Pointer(&buf[0]), &vallen) + if err != nil { + return "", err + } + return string(buf[:vallen-1]), nil +} + +const ImplementsGetwd = true + +//sys Getcwd(buf []byte) (n int, err error) + +func Getwd() (wd string, err error) { + var buf [PathMax]byte + // Getcwd will return an error if it failed for any reason. + _, err = Getcwd(buf[0:]) + if err != nil { + return "", err + } + n := clen(buf[:]) + if n < 1 { + return "", EINVAL + } + return string(buf[:n]), nil +} + +/* + * Wrapped + */ + +//sysnb getgroups(ngid int, gid *_Gid_t) (n int, err error) +//sysnb setgroups(ngid int, gid *_Gid_t) (err error) + +func Getgroups() (gids []int, err error) { + n, err := getgroups(0, nil) + // Check for error and sanity check group count. Newer versions of + // Solaris allow up to 1024 (NGROUPS_MAX). + if n < 0 || n > 1024 { + if err != nil { + return nil, err + } + return nil, EINVAL + } else if n == 0 { + return nil, nil + } + + a := make([]_Gid_t, n) + n, err = getgroups(n, &a[0]) + if n == -1 { + return nil, err + } + gids = make([]int, n) + for i, v := range a[0:n] { + gids[i] = int(v) + } + return +} + +func Setgroups(gids []int) (err error) { + if len(gids) == 0 { + return setgroups(0, nil) + } + + a := make([]_Gid_t, len(gids)) + for i, v := range gids { + a[i] = _Gid_t(v) + } + return setgroups(len(a), &a[0]) +} + +func ReadDirent(fd int, buf []byte) (n int, err error) { + // Final argument is (basep *uintptr) and the syscall doesn't take nil. + // TODO(rsc): Can we use a single global basep for all calls? + return Getdents(fd, buf, new(uintptr)) +} + +// Wait status is 7 bits at bottom, either 0 (exited), +// 0x7F (stopped), or a signal number that caused an exit. +// The 0x80 bit is whether there was a core dump. +// An extra number (exit code, signal causing a stop) +// is in the high bits. + +type WaitStatus uint32 + +const ( + mask = 0x7F + core = 0x80 + shift = 8 + + exited = 0 + stopped = 0x7F +) + +func (w WaitStatus) Exited() bool { return w&mask == exited } + +func (w WaitStatus) ExitStatus() int { + if w&mask != exited { + return -1 + } + return int(w >> shift) +} + +func (w WaitStatus) Signaled() bool { return w&mask != stopped && w&mask != 0 } + +func (w WaitStatus) Signal() syscall.Signal { + sig := syscall.Signal(w & mask) + if sig == stopped || sig == 0 { + return -1 + } + return sig +} + +func (w WaitStatus) CoreDump() bool { return w.Signaled() && w&core != 0 } + +func (w WaitStatus) Stopped() bool { return w&mask == stopped && syscall.Signal(w>>shift) != SIGSTOP } + +func (w WaitStatus) Continued() bool { return w&mask == stopped && syscall.Signal(w>>shift) == SIGSTOP } + +func (w WaitStatus) StopSignal() syscall.Signal { + if !w.Stopped() { + return -1 + } + return syscall.Signal(w>>shift) & 0xFF +} + +func (w WaitStatus) TrapCause() int { return -1 } + +//sys wait4(pid int32, statusp *_C_int, options int, rusage *Rusage) (wpid int32, err error) + +func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (int, error) { + var status _C_int + rpid, err := wait4(int32(pid), &status, options, rusage) + wpid := int(rpid) + if wpid == -1 { + return wpid, err + } + if wstatus != nil { + *wstatus = WaitStatus(status) + } + return wpid, nil +} + +//sys gethostname(buf []byte) (n int, err error) + +func Gethostname() (name string, err error) { + var buf [MaxHostNameLen]byte + n, err := gethostname(buf[:]) + if n != 0 { + return "", err + } + n = clen(buf[:]) + if n < 1 { + return "", EFAULT + } + return string(buf[:n]), nil +} + +//sys utimes(path string, times *[2]Timeval) (err error) + +func Utimes(path string, tv []Timeval) (err error) { + if tv == nil { + return utimes(path, nil) + } + if len(tv) != 2 { + return EINVAL + } + return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) +} + +//sys utimensat(fd int, path string, times *[2]Timespec, flag int) (err error) + +func UtimesNano(path string, ts []Timespec) error { + if ts == nil { + return utimensat(AT_FDCWD, path, nil, 0) + } + if len(ts) != 2 { + return EINVAL + } + return utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0) +} + +func UtimesNanoAt(dirfd int, path string, ts []Timespec, flags int) error { + if ts == nil { + return utimensat(dirfd, path, nil, flags) + } + if len(ts) != 2 { + return EINVAL + } + return utimensat(dirfd, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), flags) +} + +//sys fcntl(fd int, cmd int, arg int) (val int, err error) + +// FcntlInt performs a fcntl syscall on fd with the provided command and argument. +func FcntlInt(fd uintptr, cmd, arg int) (int, error) { + valptr, _, errno := sysvicall6(uintptr(unsafe.Pointer(&procfcntl)), 3, uintptr(fd), uintptr(cmd), uintptr(arg), 0, 0, 0) + var err error + if errno != 0 { + err = errno + } + return int(valptr), err +} + +// FcntlFlock performs a fcntl syscall for the F_GETLK, F_SETLK or F_SETLKW command. +func FcntlFlock(fd uintptr, cmd int, lk *Flock_t) error { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procfcntl)), 3, uintptr(fd), uintptr(cmd), uintptr(unsafe.Pointer(lk)), 0, 0, 0) + if e1 != 0 { + return e1 + } + return nil +} + +//sys futimesat(fildes int, path *byte, times *[2]Timeval) (err error) + +func Futimesat(dirfd int, path string, tv []Timeval) error { + pathp, err := BytePtrFromString(path) + if err != nil { + return err + } + if tv == nil { + return futimesat(dirfd, pathp, nil) + } + if len(tv) != 2 { + return EINVAL + } + return futimesat(dirfd, pathp, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) +} + +// Solaris doesn't have an futimes function because it allows NULL to be +// specified as the path for futimesat. However, Go doesn't like +// NULL-style string interfaces, so this simple wrapper is provided. +func Futimes(fd int, tv []Timeval) error { + if tv == nil { + return futimesat(fd, nil, nil) + } + if len(tv) != 2 { + return EINVAL + } + return futimesat(fd, nil, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) +} + +func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) { + switch rsa.Addr.Family { + case AF_UNIX: + pp := (*RawSockaddrUnix)(unsafe.Pointer(rsa)) + sa := new(SockaddrUnix) + // Assume path ends at NUL. + // This is not technically the Solaris semantics for + // abstract Unix domain sockets -- they are supposed + // to be uninterpreted fixed-size binary blobs -- but + // everyone uses this convention. + n := 0 + for n < len(pp.Path) && pp.Path[n] != 0 { + n++ + } + bytes := (*[10000]byte)(unsafe.Pointer(&pp.Path[0]))[0:n] + sa.Name = string(bytes) + return sa, nil + + case AF_INET: + pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa)) + sa := new(SockaddrInet4) + p := (*[2]byte)(unsafe.Pointer(&pp.Port)) + sa.Port = int(p[0])<<8 + int(p[1]) + for i := 0; i < len(sa.Addr); i++ { + sa.Addr[i] = pp.Addr[i] + } + return sa, nil + + case AF_INET6: + pp := (*RawSockaddrInet6)(unsafe.Pointer(rsa)) + sa := new(SockaddrInet6) + p := (*[2]byte)(unsafe.Pointer(&pp.Port)) + sa.Port = int(p[0])<<8 + int(p[1]) + sa.ZoneId = pp.Scope_id + for i := 0; i < len(sa.Addr); i++ { + sa.Addr[i] = pp.Addr[i] + } + return sa, nil + } + return nil, EAFNOSUPPORT +} + +//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) = libsocket.accept + +func Accept(fd int) (nfd int, sa Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + nfd, err = accept(fd, &rsa, &len) + if nfd == -1 { + return + } + sa, err = anyToSockaddr(fd, &rsa) + if err != nil { + Close(nfd) + nfd = 0 + } + return +} + +//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) = libsocket.__xnet_recvmsg + +func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) { + var msg Msghdr + var rsa RawSockaddrAny + msg.Name = (*byte)(unsafe.Pointer(&rsa)) + msg.Namelen = uint32(SizeofSockaddrAny) + var iov Iovec + if len(p) > 0 { + iov.Base = (*int8)(unsafe.Pointer(&p[0])) + iov.SetLen(len(p)) + } + var dummy int8 + if len(oob) > 0 { + // receive at least one normal byte + if len(p) == 0 { + iov.Base = &dummy + iov.SetLen(1) + } + msg.Accrightslen = int32(len(oob)) + } + msg.Iov = &iov + msg.Iovlen = 1 + if n, err = recvmsg(fd, &msg, flags); n == -1 { + return + } + oobn = int(msg.Accrightslen) + // source address is only specified if the socket is unconnected + if rsa.Addr.Family != AF_UNSPEC { + from, err = anyToSockaddr(fd, &rsa) + } + return +} + +func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) { + _, err = SendmsgN(fd, p, oob, to, flags) + return +} + +//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) = libsocket.__xnet_sendmsg + +func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) { + var ptr unsafe.Pointer + var salen _Socklen + if to != nil { + ptr, salen, err = to.sockaddr() + if err != nil { + return 0, err + } + } + var msg Msghdr + msg.Name = (*byte)(unsafe.Pointer(ptr)) + msg.Namelen = uint32(salen) + var iov Iovec + if len(p) > 0 { + iov.Base = (*int8)(unsafe.Pointer(&p[0])) + iov.SetLen(len(p)) + } + var dummy int8 + if len(oob) > 0 { + // send at least one normal byte + if len(p) == 0 { + iov.Base = &dummy + iov.SetLen(1) + } + msg.Accrightslen = int32(len(oob)) + } + msg.Iov = &iov + msg.Iovlen = 1 + if n, err = sendmsg(fd, &msg, flags); err != nil { + return 0, err + } + if len(oob) > 0 && len(p) == 0 { + n = 0 + } + return n, nil +} + +//sys acct(path *byte) (err error) + +func Acct(path string) (err error) { + if len(path) == 0 { + // Assume caller wants to disable accounting. + return acct(nil) + } + + pathp, err := BytePtrFromString(path) + if err != nil { + return err + } + return acct(pathp) +} + +//sys __makedev(version int, major uint, minor uint) (val uint64) + +func Mkdev(major, minor uint32) uint64 { + return __makedev(NEWDEV, uint(major), uint(minor)) +} + +//sys __major(version int, dev uint64) (val uint) + +func Major(dev uint64) uint32 { + return uint32(__major(NEWDEV, dev)) +} + +//sys __minor(version int, dev uint64) (val uint) + +func Minor(dev uint64) uint32 { + return uint32(__minor(NEWDEV, dev)) +} + +/* + * Expose the ioctl function + */ + +//sys ioctl(fd int, req uint, arg uintptr) (err error) + +func IoctlSetInt(fd int, req uint, value int) (err error) { + return ioctl(fd, req, uintptr(value)) +} + +func ioctlSetWinsize(fd int, req uint, value *Winsize) (err error) { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +func ioctlSetTermios(fd int, req uint, value *Termios) (err error) { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +func IoctlSetTermio(fd int, req uint, value *Termio) (err error) { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +func IoctlGetInt(fd int, req uint) (int, error) { + var value int + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return value, err +} + +func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { + var value Winsize + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func IoctlGetTermios(fd int, req uint) (*Termios, error) { + var value Termios + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func IoctlGetTermio(fd int, req uint) (*Termio, error) { + var value Termio + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) + +func Poll(fds []PollFd, timeout int) (n int, err error) { + if len(fds) == 0 { + return poll(nil, 0, timeout) + } + return poll(&fds[0], len(fds), timeout) +} + +/* + * Exposed directly + */ +//sys Access(path string, mode uint32) (err error) +//sys Adjtime(delta *Timeval, olddelta *Timeval) (err error) +//sys Chdir(path string) (err error) +//sys Chmod(path string, mode uint32) (err error) +//sys Chown(path string, uid int, gid int) (err error) +//sys Chroot(path string) (err error) +//sys Close(fd int) (err error) +//sys Creat(path string, mode uint32) (fd int, err error) +//sys Dup(fd int) (nfd int, err error) +//sys Dup2(oldfd int, newfd int) (err error) +//sys Exit(code int) +//sys Faccessat(dirfd int, path string, mode uint32, flags int) (err error) +//sys Fchdir(fd int) (err error) +//sys Fchmod(fd int, mode uint32) (err error) +//sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) +//sys Fdatasync(fd int) (err error) +//sys Flock(fd int, how int) (err error) +//sys Fpathconf(fd int, name int) (val int, err error) +//sys Fstat(fd int, stat *Stat_t) (err error) +//sys Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) +//sys Fstatvfs(fd int, vfsstat *Statvfs_t) (err error) +//sys Getdents(fd int, buf []byte, basep *uintptr) (n int, err error) +//sysnb Getgid() (gid int) +//sysnb Getpid() (pid int) +//sysnb Getpgid(pid int) (pgid int, err error) +//sysnb Getpgrp() (pgid int, err error) +//sys Geteuid() (euid int) +//sys Getegid() (egid int) +//sys Getppid() (ppid int) +//sys Getpriority(which int, who int) (n int, err error) +//sysnb Getrlimit(which int, lim *Rlimit) (err error) +//sysnb Getrusage(who int, rusage *Rusage) (err error) +//sysnb Gettimeofday(tv *Timeval) (err error) +//sysnb Getuid() (uid int) +//sys Kill(pid int, signum syscall.Signal) (err error) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Link(path string, link string) (err error) +//sys Listen(s int, backlog int) (err error) = libsocket.__xnet_llisten +//sys Lstat(path string, stat *Stat_t) (err error) +//sys Madvise(b []byte, advice int) (err error) +//sys Mkdir(path string, mode uint32) (err error) +//sys Mkdirat(dirfd int, path string, mode uint32) (err error) +//sys Mkfifo(path string, mode uint32) (err error) +//sys Mkfifoat(dirfd int, path string, mode uint32) (err error) +//sys Mknod(path string, mode uint32, dev int) (err error) +//sys Mknodat(dirfd int, path string, mode uint32, dev int) (err error) +//sys Mlock(b []byte) (err error) +//sys Mlockall(flags int) (err error) +//sys Mprotect(b []byte, prot int) (err error) +//sys Msync(b []byte, flags int) (err error) +//sys Munlock(b []byte) (err error) +//sys Munlockall() (err error) +//sys Nanosleep(time *Timespec, leftover *Timespec) (err error) +//sys Open(path string, mode int, perm uint32) (fd int, err error) +//sys Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) +//sys Pathconf(path string, name int) (val int, err error) +//sys Pause() (err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) +//sys read(fd int, p []byte) (n int, err error) +//sys Readlink(path string, buf []byte) (n int, err error) +//sys Rename(from string, to string) (err error) +//sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) +//sys Rmdir(path string) (err error) +//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = lseek +//sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) +//sysnb Setegid(egid int) (err error) +//sysnb Seteuid(euid int) (err error) +//sysnb Setgid(gid int) (err error) +//sys Sethostname(p []byte) (err error) +//sysnb Setpgid(pid int, pgid int) (err error) +//sys Setpriority(which int, who int, prio int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sysnb Setrlimit(which int, lim *Rlimit) (err error) +//sysnb Setsid() (pid int, err error) +//sysnb Setuid(uid int) (err error) +//sys Shutdown(s int, how int) (err error) = libsocket.shutdown +//sys Stat(path string, stat *Stat_t) (err error) +//sys Statvfs(path string, vfsstat *Statvfs_t) (err error) +//sys Symlink(path string, link string) (err error) +//sys Sync() (err error) +//sysnb Times(tms *Tms) (ticks uintptr, err error) +//sys Truncate(path string, length int64) (err error) +//sys Fsync(fd int) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sys Umask(mask int) (oldmask int) +//sysnb Uname(buf *Utsname) (err error) +//sys Unmount(target string, flags int) (err error) = libc.umount +//sys Unlink(path string) (err error) +//sys Unlinkat(dirfd int, path string, flags int) (err error) +//sys Ustat(dev int, ubuf *Ustat_t) (err error) +//sys Utime(path string, buf *Utimbuf) (err error) +//sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) = libsocket.__xnet_bind +//sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) = libsocket.__xnet_connect +//sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) +//sys munmap(addr uintptr, length uintptr) (err error) +//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = libsendfile.sendfile +//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) = libsocket.__xnet_sendto +//sys socket(domain int, typ int, proto int) (fd int, err error) = libsocket.__xnet_socket +//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) = libsocket.__xnet_socketpair +//sys write(fd int, p []byte) (n int, err error) +//sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) = libsocket.__xnet_getsockopt +//sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) = libsocket.getpeername +//sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) = libsocket.setsockopt +//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) = libsocket.recvfrom + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procread)), 3, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf), 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procwrite)), 3, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf), 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +var mapper = &mmapper{ + active: make(map[*byte][]byte), + mmap: mmap, + munmap: munmap, +} + +func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { + return mapper.Mmap(fd, offset, length, prot, flags) +} + +func Munmap(b []byte) (err error) { + return mapper.Munmap(b) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go new file mode 100644 index 00000000..91c32ddf --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go @@ -0,0 +1,23 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build amd64,solaris + +package unix + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: nsec} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: usec} +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_unix.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_unix.go new file mode 100644 index 00000000..64fcda4a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_unix.go @@ -0,0 +1,394 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris + +package unix + +import ( + "bytes" + "runtime" + "sort" + "sync" + "syscall" + "unsafe" +) + +var ( + Stdin = 0 + Stdout = 1 + Stderr = 2 +) + +const ( + darwin64Bit = runtime.GOOS == "darwin" && SizeofPtr == 8 + dragonfly64Bit = runtime.GOOS == "dragonfly" && SizeofPtr == 8 + netbsd32Bit = runtime.GOOS == "netbsd" && SizeofPtr == 4 + solaris64Bit = runtime.GOOS == "solaris" && SizeofPtr == 8 +) + +// Do the interface allocations only once for common +// Errno values. +var ( + errEAGAIN error = syscall.EAGAIN + errEINVAL error = syscall.EINVAL + errENOENT error = syscall.ENOENT +) + +// errnoErr returns common boxed Errno values, to prevent +// allocations at runtime. +func errnoErr(e syscall.Errno) error { + switch e { + case 0: + return nil + case EAGAIN: + return errEAGAIN + case EINVAL: + return errEINVAL + case ENOENT: + return errENOENT + } + return e +} + +// ErrnoName returns the error name for error number e. +func ErrnoName(e syscall.Errno) string { + i := sort.Search(len(errorList), func(i int) bool { + return errorList[i].num >= e + }) + if i < len(errorList) && errorList[i].num == e { + return errorList[i].name + } + return "" +} + +// SignalName returns the signal name for signal number s. +func SignalName(s syscall.Signal) string { + i := sort.Search(len(signalList), func(i int) bool { + return signalList[i].num >= s + }) + if i < len(signalList) && signalList[i].num == s { + return signalList[i].name + } + return "" +} + +// clen returns the index of the first NULL byte in n or len(n) if n contains no NULL byte. +func clen(n []byte) int { + i := bytes.IndexByte(n, 0) + if i == -1 { + i = len(n) + } + return i +} + +// Mmap manager, for use by operating system-specific implementations. + +type mmapper struct { + sync.Mutex + active map[*byte][]byte // active mappings; key is last byte in mapping + mmap func(addr, length uintptr, prot, flags, fd int, offset int64) (uintptr, error) + munmap func(addr uintptr, length uintptr) error +} + +func (m *mmapper) Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { + if length <= 0 { + return nil, EINVAL + } + + // Map the requested memory. + addr, errno := m.mmap(0, uintptr(length), prot, flags, fd, offset) + if errno != nil { + return nil, errno + } + + // Slice memory layout + var sl = struct { + addr uintptr + len int + cap int + }{addr, length, length} + + // Use unsafe to turn sl into a []byte. + b := *(*[]byte)(unsafe.Pointer(&sl)) + + // Register mapping in m and return it. + p := &b[cap(b)-1] + m.Lock() + defer m.Unlock() + m.active[p] = b + return b, nil +} + +func (m *mmapper) Munmap(data []byte) (err error) { + if len(data) == 0 || len(data) != cap(data) { + return EINVAL + } + + // Find the base of the mapping. + p := &data[cap(data)-1] + m.Lock() + defer m.Unlock() + b := m.active[p] + if b == nil || &b[0] != &data[0] { + return EINVAL + } + + // Unmap the memory and update m. + if errno := m.munmap(uintptr(unsafe.Pointer(&b[0])), uintptr(len(b))); errno != nil { + return errno + } + delete(m.active, p) + return nil +} + +func Read(fd int, p []byte) (n int, err error) { + n, err = read(fd, p) + if raceenabled { + if n > 0 { + raceWriteRange(unsafe.Pointer(&p[0]), n) + } + if err == nil { + raceAcquire(unsafe.Pointer(&ioSync)) + } + } + return +} + +func Write(fd int, p []byte) (n int, err error) { + if raceenabled { + raceReleaseMerge(unsafe.Pointer(&ioSync)) + } + n, err = write(fd, p) + if raceenabled && n > 0 { + raceReadRange(unsafe.Pointer(&p[0]), n) + } + return +} + +// For testing: clients can set this flag to force +// creation of IPv6 sockets to return EAFNOSUPPORT. +var SocketDisableIPv6 bool + +// Sockaddr represents a socket address. +type Sockaddr interface { + sockaddr() (ptr unsafe.Pointer, len _Socklen, err error) // lowercase; only we can define Sockaddrs +} + +// SockaddrInet4 implements the Sockaddr interface for AF_INET type sockets. +type SockaddrInet4 struct { + Port int + Addr [4]byte + raw RawSockaddrInet4 +} + +// SockaddrInet6 implements the Sockaddr interface for AF_INET6 type sockets. +type SockaddrInet6 struct { + Port int + ZoneId uint32 + Addr [16]byte + raw RawSockaddrInet6 +} + +// SockaddrUnix implements the Sockaddr interface for AF_UNIX type sockets. +type SockaddrUnix struct { + Name string + raw RawSockaddrUnix +} + +func Bind(fd int, sa Sockaddr) (err error) { + ptr, n, err := sa.sockaddr() + if err != nil { + return err + } + return bind(fd, ptr, n) +} + +func Connect(fd int, sa Sockaddr) (err error) { + ptr, n, err := sa.sockaddr() + if err != nil { + return err + } + return connect(fd, ptr, n) +} + +func Getpeername(fd int) (sa Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + if err = getpeername(fd, &rsa, &len); err != nil { + return + } + return anyToSockaddr(fd, &rsa) +} + +func GetsockoptByte(fd, level, opt int) (value byte, err error) { + var n byte + vallen := _Socklen(1) + err = getsockopt(fd, level, opt, unsafe.Pointer(&n), &vallen) + return n, err +} + +func GetsockoptInt(fd, level, opt int) (value int, err error) { + var n int32 + vallen := _Socklen(4) + err = getsockopt(fd, level, opt, unsafe.Pointer(&n), &vallen) + return int(n), err +} + +func GetsockoptInet4Addr(fd, level, opt int) (value [4]byte, err error) { + vallen := _Socklen(4) + err = getsockopt(fd, level, opt, unsafe.Pointer(&value[0]), &vallen) + return value, err +} + +func GetsockoptIPMreq(fd, level, opt int) (*IPMreq, error) { + var value IPMreq + vallen := _Socklen(SizeofIPMreq) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} + +func GetsockoptIPv6Mreq(fd, level, opt int) (*IPv6Mreq, error) { + var value IPv6Mreq + vallen := _Socklen(SizeofIPv6Mreq) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} + +func GetsockoptIPv6MTUInfo(fd, level, opt int) (*IPv6MTUInfo, error) { + var value IPv6MTUInfo + vallen := _Socklen(SizeofIPv6MTUInfo) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} + +func GetsockoptICMPv6Filter(fd, level, opt int) (*ICMPv6Filter, error) { + var value ICMPv6Filter + vallen := _Socklen(SizeofICMPv6Filter) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} + +func GetsockoptLinger(fd, level, opt int) (*Linger, error) { + var linger Linger + vallen := _Socklen(SizeofLinger) + err := getsockopt(fd, level, opt, unsafe.Pointer(&linger), &vallen) + return &linger, err +} + +func GetsockoptTimeval(fd, level, opt int) (*Timeval, error) { + var tv Timeval + vallen := _Socklen(unsafe.Sizeof(tv)) + err := getsockopt(fd, level, opt, unsafe.Pointer(&tv), &vallen) + return &tv, err +} + +func Recvfrom(fd int, p []byte, flags int) (n int, from Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + if n, err = recvfrom(fd, p, flags, &rsa, &len); err != nil { + return + } + if rsa.Addr.Family != AF_UNSPEC { + from, err = anyToSockaddr(fd, &rsa) + } + return +} + +func Sendto(fd int, p []byte, flags int, to Sockaddr) (err error) { + ptr, n, err := to.sockaddr() + if err != nil { + return err + } + return sendto(fd, p, flags, ptr, n) +} + +func SetsockoptByte(fd, level, opt int, value byte) (err error) { + return setsockopt(fd, level, opt, unsafe.Pointer(&value), 1) +} + +func SetsockoptInt(fd, level, opt int, value int) (err error) { + var n = int32(value) + return setsockopt(fd, level, opt, unsafe.Pointer(&n), 4) +} + +func SetsockoptInet4Addr(fd, level, opt int, value [4]byte) (err error) { + return setsockopt(fd, level, opt, unsafe.Pointer(&value[0]), 4) +} + +func SetsockoptIPMreq(fd, level, opt int, mreq *IPMreq) (err error) { + return setsockopt(fd, level, opt, unsafe.Pointer(mreq), SizeofIPMreq) +} + +func SetsockoptIPv6Mreq(fd, level, opt int, mreq *IPv6Mreq) (err error) { + return setsockopt(fd, level, opt, unsafe.Pointer(mreq), SizeofIPv6Mreq) +} + +func SetsockoptICMPv6Filter(fd, level, opt int, filter *ICMPv6Filter) error { + return setsockopt(fd, level, opt, unsafe.Pointer(filter), SizeofICMPv6Filter) +} + +func SetsockoptLinger(fd, level, opt int, l *Linger) (err error) { + return setsockopt(fd, level, opt, unsafe.Pointer(l), SizeofLinger) +} + +func SetsockoptString(fd, level, opt int, s string) (err error) { + return setsockopt(fd, level, opt, unsafe.Pointer(&[]byte(s)[0]), uintptr(len(s))) +} + +func SetsockoptTimeval(fd, level, opt int, tv *Timeval) (err error) { + return setsockopt(fd, level, opt, unsafe.Pointer(tv), unsafe.Sizeof(*tv)) +} + +func Socket(domain, typ, proto int) (fd int, err error) { + if domain == AF_INET6 && SocketDisableIPv6 { + return -1, EAFNOSUPPORT + } + fd, err = socket(domain, typ, proto) + return +} + +func Socketpair(domain, typ, proto int) (fd [2]int, err error) { + var fdx [2]int32 + err = socketpair(domain, typ, proto, &fdx) + if err == nil { + fd[0] = int(fdx[0]) + fd[1] = int(fdx[1]) + } + return +} + +func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + if raceenabled { + raceReleaseMerge(unsafe.Pointer(&ioSync)) + } + return sendfile(outfd, infd, offset, count) +} + +var ioSync int64 + +func CloseOnExec(fd int) { fcntl(fd, F_SETFD, FD_CLOEXEC) } + +func SetNonblock(fd int, nonblocking bool) (err error) { + flag, err := fcntl(fd, F_GETFL, 0) + if err != nil { + return err + } + if nonblocking { + flag |= O_NONBLOCK + } else { + flag &= ^O_NONBLOCK + } + _, err = fcntl(fd, F_SETFL, flag) + return err +} + +// Exec calls execve(2), which replaces the calling executable in the process +// tree. argv0 should be the full path to an executable ("/bin/ls") and the +// executable name should also be the first argument in argv (["ls", "-l"]). +// envv are the environment variables that should be passed to the new +// process (["USER=go", "PWD=/tmp"]). +func Exec(argv0 string, argv []string, envv []string) error { + return syscall.Exec(argv0, argv, envv) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_unix_gc.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_unix_gc.go new file mode 100644 index 00000000..4cb8e8ed --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/syscall_unix_gc.go @@ -0,0 +1,15 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build darwin dragonfly freebsd linux netbsd openbsd solaris +// +build !gccgo + +package unix + +import "syscall" + +func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno) +func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) +func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno) +func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/timestruct.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/timestruct.go new file mode 100644 index 00000000..4a672f56 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/timestruct.go @@ -0,0 +1,82 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris + +package unix + +import "time" + +// TimespecToNsec converts a Timespec value into a number of +// nanoseconds since the Unix epoch. +func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } + +// NsecToTimespec takes a number of nanoseconds since the Unix epoch +// and returns the corresponding Timespec value. +func NsecToTimespec(nsec int64) Timespec { + sec := nsec / 1e9 + nsec = nsec % 1e9 + if nsec < 0 { + nsec += 1e9 + sec-- + } + return setTimespec(sec, nsec) +} + +// TimeToTimespec converts t into a Timespec. +// On some 32-bit systems the range of valid Timespec values are smaller +// than that of time.Time values. So if t is out of the valid range of +// Timespec, it returns a zero Timespec and ERANGE. +func TimeToTimespec(t time.Time) (Timespec, error) { + sec := t.Unix() + nsec := int64(t.Nanosecond()) + ts := setTimespec(sec, nsec) + + // Currently all targets have either int32 or int64 for Timespec.Sec. + // If there were a new target with floating point type for it, we have + // to consider the rounding error. + if int64(ts.Sec) != sec { + return Timespec{}, ERANGE + } + return ts, nil +} + +// TimevalToNsec converts a Timeval value into a number of nanoseconds +// since the Unix epoch. +func TimevalToNsec(tv Timeval) int64 { return int64(tv.Sec)*1e9 + int64(tv.Usec)*1e3 } + +// NsecToTimeval takes a number of nanoseconds since the Unix epoch +// and returns the corresponding Timeval value. +func NsecToTimeval(nsec int64) Timeval { + nsec += 999 // round up to microsecond + usec := nsec % 1e9 / 1e3 + sec := nsec / 1e9 + if usec < 0 { + usec += 1e6 + sec-- + } + return setTimeval(sec, usec) +} + +// Unix returns ts as the number of seconds and nanoseconds elapsed since the +// Unix epoch. +func (ts *Timespec) Unix() (sec int64, nsec int64) { + return int64(ts.Sec), int64(ts.Nsec) +} + +// Unix returns tv as the number of seconds and nanoseconds elapsed since the +// Unix epoch. +func (tv *Timeval) Unix() (sec int64, nsec int64) { + return int64(tv.Sec), int64(tv.Usec) * 1000 +} + +// Nano returns ts as the number of nanoseconds elapsed since the Unix epoch. +func (ts *Timespec) Nano() int64 { + return int64(ts.Sec)*1e9 + int64(ts.Nsec) +} + +// Nano returns tv as the number of nanoseconds elapsed since the Unix epoch. +func (tv *Timeval) Nano() int64 { + return int64(tv.Sec)*1e9 + int64(tv.Usec)*1000 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/types_aix.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/types_aix.go new file mode 100644 index 00000000..25e83494 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/types_aix.go @@ -0,0 +1,236 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore +// +build aix + +/* +Input to cgo -godefs. See also mkerrors.sh and mkall.sh +*/ + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package unix + +/* +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include + + +#include +#include + +enum { + sizeofPtr = sizeof(void*), +}; + +union sockaddr_all { + struct sockaddr s1; // this one gets used for fields + struct sockaddr_in s2; // these pad it out + struct sockaddr_in6 s3; + struct sockaddr_un s4; + struct sockaddr_dl s5; +}; + +struct sockaddr_any { + struct sockaddr addr; + char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; +}; + +*/ +import "C" + +// Machine characteristics + +const ( + SizeofPtr = C.sizeofPtr + SizeofShort = C.sizeof_short + SizeofInt = C.sizeof_int + SizeofLong = C.sizeof_long + SizeofLongLong = C.sizeof_longlong + PathMax = C.PATH_MAX +) + +// Basic types + +type ( + _C_short C.short + _C_int C.int + _C_long C.long + _C_long_long C.longlong +) + +type off64 C.off64_t +type off C.off_t +type Mode_t C.mode_t + +// Time + +type Timespec C.struct_timespec + +type StTimespec C.struct_st_timespec + +type Timeval C.struct_timeval + +type Timeval32 C.struct_timeval32 + +type Timex C.struct_timex + +type Time_t C.time_t + +type Tms C.struct_tms + +type Utimbuf C.struct_utimbuf + +type Timezone C.struct_timezone + +// Processes + +type Rusage C.struct_rusage + +type Rlimit C.struct_rlimit64 + +type Pid_t C.pid_t + +type _Gid_t C.gid_t + +type dev_t C.dev_t + +// Files + +type Stat_t C.struct_stat + +type StatxTimestamp C.struct_statx_timestamp + +type Statx_t C.struct_statx + +type Dirent C.struct_dirent + +// Sockets + +type RawSockaddrInet4 C.struct_sockaddr_in + +type RawSockaddrInet6 C.struct_sockaddr_in6 + +type RawSockaddrUnix C.struct_sockaddr_un + +type RawSockaddr C.struct_sockaddr + +type RawSockaddrAny C.struct_sockaddr_any + +type _Socklen C.socklen_t + +type Cmsghdr C.struct_cmsghdr + +type ICMPv6Filter C.struct_icmp6_filter + +type Iovec C.struct_iovec + +type IPMreq C.struct_ip_mreq + +type IPv6Mreq C.struct_ipv6_mreq + +type IPv6MTUInfo C.struct_ip6_mtuinfo + +type Linger C.struct_linger + +type Msghdr C.struct_msghdr + +const ( + SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in + SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + SizeofSockaddrAny = C.sizeof_struct_sockaddr_any + SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un + SizeofLinger = C.sizeof_struct_linger + SizeofIPMreq = C.sizeof_struct_ip_mreq + SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo + SizeofMsghdr = C.sizeof_struct_msghdr + SizeofCmsghdr = C.sizeof_struct_cmsghdr + SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +// Routing and interface messages + +const ( + SizeofIfMsghdr = C.sizeof_struct_if_msghdr +) + +type IfMsgHdr C.struct_if_msghdr + +// Misc + +type FdSet C.fd_set + +type Utsname C.struct_utsname + +type Ustat_t C.struct_ustat + +type Sigset_t C.sigset_t + +const ( + AT_FDCWD = C.AT_FDCWD + AT_REMOVEDIR = C.AT_REMOVEDIR + AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW +) + +// Terminal handling + +type Termios C.struct_termios + +type Termio C.struct_termio + +type Winsize C.struct_winsize + +//poll + +type PollFd struct { + Fd int32 + Events uint16 + Revents uint16 +} + +const ( + POLLERR = C.POLLERR + POLLHUP = C.POLLHUP + POLLIN = C.POLLIN + POLLNVAL = C.POLLNVAL + POLLOUT = C.POLLOUT + POLLPRI = C.POLLPRI + POLLRDBAND = C.POLLRDBAND + POLLRDNORM = C.POLLRDNORM + POLLWRBAND = C.POLLWRBAND + POLLWRNORM = C.POLLWRNORM +) + +//flock_t + +type Flock_t C.struct_flock64 + +// Statfs + +type Fsid_t C.struct_fsid_t +type Fsid64_t C.struct_fsid64_t + +type Statfs_t C.struct_statfs + +const RNDGETENTCNT = 0x80045200 diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/types_darwin.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/types_darwin.go new file mode 100644 index 00000000..9fd2aaa6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/types_darwin.go @@ -0,0 +1,277 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +/* +Input to cgo -godefs. See README.md +*/ + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package unix + +/* +#define __DARWIN_UNIX03 0 +#define KERNEL +#define _DARWIN_USE_64_BIT_INODE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +enum { + sizeofPtr = sizeof(void*), +}; + +union sockaddr_all { + struct sockaddr s1; // this one gets used for fields + struct sockaddr_in s2; // these pad it out + struct sockaddr_in6 s3; + struct sockaddr_un s4; + struct sockaddr_dl s5; +}; + +struct sockaddr_any { + struct sockaddr addr; + char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; +}; + +*/ +import "C" + +// Machine characteristics + +const ( + SizeofPtr = C.sizeofPtr + SizeofShort = C.sizeof_short + SizeofInt = C.sizeof_int + SizeofLong = C.sizeof_long + SizeofLongLong = C.sizeof_longlong +) + +// Basic types + +type ( + _C_short C.short + _C_int C.int + _C_long C.long + _C_long_long C.longlong +) + +// Time + +type Timespec C.struct_timespec + +type Timeval C.struct_timeval + +type Timeval32 C.struct_timeval32 + +// Processes + +type Rusage C.struct_rusage + +type Rlimit C.struct_rlimit + +type _Gid_t C.gid_t + +// Files + +type Stat_t C.struct_stat64 + +type Statfs_t C.struct_statfs64 + +type Flock_t C.struct_flock + +type Fstore_t C.struct_fstore + +type Radvisory_t C.struct_radvisory + +type Fbootstraptransfer_t C.struct_fbootstraptransfer + +type Log2phys_t C.struct_log2phys + +type Fsid C.struct_fsid + +type Dirent C.struct_dirent + +// Sockets + +type RawSockaddrInet4 C.struct_sockaddr_in + +type RawSockaddrInet6 C.struct_sockaddr_in6 + +type RawSockaddrUnix C.struct_sockaddr_un + +type RawSockaddrDatalink C.struct_sockaddr_dl + +type RawSockaddr C.struct_sockaddr + +type RawSockaddrAny C.struct_sockaddr_any + +type _Socklen C.socklen_t + +type Linger C.struct_linger + +type Iovec C.struct_iovec + +type IPMreq C.struct_ip_mreq + +type IPv6Mreq C.struct_ipv6_mreq + +type Msghdr C.struct_msghdr + +type Cmsghdr C.struct_cmsghdr + +type Inet4Pktinfo C.struct_in_pktinfo + +type Inet6Pktinfo C.struct_in6_pktinfo + +type IPv6MTUInfo C.struct_ip6_mtuinfo + +type ICMPv6Filter C.struct_icmp6_filter + +const ( + SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in + SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + SizeofSockaddrAny = C.sizeof_struct_sockaddr_any + SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un + SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl + SizeofLinger = C.sizeof_struct_linger + SizeofIPMreq = C.sizeof_struct_ip_mreq + SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + SizeofMsghdr = C.sizeof_struct_msghdr + SizeofCmsghdr = C.sizeof_struct_cmsghdr + SizeofInet4Pktinfo = C.sizeof_struct_in_pktinfo + SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo + SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +// Ptrace requests + +const ( + PTRACE_TRACEME = C.PT_TRACE_ME + PTRACE_CONT = C.PT_CONTINUE + PTRACE_KILL = C.PT_KILL +) + +// Events (kqueue, kevent) + +type Kevent_t C.struct_kevent + +// Select + +type FdSet C.fd_set + +// Routing and interface messages + +const ( + SizeofIfMsghdr = C.sizeof_struct_if_msghdr + SizeofIfData = C.sizeof_struct_if_data + SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr + SizeofIfmaMsghdr = C.sizeof_struct_ifma_msghdr + SizeofIfmaMsghdr2 = C.sizeof_struct_ifma_msghdr2 + SizeofRtMsghdr = C.sizeof_struct_rt_msghdr + SizeofRtMetrics = C.sizeof_struct_rt_metrics +) + +type IfMsghdr C.struct_if_msghdr + +type IfData C.struct_if_data + +type IfaMsghdr C.struct_ifa_msghdr + +type IfmaMsghdr C.struct_ifma_msghdr + +type IfmaMsghdr2 C.struct_ifma_msghdr2 + +type RtMsghdr C.struct_rt_msghdr + +type RtMetrics C.struct_rt_metrics + +// Berkeley packet filter + +const ( + SizeofBpfVersion = C.sizeof_struct_bpf_version + SizeofBpfStat = C.sizeof_struct_bpf_stat + SizeofBpfProgram = C.sizeof_struct_bpf_program + SizeofBpfInsn = C.sizeof_struct_bpf_insn + SizeofBpfHdr = C.sizeof_struct_bpf_hdr +) + +type BpfVersion C.struct_bpf_version + +type BpfStat C.struct_bpf_stat + +type BpfProgram C.struct_bpf_program + +type BpfInsn C.struct_bpf_insn + +type BpfHdr C.struct_bpf_hdr + +// Terminal handling + +type Termios C.struct_termios + +type Winsize C.struct_winsize + +// fchmodat-like syscalls. + +const ( + AT_FDCWD = C.AT_FDCWD + AT_REMOVEDIR = C.AT_REMOVEDIR + AT_SYMLINK_FOLLOW = C.AT_SYMLINK_FOLLOW + AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW +) + +// poll + +type PollFd C.struct_pollfd + +const ( + POLLERR = C.POLLERR + POLLHUP = C.POLLHUP + POLLIN = C.POLLIN + POLLNVAL = C.POLLNVAL + POLLOUT = C.POLLOUT + POLLPRI = C.POLLPRI + POLLRDBAND = C.POLLRDBAND + POLLRDNORM = C.POLLRDNORM + POLLWRBAND = C.POLLWRBAND + POLLWRNORM = C.POLLWRNORM +) + +// uname + +type Utsname C.struct_utsname diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/types_dragonfly.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/types_dragonfly.go new file mode 100644 index 00000000..3365dd79 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/types_dragonfly.go @@ -0,0 +1,263 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +/* +Input to cgo -godefs. See README.md +*/ + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package unix + +/* +#define KERNEL +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +enum { + sizeofPtr = sizeof(void*), +}; + +union sockaddr_all { + struct sockaddr s1; // this one gets used for fields + struct sockaddr_in s2; // these pad it out + struct sockaddr_in6 s3; + struct sockaddr_un s4; + struct sockaddr_dl s5; +}; + +struct sockaddr_any { + struct sockaddr addr; + char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; +}; + +*/ +import "C" + +// Machine characteristics + +const ( + SizeofPtr = C.sizeofPtr + SizeofShort = C.sizeof_short + SizeofInt = C.sizeof_int + SizeofLong = C.sizeof_long + SizeofLongLong = C.sizeof_longlong +) + +// Basic types + +type ( + _C_short C.short + _C_int C.int + _C_long C.long + _C_long_long C.longlong +) + +// Time + +type Timespec C.struct_timespec + +type Timeval C.struct_timeval + +// Processes + +type Rusage C.struct_rusage + +type Rlimit C.struct_rlimit + +type _Gid_t C.gid_t + +// Files + +type Stat_t C.struct_stat + +type Statfs_t C.struct_statfs + +type Flock_t C.struct_flock + +type Dirent C.struct_dirent + +type Fsid C.struct_fsid + +// File system limits + +const ( + PathMax = C.PATH_MAX +) + +// Sockets + +type RawSockaddrInet4 C.struct_sockaddr_in + +type RawSockaddrInet6 C.struct_sockaddr_in6 + +type RawSockaddrUnix C.struct_sockaddr_un + +type RawSockaddrDatalink C.struct_sockaddr_dl + +type RawSockaddr C.struct_sockaddr + +type RawSockaddrAny C.struct_sockaddr_any + +type _Socklen C.socklen_t + +type Linger C.struct_linger + +type Iovec C.struct_iovec + +type IPMreq C.struct_ip_mreq + +type IPv6Mreq C.struct_ipv6_mreq + +type Msghdr C.struct_msghdr + +type Cmsghdr C.struct_cmsghdr + +type Inet6Pktinfo C.struct_in6_pktinfo + +type IPv6MTUInfo C.struct_ip6_mtuinfo + +type ICMPv6Filter C.struct_icmp6_filter + +const ( + SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in + SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + SizeofSockaddrAny = C.sizeof_struct_sockaddr_any + SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un + SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl + SizeofLinger = C.sizeof_struct_linger + SizeofIPMreq = C.sizeof_struct_ip_mreq + SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + SizeofMsghdr = C.sizeof_struct_msghdr + SizeofCmsghdr = C.sizeof_struct_cmsghdr + SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo + SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +// Ptrace requests + +const ( + PTRACE_TRACEME = C.PT_TRACE_ME + PTRACE_CONT = C.PT_CONTINUE + PTRACE_KILL = C.PT_KILL +) + +// Events (kqueue, kevent) + +type Kevent_t C.struct_kevent + +// Select + +type FdSet C.fd_set + +// Routing and interface messages + +const ( + SizeofIfMsghdr = C.sizeof_struct_if_msghdr + SizeofIfData = C.sizeof_struct_if_data + SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr + SizeofIfmaMsghdr = C.sizeof_struct_ifma_msghdr + SizeofIfAnnounceMsghdr = C.sizeof_struct_if_announcemsghdr + SizeofRtMsghdr = C.sizeof_struct_rt_msghdr + SizeofRtMetrics = C.sizeof_struct_rt_metrics +) + +type IfMsghdr C.struct_if_msghdr + +type IfData C.struct_if_data + +type IfaMsghdr C.struct_ifa_msghdr + +type IfmaMsghdr C.struct_ifma_msghdr + +type IfAnnounceMsghdr C.struct_if_announcemsghdr + +type RtMsghdr C.struct_rt_msghdr + +type RtMetrics C.struct_rt_metrics + +// Berkeley packet filter + +const ( + SizeofBpfVersion = C.sizeof_struct_bpf_version + SizeofBpfStat = C.sizeof_struct_bpf_stat + SizeofBpfProgram = C.sizeof_struct_bpf_program + SizeofBpfInsn = C.sizeof_struct_bpf_insn + SizeofBpfHdr = C.sizeof_struct_bpf_hdr +) + +type BpfVersion C.struct_bpf_version + +type BpfStat C.struct_bpf_stat + +type BpfProgram C.struct_bpf_program + +type BpfInsn C.struct_bpf_insn + +type BpfHdr C.struct_bpf_hdr + +// Terminal handling + +type Termios C.struct_termios + +type Winsize C.struct_winsize + +// fchmodat-like syscalls. + +const ( + AT_FDCWD = C.AT_FDCWD + AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW +) + +// poll + +type PollFd C.struct_pollfd + +const ( + POLLERR = C.POLLERR + POLLHUP = C.POLLHUP + POLLIN = C.POLLIN + POLLNVAL = C.POLLNVAL + POLLOUT = C.POLLOUT + POLLPRI = C.POLLPRI + POLLRDBAND = C.POLLRDBAND + POLLRDNORM = C.POLLRDNORM + POLLWRBAND = C.POLLWRBAND + POLLWRNORM = C.POLLWRNORM +) + +// Uname + +type Utsname C.struct_utsname diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/types_freebsd.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/types_freebsd.go new file mode 100644 index 00000000..8421ccf1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/types_freebsd.go @@ -0,0 +1,356 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +/* +Input to cgo -godefs. See README.md +*/ + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package unix + +/* +#define _WANT_FREEBSD11_STAT 1 +#define _WANT_FREEBSD11_STATFS 1 +#define _WANT_FREEBSD11_DIRENT 1 +#define _WANT_FREEBSD11_KEVENT 1 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +enum { + sizeofPtr = sizeof(void*), +}; + +union sockaddr_all { + struct sockaddr s1; // this one gets used for fields + struct sockaddr_in s2; // these pad it out + struct sockaddr_in6 s3; + struct sockaddr_un s4; + struct sockaddr_dl s5; +}; + +struct sockaddr_any { + struct sockaddr addr; + char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; +}; + +// This structure is a duplicate of if_data on FreeBSD 8-STABLE. +// See /usr/include/net/if.h. +struct if_data8 { + u_char ifi_type; + u_char ifi_physical; + u_char ifi_addrlen; + u_char ifi_hdrlen; + u_char ifi_link_state; + u_char ifi_spare_char1; + u_char ifi_spare_char2; + u_char ifi_datalen; + u_long ifi_mtu; + u_long ifi_metric; + u_long ifi_baudrate; + u_long ifi_ipackets; + u_long ifi_ierrors; + u_long ifi_opackets; + u_long ifi_oerrors; + u_long ifi_collisions; + u_long ifi_ibytes; + u_long ifi_obytes; + u_long ifi_imcasts; + u_long ifi_omcasts; + u_long ifi_iqdrops; + u_long ifi_noproto; + u_long ifi_hwassist; +// FIXME: these are now unions, so maybe need to change definitions? +#undef ifi_epoch + time_t ifi_epoch; +#undef ifi_lastchange + struct timeval ifi_lastchange; +}; + +// This structure is a duplicate of if_msghdr on FreeBSD 8-STABLE. +// See /usr/include/net/if.h. +struct if_msghdr8 { + u_short ifm_msglen; + u_char ifm_version; + u_char ifm_type; + int ifm_addrs; + int ifm_flags; + u_short ifm_index; + struct if_data8 ifm_data; +}; +*/ +import "C" + +// Machine characteristics + +const ( + SizeofPtr = C.sizeofPtr + SizeofShort = C.sizeof_short + SizeofInt = C.sizeof_int + SizeofLong = C.sizeof_long + SizeofLongLong = C.sizeof_longlong +) + +// Basic types + +type ( + _C_short C.short + _C_int C.int + _C_long C.long + _C_long_long C.longlong +) + +// Time + +type Timespec C.struct_timespec + +type Timeval C.struct_timeval + +// Processes + +type Rusage C.struct_rusage + +type Rlimit C.struct_rlimit + +type _Gid_t C.gid_t + +// Files + +const ( + _statfsVersion = C.STATFS_VERSION + _dirblksiz = C.DIRBLKSIZ +) + +type Stat_t C.struct_stat + +type stat_freebsd11_t C.struct_freebsd11_stat + +type Statfs_t C.struct_statfs + +type statfs_freebsd11_t C.struct_freebsd11_statfs + +type Flock_t C.struct_flock + +type Dirent C.struct_dirent + +type dirent_freebsd11 C.struct_freebsd11_dirent + +type Fsid C.struct_fsid + +// File system limits + +const ( + PathMax = C.PATH_MAX +) + +// Advice to Fadvise + +const ( + FADV_NORMAL = C.POSIX_FADV_NORMAL + FADV_RANDOM = C.POSIX_FADV_RANDOM + FADV_SEQUENTIAL = C.POSIX_FADV_SEQUENTIAL + FADV_WILLNEED = C.POSIX_FADV_WILLNEED + FADV_DONTNEED = C.POSIX_FADV_DONTNEED + FADV_NOREUSE = C.POSIX_FADV_NOREUSE +) + +// Sockets + +type RawSockaddrInet4 C.struct_sockaddr_in + +type RawSockaddrInet6 C.struct_sockaddr_in6 + +type RawSockaddrUnix C.struct_sockaddr_un + +type RawSockaddrDatalink C.struct_sockaddr_dl + +type RawSockaddr C.struct_sockaddr + +type RawSockaddrAny C.struct_sockaddr_any + +type _Socklen C.socklen_t + +type Linger C.struct_linger + +type Iovec C.struct_iovec + +type IPMreq C.struct_ip_mreq + +type IPMreqn C.struct_ip_mreqn + +type IPv6Mreq C.struct_ipv6_mreq + +type Msghdr C.struct_msghdr + +type Cmsghdr C.struct_cmsghdr + +type Inet6Pktinfo C.struct_in6_pktinfo + +type IPv6MTUInfo C.struct_ip6_mtuinfo + +type ICMPv6Filter C.struct_icmp6_filter + +const ( + SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in + SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + SizeofSockaddrAny = C.sizeof_struct_sockaddr_any + SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un + SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl + SizeofLinger = C.sizeof_struct_linger + SizeofIPMreq = C.sizeof_struct_ip_mreq + SizeofIPMreqn = C.sizeof_struct_ip_mreqn + SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + SizeofMsghdr = C.sizeof_struct_msghdr + SizeofCmsghdr = C.sizeof_struct_cmsghdr + SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo + SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +// Ptrace requests + +const ( + PTRACE_TRACEME = C.PT_TRACE_ME + PTRACE_CONT = C.PT_CONTINUE + PTRACE_KILL = C.PT_KILL +) + +// Events (kqueue, kevent) + +type Kevent_t C.struct_kevent_freebsd11 + +// Select + +type FdSet C.fd_set + +// Routing and interface messages + +const ( + sizeofIfMsghdr = C.sizeof_struct_if_msghdr + SizeofIfMsghdr = C.sizeof_struct_if_msghdr8 + sizeofIfData = C.sizeof_struct_if_data + SizeofIfData = C.sizeof_struct_if_data8 + SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr + SizeofIfmaMsghdr = C.sizeof_struct_ifma_msghdr + SizeofIfAnnounceMsghdr = C.sizeof_struct_if_announcemsghdr + SizeofRtMsghdr = C.sizeof_struct_rt_msghdr + SizeofRtMetrics = C.sizeof_struct_rt_metrics +) + +type ifMsghdr C.struct_if_msghdr + +type IfMsghdr C.struct_if_msghdr8 + +type ifData C.struct_if_data + +type IfData C.struct_if_data8 + +type IfaMsghdr C.struct_ifa_msghdr + +type IfmaMsghdr C.struct_ifma_msghdr + +type IfAnnounceMsghdr C.struct_if_announcemsghdr + +type RtMsghdr C.struct_rt_msghdr + +type RtMetrics C.struct_rt_metrics + +// Berkeley packet filter + +const ( + SizeofBpfVersion = C.sizeof_struct_bpf_version + SizeofBpfStat = C.sizeof_struct_bpf_stat + SizeofBpfZbuf = C.sizeof_struct_bpf_zbuf + SizeofBpfProgram = C.sizeof_struct_bpf_program + SizeofBpfInsn = C.sizeof_struct_bpf_insn + SizeofBpfHdr = C.sizeof_struct_bpf_hdr + SizeofBpfZbufHeader = C.sizeof_struct_bpf_zbuf_header +) + +type BpfVersion C.struct_bpf_version + +type BpfStat C.struct_bpf_stat + +type BpfZbuf C.struct_bpf_zbuf + +type BpfProgram C.struct_bpf_program + +type BpfInsn C.struct_bpf_insn + +type BpfHdr C.struct_bpf_hdr + +type BpfZbufHeader C.struct_bpf_zbuf_header + +// Terminal handling + +type Termios C.struct_termios + +type Winsize C.struct_winsize + +// fchmodat-like syscalls. + +const ( + AT_FDCWD = C.AT_FDCWD + AT_REMOVEDIR = C.AT_REMOVEDIR + AT_SYMLINK_FOLLOW = C.AT_SYMLINK_FOLLOW + AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW +) + +// poll + +type PollFd C.struct_pollfd + +const ( + POLLERR = C.POLLERR + POLLHUP = C.POLLHUP + POLLIN = C.POLLIN + POLLINIGNEOF = C.POLLINIGNEOF + POLLNVAL = C.POLLNVAL + POLLOUT = C.POLLOUT + POLLPRI = C.POLLPRI + POLLRDBAND = C.POLLRDBAND + POLLRDNORM = C.POLLRDNORM + POLLWRBAND = C.POLLWRBAND + POLLWRNORM = C.POLLWRNORM +) + +// Capabilities + +type CapRights C.struct_cap_rights + +// Uname + +type Utsname C.struct_utsname diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/types_netbsd.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/types_netbsd.go new file mode 100644 index 00000000..1edbf1ba --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/types_netbsd.go @@ -0,0 +1,287 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +/* +Input to cgo -godefs. See README.md +*/ + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package unix + +/* +#define KERNEL +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +enum { + sizeofPtr = sizeof(void*), +}; + +union sockaddr_all { + struct sockaddr s1; // this one gets used for fields + struct sockaddr_in s2; // these pad it out + struct sockaddr_in6 s3; + struct sockaddr_un s4; + struct sockaddr_dl s5; +}; + +struct sockaddr_any { + struct sockaddr addr; + char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; +}; + +*/ +import "C" + +// Machine characteristics + +const ( + SizeofPtr = C.sizeofPtr + SizeofShort = C.sizeof_short + SizeofInt = C.sizeof_int + SizeofLong = C.sizeof_long + SizeofLongLong = C.sizeof_longlong +) + +// Basic types + +type ( + _C_short C.short + _C_int C.int + _C_long C.long + _C_long_long C.longlong +) + +// Time + +type Timespec C.struct_timespec + +type Timeval C.struct_timeval + +// Processes + +type Rusage C.struct_rusage + +type Rlimit C.struct_rlimit + +type _Gid_t C.gid_t + +// Files + +type Stat_t C.struct_stat + +type Statfs_t C.struct_statfs + +type Flock_t C.struct_flock + +type Dirent C.struct_dirent + +type Fsid C.fsid_t + +// File system limits + +const ( + PathMax = C.PATH_MAX +) + +// Advice to Fadvise + +const ( + FADV_NORMAL = C.POSIX_FADV_NORMAL + FADV_RANDOM = C.POSIX_FADV_RANDOM + FADV_SEQUENTIAL = C.POSIX_FADV_SEQUENTIAL + FADV_WILLNEED = C.POSIX_FADV_WILLNEED + FADV_DONTNEED = C.POSIX_FADV_DONTNEED + FADV_NOREUSE = C.POSIX_FADV_NOREUSE +) + +// Sockets + +type RawSockaddrInet4 C.struct_sockaddr_in + +type RawSockaddrInet6 C.struct_sockaddr_in6 + +type RawSockaddrUnix C.struct_sockaddr_un + +type RawSockaddrDatalink C.struct_sockaddr_dl + +type RawSockaddr C.struct_sockaddr + +type RawSockaddrAny C.struct_sockaddr_any + +type _Socklen C.socklen_t + +type Linger C.struct_linger + +type Iovec C.struct_iovec + +type IPMreq C.struct_ip_mreq + +type IPv6Mreq C.struct_ipv6_mreq + +type Msghdr C.struct_msghdr + +type Cmsghdr C.struct_cmsghdr + +type Inet6Pktinfo C.struct_in6_pktinfo + +type IPv6MTUInfo C.struct_ip6_mtuinfo + +type ICMPv6Filter C.struct_icmp6_filter + +const ( + SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in + SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + SizeofSockaddrAny = C.sizeof_struct_sockaddr_any + SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un + SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl + SizeofLinger = C.sizeof_struct_linger + SizeofIPMreq = C.sizeof_struct_ip_mreq + SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + SizeofMsghdr = C.sizeof_struct_msghdr + SizeofCmsghdr = C.sizeof_struct_cmsghdr + SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo + SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +// Ptrace requests + +const ( + PTRACE_TRACEME = C.PT_TRACE_ME + PTRACE_CONT = C.PT_CONTINUE + PTRACE_KILL = C.PT_KILL +) + +// Events (kqueue, kevent) + +type Kevent_t C.struct_kevent + +// Select + +type FdSet C.fd_set + +// Routing and interface messages + +const ( + SizeofIfMsghdr = C.sizeof_struct_if_msghdr + SizeofIfData = C.sizeof_struct_if_data + SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr + SizeofIfAnnounceMsghdr = C.sizeof_struct_if_announcemsghdr + SizeofRtMsghdr = C.sizeof_struct_rt_msghdr + SizeofRtMetrics = C.sizeof_struct_rt_metrics +) + +type IfMsghdr C.struct_if_msghdr + +type IfData C.struct_if_data + +type IfaMsghdr C.struct_ifa_msghdr + +type IfAnnounceMsghdr C.struct_if_announcemsghdr + +type RtMsghdr C.struct_rt_msghdr + +type RtMetrics C.struct_rt_metrics + +type Mclpool C.struct_mclpool + +// Berkeley packet filter + +const ( + SizeofBpfVersion = C.sizeof_struct_bpf_version + SizeofBpfStat = C.sizeof_struct_bpf_stat + SizeofBpfProgram = C.sizeof_struct_bpf_program + SizeofBpfInsn = C.sizeof_struct_bpf_insn + SizeofBpfHdr = C.sizeof_struct_bpf_hdr +) + +type BpfVersion C.struct_bpf_version + +type BpfStat C.struct_bpf_stat + +type BpfProgram C.struct_bpf_program + +type BpfInsn C.struct_bpf_insn + +type BpfHdr C.struct_bpf_hdr + +type BpfTimeval C.struct_bpf_timeval + +// Terminal handling + +type Termios C.struct_termios + +type Winsize C.struct_winsize + +// fchmodat-like syscalls. + +const ( + AT_FDCWD = C.AT_FDCWD + AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW +) + +// poll + +type PollFd C.struct_pollfd + +const ( + POLLERR = C.POLLERR + POLLHUP = C.POLLHUP + POLLIN = C.POLLIN + POLLNVAL = C.POLLNVAL + POLLOUT = C.POLLOUT + POLLPRI = C.POLLPRI + POLLRDBAND = C.POLLRDBAND + POLLRDNORM = C.POLLRDNORM + POLLWRBAND = C.POLLWRBAND + POLLWRNORM = C.POLLWRNORM +) + +// Sysctl + +type Sysctlnode C.struct_sysctlnode + +// Uname + +type Utsname C.struct_utsname + +// Clockinfo + +const SizeofClockinfo = C.sizeof_struct_clockinfo + +type Clockinfo C.struct_clockinfo diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/types_openbsd.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/types_openbsd.go new file mode 100644 index 00000000..4e5e57f9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/types_openbsd.go @@ -0,0 +1,276 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +/* +Input to cgo -godefs. See README.md +*/ + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package unix + +/* +#define KERNEL +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +enum { + sizeofPtr = sizeof(void*), +}; + +union sockaddr_all { + struct sockaddr s1; // this one gets used for fields + struct sockaddr_in s2; // these pad it out + struct sockaddr_in6 s3; + struct sockaddr_un s4; + struct sockaddr_dl s5; +}; + +struct sockaddr_any { + struct sockaddr addr; + char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; +}; + +*/ +import "C" + +// Machine characteristics + +const ( + SizeofPtr = C.sizeofPtr + SizeofShort = C.sizeof_short + SizeofInt = C.sizeof_int + SizeofLong = C.sizeof_long + SizeofLongLong = C.sizeof_longlong +) + +// Basic types + +type ( + _C_short C.short + _C_int C.int + _C_long C.long + _C_long_long C.longlong +) + +// Time + +type Timespec C.struct_timespec + +type Timeval C.struct_timeval + +// Processes + +type Rusage C.struct_rusage + +type Rlimit C.struct_rlimit + +type _Gid_t C.gid_t + +// Files + +type Stat_t C.struct_stat + +type Statfs_t C.struct_statfs + +type Flock_t C.struct_flock + +type Dirent C.struct_dirent + +type Fsid C.fsid_t + +// File system limits + +const ( + PathMax = C.PATH_MAX +) + +// Sockets + +type RawSockaddrInet4 C.struct_sockaddr_in + +type RawSockaddrInet6 C.struct_sockaddr_in6 + +type RawSockaddrUnix C.struct_sockaddr_un + +type RawSockaddrDatalink C.struct_sockaddr_dl + +type RawSockaddr C.struct_sockaddr + +type RawSockaddrAny C.struct_sockaddr_any + +type _Socklen C.socklen_t + +type Linger C.struct_linger + +type Iovec C.struct_iovec + +type IPMreq C.struct_ip_mreq + +type IPv6Mreq C.struct_ipv6_mreq + +type Msghdr C.struct_msghdr + +type Cmsghdr C.struct_cmsghdr + +type Inet6Pktinfo C.struct_in6_pktinfo + +type IPv6MTUInfo C.struct_ip6_mtuinfo + +type ICMPv6Filter C.struct_icmp6_filter + +const ( + SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in + SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + SizeofSockaddrAny = C.sizeof_struct_sockaddr_any + SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un + SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl + SizeofLinger = C.sizeof_struct_linger + SizeofIPMreq = C.sizeof_struct_ip_mreq + SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + SizeofMsghdr = C.sizeof_struct_msghdr + SizeofCmsghdr = C.sizeof_struct_cmsghdr + SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo + SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +// Ptrace requests + +const ( + PTRACE_TRACEME = C.PT_TRACE_ME + PTRACE_CONT = C.PT_CONTINUE + PTRACE_KILL = C.PT_KILL +) + +// Events (kqueue, kevent) + +type Kevent_t C.struct_kevent + +// Select + +type FdSet C.fd_set + +// Routing and interface messages + +const ( + SizeofIfMsghdr = C.sizeof_struct_if_msghdr + SizeofIfData = C.sizeof_struct_if_data + SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr + SizeofIfAnnounceMsghdr = C.sizeof_struct_if_announcemsghdr + SizeofRtMsghdr = C.sizeof_struct_rt_msghdr + SizeofRtMetrics = C.sizeof_struct_rt_metrics +) + +type IfMsghdr C.struct_if_msghdr + +type IfData C.struct_if_data + +type IfaMsghdr C.struct_ifa_msghdr + +type IfAnnounceMsghdr C.struct_if_announcemsghdr + +type RtMsghdr C.struct_rt_msghdr + +type RtMetrics C.struct_rt_metrics + +type Mclpool C.struct_mclpool + +// Berkeley packet filter + +const ( + SizeofBpfVersion = C.sizeof_struct_bpf_version + SizeofBpfStat = C.sizeof_struct_bpf_stat + SizeofBpfProgram = C.sizeof_struct_bpf_program + SizeofBpfInsn = C.sizeof_struct_bpf_insn + SizeofBpfHdr = C.sizeof_struct_bpf_hdr +) + +type BpfVersion C.struct_bpf_version + +type BpfStat C.struct_bpf_stat + +type BpfProgram C.struct_bpf_program + +type BpfInsn C.struct_bpf_insn + +type BpfHdr C.struct_bpf_hdr + +type BpfTimeval C.struct_bpf_timeval + +// Terminal handling + +type Termios C.struct_termios + +type Winsize C.struct_winsize + +// fchmodat-like syscalls. + +const ( + AT_FDCWD = C.AT_FDCWD + AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW +) + +// poll + +type PollFd C.struct_pollfd + +const ( + POLLERR = C.POLLERR + POLLHUP = C.POLLHUP + POLLIN = C.POLLIN + POLLNVAL = C.POLLNVAL + POLLOUT = C.POLLOUT + POLLPRI = C.POLLPRI + POLLRDBAND = C.POLLRDBAND + POLLRDNORM = C.POLLRDNORM + POLLWRBAND = C.POLLWRBAND + POLLWRNORM = C.POLLWRNORM +) + +// Signal Sets + +type Sigset_t C.sigset_t + +// Uname + +type Utsname C.struct_utsname + +// Uvmexp + +const SizeofUvmexp = C.sizeof_struct_uvmexp + +type Uvmexp C.struct_uvmexp diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/types_solaris.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/types_solaris.go new file mode 100644 index 00000000..2b716f93 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/types_solaris.go @@ -0,0 +1,266 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +/* +Input to cgo -godefs. See README.md +*/ + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package unix + +/* +#define KERNEL +// These defines ensure that builds done on newer versions of Solaris are +// backwards-compatible with older versions of Solaris and +// OpenSolaris-based derivatives. +#define __USE_SUNOS_SOCKETS__ // msghdr +#define __USE_LEGACY_PROTOTYPES__ // iovec +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +enum { + sizeofPtr = sizeof(void*), +}; + +union sockaddr_all { + struct sockaddr s1; // this one gets used for fields + struct sockaddr_in s2; // these pad it out + struct sockaddr_in6 s3; + struct sockaddr_un s4; + struct sockaddr_dl s5; +}; + +struct sockaddr_any { + struct sockaddr addr; + char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; +}; + +*/ +import "C" + +// Machine characteristics + +const ( + SizeofPtr = C.sizeofPtr + SizeofShort = C.sizeof_short + SizeofInt = C.sizeof_int + SizeofLong = C.sizeof_long + SizeofLongLong = C.sizeof_longlong + PathMax = C.PATH_MAX + MaxHostNameLen = C.MAXHOSTNAMELEN +) + +// Basic types + +type ( + _C_short C.short + _C_int C.int + _C_long C.long + _C_long_long C.longlong +) + +// Time + +type Timespec C.struct_timespec + +type Timeval C.struct_timeval + +type Timeval32 C.struct_timeval32 + +type Tms C.struct_tms + +type Utimbuf C.struct_utimbuf + +// Processes + +type Rusage C.struct_rusage + +type Rlimit C.struct_rlimit + +type _Gid_t C.gid_t + +// Files + +type Stat_t C.struct_stat + +type Flock_t C.struct_flock + +type Dirent C.struct_dirent + +// Filesystems + +type _Fsblkcnt_t C.fsblkcnt_t + +type Statvfs_t C.struct_statvfs + +// Sockets + +type RawSockaddrInet4 C.struct_sockaddr_in + +type RawSockaddrInet6 C.struct_sockaddr_in6 + +type RawSockaddrUnix C.struct_sockaddr_un + +type RawSockaddrDatalink C.struct_sockaddr_dl + +type RawSockaddr C.struct_sockaddr + +type RawSockaddrAny C.struct_sockaddr_any + +type _Socklen C.socklen_t + +type Linger C.struct_linger + +type Iovec C.struct_iovec + +type IPMreq C.struct_ip_mreq + +type IPv6Mreq C.struct_ipv6_mreq + +type Msghdr C.struct_msghdr + +type Cmsghdr C.struct_cmsghdr + +type Inet6Pktinfo C.struct_in6_pktinfo + +type IPv6MTUInfo C.struct_ip6_mtuinfo + +type ICMPv6Filter C.struct_icmp6_filter + +const ( + SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in + SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + SizeofSockaddrAny = C.sizeof_struct_sockaddr_any + SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un + SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl + SizeofLinger = C.sizeof_struct_linger + SizeofIPMreq = C.sizeof_struct_ip_mreq + SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + SizeofMsghdr = C.sizeof_struct_msghdr + SizeofCmsghdr = C.sizeof_struct_cmsghdr + SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo + SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +// Select + +type FdSet C.fd_set + +// Misc + +type Utsname C.struct_utsname + +type Ustat_t C.struct_ustat + +const ( + AT_FDCWD = C.AT_FDCWD + AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW + AT_SYMLINK_FOLLOW = C.AT_SYMLINK_FOLLOW + AT_REMOVEDIR = C.AT_REMOVEDIR + AT_EACCESS = C.AT_EACCESS +) + +// Routing and interface messages + +const ( + SizeofIfMsghdr = C.sizeof_struct_if_msghdr + SizeofIfData = C.sizeof_struct_if_data + SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr + SizeofRtMsghdr = C.sizeof_struct_rt_msghdr + SizeofRtMetrics = C.sizeof_struct_rt_metrics +) + +type IfMsghdr C.struct_if_msghdr + +type IfData C.struct_if_data + +type IfaMsghdr C.struct_ifa_msghdr + +type RtMsghdr C.struct_rt_msghdr + +type RtMetrics C.struct_rt_metrics + +// Berkeley packet filter + +const ( + SizeofBpfVersion = C.sizeof_struct_bpf_version + SizeofBpfStat = C.sizeof_struct_bpf_stat + SizeofBpfProgram = C.sizeof_struct_bpf_program + SizeofBpfInsn = C.sizeof_struct_bpf_insn + SizeofBpfHdr = C.sizeof_struct_bpf_hdr +) + +type BpfVersion C.struct_bpf_version + +type BpfStat C.struct_bpf_stat + +type BpfProgram C.struct_bpf_program + +type BpfInsn C.struct_bpf_insn + +type BpfTimeval C.struct_bpf_timeval + +type BpfHdr C.struct_bpf_hdr + +// Terminal handling + +type Termios C.struct_termios + +type Termio C.struct_termio + +type Winsize C.struct_winsize + +// poll + +type PollFd C.struct_pollfd + +const ( + POLLERR = C.POLLERR + POLLHUP = C.POLLHUP + POLLIN = C.POLLIN + POLLNVAL = C.POLLNVAL + POLLOUT = C.POLLOUT + POLLPRI = C.POLLPRI + POLLRDBAND = C.POLLRDBAND + POLLRDNORM = C.POLLRDNORM + POLLWRBAND = C.POLLWRBAND + POLLWRNORM = C.POLLWRNORM +) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/xattr_bsd.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/xattr_bsd.go new file mode 100644 index 00000000..93049932 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/xattr_bsd.go @@ -0,0 +1,231 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build freebsd netbsd + +package unix + +import ( + "strings" + "unsafe" +) + +// Derive extattr namespace and attribute name + +func xattrnamespace(fullattr string) (ns int, attr string, err error) { + s := strings.IndexByte(fullattr, '.') + if s == -1 { + return -1, "", ENOATTR + } + + namespace := fullattr[0:s] + attr = fullattr[s+1:] + + switch namespace { + case "user": + return EXTATTR_NAMESPACE_USER, attr, nil + case "system": + return EXTATTR_NAMESPACE_SYSTEM, attr, nil + default: + return -1, "", ENOATTR + } +} + +func initxattrdest(dest []byte, idx int) (d unsafe.Pointer) { + if len(dest) > idx { + return unsafe.Pointer(&dest[idx]) + } else { + return unsafe.Pointer(_zero) + } +} + +// FreeBSD and NetBSD implement their own syscalls to handle extended attributes + +func Getxattr(file string, attr string, dest []byte) (sz int, err error) { + d := initxattrdest(dest, 0) + destsize := len(dest) + + nsid, a, err := xattrnamespace(attr) + if err != nil { + return -1, err + } + + return ExtattrGetFile(file, nsid, a, uintptr(d), destsize) +} + +func Fgetxattr(fd int, attr string, dest []byte) (sz int, err error) { + d := initxattrdest(dest, 0) + destsize := len(dest) + + nsid, a, err := xattrnamespace(attr) + if err != nil { + return -1, err + } + + return ExtattrGetFd(fd, nsid, a, uintptr(d), destsize) +} + +func Lgetxattr(link string, attr string, dest []byte) (sz int, err error) { + d := initxattrdest(dest, 0) + destsize := len(dest) + + nsid, a, err := xattrnamespace(attr) + if err != nil { + return -1, err + } + + return ExtattrGetLink(link, nsid, a, uintptr(d), destsize) +} + +// flags are unused on FreeBSD + +func Fsetxattr(fd int, attr string, data []byte, flags int) (err error) { + d := unsafe.Pointer(&data[0]) + datasiz := len(data) + + nsid, a, err := xattrnamespace(attr) + if err != nil { + return + } + + _, err = ExtattrSetFd(fd, nsid, a, uintptr(d), datasiz) + return +} + +func Setxattr(file string, attr string, data []byte, flags int) (err error) { + d := unsafe.Pointer(&data[0]) + datasiz := len(data) + + nsid, a, err := xattrnamespace(attr) + if err != nil { + return + } + + _, err = ExtattrSetFile(file, nsid, a, uintptr(d), datasiz) + return +} + +func Lsetxattr(link string, attr string, data []byte, flags int) (err error) { + d := unsafe.Pointer(&data[0]) + datasiz := len(data) + + nsid, a, err := xattrnamespace(attr) + if err != nil { + return + } + + _, err = ExtattrSetLink(link, nsid, a, uintptr(d), datasiz) + return +} + +func Removexattr(file string, attr string) (err error) { + nsid, a, err := xattrnamespace(attr) + if err != nil { + return + } + + err = ExtattrDeleteFile(file, nsid, a) + return +} + +func Fremovexattr(fd int, attr string) (err error) { + nsid, a, err := xattrnamespace(attr) + if err != nil { + return + } + + err = ExtattrDeleteFd(fd, nsid, a) + return +} + +func Lremovexattr(link string, attr string) (err error) { + nsid, a, err := xattrnamespace(attr) + if err != nil { + return + } + + err = ExtattrDeleteLink(link, nsid, a) + return +} + +func Listxattr(file string, dest []byte) (sz int, err error) { + d := initxattrdest(dest, 0) + destsiz := len(dest) + + // FreeBSD won't allow you to list xattrs from multiple namespaces + s := 0 + for _, nsid := range [...]int{EXTATTR_NAMESPACE_USER, EXTATTR_NAMESPACE_SYSTEM} { + stmp, e := ExtattrListFile(file, nsid, uintptr(d), destsiz) + + /* Errors accessing system attrs are ignored so that + * we can implement the Linux-like behavior of omitting errors that + * we don't have read permissions on + * + * Linux will still error if we ask for user attributes on a file that + * we don't have read permissions on, so don't ignore those errors + */ + if e != nil && e == EPERM && nsid != EXTATTR_NAMESPACE_USER { + continue + } else if e != nil { + return s, e + } + + s += stmp + destsiz -= s + if destsiz < 0 { + destsiz = 0 + } + d = initxattrdest(dest, s) + } + + return s, nil +} + +func Flistxattr(fd int, dest []byte) (sz int, err error) { + d := initxattrdest(dest, 0) + destsiz := len(dest) + + s := 0 + for _, nsid := range [...]int{EXTATTR_NAMESPACE_USER, EXTATTR_NAMESPACE_SYSTEM} { + stmp, e := ExtattrListFd(fd, nsid, uintptr(d), destsiz) + if e != nil && e == EPERM && nsid != EXTATTR_NAMESPACE_USER { + continue + } else if e != nil { + return s, e + } + + s += stmp + destsiz -= s + if destsiz < 0 { + destsiz = 0 + } + d = initxattrdest(dest, s) + } + + return s, nil +} + +func Llistxattr(link string, dest []byte) (sz int, err error) { + d := initxattrdest(dest, 0) + destsiz := len(dest) + + s := 0 + for _, nsid := range [...]int{EXTATTR_NAMESPACE_USER, EXTATTR_NAMESPACE_SYSTEM} { + stmp, e := ExtattrListLink(link, nsid, uintptr(d), destsiz) + if e != nil && e == EPERM && nsid != EXTATTR_NAMESPACE_USER { + continue + } else if e != nil { + return s, e + } + + s += stmp + destsiz -= s + if destsiz < 0 { + destsiz = 0 + } + d = initxattrdest(dest, s) + } + + return s, nil +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_aix_ppc.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_aix_ppc.go new file mode 100644 index 00000000..4b7b9650 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_aix_ppc.go @@ -0,0 +1,1372 @@ +// mkerrors.sh -maix32 +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build ppc,aix + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -maix32 _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_BYPASS = 0x19 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x18 + AF_INTF = 0x14 + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x1e + AF_NDD = 0x17 + AF_NETWARE = 0x16 + AF_NS = 0x6 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_RIF = 0x15 + AF_ROUTE = 0x11 + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + ALTWERASE = 0x400000 + ARPHRD_802_3 = 0x6 + ARPHRD_802_5 = 0x6 + ARPHRD_ETHER = 0x1 + ARPHRD_FDDI = 0x1 + B0 = 0x0 + B110 = 0x3 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2400 = 0xb + B300 = 0x7 + B38400 = 0xf + B4800 = 0xc + B50 = 0x1 + B600 = 0x8 + B75 = 0x2 + B9600 = 0xd + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x1000 + BSDLY = 0x1000 + CAP_AACCT = 0x6 + CAP_ARM_APPLICATION = 0x5 + CAP_BYPASS_RAC_VMM = 0x3 + CAP_CLEAR = 0x0 + CAP_CREDENTIALS = 0x7 + CAP_EFFECTIVE = 0x1 + CAP_EWLM_AGENT = 0x4 + CAP_INHERITABLE = 0x2 + CAP_MAXIMUM = 0x7 + CAP_NUMA_ATTACH = 0x2 + CAP_PERMITTED = 0x3 + CAP_PROPAGATE = 0x1 + CAP_PROPOGATE = 0x1 + CAP_SET = 0x1 + CBAUD = 0xf + CFLUSH = 0xf + CIBAUD = 0xf0000 + CLOCAL = 0x800 + CLOCK_MONOTONIC = 0xa + CLOCK_PROCESS_CPUTIME_ID = 0xb + CLOCK_REALTIME = 0x9 + CLOCK_THREAD_CPUTIME_ID = 0xc + CR0 = 0x0 + CR1 = 0x100 + CR2 = 0x200 + CR3 = 0x300 + CRDLY = 0x300 + CREAD = 0x80 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIOCGIFCONF = -0x3ff796dc + CSIZE = 0x30 + CSMAP_DIR = "/usr/lib/nls/csmap/" + CSTART = '\021' + CSTOP = '\023' + CSTOPB = 0x40 + CSUSP = 0x1a + ECHO = 0x8 + ECHOCTL = 0x20000 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x80000 + ECHONL = 0x40 + ECHOPRT = 0x40000 + ECH_ICMPID = 0x2 + ETHERNET_CSMACD = 0x6 + EVENP = 0x80 + EXCONTINUE = 0x0 + EXDLOK = 0x3 + EXIO = 0x2 + EXPGIO = 0x0 + EXRESUME = 0x2 + EXRETURN = 0x1 + EXSIG = 0x4 + EXTA = 0xe + EXTB = 0xf + EXTRAP = 0x1 + EYEC_RTENTRYA = 0x257274656e747241 + EYEC_RTENTRYF = 0x257274656e747246 + E_ACC = 0x0 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0xfffe + FF0 = 0x0 + FF1 = 0x2000 + FFDLY = 0x2000 + FLUSHBAND = 0x40 + FLUSHLOW = 0x8 + FLUSHO = 0x100000 + FLUSHR = 0x1 + FLUSHRW = 0x3 + FLUSHW = 0x2 + F_CLOSEM = 0xa + F_DUP2FD = 0xe + F_DUPFD = 0x0 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x5 + F_GETLK64 = 0xb + F_GETOWN = 0x8 + F_LOCK = 0x1 + F_OK = 0x0 + F_RDLCK = 0x1 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x6 + F_SETLK64 = 0xc + F_SETLKW = 0x7 + F_SETLKW64 = 0xd + F_SETOWN = 0x9 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_TSTLK = 0xf + F_ULOCK = 0x0 + F_UNLCK = 0x3 + F_WRLCK = 0x2 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMP6_FILTER = 0x26 + ICMP6_SEC_SEND_DEL = 0x46 + ICMP6_SEC_SEND_GET = 0x47 + ICMP6_SEC_SEND_SET = 0x44 + ICMP6_SEC_SEND_SET_CGA_ADDR = 0x45 + ICRNL = 0x100 + IEXTEN = 0x200000 + IFA_FIRSTALIAS = 0x2000 + IFA_ROUTE = 0x1 + IFF_64BIT = 0x4000000 + IFF_ALLCAST = 0x20000 + IFF_ALLMULTI = 0x200 + IFF_BPF = 0x8000000 + IFF_BRIDGE = 0x40000 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x80c52 + IFF_CHECKSUM_OFFLOAD = 0x10000000 + IFF_D1 = 0x8000 + IFF_D2 = 0x4000 + IFF_D3 = 0x2000 + IFF_D4 = 0x1000 + IFF_DEBUG = 0x4 + IFF_DEVHEALTH = 0x4000 + IFF_DO_HW_LOOPBACK = 0x10000 + IFF_GROUP_ROUTING = 0x2000000 + IFF_IFBUFMGT = 0x800000 + IFF_LINK0 = 0x100000 + IFF_LINK1 = 0x200000 + IFF_LINK2 = 0x400000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x80000 + IFF_NOARP = 0x80 + IFF_NOECHO = 0x800 + IFF_NOTRAILERS = 0x20 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_PSEG = 0x40000000 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_SNAP = 0x8000 + IFF_TCP_DISABLE_CKSUM = 0x20000000 + IFF_TCP_NOCKSUM = 0x1000000 + IFF_UP = 0x1 + IFF_VIPA = 0x80000000 + IFNAMSIZ = 0x10 + IFO_FLUSH = 0x1 + IFT_1822 = 0x2 + IFT_AAL5 = 0x31 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ATM = 0x25 + IFT_CEPT = 0x13 + IFT_CLUSTER = 0x3e + IFT_DS3 = 0x1e + IFT_EON = 0x19 + IFT_ETHER = 0x6 + IFT_FCS = 0x3a + IFT_FDDI = 0xf + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_GIFTUNNEL = 0x3c + IFT_HDH1822 = 0x3 + IFT_HF = 0x3d + IFT_HIPPI = 0x2f + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IB = 0xc7 + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88026 = 0xa + IFT_LAPB = 0x10 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_NSIP = 0x1b + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PPP = 0x17 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PTPSERIAL = 0x16 + IFT_RS232 = 0x21 + IFT_SDLC = 0x11 + IFT_SIP = 0x1f + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SN = 0x38 + IFT_SONET = 0x27 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_SP = 0x39 + IFT_STARLAN = 0xb + IFT_T1 = 0x12 + IFT_TUNNEL = 0x3b + IFT_ULTRA = 0x1d + IFT_V35 = 0x2d + IFT_VIPA = 0x37 + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x10000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IN_USE = 0x1 + IPPROTO_AH = 0x33 + IPPROTO_BIP = 0x53 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GIF = 0x8c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_LOCAL = 0x3f + IPPROTO_MAX = 0x100 + IPPROTO_MH = 0x87 + IPPROTO_NONE = 0x3b + IPPROTO_PUP = 0xc + IPPROTO_QOS = 0x2d + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPV6_ADDRFORM = 0x16 + IPV6_ADDR_PREFERENCES = 0x4a + IPV6_ADD_MEMBERSHIP = 0xc + IPV6_AIXRAWSOCKET = 0x39 + IPV6_CHECKSUM = 0x27 + IPV6_DONTFRAG = 0x2d + IPV6_DROP_MEMBERSHIP = 0xd + IPV6_DSTOPTS = 0x36 + IPV6_FLOWINFO_FLOWLABEL = 0xffffff + IPV6_FLOWINFO_PRIFLOW = 0xfffffff + IPV6_FLOWINFO_PRIORITY = 0xf000000 + IPV6_FLOWINFO_SRFLAG = 0x10000000 + IPV6_FLOWINFO_VERSION = 0xf0000000 + IPV6_HOPLIMIT = 0x28 + IPV6_HOPOPTS = 0x34 + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MIPDSTOPTS = 0x36 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_NOPROBE = 0x1c + IPV6_PATHMTU = 0x2e + IPV6_PKTINFO = 0x21 + IPV6_PKTOPTIONS = 0x24 + IPV6_PRIORITY_10 = 0xa000000 + IPV6_PRIORITY_11 = 0xb000000 + IPV6_PRIORITY_12 = 0xc000000 + IPV6_PRIORITY_13 = 0xd000000 + IPV6_PRIORITY_14 = 0xe000000 + IPV6_PRIORITY_15 = 0xf000000 + IPV6_PRIORITY_8 = 0x8000000 + IPV6_PRIORITY_9 = 0x9000000 + IPV6_PRIORITY_BULK = 0x4000000 + IPV6_PRIORITY_CONTROL = 0x7000000 + IPV6_PRIORITY_FILLER = 0x1000000 + IPV6_PRIORITY_INTERACTIVE = 0x6000000 + IPV6_PRIORITY_RESERVED1 = 0x3000000 + IPV6_PRIORITY_RESERVED2 = 0x5000000 + IPV6_PRIORITY_UNATTENDED = 0x2000000 + IPV6_PRIORITY_UNCHARACTERIZED = 0x0 + IPV6_RECVDSTOPTS = 0x38 + IPV6_RECVHOPLIMIT = 0x29 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVHOPS = 0x22 + IPV6_RECVIF = 0x1e + IPV6_RECVPATHMTU = 0x2f + IPV6_RECVPKTINFO = 0x23 + IPV6_RECVRTHDR = 0x33 + IPV6_RECVSRCRT = 0x1d + IPV6_RECVTCLASS = 0x2a + IPV6_RTHDR = 0x32 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RTHDR_TYPE_2 = 0x2 + IPV6_SENDIF = 0x1f + IPV6_SRFLAG_LOOSE = 0x0 + IPV6_SRFLAG_STRICT = 0x10000000 + IPV6_TCLASS = 0x2b + IPV6_TOKEN_LENGTH = 0x40 + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2c + IPV6_V6ONLY = 0x25 + IPV6_VERSION = 0x60000000 + IP_ADDRFORM = 0x16 + IP_ADD_MEMBERSHIP = 0xc + IP_ADD_SOURCE_MEMBERSHIP = 0x3c + IP_BLOCK_SOURCE = 0x3a + IP_BROADCAST_IF = 0x10 + IP_CACHE_LINE_SIZE = 0x80 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DHCPMODE = 0x11 + IP_DONTFRAG = 0x19 + IP_DROP_MEMBERSHIP = 0xd + IP_DROP_SOURCE_MEMBERSHIP = 0x3d + IP_FINDPMTU = 0x1a + IP_HDRINCL = 0x2 + IP_INC_MEMBERSHIPS = 0x14 + IP_INIT_MEMBERSHIP = 0x14 + IP_MAXPACKET = 0xffff + IP_MF = 0x2000 + IP_MSS = 0x240 + IP_MULTICAST_HOPS = 0xa + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_OPT = 0x1b + IP_OPTIONS = 0x1 + IP_PMTUAGE = 0x1b + IP_RECVDSTADDR = 0x7 + IP_RECVIF = 0x14 + IP_RECVIFINFO = 0xf + IP_RECVINTERFACE = 0x20 + IP_RECVMACHDR = 0xe + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVTTL = 0x22 + IP_RETOPTS = 0x8 + IP_SOURCE_FILTER = 0x48 + IP_TOS = 0x3 + IP_TTL = 0x4 + IP_UNBLOCK_SOURCE = 0x3b + IP_UNICAST_HOPS = 0x4 + ISIG = 0x1 + ISTRIP = 0x20 + IUCLC = 0x800 + IXANY = 0x1000 + IXOFF = 0x400 + IXON = 0x200 + I_FLUSH = 0x20005305 + LNOFLSH = 0x8000 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DONTNEED = 0x4 + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_SPACEAVAIL = 0x5 + MADV_WILLNEED = 0x3 + MAP_ANON = 0x10 + MAP_ANONYMOUS = 0x10 + MAP_FILE = 0x0 + MAP_FIXED = 0x100 + MAP_PRIVATE = 0x2 + MAP_SHARED = 0x1 + MAP_TYPE = 0xf0 + MAP_VARIABLE = 0x0 + MCL_CURRENT = 0x100 + MCL_FUTURE = 0x200 + MSG_ANY = 0x4 + MSG_ARGEXT = 0x400 + MSG_BAND = 0x2 + MSG_COMPAT = 0x8000 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_EOR = 0x8 + MSG_HIPRI = 0x1 + MSG_MAXIOVLEN = 0x10 + MSG_MPEG2 = 0x80 + MSG_NONBLOCK = 0x4000 + MSG_NOSIGNAL = 0x100 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MSG_WAITFORONE = 0x200 + MS_ASYNC = 0x10 + MS_EINTR = 0x80 + MS_INVALIDATE = 0x40 + MS_PER_SEC = 0x3e8 + MS_SYNC = 0x20 + NL0 = 0x0 + NL1 = 0x4000 + NL2 = 0x8000 + NL3 = 0xc000 + NLDLY = 0x4000 + NOFLSH = 0x80 + NOFLUSH = 0x80000000 + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + ONOEOT = 0x80000 + OPOST = 0x1 + OXTABS = 0x40000 + O_ACCMODE = 0x23 + O_APPEND = 0x8 + O_CIO = 0x80 + O_CIOR = 0x800000000 + O_CLOEXEC = 0x800000 + O_CREAT = 0x100 + O_DEFER = 0x2000 + O_DELAY = 0x4000 + O_DIRECT = 0x8000000 + O_DIRECTORY = 0x80000 + O_DSYNC = 0x400000 + O_EFSOFF = 0x400000000 + O_EFSON = 0x200000000 + O_EXCL = 0x400 + O_EXEC = 0x20 + O_LARGEFILE = 0x4000000 + O_NDELAY = 0x8000 + O_NOCACHE = 0x100000 + O_NOCTTY = 0x800 + O_NOFOLLOW = 0x1000000 + O_NONBLOCK = 0x4 + O_NONE = 0x3 + O_NSHARE = 0x10000 + O_RAW = 0x100000000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSHARE = 0x1000 + O_RSYNC = 0x200000 + O_SEARCH = 0x20 + O_SNAPSHOT = 0x40 + O_SYNC = 0x10 + O_TRUNC = 0x200 + O_TTY_INIT = 0x0 + O_WRONLY = 0x1 + PARENB = 0x100 + PAREXT = 0x100000 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_64BIT = 0x20 + PR_ADDR = 0x2 + PR_ARGEXT = 0x400 + PR_ATOMIC = 0x1 + PR_CONNREQUIRED = 0x4 + PR_FASTHZ = 0x5 + PR_INP = 0x40 + PR_INTRLEVEL = 0x8000 + PR_MLS = 0x100 + PR_MLS_1_LABEL = 0x200 + PR_NOEOR = 0x4000 + PR_RIGHTS = 0x10 + PR_SLOWHZ = 0x2 + PR_WANTRCVD = 0x8 + RLIMIT_AS = 0x6 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_NOFILE = 0x7 + RLIMIT_NPROC = 0x9 + RLIMIT_RSS = 0x5 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x8 + RTAX_NETMASK = 0x2 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DOWNSTREAM = 0x100 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTC_IA64 = 0x3 + RTC_POWER = 0x1 + RTC_POWER_PC = 0x2 + RTF_ACTIVE_DGD = 0x1000000 + RTF_BCE = 0x80000 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_BUL = 0x2000 + RTF_CLONE = 0x10000 + RTF_CLONED = 0x20000 + RTF_CLONING = 0x100 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_FREE_IN_PROG = 0x4000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MASK = 0x80 + RTF_MODIFIED = 0x20 + RTF_MULTICAST = 0x800000 + RTF_PERMANENT6 = 0x8000000 + RTF_PINNED = 0x100000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x40000 + RTF_REJECT = 0x8 + RTF_SMALLMTU = 0x40000 + RTF_STATIC = 0x800 + RTF_STOPSRCH = 0x2000000 + RTF_UNREACHABLE = 0x10000000 + RTF_UP = 0x1 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_EXPIRE = 0xf + RTM_GET = 0x4 + RTM_GETNEXT = 0x11 + RTM_IFINFO = 0xe + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTLOST = 0x10 + RTM_RTTUNIT = 0xf4240 + RTM_SAMEADDR = 0x12 + RTM_SET = 0x13 + RTM_VERSION = 0x2 + RTM_VERSION_GR = 0x4 + RTM_VERSION_GR_COMPAT = 0x3 + RTM_VERSION_POLICY = 0x5 + RTM_VERSION_POLICY_EXT = 0x6 + RTM_VERSION_POLICY_PRFN = 0x7 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_RIGHTS = 0x1 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIGMAX64 = 0xff + SIGQUEUE_MAX = 0x20 + SIOCADDIFVIPA = 0x20006942 + SIOCADDMTU = -0x7ffb9690 + SIOCADDMULTI = -0x7fdf96cf + SIOCADDNETID = -0x7fd796a9 + SIOCADDRT = -0x7fcf8df6 + SIOCAIFADDR = -0x7fbf96e6 + SIOCATMARK = 0x40047307 + SIOCDARP = -0x7fb396e0 + SIOCDELIFVIPA = 0x20006943 + SIOCDELMTU = -0x7ffb968f + SIOCDELMULTI = -0x7fdf96ce + SIOCDELPMTU = -0x7fd78ff6 + SIOCDELRT = -0x7fcf8df5 + SIOCDIFADDR = -0x7fd796e7 + SIOCDNETOPT = -0x3ffe9680 + SIOCDX25XLATE = -0x7fd7969b + SIOCFIFADDR = -0x7fdf966d + SIOCGARP = -0x3fb396da + SIOCGETMTUS = 0x2000696f + SIOCGETSGCNT = -0x3feb8acc + SIOCGETVIFCNT = -0x3feb8acd + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = -0x3fd796df + SIOCGIFADDRS = 0x2000698c + SIOCGIFBAUDRATE = -0x3fd79693 + SIOCGIFBRDADDR = -0x3fd796dd + SIOCGIFCONF = -0x3ff796bb + SIOCGIFCONFGLOB = -0x3ff79670 + SIOCGIFDSTADDR = -0x3fd796de + SIOCGIFFLAGS = -0x3fd796ef + SIOCGIFGIDLIST = 0x20006968 + SIOCGIFHWADDR = -0x3fab966b + SIOCGIFMETRIC = -0x3fd796e9 + SIOCGIFMTU = -0x3fd796aa + SIOCGIFNETMASK = -0x3fd796db + SIOCGIFOPTIONS = -0x3fd796d6 + SIOCGISNO = -0x3fd79695 + SIOCGLOADF = -0x3ffb967e + SIOCGLOWAT = 0x40047303 + SIOCGNETOPT = -0x3ffe96a5 + SIOCGNETOPT1 = -0x3fdf967f + SIOCGNMTUS = 0x2000696e + SIOCGPGRP = 0x40047309 + SIOCGSIZIFCONF = 0x4004696a + SIOCGSRCFILTER = -0x3fe796cb + SIOCGTUNEPHASE = -0x3ffb9676 + SIOCGX25XLATE = -0x3fd7969c + SIOCIFATTACH = -0x7fdf9699 + SIOCIFDETACH = -0x7fdf969a + SIOCIFGETPKEY = -0x7fdf969b + SIOCIF_ATM_DARP = -0x7fdf9683 + SIOCIF_ATM_DUMPARP = -0x7fdf9685 + SIOCIF_ATM_GARP = -0x7fdf9682 + SIOCIF_ATM_IDLE = -0x7fdf9686 + SIOCIF_ATM_SARP = -0x7fdf9681 + SIOCIF_ATM_SNMPARP = -0x7fdf9687 + SIOCIF_ATM_SVC = -0x7fdf9684 + SIOCIF_ATM_UBR = -0x7fdf9688 + SIOCIF_DEVHEALTH = -0x7ffb966c + SIOCIF_IB_ARP_INCOMP = -0x7fdf9677 + SIOCIF_IB_ARP_TIMER = -0x7fdf9678 + SIOCIF_IB_CLEAR_PINFO = -0x3fdf966f + SIOCIF_IB_DEL_ARP = -0x7fdf967f + SIOCIF_IB_DEL_PINFO = -0x3fdf9670 + SIOCIF_IB_DUMP_ARP = -0x7fdf9680 + SIOCIF_IB_GET_ARP = -0x7fdf967e + SIOCIF_IB_GET_INFO = -0x3f879675 + SIOCIF_IB_GET_STATS = -0x3f879672 + SIOCIF_IB_NOTIFY_ADDR_REM = -0x3f87966a + SIOCIF_IB_RESET_STATS = -0x3f879671 + SIOCIF_IB_RESIZE_CQ = -0x7fdf9679 + SIOCIF_IB_SET_ARP = -0x7fdf967d + SIOCIF_IB_SET_PKEY = -0x7fdf967c + SIOCIF_IB_SET_PORT = -0x7fdf967b + SIOCIF_IB_SET_QKEY = -0x7fdf9676 + SIOCIF_IB_SET_QSIZE = -0x7fdf967a + SIOCLISTIFVIPA = 0x20006944 + SIOCSARP = -0x7fb396e2 + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = -0x7fd796f4 + SIOCSIFADDRORI = -0x7fdb9673 + SIOCSIFBRDADDR = -0x7fd796ed + SIOCSIFDSTADDR = -0x7fd796f2 + SIOCSIFFLAGS = -0x7fd796f0 + SIOCSIFGIDLIST = 0x20006969 + SIOCSIFMETRIC = -0x7fd796e8 + SIOCSIFMTU = -0x7fd796a8 + SIOCSIFNETDUMP = -0x7fd796e4 + SIOCSIFNETMASK = -0x7fd796ea + SIOCSIFOPTIONS = -0x7fd796d7 + SIOCSIFSUBCHAN = -0x7fd796e5 + SIOCSISNO = -0x7fd79694 + SIOCSLOADF = -0x3ffb967d + SIOCSLOWAT = 0x80047302 + SIOCSNETOPT = -0x7ffe96a6 + SIOCSPGRP = 0x80047308 + SIOCSX25XLATE = -0x7fd7969d + SOCK_CONN_DGRAM = 0x6 + SOCK_DGRAM = 0x2 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x400 + SO_ACCEPTCONN = 0x2 + SO_AUDIT = 0x8000 + SO_BROADCAST = 0x20 + SO_CKSUMRECV = 0x800 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_KERNACCEPT = 0x2000 + SO_LINGER = 0x80 + SO_NOMULTIPATH = 0x4000 + SO_NOREUSEADDR = 0x1000 + SO_OOBINLINE = 0x100 + SO_PEERID = 0x1009 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_TIMESTAMPNS = 0x100a + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + SO_USE_IFBUFS = 0x400 + S_BANDURG = 0x400 + S_EMODFMT = 0x3c000000 + S_ENFMT = 0x400 + S_ERROR = 0x100 + S_HANGUP = 0x200 + S_HIPRI = 0x2 + S_ICRYPTO = 0x80000 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFJOURNAL = 0x10000 + S_IFLNK = 0xa000 + S_IFMPX = 0x2200 + S_IFMT = 0xf000 + S_IFPDIR = 0x4000000 + S_IFPSDIR = 0x8000000 + S_IFPSSDIR = 0xc000000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IFSYSEA = 0x30000000 + S_INPUT = 0x1 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_ITCB = 0x1000000 + S_ITP = 0x800000 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXACL = 0x2000000 + S_IXATTR = 0x40000 + S_IXGRP = 0x8 + S_IXINTERFACE = 0x100000 + S_IXMOD = 0x40000000 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + S_MSG = 0x8 + S_OUTPUT = 0x4 + S_RDBAND = 0x20 + S_RDNORM = 0x10 + S_RESERVED1 = 0x20000 + S_RESERVED2 = 0x200000 + S_RESERVED3 = 0x400000 + S_RESERVED4 = 0x80000000 + S_RESFMT1 = 0x10000000 + S_RESFMT10 = 0x34000000 + S_RESFMT11 = 0x38000000 + S_RESFMT12 = 0x3c000000 + S_RESFMT2 = 0x14000000 + S_RESFMT3 = 0x18000000 + S_RESFMT4 = 0x1c000000 + S_RESFMT5 = 0x20000000 + S_RESFMT6 = 0x24000000 + S_RESFMT7 = 0x28000000 + S_RESFMT8 = 0x2c000000 + S_WRBAND = 0x80 + S_WRNORM = 0x40 + TAB0 = 0x0 + TAB1 = 0x400 + TAB2 = 0x800 + TAB3 = 0xc00 + TABDLY = 0xc00 + TCFLSH = 0x540c + TCGETA = 0x5405 + TCGETS = 0x5401 + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_24DAYS_WORTH_OF_SLOWTICKS = 0x3f4800 + TCP_ACLADD = 0x23 + TCP_ACLBIND = 0x26 + TCP_ACLCLEAR = 0x22 + TCP_ACLDEL = 0x24 + TCP_ACLDENY = 0x8 + TCP_ACLFLUSH = 0x21 + TCP_ACLGID = 0x1 + TCP_ACLLS = 0x25 + TCP_ACLSUBNET = 0x4 + TCP_ACLUID = 0x2 + TCP_CWND_DF = 0x16 + TCP_CWND_IF = 0x15 + TCP_DELAY_ACK_FIN = 0x2 + TCP_DELAY_ACK_SYN = 0x1 + TCP_FASTNAME = 0x101080a + TCP_KEEPCNT = 0x13 + TCP_KEEPIDLE = 0x11 + TCP_KEEPINTVL = 0x12 + TCP_LSPRIV = 0x29 + TCP_LUID = 0x20 + TCP_MAXBURST = 0x8 + TCP_MAXDF = 0x64 + TCP_MAXIF = 0x64 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAXWINDOWSCALE = 0xe + TCP_MAX_SACK = 0x4 + TCP_MSS = 0x5b4 + TCP_NODELAY = 0x1 + TCP_NODELAYACK = 0x14 + TCP_NOREDUCE_CWND_EXIT_FRXMT = 0x19 + TCP_NOREDUCE_CWND_IN_FRXMT = 0x18 + TCP_NOTENTER_SSTART = 0x17 + TCP_OPT = 0x19 + TCP_RFC1323 = 0x4 + TCP_SETPRIV = 0x27 + TCP_STDURG = 0x10 + TCP_TIMESTAMP_OPTLEN = 0xc + TCP_UNSETPRIV = 0x28 + TCSAFLUSH = 0x2 + TCSBRK = 0x5409 + TCSETA = 0x5406 + TCSETAF = 0x5408 + TCSETAW = 0x5407 + TCSETS = 0x5402 + TCSETSF = 0x5404 + TCSETSW = 0x5403 + TCXONC = 0x540b + TIOC = 0x5400 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCEXCL = 0x2000740d + TIOCFLUSH = 0x80047410 + TIOCGETC = 0x40067412 + TIOCGETD = 0x40047400 + TIOCGETP = 0x40067408 + TIOCGLTC = 0x40067474 + TIOCGPGRP = 0x40047477 + TIOCGSID = 0x40047448 + TIOCGSIZE = 0x40087468 + TIOCGWINSZ = 0x40087468 + TIOCHPCL = 0x20007402 + TIOCLBIC = 0x8004747e + TIOCLBIS = 0x8004747f + TIOCLGET = 0x4004747c + TIOCLSET = 0x8004747d + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGET = 0x4004746a + TIOCMIWAIT = 0x80047464 + TIOCMODG = 0x40047403 + TIOCMODS = 0x80047404 + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSDTR = 0x20007479 + TIOCSETC = 0x80067411 + TIOCSETD = 0x80047401 + TIOCSETN = 0x8006740a + TIOCSETP = 0x80067409 + TIOCSLTC = 0x80067475 + TIOCSPGRP = 0x80047476 + TIOCSSIZE = 0x80087467 + TIOCSTART = 0x2000746e + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x10000 + UTIME_NOW = -0x2 + UTIME_OMIT = -0x3 + VDISCRD = 0xc + VDSUSP = 0xa + VEOF = 0x4 + VEOL = 0x5 + VEOL2 = 0x6 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xe + VMIN = 0x4 + VQUIT = 0x1 + VREPRINT = 0xb + VSTART = 0x7 + VSTOP = 0x8 + VSTRT = 0x7 + VSUSP = 0x9 + VT0 = 0x0 + VT1 = 0x8000 + VTDELAY = 0x2000 + VTDLY = 0x8000 + VTIME = 0x5 + VWERSE = 0xd + WPARSTART = 0x1 + WPARSTOP = 0x2 + WPARTTYNAME = "Global" + XCASE = 0x4 + XTABS = 0xc00 + _FDATAFLUSH = 0x2000000000 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x43) + EADDRNOTAVAIL = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x42) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x38) + EBADF = syscall.Errno(0x9) + EBADMSG = syscall.Errno(0x78) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x75) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x25) + ECLONEME = syscall.Errno(0x52) + ECONNABORTED = syscall.Errno(0x48) + ECONNREFUSED = syscall.Errno(0x4f) + ECONNRESET = syscall.Errno(0x49) + ECORRUPT = syscall.Errno(0x59) + EDEADLK = syscall.Errno(0x2d) + EDESTADDREQ = syscall.Errno(0x3a) + EDESTADDRREQ = syscall.Errno(0x3a) + EDIST = syscall.Errno(0x35) + EDOM = syscall.Errno(0x21) + EDQUOT = syscall.Errno(0x58) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFORMAT = syscall.Errno(0x30) + EHOSTDOWN = syscall.Errno(0x50) + EHOSTUNREACH = syscall.Errno(0x51) + EIDRM = syscall.Errno(0x24) + EILSEQ = syscall.Errno(0x74) + EINPROGRESS = syscall.Errno(0x37) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x4b) + EISDIR = syscall.Errno(0x15) + EL2HLT = syscall.Errno(0x2c) + EL2NSYNC = syscall.Errno(0x26) + EL3HLT = syscall.Errno(0x27) + EL3RST = syscall.Errno(0x28) + ELNRNG = syscall.Errno(0x29) + ELOOP = syscall.Errno(0x55) + EMEDIA = syscall.Errno(0x6e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x3b) + EMULTIHOP = syscall.Errno(0x7d) + ENAMETOOLONG = syscall.Errno(0x56) + ENETDOWN = syscall.Errno(0x45) + ENETRESET = syscall.Errno(0x47) + ENETUNREACH = syscall.Errno(0x46) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x70) + ENOBUFS = syscall.Errno(0x4a) + ENOCONNECT = syscall.Errno(0x32) + ENOCSI = syscall.Errno(0x2b) + ENODATA = syscall.Errno(0x7a) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x31) + ENOLINK = syscall.Errno(0x7e) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x23) + ENOPROTOOPT = syscall.Errno(0x3d) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x76) + ENOSTR = syscall.Errno(0x7b) + ENOSYS = syscall.Errno(0x6d) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x4c) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x11) + ENOTREADY = syscall.Errno(0x2e) + ENOTRECOVERABLE = syscall.Errno(0x5e) + ENOTRUST = syscall.Errno(0x72) + ENOTSOCK = syscall.Errno(0x39) + ENOTSUP = syscall.Errno(0x7c) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x40) + EOVERFLOW = syscall.Errno(0x7f) + EOWNERDEAD = syscall.Errno(0x5f) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x41) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x53) + EPROTO = syscall.Errno(0x79) + EPROTONOSUPPORT = syscall.Errno(0x3e) + EPROTOTYPE = syscall.Errno(0x3c) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x5d) + ERESTART = syscall.Errno(0x52) + EROFS = syscall.Errno(0x1e) + ESAD = syscall.Errno(0x71) + ESHUTDOWN = syscall.Errno(0x4d) + ESOCKTNOSUPPORT = syscall.Errno(0x3f) + ESOFT = syscall.Errno(0x6f) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x34) + ESYSERROR = syscall.Errno(0x5a) + ETIME = syscall.Errno(0x77) + ETIMEDOUT = syscall.Errno(0x4e) + ETOOMANYREFS = syscall.Errno(0x73) + ETXTBSY = syscall.Errno(0x1a) + EUNATCH = syscall.Errno(0x2a) + EUSERS = syscall.Errno(0x54) + EWOULDBLOCK = syscall.Errno(0xb) + EWRPROTECT = syscall.Errno(0x2f) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGAIO = syscall.Signal(0x17) + SIGALRM = syscall.Signal(0xe) + SIGALRM1 = syscall.Signal(0x26) + SIGBUS = syscall.Signal(0xa) + SIGCAPI = syscall.Signal(0x31) + SIGCHLD = syscall.Signal(0x14) + SIGCLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGCPUFAIL = syscall.Signal(0x3b) + SIGDANGER = syscall.Signal(0x21) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGGRANT = syscall.Signal(0x3c) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOINT = syscall.Signal(0x10) + SIGIOT = syscall.Signal(0x6) + SIGKAP = syscall.Signal(0x3c) + SIGKILL = syscall.Signal(0x9) + SIGLOST = syscall.Signal(0x6) + SIGMAX = syscall.Signal(0x3f) + SIGMAX32 = syscall.Signal(0x3f) + SIGMIGRATE = syscall.Signal(0x23) + SIGMSG = syscall.Signal(0x1b) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x17) + SIGPRE = syscall.Signal(0x24) + SIGPROF = syscall.Signal(0x20) + SIGPTY = syscall.Signal(0x17) + SIGPWR = syscall.Signal(0x1d) + SIGQUIT = syscall.Signal(0x3) + SIGRECONFIG = syscall.Signal(0x3a) + SIGRETRACT = syscall.Signal(0x3d) + SIGSAK = syscall.Signal(0x3f) + SIGSEGV = syscall.Signal(0xb) + SIGSOUND = syscall.Signal(0x3e) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGSYSERROR = syscall.Signal(0x30) + SIGTALRM = syscall.Signal(0x26) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVIRT = syscall.Signal(0x25) + SIGVTALRM = syscall.Signal(0x22) + SIGWAITING = syscall.Signal(0x27) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "not owner"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "I/O error"}, + {6, "ENXIO", "no such device or address"}, + {7, "E2BIG", "arg list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file number"}, + {10, "ECHILD", "no child processes"}, + {11, "EWOULDBLOCK", "resource temporarily unavailable"}, + {12, "ENOMEM", "not enough space"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device busy"}, + {17, "ENOTEMPTY", "file exists"}, + {18, "EXDEV", "cross-device link"}, + {19, "ENODEV", "no such device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "file table overflow"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "not a typewriter"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "argument out of domain"}, + {34, "ERANGE", "result too large"}, + {35, "ENOMSG", "no message of desired type"}, + {36, "EIDRM", "identifier removed"}, + {37, "ECHRNG", "channel number out of range"}, + {38, "EL2NSYNC", "level 2 not synchronized"}, + {39, "EL3HLT", "level 3 halted"}, + {40, "EL3RST", "level 3 reset"}, + {41, "ELNRNG", "link number out of range"}, + {42, "EUNATCH", "protocol driver not attached"}, + {43, "ENOCSI", "no CSI structure available"}, + {44, "EL2HLT", "level 2 halted"}, + {45, "EDEADLK", "deadlock condition if locked"}, + {46, "ENOTREADY", "device not ready"}, + {47, "EWRPROTECT", "write-protected media"}, + {48, "EFORMAT", "unformatted or incompatible media"}, + {49, "ENOLCK", "no locks available"}, + {50, "ENOCONNECT", "cannot Establish Connection"}, + {52, "ESTALE", "missing file or filesystem"}, + {53, "EDIST", "requests blocked by Administrator"}, + {55, "EINPROGRESS", "operation now in progress"}, + {56, "EALREADY", "operation already in progress"}, + {57, "ENOTSOCK", "socket operation on non-socket"}, + {58, "EDESTADDREQ", "destination address required"}, + {59, "EMSGSIZE", "message too long"}, + {60, "EPROTOTYPE", "protocol wrong type for socket"}, + {61, "ENOPROTOOPT", "protocol not available"}, + {62, "EPROTONOSUPPORT", "protocol not supported"}, + {63, "ESOCKTNOSUPPORT", "socket type not supported"}, + {64, "EOPNOTSUPP", "operation not supported on socket"}, + {65, "EPFNOSUPPORT", "protocol family not supported"}, + {66, "EAFNOSUPPORT", "addr family not supported by protocol"}, + {67, "EADDRINUSE", "address already in use"}, + {68, "EADDRNOTAVAIL", "can't assign requested address"}, + {69, "ENETDOWN", "network is down"}, + {70, "ENETUNREACH", "network is unreachable"}, + {71, "ENETRESET", "network dropped connection on reset"}, + {72, "ECONNABORTED", "software caused connection abort"}, + {73, "ECONNRESET", "connection reset by peer"}, + {74, "ENOBUFS", "no buffer space available"}, + {75, "EISCONN", "socket is already connected"}, + {76, "ENOTCONN", "socket is not connected"}, + {77, "ESHUTDOWN", "can't send after socket shutdown"}, + {78, "ETIMEDOUT", "connection timed out"}, + {79, "ECONNREFUSED", "connection refused"}, + {80, "EHOSTDOWN", "host is down"}, + {81, "EHOSTUNREACH", "no route to host"}, + {82, "ERESTART", "restart the system call"}, + {83, "EPROCLIM", "too many processes"}, + {84, "EUSERS", "too many users"}, + {85, "ELOOP", "too many levels of symbolic links"}, + {86, "ENAMETOOLONG", "file name too long"}, + {88, "EDQUOT", "disk quota exceeded"}, + {89, "ECORRUPT", "invalid file system control data detected"}, + {90, "ESYSERROR", "for future use "}, + {93, "EREMOTE", "item is not local to host"}, + {94, "ENOTRECOVERABLE", "state not recoverable "}, + {95, "EOWNERDEAD", "previous owner died "}, + {109, "ENOSYS", "function not implemented"}, + {110, "EMEDIA", "media surface error"}, + {111, "ESOFT", "I/O completed, but needs relocation"}, + {112, "ENOATTR", "no attribute found"}, + {113, "ESAD", "security Authentication Denied"}, + {114, "ENOTRUST", "not a Trusted Program"}, + {115, "ETOOMANYREFS", "too many references: can't splice"}, + {116, "EILSEQ", "invalid wide character"}, + {117, "ECANCELED", "asynchronous I/O cancelled"}, + {118, "ENOSR", "out of STREAMS resources"}, + {119, "ETIME", "system call timed out"}, + {120, "EBADMSG", "next message has wrong type"}, + {121, "EPROTO", "error in protocol"}, + {122, "ENODATA", "no message on stream head read q"}, + {123, "ENOSTR", "fd not associated with a stream"}, + {124, "ENOTSUP", "unsupported attribute value"}, + {125, "EMULTIHOP", "multihop is not allowed"}, + {126, "ENOLINK", "the server link has been severed"}, + {127, "EOVERFLOW", "value too large to be stored in data type"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/BPT trap"}, + {6, "SIGIOT", "IOT/Abort trap"}, + {7, "SIGEMT", "EMT trap"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGBUS", "bus error"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGSYS", "bad system call"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGURG", "urgent I/O condition"}, + {17, "SIGSTOP", "stopped (signal)"}, + {18, "SIGTSTP", "stopped"}, + {19, "SIGCONT", "continued"}, + {20, "SIGCHLD", "child exited"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGIO", "I/O possible/complete"}, + {24, "SIGXCPU", "cputime limit exceeded"}, + {25, "SIGXFSZ", "filesize limit exceeded"}, + {27, "SIGMSG", "input device data"}, + {28, "SIGWINCH", "window size changes"}, + {29, "SIGPWR", "power-failure"}, + {30, "SIGUSR1", "user defined signal 1"}, + {31, "SIGUSR2", "user defined signal 2"}, + {32, "SIGPROF", "profiling timer expired"}, + {33, "SIGDANGER", "paging space low"}, + {34, "SIGVTALRM", "virtual timer expired"}, + {35, "SIGMIGRATE", "signal 35"}, + {36, "SIGPRE", "signal 36"}, + {37, "SIGVIRT", "signal 37"}, + {38, "SIGTALRM", "signal 38"}, + {39, "SIGWAITING", "signal 39"}, + {48, "SIGSYSERROR", "signal 48"}, + {49, "SIGCAPI", "signal 49"}, + {58, "SIGRECONFIG", "signal 58"}, + {59, "SIGCPUFAIL", "CPU Failure Predicted"}, + {60, "SIGKAP", "monitor mode granted"}, + {61, "SIGRETRACT", "monitor mode retracted"}, + {62, "SIGSOUND", "sound completed"}, + {63, "SIGSAK", "secure attention"}, +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_aix_ppc64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_aix_ppc64.go new file mode 100644 index 00000000..ed04fd1b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_aix_ppc64.go @@ -0,0 +1,1373 @@ +// mkerrors.sh -maix64 +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build ppc64,aix + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -maix64 _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_BYPASS = 0x19 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x18 + AF_INTF = 0x14 + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x1e + AF_NDD = 0x17 + AF_NETWARE = 0x16 + AF_NS = 0x6 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_RIF = 0x15 + AF_ROUTE = 0x11 + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + ALTWERASE = 0x400000 + ARPHRD_802_3 = 0x6 + ARPHRD_802_5 = 0x6 + ARPHRD_ETHER = 0x1 + ARPHRD_FDDI = 0x1 + B0 = 0x0 + B110 = 0x3 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2400 = 0xb + B300 = 0x7 + B38400 = 0xf + B4800 = 0xc + B50 = 0x1 + B600 = 0x8 + B75 = 0x2 + B9600 = 0xd + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x1000 + BSDLY = 0x1000 + CAP_AACCT = 0x6 + CAP_ARM_APPLICATION = 0x5 + CAP_BYPASS_RAC_VMM = 0x3 + CAP_CLEAR = 0x0 + CAP_CREDENTIALS = 0x7 + CAP_EFFECTIVE = 0x1 + CAP_EWLM_AGENT = 0x4 + CAP_INHERITABLE = 0x2 + CAP_MAXIMUM = 0x7 + CAP_NUMA_ATTACH = 0x2 + CAP_PERMITTED = 0x3 + CAP_PROPAGATE = 0x1 + CAP_PROPOGATE = 0x1 + CAP_SET = 0x1 + CBAUD = 0xf + CFLUSH = 0xf + CIBAUD = 0xf0000 + CLOCAL = 0x800 + CLOCK_MONOTONIC = 0xa + CLOCK_PROCESS_CPUTIME_ID = 0xb + CLOCK_REALTIME = 0x9 + CLOCK_THREAD_CPUTIME_ID = 0xc + CR0 = 0x0 + CR1 = 0x100 + CR2 = 0x200 + CR3 = 0x300 + CRDLY = 0x300 + CREAD = 0x80 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIOCGIFCONF = -0x3fef96dc + CSIZE = 0x30 + CSMAP_DIR = "/usr/lib/nls/csmap/" + CSTART = '\021' + CSTOP = '\023' + CSTOPB = 0x40 + CSUSP = 0x1a + ECHO = 0x8 + ECHOCTL = 0x20000 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x80000 + ECHONL = 0x40 + ECHOPRT = 0x40000 + ECH_ICMPID = 0x2 + ETHERNET_CSMACD = 0x6 + EVENP = 0x80 + EXCONTINUE = 0x0 + EXDLOK = 0x3 + EXIO = 0x2 + EXPGIO = 0x0 + EXRESUME = 0x2 + EXRETURN = 0x1 + EXSIG = 0x4 + EXTA = 0xe + EXTB = 0xf + EXTRAP = 0x1 + EYEC_RTENTRYA = 0x257274656e747241 + EYEC_RTENTRYF = 0x257274656e747246 + E_ACC = 0x0 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0xfffe + FF0 = 0x0 + FF1 = 0x2000 + FFDLY = 0x2000 + FLUSHBAND = 0x40 + FLUSHLOW = 0x8 + FLUSHO = 0x100000 + FLUSHR = 0x1 + FLUSHRW = 0x3 + FLUSHW = 0x2 + F_CLOSEM = 0xa + F_DUP2FD = 0xe + F_DUPFD = 0x0 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0xb + F_GETLK64 = 0xb + F_GETOWN = 0x8 + F_LOCK = 0x1 + F_OK = 0x0 + F_RDLCK = 0x1 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0xc + F_SETLK64 = 0xc + F_SETLKW = 0xd + F_SETLKW64 = 0xd + F_SETOWN = 0x9 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_TSTLK = 0xf + F_ULOCK = 0x0 + F_UNLCK = 0x3 + F_WRLCK = 0x2 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMP6_FILTER = 0x26 + ICMP6_SEC_SEND_DEL = 0x46 + ICMP6_SEC_SEND_GET = 0x47 + ICMP6_SEC_SEND_SET = 0x44 + ICMP6_SEC_SEND_SET_CGA_ADDR = 0x45 + ICRNL = 0x100 + IEXTEN = 0x200000 + IFA_FIRSTALIAS = 0x2000 + IFA_ROUTE = 0x1 + IFF_64BIT = 0x4000000 + IFF_ALLCAST = 0x20000 + IFF_ALLMULTI = 0x200 + IFF_BPF = 0x8000000 + IFF_BRIDGE = 0x40000 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x80c52 + IFF_CHECKSUM_OFFLOAD = 0x10000000 + IFF_D1 = 0x8000 + IFF_D2 = 0x4000 + IFF_D3 = 0x2000 + IFF_D4 = 0x1000 + IFF_DEBUG = 0x4 + IFF_DEVHEALTH = 0x4000 + IFF_DO_HW_LOOPBACK = 0x10000 + IFF_GROUP_ROUTING = 0x2000000 + IFF_IFBUFMGT = 0x800000 + IFF_LINK0 = 0x100000 + IFF_LINK1 = 0x200000 + IFF_LINK2 = 0x400000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x80000 + IFF_NOARP = 0x80 + IFF_NOECHO = 0x800 + IFF_NOTRAILERS = 0x20 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_PSEG = 0x40000000 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_SNAP = 0x8000 + IFF_TCP_DISABLE_CKSUM = 0x20000000 + IFF_TCP_NOCKSUM = 0x1000000 + IFF_UP = 0x1 + IFF_VIPA = 0x80000000 + IFNAMSIZ = 0x10 + IFO_FLUSH = 0x1 + IFT_1822 = 0x2 + IFT_AAL5 = 0x31 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ATM = 0x25 + IFT_CEPT = 0x13 + IFT_CLUSTER = 0x3e + IFT_DS3 = 0x1e + IFT_EON = 0x19 + IFT_ETHER = 0x6 + IFT_FCS = 0x3a + IFT_FDDI = 0xf + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_GIFTUNNEL = 0x3c + IFT_HDH1822 = 0x3 + IFT_HF = 0x3d + IFT_HIPPI = 0x2f + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IB = 0xc7 + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88026 = 0xa + IFT_LAPB = 0x10 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_NSIP = 0x1b + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PPP = 0x17 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PTPSERIAL = 0x16 + IFT_RS232 = 0x21 + IFT_SDLC = 0x11 + IFT_SIP = 0x1f + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SN = 0x38 + IFT_SONET = 0x27 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_SP = 0x39 + IFT_STARLAN = 0xb + IFT_T1 = 0x12 + IFT_TUNNEL = 0x3b + IFT_ULTRA = 0x1d + IFT_V35 = 0x2d + IFT_VIPA = 0x37 + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x10000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IN_USE = 0x1 + IPPROTO_AH = 0x33 + IPPROTO_BIP = 0x53 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GIF = 0x8c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_LOCAL = 0x3f + IPPROTO_MAX = 0x100 + IPPROTO_MH = 0x87 + IPPROTO_NONE = 0x3b + IPPROTO_PUP = 0xc + IPPROTO_QOS = 0x2d + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPV6_ADDRFORM = 0x16 + IPV6_ADDR_PREFERENCES = 0x4a + IPV6_ADD_MEMBERSHIP = 0xc + IPV6_AIXRAWSOCKET = 0x39 + IPV6_CHECKSUM = 0x27 + IPV6_DONTFRAG = 0x2d + IPV6_DROP_MEMBERSHIP = 0xd + IPV6_DSTOPTS = 0x36 + IPV6_FLOWINFO_FLOWLABEL = 0xffffff + IPV6_FLOWINFO_PRIFLOW = 0xfffffff + IPV6_FLOWINFO_PRIORITY = 0xf000000 + IPV6_FLOWINFO_SRFLAG = 0x10000000 + IPV6_FLOWINFO_VERSION = 0xf0000000 + IPV6_HOPLIMIT = 0x28 + IPV6_HOPOPTS = 0x34 + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MIPDSTOPTS = 0x36 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_NOPROBE = 0x1c + IPV6_PATHMTU = 0x2e + IPV6_PKTINFO = 0x21 + IPV6_PKTOPTIONS = 0x24 + IPV6_PRIORITY_10 = 0xa000000 + IPV6_PRIORITY_11 = 0xb000000 + IPV6_PRIORITY_12 = 0xc000000 + IPV6_PRIORITY_13 = 0xd000000 + IPV6_PRIORITY_14 = 0xe000000 + IPV6_PRIORITY_15 = 0xf000000 + IPV6_PRIORITY_8 = 0x8000000 + IPV6_PRIORITY_9 = 0x9000000 + IPV6_PRIORITY_BULK = 0x4000000 + IPV6_PRIORITY_CONTROL = 0x7000000 + IPV6_PRIORITY_FILLER = 0x1000000 + IPV6_PRIORITY_INTERACTIVE = 0x6000000 + IPV6_PRIORITY_RESERVED1 = 0x3000000 + IPV6_PRIORITY_RESERVED2 = 0x5000000 + IPV6_PRIORITY_UNATTENDED = 0x2000000 + IPV6_PRIORITY_UNCHARACTERIZED = 0x0 + IPV6_RECVDSTOPTS = 0x38 + IPV6_RECVHOPLIMIT = 0x29 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVHOPS = 0x22 + IPV6_RECVIF = 0x1e + IPV6_RECVPATHMTU = 0x2f + IPV6_RECVPKTINFO = 0x23 + IPV6_RECVRTHDR = 0x33 + IPV6_RECVSRCRT = 0x1d + IPV6_RECVTCLASS = 0x2a + IPV6_RTHDR = 0x32 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RTHDR_TYPE_2 = 0x2 + IPV6_SENDIF = 0x1f + IPV6_SRFLAG_LOOSE = 0x0 + IPV6_SRFLAG_STRICT = 0x10000000 + IPV6_TCLASS = 0x2b + IPV6_TOKEN_LENGTH = 0x40 + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2c + IPV6_V6ONLY = 0x25 + IPV6_VERSION = 0x60000000 + IP_ADDRFORM = 0x16 + IP_ADD_MEMBERSHIP = 0xc + IP_ADD_SOURCE_MEMBERSHIP = 0x3c + IP_BLOCK_SOURCE = 0x3a + IP_BROADCAST_IF = 0x10 + IP_CACHE_LINE_SIZE = 0x80 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DHCPMODE = 0x11 + IP_DONTFRAG = 0x19 + IP_DROP_MEMBERSHIP = 0xd + IP_DROP_SOURCE_MEMBERSHIP = 0x3d + IP_FINDPMTU = 0x1a + IP_HDRINCL = 0x2 + IP_INC_MEMBERSHIPS = 0x14 + IP_INIT_MEMBERSHIP = 0x14 + IP_MAXPACKET = 0xffff + IP_MF = 0x2000 + IP_MSS = 0x240 + IP_MULTICAST_HOPS = 0xa + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_OPT = 0x1b + IP_OPTIONS = 0x1 + IP_PMTUAGE = 0x1b + IP_RECVDSTADDR = 0x7 + IP_RECVIF = 0x14 + IP_RECVIFINFO = 0xf + IP_RECVINTERFACE = 0x20 + IP_RECVMACHDR = 0xe + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVTTL = 0x22 + IP_RETOPTS = 0x8 + IP_SOURCE_FILTER = 0x48 + IP_TOS = 0x3 + IP_TTL = 0x4 + IP_UNBLOCK_SOURCE = 0x3b + IP_UNICAST_HOPS = 0x4 + ISIG = 0x1 + ISTRIP = 0x20 + IUCLC = 0x800 + IXANY = 0x1000 + IXOFF = 0x400 + IXON = 0x200 + I_FLUSH = 0x20005305 + LNOFLSH = 0x8000 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DONTNEED = 0x4 + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_SPACEAVAIL = 0x5 + MADV_WILLNEED = 0x3 + MAP_ANON = 0x10 + MAP_ANONYMOUS = 0x10 + MAP_FILE = 0x0 + MAP_FIXED = 0x100 + MAP_PRIVATE = 0x2 + MAP_SHARED = 0x1 + MAP_TYPE = 0xf0 + MAP_VARIABLE = 0x0 + MCL_CURRENT = 0x100 + MCL_FUTURE = 0x200 + MSG_ANY = 0x4 + MSG_ARGEXT = 0x400 + MSG_BAND = 0x2 + MSG_COMPAT = 0x8000 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_EOR = 0x8 + MSG_HIPRI = 0x1 + MSG_MAXIOVLEN = 0x10 + MSG_MPEG2 = 0x80 + MSG_NONBLOCK = 0x4000 + MSG_NOSIGNAL = 0x100 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MSG_WAITFORONE = 0x200 + MS_ASYNC = 0x10 + MS_EINTR = 0x80 + MS_INVALIDATE = 0x40 + MS_PER_SEC = 0x3e8 + MS_SYNC = 0x20 + NL0 = 0x0 + NL1 = 0x4000 + NL2 = 0x8000 + NL3 = 0xc000 + NLDLY = 0x4000 + NOFLSH = 0x80 + NOFLUSH = 0x80000000 + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + ONOEOT = 0x80000 + OPOST = 0x1 + OXTABS = 0x40000 + O_ACCMODE = 0x23 + O_APPEND = 0x8 + O_CIO = 0x80 + O_CIOR = 0x800000000 + O_CLOEXEC = 0x800000 + O_CREAT = 0x100 + O_DEFER = 0x2000 + O_DELAY = 0x4000 + O_DIRECT = 0x8000000 + O_DIRECTORY = 0x80000 + O_DSYNC = 0x400000 + O_EFSOFF = 0x400000000 + O_EFSON = 0x200000000 + O_EXCL = 0x400 + O_EXEC = 0x20 + O_LARGEFILE = 0x4000000 + O_NDELAY = 0x8000 + O_NOCACHE = 0x100000 + O_NOCTTY = 0x800 + O_NOFOLLOW = 0x1000000 + O_NONBLOCK = 0x4 + O_NONE = 0x3 + O_NSHARE = 0x10000 + O_RAW = 0x100000000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSHARE = 0x1000 + O_RSYNC = 0x200000 + O_SEARCH = 0x20 + O_SNAPSHOT = 0x40 + O_SYNC = 0x10 + O_TRUNC = 0x200 + O_TTY_INIT = 0x0 + O_WRONLY = 0x1 + PARENB = 0x100 + PAREXT = 0x100000 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_64BIT = 0x20 + PR_ADDR = 0x2 + PR_ARGEXT = 0x400 + PR_ATOMIC = 0x1 + PR_CONNREQUIRED = 0x4 + PR_FASTHZ = 0x5 + PR_INP = 0x40 + PR_INTRLEVEL = 0x8000 + PR_MLS = 0x100 + PR_MLS_1_LABEL = 0x200 + PR_NOEOR = 0x4000 + PR_RIGHTS = 0x10 + PR_SLOWHZ = 0x2 + PR_WANTRCVD = 0x8 + RLIMIT_AS = 0x6 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_NOFILE = 0x7 + RLIMIT_NPROC = 0x9 + RLIMIT_RSS = 0x5 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x8 + RTAX_NETMASK = 0x2 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DOWNSTREAM = 0x100 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTC_IA64 = 0x3 + RTC_POWER = 0x1 + RTC_POWER_PC = 0x2 + RTF_ACTIVE_DGD = 0x1000000 + RTF_BCE = 0x80000 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_BUL = 0x2000 + RTF_CLONE = 0x10000 + RTF_CLONED = 0x20000 + RTF_CLONING = 0x100 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_FREE_IN_PROG = 0x4000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MASK = 0x80 + RTF_MODIFIED = 0x20 + RTF_MULTICAST = 0x800000 + RTF_PERMANENT6 = 0x8000000 + RTF_PINNED = 0x100000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x40000 + RTF_REJECT = 0x8 + RTF_SMALLMTU = 0x40000 + RTF_STATIC = 0x800 + RTF_STOPSRCH = 0x2000000 + RTF_UNREACHABLE = 0x10000000 + RTF_UP = 0x1 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_EXPIRE = 0xf + RTM_GET = 0x4 + RTM_GETNEXT = 0x11 + RTM_IFINFO = 0xe + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTLOST = 0x10 + RTM_RTTUNIT = 0xf4240 + RTM_SAMEADDR = 0x12 + RTM_SET = 0x13 + RTM_VERSION = 0x2 + RTM_VERSION_GR = 0x4 + RTM_VERSION_GR_COMPAT = 0x3 + RTM_VERSION_POLICY = 0x5 + RTM_VERSION_POLICY_EXT = 0x6 + RTM_VERSION_POLICY_PRFN = 0x7 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_RIGHTS = 0x1 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIGMAX64 = 0xff + SIGQUEUE_MAX = 0x20 + SIOCADDIFVIPA = 0x20006942 + SIOCADDMTU = -0x7ffb9690 + SIOCADDMULTI = -0x7fdf96cf + SIOCADDNETID = -0x7fd796a9 + SIOCADDRT = -0x7fc78df6 + SIOCAIFADDR = -0x7fbf96e6 + SIOCATMARK = 0x40047307 + SIOCDARP = -0x7fb396e0 + SIOCDELIFVIPA = 0x20006943 + SIOCDELMTU = -0x7ffb968f + SIOCDELMULTI = -0x7fdf96ce + SIOCDELPMTU = -0x7fd78ff6 + SIOCDELRT = -0x7fc78df5 + SIOCDIFADDR = -0x7fd796e7 + SIOCDNETOPT = -0x3ffe9680 + SIOCDX25XLATE = -0x7fd7969b + SIOCFIFADDR = -0x7fdf966d + SIOCGARP = -0x3fb396da + SIOCGETMTUS = 0x2000696f + SIOCGETSGCNT = -0x3feb8acc + SIOCGETVIFCNT = -0x3feb8acd + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = -0x3fd796df + SIOCGIFADDRS = 0x2000698c + SIOCGIFBAUDRATE = -0x3fd79693 + SIOCGIFBRDADDR = -0x3fd796dd + SIOCGIFCONF = -0x3fef96bb + SIOCGIFCONFGLOB = -0x3fef9670 + SIOCGIFDSTADDR = -0x3fd796de + SIOCGIFFLAGS = -0x3fd796ef + SIOCGIFGIDLIST = 0x20006968 + SIOCGIFHWADDR = -0x3fab966b + SIOCGIFMETRIC = -0x3fd796e9 + SIOCGIFMTU = -0x3fd796aa + SIOCGIFNETMASK = -0x3fd796db + SIOCGIFOPTIONS = -0x3fd796d6 + SIOCGISNO = -0x3fd79695 + SIOCGLOADF = -0x3ffb967e + SIOCGLOWAT = 0x40047303 + SIOCGNETOPT = -0x3ffe96a5 + SIOCGNETOPT1 = -0x3fdf967f + SIOCGNMTUS = 0x2000696e + SIOCGPGRP = 0x40047309 + SIOCGSIZIFCONF = 0x4004696a + SIOCGSRCFILTER = -0x3fe796cb + SIOCGTUNEPHASE = -0x3ffb9676 + SIOCGX25XLATE = -0x3fd7969c + SIOCIFATTACH = -0x7fdf9699 + SIOCIFDETACH = -0x7fdf969a + SIOCIFGETPKEY = -0x7fdf969b + SIOCIF_ATM_DARP = -0x7fdf9683 + SIOCIF_ATM_DUMPARP = -0x7fdf9685 + SIOCIF_ATM_GARP = -0x7fdf9682 + SIOCIF_ATM_IDLE = -0x7fdf9686 + SIOCIF_ATM_SARP = -0x7fdf9681 + SIOCIF_ATM_SNMPARP = -0x7fdf9687 + SIOCIF_ATM_SVC = -0x7fdf9684 + SIOCIF_ATM_UBR = -0x7fdf9688 + SIOCIF_DEVHEALTH = -0x7ffb966c + SIOCIF_IB_ARP_INCOMP = -0x7fdf9677 + SIOCIF_IB_ARP_TIMER = -0x7fdf9678 + SIOCIF_IB_CLEAR_PINFO = -0x3fdf966f + SIOCIF_IB_DEL_ARP = -0x7fdf967f + SIOCIF_IB_DEL_PINFO = -0x3fdf9670 + SIOCIF_IB_DUMP_ARP = -0x7fdf9680 + SIOCIF_IB_GET_ARP = -0x7fdf967e + SIOCIF_IB_GET_INFO = -0x3f879675 + SIOCIF_IB_GET_STATS = -0x3f879672 + SIOCIF_IB_NOTIFY_ADDR_REM = -0x3f87966a + SIOCIF_IB_RESET_STATS = -0x3f879671 + SIOCIF_IB_RESIZE_CQ = -0x7fdf9679 + SIOCIF_IB_SET_ARP = -0x7fdf967d + SIOCIF_IB_SET_PKEY = -0x7fdf967c + SIOCIF_IB_SET_PORT = -0x7fdf967b + SIOCIF_IB_SET_QKEY = -0x7fdf9676 + SIOCIF_IB_SET_QSIZE = -0x7fdf967a + SIOCLISTIFVIPA = 0x20006944 + SIOCSARP = -0x7fb396e2 + SIOCSHIWAT = 0xffffffff80047300 + SIOCSIFADDR = -0x7fd796f4 + SIOCSIFADDRORI = -0x7fdb9673 + SIOCSIFBRDADDR = -0x7fd796ed + SIOCSIFDSTADDR = -0x7fd796f2 + SIOCSIFFLAGS = -0x7fd796f0 + SIOCSIFGIDLIST = 0x20006969 + SIOCSIFMETRIC = -0x7fd796e8 + SIOCSIFMTU = -0x7fd796a8 + SIOCSIFNETDUMP = -0x7fd796e4 + SIOCSIFNETMASK = -0x7fd796ea + SIOCSIFOPTIONS = -0x7fd796d7 + SIOCSIFSUBCHAN = -0x7fd796e5 + SIOCSISNO = -0x7fd79694 + SIOCSLOADF = -0x3ffb967d + SIOCSLOWAT = 0xffffffff80047302 + SIOCSNETOPT = -0x7ffe96a6 + SIOCSPGRP = 0xffffffff80047308 + SIOCSX25XLATE = -0x7fd7969d + SOCK_CONN_DGRAM = 0x6 + SOCK_DGRAM = 0x2 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x400 + SO_ACCEPTCONN = 0x2 + SO_AUDIT = 0x8000 + SO_BROADCAST = 0x20 + SO_CKSUMRECV = 0x800 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_KERNACCEPT = 0x2000 + SO_LINGER = 0x80 + SO_NOMULTIPATH = 0x4000 + SO_NOREUSEADDR = 0x1000 + SO_OOBINLINE = 0x100 + SO_PEERID = 0x1009 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_TIMESTAMPNS = 0x100a + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + SO_USE_IFBUFS = 0x400 + S_BANDURG = 0x400 + S_EMODFMT = 0x3c000000 + S_ENFMT = 0x400 + S_ERROR = 0x100 + S_HANGUP = 0x200 + S_HIPRI = 0x2 + S_ICRYPTO = 0x80000 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFJOURNAL = 0x10000 + S_IFLNK = 0xa000 + S_IFMPX = 0x2200 + S_IFMT = 0xf000 + S_IFPDIR = 0x4000000 + S_IFPSDIR = 0x8000000 + S_IFPSSDIR = 0xc000000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IFSYSEA = 0x30000000 + S_INPUT = 0x1 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_ITCB = 0x1000000 + S_ITP = 0x800000 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXACL = 0x2000000 + S_IXATTR = 0x40000 + S_IXGRP = 0x8 + S_IXINTERFACE = 0x100000 + S_IXMOD = 0x40000000 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + S_MSG = 0x8 + S_OUTPUT = 0x4 + S_RDBAND = 0x20 + S_RDNORM = 0x10 + S_RESERVED1 = 0x20000 + S_RESERVED2 = 0x200000 + S_RESERVED3 = 0x400000 + S_RESERVED4 = 0x80000000 + S_RESFMT1 = 0x10000000 + S_RESFMT10 = 0x34000000 + S_RESFMT11 = 0x38000000 + S_RESFMT12 = 0x3c000000 + S_RESFMT2 = 0x14000000 + S_RESFMT3 = 0x18000000 + S_RESFMT4 = 0x1c000000 + S_RESFMT5 = 0x20000000 + S_RESFMT6 = 0x24000000 + S_RESFMT7 = 0x28000000 + S_RESFMT8 = 0x2c000000 + S_WRBAND = 0x80 + S_WRNORM = 0x40 + TAB0 = 0x0 + TAB1 = 0x400 + TAB2 = 0x800 + TAB3 = 0xc00 + TABDLY = 0xc00 + TCFLSH = 0x540c + TCGETA = 0x5405 + TCGETS = 0x5401 + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_24DAYS_WORTH_OF_SLOWTICKS = 0x3f4800 + TCP_ACLADD = 0x23 + TCP_ACLBIND = 0x26 + TCP_ACLCLEAR = 0x22 + TCP_ACLDEL = 0x24 + TCP_ACLDENY = 0x8 + TCP_ACLFLUSH = 0x21 + TCP_ACLGID = 0x1 + TCP_ACLLS = 0x25 + TCP_ACLSUBNET = 0x4 + TCP_ACLUID = 0x2 + TCP_CWND_DF = 0x16 + TCP_CWND_IF = 0x15 + TCP_DELAY_ACK_FIN = 0x2 + TCP_DELAY_ACK_SYN = 0x1 + TCP_FASTNAME = 0x101080a + TCP_KEEPCNT = 0x13 + TCP_KEEPIDLE = 0x11 + TCP_KEEPINTVL = 0x12 + TCP_LSPRIV = 0x29 + TCP_LUID = 0x20 + TCP_MAXBURST = 0x8 + TCP_MAXDF = 0x64 + TCP_MAXIF = 0x64 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAXWINDOWSCALE = 0xe + TCP_MAX_SACK = 0x4 + TCP_MSS = 0x5b4 + TCP_NODELAY = 0x1 + TCP_NODELAYACK = 0x14 + TCP_NOREDUCE_CWND_EXIT_FRXMT = 0x19 + TCP_NOREDUCE_CWND_IN_FRXMT = 0x18 + TCP_NOTENTER_SSTART = 0x17 + TCP_OPT = 0x19 + TCP_RFC1323 = 0x4 + TCP_SETPRIV = 0x27 + TCP_STDURG = 0x10 + TCP_TIMESTAMP_OPTLEN = 0xc + TCP_UNSETPRIV = 0x28 + TCSAFLUSH = 0x2 + TCSBRK = 0x5409 + TCSETA = 0x5406 + TCSETAF = 0x5408 + TCSETAW = 0x5407 + TCSETS = 0x5402 + TCSETSF = 0x5404 + TCSETSW = 0x5403 + TCXONC = 0x540b + TIOC = 0x5400 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0xffffffff80047462 + TIOCEXCL = 0x2000740d + TIOCFLUSH = 0xffffffff80047410 + TIOCGETC = 0x40067412 + TIOCGETD = 0x40047400 + TIOCGETP = 0x40067408 + TIOCGLTC = 0x40067474 + TIOCGPGRP = 0x40047477 + TIOCGSID = 0x40047448 + TIOCGSIZE = 0x40087468 + TIOCGWINSZ = 0x40087468 + TIOCHPCL = 0x20007402 + TIOCLBIC = 0xffffffff8004747e + TIOCLBIS = 0xffffffff8004747f + TIOCLGET = 0x4004747c + TIOCLSET = 0xffffffff8004747d + TIOCMBIC = 0xffffffff8004746b + TIOCMBIS = 0xffffffff8004746c + TIOCMGET = 0x4004746a + TIOCMIWAIT = 0xffffffff80047464 + TIOCMODG = 0x40047403 + TIOCMODS = 0xffffffff80047404 + TIOCMSET = 0xffffffff8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0xffffffff80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCREMOTE = 0xffffffff80047469 + TIOCSBRK = 0x2000747b + TIOCSDTR = 0x20007479 + TIOCSETC = 0xffffffff80067411 + TIOCSETD = 0xffffffff80047401 + TIOCSETN = 0xffffffff8006740a + TIOCSETP = 0xffffffff80067409 + TIOCSLTC = 0xffffffff80067475 + TIOCSPGRP = 0xffffffff80047476 + TIOCSSIZE = 0xffffffff80087467 + TIOCSTART = 0x2000746e + TIOCSTI = 0xffffffff80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0xffffffff80087467 + TIOCUCNTL = 0xffffffff80047466 + TOSTOP = 0x10000 + UTIME_NOW = -0x2 + UTIME_OMIT = -0x3 + VDISCRD = 0xc + VDSUSP = 0xa + VEOF = 0x4 + VEOL = 0x5 + VEOL2 = 0x6 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xe + VMIN = 0x4 + VQUIT = 0x1 + VREPRINT = 0xb + VSTART = 0x7 + VSTOP = 0x8 + VSTRT = 0x7 + VSUSP = 0x9 + VT0 = 0x0 + VT1 = 0x8000 + VTDELAY = 0x2000 + VTDLY = 0x8000 + VTIME = 0x5 + VWERSE = 0xd + WPARSTART = 0x1 + WPARSTOP = 0x2 + WPARTTYNAME = "Global" + XCASE = 0x4 + XTABS = 0xc00 + _FDATAFLUSH = 0x2000000000 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x43) + EADDRNOTAVAIL = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x42) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x38) + EBADF = syscall.Errno(0x9) + EBADMSG = syscall.Errno(0x78) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x75) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x25) + ECLONEME = syscall.Errno(0x52) + ECONNABORTED = syscall.Errno(0x48) + ECONNREFUSED = syscall.Errno(0x4f) + ECONNRESET = syscall.Errno(0x49) + ECORRUPT = syscall.Errno(0x59) + EDEADLK = syscall.Errno(0x2d) + EDESTADDREQ = syscall.Errno(0x3a) + EDESTADDRREQ = syscall.Errno(0x3a) + EDIST = syscall.Errno(0x35) + EDOM = syscall.Errno(0x21) + EDQUOT = syscall.Errno(0x58) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFORMAT = syscall.Errno(0x30) + EHOSTDOWN = syscall.Errno(0x50) + EHOSTUNREACH = syscall.Errno(0x51) + EIDRM = syscall.Errno(0x24) + EILSEQ = syscall.Errno(0x74) + EINPROGRESS = syscall.Errno(0x37) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x4b) + EISDIR = syscall.Errno(0x15) + EL2HLT = syscall.Errno(0x2c) + EL2NSYNC = syscall.Errno(0x26) + EL3HLT = syscall.Errno(0x27) + EL3RST = syscall.Errno(0x28) + ELNRNG = syscall.Errno(0x29) + ELOOP = syscall.Errno(0x55) + EMEDIA = syscall.Errno(0x6e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x3b) + EMULTIHOP = syscall.Errno(0x7d) + ENAMETOOLONG = syscall.Errno(0x56) + ENETDOWN = syscall.Errno(0x45) + ENETRESET = syscall.Errno(0x47) + ENETUNREACH = syscall.Errno(0x46) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x70) + ENOBUFS = syscall.Errno(0x4a) + ENOCONNECT = syscall.Errno(0x32) + ENOCSI = syscall.Errno(0x2b) + ENODATA = syscall.Errno(0x7a) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x31) + ENOLINK = syscall.Errno(0x7e) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x23) + ENOPROTOOPT = syscall.Errno(0x3d) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x76) + ENOSTR = syscall.Errno(0x7b) + ENOSYS = syscall.Errno(0x6d) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x4c) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x11) + ENOTREADY = syscall.Errno(0x2e) + ENOTRECOVERABLE = syscall.Errno(0x5e) + ENOTRUST = syscall.Errno(0x72) + ENOTSOCK = syscall.Errno(0x39) + ENOTSUP = syscall.Errno(0x7c) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x40) + EOVERFLOW = syscall.Errno(0x7f) + EOWNERDEAD = syscall.Errno(0x5f) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x41) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x53) + EPROTO = syscall.Errno(0x79) + EPROTONOSUPPORT = syscall.Errno(0x3e) + EPROTOTYPE = syscall.Errno(0x3c) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x5d) + ERESTART = syscall.Errno(0x52) + EROFS = syscall.Errno(0x1e) + ESAD = syscall.Errno(0x71) + ESHUTDOWN = syscall.Errno(0x4d) + ESOCKTNOSUPPORT = syscall.Errno(0x3f) + ESOFT = syscall.Errno(0x6f) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x34) + ESYSERROR = syscall.Errno(0x5a) + ETIME = syscall.Errno(0x77) + ETIMEDOUT = syscall.Errno(0x4e) + ETOOMANYREFS = syscall.Errno(0x73) + ETXTBSY = syscall.Errno(0x1a) + EUNATCH = syscall.Errno(0x2a) + EUSERS = syscall.Errno(0x54) + EWOULDBLOCK = syscall.Errno(0xb) + EWRPROTECT = syscall.Errno(0x2f) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGAIO = syscall.Signal(0x17) + SIGALRM = syscall.Signal(0xe) + SIGALRM1 = syscall.Signal(0x26) + SIGBUS = syscall.Signal(0xa) + SIGCAPI = syscall.Signal(0x31) + SIGCHLD = syscall.Signal(0x14) + SIGCLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGCPUFAIL = syscall.Signal(0x3b) + SIGDANGER = syscall.Signal(0x21) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGGRANT = syscall.Signal(0x3c) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOINT = syscall.Signal(0x10) + SIGIOT = syscall.Signal(0x6) + SIGKAP = syscall.Signal(0x3c) + SIGKILL = syscall.Signal(0x9) + SIGLOST = syscall.Signal(0x6) + SIGMAX = syscall.Signal(0xff) + SIGMAX32 = syscall.Signal(0x3f) + SIGMIGRATE = syscall.Signal(0x23) + SIGMSG = syscall.Signal(0x1b) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x17) + SIGPRE = syscall.Signal(0x24) + SIGPROF = syscall.Signal(0x20) + SIGPTY = syscall.Signal(0x17) + SIGPWR = syscall.Signal(0x1d) + SIGQUIT = syscall.Signal(0x3) + SIGRECONFIG = syscall.Signal(0x3a) + SIGRETRACT = syscall.Signal(0x3d) + SIGSAK = syscall.Signal(0x3f) + SIGSEGV = syscall.Signal(0xb) + SIGSOUND = syscall.Signal(0x3e) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGSYSERROR = syscall.Signal(0x30) + SIGTALRM = syscall.Signal(0x26) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVIRT = syscall.Signal(0x25) + SIGVTALRM = syscall.Signal(0x22) + SIGWAITING = syscall.Signal(0x27) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "not owner"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "I/O error"}, + {6, "ENXIO", "no such device or address"}, + {7, "E2BIG", "arg list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file number"}, + {10, "ECHILD", "no child processes"}, + {11, "EWOULDBLOCK", "resource temporarily unavailable"}, + {12, "ENOMEM", "not enough space"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device busy"}, + {17, "ENOTEMPTY", "file exists"}, + {18, "EXDEV", "cross-device link"}, + {19, "ENODEV", "no such device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "file table overflow"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "not a typewriter"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "argument out of domain"}, + {34, "ERANGE", "result too large"}, + {35, "ENOMSG", "no message of desired type"}, + {36, "EIDRM", "identifier removed"}, + {37, "ECHRNG", "channel number out of range"}, + {38, "EL2NSYNC", "level 2 not synchronized"}, + {39, "EL3HLT", "level 3 halted"}, + {40, "EL3RST", "level 3 reset"}, + {41, "ELNRNG", "link number out of range"}, + {42, "EUNATCH", "protocol driver not attached"}, + {43, "ENOCSI", "no CSI structure available"}, + {44, "EL2HLT", "level 2 halted"}, + {45, "EDEADLK", "deadlock condition if locked"}, + {46, "ENOTREADY", "device not ready"}, + {47, "EWRPROTECT", "write-protected media"}, + {48, "EFORMAT", "unformatted or incompatible media"}, + {49, "ENOLCK", "no locks available"}, + {50, "ENOCONNECT", "cannot Establish Connection"}, + {52, "ESTALE", "missing file or filesystem"}, + {53, "EDIST", "requests blocked by Administrator"}, + {55, "EINPROGRESS", "operation now in progress"}, + {56, "EALREADY", "operation already in progress"}, + {57, "ENOTSOCK", "socket operation on non-socket"}, + {58, "EDESTADDREQ", "destination address required"}, + {59, "EMSGSIZE", "message too long"}, + {60, "EPROTOTYPE", "protocol wrong type for socket"}, + {61, "ENOPROTOOPT", "protocol not available"}, + {62, "EPROTONOSUPPORT", "protocol not supported"}, + {63, "ESOCKTNOSUPPORT", "socket type not supported"}, + {64, "EOPNOTSUPP", "operation not supported on socket"}, + {65, "EPFNOSUPPORT", "protocol family not supported"}, + {66, "EAFNOSUPPORT", "addr family not supported by protocol"}, + {67, "EADDRINUSE", "address already in use"}, + {68, "EADDRNOTAVAIL", "can't assign requested address"}, + {69, "ENETDOWN", "network is down"}, + {70, "ENETUNREACH", "network is unreachable"}, + {71, "ENETRESET", "network dropped connection on reset"}, + {72, "ECONNABORTED", "software caused connection abort"}, + {73, "ECONNRESET", "connection reset by peer"}, + {74, "ENOBUFS", "no buffer space available"}, + {75, "EISCONN", "socket is already connected"}, + {76, "ENOTCONN", "socket is not connected"}, + {77, "ESHUTDOWN", "can't send after socket shutdown"}, + {78, "ETIMEDOUT", "connection timed out"}, + {79, "ECONNREFUSED", "connection refused"}, + {80, "EHOSTDOWN", "host is down"}, + {81, "EHOSTUNREACH", "no route to host"}, + {82, "ERESTART", "restart the system call"}, + {83, "EPROCLIM", "too many processes"}, + {84, "EUSERS", "too many users"}, + {85, "ELOOP", "too many levels of symbolic links"}, + {86, "ENAMETOOLONG", "file name too long"}, + {88, "EDQUOT", "disk quota exceeded"}, + {89, "ECORRUPT", "invalid file system control data detected"}, + {90, "ESYSERROR", "for future use "}, + {93, "EREMOTE", "item is not local to host"}, + {94, "ENOTRECOVERABLE", "state not recoverable "}, + {95, "EOWNERDEAD", "previous owner died "}, + {109, "ENOSYS", "function not implemented"}, + {110, "EMEDIA", "media surface error"}, + {111, "ESOFT", "I/O completed, but needs relocation"}, + {112, "ENOATTR", "no attribute found"}, + {113, "ESAD", "security Authentication Denied"}, + {114, "ENOTRUST", "not a Trusted Program"}, + {115, "ETOOMANYREFS", "too many references: can't splice"}, + {116, "EILSEQ", "invalid wide character"}, + {117, "ECANCELED", "asynchronous I/O cancelled"}, + {118, "ENOSR", "out of STREAMS resources"}, + {119, "ETIME", "system call timed out"}, + {120, "EBADMSG", "next message has wrong type"}, + {121, "EPROTO", "error in protocol"}, + {122, "ENODATA", "no message on stream head read q"}, + {123, "ENOSTR", "fd not associated with a stream"}, + {124, "ENOTSUP", "unsupported attribute value"}, + {125, "EMULTIHOP", "multihop is not allowed"}, + {126, "ENOLINK", "the server link has been severed"}, + {127, "EOVERFLOW", "value too large to be stored in data type"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/BPT trap"}, + {6, "SIGIOT", "IOT/Abort trap"}, + {7, "SIGEMT", "EMT trap"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGBUS", "bus error"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGSYS", "bad system call"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGURG", "urgent I/O condition"}, + {17, "SIGSTOP", "stopped (signal)"}, + {18, "SIGTSTP", "stopped"}, + {19, "SIGCONT", "continued"}, + {20, "SIGCHLD", "child exited"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGIO", "I/O possible/complete"}, + {24, "SIGXCPU", "cputime limit exceeded"}, + {25, "SIGXFSZ", "filesize limit exceeded"}, + {27, "SIGMSG", "input device data"}, + {28, "SIGWINCH", "window size changes"}, + {29, "SIGPWR", "power-failure"}, + {30, "SIGUSR1", "user defined signal 1"}, + {31, "SIGUSR2", "user defined signal 2"}, + {32, "SIGPROF", "profiling timer expired"}, + {33, "SIGDANGER", "paging space low"}, + {34, "SIGVTALRM", "virtual timer expired"}, + {35, "SIGMIGRATE", "signal 35"}, + {36, "SIGPRE", "signal 36"}, + {37, "SIGVIRT", "signal 37"}, + {38, "SIGTALRM", "signal 38"}, + {39, "SIGWAITING", "signal 39"}, + {48, "SIGSYSERROR", "signal 48"}, + {49, "SIGCAPI", "signal 49"}, + {58, "SIGRECONFIG", "signal 58"}, + {59, "SIGCPUFAIL", "CPU Failure Predicted"}, + {60, "SIGGRANT", "monitor mode granted"}, + {61, "SIGRETRACT", "monitor mode retracted"}, + {62, "SIGSOUND", "sound completed"}, + {63, "SIGMAX32", "secure attention"}, + {255, "SIGMAX", "signal 255"}, +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_darwin_386.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_darwin_386.go new file mode 100644 index 00000000..3b39d740 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_darwin_386.go @@ -0,0 +1,1783 @@ +// mkerrors.sh -m32 +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build 386,darwin + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m32 _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1c + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x25 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x1e + AF_IPX = 0x17 + AF_ISDN = 0x1c + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x28 + AF_NATM = 0x1f + AF_NDRV = 0x1b + AF_NETBIOS = 0x21 + AF_NS = 0x6 + AF_OSI = 0x7 + AF_PPP = 0x22 + AF_PUP = 0x4 + AF_RESERVED_36 = 0x24 + AF_ROUTE = 0x11 + AF_SIP = 0x18 + AF_SNA = 0xb + AF_SYSTEM = 0x20 + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_UTUN = 0x26 + ALTWERASE = 0x200 + ATTR_BIT_MAP_COUNT = 0x5 + ATTR_CMN_ACCESSMASK = 0x20000 + ATTR_CMN_ACCTIME = 0x1000 + ATTR_CMN_ADDEDTIME = 0x10000000 + ATTR_CMN_BKUPTIME = 0x2000 + ATTR_CMN_CHGTIME = 0x800 + ATTR_CMN_CRTIME = 0x200 + ATTR_CMN_DATA_PROTECT_FLAGS = 0x40000000 + ATTR_CMN_DEVID = 0x2 + ATTR_CMN_DOCUMENT_ID = 0x100000 + ATTR_CMN_ERROR = 0x20000000 + ATTR_CMN_EXTENDED_SECURITY = 0x400000 + ATTR_CMN_FILEID = 0x2000000 + ATTR_CMN_FLAGS = 0x40000 + ATTR_CMN_FNDRINFO = 0x4000 + ATTR_CMN_FSID = 0x4 + ATTR_CMN_FULLPATH = 0x8000000 + ATTR_CMN_GEN_COUNT = 0x80000 + ATTR_CMN_GRPID = 0x10000 + ATTR_CMN_GRPUUID = 0x1000000 + ATTR_CMN_MODTIME = 0x400 + ATTR_CMN_NAME = 0x1 + ATTR_CMN_NAMEDATTRCOUNT = 0x80000 + ATTR_CMN_NAMEDATTRLIST = 0x100000 + ATTR_CMN_OBJID = 0x20 + ATTR_CMN_OBJPERMANENTID = 0x40 + ATTR_CMN_OBJTAG = 0x10 + ATTR_CMN_OBJTYPE = 0x8 + ATTR_CMN_OWNERID = 0x8000 + ATTR_CMN_PARENTID = 0x4000000 + ATTR_CMN_PAROBJID = 0x80 + ATTR_CMN_RETURNED_ATTRS = 0x80000000 + ATTR_CMN_SCRIPT = 0x100 + ATTR_CMN_SETMASK = 0x41c7ff00 + ATTR_CMN_USERACCESS = 0x200000 + ATTR_CMN_UUID = 0x800000 + ATTR_CMN_VALIDMASK = 0xffffffff + ATTR_CMN_VOLSETMASK = 0x6700 + ATTR_FILE_ALLOCSIZE = 0x4 + ATTR_FILE_CLUMPSIZE = 0x10 + ATTR_FILE_DATAALLOCSIZE = 0x400 + ATTR_FILE_DATAEXTENTS = 0x800 + ATTR_FILE_DATALENGTH = 0x200 + ATTR_FILE_DEVTYPE = 0x20 + ATTR_FILE_FILETYPE = 0x40 + ATTR_FILE_FORKCOUNT = 0x80 + ATTR_FILE_FORKLIST = 0x100 + ATTR_FILE_IOBLOCKSIZE = 0x8 + ATTR_FILE_LINKCOUNT = 0x1 + ATTR_FILE_RSRCALLOCSIZE = 0x2000 + ATTR_FILE_RSRCEXTENTS = 0x4000 + ATTR_FILE_RSRCLENGTH = 0x1000 + ATTR_FILE_SETMASK = 0x20 + ATTR_FILE_TOTALSIZE = 0x2 + ATTR_FILE_VALIDMASK = 0x37ff + ATTR_VOL_ALLOCATIONCLUMP = 0x40 + ATTR_VOL_ATTRIBUTES = 0x40000000 + ATTR_VOL_CAPABILITIES = 0x20000 + ATTR_VOL_DIRCOUNT = 0x400 + ATTR_VOL_ENCODINGSUSED = 0x10000 + ATTR_VOL_FILECOUNT = 0x200 + ATTR_VOL_FSTYPE = 0x1 + ATTR_VOL_INFO = 0x80000000 + ATTR_VOL_IOBLOCKSIZE = 0x80 + ATTR_VOL_MAXOBJCOUNT = 0x800 + ATTR_VOL_MINALLOCATION = 0x20 + ATTR_VOL_MOUNTEDDEVICE = 0x8000 + ATTR_VOL_MOUNTFLAGS = 0x4000 + ATTR_VOL_MOUNTPOINT = 0x1000 + ATTR_VOL_NAME = 0x2000 + ATTR_VOL_OBJCOUNT = 0x100 + ATTR_VOL_QUOTA_SIZE = 0x10000000 + ATTR_VOL_RESERVED_SIZE = 0x20000000 + ATTR_VOL_SETMASK = 0x80002000 + ATTR_VOL_SIGNATURE = 0x2 + ATTR_VOL_SIZE = 0x4 + ATTR_VOL_SPACEAVAIL = 0x10 + ATTR_VOL_SPACEFREE = 0x8 + ATTR_VOL_UUID = 0x40000 + ATTR_VOL_VALIDMASK = 0xf007ffff + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B9600 = 0x2580 + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc00c4279 + BIOCGETIF = 0x4020426b + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044272 + BIOCGRTIMEOUT = 0x4008426e + BIOCGSEESENT = 0x40044276 + BIOCGSTATS = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDLT = 0x80044278 + BIOCSETF = 0x80084267 + BIOCSETFNR = 0x8008427e + BIOCSETIF = 0x8020426c + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044273 + BIOCSRTIMEOUT = 0x8008426d + BIOCSSEESENT = 0x80044277 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x80000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x8000 + BSDLY = 0x8000 + CFLUSH = 0xf + CLOCAL = 0x8000 + CLOCK_MONOTONIC = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_MONOTONIC_RAW_APPROX = 0x5 + CLOCK_PROCESS_CPUTIME_ID = 0xc + CLOCK_REALTIME = 0x0 + CLOCK_THREAD_CPUTIME_ID = 0x10 + CLOCK_UPTIME_RAW = 0x8 + CLOCK_UPTIME_RAW_APPROX = 0x9 + CR0 = 0x0 + CR1 = 0x1000 + CR2 = 0x2000 + CR3 = 0x3000 + CRDLY = 0x3000 + CREAD = 0x800 + CRTSCTS = 0x30000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_HW = 0x6 + CTL_KERN = 0x1 + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CHDLC = 0x68 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DBUS = 0xe7 + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_DVB_CI = 0xeb + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_HHDLC = 0x79 + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NOFCS = 0xe6 + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_IPFILTER = 0x74 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPNET = 0xe2 + DLT_IPOIB = 0xf2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_ATM_CEMIC = 0xee + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FIBRECHANNEL = 0xea + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_SRX_E2E = 0xe9 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_JUNIPER_VS = 0xe8 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_PPP_WITHDIRECTION = 0xa6 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MATCHING_MAX = 0xf5 + DLT_MATCHING_MIN = 0x68 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPEG_2_TS = 0xf3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_MUX27010 = 0xec + DLT_NETANALYZER = 0xf0 + DLT_NETANALYZER_TRANSPARENT = 0xf1 + DLT_NFC_LLCP = 0xf5 + DLT_NFLOG = 0xef + DLT_NG40 = 0xf4 + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PPP_WITH_DIRECTION = 0xa6 + DLT_PRISM_HEADER = 0x77 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RIO = 0x7c + DLT_SCCP = 0x8e + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DLT_STANAG_5066_D_PDU = 0xed + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_USER0 = 0x93 + DLT_USER1 = 0x94 + DLT_USER10 = 0x9d + DLT_USER11 = 0x9e + DLT_USER12 = 0x9f + DLT_USER13 = 0xa0 + DLT_USER14 = 0xa1 + DLT_USER15 = 0xa2 + DLT_USER2 = 0x95 + DLT_USER3 = 0x96 + DLT_USER4 = 0x97 + DLT_USER5 = 0x98 + DLT_USER6 = 0x99 + DLT_USER7 = 0x9a + DLT_USER8 = 0x9b + DLT_USER9 = 0x9c + DLT_WIHART = 0xdf + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EVFILT_AIO = -0x3 + EVFILT_EXCEPT = -0xf + EVFILT_FS = -0x9 + EVFILT_MACHPORT = -0x8 + EVFILT_PROC = -0x5 + EVFILT_READ = -0x1 + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0xf + EVFILT_THREADMARKER = 0xf + EVFILT_TIMER = -0x7 + EVFILT_USER = -0xa + EVFILT_VM = -0xc + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_DISPATCH = 0x80 + EV_DISPATCH2 = 0x180 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG0 = 0x1000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_OOBAND = 0x2000 + EV_POLL = 0x1000 + EV_RECEIPT = 0x40 + EV_SYSFLAGS = 0xf000 + EV_UDATA_SPECIFIC = 0x100 + EV_VANISHED = 0x200 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x4000 + FFDLY = 0x4000 + FLUSHO = 0x800000 + FSOPT_ATTR_CMN_EXTENDED = 0x20 + FSOPT_NOFOLLOW = 0x1 + FSOPT_NOINMEMUPDATE = 0x2 + FSOPT_PACK_INVAL_ATTRS = 0x8 + FSOPT_REPORT_FULLSIZE = 0x4 + F_ADDFILESIGS = 0x3d + F_ADDFILESIGS_FOR_DYLD_SIM = 0x53 + F_ADDFILESIGS_RETURN = 0x61 + F_ADDSIGS = 0x3b + F_ALLOCATEALL = 0x4 + F_ALLOCATECONTIG = 0x2 + F_BARRIERFSYNC = 0x55 + F_CHECK_LV = 0x62 + F_CHKCLEAN = 0x29 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x43 + F_FINDSIGS = 0x4e + F_FLUSH_DATA = 0x28 + F_FREEZE_FS = 0x35 + F_FULLFSYNC = 0x33 + F_GETCODEDIR = 0x48 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETLKPID = 0x42 + F_GETNOSIGPIPE = 0x4a + F_GETOWN = 0x5 + F_GETPATH = 0x32 + F_GETPATH_MTMINFO = 0x47 + F_GETPROTECTIONCLASS = 0x3f + F_GETPROTECTIONLEVEL = 0x4d + F_GLOBAL_NOCACHE = 0x37 + F_LOG2PHYS = 0x31 + F_LOG2PHYS_EXT = 0x41 + F_NOCACHE = 0x30 + F_NODIRECT = 0x3e + F_OK = 0x0 + F_PATHPKG_CHECK = 0x34 + F_PEOFPOSMODE = 0x3 + F_PREALLOCATE = 0x2a + F_PUNCHHOLE = 0x63 + F_RDADVISE = 0x2c + F_RDAHEAD = 0x2d + F_RDLCK = 0x1 + F_SETBACKINGSTORE = 0x46 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETLKWTIMEOUT = 0xa + F_SETNOSIGPIPE = 0x49 + F_SETOWN = 0x6 + F_SETPROTECTIONCLASS = 0x40 + F_SETSIZE = 0x2b + F_SINGLE_WRITER = 0x4c + F_THAW_FS = 0x36 + F_TRANSCODEKEY = 0x4b + F_TRIM_ACTIVE_FILE = 0x64 + F_UNLCK = 0x2 + F_VOLPOSMODE = 0x4 + F_WRLCK = 0x3 + HUPCL = 0x4000 + HW_MACHINE = 0x1 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFF_ALLMULTI = 0x200 + IFF_ALTPHYS = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NOTRAILERS = 0x20 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_AAL5 = 0x31 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ATM = 0x25 + IFT_BRIDGE = 0xd1 + IFT_CARP = 0xf8 + IFT_CELLULAR = 0xff + IFT_CEPT = 0x13 + IFT_DS3 = 0x1e + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_ETHER = 0x6 + IFT_FAITH = 0x38 + IFT_FDDI = 0xf + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_GIF = 0x37 + IFT_HDH1822 = 0x3 + IFT_HIPPI = 0x2f + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IEEE1394 = 0x90 + IFT_IEEE8023ADLAG = 0x88 + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88026 = 0xa + IFT_L2VLAN = 0x87 + IFT_LAPB = 0x10 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_NSIP = 0x1b + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PDP = 0xff + IFT_PFLOG = 0xf5 + IFT_PFSYNC = 0xf6 + IFT_PKTAP = 0xfe + IFT_PPP = 0x17 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PTPSERIAL = 0x16 + IFT_RS232 = 0x21 + IFT_SDLC = 0x11 + IFT_SIP = 0x1f + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_STARLAN = 0xb + IFT_STF = 0x39 + IFT_T1 = 0x12 + IFT_ULTRA = 0x1d + IFT_V35 = 0x2d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LINKLOCALNETNUM = 0xa9fe0000 + IN_LOOPBACKNET = 0x7f + IPPROTO_3PC = 0x22 + IPPROTO_ADFS = 0x44 + IPPROTO_AH = 0x33 + IPPROTO_AHIP = 0x3d + IPPROTO_APES = 0x63 + IPPROTO_ARGUS = 0xd + IPPROTO_AX25 = 0x5d + IPPROTO_BHA = 0x31 + IPPROTO_BLT = 0x1e + IPPROTO_BRSATMON = 0x4c + IPPROTO_CFTP = 0x3e + IPPROTO_CHAOS = 0x10 + IPPROTO_CMTP = 0x26 + IPPROTO_CPHB = 0x49 + IPPROTO_CPNX = 0x48 + IPPROTO_DDP = 0x25 + IPPROTO_DGP = 0x56 + IPPROTO_DIVERT = 0xfe + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_EMCON = 0xe + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GMTP = 0x64 + IPPROTO_GRE = 0x2f + IPPROTO_HELLO = 0x3f + IPPROTO_HMP = 0x14 + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IDPR = 0x23 + IPPROTO_IDRP = 0x2d + IPPROTO_IGMP = 0x2 + IPPROTO_IGP = 0x55 + IPPROTO_IGRP = 0x58 + IPPROTO_IL = 0x28 + IPPROTO_INLSP = 0x34 + IPPROTO_INP = 0x20 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPCV = 0x47 + IPPROTO_IPEIP = 0x5e + IPPROTO_IPIP = 0x4 + IPPROTO_IPPC = 0x43 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IRTP = 0x1c + IPPROTO_KRYPTOLAN = 0x41 + IPPROTO_LARP = 0x5b + IPPROTO_LEAF1 = 0x19 + IPPROTO_LEAF2 = 0x1a + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x34 + IPPROTO_MEAS = 0x13 + IPPROTO_MHRP = 0x30 + IPPROTO_MICP = 0x5f + IPPROTO_MTP = 0x5c + IPPROTO_MUX = 0x12 + IPPROTO_ND = 0x4d + IPPROTO_NHRP = 0x36 + IPPROTO_NONE = 0x3b + IPPROTO_NSP = 0x1f + IPPROTO_NVPII = 0xb + IPPROTO_OSPFIGP = 0x59 + IPPROTO_PGM = 0x71 + IPPROTO_PIGP = 0x9 + IPPROTO_PIM = 0x67 + IPPROTO_PRM = 0x15 + IPPROTO_PUP = 0xc + IPPROTO_PVP = 0x4b + IPPROTO_RAW = 0xff + IPPROTO_RCCMON = 0xa + IPPROTO_RDP = 0x1b + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_RVD = 0x42 + IPPROTO_SATEXPAK = 0x40 + IPPROTO_SATMON = 0x45 + IPPROTO_SCCSP = 0x60 + IPPROTO_SCTP = 0x84 + IPPROTO_SDRP = 0x2a + IPPROTO_SEP = 0x21 + IPPROTO_SRPC = 0x5a + IPPROTO_ST = 0x7 + IPPROTO_SVMTP = 0x52 + IPPROTO_SWIPE = 0x35 + IPPROTO_TCF = 0x57 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_TPXX = 0x27 + IPPROTO_TRUNK1 = 0x17 + IPPROTO_TRUNK2 = 0x18 + IPPROTO_TTP = 0x54 + IPPROTO_UDP = 0x11 + IPPROTO_VINES = 0x53 + IPPROTO_VISA = 0x46 + IPPROTO_VMTP = 0x51 + IPPROTO_WBEXPAK = 0x4f + IPPROTO_WBMON = 0x4e + IPPROTO_WSN = 0x4a + IPPROTO_XNET = 0xf + IPPROTO_XTP = 0x24 + IPV6_2292DSTOPTS = 0x17 + IPV6_2292HOPLIMIT = 0x14 + IPV6_2292HOPOPTS = 0x16 + IPV6_2292NEXTHOP = 0x15 + IPV6_2292PKTINFO = 0x13 + IPV6_2292PKTOPTIONS = 0x19 + IPV6_2292RTHDR = 0x18 + IPV6_BINDV6ONLY = 0x1b + IPV6_BOUND_IF = 0x7d + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FLOW_ECN_MASK = 0x300 + IPV6_FRAGTTL = 0x3c + IPV6_FW_ADD = 0x1e + IPV6_FW_DEL = 0x1f + IPV6_FW_FLUSH = 0x20 + IPV6_FW_GET = 0x22 + IPV6_FW_ZERO = 0x21 + IPV6_HLIMDEC = 0x1 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXOPTHDR = 0x800 + IPV6_MAXPACKET = 0xffff + IPV6_MAX_GROUP_SRC_FILTER = 0x200 + IPV6_MAX_MEMBERSHIPS = 0xfff + IPV6_MAX_SOCK_SRC_FILTER = 0x80 + IPV6_MIN_MEMBERSHIPS = 0x1f + IPV6_MMTU = 0x500 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_RECVTCLASS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x24 + IPV6_UNICAST_HOPS = 0x4 + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_ADD_SOURCE_MEMBERSHIP = 0x46 + IP_BLOCK_SOURCE = 0x48 + IP_BOUND_IF = 0x19 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0xd + IP_DROP_SOURCE_MEMBERSHIP = 0x47 + IP_DUMMYNET_CONFIGURE = 0x3c + IP_DUMMYNET_DEL = 0x3d + IP_DUMMYNET_FLUSH = 0x3e + IP_DUMMYNET_GET = 0x40 + IP_FAITH = 0x16 + IP_FW_ADD = 0x28 + IP_FW_DEL = 0x29 + IP_FW_FLUSH = 0x2a + IP_FW_GET = 0x2c + IP_FW_RESETLOG = 0x2d + IP_FW_ZERO = 0x2b + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x15 + IP_MAXPACKET = 0xffff + IP_MAX_GROUP_SRC_FILTER = 0x200 + IP_MAX_MEMBERSHIPS = 0xfff + IP_MAX_SOCK_MUTE_FILTER = 0x80 + IP_MAX_SOCK_SRC_FILTER = 0x80 + IP_MF = 0x2000 + IP_MIN_MEMBERSHIPS = 0x1f + IP_MSFILTER = 0x4a + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_IFINDEX = 0x42 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_MULTICAST_VIF = 0xe + IP_NAT__XXX = 0x37 + IP_OFFMASK = 0x1fff + IP_OLD_FW_ADD = 0x32 + IP_OLD_FW_DEL = 0x33 + IP_OLD_FW_FLUSH = 0x34 + IP_OLD_FW_GET = 0x36 + IP_OLD_FW_RESETLOG = 0x38 + IP_OLD_FW_ZERO = 0x35 + IP_OPTIONS = 0x1 + IP_PKTINFO = 0x1a + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVPKTINFO = 0x1a + IP_RECVRETOPTS = 0x6 + IP_RECVTOS = 0x1b + IP_RECVTTL = 0x18 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RSVP_OFF = 0x10 + IP_RSVP_ON = 0xf + IP_RSVP_VIF_OFF = 0x12 + IP_RSVP_VIF_ON = 0x11 + IP_STRIPHDR = 0x17 + IP_TOS = 0x3 + IP_TRAFFIC_MGT_BACKGROUND = 0x41 + IP_TTL = 0x4 + IP_UNBLOCK_SOURCE = 0x49 + ISIG = 0x80 + ISTRIP = 0x20 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + KERN_HOSTNAME = 0xa + KERN_OSRELEASE = 0x2 + KERN_OSTYPE = 0x1 + KERN_VERSION = 0x4 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_CAN_REUSE = 0x9 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x5 + MADV_FREE_REUSABLE = 0x7 + MADV_FREE_REUSE = 0x8 + MADV_NORMAL = 0x0 + MADV_PAGEOUT = 0xa + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_WILLNEED = 0x3 + MADV_ZERO_WIRED_PAGES = 0x6 + MAP_ANON = 0x1000 + MAP_ANONYMOUS = 0x1000 + MAP_COPY = 0x2 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_JIT = 0x800 + MAP_NOCACHE = 0x400 + MAP_NOEXTEND = 0x100 + MAP_NORESERVE = 0x40 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_RESERVED0080 = 0x80 + MAP_RESILIENT_CODESIGN = 0x2000 + MAP_RESILIENT_MEDIA = 0x4000 + MAP_SHARED = 0x1 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MNT_ASYNC = 0x40 + MNT_AUTOMOUNTED = 0x400000 + MNT_CMDFLAGS = 0xf0000 + MNT_CPROTECT = 0x80 + MNT_DEFWRITE = 0x2000000 + MNT_DONTBROWSE = 0x100000 + MNT_DOVOLFS = 0x8000 + MNT_DWAIT = 0x4 + MNT_EXPORTED = 0x100 + MNT_FORCE = 0x80000 + MNT_IGNORE_OWNERSHIP = 0x200000 + MNT_JOURNALED = 0x800000 + MNT_LOCAL = 0x1000 + MNT_MULTILABEL = 0x4000000 + MNT_NOATIME = 0x10000000 + MNT_NOBLOCK = 0x20000 + MNT_NODEV = 0x10 + MNT_NOEXEC = 0x4 + MNT_NOSUID = 0x8 + MNT_NOUSERXATTR = 0x1000000 + MNT_NOWAIT = 0x2 + MNT_QUARANTINE = 0x400 + MNT_QUOTA = 0x2000 + MNT_RDONLY = 0x1 + MNT_RELOAD = 0x40000 + MNT_ROOTFS = 0x4000 + MNT_SYNCHRONOUS = 0x2 + MNT_UNION = 0x20 + MNT_UNKNOWNPERMISSIONS = 0x200000 + MNT_UPDATE = 0x10000 + MNT_VISFLAGMASK = 0x17f0f5ff + MNT_WAIT = 0x1 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOF = 0x100 + MSG_EOR = 0x8 + MSG_FLUSH = 0x400 + MSG_HAVEMORE = 0x2000 + MSG_HOLD = 0x800 + MSG_NEEDSA = 0x10000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_RCVMORE = 0x4000 + MSG_SEND = 0x1000 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MSG_WAITSTREAM = 0x200 + MS_ASYNC = 0x1 + MS_DEACTIVATE = 0x8 + MS_INVALIDATE = 0x2 + MS_KILLPAGES = 0x4 + MS_SYNC = 0x10 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_DUMP2 = 0x7 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_IFLIST2 = 0x6 + NET_RT_MAXID = 0xa + NET_RT_STAT = 0x4 + NET_RT_TRASH = 0x5 + NL0 = 0x0 + NL1 = 0x100 + NL2 = 0x200 + NL3 = 0x300 + NLDLY = 0x300 + NOFLSH = 0x80000000 + NOKERNINFO = 0x2000000 + NOTE_ABSOLUTE = 0x8 + NOTE_ATTRIB = 0x8 + NOTE_BACKGROUND = 0x40 + NOTE_CHILD = 0x4 + NOTE_CRITICAL = 0x20 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXITSTATUS = 0x4000000 + NOTE_EXIT_CSERROR = 0x40000 + NOTE_EXIT_DECRYPTFAIL = 0x10000 + NOTE_EXIT_DETAIL = 0x2000000 + NOTE_EXIT_DETAIL_MASK = 0x70000 + NOTE_EXIT_MEMORY = 0x20000 + NOTE_EXIT_REPARENTED = 0x80000 + NOTE_EXTEND = 0x4 + NOTE_FFAND = 0x40000000 + NOTE_FFCOPY = 0xc0000000 + NOTE_FFCTRLMASK = 0xc0000000 + NOTE_FFLAGSMASK = 0xffffff + NOTE_FFNOP = 0x0 + NOTE_FFOR = 0x80000000 + NOTE_FORK = 0x40000000 + NOTE_FUNLOCK = 0x100 + NOTE_LEEWAY = 0x10 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_MACH_CONTINUOUS_TIME = 0x80 + NOTE_NONE = 0x80 + NOTE_NSECONDS = 0x4 + NOTE_OOB = 0x2 + NOTE_PCTRLMASK = -0x100000 + NOTE_PDATAMASK = 0xfffff + NOTE_REAP = 0x10000000 + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_SECONDS = 0x1 + NOTE_SIGNAL = 0x8000000 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRIGGER = 0x1000000 + NOTE_USECONDS = 0x2 + NOTE_VM_ERROR = 0x10000000 + NOTE_VM_PRESSURE = 0x80000000 + NOTE_VM_PRESSURE_SUDDEN_TERMINATE = 0x20000000 + NOTE_VM_PRESSURE_TERMINATE = 0x40000000 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + OFDEL = 0x20000 + OFILL = 0x80 + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + OXTABS = 0x4 + O_ACCMODE = 0x3 + O_ALERT = 0x20000000 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x1000000 + O_CREAT = 0x200 + O_DIRECTORY = 0x100000 + O_DP_GETRAWENCRYPTED = 0x1 + O_DP_GETRAWUNENCRYPTED = 0x2 + O_DSYNC = 0x400000 + O_EVTONLY = 0x8000 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x20000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_POPUP = 0x80000000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_SHLOCK = 0x10 + O_SYMLINK = 0x200000 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PT_ATTACH = 0xa + PT_ATTACHEXC = 0xe + PT_CONTINUE = 0x7 + PT_DENY_ATTACH = 0x1f + PT_DETACH = 0xb + PT_FIRSTMACH = 0x20 + PT_FORCEQUOTA = 0x1e + PT_KILL = 0x8 + PT_READ_D = 0x2 + PT_READ_I = 0x1 + PT_READ_U = 0x3 + PT_SIGEXC = 0xc + PT_STEP = 0x9 + PT_THUPDATE = 0xd + PT_TRACE_ME = 0x0 + PT_WRITE_D = 0x5 + PT_WRITE_I = 0x4 + PT_WRITE_U = 0x6 + RLIMIT_AS = 0x5 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_CPU_USAGE_MONITOR = 0x2 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_MEMLOCK = 0x6 + RLIMIT_NOFILE = 0x8 + RLIMIT_NPROC = 0x7 + RLIMIT_RSS = 0x5 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x8 + RTAX_NETMASK = 0x2 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_CLONING = 0x100 + RTF_CONDEMNED = 0x2000000 + RTF_DELCLONE = 0x80 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_IFREF = 0x4000000 + RTF_IFSCOPE = 0x1000000 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MODIFIED = 0x20 + RTF_MULTICAST = 0x800000 + RTF_NOIFREF = 0x2000 + RTF_PINNED = 0x100000 + RTF_PRCLONING = 0x10000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x40000 + RTF_PROXY = 0x8000000 + RTF_REJECT = 0x8 + RTF_ROUTER = 0x10000000 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_WASCLONED = 0x20000 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DELMADDR = 0x10 + RTM_GET = 0x4 + RTM_GET2 = 0x14 + RTM_IFINFO = 0xe + RTM_IFINFO2 = 0x12 + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_NEWMADDR = 0xf + RTM_NEWMADDR2 = 0x13 + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + SCM_CREDS = 0x3 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x2 + SCM_TIMESTAMP_MONOTONIC = 0x4 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCAIFADDR = 0x8040691a + SIOCARPIPLL = 0xc0206928 + SIOCATMARK = 0x40047307 + SIOCAUTOADDR = 0xc0206926 + SIOCAUTONETMASK = 0x80206927 + SIOCDELMULTI = 0x80206932 + SIOCDIFADDR = 0x80206919 + SIOCDIFPHYADDR = 0x80206941 + SIOCGDRVSPEC = 0xc01c697b + SIOCGETVLAN = 0xc020697f + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0206921 + SIOCGIFALTMTU = 0xc0206948 + SIOCGIFASYNCMAP = 0xc020697c + SIOCGIFBOND = 0xc0206947 + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCAP = 0xc020695b + SIOCGIFCONF = 0xc0086924 + SIOCGIFDEVMTU = 0xc0206944 + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGENERIC = 0xc020693a + SIOCGIFKPI = 0xc0206987 + SIOCGIFMAC = 0xc0206982 + SIOCGIFMEDIA = 0xc0286938 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc0206933 + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206940 + SIOCGIFPHYS = 0xc0206935 + SIOCGIFPSRCADDR = 0xc020693f + SIOCGIFSTATUS = 0xc331693d + SIOCGIFVLAN = 0xc020697f + SIOCGIFWAKEFLAGS = 0xc0206988 + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCIFCREATE = 0xc0206978 + SIOCIFCREATE2 = 0xc020697a + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc00c6981 + SIOCRSLVMULTI = 0xc008693b + SIOCSDRVSPEC = 0x801c697b + SIOCSETVLAN = 0x8020697e + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFALTMTU = 0x80206945 + SIOCSIFASYNCMAP = 0x8020697d + SIOCSIFBOND = 0x80206946 + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFCAP = 0x8020695a + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGENERIC = 0x80206939 + SIOCSIFKPI = 0x80206986 + SIOCSIFLLADDR = 0x8020693c + SIOCSIFMAC = 0x80206983 + SIOCSIFMEDIA = 0xc0206937 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x80206934 + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x8040693e + SIOCSIFPHYS = 0x80206936 + SIOCSIFVLAN = 0x8020697e + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SOCK_DGRAM = 0x2 + SOCK_MAXADDRLEN = 0xff + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_DONTTRUNC = 0x2000 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LABEL = 0x1010 + SO_LINGER = 0x80 + SO_LINGER_SEC = 0x1080 + SO_NETSVC_MARKING_LEVEL = 0x1119 + SO_NET_SERVICE_TYPE = 0x1116 + SO_NKE = 0x1021 + SO_NOADDRERR = 0x1023 + SO_NOSIGPIPE = 0x1022 + SO_NOTIFYCONFLICT = 0x1026 + SO_NP_EXTENSIONS = 0x1083 + SO_NREAD = 0x1020 + SO_NUMRCVPKT = 0x1112 + SO_NWRITE = 0x1024 + SO_OOBINLINE = 0x100 + SO_PEERLABEL = 0x1011 + SO_RANDOMPORT = 0x1082 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_REUSESHAREUID = 0x1025 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_TIMESTAMP = 0x400 + SO_TIMESTAMP_MONOTONIC = 0x800 + SO_TYPE = 0x1008 + SO_UPCALLCLOSEWAIT = 0x1027 + SO_USELOOPBACK = 0x40 + SO_WANTMORE = 0x4000 + SO_WANTOOBFLAG = 0x8000 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IFWHT = 0xe000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISTXT = 0x200 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x400 + TAB2 = 0x800 + TAB3 = 0x4 + TABDLY = 0xc04 + TCIFLUSH = 0x1 + TCIOFF = 0x3 + TCIOFLUSH = 0x3 + TCION = 0x4 + TCOFLUSH = 0x2 + TCOOFF = 0x1 + TCOON = 0x2 + TCP_CONNECTIONTIMEOUT = 0x20 + TCP_CONNECTION_INFO = 0x106 + TCP_ENABLE_ECN = 0x104 + TCP_FASTOPEN = 0x105 + TCP_KEEPALIVE = 0x10 + TCP_KEEPCNT = 0x102 + TCP_KEEPINTVL = 0x101 + TCP_MAXHLEN = 0x3c + TCP_MAXOLEN = 0x28 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x4 + TCP_MAX_WINSHIFT = 0xe + TCP_MINMSS = 0xd8 + TCP_MSS = 0x200 + TCP_NODELAY = 0x1 + TCP_NOOPT = 0x8 + TCP_NOPUSH = 0x4 + TCP_NOTSENT_LOWAT = 0x201 + TCP_RXT_CONNDROPTIME = 0x80 + TCP_RXT_FINDROP = 0x100 + TCP_SENDMOREACKS = 0x103 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDCDTIMESTAMP = 0x40087458 + TIOCDRAIN = 0x2000745e + TIOCDSIMICROCODE = 0x20007455 + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLUSH = 0x80047410 + TIOCGDRAINWAIT = 0x40047456 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGPGRP = 0x40047477 + TIOCGWINSZ = 0x40087468 + TIOCIXOFF = 0x20007480 + TIOCIXON = 0x20007481 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGDTRWAIT = 0x4004745a + TIOCMGET = 0x4004746a + TIOCMODG = 0x40047403 + TIOCMODS = 0x80047404 + TIOCMSDTRWAIT = 0x8004745b + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCPTYGNAME = 0x40807453 + TIOCPTYGRANT = 0x20007454 + TIOCPTYUNLK = 0x20007452 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCONS = 0x20007463 + TIOCSCTTY = 0x20007461 + TIOCSDRAINWAIT = 0x80047457 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSIG = 0x2000745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x20007465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCTIMESTAMP = 0x40087459 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VM_LOADAVG = 0x2 + VM_MACHFACTOR = 0x4 + VM_MAXID = 0x6 + VM_METER = 0x1 + VM_SWAPUSAGE = 0x5 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VT0 = 0x0 + VT1 = 0x10000 + VTDLY = 0x10000 + VTIME = 0x11 + VWERASE = 0x4 + WCONTINUED = 0x10 + WCOREFLAG = 0x80 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOWAIT = 0x20 + WORDSIZE = 0x20 + WSTOPPED = 0x8 + WUNTRACED = 0x2 + XATTR_CREATE = 0x2 + XATTR_NODEFAULT = 0x10 + XATTR_NOFOLLOW = 0x1 + XATTR_NOSECURITY = 0x8 + XATTR_REPLACE = 0x4 + XATTR_SHOWCOMPRESSION = 0x20 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADARCH = syscall.Errno(0x56) + EBADEXEC = syscall.Errno(0x55) + EBADF = syscall.Errno(0x9) + EBADMACHO = syscall.Errno(0x58) + EBADMSG = syscall.Errno(0x5e) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x59) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDEVERR = syscall.Errno(0x53) + EDOM = syscall.Errno(0x21) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x5a) + EILSEQ = syscall.Errno(0x5c) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x6a) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5f) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x5d) + ENOBUFS = syscall.Errno(0x37) + ENODATA = syscall.Errno(0x60) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x61) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x5b) + ENOPOLICY = syscall.Errno(0x67) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x62) + ENOSTR = syscall.Errno(0x63) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTRECOVERABLE = syscall.Errno(0x68) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x2d) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x66) + EOVERFLOW = syscall.Errno(0x54) + EOWNERDEAD = syscall.Errno(0x69) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTO = syscall.Errno(0x64) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + EPWROFF = syscall.Errno(0x52) + EQFULL = syscall.Errno(0x6a) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHLIBVERS = syscall.Errno(0x57) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIME = syscall.Errno(0x65) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "device not configured"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EDEADLK", "resource deadlock avoided"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "resource busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "cross-device link"}, + {19, "ENODEV", "operation not supported by device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "result too large"}, + {35, "EAGAIN", "resource temporarily unavailable"}, + {36, "EINPROGRESS", "operation now in progress"}, + {37, "EALREADY", "operation already in progress"}, + {38, "ENOTSOCK", "socket operation on non-socket"}, + {39, "EDESTADDRREQ", "destination address required"}, + {40, "EMSGSIZE", "message too long"}, + {41, "EPROTOTYPE", "protocol wrong type for socket"}, + {42, "ENOPROTOOPT", "protocol not available"}, + {43, "EPROTONOSUPPORT", "protocol not supported"}, + {44, "ESOCKTNOSUPPORT", "socket type not supported"}, + {45, "ENOTSUP", "operation not supported"}, + {46, "EPFNOSUPPORT", "protocol family not supported"}, + {47, "EAFNOSUPPORT", "address family not supported by protocol family"}, + {48, "EADDRINUSE", "address already in use"}, + {49, "EADDRNOTAVAIL", "can't assign requested address"}, + {50, "ENETDOWN", "network is down"}, + {51, "ENETUNREACH", "network is unreachable"}, + {52, "ENETRESET", "network dropped connection on reset"}, + {53, "ECONNABORTED", "software caused connection abort"}, + {54, "ECONNRESET", "connection reset by peer"}, + {55, "ENOBUFS", "no buffer space available"}, + {56, "EISCONN", "socket is already connected"}, + {57, "ENOTCONN", "socket is not connected"}, + {58, "ESHUTDOWN", "can't send after socket shutdown"}, + {59, "ETOOMANYREFS", "too many references: can't splice"}, + {60, "ETIMEDOUT", "operation timed out"}, + {61, "ECONNREFUSED", "connection refused"}, + {62, "ELOOP", "too many levels of symbolic links"}, + {63, "ENAMETOOLONG", "file name too long"}, + {64, "EHOSTDOWN", "host is down"}, + {65, "EHOSTUNREACH", "no route to host"}, + {66, "ENOTEMPTY", "directory not empty"}, + {67, "EPROCLIM", "too many processes"}, + {68, "EUSERS", "too many users"}, + {69, "EDQUOT", "disc quota exceeded"}, + {70, "ESTALE", "stale NFS file handle"}, + {71, "EREMOTE", "too many levels of remote in path"}, + {72, "EBADRPC", "RPC struct is bad"}, + {73, "ERPCMISMATCH", "RPC version wrong"}, + {74, "EPROGUNAVAIL", "RPC prog. not avail"}, + {75, "EPROGMISMATCH", "program version wrong"}, + {76, "EPROCUNAVAIL", "bad procedure for program"}, + {77, "ENOLCK", "no locks available"}, + {78, "ENOSYS", "function not implemented"}, + {79, "EFTYPE", "inappropriate file type or format"}, + {80, "EAUTH", "authentication error"}, + {81, "ENEEDAUTH", "need authenticator"}, + {82, "EPWROFF", "device power is off"}, + {83, "EDEVERR", "device error"}, + {84, "EOVERFLOW", "value too large to be stored in data type"}, + {85, "EBADEXEC", "bad executable (or shared library)"}, + {86, "EBADARCH", "bad CPU type in executable"}, + {87, "ESHLIBVERS", "shared library version mismatch"}, + {88, "EBADMACHO", "malformed Mach-o file"}, + {89, "ECANCELED", "operation canceled"}, + {90, "EIDRM", "identifier removed"}, + {91, "ENOMSG", "no message of desired type"}, + {92, "EILSEQ", "illegal byte sequence"}, + {93, "ENOATTR", "attribute not found"}, + {94, "EBADMSG", "bad message"}, + {95, "EMULTIHOP", "EMULTIHOP (Reserved)"}, + {96, "ENODATA", "no message available on STREAM"}, + {97, "ENOLINK", "ENOLINK (Reserved)"}, + {98, "ENOSR", "no STREAM resources"}, + {99, "ENOSTR", "not a STREAM"}, + {100, "EPROTO", "protocol error"}, + {101, "ETIME", "STREAM ioctl timeout"}, + {102, "EOPNOTSUPP", "operation not supported on socket"}, + {103, "ENOPOLICY", "policy not found"}, + {104, "ENOTRECOVERABLE", "state not recoverable"}, + {105, "EOWNERDEAD", "previous owner died"}, + {106, "EQFULL", "interface output queue is full"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/BPT trap"}, + {6, "SIGABRT", "abort trap"}, + {7, "SIGEMT", "EMT trap"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGBUS", "bus error"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGSYS", "bad system call"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGURG", "urgent I/O condition"}, + {17, "SIGSTOP", "suspended (signal)"}, + {18, "SIGTSTP", "suspended"}, + {19, "SIGCONT", "continued"}, + {20, "SIGCHLD", "child exited"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGIO", "I/O possible"}, + {24, "SIGXCPU", "cputime limit exceeded"}, + {25, "SIGXFSZ", "filesize limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window size changes"}, + {29, "SIGINFO", "information request"}, + {30, "SIGUSR1", "user defined signal 1"}, + {31, "SIGUSR2", "user defined signal 2"}, +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go new file mode 100644 index 00000000..8fe55477 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go @@ -0,0 +1,1783 @@ +// mkerrors.sh -m64 +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,darwin + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m64 _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1c + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x25 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x1e + AF_IPX = 0x17 + AF_ISDN = 0x1c + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x28 + AF_NATM = 0x1f + AF_NDRV = 0x1b + AF_NETBIOS = 0x21 + AF_NS = 0x6 + AF_OSI = 0x7 + AF_PPP = 0x22 + AF_PUP = 0x4 + AF_RESERVED_36 = 0x24 + AF_ROUTE = 0x11 + AF_SIP = 0x18 + AF_SNA = 0xb + AF_SYSTEM = 0x20 + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_UTUN = 0x26 + ALTWERASE = 0x200 + ATTR_BIT_MAP_COUNT = 0x5 + ATTR_CMN_ACCESSMASK = 0x20000 + ATTR_CMN_ACCTIME = 0x1000 + ATTR_CMN_ADDEDTIME = 0x10000000 + ATTR_CMN_BKUPTIME = 0x2000 + ATTR_CMN_CHGTIME = 0x800 + ATTR_CMN_CRTIME = 0x200 + ATTR_CMN_DATA_PROTECT_FLAGS = 0x40000000 + ATTR_CMN_DEVID = 0x2 + ATTR_CMN_DOCUMENT_ID = 0x100000 + ATTR_CMN_ERROR = 0x20000000 + ATTR_CMN_EXTENDED_SECURITY = 0x400000 + ATTR_CMN_FILEID = 0x2000000 + ATTR_CMN_FLAGS = 0x40000 + ATTR_CMN_FNDRINFO = 0x4000 + ATTR_CMN_FSID = 0x4 + ATTR_CMN_FULLPATH = 0x8000000 + ATTR_CMN_GEN_COUNT = 0x80000 + ATTR_CMN_GRPID = 0x10000 + ATTR_CMN_GRPUUID = 0x1000000 + ATTR_CMN_MODTIME = 0x400 + ATTR_CMN_NAME = 0x1 + ATTR_CMN_NAMEDATTRCOUNT = 0x80000 + ATTR_CMN_NAMEDATTRLIST = 0x100000 + ATTR_CMN_OBJID = 0x20 + ATTR_CMN_OBJPERMANENTID = 0x40 + ATTR_CMN_OBJTAG = 0x10 + ATTR_CMN_OBJTYPE = 0x8 + ATTR_CMN_OWNERID = 0x8000 + ATTR_CMN_PARENTID = 0x4000000 + ATTR_CMN_PAROBJID = 0x80 + ATTR_CMN_RETURNED_ATTRS = 0x80000000 + ATTR_CMN_SCRIPT = 0x100 + ATTR_CMN_SETMASK = 0x41c7ff00 + ATTR_CMN_USERACCESS = 0x200000 + ATTR_CMN_UUID = 0x800000 + ATTR_CMN_VALIDMASK = 0xffffffff + ATTR_CMN_VOLSETMASK = 0x6700 + ATTR_FILE_ALLOCSIZE = 0x4 + ATTR_FILE_CLUMPSIZE = 0x10 + ATTR_FILE_DATAALLOCSIZE = 0x400 + ATTR_FILE_DATAEXTENTS = 0x800 + ATTR_FILE_DATALENGTH = 0x200 + ATTR_FILE_DEVTYPE = 0x20 + ATTR_FILE_FILETYPE = 0x40 + ATTR_FILE_FORKCOUNT = 0x80 + ATTR_FILE_FORKLIST = 0x100 + ATTR_FILE_IOBLOCKSIZE = 0x8 + ATTR_FILE_LINKCOUNT = 0x1 + ATTR_FILE_RSRCALLOCSIZE = 0x2000 + ATTR_FILE_RSRCEXTENTS = 0x4000 + ATTR_FILE_RSRCLENGTH = 0x1000 + ATTR_FILE_SETMASK = 0x20 + ATTR_FILE_TOTALSIZE = 0x2 + ATTR_FILE_VALIDMASK = 0x37ff + ATTR_VOL_ALLOCATIONCLUMP = 0x40 + ATTR_VOL_ATTRIBUTES = 0x40000000 + ATTR_VOL_CAPABILITIES = 0x20000 + ATTR_VOL_DIRCOUNT = 0x400 + ATTR_VOL_ENCODINGSUSED = 0x10000 + ATTR_VOL_FILECOUNT = 0x200 + ATTR_VOL_FSTYPE = 0x1 + ATTR_VOL_INFO = 0x80000000 + ATTR_VOL_IOBLOCKSIZE = 0x80 + ATTR_VOL_MAXOBJCOUNT = 0x800 + ATTR_VOL_MINALLOCATION = 0x20 + ATTR_VOL_MOUNTEDDEVICE = 0x8000 + ATTR_VOL_MOUNTFLAGS = 0x4000 + ATTR_VOL_MOUNTPOINT = 0x1000 + ATTR_VOL_NAME = 0x2000 + ATTR_VOL_OBJCOUNT = 0x100 + ATTR_VOL_QUOTA_SIZE = 0x10000000 + ATTR_VOL_RESERVED_SIZE = 0x20000000 + ATTR_VOL_SETMASK = 0x80002000 + ATTR_VOL_SIGNATURE = 0x2 + ATTR_VOL_SIZE = 0x4 + ATTR_VOL_SPACEAVAIL = 0x10 + ATTR_VOL_SPACEFREE = 0x8 + ATTR_VOL_UUID = 0x40000 + ATTR_VOL_VALIDMASK = 0xf007ffff + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B9600 = 0x2580 + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc00c4279 + BIOCGETIF = 0x4020426b + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044272 + BIOCGRTIMEOUT = 0x4010426e + BIOCGSEESENT = 0x40044276 + BIOCGSTATS = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDLT = 0x80044278 + BIOCSETF = 0x80104267 + BIOCSETFNR = 0x8010427e + BIOCSETIF = 0x8020426c + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044273 + BIOCSRTIMEOUT = 0x8010426d + BIOCSSEESENT = 0x80044277 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x80000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x8000 + BSDLY = 0x8000 + CFLUSH = 0xf + CLOCAL = 0x8000 + CLOCK_MONOTONIC = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_MONOTONIC_RAW_APPROX = 0x5 + CLOCK_PROCESS_CPUTIME_ID = 0xc + CLOCK_REALTIME = 0x0 + CLOCK_THREAD_CPUTIME_ID = 0x10 + CLOCK_UPTIME_RAW = 0x8 + CLOCK_UPTIME_RAW_APPROX = 0x9 + CR0 = 0x0 + CR1 = 0x1000 + CR2 = 0x2000 + CR3 = 0x3000 + CRDLY = 0x3000 + CREAD = 0x800 + CRTSCTS = 0x30000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_HW = 0x6 + CTL_KERN = 0x1 + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CHDLC = 0x68 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DBUS = 0xe7 + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_DVB_CI = 0xeb + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_HHDLC = 0x79 + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NOFCS = 0xe6 + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_IPFILTER = 0x74 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPNET = 0xe2 + DLT_IPOIB = 0xf2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_ATM_CEMIC = 0xee + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FIBRECHANNEL = 0xea + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_SRX_E2E = 0xe9 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_JUNIPER_VS = 0xe8 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_PPP_WITHDIRECTION = 0xa6 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MATCHING_MAX = 0xf5 + DLT_MATCHING_MIN = 0x68 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPEG_2_TS = 0xf3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_MUX27010 = 0xec + DLT_NETANALYZER = 0xf0 + DLT_NETANALYZER_TRANSPARENT = 0xf1 + DLT_NFC_LLCP = 0xf5 + DLT_NFLOG = 0xef + DLT_NG40 = 0xf4 + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PPP_WITH_DIRECTION = 0xa6 + DLT_PRISM_HEADER = 0x77 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RIO = 0x7c + DLT_SCCP = 0x8e + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DLT_STANAG_5066_D_PDU = 0xed + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_USER0 = 0x93 + DLT_USER1 = 0x94 + DLT_USER10 = 0x9d + DLT_USER11 = 0x9e + DLT_USER12 = 0x9f + DLT_USER13 = 0xa0 + DLT_USER14 = 0xa1 + DLT_USER15 = 0xa2 + DLT_USER2 = 0x95 + DLT_USER3 = 0x96 + DLT_USER4 = 0x97 + DLT_USER5 = 0x98 + DLT_USER6 = 0x99 + DLT_USER7 = 0x9a + DLT_USER8 = 0x9b + DLT_USER9 = 0x9c + DLT_WIHART = 0xdf + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EVFILT_AIO = -0x3 + EVFILT_EXCEPT = -0xf + EVFILT_FS = -0x9 + EVFILT_MACHPORT = -0x8 + EVFILT_PROC = -0x5 + EVFILT_READ = -0x1 + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0xf + EVFILT_THREADMARKER = 0xf + EVFILT_TIMER = -0x7 + EVFILT_USER = -0xa + EVFILT_VM = -0xc + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_DISPATCH = 0x80 + EV_DISPATCH2 = 0x180 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG0 = 0x1000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_OOBAND = 0x2000 + EV_POLL = 0x1000 + EV_RECEIPT = 0x40 + EV_SYSFLAGS = 0xf000 + EV_UDATA_SPECIFIC = 0x100 + EV_VANISHED = 0x200 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x4000 + FFDLY = 0x4000 + FLUSHO = 0x800000 + FSOPT_ATTR_CMN_EXTENDED = 0x20 + FSOPT_NOFOLLOW = 0x1 + FSOPT_NOINMEMUPDATE = 0x2 + FSOPT_PACK_INVAL_ATTRS = 0x8 + FSOPT_REPORT_FULLSIZE = 0x4 + F_ADDFILESIGS = 0x3d + F_ADDFILESIGS_FOR_DYLD_SIM = 0x53 + F_ADDFILESIGS_RETURN = 0x61 + F_ADDSIGS = 0x3b + F_ALLOCATEALL = 0x4 + F_ALLOCATECONTIG = 0x2 + F_BARRIERFSYNC = 0x55 + F_CHECK_LV = 0x62 + F_CHKCLEAN = 0x29 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x43 + F_FINDSIGS = 0x4e + F_FLUSH_DATA = 0x28 + F_FREEZE_FS = 0x35 + F_FULLFSYNC = 0x33 + F_GETCODEDIR = 0x48 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETLKPID = 0x42 + F_GETNOSIGPIPE = 0x4a + F_GETOWN = 0x5 + F_GETPATH = 0x32 + F_GETPATH_MTMINFO = 0x47 + F_GETPROTECTIONCLASS = 0x3f + F_GETPROTECTIONLEVEL = 0x4d + F_GLOBAL_NOCACHE = 0x37 + F_LOG2PHYS = 0x31 + F_LOG2PHYS_EXT = 0x41 + F_NOCACHE = 0x30 + F_NODIRECT = 0x3e + F_OK = 0x0 + F_PATHPKG_CHECK = 0x34 + F_PEOFPOSMODE = 0x3 + F_PREALLOCATE = 0x2a + F_PUNCHHOLE = 0x63 + F_RDADVISE = 0x2c + F_RDAHEAD = 0x2d + F_RDLCK = 0x1 + F_SETBACKINGSTORE = 0x46 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETLKWTIMEOUT = 0xa + F_SETNOSIGPIPE = 0x49 + F_SETOWN = 0x6 + F_SETPROTECTIONCLASS = 0x40 + F_SETSIZE = 0x2b + F_SINGLE_WRITER = 0x4c + F_THAW_FS = 0x36 + F_TRANSCODEKEY = 0x4b + F_TRIM_ACTIVE_FILE = 0x64 + F_UNLCK = 0x2 + F_VOLPOSMODE = 0x4 + F_WRLCK = 0x3 + HUPCL = 0x4000 + HW_MACHINE = 0x1 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFF_ALLMULTI = 0x200 + IFF_ALTPHYS = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NOTRAILERS = 0x20 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_AAL5 = 0x31 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ATM = 0x25 + IFT_BRIDGE = 0xd1 + IFT_CARP = 0xf8 + IFT_CELLULAR = 0xff + IFT_CEPT = 0x13 + IFT_DS3 = 0x1e + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_ETHER = 0x6 + IFT_FAITH = 0x38 + IFT_FDDI = 0xf + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_GIF = 0x37 + IFT_HDH1822 = 0x3 + IFT_HIPPI = 0x2f + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IEEE1394 = 0x90 + IFT_IEEE8023ADLAG = 0x88 + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88026 = 0xa + IFT_L2VLAN = 0x87 + IFT_LAPB = 0x10 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_NSIP = 0x1b + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PDP = 0xff + IFT_PFLOG = 0xf5 + IFT_PFSYNC = 0xf6 + IFT_PKTAP = 0xfe + IFT_PPP = 0x17 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PTPSERIAL = 0x16 + IFT_RS232 = 0x21 + IFT_SDLC = 0x11 + IFT_SIP = 0x1f + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_STARLAN = 0xb + IFT_STF = 0x39 + IFT_T1 = 0x12 + IFT_ULTRA = 0x1d + IFT_V35 = 0x2d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LINKLOCALNETNUM = 0xa9fe0000 + IN_LOOPBACKNET = 0x7f + IPPROTO_3PC = 0x22 + IPPROTO_ADFS = 0x44 + IPPROTO_AH = 0x33 + IPPROTO_AHIP = 0x3d + IPPROTO_APES = 0x63 + IPPROTO_ARGUS = 0xd + IPPROTO_AX25 = 0x5d + IPPROTO_BHA = 0x31 + IPPROTO_BLT = 0x1e + IPPROTO_BRSATMON = 0x4c + IPPROTO_CFTP = 0x3e + IPPROTO_CHAOS = 0x10 + IPPROTO_CMTP = 0x26 + IPPROTO_CPHB = 0x49 + IPPROTO_CPNX = 0x48 + IPPROTO_DDP = 0x25 + IPPROTO_DGP = 0x56 + IPPROTO_DIVERT = 0xfe + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_EMCON = 0xe + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GMTP = 0x64 + IPPROTO_GRE = 0x2f + IPPROTO_HELLO = 0x3f + IPPROTO_HMP = 0x14 + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IDPR = 0x23 + IPPROTO_IDRP = 0x2d + IPPROTO_IGMP = 0x2 + IPPROTO_IGP = 0x55 + IPPROTO_IGRP = 0x58 + IPPROTO_IL = 0x28 + IPPROTO_INLSP = 0x34 + IPPROTO_INP = 0x20 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPCV = 0x47 + IPPROTO_IPEIP = 0x5e + IPPROTO_IPIP = 0x4 + IPPROTO_IPPC = 0x43 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IRTP = 0x1c + IPPROTO_KRYPTOLAN = 0x41 + IPPROTO_LARP = 0x5b + IPPROTO_LEAF1 = 0x19 + IPPROTO_LEAF2 = 0x1a + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x34 + IPPROTO_MEAS = 0x13 + IPPROTO_MHRP = 0x30 + IPPROTO_MICP = 0x5f + IPPROTO_MTP = 0x5c + IPPROTO_MUX = 0x12 + IPPROTO_ND = 0x4d + IPPROTO_NHRP = 0x36 + IPPROTO_NONE = 0x3b + IPPROTO_NSP = 0x1f + IPPROTO_NVPII = 0xb + IPPROTO_OSPFIGP = 0x59 + IPPROTO_PGM = 0x71 + IPPROTO_PIGP = 0x9 + IPPROTO_PIM = 0x67 + IPPROTO_PRM = 0x15 + IPPROTO_PUP = 0xc + IPPROTO_PVP = 0x4b + IPPROTO_RAW = 0xff + IPPROTO_RCCMON = 0xa + IPPROTO_RDP = 0x1b + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_RVD = 0x42 + IPPROTO_SATEXPAK = 0x40 + IPPROTO_SATMON = 0x45 + IPPROTO_SCCSP = 0x60 + IPPROTO_SCTP = 0x84 + IPPROTO_SDRP = 0x2a + IPPROTO_SEP = 0x21 + IPPROTO_SRPC = 0x5a + IPPROTO_ST = 0x7 + IPPROTO_SVMTP = 0x52 + IPPROTO_SWIPE = 0x35 + IPPROTO_TCF = 0x57 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_TPXX = 0x27 + IPPROTO_TRUNK1 = 0x17 + IPPROTO_TRUNK2 = 0x18 + IPPROTO_TTP = 0x54 + IPPROTO_UDP = 0x11 + IPPROTO_VINES = 0x53 + IPPROTO_VISA = 0x46 + IPPROTO_VMTP = 0x51 + IPPROTO_WBEXPAK = 0x4f + IPPROTO_WBMON = 0x4e + IPPROTO_WSN = 0x4a + IPPROTO_XNET = 0xf + IPPROTO_XTP = 0x24 + IPV6_2292DSTOPTS = 0x17 + IPV6_2292HOPLIMIT = 0x14 + IPV6_2292HOPOPTS = 0x16 + IPV6_2292NEXTHOP = 0x15 + IPV6_2292PKTINFO = 0x13 + IPV6_2292PKTOPTIONS = 0x19 + IPV6_2292RTHDR = 0x18 + IPV6_BINDV6ONLY = 0x1b + IPV6_BOUND_IF = 0x7d + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FLOW_ECN_MASK = 0x300 + IPV6_FRAGTTL = 0x3c + IPV6_FW_ADD = 0x1e + IPV6_FW_DEL = 0x1f + IPV6_FW_FLUSH = 0x20 + IPV6_FW_GET = 0x22 + IPV6_FW_ZERO = 0x21 + IPV6_HLIMDEC = 0x1 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXOPTHDR = 0x800 + IPV6_MAXPACKET = 0xffff + IPV6_MAX_GROUP_SRC_FILTER = 0x200 + IPV6_MAX_MEMBERSHIPS = 0xfff + IPV6_MAX_SOCK_SRC_FILTER = 0x80 + IPV6_MIN_MEMBERSHIPS = 0x1f + IPV6_MMTU = 0x500 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_RECVTCLASS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x24 + IPV6_UNICAST_HOPS = 0x4 + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_ADD_SOURCE_MEMBERSHIP = 0x46 + IP_BLOCK_SOURCE = 0x48 + IP_BOUND_IF = 0x19 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0xd + IP_DROP_SOURCE_MEMBERSHIP = 0x47 + IP_DUMMYNET_CONFIGURE = 0x3c + IP_DUMMYNET_DEL = 0x3d + IP_DUMMYNET_FLUSH = 0x3e + IP_DUMMYNET_GET = 0x40 + IP_FAITH = 0x16 + IP_FW_ADD = 0x28 + IP_FW_DEL = 0x29 + IP_FW_FLUSH = 0x2a + IP_FW_GET = 0x2c + IP_FW_RESETLOG = 0x2d + IP_FW_ZERO = 0x2b + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x15 + IP_MAXPACKET = 0xffff + IP_MAX_GROUP_SRC_FILTER = 0x200 + IP_MAX_MEMBERSHIPS = 0xfff + IP_MAX_SOCK_MUTE_FILTER = 0x80 + IP_MAX_SOCK_SRC_FILTER = 0x80 + IP_MF = 0x2000 + IP_MIN_MEMBERSHIPS = 0x1f + IP_MSFILTER = 0x4a + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_IFINDEX = 0x42 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_MULTICAST_VIF = 0xe + IP_NAT__XXX = 0x37 + IP_OFFMASK = 0x1fff + IP_OLD_FW_ADD = 0x32 + IP_OLD_FW_DEL = 0x33 + IP_OLD_FW_FLUSH = 0x34 + IP_OLD_FW_GET = 0x36 + IP_OLD_FW_RESETLOG = 0x38 + IP_OLD_FW_ZERO = 0x35 + IP_OPTIONS = 0x1 + IP_PKTINFO = 0x1a + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVPKTINFO = 0x1a + IP_RECVRETOPTS = 0x6 + IP_RECVTOS = 0x1b + IP_RECVTTL = 0x18 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RSVP_OFF = 0x10 + IP_RSVP_ON = 0xf + IP_RSVP_VIF_OFF = 0x12 + IP_RSVP_VIF_ON = 0x11 + IP_STRIPHDR = 0x17 + IP_TOS = 0x3 + IP_TRAFFIC_MGT_BACKGROUND = 0x41 + IP_TTL = 0x4 + IP_UNBLOCK_SOURCE = 0x49 + ISIG = 0x80 + ISTRIP = 0x20 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + KERN_HOSTNAME = 0xa + KERN_OSRELEASE = 0x2 + KERN_OSTYPE = 0x1 + KERN_VERSION = 0x4 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_CAN_REUSE = 0x9 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x5 + MADV_FREE_REUSABLE = 0x7 + MADV_FREE_REUSE = 0x8 + MADV_NORMAL = 0x0 + MADV_PAGEOUT = 0xa + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_WILLNEED = 0x3 + MADV_ZERO_WIRED_PAGES = 0x6 + MAP_ANON = 0x1000 + MAP_ANONYMOUS = 0x1000 + MAP_COPY = 0x2 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_JIT = 0x800 + MAP_NOCACHE = 0x400 + MAP_NOEXTEND = 0x100 + MAP_NORESERVE = 0x40 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_RESERVED0080 = 0x80 + MAP_RESILIENT_CODESIGN = 0x2000 + MAP_RESILIENT_MEDIA = 0x4000 + MAP_SHARED = 0x1 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MNT_ASYNC = 0x40 + MNT_AUTOMOUNTED = 0x400000 + MNT_CMDFLAGS = 0xf0000 + MNT_CPROTECT = 0x80 + MNT_DEFWRITE = 0x2000000 + MNT_DONTBROWSE = 0x100000 + MNT_DOVOLFS = 0x8000 + MNT_DWAIT = 0x4 + MNT_EXPORTED = 0x100 + MNT_FORCE = 0x80000 + MNT_IGNORE_OWNERSHIP = 0x200000 + MNT_JOURNALED = 0x800000 + MNT_LOCAL = 0x1000 + MNT_MULTILABEL = 0x4000000 + MNT_NOATIME = 0x10000000 + MNT_NOBLOCK = 0x20000 + MNT_NODEV = 0x10 + MNT_NOEXEC = 0x4 + MNT_NOSUID = 0x8 + MNT_NOUSERXATTR = 0x1000000 + MNT_NOWAIT = 0x2 + MNT_QUARANTINE = 0x400 + MNT_QUOTA = 0x2000 + MNT_RDONLY = 0x1 + MNT_RELOAD = 0x40000 + MNT_ROOTFS = 0x4000 + MNT_SYNCHRONOUS = 0x2 + MNT_UNION = 0x20 + MNT_UNKNOWNPERMISSIONS = 0x200000 + MNT_UPDATE = 0x10000 + MNT_VISFLAGMASK = 0x17f0f5ff + MNT_WAIT = 0x1 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOF = 0x100 + MSG_EOR = 0x8 + MSG_FLUSH = 0x400 + MSG_HAVEMORE = 0x2000 + MSG_HOLD = 0x800 + MSG_NEEDSA = 0x10000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_RCVMORE = 0x4000 + MSG_SEND = 0x1000 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MSG_WAITSTREAM = 0x200 + MS_ASYNC = 0x1 + MS_DEACTIVATE = 0x8 + MS_INVALIDATE = 0x2 + MS_KILLPAGES = 0x4 + MS_SYNC = 0x10 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_DUMP2 = 0x7 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_IFLIST2 = 0x6 + NET_RT_MAXID = 0xa + NET_RT_STAT = 0x4 + NET_RT_TRASH = 0x5 + NL0 = 0x0 + NL1 = 0x100 + NL2 = 0x200 + NL3 = 0x300 + NLDLY = 0x300 + NOFLSH = 0x80000000 + NOKERNINFO = 0x2000000 + NOTE_ABSOLUTE = 0x8 + NOTE_ATTRIB = 0x8 + NOTE_BACKGROUND = 0x40 + NOTE_CHILD = 0x4 + NOTE_CRITICAL = 0x20 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXITSTATUS = 0x4000000 + NOTE_EXIT_CSERROR = 0x40000 + NOTE_EXIT_DECRYPTFAIL = 0x10000 + NOTE_EXIT_DETAIL = 0x2000000 + NOTE_EXIT_DETAIL_MASK = 0x70000 + NOTE_EXIT_MEMORY = 0x20000 + NOTE_EXIT_REPARENTED = 0x80000 + NOTE_EXTEND = 0x4 + NOTE_FFAND = 0x40000000 + NOTE_FFCOPY = 0xc0000000 + NOTE_FFCTRLMASK = 0xc0000000 + NOTE_FFLAGSMASK = 0xffffff + NOTE_FFNOP = 0x0 + NOTE_FFOR = 0x80000000 + NOTE_FORK = 0x40000000 + NOTE_FUNLOCK = 0x100 + NOTE_LEEWAY = 0x10 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_MACH_CONTINUOUS_TIME = 0x80 + NOTE_NONE = 0x80 + NOTE_NSECONDS = 0x4 + NOTE_OOB = 0x2 + NOTE_PCTRLMASK = -0x100000 + NOTE_PDATAMASK = 0xfffff + NOTE_REAP = 0x10000000 + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_SECONDS = 0x1 + NOTE_SIGNAL = 0x8000000 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRIGGER = 0x1000000 + NOTE_USECONDS = 0x2 + NOTE_VM_ERROR = 0x10000000 + NOTE_VM_PRESSURE = 0x80000000 + NOTE_VM_PRESSURE_SUDDEN_TERMINATE = 0x20000000 + NOTE_VM_PRESSURE_TERMINATE = 0x40000000 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + OFDEL = 0x20000 + OFILL = 0x80 + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + OXTABS = 0x4 + O_ACCMODE = 0x3 + O_ALERT = 0x20000000 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x1000000 + O_CREAT = 0x200 + O_DIRECTORY = 0x100000 + O_DP_GETRAWENCRYPTED = 0x1 + O_DP_GETRAWUNENCRYPTED = 0x2 + O_DSYNC = 0x400000 + O_EVTONLY = 0x8000 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x20000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_POPUP = 0x80000000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_SHLOCK = 0x10 + O_SYMLINK = 0x200000 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PT_ATTACH = 0xa + PT_ATTACHEXC = 0xe + PT_CONTINUE = 0x7 + PT_DENY_ATTACH = 0x1f + PT_DETACH = 0xb + PT_FIRSTMACH = 0x20 + PT_FORCEQUOTA = 0x1e + PT_KILL = 0x8 + PT_READ_D = 0x2 + PT_READ_I = 0x1 + PT_READ_U = 0x3 + PT_SIGEXC = 0xc + PT_STEP = 0x9 + PT_THUPDATE = 0xd + PT_TRACE_ME = 0x0 + PT_WRITE_D = 0x5 + PT_WRITE_I = 0x4 + PT_WRITE_U = 0x6 + RLIMIT_AS = 0x5 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_CPU_USAGE_MONITOR = 0x2 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_MEMLOCK = 0x6 + RLIMIT_NOFILE = 0x8 + RLIMIT_NPROC = 0x7 + RLIMIT_RSS = 0x5 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x8 + RTAX_NETMASK = 0x2 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_CLONING = 0x100 + RTF_CONDEMNED = 0x2000000 + RTF_DELCLONE = 0x80 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_IFREF = 0x4000000 + RTF_IFSCOPE = 0x1000000 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MODIFIED = 0x20 + RTF_MULTICAST = 0x800000 + RTF_NOIFREF = 0x2000 + RTF_PINNED = 0x100000 + RTF_PRCLONING = 0x10000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x40000 + RTF_PROXY = 0x8000000 + RTF_REJECT = 0x8 + RTF_ROUTER = 0x10000000 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_WASCLONED = 0x20000 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DELMADDR = 0x10 + RTM_GET = 0x4 + RTM_GET2 = 0x14 + RTM_IFINFO = 0xe + RTM_IFINFO2 = 0x12 + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_NEWMADDR = 0xf + RTM_NEWMADDR2 = 0x13 + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + SCM_CREDS = 0x3 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x2 + SCM_TIMESTAMP_MONOTONIC = 0x4 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCAIFADDR = 0x8040691a + SIOCARPIPLL = 0xc0206928 + SIOCATMARK = 0x40047307 + SIOCAUTOADDR = 0xc0206926 + SIOCAUTONETMASK = 0x80206927 + SIOCDELMULTI = 0x80206932 + SIOCDIFADDR = 0x80206919 + SIOCDIFPHYADDR = 0x80206941 + SIOCGDRVSPEC = 0xc028697b + SIOCGETVLAN = 0xc020697f + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0206921 + SIOCGIFALTMTU = 0xc0206948 + SIOCGIFASYNCMAP = 0xc020697c + SIOCGIFBOND = 0xc0206947 + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCAP = 0xc020695b + SIOCGIFCONF = 0xc00c6924 + SIOCGIFDEVMTU = 0xc0206944 + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGENERIC = 0xc020693a + SIOCGIFKPI = 0xc0206987 + SIOCGIFMAC = 0xc0206982 + SIOCGIFMEDIA = 0xc02c6938 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc0206933 + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206940 + SIOCGIFPHYS = 0xc0206935 + SIOCGIFPSRCADDR = 0xc020693f + SIOCGIFSTATUS = 0xc331693d + SIOCGIFVLAN = 0xc020697f + SIOCGIFWAKEFLAGS = 0xc0206988 + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCIFCREATE = 0xc0206978 + SIOCIFCREATE2 = 0xc020697a + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc0106981 + SIOCRSLVMULTI = 0xc010693b + SIOCSDRVSPEC = 0x8028697b + SIOCSETVLAN = 0x8020697e + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFALTMTU = 0x80206945 + SIOCSIFASYNCMAP = 0x8020697d + SIOCSIFBOND = 0x80206946 + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFCAP = 0x8020695a + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGENERIC = 0x80206939 + SIOCSIFKPI = 0x80206986 + SIOCSIFLLADDR = 0x8020693c + SIOCSIFMAC = 0x80206983 + SIOCSIFMEDIA = 0xc0206937 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x80206934 + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x8040693e + SIOCSIFPHYS = 0x80206936 + SIOCSIFVLAN = 0x8020697e + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SOCK_DGRAM = 0x2 + SOCK_MAXADDRLEN = 0xff + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_DONTTRUNC = 0x2000 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LABEL = 0x1010 + SO_LINGER = 0x80 + SO_LINGER_SEC = 0x1080 + SO_NETSVC_MARKING_LEVEL = 0x1119 + SO_NET_SERVICE_TYPE = 0x1116 + SO_NKE = 0x1021 + SO_NOADDRERR = 0x1023 + SO_NOSIGPIPE = 0x1022 + SO_NOTIFYCONFLICT = 0x1026 + SO_NP_EXTENSIONS = 0x1083 + SO_NREAD = 0x1020 + SO_NUMRCVPKT = 0x1112 + SO_NWRITE = 0x1024 + SO_OOBINLINE = 0x100 + SO_PEERLABEL = 0x1011 + SO_RANDOMPORT = 0x1082 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_REUSESHAREUID = 0x1025 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_TIMESTAMP = 0x400 + SO_TIMESTAMP_MONOTONIC = 0x800 + SO_TYPE = 0x1008 + SO_UPCALLCLOSEWAIT = 0x1027 + SO_USELOOPBACK = 0x40 + SO_WANTMORE = 0x4000 + SO_WANTOOBFLAG = 0x8000 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IFWHT = 0xe000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISTXT = 0x200 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x400 + TAB2 = 0x800 + TAB3 = 0x4 + TABDLY = 0xc04 + TCIFLUSH = 0x1 + TCIOFF = 0x3 + TCIOFLUSH = 0x3 + TCION = 0x4 + TCOFLUSH = 0x2 + TCOOFF = 0x1 + TCOON = 0x2 + TCP_CONNECTIONTIMEOUT = 0x20 + TCP_CONNECTION_INFO = 0x106 + TCP_ENABLE_ECN = 0x104 + TCP_FASTOPEN = 0x105 + TCP_KEEPALIVE = 0x10 + TCP_KEEPCNT = 0x102 + TCP_KEEPINTVL = 0x101 + TCP_MAXHLEN = 0x3c + TCP_MAXOLEN = 0x28 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x4 + TCP_MAX_WINSHIFT = 0xe + TCP_MINMSS = 0xd8 + TCP_MSS = 0x200 + TCP_NODELAY = 0x1 + TCP_NOOPT = 0x8 + TCP_NOPUSH = 0x4 + TCP_NOTSENT_LOWAT = 0x201 + TCP_RXT_CONNDROPTIME = 0x80 + TCP_RXT_FINDROP = 0x100 + TCP_SENDMOREACKS = 0x103 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDCDTIMESTAMP = 0x40107458 + TIOCDRAIN = 0x2000745e + TIOCDSIMICROCODE = 0x20007455 + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLUSH = 0x80047410 + TIOCGDRAINWAIT = 0x40047456 + TIOCGETA = 0x40487413 + TIOCGETD = 0x4004741a + TIOCGPGRP = 0x40047477 + TIOCGWINSZ = 0x40087468 + TIOCIXOFF = 0x20007480 + TIOCIXON = 0x20007481 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGDTRWAIT = 0x4004745a + TIOCMGET = 0x4004746a + TIOCMODG = 0x40047403 + TIOCMODS = 0x80047404 + TIOCMSDTRWAIT = 0x8004745b + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCPTYGNAME = 0x40807453 + TIOCPTYGRANT = 0x20007454 + TIOCPTYUNLK = 0x20007452 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCONS = 0x20007463 + TIOCSCTTY = 0x20007461 + TIOCSDRAINWAIT = 0x80047457 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x80487414 + TIOCSETAF = 0x80487416 + TIOCSETAW = 0x80487415 + TIOCSETD = 0x8004741b + TIOCSIG = 0x2000745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x20007465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCTIMESTAMP = 0x40107459 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VM_LOADAVG = 0x2 + VM_MACHFACTOR = 0x4 + VM_MAXID = 0x6 + VM_METER = 0x1 + VM_SWAPUSAGE = 0x5 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VT0 = 0x0 + VT1 = 0x10000 + VTDLY = 0x10000 + VTIME = 0x11 + VWERASE = 0x4 + WCONTINUED = 0x10 + WCOREFLAG = 0x80 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOWAIT = 0x20 + WORDSIZE = 0x40 + WSTOPPED = 0x8 + WUNTRACED = 0x2 + XATTR_CREATE = 0x2 + XATTR_NODEFAULT = 0x10 + XATTR_NOFOLLOW = 0x1 + XATTR_NOSECURITY = 0x8 + XATTR_REPLACE = 0x4 + XATTR_SHOWCOMPRESSION = 0x20 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADARCH = syscall.Errno(0x56) + EBADEXEC = syscall.Errno(0x55) + EBADF = syscall.Errno(0x9) + EBADMACHO = syscall.Errno(0x58) + EBADMSG = syscall.Errno(0x5e) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x59) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDEVERR = syscall.Errno(0x53) + EDOM = syscall.Errno(0x21) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x5a) + EILSEQ = syscall.Errno(0x5c) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x6a) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5f) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x5d) + ENOBUFS = syscall.Errno(0x37) + ENODATA = syscall.Errno(0x60) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x61) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x5b) + ENOPOLICY = syscall.Errno(0x67) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x62) + ENOSTR = syscall.Errno(0x63) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTRECOVERABLE = syscall.Errno(0x68) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x2d) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x66) + EOVERFLOW = syscall.Errno(0x54) + EOWNERDEAD = syscall.Errno(0x69) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTO = syscall.Errno(0x64) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + EPWROFF = syscall.Errno(0x52) + EQFULL = syscall.Errno(0x6a) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHLIBVERS = syscall.Errno(0x57) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIME = syscall.Errno(0x65) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "device not configured"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EDEADLK", "resource deadlock avoided"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "resource busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "cross-device link"}, + {19, "ENODEV", "operation not supported by device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "result too large"}, + {35, "EAGAIN", "resource temporarily unavailable"}, + {36, "EINPROGRESS", "operation now in progress"}, + {37, "EALREADY", "operation already in progress"}, + {38, "ENOTSOCK", "socket operation on non-socket"}, + {39, "EDESTADDRREQ", "destination address required"}, + {40, "EMSGSIZE", "message too long"}, + {41, "EPROTOTYPE", "protocol wrong type for socket"}, + {42, "ENOPROTOOPT", "protocol not available"}, + {43, "EPROTONOSUPPORT", "protocol not supported"}, + {44, "ESOCKTNOSUPPORT", "socket type not supported"}, + {45, "ENOTSUP", "operation not supported"}, + {46, "EPFNOSUPPORT", "protocol family not supported"}, + {47, "EAFNOSUPPORT", "address family not supported by protocol family"}, + {48, "EADDRINUSE", "address already in use"}, + {49, "EADDRNOTAVAIL", "can't assign requested address"}, + {50, "ENETDOWN", "network is down"}, + {51, "ENETUNREACH", "network is unreachable"}, + {52, "ENETRESET", "network dropped connection on reset"}, + {53, "ECONNABORTED", "software caused connection abort"}, + {54, "ECONNRESET", "connection reset by peer"}, + {55, "ENOBUFS", "no buffer space available"}, + {56, "EISCONN", "socket is already connected"}, + {57, "ENOTCONN", "socket is not connected"}, + {58, "ESHUTDOWN", "can't send after socket shutdown"}, + {59, "ETOOMANYREFS", "too many references: can't splice"}, + {60, "ETIMEDOUT", "operation timed out"}, + {61, "ECONNREFUSED", "connection refused"}, + {62, "ELOOP", "too many levels of symbolic links"}, + {63, "ENAMETOOLONG", "file name too long"}, + {64, "EHOSTDOWN", "host is down"}, + {65, "EHOSTUNREACH", "no route to host"}, + {66, "ENOTEMPTY", "directory not empty"}, + {67, "EPROCLIM", "too many processes"}, + {68, "EUSERS", "too many users"}, + {69, "EDQUOT", "disc quota exceeded"}, + {70, "ESTALE", "stale NFS file handle"}, + {71, "EREMOTE", "too many levels of remote in path"}, + {72, "EBADRPC", "RPC struct is bad"}, + {73, "ERPCMISMATCH", "RPC version wrong"}, + {74, "EPROGUNAVAIL", "RPC prog. not avail"}, + {75, "EPROGMISMATCH", "program version wrong"}, + {76, "EPROCUNAVAIL", "bad procedure for program"}, + {77, "ENOLCK", "no locks available"}, + {78, "ENOSYS", "function not implemented"}, + {79, "EFTYPE", "inappropriate file type or format"}, + {80, "EAUTH", "authentication error"}, + {81, "ENEEDAUTH", "need authenticator"}, + {82, "EPWROFF", "device power is off"}, + {83, "EDEVERR", "device error"}, + {84, "EOVERFLOW", "value too large to be stored in data type"}, + {85, "EBADEXEC", "bad executable (or shared library)"}, + {86, "EBADARCH", "bad CPU type in executable"}, + {87, "ESHLIBVERS", "shared library version mismatch"}, + {88, "EBADMACHO", "malformed Mach-o file"}, + {89, "ECANCELED", "operation canceled"}, + {90, "EIDRM", "identifier removed"}, + {91, "ENOMSG", "no message of desired type"}, + {92, "EILSEQ", "illegal byte sequence"}, + {93, "ENOATTR", "attribute not found"}, + {94, "EBADMSG", "bad message"}, + {95, "EMULTIHOP", "EMULTIHOP (Reserved)"}, + {96, "ENODATA", "no message available on STREAM"}, + {97, "ENOLINK", "ENOLINK (Reserved)"}, + {98, "ENOSR", "no STREAM resources"}, + {99, "ENOSTR", "not a STREAM"}, + {100, "EPROTO", "protocol error"}, + {101, "ETIME", "STREAM ioctl timeout"}, + {102, "EOPNOTSUPP", "operation not supported on socket"}, + {103, "ENOPOLICY", "policy not found"}, + {104, "ENOTRECOVERABLE", "state not recoverable"}, + {105, "EOWNERDEAD", "previous owner died"}, + {106, "EQFULL", "interface output queue is full"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/BPT trap"}, + {6, "SIGABRT", "abort trap"}, + {7, "SIGEMT", "EMT trap"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGBUS", "bus error"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGSYS", "bad system call"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGURG", "urgent I/O condition"}, + {17, "SIGSTOP", "suspended (signal)"}, + {18, "SIGTSTP", "suspended"}, + {19, "SIGCONT", "continued"}, + {20, "SIGCHLD", "child exited"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGIO", "I/O possible"}, + {24, "SIGXCPU", "cputime limit exceeded"}, + {25, "SIGXFSZ", "filesize limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window size changes"}, + {29, "SIGINFO", "information request"}, + {30, "SIGUSR1", "user defined signal 1"}, + {31, "SIGUSR2", "user defined signal 2"}, +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_darwin_arm.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_darwin_arm.go new file mode 100644 index 00000000..7a977770 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_darwin_arm.go @@ -0,0 +1,1783 @@ +// mkerrors.sh +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm,darwin + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1c + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x25 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x1e + AF_IPX = 0x17 + AF_ISDN = 0x1c + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x28 + AF_NATM = 0x1f + AF_NDRV = 0x1b + AF_NETBIOS = 0x21 + AF_NS = 0x6 + AF_OSI = 0x7 + AF_PPP = 0x22 + AF_PUP = 0x4 + AF_RESERVED_36 = 0x24 + AF_ROUTE = 0x11 + AF_SIP = 0x18 + AF_SNA = 0xb + AF_SYSTEM = 0x20 + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_UTUN = 0x26 + ALTWERASE = 0x200 + ATTR_BIT_MAP_COUNT = 0x5 + ATTR_CMN_ACCESSMASK = 0x20000 + ATTR_CMN_ACCTIME = 0x1000 + ATTR_CMN_ADDEDTIME = 0x10000000 + ATTR_CMN_BKUPTIME = 0x2000 + ATTR_CMN_CHGTIME = 0x800 + ATTR_CMN_CRTIME = 0x200 + ATTR_CMN_DATA_PROTECT_FLAGS = 0x40000000 + ATTR_CMN_DEVID = 0x2 + ATTR_CMN_DOCUMENT_ID = 0x100000 + ATTR_CMN_ERROR = 0x20000000 + ATTR_CMN_EXTENDED_SECURITY = 0x400000 + ATTR_CMN_FILEID = 0x2000000 + ATTR_CMN_FLAGS = 0x40000 + ATTR_CMN_FNDRINFO = 0x4000 + ATTR_CMN_FSID = 0x4 + ATTR_CMN_FULLPATH = 0x8000000 + ATTR_CMN_GEN_COUNT = 0x80000 + ATTR_CMN_GRPID = 0x10000 + ATTR_CMN_GRPUUID = 0x1000000 + ATTR_CMN_MODTIME = 0x400 + ATTR_CMN_NAME = 0x1 + ATTR_CMN_NAMEDATTRCOUNT = 0x80000 + ATTR_CMN_NAMEDATTRLIST = 0x100000 + ATTR_CMN_OBJID = 0x20 + ATTR_CMN_OBJPERMANENTID = 0x40 + ATTR_CMN_OBJTAG = 0x10 + ATTR_CMN_OBJTYPE = 0x8 + ATTR_CMN_OWNERID = 0x8000 + ATTR_CMN_PARENTID = 0x4000000 + ATTR_CMN_PAROBJID = 0x80 + ATTR_CMN_RETURNED_ATTRS = 0x80000000 + ATTR_CMN_SCRIPT = 0x100 + ATTR_CMN_SETMASK = 0x41c7ff00 + ATTR_CMN_USERACCESS = 0x200000 + ATTR_CMN_UUID = 0x800000 + ATTR_CMN_VALIDMASK = 0xffffffff + ATTR_CMN_VOLSETMASK = 0x6700 + ATTR_FILE_ALLOCSIZE = 0x4 + ATTR_FILE_CLUMPSIZE = 0x10 + ATTR_FILE_DATAALLOCSIZE = 0x400 + ATTR_FILE_DATAEXTENTS = 0x800 + ATTR_FILE_DATALENGTH = 0x200 + ATTR_FILE_DEVTYPE = 0x20 + ATTR_FILE_FILETYPE = 0x40 + ATTR_FILE_FORKCOUNT = 0x80 + ATTR_FILE_FORKLIST = 0x100 + ATTR_FILE_IOBLOCKSIZE = 0x8 + ATTR_FILE_LINKCOUNT = 0x1 + ATTR_FILE_RSRCALLOCSIZE = 0x2000 + ATTR_FILE_RSRCEXTENTS = 0x4000 + ATTR_FILE_RSRCLENGTH = 0x1000 + ATTR_FILE_SETMASK = 0x20 + ATTR_FILE_TOTALSIZE = 0x2 + ATTR_FILE_VALIDMASK = 0x37ff + ATTR_VOL_ALLOCATIONCLUMP = 0x40 + ATTR_VOL_ATTRIBUTES = 0x40000000 + ATTR_VOL_CAPABILITIES = 0x20000 + ATTR_VOL_DIRCOUNT = 0x400 + ATTR_VOL_ENCODINGSUSED = 0x10000 + ATTR_VOL_FILECOUNT = 0x200 + ATTR_VOL_FSTYPE = 0x1 + ATTR_VOL_INFO = 0x80000000 + ATTR_VOL_IOBLOCKSIZE = 0x80 + ATTR_VOL_MAXOBJCOUNT = 0x800 + ATTR_VOL_MINALLOCATION = 0x20 + ATTR_VOL_MOUNTEDDEVICE = 0x8000 + ATTR_VOL_MOUNTFLAGS = 0x4000 + ATTR_VOL_MOUNTPOINT = 0x1000 + ATTR_VOL_NAME = 0x2000 + ATTR_VOL_OBJCOUNT = 0x100 + ATTR_VOL_QUOTA_SIZE = 0x10000000 + ATTR_VOL_RESERVED_SIZE = 0x20000000 + ATTR_VOL_SETMASK = 0x80002000 + ATTR_VOL_SIGNATURE = 0x2 + ATTR_VOL_SIZE = 0x4 + ATTR_VOL_SPACEAVAIL = 0x10 + ATTR_VOL_SPACEFREE = 0x8 + ATTR_VOL_UUID = 0x40000 + ATTR_VOL_VALIDMASK = 0xf007ffff + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B9600 = 0x2580 + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc00c4279 + BIOCGETIF = 0x4020426b + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044272 + BIOCGRTIMEOUT = 0x4010426e + BIOCGSEESENT = 0x40044276 + BIOCGSTATS = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDLT = 0x80044278 + BIOCSETF = 0x80104267 + BIOCSETFNR = 0x8010427e + BIOCSETIF = 0x8020426c + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044273 + BIOCSRTIMEOUT = 0x8010426d + BIOCSSEESENT = 0x80044277 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x80000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x8000 + BSDLY = 0x8000 + CFLUSH = 0xf + CLOCAL = 0x8000 + CLOCK_MONOTONIC = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_MONOTONIC_RAW_APPROX = 0x5 + CLOCK_PROCESS_CPUTIME_ID = 0xc + CLOCK_REALTIME = 0x0 + CLOCK_THREAD_CPUTIME_ID = 0x10 + CLOCK_UPTIME_RAW = 0x8 + CLOCK_UPTIME_RAW_APPROX = 0x9 + CR0 = 0x0 + CR1 = 0x1000 + CR2 = 0x2000 + CR3 = 0x3000 + CRDLY = 0x3000 + CREAD = 0x800 + CRTSCTS = 0x30000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_HW = 0x6 + CTL_KERN = 0x1 + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CHDLC = 0x68 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DBUS = 0xe7 + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_DVB_CI = 0xeb + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_HHDLC = 0x79 + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NOFCS = 0xe6 + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_IPFILTER = 0x74 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPNET = 0xe2 + DLT_IPOIB = 0xf2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_ATM_CEMIC = 0xee + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FIBRECHANNEL = 0xea + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_SRX_E2E = 0xe9 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_JUNIPER_VS = 0xe8 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_PPP_WITHDIRECTION = 0xa6 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MATCHING_MAX = 0xf5 + DLT_MATCHING_MIN = 0x68 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPEG_2_TS = 0xf3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_MUX27010 = 0xec + DLT_NETANALYZER = 0xf0 + DLT_NETANALYZER_TRANSPARENT = 0xf1 + DLT_NFC_LLCP = 0xf5 + DLT_NFLOG = 0xef + DLT_NG40 = 0xf4 + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PPP_WITH_DIRECTION = 0xa6 + DLT_PRISM_HEADER = 0x77 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RIO = 0x7c + DLT_SCCP = 0x8e + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DLT_STANAG_5066_D_PDU = 0xed + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_USER0 = 0x93 + DLT_USER1 = 0x94 + DLT_USER10 = 0x9d + DLT_USER11 = 0x9e + DLT_USER12 = 0x9f + DLT_USER13 = 0xa0 + DLT_USER14 = 0xa1 + DLT_USER15 = 0xa2 + DLT_USER2 = 0x95 + DLT_USER3 = 0x96 + DLT_USER4 = 0x97 + DLT_USER5 = 0x98 + DLT_USER6 = 0x99 + DLT_USER7 = 0x9a + DLT_USER8 = 0x9b + DLT_USER9 = 0x9c + DLT_WIHART = 0xdf + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EVFILT_AIO = -0x3 + EVFILT_EXCEPT = -0xf + EVFILT_FS = -0x9 + EVFILT_MACHPORT = -0x8 + EVFILT_PROC = -0x5 + EVFILT_READ = -0x1 + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0xf + EVFILT_THREADMARKER = 0xf + EVFILT_TIMER = -0x7 + EVFILT_USER = -0xa + EVFILT_VM = -0xc + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_DISPATCH = 0x80 + EV_DISPATCH2 = 0x180 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG0 = 0x1000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_OOBAND = 0x2000 + EV_POLL = 0x1000 + EV_RECEIPT = 0x40 + EV_SYSFLAGS = 0xf000 + EV_UDATA_SPECIFIC = 0x100 + EV_VANISHED = 0x200 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x4000 + FFDLY = 0x4000 + FLUSHO = 0x800000 + FSOPT_ATTR_CMN_EXTENDED = 0x20 + FSOPT_NOFOLLOW = 0x1 + FSOPT_NOINMEMUPDATE = 0x2 + FSOPT_PACK_INVAL_ATTRS = 0x8 + FSOPT_REPORT_FULLSIZE = 0x4 + F_ADDFILESIGS = 0x3d + F_ADDFILESIGS_FOR_DYLD_SIM = 0x53 + F_ADDFILESIGS_RETURN = 0x61 + F_ADDSIGS = 0x3b + F_ALLOCATEALL = 0x4 + F_ALLOCATECONTIG = 0x2 + F_BARRIERFSYNC = 0x55 + F_CHECK_LV = 0x62 + F_CHKCLEAN = 0x29 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x43 + F_FINDSIGS = 0x4e + F_FLUSH_DATA = 0x28 + F_FREEZE_FS = 0x35 + F_FULLFSYNC = 0x33 + F_GETCODEDIR = 0x48 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETLKPID = 0x42 + F_GETNOSIGPIPE = 0x4a + F_GETOWN = 0x5 + F_GETPATH = 0x32 + F_GETPATH_MTMINFO = 0x47 + F_GETPROTECTIONCLASS = 0x3f + F_GETPROTECTIONLEVEL = 0x4d + F_GLOBAL_NOCACHE = 0x37 + F_LOG2PHYS = 0x31 + F_LOG2PHYS_EXT = 0x41 + F_NOCACHE = 0x30 + F_NODIRECT = 0x3e + F_OK = 0x0 + F_PATHPKG_CHECK = 0x34 + F_PEOFPOSMODE = 0x3 + F_PREALLOCATE = 0x2a + F_PUNCHHOLE = 0x63 + F_RDADVISE = 0x2c + F_RDAHEAD = 0x2d + F_RDLCK = 0x1 + F_SETBACKINGSTORE = 0x46 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETLKWTIMEOUT = 0xa + F_SETNOSIGPIPE = 0x49 + F_SETOWN = 0x6 + F_SETPROTECTIONCLASS = 0x40 + F_SETSIZE = 0x2b + F_SINGLE_WRITER = 0x4c + F_THAW_FS = 0x36 + F_TRANSCODEKEY = 0x4b + F_TRIM_ACTIVE_FILE = 0x64 + F_UNLCK = 0x2 + F_VOLPOSMODE = 0x4 + F_WRLCK = 0x3 + HUPCL = 0x4000 + HW_MACHINE = 0x1 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFF_ALLMULTI = 0x200 + IFF_ALTPHYS = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NOTRAILERS = 0x20 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_AAL5 = 0x31 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ATM = 0x25 + IFT_BRIDGE = 0xd1 + IFT_CARP = 0xf8 + IFT_CELLULAR = 0xff + IFT_CEPT = 0x13 + IFT_DS3 = 0x1e + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_ETHER = 0x6 + IFT_FAITH = 0x38 + IFT_FDDI = 0xf + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_GIF = 0x37 + IFT_HDH1822 = 0x3 + IFT_HIPPI = 0x2f + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IEEE1394 = 0x90 + IFT_IEEE8023ADLAG = 0x88 + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88026 = 0xa + IFT_L2VLAN = 0x87 + IFT_LAPB = 0x10 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_NSIP = 0x1b + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PDP = 0xff + IFT_PFLOG = 0xf5 + IFT_PFSYNC = 0xf6 + IFT_PKTAP = 0xfe + IFT_PPP = 0x17 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PTPSERIAL = 0x16 + IFT_RS232 = 0x21 + IFT_SDLC = 0x11 + IFT_SIP = 0x1f + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_STARLAN = 0xb + IFT_STF = 0x39 + IFT_T1 = 0x12 + IFT_ULTRA = 0x1d + IFT_V35 = 0x2d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LINKLOCALNETNUM = 0xa9fe0000 + IN_LOOPBACKNET = 0x7f + IPPROTO_3PC = 0x22 + IPPROTO_ADFS = 0x44 + IPPROTO_AH = 0x33 + IPPROTO_AHIP = 0x3d + IPPROTO_APES = 0x63 + IPPROTO_ARGUS = 0xd + IPPROTO_AX25 = 0x5d + IPPROTO_BHA = 0x31 + IPPROTO_BLT = 0x1e + IPPROTO_BRSATMON = 0x4c + IPPROTO_CFTP = 0x3e + IPPROTO_CHAOS = 0x10 + IPPROTO_CMTP = 0x26 + IPPROTO_CPHB = 0x49 + IPPROTO_CPNX = 0x48 + IPPROTO_DDP = 0x25 + IPPROTO_DGP = 0x56 + IPPROTO_DIVERT = 0xfe + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_EMCON = 0xe + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GMTP = 0x64 + IPPROTO_GRE = 0x2f + IPPROTO_HELLO = 0x3f + IPPROTO_HMP = 0x14 + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IDPR = 0x23 + IPPROTO_IDRP = 0x2d + IPPROTO_IGMP = 0x2 + IPPROTO_IGP = 0x55 + IPPROTO_IGRP = 0x58 + IPPROTO_IL = 0x28 + IPPROTO_INLSP = 0x34 + IPPROTO_INP = 0x20 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPCV = 0x47 + IPPROTO_IPEIP = 0x5e + IPPROTO_IPIP = 0x4 + IPPROTO_IPPC = 0x43 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IRTP = 0x1c + IPPROTO_KRYPTOLAN = 0x41 + IPPROTO_LARP = 0x5b + IPPROTO_LEAF1 = 0x19 + IPPROTO_LEAF2 = 0x1a + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x34 + IPPROTO_MEAS = 0x13 + IPPROTO_MHRP = 0x30 + IPPROTO_MICP = 0x5f + IPPROTO_MTP = 0x5c + IPPROTO_MUX = 0x12 + IPPROTO_ND = 0x4d + IPPROTO_NHRP = 0x36 + IPPROTO_NONE = 0x3b + IPPROTO_NSP = 0x1f + IPPROTO_NVPII = 0xb + IPPROTO_OSPFIGP = 0x59 + IPPROTO_PGM = 0x71 + IPPROTO_PIGP = 0x9 + IPPROTO_PIM = 0x67 + IPPROTO_PRM = 0x15 + IPPROTO_PUP = 0xc + IPPROTO_PVP = 0x4b + IPPROTO_RAW = 0xff + IPPROTO_RCCMON = 0xa + IPPROTO_RDP = 0x1b + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_RVD = 0x42 + IPPROTO_SATEXPAK = 0x40 + IPPROTO_SATMON = 0x45 + IPPROTO_SCCSP = 0x60 + IPPROTO_SCTP = 0x84 + IPPROTO_SDRP = 0x2a + IPPROTO_SEP = 0x21 + IPPROTO_SRPC = 0x5a + IPPROTO_ST = 0x7 + IPPROTO_SVMTP = 0x52 + IPPROTO_SWIPE = 0x35 + IPPROTO_TCF = 0x57 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_TPXX = 0x27 + IPPROTO_TRUNK1 = 0x17 + IPPROTO_TRUNK2 = 0x18 + IPPROTO_TTP = 0x54 + IPPROTO_UDP = 0x11 + IPPROTO_VINES = 0x53 + IPPROTO_VISA = 0x46 + IPPROTO_VMTP = 0x51 + IPPROTO_WBEXPAK = 0x4f + IPPROTO_WBMON = 0x4e + IPPROTO_WSN = 0x4a + IPPROTO_XNET = 0xf + IPPROTO_XTP = 0x24 + IPV6_2292DSTOPTS = 0x17 + IPV6_2292HOPLIMIT = 0x14 + IPV6_2292HOPOPTS = 0x16 + IPV6_2292NEXTHOP = 0x15 + IPV6_2292PKTINFO = 0x13 + IPV6_2292PKTOPTIONS = 0x19 + IPV6_2292RTHDR = 0x18 + IPV6_BINDV6ONLY = 0x1b + IPV6_BOUND_IF = 0x7d + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FLOW_ECN_MASK = 0x300 + IPV6_FRAGTTL = 0x3c + IPV6_FW_ADD = 0x1e + IPV6_FW_DEL = 0x1f + IPV6_FW_FLUSH = 0x20 + IPV6_FW_GET = 0x22 + IPV6_FW_ZERO = 0x21 + IPV6_HLIMDEC = 0x1 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXOPTHDR = 0x800 + IPV6_MAXPACKET = 0xffff + IPV6_MAX_GROUP_SRC_FILTER = 0x200 + IPV6_MAX_MEMBERSHIPS = 0xfff + IPV6_MAX_SOCK_SRC_FILTER = 0x80 + IPV6_MIN_MEMBERSHIPS = 0x1f + IPV6_MMTU = 0x500 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_RECVTCLASS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x24 + IPV6_UNICAST_HOPS = 0x4 + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_ADD_SOURCE_MEMBERSHIP = 0x46 + IP_BLOCK_SOURCE = 0x48 + IP_BOUND_IF = 0x19 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0xd + IP_DROP_SOURCE_MEMBERSHIP = 0x47 + IP_DUMMYNET_CONFIGURE = 0x3c + IP_DUMMYNET_DEL = 0x3d + IP_DUMMYNET_FLUSH = 0x3e + IP_DUMMYNET_GET = 0x40 + IP_FAITH = 0x16 + IP_FW_ADD = 0x28 + IP_FW_DEL = 0x29 + IP_FW_FLUSH = 0x2a + IP_FW_GET = 0x2c + IP_FW_RESETLOG = 0x2d + IP_FW_ZERO = 0x2b + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x15 + IP_MAXPACKET = 0xffff + IP_MAX_GROUP_SRC_FILTER = 0x200 + IP_MAX_MEMBERSHIPS = 0xfff + IP_MAX_SOCK_MUTE_FILTER = 0x80 + IP_MAX_SOCK_SRC_FILTER = 0x80 + IP_MF = 0x2000 + IP_MIN_MEMBERSHIPS = 0x1f + IP_MSFILTER = 0x4a + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_IFINDEX = 0x42 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_MULTICAST_VIF = 0xe + IP_NAT__XXX = 0x37 + IP_OFFMASK = 0x1fff + IP_OLD_FW_ADD = 0x32 + IP_OLD_FW_DEL = 0x33 + IP_OLD_FW_FLUSH = 0x34 + IP_OLD_FW_GET = 0x36 + IP_OLD_FW_RESETLOG = 0x38 + IP_OLD_FW_ZERO = 0x35 + IP_OPTIONS = 0x1 + IP_PKTINFO = 0x1a + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVPKTINFO = 0x1a + IP_RECVRETOPTS = 0x6 + IP_RECVTOS = 0x1b + IP_RECVTTL = 0x18 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RSVP_OFF = 0x10 + IP_RSVP_ON = 0xf + IP_RSVP_VIF_OFF = 0x12 + IP_RSVP_VIF_ON = 0x11 + IP_STRIPHDR = 0x17 + IP_TOS = 0x3 + IP_TRAFFIC_MGT_BACKGROUND = 0x41 + IP_TTL = 0x4 + IP_UNBLOCK_SOURCE = 0x49 + ISIG = 0x80 + ISTRIP = 0x20 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + KERN_HOSTNAME = 0xa + KERN_OSRELEASE = 0x2 + KERN_OSTYPE = 0x1 + KERN_VERSION = 0x4 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_CAN_REUSE = 0x9 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x5 + MADV_FREE_REUSABLE = 0x7 + MADV_FREE_REUSE = 0x8 + MADV_NORMAL = 0x0 + MADV_PAGEOUT = 0xa + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_WILLNEED = 0x3 + MADV_ZERO_WIRED_PAGES = 0x6 + MAP_ANON = 0x1000 + MAP_ANONYMOUS = 0x1000 + MAP_COPY = 0x2 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_JIT = 0x800 + MAP_NOCACHE = 0x400 + MAP_NOEXTEND = 0x100 + MAP_NORESERVE = 0x40 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_RESERVED0080 = 0x80 + MAP_RESILIENT_CODESIGN = 0x2000 + MAP_RESILIENT_MEDIA = 0x4000 + MAP_SHARED = 0x1 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MNT_ASYNC = 0x40 + MNT_AUTOMOUNTED = 0x400000 + MNT_CMDFLAGS = 0xf0000 + MNT_CPROTECT = 0x80 + MNT_DEFWRITE = 0x2000000 + MNT_DONTBROWSE = 0x100000 + MNT_DOVOLFS = 0x8000 + MNT_DWAIT = 0x4 + MNT_EXPORTED = 0x100 + MNT_FORCE = 0x80000 + MNT_IGNORE_OWNERSHIP = 0x200000 + MNT_JOURNALED = 0x800000 + MNT_LOCAL = 0x1000 + MNT_MULTILABEL = 0x4000000 + MNT_NOATIME = 0x10000000 + MNT_NOBLOCK = 0x20000 + MNT_NODEV = 0x10 + MNT_NOEXEC = 0x4 + MNT_NOSUID = 0x8 + MNT_NOUSERXATTR = 0x1000000 + MNT_NOWAIT = 0x2 + MNT_QUARANTINE = 0x400 + MNT_QUOTA = 0x2000 + MNT_RDONLY = 0x1 + MNT_RELOAD = 0x40000 + MNT_ROOTFS = 0x4000 + MNT_SYNCHRONOUS = 0x2 + MNT_UNION = 0x20 + MNT_UNKNOWNPERMISSIONS = 0x200000 + MNT_UPDATE = 0x10000 + MNT_VISFLAGMASK = 0x17f0f5ff + MNT_WAIT = 0x1 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOF = 0x100 + MSG_EOR = 0x8 + MSG_FLUSH = 0x400 + MSG_HAVEMORE = 0x2000 + MSG_HOLD = 0x800 + MSG_NEEDSA = 0x10000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_RCVMORE = 0x4000 + MSG_SEND = 0x1000 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MSG_WAITSTREAM = 0x200 + MS_ASYNC = 0x1 + MS_DEACTIVATE = 0x8 + MS_INVALIDATE = 0x2 + MS_KILLPAGES = 0x4 + MS_SYNC = 0x10 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_DUMP2 = 0x7 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_IFLIST2 = 0x6 + NET_RT_MAXID = 0xa + NET_RT_STAT = 0x4 + NET_RT_TRASH = 0x5 + NL0 = 0x0 + NL1 = 0x100 + NL2 = 0x200 + NL3 = 0x300 + NLDLY = 0x300 + NOFLSH = 0x80000000 + NOKERNINFO = 0x2000000 + NOTE_ABSOLUTE = 0x8 + NOTE_ATTRIB = 0x8 + NOTE_BACKGROUND = 0x40 + NOTE_CHILD = 0x4 + NOTE_CRITICAL = 0x20 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXITSTATUS = 0x4000000 + NOTE_EXIT_CSERROR = 0x40000 + NOTE_EXIT_DECRYPTFAIL = 0x10000 + NOTE_EXIT_DETAIL = 0x2000000 + NOTE_EXIT_DETAIL_MASK = 0x70000 + NOTE_EXIT_MEMORY = 0x20000 + NOTE_EXIT_REPARENTED = 0x80000 + NOTE_EXTEND = 0x4 + NOTE_FFAND = 0x40000000 + NOTE_FFCOPY = 0xc0000000 + NOTE_FFCTRLMASK = 0xc0000000 + NOTE_FFLAGSMASK = 0xffffff + NOTE_FFNOP = 0x0 + NOTE_FFOR = 0x80000000 + NOTE_FORK = 0x40000000 + NOTE_FUNLOCK = 0x100 + NOTE_LEEWAY = 0x10 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_MACH_CONTINUOUS_TIME = 0x80 + NOTE_NONE = 0x80 + NOTE_NSECONDS = 0x4 + NOTE_OOB = 0x2 + NOTE_PCTRLMASK = -0x100000 + NOTE_PDATAMASK = 0xfffff + NOTE_REAP = 0x10000000 + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_SECONDS = 0x1 + NOTE_SIGNAL = 0x8000000 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRIGGER = 0x1000000 + NOTE_USECONDS = 0x2 + NOTE_VM_ERROR = 0x10000000 + NOTE_VM_PRESSURE = 0x80000000 + NOTE_VM_PRESSURE_SUDDEN_TERMINATE = 0x20000000 + NOTE_VM_PRESSURE_TERMINATE = 0x40000000 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + OFDEL = 0x20000 + OFILL = 0x80 + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + OXTABS = 0x4 + O_ACCMODE = 0x3 + O_ALERT = 0x20000000 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x1000000 + O_CREAT = 0x200 + O_DIRECTORY = 0x100000 + O_DP_GETRAWENCRYPTED = 0x1 + O_DP_GETRAWUNENCRYPTED = 0x2 + O_DSYNC = 0x400000 + O_EVTONLY = 0x8000 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x20000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_POPUP = 0x80000000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_SHLOCK = 0x10 + O_SYMLINK = 0x200000 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PT_ATTACH = 0xa + PT_ATTACHEXC = 0xe + PT_CONTINUE = 0x7 + PT_DENY_ATTACH = 0x1f + PT_DETACH = 0xb + PT_FIRSTMACH = 0x20 + PT_FORCEQUOTA = 0x1e + PT_KILL = 0x8 + PT_READ_D = 0x2 + PT_READ_I = 0x1 + PT_READ_U = 0x3 + PT_SIGEXC = 0xc + PT_STEP = 0x9 + PT_THUPDATE = 0xd + PT_TRACE_ME = 0x0 + PT_WRITE_D = 0x5 + PT_WRITE_I = 0x4 + PT_WRITE_U = 0x6 + RLIMIT_AS = 0x5 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_CPU_USAGE_MONITOR = 0x2 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_MEMLOCK = 0x6 + RLIMIT_NOFILE = 0x8 + RLIMIT_NPROC = 0x7 + RLIMIT_RSS = 0x5 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x8 + RTAX_NETMASK = 0x2 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_CLONING = 0x100 + RTF_CONDEMNED = 0x2000000 + RTF_DELCLONE = 0x80 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_IFREF = 0x4000000 + RTF_IFSCOPE = 0x1000000 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MODIFIED = 0x20 + RTF_MULTICAST = 0x800000 + RTF_NOIFREF = 0x2000 + RTF_PINNED = 0x100000 + RTF_PRCLONING = 0x10000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x40000 + RTF_PROXY = 0x8000000 + RTF_REJECT = 0x8 + RTF_ROUTER = 0x10000000 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_WASCLONED = 0x20000 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DELMADDR = 0x10 + RTM_GET = 0x4 + RTM_GET2 = 0x14 + RTM_IFINFO = 0xe + RTM_IFINFO2 = 0x12 + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_NEWMADDR = 0xf + RTM_NEWMADDR2 = 0x13 + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + SCM_CREDS = 0x3 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x2 + SCM_TIMESTAMP_MONOTONIC = 0x4 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCAIFADDR = 0x8040691a + SIOCARPIPLL = 0xc0206928 + SIOCATMARK = 0x40047307 + SIOCAUTOADDR = 0xc0206926 + SIOCAUTONETMASK = 0x80206927 + SIOCDELMULTI = 0x80206932 + SIOCDIFADDR = 0x80206919 + SIOCDIFPHYADDR = 0x80206941 + SIOCGDRVSPEC = 0xc028697b + SIOCGETVLAN = 0xc020697f + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0206921 + SIOCGIFALTMTU = 0xc0206948 + SIOCGIFASYNCMAP = 0xc020697c + SIOCGIFBOND = 0xc0206947 + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCAP = 0xc020695b + SIOCGIFCONF = 0xc00c6924 + SIOCGIFDEVMTU = 0xc0206944 + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGENERIC = 0xc020693a + SIOCGIFKPI = 0xc0206987 + SIOCGIFMAC = 0xc0206982 + SIOCGIFMEDIA = 0xc02c6938 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc0206933 + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206940 + SIOCGIFPHYS = 0xc0206935 + SIOCGIFPSRCADDR = 0xc020693f + SIOCGIFSTATUS = 0xc331693d + SIOCGIFVLAN = 0xc020697f + SIOCGIFWAKEFLAGS = 0xc0206988 + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCIFCREATE = 0xc0206978 + SIOCIFCREATE2 = 0xc020697a + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc0106981 + SIOCRSLVMULTI = 0xc010693b + SIOCSDRVSPEC = 0x8028697b + SIOCSETVLAN = 0x8020697e + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFALTMTU = 0x80206945 + SIOCSIFASYNCMAP = 0x8020697d + SIOCSIFBOND = 0x80206946 + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFCAP = 0x8020695a + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGENERIC = 0x80206939 + SIOCSIFKPI = 0x80206986 + SIOCSIFLLADDR = 0x8020693c + SIOCSIFMAC = 0x80206983 + SIOCSIFMEDIA = 0xc0206937 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x80206934 + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x8040693e + SIOCSIFPHYS = 0x80206936 + SIOCSIFVLAN = 0x8020697e + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SOCK_DGRAM = 0x2 + SOCK_MAXADDRLEN = 0xff + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_DONTTRUNC = 0x2000 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LABEL = 0x1010 + SO_LINGER = 0x80 + SO_LINGER_SEC = 0x1080 + SO_NETSVC_MARKING_LEVEL = 0x1119 + SO_NET_SERVICE_TYPE = 0x1116 + SO_NKE = 0x1021 + SO_NOADDRERR = 0x1023 + SO_NOSIGPIPE = 0x1022 + SO_NOTIFYCONFLICT = 0x1026 + SO_NP_EXTENSIONS = 0x1083 + SO_NREAD = 0x1020 + SO_NUMRCVPKT = 0x1112 + SO_NWRITE = 0x1024 + SO_OOBINLINE = 0x100 + SO_PEERLABEL = 0x1011 + SO_RANDOMPORT = 0x1082 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_REUSESHAREUID = 0x1025 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_TIMESTAMP = 0x400 + SO_TIMESTAMP_MONOTONIC = 0x800 + SO_TYPE = 0x1008 + SO_UPCALLCLOSEWAIT = 0x1027 + SO_USELOOPBACK = 0x40 + SO_WANTMORE = 0x4000 + SO_WANTOOBFLAG = 0x8000 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IFWHT = 0xe000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISTXT = 0x200 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x400 + TAB2 = 0x800 + TAB3 = 0x4 + TABDLY = 0xc04 + TCIFLUSH = 0x1 + TCIOFF = 0x3 + TCIOFLUSH = 0x3 + TCION = 0x4 + TCOFLUSH = 0x2 + TCOOFF = 0x1 + TCOON = 0x2 + TCP_CONNECTIONTIMEOUT = 0x20 + TCP_CONNECTION_INFO = 0x106 + TCP_ENABLE_ECN = 0x104 + TCP_FASTOPEN = 0x105 + TCP_KEEPALIVE = 0x10 + TCP_KEEPCNT = 0x102 + TCP_KEEPINTVL = 0x101 + TCP_MAXHLEN = 0x3c + TCP_MAXOLEN = 0x28 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x4 + TCP_MAX_WINSHIFT = 0xe + TCP_MINMSS = 0xd8 + TCP_MSS = 0x200 + TCP_NODELAY = 0x1 + TCP_NOOPT = 0x8 + TCP_NOPUSH = 0x4 + TCP_NOTSENT_LOWAT = 0x201 + TCP_RXT_CONNDROPTIME = 0x80 + TCP_RXT_FINDROP = 0x100 + TCP_SENDMOREACKS = 0x103 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDCDTIMESTAMP = 0x40107458 + TIOCDRAIN = 0x2000745e + TIOCDSIMICROCODE = 0x20007455 + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLUSH = 0x80047410 + TIOCGDRAINWAIT = 0x40047456 + TIOCGETA = 0x40487413 + TIOCGETD = 0x4004741a + TIOCGPGRP = 0x40047477 + TIOCGWINSZ = 0x40087468 + TIOCIXOFF = 0x20007480 + TIOCIXON = 0x20007481 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGDTRWAIT = 0x4004745a + TIOCMGET = 0x4004746a + TIOCMODG = 0x40047403 + TIOCMODS = 0x80047404 + TIOCMSDTRWAIT = 0x8004745b + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCPTYGNAME = 0x40807453 + TIOCPTYGRANT = 0x20007454 + TIOCPTYUNLK = 0x20007452 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCONS = 0x20007463 + TIOCSCTTY = 0x20007461 + TIOCSDRAINWAIT = 0x80047457 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x80487414 + TIOCSETAF = 0x80487416 + TIOCSETAW = 0x80487415 + TIOCSETD = 0x8004741b + TIOCSIG = 0x2000745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x20007465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCTIMESTAMP = 0x40107459 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VM_LOADAVG = 0x2 + VM_MACHFACTOR = 0x4 + VM_MAXID = 0x6 + VM_METER = 0x1 + VM_SWAPUSAGE = 0x5 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VT0 = 0x0 + VT1 = 0x10000 + VTDLY = 0x10000 + VTIME = 0x11 + VWERASE = 0x4 + WCONTINUED = 0x10 + WCOREFLAG = 0x80 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOWAIT = 0x20 + WORDSIZE = 0x40 + WSTOPPED = 0x8 + WUNTRACED = 0x2 + XATTR_CREATE = 0x2 + XATTR_NODEFAULT = 0x10 + XATTR_NOFOLLOW = 0x1 + XATTR_NOSECURITY = 0x8 + XATTR_REPLACE = 0x4 + XATTR_SHOWCOMPRESSION = 0x20 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADARCH = syscall.Errno(0x56) + EBADEXEC = syscall.Errno(0x55) + EBADF = syscall.Errno(0x9) + EBADMACHO = syscall.Errno(0x58) + EBADMSG = syscall.Errno(0x5e) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x59) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDEVERR = syscall.Errno(0x53) + EDOM = syscall.Errno(0x21) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x5a) + EILSEQ = syscall.Errno(0x5c) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x6a) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5f) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x5d) + ENOBUFS = syscall.Errno(0x37) + ENODATA = syscall.Errno(0x60) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x61) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x5b) + ENOPOLICY = syscall.Errno(0x67) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x62) + ENOSTR = syscall.Errno(0x63) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTRECOVERABLE = syscall.Errno(0x68) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x2d) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x66) + EOVERFLOW = syscall.Errno(0x54) + EOWNERDEAD = syscall.Errno(0x69) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTO = syscall.Errno(0x64) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + EPWROFF = syscall.Errno(0x52) + EQFULL = syscall.Errno(0x6a) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHLIBVERS = syscall.Errno(0x57) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIME = syscall.Errno(0x65) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "device not configured"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EDEADLK", "resource deadlock avoided"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "resource busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "cross-device link"}, + {19, "ENODEV", "operation not supported by device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "result too large"}, + {35, "EAGAIN", "resource temporarily unavailable"}, + {36, "EINPROGRESS", "operation now in progress"}, + {37, "EALREADY", "operation already in progress"}, + {38, "ENOTSOCK", "socket operation on non-socket"}, + {39, "EDESTADDRREQ", "destination address required"}, + {40, "EMSGSIZE", "message too long"}, + {41, "EPROTOTYPE", "protocol wrong type for socket"}, + {42, "ENOPROTOOPT", "protocol not available"}, + {43, "EPROTONOSUPPORT", "protocol not supported"}, + {44, "ESOCKTNOSUPPORT", "socket type not supported"}, + {45, "ENOTSUP", "operation not supported"}, + {46, "EPFNOSUPPORT", "protocol family not supported"}, + {47, "EAFNOSUPPORT", "address family not supported by protocol family"}, + {48, "EADDRINUSE", "address already in use"}, + {49, "EADDRNOTAVAIL", "can't assign requested address"}, + {50, "ENETDOWN", "network is down"}, + {51, "ENETUNREACH", "network is unreachable"}, + {52, "ENETRESET", "network dropped connection on reset"}, + {53, "ECONNABORTED", "software caused connection abort"}, + {54, "ECONNRESET", "connection reset by peer"}, + {55, "ENOBUFS", "no buffer space available"}, + {56, "EISCONN", "socket is already connected"}, + {57, "ENOTCONN", "socket is not connected"}, + {58, "ESHUTDOWN", "can't send after socket shutdown"}, + {59, "ETOOMANYREFS", "too many references: can't splice"}, + {60, "ETIMEDOUT", "operation timed out"}, + {61, "ECONNREFUSED", "connection refused"}, + {62, "ELOOP", "too many levels of symbolic links"}, + {63, "ENAMETOOLONG", "file name too long"}, + {64, "EHOSTDOWN", "host is down"}, + {65, "EHOSTUNREACH", "no route to host"}, + {66, "ENOTEMPTY", "directory not empty"}, + {67, "EPROCLIM", "too many processes"}, + {68, "EUSERS", "too many users"}, + {69, "EDQUOT", "disc quota exceeded"}, + {70, "ESTALE", "stale NFS file handle"}, + {71, "EREMOTE", "too many levels of remote in path"}, + {72, "EBADRPC", "RPC struct is bad"}, + {73, "ERPCMISMATCH", "RPC version wrong"}, + {74, "EPROGUNAVAIL", "RPC prog. not avail"}, + {75, "EPROGMISMATCH", "program version wrong"}, + {76, "EPROCUNAVAIL", "bad procedure for program"}, + {77, "ENOLCK", "no locks available"}, + {78, "ENOSYS", "function not implemented"}, + {79, "EFTYPE", "inappropriate file type or format"}, + {80, "EAUTH", "authentication error"}, + {81, "ENEEDAUTH", "need authenticator"}, + {82, "EPWROFF", "device power is off"}, + {83, "EDEVERR", "device error"}, + {84, "EOVERFLOW", "value too large to be stored in data type"}, + {85, "EBADEXEC", "bad executable (or shared library)"}, + {86, "EBADARCH", "bad CPU type in executable"}, + {87, "ESHLIBVERS", "shared library version mismatch"}, + {88, "EBADMACHO", "malformed Mach-o file"}, + {89, "ECANCELED", "operation canceled"}, + {90, "EIDRM", "identifier removed"}, + {91, "ENOMSG", "no message of desired type"}, + {92, "EILSEQ", "illegal byte sequence"}, + {93, "ENOATTR", "attribute not found"}, + {94, "EBADMSG", "bad message"}, + {95, "EMULTIHOP", "EMULTIHOP (Reserved)"}, + {96, "ENODATA", "no message available on STREAM"}, + {97, "ENOLINK", "ENOLINK (Reserved)"}, + {98, "ENOSR", "no STREAM resources"}, + {99, "ENOSTR", "not a STREAM"}, + {100, "EPROTO", "protocol error"}, + {101, "ETIME", "STREAM ioctl timeout"}, + {102, "EOPNOTSUPP", "operation not supported on socket"}, + {103, "ENOPOLICY", "policy not found"}, + {104, "ENOTRECOVERABLE", "state not recoverable"}, + {105, "EOWNERDEAD", "previous owner died"}, + {106, "EQFULL", "interface output queue is full"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/BPT trap"}, + {6, "SIGABRT", "abort trap"}, + {7, "SIGEMT", "EMT trap"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGBUS", "bus error"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGSYS", "bad system call"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGURG", "urgent I/O condition"}, + {17, "SIGSTOP", "suspended (signal)"}, + {18, "SIGTSTP", "suspended"}, + {19, "SIGCONT", "continued"}, + {20, "SIGCHLD", "child exited"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGIO", "I/O possible"}, + {24, "SIGXCPU", "cputime limit exceeded"}, + {25, "SIGXFSZ", "filesize limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window size changes"}, + {29, "SIGINFO", "information request"}, + {30, "SIGUSR1", "user defined signal 1"}, + {31, "SIGUSR2", "user defined signal 2"}, +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go new file mode 100644 index 00000000..6d56d8a0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go @@ -0,0 +1,1783 @@ +// mkerrors.sh -m64 +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm64,darwin + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m64 _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1c + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x25 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x1e + AF_IPX = 0x17 + AF_ISDN = 0x1c + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x28 + AF_NATM = 0x1f + AF_NDRV = 0x1b + AF_NETBIOS = 0x21 + AF_NS = 0x6 + AF_OSI = 0x7 + AF_PPP = 0x22 + AF_PUP = 0x4 + AF_RESERVED_36 = 0x24 + AF_ROUTE = 0x11 + AF_SIP = 0x18 + AF_SNA = 0xb + AF_SYSTEM = 0x20 + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_UTUN = 0x26 + ALTWERASE = 0x200 + ATTR_BIT_MAP_COUNT = 0x5 + ATTR_CMN_ACCESSMASK = 0x20000 + ATTR_CMN_ACCTIME = 0x1000 + ATTR_CMN_ADDEDTIME = 0x10000000 + ATTR_CMN_BKUPTIME = 0x2000 + ATTR_CMN_CHGTIME = 0x800 + ATTR_CMN_CRTIME = 0x200 + ATTR_CMN_DATA_PROTECT_FLAGS = 0x40000000 + ATTR_CMN_DEVID = 0x2 + ATTR_CMN_DOCUMENT_ID = 0x100000 + ATTR_CMN_ERROR = 0x20000000 + ATTR_CMN_EXTENDED_SECURITY = 0x400000 + ATTR_CMN_FILEID = 0x2000000 + ATTR_CMN_FLAGS = 0x40000 + ATTR_CMN_FNDRINFO = 0x4000 + ATTR_CMN_FSID = 0x4 + ATTR_CMN_FULLPATH = 0x8000000 + ATTR_CMN_GEN_COUNT = 0x80000 + ATTR_CMN_GRPID = 0x10000 + ATTR_CMN_GRPUUID = 0x1000000 + ATTR_CMN_MODTIME = 0x400 + ATTR_CMN_NAME = 0x1 + ATTR_CMN_NAMEDATTRCOUNT = 0x80000 + ATTR_CMN_NAMEDATTRLIST = 0x100000 + ATTR_CMN_OBJID = 0x20 + ATTR_CMN_OBJPERMANENTID = 0x40 + ATTR_CMN_OBJTAG = 0x10 + ATTR_CMN_OBJTYPE = 0x8 + ATTR_CMN_OWNERID = 0x8000 + ATTR_CMN_PARENTID = 0x4000000 + ATTR_CMN_PAROBJID = 0x80 + ATTR_CMN_RETURNED_ATTRS = 0x80000000 + ATTR_CMN_SCRIPT = 0x100 + ATTR_CMN_SETMASK = 0x41c7ff00 + ATTR_CMN_USERACCESS = 0x200000 + ATTR_CMN_UUID = 0x800000 + ATTR_CMN_VALIDMASK = 0xffffffff + ATTR_CMN_VOLSETMASK = 0x6700 + ATTR_FILE_ALLOCSIZE = 0x4 + ATTR_FILE_CLUMPSIZE = 0x10 + ATTR_FILE_DATAALLOCSIZE = 0x400 + ATTR_FILE_DATAEXTENTS = 0x800 + ATTR_FILE_DATALENGTH = 0x200 + ATTR_FILE_DEVTYPE = 0x20 + ATTR_FILE_FILETYPE = 0x40 + ATTR_FILE_FORKCOUNT = 0x80 + ATTR_FILE_FORKLIST = 0x100 + ATTR_FILE_IOBLOCKSIZE = 0x8 + ATTR_FILE_LINKCOUNT = 0x1 + ATTR_FILE_RSRCALLOCSIZE = 0x2000 + ATTR_FILE_RSRCEXTENTS = 0x4000 + ATTR_FILE_RSRCLENGTH = 0x1000 + ATTR_FILE_SETMASK = 0x20 + ATTR_FILE_TOTALSIZE = 0x2 + ATTR_FILE_VALIDMASK = 0x37ff + ATTR_VOL_ALLOCATIONCLUMP = 0x40 + ATTR_VOL_ATTRIBUTES = 0x40000000 + ATTR_VOL_CAPABILITIES = 0x20000 + ATTR_VOL_DIRCOUNT = 0x400 + ATTR_VOL_ENCODINGSUSED = 0x10000 + ATTR_VOL_FILECOUNT = 0x200 + ATTR_VOL_FSTYPE = 0x1 + ATTR_VOL_INFO = 0x80000000 + ATTR_VOL_IOBLOCKSIZE = 0x80 + ATTR_VOL_MAXOBJCOUNT = 0x800 + ATTR_VOL_MINALLOCATION = 0x20 + ATTR_VOL_MOUNTEDDEVICE = 0x8000 + ATTR_VOL_MOUNTFLAGS = 0x4000 + ATTR_VOL_MOUNTPOINT = 0x1000 + ATTR_VOL_NAME = 0x2000 + ATTR_VOL_OBJCOUNT = 0x100 + ATTR_VOL_QUOTA_SIZE = 0x10000000 + ATTR_VOL_RESERVED_SIZE = 0x20000000 + ATTR_VOL_SETMASK = 0x80002000 + ATTR_VOL_SIGNATURE = 0x2 + ATTR_VOL_SIZE = 0x4 + ATTR_VOL_SPACEAVAIL = 0x10 + ATTR_VOL_SPACEFREE = 0x8 + ATTR_VOL_UUID = 0x40000 + ATTR_VOL_VALIDMASK = 0xf007ffff + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B9600 = 0x2580 + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc00c4279 + BIOCGETIF = 0x4020426b + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044272 + BIOCGRTIMEOUT = 0x4010426e + BIOCGSEESENT = 0x40044276 + BIOCGSTATS = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDLT = 0x80044278 + BIOCSETF = 0x80104267 + BIOCSETFNR = 0x8010427e + BIOCSETIF = 0x8020426c + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044273 + BIOCSRTIMEOUT = 0x8010426d + BIOCSSEESENT = 0x80044277 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x80000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x8000 + BSDLY = 0x8000 + CFLUSH = 0xf + CLOCAL = 0x8000 + CLOCK_MONOTONIC = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_MONOTONIC_RAW_APPROX = 0x5 + CLOCK_PROCESS_CPUTIME_ID = 0xc + CLOCK_REALTIME = 0x0 + CLOCK_THREAD_CPUTIME_ID = 0x10 + CLOCK_UPTIME_RAW = 0x8 + CLOCK_UPTIME_RAW_APPROX = 0x9 + CR0 = 0x0 + CR1 = 0x1000 + CR2 = 0x2000 + CR3 = 0x3000 + CRDLY = 0x3000 + CREAD = 0x800 + CRTSCTS = 0x30000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_HW = 0x6 + CTL_KERN = 0x1 + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CHDLC = 0x68 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DBUS = 0xe7 + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_DVB_CI = 0xeb + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_HHDLC = 0x79 + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NOFCS = 0xe6 + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_IPFILTER = 0x74 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPNET = 0xe2 + DLT_IPOIB = 0xf2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_ATM_CEMIC = 0xee + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FIBRECHANNEL = 0xea + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_SRX_E2E = 0xe9 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_JUNIPER_VS = 0xe8 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_PPP_WITHDIRECTION = 0xa6 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MATCHING_MAX = 0xf5 + DLT_MATCHING_MIN = 0x68 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPEG_2_TS = 0xf3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_MUX27010 = 0xec + DLT_NETANALYZER = 0xf0 + DLT_NETANALYZER_TRANSPARENT = 0xf1 + DLT_NFC_LLCP = 0xf5 + DLT_NFLOG = 0xef + DLT_NG40 = 0xf4 + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PPP_WITH_DIRECTION = 0xa6 + DLT_PRISM_HEADER = 0x77 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RIO = 0x7c + DLT_SCCP = 0x8e + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DLT_STANAG_5066_D_PDU = 0xed + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_USER0 = 0x93 + DLT_USER1 = 0x94 + DLT_USER10 = 0x9d + DLT_USER11 = 0x9e + DLT_USER12 = 0x9f + DLT_USER13 = 0xa0 + DLT_USER14 = 0xa1 + DLT_USER15 = 0xa2 + DLT_USER2 = 0x95 + DLT_USER3 = 0x96 + DLT_USER4 = 0x97 + DLT_USER5 = 0x98 + DLT_USER6 = 0x99 + DLT_USER7 = 0x9a + DLT_USER8 = 0x9b + DLT_USER9 = 0x9c + DLT_WIHART = 0xdf + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EVFILT_AIO = -0x3 + EVFILT_EXCEPT = -0xf + EVFILT_FS = -0x9 + EVFILT_MACHPORT = -0x8 + EVFILT_PROC = -0x5 + EVFILT_READ = -0x1 + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0xf + EVFILT_THREADMARKER = 0xf + EVFILT_TIMER = -0x7 + EVFILT_USER = -0xa + EVFILT_VM = -0xc + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_DISPATCH = 0x80 + EV_DISPATCH2 = 0x180 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG0 = 0x1000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_OOBAND = 0x2000 + EV_POLL = 0x1000 + EV_RECEIPT = 0x40 + EV_SYSFLAGS = 0xf000 + EV_UDATA_SPECIFIC = 0x100 + EV_VANISHED = 0x200 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x4000 + FFDLY = 0x4000 + FLUSHO = 0x800000 + FSOPT_ATTR_CMN_EXTENDED = 0x20 + FSOPT_NOFOLLOW = 0x1 + FSOPT_NOINMEMUPDATE = 0x2 + FSOPT_PACK_INVAL_ATTRS = 0x8 + FSOPT_REPORT_FULLSIZE = 0x4 + F_ADDFILESIGS = 0x3d + F_ADDFILESIGS_FOR_DYLD_SIM = 0x53 + F_ADDFILESIGS_RETURN = 0x61 + F_ADDSIGS = 0x3b + F_ALLOCATEALL = 0x4 + F_ALLOCATECONTIG = 0x2 + F_BARRIERFSYNC = 0x55 + F_CHECK_LV = 0x62 + F_CHKCLEAN = 0x29 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x43 + F_FINDSIGS = 0x4e + F_FLUSH_DATA = 0x28 + F_FREEZE_FS = 0x35 + F_FULLFSYNC = 0x33 + F_GETCODEDIR = 0x48 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETLKPID = 0x42 + F_GETNOSIGPIPE = 0x4a + F_GETOWN = 0x5 + F_GETPATH = 0x32 + F_GETPATH_MTMINFO = 0x47 + F_GETPROTECTIONCLASS = 0x3f + F_GETPROTECTIONLEVEL = 0x4d + F_GLOBAL_NOCACHE = 0x37 + F_LOG2PHYS = 0x31 + F_LOG2PHYS_EXT = 0x41 + F_NOCACHE = 0x30 + F_NODIRECT = 0x3e + F_OK = 0x0 + F_PATHPKG_CHECK = 0x34 + F_PEOFPOSMODE = 0x3 + F_PREALLOCATE = 0x2a + F_PUNCHHOLE = 0x63 + F_RDADVISE = 0x2c + F_RDAHEAD = 0x2d + F_RDLCK = 0x1 + F_SETBACKINGSTORE = 0x46 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETLKWTIMEOUT = 0xa + F_SETNOSIGPIPE = 0x49 + F_SETOWN = 0x6 + F_SETPROTECTIONCLASS = 0x40 + F_SETSIZE = 0x2b + F_SINGLE_WRITER = 0x4c + F_THAW_FS = 0x36 + F_TRANSCODEKEY = 0x4b + F_TRIM_ACTIVE_FILE = 0x64 + F_UNLCK = 0x2 + F_VOLPOSMODE = 0x4 + F_WRLCK = 0x3 + HUPCL = 0x4000 + HW_MACHINE = 0x1 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFF_ALLMULTI = 0x200 + IFF_ALTPHYS = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NOTRAILERS = 0x20 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_AAL5 = 0x31 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ATM = 0x25 + IFT_BRIDGE = 0xd1 + IFT_CARP = 0xf8 + IFT_CELLULAR = 0xff + IFT_CEPT = 0x13 + IFT_DS3 = 0x1e + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_ETHER = 0x6 + IFT_FAITH = 0x38 + IFT_FDDI = 0xf + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_GIF = 0x37 + IFT_HDH1822 = 0x3 + IFT_HIPPI = 0x2f + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IEEE1394 = 0x90 + IFT_IEEE8023ADLAG = 0x88 + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88026 = 0xa + IFT_L2VLAN = 0x87 + IFT_LAPB = 0x10 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_NSIP = 0x1b + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PDP = 0xff + IFT_PFLOG = 0xf5 + IFT_PFSYNC = 0xf6 + IFT_PKTAP = 0xfe + IFT_PPP = 0x17 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PTPSERIAL = 0x16 + IFT_RS232 = 0x21 + IFT_SDLC = 0x11 + IFT_SIP = 0x1f + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_STARLAN = 0xb + IFT_STF = 0x39 + IFT_T1 = 0x12 + IFT_ULTRA = 0x1d + IFT_V35 = 0x2d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LINKLOCALNETNUM = 0xa9fe0000 + IN_LOOPBACKNET = 0x7f + IPPROTO_3PC = 0x22 + IPPROTO_ADFS = 0x44 + IPPROTO_AH = 0x33 + IPPROTO_AHIP = 0x3d + IPPROTO_APES = 0x63 + IPPROTO_ARGUS = 0xd + IPPROTO_AX25 = 0x5d + IPPROTO_BHA = 0x31 + IPPROTO_BLT = 0x1e + IPPROTO_BRSATMON = 0x4c + IPPROTO_CFTP = 0x3e + IPPROTO_CHAOS = 0x10 + IPPROTO_CMTP = 0x26 + IPPROTO_CPHB = 0x49 + IPPROTO_CPNX = 0x48 + IPPROTO_DDP = 0x25 + IPPROTO_DGP = 0x56 + IPPROTO_DIVERT = 0xfe + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_EMCON = 0xe + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GMTP = 0x64 + IPPROTO_GRE = 0x2f + IPPROTO_HELLO = 0x3f + IPPROTO_HMP = 0x14 + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IDPR = 0x23 + IPPROTO_IDRP = 0x2d + IPPROTO_IGMP = 0x2 + IPPROTO_IGP = 0x55 + IPPROTO_IGRP = 0x58 + IPPROTO_IL = 0x28 + IPPROTO_INLSP = 0x34 + IPPROTO_INP = 0x20 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPCV = 0x47 + IPPROTO_IPEIP = 0x5e + IPPROTO_IPIP = 0x4 + IPPROTO_IPPC = 0x43 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IRTP = 0x1c + IPPROTO_KRYPTOLAN = 0x41 + IPPROTO_LARP = 0x5b + IPPROTO_LEAF1 = 0x19 + IPPROTO_LEAF2 = 0x1a + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x34 + IPPROTO_MEAS = 0x13 + IPPROTO_MHRP = 0x30 + IPPROTO_MICP = 0x5f + IPPROTO_MTP = 0x5c + IPPROTO_MUX = 0x12 + IPPROTO_ND = 0x4d + IPPROTO_NHRP = 0x36 + IPPROTO_NONE = 0x3b + IPPROTO_NSP = 0x1f + IPPROTO_NVPII = 0xb + IPPROTO_OSPFIGP = 0x59 + IPPROTO_PGM = 0x71 + IPPROTO_PIGP = 0x9 + IPPROTO_PIM = 0x67 + IPPROTO_PRM = 0x15 + IPPROTO_PUP = 0xc + IPPROTO_PVP = 0x4b + IPPROTO_RAW = 0xff + IPPROTO_RCCMON = 0xa + IPPROTO_RDP = 0x1b + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_RVD = 0x42 + IPPROTO_SATEXPAK = 0x40 + IPPROTO_SATMON = 0x45 + IPPROTO_SCCSP = 0x60 + IPPROTO_SCTP = 0x84 + IPPROTO_SDRP = 0x2a + IPPROTO_SEP = 0x21 + IPPROTO_SRPC = 0x5a + IPPROTO_ST = 0x7 + IPPROTO_SVMTP = 0x52 + IPPROTO_SWIPE = 0x35 + IPPROTO_TCF = 0x57 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_TPXX = 0x27 + IPPROTO_TRUNK1 = 0x17 + IPPROTO_TRUNK2 = 0x18 + IPPROTO_TTP = 0x54 + IPPROTO_UDP = 0x11 + IPPROTO_VINES = 0x53 + IPPROTO_VISA = 0x46 + IPPROTO_VMTP = 0x51 + IPPROTO_WBEXPAK = 0x4f + IPPROTO_WBMON = 0x4e + IPPROTO_WSN = 0x4a + IPPROTO_XNET = 0xf + IPPROTO_XTP = 0x24 + IPV6_2292DSTOPTS = 0x17 + IPV6_2292HOPLIMIT = 0x14 + IPV6_2292HOPOPTS = 0x16 + IPV6_2292NEXTHOP = 0x15 + IPV6_2292PKTINFO = 0x13 + IPV6_2292PKTOPTIONS = 0x19 + IPV6_2292RTHDR = 0x18 + IPV6_BINDV6ONLY = 0x1b + IPV6_BOUND_IF = 0x7d + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FLOW_ECN_MASK = 0x300 + IPV6_FRAGTTL = 0x3c + IPV6_FW_ADD = 0x1e + IPV6_FW_DEL = 0x1f + IPV6_FW_FLUSH = 0x20 + IPV6_FW_GET = 0x22 + IPV6_FW_ZERO = 0x21 + IPV6_HLIMDEC = 0x1 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXOPTHDR = 0x800 + IPV6_MAXPACKET = 0xffff + IPV6_MAX_GROUP_SRC_FILTER = 0x200 + IPV6_MAX_MEMBERSHIPS = 0xfff + IPV6_MAX_SOCK_SRC_FILTER = 0x80 + IPV6_MIN_MEMBERSHIPS = 0x1f + IPV6_MMTU = 0x500 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_RECVTCLASS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x24 + IPV6_UNICAST_HOPS = 0x4 + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_ADD_SOURCE_MEMBERSHIP = 0x46 + IP_BLOCK_SOURCE = 0x48 + IP_BOUND_IF = 0x19 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0xd + IP_DROP_SOURCE_MEMBERSHIP = 0x47 + IP_DUMMYNET_CONFIGURE = 0x3c + IP_DUMMYNET_DEL = 0x3d + IP_DUMMYNET_FLUSH = 0x3e + IP_DUMMYNET_GET = 0x40 + IP_FAITH = 0x16 + IP_FW_ADD = 0x28 + IP_FW_DEL = 0x29 + IP_FW_FLUSH = 0x2a + IP_FW_GET = 0x2c + IP_FW_RESETLOG = 0x2d + IP_FW_ZERO = 0x2b + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x15 + IP_MAXPACKET = 0xffff + IP_MAX_GROUP_SRC_FILTER = 0x200 + IP_MAX_MEMBERSHIPS = 0xfff + IP_MAX_SOCK_MUTE_FILTER = 0x80 + IP_MAX_SOCK_SRC_FILTER = 0x80 + IP_MF = 0x2000 + IP_MIN_MEMBERSHIPS = 0x1f + IP_MSFILTER = 0x4a + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_IFINDEX = 0x42 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_MULTICAST_VIF = 0xe + IP_NAT__XXX = 0x37 + IP_OFFMASK = 0x1fff + IP_OLD_FW_ADD = 0x32 + IP_OLD_FW_DEL = 0x33 + IP_OLD_FW_FLUSH = 0x34 + IP_OLD_FW_GET = 0x36 + IP_OLD_FW_RESETLOG = 0x38 + IP_OLD_FW_ZERO = 0x35 + IP_OPTIONS = 0x1 + IP_PKTINFO = 0x1a + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVPKTINFO = 0x1a + IP_RECVRETOPTS = 0x6 + IP_RECVTOS = 0x1b + IP_RECVTTL = 0x18 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RSVP_OFF = 0x10 + IP_RSVP_ON = 0xf + IP_RSVP_VIF_OFF = 0x12 + IP_RSVP_VIF_ON = 0x11 + IP_STRIPHDR = 0x17 + IP_TOS = 0x3 + IP_TRAFFIC_MGT_BACKGROUND = 0x41 + IP_TTL = 0x4 + IP_UNBLOCK_SOURCE = 0x49 + ISIG = 0x80 + ISTRIP = 0x20 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + KERN_HOSTNAME = 0xa + KERN_OSRELEASE = 0x2 + KERN_OSTYPE = 0x1 + KERN_VERSION = 0x4 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_CAN_REUSE = 0x9 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x5 + MADV_FREE_REUSABLE = 0x7 + MADV_FREE_REUSE = 0x8 + MADV_NORMAL = 0x0 + MADV_PAGEOUT = 0xa + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_WILLNEED = 0x3 + MADV_ZERO_WIRED_PAGES = 0x6 + MAP_ANON = 0x1000 + MAP_ANONYMOUS = 0x1000 + MAP_COPY = 0x2 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_JIT = 0x800 + MAP_NOCACHE = 0x400 + MAP_NOEXTEND = 0x100 + MAP_NORESERVE = 0x40 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_RESERVED0080 = 0x80 + MAP_RESILIENT_CODESIGN = 0x2000 + MAP_RESILIENT_MEDIA = 0x4000 + MAP_SHARED = 0x1 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MNT_ASYNC = 0x40 + MNT_AUTOMOUNTED = 0x400000 + MNT_CMDFLAGS = 0xf0000 + MNT_CPROTECT = 0x80 + MNT_DEFWRITE = 0x2000000 + MNT_DONTBROWSE = 0x100000 + MNT_DOVOLFS = 0x8000 + MNT_DWAIT = 0x4 + MNT_EXPORTED = 0x100 + MNT_FORCE = 0x80000 + MNT_IGNORE_OWNERSHIP = 0x200000 + MNT_JOURNALED = 0x800000 + MNT_LOCAL = 0x1000 + MNT_MULTILABEL = 0x4000000 + MNT_NOATIME = 0x10000000 + MNT_NOBLOCK = 0x20000 + MNT_NODEV = 0x10 + MNT_NOEXEC = 0x4 + MNT_NOSUID = 0x8 + MNT_NOUSERXATTR = 0x1000000 + MNT_NOWAIT = 0x2 + MNT_QUARANTINE = 0x400 + MNT_QUOTA = 0x2000 + MNT_RDONLY = 0x1 + MNT_RELOAD = 0x40000 + MNT_ROOTFS = 0x4000 + MNT_SYNCHRONOUS = 0x2 + MNT_UNION = 0x20 + MNT_UNKNOWNPERMISSIONS = 0x200000 + MNT_UPDATE = 0x10000 + MNT_VISFLAGMASK = 0x17f0f5ff + MNT_WAIT = 0x1 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOF = 0x100 + MSG_EOR = 0x8 + MSG_FLUSH = 0x400 + MSG_HAVEMORE = 0x2000 + MSG_HOLD = 0x800 + MSG_NEEDSA = 0x10000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_RCVMORE = 0x4000 + MSG_SEND = 0x1000 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MSG_WAITSTREAM = 0x200 + MS_ASYNC = 0x1 + MS_DEACTIVATE = 0x8 + MS_INVALIDATE = 0x2 + MS_KILLPAGES = 0x4 + MS_SYNC = 0x10 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_DUMP2 = 0x7 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_IFLIST2 = 0x6 + NET_RT_MAXID = 0xa + NET_RT_STAT = 0x4 + NET_RT_TRASH = 0x5 + NL0 = 0x0 + NL1 = 0x100 + NL2 = 0x200 + NL3 = 0x300 + NLDLY = 0x300 + NOFLSH = 0x80000000 + NOKERNINFO = 0x2000000 + NOTE_ABSOLUTE = 0x8 + NOTE_ATTRIB = 0x8 + NOTE_BACKGROUND = 0x40 + NOTE_CHILD = 0x4 + NOTE_CRITICAL = 0x20 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXITSTATUS = 0x4000000 + NOTE_EXIT_CSERROR = 0x40000 + NOTE_EXIT_DECRYPTFAIL = 0x10000 + NOTE_EXIT_DETAIL = 0x2000000 + NOTE_EXIT_DETAIL_MASK = 0x70000 + NOTE_EXIT_MEMORY = 0x20000 + NOTE_EXIT_REPARENTED = 0x80000 + NOTE_EXTEND = 0x4 + NOTE_FFAND = 0x40000000 + NOTE_FFCOPY = 0xc0000000 + NOTE_FFCTRLMASK = 0xc0000000 + NOTE_FFLAGSMASK = 0xffffff + NOTE_FFNOP = 0x0 + NOTE_FFOR = 0x80000000 + NOTE_FORK = 0x40000000 + NOTE_FUNLOCK = 0x100 + NOTE_LEEWAY = 0x10 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_MACH_CONTINUOUS_TIME = 0x80 + NOTE_NONE = 0x80 + NOTE_NSECONDS = 0x4 + NOTE_OOB = 0x2 + NOTE_PCTRLMASK = -0x100000 + NOTE_PDATAMASK = 0xfffff + NOTE_REAP = 0x10000000 + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_SECONDS = 0x1 + NOTE_SIGNAL = 0x8000000 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRIGGER = 0x1000000 + NOTE_USECONDS = 0x2 + NOTE_VM_ERROR = 0x10000000 + NOTE_VM_PRESSURE = 0x80000000 + NOTE_VM_PRESSURE_SUDDEN_TERMINATE = 0x20000000 + NOTE_VM_PRESSURE_TERMINATE = 0x40000000 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + OFDEL = 0x20000 + OFILL = 0x80 + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + OXTABS = 0x4 + O_ACCMODE = 0x3 + O_ALERT = 0x20000000 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x1000000 + O_CREAT = 0x200 + O_DIRECTORY = 0x100000 + O_DP_GETRAWENCRYPTED = 0x1 + O_DP_GETRAWUNENCRYPTED = 0x2 + O_DSYNC = 0x400000 + O_EVTONLY = 0x8000 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x20000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_POPUP = 0x80000000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_SHLOCK = 0x10 + O_SYMLINK = 0x200000 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PT_ATTACH = 0xa + PT_ATTACHEXC = 0xe + PT_CONTINUE = 0x7 + PT_DENY_ATTACH = 0x1f + PT_DETACH = 0xb + PT_FIRSTMACH = 0x20 + PT_FORCEQUOTA = 0x1e + PT_KILL = 0x8 + PT_READ_D = 0x2 + PT_READ_I = 0x1 + PT_READ_U = 0x3 + PT_SIGEXC = 0xc + PT_STEP = 0x9 + PT_THUPDATE = 0xd + PT_TRACE_ME = 0x0 + PT_WRITE_D = 0x5 + PT_WRITE_I = 0x4 + PT_WRITE_U = 0x6 + RLIMIT_AS = 0x5 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_CPU_USAGE_MONITOR = 0x2 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_MEMLOCK = 0x6 + RLIMIT_NOFILE = 0x8 + RLIMIT_NPROC = 0x7 + RLIMIT_RSS = 0x5 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x8 + RTAX_NETMASK = 0x2 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_CLONING = 0x100 + RTF_CONDEMNED = 0x2000000 + RTF_DELCLONE = 0x80 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_IFREF = 0x4000000 + RTF_IFSCOPE = 0x1000000 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MODIFIED = 0x20 + RTF_MULTICAST = 0x800000 + RTF_NOIFREF = 0x2000 + RTF_PINNED = 0x100000 + RTF_PRCLONING = 0x10000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x40000 + RTF_PROXY = 0x8000000 + RTF_REJECT = 0x8 + RTF_ROUTER = 0x10000000 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_WASCLONED = 0x20000 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DELMADDR = 0x10 + RTM_GET = 0x4 + RTM_GET2 = 0x14 + RTM_IFINFO = 0xe + RTM_IFINFO2 = 0x12 + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_NEWMADDR = 0xf + RTM_NEWMADDR2 = 0x13 + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + SCM_CREDS = 0x3 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x2 + SCM_TIMESTAMP_MONOTONIC = 0x4 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCAIFADDR = 0x8040691a + SIOCARPIPLL = 0xc0206928 + SIOCATMARK = 0x40047307 + SIOCAUTOADDR = 0xc0206926 + SIOCAUTONETMASK = 0x80206927 + SIOCDELMULTI = 0x80206932 + SIOCDIFADDR = 0x80206919 + SIOCDIFPHYADDR = 0x80206941 + SIOCGDRVSPEC = 0xc028697b + SIOCGETVLAN = 0xc020697f + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0206921 + SIOCGIFALTMTU = 0xc0206948 + SIOCGIFASYNCMAP = 0xc020697c + SIOCGIFBOND = 0xc0206947 + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCAP = 0xc020695b + SIOCGIFCONF = 0xc00c6924 + SIOCGIFDEVMTU = 0xc0206944 + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGENERIC = 0xc020693a + SIOCGIFKPI = 0xc0206987 + SIOCGIFMAC = 0xc0206982 + SIOCGIFMEDIA = 0xc02c6938 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc0206933 + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206940 + SIOCGIFPHYS = 0xc0206935 + SIOCGIFPSRCADDR = 0xc020693f + SIOCGIFSTATUS = 0xc331693d + SIOCGIFVLAN = 0xc020697f + SIOCGIFWAKEFLAGS = 0xc0206988 + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCIFCREATE = 0xc0206978 + SIOCIFCREATE2 = 0xc020697a + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc0106981 + SIOCRSLVMULTI = 0xc010693b + SIOCSDRVSPEC = 0x8028697b + SIOCSETVLAN = 0x8020697e + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFALTMTU = 0x80206945 + SIOCSIFASYNCMAP = 0x8020697d + SIOCSIFBOND = 0x80206946 + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFCAP = 0x8020695a + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGENERIC = 0x80206939 + SIOCSIFKPI = 0x80206986 + SIOCSIFLLADDR = 0x8020693c + SIOCSIFMAC = 0x80206983 + SIOCSIFMEDIA = 0xc0206937 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x80206934 + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x8040693e + SIOCSIFPHYS = 0x80206936 + SIOCSIFVLAN = 0x8020697e + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SOCK_DGRAM = 0x2 + SOCK_MAXADDRLEN = 0xff + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_DONTTRUNC = 0x2000 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LABEL = 0x1010 + SO_LINGER = 0x80 + SO_LINGER_SEC = 0x1080 + SO_NETSVC_MARKING_LEVEL = 0x1119 + SO_NET_SERVICE_TYPE = 0x1116 + SO_NKE = 0x1021 + SO_NOADDRERR = 0x1023 + SO_NOSIGPIPE = 0x1022 + SO_NOTIFYCONFLICT = 0x1026 + SO_NP_EXTENSIONS = 0x1083 + SO_NREAD = 0x1020 + SO_NUMRCVPKT = 0x1112 + SO_NWRITE = 0x1024 + SO_OOBINLINE = 0x100 + SO_PEERLABEL = 0x1011 + SO_RANDOMPORT = 0x1082 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_REUSESHAREUID = 0x1025 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_TIMESTAMP = 0x400 + SO_TIMESTAMP_MONOTONIC = 0x800 + SO_TYPE = 0x1008 + SO_UPCALLCLOSEWAIT = 0x1027 + SO_USELOOPBACK = 0x40 + SO_WANTMORE = 0x4000 + SO_WANTOOBFLAG = 0x8000 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IFWHT = 0xe000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISTXT = 0x200 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x400 + TAB2 = 0x800 + TAB3 = 0x4 + TABDLY = 0xc04 + TCIFLUSH = 0x1 + TCIOFF = 0x3 + TCIOFLUSH = 0x3 + TCION = 0x4 + TCOFLUSH = 0x2 + TCOOFF = 0x1 + TCOON = 0x2 + TCP_CONNECTIONTIMEOUT = 0x20 + TCP_CONNECTION_INFO = 0x106 + TCP_ENABLE_ECN = 0x104 + TCP_FASTOPEN = 0x105 + TCP_KEEPALIVE = 0x10 + TCP_KEEPCNT = 0x102 + TCP_KEEPINTVL = 0x101 + TCP_MAXHLEN = 0x3c + TCP_MAXOLEN = 0x28 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x4 + TCP_MAX_WINSHIFT = 0xe + TCP_MINMSS = 0xd8 + TCP_MSS = 0x200 + TCP_NODELAY = 0x1 + TCP_NOOPT = 0x8 + TCP_NOPUSH = 0x4 + TCP_NOTSENT_LOWAT = 0x201 + TCP_RXT_CONNDROPTIME = 0x80 + TCP_RXT_FINDROP = 0x100 + TCP_SENDMOREACKS = 0x103 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDCDTIMESTAMP = 0x40107458 + TIOCDRAIN = 0x2000745e + TIOCDSIMICROCODE = 0x20007455 + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLUSH = 0x80047410 + TIOCGDRAINWAIT = 0x40047456 + TIOCGETA = 0x40487413 + TIOCGETD = 0x4004741a + TIOCGPGRP = 0x40047477 + TIOCGWINSZ = 0x40087468 + TIOCIXOFF = 0x20007480 + TIOCIXON = 0x20007481 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGDTRWAIT = 0x4004745a + TIOCMGET = 0x4004746a + TIOCMODG = 0x40047403 + TIOCMODS = 0x80047404 + TIOCMSDTRWAIT = 0x8004745b + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCPTYGNAME = 0x40807453 + TIOCPTYGRANT = 0x20007454 + TIOCPTYUNLK = 0x20007452 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCONS = 0x20007463 + TIOCSCTTY = 0x20007461 + TIOCSDRAINWAIT = 0x80047457 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x80487414 + TIOCSETAF = 0x80487416 + TIOCSETAW = 0x80487415 + TIOCSETD = 0x8004741b + TIOCSIG = 0x2000745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x20007465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCTIMESTAMP = 0x40107459 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VM_LOADAVG = 0x2 + VM_MACHFACTOR = 0x4 + VM_MAXID = 0x6 + VM_METER = 0x1 + VM_SWAPUSAGE = 0x5 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VT0 = 0x0 + VT1 = 0x10000 + VTDLY = 0x10000 + VTIME = 0x11 + VWERASE = 0x4 + WCONTINUED = 0x10 + WCOREFLAG = 0x80 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOWAIT = 0x20 + WORDSIZE = 0x40 + WSTOPPED = 0x8 + WUNTRACED = 0x2 + XATTR_CREATE = 0x2 + XATTR_NODEFAULT = 0x10 + XATTR_NOFOLLOW = 0x1 + XATTR_NOSECURITY = 0x8 + XATTR_REPLACE = 0x4 + XATTR_SHOWCOMPRESSION = 0x20 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADARCH = syscall.Errno(0x56) + EBADEXEC = syscall.Errno(0x55) + EBADF = syscall.Errno(0x9) + EBADMACHO = syscall.Errno(0x58) + EBADMSG = syscall.Errno(0x5e) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x59) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDEVERR = syscall.Errno(0x53) + EDOM = syscall.Errno(0x21) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x5a) + EILSEQ = syscall.Errno(0x5c) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x6a) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5f) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x5d) + ENOBUFS = syscall.Errno(0x37) + ENODATA = syscall.Errno(0x60) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x61) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x5b) + ENOPOLICY = syscall.Errno(0x67) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x62) + ENOSTR = syscall.Errno(0x63) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTRECOVERABLE = syscall.Errno(0x68) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x2d) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x66) + EOVERFLOW = syscall.Errno(0x54) + EOWNERDEAD = syscall.Errno(0x69) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTO = syscall.Errno(0x64) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + EPWROFF = syscall.Errno(0x52) + EQFULL = syscall.Errno(0x6a) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHLIBVERS = syscall.Errno(0x57) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIME = syscall.Errno(0x65) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "device not configured"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EDEADLK", "resource deadlock avoided"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "resource busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "cross-device link"}, + {19, "ENODEV", "operation not supported by device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "result too large"}, + {35, "EAGAIN", "resource temporarily unavailable"}, + {36, "EINPROGRESS", "operation now in progress"}, + {37, "EALREADY", "operation already in progress"}, + {38, "ENOTSOCK", "socket operation on non-socket"}, + {39, "EDESTADDRREQ", "destination address required"}, + {40, "EMSGSIZE", "message too long"}, + {41, "EPROTOTYPE", "protocol wrong type for socket"}, + {42, "ENOPROTOOPT", "protocol not available"}, + {43, "EPROTONOSUPPORT", "protocol not supported"}, + {44, "ESOCKTNOSUPPORT", "socket type not supported"}, + {45, "ENOTSUP", "operation not supported"}, + {46, "EPFNOSUPPORT", "protocol family not supported"}, + {47, "EAFNOSUPPORT", "address family not supported by protocol family"}, + {48, "EADDRINUSE", "address already in use"}, + {49, "EADDRNOTAVAIL", "can't assign requested address"}, + {50, "ENETDOWN", "network is down"}, + {51, "ENETUNREACH", "network is unreachable"}, + {52, "ENETRESET", "network dropped connection on reset"}, + {53, "ECONNABORTED", "software caused connection abort"}, + {54, "ECONNRESET", "connection reset by peer"}, + {55, "ENOBUFS", "no buffer space available"}, + {56, "EISCONN", "socket is already connected"}, + {57, "ENOTCONN", "socket is not connected"}, + {58, "ESHUTDOWN", "can't send after socket shutdown"}, + {59, "ETOOMANYREFS", "too many references: can't splice"}, + {60, "ETIMEDOUT", "operation timed out"}, + {61, "ECONNREFUSED", "connection refused"}, + {62, "ELOOP", "too many levels of symbolic links"}, + {63, "ENAMETOOLONG", "file name too long"}, + {64, "EHOSTDOWN", "host is down"}, + {65, "EHOSTUNREACH", "no route to host"}, + {66, "ENOTEMPTY", "directory not empty"}, + {67, "EPROCLIM", "too many processes"}, + {68, "EUSERS", "too many users"}, + {69, "EDQUOT", "disc quota exceeded"}, + {70, "ESTALE", "stale NFS file handle"}, + {71, "EREMOTE", "too many levels of remote in path"}, + {72, "EBADRPC", "RPC struct is bad"}, + {73, "ERPCMISMATCH", "RPC version wrong"}, + {74, "EPROGUNAVAIL", "RPC prog. not avail"}, + {75, "EPROGMISMATCH", "program version wrong"}, + {76, "EPROCUNAVAIL", "bad procedure for program"}, + {77, "ENOLCK", "no locks available"}, + {78, "ENOSYS", "function not implemented"}, + {79, "EFTYPE", "inappropriate file type or format"}, + {80, "EAUTH", "authentication error"}, + {81, "ENEEDAUTH", "need authenticator"}, + {82, "EPWROFF", "device power is off"}, + {83, "EDEVERR", "device error"}, + {84, "EOVERFLOW", "value too large to be stored in data type"}, + {85, "EBADEXEC", "bad executable (or shared library)"}, + {86, "EBADARCH", "bad CPU type in executable"}, + {87, "ESHLIBVERS", "shared library version mismatch"}, + {88, "EBADMACHO", "malformed Mach-o file"}, + {89, "ECANCELED", "operation canceled"}, + {90, "EIDRM", "identifier removed"}, + {91, "ENOMSG", "no message of desired type"}, + {92, "EILSEQ", "illegal byte sequence"}, + {93, "ENOATTR", "attribute not found"}, + {94, "EBADMSG", "bad message"}, + {95, "EMULTIHOP", "EMULTIHOP (Reserved)"}, + {96, "ENODATA", "no message available on STREAM"}, + {97, "ENOLINK", "ENOLINK (Reserved)"}, + {98, "ENOSR", "no STREAM resources"}, + {99, "ENOSTR", "not a STREAM"}, + {100, "EPROTO", "protocol error"}, + {101, "ETIME", "STREAM ioctl timeout"}, + {102, "EOPNOTSUPP", "operation not supported on socket"}, + {103, "ENOPOLICY", "policy not found"}, + {104, "ENOTRECOVERABLE", "state not recoverable"}, + {105, "EOWNERDEAD", "previous owner died"}, + {106, "EQFULL", "interface output queue is full"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/BPT trap"}, + {6, "SIGABRT", "abort trap"}, + {7, "SIGEMT", "EMT trap"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGBUS", "bus error"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGSYS", "bad system call"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGURG", "urgent I/O condition"}, + {17, "SIGSTOP", "suspended (signal)"}, + {18, "SIGTSTP", "suspended"}, + {19, "SIGCONT", "continued"}, + {20, "SIGCHLD", "child exited"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGIO", "I/O possible"}, + {24, "SIGXCPU", "cputime limit exceeded"}, + {25, "SIGXFSZ", "filesize limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window size changes"}, + {29, "SIGINFO", "information request"}, + {30, "SIGUSR1", "user defined signal 1"}, + {31, "SIGUSR2", "user defined signal 2"}, +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go new file mode 100644 index 00000000..bbe6089b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go @@ -0,0 +1,1650 @@ +// mkerrors.sh -m64 +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,dragonfly + +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs -- -m64 _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_ATM = 0x1e + AF_BLUETOOTH = 0x21 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x23 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x1c + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x24 + AF_MPLS = 0x22 + AF_NATM = 0x1d + AF_NETBIOS = 0x6 + AF_NETGRAPH = 0x20 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x11 + AF_SIP = 0x18 + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + ALTWERASE = 0x200 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B9600 = 0x2580 + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc0104279 + BIOCGETIF = 0x4020426b + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044272 + BIOCGRTIMEOUT = 0x4010426e + BIOCGSEESENT = 0x40044276 + BIOCGSTATS = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCLOCK = 0x2000427a + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDLT = 0x80044278 + BIOCSETF = 0x80104267 + BIOCSETIF = 0x8020426c + BIOCSETWF = 0x8010427b + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044273 + BIOCSRTIMEOUT = 0x8010426d + BIOCSSEESENT = 0x80044277 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x8 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DEFAULTBUFSIZE = 0x1000 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x80000 + BPF_MAXINSNS = 0x200 + BPF_MAX_CLONES = 0x80 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + CFLUSH = 0xf + CLOCAL = 0x8000 + CLOCK_MONOTONIC = 0x4 + CLOCK_MONOTONIC_FAST = 0xc + CLOCK_MONOTONIC_PRECISE = 0xb + CLOCK_PROCESS_CPUTIME_ID = 0xf + CLOCK_PROF = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_FAST = 0xa + CLOCK_REALTIME_PRECISE = 0x9 + CLOCK_SECOND = 0xd + CLOCK_THREAD_CPUTIME_ID = 0xe + CLOCK_UPTIME = 0x5 + CLOCK_UPTIME_FAST = 0x8 + CLOCK_UPTIME_PRECISE = 0x7 + CLOCK_VIRTUAL = 0x1 + CREAD = 0x800 + CRTSCTS = 0x30000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_HW = 0x6 + CTL_KERN = 0x1 + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_CAN20B = 0xbe + DLT_CHAOS = 0x5 + DLT_CHDLC = 0x68 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DOCSIS = 0x8f + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_HHDLC = 0x79 + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_IPFILTER = 0x74 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PRISM_HEADER = 0x77 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_REDBACK_SMARTEDGE = 0x20 + DLT_RIO = 0x7c + DLT_SCCP = 0x8e + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USB_LINUX = 0xbd + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DBF = 0xf + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EVFILT_AIO = -0x3 + EVFILT_EXCEPT = -0x8 + EVFILT_FS = -0xa + EVFILT_MARKER = 0xf + EVFILT_PROC = -0x5 + EVFILT_READ = -0x1 + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0xa + EVFILT_TIMER = -0x7 + EVFILT_USER = -0x9 + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_DISPATCH = 0x80 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_NODATA = 0x1000 + EV_ONESHOT = 0x10 + EV_RECEIPT = 0x40 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTEXIT_LWP = 0x10000 + EXTEXIT_PROC = 0x0 + EXTEXIT_SETINT = 0x1 + EXTEXIT_SIMPLE = 0x0 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FLUSHO = 0x800000 + F_DUP2FD = 0xa + F_DUP2FD_CLOEXEC = 0x12 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x11 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETOWN = 0x5 + F_OK = 0x0 + F_RDLCK = 0x1 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETOWN = 0x6 + F_UNLCK = 0x2 + F_WRLCK = 0x3 + HUPCL = 0x4000 + HW_MACHINE = 0x1 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFAN_ARRIVAL = 0x0 + IFAN_DEPARTURE = 0x1 + IFF_ALLMULTI = 0x200 + IFF_ALTPHYS = 0x4000 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x118e72 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MONITOR = 0x40000 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NPOLLING = 0x100000 + IFF_OACTIVE = 0x400 + IFF_OACTIVE_COMPAT = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_POLLING = 0x10000 + IFF_POLLING_COMPAT = 0x10000 + IFF_PPROMISC = 0x20000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_SMART = 0x20 + IFF_STATICARP = 0x80000 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BRIDGE = 0xd1 + IFT_BSC = 0x53 + IFT_CARP = 0xf8 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAITH = 0xf2 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE1394 = 0x90 + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_INTERLEAVE = 0x7c + IFT_IP = 0x7e + IFT_IPFORWARD = 0x8e + IFT_IPOVERATM = 0x72 + IFT_IPOVERCDLC = 0x6d + IFT_IPOVERCLAW = 0x6e + IFT_IPSWITCH = 0x4e + IFT_ISDN = 0x3f + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISDNS = 0x4b + IFT_ISDNU = 0x4c + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88025CRFPINT = 0x62 + IFT_ISO88025DTR = 0x56 + IFT_ISO88025FIBER = 0x73 + IFT_ISO88026 = 0xa + IFT_ISUP = 0xb3 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_L3IPXVLAN = 0x89 + IFT_LAPB = 0x10 + IFT_LAPD = 0x4d + IFT_LAPF = 0x77 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf5 + IFT_PFSYNC = 0xf6 + IFT_PLC = 0xae + IFT_POS = 0xab + IFT_PPP = 0x17 + IFT_PPPMULTILINKBUNDLE = 0x6c + IFT_PROPBWAP2MP = 0xb8 + IFT_PROPCNLS = 0x59 + IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 + IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 + IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PROPWIRELESSP2P = 0x9d + IFT_PTPSERIAL = 0x16 + IFT_PVC = 0xf1 + IFT_QLLC = 0x44 + IFT_RADIOMAC = 0xbc + IFT_RADSL = 0x5f + IFT_REACHDSL = 0xc0 + IFT_RFC1483 = 0x9f + IFT_RS232 = 0x21 + IFT_RSRB = 0x4f + IFT_SDLC = 0x11 + IFT_SDSL = 0x60 + IFT_SHDSL = 0xa9 + IFT_SIP = 0x1f + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETOVERHEADCHANNEL = 0xb9 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_SRP = 0x97 + IFT_SS7SIGLINK = 0x9c + IFT_STACKTOSTACK = 0x6f + IFT_STARLAN = 0xb + IFT_STF = 0xf3 + IFT_T1 = 0x12 + IFT_TDLC = 0x74 + IFT_TERMPAD = 0x5b + IFT_TR008 = 0xb0 + IFT_TRANSPHDLC = 0x7b + IFT_TUNNEL = 0x83 + IFT_ULTRA = 0x1d + IFT_USB = 0xa0 + IFT_V11 = 0x40 + IFT_V35 = 0x2d + IFT_V36 = 0x41 + IFT_V37 = 0x78 + IFT_VDSL = 0x61 + IFT_VIRTUALIPADDRESS = 0x70 + IFT_VOICEEM = 0x64 + IFT_VOICEENCAP = 0x67 + IFT_VOICEFXO = 0x65 + IFT_VOICEFXS = 0x66 + IFT_VOICEOVERATM = 0x98 + IFT_VOICEOVERFRAMERELAY = 0x99 + IFT_VOICEOVERIP = 0x68 + IFT_X213 = 0x5d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25HUNTGROUP = 0x7a + IFT_X25MLP = 0x79 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IPPROTO_3PC = 0x22 + IPPROTO_ADFS = 0x44 + IPPROTO_AH = 0x33 + IPPROTO_AHIP = 0x3d + IPPROTO_APES = 0x63 + IPPROTO_ARGUS = 0xd + IPPROTO_AX25 = 0x5d + IPPROTO_BHA = 0x31 + IPPROTO_BLT = 0x1e + IPPROTO_BRSATMON = 0x4c + IPPROTO_CARP = 0x70 + IPPROTO_CFTP = 0x3e + IPPROTO_CHAOS = 0x10 + IPPROTO_CMTP = 0x26 + IPPROTO_CPHB = 0x49 + IPPROTO_CPNX = 0x48 + IPPROTO_DDP = 0x25 + IPPROTO_DGP = 0x56 + IPPROTO_DIVERT = 0xfe + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_EMCON = 0xe + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GMTP = 0x64 + IPPROTO_GRE = 0x2f + IPPROTO_HELLO = 0x3f + IPPROTO_HMP = 0x14 + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IDPR = 0x23 + IPPROTO_IDRP = 0x2d + IPPROTO_IGMP = 0x2 + IPPROTO_IGP = 0x55 + IPPROTO_IGRP = 0x58 + IPPROTO_IL = 0x28 + IPPROTO_INLSP = 0x34 + IPPROTO_INP = 0x20 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPCV = 0x47 + IPPROTO_IPEIP = 0x5e + IPPROTO_IPIP = 0x4 + IPPROTO_IPPC = 0x43 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IRTP = 0x1c + IPPROTO_KRYPTOLAN = 0x41 + IPPROTO_LARP = 0x5b + IPPROTO_LEAF1 = 0x19 + IPPROTO_LEAF2 = 0x1a + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x34 + IPPROTO_MEAS = 0x13 + IPPROTO_MHRP = 0x30 + IPPROTO_MICP = 0x5f + IPPROTO_MOBILE = 0x37 + IPPROTO_MTP = 0x5c + IPPROTO_MUX = 0x12 + IPPROTO_ND = 0x4d + IPPROTO_NHRP = 0x36 + IPPROTO_NONE = 0x3b + IPPROTO_NSP = 0x1f + IPPROTO_NVPII = 0xb + IPPROTO_OSPFIGP = 0x59 + IPPROTO_PFSYNC = 0xf0 + IPPROTO_PGM = 0x71 + IPPROTO_PIGP = 0x9 + IPPROTO_PIM = 0x67 + IPPROTO_PRM = 0x15 + IPPROTO_PUP = 0xc + IPPROTO_PVP = 0x4b + IPPROTO_RAW = 0xff + IPPROTO_RCCMON = 0xa + IPPROTO_RDP = 0x1b + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_RVD = 0x42 + IPPROTO_SATEXPAK = 0x40 + IPPROTO_SATMON = 0x45 + IPPROTO_SCCSP = 0x60 + IPPROTO_SDRP = 0x2a + IPPROTO_SEP = 0x21 + IPPROTO_SKIP = 0x39 + IPPROTO_SRPC = 0x5a + IPPROTO_ST = 0x7 + IPPROTO_SVMTP = 0x52 + IPPROTO_SWIPE = 0x35 + IPPROTO_TCF = 0x57 + IPPROTO_TCP = 0x6 + IPPROTO_TLSP = 0x38 + IPPROTO_TP = 0x1d + IPPROTO_TPXX = 0x27 + IPPROTO_TRUNK1 = 0x17 + IPPROTO_TRUNK2 = 0x18 + IPPROTO_TTP = 0x54 + IPPROTO_UDP = 0x11 + IPPROTO_UNKNOWN = 0x102 + IPPROTO_VINES = 0x53 + IPPROTO_VISA = 0x46 + IPPROTO_VMTP = 0x51 + IPPROTO_WBEXPAK = 0x4f + IPPROTO_WBMON = 0x4e + IPPROTO_WSN = 0x4a + IPPROTO_XNET = 0xf + IPPROTO_XTP = 0x24 + IPV6_AUTOFLOWLABEL = 0x3b + IPV6_BINDV6ONLY = 0x1b + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FRAGTTL = 0x78 + IPV6_FW_ADD = 0x1e + IPV6_FW_DEL = 0x1f + IPV6_FW_FLUSH = 0x20 + IPV6_FW_GET = 0x22 + IPV6_FW_ZERO = 0x21 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXPACKET = 0xffff + IPV6_MINHLIM = 0x28 + IPV6_MMTU = 0x500 + IPV6_MSFILTER = 0x4a + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_PATHMTU = 0x2c + IPV6_PKTINFO = 0x2e + IPV6_PKTOPTIONS = 0x34 + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_PREFER_TEMPADDR = 0x3f + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0xd + IP_DUMMYNET_CONFIGURE = 0x3c + IP_DUMMYNET_DEL = 0x3d + IP_DUMMYNET_FLUSH = 0x3e + IP_DUMMYNET_GET = 0x40 + IP_FAITH = 0x16 + IP_FW_ADD = 0x32 + IP_FW_DEL = 0x33 + IP_FW_FLUSH = 0x34 + IP_FW_GET = 0x36 + IP_FW_RESETLOG = 0x37 + IP_FW_X = 0x31 + IP_FW_ZERO = 0x35 + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x15 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x42 + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_MULTICAST_VIF = 0xe + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x1 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVTTL = 0x41 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RSVP_OFF = 0x10 + IP_RSVP_ON = 0xf + IP_RSVP_VIF_OFF = 0x12 + IP_RSVP_VIF_ON = 0x11 + IP_TOS = 0x3 + IP_TTL = 0x4 + ISIG = 0x80 + ISTRIP = 0x20 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + KERN_HOSTNAME = 0xa + KERN_OSRELEASE = 0x2 + KERN_OSTYPE = 0x1 + KERN_VERSION = 0x4 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_AUTOSYNC = 0x7 + MADV_CONTROL_END = 0xb + MADV_CONTROL_START = 0xa + MADV_CORE = 0x9 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x5 + MADV_INVAL = 0xa + MADV_NOCORE = 0x8 + MADV_NORMAL = 0x0 + MADV_NOSYNC = 0x6 + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_SETMAP = 0xb + MADV_WILLNEED = 0x3 + MAP_ANON = 0x1000 + MAP_ANONYMOUS = 0x1000 + MAP_COPY = 0x2 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_INHERIT = 0x80 + MAP_NOCORE = 0x20000 + MAP_NOEXTEND = 0x100 + MAP_NORESERVE = 0x40 + MAP_NOSYNC = 0x800 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_SHARED = 0x1 + MAP_SIZEALIGN = 0x40000 + MAP_STACK = 0x400 + MAP_TRYFIXED = 0x10000 + MAP_VPAGETABLE = 0x2000 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MNT_ASYNC = 0x40 + MNT_AUTOMOUNTED = 0x20 + MNT_CMDFLAGS = 0xf0000 + MNT_DEFEXPORTED = 0x200 + MNT_DELEXPORT = 0x20000 + MNT_EXKERB = 0x800 + MNT_EXPORTANON = 0x400 + MNT_EXPORTED = 0x100 + MNT_EXPUBLIC = 0x20000000 + MNT_EXRDONLY = 0x80 + MNT_FORCE = 0x80000 + MNT_IGNORE = 0x800000 + MNT_LAZY = 0x4 + MNT_LOCAL = 0x1000 + MNT_NOATIME = 0x10000000 + MNT_NOCLUSTERR = 0x40000000 + MNT_NOCLUSTERW = 0x80000000 + MNT_NODEV = 0x10 + MNT_NOEXEC = 0x4 + MNT_NOSUID = 0x8 + MNT_NOSYMFOLLOW = 0x400000 + MNT_NOWAIT = 0x2 + MNT_QUOTA = 0x2000 + MNT_RDONLY = 0x1 + MNT_RELOAD = 0x40000 + MNT_ROOTFS = 0x4000 + MNT_SOFTDEP = 0x200000 + MNT_SUIDDIR = 0x100000 + MNT_SYNCHRONOUS = 0x2 + MNT_TRIM = 0x1000000 + MNT_UPDATE = 0x10000 + MNT_USER = 0x8000 + MNT_VISFLAGMASK = 0xf1f0ffff + MNT_WAIT = 0x1 + MSG_CMSG_CLOEXEC = 0x1000 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOF = 0x100 + MSG_EOR = 0x8 + MSG_FBLOCKING = 0x10000 + MSG_FMASK = 0xffff0000 + MSG_FNONBLOCKING = 0x20000 + MSG_NOSIGNAL = 0x400 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_SYNC = 0x800 + MSG_TRUNC = 0x10 + MSG_UNUSED09 = 0x200 + MSG_WAITALL = 0x40 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x2 + MS_SYNC = 0x0 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_MAXID = 0x4 + NOFLSH = 0x80000000 + NOKERNINFO = 0x2000000 + NOTE_ATTRIB = 0x8 + NOTE_CHILD = 0x4 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXTEND = 0x4 + NOTE_FFAND = 0x40000000 + NOTE_FFCOPY = 0xc0000000 + NOTE_FFCTRLMASK = 0xc0000000 + NOTE_FFLAGSMASK = 0xffffff + NOTE_FFNOP = 0x0 + NOTE_FFOR = 0x80000000 + NOTE_FORK = 0x40000000 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_OOB = 0x2 + NOTE_PCTRLMASK = 0xf0000000 + NOTE_PDATAMASK = 0xfffff + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRIGGER = 0x1000000 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + OXTABS = 0x4 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x20000 + O_CREAT = 0x200 + O_DIRECT = 0x10000 + O_DIRECTORY = 0x8000000 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FAPPEND = 0x100000 + O_FASYNCWRITE = 0x800000 + O_FBLOCKING = 0x40000 + O_FMASK = 0xfc0000 + O_FNONBLOCKING = 0x80000 + O_FOFFSET = 0x200000 + O_FSYNC = 0x80 + O_FSYNCWRITE = 0x400000 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + RLIMIT_AS = 0xa + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_MEMLOCK = 0x6 + RLIMIT_NOFILE = 0x8 + RLIMIT_NPROC = 0x7 + RLIMIT_RSS = 0x5 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0xb + RTAX_MPLS1 = 0x8 + RTAX_MPLS2 = 0x9 + RTAX_MPLS3 = 0xa + RTAX_NETMASK = 0x2 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_MPLS1 = 0x100 + RTA_MPLS2 = 0x200 + RTA_MPLS3 = 0x400 + RTA_NETMASK = 0x4 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_CLONING = 0x100 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MODIFIED = 0x20 + RTF_MPLSOPS = 0x1000000 + RTF_MULTICAST = 0x800000 + RTF_PINNED = 0x100000 + RTF_PRCLONING = 0x10000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x40000 + RTF_REJECT = 0x8 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_WASCLONED = 0x20000 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DELMADDR = 0x10 + RTM_GET = 0x4 + RTM_IEEE80211 = 0x12 + RTM_IFANNOUNCE = 0x11 + RTM_IFINFO = 0xe + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_NEWMADDR = 0xf + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x6 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_IWCAPSEGS = 0x400 + RTV_IWMAXSEGS = 0x200 + RTV_MSL = 0x100 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + SCM_CREDS = 0x3 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x2 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCADDRT = 0x8040720a + SIOCAIFADDR = 0x8040691a + SIOCALIFADDR = 0x8118691b + SIOCATMARK = 0x40047307 + SIOCDELMULTI = 0x80206932 + SIOCDELRT = 0x8040720b + SIOCDIFADDR = 0x80206919 + SIOCDIFPHYADDR = 0x80206949 + SIOCDLIFADDR = 0x8118691d + SIOCGDRVSPEC = 0xc028697b + SIOCGETSGCNT = 0xc0207210 + SIOCGETVIFCNT = 0xc028720f + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0206921 + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCAP = 0xc020691f + SIOCGIFCONF = 0xc0106924 + SIOCGIFDATA = 0xc0206926 + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGENERIC = 0xc020693a + SIOCGIFGMEMB = 0xc028698a + SIOCGIFINDEX = 0xc0206920 + SIOCGIFMEDIA = 0xc0306938 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc0206933 + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206948 + SIOCGIFPHYS = 0xc0206935 + SIOCGIFPOLLCPU = 0xc020697e + SIOCGIFPSRCADDR = 0xc0206947 + SIOCGIFSTATUS = 0xc331693b + SIOCGIFTSOLEN = 0xc0206980 + SIOCGLIFADDR = 0xc118691c + SIOCGLIFPHYADDR = 0xc118694b + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCGPRIVATE_0 = 0xc0206950 + SIOCGPRIVATE_1 = 0xc0206951 + SIOCIFCREATE = 0xc020697a + SIOCIFCREATE2 = 0xc020697c + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc0106978 + SIOCSDRVSPEC = 0x8028697b + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFCAP = 0x8020691e + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGENERIC = 0x80206939 + SIOCSIFLLADDR = 0x8020693c + SIOCSIFMEDIA = 0xc0206937 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x80206934 + SIOCSIFNAME = 0x80206928 + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x80406946 + SIOCSIFPHYS = 0x80206936 + SIOCSIFPOLLCPU = 0x8020697d + SIOCSIFTSOLEN = 0x8020697f + SIOCSLIFPHYADDR = 0x8118694a + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SOCK_CLOEXEC = 0x10000000 + SOCK_DGRAM = 0x2 + SOCK_MAXADDRLEN = 0xff + SOCK_NONBLOCK = 0x20000000 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_ACCEPTFILTER = 0x1000 + SO_BROADCAST = 0x20 + SO_CPUHINT = 0x1030 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_NOSIGPIPE = 0x800 + SO_OOBINLINE = 0x100 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDSPACE = 0x100a + SO_SNDTIMEO = 0x1005 + SO_TIMESTAMP = 0x400 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDB = 0x9000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IFWHT = 0xe000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISTXT = 0x200 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TCIFLUSH = 0x1 + TCIOFF = 0x3 + TCIOFLUSH = 0x3 + TCION = 0x4 + TCOFLUSH = 0x2 + TCOOFF = 0x1 + TCOON = 0x2 + TCP_FASTKEEP = 0x80 + TCP_KEEPCNT = 0x400 + TCP_KEEPIDLE = 0x100 + TCP_KEEPINIT = 0x20 + TCP_KEEPINTVL = 0x200 + TCP_MAXBURST = 0x4 + TCP_MAXHLEN = 0x3c + TCP_MAXOLEN = 0x28 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MINMSS = 0x100 + TCP_MIN_WINSHIFT = 0x5 + TCP_MSS = 0x200 + TCP_NODELAY = 0x1 + TCP_NOOPT = 0x8 + TCP_NOPUSH = 0x4 + TCP_SIGNATURE_ENABLE = 0x10 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDCDTIMESTAMP = 0x40107458 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLUSH = 0x80047410 + TIOCGDRAINWAIT = 0x40047456 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGPGRP = 0x40047477 + TIOCGSID = 0x40047463 + TIOCGSIZE = 0x40087468 + TIOCGWINSZ = 0x40087468 + TIOCISPTMASTER = 0x20007455 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGDTRWAIT = 0x4004745a + TIOCMGET = 0x4004746a + TIOCMODG = 0x40047403 + TIOCMODS = 0x80047404 + TIOCMSDTRWAIT = 0x8004745b + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDRAINWAIT = 0x80047457 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSIG = 0x2000745f + TIOCSPGRP = 0x80047476 + TIOCSSIZE = 0x80087467 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x20007465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCTIMESTAMP = 0x40107459 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VCHECKPT = 0x13 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VERASE2 = 0x7 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VM_BCACHE_SIZE_MAX = 0x0 + VM_SWZONE_SIZE_MAX = 0x4000000000 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WCONTINUED = 0x4 + WCOREFLAG = 0x80 + WLINUXCLONE = 0x80000000 + WNOHANG = 0x1 + WSTOPPED = 0x7f + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EASYNC = syscall.Errno(0x63) + EAUTH = syscall.Errno(0x50) + EBADF = syscall.Errno(0x9) + EBADMSG = syscall.Errno(0x59) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x55) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDOM = syscall.Errno(0x21) + EDOOFUS = syscall.Errno(0x58) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x52) + EILSEQ = syscall.Errno(0x56) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x63) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5a) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x57) + ENOBUFS = syscall.Errno(0x37) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x5b) + ENOMEDIUM = syscall.Errno(0x5d) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x53) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x2d) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x54) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTO = syscall.Errno(0x5c) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUNUSED94 = syscall.Errno(0x5e) + EUNUSED95 = syscall.Errno(0x5f) + EUNUSED96 = syscall.Errno(0x60) + EUNUSED97 = syscall.Errno(0x61) + EUNUSED98 = syscall.Errno(0x62) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCKPT = syscall.Signal(0x21) + SIGCKPTEXIT = syscall.Signal(0x22) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTHR = syscall.Signal(0x20) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "device not configured"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EDEADLK", "resource deadlock avoided"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "cross-device link"}, + {19, "ENODEV", "operation not supported by device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "result too large"}, + {35, "EWOULDBLOCK", "resource temporarily unavailable"}, + {36, "EINPROGRESS", "operation now in progress"}, + {37, "EALREADY", "operation already in progress"}, + {38, "ENOTSOCK", "socket operation on non-socket"}, + {39, "EDESTADDRREQ", "destination address required"}, + {40, "EMSGSIZE", "message too long"}, + {41, "EPROTOTYPE", "protocol wrong type for socket"}, + {42, "ENOPROTOOPT", "protocol not available"}, + {43, "EPROTONOSUPPORT", "protocol not supported"}, + {44, "ESOCKTNOSUPPORT", "socket type not supported"}, + {45, "EOPNOTSUPP", "operation not supported"}, + {46, "EPFNOSUPPORT", "protocol family not supported"}, + {47, "EAFNOSUPPORT", "address family not supported by protocol family"}, + {48, "EADDRINUSE", "address already in use"}, + {49, "EADDRNOTAVAIL", "can't assign requested address"}, + {50, "ENETDOWN", "network is down"}, + {51, "ENETUNREACH", "network is unreachable"}, + {52, "ENETRESET", "network dropped connection on reset"}, + {53, "ECONNABORTED", "software caused connection abort"}, + {54, "ECONNRESET", "connection reset by peer"}, + {55, "ENOBUFS", "no buffer space available"}, + {56, "EISCONN", "socket is already connected"}, + {57, "ENOTCONN", "socket is not connected"}, + {58, "ESHUTDOWN", "can't send after socket shutdown"}, + {59, "ETOOMANYREFS", "too many references: can't splice"}, + {60, "ETIMEDOUT", "operation timed out"}, + {61, "ECONNREFUSED", "connection refused"}, + {62, "ELOOP", "too many levels of symbolic links"}, + {63, "ENAMETOOLONG", "file name too long"}, + {64, "EHOSTDOWN", "host is down"}, + {65, "EHOSTUNREACH", "no route to host"}, + {66, "ENOTEMPTY", "directory not empty"}, + {67, "EPROCLIM", "too many processes"}, + {68, "EUSERS", "too many users"}, + {69, "EDQUOT", "disc quota exceeded"}, + {70, "ESTALE", "stale NFS file handle"}, + {71, "EREMOTE", "too many levels of remote in path"}, + {72, "EBADRPC", "RPC struct is bad"}, + {73, "ERPCMISMATCH", "RPC version wrong"}, + {74, "EPROGUNAVAIL", "RPC prog. not avail"}, + {75, "EPROGMISMATCH", "program version wrong"}, + {76, "EPROCUNAVAIL", "bad procedure for program"}, + {77, "ENOLCK", "no locks available"}, + {78, "ENOSYS", "function not implemented"}, + {79, "EFTYPE", "inappropriate file type or format"}, + {80, "EAUTH", "authentication error"}, + {81, "ENEEDAUTH", "need authenticator"}, + {82, "EIDRM", "identifier removed"}, + {83, "ENOMSG", "no message of desired type"}, + {84, "EOVERFLOW", "value too large to be stored in data type"}, + {85, "ECANCELED", "operation canceled"}, + {86, "EILSEQ", "illegal byte sequence"}, + {87, "ENOATTR", "attribute not found"}, + {88, "EDOOFUS", "programming error"}, + {89, "EBADMSG", "bad message"}, + {90, "EMULTIHOP", "multihop attempted"}, + {91, "ENOLINK", "link has been severed"}, + {92, "EPROTO", "protocol error"}, + {93, "ENOMEDIUM", "no medium found"}, + {94, "EUNUSED94", "unknown error: 94"}, + {95, "EUNUSED95", "unknown error: 95"}, + {96, "EUNUSED96", "unknown error: 96"}, + {97, "EUNUSED97", "unknown error: 97"}, + {98, "EUNUSED98", "unknown error: 98"}, + {99, "ELAST", "unknown error: 99"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/BPT trap"}, + {6, "SIGIOT", "abort trap"}, + {7, "SIGEMT", "EMT trap"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGBUS", "bus error"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGSYS", "bad system call"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGURG", "urgent I/O condition"}, + {17, "SIGSTOP", "suspended (signal)"}, + {18, "SIGTSTP", "suspended"}, + {19, "SIGCONT", "continued"}, + {20, "SIGCHLD", "child exited"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGIO", "I/O possible"}, + {24, "SIGXCPU", "cputime limit exceeded"}, + {25, "SIGXFSZ", "filesize limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window size changes"}, + {29, "SIGINFO", "information request"}, + {30, "SIGUSR1", "user defined signal 1"}, + {31, "SIGUSR2", "user defined signal 2"}, + {32, "SIGTHR", "thread Scheduler"}, + {33, "SIGCKPT", "checkPoint"}, + {34, "SIGCKPTEXIT", "checkPointExit"}, +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go new file mode 100644 index 00000000..d2bbaabc --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go @@ -0,0 +1,1793 @@ +// mkerrors.sh -m32 +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build 386,freebsd + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m32 _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_ARP = 0x23 + AF_ATM = 0x1e + AF_BLUETOOTH = 0x24 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x25 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x1c + AF_INET6_SDP = 0x2a + AF_INET_SDP = 0x28 + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x2a + AF_NATM = 0x1d + AF_NETBIOS = 0x6 + AF_NETGRAPH = 0x20 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x11 + AF_SCLUSTER = 0x22 + AF_SIP = 0x18 + AF_SLOW = 0x21 + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VENDOR00 = 0x27 + AF_VENDOR01 = 0x29 + AF_VENDOR02 = 0x2b + AF_VENDOR03 = 0x2d + AF_VENDOR04 = 0x2f + AF_VENDOR05 = 0x31 + AF_VENDOR06 = 0x33 + AF_VENDOR07 = 0x35 + AF_VENDOR08 = 0x37 + AF_VENDOR09 = 0x39 + AF_VENDOR10 = 0x3b + AF_VENDOR11 = 0x3d + AF_VENDOR12 = 0x3f + AF_VENDOR13 = 0x41 + AF_VENDOR14 = 0x43 + AF_VENDOR15 = 0x45 + AF_VENDOR16 = 0x47 + AF_VENDOR17 = 0x49 + AF_VENDOR18 = 0x4b + AF_VENDOR19 = 0x4d + AF_VENDOR20 = 0x4f + AF_VENDOR21 = 0x51 + AF_VENDOR22 = 0x53 + AF_VENDOR23 = 0x55 + AF_VENDOR24 = 0x57 + AF_VENDOR25 = 0x59 + AF_VENDOR26 = 0x5b + AF_VENDOR27 = 0x5d + AF_VENDOR28 = 0x5f + AF_VENDOR29 = 0x61 + AF_VENDOR30 = 0x63 + AF_VENDOR31 = 0x65 + AF_VENDOR32 = 0x67 + AF_VENDOR33 = 0x69 + AF_VENDOR34 = 0x6b + AF_VENDOR35 = 0x6d + AF_VENDOR36 = 0x6f + AF_VENDOR37 = 0x71 + AF_VENDOR38 = 0x73 + AF_VENDOR39 = 0x75 + AF_VENDOR40 = 0x77 + AF_VENDOR41 = 0x79 + AF_VENDOR42 = 0x7b + AF_VENDOR43 = 0x7d + AF_VENDOR44 = 0x7f + AF_VENDOR45 = 0x81 + AF_VENDOR46 = 0x83 + AF_VENDOR47 = 0x85 + ALTWERASE = 0x200 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B460800 = 0x70800 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B921600 = 0xe1000 + B9600 = 0x2580 + BIOCFEEDBACK = 0x8004427c + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDIRECTION = 0x40044276 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc0084279 + BIOCGETBUFMODE = 0x4004427d + BIOCGETIF = 0x4020426b + BIOCGETZMAX = 0x4004427f + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044272 + BIOCGRTIMEOUT = 0x4008426e + BIOCGSEESENT = 0x40044276 + BIOCGSTATS = 0x4008426f + BIOCGTSTAMP = 0x40044283 + BIOCIMMEDIATE = 0x80044270 + BIOCLOCK = 0x2000427a + BIOCPROMISC = 0x20004269 + BIOCROTZBUF = 0x400c4280 + BIOCSBLEN = 0xc0044266 + BIOCSDIRECTION = 0x80044277 + BIOCSDLT = 0x80044278 + BIOCSETBUFMODE = 0x8004427e + BIOCSETF = 0x80084267 + BIOCSETFNR = 0x80084282 + BIOCSETIF = 0x8020426c + BIOCSETWF = 0x8008427b + BIOCSETZBUF = 0x800c4281 + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044273 + BIOCSRTIMEOUT = 0x8008426d + BIOCSSEESENT = 0x80044277 + BIOCSTSTAMP = 0x80044284 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_BUFMODE_BUFFER = 0x1 + BPF_BUFMODE_ZBUF = 0x2 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x80000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_T_BINTIME = 0x2 + BPF_T_BINTIME_FAST = 0x102 + BPF_T_BINTIME_MONOTONIC = 0x202 + BPF_T_BINTIME_MONOTONIC_FAST = 0x302 + BPF_T_FAST = 0x100 + BPF_T_FLAG_MASK = 0x300 + BPF_T_FORMAT_MASK = 0x3 + BPF_T_MICROTIME = 0x0 + BPF_T_MICROTIME_FAST = 0x100 + BPF_T_MICROTIME_MONOTONIC = 0x200 + BPF_T_MICROTIME_MONOTONIC_FAST = 0x300 + BPF_T_MONOTONIC = 0x200 + BPF_T_MONOTONIC_FAST = 0x300 + BPF_T_NANOTIME = 0x1 + BPF_T_NANOTIME_FAST = 0x101 + BPF_T_NANOTIME_MONOTONIC = 0x201 + BPF_T_NANOTIME_MONOTONIC_FAST = 0x301 + BPF_T_NONE = 0x3 + BPF_T_NORMAL = 0x0 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + CAP_ACCEPT = 0x200000020000000 + CAP_ACL_CHECK = 0x400000000010000 + CAP_ACL_DELETE = 0x400000000020000 + CAP_ACL_GET = 0x400000000040000 + CAP_ACL_SET = 0x400000000080000 + CAP_ALL0 = 0x20007ffffffffff + CAP_ALL1 = 0x4000000001fffff + CAP_BIND = 0x200000040000000 + CAP_BINDAT = 0x200008000000400 + CAP_CHFLAGSAT = 0x200000000001400 + CAP_CONNECT = 0x200000080000000 + CAP_CONNECTAT = 0x200010000000400 + CAP_CREATE = 0x200000000000040 + CAP_EVENT = 0x400000000000020 + CAP_EXTATTR_DELETE = 0x400000000001000 + CAP_EXTATTR_GET = 0x400000000002000 + CAP_EXTATTR_LIST = 0x400000000004000 + CAP_EXTATTR_SET = 0x400000000008000 + CAP_FCHDIR = 0x200000000000800 + CAP_FCHFLAGS = 0x200000000001000 + CAP_FCHMOD = 0x200000000002000 + CAP_FCHMODAT = 0x200000000002400 + CAP_FCHOWN = 0x200000000004000 + CAP_FCHOWNAT = 0x200000000004400 + CAP_FCNTL = 0x200000000008000 + CAP_FCNTL_ALL = 0x78 + CAP_FCNTL_GETFL = 0x8 + CAP_FCNTL_GETOWN = 0x20 + CAP_FCNTL_SETFL = 0x10 + CAP_FCNTL_SETOWN = 0x40 + CAP_FEXECVE = 0x200000000000080 + CAP_FLOCK = 0x200000000010000 + CAP_FPATHCONF = 0x200000000020000 + CAP_FSCK = 0x200000000040000 + CAP_FSTAT = 0x200000000080000 + CAP_FSTATAT = 0x200000000080400 + CAP_FSTATFS = 0x200000000100000 + CAP_FSYNC = 0x200000000000100 + CAP_FTRUNCATE = 0x200000000000200 + CAP_FUTIMES = 0x200000000200000 + CAP_FUTIMESAT = 0x200000000200400 + CAP_GETPEERNAME = 0x200000100000000 + CAP_GETSOCKNAME = 0x200000200000000 + CAP_GETSOCKOPT = 0x200000400000000 + CAP_IOCTL = 0x400000000000080 + CAP_IOCTLS_ALL = 0x7fffffff + CAP_KQUEUE = 0x400000000100040 + CAP_KQUEUE_CHANGE = 0x400000000100000 + CAP_KQUEUE_EVENT = 0x400000000000040 + CAP_LINKAT_SOURCE = 0x200020000000400 + CAP_LINKAT_TARGET = 0x200000000400400 + CAP_LISTEN = 0x200000800000000 + CAP_LOOKUP = 0x200000000000400 + CAP_MAC_GET = 0x400000000000001 + CAP_MAC_SET = 0x400000000000002 + CAP_MKDIRAT = 0x200000000800400 + CAP_MKFIFOAT = 0x200000001000400 + CAP_MKNODAT = 0x200000002000400 + CAP_MMAP = 0x200000000000010 + CAP_MMAP_R = 0x20000000000001d + CAP_MMAP_RW = 0x20000000000001f + CAP_MMAP_RWX = 0x20000000000003f + CAP_MMAP_RX = 0x20000000000003d + CAP_MMAP_W = 0x20000000000001e + CAP_MMAP_WX = 0x20000000000003e + CAP_MMAP_X = 0x20000000000003c + CAP_PDGETPID = 0x400000000000200 + CAP_PDKILL = 0x400000000000800 + CAP_PDWAIT = 0x400000000000400 + CAP_PEELOFF = 0x200001000000000 + CAP_POLL_EVENT = 0x400000000000020 + CAP_PREAD = 0x20000000000000d + CAP_PWRITE = 0x20000000000000e + CAP_READ = 0x200000000000001 + CAP_RECV = 0x200000000000001 + CAP_RENAMEAT_SOURCE = 0x200000004000400 + CAP_RENAMEAT_TARGET = 0x200040000000400 + CAP_RIGHTS_VERSION = 0x0 + CAP_RIGHTS_VERSION_00 = 0x0 + CAP_SEEK = 0x20000000000000c + CAP_SEEK_TELL = 0x200000000000004 + CAP_SEM_GETVALUE = 0x400000000000004 + CAP_SEM_POST = 0x400000000000008 + CAP_SEM_WAIT = 0x400000000000010 + CAP_SEND = 0x200000000000002 + CAP_SETSOCKOPT = 0x200002000000000 + CAP_SHUTDOWN = 0x200004000000000 + CAP_SOCK_CLIENT = 0x200007780000003 + CAP_SOCK_SERVER = 0x200007f60000003 + CAP_SYMLINKAT = 0x200000008000400 + CAP_TTYHOOK = 0x400000000000100 + CAP_UNLINKAT = 0x200000010000400 + CAP_UNUSED0_44 = 0x200080000000000 + CAP_UNUSED0_57 = 0x300000000000000 + CAP_UNUSED1_22 = 0x400000000200000 + CAP_UNUSED1_57 = 0x500000000000000 + CAP_WRITE = 0x200000000000002 + CFLUSH = 0xf + CLOCAL = 0x8000 + CLOCK_MONOTONIC = 0x4 + CLOCK_MONOTONIC_FAST = 0xc + CLOCK_MONOTONIC_PRECISE = 0xb + CLOCK_PROCESS_CPUTIME_ID = 0xf + CLOCK_PROF = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_FAST = 0xa + CLOCK_REALTIME_PRECISE = 0x9 + CLOCK_SECOND = 0xd + CLOCK_THREAD_CPUTIME_ID = 0xe + CLOCK_UPTIME = 0x5 + CLOCK_UPTIME_FAST = 0x8 + CLOCK_UPTIME_PRECISE = 0x7 + CLOCK_VIRTUAL = 0x1 + CREAD = 0x800 + CRTSCTS = 0x30000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_HW = 0x6 + CTL_KERN = 0x1 + CTL_MAXNAME = 0x18 + CTL_NET = 0x4 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_BREDR_BB = 0xff + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_BLUETOOTH_LE_LL = 0xfb + DLT_BLUETOOTH_LE_LL_WITH_PHDR = 0x100 + DLT_BLUETOOTH_LINUX_MONITOR = 0xfe + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CHDLC = 0x68 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DBUS = 0xe7 + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_DVB_CI = 0xeb + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_EPON = 0x103 + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_HHDLC = 0x79 + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NOFCS = 0xe6 + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_INFINIBAND = 0xf7 + DLT_IPFILTER = 0x74 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPMI_HPM_2 = 0x104 + DLT_IPNET = 0xe2 + DLT_IPOIB = 0xf2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_ATM_CEMIC = 0xee + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FIBRECHANNEL = 0xea + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_SRX_E2E = 0xe9 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_JUNIPER_VS = 0xe8 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_PPP_WITHDIRECTION = 0xa6 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MATCHING_MAX = 0x104 + DLT_MATCHING_MIN = 0x68 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPEG_2_TS = 0xf3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_MUX27010 = 0xec + DLT_NETANALYZER = 0xf0 + DLT_NETANALYZER_TRANSPARENT = 0xf1 + DLT_NETLINK = 0xfd + DLT_NFC_LLCP = 0xf5 + DLT_NFLOG = 0xef + DLT_NG40 = 0xf4 + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x79 + DLT_PKTAP = 0x102 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PPP_WITH_DIRECTION = 0xa6 + DLT_PRISM_HEADER = 0x77 + DLT_PROFIBUS_DL = 0x101 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RIO = 0x7c + DLT_RTAC_SERIAL = 0xfa + DLT_SCCP = 0x8e + DLT_SCTP = 0xf8 + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DLT_STANAG_5066_D_PDU = 0xed + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USBPCAP = 0xf9 + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_USER0 = 0x93 + DLT_USER1 = 0x94 + DLT_USER10 = 0x9d + DLT_USER11 = 0x9e + DLT_USER12 = 0x9f + DLT_USER13 = 0xa0 + DLT_USER14 = 0xa1 + DLT_USER15 = 0xa2 + DLT_USER2 = 0x95 + DLT_USER3 = 0x96 + DLT_USER4 = 0x97 + DLT_USER5 = 0x98 + DLT_USER6 = 0x99 + DLT_USER7 = 0x9a + DLT_USER8 = 0x9b + DLT_USER9 = 0x9c + DLT_WIHART = 0xdf + DLT_WIRESHARK_UPPER_PDU = 0xfc + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EVFILT_AIO = -0x3 + EVFILT_FS = -0x9 + EVFILT_LIO = -0xa + EVFILT_PROC = -0x5 + EVFILT_PROCDESC = -0x8 + EVFILT_READ = -0x1 + EVFILT_SENDFILE = -0xc + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0xc + EVFILT_TIMER = -0x7 + EVFILT_USER = -0xb + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_DISPATCH = 0x80 + EV_DROP = 0x1000 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_FLAG2 = 0x4000 + EV_FORCEONESHOT = 0x100 + EV_ONESHOT = 0x10 + EV_RECEIPT = 0x40 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTATTR_NAMESPACE_EMPTY = 0x0 + EXTATTR_NAMESPACE_SYSTEM = 0x2 + EXTATTR_NAMESPACE_USER = 0x1 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FLUSHO = 0x800000 + F_CANCEL = 0x5 + F_DUP2FD = 0xa + F_DUP2FD_CLOEXEC = 0x12 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x11 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0xb + F_GETOWN = 0x5 + F_OGETLK = 0x7 + F_OK = 0x0 + F_OSETLK = 0x8 + F_OSETLKW = 0x9 + F_RDAHEAD = 0x10 + F_RDLCK = 0x1 + F_READAHEAD = 0xf + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0xc + F_SETLKW = 0xd + F_SETLK_REMOTE = 0xe + F_SETOWN = 0x6 + F_UNLCK = 0x2 + F_UNLCKSYS = 0x4 + F_WRLCK = 0x3 + HUPCL = 0x4000 + HW_MACHINE = 0x1 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFAN_ARRIVAL = 0x0 + IFAN_DEPARTURE = 0x1 + IFF_ALLMULTI = 0x200 + IFF_ALTPHYS = 0x4000 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x218f52 + IFF_CANTCONFIG = 0x10000 + IFF_DEBUG = 0x4 + IFF_DRV_OACTIVE = 0x400 + IFF_DRV_RUNNING = 0x40 + IFF_DYING = 0x200000 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MONITOR = 0x40000 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PPROMISC = 0x20000 + IFF_PROMISC = 0x100 + IFF_RENAMING = 0x400000 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_STATICARP = 0x80000 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_BRIDGE = 0xd1 + IFT_CARP = 0xf8 + IFT_IEEE1394 = 0x90 + IFT_INFINIBAND = 0xc7 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_PPP = 0x17 + IFT_PROPVIRTUAL = 0x35 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IN_RFC3021_MASK = 0xfffffffe + IPPROTO_3PC = 0x22 + IPPROTO_ADFS = 0x44 + IPPROTO_AH = 0x33 + IPPROTO_AHIP = 0x3d + IPPROTO_APES = 0x63 + IPPROTO_ARGUS = 0xd + IPPROTO_AX25 = 0x5d + IPPROTO_BHA = 0x31 + IPPROTO_BLT = 0x1e + IPPROTO_BRSATMON = 0x4c + IPPROTO_CARP = 0x70 + IPPROTO_CFTP = 0x3e + IPPROTO_CHAOS = 0x10 + IPPROTO_CMTP = 0x26 + IPPROTO_CPHB = 0x49 + IPPROTO_CPNX = 0x48 + IPPROTO_DDP = 0x25 + IPPROTO_DGP = 0x56 + IPPROTO_DIVERT = 0x102 + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_EMCON = 0xe + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GMTP = 0x64 + IPPROTO_GRE = 0x2f + IPPROTO_HELLO = 0x3f + IPPROTO_HIP = 0x8b + IPPROTO_HMP = 0x14 + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IDPR = 0x23 + IPPROTO_IDRP = 0x2d + IPPROTO_IGMP = 0x2 + IPPROTO_IGP = 0x55 + IPPROTO_IGRP = 0x58 + IPPROTO_IL = 0x28 + IPPROTO_INLSP = 0x34 + IPPROTO_INP = 0x20 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPCV = 0x47 + IPPROTO_IPEIP = 0x5e + IPPROTO_IPIP = 0x4 + IPPROTO_IPPC = 0x43 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IRTP = 0x1c + IPPROTO_KRYPTOLAN = 0x41 + IPPROTO_LARP = 0x5b + IPPROTO_LEAF1 = 0x19 + IPPROTO_LEAF2 = 0x1a + IPPROTO_MAX = 0x100 + IPPROTO_MEAS = 0x13 + IPPROTO_MH = 0x87 + IPPROTO_MHRP = 0x30 + IPPROTO_MICP = 0x5f + IPPROTO_MOBILE = 0x37 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_MUX = 0x12 + IPPROTO_ND = 0x4d + IPPROTO_NHRP = 0x36 + IPPROTO_NONE = 0x3b + IPPROTO_NSP = 0x1f + IPPROTO_NVPII = 0xb + IPPROTO_OLD_DIVERT = 0xfe + IPPROTO_OSPFIGP = 0x59 + IPPROTO_PFSYNC = 0xf0 + IPPROTO_PGM = 0x71 + IPPROTO_PIGP = 0x9 + IPPROTO_PIM = 0x67 + IPPROTO_PRM = 0x15 + IPPROTO_PUP = 0xc + IPPROTO_PVP = 0x4b + IPPROTO_RAW = 0xff + IPPROTO_RCCMON = 0xa + IPPROTO_RDP = 0x1b + IPPROTO_RESERVED_253 = 0xfd + IPPROTO_RESERVED_254 = 0xfe + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_RVD = 0x42 + IPPROTO_SATEXPAK = 0x40 + IPPROTO_SATMON = 0x45 + IPPROTO_SCCSP = 0x60 + IPPROTO_SCTP = 0x84 + IPPROTO_SDRP = 0x2a + IPPROTO_SEND = 0x103 + IPPROTO_SEP = 0x21 + IPPROTO_SHIM6 = 0x8c + IPPROTO_SKIP = 0x39 + IPPROTO_SPACER = 0x7fff + IPPROTO_SRPC = 0x5a + IPPROTO_ST = 0x7 + IPPROTO_SVMTP = 0x52 + IPPROTO_SWIPE = 0x35 + IPPROTO_TCF = 0x57 + IPPROTO_TCP = 0x6 + IPPROTO_TLSP = 0x38 + IPPROTO_TP = 0x1d + IPPROTO_TPXX = 0x27 + IPPROTO_TRUNK1 = 0x17 + IPPROTO_TRUNK2 = 0x18 + IPPROTO_TTP = 0x54 + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPPROTO_VINES = 0x53 + IPPROTO_VISA = 0x46 + IPPROTO_VMTP = 0x51 + IPPROTO_WBEXPAK = 0x4f + IPPROTO_WBMON = 0x4e + IPPROTO_WSN = 0x4a + IPPROTO_XNET = 0xf + IPPROTO_XTP = 0x24 + IPV6_AUTOFLOWLABEL = 0x3b + IPV6_BINDANY = 0x40 + IPV6_BINDMULTI = 0x41 + IPV6_BINDV6ONLY = 0x1b + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_FLOWID = 0x43 + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FLOWTYPE = 0x44 + IPV6_FRAGTTL = 0x78 + IPV6_FW_ADD = 0x1e + IPV6_FW_DEL = 0x1f + IPV6_FW_FLUSH = 0x20 + IPV6_FW_GET = 0x22 + IPV6_FW_ZERO = 0x21 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXOPTHDR = 0x800 + IPV6_MAXPACKET = 0xffff + IPV6_MAX_GROUP_SRC_FILTER = 0x200 + IPV6_MAX_MEMBERSHIPS = 0xfff + IPV6_MAX_SOCK_SRC_FILTER = 0x80 + IPV6_MIN_MEMBERSHIPS = 0x1f + IPV6_MMTU = 0x500 + IPV6_MSFILTER = 0x4a + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_PATHMTU = 0x2c + IPV6_PKTINFO = 0x2e + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_PREFER_TEMPADDR = 0x3f + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVFLOWID = 0x46 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRSSBUCKETID = 0x47 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RSSBUCKETID = 0x45 + IPV6_RSS_LISTEN_BUCKET = 0x42 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_ADD_SOURCE_MEMBERSHIP = 0x46 + IP_BINDANY = 0x18 + IP_BINDMULTI = 0x19 + IP_BLOCK_SOURCE = 0x48 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DONTFRAG = 0x43 + IP_DROP_MEMBERSHIP = 0xd + IP_DROP_SOURCE_MEMBERSHIP = 0x47 + IP_DUMMYNET3 = 0x31 + IP_DUMMYNET_CONFIGURE = 0x3c + IP_DUMMYNET_DEL = 0x3d + IP_DUMMYNET_FLUSH = 0x3e + IP_DUMMYNET_GET = 0x40 + IP_FLOWID = 0x5a + IP_FLOWTYPE = 0x5b + IP_FW3 = 0x30 + IP_FW_ADD = 0x32 + IP_FW_DEL = 0x33 + IP_FW_FLUSH = 0x34 + IP_FW_GET = 0x36 + IP_FW_NAT_CFG = 0x38 + IP_FW_NAT_DEL = 0x39 + IP_FW_NAT_GET_CONFIG = 0x3a + IP_FW_NAT_GET_LOG = 0x3b + IP_FW_RESETLOG = 0x37 + IP_FW_TABLE_ADD = 0x28 + IP_FW_TABLE_DEL = 0x29 + IP_FW_TABLE_FLUSH = 0x2a + IP_FW_TABLE_GETSIZE = 0x2b + IP_FW_TABLE_LIST = 0x2c + IP_FW_ZERO = 0x35 + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x15 + IP_MAXPACKET = 0xffff + IP_MAX_GROUP_SRC_FILTER = 0x200 + IP_MAX_MEMBERSHIPS = 0xfff + IP_MAX_SOCK_MUTE_FILTER = 0x80 + IP_MAX_SOCK_SRC_FILTER = 0x80 + IP_MAX_SOURCE_FILTER = 0x400 + IP_MF = 0x2000 + IP_MINTTL = 0x42 + IP_MIN_MEMBERSHIPS = 0x1f + IP_MSFILTER = 0x4a + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_MULTICAST_VIF = 0xe + IP_OFFMASK = 0x1fff + IP_ONESBCAST = 0x17 + IP_OPTIONS = 0x1 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVFLOWID = 0x5d + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVRSSBUCKETID = 0x5e + IP_RECVTOS = 0x44 + IP_RECVTTL = 0x41 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RSSBUCKETID = 0x5c + IP_RSS_LISTEN_BUCKET = 0x1a + IP_RSVP_OFF = 0x10 + IP_RSVP_ON = 0xf + IP_RSVP_VIF_OFF = 0x12 + IP_RSVP_VIF_ON = 0x11 + IP_SENDSRCADDR = 0x7 + IP_TOS = 0x3 + IP_TTL = 0x4 + IP_UNBLOCK_SOURCE = 0x49 + ISIG = 0x80 + ISTRIP = 0x20 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + KERN_HOSTNAME = 0xa + KERN_OSRELEASE = 0x2 + KERN_OSTYPE = 0x1 + KERN_VERSION = 0x4 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_AUTOSYNC = 0x7 + MADV_CORE = 0x9 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x5 + MADV_NOCORE = 0x8 + MADV_NORMAL = 0x0 + MADV_NOSYNC = 0x6 + MADV_PROTECT = 0xa + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_WILLNEED = 0x3 + MAP_ALIGNED_SUPER = 0x1000000 + MAP_ALIGNMENT_MASK = -0x1000000 + MAP_ALIGNMENT_SHIFT = 0x18 + MAP_ANON = 0x1000 + MAP_ANONYMOUS = 0x1000 + MAP_COPY = 0x2 + MAP_EXCL = 0x4000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_NOCORE = 0x20000 + MAP_NOSYNC = 0x800 + MAP_PREFAULT_READ = 0x40000 + MAP_PRIVATE = 0x2 + MAP_RESERVED0020 = 0x20 + MAP_RESERVED0040 = 0x40 + MAP_RESERVED0080 = 0x80 + MAP_RESERVED0100 = 0x100 + MAP_SHARED = 0x1 + MAP_STACK = 0x400 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MNT_ACLS = 0x8000000 + MNT_ASYNC = 0x40 + MNT_AUTOMOUNTED = 0x200000000 + MNT_BYFSID = 0x8000000 + MNT_CMDFLAGS = 0xd0f0000 + MNT_DEFEXPORTED = 0x200 + MNT_DELEXPORT = 0x20000 + MNT_EXKERB = 0x800 + MNT_EXPORTANON = 0x400 + MNT_EXPORTED = 0x100 + MNT_EXPUBLIC = 0x20000000 + MNT_EXRDONLY = 0x80 + MNT_FORCE = 0x80000 + MNT_GJOURNAL = 0x2000000 + MNT_IGNORE = 0x800000 + MNT_LAZY = 0x3 + MNT_LOCAL = 0x1000 + MNT_MULTILABEL = 0x4000000 + MNT_NFS4ACLS = 0x10 + MNT_NOATIME = 0x10000000 + MNT_NOCLUSTERR = 0x40000000 + MNT_NOCLUSTERW = 0x80000000 + MNT_NOEXEC = 0x4 + MNT_NONBUSY = 0x4000000 + MNT_NOSUID = 0x8 + MNT_NOSYMFOLLOW = 0x400000 + MNT_NOWAIT = 0x2 + MNT_QUOTA = 0x2000 + MNT_RDONLY = 0x1 + MNT_RELOAD = 0x40000 + MNT_ROOTFS = 0x4000 + MNT_SNAPSHOT = 0x1000000 + MNT_SOFTDEP = 0x200000 + MNT_SUIDDIR = 0x100000 + MNT_SUJ = 0x100000000 + MNT_SUSPEND = 0x4 + MNT_SYNCHRONOUS = 0x2 + MNT_UNION = 0x20 + MNT_UPDATE = 0x10000 + MNT_UPDATEMASK = 0x2d8d0807e + MNT_USER = 0x8000 + MNT_VISFLAGMASK = 0x3fef0ffff + MNT_WAIT = 0x1 + MSG_CMSG_CLOEXEC = 0x40000 + MSG_COMPAT = 0x8000 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOF = 0x100 + MSG_EOR = 0x8 + MSG_NBIO = 0x4000 + MSG_NOSIGNAL = 0x20000 + MSG_NOTIFICATION = 0x2000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MSG_WAITFORONE = 0x80000 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x2 + MS_SYNC = 0x0 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_IFLISTL = 0x5 + NET_RT_IFMALIST = 0x4 + NOFLSH = 0x80000000 + NOKERNINFO = 0x2000000 + NOTE_ATTRIB = 0x8 + NOTE_CHILD = 0x4 + NOTE_CLOSE = 0x100 + NOTE_CLOSE_WRITE = 0x200 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXTEND = 0x4 + NOTE_FFAND = 0x40000000 + NOTE_FFCOPY = 0xc0000000 + NOTE_FFCTRLMASK = 0xc0000000 + NOTE_FFLAGSMASK = 0xffffff + NOTE_FFNOP = 0x0 + NOTE_FFOR = 0x80000000 + NOTE_FILE_POLL = 0x2 + NOTE_FORK = 0x40000000 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_MSECONDS = 0x2 + NOTE_NSECONDS = 0x8 + NOTE_OPEN = 0x80 + NOTE_PCTRLMASK = 0xf0000000 + NOTE_PDATAMASK = 0xfffff + NOTE_READ = 0x400 + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_SECONDS = 0x1 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRIGGER = 0x1000000 + NOTE_USECONDS = 0x4 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + OXTABS = 0x4 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x100000 + O_CREAT = 0x200 + O_DIRECT = 0x10000 + O_DIRECTORY = 0x20000 + O_EXCL = 0x800 + O_EXEC = 0x40000 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_TTY_INIT = 0x80000 + O_VERIFY = 0x200000 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + RLIMIT_AS = 0xa + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_MEMLOCK = 0x6 + RLIMIT_NOFILE = 0x8 + RLIMIT_NPROC = 0x7 + RLIMIT_RSS = 0x5 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x8 + RTAX_NETMASK = 0x2 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_FIXEDMTU = 0x80000 + RTF_FMASK = 0x1004d808 + RTF_GATEWAY = 0x2 + RTF_GWFLAG_COMPAT = 0x80000000 + RTF_HOST = 0x4 + RTF_LLDATA = 0x400 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MODIFIED = 0x20 + RTF_MULTICAST = 0x800000 + RTF_PINNED = 0x100000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x40000 + RTF_REJECT = 0x8 + RTF_RNH_LOCKED = 0x40000000 + RTF_STATIC = 0x800 + RTF_STICKY = 0x10000000 + RTF_UP = 0x1 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DELMADDR = 0x10 + RTM_GET = 0x4 + RTM_IEEE80211 = 0x12 + RTM_IFANNOUNCE = 0x11 + RTM_IFINFO = 0xe + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_NEWMADDR = 0xf + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RTV_WEIGHT = 0x100 + RT_ALL_FIBS = -0x1 + RT_BLACKHOLE = 0x40 + RT_CACHING_CONTEXT = 0x1 + RT_DEFAULT_FIB = 0x0 + RT_HAS_GW = 0x80 + RT_HAS_HEADER = 0x10 + RT_HAS_HEADER_BIT = 0x4 + RT_L2_ME = 0x4 + RT_L2_ME_BIT = 0x2 + RT_LLE_CACHE = 0x100 + RT_MAY_LOOP = 0x8 + RT_MAY_LOOP_BIT = 0x3 + RT_NORTREF = 0x2 + RT_REJECT = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_BINTIME = 0x4 + SCM_CREDS = 0x3 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x2 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCAIFADDR = 0x8040691a + SIOCAIFGROUP = 0x80246987 + SIOCATMARK = 0x40047307 + SIOCDELMULTI = 0x80206932 + SIOCDIFADDR = 0x80206919 + SIOCDIFGROUP = 0x80246989 + SIOCDIFPHYADDR = 0x80206949 + SIOCGDRVSPEC = 0xc01c697b + SIOCGETSGCNT = 0xc0147210 + SIOCGETVIFCNT = 0xc014720f + SIOCGHIWAT = 0x40047301 + SIOCGI2C = 0xc020693d + SIOCGIFADDR = 0xc0206921 + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCAP = 0xc020691f + SIOCGIFCONF = 0xc0086924 + SIOCGIFDESCR = 0xc020692a + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFIB = 0xc020695c + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGENERIC = 0xc020693a + SIOCGIFGMEMB = 0xc024698a + SIOCGIFGROUP = 0xc0246988 + SIOCGIFINDEX = 0xc0206920 + SIOCGIFMAC = 0xc0206926 + SIOCGIFMEDIA = 0xc0286938 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc0206933 + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206948 + SIOCGIFPHYS = 0xc0206935 + SIOCGIFPSRCADDR = 0xc0206947 + SIOCGIFSTATUS = 0xc331693b + SIOCGIFXMEDIA = 0xc028698b + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCGPRIVATE_0 = 0xc0206950 + SIOCGPRIVATE_1 = 0xc0206951 + SIOCGTUNFIB = 0xc020695e + SIOCIFCREATE = 0xc020697a + SIOCIFCREATE2 = 0xc020697c + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc00c6978 + SIOCSDRVSPEC = 0x801c697b + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFCAP = 0x8020691e + SIOCSIFDESCR = 0x80206929 + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFIB = 0x8020695d + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGENERIC = 0x80206939 + SIOCSIFLLADDR = 0x8020693c + SIOCSIFMAC = 0x80206927 + SIOCSIFMEDIA = 0xc0206937 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x80206934 + SIOCSIFNAME = 0x80206928 + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x80406946 + SIOCSIFPHYS = 0x80206936 + SIOCSIFRVNET = 0xc020695b + SIOCSIFVNET = 0xc020695a + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SIOCSTUNFIB = 0x8020695f + SOCK_CLOEXEC = 0x10000000 + SOCK_DGRAM = 0x2 + SOCK_MAXADDRLEN = 0xff + SOCK_NONBLOCK = 0x20000000 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_ACCEPTFILTER = 0x1000 + SO_BINTIME = 0x2000 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LABEL = 0x1009 + SO_LINGER = 0x80 + SO_LISTENINCQLEN = 0x1013 + SO_LISTENQLEN = 0x1012 + SO_LISTENQLIMIT = 0x1011 + SO_NOSIGPIPE = 0x800 + SO_NO_DDP = 0x8000 + SO_NO_OFFLOAD = 0x4000 + SO_OOBINLINE = 0x100 + SO_PEERLABEL = 0x1010 + SO_PROTOCOL = 0x1016 + SO_PROTOTYPE = 0x1016 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_SETFIB = 0x1014 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_TIMESTAMP = 0x400 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + SO_USER_COOKIE = 0x1015 + SO_VENDOR = 0x80000000 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IFWHT = 0xe000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISTXT = 0x200 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB3 = 0x4 + TABDLY = 0x4 + TCIFLUSH = 0x1 + TCIOFF = 0x3 + TCIOFLUSH = 0x3 + TCION = 0x4 + TCOFLUSH = 0x2 + TCOOFF = 0x1 + TCOON = 0x2 + TCP_CA_NAME_MAX = 0x10 + TCP_CCALGOOPT = 0x41 + TCP_CONGESTION = 0x40 + TCP_FASTOPEN = 0x401 + TCP_FUNCTION_BLK = 0x2000 + TCP_FUNCTION_NAME_LEN_MAX = 0x20 + TCP_INFO = 0x20 + TCP_KEEPCNT = 0x400 + TCP_KEEPIDLE = 0x100 + TCP_KEEPINIT = 0x80 + TCP_KEEPINTVL = 0x200 + TCP_MAXBURST = 0x4 + TCP_MAXHLEN = 0x3c + TCP_MAXOLEN = 0x28 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x4 + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0x10 + TCP_MINMSS = 0xd8 + TCP_MSS = 0x218 + TCP_NODELAY = 0x1 + TCP_NOOPT = 0x8 + TCP_NOPUSH = 0x4 + TCP_PCAP_IN = 0x1000 + TCP_PCAP_OUT = 0x800 + TCP_VENDOR = 0x80000000 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLUSH = 0x80047410 + TIOCGDRAINWAIT = 0x40047456 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGPGRP = 0x40047477 + TIOCGPTN = 0x4004740f + TIOCGSID = 0x40047463 + TIOCGWINSZ = 0x40087468 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGDTRWAIT = 0x4004745a + TIOCMGET = 0x4004746a + TIOCMSDTRWAIT = 0x8004745b + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DCD = 0x40 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCPTMASTER = 0x2000741c + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDRAINWAIT = 0x80047457 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSIG = 0x2004745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x20007465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCTIMESTAMP = 0x40087459 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VERASE2 = 0x7 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WCONTINUED = 0x4 + WCOREFLAG = 0x80 + WEXITED = 0x10 + WLINUXCLONE = 0x80000000 + WNOHANG = 0x1 + WNOWAIT = 0x8 + WSTOPPED = 0x2 + WTRAPPED = 0x20 + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADF = syscall.Errno(0x9) + EBADMSG = syscall.Errno(0x59) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x55) + ECAPMODE = syscall.Errno(0x5e) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDOM = syscall.Errno(0x21) + EDOOFUS = syscall.Errno(0x58) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x52) + EILSEQ = syscall.Errno(0x56) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x60) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5a) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x57) + ENOBUFS = syscall.Errno(0x37) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x5b) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x53) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCAPABLE = syscall.Errno(0x5d) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTRECOVERABLE = syscall.Errno(0x5f) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x2d) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x54) + EOWNERDEAD = syscall.Errno(0x60) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTO = syscall.Errno(0x5c) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGLIBRT = syscall.Signal(0x21) + SIGLWP = syscall.Signal(0x20) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTHR = syscall.Signal(0x20) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "device not configured"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EDEADLK", "resource deadlock avoided"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "cross-device link"}, + {19, "ENODEV", "operation not supported by device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "result too large"}, + {35, "EAGAIN", "resource temporarily unavailable"}, + {36, "EINPROGRESS", "operation now in progress"}, + {37, "EALREADY", "operation already in progress"}, + {38, "ENOTSOCK", "socket operation on non-socket"}, + {39, "EDESTADDRREQ", "destination address required"}, + {40, "EMSGSIZE", "message too long"}, + {41, "EPROTOTYPE", "protocol wrong type for socket"}, + {42, "ENOPROTOOPT", "protocol not available"}, + {43, "EPROTONOSUPPORT", "protocol not supported"}, + {44, "ESOCKTNOSUPPORT", "socket type not supported"}, + {45, "EOPNOTSUPP", "operation not supported"}, + {46, "EPFNOSUPPORT", "protocol family not supported"}, + {47, "EAFNOSUPPORT", "address family not supported by protocol family"}, + {48, "EADDRINUSE", "address already in use"}, + {49, "EADDRNOTAVAIL", "can't assign requested address"}, + {50, "ENETDOWN", "network is down"}, + {51, "ENETUNREACH", "network is unreachable"}, + {52, "ENETRESET", "network dropped connection on reset"}, + {53, "ECONNABORTED", "software caused connection abort"}, + {54, "ECONNRESET", "connection reset by peer"}, + {55, "ENOBUFS", "no buffer space available"}, + {56, "EISCONN", "socket is already connected"}, + {57, "ENOTCONN", "socket is not connected"}, + {58, "ESHUTDOWN", "can't send after socket shutdown"}, + {59, "ETOOMANYREFS", "too many references: can't splice"}, + {60, "ETIMEDOUT", "operation timed out"}, + {61, "ECONNREFUSED", "connection refused"}, + {62, "ELOOP", "too many levels of symbolic links"}, + {63, "ENAMETOOLONG", "file name too long"}, + {64, "EHOSTDOWN", "host is down"}, + {65, "EHOSTUNREACH", "no route to host"}, + {66, "ENOTEMPTY", "directory not empty"}, + {67, "EPROCLIM", "too many processes"}, + {68, "EUSERS", "too many users"}, + {69, "EDQUOT", "disc quota exceeded"}, + {70, "ESTALE", "stale NFS file handle"}, + {71, "EREMOTE", "too many levels of remote in path"}, + {72, "EBADRPC", "RPC struct is bad"}, + {73, "ERPCMISMATCH", "RPC version wrong"}, + {74, "EPROGUNAVAIL", "RPC prog. not avail"}, + {75, "EPROGMISMATCH", "program version wrong"}, + {76, "EPROCUNAVAIL", "bad procedure for program"}, + {77, "ENOLCK", "no locks available"}, + {78, "ENOSYS", "function not implemented"}, + {79, "EFTYPE", "inappropriate file type or format"}, + {80, "EAUTH", "authentication error"}, + {81, "ENEEDAUTH", "need authenticator"}, + {82, "EIDRM", "identifier removed"}, + {83, "ENOMSG", "no message of desired type"}, + {84, "EOVERFLOW", "value too large to be stored in data type"}, + {85, "ECANCELED", "operation canceled"}, + {86, "EILSEQ", "illegal byte sequence"}, + {87, "ENOATTR", "attribute not found"}, + {88, "EDOOFUS", "programming error"}, + {89, "EBADMSG", "bad message"}, + {90, "EMULTIHOP", "multihop attempted"}, + {91, "ENOLINK", "link has been severed"}, + {92, "EPROTO", "protocol error"}, + {93, "ENOTCAPABLE", "capabilities insufficient"}, + {94, "ECAPMODE", "not permitted in capability mode"}, + {95, "ENOTRECOVERABLE", "state not recoverable"}, + {96, "EOWNERDEAD", "previous owner died"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/BPT trap"}, + {6, "SIGIOT", "abort trap"}, + {7, "SIGEMT", "EMT trap"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGBUS", "bus error"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGSYS", "bad system call"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGURG", "urgent I/O condition"}, + {17, "SIGSTOP", "suspended (signal)"}, + {18, "SIGTSTP", "suspended"}, + {19, "SIGCONT", "continued"}, + {20, "SIGCHLD", "child exited"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGIO", "I/O possible"}, + {24, "SIGXCPU", "cputime limit exceeded"}, + {25, "SIGXFSZ", "filesize limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window size changes"}, + {29, "SIGINFO", "information request"}, + {30, "SIGUSR1", "user defined signal 1"}, + {31, "SIGUSR2", "user defined signal 2"}, + {32, "SIGTHR", "unknown signal"}, + {33, "SIGLIBRT", "unknown signal"}, +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go new file mode 100644 index 00000000..4f8db783 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go @@ -0,0 +1,1794 @@ +// mkerrors.sh -m64 +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,freebsd + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m64 _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_ARP = 0x23 + AF_ATM = 0x1e + AF_BLUETOOTH = 0x24 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x25 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x1c + AF_INET6_SDP = 0x2a + AF_INET_SDP = 0x28 + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x2a + AF_NATM = 0x1d + AF_NETBIOS = 0x6 + AF_NETGRAPH = 0x20 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x11 + AF_SCLUSTER = 0x22 + AF_SIP = 0x18 + AF_SLOW = 0x21 + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VENDOR00 = 0x27 + AF_VENDOR01 = 0x29 + AF_VENDOR02 = 0x2b + AF_VENDOR03 = 0x2d + AF_VENDOR04 = 0x2f + AF_VENDOR05 = 0x31 + AF_VENDOR06 = 0x33 + AF_VENDOR07 = 0x35 + AF_VENDOR08 = 0x37 + AF_VENDOR09 = 0x39 + AF_VENDOR10 = 0x3b + AF_VENDOR11 = 0x3d + AF_VENDOR12 = 0x3f + AF_VENDOR13 = 0x41 + AF_VENDOR14 = 0x43 + AF_VENDOR15 = 0x45 + AF_VENDOR16 = 0x47 + AF_VENDOR17 = 0x49 + AF_VENDOR18 = 0x4b + AF_VENDOR19 = 0x4d + AF_VENDOR20 = 0x4f + AF_VENDOR21 = 0x51 + AF_VENDOR22 = 0x53 + AF_VENDOR23 = 0x55 + AF_VENDOR24 = 0x57 + AF_VENDOR25 = 0x59 + AF_VENDOR26 = 0x5b + AF_VENDOR27 = 0x5d + AF_VENDOR28 = 0x5f + AF_VENDOR29 = 0x61 + AF_VENDOR30 = 0x63 + AF_VENDOR31 = 0x65 + AF_VENDOR32 = 0x67 + AF_VENDOR33 = 0x69 + AF_VENDOR34 = 0x6b + AF_VENDOR35 = 0x6d + AF_VENDOR36 = 0x6f + AF_VENDOR37 = 0x71 + AF_VENDOR38 = 0x73 + AF_VENDOR39 = 0x75 + AF_VENDOR40 = 0x77 + AF_VENDOR41 = 0x79 + AF_VENDOR42 = 0x7b + AF_VENDOR43 = 0x7d + AF_VENDOR44 = 0x7f + AF_VENDOR45 = 0x81 + AF_VENDOR46 = 0x83 + AF_VENDOR47 = 0x85 + ALTWERASE = 0x200 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B460800 = 0x70800 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B921600 = 0xe1000 + B9600 = 0x2580 + BIOCFEEDBACK = 0x8004427c + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDIRECTION = 0x40044276 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc0104279 + BIOCGETBUFMODE = 0x4004427d + BIOCGETIF = 0x4020426b + BIOCGETZMAX = 0x4008427f + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044272 + BIOCGRTIMEOUT = 0x4010426e + BIOCGSEESENT = 0x40044276 + BIOCGSTATS = 0x4008426f + BIOCGTSTAMP = 0x40044283 + BIOCIMMEDIATE = 0x80044270 + BIOCLOCK = 0x2000427a + BIOCPROMISC = 0x20004269 + BIOCROTZBUF = 0x40184280 + BIOCSBLEN = 0xc0044266 + BIOCSDIRECTION = 0x80044277 + BIOCSDLT = 0x80044278 + BIOCSETBUFMODE = 0x8004427e + BIOCSETF = 0x80104267 + BIOCSETFNR = 0x80104282 + BIOCSETIF = 0x8020426c + BIOCSETWF = 0x8010427b + BIOCSETZBUF = 0x80184281 + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044273 + BIOCSRTIMEOUT = 0x8010426d + BIOCSSEESENT = 0x80044277 + BIOCSTSTAMP = 0x80044284 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x8 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_BUFMODE_BUFFER = 0x1 + BPF_BUFMODE_ZBUF = 0x2 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x80000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_T_BINTIME = 0x2 + BPF_T_BINTIME_FAST = 0x102 + BPF_T_BINTIME_MONOTONIC = 0x202 + BPF_T_BINTIME_MONOTONIC_FAST = 0x302 + BPF_T_FAST = 0x100 + BPF_T_FLAG_MASK = 0x300 + BPF_T_FORMAT_MASK = 0x3 + BPF_T_MICROTIME = 0x0 + BPF_T_MICROTIME_FAST = 0x100 + BPF_T_MICROTIME_MONOTONIC = 0x200 + BPF_T_MICROTIME_MONOTONIC_FAST = 0x300 + BPF_T_MONOTONIC = 0x200 + BPF_T_MONOTONIC_FAST = 0x300 + BPF_T_NANOTIME = 0x1 + BPF_T_NANOTIME_FAST = 0x101 + BPF_T_NANOTIME_MONOTONIC = 0x201 + BPF_T_NANOTIME_MONOTONIC_FAST = 0x301 + BPF_T_NONE = 0x3 + BPF_T_NORMAL = 0x0 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + CAP_ACCEPT = 0x200000020000000 + CAP_ACL_CHECK = 0x400000000010000 + CAP_ACL_DELETE = 0x400000000020000 + CAP_ACL_GET = 0x400000000040000 + CAP_ACL_SET = 0x400000000080000 + CAP_ALL0 = 0x20007ffffffffff + CAP_ALL1 = 0x4000000001fffff + CAP_BIND = 0x200000040000000 + CAP_BINDAT = 0x200008000000400 + CAP_CHFLAGSAT = 0x200000000001400 + CAP_CONNECT = 0x200000080000000 + CAP_CONNECTAT = 0x200010000000400 + CAP_CREATE = 0x200000000000040 + CAP_EVENT = 0x400000000000020 + CAP_EXTATTR_DELETE = 0x400000000001000 + CAP_EXTATTR_GET = 0x400000000002000 + CAP_EXTATTR_LIST = 0x400000000004000 + CAP_EXTATTR_SET = 0x400000000008000 + CAP_FCHDIR = 0x200000000000800 + CAP_FCHFLAGS = 0x200000000001000 + CAP_FCHMOD = 0x200000000002000 + CAP_FCHMODAT = 0x200000000002400 + CAP_FCHOWN = 0x200000000004000 + CAP_FCHOWNAT = 0x200000000004400 + CAP_FCNTL = 0x200000000008000 + CAP_FCNTL_ALL = 0x78 + CAP_FCNTL_GETFL = 0x8 + CAP_FCNTL_GETOWN = 0x20 + CAP_FCNTL_SETFL = 0x10 + CAP_FCNTL_SETOWN = 0x40 + CAP_FEXECVE = 0x200000000000080 + CAP_FLOCK = 0x200000000010000 + CAP_FPATHCONF = 0x200000000020000 + CAP_FSCK = 0x200000000040000 + CAP_FSTAT = 0x200000000080000 + CAP_FSTATAT = 0x200000000080400 + CAP_FSTATFS = 0x200000000100000 + CAP_FSYNC = 0x200000000000100 + CAP_FTRUNCATE = 0x200000000000200 + CAP_FUTIMES = 0x200000000200000 + CAP_FUTIMESAT = 0x200000000200400 + CAP_GETPEERNAME = 0x200000100000000 + CAP_GETSOCKNAME = 0x200000200000000 + CAP_GETSOCKOPT = 0x200000400000000 + CAP_IOCTL = 0x400000000000080 + CAP_IOCTLS_ALL = 0x7fffffffffffffff + CAP_KQUEUE = 0x400000000100040 + CAP_KQUEUE_CHANGE = 0x400000000100000 + CAP_KQUEUE_EVENT = 0x400000000000040 + CAP_LINKAT_SOURCE = 0x200020000000400 + CAP_LINKAT_TARGET = 0x200000000400400 + CAP_LISTEN = 0x200000800000000 + CAP_LOOKUP = 0x200000000000400 + CAP_MAC_GET = 0x400000000000001 + CAP_MAC_SET = 0x400000000000002 + CAP_MKDIRAT = 0x200000000800400 + CAP_MKFIFOAT = 0x200000001000400 + CAP_MKNODAT = 0x200000002000400 + CAP_MMAP = 0x200000000000010 + CAP_MMAP_R = 0x20000000000001d + CAP_MMAP_RW = 0x20000000000001f + CAP_MMAP_RWX = 0x20000000000003f + CAP_MMAP_RX = 0x20000000000003d + CAP_MMAP_W = 0x20000000000001e + CAP_MMAP_WX = 0x20000000000003e + CAP_MMAP_X = 0x20000000000003c + CAP_PDGETPID = 0x400000000000200 + CAP_PDKILL = 0x400000000000800 + CAP_PDWAIT = 0x400000000000400 + CAP_PEELOFF = 0x200001000000000 + CAP_POLL_EVENT = 0x400000000000020 + CAP_PREAD = 0x20000000000000d + CAP_PWRITE = 0x20000000000000e + CAP_READ = 0x200000000000001 + CAP_RECV = 0x200000000000001 + CAP_RENAMEAT_SOURCE = 0x200000004000400 + CAP_RENAMEAT_TARGET = 0x200040000000400 + CAP_RIGHTS_VERSION = 0x0 + CAP_RIGHTS_VERSION_00 = 0x0 + CAP_SEEK = 0x20000000000000c + CAP_SEEK_TELL = 0x200000000000004 + CAP_SEM_GETVALUE = 0x400000000000004 + CAP_SEM_POST = 0x400000000000008 + CAP_SEM_WAIT = 0x400000000000010 + CAP_SEND = 0x200000000000002 + CAP_SETSOCKOPT = 0x200002000000000 + CAP_SHUTDOWN = 0x200004000000000 + CAP_SOCK_CLIENT = 0x200007780000003 + CAP_SOCK_SERVER = 0x200007f60000003 + CAP_SYMLINKAT = 0x200000008000400 + CAP_TTYHOOK = 0x400000000000100 + CAP_UNLINKAT = 0x200000010000400 + CAP_UNUSED0_44 = 0x200080000000000 + CAP_UNUSED0_57 = 0x300000000000000 + CAP_UNUSED1_22 = 0x400000000200000 + CAP_UNUSED1_57 = 0x500000000000000 + CAP_WRITE = 0x200000000000002 + CFLUSH = 0xf + CLOCAL = 0x8000 + CLOCK_MONOTONIC = 0x4 + CLOCK_MONOTONIC_FAST = 0xc + CLOCK_MONOTONIC_PRECISE = 0xb + CLOCK_PROCESS_CPUTIME_ID = 0xf + CLOCK_PROF = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_FAST = 0xa + CLOCK_REALTIME_PRECISE = 0x9 + CLOCK_SECOND = 0xd + CLOCK_THREAD_CPUTIME_ID = 0xe + CLOCK_UPTIME = 0x5 + CLOCK_UPTIME_FAST = 0x8 + CLOCK_UPTIME_PRECISE = 0x7 + CLOCK_VIRTUAL = 0x1 + CREAD = 0x800 + CRTSCTS = 0x30000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_HW = 0x6 + CTL_KERN = 0x1 + CTL_MAXNAME = 0x18 + CTL_NET = 0x4 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_BREDR_BB = 0xff + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_BLUETOOTH_LE_LL = 0xfb + DLT_BLUETOOTH_LE_LL_WITH_PHDR = 0x100 + DLT_BLUETOOTH_LINUX_MONITOR = 0xfe + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CHDLC = 0x68 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DBUS = 0xe7 + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_DVB_CI = 0xeb + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_EPON = 0x103 + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_HHDLC = 0x79 + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NOFCS = 0xe6 + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_INFINIBAND = 0xf7 + DLT_IPFILTER = 0x74 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPMI_HPM_2 = 0x104 + DLT_IPNET = 0xe2 + DLT_IPOIB = 0xf2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_ATM_CEMIC = 0xee + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FIBRECHANNEL = 0xea + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_SRX_E2E = 0xe9 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_JUNIPER_VS = 0xe8 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_PPP_WITHDIRECTION = 0xa6 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MATCHING_MAX = 0x104 + DLT_MATCHING_MIN = 0x68 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPEG_2_TS = 0xf3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_MUX27010 = 0xec + DLT_NETANALYZER = 0xf0 + DLT_NETANALYZER_TRANSPARENT = 0xf1 + DLT_NETLINK = 0xfd + DLT_NFC_LLCP = 0xf5 + DLT_NFLOG = 0xef + DLT_NG40 = 0xf4 + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x79 + DLT_PKTAP = 0x102 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PPP_WITH_DIRECTION = 0xa6 + DLT_PRISM_HEADER = 0x77 + DLT_PROFIBUS_DL = 0x101 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RIO = 0x7c + DLT_RTAC_SERIAL = 0xfa + DLT_SCCP = 0x8e + DLT_SCTP = 0xf8 + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DLT_STANAG_5066_D_PDU = 0xed + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USBPCAP = 0xf9 + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_USER0 = 0x93 + DLT_USER1 = 0x94 + DLT_USER10 = 0x9d + DLT_USER11 = 0x9e + DLT_USER12 = 0x9f + DLT_USER13 = 0xa0 + DLT_USER14 = 0xa1 + DLT_USER15 = 0xa2 + DLT_USER2 = 0x95 + DLT_USER3 = 0x96 + DLT_USER4 = 0x97 + DLT_USER5 = 0x98 + DLT_USER6 = 0x99 + DLT_USER7 = 0x9a + DLT_USER8 = 0x9b + DLT_USER9 = 0x9c + DLT_WIHART = 0xdf + DLT_WIRESHARK_UPPER_PDU = 0xfc + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EVFILT_AIO = -0x3 + EVFILT_FS = -0x9 + EVFILT_LIO = -0xa + EVFILT_PROC = -0x5 + EVFILT_PROCDESC = -0x8 + EVFILT_READ = -0x1 + EVFILT_SENDFILE = -0xc + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0xc + EVFILT_TIMER = -0x7 + EVFILT_USER = -0xb + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_DISPATCH = 0x80 + EV_DROP = 0x1000 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_FLAG2 = 0x4000 + EV_FORCEONESHOT = 0x100 + EV_ONESHOT = 0x10 + EV_RECEIPT = 0x40 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTATTR_NAMESPACE_EMPTY = 0x0 + EXTATTR_NAMESPACE_SYSTEM = 0x2 + EXTATTR_NAMESPACE_USER = 0x1 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FLUSHO = 0x800000 + F_CANCEL = 0x5 + F_DUP2FD = 0xa + F_DUP2FD_CLOEXEC = 0x12 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x11 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0xb + F_GETOWN = 0x5 + F_OGETLK = 0x7 + F_OK = 0x0 + F_OSETLK = 0x8 + F_OSETLKW = 0x9 + F_RDAHEAD = 0x10 + F_RDLCK = 0x1 + F_READAHEAD = 0xf + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0xc + F_SETLKW = 0xd + F_SETLK_REMOTE = 0xe + F_SETOWN = 0x6 + F_UNLCK = 0x2 + F_UNLCKSYS = 0x4 + F_WRLCK = 0x3 + HUPCL = 0x4000 + HW_MACHINE = 0x1 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFAN_ARRIVAL = 0x0 + IFAN_DEPARTURE = 0x1 + IFF_ALLMULTI = 0x200 + IFF_ALTPHYS = 0x4000 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x218f52 + IFF_CANTCONFIG = 0x10000 + IFF_DEBUG = 0x4 + IFF_DRV_OACTIVE = 0x400 + IFF_DRV_RUNNING = 0x40 + IFF_DYING = 0x200000 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MONITOR = 0x40000 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PPROMISC = 0x20000 + IFF_PROMISC = 0x100 + IFF_RENAMING = 0x400000 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_STATICARP = 0x80000 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_BRIDGE = 0xd1 + IFT_CARP = 0xf8 + IFT_IEEE1394 = 0x90 + IFT_INFINIBAND = 0xc7 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_PPP = 0x17 + IFT_PROPVIRTUAL = 0x35 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IN_RFC3021_MASK = 0xfffffffe + IPPROTO_3PC = 0x22 + IPPROTO_ADFS = 0x44 + IPPROTO_AH = 0x33 + IPPROTO_AHIP = 0x3d + IPPROTO_APES = 0x63 + IPPROTO_ARGUS = 0xd + IPPROTO_AX25 = 0x5d + IPPROTO_BHA = 0x31 + IPPROTO_BLT = 0x1e + IPPROTO_BRSATMON = 0x4c + IPPROTO_CARP = 0x70 + IPPROTO_CFTP = 0x3e + IPPROTO_CHAOS = 0x10 + IPPROTO_CMTP = 0x26 + IPPROTO_CPHB = 0x49 + IPPROTO_CPNX = 0x48 + IPPROTO_DDP = 0x25 + IPPROTO_DGP = 0x56 + IPPROTO_DIVERT = 0x102 + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_EMCON = 0xe + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GMTP = 0x64 + IPPROTO_GRE = 0x2f + IPPROTO_HELLO = 0x3f + IPPROTO_HIP = 0x8b + IPPROTO_HMP = 0x14 + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IDPR = 0x23 + IPPROTO_IDRP = 0x2d + IPPROTO_IGMP = 0x2 + IPPROTO_IGP = 0x55 + IPPROTO_IGRP = 0x58 + IPPROTO_IL = 0x28 + IPPROTO_INLSP = 0x34 + IPPROTO_INP = 0x20 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPCV = 0x47 + IPPROTO_IPEIP = 0x5e + IPPROTO_IPIP = 0x4 + IPPROTO_IPPC = 0x43 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IRTP = 0x1c + IPPROTO_KRYPTOLAN = 0x41 + IPPROTO_LARP = 0x5b + IPPROTO_LEAF1 = 0x19 + IPPROTO_LEAF2 = 0x1a + IPPROTO_MAX = 0x100 + IPPROTO_MEAS = 0x13 + IPPROTO_MH = 0x87 + IPPROTO_MHRP = 0x30 + IPPROTO_MICP = 0x5f + IPPROTO_MOBILE = 0x37 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_MUX = 0x12 + IPPROTO_ND = 0x4d + IPPROTO_NHRP = 0x36 + IPPROTO_NONE = 0x3b + IPPROTO_NSP = 0x1f + IPPROTO_NVPII = 0xb + IPPROTO_OLD_DIVERT = 0xfe + IPPROTO_OSPFIGP = 0x59 + IPPROTO_PFSYNC = 0xf0 + IPPROTO_PGM = 0x71 + IPPROTO_PIGP = 0x9 + IPPROTO_PIM = 0x67 + IPPROTO_PRM = 0x15 + IPPROTO_PUP = 0xc + IPPROTO_PVP = 0x4b + IPPROTO_RAW = 0xff + IPPROTO_RCCMON = 0xa + IPPROTO_RDP = 0x1b + IPPROTO_RESERVED_253 = 0xfd + IPPROTO_RESERVED_254 = 0xfe + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_RVD = 0x42 + IPPROTO_SATEXPAK = 0x40 + IPPROTO_SATMON = 0x45 + IPPROTO_SCCSP = 0x60 + IPPROTO_SCTP = 0x84 + IPPROTO_SDRP = 0x2a + IPPROTO_SEND = 0x103 + IPPROTO_SEP = 0x21 + IPPROTO_SHIM6 = 0x8c + IPPROTO_SKIP = 0x39 + IPPROTO_SPACER = 0x7fff + IPPROTO_SRPC = 0x5a + IPPROTO_ST = 0x7 + IPPROTO_SVMTP = 0x52 + IPPROTO_SWIPE = 0x35 + IPPROTO_TCF = 0x57 + IPPROTO_TCP = 0x6 + IPPROTO_TLSP = 0x38 + IPPROTO_TP = 0x1d + IPPROTO_TPXX = 0x27 + IPPROTO_TRUNK1 = 0x17 + IPPROTO_TRUNK2 = 0x18 + IPPROTO_TTP = 0x54 + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPPROTO_VINES = 0x53 + IPPROTO_VISA = 0x46 + IPPROTO_VMTP = 0x51 + IPPROTO_WBEXPAK = 0x4f + IPPROTO_WBMON = 0x4e + IPPROTO_WSN = 0x4a + IPPROTO_XNET = 0xf + IPPROTO_XTP = 0x24 + IPV6_AUTOFLOWLABEL = 0x3b + IPV6_BINDANY = 0x40 + IPV6_BINDMULTI = 0x41 + IPV6_BINDV6ONLY = 0x1b + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_FLOWID = 0x43 + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FLOWTYPE = 0x44 + IPV6_FRAGTTL = 0x78 + IPV6_FW_ADD = 0x1e + IPV6_FW_DEL = 0x1f + IPV6_FW_FLUSH = 0x20 + IPV6_FW_GET = 0x22 + IPV6_FW_ZERO = 0x21 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXOPTHDR = 0x800 + IPV6_MAXPACKET = 0xffff + IPV6_MAX_GROUP_SRC_FILTER = 0x200 + IPV6_MAX_MEMBERSHIPS = 0xfff + IPV6_MAX_SOCK_SRC_FILTER = 0x80 + IPV6_MIN_MEMBERSHIPS = 0x1f + IPV6_MMTU = 0x500 + IPV6_MSFILTER = 0x4a + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_PATHMTU = 0x2c + IPV6_PKTINFO = 0x2e + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_PREFER_TEMPADDR = 0x3f + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVFLOWID = 0x46 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRSSBUCKETID = 0x47 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RSSBUCKETID = 0x45 + IPV6_RSS_LISTEN_BUCKET = 0x42 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_ADD_SOURCE_MEMBERSHIP = 0x46 + IP_BINDANY = 0x18 + IP_BINDMULTI = 0x19 + IP_BLOCK_SOURCE = 0x48 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DONTFRAG = 0x43 + IP_DROP_MEMBERSHIP = 0xd + IP_DROP_SOURCE_MEMBERSHIP = 0x47 + IP_DUMMYNET3 = 0x31 + IP_DUMMYNET_CONFIGURE = 0x3c + IP_DUMMYNET_DEL = 0x3d + IP_DUMMYNET_FLUSH = 0x3e + IP_DUMMYNET_GET = 0x40 + IP_FLOWID = 0x5a + IP_FLOWTYPE = 0x5b + IP_FW3 = 0x30 + IP_FW_ADD = 0x32 + IP_FW_DEL = 0x33 + IP_FW_FLUSH = 0x34 + IP_FW_GET = 0x36 + IP_FW_NAT_CFG = 0x38 + IP_FW_NAT_DEL = 0x39 + IP_FW_NAT_GET_CONFIG = 0x3a + IP_FW_NAT_GET_LOG = 0x3b + IP_FW_RESETLOG = 0x37 + IP_FW_TABLE_ADD = 0x28 + IP_FW_TABLE_DEL = 0x29 + IP_FW_TABLE_FLUSH = 0x2a + IP_FW_TABLE_GETSIZE = 0x2b + IP_FW_TABLE_LIST = 0x2c + IP_FW_ZERO = 0x35 + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x15 + IP_MAXPACKET = 0xffff + IP_MAX_GROUP_SRC_FILTER = 0x200 + IP_MAX_MEMBERSHIPS = 0xfff + IP_MAX_SOCK_MUTE_FILTER = 0x80 + IP_MAX_SOCK_SRC_FILTER = 0x80 + IP_MAX_SOURCE_FILTER = 0x400 + IP_MF = 0x2000 + IP_MINTTL = 0x42 + IP_MIN_MEMBERSHIPS = 0x1f + IP_MSFILTER = 0x4a + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_MULTICAST_VIF = 0xe + IP_OFFMASK = 0x1fff + IP_ONESBCAST = 0x17 + IP_OPTIONS = 0x1 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVFLOWID = 0x5d + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVRSSBUCKETID = 0x5e + IP_RECVTOS = 0x44 + IP_RECVTTL = 0x41 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RSSBUCKETID = 0x5c + IP_RSS_LISTEN_BUCKET = 0x1a + IP_RSVP_OFF = 0x10 + IP_RSVP_ON = 0xf + IP_RSVP_VIF_OFF = 0x12 + IP_RSVP_VIF_ON = 0x11 + IP_SENDSRCADDR = 0x7 + IP_TOS = 0x3 + IP_TTL = 0x4 + IP_UNBLOCK_SOURCE = 0x49 + ISIG = 0x80 + ISTRIP = 0x20 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + KERN_HOSTNAME = 0xa + KERN_OSRELEASE = 0x2 + KERN_OSTYPE = 0x1 + KERN_VERSION = 0x4 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_AUTOSYNC = 0x7 + MADV_CORE = 0x9 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x5 + MADV_NOCORE = 0x8 + MADV_NORMAL = 0x0 + MADV_NOSYNC = 0x6 + MADV_PROTECT = 0xa + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_WILLNEED = 0x3 + MAP_32BIT = 0x80000 + MAP_ALIGNED_SUPER = 0x1000000 + MAP_ALIGNMENT_MASK = -0x1000000 + MAP_ALIGNMENT_SHIFT = 0x18 + MAP_ANON = 0x1000 + MAP_ANONYMOUS = 0x1000 + MAP_COPY = 0x2 + MAP_EXCL = 0x4000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_NOCORE = 0x20000 + MAP_NOSYNC = 0x800 + MAP_PREFAULT_READ = 0x40000 + MAP_PRIVATE = 0x2 + MAP_RESERVED0020 = 0x20 + MAP_RESERVED0040 = 0x40 + MAP_RESERVED0080 = 0x80 + MAP_RESERVED0100 = 0x100 + MAP_SHARED = 0x1 + MAP_STACK = 0x400 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MNT_ACLS = 0x8000000 + MNT_ASYNC = 0x40 + MNT_AUTOMOUNTED = 0x200000000 + MNT_BYFSID = 0x8000000 + MNT_CMDFLAGS = 0xd0f0000 + MNT_DEFEXPORTED = 0x200 + MNT_DELEXPORT = 0x20000 + MNT_EXKERB = 0x800 + MNT_EXPORTANON = 0x400 + MNT_EXPORTED = 0x100 + MNT_EXPUBLIC = 0x20000000 + MNT_EXRDONLY = 0x80 + MNT_FORCE = 0x80000 + MNT_GJOURNAL = 0x2000000 + MNT_IGNORE = 0x800000 + MNT_LAZY = 0x3 + MNT_LOCAL = 0x1000 + MNT_MULTILABEL = 0x4000000 + MNT_NFS4ACLS = 0x10 + MNT_NOATIME = 0x10000000 + MNT_NOCLUSTERR = 0x40000000 + MNT_NOCLUSTERW = 0x80000000 + MNT_NOEXEC = 0x4 + MNT_NONBUSY = 0x4000000 + MNT_NOSUID = 0x8 + MNT_NOSYMFOLLOW = 0x400000 + MNT_NOWAIT = 0x2 + MNT_QUOTA = 0x2000 + MNT_RDONLY = 0x1 + MNT_RELOAD = 0x40000 + MNT_ROOTFS = 0x4000 + MNT_SNAPSHOT = 0x1000000 + MNT_SOFTDEP = 0x200000 + MNT_SUIDDIR = 0x100000 + MNT_SUJ = 0x100000000 + MNT_SUSPEND = 0x4 + MNT_SYNCHRONOUS = 0x2 + MNT_UNION = 0x20 + MNT_UPDATE = 0x10000 + MNT_UPDATEMASK = 0x2d8d0807e + MNT_USER = 0x8000 + MNT_VISFLAGMASK = 0x3fef0ffff + MNT_WAIT = 0x1 + MSG_CMSG_CLOEXEC = 0x40000 + MSG_COMPAT = 0x8000 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOF = 0x100 + MSG_EOR = 0x8 + MSG_NBIO = 0x4000 + MSG_NOSIGNAL = 0x20000 + MSG_NOTIFICATION = 0x2000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MSG_WAITFORONE = 0x80000 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x2 + MS_SYNC = 0x0 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_IFLISTL = 0x5 + NET_RT_IFMALIST = 0x4 + NOFLSH = 0x80000000 + NOKERNINFO = 0x2000000 + NOTE_ATTRIB = 0x8 + NOTE_CHILD = 0x4 + NOTE_CLOSE = 0x100 + NOTE_CLOSE_WRITE = 0x200 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXTEND = 0x4 + NOTE_FFAND = 0x40000000 + NOTE_FFCOPY = 0xc0000000 + NOTE_FFCTRLMASK = 0xc0000000 + NOTE_FFLAGSMASK = 0xffffff + NOTE_FFNOP = 0x0 + NOTE_FFOR = 0x80000000 + NOTE_FILE_POLL = 0x2 + NOTE_FORK = 0x40000000 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_MSECONDS = 0x2 + NOTE_NSECONDS = 0x8 + NOTE_OPEN = 0x80 + NOTE_PCTRLMASK = 0xf0000000 + NOTE_PDATAMASK = 0xfffff + NOTE_READ = 0x400 + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_SECONDS = 0x1 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRIGGER = 0x1000000 + NOTE_USECONDS = 0x4 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + OXTABS = 0x4 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x100000 + O_CREAT = 0x200 + O_DIRECT = 0x10000 + O_DIRECTORY = 0x20000 + O_EXCL = 0x800 + O_EXEC = 0x40000 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_TTY_INIT = 0x80000 + O_VERIFY = 0x200000 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + RLIMIT_AS = 0xa + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_MEMLOCK = 0x6 + RLIMIT_NOFILE = 0x8 + RLIMIT_NPROC = 0x7 + RLIMIT_RSS = 0x5 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x8 + RTAX_NETMASK = 0x2 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_FIXEDMTU = 0x80000 + RTF_FMASK = 0x1004d808 + RTF_GATEWAY = 0x2 + RTF_GWFLAG_COMPAT = 0x80000000 + RTF_HOST = 0x4 + RTF_LLDATA = 0x400 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MODIFIED = 0x20 + RTF_MULTICAST = 0x800000 + RTF_PINNED = 0x100000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x40000 + RTF_REJECT = 0x8 + RTF_RNH_LOCKED = 0x40000000 + RTF_STATIC = 0x800 + RTF_STICKY = 0x10000000 + RTF_UP = 0x1 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DELMADDR = 0x10 + RTM_GET = 0x4 + RTM_IEEE80211 = 0x12 + RTM_IFANNOUNCE = 0x11 + RTM_IFINFO = 0xe + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_NEWMADDR = 0xf + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RTV_WEIGHT = 0x100 + RT_ALL_FIBS = -0x1 + RT_BLACKHOLE = 0x40 + RT_CACHING_CONTEXT = 0x1 + RT_DEFAULT_FIB = 0x0 + RT_HAS_GW = 0x80 + RT_HAS_HEADER = 0x10 + RT_HAS_HEADER_BIT = 0x4 + RT_L2_ME = 0x4 + RT_L2_ME_BIT = 0x2 + RT_LLE_CACHE = 0x100 + RT_MAY_LOOP = 0x8 + RT_MAY_LOOP_BIT = 0x3 + RT_NORTREF = 0x2 + RT_REJECT = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_BINTIME = 0x4 + SCM_CREDS = 0x3 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x2 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCAIFADDR = 0x8040691a + SIOCAIFGROUP = 0x80286987 + SIOCATMARK = 0x40047307 + SIOCDELMULTI = 0x80206932 + SIOCDIFADDR = 0x80206919 + SIOCDIFGROUP = 0x80286989 + SIOCDIFPHYADDR = 0x80206949 + SIOCGDRVSPEC = 0xc028697b + SIOCGETSGCNT = 0xc0207210 + SIOCGETVIFCNT = 0xc028720f + SIOCGHIWAT = 0x40047301 + SIOCGI2C = 0xc020693d + SIOCGIFADDR = 0xc0206921 + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCAP = 0xc020691f + SIOCGIFCONF = 0xc0106924 + SIOCGIFDESCR = 0xc020692a + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFIB = 0xc020695c + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGENERIC = 0xc020693a + SIOCGIFGMEMB = 0xc028698a + SIOCGIFGROUP = 0xc0286988 + SIOCGIFINDEX = 0xc0206920 + SIOCGIFMAC = 0xc0206926 + SIOCGIFMEDIA = 0xc0306938 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc0206933 + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206948 + SIOCGIFPHYS = 0xc0206935 + SIOCGIFPSRCADDR = 0xc0206947 + SIOCGIFSTATUS = 0xc331693b + SIOCGIFXMEDIA = 0xc030698b + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCGPRIVATE_0 = 0xc0206950 + SIOCGPRIVATE_1 = 0xc0206951 + SIOCGTUNFIB = 0xc020695e + SIOCIFCREATE = 0xc020697a + SIOCIFCREATE2 = 0xc020697c + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc0106978 + SIOCSDRVSPEC = 0x8028697b + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFCAP = 0x8020691e + SIOCSIFDESCR = 0x80206929 + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFIB = 0x8020695d + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGENERIC = 0x80206939 + SIOCSIFLLADDR = 0x8020693c + SIOCSIFMAC = 0x80206927 + SIOCSIFMEDIA = 0xc0206937 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x80206934 + SIOCSIFNAME = 0x80206928 + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x80406946 + SIOCSIFPHYS = 0x80206936 + SIOCSIFRVNET = 0xc020695b + SIOCSIFVNET = 0xc020695a + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SIOCSTUNFIB = 0x8020695f + SOCK_CLOEXEC = 0x10000000 + SOCK_DGRAM = 0x2 + SOCK_MAXADDRLEN = 0xff + SOCK_NONBLOCK = 0x20000000 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_ACCEPTFILTER = 0x1000 + SO_BINTIME = 0x2000 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LABEL = 0x1009 + SO_LINGER = 0x80 + SO_LISTENINCQLEN = 0x1013 + SO_LISTENQLEN = 0x1012 + SO_LISTENQLIMIT = 0x1011 + SO_NOSIGPIPE = 0x800 + SO_NO_DDP = 0x8000 + SO_NO_OFFLOAD = 0x4000 + SO_OOBINLINE = 0x100 + SO_PEERLABEL = 0x1010 + SO_PROTOCOL = 0x1016 + SO_PROTOTYPE = 0x1016 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_SETFIB = 0x1014 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_TIMESTAMP = 0x400 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + SO_USER_COOKIE = 0x1015 + SO_VENDOR = 0x80000000 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IFWHT = 0xe000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISTXT = 0x200 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB3 = 0x4 + TABDLY = 0x4 + TCIFLUSH = 0x1 + TCIOFF = 0x3 + TCIOFLUSH = 0x3 + TCION = 0x4 + TCOFLUSH = 0x2 + TCOOFF = 0x1 + TCOON = 0x2 + TCP_CA_NAME_MAX = 0x10 + TCP_CCALGOOPT = 0x41 + TCP_CONGESTION = 0x40 + TCP_FASTOPEN = 0x401 + TCP_FUNCTION_BLK = 0x2000 + TCP_FUNCTION_NAME_LEN_MAX = 0x20 + TCP_INFO = 0x20 + TCP_KEEPCNT = 0x400 + TCP_KEEPIDLE = 0x100 + TCP_KEEPINIT = 0x80 + TCP_KEEPINTVL = 0x200 + TCP_MAXBURST = 0x4 + TCP_MAXHLEN = 0x3c + TCP_MAXOLEN = 0x28 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x4 + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0x10 + TCP_MINMSS = 0xd8 + TCP_MSS = 0x218 + TCP_NODELAY = 0x1 + TCP_NOOPT = 0x8 + TCP_NOPUSH = 0x4 + TCP_PCAP_IN = 0x1000 + TCP_PCAP_OUT = 0x800 + TCP_VENDOR = 0x80000000 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLUSH = 0x80047410 + TIOCGDRAINWAIT = 0x40047456 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGPGRP = 0x40047477 + TIOCGPTN = 0x4004740f + TIOCGSID = 0x40047463 + TIOCGWINSZ = 0x40087468 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGDTRWAIT = 0x4004745a + TIOCMGET = 0x4004746a + TIOCMSDTRWAIT = 0x8004745b + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DCD = 0x40 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCPTMASTER = 0x2000741c + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDRAINWAIT = 0x80047457 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSIG = 0x2004745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x20007465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCTIMESTAMP = 0x40107459 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VERASE2 = 0x7 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WCONTINUED = 0x4 + WCOREFLAG = 0x80 + WEXITED = 0x10 + WLINUXCLONE = 0x80000000 + WNOHANG = 0x1 + WNOWAIT = 0x8 + WSTOPPED = 0x2 + WTRAPPED = 0x20 + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADF = syscall.Errno(0x9) + EBADMSG = syscall.Errno(0x59) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x55) + ECAPMODE = syscall.Errno(0x5e) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDOM = syscall.Errno(0x21) + EDOOFUS = syscall.Errno(0x58) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x52) + EILSEQ = syscall.Errno(0x56) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x60) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5a) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x57) + ENOBUFS = syscall.Errno(0x37) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x5b) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x53) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCAPABLE = syscall.Errno(0x5d) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTRECOVERABLE = syscall.Errno(0x5f) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x2d) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x54) + EOWNERDEAD = syscall.Errno(0x60) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTO = syscall.Errno(0x5c) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGLIBRT = syscall.Signal(0x21) + SIGLWP = syscall.Signal(0x20) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTHR = syscall.Signal(0x20) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "device not configured"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EDEADLK", "resource deadlock avoided"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "cross-device link"}, + {19, "ENODEV", "operation not supported by device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "result too large"}, + {35, "EAGAIN", "resource temporarily unavailable"}, + {36, "EINPROGRESS", "operation now in progress"}, + {37, "EALREADY", "operation already in progress"}, + {38, "ENOTSOCK", "socket operation on non-socket"}, + {39, "EDESTADDRREQ", "destination address required"}, + {40, "EMSGSIZE", "message too long"}, + {41, "EPROTOTYPE", "protocol wrong type for socket"}, + {42, "ENOPROTOOPT", "protocol not available"}, + {43, "EPROTONOSUPPORT", "protocol not supported"}, + {44, "ESOCKTNOSUPPORT", "socket type not supported"}, + {45, "EOPNOTSUPP", "operation not supported"}, + {46, "EPFNOSUPPORT", "protocol family not supported"}, + {47, "EAFNOSUPPORT", "address family not supported by protocol family"}, + {48, "EADDRINUSE", "address already in use"}, + {49, "EADDRNOTAVAIL", "can't assign requested address"}, + {50, "ENETDOWN", "network is down"}, + {51, "ENETUNREACH", "network is unreachable"}, + {52, "ENETRESET", "network dropped connection on reset"}, + {53, "ECONNABORTED", "software caused connection abort"}, + {54, "ECONNRESET", "connection reset by peer"}, + {55, "ENOBUFS", "no buffer space available"}, + {56, "EISCONN", "socket is already connected"}, + {57, "ENOTCONN", "socket is not connected"}, + {58, "ESHUTDOWN", "can't send after socket shutdown"}, + {59, "ETOOMANYREFS", "too many references: can't splice"}, + {60, "ETIMEDOUT", "operation timed out"}, + {61, "ECONNREFUSED", "connection refused"}, + {62, "ELOOP", "too many levels of symbolic links"}, + {63, "ENAMETOOLONG", "file name too long"}, + {64, "EHOSTDOWN", "host is down"}, + {65, "EHOSTUNREACH", "no route to host"}, + {66, "ENOTEMPTY", "directory not empty"}, + {67, "EPROCLIM", "too many processes"}, + {68, "EUSERS", "too many users"}, + {69, "EDQUOT", "disc quota exceeded"}, + {70, "ESTALE", "stale NFS file handle"}, + {71, "EREMOTE", "too many levels of remote in path"}, + {72, "EBADRPC", "RPC struct is bad"}, + {73, "ERPCMISMATCH", "RPC version wrong"}, + {74, "EPROGUNAVAIL", "RPC prog. not avail"}, + {75, "EPROGMISMATCH", "program version wrong"}, + {76, "EPROCUNAVAIL", "bad procedure for program"}, + {77, "ENOLCK", "no locks available"}, + {78, "ENOSYS", "function not implemented"}, + {79, "EFTYPE", "inappropriate file type or format"}, + {80, "EAUTH", "authentication error"}, + {81, "ENEEDAUTH", "need authenticator"}, + {82, "EIDRM", "identifier removed"}, + {83, "ENOMSG", "no message of desired type"}, + {84, "EOVERFLOW", "value too large to be stored in data type"}, + {85, "ECANCELED", "operation canceled"}, + {86, "EILSEQ", "illegal byte sequence"}, + {87, "ENOATTR", "attribute not found"}, + {88, "EDOOFUS", "programming error"}, + {89, "EBADMSG", "bad message"}, + {90, "EMULTIHOP", "multihop attempted"}, + {91, "ENOLINK", "link has been severed"}, + {92, "EPROTO", "protocol error"}, + {93, "ENOTCAPABLE", "capabilities insufficient"}, + {94, "ECAPMODE", "not permitted in capability mode"}, + {95, "ENOTRECOVERABLE", "state not recoverable"}, + {96, "EOWNERDEAD", "previous owner died"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/BPT trap"}, + {6, "SIGIOT", "abort trap"}, + {7, "SIGEMT", "EMT trap"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGBUS", "bus error"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGSYS", "bad system call"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGURG", "urgent I/O condition"}, + {17, "SIGSTOP", "suspended (signal)"}, + {18, "SIGTSTP", "suspended"}, + {19, "SIGCONT", "continued"}, + {20, "SIGCHLD", "child exited"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGIO", "I/O possible"}, + {24, "SIGXCPU", "cputime limit exceeded"}, + {25, "SIGXFSZ", "filesize limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window size changes"}, + {29, "SIGINFO", "information request"}, + {30, "SIGUSR1", "user defined signal 1"}, + {31, "SIGUSR2", "user defined signal 2"}, + {32, "SIGTHR", "unknown signal"}, + {33, "SIGLIBRT", "unknown signal"}, +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go new file mode 100644 index 00000000..53e5de60 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go @@ -0,0 +1,1802 @@ +// mkerrors.sh +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm,freebsd + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_ARP = 0x23 + AF_ATM = 0x1e + AF_BLUETOOTH = 0x24 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x25 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x1c + AF_INET6_SDP = 0x2a + AF_INET_SDP = 0x28 + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x2a + AF_NATM = 0x1d + AF_NETBIOS = 0x6 + AF_NETGRAPH = 0x20 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x11 + AF_SCLUSTER = 0x22 + AF_SIP = 0x18 + AF_SLOW = 0x21 + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VENDOR00 = 0x27 + AF_VENDOR01 = 0x29 + AF_VENDOR02 = 0x2b + AF_VENDOR03 = 0x2d + AF_VENDOR04 = 0x2f + AF_VENDOR05 = 0x31 + AF_VENDOR06 = 0x33 + AF_VENDOR07 = 0x35 + AF_VENDOR08 = 0x37 + AF_VENDOR09 = 0x39 + AF_VENDOR10 = 0x3b + AF_VENDOR11 = 0x3d + AF_VENDOR12 = 0x3f + AF_VENDOR13 = 0x41 + AF_VENDOR14 = 0x43 + AF_VENDOR15 = 0x45 + AF_VENDOR16 = 0x47 + AF_VENDOR17 = 0x49 + AF_VENDOR18 = 0x4b + AF_VENDOR19 = 0x4d + AF_VENDOR20 = 0x4f + AF_VENDOR21 = 0x51 + AF_VENDOR22 = 0x53 + AF_VENDOR23 = 0x55 + AF_VENDOR24 = 0x57 + AF_VENDOR25 = 0x59 + AF_VENDOR26 = 0x5b + AF_VENDOR27 = 0x5d + AF_VENDOR28 = 0x5f + AF_VENDOR29 = 0x61 + AF_VENDOR30 = 0x63 + AF_VENDOR31 = 0x65 + AF_VENDOR32 = 0x67 + AF_VENDOR33 = 0x69 + AF_VENDOR34 = 0x6b + AF_VENDOR35 = 0x6d + AF_VENDOR36 = 0x6f + AF_VENDOR37 = 0x71 + AF_VENDOR38 = 0x73 + AF_VENDOR39 = 0x75 + AF_VENDOR40 = 0x77 + AF_VENDOR41 = 0x79 + AF_VENDOR42 = 0x7b + AF_VENDOR43 = 0x7d + AF_VENDOR44 = 0x7f + AF_VENDOR45 = 0x81 + AF_VENDOR46 = 0x83 + AF_VENDOR47 = 0x85 + ALTWERASE = 0x200 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B460800 = 0x70800 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B921600 = 0xe1000 + B9600 = 0x2580 + BIOCFEEDBACK = 0x8004427c + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDIRECTION = 0x40044276 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc0084279 + BIOCGETBUFMODE = 0x4004427d + BIOCGETIF = 0x4020426b + BIOCGETZMAX = 0x4004427f + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044272 + BIOCGRTIMEOUT = 0x4010426e + BIOCGSEESENT = 0x40044276 + BIOCGSTATS = 0x4008426f + BIOCGTSTAMP = 0x40044283 + BIOCIMMEDIATE = 0x80044270 + BIOCLOCK = 0x2000427a + BIOCPROMISC = 0x20004269 + BIOCROTZBUF = 0x400c4280 + BIOCSBLEN = 0xc0044266 + BIOCSDIRECTION = 0x80044277 + BIOCSDLT = 0x80044278 + BIOCSETBUFMODE = 0x8004427e + BIOCSETF = 0x80084267 + BIOCSETFNR = 0x80084282 + BIOCSETIF = 0x8020426c + BIOCSETWF = 0x8008427b + BIOCSETZBUF = 0x800c4281 + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044273 + BIOCSRTIMEOUT = 0x8010426d + BIOCSSEESENT = 0x80044277 + BIOCSTSTAMP = 0x80044284 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_BUFMODE_BUFFER = 0x1 + BPF_BUFMODE_ZBUF = 0x2 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x80000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_T_BINTIME = 0x2 + BPF_T_BINTIME_FAST = 0x102 + BPF_T_BINTIME_MONOTONIC = 0x202 + BPF_T_BINTIME_MONOTONIC_FAST = 0x302 + BPF_T_FAST = 0x100 + BPF_T_FLAG_MASK = 0x300 + BPF_T_FORMAT_MASK = 0x3 + BPF_T_MICROTIME = 0x0 + BPF_T_MICROTIME_FAST = 0x100 + BPF_T_MICROTIME_MONOTONIC = 0x200 + BPF_T_MICROTIME_MONOTONIC_FAST = 0x300 + BPF_T_MONOTONIC = 0x200 + BPF_T_MONOTONIC_FAST = 0x300 + BPF_T_NANOTIME = 0x1 + BPF_T_NANOTIME_FAST = 0x101 + BPF_T_NANOTIME_MONOTONIC = 0x201 + BPF_T_NANOTIME_MONOTONIC_FAST = 0x301 + BPF_T_NONE = 0x3 + BPF_T_NORMAL = 0x0 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + CAP_ACCEPT = 0x200000020000000 + CAP_ACL_CHECK = 0x400000000010000 + CAP_ACL_DELETE = 0x400000000020000 + CAP_ACL_GET = 0x400000000040000 + CAP_ACL_SET = 0x400000000080000 + CAP_ALL0 = 0x20007ffffffffff + CAP_ALL1 = 0x4000000001fffff + CAP_BIND = 0x200000040000000 + CAP_BINDAT = 0x200008000000400 + CAP_CHFLAGSAT = 0x200000000001400 + CAP_CONNECT = 0x200000080000000 + CAP_CONNECTAT = 0x200010000000400 + CAP_CREATE = 0x200000000000040 + CAP_EVENT = 0x400000000000020 + CAP_EXTATTR_DELETE = 0x400000000001000 + CAP_EXTATTR_GET = 0x400000000002000 + CAP_EXTATTR_LIST = 0x400000000004000 + CAP_EXTATTR_SET = 0x400000000008000 + CAP_FCHDIR = 0x200000000000800 + CAP_FCHFLAGS = 0x200000000001000 + CAP_FCHMOD = 0x200000000002000 + CAP_FCHMODAT = 0x200000000002400 + CAP_FCHOWN = 0x200000000004000 + CAP_FCHOWNAT = 0x200000000004400 + CAP_FCNTL = 0x200000000008000 + CAP_FCNTL_ALL = 0x78 + CAP_FCNTL_GETFL = 0x8 + CAP_FCNTL_GETOWN = 0x20 + CAP_FCNTL_SETFL = 0x10 + CAP_FCNTL_SETOWN = 0x40 + CAP_FEXECVE = 0x200000000000080 + CAP_FLOCK = 0x200000000010000 + CAP_FPATHCONF = 0x200000000020000 + CAP_FSCK = 0x200000000040000 + CAP_FSTAT = 0x200000000080000 + CAP_FSTATAT = 0x200000000080400 + CAP_FSTATFS = 0x200000000100000 + CAP_FSYNC = 0x200000000000100 + CAP_FTRUNCATE = 0x200000000000200 + CAP_FUTIMES = 0x200000000200000 + CAP_FUTIMESAT = 0x200000000200400 + CAP_GETPEERNAME = 0x200000100000000 + CAP_GETSOCKNAME = 0x200000200000000 + CAP_GETSOCKOPT = 0x200000400000000 + CAP_IOCTL = 0x400000000000080 + CAP_IOCTLS_ALL = 0x7fffffff + CAP_KQUEUE = 0x400000000100040 + CAP_KQUEUE_CHANGE = 0x400000000100000 + CAP_KQUEUE_EVENT = 0x400000000000040 + CAP_LINKAT_SOURCE = 0x200020000000400 + CAP_LINKAT_TARGET = 0x200000000400400 + CAP_LISTEN = 0x200000800000000 + CAP_LOOKUP = 0x200000000000400 + CAP_MAC_GET = 0x400000000000001 + CAP_MAC_SET = 0x400000000000002 + CAP_MKDIRAT = 0x200000000800400 + CAP_MKFIFOAT = 0x200000001000400 + CAP_MKNODAT = 0x200000002000400 + CAP_MMAP = 0x200000000000010 + CAP_MMAP_R = 0x20000000000001d + CAP_MMAP_RW = 0x20000000000001f + CAP_MMAP_RWX = 0x20000000000003f + CAP_MMAP_RX = 0x20000000000003d + CAP_MMAP_W = 0x20000000000001e + CAP_MMAP_WX = 0x20000000000003e + CAP_MMAP_X = 0x20000000000003c + CAP_PDGETPID = 0x400000000000200 + CAP_PDKILL = 0x400000000000800 + CAP_PDWAIT = 0x400000000000400 + CAP_PEELOFF = 0x200001000000000 + CAP_POLL_EVENT = 0x400000000000020 + CAP_PREAD = 0x20000000000000d + CAP_PWRITE = 0x20000000000000e + CAP_READ = 0x200000000000001 + CAP_RECV = 0x200000000000001 + CAP_RENAMEAT_SOURCE = 0x200000004000400 + CAP_RENAMEAT_TARGET = 0x200040000000400 + CAP_RIGHTS_VERSION = 0x0 + CAP_RIGHTS_VERSION_00 = 0x0 + CAP_SEEK = 0x20000000000000c + CAP_SEEK_TELL = 0x200000000000004 + CAP_SEM_GETVALUE = 0x400000000000004 + CAP_SEM_POST = 0x400000000000008 + CAP_SEM_WAIT = 0x400000000000010 + CAP_SEND = 0x200000000000002 + CAP_SETSOCKOPT = 0x200002000000000 + CAP_SHUTDOWN = 0x200004000000000 + CAP_SOCK_CLIENT = 0x200007780000003 + CAP_SOCK_SERVER = 0x200007f60000003 + CAP_SYMLINKAT = 0x200000008000400 + CAP_TTYHOOK = 0x400000000000100 + CAP_UNLINKAT = 0x200000010000400 + CAP_UNUSED0_44 = 0x200080000000000 + CAP_UNUSED0_57 = 0x300000000000000 + CAP_UNUSED1_22 = 0x400000000200000 + CAP_UNUSED1_57 = 0x500000000000000 + CAP_WRITE = 0x200000000000002 + CFLUSH = 0xf + CLOCAL = 0x8000 + CLOCK_MONOTONIC = 0x4 + CLOCK_MONOTONIC_FAST = 0xc + CLOCK_MONOTONIC_PRECISE = 0xb + CLOCK_PROCESS_CPUTIME_ID = 0xf + CLOCK_PROF = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_FAST = 0xa + CLOCK_REALTIME_PRECISE = 0x9 + CLOCK_SECOND = 0xd + CLOCK_THREAD_CPUTIME_ID = 0xe + CLOCK_UPTIME = 0x5 + CLOCK_UPTIME_FAST = 0x8 + CLOCK_UPTIME_PRECISE = 0x7 + CLOCK_VIRTUAL = 0x1 + CREAD = 0x800 + CRTSCTS = 0x30000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_HW = 0x6 + CTL_KERN = 0x1 + CTL_MAXNAME = 0x18 + CTL_NET = 0x4 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_BREDR_BB = 0xff + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_BLUETOOTH_LE_LL = 0xfb + DLT_BLUETOOTH_LE_LL_WITH_PHDR = 0x100 + DLT_BLUETOOTH_LINUX_MONITOR = 0xfe + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CHDLC = 0x68 + DLT_CISCO_IOS = 0x76 + DLT_CLASS_NETBSD_RAWAF = 0x2240000 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DBUS = 0xe7 + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_DVB_CI = 0xeb + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_EPON = 0x103 + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NOFCS = 0xe6 + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_INFINIBAND = 0xf7 + DLT_IPFILTER = 0x74 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPMI_HPM_2 = 0x104 + DLT_IPNET = 0xe2 + DLT_IPOIB = 0xf2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_ISO_14443 = 0x108 + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_ATM_CEMIC = 0xee + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FIBRECHANNEL = 0xea + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_SRX_E2E = 0xe9 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_JUNIPER_VS = 0xe8 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_PPP_WITHDIRECTION = 0xa6 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MATCHING_MAX = 0x109 + DLT_MATCHING_MIN = 0x68 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPEG_2_TS = 0xf3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_MUX27010 = 0xec + DLT_NETANALYZER = 0xf0 + DLT_NETANALYZER_TRANSPARENT = 0xf1 + DLT_NETLINK = 0xfd + DLT_NFC_LLCP = 0xf5 + DLT_NFLOG = 0xef + DLT_NG40 = 0xf4 + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x79 + DLT_PKTAP = 0x102 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0xe + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PPP_WITH_DIRECTION = 0xa6 + DLT_PRISM_HEADER = 0x77 + DLT_PROFIBUS_DL = 0x101 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RDS = 0x109 + DLT_REDBACK_SMARTEDGE = 0x20 + DLT_RIO = 0x7c + DLT_RTAC_SERIAL = 0xfa + DLT_SCCP = 0x8e + DLT_SCTP = 0xf8 + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xd + DLT_STANAG_5066_D_PDU = 0xed + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USBPCAP = 0xf9 + DLT_USB_FREEBSD = 0xba + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_USER0 = 0x93 + DLT_USER1 = 0x94 + DLT_USER10 = 0x9d + DLT_USER11 = 0x9e + DLT_USER12 = 0x9f + DLT_USER13 = 0xa0 + DLT_USER14 = 0xa1 + DLT_USER15 = 0xa2 + DLT_USER2 = 0x95 + DLT_USER3 = 0x96 + DLT_USER4 = 0x97 + DLT_USER5 = 0x98 + DLT_USER6 = 0x99 + DLT_USER7 = 0x9a + DLT_USER8 = 0x9b + DLT_USER9 = 0x9c + DLT_WATTSTOPPER_DLM = 0x107 + DLT_WIHART = 0xdf + DLT_WIRESHARK_UPPER_PDU = 0xfc + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DLT_ZWAVE_R1_R2 = 0x105 + DLT_ZWAVE_R3 = 0x106 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EVFILT_AIO = -0x3 + EVFILT_FS = -0x9 + EVFILT_LIO = -0xa + EVFILT_PROC = -0x5 + EVFILT_PROCDESC = -0x8 + EVFILT_READ = -0x1 + EVFILT_SENDFILE = -0xc + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0xc + EVFILT_TIMER = -0x7 + EVFILT_USER = -0xb + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_DISPATCH = 0x80 + EV_DROP = 0x1000 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_FLAG2 = 0x4000 + EV_FORCEONESHOT = 0x100 + EV_ONESHOT = 0x10 + EV_RECEIPT = 0x40 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTATTR_NAMESPACE_EMPTY = 0x0 + EXTATTR_NAMESPACE_SYSTEM = 0x2 + EXTATTR_NAMESPACE_USER = 0x1 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FLUSHO = 0x800000 + F_CANCEL = 0x5 + F_DUP2FD = 0xa + F_DUP2FD_CLOEXEC = 0x12 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x11 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0xb + F_GETOWN = 0x5 + F_OGETLK = 0x7 + F_OK = 0x0 + F_OSETLK = 0x8 + F_OSETLKW = 0x9 + F_RDAHEAD = 0x10 + F_RDLCK = 0x1 + F_READAHEAD = 0xf + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0xc + F_SETLKW = 0xd + F_SETLK_REMOTE = 0xe + F_SETOWN = 0x6 + F_UNLCK = 0x2 + F_UNLCKSYS = 0x4 + F_WRLCK = 0x3 + HUPCL = 0x4000 + HW_MACHINE = 0x1 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFAN_ARRIVAL = 0x0 + IFAN_DEPARTURE = 0x1 + IFF_ALLMULTI = 0x200 + IFF_ALTPHYS = 0x4000 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x218f52 + IFF_CANTCONFIG = 0x10000 + IFF_DEBUG = 0x4 + IFF_DRV_OACTIVE = 0x400 + IFF_DRV_RUNNING = 0x40 + IFF_DYING = 0x200000 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MONITOR = 0x40000 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PPROMISC = 0x20000 + IFF_PROMISC = 0x100 + IFF_RENAMING = 0x400000 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_STATICARP = 0x80000 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_BRIDGE = 0xd1 + IFT_CARP = 0xf8 + IFT_IEEE1394 = 0x90 + IFT_INFINIBAND = 0xc7 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_PPP = 0x17 + IFT_PROPVIRTUAL = 0x35 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IN_RFC3021_MASK = 0xfffffffe + IPPROTO_3PC = 0x22 + IPPROTO_ADFS = 0x44 + IPPROTO_AH = 0x33 + IPPROTO_AHIP = 0x3d + IPPROTO_APES = 0x63 + IPPROTO_ARGUS = 0xd + IPPROTO_AX25 = 0x5d + IPPROTO_BHA = 0x31 + IPPROTO_BLT = 0x1e + IPPROTO_BRSATMON = 0x4c + IPPROTO_CARP = 0x70 + IPPROTO_CFTP = 0x3e + IPPROTO_CHAOS = 0x10 + IPPROTO_CMTP = 0x26 + IPPROTO_CPHB = 0x49 + IPPROTO_CPNX = 0x48 + IPPROTO_DDP = 0x25 + IPPROTO_DGP = 0x56 + IPPROTO_DIVERT = 0x102 + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_EMCON = 0xe + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GMTP = 0x64 + IPPROTO_GRE = 0x2f + IPPROTO_HELLO = 0x3f + IPPROTO_HIP = 0x8b + IPPROTO_HMP = 0x14 + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IDPR = 0x23 + IPPROTO_IDRP = 0x2d + IPPROTO_IGMP = 0x2 + IPPROTO_IGP = 0x55 + IPPROTO_IGRP = 0x58 + IPPROTO_IL = 0x28 + IPPROTO_INLSP = 0x34 + IPPROTO_INP = 0x20 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPCV = 0x47 + IPPROTO_IPEIP = 0x5e + IPPROTO_IPIP = 0x4 + IPPROTO_IPPC = 0x43 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IRTP = 0x1c + IPPROTO_KRYPTOLAN = 0x41 + IPPROTO_LARP = 0x5b + IPPROTO_LEAF1 = 0x19 + IPPROTO_LEAF2 = 0x1a + IPPROTO_MAX = 0x100 + IPPROTO_MEAS = 0x13 + IPPROTO_MH = 0x87 + IPPROTO_MHRP = 0x30 + IPPROTO_MICP = 0x5f + IPPROTO_MOBILE = 0x37 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_MUX = 0x12 + IPPROTO_ND = 0x4d + IPPROTO_NHRP = 0x36 + IPPROTO_NONE = 0x3b + IPPROTO_NSP = 0x1f + IPPROTO_NVPII = 0xb + IPPROTO_OLD_DIVERT = 0xfe + IPPROTO_OSPFIGP = 0x59 + IPPROTO_PFSYNC = 0xf0 + IPPROTO_PGM = 0x71 + IPPROTO_PIGP = 0x9 + IPPROTO_PIM = 0x67 + IPPROTO_PRM = 0x15 + IPPROTO_PUP = 0xc + IPPROTO_PVP = 0x4b + IPPROTO_RAW = 0xff + IPPROTO_RCCMON = 0xa + IPPROTO_RDP = 0x1b + IPPROTO_RESERVED_253 = 0xfd + IPPROTO_RESERVED_254 = 0xfe + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_RVD = 0x42 + IPPROTO_SATEXPAK = 0x40 + IPPROTO_SATMON = 0x45 + IPPROTO_SCCSP = 0x60 + IPPROTO_SCTP = 0x84 + IPPROTO_SDRP = 0x2a + IPPROTO_SEND = 0x103 + IPPROTO_SEP = 0x21 + IPPROTO_SHIM6 = 0x8c + IPPROTO_SKIP = 0x39 + IPPROTO_SPACER = 0x7fff + IPPROTO_SRPC = 0x5a + IPPROTO_ST = 0x7 + IPPROTO_SVMTP = 0x52 + IPPROTO_SWIPE = 0x35 + IPPROTO_TCF = 0x57 + IPPROTO_TCP = 0x6 + IPPROTO_TLSP = 0x38 + IPPROTO_TP = 0x1d + IPPROTO_TPXX = 0x27 + IPPROTO_TRUNK1 = 0x17 + IPPROTO_TRUNK2 = 0x18 + IPPROTO_TTP = 0x54 + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPPROTO_VINES = 0x53 + IPPROTO_VISA = 0x46 + IPPROTO_VMTP = 0x51 + IPPROTO_WBEXPAK = 0x4f + IPPROTO_WBMON = 0x4e + IPPROTO_WSN = 0x4a + IPPROTO_XNET = 0xf + IPPROTO_XTP = 0x24 + IPV6_AUTOFLOWLABEL = 0x3b + IPV6_BINDANY = 0x40 + IPV6_BINDMULTI = 0x41 + IPV6_BINDV6ONLY = 0x1b + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_FLOWID = 0x43 + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FLOWTYPE = 0x44 + IPV6_FRAGTTL = 0x78 + IPV6_FW_ADD = 0x1e + IPV6_FW_DEL = 0x1f + IPV6_FW_FLUSH = 0x20 + IPV6_FW_GET = 0x22 + IPV6_FW_ZERO = 0x21 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXOPTHDR = 0x800 + IPV6_MAXPACKET = 0xffff + IPV6_MAX_GROUP_SRC_FILTER = 0x200 + IPV6_MAX_MEMBERSHIPS = 0xfff + IPV6_MAX_SOCK_SRC_FILTER = 0x80 + IPV6_MIN_MEMBERSHIPS = 0x1f + IPV6_MMTU = 0x500 + IPV6_MSFILTER = 0x4a + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_PATHMTU = 0x2c + IPV6_PKTINFO = 0x2e + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_PREFER_TEMPADDR = 0x3f + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVFLOWID = 0x46 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRSSBUCKETID = 0x47 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RSSBUCKETID = 0x45 + IPV6_RSS_LISTEN_BUCKET = 0x42 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_ADD_SOURCE_MEMBERSHIP = 0x46 + IP_BINDANY = 0x18 + IP_BINDMULTI = 0x19 + IP_BLOCK_SOURCE = 0x48 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DONTFRAG = 0x43 + IP_DROP_MEMBERSHIP = 0xd + IP_DROP_SOURCE_MEMBERSHIP = 0x47 + IP_DUMMYNET3 = 0x31 + IP_DUMMYNET_CONFIGURE = 0x3c + IP_DUMMYNET_DEL = 0x3d + IP_DUMMYNET_FLUSH = 0x3e + IP_DUMMYNET_GET = 0x40 + IP_FLOWID = 0x5a + IP_FLOWTYPE = 0x5b + IP_FW3 = 0x30 + IP_FW_ADD = 0x32 + IP_FW_DEL = 0x33 + IP_FW_FLUSH = 0x34 + IP_FW_GET = 0x36 + IP_FW_NAT_CFG = 0x38 + IP_FW_NAT_DEL = 0x39 + IP_FW_NAT_GET_CONFIG = 0x3a + IP_FW_NAT_GET_LOG = 0x3b + IP_FW_RESETLOG = 0x37 + IP_FW_TABLE_ADD = 0x28 + IP_FW_TABLE_DEL = 0x29 + IP_FW_TABLE_FLUSH = 0x2a + IP_FW_TABLE_GETSIZE = 0x2b + IP_FW_TABLE_LIST = 0x2c + IP_FW_ZERO = 0x35 + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x15 + IP_MAXPACKET = 0xffff + IP_MAX_GROUP_SRC_FILTER = 0x200 + IP_MAX_MEMBERSHIPS = 0xfff + IP_MAX_SOCK_MUTE_FILTER = 0x80 + IP_MAX_SOCK_SRC_FILTER = 0x80 + IP_MAX_SOURCE_FILTER = 0x400 + IP_MF = 0x2000 + IP_MINTTL = 0x42 + IP_MIN_MEMBERSHIPS = 0x1f + IP_MSFILTER = 0x4a + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_MULTICAST_VIF = 0xe + IP_OFFMASK = 0x1fff + IP_ONESBCAST = 0x17 + IP_OPTIONS = 0x1 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVFLOWID = 0x5d + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVRSSBUCKETID = 0x5e + IP_RECVTOS = 0x44 + IP_RECVTTL = 0x41 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RSSBUCKETID = 0x5c + IP_RSS_LISTEN_BUCKET = 0x1a + IP_RSVP_OFF = 0x10 + IP_RSVP_ON = 0xf + IP_RSVP_VIF_OFF = 0x12 + IP_RSVP_VIF_ON = 0x11 + IP_SENDSRCADDR = 0x7 + IP_TOS = 0x3 + IP_TTL = 0x4 + IP_UNBLOCK_SOURCE = 0x49 + ISIG = 0x80 + ISTRIP = 0x20 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + KERN_HOSTNAME = 0xa + KERN_OSRELEASE = 0x2 + KERN_OSTYPE = 0x1 + KERN_VERSION = 0x4 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_AUTOSYNC = 0x7 + MADV_CORE = 0x9 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x5 + MADV_NOCORE = 0x8 + MADV_NORMAL = 0x0 + MADV_NOSYNC = 0x6 + MADV_PROTECT = 0xa + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_WILLNEED = 0x3 + MAP_ALIGNED_SUPER = 0x1000000 + MAP_ALIGNMENT_MASK = -0x1000000 + MAP_ALIGNMENT_SHIFT = 0x18 + MAP_ANON = 0x1000 + MAP_ANONYMOUS = 0x1000 + MAP_COPY = 0x2 + MAP_EXCL = 0x4000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GUARD = 0x2000 + MAP_HASSEMAPHORE = 0x200 + MAP_NOCORE = 0x20000 + MAP_NOSYNC = 0x800 + MAP_PREFAULT_READ = 0x40000 + MAP_PRIVATE = 0x2 + MAP_RESERVED0020 = 0x20 + MAP_RESERVED0040 = 0x40 + MAP_RESERVED0080 = 0x80 + MAP_RESERVED0100 = 0x100 + MAP_SHARED = 0x1 + MAP_STACK = 0x400 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MNT_ACLS = 0x8000000 + MNT_ASYNC = 0x40 + MNT_AUTOMOUNTED = 0x200000000 + MNT_BYFSID = 0x8000000 + MNT_CMDFLAGS = 0xd0f0000 + MNT_DEFEXPORTED = 0x200 + MNT_DELEXPORT = 0x20000 + MNT_EXKERB = 0x800 + MNT_EXPORTANON = 0x400 + MNT_EXPORTED = 0x100 + MNT_EXPUBLIC = 0x20000000 + MNT_EXRDONLY = 0x80 + MNT_FORCE = 0x80000 + MNT_GJOURNAL = 0x2000000 + MNT_IGNORE = 0x800000 + MNT_LAZY = 0x3 + MNT_LOCAL = 0x1000 + MNT_MULTILABEL = 0x4000000 + MNT_NFS4ACLS = 0x10 + MNT_NOATIME = 0x10000000 + MNT_NOCLUSTERR = 0x40000000 + MNT_NOCLUSTERW = 0x80000000 + MNT_NOEXEC = 0x4 + MNT_NONBUSY = 0x4000000 + MNT_NOSUID = 0x8 + MNT_NOSYMFOLLOW = 0x400000 + MNT_NOWAIT = 0x2 + MNT_QUOTA = 0x2000 + MNT_RDONLY = 0x1 + MNT_RELOAD = 0x40000 + MNT_ROOTFS = 0x4000 + MNT_SNAPSHOT = 0x1000000 + MNT_SOFTDEP = 0x200000 + MNT_SUIDDIR = 0x100000 + MNT_SUJ = 0x100000000 + MNT_SUSPEND = 0x4 + MNT_SYNCHRONOUS = 0x2 + MNT_UNION = 0x20 + MNT_UPDATE = 0x10000 + MNT_UPDATEMASK = 0x2d8d0807e + MNT_USER = 0x8000 + MNT_VISFLAGMASK = 0x3fef0ffff + MNT_WAIT = 0x1 + MSG_CMSG_CLOEXEC = 0x40000 + MSG_COMPAT = 0x8000 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOF = 0x100 + MSG_EOR = 0x8 + MSG_NBIO = 0x4000 + MSG_NOSIGNAL = 0x20000 + MSG_NOTIFICATION = 0x2000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MSG_WAITFORONE = 0x80000 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x2 + MS_SYNC = 0x0 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_IFLISTL = 0x5 + NET_RT_IFMALIST = 0x4 + NOFLSH = 0x80000000 + NOKERNINFO = 0x2000000 + NOTE_ATTRIB = 0x8 + NOTE_CHILD = 0x4 + NOTE_CLOSE = 0x100 + NOTE_CLOSE_WRITE = 0x200 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXTEND = 0x4 + NOTE_FFAND = 0x40000000 + NOTE_FFCOPY = 0xc0000000 + NOTE_FFCTRLMASK = 0xc0000000 + NOTE_FFLAGSMASK = 0xffffff + NOTE_FFNOP = 0x0 + NOTE_FFOR = 0x80000000 + NOTE_FILE_POLL = 0x2 + NOTE_FORK = 0x40000000 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_MSECONDS = 0x2 + NOTE_NSECONDS = 0x8 + NOTE_OPEN = 0x80 + NOTE_PCTRLMASK = 0xf0000000 + NOTE_PDATAMASK = 0xfffff + NOTE_READ = 0x400 + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_SECONDS = 0x1 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRIGGER = 0x1000000 + NOTE_USECONDS = 0x4 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + OXTABS = 0x4 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x100000 + O_CREAT = 0x200 + O_DIRECT = 0x10000 + O_DIRECTORY = 0x20000 + O_EXCL = 0x800 + O_EXEC = 0x40000 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_TTY_INIT = 0x80000 + O_VERIFY = 0x200000 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + RLIMIT_AS = 0xa + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_MEMLOCK = 0x6 + RLIMIT_NOFILE = 0x8 + RLIMIT_NPROC = 0x7 + RLIMIT_RSS = 0x5 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x8 + RTAX_NETMASK = 0x2 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_FIXEDMTU = 0x80000 + RTF_FMASK = 0x1004d808 + RTF_GATEWAY = 0x2 + RTF_GWFLAG_COMPAT = 0x80000000 + RTF_HOST = 0x4 + RTF_LLDATA = 0x400 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MODIFIED = 0x20 + RTF_MULTICAST = 0x800000 + RTF_PINNED = 0x100000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x40000 + RTF_REJECT = 0x8 + RTF_RNH_LOCKED = 0x40000000 + RTF_STATIC = 0x800 + RTF_STICKY = 0x10000000 + RTF_UP = 0x1 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DELMADDR = 0x10 + RTM_GET = 0x4 + RTM_IEEE80211 = 0x12 + RTM_IFANNOUNCE = 0x11 + RTM_IFINFO = 0xe + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_NEWMADDR = 0xf + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RTV_WEIGHT = 0x100 + RT_ALL_FIBS = -0x1 + RT_BLACKHOLE = 0x40 + RT_CACHING_CONTEXT = 0x1 + RT_DEFAULT_FIB = 0x0 + RT_HAS_GW = 0x80 + RT_HAS_HEADER = 0x10 + RT_HAS_HEADER_BIT = 0x4 + RT_L2_ME = 0x4 + RT_L2_ME_BIT = 0x2 + RT_LLE_CACHE = 0x100 + RT_MAY_LOOP = 0x8 + RT_MAY_LOOP_BIT = 0x3 + RT_NORTREF = 0x2 + RT_REJECT = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_BINTIME = 0x4 + SCM_CREDS = 0x3 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x2 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCAIFADDR = 0x8040691a + SIOCAIFGROUP = 0x80246987 + SIOCATMARK = 0x40047307 + SIOCDELMULTI = 0x80206932 + SIOCDIFADDR = 0x80206919 + SIOCDIFGROUP = 0x80246989 + SIOCDIFPHYADDR = 0x80206949 + SIOCGDRVSPEC = 0xc01c697b + SIOCGETSGCNT = 0xc0147210 + SIOCGETVIFCNT = 0xc014720f + SIOCGHIWAT = 0x40047301 + SIOCGHWADDR = 0xc020693e + SIOCGI2C = 0xc020693d + SIOCGIFADDR = 0xc0206921 + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCAP = 0xc020691f + SIOCGIFCONF = 0xc0086924 + SIOCGIFDESCR = 0xc020692a + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFIB = 0xc020695c + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGENERIC = 0xc020693a + SIOCGIFGMEMB = 0xc024698a + SIOCGIFGROUP = 0xc0246988 + SIOCGIFINDEX = 0xc0206920 + SIOCGIFMAC = 0xc0206926 + SIOCGIFMEDIA = 0xc0286938 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc0206933 + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206948 + SIOCGIFPHYS = 0xc0206935 + SIOCGIFPSRCADDR = 0xc0206947 + SIOCGIFSTATUS = 0xc331693b + SIOCGIFXMEDIA = 0xc028698b + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCGPRIVATE_0 = 0xc0206950 + SIOCGPRIVATE_1 = 0xc0206951 + SIOCGTUNFIB = 0xc020695e + SIOCIFCREATE = 0xc020697a + SIOCIFCREATE2 = 0xc020697c + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc00c6978 + SIOCSDRVSPEC = 0x801c697b + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFCAP = 0x8020691e + SIOCSIFDESCR = 0x80206929 + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFIB = 0x8020695d + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGENERIC = 0x80206939 + SIOCSIFLLADDR = 0x8020693c + SIOCSIFMAC = 0x80206927 + SIOCSIFMEDIA = 0xc0206937 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x80206934 + SIOCSIFNAME = 0x80206928 + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x80406946 + SIOCSIFPHYS = 0x80206936 + SIOCSIFRVNET = 0xc020695b + SIOCSIFVNET = 0xc020695a + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SIOCSTUNFIB = 0x8020695f + SOCK_CLOEXEC = 0x10000000 + SOCK_DGRAM = 0x2 + SOCK_MAXADDRLEN = 0xff + SOCK_NONBLOCK = 0x20000000 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_ACCEPTFILTER = 0x1000 + SO_BINTIME = 0x2000 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LABEL = 0x1009 + SO_LINGER = 0x80 + SO_LISTENINCQLEN = 0x1013 + SO_LISTENQLEN = 0x1012 + SO_LISTENQLIMIT = 0x1011 + SO_NOSIGPIPE = 0x800 + SO_NO_DDP = 0x8000 + SO_NO_OFFLOAD = 0x4000 + SO_OOBINLINE = 0x100 + SO_PEERLABEL = 0x1010 + SO_PROTOCOL = 0x1016 + SO_PROTOTYPE = 0x1016 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_SETFIB = 0x1014 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_TIMESTAMP = 0x400 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + SO_USER_COOKIE = 0x1015 + SO_VENDOR = 0x80000000 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IFWHT = 0xe000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISTXT = 0x200 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB3 = 0x4 + TABDLY = 0x4 + TCIFLUSH = 0x1 + TCIOFF = 0x3 + TCIOFLUSH = 0x3 + TCION = 0x4 + TCOFLUSH = 0x2 + TCOOFF = 0x1 + TCOON = 0x2 + TCP_CA_NAME_MAX = 0x10 + TCP_CCALGOOPT = 0x41 + TCP_CONGESTION = 0x40 + TCP_FASTOPEN = 0x401 + TCP_FUNCTION_BLK = 0x2000 + TCP_FUNCTION_NAME_LEN_MAX = 0x20 + TCP_INFO = 0x20 + TCP_KEEPCNT = 0x400 + TCP_KEEPIDLE = 0x100 + TCP_KEEPINIT = 0x80 + TCP_KEEPINTVL = 0x200 + TCP_MAXBURST = 0x4 + TCP_MAXHLEN = 0x3c + TCP_MAXOLEN = 0x28 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x4 + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0x10 + TCP_MINMSS = 0xd8 + TCP_MSS = 0x218 + TCP_NODELAY = 0x1 + TCP_NOOPT = 0x8 + TCP_NOPUSH = 0x4 + TCP_PCAP_IN = 0x1000 + TCP_PCAP_OUT = 0x800 + TCP_VENDOR = 0x80000000 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLUSH = 0x80047410 + TIOCGDRAINWAIT = 0x40047456 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGPGRP = 0x40047477 + TIOCGPTN = 0x4004740f + TIOCGSID = 0x40047463 + TIOCGWINSZ = 0x40087468 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGDTRWAIT = 0x4004745a + TIOCMGET = 0x4004746a + TIOCMSDTRWAIT = 0x8004745b + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DCD = 0x40 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCPTMASTER = 0x2000741c + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDRAINWAIT = 0x80047457 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSIG = 0x2004745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x20007465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCTIMESTAMP = 0x40107459 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VERASE2 = 0x7 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WCONTINUED = 0x4 + WCOREFLAG = 0x80 + WEXITED = 0x10 + WLINUXCLONE = 0x80000000 + WNOHANG = 0x1 + WNOWAIT = 0x8 + WSTOPPED = 0x2 + WTRAPPED = 0x20 + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADF = syscall.Errno(0x9) + EBADMSG = syscall.Errno(0x59) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x55) + ECAPMODE = syscall.Errno(0x5e) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDOM = syscall.Errno(0x21) + EDOOFUS = syscall.Errno(0x58) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x52) + EILSEQ = syscall.Errno(0x56) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x60) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5a) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x57) + ENOBUFS = syscall.Errno(0x37) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x5b) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x53) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCAPABLE = syscall.Errno(0x5d) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTRECOVERABLE = syscall.Errno(0x5f) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x2d) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x54) + EOWNERDEAD = syscall.Errno(0x60) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTO = syscall.Errno(0x5c) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGLIBRT = syscall.Signal(0x21) + SIGLWP = syscall.Signal(0x20) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTHR = syscall.Signal(0x20) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "device not configured"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EDEADLK", "resource deadlock avoided"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "cross-device link"}, + {19, "ENODEV", "operation not supported by device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "result too large"}, + {35, "EAGAIN", "resource temporarily unavailable"}, + {36, "EINPROGRESS", "operation now in progress"}, + {37, "EALREADY", "operation already in progress"}, + {38, "ENOTSOCK", "socket operation on non-socket"}, + {39, "EDESTADDRREQ", "destination address required"}, + {40, "EMSGSIZE", "message too long"}, + {41, "EPROTOTYPE", "protocol wrong type for socket"}, + {42, "ENOPROTOOPT", "protocol not available"}, + {43, "EPROTONOSUPPORT", "protocol not supported"}, + {44, "ESOCKTNOSUPPORT", "socket type not supported"}, + {45, "EOPNOTSUPP", "operation not supported"}, + {46, "EPFNOSUPPORT", "protocol family not supported"}, + {47, "EAFNOSUPPORT", "address family not supported by protocol family"}, + {48, "EADDRINUSE", "address already in use"}, + {49, "EADDRNOTAVAIL", "can't assign requested address"}, + {50, "ENETDOWN", "network is down"}, + {51, "ENETUNREACH", "network is unreachable"}, + {52, "ENETRESET", "network dropped connection on reset"}, + {53, "ECONNABORTED", "software caused connection abort"}, + {54, "ECONNRESET", "connection reset by peer"}, + {55, "ENOBUFS", "no buffer space available"}, + {56, "EISCONN", "socket is already connected"}, + {57, "ENOTCONN", "socket is not connected"}, + {58, "ESHUTDOWN", "can't send after socket shutdown"}, + {59, "ETOOMANYREFS", "too many references: can't splice"}, + {60, "ETIMEDOUT", "operation timed out"}, + {61, "ECONNREFUSED", "connection refused"}, + {62, "ELOOP", "too many levels of symbolic links"}, + {63, "ENAMETOOLONG", "file name too long"}, + {64, "EHOSTDOWN", "host is down"}, + {65, "EHOSTUNREACH", "no route to host"}, + {66, "ENOTEMPTY", "directory not empty"}, + {67, "EPROCLIM", "too many processes"}, + {68, "EUSERS", "too many users"}, + {69, "EDQUOT", "disc quota exceeded"}, + {70, "ESTALE", "stale NFS file handle"}, + {71, "EREMOTE", "too many levels of remote in path"}, + {72, "EBADRPC", "RPC struct is bad"}, + {73, "ERPCMISMATCH", "RPC version wrong"}, + {74, "EPROGUNAVAIL", "RPC prog. not avail"}, + {75, "EPROGMISMATCH", "program version wrong"}, + {76, "EPROCUNAVAIL", "bad procedure for program"}, + {77, "ENOLCK", "no locks available"}, + {78, "ENOSYS", "function not implemented"}, + {79, "EFTYPE", "inappropriate file type or format"}, + {80, "EAUTH", "authentication error"}, + {81, "ENEEDAUTH", "need authenticator"}, + {82, "EIDRM", "identifier removed"}, + {83, "ENOMSG", "no message of desired type"}, + {84, "EOVERFLOW", "value too large to be stored in data type"}, + {85, "ECANCELED", "operation canceled"}, + {86, "EILSEQ", "illegal byte sequence"}, + {87, "ENOATTR", "attribute not found"}, + {88, "EDOOFUS", "programming error"}, + {89, "EBADMSG", "bad message"}, + {90, "EMULTIHOP", "multihop attempted"}, + {91, "ENOLINK", "link has been severed"}, + {92, "EPROTO", "protocol error"}, + {93, "ENOTCAPABLE", "capabilities insufficient"}, + {94, "ECAPMODE", "not permitted in capability mode"}, + {95, "ENOTRECOVERABLE", "state not recoverable"}, + {96, "EOWNERDEAD", "previous owner died"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/BPT trap"}, + {6, "SIGIOT", "abort trap"}, + {7, "SIGEMT", "EMT trap"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGBUS", "bus error"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGSYS", "bad system call"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGURG", "urgent I/O condition"}, + {17, "SIGSTOP", "suspended (signal)"}, + {18, "SIGTSTP", "suspended"}, + {19, "SIGCONT", "continued"}, + {20, "SIGCHLD", "child exited"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGIO", "I/O possible"}, + {24, "SIGXCPU", "cputime limit exceeded"}, + {25, "SIGXFSZ", "filesize limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window size changes"}, + {29, "SIGINFO", "information request"}, + {30, "SIGUSR1", "user defined signal 1"}, + {31, "SIGUSR2", "user defined signal 2"}, + {32, "SIGTHR", "unknown signal"}, + {33, "SIGLIBRT", "unknown signal"}, +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_386.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_386.go new file mode 100644 index 00000000..7d93bdf0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_386.go @@ -0,0 +1,2702 @@ +// mkerrors.sh -Wall -Werror -static -I/tmp/include -m32 +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build 386,linux + +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs -- -Wall -Werror -static -I/tmp/include -m32 _const.go + +package unix + +import "syscall" + +const ( + AAFS_MAGIC = 0x5a3c69f0 + ADFS_SUPER_MAGIC = 0xadf5 + AFFS_SUPER_MAGIC = 0xadff + AFS_FS_MAGIC = 0x6b414653 + AFS_SUPER_MAGIC = 0x5346414f + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2c + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + AF_XDP = 0x2c + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ANON_INODE_FS_MAGIC = 0x9041934 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_RAWIP = 0x207 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + AUTOFS_SUPER_MAGIC = 0x187 + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BALLOON_KVM_MAGIC = 0x13661366 + BDEVFS_MAGIC = 0x62646576 + BINFMTFS_MAGIC = 0x42494e4d + BLKBSZGET = 0x80041270 + BLKBSZSET = 0x40041271 + BLKFLSBUF = 0x1261 + BLKFRAGET = 0x1265 + BLKFRASET = 0x1264 + BLKGETSIZE = 0x1260 + BLKGETSIZE64 = 0x80041272 + BLKPBSZGET = 0x127b + BLKRAGET = 0x1263 + BLKRASET = 0x1262 + BLKROGET = 0x125e + BLKROSET = 0x125d + BLKRRPART = 0x125f + BLKSECTGET = 0x1267 + BLKSECTSET = 0x1266 + BLKSSZGET = 0x1268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_FS_MAGIC = 0xcafe4a11 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + BTRFS_SUPER_MAGIC = 0x9123683e + BTRFS_TEST_MAGIC = 0x73727279 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CGROUP2_SUPER_MAGIC = 0x63677270 + CGROUP_SUPER_MAGIC = 0x27e0eb + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CODA_SUPER_MAGIC = 0x73757245 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRAMFS_MAGIC = 0x28cd3d45 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DAXFS_MAGIC = 0x64646178 + DEBUGFS_MAGIC = 0x64626720 + DEVPTS_SUPER_MAGIC = 0x1cd1 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + ECRYPTFS_SUPER_MAGIC = 0xf15f + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x800 + EFD_SEMAPHORE = 0x1 + EFIVARFS_MAGIC = 0xde5e81e4 + EFS_SUPER_MAGIC = 0x414a53 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_ERSPAN = 0x88be + ETH_P_ERSPAN2 = 0x22eb + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IFE = 0xed3e + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MAP = 0xf9 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_NSH = 0x894f + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PREAUTH = 0x88c7 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXABYTE_ENABLE_NEST = 0xf0 + EXT2_SUPER_MAGIC = 0xef53 + EXT3_SUPER_MAGIC = 0xef53 + EXT4_SUPER_MAGIC = 0xef53 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + F2FS_SUPER_MAGIC = 0xf2f52010 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x1000 + FP_XSTATE_MAGIC2 = 0x46505845 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_ENCRYPTION_MODE_SPECK128_256_CTS = 0x8 + FS_ENCRYPTION_MODE_SPECK128_256_XTS = 0x7 + FS_IOC_GET_ENCRYPTION_POLICY = 0x400c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x40106614 + FS_IOC_SET_ENCRYPTION_POLICY = 0x800c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0x3 + FUTEXFS_SUPER_MAGIC = 0xbad1dea + F_ADD_SEALS = 0x409 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0xc + F_GETLK64 = 0xc + F_GETOWN = 0x9 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_GET_FILE_RW_HINT = 0x40d + F_GET_RW_HINT = 0x40b + F_GET_SEALS = 0x40a + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SEAL_GROW = 0x4 + F_SEAL_SEAL = 0x1 + F_SEAL_SHRINK = 0x2 + F_SEAL_WRITE = 0x8 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0xd + F_SETLK64 = 0xd + F_SETLKW = 0xe + F_SETLKW64 = 0xe + F_SETOWN = 0x8 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SET_FILE_RW_HINT = 0x40e + F_SET_RW_HINT = 0x40c + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HDIO_DRIVE_CMD = 0x31f + HDIO_DRIVE_CMD_AEB = 0x31e + HDIO_DRIVE_CMD_HDR_SIZE = 0x4 + HDIO_DRIVE_HOB_HDR_SIZE = 0x8 + HDIO_DRIVE_RESET = 0x31c + HDIO_DRIVE_TASK = 0x31e + HDIO_DRIVE_TASKFILE = 0x31d + HDIO_DRIVE_TASK_HDR_SIZE = 0x8 + HDIO_GETGEO = 0x301 + HDIO_GET_32BIT = 0x309 + HDIO_GET_ACOUSTIC = 0x30f + HDIO_GET_ADDRESS = 0x310 + HDIO_GET_BUSSTATE = 0x31a + HDIO_GET_DMA = 0x30b + HDIO_GET_IDENTITY = 0x30d + HDIO_GET_KEEPSETTINGS = 0x308 + HDIO_GET_MULTCOUNT = 0x304 + HDIO_GET_NICE = 0x30c + HDIO_GET_NOWERR = 0x30a + HDIO_GET_QDMA = 0x305 + HDIO_GET_UNMASKINTR = 0x302 + HDIO_GET_WCACHE = 0x30e + HDIO_OBSOLETE_IDENTITY = 0x307 + HDIO_SCAN_HWIF = 0x328 + HDIO_SET_32BIT = 0x324 + HDIO_SET_ACOUSTIC = 0x32c + HDIO_SET_ADDRESS = 0x32f + HDIO_SET_BUSSTATE = 0x32d + HDIO_SET_DMA = 0x326 + HDIO_SET_KEEPSETTINGS = 0x323 + HDIO_SET_MULTCOUNT = 0x321 + HDIO_SET_NICE = 0x329 + HDIO_SET_NOWERR = 0x325 + HDIO_SET_PIO_MODE = 0x327 + HDIO_SET_QDMA = 0x32e + HDIO_SET_UNMASKINTR = 0x322 + HDIO_SET_WCACHE = 0x32b + HDIO_SET_XFER = 0x306 + HDIO_TRISTATE_HWIF = 0x31b + HDIO_UNREGISTER_HWIF = 0x32a + HOSTFS_SUPER_MAGIC = 0xc0ffee + HPFS_SUPER_MAGIC = 0xf995e849 + HUGETLBFS_MAGIC = 0x958458f6 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x8000 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x9 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NAPI = 0x10 + IFF_NAPI_FRAGS = 0x20 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x800 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_FREEBIND = 0x4e + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISOFS_SUPER_MAGIC = 0x9660 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + JFFS2_SUPER_MAGIC = 0x72b6 + KEXEC_ARCH_386 = 0x30000 + KEXEC_ARCH_68K = 0x40000 + KEXEC_ARCH_AARCH64 = 0xb70000 + KEXEC_ARCH_ARM = 0x280000 + KEXEC_ARCH_DEFAULT = 0x0 + KEXEC_ARCH_IA_64 = 0x320000 + KEXEC_ARCH_MASK = 0xffff0000 + KEXEC_ARCH_MIPS = 0x80000 + KEXEC_ARCH_MIPS_LE = 0xa0000 + KEXEC_ARCH_PPC = 0x140000 + KEXEC_ARCH_PPC64 = 0x150000 + KEXEC_ARCH_S390 = 0x160000 + KEXEC_ARCH_SH = 0x2a0000 + KEXEC_ARCH_X86_64 = 0x3e0000 + KEXEC_FILE_NO_INITRAMFS = 0x4 + KEXEC_FILE_ON_CRASH = 0x2 + KEXEC_FILE_UNLOAD = 0x1 + KEXEC_ON_CRASH = 0x1 + KEXEC_PRESERVE_CONTEXT = 0x2 + KEXEC_SEGMENT_MAX = 0x10 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_NEGATE = 0xd + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_KEEPONFORK = 0x13 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MADV_WIPEONFORK = 0x12 + MAP_32BIT = 0x40 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_FIXED_NOREPLACE = 0x100000 + MAP_GROWSDOWN = 0x100 + MAP_HUGETLB = 0x40000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x2000 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x4000 + MAP_POPULATE = 0x8000 + MAP_PRIVATE = 0x2 + MAP_SHARED = 0x1 + MAP_SHARED_VALIDATE = 0x3 + MAP_STACK = 0x20000 + MAP_SYNC = 0x80000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MFD_ALLOW_SEALING = 0x2 + MFD_CLOEXEC = 0x1 + MFD_HUGETLB = 0x4 + MFD_HUGE_16GB = -0x78000000 + MFD_HUGE_16MB = 0x60000000 + MFD_HUGE_1GB = 0x78000000 + MFD_HUGE_1MB = 0x50000000 + MFD_HUGE_256MB = 0x70000000 + MFD_HUGE_2GB = 0x7c000000 + MFD_HUGE_2MB = 0x54000000 + MFD_HUGE_32MB = 0x64000000 + MFD_HUGE_512KB = 0x4c000000 + MFD_HUGE_512MB = 0x74000000 + MFD_HUGE_64KB = 0x40000000 + MFD_HUGE_8MB = 0x5c000000 + MFD_HUGE_MASK = 0x3f + MFD_HUGE_SHIFT = 0x1a + MINIX2_SUPER_MAGIC = 0x2468 + MINIX2_SUPER_MAGIC2 = 0x2478 + MINIX3_SUPER_MAGIC = 0x4d5a + MINIX_SUPER_MAGIC = 0x137f + MINIX_SUPER_MAGIC2 = 0x138f + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSDOS_SUPER_MAGIC = 0x4d44 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MSG_ZEROCOPY = 0x4000000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + MTD_INODE_FS_MAGIC = 0x11307854 + NAME_MAX = 0xff + NCP_SUPER_MAGIC = 0x564c + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NETNSA_MAX = 0x3 + NETNSA_NSID_NOT_ASSIGNED = -0x1 + NFNETLINK_V0 = 0x0 + NFNLGRP_ACCT_QUOTA = 0x8 + NFNLGRP_CONNTRACK_DESTROY = 0x3 + NFNLGRP_CONNTRACK_EXP_DESTROY = 0x6 + NFNLGRP_CONNTRACK_EXP_NEW = 0x4 + NFNLGRP_CONNTRACK_EXP_UPDATE = 0x5 + NFNLGRP_CONNTRACK_NEW = 0x1 + NFNLGRP_CONNTRACK_UPDATE = 0x2 + NFNLGRP_MAX = 0x9 + NFNLGRP_NFTABLES = 0x7 + NFNLGRP_NFTRACE = 0x9 + NFNLGRP_NONE = 0x0 + NFNL_BATCH_MAX = 0x1 + NFNL_MSG_BATCH_BEGIN = 0x10 + NFNL_MSG_BATCH_END = 0x11 + NFNL_NFA_NEST = 0x8000 + NFNL_SUBSYS_ACCT = 0x7 + NFNL_SUBSYS_COUNT = 0xc + NFNL_SUBSYS_CTHELPER = 0x9 + NFNL_SUBSYS_CTNETLINK = 0x1 + NFNL_SUBSYS_CTNETLINK_EXP = 0x2 + NFNL_SUBSYS_CTNETLINK_TIMEOUT = 0x8 + NFNL_SUBSYS_IPSET = 0x6 + NFNL_SUBSYS_NFTABLES = 0xa + NFNL_SUBSYS_NFT_COMPAT = 0xb + NFNL_SUBSYS_NONE = 0x0 + NFNL_SUBSYS_OSF = 0x5 + NFNL_SUBSYS_QUEUE = 0x3 + NFNL_SUBSYS_ULOG = 0x4 + NFS_SUPER_MAGIC = 0x6969 + NILFS_SUPER_MAGIC = 0x3434 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_NONREC = 0x100 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + NSFS_MAGIC = 0x6e736673 + OCFS2_SUPER_MAGIC = 0x7461636f + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPENPROM_SUPER_MAGIC = 0x9fa1 + OPOST = 0x1 + OVERLAYFS_SUPER_MAGIC = 0x794c7630 + O_ACCMODE = 0x3 + O_APPEND = 0x400 + O_ASYNC = 0x2000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x40 + O_DIRECT = 0x4000 + O_DIRECTORY = 0x10000 + O_DSYNC = 0x1000 + O_EXCL = 0x80 + O_FSYNC = 0x101000 + O_LARGEFILE = 0x8000 + O_NDELAY = 0x800 + O_NOATIME = 0x40000 + O_NOCTTY = 0x100 + O_NOFOLLOW = 0x20000 + O_NONBLOCK = 0x800 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x101000 + O_SYNC = 0x101000 + O_TMPFILE = 0x410000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x2401 + PERF_EVENT_IOC_ENABLE = 0x2400 + PERF_EVENT_IOC_ID = 0x80042407 + PERF_EVENT_IOC_MODIFY_ATTRIBUTES = 0x4004240b + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x40042409 + PERF_EVENT_IOC_PERIOD = 0x40082404 + PERF_EVENT_IOC_QUERY_BPF = 0xc004240a + PERF_EVENT_IOC_REFRESH = 0x2402 + PERF_EVENT_IOC_RESET = 0x2403 + PERF_EVENT_IOC_SET_BPF = 0x40042408 + PERF_EVENT_IOC_SET_FILTER = 0x40042406 + PERF_EVENT_IOC_SET_OUTPUT = 0x2405 + PIPEFS_MAGIC = 0x50495045 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROC_SUPER_MAGIC = 0x9fa0 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_SPECULATION_CTRL = 0x34 + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_SPECULATION_CTRL = 0x35 + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_SPEC_DISABLE = 0x4 + PR_SPEC_ENABLE = 0x2 + PR_SPEC_FORCE_DISABLE = 0x8 + PR_SPEC_NOT_AFFECTED = 0x0 + PR_SPEC_PRCTL = 0x1 + PR_SPEC_STORE_BYPASS = 0x0 + PR_SVE_GET_VL = 0x33 + PR_SVE_SET_VL = 0x32 + PR_SVE_SET_VL_ONEXEC = 0x40000 + PR_SVE_VL_INHERIT = 0x20000 + PR_SVE_VL_LEN_MASK = 0xffff + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PSTOREFS_MAGIC = 0x6165676c + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETFPREGS = 0xe + PTRACE_GETFPXREGS = 0x12 + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_THREAD_AREA = 0x19 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_OLDSETOPTIONS = 0x15 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKETEXT = 0x4 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SECCOMP_GET_METADATA = 0x420d + PTRACE_SEIZE = 0x4206 + PTRACE_SETFPREGS = 0xf + PTRACE_SETFPXREGS = 0x13 + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SET_THREAD_AREA = 0x1a + PTRACE_SINGLEBLOCK = 0x21 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_SYSEMU = 0x1f + PTRACE_SYSEMU_SINGLESTEP = 0x20 + PTRACE_TRACEME = 0x0 + QNX4_SUPER_MAGIC = 0x2f + QNX6_SUPER_MAGIC = 0x68191122 + RAMFS_MAGIC = 0x858458f6 + RDTGROUP_SUPER_MAGIC = 0x7655821 + REISERFS_SUPER_MAGIC = 0x52654973 + RENAME_EXCHANGE = 0x2 + RENAME_NOREPLACE = 0x1 + RENAME_WHITEOUT = 0x4 + RLIMIT_AS = 0x9 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x8 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x7 + RLIMIT_NPROC = 0x6 + RLIMIT_RSS = 0x5 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FASTOPEN_NO_COOKIE = 0x11 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x11 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1d + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTC_AF = 0x20 + RTC_AIE_OFF = 0x7002 + RTC_AIE_ON = 0x7001 + RTC_ALM_READ = 0x80247008 + RTC_ALM_SET = 0x40247007 + RTC_EPOCH_READ = 0x8004700d + RTC_EPOCH_SET = 0x4004700e + RTC_IRQF = 0x80 + RTC_IRQP_READ = 0x8004700b + RTC_IRQP_SET = 0x4004700c + RTC_MAX_FREQ = 0x2000 + RTC_PF = 0x40 + RTC_PIE_OFF = 0x7006 + RTC_PIE_ON = 0x7005 + RTC_PLL_GET = 0x801c7011 + RTC_PLL_SET = 0x401c7012 + RTC_RD_TIME = 0x80247009 + RTC_SET_TIME = 0x4024700a + RTC_UF = 0x10 + RTC_UIE_OFF = 0x7004 + RTC_UIE_ON = 0x7003 + RTC_VL_CLR = 0x7014 + RTC_VL_READ = 0x80047013 + RTC_WIE_OFF = 0x7010 + RTC_WIE_ON = 0x700f + RTC_WKALM_RD = 0x80287010 + RTC_WKALM_SET = 0x4028700f + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELCHAIN = 0x65 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETCHAIN = 0x66 + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x67 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWCHAIN = 0x64 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x16 + RTM_NR_MSGTYPES = 0x58 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BGP = 0xba + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_EIGRP = 0xc0 + RTPROT_GATED = 0x8 + RTPROT_ISIS = 0xbb + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_OSPF = 0xbc + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_RIP = 0xbd + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_TXTIME = 0x3d + SCM_WIFI_STATUS = 0x29 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SECURITYFS_MAGIC = 0x73636673 + SELINUX_MAGIC = 0xf97cff8c + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x8905 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x8904 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x541b + SIOCOUTQ = 0x5411 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x8902 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SMACK_MAGIC = 0x43415d53 + SMART_AUTOSAVE = 0xd2 + SMART_AUTO_OFFLINE = 0xdb + SMART_DISABLE = 0xd9 + SMART_ENABLE = 0xd8 + SMART_HCYL_PASS = 0xc2 + SMART_IMMEDIATE_OFFLINE = 0xd4 + SMART_LCYL_PASS = 0x4f + SMART_READ_LOG_SECTOR = 0xd5 + SMART_READ_THRESHOLDS = 0xd1 + SMART_READ_VALUES = 0xd0 + SMART_SAVE = 0xd3 + SMART_STATUS = 0xda + SMART_WRITE_LOG_SECTOR = 0xd6 + SMART_WRITE_THRESHOLDS = 0xd7 + SMB_SUPER_MAGIC = 0x517b + SOCKFS_MAGIC = 0x534f434b + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x2 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x800 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0x1 + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_TLS = 0x11a + SOL_X25 = 0x106 + SOL_XDP = 0x11b + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1e + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x6 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x27 + SO_DONTROUTE = 0x5 + SO_ERROR = 0x4 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x9 + SO_LINGER = 0xd + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0xa + SO_PASSCRED = 0x10 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x11 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1f + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x26 + SO_RCVBUF = 0x8 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x12 + SO_RCVTIMEO = 0x14 + SO_REUSEADDR = 0x2 + SO_REUSEPORT = 0xf + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x7 + SO_SNDBUFFORCE = 0x20 + SO_SNDLOWAT = 0x13 + SO_SNDTIMEO = 0x15 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TXTIME = 0x3d + SO_TYPE = 0x3 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SO_ZEROCOPY = 0x3c + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + SQUASHFS_MAGIC = 0x73717368 + STACK_END_MAGIC = 0x57ac6e9d + STATX_ALL = 0xfff + STATX_ATIME = 0x20 + STATX_ATTR_APPEND = 0x20 + STATX_ATTR_AUTOMOUNT = 0x1000 + STATX_ATTR_COMPRESSED = 0x4 + STATX_ATTR_ENCRYPTED = 0x800 + STATX_ATTR_IMMUTABLE = 0x10 + STATX_ATTR_NODUMP = 0x40 + STATX_BASIC_STATS = 0x7ff + STATX_BLOCKS = 0x400 + STATX_BTIME = 0x800 + STATX_CTIME = 0x80 + STATX_GID = 0x10 + STATX_INO = 0x100 + STATX_MODE = 0x2 + STATX_MTIME = 0x40 + STATX_NLINK = 0x4 + STATX_SIZE = 0x200 + STATX_TYPE = 0x1 + STATX_UID = 0x8 + STATX__RESERVED = 0x80000000 + SYNC_FILE_RANGE_WAIT_AFTER = 0x4 + SYNC_FILE_RANGE_WAIT_BEFORE = 0x1 + SYNC_FILE_RANGE_WRITE = 0x2 + SYSFS_MAGIC = 0x62656572 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x8 + TCFLSH = 0x540b + TCGETA = 0x5405 + TCGETS = 0x5401 + TCGETS2 = 0x802c542a + TCGETX = 0x5432 + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_FASTOPEN_KEY = 0x21 + TCP_FASTOPEN_NO_COOKIE = 0x22 + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_EXT = 0x20 + TCP_MD5SIG_FLAG_PREFIX = 0x1 + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_ULP = 0x1f + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x2 + TCSBRK = 0x5409 + TCSBRKP = 0x5425 + TCSETA = 0x5406 + TCSETAF = 0x5408 + TCSETAW = 0x5407 + TCSETS = 0x5402 + TCSETS2 = 0x402c542b + TCSETSF = 0x5404 + TCSETSF2 = 0x402c542d + TCSETSW = 0x5403 + TCSETSW2 = 0x402c542c + TCSETX = 0x5433 + TCSETXF = 0x5434 + TCSETXW = 0x5435 + TCXONC = 0x540a + TIOCCBRK = 0x5428 + TIOCCONS = 0x541d + TIOCEXCL = 0x540c + TIOCGDEV = 0x80045432 + TIOCGETD = 0x5424 + TIOCGEXCL = 0x80045440 + TIOCGICOUNT = 0x545d + TIOCGLCKTRMIOS = 0x5456 + TIOCGPGRP = 0x540f + TIOCGPKT = 0x80045438 + TIOCGPTLCK = 0x80045439 + TIOCGPTN = 0x80045430 + TIOCGPTPEER = 0x5441 + TIOCGRS485 = 0x542e + TIOCGSERIAL = 0x541e + TIOCGSID = 0x5429 + TIOCGSOFTCAR = 0x5419 + TIOCGWINSZ = 0x5413 + TIOCINQ = 0x541b + TIOCLINUX = 0x541c + TIOCMBIC = 0x5417 + TIOCMBIS = 0x5416 + TIOCMGET = 0x5415 + TIOCMIWAIT = 0x545c + TIOCMSET = 0x5418 + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x5422 + TIOCNXCL = 0x540d + TIOCOUTQ = 0x5411 + TIOCPKT = 0x5420 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x540e + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x5423 + TIOCSIG = 0x40045436 + TIOCSLCKTRMIOS = 0x5457 + TIOCSPGRP = 0x5410 + TIOCSPTLCK = 0x40045431 + TIOCSRS485 = 0x542f + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x541a + TIOCSTI = 0x5412 + TIOCSWINSZ = 0x5414 + TIOCVHANGUP = 0x5437 + TMPFS_MAGIC = 0x1021994 + TOSTOP = 0x100 + TPACKET_ALIGNMENT = 0x10 + TPACKET_HDRLEN = 0x34 + TP_STATUS_AVAILABLE = 0x0 + TP_STATUS_BLK_TMO = 0x20 + TP_STATUS_COPY = 0x2 + TP_STATUS_CSUMNOTREADY = 0x8 + TP_STATUS_CSUM_VALID = 0x80 + TP_STATUS_KERNEL = 0x0 + TP_STATUS_LOSING = 0x4 + TP_STATUS_SENDING = 0x2 + TP_STATUS_SEND_REQUEST = 0x1 + TP_STATUS_TS_RAW_HARDWARE = -0x80000000 + TP_STATUS_TS_SOFTWARE = 0x20000000 + TP_STATUS_TS_SYS_HARDWARE = 0x40000000 + TP_STATUS_USER = 0x1 + TP_STATUS_VLAN_TPID_VALID = 0x40 + TP_STATUS_VLAN_VALID = 0x10 + TP_STATUS_WRONG_FORMAT = 0x4 + TRACEFS_MAGIC = 0x74726163 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x400854d5 + TUNDETACHFILTER = 0x400854d6 + TUNGETFEATURES = 0x800454cf + TUNGETFILTER = 0x800854db + TUNGETIFF = 0x800454d2 + TUNGETSNDBUF = 0x800454d3 + TUNGETVNETBE = 0x800454df + TUNGETVNETHDRSZ = 0x800454d7 + TUNGETVNETLE = 0x800454dd + TUNSETDEBUG = 0x400454c9 + TUNSETFILTEREBPF = 0x800454e1 + TUNSETGROUP = 0x400454ce + TUNSETIFF = 0x400454ca + TUNSETIFINDEX = 0x400454da + TUNSETLINK = 0x400454cd + TUNSETNOCSUM = 0x400454c8 + TUNSETOFFLOAD = 0x400454d0 + TUNSETOWNER = 0x400454cc + TUNSETPERSIST = 0x400454cb + TUNSETQUEUE = 0x400454d9 + TUNSETSNDBUF = 0x400454d4 + TUNSETSTEERINGEBPF = 0x800454e0 + TUNSETTXFILTER = 0x400454d1 + TUNSETVNETBE = 0x400454de + TUNSETVNETHDRSZ = 0x400454d8 + TUNSETVNETLE = 0x400454dc + UBI_IOCATT = 0x40186f40 + UBI_IOCDET = 0x40046f41 + UBI_IOCEBCH = 0x40044f02 + UBI_IOCEBER = 0x40044f01 + UBI_IOCEBISMAP = 0x80044f05 + UBI_IOCEBMAP = 0x40084f03 + UBI_IOCEBUNMAP = 0x40044f04 + UBI_IOCMKVOL = 0x40986f00 + UBI_IOCRMVOL = 0x40046f01 + UBI_IOCRNVOL = 0x51106f03 + UBI_IOCRSVOL = 0x400c6f02 + UBI_IOCSETVOLPROP = 0x40104f06 + UBI_IOCVOLCRBLK = 0x40804f07 + UBI_IOCVOLRMBLK = 0x4f08 + UBI_IOCVOLUP = 0x40084f00 + UDF_SUPER_MAGIC = 0x15013346 + UMOUNT_NOFOLLOW = 0x8 + USBDEVICE_SUPER_MAGIC = 0x9fa2 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + V9FS_MAGIC = 0x1021997 + VDISCARD = 0xd + VEOF = 0x4 + VEOL = 0xb + VEOL2 = 0x10 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x6 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x80045702 + WDIOC_GETPRETIMEOUT = 0x80045709 + WDIOC_GETSTATUS = 0x80045701 + WDIOC_GETSUPPORT = 0x80285700 + WDIOC_GETTEMP = 0x80045703 + WDIOC_GETTIMELEFT = 0x8004570a + WDIOC_GETTIMEOUT = 0x80045707 + WDIOC_KEEPALIVE = 0x80045705 + WDIOC_SETOPTIONS = 0x80045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WIN_ACKMEDIACHANGE = 0xdb + WIN_CHECKPOWERMODE1 = 0xe5 + WIN_CHECKPOWERMODE2 = 0x98 + WIN_DEVICE_RESET = 0x8 + WIN_DIAGNOSE = 0x90 + WIN_DOORLOCK = 0xde + WIN_DOORUNLOCK = 0xdf + WIN_DOWNLOAD_MICROCODE = 0x92 + WIN_FLUSH_CACHE = 0xe7 + WIN_FLUSH_CACHE_EXT = 0xea + WIN_FORMAT = 0x50 + WIN_GETMEDIASTATUS = 0xda + WIN_IDENTIFY = 0xec + WIN_IDENTIFY_DMA = 0xee + WIN_IDLEIMMEDIATE = 0xe1 + WIN_INIT = 0x60 + WIN_MEDIAEJECT = 0xed + WIN_MULTREAD = 0xc4 + WIN_MULTREAD_EXT = 0x29 + WIN_MULTWRITE = 0xc5 + WIN_MULTWRITE_EXT = 0x39 + WIN_NOP = 0x0 + WIN_PACKETCMD = 0xa0 + WIN_PIDENTIFY = 0xa1 + WIN_POSTBOOT = 0xdc + WIN_PREBOOT = 0xdd + WIN_QUEUED_SERVICE = 0xa2 + WIN_READ = 0x20 + WIN_READDMA = 0xc8 + WIN_READDMA_EXT = 0x25 + WIN_READDMA_ONCE = 0xc9 + WIN_READDMA_QUEUED = 0xc7 + WIN_READDMA_QUEUED_EXT = 0x26 + WIN_READ_BUFFER = 0xe4 + WIN_READ_EXT = 0x24 + WIN_READ_LONG = 0x22 + WIN_READ_LONG_ONCE = 0x23 + WIN_READ_NATIVE_MAX = 0xf8 + WIN_READ_NATIVE_MAX_EXT = 0x27 + WIN_READ_ONCE = 0x21 + WIN_RECAL = 0x10 + WIN_RESTORE = 0x10 + WIN_SECURITY_DISABLE = 0xf6 + WIN_SECURITY_ERASE_PREPARE = 0xf3 + WIN_SECURITY_ERASE_UNIT = 0xf4 + WIN_SECURITY_FREEZE_LOCK = 0xf5 + WIN_SECURITY_SET_PASS = 0xf1 + WIN_SECURITY_UNLOCK = 0xf2 + WIN_SEEK = 0x70 + WIN_SETFEATURES = 0xef + WIN_SETIDLE1 = 0xe3 + WIN_SETIDLE2 = 0x97 + WIN_SETMULT = 0xc6 + WIN_SET_MAX = 0xf9 + WIN_SET_MAX_EXT = 0x37 + WIN_SLEEPNOW1 = 0xe6 + WIN_SLEEPNOW2 = 0x99 + WIN_SMART = 0xb0 + WIN_SPECIFY = 0x91 + WIN_SRST = 0x8 + WIN_STANDBY = 0xe2 + WIN_STANDBY2 = 0x96 + WIN_STANDBYNOW1 = 0xe0 + WIN_STANDBYNOW2 = 0x94 + WIN_VERIFY = 0x40 + WIN_VERIFY_EXT = 0x42 + WIN_VERIFY_ONCE = 0x41 + WIN_WRITE = 0x30 + WIN_WRITEDMA = 0xca + WIN_WRITEDMA_EXT = 0x35 + WIN_WRITEDMA_ONCE = 0xcb + WIN_WRITEDMA_QUEUED = 0xcc + WIN_WRITEDMA_QUEUED_EXT = 0x36 + WIN_WRITE_BUFFER = 0xe8 + WIN_WRITE_EXT = 0x34 + WIN_WRITE_LONG = 0x32 + WIN_WRITE_LONG_ONCE = 0x33 + WIN_WRITE_ONCE = 0x31 + WIN_WRITE_SAME = 0xe9 + WIN_WRITE_VERIFY = 0x3c + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x20 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + X86_FXSR_MAGIC = 0x0 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XDP_COPY = 0x2 + XDP_FLAGS_DRV_MODE = 0x4 + XDP_FLAGS_HW_MODE = 0x8 + XDP_FLAGS_MASK = 0xf + XDP_FLAGS_MODES = 0xe + XDP_FLAGS_SKB_MODE = 0x2 + XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 + XDP_MMAP_OFFSETS = 0x1 + XDP_PGOFF_RX_RING = 0x0 + XDP_PGOFF_TX_RING = 0x80000000 + XDP_RX_RING = 0x2 + XDP_SHARED_UMEM = 0x1 + XDP_STATISTICS = 0x7 + XDP_TX_RING = 0x3 + XDP_UMEM_COMPLETION_RING = 0x6 + XDP_UMEM_FILL_RING = 0x5 + XDP_UMEM_PGOFF_COMPLETION_RING = 0x180000000 + XDP_UMEM_PGOFF_FILL_RING = 0x100000000 + XDP_UMEM_REG = 0x4 + XDP_ZEROCOPY = 0x4 + XENFS_SUPER_MAGIC = 0xabba1974 + XTABS = 0x1800 + ZSMALLOC_MAGIC = 0x58295829 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x62) + EADDRNOTAVAIL = syscall.Errno(0x63) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x61) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x72) + EBADE = syscall.Errno(0x34) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x4d) + EBADMSG = syscall.Errno(0x4a) + EBADR = syscall.Errno(0x35) + EBADRQC = syscall.Errno(0x38) + EBADSLT = syscall.Errno(0x39) + EBFONT = syscall.Errno(0x3b) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x7d) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x2c) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x67) + ECONNREFUSED = syscall.Errno(0x6f) + ECONNRESET = syscall.Errno(0x68) + EDEADLK = syscall.Errno(0x23) + EDEADLOCK = syscall.Errno(0x23) + EDESTADDRREQ = syscall.Errno(0x59) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x49) + EDQUOT = syscall.Errno(0x7a) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x70) + EHOSTUNREACH = syscall.Errno(0x71) + EHWPOISON = syscall.Errno(0x85) + EIDRM = syscall.Errno(0x2b) + EILSEQ = syscall.Errno(0x54) + EINPROGRESS = syscall.Errno(0x73) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x6a) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x78) + EKEYEXPIRED = syscall.Errno(0x7f) + EKEYREJECTED = syscall.Errno(0x81) + EKEYREVOKED = syscall.Errno(0x80) + EL2HLT = syscall.Errno(0x33) + EL2NSYNC = syscall.Errno(0x2d) + EL3HLT = syscall.Errno(0x2e) + EL3RST = syscall.Errno(0x2f) + ELIBACC = syscall.Errno(0x4f) + ELIBBAD = syscall.Errno(0x50) + ELIBEXEC = syscall.Errno(0x53) + ELIBMAX = syscall.Errno(0x52) + ELIBSCN = syscall.Errno(0x51) + ELNRNG = syscall.Errno(0x30) + ELOOP = syscall.Errno(0x28) + EMEDIUMTYPE = syscall.Errno(0x7c) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x5a) + EMULTIHOP = syscall.Errno(0x48) + ENAMETOOLONG = syscall.Errno(0x24) + ENAVAIL = syscall.Errno(0x77) + ENETDOWN = syscall.Errno(0x64) + ENETRESET = syscall.Errno(0x66) + ENETUNREACH = syscall.Errno(0x65) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x37) + ENOBUFS = syscall.Errno(0x69) + ENOCSI = syscall.Errno(0x32) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0x7e) + ENOLCK = syscall.Errno(0x25) + ENOLINK = syscall.Errno(0x43) + ENOMEDIUM = syscall.Errno(0x7b) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x2a) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x5c) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x26) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x6b) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x27) + ENOTNAM = syscall.Errno(0x76) + ENOTRECOVERABLE = syscall.Errno(0x83) + ENOTSOCK = syscall.Errno(0x58) + ENOTSUP = syscall.Errno(0x5f) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x4c) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x5f) + EOVERFLOW = syscall.Errno(0x4b) + EOWNERDEAD = syscall.Errno(0x82) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x60) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x5d) + EPROTOTYPE = syscall.Errno(0x5b) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x4e) + EREMOTE = syscall.Errno(0x42) + EREMOTEIO = syscall.Errno(0x79) + ERESTART = syscall.Errno(0x55) + ERFKILL = syscall.Errno(0x84) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x6c) + ESOCKTNOSUPPORT = syscall.Errno(0x5e) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x74) + ESTRPIPE = syscall.Errno(0x56) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x6e) + ETOOMANYREFS = syscall.Errno(0x6d) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x75) + EUNATCH = syscall.Errno(0x31) + EUSERS = syscall.Errno(0x57) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x36) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0x7) + SIGCHLD = syscall.Signal(0x11) + SIGCLD = syscall.Signal(0x11) + SIGCONT = syscall.Signal(0x12) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x1d) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x1d) + SIGPROF = syscall.Signal(0x1b) + SIGPWR = syscall.Signal(0x1e) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTKFLT = syscall.Signal(0x10) + SIGSTOP = syscall.Signal(0x13) + SIGSYS = syscall.Signal(0x1f) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x14) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x17) + SIGUSR1 = syscall.Signal(0xa) + SIGUSR2 = syscall.Signal(0xc) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "no such device or address"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EAGAIN", "resource temporarily unavailable"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device or resource busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "invalid cross-device link"}, + {19, "ENODEV", "no such device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "numerical result out of range"}, + {35, "EDEADLK", "resource deadlock avoided"}, + {36, "ENAMETOOLONG", "file name too long"}, + {37, "ENOLCK", "no locks available"}, + {38, "ENOSYS", "function not implemented"}, + {39, "ENOTEMPTY", "directory not empty"}, + {40, "ELOOP", "too many levels of symbolic links"}, + {42, "ENOMSG", "no message of desired type"}, + {43, "EIDRM", "identifier removed"}, + {44, "ECHRNG", "channel number out of range"}, + {45, "EL2NSYNC", "level 2 not synchronized"}, + {46, "EL3HLT", "level 3 halted"}, + {47, "EL3RST", "level 3 reset"}, + {48, "ELNRNG", "link number out of range"}, + {49, "EUNATCH", "protocol driver not attached"}, + {50, "ENOCSI", "no CSI structure available"}, + {51, "EL2HLT", "level 2 halted"}, + {52, "EBADE", "invalid exchange"}, + {53, "EBADR", "invalid request descriptor"}, + {54, "EXFULL", "exchange full"}, + {55, "ENOANO", "no anode"}, + {56, "EBADRQC", "invalid request code"}, + {57, "EBADSLT", "invalid slot"}, + {59, "EBFONT", "bad font file format"}, + {60, "ENOSTR", "device not a stream"}, + {61, "ENODATA", "no data available"}, + {62, "ETIME", "timer expired"}, + {63, "ENOSR", "out of streams resources"}, + {64, "ENONET", "machine is not on the network"}, + {65, "ENOPKG", "package not installed"}, + {66, "EREMOTE", "object is remote"}, + {67, "ENOLINK", "link has been severed"}, + {68, "EADV", "advertise error"}, + {69, "ESRMNT", "srmount error"}, + {70, "ECOMM", "communication error on send"}, + {71, "EPROTO", "protocol error"}, + {72, "EMULTIHOP", "multihop attempted"}, + {73, "EDOTDOT", "RFS specific error"}, + {74, "EBADMSG", "bad message"}, + {75, "EOVERFLOW", "value too large for defined data type"}, + {76, "ENOTUNIQ", "name not unique on network"}, + {77, "EBADFD", "file descriptor in bad state"}, + {78, "EREMCHG", "remote address changed"}, + {79, "ELIBACC", "can not access a needed shared library"}, + {80, "ELIBBAD", "accessing a corrupted shared library"}, + {81, "ELIBSCN", ".lib section in a.out corrupted"}, + {82, "ELIBMAX", "attempting to link in too many shared libraries"}, + {83, "ELIBEXEC", "cannot exec a shared library directly"}, + {84, "EILSEQ", "invalid or incomplete multibyte or wide character"}, + {85, "ERESTART", "interrupted system call should be restarted"}, + {86, "ESTRPIPE", "streams pipe error"}, + {87, "EUSERS", "too many users"}, + {88, "ENOTSOCK", "socket operation on non-socket"}, + {89, "EDESTADDRREQ", "destination address required"}, + {90, "EMSGSIZE", "message too long"}, + {91, "EPROTOTYPE", "protocol wrong type for socket"}, + {92, "ENOPROTOOPT", "protocol not available"}, + {93, "EPROTONOSUPPORT", "protocol not supported"}, + {94, "ESOCKTNOSUPPORT", "socket type not supported"}, + {95, "ENOTSUP", "operation not supported"}, + {96, "EPFNOSUPPORT", "protocol family not supported"}, + {97, "EAFNOSUPPORT", "address family not supported by protocol"}, + {98, "EADDRINUSE", "address already in use"}, + {99, "EADDRNOTAVAIL", "cannot assign requested address"}, + {100, "ENETDOWN", "network is down"}, + {101, "ENETUNREACH", "network is unreachable"}, + {102, "ENETRESET", "network dropped connection on reset"}, + {103, "ECONNABORTED", "software caused connection abort"}, + {104, "ECONNRESET", "connection reset by peer"}, + {105, "ENOBUFS", "no buffer space available"}, + {106, "EISCONN", "transport endpoint is already connected"}, + {107, "ENOTCONN", "transport endpoint is not connected"}, + {108, "ESHUTDOWN", "cannot send after transport endpoint shutdown"}, + {109, "ETOOMANYREFS", "too many references: cannot splice"}, + {110, "ETIMEDOUT", "connection timed out"}, + {111, "ECONNREFUSED", "connection refused"}, + {112, "EHOSTDOWN", "host is down"}, + {113, "EHOSTUNREACH", "no route to host"}, + {114, "EALREADY", "operation already in progress"}, + {115, "EINPROGRESS", "operation now in progress"}, + {116, "ESTALE", "stale file handle"}, + {117, "EUCLEAN", "structure needs cleaning"}, + {118, "ENOTNAM", "not a XENIX named type file"}, + {119, "ENAVAIL", "no XENIX semaphores available"}, + {120, "EISNAM", "is a named type file"}, + {121, "EREMOTEIO", "remote I/O error"}, + {122, "EDQUOT", "disk quota exceeded"}, + {123, "ENOMEDIUM", "no medium found"}, + {124, "EMEDIUMTYPE", "wrong medium type"}, + {125, "ECANCELED", "operation canceled"}, + {126, "ENOKEY", "required key not available"}, + {127, "EKEYEXPIRED", "key has expired"}, + {128, "EKEYREVOKED", "key has been revoked"}, + {129, "EKEYREJECTED", "key was rejected by service"}, + {130, "EOWNERDEAD", "owner died"}, + {131, "ENOTRECOVERABLE", "state not recoverable"}, + {132, "ERFKILL", "operation not possible due to RF-kill"}, + {133, "EHWPOISON", "memory page has hardware error"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/breakpoint trap"}, + {6, "SIGABRT", "aborted"}, + {7, "SIGBUS", "bus error"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGUSR1", "user defined signal 1"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGUSR2", "user defined signal 2"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGSTKFLT", "stack fault"}, + {17, "SIGCHLD", "child exited"}, + {18, "SIGCONT", "continued"}, + {19, "SIGSTOP", "stopped (signal)"}, + {20, "SIGTSTP", "stopped"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGURG", "urgent I/O condition"}, + {24, "SIGXCPU", "CPU time limit exceeded"}, + {25, "SIGXFSZ", "file size limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window changed"}, + {29, "SIGIO", "I/O possible"}, + {30, "SIGPWR", "power failure"}, + {31, "SIGSYS", "bad system call"}, +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go new file mode 100644 index 00000000..bd57833b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go @@ -0,0 +1,2702 @@ +// mkerrors.sh -Wall -Werror -static -I/tmp/include -m64 +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,linux + +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs -- -Wall -Werror -static -I/tmp/include -m64 _const.go + +package unix + +import "syscall" + +const ( + AAFS_MAGIC = 0x5a3c69f0 + ADFS_SUPER_MAGIC = 0xadf5 + AFFS_SUPER_MAGIC = 0xadff + AFS_FS_MAGIC = 0x6b414653 + AFS_SUPER_MAGIC = 0x5346414f + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2c + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + AF_XDP = 0x2c + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ANON_INODE_FS_MAGIC = 0x9041934 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_RAWIP = 0x207 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + AUTOFS_SUPER_MAGIC = 0x187 + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BALLOON_KVM_MAGIC = 0x13661366 + BDEVFS_MAGIC = 0x62646576 + BINFMTFS_MAGIC = 0x42494e4d + BLKBSZGET = 0x80081270 + BLKBSZSET = 0x40081271 + BLKFLSBUF = 0x1261 + BLKFRAGET = 0x1265 + BLKFRASET = 0x1264 + BLKGETSIZE = 0x1260 + BLKGETSIZE64 = 0x80081272 + BLKPBSZGET = 0x127b + BLKRAGET = 0x1263 + BLKRASET = 0x1262 + BLKROGET = 0x125e + BLKROSET = 0x125d + BLKRRPART = 0x125f + BLKSECTGET = 0x1267 + BLKSECTSET = 0x1266 + BLKSSZGET = 0x1268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_FS_MAGIC = 0xcafe4a11 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + BTRFS_SUPER_MAGIC = 0x9123683e + BTRFS_TEST_MAGIC = 0x73727279 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CGROUP2_SUPER_MAGIC = 0x63677270 + CGROUP_SUPER_MAGIC = 0x27e0eb + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CODA_SUPER_MAGIC = 0x73757245 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRAMFS_MAGIC = 0x28cd3d45 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DAXFS_MAGIC = 0x64646178 + DEBUGFS_MAGIC = 0x64626720 + DEVPTS_SUPER_MAGIC = 0x1cd1 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + ECRYPTFS_SUPER_MAGIC = 0xf15f + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x800 + EFD_SEMAPHORE = 0x1 + EFIVARFS_MAGIC = 0xde5e81e4 + EFS_SUPER_MAGIC = 0x414a53 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_ERSPAN = 0x88be + ETH_P_ERSPAN2 = 0x22eb + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IFE = 0xed3e + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MAP = 0xf9 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_NSH = 0x894f + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PREAUTH = 0x88c7 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXABYTE_ENABLE_NEST = 0xf0 + EXT2_SUPER_MAGIC = 0xef53 + EXT3_SUPER_MAGIC = 0xef53 + EXT4_SUPER_MAGIC = 0xef53 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + F2FS_SUPER_MAGIC = 0xf2f52010 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x1000 + FP_XSTATE_MAGIC2 = 0x46505845 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_ENCRYPTION_MODE_SPECK128_256_CTS = 0x8 + FS_ENCRYPTION_MODE_SPECK128_256_XTS = 0x7 + FS_IOC_GET_ENCRYPTION_POLICY = 0x400c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x40106614 + FS_IOC_SET_ENCRYPTION_POLICY = 0x800c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0x3 + FUTEXFS_SUPER_MAGIC = 0xbad1dea + F_ADD_SEALS = 0x409 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0x5 + F_GETLK64 = 0x5 + F_GETOWN = 0x9 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_GET_FILE_RW_HINT = 0x40d + F_GET_RW_HINT = 0x40b + F_GET_SEALS = 0x40a + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SEAL_GROW = 0x4 + F_SEAL_SEAL = 0x1 + F_SEAL_SHRINK = 0x2 + F_SEAL_WRITE = 0x8 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x6 + F_SETLK64 = 0x6 + F_SETLKW = 0x7 + F_SETLKW64 = 0x7 + F_SETOWN = 0x8 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SET_FILE_RW_HINT = 0x40e + F_SET_RW_HINT = 0x40c + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HDIO_DRIVE_CMD = 0x31f + HDIO_DRIVE_CMD_AEB = 0x31e + HDIO_DRIVE_CMD_HDR_SIZE = 0x4 + HDIO_DRIVE_HOB_HDR_SIZE = 0x8 + HDIO_DRIVE_RESET = 0x31c + HDIO_DRIVE_TASK = 0x31e + HDIO_DRIVE_TASKFILE = 0x31d + HDIO_DRIVE_TASK_HDR_SIZE = 0x8 + HDIO_GETGEO = 0x301 + HDIO_GET_32BIT = 0x309 + HDIO_GET_ACOUSTIC = 0x30f + HDIO_GET_ADDRESS = 0x310 + HDIO_GET_BUSSTATE = 0x31a + HDIO_GET_DMA = 0x30b + HDIO_GET_IDENTITY = 0x30d + HDIO_GET_KEEPSETTINGS = 0x308 + HDIO_GET_MULTCOUNT = 0x304 + HDIO_GET_NICE = 0x30c + HDIO_GET_NOWERR = 0x30a + HDIO_GET_QDMA = 0x305 + HDIO_GET_UNMASKINTR = 0x302 + HDIO_GET_WCACHE = 0x30e + HDIO_OBSOLETE_IDENTITY = 0x307 + HDIO_SCAN_HWIF = 0x328 + HDIO_SET_32BIT = 0x324 + HDIO_SET_ACOUSTIC = 0x32c + HDIO_SET_ADDRESS = 0x32f + HDIO_SET_BUSSTATE = 0x32d + HDIO_SET_DMA = 0x326 + HDIO_SET_KEEPSETTINGS = 0x323 + HDIO_SET_MULTCOUNT = 0x321 + HDIO_SET_NICE = 0x329 + HDIO_SET_NOWERR = 0x325 + HDIO_SET_PIO_MODE = 0x327 + HDIO_SET_QDMA = 0x32e + HDIO_SET_UNMASKINTR = 0x322 + HDIO_SET_WCACHE = 0x32b + HDIO_SET_XFER = 0x306 + HDIO_TRISTATE_HWIF = 0x31b + HDIO_UNREGISTER_HWIF = 0x32a + HOSTFS_SUPER_MAGIC = 0xc0ffee + HPFS_SUPER_MAGIC = 0xf995e849 + HUGETLBFS_MAGIC = 0x958458f6 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x8000 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x9 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NAPI = 0x10 + IFF_NAPI_FRAGS = 0x20 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x800 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_FREEBIND = 0x4e + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISOFS_SUPER_MAGIC = 0x9660 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + JFFS2_SUPER_MAGIC = 0x72b6 + KEXEC_ARCH_386 = 0x30000 + KEXEC_ARCH_68K = 0x40000 + KEXEC_ARCH_AARCH64 = 0xb70000 + KEXEC_ARCH_ARM = 0x280000 + KEXEC_ARCH_DEFAULT = 0x0 + KEXEC_ARCH_IA_64 = 0x320000 + KEXEC_ARCH_MASK = 0xffff0000 + KEXEC_ARCH_MIPS = 0x80000 + KEXEC_ARCH_MIPS_LE = 0xa0000 + KEXEC_ARCH_PPC = 0x140000 + KEXEC_ARCH_PPC64 = 0x150000 + KEXEC_ARCH_S390 = 0x160000 + KEXEC_ARCH_SH = 0x2a0000 + KEXEC_ARCH_X86_64 = 0x3e0000 + KEXEC_FILE_NO_INITRAMFS = 0x4 + KEXEC_FILE_ON_CRASH = 0x2 + KEXEC_FILE_UNLOAD = 0x1 + KEXEC_ON_CRASH = 0x1 + KEXEC_PRESERVE_CONTEXT = 0x2 + KEXEC_SEGMENT_MAX = 0x10 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_NEGATE = 0xd + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_KEEPONFORK = 0x13 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MADV_WIPEONFORK = 0x12 + MAP_32BIT = 0x40 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_FIXED_NOREPLACE = 0x100000 + MAP_GROWSDOWN = 0x100 + MAP_HUGETLB = 0x40000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x2000 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x4000 + MAP_POPULATE = 0x8000 + MAP_PRIVATE = 0x2 + MAP_SHARED = 0x1 + MAP_SHARED_VALIDATE = 0x3 + MAP_STACK = 0x20000 + MAP_SYNC = 0x80000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MFD_ALLOW_SEALING = 0x2 + MFD_CLOEXEC = 0x1 + MFD_HUGETLB = 0x4 + MFD_HUGE_16GB = -0x78000000 + MFD_HUGE_16MB = 0x60000000 + MFD_HUGE_1GB = 0x78000000 + MFD_HUGE_1MB = 0x50000000 + MFD_HUGE_256MB = 0x70000000 + MFD_HUGE_2GB = 0x7c000000 + MFD_HUGE_2MB = 0x54000000 + MFD_HUGE_32MB = 0x64000000 + MFD_HUGE_512KB = 0x4c000000 + MFD_HUGE_512MB = 0x74000000 + MFD_HUGE_64KB = 0x40000000 + MFD_HUGE_8MB = 0x5c000000 + MFD_HUGE_MASK = 0x3f + MFD_HUGE_SHIFT = 0x1a + MINIX2_SUPER_MAGIC = 0x2468 + MINIX2_SUPER_MAGIC2 = 0x2478 + MINIX3_SUPER_MAGIC = 0x4d5a + MINIX_SUPER_MAGIC = 0x137f + MINIX_SUPER_MAGIC2 = 0x138f + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSDOS_SUPER_MAGIC = 0x4d44 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MSG_ZEROCOPY = 0x4000000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + MTD_INODE_FS_MAGIC = 0x11307854 + NAME_MAX = 0xff + NCP_SUPER_MAGIC = 0x564c + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NETNSA_MAX = 0x3 + NETNSA_NSID_NOT_ASSIGNED = -0x1 + NFNETLINK_V0 = 0x0 + NFNLGRP_ACCT_QUOTA = 0x8 + NFNLGRP_CONNTRACK_DESTROY = 0x3 + NFNLGRP_CONNTRACK_EXP_DESTROY = 0x6 + NFNLGRP_CONNTRACK_EXP_NEW = 0x4 + NFNLGRP_CONNTRACK_EXP_UPDATE = 0x5 + NFNLGRP_CONNTRACK_NEW = 0x1 + NFNLGRP_CONNTRACK_UPDATE = 0x2 + NFNLGRP_MAX = 0x9 + NFNLGRP_NFTABLES = 0x7 + NFNLGRP_NFTRACE = 0x9 + NFNLGRP_NONE = 0x0 + NFNL_BATCH_MAX = 0x1 + NFNL_MSG_BATCH_BEGIN = 0x10 + NFNL_MSG_BATCH_END = 0x11 + NFNL_NFA_NEST = 0x8000 + NFNL_SUBSYS_ACCT = 0x7 + NFNL_SUBSYS_COUNT = 0xc + NFNL_SUBSYS_CTHELPER = 0x9 + NFNL_SUBSYS_CTNETLINK = 0x1 + NFNL_SUBSYS_CTNETLINK_EXP = 0x2 + NFNL_SUBSYS_CTNETLINK_TIMEOUT = 0x8 + NFNL_SUBSYS_IPSET = 0x6 + NFNL_SUBSYS_NFTABLES = 0xa + NFNL_SUBSYS_NFT_COMPAT = 0xb + NFNL_SUBSYS_NONE = 0x0 + NFNL_SUBSYS_OSF = 0x5 + NFNL_SUBSYS_QUEUE = 0x3 + NFNL_SUBSYS_ULOG = 0x4 + NFS_SUPER_MAGIC = 0x6969 + NILFS_SUPER_MAGIC = 0x3434 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_NONREC = 0x100 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + NSFS_MAGIC = 0x6e736673 + OCFS2_SUPER_MAGIC = 0x7461636f + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPENPROM_SUPER_MAGIC = 0x9fa1 + OPOST = 0x1 + OVERLAYFS_SUPER_MAGIC = 0x794c7630 + O_ACCMODE = 0x3 + O_APPEND = 0x400 + O_ASYNC = 0x2000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x40 + O_DIRECT = 0x4000 + O_DIRECTORY = 0x10000 + O_DSYNC = 0x1000 + O_EXCL = 0x80 + O_FSYNC = 0x101000 + O_LARGEFILE = 0x0 + O_NDELAY = 0x800 + O_NOATIME = 0x40000 + O_NOCTTY = 0x100 + O_NOFOLLOW = 0x20000 + O_NONBLOCK = 0x800 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x101000 + O_SYNC = 0x101000 + O_TMPFILE = 0x410000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x2401 + PERF_EVENT_IOC_ENABLE = 0x2400 + PERF_EVENT_IOC_ID = 0x80082407 + PERF_EVENT_IOC_MODIFY_ATTRIBUTES = 0x4008240b + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x40042409 + PERF_EVENT_IOC_PERIOD = 0x40082404 + PERF_EVENT_IOC_QUERY_BPF = 0xc008240a + PERF_EVENT_IOC_REFRESH = 0x2402 + PERF_EVENT_IOC_RESET = 0x2403 + PERF_EVENT_IOC_SET_BPF = 0x40042408 + PERF_EVENT_IOC_SET_FILTER = 0x40082406 + PERF_EVENT_IOC_SET_OUTPUT = 0x2405 + PIPEFS_MAGIC = 0x50495045 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROC_SUPER_MAGIC = 0x9fa0 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_SPECULATION_CTRL = 0x34 + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffffffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_SPECULATION_CTRL = 0x35 + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_SPEC_DISABLE = 0x4 + PR_SPEC_ENABLE = 0x2 + PR_SPEC_FORCE_DISABLE = 0x8 + PR_SPEC_NOT_AFFECTED = 0x0 + PR_SPEC_PRCTL = 0x1 + PR_SPEC_STORE_BYPASS = 0x0 + PR_SVE_GET_VL = 0x33 + PR_SVE_SET_VL = 0x32 + PR_SVE_SET_VL_ONEXEC = 0x40000 + PR_SVE_VL_INHERIT = 0x20000 + PR_SVE_VL_LEN_MASK = 0xffff + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PSTOREFS_MAGIC = 0x6165676c + PTRACE_ARCH_PRCTL = 0x1e + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETFPREGS = 0xe + PTRACE_GETFPXREGS = 0x12 + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_THREAD_AREA = 0x19 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_OLDSETOPTIONS = 0x15 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKETEXT = 0x4 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SECCOMP_GET_METADATA = 0x420d + PTRACE_SEIZE = 0x4206 + PTRACE_SETFPREGS = 0xf + PTRACE_SETFPXREGS = 0x13 + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SET_THREAD_AREA = 0x1a + PTRACE_SINGLEBLOCK = 0x21 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_SYSEMU = 0x1f + PTRACE_SYSEMU_SINGLESTEP = 0x20 + PTRACE_TRACEME = 0x0 + QNX4_SUPER_MAGIC = 0x2f + QNX6_SUPER_MAGIC = 0x68191122 + RAMFS_MAGIC = 0x858458f6 + RDTGROUP_SUPER_MAGIC = 0x7655821 + REISERFS_SUPER_MAGIC = 0x52654973 + RENAME_EXCHANGE = 0x2 + RENAME_NOREPLACE = 0x1 + RENAME_WHITEOUT = 0x4 + RLIMIT_AS = 0x9 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x8 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x7 + RLIMIT_NPROC = 0x6 + RLIMIT_RSS = 0x5 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FASTOPEN_NO_COOKIE = 0x11 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x11 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1d + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTC_AF = 0x20 + RTC_AIE_OFF = 0x7002 + RTC_AIE_ON = 0x7001 + RTC_ALM_READ = 0x80247008 + RTC_ALM_SET = 0x40247007 + RTC_EPOCH_READ = 0x8008700d + RTC_EPOCH_SET = 0x4008700e + RTC_IRQF = 0x80 + RTC_IRQP_READ = 0x8008700b + RTC_IRQP_SET = 0x4008700c + RTC_MAX_FREQ = 0x2000 + RTC_PF = 0x40 + RTC_PIE_OFF = 0x7006 + RTC_PIE_ON = 0x7005 + RTC_PLL_GET = 0x80207011 + RTC_PLL_SET = 0x40207012 + RTC_RD_TIME = 0x80247009 + RTC_SET_TIME = 0x4024700a + RTC_UF = 0x10 + RTC_UIE_OFF = 0x7004 + RTC_UIE_ON = 0x7003 + RTC_VL_CLR = 0x7014 + RTC_VL_READ = 0x80047013 + RTC_WIE_OFF = 0x7010 + RTC_WIE_ON = 0x700f + RTC_WKALM_RD = 0x80287010 + RTC_WKALM_SET = 0x4028700f + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELCHAIN = 0x65 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETCHAIN = 0x66 + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x67 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWCHAIN = 0x64 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x16 + RTM_NR_MSGTYPES = 0x58 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BGP = 0xba + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_EIGRP = 0xc0 + RTPROT_GATED = 0x8 + RTPROT_ISIS = 0xbb + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_OSPF = 0xbc + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_RIP = 0xbd + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_TXTIME = 0x3d + SCM_WIFI_STATUS = 0x29 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SECURITYFS_MAGIC = 0x73636673 + SELINUX_MAGIC = 0xf97cff8c + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x8905 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x8904 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x541b + SIOCOUTQ = 0x5411 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x8902 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SMACK_MAGIC = 0x43415d53 + SMART_AUTOSAVE = 0xd2 + SMART_AUTO_OFFLINE = 0xdb + SMART_DISABLE = 0xd9 + SMART_ENABLE = 0xd8 + SMART_HCYL_PASS = 0xc2 + SMART_IMMEDIATE_OFFLINE = 0xd4 + SMART_LCYL_PASS = 0x4f + SMART_READ_LOG_SECTOR = 0xd5 + SMART_READ_THRESHOLDS = 0xd1 + SMART_READ_VALUES = 0xd0 + SMART_SAVE = 0xd3 + SMART_STATUS = 0xda + SMART_WRITE_LOG_SECTOR = 0xd6 + SMART_WRITE_THRESHOLDS = 0xd7 + SMB_SUPER_MAGIC = 0x517b + SOCKFS_MAGIC = 0x534f434b + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x2 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x800 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0x1 + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_TLS = 0x11a + SOL_X25 = 0x106 + SOL_XDP = 0x11b + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1e + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x6 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x27 + SO_DONTROUTE = 0x5 + SO_ERROR = 0x4 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x9 + SO_LINGER = 0xd + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0xa + SO_PASSCRED = 0x10 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x11 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1f + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x26 + SO_RCVBUF = 0x8 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x12 + SO_RCVTIMEO = 0x14 + SO_REUSEADDR = 0x2 + SO_REUSEPORT = 0xf + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x7 + SO_SNDBUFFORCE = 0x20 + SO_SNDLOWAT = 0x13 + SO_SNDTIMEO = 0x15 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TXTIME = 0x3d + SO_TYPE = 0x3 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SO_ZEROCOPY = 0x3c + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + SQUASHFS_MAGIC = 0x73717368 + STACK_END_MAGIC = 0x57ac6e9d + STATX_ALL = 0xfff + STATX_ATIME = 0x20 + STATX_ATTR_APPEND = 0x20 + STATX_ATTR_AUTOMOUNT = 0x1000 + STATX_ATTR_COMPRESSED = 0x4 + STATX_ATTR_ENCRYPTED = 0x800 + STATX_ATTR_IMMUTABLE = 0x10 + STATX_ATTR_NODUMP = 0x40 + STATX_BASIC_STATS = 0x7ff + STATX_BLOCKS = 0x400 + STATX_BTIME = 0x800 + STATX_CTIME = 0x80 + STATX_GID = 0x10 + STATX_INO = 0x100 + STATX_MODE = 0x2 + STATX_MTIME = 0x40 + STATX_NLINK = 0x4 + STATX_SIZE = 0x200 + STATX_TYPE = 0x1 + STATX_UID = 0x8 + STATX__RESERVED = 0x80000000 + SYNC_FILE_RANGE_WAIT_AFTER = 0x4 + SYNC_FILE_RANGE_WAIT_BEFORE = 0x1 + SYNC_FILE_RANGE_WRITE = 0x2 + SYSFS_MAGIC = 0x62656572 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x8 + TCFLSH = 0x540b + TCGETA = 0x5405 + TCGETS = 0x5401 + TCGETS2 = 0x802c542a + TCGETX = 0x5432 + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_FASTOPEN_KEY = 0x21 + TCP_FASTOPEN_NO_COOKIE = 0x22 + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_EXT = 0x20 + TCP_MD5SIG_FLAG_PREFIX = 0x1 + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_ULP = 0x1f + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x2 + TCSBRK = 0x5409 + TCSBRKP = 0x5425 + TCSETA = 0x5406 + TCSETAF = 0x5408 + TCSETAW = 0x5407 + TCSETS = 0x5402 + TCSETS2 = 0x402c542b + TCSETSF = 0x5404 + TCSETSF2 = 0x402c542d + TCSETSW = 0x5403 + TCSETSW2 = 0x402c542c + TCSETX = 0x5433 + TCSETXF = 0x5434 + TCSETXW = 0x5435 + TCXONC = 0x540a + TIOCCBRK = 0x5428 + TIOCCONS = 0x541d + TIOCEXCL = 0x540c + TIOCGDEV = 0x80045432 + TIOCGETD = 0x5424 + TIOCGEXCL = 0x80045440 + TIOCGICOUNT = 0x545d + TIOCGLCKTRMIOS = 0x5456 + TIOCGPGRP = 0x540f + TIOCGPKT = 0x80045438 + TIOCGPTLCK = 0x80045439 + TIOCGPTN = 0x80045430 + TIOCGPTPEER = 0x5441 + TIOCGRS485 = 0x542e + TIOCGSERIAL = 0x541e + TIOCGSID = 0x5429 + TIOCGSOFTCAR = 0x5419 + TIOCGWINSZ = 0x5413 + TIOCINQ = 0x541b + TIOCLINUX = 0x541c + TIOCMBIC = 0x5417 + TIOCMBIS = 0x5416 + TIOCMGET = 0x5415 + TIOCMIWAIT = 0x545c + TIOCMSET = 0x5418 + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x5422 + TIOCNXCL = 0x540d + TIOCOUTQ = 0x5411 + TIOCPKT = 0x5420 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x540e + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x5423 + TIOCSIG = 0x40045436 + TIOCSLCKTRMIOS = 0x5457 + TIOCSPGRP = 0x5410 + TIOCSPTLCK = 0x40045431 + TIOCSRS485 = 0x542f + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x541a + TIOCSTI = 0x5412 + TIOCSWINSZ = 0x5414 + TIOCVHANGUP = 0x5437 + TMPFS_MAGIC = 0x1021994 + TOSTOP = 0x100 + TPACKET_ALIGNMENT = 0x10 + TPACKET_HDRLEN = 0x34 + TP_STATUS_AVAILABLE = 0x0 + TP_STATUS_BLK_TMO = 0x20 + TP_STATUS_COPY = 0x2 + TP_STATUS_CSUMNOTREADY = 0x8 + TP_STATUS_CSUM_VALID = 0x80 + TP_STATUS_KERNEL = 0x0 + TP_STATUS_LOSING = 0x4 + TP_STATUS_SENDING = 0x2 + TP_STATUS_SEND_REQUEST = 0x1 + TP_STATUS_TS_RAW_HARDWARE = -0x80000000 + TP_STATUS_TS_SOFTWARE = 0x20000000 + TP_STATUS_TS_SYS_HARDWARE = 0x40000000 + TP_STATUS_USER = 0x1 + TP_STATUS_VLAN_TPID_VALID = 0x40 + TP_STATUS_VLAN_VALID = 0x10 + TP_STATUS_WRONG_FORMAT = 0x4 + TRACEFS_MAGIC = 0x74726163 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x401054d5 + TUNDETACHFILTER = 0x401054d6 + TUNGETFEATURES = 0x800454cf + TUNGETFILTER = 0x801054db + TUNGETIFF = 0x800454d2 + TUNGETSNDBUF = 0x800454d3 + TUNGETVNETBE = 0x800454df + TUNGETVNETHDRSZ = 0x800454d7 + TUNGETVNETLE = 0x800454dd + TUNSETDEBUG = 0x400454c9 + TUNSETFILTEREBPF = 0x800454e1 + TUNSETGROUP = 0x400454ce + TUNSETIFF = 0x400454ca + TUNSETIFINDEX = 0x400454da + TUNSETLINK = 0x400454cd + TUNSETNOCSUM = 0x400454c8 + TUNSETOFFLOAD = 0x400454d0 + TUNSETOWNER = 0x400454cc + TUNSETPERSIST = 0x400454cb + TUNSETQUEUE = 0x400454d9 + TUNSETSNDBUF = 0x400454d4 + TUNSETSTEERINGEBPF = 0x800454e0 + TUNSETTXFILTER = 0x400454d1 + TUNSETVNETBE = 0x400454de + TUNSETVNETHDRSZ = 0x400454d8 + TUNSETVNETLE = 0x400454dc + UBI_IOCATT = 0x40186f40 + UBI_IOCDET = 0x40046f41 + UBI_IOCEBCH = 0x40044f02 + UBI_IOCEBER = 0x40044f01 + UBI_IOCEBISMAP = 0x80044f05 + UBI_IOCEBMAP = 0x40084f03 + UBI_IOCEBUNMAP = 0x40044f04 + UBI_IOCMKVOL = 0x40986f00 + UBI_IOCRMVOL = 0x40046f01 + UBI_IOCRNVOL = 0x51106f03 + UBI_IOCRSVOL = 0x400c6f02 + UBI_IOCSETVOLPROP = 0x40104f06 + UBI_IOCVOLCRBLK = 0x40804f07 + UBI_IOCVOLRMBLK = 0x4f08 + UBI_IOCVOLUP = 0x40084f00 + UDF_SUPER_MAGIC = 0x15013346 + UMOUNT_NOFOLLOW = 0x8 + USBDEVICE_SUPER_MAGIC = 0x9fa2 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + V9FS_MAGIC = 0x1021997 + VDISCARD = 0xd + VEOF = 0x4 + VEOL = 0xb + VEOL2 = 0x10 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x6 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x80045702 + WDIOC_GETPRETIMEOUT = 0x80045709 + WDIOC_GETSTATUS = 0x80045701 + WDIOC_GETSUPPORT = 0x80285700 + WDIOC_GETTEMP = 0x80045703 + WDIOC_GETTIMELEFT = 0x8004570a + WDIOC_GETTIMEOUT = 0x80045707 + WDIOC_KEEPALIVE = 0x80045705 + WDIOC_SETOPTIONS = 0x80045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WIN_ACKMEDIACHANGE = 0xdb + WIN_CHECKPOWERMODE1 = 0xe5 + WIN_CHECKPOWERMODE2 = 0x98 + WIN_DEVICE_RESET = 0x8 + WIN_DIAGNOSE = 0x90 + WIN_DOORLOCK = 0xde + WIN_DOORUNLOCK = 0xdf + WIN_DOWNLOAD_MICROCODE = 0x92 + WIN_FLUSH_CACHE = 0xe7 + WIN_FLUSH_CACHE_EXT = 0xea + WIN_FORMAT = 0x50 + WIN_GETMEDIASTATUS = 0xda + WIN_IDENTIFY = 0xec + WIN_IDENTIFY_DMA = 0xee + WIN_IDLEIMMEDIATE = 0xe1 + WIN_INIT = 0x60 + WIN_MEDIAEJECT = 0xed + WIN_MULTREAD = 0xc4 + WIN_MULTREAD_EXT = 0x29 + WIN_MULTWRITE = 0xc5 + WIN_MULTWRITE_EXT = 0x39 + WIN_NOP = 0x0 + WIN_PACKETCMD = 0xa0 + WIN_PIDENTIFY = 0xa1 + WIN_POSTBOOT = 0xdc + WIN_PREBOOT = 0xdd + WIN_QUEUED_SERVICE = 0xa2 + WIN_READ = 0x20 + WIN_READDMA = 0xc8 + WIN_READDMA_EXT = 0x25 + WIN_READDMA_ONCE = 0xc9 + WIN_READDMA_QUEUED = 0xc7 + WIN_READDMA_QUEUED_EXT = 0x26 + WIN_READ_BUFFER = 0xe4 + WIN_READ_EXT = 0x24 + WIN_READ_LONG = 0x22 + WIN_READ_LONG_ONCE = 0x23 + WIN_READ_NATIVE_MAX = 0xf8 + WIN_READ_NATIVE_MAX_EXT = 0x27 + WIN_READ_ONCE = 0x21 + WIN_RECAL = 0x10 + WIN_RESTORE = 0x10 + WIN_SECURITY_DISABLE = 0xf6 + WIN_SECURITY_ERASE_PREPARE = 0xf3 + WIN_SECURITY_ERASE_UNIT = 0xf4 + WIN_SECURITY_FREEZE_LOCK = 0xf5 + WIN_SECURITY_SET_PASS = 0xf1 + WIN_SECURITY_UNLOCK = 0xf2 + WIN_SEEK = 0x70 + WIN_SETFEATURES = 0xef + WIN_SETIDLE1 = 0xe3 + WIN_SETIDLE2 = 0x97 + WIN_SETMULT = 0xc6 + WIN_SET_MAX = 0xf9 + WIN_SET_MAX_EXT = 0x37 + WIN_SLEEPNOW1 = 0xe6 + WIN_SLEEPNOW2 = 0x99 + WIN_SMART = 0xb0 + WIN_SPECIFY = 0x91 + WIN_SRST = 0x8 + WIN_STANDBY = 0xe2 + WIN_STANDBY2 = 0x96 + WIN_STANDBYNOW1 = 0xe0 + WIN_STANDBYNOW2 = 0x94 + WIN_VERIFY = 0x40 + WIN_VERIFY_EXT = 0x42 + WIN_VERIFY_ONCE = 0x41 + WIN_WRITE = 0x30 + WIN_WRITEDMA = 0xca + WIN_WRITEDMA_EXT = 0x35 + WIN_WRITEDMA_ONCE = 0xcb + WIN_WRITEDMA_QUEUED = 0xcc + WIN_WRITEDMA_QUEUED_EXT = 0x36 + WIN_WRITE_BUFFER = 0xe8 + WIN_WRITE_EXT = 0x34 + WIN_WRITE_LONG = 0x32 + WIN_WRITE_LONG_ONCE = 0x33 + WIN_WRITE_ONCE = 0x31 + WIN_WRITE_SAME = 0xe9 + WIN_WRITE_VERIFY = 0x3c + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x40 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XDP_COPY = 0x2 + XDP_FLAGS_DRV_MODE = 0x4 + XDP_FLAGS_HW_MODE = 0x8 + XDP_FLAGS_MASK = 0xf + XDP_FLAGS_MODES = 0xe + XDP_FLAGS_SKB_MODE = 0x2 + XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 + XDP_MMAP_OFFSETS = 0x1 + XDP_PGOFF_RX_RING = 0x0 + XDP_PGOFF_TX_RING = 0x80000000 + XDP_RX_RING = 0x2 + XDP_SHARED_UMEM = 0x1 + XDP_STATISTICS = 0x7 + XDP_TX_RING = 0x3 + XDP_UMEM_COMPLETION_RING = 0x6 + XDP_UMEM_FILL_RING = 0x5 + XDP_UMEM_PGOFF_COMPLETION_RING = 0x180000000 + XDP_UMEM_PGOFF_FILL_RING = 0x100000000 + XDP_UMEM_REG = 0x4 + XDP_ZEROCOPY = 0x4 + XENFS_SUPER_MAGIC = 0xabba1974 + XTABS = 0x1800 + ZSMALLOC_MAGIC = 0x58295829 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x62) + EADDRNOTAVAIL = syscall.Errno(0x63) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x61) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x72) + EBADE = syscall.Errno(0x34) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x4d) + EBADMSG = syscall.Errno(0x4a) + EBADR = syscall.Errno(0x35) + EBADRQC = syscall.Errno(0x38) + EBADSLT = syscall.Errno(0x39) + EBFONT = syscall.Errno(0x3b) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x7d) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x2c) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x67) + ECONNREFUSED = syscall.Errno(0x6f) + ECONNRESET = syscall.Errno(0x68) + EDEADLK = syscall.Errno(0x23) + EDEADLOCK = syscall.Errno(0x23) + EDESTADDRREQ = syscall.Errno(0x59) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x49) + EDQUOT = syscall.Errno(0x7a) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x70) + EHOSTUNREACH = syscall.Errno(0x71) + EHWPOISON = syscall.Errno(0x85) + EIDRM = syscall.Errno(0x2b) + EILSEQ = syscall.Errno(0x54) + EINPROGRESS = syscall.Errno(0x73) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x6a) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x78) + EKEYEXPIRED = syscall.Errno(0x7f) + EKEYREJECTED = syscall.Errno(0x81) + EKEYREVOKED = syscall.Errno(0x80) + EL2HLT = syscall.Errno(0x33) + EL2NSYNC = syscall.Errno(0x2d) + EL3HLT = syscall.Errno(0x2e) + EL3RST = syscall.Errno(0x2f) + ELIBACC = syscall.Errno(0x4f) + ELIBBAD = syscall.Errno(0x50) + ELIBEXEC = syscall.Errno(0x53) + ELIBMAX = syscall.Errno(0x52) + ELIBSCN = syscall.Errno(0x51) + ELNRNG = syscall.Errno(0x30) + ELOOP = syscall.Errno(0x28) + EMEDIUMTYPE = syscall.Errno(0x7c) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x5a) + EMULTIHOP = syscall.Errno(0x48) + ENAMETOOLONG = syscall.Errno(0x24) + ENAVAIL = syscall.Errno(0x77) + ENETDOWN = syscall.Errno(0x64) + ENETRESET = syscall.Errno(0x66) + ENETUNREACH = syscall.Errno(0x65) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x37) + ENOBUFS = syscall.Errno(0x69) + ENOCSI = syscall.Errno(0x32) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0x7e) + ENOLCK = syscall.Errno(0x25) + ENOLINK = syscall.Errno(0x43) + ENOMEDIUM = syscall.Errno(0x7b) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x2a) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x5c) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x26) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x6b) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x27) + ENOTNAM = syscall.Errno(0x76) + ENOTRECOVERABLE = syscall.Errno(0x83) + ENOTSOCK = syscall.Errno(0x58) + ENOTSUP = syscall.Errno(0x5f) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x4c) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x5f) + EOVERFLOW = syscall.Errno(0x4b) + EOWNERDEAD = syscall.Errno(0x82) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x60) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x5d) + EPROTOTYPE = syscall.Errno(0x5b) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x4e) + EREMOTE = syscall.Errno(0x42) + EREMOTEIO = syscall.Errno(0x79) + ERESTART = syscall.Errno(0x55) + ERFKILL = syscall.Errno(0x84) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x6c) + ESOCKTNOSUPPORT = syscall.Errno(0x5e) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x74) + ESTRPIPE = syscall.Errno(0x56) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x6e) + ETOOMANYREFS = syscall.Errno(0x6d) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x75) + EUNATCH = syscall.Errno(0x31) + EUSERS = syscall.Errno(0x57) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x36) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0x7) + SIGCHLD = syscall.Signal(0x11) + SIGCLD = syscall.Signal(0x11) + SIGCONT = syscall.Signal(0x12) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x1d) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x1d) + SIGPROF = syscall.Signal(0x1b) + SIGPWR = syscall.Signal(0x1e) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTKFLT = syscall.Signal(0x10) + SIGSTOP = syscall.Signal(0x13) + SIGSYS = syscall.Signal(0x1f) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x14) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x17) + SIGUSR1 = syscall.Signal(0xa) + SIGUSR2 = syscall.Signal(0xc) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "no such device or address"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EAGAIN", "resource temporarily unavailable"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device or resource busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "invalid cross-device link"}, + {19, "ENODEV", "no such device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "numerical result out of range"}, + {35, "EDEADLK", "resource deadlock avoided"}, + {36, "ENAMETOOLONG", "file name too long"}, + {37, "ENOLCK", "no locks available"}, + {38, "ENOSYS", "function not implemented"}, + {39, "ENOTEMPTY", "directory not empty"}, + {40, "ELOOP", "too many levels of symbolic links"}, + {42, "ENOMSG", "no message of desired type"}, + {43, "EIDRM", "identifier removed"}, + {44, "ECHRNG", "channel number out of range"}, + {45, "EL2NSYNC", "level 2 not synchronized"}, + {46, "EL3HLT", "level 3 halted"}, + {47, "EL3RST", "level 3 reset"}, + {48, "ELNRNG", "link number out of range"}, + {49, "EUNATCH", "protocol driver not attached"}, + {50, "ENOCSI", "no CSI structure available"}, + {51, "EL2HLT", "level 2 halted"}, + {52, "EBADE", "invalid exchange"}, + {53, "EBADR", "invalid request descriptor"}, + {54, "EXFULL", "exchange full"}, + {55, "ENOANO", "no anode"}, + {56, "EBADRQC", "invalid request code"}, + {57, "EBADSLT", "invalid slot"}, + {59, "EBFONT", "bad font file format"}, + {60, "ENOSTR", "device not a stream"}, + {61, "ENODATA", "no data available"}, + {62, "ETIME", "timer expired"}, + {63, "ENOSR", "out of streams resources"}, + {64, "ENONET", "machine is not on the network"}, + {65, "ENOPKG", "package not installed"}, + {66, "EREMOTE", "object is remote"}, + {67, "ENOLINK", "link has been severed"}, + {68, "EADV", "advertise error"}, + {69, "ESRMNT", "srmount error"}, + {70, "ECOMM", "communication error on send"}, + {71, "EPROTO", "protocol error"}, + {72, "EMULTIHOP", "multihop attempted"}, + {73, "EDOTDOT", "RFS specific error"}, + {74, "EBADMSG", "bad message"}, + {75, "EOVERFLOW", "value too large for defined data type"}, + {76, "ENOTUNIQ", "name not unique on network"}, + {77, "EBADFD", "file descriptor in bad state"}, + {78, "EREMCHG", "remote address changed"}, + {79, "ELIBACC", "can not access a needed shared library"}, + {80, "ELIBBAD", "accessing a corrupted shared library"}, + {81, "ELIBSCN", ".lib section in a.out corrupted"}, + {82, "ELIBMAX", "attempting to link in too many shared libraries"}, + {83, "ELIBEXEC", "cannot exec a shared library directly"}, + {84, "EILSEQ", "invalid or incomplete multibyte or wide character"}, + {85, "ERESTART", "interrupted system call should be restarted"}, + {86, "ESTRPIPE", "streams pipe error"}, + {87, "EUSERS", "too many users"}, + {88, "ENOTSOCK", "socket operation on non-socket"}, + {89, "EDESTADDRREQ", "destination address required"}, + {90, "EMSGSIZE", "message too long"}, + {91, "EPROTOTYPE", "protocol wrong type for socket"}, + {92, "ENOPROTOOPT", "protocol not available"}, + {93, "EPROTONOSUPPORT", "protocol not supported"}, + {94, "ESOCKTNOSUPPORT", "socket type not supported"}, + {95, "ENOTSUP", "operation not supported"}, + {96, "EPFNOSUPPORT", "protocol family not supported"}, + {97, "EAFNOSUPPORT", "address family not supported by protocol"}, + {98, "EADDRINUSE", "address already in use"}, + {99, "EADDRNOTAVAIL", "cannot assign requested address"}, + {100, "ENETDOWN", "network is down"}, + {101, "ENETUNREACH", "network is unreachable"}, + {102, "ENETRESET", "network dropped connection on reset"}, + {103, "ECONNABORTED", "software caused connection abort"}, + {104, "ECONNRESET", "connection reset by peer"}, + {105, "ENOBUFS", "no buffer space available"}, + {106, "EISCONN", "transport endpoint is already connected"}, + {107, "ENOTCONN", "transport endpoint is not connected"}, + {108, "ESHUTDOWN", "cannot send after transport endpoint shutdown"}, + {109, "ETOOMANYREFS", "too many references: cannot splice"}, + {110, "ETIMEDOUT", "connection timed out"}, + {111, "ECONNREFUSED", "connection refused"}, + {112, "EHOSTDOWN", "host is down"}, + {113, "EHOSTUNREACH", "no route to host"}, + {114, "EALREADY", "operation already in progress"}, + {115, "EINPROGRESS", "operation now in progress"}, + {116, "ESTALE", "stale file handle"}, + {117, "EUCLEAN", "structure needs cleaning"}, + {118, "ENOTNAM", "not a XENIX named type file"}, + {119, "ENAVAIL", "no XENIX semaphores available"}, + {120, "EISNAM", "is a named type file"}, + {121, "EREMOTEIO", "remote I/O error"}, + {122, "EDQUOT", "disk quota exceeded"}, + {123, "ENOMEDIUM", "no medium found"}, + {124, "EMEDIUMTYPE", "wrong medium type"}, + {125, "ECANCELED", "operation canceled"}, + {126, "ENOKEY", "required key not available"}, + {127, "EKEYEXPIRED", "key has expired"}, + {128, "EKEYREVOKED", "key has been revoked"}, + {129, "EKEYREJECTED", "key was rejected by service"}, + {130, "EOWNERDEAD", "owner died"}, + {131, "ENOTRECOVERABLE", "state not recoverable"}, + {132, "ERFKILL", "operation not possible due to RF-kill"}, + {133, "EHWPOISON", "memory page has hardware error"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/breakpoint trap"}, + {6, "SIGABRT", "aborted"}, + {7, "SIGBUS", "bus error"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGUSR1", "user defined signal 1"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGUSR2", "user defined signal 2"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGSTKFLT", "stack fault"}, + {17, "SIGCHLD", "child exited"}, + {18, "SIGCONT", "continued"}, + {19, "SIGSTOP", "stopped (signal)"}, + {20, "SIGTSTP", "stopped"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGURG", "urgent I/O condition"}, + {24, "SIGXCPU", "CPU time limit exceeded"}, + {25, "SIGXFSZ", "file size limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window changed"}, + {29, "SIGIO", "I/O possible"}, + {30, "SIGPWR", "power failure"}, + {31, "SIGSYS", "bad system call"}, +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go new file mode 100644 index 00000000..b059c287 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go @@ -0,0 +1,2708 @@ +// mkerrors.sh -Wall -Werror -static -I/tmp/include +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm,linux + +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go + +package unix + +import "syscall" + +const ( + AAFS_MAGIC = 0x5a3c69f0 + ADFS_SUPER_MAGIC = 0xadf5 + AFFS_SUPER_MAGIC = 0xadff + AFS_FS_MAGIC = 0x6b414653 + AFS_SUPER_MAGIC = 0x5346414f + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2c + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + AF_XDP = 0x2c + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ANON_INODE_FS_MAGIC = 0x9041934 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_RAWIP = 0x207 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + AUTOFS_SUPER_MAGIC = 0x187 + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BALLOON_KVM_MAGIC = 0x13661366 + BDEVFS_MAGIC = 0x62646576 + BINFMTFS_MAGIC = 0x42494e4d + BLKBSZGET = 0x80041270 + BLKBSZSET = 0x40041271 + BLKFLSBUF = 0x1261 + BLKFRAGET = 0x1265 + BLKFRASET = 0x1264 + BLKGETSIZE = 0x1260 + BLKGETSIZE64 = 0x80041272 + BLKPBSZGET = 0x127b + BLKRAGET = 0x1263 + BLKRASET = 0x1262 + BLKROGET = 0x125e + BLKROSET = 0x125d + BLKRRPART = 0x125f + BLKSECTGET = 0x1267 + BLKSECTSET = 0x1266 + BLKSSZGET = 0x1268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_FS_MAGIC = 0xcafe4a11 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + BTRFS_SUPER_MAGIC = 0x9123683e + BTRFS_TEST_MAGIC = 0x73727279 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CGROUP2_SUPER_MAGIC = 0x63677270 + CGROUP_SUPER_MAGIC = 0x27e0eb + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CODA_SUPER_MAGIC = 0x73757245 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRAMFS_MAGIC = 0x28cd3d45 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DAXFS_MAGIC = 0x64646178 + DEBUGFS_MAGIC = 0x64626720 + DEVPTS_SUPER_MAGIC = 0x1cd1 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + ECRYPTFS_SUPER_MAGIC = 0xf15f + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x800 + EFD_SEMAPHORE = 0x1 + EFIVARFS_MAGIC = 0xde5e81e4 + EFS_SUPER_MAGIC = 0x414a53 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_ERSPAN = 0x88be + ETH_P_ERSPAN2 = 0x22eb + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IFE = 0xed3e + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MAP = 0xf9 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_NSH = 0x894f + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PREAUTH = 0x88c7 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXABYTE_ENABLE_NEST = 0xf0 + EXT2_SUPER_MAGIC = 0xef53 + EXT3_SUPER_MAGIC = 0xef53 + EXT4_SUPER_MAGIC = 0xef53 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + F2FS_SUPER_MAGIC = 0xf2f52010 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x1000 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_ENCRYPTION_MODE_SPECK128_256_CTS = 0x8 + FS_ENCRYPTION_MODE_SPECK128_256_XTS = 0x7 + FS_IOC_GET_ENCRYPTION_POLICY = 0x400c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x40106614 + FS_IOC_SET_ENCRYPTION_POLICY = 0x800c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0x3 + FUTEXFS_SUPER_MAGIC = 0xbad1dea + F_ADD_SEALS = 0x409 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0xc + F_GETLK64 = 0xc + F_GETOWN = 0x9 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_GET_FILE_RW_HINT = 0x40d + F_GET_RW_HINT = 0x40b + F_GET_SEALS = 0x40a + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SEAL_GROW = 0x4 + F_SEAL_SEAL = 0x1 + F_SEAL_SHRINK = 0x2 + F_SEAL_WRITE = 0x8 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0xd + F_SETLK64 = 0xd + F_SETLKW = 0xe + F_SETLKW64 = 0xe + F_SETOWN = 0x8 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SET_FILE_RW_HINT = 0x40e + F_SET_RW_HINT = 0x40c + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HDIO_DRIVE_CMD = 0x31f + HDIO_DRIVE_CMD_AEB = 0x31e + HDIO_DRIVE_CMD_HDR_SIZE = 0x4 + HDIO_DRIVE_HOB_HDR_SIZE = 0x8 + HDIO_DRIVE_RESET = 0x31c + HDIO_DRIVE_TASK = 0x31e + HDIO_DRIVE_TASKFILE = 0x31d + HDIO_DRIVE_TASK_HDR_SIZE = 0x8 + HDIO_GETGEO = 0x301 + HDIO_GET_32BIT = 0x309 + HDIO_GET_ACOUSTIC = 0x30f + HDIO_GET_ADDRESS = 0x310 + HDIO_GET_BUSSTATE = 0x31a + HDIO_GET_DMA = 0x30b + HDIO_GET_IDENTITY = 0x30d + HDIO_GET_KEEPSETTINGS = 0x308 + HDIO_GET_MULTCOUNT = 0x304 + HDIO_GET_NICE = 0x30c + HDIO_GET_NOWERR = 0x30a + HDIO_GET_QDMA = 0x305 + HDIO_GET_UNMASKINTR = 0x302 + HDIO_GET_WCACHE = 0x30e + HDIO_OBSOLETE_IDENTITY = 0x307 + HDIO_SCAN_HWIF = 0x328 + HDIO_SET_32BIT = 0x324 + HDIO_SET_ACOUSTIC = 0x32c + HDIO_SET_ADDRESS = 0x32f + HDIO_SET_BUSSTATE = 0x32d + HDIO_SET_DMA = 0x326 + HDIO_SET_KEEPSETTINGS = 0x323 + HDIO_SET_MULTCOUNT = 0x321 + HDIO_SET_NICE = 0x329 + HDIO_SET_NOWERR = 0x325 + HDIO_SET_PIO_MODE = 0x327 + HDIO_SET_QDMA = 0x32e + HDIO_SET_UNMASKINTR = 0x322 + HDIO_SET_WCACHE = 0x32b + HDIO_SET_XFER = 0x306 + HDIO_TRISTATE_HWIF = 0x31b + HDIO_UNREGISTER_HWIF = 0x32a + HOSTFS_SUPER_MAGIC = 0xc0ffee + HPFS_SUPER_MAGIC = 0xf995e849 + HUGETLBFS_MAGIC = 0x958458f6 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x8000 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x9 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NAPI = 0x10 + IFF_NAPI_FRAGS = 0x20 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x800 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_FREEBIND = 0x4e + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISOFS_SUPER_MAGIC = 0x9660 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + JFFS2_SUPER_MAGIC = 0x72b6 + KEXEC_ARCH_386 = 0x30000 + KEXEC_ARCH_68K = 0x40000 + KEXEC_ARCH_AARCH64 = 0xb70000 + KEXEC_ARCH_ARM = 0x280000 + KEXEC_ARCH_DEFAULT = 0x0 + KEXEC_ARCH_IA_64 = 0x320000 + KEXEC_ARCH_MASK = 0xffff0000 + KEXEC_ARCH_MIPS = 0x80000 + KEXEC_ARCH_MIPS_LE = 0xa0000 + KEXEC_ARCH_PPC = 0x140000 + KEXEC_ARCH_PPC64 = 0x150000 + KEXEC_ARCH_S390 = 0x160000 + KEXEC_ARCH_SH = 0x2a0000 + KEXEC_ARCH_X86_64 = 0x3e0000 + KEXEC_FILE_NO_INITRAMFS = 0x4 + KEXEC_FILE_ON_CRASH = 0x2 + KEXEC_FILE_UNLOAD = 0x1 + KEXEC_ON_CRASH = 0x1 + KEXEC_PRESERVE_CONTEXT = 0x2 + KEXEC_SEGMENT_MAX = 0x10 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_NEGATE = 0xd + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_KEEPONFORK = 0x13 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MADV_WIPEONFORK = 0x12 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_FIXED_NOREPLACE = 0x100000 + MAP_GROWSDOWN = 0x100 + MAP_HUGETLB = 0x40000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x2000 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x4000 + MAP_POPULATE = 0x8000 + MAP_PRIVATE = 0x2 + MAP_SHARED = 0x1 + MAP_SHARED_VALIDATE = 0x3 + MAP_STACK = 0x20000 + MAP_SYNC = 0x80000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MFD_ALLOW_SEALING = 0x2 + MFD_CLOEXEC = 0x1 + MFD_HUGETLB = 0x4 + MFD_HUGE_16GB = -0x78000000 + MFD_HUGE_16MB = 0x60000000 + MFD_HUGE_1GB = 0x78000000 + MFD_HUGE_1MB = 0x50000000 + MFD_HUGE_256MB = 0x70000000 + MFD_HUGE_2GB = 0x7c000000 + MFD_HUGE_2MB = 0x54000000 + MFD_HUGE_32MB = 0x64000000 + MFD_HUGE_512KB = 0x4c000000 + MFD_HUGE_512MB = 0x74000000 + MFD_HUGE_64KB = 0x40000000 + MFD_HUGE_8MB = 0x5c000000 + MFD_HUGE_MASK = 0x3f + MFD_HUGE_SHIFT = 0x1a + MINIX2_SUPER_MAGIC = 0x2468 + MINIX2_SUPER_MAGIC2 = 0x2478 + MINIX3_SUPER_MAGIC = 0x4d5a + MINIX_SUPER_MAGIC = 0x137f + MINIX_SUPER_MAGIC2 = 0x138f + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSDOS_SUPER_MAGIC = 0x4d44 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MSG_ZEROCOPY = 0x4000000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + MTD_INODE_FS_MAGIC = 0x11307854 + NAME_MAX = 0xff + NCP_SUPER_MAGIC = 0x564c + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NETNSA_MAX = 0x3 + NETNSA_NSID_NOT_ASSIGNED = -0x1 + NFNETLINK_V0 = 0x0 + NFNLGRP_ACCT_QUOTA = 0x8 + NFNLGRP_CONNTRACK_DESTROY = 0x3 + NFNLGRP_CONNTRACK_EXP_DESTROY = 0x6 + NFNLGRP_CONNTRACK_EXP_NEW = 0x4 + NFNLGRP_CONNTRACK_EXP_UPDATE = 0x5 + NFNLGRP_CONNTRACK_NEW = 0x1 + NFNLGRP_CONNTRACK_UPDATE = 0x2 + NFNLGRP_MAX = 0x9 + NFNLGRP_NFTABLES = 0x7 + NFNLGRP_NFTRACE = 0x9 + NFNLGRP_NONE = 0x0 + NFNL_BATCH_MAX = 0x1 + NFNL_MSG_BATCH_BEGIN = 0x10 + NFNL_MSG_BATCH_END = 0x11 + NFNL_NFA_NEST = 0x8000 + NFNL_SUBSYS_ACCT = 0x7 + NFNL_SUBSYS_COUNT = 0xc + NFNL_SUBSYS_CTHELPER = 0x9 + NFNL_SUBSYS_CTNETLINK = 0x1 + NFNL_SUBSYS_CTNETLINK_EXP = 0x2 + NFNL_SUBSYS_CTNETLINK_TIMEOUT = 0x8 + NFNL_SUBSYS_IPSET = 0x6 + NFNL_SUBSYS_NFTABLES = 0xa + NFNL_SUBSYS_NFT_COMPAT = 0xb + NFNL_SUBSYS_NONE = 0x0 + NFNL_SUBSYS_OSF = 0x5 + NFNL_SUBSYS_QUEUE = 0x3 + NFNL_SUBSYS_ULOG = 0x4 + NFS_SUPER_MAGIC = 0x6969 + NILFS_SUPER_MAGIC = 0x3434 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_NONREC = 0x100 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + NSFS_MAGIC = 0x6e736673 + OCFS2_SUPER_MAGIC = 0x7461636f + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPENPROM_SUPER_MAGIC = 0x9fa1 + OPOST = 0x1 + OVERLAYFS_SUPER_MAGIC = 0x794c7630 + O_ACCMODE = 0x3 + O_APPEND = 0x400 + O_ASYNC = 0x2000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x40 + O_DIRECT = 0x10000 + O_DIRECTORY = 0x4000 + O_DSYNC = 0x1000 + O_EXCL = 0x80 + O_FSYNC = 0x101000 + O_LARGEFILE = 0x20000 + O_NDELAY = 0x800 + O_NOATIME = 0x40000 + O_NOCTTY = 0x100 + O_NOFOLLOW = 0x8000 + O_NONBLOCK = 0x800 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x101000 + O_SYNC = 0x101000 + O_TMPFILE = 0x404000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x2401 + PERF_EVENT_IOC_ENABLE = 0x2400 + PERF_EVENT_IOC_ID = 0x80042407 + PERF_EVENT_IOC_MODIFY_ATTRIBUTES = 0x4004240b + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x40042409 + PERF_EVENT_IOC_PERIOD = 0x40082404 + PERF_EVENT_IOC_QUERY_BPF = 0xc004240a + PERF_EVENT_IOC_REFRESH = 0x2402 + PERF_EVENT_IOC_RESET = 0x2403 + PERF_EVENT_IOC_SET_BPF = 0x40042408 + PERF_EVENT_IOC_SET_FILTER = 0x40042406 + PERF_EVENT_IOC_SET_OUTPUT = 0x2405 + PIPEFS_MAGIC = 0x50495045 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROC_SUPER_MAGIC = 0x9fa0 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_SPECULATION_CTRL = 0x34 + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_SPECULATION_CTRL = 0x35 + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_SPEC_DISABLE = 0x4 + PR_SPEC_ENABLE = 0x2 + PR_SPEC_FORCE_DISABLE = 0x8 + PR_SPEC_NOT_AFFECTED = 0x0 + PR_SPEC_PRCTL = 0x1 + PR_SPEC_STORE_BYPASS = 0x0 + PR_SVE_GET_VL = 0x33 + PR_SVE_SET_VL = 0x32 + PR_SVE_SET_VL_ONEXEC = 0x40000 + PR_SVE_VL_INHERIT = 0x20000 + PR_SVE_VL_LEN_MASK = 0xffff + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PSTOREFS_MAGIC = 0x6165676c + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETCRUNCHREGS = 0x19 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETFDPIC = 0x1f + PTRACE_GETFDPIC_EXEC = 0x0 + PTRACE_GETFDPIC_INTERP = 0x1 + PTRACE_GETFPREGS = 0xe + PTRACE_GETHBPREGS = 0x1d + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GETVFPREGS = 0x1b + PTRACE_GETWMMXREGS = 0x12 + PTRACE_GET_THREAD_AREA = 0x16 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_OLDSETOPTIONS = 0x15 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKETEXT = 0x4 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SECCOMP_GET_METADATA = 0x420d + PTRACE_SEIZE = 0x4206 + PTRACE_SETCRUNCHREGS = 0x1a + PTRACE_SETFPREGS = 0xf + PTRACE_SETHBPREGS = 0x1e + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SETVFPREGS = 0x1c + PTRACE_SETWMMXREGS = 0x13 + PTRACE_SET_SYSCALL = 0x17 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_TRACEME = 0x0 + PT_DATA_ADDR = 0x10004 + PT_TEXT_ADDR = 0x10000 + PT_TEXT_END_ADDR = 0x10008 + QNX4_SUPER_MAGIC = 0x2f + QNX6_SUPER_MAGIC = 0x68191122 + RAMFS_MAGIC = 0x858458f6 + RDTGROUP_SUPER_MAGIC = 0x7655821 + REISERFS_SUPER_MAGIC = 0x52654973 + RENAME_EXCHANGE = 0x2 + RENAME_NOREPLACE = 0x1 + RENAME_WHITEOUT = 0x4 + RLIMIT_AS = 0x9 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x8 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x7 + RLIMIT_NPROC = 0x6 + RLIMIT_RSS = 0x5 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FASTOPEN_NO_COOKIE = 0x11 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x11 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1d + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTC_AF = 0x20 + RTC_AIE_OFF = 0x7002 + RTC_AIE_ON = 0x7001 + RTC_ALM_READ = 0x80247008 + RTC_ALM_SET = 0x40247007 + RTC_EPOCH_READ = 0x8004700d + RTC_EPOCH_SET = 0x4004700e + RTC_IRQF = 0x80 + RTC_IRQP_READ = 0x8004700b + RTC_IRQP_SET = 0x4004700c + RTC_MAX_FREQ = 0x2000 + RTC_PF = 0x40 + RTC_PIE_OFF = 0x7006 + RTC_PIE_ON = 0x7005 + RTC_PLL_GET = 0x801c7011 + RTC_PLL_SET = 0x401c7012 + RTC_RD_TIME = 0x80247009 + RTC_SET_TIME = 0x4024700a + RTC_UF = 0x10 + RTC_UIE_OFF = 0x7004 + RTC_UIE_ON = 0x7003 + RTC_VL_CLR = 0x7014 + RTC_VL_READ = 0x80047013 + RTC_WIE_OFF = 0x7010 + RTC_WIE_ON = 0x700f + RTC_WKALM_RD = 0x80287010 + RTC_WKALM_SET = 0x4028700f + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELCHAIN = 0x65 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETCHAIN = 0x66 + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x67 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWCHAIN = 0x64 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x16 + RTM_NR_MSGTYPES = 0x58 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BGP = 0xba + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_EIGRP = 0xc0 + RTPROT_GATED = 0x8 + RTPROT_ISIS = 0xbb + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_OSPF = 0xbc + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_RIP = 0xbd + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_TXTIME = 0x3d + SCM_WIFI_STATUS = 0x29 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SECURITYFS_MAGIC = 0x73636673 + SELINUX_MAGIC = 0xf97cff8c + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x8905 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x8904 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x541b + SIOCOUTQ = 0x5411 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x8902 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SMACK_MAGIC = 0x43415d53 + SMART_AUTOSAVE = 0xd2 + SMART_AUTO_OFFLINE = 0xdb + SMART_DISABLE = 0xd9 + SMART_ENABLE = 0xd8 + SMART_HCYL_PASS = 0xc2 + SMART_IMMEDIATE_OFFLINE = 0xd4 + SMART_LCYL_PASS = 0x4f + SMART_READ_LOG_SECTOR = 0xd5 + SMART_READ_THRESHOLDS = 0xd1 + SMART_READ_VALUES = 0xd0 + SMART_SAVE = 0xd3 + SMART_STATUS = 0xda + SMART_WRITE_LOG_SECTOR = 0xd6 + SMART_WRITE_THRESHOLDS = 0xd7 + SMB_SUPER_MAGIC = 0x517b + SOCKFS_MAGIC = 0x534f434b + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x2 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x800 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0x1 + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_TLS = 0x11a + SOL_X25 = 0x106 + SOL_XDP = 0x11b + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1e + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x6 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x27 + SO_DONTROUTE = 0x5 + SO_ERROR = 0x4 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x9 + SO_LINGER = 0xd + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0xa + SO_PASSCRED = 0x10 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x11 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1f + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x26 + SO_RCVBUF = 0x8 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x12 + SO_RCVTIMEO = 0x14 + SO_REUSEADDR = 0x2 + SO_REUSEPORT = 0xf + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x7 + SO_SNDBUFFORCE = 0x20 + SO_SNDLOWAT = 0x13 + SO_SNDTIMEO = 0x15 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TXTIME = 0x3d + SO_TYPE = 0x3 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SO_ZEROCOPY = 0x3c + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + SQUASHFS_MAGIC = 0x73717368 + STACK_END_MAGIC = 0x57ac6e9d + STATX_ALL = 0xfff + STATX_ATIME = 0x20 + STATX_ATTR_APPEND = 0x20 + STATX_ATTR_AUTOMOUNT = 0x1000 + STATX_ATTR_COMPRESSED = 0x4 + STATX_ATTR_ENCRYPTED = 0x800 + STATX_ATTR_IMMUTABLE = 0x10 + STATX_ATTR_NODUMP = 0x40 + STATX_BASIC_STATS = 0x7ff + STATX_BLOCKS = 0x400 + STATX_BTIME = 0x800 + STATX_CTIME = 0x80 + STATX_GID = 0x10 + STATX_INO = 0x100 + STATX_MODE = 0x2 + STATX_MTIME = 0x40 + STATX_NLINK = 0x4 + STATX_SIZE = 0x200 + STATX_TYPE = 0x1 + STATX_UID = 0x8 + STATX__RESERVED = 0x80000000 + SYNC_FILE_RANGE_WAIT_AFTER = 0x4 + SYNC_FILE_RANGE_WAIT_BEFORE = 0x1 + SYNC_FILE_RANGE_WRITE = 0x2 + SYSFS_MAGIC = 0x62656572 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x8 + TCFLSH = 0x540b + TCGETA = 0x5405 + TCGETS = 0x5401 + TCGETS2 = 0x802c542a + TCGETX = 0x5432 + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_FASTOPEN_KEY = 0x21 + TCP_FASTOPEN_NO_COOKIE = 0x22 + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_EXT = 0x20 + TCP_MD5SIG_FLAG_PREFIX = 0x1 + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_ULP = 0x1f + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x2 + TCSBRK = 0x5409 + TCSBRKP = 0x5425 + TCSETA = 0x5406 + TCSETAF = 0x5408 + TCSETAW = 0x5407 + TCSETS = 0x5402 + TCSETS2 = 0x402c542b + TCSETSF = 0x5404 + TCSETSF2 = 0x402c542d + TCSETSW = 0x5403 + TCSETSW2 = 0x402c542c + TCSETX = 0x5433 + TCSETXF = 0x5434 + TCSETXW = 0x5435 + TCXONC = 0x540a + TIOCCBRK = 0x5428 + TIOCCONS = 0x541d + TIOCEXCL = 0x540c + TIOCGDEV = 0x80045432 + TIOCGETD = 0x5424 + TIOCGEXCL = 0x80045440 + TIOCGICOUNT = 0x545d + TIOCGLCKTRMIOS = 0x5456 + TIOCGPGRP = 0x540f + TIOCGPKT = 0x80045438 + TIOCGPTLCK = 0x80045439 + TIOCGPTN = 0x80045430 + TIOCGPTPEER = 0x5441 + TIOCGRS485 = 0x542e + TIOCGSERIAL = 0x541e + TIOCGSID = 0x5429 + TIOCGSOFTCAR = 0x5419 + TIOCGWINSZ = 0x5413 + TIOCINQ = 0x541b + TIOCLINUX = 0x541c + TIOCMBIC = 0x5417 + TIOCMBIS = 0x5416 + TIOCMGET = 0x5415 + TIOCMIWAIT = 0x545c + TIOCMSET = 0x5418 + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x5422 + TIOCNXCL = 0x540d + TIOCOUTQ = 0x5411 + TIOCPKT = 0x5420 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x540e + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x5423 + TIOCSIG = 0x40045436 + TIOCSLCKTRMIOS = 0x5457 + TIOCSPGRP = 0x5410 + TIOCSPTLCK = 0x40045431 + TIOCSRS485 = 0x542f + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x541a + TIOCSTI = 0x5412 + TIOCSWINSZ = 0x5414 + TIOCVHANGUP = 0x5437 + TMPFS_MAGIC = 0x1021994 + TOSTOP = 0x100 + TPACKET_ALIGNMENT = 0x10 + TPACKET_HDRLEN = 0x34 + TP_STATUS_AVAILABLE = 0x0 + TP_STATUS_BLK_TMO = 0x20 + TP_STATUS_COPY = 0x2 + TP_STATUS_CSUMNOTREADY = 0x8 + TP_STATUS_CSUM_VALID = 0x80 + TP_STATUS_KERNEL = 0x0 + TP_STATUS_LOSING = 0x4 + TP_STATUS_SENDING = 0x2 + TP_STATUS_SEND_REQUEST = 0x1 + TP_STATUS_TS_RAW_HARDWARE = -0x80000000 + TP_STATUS_TS_SOFTWARE = 0x20000000 + TP_STATUS_TS_SYS_HARDWARE = 0x40000000 + TP_STATUS_USER = 0x1 + TP_STATUS_VLAN_TPID_VALID = 0x40 + TP_STATUS_VLAN_VALID = 0x10 + TP_STATUS_WRONG_FORMAT = 0x4 + TRACEFS_MAGIC = 0x74726163 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x400854d5 + TUNDETACHFILTER = 0x400854d6 + TUNGETFEATURES = 0x800454cf + TUNGETFILTER = 0x800854db + TUNGETIFF = 0x800454d2 + TUNGETSNDBUF = 0x800454d3 + TUNGETVNETBE = 0x800454df + TUNGETVNETHDRSZ = 0x800454d7 + TUNGETVNETLE = 0x800454dd + TUNSETDEBUG = 0x400454c9 + TUNSETFILTEREBPF = 0x800454e1 + TUNSETGROUP = 0x400454ce + TUNSETIFF = 0x400454ca + TUNSETIFINDEX = 0x400454da + TUNSETLINK = 0x400454cd + TUNSETNOCSUM = 0x400454c8 + TUNSETOFFLOAD = 0x400454d0 + TUNSETOWNER = 0x400454cc + TUNSETPERSIST = 0x400454cb + TUNSETQUEUE = 0x400454d9 + TUNSETSNDBUF = 0x400454d4 + TUNSETSTEERINGEBPF = 0x800454e0 + TUNSETTXFILTER = 0x400454d1 + TUNSETVNETBE = 0x400454de + TUNSETVNETHDRSZ = 0x400454d8 + TUNSETVNETLE = 0x400454dc + UBI_IOCATT = 0x40186f40 + UBI_IOCDET = 0x40046f41 + UBI_IOCEBCH = 0x40044f02 + UBI_IOCEBER = 0x40044f01 + UBI_IOCEBISMAP = 0x80044f05 + UBI_IOCEBMAP = 0x40084f03 + UBI_IOCEBUNMAP = 0x40044f04 + UBI_IOCMKVOL = 0x40986f00 + UBI_IOCRMVOL = 0x40046f01 + UBI_IOCRNVOL = 0x51106f03 + UBI_IOCRSVOL = 0x400c6f02 + UBI_IOCSETVOLPROP = 0x40104f06 + UBI_IOCVOLCRBLK = 0x40804f07 + UBI_IOCVOLRMBLK = 0x4f08 + UBI_IOCVOLUP = 0x40084f00 + UDF_SUPER_MAGIC = 0x15013346 + UMOUNT_NOFOLLOW = 0x8 + USBDEVICE_SUPER_MAGIC = 0x9fa2 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + V9FS_MAGIC = 0x1021997 + VDISCARD = 0xd + VEOF = 0x4 + VEOL = 0xb + VEOL2 = 0x10 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x6 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x80045702 + WDIOC_GETPRETIMEOUT = 0x80045709 + WDIOC_GETSTATUS = 0x80045701 + WDIOC_GETSUPPORT = 0x80285700 + WDIOC_GETTEMP = 0x80045703 + WDIOC_GETTIMELEFT = 0x8004570a + WDIOC_GETTIMEOUT = 0x80045707 + WDIOC_KEEPALIVE = 0x80045705 + WDIOC_SETOPTIONS = 0x80045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WIN_ACKMEDIACHANGE = 0xdb + WIN_CHECKPOWERMODE1 = 0xe5 + WIN_CHECKPOWERMODE2 = 0x98 + WIN_DEVICE_RESET = 0x8 + WIN_DIAGNOSE = 0x90 + WIN_DOORLOCK = 0xde + WIN_DOORUNLOCK = 0xdf + WIN_DOWNLOAD_MICROCODE = 0x92 + WIN_FLUSH_CACHE = 0xe7 + WIN_FLUSH_CACHE_EXT = 0xea + WIN_FORMAT = 0x50 + WIN_GETMEDIASTATUS = 0xda + WIN_IDENTIFY = 0xec + WIN_IDENTIFY_DMA = 0xee + WIN_IDLEIMMEDIATE = 0xe1 + WIN_INIT = 0x60 + WIN_MEDIAEJECT = 0xed + WIN_MULTREAD = 0xc4 + WIN_MULTREAD_EXT = 0x29 + WIN_MULTWRITE = 0xc5 + WIN_MULTWRITE_EXT = 0x39 + WIN_NOP = 0x0 + WIN_PACKETCMD = 0xa0 + WIN_PIDENTIFY = 0xa1 + WIN_POSTBOOT = 0xdc + WIN_PREBOOT = 0xdd + WIN_QUEUED_SERVICE = 0xa2 + WIN_READ = 0x20 + WIN_READDMA = 0xc8 + WIN_READDMA_EXT = 0x25 + WIN_READDMA_ONCE = 0xc9 + WIN_READDMA_QUEUED = 0xc7 + WIN_READDMA_QUEUED_EXT = 0x26 + WIN_READ_BUFFER = 0xe4 + WIN_READ_EXT = 0x24 + WIN_READ_LONG = 0x22 + WIN_READ_LONG_ONCE = 0x23 + WIN_READ_NATIVE_MAX = 0xf8 + WIN_READ_NATIVE_MAX_EXT = 0x27 + WIN_READ_ONCE = 0x21 + WIN_RECAL = 0x10 + WIN_RESTORE = 0x10 + WIN_SECURITY_DISABLE = 0xf6 + WIN_SECURITY_ERASE_PREPARE = 0xf3 + WIN_SECURITY_ERASE_UNIT = 0xf4 + WIN_SECURITY_FREEZE_LOCK = 0xf5 + WIN_SECURITY_SET_PASS = 0xf1 + WIN_SECURITY_UNLOCK = 0xf2 + WIN_SEEK = 0x70 + WIN_SETFEATURES = 0xef + WIN_SETIDLE1 = 0xe3 + WIN_SETIDLE2 = 0x97 + WIN_SETMULT = 0xc6 + WIN_SET_MAX = 0xf9 + WIN_SET_MAX_EXT = 0x37 + WIN_SLEEPNOW1 = 0xe6 + WIN_SLEEPNOW2 = 0x99 + WIN_SMART = 0xb0 + WIN_SPECIFY = 0x91 + WIN_SRST = 0x8 + WIN_STANDBY = 0xe2 + WIN_STANDBY2 = 0x96 + WIN_STANDBYNOW1 = 0xe0 + WIN_STANDBYNOW2 = 0x94 + WIN_VERIFY = 0x40 + WIN_VERIFY_EXT = 0x42 + WIN_VERIFY_ONCE = 0x41 + WIN_WRITE = 0x30 + WIN_WRITEDMA = 0xca + WIN_WRITEDMA_EXT = 0x35 + WIN_WRITEDMA_ONCE = 0xcb + WIN_WRITEDMA_QUEUED = 0xcc + WIN_WRITEDMA_QUEUED_EXT = 0x36 + WIN_WRITE_BUFFER = 0xe8 + WIN_WRITE_EXT = 0x34 + WIN_WRITE_LONG = 0x32 + WIN_WRITE_LONG_ONCE = 0x33 + WIN_WRITE_ONCE = 0x31 + WIN_WRITE_SAME = 0xe9 + WIN_WRITE_VERIFY = 0x3c + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x20 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XDP_COPY = 0x2 + XDP_FLAGS_DRV_MODE = 0x4 + XDP_FLAGS_HW_MODE = 0x8 + XDP_FLAGS_MASK = 0xf + XDP_FLAGS_MODES = 0xe + XDP_FLAGS_SKB_MODE = 0x2 + XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 + XDP_MMAP_OFFSETS = 0x1 + XDP_PGOFF_RX_RING = 0x0 + XDP_PGOFF_TX_RING = 0x80000000 + XDP_RX_RING = 0x2 + XDP_SHARED_UMEM = 0x1 + XDP_STATISTICS = 0x7 + XDP_TX_RING = 0x3 + XDP_UMEM_COMPLETION_RING = 0x6 + XDP_UMEM_FILL_RING = 0x5 + XDP_UMEM_PGOFF_COMPLETION_RING = 0x180000000 + XDP_UMEM_PGOFF_FILL_RING = 0x100000000 + XDP_UMEM_REG = 0x4 + XDP_ZEROCOPY = 0x4 + XENFS_SUPER_MAGIC = 0xabba1974 + XTABS = 0x1800 + ZSMALLOC_MAGIC = 0x58295829 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x62) + EADDRNOTAVAIL = syscall.Errno(0x63) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x61) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x72) + EBADE = syscall.Errno(0x34) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x4d) + EBADMSG = syscall.Errno(0x4a) + EBADR = syscall.Errno(0x35) + EBADRQC = syscall.Errno(0x38) + EBADSLT = syscall.Errno(0x39) + EBFONT = syscall.Errno(0x3b) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x7d) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x2c) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x67) + ECONNREFUSED = syscall.Errno(0x6f) + ECONNRESET = syscall.Errno(0x68) + EDEADLK = syscall.Errno(0x23) + EDEADLOCK = syscall.Errno(0x23) + EDESTADDRREQ = syscall.Errno(0x59) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x49) + EDQUOT = syscall.Errno(0x7a) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x70) + EHOSTUNREACH = syscall.Errno(0x71) + EHWPOISON = syscall.Errno(0x85) + EIDRM = syscall.Errno(0x2b) + EILSEQ = syscall.Errno(0x54) + EINPROGRESS = syscall.Errno(0x73) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x6a) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x78) + EKEYEXPIRED = syscall.Errno(0x7f) + EKEYREJECTED = syscall.Errno(0x81) + EKEYREVOKED = syscall.Errno(0x80) + EL2HLT = syscall.Errno(0x33) + EL2NSYNC = syscall.Errno(0x2d) + EL3HLT = syscall.Errno(0x2e) + EL3RST = syscall.Errno(0x2f) + ELIBACC = syscall.Errno(0x4f) + ELIBBAD = syscall.Errno(0x50) + ELIBEXEC = syscall.Errno(0x53) + ELIBMAX = syscall.Errno(0x52) + ELIBSCN = syscall.Errno(0x51) + ELNRNG = syscall.Errno(0x30) + ELOOP = syscall.Errno(0x28) + EMEDIUMTYPE = syscall.Errno(0x7c) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x5a) + EMULTIHOP = syscall.Errno(0x48) + ENAMETOOLONG = syscall.Errno(0x24) + ENAVAIL = syscall.Errno(0x77) + ENETDOWN = syscall.Errno(0x64) + ENETRESET = syscall.Errno(0x66) + ENETUNREACH = syscall.Errno(0x65) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x37) + ENOBUFS = syscall.Errno(0x69) + ENOCSI = syscall.Errno(0x32) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0x7e) + ENOLCK = syscall.Errno(0x25) + ENOLINK = syscall.Errno(0x43) + ENOMEDIUM = syscall.Errno(0x7b) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x2a) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x5c) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x26) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x6b) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x27) + ENOTNAM = syscall.Errno(0x76) + ENOTRECOVERABLE = syscall.Errno(0x83) + ENOTSOCK = syscall.Errno(0x58) + ENOTSUP = syscall.Errno(0x5f) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x4c) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x5f) + EOVERFLOW = syscall.Errno(0x4b) + EOWNERDEAD = syscall.Errno(0x82) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x60) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x5d) + EPROTOTYPE = syscall.Errno(0x5b) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x4e) + EREMOTE = syscall.Errno(0x42) + EREMOTEIO = syscall.Errno(0x79) + ERESTART = syscall.Errno(0x55) + ERFKILL = syscall.Errno(0x84) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x6c) + ESOCKTNOSUPPORT = syscall.Errno(0x5e) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x74) + ESTRPIPE = syscall.Errno(0x56) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x6e) + ETOOMANYREFS = syscall.Errno(0x6d) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x75) + EUNATCH = syscall.Errno(0x31) + EUSERS = syscall.Errno(0x57) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x36) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0x7) + SIGCHLD = syscall.Signal(0x11) + SIGCLD = syscall.Signal(0x11) + SIGCONT = syscall.Signal(0x12) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x1d) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x1d) + SIGPROF = syscall.Signal(0x1b) + SIGPWR = syscall.Signal(0x1e) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTKFLT = syscall.Signal(0x10) + SIGSTOP = syscall.Signal(0x13) + SIGSYS = syscall.Signal(0x1f) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x14) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x17) + SIGUSR1 = syscall.Signal(0xa) + SIGUSR2 = syscall.Signal(0xc) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "no such device or address"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EAGAIN", "resource temporarily unavailable"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device or resource busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "invalid cross-device link"}, + {19, "ENODEV", "no such device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "numerical result out of range"}, + {35, "EDEADLK", "resource deadlock avoided"}, + {36, "ENAMETOOLONG", "file name too long"}, + {37, "ENOLCK", "no locks available"}, + {38, "ENOSYS", "function not implemented"}, + {39, "ENOTEMPTY", "directory not empty"}, + {40, "ELOOP", "too many levels of symbolic links"}, + {42, "ENOMSG", "no message of desired type"}, + {43, "EIDRM", "identifier removed"}, + {44, "ECHRNG", "channel number out of range"}, + {45, "EL2NSYNC", "level 2 not synchronized"}, + {46, "EL3HLT", "level 3 halted"}, + {47, "EL3RST", "level 3 reset"}, + {48, "ELNRNG", "link number out of range"}, + {49, "EUNATCH", "protocol driver not attached"}, + {50, "ENOCSI", "no CSI structure available"}, + {51, "EL2HLT", "level 2 halted"}, + {52, "EBADE", "invalid exchange"}, + {53, "EBADR", "invalid request descriptor"}, + {54, "EXFULL", "exchange full"}, + {55, "ENOANO", "no anode"}, + {56, "EBADRQC", "invalid request code"}, + {57, "EBADSLT", "invalid slot"}, + {59, "EBFONT", "bad font file format"}, + {60, "ENOSTR", "device not a stream"}, + {61, "ENODATA", "no data available"}, + {62, "ETIME", "timer expired"}, + {63, "ENOSR", "out of streams resources"}, + {64, "ENONET", "machine is not on the network"}, + {65, "ENOPKG", "package not installed"}, + {66, "EREMOTE", "object is remote"}, + {67, "ENOLINK", "link has been severed"}, + {68, "EADV", "advertise error"}, + {69, "ESRMNT", "srmount error"}, + {70, "ECOMM", "communication error on send"}, + {71, "EPROTO", "protocol error"}, + {72, "EMULTIHOP", "multihop attempted"}, + {73, "EDOTDOT", "RFS specific error"}, + {74, "EBADMSG", "bad message"}, + {75, "EOVERFLOW", "value too large for defined data type"}, + {76, "ENOTUNIQ", "name not unique on network"}, + {77, "EBADFD", "file descriptor in bad state"}, + {78, "EREMCHG", "remote address changed"}, + {79, "ELIBACC", "can not access a needed shared library"}, + {80, "ELIBBAD", "accessing a corrupted shared library"}, + {81, "ELIBSCN", ".lib section in a.out corrupted"}, + {82, "ELIBMAX", "attempting to link in too many shared libraries"}, + {83, "ELIBEXEC", "cannot exec a shared library directly"}, + {84, "EILSEQ", "invalid or incomplete multibyte or wide character"}, + {85, "ERESTART", "interrupted system call should be restarted"}, + {86, "ESTRPIPE", "streams pipe error"}, + {87, "EUSERS", "too many users"}, + {88, "ENOTSOCK", "socket operation on non-socket"}, + {89, "EDESTADDRREQ", "destination address required"}, + {90, "EMSGSIZE", "message too long"}, + {91, "EPROTOTYPE", "protocol wrong type for socket"}, + {92, "ENOPROTOOPT", "protocol not available"}, + {93, "EPROTONOSUPPORT", "protocol not supported"}, + {94, "ESOCKTNOSUPPORT", "socket type not supported"}, + {95, "ENOTSUP", "operation not supported"}, + {96, "EPFNOSUPPORT", "protocol family not supported"}, + {97, "EAFNOSUPPORT", "address family not supported by protocol"}, + {98, "EADDRINUSE", "address already in use"}, + {99, "EADDRNOTAVAIL", "cannot assign requested address"}, + {100, "ENETDOWN", "network is down"}, + {101, "ENETUNREACH", "network is unreachable"}, + {102, "ENETRESET", "network dropped connection on reset"}, + {103, "ECONNABORTED", "software caused connection abort"}, + {104, "ECONNRESET", "connection reset by peer"}, + {105, "ENOBUFS", "no buffer space available"}, + {106, "EISCONN", "transport endpoint is already connected"}, + {107, "ENOTCONN", "transport endpoint is not connected"}, + {108, "ESHUTDOWN", "cannot send after transport endpoint shutdown"}, + {109, "ETOOMANYREFS", "too many references: cannot splice"}, + {110, "ETIMEDOUT", "connection timed out"}, + {111, "ECONNREFUSED", "connection refused"}, + {112, "EHOSTDOWN", "host is down"}, + {113, "EHOSTUNREACH", "no route to host"}, + {114, "EALREADY", "operation already in progress"}, + {115, "EINPROGRESS", "operation now in progress"}, + {116, "ESTALE", "stale file handle"}, + {117, "EUCLEAN", "structure needs cleaning"}, + {118, "ENOTNAM", "not a XENIX named type file"}, + {119, "ENAVAIL", "no XENIX semaphores available"}, + {120, "EISNAM", "is a named type file"}, + {121, "EREMOTEIO", "remote I/O error"}, + {122, "EDQUOT", "disk quota exceeded"}, + {123, "ENOMEDIUM", "no medium found"}, + {124, "EMEDIUMTYPE", "wrong medium type"}, + {125, "ECANCELED", "operation canceled"}, + {126, "ENOKEY", "required key not available"}, + {127, "EKEYEXPIRED", "key has expired"}, + {128, "EKEYREVOKED", "key has been revoked"}, + {129, "EKEYREJECTED", "key was rejected by service"}, + {130, "EOWNERDEAD", "owner died"}, + {131, "ENOTRECOVERABLE", "state not recoverable"}, + {132, "ERFKILL", "operation not possible due to RF-kill"}, + {133, "EHWPOISON", "memory page has hardware error"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/breakpoint trap"}, + {6, "SIGABRT", "aborted"}, + {7, "SIGBUS", "bus error"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGUSR1", "user defined signal 1"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGUSR2", "user defined signal 2"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGSTKFLT", "stack fault"}, + {17, "SIGCHLD", "child exited"}, + {18, "SIGCONT", "continued"}, + {19, "SIGSTOP", "stopped (signal)"}, + {20, "SIGTSTP", "stopped"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGURG", "urgent I/O condition"}, + {24, "SIGXCPU", "CPU time limit exceeded"}, + {25, "SIGXFSZ", "file size limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window changed"}, + {29, "SIGIO", "I/O possible"}, + {30, "SIGPWR", "power failure"}, + {31, "SIGSYS", "bad system call"}, +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go new file mode 100644 index 00000000..97d5e224 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go @@ -0,0 +1,2693 @@ +// mkerrors.sh -Wall -Werror -static -I/tmp/include -fsigned-char +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm64,linux + +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs -- -Wall -Werror -static -I/tmp/include -fsigned-char _const.go + +package unix + +import "syscall" + +const ( + AAFS_MAGIC = 0x5a3c69f0 + ADFS_SUPER_MAGIC = 0xadf5 + AFFS_SUPER_MAGIC = 0xadff + AFS_FS_MAGIC = 0x6b414653 + AFS_SUPER_MAGIC = 0x5346414f + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2c + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + AF_XDP = 0x2c + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ANON_INODE_FS_MAGIC = 0x9041934 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_RAWIP = 0x207 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + AUTOFS_SUPER_MAGIC = 0x187 + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BALLOON_KVM_MAGIC = 0x13661366 + BDEVFS_MAGIC = 0x62646576 + BINFMTFS_MAGIC = 0x42494e4d + BLKBSZGET = 0x80081270 + BLKBSZSET = 0x40081271 + BLKFLSBUF = 0x1261 + BLKFRAGET = 0x1265 + BLKFRASET = 0x1264 + BLKGETSIZE = 0x1260 + BLKGETSIZE64 = 0x80081272 + BLKPBSZGET = 0x127b + BLKRAGET = 0x1263 + BLKRASET = 0x1262 + BLKROGET = 0x125e + BLKROSET = 0x125d + BLKRRPART = 0x125f + BLKSECTGET = 0x1267 + BLKSECTSET = 0x1266 + BLKSSZGET = 0x1268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_FS_MAGIC = 0xcafe4a11 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + BTRFS_SUPER_MAGIC = 0x9123683e + BTRFS_TEST_MAGIC = 0x73727279 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CGROUP2_SUPER_MAGIC = 0x63677270 + CGROUP_SUPER_MAGIC = 0x27e0eb + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CODA_SUPER_MAGIC = 0x73757245 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRAMFS_MAGIC = 0x28cd3d45 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DAXFS_MAGIC = 0x64646178 + DEBUGFS_MAGIC = 0x64626720 + DEVPTS_SUPER_MAGIC = 0x1cd1 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + ECRYPTFS_SUPER_MAGIC = 0xf15f + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x800 + EFD_SEMAPHORE = 0x1 + EFIVARFS_MAGIC = 0xde5e81e4 + EFS_SUPER_MAGIC = 0x414a53 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ESR_MAGIC = 0x45535201 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_ERSPAN = 0x88be + ETH_P_ERSPAN2 = 0x22eb + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IFE = 0xed3e + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MAP = 0xf9 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_NSH = 0x894f + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PREAUTH = 0x88c7 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXABYTE_ENABLE_NEST = 0xf0 + EXT2_SUPER_MAGIC = 0xef53 + EXT3_SUPER_MAGIC = 0xef53 + EXT4_SUPER_MAGIC = 0xef53 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + EXTRA_MAGIC = 0x45585401 + F2FS_SUPER_MAGIC = 0xf2f52010 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x1000 + FPSIMD_MAGIC = 0x46508001 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_ENCRYPTION_MODE_SPECK128_256_CTS = 0x8 + FS_ENCRYPTION_MODE_SPECK128_256_XTS = 0x7 + FS_IOC_GET_ENCRYPTION_POLICY = 0x400c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x40106614 + FS_IOC_SET_ENCRYPTION_POLICY = 0x800c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0x3 + FUTEXFS_SUPER_MAGIC = 0xbad1dea + F_ADD_SEALS = 0x409 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0x5 + F_GETLK64 = 0x5 + F_GETOWN = 0x9 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_GET_FILE_RW_HINT = 0x40d + F_GET_RW_HINT = 0x40b + F_GET_SEALS = 0x40a + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SEAL_GROW = 0x4 + F_SEAL_SEAL = 0x1 + F_SEAL_SHRINK = 0x2 + F_SEAL_WRITE = 0x8 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x6 + F_SETLK64 = 0x6 + F_SETLKW = 0x7 + F_SETLKW64 = 0x7 + F_SETOWN = 0x8 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SET_FILE_RW_HINT = 0x40e + F_SET_RW_HINT = 0x40c + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HDIO_DRIVE_CMD = 0x31f + HDIO_DRIVE_CMD_AEB = 0x31e + HDIO_DRIVE_CMD_HDR_SIZE = 0x4 + HDIO_DRIVE_HOB_HDR_SIZE = 0x8 + HDIO_DRIVE_RESET = 0x31c + HDIO_DRIVE_TASK = 0x31e + HDIO_DRIVE_TASKFILE = 0x31d + HDIO_DRIVE_TASK_HDR_SIZE = 0x8 + HDIO_GETGEO = 0x301 + HDIO_GET_32BIT = 0x309 + HDIO_GET_ACOUSTIC = 0x30f + HDIO_GET_ADDRESS = 0x310 + HDIO_GET_BUSSTATE = 0x31a + HDIO_GET_DMA = 0x30b + HDIO_GET_IDENTITY = 0x30d + HDIO_GET_KEEPSETTINGS = 0x308 + HDIO_GET_MULTCOUNT = 0x304 + HDIO_GET_NICE = 0x30c + HDIO_GET_NOWERR = 0x30a + HDIO_GET_QDMA = 0x305 + HDIO_GET_UNMASKINTR = 0x302 + HDIO_GET_WCACHE = 0x30e + HDIO_OBSOLETE_IDENTITY = 0x307 + HDIO_SCAN_HWIF = 0x328 + HDIO_SET_32BIT = 0x324 + HDIO_SET_ACOUSTIC = 0x32c + HDIO_SET_ADDRESS = 0x32f + HDIO_SET_BUSSTATE = 0x32d + HDIO_SET_DMA = 0x326 + HDIO_SET_KEEPSETTINGS = 0x323 + HDIO_SET_MULTCOUNT = 0x321 + HDIO_SET_NICE = 0x329 + HDIO_SET_NOWERR = 0x325 + HDIO_SET_PIO_MODE = 0x327 + HDIO_SET_QDMA = 0x32e + HDIO_SET_UNMASKINTR = 0x322 + HDIO_SET_WCACHE = 0x32b + HDIO_SET_XFER = 0x306 + HDIO_TRISTATE_HWIF = 0x31b + HDIO_UNREGISTER_HWIF = 0x32a + HOSTFS_SUPER_MAGIC = 0xc0ffee + HPFS_SUPER_MAGIC = 0xf995e849 + HUGETLBFS_MAGIC = 0x958458f6 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x8000 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x9 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NAPI = 0x10 + IFF_NAPI_FRAGS = 0x20 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x800 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_FREEBIND = 0x4e + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISOFS_SUPER_MAGIC = 0x9660 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + JFFS2_SUPER_MAGIC = 0x72b6 + KEXEC_ARCH_386 = 0x30000 + KEXEC_ARCH_68K = 0x40000 + KEXEC_ARCH_AARCH64 = 0xb70000 + KEXEC_ARCH_ARM = 0x280000 + KEXEC_ARCH_DEFAULT = 0x0 + KEXEC_ARCH_IA_64 = 0x320000 + KEXEC_ARCH_MASK = 0xffff0000 + KEXEC_ARCH_MIPS = 0x80000 + KEXEC_ARCH_MIPS_LE = 0xa0000 + KEXEC_ARCH_PPC = 0x140000 + KEXEC_ARCH_PPC64 = 0x150000 + KEXEC_ARCH_S390 = 0x160000 + KEXEC_ARCH_SH = 0x2a0000 + KEXEC_ARCH_X86_64 = 0x3e0000 + KEXEC_FILE_NO_INITRAMFS = 0x4 + KEXEC_FILE_ON_CRASH = 0x2 + KEXEC_FILE_UNLOAD = 0x1 + KEXEC_ON_CRASH = 0x1 + KEXEC_PRESERVE_CONTEXT = 0x2 + KEXEC_SEGMENT_MAX = 0x10 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_NEGATE = 0xd + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_KEEPONFORK = 0x13 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MADV_WIPEONFORK = 0x12 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_FIXED_NOREPLACE = 0x100000 + MAP_GROWSDOWN = 0x100 + MAP_HUGETLB = 0x40000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x2000 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x4000 + MAP_POPULATE = 0x8000 + MAP_PRIVATE = 0x2 + MAP_SHARED = 0x1 + MAP_SHARED_VALIDATE = 0x3 + MAP_STACK = 0x20000 + MAP_SYNC = 0x80000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MFD_ALLOW_SEALING = 0x2 + MFD_CLOEXEC = 0x1 + MFD_HUGETLB = 0x4 + MFD_HUGE_16GB = -0x78000000 + MFD_HUGE_16MB = 0x60000000 + MFD_HUGE_1GB = 0x78000000 + MFD_HUGE_1MB = 0x50000000 + MFD_HUGE_256MB = 0x70000000 + MFD_HUGE_2GB = 0x7c000000 + MFD_HUGE_2MB = 0x54000000 + MFD_HUGE_32MB = 0x64000000 + MFD_HUGE_512KB = 0x4c000000 + MFD_HUGE_512MB = 0x74000000 + MFD_HUGE_64KB = 0x40000000 + MFD_HUGE_8MB = 0x5c000000 + MFD_HUGE_MASK = 0x3f + MFD_HUGE_SHIFT = 0x1a + MINIX2_SUPER_MAGIC = 0x2468 + MINIX2_SUPER_MAGIC2 = 0x2478 + MINIX3_SUPER_MAGIC = 0x4d5a + MINIX_SUPER_MAGIC = 0x137f + MINIX_SUPER_MAGIC2 = 0x138f + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSDOS_SUPER_MAGIC = 0x4d44 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MSG_ZEROCOPY = 0x4000000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + MTD_INODE_FS_MAGIC = 0x11307854 + NAME_MAX = 0xff + NCP_SUPER_MAGIC = 0x564c + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NETNSA_MAX = 0x3 + NETNSA_NSID_NOT_ASSIGNED = -0x1 + NFNETLINK_V0 = 0x0 + NFNLGRP_ACCT_QUOTA = 0x8 + NFNLGRP_CONNTRACK_DESTROY = 0x3 + NFNLGRP_CONNTRACK_EXP_DESTROY = 0x6 + NFNLGRP_CONNTRACK_EXP_NEW = 0x4 + NFNLGRP_CONNTRACK_EXP_UPDATE = 0x5 + NFNLGRP_CONNTRACK_NEW = 0x1 + NFNLGRP_CONNTRACK_UPDATE = 0x2 + NFNLGRP_MAX = 0x9 + NFNLGRP_NFTABLES = 0x7 + NFNLGRP_NFTRACE = 0x9 + NFNLGRP_NONE = 0x0 + NFNL_BATCH_MAX = 0x1 + NFNL_MSG_BATCH_BEGIN = 0x10 + NFNL_MSG_BATCH_END = 0x11 + NFNL_NFA_NEST = 0x8000 + NFNL_SUBSYS_ACCT = 0x7 + NFNL_SUBSYS_COUNT = 0xc + NFNL_SUBSYS_CTHELPER = 0x9 + NFNL_SUBSYS_CTNETLINK = 0x1 + NFNL_SUBSYS_CTNETLINK_EXP = 0x2 + NFNL_SUBSYS_CTNETLINK_TIMEOUT = 0x8 + NFNL_SUBSYS_IPSET = 0x6 + NFNL_SUBSYS_NFTABLES = 0xa + NFNL_SUBSYS_NFT_COMPAT = 0xb + NFNL_SUBSYS_NONE = 0x0 + NFNL_SUBSYS_OSF = 0x5 + NFNL_SUBSYS_QUEUE = 0x3 + NFNL_SUBSYS_ULOG = 0x4 + NFS_SUPER_MAGIC = 0x6969 + NILFS_SUPER_MAGIC = 0x3434 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_NONREC = 0x100 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + NSFS_MAGIC = 0x6e736673 + OCFS2_SUPER_MAGIC = 0x7461636f + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPENPROM_SUPER_MAGIC = 0x9fa1 + OPOST = 0x1 + OVERLAYFS_SUPER_MAGIC = 0x794c7630 + O_ACCMODE = 0x3 + O_APPEND = 0x400 + O_ASYNC = 0x2000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x40 + O_DIRECT = 0x10000 + O_DIRECTORY = 0x4000 + O_DSYNC = 0x1000 + O_EXCL = 0x80 + O_FSYNC = 0x101000 + O_LARGEFILE = 0x0 + O_NDELAY = 0x800 + O_NOATIME = 0x40000 + O_NOCTTY = 0x100 + O_NOFOLLOW = 0x8000 + O_NONBLOCK = 0x800 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x101000 + O_SYNC = 0x101000 + O_TMPFILE = 0x404000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x2401 + PERF_EVENT_IOC_ENABLE = 0x2400 + PERF_EVENT_IOC_ID = 0x80082407 + PERF_EVENT_IOC_MODIFY_ATTRIBUTES = 0x4008240b + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x40042409 + PERF_EVENT_IOC_PERIOD = 0x40082404 + PERF_EVENT_IOC_QUERY_BPF = 0xc008240a + PERF_EVENT_IOC_REFRESH = 0x2402 + PERF_EVENT_IOC_RESET = 0x2403 + PERF_EVENT_IOC_SET_BPF = 0x40042408 + PERF_EVENT_IOC_SET_FILTER = 0x40082406 + PERF_EVENT_IOC_SET_OUTPUT = 0x2405 + PIPEFS_MAGIC = 0x50495045 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROC_SUPER_MAGIC = 0x9fa0 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_SPECULATION_CTRL = 0x34 + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffffffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_SPECULATION_CTRL = 0x35 + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_SPEC_DISABLE = 0x4 + PR_SPEC_ENABLE = 0x2 + PR_SPEC_FORCE_DISABLE = 0x8 + PR_SPEC_NOT_AFFECTED = 0x0 + PR_SPEC_PRCTL = 0x1 + PR_SPEC_STORE_BYPASS = 0x0 + PR_SVE_GET_VL = 0x33 + PR_SVE_SET_VL = 0x32 + PR_SVE_SET_VL_ONEXEC = 0x40000 + PR_SVE_VL_INHERIT = 0x20000 + PR_SVE_VL_LEN_MASK = 0xffff + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PSTOREFS_MAGIC = 0x6165676c + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKETEXT = 0x4 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SECCOMP_GET_METADATA = 0x420d + PTRACE_SEIZE = 0x4206 + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_TRACEME = 0x0 + QNX4_SUPER_MAGIC = 0x2f + QNX6_SUPER_MAGIC = 0x68191122 + RAMFS_MAGIC = 0x858458f6 + RDTGROUP_SUPER_MAGIC = 0x7655821 + REISERFS_SUPER_MAGIC = 0x52654973 + RENAME_EXCHANGE = 0x2 + RENAME_NOREPLACE = 0x1 + RENAME_WHITEOUT = 0x4 + RLIMIT_AS = 0x9 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x8 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x7 + RLIMIT_NPROC = 0x6 + RLIMIT_RSS = 0x5 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FASTOPEN_NO_COOKIE = 0x11 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x11 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1d + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTC_AF = 0x20 + RTC_AIE_OFF = 0x7002 + RTC_AIE_ON = 0x7001 + RTC_ALM_READ = 0x80247008 + RTC_ALM_SET = 0x40247007 + RTC_EPOCH_READ = 0x8008700d + RTC_EPOCH_SET = 0x4008700e + RTC_IRQF = 0x80 + RTC_IRQP_READ = 0x8008700b + RTC_IRQP_SET = 0x4008700c + RTC_MAX_FREQ = 0x2000 + RTC_PF = 0x40 + RTC_PIE_OFF = 0x7006 + RTC_PIE_ON = 0x7005 + RTC_PLL_GET = 0x80207011 + RTC_PLL_SET = 0x40207012 + RTC_RD_TIME = 0x80247009 + RTC_SET_TIME = 0x4024700a + RTC_UF = 0x10 + RTC_UIE_OFF = 0x7004 + RTC_UIE_ON = 0x7003 + RTC_VL_CLR = 0x7014 + RTC_VL_READ = 0x80047013 + RTC_WIE_OFF = 0x7010 + RTC_WIE_ON = 0x700f + RTC_WKALM_RD = 0x80287010 + RTC_WKALM_SET = 0x4028700f + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELCHAIN = 0x65 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETCHAIN = 0x66 + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x67 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWCHAIN = 0x64 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x16 + RTM_NR_MSGTYPES = 0x58 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BGP = 0xba + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_EIGRP = 0xc0 + RTPROT_GATED = 0x8 + RTPROT_ISIS = 0xbb + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_OSPF = 0xbc + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_RIP = 0xbd + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_TXTIME = 0x3d + SCM_WIFI_STATUS = 0x29 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SECURITYFS_MAGIC = 0x73636673 + SELINUX_MAGIC = 0xf97cff8c + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x8905 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x8904 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x541b + SIOCOUTQ = 0x5411 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x8902 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SMACK_MAGIC = 0x43415d53 + SMART_AUTOSAVE = 0xd2 + SMART_AUTO_OFFLINE = 0xdb + SMART_DISABLE = 0xd9 + SMART_ENABLE = 0xd8 + SMART_HCYL_PASS = 0xc2 + SMART_IMMEDIATE_OFFLINE = 0xd4 + SMART_LCYL_PASS = 0x4f + SMART_READ_LOG_SECTOR = 0xd5 + SMART_READ_THRESHOLDS = 0xd1 + SMART_READ_VALUES = 0xd0 + SMART_SAVE = 0xd3 + SMART_STATUS = 0xda + SMART_WRITE_LOG_SECTOR = 0xd6 + SMART_WRITE_THRESHOLDS = 0xd7 + SMB_SUPER_MAGIC = 0x517b + SOCKFS_MAGIC = 0x534f434b + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x2 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x800 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0x1 + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_TLS = 0x11a + SOL_X25 = 0x106 + SOL_XDP = 0x11b + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1e + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x6 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x27 + SO_DONTROUTE = 0x5 + SO_ERROR = 0x4 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x9 + SO_LINGER = 0xd + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0xa + SO_PASSCRED = 0x10 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x11 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1f + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x26 + SO_RCVBUF = 0x8 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x12 + SO_RCVTIMEO = 0x14 + SO_REUSEADDR = 0x2 + SO_REUSEPORT = 0xf + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x7 + SO_SNDBUFFORCE = 0x20 + SO_SNDLOWAT = 0x13 + SO_SNDTIMEO = 0x15 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TXTIME = 0x3d + SO_TYPE = 0x3 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SO_ZEROCOPY = 0x3c + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + SQUASHFS_MAGIC = 0x73717368 + STACK_END_MAGIC = 0x57ac6e9d + STATX_ALL = 0xfff + STATX_ATIME = 0x20 + STATX_ATTR_APPEND = 0x20 + STATX_ATTR_AUTOMOUNT = 0x1000 + STATX_ATTR_COMPRESSED = 0x4 + STATX_ATTR_ENCRYPTED = 0x800 + STATX_ATTR_IMMUTABLE = 0x10 + STATX_ATTR_NODUMP = 0x40 + STATX_BASIC_STATS = 0x7ff + STATX_BLOCKS = 0x400 + STATX_BTIME = 0x800 + STATX_CTIME = 0x80 + STATX_GID = 0x10 + STATX_INO = 0x100 + STATX_MODE = 0x2 + STATX_MTIME = 0x40 + STATX_NLINK = 0x4 + STATX_SIZE = 0x200 + STATX_TYPE = 0x1 + STATX_UID = 0x8 + STATX__RESERVED = 0x80000000 + SVE_MAGIC = 0x53564501 + SYNC_FILE_RANGE_WAIT_AFTER = 0x4 + SYNC_FILE_RANGE_WAIT_BEFORE = 0x1 + SYNC_FILE_RANGE_WRITE = 0x2 + SYSFS_MAGIC = 0x62656572 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x8 + TCFLSH = 0x540b + TCGETA = 0x5405 + TCGETS = 0x5401 + TCGETS2 = 0x802c542a + TCGETX = 0x5432 + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_FASTOPEN_KEY = 0x21 + TCP_FASTOPEN_NO_COOKIE = 0x22 + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_EXT = 0x20 + TCP_MD5SIG_FLAG_PREFIX = 0x1 + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_ULP = 0x1f + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x2 + TCSBRK = 0x5409 + TCSBRKP = 0x5425 + TCSETA = 0x5406 + TCSETAF = 0x5408 + TCSETAW = 0x5407 + TCSETS = 0x5402 + TCSETS2 = 0x402c542b + TCSETSF = 0x5404 + TCSETSF2 = 0x402c542d + TCSETSW = 0x5403 + TCSETSW2 = 0x402c542c + TCSETX = 0x5433 + TCSETXF = 0x5434 + TCSETXW = 0x5435 + TCXONC = 0x540a + TIOCCBRK = 0x5428 + TIOCCONS = 0x541d + TIOCEXCL = 0x540c + TIOCGDEV = 0x80045432 + TIOCGETD = 0x5424 + TIOCGEXCL = 0x80045440 + TIOCGICOUNT = 0x545d + TIOCGLCKTRMIOS = 0x5456 + TIOCGPGRP = 0x540f + TIOCGPKT = 0x80045438 + TIOCGPTLCK = 0x80045439 + TIOCGPTN = 0x80045430 + TIOCGPTPEER = 0x5441 + TIOCGRS485 = 0x542e + TIOCGSERIAL = 0x541e + TIOCGSID = 0x5429 + TIOCGSOFTCAR = 0x5419 + TIOCGWINSZ = 0x5413 + TIOCINQ = 0x541b + TIOCLINUX = 0x541c + TIOCMBIC = 0x5417 + TIOCMBIS = 0x5416 + TIOCMGET = 0x5415 + TIOCMIWAIT = 0x545c + TIOCMSET = 0x5418 + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x5422 + TIOCNXCL = 0x540d + TIOCOUTQ = 0x5411 + TIOCPKT = 0x5420 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x540e + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x5423 + TIOCSIG = 0x40045436 + TIOCSLCKTRMIOS = 0x5457 + TIOCSPGRP = 0x5410 + TIOCSPTLCK = 0x40045431 + TIOCSRS485 = 0x542f + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x541a + TIOCSTI = 0x5412 + TIOCSWINSZ = 0x5414 + TIOCVHANGUP = 0x5437 + TMPFS_MAGIC = 0x1021994 + TOSTOP = 0x100 + TPACKET_ALIGNMENT = 0x10 + TPACKET_HDRLEN = 0x34 + TP_STATUS_AVAILABLE = 0x0 + TP_STATUS_BLK_TMO = 0x20 + TP_STATUS_COPY = 0x2 + TP_STATUS_CSUMNOTREADY = 0x8 + TP_STATUS_CSUM_VALID = 0x80 + TP_STATUS_KERNEL = 0x0 + TP_STATUS_LOSING = 0x4 + TP_STATUS_SENDING = 0x2 + TP_STATUS_SEND_REQUEST = 0x1 + TP_STATUS_TS_RAW_HARDWARE = -0x80000000 + TP_STATUS_TS_SOFTWARE = 0x20000000 + TP_STATUS_TS_SYS_HARDWARE = 0x40000000 + TP_STATUS_USER = 0x1 + TP_STATUS_VLAN_TPID_VALID = 0x40 + TP_STATUS_VLAN_VALID = 0x10 + TP_STATUS_WRONG_FORMAT = 0x4 + TRACEFS_MAGIC = 0x74726163 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x401054d5 + TUNDETACHFILTER = 0x401054d6 + TUNGETFEATURES = 0x800454cf + TUNGETFILTER = 0x801054db + TUNGETIFF = 0x800454d2 + TUNGETSNDBUF = 0x800454d3 + TUNGETVNETBE = 0x800454df + TUNGETVNETHDRSZ = 0x800454d7 + TUNGETVNETLE = 0x800454dd + TUNSETDEBUG = 0x400454c9 + TUNSETFILTEREBPF = 0x800454e1 + TUNSETGROUP = 0x400454ce + TUNSETIFF = 0x400454ca + TUNSETIFINDEX = 0x400454da + TUNSETLINK = 0x400454cd + TUNSETNOCSUM = 0x400454c8 + TUNSETOFFLOAD = 0x400454d0 + TUNSETOWNER = 0x400454cc + TUNSETPERSIST = 0x400454cb + TUNSETQUEUE = 0x400454d9 + TUNSETSNDBUF = 0x400454d4 + TUNSETSTEERINGEBPF = 0x800454e0 + TUNSETTXFILTER = 0x400454d1 + TUNSETVNETBE = 0x400454de + TUNSETVNETHDRSZ = 0x400454d8 + TUNSETVNETLE = 0x400454dc + UBI_IOCATT = 0x40186f40 + UBI_IOCDET = 0x40046f41 + UBI_IOCEBCH = 0x40044f02 + UBI_IOCEBER = 0x40044f01 + UBI_IOCEBISMAP = 0x80044f05 + UBI_IOCEBMAP = 0x40084f03 + UBI_IOCEBUNMAP = 0x40044f04 + UBI_IOCMKVOL = 0x40986f00 + UBI_IOCRMVOL = 0x40046f01 + UBI_IOCRNVOL = 0x51106f03 + UBI_IOCRSVOL = 0x400c6f02 + UBI_IOCSETVOLPROP = 0x40104f06 + UBI_IOCVOLCRBLK = 0x40804f07 + UBI_IOCVOLRMBLK = 0x4f08 + UBI_IOCVOLUP = 0x40084f00 + UDF_SUPER_MAGIC = 0x15013346 + UMOUNT_NOFOLLOW = 0x8 + USBDEVICE_SUPER_MAGIC = 0x9fa2 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + V9FS_MAGIC = 0x1021997 + VDISCARD = 0xd + VEOF = 0x4 + VEOL = 0xb + VEOL2 = 0x10 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x6 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x80045702 + WDIOC_GETPRETIMEOUT = 0x80045709 + WDIOC_GETSTATUS = 0x80045701 + WDIOC_GETSUPPORT = 0x80285700 + WDIOC_GETTEMP = 0x80045703 + WDIOC_GETTIMELEFT = 0x8004570a + WDIOC_GETTIMEOUT = 0x80045707 + WDIOC_KEEPALIVE = 0x80045705 + WDIOC_SETOPTIONS = 0x80045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WIN_ACKMEDIACHANGE = 0xdb + WIN_CHECKPOWERMODE1 = 0xe5 + WIN_CHECKPOWERMODE2 = 0x98 + WIN_DEVICE_RESET = 0x8 + WIN_DIAGNOSE = 0x90 + WIN_DOORLOCK = 0xde + WIN_DOORUNLOCK = 0xdf + WIN_DOWNLOAD_MICROCODE = 0x92 + WIN_FLUSH_CACHE = 0xe7 + WIN_FLUSH_CACHE_EXT = 0xea + WIN_FORMAT = 0x50 + WIN_GETMEDIASTATUS = 0xda + WIN_IDENTIFY = 0xec + WIN_IDENTIFY_DMA = 0xee + WIN_IDLEIMMEDIATE = 0xe1 + WIN_INIT = 0x60 + WIN_MEDIAEJECT = 0xed + WIN_MULTREAD = 0xc4 + WIN_MULTREAD_EXT = 0x29 + WIN_MULTWRITE = 0xc5 + WIN_MULTWRITE_EXT = 0x39 + WIN_NOP = 0x0 + WIN_PACKETCMD = 0xa0 + WIN_PIDENTIFY = 0xa1 + WIN_POSTBOOT = 0xdc + WIN_PREBOOT = 0xdd + WIN_QUEUED_SERVICE = 0xa2 + WIN_READ = 0x20 + WIN_READDMA = 0xc8 + WIN_READDMA_EXT = 0x25 + WIN_READDMA_ONCE = 0xc9 + WIN_READDMA_QUEUED = 0xc7 + WIN_READDMA_QUEUED_EXT = 0x26 + WIN_READ_BUFFER = 0xe4 + WIN_READ_EXT = 0x24 + WIN_READ_LONG = 0x22 + WIN_READ_LONG_ONCE = 0x23 + WIN_READ_NATIVE_MAX = 0xf8 + WIN_READ_NATIVE_MAX_EXT = 0x27 + WIN_READ_ONCE = 0x21 + WIN_RECAL = 0x10 + WIN_RESTORE = 0x10 + WIN_SECURITY_DISABLE = 0xf6 + WIN_SECURITY_ERASE_PREPARE = 0xf3 + WIN_SECURITY_ERASE_UNIT = 0xf4 + WIN_SECURITY_FREEZE_LOCK = 0xf5 + WIN_SECURITY_SET_PASS = 0xf1 + WIN_SECURITY_UNLOCK = 0xf2 + WIN_SEEK = 0x70 + WIN_SETFEATURES = 0xef + WIN_SETIDLE1 = 0xe3 + WIN_SETIDLE2 = 0x97 + WIN_SETMULT = 0xc6 + WIN_SET_MAX = 0xf9 + WIN_SET_MAX_EXT = 0x37 + WIN_SLEEPNOW1 = 0xe6 + WIN_SLEEPNOW2 = 0x99 + WIN_SMART = 0xb0 + WIN_SPECIFY = 0x91 + WIN_SRST = 0x8 + WIN_STANDBY = 0xe2 + WIN_STANDBY2 = 0x96 + WIN_STANDBYNOW1 = 0xe0 + WIN_STANDBYNOW2 = 0x94 + WIN_VERIFY = 0x40 + WIN_VERIFY_EXT = 0x42 + WIN_VERIFY_ONCE = 0x41 + WIN_WRITE = 0x30 + WIN_WRITEDMA = 0xca + WIN_WRITEDMA_EXT = 0x35 + WIN_WRITEDMA_ONCE = 0xcb + WIN_WRITEDMA_QUEUED = 0xcc + WIN_WRITEDMA_QUEUED_EXT = 0x36 + WIN_WRITE_BUFFER = 0xe8 + WIN_WRITE_EXT = 0x34 + WIN_WRITE_LONG = 0x32 + WIN_WRITE_LONG_ONCE = 0x33 + WIN_WRITE_ONCE = 0x31 + WIN_WRITE_SAME = 0xe9 + WIN_WRITE_VERIFY = 0x3c + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x40 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XDP_COPY = 0x2 + XDP_FLAGS_DRV_MODE = 0x4 + XDP_FLAGS_HW_MODE = 0x8 + XDP_FLAGS_MASK = 0xf + XDP_FLAGS_MODES = 0xe + XDP_FLAGS_SKB_MODE = 0x2 + XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 + XDP_MMAP_OFFSETS = 0x1 + XDP_PGOFF_RX_RING = 0x0 + XDP_PGOFF_TX_RING = 0x80000000 + XDP_RX_RING = 0x2 + XDP_SHARED_UMEM = 0x1 + XDP_STATISTICS = 0x7 + XDP_TX_RING = 0x3 + XDP_UMEM_COMPLETION_RING = 0x6 + XDP_UMEM_FILL_RING = 0x5 + XDP_UMEM_PGOFF_COMPLETION_RING = 0x180000000 + XDP_UMEM_PGOFF_FILL_RING = 0x100000000 + XDP_UMEM_REG = 0x4 + XDP_ZEROCOPY = 0x4 + XENFS_SUPER_MAGIC = 0xabba1974 + XTABS = 0x1800 + ZSMALLOC_MAGIC = 0x58295829 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x62) + EADDRNOTAVAIL = syscall.Errno(0x63) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x61) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x72) + EBADE = syscall.Errno(0x34) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x4d) + EBADMSG = syscall.Errno(0x4a) + EBADR = syscall.Errno(0x35) + EBADRQC = syscall.Errno(0x38) + EBADSLT = syscall.Errno(0x39) + EBFONT = syscall.Errno(0x3b) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x7d) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x2c) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x67) + ECONNREFUSED = syscall.Errno(0x6f) + ECONNRESET = syscall.Errno(0x68) + EDEADLK = syscall.Errno(0x23) + EDEADLOCK = syscall.Errno(0x23) + EDESTADDRREQ = syscall.Errno(0x59) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x49) + EDQUOT = syscall.Errno(0x7a) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x70) + EHOSTUNREACH = syscall.Errno(0x71) + EHWPOISON = syscall.Errno(0x85) + EIDRM = syscall.Errno(0x2b) + EILSEQ = syscall.Errno(0x54) + EINPROGRESS = syscall.Errno(0x73) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x6a) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x78) + EKEYEXPIRED = syscall.Errno(0x7f) + EKEYREJECTED = syscall.Errno(0x81) + EKEYREVOKED = syscall.Errno(0x80) + EL2HLT = syscall.Errno(0x33) + EL2NSYNC = syscall.Errno(0x2d) + EL3HLT = syscall.Errno(0x2e) + EL3RST = syscall.Errno(0x2f) + ELIBACC = syscall.Errno(0x4f) + ELIBBAD = syscall.Errno(0x50) + ELIBEXEC = syscall.Errno(0x53) + ELIBMAX = syscall.Errno(0x52) + ELIBSCN = syscall.Errno(0x51) + ELNRNG = syscall.Errno(0x30) + ELOOP = syscall.Errno(0x28) + EMEDIUMTYPE = syscall.Errno(0x7c) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x5a) + EMULTIHOP = syscall.Errno(0x48) + ENAMETOOLONG = syscall.Errno(0x24) + ENAVAIL = syscall.Errno(0x77) + ENETDOWN = syscall.Errno(0x64) + ENETRESET = syscall.Errno(0x66) + ENETUNREACH = syscall.Errno(0x65) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x37) + ENOBUFS = syscall.Errno(0x69) + ENOCSI = syscall.Errno(0x32) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0x7e) + ENOLCK = syscall.Errno(0x25) + ENOLINK = syscall.Errno(0x43) + ENOMEDIUM = syscall.Errno(0x7b) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x2a) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x5c) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x26) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x6b) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x27) + ENOTNAM = syscall.Errno(0x76) + ENOTRECOVERABLE = syscall.Errno(0x83) + ENOTSOCK = syscall.Errno(0x58) + ENOTSUP = syscall.Errno(0x5f) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x4c) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x5f) + EOVERFLOW = syscall.Errno(0x4b) + EOWNERDEAD = syscall.Errno(0x82) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x60) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x5d) + EPROTOTYPE = syscall.Errno(0x5b) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x4e) + EREMOTE = syscall.Errno(0x42) + EREMOTEIO = syscall.Errno(0x79) + ERESTART = syscall.Errno(0x55) + ERFKILL = syscall.Errno(0x84) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x6c) + ESOCKTNOSUPPORT = syscall.Errno(0x5e) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x74) + ESTRPIPE = syscall.Errno(0x56) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x6e) + ETOOMANYREFS = syscall.Errno(0x6d) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x75) + EUNATCH = syscall.Errno(0x31) + EUSERS = syscall.Errno(0x57) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x36) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0x7) + SIGCHLD = syscall.Signal(0x11) + SIGCLD = syscall.Signal(0x11) + SIGCONT = syscall.Signal(0x12) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x1d) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x1d) + SIGPROF = syscall.Signal(0x1b) + SIGPWR = syscall.Signal(0x1e) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTKFLT = syscall.Signal(0x10) + SIGSTOP = syscall.Signal(0x13) + SIGSYS = syscall.Signal(0x1f) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x14) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x17) + SIGUSR1 = syscall.Signal(0xa) + SIGUSR2 = syscall.Signal(0xc) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "no such device or address"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EAGAIN", "resource temporarily unavailable"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device or resource busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "invalid cross-device link"}, + {19, "ENODEV", "no such device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "numerical result out of range"}, + {35, "EDEADLK", "resource deadlock avoided"}, + {36, "ENAMETOOLONG", "file name too long"}, + {37, "ENOLCK", "no locks available"}, + {38, "ENOSYS", "function not implemented"}, + {39, "ENOTEMPTY", "directory not empty"}, + {40, "ELOOP", "too many levels of symbolic links"}, + {42, "ENOMSG", "no message of desired type"}, + {43, "EIDRM", "identifier removed"}, + {44, "ECHRNG", "channel number out of range"}, + {45, "EL2NSYNC", "level 2 not synchronized"}, + {46, "EL3HLT", "level 3 halted"}, + {47, "EL3RST", "level 3 reset"}, + {48, "ELNRNG", "link number out of range"}, + {49, "EUNATCH", "protocol driver not attached"}, + {50, "ENOCSI", "no CSI structure available"}, + {51, "EL2HLT", "level 2 halted"}, + {52, "EBADE", "invalid exchange"}, + {53, "EBADR", "invalid request descriptor"}, + {54, "EXFULL", "exchange full"}, + {55, "ENOANO", "no anode"}, + {56, "EBADRQC", "invalid request code"}, + {57, "EBADSLT", "invalid slot"}, + {59, "EBFONT", "bad font file format"}, + {60, "ENOSTR", "device not a stream"}, + {61, "ENODATA", "no data available"}, + {62, "ETIME", "timer expired"}, + {63, "ENOSR", "out of streams resources"}, + {64, "ENONET", "machine is not on the network"}, + {65, "ENOPKG", "package not installed"}, + {66, "EREMOTE", "object is remote"}, + {67, "ENOLINK", "link has been severed"}, + {68, "EADV", "advertise error"}, + {69, "ESRMNT", "srmount error"}, + {70, "ECOMM", "communication error on send"}, + {71, "EPROTO", "protocol error"}, + {72, "EMULTIHOP", "multihop attempted"}, + {73, "EDOTDOT", "RFS specific error"}, + {74, "EBADMSG", "bad message"}, + {75, "EOVERFLOW", "value too large for defined data type"}, + {76, "ENOTUNIQ", "name not unique on network"}, + {77, "EBADFD", "file descriptor in bad state"}, + {78, "EREMCHG", "remote address changed"}, + {79, "ELIBACC", "can not access a needed shared library"}, + {80, "ELIBBAD", "accessing a corrupted shared library"}, + {81, "ELIBSCN", ".lib section in a.out corrupted"}, + {82, "ELIBMAX", "attempting to link in too many shared libraries"}, + {83, "ELIBEXEC", "cannot exec a shared library directly"}, + {84, "EILSEQ", "invalid or incomplete multibyte or wide character"}, + {85, "ERESTART", "interrupted system call should be restarted"}, + {86, "ESTRPIPE", "streams pipe error"}, + {87, "EUSERS", "too many users"}, + {88, "ENOTSOCK", "socket operation on non-socket"}, + {89, "EDESTADDRREQ", "destination address required"}, + {90, "EMSGSIZE", "message too long"}, + {91, "EPROTOTYPE", "protocol wrong type for socket"}, + {92, "ENOPROTOOPT", "protocol not available"}, + {93, "EPROTONOSUPPORT", "protocol not supported"}, + {94, "ESOCKTNOSUPPORT", "socket type not supported"}, + {95, "ENOTSUP", "operation not supported"}, + {96, "EPFNOSUPPORT", "protocol family not supported"}, + {97, "EAFNOSUPPORT", "address family not supported by protocol"}, + {98, "EADDRINUSE", "address already in use"}, + {99, "EADDRNOTAVAIL", "cannot assign requested address"}, + {100, "ENETDOWN", "network is down"}, + {101, "ENETUNREACH", "network is unreachable"}, + {102, "ENETRESET", "network dropped connection on reset"}, + {103, "ECONNABORTED", "software caused connection abort"}, + {104, "ECONNRESET", "connection reset by peer"}, + {105, "ENOBUFS", "no buffer space available"}, + {106, "EISCONN", "transport endpoint is already connected"}, + {107, "ENOTCONN", "transport endpoint is not connected"}, + {108, "ESHUTDOWN", "cannot send after transport endpoint shutdown"}, + {109, "ETOOMANYREFS", "too many references: cannot splice"}, + {110, "ETIMEDOUT", "connection timed out"}, + {111, "ECONNREFUSED", "connection refused"}, + {112, "EHOSTDOWN", "host is down"}, + {113, "EHOSTUNREACH", "no route to host"}, + {114, "EALREADY", "operation already in progress"}, + {115, "EINPROGRESS", "operation now in progress"}, + {116, "ESTALE", "stale file handle"}, + {117, "EUCLEAN", "structure needs cleaning"}, + {118, "ENOTNAM", "not a XENIX named type file"}, + {119, "ENAVAIL", "no XENIX semaphores available"}, + {120, "EISNAM", "is a named type file"}, + {121, "EREMOTEIO", "remote I/O error"}, + {122, "EDQUOT", "disk quota exceeded"}, + {123, "ENOMEDIUM", "no medium found"}, + {124, "EMEDIUMTYPE", "wrong medium type"}, + {125, "ECANCELED", "operation canceled"}, + {126, "ENOKEY", "required key not available"}, + {127, "EKEYEXPIRED", "key has expired"}, + {128, "EKEYREVOKED", "key has been revoked"}, + {129, "EKEYREJECTED", "key was rejected by service"}, + {130, "EOWNERDEAD", "owner died"}, + {131, "ENOTRECOVERABLE", "state not recoverable"}, + {132, "ERFKILL", "operation not possible due to RF-kill"}, + {133, "EHWPOISON", "memory page has hardware error"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/breakpoint trap"}, + {6, "SIGABRT", "aborted"}, + {7, "SIGBUS", "bus error"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGUSR1", "user defined signal 1"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGUSR2", "user defined signal 2"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGSTKFLT", "stack fault"}, + {17, "SIGCHLD", "child exited"}, + {18, "SIGCONT", "continued"}, + {19, "SIGSTOP", "stopped (signal)"}, + {20, "SIGTSTP", "stopped"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGURG", "urgent I/O condition"}, + {24, "SIGXCPU", "CPU time limit exceeded"}, + {25, "SIGXFSZ", "file size limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window changed"}, + {29, "SIGIO", "I/O possible"}, + {30, "SIGPWR", "power failure"}, + {31, "SIGSYS", "bad system call"}, +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go new file mode 100644 index 00000000..059d1fc1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go @@ -0,0 +1,2709 @@ +// mkerrors.sh -Wall -Werror -static -I/tmp/include +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build mips,linux + +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go + +package unix + +import "syscall" + +const ( + AAFS_MAGIC = 0x5a3c69f0 + ADFS_SUPER_MAGIC = 0xadf5 + AFFS_SUPER_MAGIC = 0xadff + AFS_FS_MAGIC = 0x6b414653 + AFS_SUPER_MAGIC = 0x5346414f + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2c + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + AF_XDP = 0x2c + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ANON_INODE_FS_MAGIC = 0x9041934 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_RAWIP = 0x207 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + AUTOFS_SUPER_MAGIC = 0x187 + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BALLOON_KVM_MAGIC = 0x13661366 + BDEVFS_MAGIC = 0x62646576 + BINFMTFS_MAGIC = 0x42494e4d + BLKBSZGET = 0x40041270 + BLKBSZSET = 0x80041271 + BLKFLSBUF = 0x20001261 + BLKFRAGET = 0x20001265 + BLKFRASET = 0x20001264 + BLKGETSIZE = 0x20001260 + BLKGETSIZE64 = 0x40041272 + BLKPBSZGET = 0x2000127b + BLKRAGET = 0x20001263 + BLKRASET = 0x20001262 + BLKROGET = 0x2000125e + BLKROSET = 0x2000125d + BLKRRPART = 0x2000125f + BLKSECTGET = 0x20001267 + BLKSECTSET = 0x20001266 + BLKSSZGET = 0x20001268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_FS_MAGIC = 0xcafe4a11 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + BTRFS_SUPER_MAGIC = 0x9123683e + BTRFS_TEST_MAGIC = 0x73727279 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CGROUP2_SUPER_MAGIC = 0x63677270 + CGROUP_SUPER_MAGIC = 0x27e0eb + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CODA_SUPER_MAGIC = 0x73757245 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRAMFS_MAGIC = 0x28cd3d45 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DAXFS_MAGIC = 0x64646178 + DEBUGFS_MAGIC = 0x64626720 + DEVPTS_SUPER_MAGIC = 0x1cd1 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + ECRYPTFS_SUPER_MAGIC = 0xf15f + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x80 + EFD_SEMAPHORE = 0x1 + EFIVARFS_MAGIC = 0xde5e81e4 + EFS_SUPER_MAGIC = 0x414a53 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_ERSPAN = 0x88be + ETH_P_ERSPAN2 = 0x22eb + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IFE = 0xed3e + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MAP = 0xf9 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_NSH = 0x894f + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PREAUTH = 0x88c7 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXABYTE_ENABLE_NEST = 0xf0 + EXT2_SUPER_MAGIC = 0xef53 + EXT3_SUPER_MAGIC = 0xef53 + EXT4_SUPER_MAGIC = 0xef53 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + F2FS_SUPER_MAGIC = 0xf2f52010 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x2000 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_ENCRYPTION_MODE_SPECK128_256_CTS = 0x8 + FS_ENCRYPTION_MODE_SPECK128_256_XTS = 0x7 + FS_IOC_GET_ENCRYPTION_POLICY = 0x800c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x80106614 + FS_IOC_SET_ENCRYPTION_POLICY = 0x400c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0x3 + FUTEXFS_SUPER_MAGIC = 0xbad1dea + F_ADD_SEALS = 0x409 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0x21 + F_GETLK64 = 0x21 + F_GETOWN = 0x17 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_GET_FILE_RW_HINT = 0x40d + F_GET_RW_HINT = 0x40b + F_GET_SEALS = 0x40a + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SEAL_GROW = 0x4 + F_SEAL_SEAL = 0x1 + F_SEAL_SHRINK = 0x2 + F_SEAL_WRITE = 0x8 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x22 + F_SETLK64 = 0x22 + F_SETLKW = 0x23 + F_SETLKW64 = 0x23 + F_SETOWN = 0x18 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SET_FILE_RW_HINT = 0x40e + F_SET_RW_HINT = 0x40c + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HDIO_DRIVE_CMD = 0x31f + HDIO_DRIVE_CMD_AEB = 0x31e + HDIO_DRIVE_CMD_HDR_SIZE = 0x4 + HDIO_DRIVE_HOB_HDR_SIZE = 0x8 + HDIO_DRIVE_RESET = 0x31c + HDIO_DRIVE_TASK = 0x31e + HDIO_DRIVE_TASKFILE = 0x31d + HDIO_DRIVE_TASK_HDR_SIZE = 0x8 + HDIO_GETGEO = 0x301 + HDIO_GET_32BIT = 0x309 + HDIO_GET_ACOUSTIC = 0x30f + HDIO_GET_ADDRESS = 0x310 + HDIO_GET_BUSSTATE = 0x31a + HDIO_GET_DMA = 0x30b + HDIO_GET_IDENTITY = 0x30d + HDIO_GET_KEEPSETTINGS = 0x308 + HDIO_GET_MULTCOUNT = 0x304 + HDIO_GET_NICE = 0x30c + HDIO_GET_NOWERR = 0x30a + HDIO_GET_QDMA = 0x305 + HDIO_GET_UNMASKINTR = 0x302 + HDIO_GET_WCACHE = 0x30e + HDIO_OBSOLETE_IDENTITY = 0x307 + HDIO_SCAN_HWIF = 0x328 + HDIO_SET_32BIT = 0x324 + HDIO_SET_ACOUSTIC = 0x32c + HDIO_SET_ADDRESS = 0x32f + HDIO_SET_BUSSTATE = 0x32d + HDIO_SET_DMA = 0x326 + HDIO_SET_KEEPSETTINGS = 0x323 + HDIO_SET_MULTCOUNT = 0x321 + HDIO_SET_NICE = 0x329 + HDIO_SET_NOWERR = 0x325 + HDIO_SET_PIO_MODE = 0x327 + HDIO_SET_QDMA = 0x32e + HDIO_SET_UNMASKINTR = 0x322 + HDIO_SET_WCACHE = 0x32b + HDIO_SET_XFER = 0x306 + HDIO_TRISTATE_HWIF = 0x31b + HDIO_UNREGISTER_HWIF = 0x32a + HOSTFS_SUPER_MAGIC = 0xc0ffee + HPFS_SUPER_MAGIC = 0xf995e849 + HUGETLBFS_MAGIC = 0x958458f6 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x100 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x9 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NAPI = 0x10 + IFF_NAPI_FRAGS = 0x20 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x80 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_FREEBIND = 0x4e + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISOFS_SUPER_MAGIC = 0x9660 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + JFFS2_SUPER_MAGIC = 0x72b6 + KEXEC_ARCH_386 = 0x30000 + KEXEC_ARCH_68K = 0x40000 + KEXEC_ARCH_AARCH64 = 0xb70000 + KEXEC_ARCH_ARM = 0x280000 + KEXEC_ARCH_DEFAULT = 0x0 + KEXEC_ARCH_IA_64 = 0x320000 + KEXEC_ARCH_MASK = 0xffff0000 + KEXEC_ARCH_MIPS = 0x80000 + KEXEC_ARCH_MIPS_LE = 0xa0000 + KEXEC_ARCH_PPC = 0x140000 + KEXEC_ARCH_PPC64 = 0x150000 + KEXEC_ARCH_S390 = 0x160000 + KEXEC_ARCH_SH = 0x2a0000 + KEXEC_ARCH_X86_64 = 0x3e0000 + KEXEC_FILE_NO_INITRAMFS = 0x4 + KEXEC_FILE_ON_CRASH = 0x2 + KEXEC_FILE_UNLOAD = 0x1 + KEXEC_ON_CRASH = 0x1 + KEXEC_PRESERVE_CONTEXT = 0x2 + KEXEC_SEGMENT_MAX = 0x10 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_NEGATE = 0xd + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_KEEPONFORK = 0x13 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MADV_WIPEONFORK = 0x12 + MAP_ANON = 0x800 + MAP_ANONYMOUS = 0x800 + MAP_DENYWRITE = 0x2000 + MAP_EXECUTABLE = 0x4000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_FIXED_NOREPLACE = 0x100000 + MAP_GROWSDOWN = 0x1000 + MAP_HUGETLB = 0x80000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x8000 + MAP_NONBLOCK = 0x20000 + MAP_NORESERVE = 0x400 + MAP_POPULATE = 0x10000 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x800 + MAP_SHARED = 0x1 + MAP_SHARED_VALIDATE = 0x3 + MAP_STACK = 0x40000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MFD_ALLOW_SEALING = 0x2 + MFD_CLOEXEC = 0x1 + MFD_HUGETLB = 0x4 + MFD_HUGE_16GB = -0x78000000 + MFD_HUGE_16MB = 0x60000000 + MFD_HUGE_1GB = 0x78000000 + MFD_HUGE_1MB = 0x50000000 + MFD_HUGE_256MB = 0x70000000 + MFD_HUGE_2GB = 0x7c000000 + MFD_HUGE_2MB = 0x54000000 + MFD_HUGE_32MB = 0x64000000 + MFD_HUGE_512KB = 0x4c000000 + MFD_HUGE_512MB = 0x74000000 + MFD_HUGE_64KB = 0x40000000 + MFD_HUGE_8MB = 0x5c000000 + MFD_HUGE_MASK = 0x3f + MFD_HUGE_SHIFT = 0x1a + MINIX2_SUPER_MAGIC = 0x2468 + MINIX2_SUPER_MAGIC2 = 0x2478 + MINIX3_SUPER_MAGIC = 0x4d5a + MINIX_SUPER_MAGIC = 0x137f + MINIX_SUPER_MAGIC2 = 0x138f + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSDOS_SUPER_MAGIC = 0x4d44 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MSG_ZEROCOPY = 0x4000000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + MTD_INODE_FS_MAGIC = 0x11307854 + NAME_MAX = 0xff + NCP_SUPER_MAGIC = 0x564c + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NETNSA_MAX = 0x3 + NETNSA_NSID_NOT_ASSIGNED = -0x1 + NFNETLINK_V0 = 0x0 + NFNLGRP_ACCT_QUOTA = 0x8 + NFNLGRP_CONNTRACK_DESTROY = 0x3 + NFNLGRP_CONNTRACK_EXP_DESTROY = 0x6 + NFNLGRP_CONNTRACK_EXP_NEW = 0x4 + NFNLGRP_CONNTRACK_EXP_UPDATE = 0x5 + NFNLGRP_CONNTRACK_NEW = 0x1 + NFNLGRP_CONNTRACK_UPDATE = 0x2 + NFNLGRP_MAX = 0x9 + NFNLGRP_NFTABLES = 0x7 + NFNLGRP_NFTRACE = 0x9 + NFNLGRP_NONE = 0x0 + NFNL_BATCH_MAX = 0x1 + NFNL_MSG_BATCH_BEGIN = 0x10 + NFNL_MSG_BATCH_END = 0x11 + NFNL_NFA_NEST = 0x8000 + NFNL_SUBSYS_ACCT = 0x7 + NFNL_SUBSYS_COUNT = 0xc + NFNL_SUBSYS_CTHELPER = 0x9 + NFNL_SUBSYS_CTNETLINK = 0x1 + NFNL_SUBSYS_CTNETLINK_EXP = 0x2 + NFNL_SUBSYS_CTNETLINK_TIMEOUT = 0x8 + NFNL_SUBSYS_IPSET = 0x6 + NFNL_SUBSYS_NFTABLES = 0xa + NFNL_SUBSYS_NFT_COMPAT = 0xb + NFNL_SUBSYS_NONE = 0x0 + NFNL_SUBSYS_OSF = 0x5 + NFNL_SUBSYS_QUEUE = 0x3 + NFNL_SUBSYS_ULOG = 0x4 + NFS_SUPER_MAGIC = 0x6969 + NILFS_SUPER_MAGIC = 0x3434 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_NONREC = 0x100 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + NSFS_MAGIC = 0x6e736673 + OCFS2_SUPER_MAGIC = 0x7461636f + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPENPROM_SUPER_MAGIC = 0x9fa1 + OPOST = 0x1 + OVERLAYFS_SUPER_MAGIC = 0x794c7630 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x1000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x100 + O_DIRECT = 0x8000 + O_DIRECTORY = 0x10000 + O_DSYNC = 0x10 + O_EXCL = 0x400 + O_FSYNC = 0x4010 + O_LARGEFILE = 0x2000 + O_NDELAY = 0x80 + O_NOATIME = 0x40000 + O_NOCTTY = 0x800 + O_NOFOLLOW = 0x20000 + O_NONBLOCK = 0x80 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x4010 + O_SYNC = 0x4010 + O_TMPFILE = 0x410000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x20002401 + PERF_EVENT_IOC_ENABLE = 0x20002400 + PERF_EVENT_IOC_ID = 0x40042407 + PERF_EVENT_IOC_MODIFY_ATTRIBUTES = 0x8004240b + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x80042409 + PERF_EVENT_IOC_PERIOD = 0x80082404 + PERF_EVENT_IOC_QUERY_BPF = 0xc004240a + PERF_EVENT_IOC_REFRESH = 0x20002402 + PERF_EVENT_IOC_RESET = 0x20002403 + PERF_EVENT_IOC_SET_BPF = 0x80042408 + PERF_EVENT_IOC_SET_FILTER = 0x80042406 + PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 + PIPEFS_MAGIC = 0x50495045 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROC_SUPER_MAGIC = 0x9fa0 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_SPECULATION_CTRL = 0x34 + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_SPECULATION_CTRL = 0x35 + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_SPEC_DISABLE = 0x4 + PR_SPEC_ENABLE = 0x2 + PR_SPEC_FORCE_DISABLE = 0x8 + PR_SPEC_NOT_AFFECTED = 0x0 + PR_SPEC_PRCTL = 0x1 + PR_SPEC_STORE_BYPASS = 0x0 + PR_SVE_GET_VL = 0x33 + PR_SVE_SET_VL = 0x32 + PR_SVE_SET_VL_ONEXEC = 0x40000 + PR_SVE_VL_INHERIT = 0x20000 + PR_SVE_VL_LEN_MASK = 0xffff + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PSTOREFS_MAGIC = 0x6165676c + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETFPREGS = 0xe + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_THREAD_AREA = 0x19 + PTRACE_GET_THREAD_AREA_3264 = 0xc4 + PTRACE_GET_WATCH_REGS = 0xd0 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_OLDSETOPTIONS = 0x15 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKDATA_3264 = 0xc1 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKTEXT_3264 = 0xc0 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKEDATA_3264 = 0xc3 + PTRACE_POKETEXT = 0x4 + PTRACE_POKETEXT_3264 = 0xc2 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SECCOMP_GET_METADATA = 0x420d + PTRACE_SEIZE = 0x4206 + PTRACE_SETFPREGS = 0xf + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SET_THREAD_AREA = 0x1a + PTRACE_SET_WATCH_REGS = 0xd1 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_TRACEME = 0x0 + QNX4_SUPER_MAGIC = 0x2f + QNX6_SUPER_MAGIC = 0x68191122 + RAMFS_MAGIC = 0x858458f6 + RDTGROUP_SUPER_MAGIC = 0x7655821 + REISERFS_SUPER_MAGIC = 0x52654973 + RENAME_EXCHANGE = 0x2 + RENAME_NOREPLACE = 0x1 + RENAME_WHITEOUT = 0x4 + RLIMIT_AS = 0x6 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x9 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x5 + RLIMIT_NPROC = 0x8 + RLIMIT_RSS = 0x7 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FASTOPEN_NO_COOKIE = 0x11 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x11 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1d + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTC_AF = 0x20 + RTC_AIE_OFF = 0x20007002 + RTC_AIE_ON = 0x20007001 + RTC_ALM_READ = 0x40247008 + RTC_ALM_SET = 0x80247007 + RTC_EPOCH_READ = 0x4004700d + RTC_EPOCH_SET = 0x8004700e + RTC_IRQF = 0x80 + RTC_IRQP_READ = 0x4004700b + RTC_IRQP_SET = 0x8004700c + RTC_MAX_FREQ = 0x2000 + RTC_PF = 0x40 + RTC_PIE_OFF = 0x20007006 + RTC_PIE_ON = 0x20007005 + RTC_PLL_GET = 0x401c7011 + RTC_PLL_SET = 0x801c7012 + RTC_RD_TIME = 0x40247009 + RTC_SET_TIME = 0x8024700a + RTC_UF = 0x10 + RTC_UIE_OFF = 0x20007004 + RTC_UIE_ON = 0x20007003 + RTC_VL_CLR = 0x20007014 + RTC_VL_READ = 0x40047013 + RTC_WIE_OFF = 0x20007010 + RTC_WIE_ON = 0x2000700f + RTC_WKALM_RD = 0x40287010 + RTC_WKALM_SET = 0x8028700f + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELCHAIN = 0x65 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETCHAIN = 0x66 + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x67 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWCHAIN = 0x64 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x16 + RTM_NR_MSGTYPES = 0x58 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BGP = 0xba + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_EIGRP = 0xc0 + RTPROT_GATED = 0x8 + RTPROT_ISIS = 0xbb + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_OSPF = 0xbc + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_RIP = 0xbd + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_TXTIME = 0x3d + SCM_WIFI_STATUS = 0x29 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SECURITYFS_MAGIC = 0x73636673 + SELINUX_MAGIC = 0xf97cff8c + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x40047307 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x40047309 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x467f + SIOCOUTQ = 0x7472 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x80047308 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SMACK_MAGIC = 0x43415d53 + SMART_AUTOSAVE = 0xd2 + SMART_AUTO_OFFLINE = 0xdb + SMART_DISABLE = 0xd9 + SMART_ENABLE = 0xd8 + SMART_HCYL_PASS = 0xc2 + SMART_IMMEDIATE_OFFLINE = 0xd4 + SMART_LCYL_PASS = 0x4f + SMART_READ_LOG_SECTOR = 0xd5 + SMART_READ_THRESHOLDS = 0xd1 + SMART_READ_VALUES = 0xd0 + SMART_SAVE = 0xd3 + SMART_STATUS = 0xda + SMART_WRITE_LOG_SECTOR = 0xd6 + SMART_WRITE_THRESHOLDS = 0xd7 + SMB_SUPER_MAGIC = 0x517b + SOCKFS_MAGIC = 0x534f434b + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x1 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x80 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x2 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0xffff + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_TLS = 0x11a + SOL_X25 = 0x106 + SOL_XDP = 0x11b + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1009 + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x20 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x1029 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0x100 + SO_PASSCRED = 0x11 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x12 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1e + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x1028 + SO_RCVBUF = 0x1002 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x1001 + SO_SNDBUFFORCE = 0x1f + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_STYLE = 0x1008 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TXTIME = 0x3d + SO_TYPE = 0x1008 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SO_ZEROCOPY = 0x3c + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + SQUASHFS_MAGIC = 0x73717368 + STACK_END_MAGIC = 0x57ac6e9d + STATX_ALL = 0xfff + STATX_ATIME = 0x20 + STATX_ATTR_APPEND = 0x20 + STATX_ATTR_AUTOMOUNT = 0x1000 + STATX_ATTR_COMPRESSED = 0x4 + STATX_ATTR_ENCRYPTED = 0x800 + STATX_ATTR_IMMUTABLE = 0x10 + STATX_ATTR_NODUMP = 0x40 + STATX_BASIC_STATS = 0x7ff + STATX_BLOCKS = 0x400 + STATX_BTIME = 0x800 + STATX_CTIME = 0x80 + STATX_GID = 0x10 + STATX_INO = 0x100 + STATX_MODE = 0x2 + STATX_MTIME = 0x40 + STATX_NLINK = 0x4 + STATX_SIZE = 0x200 + STATX_TYPE = 0x1 + STATX_UID = 0x8 + STATX__RESERVED = 0x80000000 + SYNC_FILE_RANGE_WAIT_AFTER = 0x4 + SYNC_FILE_RANGE_WAIT_BEFORE = 0x1 + SYNC_FILE_RANGE_WRITE = 0x2 + SYSFS_MAGIC = 0x62656572 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x8 + TCFLSH = 0x5407 + TCGETA = 0x5401 + TCGETS = 0x540d + TCGETS2 = 0x4030542a + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_FASTOPEN_KEY = 0x21 + TCP_FASTOPEN_NO_COOKIE = 0x22 + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_EXT = 0x20 + TCP_MD5SIG_FLAG_PREFIX = 0x1 + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_ULP = 0x1f + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x5410 + TCSBRK = 0x5405 + TCSBRKP = 0x5486 + TCSETA = 0x5402 + TCSETAF = 0x5404 + TCSETAW = 0x5403 + TCSETS = 0x540e + TCSETS2 = 0x8030542b + TCSETSF = 0x5410 + TCSETSF2 = 0x8030542d + TCSETSW = 0x540f + TCSETSW2 = 0x8030542c + TCXONC = 0x5406 + TIOCCBRK = 0x5428 + TIOCCONS = 0x80047478 + TIOCEXCL = 0x740d + TIOCGDEV = 0x40045432 + TIOCGETD = 0x7400 + TIOCGETP = 0x7408 + TIOCGEXCL = 0x40045440 + TIOCGICOUNT = 0x5492 + TIOCGLCKTRMIOS = 0x548b + TIOCGLTC = 0x7474 + TIOCGPGRP = 0x40047477 + TIOCGPKT = 0x40045438 + TIOCGPTLCK = 0x40045439 + TIOCGPTN = 0x40045430 + TIOCGPTPEER = 0x20005441 + TIOCGRS485 = 0x4020542e + TIOCGSERIAL = 0x5484 + TIOCGSID = 0x7416 + TIOCGSOFTCAR = 0x5481 + TIOCGWINSZ = 0x40087468 + TIOCINQ = 0x467f + TIOCLINUX = 0x5483 + TIOCMBIC = 0x741c + TIOCMBIS = 0x741b + TIOCMGET = 0x741d + TIOCMIWAIT = 0x5491 + TIOCMSET = 0x741a + TIOCM_CAR = 0x100 + TIOCM_CD = 0x100 + TIOCM_CTS = 0x40 + TIOCM_DSR = 0x400 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x200 + TIOCM_RNG = 0x200 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x20 + TIOCM_ST = 0x10 + TIOCNOTTY = 0x5471 + TIOCNXCL = 0x740e + TIOCOUTQ = 0x7472 + TIOCPKT = 0x5470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x5480 + TIOCSERCONFIG = 0x5488 + TIOCSERGETLSR = 0x548e + TIOCSERGETMULTI = 0x548f + TIOCSERGSTRUCT = 0x548d + TIOCSERGWILD = 0x5489 + TIOCSERSETMULTI = 0x5490 + TIOCSERSWILD = 0x548a + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x7401 + TIOCSETN = 0x740a + TIOCSETP = 0x7409 + TIOCSIG = 0x80045436 + TIOCSLCKTRMIOS = 0x548c + TIOCSLTC = 0x7475 + TIOCSPGRP = 0x80047476 + TIOCSPTLCK = 0x80045431 + TIOCSRS485 = 0xc020542f + TIOCSSERIAL = 0x5485 + TIOCSSOFTCAR = 0x5482 + TIOCSTI = 0x5472 + TIOCSWINSZ = 0x80087467 + TIOCVHANGUP = 0x5437 + TMPFS_MAGIC = 0x1021994 + TOSTOP = 0x8000 + TPACKET_ALIGNMENT = 0x10 + TPACKET_HDRLEN = 0x34 + TP_STATUS_AVAILABLE = 0x0 + TP_STATUS_BLK_TMO = 0x20 + TP_STATUS_COPY = 0x2 + TP_STATUS_CSUMNOTREADY = 0x8 + TP_STATUS_CSUM_VALID = 0x80 + TP_STATUS_KERNEL = 0x0 + TP_STATUS_LOSING = 0x4 + TP_STATUS_SENDING = 0x2 + TP_STATUS_SEND_REQUEST = 0x1 + TP_STATUS_TS_RAW_HARDWARE = -0x80000000 + TP_STATUS_TS_SOFTWARE = 0x20000000 + TP_STATUS_TS_SYS_HARDWARE = 0x40000000 + TP_STATUS_USER = 0x1 + TP_STATUS_VLAN_TPID_VALID = 0x40 + TP_STATUS_VLAN_VALID = 0x10 + TP_STATUS_WRONG_FORMAT = 0x4 + TRACEFS_MAGIC = 0x74726163 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x800854d5 + TUNDETACHFILTER = 0x800854d6 + TUNGETFEATURES = 0x400454cf + TUNGETFILTER = 0x400854db + TUNGETIFF = 0x400454d2 + TUNGETSNDBUF = 0x400454d3 + TUNGETVNETBE = 0x400454df + TUNGETVNETHDRSZ = 0x400454d7 + TUNGETVNETLE = 0x400454dd + TUNSETDEBUG = 0x800454c9 + TUNSETFILTEREBPF = 0x400454e1 + TUNSETGROUP = 0x800454ce + TUNSETIFF = 0x800454ca + TUNSETIFINDEX = 0x800454da + TUNSETLINK = 0x800454cd + TUNSETNOCSUM = 0x800454c8 + TUNSETOFFLOAD = 0x800454d0 + TUNSETOWNER = 0x800454cc + TUNSETPERSIST = 0x800454cb + TUNSETQUEUE = 0x800454d9 + TUNSETSNDBUF = 0x800454d4 + TUNSETSTEERINGEBPF = 0x400454e0 + TUNSETTXFILTER = 0x800454d1 + TUNSETVNETBE = 0x800454de + TUNSETVNETHDRSZ = 0x800454d8 + TUNSETVNETLE = 0x800454dc + UBI_IOCATT = 0x80186f40 + UBI_IOCDET = 0x80046f41 + UBI_IOCEBCH = 0x80044f02 + UBI_IOCEBER = 0x80044f01 + UBI_IOCEBISMAP = 0x40044f05 + UBI_IOCEBMAP = 0x80084f03 + UBI_IOCEBUNMAP = 0x80044f04 + UBI_IOCMKVOL = 0x80986f00 + UBI_IOCRMVOL = 0x80046f01 + UBI_IOCRNVOL = 0x91106f03 + UBI_IOCRSVOL = 0x800c6f02 + UBI_IOCSETVOLPROP = 0x80104f06 + UBI_IOCVOLCRBLK = 0x80804f07 + UBI_IOCVOLRMBLK = 0x20004f08 + UBI_IOCVOLUP = 0x80084f00 + UDF_SUPER_MAGIC = 0x15013346 + UMOUNT_NOFOLLOW = 0x8 + USBDEVICE_SUPER_MAGIC = 0x9fa2 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + V9FS_MAGIC = 0x1021997 + VDISCARD = 0xd + VEOF = 0x10 + VEOL = 0x11 + VEOL2 = 0x6 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x4 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VSWTCH = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x40045702 + WDIOC_GETPRETIMEOUT = 0x40045709 + WDIOC_GETSTATUS = 0x40045701 + WDIOC_GETSUPPORT = 0x40285700 + WDIOC_GETTEMP = 0x40045703 + WDIOC_GETTIMELEFT = 0x4004570a + WDIOC_GETTIMEOUT = 0x40045707 + WDIOC_KEEPALIVE = 0x40045705 + WDIOC_SETOPTIONS = 0x40045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WIN_ACKMEDIACHANGE = 0xdb + WIN_CHECKPOWERMODE1 = 0xe5 + WIN_CHECKPOWERMODE2 = 0x98 + WIN_DEVICE_RESET = 0x8 + WIN_DIAGNOSE = 0x90 + WIN_DOORLOCK = 0xde + WIN_DOORUNLOCK = 0xdf + WIN_DOWNLOAD_MICROCODE = 0x92 + WIN_FLUSH_CACHE = 0xe7 + WIN_FLUSH_CACHE_EXT = 0xea + WIN_FORMAT = 0x50 + WIN_GETMEDIASTATUS = 0xda + WIN_IDENTIFY = 0xec + WIN_IDENTIFY_DMA = 0xee + WIN_IDLEIMMEDIATE = 0xe1 + WIN_INIT = 0x60 + WIN_MEDIAEJECT = 0xed + WIN_MULTREAD = 0xc4 + WIN_MULTREAD_EXT = 0x29 + WIN_MULTWRITE = 0xc5 + WIN_MULTWRITE_EXT = 0x39 + WIN_NOP = 0x0 + WIN_PACKETCMD = 0xa0 + WIN_PIDENTIFY = 0xa1 + WIN_POSTBOOT = 0xdc + WIN_PREBOOT = 0xdd + WIN_QUEUED_SERVICE = 0xa2 + WIN_READ = 0x20 + WIN_READDMA = 0xc8 + WIN_READDMA_EXT = 0x25 + WIN_READDMA_ONCE = 0xc9 + WIN_READDMA_QUEUED = 0xc7 + WIN_READDMA_QUEUED_EXT = 0x26 + WIN_READ_BUFFER = 0xe4 + WIN_READ_EXT = 0x24 + WIN_READ_LONG = 0x22 + WIN_READ_LONG_ONCE = 0x23 + WIN_READ_NATIVE_MAX = 0xf8 + WIN_READ_NATIVE_MAX_EXT = 0x27 + WIN_READ_ONCE = 0x21 + WIN_RECAL = 0x10 + WIN_RESTORE = 0x10 + WIN_SECURITY_DISABLE = 0xf6 + WIN_SECURITY_ERASE_PREPARE = 0xf3 + WIN_SECURITY_ERASE_UNIT = 0xf4 + WIN_SECURITY_FREEZE_LOCK = 0xf5 + WIN_SECURITY_SET_PASS = 0xf1 + WIN_SECURITY_UNLOCK = 0xf2 + WIN_SEEK = 0x70 + WIN_SETFEATURES = 0xef + WIN_SETIDLE1 = 0xe3 + WIN_SETIDLE2 = 0x97 + WIN_SETMULT = 0xc6 + WIN_SET_MAX = 0xf9 + WIN_SET_MAX_EXT = 0x37 + WIN_SLEEPNOW1 = 0xe6 + WIN_SLEEPNOW2 = 0x99 + WIN_SMART = 0xb0 + WIN_SPECIFY = 0x91 + WIN_SRST = 0x8 + WIN_STANDBY = 0xe2 + WIN_STANDBY2 = 0x96 + WIN_STANDBYNOW1 = 0xe0 + WIN_STANDBYNOW2 = 0x94 + WIN_VERIFY = 0x40 + WIN_VERIFY_EXT = 0x42 + WIN_VERIFY_ONCE = 0x41 + WIN_WRITE = 0x30 + WIN_WRITEDMA = 0xca + WIN_WRITEDMA_EXT = 0x35 + WIN_WRITEDMA_ONCE = 0xcb + WIN_WRITEDMA_QUEUED = 0xcc + WIN_WRITEDMA_QUEUED_EXT = 0x36 + WIN_WRITE_BUFFER = 0xe8 + WIN_WRITE_EXT = 0x34 + WIN_WRITE_LONG = 0x32 + WIN_WRITE_LONG_ONCE = 0x33 + WIN_WRITE_ONCE = 0x31 + WIN_WRITE_SAME = 0xe9 + WIN_WRITE_VERIFY = 0x3c + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x20 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XDP_COPY = 0x2 + XDP_FLAGS_DRV_MODE = 0x4 + XDP_FLAGS_HW_MODE = 0x8 + XDP_FLAGS_MASK = 0xf + XDP_FLAGS_MODES = 0xe + XDP_FLAGS_SKB_MODE = 0x2 + XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 + XDP_MMAP_OFFSETS = 0x1 + XDP_PGOFF_RX_RING = 0x0 + XDP_PGOFF_TX_RING = 0x80000000 + XDP_RX_RING = 0x2 + XDP_SHARED_UMEM = 0x1 + XDP_STATISTICS = 0x7 + XDP_TX_RING = 0x3 + XDP_UMEM_COMPLETION_RING = 0x6 + XDP_UMEM_FILL_RING = 0x5 + XDP_UMEM_PGOFF_COMPLETION_RING = 0x180000000 + XDP_UMEM_PGOFF_FILL_RING = 0x100000000 + XDP_UMEM_REG = 0x4 + XDP_ZEROCOPY = 0x4 + XENFS_SUPER_MAGIC = 0xabba1974 + XTABS = 0x1800 + ZSMALLOC_MAGIC = 0x58295829 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x7d) + EADDRNOTAVAIL = syscall.Errno(0x7e) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x7c) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x95) + EBADE = syscall.Errno(0x32) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x51) + EBADMSG = syscall.Errno(0x4d) + EBADR = syscall.Errno(0x33) + EBADRQC = syscall.Errno(0x36) + EBADSLT = syscall.Errno(0x37) + EBFONT = syscall.Errno(0x3b) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x9e) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x25) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x82) + ECONNREFUSED = syscall.Errno(0x92) + ECONNRESET = syscall.Errno(0x83) + EDEADLK = syscall.Errno(0x2d) + EDEADLOCK = syscall.Errno(0x38) + EDESTADDRREQ = syscall.Errno(0x60) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x49) + EDQUOT = syscall.Errno(0x46d) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x93) + EHOSTUNREACH = syscall.Errno(0x94) + EHWPOISON = syscall.Errno(0xa8) + EIDRM = syscall.Errno(0x24) + EILSEQ = syscall.Errno(0x58) + EINIT = syscall.Errno(0x8d) + EINPROGRESS = syscall.Errno(0x96) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x85) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x8b) + EKEYEXPIRED = syscall.Errno(0xa2) + EKEYREJECTED = syscall.Errno(0xa4) + EKEYREVOKED = syscall.Errno(0xa3) + EL2HLT = syscall.Errno(0x2c) + EL2NSYNC = syscall.Errno(0x26) + EL3HLT = syscall.Errno(0x27) + EL3RST = syscall.Errno(0x28) + ELIBACC = syscall.Errno(0x53) + ELIBBAD = syscall.Errno(0x54) + ELIBEXEC = syscall.Errno(0x57) + ELIBMAX = syscall.Errno(0x56) + ELIBSCN = syscall.Errno(0x55) + ELNRNG = syscall.Errno(0x29) + ELOOP = syscall.Errno(0x5a) + EMEDIUMTYPE = syscall.Errno(0xa0) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x61) + EMULTIHOP = syscall.Errno(0x4a) + ENAMETOOLONG = syscall.Errno(0x4e) + ENAVAIL = syscall.Errno(0x8a) + ENETDOWN = syscall.Errno(0x7f) + ENETRESET = syscall.Errno(0x81) + ENETUNREACH = syscall.Errno(0x80) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x35) + ENOBUFS = syscall.Errno(0x84) + ENOCSI = syscall.Errno(0x2b) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0xa1) + ENOLCK = syscall.Errno(0x2e) + ENOLINK = syscall.Errno(0x43) + ENOMEDIUM = syscall.Errno(0x9f) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x23) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x63) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x59) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x86) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x5d) + ENOTNAM = syscall.Errno(0x89) + ENOTRECOVERABLE = syscall.Errno(0xa6) + ENOTSOCK = syscall.Errno(0x5f) + ENOTSUP = syscall.Errno(0x7a) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x50) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x7a) + EOVERFLOW = syscall.Errno(0x4f) + EOWNERDEAD = syscall.Errno(0xa5) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x7b) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x78) + EPROTOTYPE = syscall.Errno(0x62) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x52) + EREMDEV = syscall.Errno(0x8e) + EREMOTE = syscall.Errno(0x42) + EREMOTEIO = syscall.Errno(0x8c) + ERESTART = syscall.Errno(0x5b) + ERFKILL = syscall.Errno(0xa7) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x8f) + ESOCKTNOSUPPORT = syscall.Errno(0x79) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x97) + ESTRPIPE = syscall.Errno(0x5c) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x91) + ETOOMANYREFS = syscall.Errno(0x90) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x87) + EUNATCH = syscall.Errno(0x2a) + EUSERS = syscall.Errno(0x5e) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x34) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x12) + SIGCLD = syscall.Signal(0x12) + SIGCONT = syscall.Signal(0x19) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x16) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x16) + SIGPROF = syscall.Signal(0x1d) + SIGPWR = syscall.Signal(0x13) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x17) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x18) + SIGTTIN = syscall.Signal(0x1a) + SIGTTOU = syscall.Signal(0x1b) + SIGURG = syscall.Signal(0x15) + SIGUSR1 = syscall.Signal(0x10) + SIGUSR2 = syscall.Signal(0x11) + SIGVTALRM = syscall.Signal(0x1c) + SIGWINCH = syscall.Signal(0x14) + SIGXCPU = syscall.Signal(0x1e) + SIGXFSZ = syscall.Signal(0x1f) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "no such device or address"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EAGAIN", "resource temporarily unavailable"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device or resource busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "invalid cross-device link"}, + {19, "ENODEV", "no such device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "numerical result out of range"}, + {35, "ENOMSG", "no message of desired type"}, + {36, "EIDRM", "identifier removed"}, + {37, "ECHRNG", "channel number out of range"}, + {38, "EL2NSYNC", "level 2 not synchronized"}, + {39, "EL3HLT", "level 3 halted"}, + {40, "EL3RST", "level 3 reset"}, + {41, "ELNRNG", "link number out of range"}, + {42, "EUNATCH", "protocol driver not attached"}, + {43, "ENOCSI", "no CSI structure available"}, + {44, "EL2HLT", "level 2 halted"}, + {45, "EDEADLK", "resource deadlock avoided"}, + {46, "ENOLCK", "no locks available"}, + {50, "EBADE", "invalid exchange"}, + {51, "EBADR", "invalid request descriptor"}, + {52, "EXFULL", "exchange full"}, + {53, "ENOANO", "no anode"}, + {54, "EBADRQC", "invalid request code"}, + {55, "EBADSLT", "invalid slot"}, + {56, "EDEADLOCK", "file locking deadlock error"}, + {59, "EBFONT", "bad font file format"}, + {60, "ENOSTR", "device not a stream"}, + {61, "ENODATA", "no data available"}, + {62, "ETIME", "timer expired"}, + {63, "ENOSR", "out of streams resources"}, + {64, "ENONET", "machine is not on the network"}, + {65, "ENOPKG", "package not installed"}, + {66, "EREMOTE", "object is remote"}, + {67, "ENOLINK", "link has been severed"}, + {68, "EADV", "advertise error"}, + {69, "ESRMNT", "srmount error"}, + {70, "ECOMM", "communication error on send"}, + {71, "EPROTO", "protocol error"}, + {73, "EDOTDOT", "RFS specific error"}, + {74, "EMULTIHOP", "multihop attempted"}, + {77, "EBADMSG", "bad message"}, + {78, "ENAMETOOLONG", "file name too long"}, + {79, "EOVERFLOW", "value too large for defined data type"}, + {80, "ENOTUNIQ", "name not unique on network"}, + {81, "EBADFD", "file descriptor in bad state"}, + {82, "EREMCHG", "remote address changed"}, + {83, "ELIBACC", "can not access a needed shared library"}, + {84, "ELIBBAD", "accessing a corrupted shared library"}, + {85, "ELIBSCN", ".lib section in a.out corrupted"}, + {86, "ELIBMAX", "attempting to link in too many shared libraries"}, + {87, "ELIBEXEC", "cannot exec a shared library directly"}, + {88, "EILSEQ", "invalid or incomplete multibyte or wide character"}, + {89, "ENOSYS", "function not implemented"}, + {90, "ELOOP", "too many levels of symbolic links"}, + {91, "ERESTART", "interrupted system call should be restarted"}, + {92, "ESTRPIPE", "streams pipe error"}, + {93, "ENOTEMPTY", "directory not empty"}, + {94, "EUSERS", "too many users"}, + {95, "ENOTSOCK", "socket operation on non-socket"}, + {96, "EDESTADDRREQ", "destination address required"}, + {97, "EMSGSIZE", "message too long"}, + {98, "EPROTOTYPE", "protocol wrong type for socket"}, + {99, "ENOPROTOOPT", "protocol not available"}, + {120, "EPROTONOSUPPORT", "protocol not supported"}, + {121, "ESOCKTNOSUPPORT", "socket type not supported"}, + {122, "ENOTSUP", "operation not supported"}, + {123, "EPFNOSUPPORT", "protocol family not supported"}, + {124, "EAFNOSUPPORT", "address family not supported by protocol"}, + {125, "EADDRINUSE", "address already in use"}, + {126, "EADDRNOTAVAIL", "cannot assign requested address"}, + {127, "ENETDOWN", "network is down"}, + {128, "ENETUNREACH", "network is unreachable"}, + {129, "ENETRESET", "network dropped connection on reset"}, + {130, "ECONNABORTED", "software caused connection abort"}, + {131, "ECONNRESET", "connection reset by peer"}, + {132, "ENOBUFS", "no buffer space available"}, + {133, "EISCONN", "transport endpoint is already connected"}, + {134, "ENOTCONN", "transport endpoint is not connected"}, + {135, "EUCLEAN", "structure needs cleaning"}, + {137, "ENOTNAM", "not a XENIX named type file"}, + {138, "ENAVAIL", "no XENIX semaphores available"}, + {139, "EISNAM", "is a named type file"}, + {140, "EREMOTEIO", "remote I/O error"}, + {141, "EINIT", "unknown error 141"}, + {142, "EREMDEV", "unknown error 142"}, + {143, "ESHUTDOWN", "cannot send after transport endpoint shutdown"}, + {144, "ETOOMANYREFS", "too many references: cannot splice"}, + {145, "ETIMEDOUT", "connection timed out"}, + {146, "ECONNREFUSED", "connection refused"}, + {147, "EHOSTDOWN", "host is down"}, + {148, "EHOSTUNREACH", "no route to host"}, + {149, "EALREADY", "operation already in progress"}, + {150, "EINPROGRESS", "operation now in progress"}, + {151, "ESTALE", "stale file handle"}, + {158, "ECANCELED", "operation canceled"}, + {159, "ENOMEDIUM", "no medium found"}, + {160, "EMEDIUMTYPE", "wrong medium type"}, + {161, "ENOKEY", "required key not available"}, + {162, "EKEYEXPIRED", "key has expired"}, + {163, "EKEYREVOKED", "key has been revoked"}, + {164, "EKEYREJECTED", "key was rejected by service"}, + {165, "EOWNERDEAD", "owner died"}, + {166, "ENOTRECOVERABLE", "state not recoverable"}, + {167, "ERFKILL", "operation not possible due to RF-kill"}, + {168, "EHWPOISON", "memory page has hardware error"}, + {1133, "EDQUOT", "disk quota exceeded"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/breakpoint trap"}, + {6, "SIGABRT", "aborted"}, + {7, "SIGEMT", "EMT trap"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGBUS", "bus error"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGSYS", "bad system call"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGUSR1", "user defined signal 1"}, + {17, "SIGUSR2", "user defined signal 2"}, + {18, "SIGCHLD", "child exited"}, + {19, "SIGPWR", "power failure"}, + {20, "SIGWINCH", "window changed"}, + {21, "SIGURG", "urgent I/O condition"}, + {22, "SIGIO", "I/O possible"}, + {23, "SIGSTOP", "stopped (signal)"}, + {24, "SIGTSTP", "stopped"}, + {25, "SIGCONT", "continued"}, + {26, "SIGTTIN", "stopped (tty input)"}, + {27, "SIGTTOU", "stopped (tty output)"}, + {28, "SIGVTALRM", "virtual timer expired"}, + {29, "SIGPROF", "profiling timer expired"}, + {30, "SIGXCPU", "CPU time limit exceeded"}, + {31, "SIGXFSZ", "file size limit exceeded"}, +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go new file mode 100644 index 00000000..355f749b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go @@ -0,0 +1,2709 @@ +// mkerrors.sh -Wall -Werror -static -I/tmp/include +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build mips64,linux + +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go + +package unix + +import "syscall" + +const ( + AAFS_MAGIC = 0x5a3c69f0 + ADFS_SUPER_MAGIC = 0xadf5 + AFFS_SUPER_MAGIC = 0xadff + AFS_FS_MAGIC = 0x6b414653 + AFS_SUPER_MAGIC = 0x5346414f + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2c + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + AF_XDP = 0x2c + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ANON_INODE_FS_MAGIC = 0x9041934 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_RAWIP = 0x207 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + AUTOFS_SUPER_MAGIC = 0x187 + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BALLOON_KVM_MAGIC = 0x13661366 + BDEVFS_MAGIC = 0x62646576 + BINFMTFS_MAGIC = 0x42494e4d + BLKBSZGET = 0x40081270 + BLKBSZSET = 0x80081271 + BLKFLSBUF = 0x20001261 + BLKFRAGET = 0x20001265 + BLKFRASET = 0x20001264 + BLKGETSIZE = 0x20001260 + BLKGETSIZE64 = 0x40081272 + BLKPBSZGET = 0x2000127b + BLKRAGET = 0x20001263 + BLKRASET = 0x20001262 + BLKROGET = 0x2000125e + BLKROSET = 0x2000125d + BLKRRPART = 0x2000125f + BLKSECTGET = 0x20001267 + BLKSECTSET = 0x20001266 + BLKSSZGET = 0x20001268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_FS_MAGIC = 0xcafe4a11 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + BTRFS_SUPER_MAGIC = 0x9123683e + BTRFS_TEST_MAGIC = 0x73727279 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CGROUP2_SUPER_MAGIC = 0x63677270 + CGROUP_SUPER_MAGIC = 0x27e0eb + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CODA_SUPER_MAGIC = 0x73757245 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRAMFS_MAGIC = 0x28cd3d45 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DAXFS_MAGIC = 0x64646178 + DEBUGFS_MAGIC = 0x64626720 + DEVPTS_SUPER_MAGIC = 0x1cd1 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + ECRYPTFS_SUPER_MAGIC = 0xf15f + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x80 + EFD_SEMAPHORE = 0x1 + EFIVARFS_MAGIC = 0xde5e81e4 + EFS_SUPER_MAGIC = 0x414a53 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_ERSPAN = 0x88be + ETH_P_ERSPAN2 = 0x22eb + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IFE = 0xed3e + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MAP = 0xf9 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_NSH = 0x894f + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PREAUTH = 0x88c7 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXABYTE_ENABLE_NEST = 0xf0 + EXT2_SUPER_MAGIC = 0xef53 + EXT3_SUPER_MAGIC = 0xef53 + EXT4_SUPER_MAGIC = 0xef53 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + F2FS_SUPER_MAGIC = 0xf2f52010 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x2000 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_ENCRYPTION_MODE_SPECK128_256_CTS = 0x8 + FS_ENCRYPTION_MODE_SPECK128_256_XTS = 0x7 + FS_IOC_GET_ENCRYPTION_POLICY = 0x800c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x80106614 + FS_IOC_SET_ENCRYPTION_POLICY = 0x400c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0x3 + FUTEXFS_SUPER_MAGIC = 0xbad1dea + F_ADD_SEALS = 0x409 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0xe + F_GETLK64 = 0xe + F_GETOWN = 0x17 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_GET_FILE_RW_HINT = 0x40d + F_GET_RW_HINT = 0x40b + F_GET_SEALS = 0x40a + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SEAL_GROW = 0x4 + F_SEAL_SEAL = 0x1 + F_SEAL_SHRINK = 0x2 + F_SEAL_WRITE = 0x8 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x6 + F_SETLK64 = 0x6 + F_SETLKW = 0x7 + F_SETLKW64 = 0x7 + F_SETOWN = 0x18 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SET_FILE_RW_HINT = 0x40e + F_SET_RW_HINT = 0x40c + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HDIO_DRIVE_CMD = 0x31f + HDIO_DRIVE_CMD_AEB = 0x31e + HDIO_DRIVE_CMD_HDR_SIZE = 0x4 + HDIO_DRIVE_HOB_HDR_SIZE = 0x8 + HDIO_DRIVE_RESET = 0x31c + HDIO_DRIVE_TASK = 0x31e + HDIO_DRIVE_TASKFILE = 0x31d + HDIO_DRIVE_TASK_HDR_SIZE = 0x8 + HDIO_GETGEO = 0x301 + HDIO_GET_32BIT = 0x309 + HDIO_GET_ACOUSTIC = 0x30f + HDIO_GET_ADDRESS = 0x310 + HDIO_GET_BUSSTATE = 0x31a + HDIO_GET_DMA = 0x30b + HDIO_GET_IDENTITY = 0x30d + HDIO_GET_KEEPSETTINGS = 0x308 + HDIO_GET_MULTCOUNT = 0x304 + HDIO_GET_NICE = 0x30c + HDIO_GET_NOWERR = 0x30a + HDIO_GET_QDMA = 0x305 + HDIO_GET_UNMASKINTR = 0x302 + HDIO_GET_WCACHE = 0x30e + HDIO_OBSOLETE_IDENTITY = 0x307 + HDIO_SCAN_HWIF = 0x328 + HDIO_SET_32BIT = 0x324 + HDIO_SET_ACOUSTIC = 0x32c + HDIO_SET_ADDRESS = 0x32f + HDIO_SET_BUSSTATE = 0x32d + HDIO_SET_DMA = 0x326 + HDIO_SET_KEEPSETTINGS = 0x323 + HDIO_SET_MULTCOUNT = 0x321 + HDIO_SET_NICE = 0x329 + HDIO_SET_NOWERR = 0x325 + HDIO_SET_PIO_MODE = 0x327 + HDIO_SET_QDMA = 0x32e + HDIO_SET_UNMASKINTR = 0x322 + HDIO_SET_WCACHE = 0x32b + HDIO_SET_XFER = 0x306 + HDIO_TRISTATE_HWIF = 0x31b + HDIO_UNREGISTER_HWIF = 0x32a + HOSTFS_SUPER_MAGIC = 0xc0ffee + HPFS_SUPER_MAGIC = 0xf995e849 + HUGETLBFS_MAGIC = 0x958458f6 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x100 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x9 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NAPI = 0x10 + IFF_NAPI_FRAGS = 0x20 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x80 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_FREEBIND = 0x4e + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISOFS_SUPER_MAGIC = 0x9660 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + JFFS2_SUPER_MAGIC = 0x72b6 + KEXEC_ARCH_386 = 0x30000 + KEXEC_ARCH_68K = 0x40000 + KEXEC_ARCH_AARCH64 = 0xb70000 + KEXEC_ARCH_ARM = 0x280000 + KEXEC_ARCH_DEFAULT = 0x0 + KEXEC_ARCH_IA_64 = 0x320000 + KEXEC_ARCH_MASK = 0xffff0000 + KEXEC_ARCH_MIPS = 0x80000 + KEXEC_ARCH_MIPS_LE = 0xa0000 + KEXEC_ARCH_PPC = 0x140000 + KEXEC_ARCH_PPC64 = 0x150000 + KEXEC_ARCH_S390 = 0x160000 + KEXEC_ARCH_SH = 0x2a0000 + KEXEC_ARCH_X86_64 = 0x3e0000 + KEXEC_FILE_NO_INITRAMFS = 0x4 + KEXEC_FILE_ON_CRASH = 0x2 + KEXEC_FILE_UNLOAD = 0x1 + KEXEC_ON_CRASH = 0x1 + KEXEC_PRESERVE_CONTEXT = 0x2 + KEXEC_SEGMENT_MAX = 0x10 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_NEGATE = 0xd + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_KEEPONFORK = 0x13 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MADV_WIPEONFORK = 0x12 + MAP_ANON = 0x800 + MAP_ANONYMOUS = 0x800 + MAP_DENYWRITE = 0x2000 + MAP_EXECUTABLE = 0x4000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_FIXED_NOREPLACE = 0x100000 + MAP_GROWSDOWN = 0x1000 + MAP_HUGETLB = 0x80000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x8000 + MAP_NONBLOCK = 0x20000 + MAP_NORESERVE = 0x400 + MAP_POPULATE = 0x10000 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x800 + MAP_SHARED = 0x1 + MAP_SHARED_VALIDATE = 0x3 + MAP_STACK = 0x40000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MFD_ALLOW_SEALING = 0x2 + MFD_CLOEXEC = 0x1 + MFD_HUGETLB = 0x4 + MFD_HUGE_16GB = -0x78000000 + MFD_HUGE_16MB = 0x60000000 + MFD_HUGE_1GB = 0x78000000 + MFD_HUGE_1MB = 0x50000000 + MFD_HUGE_256MB = 0x70000000 + MFD_HUGE_2GB = 0x7c000000 + MFD_HUGE_2MB = 0x54000000 + MFD_HUGE_32MB = 0x64000000 + MFD_HUGE_512KB = 0x4c000000 + MFD_HUGE_512MB = 0x74000000 + MFD_HUGE_64KB = 0x40000000 + MFD_HUGE_8MB = 0x5c000000 + MFD_HUGE_MASK = 0x3f + MFD_HUGE_SHIFT = 0x1a + MINIX2_SUPER_MAGIC = 0x2468 + MINIX2_SUPER_MAGIC2 = 0x2478 + MINIX3_SUPER_MAGIC = 0x4d5a + MINIX_SUPER_MAGIC = 0x137f + MINIX_SUPER_MAGIC2 = 0x138f + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSDOS_SUPER_MAGIC = 0x4d44 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MSG_ZEROCOPY = 0x4000000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + MTD_INODE_FS_MAGIC = 0x11307854 + NAME_MAX = 0xff + NCP_SUPER_MAGIC = 0x564c + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NETNSA_MAX = 0x3 + NETNSA_NSID_NOT_ASSIGNED = -0x1 + NFNETLINK_V0 = 0x0 + NFNLGRP_ACCT_QUOTA = 0x8 + NFNLGRP_CONNTRACK_DESTROY = 0x3 + NFNLGRP_CONNTRACK_EXP_DESTROY = 0x6 + NFNLGRP_CONNTRACK_EXP_NEW = 0x4 + NFNLGRP_CONNTRACK_EXP_UPDATE = 0x5 + NFNLGRP_CONNTRACK_NEW = 0x1 + NFNLGRP_CONNTRACK_UPDATE = 0x2 + NFNLGRP_MAX = 0x9 + NFNLGRP_NFTABLES = 0x7 + NFNLGRP_NFTRACE = 0x9 + NFNLGRP_NONE = 0x0 + NFNL_BATCH_MAX = 0x1 + NFNL_MSG_BATCH_BEGIN = 0x10 + NFNL_MSG_BATCH_END = 0x11 + NFNL_NFA_NEST = 0x8000 + NFNL_SUBSYS_ACCT = 0x7 + NFNL_SUBSYS_COUNT = 0xc + NFNL_SUBSYS_CTHELPER = 0x9 + NFNL_SUBSYS_CTNETLINK = 0x1 + NFNL_SUBSYS_CTNETLINK_EXP = 0x2 + NFNL_SUBSYS_CTNETLINK_TIMEOUT = 0x8 + NFNL_SUBSYS_IPSET = 0x6 + NFNL_SUBSYS_NFTABLES = 0xa + NFNL_SUBSYS_NFT_COMPAT = 0xb + NFNL_SUBSYS_NONE = 0x0 + NFNL_SUBSYS_OSF = 0x5 + NFNL_SUBSYS_QUEUE = 0x3 + NFNL_SUBSYS_ULOG = 0x4 + NFS_SUPER_MAGIC = 0x6969 + NILFS_SUPER_MAGIC = 0x3434 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_NONREC = 0x100 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + NSFS_MAGIC = 0x6e736673 + OCFS2_SUPER_MAGIC = 0x7461636f + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPENPROM_SUPER_MAGIC = 0x9fa1 + OPOST = 0x1 + OVERLAYFS_SUPER_MAGIC = 0x794c7630 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x1000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x100 + O_DIRECT = 0x8000 + O_DIRECTORY = 0x10000 + O_DSYNC = 0x10 + O_EXCL = 0x400 + O_FSYNC = 0x4010 + O_LARGEFILE = 0x0 + O_NDELAY = 0x80 + O_NOATIME = 0x40000 + O_NOCTTY = 0x800 + O_NOFOLLOW = 0x20000 + O_NONBLOCK = 0x80 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x4010 + O_SYNC = 0x4010 + O_TMPFILE = 0x410000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x20002401 + PERF_EVENT_IOC_ENABLE = 0x20002400 + PERF_EVENT_IOC_ID = 0x40082407 + PERF_EVENT_IOC_MODIFY_ATTRIBUTES = 0x8008240b + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x80042409 + PERF_EVENT_IOC_PERIOD = 0x80082404 + PERF_EVENT_IOC_QUERY_BPF = 0xc008240a + PERF_EVENT_IOC_REFRESH = 0x20002402 + PERF_EVENT_IOC_RESET = 0x20002403 + PERF_EVENT_IOC_SET_BPF = 0x80042408 + PERF_EVENT_IOC_SET_FILTER = 0x80082406 + PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 + PIPEFS_MAGIC = 0x50495045 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROC_SUPER_MAGIC = 0x9fa0 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_SPECULATION_CTRL = 0x34 + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffffffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_SPECULATION_CTRL = 0x35 + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_SPEC_DISABLE = 0x4 + PR_SPEC_ENABLE = 0x2 + PR_SPEC_FORCE_DISABLE = 0x8 + PR_SPEC_NOT_AFFECTED = 0x0 + PR_SPEC_PRCTL = 0x1 + PR_SPEC_STORE_BYPASS = 0x0 + PR_SVE_GET_VL = 0x33 + PR_SVE_SET_VL = 0x32 + PR_SVE_SET_VL_ONEXEC = 0x40000 + PR_SVE_VL_INHERIT = 0x20000 + PR_SVE_VL_LEN_MASK = 0xffff + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PSTOREFS_MAGIC = 0x6165676c + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETFPREGS = 0xe + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_THREAD_AREA = 0x19 + PTRACE_GET_THREAD_AREA_3264 = 0xc4 + PTRACE_GET_WATCH_REGS = 0xd0 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_OLDSETOPTIONS = 0x15 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKDATA_3264 = 0xc1 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKTEXT_3264 = 0xc0 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKEDATA_3264 = 0xc3 + PTRACE_POKETEXT = 0x4 + PTRACE_POKETEXT_3264 = 0xc2 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SECCOMP_GET_METADATA = 0x420d + PTRACE_SEIZE = 0x4206 + PTRACE_SETFPREGS = 0xf + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SET_THREAD_AREA = 0x1a + PTRACE_SET_WATCH_REGS = 0xd1 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_TRACEME = 0x0 + QNX4_SUPER_MAGIC = 0x2f + QNX6_SUPER_MAGIC = 0x68191122 + RAMFS_MAGIC = 0x858458f6 + RDTGROUP_SUPER_MAGIC = 0x7655821 + REISERFS_SUPER_MAGIC = 0x52654973 + RENAME_EXCHANGE = 0x2 + RENAME_NOREPLACE = 0x1 + RENAME_WHITEOUT = 0x4 + RLIMIT_AS = 0x6 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x9 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x5 + RLIMIT_NPROC = 0x8 + RLIMIT_RSS = 0x7 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FASTOPEN_NO_COOKIE = 0x11 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x11 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1d + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTC_AF = 0x20 + RTC_AIE_OFF = 0x20007002 + RTC_AIE_ON = 0x20007001 + RTC_ALM_READ = 0x40247008 + RTC_ALM_SET = 0x80247007 + RTC_EPOCH_READ = 0x4008700d + RTC_EPOCH_SET = 0x8008700e + RTC_IRQF = 0x80 + RTC_IRQP_READ = 0x4008700b + RTC_IRQP_SET = 0x8008700c + RTC_MAX_FREQ = 0x2000 + RTC_PF = 0x40 + RTC_PIE_OFF = 0x20007006 + RTC_PIE_ON = 0x20007005 + RTC_PLL_GET = 0x40207011 + RTC_PLL_SET = 0x80207012 + RTC_RD_TIME = 0x40247009 + RTC_SET_TIME = 0x8024700a + RTC_UF = 0x10 + RTC_UIE_OFF = 0x20007004 + RTC_UIE_ON = 0x20007003 + RTC_VL_CLR = 0x20007014 + RTC_VL_READ = 0x40047013 + RTC_WIE_OFF = 0x20007010 + RTC_WIE_ON = 0x2000700f + RTC_WKALM_RD = 0x40287010 + RTC_WKALM_SET = 0x8028700f + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELCHAIN = 0x65 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETCHAIN = 0x66 + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x67 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWCHAIN = 0x64 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x16 + RTM_NR_MSGTYPES = 0x58 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BGP = 0xba + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_EIGRP = 0xc0 + RTPROT_GATED = 0x8 + RTPROT_ISIS = 0xbb + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_OSPF = 0xbc + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_RIP = 0xbd + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_TXTIME = 0x3d + SCM_WIFI_STATUS = 0x29 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SECURITYFS_MAGIC = 0x73636673 + SELINUX_MAGIC = 0xf97cff8c + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x40047307 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x40047309 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x467f + SIOCOUTQ = 0x7472 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x80047308 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SMACK_MAGIC = 0x43415d53 + SMART_AUTOSAVE = 0xd2 + SMART_AUTO_OFFLINE = 0xdb + SMART_DISABLE = 0xd9 + SMART_ENABLE = 0xd8 + SMART_HCYL_PASS = 0xc2 + SMART_IMMEDIATE_OFFLINE = 0xd4 + SMART_LCYL_PASS = 0x4f + SMART_READ_LOG_SECTOR = 0xd5 + SMART_READ_THRESHOLDS = 0xd1 + SMART_READ_VALUES = 0xd0 + SMART_SAVE = 0xd3 + SMART_STATUS = 0xda + SMART_WRITE_LOG_SECTOR = 0xd6 + SMART_WRITE_THRESHOLDS = 0xd7 + SMB_SUPER_MAGIC = 0x517b + SOCKFS_MAGIC = 0x534f434b + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x1 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x80 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x2 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0xffff + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_TLS = 0x11a + SOL_X25 = 0x106 + SOL_XDP = 0x11b + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1009 + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x20 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x1029 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0x100 + SO_PASSCRED = 0x11 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x12 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1e + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x1028 + SO_RCVBUF = 0x1002 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x1001 + SO_SNDBUFFORCE = 0x1f + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_STYLE = 0x1008 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TXTIME = 0x3d + SO_TYPE = 0x1008 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SO_ZEROCOPY = 0x3c + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + SQUASHFS_MAGIC = 0x73717368 + STACK_END_MAGIC = 0x57ac6e9d + STATX_ALL = 0xfff + STATX_ATIME = 0x20 + STATX_ATTR_APPEND = 0x20 + STATX_ATTR_AUTOMOUNT = 0x1000 + STATX_ATTR_COMPRESSED = 0x4 + STATX_ATTR_ENCRYPTED = 0x800 + STATX_ATTR_IMMUTABLE = 0x10 + STATX_ATTR_NODUMP = 0x40 + STATX_BASIC_STATS = 0x7ff + STATX_BLOCKS = 0x400 + STATX_BTIME = 0x800 + STATX_CTIME = 0x80 + STATX_GID = 0x10 + STATX_INO = 0x100 + STATX_MODE = 0x2 + STATX_MTIME = 0x40 + STATX_NLINK = 0x4 + STATX_SIZE = 0x200 + STATX_TYPE = 0x1 + STATX_UID = 0x8 + STATX__RESERVED = 0x80000000 + SYNC_FILE_RANGE_WAIT_AFTER = 0x4 + SYNC_FILE_RANGE_WAIT_BEFORE = 0x1 + SYNC_FILE_RANGE_WRITE = 0x2 + SYSFS_MAGIC = 0x62656572 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x8 + TCFLSH = 0x5407 + TCGETA = 0x5401 + TCGETS = 0x540d + TCGETS2 = 0x4030542a + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_FASTOPEN_KEY = 0x21 + TCP_FASTOPEN_NO_COOKIE = 0x22 + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_EXT = 0x20 + TCP_MD5SIG_FLAG_PREFIX = 0x1 + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_ULP = 0x1f + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x5410 + TCSBRK = 0x5405 + TCSBRKP = 0x5486 + TCSETA = 0x5402 + TCSETAF = 0x5404 + TCSETAW = 0x5403 + TCSETS = 0x540e + TCSETS2 = 0x8030542b + TCSETSF = 0x5410 + TCSETSF2 = 0x8030542d + TCSETSW = 0x540f + TCSETSW2 = 0x8030542c + TCXONC = 0x5406 + TIOCCBRK = 0x5428 + TIOCCONS = 0x80047478 + TIOCEXCL = 0x740d + TIOCGDEV = 0x40045432 + TIOCGETD = 0x7400 + TIOCGETP = 0x7408 + TIOCGEXCL = 0x40045440 + TIOCGICOUNT = 0x5492 + TIOCGLCKTRMIOS = 0x548b + TIOCGLTC = 0x7474 + TIOCGPGRP = 0x40047477 + TIOCGPKT = 0x40045438 + TIOCGPTLCK = 0x40045439 + TIOCGPTN = 0x40045430 + TIOCGPTPEER = 0x20005441 + TIOCGRS485 = 0x4020542e + TIOCGSERIAL = 0x5484 + TIOCGSID = 0x7416 + TIOCGSOFTCAR = 0x5481 + TIOCGWINSZ = 0x40087468 + TIOCINQ = 0x467f + TIOCLINUX = 0x5483 + TIOCMBIC = 0x741c + TIOCMBIS = 0x741b + TIOCMGET = 0x741d + TIOCMIWAIT = 0x5491 + TIOCMSET = 0x741a + TIOCM_CAR = 0x100 + TIOCM_CD = 0x100 + TIOCM_CTS = 0x40 + TIOCM_DSR = 0x400 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x200 + TIOCM_RNG = 0x200 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x20 + TIOCM_ST = 0x10 + TIOCNOTTY = 0x5471 + TIOCNXCL = 0x740e + TIOCOUTQ = 0x7472 + TIOCPKT = 0x5470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x5480 + TIOCSERCONFIG = 0x5488 + TIOCSERGETLSR = 0x548e + TIOCSERGETMULTI = 0x548f + TIOCSERGSTRUCT = 0x548d + TIOCSERGWILD = 0x5489 + TIOCSERSETMULTI = 0x5490 + TIOCSERSWILD = 0x548a + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x7401 + TIOCSETN = 0x740a + TIOCSETP = 0x7409 + TIOCSIG = 0x80045436 + TIOCSLCKTRMIOS = 0x548c + TIOCSLTC = 0x7475 + TIOCSPGRP = 0x80047476 + TIOCSPTLCK = 0x80045431 + TIOCSRS485 = 0xc020542f + TIOCSSERIAL = 0x5485 + TIOCSSOFTCAR = 0x5482 + TIOCSTI = 0x5472 + TIOCSWINSZ = 0x80087467 + TIOCVHANGUP = 0x5437 + TMPFS_MAGIC = 0x1021994 + TOSTOP = 0x8000 + TPACKET_ALIGNMENT = 0x10 + TPACKET_HDRLEN = 0x34 + TP_STATUS_AVAILABLE = 0x0 + TP_STATUS_BLK_TMO = 0x20 + TP_STATUS_COPY = 0x2 + TP_STATUS_CSUMNOTREADY = 0x8 + TP_STATUS_CSUM_VALID = 0x80 + TP_STATUS_KERNEL = 0x0 + TP_STATUS_LOSING = 0x4 + TP_STATUS_SENDING = 0x2 + TP_STATUS_SEND_REQUEST = 0x1 + TP_STATUS_TS_RAW_HARDWARE = -0x80000000 + TP_STATUS_TS_SOFTWARE = 0x20000000 + TP_STATUS_TS_SYS_HARDWARE = 0x40000000 + TP_STATUS_USER = 0x1 + TP_STATUS_VLAN_TPID_VALID = 0x40 + TP_STATUS_VLAN_VALID = 0x10 + TP_STATUS_WRONG_FORMAT = 0x4 + TRACEFS_MAGIC = 0x74726163 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x801054d5 + TUNDETACHFILTER = 0x801054d6 + TUNGETFEATURES = 0x400454cf + TUNGETFILTER = 0x401054db + TUNGETIFF = 0x400454d2 + TUNGETSNDBUF = 0x400454d3 + TUNGETVNETBE = 0x400454df + TUNGETVNETHDRSZ = 0x400454d7 + TUNGETVNETLE = 0x400454dd + TUNSETDEBUG = 0x800454c9 + TUNSETFILTEREBPF = 0x400454e1 + TUNSETGROUP = 0x800454ce + TUNSETIFF = 0x800454ca + TUNSETIFINDEX = 0x800454da + TUNSETLINK = 0x800454cd + TUNSETNOCSUM = 0x800454c8 + TUNSETOFFLOAD = 0x800454d0 + TUNSETOWNER = 0x800454cc + TUNSETPERSIST = 0x800454cb + TUNSETQUEUE = 0x800454d9 + TUNSETSNDBUF = 0x800454d4 + TUNSETSTEERINGEBPF = 0x400454e0 + TUNSETTXFILTER = 0x800454d1 + TUNSETVNETBE = 0x800454de + TUNSETVNETHDRSZ = 0x800454d8 + TUNSETVNETLE = 0x800454dc + UBI_IOCATT = 0x80186f40 + UBI_IOCDET = 0x80046f41 + UBI_IOCEBCH = 0x80044f02 + UBI_IOCEBER = 0x80044f01 + UBI_IOCEBISMAP = 0x40044f05 + UBI_IOCEBMAP = 0x80084f03 + UBI_IOCEBUNMAP = 0x80044f04 + UBI_IOCMKVOL = 0x80986f00 + UBI_IOCRMVOL = 0x80046f01 + UBI_IOCRNVOL = 0x91106f03 + UBI_IOCRSVOL = 0x800c6f02 + UBI_IOCSETVOLPROP = 0x80104f06 + UBI_IOCVOLCRBLK = 0x80804f07 + UBI_IOCVOLRMBLK = 0x20004f08 + UBI_IOCVOLUP = 0x80084f00 + UDF_SUPER_MAGIC = 0x15013346 + UMOUNT_NOFOLLOW = 0x8 + USBDEVICE_SUPER_MAGIC = 0x9fa2 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + V9FS_MAGIC = 0x1021997 + VDISCARD = 0xd + VEOF = 0x10 + VEOL = 0x11 + VEOL2 = 0x6 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x4 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VSWTCH = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x40045702 + WDIOC_GETPRETIMEOUT = 0x40045709 + WDIOC_GETSTATUS = 0x40045701 + WDIOC_GETSUPPORT = 0x40285700 + WDIOC_GETTEMP = 0x40045703 + WDIOC_GETTIMELEFT = 0x4004570a + WDIOC_GETTIMEOUT = 0x40045707 + WDIOC_KEEPALIVE = 0x40045705 + WDIOC_SETOPTIONS = 0x40045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WIN_ACKMEDIACHANGE = 0xdb + WIN_CHECKPOWERMODE1 = 0xe5 + WIN_CHECKPOWERMODE2 = 0x98 + WIN_DEVICE_RESET = 0x8 + WIN_DIAGNOSE = 0x90 + WIN_DOORLOCK = 0xde + WIN_DOORUNLOCK = 0xdf + WIN_DOWNLOAD_MICROCODE = 0x92 + WIN_FLUSH_CACHE = 0xe7 + WIN_FLUSH_CACHE_EXT = 0xea + WIN_FORMAT = 0x50 + WIN_GETMEDIASTATUS = 0xda + WIN_IDENTIFY = 0xec + WIN_IDENTIFY_DMA = 0xee + WIN_IDLEIMMEDIATE = 0xe1 + WIN_INIT = 0x60 + WIN_MEDIAEJECT = 0xed + WIN_MULTREAD = 0xc4 + WIN_MULTREAD_EXT = 0x29 + WIN_MULTWRITE = 0xc5 + WIN_MULTWRITE_EXT = 0x39 + WIN_NOP = 0x0 + WIN_PACKETCMD = 0xa0 + WIN_PIDENTIFY = 0xa1 + WIN_POSTBOOT = 0xdc + WIN_PREBOOT = 0xdd + WIN_QUEUED_SERVICE = 0xa2 + WIN_READ = 0x20 + WIN_READDMA = 0xc8 + WIN_READDMA_EXT = 0x25 + WIN_READDMA_ONCE = 0xc9 + WIN_READDMA_QUEUED = 0xc7 + WIN_READDMA_QUEUED_EXT = 0x26 + WIN_READ_BUFFER = 0xe4 + WIN_READ_EXT = 0x24 + WIN_READ_LONG = 0x22 + WIN_READ_LONG_ONCE = 0x23 + WIN_READ_NATIVE_MAX = 0xf8 + WIN_READ_NATIVE_MAX_EXT = 0x27 + WIN_READ_ONCE = 0x21 + WIN_RECAL = 0x10 + WIN_RESTORE = 0x10 + WIN_SECURITY_DISABLE = 0xf6 + WIN_SECURITY_ERASE_PREPARE = 0xf3 + WIN_SECURITY_ERASE_UNIT = 0xf4 + WIN_SECURITY_FREEZE_LOCK = 0xf5 + WIN_SECURITY_SET_PASS = 0xf1 + WIN_SECURITY_UNLOCK = 0xf2 + WIN_SEEK = 0x70 + WIN_SETFEATURES = 0xef + WIN_SETIDLE1 = 0xe3 + WIN_SETIDLE2 = 0x97 + WIN_SETMULT = 0xc6 + WIN_SET_MAX = 0xf9 + WIN_SET_MAX_EXT = 0x37 + WIN_SLEEPNOW1 = 0xe6 + WIN_SLEEPNOW2 = 0x99 + WIN_SMART = 0xb0 + WIN_SPECIFY = 0x91 + WIN_SRST = 0x8 + WIN_STANDBY = 0xe2 + WIN_STANDBY2 = 0x96 + WIN_STANDBYNOW1 = 0xe0 + WIN_STANDBYNOW2 = 0x94 + WIN_VERIFY = 0x40 + WIN_VERIFY_EXT = 0x42 + WIN_VERIFY_ONCE = 0x41 + WIN_WRITE = 0x30 + WIN_WRITEDMA = 0xca + WIN_WRITEDMA_EXT = 0x35 + WIN_WRITEDMA_ONCE = 0xcb + WIN_WRITEDMA_QUEUED = 0xcc + WIN_WRITEDMA_QUEUED_EXT = 0x36 + WIN_WRITE_BUFFER = 0xe8 + WIN_WRITE_EXT = 0x34 + WIN_WRITE_LONG = 0x32 + WIN_WRITE_LONG_ONCE = 0x33 + WIN_WRITE_ONCE = 0x31 + WIN_WRITE_SAME = 0xe9 + WIN_WRITE_VERIFY = 0x3c + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x40 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XDP_COPY = 0x2 + XDP_FLAGS_DRV_MODE = 0x4 + XDP_FLAGS_HW_MODE = 0x8 + XDP_FLAGS_MASK = 0xf + XDP_FLAGS_MODES = 0xe + XDP_FLAGS_SKB_MODE = 0x2 + XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 + XDP_MMAP_OFFSETS = 0x1 + XDP_PGOFF_RX_RING = 0x0 + XDP_PGOFF_TX_RING = 0x80000000 + XDP_RX_RING = 0x2 + XDP_SHARED_UMEM = 0x1 + XDP_STATISTICS = 0x7 + XDP_TX_RING = 0x3 + XDP_UMEM_COMPLETION_RING = 0x6 + XDP_UMEM_FILL_RING = 0x5 + XDP_UMEM_PGOFF_COMPLETION_RING = 0x180000000 + XDP_UMEM_PGOFF_FILL_RING = 0x100000000 + XDP_UMEM_REG = 0x4 + XDP_ZEROCOPY = 0x4 + XENFS_SUPER_MAGIC = 0xabba1974 + XTABS = 0x1800 + ZSMALLOC_MAGIC = 0x58295829 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x7d) + EADDRNOTAVAIL = syscall.Errno(0x7e) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x7c) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x95) + EBADE = syscall.Errno(0x32) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x51) + EBADMSG = syscall.Errno(0x4d) + EBADR = syscall.Errno(0x33) + EBADRQC = syscall.Errno(0x36) + EBADSLT = syscall.Errno(0x37) + EBFONT = syscall.Errno(0x3b) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x9e) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x25) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x82) + ECONNREFUSED = syscall.Errno(0x92) + ECONNRESET = syscall.Errno(0x83) + EDEADLK = syscall.Errno(0x2d) + EDEADLOCK = syscall.Errno(0x38) + EDESTADDRREQ = syscall.Errno(0x60) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x49) + EDQUOT = syscall.Errno(0x46d) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x93) + EHOSTUNREACH = syscall.Errno(0x94) + EHWPOISON = syscall.Errno(0xa8) + EIDRM = syscall.Errno(0x24) + EILSEQ = syscall.Errno(0x58) + EINIT = syscall.Errno(0x8d) + EINPROGRESS = syscall.Errno(0x96) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x85) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x8b) + EKEYEXPIRED = syscall.Errno(0xa2) + EKEYREJECTED = syscall.Errno(0xa4) + EKEYREVOKED = syscall.Errno(0xa3) + EL2HLT = syscall.Errno(0x2c) + EL2NSYNC = syscall.Errno(0x26) + EL3HLT = syscall.Errno(0x27) + EL3RST = syscall.Errno(0x28) + ELIBACC = syscall.Errno(0x53) + ELIBBAD = syscall.Errno(0x54) + ELIBEXEC = syscall.Errno(0x57) + ELIBMAX = syscall.Errno(0x56) + ELIBSCN = syscall.Errno(0x55) + ELNRNG = syscall.Errno(0x29) + ELOOP = syscall.Errno(0x5a) + EMEDIUMTYPE = syscall.Errno(0xa0) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x61) + EMULTIHOP = syscall.Errno(0x4a) + ENAMETOOLONG = syscall.Errno(0x4e) + ENAVAIL = syscall.Errno(0x8a) + ENETDOWN = syscall.Errno(0x7f) + ENETRESET = syscall.Errno(0x81) + ENETUNREACH = syscall.Errno(0x80) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x35) + ENOBUFS = syscall.Errno(0x84) + ENOCSI = syscall.Errno(0x2b) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0xa1) + ENOLCK = syscall.Errno(0x2e) + ENOLINK = syscall.Errno(0x43) + ENOMEDIUM = syscall.Errno(0x9f) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x23) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x63) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x59) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x86) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x5d) + ENOTNAM = syscall.Errno(0x89) + ENOTRECOVERABLE = syscall.Errno(0xa6) + ENOTSOCK = syscall.Errno(0x5f) + ENOTSUP = syscall.Errno(0x7a) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x50) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x7a) + EOVERFLOW = syscall.Errno(0x4f) + EOWNERDEAD = syscall.Errno(0xa5) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x7b) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x78) + EPROTOTYPE = syscall.Errno(0x62) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x52) + EREMDEV = syscall.Errno(0x8e) + EREMOTE = syscall.Errno(0x42) + EREMOTEIO = syscall.Errno(0x8c) + ERESTART = syscall.Errno(0x5b) + ERFKILL = syscall.Errno(0xa7) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x8f) + ESOCKTNOSUPPORT = syscall.Errno(0x79) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x97) + ESTRPIPE = syscall.Errno(0x5c) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x91) + ETOOMANYREFS = syscall.Errno(0x90) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x87) + EUNATCH = syscall.Errno(0x2a) + EUSERS = syscall.Errno(0x5e) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x34) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x12) + SIGCLD = syscall.Signal(0x12) + SIGCONT = syscall.Signal(0x19) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x16) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x16) + SIGPROF = syscall.Signal(0x1d) + SIGPWR = syscall.Signal(0x13) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x17) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x18) + SIGTTIN = syscall.Signal(0x1a) + SIGTTOU = syscall.Signal(0x1b) + SIGURG = syscall.Signal(0x15) + SIGUSR1 = syscall.Signal(0x10) + SIGUSR2 = syscall.Signal(0x11) + SIGVTALRM = syscall.Signal(0x1c) + SIGWINCH = syscall.Signal(0x14) + SIGXCPU = syscall.Signal(0x1e) + SIGXFSZ = syscall.Signal(0x1f) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "no such device or address"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EAGAIN", "resource temporarily unavailable"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device or resource busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "invalid cross-device link"}, + {19, "ENODEV", "no such device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "numerical result out of range"}, + {35, "ENOMSG", "no message of desired type"}, + {36, "EIDRM", "identifier removed"}, + {37, "ECHRNG", "channel number out of range"}, + {38, "EL2NSYNC", "level 2 not synchronized"}, + {39, "EL3HLT", "level 3 halted"}, + {40, "EL3RST", "level 3 reset"}, + {41, "ELNRNG", "link number out of range"}, + {42, "EUNATCH", "protocol driver not attached"}, + {43, "ENOCSI", "no CSI structure available"}, + {44, "EL2HLT", "level 2 halted"}, + {45, "EDEADLK", "resource deadlock avoided"}, + {46, "ENOLCK", "no locks available"}, + {50, "EBADE", "invalid exchange"}, + {51, "EBADR", "invalid request descriptor"}, + {52, "EXFULL", "exchange full"}, + {53, "ENOANO", "no anode"}, + {54, "EBADRQC", "invalid request code"}, + {55, "EBADSLT", "invalid slot"}, + {56, "EDEADLOCK", "file locking deadlock error"}, + {59, "EBFONT", "bad font file format"}, + {60, "ENOSTR", "device not a stream"}, + {61, "ENODATA", "no data available"}, + {62, "ETIME", "timer expired"}, + {63, "ENOSR", "out of streams resources"}, + {64, "ENONET", "machine is not on the network"}, + {65, "ENOPKG", "package not installed"}, + {66, "EREMOTE", "object is remote"}, + {67, "ENOLINK", "link has been severed"}, + {68, "EADV", "advertise error"}, + {69, "ESRMNT", "srmount error"}, + {70, "ECOMM", "communication error on send"}, + {71, "EPROTO", "protocol error"}, + {73, "EDOTDOT", "RFS specific error"}, + {74, "EMULTIHOP", "multihop attempted"}, + {77, "EBADMSG", "bad message"}, + {78, "ENAMETOOLONG", "file name too long"}, + {79, "EOVERFLOW", "value too large for defined data type"}, + {80, "ENOTUNIQ", "name not unique on network"}, + {81, "EBADFD", "file descriptor in bad state"}, + {82, "EREMCHG", "remote address changed"}, + {83, "ELIBACC", "can not access a needed shared library"}, + {84, "ELIBBAD", "accessing a corrupted shared library"}, + {85, "ELIBSCN", ".lib section in a.out corrupted"}, + {86, "ELIBMAX", "attempting to link in too many shared libraries"}, + {87, "ELIBEXEC", "cannot exec a shared library directly"}, + {88, "EILSEQ", "invalid or incomplete multibyte or wide character"}, + {89, "ENOSYS", "function not implemented"}, + {90, "ELOOP", "too many levels of symbolic links"}, + {91, "ERESTART", "interrupted system call should be restarted"}, + {92, "ESTRPIPE", "streams pipe error"}, + {93, "ENOTEMPTY", "directory not empty"}, + {94, "EUSERS", "too many users"}, + {95, "ENOTSOCK", "socket operation on non-socket"}, + {96, "EDESTADDRREQ", "destination address required"}, + {97, "EMSGSIZE", "message too long"}, + {98, "EPROTOTYPE", "protocol wrong type for socket"}, + {99, "ENOPROTOOPT", "protocol not available"}, + {120, "EPROTONOSUPPORT", "protocol not supported"}, + {121, "ESOCKTNOSUPPORT", "socket type not supported"}, + {122, "ENOTSUP", "operation not supported"}, + {123, "EPFNOSUPPORT", "protocol family not supported"}, + {124, "EAFNOSUPPORT", "address family not supported by protocol"}, + {125, "EADDRINUSE", "address already in use"}, + {126, "EADDRNOTAVAIL", "cannot assign requested address"}, + {127, "ENETDOWN", "network is down"}, + {128, "ENETUNREACH", "network is unreachable"}, + {129, "ENETRESET", "network dropped connection on reset"}, + {130, "ECONNABORTED", "software caused connection abort"}, + {131, "ECONNRESET", "connection reset by peer"}, + {132, "ENOBUFS", "no buffer space available"}, + {133, "EISCONN", "transport endpoint is already connected"}, + {134, "ENOTCONN", "transport endpoint is not connected"}, + {135, "EUCLEAN", "structure needs cleaning"}, + {137, "ENOTNAM", "not a XENIX named type file"}, + {138, "ENAVAIL", "no XENIX semaphores available"}, + {139, "EISNAM", "is a named type file"}, + {140, "EREMOTEIO", "remote I/O error"}, + {141, "EINIT", "unknown error 141"}, + {142, "EREMDEV", "unknown error 142"}, + {143, "ESHUTDOWN", "cannot send after transport endpoint shutdown"}, + {144, "ETOOMANYREFS", "too many references: cannot splice"}, + {145, "ETIMEDOUT", "connection timed out"}, + {146, "ECONNREFUSED", "connection refused"}, + {147, "EHOSTDOWN", "host is down"}, + {148, "EHOSTUNREACH", "no route to host"}, + {149, "EALREADY", "operation already in progress"}, + {150, "EINPROGRESS", "operation now in progress"}, + {151, "ESTALE", "stale file handle"}, + {158, "ECANCELED", "operation canceled"}, + {159, "ENOMEDIUM", "no medium found"}, + {160, "EMEDIUMTYPE", "wrong medium type"}, + {161, "ENOKEY", "required key not available"}, + {162, "EKEYEXPIRED", "key has expired"}, + {163, "EKEYREVOKED", "key has been revoked"}, + {164, "EKEYREJECTED", "key was rejected by service"}, + {165, "EOWNERDEAD", "owner died"}, + {166, "ENOTRECOVERABLE", "state not recoverable"}, + {167, "ERFKILL", "operation not possible due to RF-kill"}, + {168, "EHWPOISON", "memory page has hardware error"}, + {1133, "EDQUOT", "disk quota exceeded"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/breakpoint trap"}, + {6, "SIGABRT", "aborted"}, + {7, "SIGEMT", "EMT trap"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGBUS", "bus error"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGSYS", "bad system call"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGUSR1", "user defined signal 1"}, + {17, "SIGUSR2", "user defined signal 2"}, + {18, "SIGCHLD", "child exited"}, + {19, "SIGPWR", "power failure"}, + {20, "SIGWINCH", "window changed"}, + {21, "SIGURG", "urgent I/O condition"}, + {22, "SIGIO", "I/O possible"}, + {23, "SIGSTOP", "stopped (signal)"}, + {24, "SIGTSTP", "stopped"}, + {25, "SIGCONT", "continued"}, + {26, "SIGTTIN", "stopped (tty input)"}, + {27, "SIGTTOU", "stopped (tty output)"}, + {28, "SIGVTALRM", "virtual timer expired"}, + {29, "SIGPROF", "profiling timer expired"}, + {30, "SIGXCPU", "CPU time limit exceeded"}, + {31, "SIGXFSZ", "file size limit exceeded"}, +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go new file mode 100644 index 00000000..5218cf5a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go @@ -0,0 +1,2709 @@ +// mkerrors.sh -Wall -Werror -static -I/tmp/include +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build mips64le,linux + +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go + +package unix + +import "syscall" + +const ( + AAFS_MAGIC = 0x5a3c69f0 + ADFS_SUPER_MAGIC = 0xadf5 + AFFS_SUPER_MAGIC = 0xadff + AFS_FS_MAGIC = 0x6b414653 + AFS_SUPER_MAGIC = 0x5346414f + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2c + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + AF_XDP = 0x2c + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ANON_INODE_FS_MAGIC = 0x9041934 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_RAWIP = 0x207 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + AUTOFS_SUPER_MAGIC = 0x187 + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BALLOON_KVM_MAGIC = 0x13661366 + BDEVFS_MAGIC = 0x62646576 + BINFMTFS_MAGIC = 0x42494e4d + BLKBSZGET = 0x40081270 + BLKBSZSET = 0x80081271 + BLKFLSBUF = 0x20001261 + BLKFRAGET = 0x20001265 + BLKFRASET = 0x20001264 + BLKGETSIZE = 0x20001260 + BLKGETSIZE64 = 0x40081272 + BLKPBSZGET = 0x2000127b + BLKRAGET = 0x20001263 + BLKRASET = 0x20001262 + BLKROGET = 0x2000125e + BLKROSET = 0x2000125d + BLKRRPART = 0x2000125f + BLKSECTGET = 0x20001267 + BLKSECTSET = 0x20001266 + BLKSSZGET = 0x20001268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_FS_MAGIC = 0xcafe4a11 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + BTRFS_SUPER_MAGIC = 0x9123683e + BTRFS_TEST_MAGIC = 0x73727279 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CGROUP2_SUPER_MAGIC = 0x63677270 + CGROUP_SUPER_MAGIC = 0x27e0eb + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CODA_SUPER_MAGIC = 0x73757245 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRAMFS_MAGIC = 0x28cd3d45 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DAXFS_MAGIC = 0x64646178 + DEBUGFS_MAGIC = 0x64626720 + DEVPTS_SUPER_MAGIC = 0x1cd1 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + ECRYPTFS_SUPER_MAGIC = 0xf15f + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x80 + EFD_SEMAPHORE = 0x1 + EFIVARFS_MAGIC = 0xde5e81e4 + EFS_SUPER_MAGIC = 0x414a53 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_ERSPAN = 0x88be + ETH_P_ERSPAN2 = 0x22eb + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IFE = 0xed3e + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MAP = 0xf9 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_NSH = 0x894f + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PREAUTH = 0x88c7 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXABYTE_ENABLE_NEST = 0xf0 + EXT2_SUPER_MAGIC = 0xef53 + EXT3_SUPER_MAGIC = 0xef53 + EXT4_SUPER_MAGIC = 0xef53 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + F2FS_SUPER_MAGIC = 0xf2f52010 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x2000 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_ENCRYPTION_MODE_SPECK128_256_CTS = 0x8 + FS_ENCRYPTION_MODE_SPECK128_256_XTS = 0x7 + FS_IOC_GET_ENCRYPTION_POLICY = 0x800c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x80106614 + FS_IOC_SET_ENCRYPTION_POLICY = 0x400c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0x3 + FUTEXFS_SUPER_MAGIC = 0xbad1dea + F_ADD_SEALS = 0x409 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0xe + F_GETLK64 = 0xe + F_GETOWN = 0x17 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_GET_FILE_RW_HINT = 0x40d + F_GET_RW_HINT = 0x40b + F_GET_SEALS = 0x40a + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SEAL_GROW = 0x4 + F_SEAL_SEAL = 0x1 + F_SEAL_SHRINK = 0x2 + F_SEAL_WRITE = 0x8 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x6 + F_SETLK64 = 0x6 + F_SETLKW = 0x7 + F_SETLKW64 = 0x7 + F_SETOWN = 0x18 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SET_FILE_RW_HINT = 0x40e + F_SET_RW_HINT = 0x40c + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HDIO_DRIVE_CMD = 0x31f + HDIO_DRIVE_CMD_AEB = 0x31e + HDIO_DRIVE_CMD_HDR_SIZE = 0x4 + HDIO_DRIVE_HOB_HDR_SIZE = 0x8 + HDIO_DRIVE_RESET = 0x31c + HDIO_DRIVE_TASK = 0x31e + HDIO_DRIVE_TASKFILE = 0x31d + HDIO_DRIVE_TASK_HDR_SIZE = 0x8 + HDIO_GETGEO = 0x301 + HDIO_GET_32BIT = 0x309 + HDIO_GET_ACOUSTIC = 0x30f + HDIO_GET_ADDRESS = 0x310 + HDIO_GET_BUSSTATE = 0x31a + HDIO_GET_DMA = 0x30b + HDIO_GET_IDENTITY = 0x30d + HDIO_GET_KEEPSETTINGS = 0x308 + HDIO_GET_MULTCOUNT = 0x304 + HDIO_GET_NICE = 0x30c + HDIO_GET_NOWERR = 0x30a + HDIO_GET_QDMA = 0x305 + HDIO_GET_UNMASKINTR = 0x302 + HDIO_GET_WCACHE = 0x30e + HDIO_OBSOLETE_IDENTITY = 0x307 + HDIO_SCAN_HWIF = 0x328 + HDIO_SET_32BIT = 0x324 + HDIO_SET_ACOUSTIC = 0x32c + HDIO_SET_ADDRESS = 0x32f + HDIO_SET_BUSSTATE = 0x32d + HDIO_SET_DMA = 0x326 + HDIO_SET_KEEPSETTINGS = 0x323 + HDIO_SET_MULTCOUNT = 0x321 + HDIO_SET_NICE = 0x329 + HDIO_SET_NOWERR = 0x325 + HDIO_SET_PIO_MODE = 0x327 + HDIO_SET_QDMA = 0x32e + HDIO_SET_UNMASKINTR = 0x322 + HDIO_SET_WCACHE = 0x32b + HDIO_SET_XFER = 0x306 + HDIO_TRISTATE_HWIF = 0x31b + HDIO_UNREGISTER_HWIF = 0x32a + HOSTFS_SUPER_MAGIC = 0xc0ffee + HPFS_SUPER_MAGIC = 0xf995e849 + HUGETLBFS_MAGIC = 0x958458f6 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x100 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x9 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NAPI = 0x10 + IFF_NAPI_FRAGS = 0x20 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x80 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_FREEBIND = 0x4e + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISOFS_SUPER_MAGIC = 0x9660 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + JFFS2_SUPER_MAGIC = 0x72b6 + KEXEC_ARCH_386 = 0x30000 + KEXEC_ARCH_68K = 0x40000 + KEXEC_ARCH_AARCH64 = 0xb70000 + KEXEC_ARCH_ARM = 0x280000 + KEXEC_ARCH_DEFAULT = 0x0 + KEXEC_ARCH_IA_64 = 0x320000 + KEXEC_ARCH_MASK = 0xffff0000 + KEXEC_ARCH_MIPS = 0x80000 + KEXEC_ARCH_MIPS_LE = 0xa0000 + KEXEC_ARCH_PPC = 0x140000 + KEXEC_ARCH_PPC64 = 0x150000 + KEXEC_ARCH_S390 = 0x160000 + KEXEC_ARCH_SH = 0x2a0000 + KEXEC_ARCH_X86_64 = 0x3e0000 + KEXEC_FILE_NO_INITRAMFS = 0x4 + KEXEC_FILE_ON_CRASH = 0x2 + KEXEC_FILE_UNLOAD = 0x1 + KEXEC_ON_CRASH = 0x1 + KEXEC_PRESERVE_CONTEXT = 0x2 + KEXEC_SEGMENT_MAX = 0x10 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_NEGATE = 0xd + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_KEEPONFORK = 0x13 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MADV_WIPEONFORK = 0x12 + MAP_ANON = 0x800 + MAP_ANONYMOUS = 0x800 + MAP_DENYWRITE = 0x2000 + MAP_EXECUTABLE = 0x4000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_FIXED_NOREPLACE = 0x100000 + MAP_GROWSDOWN = 0x1000 + MAP_HUGETLB = 0x80000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x8000 + MAP_NONBLOCK = 0x20000 + MAP_NORESERVE = 0x400 + MAP_POPULATE = 0x10000 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x800 + MAP_SHARED = 0x1 + MAP_SHARED_VALIDATE = 0x3 + MAP_STACK = 0x40000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MFD_ALLOW_SEALING = 0x2 + MFD_CLOEXEC = 0x1 + MFD_HUGETLB = 0x4 + MFD_HUGE_16GB = -0x78000000 + MFD_HUGE_16MB = 0x60000000 + MFD_HUGE_1GB = 0x78000000 + MFD_HUGE_1MB = 0x50000000 + MFD_HUGE_256MB = 0x70000000 + MFD_HUGE_2GB = 0x7c000000 + MFD_HUGE_2MB = 0x54000000 + MFD_HUGE_32MB = 0x64000000 + MFD_HUGE_512KB = 0x4c000000 + MFD_HUGE_512MB = 0x74000000 + MFD_HUGE_64KB = 0x40000000 + MFD_HUGE_8MB = 0x5c000000 + MFD_HUGE_MASK = 0x3f + MFD_HUGE_SHIFT = 0x1a + MINIX2_SUPER_MAGIC = 0x2468 + MINIX2_SUPER_MAGIC2 = 0x2478 + MINIX3_SUPER_MAGIC = 0x4d5a + MINIX_SUPER_MAGIC = 0x137f + MINIX_SUPER_MAGIC2 = 0x138f + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSDOS_SUPER_MAGIC = 0x4d44 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MSG_ZEROCOPY = 0x4000000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + MTD_INODE_FS_MAGIC = 0x11307854 + NAME_MAX = 0xff + NCP_SUPER_MAGIC = 0x564c + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NETNSA_MAX = 0x3 + NETNSA_NSID_NOT_ASSIGNED = -0x1 + NFNETLINK_V0 = 0x0 + NFNLGRP_ACCT_QUOTA = 0x8 + NFNLGRP_CONNTRACK_DESTROY = 0x3 + NFNLGRP_CONNTRACK_EXP_DESTROY = 0x6 + NFNLGRP_CONNTRACK_EXP_NEW = 0x4 + NFNLGRP_CONNTRACK_EXP_UPDATE = 0x5 + NFNLGRP_CONNTRACK_NEW = 0x1 + NFNLGRP_CONNTRACK_UPDATE = 0x2 + NFNLGRP_MAX = 0x9 + NFNLGRP_NFTABLES = 0x7 + NFNLGRP_NFTRACE = 0x9 + NFNLGRP_NONE = 0x0 + NFNL_BATCH_MAX = 0x1 + NFNL_MSG_BATCH_BEGIN = 0x10 + NFNL_MSG_BATCH_END = 0x11 + NFNL_NFA_NEST = 0x8000 + NFNL_SUBSYS_ACCT = 0x7 + NFNL_SUBSYS_COUNT = 0xc + NFNL_SUBSYS_CTHELPER = 0x9 + NFNL_SUBSYS_CTNETLINK = 0x1 + NFNL_SUBSYS_CTNETLINK_EXP = 0x2 + NFNL_SUBSYS_CTNETLINK_TIMEOUT = 0x8 + NFNL_SUBSYS_IPSET = 0x6 + NFNL_SUBSYS_NFTABLES = 0xa + NFNL_SUBSYS_NFT_COMPAT = 0xb + NFNL_SUBSYS_NONE = 0x0 + NFNL_SUBSYS_OSF = 0x5 + NFNL_SUBSYS_QUEUE = 0x3 + NFNL_SUBSYS_ULOG = 0x4 + NFS_SUPER_MAGIC = 0x6969 + NILFS_SUPER_MAGIC = 0x3434 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_NONREC = 0x100 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + NSFS_MAGIC = 0x6e736673 + OCFS2_SUPER_MAGIC = 0x7461636f + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPENPROM_SUPER_MAGIC = 0x9fa1 + OPOST = 0x1 + OVERLAYFS_SUPER_MAGIC = 0x794c7630 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x1000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x100 + O_DIRECT = 0x8000 + O_DIRECTORY = 0x10000 + O_DSYNC = 0x10 + O_EXCL = 0x400 + O_FSYNC = 0x4010 + O_LARGEFILE = 0x0 + O_NDELAY = 0x80 + O_NOATIME = 0x40000 + O_NOCTTY = 0x800 + O_NOFOLLOW = 0x20000 + O_NONBLOCK = 0x80 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x4010 + O_SYNC = 0x4010 + O_TMPFILE = 0x410000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x20002401 + PERF_EVENT_IOC_ENABLE = 0x20002400 + PERF_EVENT_IOC_ID = 0x40082407 + PERF_EVENT_IOC_MODIFY_ATTRIBUTES = 0x8008240b + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x80042409 + PERF_EVENT_IOC_PERIOD = 0x80082404 + PERF_EVENT_IOC_QUERY_BPF = 0xc008240a + PERF_EVENT_IOC_REFRESH = 0x20002402 + PERF_EVENT_IOC_RESET = 0x20002403 + PERF_EVENT_IOC_SET_BPF = 0x80042408 + PERF_EVENT_IOC_SET_FILTER = 0x80082406 + PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 + PIPEFS_MAGIC = 0x50495045 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROC_SUPER_MAGIC = 0x9fa0 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_SPECULATION_CTRL = 0x34 + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffffffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_SPECULATION_CTRL = 0x35 + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_SPEC_DISABLE = 0x4 + PR_SPEC_ENABLE = 0x2 + PR_SPEC_FORCE_DISABLE = 0x8 + PR_SPEC_NOT_AFFECTED = 0x0 + PR_SPEC_PRCTL = 0x1 + PR_SPEC_STORE_BYPASS = 0x0 + PR_SVE_GET_VL = 0x33 + PR_SVE_SET_VL = 0x32 + PR_SVE_SET_VL_ONEXEC = 0x40000 + PR_SVE_VL_INHERIT = 0x20000 + PR_SVE_VL_LEN_MASK = 0xffff + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PSTOREFS_MAGIC = 0x6165676c + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETFPREGS = 0xe + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_THREAD_AREA = 0x19 + PTRACE_GET_THREAD_AREA_3264 = 0xc4 + PTRACE_GET_WATCH_REGS = 0xd0 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_OLDSETOPTIONS = 0x15 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKDATA_3264 = 0xc1 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKTEXT_3264 = 0xc0 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKEDATA_3264 = 0xc3 + PTRACE_POKETEXT = 0x4 + PTRACE_POKETEXT_3264 = 0xc2 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SECCOMP_GET_METADATA = 0x420d + PTRACE_SEIZE = 0x4206 + PTRACE_SETFPREGS = 0xf + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SET_THREAD_AREA = 0x1a + PTRACE_SET_WATCH_REGS = 0xd1 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_TRACEME = 0x0 + QNX4_SUPER_MAGIC = 0x2f + QNX6_SUPER_MAGIC = 0x68191122 + RAMFS_MAGIC = 0x858458f6 + RDTGROUP_SUPER_MAGIC = 0x7655821 + REISERFS_SUPER_MAGIC = 0x52654973 + RENAME_EXCHANGE = 0x2 + RENAME_NOREPLACE = 0x1 + RENAME_WHITEOUT = 0x4 + RLIMIT_AS = 0x6 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x9 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x5 + RLIMIT_NPROC = 0x8 + RLIMIT_RSS = 0x7 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FASTOPEN_NO_COOKIE = 0x11 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x11 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1d + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTC_AF = 0x20 + RTC_AIE_OFF = 0x20007002 + RTC_AIE_ON = 0x20007001 + RTC_ALM_READ = 0x40247008 + RTC_ALM_SET = 0x80247007 + RTC_EPOCH_READ = 0x4008700d + RTC_EPOCH_SET = 0x8008700e + RTC_IRQF = 0x80 + RTC_IRQP_READ = 0x4008700b + RTC_IRQP_SET = 0x8008700c + RTC_MAX_FREQ = 0x2000 + RTC_PF = 0x40 + RTC_PIE_OFF = 0x20007006 + RTC_PIE_ON = 0x20007005 + RTC_PLL_GET = 0x40207011 + RTC_PLL_SET = 0x80207012 + RTC_RD_TIME = 0x40247009 + RTC_SET_TIME = 0x8024700a + RTC_UF = 0x10 + RTC_UIE_OFF = 0x20007004 + RTC_UIE_ON = 0x20007003 + RTC_VL_CLR = 0x20007014 + RTC_VL_READ = 0x40047013 + RTC_WIE_OFF = 0x20007010 + RTC_WIE_ON = 0x2000700f + RTC_WKALM_RD = 0x40287010 + RTC_WKALM_SET = 0x8028700f + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELCHAIN = 0x65 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETCHAIN = 0x66 + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x67 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWCHAIN = 0x64 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x16 + RTM_NR_MSGTYPES = 0x58 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BGP = 0xba + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_EIGRP = 0xc0 + RTPROT_GATED = 0x8 + RTPROT_ISIS = 0xbb + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_OSPF = 0xbc + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_RIP = 0xbd + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_TXTIME = 0x3d + SCM_WIFI_STATUS = 0x29 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SECURITYFS_MAGIC = 0x73636673 + SELINUX_MAGIC = 0xf97cff8c + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x40047307 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x40047309 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x467f + SIOCOUTQ = 0x7472 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x80047308 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SMACK_MAGIC = 0x43415d53 + SMART_AUTOSAVE = 0xd2 + SMART_AUTO_OFFLINE = 0xdb + SMART_DISABLE = 0xd9 + SMART_ENABLE = 0xd8 + SMART_HCYL_PASS = 0xc2 + SMART_IMMEDIATE_OFFLINE = 0xd4 + SMART_LCYL_PASS = 0x4f + SMART_READ_LOG_SECTOR = 0xd5 + SMART_READ_THRESHOLDS = 0xd1 + SMART_READ_VALUES = 0xd0 + SMART_SAVE = 0xd3 + SMART_STATUS = 0xda + SMART_WRITE_LOG_SECTOR = 0xd6 + SMART_WRITE_THRESHOLDS = 0xd7 + SMB_SUPER_MAGIC = 0x517b + SOCKFS_MAGIC = 0x534f434b + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x1 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x80 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x2 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0xffff + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_TLS = 0x11a + SOL_X25 = 0x106 + SOL_XDP = 0x11b + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1009 + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x20 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x1029 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0x100 + SO_PASSCRED = 0x11 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x12 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1e + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x1028 + SO_RCVBUF = 0x1002 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x1001 + SO_SNDBUFFORCE = 0x1f + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_STYLE = 0x1008 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TXTIME = 0x3d + SO_TYPE = 0x1008 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SO_ZEROCOPY = 0x3c + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + SQUASHFS_MAGIC = 0x73717368 + STACK_END_MAGIC = 0x57ac6e9d + STATX_ALL = 0xfff + STATX_ATIME = 0x20 + STATX_ATTR_APPEND = 0x20 + STATX_ATTR_AUTOMOUNT = 0x1000 + STATX_ATTR_COMPRESSED = 0x4 + STATX_ATTR_ENCRYPTED = 0x800 + STATX_ATTR_IMMUTABLE = 0x10 + STATX_ATTR_NODUMP = 0x40 + STATX_BASIC_STATS = 0x7ff + STATX_BLOCKS = 0x400 + STATX_BTIME = 0x800 + STATX_CTIME = 0x80 + STATX_GID = 0x10 + STATX_INO = 0x100 + STATX_MODE = 0x2 + STATX_MTIME = 0x40 + STATX_NLINK = 0x4 + STATX_SIZE = 0x200 + STATX_TYPE = 0x1 + STATX_UID = 0x8 + STATX__RESERVED = 0x80000000 + SYNC_FILE_RANGE_WAIT_AFTER = 0x4 + SYNC_FILE_RANGE_WAIT_BEFORE = 0x1 + SYNC_FILE_RANGE_WRITE = 0x2 + SYSFS_MAGIC = 0x62656572 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x8 + TCFLSH = 0x5407 + TCGETA = 0x5401 + TCGETS = 0x540d + TCGETS2 = 0x4030542a + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_FASTOPEN_KEY = 0x21 + TCP_FASTOPEN_NO_COOKIE = 0x22 + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_EXT = 0x20 + TCP_MD5SIG_FLAG_PREFIX = 0x1 + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_ULP = 0x1f + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x5410 + TCSBRK = 0x5405 + TCSBRKP = 0x5486 + TCSETA = 0x5402 + TCSETAF = 0x5404 + TCSETAW = 0x5403 + TCSETS = 0x540e + TCSETS2 = 0x8030542b + TCSETSF = 0x5410 + TCSETSF2 = 0x8030542d + TCSETSW = 0x540f + TCSETSW2 = 0x8030542c + TCXONC = 0x5406 + TIOCCBRK = 0x5428 + TIOCCONS = 0x80047478 + TIOCEXCL = 0x740d + TIOCGDEV = 0x40045432 + TIOCGETD = 0x7400 + TIOCGETP = 0x7408 + TIOCGEXCL = 0x40045440 + TIOCGICOUNT = 0x5492 + TIOCGLCKTRMIOS = 0x548b + TIOCGLTC = 0x7474 + TIOCGPGRP = 0x40047477 + TIOCGPKT = 0x40045438 + TIOCGPTLCK = 0x40045439 + TIOCGPTN = 0x40045430 + TIOCGPTPEER = 0x20005441 + TIOCGRS485 = 0x4020542e + TIOCGSERIAL = 0x5484 + TIOCGSID = 0x7416 + TIOCGSOFTCAR = 0x5481 + TIOCGWINSZ = 0x40087468 + TIOCINQ = 0x467f + TIOCLINUX = 0x5483 + TIOCMBIC = 0x741c + TIOCMBIS = 0x741b + TIOCMGET = 0x741d + TIOCMIWAIT = 0x5491 + TIOCMSET = 0x741a + TIOCM_CAR = 0x100 + TIOCM_CD = 0x100 + TIOCM_CTS = 0x40 + TIOCM_DSR = 0x400 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x200 + TIOCM_RNG = 0x200 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x20 + TIOCM_ST = 0x10 + TIOCNOTTY = 0x5471 + TIOCNXCL = 0x740e + TIOCOUTQ = 0x7472 + TIOCPKT = 0x5470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x5480 + TIOCSERCONFIG = 0x5488 + TIOCSERGETLSR = 0x548e + TIOCSERGETMULTI = 0x548f + TIOCSERGSTRUCT = 0x548d + TIOCSERGWILD = 0x5489 + TIOCSERSETMULTI = 0x5490 + TIOCSERSWILD = 0x548a + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x7401 + TIOCSETN = 0x740a + TIOCSETP = 0x7409 + TIOCSIG = 0x80045436 + TIOCSLCKTRMIOS = 0x548c + TIOCSLTC = 0x7475 + TIOCSPGRP = 0x80047476 + TIOCSPTLCK = 0x80045431 + TIOCSRS485 = 0xc020542f + TIOCSSERIAL = 0x5485 + TIOCSSOFTCAR = 0x5482 + TIOCSTI = 0x5472 + TIOCSWINSZ = 0x80087467 + TIOCVHANGUP = 0x5437 + TMPFS_MAGIC = 0x1021994 + TOSTOP = 0x8000 + TPACKET_ALIGNMENT = 0x10 + TPACKET_HDRLEN = 0x34 + TP_STATUS_AVAILABLE = 0x0 + TP_STATUS_BLK_TMO = 0x20 + TP_STATUS_COPY = 0x2 + TP_STATUS_CSUMNOTREADY = 0x8 + TP_STATUS_CSUM_VALID = 0x80 + TP_STATUS_KERNEL = 0x0 + TP_STATUS_LOSING = 0x4 + TP_STATUS_SENDING = 0x2 + TP_STATUS_SEND_REQUEST = 0x1 + TP_STATUS_TS_RAW_HARDWARE = -0x80000000 + TP_STATUS_TS_SOFTWARE = 0x20000000 + TP_STATUS_TS_SYS_HARDWARE = 0x40000000 + TP_STATUS_USER = 0x1 + TP_STATUS_VLAN_TPID_VALID = 0x40 + TP_STATUS_VLAN_VALID = 0x10 + TP_STATUS_WRONG_FORMAT = 0x4 + TRACEFS_MAGIC = 0x74726163 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x801054d5 + TUNDETACHFILTER = 0x801054d6 + TUNGETFEATURES = 0x400454cf + TUNGETFILTER = 0x401054db + TUNGETIFF = 0x400454d2 + TUNGETSNDBUF = 0x400454d3 + TUNGETVNETBE = 0x400454df + TUNGETVNETHDRSZ = 0x400454d7 + TUNGETVNETLE = 0x400454dd + TUNSETDEBUG = 0x800454c9 + TUNSETFILTEREBPF = 0x400454e1 + TUNSETGROUP = 0x800454ce + TUNSETIFF = 0x800454ca + TUNSETIFINDEX = 0x800454da + TUNSETLINK = 0x800454cd + TUNSETNOCSUM = 0x800454c8 + TUNSETOFFLOAD = 0x800454d0 + TUNSETOWNER = 0x800454cc + TUNSETPERSIST = 0x800454cb + TUNSETQUEUE = 0x800454d9 + TUNSETSNDBUF = 0x800454d4 + TUNSETSTEERINGEBPF = 0x400454e0 + TUNSETTXFILTER = 0x800454d1 + TUNSETVNETBE = 0x800454de + TUNSETVNETHDRSZ = 0x800454d8 + TUNSETVNETLE = 0x800454dc + UBI_IOCATT = 0x80186f40 + UBI_IOCDET = 0x80046f41 + UBI_IOCEBCH = 0x80044f02 + UBI_IOCEBER = 0x80044f01 + UBI_IOCEBISMAP = 0x40044f05 + UBI_IOCEBMAP = 0x80084f03 + UBI_IOCEBUNMAP = 0x80044f04 + UBI_IOCMKVOL = 0x80986f00 + UBI_IOCRMVOL = 0x80046f01 + UBI_IOCRNVOL = 0x91106f03 + UBI_IOCRSVOL = 0x800c6f02 + UBI_IOCSETVOLPROP = 0x80104f06 + UBI_IOCVOLCRBLK = 0x80804f07 + UBI_IOCVOLRMBLK = 0x20004f08 + UBI_IOCVOLUP = 0x80084f00 + UDF_SUPER_MAGIC = 0x15013346 + UMOUNT_NOFOLLOW = 0x8 + USBDEVICE_SUPER_MAGIC = 0x9fa2 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + V9FS_MAGIC = 0x1021997 + VDISCARD = 0xd + VEOF = 0x10 + VEOL = 0x11 + VEOL2 = 0x6 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x4 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VSWTCH = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x40045702 + WDIOC_GETPRETIMEOUT = 0x40045709 + WDIOC_GETSTATUS = 0x40045701 + WDIOC_GETSUPPORT = 0x40285700 + WDIOC_GETTEMP = 0x40045703 + WDIOC_GETTIMELEFT = 0x4004570a + WDIOC_GETTIMEOUT = 0x40045707 + WDIOC_KEEPALIVE = 0x40045705 + WDIOC_SETOPTIONS = 0x40045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WIN_ACKMEDIACHANGE = 0xdb + WIN_CHECKPOWERMODE1 = 0xe5 + WIN_CHECKPOWERMODE2 = 0x98 + WIN_DEVICE_RESET = 0x8 + WIN_DIAGNOSE = 0x90 + WIN_DOORLOCK = 0xde + WIN_DOORUNLOCK = 0xdf + WIN_DOWNLOAD_MICROCODE = 0x92 + WIN_FLUSH_CACHE = 0xe7 + WIN_FLUSH_CACHE_EXT = 0xea + WIN_FORMAT = 0x50 + WIN_GETMEDIASTATUS = 0xda + WIN_IDENTIFY = 0xec + WIN_IDENTIFY_DMA = 0xee + WIN_IDLEIMMEDIATE = 0xe1 + WIN_INIT = 0x60 + WIN_MEDIAEJECT = 0xed + WIN_MULTREAD = 0xc4 + WIN_MULTREAD_EXT = 0x29 + WIN_MULTWRITE = 0xc5 + WIN_MULTWRITE_EXT = 0x39 + WIN_NOP = 0x0 + WIN_PACKETCMD = 0xa0 + WIN_PIDENTIFY = 0xa1 + WIN_POSTBOOT = 0xdc + WIN_PREBOOT = 0xdd + WIN_QUEUED_SERVICE = 0xa2 + WIN_READ = 0x20 + WIN_READDMA = 0xc8 + WIN_READDMA_EXT = 0x25 + WIN_READDMA_ONCE = 0xc9 + WIN_READDMA_QUEUED = 0xc7 + WIN_READDMA_QUEUED_EXT = 0x26 + WIN_READ_BUFFER = 0xe4 + WIN_READ_EXT = 0x24 + WIN_READ_LONG = 0x22 + WIN_READ_LONG_ONCE = 0x23 + WIN_READ_NATIVE_MAX = 0xf8 + WIN_READ_NATIVE_MAX_EXT = 0x27 + WIN_READ_ONCE = 0x21 + WIN_RECAL = 0x10 + WIN_RESTORE = 0x10 + WIN_SECURITY_DISABLE = 0xf6 + WIN_SECURITY_ERASE_PREPARE = 0xf3 + WIN_SECURITY_ERASE_UNIT = 0xf4 + WIN_SECURITY_FREEZE_LOCK = 0xf5 + WIN_SECURITY_SET_PASS = 0xf1 + WIN_SECURITY_UNLOCK = 0xf2 + WIN_SEEK = 0x70 + WIN_SETFEATURES = 0xef + WIN_SETIDLE1 = 0xe3 + WIN_SETIDLE2 = 0x97 + WIN_SETMULT = 0xc6 + WIN_SET_MAX = 0xf9 + WIN_SET_MAX_EXT = 0x37 + WIN_SLEEPNOW1 = 0xe6 + WIN_SLEEPNOW2 = 0x99 + WIN_SMART = 0xb0 + WIN_SPECIFY = 0x91 + WIN_SRST = 0x8 + WIN_STANDBY = 0xe2 + WIN_STANDBY2 = 0x96 + WIN_STANDBYNOW1 = 0xe0 + WIN_STANDBYNOW2 = 0x94 + WIN_VERIFY = 0x40 + WIN_VERIFY_EXT = 0x42 + WIN_VERIFY_ONCE = 0x41 + WIN_WRITE = 0x30 + WIN_WRITEDMA = 0xca + WIN_WRITEDMA_EXT = 0x35 + WIN_WRITEDMA_ONCE = 0xcb + WIN_WRITEDMA_QUEUED = 0xcc + WIN_WRITEDMA_QUEUED_EXT = 0x36 + WIN_WRITE_BUFFER = 0xe8 + WIN_WRITE_EXT = 0x34 + WIN_WRITE_LONG = 0x32 + WIN_WRITE_LONG_ONCE = 0x33 + WIN_WRITE_ONCE = 0x31 + WIN_WRITE_SAME = 0xe9 + WIN_WRITE_VERIFY = 0x3c + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x40 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XDP_COPY = 0x2 + XDP_FLAGS_DRV_MODE = 0x4 + XDP_FLAGS_HW_MODE = 0x8 + XDP_FLAGS_MASK = 0xf + XDP_FLAGS_MODES = 0xe + XDP_FLAGS_SKB_MODE = 0x2 + XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 + XDP_MMAP_OFFSETS = 0x1 + XDP_PGOFF_RX_RING = 0x0 + XDP_PGOFF_TX_RING = 0x80000000 + XDP_RX_RING = 0x2 + XDP_SHARED_UMEM = 0x1 + XDP_STATISTICS = 0x7 + XDP_TX_RING = 0x3 + XDP_UMEM_COMPLETION_RING = 0x6 + XDP_UMEM_FILL_RING = 0x5 + XDP_UMEM_PGOFF_COMPLETION_RING = 0x180000000 + XDP_UMEM_PGOFF_FILL_RING = 0x100000000 + XDP_UMEM_REG = 0x4 + XDP_ZEROCOPY = 0x4 + XENFS_SUPER_MAGIC = 0xabba1974 + XTABS = 0x1800 + ZSMALLOC_MAGIC = 0x58295829 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x7d) + EADDRNOTAVAIL = syscall.Errno(0x7e) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x7c) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x95) + EBADE = syscall.Errno(0x32) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x51) + EBADMSG = syscall.Errno(0x4d) + EBADR = syscall.Errno(0x33) + EBADRQC = syscall.Errno(0x36) + EBADSLT = syscall.Errno(0x37) + EBFONT = syscall.Errno(0x3b) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x9e) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x25) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x82) + ECONNREFUSED = syscall.Errno(0x92) + ECONNRESET = syscall.Errno(0x83) + EDEADLK = syscall.Errno(0x2d) + EDEADLOCK = syscall.Errno(0x38) + EDESTADDRREQ = syscall.Errno(0x60) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x49) + EDQUOT = syscall.Errno(0x46d) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x93) + EHOSTUNREACH = syscall.Errno(0x94) + EHWPOISON = syscall.Errno(0xa8) + EIDRM = syscall.Errno(0x24) + EILSEQ = syscall.Errno(0x58) + EINIT = syscall.Errno(0x8d) + EINPROGRESS = syscall.Errno(0x96) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x85) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x8b) + EKEYEXPIRED = syscall.Errno(0xa2) + EKEYREJECTED = syscall.Errno(0xa4) + EKEYREVOKED = syscall.Errno(0xa3) + EL2HLT = syscall.Errno(0x2c) + EL2NSYNC = syscall.Errno(0x26) + EL3HLT = syscall.Errno(0x27) + EL3RST = syscall.Errno(0x28) + ELIBACC = syscall.Errno(0x53) + ELIBBAD = syscall.Errno(0x54) + ELIBEXEC = syscall.Errno(0x57) + ELIBMAX = syscall.Errno(0x56) + ELIBSCN = syscall.Errno(0x55) + ELNRNG = syscall.Errno(0x29) + ELOOP = syscall.Errno(0x5a) + EMEDIUMTYPE = syscall.Errno(0xa0) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x61) + EMULTIHOP = syscall.Errno(0x4a) + ENAMETOOLONG = syscall.Errno(0x4e) + ENAVAIL = syscall.Errno(0x8a) + ENETDOWN = syscall.Errno(0x7f) + ENETRESET = syscall.Errno(0x81) + ENETUNREACH = syscall.Errno(0x80) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x35) + ENOBUFS = syscall.Errno(0x84) + ENOCSI = syscall.Errno(0x2b) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0xa1) + ENOLCK = syscall.Errno(0x2e) + ENOLINK = syscall.Errno(0x43) + ENOMEDIUM = syscall.Errno(0x9f) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x23) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x63) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x59) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x86) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x5d) + ENOTNAM = syscall.Errno(0x89) + ENOTRECOVERABLE = syscall.Errno(0xa6) + ENOTSOCK = syscall.Errno(0x5f) + ENOTSUP = syscall.Errno(0x7a) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x50) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x7a) + EOVERFLOW = syscall.Errno(0x4f) + EOWNERDEAD = syscall.Errno(0xa5) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x7b) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x78) + EPROTOTYPE = syscall.Errno(0x62) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x52) + EREMDEV = syscall.Errno(0x8e) + EREMOTE = syscall.Errno(0x42) + EREMOTEIO = syscall.Errno(0x8c) + ERESTART = syscall.Errno(0x5b) + ERFKILL = syscall.Errno(0xa7) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x8f) + ESOCKTNOSUPPORT = syscall.Errno(0x79) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x97) + ESTRPIPE = syscall.Errno(0x5c) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x91) + ETOOMANYREFS = syscall.Errno(0x90) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x87) + EUNATCH = syscall.Errno(0x2a) + EUSERS = syscall.Errno(0x5e) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x34) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x12) + SIGCLD = syscall.Signal(0x12) + SIGCONT = syscall.Signal(0x19) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x16) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x16) + SIGPROF = syscall.Signal(0x1d) + SIGPWR = syscall.Signal(0x13) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x17) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x18) + SIGTTIN = syscall.Signal(0x1a) + SIGTTOU = syscall.Signal(0x1b) + SIGURG = syscall.Signal(0x15) + SIGUSR1 = syscall.Signal(0x10) + SIGUSR2 = syscall.Signal(0x11) + SIGVTALRM = syscall.Signal(0x1c) + SIGWINCH = syscall.Signal(0x14) + SIGXCPU = syscall.Signal(0x1e) + SIGXFSZ = syscall.Signal(0x1f) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "no such device or address"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EAGAIN", "resource temporarily unavailable"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device or resource busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "invalid cross-device link"}, + {19, "ENODEV", "no such device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "numerical result out of range"}, + {35, "ENOMSG", "no message of desired type"}, + {36, "EIDRM", "identifier removed"}, + {37, "ECHRNG", "channel number out of range"}, + {38, "EL2NSYNC", "level 2 not synchronized"}, + {39, "EL3HLT", "level 3 halted"}, + {40, "EL3RST", "level 3 reset"}, + {41, "ELNRNG", "link number out of range"}, + {42, "EUNATCH", "protocol driver not attached"}, + {43, "ENOCSI", "no CSI structure available"}, + {44, "EL2HLT", "level 2 halted"}, + {45, "EDEADLK", "resource deadlock avoided"}, + {46, "ENOLCK", "no locks available"}, + {50, "EBADE", "invalid exchange"}, + {51, "EBADR", "invalid request descriptor"}, + {52, "EXFULL", "exchange full"}, + {53, "ENOANO", "no anode"}, + {54, "EBADRQC", "invalid request code"}, + {55, "EBADSLT", "invalid slot"}, + {56, "EDEADLOCK", "file locking deadlock error"}, + {59, "EBFONT", "bad font file format"}, + {60, "ENOSTR", "device not a stream"}, + {61, "ENODATA", "no data available"}, + {62, "ETIME", "timer expired"}, + {63, "ENOSR", "out of streams resources"}, + {64, "ENONET", "machine is not on the network"}, + {65, "ENOPKG", "package not installed"}, + {66, "EREMOTE", "object is remote"}, + {67, "ENOLINK", "link has been severed"}, + {68, "EADV", "advertise error"}, + {69, "ESRMNT", "srmount error"}, + {70, "ECOMM", "communication error on send"}, + {71, "EPROTO", "protocol error"}, + {73, "EDOTDOT", "RFS specific error"}, + {74, "EMULTIHOP", "multihop attempted"}, + {77, "EBADMSG", "bad message"}, + {78, "ENAMETOOLONG", "file name too long"}, + {79, "EOVERFLOW", "value too large for defined data type"}, + {80, "ENOTUNIQ", "name not unique on network"}, + {81, "EBADFD", "file descriptor in bad state"}, + {82, "EREMCHG", "remote address changed"}, + {83, "ELIBACC", "can not access a needed shared library"}, + {84, "ELIBBAD", "accessing a corrupted shared library"}, + {85, "ELIBSCN", ".lib section in a.out corrupted"}, + {86, "ELIBMAX", "attempting to link in too many shared libraries"}, + {87, "ELIBEXEC", "cannot exec a shared library directly"}, + {88, "EILSEQ", "invalid or incomplete multibyte or wide character"}, + {89, "ENOSYS", "function not implemented"}, + {90, "ELOOP", "too many levels of symbolic links"}, + {91, "ERESTART", "interrupted system call should be restarted"}, + {92, "ESTRPIPE", "streams pipe error"}, + {93, "ENOTEMPTY", "directory not empty"}, + {94, "EUSERS", "too many users"}, + {95, "ENOTSOCK", "socket operation on non-socket"}, + {96, "EDESTADDRREQ", "destination address required"}, + {97, "EMSGSIZE", "message too long"}, + {98, "EPROTOTYPE", "protocol wrong type for socket"}, + {99, "ENOPROTOOPT", "protocol not available"}, + {120, "EPROTONOSUPPORT", "protocol not supported"}, + {121, "ESOCKTNOSUPPORT", "socket type not supported"}, + {122, "ENOTSUP", "operation not supported"}, + {123, "EPFNOSUPPORT", "protocol family not supported"}, + {124, "EAFNOSUPPORT", "address family not supported by protocol"}, + {125, "EADDRINUSE", "address already in use"}, + {126, "EADDRNOTAVAIL", "cannot assign requested address"}, + {127, "ENETDOWN", "network is down"}, + {128, "ENETUNREACH", "network is unreachable"}, + {129, "ENETRESET", "network dropped connection on reset"}, + {130, "ECONNABORTED", "software caused connection abort"}, + {131, "ECONNRESET", "connection reset by peer"}, + {132, "ENOBUFS", "no buffer space available"}, + {133, "EISCONN", "transport endpoint is already connected"}, + {134, "ENOTCONN", "transport endpoint is not connected"}, + {135, "EUCLEAN", "structure needs cleaning"}, + {137, "ENOTNAM", "not a XENIX named type file"}, + {138, "ENAVAIL", "no XENIX semaphores available"}, + {139, "EISNAM", "is a named type file"}, + {140, "EREMOTEIO", "remote I/O error"}, + {141, "EINIT", "unknown error 141"}, + {142, "EREMDEV", "unknown error 142"}, + {143, "ESHUTDOWN", "cannot send after transport endpoint shutdown"}, + {144, "ETOOMANYREFS", "too many references: cannot splice"}, + {145, "ETIMEDOUT", "connection timed out"}, + {146, "ECONNREFUSED", "connection refused"}, + {147, "EHOSTDOWN", "host is down"}, + {148, "EHOSTUNREACH", "no route to host"}, + {149, "EALREADY", "operation already in progress"}, + {150, "EINPROGRESS", "operation now in progress"}, + {151, "ESTALE", "stale file handle"}, + {158, "ECANCELED", "operation canceled"}, + {159, "ENOMEDIUM", "no medium found"}, + {160, "EMEDIUMTYPE", "wrong medium type"}, + {161, "ENOKEY", "required key not available"}, + {162, "EKEYEXPIRED", "key has expired"}, + {163, "EKEYREVOKED", "key has been revoked"}, + {164, "EKEYREJECTED", "key was rejected by service"}, + {165, "EOWNERDEAD", "owner died"}, + {166, "ENOTRECOVERABLE", "state not recoverable"}, + {167, "ERFKILL", "operation not possible due to RF-kill"}, + {168, "EHWPOISON", "memory page has hardware error"}, + {1133, "EDQUOT", "disk quota exceeded"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/breakpoint trap"}, + {6, "SIGABRT", "aborted"}, + {7, "SIGEMT", "EMT trap"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGBUS", "bus error"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGSYS", "bad system call"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGUSR1", "user defined signal 1"}, + {17, "SIGUSR2", "user defined signal 2"}, + {18, "SIGCHLD", "child exited"}, + {19, "SIGPWR", "power failure"}, + {20, "SIGWINCH", "window changed"}, + {21, "SIGURG", "urgent I/O condition"}, + {22, "SIGIO", "I/O possible"}, + {23, "SIGSTOP", "stopped (signal)"}, + {24, "SIGTSTP", "stopped"}, + {25, "SIGCONT", "continued"}, + {26, "SIGTTIN", "stopped (tty input)"}, + {27, "SIGTTOU", "stopped (tty output)"}, + {28, "SIGVTALRM", "virtual timer expired"}, + {29, "SIGPROF", "profiling timer expired"}, + {30, "SIGXCPU", "CPU time limit exceeded"}, + {31, "SIGXFSZ", "file size limit exceeded"}, +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go new file mode 100644 index 00000000..73e35b9e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go @@ -0,0 +1,2709 @@ +// mkerrors.sh -Wall -Werror -static -I/tmp/include +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build mipsle,linux + +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go + +package unix + +import "syscall" + +const ( + AAFS_MAGIC = 0x5a3c69f0 + ADFS_SUPER_MAGIC = 0xadf5 + AFFS_SUPER_MAGIC = 0xadff + AFS_FS_MAGIC = 0x6b414653 + AFS_SUPER_MAGIC = 0x5346414f + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2c + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + AF_XDP = 0x2c + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ANON_INODE_FS_MAGIC = 0x9041934 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_RAWIP = 0x207 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + AUTOFS_SUPER_MAGIC = 0x187 + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BALLOON_KVM_MAGIC = 0x13661366 + BDEVFS_MAGIC = 0x62646576 + BINFMTFS_MAGIC = 0x42494e4d + BLKBSZGET = 0x40041270 + BLKBSZSET = 0x80041271 + BLKFLSBUF = 0x20001261 + BLKFRAGET = 0x20001265 + BLKFRASET = 0x20001264 + BLKGETSIZE = 0x20001260 + BLKGETSIZE64 = 0x40041272 + BLKPBSZGET = 0x2000127b + BLKRAGET = 0x20001263 + BLKRASET = 0x20001262 + BLKROGET = 0x2000125e + BLKROSET = 0x2000125d + BLKRRPART = 0x2000125f + BLKSECTGET = 0x20001267 + BLKSECTSET = 0x20001266 + BLKSSZGET = 0x20001268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_FS_MAGIC = 0xcafe4a11 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + BTRFS_SUPER_MAGIC = 0x9123683e + BTRFS_TEST_MAGIC = 0x73727279 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CGROUP2_SUPER_MAGIC = 0x63677270 + CGROUP_SUPER_MAGIC = 0x27e0eb + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CODA_SUPER_MAGIC = 0x73757245 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRAMFS_MAGIC = 0x28cd3d45 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DAXFS_MAGIC = 0x64646178 + DEBUGFS_MAGIC = 0x64626720 + DEVPTS_SUPER_MAGIC = 0x1cd1 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + ECRYPTFS_SUPER_MAGIC = 0xf15f + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x80 + EFD_SEMAPHORE = 0x1 + EFIVARFS_MAGIC = 0xde5e81e4 + EFS_SUPER_MAGIC = 0x414a53 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_ERSPAN = 0x88be + ETH_P_ERSPAN2 = 0x22eb + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IFE = 0xed3e + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MAP = 0xf9 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_NSH = 0x894f + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PREAUTH = 0x88c7 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXABYTE_ENABLE_NEST = 0xf0 + EXT2_SUPER_MAGIC = 0xef53 + EXT3_SUPER_MAGIC = 0xef53 + EXT4_SUPER_MAGIC = 0xef53 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + F2FS_SUPER_MAGIC = 0xf2f52010 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x2000 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_ENCRYPTION_MODE_SPECK128_256_CTS = 0x8 + FS_ENCRYPTION_MODE_SPECK128_256_XTS = 0x7 + FS_IOC_GET_ENCRYPTION_POLICY = 0x800c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x80106614 + FS_IOC_SET_ENCRYPTION_POLICY = 0x400c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0x3 + FUTEXFS_SUPER_MAGIC = 0xbad1dea + F_ADD_SEALS = 0x409 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0x21 + F_GETLK64 = 0x21 + F_GETOWN = 0x17 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_GET_FILE_RW_HINT = 0x40d + F_GET_RW_HINT = 0x40b + F_GET_SEALS = 0x40a + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SEAL_GROW = 0x4 + F_SEAL_SEAL = 0x1 + F_SEAL_SHRINK = 0x2 + F_SEAL_WRITE = 0x8 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x22 + F_SETLK64 = 0x22 + F_SETLKW = 0x23 + F_SETLKW64 = 0x23 + F_SETOWN = 0x18 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SET_FILE_RW_HINT = 0x40e + F_SET_RW_HINT = 0x40c + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HDIO_DRIVE_CMD = 0x31f + HDIO_DRIVE_CMD_AEB = 0x31e + HDIO_DRIVE_CMD_HDR_SIZE = 0x4 + HDIO_DRIVE_HOB_HDR_SIZE = 0x8 + HDIO_DRIVE_RESET = 0x31c + HDIO_DRIVE_TASK = 0x31e + HDIO_DRIVE_TASKFILE = 0x31d + HDIO_DRIVE_TASK_HDR_SIZE = 0x8 + HDIO_GETGEO = 0x301 + HDIO_GET_32BIT = 0x309 + HDIO_GET_ACOUSTIC = 0x30f + HDIO_GET_ADDRESS = 0x310 + HDIO_GET_BUSSTATE = 0x31a + HDIO_GET_DMA = 0x30b + HDIO_GET_IDENTITY = 0x30d + HDIO_GET_KEEPSETTINGS = 0x308 + HDIO_GET_MULTCOUNT = 0x304 + HDIO_GET_NICE = 0x30c + HDIO_GET_NOWERR = 0x30a + HDIO_GET_QDMA = 0x305 + HDIO_GET_UNMASKINTR = 0x302 + HDIO_GET_WCACHE = 0x30e + HDIO_OBSOLETE_IDENTITY = 0x307 + HDIO_SCAN_HWIF = 0x328 + HDIO_SET_32BIT = 0x324 + HDIO_SET_ACOUSTIC = 0x32c + HDIO_SET_ADDRESS = 0x32f + HDIO_SET_BUSSTATE = 0x32d + HDIO_SET_DMA = 0x326 + HDIO_SET_KEEPSETTINGS = 0x323 + HDIO_SET_MULTCOUNT = 0x321 + HDIO_SET_NICE = 0x329 + HDIO_SET_NOWERR = 0x325 + HDIO_SET_PIO_MODE = 0x327 + HDIO_SET_QDMA = 0x32e + HDIO_SET_UNMASKINTR = 0x322 + HDIO_SET_WCACHE = 0x32b + HDIO_SET_XFER = 0x306 + HDIO_TRISTATE_HWIF = 0x31b + HDIO_UNREGISTER_HWIF = 0x32a + HOSTFS_SUPER_MAGIC = 0xc0ffee + HPFS_SUPER_MAGIC = 0xf995e849 + HUGETLBFS_MAGIC = 0x958458f6 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x100 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x9 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NAPI = 0x10 + IFF_NAPI_FRAGS = 0x20 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x80 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_FREEBIND = 0x4e + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISOFS_SUPER_MAGIC = 0x9660 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + JFFS2_SUPER_MAGIC = 0x72b6 + KEXEC_ARCH_386 = 0x30000 + KEXEC_ARCH_68K = 0x40000 + KEXEC_ARCH_AARCH64 = 0xb70000 + KEXEC_ARCH_ARM = 0x280000 + KEXEC_ARCH_DEFAULT = 0x0 + KEXEC_ARCH_IA_64 = 0x320000 + KEXEC_ARCH_MASK = 0xffff0000 + KEXEC_ARCH_MIPS = 0x80000 + KEXEC_ARCH_MIPS_LE = 0xa0000 + KEXEC_ARCH_PPC = 0x140000 + KEXEC_ARCH_PPC64 = 0x150000 + KEXEC_ARCH_S390 = 0x160000 + KEXEC_ARCH_SH = 0x2a0000 + KEXEC_ARCH_X86_64 = 0x3e0000 + KEXEC_FILE_NO_INITRAMFS = 0x4 + KEXEC_FILE_ON_CRASH = 0x2 + KEXEC_FILE_UNLOAD = 0x1 + KEXEC_ON_CRASH = 0x1 + KEXEC_PRESERVE_CONTEXT = 0x2 + KEXEC_SEGMENT_MAX = 0x10 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_NEGATE = 0xd + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_KEEPONFORK = 0x13 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MADV_WIPEONFORK = 0x12 + MAP_ANON = 0x800 + MAP_ANONYMOUS = 0x800 + MAP_DENYWRITE = 0x2000 + MAP_EXECUTABLE = 0x4000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_FIXED_NOREPLACE = 0x100000 + MAP_GROWSDOWN = 0x1000 + MAP_HUGETLB = 0x80000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x8000 + MAP_NONBLOCK = 0x20000 + MAP_NORESERVE = 0x400 + MAP_POPULATE = 0x10000 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x800 + MAP_SHARED = 0x1 + MAP_SHARED_VALIDATE = 0x3 + MAP_STACK = 0x40000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MFD_ALLOW_SEALING = 0x2 + MFD_CLOEXEC = 0x1 + MFD_HUGETLB = 0x4 + MFD_HUGE_16GB = -0x78000000 + MFD_HUGE_16MB = 0x60000000 + MFD_HUGE_1GB = 0x78000000 + MFD_HUGE_1MB = 0x50000000 + MFD_HUGE_256MB = 0x70000000 + MFD_HUGE_2GB = 0x7c000000 + MFD_HUGE_2MB = 0x54000000 + MFD_HUGE_32MB = 0x64000000 + MFD_HUGE_512KB = 0x4c000000 + MFD_HUGE_512MB = 0x74000000 + MFD_HUGE_64KB = 0x40000000 + MFD_HUGE_8MB = 0x5c000000 + MFD_HUGE_MASK = 0x3f + MFD_HUGE_SHIFT = 0x1a + MINIX2_SUPER_MAGIC = 0x2468 + MINIX2_SUPER_MAGIC2 = 0x2478 + MINIX3_SUPER_MAGIC = 0x4d5a + MINIX_SUPER_MAGIC = 0x137f + MINIX_SUPER_MAGIC2 = 0x138f + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSDOS_SUPER_MAGIC = 0x4d44 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MSG_ZEROCOPY = 0x4000000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + MTD_INODE_FS_MAGIC = 0x11307854 + NAME_MAX = 0xff + NCP_SUPER_MAGIC = 0x564c + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NETNSA_MAX = 0x3 + NETNSA_NSID_NOT_ASSIGNED = -0x1 + NFNETLINK_V0 = 0x0 + NFNLGRP_ACCT_QUOTA = 0x8 + NFNLGRP_CONNTRACK_DESTROY = 0x3 + NFNLGRP_CONNTRACK_EXP_DESTROY = 0x6 + NFNLGRP_CONNTRACK_EXP_NEW = 0x4 + NFNLGRP_CONNTRACK_EXP_UPDATE = 0x5 + NFNLGRP_CONNTRACK_NEW = 0x1 + NFNLGRP_CONNTRACK_UPDATE = 0x2 + NFNLGRP_MAX = 0x9 + NFNLGRP_NFTABLES = 0x7 + NFNLGRP_NFTRACE = 0x9 + NFNLGRP_NONE = 0x0 + NFNL_BATCH_MAX = 0x1 + NFNL_MSG_BATCH_BEGIN = 0x10 + NFNL_MSG_BATCH_END = 0x11 + NFNL_NFA_NEST = 0x8000 + NFNL_SUBSYS_ACCT = 0x7 + NFNL_SUBSYS_COUNT = 0xc + NFNL_SUBSYS_CTHELPER = 0x9 + NFNL_SUBSYS_CTNETLINK = 0x1 + NFNL_SUBSYS_CTNETLINK_EXP = 0x2 + NFNL_SUBSYS_CTNETLINK_TIMEOUT = 0x8 + NFNL_SUBSYS_IPSET = 0x6 + NFNL_SUBSYS_NFTABLES = 0xa + NFNL_SUBSYS_NFT_COMPAT = 0xb + NFNL_SUBSYS_NONE = 0x0 + NFNL_SUBSYS_OSF = 0x5 + NFNL_SUBSYS_QUEUE = 0x3 + NFNL_SUBSYS_ULOG = 0x4 + NFS_SUPER_MAGIC = 0x6969 + NILFS_SUPER_MAGIC = 0x3434 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_NONREC = 0x100 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + NSFS_MAGIC = 0x6e736673 + OCFS2_SUPER_MAGIC = 0x7461636f + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPENPROM_SUPER_MAGIC = 0x9fa1 + OPOST = 0x1 + OVERLAYFS_SUPER_MAGIC = 0x794c7630 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x1000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x100 + O_DIRECT = 0x8000 + O_DIRECTORY = 0x10000 + O_DSYNC = 0x10 + O_EXCL = 0x400 + O_FSYNC = 0x4010 + O_LARGEFILE = 0x2000 + O_NDELAY = 0x80 + O_NOATIME = 0x40000 + O_NOCTTY = 0x800 + O_NOFOLLOW = 0x20000 + O_NONBLOCK = 0x80 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x4010 + O_SYNC = 0x4010 + O_TMPFILE = 0x410000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x20002401 + PERF_EVENT_IOC_ENABLE = 0x20002400 + PERF_EVENT_IOC_ID = 0x40042407 + PERF_EVENT_IOC_MODIFY_ATTRIBUTES = 0x8004240b + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x80042409 + PERF_EVENT_IOC_PERIOD = 0x80082404 + PERF_EVENT_IOC_QUERY_BPF = 0xc004240a + PERF_EVENT_IOC_REFRESH = 0x20002402 + PERF_EVENT_IOC_RESET = 0x20002403 + PERF_EVENT_IOC_SET_BPF = 0x80042408 + PERF_EVENT_IOC_SET_FILTER = 0x80042406 + PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 + PIPEFS_MAGIC = 0x50495045 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROC_SUPER_MAGIC = 0x9fa0 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_SPECULATION_CTRL = 0x34 + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_SPECULATION_CTRL = 0x35 + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_SPEC_DISABLE = 0x4 + PR_SPEC_ENABLE = 0x2 + PR_SPEC_FORCE_DISABLE = 0x8 + PR_SPEC_NOT_AFFECTED = 0x0 + PR_SPEC_PRCTL = 0x1 + PR_SPEC_STORE_BYPASS = 0x0 + PR_SVE_GET_VL = 0x33 + PR_SVE_SET_VL = 0x32 + PR_SVE_SET_VL_ONEXEC = 0x40000 + PR_SVE_VL_INHERIT = 0x20000 + PR_SVE_VL_LEN_MASK = 0xffff + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PSTOREFS_MAGIC = 0x6165676c + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETFPREGS = 0xe + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_THREAD_AREA = 0x19 + PTRACE_GET_THREAD_AREA_3264 = 0xc4 + PTRACE_GET_WATCH_REGS = 0xd0 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_OLDSETOPTIONS = 0x15 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKDATA_3264 = 0xc1 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKTEXT_3264 = 0xc0 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKEDATA_3264 = 0xc3 + PTRACE_POKETEXT = 0x4 + PTRACE_POKETEXT_3264 = 0xc2 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SECCOMP_GET_METADATA = 0x420d + PTRACE_SEIZE = 0x4206 + PTRACE_SETFPREGS = 0xf + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SET_THREAD_AREA = 0x1a + PTRACE_SET_WATCH_REGS = 0xd1 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_TRACEME = 0x0 + QNX4_SUPER_MAGIC = 0x2f + QNX6_SUPER_MAGIC = 0x68191122 + RAMFS_MAGIC = 0x858458f6 + RDTGROUP_SUPER_MAGIC = 0x7655821 + REISERFS_SUPER_MAGIC = 0x52654973 + RENAME_EXCHANGE = 0x2 + RENAME_NOREPLACE = 0x1 + RENAME_WHITEOUT = 0x4 + RLIMIT_AS = 0x6 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x9 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x5 + RLIMIT_NPROC = 0x8 + RLIMIT_RSS = 0x7 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FASTOPEN_NO_COOKIE = 0x11 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x11 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1d + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTC_AF = 0x20 + RTC_AIE_OFF = 0x20007002 + RTC_AIE_ON = 0x20007001 + RTC_ALM_READ = 0x40247008 + RTC_ALM_SET = 0x80247007 + RTC_EPOCH_READ = 0x4004700d + RTC_EPOCH_SET = 0x8004700e + RTC_IRQF = 0x80 + RTC_IRQP_READ = 0x4004700b + RTC_IRQP_SET = 0x8004700c + RTC_MAX_FREQ = 0x2000 + RTC_PF = 0x40 + RTC_PIE_OFF = 0x20007006 + RTC_PIE_ON = 0x20007005 + RTC_PLL_GET = 0x401c7011 + RTC_PLL_SET = 0x801c7012 + RTC_RD_TIME = 0x40247009 + RTC_SET_TIME = 0x8024700a + RTC_UF = 0x10 + RTC_UIE_OFF = 0x20007004 + RTC_UIE_ON = 0x20007003 + RTC_VL_CLR = 0x20007014 + RTC_VL_READ = 0x40047013 + RTC_WIE_OFF = 0x20007010 + RTC_WIE_ON = 0x2000700f + RTC_WKALM_RD = 0x40287010 + RTC_WKALM_SET = 0x8028700f + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELCHAIN = 0x65 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETCHAIN = 0x66 + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x67 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWCHAIN = 0x64 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x16 + RTM_NR_MSGTYPES = 0x58 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BGP = 0xba + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_EIGRP = 0xc0 + RTPROT_GATED = 0x8 + RTPROT_ISIS = 0xbb + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_OSPF = 0xbc + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_RIP = 0xbd + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_TXTIME = 0x3d + SCM_WIFI_STATUS = 0x29 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SECURITYFS_MAGIC = 0x73636673 + SELINUX_MAGIC = 0xf97cff8c + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x40047307 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x40047309 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x467f + SIOCOUTQ = 0x7472 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x80047308 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SMACK_MAGIC = 0x43415d53 + SMART_AUTOSAVE = 0xd2 + SMART_AUTO_OFFLINE = 0xdb + SMART_DISABLE = 0xd9 + SMART_ENABLE = 0xd8 + SMART_HCYL_PASS = 0xc2 + SMART_IMMEDIATE_OFFLINE = 0xd4 + SMART_LCYL_PASS = 0x4f + SMART_READ_LOG_SECTOR = 0xd5 + SMART_READ_THRESHOLDS = 0xd1 + SMART_READ_VALUES = 0xd0 + SMART_SAVE = 0xd3 + SMART_STATUS = 0xda + SMART_WRITE_LOG_SECTOR = 0xd6 + SMART_WRITE_THRESHOLDS = 0xd7 + SMB_SUPER_MAGIC = 0x517b + SOCKFS_MAGIC = 0x534f434b + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x1 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x80 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x2 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0xffff + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_TLS = 0x11a + SOL_X25 = 0x106 + SOL_XDP = 0x11b + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1009 + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x20 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x1029 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0x100 + SO_PASSCRED = 0x11 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x12 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1e + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x1028 + SO_RCVBUF = 0x1002 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x1001 + SO_SNDBUFFORCE = 0x1f + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_STYLE = 0x1008 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TXTIME = 0x3d + SO_TYPE = 0x1008 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SO_ZEROCOPY = 0x3c + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + SQUASHFS_MAGIC = 0x73717368 + STACK_END_MAGIC = 0x57ac6e9d + STATX_ALL = 0xfff + STATX_ATIME = 0x20 + STATX_ATTR_APPEND = 0x20 + STATX_ATTR_AUTOMOUNT = 0x1000 + STATX_ATTR_COMPRESSED = 0x4 + STATX_ATTR_ENCRYPTED = 0x800 + STATX_ATTR_IMMUTABLE = 0x10 + STATX_ATTR_NODUMP = 0x40 + STATX_BASIC_STATS = 0x7ff + STATX_BLOCKS = 0x400 + STATX_BTIME = 0x800 + STATX_CTIME = 0x80 + STATX_GID = 0x10 + STATX_INO = 0x100 + STATX_MODE = 0x2 + STATX_MTIME = 0x40 + STATX_NLINK = 0x4 + STATX_SIZE = 0x200 + STATX_TYPE = 0x1 + STATX_UID = 0x8 + STATX__RESERVED = 0x80000000 + SYNC_FILE_RANGE_WAIT_AFTER = 0x4 + SYNC_FILE_RANGE_WAIT_BEFORE = 0x1 + SYNC_FILE_RANGE_WRITE = 0x2 + SYSFS_MAGIC = 0x62656572 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x8 + TCFLSH = 0x5407 + TCGETA = 0x5401 + TCGETS = 0x540d + TCGETS2 = 0x4030542a + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_FASTOPEN_KEY = 0x21 + TCP_FASTOPEN_NO_COOKIE = 0x22 + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_EXT = 0x20 + TCP_MD5SIG_FLAG_PREFIX = 0x1 + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_ULP = 0x1f + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x5410 + TCSBRK = 0x5405 + TCSBRKP = 0x5486 + TCSETA = 0x5402 + TCSETAF = 0x5404 + TCSETAW = 0x5403 + TCSETS = 0x540e + TCSETS2 = 0x8030542b + TCSETSF = 0x5410 + TCSETSF2 = 0x8030542d + TCSETSW = 0x540f + TCSETSW2 = 0x8030542c + TCXONC = 0x5406 + TIOCCBRK = 0x5428 + TIOCCONS = 0x80047478 + TIOCEXCL = 0x740d + TIOCGDEV = 0x40045432 + TIOCGETD = 0x7400 + TIOCGETP = 0x7408 + TIOCGEXCL = 0x40045440 + TIOCGICOUNT = 0x5492 + TIOCGLCKTRMIOS = 0x548b + TIOCGLTC = 0x7474 + TIOCGPGRP = 0x40047477 + TIOCGPKT = 0x40045438 + TIOCGPTLCK = 0x40045439 + TIOCGPTN = 0x40045430 + TIOCGPTPEER = 0x20005441 + TIOCGRS485 = 0x4020542e + TIOCGSERIAL = 0x5484 + TIOCGSID = 0x7416 + TIOCGSOFTCAR = 0x5481 + TIOCGWINSZ = 0x40087468 + TIOCINQ = 0x467f + TIOCLINUX = 0x5483 + TIOCMBIC = 0x741c + TIOCMBIS = 0x741b + TIOCMGET = 0x741d + TIOCMIWAIT = 0x5491 + TIOCMSET = 0x741a + TIOCM_CAR = 0x100 + TIOCM_CD = 0x100 + TIOCM_CTS = 0x40 + TIOCM_DSR = 0x400 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x200 + TIOCM_RNG = 0x200 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x20 + TIOCM_ST = 0x10 + TIOCNOTTY = 0x5471 + TIOCNXCL = 0x740e + TIOCOUTQ = 0x7472 + TIOCPKT = 0x5470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x5480 + TIOCSERCONFIG = 0x5488 + TIOCSERGETLSR = 0x548e + TIOCSERGETMULTI = 0x548f + TIOCSERGSTRUCT = 0x548d + TIOCSERGWILD = 0x5489 + TIOCSERSETMULTI = 0x5490 + TIOCSERSWILD = 0x548a + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x7401 + TIOCSETN = 0x740a + TIOCSETP = 0x7409 + TIOCSIG = 0x80045436 + TIOCSLCKTRMIOS = 0x548c + TIOCSLTC = 0x7475 + TIOCSPGRP = 0x80047476 + TIOCSPTLCK = 0x80045431 + TIOCSRS485 = 0xc020542f + TIOCSSERIAL = 0x5485 + TIOCSSOFTCAR = 0x5482 + TIOCSTI = 0x5472 + TIOCSWINSZ = 0x80087467 + TIOCVHANGUP = 0x5437 + TMPFS_MAGIC = 0x1021994 + TOSTOP = 0x8000 + TPACKET_ALIGNMENT = 0x10 + TPACKET_HDRLEN = 0x34 + TP_STATUS_AVAILABLE = 0x0 + TP_STATUS_BLK_TMO = 0x20 + TP_STATUS_COPY = 0x2 + TP_STATUS_CSUMNOTREADY = 0x8 + TP_STATUS_CSUM_VALID = 0x80 + TP_STATUS_KERNEL = 0x0 + TP_STATUS_LOSING = 0x4 + TP_STATUS_SENDING = 0x2 + TP_STATUS_SEND_REQUEST = 0x1 + TP_STATUS_TS_RAW_HARDWARE = -0x80000000 + TP_STATUS_TS_SOFTWARE = 0x20000000 + TP_STATUS_TS_SYS_HARDWARE = 0x40000000 + TP_STATUS_USER = 0x1 + TP_STATUS_VLAN_TPID_VALID = 0x40 + TP_STATUS_VLAN_VALID = 0x10 + TP_STATUS_WRONG_FORMAT = 0x4 + TRACEFS_MAGIC = 0x74726163 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x800854d5 + TUNDETACHFILTER = 0x800854d6 + TUNGETFEATURES = 0x400454cf + TUNGETFILTER = 0x400854db + TUNGETIFF = 0x400454d2 + TUNGETSNDBUF = 0x400454d3 + TUNGETVNETBE = 0x400454df + TUNGETVNETHDRSZ = 0x400454d7 + TUNGETVNETLE = 0x400454dd + TUNSETDEBUG = 0x800454c9 + TUNSETFILTEREBPF = 0x400454e1 + TUNSETGROUP = 0x800454ce + TUNSETIFF = 0x800454ca + TUNSETIFINDEX = 0x800454da + TUNSETLINK = 0x800454cd + TUNSETNOCSUM = 0x800454c8 + TUNSETOFFLOAD = 0x800454d0 + TUNSETOWNER = 0x800454cc + TUNSETPERSIST = 0x800454cb + TUNSETQUEUE = 0x800454d9 + TUNSETSNDBUF = 0x800454d4 + TUNSETSTEERINGEBPF = 0x400454e0 + TUNSETTXFILTER = 0x800454d1 + TUNSETVNETBE = 0x800454de + TUNSETVNETHDRSZ = 0x800454d8 + TUNSETVNETLE = 0x800454dc + UBI_IOCATT = 0x80186f40 + UBI_IOCDET = 0x80046f41 + UBI_IOCEBCH = 0x80044f02 + UBI_IOCEBER = 0x80044f01 + UBI_IOCEBISMAP = 0x40044f05 + UBI_IOCEBMAP = 0x80084f03 + UBI_IOCEBUNMAP = 0x80044f04 + UBI_IOCMKVOL = 0x80986f00 + UBI_IOCRMVOL = 0x80046f01 + UBI_IOCRNVOL = 0x91106f03 + UBI_IOCRSVOL = 0x800c6f02 + UBI_IOCSETVOLPROP = 0x80104f06 + UBI_IOCVOLCRBLK = 0x80804f07 + UBI_IOCVOLRMBLK = 0x20004f08 + UBI_IOCVOLUP = 0x80084f00 + UDF_SUPER_MAGIC = 0x15013346 + UMOUNT_NOFOLLOW = 0x8 + USBDEVICE_SUPER_MAGIC = 0x9fa2 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + V9FS_MAGIC = 0x1021997 + VDISCARD = 0xd + VEOF = 0x10 + VEOL = 0x11 + VEOL2 = 0x6 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x4 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VSWTCH = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x40045702 + WDIOC_GETPRETIMEOUT = 0x40045709 + WDIOC_GETSTATUS = 0x40045701 + WDIOC_GETSUPPORT = 0x40285700 + WDIOC_GETTEMP = 0x40045703 + WDIOC_GETTIMELEFT = 0x4004570a + WDIOC_GETTIMEOUT = 0x40045707 + WDIOC_KEEPALIVE = 0x40045705 + WDIOC_SETOPTIONS = 0x40045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WIN_ACKMEDIACHANGE = 0xdb + WIN_CHECKPOWERMODE1 = 0xe5 + WIN_CHECKPOWERMODE2 = 0x98 + WIN_DEVICE_RESET = 0x8 + WIN_DIAGNOSE = 0x90 + WIN_DOORLOCK = 0xde + WIN_DOORUNLOCK = 0xdf + WIN_DOWNLOAD_MICROCODE = 0x92 + WIN_FLUSH_CACHE = 0xe7 + WIN_FLUSH_CACHE_EXT = 0xea + WIN_FORMAT = 0x50 + WIN_GETMEDIASTATUS = 0xda + WIN_IDENTIFY = 0xec + WIN_IDENTIFY_DMA = 0xee + WIN_IDLEIMMEDIATE = 0xe1 + WIN_INIT = 0x60 + WIN_MEDIAEJECT = 0xed + WIN_MULTREAD = 0xc4 + WIN_MULTREAD_EXT = 0x29 + WIN_MULTWRITE = 0xc5 + WIN_MULTWRITE_EXT = 0x39 + WIN_NOP = 0x0 + WIN_PACKETCMD = 0xa0 + WIN_PIDENTIFY = 0xa1 + WIN_POSTBOOT = 0xdc + WIN_PREBOOT = 0xdd + WIN_QUEUED_SERVICE = 0xa2 + WIN_READ = 0x20 + WIN_READDMA = 0xc8 + WIN_READDMA_EXT = 0x25 + WIN_READDMA_ONCE = 0xc9 + WIN_READDMA_QUEUED = 0xc7 + WIN_READDMA_QUEUED_EXT = 0x26 + WIN_READ_BUFFER = 0xe4 + WIN_READ_EXT = 0x24 + WIN_READ_LONG = 0x22 + WIN_READ_LONG_ONCE = 0x23 + WIN_READ_NATIVE_MAX = 0xf8 + WIN_READ_NATIVE_MAX_EXT = 0x27 + WIN_READ_ONCE = 0x21 + WIN_RECAL = 0x10 + WIN_RESTORE = 0x10 + WIN_SECURITY_DISABLE = 0xf6 + WIN_SECURITY_ERASE_PREPARE = 0xf3 + WIN_SECURITY_ERASE_UNIT = 0xf4 + WIN_SECURITY_FREEZE_LOCK = 0xf5 + WIN_SECURITY_SET_PASS = 0xf1 + WIN_SECURITY_UNLOCK = 0xf2 + WIN_SEEK = 0x70 + WIN_SETFEATURES = 0xef + WIN_SETIDLE1 = 0xe3 + WIN_SETIDLE2 = 0x97 + WIN_SETMULT = 0xc6 + WIN_SET_MAX = 0xf9 + WIN_SET_MAX_EXT = 0x37 + WIN_SLEEPNOW1 = 0xe6 + WIN_SLEEPNOW2 = 0x99 + WIN_SMART = 0xb0 + WIN_SPECIFY = 0x91 + WIN_SRST = 0x8 + WIN_STANDBY = 0xe2 + WIN_STANDBY2 = 0x96 + WIN_STANDBYNOW1 = 0xe0 + WIN_STANDBYNOW2 = 0x94 + WIN_VERIFY = 0x40 + WIN_VERIFY_EXT = 0x42 + WIN_VERIFY_ONCE = 0x41 + WIN_WRITE = 0x30 + WIN_WRITEDMA = 0xca + WIN_WRITEDMA_EXT = 0x35 + WIN_WRITEDMA_ONCE = 0xcb + WIN_WRITEDMA_QUEUED = 0xcc + WIN_WRITEDMA_QUEUED_EXT = 0x36 + WIN_WRITE_BUFFER = 0xe8 + WIN_WRITE_EXT = 0x34 + WIN_WRITE_LONG = 0x32 + WIN_WRITE_LONG_ONCE = 0x33 + WIN_WRITE_ONCE = 0x31 + WIN_WRITE_SAME = 0xe9 + WIN_WRITE_VERIFY = 0x3c + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x20 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XDP_COPY = 0x2 + XDP_FLAGS_DRV_MODE = 0x4 + XDP_FLAGS_HW_MODE = 0x8 + XDP_FLAGS_MASK = 0xf + XDP_FLAGS_MODES = 0xe + XDP_FLAGS_SKB_MODE = 0x2 + XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 + XDP_MMAP_OFFSETS = 0x1 + XDP_PGOFF_RX_RING = 0x0 + XDP_PGOFF_TX_RING = 0x80000000 + XDP_RX_RING = 0x2 + XDP_SHARED_UMEM = 0x1 + XDP_STATISTICS = 0x7 + XDP_TX_RING = 0x3 + XDP_UMEM_COMPLETION_RING = 0x6 + XDP_UMEM_FILL_RING = 0x5 + XDP_UMEM_PGOFF_COMPLETION_RING = 0x180000000 + XDP_UMEM_PGOFF_FILL_RING = 0x100000000 + XDP_UMEM_REG = 0x4 + XDP_ZEROCOPY = 0x4 + XENFS_SUPER_MAGIC = 0xabba1974 + XTABS = 0x1800 + ZSMALLOC_MAGIC = 0x58295829 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x7d) + EADDRNOTAVAIL = syscall.Errno(0x7e) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x7c) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x95) + EBADE = syscall.Errno(0x32) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x51) + EBADMSG = syscall.Errno(0x4d) + EBADR = syscall.Errno(0x33) + EBADRQC = syscall.Errno(0x36) + EBADSLT = syscall.Errno(0x37) + EBFONT = syscall.Errno(0x3b) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x9e) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x25) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x82) + ECONNREFUSED = syscall.Errno(0x92) + ECONNRESET = syscall.Errno(0x83) + EDEADLK = syscall.Errno(0x2d) + EDEADLOCK = syscall.Errno(0x38) + EDESTADDRREQ = syscall.Errno(0x60) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x49) + EDQUOT = syscall.Errno(0x46d) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x93) + EHOSTUNREACH = syscall.Errno(0x94) + EHWPOISON = syscall.Errno(0xa8) + EIDRM = syscall.Errno(0x24) + EILSEQ = syscall.Errno(0x58) + EINIT = syscall.Errno(0x8d) + EINPROGRESS = syscall.Errno(0x96) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x85) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x8b) + EKEYEXPIRED = syscall.Errno(0xa2) + EKEYREJECTED = syscall.Errno(0xa4) + EKEYREVOKED = syscall.Errno(0xa3) + EL2HLT = syscall.Errno(0x2c) + EL2NSYNC = syscall.Errno(0x26) + EL3HLT = syscall.Errno(0x27) + EL3RST = syscall.Errno(0x28) + ELIBACC = syscall.Errno(0x53) + ELIBBAD = syscall.Errno(0x54) + ELIBEXEC = syscall.Errno(0x57) + ELIBMAX = syscall.Errno(0x56) + ELIBSCN = syscall.Errno(0x55) + ELNRNG = syscall.Errno(0x29) + ELOOP = syscall.Errno(0x5a) + EMEDIUMTYPE = syscall.Errno(0xa0) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x61) + EMULTIHOP = syscall.Errno(0x4a) + ENAMETOOLONG = syscall.Errno(0x4e) + ENAVAIL = syscall.Errno(0x8a) + ENETDOWN = syscall.Errno(0x7f) + ENETRESET = syscall.Errno(0x81) + ENETUNREACH = syscall.Errno(0x80) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x35) + ENOBUFS = syscall.Errno(0x84) + ENOCSI = syscall.Errno(0x2b) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0xa1) + ENOLCK = syscall.Errno(0x2e) + ENOLINK = syscall.Errno(0x43) + ENOMEDIUM = syscall.Errno(0x9f) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x23) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x63) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x59) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x86) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x5d) + ENOTNAM = syscall.Errno(0x89) + ENOTRECOVERABLE = syscall.Errno(0xa6) + ENOTSOCK = syscall.Errno(0x5f) + ENOTSUP = syscall.Errno(0x7a) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x50) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x7a) + EOVERFLOW = syscall.Errno(0x4f) + EOWNERDEAD = syscall.Errno(0xa5) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x7b) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x78) + EPROTOTYPE = syscall.Errno(0x62) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x52) + EREMDEV = syscall.Errno(0x8e) + EREMOTE = syscall.Errno(0x42) + EREMOTEIO = syscall.Errno(0x8c) + ERESTART = syscall.Errno(0x5b) + ERFKILL = syscall.Errno(0xa7) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x8f) + ESOCKTNOSUPPORT = syscall.Errno(0x79) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x97) + ESTRPIPE = syscall.Errno(0x5c) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x91) + ETOOMANYREFS = syscall.Errno(0x90) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x87) + EUNATCH = syscall.Errno(0x2a) + EUSERS = syscall.Errno(0x5e) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x34) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x12) + SIGCLD = syscall.Signal(0x12) + SIGCONT = syscall.Signal(0x19) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x16) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x16) + SIGPROF = syscall.Signal(0x1d) + SIGPWR = syscall.Signal(0x13) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x17) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x18) + SIGTTIN = syscall.Signal(0x1a) + SIGTTOU = syscall.Signal(0x1b) + SIGURG = syscall.Signal(0x15) + SIGUSR1 = syscall.Signal(0x10) + SIGUSR2 = syscall.Signal(0x11) + SIGVTALRM = syscall.Signal(0x1c) + SIGWINCH = syscall.Signal(0x14) + SIGXCPU = syscall.Signal(0x1e) + SIGXFSZ = syscall.Signal(0x1f) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "no such device or address"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EAGAIN", "resource temporarily unavailable"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device or resource busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "invalid cross-device link"}, + {19, "ENODEV", "no such device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "numerical result out of range"}, + {35, "ENOMSG", "no message of desired type"}, + {36, "EIDRM", "identifier removed"}, + {37, "ECHRNG", "channel number out of range"}, + {38, "EL2NSYNC", "level 2 not synchronized"}, + {39, "EL3HLT", "level 3 halted"}, + {40, "EL3RST", "level 3 reset"}, + {41, "ELNRNG", "link number out of range"}, + {42, "EUNATCH", "protocol driver not attached"}, + {43, "ENOCSI", "no CSI structure available"}, + {44, "EL2HLT", "level 2 halted"}, + {45, "EDEADLK", "resource deadlock avoided"}, + {46, "ENOLCK", "no locks available"}, + {50, "EBADE", "invalid exchange"}, + {51, "EBADR", "invalid request descriptor"}, + {52, "EXFULL", "exchange full"}, + {53, "ENOANO", "no anode"}, + {54, "EBADRQC", "invalid request code"}, + {55, "EBADSLT", "invalid slot"}, + {56, "EDEADLOCK", "file locking deadlock error"}, + {59, "EBFONT", "bad font file format"}, + {60, "ENOSTR", "device not a stream"}, + {61, "ENODATA", "no data available"}, + {62, "ETIME", "timer expired"}, + {63, "ENOSR", "out of streams resources"}, + {64, "ENONET", "machine is not on the network"}, + {65, "ENOPKG", "package not installed"}, + {66, "EREMOTE", "object is remote"}, + {67, "ENOLINK", "link has been severed"}, + {68, "EADV", "advertise error"}, + {69, "ESRMNT", "srmount error"}, + {70, "ECOMM", "communication error on send"}, + {71, "EPROTO", "protocol error"}, + {73, "EDOTDOT", "RFS specific error"}, + {74, "EMULTIHOP", "multihop attempted"}, + {77, "EBADMSG", "bad message"}, + {78, "ENAMETOOLONG", "file name too long"}, + {79, "EOVERFLOW", "value too large for defined data type"}, + {80, "ENOTUNIQ", "name not unique on network"}, + {81, "EBADFD", "file descriptor in bad state"}, + {82, "EREMCHG", "remote address changed"}, + {83, "ELIBACC", "can not access a needed shared library"}, + {84, "ELIBBAD", "accessing a corrupted shared library"}, + {85, "ELIBSCN", ".lib section in a.out corrupted"}, + {86, "ELIBMAX", "attempting to link in too many shared libraries"}, + {87, "ELIBEXEC", "cannot exec a shared library directly"}, + {88, "EILSEQ", "invalid or incomplete multibyte or wide character"}, + {89, "ENOSYS", "function not implemented"}, + {90, "ELOOP", "too many levels of symbolic links"}, + {91, "ERESTART", "interrupted system call should be restarted"}, + {92, "ESTRPIPE", "streams pipe error"}, + {93, "ENOTEMPTY", "directory not empty"}, + {94, "EUSERS", "too many users"}, + {95, "ENOTSOCK", "socket operation on non-socket"}, + {96, "EDESTADDRREQ", "destination address required"}, + {97, "EMSGSIZE", "message too long"}, + {98, "EPROTOTYPE", "protocol wrong type for socket"}, + {99, "ENOPROTOOPT", "protocol not available"}, + {120, "EPROTONOSUPPORT", "protocol not supported"}, + {121, "ESOCKTNOSUPPORT", "socket type not supported"}, + {122, "ENOTSUP", "operation not supported"}, + {123, "EPFNOSUPPORT", "protocol family not supported"}, + {124, "EAFNOSUPPORT", "address family not supported by protocol"}, + {125, "EADDRINUSE", "address already in use"}, + {126, "EADDRNOTAVAIL", "cannot assign requested address"}, + {127, "ENETDOWN", "network is down"}, + {128, "ENETUNREACH", "network is unreachable"}, + {129, "ENETRESET", "network dropped connection on reset"}, + {130, "ECONNABORTED", "software caused connection abort"}, + {131, "ECONNRESET", "connection reset by peer"}, + {132, "ENOBUFS", "no buffer space available"}, + {133, "EISCONN", "transport endpoint is already connected"}, + {134, "ENOTCONN", "transport endpoint is not connected"}, + {135, "EUCLEAN", "structure needs cleaning"}, + {137, "ENOTNAM", "not a XENIX named type file"}, + {138, "ENAVAIL", "no XENIX semaphores available"}, + {139, "EISNAM", "is a named type file"}, + {140, "EREMOTEIO", "remote I/O error"}, + {141, "EINIT", "unknown error 141"}, + {142, "EREMDEV", "unknown error 142"}, + {143, "ESHUTDOWN", "cannot send after transport endpoint shutdown"}, + {144, "ETOOMANYREFS", "too many references: cannot splice"}, + {145, "ETIMEDOUT", "connection timed out"}, + {146, "ECONNREFUSED", "connection refused"}, + {147, "EHOSTDOWN", "host is down"}, + {148, "EHOSTUNREACH", "no route to host"}, + {149, "EALREADY", "operation already in progress"}, + {150, "EINPROGRESS", "operation now in progress"}, + {151, "ESTALE", "stale file handle"}, + {158, "ECANCELED", "operation canceled"}, + {159, "ENOMEDIUM", "no medium found"}, + {160, "EMEDIUMTYPE", "wrong medium type"}, + {161, "ENOKEY", "required key not available"}, + {162, "EKEYEXPIRED", "key has expired"}, + {163, "EKEYREVOKED", "key has been revoked"}, + {164, "EKEYREJECTED", "key was rejected by service"}, + {165, "EOWNERDEAD", "owner died"}, + {166, "ENOTRECOVERABLE", "state not recoverable"}, + {167, "ERFKILL", "operation not possible due to RF-kill"}, + {168, "EHWPOISON", "memory page has hardware error"}, + {1133, "EDQUOT", "disk quota exceeded"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/breakpoint trap"}, + {6, "SIGABRT", "aborted"}, + {7, "SIGEMT", "EMT trap"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGBUS", "bus error"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGSYS", "bad system call"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGUSR1", "user defined signal 1"}, + {17, "SIGUSR2", "user defined signal 2"}, + {18, "SIGCHLD", "child exited"}, + {19, "SIGPWR", "power failure"}, + {20, "SIGWINCH", "window changed"}, + {21, "SIGURG", "urgent I/O condition"}, + {22, "SIGIO", "I/O possible"}, + {23, "SIGSTOP", "stopped (signal)"}, + {24, "SIGTSTP", "stopped"}, + {25, "SIGCONT", "continued"}, + {26, "SIGTTIN", "stopped (tty input)"}, + {27, "SIGTTOU", "stopped (tty output)"}, + {28, "SIGVTALRM", "virtual timer expired"}, + {29, "SIGPROF", "profiling timer expired"}, + {30, "SIGXCPU", "CPU time limit exceeded"}, + {31, "SIGXFSZ", "file size limit exceeded"}, +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go new file mode 100644 index 00000000..82f44ce3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go @@ -0,0 +1,2762 @@ +// mkerrors.sh -Wall -Werror -static -I/tmp/include +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build ppc64,linux + +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go + +package unix + +import "syscall" + +const ( + AAFS_MAGIC = 0x5a3c69f0 + ADFS_SUPER_MAGIC = 0xadf5 + AFFS_SUPER_MAGIC = 0xadff + AFS_FS_MAGIC = 0x6b414653 + AFS_SUPER_MAGIC = 0x5346414f + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2c + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + AF_XDP = 0x2c + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ANON_INODE_FS_MAGIC = 0x9041934 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_RAWIP = 0x207 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + AUTOFS_SUPER_MAGIC = 0x187 + B0 = 0x0 + B1000000 = 0x17 + B110 = 0x3 + B115200 = 0x11 + B1152000 = 0x18 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x19 + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x1a + B230400 = 0x12 + B2400 = 0xb + B2500000 = 0x1b + B300 = 0x7 + B3000000 = 0x1c + B3500000 = 0x1d + B38400 = 0xf + B4000000 = 0x1e + B460800 = 0x13 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x14 + B57600 = 0x10 + B576000 = 0x15 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x16 + B9600 = 0xd + BALLOON_KVM_MAGIC = 0x13661366 + BDEVFS_MAGIC = 0x62646576 + BINFMTFS_MAGIC = 0x42494e4d + BLKBSZGET = 0x40081270 + BLKBSZSET = 0x80081271 + BLKFLSBUF = 0x20001261 + BLKFRAGET = 0x20001265 + BLKFRASET = 0x20001264 + BLKGETSIZE = 0x20001260 + BLKGETSIZE64 = 0x40081272 + BLKPBSZGET = 0x2000127b + BLKRAGET = 0x20001263 + BLKRASET = 0x20001262 + BLKROGET = 0x2000125e + BLKROSET = 0x2000125d + BLKRRPART = 0x2000125f + BLKSECTGET = 0x20001267 + BLKSECTSET = 0x20001266 + BLKSSZGET = 0x20001268 + BOTHER = 0x1f + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_FS_MAGIC = 0xcafe4a11 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x8000 + BSDLY = 0x8000 + BTRFS_SUPER_MAGIC = 0x9123683e + BTRFS_TEST_MAGIC = 0x73727279 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0xff + CBAUDEX = 0x0 + CFLUSH = 0xf + CGROUP2_SUPER_MAGIC = 0x63677270 + CGROUP_SUPER_MAGIC = 0x27e0eb + CIBAUD = 0xff0000 + CLOCAL = 0x8000 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CODA_SUPER_MAGIC = 0x73757245 + CR0 = 0x0 + CR1 = 0x1000 + CR2 = 0x2000 + CR3 = 0x3000 + CRAMFS_MAGIC = 0x28cd3d45 + CRDLY = 0x3000 + CREAD = 0x800 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIGNAL = 0xff + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + DAXFS_MAGIC = 0x64646178 + DEBUGFS_MAGIC = 0x64626720 + DEVPTS_SUPER_MAGIC = 0x1cd1 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + ECRYPTFS_SUPER_MAGIC = 0xf15f + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x800 + EFD_SEMAPHORE = 0x1 + EFIVARFS_MAGIC = 0xde5e81e4 + EFS_SUPER_MAGIC = 0x414a53 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_ERSPAN = 0x88be + ETH_P_ERSPAN2 = 0x22eb + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IFE = 0xed3e + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MAP = 0xf9 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_NSH = 0x894f + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PREAUTH = 0x88c7 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXABYTE_ENABLE_NEST = 0xf0 + EXT2_SUPER_MAGIC = 0xef53 + EXT3_SUPER_MAGIC = 0xef53 + EXT4_SUPER_MAGIC = 0xef53 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000000 + F2FS_SUPER_MAGIC = 0xf2f52010 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x4000 + FFDLY = 0x4000 + FLUSHO = 0x800000 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_ENCRYPTION_MODE_SPECK128_256_CTS = 0x8 + FS_ENCRYPTION_MODE_SPECK128_256_XTS = 0x7 + FS_IOC_GET_ENCRYPTION_POLICY = 0x800c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x80106614 + FS_IOC_SET_ENCRYPTION_POLICY = 0x400c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0x3 + FUTEXFS_SUPER_MAGIC = 0xbad1dea + F_ADD_SEALS = 0x409 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0x5 + F_GETLK64 = 0xc + F_GETOWN = 0x9 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_GET_FILE_RW_HINT = 0x40d + F_GET_RW_HINT = 0x40b + F_GET_SEALS = 0x40a + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SEAL_GROW = 0x4 + F_SEAL_SEAL = 0x1 + F_SEAL_SHRINK = 0x2 + F_SEAL_WRITE = 0x8 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x6 + F_SETLK64 = 0xd + F_SETLKW = 0x7 + F_SETLKW64 = 0xe + F_SETOWN = 0x8 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SET_FILE_RW_HINT = 0x40e + F_SET_RW_HINT = 0x40c + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HDIO_DRIVE_CMD = 0x31f + HDIO_DRIVE_CMD_AEB = 0x31e + HDIO_DRIVE_CMD_HDR_SIZE = 0x4 + HDIO_DRIVE_HOB_HDR_SIZE = 0x8 + HDIO_DRIVE_RESET = 0x31c + HDIO_DRIVE_TASK = 0x31e + HDIO_DRIVE_TASKFILE = 0x31d + HDIO_DRIVE_TASK_HDR_SIZE = 0x8 + HDIO_GETGEO = 0x301 + HDIO_GET_32BIT = 0x309 + HDIO_GET_ACOUSTIC = 0x30f + HDIO_GET_ADDRESS = 0x310 + HDIO_GET_BUSSTATE = 0x31a + HDIO_GET_DMA = 0x30b + HDIO_GET_IDENTITY = 0x30d + HDIO_GET_KEEPSETTINGS = 0x308 + HDIO_GET_MULTCOUNT = 0x304 + HDIO_GET_NICE = 0x30c + HDIO_GET_NOWERR = 0x30a + HDIO_GET_QDMA = 0x305 + HDIO_GET_UNMASKINTR = 0x302 + HDIO_GET_WCACHE = 0x30e + HDIO_OBSOLETE_IDENTITY = 0x307 + HDIO_SCAN_HWIF = 0x328 + HDIO_SET_32BIT = 0x324 + HDIO_SET_ACOUSTIC = 0x32c + HDIO_SET_ADDRESS = 0x32f + HDIO_SET_BUSSTATE = 0x32d + HDIO_SET_DMA = 0x326 + HDIO_SET_KEEPSETTINGS = 0x323 + HDIO_SET_MULTCOUNT = 0x321 + HDIO_SET_NICE = 0x329 + HDIO_SET_NOWERR = 0x325 + HDIO_SET_PIO_MODE = 0x327 + HDIO_SET_QDMA = 0x32e + HDIO_SET_UNMASKINTR = 0x322 + HDIO_SET_WCACHE = 0x32b + HDIO_SET_XFER = 0x306 + HDIO_TRISTATE_HWIF = 0x31b + HDIO_UNREGISTER_HWIF = 0x32a + HOSTFS_SUPER_MAGIC = 0xc0ffee + HPFS_SUPER_MAGIC = 0xf995e849 + HUGETLBFS_MAGIC = 0x958458f6 + HUPCL = 0x4000 + IBSHIFT = 0x10 + ICANON = 0x100 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x400 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x9 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NAPI = 0x10 + IFF_NAPI_FRAGS = 0x20 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x800 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_FREEBIND = 0x4e + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x80 + ISOFS_SUPER_MAGIC = 0x9660 + ISTRIP = 0x20 + IUCLC = 0x1000 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + JFFS2_SUPER_MAGIC = 0x72b6 + KEXEC_ARCH_386 = 0x30000 + KEXEC_ARCH_68K = 0x40000 + KEXEC_ARCH_AARCH64 = 0xb70000 + KEXEC_ARCH_ARM = 0x280000 + KEXEC_ARCH_DEFAULT = 0x0 + KEXEC_ARCH_IA_64 = 0x320000 + KEXEC_ARCH_MASK = 0xffff0000 + KEXEC_ARCH_MIPS = 0x80000 + KEXEC_ARCH_MIPS_LE = 0xa0000 + KEXEC_ARCH_PPC = 0x140000 + KEXEC_ARCH_PPC64 = 0x150000 + KEXEC_ARCH_S390 = 0x160000 + KEXEC_ARCH_SH = 0x2a0000 + KEXEC_ARCH_X86_64 = 0x3e0000 + KEXEC_FILE_NO_INITRAMFS = 0x4 + KEXEC_FILE_ON_CRASH = 0x2 + KEXEC_FILE_UNLOAD = 0x1 + KEXEC_ON_CRASH = 0x1 + KEXEC_PRESERVE_CONTEXT = 0x2 + KEXEC_SEGMENT_MAX = 0x10 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_NEGATE = 0xd + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_KEEPONFORK = 0x13 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MADV_WIPEONFORK = 0x12 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_FIXED_NOREPLACE = 0x100000 + MAP_GROWSDOWN = 0x100 + MAP_HUGETLB = 0x40000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x80 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x40 + MAP_POPULATE = 0x8000 + MAP_PRIVATE = 0x2 + MAP_SHARED = 0x1 + MAP_SHARED_VALIDATE = 0x3 + MAP_STACK = 0x20000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x2000 + MCL_FUTURE = 0x4000 + MCL_ONFAULT = 0x8000 + MFD_ALLOW_SEALING = 0x2 + MFD_CLOEXEC = 0x1 + MFD_HUGETLB = 0x4 + MFD_HUGE_16GB = -0x78000000 + MFD_HUGE_16MB = 0x60000000 + MFD_HUGE_1GB = 0x78000000 + MFD_HUGE_1MB = 0x50000000 + MFD_HUGE_256MB = 0x70000000 + MFD_HUGE_2GB = 0x7c000000 + MFD_HUGE_2MB = 0x54000000 + MFD_HUGE_32MB = 0x64000000 + MFD_HUGE_512KB = 0x4c000000 + MFD_HUGE_512MB = 0x74000000 + MFD_HUGE_64KB = 0x40000000 + MFD_HUGE_8MB = 0x5c000000 + MFD_HUGE_MASK = 0x3f + MFD_HUGE_SHIFT = 0x1a + MINIX2_SUPER_MAGIC = 0x2468 + MINIX2_SUPER_MAGIC2 = 0x2478 + MINIX3_SUPER_MAGIC = 0x4d5a + MINIX_SUPER_MAGIC = 0x137f + MINIX_SUPER_MAGIC2 = 0x138f + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSDOS_SUPER_MAGIC = 0x4d44 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MSG_ZEROCOPY = 0x4000000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + MTD_INODE_FS_MAGIC = 0x11307854 + NAME_MAX = 0xff + NCP_SUPER_MAGIC = 0x564c + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NETNSA_MAX = 0x3 + NETNSA_NSID_NOT_ASSIGNED = -0x1 + NFNETLINK_V0 = 0x0 + NFNLGRP_ACCT_QUOTA = 0x8 + NFNLGRP_CONNTRACK_DESTROY = 0x3 + NFNLGRP_CONNTRACK_EXP_DESTROY = 0x6 + NFNLGRP_CONNTRACK_EXP_NEW = 0x4 + NFNLGRP_CONNTRACK_EXP_UPDATE = 0x5 + NFNLGRP_CONNTRACK_NEW = 0x1 + NFNLGRP_CONNTRACK_UPDATE = 0x2 + NFNLGRP_MAX = 0x9 + NFNLGRP_NFTABLES = 0x7 + NFNLGRP_NFTRACE = 0x9 + NFNLGRP_NONE = 0x0 + NFNL_BATCH_MAX = 0x1 + NFNL_MSG_BATCH_BEGIN = 0x10 + NFNL_MSG_BATCH_END = 0x11 + NFNL_NFA_NEST = 0x8000 + NFNL_SUBSYS_ACCT = 0x7 + NFNL_SUBSYS_COUNT = 0xc + NFNL_SUBSYS_CTHELPER = 0x9 + NFNL_SUBSYS_CTNETLINK = 0x1 + NFNL_SUBSYS_CTNETLINK_EXP = 0x2 + NFNL_SUBSYS_CTNETLINK_TIMEOUT = 0x8 + NFNL_SUBSYS_IPSET = 0x6 + NFNL_SUBSYS_NFTABLES = 0xa + NFNL_SUBSYS_NFT_COMPAT = 0xb + NFNL_SUBSYS_NONE = 0x0 + NFNL_SUBSYS_OSF = 0x5 + NFNL_SUBSYS_QUEUE = 0x3 + NFNL_SUBSYS_ULOG = 0x4 + NFS_SUPER_MAGIC = 0x6969 + NILFS_SUPER_MAGIC = 0x3434 + NL0 = 0x0 + NL1 = 0x100 + NL2 = 0x200 + NL3 = 0x300 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x300 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_NONREC = 0x100 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80000000 + NSFS_MAGIC = 0x6e736673 + OCFS2_SUPER_MAGIC = 0x7461636f + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x4 + ONLCR = 0x2 + ONLRET = 0x20 + ONOCR = 0x10 + OPENPROM_SUPER_MAGIC = 0x9fa1 + OPOST = 0x1 + OVERLAYFS_SUPER_MAGIC = 0x794c7630 + O_ACCMODE = 0x3 + O_APPEND = 0x400 + O_ASYNC = 0x2000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x40 + O_DIRECT = 0x20000 + O_DIRECTORY = 0x4000 + O_DSYNC = 0x1000 + O_EXCL = 0x80 + O_FSYNC = 0x101000 + O_LARGEFILE = 0x0 + O_NDELAY = 0x800 + O_NOATIME = 0x40000 + O_NOCTTY = 0x100 + O_NOFOLLOW = 0x8000 + O_NONBLOCK = 0x800 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x101000 + O_SYNC = 0x101000 + O_TMPFILE = 0x404000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x1000 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PERF_EVENT_IOC_DISABLE = 0x20002401 + PERF_EVENT_IOC_ENABLE = 0x20002400 + PERF_EVENT_IOC_ID = 0x40082407 + PERF_EVENT_IOC_MODIFY_ATTRIBUTES = 0x8008240b + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x80042409 + PERF_EVENT_IOC_PERIOD = 0x80082404 + PERF_EVENT_IOC_QUERY_BPF = 0xc008240a + PERF_EVENT_IOC_REFRESH = 0x20002402 + PERF_EVENT_IOC_RESET = 0x20002403 + PERF_EVENT_IOC_SET_BPF = 0x80042408 + PERF_EVENT_IOC_SET_FILTER = 0x80082406 + PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 + PIPEFS_MAGIC = 0x50495045 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROC_SUPER_MAGIC = 0x9fa0 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_SAO = 0x10 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_SPECULATION_CTRL = 0x34 + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffffffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_SPECULATION_CTRL = 0x35 + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_SPEC_DISABLE = 0x4 + PR_SPEC_ENABLE = 0x2 + PR_SPEC_FORCE_DISABLE = 0x8 + PR_SPEC_NOT_AFFECTED = 0x0 + PR_SPEC_PRCTL = 0x1 + PR_SPEC_STORE_BYPASS = 0x0 + PR_SVE_GET_VL = 0x33 + PR_SVE_SET_VL = 0x32 + PR_SVE_SET_VL_ONEXEC = 0x40000 + PR_SVE_VL_INHERIT = 0x20000 + PR_SVE_VL_LEN_MASK = 0xffff + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PSTOREFS_MAGIC = 0x6165676c + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETEVRREGS = 0x14 + PTRACE_GETFPREGS = 0xe + PTRACE_GETREGS = 0xc + PTRACE_GETREGS64 = 0x16 + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GETVRREGS = 0x12 + PTRACE_GETVSRREGS = 0x1b + PTRACE_GET_DEBUGREG = 0x19 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKETEXT = 0x4 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SECCOMP_GET_METADATA = 0x420d + PTRACE_SEIZE = 0x4206 + PTRACE_SETEVRREGS = 0x15 + PTRACE_SETFPREGS = 0xf + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGS64 = 0x17 + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SETVRREGS = 0x13 + PTRACE_SETVSRREGS = 0x1c + PTRACE_SET_DEBUGREG = 0x1a + PTRACE_SINGLEBLOCK = 0x100 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_TRACEME = 0x0 + PT_CCR = 0x26 + PT_CTR = 0x23 + PT_DAR = 0x29 + PT_DSCR = 0x2c + PT_DSISR = 0x2a + PT_FPR0 = 0x30 + PT_FPSCR = 0x50 + PT_LNK = 0x24 + PT_MSR = 0x21 + PT_NIP = 0x20 + PT_ORIG_R3 = 0x22 + PT_R0 = 0x0 + PT_R1 = 0x1 + PT_R10 = 0xa + PT_R11 = 0xb + PT_R12 = 0xc + PT_R13 = 0xd + PT_R14 = 0xe + PT_R15 = 0xf + PT_R16 = 0x10 + PT_R17 = 0x11 + PT_R18 = 0x12 + PT_R19 = 0x13 + PT_R2 = 0x2 + PT_R20 = 0x14 + PT_R21 = 0x15 + PT_R22 = 0x16 + PT_R23 = 0x17 + PT_R24 = 0x18 + PT_R25 = 0x19 + PT_R26 = 0x1a + PT_R27 = 0x1b + PT_R28 = 0x1c + PT_R29 = 0x1d + PT_R3 = 0x3 + PT_R30 = 0x1e + PT_R31 = 0x1f + PT_R4 = 0x4 + PT_R5 = 0x5 + PT_R6 = 0x6 + PT_R7 = 0x7 + PT_R8 = 0x8 + PT_R9 = 0x9 + PT_REGS_COUNT = 0x2c + PT_RESULT = 0x2b + PT_SOFTE = 0x27 + PT_TRAP = 0x28 + PT_VR0 = 0x52 + PT_VRSAVE = 0x94 + PT_VSCR = 0x93 + PT_VSR0 = 0x96 + PT_VSR31 = 0xd4 + PT_XER = 0x25 + QNX4_SUPER_MAGIC = 0x2f + QNX6_SUPER_MAGIC = 0x68191122 + RAMFS_MAGIC = 0x858458f6 + RDTGROUP_SUPER_MAGIC = 0x7655821 + REISERFS_SUPER_MAGIC = 0x52654973 + RENAME_EXCHANGE = 0x2 + RENAME_NOREPLACE = 0x1 + RENAME_WHITEOUT = 0x4 + RLIMIT_AS = 0x9 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x8 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x7 + RLIMIT_NPROC = 0x6 + RLIMIT_RSS = 0x5 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FASTOPEN_NO_COOKIE = 0x11 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x11 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1d + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTC_AF = 0x20 + RTC_AIE_OFF = 0x20007002 + RTC_AIE_ON = 0x20007001 + RTC_ALM_READ = 0x40247008 + RTC_ALM_SET = 0x80247007 + RTC_EPOCH_READ = 0x4008700d + RTC_EPOCH_SET = 0x8008700e + RTC_IRQF = 0x80 + RTC_IRQP_READ = 0x4008700b + RTC_IRQP_SET = 0x8008700c + RTC_MAX_FREQ = 0x2000 + RTC_PF = 0x40 + RTC_PIE_OFF = 0x20007006 + RTC_PIE_ON = 0x20007005 + RTC_PLL_GET = 0x40207011 + RTC_PLL_SET = 0x80207012 + RTC_RD_TIME = 0x40247009 + RTC_SET_TIME = 0x8024700a + RTC_UF = 0x10 + RTC_UIE_OFF = 0x20007004 + RTC_UIE_ON = 0x20007003 + RTC_VL_CLR = 0x20007014 + RTC_VL_READ = 0x40047013 + RTC_WIE_OFF = 0x20007010 + RTC_WIE_ON = 0x2000700f + RTC_WKALM_RD = 0x40287010 + RTC_WKALM_SET = 0x8028700f + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELCHAIN = 0x65 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETCHAIN = 0x66 + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x67 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWCHAIN = 0x64 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x16 + RTM_NR_MSGTYPES = 0x58 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BGP = 0xba + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_EIGRP = 0xc0 + RTPROT_GATED = 0x8 + RTPROT_ISIS = 0xbb + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_OSPF = 0xbc + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_RIP = 0xbd + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_TXTIME = 0x3d + SCM_WIFI_STATUS = 0x29 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SECURITYFS_MAGIC = 0x73636673 + SELINUX_MAGIC = 0xf97cff8c + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x8905 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x8904 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x4004667f + SIOCOUTQ = 0x40047473 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x8902 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SMACK_MAGIC = 0x43415d53 + SMART_AUTOSAVE = 0xd2 + SMART_AUTO_OFFLINE = 0xdb + SMART_DISABLE = 0xd9 + SMART_ENABLE = 0xd8 + SMART_HCYL_PASS = 0xc2 + SMART_IMMEDIATE_OFFLINE = 0xd4 + SMART_LCYL_PASS = 0x4f + SMART_READ_LOG_SECTOR = 0xd5 + SMART_READ_THRESHOLDS = 0xd1 + SMART_READ_VALUES = 0xd0 + SMART_SAVE = 0xd3 + SMART_STATUS = 0xda + SMART_WRITE_LOG_SECTOR = 0xd6 + SMART_WRITE_THRESHOLDS = 0xd7 + SMB_SUPER_MAGIC = 0x517b + SOCKFS_MAGIC = 0x534f434b + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x2 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x800 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0x1 + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_TLS = 0x11a + SOL_X25 = 0x106 + SOL_XDP = 0x11b + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1e + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x6 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x27 + SO_DONTROUTE = 0x5 + SO_ERROR = 0x4 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x9 + SO_LINGER = 0xd + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0xa + SO_PASSCRED = 0x14 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x15 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1f + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x26 + SO_RCVBUF = 0x8 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x10 + SO_RCVTIMEO = 0x12 + SO_REUSEADDR = 0x2 + SO_REUSEPORT = 0xf + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x7 + SO_SNDBUFFORCE = 0x20 + SO_SNDLOWAT = 0x11 + SO_SNDTIMEO = 0x13 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TXTIME = 0x3d + SO_TYPE = 0x3 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SO_ZEROCOPY = 0x3c + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + SQUASHFS_MAGIC = 0x73717368 + STACK_END_MAGIC = 0x57ac6e9d + STATX_ALL = 0xfff + STATX_ATIME = 0x20 + STATX_ATTR_APPEND = 0x20 + STATX_ATTR_AUTOMOUNT = 0x1000 + STATX_ATTR_COMPRESSED = 0x4 + STATX_ATTR_ENCRYPTED = 0x800 + STATX_ATTR_IMMUTABLE = 0x10 + STATX_ATTR_NODUMP = 0x40 + STATX_BASIC_STATS = 0x7ff + STATX_BLOCKS = 0x400 + STATX_BTIME = 0x800 + STATX_CTIME = 0x80 + STATX_GID = 0x10 + STATX_INO = 0x100 + STATX_MODE = 0x2 + STATX_MTIME = 0x40 + STATX_NLINK = 0x4 + STATX_SIZE = 0x200 + STATX_TYPE = 0x1 + STATX_UID = 0x8 + STATX__RESERVED = 0x80000000 + SYNC_FILE_RANGE_WAIT_AFTER = 0x4 + SYNC_FILE_RANGE_WAIT_BEFORE = 0x1 + SYNC_FILE_RANGE_WRITE = 0x2 + SYSFS_MAGIC = 0x62656572 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x400 + TAB2 = 0x800 + TAB3 = 0xc00 + TABDLY = 0xc00 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x8 + TCFLSH = 0x2000741f + TCGETA = 0x40147417 + TCGETS = 0x402c7413 + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_FASTOPEN_KEY = 0x21 + TCP_FASTOPEN_NO_COOKIE = 0x22 + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_EXT = 0x20 + TCP_MD5SIG_FLAG_PREFIX = 0x1 + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_ULP = 0x1f + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x2 + TCSBRK = 0x2000741d + TCSBRKP = 0x5425 + TCSETA = 0x80147418 + TCSETAF = 0x8014741c + TCSETAW = 0x80147419 + TCSETS = 0x802c7414 + TCSETSF = 0x802c7416 + TCSETSW = 0x802c7415 + TCXONC = 0x2000741e + TIOCCBRK = 0x5428 + TIOCCONS = 0x541d + TIOCEXCL = 0x540c + TIOCGDEV = 0x40045432 + TIOCGETC = 0x40067412 + TIOCGETD = 0x5424 + TIOCGETP = 0x40067408 + TIOCGEXCL = 0x40045440 + TIOCGICOUNT = 0x545d + TIOCGLCKTRMIOS = 0x5456 + TIOCGLTC = 0x40067474 + TIOCGPGRP = 0x40047477 + TIOCGPKT = 0x40045438 + TIOCGPTLCK = 0x40045439 + TIOCGPTN = 0x40045430 + TIOCGPTPEER = 0x20005441 + TIOCGRS485 = 0x542e + TIOCGSERIAL = 0x541e + TIOCGSID = 0x5429 + TIOCGSOFTCAR = 0x5419 + TIOCGWINSZ = 0x40087468 + TIOCINQ = 0x4004667f + TIOCLINUX = 0x541c + TIOCMBIC = 0x5417 + TIOCMBIS = 0x5416 + TIOCMGET = 0x5415 + TIOCMIWAIT = 0x545c + TIOCMSET = 0x5418 + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_LOOP = 0x8000 + TIOCM_OUT1 = 0x2000 + TIOCM_OUT2 = 0x4000 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x5422 + TIOCNXCL = 0x540d + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x5420 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x540e + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSER_TEMT = 0x1 + TIOCSETC = 0x80067411 + TIOCSETD = 0x5423 + TIOCSETN = 0x8006740a + TIOCSETP = 0x80067409 + TIOCSIG = 0x80045436 + TIOCSLCKTRMIOS = 0x5457 + TIOCSLTC = 0x80067475 + TIOCSPGRP = 0x80047476 + TIOCSPTLCK = 0x80045431 + TIOCSRS485 = 0x542f + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x541a + TIOCSTART = 0x2000746e + TIOCSTI = 0x5412 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCVHANGUP = 0x5437 + TMPFS_MAGIC = 0x1021994 + TOSTOP = 0x400000 + TPACKET_ALIGNMENT = 0x10 + TPACKET_HDRLEN = 0x34 + TP_STATUS_AVAILABLE = 0x0 + TP_STATUS_BLK_TMO = 0x20 + TP_STATUS_COPY = 0x2 + TP_STATUS_CSUMNOTREADY = 0x8 + TP_STATUS_CSUM_VALID = 0x80 + TP_STATUS_KERNEL = 0x0 + TP_STATUS_LOSING = 0x4 + TP_STATUS_SENDING = 0x2 + TP_STATUS_SEND_REQUEST = 0x1 + TP_STATUS_TS_RAW_HARDWARE = -0x80000000 + TP_STATUS_TS_SOFTWARE = 0x20000000 + TP_STATUS_TS_SYS_HARDWARE = 0x40000000 + TP_STATUS_USER = 0x1 + TP_STATUS_VLAN_TPID_VALID = 0x40 + TP_STATUS_VLAN_VALID = 0x10 + TP_STATUS_WRONG_FORMAT = 0x4 + TRACEFS_MAGIC = 0x74726163 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x801054d5 + TUNDETACHFILTER = 0x801054d6 + TUNGETFEATURES = 0x400454cf + TUNGETFILTER = 0x401054db + TUNGETIFF = 0x400454d2 + TUNGETSNDBUF = 0x400454d3 + TUNGETVNETBE = 0x400454df + TUNGETVNETHDRSZ = 0x400454d7 + TUNGETVNETLE = 0x400454dd + TUNSETDEBUG = 0x800454c9 + TUNSETFILTEREBPF = 0x400454e1 + TUNSETGROUP = 0x800454ce + TUNSETIFF = 0x800454ca + TUNSETIFINDEX = 0x800454da + TUNSETLINK = 0x800454cd + TUNSETNOCSUM = 0x800454c8 + TUNSETOFFLOAD = 0x800454d0 + TUNSETOWNER = 0x800454cc + TUNSETPERSIST = 0x800454cb + TUNSETQUEUE = 0x800454d9 + TUNSETSNDBUF = 0x800454d4 + TUNSETSTEERINGEBPF = 0x400454e0 + TUNSETTXFILTER = 0x800454d1 + TUNSETVNETBE = 0x800454de + TUNSETVNETHDRSZ = 0x800454d8 + TUNSETVNETLE = 0x800454dc + UBI_IOCATT = 0x80186f40 + UBI_IOCDET = 0x80046f41 + UBI_IOCEBCH = 0x80044f02 + UBI_IOCEBER = 0x80044f01 + UBI_IOCEBISMAP = 0x40044f05 + UBI_IOCEBMAP = 0x80084f03 + UBI_IOCEBUNMAP = 0x80044f04 + UBI_IOCMKVOL = 0x80986f00 + UBI_IOCRMVOL = 0x80046f01 + UBI_IOCRNVOL = 0x91106f03 + UBI_IOCRSVOL = 0x800c6f02 + UBI_IOCSETVOLPROP = 0x80104f06 + UBI_IOCVOLCRBLK = 0x80804f07 + UBI_IOCVOLRMBLK = 0x20004f08 + UBI_IOCVOLUP = 0x80084f00 + UDF_SUPER_MAGIC = 0x15013346 + UMOUNT_NOFOLLOW = 0x8 + USBDEVICE_SUPER_MAGIC = 0x9fa2 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + V9FS_MAGIC = 0x1021997 + VDISCARD = 0x10 + VEOF = 0x4 + VEOL = 0x6 + VEOL2 = 0x8 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x5 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xb + VSTART = 0xd + VSTOP = 0xe + VSUSP = 0xc + VSWTC = 0x9 + VT0 = 0x0 + VT1 = 0x10000 + VTDLY = 0x10000 + VTIME = 0x7 + VWERASE = 0xa + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x40045702 + WDIOC_GETPRETIMEOUT = 0x40045709 + WDIOC_GETSTATUS = 0x40045701 + WDIOC_GETSUPPORT = 0x40285700 + WDIOC_GETTEMP = 0x40045703 + WDIOC_GETTIMELEFT = 0x4004570a + WDIOC_GETTIMEOUT = 0x40045707 + WDIOC_KEEPALIVE = 0x40045705 + WDIOC_SETOPTIONS = 0x40045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WIN_ACKMEDIACHANGE = 0xdb + WIN_CHECKPOWERMODE1 = 0xe5 + WIN_CHECKPOWERMODE2 = 0x98 + WIN_DEVICE_RESET = 0x8 + WIN_DIAGNOSE = 0x90 + WIN_DOORLOCK = 0xde + WIN_DOORUNLOCK = 0xdf + WIN_DOWNLOAD_MICROCODE = 0x92 + WIN_FLUSH_CACHE = 0xe7 + WIN_FLUSH_CACHE_EXT = 0xea + WIN_FORMAT = 0x50 + WIN_GETMEDIASTATUS = 0xda + WIN_IDENTIFY = 0xec + WIN_IDENTIFY_DMA = 0xee + WIN_IDLEIMMEDIATE = 0xe1 + WIN_INIT = 0x60 + WIN_MEDIAEJECT = 0xed + WIN_MULTREAD = 0xc4 + WIN_MULTREAD_EXT = 0x29 + WIN_MULTWRITE = 0xc5 + WIN_MULTWRITE_EXT = 0x39 + WIN_NOP = 0x0 + WIN_PACKETCMD = 0xa0 + WIN_PIDENTIFY = 0xa1 + WIN_POSTBOOT = 0xdc + WIN_PREBOOT = 0xdd + WIN_QUEUED_SERVICE = 0xa2 + WIN_READ = 0x20 + WIN_READDMA = 0xc8 + WIN_READDMA_EXT = 0x25 + WIN_READDMA_ONCE = 0xc9 + WIN_READDMA_QUEUED = 0xc7 + WIN_READDMA_QUEUED_EXT = 0x26 + WIN_READ_BUFFER = 0xe4 + WIN_READ_EXT = 0x24 + WIN_READ_LONG = 0x22 + WIN_READ_LONG_ONCE = 0x23 + WIN_READ_NATIVE_MAX = 0xf8 + WIN_READ_NATIVE_MAX_EXT = 0x27 + WIN_READ_ONCE = 0x21 + WIN_RECAL = 0x10 + WIN_RESTORE = 0x10 + WIN_SECURITY_DISABLE = 0xf6 + WIN_SECURITY_ERASE_PREPARE = 0xf3 + WIN_SECURITY_ERASE_UNIT = 0xf4 + WIN_SECURITY_FREEZE_LOCK = 0xf5 + WIN_SECURITY_SET_PASS = 0xf1 + WIN_SECURITY_UNLOCK = 0xf2 + WIN_SEEK = 0x70 + WIN_SETFEATURES = 0xef + WIN_SETIDLE1 = 0xe3 + WIN_SETIDLE2 = 0x97 + WIN_SETMULT = 0xc6 + WIN_SET_MAX = 0xf9 + WIN_SET_MAX_EXT = 0x37 + WIN_SLEEPNOW1 = 0xe6 + WIN_SLEEPNOW2 = 0x99 + WIN_SMART = 0xb0 + WIN_SPECIFY = 0x91 + WIN_SRST = 0x8 + WIN_STANDBY = 0xe2 + WIN_STANDBY2 = 0x96 + WIN_STANDBYNOW1 = 0xe0 + WIN_STANDBYNOW2 = 0x94 + WIN_VERIFY = 0x40 + WIN_VERIFY_EXT = 0x42 + WIN_VERIFY_ONCE = 0x41 + WIN_WRITE = 0x30 + WIN_WRITEDMA = 0xca + WIN_WRITEDMA_EXT = 0x35 + WIN_WRITEDMA_ONCE = 0xcb + WIN_WRITEDMA_QUEUED = 0xcc + WIN_WRITEDMA_QUEUED_EXT = 0x36 + WIN_WRITE_BUFFER = 0xe8 + WIN_WRITE_EXT = 0x34 + WIN_WRITE_LONG = 0x32 + WIN_WRITE_LONG_ONCE = 0x33 + WIN_WRITE_ONCE = 0x31 + WIN_WRITE_SAME = 0xe9 + WIN_WRITE_VERIFY = 0x3c + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x40 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4000 + XDP_COPY = 0x2 + XDP_FLAGS_DRV_MODE = 0x4 + XDP_FLAGS_HW_MODE = 0x8 + XDP_FLAGS_MASK = 0xf + XDP_FLAGS_MODES = 0xe + XDP_FLAGS_SKB_MODE = 0x2 + XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 + XDP_MMAP_OFFSETS = 0x1 + XDP_PGOFF_RX_RING = 0x0 + XDP_PGOFF_TX_RING = 0x80000000 + XDP_RX_RING = 0x2 + XDP_SHARED_UMEM = 0x1 + XDP_STATISTICS = 0x7 + XDP_TX_RING = 0x3 + XDP_UMEM_COMPLETION_RING = 0x6 + XDP_UMEM_FILL_RING = 0x5 + XDP_UMEM_PGOFF_COMPLETION_RING = 0x180000000 + XDP_UMEM_PGOFF_FILL_RING = 0x100000000 + XDP_UMEM_REG = 0x4 + XDP_ZEROCOPY = 0x4 + XENFS_SUPER_MAGIC = 0xabba1974 + XTABS = 0xc00 + ZSMALLOC_MAGIC = 0x58295829 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x62) + EADDRNOTAVAIL = syscall.Errno(0x63) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x61) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x72) + EBADE = syscall.Errno(0x34) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x4d) + EBADMSG = syscall.Errno(0x4a) + EBADR = syscall.Errno(0x35) + EBADRQC = syscall.Errno(0x38) + EBADSLT = syscall.Errno(0x39) + EBFONT = syscall.Errno(0x3b) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x7d) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x2c) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x67) + ECONNREFUSED = syscall.Errno(0x6f) + ECONNRESET = syscall.Errno(0x68) + EDEADLK = syscall.Errno(0x23) + EDEADLOCK = syscall.Errno(0x3a) + EDESTADDRREQ = syscall.Errno(0x59) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x49) + EDQUOT = syscall.Errno(0x7a) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x70) + EHOSTUNREACH = syscall.Errno(0x71) + EHWPOISON = syscall.Errno(0x85) + EIDRM = syscall.Errno(0x2b) + EILSEQ = syscall.Errno(0x54) + EINPROGRESS = syscall.Errno(0x73) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x6a) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x78) + EKEYEXPIRED = syscall.Errno(0x7f) + EKEYREJECTED = syscall.Errno(0x81) + EKEYREVOKED = syscall.Errno(0x80) + EL2HLT = syscall.Errno(0x33) + EL2NSYNC = syscall.Errno(0x2d) + EL3HLT = syscall.Errno(0x2e) + EL3RST = syscall.Errno(0x2f) + ELIBACC = syscall.Errno(0x4f) + ELIBBAD = syscall.Errno(0x50) + ELIBEXEC = syscall.Errno(0x53) + ELIBMAX = syscall.Errno(0x52) + ELIBSCN = syscall.Errno(0x51) + ELNRNG = syscall.Errno(0x30) + ELOOP = syscall.Errno(0x28) + EMEDIUMTYPE = syscall.Errno(0x7c) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x5a) + EMULTIHOP = syscall.Errno(0x48) + ENAMETOOLONG = syscall.Errno(0x24) + ENAVAIL = syscall.Errno(0x77) + ENETDOWN = syscall.Errno(0x64) + ENETRESET = syscall.Errno(0x66) + ENETUNREACH = syscall.Errno(0x65) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x37) + ENOBUFS = syscall.Errno(0x69) + ENOCSI = syscall.Errno(0x32) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0x7e) + ENOLCK = syscall.Errno(0x25) + ENOLINK = syscall.Errno(0x43) + ENOMEDIUM = syscall.Errno(0x7b) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x2a) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x5c) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x26) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x6b) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x27) + ENOTNAM = syscall.Errno(0x76) + ENOTRECOVERABLE = syscall.Errno(0x83) + ENOTSOCK = syscall.Errno(0x58) + ENOTSUP = syscall.Errno(0x5f) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x4c) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x5f) + EOVERFLOW = syscall.Errno(0x4b) + EOWNERDEAD = syscall.Errno(0x82) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x60) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x5d) + EPROTOTYPE = syscall.Errno(0x5b) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x4e) + EREMOTE = syscall.Errno(0x42) + EREMOTEIO = syscall.Errno(0x79) + ERESTART = syscall.Errno(0x55) + ERFKILL = syscall.Errno(0x84) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x6c) + ESOCKTNOSUPPORT = syscall.Errno(0x5e) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x74) + ESTRPIPE = syscall.Errno(0x56) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x6e) + ETOOMANYREFS = syscall.Errno(0x6d) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x75) + EUNATCH = syscall.Errno(0x31) + EUSERS = syscall.Errno(0x57) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x36) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0x7) + SIGCHLD = syscall.Signal(0x11) + SIGCLD = syscall.Signal(0x11) + SIGCONT = syscall.Signal(0x12) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x1d) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x1d) + SIGPROF = syscall.Signal(0x1b) + SIGPWR = syscall.Signal(0x1e) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTKFLT = syscall.Signal(0x10) + SIGSTOP = syscall.Signal(0x13) + SIGSYS = syscall.Signal(0x1f) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x14) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x17) + SIGUSR1 = syscall.Signal(0xa) + SIGUSR2 = syscall.Signal(0xc) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "no such device or address"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EAGAIN", "resource temporarily unavailable"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device or resource busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "invalid cross-device link"}, + {19, "ENODEV", "no such device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "numerical result out of range"}, + {35, "EDEADLK", "resource deadlock avoided"}, + {36, "ENAMETOOLONG", "file name too long"}, + {37, "ENOLCK", "no locks available"}, + {38, "ENOSYS", "function not implemented"}, + {39, "ENOTEMPTY", "directory not empty"}, + {40, "ELOOP", "too many levels of symbolic links"}, + {42, "ENOMSG", "no message of desired type"}, + {43, "EIDRM", "identifier removed"}, + {44, "ECHRNG", "channel number out of range"}, + {45, "EL2NSYNC", "level 2 not synchronized"}, + {46, "EL3HLT", "level 3 halted"}, + {47, "EL3RST", "level 3 reset"}, + {48, "ELNRNG", "link number out of range"}, + {49, "EUNATCH", "protocol driver not attached"}, + {50, "ENOCSI", "no CSI structure available"}, + {51, "EL2HLT", "level 2 halted"}, + {52, "EBADE", "invalid exchange"}, + {53, "EBADR", "invalid request descriptor"}, + {54, "EXFULL", "exchange full"}, + {55, "ENOANO", "no anode"}, + {56, "EBADRQC", "invalid request code"}, + {57, "EBADSLT", "invalid slot"}, + {58, "EDEADLOCK", "file locking deadlock error"}, + {59, "EBFONT", "bad font file format"}, + {60, "ENOSTR", "device not a stream"}, + {61, "ENODATA", "no data available"}, + {62, "ETIME", "timer expired"}, + {63, "ENOSR", "out of streams resources"}, + {64, "ENONET", "machine is not on the network"}, + {65, "ENOPKG", "package not installed"}, + {66, "EREMOTE", "object is remote"}, + {67, "ENOLINK", "link has been severed"}, + {68, "EADV", "advertise error"}, + {69, "ESRMNT", "srmount error"}, + {70, "ECOMM", "communication error on send"}, + {71, "EPROTO", "protocol error"}, + {72, "EMULTIHOP", "multihop attempted"}, + {73, "EDOTDOT", "RFS specific error"}, + {74, "EBADMSG", "bad message"}, + {75, "EOVERFLOW", "value too large for defined data type"}, + {76, "ENOTUNIQ", "name not unique on network"}, + {77, "EBADFD", "file descriptor in bad state"}, + {78, "EREMCHG", "remote address changed"}, + {79, "ELIBACC", "can not access a needed shared library"}, + {80, "ELIBBAD", "accessing a corrupted shared library"}, + {81, "ELIBSCN", ".lib section in a.out corrupted"}, + {82, "ELIBMAX", "attempting to link in too many shared libraries"}, + {83, "ELIBEXEC", "cannot exec a shared library directly"}, + {84, "EILSEQ", "invalid or incomplete multibyte or wide character"}, + {85, "ERESTART", "interrupted system call should be restarted"}, + {86, "ESTRPIPE", "streams pipe error"}, + {87, "EUSERS", "too many users"}, + {88, "ENOTSOCK", "socket operation on non-socket"}, + {89, "EDESTADDRREQ", "destination address required"}, + {90, "EMSGSIZE", "message too long"}, + {91, "EPROTOTYPE", "protocol wrong type for socket"}, + {92, "ENOPROTOOPT", "protocol not available"}, + {93, "EPROTONOSUPPORT", "protocol not supported"}, + {94, "ESOCKTNOSUPPORT", "socket type not supported"}, + {95, "ENOTSUP", "operation not supported"}, + {96, "EPFNOSUPPORT", "protocol family not supported"}, + {97, "EAFNOSUPPORT", "address family not supported by protocol"}, + {98, "EADDRINUSE", "address already in use"}, + {99, "EADDRNOTAVAIL", "cannot assign requested address"}, + {100, "ENETDOWN", "network is down"}, + {101, "ENETUNREACH", "network is unreachable"}, + {102, "ENETRESET", "network dropped connection on reset"}, + {103, "ECONNABORTED", "software caused connection abort"}, + {104, "ECONNRESET", "connection reset by peer"}, + {105, "ENOBUFS", "no buffer space available"}, + {106, "EISCONN", "transport endpoint is already connected"}, + {107, "ENOTCONN", "transport endpoint is not connected"}, + {108, "ESHUTDOWN", "cannot send after transport endpoint shutdown"}, + {109, "ETOOMANYREFS", "too many references: cannot splice"}, + {110, "ETIMEDOUT", "connection timed out"}, + {111, "ECONNREFUSED", "connection refused"}, + {112, "EHOSTDOWN", "host is down"}, + {113, "EHOSTUNREACH", "no route to host"}, + {114, "EALREADY", "operation already in progress"}, + {115, "EINPROGRESS", "operation now in progress"}, + {116, "ESTALE", "stale file handle"}, + {117, "EUCLEAN", "structure needs cleaning"}, + {118, "ENOTNAM", "not a XENIX named type file"}, + {119, "ENAVAIL", "no XENIX semaphores available"}, + {120, "EISNAM", "is a named type file"}, + {121, "EREMOTEIO", "remote I/O error"}, + {122, "EDQUOT", "disk quota exceeded"}, + {123, "ENOMEDIUM", "no medium found"}, + {124, "EMEDIUMTYPE", "wrong medium type"}, + {125, "ECANCELED", "operation canceled"}, + {126, "ENOKEY", "required key not available"}, + {127, "EKEYEXPIRED", "key has expired"}, + {128, "EKEYREVOKED", "key has been revoked"}, + {129, "EKEYREJECTED", "key was rejected by service"}, + {130, "EOWNERDEAD", "owner died"}, + {131, "ENOTRECOVERABLE", "state not recoverable"}, + {132, "ERFKILL", "operation not possible due to RF-kill"}, + {133, "EHWPOISON", "memory page has hardware error"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/breakpoint trap"}, + {6, "SIGABRT", "aborted"}, + {7, "SIGBUS", "bus error"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGUSR1", "user defined signal 1"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGUSR2", "user defined signal 2"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGSTKFLT", "stack fault"}, + {17, "SIGCHLD", "child exited"}, + {18, "SIGCONT", "continued"}, + {19, "SIGSTOP", "stopped (signal)"}, + {20, "SIGTSTP", "stopped"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGURG", "urgent I/O condition"}, + {24, "SIGXCPU", "CPU time limit exceeded"}, + {25, "SIGXFSZ", "file size limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window changed"}, + {29, "SIGIO", "I/O possible"}, + {30, "SIGPWR", "power failure"}, + {31, "SIGSYS", "bad system call"}, +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go new file mode 100644 index 00000000..8734df99 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go @@ -0,0 +1,2762 @@ +// mkerrors.sh -Wall -Werror -static -I/tmp/include +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build ppc64le,linux + +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go + +package unix + +import "syscall" + +const ( + AAFS_MAGIC = 0x5a3c69f0 + ADFS_SUPER_MAGIC = 0xadf5 + AFFS_SUPER_MAGIC = 0xadff + AFS_FS_MAGIC = 0x6b414653 + AFS_SUPER_MAGIC = 0x5346414f + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2c + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + AF_XDP = 0x2c + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ANON_INODE_FS_MAGIC = 0x9041934 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_RAWIP = 0x207 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + AUTOFS_SUPER_MAGIC = 0x187 + B0 = 0x0 + B1000000 = 0x17 + B110 = 0x3 + B115200 = 0x11 + B1152000 = 0x18 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x19 + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x1a + B230400 = 0x12 + B2400 = 0xb + B2500000 = 0x1b + B300 = 0x7 + B3000000 = 0x1c + B3500000 = 0x1d + B38400 = 0xf + B4000000 = 0x1e + B460800 = 0x13 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x14 + B57600 = 0x10 + B576000 = 0x15 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x16 + B9600 = 0xd + BALLOON_KVM_MAGIC = 0x13661366 + BDEVFS_MAGIC = 0x62646576 + BINFMTFS_MAGIC = 0x42494e4d + BLKBSZGET = 0x40081270 + BLKBSZSET = 0x80081271 + BLKFLSBUF = 0x20001261 + BLKFRAGET = 0x20001265 + BLKFRASET = 0x20001264 + BLKGETSIZE = 0x20001260 + BLKGETSIZE64 = 0x40081272 + BLKPBSZGET = 0x2000127b + BLKRAGET = 0x20001263 + BLKRASET = 0x20001262 + BLKROGET = 0x2000125e + BLKROSET = 0x2000125d + BLKRRPART = 0x2000125f + BLKSECTGET = 0x20001267 + BLKSECTSET = 0x20001266 + BLKSSZGET = 0x20001268 + BOTHER = 0x1f + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_FS_MAGIC = 0xcafe4a11 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x8000 + BSDLY = 0x8000 + BTRFS_SUPER_MAGIC = 0x9123683e + BTRFS_TEST_MAGIC = 0x73727279 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0xff + CBAUDEX = 0x0 + CFLUSH = 0xf + CGROUP2_SUPER_MAGIC = 0x63677270 + CGROUP_SUPER_MAGIC = 0x27e0eb + CIBAUD = 0xff0000 + CLOCAL = 0x8000 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CODA_SUPER_MAGIC = 0x73757245 + CR0 = 0x0 + CR1 = 0x1000 + CR2 = 0x2000 + CR3 = 0x3000 + CRAMFS_MAGIC = 0x28cd3d45 + CRDLY = 0x3000 + CREAD = 0x800 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIGNAL = 0xff + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + DAXFS_MAGIC = 0x64646178 + DEBUGFS_MAGIC = 0x64626720 + DEVPTS_SUPER_MAGIC = 0x1cd1 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + ECRYPTFS_SUPER_MAGIC = 0xf15f + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x800 + EFD_SEMAPHORE = 0x1 + EFIVARFS_MAGIC = 0xde5e81e4 + EFS_SUPER_MAGIC = 0x414a53 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_ERSPAN = 0x88be + ETH_P_ERSPAN2 = 0x22eb + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IFE = 0xed3e + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MAP = 0xf9 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_NSH = 0x894f + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PREAUTH = 0x88c7 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXABYTE_ENABLE_NEST = 0xf0 + EXT2_SUPER_MAGIC = 0xef53 + EXT3_SUPER_MAGIC = 0xef53 + EXT4_SUPER_MAGIC = 0xef53 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000000 + F2FS_SUPER_MAGIC = 0xf2f52010 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x4000 + FFDLY = 0x4000 + FLUSHO = 0x800000 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_ENCRYPTION_MODE_SPECK128_256_CTS = 0x8 + FS_ENCRYPTION_MODE_SPECK128_256_XTS = 0x7 + FS_IOC_GET_ENCRYPTION_POLICY = 0x800c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x80106614 + FS_IOC_SET_ENCRYPTION_POLICY = 0x400c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0x3 + FUTEXFS_SUPER_MAGIC = 0xbad1dea + F_ADD_SEALS = 0x409 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0x5 + F_GETLK64 = 0xc + F_GETOWN = 0x9 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_GET_FILE_RW_HINT = 0x40d + F_GET_RW_HINT = 0x40b + F_GET_SEALS = 0x40a + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SEAL_GROW = 0x4 + F_SEAL_SEAL = 0x1 + F_SEAL_SHRINK = 0x2 + F_SEAL_WRITE = 0x8 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x6 + F_SETLK64 = 0xd + F_SETLKW = 0x7 + F_SETLKW64 = 0xe + F_SETOWN = 0x8 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SET_FILE_RW_HINT = 0x40e + F_SET_RW_HINT = 0x40c + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HDIO_DRIVE_CMD = 0x31f + HDIO_DRIVE_CMD_AEB = 0x31e + HDIO_DRIVE_CMD_HDR_SIZE = 0x4 + HDIO_DRIVE_HOB_HDR_SIZE = 0x8 + HDIO_DRIVE_RESET = 0x31c + HDIO_DRIVE_TASK = 0x31e + HDIO_DRIVE_TASKFILE = 0x31d + HDIO_DRIVE_TASK_HDR_SIZE = 0x8 + HDIO_GETGEO = 0x301 + HDIO_GET_32BIT = 0x309 + HDIO_GET_ACOUSTIC = 0x30f + HDIO_GET_ADDRESS = 0x310 + HDIO_GET_BUSSTATE = 0x31a + HDIO_GET_DMA = 0x30b + HDIO_GET_IDENTITY = 0x30d + HDIO_GET_KEEPSETTINGS = 0x308 + HDIO_GET_MULTCOUNT = 0x304 + HDIO_GET_NICE = 0x30c + HDIO_GET_NOWERR = 0x30a + HDIO_GET_QDMA = 0x305 + HDIO_GET_UNMASKINTR = 0x302 + HDIO_GET_WCACHE = 0x30e + HDIO_OBSOLETE_IDENTITY = 0x307 + HDIO_SCAN_HWIF = 0x328 + HDIO_SET_32BIT = 0x324 + HDIO_SET_ACOUSTIC = 0x32c + HDIO_SET_ADDRESS = 0x32f + HDIO_SET_BUSSTATE = 0x32d + HDIO_SET_DMA = 0x326 + HDIO_SET_KEEPSETTINGS = 0x323 + HDIO_SET_MULTCOUNT = 0x321 + HDIO_SET_NICE = 0x329 + HDIO_SET_NOWERR = 0x325 + HDIO_SET_PIO_MODE = 0x327 + HDIO_SET_QDMA = 0x32e + HDIO_SET_UNMASKINTR = 0x322 + HDIO_SET_WCACHE = 0x32b + HDIO_SET_XFER = 0x306 + HDIO_TRISTATE_HWIF = 0x31b + HDIO_UNREGISTER_HWIF = 0x32a + HOSTFS_SUPER_MAGIC = 0xc0ffee + HPFS_SUPER_MAGIC = 0xf995e849 + HUGETLBFS_MAGIC = 0x958458f6 + HUPCL = 0x4000 + IBSHIFT = 0x10 + ICANON = 0x100 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x400 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x9 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NAPI = 0x10 + IFF_NAPI_FRAGS = 0x20 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x800 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_FREEBIND = 0x4e + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x80 + ISOFS_SUPER_MAGIC = 0x9660 + ISTRIP = 0x20 + IUCLC = 0x1000 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + JFFS2_SUPER_MAGIC = 0x72b6 + KEXEC_ARCH_386 = 0x30000 + KEXEC_ARCH_68K = 0x40000 + KEXEC_ARCH_AARCH64 = 0xb70000 + KEXEC_ARCH_ARM = 0x280000 + KEXEC_ARCH_DEFAULT = 0x0 + KEXEC_ARCH_IA_64 = 0x320000 + KEXEC_ARCH_MASK = 0xffff0000 + KEXEC_ARCH_MIPS = 0x80000 + KEXEC_ARCH_MIPS_LE = 0xa0000 + KEXEC_ARCH_PPC = 0x140000 + KEXEC_ARCH_PPC64 = 0x150000 + KEXEC_ARCH_S390 = 0x160000 + KEXEC_ARCH_SH = 0x2a0000 + KEXEC_ARCH_X86_64 = 0x3e0000 + KEXEC_FILE_NO_INITRAMFS = 0x4 + KEXEC_FILE_ON_CRASH = 0x2 + KEXEC_FILE_UNLOAD = 0x1 + KEXEC_ON_CRASH = 0x1 + KEXEC_PRESERVE_CONTEXT = 0x2 + KEXEC_SEGMENT_MAX = 0x10 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_NEGATE = 0xd + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_KEEPONFORK = 0x13 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MADV_WIPEONFORK = 0x12 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_FIXED_NOREPLACE = 0x100000 + MAP_GROWSDOWN = 0x100 + MAP_HUGETLB = 0x40000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x80 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x40 + MAP_POPULATE = 0x8000 + MAP_PRIVATE = 0x2 + MAP_SHARED = 0x1 + MAP_SHARED_VALIDATE = 0x3 + MAP_STACK = 0x20000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x2000 + MCL_FUTURE = 0x4000 + MCL_ONFAULT = 0x8000 + MFD_ALLOW_SEALING = 0x2 + MFD_CLOEXEC = 0x1 + MFD_HUGETLB = 0x4 + MFD_HUGE_16GB = -0x78000000 + MFD_HUGE_16MB = 0x60000000 + MFD_HUGE_1GB = 0x78000000 + MFD_HUGE_1MB = 0x50000000 + MFD_HUGE_256MB = 0x70000000 + MFD_HUGE_2GB = 0x7c000000 + MFD_HUGE_2MB = 0x54000000 + MFD_HUGE_32MB = 0x64000000 + MFD_HUGE_512KB = 0x4c000000 + MFD_HUGE_512MB = 0x74000000 + MFD_HUGE_64KB = 0x40000000 + MFD_HUGE_8MB = 0x5c000000 + MFD_HUGE_MASK = 0x3f + MFD_HUGE_SHIFT = 0x1a + MINIX2_SUPER_MAGIC = 0x2468 + MINIX2_SUPER_MAGIC2 = 0x2478 + MINIX3_SUPER_MAGIC = 0x4d5a + MINIX_SUPER_MAGIC = 0x137f + MINIX_SUPER_MAGIC2 = 0x138f + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSDOS_SUPER_MAGIC = 0x4d44 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MSG_ZEROCOPY = 0x4000000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + MTD_INODE_FS_MAGIC = 0x11307854 + NAME_MAX = 0xff + NCP_SUPER_MAGIC = 0x564c + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NETNSA_MAX = 0x3 + NETNSA_NSID_NOT_ASSIGNED = -0x1 + NFNETLINK_V0 = 0x0 + NFNLGRP_ACCT_QUOTA = 0x8 + NFNLGRP_CONNTRACK_DESTROY = 0x3 + NFNLGRP_CONNTRACK_EXP_DESTROY = 0x6 + NFNLGRP_CONNTRACK_EXP_NEW = 0x4 + NFNLGRP_CONNTRACK_EXP_UPDATE = 0x5 + NFNLGRP_CONNTRACK_NEW = 0x1 + NFNLGRP_CONNTRACK_UPDATE = 0x2 + NFNLGRP_MAX = 0x9 + NFNLGRP_NFTABLES = 0x7 + NFNLGRP_NFTRACE = 0x9 + NFNLGRP_NONE = 0x0 + NFNL_BATCH_MAX = 0x1 + NFNL_MSG_BATCH_BEGIN = 0x10 + NFNL_MSG_BATCH_END = 0x11 + NFNL_NFA_NEST = 0x8000 + NFNL_SUBSYS_ACCT = 0x7 + NFNL_SUBSYS_COUNT = 0xc + NFNL_SUBSYS_CTHELPER = 0x9 + NFNL_SUBSYS_CTNETLINK = 0x1 + NFNL_SUBSYS_CTNETLINK_EXP = 0x2 + NFNL_SUBSYS_CTNETLINK_TIMEOUT = 0x8 + NFNL_SUBSYS_IPSET = 0x6 + NFNL_SUBSYS_NFTABLES = 0xa + NFNL_SUBSYS_NFT_COMPAT = 0xb + NFNL_SUBSYS_NONE = 0x0 + NFNL_SUBSYS_OSF = 0x5 + NFNL_SUBSYS_QUEUE = 0x3 + NFNL_SUBSYS_ULOG = 0x4 + NFS_SUPER_MAGIC = 0x6969 + NILFS_SUPER_MAGIC = 0x3434 + NL0 = 0x0 + NL1 = 0x100 + NL2 = 0x200 + NL3 = 0x300 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x300 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_NONREC = 0x100 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80000000 + NSFS_MAGIC = 0x6e736673 + OCFS2_SUPER_MAGIC = 0x7461636f + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x4 + ONLCR = 0x2 + ONLRET = 0x20 + ONOCR = 0x10 + OPENPROM_SUPER_MAGIC = 0x9fa1 + OPOST = 0x1 + OVERLAYFS_SUPER_MAGIC = 0x794c7630 + O_ACCMODE = 0x3 + O_APPEND = 0x400 + O_ASYNC = 0x2000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x40 + O_DIRECT = 0x20000 + O_DIRECTORY = 0x4000 + O_DSYNC = 0x1000 + O_EXCL = 0x80 + O_FSYNC = 0x101000 + O_LARGEFILE = 0x0 + O_NDELAY = 0x800 + O_NOATIME = 0x40000 + O_NOCTTY = 0x100 + O_NOFOLLOW = 0x8000 + O_NONBLOCK = 0x800 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x101000 + O_SYNC = 0x101000 + O_TMPFILE = 0x404000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x1000 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PERF_EVENT_IOC_DISABLE = 0x20002401 + PERF_EVENT_IOC_ENABLE = 0x20002400 + PERF_EVENT_IOC_ID = 0x40082407 + PERF_EVENT_IOC_MODIFY_ATTRIBUTES = 0x8008240b + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x80042409 + PERF_EVENT_IOC_PERIOD = 0x80082404 + PERF_EVENT_IOC_QUERY_BPF = 0xc008240a + PERF_EVENT_IOC_REFRESH = 0x20002402 + PERF_EVENT_IOC_RESET = 0x20002403 + PERF_EVENT_IOC_SET_BPF = 0x80042408 + PERF_EVENT_IOC_SET_FILTER = 0x80082406 + PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 + PIPEFS_MAGIC = 0x50495045 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROC_SUPER_MAGIC = 0x9fa0 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_SAO = 0x10 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_SPECULATION_CTRL = 0x34 + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffffffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_SPECULATION_CTRL = 0x35 + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_SPEC_DISABLE = 0x4 + PR_SPEC_ENABLE = 0x2 + PR_SPEC_FORCE_DISABLE = 0x8 + PR_SPEC_NOT_AFFECTED = 0x0 + PR_SPEC_PRCTL = 0x1 + PR_SPEC_STORE_BYPASS = 0x0 + PR_SVE_GET_VL = 0x33 + PR_SVE_SET_VL = 0x32 + PR_SVE_SET_VL_ONEXEC = 0x40000 + PR_SVE_VL_INHERIT = 0x20000 + PR_SVE_VL_LEN_MASK = 0xffff + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PSTOREFS_MAGIC = 0x6165676c + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETEVRREGS = 0x14 + PTRACE_GETFPREGS = 0xe + PTRACE_GETREGS = 0xc + PTRACE_GETREGS64 = 0x16 + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GETVRREGS = 0x12 + PTRACE_GETVSRREGS = 0x1b + PTRACE_GET_DEBUGREG = 0x19 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKETEXT = 0x4 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SECCOMP_GET_METADATA = 0x420d + PTRACE_SEIZE = 0x4206 + PTRACE_SETEVRREGS = 0x15 + PTRACE_SETFPREGS = 0xf + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGS64 = 0x17 + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SETVRREGS = 0x13 + PTRACE_SETVSRREGS = 0x1c + PTRACE_SET_DEBUGREG = 0x1a + PTRACE_SINGLEBLOCK = 0x100 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_TRACEME = 0x0 + PT_CCR = 0x26 + PT_CTR = 0x23 + PT_DAR = 0x29 + PT_DSCR = 0x2c + PT_DSISR = 0x2a + PT_FPR0 = 0x30 + PT_FPSCR = 0x50 + PT_LNK = 0x24 + PT_MSR = 0x21 + PT_NIP = 0x20 + PT_ORIG_R3 = 0x22 + PT_R0 = 0x0 + PT_R1 = 0x1 + PT_R10 = 0xa + PT_R11 = 0xb + PT_R12 = 0xc + PT_R13 = 0xd + PT_R14 = 0xe + PT_R15 = 0xf + PT_R16 = 0x10 + PT_R17 = 0x11 + PT_R18 = 0x12 + PT_R19 = 0x13 + PT_R2 = 0x2 + PT_R20 = 0x14 + PT_R21 = 0x15 + PT_R22 = 0x16 + PT_R23 = 0x17 + PT_R24 = 0x18 + PT_R25 = 0x19 + PT_R26 = 0x1a + PT_R27 = 0x1b + PT_R28 = 0x1c + PT_R29 = 0x1d + PT_R3 = 0x3 + PT_R30 = 0x1e + PT_R31 = 0x1f + PT_R4 = 0x4 + PT_R5 = 0x5 + PT_R6 = 0x6 + PT_R7 = 0x7 + PT_R8 = 0x8 + PT_R9 = 0x9 + PT_REGS_COUNT = 0x2c + PT_RESULT = 0x2b + PT_SOFTE = 0x27 + PT_TRAP = 0x28 + PT_VR0 = 0x52 + PT_VRSAVE = 0x94 + PT_VSCR = 0x93 + PT_VSR0 = 0x96 + PT_VSR31 = 0xd4 + PT_XER = 0x25 + QNX4_SUPER_MAGIC = 0x2f + QNX6_SUPER_MAGIC = 0x68191122 + RAMFS_MAGIC = 0x858458f6 + RDTGROUP_SUPER_MAGIC = 0x7655821 + REISERFS_SUPER_MAGIC = 0x52654973 + RENAME_EXCHANGE = 0x2 + RENAME_NOREPLACE = 0x1 + RENAME_WHITEOUT = 0x4 + RLIMIT_AS = 0x9 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x8 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x7 + RLIMIT_NPROC = 0x6 + RLIMIT_RSS = 0x5 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FASTOPEN_NO_COOKIE = 0x11 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x11 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1d + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTC_AF = 0x20 + RTC_AIE_OFF = 0x20007002 + RTC_AIE_ON = 0x20007001 + RTC_ALM_READ = 0x40247008 + RTC_ALM_SET = 0x80247007 + RTC_EPOCH_READ = 0x4008700d + RTC_EPOCH_SET = 0x8008700e + RTC_IRQF = 0x80 + RTC_IRQP_READ = 0x4008700b + RTC_IRQP_SET = 0x8008700c + RTC_MAX_FREQ = 0x2000 + RTC_PF = 0x40 + RTC_PIE_OFF = 0x20007006 + RTC_PIE_ON = 0x20007005 + RTC_PLL_GET = 0x40207011 + RTC_PLL_SET = 0x80207012 + RTC_RD_TIME = 0x40247009 + RTC_SET_TIME = 0x8024700a + RTC_UF = 0x10 + RTC_UIE_OFF = 0x20007004 + RTC_UIE_ON = 0x20007003 + RTC_VL_CLR = 0x20007014 + RTC_VL_READ = 0x40047013 + RTC_WIE_OFF = 0x20007010 + RTC_WIE_ON = 0x2000700f + RTC_WKALM_RD = 0x40287010 + RTC_WKALM_SET = 0x8028700f + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELCHAIN = 0x65 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETCHAIN = 0x66 + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x67 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWCHAIN = 0x64 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x16 + RTM_NR_MSGTYPES = 0x58 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BGP = 0xba + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_EIGRP = 0xc0 + RTPROT_GATED = 0x8 + RTPROT_ISIS = 0xbb + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_OSPF = 0xbc + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_RIP = 0xbd + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_TXTIME = 0x3d + SCM_WIFI_STATUS = 0x29 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SECURITYFS_MAGIC = 0x73636673 + SELINUX_MAGIC = 0xf97cff8c + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x8905 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x8904 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x4004667f + SIOCOUTQ = 0x40047473 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x8902 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SMACK_MAGIC = 0x43415d53 + SMART_AUTOSAVE = 0xd2 + SMART_AUTO_OFFLINE = 0xdb + SMART_DISABLE = 0xd9 + SMART_ENABLE = 0xd8 + SMART_HCYL_PASS = 0xc2 + SMART_IMMEDIATE_OFFLINE = 0xd4 + SMART_LCYL_PASS = 0x4f + SMART_READ_LOG_SECTOR = 0xd5 + SMART_READ_THRESHOLDS = 0xd1 + SMART_READ_VALUES = 0xd0 + SMART_SAVE = 0xd3 + SMART_STATUS = 0xda + SMART_WRITE_LOG_SECTOR = 0xd6 + SMART_WRITE_THRESHOLDS = 0xd7 + SMB_SUPER_MAGIC = 0x517b + SOCKFS_MAGIC = 0x534f434b + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x2 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x800 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0x1 + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_TLS = 0x11a + SOL_X25 = 0x106 + SOL_XDP = 0x11b + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1e + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x6 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x27 + SO_DONTROUTE = 0x5 + SO_ERROR = 0x4 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x9 + SO_LINGER = 0xd + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0xa + SO_PASSCRED = 0x14 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x15 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1f + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x26 + SO_RCVBUF = 0x8 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x10 + SO_RCVTIMEO = 0x12 + SO_REUSEADDR = 0x2 + SO_REUSEPORT = 0xf + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x7 + SO_SNDBUFFORCE = 0x20 + SO_SNDLOWAT = 0x11 + SO_SNDTIMEO = 0x13 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TXTIME = 0x3d + SO_TYPE = 0x3 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SO_ZEROCOPY = 0x3c + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + SQUASHFS_MAGIC = 0x73717368 + STACK_END_MAGIC = 0x57ac6e9d + STATX_ALL = 0xfff + STATX_ATIME = 0x20 + STATX_ATTR_APPEND = 0x20 + STATX_ATTR_AUTOMOUNT = 0x1000 + STATX_ATTR_COMPRESSED = 0x4 + STATX_ATTR_ENCRYPTED = 0x800 + STATX_ATTR_IMMUTABLE = 0x10 + STATX_ATTR_NODUMP = 0x40 + STATX_BASIC_STATS = 0x7ff + STATX_BLOCKS = 0x400 + STATX_BTIME = 0x800 + STATX_CTIME = 0x80 + STATX_GID = 0x10 + STATX_INO = 0x100 + STATX_MODE = 0x2 + STATX_MTIME = 0x40 + STATX_NLINK = 0x4 + STATX_SIZE = 0x200 + STATX_TYPE = 0x1 + STATX_UID = 0x8 + STATX__RESERVED = 0x80000000 + SYNC_FILE_RANGE_WAIT_AFTER = 0x4 + SYNC_FILE_RANGE_WAIT_BEFORE = 0x1 + SYNC_FILE_RANGE_WRITE = 0x2 + SYSFS_MAGIC = 0x62656572 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x400 + TAB2 = 0x800 + TAB3 = 0xc00 + TABDLY = 0xc00 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x8 + TCFLSH = 0x2000741f + TCGETA = 0x40147417 + TCGETS = 0x402c7413 + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_FASTOPEN_KEY = 0x21 + TCP_FASTOPEN_NO_COOKIE = 0x22 + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_EXT = 0x20 + TCP_MD5SIG_FLAG_PREFIX = 0x1 + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_ULP = 0x1f + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x2 + TCSBRK = 0x2000741d + TCSBRKP = 0x5425 + TCSETA = 0x80147418 + TCSETAF = 0x8014741c + TCSETAW = 0x80147419 + TCSETS = 0x802c7414 + TCSETSF = 0x802c7416 + TCSETSW = 0x802c7415 + TCXONC = 0x2000741e + TIOCCBRK = 0x5428 + TIOCCONS = 0x541d + TIOCEXCL = 0x540c + TIOCGDEV = 0x40045432 + TIOCGETC = 0x40067412 + TIOCGETD = 0x5424 + TIOCGETP = 0x40067408 + TIOCGEXCL = 0x40045440 + TIOCGICOUNT = 0x545d + TIOCGLCKTRMIOS = 0x5456 + TIOCGLTC = 0x40067474 + TIOCGPGRP = 0x40047477 + TIOCGPKT = 0x40045438 + TIOCGPTLCK = 0x40045439 + TIOCGPTN = 0x40045430 + TIOCGPTPEER = 0x20005441 + TIOCGRS485 = 0x542e + TIOCGSERIAL = 0x541e + TIOCGSID = 0x5429 + TIOCGSOFTCAR = 0x5419 + TIOCGWINSZ = 0x40087468 + TIOCINQ = 0x4004667f + TIOCLINUX = 0x541c + TIOCMBIC = 0x5417 + TIOCMBIS = 0x5416 + TIOCMGET = 0x5415 + TIOCMIWAIT = 0x545c + TIOCMSET = 0x5418 + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_LOOP = 0x8000 + TIOCM_OUT1 = 0x2000 + TIOCM_OUT2 = 0x4000 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x5422 + TIOCNXCL = 0x540d + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x5420 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x540e + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSER_TEMT = 0x1 + TIOCSETC = 0x80067411 + TIOCSETD = 0x5423 + TIOCSETN = 0x8006740a + TIOCSETP = 0x80067409 + TIOCSIG = 0x80045436 + TIOCSLCKTRMIOS = 0x5457 + TIOCSLTC = 0x80067475 + TIOCSPGRP = 0x80047476 + TIOCSPTLCK = 0x80045431 + TIOCSRS485 = 0x542f + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x541a + TIOCSTART = 0x2000746e + TIOCSTI = 0x5412 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCVHANGUP = 0x5437 + TMPFS_MAGIC = 0x1021994 + TOSTOP = 0x400000 + TPACKET_ALIGNMENT = 0x10 + TPACKET_HDRLEN = 0x34 + TP_STATUS_AVAILABLE = 0x0 + TP_STATUS_BLK_TMO = 0x20 + TP_STATUS_COPY = 0x2 + TP_STATUS_CSUMNOTREADY = 0x8 + TP_STATUS_CSUM_VALID = 0x80 + TP_STATUS_KERNEL = 0x0 + TP_STATUS_LOSING = 0x4 + TP_STATUS_SENDING = 0x2 + TP_STATUS_SEND_REQUEST = 0x1 + TP_STATUS_TS_RAW_HARDWARE = -0x80000000 + TP_STATUS_TS_SOFTWARE = 0x20000000 + TP_STATUS_TS_SYS_HARDWARE = 0x40000000 + TP_STATUS_USER = 0x1 + TP_STATUS_VLAN_TPID_VALID = 0x40 + TP_STATUS_VLAN_VALID = 0x10 + TP_STATUS_WRONG_FORMAT = 0x4 + TRACEFS_MAGIC = 0x74726163 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x801054d5 + TUNDETACHFILTER = 0x801054d6 + TUNGETFEATURES = 0x400454cf + TUNGETFILTER = 0x401054db + TUNGETIFF = 0x400454d2 + TUNGETSNDBUF = 0x400454d3 + TUNGETVNETBE = 0x400454df + TUNGETVNETHDRSZ = 0x400454d7 + TUNGETVNETLE = 0x400454dd + TUNSETDEBUG = 0x800454c9 + TUNSETFILTEREBPF = 0x400454e1 + TUNSETGROUP = 0x800454ce + TUNSETIFF = 0x800454ca + TUNSETIFINDEX = 0x800454da + TUNSETLINK = 0x800454cd + TUNSETNOCSUM = 0x800454c8 + TUNSETOFFLOAD = 0x800454d0 + TUNSETOWNER = 0x800454cc + TUNSETPERSIST = 0x800454cb + TUNSETQUEUE = 0x800454d9 + TUNSETSNDBUF = 0x800454d4 + TUNSETSTEERINGEBPF = 0x400454e0 + TUNSETTXFILTER = 0x800454d1 + TUNSETVNETBE = 0x800454de + TUNSETVNETHDRSZ = 0x800454d8 + TUNSETVNETLE = 0x800454dc + UBI_IOCATT = 0x80186f40 + UBI_IOCDET = 0x80046f41 + UBI_IOCEBCH = 0x80044f02 + UBI_IOCEBER = 0x80044f01 + UBI_IOCEBISMAP = 0x40044f05 + UBI_IOCEBMAP = 0x80084f03 + UBI_IOCEBUNMAP = 0x80044f04 + UBI_IOCMKVOL = 0x80986f00 + UBI_IOCRMVOL = 0x80046f01 + UBI_IOCRNVOL = 0x91106f03 + UBI_IOCRSVOL = 0x800c6f02 + UBI_IOCSETVOLPROP = 0x80104f06 + UBI_IOCVOLCRBLK = 0x80804f07 + UBI_IOCVOLRMBLK = 0x20004f08 + UBI_IOCVOLUP = 0x80084f00 + UDF_SUPER_MAGIC = 0x15013346 + UMOUNT_NOFOLLOW = 0x8 + USBDEVICE_SUPER_MAGIC = 0x9fa2 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + V9FS_MAGIC = 0x1021997 + VDISCARD = 0x10 + VEOF = 0x4 + VEOL = 0x6 + VEOL2 = 0x8 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x5 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xb + VSTART = 0xd + VSTOP = 0xe + VSUSP = 0xc + VSWTC = 0x9 + VT0 = 0x0 + VT1 = 0x10000 + VTDLY = 0x10000 + VTIME = 0x7 + VWERASE = 0xa + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x40045702 + WDIOC_GETPRETIMEOUT = 0x40045709 + WDIOC_GETSTATUS = 0x40045701 + WDIOC_GETSUPPORT = 0x40285700 + WDIOC_GETTEMP = 0x40045703 + WDIOC_GETTIMELEFT = 0x4004570a + WDIOC_GETTIMEOUT = 0x40045707 + WDIOC_KEEPALIVE = 0x40045705 + WDIOC_SETOPTIONS = 0x40045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WIN_ACKMEDIACHANGE = 0xdb + WIN_CHECKPOWERMODE1 = 0xe5 + WIN_CHECKPOWERMODE2 = 0x98 + WIN_DEVICE_RESET = 0x8 + WIN_DIAGNOSE = 0x90 + WIN_DOORLOCK = 0xde + WIN_DOORUNLOCK = 0xdf + WIN_DOWNLOAD_MICROCODE = 0x92 + WIN_FLUSH_CACHE = 0xe7 + WIN_FLUSH_CACHE_EXT = 0xea + WIN_FORMAT = 0x50 + WIN_GETMEDIASTATUS = 0xda + WIN_IDENTIFY = 0xec + WIN_IDENTIFY_DMA = 0xee + WIN_IDLEIMMEDIATE = 0xe1 + WIN_INIT = 0x60 + WIN_MEDIAEJECT = 0xed + WIN_MULTREAD = 0xc4 + WIN_MULTREAD_EXT = 0x29 + WIN_MULTWRITE = 0xc5 + WIN_MULTWRITE_EXT = 0x39 + WIN_NOP = 0x0 + WIN_PACKETCMD = 0xa0 + WIN_PIDENTIFY = 0xa1 + WIN_POSTBOOT = 0xdc + WIN_PREBOOT = 0xdd + WIN_QUEUED_SERVICE = 0xa2 + WIN_READ = 0x20 + WIN_READDMA = 0xc8 + WIN_READDMA_EXT = 0x25 + WIN_READDMA_ONCE = 0xc9 + WIN_READDMA_QUEUED = 0xc7 + WIN_READDMA_QUEUED_EXT = 0x26 + WIN_READ_BUFFER = 0xe4 + WIN_READ_EXT = 0x24 + WIN_READ_LONG = 0x22 + WIN_READ_LONG_ONCE = 0x23 + WIN_READ_NATIVE_MAX = 0xf8 + WIN_READ_NATIVE_MAX_EXT = 0x27 + WIN_READ_ONCE = 0x21 + WIN_RECAL = 0x10 + WIN_RESTORE = 0x10 + WIN_SECURITY_DISABLE = 0xf6 + WIN_SECURITY_ERASE_PREPARE = 0xf3 + WIN_SECURITY_ERASE_UNIT = 0xf4 + WIN_SECURITY_FREEZE_LOCK = 0xf5 + WIN_SECURITY_SET_PASS = 0xf1 + WIN_SECURITY_UNLOCK = 0xf2 + WIN_SEEK = 0x70 + WIN_SETFEATURES = 0xef + WIN_SETIDLE1 = 0xe3 + WIN_SETIDLE2 = 0x97 + WIN_SETMULT = 0xc6 + WIN_SET_MAX = 0xf9 + WIN_SET_MAX_EXT = 0x37 + WIN_SLEEPNOW1 = 0xe6 + WIN_SLEEPNOW2 = 0x99 + WIN_SMART = 0xb0 + WIN_SPECIFY = 0x91 + WIN_SRST = 0x8 + WIN_STANDBY = 0xe2 + WIN_STANDBY2 = 0x96 + WIN_STANDBYNOW1 = 0xe0 + WIN_STANDBYNOW2 = 0x94 + WIN_VERIFY = 0x40 + WIN_VERIFY_EXT = 0x42 + WIN_VERIFY_ONCE = 0x41 + WIN_WRITE = 0x30 + WIN_WRITEDMA = 0xca + WIN_WRITEDMA_EXT = 0x35 + WIN_WRITEDMA_ONCE = 0xcb + WIN_WRITEDMA_QUEUED = 0xcc + WIN_WRITEDMA_QUEUED_EXT = 0x36 + WIN_WRITE_BUFFER = 0xe8 + WIN_WRITE_EXT = 0x34 + WIN_WRITE_LONG = 0x32 + WIN_WRITE_LONG_ONCE = 0x33 + WIN_WRITE_ONCE = 0x31 + WIN_WRITE_SAME = 0xe9 + WIN_WRITE_VERIFY = 0x3c + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x40 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4000 + XDP_COPY = 0x2 + XDP_FLAGS_DRV_MODE = 0x4 + XDP_FLAGS_HW_MODE = 0x8 + XDP_FLAGS_MASK = 0xf + XDP_FLAGS_MODES = 0xe + XDP_FLAGS_SKB_MODE = 0x2 + XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 + XDP_MMAP_OFFSETS = 0x1 + XDP_PGOFF_RX_RING = 0x0 + XDP_PGOFF_TX_RING = 0x80000000 + XDP_RX_RING = 0x2 + XDP_SHARED_UMEM = 0x1 + XDP_STATISTICS = 0x7 + XDP_TX_RING = 0x3 + XDP_UMEM_COMPLETION_RING = 0x6 + XDP_UMEM_FILL_RING = 0x5 + XDP_UMEM_PGOFF_COMPLETION_RING = 0x180000000 + XDP_UMEM_PGOFF_FILL_RING = 0x100000000 + XDP_UMEM_REG = 0x4 + XDP_ZEROCOPY = 0x4 + XENFS_SUPER_MAGIC = 0xabba1974 + XTABS = 0xc00 + ZSMALLOC_MAGIC = 0x58295829 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x62) + EADDRNOTAVAIL = syscall.Errno(0x63) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x61) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x72) + EBADE = syscall.Errno(0x34) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x4d) + EBADMSG = syscall.Errno(0x4a) + EBADR = syscall.Errno(0x35) + EBADRQC = syscall.Errno(0x38) + EBADSLT = syscall.Errno(0x39) + EBFONT = syscall.Errno(0x3b) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x7d) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x2c) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x67) + ECONNREFUSED = syscall.Errno(0x6f) + ECONNRESET = syscall.Errno(0x68) + EDEADLK = syscall.Errno(0x23) + EDEADLOCK = syscall.Errno(0x3a) + EDESTADDRREQ = syscall.Errno(0x59) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x49) + EDQUOT = syscall.Errno(0x7a) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x70) + EHOSTUNREACH = syscall.Errno(0x71) + EHWPOISON = syscall.Errno(0x85) + EIDRM = syscall.Errno(0x2b) + EILSEQ = syscall.Errno(0x54) + EINPROGRESS = syscall.Errno(0x73) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x6a) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x78) + EKEYEXPIRED = syscall.Errno(0x7f) + EKEYREJECTED = syscall.Errno(0x81) + EKEYREVOKED = syscall.Errno(0x80) + EL2HLT = syscall.Errno(0x33) + EL2NSYNC = syscall.Errno(0x2d) + EL3HLT = syscall.Errno(0x2e) + EL3RST = syscall.Errno(0x2f) + ELIBACC = syscall.Errno(0x4f) + ELIBBAD = syscall.Errno(0x50) + ELIBEXEC = syscall.Errno(0x53) + ELIBMAX = syscall.Errno(0x52) + ELIBSCN = syscall.Errno(0x51) + ELNRNG = syscall.Errno(0x30) + ELOOP = syscall.Errno(0x28) + EMEDIUMTYPE = syscall.Errno(0x7c) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x5a) + EMULTIHOP = syscall.Errno(0x48) + ENAMETOOLONG = syscall.Errno(0x24) + ENAVAIL = syscall.Errno(0x77) + ENETDOWN = syscall.Errno(0x64) + ENETRESET = syscall.Errno(0x66) + ENETUNREACH = syscall.Errno(0x65) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x37) + ENOBUFS = syscall.Errno(0x69) + ENOCSI = syscall.Errno(0x32) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0x7e) + ENOLCK = syscall.Errno(0x25) + ENOLINK = syscall.Errno(0x43) + ENOMEDIUM = syscall.Errno(0x7b) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x2a) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x5c) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x26) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x6b) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x27) + ENOTNAM = syscall.Errno(0x76) + ENOTRECOVERABLE = syscall.Errno(0x83) + ENOTSOCK = syscall.Errno(0x58) + ENOTSUP = syscall.Errno(0x5f) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x4c) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x5f) + EOVERFLOW = syscall.Errno(0x4b) + EOWNERDEAD = syscall.Errno(0x82) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x60) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x5d) + EPROTOTYPE = syscall.Errno(0x5b) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x4e) + EREMOTE = syscall.Errno(0x42) + EREMOTEIO = syscall.Errno(0x79) + ERESTART = syscall.Errno(0x55) + ERFKILL = syscall.Errno(0x84) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x6c) + ESOCKTNOSUPPORT = syscall.Errno(0x5e) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x74) + ESTRPIPE = syscall.Errno(0x56) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x6e) + ETOOMANYREFS = syscall.Errno(0x6d) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x75) + EUNATCH = syscall.Errno(0x31) + EUSERS = syscall.Errno(0x57) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x36) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0x7) + SIGCHLD = syscall.Signal(0x11) + SIGCLD = syscall.Signal(0x11) + SIGCONT = syscall.Signal(0x12) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x1d) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x1d) + SIGPROF = syscall.Signal(0x1b) + SIGPWR = syscall.Signal(0x1e) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTKFLT = syscall.Signal(0x10) + SIGSTOP = syscall.Signal(0x13) + SIGSYS = syscall.Signal(0x1f) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x14) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x17) + SIGUSR1 = syscall.Signal(0xa) + SIGUSR2 = syscall.Signal(0xc) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "no such device or address"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EAGAIN", "resource temporarily unavailable"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device or resource busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "invalid cross-device link"}, + {19, "ENODEV", "no such device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "numerical result out of range"}, + {35, "EDEADLK", "resource deadlock avoided"}, + {36, "ENAMETOOLONG", "file name too long"}, + {37, "ENOLCK", "no locks available"}, + {38, "ENOSYS", "function not implemented"}, + {39, "ENOTEMPTY", "directory not empty"}, + {40, "ELOOP", "too many levels of symbolic links"}, + {42, "ENOMSG", "no message of desired type"}, + {43, "EIDRM", "identifier removed"}, + {44, "ECHRNG", "channel number out of range"}, + {45, "EL2NSYNC", "level 2 not synchronized"}, + {46, "EL3HLT", "level 3 halted"}, + {47, "EL3RST", "level 3 reset"}, + {48, "ELNRNG", "link number out of range"}, + {49, "EUNATCH", "protocol driver not attached"}, + {50, "ENOCSI", "no CSI structure available"}, + {51, "EL2HLT", "level 2 halted"}, + {52, "EBADE", "invalid exchange"}, + {53, "EBADR", "invalid request descriptor"}, + {54, "EXFULL", "exchange full"}, + {55, "ENOANO", "no anode"}, + {56, "EBADRQC", "invalid request code"}, + {57, "EBADSLT", "invalid slot"}, + {58, "EDEADLOCK", "file locking deadlock error"}, + {59, "EBFONT", "bad font file format"}, + {60, "ENOSTR", "device not a stream"}, + {61, "ENODATA", "no data available"}, + {62, "ETIME", "timer expired"}, + {63, "ENOSR", "out of streams resources"}, + {64, "ENONET", "machine is not on the network"}, + {65, "ENOPKG", "package not installed"}, + {66, "EREMOTE", "object is remote"}, + {67, "ENOLINK", "link has been severed"}, + {68, "EADV", "advertise error"}, + {69, "ESRMNT", "srmount error"}, + {70, "ECOMM", "communication error on send"}, + {71, "EPROTO", "protocol error"}, + {72, "EMULTIHOP", "multihop attempted"}, + {73, "EDOTDOT", "RFS specific error"}, + {74, "EBADMSG", "bad message"}, + {75, "EOVERFLOW", "value too large for defined data type"}, + {76, "ENOTUNIQ", "name not unique on network"}, + {77, "EBADFD", "file descriptor in bad state"}, + {78, "EREMCHG", "remote address changed"}, + {79, "ELIBACC", "can not access a needed shared library"}, + {80, "ELIBBAD", "accessing a corrupted shared library"}, + {81, "ELIBSCN", ".lib section in a.out corrupted"}, + {82, "ELIBMAX", "attempting to link in too many shared libraries"}, + {83, "ELIBEXEC", "cannot exec a shared library directly"}, + {84, "EILSEQ", "invalid or incomplete multibyte or wide character"}, + {85, "ERESTART", "interrupted system call should be restarted"}, + {86, "ESTRPIPE", "streams pipe error"}, + {87, "EUSERS", "too many users"}, + {88, "ENOTSOCK", "socket operation on non-socket"}, + {89, "EDESTADDRREQ", "destination address required"}, + {90, "EMSGSIZE", "message too long"}, + {91, "EPROTOTYPE", "protocol wrong type for socket"}, + {92, "ENOPROTOOPT", "protocol not available"}, + {93, "EPROTONOSUPPORT", "protocol not supported"}, + {94, "ESOCKTNOSUPPORT", "socket type not supported"}, + {95, "ENOTSUP", "operation not supported"}, + {96, "EPFNOSUPPORT", "protocol family not supported"}, + {97, "EAFNOSUPPORT", "address family not supported by protocol"}, + {98, "EADDRINUSE", "address already in use"}, + {99, "EADDRNOTAVAIL", "cannot assign requested address"}, + {100, "ENETDOWN", "network is down"}, + {101, "ENETUNREACH", "network is unreachable"}, + {102, "ENETRESET", "network dropped connection on reset"}, + {103, "ECONNABORTED", "software caused connection abort"}, + {104, "ECONNRESET", "connection reset by peer"}, + {105, "ENOBUFS", "no buffer space available"}, + {106, "EISCONN", "transport endpoint is already connected"}, + {107, "ENOTCONN", "transport endpoint is not connected"}, + {108, "ESHUTDOWN", "cannot send after transport endpoint shutdown"}, + {109, "ETOOMANYREFS", "too many references: cannot splice"}, + {110, "ETIMEDOUT", "connection timed out"}, + {111, "ECONNREFUSED", "connection refused"}, + {112, "EHOSTDOWN", "host is down"}, + {113, "EHOSTUNREACH", "no route to host"}, + {114, "EALREADY", "operation already in progress"}, + {115, "EINPROGRESS", "operation now in progress"}, + {116, "ESTALE", "stale file handle"}, + {117, "EUCLEAN", "structure needs cleaning"}, + {118, "ENOTNAM", "not a XENIX named type file"}, + {119, "ENAVAIL", "no XENIX semaphores available"}, + {120, "EISNAM", "is a named type file"}, + {121, "EREMOTEIO", "remote I/O error"}, + {122, "EDQUOT", "disk quota exceeded"}, + {123, "ENOMEDIUM", "no medium found"}, + {124, "EMEDIUMTYPE", "wrong medium type"}, + {125, "ECANCELED", "operation canceled"}, + {126, "ENOKEY", "required key not available"}, + {127, "EKEYEXPIRED", "key has expired"}, + {128, "EKEYREVOKED", "key has been revoked"}, + {129, "EKEYREJECTED", "key was rejected by service"}, + {130, "EOWNERDEAD", "owner died"}, + {131, "ENOTRECOVERABLE", "state not recoverable"}, + {132, "ERFKILL", "operation not possible due to RF-kill"}, + {133, "EHWPOISON", "memory page has hardware error"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/breakpoint trap"}, + {6, "SIGABRT", "aborted"}, + {7, "SIGBUS", "bus error"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGUSR1", "user defined signal 1"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGUSR2", "user defined signal 2"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGSTKFLT", "stack fault"}, + {17, "SIGCHLD", "child exited"}, + {18, "SIGCONT", "continued"}, + {19, "SIGSTOP", "stopped (signal)"}, + {20, "SIGTSTP", "stopped"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGURG", "urgent I/O condition"}, + {24, "SIGXCPU", "CPU time limit exceeded"}, + {25, "SIGXFSZ", "file size limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window changed"}, + {29, "SIGIO", "I/O possible"}, + {30, "SIGPWR", "power failure"}, + {31, "SIGSYS", "bad system call"}, +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go new file mode 100644 index 00000000..0954f472 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go @@ -0,0 +1,2689 @@ +// mkerrors.sh -Wall -Werror -static -I/tmp/include +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build riscv64,linux + +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go + +package unix + +import "syscall" + +const ( + AAFS_MAGIC = 0x5a3c69f0 + ADFS_SUPER_MAGIC = 0xadf5 + AFFS_SUPER_MAGIC = 0xadff + AFS_FS_MAGIC = 0x6b414653 + AFS_SUPER_MAGIC = 0x5346414f + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2c + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + AF_XDP = 0x2c + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ANON_INODE_FS_MAGIC = 0x9041934 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_RAWIP = 0x207 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + AUTOFS_SUPER_MAGIC = 0x187 + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BALLOON_KVM_MAGIC = 0x13661366 + BDEVFS_MAGIC = 0x62646576 + BINFMTFS_MAGIC = 0x42494e4d + BLKBSZGET = 0x80081270 + BLKBSZSET = 0x40081271 + BLKFLSBUF = 0x1261 + BLKFRAGET = 0x1265 + BLKFRASET = 0x1264 + BLKGETSIZE = 0x1260 + BLKGETSIZE64 = 0x80081272 + BLKPBSZGET = 0x127b + BLKRAGET = 0x1263 + BLKRASET = 0x1262 + BLKROGET = 0x125e + BLKROSET = 0x125d + BLKRRPART = 0x125f + BLKSECTGET = 0x1267 + BLKSECTSET = 0x1266 + BLKSSZGET = 0x1268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_FS_MAGIC = 0xcafe4a11 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + BTRFS_SUPER_MAGIC = 0x9123683e + BTRFS_TEST_MAGIC = 0x73727279 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CGROUP2_SUPER_MAGIC = 0x63677270 + CGROUP_SUPER_MAGIC = 0x27e0eb + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CODA_SUPER_MAGIC = 0x73757245 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRAMFS_MAGIC = 0x28cd3d45 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DAXFS_MAGIC = 0x64646178 + DEBUGFS_MAGIC = 0x64626720 + DEVPTS_SUPER_MAGIC = 0x1cd1 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + ECRYPTFS_SUPER_MAGIC = 0xf15f + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x800 + EFD_SEMAPHORE = 0x1 + EFIVARFS_MAGIC = 0xde5e81e4 + EFS_SUPER_MAGIC = 0x414a53 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_ERSPAN = 0x88be + ETH_P_ERSPAN2 = 0x22eb + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IFE = 0xed3e + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MAP = 0xf9 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_NSH = 0x894f + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PREAUTH = 0x88c7 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXABYTE_ENABLE_NEST = 0xf0 + EXT2_SUPER_MAGIC = 0xef53 + EXT3_SUPER_MAGIC = 0xef53 + EXT4_SUPER_MAGIC = 0xef53 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + F2FS_SUPER_MAGIC = 0xf2f52010 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x1000 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_ENCRYPTION_MODE_SPECK128_256_CTS = 0x8 + FS_ENCRYPTION_MODE_SPECK128_256_XTS = 0x7 + FS_IOC_GET_ENCRYPTION_POLICY = 0x400c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x40106614 + FS_IOC_SET_ENCRYPTION_POLICY = 0x800c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0x3 + FUTEXFS_SUPER_MAGIC = 0xbad1dea + F_ADD_SEALS = 0x409 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0x5 + F_GETLK64 = 0x5 + F_GETOWN = 0x9 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_GET_FILE_RW_HINT = 0x40d + F_GET_RW_HINT = 0x40b + F_GET_SEALS = 0x40a + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SEAL_GROW = 0x4 + F_SEAL_SEAL = 0x1 + F_SEAL_SHRINK = 0x2 + F_SEAL_WRITE = 0x8 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x6 + F_SETLK64 = 0x6 + F_SETLKW = 0x7 + F_SETLKW64 = 0x7 + F_SETOWN = 0x8 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SET_FILE_RW_HINT = 0x40e + F_SET_RW_HINT = 0x40c + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HDIO_DRIVE_CMD = 0x31f + HDIO_DRIVE_CMD_AEB = 0x31e + HDIO_DRIVE_CMD_HDR_SIZE = 0x4 + HDIO_DRIVE_HOB_HDR_SIZE = 0x8 + HDIO_DRIVE_RESET = 0x31c + HDIO_DRIVE_TASK = 0x31e + HDIO_DRIVE_TASKFILE = 0x31d + HDIO_DRIVE_TASK_HDR_SIZE = 0x8 + HDIO_GETGEO = 0x301 + HDIO_GET_32BIT = 0x309 + HDIO_GET_ACOUSTIC = 0x30f + HDIO_GET_ADDRESS = 0x310 + HDIO_GET_BUSSTATE = 0x31a + HDIO_GET_DMA = 0x30b + HDIO_GET_IDENTITY = 0x30d + HDIO_GET_KEEPSETTINGS = 0x308 + HDIO_GET_MULTCOUNT = 0x304 + HDIO_GET_NICE = 0x30c + HDIO_GET_NOWERR = 0x30a + HDIO_GET_QDMA = 0x305 + HDIO_GET_UNMASKINTR = 0x302 + HDIO_GET_WCACHE = 0x30e + HDIO_OBSOLETE_IDENTITY = 0x307 + HDIO_SCAN_HWIF = 0x328 + HDIO_SET_32BIT = 0x324 + HDIO_SET_ACOUSTIC = 0x32c + HDIO_SET_ADDRESS = 0x32f + HDIO_SET_BUSSTATE = 0x32d + HDIO_SET_DMA = 0x326 + HDIO_SET_KEEPSETTINGS = 0x323 + HDIO_SET_MULTCOUNT = 0x321 + HDIO_SET_NICE = 0x329 + HDIO_SET_NOWERR = 0x325 + HDIO_SET_PIO_MODE = 0x327 + HDIO_SET_QDMA = 0x32e + HDIO_SET_UNMASKINTR = 0x322 + HDIO_SET_WCACHE = 0x32b + HDIO_SET_XFER = 0x306 + HDIO_TRISTATE_HWIF = 0x31b + HDIO_UNREGISTER_HWIF = 0x32a + HOSTFS_SUPER_MAGIC = 0xc0ffee + HPFS_SUPER_MAGIC = 0xf995e849 + HUGETLBFS_MAGIC = 0x958458f6 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x8000 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x9 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NAPI = 0x10 + IFF_NAPI_FRAGS = 0x20 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x800 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_FREEBIND = 0x4e + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISOFS_SUPER_MAGIC = 0x9660 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + JFFS2_SUPER_MAGIC = 0x72b6 + KEXEC_ARCH_386 = 0x30000 + KEXEC_ARCH_68K = 0x40000 + KEXEC_ARCH_AARCH64 = 0xb70000 + KEXEC_ARCH_ARM = 0x280000 + KEXEC_ARCH_DEFAULT = 0x0 + KEXEC_ARCH_IA_64 = 0x320000 + KEXEC_ARCH_MASK = 0xffff0000 + KEXEC_ARCH_MIPS = 0x80000 + KEXEC_ARCH_MIPS_LE = 0xa0000 + KEXEC_ARCH_PPC = 0x140000 + KEXEC_ARCH_PPC64 = 0x150000 + KEXEC_ARCH_S390 = 0x160000 + KEXEC_ARCH_SH = 0x2a0000 + KEXEC_ARCH_X86_64 = 0x3e0000 + KEXEC_FILE_NO_INITRAMFS = 0x4 + KEXEC_FILE_ON_CRASH = 0x2 + KEXEC_FILE_UNLOAD = 0x1 + KEXEC_ON_CRASH = 0x1 + KEXEC_PRESERVE_CONTEXT = 0x2 + KEXEC_SEGMENT_MAX = 0x10 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_NEGATE = 0xd + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_KEEPONFORK = 0x13 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MADV_WIPEONFORK = 0x12 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_FIXED_NOREPLACE = 0x100000 + MAP_GROWSDOWN = 0x100 + MAP_HUGETLB = 0x40000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x2000 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x4000 + MAP_POPULATE = 0x8000 + MAP_PRIVATE = 0x2 + MAP_SHARED = 0x1 + MAP_SHARED_VALIDATE = 0x3 + MAP_STACK = 0x20000 + MAP_SYNC = 0x80000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MFD_ALLOW_SEALING = 0x2 + MFD_CLOEXEC = 0x1 + MFD_HUGETLB = 0x4 + MFD_HUGE_16GB = -0x78000000 + MFD_HUGE_16MB = 0x60000000 + MFD_HUGE_1GB = 0x78000000 + MFD_HUGE_1MB = 0x50000000 + MFD_HUGE_256MB = 0x70000000 + MFD_HUGE_2GB = 0x7c000000 + MFD_HUGE_2MB = 0x54000000 + MFD_HUGE_32MB = 0x64000000 + MFD_HUGE_512KB = 0x4c000000 + MFD_HUGE_512MB = 0x74000000 + MFD_HUGE_64KB = 0x40000000 + MFD_HUGE_8MB = 0x5c000000 + MFD_HUGE_MASK = 0x3f + MFD_HUGE_SHIFT = 0x1a + MINIX2_SUPER_MAGIC = 0x2468 + MINIX2_SUPER_MAGIC2 = 0x2478 + MINIX3_SUPER_MAGIC = 0x4d5a + MINIX_SUPER_MAGIC = 0x137f + MINIX_SUPER_MAGIC2 = 0x138f + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSDOS_SUPER_MAGIC = 0x4d44 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MSG_ZEROCOPY = 0x4000000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + MTD_INODE_FS_MAGIC = 0x11307854 + NAME_MAX = 0xff + NCP_SUPER_MAGIC = 0x564c + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NETNSA_MAX = 0x3 + NETNSA_NSID_NOT_ASSIGNED = -0x1 + NFNETLINK_V0 = 0x0 + NFNLGRP_ACCT_QUOTA = 0x8 + NFNLGRP_CONNTRACK_DESTROY = 0x3 + NFNLGRP_CONNTRACK_EXP_DESTROY = 0x6 + NFNLGRP_CONNTRACK_EXP_NEW = 0x4 + NFNLGRP_CONNTRACK_EXP_UPDATE = 0x5 + NFNLGRP_CONNTRACK_NEW = 0x1 + NFNLGRP_CONNTRACK_UPDATE = 0x2 + NFNLGRP_MAX = 0x9 + NFNLGRP_NFTABLES = 0x7 + NFNLGRP_NFTRACE = 0x9 + NFNLGRP_NONE = 0x0 + NFNL_BATCH_MAX = 0x1 + NFNL_MSG_BATCH_BEGIN = 0x10 + NFNL_MSG_BATCH_END = 0x11 + NFNL_NFA_NEST = 0x8000 + NFNL_SUBSYS_ACCT = 0x7 + NFNL_SUBSYS_COUNT = 0xc + NFNL_SUBSYS_CTHELPER = 0x9 + NFNL_SUBSYS_CTNETLINK = 0x1 + NFNL_SUBSYS_CTNETLINK_EXP = 0x2 + NFNL_SUBSYS_CTNETLINK_TIMEOUT = 0x8 + NFNL_SUBSYS_IPSET = 0x6 + NFNL_SUBSYS_NFTABLES = 0xa + NFNL_SUBSYS_NFT_COMPAT = 0xb + NFNL_SUBSYS_NONE = 0x0 + NFNL_SUBSYS_OSF = 0x5 + NFNL_SUBSYS_QUEUE = 0x3 + NFNL_SUBSYS_ULOG = 0x4 + NFS_SUPER_MAGIC = 0x6969 + NILFS_SUPER_MAGIC = 0x3434 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_NONREC = 0x100 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + NSFS_MAGIC = 0x6e736673 + OCFS2_SUPER_MAGIC = 0x7461636f + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPENPROM_SUPER_MAGIC = 0x9fa1 + OPOST = 0x1 + OVERLAYFS_SUPER_MAGIC = 0x794c7630 + O_ACCMODE = 0x3 + O_APPEND = 0x400 + O_ASYNC = 0x2000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x40 + O_DIRECT = 0x4000 + O_DIRECTORY = 0x10000 + O_DSYNC = 0x1000 + O_EXCL = 0x80 + O_FSYNC = 0x101000 + O_LARGEFILE = 0x0 + O_NDELAY = 0x800 + O_NOATIME = 0x40000 + O_NOCTTY = 0x100 + O_NOFOLLOW = 0x20000 + O_NONBLOCK = 0x800 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x101000 + O_SYNC = 0x101000 + O_TMPFILE = 0x410000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x2401 + PERF_EVENT_IOC_ENABLE = 0x2400 + PERF_EVENT_IOC_ID = 0x80082407 + PERF_EVENT_IOC_MODIFY_ATTRIBUTES = 0x4008240b + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x40042409 + PERF_EVENT_IOC_PERIOD = 0x40082404 + PERF_EVENT_IOC_QUERY_BPF = 0xc008240a + PERF_EVENT_IOC_REFRESH = 0x2402 + PERF_EVENT_IOC_RESET = 0x2403 + PERF_EVENT_IOC_SET_BPF = 0x40042408 + PERF_EVENT_IOC_SET_FILTER = 0x40082406 + PERF_EVENT_IOC_SET_OUTPUT = 0x2405 + PIPEFS_MAGIC = 0x50495045 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROC_SUPER_MAGIC = 0x9fa0 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_SPECULATION_CTRL = 0x34 + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffffffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_SPECULATION_CTRL = 0x35 + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_SPEC_DISABLE = 0x4 + PR_SPEC_ENABLE = 0x2 + PR_SPEC_FORCE_DISABLE = 0x8 + PR_SPEC_NOT_AFFECTED = 0x0 + PR_SPEC_PRCTL = 0x1 + PR_SPEC_STORE_BYPASS = 0x0 + PR_SVE_GET_VL = 0x33 + PR_SVE_SET_VL = 0x32 + PR_SVE_SET_VL_ONEXEC = 0x40000 + PR_SVE_VL_INHERIT = 0x20000 + PR_SVE_VL_LEN_MASK = 0xffff + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PSTOREFS_MAGIC = 0x6165676c + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKETEXT = 0x4 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SECCOMP_GET_METADATA = 0x420d + PTRACE_SEIZE = 0x4206 + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_TRACEME = 0x0 + QNX4_SUPER_MAGIC = 0x2f + QNX6_SUPER_MAGIC = 0x68191122 + RAMFS_MAGIC = 0x858458f6 + RDTGROUP_SUPER_MAGIC = 0x7655821 + REISERFS_SUPER_MAGIC = 0x52654973 + RENAME_EXCHANGE = 0x2 + RENAME_NOREPLACE = 0x1 + RENAME_WHITEOUT = 0x4 + RLIMIT_AS = 0x9 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x8 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x7 + RLIMIT_NPROC = 0x6 + RLIMIT_RSS = 0x5 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FASTOPEN_NO_COOKIE = 0x11 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x11 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1d + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTC_AF = 0x20 + RTC_AIE_OFF = 0x7002 + RTC_AIE_ON = 0x7001 + RTC_ALM_READ = 0x80247008 + RTC_ALM_SET = 0x40247007 + RTC_EPOCH_READ = 0x8008700d + RTC_EPOCH_SET = 0x4008700e + RTC_IRQF = 0x80 + RTC_IRQP_READ = 0x8008700b + RTC_IRQP_SET = 0x4008700c + RTC_MAX_FREQ = 0x2000 + RTC_PF = 0x40 + RTC_PIE_OFF = 0x7006 + RTC_PIE_ON = 0x7005 + RTC_PLL_GET = 0x80207011 + RTC_PLL_SET = 0x40207012 + RTC_RD_TIME = 0x80247009 + RTC_SET_TIME = 0x4024700a + RTC_UF = 0x10 + RTC_UIE_OFF = 0x7004 + RTC_UIE_ON = 0x7003 + RTC_VL_CLR = 0x7014 + RTC_VL_READ = 0x80047013 + RTC_WIE_OFF = 0x7010 + RTC_WIE_ON = 0x700f + RTC_WKALM_RD = 0x80287010 + RTC_WKALM_SET = 0x4028700f + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELCHAIN = 0x65 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETCHAIN = 0x66 + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x67 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWCHAIN = 0x64 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x16 + RTM_NR_MSGTYPES = 0x58 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BGP = 0xba + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_EIGRP = 0xc0 + RTPROT_GATED = 0x8 + RTPROT_ISIS = 0xbb + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_OSPF = 0xbc + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_RIP = 0xbd + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_TXTIME = 0x3d + SCM_WIFI_STATUS = 0x29 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SECURITYFS_MAGIC = 0x73636673 + SELINUX_MAGIC = 0xf97cff8c + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x8905 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x8904 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x541b + SIOCOUTQ = 0x5411 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x8902 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SMACK_MAGIC = 0x43415d53 + SMART_AUTOSAVE = 0xd2 + SMART_AUTO_OFFLINE = 0xdb + SMART_DISABLE = 0xd9 + SMART_ENABLE = 0xd8 + SMART_HCYL_PASS = 0xc2 + SMART_IMMEDIATE_OFFLINE = 0xd4 + SMART_LCYL_PASS = 0x4f + SMART_READ_LOG_SECTOR = 0xd5 + SMART_READ_THRESHOLDS = 0xd1 + SMART_READ_VALUES = 0xd0 + SMART_SAVE = 0xd3 + SMART_STATUS = 0xda + SMART_WRITE_LOG_SECTOR = 0xd6 + SMART_WRITE_THRESHOLDS = 0xd7 + SMB_SUPER_MAGIC = 0x517b + SOCKFS_MAGIC = 0x534f434b + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x2 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x800 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0x1 + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_TLS = 0x11a + SOL_X25 = 0x106 + SOL_XDP = 0x11b + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1e + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x6 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x27 + SO_DONTROUTE = 0x5 + SO_ERROR = 0x4 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x9 + SO_LINGER = 0xd + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0xa + SO_PASSCRED = 0x10 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x11 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1f + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x26 + SO_RCVBUF = 0x8 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x12 + SO_RCVTIMEO = 0x14 + SO_REUSEADDR = 0x2 + SO_REUSEPORT = 0xf + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x7 + SO_SNDBUFFORCE = 0x20 + SO_SNDLOWAT = 0x13 + SO_SNDTIMEO = 0x15 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TXTIME = 0x3d + SO_TYPE = 0x3 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SO_ZEROCOPY = 0x3c + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + SQUASHFS_MAGIC = 0x73717368 + STACK_END_MAGIC = 0x57ac6e9d + STATX_ALL = 0xfff + STATX_ATIME = 0x20 + STATX_ATTR_APPEND = 0x20 + STATX_ATTR_AUTOMOUNT = 0x1000 + STATX_ATTR_COMPRESSED = 0x4 + STATX_ATTR_ENCRYPTED = 0x800 + STATX_ATTR_IMMUTABLE = 0x10 + STATX_ATTR_NODUMP = 0x40 + STATX_BASIC_STATS = 0x7ff + STATX_BLOCKS = 0x400 + STATX_BTIME = 0x800 + STATX_CTIME = 0x80 + STATX_GID = 0x10 + STATX_INO = 0x100 + STATX_MODE = 0x2 + STATX_MTIME = 0x40 + STATX_NLINK = 0x4 + STATX_SIZE = 0x200 + STATX_TYPE = 0x1 + STATX_UID = 0x8 + STATX__RESERVED = 0x80000000 + SYNC_FILE_RANGE_WAIT_AFTER = 0x4 + SYNC_FILE_RANGE_WAIT_BEFORE = 0x1 + SYNC_FILE_RANGE_WRITE = 0x2 + SYSFS_MAGIC = 0x62656572 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x8 + TCFLSH = 0x540b + TCGETA = 0x5405 + TCGETS = 0x5401 + TCGETS2 = 0x802c542a + TCGETX = 0x5432 + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_FASTOPEN_KEY = 0x21 + TCP_FASTOPEN_NO_COOKIE = 0x22 + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_EXT = 0x20 + TCP_MD5SIG_FLAG_PREFIX = 0x1 + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_ULP = 0x1f + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x2 + TCSBRK = 0x5409 + TCSBRKP = 0x5425 + TCSETA = 0x5406 + TCSETAF = 0x5408 + TCSETAW = 0x5407 + TCSETS = 0x5402 + TCSETS2 = 0x402c542b + TCSETSF = 0x5404 + TCSETSF2 = 0x402c542d + TCSETSW = 0x5403 + TCSETSW2 = 0x402c542c + TCSETX = 0x5433 + TCSETXF = 0x5434 + TCSETXW = 0x5435 + TCXONC = 0x540a + TIOCCBRK = 0x5428 + TIOCCONS = 0x541d + TIOCEXCL = 0x540c + TIOCGDEV = 0x80045432 + TIOCGETD = 0x5424 + TIOCGEXCL = 0x80045440 + TIOCGICOUNT = 0x545d + TIOCGLCKTRMIOS = 0x5456 + TIOCGPGRP = 0x540f + TIOCGPKT = 0x80045438 + TIOCGPTLCK = 0x80045439 + TIOCGPTN = 0x80045430 + TIOCGPTPEER = 0x5441 + TIOCGRS485 = 0x542e + TIOCGSERIAL = 0x541e + TIOCGSID = 0x5429 + TIOCGSOFTCAR = 0x5419 + TIOCGWINSZ = 0x5413 + TIOCINQ = 0x541b + TIOCLINUX = 0x541c + TIOCMBIC = 0x5417 + TIOCMBIS = 0x5416 + TIOCMGET = 0x5415 + TIOCMIWAIT = 0x545c + TIOCMSET = 0x5418 + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x5422 + TIOCNXCL = 0x540d + TIOCOUTQ = 0x5411 + TIOCPKT = 0x5420 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x540e + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x5423 + TIOCSIG = 0x40045436 + TIOCSLCKTRMIOS = 0x5457 + TIOCSPGRP = 0x5410 + TIOCSPTLCK = 0x40045431 + TIOCSRS485 = 0x542f + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x541a + TIOCSTI = 0x5412 + TIOCSWINSZ = 0x5414 + TIOCVHANGUP = 0x5437 + TMPFS_MAGIC = 0x1021994 + TOSTOP = 0x100 + TPACKET_ALIGNMENT = 0x10 + TPACKET_HDRLEN = 0x34 + TP_STATUS_AVAILABLE = 0x0 + TP_STATUS_BLK_TMO = 0x20 + TP_STATUS_COPY = 0x2 + TP_STATUS_CSUMNOTREADY = 0x8 + TP_STATUS_CSUM_VALID = 0x80 + TP_STATUS_KERNEL = 0x0 + TP_STATUS_LOSING = 0x4 + TP_STATUS_SENDING = 0x2 + TP_STATUS_SEND_REQUEST = 0x1 + TP_STATUS_TS_RAW_HARDWARE = -0x80000000 + TP_STATUS_TS_SOFTWARE = 0x20000000 + TP_STATUS_TS_SYS_HARDWARE = 0x40000000 + TP_STATUS_USER = 0x1 + TP_STATUS_VLAN_TPID_VALID = 0x40 + TP_STATUS_VLAN_VALID = 0x10 + TP_STATUS_WRONG_FORMAT = 0x4 + TRACEFS_MAGIC = 0x74726163 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x401054d5 + TUNDETACHFILTER = 0x401054d6 + TUNGETFEATURES = 0x800454cf + TUNGETFILTER = 0x801054db + TUNGETIFF = 0x800454d2 + TUNGETSNDBUF = 0x800454d3 + TUNGETVNETBE = 0x800454df + TUNGETVNETHDRSZ = 0x800454d7 + TUNGETVNETLE = 0x800454dd + TUNSETDEBUG = 0x400454c9 + TUNSETFILTEREBPF = 0x800454e1 + TUNSETGROUP = 0x400454ce + TUNSETIFF = 0x400454ca + TUNSETIFINDEX = 0x400454da + TUNSETLINK = 0x400454cd + TUNSETNOCSUM = 0x400454c8 + TUNSETOFFLOAD = 0x400454d0 + TUNSETOWNER = 0x400454cc + TUNSETPERSIST = 0x400454cb + TUNSETQUEUE = 0x400454d9 + TUNSETSNDBUF = 0x400454d4 + TUNSETSTEERINGEBPF = 0x800454e0 + TUNSETTXFILTER = 0x400454d1 + TUNSETVNETBE = 0x400454de + TUNSETVNETHDRSZ = 0x400454d8 + TUNSETVNETLE = 0x400454dc + UBI_IOCATT = 0x40186f40 + UBI_IOCDET = 0x40046f41 + UBI_IOCEBCH = 0x40044f02 + UBI_IOCEBER = 0x40044f01 + UBI_IOCEBISMAP = 0x80044f05 + UBI_IOCEBMAP = 0x40084f03 + UBI_IOCEBUNMAP = 0x40044f04 + UBI_IOCMKVOL = 0x40986f00 + UBI_IOCRMVOL = 0x40046f01 + UBI_IOCRNVOL = 0x51106f03 + UBI_IOCRSVOL = 0x400c6f02 + UBI_IOCSETVOLPROP = 0x40104f06 + UBI_IOCVOLCRBLK = 0x40804f07 + UBI_IOCVOLRMBLK = 0x4f08 + UBI_IOCVOLUP = 0x40084f00 + UDF_SUPER_MAGIC = 0x15013346 + UMOUNT_NOFOLLOW = 0x8 + USBDEVICE_SUPER_MAGIC = 0x9fa2 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + V9FS_MAGIC = 0x1021997 + VDISCARD = 0xd + VEOF = 0x4 + VEOL = 0xb + VEOL2 = 0x10 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x6 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x80045702 + WDIOC_GETPRETIMEOUT = 0x80045709 + WDIOC_GETSTATUS = 0x80045701 + WDIOC_GETSUPPORT = 0x80285700 + WDIOC_GETTEMP = 0x80045703 + WDIOC_GETTIMELEFT = 0x8004570a + WDIOC_GETTIMEOUT = 0x80045707 + WDIOC_KEEPALIVE = 0x80045705 + WDIOC_SETOPTIONS = 0x80045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WIN_ACKMEDIACHANGE = 0xdb + WIN_CHECKPOWERMODE1 = 0xe5 + WIN_CHECKPOWERMODE2 = 0x98 + WIN_DEVICE_RESET = 0x8 + WIN_DIAGNOSE = 0x90 + WIN_DOORLOCK = 0xde + WIN_DOORUNLOCK = 0xdf + WIN_DOWNLOAD_MICROCODE = 0x92 + WIN_FLUSH_CACHE = 0xe7 + WIN_FLUSH_CACHE_EXT = 0xea + WIN_FORMAT = 0x50 + WIN_GETMEDIASTATUS = 0xda + WIN_IDENTIFY = 0xec + WIN_IDENTIFY_DMA = 0xee + WIN_IDLEIMMEDIATE = 0xe1 + WIN_INIT = 0x60 + WIN_MEDIAEJECT = 0xed + WIN_MULTREAD = 0xc4 + WIN_MULTREAD_EXT = 0x29 + WIN_MULTWRITE = 0xc5 + WIN_MULTWRITE_EXT = 0x39 + WIN_NOP = 0x0 + WIN_PACKETCMD = 0xa0 + WIN_PIDENTIFY = 0xa1 + WIN_POSTBOOT = 0xdc + WIN_PREBOOT = 0xdd + WIN_QUEUED_SERVICE = 0xa2 + WIN_READ = 0x20 + WIN_READDMA = 0xc8 + WIN_READDMA_EXT = 0x25 + WIN_READDMA_ONCE = 0xc9 + WIN_READDMA_QUEUED = 0xc7 + WIN_READDMA_QUEUED_EXT = 0x26 + WIN_READ_BUFFER = 0xe4 + WIN_READ_EXT = 0x24 + WIN_READ_LONG = 0x22 + WIN_READ_LONG_ONCE = 0x23 + WIN_READ_NATIVE_MAX = 0xf8 + WIN_READ_NATIVE_MAX_EXT = 0x27 + WIN_READ_ONCE = 0x21 + WIN_RECAL = 0x10 + WIN_RESTORE = 0x10 + WIN_SECURITY_DISABLE = 0xf6 + WIN_SECURITY_ERASE_PREPARE = 0xf3 + WIN_SECURITY_ERASE_UNIT = 0xf4 + WIN_SECURITY_FREEZE_LOCK = 0xf5 + WIN_SECURITY_SET_PASS = 0xf1 + WIN_SECURITY_UNLOCK = 0xf2 + WIN_SEEK = 0x70 + WIN_SETFEATURES = 0xef + WIN_SETIDLE1 = 0xe3 + WIN_SETIDLE2 = 0x97 + WIN_SETMULT = 0xc6 + WIN_SET_MAX = 0xf9 + WIN_SET_MAX_EXT = 0x37 + WIN_SLEEPNOW1 = 0xe6 + WIN_SLEEPNOW2 = 0x99 + WIN_SMART = 0xb0 + WIN_SPECIFY = 0x91 + WIN_SRST = 0x8 + WIN_STANDBY = 0xe2 + WIN_STANDBY2 = 0x96 + WIN_STANDBYNOW1 = 0xe0 + WIN_STANDBYNOW2 = 0x94 + WIN_VERIFY = 0x40 + WIN_VERIFY_EXT = 0x42 + WIN_VERIFY_ONCE = 0x41 + WIN_WRITE = 0x30 + WIN_WRITEDMA = 0xca + WIN_WRITEDMA_EXT = 0x35 + WIN_WRITEDMA_ONCE = 0xcb + WIN_WRITEDMA_QUEUED = 0xcc + WIN_WRITEDMA_QUEUED_EXT = 0x36 + WIN_WRITE_BUFFER = 0xe8 + WIN_WRITE_EXT = 0x34 + WIN_WRITE_LONG = 0x32 + WIN_WRITE_LONG_ONCE = 0x33 + WIN_WRITE_ONCE = 0x31 + WIN_WRITE_SAME = 0xe9 + WIN_WRITE_VERIFY = 0x3c + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x40 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XDP_COPY = 0x2 + XDP_FLAGS_DRV_MODE = 0x4 + XDP_FLAGS_HW_MODE = 0x8 + XDP_FLAGS_MASK = 0xf + XDP_FLAGS_MODES = 0xe + XDP_FLAGS_SKB_MODE = 0x2 + XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 + XDP_MMAP_OFFSETS = 0x1 + XDP_PGOFF_RX_RING = 0x0 + XDP_PGOFF_TX_RING = 0x80000000 + XDP_RX_RING = 0x2 + XDP_SHARED_UMEM = 0x1 + XDP_STATISTICS = 0x7 + XDP_TX_RING = 0x3 + XDP_UMEM_COMPLETION_RING = 0x6 + XDP_UMEM_FILL_RING = 0x5 + XDP_UMEM_PGOFF_COMPLETION_RING = 0x180000000 + XDP_UMEM_PGOFF_FILL_RING = 0x100000000 + XDP_UMEM_REG = 0x4 + XDP_ZEROCOPY = 0x4 + XENFS_SUPER_MAGIC = 0xabba1974 + XTABS = 0x1800 + ZSMALLOC_MAGIC = 0x58295829 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x62) + EADDRNOTAVAIL = syscall.Errno(0x63) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x61) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x72) + EBADE = syscall.Errno(0x34) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x4d) + EBADMSG = syscall.Errno(0x4a) + EBADR = syscall.Errno(0x35) + EBADRQC = syscall.Errno(0x38) + EBADSLT = syscall.Errno(0x39) + EBFONT = syscall.Errno(0x3b) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x7d) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x2c) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x67) + ECONNREFUSED = syscall.Errno(0x6f) + ECONNRESET = syscall.Errno(0x68) + EDEADLK = syscall.Errno(0x23) + EDEADLOCK = syscall.Errno(0x23) + EDESTADDRREQ = syscall.Errno(0x59) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x49) + EDQUOT = syscall.Errno(0x7a) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x70) + EHOSTUNREACH = syscall.Errno(0x71) + EHWPOISON = syscall.Errno(0x85) + EIDRM = syscall.Errno(0x2b) + EILSEQ = syscall.Errno(0x54) + EINPROGRESS = syscall.Errno(0x73) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x6a) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x78) + EKEYEXPIRED = syscall.Errno(0x7f) + EKEYREJECTED = syscall.Errno(0x81) + EKEYREVOKED = syscall.Errno(0x80) + EL2HLT = syscall.Errno(0x33) + EL2NSYNC = syscall.Errno(0x2d) + EL3HLT = syscall.Errno(0x2e) + EL3RST = syscall.Errno(0x2f) + ELIBACC = syscall.Errno(0x4f) + ELIBBAD = syscall.Errno(0x50) + ELIBEXEC = syscall.Errno(0x53) + ELIBMAX = syscall.Errno(0x52) + ELIBSCN = syscall.Errno(0x51) + ELNRNG = syscall.Errno(0x30) + ELOOP = syscall.Errno(0x28) + EMEDIUMTYPE = syscall.Errno(0x7c) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x5a) + EMULTIHOP = syscall.Errno(0x48) + ENAMETOOLONG = syscall.Errno(0x24) + ENAVAIL = syscall.Errno(0x77) + ENETDOWN = syscall.Errno(0x64) + ENETRESET = syscall.Errno(0x66) + ENETUNREACH = syscall.Errno(0x65) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x37) + ENOBUFS = syscall.Errno(0x69) + ENOCSI = syscall.Errno(0x32) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0x7e) + ENOLCK = syscall.Errno(0x25) + ENOLINK = syscall.Errno(0x43) + ENOMEDIUM = syscall.Errno(0x7b) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x2a) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x5c) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x26) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x6b) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x27) + ENOTNAM = syscall.Errno(0x76) + ENOTRECOVERABLE = syscall.Errno(0x83) + ENOTSOCK = syscall.Errno(0x58) + ENOTSUP = syscall.Errno(0x5f) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x4c) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x5f) + EOVERFLOW = syscall.Errno(0x4b) + EOWNERDEAD = syscall.Errno(0x82) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x60) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x5d) + EPROTOTYPE = syscall.Errno(0x5b) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x4e) + EREMOTE = syscall.Errno(0x42) + EREMOTEIO = syscall.Errno(0x79) + ERESTART = syscall.Errno(0x55) + ERFKILL = syscall.Errno(0x84) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x6c) + ESOCKTNOSUPPORT = syscall.Errno(0x5e) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x74) + ESTRPIPE = syscall.Errno(0x56) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x6e) + ETOOMANYREFS = syscall.Errno(0x6d) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x75) + EUNATCH = syscall.Errno(0x31) + EUSERS = syscall.Errno(0x57) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x36) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0x7) + SIGCHLD = syscall.Signal(0x11) + SIGCLD = syscall.Signal(0x11) + SIGCONT = syscall.Signal(0x12) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x1d) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x1d) + SIGPROF = syscall.Signal(0x1b) + SIGPWR = syscall.Signal(0x1e) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTKFLT = syscall.Signal(0x10) + SIGSTOP = syscall.Signal(0x13) + SIGSYS = syscall.Signal(0x1f) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x14) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x17) + SIGUSR1 = syscall.Signal(0xa) + SIGUSR2 = syscall.Signal(0xc) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "no such device or address"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EAGAIN", "resource temporarily unavailable"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device or resource busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "invalid cross-device link"}, + {19, "ENODEV", "no such device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "numerical result out of range"}, + {35, "EDEADLK", "resource deadlock avoided"}, + {36, "ENAMETOOLONG", "file name too long"}, + {37, "ENOLCK", "no locks available"}, + {38, "ENOSYS", "function not implemented"}, + {39, "ENOTEMPTY", "directory not empty"}, + {40, "ELOOP", "too many levels of symbolic links"}, + {42, "ENOMSG", "no message of desired type"}, + {43, "EIDRM", "identifier removed"}, + {44, "ECHRNG", "channel number out of range"}, + {45, "EL2NSYNC", "level 2 not synchronized"}, + {46, "EL3HLT", "level 3 halted"}, + {47, "EL3RST", "level 3 reset"}, + {48, "ELNRNG", "link number out of range"}, + {49, "EUNATCH", "protocol driver not attached"}, + {50, "ENOCSI", "no CSI structure available"}, + {51, "EL2HLT", "level 2 halted"}, + {52, "EBADE", "invalid exchange"}, + {53, "EBADR", "invalid request descriptor"}, + {54, "EXFULL", "exchange full"}, + {55, "ENOANO", "no anode"}, + {56, "EBADRQC", "invalid request code"}, + {57, "EBADSLT", "invalid slot"}, + {59, "EBFONT", "bad font file format"}, + {60, "ENOSTR", "device not a stream"}, + {61, "ENODATA", "no data available"}, + {62, "ETIME", "timer expired"}, + {63, "ENOSR", "out of streams resources"}, + {64, "ENONET", "machine is not on the network"}, + {65, "ENOPKG", "package not installed"}, + {66, "EREMOTE", "object is remote"}, + {67, "ENOLINK", "link has been severed"}, + {68, "EADV", "advertise error"}, + {69, "ESRMNT", "srmount error"}, + {70, "ECOMM", "communication error on send"}, + {71, "EPROTO", "protocol error"}, + {72, "EMULTIHOP", "multihop attempted"}, + {73, "EDOTDOT", "RFS specific error"}, + {74, "EBADMSG", "bad message"}, + {75, "EOVERFLOW", "value too large for defined data type"}, + {76, "ENOTUNIQ", "name not unique on network"}, + {77, "EBADFD", "file descriptor in bad state"}, + {78, "EREMCHG", "remote address changed"}, + {79, "ELIBACC", "can not access a needed shared library"}, + {80, "ELIBBAD", "accessing a corrupted shared library"}, + {81, "ELIBSCN", ".lib section in a.out corrupted"}, + {82, "ELIBMAX", "attempting to link in too many shared libraries"}, + {83, "ELIBEXEC", "cannot exec a shared library directly"}, + {84, "EILSEQ", "invalid or incomplete multibyte or wide character"}, + {85, "ERESTART", "interrupted system call should be restarted"}, + {86, "ESTRPIPE", "streams pipe error"}, + {87, "EUSERS", "too many users"}, + {88, "ENOTSOCK", "socket operation on non-socket"}, + {89, "EDESTADDRREQ", "destination address required"}, + {90, "EMSGSIZE", "message too long"}, + {91, "EPROTOTYPE", "protocol wrong type for socket"}, + {92, "ENOPROTOOPT", "protocol not available"}, + {93, "EPROTONOSUPPORT", "protocol not supported"}, + {94, "ESOCKTNOSUPPORT", "socket type not supported"}, + {95, "ENOTSUP", "operation not supported"}, + {96, "EPFNOSUPPORT", "protocol family not supported"}, + {97, "EAFNOSUPPORT", "address family not supported by protocol"}, + {98, "EADDRINUSE", "address already in use"}, + {99, "EADDRNOTAVAIL", "cannot assign requested address"}, + {100, "ENETDOWN", "network is down"}, + {101, "ENETUNREACH", "network is unreachable"}, + {102, "ENETRESET", "network dropped connection on reset"}, + {103, "ECONNABORTED", "software caused connection abort"}, + {104, "ECONNRESET", "connection reset by peer"}, + {105, "ENOBUFS", "no buffer space available"}, + {106, "EISCONN", "transport endpoint is already connected"}, + {107, "ENOTCONN", "transport endpoint is not connected"}, + {108, "ESHUTDOWN", "cannot send after transport endpoint shutdown"}, + {109, "ETOOMANYREFS", "too many references: cannot splice"}, + {110, "ETIMEDOUT", "connection timed out"}, + {111, "ECONNREFUSED", "connection refused"}, + {112, "EHOSTDOWN", "host is down"}, + {113, "EHOSTUNREACH", "no route to host"}, + {114, "EALREADY", "operation already in progress"}, + {115, "EINPROGRESS", "operation now in progress"}, + {116, "ESTALE", "stale file handle"}, + {117, "EUCLEAN", "structure needs cleaning"}, + {118, "ENOTNAM", "not a XENIX named type file"}, + {119, "ENAVAIL", "no XENIX semaphores available"}, + {120, "EISNAM", "is a named type file"}, + {121, "EREMOTEIO", "remote I/O error"}, + {122, "EDQUOT", "disk quota exceeded"}, + {123, "ENOMEDIUM", "no medium found"}, + {124, "EMEDIUMTYPE", "wrong medium type"}, + {125, "ECANCELED", "operation canceled"}, + {126, "ENOKEY", "required key not available"}, + {127, "EKEYEXPIRED", "key has expired"}, + {128, "EKEYREVOKED", "key has been revoked"}, + {129, "EKEYREJECTED", "key was rejected by service"}, + {130, "EOWNERDEAD", "owner died"}, + {131, "ENOTRECOVERABLE", "state not recoverable"}, + {132, "ERFKILL", "operation not possible due to RF-kill"}, + {133, "EHWPOISON", "memory page has hardware error"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/breakpoint trap"}, + {6, "SIGABRT", "aborted"}, + {7, "SIGBUS", "bus error"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGUSR1", "user defined signal 1"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGUSR2", "user defined signal 2"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGSTKFLT", "stack fault"}, + {17, "SIGCHLD", "child exited"}, + {18, "SIGCONT", "continued"}, + {19, "SIGSTOP", "stopped (signal)"}, + {20, "SIGTSTP", "stopped"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGURG", "urgent I/O condition"}, + {24, "SIGXCPU", "CPU time limit exceeded"}, + {25, "SIGXFSZ", "file size limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window changed"}, + {29, "SIGIO", "I/O possible"}, + {30, "SIGPWR", "power failure"}, + {31, "SIGSYS", "bad system call"}, +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go new file mode 100644 index 00000000..61a96aba --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go @@ -0,0 +1,2762 @@ +// mkerrors.sh -Wall -Werror -static -I/tmp/include -fsigned-char +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build s390x,linux + +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs -- -Wall -Werror -static -I/tmp/include -fsigned-char _const.go + +package unix + +import "syscall" + +const ( + AAFS_MAGIC = 0x5a3c69f0 + ADFS_SUPER_MAGIC = 0xadf5 + AFFS_SUPER_MAGIC = 0xadff + AFS_FS_MAGIC = 0x6b414653 + AFS_SUPER_MAGIC = 0x5346414f + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2c + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + AF_XDP = 0x2c + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ANON_INODE_FS_MAGIC = 0x9041934 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_RAWIP = 0x207 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + AUTOFS_SUPER_MAGIC = 0x187 + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BALLOON_KVM_MAGIC = 0x13661366 + BDEVFS_MAGIC = 0x62646576 + BINFMTFS_MAGIC = 0x42494e4d + BLKBSZGET = 0x80081270 + BLKBSZSET = 0x40081271 + BLKFLSBUF = 0x1261 + BLKFRAGET = 0x1265 + BLKFRASET = 0x1264 + BLKGETSIZE = 0x1260 + BLKGETSIZE64 = 0x80081272 + BLKPBSZGET = 0x127b + BLKRAGET = 0x1263 + BLKRASET = 0x1262 + BLKROGET = 0x125e + BLKROSET = 0x125d + BLKRRPART = 0x125f + BLKSECTGET = 0x1267 + BLKSECTSET = 0x1266 + BLKSSZGET = 0x1268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_FS_MAGIC = 0xcafe4a11 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + BTRFS_SUPER_MAGIC = 0x9123683e + BTRFS_TEST_MAGIC = 0x73727279 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CGROUP2_SUPER_MAGIC = 0x63677270 + CGROUP_SUPER_MAGIC = 0x27e0eb + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CODA_SUPER_MAGIC = 0x73757245 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRAMFS_MAGIC = 0x28cd3d45 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DAXFS_MAGIC = 0x64646178 + DEBUGFS_MAGIC = 0x64626720 + DEVPTS_SUPER_MAGIC = 0x1cd1 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + ECRYPTFS_SUPER_MAGIC = 0xf15f + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x800 + EFD_SEMAPHORE = 0x1 + EFIVARFS_MAGIC = 0xde5e81e4 + EFS_SUPER_MAGIC = 0x414a53 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_ERSPAN = 0x88be + ETH_P_ERSPAN2 = 0x22eb + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IFE = 0xed3e + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MAP = 0xf9 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_NSH = 0x894f + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PREAUTH = 0x88c7 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXABYTE_ENABLE_NEST = 0xf0 + EXT2_SUPER_MAGIC = 0xef53 + EXT3_SUPER_MAGIC = 0xef53 + EXT4_SUPER_MAGIC = 0xef53 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + F2FS_SUPER_MAGIC = 0xf2f52010 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x1000 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_ENCRYPTION_MODE_SPECK128_256_CTS = 0x8 + FS_ENCRYPTION_MODE_SPECK128_256_XTS = 0x7 + FS_IOC_GET_ENCRYPTION_POLICY = 0x400c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x40106614 + FS_IOC_SET_ENCRYPTION_POLICY = 0x800c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0x3 + FUTEXFS_SUPER_MAGIC = 0xbad1dea + F_ADD_SEALS = 0x409 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0x5 + F_GETLK64 = 0x5 + F_GETOWN = 0x9 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_GET_FILE_RW_HINT = 0x40d + F_GET_RW_HINT = 0x40b + F_GET_SEALS = 0x40a + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SEAL_GROW = 0x4 + F_SEAL_SEAL = 0x1 + F_SEAL_SHRINK = 0x2 + F_SEAL_WRITE = 0x8 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x6 + F_SETLK64 = 0x6 + F_SETLKW = 0x7 + F_SETLKW64 = 0x7 + F_SETOWN = 0x8 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SET_FILE_RW_HINT = 0x40e + F_SET_RW_HINT = 0x40c + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HDIO_DRIVE_CMD = 0x31f + HDIO_DRIVE_CMD_AEB = 0x31e + HDIO_DRIVE_CMD_HDR_SIZE = 0x4 + HDIO_DRIVE_HOB_HDR_SIZE = 0x8 + HDIO_DRIVE_RESET = 0x31c + HDIO_DRIVE_TASK = 0x31e + HDIO_DRIVE_TASKFILE = 0x31d + HDIO_DRIVE_TASK_HDR_SIZE = 0x8 + HDIO_GETGEO = 0x301 + HDIO_GET_32BIT = 0x309 + HDIO_GET_ACOUSTIC = 0x30f + HDIO_GET_ADDRESS = 0x310 + HDIO_GET_BUSSTATE = 0x31a + HDIO_GET_DMA = 0x30b + HDIO_GET_IDENTITY = 0x30d + HDIO_GET_KEEPSETTINGS = 0x308 + HDIO_GET_MULTCOUNT = 0x304 + HDIO_GET_NICE = 0x30c + HDIO_GET_NOWERR = 0x30a + HDIO_GET_QDMA = 0x305 + HDIO_GET_UNMASKINTR = 0x302 + HDIO_GET_WCACHE = 0x30e + HDIO_OBSOLETE_IDENTITY = 0x307 + HDIO_SCAN_HWIF = 0x328 + HDIO_SET_32BIT = 0x324 + HDIO_SET_ACOUSTIC = 0x32c + HDIO_SET_ADDRESS = 0x32f + HDIO_SET_BUSSTATE = 0x32d + HDIO_SET_DMA = 0x326 + HDIO_SET_KEEPSETTINGS = 0x323 + HDIO_SET_MULTCOUNT = 0x321 + HDIO_SET_NICE = 0x329 + HDIO_SET_NOWERR = 0x325 + HDIO_SET_PIO_MODE = 0x327 + HDIO_SET_QDMA = 0x32e + HDIO_SET_UNMASKINTR = 0x322 + HDIO_SET_WCACHE = 0x32b + HDIO_SET_XFER = 0x306 + HDIO_TRISTATE_HWIF = 0x31b + HDIO_UNREGISTER_HWIF = 0x32a + HOSTFS_SUPER_MAGIC = 0xc0ffee + HPFS_SUPER_MAGIC = 0xf995e849 + HUGETLBFS_MAGIC = 0x958458f6 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x8000 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x9 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NAPI = 0x10 + IFF_NAPI_FRAGS = 0x20 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x800 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_FREEBIND = 0x4e + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISOFS_SUPER_MAGIC = 0x9660 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + JFFS2_SUPER_MAGIC = 0x72b6 + KEXEC_ARCH_386 = 0x30000 + KEXEC_ARCH_68K = 0x40000 + KEXEC_ARCH_AARCH64 = 0xb70000 + KEXEC_ARCH_ARM = 0x280000 + KEXEC_ARCH_DEFAULT = 0x0 + KEXEC_ARCH_IA_64 = 0x320000 + KEXEC_ARCH_MASK = 0xffff0000 + KEXEC_ARCH_MIPS = 0x80000 + KEXEC_ARCH_MIPS_LE = 0xa0000 + KEXEC_ARCH_PPC = 0x140000 + KEXEC_ARCH_PPC64 = 0x150000 + KEXEC_ARCH_S390 = 0x160000 + KEXEC_ARCH_SH = 0x2a0000 + KEXEC_ARCH_X86_64 = 0x3e0000 + KEXEC_FILE_NO_INITRAMFS = 0x4 + KEXEC_FILE_ON_CRASH = 0x2 + KEXEC_FILE_UNLOAD = 0x1 + KEXEC_ON_CRASH = 0x1 + KEXEC_PRESERVE_CONTEXT = 0x2 + KEXEC_SEGMENT_MAX = 0x10 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_NEGATE = 0xd + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_KEEPONFORK = 0x13 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MADV_WIPEONFORK = 0x12 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_FIXED_NOREPLACE = 0x100000 + MAP_GROWSDOWN = 0x100 + MAP_HUGETLB = 0x40000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x2000 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x4000 + MAP_POPULATE = 0x8000 + MAP_PRIVATE = 0x2 + MAP_SHARED = 0x1 + MAP_SHARED_VALIDATE = 0x3 + MAP_STACK = 0x20000 + MAP_SYNC = 0x80000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MFD_ALLOW_SEALING = 0x2 + MFD_CLOEXEC = 0x1 + MFD_HUGETLB = 0x4 + MFD_HUGE_16GB = -0x78000000 + MFD_HUGE_16MB = 0x60000000 + MFD_HUGE_1GB = 0x78000000 + MFD_HUGE_1MB = 0x50000000 + MFD_HUGE_256MB = 0x70000000 + MFD_HUGE_2GB = 0x7c000000 + MFD_HUGE_2MB = 0x54000000 + MFD_HUGE_32MB = 0x64000000 + MFD_HUGE_512KB = 0x4c000000 + MFD_HUGE_512MB = 0x74000000 + MFD_HUGE_64KB = 0x40000000 + MFD_HUGE_8MB = 0x5c000000 + MFD_HUGE_MASK = 0x3f + MFD_HUGE_SHIFT = 0x1a + MINIX2_SUPER_MAGIC = 0x2468 + MINIX2_SUPER_MAGIC2 = 0x2478 + MINIX3_SUPER_MAGIC = 0x4d5a + MINIX_SUPER_MAGIC = 0x137f + MINIX_SUPER_MAGIC2 = 0x138f + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSDOS_SUPER_MAGIC = 0x4d44 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MSG_ZEROCOPY = 0x4000000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + MTD_INODE_FS_MAGIC = 0x11307854 + NAME_MAX = 0xff + NCP_SUPER_MAGIC = 0x564c + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NETNSA_MAX = 0x3 + NETNSA_NSID_NOT_ASSIGNED = -0x1 + NFNETLINK_V0 = 0x0 + NFNLGRP_ACCT_QUOTA = 0x8 + NFNLGRP_CONNTRACK_DESTROY = 0x3 + NFNLGRP_CONNTRACK_EXP_DESTROY = 0x6 + NFNLGRP_CONNTRACK_EXP_NEW = 0x4 + NFNLGRP_CONNTRACK_EXP_UPDATE = 0x5 + NFNLGRP_CONNTRACK_NEW = 0x1 + NFNLGRP_CONNTRACK_UPDATE = 0x2 + NFNLGRP_MAX = 0x9 + NFNLGRP_NFTABLES = 0x7 + NFNLGRP_NFTRACE = 0x9 + NFNLGRP_NONE = 0x0 + NFNL_BATCH_MAX = 0x1 + NFNL_MSG_BATCH_BEGIN = 0x10 + NFNL_MSG_BATCH_END = 0x11 + NFNL_NFA_NEST = 0x8000 + NFNL_SUBSYS_ACCT = 0x7 + NFNL_SUBSYS_COUNT = 0xc + NFNL_SUBSYS_CTHELPER = 0x9 + NFNL_SUBSYS_CTNETLINK = 0x1 + NFNL_SUBSYS_CTNETLINK_EXP = 0x2 + NFNL_SUBSYS_CTNETLINK_TIMEOUT = 0x8 + NFNL_SUBSYS_IPSET = 0x6 + NFNL_SUBSYS_NFTABLES = 0xa + NFNL_SUBSYS_NFT_COMPAT = 0xb + NFNL_SUBSYS_NONE = 0x0 + NFNL_SUBSYS_OSF = 0x5 + NFNL_SUBSYS_QUEUE = 0x3 + NFNL_SUBSYS_ULOG = 0x4 + NFS_SUPER_MAGIC = 0x6969 + NILFS_SUPER_MAGIC = 0x3434 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_NONREC = 0x100 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + NSFS_MAGIC = 0x6e736673 + OCFS2_SUPER_MAGIC = 0x7461636f + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPENPROM_SUPER_MAGIC = 0x9fa1 + OPOST = 0x1 + OVERLAYFS_SUPER_MAGIC = 0x794c7630 + O_ACCMODE = 0x3 + O_APPEND = 0x400 + O_ASYNC = 0x2000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x40 + O_DIRECT = 0x4000 + O_DIRECTORY = 0x10000 + O_DSYNC = 0x1000 + O_EXCL = 0x80 + O_FSYNC = 0x101000 + O_LARGEFILE = 0x0 + O_NDELAY = 0x800 + O_NOATIME = 0x40000 + O_NOCTTY = 0x100 + O_NOFOLLOW = 0x20000 + O_NONBLOCK = 0x800 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x101000 + O_SYNC = 0x101000 + O_TMPFILE = 0x410000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x2401 + PERF_EVENT_IOC_ENABLE = 0x2400 + PERF_EVENT_IOC_ID = 0x80082407 + PERF_EVENT_IOC_MODIFY_ATTRIBUTES = 0x4008240b + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x40042409 + PERF_EVENT_IOC_PERIOD = 0x40082404 + PERF_EVENT_IOC_QUERY_BPF = 0xc008240a + PERF_EVENT_IOC_REFRESH = 0x2402 + PERF_EVENT_IOC_RESET = 0x2403 + PERF_EVENT_IOC_SET_BPF = 0x40042408 + PERF_EVENT_IOC_SET_FILTER = 0x40082406 + PERF_EVENT_IOC_SET_OUTPUT = 0x2405 + PIPEFS_MAGIC = 0x50495045 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROC_SUPER_MAGIC = 0x9fa0 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_SPECULATION_CTRL = 0x34 + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffffffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_SPECULATION_CTRL = 0x35 + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_SPEC_DISABLE = 0x4 + PR_SPEC_ENABLE = 0x2 + PR_SPEC_FORCE_DISABLE = 0x8 + PR_SPEC_NOT_AFFECTED = 0x0 + PR_SPEC_PRCTL = 0x1 + PR_SPEC_STORE_BYPASS = 0x0 + PR_SVE_GET_VL = 0x33 + PR_SVE_SET_VL = 0x32 + PR_SVE_SET_VL_ONEXEC = 0x40000 + PR_SVE_VL_INHERIT = 0x20000 + PR_SVE_VL_LEN_MASK = 0xffff + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PSTOREFS_MAGIC = 0x6165676c + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_DISABLE_TE = 0x5010 + PTRACE_ENABLE_TE = 0x5009 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_LAST_BREAK = 0x5006 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_OLDSETOPTIONS = 0x15 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKDATA_AREA = 0x5003 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKTEXT_AREA = 0x5002 + PTRACE_PEEKUSR = 0x3 + PTRACE_PEEKUSR_AREA = 0x5000 + PTRACE_PEEK_SYSTEM_CALL = 0x5007 + PTRACE_POKEDATA = 0x5 + PTRACE_POKEDATA_AREA = 0x5005 + PTRACE_POKETEXT = 0x4 + PTRACE_POKETEXT_AREA = 0x5004 + PTRACE_POKEUSR = 0x6 + PTRACE_POKEUSR_AREA = 0x5001 + PTRACE_POKE_SYSTEM_CALL = 0x5008 + PTRACE_PROT = 0x15 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SECCOMP_GET_METADATA = 0x420d + PTRACE_SEIZE = 0x4206 + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SINGLEBLOCK = 0xc + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_TE_ABORT_RAND = 0x5011 + PTRACE_TRACEME = 0x0 + PT_ACR0 = 0x90 + PT_ACR1 = 0x94 + PT_ACR10 = 0xb8 + PT_ACR11 = 0xbc + PT_ACR12 = 0xc0 + PT_ACR13 = 0xc4 + PT_ACR14 = 0xc8 + PT_ACR15 = 0xcc + PT_ACR2 = 0x98 + PT_ACR3 = 0x9c + PT_ACR4 = 0xa0 + PT_ACR5 = 0xa4 + PT_ACR6 = 0xa8 + PT_ACR7 = 0xac + PT_ACR8 = 0xb0 + PT_ACR9 = 0xb4 + PT_CR_10 = 0x168 + PT_CR_11 = 0x170 + PT_CR_9 = 0x160 + PT_ENDREGS = 0x1af + PT_FPC = 0xd8 + PT_FPR0 = 0xe0 + PT_FPR1 = 0xe8 + PT_FPR10 = 0x130 + PT_FPR11 = 0x138 + PT_FPR12 = 0x140 + PT_FPR13 = 0x148 + PT_FPR14 = 0x150 + PT_FPR15 = 0x158 + PT_FPR2 = 0xf0 + PT_FPR3 = 0xf8 + PT_FPR4 = 0x100 + PT_FPR5 = 0x108 + PT_FPR6 = 0x110 + PT_FPR7 = 0x118 + PT_FPR8 = 0x120 + PT_FPR9 = 0x128 + PT_GPR0 = 0x10 + PT_GPR1 = 0x18 + PT_GPR10 = 0x60 + PT_GPR11 = 0x68 + PT_GPR12 = 0x70 + PT_GPR13 = 0x78 + PT_GPR14 = 0x80 + PT_GPR15 = 0x88 + PT_GPR2 = 0x20 + PT_GPR3 = 0x28 + PT_GPR4 = 0x30 + PT_GPR5 = 0x38 + PT_GPR6 = 0x40 + PT_GPR7 = 0x48 + PT_GPR8 = 0x50 + PT_GPR9 = 0x58 + PT_IEEE_IP = 0x1a8 + PT_LASTOFF = 0x1a8 + PT_ORIGGPR2 = 0xd0 + PT_PSWADDR = 0x8 + PT_PSWMASK = 0x0 + QNX4_SUPER_MAGIC = 0x2f + QNX6_SUPER_MAGIC = 0x68191122 + RAMFS_MAGIC = 0x858458f6 + RDTGROUP_SUPER_MAGIC = 0x7655821 + REISERFS_SUPER_MAGIC = 0x52654973 + RENAME_EXCHANGE = 0x2 + RENAME_NOREPLACE = 0x1 + RENAME_WHITEOUT = 0x4 + RLIMIT_AS = 0x9 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x8 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x7 + RLIMIT_NPROC = 0x6 + RLIMIT_RSS = 0x5 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FASTOPEN_NO_COOKIE = 0x11 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x11 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1d + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTC_AF = 0x20 + RTC_AIE_OFF = 0x7002 + RTC_AIE_ON = 0x7001 + RTC_ALM_READ = 0x80247008 + RTC_ALM_SET = 0x40247007 + RTC_EPOCH_READ = 0x8008700d + RTC_EPOCH_SET = 0x4008700e + RTC_IRQF = 0x80 + RTC_IRQP_READ = 0x8008700b + RTC_IRQP_SET = 0x4008700c + RTC_MAX_FREQ = 0x2000 + RTC_PF = 0x40 + RTC_PIE_OFF = 0x7006 + RTC_PIE_ON = 0x7005 + RTC_PLL_GET = 0x80207011 + RTC_PLL_SET = 0x40207012 + RTC_RD_TIME = 0x80247009 + RTC_SET_TIME = 0x4024700a + RTC_UF = 0x10 + RTC_UIE_OFF = 0x7004 + RTC_UIE_ON = 0x7003 + RTC_VL_CLR = 0x7014 + RTC_VL_READ = 0x80047013 + RTC_WIE_OFF = 0x7010 + RTC_WIE_ON = 0x700f + RTC_WKALM_RD = 0x80287010 + RTC_WKALM_SET = 0x4028700f + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELCHAIN = 0x65 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETCHAIN = 0x66 + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x67 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWCHAIN = 0x64 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x16 + RTM_NR_MSGTYPES = 0x58 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BGP = 0xba + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_EIGRP = 0xc0 + RTPROT_GATED = 0x8 + RTPROT_ISIS = 0xbb + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_OSPF = 0xbc + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_RIP = 0xbd + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_TXTIME = 0x3d + SCM_WIFI_STATUS = 0x29 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SECURITYFS_MAGIC = 0x73636673 + SELINUX_MAGIC = 0xf97cff8c + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x8905 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x8904 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x541b + SIOCOUTQ = 0x5411 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x8902 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SMACK_MAGIC = 0x43415d53 + SMART_AUTOSAVE = 0xd2 + SMART_AUTO_OFFLINE = 0xdb + SMART_DISABLE = 0xd9 + SMART_ENABLE = 0xd8 + SMART_HCYL_PASS = 0xc2 + SMART_IMMEDIATE_OFFLINE = 0xd4 + SMART_LCYL_PASS = 0x4f + SMART_READ_LOG_SECTOR = 0xd5 + SMART_READ_THRESHOLDS = 0xd1 + SMART_READ_VALUES = 0xd0 + SMART_SAVE = 0xd3 + SMART_STATUS = 0xda + SMART_WRITE_LOG_SECTOR = 0xd6 + SMART_WRITE_THRESHOLDS = 0xd7 + SMB_SUPER_MAGIC = 0x517b + SOCKFS_MAGIC = 0x534f434b + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x2 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x800 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0x1 + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_TLS = 0x11a + SOL_X25 = 0x106 + SOL_XDP = 0x11b + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1e + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x6 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x27 + SO_DONTROUTE = 0x5 + SO_ERROR = 0x4 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x9 + SO_LINGER = 0xd + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0xa + SO_PASSCRED = 0x10 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x11 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1f + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x26 + SO_RCVBUF = 0x8 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x12 + SO_RCVTIMEO = 0x14 + SO_REUSEADDR = 0x2 + SO_REUSEPORT = 0xf + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x7 + SO_SNDBUFFORCE = 0x20 + SO_SNDLOWAT = 0x13 + SO_SNDTIMEO = 0x15 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TXTIME = 0x3d + SO_TYPE = 0x3 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SO_ZEROCOPY = 0x3c + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + SQUASHFS_MAGIC = 0x73717368 + STACK_END_MAGIC = 0x57ac6e9d + STATX_ALL = 0xfff + STATX_ATIME = 0x20 + STATX_ATTR_APPEND = 0x20 + STATX_ATTR_AUTOMOUNT = 0x1000 + STATX_ATTR_COMPRESSED = 0x4 + STATX_ATTR_ENCRYPTED = 0x800 + STATX_ATTR_IMMUTABLE = 0x10 + STATX_ATTR_NODUMP = 0x40 + STATX_BASIC_STATS = 0x7ff + STATX_BLOCKS = 0x400 + STATX_BTIME = 0x800 + STATX_CTIME = 0x80 + STATX_GID = 0x10 + STATX_INO = 0x100 + STATX_MODE = 0x2 + STATX_MTIME = 0x40 + STATX_NLINK = 0x4 + STATX_SIZE = 0x200 + STATX_TYPE = 0x1 + STATX_UID = 0x8 + STATX__RESERVED = 0x80000000 + SYNC_FILE_RANGE_WAIT_AFTER = 0x4 + SYNC_FILE_RANGE_WAIT_BEFORE = 0x1 + SYNC_FILE_RANGE_WRITE = 0x2 + SYSFS_MAGIC = 0x62656572 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x8 + TCFLSH = 0x540b + TCGETA = 0x5405 + TCGETS = 0x5401 + TCGETS2 = 0x802c542a + TCGETX = 0x5432 + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_FASTOPEN_KEY = 0x21 + TCP_FASTOPEN_NO_COOKIE = 0x22 + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_EXT = 0x20 + TCP_MD5SIG_FLAG_PREFIX = 0x1 + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_ULP = 0x1f + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x2 + TCSBRK = 0x5409 + TCSBRKP = 0x5425 + TCSETA = 0x5406 + TCSETAF = 0x5408 + TCSETAW = 0x5407 + TCSETS = 0x5402 + TCSETS2 = 0x402c542b + TCSETSF = 0x5404 + TCSETSF2 = 0x402c542d + TCSETSW = 0x5403 + TCSETSW2 = 0x402c542c + TCSETX = 0x5433 + TCSETXF = 0x5434 + TCSETXW = 0x5435 + TCXONC = 0x540a + TIOCCBRK = 0x5428 + TIOCCONS = 0x541d + TIOCEXCL = 0x540c + TIOCGDEV = 0x80045432 + TIOCGETD = 0x5424 + TIOCGEXCL = 0x80045440 + TIOCGICOUNT = 0x545d + TIOCGLCKTRMIOS = 0x5456 + TIOCGPGRP = 0x540f + TIOCGPKT = 0x80045438 + TIOCGPTLCK = 0x80045439 + TIOCGPTN = 0x80045430 + TIOCGPTPEER = 0x5441 + TIOCGRS485 = 0x542e + TIOCGSERIAL = 0x541e + TIOCGSID = 0x5429 + TIOCGSOFTCAR = 0x5419 + TIOCGWINSZ = 0x5413 + TIOCINQ = 0x541b + TIOCLINUX = 0x541c + TIOCMBIC = 0x5417 + TIOCMBIS = 0x5416 + TIOCMGET = 0x5415 + TIOCMIWAIT = 0x545c + TIOCMSET = 0x5418 + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x5422 + TIOCNXCL = 0x540d + TIOCOUTQ = 0x5411 + TIOCPKT = 0x5420 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x540e + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x5423 + TIOCSIG = 0x40045436 + TIOCSLCKTRMIOS = 0x5457 + TIOCSPGRP = 0x5410 + TIOCSPTLCK = 0x40045431 + TIOCSRS485 = 0x542f + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x541a + TIOCSTI = 0x5412 + TIOCSWINSZ = 0x5414 + TIOCVHANGUP = 0x5437 + TMPFS_MAGIC = 0x1021994 + TOSTOP = 0x100 + TPACKET_ALIGNMENT = 0x10 + TPACKET_HDRLEN = 0x34 + TP_STATUS_AVAILABLE = 0x0 + TP_STATUS_BLK_TMO = 0x20 + TP_STATUS_COPY = 0x2 + TP_STATUS_CSUMNOTREADY = 0x8 + TP_STATUS_CSUM_VALID = 0x80 + TP_STATUS_KERNEL = 0x0 + TP_STATUS_LOSING = 0x4 + TP_STATUS_SENDING = 0x2 + TP_STATUS_SEND_REQUEST = 0x1 + TP_STATUS_TS_RAW_HARDWARE = -0x80000000 + TP_STATUS_TS_SOFTWARE = 0x20000000 + TP_STATUS_TS_SYS_HARDWARE = 0x40000000 + TP_STATUS_USER = 0x1 + TP_STATUS_VLAN_TPID_VALID = 0x40 + TP_STATUS_VLAN_VALID = 0x10 + TP_STATUS_WRONG_FORMAT = 0x4 + TRACEFS_MAGIC = 0x74726163 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x401054d5 + TUNDETACHFILTER = 0x401054d6 + TUNGETFEATURES = 0x800454cf + TUNGETFILTER = 0x801054db + TUNGETIFF = 0x800454d2 + TUNGETSNDBUF = 0x800454d3 + TUNGETVNETBE = 0x800454df + TUNGETVNETHDRSZ = 0x800454d7 + TUNGETVNETLE = 0x800454dd + TUNSETDEBUG = 0x400454c9 + TUNSETFILTEREBPF = 0x800454e1 + TUNSETGROUP = 0x400454ce + TUNSETIFF = 0x400454ca + TUNSETIFINDEX = 0x400454da + TUNSETLINK = 0x400454cd + TUNSETNOCSUM = 0x400454c8 + TUNSETOFFLOAD = 0x400454d0 + TUNSETOWNER = 0x400454cc + TUNSETPERSIST = 0x400454cb + TUNSETQUEUE = 0x400454d9 + TUNSETSNDBUF = 0x400454d4 + TUNSETSTEERINGEBPF = 0x800454e0 + TUNSETTXFILTER = 0x400454d1 + TUNSETVNETBE = 0x400454de + TUNSETVNETHDRSZ = 0x400454d8 + TUNSETVNETLE = 0x400454dc + UBI_IOCATT = 0x40186f40 + UBI_IOCDET = 0x40046f41 + UBI_IOCEBCH = 0x40044f02 + UBI_IOCEBER = 0x40044f01 + UBI_IOCEBISMAP = 0x80044f05 + UBI_IOCEBMAP = 0x40084f03 + UBI_IOCEBUNMAP = 0x40044f04 + UBI_IOCMKVOL = 0x40986f00 + UBI_IOCRMVOL = 0x40046f01 + UBI_IOCRNVOL = 0x51106f03 + UBI_IOCRSVOL = 0x400c6f02 + UBI_IOCSETVOLPROP = 0x40104f06 + UBI_IOCVOLCRBLK = 0x40804f07 + UBI_IOCVOLRMBLK = 0x4f08 + UBI_IOCVOLUP = 0x40084f00 + UDF_SUPER_MAGIC = 0x15013346 + UMOUNT_NOFOLLOW = 0x8 + USBDEVICE_SUPER_MAGIC = 0x9fa2 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + V9FS_MAGIC = 0x1021997 + VDISCARD = 0xd + VEOF = 0x4 + VEOL = 0xb + VEOL2 = 0x10 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x6 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x80045702 + WDIOC_GETPRETIMEOUT = 0x80045709 + WDIOC_GETSTATUS = 0x80045701 + WDIOC_GETSUPPORT = 0x80285700 + WDIOC_GETTEMP = 0x80045703 + WDIOC_GETTIMELEFT = 0x8004570a + WDIOC_GETTIMEOUT = 0x80045707 + WDIOC_KEEPALIVE = 0x80045705 + WDIOC_SETOPTIONS = 0x80045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WIN_ACKMEDIACHANGE = 0xdb + WIN_CHECKPOWERMODE1 = 0xe5 + WIN_CHECKPOWERMODE2 = 0x98 + WIN_DEVICE_RESET = 0x8 + WIN_DIAGNOSE = 0x90 + WIN_DOORLOCK = 0xde + WIN_DOORUNLOCK = 0xdf + WIN_DOWNLOAD_MICROCODE = 0x92 + WIN_FLUSH_CACHE = 0xe7 + WIN_FLUSH_CACHE_EXT = 0xea + WIN_FORMAT = 0x50 + WIN_GETMEDIASTATUS = 0xda + WIN_IDENTIFY = 0xec + WIN_IDENTIFY_DMA = 0xee + WIN_IDLEIMMEDIATE = 0xe1 + WIN_INIT = 0x60 + WIN_MEDIAEJECT = 0xed + WIN_MULTREAD = 0xc4 + WIN_MULTREAD_EXT = 0x29 + WIN_MULTWRITE = 0xc5 + WIN_MULTWRITE_EXT = 0x39 + WIN_NOP = 0x0 + WIN_PACKETCMD = 0xa0 + WIN_PIDENTIFY = 0xa1 + WIN_POSTBOOT = 0xdc + WIN_PREBOOT = 0xdd + WIN_QUEUED_SERVICE = 0xa2 + WIN_READ = 0x20 + WIN_READDMA = 0xc8 + WIN_READDMA_EXT = 0x25 + WIN_READDMA_ONCE = 0xc9 + WIN_READDMA_QUEUED = 0xc7 + WIN_READDMA_QUEUED_EXT = 0x26 + WIN_READ_BUFFER = 0xe4 + WIN_READ_EXT = 0x24 + WIN_READ_LONG = 0x22 + WIN_READ_LONG_ONCE = 0x23 + WIN_READ_NATIVE_MAX = 0xf8 + WIN_READ_NATIVE_MAX_EXT = 0x27 + WIN_READ_ONCE = 0x21 + WIN_RECAL = 0x10 + WIN_RESTORE = 0x10 + WIN_SECURITY_DISABLE = 0xf6 + WIN_SECURITY_ERASE_PREPARE = 0xf3 + WIN_SECURITY_ERASE_UNIT = 0xf4 + WIN_SECURITY_FREEZE_LOCK = 0xf5 + WIN_SECURITY_SET_PASS = 0xf1 + WIN_SECURITY_UNLOCK = 0xf2 + WIN_SEEK = 0x70 + WIN_SETFEATURES = 0xef + WIN_SETIDLE1 = 0xe3 + WIN_SETIDLE2 = 0x97 + WIN_SETMULT = 0xc6 + WIN_SET_MAX = 0xf9 + WIN_SET_MAX_EXT = 0x37 + WIN_SLEEPNOW1 = 0xe6 + WIN_SLEEPNOW2 = 0x99 + WIN_SMART = 0xb0 + WIN_SPECIFY = 0x91 + WIN_SRST = 0x8 + WIN_STANDBY = 0xe2 + WIN_STANDBY2 = 0x96 + WIN_STANDBYNOW1 = 0xe0 + WIN_STANDBYNOW2 = 0x94 + WIN_VERIFY = 0x40 + WIN_VERIFY_EXT = 0x42 + WIN_VERIFY_ONCE = 0x41 + WIN_WRITE = 0x30 + WIN_WRITEDMA = 0xca + WIN_WRITEDMA_EXT = 0x35 + WIN_WRITEDMA_ONCE = 0xcb + WIN_WRITEDMA_QUEUED = 0xcc + WIN_WRITEDMA_QUEUED_EXT = 0x36 + WIN_WRITE_BUFFER = 0xe8 + WIN_WRITE_EXT = 0x34 + WIN_WRITE_LONG = 0x32 + WIN_WRITE_LONG_ONCE = 0x33 + WIN_WRITE_ONCE = 0x31 + WIN_WRITE_SAME = 0xe9 + WIN_WRITE_VERIFY = 0x3c + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x40 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XDP_COPY = 0x2 + XDP_FLAGS_DRV_MODE = 0x4 + XDP_FLAGS_HW_MODE = 0x8 + XDP_FLAGS_MASK = 0xf + XDP_FLAGS_MODES = 0xe + XDP_FLAGS_SKB_MODE = 0x2 + XDP_FLAGS_UPDATE_IF_NOEXIST = 0x1 + XDP_MMAP_OFFSETS = 0x1 + XDP_PGOFF_RX_RING = 0x0 + XDP_PGOFF_TX_RING = 0x80000000 + XDP_RX_RING = 0x2 + XDP_SHARED_UMEM = 0x1 + XDP_STATISTICS = 0x7 + XDP_TX_RING = 0x3 + XDP_UMEM_COMPLETION_RING = 0x6 + XDP_UMEM_FILL_RING = 0x5 + XDP_UMEM_PGOFF_COMPLETION_RING = 0x180000000 + XDP_UMEM_PGOFF_FILL_RING = 0x100000000 + XDP_UMEM_REG = 0x4 + XDP_ZEROCOPY = 0x4 + XENFS_SUPER_MAGIC = 0xabba1974 + XTABS = 0x1800 + ZSMALLOC_MAGIC = 0x58295829 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x62) + EADDRNOTAVAIL = syscall.Errno(0x63) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x61) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x72) + EBADE = syscall.Errno(0x34) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x4d) + EBADMSG = syscall.Errno(0x4a) + EBADR = syscall.Errno(0x35) + EBADRQC = syscall.Errno(0x38) + EBADSLT = syscall.Errno(0x39) + EBFONT = syscall.Errno(0x3b) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x7d) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x2c) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x67) + ECONNREFUSED = syscall.Errno(0x6f) + ECONNRESET = syscall.Errno(0x68) + EDEADLK = syscall.Errno(0x23) + EDEADLOCK = syscall.Errno(0x23) + EDESTADDRREQ = syscall.Errno(0x59) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x49) + EDQUOT = syscall.Errno(0x7a) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x70) + EHOSTUNREACH = syscall.Errno(0x71) + EHWPOISON = syscall.Errno(0x85) + EIDRM = syscall.Errno(0x2b) + EILSEQ = syscall.Errno(0x54) + EINPROGRESS = syscall.Errno(0x73) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x6a) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x78) + EKEYEXPIRED = syscall.Errno(0x7f) + EKEYREJECTED = syscall.Errno(0x81) + EKEYREVOKED = syscall.Errno(0x80) + EL2HLT = syscall.Errno(0x33) + EL2NSYNC = syscall.Errno(0x2d) + EL3HLT = syscall.Errno(0x2e) + EL3RST = syscall.Errno(0x2f) + ELIBACC = syscall.Errno(0x4f) + ELIBBAD = syscall.Errno(0x50) + ELIBEXEC = syscall.Errno(0x53) + ELIBMAX = syscall.Errno(0x52) + ELIBSCN = syscall.Errno(0x51) + ELNRNG = syscall.Errno(0x30) + ELOOP = syscall.Errno(0x28) + EMEDIUMTYPE = syscall.Errno(0x7c) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x5a) + EMULTIHOP = syscall.Errno(0x48) + ENAMETOOLONG = syscall.Errno(0x24) + ENAVAIL = syscall.Errno(0x77) + ENETDOWN = syscall.Errno(0x64) + ENETRESET = syscall.Errno(0x66) + ENETUNREACH = syscall.Errno(0x65) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x37) + ENOBUFS = syscall.Errno(0x69) + ENOCSI = syscall.Errno(0x32) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0x7e) + ENOLCK = syscall.Errno(0x25) + ENOLINK = syscall.Errno(0x43) + ENOMEDIUM = syscall.Errno(0x7b) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x2a) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x5c) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x26) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x6b) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x27) + ENOTNAM = syscall.Errno(0x76) + ENOTRECOVERABLE = syscall.Errno(0x83) + ENOTSOCK = syscall.Errno(0x58) + ENOTSUP = syscall.Errno(0x5f) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x4c) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x5f) + EOVERFLOW = syscall.Errno(0x4b) + EOWNERDEAD = syscall.Errno(0x82) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x60) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x5d) + EPROTOTYPE = syscall.Errno(0x5b) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x4e) + EREMOTE = syscall.Errno(0x42) + EREMOTEIO = syscall.Errno(0x79) + ERESTART = syscall.Errno(0x55) + ERFKILL = syscall.Errno(0x84) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x6c) + ESOCKTNOSUPPORT = syscall.Errno(0x5e) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x74) + ESTRPIPE = syscall.Errno(0x56) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x6e) + ETOOMANYREFS = syscall.Errno(0x6d) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x75) + EUNATCH = syscall.Errno(0x31) + EUSERS = syscall.Errno(0x57) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x36) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0x7) + SIGCHLD = syscall.Signal(0x11) + SIGCLD = syscall.Signal(0x11) + SIGCONT = syscall.Signal(0x12) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x1d) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x1d) + SIGPROF = syscall.Signal(0x1b) + SIGPWR = syscall.Signal(0x1e) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTKFLT = syscall.Signal(0x10) + SIGSTOP = syscall.Signal(0x13) + SIGSYS = syscall.Signal(0x1f) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x14) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x17) + SIGUSR1 = syscall.Signal(0xa) + SIGUSR2 = syscall.Signal(0xc) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "no such device or address"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EAGAIN", "resource temporarily unavailable"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device or resource busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "invalid cross-device link"}, + {19, "ENODEV", "no such device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "numerical result out of range"}, + {35, "EDEADLK", "resource deadlock avoided"}, + {36, "ENAMETOOLONG", "file name too long"}, + {37, "ENOLCK", "no locks available"}, + {38, "ENOSYS", "function not implemented"}, + {39, "ENOTEMPTY", "directory not empty"}, + {40, "ELOOP", "too many levels of symbolic links"}, + {42, "ENOMSG", "no message of desired type"}, + {43, "EIDRM", "identifier removed"}, + {44, "ECHRNG", "channel number out of range"}, + {45, "EL2NSYNC", "level 2 not synchronized"}, + {46, "EL3HLT", "level 3 halted"}, + {47, "EL3RST", "level 3 reset"}, + {48, "ELNRNG", "link number out of range"}, + {49, "EUNATCH", "protocol driver not attached"}, + {50, "ENOCSI", "no CSI structure available"}, + {51, "EL2HLT", "level 2 halted"}, + {52, "EBADE", "invalid exchange"}, + {53, "EBADR", "invalid request descriptor"}, + {54, "EXFULL", "exchange full"}, + {55, "ENOANO", "no anode"}, + {56, "EBADRQC", "invalid request code"}, + {57, "EBADSLT", "invalid slot"}, + {59, "EBFONT", "bad font file format"}, + {60, "ENOSTR", "device not a stream"}, + {61, "ENODATA", "no data available"}, + {62, "ETIME", "timer expired"}, + {63, "ENOSR", "out of streams resources"}, + {64, "ENONET", "machine is not on the network"}, + {65, "ENOPKG", "package not installed"}, + {66, "EREMOTE", "object is remote"}, + {67, "ENOLINK", "link has been severed"}, + {68, "EADV", "advertise error"}, + {69, "ESRMNT", "srmount error"}, + {70, "ECOMM", "communication error on send"}, + {71, "EPROTO", "protocol error"}, + {72, "EMULTIHOP", "multihop attempted"}, + {73, "EDOTDOT", "RFS specific error"}, + {74, "EBADMSG", "bad message"}, + {75, "EOVERFLOW", "value too large for defined data type"}, + {76, "ENOTUNIQ", "name not unique on network"}, + {77, "EBADFD", "file descriptor in bad state"}, + {78, "EREMCHG", "remote address changed"}, + {79, "ELIBACC", "can not access a needed shared library"}, + {80, "ELIBBAD", "accessing a corrupted shared library"}, + {81, "ELIBSCN", ".lib section in a.out corrupted"}, + {82, "ELIBMAX", "attempting to link in too many shared libraries"}, + {83, "ELIBEXEC", "cannot exec a shared library directly"}, + {84, "EILSEQ", "invalid or incomplete multibyte or wide character"}, + {85, "ERESTART", "interrupted system call should be restarted"}, + {86, "ESTRPIPE", "streams pipe error"}, + {87, "EUSERS", "too many users"}, + {88, "ENOTSOCK", "socket operation on non-socket"}, + {89, "EDESTADDRREQ", "destination address required"}, + {90, "EMSGSIZE", "message too long"}, + {91, "EPROTOTYPE", "protocol wrong type for socket"}, + {92, "ENOPROTOOPT", "protocol not available"}, + {93, "EPROTONOSUPPORT", "protocol not supported"}, + {94, "ESOCKTNOSUPPORT", "socket type not supported"}, + {95, "ENOTSUP", "operation not supported"}, + {96, "EPFNOSUPPORT", "protocol family not supported"}, + {97, "EAFNOSUPPORT", "address family not supported by protocol"}, + {98, "EADDRINUSE", "address already in use"}, + {99, "EADDRNOTAVAIL", "cannot assign requested address"}, + {100, "ENETDOWN", "network is down"}, + {101, "ENETUNREACH", "network is unreachable"}, + {102, "ENETRESET", "network dropped connection on reset"}, + {103, "ECONNABORTED", "software caused connection abort"}, + {104, "ECONNRESET", "connection reset by peer"}, + {105, "ENOBUFS", "no buffer space available"}, + {106, "EISCONN", "transport endpoint is already connected"}, + {107, "ENOTCONN", "transport endpoint is not connected"}, + {108, "ESHUTDOWN", "cannot send after transport endpoint shutdown"}, + {109, "ETOOMANYREFS", "too many references: cannot splice"}, + {110, "ETIMEDOUT", "connection timed out"}, + {111, "ECONNREFUSED", "connection refused"}, + {112, "EHOSTDOWN", "host is down"}, + {113, "EHOSTUNREACH", "no route to host"}, + {114, "EALREADY", "operation already in progress"}, + {115, "EINPROGRESS", "operation now in progress"}, + {116, "ESTALE", "stale file handle"}, + {117, "EUCLEAN", "structure needs cleaning"}, + {118, "ENOTNAM", "not a XENIX named type file"}, + {119, "ENAVAIL", "no XENIX semaphores available"}, + {120, "EISNAM", "is a named type file"}, + {121, "EREMOTEIO", "remote I/O error"}, + {122, "EDQUOT", "disk quota exceeded"}, + {123, "ENOMEDIUM", "no medium found"}, + {124, "EMEDIUMTYPE", "wrong medium type"}, + {125, "ECANCELED", "operation canceled"}, + {126, "ENOKEY", "required key not available"}, + {127, "EKEYEXPIRED", "key has expired"}, + {128, "EKEYREVOKED", "key has been revoked"}, + {129, "EKEYREJECTED", "key was rejected by service"}, + {130, "EOWNERDEAD", "owner died"}, + {131, "ENOTRECOVERABLE", "state not recoverable"}, + {132, "ERFKILL", "operation not possible due to RF-kill"}, + {133, "EHWPOISON", "memory page has hardware error"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/breakpoint trap"}, + {6, "SIGABRT", "aborted"}, + {7, "SIGBUS", "bus error"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGUSR1", "user defined signal 1"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGUSR2", "user defined signal 2"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGSTKFLT", "stack fault"}, + {17, "SIGCHLD", "child exited"}, + {18, "SIGCONT", "continued"}, + {19, "SIGSTOP", "stopped (signal)"}, + {20, "SIGTSTP", "stopped"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGURG", "urgent I/O condition"}, + {24, "SIGXCPU", "CPU time limit exceeded"}, + {25, "SIGXFSZ", "file size limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window changed"}, + {29, "SIGIO", "I/O possible"}, + {30, "SIGPWR", "power failure"}, + {31, "SIGSYS", "bad system call"}, +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go new file mode 100644 index 00000000..ba93f3e5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go @@ -0,0 +1,2150 @@ +// mkerrors.sh -Wall -Werror -static -I/tmp/include +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build sparc64,linux + +// Code generated by cmd/cgo -godefs; DO NOT EDIT. +// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go + +package unix + +import "syscall" + +const ( + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2a + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_X25 = 0x10f + ASI_LEON_DFLUSH = 0x11 + ASI_LEON_IFLUSH = 0x10 + ASI_LEON_MMUFLUSH = 0x18 + B0 = 0x0 + B1000000 = 0x100c + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x100d + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100e + B153600 = 0x1006 + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100f + B230400 = 0x1003 + B2400 = 0xb + B300 = 0x7 + B307200 = 0x1007 + B38400 = 0xf + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x100a + B57600 = 0x1001 + B576000 = 0x100b + B600 = 0x8 + B614400 = 0x1008 + B75 = 0x2 + B76800 = 0x1005 + B921600 = 0x1009 + B9600 = 0xd + BLKBSZGET = 0x80081270 + BLKBSZSET = 0x40081271 + BLKFLSBUF = 0x1261 + BLKFRAGET = 0x1265 + BLKFRASET = 0x1264 + BLKGETSIZE = 0x1260 + BLKGETSIZE64 = 0x80081272 + BLKRAGET = 0x1263 + BLKRASET = 0x1262 + BLKROGET = 0x125e + BLKROSET = 0x125d + BLKRRPART = 0x125f + BLKSECTGET = 0x1267 + BLKSECTSET = 0x1266 + BLKSSZGET = 0x1268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + EMT_TAGOVF = 0x1 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x400000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x2000 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0x7 + F_GETLK64 = 0x7 + F_GETOWN = 0x5 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x1 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x8 + F_SETLK64 = 0x8 + F_SETLKW = 0x9 + F_SETLKW64 = 0x9 + F_SETOWN = 0x6 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x3 + F_WRLCK = 0x2 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x8000 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x8 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x400000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x4000 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_UNICAST_HOPS = 0x10 + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x200 + MAP_HUGETLB = 0x40000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x100 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x40 + MAP_POPULATE = 0x8000 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_SHARED = 0x1 + MAP_STACK = 0x20000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x2000 + MCL_FUTURE = 0x4000 + MCL_ONFAULT = 0x8000 + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + NAME_MAX = 0xff + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x400000 + O_CREAT = 0x200 + O_DIRECT = 0x100000 + O_DIRECTORY = 0x10000 + O_DSYNC = 0x2000 + O_EXCL = 0x800 + O_FSYNC = 0x802000 + O_LARGEFILE = 0x0 + O_NDELAY = 0x4004 + O_NOATIME = 0x200000 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x20000 + O_NONBLOCK = 0x4000 + O_PATH = 0x1000000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x802000 + O_SYNC = 0x802000 + O_TMPFILE = 0x2010000 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = -0x1 + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETFPAREGS = 0x14 + PTRACE_GETFPREGS = 0xe + PTRACE_GETFPREGS64 = 0x19 + PTRACE_GETREGS = 0xc + PTRACE_GETREGS64 = 0x16 + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKETEXT = 0x4 + PTRACE_POKEUSR = 0x6 + PTRACE_READDATA = 0x10 + PTRACE_READTEXT = 0x12 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SEIZE = 0x4206 + PTRACE_SETFPAREGS = 0x15 + PTRACE_SETFPREGS = 0xf + PTRACE_SETFPREGS64 = 0x1a + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGS64 = 0x17 + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SINGLESTEP = 0x9 + PTRACE_SPARC_DETACH = 0xb + PTRACE_SYSCALL = 0x18 + PTRACE_TRACEME = 0x0 + PTRACE_WRITEDATA = 0x11 + PTRACE_WRITETEXT = 0x13 + PT_FP = 0x48 + PT_G0 = 0x10 + PT_G1 = 0x14 + PT_G2 = 0x18 + PT_G3 = 0x1c + PT_G4 = 0x20 + PT_G5 = 0x24 + PT_G6 = 0x28 + PT_G7 = 0x2c + PT_I0 = 0x30 + PT_I1 = 0x34 + PT_I2 = 0x38 + PT_I3 = 0x3c + PT_I4 = 0x40 + PT_I5 = 0x44 + PT_I6 = 0x48 + PT_I7 = 0x4c + PT_NPC = 0x8 + PT_PC = 0x4 + PT_PSR = 0x0 + PT_REGS_MAGIC = 0x57ac6c00 + PT_TNPC = 0x90 + PT_TPC = 0x88 + PT_TSTATE = 0x80 + PT_V9_FP = 0x70 + PT_V9_G0 = 0x0 + PT_V9_G1 = 0x8 + PT_V9_G2 = 0x10 + PT_V9_G3 = 0x18 + PT_V9_G4 = 0x20 + PT_V9_G5 = 0x28 + PT_V9_G6 = 0x30 + PT_V9_G7 = 0x38 + PT_V9_I0 = 0x40 + PT_V9_I1 = 0x48 + PT_V9_I2 = 0x50 + PT_V9_I3 = 0x58 + PT_V9_I4 = 0x60 + PT_V9_I5 = 0x68 + PT_V9_I6 = 0x70 + PT_V9_I7 = 0x78 + PT_V9_MAGIC = 0x9c + PT_V9_TNPC = 0x90 + PT_V9_TPC = 0x88 + PT_V9_TSTATE = 0x80 + PT_V9_Y = 0x98 + PT_WIM = 0x10 + PT_Y = 0xc + RLIMIT_AS = 0x9 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_NOFILE = 0x6 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = -0x1 + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x10 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x18 + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x5f + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x14 + RTM_NR_MSGTYPES = 0x50 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x11 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x23 + SCM_TIMESTAMPNS = 0x21 + SCM_WIFI_STATUS = 0x25 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x8905 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x8904 + SIOCGRARP = 0x8961 + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x4004667f + SIOCOUTQ = 0x40047473 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x8902 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SOCK_CLOEXEC = 0x400000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x2 + SOCK_NONBLOCK = 0x4000 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0xffff + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x8000 + SO_ATTACH_BPF = 0x34 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x35 + SO_ATTACH_REUSEPORT_EBPF = 0x36 + SO_BINDTODEVICE = 0xd + SO_BPF_EXTENSIONS = 0x32 + SO_BROADCAST = 0x20 + SO_BSDCOMPAT = 0x400 + SO_BUSY_POLL = 0x30 + SO_CNX_ADVICE = 0x37 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x1029 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x33 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_LOCK_FILTER = 0x28 + SO_MARK = 0x22 + SO_MAX_PACING_RATE = 0x31 + SO_NOFCS = 0x27 + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0x100 + SO_PASSCRED = 0x2 + SO_PASSSEC = 0x1f + SO_PEEK_OFF = 0x26 + SO_PEERCRED = 0x40 + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1e + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x1028 + SO_RCVBUF = 0x1002 + SO_RCVBUFFORCE = 0x100b + SO_RCVLOWAT = 0x800 + SO_RCVTIMEO = 0x2000 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_RXQ_OVFL = 0x24 + SO_SECURITY_AUTHENTICATION = 0x5001 + SO_SECURITY_ENCRYPTION_NETWORK = 0x5004 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x5002 + SO_SELECT_ERR_QUEUE = 0x29 + SO_SNDBUF = 0x1001 + SO_SNDBUFFORCE = 0x100a + SO_SNDLOWAT = 0x1000 + SO_SNDTIMEO = 0x4000 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x23 + SO_TIMESTAMPNS = 0x21 + SO_TYPE = 0x1008 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x25 + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TCFLSH = 0x20005407 + TCGETA = 0x40125401 + TCGETS = 0x40245408 + TCGETS2 = 0x402c540c + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x2 + TCSBRK = 0x20005405 + TCSBRKP = 0x5425 + TCSETA = 0x80125402 + TCSETAF = 0x80125404 + TCSETAW = 0x80125403 + TCSETS = 0x80245409 + TCSETS2 = 0x802c540d + TCSETSF = 0x8024540b + TCSETSF2 = 0x802c540f + TCSETSW = 0x8024540a + TCSETSW2 = 0x802c540e + TCXONC = 0x20005406 + TIOCCBRK = 0x2000747a + TIOCCONS = 0x20007424 + TIOCEXCL = 0x2000740d + TIOCGDEV = 0x40045432 + TIOCGETD = 0x40047400 + TIOCGEXCL = 0x40045440 + TIOCGICOUNT = 0x545d + TIOCGLCKTRMIOS = 0x5456 + TIOCGPGRP = 0x40047483 + TIOCGPKT = 0x40045438 + TIOCGPTLCK = 0x40045439 + TIOCGPTN = 0x40047486 + TIOCGRS485 = 0x40205441 + TIOCGSERIAL = 0x541e + TIOCGSID = 0x40047485 + TIOCGSOFTCAR = 0x40047464 + TIOCGWINSZ = 0x40087468 + TIOCINQ = 0x4004667f + TIOCLINUX = 0x541c + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGET = 0x4004746a + TIOCMIWAIT = 0x545c + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_LOOP = 0x8000 + TIOCM_OUT1 = 0x2000 + TIOCM_OUT2 = 0x4000 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007484 + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x80047401 + TIOCSIG = 0x80047488 + TIOCSLCKTRMIOS = 0x5457 + TIOCSPGRP = 0x80047482 + TIOCSPTLCK = 0x80047487 + TIOCSRS485 = 0xc0205442 + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x80047465 + TIOCSTART = 0x2000746e + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCVHANGUP = 0x20005437 + TOSTOP = 0x100 + TUNATTACHFILTER = 0x801054d5 + TUNDETACHFILTER = 0x801054d6 + TUNGETFEATURES = 0x400454cf + TUNGETFILTER = 0x401054db + TUNGETIFF = 0x400454d2 + TUNGETSNDBUF = 0x400454d3 + TUNGETVNETBE = 0x400454df + TUNGETVNETHDRSZ = 0x400454d7 + TUNGETVNETLE = 0x400454dd + TUNSETDEBUG = 0x800454c9 + TUNSETGROUP = 0x800454ce + TUNSETIFF = 0x800454ca + TUNSETIFINDEX = 0x800454da + TUNSETLINK = 0x800454cd + TUNSETNOCSUM = 0x800454c8 + TUNSETOFFLOAD = 0x800454d0 + TUNSETOWNER = 0x800454cc + TUNSETPERSIST = 0x800454cb + TUNSETQUEUE = 0x800454d9 + TUNSETSNDBUF = 0x800454d4 + TUNSETTXFILTER = 0x800454d1 + TUNSETVNETBE = 0x800454de + TUNSETVNETHDRSZ = 0x800454d8 + TUNSETVNETLE = 0x800454dc + VDISCARD = 0xd + VDSUSP = 0xb + VEOF = 0x4 + VEOL = 0x5 + VEOL2 = 0x6 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x4 + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x40 + WRAP = 0x20000 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XCASE = 0x4 + XTABS = 0x1800 + __TIOCFLUSH = 0x80047410 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EADV = syscall.Errno(0x53) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x25) + EBADE = syscall.Errno(0x66) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x5d) + EBADMSG = syscall.Errno(0x4c) + EBADR = syscall.Errno(0x67) + EBADRQC = syscall.Errno(0x6a) + EBADSLT = syscall.Errno(0x6b) + EBFONT = syscall.Errno(0x6d) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x7f) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x5e) + ECOMM = syscall.Errno(0x55) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0x4e) + EDEADLOCK = syscall.Errno(0x6c) + EDESTADDRREQ = syscall.Errno(0x27) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x58) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EHWPOISON = syscall.Errno(0x87) + EIDRM = syscall.Errno(0x4d) + EILSEQ = syscall.Errno(0x7a) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x78) + EKEYEXPIRED = syscall.Errno(0x81) + EKEYREJECTED = syscall.Errno(0x83) + EKEYREVOKED = syscall.Errno(0x82) + EL2HLT = syscall.Errno(0x65) + EL2NSYNC = syscall.Errno(0x5f) + EL3HLT = syscall.Errno(0x60) + EL3RST = syscall.Errno(0x61) + ELIBACC = syscall.Errno(0x72) + ELIBBAD = syscall.Errno(0x70) + ELIBEXEC = syscall.Errno(0x6e) + ELIBMAX = syscall.Errno(0x7b) + ELIBSCN = syscall.Errno(0x7c) + ELNRNG = syscall.Errno(0x62) + ELOOP = syscall.Errno(0x3e) + EMEDIUMTYPE = syscall.Errno(0x7e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x57) + ENAMETOOLONG = syscall.Errno(0x3f) + ENAVAIL = syscall.Errno(0x77) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x69) + ENOBUFS = syscall.Errno(0x37) + ENOCSI = syscall.Errno(0x64) + ENODATA = syscall.Errno(0x6f) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0x80) + ENOLCK = syscall.Errno(0x4f) + ENOLINK = syscall.Errno(0x52) + ENOMEDIUM = syscall.Errno(0x7d) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x4b) + ENONET = syscall.Errno(0x50) + ENOPKG = syscall.Errno(0x71) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x4a) + ENOSTR = syscall.Errno(0x48) + ENOSYS = syscall.Errno(0x5a) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTNAM = syscall.Errno(0x76) + ENOTRECOVERABLE = syscall.Errno(0x85) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x2d) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x73) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x5c) + EOWNERDEAD = syscall.Errno(0x84) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROTO = syscall.Errno(0x56) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x59) + EREMOTE = syscall.Errno(0x47) + EREMOTEIO = syscall.Errno(0x79) + ERESTART = syscall.Errno(0x74) + ERFKILL = syscall.Errno(0x86) + EROFS = syscall.Errno(0x1e) + ERREMOTE = syscall.Errno(0x51) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x54) + ESTALE = syscall.Errno(0x46) + ESTRPIPE = syscall.Errno(0x5b) + ETIME = syscall.Errno(0x49) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x75) + EUNATCH = syscall.Errno(0x63) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x68) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGLOST = syscall.Signal(0x1d) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x17) + SIGPROF = syscall.Signal(0x1b) + SIGPWR = syscall.Signal(0x1d) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "no such device or address"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EAGAIN", "resource temporarily unavailable"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device or resource busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "invalid cross-device link"}, + {19, "ENODEV", "no such device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "numerical result out of range"}, + {36, "EINPROGRESS", "operation now in progress"}, + {37, "EALREADY", "operation already in progress"}, + {38, "ENOTSOCK", "socket operation on non-socket"}, + {39, "EDESTADDRREQ", "destination address required"}, + {40, "EMSGSIZE", "message too long"}, + {41, "EPROTOTYPE", "protocol wrong type for socket"}, + {42, "ENOPROTOOPT", "protocol not available"}, + {43, "EPROTONOSUPPORT", "protocol not supported"}, + {44, "ESOCKTNOSUPPORT", "socket type not supported"}, + {45, "ENOTSUP", "operation not supported"}, + {46, "EPFNOSUPPORT", "protocol family not supported"}, + {47, "EAFNOSUPPORT", "address family not supported by protocol"}, + {48, "EADDRINUSE", "address already in use"}, + {49, "EADDRNOTAVAIL", "cannot assign requested address"}, + {50, "ENETDOWN", "network is down"}, + {51, "ENETUNREACH", "network is unreachable"}, + {52, "ENETRESET", "network dropped connection on reset"}, + {53, "ECONNABORTED", "software caused connection abort"}, + {54, "ECONNRESET", "connection reset by peer"}, + {55, "ENOBUFS", "no buffer space available"}, + {56, "EISCONN", "transport endpoint is already connected"}, + {57, "ENOTCONN", "transport endpoint is not connected"}, + {58, "ESHUTDOWN", "cannot send after transport endpoint shutdown"}, + {59, "ETOOMANYREFS", "too many references: cannot splice"}, + {60, "ETIMEDOUT", "connection timed out"}, + {61, "ECONNREFUSED", "connection refused"}, + {62, "ELOOP", "too many levels of symbolic links"}, + {63, "ENAMETOOLONG", "file name too long"}, + {64, "EHOSTDOWN", "host is down"}, + {65, "EHOSTUNREACH", "no route to host"}, + {66, "ENOTEMPTY", "directory not empty"}, + {67, "EPROCLIM", "too many processes"}, + {68, "EUSERS", "too many users"}, + {69, "EDQUOT", "disk quota exceeded"}, + {70, "ESTALE", "stale file handle"}, + {71, "EREMOTE", "object is remote"}, + {72, "ENOSTR", "device not a stream"}, + {73, "ETIME", "timer expired"}, + {74, "ENOSR", "out of streams resources"}, + {75, "ENOMSG", "no message of desired type"}, + {76, "EBADMSG", "bad message"}, + {77, "EIDRM", "identifier removed"}, + {78, "EDEADLK", "resource deadlock avoided"}, + {79, "ENOLCK", "no locks available"}, + {80, "ENONET", "machine is not on the network"}, + {81, "ERREMOTE", "unknown error 81"}, + {82, "ENOLINK", "link has been severed"}, + {83, "EADV", "advertise error"}, + {84, "ESRMNT", "srmount error"}, + {85, "ECOMM", "communication error on send"}, + {86, "EPROTO", "protocol error"}, + {87, "EMULTIHOP", "multihop attempted"}, + {88, "EDOTDOT", "RFS specific error"}, + {89, "EREMCHG", "remote address changed"}, + {90, "ENOSYS", "function not implemented"}, + {91, "ESTRPIPE", "streams pipe error"}, + {92, "EOVERFLOW", "value too large for defined data type"}, + {93, "EBADFD", "file descriptor in bad state"}, + {94, "ECHRNG", "channel number out of range"}, + {95, "EL2NSYNC", "level 2 not synchronized"}, + {96, "EL3HLT", "level 3 halted"}, + {97, "EL3RST", "level 3 reset"}, + {98, "ELNRNG", "link number out of range"}, + {99, "EUNATCH", "protocol driver not attached"}, + {100, "ENOCSI", "no CSI structure available"}, + {101, "EL2HLT", "level 2 halted"}, + {102, "EBADE", "invalid exchange"}, + {103, "EBADR", "invalid request descriptor"}, + {104, "EXFULL", "exchange full"}, + {105, "ENOANO", "no anode"}, + {106, "EBADRQC", "invalid request code"}, + {107, "EBADSLT", "invalid slot"}, + {108, "EDEADLOCK", "file locking deadlock error"}, + {109, "EBFONT", "bad font file format"}, + {110, "ELIBEXEC", "cannot exec a shared library directly"}, + {111, "ENODATA", "no data available"}, + {112, "ELIBBAD", "accessing a corrupted shared library"}, + {113, "ENOPKG", "package not installed"}, + {114, "ELIBACC", "can not access a needed shared library"}, + {115, "ENOTUNIQ", "name not unique on network"}, + {116, "ERESTART", "interrupted system call should be restarted"}, + {117, "EUCLEAN", "structure needs cleaning"}, + {118, "ENOTNAM", "not a XENIX named type file"}, + {119, "ENAVAIL", "no XENIX semaphores available"}, + {120, "EISNAM", "is a named type file"}, + {121, "EREMOTEIO", "remote I/O error"}, + {122, "EILSEQ", "invalid or incomplete multibyte or wide character"}, + {123, "ELIBMAX", "attempting to link in too many shared libraries"}, + {124, "ELIBSCN", ".lib section in a.out corrupted"}, + {125, "ENOMEDIUM", "no medium found"}, + {126, "EMEDIUMTYPE", "wrong medium type"}, + {127, "ECANCELED", "operation canceled"}, + {128, "ENOKEY", "required key not available"}, + {129, "EKEYEXPIRED", "key has expired"}, + {130, "EKEYREVOKED", "key has been revoked"}, + {131, "EKEYREJECTED", "key was rejected by service"}, + {132, "EOWNERDEAD", "owner died"}, + {133, "ENOTRECOVERABLE", "state not recoverable"}, + {134, "ERFKILL", "operation not possible due to RF-kill"}, + {135, "EHWPOISON", "memory page has hardware error"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/breakpoint trap"}, + {6, "SIGABRT", "aborted"}, + {7, "SIGEMT", "EMT trap"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGBUS", "bus error"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGSYS", "bad system call"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGURG", "urgent I/O condition"}, + {17, "SIGSTOP", "stopped (signal)"}, + {18, "SIGTSTP", "stopped"}, + {19, "SIGCONT", "continued"}, + {20, "SIGCHLD", "child exited"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGIO", "I/O possible"}, + {24, "SIGXCPU", "CPU time limit exceeded"}, + {25, "SIGXFSZ", "file size limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window changed"}, + {29, "SIGLOST", "power failure"}, + {30, "SIGUSR1", "user defined signal 1"}, + {31, "SIGUSR2", "user defined signal 2"}, +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go new file mode 100644 index 00000000..78cc04ea --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go @@ -0,0 +1,1772 @@ +// mkerrors.sh -m32 +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build 386,netbsd + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m32 _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_ARP = 0x1c + AF_BLUETOOTH = 0x1f + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x20 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x18 + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x23 + AF_MPLS = 0x21 + AF_NATM = 0x1b + AF_NS = 0x6 + AF_OROUTE = 0x11 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x22 + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + ARPHRD_ARCNET = 0x7 + ARPHRD_ETHER = 0x1 + ARPHRD_FRELAY = 0xf + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_STRIP = 0x17 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B460800 = 0x70800 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B921600 = 0xe1000 + B9600 = 0x2580 + BIOCFEEDBACK = 0x8004427d + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc0084277 + BIOCGETIF = 0x4090426b + BIOCGFEEDBACK = 0x4004427c + BIOCGHDRCMPLT = 0x40044274 + BIOCGRTIMEOUT = 0x400c427b + BIOCGSEESENT = 0x40044278 + BIOCGSTATS = 0x4080426f + BIOCGSTATSOLD = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDLT = 0x80044276 + BIOCSETF = 0x80084267 + BIOCSETIF = 0x8090426c + BIOCSFEEDBACK = 0x8004427d + BIOCSHDRCMPLT = 0x80044275 + BIOCSRTIMEOUT = 0x800c427a + BIOCSSEESENT = 0x80044279 + BIOCSTCPF = 0x80084272 + BIOCSUDPF = 0x80084273 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALIGNMENT32 = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DFLTBUFSIZE = 0x100000 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x1000000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + CFLUSH = 0xf + CLOCAL = 0x8000 + CLONE_CSIGNAL = 0xff + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_PID = 0x1000 + CLONE_PTRACE = 0x2000 + CLONE_SIGHAND = 0x800 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CREAD = 0x800 + CRTSCTS = 0x10000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_HW = 0x6 + CTL_KERN = 0x1 + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + CTL_QUERY = -0x2 + DIOCBSFLUSH = 0x20006478 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_HDLC = 0x10 + DLT_HHDLC = 0x79 + DLT_HIPPI = 0xf + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPNET = 0xe2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0xe + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PRISM_HEADER = 0x77 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RAWAF_MASK = 0x2240000 + DLT_RIO = 0x7c + DLT_SCCP = 0x8e + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xd + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_WIHART = 0xdf + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EMUL_LINUX = 0x1 + EMUL_LINUX32 = 0x5 + EMUL_MAXID = 0x6 + EN_SW_CTL_INF = 0x1000 + EN_SW_CTL_PREC = 0x300 + EN_SW_CTL_ROUND = 0xc00 + EN_SW_DATACHAIN = 0x80 + EN_SW_DENORM = 0x2 + EN_SW_INVOP = 0x1 + EN_SW_OVERFLOW = 0x8 + EN_SW_PRECLOSS = 0x20 + EN_SW_UNDERFLOW = 0x10 + EN_SW_ZERODIV = 0x4 + ETHERCAP_JUMBO_MTU = 0x4 + ETHERCAP_VLAN_HWTAGGING = 0x2 + ETHERCAP_VLAN_MTU = 0x1 + ETHERMIN = 0x2e + ETHERMTU = 0x5dc + ETHERMTU_JUMBO = 0x2328 + ETHERTYPE_8023 = 0x4 + ETHERTYPE_AARP = 0x80f3 + ETHERTYPE_ACCTON = 0x8390 + ETHERTYPE_AEONIC = 0x8036 + ETHERTYPE_ALPHA = 0x814a + ETHERTYPE_AMBER = 0x6008 + ETHERTYPE_AMOEBA = 0x8145 + ETHERTYPE_APOLLO = 0x80f7 + ETHERTYPE_APOLLODOMAIN = 0x8019 + ETHERTYPE_APPLETALK = 0x809b + ETHERTYPE_APPLITEK = 0x80c7 + ETHERTYPE_ARGONAUT = 0x803a + ETHERTYPE_ARP = 0x806 + ETHERTYPE_AT = 0x809b + ETHERTYPE_ATALK = 0x809b + ETHERTYPE_ATOMIC = 0x86df + ETHERTYPE_ATT = 0x8069 + ETHERTYPE_ATTSTANFORD = 0x8008 + ETHERTYPE_AUTOPHON = 0x806a + ETHERTYPE_AXIS = 0x8856 + ETHERTYPE_BCLOOP = 0x9003 + ETHERTYPE_BOFL = 0x8102 + ETHERTYPE_CABLETRON = 0x7034 + ETHERTYPE_CHAOS = 0x804 + ETHERTYPE_COMDESIGN = 0x806c + ETHERTYPE_COMPUGRAPHIC = 0x806d + ETHERTYPE_COUNTERPOINT = 0x8062 + ETHERTYPE_CRONUS = 0x8004 + ETHERTYPE_CRONUSVLN = 0x8003 + ETHERTYPE_DCA = 0x1234 + ETHERTYPE_DDE = 0x807b + ETHERTYPE_DEBNI = 0xaaaa + ETHERTYPE_DECAM = 0x8048 + ETHERTYPE_DECCUST = 0x6006 + ETHERTYPE_DECDIAG = 0x6005 + ETHERTYPE_DECDNS = 0x803c + ETHERTYPE_DECDTS = 0x803e + ETHERTYPE_DECEXPER = 0x6000 + ETHERTYPE_DECLAST = 0x8041 + ETHERTYPE_DECLTM = 0x803f + ETHERTYPE_DECMUMPS = 0x6009 + ETHERTYPE_DECNETBIOS = 0x8040 + ETHERTYPE_DELTACON = 0x86de + ETHERTYPE_DIDDLE = 0x4321 + ETHERTYPE_DLOG1 = 0x660 + ETHERTYPE_DLOG2 = 0x661 + ETHERTYPE_DN = 0x6003 + ETHERTYPE_DOGFIGHT = 0x1989 + ETHERTYPE_DSMD = 0x8039 + ETHERTYPE_ECMA = 0x803 + ETHERTYPE_ENCRYPT = 0x803d + ETHERTYPE_ES = 0x805d + ETHERTYPE_EXCELAN = 0x8010 + ETHERTYPE_EXPERDATA = 0x8049 + ETHERTYPE_FLIP = 0x8146 + ETHERTYPE_FLOWCONTROL = 0x8808 + ETHERTYPE_FRARP = 0x808 + ETHERTYPE_GENDYN = 0x8068 + ETHERTYPE_HAYES = 0x8130 + ETHERTYPE_HIPPI_FP = 0x8180 + ETHERTYPE_HITACHI = 0x8820 + ETHERTYPE_HP = 0x8005 + ETHERTYPE_IEEEPUP = 0xa00 + ETHERTYPE_IEEEPUPAT = 0xa01 + ETHERTYPE_IMLBL = 0x4c42 + ETHERTYPE_IMLBLDIAG = 0x424c + ETHERTYPE_IP = 0x800 + ETHERTYPE_IPAS = 0x876c + ETHERTYPE_IPV6 = 0x86dd + ETHERTYPE_IPX = 0x8137 + ETHERTYPE_IPXNEW = 0x8037 + ETHERTYPE_KALPANA = 0x8582 + ETHERTYPE_LANBRIDGE = 0x8038 + ETHERTYPE_LANPROBE = 0x8888 + ETHERTYPE_LAT = 0x6004 + ETHERTYPE_LBACK = 0x9000 + ETHERTYPE_LITTLE = 0x8060 + ETHERTYPE_LOGICRAFT = 0x8148 + ETHERTYPE_LOOPBACK = 0x9000 + ETHERTYPE_MATRA = 0x807a + ETHERTYPE_MAX = 0xffff + ETHERTYPE_MERIT = 0x807c + ETHERTYPE_MICP = 0x873a + ETHERTYPE_MOPDL = 0x6001 + ETHERTYPE_MOPRC = 0x6002 + ETHERTYPE_MOTOROLA = 0x818d + ETHERTYPE_MPLS = 0x8847 + ETHERTYPE_MPLS_MCAST = 0x8848 + ETHERTYPE_MUMPS = 0x813f + ETHERTYPE_NBPCC = 0x3c04 + ETHERTYPE_NBPCLAIM = 0x3c09 + ETHERTYPE_NBPCLREQ = 0x3c05 + ETHERTYPE_NBPCLRSP = 0x3c06 + ETHERTYPE_NBPCREQ = 0x3c02 + ETHERTYPE_NBPCRSP = 0x3c03 + ETHERTYPE_NBPDG = 0x3c07 + ETHERTYPE_NBPDGB = 0x3c08 + ETHERTYPE_NBPDLTE = 0x3c0a + ETHERTYPE_NBPRAR = 0x3c0c + ETHERTYPE_NBPRAS = 0x3c0b + ETHERTYPE_NBPRST = 0x3c0d + ETHERTYPE_NBPSCD = 0x3c01 + ETHERTYPE_NBPVCD = 0x3c00 + ETHERTYPE_NBS = 0x802 + ETHERTYPE_NCD = 0x8149 + ETHERTYPE_NESTAR = 0x8006 + ETHERTYPE_NETBEUI = 0x8191 + ETHERTYPE_NOVELL = 0x8138 + ETHERTYPE_NS = 0x600 + ETHERTYPE_NSAT = 0x601 + ETHERTYPE_NSCOMPAT = 0x807 + ETHERTYPE_NTRAILER = 0x10 + ETHERTYPE_OS9 = 0x7007 + ETHERTYPE_OS9NET = 0x7009 + ETHERTYPE_PACER = 0x80c6 + ETHERTYPE_PAE = 0x888e + ETHERTYPE_PCS = 0x4242 + ETHERTYPE_PLANNING = 0x8044 + ETHERTYPE_PPP = 0x880b + ETHERTYPE_PPPOE = 0x8864 + ETHERTYPE_PPPOEDISC = 0x8863 + ETHERTYPE_PRIMENTS = 0x7031 + ETHERTYPE_PUP = 0x200 + ETHERTYPE_PUPAT = 0x200 + ETHERTYPE_RACAL = 0x7030 + ETHERTYPE_RATIONAL = 0x8150 + ETHERTYPE_RAWFR = 0x6559 + ETHERTYPE_RCL = 0x1995 + ETHERTYPE_RDP = 0x8739 + ETHERTYPE_RETIX = 0x80f2 + ETHERTYPE_REVARP = 0x8035 + ETHERTYPE_SCA = 0x6007 + ETHERTYPE_SECTRA = 0x86db + ETHERTYPE_SECUREDATA = 0x876d + ETHERTYPE_SGITW = 0x817e + ETHERTYPE_SG_BOUNCE = 0x8016 + ETHERTYPE_SG_DIAG = 0x8013 + ETHERTYPE_SG_NETGAMES = 0x8014 + ETHERTYPE_SG_RESV = 0x8015 + ETHERTYPE_SIMNET = 0x5208 + ETHERTYPE_SLOWPROTOCOLS = 0x8809 + ETHERTYPE_SNA = 0x80d5 + ETHERTYPE_SNMP = 0x814c + ETHERTYPE_SONIX = 0xfaf5 + ETHERTYPE_SPIDER = 0x809f + ETHERTYPE_SPRITE = 0x500 + ETHERTYPE_STP = 0x8181 + ETHERTYPE_TALARIS = 0x812b + ETHERTYPE_TALARISMC = 0x852b + ETHERTYPE_TCPCOMP = 0x876b + ETHERTYPE_TCPSM = 0x9002 + ETHERTYPE_TEC = 0x814f + ETHERTYPE_TIGAN = 0x802f + ETHERTYPE_TRAIL = 0x1000 + ETHERTYPE_TRANSETHER = 0x6558 + ETHERTYPE_TYMSHARE = 0x802e + ETHERTYPE_UBBST = 0x7005 + ETHERTYPE_UBDEBUG = 0x900 + ETHERTYPE_UBDIAGLOOP = 0x7002 + ETHERTYPE_UBDL = 0x7000 + ETHERTYPE_UBNIU = 0x7001 + ETHERTYPE_UBNMC = 0x7003 + ETHERTYPE_VALID = 0x1600 + ETHERTYPE_VARIAN = 0x80dd + ETHERTYPE_VAXELN = 0x803b + ETHERTYPE_VEECO = 0x8067 + ETHERTYPE_VEXP = 0x805b + ETHERTYPE_VGLAB = 0x8131 + ETHERTYPE_VINES = 0xbad + ETHERTYPE_VINESECHO = 0xbaf + ETHERTYPE_VINESLOOP = 0xbae + ETHERTYPE_VITAL = 0xff00 + ETHERTYPE_VLAN = 0x8100 + ETHERTYPE_VLTLMAN = 0x8080 + ETHERTYPE_VPROD = 0x805c + ETHERTYPE_VURESERVED = 0x8147 + ETHERTYPE_WATERLOO = 0x8130 + ETHERTYPE_WELLFLEET = 0x8103 + ETHERTYPE_X25 = 0x805 + ETHERTYPE_X75 = 0x801 + ETHERTYPE_XNSSM = 0x9001 + ETHERTYPE_XTP = 0x817d + ETHER_ADDR_LEN = 0x6 + ETHER_CRC_LEN = 0x4 + ETHER_CRC_POLY_BE = 0x4c11db6 + ETHER_CRC_POLY_LE = 0xedb88320 + ETHER_HDR_LEN = 0xe + ETHER_MAX_LEN = 0x5ee + ETHER_MAX_LEN_JUMBO = 0x233a + ETHER_MIN_LEN = 0x40 + ETHER_PPPOE_ENCAP_LEN = 0x8 + ETHER_TYPE_LEN = 0x2 + ETHER_VLAN_ENCAP_LEN = 0x4 + EVFILT_AIO = 0x2 + EVFILT_PROC = 0x4 + EVFILT_READ = 0x0 + EVFILT_SIGNAL = 0x5 + EVFILT_SYSCOUNT = 0x7 + EVFILT_TIMER = 0x6 + EVFILT_VNODE = 0x3 + EVFILT_WRITE = 0x1 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTATTR_CMD_START = 0x1 + EXTATTR_CMD_STOP = 0x2 + EXTATTR_NAMESPACE_SYSTEM = 0x2 + EXTATTR_NAMESPACE_USER = 0x1 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x100 + FLUSHO = 0x800000 + F_CLOSEM = 0xa + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0xc + F_FSCTL = -0x80000000 + F_FSDIRMASK = 0x70000000 + F_FSIN = 0x10000000 + F_FSINOUT = 0x30000000 + F_FSOUT = 0x20000000 + F_FSPRIV = 0x8000 + F_FSVOID = 0x40000000 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETNOSIGPIPE = 0xd + F_GETOWN = 0x5 + F_MAXFD = 0xb + F_OK = 0x0 + F_PARAM_MASK = 0xfff + F_PARAM_MAX = 0xfff + F_RDLCK = 0x1 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETNOSIGPIPE = 0xe + F_SETOWN = 0x6 + F_UNLCK = 0x2 + F_WRLCK = 0x3 + HUPCL = 0x4000 + HW_MACHINE = 0x1 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFAN_ARRIVAL = 0x0 + IFAN_DEPARTURE = 0x1 + IFA_ROUTE = 0x1 + IFF_ALLMULTI = 0x200 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x8f52 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NOTRAILERS = 0x20 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BRIDGE = 0xd1 + IFT_BSC = 0x53 + IFT_CARP = 0xf8 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DOCSCABLEUPSTREAMCHANNEL = 0xcd + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ECONET = 0xce + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAITH = 0xf2 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE1394 = 0x90 + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_INFINIBAND = 0xc7 + IFT_INTERLEAVE = 0x7c + IFT_IP = 0x7e + IFT_IPFORWARD = 0x8e + IFT_IPOVERATM = 0x72 + IFT_IPOVERCDLC = 0x6d + IFT_IPOVERCLAW = 0x6e + IFT_IPSWITCH = 0x4e + IFT_ISDN = 0x3f + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISDNS = 0x4b + IFT_ISDNU = 0x4c + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88025CRFPINT = 0x62 + IFT_ISO88025DTR = 0x56 + IFT_ISO88025FIBER = 0x73 + IFT_ISO88026 = 0xa + IFT_ISUP = 0xb3 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_L3IPXVLAN = 0x89 + IFT_LAPB = 0x10 + IFT_LAPD = 0x4d + IFT_LAPF = 0x77 + IFT_LINEGROUP = 0xd2 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf5 + IFT_PFSYNC = 0xf6 + IFT_PLC = 0xae + IFT_PON155 = 0xcf + IFT_PON622 = 0xd0 + IFT_POS = 0xab + IFT_PPP = 0x17 + IFT_PPPMULTILINKBUNDLE = 0x6c + IFT_PROPATM = 0xc5 + IFT_PROPBWAP2MP = 0xb8 + IFT_PROPCNLS = 0x59 + IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 + IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 + IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PROPWIRELESSP2P = 0x9d + IFT_PTPSERIAL = 0x16 + IFT_PVC = 0xf1 + IFT_Q2931 = 0xc9 + IFT_QLLC = 0x44 + IFT_RADIOMAC = 0xbc + IFT_RADSL = 0x5f + IFT_REACHDSL = 0xc0 + IFT_RFC1483 = 0x9f + IFT_RS232 = 0x21 + IFT_RSRB = 0x4f + IFT_SDLC = 0x11 + IFT_SDSL = 0x60 + IFT_SHDSL = 0xa9 + IFT_SIP = 0x1f + IFT_SIPSIG = 0xcc + IFT_SIPTG = 0xcb + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETOVERHEADCHANNEL = 0xb9 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_SRP = 0x97 + IFT_SS7SIGLINK = 0x9c + IFT_STACKTOSTACK = 0x6f + IFT_STARLAN = 0xb + IFT_STF = 0xd7 + IFT_T1 = 0x12 + IFT_TDLC = 0x74 + IFT_TELINK = 0xc8 + IFT_TERMPAD = 0x5b + IFT_TR008 = 0xb0 + IFT_TRANSPHDLC = 0x7b + IFT_TUNNEL = 0x83 + IFT_ULTRA = 0x1d + IFT_USB = 0xa0 + IFT_V11 = 0x40 + IFT_V35 = 0x2d + IFT_V36 = 0x41 + IFT_V37 = 0x78 + IFT_VDSL = 0x61 + IFT_VIRTUALIPADDRESS = 0x70 + IFT_VIRTUALTG = 0xca + IFT_VOICEDID = 0xd5 + IFT_VOICEEM = 0x64 + IFT_VOICEEMFGD = 0xd3 + IFT_VOICEENCAP = 0x67 + IFT_VOICEFGDEANA = 0xd4 + IFT_VOICEFXO = 0x65 + IFT_VOICEFXS = 0x66 + IFT_VOICEOVERATM = 0x98 + IFT_VOICEOVERCABLE = 0xc6 + IFT_VOICEOVERFRAMERELAY = 0x99 + IFT_VOICEOVERIP = 0x68 + IFT_X213 = 0x5d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25HUNTGROUP = 0x7a + IFT_X25MLP = 0x79 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IPPROTO_AH = 0x33 + IPPROTO_CARP = 0x70 + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPIP = 0x4 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IPV6_ICMP = 0x3a + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x34 + IPPROTO_MOBILE = 0x37 + IPPROTO_NONE = 0x3b + IPPROTO_PFSYNC = 0xf0 + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_VRRP = 0x70 + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FRAGTTL = 0x78 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXPACKET = 0xffff + IPV6_MMTU = 0x500 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_PATHMTU = 0x2c + IPV6_PKTINFO = 0x2e + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0xd + IP_EF = 0x8000 + IP_ERRORMTU = 0x15 + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x16 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINFRAGSIZE = 0x45 + IP_MINTTL = 0x18 + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x1 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVTTL = 0x17 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_TOS = 0x3 + IP_TTL = 0x4 + ISIG = 0x80 + ISTRIP = 0x20 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + KERN_HOSTNAME = 0xa + KERN_OSRELEASE = 0x2 + KERN_OSTYPE = 0x1 + KERN_VERSION = 0x4 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x6 + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_SPACEAVAIL = 0x5 + MADV_WILLNEED = 0x3 + MAP_ALIGNMENT_16MB = 0x18000000 + MAP_ALIGNMENT_1TB = 0x28000000 + MAP_ALIGNMENT_256TB = 0x30000000 + MAP_ALIGNMENT_4GB = 0x20000000 + MAP_ALIGNMENT_64KB = 0x10000000 + MAP_ALIGNMENT_64PB = 0x38000000 + MAP_ALIGNMENT_MASK = -0x1000000 + MAP_ALIGNMENT_SHIFT = 0x18 + MAP_ANON = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_INHERIT = 0x80 + MAP_INHERIT_COPY = 0x1 + MAP_INHERIT_DEFAULT = 0x1 + MAP_INHERIT_DONATE_COPY = 0x3 + MAP_INHERIT_NONE = 0x2 + MAP_INHERIT_SHARE = 0x0 + MAP_NORESERVE = 0x40 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_SHARED = 0x1 + MAP_STACK = 0x2000 + MAP_TRYFIXED = 0x400 + MAP_WIRED = 0x800 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MNT_ASYNC = 0x40 + MNT_BASIC_FLAGS = 0xe782807f + MNT_DEFEXPORTED = 0x200 + MNT_DISCARD = 0x800000 + MNT_EXKERB = 0x800 + MNT_EXNORESPORT = 0x8000000 + MNT_EXPORTANON = 0x400 + MNT_EXPORTED = 0x100 + MNT_EXPUBLIC = 0x10000000 + MNT_EXRDONLY = 0x80 + MNT_EXTATTR = 0x1000000 + MNT_FORCE = 0x80000 + MNT_GETARGS = 0x400000 + MNT_IGNORE = 0x100000 + MNT_LAZY = 0x3 + MNT_LOCAL = 0x1000 + MNT_LOG = 0x2000000 + MNT_NOATIME = 0x4000000 + MNT_NOCOREDUMP = 0x8000 + MNT_NODEV = 0x10 + MNT_NODEVMTIME = 0x40000000 + MNT_NOEXEC = 0x4 + MNT_NOSUID = 0x8 + MNT_NOWAIT = 0x2 + MNT_OP_FLAGS = 0x4d0000 + MNT_QUOTA = 0x2000 + MNT_RDONLY = 0x1 + MNT_RELATIME = 0x20000 + MNT_RELOAD = 0x40000 + MNT_ROOTFS = 0x4000 + MNT_SOFTDEP = 0x80000000 + MNT_SYMPERM = 0x20000000 + MNT_SYNCHRONOUS = 0x2 + MNT_UNION = 0x20 + MNT_UPDATE = 0x10000 + MNT_VISFLAGMASK = 0xff90ffff + MNT_WAIT = 0x1 + MSG_BCAST = 0x100 + MSG_CMSG_CLOEXEC = 0x800 + MSG_CONTROLMBUF = 0x2000000 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOR = 0x8 + MSG_IOVUSRSPACE = 0x4000000 + MSG_LENUSRSPACE = 0x8000000 + MSG_MCAST = 0x200 + MSG_NAMEMBUF = 0x1000000 + MSG_NBIO = 0x1000 + MSG_NOSIGNAL = 0x400 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_USERFLAGS = 0xffffff + MSG_WAITALL = 0x40 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x2 + MS_SYNC = 0x4 + NAME_MAX = 0x1ff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x5 + NET_RT_MAXID = 0x6 + NET_RT_OIFLIST = 0x4 + NET_RT_OOIFLIST = 0x3 + NOFLSH = 0x80000000 + NOTE_ATTRIB = 0x8 + NOTE_CHILD = 0x4 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXTEND = 0x4 + NOTE_FORK = 0x40000000 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_PCTRLMASK = 0xf0000000 + NOTE_PDATAMASK = 0xfffff + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + OFIOGETBMAP = 0xc004667a + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_ALT_IO = 0x40000 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x400000 + O_CREAT = 0x200 + O_DIRECT = 0x80000 + O_DIRECTORY = 0x200000 + O_DSYNC = 0x10000 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_NOSIGPIPE = 0x1000000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x20000 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PRI_IOFLUSH = 0x7c + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + RLIMIT_AS = 0xa + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_MEMLOCK = 0x6 + RLIMIT_NOFILE = 0x8 + RLIMIT_NPROC = 0x7 + RLIMIT_RSS = 0x5 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x9 + RTAX_NETMASK = 0x2 + RTAX_TAG = 0x8 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTA_TAG = 0x100 + RTF_ANNOUNCE = 0x20000 + RTF_BLACKHOLE = 0x1000 + RTF_CLONED = 0x2000 + RTF_CLONING = 0x100 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_LLINFO = 0x400 + RTF_MASK = 0x80 + RTF_MODIFIED = 0x20 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_REJECT = 0x8 + RTF_SRC = 0x10000 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_CHGADDR = 0x15 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_GET = 0x4 + RTM_IEEE80211 = 0x11 + RTM_IFANNOUNCE = 0x10 + RTM_IFINFO = 0x14 + RTM_LLINFO_UPD = 0x13 + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_OIFINFO = 0xf + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + RTM_OOIFINFO = 0xe + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_SETGATE = 0x12 + RTM_VERSION = 0x4 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + SCM_CREDS = 0x4 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x8 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80906931 + SIOCADDRT = 0x8030720a + SIOCAIFADDR = 0x8040691a + SIOCALIFADDR = 0x8118691c + SIOCATMARK = 0x40047307 + SIOCDELMULTI = 0x80906932 + SIOCDELRT = 0x8030720b + SIOCDIFADDR = 0x80906919 + SIOCDIFPHYADDR = 0x80906949 + SIOCDLIFADDR = 0x8118691e + SIOCGDRVSPEC = 0xc01c697b + SIOCGETPFSYNC = 0xc09069f8 + SIOCGETSGCNT = 0xc0147534 + SIOCGETVIFCNT = 0xc0147533 + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0906921 + SIOCGIFADDRPREF = 0xc0946920 + SIOCGIFALIAS = 0xc040691b + SIOCGIFBRDADDR = 0xc0906923 + SIOCGIFCAP = 0xc0206976 + SIOCGIFCONF = 0xc0086926 + SIOCGIFDATA = 0xc0946985 + SIOCGIFDLT = 0xc0906977 + SIOCGIFDSTADDR = 0xc0906922 + SIOCGIFFLAGS = 0xc0906911 + SIOCGIFGENERIC = 0xc090693a + SIOCGIFMEDIA = 0xc0286936 + SIOCGIFMETRIC = 0xc0906917 + SIOCGIFMTU = 0xc090697e + SIOCGIFNETMASK = 0xc0906925 + SIOCGIFPDSTADDR = 0xc0906948 + SIOCGIFPSRCADDR = 0xc0906947 + SIOCGLIFADDR = 0xc118691d + SIOCGLIFPHYADDR = 0xc118694b + SIOCGLINKSTR = 0xc01c6987 + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCGVH = 0xc0906983 + SIOCIFCREATE = 0x8090697a + SIOCIFDESTROY = 0x80906979 + SIOCIFGCLONERS = 0xc00c6978 + SIOCINITIFADDR = 0xc0446984 + SIOCSDRVSPEC = 0x801c697b + SIOCSETPFSYNC = 0x809069f7 + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8090690c + SIOCSIFADDRPREF = 0x8094691f + SIOCSIFBRDADDR = 0x80906913 + SIOCSIFCAP = 0x80206975 + SIOCSIFDSTADDR = 0x8090690e + SIOCSIFFLAGS = 0x80906910 + SIOCSIFGENERIC = 0x80906939 + SIOCSIFMEDIA = 0xc0906935 + SIOCSIFMETRIC = 0x80906918 + SIOCSIFMTU = 0x8090697f + SIOCSIFNETMASK = 0x80906916 + SIOCSIFPHYADDR = 0x80406946 + SIOCSLIFPHYADDR = 0x8118694a + SIOCSLINKSTR = 0x801c6988 + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SIOCSVH = 0xc0906982 + SIOCZIFDATA = 0xc0946986 + SOCK_CLOEXEC = 0x10000000 + SOCK_DGRAM = 0x2 + SOCK_FLAGS_MASK = 0xf0000000 + SOCK_NONBLOCK = 0x20000000 + SOCK_NOSIGPIPE = 0x40000000 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_ACCEPTFILTER = 0x1000 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_NOHEADER = 0x100a + SO_NOSIGPIPE = 0x800 + SO_OOBINLINE = 0x100 + SO_OVERFLOWED = 0x1009 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x100c + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x100b + SO_TIMESTAMP = 0x2000 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + SYSCTL_VERSION = 0x1000000 + SYSCTL_VERS_0 = 0x0 + SYSCTL_VERS_1 = 0x1000000 + SYSCTL_VERS_MASK = 0xff000000 + S_ARCH1 = 0x10000 + S_ARCH2 = 0x20000 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IFWHT = 0xe000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISTXT = 0x200 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + S_LOGIN_SET = 0x1 + TCIFLUSH = 0x1 + TCIOFLUSH = 0x3 + TCOFLUSH = 0x2 + TCP_CONGCTL = 0x20 + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x3 + TCP_KEEPINIT = 0x7 + TCP_KEEPINTVL = 0x5 + TCP_MAXBURST = 0x4 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0x10 + TCP_MINMSS = 0xd8 + TCP_MSS = 0x218 + TCP_NODELAY = 0x1 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDCDTIMESTAMP = 0x400c7458 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLAG_CDTRCTS = 0x10 + TIOCFLAG_CLOCAL = 0x2 + TIOCFLAG_CRTSCTS = 0x4 + TIOCFLAG_MDMBUF = 0x8 + TIOCFLAG_SOFTCAR = 0x1 + TIOCFLUSH = 0x80047410 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGFLAGS = 0x4004745d + TIOCGLINED = 0x40207442 + TIOCGPGRP = 0x40047477 + TIOCGQSIZE = 0x40047481 + TIOCGRANTPT = 0x20007447 + TIOCGSID = 0x40047463 + TIOCGSIZE = 0x40087468 + TIOCGWINSZ = 0x40087468 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGET = 0x4004746a + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCPTMGET = 0x40287446 + TIOCPTSNAME = 0x40287448 + TIOCRCVFRAME = 0x80047445 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSFLAGS = 0x8004745c + TIOCSIG = 0x2000745f + TIOCSLINED = 0x80207443 + TIOCSPGRP = 0x80047476 + TIOCSQSIZE = 0x80047480 + TIOCSSIZE = 0x80087467 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x80047465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCUCNTL = 0x80047466 + TIOCXMTFRAME = 0x80047444 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WALL = 0x8 + WALLSIG = 0x8 + WALTSIG = 0x4 + WCLONE = 0x4 + WCOREFLAG = 0x80 + WNOHANG = 0x1 + WNOWAIT = 0x10000 + WNOZOMBIE = 0x20000 + WOPTSCHECKED = 0x40000 + WSTOPPED = 0x7f + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADF = syscall.Errno(0x9) + EBADMSG = syscall.Errno(0x58) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x57) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDOM = syscall.Errno(0x21) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x52) + EILSEQ = syscall.Errno(0x55) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x60) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5e) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x5d) + ENOBUFS = syscall.Errno(0x37) + ENODATA = syscall.Errno(0x59) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x5f) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x53) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x5a) + ENOSTR = syscall.Errno(0x5b) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x56) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x54) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTO = syscall.Errno(0x60) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIME = syscall.Errno(0x5c) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGPWR = syscall.Signal(0x20) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "device not configured"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EDEADLK", "resource deadlock avoided"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "cross-device link"}, + {19, "ENODEV", "operation not supported by device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "result too large or too small"}, + {35, "EAGAIN", "resource temporarily unavailable"}, + {36, "EINPROGRESS", "operation now in progress"}, + {37, "EALREADY", "operation already in progress"}, + {38, "ENOTSOCK", "socket operation on non-socket"}, + {39, "EDESTADDRREQ", "destination address required"}, + {40, "EMSGSIZE", "message too long"}, + {41, "EPROTOTYPE", "protocol wrong type for socket"}, + {42, "ENOPROTOOPT", "protocol option not available"}, + {43, "EPROTONOSUPPORT", "protocol not supported"}, + {44, "ESOCKTNOSUPPORT", "socket type not supported"}, + {45, "EOPNOTSUPP", "operation not supported"}, + {46, "EPFNOSUPPORT", "protocol family not supported"}, + {47, "EAFNOSUPPORT", "address family not supported by protocol family"}, + {48, "EADDRINUSE", "address already in use"}, + {49, "EADDRNOTAVAIL", "can't assign requested address"}, + {50, "ENETDOWN", "network is down"}, + {51, "ENETUNREACH", "network is unreachable"}, + {52, "ENETRESET", "network dropped connection on reset"}, + {53, "ECONNABORTED", "software caused connection abort"}, + {54, "ECONNRESET", "connection reset by peer"}, + {55, "ENOBUFS", "no buffer space available"}, + {56, "EISCONN", "socket is already connected"}, + {57, "ENOTCONN", "socket is not connected"}, + {58, "ESHUTDOWN", "can't send after socket shutdown"}, + {59, "ETOOMANYREFS", "too many references: can't splice"}, + {60, "ETIMEDOUT", "connection timed out"}, + {61, "ECONNREFUSED", "connection refused"}, + {62, "ELOOP", "too many levels of symbolic links"}, + {63, "ENAMETOOLONG", "file name too long"}, + {64, "EHOSTDOWN", "host is down"}, + {65, "EHOSTUNREACH", "no route to host"}, + {66, "ENOTEMPTY", "directory not empty"}, + {67, "EPROCLIM", "too many processes"}, + {68, "EUSERS", "too many users"}, + {69, "EDQUOT", "disc quota exceeded"}, + {70, "ESTALE", "stale NFS file handle"}, + {71, "EREMOTE", "too many levels of remote in path"}, + {72, "EBADRPC", "RPC struct is bad"}, + {73, "ERPCMISMATCH", "RPC version wrong"}, + {74, "EPROGUNAVAIL", "RPC prog. not avail"}, + {75, "EPROGMISMATCH", "program version wrong"}, + {76, "EPROCUNAVAIL", "bad procedure for program"}, + {77, "ENOLCK", "no locks available"}, + {78, "ENOSYS", "function not implemented"}, + {79, "EFTYPE", "inappropriate file type or format"}, + {80, "EAUTH", "authentication error"}, + {81, "ENEEDAUTH", "need authenticator"}, + {82, "EIDRM", "identifier removed"}, + {83, "ENOMSG", "no message of desired type"}, + {84, "EOVERFLOW", "value too large to be stored in data type"}, + {85, "EILSEQ", "illegal byte sequence"}, + {86, "ENOTSUP", "not supported"}, + {87, "ECANCELED", "operation Canceled"}, + {88, "EBADMSG", "bad or Corrupt message"}, + {89, "ENODATA", "no message available"}, + {90, "ENOSR", "no STREAM resources"}, + {91, "ENOSTR", "not a STREAM"}, + {92, "ETIME", "STREAM ioctl timeout"}, + {93, "ENOATTR", "attribute not found"}, + {94, "EMULTIHOP", "multihop attempted"}, + {95, "ENOLINK", "link has been severed"}, + {96, "ELAST", "protocol error"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/BPT trap"}, + {6, "SIGIOT", "abort trap"}, + {7, "SIGEMT", "EMT trap"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGBUS", "bus error"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGSYS", "bad system call"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGURG", "urgent I/O condition"}, + {17, "SIGSTOP", "stopped (signal)"}, + {18, "SIGTSTP", "stopped"}, + {19, "SIGCONT", "continued"}, + {20, "SIGCHLD", "child exited"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGIO", "I/O possible"}, + {24, "SIGXCPU", "cputime limit exceeded"}, + {25, "SIGXFSZ", "filesize limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window size changes"}, + {29, "SIGINFO", "information request"}, + {30, "SIGUSR1", "user defined signal 1"}, + {31, "SIGUSR2", "user defined signal 2"}, + {32, "SIGPWR", "power fail/restart"}, +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go new file mode 100644 index 00000000..92185e69 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go @@ -0,0 +1,1762 @@ +// mkerrors.sh -m64 +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,netbsd + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m64 _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_ARP = 0x1c + AF_BLUETOOTH = 0x1f + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x20 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x18 + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x23 + AF_MPLS = 0x21 + AF_NATM = 0x1b + AF_NS = 0x6 + AF_OROUTE = 0x11 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x22 + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + ARPHRD_ARCNET = 0x7 + ARPHRD_ETHER = 0x1 + ARPHRD_FRELAY = 0xf + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_STRIP = 0x17 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B460800 = 0x70800 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B921600 = 0xe1000 + B9600 = 0x2580 + BIOCFEEDBACK = 0x8004427d + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc0104277 + BIOCGETIF = 0x4090426b + BIOCGFEEDBACK = 0x4004427c + BIOCGHDRCMPLT = 0x40044274 + BIOCGRTIMEOUT = 0x4010427b + BIOCGSEESENT = 0x40044278 + BIOCGSTATS = 0x4080426f + BIOCGSTATSOLD = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDLT = 0x80044276 + BIOCSETF = 0x80104267 + BIOCSETIF = 0x8090426c + BIOCSFEEDBACK = 0x8004427d + BIOCSHDRCMPLT = 0x80044275 + BIOCSRTIMEOUT = 0x8010427a + BIOCSSEESENT = 0x80044279 + BIOCSTCPF = 0x80104272 + BIOCSUDPF = 0x80104273 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x8 + BPF_ALIGNMENT32 = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DFLTBUFSIZE = 0x100000 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x1000000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + CFLUSH = 0xf + CLOCAL = 0x8000 + CLONE_CSIGNAL = 0xff + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_PID = 0x1000 + CLONE_PTRACE = 0x2000 + CLONE_SIGHAND = 0x800 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CREAD = 0x800 + CRTSCTS = 0x10000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_HW = 0x6 + CTL_KERN = 0x1 + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + CTL_QUERY = -0x2 + DIOCBSFLUSH = 0x20006478 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_HDLC = 0x10 + DLT_HHDLC = 0x79 + DLT_HIPPI = 0xf + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPNET = 0xe2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0xe + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PRISM_HEADER = 0x77 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RAWAF_MASK = 0x2240000 + DLT_RIO = 0x7c + DLT_SCCP = 0x8e + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xd + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_WIHART = 0xdf + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EMUL_LINUX = 0x1 + EMUL_LINUX32 = 0x5 + EMUL_MAXID = 0x6 + ETHERCAP_JUMBO_MTU = 0x4 + ETHERCAP_VLAN_HWTAGGING = 0x2 + ETHERCAP_VLAN_MTU = 0x1 + ETHERMIN = 0x2e + ETHERMTU = 0x5dc + ETHERMTU_JUMBO = 0x2328 + ETHERTYPE_8023 = 0x4 + ETHERTYPE_AARP = 0x80f3 + ETHERTYPE_ACCTON = 0x8390 + ETHERTYPE_AEONIC = 0x8036 + ETHERTYPE_ALPHA = 0x814a + ETHERTYPE_AMBER = 0x6008 + ETHERTYPE_AMOEBA = 0x8145 + ETHERTYPE_APOLLO = 0x80f7 + ETHERTYPE_APOLLODOMAIN = 0x8019 + ETHERTYPE_APPLETALK = 0x809b + ETHERTYPE_APPLITEK = 0x80c7 + ETHERTYPE_ARGONAUT = 0x803a + ETHERTYPE_ARP = 0x806 + ETHERTYPE_AT = 0x809b + ETHERTYPE_ATALK = 0x809b + ETHERTYPE_ATOMIC = 0x86df + ETHERTYPE_ATT = 0x8069 + ETHERTYPE_ATTSTANFORD = 0x8008 + ETHERTYPE_AUTOPHON = 0x806a + ETHERTYPE_AXIS = 0x8856 + ETHERTYPE_BCLOOP = 0x9003 + ETHERTYPE_BOFL = 0x8102 + ETHERTYPE_CABLETRON = 0x7034 + ETHERTYPE_CHAOS = 0x804 + ETHERTYPE_COMDESIGN = 0x806c + ETHERTYPE_COMPUGRAPHIC = 0x806d + ETHERTYPE_COUNTERPOINT = 0x8062 + ETHERTYPE_CRONUS = 0x8004 + ETHERTYPE_CRONUSVLN = 0x8003 + ETHERTYPE_DCA = 0x1234 + ETHERTYPE_DDE = 0x807b + ETHERTYPE_DEBNI = 0xaaaa + ETHERTYPE_DECAM = 0x8048 + ETHERTYPE_DECCUST = 0x6006 + ETHERTYPE_DECDIAG = 0x6005 + ETHERTYPE_DECDNS = 0x803c + ETHERTYPE_DECDTS = 0x803e + ETHERTYPE_DECEXPER = 0x6000 + ETHERTYPE_DECLAST = 0x8041 + ETHERTYPE_DECLTM = 0x803f + ETHERTYPE_DECMUMPS = 0x6009 + ETHERTYPE_DECNETBIOS = 0x8040 + ETHERTYPE_DELTACON = 0x86de + ETHERTYPE_DIDDLE = 0x4321 + ETHERTYPE_DLOG1 = 0x660 + ETHERTYPE_DLOG2 = 0x661 + ETHERTYPE_DN = 0x6003 + ETHERTYPE_DOGFIGHT = 0x1989 + ETHERTYPE_DSMD = 0x8039 + ETHERTYPE_ECMA = 0x803 + ETHERTYPE_ENCRYPT = 0x803d + ETHERTYPE_ES = 0x805d + ETHERTYPE_EXCELAN = 0x8010 + ETHERTYPE_EXPERDATA = 0x8049 + ETHERTYPE_FLIP = 0x8146 + ETHERTYPE_FLOWCONTROL = 0x8808 + ETHERTYPE_FRARP = 0x808 + ETHERTYPE_GENDYN = 0x8068 + ETHERTYPE_HAYES = 0x8130 + ETHERTYPE_HIPPI_FP = 0x8180 + ETHERTYPE_HITACHI = 0x8820 + ETHERTYPE_HP = 0x8005 + ETHERTYPE_IEEEPUP = 0xa00 + ETHERTYPE_IEEEPUPAT = 0xa01 + ETHERTYPE_IMLBL = 0x4c42 + ETHERTYPE_IMLBLDIAG = 0x424c + ETHERTYPE_IP = 0x800 + ETHERTYPE_IPAS = 0x876c + ETHERTYPE_IPV6 = 0x86dd + ETHERTYPE_IPX = 0x8137 + ETHERTYPE_IPXNEW = 0x8037 + ETHERTYPE_KALPANA = 0x8582 + ETHERTYPE_LANBRIDGE = 0x8038 + ETHERTYPE_LANPROBE = 0x8888 + ETHERTYPE_LAT = 0x6004 + ETHERTYPE_LBACK = 0x9000 + ETHERTYPE_LITTLE = 0x8060 + ETHERTYPE_LOGICRAFT = 0x8148 + ETHERTYPE_LOOPBACK = 0x9000 + ETHERTYPE_MATRA = 0x807a + ETHERTYPE_MAX = 0xffff + ETHERTYPE_MERIT = 0x807c + ETHERTYPE_MICP = 0x873a + ETHERTYPE_MOPDL = 0x6001 + ETHERTYPE_MOPRC = 0x6002 + ETHERTYPE_MOTOROLA = 0x818d + ETHERTYPE_MPLS = 0x8847 + ETHERTYPE_MPLS_MCAST = 0x8848 + ETHERTYPE_MUMPS = 0x813f + ETHERTYPE_NBPCC = 0x3c04 + ETHERTYPE_NBPCLAIM = 0x3c09 + ETHERTYPE_NBPCLREQ = 0x3c05 + ETHERTYPE_NBPCLRSP = 0x3c06 + ETHERTYPE_NBPCREQ = 0x3c02 + ETHERTYPE_NBPCRSP = 0x3c03 + ETHERTYPE_NBPDG = 0x3c07 + ETHERTYPE_NBPDGB = 0x3c08 + ETHERTYPE_NBPDLTE = 0x3c0a + ETHERTYPE_NBPRAR = 0x3c0c + ETHERTYPE_NBPRAS = 0x3c0b + ETHERTYPE_NBPRST = 0x3c0d + ETHERTYPE_NBPSCD = 0x3c01 + ETHERTYPE_NBPVCD = 0x3c00 + ETHERTYPE_NBS = 0x802 + ETHERTYPE_NCD = 0x8149 + ETHERTYPE_NESTAR = 0x8006 + ETHERTYPE_NETBEUI = 0x8191 + ETHERTYPE_NOVELL = 0x8138 + ETHERTYPE_NS = 0x600 + ETHERTYPE_NSAT = 0x601 + ETHERTYPE_NSCOMPAT = 0x807 + ETHERTYPE_NTRAILER = 0x10 + ETHERTYPE_OS9 = 0x7007 + ETHERTYPE_OS9NET = 0x7009 + ETHERTYPE_PACER = 0x80c6 + ETHERTYPE_PAE = 0x888e + ETHERTYPE_PCS = 0x4242 + ETHERTYPE_PLANNING = 0x8044 + ETHERTYPE_PPP = 0x880b + ETHERTYPE_PPPOE = 0x8864 + ETHERTYPE_PPPOEDISC = 0x8863 + ETHERTYPE_PRIMENTS = 0x7031 + ETHERTYPE_PUP = 0x200 + ETHERTYPE_PUPAT = 0x200 + ETHERTYPE_RACAL = 0x7030 + ETHERTYPE_RATIONAL = 0x8150 + ETHERTYPE_RAWFR = 0x6559 + ETHERTYPE_RCL = 0x1995 + ETHERTYPE_RDP = 0x8739 + ETHERTYPE_RETIX = 0x80f2 + ETHERTYPE_REVARP = 0x8035 + ETHERTYPE_SCA = 0x6007 + ETHERTYPE_SECTRA = 0x86db + ETHERTYPE_SECUREDATA = 0x876d + ETHERTYPE_SGITW = 0x817e + ETHERTYPE_SG_BOUNCE = 0x8016 + ETHERTYPE_SG_DIAG = 0x8013 + ETHERTYPE_SG_NETGAMES = 0x8014 + ETHERTYPE_SG_RESV = 0x8015 + ETHERTYPE_SIMNET = 0x5208 + ETHERTYPE_SLOWPROTOCOLS = 0x8809 + ETHERTYPE_SNA = 0x80d5 + ETHERTYPE_SNMP = 0x814c + ETHERTYPE_SONIX = 0xfaf5 + ETHERTYPE_SPIDER = 0x809f + ETHERTYPE_SPRITE = 0x500 + ETHERTYPE_STP = 0x8181 + ETHERTYPE_TALARIS = 0x812b + ETHERTYPE_TALARISMC = 0x852b + ETHERTYPE_TCPCOMP = 0x876b + ETHERTYPE_TCPSM = 0x9002 + ETHERTYPE_TEC = 0x814f + ETHERTYPE_TIGAN = 0x802f + ETHERTYPE_TRAIL = 0x1000 + ETHERTYPE_TRANSETHER = 0x6558 + ETHERTYPE_TYMSHARE = 0x802e + ETHERTYPE_UBBST = 0x7005 + ETHERTYPE_UBDEBUG = 0x900 + ETHERTYPE_UBDIAGLOOP = 0x7002 + ETHERTYPE_UBDL = 0x7000 + ETHERTYPE_UBNIU = 0x7001 + ETHERTYPE_UBNMC = 0x7003 + ETHERTYPE_VALID = 0x1600 + ETHERTYPE_VARIAN = 0x80dd + ETHERTYPE_VAXELN = 0x803b + ETHERTYPE_VEECO = 0x8067 + ETHERTYPE_VEXP = 0x805b + ETHERTYPE_VGLAB = 0x8131 + ETHERTYPE_VINES = 0xbad + ETHERTYPE_VINESECHO = 0xbaf + ETHERTYPE_VINESLOOP = 0xbae + ETHERTYPE_VITAL = 0xff00 + ETHERTYPE_VLAN = 0x8100 + ETHERTYPE_VLTLMAN = 0x8080 + ETHERTYPE_VPROD = 0x805c + ETHERTYPE_VURESERVED = 0x8147 + ETHERTYPE_WATERLOO = 0x8130 + ETHERTYPE_WELLFLEET = 0x8103 + ETHERTYPE_X25 = 0x805 + ETHERTYPE_X75 = 0x801 + ETHERTYPE_XNSSM = 0x9001 + ETHERTYPE_XTP = 0x817d + ETHER_ADDR_LEN = 0x6 + ETHER_CRC_LEN = 0x4 + ETHER_CRC_POLY_BE = 0x4c11db6 + ETHER_CRC_POLY_LE = 0xedb88320 + ETHER_HDR_LEN = 0xe + ETHER_MAX_LEN = 0x5ee + ETHER_MAX_LEN_JUMBO = 0x233a + ETHER_MIN_LEN = 0x40 + ETHER_PPPOE_ENCAP_LEN = 0x8 + ETHER_TYPE_LEN = 0x2 + ETHER_VLAN_ENCAP_LEN = 0x4 + EVFILT_AIO = 0x2 + EVFILT_PROC = 0x4 + EVFILT_READ = 0x0 + EVFILT_SIGNAL = 0x5 + EVFILT_SYSCOUNT = 0x7 + EVFILT_TIMER = 0x6 + EVFILT_VNODE = 0x3 + EVFILT_WRITE = 0x1 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTATTR_CMD_START = 0x1 + EXTATTR_CMD_STOP = 0x2 + EXTATTR_NAMESPACE_SYSTEM = 0x2 + EXTATTR_NAMESPACE_USER = 0x1 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x100 + FLUSHO = 0x800000 + F_CLOSEM = 0xa + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0xc + F_FSCTL = -0x80000000 + F_FSDIRMASK = 0x70000000 + F_FSIN = 0x10000000 + F_FSINOUT = 0x30000000 + F_FSOUT = 0x20000000 + F_FSPRIV = 0x8000 + F_FSVOID = 0x40000000 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETNOSIGPIPE = 0xd + F_GETOWN = 0x5 + F_MAXFD = 0xb + F_OK = 0x0 + F_PARAM_MASK = 0xfff + F_PARAM_MAX = 0xfff + F_RDLCK = 0x1 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETNOSIGPIPE = 0xe + F_SETOWN = 0x6 + F_UNLCK = 0x2 + F_WRLCK = 0x3 + HUPCL = 0x4000 + HW_MACHINE = 0x1 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFAN_ARRIVAL = 0x0 + IFAN_DEPARTURE = 0x1 + IFA_ROUTE = 0x1 + IFF_ALLMULTI = 0x200 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x8f52 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NOTRAILERS = 0x20 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BRIDGE = 0xd1 + IFT_BSC = 0x53 + IFT_CARP = 0xf8 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DOCSCABLEUPSTREAMCHANNEL = 0xcd + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ECONET = 0xce + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAITH = 0xf2 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE1394 = 0x90 + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_INFINIBAND = 0xc7 + IFT_INTERLEAVE = 0x7c + IFT_IP = 0x7e + IFT_IPFORWARD = 0x8e + IFT_IPOVERATM = 0x72 + IFT_IPOVERCDLC = 0x6d + IFT_IPOVERCLAW = 0x6e + IFT_IPSWITCH = 0x4e + IFT_ISDN = 0x3f + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISDNS = 0x4b + IFT_ISDNU = 0x4c + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88025CRFPINT = 0x62 + IFT_ISO88025DTR = 0x56 + IFT_ISO88025FIBER = 0x73 + IFT_ISO88026 = 0xa + IFT_ISUP = 0xb3 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_L3IPXVLAN = 0x89 + IFT_LAPB = 0x10 + IFT_LAPD = 0x4d + IFT_LAPF = 0x77 + IFT_LINEGROUP = 0xd2 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf5 + IFT_PFSYNC = 0xf6 + IFT_PLC = 0xae + IFT_PON155 = 0xcf + IFT_PON622 = 0xd0 + IFT_POS = 0xab + IFT_PPP = 0x17 + IFT_PPPMULTILINKBUNDLE = 0x6c + IFT_PROPATM = 0xc5 + IFT_PROPBWAP2MP = 0xb8 + IFT_PROPCNLS = 0x59 + IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 + IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 + IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PROPWIRELESSP2P = 0x9d + IFT_PTPSERIAL = 0x16 + IFT_PVC = 0xf1 + IFT_Q2931 = 0xc9 + IFT_QLLC = 0x44 + IFT_RADIOMAC = 0xbc + IFT_RADSL = 0x5f + IFT_REACHDSL = 0xc0 + IFT_RFC1483 = 0x9f + IFT_RS232 = 0x21 + IFT_RSRB = 0x4f + IFT_SDLC = 0x11 + IFT_SDSL = 0x60 + IFT_SHDSL = 0xa9 + IFT_SIP = 0x1f + IFT_SIPSIG = 0xcc + IFT_SIPTG = 0xcb + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETOVERHEADCHANNEL = 0xb9 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_SRP = 0x97 + IFT_SS7SIGLINK = 0x9c + IFT_STACKTOSTACK = 0x6f + IFT_STARLAN = 0xb + IFT_STF = 0xd7 + IFT_T1 = 0x12 + IFT_TDLC = 0x74 + IFT_TELINK = 0xc8 + IFT_TERMPAD = 0x5b + IFT_TR008 = 0xb0 + IFT_TRANSPHDLC = 0x7b + IFT_TUNNEL = 0x83 + IFT_ULTRA = 0x1d + IFT_USB = 0xa0 + IFT_V11 = 0x40 + IFT_V35 = 0x2d + IFT_V36 = 0x41 + IFT_V37 = 0x78 + IFT_VDSL = 0x61 + IFT_VIRTUALIPADDRESS = 0x70 + IFT_VIRTUALTG = 0xca + IFT_VOICEDID = 0xd5 + IFT_VOICEEM = 0x64 + IFT_VOICEEMFGD = 0xd3 + IFT_VOICEENCAP = 0x67 + IFT_VOICEFGDEANA = 0xd4 + IFT_VOICEFXO = 0x65 + IFT_VOICEFXS = 0x66 + IFT_VOICEOVERATM = 0x98 + IFT_VOICEOVERCABLE = 0xc6 + IFT_VOICEOVERFRAMERELAY = 0x99 + IFT_VOICEOVERIP = 0x68 + IFT_X213 = 0x5d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25HUNTGROUP = 0x7a + IFT_X25MLP = 0x79 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IPPROTO_AH = 0x33 + IPPROTO_CARP = 0x70 + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPIP = 0x4 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IPV6_ICMP = 0x3a + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x34 + IPPROTO_MOBILE = 0x37 + IPPROTO_NONE = 0x3b + IPPROTO_PFSYNC = 0xf0 + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_VRRP = 0x70 + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FRAGTTL = 0x78 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXPACKET = 0xffff + IPV6_MMTU = 0x500 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_PATHMTU = 0x2c + IPV6_PKTINFO = 0x2e + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0xd + IP_EF = 0x8000 + IP_ERRORMTU = 0x15 + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x16 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINFRAGSIZE = 0x45 + IP_MINTTL = 0x18 + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x1 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVTTL = 0x17 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_TOS = 0x3 + IP_TTL = 0x4 + ISIG = 0x80 + ISTRIP = 0x20 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + KERN_HOSTNAME = 0xa + KERN_OSRELEASE = 0x2 + KERN_OSTYPE = 0x1 + KERN_VERSION = 0x4 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x6 + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_SPACEAVAIL = 0x5 + MADV_WILLNEED = 0x3 + MAP_ALIGNMENT_16MB = 0x18000000 + MAP_ALIGNMENT_1TB = 0x28000000 + MAP_ALIGNMENT_256TB = 0x30000000 + MAP_ALIGNMENT_4GB = 0x20000000 + MAP_ALIGNMENT_64KB = 0x10000000 + MAP_ALIGNMENT_64PB = 0x38000000 + MAP_ALIGNMENT_MASK = -0x1000000 + MAP_ALIGNMENT_SHIFT = 0x18 + MAP_ANON = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_INHERIT = 0x80 + MAP_INHERIT_COPY = 0x1 + MAP_INHERIT_DEFAULT = 0x1 + MAP_INHERIT_DONATE_COPY = 0x3 + MAP_INHERIT_NONE = 0x2 + MAP_INHERIT_SHARE = 0x0 + MAP_NORESERVE = 0x40 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_SHARED = 0x1 + MAP_STACK = 0x2000 + MAP_TRYFIXED = 0x400 + MAP_WIRED = 0x800 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MNT_ASYNC = 0x40 + MNT_BASIC_FLAGS = 0xe782807f + MNT_DEFEXPORTED = 0x200 + MNT_DISCARD = 0x800000 + MNT_EXKERB = 0x800 + MNT_EXNORESPORT = 0x8000000 + MNT_EXPORTANON = 0x400 + MNT_EXPORTED = 0x100 + MNT_EXPUBLIC = 0x10000000 + MNT_EXRDONLY = 0x80 + MNT_EXTATTR = 0x1000000 + MNT_FORCE = 0x80000 + MNT_GETARGS = 0x400000 + MNT_IGNORE = 0x100000 + MNT_LAZY = 0x3 + MNT_LOCAL = 0x1000 + MNT_LOG = 0x2000000 + MNT_NOATIME = 0x4000000 + MNT_NOCOREDUMP = 0x8000 + MNT_NODEV = 0x10 + MNT_NODEVMTIME = 0x40000000 + MNT_NOEXEC = 0x4 + MNT_NOSUID = 0x8 + MNT_NOWAIT = 0x2 + MNT_OP_FLAGS = 0x4d0000 + MNT_QUOTA = 0x2000 + MNT_RDONLY = 0x1 + MNT_RELATIME = 0x20000 + MNT_RELOAD = 0x40000 + MNT_ROOTFS = 0x4000 + MNT_SOFTDEP = 0x80000000 + MNT_SYMPERM = 0x20000000 + MNT_SYNCHRONOUS = 0x2 + MNT_UNION = 0x20 + MNT_UPDATE = 0x10000 + MNT_VISFLAGMASK = 0xff90ffff + MNT_WAIT = 0x1 + MSG_BCAST = 0x100 + MSG_CMSG_CLOEXEC = 0x800 + MSG_CONTROLMBUF = 0x2000000 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOR = 0x8 + MSG_IOVUSRSPACE = 0x4000000 + MSG_LENUSRSPACE = 0x8000000 + MSG_MCAST = 0x200 + MSG_NAMEMBUF = 0x1000000 + MSG_NBIO = 0x1000 + MSG_NOSIGNAL = 0x400 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_USERFLAGS = 0xffffff + MSG_WAITALL = 0x40 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x2 + MS_SYNC = 0x4 + NAME_MAX = 0x1ff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x5 + NET_RT_MAXID = 0x6 + NET_RT_OIFLIST = 0x4 + NET_RT_OOIFLIST = 0x3 + NOFLSH = 0x80000000 + NOTE_ATTRIB = 0x8 + NOTE_CHILD = 0x4 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXTEND = 0x4 + NOTE_FORK = 0x40000000 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_PCTRLMASK = 0xf0000000 + NOTE_PDATAMASK = 0xfffff + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + OFIOGETBMAP = 0xc004667a + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_ALT_IO = 0x40000 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x400000 + O_CREAT = 0x200 + O_DIRECT = 0x80000 + O_DIRECTORY = 0x200000 + O_DSYNC = 0x10000 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_NOSIGPIPE = 0x1000000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x20000 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PRI_IOFLUSH = 0x7c + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + RLIMIT_AS = 0xa + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_MEMLOCK = 0x6 + RLIMIT_NOFILE = 0x8 + RLIMIT_NPROC = 0x7 + RLIMIT_RSS = 0x5 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x9 + RTAX_NETMASK = 0x2 + RTAX_TAG = 0x8 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTA_TAG = 0x100 + RTF_ANNOUNCE = 0x20000 + RTF_BLACKHOLE = 0x1000 + RTF_CLONED = 0x2000 + RTF_CLONING = 0x100 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_LLINFO = 0x400 + RTF_MASK = 0x80 + RTF_MODIFIED = 0x20 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_REJECT = 0x8 + RTF_SRC = 0x10000 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_CHGADDR = 0x15 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_GET = 0x4 + RTM_IEEE80211 = 0x11 + RTM_IFANNOUNCE = 0x10 + RTM_IFINFO = 0x14 + RTM_LLINFO_UPD = 0x13 + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_OIFINFO = 0xf + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + RTM_OOIFINFO = 0xe + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_SETGATE = 0x12 + RTM_VERSION = 0x4 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + SCM_CREDS = 0x4 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x8 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80906931 + SIOCADDRT = 0x8038720a + SIOCAIFADDR = 0x8040691a + SIOCALIFADDR = 0x8118691c + SIOCATMARK = 0x40047307 + SIOCDELMULTI = 0x80906932 + SIOCDELRT = 0x8038720b + SIOCDIFADDR = 0x80906919 + SIOCDIFPHYADDR = 0x80906949 + SIOCDLIFADDR = 0x8118691e + SIOCGDRVSPEC = 0xc028697b + SIOCGETPFSYNC = 0xc09069f8 + SIOCGETSGCNT = 0xc0207534 + SIOCGETVIFCNT = 0xc0287533 + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0906921 + SIOCGIFADDRPREF = 0xc0986920 + SIOCGIFALIAS = 0xc040691b + SIOCGIFBRDADDR = 0xc0906923 + SIOCGIFCAP = 0xc0206976 + SIOCGIFCONF = 0xc0106926 + SIOCGIFDATA = 0xc0986985 + SIOCGIFDLT = 0xc0906977 + SIOCGIFDSTADDR = 0xc0906922 + SIOCGIFFLAGS = 0xc0906911 + SIOCGIFGENERIC = 0xc090693a + SIOCGIFMEDIA = 0xc0306936 + SIOCGIFMETRIC = 0xc0906917 + SIOCGIFMTU = 0xc090697e + SIOCGIFNETMASK = 0xc0906925 + SIOCGIFPDSTADDR = 0xc0906948 + SIOCGIFPSRCADDR = 0xc0906947 + SIOCGLIFADDR = 0xc118691d + SIOCGLIFPHYADDR = 0xc118694b + SIOCGLINKSTR = 0xc0286987 + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCGVH = 0xc0906983 + SIOCIFCREATE = 0x8090697a + SIOCIFDESTROY = 0x80906979 + SIOCIFGCLONERS = 0xc0106978 + SIOCINITIFADDR = 0xc0706984 + SIOCSDRVSPEC = 0x8028697b + SIOCSETPFSYNC = 0x809069f7 + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8090690c + SIOCSIFADDRPREF = 0x8098691f + SIOCSIFBRDADDR = 0x80906913 + SIOCSIFCAP = 0x80206975 + SIOCSIFDSTADDR = 0x8090690e + SIOCSIFFLAGS = 0x80906910 + SIOCSIFGENERIC = 0x80906939 + SIOCSIFMEDIA = 0xc0906935 + SIOCSIFMETRIC = 0x80906918 + SIOCSIFMTU = 0x8090697f + SIOCSIFNETMASK = 0x80906916 + SIOCSIFPHYADDR = 0x80406946 + SIOCSLIFPHYADDR = 0x8118694a + SIOCSLINKSTR = 0x80286988 + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SIOCSVH = 0xc0906982 + SIOCZIFDATA = 0xc0986986 + SOCK_CLOEXEC = 0x10000000 + SOCK_DGRAM = 0x2 + SOCK_FLAGS_MASK = 0xf0000000 + SOCK_NONBLOCK = 0x20000000 + SOCK_NOSIGPIPE = 0x40000000 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_ACCEPTFILTER = 0x1000 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_NOHEADER = 0x100a + SO_NOSIGPIPE = 0x800 + SO_OOBINLINE = 0x100 + SO_OVERFLOWED = 0x1009 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x100c + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x100b + SO_TIMESTAMP = 0x2000 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + SYSCTL_VERSION = 0x1000000 + SYSCTL_VERS_0 = 0x0 + SYSCTL_VERS_1 = 0x1000000 + SYSCTL_VERS_MASK = 0xff000000 + S_ARCH1 = 0x10000 + S_ARCH2 = 0x20000 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IFWHT = 0xe000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISTXT = 0x200 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + S_LOGIN_SET = 0x1 + TCIFLUSH = 0x1 + TCIOFLUSH = 0x3 + TCOFLUSH = 0x2 + TCP_CONGCTL = 0x20 + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x3 + TCP_KEEPINIT = 0x7 + TCP_KEEPINTVL = 0x5 + TCP_MAXBURST = 0x4 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0x10 + TCP_MINMSS = 0xd8 + TCP_MSS = 0x218 + TCP_NODELAY = 0x1 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDCDTIMESTAMP = 0x40107458 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLAG_CDTRCTS = 0x10 + TIOCFLAG_CLOCAL = 0x2 + TIOCFLAG_CRTSCTS = 0x4 + TIOCFLAG_MDMBUF = 0x8 + TIOCFLAG_SOFTCAR = 0x1 + TIOCFLUSH = 0x80047410 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGFLAGS = 0x4004745d + TIOCGLINED = 0x40207442 + TIOCGPGRP = 0x40047477 + TIOCGQSIZE = 0x40047481 + TIOCGRANTPT = 0x20007447 + TIOCGSID = 0x40047463 + TIOCGSIZE = 0x40087468 + TIOCGWINSZ = 0x40087468 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGET = 0x4004746a + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCPTMGET = 0x40287446 + TIOCPTSNAME = 0x40287448 + TIOCRCVFRAME = 0x80087445 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSFLAGS = 0x8004745c + TIOCSIG = 0x2000745f + TIOCSLINED = 0x80207443 + TIOCSPGRP = 0x80047476 + TIOCSQSIZE = 0x80047480 + TIOCSSIZE = 0x80087467 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x80047465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCUCNTL = 0x80047466 + TIOCXMTFRAME = 0x80087444 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WALL = 0x8 + WALLSIG = 0x8 + WALTSIG = 0x4 + WCLONE = 0x4 + WCOREFLAG = 0x80 + WNOHANG = 0x1 + WNOWAIT = 0x10000 + WNOZOMBIE = 0x20000 + WOPTSCHECKED = 0x40000 + WSTOPPED = 0x7f + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADF = syscall.Errno(0x9) + EBADMSG = syscall.Errno(0x58) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x57) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDOM = syscall.Errno(0x21) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x52) + EILSEQ = syscall.Errno(0x55) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x60) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5e) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x5d) + ENOBUFS = syscall.Errno(0x37) + ENODATA = syscall.Errno(0x59) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x5f) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x53) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x5a) + ENOSTR = syscall.Errno(0x5b) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x56) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x54) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTO = syscall.Errno(0x60) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIME = syscall.Errno(0x5c) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGPWR = syscall.Signal(0x20) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "device not configured"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EDEADLK", "resource deadlock avoided"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "cross-device link"}, + {19, "ENODEV", "operation not supported by device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "result too large or too small"}, + {35, "EAGAIN", "resource temporarily unavailable"}, + {36, "EINPROGRESS", "operation now in progress"}, + {37, "EALREADY", "operation already in progress"}, + {38, "ENOTSOCK", "socket operation on non-socket"}, + {39, "EDESTADDRREQ", "destination address required"}, + {40, "EMSGSIZE", "message too long"}, + {41, "EPROTOTYPE", "protocol wrong type for socket"}, + {42, "ENOPROTOOPT", "protocol option not available"}, + {43, "EPROTONOSUPPORT", "protocol not supported"}, + {44, "ESOCKTNOSUPPORT", "socket type not supported"}, + {45, "EOPNOTSUPP", "operation not supported"}, + {46, "EPFNOSUPPORT", "protocol family not supported"}, + {47, "EAFNOSUPPORT", "address family not supported by protocol family"}, + {48, "EADDRINUSE", "address already in use"}, + {49, "EADDRNOTAVAIL", "can't assign requested address"}, + {50, "ENETDOWN", "network is down"}, + {51, "ENETUNREACH", "network is unreachable"}, + {52, "ENETRESET", "network dropped connection on reset"}, + {53, "ECONNABORTED", "software caused connection abort"}, + {54, "ECONNRESET", "connection reset by peer"}, + {55, "ENOBUFS", "no buffer space available"}, + {56, "EISCONN", "socket is already connected"}, + {57, "ENOTCONN", "socket is not connected"}, + {58, "ESHUTDOWN", "can't send after socket shutdown"}, + {59, "ETOOMANYREFS", "too many references: can't splice"}, + {60, "ETIMEDOUT", "connection timed out"}, + {61, "ECONNREFUSED", "connection refused"}, + {62, "ELOOP", "too many levels of symbolic links"}, + {63, "ENAMETOOLONG", "file name too long"}, + {64, "EHOSTDOWN", "host is down"}, + {65, "EHOSTUNREACH", "no route to host"}, + {66, "ENOTEMPTY", "directory not empty"}, + {67, "EPROCLIM", "too many processes"}, + {68, "EUSERS", "too many users"}, + {69, "EDQUOT", "disc quota exceeded"}, + {70, "ESTALE", "stale NFS file handle"}, + {71, "EREMOTE", "too many levels of remote in path"}, + {72, "EBADRPC", "RPC struct is bad"}, + {73, "ERPCMISMATCH", "RPC version wrong"}, + {74, "EPROGUNAVAIL", "RPC prog. not avail"}, + {75, "EPROGMISMATCH", "program version wrong"}, + {76, "EPROCUNAVAIL", "bad procedure for program"}, + {77, "ENOLCK", "no locks available"}, + {78, "ENOSYS", "function not implemented"}, + {79, "EFTYPE", "inappropriate file type or format"}, + {80, "EAUTH", "authentication error"}, + {81, "ENEEDAUTH", "need authenticator"}, + {82, "EIDRM", "identifier removed"}, + {83, "ENOMSG", "no message of desired type"}, + {84, "EOVERFLOW", "value too large to be stored in data type"}, + {85, "EILSEQ", "illegal byte sequence"}, + {86, "ENOTSUP", "not supported"}, + {87, "ECANCELED", "operation Canceled"}, + {88, "EBADMSG", "bad or Corrupt message"}, + {89, "ENODATA", "no message available"}, + {90, "ENOSR", "no STREAM resources"}, + {91, "ENOSTR", "not a STREAM"}, + {92, "ETIME", "STREAM ioctl timeout"}, + {93, "ENOATTR", "attribute not found"}, + {94, "EMULTIHOP", "multihop attempted"}, + {95, "ENOLINK", "link has been severed"}, + {96, "ELAST", "protocol error"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/BPT trap"}, + {6, "SIGIOT", "abort trap"}, + {7, "SIGEMT", "EMT trap"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGBUS", "bus error"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGSYS", "bad system call"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGURG", "urgent I/O condition"}, + {17, "SIGSTOP", "stopped (signal)"}, + {18, "SIGTSTP", "stopped"}, + {19, "SIGCONT", "continued"}, + {20, "SIGCHLD", "child exited"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGIO", "I/O possible"}, + {24, "SIGXCPU", "cputime limit exceeded"}, + {25, "SIGXFSZ", "filesize limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window size changes"}, + {29, "SIGINFO", "information request"}, + {30, "SIGUSR1", "user defined signal 1"}, + {31, "SIGUSR2", "user defined signal 2"}, + {32, "SIGPWR", "power fail/restart"}, +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go new file mode 100644 index 00000000..373ad454 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go @@ -0,0 +1,1751 @@ +// mkerrors.sh -marm +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm,netbsd + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -marm _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_ARP = 0x1c + AF_BLUETOOTH = 0x1f + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x20 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x18 + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x23 + AF_MPLS = 0x21 + AF_NATM = 0x1b + AF_NS = 0x6 + AF_OROUTE = 0x11 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x22 + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + ARPHRD_ARCNET = 0x7 + ARPHRD_ETHER = 0x1 + ARPHRD_FRELAY = 0xf + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_STRIP = 0x17 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B460800 = 0x70800 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B921600 = 0xe1000 + B9600 = 0x2580 + BIOCFEEDBACK = 0x8004427d + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc0084277 + BIOCGETIF = 0x4090426b + BIOCGFEEDBACK = 0x4004427c + BIOCGHDRCMPLT = 0x40044274 + BIOCGRTIMEOUT = 0x400c427b + BIOCGSEESENT = 0x40044278 + BIOCGSTATS = 0x4080426f + BIOCGSTATSOLD = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDLT = 0x80044276 + BIOCSETF = 0x80084267 + BIOCSETIF = 0x8090426c + BIOCSFEEDBACK = 0x8004427d + BIOCSHDRCMPLT = 0x80044275 + BIOCSRTIMEOUT = 0x800c427a + BIOCSSEESENT = 0x80044279 + BIOCSTCPF = 0x80084272 + BIOCSUDPF = 0x80084273 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALIGNMENT32 = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DFLTBUFSIZE = 0x100000 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x1000000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + CFLUSH = 0xf + CLOCAL = 0x8000 + CREAD = 0x800 + CRTSCTS = 0x10000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_HW = 0x6 + CTL_KERN = 0x1 + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + CTL_QUERY = -0x2 + DIOCBSFLUSH = 0x20006478 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_HDLC = 0x10 + DLT_HHDLC = 0x79 + DLT_HIPPI = 0xf + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPNET = 0xe2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0xe + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PRISM_HEADER = 0x77 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RAWAF_MASK = 0x2240000 + DLT_RIO = 0x7c + DLT_SCCP = 0x8e + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xd + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_WIHART = 0xdf + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EMUL_LINUX = 0x1 + EMUL_LINUX32 = 0x5 + EMUL_MAXID = 0x6 + ETHERCAP_JUMBO_MTU = 0x4 + ETHERCAP_VLAN_HWTAGGING = 0x2 + ETHERCAP_VLAN_MTU = 0x1 + ETHERMIN = 0x2e + ETHERMTU = 0x5dc + ETHERMTU_JUMBO = 0x2328 + ETHERTYPE_8023 = 0x4 + ETHERTYPE_AARP = 0x80f3 + ETHERTYPE_ACCTON = 0x8390 + ETHERTYPE_AEONIC = 0x8036 + ETHERTYPE_ALPHA = 0x814a + ETHERTYPE_AMBER = 0x6008 + ETHERTYPE_AMOEBA = 0x8145 + ETHERTYPE_APOLLO = 0x80f7 + ETHERTYPE_APOLLODOMAIN = 0x8019 + ETHERTYPE_APPLETALK = 0x809b + ETHERTYPE_APPLITEK = 0x80c7 + ETHERTYPE_ARGONAUT = 0x803a + ETHERTYPE_ARP = 0x806 + ETHERTYPE_AT = 0x809b + ETHERTYPE_ATALK = 0x809b + ETHERTYPE_ATOMIC = 0x86df + ETHERTYPE_ATT = 0x8069 + ETHERTYPE_ATTSTANFORD = 0x8008 + ETHERTYPE_AUTOPHON = 0x806a + ETHERTYPE_AXIS = 0x8856 + ETHERTYPE_BCLOOP = 0x9003 + ETHERTYPE_BOFL = 0x8102 + ETHERTYPE_CABLETRON = 0x7034 + ETHERTYPE_CHAOS = 0x804 + ETHERTYPE_COMDESIGN = 0x806c + ETHERTYPE_COMPUGRAPHIC = 0x806d + ETHERTYPE_COUNTERPOINT = 0x8062 + ETHERTYPE_CRONUS = 0x8004 + ETHERTYPE_CRONUSVLN = 0x8003 + ETHERTYPE_DCA = 0x1234 + ETHERTYPE_DDE = 0x807b + ETHERTYPE_DEBNI = 0xaaaa + ETHERTYPE_DECAM = 0x8048 + ETHERTYPE_DECCUST = 0x6006 + ETHERTYPE_DECDIAG = 0x6005 + ETHERTYPE_DECDNS = 0x803c + ETHERTYPE_DECDTS = 0x803e + ETHERTYPE_DECEXPER = 0x6000 + ETHERTYPE_DECLAST = 0x8041 + ETHERTYPE_DECLTM = 0x803f + ETHERTYPE_DECMUMPS = 0x6009 + ETHERTYPE_DECNETBIOS = 0x8040 + ETHERTYPE_DELTACON = 0x86de + ETHERTYPE_DIDDLE = 0x4321 + ETHERTYPE_DLOG1 = 0x660 + ETHERTYPE_DLOG2 = 0x661 + ETHERTYPE_DN = 0x6003 + ETHERTYPE_DOGFIGHT = 0x1989 + ETHERTYPE_DSMD = 0x8039 + ETHERTYPE_ECMA = 0x803 + ETHERTYPE_ENCRYPT = 0x803d + ETHERTYPE_ES = 0x805d + ETHERTYPE_EXCELAN = 0x8010 + ETHERTYPE_EXPERDATA = 0x8049 + ETHERTYPE_FLIP = 0x8146 + ETHERTYPE_FLOWCONTROL = 0x8808 + ETHERTYPE_FRARP = 0x808 + ETHERTYPE_GENDYN = 0x8068 + ETHERTYPE_HAYES = 0x8130 + ETHERTYPE_HIPPI_FP = 0x8180 + ETHERTYPE_HITACHI = 0x8820 + ETHERTYPE_HP = 0x8005 + ETHERTYPE_IEEEPUP = 0xa00 + ETHERTYPE_IEEEPUPAT = 0xa01 + ETHERTYPE_IMLBL = 0x4c42 + ETHERTYPE_IMLBLDIAG = 0x424c + ETHERTYPE_IP = 0x800 + ETHERTYPE_IPAS = 0x876c + ETHERTYPE_IPV6 = 0x86dd + ETHERTYPE_IPX = 0x8137 + ETHERTYPE_IPXNEW = 0x8037 + ETHERTYPE_KALPANA = 0x8582 + ETHERTYPE_LANBRIDGE = 0x8038 + ETHERTYPE_LANPROBE = 0x8888 + ETHERTYPE_LAT = 0x6004 + ETHERTYPE_LBACK = 0x9000 + ETHERTYPE_LITTLE = 0x8060 + ETHERTYPE_LOGICRAFT = 0x8148 + ETHERTYPE_LOOPBACK = 0x9000 + ETHERTYPE_MATRA = 0x807a + ETHERTYPE_MAX = 0xffff + ETHERTYPE_MERIT = 0x807c + ETHERTYPE_MICP = 0x873a + ETHERTYPE_MOPDL = 0x6001 + ETHERTYPE_MOPRC = 0x6002 + ETHERTYPE_MOTOROLA = 0x818d + ETHERTYPE_MPLS = 0x8847 + ETHERTYPE_MPLS_MCAST = 0x8848 + ETHERTYPE_MUMPS = 0x813f + ETHERTYPE_NBPCC = 0x3c04 + ETHERTYPE_NBPCLAIM = 0x3c09 + ETHERTYPE_NBPCLREQ = 0x3c05 + ETHERTYPE_NBPCLRSP = 0x3c06 + ETHERTYPE_NBPCREQ = 0x3c02 + ETHERTYPE_NBPCRSP = 0x3c03 + ETHERTYPE_NBPDG = 0x3c07 + ETHERTYPE_NBPDGB = 0x3c08 + ETHERTYPE_NBPDLTE = 0x3c0a + ETHERTYPE_NBPRAR = 0x3c0c + ETHERTYPE_NBPRAS = 0x3c0b + ETHERTYPE_NBPRST = 0x3c0d + ETHERTYPE_NBPSCD = 0x3c01 + ETHERTYPE_NBPVCD = 0x3c00 + ETHERTYPE_NBS = 0x802 + ETHERTYPE_NCD = 0x8149 + ETHERTYPE_NESTAR = 0x8006 + ETHERTYPE_NETBEUI = 0x8191 + ETHERTYPE_NOVELL = 0x8138 + ETHERTYPE_NS = 0x600 + ETHERTYPE_NSAT = 0x601 + ETHERTYPE_NSCOMPAT = 0x807 + ETHERTYPE_NTRAILER = 0x10 + ETHERTYPE_OS9 = 0x7007 + ETHERTYPE_OS9NET = 0x7009 + ETHERTYPE_PACER = 0x80c6 + ETHERTYPE_PAE = 0x888e + ETHERTYPE_PCS = 0x4242 + ETHERTYPE_PLANNING = 0x8044 + ETHERTYPE_PPP = 0x880b + ETHERTYPE_PPPOE = 0x8864 + ETHERTYPE_PPPOEDISC = 0x8863 + ETHERTYPE_PRIMENTS = 0x7031 + ETHERTYPE_PUP = 0x200 + ETHERTYPE_PUPAT = 0x200 + ETHERTYPE_RACAL = 0x7030 + ETHERTYPE_RATIONAL = 0x8150 + ETHERTYPE_RAWFR = 0x6559 + ETHERTYPE_RCL = 0x1995 + ETHERTYPE_RDP = 0x8739 + ETHERTYPE_RETIX = 0x80f2 + ETHERTYPE_REVARP = 0x8035 + ETHERTYPE_SCA = 0x6007 + ETHERTYPE_SECTRA = 0x86db + ETHERTYPE_SECUREDATA = 0x876d + ETHERTYPE_SGITW = 0x817e + ETHERTYPE_SG_BOUNCE = 0x8016 + ETHERTYPE_SG_DIAG = 0x8013 + ETHERTYPE_SG_NETGAMES = 0x8014 + ETHERTYPE_SG_RESV = 0x8015 + ETHERTYPE_SIMNET = 0x5208 + ETHERTYPE_SLOWPROTOCOLS = 0x8809 + ETHERTYPE_SNA = 0x80d5 + ETHERTYPE_SNMP = 0x814c + ETHERTYPE_SONIX = 0xfaf5 + ETHERTYPE_SPIDER = 0x809f + ETHERTYPE_SPRITE = 0x500 + ETHERTYPE_STP = 0x8181 + ETHERTYPE_TALARIS = 0x812b + ETHERTYPE_TALARISMC = 0x852b + ETHERTYPE_TCPCOMP = 0x876b + ETHERTYPE_TCPSM = 0x9002 + ETHERTYPE_TEC = 0x814f + ETHERTYPE_TIGAN = 0x802f + ETHERTYPE_TRAIL = 0x1000 + ETHERTYPE_TRANSETHER = 0x6558 + ETHERTYPE_TYMSHARE = 0x802e + ETHERTYPE_UBBST = 0x7005 + ETHERTYPE_UBDEBUG = 0x900 + ETHERTYPE_UBDIAGLOOP = 0x7002 + ETHERTYPE_UBDL = 0x7000 + ETHERTYPE_UBNIU = 0x7001 + ETHERTYPE_UBNMC = 0x7003 + ETHERTYPE_VALID = 0x1600 + ETHERTYPE_VARIAN = 0x80dd + ETHERTYPE_VAXELN = 0x803b + ETHERTYPE_VEECO = 0x8067 + ETHERTYPE_VEXP = 0x805b + ETHERTYPE_VGLAB = 0x8131 + ETHERTYPE_VINES = 0xbad + ETHERTYPE_VINESECHO = 0xbaf + ETHERTYPE_VINESLOOP = 0xbae + ETHERTYPE_VITAL = 0xff00 + ETHERTYPE_VLAN = 0x8100 + ETHERTYPE_VLTLMAN = 0x8080 + ETHERTYPE_VPROD = 0x805c + ETHERTYPE_VURESERVED = 0x8147 + ETHERTYPE_WATERLOO = 0x8130 + ETHERTYPE_WELLFLEET = 0x8103 + ETHERTYPE_X25 = 0x805 + ETHERTYPE_X75 = 0x801 + ETHERTYPE_XNSSM = 0x9001 + ETHERTYPE_XTP = 0x817d + ETHER_ADDR_LEN = 0x6 + ETHER_CRC_LEN = 0x4 + ETHER_CRC_POLY_BE = 0x4c11db6 + ETHER_CRC_POLY_LE = 0xedb88320 + ETHER_HDR_LEN = 0xe + ETHER_MAX_LEN = 0x5ee + ETHER_MAX_LEN_JUMBO = 0x233a + ETHER_MIN_LEN = 0x40 + ETHER_PPPOE_ENCAP_LEN = 0x8 + ETHER_TYPE_LEN = 0x2 + ETHER_VLAN_ENCAP_LEN = 0x4 + EVFILT_AIO = 0x2 + EVFILT_PROC = 0x4 + EVFILT_READ = 0x0 + EVFILT_SIGNAL = 0x5 + EVFILT_SYSCOUNT = 0x7 + EVFILT_TIMER = 0x6 + EVFILT_VNODE = 0x3 + EVFILT_WRITE = 0x1 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTATTR_CMD_START = 0x1 + EXTATTR_CMD_STOP = 0x2 + EXTATTR_NAMESPACE_SYSTEM = 0x2 + EXTATTR_NAMESPACE_USER = 0x1 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x100 + FLUSHO = 0x800000 + F_CLOSEM = 0xa + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0xc + F_FSCTL = -0x80000000 + F_FSDIRMASK = 0x70000000 + F_FSIN = 0x10000000 + F_FSINOUT = 0x30000000 + F_FSOUT = 0x20000000 + F_FSPRIV = 0x8000 + F_FSVOID = 0x40000000 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETNOSIGPIPE = 0xd + F_GETOWN = 0x5 + F_MAXFD = 0xb + F_OK = 0x0 + F_PARAM_MASK = 0xfff + F_PARAM_MAX = 0xfff + F_RDLCK = 0x1 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETNOSIGPIPE = 0xe + F_SETOWN = 0x6 + F_UNLCK = 0x2 + F_WRLCK = 0x3 + HUPCL = 0x4000 + HW_MACHINE = 0x1 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFAN_ARRIVAL = 0x0 + IFAN_DEPARTURE = 0x1 + IFA_ROUTE = 0x1 + IFF_ALLMULTI = 0x200 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x8f52 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NOTRAILERS = 0x20 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BRIDGE = 0xd1 + IFT_BSC = 0x53 + IFT_CARP = 0xf8 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DOCSCABLEUPSTREAMCHANNEL = 0xcd + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ECONET = 0xce + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAITH = 0xf2 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE1394 = 0x90 + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_INFINIBAND = 0xc7 + IFT_INTERLEAVE = 0x7c + IFT_IP = 0x7e + IFT_IPFORWARD = 0x8e + IFT_IPOVERATM = 0x72 + IFT_IPOVERCDLC = 0x6d + IFT_IPOVERCLAW = 0x6e + IFT_IPSWITCH = 0x4e + IFT_ISDN = 0x3f + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISDNS = 0x4b + IFT_ISDNU = 0x4c + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88025CRFPINT = 0x62 + IFT_ISO88025DTR = 0x56 + IFT_ISO88025FIBER = 0x73 + IFT_ISO88026 = 0xa + IFT_ISUP = 0xb3 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_L3IPXVLAN = 0x89 + IFT_LAPB = 0x10 + IFT_LAPD = 0x4d + IFT_LAPF = 0x77 + IFT_LINEGROUP = 0xd2 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf5 + IFT_PFSYNC = 0xf6 + IFT_PLC = 0xae + IFT_PON155 = 0xcf + IFT_PON622 = 0xd0 + IFT_POS = 0xab + IFT_PPP = 0x17 + IFT_PPPMULTILINKBUNDLE = 0x6c + IFT_PROPATM = 0xc5 + IFT_PROPBWAP2MP = 0xb8 + IFT_PROPCNLS = 0x59 + IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 + IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 + IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PROPWIRELESSP2P = 0x9d + IFT_PTPSERIAL = 0x16 + IFT_PVC = 0xf1 + IFT_Q2931 = 0xc9 + IFT_QLLC = 0x44 + IFT_RADIOMAC = 0xbc + IFT_RADSL = 0x5f + IFT_REACHDSL = 0xc0 + IFT_RFC1483 = 0x9f + IFT_RS232 = 0x21 + IFT_RSRB = 0x4f + IFT_SDLC = 0x11 + IFT_SDSL = 0x60 + IFT_SHDSL = 0xa9 + IFT_SIP = 0x1f + IFT_SIPSIG = 0xcc + IFT_SIPTG = 0xcb + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETOVERHEADCHANNEL = 0xb9 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_SRP = 0x97 + IFT_SS7SIGLINK = 0x9c + IFT_STACKTOSTACK = 0x6f + IFT_STARLAN = 0xb + IFT_STF = 0xd7 + IFT_T1 = 0x12 + IFT_TDLC = 0x74 + IFT_TELINK = 0xc8 + IFT_TERMPAD = 0x5b + IFT_TR008 = 0xb0 + IFT_TRANSPHDLC = 0x7b + IFT_TUNNEL = 0x83 + IFT_ULTRA = 0x1d + IFT_USB = 0xa0 + IFT_V11 = 0x40 + IFT_V35 = 0x2d + IFT_V36 = 0x41 + IFT_V37 = 0x78 + IFT_VDSL = 0x61 + IFT_VIRTUALIPADDRESS = 0x70 + IFT_VIRTUALTG = 0xca + IFT_VOICEDID = 0xd5 + IFT_VOICEEM = 0x64 + IFT_VOICEEMFGD = 0xd3 + IFT_VOICEENCAP = 0x67 + IFT_VOICEFGDEANA = 0xd4 + IFT_VOICEFXO = 0x65 + IFT_VOICEFXS = 0x66 + IFT_VOICEOVERATM = 0x98 + IFT_VOICEOVERCABLE = 0xc6 + IFT_VOICEOVERFRAMERELAY = 0x99 + IFT_VOICEOVERIP = 0x68 + IFT_X213 = 0x5d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25HUNTGROUP = 0x7a + IFT_X25MLP = 0x79 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IPPROTO_AH = 0x33 + IPPROTO_CARP = 0x70 + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPIP = 0x4 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IPV6_ICMP = 0x3a + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x34 + IPPROTO_MOBILE = 0x37 + IPPROTO_NONE = 0x3b + IPPROTO_PFSYNC = 0xf0 + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_VRRP = 0x70 + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FRAGTTL = 0x78 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXPACKET = 0xffff + IPV6_MMTU = 0x500 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_PATHMTU = 0x2c + IPV6_PKTINFO = 0x2e + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0xd + IP_EF = 0x8000 + IP_ERRORMTU = 0x15 + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x16 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINFRAGSIZE = 0x45 + IP_MINTTL = 0x18 + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x1 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVTTL = 0x17 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_TOS = 0x3 + IP_TTL = 0x4 + ISIG = 0x80 + ISTRIP = 0x20 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + KERN_HOSTNAME = 0xa + KERN_OSRELEASE = 0x2 + KERN_OSTYPE = 0x1 + KERN_VERSION = 0x4 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x6 + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_SPACEAVAIL = 0x5 + MADV_WILLNEED = 0x3 + MAP_ALIGNMENT_16MB = 0x18000000 + MAP_ALIGNMENT_1TB = 0x28000000 + MAP_ALIGNMENT_256TB = 0x30000000 + MAP_ALIGNMENT_4GB = 0x20000000 + MAP_ALIGNMENT_64KB = 0x10000000 + MAP_ALIGNMENT_64PB = 0x38000000 + MAP_ALIGNMENT_MASK = -0x1000000 + MAP_ALIGNMENT_SHIFT = 0x18 + MAP_ANON = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_INHERIT = 0x80 + MAP_INHERIT_COPY = 0x1 + MAP_INHERIT_DEFAULT = 0x1 + MAP_INHERIT_DONATE_COPY = 0x3 + MAP_INHERIT_NONE = 0x2 + MAP_INHERIT_SHARE = 0x0 + MAP_NORESERVE = 0x40 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_SHARED = 0x1 + MAP_STACK = 0x2000 + MAP_TRYFIXED = 0x400 + MAP_WIRED = 0x800 + MNT_ASYNC = 0x40 + MNT_BASIC_FLAGS = 0xe782807f + MNT_DEFEXPORTED = 0x200 + MNT_DISCARD = 0x800000 + MNT_EXKERB = 0x800 + MNT_EXNORESPORT = 0x8000000 + MNT_EXPORTANON = 0x400 + MNT_EXPORTED = 0x100 + MNT_EXPUBLIC = 0x10000000 + MNT_EXRDONLY = 0x80 + MNT_EXTATTR = 0x1000000 + MNT_FORCE = 0x80000 + MNT_GETARGS = 0x400000 + MNT_IGNORE = 0x100000 + MNT_LAZY = 0x3 + MNT_LOCAL = 0x1000 + MNT_LOG = 0x2000000 + MNT_NOATIME = 0x4000000 + MNT_NOCOREDUMP = 0x8000 + MNT_NODEV = 0x10 + MNT_NODEVMTIME = 0x40000000 + MNT_NOEXEC = 0x4 + MNT_NOSUID = 0x8 + MNT_NOWAIT = 0x2 + MNT_OP_FLAGS = 0x4d0000 + MNT_QUOTA = 0x2000 + MNT_RDONLY = 0x1 + MNT_RELATIME = 0x20000 + MNT_RELOAD = 0x40000 + MNT_ROOTFS = 0x4000 + MNT_SOFTDEP = 0x80000000 + MNT_SYMPERM = 0x20000000 + MNT_SYNCHRONOUS = 0x2 + MNT_UNION = 0x20 + MNT_UPDATE = 0x10000 + MNT_VISFLAGMASK = 0xff90ffff + MNT_WAIT = 0x1 + MSG_BCAST = 0x100 + MSG_CMSG_CLOEXEC = 0x800 + MSG_CONTROLMBUF = 0x2000000 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOR = 0x8 + MSG_IOVUSRSPACE = 0x4000000 + MSG_LENUSRSPACE = 0x8000000 + MSG_MCAST = 0x200 + MSG_NAMEMBUF = 0x1000000 + MSG_NBIO = 0x1000 + MSG_NOSIGNAL = 0x400 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_USERFLAGS = 0xffffff + MSG_WAITALL = 0x40 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x2 + MS_SYNC = 0x4 + NAME_MAX = 0x1ff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x5 + NET_RT_MAXID = 0x6 + NET_RT_OIFLIST = 0x4 + NET_RT_OOIFLIST = 0x3 + NOFLSH = 0x80000000 + NOTE_ATTRIB = 0x8 + NOTE_CHILD = 0x4 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXTEND = 0x4 + NOTE_FORK = 0x40000000 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_PCTRLMASK = 0xf0000000 + NOTE_PDATAMASK = 0xfffff + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + OFIOGETBMAP = 0xc004667a + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_ALT_IO = 0x40000 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x400000 + O_CREAT = 0x200 + O_DIRECT = 0x80000 + O_DIRECTORY = 0x200000 + O_DSYNC = 0x10000 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_NOSIGPIPE = 0x1000000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x20000 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PRI_IOFLUSH = 0x7c + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + RLIMIT_AS = 0xa + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_MEMLOCK = 0x6 + RLIMIT_NOFILE = 0x8 + RLIMIT_NPROC = 0x7 + RLIMIT_RSS = 0x5 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x9 + RTAX_NETMASK = 0x2 + RTAX_TAG = 0x8 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTA_TAG = 0x100 + RTF_ANNOUNCE = 0x20000 + RTF_BLACKHOLE = 0x1000 + RTF_CLONED = 0x2000 + RTF_CLONING = 0x100 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_LLINFO = 0x400 + RTF_MASK = 0x80 + RTF_MODIFIED = 0x20 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_REJECT = 0x8 + RTF_SRC = 0x10000 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_CHGADDR = 0x15 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_GET = 0x4 + RTM_IEEE80211 = 0x11 + RTM_IFANNOUNCE = 0x10 + RTM_IFINFO = 0x14 + RTM_LLINFO_UPD = 0x13 + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_OIFINFO = 0xf + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + RTM_OOIFINFO = 0xe + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_SETGATE = 0x12 + RTM_VERSION = 0x4 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + SCM_CREDS = 0x4 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x8 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80906931 + SIOCADDRT = 0x8030720a + SIOCAIFADDR = 0x8040691a + SIOCALIFADDR = 0x8118691c + SIOCATMARK = 0x40047307 + SIOCDELMULTI = 0x80906932 + SIOCDELRT = 0x8030720b + SIOCDIFADDR = 0x80906919 + SIOCDIFPHYADDR = 0x80906949 + SIOCDLIFADDR = 0x8118691e + SIOCGDRVSPEC = 0xc01c697b + SIOCGETPFSYNC = 0xc09069f8 + SIOCGETSGCNT = 0xc0147534 + SIOCGETVIFCNT = 0xc0147533 + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0906921 + SIOCGIFADDRPREF = 0xc0946920 + SIOCGIFALIAS = 0xc040691b + SIOCGIFBRDADDR = 0xc0906923 + SIOCGIFCAP = 0xc0206976 + SIOCGIFCONF = 0xc0086926 + SIOCGIFDATA = 0xc0946985 + SIOCGIFDLT = 0xc0906977 + SIOCGIFDSTADDR = 0xc0906922 + SIOCGIFFLAGS = 0xc0906911 + SIOCGIFGENERIC = 0xc090693a + SIOCGIFMEDIA = 0xc0286936 + SIOCGIFMETRIC = 0xc0906917 + SIOCGIFMTU = 0xc090697e + SIOCGIFNETMASK = 0xc0906925 + SIOCGIFPDSTADDR = 0xc0906948 + SIOCGIFPSRCADDR = 0xc0906947 + SIOCGLIFADDR = 0xc118691d + SIOCGLIFPHYADDR = 0xc118694b + SIOCGLINKSTR = 0xc01c6987 + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCGVH = 0xc0906983 + SIOCIFCREATE = 0x8090697a + SIOCIFDESTROY = 0x80906979 + SIOCIFGCLONERS = 0xc00c6978 + SIOCINITIFADDR = 0xc0446984 + SIOCSDRVSPEC = 0x801c697b + SIOCSETPFSYNC = 0x809069f7 + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8090690c + SIOCSIFADDRPREF = 0x8094691f + SIOCSIFBRDADDR = 0x80906913 + SIOCSIFCAP = 0x80206975 + SIOCSIFDSTADDR = 0x8090690e + SIOCSIFFLAGS = 0x80906910 + SIOCSIFGENERIC = 0x80906939 + SIOCSIFMEDIA = 0xc0906935 + SIOCSIFMETRIC = 0x80906918 + SIOCSIFMTU = 0x8090697f + SIOCSIFNETMASK = 0x80906916 + SIOCSIFPHYADDR = 0x80406946 + SIOCSLIFPHYADDR = 0x8118694a + SIOCSLINKSTR = 0x801c6988 + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SIOCSVH = 0xc0906982 + SIOCZIFDATA = 0xc0946986 + SOCK_CLOEXEC = 0x10000000 + SOCK_DGRAM = 0x2 + SOCK_FLAGS_MASK = 0xf0000000 + SOCK_NONBLOCK = 0x20000000 + SOCK_NOSIGPIPE = 0x40000000 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_ACCEPTFILTER = 0x1000 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_NOHEADER = 0x100a + SO_NOSIGPIPE = 0x800 + SO_OOBINLINE = 0x100 + SO_OVERFLOWED = 0x1009 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x100c + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x100b + SO_TIMESTAMP = 0x2000 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + SYSCTL_VERSION = 0x1000000 + SYSCTL_VERS_0 = 0x0 + SYSCTL_VERS_1 = 0x1000000 + SYSCTL_VERS_MASK = 0xff000000 + S_ARCH1 = 0x10000 + S_ARCH2 = 0x20000 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IFWHT = 0xe000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISTXT = 0x200 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TCIFLUSH = 0x1 + TCIOFLUSH = 0x3 + TCOFLUSH = 0x2 + TCP_CONGCTL = 0x20 + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x3 + TCP_KEEPINIT = 0x7 + TCP_KEEPINTVL = 0x5 + TCP_MAXBURST = 0x4 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0x10 + TCP_MINMSS = 0xd8 + TCP_MSS = 0x218 + TCP_NODELAY = 0x1 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDCDTIMESTAMP = 0x400c7458 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLAG_CDTRCTS = 0x10 + TIOCFLAG_CLOCAL = 0x2 + TIOCFLAG_CRTSCTS = 0x4 + TIOCFLAG_MDMBUF = 0x8 + TIOCFLAG_SOFTCAR = 0x1 + TIOCFLUSH = 0x80047410 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGFLAGS = 0x4004745d + TIOCGLINED = 0x40207442 + TIOCGPGRP = 0x40047477 + TIOCGQSIZE = 0x40047481 + TIOCGRANTPT = 0x20007447 + TIOCGSID = 0x40047463 + TIOCGSIZE = 0x40087468 + TIOCGWINSZ = 0x40087468 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGET = 0x4004746a + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCPTMGET = 0x48087446 + TIOCPTSNAME = 0x48087448 + TIOCRCVFRAME = 0x80047445 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSFLAGS = 0x8004745c + TIOCSIG = 0x2000745f + TIOCSLINED = 0x80207443 + TIOCSPGRP = 0x80047476 + TIOCSQSIZE = 0x80047480 + TIOCSSIZE = 0x80087467 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x80047465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCUCNTL = 0x80047466 + TIOCXMTFRAME = 0x80047444 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WALL = 0x8 + WALLSIG = 0x8 + WALTSIG = 0x4 + WCLONE = 0x4 + WCOREFLAG = 0x80 + WNOHANG = 0x1 + WNOWAIT = 0x10000 + WNOZOMBIE = 0x20000 + WOPTSCHECKED = 0x40000 + WSTOPPED = 0x7f + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADF = syscall.Errno(0x9) + EBADMSG = syscall.Errno(0x58) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x57) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDOM = syscall.Errno(0x21) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x52) + EILSEQ = syscall.Errno(0x55) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x60) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5e) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x5d) + ENOBUFS = syscall.Errno(0x37) + ENODATA = syscall.Errno(0x59) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x5f) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x53) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x5a) + ENOSTR = syscall.Errno(0x5b) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x56) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x54) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTO = syscall.Errno(0x60) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIME = syscall.Errno(0x5c) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGPWR = syscall.Signal(0x20) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "device not configured"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EDEADLK", "resource deadlock avoided"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "cross-device link"}, + {19, "ENODEV", "operation not supported by device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "result too large or too small"}, + {35, "EAGAIN", "resource temporarily unavailable"}, + {36, "EINPROGRESS", "operation now in progress"}, + {37, "EALREADY", "operation already in progress"}, + {38, "ENOTSOCK", "socket operation on non-socket"}, + {39, "EDESTADDRREQ", "destination address required"}, + {40, "EMSGSIZE", "message too long"}, + {41, "EPROTOTYPE", "protocol wrong type for socket"}, + {42, "ENOPROTOOPT", "protocol option not available"}, + {43, "EPROTONOSUPPORT", "protocol not supported"}, + {44, "ESOCKTNOSUPPORT", "socket type not supported"}, + {45, "EOPNOTSUPP", "operation not supported"}, + {46, "EPFNOSUPPORT", "protocol family not supported"}, + {47, "EAFNOSUPPORT", "address family not supported by protocol family"}, + {48, "EADDRINUSE", "address already in use"}, + {49, "EADDRNOTAVAIL", "can't assign requested address"}, + {50, "ENETDOWN", "network is down"}, + {51, "ENETUNREACH", "network is unreachable"}, + {52, "ENETRESET", "network dropped connection on reset"}, + {53, "ECONNABORTED", "software caused connection abort"}, + {54, "ECONNRESET", "connection reset by peer"}, + {55, "ENOBUFS", "no buffer space available"}, + {56, "EISCONN", "socket is already connected"}, + {57, "ENOTCONN", "socket is not connected"}, + {58, "ESHUTDOWN", "can't send after socket shutdown"}, + {59, "ETOOMANYREFS", "too many references: can't splice"}, + {60, "ETIMEDOUT", "connection timed out"}, + {61, "ECONNREFUSED", "connection refused"}, + {62, "ELOOP", "too many levels of symbolic links"}, + {63, "ENAMETOOLONG", "file name too long"}, + {64, "EHOSTDOWN", "host is down"}, + {65, "EHOSTUNREACH", "no route to host"}, + {66, "ENOTEMPTY", "directory not empty"}, + {67, "EPROCLIM", "too many processes"}, + {68, "EUSERS", "too many users"}, + {69, "EDQUOT", "disc quota exceeded"}, + {70, "ESTALE", "stale NFS file handle"}, + {71, "EREMOTE", "too many levels of remote in path"}, + {72, "EBADRPC", "RPC struct is bad"}, + {73, "ERPCMISMATCH", "RPC version wrong"}, + {74, "EPROGUNAVAIL", "RPC prog. not avail"}, + {75, "EPROGMISMATCH", "program version wrong"}, + {76, "EPROCUNAVAIL", "bad procedure for program"}, + {77, "ENOLCK", "no locks available"}, + {78, "ENOSYS", "function not implemented"}, + {79, "EFTYPE", "inappropriate file type or format"}, + {80, "EAUTH", "authentication error"}, + {81, "ENEEDAUTH", "need authenticator"}, + {82, "EIDRM", "identifier removed"}, + {83, "ENOMSG", "no message of desired type"}, + {84, "EOVERFLOW", "value too large to be stored in data type"}, + {85, "EILSEQ", "illegal byte sequence"}, + {86, "ENOTSUP", "not supported"}, + {87, "ECANCELED", "operation Canceled"}, + {88, "EBADMSG", "bad or Corrupt message"}, + {89, "ENODATA", "no message available"}, + {90, "ENOSR", "no STREAM resources"}, + {91, "ENOSTR", "not a STREAM"}, + {92, "ETIME", "STREAM ioctl timeout"}, + {93, "ENOATTR", "attribute not found"}, + {94, "EMULTIHOP", "multihop attempted"}, + {95, "ENOLINK", "link has been severed"}, + {96, "ELAST", "protocol error"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/BPT trap"}, + {6, "SIGIOT", "abort trap"}, + {7, "SIGEMT", "EMT trap"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGBUS", "bus error"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGSYS", "bad system call"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGURG", "urgent I/O condition"}, + {17, "SIGSTOP", "stopped (signal)"}, + {18, "SIGTSTP", "stopped"}, + {19, "SIGCONT", "continued"}, + {20, "SIGCHLD", "child exited"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGIO", "I/O possible"}, + {24, "SIGXCPU", "cputime limit exceeded"}, + {25, "SIGXFSZ", "filesize limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window size changes"}, + {29, "SIGINFO", "information request"}, + {30, "SIGUSR1", "user defined signal 1"}, + {31, "SIGUSR2", "user defined signal 2"}, + {32, "SIGPWR", "power fail/restart"}, +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go new file mode 100644 index 00000000..d8be0451 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go @@ -0,0 +1,1654 @@ +// mkerrors.sh -m32 +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build 386,openbsd + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m32 _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_BLUETOOTH = 0x20 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_ENCAP = 0x1c + AF_HYLINK = 0xf + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x18 + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_KEY = 0x1e + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x24 + AF_MPLS = 0x21 + AF_NATM = 0x1b + AF_NS = 0x6 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x11 + AF_SIP = 0x1d + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + ARPHRD_ETHER = 0x1 + ARPHRD_FRELAY = 0xf + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B9600 = 0x2580 + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDIRFILT = 0x4004427c + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc008427b + BIOCGETIF = 0x4020426b + BIOCGFILDROP = 0x40044278 + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044273 + BIOCGRTIMEOUT = 0x400c426e + BIOCGSTATS = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCLOCK = 0x20004276 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDIRFILT = 0x8004427d + BIOCSDLT = 0x8004427a + BIOCSETF = 0x80084267 + BIOCSETIF = 0x8020426c + BIOCSETWF = 0x80084277 + BIOCSFILDROP = 0x80044279 + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044272 + BIOCSRTIMEOUT = 0x800c426d + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIRECTION_IN = 0x1 + BPF_DIRECTION_OUT = 0x2 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x200000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + CFLUSH = 0xf + CLOCAL = 0x8000 + CREAD = 0x800 + CRTSCTS = 0x10000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0xff + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_HW = 0x6 + CTL_KERN = 0x1 + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + DIOCOSFPFLUSH = 0x2000444e + DLT_ARCNET = 0x7 + DLT_ATM_RFC1483 = 0xb + DLT_AX25 = 0x3 + DLT_CHAOS = 0x5 + DLT_C_HDLC = 0x68 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0xd + DLT_FDDI = 0xa + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_LOOP = 0xc + DLT_MPLS = 0xdb + DLT_NULL = 0x0 + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_SERIAL = 0x32 + DLT_PRONET = 0x4 + DLT_RAW = 0xe + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EMT_TAGOVF = 0x1 + EMUL_ENABLED = 0x1 + EMUL_NATIVE = 0x2 + ENDRUNDISC = 0x9 + ETHERMIN = 0x2e + ETHERMTU = 0x5dc + ETHERTYPE_8023 = 0x4 + ETHERTYPE_AARP = 0x80f3 + ETHERTYPE_ACCTON = 0x8390 + ETHERTYPE_AEONIC = 0x8036 + ETHERTYPE_ALPHA = 0x814a + ETHERTYPE_AMBER = 0x6008 + ETHERTYPE_AMOEBA = 0x8145 + ETHERTYPE_AOE = 0x88a2 + ETHERTYPE_APOLLO = 0x80f7 + ETHERTYPE_APOLLODOMAIN = 0x8019 + ETHERTYPE_APPLETALK = 0x809b + ETHERTYPE_APPLITEK = 0x80c7 + ETHERTYPE_ARGONAUT = 0x803a + ETHERTYPE_ARP = 0x806 + ETHERTYPE_AT = 0x809b + ETHERTYPE_ATALK = 0x809b + ETHERTYPE_ATOMIC = 0x86df + ETHERTYPE_ATT = 0x8069 + ETHERTYPE_ATTSTANFORD = 0x8008 + ETHERTYPE_AUTOPHON = 0x806a + ETHERTYPE_AXIS = 0x8856 + ETHERTYPE_BCLOOP = 0x9003 + ETHERTYPE_BOFL = 0x8102 + ETHERTYPE_CABLETRON = 0x7034 + ETHERTYPE_CHAOS = 0x804 + ETHERTYPE_COMDESIGN = 0x806c + ETHERTYPE_COMPUGRAPHIC = 0x806d + ETHERTYPE_COUNTERPOINT = 0x8062 + ETHERTYPE_CRONUS = 0x8004 + ETHERTYPE_CRONUSVLN = 0x8003 + ETHERTYPE_DCA = 0x1234 + ETHERTYPE_DDE = 0x807b + ETHERTYPE_DEBNI = 0xaaaa + ETHERTYPE_DECAM = 0x8048 + ETHERTYPE_DECCUST = 0x6006 + ETHERTYPE_DECDIAG = 0x6005 + ETHERTYPE_DECDNS = 0x803c + ETHERTYPE_DECDTS = 0x803e + ETHERTYPE_DECEXPER = 0x6000 + ETHERTYPE_DECLAST = 0x8041 + ETHERTYPE_DECLTM = 0x803f + ETHERTYPE_DECMUMPS = 0x6009 + ETHERTYPE_DECNETBIOS = 0x8040 + ETHERTYPE_DELTACON = 0x86de + ETHERTYPE_DIDDLE = 0x4321 + ETHERTYPE_DLOG1 = 0x660 + ETHERTYPE_DLOG2 = 0x661 + ETHERTYPE_DN = 0x6003 + ETHERTYPE_DOGFIGHT = 0x1989 + ETHERTYPE_DSMD = 0x8039 + ETHERTYPE_ECMA = 0x803 + ETHERTYPE_ENCRYPT = 0x803d + ETHERTYPE_ES = 0x805d + ETHERTYPE_EXCELAN = 0x8010 + ETHERTYPE_EXPERDATA = 0x8049 + ETHERTYPE_FLIP = 0x8146 + ETHERTYPE_FLOWCONTROL = 0x8808 + ETHERTYPE_FRARP = 0x808 + ETHERTYPE_GENDYN = 0x8068 + ETHERTYPE_HAYES = 0x8130 + ETHERTYPE_HIPPI_FP = 0x8180 + ETHERTYPE_HITACHI = 0x8820 + ETHERTYPE_HP = 0x8005 + ETHERTYPE_IEEEPUP = 0xa00 + ETHERTYPE_IEEEPUPAT = 0xa01 + ETHERTYPE_IMLBL = 0x4c42 + ETHERTYPE_IMLBLDIAG = 0x424c + ETHERTYPE_IP = 0x800 + ETHERTYPE_IPAS = 0x876c + ETHERTYPE_IPV6 = 0x86dd + ETHERTYPE_IPX = 0x8137 + ETHERTYPE_IPXNEW = 0x8037 + ETHERTYPE_KALPANA = 0x8582 + ETHERTYPE_LANBRIDGE = 0x8038 + ETHERTYPE_LANPROBE = 0x8888 + ETHERTYPE_LAT = 0x6004 + ETHERTYPE_LBACK = 0x9000 + ETHERTYPE_LITTLE = 0x8060 + ETHERTYPE_LLDP = 0x88cc + ETHERTYPE_LOGICRAFT = 0x8148 + ETHERTYPE_LOOPBACK = 0x9000 + ETHERTYPE_MATRA = 0x807a + ETHERTYPE_MAX = 0xffff + ETHERTYPE_MERIT = 0x807c + ETHERTYPE_MICP = 0x873a + ETHERTYPE_MOPDL = 0x6001 + ETHERTYPE_MOPRC = 0x6002 + ETHERTYPE_MOTOROLA = 0x818d + ETHERTYPE_MPLS = 0x8847 + ETHERTYPE_MPLS_MCAST = 0x8848 + ETHERTYPE_MUMPS = 0x813f + ETHERTYPE_NBPCC = 0x3c04 + ETHERTYPE_NBPCLAIM = 0x3c09 + ETHERTYPE_NBPCLREQ = 0x3c05 + ETHERTYPE_NBPCLRSP = 0x3c06 + ETHERTYPE_NBPCREQ = 0x3c02 + ETHERTYPE_NBPCRSP = 0x3c03 + ETHERTYPE_NBPDG = 0x3c07 + ETHERTYPE_NBPDGB = 0x3c08 + ETHERTYPE_NBPDLTE = 0x3c0a + ETHERTYPE_NBPRAR = 0x3c0c + ETHERTYPE_NBPRAS = 0x3c0b + ETHERTYPE_NBPRST = 0x3c0d + ETHERTYPE_NBPSCD = 0x3c01 + ETHERTYPE_NBPVCD = 0x3c00 + ETHERTYPE_NBS = 0x802 + ETHERTYPE_NCD = 0x8149 + ETHERTYPE_NESTAR = 0x8006 + ETHERTYPE_NETBEUI = 0x8191 + ETHERTYPE_NOVELL = 0x8138 + ETHERTYPE_NS = 0x600 + ETHERTYPE_NSAT = 0x601 + ETHERTYPE_NSCOMPAT = 0x807 + ETHERTYPE_NTRAILER = 0x10 + ETHERTYPE_OS9 = 0x7007 + ETHERTYPE_OS9NET = 0x7009 + ETHERTYPE_PACER = 0x80c6 + ETHERTYPE_PAE = 0x888e + ETHERTYPE_PCS = 0x4242 + ETHERTYPE_PLANNING = 0x8044 + ETHERTYPE_PPP = 0x880b + ETHERTYPE_PPPOE = 0x8864 + ETHERTYPE_PPPOEDISC = 0x8863 + ETHERTYPE_PRIMENTS = 0x7031 + ETHERTYPE_PUP = 0x200 + ETHERTYPE_PUPAT = 0x200 + ETHERTYPE_QINQ = 0x88a8 + ETHERTYPE_RACAL = 0x7030 + ETHERTYPE_RATIONAL = 0x8150 + ETHERTYPE_RAWFR = 0x6559 + ETHERTYPE_RCL = 0x1995 + ETHERTYPE_RDP = 0x8739 + ETHERTYPE_RETIX = 0x80f2 + ETHERTYPE_REVARP = 0x8035 + ETHERTYPE_SCA = 0x6007 + ETHERTYPE_SECTRA = 0x86db + ETHERTYPE_SECUREDATA = 0x876d + ETHERTYPE_SGITW = 0x817e + ETHERTYPE_SG_BOUNCE = 0x8016 + ETHERTYPE_SG_DIAG = 0x8013 + ETHERTYPE_SG_NETGAMES = 0x8014 + ETHERTYPE_SG_RESV = 0x8015 + ETHERTYPE_SIMNET = 0x5208 + ETHERTYPE_SLOW = 0x8809 + ETHERTYPE_SNA = 0x80d5 + ETHERTYPE_SNMP = 0x814c + ETHERTYPE_SONIX = 0xfaf5 + ETHERTYPE_SPIDER = 0x809f + ETHERTYPE_SPRITE = 0x500 + ETHERTYPE_STP = 0x8181 + ETHERTYPE_TALARIS = 0x812b + ETHERTYPE_TALARISMC = 0x852b + ETHERTYPE_TCPCOMP = 0x876b + ETHERTYPE_TCPSM = 0x9002 + ETHERTYPE_TEC = 0x814f + ETHERTYPE_TIGAN = 0x802f + ETHERTYPE_TRAIL = 0x1000 + ETHERTYPE_TRANSETHER = 0x6558 + ETHERTYPE_TYMSHARE = 0x802e + ETHERTYPE_UBBST = 0x7005 + ETHERTYPE_UBDEBUG = 0x900 + ETHERTYPE_UBDIAGLOOP = 0x7002 + ETHERTYPE_UBDL = 0x7000 + ETHERTYPE_UBNIU = 0x7001 + ETHERTYPE_UBNMC = 0x7003 + ETHERTYPE_VALID = 0x1600 + ETHERTYPE_VARIAN = 0x80dd + ETHERTYPE_VAXELN = 0x803b + ETHERTYPE_VEECO = 0x8067 + ETHERTYPE_VEXP = 0x805b + ETHERTYPE_VGLAB = 0x8131 + ETHERTYPE_VINES = 0xbad + ETHERTYPE_VINESECHO = 0xbaf + ETHERTYPE_VINESLOOP = 0xbae + ETHERTYPE_VITAL = 0xff00 + ETHERTYPE_VLAN = 0x8100 + ETHERTYPE_VLTLMAN = 0x8080 + ETHERTYPE_VPROD = 0x805c + ETHERTYPE_VURESERVED = 0x8147 + ETHERTYPE_WATERLOO = 0x8130 + ETHERTYPE_WELLFLEET = 0x8103 + ETHERTYPE_X25 = 0x805 + ETHERTYPE_X75 = 0x801 + ETHERTYPE_XNSSM = 0x9001 + ETHERTYPE_XTP = 0x817d + ETHER_ADDR_LEN = 0x6 + ETHER_ALIGN = 0x2 + ETHER_CRC_LEN = 0x4 + ETHER_CRC_POLY_BE = 0x4c11db6 + ETHER_CRC_POLY_LE = 0xedb88320 + ETHER_HDR_LEN = 0xe + ETHER_MAX_DIX_LEN = 0x600 + ETHER_MAX_LEN = 0x5ee + ETHER_MIN_LEN = 0x40 + ETHER_TYPE_LEN = 0x2 + ETHER_VLAN_ENCAP_LEN = 0x4 + EVFILT_AIO = -0x3 + EVFILT_PROC = -0x5 + EVFILT_READ = -0x1 + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0x7 + EVFILT_TIMER = -0x7 + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FLUSHO = 0x800000 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0xa + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETOWN = 0x5 + F_OK = 0x0 + F_RDLCK = 0x1 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETOWN = 0x6 + F_UNLCK = 0x2 + F_WRLCK = 0x3 + HUPCL = 0x4000 + HW_MACHINE = 0x1 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFAN_ARRIVAL = 0x0 + IFAN_DEPARTURE = 0x1 + IFA_ROUTE = 0x1 + IFF_ALLMULTI = 0x200 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x8e52 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NOTRAILERS = 0x20 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BLUETOOTH = 0xf8 + IFT_BRIDGE = 0xd1 + IFT_BSC = 0x53 + IFT_CARP = 0xf7 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DOCSCABLEUPSTREAMCHANNEL = 0xcd + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DUMMY = 0xf1 + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ECONET = 0xce + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAITH = 0xf3 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE1394 = 0x90 + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_INFINIBAND = 0xc7 + IFT_INTERLEAVE = 0x7c + IFT_IP = 0x7e + IFT_IPFORWARD = 0x8e + IFT_IPOVERATM = 0x72 + IFT_IPOVERCDLC = 0x6d + IFT_IPOVERCLAW = 0x6e + IFT_IPSWITCH = 0x4e + IFT_ISDN = 0x3f + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISDNS = 0x4b + IFT_ISDNU = 0x4c + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88025CRFPINT = 0x62 + IFT_ISO88025DTR = 0x56 + IFT_ISO88025FIBER = 0x73 + IFT_ISO88026 = 0xa + IFT_ISUP = 0xb3 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_L3IPXVLAN = 0x89 + IFT_LAPB = 0x10 + IFT_LAPD = 0x4d + IFT_LAPF = 0x77 + IFT_LINEGROUP = 0xd2 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf5 + IFT_PFLOW = 0xf9 + IFT_PFSYNC = 0xf6 + IFT_PLC = 0xae + IFT_PON155 = 0xcf + IFT_PON622 = 0xd0 + IFT_POS = 0xab + IFT_PPP = 0x17 + IFT_PPPMULTILINKBUNDLE = 0x6c + IFT_PROPATM = 0xc5 + IFT_PROPBWAP2MP = 0xb8 + IFT_PROPCNLS = 0x59 + IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 + IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 + IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PROPWIRELESSP2P = 0x9d + IFT_PTPSERIAL = 0x16 + IFT_PVC = 0xf2 + IFT_Q2931 = 0xc9 + IFT_QLLC = 0x44 + IFT_RADIOMAC = 0xbc + IFT_RADSL = 0x5f + IFT_REACHDSL = 0xc0 + IFT_RFC1483 = 0x9f + IFT_RS232 = 0x21 + IFT_RSRB = 0x4f + IFT_SDLC = 0x11 + IFT_SDSL = 0x60 + IFT_SHDSL = 0xa9 + IFT_SIP = 0x1f + IFT_SIPSIG = 0xcc + IFT_SIPTG = 0xcb + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETOVERHEADCHANNEL = 0xb9 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_SRP = 0x97 + IFT_SS7SIGLINK = 0x9c + IFT_STACKTOSTACK = 0x6f + IFT_STARLAN = 0xb + IFT_T1 = 0x12 + IFT_TDLC = 0x74 + IFT_TELINK = 0xc8 + IFT_TERMPAD = 0x5b + IFT_TR008 = 0xb0 + IFT_TRANSPHDLC = 0x7b + IFT_TUNNEL = 0x83 + IFT_ULTRA = 0x1d + IFT_USB = 0xa0 + IFT_V11 = 0x40 + IFT_V35 = 0x2d + IFT_V36 = 0x41 + IFT_V37 = 0x78 + IFT_VDSL = 0x61 + IFT_VIRTUALIPADDRESS = 0x70 + IFT_VIRTUALTG = 0xca + IFT_VOICEDID = 0xd5 + IFT_VOICEEM = 0x64 + IFT_VOICEEMFGD = 0xd3 + IFT_VOICEENCAP = 0x67 + IFT_VOICEFGDEANA = 0xd4 + IFT_VOICEFXO = 0x65 + IFT_VOICEFXS = 0x66 + IFT_VOICEOVERATM = 0x98 + IFT_VOICEOVERCABLE = 0xc6 + IFT_VOICEOVERFRAMERELAY = 0x99 + IFT_VOICEOVERIP = 0x68 + IFT_X213 = 0x5d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25HUNTGROUP = 0x7a + IFT_X25MLP = 0x79 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IN_RFC3021_HOST = 0x1 + IN_RFC3021_NET = 0xfffffffe + IN_RFC3021_NSHIFT = 0x1f + IPPROTO_AH = 0x33 + IPPROTO_CARP = 0x70 + IPPROTO_DIVERT = 0x102 + IPPROTO_DIVERT_INIT = 0x2 + IPPROTO_DIVERT_RESP = 0x1 + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPIP = 0x4 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x103 + IPPROTO_MOBILE = 0x37 + IPPROTO_MPLS = 0x89 + IPPROTO_NONE = 0x3b + IPPROTO_PFSYNC = 0xf0 + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPV6_AUTH_LEVEL = 0x35 + IPV6_AUTOFLOWLABEL = 0x3b + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_ESP_NETWORK_LEVEL = 0x37 + IPV6_ESP_TRANS_LEVEL = 0x36 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FRAGTTL = 0x78 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPCOMP_LEVEL = 0x3c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXPACKET = 0xffff + IPV6_MMTU = 0x500 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_OPTIONS = 0x1 + IPV6_PATHMTU = 0x2c + IPV6_PIPEX = 0x3f + IPV6_PKTINFO = 0x2e + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVDSTPORT = 0x40 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RTABLE = 0x1021 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_AUTH_LEVEL = 0x14 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DIVERTFL = 0x1022 + IP_DROP_MEMBERSHIP = 0xd + IP_ESP_NETWORK_LEVEL = 0x16 + IP_ESP_TRANS_LEVEL = 0x15 + IP_HDRINCL = 0x2 + IP_IPCOMP_LEVEL = 0x1d + IP_IPSECFLOWINFO = 0x24 + IP_IPSEC_LOCAL_AUTH = 0x1b + IP_IPSEC_LOCAL_CRED = 0x19 + IP_IPSEC_LOCAL_ID = 0x17 + IP_IPSEC_REMOTE_AUTH = 0x1c + IP_IPSEC_REMOTE_CRED = 0x1a + IP_IPSEC_REMOTE_ID = 0x18 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0xfff + IP_MF = 0x2000 + IP_MINTTL = 0x20 + IP_MIN_MEMBERSHIPS = 0xf + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x1 + IP_PIPEX = 0x22 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVDSTPORT = 0x21 + IP_RECVIF = 0x1e + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVRTABLE = 0x23 + IP_RECVTTL = 0x1f + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RTABLE = 0x1021 + IP_TOS = 0x3 + IP_TTL = 0x4 + ISIG = 0x80 + ISTRIP = 0x20 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + KERN_HOSTNAME = 0xa + KERN_OSRELEASE = 0x2 + KERN_OSTYPE = 0x1 + KERN_VERSION = 0x4 + LCNT_OVERLOAD_FLUSH = 0x6 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x6 + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_SPACEAVAIL = 0x5 + MADV_WILLNEED = 0x3 + MAP_ANON = 0x1000 + MAP_COPY = 0x4 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_FLAGMASK = 0x1ff7 + MAP_HASSEMAPHORE = 0x200 + MAP_INHERIT = 0x80 + MAP_INHERIT_COPY = 0x1 + MAP_INHERIT_DONATE_COPY = 0x3 + MAP_INHERIT_NONE = 0x2 + MAP_INHERIT_SHARE = 0x0 + MAP_NOEXTEND = 0x100 + MAP_NORESERVE = 0x40 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_SHARED = 0x1 + MAP_TRYFIXED = 0x400 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MNT_ASYNC = 0x40 + MNT_DEFEXPORTED = 0x200 + MNT_DELEXPORT = 0x20000 + MNT_DOOMED = 0x8000000 + MNT_EXPORTANON = 0x400 + MNT_EXPORTED = 0x100 + MNT_EXRDONLY = 0x80 + MNT_FORCE = 0x80000 + MNT_LAZY = 0x3 + MNT_LOCAL = 0x1000 + MNT_NOATIME = 0x8000 + MNT_NODEV = 0x10 + MNT_NOEXEC = 0x4 + MNT_NOSUID = 0x8 + MNT_NOWAIT = 0x2 + MNT_QUOTA = 0x2000 + MNT_RDONLY = 0x1 + MNT_RELOAD = 0x40000 + MNT_ROOTFS = 0x4000 + MNT_SOFTDEP = 0x4000000 + MNT_SYNCHRONOUS = 0x2 + MNT_UPDATE = 0x10000 + MNT_VISFLAGMASK = 0x400ffff + MNT_WAIT = 0x1 + MNT_WANTRDWR = 0x2000000 + MNT_WXALLOWED = 0x800 + MSG_BCAST = 0x100 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOR = 0x8 + MSG_MCAST = 0x200 + MSG_NOSIGNAL = 0x400 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x4 + MS_SYNC = 0x2 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_MAXID = 0x6 + NET_RT_STATS = 0x4 + NET_RT_TABLE = 0x5 + NOFLSH = 0x80000000 + NOTE_ATTRIB = 0x8 + NOTE_CHILD = 0x4 + NOTE_DELETE = 0x1 + NOTE_EOF = 0x2 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXTEND = 0x4 + NOTE_FORK = 0x40000000 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_PCTRLMASK = 0xf0000000 + NOTE_PDATAMASK = 0xfffff + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRUNCATE = 0x80 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + ONLCR = 0x2 + ONLRET = 0x80 + ONOCR = 0x40 + ONOEOT = 0x8 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x10000 + O_CREAT = 0x200 + O_DIRECTORY = 0x20000 + O_DSYNC = 0x80 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x80 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PF_FLUSH = 0x1 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PT_MASK = 0x3ff000 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_NOFILE = 0x8 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_LABEL = 0xa + RTAX_MAX = 0xb + RTAX_NETMASK = 0x2 + RTAX_SRC = 0x8 + RTAX_SRCMASK = 0x9 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_LABEL = 0x400 + RTA_NETMASK = 0x4 + RTA_SRC = 0x100 + RTA_SRCMASK = 0x200 + RTF_ANNOUNCE = 0x4000 + RTF_BLACKHOLE = 0x1000 + RTF_CLONED = 0x10000 + RTF_CLONING = 0x100 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_FMASK = 0x10f808 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_LLINFO = 0x400 + RTF_MASK = 0x80 + RTF_MODIFIED = 0x20 + RTF_MPATH = 0x40000 + RTF_MPLS = 0x100000 + RTF_PERMANENT_ARP = 0x2000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x2000 + RTF_REJECT = 0x8 + RTF_SOURCE = 0x20000 + RTF_STATIC = 0x800 + RTF_TUNNEL = 0x100000 + RTF_UP = 0x1 + RTF_USETRAILERS = 0x8000 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DESYNC = 0x10 + RTM_GET = 0x4 + RTM_IFANNOUNCE = 0xf + RTM_IFINFO = 0xe + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MAXSIZE = 0x800 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RT_TABLEID_MAX = 0xff + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x4 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCAIFADDR = 0x8040691a + SIOCAIFGROUP = 0x80246987 + SIOCALIFADDR = 0x8218691c + SIOCATMARK = 0x40047307 + SIOCBRDGADD = 0x8054693c + SIOCBRDGADDS = 0x80546941 + SIOCBRDGARL = 0x806e694d + SIOCBRDGDADDR = 0x81286947 + SIOCBRDGDEL = 0x8054693d + SIOCBRDGDELS = 0x80546942 + SIOCBRDGFLUSH = 0x80546948 + SIOCBRDGFRL = 0x806e694e + SIOCBRDGGCACHE = 0xc0146941 + SIOCBRDGGFD = 0xc0146952 + SIOCBRDGGHT = 0xc0146951 + SIOCBRDGGIFFLGS = 0xc054693e + SIOCBRDGGMA = 0xc0146953 + SIOCBRDGGPARAM = 0xc03c6958 + SIOCBRDGGPRI = 0xc0146950 + SIOCBRDGGRL = 0xc028694f + SIOCBRDGGSIFS = 0xc054693c + SIOCBRDGGTO = 0xc0146946 + SIOCBRDGIFS = 0xc0546942 + SIOCBRDGRTS = 0xc0186943 + SIOCBRDGSADDR = 0xc1286944 + SIOCBRDGSCACHE = 0x80146940 + SIOCBRDGSFD = 0x80146952 + SIOCBRDGSHT = 0x80146951 + SIOCBRDGSIFCOST = 0x80546955 + SIOCBRDGSIFFLGS = 0x8054693f + SIOCBRDGSIFPRIO = 0x80546954 + SIOCBRDGSMA = 0x80146953 + SIOCBRDGSPRI = 0x80146950 + SIOCBRDGSPROTO = 0x8014695a + SIOCBRDGSTO = 0x80146945 + SIOCBRDGSTXHC = 0x80146959 + SIOCDELMULTI = 0x80206932 + SIOCDIFADDR = 0x80206919 + SIOCDIFGROUP = 0x80246989 + SIOCDIFPHYADDR = 0x80206949 + SIOCDLIFADDR = 0x8218691e + SIOCGETKALIVE = 0xc01869a4 + SIOCGETLABEL = 0x8020699a + SIOCGETPFLOW = 0xc02069fe + SIOCGETPFSYNC = 0xc02069f8 + SIOCGETSGCNT = 0xc0147534 + SIOCGETVIFCNT = 0xc0147533 + SIOCGETVLAN = 0xc0206990 + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0206921 + SIOCGIFASYNCMAP = 0xc020697c + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCONF = 0xc0086924 + SIOCGIFDATA = 0xc020691b + SIOCGIFDESCR = 0xc0206981 + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGATTR = 0xc024698b + SIOCGIFGENERIC = 0xc020693a + SIOCGIFGMEMB = 0xc024698a + SIOCGIFGROUP = 0xc0246988 + SIOCGIFHARDMTU = 0xc02069a5 + SIOCGIFMEDIA = 0xc0286936 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc020697e + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206948 + SIOCGIFPRIORITY = 0xc020699c + SIOCGIFPSRCADDR = 0xc0206947 + SIOCGIFRDOMAIN = 0xc02069a0 + SIOCGIFRTLABEL = 0xc0206983 + SIOCGIFTIMESLOT = 0xc0206986 + SIOCGIFXFLAGS = 0xc020699e + SIOCGLIFADDR = 0xc218691d + SIOCGLIFPHYADDR = 0xc218694b + SIOCGLIFPHYRTABLE = 0xc02069a2 + SIOCGLIFPHYTTL = 0xc02069a9 + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCGSPPPPARAMS = 0xc0206994 + SIOCGVH = 0xc02069f6 + SIOCGVNETID = 0xc02069a7 + SIOCIFCREATE = 0x8020697a + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc00c6978 + SIOCSETKALIVE = 0x801869a3 + SIOCSETLABEL = 0x80206999 + SIOCSETPFLOW = 0x802069fd + SIOCSETPFSYNC = 0x802069f7 + SIOCSETVLAN = 0x8020698f + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFASYNCMAP = 0x8020697d + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFDESCR = 0x80206980 + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGATTR = 0x8024698c + SIOCSIFGENERIC = 0x80206939 + SIOCSIFLLADDR = 0x8020691f + SIOCSIFMEDIA = 0xc0206935 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x8020697f + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x80406946 + SIOCSIFPRIORITY = 0x8020699b + SIOCSIFRDOMAIN = 0x8020699f + SIOCSIFRTLABEL = 0x80206982 + SIOCSIFTIMESLOT = 0x80206985 + SIOCSIFXFLAGS = 0x8020699d + SIOCSLIFPHYADDR = 0x8218694a + SIOCSLIFPHYRTABLE = 0x802069a1 + SIOCSLIFPHYTTL = 0x802069a8 + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SIOCSSPPPPARAMS = 0x80206993 + SIOCSVH = 0xc02069f5 + SIOCSVNETID = 0x802069a6 + SOCK_DGRAM = 0x2 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_BINDANY = 0x1000 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_NETPROC = 0x1020 + SO_OOBINLINE = 0x100 + SO_PEERCRED = 0x1022 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_RTABLE = 0x1021 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_SPLICE = 0x1023 + SO_TIMESTAMP = 0x800 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISTXT = 0x200 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TCIFLUSH = 0x1 + TCIOFLUSH = 0x3 + TCOFLUSH = 0x2 + TCP_MAXBURST = 0x4 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x3 + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0x4 + TCP_MSS = 0x200 + TCP_NODELAY = 0x1 + TCP_NOPUSH = 0x10 + TCP_NSTATES = 0xb + TCP_SACK_ENABLE = 0x8 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLAG_CLOCAL = 0x2 + TIOCFLAG_CRTSCTS = 0x4 + TIOCFLAG_MDMBUF = 0x8 + TIOCFLAG_PPS = 0x10 + TIOCFLAG_SOFTCAR = 0x1 + TIOCFLUSH = 0x80047410 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGFLAGS = 0x4004745d + TIOCGPGRP = 0x40047477 + TIOCGSID = 0x40047463 + TIOCGTSTAMP = 0x400c745b + TIOCGWINSZ = 0x40087468 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGET = 0x4004746a + TIOCMODG = 0x4004746a + TIOCMODS = 0x8004746d + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSFLAGS = 0x8004745c + TIOCSIG = 0x8004745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x80047465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSTSTAMP = 0x8008745a + TIOCSWINSZ = 0x80087467 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WALTSIG = 0x4 + WCONTINUED = 0x8 + WCOREFLAG = 0x80 + WNOHANG = 0x1 + WSTOPPED = 0x7f + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADF = syscall.Errno(0x9) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x58) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDOM = syscall.Errno(0x21) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x59) + EILSEQ = syscall.Errno(0x54) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EIPSEC = syscall.Errno(0x52) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x5b) + ELOOP = syscall.Errno(0x3e) + EMEDIUMTYPE = syscall.Errno(0x56) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x53) + ENOBUFS = syscall.Errno(0x37) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOMEDIUM = syscall.Errno(0x55) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x5a) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x5b) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x57) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTHR = syscall.Signal(0x20) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "device not configured"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EDEADLK", "resource deadlock avoided"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "cross-device link"}, + {19, "ENODEV", "operation not supported by device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "result too large"}, + {35, "EWOULDBLOCK", "resource temporarily unavailable"}, + {36, "EINPROGRESS", "operation now in progress"}, + {37, "EALREADY", "operation already in progress"}, + {38, "ENOTSOCK", "socket operation on non-socket"}, + {39, "EDESTADDRREQ", "destination address required"}, + {40, "EMSGSIZE", "message too long"}, + {41, "EPROTOTYPE", "protocol wrong type for socket"}, + {42, "ENOPROTOOPT", "protocol not available"}, + {43, "EPROTONOSUPPORT", "protocol not supported"}, + {44, "ESOCKTNOSUPPORT", "socket type not supported"}, + {45, "EOPNOTSUPP", "operation not supported"}, + {46, "EPFNOSUPPORT", "protocol family not supported"}, + {47, "EAFNOSUPPORT", "address family not supported by protocol family"}, + {48, "EADDRINUSE", "address already in use"}, + {49, "EADDRNOTAVAIL", "can't assign requested address"}, + {50, "ENETDOWN", "network is down"}, + {51, "ENETUNREACH", "network is unreachable"}, + {52, "ENETRESET", "network dropped connection on reset"}, + {53, "ECONNABORTED", "software caused connection abort"}, + {54, "ECONNRESET", "connection reset by peer"}, + {55, "ENOBUFS", "no buffer space available"}, + {56, "EISCONN", "socket is already connected"}, + {57, "ENOTCONN", "socket is not connected"}, + {58, "ESHUTDOWN", "can't send after socket shutdown"}, + {59, "ETOOMANYREFS", "too many references: can't splice"}, + {60, "ETIMEDOUT", "operation timed out"}, + {61, "ECONNREFUSED", "connection refused"}, + {62, "ELOOP", "too many levels of symbolic links"}, + {63, "ENAMETOOLONG", "file name too long"}, + {64, "EHOSTDOWN", "host is down"}, + {65, "EHOSTUNREACH", "no route to host"}, + {66, "ENOTEMPTY", "directory not empty"}, + {67, "EPROCLIM", "too many processes"}, + {68, "EUSERS", "too many users"}, + {69, "EDQUOT", "disk quota exceeded"}, + {70, "ESTALE", "stale NFS file handle"}, + {71, "EREMOTE", "too many levels of remote in path"}, + {72, "EBADRPC", "RPC struct is bad"}, + {73, "ERPCMISMATCH", "RPC version wrong"}, + {74, "EPROGUNAVAIL", "RPC program not available"}, + {75, "EPROGMISMATCH", "program version wrong"}, + {76, "EPROCUNAVAIL", "bad procedure for program"}, + {77, "ENOLCK", "no locks available"}, + {78, "ENOSYS", "function not implemented"}, + {79, "EFTYPE", "inappropriate file type or format"}, + {80, "EAUTH", "authentication error"}, + {81, "ENEEDAUTH", "need authenticator"}, + {82, "EIPSEC", "IPsec processing failure"}, + {83, "ENOATTR", "attribute not found"}, + {84, "EILSEQ", "illegal byte sequence"}, + {85, "ENOMEDIUM", "no medium found"}, + {86, "EMEDIUMTYPE", "wrong medium type"}, + {87, "EOVERFLOW", "value too large to be stored in data type"}, + {88, "ECANCELED", "operation canceled"}, + {89, "EIDRM", "identifier removed"}, + {90, "ENOMSG", "no message of desired type"}, + {91, "ELAST", "not supported"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/BPT trap"}, + {6, "SIGABRT", "abort trap"}, + {7, "SIGEMT", "EMT trap"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGBUS", "bus error"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGSYS", "bad system call"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGURG", "urgent I/O condition"}, + {17, "SIGSTOP", "suspended (signal)"}, + {18, "SIGTSTP", "suspended"}, + {19, "SIGCONT", "continued"}, + {20, "SIGCHLD", "child exited"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGIO", "I/O possible"}, + {24, "SIGXCPU", "cputime limit exceeded"}, + {25, "SIGXFSZ", "filesize limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window size changes"}, + {29, "SIGINFO", "information request"}, + {30, "SIGUSR1", "user defined signal 1"}, + {31, "SIGUSR2", "user defined signal 2"}, + {32, "SIGTHR", "thread AST"}, +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go new file mode 100644 index 00000000..1f9e8a29 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go @@ -0,0 +1,1765 @@ +// mkerrors.sh -m64 +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,openbsd + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m64 _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_BLUETOOTH = 0x20 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_ENCAP = 0x1c + AF_HYLINK = 0xf + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x18 + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_KEY = 0x1e + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x24 + AF_MPLS = 0x21 + AF_NATM = 0x1b + AF_NS = 0x6 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x11 + AF_SIP = 0x1d + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + ALTWERASE = 0x200 + ARPHRD_ETHER = 0x1 + ARPHRD_FRELAY = 0xf + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B9600 = 0x2580 + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDIRFILT = 0x4004427c + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc010427b + BIOCGETIF = 0x4020426b + BIOCGFILDROP = 0x40044278 + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044273 + BIOCGRTIMEOUT = 0x4010426e + BIOCGSTATS = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCLOCK = 0x20004276 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDIRFILT = 0x8004427d + BIOCSDLT = 0x8004427a + BIOCSETF = 0x80104267 + BIOCSETIF = 0x8020426c + BIOCSETWF = 0x80104277 + BIOCSFILDROP = 0x80044279 + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044272 + BIOCSRTIMEOUT = 0x8010426d + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIRECTION_IN = 0x1 + BPF_DIRECTION_OUT = 0x2 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x200000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + CFLUSH = 0xf + CLOCAL = 0x8000 + CLOCK_BOOTTIME = 0x6 + CLOCK_MONOTONIC = 0x3 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_THREAD_CPUTIME_ID = 0x4 + CLOCK_UPTIME = 0x5 + CREAD = 0x800 + CRTSCTS = 0x10000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0xff + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_HW = 0x6 + CTL_KERN = 0x1 + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + DIOCOSFPFLUSH = 0x2000444e + DLT_ARCNET = 0x7 + DLT_ATM_RFC1483 = 0xb + DLT_AX25 = 0x3 + DLT_CHAOS = 0x5 + DLT_C_HDLC = 0x68 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0xd + DLT_FDDI = 0xa + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_LOOP = 0xc + DLT_MPLS = 0xdb + DLT_NULL = 0x0 + DLT_OPENFLOW = 0x10b + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_SERIAL = 0x32 + DLT_PRONET = 0x4 + DLT_RAW = 0xe + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DLT_USBPCAP = 0xf9 + DLT_USER0 = 0x93 + DLT_USER1 = 0x94 + DLT_USER10 = 0x9d + DLT_USER11 = 0x9e + DLT_USER12 = 0x9f + DLT_USER13 = 0xa0 + DLT_USER14 = 0xa1 + DLT_USER15 = 0xa2 + DLT_USER2 = 0x95 + DLT_USER3 = 0x96 + DLT_USER4 = 0x97 + DLT_USER5 = 0x98 + DLT_USER6 = 0x99 + DLT_USER7 = 0x9a + DLT_USER8 = 0x9b + DLT_USER9 = 0x9c + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EMT_TAGOVF = 0x1 + EMUL_ENABLED = 0x1 + EMUL_NATIVE = 0x2 + ENDRUNDISC = 0x9 + ETHERMIN = 0x2e + ETHERMTU = 0x5dc + ETHERTYPE_8023 = 0x4 + ETHERTYPE_AARP = 0x80f3 + ETHERTYPE_ACCTON = 0x8390 + ETHERTYPE_AEONIC = 0x8036 + ETHERTYPE_ALPHA = 0x814a + ETHERTYPE_AMBER = 0x6008 + ETHERTYPE_AMOEBA = 0x8145 + ETHERTYPE_AOE = 0x88a2 + ETHERTYPE_APOLLO = 0x80f7 + ETHERTYPE_APOLLODOMAIN = 0x8019 + ETHERTYPE_APPLETALK = 0x809b + ETHERTYPE_APPLITEK = 0x80c7 + ETHERTYPE_ARGONAUT = 0x803a + ETHERTYPE_ARP = 0x806 + ETHERTYPE_AT = 0x809b + ETHERTYPE_ATALK = 0x809b + ETHERTYPE_ATOMIC = 0x86df + ETHERTYPE_ATT = 0x8069 + ETHERTYPE_ATTSTANFORD = 0x8008 + ETHERTYPE_AUTOPHON = 0x806a + ETHERTYPE_AXIS = 0x8856 + ETHERTYPE_BCLOOP = 0x9003 + ETHERTYPE_BOFL = 0x8102 + ETHERTYPE_CABLETRON = 0x7034 + ETHERTYPE_CHAOS = 0x804 + ETHERTYPE_COMDESIGN = 0x806c + ETHERTYPE_COMPUGRAPHIC = 0x806d + ETHERTYPE_COUNTERPOINT = 0x8062 + ETHERTYPE_CRONUS = 0x8004 + ETHERTYPE_CRONUSVLN = 0x8003 + ETHERTYPE_DCA = 0x1234 + ETHERTYPE_DDE = 0x807b + ETHERTYPE_DEBNI = 0xaaaa + ETHERTYPE_DECAM = 0x8048 + ETHERTYPE_DECCUST = 0x6006 + ETHERTYPE_DECDIAG = 0x6005 + ETHERTYPE_DECDNS = 0x803c + ETHERTYPE_DECDTS = 0x803e + ETHERTYPE_DECEXPER = 0x6000 + ETHERTYPE_DECLAST = 0x8041 + ETHERTYPE_DECLTM = 0x803f + ETHERTYPE_DECMUMPS = 0x6009 + ETHERTYPE_DECNETBIOS = 0x8040 + ETHERTYPE_DELTACON = 0x86de + ETHERTYPE_DIDDLE = 0x4321 + ETHERTYPE_DLOG1 = 0x660 + ETHERTYPE_DLOG2 = 0x661 + ETHERTYPE_DN = 0x6003 + ETHERTYPE_DOGFIGHT = 0x1989 + ETHERTYPE_DSMD = 0x8039 + ETHERTYPE_ECMA = 0x803 + ETHERTYPE_ENCRYPT = 0x803d + ETHERTYPE_ES = 0x805d + ETHERTYPE_EXCELAN = 0x8010 + ETHERTYPE_EXPERDATA = 0x8049 + ETHERTYPE_FLIP = 0x8146 + ETHERTYPE_FLOWCONTROL = 0x8808 + ETHERTYPE_FRARP = 0x808 + ETHERTYPE_GENDYN = 0x8068 + ETHERTYPE_HAYES = 0x8130 + ETHERTYPE_HIPPI_FP = 0x8180 + ETHERTYPE_HITACHI = 0x8820 + ETHERTYPE_HP = 0x8005 + ETHERTYPE_IEEEPUP = 0xa00 + ETHERTYPE_IEEEPUPAT = 0xa01 + ETHERTYPE_IMLBL = 0x4c42 + ETHERTYPE_IMLBLDIAG = 0x424c + ETHERTYPE_IP = 0x800 + ETHERTYPE_IPAS = 0x876c + ETHERTYPE_IPV6 = 0x86dd + ETHERTYPE_IPX = 0x8137 + ETHERTYPE_IPXNEW = 0x8037 + ETHERTYPE_KALPANA = 0x8582 + ETHERTYPE_LANBRIDGE = 0x8038 + ETHERTYPE_LANPROBE = 0x8888 + ETHERTYPE_LAT = 0x6004 + ETHERTYPE_LBACK = 0x9000 + ETHERTYPE_LITTLE = 0x8060 + ETHERTYPE_LLDP = 0x88cc + ETHERTYPE_LOGICRAFT = 0x8148 + ETHERTYPE_LOOPBACK = 0x9000 + ETHERTYPE_MATRA = 0x807a + ETHERTYPE_MAX = 0xffff + ETHERTYPE_MERIT = 0x807c + ETHERTYPE_MICP = 0x873a + ETHERTYPE_MOPDL = 0x6001 + ETHERTYPE_MOPRC = 0x6002 + ETHERTYPE_MOTOROLA = 0x818d + ETHERTYPE_MPLS = 0x8847 + ETHERTYPE_MPLS_MCAST = 0x8848 + ETHERTYPE_MUMPS = 0x813f + ETHERTYPE_NBPCC = 0x3c04 + ETHERTYPE_NBPCLAIM = 0x3c09 + ETHERTYPE_NBPCLREQ = 0x3c05 + ETHERTYPE_NBPCLRSP = 0x3c06 + ETHERTYPE_NBPCREQ = 0x3c02 + ETHERTYPE_NBPCRSP = 0x3c03 + ETHERTYPE_NBPDG = 0x3c07 + ETHERTYPE_NBPDGB = 0x3c08 + ETHERTYPE_NBPDLTE = 0x3c0a + ETHERTYPE_NBPRAR = 0x3c0c + ETHERTYPE_NBPRAS = 0x3c0b + ETHERTYPE_NBPRST = 0x3c0d + ETHERTYPE_NBPSCD = 0x3c01 + ETHERTYPE_NBPVCD = 0x3c00 + ETHERTYPE_NBS = 0x802 + ETHERTYPE_NCD = 0x8149 + ETHERTYPE_NESTAR = 0x8006 + ETHERTYPE_NETBEUI = 0x8191 + ETHERTYPE_NOVELL = 0x8138 + ETHERTYPE_NS = 0x600 + ETHERTYPE_NSAT = 0x601 + ETHERTYPE_NSCOMPAT = 0x807 + ETHERTYPE_NTRAILER = 0x10 + ETHERTYPE_OS9 = 0x7007 + ETHERTYPE_OS9NET = 0x7009 + ETHERTYPE_PACER = 0x80c6 + ETHERTYPE_PAE = 0x888e + ETHERTYPE_PCS = 0x4242 + ETHERTYPE_PLANNING = 0x8044 + ETHERTYPE_PPP = 0x880b + ETHERTYPE_PPPOE = 0x8864 + ETHERTYPE_PPPOEDISC = 0x8863 + ETHERTYPE_PRIMENTS = 0x7031 + ETHERTYPE_PUP = 0x200 + ETHERTYPE_PUPAT = 0x200 + ETHERTYPE_QINQ = 0x88a8 + ETHERTYPE_RACAL = 0x7030 + ETHERTYPE_RATIONAL = 0x8150 + ETHERTYPE_RAWFR = 0x6559 + ETHERTYPE_RCL = 0x1995 + ETHERTYPE_RDP = 0x8739 + ETHERTYPE_RETIX = 0x80f2 + ETHERTYPE_REVARP = 0x8035 + ETHERTYPE_SCA = 0x6007 + ETHERTYPE_SECTRA = 0x86db + ETHERTYPE_SECUREDATA = 0x876d + ETHERTYPE_SGITW = 0x817e + ETHERTYPE_SG_BOUNCE = 0x8016 + ETHERTYPE_SG_DIAG = 0x8013 + ETHERTYPE_SG_NETGAMES = 0x8014 + ETHERTYPE_SG_RESV = 0x8015 + ETHERTYPE_SIMNET = 0x5208 + ETHERTYPE_SLOW = 0x8809 + ETHERTYPE_SNA = 0x80d5 + ETHERTYPE_SNMP = 0x814c + ETHERTYPE_SONIX = 0xfaf5 + ETHERTYPE_SPIDER = 0x809f + ETHERTYPE_SPRITE = 0x500 + ETHERTYPE_STP = 0x8181 + ETHERTYPE_TALARIS = 0x812b + ETHERTYPE_TALARISMC = 0x852b + ETHERTYPE_TCPCOMP = 0x876b + ETHERTYPE_TCPSM = 0x9002 + ETHERTYPE_TEC = 0x814f + ETHERTYPE_TIGAN = 0x802f + ETHERTYPE_TRAIL = 0x1000 + ETHERTYPE_TRANSETHER = 0x6558 + ETHERTYPE_TYMSHARE = 0x802e + ETHERTYPE_UBBST = 0x7005 + ETHERTYPE_UBDEBUG = 0x900 + ETHERTYPE_UBDIAGLOOP = 0x7002 + ETHERTYPE_UBDL = 0x7000 + ETHERTYPE_UBNIU = 0x7001 + ETHERTYPE_UBNMC = 0x7003 + ETHERTYPE_VALID = 0x1600 + ETHERTYPE_VARIAN = 0x80dd + ETHERTYPE_VAXELN = 0x803b + ETHERTYPE_VEECO = 0x8067 + ETHERTYPE_VEXP = 0x805b + ETHERTYPE_VGLAB = 0x8131 + ETHERTYPE_VINES = 0xbad + ETHERTYPE_VINESECHO = 0xbaf + ETHERTYPE_VINESLOOP = 0xbae + ETHERTYPE_VITAL = 0xff00 + ETHERTYPE_VLAN = 0x8100 + ETHERTYPE_VLTLMAN = 0x8080 + ETHERTYPE_VPROD = 0x805c + ETHERTYPE_VURESERVED = 0x8147 + ETHERTYPE_WATERLOO = 0x8130 + ETHERTYPE_WELLFLEET = 0x8103 + ETHERTYPE_X25 = 0x805 + ETHERTYPE_X75 = 0x801 + ETHERTYPE_XNSSM = 0x9001 + ETHERTYPE_XTP = 0x817d + ETHER_ADDR_LEN = 0x6 + ETHER_ALIGN = 0x2 + ETHER_CRC_LEN = 0x4 + ETHER_CRC_POLY_BE = 0x4c11db6 + ETHER_CRC_POLY_LE = 0xedb88320 + ETHER_HDR_LEN = 0xe + ETHER_MAX_DIX_LEN = 0x600 + ETHER_MAX_HARDMTU_LEN = 0xff9b + ETHER_MAX_LEN = 0x5ee + ETHER_MIN_LEN = 0x40 + ETHER_TYPE_LEN = 0x2 + ETHER_VLAN_ENCAP_LEN = 0x4 + EVFILT_AIO = -0x3 + EVFILT_DEVICE = -0x8 + EVFILT_PROC = -0x5 + EVFILT_READ = -0x1 + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0x8 + EVFILT_TIMER = -0x7 + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EVL_ENCAPLEN = 0x4 + EVL_PRIO_BITS = 0xd + EVL_PRIO_MAX = 0x7 + EVL_VLID_MASK = 0xfff + EVL_VLID_MAX = 0xffe + EVL_VLID_MIN = 0x1 + EVL_VLID_NULL = 0x0 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_DISPATCH = 0x80 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_RECEIPT = 0x40 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FLUSHO = 0x800000 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0xa + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETOWN = 0x5 + F_ISATTY = 0xb + F_OK = 0x0 + F_RDLCK = 0x1 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETOWN = 0x6 + F_UNLCK = 0x2 + F_WRLCK = 0x3 + HUPCL = 0x4000 + HW_MACHINE = 0x1 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFAN_ARRIVAL = 0x0 + IFAN_DEPARTURE = 0x1 + IFF_ALLMULTI = 0x200 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x8e52 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_STATICARP = 0x20 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BLUETOOTH = 0xf8 + IFT_BRIDGE = 0xd1 + IFT_BSC = 0x53 + IFT_CARP = 0xf7 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DOCSCABLEUPSTREAMCHANNEL = 0xcd + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DUMMY = 0xf1 + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ECONET = 0xce + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAITH = 0xf3 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE1394 = 0x90 + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_INFINIBAND = 0xc7 + IFT_INTERLEAVE = 0x7c + IFT_IP = 0x7e + IFT_IPFORWARD = 0x8e + IFT_IPOVERATM = 0x72 + IFT_IPOVERCDLC = 0x6d + IFT_IPOVERCLAW = 0x6e + IFT_IPSWITCH = 0x4e + IFT_ISDN = 0x3f + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISDNS = 0x4b + IFT_ISDNU = 0x4c + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88025CRFPINT = 0x62 + IFT_ISO88025DTR = 0x56 + IFT_ISO88025FIBER = 0x73 + IFT_ISO88026 = 0xa + IFT_ISUP = 0xb3 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_L3IPXVLAN = 0x89 + IFT_LAPB = 0x10 + IFT_LAPD = 0x4d + IFT_LAPF = 0x77 + IFT_LINEGROUP = 0xd2 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MBIM = 0xfa + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf5 + IFT_PFLOW = 0xf9 + IFT_PFSYNC = 0xf6 + IFT_PLC = 0xae + IFT_PON155 = 0xcf + IFT_PON622 = 0xd0 + IFT_POS = 0xab + IFT_PPP = 0x17 + IFT_PPPMULTILINKBUNDLE = 0x6c + IFT_PROPATM = 0xc5 + IFT_PROPBWAP2MP = 0xb8 + IFT_PROPCNLS = 0x59 + IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 + IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 + IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PROPWIRELESSP2P = 0x9d + IFT_PTPSERIAL = 0x16 + IFT_PVC = 0xf2 + IFT_Q2931 = 0xc9 + IFT_QLLC = 0x44 + IFT_RADIOMAC = 0xbc + IFT_RADSL = 0x5f + IFT_REACHDSL = 0xc0 + IFT_RFC1483 = 0x9f + IFT_RS232 = 0x21 + IFT_RSRB = 0x4f + IFT_SDLC = 0x11 + IFT_SDSL = 0x60 + IFT_SHDSL = 0xa9 + IFT_SIP = 0x1f + IFT_SIPSIG = 0xcc + IFT_SIPTG = 0xcb + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETOVERHEADCHANNEL = 0xb9 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_SRP = 0x97 + IFT_SS7SIGLINK = 0x9c + IFT_STACKTOSTACK = 0x6f + IFT_STARLAN = 0xb + IFT_T1 = 0x12 + IFT_TDLC = 0x74 + IFT_TELINK = 0xc8 + IFT_TERMPAD = 0x5b + IFT_TR008 = 0xb0 + IFT_TRANSPHDLC = 0x7b + IFT_TUNNEL = 0x83 + IFT_ULTRA = 0x1d + IFT_USB = 0xa0 + IFT_V11 = 0x40 + IFT_V35 = 0x2d + IFT_V36 = 0x41 + IFT_V37 = 0x78 + IFT_VDSL = 0x61 + IFT_VIRTUALIPADDRESS = 0x70 + IFT_VIRTUALTG = 0xca + IFT_VOICEDID = 0xd5 + IFT_VOICEEM = 0x64 + IFT_VOICEEMFGD = 0xd3 + IFT_VOICEENCAP = 0x67 + IFT_VOICEFGDEANA = 0xd4 + IFT_VOICEFXO = 0x65 + IFT_VOICEFXS = 0x66 + IFT_VOICEOVERATM = 0x98 + IFT_VOICEOVERCABLE = 0xc6 + IFT_VOICEOVERFRAMERELAY = 0x99 + IFT_VOICEOVERIP = 0x68 + IFT_X213 = 0x5d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25HUNTGROUP = 0x7a + IFT_X25MLP = 0x79 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IN_RFC3021_HOST = 0x1 + IN_RFC3021_NET = 0xfffffffe + IN_RFC3021_NSHIFT = 0x1f + IPPROTO_AH = 0x33 + IPPROTO_CARP = 0x70 + IPPROTO_DIVERT = 0x102 + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPIP = 0x4 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x103 + IPPROTO_MOBILE = 0x37 + IPPROTO_MPLS = 0x89 + IPPROTO_NONE = 0x3b + IPPROTO_PFSYNC = 0xf0 + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPV6_AUTH_LEVEL = 0x35 + IPV6_AUTOFLOWLABEL = 0x3b + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_ESP_NETWORK_LEVEL = 0x37 + IPV6_ESP_TRANS_LEVEL = 0x36 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FRAGTTL = 0x78 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPCOMP_LEVEL = 0x3c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXPACKET = 0xffff + IPV6_MINHOPCOUNT = 0x41 + IPV6_MMTU = 0x500 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_OPTIONS = 0x1 + IPV6_PATHMTU = 0x2c + IPV6_PIPEX = 0x3f + IPV6_PKTINFO = 0x2e + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVDSTPORT = 0x40 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RTABLE = 0x1021 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_AUTH_LEVEL = 0x14 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0xd + IP_ESP_NETWORK_LEVEL = 0x16 + IP_ESP_TRANS_LEVEL = 0x15 + IP_HDRINCL = 0x2 + IP_IPCOMP_LEVEL = 0x1d + IP_IPDEFTTL = 0x25 + IP_IPSECFLOWINFO = 0x24 + IP_IPSEC_LOCAL_AUTH = 0x1b + IP_IPSEC_LOCAL_CRED = 0x19 + IP_IPSEC_LOCAL_ID = 0x17 + IP_IPSEC_REMOTE_AUTH = 0x1c + IP_IPSEC_REMOTE_CRED = 0x1a + IP_IPSEC_REMOTE_ID = 0x18 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0xfff + IP_MF = 0x2000 + IP_MINTTL = 0x20 + IP_MIN_MEMBERSHIPS = 0xf + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x1 + IP_PIPEX = 0x22 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVDSTPORT = 0x21 + IP_RECVIF = 0x1e + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVRTABLE = 0x23 + IP_RECVTTL = 0x1f + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RTABLE = 0x1021 + IP_SENDSRCADDR = 0x7 + IP_TOS = 0x3 + IP_TTL = 0x4 + ISIG = 0x80 + ISTRIP = 0x20 + IUCLC = 0x1000 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + KERN_HOSTNAME = 0xa + KERN_OSRELEASE = 0x2 + KERN_OSTYPE = 0x1 + KERN_VERSION = 0x4 + LCNT_OVERLOAD_FLUSH = 0x6 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x6 + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_SPACEAVAIL = 0x5 + MADV_WILLNEED = 0x3 + MAP_ANON = 0x1000 + MAP_ANONYMOUS = 0x1000 + MAP_COPY = 0x2 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_FLAGMASK = 0x7ff7 + MAP_HASSEMAPHORE = 0x0 + MAP_INHERIT = 0x0 + MAP_INHERIT_COPY = 0x1 + MAP_INHERIT_NONE = 0x2 + MAP_INHERIT_SHARE = 0x0 + MAP_INHERIT_ZERO = 0x3 + MAP_NOEXTEND = 0x0 + MAP_NORESERVE = 0x0 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x0 + MAP_SHARED = 0x1 + MAP_STACK = 0x4000 + MAP_TRYFIXED = 0x0 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MNT_ASYNC = 0x40 + MNT_DEFEXPORTED = 0x200 + MNT_DELEXPORT = 0x20000 + MNT_DOOMED = 0x8000000 + MNT_EXPORTANON = 0x400 + MNT_EXPORTED = 0x100 + MNT_EXRDONLY = 0x80 + MNT_FORCE = 0x80000 + MNT_LAZY = 0x3 + MNT_LOCAL = 0x1000 + MNT_NOATIME = 0x8000 + MNT_NODEV = 0x10 + MNT_NOEXEC = 0x4 + MNT_NOPERM = 0x20 + MNT_NOSUID = 0x8 + MNT_NOWAIT = 0x2 + MNT_QUOTA = 0x2000 + MNT_RDONLY = 0x1 + MNT_RELOAD = 0x40000 + MNT_ROOTFS = 0x4000 + MNT_SOFTDEP = 0x4000000 + MNT_STALLED = 0x100000 + MNT_SYNCHRONOUS = 0x2 + MNT_UPDATE = 0x10000 + MNT_VISFLAGMASK = 0x400ffff + MNT_WAIT = 0x1 + MNT_WANTRDWR = 0x2000000 + MNT_WXALLOWED = 0x800 + MSG_BCAST = 0x100 + MSG_CMSG_CLOEXEC = 0x800 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOR = 0x8 + MSG_MCAST = 0x200 + MSG_NOSIGNAL = 0x400 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x4 + MS_SYNC = 0x2 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_IFNAMES = 0x6 + NET_RT_MAXID = 0x7 + NET_RT_STATS = 0x4 + NET_RT_TABLE = 0x5 + NOFLSH = 0x80000000 + NOKERNINFO = 0x2000000 + NOTE_ATTRIB = 0x8 + NOTE_CHANGE = 0x1 + NOTE_CHILD = 0x4 + NOTE_DELETE = 0x1 + NOTE_EOF = 0x2 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXTEND = 0x4 + NOTE_FORK = 0x40000000 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_PCTRLMASK = 0xf0000000 + NOTE_PDATAMASK = 0xfffff + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRUNCATE = 0x80 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + OLCUC = 0x20 + ONLCR = 0x2 + ONLRET = 0x80 + ONOCR = 0x40 + ONOEOT = 0x8 + OPOST = 0x1 + OXTABS = 0x4 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x10000 + O_CREAT = 0x200 + O_DIRECTORY = 0x20000 + O_DSYNC = 0x80 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x80 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PF_FLUSH = 0x1 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_MEMLOCK = 0x6 + RLIMIT_NOFILE = 0x8 + RLIMIT_NPROC = 0x7 + RLIMIT_RSS = 0x5 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BFD = 0xb + RTAX_BRD = 0x7 + RTAX_DNS = 0xc + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_LABEL = 0xa + RTAX_MAX = 0xf + RTAX_NETMASK = 0x2 + RTAX_SEARCH = 0xe + RTAX_SRC = 0x8 + RTAX_SRCMASK = 0x9 + RTAX_STATIC = 0xd + RTA_AUTHOR = 0x40 + RTA_BFD = 0x800 + RTA_BRD = 0x80 + RTA_DNS = 0x1000 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_LABEL = 0x400 + RTA_NETMASK = 0x4 + RTA_SEARCH = 0x4000 + RTA_SRC = 0x100 + RTA_SRCMASK = 0x200 + RTA_STATIC = 0x2000 + RTF_ANNOUNCE = 0x4000 + RTF_BFD = 0x1000000 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_CACHED = 0x20000 + RTF_CLONED = 0x10000 + RTF_CLONING = 0x100 + RTF_CONNECTED = 0x800000 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_FMASK = 0x110fc08 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MODIFIED = 0x20 + RTF_MPATH = 0x40000 + RTF_MPLS = 0x100000 + RTF_MULTICAST = 0x200 + RTF_PERMANENT_ARP = 0x2000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x2000 + RTF_REJECT = 0x8 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_USETRAILERS = 0x8000 + RTM_ADD = 0x1 + RTM_BFD = 0x12 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DESYNC = 0x10 + RTM_GET = 0x4 + RTM_IFANNOUNCE = 0xf + RTM_IFINFO = 0xe + RTM_INVALIDATE = 0x11 + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MAXSIZE = 0x800 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_PROPOSAL = 0x13 + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RT_TABLEID_BITS = 0x8 + RT_TABLEID_MASK = 0xff + RT_TABLEID_MAX = 0xff + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x4 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCAIFADDR = 0x8040691a + SIOCAIFGROUP = 0x80286987 + SIOCATMARK = 0x40047307 + SIOCBRDGADD = 0x8060693c + SIOCBRDGADDL = 0x80606949 + SIOCBRDGADDS = 0x80606941 + SIOCBRDGARL = 0x808c694d + SIOCBRDGDADDR = 0x81286947 + SIOCBRDGDEL = 0x8060693d + SIOCBRDGDELS = 0x80606942 + SIOCBRDGFLUSH = 0x80606948 + SIOCBRDGFRL = 0x808c694e + SIOCBRDGGCACHE = 0xc0186941 + SIOCBRDGGFD = 0xc0186952 + SIOCBRDGGHT = 0xc0186951 + SIOCBRDGGIFFLGS = 0xc060693e + SIOCBRDGGMA = 0xc0186953 + SIOCBRDGGPARAM = 0xc0406958 + SIOCBRDGGPRI = 0xc0186950 + SIOCBRDGGRL = 0xc030694f + SIOCBRDGGTO = 0xc0186946 + SIOCBRDGIFS = 0xc0606942 + SIOCBRDGRTS = 0xc0206943 + SIOCBRDGSADDR = 0xc1286944 + SIOCBRDGSCACHE = 0x80186940 + SIOCBRDGSFD = 0x80186952 + SIOCBRDGSHT = 0x80186951 + SIOCBRDGSIFCOST = 0x80606955 + SIOCBRDGSIFFLGS = 0x8060693f + SIOCBRDGSIFPRIO = 0x80606954 + SIOCBRDGSIFPROT = 0x8060694a + SIOCBRDGSMA = 0x80186953 + SIOCBRDGSPRI = 0x80186950 + SIOCBRDGSPROTO = 0x8018695a + SIOCBRDGSTO = 0x80186945 + SIOCBRDGSTXHC = 0x80186959 + SIOCDELMULTI = 0x80206932 + SIOCDIFADDR = 0x80206919 + SIOCDIFGROUP = 0x80286989 + SIOCDIFPARENT = 0x802069b4 + SIOCDIFPHYADDR = 0x80206949 + SIOCDVNETID = 0x802069af + SIOCGETKALIVE = 0xc01869a4 + SIOCGETLABEL = 0x8020699a + SIOCGETMPWCFG = 0xc02069ae + SIOCGETPFLOW = 0xc02069fe + SIOCGETPFSYNC = 0xc02069f8 + SIOCGETSGCNT = 0xc0207534 + SIOCGETVIFCNT = 0xc0287533 + SIOCGETVLAN = 0xc0206990 + SIOCGIFADDR = 0xc0206921 + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCONF = 0xc0106924 + SIOCGIFDATA = 0xc020691b + SIOCGIFDESCR = 0xc0206981 + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGATTR = 0xc028698b + SIOCGIFGENERIC = 0xc020693a + SIOCGIFGMEMB = 0xc028698a + SIOCGIFGROUP = 0xc0286988 + SIOCGIFHARDMTU = 0xc02069a5 + SIOCGIFLLPRIO = 0xc02069b6 + SIOCGIFMEDIA = 0xc0406938 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc020697e + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPAIR = 0xc02069b1 + SIOCGIFPARENT = 0xc02069b3 + SIOCGIFPRIORITY = 0xc020699c + SIOCGIFRDOMAIN = 0xc02069a0 + SIOCGIFRTLABEL = 0xc0206983 + SIOCGIFRXR = 0x802069aa + SIOCGIFXFLAGS = 0xc020699e + SIOCGLIFPHYADDR = 0xc218694b + SIOCGLIFPHYDF = 0xc02069c2 + SIOCGLIFPHYRTABLE = 0xc02069a2 + SIOCGLIFPHYTTL = 0xc02069a9 + SIOCGPGRP = 0x40047309 + SIOCGSPPPPARAMS = 0xc0206994 + SIOCGUMBINFO = 0xc02069be + SIOCGUMBPARAM = 0xc02069c0 + SIOCGVH = 0xc02069f6 + SIOCGVNETFLOWID = 0xc02069c4 + SIOCGVNETID = 0xc02069a7 + SIOCIFAFATTACH = 0x801169ab + SIOCIFAFDETACH = 0x801169ac + SIOCIFCREATE = 0x8020697a + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc0106978 + SIOCSETKALIVE = 0x801869a3 + SIOCSETLABEL = 0x80206999 + SIOCSETMPWCFG = 0x802069ad + SIOCSETPFLOW = 0x802069fd + SIOCSETPFSYNC = 0x802069f7 + SIOCSETVLAN = 0x8020698f + SIOCSIFADDR = 0x8020690c + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFDESCR = 0x80206980 + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGATTR = 0x8028698c + SIOCSIFGENERIC = 0x80206939 + SIOCSIFLLADDR = 0x8020691f + SIOCSIFLLPRIO = 0x802069b5 + SIOCSIFMEDIA = 0xc0206937 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x8020697f + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPAIR = 0x802069b0 + SIOCSIFPARENT = 0x802069b2 + SIOCSIFPRIORITY = 0x8020699b + SIOCSIFRDOMAIN = 0x8020699f + SIOCSIFRTLABEL = 0x80206982 + SIOCSIFXFLAGS = 0x8020699d + SIOCSLIFPHYADDR = 0x8218694a + SIOCSLIFPHYDF = 0x802069c1 + SIOCSLIFPHYRTABLE = 0x802069a1 + SIOCSLIFPHYTTL = 0x802069a8 + SIOCSPGRP = 0x80047308 + SIOCSSPPPPARAMS = 0x80206993 + SIOCSUMBPARAM = 0x802069bf + SIOCSVH = 0xc02069f5 + SIOCSVNETFLOWID = 0x802069c3 + SIOCSVNETID = 0x802069a6 + SIOCSWGDPID = 0xc018695b + SIOCSWGMAXFLOW = 0xc0186960 + SIOCSWGMAXGROUP = 0xc018695d + SIOCSWSDPID = 0x8018695c + SIOCSWSPORTNO = 0xc060695f + SOCK_CLOEXEC = 0x8000 + SOCK_DGRAM = 0x2 + SOCK_DNS = 0x1000 + SOCK_NONBLOCK = 0x4000 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_BINDANY = 0x1000 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_NETPROC = 0x1020 + SO_OOBINLINE = 0x100 + SO_PEERCRED = 0x1022 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_RTABLE = 0x1021 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_SPLICE = 0x1023 + SO_TIMESTAMP = 0x800 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + SO_ZEROIZE = 0x2000 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISTXT = 0x200 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TCIFLUSH = 0x1 + TCIOFF = 0x3 + TCIOFLUSH = 0x3 + TCION = 0x4 + TCOFLUSH = 0x2 + TCOOFF = 0x1 + TCOON = 0x2 + TCP_MAXBURST = 0x4 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x3 + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0x4 + TCP_MSS = 0x200 + TCP_NODELAY = 0x1 + TCP_NOPUSH = 0x10 + TCP_SACK_ENABLE = 0x8 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCHKVERAUTH = 0x2000741e + TIOCCLRVERAUTH = 0x2000741d + TIOCCONS = 0x80047462 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLAG_CLOCAL = 0x2 + TIOCFLAG_CRTSCTS = 0x4 + TIOCFLAG_MDMBUF = 0x8 + TIOCFLAG_PPS = 0x10 + TIOCFLAG_SOFTCAR = 0x1 + TIOCFLUSH = 0x80047410 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGFLAGS = 0x4004745d + TIOCGPGRP = 0x40047477 + TIOCGSID = 0x40047463 + TIOCGTSTAMP = 0x4010745b + TIOCGWINSZ = 0x40087468 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGET = 0x4004746a + TIOCMODG = 0x4004746a + TIOCMODS = 0x8004746d + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSETVERAUTH = 0x8004741c + TIOCSFLAGS = 0x8004745c + TIOCSIG = 0x8004745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x20007465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSTSTAMP = 0x8008745a + TIOCSWINSZ = 0x80087467 + TIOCUCNTL = 0x80047466 + TIOCUCNTL_CBRK = 0x7a + TIOCUCNTL_SBRK = 0x7b + TOSTOP = 0x400000 + UTIME_NOW = -0x2 + UTIME_OMIT = -0x1 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VM_ANONMIN = 0x7 + VM_LOADAVG = 0x2 + VM_MAXID = 0xc + VM_MAXSLP = 0xa + VM_METER = 0x1 + VM_NKMEMPAGES = 0x6 + VM_PSSTRINGS = 0x3 + VM_SWAPENCRYPT = 0x5 + VM_USPACE = 0xb + VM_UVMEXP = 0x4 + VM_VNODEMIN = 0x9 + VM_VTEXTMIN = 0x8 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WALTSIG = 0x4 + WCONTINUED = 0x8 + WCOREFLAG = 0x80 + WNOHANG = 0x1 + WUNTRACED = 0x2 + XCASE = 0x1000000 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADF = syscall.Errno(0x9) + EBADMSG = syscall.Errno(0x5c) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x58) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDOM = syscall.Errno(0x21) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x59) + EILSEQ = syscall.Errno(0x54) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EIPSEC = syscall.Errno(0x52) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x5f) + ELOOP = syscall.Errno(0x3e) + EMEDIUMTYPE = syscall.Errno(0x56) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x53) + ENOBUFS = syscall.Errno(0x37) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOMEDIUM = syscall.Errno(0x55) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x5a) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTRECOVERABLE = syscall.Errno(0x5d) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x5b) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x57) + EOWNERDEAD = syscall.Errno(0x5e) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTO = syscall.Errno(0x5f) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTHR = syscall.Signal(0x20) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "device not configured"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EDEADLK", "resource deadlock avoided"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "cross-device link"}, + {19, "ENODEV", "operation not supported by device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "result too large"}, + {35, "EAGAIN", "resource temporarily unavailable"}, + {36, "EINPROGRESS", "operation now in progress"}, + {37, "EALREADY", "operation already in progress"}, + {38, "ENOTSOCK", "socket operation on non-socket"}, + {39, "EDESTADDRREQ", "destination address required"}, + {40, "EMSGSIZE", "message too long"}, + {41, "EPROTOTYPE", "protocol wrong type for socket"}, + {42, "ENOPROTOOPT", "protocol not available"}, + {43, "EPROTONOSUPPORT", "protocol not supported"}, + {44, "ESOCKTNOSUPPORT", "socket type not supported"}, + {45, "EOPNOTSUPP", "operation not supported"}, + {46, "EPFNOSUPPORT", "protocol family not supported"}, + {47, "EAFNOSUPPORT", "address family not supported by protocol family"}, + {48, "EADDRINUSE", "address already in use"}, + {49, "EADDRNOTAVAIL", "can't assign requested address"}, + {50, "ENETDOWN", "network is down"}, + {51, "ENETUNREACH", "network is unreachable"}, + {52, "ENETRESET", "network dropped connection on reset"}, + {53, "ECONNABORTED", "software caused connection abort"}, + {54, "ECONNRESET", "connection reset by peer"}, + {55, "ENOBUFS", "no buffer space available"}, + {56, "EISCONN", "socket is already connected"}, + {57, "ENOTCONN", "socket is not connected"}, + {58, "ESHUTDOWN", "can't send after socket shutdown"}, + {59, "ETOOMANYREFS", "too many references: can't splice"}, + {60, "ETIMEDOUT", "operation timed out"}, + {61, "ECONNREFUSED", "connection refused"}, + {62, "ELOOP", "too many levels of symbolic links"}, + {63, "ENAMETOOLONG", "file name too long"}, + {64, "EHOSTDOWN", "host is down"}, + {65, "EHOSTUNREACH", "no route to host"}, + {66, "ENOTEMPTY", "directory not empty"}, + {67, "EPROCLIM", "too many processes"}, + {68, "EUSERS", "too many users"}, + {69, "EDQUOT", "disk quota exceeded"}, + {70, "ESTALE", "stale NFS file handle"}, + {71, "EREMOTE", "too many levels of remote in path"}, + {72, "EBADRPC", "RPC struct is bad"}, + {73, "ERPCMISMATCH", "RPC version wrong"}, + {74, "EPROGUNAVAIL", "RPC program not available"}, + {75, "EPROGMISMATCH", "program version wrong"}, + {76, "EPROCUNAVAIL", "bad procedure for program"}, + {77, "ENOLCK", "no locks available"}, + {78, "ENOSYS", "function not implemented"}, + {79, "EFTYPE", "inappropriate file type or format"}, + {80, "EAUTH", "authentication error"}, + {81, "ENEEDAUTH", "need authenticator"}, + {82, "EIPSEC", "IPsec processing failure"}, + {83, "ENOATTR", "attribute not found"}, + {84, "EILSEQ", "illegal byte sequence"}, + {85, "ENOMEDIUM", "no medium found"}, + {86, "EMEDIUMTYPE", "wrong medium type"}, + {87, "EOVERFLOW", "value too large to be stored in data type"}, + {88, "ECANCELED", "operation canceled"}, + {89, "EIDRM", "identifier removed"}, + {90, "ENOMSG", "no message of desired type"}, + {91, "ENOTSUP", "not supported"}, + {92, "EBADMSG", "bad message"}, + {93, "ENOTRECOVERABLE", "state not recoverable"}, + {94, "EOWNERDEAD", "previous owner died"}, + {95, "ELAST", "protocol error"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/BPT trap"}, + {6, "SIGABRT", "abort trap"}, + {7, "SIGEMT", "EMT trap"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGBUS", "bus error"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGSYS", "bad system call"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGURG", "urgent I/O condition"}, + {17, "SIGSTOP", "suspended (signal)"}, + {18, "SIGTSTP", "suspended"}, + {19, "SIGCONT", "continued"}, + {20, "SIGCHLD", "child exited"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGIO", "I/O possible"}, + {24, "SIGXCPU", "cputime limit exceeded"}, + {25, "SIGXFSZ", "filesize limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window size changes"}, + {29, "SIGINFO", "information request"}, + {30, "SIGUSR1", "user defined signal 1"}, + {31, "SIGUSR2", "user defined signal 2"}, + {32, "SIGTHR", "thread AST"}, +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go new file mode 100644 index 00000000..79d5695c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go @@ -0,0 +1,1656 @@ +// mkerrors.sh +// Code generated by the command above; see README.md. DO NOT EDIT. + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- _const.go + +// +build arm,openbsd + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_BLUETOOTH = 0x20 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_ENCAP = 0x1c + AF_HYLINK = 0xf + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x18 + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_KEY = 0x1e + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x24 + AF_MPLS = 0x21 + AF_NATM = 0x1b + AF_NS = 0x6 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x11 + AF_SIP = 0x1d + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + ARPHRD_ETHER = 0x1 + ARPHRD_FRELAY = 0xf + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B9600 = 0x2580 + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDIRFILT = 0x4004427c + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc008427b + BIOCGETIF = 0x4020426b + BIOCGFILDROP = 0x40044278 + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044273 + BIOCGRTIMEOUT = 0x400c426e + BIOCGSTATS = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCLOCK = 0x20004276 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDIRFILT = 0x8004427d + BIOCSDLT = 0x8004427a + BIOCSETF = 0x80084267 + BIOCSETIF = 0x8020426c + BIOCSETWF = 0x80084277 + BIOCSFILDROP = 0x80044279 + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044272 + BIOCSRTIMEOUT = 0x800c426d + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIRECTION_IN = 0x1 + BPF_DIRECTION_OUT = 0x2 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x200000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + CFLUSH = 0xf + CLOCAL = 0x8000 + CREAD = 0x800 + CRTSCTS = 0x10000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0xff + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_HW = 0x6 + CTL_KERN = 0x1 + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + DIOCOSFPFLUSH = 0x2000444e + DLT_ARCNET = 0x7 + DLT_ATM_RFC1483 = 0xb + DLT_AX25 = 0x3 + DLT_CHAOS = 0x5 + DLT_C_HDLC = 0x68 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0xd + DLT_FDDI = 0xa + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_LOOP = 0xc + DLT_MPLS = 0xdb + DLT_NULL = 0x0 + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_SERIAL = 0x32 + DLT_PRONET = 0x4 + DLT_RAW = 0xe + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EMT_TAGOVF = 0x1 + EMUL_ENABLED = 0x1 + EMUL_NATIVE = 0x2 + ENDRUNDISC = 0x9 + ETHERMIN = 0x2e + ETHERMTU = 0x5dc + ETHERTYPE_8023 = 0x4 + ETHERTYPE_AARP = 0x80f3 + ETHERTYPE_ACCTON = 0x8390 + ETHERTYPE_AEONIC = 0x8036 + ETHERTYPE_ALPHA = 0x814a + ETHERTYPE_AMBER = 0x6008 + ETHERTYPE_AMOEBA = 0x8145 + ETHERTYPE_AOE = 0x88a2 + ETHERTYPE_APOLLO = 0x80f7 + ETHERTYPE_APOLLODOMAIN = 0x8019 + ETHERTYPE_APPLETALK = 0x809b + ETHERTYPE_APPLITEK = 0x80c7 + ETHERTYPE_ARGONAUT = 0x803a + ETHERTYPE_ARP = 0x806 + ETHERTYPE_AT = 0x809b + ETHERTYPE_ATALK = 0x809b + ETHERTYPE_ATOMIC = 0x86df + ETHERTYPE_ATT = 0x8069 + ETHERTYPE_ATTSTANFORD = 0x8008 + ETHERTYPE_AUTOPHON = 0x806a + ETHERTYPE_AXIS = 0x8856 + ETHERTYPE_BCLOOP = 0x9003 + ETHERTYPE_BOFL = 0x8102 + ETHERTYPE_CABLETRON = 0x7034 + ETHERTYPE_CHAOS = 0x804 + ETHERTYPE_COMDESIGN = 0x806c + ETHERTYPE_COMPUGRAPHIC = 0x806d + ETHERTYPE_COUNTERPOINT = 0x8062 + ETHERTYPE_CRONUS = 0x8004 + ETHERTYPE_CRONUSVLN = 0x8003 + ETHERTYPE_DCA = 0x1234 + ETHERTYPE_DDE = 0x807b + ETHERTYPE_DEBNI = 0xaaaa + ETHERTYPE_DECAM = 0x8048 + ETHERTYPE_DECCUST = 0x6006 + ETHERTYPE_DECDIAG = 0x6005 + ETHERTYPE_DECDNS = 0x803c + ETHERTYPE_DECDTS = 0x803e + ETHERTYPE_DECEXPER = 0x6000 + ETHERTYPE_DECLAST = 0x8041 + ETHERTYPE_DECLTM = 0x803f + ETHERTYPE_DECMUMPS = 0x6009 + ETHERTYPE_DECNETBIOS = 0x8040 + ETHERTYPE_DELTACON = 0x86de + ETHERTYPE_DIDDLE = 0x4321 + ETHERTYPE_DLOG1 = 0x660 + ETHERTYPE_DLOG2 = 0x661 + ETHERTYPE_DN = 0x6003 + ETHERTYPE_DOGFIGHT = 0x1989 + ETHERTYPE_DSMD = 0x8039 + ETHERTYPE_ECMA = 0x803 + ETHERTYPE_ENCRYPT = 0x803d + ETHERTYPE_ES = 0x805d + ETHERTYPE_EXCELAN = 0x8010 + ETHERTYPE_EXPERDATA = 0x8049 + ETHERTYPE_FLIP = 0x8146 + ETHERTYPE_FLOWCONTROL = 0x8808 + ETHERTYPE_FRARP = 0x808 + ETHERTYPE_GENDYN = 0x8068 + ETHERTYPE_HAYES = 0x8130 + ETHERTYPE_HIPPI_FP = 0x8180 + ETHERTYPE_HITACHI = 0x8820 + ETHERTYPE_HP = 0x8005 + ETHERTYPE_IEEEPUP = 0xa00 + ETHERTYPE_IEEEPUPAT = 0xa01 + ETHERTYPE_IMLBL = 0x4c42 + ETHERTYPE_IMLBLDIAG = 0x424c + ETHERTYPE_IP = 0x800 + ETHERTYPE_IPAS = 0x876c + ETHERTYPE_IPV6 = 0x86dd + ETHERTYPE_IPX = 0x8137 + ETHERTYPE_IPXNEW = 0x8037 + ETHERTYPE_KALPANA = 0x8582 + ETHERTYPE_LANBRIDGE = 0x8038 + ETHERTYPE_LANPROBE = 0x8888 + ETHERTYPE_LAT = 0x6004 + ETHERTYPE_LBACK = 0x9000 + ETHERTYPE_LITTLE = 0x8060 + ETHERTYPE_LLDP = 0x88cc + ETHERTYPE_LOGICRAFT = 0x8148 + ETHERTYPE_LOOPBACK = 0x9000 + ETHERTYPE_MATRA = 0x807a + ETHERTYPE_MAX = 0xffff + ETHERTYPE_MERIT = 0x807c + ETHERTYPE_MICP = 0x873a + ETHERTYPE_MOPDL = 0x6001 + ETHERTYPE_MOPRC = 0x6002 + ETHERTYPE_MOTOROLA = 0x818d + ETHERTYPE_MPLS = 0x8847 + ETHERTYPE_MPLS_MCAST = 0x8848 + ETHERTYPE_MUMPS = 0x813f + ETHERTYPE_NBPCC = 0x3c04 + ETHERTYPE_NBPCLAIM = 0x3c09 + ETHERTYPE_NBPCLREQ = 0x3c05 + ETHERTYPE_NBPCLRSP = 0x3c06 + ETHERTYPE_NBPCREQ = 0x3c02 + ETHERTYPE_NBPCRSP = 0x3c03 + ETHERTYPE_NBPDG = 0x3c07 + ETHERTYPE_NBPDGB = 0x3c08 + ETHERTYPE_NBPDLTE = 0x3c0a + ETHERTYPE_NBPRAR = 0x3c0c + ETHERTYPE_NBPRAS = 0x3c0b + ETHERTYPE_NBPRST = 0x3c0d + ETHERTYPE_NBPSCD = 0x3c01 + ETHERTYPE_NBPVCD = 0x3c00 + ETHERTYPE_NBS = 0x802 + ETHERTYPE_NCD = 0x8149 + ETHERTYPE_NESTAR = 0x8006 + ETHERTYPE_NETBEUI = 0x8191 + ETHERTYPE_NOVELL = 0x8138 + ETHERTYPE_NS = 0x600 + ETHERTYPE_NSAT = 0x601 + ETHERTYPE_NSCOMPAT = 0x807 + ETHERTYPE_NTRAILER = 0x10 + ETHERTYPE_OS9 = 0x7007 + ETHERTYPE_OS9NET = 0x7009 + ETHERTYPE_PACER = 0x80c6 + ETHERTYPE_PAE = 0x888e + ETHERTYPE_PCS = 0x4242 + ETHERTYPE_PLANNING = 0x8044 + ETHERTYPE_PPP = 0x880b + ETHERTYPE_PPPOE = 0x8864 + ETHERTYPE_PPPOEDISC = 0x8863 + ETHERTYPE_PRIMENTS = 0x7031 + ETHERTYPE_PUP = 0x200 + ETHERTYPE_PUPAT = 0x200 + ETHERTYPE_QINQ = 0x88a8 + ETHERTYPE_RACAL = 0x7030 + ETHERTYPE_RATIONAL = 0x8150 + ETHERTYPE_RAWFR = 0x6559 + ETHERTYPE_RCL = 0x1995 + ETHERTYPE_RDP = 0x8739 + ETHERTYPE_RETIX = 0x80f2 + ETHERTYPE_REVARP = 0x8035 + ETHERTYPE_SCA = 0x6007 + ETHERTYPE_SECTRA = 0x86db + ETHERTYPE_SECUREDATA = 0x876d + ETHERTYPE_SGITW = 0x817e + ETHERTYPE_SG_BOUNCE = 0x8016 + ETHERTYPE_SG_DIAG = 0x8013 + ETHERTYPE_SG_NETGAMES = 0x8014 + ETHERTYPE_SG_RESV = 0x8015 + ETHERTYPE_SIMNET = 0x5208 + ETHERTYPE_SLOW = 0x8809 + ETHERTYPE_SNA = 0x80d5 + ETHERTYPE_SNMP = 0x814c + ETHERTYPE_SONIX = 0xfaf5 + ETHERTYPE_SPIDER = 0x809f + ETHERTYPE_SPRITE = 0x500 + ETHERTYPE_STP = 0x8181 + ETHERTYPE_TALARIS = 0x812b + ETHERTYPE_TALARISMC = 0x852b + ETHERTYPE_TCPCOMP = 0x876b + ETHERTYPE_TCPSM = 0x9002 + ETHERTYPE_TEC = 0x814f + ETHERTYPE_TIGAN = 0x802f + ETHERTYPE_TRAIL = 0x1000 + ETHERTYPE_TRANSETHER = 0x6558 + ETHERTYPE_TYMSHARE = 0x802e + ETHERTYPE_UBBST = 0x7005 + ETHERTYPE_UBDEBUG = 0x900 + ETHERTYPE_UBDIAGLOOP = 0x7002 + ETHERTYPE_UBDL = 0x7000 + ETHERTYPE_UBNIU = 0x7001 + ETHERTYPE_UBNMC = 0x7003 + ETHERTYPE_VALID = 0x1600 + ETHERTYPE_VARIAN = 0x80dd + ETHERTYPE_VAXELN = 0x803b + ETHERTYPE_VEECO = 0x8067 + ETHERTYPE_VEXP = 0x805b + ETHERTYPE_VGLAB = 0x8131 + ETHERTYPE_VINES = 0xbad + ETHERTYPE_VINESECHO = 0xbaf + ETHERTYPE_VINESLOOP = 0xbae + ETHERTYPE_VITAL = 0xff00 + ETHERTYPE_VLAN = 0x8100 + ETHERTYPE_VLTLMAN = 0x8080 + ETHERTYPE_VPROD = 0x805c + ETHERTYPE_VURESERVED = 0x8147 + ETHERTYPE_WATERLOO = 0x8130 + ETHERTYPE_WELLFLEET = 0x8103 + ETHERTYPE_X25 = 0x805 + ETHERTYPE_X75 = 0x801 + ETHERTYPE_XNSSM = 0x9001 + ETHERTYPE_XTP = 0x817d + ETHER_ADDR_LEN = 0x6 + ETHER_ALIGN = 0x2 + ETHER_CRC_LEN = 0x4 + ETHER_CRC_POLY_BE = 0x4c11db6 + ETHER_CRC_POLY_LE = 0xedb88320 + ETHER_HDR_LEN = 0xe + ETHER_MAX_DIX_LEN = 0x600 + ETHER_MAX_LEN = 0x5ee + ETHER_MIN_LEN = 0x40 + ETHER_TYPE_LEN = 0x2 + ETHER_VLAN_ENCAP_LEN = 0x4 + EVFILT_AIO = -0x3 + EVFILT_PROC = -0x5 + EVFILT_READ = -0x1 + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0x7 + EVFILT_TIMER = -0x7 + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FLUSHO = 0x800000 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0xa + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETOWN = 0x5 + F_RDLCK = 0x1 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETOWN = 0x6 + F_UNLCK = 0x2 + F_WRLCK = 0x3 + HUPCL = 0x4000 + HW_MACHINE = 0x1 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFAN_ARRIVAL = 0x0 + IFAN_DEPARTURE = 0x1 + IFA_ROUTE = 0x1 + IFF_ALLMULTI = 0x200 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x8e52 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NOTRAILERS = 0x20 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BLUETOOTH = 0xf8 + IFT_BRIDGE = 0xd1 + IFT_BSC = 0x53 + IFT_CARP = 0xf7 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DOCSCABLEUPSTREAMCHANNEL = 0xcd + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DUMMY = 0xf1 + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ECONET = 0xce + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAITH = 0xf3 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE1394 = 0x90 + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_INFINIBAND = 0xc7 + IFT_INTERLEAVE = 0x7c + IFT_IP = 0x7e + IFT_IPFORWARD = 0x8e + IFT_IPOVERATM = 0x72 + IFT_IPOVERCDLC = 0x6d + IFT_IPOVERCLAW = 0x6e + IFT_IPSWITCH = 0x4e + IFT_ISDN = 0x3f + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISDNS = 0x4b + IFT_ISDNU = 0x4c + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88025CRFPINT = 0x62 + IFT_ISO88025DTR = 0x56 + IFT_ISO88025FIBER = 0x73 + IFT_ISO88026 = 0xa + IFT_ISUP = 0xb3 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_L3IPXVLAN = 0x89 + IFT_LAPB = 0x10 + IFT_LAPD = 0x4d + IFT_LAPF = 0x77 + IFT_LINEGROUP = 0xd2 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf5 + IFT_PFLOW = 0xf9 + IFT_PFSYNC = 0xf6 + IFT_PLC = 0xae + IFT_PON155 = 0xcf + IFT_PON622 = 0xd0 + IFT_POS = 0xab + IFT_PPP = 0x17 + IFT_PPPMULTILINKBUNDLE = 0x6c + IFT_PROPATM = 0xc5 + IFT_PROPBWAP2MP = 0xb8 + IFT_PROPCNLS = 0x59 + IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 + IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 + IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PROPWIRELESSP2P = 0x9d + IFT_PTPSERIAL = 0x16 + IFT_PVC = 0xf2 + IFT_Q2931 = 0xc9 + IFT_QLLC = 0x44 + IFT_RADIOMAC = 0xbc + IFT_RADSL = 0x5f + IFT_REACHDSL = 0xc0 + IFT_RFC1483 = 0x9f + IFT_RS232 = 0x21 + IFT_RSRB = 0x4f + IFT_SDLC = 0x11 + IFT_SDSL = 0x60 + IFT_SHDSL = 0xa9 + IFT_SIP = 0x1f + IFT_SIPSIG = 0xcc + IFT_SIPTG = 0xcb + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETOVERHEADCHANNEL = 0xb9 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_SRP = 0x97 + IFT_SS7SIGLINK = 0x9c + IFT_STACKTOSTACK = 0x6f + IFT_STARLAN = 0xb + IFT_T1 = 0x12 + IFT_TDLC = 0x74 + IFT_TELINK = 0xc8 + IFT_TERMPAD = 0x5b + IFT_TR008 = 0xb0 + IFT_TRANSPHDLC = 0x7b + IFT_TUNNEL = 0x83 + IFT_ULTRA = 0x1d + IFT_USB = 0xa0 + IFT_V11 = 0x40 + IFT_V35 = 0x2d + IFT_V36 = 0x41 + IFT_V37 = 0x78 + IFT_VDSL = 0x61 + IFT_VIRTUALIPADDRESS = 0x70 + IFT_VIRTUALTG = 0xca + IFT_VOICEDID = 0xd5 + IFT_VOICEEM = 0x64 + IFT_VOICEEMFGD = 0xd3 + IFT_VOICEENCAP = 0x67 + IFT_VOICEFGDEANA = 0xd4 + IFT_VOICEFXO = 0x65 + IFT_VOICEFXS = 0x66 + IFT_VOICEOVERATM = 0x98 + IFT_VOICEOVERCABLE = 0xc6 + IFT_VOICEOVERFRAMERELAY = 0x99 + IFT_VOICEOVERIP = 0x68 + IFT_X213 = 0x5d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25HUNTGROUP = 0x7a + IFT_X25MLP = 0x79 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IN_RFC3021_HOST = 0x1 + IN_RFC3021_NET = 0xfffffffe + IN_RFC3021_NSHIFT = 0x1f + IPPROTO_AH = 0x33 + IPPROTO_CARP = 0x70 + IPPROTO_DIVERT = 0x102 + IPPROTO_DIVERT_INIT = 0x2 + IPPROTO_DIVERT_RESP = 0x1 + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPIP = 0x4 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x103 + IPPROTO_MOBILE = 0x37 + IPPROTO_MPLS = 0x89 + IPPROTO_NONE = 0x3b + IPPROTO_PFSYNC = 0xf0 + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPV6_AUTH_LEVEL = 0x35 + IPV6_AUTOFLOWLABEL = 0x3b + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_ESP_NETWORK_LEVEL = 0x37 + IPV6_ESP_TRANS_LEVEL = 0x36 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FRAGTTL = 0x78 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPCOMP_LEVEL = 0x3c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXPACKET = 0xffff + IPV6_MMTU = 0x500 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_OPTIONS = 0x1 + IPV6_PATHMTU = 0x2c + IPV6_PIPEX = 0x3f + IPV6_PKTINFO = 0x2e + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVDSTPORT = 0x40 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RTABLE = 0x1021 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_AUTH_LEVEL = 0x14 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DIVERTFL = 0x1022 + IP_DROP_MEMBERSHIP = 0xd + IP_ESP_NETWORK_LEVEL = 0x16 + IP_ESP_TRANS_LEVEL = 0x15 + IP_HDRINCL = 0x2 + IP_IPCOMP_LEVEL = 0x1d + IP_IPSECFLOWINFO = 0x24 + IP_IPSEC_LOCAL_AUTH = 0x1b + IP_IPSEC_LOCAL_CRED = 0x19 + IP_IPSEC_LOCAL_ID = 0x17 + IP_IPSEC_REMOTE_AUTH = 0x1c + IP_IPSEC_REMOTE_CRED = 0x1a + IP_IPSEC_REMOTE_ID = 0x18 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0xfff + IP_MF = 0x2000 + IP_MINTTL = 0x20 + IP_MIN_MEMBERSHIPS = 0xf + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x1 + IP_PIPEX = 0x22 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVDSTPORT = 0x21 + IP_RECVIF = 0x1e + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVRTABLE = 0x23 + IP_RECVTTL = 0x1f + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RTABLE = 0x1021 + IP_TOS = 0x3 + IP_TTL = 0x4 + ISIG = 0x80 + ISTRIP = 0x20 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + KERN_HOSTNAME = 0xa + KERN_OSRELEASE = 0x2 + KERN_OSTYPE = 0x1 + KERN_VERSION = 0x4 + LCNT_OVERLOAD_FLUSH = 0x6 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x6 + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_SPACEAVAIL = 0x5 + MADV_WILLNEED = 0x3 + MAP_ANON = 0x1000 + MAP_ANONYMOUS = 0x1000 + MAP_COPY = 0x2 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_FLAGMASK = 0x3ff7 + MAP_HASSEMAPHORE = 0x0 + MAP_INHERIT = 0x0 + MAP_INHERIT_COPY = 0x1 + MAP_INHERIT_NONE = 0x2 + MAP_INHERIT_SHARE = 0x0 + MAP_INHERIT_ZERO = 0x3 + MAP_NOEXTEND = 0x0 + MAP_NORESERVE = 0x0 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x0 + MAP_SHARED = 0x1 + MAP_TRYFIXED = 0x0 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MNT_ASYNC = 0x40 + MNT_DEFEXPORTED = 0x200 + MNT_DELEXPORT = 0x20000 + MNT_DOOMED = 0x8000000 + MNT_EXPORTANON = 0x400 + MNT_EXPORTED = 0x100 + MNT_EXRDONLY = 0x80 + MNT_FORCE = 0x80000 + MNT_LAZY = 0x3 + MNT_LOCAL = 0x1000 + MNT_NOATIME = 0x8000 + MNT_NODEV = 0x10 + MNT_NOEXEC = 0x4 + MNT_NOSUID = 0x8 + MNT_NOWAIT = 0x2 + MNT_QUOTA = 0x2000 + MNT_RDONLY = 0x1 + MNT_RELOAD = 0x40000 + MNT_ROOTFS = 0x4000 + MNT_SOFTDEP = 0x4000000 + MNT_SYNCHRONOUS = 0x2 + MNT_UPDATE = 0x10000 + MNT_VISFLAGMASK = 0x400ffff + MNT_WAIT = 0x1 + MNT_WANTRDWR = 0x2000000 + MNT_WXALLOWED = 0x800 + MSG_BCAST = 0x100 + MSG_CMSG_CLOEXEC = 0x800 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOR = 0x8 + MSG_MCAST = 0x200 + MSG_NOSIGNAL = 0x400 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x4 + MS_SYNC = 0x2 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_MAXID = 0x6 + NET_RT_STATS = 0x4 + NET_RT_TABLE = 0x5 + NOFLSH = 0x80000000 + NOTE_ATTRIB = 0x8 + NOTE_CHILD = 0x4 + NOTE_DELETE = 0x1 + NOTE_EOF = 0x2 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXTEND = 0x4 + NOTE_FORK = 0x40000000 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_PCTRLMASK = 0xf0000000 + NOTE_PDATAMASK = 0xfffff + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRUNCATE = 0x80 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + ONLCR = 0x2 + ONLRET = 0x80 + ONOCR = 0x40 + ONOEOT = 0x8 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x10000 + O_CREAT = 0x200 + O_DIRECTORY = 0x20000 + O_DSYNC = 0x80 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x80 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PF_FLUSH = 0x1 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_NOFILE = 0x8 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_LABEL = 0xa + RTAX_MAX = 0xb + RTAX_NETMASK = 0x2 + RTAX_SRC = 0x8 + RTAX_SRCMASK = 0x9 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_LABEL = 0x400 + RTA_NETMASK = 0x4 + RTA_SRC = 0x100 + RTA_SRCMASK = 0x200 + RTF_ANNOUNCE = 0x4000 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_CLONED = 0x10000 + RTF_CLONING = 0x100 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_FMASK = 0x70f808 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MASK = 0x80 + RTF_MODIFIED = 0x20 + RTF_MPATH = 0x40000 + RTF_MPLS = 0x100000 + RTF_PERMANENT_ARP = 0x2000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x2000 + RTF_REJECT = 0x8 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_USETRAILERS = 0x8000 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DESYNC = 0x10 + RTM_GET = 0x4 + RTM_IFANNOUNCE = 0xf + RTM_IFINFO = 0xe + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MAXSIZE = 0x800 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RT_TABLEID_MAX = 0xff + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x4 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCAIFADDR = 0x8040691a + SIOCAIFGROUP = 0x80246987 + SIOCALIFADDR = 0x8218691c + SIOCATMARK = 0x40047307 + SIOCBRDGADD = 0x8054693c + SIOCBRDGADDS = 0x80546941 + SIOCBRDGARL = 0x806e694d + SIOCBRDGDADDR = 0x81286947 + SIOCBRDGDEL = 0x8054693d + SIOCBRDGDELS = 0x80546942 + SIOCBRDGFLUSH = 0x80546948 + SIOCBRDGFRL = 0x806e694e + SIOCBRDGGCACHE = 0xc0146941 + SIOCBRDGGFD = 0xc0146952 + SIOCBRDGGHT = 0xc0146951 + SIOCBRDGGIFFLGS = 0xc054693e + SIOCBRDGGMA = 0xc0146953 + SIOCBRDGGPARAM = 0xc03c6958 + SIOCBRDGGPRI = 0xc0146950 + SIOCBRDGGRL = 0xc028694f + SIOCBRDGGSIFS = 0xc054693c + SIOCBRDGGTO = 0xc0146946 + SIOCBRDGIFS = 0xc0546942 + SIOCBRDGRTS = 0xc0186943 + SIOCBRDGSADDR = 0xc1286944 + SIOCBRDGSCACHE = 0x80146940 + SIOCBRDGSFD = 0x80146952 + SIOCBRDGSHT = 0x80146951 + SIOCBRDGSIFCOST = 0x80546955 + SIOCBRDGSIFFLGS = 0x8054693f + SIOCBRDGSIFPRIO = 0x80546954 + SIOCBRDGSMA = 0x80146953 + SIOCBRDGSPRI = 0x80146950 + SIOCBRDGSPROTO = 0x8014695a + SIOCBRDGSTO = 0x80146945 + SIOCBRDGSTXHC = 0x80146959 + SIOCDELMULTI = 0x80206932 + SIOCDIFADDR = 0x80206919 + SIOCDIFGROUP = 0x80246989 + SIOCDIFPHYADDR = 0x80206949 + SIOCDLIFADDR = 0x8218691e + SIOCGETKALIVE = 0xc01869a4 + SIOCGETLABEL = 0x8020699a + SIOCGETPFLOW = 0xc02069fe + SIOCGETPFSYNC = 0xc02069f8 + SIOCGETSGCNT = 0xc0147534 + SIOCGETVIFCNT = 0xc0147533 + SIOCGETVLAN = 0xc0206990 + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0206921 + SIOCGIFASYNCMAP = 0xc020697c + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCONF = 0xc0086924 + SIOCGIFDATA = 0xc020691b + SIOCGIFDESCR = 0xc0206981 + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGATTR = 0xc024698b + SIOCGIFGENERIC = 0xc020693a + SIOCGIFGMEMB = 0xc024698a + SIOCGIFGROUP = 0xc0246988 + SIOCGIFHARDMTU = 0xc02069a5 + SIOCGIFMEDIA = 0xc0286936 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc020697e + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206948 + SIOCGIFPRIORITY = 0xc020699c + SIOCGIFPSRCADDR = 0xc0206947 + SIOCGIFRDOMAIN = 0xc02069a0 + SIOCGIFRTLABEL = 0xc0206983 + SIOCGIFRXR = 0x802069aa + SIOCGIFTIMESLOT = 0xc0206986 + SIOCGIFXFLAGS = 0xc020699e + SIOCGLIFADDR = 0xc218691d + SIOCGLIFPHYADDR = 0xc218694b + SIOCGLIFPHYRTABLE = 0xc02069a2 + SIOCGLIFPHYTTL = 0xc02069a9 + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCGSPPPPARAMS = 0xc0206994 + SIOCGVH = 0xc02069f6 + SIOCGVNETID = 0xc02069a7 + SIOCIFCREATE = 0x8020697a + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc00c6978 + SIOCSETKALIVE = 0x801869a3 + SIOCSETLABEL = 0x80206999 + SIOCSETPFLOW = 0x802069fd + SIOCSETPFSYNC = 0x802069f7 + SIOCSETVLAN = 0x8020698f + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFASYNCMAP = 0x8020697d + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFDESCR = 0x80206980 + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGATTR = 0x8024698c + SIOCSIFGENERIC = 0x80206939 + SIOCSIFLLADDR = 0x8020691f + SIOCSIFMEDIA = 0xc0206935 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x8020697f + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x80406946 + SIOCSIFPRIORITY = 0x8020699b + SIOCSIFRDOMAIN = 0x8020699f + SIOCSIFRTLABEL = 0x80206982 + SIOCSIFTIMESLOT = 0x80206985 + SIOCSIFXFLAGS = 0x8020699d + SIOCSLIFPHYADDR = 0x8218694a + SIOCSLIFPHYRTABLE = 0x802069a1 + SIOCSLIFPHYTTL = 0x802069a8 + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SIOCSSPPPPARAMS = 0x80206993 + SIOCSVH = 0xc02069f5 + SIOCSVNETID = 0x802069a6 + SOCK_CLOEXEC = 0x8000 + SOCK_DGRAM = 0x2 + SOCK_NONBLOCK = 0x4000 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_BINDANY = 0x1000 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_NETPROC = 0x1020 + SO_OOBINLINE = 0x100 + SO_PEERCRED = 0x1022 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_RTABLE = 0x1021 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_SPLICE = 0x1023 + SO_TIMESTAMP = 0x800 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISTXT = 0x200 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TCIFLUSH = 0x1 + TCIOFLUSH = 0x3 + TCOFLUSH = 0x2 + TCP_MAXBURST = 0x4 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x3 + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0x4 + TCP_MSS = 0x200 + TCP_NODELAY = 0x1 + TCP_NOPUSH = 0x10 + TCP_NSTATES = 0xb + TCP_SACK_ENABLE = 0x8 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLAG_CLOCAL = 0x2 + TIOCFLAG_CRTSCTS = 0x4 + TIOCFLAG_MDMBUF = 0x8 + TIOCFLAG_PPS = 0x10 + TIOCFLAG_SOFTCAR = 0x1 + TIOCFLUSH = 0x80047410 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGFLAGS = 0x4004745d + TIOCGPGRP = 0x40047477 + TIOCGSID = 0x40047463 + TIOCGTSTAMP = 0x400c745b + TIOCGWINSZ = 0x40087468 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGET = 0x4004746a + TIOCMODG = 0x4004746a + TIOCMODS = 0x8004746d + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSFLAGS = 0x8004745c + TIOCSIG = 0x8004745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x80047465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSTSTAMP = 0x8008745a + TIOCSWINSZ = 0x80087467 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WALTSIG = 0x4 + WCONTINUED = 0x8 + WCOREFLAG = 0x80 + WNOHANG = 0x1 + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADF = syscall.Errno(0x9) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x58) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDOM = syscall.Errno(0x21) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x59) + EILSEQ = syscall.Errno(0x54) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EIPSEC = syscall.Errno(0x52) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x5b) + ELOOP = syscall.Errno(0x3e) + EMEDIUMTYPE = syscall.Errno(0x56) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x53) + ENOBUFS = syscall.Errno(0x37) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOMEDIUM = syscall.Errno(0x55) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x5a) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x5b) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x57) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTHR = syscall.Signal(0x20) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "device not configured"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EDEADLK", "resource deadlock avoided"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "cross-device link"}, + {19, "ENODEV", "operation not supported by device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "result too large"}, + {35, "EWOULDBLOCK", "resource temporarily unavailable"}, + {36, "EINPROGRESS", "operation now in progress"}, + {37, "EALREADY", "operation already in progress"}, + {38, "ENOTSOCK", "socket operation on non-socket"}, + {39, "EDESTADDRREQ", "destination address required"}, + {40, "EMSGSIZE", "message too long"}, + {41, "EPROTOTYPE", "protocol wrong type for socket"}, + {42, "ENOPROTOOPT", "protocol not available"}, + {43, "EPROTONOSUPPORT", "protocol not supported"}, + {44, "ESOCKTNOSUPPORT", "socket type not supported"}, + {45, "EOPNOTSUPP", "operation not supported"}, + {46, "EPFNOSUPPORT", "protocol family not supported"}, + {47, "EAFNOSUPPORT", "address family not supported by protocol family"}, + {48, "EADDRINUSE", "address already in use"}, + {49, "EADDRNOTAVAIL", "can't assign requested address"}, + {50, "ENETDOWN", "network is down"}, + {51, "ENETUNREACH", "network is unreachable"}, + {52, "ENETRESET", "network dropped connection on reset"}, + {53, "ECONNABORTED", "software caused connection abort"}, + {54, "ECONNRESET", "connection reset by peer"}, + {55, "ENOBUFS", "no buffer space available"}, + {56, "EISCONN", "socket is already connected"}, + {57, "ENOTCONN", "socket is not connected"}, + {58, "ESHUTDOWN", "can't send after socket shutdown"}, + {59, "ETOOMANYREFS", "too many references: can't splice"}, + {60, "ETIMEDOUT", "operation timed out"}, + {61, "ECONNREFUSED", "connection refused"}, + {62, "ELOOP", "too many levels of symbolic links"}, + {63, "ENAMETOOLONG", "file name too long"}, + {64, "EHOSTDOWN", "host is down"}, + {65, "EHOSTUNREACH", "no route to host"}, + {66, "ENOTEMPTY", "directory not empty"}, + {67, "EPROCLIM", "too many processes"}, + {68, "EUSERS", "too many users"}, + {69, "EDQUOT", "disk quota exceeded"}, + {70, "ESTALE", "stale NFS file handle"}, + {71, "EREMOTE", "too many levels of remote in path"}, + {72, "EBADRPC", "RPC struct is bad"}, + {73, "ERPCMISMATCH", "RPC version wrong"}, + {74, "EPROGUNAVAIL", "RPC program not available"}, + {75, "EPROGMISMATCH", "program version wrong"}, + {76, "EPROCUNAVAIL", "bad procedure for program"}, + {77, "ENOLCK", "no locks available"}, + {78, "ENOSYS", "function not implemented"}, + {79, "EFTYPE", "inappropriate file type or format"}, + {80, "EAUTH", "authentication error"}, + {81, "ENEEDAUTH", "need authenticator"}, + {82, "EIPSEC", "IPsec processing failure"}, + {83, "ENOATTR", "attribute not found"}, + {84, "EILSEQ", "illegal byte sequence"}, + {85, "ENOMEDIUM", "no medium found"}, + {86, "EMEDIUMTYPE", "wrong medium type"}, + {87, "EOVERFLOW", "value too large to be stored in data type"}, + {88, "ECANCELED", "operation canceled"}, + {89, "EIDRM", "identifier removed"}, + {90, "ENOMSG", "no message of desired type"}, + {91, "ELAST", "not supported"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/BPT trap"}, + {6, "SIGABRT", "abort trap"}, + {7, "SIGEMT", "EMT trap"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGBUS", "bus error"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGSYS", "bad system call"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGURG", "urgent I/O condition"}, + {17, "SIGSTOP", "suspended (signal)"}, + {18, "SIGTSTP", "suspended"}, + {19, "SIGCONT", "continued"}, + {20, "SIGCHLD", "child exited"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGIO", "I/O possible"}, + {24, "SIGXCPU", "cputime limit exceeded"}, + {25, "SIGXFSZ", "filesize limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window size changes"}, + {29, "SIGINFO", "information request"}, + {30, "SIGUSR1", "user defined signal 1"}, + {31, "SIGUSR2", "user defined signal 2"}, + {32, "SIGTHR", "thread AST"}, +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go new file mode 100644 index 00000000..22569db3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go @@ -0,0 +1,1532 @@ +// mkerrors.sh -m64 +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,solaris + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m64 _const.go + +package unix + +import "syscall" + +const ( + AF_802 = 0x12 + AF_APPLETALK = 0x10 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_ECMA = 0x8 + AF_FILE = 0x1 + AF_GOSIP = 0x16 + AF_HYLINK = 0xf + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x1a + AF_INET_OFFLOAD = 0x1e + AF_IPX = 0x17 + AF_KEY = 0x1b + AF_LAT = 0xe + AF_LINK = 0x19 + AF_LOCAL = 0x1 + AF_MAX = 0x20 + AF_NBS = 0x7 + AF_NCA = 0x1c + AF_NIT = 0x11 + AF_NS = 0x6 + AF_OSI = 0x13 + AF_OSINET = 0x15 + AF_PACKET = 0x20 + AF_POLICY = 0x1d + AF_PUP = 0x4 + AF_ROUTE = 0x18 + AF_SNA = 0xb + AF_TRILL = 0x1f + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_X25 = 0x14 + ARPHRD_ARCNET = 0x7 + ARPHRD_ATM = 0x10 + ARPHRD_AX25 = 0x3 + ARPHRD_CHAOS = 0x5 + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_FC = 0x12 + ARPHRD_FRAME = 0xf + ARPHRD_HDLC = 0x11 + ARPHRD_IB = 0x20 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IPATM = 0x13 + ARPHRD_METRICOM = 0x17 + ARPHRD_TUNNEL = 0x1f + B0 = 0x0 + B110 = 0x3 + B115200 = 0x12 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B153600 = 0x13 + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B230400 = 0x14 + B2400 = 0xb + B300 = 0x7 + B307200 = 0x15 + B38400 = 0xf + B460800 = 0x16 + B4800 = 0xc + B50 = 0x1 + B57600 = 0x10 + B600 = 0x8 + B75 = 0x2 + B76800 = 0x11 + B921600 = 0x17 + B9600 = 0xd + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = -0x3fefbd89 + BIOCGDLTLIST32 = -0x3ff7bd89 + BIOCGETIF = 0x4020426b + BIOCGETLIF = 0x4078426b + BIOCGHDRCMPLT = 0x40044274 + BIOCGRTIMEOUT = 0x4010427b + BIOCGRTIMEOUT32 = 0x4008427b + BIOCGSEESENT = 0x40044278 + BIOCGSTATS = 0x4080426f + BIOCGSTATSOLD = 0x4008426f + BIOCIMMEDIATE = -0x7ffbbd90 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = -0x3ffbbd9a + BIOCSDLT = -0x7ffbbd8a + BIOCSETF = -0x7fefbd99 + BIOCSETF32 = -0x7ff7bd99 + BIOCSETIF = -0x7fdfbd94 + BIOCSETLIF = -0x7f87bd94 + BIOCSHDRCMPLT = -0x7ffbbd8b + BIOCSRTIMEOUT = -0x7fefbd86 + BIOCSRTIMEOUT32 = -0x7ff7bd86 + BIOCSSEESENT = -0x7ffbbd87 + BIOCSTCPF = -0x7fefbd8e + BIOCSUDPF = -0x7fefbd8d + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DFLTBUFSIZE = 0x100000 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x1000000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + CBAUD = 0xf + CFLUSH = 0xf + CIBAUD = 0xf0000 + CLOCAL = 0x800 + CLOCK_HIGHRES = 0x4 + CLOCK_LEVEL = 0xa + CLOCK_MONOTONIC = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x5 + CLOCK_PROF = 0x2 + CLOCK_REALTIME = 0x3 + CLOCK_THREAD_CPUTIME_ID = 0x2 + CLOCK_VIRTUAL = 0x1 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + CSWTCH = 0x1a + DLT_AIRONET_HEADER = 0x78 + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_BACNET_MS_TP = 0xa5 + DLT_CHAOS = 0x5 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_DOCSIS = 0x8f + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FDDI = 0xa + DLT_FRELAY = 0x6b + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_HDLC = 0x10 + DLT_HHDLC = 0x79 + DLT_HIPPI = 0xf + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IPNET = 0xe2 + DLT_IPOIB = 0xa2 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0xe + DLT_PPP_PPPD = 0xa6 + DLT_PRISM_HEADER = 0x77 + DLT_PRONET = 0x4 + DLT_RAW = 0xc + DLT_RAWAF_MASK = 0x2240000 + DLT_RIO = 0x7c + DLT_SCCP = 0x8e + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xd + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + EMPTY_SET = 0x0 + EMT_CPCOVF = 0x1 + EQUALITY_CHECK = 0x0 + EXTA = 0xe + EXTB = 0xf + FD_CLOEXEC = 0x1 + FD_NFDBITS = 0x40 + FD_SETSIZE = 0x10000 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHALL = 0x1 + FLUSHDATA = 0x0 + FLUSHO = 0x2000 + F_ALLOCSP = 0xa + F_ALLOCSP64 = 0xa + F_BADFD = 0x2e + F_BLKSIZE = 0x13 + F_BLOCKS = 0x12 + F_CHKFL = 0x8 + F_COMPAT = 0x8 + F_DUP2FD = 0x9 + F_DUP2FD_CLOEXEC = 0x24 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x25 + F_FLOCK = 0x35 + F_FLOCK64 = 0x35 + F_FLOCKW = 0x36 + F_FLOCKW64 = 0x36 + F_FREESP = 0xb + F_FREESP64 = 0xb + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0xe + F_GETLK64 = 0xe + F_GETOWN = 0x17 + F_GETXFL = 0x2d + F_HASREMOTELOCKS = 0x1a + F_ISSTREAM = 0xd + F_MANDDNY = 0x10 + F_MDACC = 0x20 + F_NODNY = 0x0 + F_NPRIV = 0x10 + F_OFD_GETLK = 0x2f + F_OFD_GETLK64 = 0x2f + F_OFD_SETLK = 0x30 + F_OFD_SETLK64 = 0x30 + F_OFD_SETLKW = 0x31 + F_OFD_SETLKW64 = 0x31 + F_PRIV = 0xf + F_QUOTACTL = 0x11 + F_RDACC = 0x1 + F_RDDNY = 0x1 + F_RDLCK = 0x1 + F_REVOKE = 0x19 + F_RMACC = 0x4 + F_RMDNY = 0x4 + F_RWACC = 0x3 + F_RWDNY = 0x3 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x6 + F_SETLK64 = 0x6 + F_SETLK64_NBMAND = 0x2a + F_SETLKW = 0x7 + F_SETLKW64 = 0x7 + F_SETLK_NBMAND = 0x2a + F_SETOWN = 0x18 + F_SHARE = 0x28 + F_SHARE_NBMAND = 0x2b + F_UNLCK = 0x3 + F_UNLKSYS = 0x4 + F_UNSHARE = 0x29 + F_WRACC = 0x2 + F_WRDNY = 0x2 + F_WRLCK = 0x2 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICRNL = 0x100 + IEXTEN = 0x8000 + IFF_ADDRCONF = 0x80000 + IFF_ALLMULTI = 0x200 + IFF_ANYCAST = 0x400000 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x7f203003b5a + IFF_COS_ENABLED = 0x200000000 + IFF_DEBUG = 0x4 + IFF_DEPRECATED = 0x40000 + IFF_DHCPRUNNING = 0x4000 + IFF_DUPLICATE = 0x4000000000 + IFF_FAILED = 0x10000000 + IFF_FIXEDMTU = 0x1000000000 + IFF_INACTIVE = 0x40000000 + IFF_INTELLIGENT = 0x400 + IFF_IPMP = 0x8000000000 + IFF_IPMP_CANTCHANGE = 0x10000000 + IFF_IPMP_INVALID = 0x1ec200080 + IFF_IPV4 = 0x1000000 + IFF_IPV6 = 0x2000000 + IFF_L3PROTECT = 0x40000000000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x800 + IFF_MULTI_BCAST = 0x1000 + IFF_NOACCEPT = 0x4000000 + IFF_NOARP = 0x80 + IFF_NOFAILOVER = 0x8000000 + IFF_NOLINKLOCAL = 0x20000000000 + IFF_NOLOCAL = 0x20000 + IFF_NONUD = 0x200000 + IFF_NORTEXCH = 0x800000 + IFF_NOTRAILERS = 0x20 + IFF_NOXMIT = 0x10000 + IFF_OFFLINE = 0x80000000 + IFF_POINTOPOINT = 0x10 + IFF_PREFERRED = 0x400000000 + IFF_PRIVATE = 0x8000 + IFF_PROMISC = 0x100 + IFF_ROUTER = 0x100000 + IFF_RUNNING = 0x40 + IFF_STANDBY = 0x20000000 + IFF_TEMPORARY = 0x800000000 + IFF_UNNUMBERED = 0x2000 + IFF_UP = 0x1 + IFF_VIRTUAL = 0x2000000000 + IFF_VRRP = 0x10000000000 + IFF_XRESOLV = 0x100000000 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_6TO4 = 0xca + IFT_AAL5 = 0x31 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ATM = 0x25 + IFT_CEPT = 0x13 + IFT_DS3 = 0x1e + IFT_EON = 0x19 + IFT_ETHER = 0x6 + IFT_FDDI = 0xf + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_HDH1822 = 0x3 + IFT_HIPPI = 0x2f + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IB = 0xc7 + IFT_IPV4 = 0xc8 + IFT_IPV6 = 0xc9 + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88026 = 0xa + IFT_LAPB = 0x10 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_NSIP = 0x1b + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PPP = 0x17 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PTPSERIAL = 0x16 + IFT_RS232 = 0x21 + IFT_SDLC = 0x11 + IFT_SIP = 0x1f + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_STARLAN = 0xb + IFT_T1 = 0x12 + IFT_ULTRA = 0x1d + IFT_V35 = 0x2d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_AUTOCONF_MASK = 0xffff0000 + IN_AUTOCONF_NET = 0xa9fe0000 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_CLASSE_NET = 0xffffffff + IN_LOOPBACKNET = 0x7f + IN_PRIVATE12_MASK = 0xfff00000 + IN_PRIVATE12_NET = 0xac100000 + IN_PRIVATE16_MASK = 0xffff0000 + IN_PRIVATE16_NET = 0xc0a80000 + IN_PRIVATE8_MASK = 0xff000000 + IN_PRIVATE8_NET = 0xa000000 + IPPROTO_AH = 0x33 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x4 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_HELLO = 0x3f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPV6 = 0x29 + IPPROTO_MAX = 0x100 + IPPROTO_ND = 0x4d + IPPROTO_NONE = 0x3b + IPPROTO_OSPF = 0x59 + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_UDP = 0x11 + IPV6_ADD_MEMBERSHIP = 0x9 + IPV6_BOUND_IF = 0x41 + IPV6_CHECKSUM = 0x18 + IPV6_DONTFRAG = 0x21 + IPV6_DROP_MEMBERSHIP = 0xa + IPV6_DSTOPTS = 0xf + IPV6_FLOWINFO_FLOWLABEL = 0xffff0f00 + IPV6_FLOWINFO_TCLASS = 0xf00f + IPV6_HOPLIMIT = 0xc + IPV6_HOPOPTS = 0xe + IPV6_JOIN_GROUP = 0x9 + IPV6_LEAVE_GROUP = 0xa + IPV6_MULTICAST_HOPS = 0x7 + IPV6_MULTICAST_IF = 0x6 + IPV6_MULTICAST_LOOP = 0x8 + IPV6_NEXTHOP = 0xd + IPV6_PAD1_OPT = 0x0 + IPV6_PATHMTU = 0x25 + IPV6_PKTINFO = 0xb + IPV6_PREFER_SRC_CGA = 0x20 + IPV6_PREFER_SRC_CGADEFAULT = 0x10 + IPV6_PREFER_SRC_CGAMASK = 0x30 + IPV6_PREFER_SRC_COA = 0x2 + IPV6_PREFER_SRC_DEFAULT = 0x15 + IPV6_PREFER_SRC_HOME = 0x1 + IPV6_PREFER_SRC_MASK = 0x3f + IPV6_PREFER_SRC_MIPDEFAULT = 0x1 + IPV6_PREFER_SRC_MIPMASK = 0x3 + IPV6_PREFER_SRC_NONCGA = 0x10 + IPV6_PREFER_SRC_PUBLIC = 0x4 + IPV6_PREFER_SRC_TMP = 0x8 + IPV6_PREFER_SRC_TMPDEFAULT = 0x4 + IPV6_PREFER_SRC_TMPMASK = 0xc + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVHOPLIMIT = 0x13 + IPV6_RECVHOPOPTS = 0x14 + IPV6_RECVPATHMTU = 0x24 + IPV6_RECVPKTINFO = 0x12 + IPV6_RECVRTHDR = 0x16 + IPV6_RECVRTHDRDSTOPTS = 0x17 + IPV6_RECVTCLASS = 0x19 + IPV6_RTHDR = 0x10 + IPV6_RTHDRDSTOPTS = 0x11 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SEC_OPT = 0x22 + IPV6_SRC_PREFERENCES = 0x23 + IPV6_TCLASS = 0x26 + IPV6_UNICAST_HOPS = 0x5 + IPV6_UNSPEC_SRC = 0x42 + IPV6_USE_MIN_MTU = 0x20 + IPV6_V6ONLY = 0x27 + IP_ADD_MEMBERSHIP = 0x13 + IP_ADD_SOURCE_MEMBERSHIP = 0x17 + IP_BLOCK_SOURCE = 0x15 + IP_BOUND_IF = 0x41 + IP_BROADCAST = 0x106 + IP_BROADCAST_TTL = 0x43 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DHCPINIT_IF = 0x45 + IP_DONTFRAG = 0x1b + IP_DONTROUTE = 0x105 + IP_DROP_MEMBERSHIP = 0x14 + IP_DROP_SOURCE_MEMBERSHIP = 0x18 + IP_HDRINCL = 0x2 + IP_MAXPACKET = 0xffff + IP_MF = 0x2000 + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x10 + IP_MULTICAST_LOOP = 0x12 + IP_MULTICAST_TTL = 0x11 + IP_NEXTHOP = 0x19 + IP_OPTIONS = 0x1 + IP_PKTINFO = 0x1a + IP_RECVDSTADDR = 0x7 + IP_RECVIF = 0x9 + IP_RECVOPTS = 0x5 + IP_RECVPKTINFO = 0x1a + IP_RECVRETOPTS = 0x6 + IP_RECVSLLA = 0xa + IP_RECVTTL = 0xb + IP_RETOPTS = 0x8 + IP_REUSEADDR = 0x104 + IP_SEC_OPT = 0x22 + IP_TOS = 0x3 + IP_TTL = 0x4 + IP_UNBLOCK_SOURCE = 0x16 + IP_UNSPEC_SRC = 0x42 + ISIG = 0x1 + ISTRIP = 0x20 + IUCLC = 0x200 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_ACCESS_DEFAULT = 0x6 + MADV_ACCESS_LWP = 0x7 + MADV_ACCESS_MANY = 0x8 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x5 + MADV_NORMAL = 0x0 + MADV_PURGE = 0x9 + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_WILLNEED = 0x3 + MAP_32BIT = 0x80 + MAP_ALIGN = 0x200 + MAP_ANON = 0x100 + MAP_ANONYMOUS = 0x100 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_INITDATA = 0x800 + MAP_NORESERVE = 0x40 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_SHARED = 0x1 + MAP_TEXT = 0x400 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MSG_CTRUNC = 0x10 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_DUPCTRL = 0x800 + MSG_EOR = 0x8 + MSG_MAXIOVLEN = 0x10 + MSG_NOTIFICATION = 0x100 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x20 + MSG_WAITALL = 0x40 + MSG_XPG4_2 = 0x8000 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x2 + MS_OLDSYNC = 0x0 + MS_SYNC = 0x4 + M_FLUSH = 0x86 + NAME_MAX = 0xff + NEWDEV = 0x1 + NL0 = 0x0 + NL1 = 0x100 + NLDLY = 0x100 + NOFLSH = 0x80 + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + OLDDEV = 0x0 + ONBITSMAJOR = 0x7 + ONBITSMINOR = 0x8 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPENFAIL = -0x1 + OPOST = 0x1 + O_ACCMODE = 0x600003 + O_APPEND = 0x8 + O_CLOEXEC = 0x800000 + O_CREAT = 0x100 + O_DSYNC = 0x40 + O_EXCL = 0x400 + O_EXEC = 0x400000 + O_LARGEFILE = 0x2000 + O_NDELAY = 0x4 + O_NOCTTY = 0x800 + O_NOFOLLOW = 0x20000 + O_NOLINKS = 0x40000 + O_NONBLOCK = 0x80 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x8000 + O_SEARCH = 0x200000 + O_SIOCGIFCONF = -0x3ff796ec + O_SIOCGLIFCONF = -0x3fef9688 + O_SYNC = 0x10 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + O_XATTR = 0x4000 + PARENB = 0x100 + PAREXT = 0x100000 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + RLIMIT_AS = 0x6 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_NOFILE = 0x5 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = -0x3 + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x9 + RTAX_NETMASK = 0x2 + RTAX_SRC = 0x8 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTA_NUMBITS = 0x9 + RTA_SRC = 0x100 + RTF_BLACKHOLE = 0x1000 + RTF_CLONING = 0x100 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INDIRECT = 0x40000 + RTF_KERNEL = 0x80000 + RTF_LLINFO = 0x400 + RTF_MASK = 0x80 + RTF_MODIFIED = 0x20 + RTF_MULTIRT = 0x10000 + RTF_PRIVATE = 0x2000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_REJECT = 0x8 + RTF_SETSRC = 0x20000 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_XRESOLVE = 0x200 + RTF_ZONE = 0x100000 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_CHGADDR = 0xf + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_FREEADDR = 0x10 + RTM_GET = 0x4 + RTM_IFINFO = 0xe + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_VERSION = 0x3 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RT_AWARE = 0x1 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + SCM_RIGHTS = 0x1010 + SCM_TIMESTAMP = 0x1013 + SCM_UCRED = 0x1012 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIG2STR_MAX = 0x20 + SIOCADDMULTI = -0x7fdf96cf + SIOCADDRT = -0x7fcf8df6 + SIOCATMARK = 0x40047307 + SIOCDARP = -0x7fdb96e0 + SIOCDELMULTI = -0x7fdf96ce + SIOCDELRT = -0x7fcf8df5 + SIOCDXARP = -0x7fff9658 + SIOCGARP = -0x3fdb96e1 + SIOCGDSTINFO = -0x3fff965c + SIOCGENADDR = -0x3fdf96ab + SIOCGENPSTATS = -0x3fdf96c7 + SIOCGETLSGCNT = -0x3fef8deb + SIOCGETNAME = 0x40107334 + SIOCGETPEER = 0x40107335 + SIOCGETPROP = -0x3fff8f44 + SIOCGETSGCNT = -0x3feb8deb + SIOCGETSYNC = -0x3fdf96d3 + SIOCGETVIFCNT = -0x3feb8dec + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = -0x3fdf96f3 + SIOCGIFBRDADDR = -0x3fdf96e9 + SIOCGIFCONF = -0x3ff796a4 + SIOCGIFDSTADDR = -0x3fdf96f1 + SIOCGIFFLAGS = -0x3fdf96ef + SIOCGIFHWADDR = -0x3fdf9647 + SIOCGIFINDEX = -0x3fdf96a6 + SIOCGIFMEM = -0x3fdf96ed + SIOCGIFMETRIC = -0x3fdf96e5 + SIOCGIFMTU = -0x3fdf96ea + SIOCGIFMUXID = -0x3fdf96a8 + SIOCGIFNETMASK = -0x3fdf96e7 + SIOCGIFNUM = 0x40046957 + SIOCGIP6ADDRPOLICY = -0x3fff965e + SIOCGIPMSFILTER = -0x3ffb964c + SIOCGLIFADDR = -0x3f87968f + SIOCGLIFBINDING = -0x3f879666 + SIOCGLIFBRDADDR = -0x3f879685 + SIOCGLIFCONF = -0x3fef965b + SIOCGLIFDADSTATE = -0x3f879642 + SIOCGLIFDSTADDR = -0x3f87968d + SIOCGLIFFLAGS = -0x3f87968b + SIOCGLIFGROUPINFO = -0x3f4b9663 + SIOCGLIFGROUPNAME = -0x3f879664 + SIOCGLIFHWADDR = -0x3f879640 + SIOCGLIFINDEX = -0x3f87967b + SIOCGLIFLNKINFO = -0x3f879674 + SIOCGLIFMETRIC = -0x3f879681 + SIOCGLIFMTU = -0x3f879686 + SIOCGLIFMUXID = -0x3f87967d + SIOCGLIFNETMASK = -0x3f879683 + SIOCGLIFNUM = -0x3ff3967e + SIOCGLIFSRCOF = -0x3fef964f + SIOCGLIFSUBNET = -0x3f879676 + SIOCGLIFTOKEN = -0x3f879678 + SIOCGLIFUSESRC = -0x3f879651 + SIOCGLIFZONE = -0x3f879656 + SIOCGLOWAT = 0x40047303 + SIOCGMSFILTER = -0x3ffb964e + SIOCGPGRP = 0x40047309 + SIOCGSTAMP = -0x3fef9646 + SIOCGXARP = -0x3fff9659 + SIOCIFDETACH = -0x7fdf96c8 + SIOCILB = -0x3ffb9645 + SIOCLIFADDIF = -0x3f879691 + SIOCLIFDELND = -0x7f879673 + SIOCLIFGETND = -0x3f879672 + SIOCLIFREMOVEIF = -0x7f879692 + SIOCLIFSETND = -0x7f879671 + SIOCLOWER = -0x7fdf96d7 + SIOCSARP = -0x7fdb96e2 + SIOCSCTPGOPT = -0x3fef9653 + SIOCSCTPPEELOFF = -0x3ffb9652 + SIOCSCTPSOPT = -0x7fef9654 + SIOCSENABLESDP = -0x3ffb9649 + SIOCSETPROP = -0x7ffb8f43 + SIOCSETSYNC = -0x7fdf96d4 + SIOCSHIWAT = -0x7ffb8d00 + SIOCSIFADDR = -0x7fdf96f4 + SIOCSIFBRDADDR = -0x7fdf96e8 + SIOCSIFDSTADDR = -0x7fdf96f2 + SIOCSIFFLAGS = -0x7fdf96f0 + SIOCSIFINDEX = -0x7fdf96a5 + SIOCSIFMEM = -0x7fdf96ee + SIOCSIFMETRIC = -0x7fdf96e4 + SIOCSIFMTU = -0x7fdf96eb + SIOCSIFMUXID = -0x7fdf96a7 + SIOCSIFNAME = -0x7fdf96b7 + SIOCSIFNETMASK = -0x7fdf96e6 + SIOCSIP6ADDRPOLICY = -0x7fff965d + SIOCSIPMSFILTER = -0x7ffb964b + SIOCSLGETREQ = -0x3fdf96b9 + SIOCSLIFADDR = -0x7f879690 + SIOCSLIFBRDADDR = -0x7f879684 + SIOCSLIFDSTADDR = -0x7f87968e + SIOCSLIFFLAGS = -0x7f87968c + SIOCSLIFGROUPNAME = -0x7f879665 + SIOCSLIFINDEX = -0x7f87967a + SIOCSLIFLNKINFO = -0x7f879675 + SIOCSLIFMETRIC = -0x7f879680 + SIOCSLIFMTU = -0x7f879687 + SIOCSLIFMUXID = -0x7f87967c + SIOCSLIFNAME = -0x3f87967f + SIOCSLIFNETMASK = -0x7f879682 + SIOCSLIFPREFIX = -0x3f879641 + SIOCSLIFSUBNET = -0x7f879677 + SIOCSLIFTOKEN = -0x7f879679 + SIOCSLIFUSESRC = -0x7f879650 + SIOCSLIFZONE = -0x7f879655 + SIOCSLOWAT = -0x7ffb8cfe + SIOCSLSTAT = -0x7fdf96b8 + SIOCSMSFILTER = -0x7ffb964d + SIOCSPGRP = -0x7ffb8cf8 + SIOCSPROMISC = -0x7ffb96d0 + SIOCSQPTR = -0x3ffb9648 + SIOCSSDSTATS = -0x3fdf96d2 + SIOCSSESTATS = -0x3fdf96d1 + SIOCSXARP = -0x7fff965a + SIOCTMYADDR = -0x3ff79670 + SIOCTMYSITE = -0x3ff7966e + SIOCTONLINK = -0x3ff7966f + SIOCUPPER = -0x7fdf96d8 + SIOCX25RCV = -0x3fdf96c4 + SIOCX25TBL = -0x3fdf96c3 + SIOCX25XMT = -0x3fdf96c5 + SIOCXPROTO = 0x20007337 + SOCK_CLOEXEC = 0x80000 + SOCK_DGRAM = 0x1 + SOCK_NDELAY = 0x200000 + SOCK_NONBLOCK = 0x100000 + SOCK_RAW = 0x4 + SOCK_RDM = 0x5 + SOCK_SEQPACKET = 0x6 + SOCK_STREAM = 0x2 + SOCK_TYPE_MASK = 0xffff + SOL_FILTER = 0xfffc + SOL_PACKET = 0xfffd + SOL_ROUTE = 0xfffe + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_ALL = 0x3f + SO_ALLZONES = 0x1014 + SO_ANON_MLP = 0x100a + SO_ATTACH_FILTER = 0x40000001 + SO_BAND = 0x4000 + SO_BROADCAST = 0x20 + SO_COPYOPT = 0x80000 + SO_DEBUG = 0x1 + SO_DELIM = 0x8000 + SO_DETACH_FILTER = 0x40000002 + SO_DGRAM_ERRIND = 0x200 + SO_DOMAIN = 0x100c + SO_DONTLINGER = -0x81 + SO_DONTROUTE = 0x10 + SO_ERROPT = 0x40000 + SO_ERROR = 0x1007 + SO_EXCLBIND = 0x1015 + SO_HIWAT = 0x10 + SO_ISNTTY = 0x800 + SO_ISTTY = 0x400 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_LOWAT = 0x20 + SO_MAC_EXEMPT = 0x100b + SO_MAC_IMPLICIT = 0x1016 + SO_MAXBLK = 0x100000 + SO_MAXPSZ = 0x8 + SO_MINPSZ = 0x4 + SO_MREADOFF = 0x80 + SO_MREADON = 0x40 + SO_NDELOFF = 0x200 + SO_NDELON = 0x100 + SO_NODELIM = 0x10000 + SO_OOBINLINE = 0x100 + SO_PROTOTYPE = 0x1009 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVPSH = 0x100d + SO_RCVTIMEO = 0x1006 + SO_READOPT = 0x1 + SO_RECVUCRED = 0x400 + SO_REUSEADDR = 0x4 + SO_SECATTR = 0x1011 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_STRHOLD = 0x20000 + SO_TAIL = 0x200000 + SO_TIMESTAMP = 0x1013 + SO_TONSTOP = 0x2000 + SO_TOSTOP = 0x1000 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + SO_VRRP = 0x1017 + SO_WROFF = 0x2 + S_ENFMT = 0x400 + S_IAMB = 0x1ff + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFDOOR = 0xd000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFNAM = 0x5000 + S_IFPORT = 0xe000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_INSEM = 0x1 + S_INSHD = 0x2 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TCFLSH = 0x5407 + TCGETA = 0x5401 + TCGETS = 0x540d + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_ABORT_THRESHOLD = 0x11 + TCP_ANONPRIVBIND = 0x20 + TCP_CONN_ABORT_THRESHOLD = 0x13 + TCP_CONN_NOTIFY_THRESHOLD = 0x12 + TCP_CORK = 0x18 + TCP_EXCLBIND = 0x21 + TCP_INIT_CWND = 0x15 + TCP_KEEPALIVE = 0x8 + TCP_KEEPALIVE_ABORT_THRESHOLD = 0x17 + TCP_KEEPALIVE_THRESHOLD = 0x16 + TCP_KEEPCNT = 0x23 + TCP_KEEPIDLE = 0x22 + TCP_KEEPINTVL = 0x24 + TCP_LINGER2 = 0x1c + TCP_MAXSEG = 0x2 + TCP_MSS = 0x218 + TCP_NODELAY = 0x1 + TCP_NOTIFY_THRESHOLD = 0x10 + TCP_RECVDSTADDR = 0x14 + TCP_RTO_INITIAL = 0x19 + TCP_RTO_MAX = 0x1b + TCP_RTO_MIN = 0x1a + TCSAFLUSH = 0x5410 + TCSBRK = 0x5405 + TCSETA = 0x5402 + TCSETAF = 0x5404 + TCSETAW = 0x5403 + TCSETS = 0x540e + TCSETSF = 0x5410 + TCSETSW = 0x540f + TCXONC = 0x5406 + TIOC = 0x5400 + TIOCCBRK = 0x747a + TIOCCDTR = 0x7478 + TIOCCILOOP = 0x746c + TIOCEXCL = 0x740d + TIOCFLUSH = 0x7410 + TIOCGETC = 0x7412 + TIOCGETD = 0x7400 + TIOCGETP = 0x7408 + TIOCGLTC = 0x7474 + TIOCGPGRP = 0x7414 + TIOCGPPS = 0x547d + TIOCGPPSEV = 0x547f + TIOCGSID = 0x7416 + TIOCGSOFTCAR = 0x5469 + TIOCGWINSZ = 0x5468 + TIOCHPCL = 0x7402 + TIOCKBOF = 0x5409 + TIOCKBON = 0x5408 + TIOCLBIC = 0x747e + TIOCLBIS = 0x747f + TIOCLGET = 0x747c + TIOCLSET = 0x747d + TIOCMBIC = 0x741c + TIOCMBIS = 0x741b + TIOCMGET = 0x741d + TIOCMSET = 0x741a + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x7471 + TIOCNXCL = 0x740e + TIOCOUTQ = 0x7473 + TIOCREMOTE = 0x741e + TIOCSBRK = 0x747b + TIOCSCTTY = 0x7484 + TIOCSDTR = 0x7479 + TIOCSETC = 0x7411 + TIOCSETD = 0x7401 + TIOCSETN = 0x740a + TIOCSETP = 0x7409 + TIOCSIGNAL = 0x741f + TIOCSILOOP = 0x746d + TIOCSLTC = 0x7475 + TIOCSPGRP = 0x7415 + TIOCSPPS = 0x547e + TIOCSSOFTCAR = 0x546a + TIOCSTART = 0x746e + TIOCSTI = 0x7417 + TIOCSTOP = 0x746f + TIOCSWINSZ = 0x5467 + TOSTOP = 0x100 + UTIME_NOW = -0x1 + UTIME_OMIT = -0x2 + VCEOF = 0x8 + VCEOL = 0x9 + VDISCARD = 0xd + VDSUSP = 0xb + VEOF = 0x4 + VEOL = 0x5 + VEOL2 = 0x6 + VERASE = 0x2 + VERASE2 = 0x11 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMIN = 0x4 + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTATUS = 0x10 + VSTOP = 0x9 + VSUSP = 0xa + VSWTCH = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WCONTFLG = 0xffff + WCONTINUED = 0x8 + WCOREFLG = 0x80 + WEXITED = 0x1 + WNOHANG = 0x40 + WNOWAIT = 0x80 + WOPTMASK = 0xcf + WRAP = 0x20000 + WSIGMASK = 0x7f + WSTOPFLG = 0x7f + WSTOPPED = 0x4 + WTRAPPED = 0x2 + WUNTRACED = 0x4 + XCASE = 0x4 + XTABS = 0x1800 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x7d) + EADDRNOTAVAIL = syscall.Errno(0x7e) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x7c) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x95) + EBADE = syscall.Errno(0x32) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x51) + EBADMSG = syscall.Errno(0x4d) + EBADR = syscall.Errno(0x33) + EBADRQC = syscall.Errno(0x36) + EBADSLT = syscall.Errno(0x37) + EBFONT = syscall.Errno(0x39) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x2f) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x25) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x82) + ECONNREFUSED = syscall.Errno(0x92) + ECONNRESET = syscall.Errno(0x83) + EDEADLK = syscall.Errno(0x2d) + EDEADLOCK = syscall.Errno(0x38) + EDESTADDRREQ = syscall.Errno(0x60) + EDOM = syscall.Errno(0x21) + EDQUOT = syscall.Errno(0x31) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x93) + EHOSTUNREACH = syscall.Errno(0x94) + EIDRM = syscall.Errno(0x24) + EILSEQ = syscall.Errno(0x58) + EINPROGRESS = syscall.Errno(0x96) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x85) + EISDIR = syscall.Errno(0x15) + EL2HLT = syscall.Errno(0x2c) + EL2NSYNC = syscall.Errno(0x26) + EL3HLT = syscall.Errno(0x27) + EL3RST = syscall.Errno(0x28) + ELIBACC = syscall.Errno(0x53) + ELIBBAD = syscall.Errno(0x54) + ELIBEXEC = syscall.Errno(0x57) + ELIBMAX = syscall.Errno(0x56) + ELIBSCN = syscall.Errno(0x55) + ELNRNG = syscall.Errno(0x29) + ELOCKUNMAPPED = syscall.Errno(0x48) + ELOOP = syscall.Errno(0x5a) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x61) + EMULTIHOP = syscall.Errno(0x4a) + ENAMETOOLONG = syscall.Errno(0x4e) + ENETDOWN = syscall.Errno(0x7f) + ENETRESET = syscall.Errno(0x81) + ENETUNREACH = syscall.Errno(0x80) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x35) + ENOBUFS = syscall.Errno(0x84) + ENOCSI = syscall.Errno(0x2b) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x2e) + ENOLINK = syscall.Errno(0x43) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x23) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x63) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x59) + ENOTACTIVE = syscall.Errno(0x49) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x86) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x5d) + ENOTRECOVERABLE = syscall.Errno(0x3b) + ENOTSOCK = syscall.Errno(0x5f) + ENOTSUP = syscall.Errno(0x30) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x50) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x7a) + EOVERFLOW = syscall.Errno(0x4f) + EOWNERDEAD = syscall.Errno(0x3a) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x7b) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x78) + EPROTOTYPE = syscall.Errno(0x62) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x52) + EREMOTE = syscall.Errno(0x42) + ERESTART = syscall.Errno(0x5b) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x8f) + ESOCKTNOSUPPORT = syscall.Errno(0x79) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x97) + ESTRPIPE = syscall.Errno(0x5c) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x91) + ETOOMANYREFS = syscall.Errno(0x90) + ETXTBSY = syscall.Errno(0x1a) + EUNATCH = syscall.Errno(0x2a) + EUSERS = syscall.Errno(0x5e) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x34) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCANCEL = syscall.Signal(0x24) + SIGCHLD = syscall.Signal(0x12) + SIGCLD = syscall.Signal(0x12) + SIGCONT = syscall.Signal(0x19) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGFREEZE = syscall.Signal(0x22) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x29) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x16) + SIGIOT = syscall.Signal(0x6) + SIGJVM1 = syscall.Signal(0x27) + SIGJVM2 = syscall.Signal(0x28) + SIGKILL = syscall.Signal(0x9) + SIGLOST = syscall.Signal(0x25) + SIGLWP = syscall.Signal(0x21) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x16) + SIGPROF = syscall.Signal(0x1d) + SIGPWR = syscall.Signal(0x13) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x17) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTHAW = syscall.Signal(0x23) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x18) + SIGTTIN = syscall.Signal(0x1a) + SIGTTOU = syscall.Signal(0x1b) + SIGURG = syscall.Signal(0x15) + SIGUSR1 = syscall.Signal(0x10) + SIGUSR2 = syscall.Signal(0x11) + SIGVTALRM = syscall.Signal(0x1c) + SIGWAITING = syscall.Signal(0x20) + SIGWINCH = syscall.Signal(0x14) + SIGXCPU = syscall.Signal(0x1e) + SIGXFSZ = syscall.Signal(0x1f) + SIGXRES = syscall.Signal(0x26) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "not owner"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "I/O error"}, + {6, "ENXIO", "no such device or address"}, + {7, "E2BIG", "arg list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file number"}, + {10, "ECHILD", "no child processes"}, + {11, "EAGAIN", "resource temporarily unavailable"}, + {12, "ENOMEM", "not enough space"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "cross-device link"}, + {19, "ENODEV", "no such device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "file table overflow"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "argument out of domain"}, + {34, "ERANGE", "result too large"}, + {35, "ENOMSG", "no message of desired type"}, + {36, "EIDRM", "identifier removed"}, + {37, "ECHRNG", "channel number out of range"}, + {38, "EL2NSYNC", "level 2 not synchronized"}, + {39, "EL3HLT", "level 3 halted"}, + {40, "EL3RST", "level 3 reset"}, + {41, "ELNRNG", "link number out of range"}, + {42, "EUNATCH", "protocol driver not attached"}, + {43, "ENOCSI", "no CSI structure available"}, + {44, "EL2HLT", "level 2 halted"}, + {45, "EDEADLK", "deadlock situation detected/avoided"}, + {46, "ENOLCK", "no record locks available"}, + {47, "ECANCELED", "operation canceled"}, + {48, "ENOTSUP", "operation not supported"}, + {49, "EDQUOT", "disc quota exceeded"}, + {50, "EBADE", "bad exchange descriptor"}, + {51, "EBADR", "bad request descriptor"}, + {52, "EXFULL", "message tables full"}, + {53, "ENOANO", "anode table overflow"}, + {54, "EBADRQC", "bad request code"}, + {55, "EBADSLT", "invalid slot"}, + {56, "EDEADLOCK", "file locking deadlock"}, + {57, "EBFONT", "bad font file format"}, + {58, "EOWNERDEAD", "owner of the lock died"}, + {59, "ENOTRECOVERABLE", "lock is not recoverable"}, + {60, "ENOSTR", "not a stream device"}, + {61, "ENODATA", "no data available"}, + {62, "ETIME", "timer expired"}, + {63, "ENOSR", "out of stream resources"}, + {64, "ENONET", "machine is not on the network"}, + {65, "ENOPKG", "package not installed"}, + {66, "EREMOTE", "object is remote"}, + {67, "ENOLINK", "link has been severed"}, + {68, "EADV", "advertise error"}, + {69, "ESRMNT", "srmount error"}, + {70, "ECOMM", "communication error on send"}, + {71, "EPROTO", "protocol error"}, + {72, "ELOCKUNMAPPED", "locked lock was unmapped "}, + {73, "ENOTACTIVE", "facility is not active"}, + {74, "EMULTIHOP", "multihop attempted"}, + {77, "EBADMSG", "not a data message"}, + {78, "ENAMETOOLONG", "file name too long"}, + {79, "EOVERFLOW", "value too large for defined data type"}, + {80, "ENOTUNIQ", "name not unique on network"}, + {81, "EBADFD", "file descriptor in bad state"}, + {82, "EREMCHG", "remote address changed"}, + {83, "ELIBACC", "can not access a needed shared library"}, + {84, "ELIBBAD", "accessing a corrupted shared library"}, + {85, "ELIBSCN", ".lib section in a.out corrupted"}, + {86, "ELIBMAX", "attempting to link in more shared libraries than system limit"}, + {87, "ELIBEXEC", "can not exec a shared library directly"}, + {88, "EILSEQ", "illegal byte sequence"}, + {89, "ENOSYS", "operation not applicable"}, + {90, "ELOOP", "number of symbolic links encountered during path name traversal exceeds MAXSYMLINKS"}, + {91, "ERESTART", "error 91"}, + {92, "ESTRPIPE", "error 92"}, + {93, "ENOTEMPTY", "directory not empty"}, + {94, "EUSERS", "too many users"}, + {95, "ENOTSOCK", "socket operation on non-socket"}, + {96, "EDESTADDRREQ", "destination address required"}, + {97, "EMSGSIZE", "message too long"}, + {98, "EPROTOTYPE", "protocol wrong type for socket"}, + {99, "ENOPROTOOPT", "option not supported by protocol"}, + {120, "EPROTONOSUPPORT", "protocol not supported"}, + {121, "ESOCKTNOSUPPORT", "socket type not supported"}, + {122, "EOPNOTSUPP", "operation not supported on transport endpoint"}, + {123, "EPFNOSUPPORT", "protocol family not supported"}, + {124, "EAFNOSUPPORT", "address family not supported by protocol family"}, + {125, "EADDRINUSE", "address already in use"}, + {126, "EADDRNOTAVAIL", "cannot assign requested address"}, + {127, "ENETDOWN", "network is down"}, + {128, "ENETUNREACH", "network is unreachable"}, + {129, "ENETRESET", "network dropped connection because of reset"}, + {130, "ECONNABORTED", "software caused connection abort"}, + {131, "ECONNRESET", "connection reset by peer"}, + {132, "ENOBUFS", "no buffer space available"}, + {133, "EISCONN", "transport endpoint is already connected"}, + {134, "ENOTCONN", "transport endpoint is not connected"}, + {143, "ESHUTDOWN", "cannot send after socket shutdown"}, + {144, "ETOOMANYREFS", "too many references: cannot splice"}, + {145, "ETIMEDOUT", "connection timed out"}, + {146, "ECONNREFUSED", "connection refused"}, + {147, "EHOSTDOWN", "host is down"}, + {148, "EHOSTUNREACH", "no route to host"}, + {149, "EALREADY", "operation already in progress"}, + {150, "EINPROGRESS", "operation now in progress"}, + {151, "ESTALE", "stale NFS file handle"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal Instruction"}, + {5, "SIGTRAP", "trace/Breakpoint Trap"}, + {6, "SIGABRT", "abort"}, + {7, "SIGEMT", "emulation Trap"}, + {8, "SIGFPE", "arithmetic Exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGBUS", "bus Error"}, + {11, "SIGSEGV", "segmentation Fault"}, + {12, "SIGSYS", "bad System Call"}, + {13, "SIGPIPE", "broken Pipe"}, + {14, "SIGALRM", "alarm Clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGUSR1", "user Signal 1"}, + {17, "SIGUSR2", "user Signal 2"}, + {18, "SIGCHLD", "child Status Changed"}, + {19, "SIGPWR", "power-Fail/Restart"}, + {20, "SIGWINCH", "window Size Change"}, + {21, "SIGURG", "urgent Socket Condition"}, + {22, "SIGIO", "pollable Event"}, + {23, "SIGSTOP", "stopped (signal)"}, + {24, "SIGTSTP", "stopped (user)"}, + {25, "SIGCONT", "continued"}, + {26, "SIGTTIN", "stopped (tty input)"}, + {27, "SIGTTOU", "stopped (tty output)"}, + {28, "SIGVTALRM", "virtual Timer Expired"}, + {29, "SIGPROF", "profiling Timer Expired"}, + {30, "SIGXCPU", "cpu Limit Exceeded"}, + {31, "SIGXFSZ", "file Size Limit Exceeded"}, + {32, "SIGWAITING", "no runnable lwp"}, + {33, "SIGLWP", "inter-lwp signal"}, + {34, "SIGFREEZE", "checkpoint Freeze"}, + {35, "SIGTHAW", "checkpoint Thaw"}, + {36, "SIGCANCEL", "thread Cancellation"}, + {37, "SIGLOST", "resource Lost"}, + {38, "SIGXRES", "resource Control Exceeded"}, + {39, "SIGJVM1", "reserved for JVM 1"}, + {40, "SIGJVM2", "reserved for JVM 2"}, + {41, "SIGINFO", "information Request"}, +} diff --git a/vendor/golang.org/x/sys/unix/zptrace386_linux.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zptrace386_linux.go similarity index 100% rename from vendor/golang.org/x/sys/unix/zptrace386_linux.go rename to vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zptrace386_linux.go diff --git a/vendor/golang.org/x/sys/unix/zptracearm_linux.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zptracearm_linux.go similarity index 100% rename from vendor/golang.org/x/sys/unix/zptracearm_linux.go rename to vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zptracearm_linux.go diff --git a/vendor/golang.org/x/sys/unix/zptracemips_linux.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zptracemips_linux.go similarity index 100% rename from vendor/golang.org/x/sys/unix/zptracemips_linux.go rename to vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zptracemips_linux.go diff --git a/vendor/golang.org/x/sys/unix/zptracemipsle_linux.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zptracemipsle_linux.go similarity index 100% rename from vendor/golang.org/x/sys/unix/zptracemipsle_linux.go rename to vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zptracemipsle_linux.go diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go new file mode 100644 index 00000000..6bae21e5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go @@ -0,0 +1,1450 @@ +// mksyscall_aix_ppc.pl -aix -tags aix,ppc syscall_aix.go syscall_aix_ppc.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build aix,ppc + +package unix + +/* +#include +#include +int utimes(uintptr_t, uintptr_t); +int utimensat(int, uintptr_t, uintptr_t, int); +int getcwd(uintptr_t, size_t); +int accept(int, uintptr_t, uintptr_t); +int getdirent(int, uintptr_t, size_t); +int wait4(int, uintptr_t, int, uintptr_t); +int ioctl(int, int, uintptr_t); +int fcntl(uintptr_t, int, uintptr_t); +int acct(uintptr_t); +int chdir(uintptr_t); +int chroot(uintptr_t); +int close(int); +int dup(int); +void exit(int); +int faccessat(int, uintptr_t, unsigned int, int); +int fchdir(int); +int fchmod(int, unsigned int); +int fchmodat(int, uintptr_t, unsigned int, int); +int fchownat(int, uintptr_t, int, int, int); +int fdatasync(int); +int fsync(int); +int getpgid(int); +int getpgrp(); +int getpid(); +int getppid(); +int getpriority(int, int); +int getrusage(int, uintptr_t); +int getsid(int); +int kill(int, int); +int syslog(int, uintptr_t, size_t); +int mkdir(int, uintptr_t, unsigned int); +int mkdirat(int, uintptr_t, unsigned int); +int mkfifo(uintptr_t, unsigned int); +int mknod(uintptr_t, unsigned int, int); +int mknodat(int, uintptr_t, unsigned int, int); +int nanosleep(uintptr_t, uintptr_t); +int open64(uintptr_t, int, unsigned int); +int openat(int, uintptr_t, int, unsigned int); +int read(int, uintptr_t, size_t); +int readlink(uintptr_t, uintptr_t, size_t); +int renameat(int, uintptr_t, int, uintptr_t); +int setdomainname(uintptr_t, size_t); +int sethostname(uintptr_t, size_t); +int setpgid(int, int); +int setsid(); +int settimeofday(uintptr_t); +int setuid(int); +int setgid(int); +int setpriority(int, int, int); +int statx(int, uintptr_t, int, int, uintptr_t); +int sync(); +uintptr_t times(uintptr_t); +int umask(int); +int uname(uintptr_t); +int unlink(uintptr_t); +int unlinkat(int, uintptr_t, int); +int ustat(int, uintptr_t); +int write(int, uintptr_t, size_t); +int dup2(int, int); +int posix_fadvise64(int, long long, long long, int); +int fchown(int, int, int); +int fstat(int, uintptr_t); +int fstatat(int, uintptr_t, uintptr_t, int); +int fstatfs(int, uintptr_t); +int ftruncate(int, long long); +int getegid(); +int geteuid(); +int getgid(); +int getuid(); +int lchown(uintptr_t, int, int); +int listen(int, int); +int lstat(uintptr_t, uintptr_t); +int pause(); +int pread64(int, uintptr_t, size_t, long long); +int pwrite64(int, uintptr_t, size_t, long long); +int pselect(int, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t); +int setregid(int, int); +int setreuid(int, int); +int shutdown(int, int); +long long splice(int, uintptr_t, int, uintptr_t, int, int); +int stat(uintptr_t, uintptr_t); +int statfs(uintptr_t, uintptr_t); +int truncate(uintptr_t, long long); +int bind(int, uintptr_t, uintptr_t); +int connect(int, uintptr_t, uintptr_t); +int getgroups(int, uintptr_t); +int setgroups(int, uintptr_t); +int getsockopt(int, int, int, uintptr_t, uintptr_t); +int setsockopt(int, int, int, uintptr_t, uintptr_t); +int socket(int, int, int); +int socketpair(int, int, int, uintptr_t); +int getpeername(int, uintptr_t, uintptr_t); +int getsockname(int, uintptr_t, uintptr_t); +int recvfrom(int, uintptr_t, size_t, int, uintptr_t, uintptr_t); +int sendto(int, uintptr_t, size_t, int, uintptr_t, uintptr_t); +int recvmsg(int, uintptr_t, int); +int sendmsg(int, uintptr_t, int); +int munmap(uintptr_t, uintptr_t); +int madvise(uintptr_t, size_t, int); +int mprotect(uintptr_t, size_t, int); +int mlock(uintptr_t, size_t); +int mlockall(int); +int msync(uintptr_t, size_t, int); +int munlock(uintptr_t, size_t); +int munlockall(); +int pipe(uintptr_t); +int poll(uintptr_t, int, int); +int gettimeofday(uintptr_t, uintptr_t); +int time(uintptr_t); +int utime(uintptr_t, uintptr_t); +int getrlimit64(int, uintptr_t); +int setrlimit64(int, uintptr_t); +long long lseek64(int, long long, int); +uintptr_t mmap(uintptr_t, uintptr_t, int, int, int, long long); + +*/ +import "C" +import ( + "unsafe" +) + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, times *[2]Timeval) (err error) { + _p0 := uintptr(unsafe.Pointer(C.CString(path))) + r0, er := C.utimes(C.uintptr_t(_p0), C.uintptr_t(uintptr(unsafe.Pointer(times)))) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flag int) (err error) { + _p0 := uintptr(unsafe.Pointer(C.CString(path))) + r0, er := C.utimensat(C.int(dirfd), C.uintptr_t(_p0), C.uintptr_t(uintptr(unsafe.Pointer(times))), C.int(flag)) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getcwd(buf []byte) (err error) { + var _p0 *byte + if len(buf) > 0 { + _p0 = &buf[0] + } + var _p1 int + _p1 = len(buf) + r0, er := C.getcwd(C.uintptr_t(uintptr(unsafe.Pointer(_p0))), C.size_t(_p1)) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, er := C.accept(C.int(s), C.uintptr_t(uintptr(unsafe.Pointer(rsa))), C.uintptr_t(uintptr(unsafe.Pointer(addrlen)))) + fd = int(r0) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getdirent(fd int, buf []byte) (n int, err error) { + var _p0 *byte + if len(buf) > 0 { + _p0 = &buf[0] + } + var _p1 int + _p1 = len(buf) + r0, er := C.getdirent(C.int(fd), C.uintptr_t(uintptr(unsafe.Pointer(_p0))), C.size_t(_p1)) + n = int(r0) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid Pid_t, status *_C_int, options int, rusage *Rusage) (wpid Pid_t, err error) { + r0, er := C.wait4(C.int(pid), C.uintptr_t(uintptr(unsafe.Pointer(status))), C.int(options), C.uintptr_t(uintptr(unsafe.Pointer(rusage)))) + wpid = Pid_t(r0) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + r0, er := C.ioctl(C.int(fd), C.int(req), C.uintptr_t(arg)) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func FcntlInt(fd uintptr, cmd int, arg int) (r int, err error) { + r0, er := C.fcntl(C.uintptr_t(fd), C.int(cmd), C.uintptr_t(arg)) + r = int(r0) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func FcntlFlock(fd uintptr, cmd int, lk *Flock_t) (err error) { + r0, er := C.fcntl(C.uintptr_t(fd), C.int(cmd), C.uintptr_t(uintptr(unsafe.Pointer(lk)))) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, er := C.fcntl(C.uintptr_t(fd), C.int(cmd), C.uintptr_t(arg)) + val = int(r0) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + _p0 := uintptr(unsafe.Pointer(C.CString(path))) + r0, er := C.acct(C.uintptr_t(_p0)) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + _p0 := uintptr(unsafe.Pointer(C.CString(path))) + r0, er := C.chdir(C.uintptr_t(_p0)) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + _p0 := uintptr(unsafe.Pointer(C.CString(path))) + r0, er := C.chroot(C.uintptr_t(_p0)) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + r0, er := C.close(C.int(fd)) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, er := C.dup(C.int(oldfd)) + fd = int(r0) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + C.exit(C.int(code)) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + _p0 := uintptr(unsafe.Pointer(C.CString(path))) + r0, er := C.faccessat(C.int(dirfd), C.uintptr_t(_p0), C.uint(mode), C.int(flags)) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + r0, er := C.fchdir(C.int(fd)) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + r0, er := C.fchmod(C.int(fd), C.uint(mode)) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + _p0 := uintptr(unsafe.Pointer(C.CString(path))) + r0, er := C.fchmodat(C.int(dirfd), C.uintptr_t(_p0), C.uint(mode), C.int(flags)) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + _p0 := uintptr(unsafe.Pointer(C.CString(path))) + r0, er := C.fchownat(C.int(dirfd), C.uintptr_t(_p0), C.int(uid), C.int(gid), C.int(flags)) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fdatasync(fd int) (err error) { + r0, er := C.fdatasync(C.int(fd)) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + r0, er := C.fsync(C.int(fd)) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, er := C.getpgid(C.int(pid)) + pgid = int(r0) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pid int) { + r0, _ := C.getpgrp() + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _ := C.getpid() + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _ := C.getppid() + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, er := C.getpriority(C.int(which), C.int(who)) + prio = int(r0) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + r0, er := C.getrusage(C.int(who), C.uintptr_t(uintptr(unsafe.Pointer(rusage)))) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, er := C.getsid(C.int(pid)) + sid = int(r0) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig Signal) (err error) { + r0, er := C.kill(C.int(pid), C.int(sig)) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ int, buf []byte) (n int, err error) { + var _p0 *byte + if len(buf) > 0 { + _p0 = &buf[0] + } + var _p1 int + _p1 = len(buf) + r0, er := C.syslog(C.int(typ), C.uintptr_t(uintptr(unsafe.Pointer(_p0))), C.size_t(_p1)) + n = int(r0) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(dirfd int, path string, mode uint32) (err error) { + _p0 := uintptr(unsafe.Pointer(C.CString(path))) + r0, er := C.mkdir(C.int(dirfd), C.uintptr_t(_p0), C.uint(mode)) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + _p0 := uintptr(unsafe.Pointer(C.CString(path))) + r0, er := C.mkdirat(C.int(dirfd), C.uintptr_t(_p0), C.uint(mode)) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + _p0 := uintptr(unsafe.Pointer(C.CString(path))) + r0, er := C.mkfifo(C.uintptr_t(_p0), C.uint(mode)) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + _p0 := uintptr(unsafe.Pointer(C.CString(path))) + r0, er := C.mknod(C.uintptr_t(_p0), C.uint(mode), C.int(dev)) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + _p0 := uintptr(unsafe.Pointer(C.CString(path))) + r0, er := C.mknodat(C.int(dirfd), C.uintptr_t(_p0), C.uint(mode), C.int(dev)) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + r0, er := C.nanosleep(C.uintptr_t(uintptr(unsafe.Pointer(time))), C.uintptr_t(uintptr(unsafe.Pointer(leftover)))) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + _p0 := uintptr(unsafe.Pointer(C.CString(path))) + r0, er := C.open64(C.uintptr_t(_p0), C.int(mode), C.uint(perm)) + fd = int(r0) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + _p0 := uintptr(unsafe.Pointer(C.CString(path))) + r0, er := C.openat(C.int(dirfd), C.uintptr_t(_p0), C.int(flags), C.uint(mode)) + fd = int(r0) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 *byte + if len(p) > 0 { + _p0 = &p[0] + } + var _p1 int + _p1 = len(p) + r0, er := C.read(C.int(fd), C.uintptr_t(uintptr(unsafe.Pointer(_p0))), C.size_t(_p1)) + n = int(r0) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + _p0 := uintptr(unsafe.Pointer(C.CString(path))) + var _p1 *byte + if len(buf) > 0 { + _p1 = &buf[0] + } + var _p2 int + _p2 = len(buf) + r0, er := C.readlink(C.uintptr_t(_p0), C.uintptr_t(uintptr(unsafe.Pointer(_p1))), C.size_t(_p2)) + n = int(r0) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + _p0 := uintptr(unsafe.Pointer(C.CString(oldpath))) + _p1 := uintptr(unsafe.Pointer(C.CString(newpath))) + r0, er := C.renameat(C.int(olddirfd), C.uintptr_t(_p0), C.int(newdirfd), C.uintptr_t(_p1)) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 *byte + if len(p) > 0 { + _p0 = &p[0] + } + var _p1 int + _p1 = len(p) + r0, er := C.setdomainname(C.uintptr_t(uintptr(unsafe.Pointer(_p0))), C.size_t(_p1)) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 *byte + if len(p) > 0 { + _p0 = &p[0] + } + var _p1 int + _p1 = len(p) + r0, er := C.sethostname(C.uintptr_t(uintptr(unsafe.Pointer(_p0))), C.size_t(_p1)) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + r0, er := C.setpgid(C.int(pid), C.int(pgid)) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, er := C.setsid() + pid = int(r0) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tv *Timeval) (err error) { + r0, er := C.settimeofday(C.uintptr_t(uintptr(unsafe.Pointer(tv)))) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + r0, er := C.setuid(C.int(uid)) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(uid int) (err error) { + r0, er := C.setgid(C.int(uid)) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + r0, er := C.setpriority(C.int(which), C.int(who), C.int(prio)) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) { + _p0 := uintptr(unsafe.Pointer(C.CString(path))) + r0, er := C.statx(C.int(dirfd), C.uintptr_t(_p0), C.int(flags), C.int(mask), C.uintptr_t(uintptr(unsafe.Pointer(stat)))) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() { + C.sync() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, er := C.times(C.uintptr_t(uintptr(unsafe.Pointer(tms)))) + ticks = uintptr(r0) + if uintptr(r0) == ^uintptr(0) && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _ := C.umask(C.int(mask)) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + r0, er := C.uname(C.uintptr_t(uintptr(unsafe.Pointer(buf)))) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + _p0 := uintptr(unsafe.Pointer(C.CString(path))) + r0, er := C.unlink(C.uintptr_t(_p0)) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + _p0 := uintptr(unsafe.Pointer(C.CString(path))) + r0, er := C.unlinkat(C.int(dirfd), C.uintptr_t(_p0), C.int(flags)) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ustat(dev int, ubuf *Ustat_t) (err error) { + r0, er := C.ustat(C.int(dev), C.uintptr_t(uintptr(unsafe.Pointer(ubuf)))) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 *byte + if len(p) > 0 { + _p0 = &p[0] + } + var _p1 int + _p1 = len(p) + r0, er := C.write(C.int(fd), C.uintptr_t(uintptr(unsafe.Pointer(_p0))), C.size_t(_p1)) + n = int(r0) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, p *byte, np int) (n int, err error) { + r0, er := C.read(C.int(fd), C.uintptr_t(uintptr(unsafe.Pointer(p))), C.size_t(np)) + n = int(r0) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, p *byte, np int) (n int, err error) { + r0, er := C.write(C.int(fd), C.uintptr_t(uintptr(unsafe.Pointer(p))), C.size_t(np)) + n = int(r0) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(oldfd int, newfd int) (err error) { + r0, er := C.dup2(C.int(oldfd), C.int(newfd)) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + r0, er := C.posix_fadvise64(C.int(fd), C.longlong(offset), C.longlong(length), C.int(advice)) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + r0, er := C.fchown(C.int(fd), C.int(uid), C.int(gid)) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + r0, er := C.fstat(C.int(fd), C.uintptr_t(uintptr(unsafe.Pointer(stat)))) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) { + _p0 := uintptr(unsafe.Pointer(C.CString(path))) + r0, er := C.fstatat(C.int(dirfd), C.uintptr_t(_p0), C.uintptr_t(uintptr(unsafe.Pointer(stat))), C.int(flags)) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, buf *Statfs_t) (err error) { + r0, er := C.fstatfs(C.int(fd), C.uintptr_t(uintptr(unsafe.Pointer(buf)))) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + r0, er := C.ftruncate(C.int(fd), C.longlong(length)) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _ := C.getegid() + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _ := C.geteuid() + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _ := C.getgid() + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _ := C.getuid() + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + _p0 := uintptr(unsafe.Pointer(C.CString(path))) + r0, er := C.lchown(C.uintptr_t(_p0), C.int(uid), C.int(gid)) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, n int) (err error) { + r0, er := C.listen(C.int(s), C.int(n)) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + _p0 := uintptr(unsafe.Pointer(C.CString(path))) + r0, er := C.lstat(C.uintptr_t(_p0), C.uintptr_t(uintptr(unsafe.Pointer(stat)))) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pause() (err error) { + r0, er := C.pause() + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 *byte + if len(p) > 0 { + _p0 = &p[0] + } + var _p1 int + _p1 = len(p) + r0, er := C.pread64(C.int(fd), C.uintptr_t(uintptr(unsafe.Pointer(_p0))), C.size_t(_p1), C.longlong(offset)) + n = int(r0) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 *byte + if len(p) > 0 { + _p0 = &p[0] + } + var _p1 int + _p1 = len(p) + r0, er := C.pwrite64(C.int(fd), C.uintptr_t(uintptr(unsafe.Pointer(_p0))), C.size_t(_p1), C.longlong(offset)) + n = int(r0) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, er := C.pselect(C.int(nfd), C.uintptr_t(uintptr(unsafe.Pointer(r))), C.uintptr_t(uintptr(unsafe.Pointer(w))), C.uintptr_t(uintptr(unsafe.Pointer(e))), C.uintptr_t(uintptr(unsafe.Pointer(timeout))), C.uintptr_t(uintptr(unsafe.Pointer(sigmask)))) + n = int(r0) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + r0, er := C.setregid(C.int(rgid), C.int(egid)) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + r0, er := C.setreuid(C.int(ruid), C.int(euid)) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(fd int, how int) (err error) { + r0, er := C.shutdown(C.int(fd), C.int(how)) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { + r0, er := C.splice(C.int(rfd), C.uintptr_t(uintptr(unsafe.Pointer(roff))), C.int(wfd), C.uintptr_t(uintptr(unsafe.Pointer(woff))), C.int(len), C.int(flags)) + n = int64(r0) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + _p0 := uintptr(unsafe.Pointer(C.CString(path))) + r0, er := C.stat(C.uintptr_t(_p0), C.uintptr_t(uintptr(unsafe.Pointer(stat)))) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, buf *Statfs_t) (err error) { + _p0 := uintptr(unsafe.Pointer(C.CString(path))) + r0, er := C.statfs(C.uintptr_t(_p0), C.uintptr_t(uintptr(unsafe.Pointer(buf)))) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + _p0 := uintptr(unsafe.Pointer(C.CString(path))) + r0, er := C.truncate(C.uintptr_t(_p0), C.longlong(length)) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + r0, er := C.bind(C.int(s), C.uintptr_t(uintptr(addr)), C.uintptr_t(uintptr(addrlen))) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + r0, er := C.connect(C.int(s), C.uintptr_t(uintptr(addr)), C.uintptr_t(uintptr(addrlen))) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, er := C.getgroups(C.int(n), C.uintptr_t(uintptr(unsafe.Pointer(list)))) + nn = int(r0) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + r0, er := C.setgroups(C.int(n), C.uintptr_t(uintptr(unsafe.Pointer(list)))) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + r0, er := C.getsockopt(C.int(s), C.int(level), C.int(name), C.uintptr_t(uintptr(val)), C.uintptr_t(uintptr(unsafe.Pointer(vallen)))) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + r0, er := C.setsockopt(C.int(s), C.int(level), C.int(name), C.uintptr_t(uintptr(val)), C.uintptr_t(vallen)) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, er := C.socket(C.int(domain), C.int(typ), C.int(proto)) + fd = int(r0) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + r0, er := C.socketpair(C.int(domain), C.int(typ), C.int(proto), C.uintptr_t(uintptr(unsafe.Pointer(fd)))) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + r0, er := C.getpeername(C.int(fd), C.uintptr_t(uintptr(unsafe.Pointer(rsa))), C.uintptr_t(uintptr(unsafe.Pointer(addrlen)))) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + r0, er := C.getsockname(C.int(fd), C.uintptr_t(uintptr(unsafe.Pointer(rsa))), C.uintptr_t(uintptr(unsafe.Pointer(addrlen)))) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 *byte + if len(p) > 0 { + _p0 = &p[0] + } + var _p1 int + _p1 = len(p) + r0, er := C.recvfrom(C.int(fd), C.uintptr_t(uintptr(unsafe.Pointer(_p0))), C.size_t(_p1), C.int(flags), C.uintptr_t(uintptr(unsafe.Pointer(from))), C.uintptr_t(uintptr(unsafe.Pointer(fromlen)))) + n = int(r0) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 *byte + if len(buf) > 0 { + _p0 = &buf[0] + } + var _p1 int + _p1 = len(buf) + r0, er := C.sendto(C.int(s), C.uintptr_t(uintptr(unsafe.Pointer(_p0))), C.size_t(_p1), C.int(flags), C.uintptr_t(uintptr(to)), C.uintptr_t(uintptr(addrlen))) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, er := C.recvmsg(C.int(s), C.uintptr_t(uintptr(unsafe.Pointer(msg))), C.int(flags)) + n = int(r0) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, er := C.sendmsg(C.int(s), C.uintptr_t(uintptr(unsafe.Pointer(msg))), C.int(flags)) + n = int(r0) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + r0, er := C.munmap(C.uintptr_t(addr), C.uintptr_t(length)) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, advice int) (err error) { + var _p0 *byte + if len(b) > 0 { + _p0 = &b[0] + } + var _p1 int + _p1 = len(b) + r0, er := C.madvise(C.uintptr_t(uintptr(unsafe.Pointer(_p0))), C.size_t(_p1), C.int(advice)) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 *byte + if len(b) > 0 { + _p0 = &b[0] + } + var _p1 int + _p1 = len(b) + r0, er := C.mprotect(C.uintptr_t(uintptr(unsafe.Pointer(_p0))), C.size_t(_p1), C.int(prot)) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 *byte + if len(b) > 0 { + _p0 = &b[0] + } + var _p1 int + _p1 = len(b) + r0, er := C.mlock(C.uintptr_t(uintptr(unsafe.Pointer(_p0))), C.size_t(_p1)) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + r0, er := C.mlockall(C.int(flags)) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 *byte + if len(b) > 0 { + _p0 = &b[0] + } + var _p1 int + _p1 = len(b) + r0, er := C.msync(C.uintptr_t(uintptr(unsafe.Pointer(_p0))), C.size_t(_p1), C.int(flags)) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 *byte + if len(b) > 0 { + _p0 = &b[0] + } + var _p1 int + _p1 = len(b) + r0, er := C.munlock(C.uintptr_t(uintptr(unsafe.Pointer(_p0))), C.size_t(_p1)) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + r0, er := C.munlockall() + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe(p *[2]_C_int) (err error) { + r0, er := C.pipe(C.uintptr_t(uintptr(unsafe.Pointer(p)))) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, er := C.poll(C.uintptr_t(uintptr(unsafe.Pointer(fds))), C.int(nfds), C.int(timeout)) + n = int(r0) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func gettimeofday(tv *Timeval, tzp *Timezone) (err error) { + r0, er := C.gettimeofday(C.uintptr_t(uintptr(unsafe.Pointer(tv))), C.uintptr_t(uintptr(unsafe.Pointer(tzp)))) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Time(t *Time_t) (tt Time_t, err error) { + r0, er := C.time(C.uintptr_t(uintptr(unsafe.Pointer(t)))) + tt = Time_t(r0) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Utime(path string, buf *Utimbuf) (err error) { + _p0 := uintptr(unsafe.Pointer(C.CString(path))) + r0, er := C.utime(C.uintptr_t(_p0), C.uintptr_t(uintptr(unsafe.Pointer(buf)))) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + r0, er := C.getrlimit64(C.int(resource), C.uintptr_t(uintptr(unsafe.Pointer(rlim)))) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(resource int, rlim *Rlimit) (err error) { + r0, er := C.setrlimit64(C.int(resource), C.uintptr_t(uintptr(unsafe.Pointer(rlim)))) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (off int64, err error) { + r0, er := C.lseek64(C.int(fd), C.longlong(offset), C.int(whence)) + off = int64(r0) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + r0, er := C.mmap(C.uintptr_t(addr), C.uintptr_t(length), C.int(prot), C.int(flags), C.int(fd), C.longlong(offset)) + xaddr = uintptr(r0) + if uintptr(r0) == ^uintptr(0) && er != nil { + err = er + } + return +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go new file mode 100644 index 00000000..3e929e52 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go @@ -0,0 +1,1408 @@ +// mksyscall_aix_ppc64.pl -aix -tags aix,ppc64 syscall_aix.go syscall_aix_ppc64.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build aix,ppc64 + +package unix + +import ( + "unsafe" +) + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, e1 := callutimes(uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flag int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, e1 := callutimensat(dirfd, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), flag) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getcwd(buf []byte) (err error) { + var _p0 *byte + if len(buf) > 0 { + _p0 = &buf[0] + } + _, e1 := callgetcwd(uintptr(unsafe.Pointer(_p0)), len(buf)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, e1 := callaccept(s, uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getdirent(fd int, buf []byte) (n int, err error) { + var _p0 *byte + if len(buf) > 0 { + _p0 = &buf[0] + } + r0, e1 := callgetdirent(fd, uintptr(unsafe.Pointer(_p0)), len(buf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid Pid_t, status *_C_int, options int, rusage *Rusage) (wpid Pid_t, err error) { + r0, e1 := callwait4(int(pid), uintptr(unsafe.Pointer(status)), options, uintptr(unsafe.Pointer(rusage))) + wpid = Pid_t(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, e1 := callioctl(fd, int(req), arg) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func FcntlInt(fd uintptr, cmd int, arg int) (r int, err error) { + r0, e1 := callfcntl(fd, cmd, uintptr(arg)) + r = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func FcntlFlock(fd uintptr, cmd int, lk *Flock_t) (err error) { + _, e1 := callfcntl(fd, cmd, uintptr(unsafe.Pointer(lk))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, e1 := callfcntl(uintptr(fd), cmd, uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, e1 := callacct(uintptr(unsafe.Pointer(_p0))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, e1 := callchdir(uintptr(unsafe.Pointer(_p0))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, e1 := callchroot(uintptr(unsafe.Pointer(_p0))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, e1 := callclose(fd) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, e1 := calldup(oldfd) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + callexit(code) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, e1 := callfaccessat(dirfd, uintptr(unsafe.Pointer(_p0)), mode, flags) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, e1 := callfchdir(fd) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, e1 := callfchmod(fd, mode) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, e1 := callfchmodat(dirfd, uintptr(unsafe.Pointer(_p0)), mode, flags) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, e1 := callfchownat(dirfd, uintptr(unsafe.Pointer(_p0)), uid, gid, flags) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fdatasync(fd int) (err error) { + _, e1 := callfdatasync(fd) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, e1 := callfsync(fd) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, e1 := callgetpgid(pid) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pid int) { + r0, _ := callgetpgrp() + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _ := callgetpid() + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _ := callgetppid() + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, e1 := callgetpriority(which, who) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, e1 := callgetrusage(who, uintptr(unsafe.Pointer(rusage))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, e1 := callgetsid(pid) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig Signal) (err error) { + _, e1 := callkill(pid, int(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ int, buf []byte) (n int, err error) { + var _p0 *byte + if len(buf) > 0 { + _p0 = &buf[0] + } + r0, e1 := callsyslog(typ, uintptr(unsafe.Pointer(_p0)), len(buf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, e1 := callmkdir(dirfd, uintptr(unsafe.Pointer(_p0)), mode) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, e1 := callmkdirat(dirfd, uintptr(unsafe.Pointer(_p0)), mode) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, e1 := callmkfifo(uintptr(unsafe.Pointer(_p0)), mode) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, e1 := callmknod(uintptr(unsafe.Pointer(_p0)), mode, dev) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, e1 := callmknodat(dirfd, uintptr(unsafe.Pointer(_p0)), mode, dev) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, e1 := callnanosleep(uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, e1 := callopen64(uintptr(unsafe.Pointer(_p0)), mode, perm) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, e1 := callopenat(dirfd, uintptr(unsafe.Pointer(_p0)), flags, mode) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 *byte + if len(p) > 0 { + _p0 = &p[0] + } + r0, e1 := callread(fd, uintptr(unsafe.Pointer(_p0)), len(p)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + if len(buf) > 0 { + _p1 = &buf[0] + } + r0, e1 := callreadlink(uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), len(buf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, e1 := callrenameat(olddirfd, uintptr(unsafe.Pointer(_p0)), newdirfd, uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 *byte + if len(p) > 0 { + _p0 = &p[0] + } + _, e1 := callsetdomainname(uintptr(unsafe.Pointer(_p0)), len(p)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 *byte + if len(p) > 0 { + _p0 = &p[0] + } + _, e1 := callsethostname(uintptr(unsafe.Pointer(_p0)), len(p)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, e1 := callsetpgid(pid, pgid) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, e1 := callsetsid() + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tv *Timeval) (err error) { + _, e1 := callsettimeofday(uintptr(unsafe.Pointer(tv))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, e1 := callsetuid(uid) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(uid int) (err error) { + _, e1 := callsetgid(uid) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, e1 := callsetpriority(which, who, prio) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, e1 := callstatx(dirfd, uintptr(unsafe.Pointer(_p0)), flags, mask, uintptr(unsafe.Pointer(stat))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() { + callsync() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, e1 := calltimes(uintptr(unsafe.Pointer(tms))) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _ := callumask(mask) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, e1 := calluname(uintptr(unsafe.Pointer(buf))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, e1 := callunlink(uintptr(unsafe.Pointer(_p0))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, e1 := callunlinkat(dirfd, uintptr(unsafe.Pointer(_p0)), flags) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ustat(dev int, ubuf *Ustat_t) (err error) { + _, e1 := callustat(dev, uintptr(unsafe.Pointer(ubuf))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 *byte + if len(p) > 0 { + _p0 = &p[0] + } + r0, e1 := callwrite(fd, uintptr(unsafe.Pointer(_p0)), len(p)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, p *byte, np int) (n int, err error) { + r0, e1 := callread(fd, uintptr(unsafe.Pointer(p)), np) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, p *byte, np int) (n int, err error) { + r0, e1 := callwrite(fd, uintptr(unsafe.Pointer(p)), np) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(oldfd int, newfd int) (err error) { + _, e1 := calldup2(oldfd, newfd) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, e1 := callposix_fadvise64(fd, offset, length, advice) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, e1 := callfchown(fd, uid, gid) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, e1 := callfstat(fd, uintptr(unsafe.Pointer(stat))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, e1 := callfstatat(dirfd, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), flags) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, buf *Statfs_t) (err error) { + _, e1 := callfstatfs(fd, uintptr(unsafe.Pointer(buf))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, e1 := callftruncate(fd, length) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _ := callgetegid() + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _ := callgeteuid() + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _ := callgetgid() + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _ := callgetuid() + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, e1 := calllchown(uintptr(unsafe.Pointer(_p0)), uid, gid) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, n int) (err error) { + _, e1 := calllisten(s, n) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, e1 := calllstat(uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pause() (err error) { + _, e1 := callpause() + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 *byte + if len(p) > 0 { + _p0 = &p[0] + } + r0, e1 := callpread64(fd, uintptr(unsafe.Pointer(_p0)), len(p), offset) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 *byte + if len(p) > 0 { + _p0 = &p[0] + } + r0, e1 := callpwrite64(fd, uintptr(unsafe.Pointer(_p0)), len(p), offset) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, e1 := callpselect(nfd, uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, e1 := callsetregid(rgid, egid) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, e1 := callsetreuid(ruid, euid) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(fd int, how int) (err error) { + _, e1 := callshutdown(fd, how) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { + r0, e1 := callsplice(rfd, uintptr(unsafe.Pointer(roff)), wfd, uintptr(unsafe.Pointer(woff)), len, flags) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, e1 := callstat(uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, buf *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, e1 := callstatfs(uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, e1 := calltruncate(uintptr(unsafe.Pointer(_p0)), length) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, e1 := callbind(s, uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, e1 := callconnect(s, uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, e1 := callgetgroups(n, uintptr(unsafe.Pointer(list))) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, e1 := callsetgroups(n, uintptr(unsafe.Pointer(list))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, e1 := callgetsockopt(s, level, name, uintptr(val), uintptr(unsafe.Pointer(vallen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, e1 := callsetsockopt(s, level, name, uintptr(val), vallen) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, e1 := callsocket(domain, typ, proto) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, e1 := callsocketpair(domain, typ, proto, uintptr(unsafe.Pointer(fd))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, e1 := callgetpeername(fd, uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, e1 := callgetsockname(fd, uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 *byte + if len(p) > 0 { + _p0 = &p[0] + } + r0, e1 := callrecvfrom(fd, uintptr(unsafe.Pointer(_p0)), len(p), flags, uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 *byte + if len(buf) > 0 { + _p0 = &buf[0] + } + _, e1 := callsendto(s, uintptr(unsafe.Pointer(_p0)), len(buf), flags, uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, e1 := callrecvmsg(s, uintptr(unsafe.Pointer(msg)), flags) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, e1 := callsendmsg(s, uintptr(unsafe.Pointer(msg)), flags) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, e1 := callmunmap(addr, length) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, advice int) (err error) { + var _p0 *byte + if len(b) > 0 { + _p0 = &b[0] + } + _, e1 := callmadvise(uintptr(unsafe.Pointer(_p0)), len(b), advice) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 *byte + if len(b) > 0 { + _p0 = &b[0] + } + _, e1 := callmprotect(uintptr(unsafe.Pointer(_p0)), len(b), prot) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 *byte + if len(b) > 0 { + _p0 = &b[0] + } + _, e1 := callmlock(uintptr(unsafe.Pointer(_p0)), len(b)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, e1 := callmlockall(flags) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 *byte + if len(b) > 0 { + _p0 = &b[0] + } + _, e1 := callmsync(uintptr(unsafe.Pointer(_p0)), len(b), flags) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 *byte + if len(b) > 0 { + _p0 = &b[0] + } + _, e1 := callmunlock(uintptr(unsafe.Pointer(_p0)), len(b)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, e1 := callmunlockall() + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe(p *[2]_C_int) (err error) { + _, e1 := callpipe(uintptr(unsafe.Pointer(p))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, e1 := callpoll(uintptr(unsafe.Pointer(fds)), nfds, timeout) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func gettimeofday(tv *Timeval, tzp *Timezone) (err error) { + _, e1 := callgettimeofday(uintptr(unsafe.Pointer(tv)), uintptr(unsafe.Pointer(tzp))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Time(t *Time_t) (tt Time_t, err error) { + r0, e1 := calltime(uintptr(unsafe.Pointer(t))) + tt = Time_t(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Utime(path string, buf *Utimbuf) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, e1 := callutime(uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + _, e1 := callgetrlimit(resource, uintptr(unsafe.Pointer(rlim))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(resource int, rlim *Rlimit) (err error) { + _, e1 := callsetrlimit(resource, uintptr(unsafe.Pointer(rlim))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (off int64, err error) { + r0, e1 := calllseek(fd, offset, whence) + off = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + r0, e1 := callmmap64(addr, length, prot, flags, fd, offset) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gc.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gc.go new file mode 100644 index 00000000..a185ee84 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gc.go @@ -0,0 +1,1162 @@ +// mksyscall_aix_ppc64.pl -aix -tags aix,ppc64 syscall_aix.go syscall_aix_ppc64.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build aix,ppc64 +// +build !gccgo + +package unix + +import ( + "unsafe" +) + +//go:cgo_import_dynamic libc_utimes utimes "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_utimensat utimensat "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_getcwd getcwd "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_accept accept "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_getdirent getdirent "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_wait4 wait4 "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_ioctl ioctl "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_fcntl fcntl "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_acct acct "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_chdir chdir "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_chroot chroot "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_close close "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_dup dup "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_exit exit "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_faccessat faccessat "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_fchdir fchdir "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_fchmod fchmod "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_fchmodat fchmodat "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_fchownat fchownat "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_fdatasync fdatasync "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_fsync fsync "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_getpgid getpgid "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_getpgrp getpgrp "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_getpid getpid "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_getppid getppid "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_getpriority getpriority "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_getrusage getrusage "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_getsid getsid "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_kill kill "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_syslog syslog "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_mkdir mkdir "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_mkdirat mkdirat "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_mkfifo mkfifo "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_mknod mknod "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_mknodat mknodat "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_nanosleep nanosleep "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_open64 open64 "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_openat openat "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_read read "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_readlink readlink "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_renameat renameat "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_setdomainname setdomainname "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_sethostname sethostname "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_setpgid setpgid "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_setsid setsid "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_settimeofday settimeofday "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_setuid setuid "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_setgid setgid "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_setpriority setpriority "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_statx statx "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_sync sync "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_times times "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_umask umask "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_uname uname "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_unlink unlink "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_unlinkat unlinkat "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_ustat ustat "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_write write "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_dup2 dup2 "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_posix_fadvise64 posix_fadvise64 "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_fchown fchown "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_fstat fstat "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_fstatat fstatat "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_fstatfs fstatfs "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_ftruncate ftruncate "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_getegid getegid "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_geteuid geteuid "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_getgid getgid "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_getuid getuid "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_lchown lchown "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_listen listen "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_lstat lstat "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_pause pause "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_pread64 pread64 "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_pwrite64 pwrite64 "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_pselect pselect "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_setregid setregid "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_setreuid setreuid "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_shutdown shutdown "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_splice splice "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_stat stat "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_statfs statfs "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_truncate truncate "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_bind bind "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_connect connect "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_getgroups getgroups "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_setgroups setgroups "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_getsockopt getsockopt "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_setsockopt setsockopt "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_socket socket "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_socketpair socketpair "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_getpeername getpeername "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_getsockname getsockname "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_recvfrom recvfrom "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_sendto sendto "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_recvmsg recvmsg "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_sendmsg sendmsg "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_munmap munmap "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_madvise madvise "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_mprotect mprotect "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_mlock mlock "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_mlockall mlockall "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_msync msync "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_munlock munlock "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_munlockall munlockall "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_pipe pipe "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_poll poll "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_gettimeofday gettimeofday "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_time time "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_utime utime "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_getrlimit getrlimit "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_setrlimit setrlimit "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_lseek lseek "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_mmap64 mmap64 "libc.a/shr_64.o" + +//go:linkname libc_utimes libc_utimes +//go:linkname libc_utimensat libc_utimensat +//go:linkname libc_getcwd libc_getcwd +//go:linkname libc_accept libc_accept +//go:linkname libc_getdirent libc_getdirent +//go:linkname libc_wait4 libc_wait4 +//go:linkname libc_ioctl libc_ioctl +//go:linkname libc_fcntl libc_fcntl +//go:linkname libc_acct libc_acct +//go:linkname libc_chdir libc_chdir +//go:linkname libc_chroot libc_chroot +//go:linkname libc_close libc_close +//go:linkname libc_dup libc_dup +//go:linkname libc_exit libc_exit +//go:linkname libc_faccessat libc_faccessat +//go:linkname libc_fchdir libc_fchdir +//go:linkname libc_fchmod libc_fchmod +//go:linkname libc_fchmodat libc_fchmodat +//go:linkname libc_fchownat libc_fchownat +//go:linkname libc_fdatasync libc_fdatasync +//go:linkname libc_fsync libc_fsync +//go:linkname libc_getpgid libc_getpgid +//go:linkname libc_getpgrp libc_getpgrp +//go:linkname libc_getpid libc_getpid +//go:linkname libc_getppid libc_getppid +//go:linkname libc_getpriority libc_getpriority +//go:linkname libc_getrusage libc_getrusage +//go:linkname libc_getsid libc_getsid +//go:linkname libc_kill libc_kill +//go:linkname libc_syslog libc_syslog +//go:linkname libc_mkdir libc_mkdir +//go:linkname libc_mkdirat libc_mkdirat +//go:linkname libc_mkfifo libc_mkfifo +//go:linkname libc_mknod libc_mknod +//go:linkname libc_mknodat libc_mknodat +//go:linkname libc_nanosleep libc_nanosleep +//go:linkname libc_open64 libc_open64 +//go:linkname libc_openat libc_openat +//go:linkname libc_read libc_read +//go:linkname libc_readlink libc_readlink +//go:linkname libc_renameat libc_renameat +//go:linkname libc_setdomainname libc_setdomainname +//go:linkname libc_sethostname libc_sethostname +//go:linkname libc_setpgid libc_setpgid +//go:linkname libc_setsid libc_setsid +//go:linkname libc_settimeofday libc_settimeofday +//go:linkname libc_setuid libc_setuid +//go:linkname libc_setgid libc_setgid +//go:linkname libc_setpriority libc_setpriority +//go:linkname libc_statx libc_statx +//go:linkname libc_sync libc_sync +//go:linkname libc_times libc_times +//go:linkname libc_umask libc_umask +//go:linkname libc_uname libc_uname +//go:linkname libc_unlink libc_unlink +//go:linkname libc_unlinkat libc_unlinkat +//go:linkname libc_ustat libc_ustat +//go:linkname libc_write libc_write +//go:linkname libc_dup2 libc_dup2 +//go:linkname libc_posix_fadvise64 libc_posix_fadvise64 +//go:linkname libc_fchown libc_fchown +//go:linkname libc_fstat libc_fstat +//go:linkname libc_fstatat libc_fstatat +//go:linkname libc_fstatfs libc_fstatfs +//go:linkname libc_ftruncate libc_ftruncate +//go:linkname libc_getegid libc_getegid +//go:linkname libc_geteuid libc_geteuid +//go:linkname libc_getgid libc_getgid +//go:linkname libc_getuid libc_getuid +//go:linkname libc_lchown libc_lchown +//go:linkname libc_listen libc_listen +//go:linkname libc_lstat libc_lstat +//go:linkname libc_pause libc_pause +//go:linkname libc_pread64 libc_pread64 +//go:linkname libc_pwrite64 libc_pwrite64 +//go:linkname libc_pselect libc_pselect +//go:linkname libc_setregid libc_setregid +//go:linkname libc_setreuid libc_setreuid +//go:linkname libc_shutdown libc_shutdown +//go:linkname libc_splice libc_splice +//go:linkname libc_stat libc_stat +//go:linkname libc_statfs libc_statfs +//go:linkname libc_truncate libc_truncate +//go:linkname libc_bind libc_bind +//go:linkname libc_connect libc_connect +//go:linkname libc_getgroups libc_getgroups +//go:linkname libc_setgroups libc_setgroups +//go:linkname libc_getsockopt libc_getsockopt +//go:linkname libc_setsockopt libc_setsockopt +//go:linkname libc_socket libc_socket +//go:linkname libc_socketpair libc_socketpair +//go:linkname libc_getpeername libc_getpeername +//go:linkname libc_getsockname libc_getsockname +//go:linkname libc_recvfrom libc_recvfrom +//go:linkname libc_sendto libc_sendto +//go:linkname libc_recvmsg libc_recvmsg +//go:linkname libc_sendmsg libc_sendmsg +//go:linkname libc_munmap libc_munmap +//go:linkname libc_madvise libc_madvise +//go:linkname libc_mprotect libc_mprotect +//go:linkname libc_mlock libc_mlock +//go:linkname libc_mlockall libc_mlockall +//go:linkname libc_msync libc_msync +//go:linkname libc_munlock libc_munlock +//go:linkname libc_munlockall libc_munlockall +//go:linkname libc_pipe libc_pipe +//go:linkname libc_poll libc_poll +//go:linkname libc_gettimeofday libc_gettimeofday +//go:linkname libc_time libc_time +//go:linkname libc_utime libc_utime +//go:linkname libc_getrlimit libc_getrlimit +//go:linkname libc_setrlimit libc_setrlimit +//go:linkname libc_lseek libc_lseek +//go:linkname libc_mmap64 libc_mmap64 + +type syscallFunc uintptr + +var ( + libc_utimes, + libc_utimensat, + libc_getcwd, + libc_accept, + libc_getdirent, + libc_wait4, + libc_ioctl, + libc_fcntl, + libc_acct, + libc_chdir, + libc_chroot, + libc_close, + libc_dup, + libc_exit, + libc_faccessat, + libc_fchdir, + libc_fchmod, + libc_fchmodat, + libc_fchownat, + libc_fdatasync, + libc_fsync, + libc_getpgid, + libc_getpgrp, + libc_getpid, + libc_getppid, + libc_getpriority, + libc_getrusage, + libc_getsid, + libc_kill, + libc_syslog, + libc_mkdir, + libc_mkdirat, + libc_mkfifo, + libc_mknod, + libc_mknodat, + libc_nanosleep, + libc_open64, + libc_openat, + libc_read, + libc_readlink, + libc_renameat, + libc_setdomainname, + libc_sethostname, + libc_setpgid, + libc_setsid, + libc_settimeofday, + libc_setuid, + libc_setgid, + libc_setpriority, + libc_statx, + libc_sync, + libc_times, + libc_umask, + libc_uname, + libc_unlink, + libc_unlinkat, + libc_ustat, + libc_write, + libc_dup2, + libc_posix_fadvise64, + libc_fchown, + libc_fstat, + libc_fstatat, + libc_fstatfs, + libc_ftruncate, + libc_getegid, + libc_geteuid, + libc_getgid, + libc_getuid, + libc_lchown, + libc_listen, + libc_lstat, + libc_pause, + libc_pread64, + libc_pwrite64, + libc_pselect, + libc_setregid, + libc_setreuid, + libc_shutdown, + libc_splice, + libc_stat, + libc_statfs, + libc_truncate, + libc_bind, + libc_connect, + libc_getgroups, + libc_setgroups, + libc_getsockopt, + libc_setsockopt, + libc_socket, + libc_socketpair, + libc_getpeername, + libc_getsockname, + libc_recvfrom, + libc_sendto, + libc_recvmsg, + libc_sendmsg, + libc_munmap, + libc_madvise, + libc_mprotect, + libc_mlock, + libc_mlockall, + libc_msync, + libc_munlock, + libc_munlockall, + libc_pipe, + libc_poll, + libc_gettimeofday, + libc_time, + libc_utime, + libc_getrlimit, + libc_setrlimit, + libc_lseek, + libc_mmap64 syscallFunc +) + +// Implemented in runtime/syscall_aix.go. +func rawSyscall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) +func syscall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callutimes(_p0 uintptr, times uintptr) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_utimes)), 2, _p0, times, 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callutimensat(dirfd int, _p0 uintptr, times uintptr, flag int) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_utimensat)), 4, uintptr(dirfd), _p0, times, uintptr(flag), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callgetcwd(_p0 uintptr, _lenp0 int) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_getcwd)), 2, _p0, uintptr(_lenp0), 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callaccept(s int, rsa uintptr, addrlen uintptr) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_accept)), 3, uintptr(s), rsa, addrlen, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callgetdirent(fd int, _p0 uintptr, _lenp0 int) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_getdirent)), 3, uintptr(fd), _p0, uintptr(_lenp0), 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callwait4(pid int, status uintptr, options int, rusage uintptr) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_wait4)), 4, uintptr(pid), status, uintptr(options), rusage, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callioctl(fd int, req int, arg uintptr) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_ioctl)), 3, uintptr(fd), uintptr(req), arg, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callfcntl(fd uintptr, cmd int, arg uintptr) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_fcntl)), 3, fd, uintptr(cmd), arg, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callacct(_p0 uintptr) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_acct)), 1, _p0, 0, 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callchdir(_p0 uintptr) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_chdir)), 1, _p0, 0, 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callchroot(_p0 uintptr) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_chroot)), 1, _p0, 0, 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callclose(fd int) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_close)), 1, uintptr(fd), 0, 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func calldup(oldfd int) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_dup)), 1, uintptr(oldfd), 0, 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callexit(code int) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_exit)), 1, uintptr(code), 0, 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callfaccessat(dirfd int, _p0 uintptr, mode uint32, flags int) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_faccessat)), 4, uintptr(dirfd), _p0, uintptr(mode), uintptr(flags), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callfchdir(fd int) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_fchdir)), 1, uintptr(fd), 0, 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callfchmod(fd int, mode uint32) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_fchmod)), 2, uintptr(fd), uintptr(mode), 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callfchmodat(dirfd int, _p0 uintptr, mode uint32, flags int) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_fchmodat)), 4, uintptr(dirfd), _p0, uintptr(mode), uintptr(flags), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callfchownat(dirfd int, _p0 uintptr, uid int, gid int, flags int) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_fchownat)), 5, uintptr(dirfd), _p0, uintptr(uid), uintptr(gid), uintptr(flags), 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callfdatasync(fd int) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_fdatasync)), 1, uintptr(fd), 0, 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callfsync(fd int) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_fsync)), 1, uintptr(fd), 0, 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callgetpgid(pid int) (r1 uintptr, e1 Errno) { + r1, _, e1 = rawSyscall6(uintptr(unsafe.Pointer(&libc_getpgid)), 1, uintptr(pid), 0, 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callgetpgrp() (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_getpgrp)), 0, 0, 0, 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callgetpid() (r1 uintptr, e1 Errno) { + r1, _, e1 = rawSyscall6(uintptr(unsafe.Pointer(&libc_getpid)), 0, 0, 0, 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callgetppid() (r1 uintptr, e1 Errno) { + r1, _, e1 = rawSyscall6(uintptr(unsafe.Pointer(&libc_getppid)), 0, 0, 0, 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callgetpriority(which int, who int) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_getpriority)), 2, uintptr(which), uintptr(who), 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callgetrusage(who int, rusage uintptr) (r1 uintptr, e1 Errno) { + r1, _, e1 = rawSyscall6(uintptr(unsafe.Pointer(&libc_getrusage)), 2, uintptr(who), rusage, 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callgetsid(pid int) (r1 uintptr, e1 Errno) { + r1, _, e1 = rawSyscall6(uintptr(unsafe.Pointer(&libc_getsid)), 1, uintptr(pid), 0, 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callkill(pid int, sig int) (r1 uintptr, e1 Errno) { + r1, _, e1 = rawSyscall6(uintptr(unsafe.Pointer(&libc_kill)), 2, uintptr(pid), uintptr(sig), 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callsyslog(typ int, _p0 uintptr, _lenp0 int) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_syslog)), 3, uintptr(typ), _p0, uintptr(_lenp0), 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callmkdir(dirfd int, _p0 uintptr, mode uint32) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_mkdir)), 3, uintptr(dirfd), _p0, uintptr(mode), 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callmkdirat(dirfd int, _p0 uintptr, mode uint32) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_mkdirat)), 3, uintptr(dirfd), _p0, uintptr(mode), 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callmkfifo(_p0 uintptr, mode uint32) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_mkfifo)), 2, _p0, uintptr(mode), 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callmknod(_p0 uintptr, mode uint32, dev int) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_mknod)), 3, _p0, uintptr(mode), uintptr(dev), 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callmknodat(dirfd int, _p0 uintptr, mode uint32, dev int) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_mknodat)), 4, uintptr(dirfd), _p0, uintptr(mode), uintptr(dev), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callnanosleep(time uintptr, leftover uintptr) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_nanosleep)), 2, time, leftover, 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callopen64(_p0 uintptr, mode int, perm uint32) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_open64)), 3, _p0, uintptr(mode), uintptr(perm), 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callopenat(dirfd int, _p0 uintptr, flags int, mode uint32) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_openat)), 4, uintptr(dirfd), _p0, uintptr(flags), uintptr(mode), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callread(fd int, _p0 uintptr, _lenp0 int) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_read)), 3, uintptr(fd), _p0, uintptr(_lenp0), 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callreadlink(_p0 uintptr, _p1 uintptr, _lenp1 int) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_readlink)), 3, _p0, _p1, uintptr(_lenp1), 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callrenameat(olddirfd int, _p0 uintptr, newdirfd int, _p1 uintptr) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_renameat)), 4, uintptr(olddirfd), _p0, uintptr(newdirfd), _p1, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callsetdomainname(_p0 uintptr, _lenp0 int) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_setdomainname)), 2, _p0, uintptr(_lenp0), 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callsethostname(_p0 uintptr, _lenp0 int) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_sethostname)), 2, _p0, uintptr(_lenp0), 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callsetpgid(pid int, pgid int) (r1 uintptr, e1 Errno) { + r1, _, e1 = rawSyscall6(uintptr(unsafe.Pointer(&libc_setpgid)), 2, uintptr(pid), uintptr(pgid), 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callsetsid() (r1 uintptr, e1 Errno) { + r1, _, e1 = rawSyscall6(uintptr(unsafe.Pointer(&libc_setsid)), 0, 0, 0, 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callsettimeofday(tv uintptr) (r1 uintptr, e1 Errno) { + r1, _, e1 = rawSyscall6(uintptr(unsafe.Pointer(&libc_settimeofday)), 1, tv, 0, 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callsetuid(uid int) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_setuid)), 1, uintptr(uid), 0, 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callsetgid(uid int) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_setgid)), 1, uintptr(uid), 0, 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callsetpriority(which int, who int, prio int) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_setpriority)), 3, uintptr(which), uintptr(who), uintptr(prio), 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callstatx(dirfd int, _p0 uintptr, flags int, mask int, stat uintptr) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_statx)), 5, uintptr(dirfd), _p0, uintptr(flags), uintptr(mask), stat, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callsync() (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_sync)), 0, 0, 0, 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func calltimes(tms uintptr) (r1 uintptr, e1 Errno) { + r1, _, e1 = rawSyscall6(uintptr(unsafe.Pointer(&libc_times)), 1, tms, 0, 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callumask(mask int) (r1 uintptr, e1 Errno) { + r1, _, e1 = rawSyscall6(uintptr(unsafe.Pointer(&libc_umask)), 1, uintptr(mask), 0, 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func calluname(buf uintptr) (r1 uintptr, e1 Errno) { + r1, _, e1 = rawSyscall6(uintptr(unsafe.Pointer(&libc_uname)), 1, buf, 0, 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callunlink(_p0 uintptr) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_unlink)), 1, _p0, 0, 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callunlinkat(dirfd int, _p0 uintptr, flags int) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_unlinkat)), 3, uintptr(dirfd), _p0, uintptr(flags), 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callustat(dev int, ubuf uintptr) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_ustat)), 2, uintptr(dev), ubuf, 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callwrite(fd int, _p0 uintptr, _lenp0 int) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_write)), 3, uintptr(fd), _p0, uintptr(_lenp0), 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func calldup2(oldfd int, newfd int) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_dup2)), 2, uintptr(oldfd), uintptr(newfd), 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callposix_fadvise64(fd int, offset int64, length int64, advice int) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_posix_fadvise64)), 4, uintptr(fd), uintptr(offset), uintptr(length), uintptr(advice), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callfchown(fd int, uid int, gid int) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_fchown)), 3, uintptr(fd), uintptr(uid), uintptr(gid), 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callfstat(fd int, stat uintptr) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_fstat)), 2, uintptr(fd), stat, 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callfstatat(dirfd int, _p0 uintptr, stat uintptr, flags int) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_fstatat)), 4, uintptr(dirfd), _p0, stat, uintptr(flags), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callfstatfs(fd int, buf uintptr) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_fstatfs)), 2, uintptr(fd), buf, 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callftruncate(fd int, length int64) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_ftruncate)), 2, uintptr(fd), uintptr(length), 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callgetegid() (r1 uintptr, e1 Errno) { + r1, _, e1 = rawSyscall6(uintptr(unsafe.Pointer(&libc_getegid)), 0, 0, 0, 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callgeteuid() (r1 uintptr, e1 Errno) { + r1, _, e1 = rawSyscall6(uintptr(unsafe.Pointer(&libc_geteuid)), 0, 0, 0, 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callgetgid() (r1 uintptr, e1 Errno) { + r1, _, e1 = rawSyscall6(uintptr(unsafe.Pointer(&libc_getgid)), 0, 0, 0, 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callgetuid() (r1 uintptr, e1 Errno) { + r1, _, e1 = rawSyscall6(uintptr(unsafe.Pointer(&libc_getuid)), 0, 0, 0, 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func calllchown(_p0 uintptr, uid int, gid int) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_lchown)), 3, _p0, uintptr(uid), uintptr(gid), 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func calllisten(s int, n int) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_listen)), 2, uintptr(s), uintptr(n), 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func calllstat(_p0 uintptr, stat uintptr) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_lstat)), 2, _p0, stat, 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callpause() (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_pause)), 0, 0, 0, 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callpread64(fd int, _p0 uintptr, _lenp0 int, offset int64) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_pread64)), 4, uintptr(fd), _p0, uintptr(_lenp0), uintptr(offset), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callpwrite64(fd int, _p0 uintptr, _lenp0 int, offset int64) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_pwrite64)), 4, uintptr(fd), _p0, uintptr(_lenp0), uintptr(offset), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callpselect(nfd int, r uintptr, w uintptr, e uintptr, timeout uintptr, sigmask uintptr) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_pselect)), 6, uintptr(nfd), r, w, e, timeout, sigmask) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callsetregid(rgid int, egid int) (r1 uintptr, e1 Errno) { + r1, _, e1 = rawSyscall6(uintptr(unsafe.Pointer(&libc_setregid)), 2, uintptr(rgid), uintptr(egid), 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callsetreuid(ruid int, euid int) (r1 uintptr, e1 Errno) { + r1, _, e1 = rawSyscall6(uintptr(unsafe.Pointer(&libc_setreuid)), 2, uintptr(ruid), uintptr(euid), 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callshutdown(fd int, how int) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_shutdown)), 2, uintptr(fd), uintptr(how), 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callsplice(rfd int, roff uintptr, wfd int, woff uintptr, len int, flags int) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_splice)), 6, uintptr(rfd), roff, uintptr(wfd), woff, uintptr(len), uintptr(flags)) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callstat(_p0 uintptr, stat uintptr) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_stat)), 2, _p0, stat, 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callstatfs(_p0 uintptr, buf uintptr) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_statfs)), 2, _p0, buf, 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func calltruncate(_p0 uintptr, length int64) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_truncate)), 2, _p0, uintptr(length), 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callbind(s int, addr uintptr, addrlen uintptr) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_bind)), 3, uintptr(s), addr, addrlen, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callconnect(s int, addr uintptr, addrlen uintptr) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_connect)), 3, uintptr(s), addr, addrlen, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callgetgroups(n int, list uintptr) (r1 uintptr, e1 Errno) { + r1, _, e1 = rawSyscall6(uintptr(unsafe.Pointer(&libc_getgroups)), 2, uintptr(n), list, 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callsetgroups(n int, list uintptr) (r1 uintptr, e1 Errno) { + r1, _, e1 = rawSyscall6(uintptr(unsafe.Pointer(&libc_setgroups)), 2, uintptr(n), list, 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callgetsockopt(s int, level int, name int, val uintptr, vallen uintptr) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_getsockopt)), 5, uintptr(s), uintptr(level), uintptr(name), val, vallen, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callsetsockopt(s int, level int, name int, val uintptr, vallen uintptr) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_setsockopt)), 5, uintptr(s), uintptr(level), uintptr(name), val, vallen, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callsocket(domain int, typ int, proto int) (r1 uintptr, e1 Errno) { + r1, _, e1 = rawSyscall6(uintptr(unsafe.Pointer(&libc_socket)), 3, uintptr(domain), uintptr(typ), uintptr(proto), 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callsocketpair(domain int, typ int, proto int, fd uintptr) (r1 uintptr, e1 Errno) { + r1, _, e1 = rawSyscall6(uintptr(unsafe.Pointer(&libc_socketpair)), 4, uintptr(domain), uintptr(typ), uintptr(proto), fd, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callgetpeername(fd int, rsa uintptr, addrlen uintptr) (r1 uintptr, e1 Errno) { + r1, _, e1 = rawSyscall6(uintptr(unsafe.Pointer(&libc_getpeername)), 3, uintptr(fd), rsa, addrlen, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callgetsockname(fd int, rsa uintptr, addrlen uintptr) (r1 uintptr, e1 Errno) { + r1, _, e1 = rawSyscall6(uintptr(unsafe.Pointer(&libc_getsockname)), 3, uintptr(fd), rsa, addrlen, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callrecvfrom(fd int, _p0 uintptr, _lenp0 int, flags int, from uintptr, fromlen uintptr) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_recvfrom)), 6, uintptr(fd), _p0, uintptr(_lenp0), uintptr(flags), from, fromlen) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callsendto(s int, _p0 uintptr, _lenp0 int, flags int, to uintptr, addrlen uintptr) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_sendto)), 6, uintptr(s), _p0, uintptr(_lenp0), uintptr(flags), to, addrlen) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callrecvmsg(s int, msg uintptr, flags int) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_recvmsg)), 3, uintptr(s), msg, uintptr(flags), 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callsendmsg(s int, msg uintptr, flags int) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_sendmsg)), 3, uintptr(s), msg, uintptr(flags), 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callmunmap(addr uintptr, length uintptr) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_munmap)), 2, addr, length, 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callmadvise(_p0 uintptr, _lenp0 int, advice int) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_madvise)), 3, _p0, uintptr(_lenp0), uintptr(advice), 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callmprotect(_p0 uintptr, _lenp0 int, prot int) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_mprotect)), 3, _p0, uintptr(_lenp0), uintptr(prot), 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callmlock(_p0 uintptr, _lenp0 int) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_mlock)), 2, _p0, uintptr(_lenp0), 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callmlockall(flags int) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_mlockall)), 1, uintptr(flags), 0, 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callmsync(_p0 uintptr, _lenp0 int, flags int) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_msync)), 3, _p0, uintptr(_lenp0), uintptr(flags), 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callmunlock(_p0 uintptr, _lenp0 int) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_munlock)), 2, _p0, uintptr(_lenp0), 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callmunlockall() (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_munlockall)), 0, 0, 0, 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callpipe(p uintptr) (r1 uintptr, e1 Errno) { + r1, _, e1 = rawSyscall6(uintptr(unsafe.Pointer(&libc_pipe)), 1, p, 0, 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callpoll(fds uintptr, nfds int, timeout int) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_poll)), 3, fds, uintptr(nfds), uintptr(timeout), 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callgettimeofday(tv uintptr, tzp uintptr) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_gettimeofday)), 2, tv, tzp, 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func calltime(t uintptr) (r1 uintptr, e1 Errno) { + r1, _, e1 = rawSyscall6(uintptr(unsafe.Pointer(&libc_time)), 1, t, 0, 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callutime(_p0 uintptr, buf uintptr) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_utime)), 2, _p0, buf, 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callgetrlimit(resource int, rlim uintptr) (r1 uintptr, e1 Errno) { + r1, _, e1 = rawSyscall6(uintptr(unsafe.Pointer(&libc_getrlimit)), 2, uintptr(resource), rlim, 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callsetrlimit(resource int, rlim uintptr) (r1 uintptr, e1 Errno) { + r1, _, e1 = rawSyscall6(uintptr(unsafe.Pointer(&libc_setrlimit)), 2, uintptr(resource), rlim, 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func calllseek(fd int, offset int64, whence int) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_lseek)), 3, uintptr(fd), uintptr(offset), uintptr(whence), 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callmmap64(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_mmap64)), 6, addr, length, uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)) + return +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gccgo.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gccgo.go new file mode 100644 index 00000000..aef7c0e7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gccgo.go @@ -0,0 +1,1042 @@ +// mksyscall_aix_ppc64.pl -aix -tags aix,ppc64 syscall_aix.go syscall_aix_ppc64.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build aix,ppc64 +// +build gccgo + +package unix + +/* +#include +int utimes(uintptr_t, uintptr_t); +int utimensat(int, uintptr_t, uintptr_t, int); +int getcwd(uintptr_t, size_t); +int accept(int, uintptr_t, uintptr_t); +int getdirent(int, uintptr_t, size_t); +int wait4(int, uintptr_t, int, uintptr_t); +int ioctl(int, int, uintptr_t); +int fcntl(uintptr_t, int, uintptr_t); +int acct(uintptr_t); +int chdir(uintptr_t); +int chroot(uintptr_t); +int close(int); +int dup(int); +void exit(int); +int faccessat(int, uintptr_t, unsigned int, int); +int fchdir(int); +int fchmod(int, unsigned int); +int fchmodat(int, uintptr_t, unsigned int, int); +int fchownat(int, uintptr_t, int, int, int); +int fdatasync(int); +int fsync(int); +int getpgid(int); +int getpgrp(); +int getpid(); +int getppid(); +int getpriority(int, int); +int getrusage(int, uintptr_t); +int getsid(int); +int kill(int, int); +int syslog(int, uintptr_t, size_t); +int mkdir(int, uintptr_t, unsigned int); +int mkdirat(int, uintptr_t, unsigned int); +int mkfifo(uintptr_t, unsigned int); +int mknod(uintptr_t, unsigned int, int); +int mknodat(int, uintptr_t, unsigned int, int); +int nanosleep(uintptr_t, uintptr_t); +int open64(uintptr_t, int, unsigned int); +int openat(int, uintptr_t, int, unsigned int); +int read(int, uintptr_t, size_t); +int readlink(uintptr_t, uintptr_t, size_t); +int renameat(int, uintptr_t, int, uintptr_t); +int setdomainname(uintptr_t, size_t); +int sethostname(uintptr_t, size_t); +int setpgid(int, int); +int setsid(); +int settimeofday(uintptr_t); +int setuid(int); +int setgid(int); +int setpriority(int, int, int); +int statx(int, uintptr_t, int, int, uintptr_t); +int sync(); +uintptr_t times(uintptr_t); +int umask(int); +int uname(uintptr_t); +int unlink(uintptr_t); +int unlinkat(int, uintptr_t, int); +int ustat(int, uintptr_t); +int write(int, uintptr_t, size_t); +int dup2(int, int); +int posix_fadvise64(int, long long, long long, int); +int fchown(int, int, int); +int fstat(int, uintptr_t); +int fstatat(int, uintptr_t, uintptr_t, int); +int fstatfs(int, uintptr_t); +int ftruncate(int, long long); +int getegid(); +int geteuid(); +int getgid(); +int getuid(); +int lchown(uintptr_t, int, int); +int listen(int, int); +int lstat(uintptr_t, uintptr_t); +int pause(); +int pread64(int, uintptr_t, size_t, long long); +int pwrite64(int, uintptr_t, size_t, long long); +int pselect(int, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t); +int setregid(int, int); +int setreuid(int, int); +int shutdown(int, int); +long long splice(int, uintptr_t, int, uintptr_t, int, int); +int stat(uintptr_t, uintptr_t); +int statfs(uintptr_t, uintptr_t); +int truncate(uintptr_t, long long); +int bind(int, uintptr_t, uintptr_t); +int connect(int, uintptr_t, uintptr_t); +int getgroups(int, uintptr_t); +int setgroups(int, uintptr_t); +int getsockopt(int, int, int, uintptr_t, uintptr_t); +int setsockopt(int, int, int, uintptr_t, uintptr_t); +int socket(int, int, int); +int socketpair(int, int, int, uintptr_t); +int getpeername(int, uintptr_t, uintptr_t); +int getsockname(int, uintptr_t, uintptr_t); +int recvfrom(int, uintptr_t, size_t, int, uintptr_t, uintptr_t); +int sendto(int, uintptr_t, size_t, int, uintptr_t, uintptr_t); +int recvmsg(int, uintptr_t, int); +int sendmsg(int, uintptr_t, int); +int munmap(uintptr_t, uintptr_t); +int madvise(uintptr_t, size_t, int); +int mprotect(uintptr_t, size_t, int); +int mlock(uintptr_t, size_t); +int mlockall(int); +int msync(uintptr_t, size_t, int); +int munlock(uintptr_t, size_t); +int munlockall(); +int pipe(uintptr_t); +int poll(uintptr_t, int, int); +int gettimeofday(uintptr_t, uintptr_t); +int time(uintptr_t); +int utime(uintptr_t, uintptr_t); +int getrlimit(int, uintptr_t); +int setrlimit(int, uintptr_t); +long long lseek(int, long long, int); +uintptr_t mmap64(uintptr_t, uintptr_t, int, int, int, long long); + +*/ +import "C" +import ( + "syscall" +) + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callutimes(_p0 uintptr, times uintptr) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.utimes(C.uintptr_t(_p0), C.uintptr_t(times))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callutimensat(dirfd int, _p0 uintptr, times uintptr, flag int) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.utimensat(C.int(dirfd), C.uintptr_t(_p0), C.uintptr_t(times), C.int(flag))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callgetcwd(_p0 uintptr, _lenp0 int) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.getcwd(C.uintptr_t(_p0), C.size_t(_lenp0))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callaccept(s int, rsa uintptr, addrlen uintptr) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.accept(C.int(s), C.uintptr_t(rsa), C.uintptr_t(addrlen))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callgetdirent(fd int, _p0 uintptr, _lenp0 int) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.getdirent(C.int(fd), C.uintptr_t(_p0), C.size_t(_lenp0))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callwait4(pid int, status uintptr, options int, rusage uintptr) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.wait4(C.int(pid), C.uintptr_t(status), C.int(options), C.uintptr_t(rusage))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callioctl(fd int, req int, arg uintptr) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.ioctl(C.int(fd), C.int(req), C.uintptr_t(arg))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callfcntl(fd uintptr, cmd int, arg uintptr) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.fcntl(C.uintptr_t(fd), C.int(cmd), C.uintptr_t(arg))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callacct(_p0 uintptr) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.acct(C.uintptr_t(_p0))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callchdir(_p0 uintptr) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.chdir(C.uintptr_t(_p0))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callchroot(_p0 uintptr) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.chroot(C.uintptr_t(_p0))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callclose(fd int) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.close(C.int(fd))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func calldup(oldfd int) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.dup(C.int(oldfd))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callexit(code int) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.exit(C.int(code))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callfaccessat(dirfd int, _p0 uintptr, mode uint32, flags int) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.faccessat(C.int(dirfd), C.uintptr_t(_p0), C.uint(mode), C.int(flags))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callfchdir(fd int) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.fchdir(C.int(fd))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callfchmod(fd int, mode uint32) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.fchmod(C.int(fd), C.uint(mode))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callfchmodat(dirfd int, _p0 uintptr, mode uint32, flags int) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.fchmodat(C.int(dirfd), C.uintptr_t(_p0), C.uint(mode), C.int(flags))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callfchownat(dirfd int, _p0 uintptr, uid int, gid int, flags int) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.fchownat(C.int(dirfd), C.uintptr_t(_p0), C.int(uid), C.int(gid), C.int(flags))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callfdatasync(fd int) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.fdatasync(C.int(fd))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callfsync(fd int) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.fsync(C.int(fd))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callgetpgid(pid int) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.getpgid(C.int(pid))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callgetpgrp() (r1 uintptr, e1 Errno) { + r1 = uintptr(C.getpgrp()) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callgetpid() (r1 uintptr, e1 Errno) { + r1 = uintptr(C.getpid()) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callgetppid() (r1 uintptr, e1 Errno) { + r1 = uintptr(C.getppid()) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callgetpriority(which int, who int) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.getpriority(C.int(which), C.int(who))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callgetrusage(who int, rusage uintptr) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.getrusage(C.int(who), C.uintptr_t(rusage))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callgetsid(pid int) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.getsid(C.int(pid))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callkill(pid int, sig int) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.kill(C.int(pid), C.int(sig))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callsyslog(typ int, _p0 uintptr, _lenp0 int) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.syslog(C.int(typ), C.uintptr_t(_p0), C.size_t(_lenp0))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callmkdir(dirfd int, _p0 uintptr, mode uint32) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.mkdir(C.int(dirfd), C.uintptr_t(_p0), C.uint(mode))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callmkdirat(dirfd int, _p0 uintptr, mode uint32) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.mkdirat(C.int(dirfd), C.uintptr_t(_p0), C.uint(mode))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callmkfifo(_p0 uintptr, mode uint32) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.mkfifo(C.uintptr_t(_p0), C.uint(mode))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callmknod(_p0 uintptr, mode uint32, dev int) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.mknod(C.uintptr_t(_p0), C.uint(mode), C.int(dev))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callmknodat(dirfd int, _p0 uintptr, mode uint32, dev int) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.mknodat(C.int(dirfd), C.uintptr_t(_p0), C.uint(mode), C.int(dev))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callnanosleep(time uintptr, leftover uintptr) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.nanosleep(C.uintptr_t(time), C.uintptr_t(leftover))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callopen64(_p0 uintptr, mode int, perm uint32) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.open64(C.uintptr_t(_p0), C.int(mode), C.uint(perm))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callopenat(dirfd int, _p0 uintptr, flags int, mode uint32) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.openat(C.int(dirfd), C.uintptr_t(_p0), C.int(flags), C.uint(mode))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callread(fd int, _p0 uintptr, _lenp0 int) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.read(C.int(fd), C.uintptr_t(_p0), C.size_t(_lenp0))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callreadlink(_p0 uintptr, _p1 uintptr, _lenp1 int) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.readlink(C.uintptr_t(_p0), C.uintptr_t(_p1), C.size_t(_lenp1))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callrenameat(olddirfd int, _p0 uintptr, newdirfd int, _p1 uintptr) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.renameat(C.int(olddirfd), C.uintptr_t(_p0), C.int(newdirfd), C.uintptr_t(_p1))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callsetdomainname(_p0 uintptr, _lenp0 int) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.setdomainname(C.uintptr_t(_p0), C.size_t(_lenp0))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callsethostname(_p0 uintptr, _lenp0 int) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.sethostname(C.uintptr_t(_p0), C.size_t(_lenp0))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callsetpgid(pid int, pgid int) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.setpgid(C.int(pid), C.int(pgid))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callsetsid() (r1 uintptr, e1 Errno) { + r1 = uintptr(C.setsid()) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callsettimeofday(tv uintptr) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.settimeofday(C.uintptr_t(tv))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callsetuid(uid int) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.setuid(C.int(uid))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callsetgid(uid int) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.setgid(C.int(uid))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callsetpriority(which int, who int, prio int) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.setpriority(C.int(which), C.int(who), C.int(prio))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callstatx(dirfd int, _p0 uintptr, flags int, mask int, stat uintptr) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.statx(C.int(dirfd), C.uintptr_t(_p0), C.int(flags), C.int(mask), C.uintptr_t(stat))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callsync() (r1 uintptr, e1 Errno) { + r1 = uintptr(C.sync()) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func calltimes(tms uintptr) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.times(C.uintptr_t(tms))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callumask(mask int) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.umask(C.int(mask))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func calluname(buf uintptr) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.uname(C.uintptr_t(buf))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callunlink(_p0 uintptr) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.unlink(C.uintptr_t(_p0))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callunlinkat(dirfd int, _p0 uintptr, flags int) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.unlinkat(C.int(dirfd), C.uintptr_t(_p0), C.int(flags))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callustat(dev int, ubuf uintptr) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.ustat(C.int(dev), C.uintptr_t(ubuf))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callwrite(fd int, _p0 uintptr, _lenp0 int) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.write(C.int(fd), C.uintptr_t(_p0), C.size_t(_lenp0))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func calldup2(oldfd int, newfd int) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.dup2(C.int(oldfd), C.int(newfd))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callposix_fadvise64(fd int, offset int64, length int64, advice int) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.posix_fadvise64(C.int(fd), C.longlong(offset), C.longlong(length), C.int(advice))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callfchown(fd int, uid int, gid int) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.fchown(C.int(fd), C.int(uid), C.int(gid))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callfstat(fd int, stat uintptr) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.fstat(C.int(fd), C.uintptr_t(stat))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callfstatat(dirfd int, _p0 uintptr, stat uintptr, flags int) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.fstatat(C.int(dirfd), C.uintptr_t(_p0), C.uintptr_t(stat), C.int(flags))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callfstatfs(fd int, buf uintptr) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.fstatfs(C.int(fd), C.uintptr_t(buf))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callftruncate(fd int, length int64) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.ftruncate(C.int(fd), C.longlong(length))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callgetegid() (r1 uintptr, e1 Errno) { + r1 = uintptr(C.getegid()) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callgeteuid() (r1 uintptr, e1 Errno) { + r1 = uintptr(C.geteuid()) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callgetgid() (r1 uintptr, e1 Errno) { + r1 = uintptr(C.getgid()) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callgetuid() (r1 uintptr, e1 Errno) { + r1 = uintptr(C.getuid()) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func calllchown(_p0 uintptr, uid int, gid int) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.lchown(C.uintptr_t(_p0), C.int(uid), C.int(gid))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func calllisten(s int, n int) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.listen(C.int(s), C.int(n))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func calllstat(_p0 uintptr, stat uintptr) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.lstat(C.uintptr_t(_p0), C.uintptr_t(stat))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callpause() (r1 uintptr, e1 Errno) { + r1 = uintptr(C.pause()) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callpread64(fd int, _p0 uintptr, _lenp0 int, offset int64) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.pread64(C.int(fd), C.uintptr_t(_p0), C.size_t(_lenp0), C.longlong(offset))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callpwrite64(fd int, _p0 uintptr, _lenp0 int, offset int64) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.pwrite64(C.int(fd), C.uintptr_t(_p0), C.size_t(_lenp0), C.longlong(offset))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callpselect(nfd int, r uintptr, w uintptr, e uintptr, timeout uintptr, sigmask uintptr) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.pselect(C.int(nfd), C.uintptr_t(r), C.uintptr_t(w), C.uintptr_t(e), C.uintptr_t(timeout), C.uintptr_t(sigmask))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callsetregid(rgid int, egid int) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.setregid(C.int(rgid), C.int(egid))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callsetreuid(ruid int, euid int) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.setreuid(C.int(ruid), C.int(euid))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callshutdown(fd int, how int) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.shutdown(C.int(fd), C.int(how))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callsplice(rfd int, roff uintptr, wfd int, woff uintptr, len int, flags int) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.splice(C.int(rfd), C.uintptr_t(roff), C.int(wfd), C.uintptr_t(woff), C.int(len), C.int(flags))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callstat(_p0 uintptr, stat uintptr) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.stat(C.uintptr_t(_p0), C.uintptr_t(stat))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callstatfs(_p0 uintptr, buf uintptr) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.statfs(C.uintptr_t(_p0), C.uintptr_t(buf))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func calltruncate(_p0 uintptr, length int64) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.truncate(C.uintptr_t(_p0), C.longlong(length))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callbind(s int, addr uintptr, addrlen uintptr) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.bind(C.int(s), C.uintptr_t(addr), C.uintptr_t(addrlen))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callconnect(s int, addr uintptr, addrlen uintptr) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.connect(C.int(s), C.uintptr_t(addr), C.uintptr_t(addrlen))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callgetgroups(n int, list uintptr) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.getgroups(C.int(n), C.uintptr_t(list))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callsetgroups(n int, list uintptr) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.setgroups(C.int(n), C.uintptr_t(list))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callgetsockopt(s int, level int, name int, val uintptr, vallen uintptr) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.getsockopt(C.int(s), C.int(level), C.int(name), C.uintptr_t(val), C.uintptr_t(vallen))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callsetsockopt(s int, level int, name int, val uintptr, vallen uintptr) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.setsockopt(C.int(s), C.int(level), C.int(name), C.uintptr_t(val), C.uintptr_t(vallen))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callsocket(domain int, typ int, proto int) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.socket(C.int(domain), C.int(typ), C.int(proto))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callsocketpair(domain int, typ int, proto int, fd uintptr) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.socketpair(C.int(domain), C.int(typ), C.int(proto), C.uintptr_t(fd))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callgetpeername(fd int, rsa uintptr, addrlen uintptr) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.getpeername(C.int(fd), C.uintptr_t(rsa), C.uintptr_t(addrlen))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callgetsockname(fd int, rsa uintptr, addrlen uintptr) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.getsockname(C.int(fd), C.uintptr_t(rsa), C.uintptr_t(addrlen))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callrecvfrom(fd int, _p0 uintptr, _lenp0 int, flags int, from uintptr, fromlen uintptr) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.recvfrom(C.int(fd), C.uintptr_t(_p0), C.size_t(_lenp0), C.int(flags), C.uintptr_t(from), C.uintptr_t(fromlen))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callsendto(s int, _p0 uintptr, _lenp0 int, flags int, to uintptr, addrlen uintptr) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.sendto(C.int(s), C.uintptr_t(_p0), C.size_t(_lenp0), C.int(flags), C.uintptr_t(to), C.uintptr_t(addrlen))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callrecvmsg(s int, msg uintptr, flags int) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.recvmsg(C.int(s), C.uintptr_t(msg), C.int(flags))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callsendmsg(s int, msg uintptr, flags int) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.sendmsg(C.int(s), C.uintptr_t(msg), C.int(flags))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callmunmap(addr uintptr, length uintptr) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.munmap(C.uintptr_t(addr), C.uintptr_t(length))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callmadvise(_p0 uintptr, _lenp0 int, advice int) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.madvise(C.uintptr_t(_p0), C.size_t(_lenp0), C.int(advice))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callmprotect(_p0 uintptr, _lenp0 int, prot int) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.mprotect(C.uintptr_t(_p0), C.size_t(_lenp0), C.int(prot))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callmlock(_p0 uintptr, _lenp0 int) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.mlock(C.uintptr_t(_p0), C.size_t(_lenp0))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callmlockall(flags int) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.mlockall(C.int(flags))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callmsync(_p0 uintptr, _lenp0 int, flags int) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.msync(C.uintptr_t(_p0), C.size_t(_lenp0), C.int(flags))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callmunlock(_p0 uintptr, _lenp0 int) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.munlock(C.uintptr_t(_p0), C.size_t(_lenp0))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callmunlockall() (r1 uintptr, e1 Errno) { + r1 = uintptr(C.munlockall()) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callpipe(p uintptr) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.pipe(C.uintptr_t(p))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callpoll(fds uintptr, nfds int, timeout int) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.poll(C.uintptr_t(fds), C.int(nfds), C.int(timeout))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callgettimeofday(tv uintptr, tzp uintptr) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.gettimeofday(C.uintptr_t(tv), C.uintptr_t(tzp))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func calltime(t uintptr) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.time(C.uintptr_t(t))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callutime(_p0 uintptr, buf uintptr) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.utime(C.uintptr_t(_p0), C.uintptr_t(buf))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callgetrlimit(resource int, rlim uintptr) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.getrlimit(C.int(resource), C.uintptr_t(rlim))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callsetrlimit(resource int, rlim uintptr) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.setrlimit(C.int(resource), C.uintptr_t(rlim))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func calllseek(fd int, offset int64, whence int) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.lseek(C.int(fd), C.longlong(offset), C.int(whence))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func callmmap64(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.mmap64(C.uintptr_t(addr), C.uintptr_t(length), C.int(prot), C.int(flags), C.int(fd), C.longlong(offset))) + e1 = syscall.GetErrno() + return +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go new file mode 100644 index 00000000..9ce06df6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go @@ -0,0 +1,1769 @@ +// mksyscall.pl -l32 -tags darwin,386 syscall_bsd.go syscall_darwin.go syscall_darwin_386.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build darwin,386 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe() (r int, w int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + r = int(r0) + w = int(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getxattr(path string, attr string, dest *byte, size int, position uint32, options int) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(dest)), uintptr(size), uintptr(position), uintptr(options)) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fgetxattr(fd int, attr string, dest *byte, size int, position uint32, options int) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attr) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_FGETXATTR, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(dest)), uintptr(size), uintptr(position), uintptr(options)) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setxattr(path string, attr string, data *byte, size int, position uint32, options int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(data)), uintptr(size), uintptr(position), uintptr(options)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fsetxattr(fd int, attr string, data *byte, size int, position uint32, options int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSETXATTR, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(data)), uintptr(size), uintptr(position), uintptr(options)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func removexattr(path string, attr string, options int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(options)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fremovexattr(fd int, attr string, options int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FREMOVEXATTR, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(options)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func listxattr(path string, dest *byte, size int, options int) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(dest)), uintptr(size), uintptr(options), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func flistxattr(fd int, dest *byte, size int, options int) (sz int, err error) { + r0, _, e1 := Syscall6(SYS_FLISTXATTR, uintptr(fd), uintptr(unsafe.Pointer(dest)), uintptr(size), uintptr(options), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kill(pid int, signum int, posix int) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), uintptr(posix)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exchangedata(path1 string, path2 string, options int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path1) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(path2) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXCHANGEDATA, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(options)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSTATAT64, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, stat *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), uintptr(length>>32)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETDIRENTRIES64, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdtablesize() (size int) { + r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) + size = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := RawSyscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(fromfd int, from string, tofd int, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(offset>>32), uintptr(whence), 0, 0) + newoffset = int64(int64(r1)<<32 | int64(r0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := Syscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setlogin(name string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setprivexec(flag int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIVEXEC, uintptr(flag), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, stat *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), uintptr(length>>32)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Undelete(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos), uintptr(pos>>32), 0, 0) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func gettimeofday(tp *Timeval) (sec int32, usec int32, err error) { + r0, r1, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + sec = int32(r0) + usec = int32(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go new file mode 100644 index 00000000..de992704 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go @@ -0,0 +1,1769 @@ +// mksyscall.pl -tags darwin,amd64 syscall_bsd.go syscall_darwin.go syscall_darwin_amd64.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build darwin,amd64 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe() (r int, w int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + r = int(r0) + w = int(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getxattr(path string, attr string, dest *byte, size int, position uint32, options int) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(dest)), uintptr(size), uintptr(position), uintptr(options)) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fgetxattr(fd int, attr string, dest *byte, size int, position uint32, options int) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attr) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_FGETXATTR, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(dest)), uintptr(size), uintptr(position), uintptr(options)) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setxattr(path string, attr string, data *byte, size int, position uint32, options int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(data)), uintptr(size), uintptr(position), uintptr(options)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fsetxattr(fd int, attr string, data *byte, size int, position uint32, options int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSETXATTR, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(data)), uintptr(size), uintptr(position), uintptr(options)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func removexattr(path string, attr string, options int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(options)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fremovexattr(fd int, attr string, options int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FREMOVEXATTR, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(options)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func listxattr(path string, dest *byte, size int, options int) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(dest)), uintptr(size), uintptr(options), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func flistxattr(fd int, dest *byte, size int, options int) (sz int, err error) { + r0, _, e1 := Syscall6(SYS_FLISTXATTR, uintptr(fd), uintptr(unsafe.Pointer(dest)), uintptr(size), uintptr(options), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kill(pid int, signum int, posix int) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), uintptr(posix)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exchangedata(path1 string, path2 string, options int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path1) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(path2) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXCHANGEDATA, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(options)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSTATAT64, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, stat *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETDIRENTRIES64, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdtablesize() (size int) { + r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) + size = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := RawSyscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(fromfd int, from string, tofd int, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + newoffset = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := Syscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setlogin(name string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setprivexec(flag int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIVEXEC, uintptr(flag), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, stat *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Undelete(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos)) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func gettimeofday(tp *Timeval) (sec int64, usec int32, err error) { + r0, r1, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + sec = int64(r0) + usec = int32(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go new file mode 100644 index 00000000..81c4f093 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go @@ -0,0 +1,1769 @@ +// mksyscall.pl -l32 -tags darwin,arm syscall_bsd.go syscall_darwin.go syscall_darwin_arm.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build darwin,arm + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe() (r int, w int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + r = int(r0) + w = int(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getxattr(path string, attr string, dest *byte, size int, position uint32, options int) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(dest)), uintptr(size), uintptr(position), uintptr(options)) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fgetxattr(fd int, attr string, dest *byte, size int, position uint32, options int) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attr) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_FGETXATTR, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(dest)), uintptr(size), uintptr(position), uintptr(options)) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setxattr(path string, attr string, data *byte, size int, position uint32, options int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(data)), uintptr(size), uintptr(position), uintptr(options)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fsetxattr(fd int, attr string, data *byte, size int, position uint32, options int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSETXATTR, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(data)), uintptr(size), uintptr(position), uintptr(options)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func removexattr(path string, attr string, options int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(options)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fremovexattr(fd int, attr string, options int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FREMOVEXATTR, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(options)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func listxattr(path string, dest *byte, size int, options int) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(dest)), uintptr(size), uintptr(options), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func flistxattr(fd int, dest *byte, size int, options int) (sz int, err error) { + r0, _, e1 := Syscall6(SYS_FLISTXATTR, uintptr(fd), uintptr(unsafe.Pointer(dest)), uintptr(size), uintptr(options), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kill(pid int, signum int, posix int) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), uintptr(posix)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exchangedata(path1 string, path2 string, options int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path1) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(path2) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXCHANGEDATA, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(options)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSTATAT64, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, stat *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), uintptr(length>>32)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETDIRENTRIES64, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdtablesize() (size int) { + r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) + size = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := RawSyscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(fromfd int, from string, tofd int, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(offset>>32), uintptr(whence), 0, 0) + newoffset = int64(int64(r1)<<32 | int64(r0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := Syscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setlogin(name string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setprivexec(flag int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIVEXEC, uintptr(flag), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, stat *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), uintptr(length>>32)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Undelete(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos), uintptr(pos>>32), 0, 0) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func gettimeofday(tp *Timeval) (sec int32, usec int32, err error) { + r0, r1, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + sec = int32(r0) + usec = int32(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go new file mode 100644 index 00000000..338c32d4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go @@ -0,0 +1,1769 @@ +// mksyscall.pl -tags darwin,arm64 syscall_bsd.go syscall_darwin.go syscall_darwin_arm64.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build darwin,arm64 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe() (r int, w int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + r = int(r0) + w = int(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getxattr(path string, attr string, dest *byte, size int, position uint32, options int) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(dest)), uintptr(size), uintptr(position), uintptr(options)) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fgetxattr(fd int, attr string, dest *byte, size int, position uint32, options int) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attr) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_FGETXATTR, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(dest)), uintptr(size), uintptr(position), uintptr(options)) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setxattr(path string, attr string, data *byte, size int, position uint32, options int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(data)), uintptr(size), uintptr(position), uintptr(options)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fsetxattr(fd int, attr string, data *byte, size int, position uint32, options int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSETXATTR, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(data)), uintptr(size), uintptr(position), uintptr(options)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func removexattr(path string, attr string, options int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(options)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fremovexattr(fd int, attr string, options int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FREMOVEXATTR, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(options)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func listxattr(path string, dest *byte, size int, options int) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(dest)), uintptr(size), uintptr(options), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func flistxattr(fd int, dest *byte, size int, options int) (sz int, err error) { + r0, _, e1 := Syscall6(SYS_FLISTXATTR, uintptr(fd), uintptr(unsafe.Pointer(dest)), uintptr(size), uintptr(options), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kill(pid int, signum int, posix int) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), uintptr(posix)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exchangedata(path1 string, path2 string, options int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path1) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(path2) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXCHANGEDATA, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(options)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSTATAT64, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, stat *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETDIRENTRIES64, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdtablesize() (size int) { + r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) + size = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := RawSyscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(fromfd int, from string, tofd int, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + newoffset = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := Syscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setlogin(name string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setprivexec(flag int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIVEXEC, uintptr(flag), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, stat *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Undelete(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos)) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func gettimeofday(tp *Timeval) (sec int64, usec int32, err error) { + r0, r1, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + sec = int64(r0) + usec = int32(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go new file mode 100644 index 00000000..91f36e9e --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go @@ -0,0 +1,1508 @@ +// mksyscall.pl -dragonfly -tags dragonfly,amd64 syscall_bsd.go syscall_dragonfly.go syscall_dragonfly_amd64.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build dragonfly,amd64 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe() (r int, w int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + r = int(r0) + w = int(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func extpread(fd int, p []byte, flags int, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EXTPREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(offset), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func extpwrite(fd int, p []byte, flags int, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EXTPWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(offset), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS___GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSTATAT, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, stat *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETDIRENTRIES, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdtablesize() (size int) { + r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) + size = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, _, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(whence), 0, 0) + newoffset = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setlogin(name string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, stat *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Undelete(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), 0, 0) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) { + r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go new file mode 100644 index 00000000..9bbbf966 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go @@ -0,0 +1,2015 @@ +// mksyscall.pl -l32 -tags freebsd,386 syscall_bsd.go syscall_freebsd.go syscall_freebsd_386.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build freebsd,386 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS___GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func CapEnter() (err error) { + _, _, e1 := Syscall(SYS_CAP_ENTER, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func capRightsGet(version int, fd int, rightsp *CapRights) (err error) { + _, _, e1 := Syscall(SYS___CAP_RIGHTS_GET, uintptr(version), uintptr(fd), uintptr(unsafe.Pointer(rightsp))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func capRightsLimit(fd int, rightsp *CapRights) (err error) { + _, _, e1 := Syscall(SYS_CAP_RIGHTS_LIMIT, uintptr(fd), uintptr(unsafe.Pointer(rightsp)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteFd(fd int, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListFd(fd int, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FD, uintptr(fd), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteFile(file string, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListFile(file string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteLink(link string, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListLink(link string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall6(SYS_POSIX_FADVISE, uintptr(fd), uintptr(offset), uintptr(offset>>32), uintptr(length), uintptr(length>>32), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fstat(fd int, stat *stat_freebsd11_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fstat_freebsd12(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT_FREEBSD12, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fstatat(fd int, path string, stat *stat_freebsd11_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSTATAT, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fstatat_freebsd12(fd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSTATAT_FREEBSD12, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fstatfs(fd int, stat *statfs_freebsd11_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fstatfs_freebsd12(fd int, stat *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS_FREEBSD12, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), uintptr(length>>32)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETDIRENTRIES, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getdirentries_freebsd12(fd int, buf []byte, basep *uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETDIRENTRIES_FREEBSD12, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdtablesize() (size int) { + r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) + size = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func lstat(path string, stat *stat_freebsd11_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mknodat(fd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mknodat_freebsd12(fd int, path string, mode uint32, dev uint64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT_FREEBSD12, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Openat(fdat int, path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(fdat), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(fromfd int, from string, tofd int, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(offset>>32), uintptr(whence), 0, 0) + newoffset = int64(int64(r1)<<32 | int64(r0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setlogin(name string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func stat(path string, stat *stat_freebsd11_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func statfs(path string, stat *statfs_freebsd11_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func statfs_freebsd12(path string, stat *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS_FREEBSD12, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), uintptr(length>>32)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Undelete(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos), uintptr(pos>>32), 0, 0) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) { + r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go new file mode 100644 index 00000000..ee7090ff --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go @@ -0,0 +1,2015 @@ +// mksyscall.pl -tags freebsd,amd64 syscall_bsd.go syscall_freebsd.go syscall_freebsd_amd64.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build freebsd,amd64 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS___GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func CapEnter() (err error) { + _, _, e1 := Syscall(SYS_CAP_ENTER, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func capRightsGet(version int, fd int, rightsp *CapRights) (err error) { + _, _, e1 := Syscall(SYS___CAP_RIGHTS_GET, uintptr(version), uintptr(fd), uintptr(unsafe.Pointer(rightsp))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func capRightsLimit(fd int, rightsp *CapRights) (err error) { + _, _, e1 := Syscall(SYS_CAP_RIGHTS_LIMIT, uintptr(fd), uintptr(unsafe.Pointer(rightsp)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteFd(fd int, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListFd(fd int, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FD, uintptr(fd), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteFile(file string, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListFile(file string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteLink(link string, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListLink(link string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall6(SYS_POSIX_FADVISE, uintptr(fd), uintptr(offset), uintptr(length), uintptr(advice), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fstat(fd int, stat *stat_freebsd11_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fstat_freebsd12(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT_FREEBSD12, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fstatat(fd int, path string, stat *stat_freebsd11_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSTATAT, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fstatat_freebsd12(fd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSTATAT_FREEBSD12, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fstatfs(fd int, stat *statfs_freebsd11_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fstatfs_freebsd12(fd int, stat *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS_FREEBSD12, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETDIRENTRIES, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getdirentries_freebsd12(fd int, buf []byte, basep *uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETDIRENTRIES_FREEBSD12, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdtablesize() (size int) { + r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) + size = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func lstat(path string, stat *stat_freebsd11_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mknodat(fd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mknodat_freebsd12(fd int, path string, mode uint32, dev uint64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT_FREEBSD12, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Openat(fdat int, path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(fdat), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(fromfd int, from string, tofd int, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + newoffset = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setlogin(name string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func stat(path string, stat *stat_freebsd11_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func statfs(path string, stat *statfs_freebsd11_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func statfs_freebsd12(path string, stat *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS_FREEBSD12, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Undelete(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos)) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) { + r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go new file mode 100644 index 00000000..9aeff513 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go @@ -0,0 +1,2015 @@ +// mksyscall.pl -l32 -arm -tags freebsd,arm syscall_bsd.go syscall_freebsd.go syscall_freebsd_arm.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build freebsd,arm + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS___GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func CapEnter() (err error) { + _, _, e1 := Syscall(SYS_CAP_ENTER, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func capRightsGet(version int, fd int, rightsp *CapRights) (err error) { + _, _, e1 := Syscall(SYS___CAP_RIGHTS_GET, uintptr(version), uintptr(fd), uintptr(unsafe.Pointer(rightsp))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func capRightsLimit(fd int, rightsp *CapRights) (err error) { + _, _, e1 := Syscall(SYS_CAP_RIGHTS_LIMIT, uintptr(fd), uintptr(unsafe.Pointer(rightsp)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteFd(fd int, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListFd(fd int, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FD, uintptr(fd), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteFile(file string, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListFile(file string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteLink(link string, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListLink(link string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall9(SYS_POSIX_FADVISE, uintptr(fd), 0, uintptr(offset), uintptr(offset>>32), uintptr(length), uintptr(length>>32), uintptr(advice), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fstat(fd int, stat *stat_freebsd11_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fstat_freebsd12(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT_FREEBSD12, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fstatat(fd int, path string, stat *stat_freebsd11_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSTATAT, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fstatat_freebsd12(fd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSTATAT_FREEBSD12, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fstatfs(fd int, stat *statfs_freebsd11_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fstatfs_freebsd12(fd int, stat *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS_FREEBSD12, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall6(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETDIRENTRIES, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getdirentries_freebsd12(fd int, buf []byte, basep *uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETDIRENTRIES_FREEBSD12, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdtablesize() (size int) { + r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) + size = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func lstat(path string, stat *stat_freebsd11_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mknodat(fd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mknodat_freebsd12(fd int, path string, mode uint32, dev uint64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT_FREEBSD12, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Openat(fdat int, path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(fdat), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(fromfd int, from string, tofd int, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(offset>>32), uintptr(whence), 0) + newoffset = int64(int64(r1)<<32 | int64(r0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setlogin(name string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func stat(path string, stat *stat_freebsd11_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func statfs(path string, stat *statfs_freebsd11_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func statfs_freebsd12(path string, stat *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS_FREEBSD12, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Undelete(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), uintptr(pos>>32), 0) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) { + r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go new file mode 100644 index 00000000..35b155a0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go @@ -0,0 +1,2131 @@ +// mksyscall.pl -l32 -tags linux,386 syscall_linux.go syscall_linux_386.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build linux,386 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGetres(clockid int32, res *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETRES, uintptr(clockid), uintptr(unsafe.Pointer(res)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + SyscallNoError(SYS_EXIT_GROUP, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(off>>32), uintptr(len), uintptr(len>>32)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fgetxattr(fd int, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_FGETXATTR, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flistxattr(fd int, dest []byte) (sz int, err error) { + var _p0 unsafe.Pointer + if len(dest) > 0 { + _p0 = unsafe.Pointer(&dest[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_FLISTXATTR, uintptr(fd), uintptr(_p0), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fremovexattr(fd int, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FREMOVEXATTR, uintptr(fd), uintptr(unsafe.Pointer(_p0)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsetxattr(fd int, attr string, dest []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_FSETXATTR, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _ := RawSyscallNoError(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _ := RawSyscallNoError(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettid() (tid int) { + r0, _ := RawSyscallNoError(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func MemfdCreate(name string, flags int) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_MEMFD_CREATE, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_PERF_EVENT_OPEN, uintptr(unsafe.Pointer(attr)), uintptr(pid), uintptr(cpu), uintptr(groupFd), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat2(olddirfd int, oldpath string, newdirfd int, newpath string, flags uint) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT2, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_STATX, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mask), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() { + SyscallNoError(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, r1, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(int64(r1)<<32 | int64(r0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _ := RawSyscallNoError(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, advice int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func faccessat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe(p *[2]_C_int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate(size int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall6(SYS_FADVISE64_64, uintptr(fd), uintptr(offset), uintptr(offset>>32), uintptr(length), uintptr(length>>32), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN32, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSTATAT64, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE64, uintptr(fd), uintptr(length), uintptr(length>>32)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _ := RawSyscallNoError(SYS_GETEGID32, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _ := RawSyscallNoError(SYS_GETEUID32, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _ := RawSyscallNoError(SYS_GETGID32, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _ := RawSyscallNoError(SYS_GETUID32, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit() (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ioperm(from int, num int, on int) (err error) { + _, _, e1 := Syscall(SYS_IOPERM, uintptr(from), uintptr(num), uintptr(on)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Iopl(level int) (err error) { + _, _, e1 := Syscall(SYS_IOPL, uintptr(level), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN32, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE64, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID32, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID32, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID32, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID32, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID32, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID32, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { + _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE, uintptr(fd), uintptr(off), uintptr(off>>32), uintptr(n), uintptr(n>>32), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE64, uintptr(unsafe.Pointer(_p0)), uintptr(length), uintptr(length>>32)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS32, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS32, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS__NEWSELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP2, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(pageOffset)) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pause() (err error) { + _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getrlimit(resource int, rlim *rlimit32) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setrlimit(resource int, rlim *rlimit32) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(dirfd int, path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Time(t *Time_t) (tt Time_t, err error) { + r0, _, e1 := RawSyscall(SYS_TIME, uintptr(unsafe.Pointer(t)), 0, 0) + tt = Time_t(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Utime(path string, buf *Utimbuf) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go new file mode 100644 index 00000000..46e9ddfb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go @@ -0,0 +1,2313 @@ +// mksyscall.pl -tags linux,amd64 syscall_linux.go syscall_linux_amd64.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build linux,amd64 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGetres(clockid int32, res *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETRES, uintptr(clockid), uintptr(unsafe.Pointer(res)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + SyscallNoError(SYS_EXIT_GROUP, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fgetxattr(fd int, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_FGETXATTR, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flistxattr(fd int, dest []byte) (sz int, err error) { + var _p0 unsafe.Pointer + if len(dest) > 0 { + _p0 = unsafe.Pointer(&dest[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_FLISTXATTR, uintptr(fd), uintptr(_p0), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fremovexattr(fd int, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FREMOVEXATTR, uintptr(fd), uintptr(unsafe.Pointer(_p0)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsetxattr(fd int, attr string, dest []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_FSETXATTR, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _ := RawSyscallNoError(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _ := RawSyscallNoError(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettid() (tid int) { + r0, _ := RawSyscallNoError(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func MemfdCreate(name string, flags int) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_MEMFD_CREATE, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_PERF_EVENT_OPEN, uintptr(unsafe.Pointer(attr)), uintptr(pid), uintptr(cpu), uintptr(groupFd), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat2(olddirfd int, oldpath string, newdirfd int, newpath string, flags uint) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT2, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_STATX, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mask), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() { + SyscallNoError(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _ := RawSyscallNoError(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, advice int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func faccessat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate(size int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall6(SYS_FADVISE64, uintptr(fd), uintptr(offset), uintptr(length), uintptr(advice), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_NEWFSTATAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, buf *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _ := RawSyscallNoError(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _ := RawSyscallNoError(SYS_GETEUID, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _ := RawSyscallNoError(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _ := RawSyscallNoError(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit() (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ioperm(from int, num int, on int) (err error) { + _, _, e1 := Syscall(SYS_IOPERM, uintptr(from), uintptr(num), uintptr(on)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Iopl(level int) (err error) { + _, _, e1 := Syscall(SYS_IOPL, uintptr(level), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, n int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pause() (err error) { + _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (off int64, err error) { + r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + off = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, buf *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { + _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE, uintptr(fd), uintptr(off), uintptr(n), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(dirfd int, path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Utime(path string, buf *Utimbuf) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe(p *[2]_C_int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kexecFileLoad(kernelFd int, initrdFd int, cmdlineLen int, cmdline string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(cmdline) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_KEXEC_FILE_LOAD, uintptr(kernelFd), uintptr(initrdFd), uintptr(cmdlineLen), uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go new file mode 100644 index 00000000..914f25f0 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go @@ -0,0 +1,2233 @@ +// mksyscall.pl -l32 -arm -tags linux,arm syscall_linux.go syscall_linux_arm.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build linux,arm + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGetres(clockid int32, res *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETRES, uintptr(clockid), uintptr(unsafe.Pointer(res)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + SyscallNoError(SYS_EXIT_GROUP, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(off>>32), uintptr(len), uintptr(len>>32)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fgetxattr(fd int, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_FGETXATTR, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flistxattr(fd int, dest []byte) (sz int, err error) { + var _p0 unsafe.Pointer + if len(dest) > 0 { + _p0 = unsafe.Pointer(&dest[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_FLISTXATTR, uintptr(fd), uintptr(_p0), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fremovexattr(fd int, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FREMOVEXATTR, uintptr(fd), uintptr(unsafe.Pointer(_p0)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsetxattr(fd int, attr string, dest []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_FSETXATTR, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _ := RawSyscallNoError(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _ := RawSyscallNoError(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettid() (tid int) { + r0, _ := RawSyscallNoError(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func MemfdCreate(name string, flags int) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_MEMFD_CREATE, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_PERF_EVENT_OPEN, uintptr(unsafe.Pointer(attr)), uintptr(pid), uintptr(cpu), uintptr(groupFd), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat2(olddirfd int, oldpath string, newdirfd int, newpath string, flags uint) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT2, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_STATX, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mask), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() { + SyscallNoError(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, r1, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(int64(r1)<<32 | int64(r0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _ := RawSyscallNoError(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, advice int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func faccessat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS32, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS32, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, flags int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(flags), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate(size int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN32, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSTATAT64, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _ := RawSyscallNoError(SYS_GETEGID32, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _ := RawSyscallNoError(SYS_GETEUID32, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _ := RawSyscallNoError(SYS_GETGID32, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _ := RawSyscallNoError(SYS_GETUID32, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit() (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN32, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, n int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pause() (err error) { + _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE64, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS__NEWSELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID32, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID32, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID32, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID32, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID32, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID32, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(dirfd int, path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_TRUNCATE64, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall6(SYS_FTRUNCATE64, uintptr(fd), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP2, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(pageOffset)) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getrlimit(resource int, rlim *rlimit32) (err error) { + _, _, e1 := RawSyscall(SYS_UGETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setrlimit(resource int, rlim *rlimit32) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go new file mode 100644 index 00000000..1d6c5562 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go @@ -0,0 +1,2140 @@ +// mksyscall.pl -tags linux,arm64 syscall_linux.go syscall_linux_arm64.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build linux,arm64 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGetres(clockid int32, res *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETRES, uintptr(clockid), uintptr(unsafe.Pointer(res)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + SyscallNoError(SYS_EXIT_GROUP, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fgetxattr(fd int, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_FGETXATTR, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flistxattr(fd int, dest []byte) (sz int, err error) { + var _p0 unsafe.Pointer + if len(dest) > 0 { + _p0 = unsafe.Pointer(&dest[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_FLISTXATTR, uintptr(fd), uintptr(_p0), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fremovexattr(fd int, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FREMOVEXATTR, uintptr(fd), uintptr(unsafe.Pointer(_p0)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsetxattr(fd int, attr string, dest []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_FSETXATTR, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _ := RawSyscallNoError(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _ := RawSyscallNoError(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettid() (tid int) { + r0, _ := RawSyscallNoError(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func MemfdCreate(name string, flags int) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_MEMFD_CREATE, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_PERF_EVENT_OPEN, uintptr(unsafe.Pointer(attr)), uintptr(pid), uintptr(cpu), uintptr(groupFd), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat2(olddirfd int, oldpath string, newdirfd int, newpath string, flags uint) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT2, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_STATX, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mask), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() { + SyscallNoError(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _ := RawSyscallNoError(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, advice int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func faccessat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_PWAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall6(SYS_FADVISE64, uintptr(fd), uintptr(offset), uintptr(length), uintptr(advice), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSTATAT, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, buf *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _ := RawSyscallNoError(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _ := RawSyscallNoError(SYS_GETEUID, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _ := RawSyscallNoError(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _ := RawSyscallNoError(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, n int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (off int64, err error) { + r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + off = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, buf *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { + _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE, uintptr(fd), uintptr(off), uintptr(n), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go new file mode 100644 index 00000000..260631d1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go @@ -0,0 +1,2311 @@ +// mksyscall.pl -b32 -arm -tags linux,mips syscall_linux.go syscall_linux_mipsx.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build linux,mips + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGetres(clockid int32, res *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETRES, uintptr(clockid), uintptr(unsafe.Pointer(res)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + SyscallNoError(SYS_EXIT_GROUP, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off>>32), uintptr(off), uintptr(len>>32), uintptr(len)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fgetxattr(fd int, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_FGETXATTR, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flistxattr(fd int, dest []byte) (sz int, err error) { + var _p0 unsafe.Pointer + if len(dest) > 0 { + _p0 = unsafe.Pointer(&dest[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_FLISTXATTR, uintptr(fd), uintptr(_p0), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fremovexattr(fd int, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FREMOVEXATTR, uintptr(fd), uintptr(unsafe.Pointer(_p0)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsetxattr(fd int, attr string, dest []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_FSETXATTR, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _ := RawSyscallNoError(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _ := RawSyscallNoError(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettid() (tid int) { + r0, _ := RawSyscallNoError(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func MemfdCreate(name string, flags int) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_MEMFD_CREATE, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_PERF_EVENT_OPEN, uintptr(unsafe.Pointer(attr)), uintptr(pid), uintptr(cpu), uintptr(groupFd), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat2(olddirfd int, oldpath string, newdirfd int, newpath string, flags uint) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT2, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_STATX, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mask), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() { + SyscallNoError(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, r1, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(int64(r0)<<32 | int64(r1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _ := RawSyscallNoError(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, advice int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func faccessat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate(size int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall9(SYS_FADVISE64, uintptr(fd), 0, uintptr(offset>>32), uintptr(offset), uintptr(length>>32), uintptr(length), uintptr(advice), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall6(SYS_FTRUNCATE64, uintptr(fd), 0, uintptr(length>>32), uintptr(length), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _ := RawSyscallNoError(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _ := RawSyscallNoError(SYS_GETEUID, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _ := RawSyscallNoError(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _ := RawSyscallNoError(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, n int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset>>32), uintptr(offset)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset>>32), uintptr(offset)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS__NEWSELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE64, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { + _, _, e1 := Syscall9(SYS_SYNC_FILE_RANGE, uintptr(fd), 0, uintptr(off>>32), uintptr(off), uintptr(n>>32), uintptr(n), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_TRUNCATE64, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length>>32), uintptr(length), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit() (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ioperm(from int, num int, on int) (err error) { + _, _, e1 := Syscall(SYS_IOPERM, uintptr(from), uintptr(num), uintptr(on)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Iopl(level int) (err error) { + _, _, e1 := Syscall(SYS_IOPL, uintptr(level), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(dirfd int, path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Time(t *Time_t) (tt Time_t, err error) { + r0, _, e1 := RawSyscall(SYS_TIME, uintptr(unsafe.Pointer(t)), 0, 0) + tt = Time_t(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Utime(path string, buf *Utimbuf) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSTATAT64, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pause() (err error) { + _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe() (p1 int, p2 int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + p1 = int(r0) + p2 = int(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP2, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(pageOffset)) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getrlimit(resource int, rlim *rlimit32) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setrlimit(resource int, rlim *rlimit32) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go new file mode 100644 index 00000000..ff2d84fb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go @@ -0,0 +1,2282 @@ +// mksyscall.pl -tags linux,mips64 syscall_linux.go syscall_linux_mips64x.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build linux,mips64 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGetres(clockid int32, res *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETRES, uintptr(clockid), uintptr(unsafe.Pointer(res)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + SyscallNoError(SYS_EXIT_GROUP, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fgetxattr(fd int, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_FGETXATTR, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flistxattr(fd int, dest []byte) (sz int, err error) { + var _p0 unsafe.Pointer + if len(dest) > 0 { + _p0 = unsafe.Pointer(&dest[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_FLISTXATTR, uintptr(fd), uintptr(_p0), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fremovexattr(fd int, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FREMOVEXATTR, uintptr(fd), uintptr(unsafe.Pointer(_p0)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsetxattr(fd int, attr string, dest []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_FSETXATTR, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _ := RawSyscallNoError(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _ := RawSyscallNoError(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettid() (tid int) { + r0, _ := RawSyscallNoError(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func MemfdCreate(name string, flags int) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_MEMFD_CREATE, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_PERF_EVENT_OPEN, uintptr(unsafe.Pointer(attr)), uintptr(pid), uintptr(cpu), uintptr(groupFd), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat2(olddirfd int, oldpath string, newdirfd int, newpath string, flags uint) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT2, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_STATX, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mask), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() { + SyscallNoError(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _ := RawSyscallNoError(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, advice int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func faccessat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate(size int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall6(SYS_FADVISE64, uintptr(fd), uintptr(offset), uintptr(length), uintptr(advice), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_NEWFSTATAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, buf *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _ := RawSyscallNoError(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _ := RawSyscallNoError(SYS_GETEUID, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _ := RawSyscallNoError(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _ := RawSyscallNoError(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, n int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pause() (err error) { + _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (off int64, err error) { + r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + off = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, buf *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { + _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE, uintptr(fd), uintptr(off), uintptr(n), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(dirfd int, path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Utime(path string, buf *Utimbuf) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fstat(fd int, st *stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(st)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func lstat(path string, st *stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(st)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func stat(path string, st *stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(st)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go new file mode 100644 index 00000000..48d14e60 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go @@ -0,0 +1,2282 @@ +// mksyscall.pl -tags linux,mips64le syscall_linux.go syscall_linux_mips64x.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build linux,mips64le + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGetres(clockid int32, res *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETRES, uintptr(clockid), uintptr(unsafe.Pointer(res)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + SyscallNoError(SYS_EXIT_GROUP, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fgetxattr(fd int, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_FGETXATTR, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flistxattr(fd int, dest []byte) (sz int, err error) { + var _p0 unsafe.Pointer + if len(dest) > 0 { + _p0 = unsafe.Pointer(&dest[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_FLISTXATTR, uintptr(fd), uintptr(_p0), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fremovexattr(fd int, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FREMOVEXATTR, uintptr(fd), uintptr(unsafe.Pointer(_p0)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsetxattr(fd int, attr string, dest []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_FSETXATTR, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _ := RawSyscallNoError(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _ := RawSyscallNoError(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettid() (tid int) { + r0, _ := RawSyscallNoError(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func MemfdCreate(name string, flags int) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_MEMFD_CREATE, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_PERF_EVENT_OPEN, uintptr(unsafe.Pointer(attr)), uintptr(pid), uintptr(cpu), uintptr(groupFd), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat2(olddirfd int, oldpath string, newdirfd int, newpath string, flags uint) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT2, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_STATX, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mask), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() { + SyscallNoError(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _ := RawSyscallNoError(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, advice int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func faccessat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate(size int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall6(SYS_FADVISE64, uintptr(fd), uintptr(offset), uintptr(length), uintptr(advice), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_NEWFSTATAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, buf *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _ := RawSyscallNoError(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _ := RawSyscallNoError(SYS_GETEUID, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _ := RawSyscallNoError(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _ := RawSyscallNoError(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, n int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pause() (err error) { + _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (off int64, err error) { + r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + off = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, buf *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { + _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE, uintptr(fd), uintptr(off), uintptr(n), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(dirfd int, path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Utime(path string, buf *Utimbuf) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fstat(fd int, st *stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(st)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func lstat(path string, st *stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(st)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func stat(path string, st *stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(st)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go new file mode 100644 index 00000000..12c17a92 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go @@ -0,0 +1,2311 @@ +// mksyscall.pl -l32 -arm -tags linux,mipsle syscall_linux.go syscall_linux_mipsx.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build linux,mipsle + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGetres(clockid int32, res *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETRES, uintptr(clockid), uintptr(unsafe.Pointer(res)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + SyscallNoError(SYS_EXIT_GROUP, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(off>>32), uintptr(len), uintptr(len>>32)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fgetxattr(fd int, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_FGETXATTR, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flistxattr(fd int, dest []byte) (sz int, err error) { + var _p0 unsafe.Pointer + if len(dest) > 0 { + _p0 = unsafe.Pointer(&dest[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_FLISTXATTR, uintptr(fd), uintptr(_p0), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fremovexattr(fd int, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FREMOVEXATTR, uintptr(fd), uintptr(unsafe.Pointer(_p0)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsetxattr(fd int, attr string, dest []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_FSETXATTR, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _ := RawSyscallNoError(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _ := RawSyscallNoError(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettid() (tid int) { + r0, _ := RawSyscallNoError(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func MemfdCreate(name string, flags int) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_MEMFD_CREATE, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_PERF_EVENT_OPEN, uintptr(unsafe.Pointer(attr)), uintptr(pid), uintptr(cpu), uintptr(groupFd), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat2(olddirfd int, oldpath string, newdirfd int, newpath string, flags uint) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT2, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_STATX, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mask), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() { + SyscallNoError(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, r1, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(int64(r1)<<32 | int64(r0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _ := RawSyscallNoError(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, advice int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func faccessat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate(size int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall9(SYS_FADVISE64, uintptr(fd), 0, uintptr(offset), uintptr(offset>>32), uintptr(length), uintptr(length>>32), uintptr(advice), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall6(SYS_FTRUNCATE64, uintptr(fd), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _ := RawSyscallNoError(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _ := RawSyscallNoError(SYS_GETEUID, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _ := RawSyscallNoError(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _ := RawSyscallNoError(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, n int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS__NEWSELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE64, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { + _, _, e1 := Syscall9(SYS_SYNC_FILE_RANGE, uintptr(fd), 0, uintptr(off), uintptr(off>>32), uintptr(n), uintptr(n>>32), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_TRUNCATE64, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit() (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ioperm(from int, num int, on int) (err error) { + _, _, e1 := Syscall(SYS_IOPERM, uintptr(from), uintptr(num), uintptr(on)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Iopl(level int) (err error) { + _, _, e1 := Syscall(SYS_IOPL, uintptr(level), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(dirfd int, path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Time(t *Time_t) (tt Time_t, err error) { + r0, _, e1 := RawSyscall(SYS_TIME, uintptr(unsafe.Pointer(t)), 0, 0) + tt = Time_t(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Utime(path string, buf *Utimbuf) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSTATAT64, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pause() (err error) { + _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe() (p1 int, p2 int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + p1 = int(r0) + p2 = int(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP2, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(pageOffset)) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getrlimit(resource int, rlim *rlimit32) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setrlimit(resource int, rlim *rlimit32) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go new file mode 100644 index 00000000..c8ca4279 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go @@ -0,0 +1,2360 @@ +// mksyscall.pl -tags linux,ppc64 syscall_linux.go syscall_linux_ppc64x.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build linux,ppc64 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGetres(clockid int32, res *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETRES, uintptr(clockid), uintptr(unsafe.Pointer(res)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + SyscallNoError(SYS_EXIT_GROUP, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fgetxattr(fd int, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_FGETXATTR, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flistxattr(fd int, dest []byte) (sz int, err error) { + var _p0 unsafe.Pointer + if len(dest) > 0 { + _p0 = unsafe.Pointer(&dest[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_FLISTXATTR, uintptr(fd), uintptr(_p0), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fremovexattr(fd int, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FREMOVEXATTR, uintptr(fd), uintptr(unsafe.Pointer(_p0)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsetxattr(fd int, attr string, dest []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_FSETXATTR, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _ := RawSyscallNoError(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _ := RawSyscallNoError(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettid() (tid int) { + r0, _ := RawSyscallNoError(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func MemfdCreate(name string, flags int) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_MEMFD_CREATE, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_PERF_EVENT_OPEN, uintptr(unsafe.Pointer(attr)), uintptr(pid), uintptr(cpu), uintptr(groupFd), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat2(olddirfd int, oldpath string, newdirfd int, newpath string, flags uint) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT2, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_STATX, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mask), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() { + SyscallNoError(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _ := RawSyscallNoError(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, advice int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func faccessat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate(size int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall6(SYS_FADVISE64, uintptr(fd), uintptr(offset), uintptr(length), uintptr(advice), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_NEWFSTATAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, buf *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _ := RawSyscallNoError(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _ := RawSyscallNoError(SYS_GETEUID, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _ := RawSyscallNoError(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_UGETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _ := RawSyscallNoError(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit() (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ioperm(from int, num int, on int) (err error) { + _, _, e1 := Syscall(SYS_IOPERM, uintptr(from), uintptr(num), uintptr(on)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Iopl(level int) (err error) { + _, _, e1 := Syscall(SYS_IOPL, uintptr(level), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, n int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pause() (err error) { + _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (off int64, err error) { + r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + off = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS__NEWSELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, buf *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(dirfd int, path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Time(t *Time_t) (tt Time_t, err error) { + r0, _, e1 := RawSyscall(SYS_TIME, uintptr(unsafe.Pointer(t)), 0, 0) + tt = Time_t(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Utime(path string, buf *Utimbuf) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe(p *[2]_C_int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func syncFileRange2(fd int, flags int, off int64, n int64) (err error) { + _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE2, uintptr(fd), uintptr(flags), uintptr(off), uintptr(n), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kexecFileLoad(kernelFd int, initrdFd int, cmdlineLen int, cmdline string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(cmdline) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_KEXEC_FILE_LOAD, uintptr(kernelFd), uintptr(initrdFd), uintptr(cmdlineLen), uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go new file mode 100644 index 00000000..870c8f6d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go @@ -0,0 +1,2360 @@ +// mksyscall.pl -tags linux,ppc64le syscall_linux.go syscall_linux_ppc64x.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build linux,ppc64le + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGetres(clockid int32, res *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETRES, uintptr(clockid), uintptr(unsafe.Pointer(res)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + SyscallNoError(SYS_EXIT_GROUP, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fgetxattr(fd int, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_FGETXATTR, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flistxattr(fd int, dest []byte) (sz int, err error) { + var _p0 unsafe.Pointer + if len(dest) > 0 { + _p0 = unsafe.Pointer(&dest[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_FLISTXATTR, uintptr(fd), uintptr(_p0), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fremovexattr(fd int, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FREMOVEXATTR, uintptr(fd), uintptr(unsafe.Pointer(_p0)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsetxattr(fd int, attr string, dest []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_FSETXATTR, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _ := RawSyscallNoError(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _ := RawSyscallNoError(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettid() (tid int) { + r0, _ := RawSyscallNoError(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func MemfdCreate(name string, flags int) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_MEMFD_CREATE, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_PERF_EVENT_OPEN, uintptr(unsafe.Pointer(attr)), uintptr(pid), uintptr(cpu), uintptr(groupFd), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat2(olddirfd int, oldpath string, newdirfd int, newpath string, flags uint) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT2, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_STATX, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mask), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() { + SyscallNoError(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _ := RawSyscallNoError(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, advice int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func faccessat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate(size int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall6(SYS_FADVISE64, uintptr(fd), uintptr(offset), uintptr(length), uintptr(advice), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_NEWFSTATAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, buf *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _ := RawSyscallNoError(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _ := RawSyscallNoError(SYS_GETEUID, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _ := RawSyscallNoError(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_UGETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _ := RawSyscallNoError(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit() (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ioperm(from int, num int, on int) (err error) { + _, _, e1 := Syscall(SYS_IOPERM, uintptr(from), uintptr(num), uintptr(on)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Iopl(level int) (err error) { + _, _, e1 := Syscall(SYS_IOPL, uintptr(level), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, n int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pause() (err error) { + _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (off int64, err error) { + r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + off = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS__NEWSELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, buf *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(dirfd int, path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Time(t *Time_t) (tt Time_t, err error) { + r0, _, e1 := RawSyscall(SYS_TIME, uintptr(unsafe.Pointer(t)), 0, 0) + tt = Time_t(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Utime(path string, buf *Utimbuf) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe(p *[2]_C_int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func syncFileRange2(fd int, flags int, off int64, n int64) (err error) { + _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE2, uintptr(fd), uintptr(flags), uintptr(off), uintptr(n), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kexecFileLoad(kernelFd int, initrdFd int, cmdlineLen int, cmdline string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(cmdline) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_KEXEC_FILE_LOAD, uintptr(kernelFd), uintptr(initrdFd), uintptr(cmdlineLen), uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go new file mode 100644 index 00000000..542f3a3a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go @@ -0,0 +1,2140 @@ +// mksyscall.pl -tags linux,riscv64 syscall_linux.go syscall_linux_riscv64.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build linux,riscv64 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGetres(clockid int32, res *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETRES, uintptr(clockid), uintptr(unsafe.Pointer(res)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + SyscallNoError(SYS_EXIT_GROUP, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fgetxattr(fd int, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_FGETXATTR, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flistxattr(fd int, dest []byte) (sz int, err error) { + var _p0 unsafe.Pointer + if len(dest) > 0 { + _p0 = unsafe.Pointer(&dest[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_FLISTXATTR, uintptr(fd), uintptr(_p0), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fremovexattr(fd int, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FREMOVEXATTR, uintptr(fd), uintptr(unsafe.Pointer(_p0)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsetxattr(fd int, attr string, dest []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_FSETXATTR, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _ := RawSyscallNoError(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _ := RawSyscallNoError(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettid() (tid int) { + r0, _ := RawSyscallNoError(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func MemfdCreate(name string, flags int) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_MEMFD_CREATE, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_PERF_EVENT_OPEN, uintptr(unsafe.Pointer(attr)), uintptr(pid), uintptr(cpu), uintptr(groupFd), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat2(olddirfd int, oldpath string, newdirfd int, newpath string, flags uint) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT2, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_STATX, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mask), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() { + SyscallNoError(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _ := RawSyscallNoError(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, advice int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func faccessat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_PWAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall6(SYS_FADVISE64, uintptr(fd), uintptr(offset), uintptr(length), uintptr(advice), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSTATAT, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, buf *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _ := RawSyscallNoError(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _ := RawSyscallNoError(SYS_GETEUID, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _ := RawSyscallNoError(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _ := RawSyscallNoError(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, n int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (off int64, err error) { + r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + off = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, buf *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { + _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE, uintptr(fd), uintptr(off), uintptr(n), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go new file mode 100644 index 00000000..55e79d64 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go @@ -0,0 +1,2130 @@ +// mksyscall.pl -tags linux,s390x syscall_linux.go syscall_linux_s390x.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build linux,s390x + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGetres(clockid int32, res *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETRES, uintptr(clockid), uintptr(unsafe.Pointer(res)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + SyscallNoError(SYS_EXIT_GROUP, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fgetxattr(fd int, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_FGETXATTR, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flistxattr(fd int, dest []byte) (sz int, err error) { + var _p0 unsafe.Pointer + if len(dest) > 0 { + _p0 = unsafe.Pointer(&dest[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_FLISTXATTR, uintptr(fd), uintptr(_p0), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fremovexattr(fd int, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FREMOVEXATTR, uintptr(fd), uintptr(unsafe.Pointer(_p0)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsetxattr(fd int, attr string, dest []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_FSETXATTR, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _ := RawSyscallNoError(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _ := RawSyscallNoError(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettid() (tid int) { + r0, _ := RawSyscallNoError(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func MemfdCreate(name string, flags int) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_MEMFD_CREATE, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_PERF_EVENT_OPEN, uintptr(unsafe.Pointer(attr)), uintptr(pid), uintptr(cpu), uintptr(groupFd), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat2(olddirfd int, oldpath string, newdirfd int, newpath string, flags uint) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT2, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_STATX, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mask), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() { + SyscallNoError(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _ := RawSyscallNoError(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, advice int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func faccessat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate(size int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall6(SYS_FADVISE64, uintptr(fd), uintptr(offset), uintptr(length), uintptr(advice), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_NEWFSTATAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, buf *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _ := RawSyscallNoError(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _ := RawSyscallNoError(SYS_GETEUID, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _ := RawSyscallNoError(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _ := RawSyscallNoError(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit() (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pause() (err error) { + _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (off int64, err error) { + r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + off = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, buf *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { + _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE, uintptr(fd), uintptr(off), uintptr(n), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(dirfd int, path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Utime(path string, buf *Utimbuf) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kexecFileLoad(kernelFd int, initrdFd int, cmdlineLen int, cmdline string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(cmdline) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_KEXEC_FILE_LOAD, uintptr(kernelFd), uintptr(initrdFd), uintptr(cmdlineLen), uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go new file mode 100644 index 00000000..b26aee95 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go @@ -0,0 +1,2172 @@ +// mksyscall.pl -tags linux,sparc64 syscall_linux.go syscall_linux_sparc64.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build linux,sparc64 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + SyscallNoError(SYS_EXIT_GROUP, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _ := RawSyscallNoError(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _ := RawSyscallNoError(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettid() (tid int) { + r0, _ := RawSyscallNoError(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_PERF_EVENT_OPEN, uintptr(unsafe.Pointer(attr)), uintptr(pid), uintptr(cpu), uintptr(groupFd), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_STATX, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mask), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() { + SyscallNoError(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _ := RawSyscallNoError(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, advice int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall6(SYS_FADVISE64, uintptr(fd), uintptr(offset), uintptr(length), uintptr(advice), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSTATAT64, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, buf *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _ := RawSyscallNoError(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _ := RawSyscallNoError(SYS_GETEUID, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _ := RawSyscallNoError(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _ := RawSyscallNoError(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit() (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, n int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pause() (err error) { + _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (off int64, err error) { + r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + off = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, buf *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { + _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE, uintptr(fd), uintptr(off), uintptr(n), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(dirfd int, path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Utime(path string, buf *Utimbuf) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe(p *[2]_C_int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go new file mode 100644 index 00000000..f1874d5a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go @@ -0,0 +1,1653 @@ +// mksyscall.pl -l32 -netbsd -tags netbsd,386 syscall_bsd.go syscall_netbsd.go syscall_netbsd_386.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build netbsd,386 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe() (fd1 int, fd2 int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + fd1 = int(r0) + fd2 = int(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS___GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteFd(fd int, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListFd(fd int, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FD, uintptr(fd), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteFile(file string, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListFile(file string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteLink(link string, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListLink(link string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall9(SYS_POSIX_FADVISE, uintptr(fd), 0, uintptr(offset), uintptr(offset>>32), 0, uintptr(length), uintptr(length>>32), uintptr(advice), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSTATAT, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall6(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(offset>>32), uintptr(whence), 0) + newoffset = int64(int64(r1)<<32 | int64(r0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), uintptr(pos>>32), 0) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go new file mode 100644 index 00000000..eb802839 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go @@ -0,0 +1,1653 @@ +// mksyscall.pl -netbsd -tags netbsd,amd64 syscall_bsd.go syscall_netbsd.go syscall_netbsd_amd64.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build netbsd,amd64 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe() (fd1 int, fd2 int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + fd1 = int(r0) + fd2 = int(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS___GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteFd(fd int, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListFd(fd int, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FD, uintptr(fd), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteFile(file string, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListFile(file string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteLink(link string, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListLink(link string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall6(SYS_POSIX_FADVISE, uintptr(fd), 0, uintptr(offset), 0, uintptr(length), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSTATAT, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, _, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(whence), 0, 0) + newoffset = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), 0, 0) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go new file mode 100644 index 00000000..7b36499d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go @@ -0,0 +1,1653 @@ +// mksyscall.pl -l32 -netbsd -arm -tags netbsd,arm syscall_bsd.go syscall_netbsd.go syscall_netbsd_arm.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build netbsd,arm + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe() (fd1 int, fd2 int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + fd1 = int(r0) + fd2 = int(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS___GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteFd(fd int, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListFd(fd int, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FD, uintptr(fd), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteFile(file string, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListFile(file string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteLink(link string, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListLink(link string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall9(SYS_POSIX_FADVISE, uintptr(fd), 0, uintptr(offset), uintptr(offset>>32), 0, uintptr(length), uintptr(length>>32), uintptr(advice), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSTATAT, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall6(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(offset>>32), uintptr(whence), 0) + newoffset = int64(int64(r1)<<32 | int64(r0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), uintptr(pos>>32), 0) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go new file mode 100644 index 00000000..7e6f4e13 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go @@ -0,0 +1,1519 @@ +// mksyscall.pl -l32 -openbsd -tags openbsd,386 syscall_bsd.go syscall_openbsd.go syscall_openbsd_386.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build openbsd,386 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe(p *[2]_C_int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS___GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSTATAT, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, stat *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall6(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrtable() (rtable int, err error) { + r0, _, e1 := RawSyscall(SYS_GETRTABLE, 0, 0, 0) + rtable = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(offset>>32), uintptr(whence), 0) + newoffset = int64(int64(r1)<<32 | int64(r0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setlogin(name string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrtable(rtable int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRTABLE, uintptr(rtable), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, stat *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), uintptr(pos>>32), 0) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go new file mode 100644 index 00000000..1132b897 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go @@ -0,0 +1,1519 @@ +// mksyscall.pl -openbsd -tags openbsd,amd64 syscall_bsd.go syscall_openbsd.go syscall_openbsd_amd64.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build openbsd,amd64 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe(p *[2]_C_int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS___GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSTATAT, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, stat *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrtable() (rtable int, err error) { + r0, _, e1 := RawSyscall(SYS_GETRTABLE, 0, 0, 0) + rtable = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, _, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(whence), 0, 0) + newoffset = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setlogin(name string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrtable(rtable int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRTABLE, uintptr(rtable), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, stat *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), 0, 0) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go new file mode 100644 index 00000000..0f7b4afb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go @@ -0,0 +1,1519 @@ +// mksyscall.pl -l32 -openbsd -arm -tags openbsd,arm syscall_bsd.go syscall_openbsd.go syscall_openbsd_arm.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build openbsd,arm + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe(p *[2]_C_int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS___GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSTATAT, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, stat *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall6(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrtable() (rtable int, err error) { + r0, _, e1 := RawSyscall(SYS_GETRTABLE, 0, 0, 0) + rtable = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(offset>>32), uintptr(whence), 0) + newoffset = int64(int64(r1)<<32 | int64(r0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setlogin(name string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrtable(rtable int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRTABLE, uintptr(rtable), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, stat *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), uintptr(pos>>32), 0) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go new file mode 100644 index 00000000..97b22a49 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go @@ -0,0 +1,1953 @@ +// mksyscall_solaris.pl -tags solaris,amd64 syscall_solaris.go syscall_solaris_amd64.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build solaris,amd64 + +package unix + +import ( + "syscall" + "unsafe" +) + +//go:cgo_import_dynamic libc_pipe pipe "libc.so" +//go:cgo_import_dynamic libc_getsockname getsockname "libsocket.so" +//go:cgo_import_dynamic libc_getcwd getcwd "libc.so" +//go:cgo_import_dynamic libc_getgroups getgroups "libc.so" +//go:cgo_import_dynamic libc_setgroups setgroups "libc.so" +//go:cgo_import_dynamic libc_wait4 wait4 "libc.so" +//go:cgo_import_dynamic libc_gethostname gethostname "libc.so" +//go:cgo_import_dynamic libc_utimes utimes "libc.so" +//go:cgo_import_dynamic libc_utimensat utimensat "libc.so" +//go:cgo_import_dynamic libc_fcntl fcntl "libc.so" +//go:cgo_import_dynamic libc_futimesat futimesat "libc.so" +//go:cgo_import_dynamic libc_accept accept "libsocket.so" +//go:cgo_import_dynamic libc___xnet_recvmsg __xnet_recvmsg "libsocket.so" +//go:cgo_import_dynamic libc___xnet_sendmsg __xnet_sendmsg "libsocket.so" +//go:cgo_import_dynamic libc_acct acct "libc.so" +//go:cgo_import_dynamic libc___makedev __makedev "libc.so" +//go:cgo_import_dynamic libc___major __major "libc.so" +//go:cgo_import_dynamic libc___minor __minor "libc.so" +//go:cgo_import_dynamic libc_ioctl ioctl "libc.so" +//go:cgo_import_dynamic libc_poll poll "libc.so" +//go:cgo_import_dynamic libc_access access "libc.so" +//go:cgo_import_dynamic libc_adjtime adjtime "libc.so" +//go:cgo_import_dynamic libc_chdir chdir "libc.so" +//go:cgo_import_dynamic libc_chmod chmod "libc.so" +//go:cgo_import_dynamic libc_chown chown "libc.so" +//go:cgo_import_dynamic libc_chroot chroot "libc.so" +//go:cgo_import_dynamic libc_close close "libc.so" +//go:cgo_import_dynamic libc_creat creat "libc.so" +//go:cgo_import_dynamic libc_dup dup "libc.so" +//go:cgo_import_dynamic libc_dup2 dup2 "libc.so" +//go:cgo_import_dynamic libc_exit exit "libc.so" +//go:cgo_import_dynamic libc_faccessat faccessat "libc.so" +//go:cgo_import_dynamic libc_fchdir fchdir "libc.so" +//go:cgo_import_dynamic libc_fchmod fchmod "libc.so" +//go:cgo_import_dynamic libc_fchmodat fchmodat "libc.so" +//go:cgo_import_dynamic libc_fchown fchown "libc.so" +//go:cgo_import_dynamic libc_fchownat fchownat "libc.so" +//go:cgo_import_dynamic libc_fdatasync fdatasync "libc.so" +//go:cgo_import_dynamic libc_flock flock "libc.so" +//go:cgo_import_dynamic libc_fpathconf fpathconf "libc.so" +//go:cgo_import_dynamic libc_fstat fstat "libc.so" +//go:cgo_import_dynamic libc_fstatat fstatat "libc.so" +//go:cgo_import_dynamic libc_fstatvfs fstatvfs "libc.so" +//go:cgo_import_dynamic libc_getdents getdents "libc.so" +//go:cgo_import_dynamic libc_getgid getgid "libc.so" +//go:cgo_import_dynamic libc_getpid getpid "libc.so" +//go:cgo_import_dynamic libc_getpgid getpgid "libc.so" +//go:cgo_import_dynamic libc_getpgrp getpgrp "libc.so" +//go:cgo_import_dynamic libc_geteuid geteuid "libc.so" +//go:cgo_import_dynamic libc_getegid getegid "libc.so" +//go:cgo_import_dynamic libc_getppid getppid "libc.so" +//go:cgo_import_dynamic libc_getpriority getpriority "libc.so" +//go:cgo_import_dynamic libc_getrlimit getrlimit "libc.so" +//go:cgo_import_dynamic libc_getrusage getrusage "libc.so" +//go:cgo_import_dynamic libc_gettimeofday gettimeofday "libc.so" +//go:cgo_import_dynamic libc_getuid getuid "libc.so" +//go:cgo_import_dynamic libc_kill kill "libc.so" +//go:cgo_import_dynamic libc_lchown lchown "libc.so" +//go:cgo_import_dynamic libc_link link "libc.so" +//go:cgo_import_dynamic libc___xnet_llisten __xnet_llisten "libsocket.so" +//go:cgo_import_dynamic libc_lstat lstat "libc.so" +//go:cgo_import_dynamic libc_madvise madvise "libc.so" +//go:cgo_import_dynamic libc_mkdir mkdir "libc.so" +//go:cgo_import_dynamic libc_mkdirat mkdirat "libc.so" +//go:cgo_import_dynamic libc_mkfifo mkfifo "libc.so" +//go:cgo_import_dynamic libc_mkfifoat mkfifoat "libc.so" +//go:cgo_import_dynamic libc_mknod mknod "libc.so" +//go:cgo_import_dynamic libc_mknodat mknodat "libc.so" +//go:cgo_import_dynamic libc_mlock mlock "libc.so" +//go:cgo_import_dynamic libc_mlockall mlockall "libc.so" +//go:cgo_import_dynamic libc_mprotect mprotect "libc.so" +//go:cgo_import_dynamic libc_msync msync "libc.so" +//go:cgo_import_dynamic libc_munlock munlock "libc.so" +//go:cgo_import_dynamic libc_munlockall munlockall "libc.so" +//go:cgo_import_dynamic libc_nanosleep nanosleep "libc.so" +//go:cgo_import_dynamic libc_open open "libc.so" +//go:cgo_import_dynamic libc_openat openat "libc.so" +//go:cgo_import_dynamic libc_pathconf pathconf "libc.so" +//go:cgo_import_dynamic libc_pause pause "libc.so" +//go:cgo_import_dynamic libc_pread pread "libc.so" +//go:cgo_import_dynamic libc_pwrite pwrite "libc.so" +//go:cgo_import_dynamic libc_read read "libc.so" +//go:cgo_import_dynamic libc_readlink readlink "libc.so" +//go:cgo_import_dynamic libc_rename rename "libc.so" +//go:cgo_import_dynamic libc_renameat renameat "libc.so" +//go:cgo_import_dynamic libc_rmdir rmdir "libc.so" +//go:cgo_import_dynamic libc_lseek lseek "libc.so" +//go:cgo_import_dynamic libc_select select "libc.so" +//go:cgo_import_dynamic libc_setegid setegid "libc.so" +//go:cgo_import_dynamic libc_seteuid seteuid "libc.so" +//go:cgo_import_dynamic libc_setgid setgid "libc.so" +//go:cgo_import_dynamic libc_sethostname sethostname "libc.so" +//go:cgo_import_dynamic libc_setpgid setpgid "libc.so" +//go:cgo_import_dynamic libc_setpriority setpriority "libc.so" +//go:cgo_import_dynamic libc_setregid setregid "libc.so" +//go:cgo_import_dynamic libc_setreuid setreuid "libc.so" +//go:cgo_import_dynamic libc_setrlimit setrlimit "libc.so" +//go:cgo_import_dynamic libc_setsid setsid "libc.so" +//go:cgo_import_dynamic libc_setuid setuid "libc.so" +//go:cgo_import_dynamic libc_shutdown shutdown "libsocket.so" +//go:cgo_import_dynamic libc_stat stat "libc.so" +//go:cgo_import_dynamic libc_statvfs statvfs "libc.so" +//go:cgo_import_dynamic libc_symlink symlink "libc.so" +//go:cgo_import_dynamic libc_sync sync "libc.so" +//go:cgo_import_dynamic libc_times times "libc.so" +//go:cgo_import_dynamic libc_truncate truncate "libc.so" +//go:cgo_import_dynamic libc_fsync fsync "libc.so" +//go:cgo_import_dynamic libc_ftruncate ftruncate "libc.so" +//go:cgo_import_dynamic libc_umask umask "libc.so" +//go:cgo_import_dynamic libc_uname uname "libc.so" +//go:cgo_import_dynamic libc_umount umount "libc.so" +//go:cgo_import_dynamic libc_unlink unlink "libc.so" +//go:cgo_import_dynamic libc_unlinkat unlinkat "libc.so" +//go:cgo_import_dynamic libc_ustat ustat "libc.so" +//go:cgo_import_dynamic libc_utime utime "libc.so" +//go:cgo_import_dynamic libc___xnet_bind __xnet_bind "libsocket.so" +//go:cgo_import_dynamic libc___xnet_connect __xnet_connect "libsocket.so" +//go:cgo_import_dynamic libc_mmap mmap "libc.so" +//go:cgo_import_dynamic libc_munmap munmap "libc.so" +//go:cgo_import_dynamic libc_sendfile sendfile "libsendfile.so" +//go:cgo_import_dynamic libc___xnet_sendto __xnet_sendto "libsocket.so" +//go:cgo_import_dynamic libc___xnet_socket __xnet_socket "libsocket.so" +//go:cgo_import_dynamic libc___xnet_socketpair __xnet_socketpair "libsocket.so" +//go:cgo_import_dynamic libc_write write "libc.so" +//go:cgo_import_dynamic libc___xnet_getsockopt __xnet_getsockopt "libsocket.so" +//go:cgo_import_dynamic libc_getpeername getpeername "libsocket.so" +//go:cgo_import_dynamic libc_setsockopt setsockopt "libsocket.so" +//go:cgo_import_dynamic libc_recvfrom recvfrom "libsocket.so" + +//go:linkname procpipe libc_pipe +//go:linkname procgetsockname libc_getsockname +//go:linkname procGetcwd libc_getcwd +//go:linkname procgetgroups libc_getgroups +//go:linkname procsetgroups libc_setgroups +//go:linkname procwait4 libc_wait4 +//go:linkname procgethostname libc_gethostname +//go:linkname procutimes libc_utimes +//go:linkname procutimensat libc_utimensat +//go:linkname procfcntl libc_fcntl +//go:linkname procfutimesat libc_futimesat +//go:linkname procaccept libc_accept +//go:linkname proc__xnet_recvmsg libc___xnet_recvmsg +//go:linkname proc__xnet_sendmsg libc___xnet_sendmsg +//go:linkname procacct libc_acct +//go:linkname proc__makedev libc___makedev +//go:linkname proc__major libc___major +//go:linkname proc__minor libc___minor +//go:linkname procioctl libc_ioctl +//go:linkname procpoll libc_poll +//go:linkname procAccess libc_access +//go:linkname procAdjtime libc_adjtime +//go:linkname procChdir libc_chdir +//go:linkname procChmod libc_chmod +//go:linkname procChown libc_chown +//go:linkname procChroot libc_chroot +//go:linkname procClose libc_close +//go:linkname procCreat libc_creat +//go:linkname procDup libc_dup +//go:linkname procDup2 libc_dup2 +//go:linkname procExit libc_exit +//go:linkname procFaccessat libc_faccessat +//go:linkname procFchdir libc_fchdir +//go:linkname procFchmod libc_fchmod +//go:linkname procFchmodat libc_fchmodat +//go:linkname procFchown libc_fchown +//go:linkname procFchownat libc_fchownat +//go:linkname procFdatasync libc_fdatasync +//go:linkname procFlock libc_flock +//go:linkname procFpathconf libc_fpathconf +//go:linkname procFstat libc_fstat +//go:linkname procFstatat libc_fstatat +//go:linkname procFstatvfs libc_fstatvfs +//go:linkname procGetdents libc_getdents +//go:linkname procGetgid libc_getgid +//go:linkname procGetpid libc_getpid +//go:linkname procGetpgid libc_getpgid +//go:linkname procGetpgrp libc_getpgrp +//go:linkname procGeteuid libc_geteuid +//go:linkname procGetegid libc_getegid +//go:linkname procGetppid libc_getppid +//go:linkname procGetpriority libc_getpriority +//go:linkname procGetrlimit libc_getrlimit +//go:linkname procGetrusage libc_getrusage +//go:linkname procGettimeofday libc_gettimeofday +//go:linkname procGetuid libc_getuid +//go:linkname procKill libc_kill +//go:linkname procLchown libc_lchown +//go:linkname procLink libc_link +//go:linkname proc__xnet_llisten libc___xnet_llisten +//go:linkname procLstat libc_lstat +//go:linkname procMadvise libc_madvise +//go:linkname procMkdir libc_mkdir +//go:linkname procMkdirat libc_mkdirat +//go:linkname procMkfifo libc_mkfifo +//go:linkname procMkfifoat libc_mkfifoat +//go:linkname procMknod libc_mknod +//go:linkname procMknodat libc_mknodat +//go:linkname procMlock libc_mlock +//go:linkname procMlockall libc_mlockall +//go:linkname procMprotect libc_mprotect +//go:linkname procMsync libc_msync +//go:linkname procMunlock libc_munlock +//go:linkname procMunlockall libc_munlockall +//go:linkname procNanosleep libc_nanosleep +//go:linkname procOpen libc_open +//go:linkname procOpenat libc_openat +//go:linkname procPathconf libc_pathconf +//go:linkname procPause libc_pause +//go:linkname procPread libc_pread +//go:linkname procPwrite libc_pwrite +//go:linkname procread libc_read +//go:linkname procReadlink libc_readlink +//go:linkname procRename libc_rename +//go:linkname procRenameat libc_renameat +//go:linkname procRmdir libc_rmdir +//go:linkname proclseek libc_lseek +//go:linkname procSelect libc_select +//go:linkname procSetegid libc_setegid +//go:linkname procSeteuid libc_seteuid +//go:linkname procSetgid libc_setgid +//go:linkname procSethostname libc_sethostname +//go:linkname procSetpgid libc_setpgid +//go:linkname procSetpriority libc_setpriority +//go:linkname procSetregid libc_setregid +//go:linkname procSetreuid libc_setreuid +//go:linkname procSetrlimit libc_setrlimit +//go:linkname procSetsid libc_setsid +//go:linkname procSetuid libc_setuid +//go:linkname procshutdown libc_shutdown +//go:linkname procStat libc_stat +//go:linkname procStatvfs libc_statvfs +//go:linkname procSymlink libc_symlink +//go:linkname procSync libc_sync +//go:linkname procTimes libc_times +//go:linkname procTruncate libc_truncate +//go:linkname procFsync libc_fsync +//go:linkname procFtruncate libc_ftruncate +//go:linkname procUmask libc_umask +//go:linkname procUname libc_uname +//go:linkname procumount libc_umount +//go:linkname procUnlink libc_unlink +//go:linkname procUnlinkat libc_unlinkat +//go:linkname procUstat libc_ustat +//go:linkname procUtime libc_utime +//go:linkname proc__xnet_bind libc___xnet_bind +//go:linkname proc__xnet_connect libc___xnet_connect +//go:linkname procmmap libc_mmap +//go:linkname procmunmap libc_munmap +//go:linkname procsendfile libc_sendfile +//go:linkname proc__xnet_sendto libc___xnet_sendto +//go:linkname proc__xnet_socket libc___xnet_socket +//go:linkname proc__xnet_socketpair libc___xnet_socketpair +//go:linkname procwrite libc_write +//go:linkname proc__xnet_getsockopt libc___xnet_getsockopt +//go:linkname procgetpeername libc_getpeername +//go:linkname procsetsockopt libc_setsockopt +//go:linkname procrecvfrom libc_recvfrom + +var ( + procpipe, + procgetsockname, + procGetcwd, + procgetgroups, + procsetgroups, + procwait4, + procgethostname, + procutimes, + procutimensat, + procfcntl, + procfutimesat, + procaccept, + proc__xnet_recvmsg, + proc__xnet_sendmsg, + procacct, + proc__makedev, + proc__major, + proc__minor, + procioctl, + procpoll, + procAccess, + procAdjtime, + procChdir, + procChmod, + procChown, + procChroot, + procClose, + procCreat, + procDup, + procDup2, + procExit, + procFaccessat, + procFchdir, + procFchmod, + procFchmodat, + procFchown, + procFchownat, + procFdatasync, + procFlock, + procFpathconf, + procFstat, + procFstatat, + procFstatvfs, + procGetdents, + procGetgid, + procGetpid, + procGetpgid, + procGetpgrp, + procGeteuid, + procGetegid, + procGetppid, + procGetpriority, + procGetrlimit, + procGetrusage, + procGettimeofday, + procGetuid, + procKill, + procLchown, + procLink, + proc__xnet_llisten, + procLstat, + procMadvise, + procMkdir, + procMkdirat, + procMkfifo, + procMkfifoat, + procMknod, + procMknodat, + procMlock, + procMlockall, + procMprotect, + procMsync, + procMunlock, + procMunlockall, + procNanosleep, + procOpen, + procOpenat, + procPathconf, + procPause, + procPread, + procPwrite, + procread, + procReadlink, + procRename, + procRenameat, + procRmdir, + proclseek, + procSelect, + procSetegid, + procSeteuid, + procSetgid, + procSethostname, + procSetpgid, + procSetpriority, + procSetregid, + procSetreuid, + procSetrlimit, + procSetsid, + procSetuid, + procshutdown, + procStat, + procStatvfs, + procSymlink, + procSync, + procTimes, + procTruncate, + procFsync, + procFtruncate, + procUmask, + procUname, + procumount, + procUnlink, + procUnlinkat, + procUstat, + procUtime, + proc__xnet_bind, + proc__xnet_connect, + procmmap, + procmunmap, + procsendfile, + proc__xnet_sendto, + proc__xnet_socket, + proc__xnet_socketpair, + procwrite, + proc__xnet_getsockopt, + procgetpeername, + procsetsockopt, + procrecvfrom syscallFunc +) + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe(p *[2]_C_int) (n int, err error) { + r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procpipe)), 1, uintptr(unsafe.Pointer(p)), 0, 0, 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procgetsockname)), 3, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 *byte + if len(buf) > 0 { + _p0 = &buf[0] + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procGetcwd)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), 0, 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procgetgroups)), 2, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0, 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procsetgroups)), 2, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int32, statusp *_C_int, options int, rusage *Rusage) (wpid int32, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procwait4)), 4, uintptr(pid), uintptr(unsafe.Pointer(statusp)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int32(r0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func gethostname(buf []byte) (n int, err error) { + var _p0 *byte + if len(buf) > 0 { + _p0 = &buf[0] + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procgethostname)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), 0, 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procutimes)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(fd int, path string, times *[2]Timespec, flag int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procutimensat)), 4, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flag), 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procfcntl)), 3, uintptr(fd), uintptr(cmd), uintptr(arg), 0, 0, 0) + val = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(fildes int, path *byte, times *[2]Timeval) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procfutimesat)), 3, uintptr(fildes), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times)), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procaccept)), 3, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_recvmsg)), 3, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_sendmsg)), 3, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func acct(path *byte) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procacct)), 1, uintptr(unsafe.Pointer(path)), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func __makedev(version int, major uint, minor uint) (val uint64) { + r0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&proc__makedev)), 3, uintptr(version), uintptr(major), uintptr(minor), 0, 0, 0) + val = uint64(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func __major(version int, dev uint64) (val uint) { + r0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&proc__major)), 2, uintptr(version), uintptr(dev), 0, 0, 0, 0) + val = uint(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func __minor(version int, dev uint64) (val uint) { + r0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&proc__minor)), 2, uintptr(version), uintptr(dev), 0, 0, 0, 0) + val = uint(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procioctl)), 3, uintptr(fd), uintptr(req), uintptr(arg), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procpoll)), 3, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout), 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procAccess)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procAdjtime)), 2, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procChdir)), 1, uintptr(unsafe.Pointer(_p0)), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procChmod)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procChown)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procChroot)), 1, uintptr(unsafe.Pointer(_p0)), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procClose)), 1, uintptr(fd), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Creat(path string, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procCreat)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procDup)), 1, uintptr(fd), 0, 0, 0, 0, 0) + nfd = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procDup2)), 2, uintptr(oldfd), uintptr(newfd), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + sysvicall6(uintptr(unsafe.Pointer(&procExit)), 1, uintptr(code), 0, 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFaccessat)), 4, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFchdir)), 1, uintptr(fd), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFchmod)), 2, uintptr(fd), uintptr(mode), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFchmodat)), 4, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFchown)), 3, uintptr(fd), uintptr(uid), uintptr(gid), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFchownat)), 5, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fdatasync(fd int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFdatasync)), 1, uintptr(fd), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFlock)), 2, uintptr(fd), uintptr(how), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFpathconf)), 2, uintptr(fd), uintptr(name), 0, 0, 0, 0) + val = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFstat)), 2, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFstatat)), 4, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatvfs(fd int, vfsstat *Statvfs_t) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFstatvfs)), 2, uintptr(fd), uintptr(unsafe.Pointer(vfsstat)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdents(fd int, buf []byte, basep *uintptr) (n int, err error) { + var _p0 *byte + if len(buf) > 0 { + _p0 = &buf[0] + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procGetdents)), 4, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := rawSysvicall6(uintptr(unsafe.Pointer(&procGetgid)), 0, 0, 0, 0, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := rawSysvicall6(uintptr(unsafe.Pointer(&procGetpid)), 0, 0, 0, 0, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGetpgid)), 1, uintptr(pid), 0, 0, 0, 0, 0) + pgid = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgid int, err error) { + r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGetpgrp)), 0, 0, 0, 0, 0, 0, 0) + pgid = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&procGeteuid)), 0, 0, 0, 0, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&procGetegid)), 0, 0, 0, 0, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&procGetppid)), 0, 0, 0, 0, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (n int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procGetpriority)), 2, uintptr(which), uintptr(who), 0, 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGetrlimit)), 2, uintptr(which), uintptr(unsafe.Pointer(lim)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGetrusage)), 2, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGettimeofday)), 1, uintptr(unsafe.Pointer(tv)), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := rawSysvicall6(uintptr(unsafe.Pointer(&procGetuid)), 0, 0, 0, 0, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procKill)), 2, uintptr(pid), uintptr(signum), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procLchown)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procLink)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_llisten)), 2, uintptr(s), uintptr(backlog), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procLstat)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, advice int) (err error) { + var _p0 *byte + if len(b) > 0 { + _p0 = &b[0] + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMadvise)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), uintptr(advice), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMkdir)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMkdirat)), 3, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMkfifo)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifoat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMkfifoat)), 3, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMknod)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMknodat)), 4, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 *byte + if len(b) > 0 { + _p0 = &b[0] + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMlock)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMlockall)), 1, uintptr(flags), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 *byte + if len(b) > 0 { + _p0 = &b[0] + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMprotect)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), uintptr(prot), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 *byte + if len(b) > 0 { + _p0 = &b[0] + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMsync)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), uintptr(flags), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 *byte + if len(b) > 0 { + _p0 = &b[0] + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMunlock)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMunlockall)), 0, 0, 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procNanosleep)), 2, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procOpen)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procOpenat)), 4, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) + fd = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procPathconf)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0, 0, 0, 0) + val = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pause() (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procPause)), 0, 0, 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 *byte + if len(p) > 0 { + _p0 = &p[0] + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procPread)), 4, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 *byte + if len(p) > 0 { + _p0 = &p[0] + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procPwrite)), 4, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 *byte + if len(p) > 0 { + _p0 = &p[0] + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procread)), 3, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + if len(buf) > 0 { + _p1 = &buf[0] + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procReadlink)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(len(buf)), 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procRename)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procRenameat)), 4, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procRmdir)), 1, uintptr(unsafe.Pointer(_p0)), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proclseek)), 3, uintptr(fd), uintptr(offset), uintptr(whence), 0, 0, 0) + newoffset = int64(r0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procSelect)), 5, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetegid)), 1, uintptr(egid), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSeteuid)), 1, uintptr(euid), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetgid)), 1, uintptr(gid), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 *byte + if len(p) > 0 { + _p0 = &p[0] + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procSethostname)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetpgid)), 2, uintptr(pid), uintptr(pgid), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procSetpriority)), 3, uintptr(which), uintptr(who), uintptr(prio), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetregid)), 2, uintptr(rgid), uintptr(egid), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetreuid)), 2, uintptr(ruid), uintptr(euid), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetrlimit)), 2, uintptr(which), uintptr(unsafe.Pointer(lim)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetsid)), 0, 0, 0, 0, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetuid)), 1, uintptr(uid), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procshutdown)), 2, uintptr(s), uintptr(how), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procStat)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statvfs(path string, vfsstat *Statvfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procStatvfs)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(vfsstat)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procSymlink)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procSync)), 0, 0, 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procTimes)), 1, uintptr(unsafe.Pointer(tms)), 0, 0, 0, 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procTruncate)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFsync)), 1, uintptr(fd), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFtruncate)), 2, uintptr(fd), uintptr(length), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&procUmask)), 1, uintptr(mask), 0, 0, 0, 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procUname)), 1, uintptr(unsafe.Pointer(buf)), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procumount)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procUnlink)), 1, uintptr(unsafe.Pointer(_p0)), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procUnlinkat)), 3, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procUstat)), 2, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Utime(path string, buf *Utimbuf) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procUtime)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_bind)), 3, uintptr(s), uintptr(addr), uintptr(addrlen), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_connect)), 3, uintptr(s), uintptr(addr), uintptr(addrlen), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procmmap)), 6, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos)) + ret = uintptr(r0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procmunmap)), 2, uintptr(addr), uintptr(length), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procsendfile)), 4, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 *byte + if len(buf) > 0 { + _p0 = &buf[0] + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_sendto)), 6, uintptr(s), uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_socket)), 3, uintptr(domain), uintptr(typ), uintptr(proto), 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&proc__xnet_socketpair)), 4, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 *byte + if len(p) > 0 { + _p0 = &p[0] + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procwrite)), 3, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_getsockopt)), 5, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procgetpeername)), 3, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procsetsockopt)), 5, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 *byte + if len(p) > 0 { + _p0 = &p[0] + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procrecvfrom)), 6, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysctl_openbsd_386.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysctl_openbsd_386.go new file mode 100644 index 00000000..b005031a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysctl_openbsd_386.go @@ -0,0 +1,270 @@ +// mksysctl_openbsd.pl +// Code generated by the command above; DO NOT EDIT. + +package unix + +type mibentry struct { + ctlname string + ctloid []_C_int +} + +var sysctlMib = []mibentry{ + {"ddb.console", []_C_int{9, 6}}, + {"ddb.log", []_C_int{9, 7}}, + {"ddb.max_line", []_C_int{9, 3}}, + {"ddb.max_width", []_C_int{9, 2}}, + {"ddb.panic", []_C_int{9, 5}}, + {"ddb.radix", []_C_int{9, 1}}, + {"ddb.tab_stop_width", []_C_int{9, 4}}, + {"ddb.trigger", []_C_int{9, 8}}, + {"fs.posix.setuid", []_C_int{3, 1, 1}}, + {"hw.allowpowerdown", []_C_int{6, 22}}, + {"hw.byteorder", []_C_int{6, 4}}, + {"hw.cpuspeed", []_C_int{6, 12}}, + {"hw.diskcount", []_C_int{6, 10}}, + {"hw.disknames", []_C_int{6, 8}}, + {"hw.diskstats", []_C_int{6, 9}}, + {"hw.machine", []_C_int{6, 1}}, + {"hw.model", []_C_int{6, 2}}, + {"hw.ncpu", []_C_int{6, 3}}, + {"hw.ncpufound", []_C_int{6, 21}}, + {"hw.pagesize", []_C_int{6, 7}}, + {"hw.physmem", []_C_int{6, 19}}, + {"hw.product", []_C_int{6, 15}}, + {"hw.serialno", []_C_int{6, 17}}, + {"hw.setperf", []_C_int{6, 13}}, + {"hw.usermem", []_C_int{6, 20}}, + {"hw.uuid", []_C_int{6, 18}}, + {"hw.vendor", []_C_int{6, 14}}, + {"hw.version", []_C_int{6, 16}}, + {"kern.arandom", []_C_int{1, 37}}, + {"kern.argmax", []_C_int{1, 8}}, + {"kern.boottime", []_C_int{1, 21}}, + {"kern.bufcachepercent", []_C_int{1, 72}}, + {"kern.ccpu", []_C_int{1, 45}}, + {"kern.clockrate", []_C_int{1, 12}}, + {"kern.consdev", []_C_int{1, 75}}, + {"kern.cp_time", []_C_int{1, 40}}, + {"kern.cp_time2", []_C_int{1, 71}}, + {"kern.cryptodevallowsoft", []_C_int{1, 53}}, + {"kern.domainname", []_C_int{1, 22}}, + {"kern.file", []_C_int{1, 73}}, + {"kern.forkstat", []_C_int{1, 42}}, + {"kern.fscale", []_C_int{1, 46}}, + {"kern.fsync", []_C_int{1, 33}}, + {"kern.hostid", []_C_int{1, 11}}, + {"kern.hostname", []_C_int{1, 10}}, + {"kern.intrcnt.nintrcnt", []_C_int{1, 63, 1}}, + {"kern.job_control", []_C_int{1, 19}}, + {"kern.malloc.buckets", []_C_int{1, 39, 1}}, + {"kern.malloc.kmemnames", []_C_int{1, 39, 3}}, + {"kern.maxclusters", []_C_int{1, 67}}, + {"kern.maxfiles", []_C_int{1, 7}}, + {"kern.maxlocksperuid", []_C_int{1, 70}}, + {"kern.maxpartitions", []_C_int{1, 23}}, + {"kern.maxproc", []_C_int{1, 6}}, + {"kern.maxthread", []_C_int{1, 25}}, + {"kern.maxvnodes", []_C_int{1, 5}}, + {"kern.mbstat", []_C_int{1, 59}}, + {"kern.msgbuf", []_C_int{1, 48}}, + {"kern.msgbufsize", []_C_int{1, 38}}, + {"kern.nchstats", []_C_int{1, 41}}, + {"kern.netlivelocks", []_C_int{1, 76}}, + {"kern.nfiles", []_C_int{1, 56}}, + {"kern.ngroups", []_C_int{1, 18}}, + {"kern.nosuidcoredump", []_C_int{1, 32}}, + {"kern.nprocs", []_C_int{1, 47}}, + {"kern.nselcoll", []_C_int{1, 43}}, + {"kern.nthreads", []_C_int{1, 26}}, + {"kern.numvnodes", []_C_int{1, 58}}, + {"kern.osrelease", []_C_int{1, 2}}, + {"kern.osrevision", []_C_int{1, 3}}, + {"kern.ostype", []_C_int{1, 1}}, + {"kern.osversion", []_C_int{1, 27}}, + {"kern.pool_debug", []_C_int{1, 77}}, + {"kern.posix1version", []_C_int{1, 17}}, + {"kern.proc", []_C_int{1, 66}}, + {"kern.random", []_C_int{1, 31}}, + {"kern.rawpartition", []_C_int{1, 24}}, + {"kern.saved_ids", []_C_int{1, 20}}, + {"kern.securelevel", []_C_int{1, 9}}, + {"kern.seminfo", []_C_int{1, 61}}, + {"kern.shminfo", []_C_int{1, 62}}, + {"kern.somaxconn", []_C_int{1, 28}}, + {"kern.sominconn", []_C_int{1, 29}}, + {"kern.splassert", []_C_int{1, 54}}, + {"kern.stackgap_random", []_C_int{1, 50}}, + {"kern.sysvipc_info", []_C_int{1, 51}}, + {"kern.sysvmsg", []_C_int{1, 34}}, + {"kern.sysvsem", []_C_int{1, 35}}, + {"kern.sysvshm", []_C_int{1, 36}}, + {"kern.timecounter.choice", []_C_int{1, 69, 4}}, + {"kern.timecounter.hardware", []_C_int{1, 69, 3}}, + {"kern.timecounter.tick", []_C_int{1, 69, 1}}, + {"kern.timecounter.timestepwarnings", []_C_int{1, 69, 2}}, + {"kern.tty.maxptys", []_C_int{1, 44, 6}}, + {"kern.tty.nptys", []_C_int{1, 44, 7}}, + {"kern.tty.tk_cancc", []_C_int{1, 44, 4}}, + {"kern.tty.tk_nin", []_C_int{1, 44, 1}}, + {"kern.tty.tk_nout", []_C_int{1, 44, 2}}, + {"kern.tty.tk_rawcc", []_C_int{1, 44, 3}}, + {"kern.tty.ttyinfo", []_C_int{1, 44, 5}}, + {"kern.ttycount", []_C_int{1, 57}}, + {"kern.userasymcrypto", []_C_int{1, 60}}, + {"kern.usercrypto", []_C_int{1, 52}}, + {"kern.usermount", []_C_int{1, 30}}, + {"kern.version", []_C_int{1, 4}}, + {"kern.vnode", []_C_int{1, 13}}, + {"kern.watchdog.auto", []_C_int{1, 64, 2}}, + {"kern.watchdog.period", []_C_int{1, 64, 1}}, + {"net.bpf.bufsize", []_C_int{4, 31, 1}}, + {"net.bpf.maxbufsize", []_C_int{4, 31, 2}}, + {"net.inet.ah.enable", []_C_int{4, 2, 51, 1}}, + {"net.inet.ah.stats", []_C_int{4, 2, 51, 2}}, + {"net.inet.carp.allow", []_C_int{4, 2, 112, 1}}, + {"net.inet.carp.log", []_C_int{4, 2, 112, 3}}, + {"net.inet.carp.preempt", []_C_int{4, 2, 112, 2}}, + {"net.inet.carp.stats", []_C_int{4, 2, 112, 4}}, + {"net.inet.divert.recvspace", []_C_int{4, 2, 258, 1}}, + {"net.inet.divert.sendspace", []_C_int{4, 2, 258, 2}}, + {"net.inet.divert.stats", []_C_int{4, 2, 258, 3}}, + {"net.inet.esp.enable", []_C_int{4, 2, 50, 1}}, + {"net.inet.esp.stats", []_C_int{4, 2, 50, 4}}, + {"net.inet.esp.udpencap", []_C_int{4, 2, 50, 2}}, + {"net.inet.esp.udpencap_port", []_C_int{4, 2, 50, 3}}, + {"net.inet.etherip.allow", []_C_int{4, 2, 97, 1}}, + {"net.inet.etherip.stats", []_C_int{4, 2, 97, 2}}, + {"net.inet.gre.allow", []_C_int{4, 2, 47, 1}}, + {"net.inet.gre.wccp", []_C_int{4, 2, 47, 2}}, + {"net.inet.icmp.bmcastecho", []_C_int{4, 2, 1, 2}}, + {"net.inet.icmp.errppslimit", []_C_int{4, 2, 1, 3}}, + {"net.inet.icmp.maskrepl", []_C_int{4, 2, 1, 1}}, + {"net.inet.icmp.rediraccept", []_C_int{4, 2, 1, 4}}, + {"net.inet.icmp.redirtimeout", []_C_int{4, 2, 1, 5}}, + {"net.inet.icmp.stats", []_C_int{4, 2, 1, 7}}, + {"net.inet.icmp.tstamprepl", []_C_int{4, 2, 1, 6}}, + {"net.inet.igmp.stats", []_C_int{4, 2, 2, 1}}, + {"net.inet.ip.arpqueued", []_C_int{4, 2, 0, 36}}, + {"net.inet.ip.encdebug", []_C_int{4, 2, 0, 12}}, + {"net.inet.ip.forwarding", []_C_int{4, 2, 0, 1}}, + {"net.inet.ip.ifq.congestion", []_C_int{4, 2, 0, 30, 4}}, + {"net.inet.ip.ifq.drops", []_C_int{4, 2, 0, 30, 3}}, + {"net.inet.ip.ifq.len", []_C_int{4, 2, 0, 30, 1}}, + {"net.inet.ip.ifq.maxlen", []_C_int{4, 2, 0, 30, 2}}, + {"net.inet.ip.maxqueue", []_C_int{4, 2, 0, 11}}, + {"net.inet.ip.mforwarding", []_C_int{4, 2, 0, 31}}, + {"net.inet.ip.mrtproto", []_C_int{4, 2, 0, 34}}, + {"net.inet.ip.mrtstats", []_C_int{4, 2, 0, 35}}, + {"net.inet.ip.mtu", []_C_int{4, 2, 0, 4}}, + {"net.inet.ip.mtudisc", []_C_int{4, 2, 0, 27}}, + {"net.inet.ip.mtudisctimeout", []_C_int{4, 2, 0, 28}}, + {"net.inet.ip.multipath", []_C_int{4, 2, 0, 32}}, + {"net.inet.ip.portfirst", []_C_int{4, 2, 0, 7}}, + {"net.inet.ip.porthifirst", []_C_int{4, 2, 0, 9}}, + {"net.inet.ip.porthilast", []_C_int{4, 2, 0, 10}}, + {"net.inet.ip.portlast", []_C_int{4, 2, 0, 8}}, + {"net.inet.ip.redirect", []_C_int{4, 2, 0, 2}}, + {"net.inet.ip.sourceroute", []_C_int{4, 2, 0, 5}}, + {"net.inet.ip.stats", []_C_int{4, 2, 0, 33}}, + {"net.inet.ip.ttl", []_C_int{4, 2, 0, 3}}, + {"net.inet.ipcomp.enable", []_C_int{4, 2, 108, 1}}, + {"net.inet.ipcomp.stats", []_C_int{4, 2, 108, 2}}, + {"net.inet.ipip.allow", []_C_int{4, 2, 4, 1}}, + {"net.inet.ipip.stats", []_C_int{4, 2, 4, 2}}, + {"net.inet.mobileip.allow", []_C_int{4, 2, 55, 1}}, + {"net.inet.pfsync.stats", []_C_int{4, 2, 240, 1}}, + {"net.inet.pim.stats", []_C_int{4, 2, 103, 1}}, + {"net.inet.tcp.ackonpush", []_C_int{4, 2, 6, 13}}, + {"net.inet.tcp.always_keepalive", []_C_int{4, 2, 6, 22}}, + {"net.inet.tcp.baddynamic", []_C_int{4, 2, 6, 6}}, + {"net.inet.tcp.drop", []_C_int{4, 2, 6, 19}}, + {"net.inet.tcp.ecn", []_C_int{4, 2, 6, 14}}, + {"net.inet.tcp.ident", []_C_int{4, 2, 6, 9}}, + {"net.inet.tcp.keepidle", []_C_int{4, 2, 6, 3}}, + {"net.inet.tcp.keepinittime", []_C_int{4, 2, 6, 2}}, + {"net.inet.tcp.keepintvl", []_C_int{4, 2, 6, 4}}, + {"net.inet.tcp.mssdflt", []_C_int{4, 2, 6, 11}}, + {"net.inet.tcp.reasslimit", []_C_int{4, 2, 6, 18}}, + {"net.inet.tcp.rfc1323", []_C_int{4, 2, 6, 1}}, + {"net.inet.tcp.rfc3390", []_C_int{4, 2, 6, 17}}, + {"net.inet.tcp.rstppslimit", []_C_int{4, 2, 6, 12}}, + {"net.inet.tcp.sack", []_C_int{4, 2, 6, 10}}, + {"net.inet.tcp.sackholelimit", []_C_int{4, 2, 6, 20}}, + {"net.inet.tcp.slowhz", []_C_int{4, 2, 6, 5}}, + {"net.inet.tcp.stats", []_C_int{4, 2, 6, 21}}, + {"net.inet.tcp.synbucketlimit", []_C_int{4, 2, 6, 16}}, + {"net.inet.tcp.syncachelimit", []_C_int{4, 2, 6, 15}}, + {"net.inet.udp.baddynamic", []_C_int{4, 2, 17, 2}}, + {"net.inet.udp.checksum", []_C_int{4, 2, 17, 1}}, + {"net.inet.udp.recvspace", []_C_int{4, 2, 17, 3}}, + {"net.inet.udp.sendspace", []_C_int{4, 2, 17, 4}}, + {"net.inet.udp.stats", []_C_int{4, 2, 17, 5}}, + {"net.inet6.divert.recvspace", []_C_int{4, 24, 86, 1}}, + {"net.inet6.divert.sendspace", []_C_int{4, 24, 86, 2}}, + {"net.inet6.divert.stats", []_C_int{4, 24, 86, 3}}, + {"net.inet6.icmp6.errppslimit", []_C_int{4, 24, 30, 14}}, + {"net.inet6.icmp6.mtudisc_hiwat", []_C_int{4, 24, 30, 16}}, + {"net.inet6.icmp6.mtudisc_lowat", []_C_int{4, 24, 30, 17}}, + {"net.inet6.icmp6.nd6_debug", []_C_int{4, 24, 30, 18}}, + {"net.inet6.icmp6.nd6_delay", []_C_int{4, 24, 30, 8}}, + {"net.inet6.icmp6.nd6_maxnudhint", []_C_int{4, 24, 30, 15}}, + {"net.inet6.icmp6.nd6_mmaxtries", []_C_int{4, 24, 30, 10}}, + {"net.inet6.icmp6.nd6_prune", []_C_int{4, 24, 30, 6}}, + {"net.inet6.icmp6.nd6_umaxtries", []_C_int{4, 24, 30, 9}}, + {"net.inet6.icmp6.nd6_useloopback", []_C_int{4, 24, 30, 11}}, + {"net.inet6.icmp6.nodeinfo", []_C_int{4, 24, 30, 13}}, + {"net.inet6.icmp6.rediraccept", []_C_int{4, 24, 30, 2}}, + {"net.inet6.icmp6.redirtimeout", []_C_int{4, 24, 30, 3}}, + {"net.inet6.ip6.accept_rtadv", []_C_int{4, 24, 17, 12}}, + {"net.inet6.ip6.auto_flowlabel", []_C_int{4, 24, 17, 17}}, + {"net.inet6.ip6.dad_count", []_C_int{4, 24, 17, 16}}, + {"net.inet6.ip6.dad_pending", []_C_int{4, 24, 17, 49}}, + {"net.inet6.ip6.defmcasthlim", []_C_int{4, 24, 17, 18}}, + {"net.inet6.ip6.forwarding", []_C_int{4, 24, 17, 1}}, + {"net.inet6.ip6.forwsrcrt", []_C_int{4, 24, 17, 5}}, + {"net.inet6.ip6.hdrnestlimit", []_C_int{4, 24, 17, 15}}, + {"net.inet6.ip6.hlim", []_C_int{4, 24, 17, 3}}, + {"net.inet6.ip6.log_interval", []_C_int{4, 24, 17, 14}}, + {"net.inet6.ip6.maxdynroutes", []_C_int{4, 24, 17, 48}}, + {"net.inet6.ip6.maxfragpackets", []_C_int{4, 24, 17, 9}}, + {"net.inet6.ip6.maxfrags", []_C_int{4, 24, 17, 41}}, + {"net.inet6.ip6.maxifdefrouters", []_C_int{4, 24, 17, 47}}, + {"net.inet6.ip6.maxifprefixes", []_C_int{4, 24, 17, 46}}, + {"net.inet6.ip6.mforwarding", []_C_int{4, 24, 17, 42}}, + {"net.inet6.ip6.mrtproto", []_C_int{4, 24, 17, 8}}, + {"net.inet6.ip6.mtudisctimeout", []_C_int{4, 24, 17, 50}}, + {"net.inet6.ip6.multicast_mtudisc", []_C_int{4, 24, 17, 44}}, + {"net.inet6.ip6.multipath", []_C_int{4, 24, 17, 43}}, + {"net.inet6.ip6.neighborgcthresh", []_C_int{4, 24, 17, 45}}, + {"net.inet6.ip6.redirect", []_C_int{4, 24, 17, 2}}, + {"net.inet6.ip6.rr_prune", []_C_int{4, 24, 17, 22}}, + {"net.inet6.ip6.sourcecheck", []_C_int{4, 24, 17, 10}}, + {"net.inet6.ip6.sourcecheck_logint", []_C_int{4, 24, 17, 11}}, + {"net.inet6.ip6.use_deprecated", []_C_int{4, 24, 17, 21}}, + {"net.inet6.ip6.v6only", []_C_int{4, 24, 17, 24}}, + {"net.key.sadb_dump", []_C_int{4, 30, 1}}, + {"net.key.spd_dump", []_C_int{4, 30, 2}}, + {"net.mpls.ifq.congestion", []_C_int{4, 33, 3, 4}}, + {"net.mpls.ifq.drops", []_C_int{4, 33, 3, 3}}, + {"net.mpls.ifq.len", []_C_int{4, 33, 3, 1}}, + {"net.mpls.ifq.maxlen", []_C_int{4, 33, 3, 2}}, + {"net.mpls.mapttl_ip", []_C_int{4, 33, 5}}, + {"net.mpls.mapttl_ip6", []_C_int{4, 33, 6}}, + {"net.mpls.maxloop_inkernel", []_C_int{4, 33, 4}}, + {"net.mpls.ttl", []_C_int{4, 33, 2}}, + {"net.pflow.stats", []_C_int{4, 34, 1}}, + {"net.pipex.enable", []_C_int{4, 35, 1}}, + {"vm.anonmin", []_C_int{2, 7}}, + {"vm.loadavg", []_C_int{2, 2}}, + {"vm.maxslp", []_C_int{2, 10}}, + {"vm.nkmempages", []_C_int{2, 6}}, + {"vm.psstrings", []_C_int{2, 3}}, + {"vm.swapencrypt.enable", []_C_int{2, 5, 0}}, + {"vm.swapencrypt.keyscreated", []_C_int{2, 5, 1}}, + {"vm.swapencrypt.keysdeleted", []_C_int{2, 5, 2}}, + {"vm.uspace", []_C_int{2, 11}}, + {"vm.uvmexp", []_C_int{2, 4}}, + {"vm.vmmeter", []_C_int{2, 1}}, + {"vm.vnodemin", []_C_int{2, 9}}, + {"vm.vtextmin", []_C_int{2, 8}}, +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go new file mode 100644 index 00000000..d014451c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go @@ -0,0 +1,270 @@ +// mksysctl_openbsd.pl +// Code generated by the command above; DO NOT EDIT. + +// +build amd64,openbsd + +package unix + +type mibentry struct { + ctlname string + ctloid []_C_int +} + +var sysctlMib = []mibentry{ + {"ddb.console", []_C_int{9, 6}}, + {"ddb.log", []_C_int{9, 7}}, + {"ddb.max_line", []_C_int{9, 3}}, + {"ddb.max_width", []_C_int{9, 2}}, + {"ddb.panic", []_C_int{9, 5}}, + {"ddb.profile", []_C_int{9, 9}}, + {"ddb.radix", []_C_int{9, 1}}, + {"ddb.tab_stop_width", []_C_int{9, 4}}, + {"ddb.trigger", []_C_int{9, 8}}, + {"fs.posix.setuid", []_C_int{3, 1, 1}}, + {"hw.allowpowerdown", []_C_int{6, 22}}, + {"hw.byteorder", []_C_int{6, 4}}, + {"hw.cpuspeed", []_C_int{6, 12}}, + {"hw.diskcount", []_C_int{6, 10}}, + {"hw.disknames", []_C_int{6, 8}}, + {"hw.diskstats", []_C_int{6, 9}}, + {"hw.machine", []_C_int{6, 1}}, + {"hw.model", []_C_int{6, 2}}, + {"hw.ncpu", []_C_int{6, 3}}, + {"hw.ncpufound", []_C_int{6, 21}}, + {"hw.pagesize", []_C_int{6, 7}}, + {"hw.perfpolicy", []_C_int{6, 23}}, + {"hw.physmem", []_C_int{6, 19}}, + {"hw.product", []_C_int{6, 15}}, + {"hw.serialno", []_C_int{6, 17}}, + {"hw.setperf", []_C_int{6, 13}}, + {"hw.usermem", []_C_int{6, 20}}, + {"hw.uuid", []_C_int{6, 18}}, + {"hw.vendor", []_C_int{6, 14}}, + {"hw.version", []_C_int{6, 16}}, + {"kern.allowkmem", []_C_int{1, 52}}, + {"kern.argmax", []_C_int{1, 8}}, + {"kern.boottime", []_C_int{1, 21}}, + {"kern.bufcachepercent", []_C_int{1, 72}}, + {"kern.ccpu", []_C_int{1, 45}}, + {"kern.clockrate", []_C_int{1, 12}}, + {"kern.consdev", []_C_int{1, 75}}, + {"kern.cp_time", []_C_int{1, 40}}, + {"kern.cp_time2", []_C_int{1, 71}}, + {"kern.dnsjackport", []_C_int{1, 13}}, + {"kern.domainname", []_C_int{1, 22}}, + {"kern.file", []_C_int{1, 73}}, + {"kern.forkstat", []_C_int{1, 42}}, + {"kern.fscale", []_C_int{1, 46}}, + {"kern.fsync", []_C_int{1, 33}}, + {"kern.global_ptrace", []_C_int{1, 81}}, + {"kern.hostid", []_C_int{1, 11}}, + {"kern.hostname", []_C_int{1, 10}}, + {"kern.intrcnt.nintrcnt", []_C_int{1, 63, 1}}, + {"kern.job_control", []_C_int{1, 19}}, + {"kern.malloc.buckets", []_C_int{1, 39, 1}}, + {"kern.malloc.kmemnames", []_C_int{1, 39, 3}}, + {"kern.maxclusters", []_C_int{1, 67}}, + {"kern.maxfiles", []_C_int{1, 7}}, + {"kern.maxlocksperuid", []_C_int{1, 70}}, + {"kern.maxpartitions", []_C_int{1, 23}}, + {"kern.maxproc", []_C_int{1, 6}}, + {"kern.maxthread", []_C_int{1, 25}}, + {"kern.maxvnodes", []_C_int{1, 5}}, + {"kern.mbstat", []_C_int{1, 59}}, + {"kern.msgbuf", []_C_int{1, 48}}, + {"kern.msgbufsize", []_C_int{1, 38}}, + {"kern.nchstats", []_C_int{1, 41}}, + {"kern.netlivelocks", []_C_int{1, 76}}, + {"kern.nfiles", []_C_int{1, 56}}, + {"kern.ngroups", []_C_int{1, 18}}, + {"kern.nosuidcoredump", []_C_int{1, 32}}, + {"kern.nprocs", []_C_int{1, 47}}, + {"kern.nselcoll", []_C_int{1, 43}}, + {"kern.nthreads", []_C_int{1, 26}}, + {"kern.numvnodes", []_C_int{1, 58}}, + {"kern.osrelease", []_C_int{1, 2}}, + {"kern.osrevision", []_C_int{1, 3}}, + {"kern.ostype", []_C_int{1, 1}}, + {"kern.osversion", []_C_int{1, 27}}, + {"kern.pool_debug", []_C_int{1, 77}}, + {"kern.posix1version", []_C_int{1, 17}}, + {"kern.proc", []_C_int{1, 66}}, + {"kern.rawpartition", []_C_int{1, 24}}, + {"kern.saved_ids", []_C_int{1, 20}}, + {"kern.securelevel", []_C_int{1, 9}}, + {"kern.seminfo", []_C_int{1, 61}}, + {"kern.shminfo", []_C_int{1, 62}}, + {"kern.somaxconn", []_C_int{1, 28}}, + {"kern.sominconn", []_C_int{1, 29}}, + {"kern.splassert", []_C_int{1, 54}}, + {"kern.stackgap_random", []_C_int{1, 50}}, + {"kern.sysvipc_info", []_C_int{1, 51}}, + {"kern.sysvmsg", []_C_int{1, 34}}, + {"kern.sysvsem", []_C_int{1, 35}}, + {"kern.sysvshm", []_C_int{1, 36}}, + {"kern.timecounter.choice", []_C_int{1, 69, 4}}, + {"kern.timecounter.hardware", []_C_int{1, 69, 3}}, + {"kern.timecounter.tick", []_C_int{1, 69, 1}}, + {"kern.timecounter.timestepwarnings", []_C_int{1, 69, 2}}, + {"kern.tty.tk_cancc", []_C_int{1, 44, 4}}, + {"kern.tty.tk_nin", []_C_int{1, 44, 1}}, + {"kern.tty.tk_nout", []_C_int{1, 44, 2}}, + {"kern.tty.tk_rawcc", []_C_int{1, 44, 3}}, + {"kern.tty.ttyinfo", []_C_int{1, 44, 5}}, + {"kern.ttycount", []_C_int{1, 57}}, + {"kern.version", []_C_int{1, 4}}, + {"kern.watchdog.auto", []_C_int{1, 64, 2}}, + {"kern.watchdog.period", []_C_int{1, 64, 1}}, + {"kern.wxabort", []_C_int{1, 74}}, + {"net.bpf.bufsize", []_C_int{4, 31, 1}}, + {"net.bpf.maxbufsize", []_C_int{4, 31, 2}}, + {"net.inet.ah.enable", []_C_int{4, 2, 51, 1}}, + {"net.inet.ah.stats", []_C_int{4, 2, 51, 2}}, + {"net.inet.carp.allow", []_C_int{4, 2, 112, 1}}, + {"net.inet.carp.log", []_C_int{4, 2, 112, 3}}, + {"net.inet.carp.preempt", []_C_int{4, 2, 112, 2}}, + {"net.inet.carp.stats", []_C_int{4, 2, 112, 4}}, + {"net.inet.divert.recvspace", []_C_int{4, 2, 258, 1}}, + {"net.inet.divert.sendspace", []_C_int{4, 2, 258, 2}}, + {"net.inet.divert.stats", []_C_int{4, 2, 258, 3}}, + {"net.inet.esp.enable", []_C_int{4, 2, 50, 1}}, + {"net.inet.esp.stats", []_C_int{4, 2, 50, 4}}, + {"net.inet.esp.udpencap", []_C_int{4, 2, 50, 2}}, + {"net.inet.esp.udpencap_port", []_C_int{4, 2, 50, 3}}, + {"net.inet.etherip.allow", []_C_int{4, 2, 97, 1}}, + {"net.inet.etherip.stats", []_C_int{4, 2, 97, 2}}, + {"net.inet.gre.allow", []_C_int{4, 2, 47, 1}}, + {"net.inet.gre.wccp", []_C_int{4, 2, 47, 2}}, + {"net.inet.icmp.bmcastecho", []_C_int{4, 2, 1, 2}}, + {"net.inet.icmp.errppslimit", []_C_int{4, 2, 1, 3}}, + {"net.inet.icmp.maskrepl", []_C_int{4, 2, 1, 1}}, + {"net.inet.icmp.rediraccept", []_C_int{4, 2, 1, 4}}, + {"net.inet.icmp.redirtimeout", []_C_int{4, 2, 1, 5}}, + {"net.inet.icmp.stats", []_C_int{4, 2, 1, 7}}, + {"net.inet.icmp.tstamprepl", []_C_int{4, 2, 1, 6}}, + {"net.inet.igmp.stats", []_C_int{4, 2, 2, 1}}, + {"net.inet.ip.arpdown", []_C_int{4, 2, 0, 40}}, + {"net.inet.ip.arpqueued", []_C_int{4, 2, 0, 36}}, + {"net.inet.ip.arptimeout", []_C_int{4, 2, 0, 39}}, + {"net.inet.ip.encdebug", []_C_int{4, 2, 0, 12}}, + {"net.inet.ip.forwarding", []_C_int{4, 2, 0, 1}}, + {"net.inet.ip.ifq.congestion", []_C_int{4, 2, 0, 30, 4}}, + {"net.inet.ip.ifq.drops", []_C_int{4, 2, 0, 30, 3}}, + {"net.inet.ip.ifq.len", []_C_int{4, 2, 0, 30, 1}}, + {"net.inet.ip.ifq.maxlen", []_C_int{4, 2, 0, 30, 2}}, + {"net.inet.ip.maxqueue", []_C_int{4, 2, 0, 11}}, + {"net.inet.ip.mforwarding", []_C_int{4, 2, 0, 31}}, + {"net.inet.ip.mrtmfc", []_C_int{4, 2, 0, 37}}, + {"net.inet.ip.mrtproto", []_C_int{4, 2, 0, 34}}, + {"net.inet.ip.mrtstats", []_C_int{4, 2, 0, 35}}, + {"net.inet.ip.mrtvif", []_C_int{4, 2, 0, 38}}, + {"net.inet.ip.mtu", []_C_int{4, 2, 0, 4}}, + {"net.inet.ip.mtudisc", []_C_int{4, 2, 0, 27}}, + {"net.inet.ip.mtudisctimeout", []_C_int{4, 2, 0, 28}}, + {"net.inet.ip.multipath", []_C_int{4, 2, 0, 32}}, + {"net.inet.ip.portfirst", []_C_int{4, 2, 0, 7}}, + {"net.inet.ip.porthifirst", []_C_int{4, 2, 0, 9}}, + {"net.inet.ip.porthilast", []_C_int{4, 2, 0, 10}}, + {"net.inet.ip.portlast", []_C_int{4, 2, 0, 8}}, + {"net.inet.ip.redirect", []_C_int{4, 2, 0, 2}}, + {"net.inet.ip.sourceroute", []_C_int{4, 2, 0, 5}}, + {"net.inet.ip.stats", []_C_int{4, 2, 0, 33}}, + {"net.inet.ip.ttl", []_C_int{4, 2, 0, 3}}, + {"net.inet.ipcomp.enable", []_C_int{4, 2, 108, 1}}, + {"net.inet.ipcomp.stats", []_C_int{4, 2, 108, 2}}, + {"net.inet.ipip.allow", []_C_int{4, 2, 4, 1}}, + {"net.inet.ipip.stats", []_C_int{4, 2, 4, 2}}, + {"net.inet.mobileip.allow", []_C_int{4, 2, 55, 1}}, + {"net.inet.pfsync.stats", []_C_int{4, 2, 240, 1}}, + {"net.inet.tcp.ackonpush", []_C_int{4, 2, 6, 13}}, + {"net.inet.tcp.always_keepalive", []_C_int{4, 2, 6, 22}}, + {"net.inet.tcp.baddynamic", []_C_int{4, 2, 6, 6}}, + {"net.inet.tcp.drop", []_C_int{4, 2, 6, 19}}, + {"net.inet.tcp.ecn", []_C_int{4, 2, 6, 14}}, + {"net.inet.tcp.ident", []_C_int{4, 2, 6, 9}}, + {"net.inet.tcp.keepidle", []_C_int{4, 2, 6, 3}}, + {"net.inet.tcp.keepinittime", []_C_int{4, 2, 6, 2}}, + {"net.inet.tcp.keepintvl", []_C_int{4, 2, 6, 4}}, + {"net.inet.tcp.mssdflt", []_C_int{4, 2, 6, 11}}, + {"net.inet.tcp.reasslimit", []_C_int{4, 2, 6, 18}}, + {"net.inet.tcp.rfc1323", []_C_int{4, 2, 6, 1}}, + {"net.inet.tcp.rfc3390", []_C_int{4, 2, 6, 17}}, + {"net.inet.tcp.rootonly", []_C_int{4, 2, 6, 24}}, + {"net.inet.tcp.rstppslimit", []_C_int{4, 2, 6, 12}}, + {"net.inet.tcp.sack", []_C_int{4, 2, 6, 10}}, + {"net.inet.tcp.sackholelimit", []_C_int{4, 2, 6, 20}}, + {"net.inet.tcp.slowhz", []_C_int{4, 2, 6, 5}}, + {"net.inet.tcp.stats", []_C_int{4, 2, 6, 21}}, + {"net.inet.tcp.synbucketlimit", []_C_int{4, 2, 6, 16}}, + {"net.inet.tcp.syncachelimit", []_C_int{4, 2, 6, 15}}, + {"net.inet.tcp.synhashsize", []_C_int{4, 2, 6, 25}}, + {"net.inet.tcp.synuselimit", []_C_int{4, 2, 6, 23}}, + {"net.inet.udp.baddynamic", []_C_int{4, 2, 17, 2}}, + {"net.inet.udp.checksum", []_C_int{4, 2, 17, 1}}, + {"net.inet.udp.recvspace", []_C_int{4, 2, 17, 3}}, + {"net.inet.udp.rootonly", []_C_int{4, 2, 17, 6}}, + {"net.inet.udp.sendspace", []_C_int{4, 2, 17, 4}}, + {"net.inet.udp.stats", []_C_int{4, 2, 17, 5}}, + {"net.inet6.divert.recvspace", []_C_int{4, 24, 86, 1}}, + {"net.inet6.divert.sendspace", []_C_int{4, 24, 86, 2}}, + {"net.inet6.divert.stats", []_C_int{4, 24, 86, 3}}, + {"net.inet6.icmp6.errppslimit", []_C_int{4, 24, 30, 14}}, + {"net.inet6.icmp6.mtudisc_hiwat", []_C_int{4, 24, 30, 16}}, + {"net.inet6.icmp6.mtudisc_lowat", []_C_int{4, 24, 30, 17}}, + {"net.inet6.icmp6.nd6_debug", []_C_int{4, 24, 30, 18}}, + {"net.inet6.icmp6.nd6_delay", []_C_int{4, 24, 30, 8}}, + {"net.inet6.icmp6.nd6_maxnudhint", []_C_int{4, 24, 30, 15}}, + {"net.inet6.icmp6.nd6_mmaxtries", []_C_int{4, 24, 30, 10}}, + {"net.inet6.icmp6.nd6_umaxtries", []_C_int{4, 24, 30, 9}}, + {"net.inet6.icmp6.redirtimeout", []_C_int{4, 24, 30, 3}}, + {"net.inet6.ip6.auto_flowlabel", []_C_int{4, 24, 17, 17}}, + {"net.inet6.ip6.dad_count", []_C_int{4, 24, 17, 16}}, + {"net.inet6.ip6.dad_pending", []_C_int{4, 24, 17, 49}}, + {"net.inet6.ip6.defmcasthlim", []_C_int{4, 24, 17, 18}}, + {"net.inet6.ip6.forwarding", []_C_int{4, 24, 17, 1}}, + {"net.inet6.ip6.forwsrcrt", []_C_int{4, 24, 17, 5}}, + {"net.inet6.ip6.hdrnestlimit", []_C_int{4, 24, 17, 15}}, + {"net.inet6.ip6.hlim", []_C_int{4, 24, 17, 3}}, + {"net.inet6.ip6.log_interval", []_C_int{4, 24, 17, 14}}, + {"net.inet6.ip6.maxdynroutes", []_C_int{4, 24, 17, 48}}, + {"net.inet6.ip6.maxfragpackets", []_C_int{4, 24, 17, 9}}, + {"net.inet6.ip6.maxfrags", []_C_int{4, 24, 17, 41}}, + {"net.inet6.ip6.mforwarding", []_C_int{4, 24, 17, 42}}, + {"net.inet6.ip6.mrtmfc", []_C_int{4, 24, 17, 53}}, + {"net.inet6.ip6.mrtmif", []_C_int{4, 24, 17, 52}}, + {"net.inet6.ip6.mrtproto", []_C_int{4, 24, 17, 8}}, + {"net.inet6.ip6.mtudisctimeout", []_C_int{4, 24, 17, 50}}, + {"net.inet6.ip6.multicast_mtudisc", []_C_int{4, 24, 17, 44}}, + {"net.inet6.ip6.multipath", []_C_int{4, 24, 17, 43}}, + {"net.inet6.ip6.neighborgcthresh", []_C_int{4, 24, 17, 45}}, + {"net.inet6.ip6.redirect", []_C_int{4, 24, 17, 2}}, + {"net.inet6.ip6.soiikey", []_C_int{4, 24, 17, 54}}, + {"net.inet6.ip6.sourcecheck", []_C_int{4, 24, 17, 10}}, + {"net.inet6.ip6.sourcecheck_logint", []_C_int{4, 24, 17, 11}}, + {"net.inet6.ip6.use_deprecated", []_C_int{4, 24, 17, 21}}, + {"net.key.sadb_dump", []_C_int{4, 30, 1}}, + {"net.key.spd_dump", []_C_int{4, 30, 2}}, + {"net.mpls.ifq.congestion", []_C_int{4, 33, 3, 4}}, + {"net.mpls.ifq.drops", []_C_int{4, 33, 3, 3}}, + {"net.mpls.ifq.len", []_C_int{4, 33, 3, 1}}, + {"net.mpls.ifq.maxlen", []_C_int{4, 33, 3, 2}}, + {"net.mpls.mapttl_ip", []_C_int{4, 33, 5}}, + {"net.mpls.mapttl_ip6", []_C_int{4, 33, 6}}, + {"net.mpls.maxloop_inkernel", []_C_int{4, 33, 4}}, + {"net.mpls.ttl", []_C_int{4, 33, 2}}, + {"net.pflow.stats", []_C_int{4, 34, 1}}, + {"net.pipex.enable", []_C_int{4, 35, 1}}, + {"vm.anonmin", []_C_int{2, 7}}, + {"vm.loadavg", []_C_int{2, 2}}, + {"vm.maxslp", []_C_int{2, 10}}, + {"vm.nkmempages", []_C_int{2, 6}}, + {"vm.psstrings", []_C_int{2, 3}}, + {"vm.swapencrypt.enable", []_C_int{2, 5, 0}}, + {"vm.swapencrypt.keyscreated", []_C_int{2, 5, 1}}, + {"vm.swapencrypt.keysdeleted", []_C_int{2, 5, 2}}, + {"vm.uspace", []_C_int{2, 11}}, + {"vm.uvmexp", []_C_int{2, 4}}, + {"vm.vmmeter", []_C_int{2, 1}}, + {"vm.vnodemin", []_C_int{2, 9}}, + {"vm.vtextmin", []_C_int{2, 8}}, +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go new file mode 100644 index 00000000..b005031a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go @@ -0,0 +1,270 @@ +// mksysctl_openbsd.pl +// Code generated by the command above; DO NOT EDIT. + +package unix + +type mibentry struct { + ctlname string + ctloid []_C_int +} + +var sysctlMib = []mibentry{ + {"ddb.console", []_C_int{9, 6}}, + {"ddb.log", []_C_int{9, 7}}, + {"ddb.max_line", []_C_int{9, 3}}, + {"ddb.max_width", []_C_int{9, 2}}, + {"ddb.panic", []_C_int{9, 5}}, + {"ddb.radix", []_C_int{9, 1}}, + {"ddb.tab_stop_width", []_C_int{9, 4}}, + {"ddb.trigger", []_C_int{9, 8}}, + {"fs.posix.setuid", []_C_int{3, 1, 1}}, + {"hw.allowpowerdown", []_C_int{6, 22}}, + {"hw.byteorder", []_C_int{6, 4}}, + {"hw.cpuspeed", []_C_int{6, 12}}, + {"hw.diskcount", []_C_int{6, 10}}, + {"hw.disknames", []_C_int{6, 8}}, + {"hw.diskstats", []_C_int{6, 9}}, + {"hw.machine", []_C_int{6, 1}}, + {"hw.model", []_C_int{6, 2}}, + {"hw.ncpu", []_C_int{6, 3}}, + {"hw.ncpufound", []_C_int{6, 21}}, + {"hw.pagesize", []_C_int{6, 7}}, + {"hw.physmem", []_C_int{6, 19}}, + {"hw.product", []_C_int{6, 15}}, + {"hw.serialno", []_C_int{6, 17}}, + {"hw.setperf", []_C_int{6, 13}}, + {"hw.usermem", []_C_int{6, 20}}, + {"hw.uuid", []_C_int{6, 18}}, + {"hw.vendor", []_C_int{6, 14}}, + {"hw.version", []_C_int{6, 16}}, + {"kern.arandom", []_C_int{1, 37}}, + {"kern.argmax", []_C_int{1, 8}}, + {"kern.boottime", []_C_int{1, 21}}, + {"kern.bufcachepercent", []_C_int{1, 72}}, + {"kern.ccpu", []_C_int{1, 45}}, + {"kern.clockrate", []_C_int{1, 12}}, + {"kern.consdev", []_C_int{1, 75}}, + {"kern.cp_time", []_C_int{1, 40}}, + {"kern.cp_time2", []_C_int{1, 71}}, + {"kern.cryptodevallowsoft", []_C_int{1, 53}}, + {"kern.domainname", []_C_int{1, 22}}, + {"kern.file", []_C_int{1, 73}}, + {"kern.forkstat", []_C_int{1, 42}}, + {"kern.fscale", []_C_int{1, 46}}, + {"kern.fsync", []_C_int{1, 33}}, + {"kern.hostid", []_C_int{1, 11}}, + {"kern.hostname", []_C_int{1, 10}}, + {"kern.intrcnt.nintrcnt", []_C_int{1, 63, 1}}, + {"kern.job_control", []_C_int{1, 19}}, + {"kern.malloc.buckets", []_C_int{1, 39, 1}}, + {"kern.malloc.kmemnames", []_C_int{1, 39, 3}}, + {"kern.maxclusters", []_C_int{1, 67}}, + {"kern.maxfiles", []_C_int{1, 7}}, + {"kern.maxlocksperuid", []_C_int{1, 70}}, + {"kern.maxpartitions", []_C_int{1, 23}}, + {"kern.maxproc", []_C_int{1, 6}}, + {"kern.maxthread", []_C_int{1, 25}}, + {"kern.maxvnodes", []_C_int{1, 5}}, + {"kern.mbstat", []_C_int{1, 59}}, + {"kern.msgbuf", []_C_int{1, 48}}, + {"kern.msgbufsize", []_C_int{1, 38}}, + {"kern.nchstats", []_C_int{1, 41}}, + {"kern.netlivelocks", []_C_int{1, 76}}, + {"kern.nfiles", []_C_int{1, 56}}, + {"kern.ngroups", []_C_int{1, 18}}, + {"kern.nosuidcoredump", []_C_int{1, 32}}, + {"kern.nprocs", []_C_int{1, 47}}, + {"kern.nselcoll", []_C_int{1, 43}}, + {"kern.nthreads", []_C_int{1, 26}}, + {"kern.numvnodes", []_C_int{1, 58}}, + {"kern.osrelease", []_C_int{1, 2}}, + {"kern.osrevision", []_C_int{1, 3}}, + {"kern.ostype", []_C_int{1, 1}}, + {"kern.osversion", []_C_int{1, 27}}, + {"kern.pool_debug", []_C_int{1, 77}}, + {"kern.posix1version", []_C_int{1, 17}}, + {"kern.proc", []_C_int{1, 66}}, + {"kern.random", []_C_int{1, 31}}, + {"kern.rawpartition", []_C_int{1, 24}}, + {"kern.saved_ids", []_C_int{1, 20}}, + {"kern.securelevel", []_C_int{1, 9}}, + {"kern.seminfo", []_C_int{1, 61}}, + {"kern.shminfo", []_C_int{1, 62}}, + {"kern.somaxconn", []_C_int{1, 28}}, + {"kern.sominconn", []_C_int{1, 29}}, + {"kern.splassert", []_C_int{1, 54}}, + {"kern.stackgap_random", []_C_int{1, 50}}, + {"kern.sysvipc_info", []_C_int{1, 51}}, + {"kern.sysvmsg", []_C_int{1, 34}}, + {"kern.sysvsem", []_C_int{1, 35}}, + {"kern.sysvshm", []_C_int{1, 36}}, + {"kern.timecounter.choice", []_C_int{1, 69, 4}}, + {"kern.timecounter.hardware", []_C_int{1, 69, 3}}, + {"kern.timecounter.tick", []_C_int{1, 69, 1}}, + {"kern.timecounter.timestepwarnings", []_C_int{1, 69, 2}}, + {"kern.tty.maxptys", []_C_int{1, 44, 6}}, + {"kern.tty.nptys", []_C_int{1, 44, 7}}, + {"kern.tty.tk_cancc", []_C_int{1, 44, 4}}, + {"kern.tty.tk_nin", []_C_int{1, 44, 1}}, + {"kern.tty.tk_nout", []_C_int{1, 44, 2}}, + {"kern.tty.tk_rawcc", []_C_int{1, 44, 3}}, + {"kern.tty.ttyinfo", []_C_int{1, 44, 5}}, + {"kern.ttycount", []_C_int{1, 57}}, + {"kern.userasymcrypto", []_C_int{1, 60}}, + {"kern.usercrypto", []_C_int{1, 52}}, + {"kern.usermount", []_C_int{1, 30}}, + {"kern.version", []_C_int{1, 4}}, + {"kern.vnode", []_C_int{1, 13}}, + {"kern.watchdog.auto", []_C_int{1, 64, 2}}, + {"kern.watchdog.period", []_C_int{1, 64, 1}}, + {"net.bpf.bufsize", []_C_int{4, 31, 1}}, + {"net.bpf.maxbufsize", []_C_int{4, 31, 2}}, + {"net.inet.ah.enable", []_C_int{4, 2, 51, 1}}, + {"net.inet.ah.stats", []_C_int{4, 2, 51, 2}}, + {"net.inet.carp.allow", []_C_int{4, 2, 112, 1}}, + {"net.inet.carp.log", []_C_int{4, 2, 112, 3}}, + {"net.inet.carp.preempt", []_C_int{4, 2, 112, 2}}, + {"net.inet.carp.stats", []_C_int{4, 2, 112, 4}}, + {"net.inet.divert.recvspace", []_C_int{4, 2, 258, 1}}, + {"net.inet.divert.sendspace", []_C_int{4, 2, 258, 2}}, + {"net.inet.divert.stats", []_C_int{4, 2, 258, 3}}, + {"net.inet.esp.enable", []_C_int{4, 2, 50, 1}}, + {"net.inet.esp.stats", []_C_int{4, 2, 50, 4}}, + {"net.inet.esp.udpencap", []_C_int{4, 2, 50, 2}}, + {"net.inet.esp.udpencap_port", []_C_int{4, 2, 50, 3}}, + {"net.inet.etherip.allow", []_C_int{4, 2, 97, 1}}, + {"net.inet.etherip.stats", []_C_int{4, 2, 97, 2}}, + {"net.inet.gre.allow", []_C_int{4, 2, 47, 1}}, + {"net.inet.gre.wccp", []_C_int{4, 2, 47, 2}}, + {"net.inet.icmp.bmcastecho", []_C_int{4, 2, 1, 2}}, + {"net.inet.icmp.errppslimit", []_C_int{4, 2, 1, 3}}, + {"net.inet.icmp.maskrepl", []_C_int{4, 2, 1, 1}}, + {"net.inet.icmp.rediraccept", []_C_int{4, 2, 1, 4}}, + {"net.inet.icmp.redirtimeout", []_C_int{4, 2, 1, 5}}, + {"net.inet.icmp.stats", []_C_int{4, 2, 1, 7}}, + {"net.inet.icmp.tstamprepl", []_C_int{4, 2, 1, 6}}, + {"net.inet.igmp.stats", []_C_int{4, 2, 2, 1}}, + {"net.inet.ip.arpqueued", []_C_int{4, 2, 0, 36}}, + {"net.inet.ip.encdebug", []_C_int{4, 2, 0, 12}}, + {"net.inet.ip.forwarding", []_C_int{4, 2, 0, 1}}, + {"net.inet.ip.ifq.congestion", []_C_int{4, 2, 0, 30, 4}}, + {"net.inet.ip.ifq.drops", []_C_int{4, 2, 0, 30, 3}}, + {"net.inet.ip.ifq.len", []_C_int{4, 2, 0, 30, 1}}, + {"net.inet.ip.ifq.maxlen", []_C_int{4, 2, 0, 30, 2}}, + {"net.inet.ip.maxqueue", []_C_int{4, 2, 0, 11}}, + {"net.inet.ip.mforwarding", []_C_int{4, 2, 0, 31}}, + {"net.inet.ip.mrtproto", []_C_int{4, 2, 0, 34}}, + {"net.inet.ip.mrtstats", []_C_int{4, 2, 0, 35}}, + {"net.inet.ip.mtu", []_C_int{4, 2, 0, 4}}, + {"net.inet.ip.mtudisc", []_C_int{4, 2, 0, 27}}, + {"net.inet.ip.mtudisctimeout", []_C_int{4, 2, 0, 28}}, + {"net.inet.ip.multipath", []_C_int{4, 2, 0, 32}}, + {"net.inet.ip.portfirst", []_C_int{4, 2, 0, 7}}, + {"net.inet.ip.porthifirst", []_C_int{4, 2, 0, 9}}, + {"net.inet.ip.porthilast", []_C_int{4, 2, 0, 10}}, + {"net.inet.ip.portlast", []_C_int{4, 2, 0, 8}}, + {"net.inet.ip.redirect", []_C_int{4, 2, 0, 2}}, + {"net.inet.ip.sourceroute", []_C_int{4, 2, 0, 5}}, + {"net.inet.ip.stats", []_C_int{4, 2, 0, 33}}, + {"net.inet.ip.ttl", []_C_int{4, 2, 0, 3}}, + {"net.inet.ipcomp.enable", []_C_int{4, 2, 108, 1}}, + {"net.inet.ipcomp.stats", []_C_int{4, 2, 108, 2}}, + {"net.inet.ipip.allow", []_C_int{4, 2, 4, 1}}, + {"net.inet.ipip.stats", []_C_int{4, 2, 4, 2}}, + {"net.inet.mobileip.allow", []_C_int{4, 2, 55, 1}}, + {"net.inet.pfsync.stats", []_C_int{4, 2, 240, 1}}, + {"net.inet.pim.stats", []_C_int{4, 2, 103, 1}}, + {"net.inet.tcp.ackonpush", []_C_int{4, 2, 6, 13}}, + {"net.inet.tcp.always_keepalive", []_C_int{4, 2, 6, 22}}, + {"net.inet.tcp.baddynamic", []_C_int{4, 2, 6, 6}}, + {"net.inet.tcp.drop", []_C_int{4, 2, 6, 19}}, + {"net.inet.tcp.ecn", []_C_int{4, 2, 6, 14}}, + {"net.inet.tcp.ident", []_C_int{4, 2, 6, 9}}, + {"net.inet.tcp.keepidle", []_C_int{4, 2, 6, 3}}, + {"net.inet.tcp.keepinittime", []_C_int{4, 2, 6, 2}}, + {"net.inet.tcp.keepintvl", []_C_int{4, 2, 6, 4}}, + {"net.inet.tcp.mssdflt", []_C_int{4, 2, 6, 11}}, + {"net.inet.tcp.reasslimit", []_C_int{4, 2, 6, 18}}, + {"net.inet.tcp.rfc1323", []_C_int{4, 2, 6, 1}}, + {"net.inet.tcp.rfc3390", []_C_int{4, 2, 6, 17}}, + {"net.inet.tcp.rstppslimit", []_C_int{4, 2, 6, 12}}, + {"net.inet.tcp.sack", []_C_int{4, 2, 6, 10}}, + {"net.inet.tcp.sackholelimit", []_C_int{4, 2, 6, 20}}, + {"net.inet.tcp.slowhz", []_C_int{4, 2, 6, 5}}, + {"net.inet.tcp.stats", []_C_int{4, 2, 6, 21}}, + {"net.inet.tcp.synbucketlimit", []_C_int{4, 2, 6, 16}}, + {"net.inet.tcp.syncachelimit", []_C_int{4, 2, 6, 15}}, + {"net.inet.udp.baddynamic", []_C_int{4, 2, 17, 2}}, + {"net.inet.udp.checksum", []_C_int{4, 2, 17, 1}}, + {"net.inet.udp.recvspace", []_C_int{4, 2, 17, 3}}, + {"net.inet.udp.sendspace", []_C_int{4, 2, 17, 4}}, + {"net.inet.udp.stats", []_C_int{4, 2, 17, 5}}, + {"net.inet6.divert.recvspace", []_C_int{4, 24, 86, 1}}, + {"net.inet6.divert.sendspace", []_C_int{4, 24, 86, 2}}, + {"net.inet6.divert.stats", []_C_int{4, 24, 86, 3}}, + {"net.inet6.icmp6.errppslimit", []_C_int{4, 24, 30, 14}}, + {"net.inet6.icmp6.mtudisc_hiwat", []_C_int{4, 24, 30, 16}}, + {"net.inet6.icmp6.mtudisc_lowat", []_C_int{4, 24, 30, 17}}, + {"net.inet6.icmp6.nd6_debug", []_C_int{4, 24, 30, 18}}, + {"net.inet6.icmp6.nd6_delay", []_C_int{4, 24, 30, 8}}, + {"net.inet6.icmp6.nd6_maxnudhint", []_C_int{4, 24, 30, 15}}, + {"net.inet6.icmp6.nd6_mmaxtries", []_C_int{4, 24, 30, 10}}, + {"net.inet6.icmp6.nd6_prune", []_C_int{4, 24, 30, 6}}, + {"net.inet6.icmp6.nd6_umaxtries", []_C_int{4, 24, 30, 9}}, + {"net.inet6.icmp6.nd6_useloopback", []_C_int{4, 24, 30, 11}}, + {"net.inet6.icmp6.nodeinfo", []_C_int{4, 24, 30, 13}}, + {"net.inet6.icmp6.rediraccept", []_C_int{4, 24, 30, 2}}, + {"net.inet6.icmp6.redirtimeout", []_C_int{4, 24, 30, 3}}, + {"net.inet6.ip6.accept_rtadv", []_C_int{4, 24, 17, 12}}, + {"net.inet6.ip6.auto_flowlabel", []_C_int{4, 24, 17, 17}}, + {"net.inet6.ip6.dad_count", []_C_int{4, 24, 17, 16}}, + {"net.inet6.ip6.dad_pending", []_C_int{4, 24, 17, 49}}, + {"net.inet6.ip6.defmcasthlim", []_C_int{4, 24, 17, 18}}, + {"net.inet6.ip6.forwarding", []_C_int{4, 24, 17, 1}}, + {"net.inet6.ip6.forwsrcrt", []_C_int{4, 24, 17, 5}}, + {"net.inet6.ip6.hdrnestlimit", []_C_int{4, 24, 17, 15}}, + {"net.inet6.ip6.hlim", []_C_int{4, 24, 17, 3}}, + {"net.inet6.ip6.log_interval", []_C_int{4, 24, 17, 14}}, + {"net.inet6.ip6.maxdynroutes", []_C_int{4, 24, 17, 48}}, + {"net.inet6.ip6.maxfragpackets", []_C_int{4, 24, 17, 9}}, + {"net.inet6.ip6.maxfrags", []_C_int{4, 24, 17, 41}}, + {"net.inet6.ip6.maxifdefrouters", []_C_int{4, 24, 17, 47}}, + {"net.inet6.ip6.maxifprefixes", []_C_int{4, 24, 17, 46}}, + {"net.inet6.ip6.mforwarding", []_C_int{4, 24, 17, 42}}, + {"net.inet6.ip6.mrtproto", []_C_int{4, 24, 17, 8}}, + {"net.inet6.ip6.mtudisctimeout", []_C_int{4, 24, 17, 50}}, + {"net.inet6.ip6.multicast_mtudisc", []_C_int{4, 24, 17, 44}}, + {"net.inet6.ip6.multipath", []_C_int{4, 24, 17, 43}}, + {"net.inet6.ip6.neighborgcthresh", []_C_int{4, 24, 17, 45}}, + {"net.inet6.ip6.redirect", []_C_int{4, 24, 17, 2}}, + {"net.inet6.ip6.rr_prune", []_C_int{4, 24, 17, 22}}, + {"net.inet6.ip6.sourcecheck", []_C_int{4, 24, 17, 10}}, + {"net.inet6.ip6.sourcecheck_logint", []_C_int{4, 24, 17, 11}}, + {"net.inet6.ip6.use_deprecated", []_C_int{4, 24, 17, 21}}, + {"net.inet6.ip6.v6only", []_C_int{4, 24, 17, 24}}, + {"net.key.sadb_dump", []_C_int{4, 30, 1}}, + {"net.key.spd_dump", []_C_int{4, 30, 2}}, + {"net.mpls.ifq.congestion", []_C_int{4, 33, 3, 4}}, + {"net.mpls.ifq.drops", []_C_int{4, 33, 3, 3}}, + {"net.mpls.ifq.len", []_C_int{4, 33, 3, 1}}, + {"net.mpls.ifq.maxlen", []_C_int{4, 33, 3, 2}}, + {"net.mpls.mapttl_ip", []_C_int{4, 33, 5}}, + {"net.mpls.mapttl_ip6", []_C_int{4, 33, 6}}, + {"net.mpls.maxloop_inkernel", []_C_int{4, 33, 4}}, + {"net.mpls.ttl", []_C_int{4, 33, 2}}, + {"net.pflow.stats", []_C_int{4, 34, 1}}, + {"net.pipex.enable", []_C_int{4, 35, 1}}, + {"vm.anonmin", []_C_int{2, 7}}, + {"vm.loadavg", []_C_int{2, 2}}, + {"vm.maxslp", []_C_int{2, 10}}, + {"vm.nkmempages", []_C_int{2, 6}}, + {"vm.psstrings", []_C_int{2, 3}}, + {"vm.swapencrypt.enable", []_C_int{2, 5, 0}}, + {"vm.swapencrypt.keyscreated", []_C_int{2, 5, 1}}, + {"vm.swapencrypt.keysdeleted", []_C_int{2, 5, 2}}, + {"vm.uspace", []_C_int{2, 11}}, + {"vm.uvmexp", []_C_int{2, 4}}, + {"vm.vmmeter", []_C_int{2, 1}}, + {"vm.vnodemin", []_C_int{2, 9}}, + {"vm.vtextmin", []_C_int{2, 8}}, +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_darwin_386.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_darwin_386.go new file mode 100644 index 00000000..d1d36da3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_darwin_386.go @@ -0,0 +1,436 @@ +// mksysnum_darwin.pl /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/usr/include/sys/syscall.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build 386,darwin + +package unix + +const ( + SYS_SYSCALL = 0 + SYS_EXIT = 1 + SYS_FORK = 2 + SYS_READ = 3 + SYS_WRITE = 4 + SYS_OPEN = 5 + SYS_CLOSE = 6 + SYS_WAIT4 = 7 + SYS_LINK = 9 + SYS_UNLINK = 10 + SYS_CHDIR = 12 + SYS_FCHDIR = 13 + SYS_MKNOD = 14 + SYS_CHMOD = 15 + SYS_CHOWN = 16 + SYS_GETFSSTAT = 18 + SYS_GETPID = 20 + SYS_SETUID = 23 + SYS_GETUID = 24 + SYS_GETEUID = 25 + SYS_PTRACE = 26 + SYS_RECVMSG = 27 + SYS_SENDMSG = 28 + SYS_RECVFROM = 29 + SYS_ACCEPT = 30 + SYS_GETPEERNAME = 31 + SYS_GETSOCKNAME = 32 + SYS_ACCESS = 33 + SYS_CHFLAGS = 34 + SYS_FCHFLAGS = 35 + SYS_SYNC = 36 + SYS_KILL = 37 + SYS_GETPPID = 39 + SYS_DUP = 41 + SYS_PIPE = 42 + SYS_GETEGID = 43 + SYS_SIGACTION = 46 + SYS_GETGID = 47 + SYS_SIGPROCMASK = 48 + SYS_GETLOGIN = 49 + SYS_SETLOGIN = 50 + SYS_ACCT = 51 + SYS_SIGPENDING = 52 + SYS_SIGALTSTACK = 53 + SYS_IOCTL = 54 + SYS_REBOOT = 55 + SYS_REVOKE = 56 + SYS_SYMLINK = 57 + SYS_READLINK = 58 + SYS_EXECVE = 59 + SYS_UMASK = 60 + SYS_CHROOT = 61 + SYS_MSYNC = 65 + SYS_VFORK = 66 + SYS_MUNMAP = 73 + SYS_MPROTECT = 74 + SYS_MADVISE = 75 + SYS_MINCORE = 78 + SYS_GETGROUPS = 79 + SYS_SETGROUPS = 80 + SYS_GETPGRP = 81 + SYS_SETPGID = 82 + SYS_SETITIMER = 83 + SYS_SWAPON = 85 + SYS_GETITIMER = 86 + SYS_GETDTABLESIZE = 89 + SYS_DUP2 = 90 + SYS_FCNTL = 92 + SYS_SELECT = 93 + SYS_FSYNC = 95 + SYS_SETPRIORITY = 96 + SYS_SOCKET = 97 + SYS_CONNECT = 98 + SYS_GETPRIORITY = 100 + SYS_BIND = 104 + SYS_SETSOCKOPT = 105 + SYS_LISTEN = 106 + SYS_SIGSUSPEND = 111 + SYS_GETTIMEOFDAY = 116 + SYS_GETRUSAGE = 117 + SYS_GETSOCKOPT = 118 + SYS_READV = 120 + SYS_WRITEV = 121 + SYS_SETTIMEOFDAY = 122 + SYS_FCHOWN = 123 + SYS_FCHMOD = 124 + SYS_SETREUID = 126 + SYS_SETREGID = 127 + SYS_RENAME = 128 + SYS_FLOCK = 131 + SYS_MKFIFO = 132 + SYS_SENDTO = 133 + SYS_SHUTDOWN = 134 + SYS_SOCKETPAIR = 135 + SYS_MKDIR = 136 + SYS_RMDIR = 137 + SYS_UTIMES = 138 + SYS_FUTIMES = 139 + SYS_ADJTIME = 140 + SYS_GETHOSTUUID = 142 + SYS_SETSID = 147 + SYS_GETPGID = 151 + SYS_SETPRIVEXEC = 152 + SYS_PREAD = 153 + SYS_PWRITE = 154 + SYS_NFSSVC = 155 + SYS_STATFS = 157 + SYS_FSTATFS = 158 + SYS_UNMOUNT = 159 + SYS_GETFH = 161 + SYS_QUOTACTL = 165 + SYS_MOUNT = 167 + SYS_CSOPS = 169 + SYS_CSOPS_AUDITTOKEN = 170 + SYS_WAITID = 173 + SYS_KDEBUG_TYPEFILTER = 177 + SYS_KDEBUG_TRACE_STRING = 178 + SYS_KDEBUG_TRACE64 = 179 + SYS_KDEBUG_TRACE = 180 + SYS_SETGID = 181 + SYS_SETEGID = 182 + SYS_SETEUID = 183 + SYS_SIGRETURN = 184 + SYS_THREAD_SELFCOUNTS = 186 + SYS_FDATASYNC = 187 + SYS_STAT = 188 + SYS_FSTAT = 189 + SYS_LSTAT = 190 + SYS_PATHCONF = 191 + SYS_FPATHCONF = 192 + SYS_GETRLIMIT = 194 + SYS_SETRLIMIT = 195 + SYS_GETDIRENTRIES = 196 + SYS_MMAP = 197 + SYS_LSEEK = 199 + SYS_TRUNCATE = 200 + SYS_FTRUNCATE = 201 + SYS_SYSCTL = 202 + SYS_MLOCK = 203 + SYS_MUNLOCK = 204 + SYS_UNDELETE = 205 + SYS_OPEN_DPROTECTED_NP = 216 + SYS_GETATTRLIST = 220 + SYS_SETATTRLIST = 221 + SYS_GETDIRENTRIESATTR = 222 + SYS_EXCHANGEDATA = 223 + SYS_SEARCHFS = 225 + SYS_DELETE = 226 + SYS_COPYFILE = 227 + SYS_FGETATTRLIST = 228 + SYS_FSETATTRLIST = 229 + SYS_POLL = 230 + SYS_WATCHEVENT = 231 + SYS_WAITEVENT = 232 + SYS_MODWATCH = 233 + SYS_GETXATTR = 234 + SYS_FGETXATTR = 235 + SYS_SETXATTR = 236 + SYS_FSETXATTR = 237 + SYS_REMOVEXATTR = 238 + SYS_FREMOVEXATTR = 239 + SYS_LISTXATTR = 240 + SYS_FLISTXATTR = 241 + SYS_FSCTL = 242 + SYS_INITGROUPS = 243 + SYS_POSIX_SPAWN = 244 + SYS_FFSCTL = 245 + SYS_NFSCLNT = 247 + SYS_FHOPEN = 248 + SYS_MINHERIT = 250 + SYS_SEMSYS = 251 + SYS_MSGSYS = 252 + SYS_SHMSYS = 253 + SYS_SEMCTL = 254 + SYS_SEMGET = 255 + SYS_SEMOP = 256 + SYS_MSGCTL = 258 + SYS_MSGGET = 259 + SYS_MSGSND = 260 + SYS_MSGRCV = 261 + SYS_SHMAT = 262 + SYS_SHMCTL = 263 + SYS_SHMDT = 264 + SYS_SHMGET = 265 + SYS_SHM_OPEN = 266 + SYS_SHM_UNLINK = 267 + SYS_SEM_OPEN = 268 + SYS_SEM_CLOSE = 269 + SYS_SEM_UNLINK = 270 + SYS_SEM_WAIT = 271 + SYS_SEM_TRYWAIT = 272 + SYS_SEM_POST = 273 + SYS_SYSCTLBYNAME = 274 + SYS_OPEN_EXTENDED = 277 + SYS_UMASK_EXTENDED = 278 + SYS_STAT_EXTENDED = 279 + SYS_LSTAT_EXTENDED = 280 + SYS_FSTAT_EXTENDED = 281 + SYS_CHMOD_EXTENDED = 282 + SYS_FCHMOD_EXTENDED = 283 + SYS_ACCESS_EXTENDED = 284 + SYS_SETTID = 285 + SYS_GETTID = 286 + SYS_SETSGROUPS = 287 + SYS_GETSGROUPS = 288 + SYS_SETWGROUPS = 289 + SYS_GETWGROUPS = 290 + SYS_MKFIFO_EXTENDED = 291 + SYS_MKDIR_EXTENDED = 292 + SYS_IDENTITYSVC = 293 + SYS_SHARED_REGION_CHECK_NP = 294 + SYS_VM_PRESSURE_MONITOR = 296 + SYS_PSYNCH_RW_LONGRDLOCK = 297 + SYS_PSYNCH_RW_YIELDWRLOCK = 298 + SYS_PSYNCH_RW_DOWNGRADE = 299 + SYS_PSYNCH_RW_UPGRADE = 300 + SYS_PSYNCH_MUTEXWAIT = 301 + SYS_PSYNCH_MUTEXDROP = 302 + SYS_PSYNCH_CVBROAD = 303 + SYS_PSYNCH_CVSIGNAL = 304 + SYS_PSYNCH_CVWAIT = 305 + SYS_PSYNCH_RW_RDLOCK = 306 + SYS_PSYNCH_RW_WRLOCK = 307 + SYS_PSYNCH_RW_UNLOCK = 308 + SYS_PSYNCH_RW_UNLOCK2 = 309 + SYS_GETSID = 310 + SYS_SETTID_WITH_PID = 311 + SYS_PSYNCH_CVCLRPREPOST = 312 + SYS_AIO_FSYNC = 313 + SYS_AIO_RETURN = 314 + SYS_AIO_SUSPEND = 315 + SYS_AIO_CANCEL = 316 + SYS_AIO_ERROR = 317 + SYS_AIO_READ = 318 + SYS_AIO_WRITE = 319 + SYS_LIO_LISTIO = 320 + SYS_IOPOLICYSYS = 322 + SYS_PROCESS_POLICY = 323 + SYS_MLOCKALL = 324 + SYS_MUNLOCKALL = 325 + SYS_ISSETUGID = 327 + SYS___PTHREAD_KILL = 328 + SYS___PTHREAD_SIGMASK = 329 + SYS___SIGWAIT = 330 + SYS___DISABLE_THREADSIGNAL = 331 + SYS___PTHREAD_MARKCANCEL = 332 + SYS___PTHREAD_CANCELED = 333 + SYS___SEMWAIT_SIGNAL = 334 + SYS_PROC_INFO = 336 + SYS_SENDFILE = 337 + SYS_STAT64 = 338 + SYS_FSTAT64 = 339 + SYS_LSTAT64 = 340 + SYS_STAT64_EXTENDED = 341 + SYS_LSTAT64_EXTENDED = 342 + SYS_FSTAT64_EXTENDED = 343 + SYS_GETDIRENTRIES64 = 344 + SYS_STATFS64 = 345 + SYS_FSTATFS64 = 346 + SYS_GETFSSTAT64 = 347 + SYS___PTHREAD_CHDIR = 348 + SYS___PTHREAD_FCHDIR = 349 + SYS_AUDIT = 350 + SYS_AUDITON = 351 + SYS_GETAUID = 353 + SYS_SETAUID = 354 + SYS_GETAUDIT_ADDR = 357 + SYS_SETAUDIT_ADDR = 358 + SYS_AUDITCTL = 359 + SYS_BSDTHREAD_CREATE = 360 + SYS_BSDTHREAD_TERMINATE = 361 + SYS_KQUEUE = 362 + SYS_KEVENT = 363 + SYS_LCHOWN = 364 + SYS_BSDTHREAD_REGISTER = 366 + SYS_WORKQ_OPEN = 367 + SYS_WORKQ_KERNRETURN = 368 + SYS_KEVENT64 = 369 + SYS___OLD_SEMWAIT_SIGNAL = 370 + SYS___OLD_SEMWAIT_SIGNAL_NOCANCEL = 371 + SYS_THREAD_SELFID = 372 + SYS_LEDGER = 373 + SYS_KEVENT_QOS = 374 + SYS_KEVENT_ID = 375 + SYS___MAC_EXECVE = 380 + SYS___MAC_SYSCALL = 381 + SYS___MAC_GET_FILE = 382 + SYS___MAC_SET_FILE = 383 + SYS___MAC_GET_LINK = 384 + SYS___MAC_SET_LINK = 385 + SYS___MAC_GET_PROC = 386 + SYS___MAC_SET_PROC = 387 + SYS___MAC_GET_FD = 388 + SYS___MAC_SET_FD = 389 + SYS___MAC_GET_PID = 390 + SYS_PSELECT = 394 + SYS_PSELECT_NOCANCEL = 395 + SYS_READ_NOCANCEL = 396 + SYS_WRITE_NOCANCEL = 397 + SYS_OPEN_NOCANCEL = 398 + SYS_CLOSE_NOCANCEL = 399 + SYS_WAIT4_NOCANCEL = 400 + SYS_RECVMSG_NOCANCEL = 401 + SYS_SENDMSG_NOCANCEL = 402 + SYS_RECVFROM_NOCANCEL = 403 + SYS_ACCEPT_NOCANCEL = 404 + SYS_MSYNC_NOCANCEL = 405 + SYS_FCNTL_NOCANCEL = 406 + SYS_SELECT_NOCANCEL = 407 + SYS_FSYNC_NOCANCEL = 408 + SYS_CONNECT_NOCANCEL = 409 + SYS_SIGSUSPEND_NOCANCEL = 410 + SYS_READV_NOCANCEL = 411 + SYS_WRITEV_NOCANCEL = 412 + SYS_SENDTO_NOCANCEL = 413 + SYS_PREAD_NOCANCEL = 414 + SYS_PWRITE_NOCANCEL = 415 + SYS_WAITID_NOCANCEL = 416 + SYS_POLL_NOCANCEL = 417 + SYS_MSGSND_NOCANCEL = 418 + SYS_MSGRCV_NOCANCEL = 419 + SYS_SEM_WAIT_NOCANCEL = 420 + SYS_AIO_SUSPEND_NOCANCEL = 421 + SYS___SIGWAIT_NOCANCEL = 422 + SYS___SEMWAIT_SIGNAL_NOCANCEL = 423 + SYS___MAC_MOUNT = 424 + SYS___MAC_GET_MOUNT = 425 + SYS___MAC_GETFSSTAT = 426 + SYS_FSGETPATH = 427 + SYS_AUDIT_SESSION_SELF = 428 + SYS_AUDIT_SESSION_JOIN = 429 + SYS_FILEPORT_MAKEPORT = 430 + SYS_FILEPORT_MAKEFD = 431 + SYS_AUDIT_SESSION_PORT = 432 + SYS_PID_SUSPEND = 433 + SYS_PID_RESUME = 434 + SYS_PID_HIBERNATE = 435 + SYS_PID_SHUTDOWN_SOCKETS = 436 + SYS_SHARED_REGION_MAP_AND_SLIDE_NP = 438 + SYS_KAS_INFO = 439 + SYS_MEMORYSTATUS_CONTROL = 440 + SYS_GUARDED_OPEN_NP = 441 + SYS_GUARDED_CLOSE_NP = 442 + SYS_GUARDED_KQUEUE_NP = 443 + SYS_CHANGE_FDGUARD_NP = 444 + SYS_USRCTL = 445 + SYS_PROC_RLIMIT_CONTROL = 446 + SYS_CONNECTX = 447 + SYS_DISCONNECTX = 448 + SYS_PEELOFF = 449 + SYS_SOCKET_DELEGATE = 450 + SYS_TELEMETRY = 451 + SYS_PROC_UUID_POLICY = 452 + SYS_MEMORYSTATUS_GET_LEVEL = 453 + SYS_SYSTEM_OVERRIDE = 454 + SYS_VFS_PURGE = 455 + SYS_SFI_CTL = 456 + SYS_SFI_PIDCTL = 457 + SYS_COALITION = 458 + SYS_COALITION_INFO = 459 + SYS_NECP_MATCH_POLICY = 460 + SYS_GETATTRLISTBULK = 461 + SYS_CLONEFILEAT = 462 + SYS_OPENAT = 463 + SYS_OPENAT_NOCANCEL = 464 + SYS_RENAMEAT = 465 + SYS_FACCESSAT = 466 + SYS_FCHMODAT = 467 + SYS_FCHOWNAT = 468 + SYS_FSTATAT = 469 + SYS_FSTATAT64 = 470 + SYS_LINKAT = 471 + SYS_UNLINKAT = 472 + SYS_READLINKAT = 473 + SYS_SYMLINKAT = 474 + SYS_MKDIRAT = 475 + SYS_GETATTRLISTAT = 476 + SYS_PROC_TRACE_LOG = 477 + SYS_BSDTHREAD_CTL = 478 + SYS_OPENBYID_NP = 479 + SYS_RECVMSG_X = 480 + SYS_SENDMSG_X = 481 + SYS_THREAD_SELFUSAGE = 482 + SYS_CSRCTL = 483 + SYS_GUARDED_OPEN_DPROTECTED_NP = 484 + SYS_GUARDED_WRITE_NP = 485 + SYS_GUARDED_PWRITE_NP = 486 + SYS_GUARDED_WRITEV_NP = 487 + SYS_RENAMEATX_NP = 488 + SYS_MREMAP_ENCRYPTED = 489 + SYS_NETAGENT_TRIGGER = 490 + SYS_STACK_SNAPSHOT_WITH_CONFIG = 491 + SYS_MICROSTACKSHOT = 492 + SYS_GRAB_PGO_DATA = 493 + SYS_PERSONA = 494 + SYS_WORK_INTERVAL_CTL = 499 + SYS_GETENTROPY = 500 + SYS_NECP_OPEN = 501 + SYS_NECP_CLIENT_ACTION = 502 + SYS___NEXUS_OPEN = 503 + SYS___NEXUS_REGISTER = 504 + SYS___NEXUS_DEREGISTER = 505 + SYS___NEXUS_CREATE = 506 + SYS___NEXUS_DESTROY = 507 + SYS___NEXUS_GET_OPT = 508 + SYS___NEXUS_SET_OPT = 509 + SYS___CHANNEL_OPEN = 510 + SYS___CHANNEL_GET_INFO = 511 + SYS___CHANNEL_SYNC = 512 + SYS___CHANNEL_GET_OPT = 513 + SYS___CHANNEL_SET_OPT = 514 + SYS_ULOCK_WAIT = 515 + SYS_ULOCK_WAKE = 516 + SYS_FCLONEFILEAT = 517 + SYS_FS_SNAPSHOT = 518 + SYS_TERMINATE_WITH_PAYLOAD = 520 + SYS_ABORT_WITH_PAYLOAD = 521 + SYS_NECP_SESSION_OPEN = 522 + SYS_NECP_SESSION_ACTION = 523 + SYS_SETATTRLISTAT = 524 + SYS_NET_QOS_GUIDELINE = 525 + SYS_FMOUNT = 526 + SYS_NTP_ADJTIME = 527 + SYS_NTP_GETTIME = 528 + SYS_OS_FAULT_WITH_PAYLOAD = 529 + SYS_MAXSYSCALL = 530 + SYS_INVALID = 63 +) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go new file mode 100644 index 00000000..e35de414 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go @@ -0,0 +1,436 @@ +// mksysnum_darwin.pl /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/usr/include/sys/syscall.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,darwin + +package unix + +const ( + SYS_SYSCALL = 0 + SYS_EXIT = 1 + SYS_FORK = 2 + SYS_READ = 3 + SYS_WRITE = 4 + SYS_OPEN = 5 + SYS_CLOSE = 6 + SYS_WAIT4 = 7 + SYS_LINK = 9 + SYS_UNLINK = 10 + SYS_CHDIR = 12 + SYS_FCHDIR = 13 + SYS_MKNOD = 14 + SYS_CHMOD = 15 + SYS_CHOWN = 16 + SYS_GETFSSTAT = 18 + SYS_GETPID = 20 + SYS_SETUID = 23 + SYS_GETUID = 24 + SYS_GETEUID = 25 + SYS_PTRACE = 26 + SYS_RECVMSG = 27 + SYS_SENDMSG = 28 + SYS_RECVFROM = 29 + SYS_ACCEPT = 30 + SYS_GETPEERNAME = 31 + SYS_GETSOCKNAME = 32 + SYS_ACCESS = 33 + SYS_CHFLAGS = 34 + SYS_FCHFLAGS = 35 + SYS_SYNC = 36 + SYS_KILL = 37 + SYS_GETPPID = 39 + SYS_DUP = 41 + SYS_PIPE = 42 + SYS_GETEGID = 43 + SYS_SIGACTION = 46 + SYS_GETGID = 47 + SYS_SIGPROCMASK = 48 + SYS_GETLOGIN = 49 + SYS_SETLOGIN = 50 + SYS_ACCT = 51 + SYS_SIGPENDING = 52 + SYS_SIGALTSTACK = 53 + SYS_IOCTL = 54 + SYS_REBOOT = 55 + SYS_REVOKE = 56 + SYS_SYMLINK = 57 + SYS_READLINK = 58 + SYS_EXECVE = 59 + SYS_UMASK = 60 + SYS_CHROOT = 61 + SYS_MSYNC = 65 + SYS_VFORK = 66 + SYS_MUNMAP = 73 + SYS_MPROTECT = 74 + SYS_MADVISE = 75 + SYS_MINCORE = 78 + SYS_GETGROUPS = 79 + SYS_SETGROUPS = 80 + SYS_GETPGRP = 81 + SYS_SETPGID = 82 + SYS_SETITIMER = 83 + SYS_SWAPON = 85 + SYS_GETITIMER = 86 + SYS_GETDTABLESIZE = 89 + SYS_DUP2 = 90 + SYS_FCNTL = 92 + SYS_SELECT = 93 + SYS_FSYNC = 95 + SYS_SETPRIORITY = 96 + SYS_SOCKET = 97 + SYS_CONNECT = 98 + SYS_GETPRIORITY = 100 + SYS_BIND = 104 + SYS_SETSOCKOPT = 105 + SYS_LISTEN = 106 + SYS_SIGSUSPEND = 111 + SYS_GETTIMEOFDAY = 116 + SYS_GETRUSAGE = 117 + SYS_GETSOCKOPT = 118 + SYS_READV = 120 + SYS_WRITEV = 121 + SYS_SETTIMEOFDAY = 122 + SYS_FCHOWN = 123 + SYS_FCHMOD = 124 + SYS_SETREUID = 126 + SYS_SETREGID = 127 + SYS_RENAME = 128 + SYS_FLOCK = 131 + SYS_MKFIFO = 132 + SYS_SENDTO = 133 + SYS_SHUTDOWN = 134 + SYS_SOCKETPAIR = 135 + SYS_MKDIR = 136 + SYS_RMDIR = 137 + SYS_UTIMES = 138 + SYS_FUTIMES = 139 + SYS_ADJTIME = 140 + SYS_GETHOSTUUID = 142 + SYS_SETSID = 147 + SYS_GETPGID = 151 + SYS_SETPRIVEXEC = 152 + SYS_PREAD = 153 + SYS_PWRITE = 154 + SYS_NFSSVC = 155 + SYS_STATFS = 157 + SYS_FSTATFS = 158 + SYS_UNMOUNT = 159 + SYS_GETFH = 161 + SYS_QUOTACTL = 165 + SYS_MOUNT = 167 + SYS_CSOPS = 169 + SYS_CSOPS_AUDITTOKEN = 170 + SYS_WAITID = 173 + SYS_KDEBUG_TYPEFILTER = 177 + SYS_KDEBUG_TRACE_STRING = 178 + SYS_KDEBUG_TRACE64 = 179 + SYS_KDEBUG_TRACE = 180 + SYS_SETGID = 181 + SYS_SETEGID = 182 + SYS_SETEUID = 183 + SYS_SIGRETURN = 184 + SYS_THREAD_SELFCOUNTS = 186 + SYS_FDATASYNC = 187 + SYS_STAT = 188 + SYS_FSTAT = 189 + SYS_LSTAT = 190 + SYS_PATHCONF = 191 + SYS_FPATHCONF = 192 + SYS_GETRLIMIT = 194 + SYS_SETRLIMIT = 195 + SYS_GETDIRENTRIES = 196 + SYS_MMAP = 197 + SYS_LSEEK = 199 + SYS_TRUNCATE = 200 + SYS_FTRUNCATE = 201 + SYS_SYSCTL = 202 + SYS_MLOCK = 203 + SYS_MUNLOCK = 204 + SYS_UNDELETE = 205 + SYS_OPEN_DPROTECTED_NP = 216 + SYS_GETATTRLIST = 220 + SYS_SETATTRLIST = 221 + SYS_GETDIRENTRIESATTR = 222 + SYS_EXCHANGEDATA = 223 + SYS_SEARCHFS = 225 + SYS_DELETE = 226 + SYS_COPYFILE = 227 + SYS_FGETATTRLIST = 228 + SYS_FSETATTRLIST = 229 + SYS_POLL = 230 + SYS_WATCHEVENT = 231 + SYS_WAITEVENT = 232 + SYS_MODWATCH = 233 + SYS_GETXATTR = 234 + SYS_FGETXATTR = 235 + SYS_SETXATTR = 236 + SYS_FSETXATTR = 237 + SYS_REMOVEXATTR = 238 + SYS_FREMOVEXATTR = 239 + SYS_LISTXATTR = 240 + SYS_FLISTXATTR = 241 + SYS_FSCTL = 242 + SYS_INITGROUPS = 243 + SYS_POSIX_SPAWN = 244 + SYS_FFSCTL = 245 + SYS_NFSCLNT = 247 + SYS_FHOPEN = 248 + SYS_MINHERIT = 250 + SYS_SEMSYS = 251 + SYS_MSGSYS = 252 + SYS_SHMSYS = 253 + SYS_SEMCTL = 254 + SYS_SEMGET = 255 + SYS_SEMOP = 256 + SYS_MSGCTL = 258 + SYS_MSGGET = 259 + SYS_MSGSND = 260 + SYS_MSGRCV = 261 + SYS_SHMAT = 262 + SYS_SHMCTL = 263 + SYS_SHMDT = 264 + SYS_SHMGET = 265 + SYS_SHM_OPEN = 266 + SYS_SHM_UNLINK = 267 + SYS_SEM_OPEN = 268 + SYS_SEM_CLOSE = 269 + SYS_SEM_UNLINK = 270 + SYS_SEM_WAIT = 271 + SYS_SEM_TRYWAIT = 272 + SYS_SEM_POST = 273 + SYS_SYSCTLBYNAME = 274 + SYS_OPEN_EXTENDED = 277 + SYS_UMASK_EXTENDED = 278 + SYS_STAT_EXTENDED = 279 + SYS_LSTAT_EXTENDED = 280 + SYS_FSTAT_EXTENDED = 281 + SYS_CHMOD_EXTENDED = 282 + SYS_FCHMOD_EXTENDED = 283 + SYS_ACCESS_EXTENDED = 284 + SYS_SETTID = 285 + SYS_GETTID = 286 + SYS_SETSGROUPS = 287 + SYS_GETSGROUPS = 288 + SYS_SETWGROUPS = 289 + SYS_GETWGROUPS = 290 + SYS_MKFIFO_EXTENDED = 291 + SYS_MKDIR_EXTENDED = 292 + SYS_IDENTITYSVC = 293 + SYS_SHARED_REGION_CHECK_NP = 294 + SYS_VM_PRESSURE_MONITOR = 296 + SYS_PSYNCH_RW_LONGRDLOCK = 297 + SYS_PSYNCH_RW_YIELDWRLOCK = 298 + SYS_PSYNCH_RW_DOWNGRADE = 299 + SYS_PSYNCH_RW_UPGRADE = 300 + SYS_PSYNCH_MUTEXWAIT = 301 + SYS_PSYNCH_MUTEXDROP = 302 + SYS_PSYNCH_CVBROAD = 303 + SYS_PSYNCH_CVSIGNAL = 304 + SYS_PSYNCH_CVWAIT = 305 + SYS_PSYNCH_RW_RDLOCK = 306 + SYS_PSYNCH_RW_WRLOCK = 307 + SYS_PSYNCH_RW_UNLOCK = 308 + SYS_PSYNCH_RW_UNLOCK2 = 309 + SYS_GETSID = 310 + SYS_SETTID_WITH_PID = 311 + SYS_PSYNCH_CVCLRPREPOST = 312 + SYS_AIO_FSYNC = 313 + SYS_AIO_RETURN = 314 + SYS_AIO_SUSPEND = 315 + SYS_AIO_CANCEL = 316 + SYS_AIO_ERROR = 317 + SYS_AIO_READ = 318 + SYS_AIO_WRITE = 319 + SYS_LIO_LISTIO = 320 + SYS_IOPOLICYSYS = 322 + SYS_PROCESS_POLICY = 323 + SYS_MLOCKALL = 324 + SYS_MUNLOCKALL = 325 + SYS_ISSETUGID = 327 + SYS___PTHREAD_KILL = 328 + SYS___PTHREAD_SIGMASK = 329 + SYS___SIGWAIT = 330 + SYS___DISABLE_THREADSIGNAL = 331 + SYS___PTHREAD_MARKCANCEL = 332 + SYS___PTHREAD_CANCELED = 333 + SYS___SEMWAIT_SIGNAL = 334 + SYS_PROC_INFO = 336 + SYS_SENDFILE = 337 + SYS_STAT64 = 338 + SYS_FSTAT64 = 339 + SYS_LSTAT64 = 340 + SYS_STAT64_EXTENDED = 341 + SYS_LSTAT64_EXTENDED = 342 + SYS_FSTAT64_EXTENDED = 343 + SYS_GETDIRENTRIES64 = 344 + SYS_STATFS64 = 345 + SYS_FSTATFS64 = 346 + SYS_GETFSSTAT64 = 347 + SYS___PTHREAD_CHDIR = 348 + SYS___PTHREAD_FCHDIR = 349 + SYS_AUDIT = 350 + SYS_AUDITON = 351 + SYS_GETAUID = 353 + SYS_SETAUID = 354 + SYS_GETAUDIT_ADDR = 357 + SYS_SETAUDIT_ADDR = 358 + SYS_AUDITCTL = 359 + SYS_BSDTHREAD_CREATE = 360 + SYS_BSDTHREAD_TERMINATE = 361 + SYS_KQUEUE = 362 + SYS_KEVENT = 363 + SYS_LCHOWN = 364 + SYS_BSDTHREAD_REGISTER = 366 + SYS_WORKQ_OPEN = 367 + SYS_WORKQ_KERNRETURN = 368 + SYS_KEVENT64 = 369 + SYS___OLD_SEMWAIT_SIGNAL = 370 + SYS___OLD_SEMWAIT_SIGNAL_NOCANCEL = 371 + SYS_THREAD_SELFID = 372 + SYS_LEDGER = 373 + SYS_KEVENT_QOS = 374 + SYS_KEVENT_ID = 375 + SYS___MAC_EXECVE = 380 + SYS___MAC_SYSCALL = 381 + SYS___MAC_GET_FILE = 382 + SYS___MAC_SET_FILE = 383 + SYS___MAC_GET_LINK = 384 + SYS___MAC_SET_LINK = 385 + SYS___MAC_GET_PROC = 386 + SYS___MAC_SET_PROC = 387 + SYS___MAC_GET_FD = 388 + SYS___MAC_SET_FD = 389 + SYS___MAC_GET_PID = 390 + SYS_PSELECT = 394 + SYS_PSELECT_NOCANCEL = 395 + SYS_READ_NOCANCEL = 396 + SYS_WRITE_NOCANCEL = 397 + SYS_OPEN_NOCANCEL = 398 + SYS_CLOSE_NOCANCEL = 399 + SYS_WAIT4_NOCANCEL = 400 + SYS_RECVMSG_NOCANCEL = 401 + SYS_SENDMSG_NOCANCEL = 402 + SYS_RECVFROM_NOCANCEL = 403 + SYS_ACCEPT_NOCANCEL = 404 + SYS_MSYNC_NOCANCEL = 405 + SYS_FCNTL_NOCANCEL = 406 + SYS_SELECT_NOCANCEL = 407 + SYS_FSYNC_NOCANCEL = 408 + SYS_CONNECT_NOCANCEL = 409 + SYS_SIGSUSPEND_NOCANCEL = 410 + SYS_READV_NOCANCEL = 411 + SYS_WRITEV_NOCANCEL = 412 + SYS_SENDTO_NOCANCEL = 413 + SYS_PREAD_NOCANCEL = 414 + SYS_PWRITE_NOCANCEL = 415 + SYS_WAITID_NOCANCEL = 416 + SYS_POLL_NOCANCEL = 417 + SYS_MSGSND_NOCANCEL = 418 + SYS_MSGRCV_NOCANCEL = 419 + SYS_SEM_WAIT_NOCANCEL = 420 + SYS_AIO_SUSPEND_NOCANCEL = 421 + SYS___SIGWAIT_NOCANCEL = 422 + SYS___SEMWAIT_SIGNAL_NOCANCEL = 423 + SYS___MAC_MOUNT = 424 + SYS___MAC_GET_MOUNT = 425 + SYS___MAC_GETFSSTAT = 426 + SYS_FSGETPATH = 427 + SYS_AUDIT_SESSION_SELF = 428 + SYS_AUDIT_SESSION_JOIN = 429 + SYS_FILEPORT_MAKEPORT = 430 + SYS_FILEPORT_MAKEFD = 431 + SYS_AUDIT_SESSION_PORT = 432 + SYS_PID_SUSPEND = 433 + SYS_PID_RESUME = 434 + SYS_PID_HIBERNATE = 435 + SYS_PID_SHUTDOWN_SOCKETS = 436 + SYS_SHARED_REGION_MAP_AND_SLIDE_NP = 438 + SYS_KAS_INFO = 439 + SYS_MEMORYSTATUS_CONTROL = 440 + SYS_GUARDED_OPEN_NP = 441 + SYS_GUARDED_CLOSE_NP = 442 + SYS_GUARDED_KQUEUE_NP = 443 + SYS_CHANGE_FDGUARD_NP = 444 + SYS_USRCTL = 445 + SYS_PROC_RLIMIT_CONTROL = 446 + SYS_CONNECTX = 447 + SYS_DISCONNECTX = 448 + SYS_PEELOFF = 449 + SYS_SOCKET_DELEGATE = 450 + SYS_TELEMETRY = 451 + SYS_PROC_UUID_POLICY = 452 + SYS_MEMORYSTATUS_GET_LEVEL = 453 + SYS_SYSTEM_OVERRIDE = 454 + SYS_VFS_PURGE = 455 + SYS_SFI_CTL = 456 + SYS_SFI_PIDCTL = 457 + SYS_COALITION = 458 + SYS_COALITION_INFO = 459 + SYS_NECP_MATCH_POLICY = 460 + SYS_GETATTRLISTBULK = 461 + SYS_CLONEFILEAT = 462 + SYS_OPENAT = 463 + SYS_OPENAT_NOCANCEL = 464 + SYS_RENAMEAT = 465 + SYS_FACCESSAT = 466 + SYS_FCHMODAT = 467 + SYS_FCHOWNAT = 468 + SYS_FSTATAT = 469 + SYS_FSTATAT64 = 470 + SYS_LINKAT = 471 + SYS_UNLINKAT = 472 + SYS_READLINKAT = 473 + SYS_SYMLINKAT = 474 + SYS_MKDIRAT = 475 + SYS_GETATTRLISTAT = 476 + SYS_PROC_TRACE_LOG = 477 + SYS_BSDTHREAD_CTL = 478 + SYS_OPENBYID_NP = 479 + SYS_RECVMSG_X = 480 + SYS_SENDMSG_X = 481 + SYS_THREAD_SELFUSAGE = 482 + SYS_CSRCTL = 483 + SYS_GUARDED_OPEN_DPROTECTED_NP = 484 + SYS_GUARDED_WRITE_NP = 485 + SYS_GUARDED_PWRITE_NP = 486 + SYS_GUARDED_WRITEV_NP = 487 + SYS_RENAMEATX_NP = 488 + SYS_MREMAP_ENCRYPTED = 489 + SYS_NETAGENT_TRIGGER = 490 + SYS_STACK_SNAPSHOT_WITH_CONFIG = 491 + SYS_MICROSTACKSHOT = 492 + SYS_GRAB_PGO_DATA = 493 + SYS_PERSONA = 494 + SYS_WORK_INTERVAL_CTL = 499 + SYS_GETENTROPY = 500 + SYS_NECP_OPEN = 501 + SYS_NECP_CLIENT_ACTION = 502 + SYS___NEXUS_OPEN = 503 + SYS___NEXUS_REGISTER = 504 + SYS___NEXUS_DEREGISTER = 505 + SYS___NEXUS_CREATE = 506 + SYS___NEXUS_DESTROY = 507 + SYS___NEXUS_GET_OPT = 508 + SYS___NEXUS_SET_OPT = 509 + SYS___CHANNEL_OPEN = 510 + SYS___CHANNEL_GET_INFO = 511 + SYS___CHANNEL_SYNC = 512 + SYS___CHANNEL_GET_OPT = 513 + SYS___CHANNEL_SET_OPT = 514 + SYS_ULOCK_WAIT = 515 + SYS_ULOCK_WAKE = 516 + SYS_FCLONEFILEAT = 517 + SYS_FS_SNAPSHOT = 518 + SYS_TERMINATE_WITH_PAYLOAD = 520 + SYS_ABORT_WITH_PAYLOAD = 521 + SYS_NECP_SESSION_OPEN = 522 + SYS_NECP_SESSION_ACTION = 523 + SYS_SETATTRLISTAT = 524 + SYS_NET_QOS_GUIDELINE = 525 + SYS_FMOUNT = 526 + SYS_NTP_ADJTIME = 527 + SYS_NTP_GETTIME = 528 + SYS_OS_FAULT_WITH_PAYLOAD = 529 + SYS_MAXSYSCALL = 530 + SYS_INVALID = 63 +) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm.go new file mode 100644 index 00000000..f2df27db --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm.go @@ -0,0 +1,436 @@ +// mksysnum_darwin.pl /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.1.sdk/usr/include/sys/syscall.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm,darwin + +package unix + +const ( + SYS_SYSCALL = 0 + SYS_EXIT = 1 + SYS_FORK = 2 + SYS_READ = 3 + SYS_WRITE = 4 + SYS_OPEN = 5 + SYS_CLOSE = 6 + SYS_WAIT4 = 7 + SYS_LINK = 9 + SYS_UNLINK = 10 + SYS_CHDIR = 12 + SYS_FCHDIR = 13 + SYS_MKNOD = 14 + SYS_CHMOD = 15 + SYS_CHOWN = 16 + SYS_GETFSSTAT = 18 + SYS_GETPID = 20 + SYS_SETUID = 23 + SYS_GETUID = 24 + SYS_GETEUID = 25 + SYS_PTRACE = 26 + SYS_RECVMSG = 27 + SYS_SENDMSG = 28 + SYS_RECVFROM = 29 + SYS_ACCEPT = 30 + SYS_GETPEERNAME = 31 + SYS_GETSOCKNAME = 32 + SYS_ACCESS = 33 + SYS_CHFLAGS = 34 + SYS_FCHFLAGS = 35 + SYS_SYNC = 36 + SYS_KILL = 37 + SYS_GETPPID = 39 + SYS_DUP = 41 + SYS_PIPE = 42 + SYS_GETEGID = 43 + SYS_SIGACTION = 46 + SYS_GETGID = 47 + SYS_SIGPROCMASK = 48 + SYS_GETLOGIN = 49 + SYS_SETLOGIN = 50 + SYS_ACCT = 51 + SYS_SIGPENDING = 52 + SYS_SIGALTSTACK = 53 + SYS_IOCTL = 54 + SYS_REBOOT = 55 + SYS_REVOKE = 56 + SYS_SYMLINK = 57 + SYS_READLINK = 58 + SYS_EXECVE = 59 + SYS_UMASK = 60 + SYS_CHROOT = 61 + SYS_MSYNC = 65 + SYS_VFORK = 66 + SYS_MUNMAP = 73 + SYS_MPROTECT = 74 + SYS_MADVISE = 75 + SYS_MINCORE = 78 + SYS_GETGROUPS = 79 + SYS_SETGROUPS = 80 + SYS_GETPGRP = 81 + SYS_SETPGID = 82 + SYS_SETITIMER = 83 + SYS_SWAPON = 85 + SYS_GETITIMER = 86 + SYS_GETDTABLESIZE = 89 + SYS_DUP2 = 90 + SYS_FCNTL = 92 + SYS_SELECT = 93 + SYS_FSYNC = 95 + SYS_SETPRIORITY = 96 + SYS_SOCKET = 97 + SYS_CONNECT = 98 + SYS_GETPRIORITY = 100 + SYS_BIND = 104 + SYS_SETSOCKOPT = 105 + SYS_LISTEN = 106 + SYS_SIGSUSPEND = 111 + SYS_GETTIMEOFDAY = 116 + SYS_GETRUSAGE = 117 + SYS_GETSOCKOPT = 118 + SYS_READV = 120 + SYS_WRITEV = 121 + SYS_SETTIMEOFDAY = 122 + SYS_FCHOWN = 123 + SYS_FCHMOD = 124 + SYS_SETREUID = 126 + SYS_SETREGID = 127 + SYS_RENAME = 128 + SYS_FLOCK = 131 + SYS_MKFIFO = 132 + SYS_SENDTO = 133 + SYS_SHUTDOWN = 134 + SYS_SOCKETPAIR = 135 + SYS_MKDIR = 136 + SYS_RMDIR = 137 + SYS_UTIMES = 138 + SYS_FUTIMES = 139 + SYS_ADJTIME = 140 + SYS_GETHOSTUUID = 142 + SYS_SETSID = 147 + SYS_GETPGID = 151 + SYS_SETPRIVEXEC = 152 + SYS_PREAD = 153 + SYS_PWRITE = 154 + SYS_NFSSVC = 155 + SYS_STATFS = 157 + SYS_FSTATFS = 158 + SYS_UNMOUNT = 159 + SYS_GETFH = 161 + SYS_QUOTACTL = 165 + SYS_MOUNT = 167 + SYS_CSOPS = 169 + SYS_CSOPS_AUDITTOKEN = 170 + SYS_WAITID = 173 + SYS_KDEBUG_TYPEFILTER = 177 + SYS_KDEBUG_TRACE_STRING = 178 + SYS_KDEBUG_TRACE64 = 179 + SYS_KDEBUG_TRACE = 180 + SYS_SETGID = 181 + SYS_SETEGID = 182 + SYS_SETEUID = 183 + SYS_SIGRETURN = 184 + SYS_THREAD_SELFCOUNTS = 186 + SYS_FDATASYNC = 187 + SYS_STAT = 188 + SYS_FSTAT = 189 + SYS_LSTAT = 190 + SYS_PATHCONF = 191 + SYS_FPATHCONF = 192 + SYS_GETRLIMIT = 194 + SYS_SETRLIMIT = 195 + SYS_GETDIRENTRIES = 196 + SYS_MMAP = 197 + SYS_LSEEK = 199 + SYS_TRUNCATE = 200 + SYS_FTRUNCATE = 201 + SYS_SYSCTL = 202 + SYS_MLOCK = 203 + SYS_MUNLOCK = 204 + SYS_UNDELETE = 205 + SYS_OPEN_DPROTECTED_NP = 216 + SYS_GETATTRLIST = 220 + SYS_SETATTRLIST = 221 + SYS_GETDIRENTRIESATTR = 222 + SYS_EXCHANGEDATA = 223 + SYS_SEARCHFS = 225 + SYS_DELETE = 226 + SYS_COPYFILE = 227 + SYS_FGETATTRLIST = 228 + SYS_FSETATTRLIST = 229 + SYS_POLL = 230 + SYS_WATCHEVENT = 231 + SYS_WAITEVENT = 232 + SYS_MODWATCH = 233 + SYS_GETXATTR = 234 + SYS_FGETXATTR = 235 + SYS_SETXATTR = 236 + SYS_FSETXATTR = 237 + SYS_REMOVEXATTR = 238 + SYS_FREMOVEXATTR = 239 + SYS_LISTXATTR = 240 + SYS_FLISTXATTR = 241 + SYS_FSCTL = 242 + SYS_INITGROUPS = 243 + SYS_POSIX_SPAWN = 244 + SYS_FFSCTL = 245 + SYS_NFSCLNT = 247 + SYS_FHOPEN = 248 + SYS_MINHERIT = 250 + SYS_SEMSYS = 251 + SYS_MSGSYS = 252 + SYS_SHMSYS = 253 + SYS_SEMCTL = 254 + SYS_SEMGET = 255 + SYS_SEMOP = 256 + SYS_MSGCTL = 258 + SYS_MSGGET = 259 + SYS_MSGSND = 260 + SYS_MSGRCV = 261 + SYS_SHMAT = 262 + SYS_SHMCTL = 263 + SYS_SHMDT = 264 + SYS_SHMGET = 265 + SYS_SHM_OPEN = 266 + SYS_SHM_UNLINK = 267 + SYS_SEM_OPEN = 268 + SYS_SEM_CLOSE = 269 + SYS_SEM_UNLINK = 270 + SYS_SEM_WAIT = 271 + SYS_SEM_TRYWAIT = 272 + SYS_SEM_POST = 273 + SYS_SYSCTLBYNAME = 274 + SYS_OPEN_EXTENDED = 277 + SYS_UMASK_EXTENDED = 278 + SYS_STAT_EXTENDED = 279 + SYS_LSTAT_EXTENDED = 280 + SYS_FSTAT_EXTENDED = 281 + SYS_CHMOD_EXTENDED = 282 + SYS_FCHMOD_EXTENDED = 283 + SYS_ACCESS_EXTENDED = 284 + SYS_SETTID = 285 + SYS_GETTID = 286 + SYS_SETSGROUPS = 287 + SYS_GETSGROUPS = 288 + SYS_SETWGROUPS = 289 + SYS_GETWGROUPS = 290 + SYS_MKFIFO_EXTENDED = 291 + SYS_MKDIR_EXTENDED = 292 + SYS_IDENTITYSVC = 293 + SYS_SHARED_REGION_CHECK_NP = 294 + SYS_VM_PRESSURE_MONITOR = 296 + SYS_PSYNCH_RW_LONGRDLOCK = 297 + SYS_PSYNCH_RW_YIELDWRLOCK = 298 + SYS_PSYNCH_RW_DOWNGRADE = 299 + SYS_PSYNCH_RW_UPGRADE = 300 + SYS_PSYNCH_MUTEXWAIT = 301 + SYS_PSYNCH_MUTEXDROP = 302 + SYS_PSYNCH_CVBROAD = 303 + SYS_PSYNCH_CVSIGNAL = 304 + SYS_PSYNCH_CVWAIT = 305 + SYS_PSYNCH_RW_RDLOCK = 306 + SYS_PSYNCH_RW_WRLOCK = 307 + SYS_PSYNCH_RW_UNLOCK = 308 + SYS_PSYNCH_RW_UNLOCK2 = 309 + SYS_GETSID = 310 + SYS_SETTID_WITH_PID = 311 + SYS_PSYNCH_CVCLRPREPOST = 312 + SYS_AIO_FSYNC = 313 + SYS_AIO_RETURN = 314 + SYS_AIO_SUSPEND = 315 + SYS_AIO_CANCEL = 316 + SYS_AIO_ERROR = 317 + SYS_AIO_READ = 318 + SYS_AIO_WRITE = 319 + SYS_LIO_LISTIO = 320 + SYS_IOPOLICYSYS = 322 + SYS_PROCESS_POLICY = 323 + SYS_MLOCKALL = 324 + SYS_MUNLOCKALL = 325 + SYS_ISSETUGID = 327 + SYS___PTHREAD_KILL = 328 + SYS___PTHREAD_SIGMASK = 329 + SYS___SIGWAIT = 330 + SYS___DISABLE_THREADSIGNAL = 331 + SYS___PTHREAD_MARKCANCEL = 332 + SYS___PTHREAD_CANCELED = 333 + SYS___SEMWAIT_SIGNAL = 334 + SYS_PROC_INFO = 336 + SYS_SENDFILE = 337 + SYS_STAT64 = 338 + SYS_FSTAT64 = 339 + SYS_LSTAT64 = 340 + SYS_STAT64_EXTENDED = 341 + SYS_LSTAT64_EXTENDED = 342 + SYS_FSTAT64_EXTENDED = 343 + SYS_GETDIRENTRIES64 = 344 + SYS_STATFS64 = 345 + SYS_FSTATFS64 = 346 + SYS_GETFSSTAT64 = 347 + SYS___PTHREAD_CHDIR = 348 + SYS___PTHREAD_FCHDIR = 349 + SYS_AUDIT = 350 + SYS_AUDITON = 351 + SYS_GETAUID = 353 + SYS_SETAUID = 354 + SYS_GETAUDIT_ADDR = 357 + SYS_SETAUDIT_ADDR = 358 + SYS_AUDITCTL = 359 + SYS_BSDTHREAD_CREATE = 360 + SYS_BSDTHREAD_TERMINATE = 361 + SYS_KQUEUE = 362 + SYS_KEVENT = 363 + SYS_LCHOWN = 364 + SYS_BSDTHREAD_REGISTER = 366 + SYS_WORKQ_OPEN = 367 + SYS_WORKQ_KERNRETURN = 368 + SYS_KEVENT64 = 369 + SYS___OLD_SEMWAIT_SIGNAL = 370 + SYS___OLD_SEMWAIT_SIGNAL_NOCANCEL = 371 + SYS_THREAD_SELFID = 372 + SYS_LEDGER = 373 + SYS_KEVENT_QOS = 374 + SYS_KEVENT_ID = 375 + SYS___MAC_EXECVE = 380 + SYS___MAC_SYSCALL = 381 + SYS___MAC_GET_FILE = 382 + SYS___MAC_SET_FILE = 383 + SYS___MAC_GET_LINK = 384 + SYS___MAC_SET_LINK = 385 + SYS___MAC_GET_PROC = 386 + SYS___MAC_SET_PROC = 387 + SYS___MAC_GET_FD = 388 + SYS___MAC_SET_FD = 389 + SYS___MAC_GET_PID = 390 + SYS_PSELECT = 394 + SYS_PSELECT_NOCANCEL = 395 + SYS_READ_NOCANCEL = 396 + SYS_WRITE_NOCANCEL = 397 + SYS_OPEN_NOCANCEL = 398 + SYS_CLOSE_NOCANCEL = 399 + SYS_WAIT4_NOCANCEL = 400 + SYS_RECVMSG_NOCANCEL = 401 + SYS_SENDMSG_NOCANCEL = 402 + SYS_RECVFROM_NOCANCEL = 403 + SYS_ACCEPT_NOCANCEL = 404 + SYS_MSYNC_NOCANCEL = 405 + SYS_FCNTL_NOCANCEL = 406 + SYS_SELECT_NOCANCEL = 407 + SYS_FSYNC_NOCANCEL = 408 + SYS_CONNECT_NOCANCEL = 409 + SYS_SIGSUSPEND_NOCANCEL = 410 + SYS_READV_NOCANCEL = 411 + SYS_WRITEV_NOCANCEL = 412 + SYS_SENDTO_NOCANCEL = 413 + SYS_PREAD_NOCANCEL = 414 + SYS_PWRITE_NOCANCEL = 415 + SYS_WAITID_NOCANCEL = 416 + SYS_POLL_NOCANCEL = 417 + SYS_MSGSND_NOCANCEL = 418 + SYS_MSGRCV_NOCANCEL = 419 + SYS_SEM_WAIT_NOCANCEL = 420 + SYS_AIO_SUSPEND_NOCANCEL = 421 + SYS___SIGWAIT_NOCANCEL = 422 + SYS___SEMWAIT_SIGNAL_NOCANCEL = 423 + SYS___MAC_MOUNT = 424 + SYS___MAC_GET_MOUNT = 425 + SYS___MAC_GETFSSTAT = 426 + SYS_FSGETPATH = 427 + SYS_AUDIT_SESSION_SELF = 428 + SYS_AUDIT_SESSION_JOIN = 429 + SYS_FILEPORT_MAKEPORT = 430 + SYS_FILEPORT_MAKEFD = 431 + SYS_AUDIT_SESSION_PORT = 432 + SYS_PID_SUSPEND = 433 + SYS_PID_RESUME = 434 + SYS_PID_HIBERNATE = 435 + SYS_PID_SHUTDOWN_SOCKETS = 436 + SYS_SHARED_REGION_MAP_AND_SLIDE_NP = 438 + SYS_KAS_INFO = 439 + SYS_MEMORYSTATUS_CONTROL = 440 + SYS_GUARDED_OPEN_NP = 441 + SYS_GUARDED_CLOSE_NP = 442 + SYS_GUARDED_KQUEUE_NP = 443 + SYS_CHANGE_FDGUARD_NP = 444 + SYS_USRCTL = 445 + SYS_PROC_RLIMIT_CONTROL = 446 + SYS_CONNECTX = 447 + SYS_DISCONNECTX = 448 + SYS_PEELOFF = 449 + SYS_SOCKET_DELEGATE = 450 + SYS_TELEMETRY = 451 + SYS_PROC_UUID_POLICY = 452 + SYS_MEMORYSTATUS_GET_LEVEL = 453 + SYS_SYSTEM_OVERRIDE = 454 + SYS_VFS_PURGE = 455 + SYS_SFI_CTL = 456 + SYS_SFI_PIDCTL = 457 + SYS_COALITION = 458 + SYS_COALITION_INFO = 459 + SYS_NECP_MATCH_POLICY = 460 + SYS_GETATTRLISTBULK = 461 + SYS_CLONEFILEAT = 462 + SYS_OPENAT = 463 + SYS_OPENAT_NOCANCEL = 464 + SYS_RENAMEAT = 465 + SYS_FACCESSAT = 466 + SYS_FCHMODAT = 467 + SYS_FCHOWNAT = 468 + SYS_FSTATAT = 469 + SYS_FSTATAT64 = 470 + SYS_LINKAT = 471 + SYS_UNLINKAT = 472 + SYS_READLINKAT = 473 + SYS_SYMLINKAT = 474 + SYS_MKDIRAT = 475 + SYS_GETATTRLISTAT = 476 + SYS_PROC_TRACE_LOG = 477 + SYS_BSDTHREAD_CTL = 478 + SYS_OPENBYID_NP = 479 + SYS_RECVMSG_X = 480 + SYS_SENDMSG_X = 481 + SYS_THREAD_SELFUSAGE = 482 + SYS_CSRCTL = 483 + SYS_GUARDED_OPEN_DPROTECTED_NP = 484 + SYS_GUARDED_WRITE_NP = 485 + SYS_GUARDED_PWRITE_NP = 486 + SYS_GUARDED_WRITEV_NP = 487 + SYS_RENAMEATX_NP = 488 + SYS_MREMAP_ENCRYPTED = 489 + SYS_NETAGENT_TRIGGER = 490 + SYS_STACK_SNAPSHOT_WITH_CONFIG = 491 + SYS_MICROSTACKSHOT = 492 + SYS_GRAB_PGO_DATA = 493 + SYS_PERSONA = 494 + SYS_WORK_INTERVAL_CTL = 499 + SYS_GETENTROPY = 500 + SYS_NECP_OPEN = 501 + SYS_NECP_CLIENT_ACTION = 502 + SYS___NEXUS_OPEN = 503 + SYS___NEXUS_REGISTER = 504 + SYS___NEXUS_DEREGISTER = 505 + SYS___NEXUS_CREATE = 506 + SYS___NEXUS_DESTROY = 507 + SYS___NEXUS_GET_OPT = 508 + SYS___NEXUS_SET_OPT = 509 + SYS___CHANNEL_OPEN = 510 + SYS___CHANNEL_GET_INFO = 511 + SYS___CHANNEL_SYNC = 512 + SYS___CHANNEL_GET_OPT = 513 + SYS___CHANNEL_SET_OPT = 514 + SYS_ULOCK_WAIT = 515 + SYS_ULOCK_WAKE = 516 + SYS_FCLONEFILEAT = 517 + SYS_FS_SNAPSHOT = 518 + SYS_TERMINATE_WITH_PAYLOAD = 520 + SYS_ABORT_WITH_PAYLOAD = 521 + SYS_NECP_SESSION_OPEN = 522 + SYS_NECP_SESSION_ACTION = 523 + SYS_SETATTRLISTAT = 524 + SYS_NET_QOS_GUIDELINE = 525 + SYS_FMOUNT = 526 + SYS_NTP_ADJTIME = 527 + SYS_NTP_GETTIME = 528 + SYS_OS_FAULT_WITH_PAYLOAD = 529 + SYS_MAXSYSCALL = 530 + SYS_INVALID = 63 +) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm64.go new file mode 100644 index 00000000..96946302 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm64.go @@ -0,0 +1,436 @@ +// mksysnum_darwin.pl /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.1.sdk/usr/include/sys/syscall.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm64,darwin + +package unix + +const ( + SYS_SYSCALL = 0 + SYS_EXIT = 1 + SYS_FORK = 2 + SYS_READ = 3 + SYS_WRITE = 4 + SYS_OPEN = 5 + SYS_CLOSE = 6 + SYS_WAIT4 = 7 + SYS_LINK = 9 + SYS_UNLINK = 10 + SYS_CHDIR = 12 + SYS_FCHDIR = 13 + SYS_MKNOD = 14 + SYS_CHMOD = 15 + SYS_CHOWN = 16 + SYS_GETFSSTAT = 18 + SYS_GETPID = 20 + SYS_SETUID = 23 + SYS_GETUID = 24 + SYS_GETEUID = 25 + SYS_PTRACE = 26 + SYS_RECVMSG = 27 + SYS_SENDMSG = 28 + SYS_RECVFROM = 29 + SYS_ACCEPT = 30 + SYS_GETPEERNAME = 31 + SYS_GETSOCKNAME = 32 + SYS_ACCESS = 33 + SYS_CHFLAGS = 34 + SYS_FCHFLAGS = 35 + SYS_SYNC = 36 + SYS_KILL = 37 + SYS_GETPPID = 39 + SYS_DUP = 41 + SYS_PIPE = 42 + SYS_GETEGID = 43 + SYS_SIGACTION = 46 + SYS_GETGID = 47 + SYS_SIGPROCMASK = 48 + SYS_GETLOGIN = 49 + SYS_SETLOGIN = 50 + SYS_ACCT = 51 + SYS_SIGPENDING = 52 + SYS_SIGALTSTACK = 53 + SYS_IOCTL = 54 + SYS_REBOOT = 55 + SYS_REVOKE = 56 + SYS_SYMLINK = 57 + SYS_READLINK = 58 + SYS_EXECVE = 59 + SYS_UMASK = 60 + SYS_CHROOT = 61 + SYS_MSYNC = 65 + SYS_VFORK = 66 + SYS_MUNMAP = 73 + SYS_MPROTECT = 74 + SYS_MADVISE = 75 + SYS_MINCORE = 78 + SYS_GETGROUPS = 79 + SYS_SETGROUPS = 80 + SYS_GETPGRP = 81 + SYS_SETPGID = 82 + SYS_SETITIMER = 83 + SYS_SWAPON = 85 + SYS_GETITIMER = 86 + SYS_GETDTABLESIZE = 89 + SYS_DUP2 = 90 + SYS_FCNTL = 92 + SYS_SELECT = 93 + SYS_FSYNC = 95 + SYS_SETPRIORITY = 96 + SYS_SOCKET = 97 + SYS_CONNECT = 98 + SYS_GETPRIORITY = 100 + SYS_BIND = 104 + SYS_SETSOCKOPT = 105 + SYS_LISTEN = 106 + SYS_SIGSUSPEND = 111 + SYS_GETTIMEOFDAY = 116 + SYS_GETRUSAGE = 117 + SYS_GETSOCKOPT = 118 + SYS_READV = 120 + SYS_WRITEV = 121 + SYS_SETTIMEOFDAY = 122 + SYS_FCHOWN = 123 + SYS_FCHMOD = 124 + SYS_SETREUID = 126 + SYS_SETREGID = 127 + SYS_RENAME = 128 + SYS_FLOCK = 131 + SYS_MKFIFO = 132 + SYS_SENDTO = 133 + SYS_SHUTDOWN = 134 + SYS_SOCKETPAIR = 135 + SYS_MKDIR = 136 + SYS_RMDIR = 137 + SYS_UTIMES = 138 + SYS_FUTIMES = 139 + SYS_ADJTIME = 140 + SYS_GETHOSTUUID = 142 + SYS_SETSID = 147 + SYS_GETPGID = 151 + SYS_SETPRIVEXEC = 152 + SYS_PREAD = 153 + SYS_PWRITE = 154 + SYS_NFSSVC = 155 + SYS_STATFS = 157 + SYS_FSTATFS = 158 + SYS_UNMOUNT = 159 + SYS_GETFH = 161 + SYS_QUOTACTL = 165 + SYS_MOUNT = 167 + SYS_CSOPS = 169 + SYS_CSOPS_AUDITTOKEN = 170 + SYS_WAITID = 173 + SYS_KDEBUG_TYPEFILTER = 177 + SYS_KDEBUG_TRACE_STRING = 178 + SYS_KDEBUG_TRACE64 = 179 + SYS_KDEBUG_TRACE = 180 + SYS_SETGID = 181 + SYS_SETEGID = 182 + SYS_SETEUID = 183 + SYS_SIGRETURN = 184 + SYS_THREAD_SELFCOUNTS = 186 + SYS_FDATASYNC = 187 + SYS_STAT = 188 + SYS_FSTAT = 189 + SYS_LSTAT = 190 + SYS_PATHCONF = 191 + SYS_FPATHCONF = 192 + SYS_GETRLIMIT = 194 + SYS_SETRLIMIT = 195 + SYS_GETDIRENTRIES = 196 + SYS_MMAP = 197 + SYS_LSEEK = 199 + SYS_TRUNCATE = 200 + SYS_FTRUNCATE = 201 + SYS_SYSCTL = 202 + SYS_MLOCK = 203 + SYS_MUNLOCK = 204 + SYS_UNDELETE = 205 + SYS_OPEN_DPROTECTED_NP = 216 + SYS_GETATTRLIST = 220 + SYS_SETATTRLIST = 221 + SYS_GETDIRENTRIESATTR = 222 + SYS_EXCHANGEDATA = 223 + SYS_SEARCHFS = 225 + SYS_DELETE = 226 + SYS_COPYFILE = 227 + SYS_FGETATTRLIST = 228 + SYS_FSETATTRLIST = 229 + SYS_POLL = 230 + SYS_WATCHEVENT = 231 + SYS_WAITEVENT = 232 + SYS_MODWATCH = 233 + SYS_GETXATTR = 234 + SYS_FGETXATTR = 235 + SYS_SETXATTR = 236 + SYS_FSETXATTR = 237 + SYS_REMOVEXATTR = 238 + SYS_FREMOVEXATTR = 239 + SYS_LISTXATTR = 240 + SYS_FLISTXATTR = 241 + SYS_FSCTL = 242 + SYS_INITGROUPS = 243 + SYS_POSIX_SPAWN = 244 + SYS_FFSCTL = 245 + SYS_NFSCLNT = 247 + SYS_FHOPEN = 248 + SYS_MINHERIT = 250 + SYS_SEMSYS = 251 + SYS_MSGSYS = 252 + SYS_SHMSYS = 253 + SYS_SEMCTL = 254 + SYS_SEMGET = 255 + SYS_SEMOP = 256 + SYS_MSGCTL = 258 + SYS_MSGGET = 259 + SYS_MSGSND = 260 + SYS_MSGRCV = 261 + SYS_SHMAT = 262 + SYS_SHMCTL = 263 + SYS_SHMDT = 264 + SYS_SHMGET = 265 + SYS_SHM_OPEN = 266 + SYS_SHM_UNLINK = 267 + SYS_SEM_OPEN = 268 + SYS_SEM_CLOSE = 269 + SYS_SEM_UNLINK = 270 + SYS_SEM_WAIT = 271 + SYS_SEM_TRYWAIT = 272 + SYS_SEM_POST = 273 + SYS_SYSCTLBYNAME = 274 + SYS_OPEN_EXTENDED = 277 + SYS_UMASK_EXTENDED = 278 + SYS_STAT_EXTENDED = 279 + SYS_LSTAT_EXTENDED = 280 + SYS_FSTAT_EXTENDED = 281 + SYS_CHMOD_EXTENDED = 282 + SYS_FCHMOD_EXTENDED = 283 + SYS_ACCESS_EXTENDED = 284 + SYS_SETTID = 285 + SYS_GETTID = 286 + SYS_SETSGROUPS = 287 + SYS_GETSGROUPS = 288 + SYS_SETWGROUPS = 289 + SYS_GETWGROUPS = 290 + SYS_MKFIFO_EXTENDED = 291 + SYS_MKDIR_EXTENDED = 292 + SYS_IDENTITYSVC = 293 + SYS_SHARED_REGION_CHECK_NP = 294 + SYS_VM_PRESSURE_MONITOR = 296 + SYS_PSYNCH_RW_LONGRDLOCK = 297 + SYS_PSYNCH_RW_YIELDWRLOCK = 298 + SYS_PSYNCH_RW_DOWNGRADE = 299 + SYS_PSYNCH_RW_UPGRADE = 300 + SYS_PSYNCH_MUTEXWAIT = 301 + SYS_PSYNCH_MUTEXDROP = 302 + SYS_PSYNCH_CVBROAD = 303 + SYS_PSYNCH_CVSIGNAL = 304 + SYS_PSYNCH_CVWAIT = 305 + SYS_PSYNCH_RW_RDLOCK = 306 + SYS_PSYNCH_RW_WRLOCK = 307 + SYS_PSYNCH_RW_UNLOCK = 308 + SYS_PSYNCH_RW_UNLOCK2 = 309 + SYS_GETSID = 310 + SYS_SETTID_WITH_PID = 311 + SYS_PSYNCH_CVCLRPREPOST = 312 + SYS_AIO_FSYNC = 313 + SYS_AIO_RETURN = 314 + SYS_AIO_SUSPEND = 315 + SYS_AIO_CANCEL = 316 + SYS_AIO_ERROR = 317 + SYS_AIO_READ = 318 + SYS_AIO_WRITE = 319 + SYS_LIO_LISTIO = 320 + SYS_IOPOLICYSYS = 322 + SYS_PROCESS_POLICY = 323 + SYS_MLOCKALL = 324 + SYS_MUNLOCKALL = 325 + SYS_ISSETUGID = 327 + SYS___PTHREAD_KILL = 328 + SYS___PTHREAD_SIGMASK = 329 + SYS___SIGWAIT = 330 + SYS___DISABLE_THREADSIGNAL = 331 + SYS___PTHREAD_MARKCANCEL = 332 + SYS___PTHREAD_CANCELED = 333 + SYS___SEMWAIT_SIGNAL = 334 + SYS_PROC_INFO = 336 + SYS_SENDFILE = 337 + SYS_STAT64 = 338 + SYS_FSTAT64 = 339 + SYS_LSTAT64 = 340 + SYS_STAT64_EXTENDED = 341 + SYS_LSTAT64_EXTENDED = 342 + SYS_FSTAT64_EXTENDED = 343 + SYS_GETDIRENTRIES64 = 344 + SYS_STATFS64 = 345 + SYS_FSTATFS64 = 346 + SYS_GETFSSTAT64 = 347 + SYS___PTHREAD_CHDIR = 348 + SYS___PTHREAD_FCHDIR = 349 + SYS_AUDIT = 350 + SYS_AUDITON = 351 + SYS_GETAUID = 353 + SYS_SETAUID = 354 + SYS_GETAUDIT_ADDR = 357 + SYS_SETAUDIT_ADDR = 358 + SYS_AUDITCTL = 359 + SYS_BSDTHREAD_CREATE = 360 + SYS_BSDTHREAD_TERMINATE = 361 + SYS_KQUEUE = 362 + SYS_KEVENT = 363 + SYS_LCHOWN = 364 + SYS_BSDTHREAD_REGISTER = 366 + SYS_WORKQ_OPEN = 367 + SYS_WORKQ_KERNRETURN = 368 + SYS_KEVENT64 = 369 + SYS___OLD_SEMWAIT_SIGNAL = 370 + SYS___OLD_SEMWAIT_SIGNAL_NOCANCEL = 371 + SYS_THREAD_SELFID = 372 + SYS_LEDGER = 373 + SYS_KEVENT_QOS = 374 + SYS_KEVENT_ID = 375 + SYS___MAC_EXECVE = 380 + SYS___MAC_SYSCALL = 381 + SYS___MAC_GET_FILE = 382 + SYS___MAC_SET_FILE = 383 + SYS___MAC_GET_LINK = 384 + SYS___MAC_SET_LINK = 385 + SYS___MAC_GET_PROC = 386 + SYS___MAC_SET_PROC = 387 + SYS___MAC_GET_FD = 388 + SYS___MAC_SET_FD = 389 + SYS___MAC_GET_PID = 390 + SYS_PSELECT = 394 + SYS_PSELECT_NOCANCEL = 395 + SYS_READ_NOCANCEL = 396 + SYS_WRITE_NOCANCEL = 397 + SYS_OPEN_NOCANCEL = 398 + SYS_CLOSE_NOCANCEL = 399 + SYS_WAIT4_NOCANCEL = 400 + SYS_RECVMSG_NOCANCEL = 401 + SYS_SENDMSG_NOCANCEL = 402 + SYS_RECVFROM_NOCANCEL = 403 + SYS_ACCEPT_NOCANCEL = 404 + SYS_MSYNC_NOCANCEL = 405 + SYS_FCNTL_NOCANCEL = 406 + SYS_SELECT_NOCANCEL = 407 + SYS_FSYNC_NOCANCEL = 408 + SYS_CONNECT_NOCANCEL = 409 + SYS_SIGSUSPEND_NOCANCEL = 410 + SYS_READV_NOCANCEL = 411 + SYS_WRITEV_NOCANCEL = 412 + SYS_SENDTO_NOCANCEL = 413 + SYS_PREAD_NOCANCEL = 414 + SYS_PWRITE_NOCANCEL = 415 + SYS_WAITID_NOCANCEL = 416 + SYS_POLL_NOCANCEL = 417 + SYS_MSGSND_NOCANCEL = 418 + SYS_MSGRCV_NOCANCEL = 419 + SYS_SEM_WAIT_NOCANCEL = 420 + SYS_AIO_SUSPEND_NOCANCEL = 421 + SYS___SIGWAIT_NOCANCEL = 422 + SYS___SEMWAIT_SIGNAL_NOCANCEL = 423 + SYS___MAC_MOUNT = 424 + SYS___MAC_GET_MOUNT = 425 + SYS___MAC_GETFSSTAT = 426 + SYS_FSGETPATH = 427 + SYS_AUDIT_SESSION_SELF = 428 + SYS_AUDIT_SESSION_JOIN = 429 + SYS_FILEPORT_MAKEPORT = 430 + SYS_FILEPORT_MAKEFD = 431 + SYS_AUDIT_SESSION_PORT = 432 + SYS_PID_SUSPEND = 433 + SYS_PID_RESUME = 434 + SYS_PID_HIBERNATE = 435 + SYS_PID_SHUTDOWN_SOCKETS = 436 + SYS_SHARED_REGION_MAP_AND_SLIDE_NP = 438 + SYS_KAS_INFO = 439 + SYS_MEMORYSTATUS_CONTROL = 440 + SYS_GUARDED_OPEN_NP = 441 + SYS_GUARDED_CLOSE_NP = 442 + SYS_GUARDED_KQUEUE_NP = 443 + SYS_CHANGE_FDGUARD_NP = 444 + SYS_USRCTL = 445 + SYS_PROC_RLIMIT_CONTROL = 446 + SYS_CONNECTX = 447 + SYS_DISCONNECTX = 448 + SYS_PEELOFF = 449 + SYS_SOCKET_DELEGATE = 450 + SYS_TELEMETRY = 451 + SYS_PROC_UUID_POLICY = 452 + SYS_MEMORYSTATUS_GET_LEVEL = 453 + SYS_SYSTEM_OVERRIDE = 454 + SYS_VFS_PURGE = 455 + SYS_SFI_CTL = 456 + SYS_SFI_PIDCTL = 457 + SYS_COALITION = 458 + SYS_COALITION_INFO = 459 + SYS_NECP_MATCH_POLICY = 460 + SYS_GETATTRLISTBULK = 461 + SYS_CLONEFILEAT = 462 + SYS_OPENAT = 463 + SYS_OPENAT_NOCANCEL = 464 + SYS_RENAMEAT = 465 + SYS_FACCESSAT = 466 + SYS_FCHMODAT = 467 + SYS_FCHOWNAT = 468 + SYS_FSTATAT = 469 + SYS_FSTATAT64 = 470 + SYS_LINKAT = 471 + SYS_UNLINKAT = 472 + SYS_READLINKAT = 473 + SYS_SYMLINKAT = 474 + SYS_MKDIRAT = 475 + SYS_GETATTRLISTAT = 476 + SYS_PROC_TRACE_LOG = 477 + SYS_BSDTHREAD_CTL = 478 + SYS_OPENBYID_NP = 479 + SYS_RECVMSG_X = 480 + SYS_SENDMSG_X = 481 + SYS_THREAD_SELFUSAGE = 482 + SYS_CSRCTL = 483 + SYS_GUARDED_OPEN_DPROTECTED_NP = 484 + SYS_GUARDED_WRITE_NP = 485 + SYS_GUARDED_PWRITE_NP = 486 + SYS_GUARDED_WRITEV_NP = 487 + SYS_RENAMEATX_NP = 488 + SYS_MREMAP_ENCRYPTED = 489 + SYS_NETAGENT_TRIGGER = 490 + SYS_STACK_SNAPSHOT_WITH_CONFIG = 491 + SYS_MICROSTACKSHOT = 492 + SYS_GRAB_PGO_DATA = 493 + SYS_PERSONA = 494 + SYS_WORK_INTERVAL_CTL = 499 + SYS_GETENTROPY = 500 + SYS_NECP_OPEN = 501 + SYS_NECP_CLIENT_ACTION = 502 + SYS___NEXUS_OPEN = 503 + SYS___NEXUS_REGISTER = 504 + SYS___NEXUS_DEREGISTER = 505 + SYS___NEXUS_CREATE = 506 + SYS___NEXUS_DESTROY = 507 + SYS___NEXUS_GET_OPT = 508 + SYS___NEXUS_SET_OPT = 509 + SYS___CHANNEL_OPEN = 510 + SYS___CHANNEL_GET_INFO = 511 + SYS___CHANNEL_SYNC = 512 + SYS___CHANNEL_GET_OPT = 513 + SYS___CHANNEL_SET_OPT = 514 + SYS_ULOCK_WAIT = 515 + SYS_ULOCK_WAKE = 516 + SYS_FCLONEFILEAT = 517 + SYS_FS_SNAPSHOT = 518 + SYS_TERMINATE_WITH_PAYLOAD = 520 + SYS_ABORT_WITH_PAYLOAD = 521 + SYS_NECP_SESSION_OPEN = 522 + SYS_NECP_SESSION_ACTION = 523 + SYS_SETATTRLISTAT = 524 + SYS_NET_QOS_GUIDELINE = 525 + SYS_FMOUNT = 526 + SYS_NTP_ADJTIME = 527 + SYS_NTP_GETTIME = 528 + SYS_OS_FAULT_WITH_PAYLOAD = 529 + SYS_MAXSYSCALL = 530 + SYS_INVALID = 63 +) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_dragonfly_amd64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_dragonfly_amd64.go new file mode 100644 index 00000000..b2c9ef81 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_dragonfly_amd64.go @@ -0,0 +1,315 @@ +// mksysnum_dragonfly.pl +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,dragonfly + +package unix + +const ( + // SYS_NOSYS = 0; // { int nosys(void); } syscall nosys_args int + SYS_EXIT = 1 // { void exit(int rval); } + SYS_FORK = 2 // { int fork(void); } + SYS_READ = 3 // { ssize_t read(int fd, void *buf, size_t nbyte); } + SYS_WRITE = 4 // { ssize_t write(int fd, const void *buf, size_t nbyte); } + SYS_OPEN = 5 // { int open(char *path, int flags, int mode); } + SYS_CLOSE = 6 // { int close(int fd); } + SYS_WAIT4 = 7 // { int wait4(int pid, int *status, int options, \ + SYS_LINK = 9 // { int link(char *path, char *link); } + SYS_UNLINK = 10 // { int unlink(char *path); } + SYS_CHDIR = 12 // { int chdir(char *path); } + SYS_FCHDIR = 13 // { int fchdir(int fd); } + SYS_MKNOD = 14 // { int mknod(char *path, int mode, int dev); } + SYS_CHMOD = 15 // { int chmod(char *path, int mode); } + SYS_CHOWN = 16 // { int chown(char *path, int uid, int gid); } + SYS_OBREAK = 17 // { int obreak(char *nsize); } break obreak_args int + SYS_GETFSSTAT = 18 // { int getfsstat(struct statfs *buf, long bufsize, \ + SYS_GETPID = 20 // { pid_t getpid(void); } + SYS_MOUNT = 21 // { int mount(char *type, char *path, int flags, \ + SYS_UNMOUNT = 22 // { int unmount(char *path, int flags); } + SYS_SETUID = 23 // { int setuid(uid_t uid); } + SYS_GETUID = 24 // { uid_t getuid(void); } + SYS_GETEUID = 25 // { uid_t geteuid(void); } + SYS_PTRACE = 26 // { int ptrace(int req, pid_t pid, caddr_t addr, \ + SYS_RECVMSG = 27 // { int recvmsg(int s, struct msghdr *msg, int flags); } + SYS_SENDMSG = 28 // { int sendmsg(int s, caddr_t msg, int flags); } + SYS_RECVFROM = 29 // { int recvfrom(int s, caddr_t buf, size_t len, \ + SYS_ACCEPT = 30 // { int accept(int s, caddr_t name, int *anamelen); } + SYS_GETPEERNAME = 31 // { int getpeername(int fdes, caddr_t asa, int *alen); } + SYS_GETSOCKNAME = 32 // { int getsockname(int fdes, caddr_t asa, int *alen); } + SYS_ACCESS = 33 // { int access(char *path, int flags); } + SYS_CHFLAGS = 34 // { int chflags(char *path, int flags); } + SYS_FCHFLAGS = 35 // { int fchflags(int fd, int flags); } + SYS_SYNC = 36 // { int sync(void); } + SYS_KILL = 37 // { int kill(int pid, int signum); } + SYS_GETPPID = 39 // { pid_t getppid(void); } + SYS_DUP = 41 // { int dup(int fd); } + SYS_PIPE = 42 // { int pipe(void); } + SYS_GETEGID = 43 // { gid_t getegid(void); } + SYS_PROFIL = 44 // { int profil(caddr_t samples, size_t size, \ + SYS_KTRACE = 45 // { int ktrace(const char *fname, int ops, int facs, \ + SYS_GETGID = 47 // { gid_t getgid(void); } + SYS_GETLOGIN = 49 // { int getlogin(char *namebuf, u_int namelen); } + SYS_SETLOGIN = 50 // { int setlogin(char *namebuf); } + SYS_ACCT = 51 // { int acct(char *path); } + SYS_SIGALTSTACK = 53 // { int sigaltstack(stack_t *ss, stack_t *oss); } + SYS_IOCTL = 54 // { int ioctl(int fd, u_long com, caddr_t data); } + SYS_REBOOT = 55 // { int reboot(int opt); } + SYS_REVOKE = 56 // { int revoke(char *path); } + SYS_SYMLINK = 57 // { int symlink(char *path, char *link); } + SYS_READLINK = 58 // { int readlink(char *path, char *buf, int count); } + SYS_EXECVE = 59 // { int execve(char *fname, char **argv, char **envv); } + SYS_UMASK = 60 // { int umask(int newmask); } umask umask_args int + SYS_CHROOT = 61 // { int chroot(char *path); } + SYS_MSYNC = 65 // { int msync(void *addr, size_t len, int flags); } + SYS_VFORK = 66 // { pid_t vfork(void); } + SYS_SBRK = 69 // { int sbrk(int incr); } + SYS_SSTK = 70 // { int sstk(int incr); } + SYS_MUNMAP = 73 // { int munmap(void *addr, size_t len); } + SYS_MPROTECT = 74 // { int mprotect(void *addr, size_t len, int prot); } + SYS_MADVISE = 75 // { int madvise(void *addr, size_t len, int behav); } + SYS_MINCORE = 78 // { int mincore(const void *addr, size_t len, \ + SYS_GETGROUPS = 79 // { int getgroups(u_int gidsetsize, gid_t *gidset); } + SYS_SETGROUPS = 80 // { int setgroups(u_int gidsetsize, gid_t *gidset); } + SYS_GETPGRP = 81 // { int getpgrp(void); } + SYS_SETPGID = 82 // { int setpgid(int pid, int pgid); } + SYS_SETITIMER = 83 // { int setitimer(u_int which, struct itimerval *itv, \ + SYS_SWAPON = 85 // { int swapon(char *name); } + SYS_GETITIMER = 86 // { int getitimer(u_int which, struct itimerval *itv); } + SYS_GETDTABLESIZE = 89 // { int getdtablesize(void); } + SYS_DUP2 = 90 // { int dup2(int from, int to); } + SYS_FCNTL = 92 // { int fcntl(int fd, int cmd, long arg); } + SYS_SELECT = 93 // { int select(int nd, fd_set *in, fd_set *ou, \ + SYS_FSYNC = 95 // { int fsync(int fd); } + SYS_SETPRIORITY = 96 // { int setpriority(int which, int who, int prio); } + SYS_SOCKET = 97 // { int socket(int domain, int type, int protocol); } + SYS_CONNECT = 98 // { int connect(int s, caddr_t name, int namelen); } + SYS_GETPRIORITY = 100 // { int getpriority(int which, int who); } + SYS_BIND = 104 // { int bind(int s, caddr_t name, int namelen); } + SYS_SETSOCKOPT = 105 // { int setsockopt(int s, int level, int name, \ + SYS_LISTEN = 106 // { int listen(int s, int backlog); } + SYS_GETTIMEOFDAY = 116 // { int gettimeofday(struct timeval *tp, \ + SYS_GETRUSAGE = 117 // { int getrusage(int who, struct rusage *rusage); } + SYS_GETSOCKOPT = 118 // { int getsockopt(int s, int level, int name, \ + SYS_READV = 120 // { int readv(int fd, struct iovec *iovp, u_int iovcnt); } + SYS_WRITEV = 121 // { int writev(int fd, struct iovec *iovp, \ + SYS_SETTIMEOFDAY = 122 // { int settimeofday(struct timeval *tv, \ + SYS_FCHOWN = 123 // { int fchown(int fd, int uid, int gid); } + SYS_FCHMOD = 124 // { int fchmod(int fd, int mode); } + SYS_SETREUID = 126 // { int setreuid(int ruid, int euid); } + SYS_SETREGID = 127 // { int setregid(int rgid, int egid); } + SYS_RENAME = 128 // { int rename(char *from, char *to); } + SYS_FLOCK = 131 // { int flock(int fd, int how); } + SYS_MKFIFO = 132 // { int mkfifo(char *path, int mode); } + SYS_SENDTO = 133 // { int sendto(int s, caddr_t buf, size_t len, \ + SYS_SHUTDOWN = 134 // { int shutdown(int s, int how); } + SYS_SOCKETPAIR = 135 // { int socketpair(int domain, int type, int protocol, \ + SYS_MKDIR = 136 // { int mkdir(char *path, int mode); } + SYS_RMDIR = 137 // { int rmdir(char *path); } + SYS_UTIMES = 138 // { int utimes(char *path, struct timeval *tptr); } + SYS_ADJTIME = 140 // { int adjtime(struct timeval *delta, \ + SYS_SETSID = 147 // { int setsid(void); } + SYS_QUOTACTL = 148 // { int quotactl(char *path, int cmd, int uid, \ + SYS_STATFS = 157 // { int statfs(char *path, struct statfs *buf); } + SYS_FSTATFS = 158 // { int fstatfs(int fd, struct statfs *buf); } + SYS_GETFH = 161 // { int getfh(char *fname, struct fhandle *fhp); } + SYS_GETDOMAINNAME = 162 // { int getdomainname(char *domainname, int len); } + SYS_SETDOMAINNAME = 163 // { int setdomainname(char *domainname, int len); } + SYS_UNAME = 164 // { int uname(struct utsname *name); } + SYS_SYSARCH = 165 // { int sysarch(int op, char *parms); } + SYS_RTPRIO = 166 // { int rtprio(int function, pid_t pid, \ + SYS_EXTPREAD = 173 // { ssize_t extpread(int fd, void *buf, \ + SYS_EXTPWRITE = 174 // { ssize_t extpwrite(int fd, const void *buf, \ + SYS_NTP_ADJTIME = 176 // { int ntp_adjtime(struct timex *tp); } + SYS_SETGID = 181 // { int setgid(gid_t gid); } + SYS_SETEGID = 182 // { int setegid(gid_t egid); } + SYS_SETEUID = 183 // { int seteuid(uid_t euid); } + SYS_PATHCONF = 191 // { int pathconf(char *path, int name); } + SYS_FPATHCONF = 192 // { int fpathconf(int fd, int name); } + SYS_GETRLIMIT = 194 // { int getrlimit(u_int which, \ + SYS_SETRLIMIT = 195 // { int setrlimit(u_int which, \ + SYS_MMAP = 197 // { caddr_t mmap(caddr_t addr, size_t len, int prot, \ + // SYS_NOSYS = 198; // { int nosys(void); } __syscall __syscall_args int + SYS_LSEEK = 199 // { off_t lseek(int fd, int pad, off_t offset, \ + SYS_TRUNCATE = 200 // { int truncate(char *path, int pad, off_t length); } + SYS_FTRUNCATE = 201 // { int ftruncate(int fd, int pad, off_t length); } + SYS___SYSCTL = 202 // { int __sysctl(int *name, u_int namelen, void *old, \ + SYS_MLOCK = 203 // { int mlock(const void *addr, size_t len); } + SYS_MUNLOCK = 204 // { int munlock(const void *addr, size_t len); } + SYS_UNDELETE = 205 // { int undelete(char *path); } + SYS_FUTIMES = 206 // { int futimes(int fd, struct timeval *tptr); } + SYS_GETPGID = 207 // { int getpgid(pid_t pid); } + SYS_POLL = 209 // { int poll(struct pollfd *fds, u_int nfds, \ + SYS___SEMCTL = 220 // { int __semctl(int semid, int semnum, int cmd, \ + SYS_SEMGET = 221 // { int semget(key_t key, int nsems, int semflg); } + SYS_SEMOP = 222 // { int semop(int semid, struct sembuf *sops, \ + SYS_MSGCTL = 224 // { int msgctl(int msqid, int cmd, \ + SYS_MSGGET = 225 // { int msgget(key_t key, int msgflg); } + SYS_MSGSND = 226 // { int msgsnd(int msqid, const void *msgp, size_t msgsz, \ + SYS_MSGRCV = 227 // { int msgrcv(int msqid, void *msgp, size_t msgsz, \ + SYS_SHMAT = 228 // { caddr_t shmat(int shmid, const void *shmaddr, \ + SYS_SHMCTL = 229 // { int shmctl(int shmid, int cmd, \ + SYS_SHMDT = 230 // { int shmdt(const void *shmaddr); } + SYS_SHMGET = 231 // { int shmget(key_t key, size_t size, int shmflg); } + SYS_CLOCK_GETTIME = 232 // { int clock_gettime(clockid_t clock_id, \ + SYS_CLOCK_SETTIME = 233 // { int clock_settime(clockid_t clock_id, \ + SYS_CLOCK_GETRES = 234 // { int clock_getres(clockid_t clock_id, \ + SYS_NANOSLEEP = 240 // { int nanosleep(const struct timespec *rqtp, \ + SYS_MINHERIT = 250 // { int minherit(void *addr, size_t len, int inherit); } + SYS_RFORK = 251 // { int rfork(int flags); } + SYS_OPENBSD_POLL = 252 // { int openbsd_poll(struct pollfd *fds, u_int nfds, \ + SYS_ISSETUGID = 253 // { int issetugid(void); } + SYS_LCHOWN = 254 // { int lchown(char *path, int uid, int gid); } + SYS_LCHMOD = 274 // { int lchmod(char *path, mode_t mode); } + SYS_LUTIMES = 276 // { int lutimes(char *path, struct timeval *tptr); } + SYS_EXTPREADV = 289 // { ssize_t extpreadv(int fd, struct iovec *iovp, \ + SYS_EXTPWRITEV = 290 // { ssize_t extpwritev(int fd, struct iovec *iovp,\ + SYS_FHSTATFS = 297 // { int fhstatfs(const struct fhandle *u_fhp, struct statfs *buf); } + SYS_FHOPEN = 298 // { int fhopen(const struct fhandle *u_fhp, int flags); } + SYS_MODNEXT = 300 // { int modnext(int modid); } + SYS_MODSTAT = 301 // { int modstat(int modid, struct module_stat* stat); } + SYS_MODFNEXT = 302 // { int modfnext(int modid); } + SYS_MODFIND = 303 // { int modfind(const char *name); } + SYS_KLDLOAD = 304 // { int kldload(const char *file); } + SYS_KLDUNLOAD = 305 // { int kldunload(int fileid); } + SYS_KLDFIND = 306 // { int kldfind(const char *file); } + SYS_KLDNEXT = 307 // { int kldnext(int fileid); } + SYS_KLDSTAT = 308 // { int kldstat(int fileid, struct kld_file_stat* stat); } + SYS_KLDFIRSTMOD = 309 // { int kldfirstmod(int fileid); } + SYS_GETSID = 310 // { int getsid(pid_t pid); } + SYS_SETRESUID = 311 // { int setresuid(uid_t ruid, uid_t euid, uid_t suid); } + SYS_SETRESGID = 312 // { int setresgid(gid_t rgid, gid_t egid, gid_t sgid); } + SYS_AIO_RETURN = 314 // { int aio_return(struct aiocb *aiocbp); } + SYS_AIO_SUSPEND = 315 // { int aio_suspend(struct aiocb * const * aiocbp, int nent, const struct timespec *timeout); } + SYS_AIO_CANCEL = 316 // { int aio_cancel(int fd, struct aiocb *aiocbp); } + SYS_AIO_ERROR = 317 // { int aio_error(struct aiocb *aiocbp); } + SYS_AIO_READ = 318 // { int aio_read(struct aiocb *aiocbp); } + SYS_AIO_WRITE = 319 // { int aio_write(struct aiocb *aiocbp); } + SYS_LIO_LISTIO = 320 // { int lio_listio(int mode, struct aiocb * const *acb_list, int nent, struct sigevent *sig); } + SYS_YIELD = 321 // { int yield(void); } + SYS_MLOCKALL = 324 // { int mlockall(int how); } + SYS_MUNLOCKALL = 325 // { int munlockall(void); } + SYS___GETCWD = 326 // { int __getcwd(u_char *buf, u_int buflen); } + SYS_SCHED_SETPARAM = 327 // { int sched_setparam (pid_t pid, const struct sched_param *param); } + SYS_SCHED_GETPARAM = 328 // { int sched_getparam (pid_t pid, struct sched_param *param); } + SYS_SCHED_SETSCHEDULER = 329 // { int sched_setscheduler (pid_t pid, int policy, const struct sched_param *param); } + SYS_SCHED_GETSCHEDULER = 330 // { int sched_getscheduler (pid_t pid); } + SYS_SCHED_YIELD = 331 // { int sched_yield (void); } + SYS_SCHED_GET_PRIORITY_MAX = 332 // { int sched_get_priority_max (int policy); } + SYS_SCHED_GET_PRIORITY_MIN = 333 // { int sched_get_priority_min (int policy); } + SYS_SCHED_RR_GET_INTERVAL = 334 // { int sched_rr_get_interval (pid_t pid, struct timespec *interval); } + SYS_UTRACE = 335 // { int utrace(const void *addr, size_t len); } + SYS_KLDSYM = 337 // { int kldsym(int fileid, int cmd, void *data); } + SYS_JAIL = 338 // { int jail(struct jail *jail); } + SYS_SIGPROCMASK = 340 // { int sigprocmask(int how, const sigset_t *set, \ + SYS_SIGSUSPEND = 341 // { int sigsuspend(const sigset_t *sigmask); } + SYS_SIGACTION = 342 // { int sigaction(int sig, const struct sigaction *act, \ + SYS_SIGPENDING = 343 // { int sigpending(sigset_t *set); } + SYS_SIGRETURN = 344 // { int sigreturn(ucontext_t *sigcntxp); } + SYS_SIGTIMEDWAIT = 345 // { int sigtimedwait(const sigset_t *set,\ + SYS_SIGWAITINFO = 346 // { int sigwaitinfo(const sigset_t *set,\ + SYS___ACL_GET_FILE = 347 // { int __acl_get_file(const char *path, \ + SYS___ACL_SET_FILE = 348 // { int __acl_set_file(const char *path, \ + SYS___ACL_GET_FD = 349 // { int __acl_get_fd(int filedes, acl_type_t type, \ + SYS___ACL_SET_FD = 350 // { int __acl_set_fd(int filedes, acl_type_t type, \ + SYS___ACL_DELETE_FILE = 351 // { int __acl_delete_file(const char *path, \ + SYS___ACL_DELETE_FD = 352 // { int __acl_delete_fd(int filedes, acl_type_t type); } + SYS___ACL_ACLCHECK_FILE = 353 // { int __acl_aclcheck_file(const char *path, \ + SYS___ACL_ACLCHECK_FD = 354 // { int __acl_aclcheck_fd(int filedes, acl_type_t type, \ + SYS_EXTATTRCTL = 355 // { int extattrctl(const char *path, int cmd, \ + SYS_EXTATTR_SET_FILE = 356 // { int extattr_set_file(const char *path, \ + SYS_EXTATTR_GET_FILE = 357 // { int extattr_get_file(const char *path, \ + SYS_EXTATTR_DELETE_FILE = 358 // { int extattr_delete_file(const char *path, \ + SYS_AIO_WAITCOMPLETE = 359 // { int aio_waitcomplete(struct aiocb **aiocbp, struct timespec *timeout); } + SYS_GETRESUID = 360 // { int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid); } + SYS_GETRESGID = 361 // { int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid); } + SYS_KQUEUE = 362 // { int kqueue(void); } + SYS_KEVENT = 363 // { int kevent(int fd, \ + SYS_KENV = 390 // { int kenv(int what, const char *name, char *value, int len); } + SYS_LCHFLAGS = 391 // { int lchflags(char *path, int flags); } + SYS_UUIDGEN = 392 // { int uuidgen(struct uuid *store, int count); } + SYS_SENDFILE = 393 // { int sendfile(int fd, int s, off_t offset, size_t nbytes, \ + SYS_VARSYM_SET = 450 // { int varsym_set(int level, const char *name, const char *data); } + SYS_VARSYM_GET = 451 // { int varsym_get(int mask, const char *wild, char *buf, int bufsize); } + SYS_VARSYM_LIST = 452 // { int varsym_list(int level, char *buf, int maxsize, int *marker); } + SYS_EXEC_SYS_REGISTER = 465 // { int exec_sys_register(void *entry); } + SYS_EXEC_SYS_UNREGISTER = 466 // { int exec_sys_unregister(int id); } + SYS_SYS_CHECKPOINT = 467 // { int sys_checkpoint(int type, int fd, pid_t pid, int retval); } + SYS_MOUNTCTL = 468 // { int mountctl(const char *path, int op, int fd, const void *ctl, int ctllen, void *buf, int buflen); } + SYS_UMTX_SLEEP = 469 // { int umtx_sleep(volatile const int *ptr, int value, int timeout); } + SYS_UMTX_WAKEUP = 470 // { int umtx_wakeup(volatile const int *ptr, int count); } + SYS_JAIL_ATTACH = 471 // { int jail_attach(int jid); } + SYS_SET_TLS_AREA = 472 // { int set_tls_area(int which, struct tls_info *info, size_t infosize); } + SYS_GET_TLS_AREA = 473 // { int get_tls_area(int which, struct tls_info *info, size_t infosize); } + SYS_CLOSEFROM = 474 // { int closefrom(int fd); } + SYS_STAT = 475 // { int stat(const char *path, struct stat *ub); } + SYS_FSTAT = 476 // { int fstat(int fd, struct stat *sb); } + SYS_LSTAT = 477 // { int lstat(const char *path, struct stat *ub); } + SYS_FHSTAT = 478 // { int fhstat(const struct fhandle *u_fhp, struct stat *sb); } + SYS_GETDIRENTRIES = 479 // { int getdirentries(int fd, char *buf, u_int count, \ + SYS_GETDENTS = 480 // { int getdents(int fd, char *buf, size_t count); } + SYS_USCHED_SET = 481 // { int usched_set(pid_t pid, int cmd, void *data, \ + SYS_EXTACCEPT = 482 // { int extaccept(int s, int flags, caddr_t name, int *anamelen); } + SYS_EXTCONNECT = 483 // { int extconnect(int s, int flags, caddr_t name, int namelen); } + SYS_MCONTROL = 485 // { int mcontrol(void *addr, size_t len, int behav, off_t value); } + SYS_VMSPACE_CREATE = 486 // { int vmspace_create(void *id, int type, void *data); } + SYS_VMSPACE_DESTROY = 487 // { int vmspace_destroy(void *id); } + SYS_VMSPACE_CTL = 488 // { int vmspace_ctl(void *id, int cmd, \ + SYS_VMSPACE_MMAP = 489 // { int vmspace_mmap(void *id, void *addr, size_t len, \ + SYS_VMSPACE_MUNMAP = 490 // { int vmspace_munmap(void *id, void *addr, \ + SYS_VMSPACE_MCONTROL = 491 // { int vmspace_mcontrol(void *id, void *addr, \ + SYS_VMSPACE_PREAD = 492 // { ssize_t vmspace_pread(void *id, void *buf, \ + SYS_VMSPACE_PWRITE = 493 // { ssize_t vmspace_pwrite(void *id, const void *buf, \ + SYS_EXTEXIT = 494 // { void extexit(int how, int status, void *addr); } + SYS_LWP_CREATE = 495 // { int lwp_create(struct lwp_params *params); } + SYS_LWP_GETTID = 496 // { lwpid_t lwp_gettid(void); } + SYS_LWP_KILL = 497 // { int lwp_kill(pid_t pid, lwpid_t tid, int signum); } + SYS_LWP_RTPRIO = 498 // { int lwp_rtprio(int function, pid_t pid, lwpid_t tid, struct rtprio *rtp); } + SYS_PSELECT = 499 // { int pselect(int nd, fd_set *in, fd_set *ou, \ + SYS_STATVFS = 500 // { int statvfs(const char *path, struct statvfs *buf); } + SYS_FSTATVFS = 501 // { int fstatvfs(int fd, struct statvfs *buf); } + SYS_FHSTATVFS = 502 // { int fhstatvfs(const struct fhandle *u_fhp, struct statvfs *buf); } + SYS_GETVFSSTAT = 503 // { int getvfsstat(struct statfs *buf, \ + SYS_OPENAT = 504 // { int openat(int fd, char *path, int flags, int mode); } + SYS_FSTATAT = 505 // { int fstatat(int fd, char *path, \ + SYS_FCHMODAT = 506 // { int fchmodat(int fd, char *path, int mode, \ + SYS_FCHOWNAT = 507 // { int fchownat(int fd, char *path, int uid, int gid, \ + SYS_UNLINKAT = 508 // { int unlinkat(int fd, char *path, int flags); } + SYS_FACCESSAT = 509 // { int faccessat(int fd, char *path, int amode, \ + SYS_MQ_OPEN = 510 // { mqd_t mq_open(const char * name, int oflag, \ + SYS_MQ_CLOSE = 511 // { int mq_close(mqd_t mqdes); } + SYS_MQ_UNLINK = 512 // { int mq_unlink(const char *name); } + SYS_MQ_GETATTR = 513 // { int mq_getattr(mqd_t mqdes, \ + SYS_MQ_SETATTR = 514 // { int mq_setattr(mqd_t mqdes, \ + SYS_MQ_NOTIFY = 515 // { int mq_notify(mqd_t mqdes, \ + SYS_MQ_SEND = 516 // { int mq_send(mqd_t mqdes, const char *msg_ptr, \ + SYS_MQ_RECEIVE = 517 // { ssize_t mq_receive(mqd_t mqdes, char *msg_ptr, \ + SYS_MQ_TIMEDSEND = 518 // { int mq_timedsend(mqd_t mqdes, \ + SYS_MQ_TIMEDRECEIVE = 519 // { ssize_t mq_timedreceive(mqd_t mqdes, \ + SYS_IOPRIO_SET = 520 // { int ioprio_set(int which, int who, int prio); } + SYS_IOPRIO_GET = 521 // { int ioprio_get(int which, int who); } + SYS_CHROOT_KERNEL = 522 // { int chroot_kernel(char *path); } + SYS_RENAMEAT = 523 // { int renameat(int oldfd, char *old, int newfd, \ + SYS_MKDIRAT = 524 // { int mkdirat(int fd, char *path, mode_t mode); } + SYS_MKFIFOAT = 525 // { int mkfifoat(int fd, char *path, mode_t mode); } + SYS_MKNODAT = 526 // { int mknodat(int fd, char *path, mode_t mode, \ + SYS_READLINKAT = 527 // { int readlinkat(int fd, char *path, char *buf, \ + SYS_SYMLINKAT = 528 // { int symlinkat(char *path1, int fd, char *path2); } + SYS_SWAPOFF = 529 // { int swapoff(char *name); } + SYS_VQUOTACTL = 530 // { int vquotactl(const char *path, \ + SYS_LINKAT = 531 // { int linkat(int fd1, char *path1, int fd2, \ + SYS_EACCESS = 532 // { int eaccess(char *path, int flags); } + SYS_LPATHCONF = 533 // { int lpathconf(char *path, int name); } + SYS_VMM_GUEST_CTL = 534 // { int vmm_guest_ctl(int op, struct vmm_guest_options *options); } + SYS_VMM_GUEST_SYNC_ADDR = 535 // { int vmm_guest_sync_addr(long *dstaddr, long *srcaddr); } + SYS_PROCCTL = 536 // { int procctl(idtype_t idtype, id_t id, int cmd, void *data); } + SYS_CHFLAGSAT = 537 // { int chflagsat(int fd, const char *path, int flags, int atflags);} + SYS_PIPE2 = 538 // { int pipe2(int *fildes, int flags); } + SYS_UTIMENSAT = 539 // { int utimensat(int fd, const char *path, const struct timespec *ts, int flags); } + SYS_FUTIMENS = 540 // { int futimens(int fd, const struct timespec *ts); } + SYS_ACCEPT4 = 541 // { int accept4(int s, caddr_t name, int *anamelen, int flags); } + SYS_LWP_SETNAME = 542 // { int lwp_setname(lwpid_t tid, const char *name); } + SYS_PPOLL = 543 // { int ppoll(struct pollfd *fds, u_int nfds, \ + SYS_LWP_SETAFFINITY = 544 // { int lwp_setaffinity(pid_t pid, lwpid_t tid, const cpumask_t *mask); } + SYS_LWP_GETAFFINITY = 545 // { int lwp_getaffinity(pid_t pid, lwpid_t tid, cpumask_t *mask); } + SYS_LWP_CREATE2 = 546 // { int lwp_create2(struct lwp_params *params, const cpumask_t *mask); } +) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go new file mode 100644 index 00000000..1ab8780c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go @@ -0,0 +1,403 @@ +// mksysnum_freebsd.pl +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build 386,freebsd + +package unix + +const ( + // SYS_NOSYS = 0; // { int nosys(void); } syscall nosys_args int + SYS_EXIT = 1 // { void sys_exit(int rval); } exit \ + SYS_FORK = 2 // { int fork(void); } + SYS_READ = 3 // { ssize_t read(int fd, void *buf, \ + SYS_WRITE = 4 // { ssize_t write(int fd, const void *buf, \ + SYS_OPEN = 5 // { int open(char *path, int flags, int mode); } + SYS_CLOSE = 6 // { int close(int fd); } + SYS_WAIT4 = 7 // { int wait4(int pid, int *status, \ + SYS_LINK = 9 // { int link(char *path, char *link); } + SYS_UNLINK = 10 // { int unlink(char *path); } + SYS_CHDIR = 12 // { int chdir(char *path); } + SYS_FCHDIR = 13 // { int fchdir(int fd); } + SYS_MKNOD = 14 // { int mknod(char *path, int mode, int dev); } + SYS_CHMOD = 15 // { int chmod(char *path, int mode); } + SYS_CHOWN = 16 // { int chown(char *path, int uid, int gid); } + SYS_OBREAK = 17 // { int obreak(char *nsize); } break \ + SYS_GETPID = 20 // { pid_t getpid(void); } + SYS_MOUNT = 21 // { int mount(char *type, char *path, \ + SYS_UNMOUNT = 22 // { int unmount(char *path, int flags); } + SYS_SETUID = 23 // { int setuid(uid_t uid); } + SYS_GETUID = 24 // { uid_t getuid(void); } + SYS_GETEUID = 25 // { uid_t geteuid(void); } + SYS_PTRACE = 26 // { int ptrace(int req, pid_t pid, \ + SYS_RECVMSG = 27 // { int recvmsg(int s, struct msghdr *msg, \ + SYS_SENDMSG = 28 // { int sendmsg(int s, struct msghdr *msg, \ + SYS_RECVFROM = 29 // { int recvfrom(int s, caddr_t buf, \ + SYS_ACCEPT = 30 // { int accept(int s, \ + SYS_GETPEERNAME = 31 // { int getpeername(int fdes, \ + SYS_GETSOCKNAME = 32 // { int getsockname(int fdes, \ + SYS_ACCESS = 33 // { int access(char *path, int amode); } + SYS_CHFLAGS = 34 // { int chflags(const char *path, u_long flags); } + SYS_FCHFLAGS = 35 // { int fchflags(int fd, u_long flags); } + SYS_SYNC = 36 // { int sync(void); } + SYS_KILL = 37 // { int kill(int pid, int signum); } + SYS_GETPPID = 39 // { pid_t getppid(void); } + SYS_DUP = 41 // { int dup(u_int fd); } + SYS_PIPE = 42 // { int pipe(void); } + SYS_GETEGID = 43 // { gid_t getegid(void); } + SYS_PROFIL = 44 // { int profil(caddr_t samples, size_t size, \ + SYS_KTRACE = 45 // { int ktrace(const char *fname, int ops, \ + SYS_GETGID = 47 // { gid_t getgid(void); } + SYS_GETLOGIN = 49 // { int getlogin(char *namebuf, u_int \ + SYS_SETLOGIN = 50 // { int setlogin(char *namebuf); } + SYS_ACCT = 51 // { int acct(char *path); } + SYS_SIGALTSTACK = 53 // { int sigaltstack(stack_t *ss, \ + SYS_IOCTL = 54 // { int ioctl(int fd, u_long com, \ + SYS_REBOOT = 55 // { int reboot(int opt); } + SYS_REVOKE = 56 // { int revoke(char *path); } + SYS_SYMLINK = 57 // { int symlink(char *path, char *link); } + SYS_READLINK = 58 // { ssize_t readlink(char *path, char *buf, \ + SYS_EXECVE = 59 // { int execve(char *fname, char **argv, \ + SYS_UMASK = 60 // { int umask(int newmask); } umask umask_args \ + SYS_CHROOT = 61 // { int chroot(char *path); } + SYS_MSYNC = 65 // { int msync(void *addr, size_t len, \ + SYS_VFORK = 66 // { int vfork(void); } + SYS_SBRK = 69 // { int sbrk(int incr); } + SYS_SSTK = 70 // { int sstk(int incr); } + SYS_OVADVISE = 72 // { int ovadvise(int anom); } vadvise \ + SYS_MUNMAP = 73 // { int munmap(void *addr, size_t len); } + SYS_MPROTECT = 74 // { int mprotect(const void *addr, size_t len, \ + SYS_MADVISE = 75 // { int madvise(void *addr, size_t len, \ + SYS_MINCORE = 78 // { int mincore(const void *addr, size_t len, \ + SYS_GETGROUPS = 79 // { int getgroups(u_int gidsetsize, \ + SYS_SETGROUPS = 80 // { int setgroups(u_int gidsetsize, \ + SYS_GETPGRP = 81 // { int getpgrp(void); } + SYS_SETPGID = 82 // { int setpgid(int pid, int pgid); } + SYS_SETITIMER = 83 // { int setitimer(u_int which, struct \ + SYS_SWAPON = 85 // { int swapon(char *name); } + SYS_GETITIMER = 86 // { int getitimer(u_int which, \ + SYS_GETDTABLESIZE = 89 // { int getdtablesize(void); } + SYS_DUP2 = 90 // { int dup2(u_int from, u_int to); } + SYS_FCNTL = 92 // { int fcntl(int fd, int cmd, long arg); } + SYS_SELECT = 93 // { int select(int nd, fd_set *in, fd_set *ou, \ + SYS_FSYNC = 95 // { int fsync(int fd); } + SYS_SETPRIORITY = 96 // { int setpriority(int which, int who, \ + SYS_SOCKET = 97 // { int socket(int domain, int type, \ + SYS_CONNECT = 98 // { int connect(int s, caddr_t name, \ + SYS_GETPRIORITY = 100 // { int getpriority(int which, int who); } + SYS_BIND = 104 // { int bind(int s, caddr_t name, \ + SYS_SETSOCKOPT = 105 // { int setsockopt(int s, int level, int name, \ + SYS_LISTEN = 106 // { int listen(int s, int backlog); } + SYS_GETTIMEOFDAY = 116 // { int gettimeofday(struct timeval *tp, \ + SYS_GETRUSAGE = 117 // { int getrusage(int who, \ + SYS_GETSOCKOPT = 118 // { int getsockopt(int s, int level, int name, \ + SYS_READV = 120 // { int readv(int fd, struct iovec *iovp, \ + SYS_WRITEV = 121 // { int writev(int fd, struct iovec *iovp, \ + SYS_SETTIMEOFDAY = 122 // { int settimeofday(struct timeval *tv, \ + SYS_FCHOWN = 123 // { int fchown(int fd, int uid, int gid); } + SYS_FCHMOD = 124 // { int fchmod(int fd, int mode); } + SYS_SETREUID = 126 // { int setreuid(int ruid, int euid); } + SYS_SETREGID = 127 // { int setregid(int rgid, int egid); } + SYS_RENAME = 128 // { int rename(char *from, char *to); } + SYS_FLOCK = 131 // { int flock(int fd, int how); } + SYS_MKFIFO = 132 // { int mkfifo(char *path, int mode); } + SYS_SENDTO = 133 // { int sendto(int s, caddr_t buf, size_t len, \ + SYS_SHUTDOWN = 134 // { int shutdown(int s, int how); } + SYS_SOCKETPAIR = 135 // { int socketpair(int domain, int type, \ + SYS_MKDIR = 136 // { int mkdir(char *path, int mode); } + SYS_RMDIR = 137 // { int rmdir(char *path); } + SYS_UTIMES = 138 // { int utimes(char *path, \ + SYS_ADJTIME = 140 // { int adjtime(struct timeval *delta, \ + SYS_SETSID = 147 // { int setsid(void); } + SYS_QUOTACTL = 148 // { int quotactl(char *path, int cmd, int uid, \ + SYS_NLM_SYSCALL = 154 // { int nlm_syscall(int debug_level, int grace_period, int addr_count, char **addrs); } + SYS_NFSSVC = 155 // { int nfssvc(int flag, caddr_t argp); } + SYS_LGETFH = 160 // { int lgetfh(char *fname, \ + SYS_GETFH = 161 // { int getfh(char *fname, \ + SYS_SYSARCH = 165 // { int sysarch(int op, char *parms); } + SYS_RTPRIO = 166 // { int rtprio(int function, pid_t pid, \ + SYS_SEMSYS = 169 // { int semsys(int which, int a2, int a3, \ + SYS_MSGSYS = 170 // { int msgsys(int which, int a2, int a3, \ + SYS_SHMSYS = 171 // { int shmsys(int which, int a2, int a3, \ + SYS_FREEBSD6_PREAD = 173 // { ssize_t freebsd6_pread(int fd, void *buf, \ + SYS_FREEBSD6_PWRITE = 174 // { ssize_t freebsd6_pwrite(int fd, \ + SYS_SETFIB = 175 // { int setfib(int fibnum); } + SYS_NTP_ADJTIME = 176 // { int ntp_adjtime(struct timex *tp); } + SYS_SETGID = 181 // { int setgid(gid_t gid); } + SYS_SETEGID = 182 // { int setegid(gid_t egid); } + SYS_SETEUID = 183 // { int seteuid(uid_t euid); } + SYS_STAT = 188 // { int stat(char *path, struct stat *ub); } + SYS_FSTAT = 189 // { int fstat(int fd, struct stat *sb); } + SYS_LSTAT = 190 // { int lstat(char *path, struct stat *ub); } + SYS_PATHCONF = 191 // { int pathconf(char *path, int name); } + SYS_FPATHCONF = 192 // { int fpathconf(int fd, int name); } + SYS_GETRLIMIT = 194 // { int getrlimit(u_int which, \ + SYS_SETRLIMIT = 195 // { int setrlimit(u_int which, \ + SYS_GETDIRENTRIES = 196 // { int getdirentries(int fd, char *buf, \ + SYS_FREEBSD6_MMAP = 197 // { caddr_t freebsd6_mmap(caddr_t addr, \ + SYS_FREEBSD6_LSEEK = 199 // { off_t freebsd6_lseek(int fd, int pad, \ + SYS_FREEBSD6_TRUNCATE = 200 // { int freebsd6_truncate(char *path, int pad, \ + SYS_FREEBSD6_FTRUNCATE = 201 // { int freebsd6_ftruncate(int fd, int pad, \ + SYS___SYSCTL = 202 // { int __sysctl(int *name, u_int namelen, \ + SYS_MLOCK = 203 // { int mlock(const void *addr, size_t len); } + SYS_MUNLOCK = 204 // { int munlock(const void *addr, size_t len); } + SYS_UNDELETE = 205 // { int undelete(char *path); } + SYS_FUTIMES = 206 // { int futimes(int fd, struct timeval *tptr); } + SYS_GETPGID = 207 // { int getpgid(pid_t pid); } + SYS_POLL = 209 // { int poll(struct pollfd *fds, u_int nfds, \ + SYS_SEMGET = 221 // { int semget(key_t key, int nsems, \ + SYS_SEMOP = 222 // { int semop(int semid, struct sembuf *sops, \ + SYS_MSGGET = 225 // { int msgget(key_t key, int msgflg); } + SYS_MSGSND = 226 // { int msgsnd(int msqid, const void *msgp, \ + SYS_MSGRCV = 227 // { int msgrcv(int msqid, void *msgp, \ + SYS_SHMAT = 228 // { int shmat(int shmid, const void *shmaddr, \ + SYS_SHMDT = 230 // { int shmdt(const void *shmaddr); } + SYS_SHMGET = 231 // { int shmget(key_t key, size_t size, \ + SYS_CLOCK_GETTIME = 232 // { int clock_gettime(clockid_t clock_id, \ + SYS_CLOCK_SETTIME = 233 // { int clock_settime( \ + SYS_CLOCK_GETRES = 234 // { int clock_getres(clockid_t clock_id, \ + SYS_KTIMER_CREATE = 235 // { int ktimer_create(clockid_t clock_id, \ + SYS_KTIMER_DELETE = 236 // { int ktimer_delete(int timerid); } + SYS_KTIMER_SETTIME = 237 // { int ktimer_settime(int timerid, int flags, \ + SYS_KTIMER_GETTIME = 238 // { int ktimer_gettime(int timerid, struct \ + SYS_KTIMER_GETOVERRUN = 239 // { int ktimer_getoverrun(int timerid); } + SYS_NANOSLEEP = 240 // { int nanosleep(const struct timespec *rqtp, \ + SYS_FFCLOCK_GETCOUNTER = 241 // { int ffclock_getcounter(ffcounter *ffcount); } + SYS_FFCLOCK_SETESTIMATE = 242 // { int ffclock_setestimate( \ + SYS_FFCLOCK_GETESTIMATE = 243 // { int ffclock_getestimate( \ + SYS_CLOCK_GETCPUCLOCKID2 = 247 // { int clock_getcpuclockid2(id_t id,\ + SYS_NTP_GETTIME = 248 // { int ntp_gettime(struct ntptimeval *ntvp); } + SYS_MINHERIT = 250 // { int minherit(void *addr, size_t len, \ + SYS_RFORK = 251 // { int rfork(int flags); } + SYS_OPENBSD_POLL = 252 // { int openbsd_poll(struct pollfd *fds, \ + SYS_ISSETUGID = 253 // { int issetugid(void); } + SYS_LCHOWN = 254 // { int lchown(char *path, int uid, int gid); } + SYS_AIO_READ = 255 // { int aio_read(struct aiocb *aiocbp); } + SYS_AIO_WRITE = 256 // { int aio_write(struct aiocb *aiocbp); } + SYS_LIO_LISTIO = 257 // { int lio_listio(int mode, \ + SYS_GETDENTS = 272 // { int getdents(int fd, char *buf, \ + SYS_LCHMOD = 274 // { int lchmod(char *path, mode_t mode); } + SYS_LUTIMES = 276 // { int lutimes(char *path, \ + SYS_NSTAT = 278 // { int nstat(char *path, struct nstat *ub); } + SYS_NFSTAT = 279 // { int nfstat(int fd, struct nstat *sb); } + SYS_NLSTAT = 280 // { int nlstat(char *path, struct nstat *ub); } + SYS_PREADV = 289 // { ssize_t preadv(int fd, struct iovec *iovp, \ + SYS_PWRITEV = 290 // { ssize_t pwritev(int fd, struct iovec *iovp, \ + SYS_FHOPEN = 298 // { int fhopen(const struct fhandle *u_fhp, \ + SYS_FHSTAT = 299 // { int fhstat(const struct fhandle *u_fhp, \ + SYS_MODNEXT = 300 // { int modnext(int modid); } + SYS_MODSTAT = 301 // { int modstat(int modid, \ + SYS_MODFNEXT = 302 // { int modfnext(int modid); } + SYS_MODFIND = 303 // { int modfind(const char *name); } + SYS_KLDLOAD = 304 // { int kldload(const char *file); } + SYS_KLDUNLOAD = 305 // { int kldunload(int fileid); } + SYS_KLDFIND = 306 // { int kldfind(const char *file); } + SYS_KLDNEXT = 307 // { int kldnext(int fileid); } + SYS_KLDSTAT = 308 // { int kldstat(int fileid, struct \ + SYS_KLDFIRSTMOD = 309 // { int kldfirstmod(int fileid); } + SYS_GETSID = 310 // { int getsid(pid_t pid); } + SYS_SETRESUID = 311 // { int setresuid(uid_t ruid, uid_t euid, \ + SYS_SETRESGID = 312 // { int setresgid(gid_t rgid, gid_t egid, \ + SYS_AIO_RETURN = 314 // { int aio_return(struct aiocb *aiocbp); } + SYS_AIO_SUSPEND = 315 // { int aio_suspend( \ + SYS_AIO_CANCEL = 316 // { int aio_cancel(int fd, \ + SYS_AIO_ERROR = 317 // { int aio_error(struct aiocb *aiocbp); } + SYS_OAIO_READ = 318 // { int oaio_read(struct oaiocb *aiocbp); } + SYS_OAIO_WRITE = 319 // { int oaio_write(struct oaiocb *aiocbp); } + SYS_OLIO_LISTIO = 320 // { int olio_listio(int mode, \ + SYS_YIELD = 321 // { int yield(void); } + SYS_MLOCKALL = 324 // { int mlockall(int how); } + SYS_MUNLOCKALL = 325 // { int munlockall(void); } + SYS___GETCWD = 326 // { int __getcwd(char *buf, u_int buflen); } + SYS_SCHED_SETPARAM = 327 // { int sched_setparam (pid_t pid, \ + SYS_SCHED_GETPARAM = 328 // { int sched_getparam (pid_t pid, struct \ + SYS_SCHED_SETSCHEDULER = 329 // { int sched_setscheduler (pid_t pid, int \ + SYS_SCHED_GETSCHEDULER = 330 // { int sched_getscheduler (pid_t pid); } + SYS_SCHED_YIELD = 331 // { int sched_yield (void); } + SYS_SCHED_GET_PRIORITY_MAX = 332 // { int sched_get_priority_max (int policy); } + SYS_SCHED_GET_PRIORITY_MIN = 333 // { int sched_get_priority_min (int policy); } + SYS_SCHED_RR_GET_INTERVAL = 334 // { int sched_rr_get_interval (pid_t pid, \ + SYS_UTRACE = 335 // { int utrace(const void *addr, size_t len); } + SYS_KLDSYM = 337 // { int kldsym(int fileid, int cmd, \ + SYS_JAIL = 338 // { int jail(struct jail *jail); } + SYS_SIGPROCMASK = 340 // { int sigprocmask(int how, \ + SYS_SIGSUSPEND = 341 // { int sigsuspend(const sigset_t *sigmask); } + SYS_SIGPENDING = 343 // { int sigpending(sigset_t *set); } + SYS_SIGTIMEDWAIT = 345 // { int sigtimedwait(const sigset_t *set, \ + SYS_SIGWAITINFO = 346 // { int sigwaitinfo(const sigset_t *set, \ + SYS___ACL_GET_FILE = 347 // { int __acl_get_file(const char *path, \ + SYS___ACL_SET_FILE = 348 // { int __acl_set_file(const char *path, \ + SYS___ACL_GET_FD = 349 // { int __acl_get_fd(int filedes, \ + SYS___ACL_SET_FD = 350 // { int __acl_set_fd(int filedes, \ + SYS___ACL_DELETE_FILE = 351 // { int __acl_delete_file(const char *path, \ + SYS___ACL_DELETE_FD = 352 // { int __acl_delete_fd(int filedes, \ + SYS___ACL_ACLCHECK_FILE = 353 // { int __acl_aclcheck_file(const char *path, \ + SYS___ACL_ACLCHECK_FD = 354 // { int __acl_aclcheck_fd(int filedes, \ + SYS_EXTATTRCTL = 355 // { int extattrctl(const char *path, int cmd, \ + SYS_EXTATTR_SET_FILE = 356 // { ssize_t extattr_set_file( \ + SYS_EXTATTR_GET_FILE = 357 // { ssize_t extattr_get_file( \ + SYS_EXTATTR_DELETE_FILE = 358 // { int extattr_delete_file(const char *path, \ + SYS_AIO_WAITCOMPLETE = 359 // { int aio_waitcomplete( \ + SYS_GETRESUID = 360 // { int getresuid(uid_t *ruid, uid_t *euid, \ + SYS_GETRESGID = 361 // { int getresgid(gid_t *rgid, gid_t *egid, \ + SYS_KQUEUE = 362 // { int kqueue(void); } + SYS_KEVENT = 363 // { int kevent(int fd, \ + SYS_EXTATTR_SET_FD = 371 // { ssize_t extattr_set_fd(int fd, \ + SYS_EXTATTR_GET_FD = 372 // { ssize_t extattr_get_fd(int fd, \ + SYS_EXTATTR_DELETE_FD = 373 // { int extattr_delete_fd(int fd, \ + SYS___SETUGID = 374 // { int __setugid(int flag); } + SYS_EACCESS = 376 // { int eaccess(char *path, int amode); } + SYS_NMOUNT = 378 // { int nmount(struct iovec *iovp, \ + SYS___MAC_GET_PROC = 384 // { int __mac_get_proc(struct mac *mac_p); } + SYS___MAC_SET_PROC = 385 // { int __mac_set_proc(struct mac *mac_p); } + SYS___MAC_GET_FD = 386 // { int __mac_get_fd(int fd, \ + SYS___MAC_GET_FILE = 387 // { int __mac_get_file(const char *path_p, \ + SYS___MAC_SET_FD = 388 // { int __mac_set_fd(int fd, \ + SYS___MAC_SET_FILE = 389 // { int __mac_set_file(const char *path_p, \ + SYS_KENV = 390 // { int kenv(int what, const char *name, \ + SYS_LCHFLAGS = 391 // { int lchflags(const char *path, \ + SYS_UUIDGEN = 392 // { int uuidgen(struct uuid *store, \ + SYS_SENDFILE = 393 // { int sendfile(int fd, int s, off_t offset, \ + SYS_MAC_SYSCALL = 394 // { int mac_syscall(const char *policy, \ + SYS_GETFSSTAT = 395 // { int getfsstat(struct statfs *buf, \ + SYS_STATFS = 396 // { int statfs(char *path, \ + SYS_FSTATFS = 397 // { int fstatfs(int fd, struct statfs *buf); } + SYS_FHSTATFS = 398 // { int fhstatfs(const struct fhandle *u_fhp, \ + SYS_KSEM_CLOSE = 400 // { int ksem_close(semid_t id); } + SYS_KSEM_POST = 401 // { int ksem_post(semid_t id); } + SYS_KSEM_WAIT = 402 // { int ksem_wait(semid_t id); } + SYS_KSEM_TRYWAIT = 403 // { int ksem_trywait(semid_t id); } + SYS_KSEM_INIT = 404 // { int ksem_init(semid_t *idp, \ + SYS_KSEM_OPEN = 405 // { int ksem_open(semid_t *idp, \ + SYS_KSEM_UNLINK = 406 // { int ksem_unlink(const char *name); } + SYS_KSEM_GETVALUE = 407 // { int ksem_getvalue(semid_t id, int *val); } + SYS_KSEM_DESTROY = 408 // { int ksem_destroy(semid_t id); } + SYS___MAC_GET_PID = 409 // { int __mac_get_pid(pid_t pid, \ + SYS___MAC_GET_LINK = 410 // { int __mac_get_link(const char *path_p, \ + SYS___MAC_SET_LINK = 411 // { int __mac_set_link(const char *path_p, \ + SYS_EXTATTR_SET_LINK = 412 // { ssize_t extattr_set_link( \ + SYS_EXTATTR_GET_LINK = 413 // { ssize_t extattr_get_link( \ + SYS_EXTATTR_DELETE_LINK = 414 // { int extattr_delete_link( \ + SYS___MAC_EXECVE = 415 // { int __mac_execve(char *fname, char **argv, \ + SYS_SIGACTION = 416 // { int sigaction(int sig, \ + SYS_SIGRETURN = 417 // { int sigreturn( \ + SYS_GETCONTEXT = 421 // { int getcontext(struct __ucontext *ucp); } + SYS_SETCONTEXT = 422 // { int setcontext( \ + SYS_SWAPCONTEXT = 423 // { int swapcontext(struct __ucontext *oucp, \ + SYS_SWAPOFF = 424 // { int swapoff(const char *name); } + SYS___ACL_GET_LINK = 425 // { int __acl_get_link(const char *path, \ + SYS___ACL_SET_LINK = 426 // { int __acl_set_link(const char *path, \ + SYS___ACL_DELETE_LINK = 427 // { int __acl_delete_link(const char *path, \ + SYS___ACL_ACLCHECK_LINK = 428 // { int __acl_aclcheck_link(const char *path, \ + SYS_SIGWAIT = 429 // { int sigwait(const sigset_t *set, \ + SYS_THR_CREATE = 430 // { int thr_create(ucontext_t *ctx, long *id, \ + SYS_THR_EXIT = 431 // { void thr_exit(long *state); } + SYS_THR_SELF = 432 // { int thr_self(long *id); } + SYS_THR_KILL = 433 // { int thr_kill(long id, int sig); } + SYS__UMTX_LOCK = 434 // { int _umtx_lock(struct umtx *umtx); } + SYS__UMTX_UNLOCK = 435 // { int _umtx_unlock(struct umtx *umtx); } + SYS_JAIL_ATTACH = 436 // { int jail_attach(int jid); } + SYS_EXTATTR_LIST_FD = 437 // { ssize_t extattr_list_fd(int fd, \ + SYS_EXTATTR_LIST_FILE = 438 // { ssize_t extattr_list_file( \ + SYS_EXTATTR_LIST_LINK = 439 // { ssize_t extattr_list_link( \ + SYS_KSEM_TIMEDWAIT = 441 // { int ksem_timedwait(semid_t id, \ + SYS_THR_SUSPEND = 442 // { int thr_suspend( \ + SYS_THR_WAKE = 443 // { int thr_wake(long id); } + SYS_KLDUNLOADF = 444 // { int kldunloadf(int fileid, int flags); } + SYS_AUDIT = 445 // { int audit(const void *record, \ + SYS_AUDITON = 446 // { int auditon(int cmd, void *data, \ + SYS_GETAUID = 447 // { int getauid(uid_t *auid); } + SYS_SETAUID = 448 // { int setauid(uid_t *auid); } + SYS_GETAUDIT = 449 // { int getaudit(struct auditinfo *auditinfo); } + SYS_SETAUDIT = 450 // { int setaudit(struct auditinfo *auditinfo); } + SYS_GETAUDIT_ADDR = 451 // { int getaudit_addr( \ + SYS_SETAUDIT_ADDR = 452 // { int setaudit_addr( \ + SYS_AUDITCTL = 453 // { int auditctl(char *path); } + SYS__UMTX_OP = 454 // { int _umtx_op(void *obj, int op, \ + SYS_THR_NEW = 455 // { int thr_new(struct thr_param *param, \ + SYS_SIGQUEUE = 456 // { int sigqueue(pid_t pid, int signum, void *value); } + SYS_KMQ_OPEN = 457 // { int kmq_open(const char *path, int flags, \ + SYS_KMQ_SETATTR = 458 // { int kmq_setattr(int mqd, \ + SYS_KMQ_TIMEDRECEIVE = 459 // { int kmq_timedreceive(int mqd, \ + SYS_KMQ_TIMEDSEND = 460 // { int kmq_timedsend(int mqd, \ + SYS_KMQ_NOTIFY = 461 // { int kmq_notify(int mqd, \ + SYS_KMQ_UNLINK = 462 // { int kmq_unlink(const char *path); } + SYS_ABORT2 = 463 // { int abort2(const char *why, int nargs, void **args); } + SYS_THR_SET_NAME = 464 // { int thr_set_name(long id, const char *name); } + SYS_AIO_FSYNC = 465 // { int aio_fsync(int op, struct aiocb *aiocbp); } + SYS_RTPRIO_THREAD = 466 // { int rtprio_thread(int function, \ + SYS_SCTP_PEELOFF = 471 // { int sctp_peeloff(int sd, uint32_t name); } + SYS_SCTP_GENERIC_SENDMSG = 472 // { int sctp_generic_sendmsg(int sd, caddr_t msg, int mlen, \ + SYS_SCTP_GENERIC_SENDMSG_IOV = 473 // { int sctp_generic_sendmsg_iov(int sd, struct iovec *iov, int iovlen, \ + SYS_SCTP_GENERIC_RECVMSG = 474 // { int sctp_generic_recvmsg(int sd, struct iovec *iov, int iovlen, \ + SYS_PREAD = 475 // { ssize_t pread(int fd, void *buf, \ + SYS_PWRITE = 476 // { ssize_t pwrite(int fd, const void *buf, \ + SYS_MMAP = 477 // { caddr_t mmap(caddr_t addr, size_t len, \ + SYS_LSEEK = 478 // { off_t lseek(int fd, off_t offset, \ + SYS_TRUNCATE = 479 // { int truncate(char *path, off_t length); } + SYS_FTRUNCATE = 480 // { int ftruncate(int fd, off_t length); } + SYS_THR_KILL2 = 481 // { int thr_kill2(pid_t pid, long id, int sig); } + SYS_SHM_OPEN = 482 // { int shm_open(const char *path, int flags, \ + SYS_SHM_UNLINK = 483 // { int shm_unlink(const char *path); } + SYS_CPUSET = 484 // { int cpuset(cpusetid_t *setid); } + SYS_CPUSET_SETID = 485 // { int cpuset_setid(cpuwhich_t which, id_t id, \ + SYS_CPUSET_GETID = 486 // { int cpuset_getid(cpulevel_t level, \ + SYS_CPUSET_GETAFFINITY = 487 // { int cpuset_getaffinity(cpulevel_t level, \ + SYS_CPUSET_SETAFFINITY = 488 // { int cpuset_setaffinity(cpulevel_t level, \ + SYS_FACCESSAT = 489 // { int faccessat(int fd, char *path, int amode, \ + SYS_FCHMODAT = 490 // { int fchmodat(int fd, char *path, mode_t mode, \ + SYS_FCHOWNAT = 491 // { int fchownat(int fd, char *path, uid_t uid, \ + SYS_FEXECVE = 492 // { int fexecve(int fd, char **argv, \ + SYS_FSTATAT = 493 // { int fstatat(int fd, char *path, \ + SYS_FUTIMESAT = 494 // { int futimesat(int fd, char *path, \ + SYS_LINKAT = 495 // { int linkat(int fd1, char *path1, int fd2, \ + SYS_MKDIRAT = 496 // { int mkdirat(int fd, char *path, mode_t mode); } + SYS_MKFIFOAT = 497 // { int mkfifoat(int fd, char *path, mode_t mode); } + SYS_MKNODAT = 498 // { int mknodat(int fd, char *path, mode_t mode, \ + SYS_OPENAT = 499 // { int openat(int fd, char *path, int flag, \ + SYS_READLINKAT = 500 // { int readlinkat(int fd, char *path, char *buf, \ + SYS_RENAMEAT = 501 // { int renameat(int oldfd, char *old, int newfd, \ + SYS_SYMLINKAT = 502 // { int symlinkat(char *path1, int fd, \ + SYS_UNLINKAT = 503 // { int unlinkat(int fd, char *path, int flag); } + SYS_POSIX_OPENPT = 504 // { int posix_openpt(int flags); } + SYS_GSSD_SYSCALL = 505 // { int gssd_syscall(char *path); } + SYS_JAIL_GET = 506 // { int jail_get(struct iovec *iovp, \ + SYS_JAIL_SET = 507 // { int jail_set(struct iovec *iovp, \ + SYS_JAIL_REMOVE = 508 // { int jail_remove(int jid); } + SYS_CLOSEFROM = 509 // { int closefrom(int lowfd); } + SYS___SEMCTL = 510 // { int __semctl(int semid, int semnum, \ + SYS_MSGCTL = 511 // { int msgctl(int msqid, int cmd, \ + SYS_SHMCTL = 512 // { int shmctl(int shmid, int cmd, \ + SYS_LPATHCONF = 513 // { int lpathconf(char *path, int name); } + SYS___CAP_RIGHTS_GET = 515 // { int __cap_rights_get(int version, \ + SYS_CAP_ENTER = 516 // { int cap_enter(void); } + SYS_CAP_GETMODE = 517 // { int cap_getmode(u_int *modep); } + SYS_PDFORK = 518 // { int pdfork(int *fdp, int flags); } + SYS_PDKILL = 519 // { int pdkill(int fd, int signum); } + SYS_PDGETPID = 520 // { int pdgetpid(int fd, pid_t *pidp); } + SYS_PSELECT = 522 // { int pselect(int nd, fd_set *in, \ + SYS_GETLOGINCLASS = 523 // { int getloginclass(char *namebuf, \ + SYS_SETLOGINCLASS = 524 // { int setloginclass(const char *namebuf); } + SYS_RCTL_GET_RACCT = 525 // { int rctl_get_racct(const void *inbufp, \ + SYS_RCTL_GET_RULES = 526 // { int rctl_get_rules(const void *inbufp, \ + SYS_RCTL_GET_LIMITS = 527 // { int rctl_get_limits(const void *inbufp, \ + SYS_RCTL_ADD_RULE = 528 // { int rctl_add_rule(const void *inbufp, \ + SYS_RCTL_REMOVE_RULE = 529 // { int rctl_remove_rule(const void *inbufp, \ + SYS_POSIX_FALLOCATE = 530 // { int posix_fallocate(int fd, \ + SYS_POSIX_FADVISE = 531 // { int posix_fadvise(int fd, off_t offset, \ + SYS_WAIT6 = 532 // { int wait6(idtype_t idtype, id_t id, \ + SYS_CAP_RIGHTS_LIMIT = 533 // { int cap_rights_limit(int fd, \ + SYS_CAP_IOCTLS_LIMIT = 534 // { int cap_ioctls_limit(int fd, \ + SYS_CAP_IOCTLS_GET = 535 // { ssize_t cap_ioctls_get(int fd, \ + SYS_CAP_FCNTLS_LIMIT = 536 // { int cap_fcntls_limit(int fd, \ + SYS_CAP_FCNTLS_GET = 537 // { int cap_fcntls_get(int fd, \ + SYS_BINDAT = 538 // { int bindat(int fd, int s, caddr_t name, \ + SYS_CONNECTAT = 539 // { int connectat(int fd, int s, caddr_t name, \ + SYS_CHFLAGSAT = 540 // { int chflagsat(int fd, const char *path, \ + SYS_ACCEPT4 = 541 // { int accept4(int s, \ + SYS_PIPE2 = 542 // { int pipe2(int *fildes, int flags); } + SYS_AIO_MLOCK = 543 // { int aio_mlock(struct aiocb *aiocbp); } + SYS_PROCCTL = 544 // { int procctl(idtype_t idtype, id_t id, \ + SYS_PPOLL = 545 // { int ppoll(struct pollfd *fds, u_int nfds, \ + SYS_FUTIMENS = 546 // { int futimens(int fd, \ + SYS_UTIMENSAT = 547 // { int utimensat(int fd, \ +) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go new file mode 100644 index 00000000..b66f900d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go @@ -0,0 +1,403 @@ +// mksysnum_freebsd.pl +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,freebsd + +package unix + +const ( + // SYS_NOSYS = 0; // { int nosys(void); } syscall nosys_args int + SYS_EXIT = 1 // { void sys_exit(int rval); } exit \ + SYS_FORK = 2 // { int fork(void); } + SYS_READ = 3 // { ssize_t read(int fd, void *buf, \ + SYS_WRITE = 4 // { ssize_t write(int fd, const void *buf, \ + SYS_OPEN = 5 // { int open(char *path, int flags, int mode); } + SYS_CLOSE = 6 // { int close(int fd); } + SYS_WAIT4 = 7 // { int wait4(int pid, int *status, \ + SYS_LINK = 9 // { int link(char *path, char *link); } + SYS_UNLINK = 10 // { int unlink(char *path); } + SYS_CHDIR = 12 // { int chdir(char *path); } + SYS_FCHDIR = 13 // { int fchdir(int fd); } + SYS_MKNOD = 14 // { int mknod(char *path, int mode, int dev); } + SYS_CHMOD = 15 // { int chmod(char *path, int mode); } + SYS_CHOWN = 16 // { int chown(char *path, int uid, int gid); } + SYS_OBREAK = 17 // { int obreak(char *nsize); } break \ + SYS_GETPID = 20 // { pid_t getpid(void); } + SYS_MOUNT = 21 // { int mount(char *type, char *path, \ + SYS_UNMOUNT = 22 // { int unmount(char *path, int flags); } + SYS_SETUID = 23 // { int setuid(uid_t uid); } + SYS_GETUID = 24 // { uid_t getuid(void); } + SYS_GETEUID = 25 // { uid_t geteuid(void); } + SYS_PTRACE = 26 // { int ptrace(int req, pid_t pid, \ + SYS_RECVMSG = 27 // { int recvmsg(int s, struct msghdr *msg, \ + SYS_SENDMSG = 28 // { int sendmsg(int s, struct msghdr *msg, \ + SYS_RECVFROM = 29 // { int recvfrom(int s, caddr_t buf, \ + SYS_ACCEPT = 30 // { int accept(int s, \ + SYS_GETPEERNAME = 31 // { int getpeername(int fdes, \ + SYS_GETSOCKNAME = 32 // { int getsockname(int fdes, \ + SYS_ACCESS = 33 // { int access(char *path, int amode); } + SYS_CHFLAGS = 34 // { int chflags(const char *path, u_long flags); } + SYS_FCHFLAGS = 35 // { int fchflags(int fd, u_long flags); } + SYS_SYNC = 36 // { int sync(void); } + SYS_KILL = 37 // { int kill(int pid, int signum); } + SYS_GETPPID = 39 // { pid_t getppid(void); } + SYS_DUP = 41 // { int dup(u_int fd); } + SYS_PIPE = 42 // { int pipe(void); } + SYS_GETEGID = 43 // { gid_t getegid(void); } + SYS_PROFIL = 44 // { int profil(caddr_t samples, size_t size, \ + SYS_KTRACE = 45 // { int ktrace(const char *fname, int ops, \ + SYS_GETGID = 47 // { gid_t getgid(void); } + SYS_GETLOGIN = 49 // { int getlogin(char *namebuf, u_int \ + SYS_SETLOGIN = 50 // { int setlogin(char *namebuf); } + SYS_ACCT = 51 // { int acct(char *path); } + SYS_SIGALTSTACK = 53 // { int sigaltstack(stack_t *ss, \ + SYS_IOCTL = 54 // { int ioctl(int fd, u_long com, \ + SYS_REBOOT = 55 // { int reboot(int opt); } + SYS_REVOKE = 56 // { int revoke(char *path); } + SYS_SYMLINK = 57 // { int symlink(char *path, char *link); } + SYS_READLINK = 58 // { ssize_t readlink(char *path, char *buf, \ + SYS_EXECVE = 59 // { int execve(char *fname, char **argv, \ + SYS_UMASK = 60 // { int umask(int newmask); } umask umask_args \ + SYS_CHROOT = 61 // { int chroot(char *path); } + SYS_MSYNC = 65 // { int msync(void *addr, size_t len, \ + SYS_VFORK = 66 // { int vfork(void); } + SYS_SBRK = 69 // { int sbrk(int incr); } + SYS_SSTK = 70 // { int sstk(int incr); } + SYS_OVADVISE = 72 // { int ovadvise(int anom); } vadvise \ + SYS_MUNMAP = 73 // { int munmap(void *addr, size_t len); } + SYS_MPROTECT = 74 // { int mprotect(const void *addr, size_t len, \ + SYS_MADVISE = 75 // { int madvise(void *addr, size_t len, \ + SYS_MINCORE = 78 // { int mincore(const void *addr, size_t len, \ + SYS_GETGROUPS = 79 // { int getgroups(u_int gidsetsize, \ + SYS_SETGROUPS = 80 // { int setgroups(u_int gidsetsize, \ + SYS_GETPGRP = 81 // { int getpgrp(void); } + SYS_SETPGID = 82 // { int setpgid(int pid, int pgid); } + SYS_SETITIMER = 83 // { int setitimer(u_int which, struct \ + SYS_SWAPON = 85 // { int swapon(char *name); } + SYS_GETITIMER = 86 // { int getitimer(u_int which, \ + SYS_GETDTABLESIZE = 89 // { int getdtablesize(void); } + SYS_DUP2 = 90 // { int dup2(u_int from, u_int to); } + SYS_FCNTL = 92 // { int fcntl(int fd, int cmd, long arg); } + SYS_SELECT = 93 // { int select(int nd, fd_set *in, fd_set *ou, \ + SYS_FSYNC = 95 // { int fsync(int fd); } + SYS_SETPRIORITY = 96 // { int setpriority(int which, int who, \ + SYS_SOCKET = 97 // { int socket(int domain, int type, \ + SYS_CONNECT = 98 // { int connect(int s, caddr_t name, \ + SYS_GETPRIORITY = 100 // { int getpriority(int which, int who); } + SYS_BIND = 104 // { int bind(int s, caddr_t name, \ + SYS_SETSOCKOPT = 105 // { int setsockopt(int s, int level, int name, \ + SYS_LISTEN = 106 // { int listen(int s, int backlog); } + SYS_GETTIMEOFDAY = 116 // { int gettimeofday(struct timeval *tp, \ + SYS_GETRUSAGE = 117 // { int getrusage(int who, \ + SYS_GETSOCKOPT = 118 // { int getsockopt(int s, int level, int name, \ + SYS_READV = 120 // { int readv(int fd, struct iovec *iovp, \ + SYS_WRITEV = 121 // { int writev(int fd, struct iovec *iovp, \ + SYS_SETTIMEOFDAY = 122 // { int settimeofday(struct timeval *tv, \ + SYS_FCHOWN = 123 // { int fchown(int fd, int uid, int gid); } + SYS_FCHMOD = 124 // { int fchmod(int fd, int mode); } + SYS_SETREUID = 126 // { int setreuid(int ruid, int euid); } + SYS_SETREGID = 127 // { int setregid(int rgid, int egid); } + SYS_RENAME = 128 // { int rename(char *from, char *to); } + SYS_FLOCK = 131 // { int flock(int fd, int how); } + SYS_MKFIFO = 132 // { int mkfifo(char *path, int mode); } + SYS_SENDTO = 133 // { int sendto(int s, caddr_t buf, size_t len, \ + SYS_SHUTDOWN = 134 // { int shutdown(int s, int how); } + SYS_SOCKETPAIR = 135 // { int socketpair(int domain, int type, \ + SYS_MKDIR = 136 // { int mkdir(char *path, int mode); } + SYS_RMDIR = 137 // { int rmdir(char *path); } + SYS_UTIMES = 138 // { int utimes(char *path, \ + SYS_ADJTIME = 140 // { int adjtime(struct timeval *delta, \ + SYS_SETSID = 147 // { int setsid(void); } + SYS_QUOTACTL = 148 // { int quotactl(char *path, int cmd, int uid, \ + SYS_NLM_SYSCALL = 154 // { int nlm_syscall(int debug_level, int grace_period, int addr_count, char **addrs); } + SYS_NFSSVC = 155 // { int nfssvc(int flag, caddr_t argp); } + SYS_LGETFH = 160 // { int lgetfh(char *fname, \ + SYS_GETFH = 161 // { int getfh(char *fname, \ + SYS_SYSARCH = 165 // { int sysarch(int op, char *parms); } + SYS_RTPRIO = 166 // { int rtprio(int function, pid_t pid, \ + SYS_SEMSYS = 169 // { int semsys(int which, int a2, int a3, \ + SYS_MSGSYS = 170 // { int msgsys(int which, int a2, int a3, \ + SYS_SHMSYS = 171 // { int shmsys(int which, int a2, int a3, \ + SYS_FREEBSD6_PREAD = 173 // { ssize_t freebsd6_pread(int fd, void *buf, \ + SYS_FREEBSD6_PWRITE = 174 // { ssize_t freebsd6_pwrite(int fd, \ + SYS_SETFIB = 175 // { int setfib(int fibnum); } + SYS_NTP_ADJTIME = 176 // { int ntp_adjtime(struct timex *tp); } + SYS_SETGID = 181 // { int setgid(gid_t gid); } + SYS_SETEGID = 182 // { int setegid(gid_t egid); } + SYS_SETEUID = 183 // { int seteuid(uid_t euid); } + SYS_STAT = 188 // { int stat(char *path, struct stat *ub); } + SYS_FSTAT = 189 // { int fstat(int fd, struct stat *sb); } + SYS_LSTAT = 190 // { int lstat(char *path, struct stat *ub); } + SYS_PATHCONF = 191 // { int pathconf(char *path, int name); } + SYS_FPATHCONF = 192 // { int fpathconf(int fd, int name); } + SYS_GETRLIMIT = 194 // { int getrlimit(u_int which, \ + SYS_SETRLIMIT = 195 // { int setrlimit(u_int which, \ + SYS_GETDIRENTRIES = 196 // { int getdirentries(int fd, char *buf, \ + SYS_FREEBSD6_MMAP = 197 // { caddr_t freebsd6_mmap(caddr_t addr, \ + SYS_FREEBSD6_LSEEK = 199 // { off_t freebsd6_lseek(int fd, int pad, \ + SYS_FREEBSD6_TRUNCATE = 200 // { int freebsd6_truncate(char *path, int pad, \ + SYS_FREEBSD6_FTRUNCATE = 201 // { int freebsd6_ftruncate(int fd, int pad, \ + SYS___SYSCTL = 202 // { int __sysctl(int *name, u_int namelen, \ + SYS_MLOCK = 203 // { int mlock(const void *addr, size_t len); } + SYS_MUNLOCK = 204 // { int munlock(const void *addr, size_t len); } + SYS_UNDELETE = 205 // { int undelete(char *path); } + SYS_FUTIMES = 206 // { int futimes(int fd, struct timeval *tptr); } + SYS_GETPGID = 207 // { int getpgid(pid_t pid); } + SYS_POLL = 209 // { int poll(struct pollfd *fds, u_int nfds, \ + SYS_SEMGET = 221 // { int semget(key_t key, int nsems, \ + SYS_SEMOP = 222 // { int semop(int semid, struct sembuf *sops, \ + SYS_MSGGET = 225 // { int msgget(key_t key, int msgflg); } + SYS_MSGSND = 226 // { int msgsnd(int msqid, const void *msgp, \ + SYS_MSGRCV = 227 // { int msgrcv(int msqid, void *msgp, \ + SYS_SHMAT = 228 // { int shmat(int shmid, const void *shmaddr, \ + SYS_SHMDT = 230 // { int shmdt(const void *shmaddr); } + SYS_SHMGET = 231 // { int shmget(key_t key, size_t size, \ + SYS_CLOCK_GETTIME = 232 // { int clock_gettime(clockid_t clock_id, \ + SYS_CLOCK_SETTIME = 233 // { int clock_settime( \ + SYS_CLOCK_GETRES = 234 // { int clock_getres(clockid_t clock_id, \ + SYS_KTIMER_CREATE = 235 // { int ktimer_create(clockid_t clock_id, \ + SYS_KTIMER_DELETE = 236 // { int ktimer_delete(int timerid); } + SYS_KTIMER_SETTIME = 237 // { int ktimer_settime(int timerid, int flags, \ + SYS_KTIMER_GETTIME = 238 // { int ktimer_gettime(int timerid, struct \ + SYS_KTIMER_GETOVERRUN = 239 // { int ktimer_getoverrun(int timerid); } + SYS_NANOSLEEP = 240 // { int nanosleep(const struct timespec *rqtp, \ + SYS_FFCLOCK_GETCOUNTER = 241 // { int ffclock_getcounter(ffcounter *ffcount); } + SYS_FFCLOCK_SETESTIMATE = 242 // { int ffclock_setestimate( \ + SYS_FFCLOCK_GETESTIMATE = 243 // { int ffclock_getestimate( \ + SYS_CLOCK_GETCPUCLOCKID2 = 247 // { int clock_getcpuclockid2(id_t id,\ + SYS_NTP_GETTIME = 248 // { int ntp_gettime(struct ntptimeval *ntvp); } + SYS_MINHERIT = 250 // { int minherit(void *addr, size_t len, \ + SYS_RFORK = 251 // { int rfork(int flags); } + SYS_OPENBSD_POLL = 252 // { int openbsd_poll(struct pollfd *fds, \ + SYS_ISSETUGID = 253 // { int issetugid(void); } + SYS_LCHOWN = 254 // { int lchown(char *path, int uid, int gid); } + SYS_AIO_READ = 255 // { int aio_read(struct aiocb *aiocbp); } + SYS_AIO_WRITE = 256 // { int aio_write(struct aiocb *aiocbp); } + SYS_LIO_LISTIO = 257 // { int lio_listio(int mode, \ + SYS_GETDENTS = 272 // { int getdents(int fd, char *buf, \ + SYS_LCHMOD = 274 // { int lchmod(char *path, mode_t mode); } + SYS_LUTIMES = 276 // { int lutimes(char *path, \ + SYS_NSTAT = 278 // { int nstat(char *path, struct nstat *ub); } + SYS_NFSTAT = 279 // { int nfstat(int fd, struct nstat *sb); } + SYS_NLSTAT = 280 // { int nlstat(char *path, struct nstat *ub); } + SYS_PREADV = 289 // { ssize_t preadv(int fd, struct iovec *iovp, \ + SYS_PWRITEV = 290 // { ssize_t pwritev(int fd, struct iovec *iovp, \ + SYS_FHOPEN = 298 // { int fhopen(const struct fhandle *u_fhp, \ + SYS_FHSTAT = 299 // { int fhstat(const struct fhandle *u_fhp, \ + SYS_MODNEXT = 300 // { int modnext(int modid); } + SYS_MODSTAT = 301 // { int modstat(int modid, \ + SYS_MODFNEXT = 302 // { int modfnext(int modid); } + SYS_MODFIND = 303 // { int modfind(const char *name); } + SYS_KLDLOAD = 304 // { int kldload(const char *file); } + SYS_KLDUNLOAD = 305 // { int kldunload(int fileid); } + SYS_KLDFIND = 306 // { int kldfind(const char *file); } + SYS_KLDNEXT = 307 // { int kldnext(int fileid); } + SYS_KLDSTAT = 308 // { int kldstat(int fileid, struct \ + SYS_KLDFIRSTMOD = 309 // { int kldfirstmod(int fileid); } + SYS_GETSID = 310 // { int getsid(pid_t pid); } + SYS_SETRESUID = 311 // { int setresuid(uid_t ruid, uid_t euid, \ + SYS_SETRESGID = 312 // { int setresgid(gid_t rgid, gid_t egid, \ + SYS_AIO_RETURN = 314 // { int aio_return(struct aiocb *aiocbp); } + SYS_AIO_SUSPEND = 315 // { int aio_suspend( \ + SYS_AIO_CANCEL = 316 // { int aio_cancel(int fd, \ + SYS_AIO_ERROR = 317 // { int aio_error(struct aiocb *aiocbp); } + SYS_OAIO_READ = 318 // { int oaio_read(struct oaiocb *aiocbp); } + SYS_OAIO_WRITE = 319 // { int oaio_write(struct oaiocb *aiocbp); } + SYS_OLIO_LISTIO = 320 // { int olio_listio(int mode, \ + SYS_YIELD = 321 // { int yield(void); } + SYS_MLOCKALL = 324 // { int mlockall(int how); } + SYS_MUNLOCKALL = 325 // { int munlockall(void); } + SYS___GETCWD = 326 // { int __getcwd(char *buf, u_int buflen); } + SYS_SCHED_SETPARAM = 327 // { int sched_setparam (pid_t pid, \ + SYS_SCHED_GETPARAM = 328 // { int sched_getparam (pid_t pid, struct \ + SYS_SCHED_SETSCHEDULER = 329 // { int sched_setscheduler (pid_t pid, int \ + SYS_SCHED_GETSCHEDULER = 330 // { int sched_getscheduler (pid_t pid); } + SYS_SCHED_YIELD = 331 // { int sched_yield (void); } + SYS_SCHED_GET_PRIORITY_MAX = 332 // { int sched_get_priority_max (int policy); } + SYS_SCHED_GET_PRIORITY_MIN = 333 // { int sched_get_priority_min (int policy); } + SYS_SCHED_RR_GET_INTERVAL = 334 // { int sched_rr_get_interval (pid_t pid, \ + SYS_UTRACE = 335 // { int utrace(const void *addr, size_t len); } + SYS_KLDSYM = 337 // { int kldsym(int fileid, int cmd, \ + SYS_JAIL = 338 // { int jail(struct jail *jail); } + SYS_SIGPROCMASK = 340 // { int sigprocmask(int how, \ + SYS_SIGSUSPEND = 341 // { int sigsuspend(const sigset_t *sigmask); } + SYS_SIGPENDING = 343 // { int sigpending(sigset_t *set); } + SYS_SIGTIMEDWAIT = 345 // { int sigtimedwait(const sigset_t *set, \ + SYS_SIGWAITINFO = 346 // { int sigwaitinfo(const sigset_t *set, \ + SYS___ACL_GET_FILE = 347 // { int __acl_get_file(const char *path, \ + SYS___ACL_SET_FILE = 348 // { int __acl_set_file(const char *path, \ + SYS___ACL_GET_FD = 349 // { int __acl_get_fd(int filedes, \ + SYS___ACL_SET_FD = 350 // { int __acl_set_fd(int filedes, \ + SYS___ACL_DELETE_FILE = 351 // { int __acl_delete_file(const char *path, \ + SYS___ACL_DELETE_FD = 352 // { int __acl_delete_fd(int filedes, \ + SYS___ACL_ACLCHECK_FILE = 353 // { int __acl_aclcheck_file(const char *path, \ + SYS___ACL_ACLCHECK_FD = 354 // { int __acl_aclcheck_fd(int filedes, \ + SYS_EXTATTRCTL = 355 // { int extattrctl(const char *path, int cmd, \ + SYS_EXTATTR_SET_FILE = 356 // { ssize_t extattr_set_file( \ + SYS_EXTATTR_GET_FILE = 357 // { ssize_t extattr_get_file( \ + SYS_EXTATTR_DELETE_FILE = 358 // { int extattr_delete_file(const char *path, \ + SYS_AIO_WAITCOMPLETE = 359 // { int aio_waitcomplete( \ + SYS_GETRESUID = 360 // { int getresuid(uid_t *ruid, uid_t *euid, \ + SYS_GETRESGID = 361 // { int getresgid(gid_t *rgid, gid_t *egid, \ + SYS_KQUEUE = 362 // { int kqueue(void); } + SYS_KEVENT = 363 // { int kevent(int fd, \ + SYS_EXTATTR_SET_FD = 371 // { ssize_t extattr_set_fd(int fd, \ + SYS_EXTATTR_GET_FD = 372 // { ssize_t extattr_get_fd(int fd, \ + SYS_EXTATTR_DELETE_FD = 373 // { int extattr_delete_fd(int fd, \ + SYS___SETUGID = 374 // { int __setugid(int flag); } + SYS_EACCESS = 376 // { int eaccess(char *path, int amode); } + SYS_NMOUNT = 378 // { int nmount(struct iovec *iovp, \ + SYS___MAC_GET_PROC = 384 // { int __mac_get_proc(struct mac *mac_p); } + SYS___MAC_SET_PROC = 385 // { int __mac_set_proc(struct mac *mac_p); } + SYS___MAC_GET_FD = 386 // { int __mac_get_fd(int fd, \ + SYS___MAC_GET_FILE = 387 // { int __mac_get_file(const char *path_p, \ + SYS___MAC_SET_FD = 388 // { int __mac_set_fd(int fd, \ + SYS___MAC_SET_FILE = 389 // { int __mac_set_file(const char *path_p, \ + SYS_KENV = 390 // { int kenv(int what, const char *name, \ + SYS_LCHFLAGS = 391 // { int lchflags(const char *path, \ + SYS_UUIDGEN = 392 // { int uuidgen(struct uuid *store, \ + SYS_SENDFILE = 393 // { int sendfile(int fd, int s, off_t offset, \ + SYS_MAC_SYSCALL = 394 // { int mac_syscall(const char *policy, \ + SYS_GETFSSTAT = 395 // { int getfsstat(struct statfs *buf, \ + SYS_STATFS = 396 // { int statfs(char *path, \ + SYS_FSTATFS = 397 // { int fstatfs(int fd, struct statfs *buf); } + SYS_FHSTATFS = 398 // { int fhstatfs(const struct fhandle *u_fhp, \ + SYS_KSEM_CLOSE = 400 // { int ksem_close(semid_t id); } + SYS_KSEM_POST = 401 // { int ksem_post(semid_t id); } + SYS_KSEM_WAIT = 402 // { int ksem_wait(semid_t id); } + SYS_KSEM_TRYWAIT = 403 // { int ksem_trywait(semid_t id); } + SYS_KSEM_INIT = 404 // { int ksem_init(semid_t *idp, \ + SYS_KSEM_OPEN = 405 // { int ksem_open(semid_t *idp, \ + SYS_KSEM_UNLINK = 406 // { int ksem_unlink(const char *name); } + SYS_KSEM_GETVALUE = 407 // { int ksem_getvalue(semid_t id, int *val); } + SYS_KSEM_DESTROY = 408 // { int ksem_destroy(semid_t id); } + SYS___MAC_GET_PID = 409 // { int __mac_get_pid(pid_t pid, \ + SYS___MAC_GET_LINK = 410 // { int __mac_get_link(const char *path_p, \ + SYS___MAC_SET_LINK = 411 // { int __mac_set_link(const char *path_p, \ + SYS_EXTATTR_SET_LINK = 412 // { ssize_t extattr_set_link( \ + SYS_EXTATTR_GET_LINK = 413 // { ssize_t extattr_get_link( \ + SYS_EXTATTR_DELETE_LINK = 414 // { int extattr_delete_link( \ + SYS___MAC_EXECVE = 415 // { int __mac_execve(char *fname, char **argv, \ + SYS_SIGACTION = 416 // { int sigaction(int sig, \ + SYS_SIGRETURN = 417 // { int sigreturn( \ + SYS_GETCONTEXT = 421 // { int getcontext(struct __ucontext *ucp); } + SYS_SETCONTEXT = 422 // { int setcontext( \ + SYS_SWAPCONTEXT = 423 // { int swapcontext(struct __ucontext *oucp, \ + SYS_SWAPOFF = 424 // { int swapoff(const char *name); } + SYS___ACL_GET_LINK = 425 // { int __acl_get_link(const char *path, \ + SYS___ACL_SET_LINK = 426 // { int __acl_set_link(const char *path, \ + SYS___ACL_DELETE_LINK = 427 // { int __acl_delete_link(const char *path, \ + SYS___ACL_ACLCHECK_LINK = 428 // { int __acl_aclcheck_link(const char *path, \ + SYS_SIGWAIT = 429 // { int sigwait(const sigset_t *set, \ + SYS_THR_CREATE = 430 // { int thr_create(ucontext_t *ctx, long *id, \ + SYS_THR_EXIT = 431 // { void thr_exit(long *state); } + SYS_THR_SELF = 432 // { int thr_self(long *id); } + SYS_THR_KILL = 433 // { int thr_kill(long id, int sig); } + SYS__UMTX_LOCK = 434 // { int _umtx_lock(struct umtx *umtx); } + SYS__UMTX_UNLOCK = 435 // { int _umtx_unlock(struct umtx *umtx); } + SYS_JAIL_ATTACH = 436 // { int jail_attach(int jid); } + SYS_EXTATTR_LIST_FD = 437 // { ssize_t extattr_list_fd(int fd, \ + SYS_EXTATTR_LIST_FILE = 438 // { ssize_t extattr_list_file( \ + SYS_EXTATTR_LIST_LINK = 439 // { ssize_t extattr_list_link( \ + SYS_KSEM_TIMEDWAIT = 441 // { int ksem_timedwait(semid_t id, \ + SYS_THR_SUSPEND = 442 // { int thr_suspend( \ + SYS_THR_WAKE = 443 // { int thr_wake(long id); } + SYS_KLDUNLOADF = 444 // { int kldunloadf(int fileid, int flags); } + SYS_AUDIT = 445 // { int audit(const void *record, \ + SYS_AUDITON = 446 // { int auditon(int cmd, void *data, \ + SYS_GETAUID = 447 // { int getauid(uid_t *auid); } + SYS_SETAUID = 448 // { int setauid(uid_t *auid); } + SYS_GETAUDIT = 449 // { int getaudit(struct auditinfo *auditinfo); } + SYS_SETAUDIT = 450 // { int setaudit(struct auditinfo *auditinfo); } + SYS_GETAUDIT_ADDR = 451 // { int getaudit_addr( \ + SYS_SETAUDIT_ADDR = 452 // { int setaudit_addr( \ + SYS_AUDITCTL = 453 // { int auditctl(char *path); } + SYS__UMTX_OP = 454 // { int _umtx_op(void *obj, int op, \ + SYS_THR_NEW = 455 // { int thr_new(struct thr_param *param, \ + SYS_SIGQUEUE = 456 // { int sigqueue(pid_t pid, int signum, void *value); } + SYS_KMQ_OPEN = 457 // { int kmq_open(const char *path, int flags, \ + SYS_KMQ_SETATTR = 458 // { int kmq_setattr(int mqd, \ + SYS_KMQ_TIMEDRECEIVE = 459 // { int kmq_timedreceive(int mqd, \ + SYS_KMQ_TIMEDSEND = 460 // { int kmq_timedsend(int mqd, \ + SYS_KMQ_NOTIFY = 461 // { int kmq_notify(int mqd, \ + SYS_KMQ_UNLINK = 462 // { int kmq_unlink(const char *path); } + SYS_ABORT2 = 463 // { int abort2(const char *why, int nargs, void **args); } + SYS_THR_SET_NAME = 464 // { int thr_set_name(long id, const char *name); } + SYS_AIO_FSYNC = 465 // { int aio_fsync(int op, struct aiocb *aiocbp); } + SYS_RTPRIO_THREAD = 466 // { int rtprio_thread(int function, \ + SYS_SCTP_PEELOFF = 471 // { int sctp_peeloff(int sd, uint32_t name); } + SYS_SCTP_GENERIC_SENDMSG = 472 // { int sctp_generic_sendmsg(int sd, caddr_t msg, int mlen, \ + SYS_SCTP_GENERIC_SENDMSG_IOV = 473 // { int sctp_generic_sendmsg_iov(int sd, struct iovec *iov, int iovlen, \ + SYS_SCTP_GENERIC_RECVMSG = 474 // { int sctp_generic_recvmsg(int sd, struct iovec *iov, int iovlen, \ + SYS_PREAD = 475 // { ssize_t pread(int fd, void *buf, \ + SYS_PWRITE = 476 // { ssize_t pwrite(int fd, const void *buf, \ + SYS_MMAP = 477 // { caddr_t mmap(caddr_t addr, size_t len, \ + SYS_LSEEK = 478 // { off_t lseek(int fd, off_t offset, \ + SYS_TRUNCATE = 479 // { int truncate(char *path, off_t length); } + SYS_FTRUNCATE = 480 // { int ftruncate(int fd, off_t length); } + SYS_THR_KILL2 = 481 // { int thr_kill2(pid_t pid, long id, int sig); } + SYS_SHM_OPEN = 482 // { int shm_open(const char *path, int flags, \ + SYS_SHM_UNLINK = 483 // { int shm_unlink(const char *path); } + SYS_CPUSET = 484 // { int cpuset(cpusetid_t *setid); } + SYS_CPUSET_SETID = 485 // { int cpuset_setid(cpuwhich_t which, id_t id, \ + SYS_CPUSET_GETID = 486 // { int cpuset_getid(cpulevel_t level, \ + SYS_CPUSET_GETAFFINITY = 487 // { int cpuset_getaffinity(cpulevel_t level, \ + SYS_CPUSET_SETAFFINITY = 488 // { int cpuset_setaffinity(cpulevel_t level, \ + SYS_FACCESSAT = 489 // { int faccessat(int fd, char *path, int amode, \ + SYS_FCHMODAT = 490 // { int fchmodat(int fd, char *path, mode_t mode, \ + SYS_FCHOWNAT = 491 // { int fchownat(int fd, char *path, uid_t uid, \ + SYS_FEXECVE = 492 // { int fexecve(int fd, char **argv, \ + SYS_FSTATAT = 493 // { int fstatat(int fd, char *path, \ + SYS_FUTIMESAT = 494 // { int futimesat(int fd, char *path, \ + SYS_LINKAT = 495 // { int linkat(int fd1, char *path1, int fd2, \ + SYS_MKDIRAT = 496 // { int mkdirat(int fd, char *path, mode_t mode); } + SYS_MKFIFOAT = 497 // { int mkfifoat(int fd, char *path, mode_t mode); } + SYS_MKNODAT = 498 // { int mknodat(int fd, char *path, mode_t mode, \ + SYS_OPENAT = 499 // { int openat(int fd, char *path, int flag, \ + SYS_READLINKAT = 500 // { int readlinkat(int fd, char *path, char *buf, \ + SYS_RENAMEAT = 501 // { int renameat(int oldfd, char *old, int newfd, \ + SYS_SYMLINKAT = 502 // { int symlinkat(char *path1, int fd, \ + SYS_UNLINKAT = 503 // { int unlinkat(int fd, char *path, int flag); } + SYS_POSIX_OPENPT = 504 // { int posix_openpt(int flags); } + SYS_GSSD_SYSCALL = 505 // { int gssd_syscall(char *path); } + SYS_JAIL_GET = 506 // { int jail_get(struct iovec *iovp, \ + SYS_JAIL_SET = 507 // { int jail_set(struct iovec *iovp, \ + SYS_JAIL_REMOVE = 508 // { int jail_remove(int jid); } + SYS_CLOSEFROM = 509 // { int closefrom(int lowfd); } + SYS___SEMCTL = 510 // { int __semctl(int semid, int semnum, \ + SYS_MSGCTL = 511 // { int msgctl(int msqid, int cmd, \ + SYS_SHMCTL = 512 // { int shmctl(int shmid, int cmd, \ + SYS_LPATHCONF = 513 // { int lpathconf(char *path, int name); } + SYS___CAP_RIGHTS_GET = 515 // { int __cap_rights_get(int version, \ + SYS_CAP_ENTER = 516 // { int cap_enter(void); } + SYS_CAP_GETMODE = 517 // { int cap_getmode(u_int *modep); } + SYS_PDFORK = 518 // { int pdfork(int *fdp, int flags); } + SYS_PDKILL = 519 // { int pdkill(int fd, int signum); } + SYS_PDGETPID = 520 // { int pdgetpid(int fd, pid_t *pidp); } + SYS_PSELECT = 522 // { int pselect(int nd, fd_set *in, \ + SYS_GETLOGINCLASS = 523 // { int getloginclass(char *namebuf, \ + SYS_SETLOGINCLASS = 524 // { int setloginclass(const char *namebuf); } + SYS_RCTL_GET_RACCT = 525 // { int rctl_get_racct(const void *inbufp, \ + SYS_RCTL_GET_RULES = 526 // { int rctl_get_rules(const void *inbufp, \ + SYS_RCTL_GET_LIMITS = 527 // { int rctl_get_limits(const void *inbufp, \ + SYS_RCTL_ADD_RULE = 528 // { int rctl_add_rule(const void *inbufp, \ + SYS_RCTL_REMOVE_RULE = 529 // { int rctl_remove_rule(const void *inbufp, \ + SYS_POSIX_FALLOCATE = 530 // { int posix_fallocate(int fd, \ + SYS_POSIX_FADVISE = 531 // { int posix_fadvise(int fd, off_t offset, \ + SYS_WAIT6 = 532 // { int wait6(idtype_t idtype, id_t id, \ + SYS_CAP_RIGHTS_LIMIT = 533 // { int cap_rights_limit(int fd, \ + SYS_CAP_IOCTLS_LIMIT = 534 // { int cap_ioctls_limit(int fd, \ + SYS_CAP_IOCTLS_GET = 535 // { ssize_t cap_ioctls_get(int fd, \ + SYS_CAP_FCNTLS_LIMIT = 536 // { int cap_fcntls_limit(int fd, \ + SYS_CAP_FCNTLS_GET = 537 // { int cap_fcntls_get(int fd, \ + SYS_BINDAT = 538 // { int bindat(int fd, int s, caddr_t name, \ + SYS_CONNECTAT = 539 // { int connectat(int fd, int s, caddr_t name, \ + SYS_CHFLAGSAT = 540 // { int chflagsat(int fd, const char *path, \ + SYS_ACCEPT4 = 541 // { int accept4(int s, \ + SYS_PIPE2 = 542 // { int pipe2(int *fildes, int flags); } + SYS_AIO_MLOCK = 543 // { int aio_mlock(struct aiocb *aiocbp); } + SYS_PROCCTL = 544 // { int procctl(idtype_t idtype, id_t id, \ + SYS_PPOLL = 545 // { int ppoll(struct pollfd *fds, u_int nfds, \ + SYS_FUTIMENS = 546 // { int futimens(int fd, \ + SYS_UTIMENSAT = 547 // { int utimensat(int fd, \ +) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go new file mode 100644 index 00000000..d61941ba --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go @@ -0,0 +1,403 @@ +// mksysnum_freebsd.pl +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm,freebsd + +package unix + +const ( + // SYS_NOSYS = 0; // { int nosys(void); } syscall nosys_args int + SYS_EXIT = 1 // { void sys_exit(int rval); } exit \ + SYS_FORK = 2 // { int fork(void); } + SYS_READ = 3 // { ssize_t read(int fd, void *buf, \ + SYS_WRITE = 4 // { ssize_t write(int fd, const void *buf, \ + SYS_OPEN = 5 // { int open(char *path, int flags, int mode); } + SYS_CLOSE = 6 // { int close(int fd); } + SYS_WAIT4 = 7 // { int wait4(int pid, int *status, \ + SYS_LINK = 9 // { int link(char *path, char *link); } + SYS_UNLINK = 10 // { int unlink(char *path); } + SYS_CHDIR = 12 // { int chdir(char *path); } + SYS_FCHDIR = 13 // { int fchdir(int fd); } + SYS_MKNOD = 14 // { int mknod(char *path, int mode, int dev); } + SYS_CHMOD = 15 // { int chmod(char *path, int mode); } + SYS_CHOWN = 16 // { int chown(char *path, int uid, int gid); } + SYS_OBREAK = 17 // { int obreak(char *nsize); } break \ + SYS_GETPID = 20 // { pid_t getpid(void); } + SYS_MOUNT = 21 // { int mount(char *type, char *path, \ + SYS_UNMOUNT = 22 // { int unmount(char *path, int flags); } + SYS_SETUID = 23 // { int setuid(uid_t uid); } + SYS_GETUID = 24 // { uid_t getuid(void); } + SYS_GETEUID = 25 // { uid_t geteuid(void); } + SYS_PTRACE = 26 // { int ptrace(int req, pid_t pid, \ + SYS_RECVMSG = 27 // { int recvmsg(int s, struct msghdr *msg, \ + SYS_SENDMSG = 28 // { int sendmsg(int s, struct msghdr *msg, \ + SYS_RECVFROM = 29 // { int recvfrom(int s, caddr_t buf, \ + SYS_ACCEPT = 30 // { int accept(int s, \ + SYS_GETPEERNAME = 31 // { int getpeername(int fdes, \ + SYS_GETSOCKNAME = 32 // { int getsockname(int fdes, \ + SYS_ACCESS = 33 // { int access(char *path, int amode); } + SYS_CHFLAGS = 34 // { int chflags(const char *path, u_long flags); } + SYS_FCHFLAGS = 35 // { int fchflags(int fd, u_long flags); } + SYS_SYNC = 36 // { int sync(void); } + SYS_KILL = 37 // { int kill(int pid, int signum); } + SYS_GETPPID = 39 // { pid_t getppid(void); } + SYS_DUP = 41 // { int dup(u_int fd); } + SYS_PIPE = 42 // { int pipe(void); } + SYS_GETEGID = 43 // { gid_t getegid(void); } + SYS_PROFIL = 44 // { int profil(caddr_t samples, size_t size, \ + SYS_KTRACE = 45 // { int ktrace(const char *fname, int ops, \ + SYS_GETGID = 47 // { gid_t getgid(void); } + SYS_GETLOGIN = 49 // { int getlogin(char *namebuf, u_int \ + SYS_SETLOGIN = 50 // { int setlogin(char *namebuf); } + SYS_ACCT = 51 // { int acct(char *path); } + SYS_SIGALTSTACK = 53 // { int sigaltstack(stack_t *ss, \ + SYS_IOCTL = 54 // { int ioctl(int fd, u_long com, \ + SYS_REBOOT = 55 // { int reboot(int opt); } + SYS_REVOKE = 56 // { int revoke(char *path); } + SYS_SYMLINK = 57 // { int symlink(char *path, char *link); } + SYS_READLINK = 58 // { ssize_t readlink(char *path, char *buf, \ + SYS_EXECVE = 59 // { int execve(char *fname, char **argv, \ + SYS_UMASK = 60 // { int umask(int newmask); } umask umask_args \ + SYS_CHROOT = 61 // { int chroot(char *path); } + SYS_MSYNC = 65 // { int msync(void *addr, size_t len, \ + SYS_VFORK = 66 // { int vfork(void); } + SYS_SBRK = 69 // { int sbrk(int incr); } + SYS_SSTK = 70 // { int sstk(int incr); } + SYS_OVADVISE = 72 // { int ovadvise(int anom); } vadvise \ + SYS_MUNMAP = 73 // { int munmap(void *addr, size_t len); } + SYS_MPROTECT = 74 // { int mprotect(const void *addr, size_t len, \ + SYS_MADVISE = 75 // { int madvise(void *addr, size_t len, \ + SYS_MINCORE = 78 // { int mincore(const void *addr, size_t len, \ + SYS_GETGROUPS = 79 // { int getgroups(u_int gidsetsize, \ + SYS_SETGROUPS = 80 // { int setgroups(u_int gidsetsize, \ + SYS_GETPGRP = 81 // { int getpgrp(void); } + SYS_SETPGID = 82 // { int setpgid(int pid, int pgid); } + SYS_SETITIMER = 83 // { int setitimer(u_int which, struct \ + SYS_SWAPON = 85 // { int swapon(char *name); } + SYS_GETITIMER = 86 // { int getitimer(u_int which, \ + SYS_GETDTABLESIZE = 89 // { int getdtablesize(void); } + SYS_DUP2 = 90 // { int dup2(u_int from, u_int to); } + SYS_FCNTL = 92 // { int fcntl(int fd, int cmd, long arg); } + SYS_SELECT = 93 // { int select(int nd, fd_set *in, fd_set *ou, \ + SYS_FSYNC = 95 // { int fsync(int fd); } + SYS_SETPRIORITY = 96 // { int setpriority(int which, int who, \ + SYS_SOCKET = 97 // { int socket(int domain, int type, \ + SYS_CONNECT = 98 // { int connect(int s, caddr_t name, \ + SYS_GETPRIORITY = 100 // { int getpriority(int which, int who); } + SYS_BIND = 104 // { int bind(int s, caddr_t name, \ + SYS_SETSOCKOPT = 105 // { int setsockopt(int s, int level, int name, \ + SYS_LISTEN = 106 // { int listen(int s, int backlog); } + SYS_GETTIMEOFDAY = 116 // { int gettimeofday(struct timeval *tp, \ + SYS_GETRUSAGE = 117 // { int getrusage(int who, \ + SYS_GETSOCKOPT = 118 // { int getsockopt(int s, int level, int name, \ + SYS_READV = 120 // { int readv(int fd, struct iovec *iovp, \ + SYS_WRITEV = 121 // { int writev(int fd, struct iovec *iovp, \ + SYS_SETTIMEOFDAY = 122 // { int settimeofday(struct timeval *tv, \ + SYS_FCHOWN = 123 // { int fchown(int fd, int uid, int gid); } + SYS_FCHMOD = 124 // { int fchmod(int fd, int mode); } + SYS_SETREUID = 126 // { int setreuid(int ruid, int euid); } + SYS_SETREGID = 127 // { int setregid(int rgid, int egid); } + SYS_RENAME = 128 // { int rename(char *from, char *to); } + SYS_FLOCK = 131 // { int flock(int fd, int how); } + SYS_MKFIFO = 132 // { int mkfifo(char *path, int mode); } + SYS_SENDTO = 133 // { int sendto(int s, caddr_t buf, size_t len, \ + SYS_SHUTDOWN = 134 // { int shutdown(int s, int how); } + SYS_SOCKETPAIR = 135 // { int socketpair(int domain, int type, \ + SYS_MKDIR = 136 // { int mkdir(char *path, int mode); } + SYS_RMDIR = 137 // { int rmdir(char *path); } + SYS_UTIMES = 138 // { int utimes(char *path, \ + SYS_ADJTIME = 140 // { int adjtime(struct timeval *delta, \ + SYS_SETSID = 147 // { int setsid(void); } + SYS_QUOTACTL = 148 // { int quotactl(char *path, int cmd, int uid, \ + SYS_NLM_SYSCALL = 154 // { int nlm_syscall(int debug_level, int grace_period, int addr_count, char **addrs); } + SYS_NFSSVC = 155 // { int nfssvc(int flag, caddr_t argp); } + SYS_LGETFH = 160 // { int lgetfh(char *fname, \ + SYS_GETFH = 161 // { int getfh(char *fname, \ + SYS_SYSARCH = 165 // { int sysarch(int op, char *parms); } + SYS_RTPRIO = 166 // { int rtprio(int function, pid_t pid, \ + SYS_SEMSYS = 169 // { int semsys(int which, int a2, int a3, \ + SYS_MSGSYS = 170 // { int msgsys(int which, int a2, int a3, \ + SYS_SHMSYS = 171 // { int shmsys(int which, int a2, int a3, \ + SYS_FREEBSD6_PREAD = 173 // { ssize_t freebsd6_pread(int fd, void *buf, \ + SYS_FREEBSD6_PWRITE = 174 // { ssize_t freebsd6_pwrite(int fd, \ + SYS_SETFIB = 175 // { int setfib(int fibnum); } + SYS_NTP_ADJTIME = 176 // { int ntp_adjtime(struct timex *tp); } + SYS_SETGID = 181 // { int setgid(gid_t gid); } + SYS_SETEGID = 182 // { int setegid(gid_t egid); } + SYS_SETEUID = 183 // { int seteuid(uid_t euid); } + SYS_STAT = 188 // { int stat(char *path, struct stat *ub); } + SYS_FSTAT = 189 // { int fstat(int fd, struct stat *sb); } + SYS_LSTAT = 190 // { int lstat(char *path, struct stat *ub); } + SYS_PATHCONF = 191 // { int pathconf(char *path, int name); } + SYS_FPATHCONF = 192 // { int fpathconf(int fd, int name); } + SYS_GETRLIMIT = 194 // { int getrlimit(u_int which, \ + SYS_SETRLIMIT = 195 // { int setrlimit(u_int which, \ + SYS_GETDIRENTRIES = 196 // { int getdirentries(int fd, char *buf, \ + SYS_FREEBSD6_MMAP = 197 // { caddr_t freebsd6_mmap(caddr_t addr, \ + SYS_FREEBSD6_LSEEK = 199 // { off_t freebsd6_lseek(int fd, int pad, \ + SYS_FREEBSD6_TRUNCATE = 200 // { int freebsd6_truncate(char *path, int pad, \ + SYS_FREEBSD6_FTRUNCATE = 201 // { int freebsd6_ftruncate(int fd, int pad, \ + SYS___SYSCTL = 202 // { int __sysctl(int *name, u_int namelen, \ + SYS_MLOCK = 203 // { int mlock(const void *addr, size_t len); } + SYS_MUNLOCK = 204 // { int munlock(const void *addr, size_t len); } + SYS_UNDELETE = 205 // { int undelete(char *path); } + SYS_FUTIMES = 206 // { int futimes(int fd, struct timeval *tptr); } + SYS_GETPGID = 207 // { int getpgid(pid_t pid); } + SYS_POLL = 209 // { int poll(struct pollfd *fds, u_int nfds, \ + SYS_SEMGET = 221 // { int semget(key_t key, int nsems, \ + SYS_SEMOP = 222 // { int semop(int semid, struct sembuf *sops, \ + SYS_MSGGET = 225 // { int msgget(key_t key, int msgflg); } + SYS_MSGSND = 226 // { int msgsnd(int msqid, const void *msgp, \ + SYS_MSGRCV = 227 // { int msgrcv(int msqid, void *msgp, \ + SYS_SHMAT = 228 // { int shmat(int shmid, const void *shmaddr, \ + SYS_SHMDT = 230 // { int shmdt(const void *shmaddr); } + SYS_SHMGET = 231 // { int shmget(key_t key, size_t size, \ + SYS_CLOCK_GETTIME = 232 // { int clock_gettime(clockid_t clock_id, \ + SYS_CLOCK_SETTIME = 233 // { int clock_settime( \ + SYS_CLOCK_GETRES = 234 // { int clock_getres(clockid_t clock_id, \ + SYS_KTIMER_CREATE = 235 // { int ktimer_create(clockid_t clock_id, \ + SYS_KTIMER_DELETE = 236 // { int ktimer_delete(int timerid); } + SYS_KTIMER_SETTIME = 237 // { int ktimer_settime(int timerid, int flags, \ + SYS_KTIMER_GETTIME = 238 // { int ktimer_gettime(int timerid, struct \ + SYS_KTIMER_GETOVERRUN = 239 // { int ktimer_getoverrun(int timerid); } + SYS_NANOSLEEP = 240 // { int nanosleep(const struct timespec *rqtp, \ + SYS_FFCLOCK_GETCOUNTER = 241 // { int ffclock_getcounter(ffcounter *ffcount); } + SYS_FFCLOCK_SETESTIMATE = 242 // { int ffclock_setestimate( \ + SYS_FFCLOCK_GETESTIMATE = 243 // { int ffclock_getestimate( \ + SYS_CLOCK_GETCPUCLOCKID2 = 247 // { int clock_getcpuclockid2(id_t id,\ + SYS_NTP_GETTIME = 248 // { int ntp_gettime(struct ntptimeval *ntvp); } + SYS_MINHERIT = 250 // { int minherit(void *addr, size_t len, \ + SYS_RFORK = 251 // { int rfork(int flags); } + SYS_OPENBSD_POLL = 252 // { int openbsd_poll(struct pollfd *fds, \ + SYS_ISSETUGID = 253 // { int issetugid(void); } + SYS_LCHOWN = 254 // { int lchown(char *path, int uid, int gid); } + SYS_AIO_READ = 255 // { int aio_read(struct aiocb *aiocbp); } + SYS_AIO_WRITE = 256 // { int aio_write(struct aiocb *aiocbp); } + SYS_LIO_LISTIO = 257 // { int lio_listio(int mode, \ + SYS_GETDENTS = 272 // { int getdents(int fd, char *buf, \ + SYS_LCHMOD = 274 // { int lchmod(char *path, mode_t mode); } + SYS_LUTIMES = 276 // { int lutimes(char *path, \ + SYS_NSTAT = 278 // { int nstat(char *path, struct nstat *ub); } + SYS_NFSTAT = 279 // { int nfstat(int fd, struct nstat *sb); } + SYS_NLSTAT = 280 // { int nlstat(char *path, struct nstat *ub); } + SYS_PREADV = 289 // { ssize_t preadv(int fd, struct iovec *iovp, \ + SYS_PWRITEV = 290 // { ssize_t pwritev(int fd, struct iovec *iovp, \ + SYS_FHOPEN = 298 // { int fhopen(const struct fhandle *u_fhp, \ + SYS_FHSTAT = 299 // { int fhstat(const struct fhandle *u_fhp, \ + SYS_MODNEXT = 300 // { int modnext(int modid); } + SYS_MODSTAT = 301 // { int modstat(int modid, \ + SYS_MODFNEXT = 302 // { int modfnext(int modid); } + SYS_MODFIND = 303 // { int modfind(const char *name); } + SYS_KLDLOAD = 304 // { int kldload(const char *file); } + SYS_KLDUNLOAD = 305 // { int kldunload(int fileid); } + SYS_KLDFIND = 306 // { int kldfind(const char *file); } + SYS_KLDNEXT = 307 // { int kldnext(int fileid); } + SYS_KLDSTAT = 308 // { int kldstat(int fileid, struct \ + SYS_KLDFIRSTMOD = 309 // { int kldfirstmod(int fileid); } + SYS_GETSID = 310 // { int getsid(pid_t pid); } + SYS_SETRESUID = 311 // { int setresuid(uid_t ruid, uid_t euid, \ + SYS_SETRESGID = 312 // { int setresgid(gid_t rgid, gid_t egid, \ + SYS_AIO_RETURN = 314 // { int aio_return(struct aiocb *aiocbp); } + SYS_AIO_SUSPEND = 315 // { int aio_suspend( \ + SYS_AIO_CANCEL = 316 // { int aio_cancel(int fd, \ + SYS_AIO_ERROR = 317 // { int aio_error(struct aiocb *aiocbp); } + SYS_OAIO_READ = 318 // { int oaio_read(struct oaiocb *aiocbp); } + SYS_OAIO_WRITE = 319 // { int oaio_write(struct oaiocb *aiocbp); } + SYS_OLIO_LISTIO = 320 // { int olio_listio(int mode, \ + SYS_YIELD = 321 // { int yield(void); } + SYS_MLOCKALL = 324 // { int mlockall(int how); } + SYS_MUNLOCKALL = 325 // { int munlockall(void); } + SYS___GETCWD = 326 // { int __getcwd(char *buf, u_int buflen); } + SYS_SCHED_SETPARAM = 327 // { int sched_setparam (pid_t pid, \ + SYS_SCHED_GETPARAM = 328 // { int sched_getparam (pid_t pid, struct \ + SYS_SCHED_SETSCHEDULER = 329 // { int sched_setscheduler (pid_t pid, int \ + SYS_SCHED_GETSCHEDULER = 330 // { int sched_getscheduler (pid_t pid); } + SYS_SCHED_YIELD = 331 // { int sched_yield (void); } + SYS_SCHED_GET_PRIORITY_MAX = 332 // { int sched_get_priority_max (int policy); } + SYS_SCHED_GET_PRIORITY_MIN = 333 // { int sched_get_priority_min (int policy); } + SYS_SCHED_RR_GET_INTERVAL = 334 // { int sched_rr_get_interval (pid_t pid, \ + SYS_UTRACE = 335 // { int utrace(const void *addr, size_t len); } + SYS_KLDSYM = 337 // { int kldsym(int fileid, int cmd, \ + SYS_JAIL = 338 // { int jail(struct jail *jail); } + SYS_SIGPROCMASK = 340 // { int sigprocmask(int how, \ + SYS_SIGSUSPEND = 341 // { int sigsuspend(const sigset_t *sigmask); } + SYS_SIGPENDING = 343 // { int sigpending(sigset_t *set); } + SYS_SIGTIMEDWAIT = 345 // { int sigtimedwait(const sigset_t *set, \ + SYS_SIGWAITINFO = 346 // { int sigwaitinfo(const sigset_t *set, \ + SYS___ACL_GET_FILE = 347 // { int __acl_get_file(const char *path, \ + SYS___ACL_SET_FILE = 348 // { int __acl_set_file(const char *path, \ + SYS___ACL_GET_FD = 349 // { int __acl_get_fd(int filedes, \ + SYS___ACL_SET_FD = 350 // { int __acl_set_fd(int filedes, \ + SYS___ACL_DELETE_FILE = 351 // { int __acl_delete_file(const char *path, \ + SYS___ACL_DELETE_FD = 352 // { int __acl_delete_fd(int filedes, \ + SYS___ACL_ACLCHECK_FILE = 353 // { int __acl_aclcheck_file(const char *path, \ + SYS___ACL_ACLCHECK_FD = 354 // { int __acl_aclcheck_fd(int filedes, \ + SYS_EXTATTRCTL = 355 // { int extattrctl(const char *path, int cmd, \ + SYS_EXTATTR_SET_FILE = 356 // { ssize_t extattr_set_file( \ + SYS_EXTATTR_GET_FILE = 357 // { ssize_t extattr_get_file( \ + SYS_EXTATTR_DELETE_FILE = 358 // { int extattr_delete_file(const char *path, \ + SYS_AIO_WAITCOMPLETE = 359 // { int aio_waitcomplete( \ + SYS_GETRESUID = 360 // { int getresuid(uid_t *ruid, uid_t *euid, \ + SYS_GETRESGID = 361 // { int getresgid(gid_t *rgid, gid_t *egid, \ + SYS_KQUEUE = 362 // { int kqueue(void); } + SYS_KEVENT = 363 // { int kevent(int fd, \ + SYS_EXTATTR_SET_FD = 371 // { ssize_t extattr_set_fd(int fd, \ + SYS_EXTATTR_GET_FD = 372 // { ssize_t extattr_get_fd(int fd, \ + SYS_EXTATTR_DELETE_FD = 373 // { int extattr_delete_fd(int fd, \ + SYS___SETUGID = 374 // { int __setugid(int flag); } + SYS_EACCESS = 376 // { int eaccess(char *path, int amode); } + SYS_NMOUNT = 378 // { int nmount(struct iovec *iovp, \ + SYS___MAC_GET_PROC = 384 // { int __mac_get_proc(struct mac *mac_p); } + SYS___MAC_SET_PROC = 385 // { int __mac_set_proc(struct mac *mac_p); } + SYS___MAC_GET_FD = 386 // { int __mac_get_fd(int fd, \ + SYS___MAC_GET_FILE = 387 // { int __mac_get_file(const char *path_p, \ + SYS___MAC_SET_FD = 388 // { int __mac_set_fd(int fd, \ + SYS___MAC_SET_FILE = 389 // { int __mac_set_file(const char *path_p, \ + SYS_KENV = 390 // { int kenv(int what, const char *name, \ + SYS_LCHFLAGS = 391 // { int lchflags(const char *path, \ + SYS_UUIDGEN = 392 // { int uuidgen(struct uuid *store, \ + SYS_SENDFILE = 393 // { int sendfile(int fd, int s, off_t offset, \ + SYS_MAC_SYSCALL = 394 // { int mac_syscall(const char *policy, \ + SYS_GETFSSTAT = 395 // { int getfsstat(struct statfs *buf, \ + SYS_STATFS = 396 // { int statfs(char *path, \ + SYS_FSTATFS = 397 // { int fstatfs(int fd, struct statfs *buf); } + SYS_FHSTATFS = 398 // { int fhstatfs(const struct fhandle *u_fhp, \ + SYS_KSEM_CLOSE = 400 // { int ksem_close(semid_t id); } + SYS_KSEM_POST = 401 // { int ksem_post(semid_t id); } + SYS_KSEM_WAIT = 402 // { int ksem_wait(semid_t id); } + SYS_KSEM_TRYWAIT = 403 // { int ksem_trywait(semid_t id); } + SYS_KSEM_INIT = 404 // { int ksem_init(semid_t *idp, \ + SYS_KSEM_OPEN = 405 // { int ksem_open(semid_t *idp, \ + SYS_KSEM_UNLINK = 406 // { int ksem_unlink(const char *name); } + SYS_KSEM_GETVALUE = 407 // { int ksem_getvalue(semid_t id, int *val); } + SYS_KSEM_DESTROY = 408 // { int ksem_destroy(semid_t id); } + SYS___MAC_GET_PID = 409 // { int __mac_get_pid(pid_t pid, \ + SYS___MAC_GET_LINK = 410 // { int __mac_get_link(const char *path_p, \ + SYS___MAC_SET_LINK = 411 // { int __mac_set_link(const char *path_p, \ + SYS_EXTATTR_SET_LINK = 412 // { ssize_t extattr_set_link( \ + SYS_EXTATTR_GET_LINK = 413 // { ssize_t extattr_get_link( \ + SYS_EXTATTR_DELETE_LINK = 414 // { int extattr_delete_link( \ + SYS___MAC_EXECVE = 415 // { int __mac_execve(char *fname, char **argv, \ + SYS_SIGACTION = 416 // { int sigaction(int sig, \ + SYS_SIGRETURN = 417 // { int sigreturn( \ + SYS_GETCONTEXT = 421 // { int getcontext(struct __ucontext *ucp); } + SYS_SETCONTEXT = 422 // { int setcontext( \ + SYS_SWAPCONTEXT = 423 // { int swapcontext(struct __ucontext *oucp, \ + SYS_SWAPOFF = 424 // { int swapoff(const char *name); } + SYS___ACL_GET_LINK = 425 // { int __acl_get_link(const char *path, \ + SYS___ACL_SET_LINK = 426 // { int __acl_set_link(const char *path, \ + SYS___ACL_DELETE_LINK = 427 // { int __acl_delete_link(const char *path, \ + SYS___ACL_ACLCHECK_LINK = 428 // { int __acl_aclcheck_link(const char *path, \ + SYS_SIGWAIT = 429 // { int sigwait(const sigset_t *set, \ + SYS_THR_CREATE = 430 // { int thr_create(ucontext_t *ctx, long *id, \ + SYS_THR_EXIT = 431 // { void thr_exit(long *state); } + SYS_THR_SELF = 432 // { int thr_self(long *id); } + SYS_THR_KILL = 433 // { int thr_kill(long id, int sig); } + SYS__UMTX_LOCK = 434 // { int _umtx_lock(struct umtx *umtx); } + SYS__UMTX_UNLOCK = 435 // { int _umtx_unlock(struct umtx *umtx); } + SYS_JAIL_ATTACH = 436 // { int jail_attach(int jid); } + SYS_EXTATTR_LIST_FD = 437 // { ssize_t extattr_list_fd(int fd, \ + SYS_EXTATTR_LIST_FILE = 438 // { ssize_t extattr_list_file( \ + SYS_EXTATTR_LIST_LINK = 439 // { ssize_t extattr_list_link( \ + SYS_KSEM_TIMEDWAIT = 441 // { int ksem_timedwait(semid_t id, \ + SYS_THR_SUSPEND = 442 // { int thr_suspend( \ + SYS_THR_WAKE = 443 // { int thr_wake(long id); } + SYS_KLDUNLOADF = 444 // { int kldunloadf(int fileid, int flags); } + SYS_AUDIT = 445 // { int audit(const void *record, \ + SYS_AUDITON = 446 // { int auditon(int cmd, void *data, \ + SYS_GETAUID = 447 // { int getauid(uid_t *auid); } + SYS_SETAUID = 448 // { int setauid(uid_t *auid); } + SYS_GETAUDIT = 449 // { int getaudit(struct auditinfo *auditinfo); } + SYS_SETAUDIT = 450 // { int setaudit(struct auditinfo *auditinfo); } + SYS_GETAUDIT_ADDR = 451 // { int getaudit_addr( \ + SYS_SETAUDIT_ADDR = 452 // { int setaudit_addr( \ + SYS_AUDITCTL = 453 // { int auditctl(char *path); } + SYS__UMTX_OP = 454 // { int _umtx_op(void *obj, int op, \ + SYS_THR_NEW = 455 // { int thr_new(struct thr_param *param, \ + SYS_SIGQUEUE = 456 // { int sigqueue(pid_t pid, int signum, void *value); } + SYS_KMQ_OPEN = 457 // { int kmq_open(const char *path, int flags, \ + SYS_KMQ_SETATTR = 458 // { int kmq_setattr(int mqd, \ + SYS_KMQ_TIMEDRECEIVE = 459 // { int kmq_timedreceive(int mqd, \ + SYS_KMQ_TIMEDSEND = 460 // { int kmq_timedsend(int mqd, \ + SYS_KMQ_NOTIFY = 461 // { int kmq_notify(int mqd, \ + SYS_KMQ_UNLINK = 462 // { int kmq_unlink(const char *path); } + SYS_ABORT2 = 463 // { int abort2(const char *why, int nargs, void **args); } + SYS_THR_SET_NAME = 464 // { int thr_set_name(long id, const char *name); } + SYS_AIO_FSYNC = 465 // { int aio_fsync(int op, struct aiocb *aiocbp); } + SYS_RTPRIO_THREAD = 466 // { int rtprio_thread(int function, \ + SYS_SCTP_PEELOFF = 471 // { int sctp_peeloff(int sd, uint32_t name); } + SYS_SCTP_GENERIC_SENDMSG = 472 // { int sctp_generic_sendmsg(int sd, caddr_t msg, int mlen, \ + SYS_SCTP_GENERIC_SENDMSG_IOV = 473 // { int sctp_generic_sendmsg_iov(int sd, struct iovec *iov, int iovlen, \ + SYS_SCTP_GENERIC_RECVMSG = 474 // { int sctp_generic_recvmsg(int sd, struct iovec *iov, int iovlen, \ + SYS_PREAD = 475 // { ssize_t pread(int fd, void *buf, \ + SYS_PWRITE = 476 // { ssize_t pwrite(int fd, const void *buf, \ + SYS_MMAP = 477 // { caddr_t mmap(caddr_t addr, size_t len, \ + SYS_LSEEK = 478 // { off_t lseek(int fd, off_t offset, \ + SYS_TRUNCATE = 479 // { int truncate(char *path, off_t length); } + SYS_FTRUNCATE = 480 // { int ftruncate(int fd, off_t length); } + SYS_THR_KILL2 = 481 // { int thr_kill2(pid_t pid, long id, int sig); } + SYS_SHM_OPEN = 482 // { int shm_open(const char *path, int flags, \ + SYS_SHM_UNLINK = 483 // { int shm_unlink(const char *path); } + SYS_CPUSET = 484 // { int cpuset(cpusetid_t *setid); } + SYS_CPUSET_SETID = 485 // { int cpuset_setid(cpuwhich_t which, id_t id, \ + SYS_CPUSET_GETID = 486 // { int cpuset_getid(cpulevel_t level, \ + SYS_CPUSET_GETAFFINITY = 487 // { int cpuset_getaffinity(cpulevel_t level, \ + SYS_CPUSET_SETAFFINITY = 488 // { int cpuset_setaffinity(cpulevel_t level, \ + SYS_FACCESSAT = 489 // { int faccessat(int fd, char *path, int amode, \ + SYS_FCHMODAT = 490 // { int fchmodat(int fd, char *path, mode_t mode, \ + SYS_FCHOWNAT = 491 // { int fchownat(int fd, char *path, uid_t uid, \ + SYS_FEXECVE = 492 // { int fexecve(int fd, char **argv, \ + SYS_FSTATAT = 493 // { int fstatat(int fd, char *path, \ + SYS_FUTIMESAT = 494 // { int futimesat(int fd, char *path, \ + SYS_LINKAT = 495 // { int linkat(int fd1, char *path1, int fd2, \ + SYS_MKDIRAT = 496 // { int mkdirat(int fd, char *path, mode_t mode); } + SYS_MKFIFOAT = 497 // { int mkfifoat(int fd, char *path, mode_t mode); } + SYS_MKNODAT = 498 // { int mknodat(int fd, char *path, mode_t mode, \ + SYS_OPENAT = 499 // { int openat(int fd, char *path, int flag, \ + SYS_READLINKAT = 500 // { int readlinkat(int fd, char *path, char *buf, \ + SYS_RENAMEAT = 501 // { int renameat(int oldfd, char *old, int newfd, \ + SYS_SYMLINKAT = 502 // { int symlinkat(char *path1, int fd, \ + SYS_UNLINKAT = 503 // { int unlinkat(int fd, char *path, int flag); } + SYS_POSIX_OPENPT = 504 // { int posix_openpt(int flags); } + SYS_GSSD_SYSCALL = 505 // { int gssd_syscall(char *path); } + SYS_JAIL_GET = 506 // { int jail_get(struct iovec *iovp, \ + SYS_JAIL_SET = 507 // { int jail_set(struct iovec *iovp, \ + SYS_JAIL_REMOVE = 508 // { int jail_remove(int jid); } + SYS_CLOSEFROM = 509 // { int closefrom(int lowfd); } + SYS___SEMCTL = 510 // { int __semctl(int semid, int semnum, \ + SYS_MSGCTL = 511 // { int msgctl(int msqid, int cmd, \ + SYS_SHMCTL = 512 // { int shmctl(int shmid, int cmd, \ + SYS_LPATHCONF = 513 // { int lpathconf(char *path, int name); } + SYS___CAP_RIGHTS_GET = 515 // { int __cap_rights_get(int version, \ + SYS_CAP_ENTER = 516 // { int cap_enter(void); } + SYS_CAP_GETMODE = 517 // { int cap_getmode(u_int *modep); } + SYS_PDFORK = 518 // { int pdfork(int *fdp, int flags); } + SYS_PDKILL = 519 // { int pdkill(int fd, int signum); } + SYS_PDGETPID = 520 // { int pdgetpid(int fd, pid_t *pidp); } + SYS_PSELECT = 522 // { int pselect(int nd, fd_set *in, \ + SYS_GETLOGINCLASS = 523 // { int getloginclass(char *namebuf, \ + SYS_SETLOGINCLASS = 524 // { int setloginclass(const char *namebuf); } + SYS_RCTL_GET_RACCT = 525 // { int rctl_get_racct(const void *inbufp, \ + SYS_RCTL_GET_RULES = 526 // { int rctl_get_rules(const void *inbufp, \ + SYS_RCTL_GET_LIMITS = 527 // { int rctl_get_limits(const void *inbufp, \ + SYS_RCTL_ADD_RULE = 528 // { int rctl_add_rule(const void *inbufp, \ + SYS_RCTL_REMOVE_RULE = 529 // { int rctl_remove_rule(const void *inbufp, \ + SYS_POSIX_FALLOCATE = 530 // { int posix_fallocate(int fd, \ + SYS_POSIX_FADVISE = 531 // { int posix_fadvise(int fd, off_t offset, \ + SYS_WAIT6 = 532 // { int wait6(idtype_t idtype, id_t id, \ + SYS_CAP_RIGHTS_LIMIT = 533 // { int cap_rights_limit(int fd, \ + SYS_CAP_IOCTLS_LIMIT = 534 // { int cap_ioctls_limit(int fd, \ + SYS_CAP_IOCTLS_GET = 535 // { ssize_t cap_ioctls_get(int fd, \ + SYS_CAP_FCNTLS_LIMIT = 536 // { int cap_fcntls_limit(int fd, \ + SYS_CAP_FCNTLS_GET = 537 // { int cap_fcntls_get(int fd, \ + SYS_BINDAT = 538 // { int bindat(int fd, int s, caddr_t name, \ + SYS_CONNECTAT = 539 // { int connectat(int fd, int s, caddr_t name, \ + SYS_CHFLAGSAT = 540 // { int chflagsat(int fd, const char *path, \ + SYS_ACCEPT4 = 541 // { int accept4(int s, \ + SYS_PIPE2 = 542 // { int pipe2(int *fildes, int flags); } + SYS_AIO_MLOCK = 543 // { int aio_mlock(struct aiocb *aiocbp); } + SYS_PROCCTL = 544 // { int procctl(idtype_t idtype, id_t id, \ + SYS_PPOLL = 545 // { int ppoll(struct pollfd *fds, u_int nfds, \ + SYS_FUTIMENS = 546 // { int futimens(int fd, \ + SYS_UTIMENSAT = 547 // { int utimensat(int fd, \ +) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go new file mode 100644 index 00000000..8f33ece7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go @@ -0,0 +1,392 @@ +// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include -m32 /tmp/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build 386,linux + +package unix + +const ( + SYS_RESTART_SYSCALL = 0 + SYS_EXIT = 1 + SYS_FORK = 2 + SYS_READ = 3 + SYS_WRITE = 4 + SYS_OPEN = 5 + SYS_CLOSE = 6 + SYS_WAITPID = 7 + SYS_CREAT = 8 + SYS_LINK = 9 + SYS_UNLINK = 10 + SYS_EXECVE = 11 + SYS_CHDIR = 12 + SYS_TIME = 13 + SYS_MKNOD = 14 + SYS_CHMOD = 15 + SYS_LCHOWN = 16 + SYS_BREAK = 17 + SYS_OLDSTAT = 18 + SYS_LSEEK = 19 + SYS_GETPID = 20 + SYS_MOUNT = 21 + SYS_UMOUNT = 22 + SYS_SETUID = 23 + SYS_GETUID = 24 + SYS_STIME = 25 + SYS_PTRACE = 26 + SYS_ALARM = 27 + SYS_OLDFSTAT = 28 + SYS_PAUSE = 29 + SYS_UTIME = 30 + SYS_STTY = 31 + SYS_GTTY = 32 + SYS_ACCESS = 33 + SYS_NICE = 34 + SYS_FTIME = 35 + SYS_SYNC = 36 + SYS_KILL = 37 + SYS_RENAME = 38 + SYS_MKDIR = 39 + SYS_RMDIR = 40 + SYS_DUP = 41 + SYS_PIPE = 42 + SYS_TIMES = 43 + SYS_PROF = 44 + SYS_BRK = 45 + SYS_SETGID = 46 + SYS_GETGID = 47 + SYS_SIGNAL = 48 + SYS_GETEUID = 49 + SYS_GETEGID = 50 + SYS_ACCT = 51 + SYS_UMOUNT2 = 52 + SYS_LOCK = 53 + SYS_IOCTL = 54 + SYS_FCNTL = 55 + SYS_MPX = 56 + SYS_SETPGID = 57 + SYS_ULIMIT = 58 + SYS_OLDOLDUNAME = 59 + SYS_UMASK = 60 + SYS_CHROOT = 61 + SYS_USTAT = 62 + SYS_DUP2 = 63 + SYS_GETPPID = 64 + SYS_GETPGRP = 65 + SYS_SETSID = 66 + SYS_SIGACTION = 67 + SYS_SGETMASK = 68 + SYS_SSETMASK = 69 + SYS_SETREUID = 70 + SYS_SETREGID = 71 + SYS_SIGSUSPEND = 72 + SYS_SIGPENDING = 73 + SYS_SETHOSTNAME = 74 + SYS_SETRLIMIT = 75 + SYS_GETRLIMIT = 76 + SYS_GETRUSAGE = 77 + SYS_GETTIMEOFDAY = 78 + SYS_SETTIMEOFDAY = 79 + SYS_GETGROUPS = 80 + SYS_SETGROUPS = 81 + SYS_SELECT = 82 + SYS_SYMLINK = 83 + SYS_OLDLSTAT = 84 + SYS_READLINK = 85 + SYS_USELIB = 86 + SYS_SWAPON = 87 + SYS_REBOOT = 88 + SYS_READDIR = 89 + SYS_MMAP = 90 + SYS_MUNMAP = 91 + SYS_TRUNCATE = 92 + SYS_FTRUNCATE = 93 + SYS_FCHMOD = 94 + SYS_FCHOWN = 95 + SYS_GETPRIORITY = 96 + SYS_SETPRIORITY = 97 + SYS_PROFIL = 98 + SYS_STATFS = 99 + SYS_FSTATFS = 100 + SYS_IOPERM = 101 + SYS_SOCKETCALL = 102 + SYS_SYSLOG = 103 + SYS_SETITIMER = 104 + SYS_GETITIMER = 105 + SYS_STAT = 106 + SYS_LSTAT = 107 + SYS_FSTAT = 108 + SYS_OLDUNAME = 109 + SYS_IOPL = 110 + SYS_VHANGUP = 111 + SYS_IDLE = 112 + SYS_VM86OLD = 113 + SYS_WAIT4 = 114 + SYS_SWAPOFF = 115 + SYS_SYSINFO = 116 + SYS_IPC = 117 + SYS_FSYNC = 118 + SYS_SIGRETURN = 119 + SYS_CLONE = 120 + SYS_SETDOMAINNAME = 121 + SYS_UNAME = 122 + SYS_MODIFY_LDT = 123 + SYS_ADJTIMEX = 124 + SYS_MPROTECT = 125 + SYS_SIGPROCMASK = 126 + SYS_CREATE_MODULE = 127 + SYS_INIT_MODULE = 128 + SYS_DELETE_MODULE = 129 + SYS_GET_KERNEL_SYMS = 130 + SYS_QUOTACTL = 131 + SYS_GETPGID = 132 + SYS_FCHDIR = 133 + SYS_BDFLUSH = 134 + SYS_SYSFS = 135 + SYS_PERSONALITY = 136 + SYS_AFS_SYSCALL = 137 + SYS_SETFSUID = 138 + SYS_SETFSGID = 139 + SYS__LLSEEK = 140 + SYS_GETDENTS = 141 + SYS__NEWSELECT = 142 + SYS_FLOCK = 143 + SYS_MSYNC = 144 + SYS_READV = 145 + SYS_WRITEV = 146 + SYS_GETSID = 147 + SYS_FDATASYNC = 148 + SYS__SYSCTL = 149 + SYS_MLOCK = 150 + SYS_MUNLOCK = 151 + SYS_MLOCKALL = 152 + SYS_MUNLOCKALL = 153 + SYS_SCHED_SETPARAM = 154 + SYS_SCHED_GETPARAM = 155 + SYS_SCHED_SETSCHEDULER = 156 + SYS_SCHED_GETSCHEDULER = 157 + SYS_SCHED_YIELD = 158 + SYS_SCHED_GET_PRIORITY_MAX = 159 + SYS_SCHED_GET_PRIORITY_MIN = 160 + SYS_SCHED_RR_GET_INTERVAL = 161 + SYS_NANOSLEEP = 162 + SYS_MREMAP = 163 + SYS_SETRESUID = 164 + SYS_GETRESUID = 165 + SYS_VM86 = 166 + SYS_QUERY_MODULE = 167 + SYS_POLL = 168 + SYS_NFSSERVCTL = 169 + SYS_SETRESGID = 170 + SYS_GETRESGID = 171 + SYS_PRCTL = 172 + SYS_RT_SIGRETURN = 173 + SYS_RT_SIGACTION = 174 + SYS_RT_SIGPROCMASK = 175 + SYS_RT_SIGPENDING = 176 + SYS_RT_SIGTIMEDWAIT = 177 + SYS_RT_SIGQUEUEINFO = 178 + SYS_RT_SIGSUSPEND = 179 + SYS_PREAD64 = 180 + SYS_PWRITE64 = 181 + SYS_CHOWN = 182 + SYS_GETCWD = 183 + SYS_CAPGET = 184 + SYS_CAPSET = 185 + SYS_SIGALTSTACK = 186 + SYS_SENDFILE = 187 + SYS_GETPMSG = 188 + SYS_PUTPMSG = 189 + SYS_VFORK = 190 + SYS_UGETRLIMIT = 191 + SYS_MMAP2 = 192 + SYS_TRUNCATE64 = 193 + SYS_FTRUNCATE64 = 194 + SYS_STAT64 = 195 + SYS_LSTAT64 = 196 + SYS_FSTAT64 = 197 + SYS_LCHOWN32 = 198 + SYS_GETUID32 = 199 + SYS_GETGID32 = 200 + SYS_GETEUID32 = 201 + SYS_GETEGID32 = 202 + SYS_SETREUID32 = 203 + SYS_SETREGID32 = 204 + SYS_GETGROUPS32 = 205 + SYS_SETGROUPS32 = 206 + SYS_FCHOWN32 = 207 + SYS_SETRESUID32 = 208 + SYS_GETRESUID32 = 209 + SYS_SETRESGID32 = 210 + SYS_GETRESGID32 = 211 + SYS_CHOWN32 = 212 + SYS_SETUID32 = 213 + SYS_SETGID32 = 214 + SYS_SETFSUID32 = 215 + SYS_SETFSGID32 = 216 + SYS_PIVOT_ROOT = 217 + SYS_MINCORE = 218 + SYS_MADVISE = 219 + SYS_GETDENTS64 = 220 + SYS_FCNTL64 = 221 + SYS_GETTID = 224 + SYS_READAHEAD = 225 + SYS_SETXATTR = 226 + SYS_LSETXATTR = 227 + SYS_FSETXATTR = 228 + SYS_GETXATTR = 229 + SYS_LGETXATTR = 230 + SYS_FGETXATTR = 231 + SYS_LISTXATTR = 232 + SYS_LLISTXATTR = 233 + SYS_FLISTXATTR = 234 + SYS_REMOVEXATTR = 235 + SYS_LREMOVEXATTR = 236 + SYS_FREMOVEXATTR = 237 + SYS_TKILL = 238 + SYS_SENDFILE64 = 239 + SYS_FUTEX = 240 + SYS_SCHED_SETAFFINITY = 241 + SYS_SCHED_GETAFFINITY = 242 + SYS_SET_THREAD_AREA = 243 + SYS_GET_THREAD_AREA = 244 + SYS_IO_SETUP = 245 + SYS_IO_DESTROY = 246 + SYS_IO_GETEVENTS = 247 + SYS_IO_SUBMIT = 248 + SYS_IO_CANCEL = 249 + SYS_FADVISE64 = 250 + SYS_EXIT_GROUP = 252 + SYS_LOOKUP_DCOOKIE = 253 + SYS_EPOLL_CREATE = 254 + SYS_EPOLL_CTL = 255 + SYS_EPOLL_WAIT = 256 + SYS_REMAP_FILE_PAGES = 257 + SYS_SET_TID_ADDRESS = 258 + SYS_TIMER_CREATE = 259 + SYS_TIMER_SETTIME = 260 + SYS_TIMER_GETTIME = 261 + SYS_TIMER_GETOVERRUN = 262 + SYS_TIMER_DELETE = 263 + SYS_CLOCK_SETTIME = 264 + SYS_CLOCK_GETTIME = 265 + SYS_CLOCK_GETRES = 266 + SYS_CLOCK_NANOSLEEP = 267 + SYS_STATFS64 = 268 + SYS_FSTATFS64 = 269 + SYS_TGKILL = 270 + SYS_UTIMES = 271 + SYS_FADVISE64_64 = 272 + SYS_VSERVER = 273 + SYS_MBIND = 274 + SYS_GET_MEMPOLICY = 275 + SYS_SET_MEMPOLICY = 276 + SYS_MQ_OPEN = 277 + SYS_MQ_UNLINK = 278 + SYS_MQ_TIMEDSEND = 279 + SYS_MQ_TIMEDRECEIVE = 280 + SYS_MQ_NOTIFY = 281 + SYS_MQ_GETSETATTR = 282 + SYS_KEXEC_LOAD = 283 + SYS_WAITID = 284 + SYS_ADD_KEY = 286 + SYS_REQUEST_KEY = 287 + SYS_KEYCTL = 288 + SYS_IOPRIO_SET = 289 + SYS_IOPRIO_GET = 290 + SYS_INOTIFY_INIT = 291 + SYS_INOTIFY_ADD_WATCH = 292 + SYS_INOTIFY_RM_WATCH = 293 + SYS_MIGRATE_PAGES = 294 + SYS_OPENAT = 295 + SYS_MKDIRAT = 296 + SYS_MKNODAT = 297 + SYS_FCHOWNAT = 298 + SYS_FUTIMESAT = 299 + SYS_FSTATAT64 = 300 + SYS_UNLINKAT = 301 + SYS_RENAMEAT = 302 + SYS_LINKAT = 303 + SYS_SYMLINKAT = 304 + SYS_READLINKAT = 305 + SYS_FCHMODAT = 306 + SYS_FACCESSAT = 307 + SYS_PSELECT6 = 308 + SYS_PPOLL = 309 + SYS_UNSHARE = 310 + SYS_SET_ROBUST_LIST = 311 + SYS_GET_ROBUST_LIST = 312 + SYS_SPLICE = 313 + SYS_SYNC_FILE_RANGE = 314 + SYS_TEE = 315 + SYS_VMSPLICE = 316 + SYS_MOVE_PAGES = 317 + SYS_GETCPU = 318 + SYS_EPOLL_PWAIT = 319 + SYS_UTIMENSAT = 320 + SYS_SIGNALFD = 321 + SYS_TIMERFD_CREATE = 322 + SYS_EVENTFD = 323 + SYS_FALLOCATE = 324 + SYS_TIMERFD_SETTIME = 325 + SYS_TIMERFD_GETTIME = 326 + SYS_SIGNALFD4 = 327 + SYS_EVENTFD2 = 328 + SYS_EPOLL_CREATE1 = 329 + SYS_DUP3 = 330 + SYS_PIPE2 = 331 + SYS_INOTIFY_INIT1 = 332 + SYS_PREADV = 333 + SYS_PWRITEV = 334 + SYS_RT_TGSIGQUEUEINFO = 335 + SYS_PERF_EVENT_OPEN = 336 + SYS_RECVMMSG = 337 + SYS_FANOTIFY_INIT = 338 + SYS_FANOTIFY_MARK = 339 + SYS_PRLIMIT64 = 340 + SYS_NAME_TO_HANDLE_AT = 341 + SYS_OPEN_BY_HANDLE_AT = 342 + SYS_CLOCK_ADJTIME = 343 + SYS_SYNCFS = 344 + SYS_SENDMMSG = 345 + SYS_SETNS = 346 + SYS_PROCESS_VM_READV = 347 + SYS_PROCESS_VM_WRITEV = 348 + SYS_KCMP = 349 + SYS_FINIT_MODULE = 350 + SYS_SCHED_SETATTR = 351 + SYS_SCHED_GETATTR = 352 + SYS_RENAMEAT2 = 353 + SYS_SECCOMP = 354 + SYS_GETRANDOM = 355 + SYS_MEMFD_CREATE = 356 + SYS_BPF = 357 + SYS_EXECVEAT = 358 + SYS_SOCKET = 359 + SYS_SOCKETPAIR = 360 + SYS_BIND = 361 + SYS_CONNECT = 362 + SYS_LISTEN = 363 + SYS_ACCEPT4 = 364 + SYS_GETSOCKOPT = 365 + SYS_SETSOCKOPT = 366 + SYS_GETSOCKNAME = 367 + SYS_GETPEERNAME = 368 + SYS_SENDTO = 369 + SYS_SENDMSG = 370 + SYS_RECVFROM = 371 + SYS_RECVMSG = 372 + SYS_SHUTDOWN = 373 + SYS_USERFAULTFD = 374 + SYS_MEMBARRIER = 375 + SYS_MLOCK2 = 376 + SYS_COPY_FILE_RANGE = 377 + SYS_PREADV2 = 378 + SYS_PWRITEV2 = 379 + SYS_PKEY_MPROTECT = 380 + SYS_PKEY_ALLOC = 381 + SYS_PKEY_FREE = 382 + SYS_STATX = 383 + SYS_ARCH_PRCTL = 384 + SYS_IO_PGETEVENTS = 385 + SYS_RSEQ = 386 +) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go new file mode 100644 index 00000000..70c1a2c1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go @@ -0,0 +1,344 @@ +// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include -m64 /tmp/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,linux + +package unix + +const ( + SYS_READ = 0 + SYS_WRITE = 1 + SYS_OPEN = 2 + SYS_CLOSE = 3 + SYS_STAT = 4 + SYS_FSTAT = 5 + SYS_LSTAT = 6 + SYS_POLL = 7 + SYS_LSEEK = 8 + SYS_MMAP = 9 + SYS_MPROTECT = 10 + SYS_MUNMAP = 11 + SYS_BRK = 12 + SYS_RT_SIGACTION = 13 + SYS_RT_SIGPROCMASK = 14 + SYS_RT_SIGRETURN = 15 + SYS_IOCTL = 16 + SYS_PREAD64 = 17 + SYS_PWRITE64 = 18 + SYS_READV = 19 + SYS_WRITEV = 20 + SYS_ACCESS = 21 + SYS_PIPE = 22 + SYS_SELECT = 23 + SYS_SCHED_YIELD = 24 + SYS_MREMAP = 25 + SYS_MSYNC = 26 + SYS_MINCORE = 27 + SYS_MADVISE = 28 + SYS_SHMGET = 29 + SYS_SHMAT = 30 + SYS_SHMCTL = 31 + SYS_DUP = 32 + SYS_DUP2 = 33 + SYS_PAUSE = 34 + SYS_NANOSLEEP = 35 + SYS_GETITIMER = 36 + SYS_ALARM = 37 + SYS_SETITIMER = 38 + SYS_GETPID = 39 + SYS_SENDFILE = 40 + SYS_SOCKET = 41 + SYS_CONNECT = 42 + SYS_ACCEPT = 43 + SYS_SENDTO = 44 + SYS_RECVFROM = 45 + SYS_SENDMSG = 46 + SYS_RECVMSG = 47 + SYS_SHUTDOWN = 48 + SYS_BIND = 49 + SYS_LISTEN = 50 + SYS_GETSOCKNAME = 51 + SYS_GETPEERNAME = 52 + SYS_SOCKETPAIR = 53 + SYS_SETSOCKOPT = 54 + SYS_GETSOCKOPT = 55 + SYS_CLONE = 56 + SYS_FORK = 57 + SYS_VFORK = 58 + SYS_EXECVE = 59 + SYS_EXIT = 60 + SYS_WAIT4 = 61 + SYS_KILL = 62 + SYS_UNAME = 63 + SYS_SEMGET = 64 + SYS_SEMOP = 65 + SYS_SEMCTL = 66 + SYS_SHMDT = 67 + SYS_MSGGET = 68 + SYS_MSGSND = 69 + SYS_MSGRCV = 70 + SYS_MSGCTL = 71 + SYS_FCNTL = 72 + SYS_FLOCK = 73 + SYS_FSYNC = 74 + SYS_FDATASYNC = 75 + SYS_TRUNCATE = 76 + SYS_FTRUNCATE = 77 + SYS_GETDENTS = 78 + SYS_GETCWD = 79 + SYS_CHDIR = 80 + SYS_FCHDIR = 81 + SYS_RENAME = 82 + SYS_MKDIR = 83 + SYS_RMDIR = 84 + SYS_CREAT = 85 + SYS_LINK = 86 + SYS_UNLINK = 87 + SYS_SYMLINK = 88 + SYS_READLINK = 89 + SYS_CHMOD = 90 + SYS_FCHMOD = 91 + SYS_CHOWN = 92 + SYS_FCHOWN = 93 + SYS_LCHOWN = 94 + SYS_UMASK = 95 + SYS_GETTIMEOFDAY = 96 + SYS_GETRLIMIT = 97 + SYS_GETRUSAGE = 98 + SYS_SYSINFO = 99 + SYS_TIMES = 100 + SYS_PTRACE = 101 + SYS_GETUID = 102 + SYS_SYSLOG = 103 + SYS_GETGID = 104 + SYS_SETUID = 105 + SYS_SETGID = 106 + SYS_GETEUID = 107 + SYS_GETEGID = 108 + SYS_SETPGID = 109 + SYS_GETPPID = 110 + SYS_GETPGRP = 111 + SYS_SETSID = 112 + SYS_SETREUID = 113 + SYS_SETREGID = 114 + SYS_GETGROUPS = 115 + SYS_SETGROUPS = 116 + SYS_SETRESUID = 117 + SYS_GETRESUID = 118 + SYS_SETRESGID = 119 + SYS_GETRESGID = 120 + SYS_GETPGID = 121 + SYS_SETFSUID = 122 + SYS_SETFSGID = 123 + SYS_GETSID = 124 + SYS_CAPGET = 125 + SYS_CAPSET = 126 + SYS_RT_SIGPENDING = 127 + SYS_RT_SIGTIMEDWAIT = 128 + SYS_RT_SIGQUEUEINFO = 129 + SYS_RT_SIGSUSPEND = 130 + SYS_SIGALTSTACK = 131 + SYS_UTIME = 132 + SYS_MKNOD = 133 + SYS_USELIB = 134 + SYS_PERSONALITY = 135 + SYS_USTAT = 136 + SYS_STATFS = 137 + SYS_FSTATFS = 138 + SYS_SYSFS = 139 + SYS_GETPRIORITY = 140 + SYS_SETPRIORITY = 141 + SYS_SCHED_SETPARAM = 142 + SYS_SCHED_GETPARAM = 143 + SYS_SCHED_SETSCHEDULER = 144 + SYS_SCHED_GETSCHEDULER = 145 + SYS_SCHED_GET_PRIORITY_MAX = 146 + SYS_SCHED_GET_PRIORITY_MIN = 147 + SYS_SCHED_RR_GET_INTERVAL = 148 + SYS_MLOCK = 149 + SYS_MUNLOCK = 150 + SYS_MLOCKALL = 151 + SYS_MUNLOCKALL = 152 + SYS_VHANGUP = 153 + SYS_MODIFY_LDT = 154 + SYS_PIVOT_ROOT = 155 + SYS__SYSCTL = 156 + SYS_PRCTL = 157 + SYS_ARCH_PRCTL = 158 + SYS_ADJTIMEX = 159 + SYS_SETRLIMIT = 160 + SYS_CHROOT = 161 + SYS_SYNC = 162 + SYS_ACCT = 163 + SYS_SETTIMEOFDAY = 164 + SYS_MOUNT = 165 + SYS_UMOUNT2 = 166 + SYS_SWAPON = 167 + SYS_SWAPOFF = 168 + SYS_REBOOT = 169 + SYS_SETHOSTNAME = 170 + SYS_SETDOMAINNAME = 171 + SYS_IOPL = 172 + SYS_IOPERM = 173 + SYS_CREATE_MODULE = 174 + SYS_INIT_MODULE = 175 + SYS_DELETE_MODULE = 176 + SYS_GET_KERNEL_SYMS = 177 + SYS_QUERY_MODULE = 178 + SYS_QUOTACTL = 179 + SYS_NFSSERVCTL = 180 + SYS_GETPMSG = 181 + SYS_PUTPMSG = 182 + SYS_AFS_SYSCALL = 183 + SYS_TUXCALL = 184 + SYS_SECURITY = 185 + SYS_GETTID = 186 + SYS_READAHEAD = 187 + SYS_SETXATTR = 188 + SYS_LSETXATTR = 189 + SYS_FSETXATTR = 190 + SYS_GETXATTR = 191 + SYS_LGETXATTR = 192 + SYS_FGETXATTR = 193 + SYS_LISTXATTR = 194 + SYS_LLISTXATTR = 195 + SYS_FLISTXATTR = 196 + SYS_REMOVEXATTR = 197 + SYS_LREMOVEXATTR = 198 + SYS_FREMOVEXATTR = 199 + SYS_TKILL = 200 + SYS_TIME = 201 + SYS_FUTEX = 202 + SYS_SCHED_SETAFFINITY = 203 + SYS_SCHED_GETAFFINITY = 204 + SYS_SET_THREAD_AREA = 205 + SYS_IO_SETUP = 206 + SYS_IO_DESTROY = 207 + SYS_IO_GETEVENTS = 208 + SYS_IO_SUBMIT = 209 + SYS_IO_CANCEL = 210 + SYS_GET_THREAD_AREA = 211 + SYS_LOOKUP_DCOOKIE = 212 + SYS_EPOLL_CREATE = 213 + SYS_EPOLL_CTL_OLD = 214 + SYS_EPOLL_WAIT_OLD = 215 + SYS_REMAP_FILE_PAGES = 216 + SYS_GETDENTS64 = 217 + SYS_SET_TID_ADDRESS = 218 + SYS_RESTART_SYSCALL = 219 + SYS_SEMTIMEDOP = 220 + SYS_FADVISE64 = 221 + SYS_TIMER_CREATE = 222 + SYS_TIMER_SETTIME = 223 + SYS_TIMER_GETTIME = 224 + SYS_TIMER_GETOVERRUN = 225 + SYS_TIMER_DELETE = 226 + SYS_CLOCK_SETTIME = 227 + SYS_CLOCK_GETTIME = 228 + SYS_CLOCK_GETRES = 229 + SYS_CLOCK_NANOSLEEP = 230 + SYS_EXIT_GROUP = 231 + SYS_EPOLL_WAIT = 232 + SYS_EPOLL_CTL = 233 + SYS_TGKILL = 234 + SYS_UTIMES = 235 + SYS_VSERVER = 236 + SYS_MBIND = 237 + SYS_SET_MEMPOLICY = 238 + SYS_GET_MEMPOLICY = 239 + SYS_MQ_OPEN = 240 + SYS_MQ_UNLINK = 241 + SYS_MQ_TIMEDSEND = 242 + SYS_MQ_TIMEDRECEIVE = 243 + SYS_MQ_NOTIFY = 244 + SYS_MQ_GETSETATTR = 245 + SYS_KEXEC_LOAD = 246 + SYS_WAITID = 247 + SYS_ADD_KEY = 248 + SYS_REQUEST_KEY = 249 + SYS_KEYCTL = 250 + SYS_IOPRIO_SET = 251 + SYS_IOPRIO_GET = 252 + SYS_INOTIFY_INIT = 253 + SYS_INOTIFY_ADD_WATCH = 254 + SYS_INOTIFY_RM_WATCH = 255 + SYS_MIGRATE_PAGES = 256 + SYS_OPENAT = 257 + SYS_MKDIRAT = 258 + SYS_MKNODAT = 259 + SYS_FCHOWNAT = 260 + SYS_FUTIMESAT = 261 + SYS_NEWFSTATAT = 262 + SYS_UNLINKAT = 263 + SYS_RENAMEAT = 264 + SYS_LINKAT = 265 + SYS_SYMLINKAT = 266 + SYS_READLINKAT = 267 + SYS_FCHMODAT = 268 + SYS_FACCESSAT = 269 + SYS_PSELECT6 = 270 + SYS_PPOLL = 271 + SYS_UNSHARE = 272 + SYS_SET_ROBUST_LIST = 273 + SYS_GET_ROBUST_LIST = 274 + SYS_SPLICE = 275 + SYS_TEE = 276 + SYS_SYNC_FILE_RANGE = 277 + SYS_VMSPLICE = 278 + SYS_MOVE_PAGES = 279 + SYS_UTIMENSAT = 280 + SYS_EPOLL_PWAIT = 281 + SYS_SIGNALFD = 282 + SYS_TIMERFD_CREATE = 283 + SYS_EVENTFD = 284 + SYS_FALLOCATE = 285 + SYS_TIMERFD_SETTIME = 286 + SYS_TIMERFD_GETTIME = 287 + SYS_ACCEPT4 = 288 + SYS_SIGNALFD4 = 289 + SYS_EVENTFD2 = 290 + SYS_EPOLL_CREATE1 = 291 + SYS_DUP3 = 292 + SYS_PIPE2 = 293 + SYS_INOTIFY_INIT1 = 294 + SYS_PREADV = 295 + SYS_PWRITEV = 296 + SYS_RT_TGSIGQUEUEINFO = 297 + SYS_PERF_EVENT_OPEN = 298 + SYS_RECVMMSG = 299 + SYS_FANOTIFY_INIT = 300 + SYS_FANOTIFY_MARK = 301 + SYS_PRLIMIT64 = 302 + SYS_NAME_TO_HANDLE_AT = 303 + SYS_OPEN_BY_HANDLE_AT = 304 + SYS_CLOCK_ADJTIME = 305 + SYS_SYNCFS = 306 + SYS_SENDMMSG = 307 + SYS_SETNS = 308 + SYS_GETCPU = 309 + SYS_PROCESS_VM_READV = 310 + SYS_PROCESS_VM_WRITEV = 311 + SYS_KCMP = 312 + SYS_FINIT_MODULE = 313 + SYS_SCHED_SETATTR = 314 + SYS_SCHED_GETATTR = 315 + SYS_RENAMEAT2 = 316 + SYS_SECCOMP = 317 + SYS_GETRANDOM = 318 + SYS_MEMFD_CREATE = 319 + SYS_KEXEC_FILE_LOAD = 320 + SYS_BPF = 321 + SYS_EXECVEAT = 322 + SYS_USERFAULTFD = 323 + SYS_MEMBARRIER = 324 + SYS_MLOCK2 = 325 + SYS_COPY_FILE_RANGE = 326 + SYS_PREADV2 = 327 + SYS_PWRITEV2 = 328 + SYS_PKEY_MPROTECT = 329 + SYS_PKEY_ALLOC = 330 + SYS_PKEY_FREE = 331 + SYS_STATX = 332 + SYS_IO_PGETEVENTS = 333 + SYS_RSEQ = 334 +) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go new file mode 100644 index 00000000..6e281d6b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go @@ -0,0 +1,364 @@ +// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm,linux + +package unix + +const ( + SYS_RESTART_SYSCALL = 0 + SYS_EXIT = 1 + SYS_FORK = 2 + SYS_READ = 3 + SYS_WRITE = 4 + SYS_OPEN = 5 + SYS_CLOSE = 6 + SYS_CREAT = 8 + SYS_LINK = 9 + SYS_UNLINK = 10 + SYS_EXECVE = 11 + SYS_CHDIR = 12 + SYS_MKNOD = 14 + SYS_CHMOD = 15 + SYS_LCHOWN = 16 + SYS_LSEEK = 19 + SYS_GETPID = 20 + SYS_MOUNT = 21 + SYS_SETUID = 23 + SYS_GETUID = 24 + SYS_PTRACE = 26 + SYS_PAUSE = 29 + SYS_ACCESS = 33 + SYS_NICE = 34 + SYS_SYNC = 36 + SYS_KILL = 37 + SYS_RENAME = 38 + SYS_MKDIR = 39 + SYS_RMDIR = 40 + SYS_DUP = 41 + SYS_PIPE = 42 + SYS_TIMES = 43 + SYS_BRK = 45 + SYS_SETGID = 46 + SYS_GETGID = 47 + SYS_GETEUID = 49 + SYS_GETEGID = 50 + SYS_ACCT = 51 + SYS_UMOUNT2 = 52 + SYS_IOCTL = 54 + SYS_FCNTL = 55 + SYS_SETPGID = 57 + SYS_UMASK = 60 + SYS_CHROOT = 61 + SYS_USTAT = 62 + SYS_DUP2 = 63 + SYS_GETPPID = 64 + SYS_GETPGRP = 65 + SYS_SETSID = 66 + SYS_SIGACTION = 67 + SYS_SETREUID = 70 + SYS_SETREGID = 71 + SYS_SIGSUSPEND = 72 + SYS_SIGPENDING = 73 + SYS_SETHOSTNAME = 74 + SYS_SETRLIMIT = 75 + SYS_GETRUSAGE = 77 + SYS_GETTIMEOFDAY = 78 + SYS_SETTIMEOFDAY = 79 + SYS_GETGROUPS = 80 + SYS_SETGROUPS = 81 + SYS_SYMLINK = 83 + SYS_READLINK = 85 + SYS_USELIB = 86 + SYS_SWAPON = 87 + SYS_REBOOT = 88 + SYS_MUNMAP = 91 + SYS_TRUNCATE = 92 + SYS_FTRUNCATE = 93 + SYS_FCHMOD = 94 + SYS_FCHOWN = 95 + SYS_GETPRIORITY = 96 + SYS_SETPRIORITY = 97 + SYS_STATFS = 99 + SYS_FSTATFS = 100 + SYS_SYSLOG = 103 + SYS_SETITIMER = 104 + SYS_GETITIMER = 105 + SYS_STAT = 106 + SYS_LSTAT = 107 + SYS_FSTAT = 108 + SYS_VHANGUP = 111 + SYS_WAIT4 = 114 + SYS_SWAPOFF = 115 + SYS_SYSINFO = 116 + SYS_FSYNC = 118 + SYS_SIGRETURN = 119 + SYS_CLONE = 120 + SYS_SETDOMAINNAME = 121 + SYS_UNAME = 122 + SYS_ADJTIMEX = 124 + SYS_MPROTECT = 125 + SYS_SIGPROCMASK = 126 + SYS_INIT_MODULE = 128 + SYS_DELETE_MODULE = 129 + SYS_QUOTACTL = 131 + SYS_GETPGID = 132 + SYS_FCHDIR = 133 + SYS_BDFLUSH = 134 + SYS_SYSFS = 135 + SYS_PERSONALITY = 136 + SYS_SETFSUID = 138 + SYS_SETFSGID = 139 + SYS__LLSEEK = 140 + SYS_GETDENTS = 141 + SYS__NEWSELECT = 142 + SYS_FLOCK = 143 + SYS_MSYNC = 144 + SYS_READV = 145 + SYS_WRITEV = 146 + SYS_GETSID = 147 + SYS_FDATASYNC = 148 + SYS__SYSCTL = 149 + SYS_MLOCK = 150 + SYS_MUNLOCK = 151 + SYS_MLOCKALL = 152 + SYS_MUNLOCKALL = 153 + SYS_SCHED_SETPARAM = 154 + SYS_SCHED_GETPARAM = 155 + SYS_SCHED_SETSCHEDULER = 156 + SYS_SCHED_GETSCHEDULER = 157 + SYS_SCHED_YIELD = 158 + SYS_SCHED_GET_PRIORITY_MAX = 159 + SYS_SCHED_GET_PRIORITY_MIN = 160 + SYS_SCHED_RR_GET_INTERVAL = 161 + SYS_NANOSLEEP = 162 + SYS_MREMAP = 163 + SYS_SETRESUID = 164 + SYS_GETRESUID = 165 + SYS_POLL = 168 + SYS_NFSSERVCTL = 169 + SYS_SETRESGID = 170 + SYS_GETRESGID = 171 + SYS_PRCTL = 172 + SYS_RT_SIGRETURN = 173 + SYS_RT_SIGACTION = 174 + SYS_RT_SIGPROCMASK = 175 + SYS_RT_SIGPENDING = 176 + SYS_RT_SIGTIMEDWAIT = 177 + SYS_RT_SIGQUEUEINFO = 178 + SYS_RT_SIGSUSPEND = 179 + SYS_PREAD64 = 180 + SYS_PWRITE64 = 181 + SYS_CHOWN = 182 + SYS_GETCWD = 183 + SYS_CAPGET = 184 + SYS_CAPSET = 185 + SYS_SIGALTSTACK = 186 + SYS_SENDFILE = 187 + SYS_VFORK = 190 + SYS_UGETRLIMIT = 191 + SYS_MMAP2 = 192 + SYS_TRUNCATE64 = 193 + SYS_FTRUNCATE64 = 194 + SYS_STAT64 = 195 + SYS_LSTAT64 = 196 + SYS_FSTAT64 = 197 + SYS_LCHOWN32 = 198 + SYS_GETUID32 = 199 + SYS_GETGID32 = 200 + SYS_GETEUID32 = 201 + SYS_GETEGID32 = 202 + SYS_SETREUID32 = 203 + SYS_SETREGID32 = 204 + SYS_GETGROUPS32 = 205 + SYS_SETGROUPS32 = 206 + SYS_FCHOWN32 = 207 + SYS_SETRESUID32 = 208 + SYS_GETRESUID32 = 209 + SYS_SETRESGID32 = 210 + SYS_GETRESGID32 = 211 + SYS_CHOWN32 = 212 + SYS_SETUID32 = 213 + SYS_SETGID32 = 214 + SYS_SETFSUID32 = 215 + SYS_SETFSGID32 = 216 + SYS_GETDENTS64 = 217 + SYS_PIVOT_ROOT = 218 + SYS_MINCORE = 219 + SYS_MADVISE = 220 + SYS_FCNTL64 = 221 + SYS_GETTID = 224 + SYS_READAHEAD = 225 + SYS_SETXATTR = 226 + SYS_LSETXATTR = 227 + SYS_FSETXATTR = 228 + SYS_GETXATTR = 229 + SYS_LGETXATTR = 230 + SYS_FGETXATTR = 231 + SYS_LISTXATTR = 232 + SYS_LLISTXATTR = 233 + SYS_FLISTXATTR = 234 + SYS_REMOVEXATTR = 235 + SYS_LREMOVEXATTR = 236 + SYS_FREMOVEXATTR = 237 + SYS_TKILL = 238 + SYS_SENDFILE64 = 239 + SYS_FUTEX = 240 + SYS_SCHED_SETAFFINITY = 241 + SYS_SCHED_GETAFFINITY = 242 + SYS_IO_SETUP = 243 + SYS_IO_DESTROY = 244 + SYS_IO_GETEVENTS = 245 + SYS_IO_SUBMIT = 246 + SYS_IO_CANCEL = 247 + SYS_EXIT_GROUP = 248 + SYS_LOOKUP_DCOOKIE = 249 + SYS_EPOLL_CREATE = 250 + SYS_EPOLL_CTL = 251 + SYS_EPOLL_WAIT = 252 + SYS_REMAP_FILE_PAGES = 253 + SYS_SET_TID_ADDRESS = 256 + SYS_TIMER_CREATE = 257 + SYS_TIMER_SETTIME = 258 + SYS_TIMER_GETTIME = 259 + SYS_TIMER_GETOVERRUN = 260 + SYS_TIMER_DELETE = 261 + SYS_CLOCK_SETTIME = 262 + SYS_CLOCK_GETTIME = 263 + SYS_CLOCK_GETRES = 264 + SYS_CLOCK_NANOSLEEP = 265 + SYS_STATFS64 = 266 + SYS_FSTATFS64 = 267 + SYS_TGKILL = 268 + SYS_UTIMES = 269 + SYS_ARM_FADVISE64_64 = 270 + SYS_PCICONFIG_IOBASE = 271 + SYS_PCICONFIG_READ = 272 + SYS_PCICONFIG_WRITE = 273 + SYS_MQ_OPEN = 274 + SYS_MQ_UNLINK = 275 + SYS_MQ_TIMEDSEND = 276 + SYS_MQ_TIMEDRECEIVE = 277 + SYS_MQ_NOTIFY = 278 + SYS_MQ_GETSETATTR = 279 + SYS_WAITID = 280 + SYS_SOCKET = 281 + SYS_BIND = 282 + SYS_CONNECT = 283 + SYS_LISTEN = 284 + SYS_ACCEPT = 285 + SYS_GETSOCKNAME = 286 + SYS_GETPEERNAME = 287 + SYS_SOCKETPAIR = 288 + SYS_SEND = 289 + SYS_SENDTO = 290 + SYS_RECV = 291 + SYS_RECVFROM = 292 + SYS_SHUTDOWN = 293 + SYS_SETSOCKOPT = 294 + SYS_GETSOCKOPT = 295 + SYS_SENDMSG = 296 + SYS_RECVMSG = 297 + SYS_SEMOP = 298 + SYS_SEMGET = 299 + SYS_SEMCTL = 300 + SYS_MSGSND = 301 + SYS_MSGRCV = 302 + SYS_MSGGET = 303 + SYS_MSGCTL = 304 + SYS_SHMAT = 305 + SYS_SHMDT = 306 + SYS_SHMGET = 307 + SYS_SHMCTL = 308 + SYS_ADD_KEY = 309 + SYS_REQUEST_KEY = 310 + SYS_KEYCTL = 311 + SYS_SEMTIMEDOP = 312 + SYS_VSERVER = 313 + SYS_IOPRIO_SET = 314 + SYS_IOPRIO_GET = 315 + SYS_INOTIFY_INIT = 316 + SYS_INOTIFY_ADD_WATCH = 317 + SYS_INOTIFY_RM_WATCH = 318 + SYS_MBIND = 319 + SYS_GET_MEMPOLICY = 320 + SYS_SET_MEMPOLICY = 321 + SYS_OPENAT = 322 + SYS_MKDIRAT = 323 + SYS_MKNODAT = 324 + SYS_FCHOWNAT = 325 + SYS_FUTIMESAT = 326 + SYS_FSTATAT64 = 327 + SYS_UNLINKAT = 328 + SYS_RENAMEAT = 329 + SYS_LINKAT = 330 + SYS_SYMLINKAT = 331 + SYS_READLINKAT = 332 + SYS_FCHMODAT = 333 + SYS_FACCESSAT = 334 + SYS_PSELECT6 = 335 + SYS_PPOLL = 336 + SYS_UNSHARE = 337 + SYS_SET_ROBUST_LIST = 338 + SYS_GET_ROBUST_LIST = 339 + SYS_SPLICE = 340 + SYS_ARM_SYNC_FILE_RANGE = 341 + SYS_TEE = 342 + SYS_VMSPLICE = 343 + SYS_MOVE_PAGES = 344 + SYS_GETCPU = 345 + SYS_EPOLL_PWAIT = 346 + SYS_KEXEC_LOAD = 347 + SYS_UTIMENSAT = 348 + SYS_SIGNALFD = 349 + SYS_TIMERFD_CREATE = 350 + SYS_EVENTFD = 351 + SYS_FALLOCATE = 352 + SYS_TIMERFD_SETTIME = 353 + SYS_TIMERFD_GETTIME = 354 + SYS_SIGNALFD4 = 355 + SYS_EVENTFD2 = 356 + SYS_EPOLL_CREATE1 = 357 + SYS_DUP3 = 358 + SYS_PIPE2 = 359 + SYS_INOTIFY_INIT1 = 360 + SYS_PREADV = 361 + SYS_PWRITEV = 362 + SYS_RT_TGSIGQUEUEINFO = 363 + SYS_PERF_EVENT_OPEN = 364 + SYS_RECVMMSG = 365 + SYS_ACCEPT4 = 366 + SYS_FANOTIFY_INIT = 367 + SYS_FANOTIFY_MARK = 368 + SYS_PRLIMIT64 = 369 + SYS_NAME_TO_HANDLE_AT = 370 + SYS_OPEN_BY_HANDLE_AT = 371 + SYS_CLOCK_ADJTIME = 372 + SYS_SYNCFS = 373 + SYS_SENDMMSG = 374 + SYS_SETNS = 375 + SYS_PROCESS_VM_READV = 376 + SYS_PROCESS_VM_WRITEV = 377 + SYS_KCMP = 378 + SYS_FINIT_MODULE = 379 + SYS_SCHED_SETATTR = 380 + SYS_SCHED_GETATTR = 381 + SYS_RENAMEAT2 = 382 + SYS_SECCOMP = 383 + SYS_GETRANDOM = 384 + SYS_MEMFD_CREATE = 385 + SYS_BPF = 386 + SYS_EXECVEAT = 387 + SYS_USERFAULTFD = 388 + SYS_MEMBARRIER = 389 + SYS_MLOCK2 = 390 + SYS_COPY_FILE_RANGE = 391 + SYS_PREADV2 = 392 + SYS_PWRITEV2 = 393 + SYS_PKEY_MPROTECT = 394 + SYS_PKEY_ALLOC = 395 + SYS_PKEY_FREE = 396 + SYS_STATX = 397 + SYS_RSEQ = 398 + SYS_IO_PGETEVENTS = 399 +) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go new file mode 100644 index 00000000..f9157e19 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go @@ -0,0 +1,288 @@ +// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include -fsigned-char /tmp/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm64,linux + +package unix + +const ( + SYS_IO_SETUP = 0 + SYS_IO_DESTROY = 1 + SYS_IO_SUBMIT = 2 + SYS_IO_CANCEL = 3 + SYS_IO_GETEVENTS = 4 + SYS_SETXATTR = 5 + SYS_LSETXATTR = 6 + SYS_FSETXATTR = 7 + SYS_GETXATTR = 8 + SYS_LGETXATTR = 9 + SYS_FGETXATTR = 10 + SYS_LISTXATTR = 11 + SYS_LLISTXATTR = 12 + SYS_FLISTXATTR = 13 + SYS_REMOVEXATTR = 14 + SYS_LREMOVEXATTR = 15 + SYS_FREMOVEXATTR = 16 + SYS_GETCWD = 17 + SYS_LOOKUP_DCOOKIE = 18 + SYS_EVENTFD2 = 19 + SYS_EPOLL_CREATE1 = 20 + SYS_EPOLL_CTL = 21 + SYS_EPOLL_PWAIT = 22 + SYS_DUP = 23 + SYS_DUP3 = 24 + SYS_FCNTL = 25 + SYS_INOTIFY_INIT1 = 26 + SYS_INOTIFY_ADD_WATCH = 27 + SYS_INOTIFY_RM_WATCH = 28 + SYS_IOCTL = 29 + SYS_IOPRIO_SET = 30 + SYS_IOPRIO_GET = 31 + SYS_FLOCK = 32 + SYS_MKNODAT = 33 + SYS_MKDIRAT = 34 + SYS_UNLINKAT = 35 + SYS_SYMLINKAT = 36 + SYS_LINKAT = 37 + SYS_RENAMEAT = 38 + SYS_UMOUNT2 = 39 + SYS_MOUNT = 40 + SYS_PIVOT_ROOT = 41 + SYS_NFSSERVCTL = 42 + SYS_STATFS = 43 + SYS_FSTATFS = 44 + SYS_TRUNCATE = 45 + SYS_FTRUNCATE = 46 + SYS_FALLOCATE = 47 + SYS_FACCESSAT = 48 + SYS_CHDIR = 49 + SYS_FCHDIR = 50 + SYS_CHROOT = 51 + SYS_FCHMOD = 52 + SYS_FCHMODAT = 53 + SYS_FCHOWNAT = 54 + SYS_FCHOWN = 55 + SYS_OPENAT = 56 + SYS_CLOSE = 57 + SYS_VHANGUP = 58 + SYS_PIPE2 = 59 + SYS_QUOTACTL = 60 + SYS_GETDENTS64 = 61 + SYS_LSEEK = 62 + SYS_READ = 63 + SYS_WRITE = 64 + SYS_READV = 65 + SYS_WRITEV = 66 + SYS_PREAD64 = 67 + SYS_PWRITE64 = 68 + SYS_PREADV = 69 + SYS_PWRITEV = 70 + SYS_SENDFILE = 71 + SYS_PSELECT6 = 72 + SYS_PPOLL = 73 + SYS_SIGNALFD4 = 74 + SYS_VMSPLICE = 75 + SYS_SPLICE = 76 + SYS_TEE = 77 + SYS_READLINKAT = 78 + SYS_FSTATAT = 79 + SYS_FSTAT = 80 + SYS_SYNC = 81 + SYS_FSYNC = 82 + SYS_FDATASYNC = 83 + SYS_SYNC_FILE_RANGE = 84 + SYS_TIMERFD_CREATE = 85 + SYS_TIMERFD_SETTIME = 86 + SYS_TIMERFD_GETTIME = 87 + SYS_UTIMENSAT = 88 + SYS_ACCT = 89 + SYS_CAPGET = 90 + SYS_CAPSET = 91 + SYS_PERSONALITY = 92 + SYS_EXIT = 93 + SYS_EXIT_GROUP = 94 + SYS_WAITID = 95 + SYS_SET_TID_ADDRESS = 96 + SYS_UNSHARE = 97 + SYS_FUTEX = 98 + SYS_SET_ROBUST_LIST = 99 + SYS_GET_ROBUST_LIST = 100 + SYS_NANOSLEEP = 101 + SYS_GETITIMER = 102 + SYS_SETITIMER = 103 + SYS_KEXEC_LOAD = 104 + SYS_INIT_MODULE = 105 + SYS_DELETE_MODULE = 106 + SYS_TIMER_CREATE = 107 + SYS_TIMER_GETTIME = 108 + SYS_TIMER_GETOVERRUN = 109 + SYS_TIMER_SETTIME = 110 + SYS_TIMER_DELETE = 111 + SYS_CLOCK_SETTIME = 112 + SYS_CLOCK_GETTIME = 113 + SYS_CLOCK_GETRES = 114 + SYS_CLOCK_NANOSLEEP = 115 + SYS_SYSLOG = 116 + SYS_PTRACE = 117 + SYS_SCHED_SETPARAM = 118 + SYS_SCHED_SETSCHEDULER = 119 + SYS_SCHED_GETSCHEDULER = 120 + SYS_SCHED_GETPARAM = 121 + SYS_SCHED_SETAFFINITY = 122 + SYS_SCHED_GETAFFINITY = 123 + SYS_SCHED_YIELD = 124 + SYS_SCHED_GET_PRIORITY_MAX = 125 + SYS_SCHED_GET_PRIORITY_MIN = 126 + SYS_SCHED_RR_GET_INTERVAL = 127 + SYS_RESTART_SYSCALL = 128 + SYS_KILL = 129 + SYS_TKILL = 130 + SYS_TGKILL = 131 + SYS_SIGALTSTACK = 132 + SYS_RT_SIGSUSPEND = 133 + SYS_RT_SIGACTION = 134 + SYS_RT_SIGPROCMASK = 135 + SYS_RT_SIGPENDING = 136 + SYS_RT_SIGTIMEDWAIT = 137 + SYS_RT_SIGQUEUEINFO = 138 + SYS_RT_SIGRETURN = 139 + SYS_SETPRIORITY = 140 + SYS_GETPRIORITY = 141 + SYS_REBOOT = 142 + SYS_SETREGID = 143 + SYS_SETGID = 144 + SYS_SETREUID = 145 + SYS_SETUID = 146 + SYS_SETRESUID = 147 + SYS_GETRESUID = 148 + SYS_SETRESGID = 149 + SYS_GETRESGID = 150 + SYS_SETFSUID = 151 + SYS_SETFSGID = 152 + SYS_TIMES = 153 + SYS_SETPGID = 154 + SYS_GETPGID = 155 + SYS_GETSID = 156 + SYS_SETSID = 157 + SYS_GETGROUPS = 158 + SYS_SETGROUPS = 159 + SYS_UNAME = 160 + SYS_SETHOSTNAME = 161 + SYS_SETDOMAINNAME = 162 + SYS_GETRLIMIT = 163 + SYS_SETRLIMIT = 164 + SYS_GETRUSAGE = 165 + SYS_UMASK = 166 + SYS_PRCTL = 167 + SYS_GETCPU = 168 + SYS_GETTIMEOFDAY = 169 + SYS_SETTIMEOFDAY = 170 + SYS_ADJTIMEX = 171 + SYS_GETPID = 172 + SYS_GETPPID = 173 + SYS_GETUID = 174 + SYS_GETEUID = 175 + SYS_GETGID = 176 + SYS_GETEGID = 177 + SYS_GETTID = 178 + SYS_SYSINFO = 179 + SYS_MQ_OPEN = 180 + SYS_MQ_UNLINK = 181 + SYS_MQ_TIMEDSEND = 182 + SYS_MQ_TIMEDRECEIVE = 183 + SYS_MQ_NOTIFY = 184 + SYS_MQ_GETSETATTR = 185 + SYS_MSGGET = 186 + SYS_MSGCTL = 187 + SYS_MSGRCV = 188 + SYS_MSGSND = 189 + SYS_SEMGET = 190 + SYS_SEMCTL = 191 + SYS_SEMTIMEDOP = 192 + SYS_SEMOP = 193 + SYS_SHMGET = 194 + SYS_SHMCTL = 195 + SYS_SHMAT = 196 + SYS_SHMDT = 197 + SYS_SOCKET = 198 + SYS_SOCKETPAIR = 199 + SYS_BIND = 200 + SYS_LISTEN = 201 + SYS_ACCEPT = 202 + SYS_CONNECT = 203 + SYS_GETSOCKNAME = 204 + SYS_GETPEERNAME = 205 + SYS_SENDTO = 206 + SYS_RECVFROM = 207 + SYS_SETSOCKOPT = 208 + SYS_GETSOCKOPT = 209 + SYS_SHUTDOWN = 210 + SYS_SENDMSG = 211 + SYS_RECVMSG = 212 + SYS_READAHEAD = 213 + SYS_BRK = 214 + SYS_MUNMAP = 215 + SYS_MREMAP = 216 + SYS_ADD_KEY = 217 + SYS_REQUEST_KEY = 218 + SYS_KEYCTL = 219 + SYS_CLONE = 220 + SYS_EXECVE = 221 + SYS_MMAP = 222 + SYS_FADVISE64 = 223 + SYS_SWAPON = 224 + SYS_SWAPOFF = 225 + SYS_MPROTECT = 226 + SYS_MSYNC = 227 + SYS_MLOCK = 228 + SYS_MUNLOCK = 229 + SYS_MLOCKALL = 230 + SYS_MUNLOCKALL = 231 + SYS_MINCORE = 232 + SYS_MADVISE = 233 + SYS_REMAP_FILE_PAGES = 234 + SYS_MBIND = 235 + SYS_GET_MEMPOLICY = 236 + SYS_SET_MEMPOLICY = 237 + SYS_MIGRATE_PAGES = 238 + SYS_MOVE_PAGES = 239 + SYS_RT_TGSIGQUEUEINFO = 240 + SYS_PERF_EVENT_OPEN = 241 + SYS_ACCEPT4 = 242 + SYS_RECVMMSG = 243 + SYS_ARCH_SPECIFIC_SYSCALL = 244 + SYS_WAIT4 = 260 + SYS_PRLIMIT64 = 261 + SYS_FANOTIFY_INIT = 262 + SYS_FANOTIFY_MARK = 263 + SYS_NAME_TO_HANDLE_AT = 264 + SYS_OPEN_BY_HANDLE_AT = 265 + SYS_CLOCK_ADJTIME = 266 + SYS_SYNCFS = 267 + SYS_SETNS = 268 + SYS_SENDMMSG = 269 + SYS_PROCESS_VM_READV = 270 + SYS_PROCESS_VM_WRITEV = 271 + SYS_KCMP = 272 + SYS_FINIT_MODULE = 273 + SYS_SCHED_SETATTR = 274 + SYS_SCHED_GETATTR = 275 + SYS_RENAMEAT2 = 276 + SYS_SECCOMP = 277 + SYS_GETRANDOM = 278 + SYS_MEMFD_CREATE = 279 + SYS_BPF = 280 + SYS_EXECVEAT = 281 + SYS_USERFAULTFD = 282 + SYS_MEMBARRIER = 283 + SYS_MLOCK2 = 284 + SYS_COPY_FILE_RANGE = 285 + SYS_PREADV2 = 286 + SYS_PWRITEV2 = 287 + SYS_PKEY_MPROTECT = 288 + SYS_PKEY_ALLOC = 289 + SYS_PKEY_FREE = 290 + SYS_STATX = 291 + SYS_IO_PGETEVENTS = 292 + SYS_RSEQ = 293 +) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go new file mode 100644 index 00000000..16714491 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go @@ -0,0 +1,377 @@ +// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build mips,linux + +package unix + +const ( + SYS_SYSCALL = 4000 + SYS_EXIT = 4001 + SYS_FORK = 4002 + SYS_READ = 4003 + SYS_WRITE = 4004 + SYS_OPEN = 4005 + SYS_CLOSE = 4006 + SYS_WAITPID = 4007 + SYS_CREAT = 4008 + SYS_LINK = 4009 + SYS_UNLINK = 4010 + SYS_EXECVE = 4011 + SYS_CHDIR = 4012 + SYS_TIME = 4013 + SYS_MKNOD = 4014 + SYS_CHMOD = 4015 + SYS_LCHOWN = 4016 + SYS_BREAK = 4017 + SYS_UNUSED18 = 4018 + SYS_LSEEK = 4019 + SYS_GETPID = 4020 + SYS_MOUNT = 4021 + SYS_UMOUNT = 4022 + SYS_SETUID = 4023 + SYS_GETUID = 4024 + SYS_STIME = 4025 + SYS_PTRACE = 4026 + SYS_ALARM = 4027 + SYS_UNUSED28 = 4028 + SYS_PAUSE = 4029 + SYS_UTIME = 4030 + SYS_STTY = 4031 + SYS_GTTY = 4032 + SYS_ACCESS = 4033 + SYS_NICE = 4034 + SYS_FTIME = 4035 + SYS_SYNC = 4036 + SYS_KILL = 4037 + SYS_RENAME = 4038 + SYS_MKDIR = 4039 + SYS_RMDIR = 4040 + SYS_DUP = 4041 + SYS_PIPE = 4042 + SYS_TIMES = 4043 + SYS_PROF = 4044 + SYS_BRK = 4045 + SYS_SETGID = 4046 + SYS_GETGID = 4047 + SYS_SIGNAL = 4048 + SYS_GETEUID = 4049 + SYS_GETEGID = 4050 + SYS_ACCT = 4051 + SYS_UMOUNT2 = 4052 + SYS_LOCK = 4053 + SYS_IOCTL = 4054 + SYS_FCNTL = 4055 + SYS_MPX = 4056 + SYS_SETPGID = 4057 + SYS_ULIMIT = 4058 + SYS_UNUSED59 = 4059 + SYS_UMASK = 4060 + SYS_CHROOT = 4061 + SYS_USTAT = 4062 + SYS_DUP2 = 4063 + SYS_GETPPID = 4064 + SYS_GETPGRP = 4065 + SYS_SETSID = 4066 + SYS_SIGACTION = 4067 + SYS_SGETMASK = 4068 + SYS_SSETMASK = 4069 + SYS_SETREUID = 4070 + SYS_SETREGID = 4071 + SYS_SIGSUSPEND = 4072 + SYS_SIGPENDING = 4073 + SYS_SETHOSTNAME = 4074 + SYS_SETRLIMIT = 4075 + SYS_GETRLIMIT = 4076 + SYS_GETRUSAGE = 4077 + SYS_GETTIMEOFDAY = 4078 + SYS_SETTIMEOFDAY = 4079 + SYS_GETGROUPS = 4080 + SYS_SETGROUPS = 4081 + SYS_RESERVED82 = 4082 + SYS_SYMLINK = 4083 + SYS_UNUSED84 = 4084 + SYS_READLINK = 4085 + SYS_USELIB = 4086 + SYS_SWAPON = 4087 + SYS_REBOOT = 4088 + SYS_READDIR = 4089 + SYS_MMAP = 4090 + SYS_MUNMAP = 4091 + SYS_TRUNCATE = 4092 + SYS_FTRUNCATE = 4093 + SYS_FCHMOD = 4094 + SYS_FCHOWN = 4095 + SYS_GETPRIORITY = 4096 + SYS_SETPRIORITY = 4097 + SYS_PROFIL = 4098 + SYS_STATFS = 4099 + SYS_FSTATFS = 4100 + SYS_IOPERM = 4101 + SYS_SOCKETCALL = 4102 + SYS_SYSLOG = 4103 + SYS_SETITIMER = 4104 + SYS_GETITIMER = 4105 + SYS_STAT = 4106 + SYS_LSTAT = 4107 + SYS_FSTAT = 4108 + SYS_UNUSED109 = 4109 + SYS_IOPL = 4110 + SYS_VHANGUP = 4111 + SYS_IDLE = 4112 + SYS_VM86 = 4113 + SYS_WAIT4 = 4114 + SYS_SWAPOFF = 4115 + SYS_SYSINFO = 4116 + SYS_IPC = 4117 + SYS_FSYNC = 4118 + SYS_SIGRETURN = 4119 + SYS_CLONE = 4120 + SYS_SETDOMAINNAME = 4121 + SYS_UNAME = 4122 + SYS_MODIFY_LDT = 4123 + SYS_ADJTIMEX = 4124 + SYS_MPROTECT = 4125 + SYS_SIGPROCMASK = 4126 + SYS_CREATE_MODULE = 4127 + SYS_INIT_MODULE = 4128 + SYS_DELETE_MODULE = 4129 + SYS_GET_KERNEL_SYMS = 4130 + SYS_QUOTACTL = 4131 + SYS_GETPGID = 4132 + SYS_FCHDIR = 4133 + SYS_BDFLUSH = 4134 + SYS_SYSFS = 4135 + SYS_PERSONALITY = 4136 + SYS_AFS_SYSCALL = 4137 + SYS_SETFSUID = 4138 + SYS_SETFSGID = 4139 + SYS__LLSEEK = 4140 + SYS_GETDENTS = 4141 + SYS__NEWSELECT = 4142 + SYS_FLOCK = 4143 + SYS_MSYNC = 4144 + SYS_READV = 4145 + SYS_WRITEV = 4146 + SYS_CACHEFLUSH = 4147 + SYS_CACHECTL = 4148 + SYS_SYSMIPS = 4149 + SYS_UNUSED150 = 4150 + SYS_GETSID = 4151 + SYS_FDATASYNC = 4152 + SYS__SYSCTL = 4153 + SYS_MLOCK = 4154 + SYS_MUNLOCK = 4155 + SYS_MLOCKALL = 4156 + SYS_MUNLOCKALL = 4157 + SYS_SCHED_SETPARAM = 4158 + SYS_SCHED_GETPARAM = 4159 + SYS_SCHED_SETSCHEDULER = 4160 + SYS_SCHED_GETSCHEDULER = 4161 + SYS_SCHED_YIELD = 4162 + SYS_SCHED_GET_PRIORITY_MAX = 4163 + SYS_SCHED_GET_PRIORITY_MIN = 4164 + SYS_SCHED_RR_GET_INTERVAL = 4165 + SYS_NANOSLEEP = 4166 + SYS_MREMAP = 4167 + SYS_ACCEPT = 4168 + SYS_BIND = 4169 + SYS_CONNECT = 4170 + SYS_GETPEERNAME = 4171 + SYS_GETSOCKNAME = 4172 + SYS_GETSOCKOPT = 4173 + SYS_LISTEN = 4174 + SYS_RECV = 4175 + SYS_RECVFROM = 4176 + SYS_RECVMSG = 4177 + SYS_SEND = 4178 + SYS_SENDMSG = 4179 + SYS_SENDTO = 4180 + SYS_SETSOCKOPT = 4181 + SYS_SHUTDOWN = 4182 + SYS_SOCKET = 4183 + SYS_SOCKETPAIR = 4184 + SYS_SETRESUID = 4185 + SYS_GETRESUID = 4186 + SYS_QUERY_MODULE = 4187 + SYS_POLL = 4188 + SYS_NFSSERVCTL = 4189 + SYS_SETRESGID = 4190 + SYS_GETRESGID = 4191 + SYS_PRCTL = 4192 + SYS_RT_SIGRETURN = 4193 + SYS_RT_SIGACTION = 4194 + SYS_RT_SIGPROCMASK = 4195 + SYS_RT_SIGPENDING = 4196 + SYS_RT_SIGTIMEDWAIT = 4197 + SYS_RT_SIGQUEUEINFO = 4198 + SYS_RT_SIGSUSPEND = 4199 + SYS_PREAD64 = 4200 + SYS_PWRITE64 = 4201 + SYS_CHOWN = 4202 + SYS_GETCWD = 4203 + SYS_CAPGET = 4204 + SYS_CAPSET = 4205 + SYS_SIGALTSTACK = 4206 + SYS_SENDFILE = 4207 + SYS_GETPMSG = 4208 + SYS_PUTPMSG = 4209 + SYS_MMAP2 = 4210 + SYS_TRUNCATE64 = 4211 + SYS_FTRUNCATE64 = 4212 + SYS_STAT64 = 4213 + SYS_LSTAT64 = 4214 + SYS_FSTAT64 = 4215 + SYS_PIVOT_ROOT = 4216 + SYS_MINCORE = 4217 + SYS_MADVISE = 4218 + SYS_GETDENTS64 = 4219 + SYS_FCNTL64 = 4220 + SYS_RESERVED221 = 4221 + SYS_GETTID = 4222 + SYS_READAHEAD = 4223 + SYS_SETXATTR = 4224 + SYS_LSETXATTR = 4225 + SYS_FSETXATTR = 4226 + SYS_GETXATTR = 4227 + SYS_LGETXATTR = 4228 + SYS_FGETXATTR = 4229 + SYS_LISTXATTR = 4230 + SYS_LLISTXATTR = 4231 + SYS_FLISTXATTR = 4232 + SYS_REMOVEXATTR = 4233 + SYS_LREMOVEXATTR = 4234 + SYS_FREMOVEXATTR = 4235 + SYS_TKILL = 4236 + SYS_SENDFILE64 = 4237 + SYS_FUTEX = 4238 + SYS_SCHED_SETAFFINITY = 4239 + SYS_SCHED_GETAFFINITY = 4240 + SYS_IO_SETUP = 4241 + SYS_IO_DESTROY = 4242 + SYS_IO_GETEVENTS = 4243 + SYS_IO_SUBMIT = 4244 + SYS_IO_CANCEL = 4245 + SYS_EXIT_GROUP = 4246 + SYS_LOOKUP_DCOOKIE = 4247 + SYS_EPOLL_CREATE = 4248 + SYS_EPOLL_CTL = 4249 + SYS_EPOLL_WAIT = 4250 + SYS_REMAP_FILE_PAGES = 4251 + SYS_SET_TID_ADDRESS = 4252 + SYS_RESTART_SYSCALL = 4253 + SYS_FADVISE64 = 4254 + SYS_STATFS64 = 4255 + SYS_FSTATFS64 = 4256 + SYS_TIMER_CREATE = 4257 + SYS_TIMER_SETTIME = 4258 + SYS_TIMER_GETTIME = 4259 + SYS_TIMER_GETOVERRUN = 4260 + SYS_TIMER_DELETE = 4261 + SYS_CLOCK_SETTIME = 4262 + SYS_CLOCK_GETTIME = 4263 + SYS_CLOCK_GETRES = 4264 + SYS_CLOCK_NANOSLEEP = 4265 + SYS_TGKILL = 4266 + SYS_UTIMES = 4267 + SYS_MBIND = 4268 + SYS_GET_MEMPOLICY = 4269 + SYS_SET_MEMPOLICY = 4270 + SYS_MQ_OPEN = 4271 + SYS_MQ_UNLINK = 4272 + SYS_MQ_TIMEDSEND = 4273 + SYS_MQ_TIMEDRECEIVE = 4274 + SYS_MQ_NOTIFY = 4275 + SYS_MQ_GETSETATTR = 4276 + SYS_VSERVER = 4277 + SYS_WAITID = 4278 + SYS_ADD_KEY = 4280 + SYS_REQUEST_KEY = 4281 + SYS_KEYCTL = 4282 + SYS_SET_THREAD_AREA = 4283 + SYS_INOTIFY_INIT = 4284 + SYS_INOTIFY_ADD_WATCH = 4285 + SYS_INOTIFY_RM_WATCH = 4286 + SYS_MIGRATE_PAGES = 4287 + SYS_OPENAT = 4288 + SYS_MKDIRAT = 4289 + SYS_MKNODAT = 4290 + SYS_FCHOWNAT = 4291 + SYS_FUTIMESAT = 4292 + SYS_FSTATAT64 = 4293 + SYS_UNLINKAT = 4294 + SYS_RENAMEAT = 4295 + SYS_LINKAT = 4296 + SYS_SYMLINKAT = 4297 + SYS_READLINKAT = 4298 + SYS_FCHMODAT = 4299 + SYS_FACCESSAT = 4300 + SYS_PSELECT6 = 4301 + SYS_PPOLL = 4302 + SYS_UNSHARE = 4303 + SYS_SPLICE = 4304 + SYS_SYNC_FILE_RANGE = 4305 + SYS_TEE = 4306 + SYS_VMSPLICE = 4307 + SYS_MOVE_PAGES = 4308 + SYS_SET_ROBUST_LIST = 4309 + SYS_GET_ROBUST_LIST = 4310 + SYS_KEXEC_LOAD = 4311 + SYS_GETCPU = 4312 + SYS_EPOLL_PWAIT = 4313 + SYS_IOPRIO_SET = 4314 + SYS_IOPRIO_GET = 4315 + SYS_UTIMENSAT = 4316 + SYS_SIGNALFD = 4317 + SYS_TIMERFD = 4318 + SYS_EVENTFD = 4319 + SYS_FALLOCATE = 4320 + SYS_TIMERFD_CREATE = 4321 + SYS_TIMERFD_GETTIME = 4322 + SYS_TIMERFD_SETTIME = 4323 + SYS_SIGNALFD4 = 4324 + SYS_EVENTFD2 = 4325 + SYS_EPOLL_CREATE1 = 4326 + SYS_DUP3 = 4327 + SYS_PIPE2 = 4328 + SYS_INOTIFY_INIT1 = 4329 + SYS_PREADV = 4330 + SYS_PWRITEV = 4331 + SYS_RT_TGSIGQUEUEINFO = 4332 + SYS_PERF_EVENT_OPEN = 4333 + SYS_ACCEPT4 = 4334 + SYS_RECVMMSG = 4335 + SYS_FANOTIFY_INIT = 4336 + SYS_FANOTIFY_MARK = 4337 + SYS_PRLIMIT64 = 4338 + SYS_NAME_TO_HANDLE_AT = 4339 + SYS_OPEN_BY_HANDLE_AT = 4340 + SYS_CLOCK_ADJTIME = 4341 + SYS_SYNCFS = 4342 + SYS_SENDMMSG = 4343 + SYS_SETNS = 4344 + SYS_PROCESS_VM_READV = 4345 + SYS_PROCESS_VM_WRITEV = 4346 + SYS_KCMP = 4347 + SYS_FINIT_MODULE = 4348 + SYS_SCHED_SETATTR = 4349 + SYS_SCHED_GETATTR = 4350 + SYS_RENAMEAT2 = 4351 + SYS_SECCOMP = 4352 + SYS_GETRANDOM = 4353 + SYS_MEMFD_CREATE = 4354 + SYS_BPF = 4355 + SYS_EXECVEAT = 4356 + SYS_USERFAULTFD = 4357 + SYS_MEMBARRIER = 4358 + SYS_MLOCK2 = 4359 + SYS_COPY_FILE_RANGE = 4360 + SYS_PREADV2 = 4361 + SYS_PWRITEV2 = 4362 + SYS_PKEY_MPROTECT = 4363 + SYS_PKEY_ALLOC = 4364 + SYS_PKEY_FREE = 4365 + SYS_STATX = 4366 + SYS_RSEQ = 4367 + SYS_IO_PGETEVENTS = 4368 +) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go new file mode 100644 index 00000000..1270a1c9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go @@ -0,0 +1,337 @@ +// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build mips64,linux + +package unix + +const ( + SYS_READ = 5000 + SYS_WRITE = 5001 + SYS_OPEN = 5002 + SYS_CLOSE = 5003 + SYS_STAT = 5004 + SYS_FSTAT = 5005 + SYS_LSTAT = 5006 + SYS_POLL = 5007 + SYS_LSEEK = 5008 + SYS_MMAP = 5009 + SYS_MPROTECT = 5010 + SYS_MUNMAP = 5011 + SYS_BRK = 5012 + SYS_RT_SIGACTION = 5013 + SYS_RT_SIGPROCMASK = 5014 + SYS_IOCTL = 5015 + SYS_PREAD64 = 5016 + SYS_PWRITE64 = 5017 + SYS_READV = 5018 + SYS_WRITEV = 5019 + SYS_ACCESS = 5020 + SYS_PIPE = 5021 + SYS__NEWSELECT = 5022 + SYS_SCHED_YIELD = 5023 + SYS_MREMAP = 5024 + SYS_MSYNC = 5025 + SYS_MINCORE = 5026 + SYS_MADVISE = 5027 + SYS_SHMGET = 5028 + SYS_SHMAT = 5029 + SYS_SHMCTL = 5030 + SYS_DUP = 5031 + SYS_DUP2 = 5032 + SYS_PAUSE = 5033 + SYS_NANOSLEEP = 5034 + SYS_GETITIMER = 5035 + SYS_SETITIMER = 5036 + SYS_ALARM = 5037 + SYS_GETPID = 5038 + SYS_SENDFILE = 5039 + SYS_SOCKET = 5040 + SYS_CONNECT = 5041 + SYS_ACCEPT = 5042 + SYS_SENDTO = 5043 + SYS_RECVFROM = 5044 + SYS_SENDMSG = 5045 + SYS_RECVMSG = 5046 + SYS_SHUTDOWN = 5047 + SYS_BIND = 5048 + SYS_LISTEN = 5049 + SYS_GETSOCKNAME = 5050 + SYS_GETPEERNAME = 5051 + SYS_SOCKETPAIR = 5052 + SYS_SETSOCKOPT = 5053 + SYS_GETSOCKOPT = 5054 + SYS_CLONE = 5055 + SYS_FORK = 5056 + SYS_EXECVE = 5057 + SYS_EXIT = 5058 + SYS_WAIT4 = 5059 + SYS_KILL = 5060 + SYS_UNAME = 5061 + SYS_SEMGET = 5062 + SYS_SEMOP = 5063 + SYS_SEMCTL = 5064 + SYS_SHMDT = 5065 + SYS_MSGGET = 5066 + SYS_MSGSND = 5067 + SYS_MSGRCV = 5068 + SYS_MSGCTL = 5069 + SYS_FCNTL = 5070 + SYS_FLOCK = 5071 + SYS_FSYNC = 5072 + SYS_FDATASYNC = 5073 + SYS_TRUNCATE = 5074 + SYS_FTRUNCATE = 5075 + SYS_GETDENTS = 5076 + SYS_GETCWD = 5077 + SYS_CHDIR = 5078 + SYS_FCHDIR = 5079 + SYS_RENAME = 5080 + SYS_MKDIR = 5081 + SYS_RMDIR = 5082 + SYS_CREAT = 5083 + SYS_LINK = 5084 + SYS_UNLINK = 5085 + SYS_SYMLINK = 5086 + SYS_READLINK = 5087 + SYS_CHMOD = 5088 + SYS_FCHMOD = 5089 + SYS_CHOWN = 5090 + SYS_FCHOWN = 5091 + SYS_LCHOWN = 5092 + SYS_UMASK = 5093 + SYS_GETTIMEOFDAY = 5094 + SYS_GETRLIMIT = 5095 + SYS_GETRUSAGE = 5096 + SYS_SYSINFO = 5097 + SYS_TIMES = 5098 + SYS_PTRACE = 5099 + SYS_GETUID = 5100 + SYS_SYSLOG = 5101 + SYS_GETGID = 5102 + SYS_SETUID = 5103 + SYS_SETGID = 5104 + SYS_GETEUID = 5105 + SYS_GETEGID = 5106 + SYS_SETPGID = 5107 + SYS_GETPPID = 5108 + SYS_GETPGRP = 5109 + SYS_SETSID = 5110 + SYS_SETREUID = 5111 + SYS_SETREGID = 5112 + SYS_GETGROUPS = 5113 + SYS_SETGROUPS = 5114 + SYS_SETRESUID = 5115 + SYS_GETRESUID = 5116 + SYS_SETRESGID = 5117 + SYS_GETRESGID = 5118 + SYS_GETPGID = 5119 + SYS_SETFSUID = 5120 + SYS_SETFSGID = 5121 + SYS_GETSID = 5122 + SYS_CAPGET = 5123 + SYS_CAPSET = 5124 + SYS_RT_SIGPENDING = 5125 + SYS_RT_SIGTIMEDWAIT = 5126 + SYS_RT_SIGQUEUEINFO = 5127 + SYS_RT_SIGSUSPEND = 5128 + SYS_SIGALTSTACK = 5129 + SYS_UTIME = 5130 + SYS_MKNOD = 5131 + SYS_PERSONALITY = 5132 + SYS_USTAT = 5133 + SYS_STATFS = 5134 + SYS_FSTATFS = 5135 + SYS_SYSFS = 5136 + SYS_GETPRIORITY = 5137 + SYS_SETPRIORITY = 5138 + SYS_SCHED_SETPARAM = 5139 + SYS_SCHED_GETPARAM = 5140 + SYS_SCHED_SETSCHEDULER = 5141 + SYS_SCHED_GETSCHEDULER = 5142 + SYS_SCHED_GET_PRIORITY_MAX = 5143 + SYS_SCHED_GET_PRIORITY_MIN = 5144 + SYS_SCHED_RR_GET_INTERVAL = 5145 + SYS_MLOCK = 5146 + SYS_MUNLOCK = 5147 + SYS_MLOCKALL = 5148 + SYS_MUNLOCKALL = 5149 + SYS_VHANGUP = 5150 + SYS_PIVOT_ROOT = 5151 + SYS__SYSCTL = 5152 + SYS_PRCTL = 5153 + SYS_ADJTIMEX = 5154 + SYS_SETRLIMIT = 5155 + SYS_CHROOT = 5156 + SYS_SYNC = 5157 + SYS_ACCT = 5158 + SYS_SETTIMEOFDAY = 5159 + SYS_MOUNT = 5160 + SYS_UMOUNT2 = 5161 + SYS_SWAPON = 5162 + SYS_SWAPOFF = 5163 + SYS_REBOOT = 5164 + SYS_SETHOSTNAME = 5165 + SYS_SETDOMAINNAME = 5166 + SYS_CREATE_MODULE = 5167 + SYS_INIT_MODULE = 5168 + SYS_DELETE_MODULE = 5169 + SYS_GET_KERNEL_SYMS = 5170 + SYS_QUERY_MODULE = 5171 + SYS_QUOTACTL = 5172 + SYS_NFSSERVCTL = 5173 + SYS_GETPMSG = 5174 + SYS_PUTPMSG = 5175 + SYS_AFS_SYSCALL = 5176 + SYS_RESERVED177 = 5177 + SYS_GETTID = 5178 + SYS_READAHEAD = 5179 + SYS_SETXATTR = 5180 + SYS_LSETXATTR = 5181 + SYS_FSETXATTR = 5182 + SYS_GETXATTR = 5183 + SYS_LGETXATTR = 5184 + SYS_FGETXATTR = 5185 + SYS_LISTXATTR = 5186 + SYS_LLISTXATTR = 5187 + SYS_FLISTXATTR = 5188 + SYS_REMOVEXATTR = 5189 + SYS_LREMOVEXATTR = 5190 + SYS_FREMOVEXATTR = 5191 + SYS_TKILL = 5192 + SYS_RESERVED193 = 5193 + SYS_FUTEX = 5194 + SYS_SCHED_SETAFFINITY = 5195 + SYS_SCHED_GETAFFINITY = 5196 + SYS_CACHEFLUSH = 5197 + SYS_CACHECTL = 5198 + SYS_SYSMIPS = 5199 + SYS_IO_SETUP = 5200 + SYS_IO_DESTROY = 5201 + SYS_IO_GETEVENTS = 5202 + SYS_IO_SUBMIT = 5203 + SYS_IO_CANCEL = 5204 + SYS_EXIT_GROUP = 5205 + SYS_LOOKUP_DCOOKIE = 5206 + SYS_EPOLL_CREATE = 5207 + SYS_EPOLL_CTL = 5208 + SYS_EPOLL_WAIT = 5209 + SYS_REMAP_FILE_PAGES = 5210 + SYS_RT_SIGRETURN = 5211 + SYS_SET_TID_ADDRESS = 5212 + SYS_RESTART_SYSCALL = 5213 + SYS_SEMTIMEDOP = 5214 + SYS_FADVISE64 = 5215 + SYS_TIMER_CREATE = 5216 + SYS_TIMER_SETTIME = 5217 + SYS_TIMER_GETTIME = 5218 + SYS_TIMER_GETOVERRUN = 5219 + SYS_TIMER_DELETE = 5220 + SYS_CLOCK_SETTIME = 5221 + SYS_CLOCK_GETTIME = 5222 + SYS_CLOCK_GETRES = 5223 + SYS_CLOCK_NANOSLEEP = 5224 + SYS_TGKILL = 5225 + SYS_UTIMES = 5226 + SYS_MBIND = 5227 + SYS_GET_MEMPOLICY = 5228 + SYS_SET_MEMPOLICY = 5229 + SYS_MQ_OPEN = 5230 + SYS_MQ_UNLINK = 5231 + SYS_MQ_TIMEDSEND = 5232 + SYS_MQ_TIMEDRECEIVE = 5233 + SYS_MQ_NOTIFY = 5234 + SYS_MQ_GETSETATTR = 5235 + SYS_VSERVER = 5236 + SYS_WAITID = 5237 + SYS_ADD_KEY = 5239 + SYS_REQUEST_KEY = 5240 + SYS_KEYCTL = 5241 + SYS_SET_THREAD_AREA = 5242 + SYS_INOTIFY_INIT = 5243 + SYS_INOTIFY_ADD_WATCH = 5244 + SYS_INOTIFY_RM_WATCH = 5245 + SYS_MIGRATE_PAGES = 5246 + SYS_OPENAT = 5247 + SYS_MKDIRAT = 5248 + SYS_MKNODAT = 5249 + SYS_FCHOWNAT = 5250 + SYS_FUTIMESAT = 5251 + SYS_NEWFSTATAT = 5252 + SYS_UNLINKAT = 5253 + SYS_RENAMEAT = 5254 + SYS_LINKAT = 5255 + SYS_SYMLINKAT = 5256 + SYS_READLINKAT = 5257 + SYS_FCHMODAT = 5258 + SYS_FACCESSAT = 5259 + SYS_PSELECT6 = 5260 + SYS_PPOLL = 5261 + SYS_UNSHARE = 5262 + SYS_SPLICE = 5263 + SYS_SYNC_FILE_RANGE = 5264 + SYS_TEE = 5265 + SYS_VMSPLICE = 5266 + SYS_MOVE_PAGES = 5267 + SYS_SET_ROBUST_LIST = 5268 + SYS_GET_ROBUST_LIST = 5269 + SYS_KEXEC_LOAD = 5270 + SYS_GETCPU = 5271 + SYS_EPOLL_PWAIT = 5272 + SYS_IOPRIO_SET = 5273 + SYS_IOPRIO_GET = 5274 + SYS_UTIMENSAT = 5275 + SYS_SIGNALFD = 5276 + SYS_TIMERFD = 5277 + SYS_EVENTFD = 5278 + SYS_FALLOCATE = 5279 + SYS_TIMERFD_CREATE = 5280 + SYS_TIMERFD_GETTIME = 5281 + SYS_TIMERFD_SETTIME = 5282 + SYS_SIGNALFD4 = 5283 + SYS_EVENTFD2 = 5284 + SYS_EPOLL_CREATE1 = 5285 + SYS_DUP3 = 5286 + SYS_PIPE2 = 5287 + SYS_INOTIFY_INIT1 = 5288 + SYS_PREADV = 5289 + SYS_PWRITEV = 5290 + SYS_RT_TGSIGQUEUEINFO = 5291 + SYS_PERF_EVENT_OPEN = 5292 + SYS_ACCEPT4 = 5293 + SYS_RECVMMSG = 5294 + SYS_FANOTIFY_INIT = 5295 + SYS_FANOTIFY_MARK = 5296 + SYS_PRLIMIT64 = 5297 + SYS_NAME_TO_HANDLE_AT = 5298 + SYS_OPEN_BY_HANDLE_AT = 5299 + SYS_CLOCK_ADJTIME = 5300 + SYS_SYNCFS = 5301 + SYS_SENDMMSG = 5302 + SYS_SETNS = 5303 + SYS_PROCESS_VM_READV = 5304 + SYS_PROCESS_VM_WRITEV = 5305 + SYS_KCMP = 5306 + SYS_FINIT_MODULE = 5307 + SYS_GETDENTS64 = 5308 + SYS_SCHED_SETATTR = 5309 + SYS_SCHED_GETATTR = 5310 + SYS_RENAMEAT2 = 5311 + SYS_SECCOMP = 5312 + SYS_GETRANDOM = 5313 + SYS_MEMFD_CREATE = 5314 + SYS_BPF = 5315 + SYS_EXECVEAT = 5316 + SYS_USERFAULTFD = 5317 + SYS_MEMBARRIER = 5318 + SYS_MLOCK2 = 5319 + SYS_COPY_FILE_RANGE = 5320 + SYS_PREADV2 = 5321 + SYS_PWRITEV2 = 5322 + SYS_PKEY_MPROTECT = 5323 + SYS_PKEY_ALLOC = 5324 + SYS_PKEY_FREE = 5325 + SYS_STATX = 5326 + SYS_RSEQ = 5327 + SYS_IO_PGETEVENTS = 5328 +) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go new file mode 100644 index 00000000..93980be1 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go @@ -0,0 +1,337 @@ +// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build mips64le,linux + +package unix + +const ( + SYS_READ = 5000 + SYS_WRITE = 5001 + SYS_OPEN = 5002 + SYS_CLOSE = 5003 + SYS_STAT = 5004 + SYS_FSTAT = 5005 + SYS_LSTAT = 5006 + SYS_POLL = 5007 + SYS_LSEEK = 5008 + SYS_MMAP = 5009 + SYS_MPROTECT = 5010 + SYS_MUNMAP = 5011 + SYS_BRK = 5012 + SYS_RT_SIGACTION = 5013 + SYS_RT_SIGPROCMASK = 5014 + SYS_IOCTL = 5015 + SYS_PREAD64 = 5016 + SYS_PWRITE64 = 5017 + SYS_READV = 5018 + SYS_WRITEV = 5019 + SYS_ACCESS = 5020 + SYS_PIPE = 5021 + SYS__NEWSELECT = 5022 + SYS_SCHED_YIELD = 5023 + SYS_MREMAP = 5024 + SYS_MSYNC = 5025 + SYS_MINCORE = 5026 + SYS_MADVISE = 5027 + SYS_SHMGET = 5028 + SYS_SHMAT = 5029 + SYS_SHMCTL = 5030 + SYS_DUP = 5031 + SYS_DUP2 = 5032 + SYS_PAUSE = 5033 + SYS_NANOSLEEP = 5034 + SYS_GETITIMER = 5035 + SYS_SETITIMER = 5036 + SYS_ALARM = 5037 + SYS_GETPID = 5038 + SYS_SENDFILE = 5039 + SYS_SOCKET = 5040 + SYS_CONNECT = 5041 + SYS_ACCEPT = 5042 + SYS_SENDTO = 5043 + SYS_RECVFROM = 5044 + SYS_SENDMSG = 5045 + SYS_RECVMSG = 5046 + SYS_SHUTDOWN = 5047 + SYS_BIND = 5048 + SYS_LISTEN = 5049 + SYS_GETSOCKNAME = 5050 + SYS_GETPEERNAME = 5051 + SYS_SOCKETPAIR = 5052 + SYS_SETSOCKOPT = 5053 + SYS_GETSOCKOPT = 5054 + SYS_CLONE = 5055 + SYS_FORK = 5056 + SYS_EXECVE = 5057 + SYS_EXIT = 5058 + SYS_WAIT4 = 5059 + SYS_KILL = 5060 + SYS_UNAME = 5061 + SYS_SEMGET = 5062 + SYS_SEMOP = 5063 + SYS_SEMCTL = 5064 + SYS_SHMDT = 5065 + SYS_MSGGET = 5066 + SYS_MSGSND = 5067 + SYS_MSGRCV = 5068 + SYS_MSGCTL = 5069 + SYS_FCNTL = 5070 + SYS_FLOCK = 5071 + SYS_FSYNC = 5072 + SYS_FDATASYNC = 5073 + SYS_TRUNCATE = 5074 + SYS_FTRUNCATE = 5075 + SYS_GETDENTS = 5076 + SYS_GETCWD = 5077 + SYS_CHDIR = 5078 + SYS_FCHDIR = 5079 + SYS_RENAME = 5080 + SYS_MKDIR = 5081 + SYS_RMDIR = 5082 + SYS_CREAT = 5083 + SYS_LINK = 5084 + SYS_UNLINK = 5085 + SYS_SYMLINK = 5086 + SYS_READLINK = 5087 + SYS_CHMOD = 5088 + SYS_FCHMOD = 5089 + SYS_CHOWN = 5090 + SYS_FCHOWN = 5091 + SYS_LCHOWN = 5092 + SYS_UMASK = 5093 + SYS_GETTIMEOFDAY = 5094 + SYS_GETRLIMIT = 5095 + SYS_GETRUSAGE = 5096 + SYS_SYSINFO = 5097 + SYS_TIMES = 5098 + SYS_PTRACE = 5099 + SYS_GETUID = 5100 + SYS_SYSLOG = 5101 + SYS_GETGID = 5102 + SYS_SETUID = 5103 + SYS_SETGID = 5104 + SYS_GETEUID = 5105 + SYS_GETEGID = 5106 + SYS_SETPGID = 5107 + SYS_GETPPID = 5108 + SYS_GETPGRP = 5109 + SYS_SETSID = 5110 + SYS_SETREUID = 5111 + SYS_SETREGID = 5112 + SYS_GETGROUPS = 5113 + SYS_SETGROUPS = 5114 + SYS_SETRESUID = 5115 + SYS_GETRESUID = 5116 + SYS_SETRESGID = 5117 + SYS_GETRESGID = 5118 + SYS_GETPGID = 5119 + SYS_SETFSUID = 5120 + SYS_SETFSGID = 5121 + SYS_GETSID = 5122 + SYS_CAPGET = 5123 + SYS_CAPSET = 5124 + SYS_RT_SIGPENDING = 5125 + SYS_RT_SIGTIMEDWAIT = 5126 + SYS_RT_SIGQUEUEINFO = 5127 + SYS_RT_SIGSUSPEND = 5128 + SYS_SIGALTSTACK = 5129 + SYS_UTIME = 5130 + SYS_MKNOD = 5131 + SYS_PERSONALITY = 5132 + SYS_USTAT = 5133 + SYS_STATFS = 5134 + SYS_FSTATFS = 5135 + SYS_SYSFS = 5136 + SYS_GETPRIORITY = 5137 + SYS_SETPRIORITY = 5138 + SYS_SCHED_SETPARAM = 5139 + SYS_SCHED_GETPARAM = 5140 + SYS_SCHED_SETSCHEDULER = 5141 + SYS_SCHED_GETSCHEDULER = 5142 + SYS_SCHED_GET_PRIORITY_MAX = 5143 + SYS_SCHED_GET_PRIORITY_MIN = 5144 + SYS_SCHED_RR_GET_INTERVAL = 5145 + SYS_MLOCK = 5146 + SYS_MUNLOCK = 5147 + SYS_MLOCKALL = 5148 + SYS_MUNLOCKALL = 5149 + SYS_VHANGUP = 5150 + SYS_PIVOT_ROOT = 5151 + SYS__SYSCTL = 5152 + SYS_PRCTL = 5153 + SYS_ADJTIMEX = 5154 + SYS_SETRLIMIT = 5155 + SYS_CHROOT = 5156 + SYS_SYNC = 5157 + SYS_ACCT = 5158 + SYS_SETTIMEOFDAY = 5159 + SYS_MOUNT = 5160 + SYS_UMOUNT2 = 5161 + SYS_SWAPON = 5162 + SYS_SWAPOFF = 5163 + SYS_REBOOT = 5164 + SYS_SETHOSTNAME = 5165 + SYS_SETDOMAINNAME = 5166 + SYS_CREATE_MODULE = 5167 + SYS_INIT_MODULE = 5168 + SYS_DELETE_MODULE = 5169 + SYS_GET_KERNEL_SYMS = 5170 + SYS_QUERY_MODULE = 5171 + SYS_QUOTACTL = 5172 + SYS_NFSSERVCTL = 5173 + SYS_GETPMSG = 5174 + SYS_PUTPMSG = 5175 + SYS_AFS_SYSCALL = 5176 + SYS_RESERVED177 = 5177 + SYS_GETTID = 5178 + SYS_READAHEAD = 5179 + SYS_SETXATTR = 5180 + SYS_LSETXATTR = 5181 + SYS_FSETXATTR = 5182 + SYS_GETXATTR = 5183 + SYS_LGETXATTR = 5184 + SYS_FGETXATTR = 5185 + SYS_LISTXATTR = 5186 + SYS_LLISTXATTR = 5187 + SYS_FLISTXATTR = 5188 + SYS_REMOVEXATTR = 5189 + SYS_LREMOVEXATTR = 5190 + SYS_FREMOVEXATTR = 5191 + SYS_TKILL = 5192 + SYS_RESERVED193 = 5193 + SYS_FUTEX = 5194 + SYS_SCHED_SETAFFINITY = 5195 + SYS_SCHED_GETAFFINITY = 5196 + SYS_CACHEFLUSH = 5197 + SYS_CACHECTL = 5198 + SYS_SYSMIPS = 5199 + SYS_IO_SETUP = 5200 + SYS_IO_DESTROY = 5201 + SYS_IO_GETEVENTS = 5202 + SYS_IO_SUBMIT = 5203 + SYS_IO_CANCEL = 5204 + SYS_EXIT_GROUP = 5205 + SYS_LOOKUP_DCOOKIE = 5206 + SYS_EPOLL_CREATE = 5207 + SYS_EPOLL_CTL = 5208 + SYS_EPOLL_WAIT = 5209 + SYS_REMAP_FILE_PAGES = 5210 + SYS_RT_SIGRETURN = 5211 + SYS_SET_TID_ADDRESS = 5212 + SYS_RESTART_SYSCALL = 5213 + SYS_SEMTIMEDOP = 5214 + SYS_FADVISE64 = 5215 + SYS_TIMER_CREATE = 5216 + SYS_TIMER_SETTIME = 5217 + SYS_TIMER_GETTIME = 5218 + SYS_TIMER_GETOVERRUN = 5219 + SYS_TIMER_DELETE = 5220 + SYS_CLOCK_SETTIME = 5221 + SYS_CLOCK_GETTIME = 5222 + SYS_CLOCK_GETRES = 5223 + SYS_CLOCK_NANOSLEEP = 5224 + SYS_TGKILL = 5225 + SYS_UTIMES = 5226 + SYS_MBIND = 5227 + SYS_GET_MEMPOLICY = 5228 + SYS_SET_MEMPOLICY = 5229 + SYS_MQ_OPEN = 5230 + SYS_MQ_UNLINK = 5231 + SYS_MQ_TIMEDSEND = 5232 + SYS_MQ_TIMEDRECEIVE = 5233 + SYS_MQ_NOTIFY = 5234 + SYS_MQ_GETSETATTR = 5235 + SYS_VSERVER = 5236 + SYS_WAITID = 5237 + SYS_ADD_KEY = 5239 + SYS_REQUEST_KEY = 5240 + SYS_KEYCTL = 5241 + SYS_SET_THREAD_AREA = 5242 + SYS_INOTIFY_INIT = 5243 + SYS_INOTIFY_ADD_WATCH = 5244 + SYS_INOTIFY_RM_WATCH = 5245 + SYS_MIGRATE_PAGES = 5246 + SYS_OPENAT = 5247 + SYS_MKDIRAT = 5248 + SYS_MKNODAT = 5249 + SYS_FCHOWNAT = 5250 + SYS_FUTIMESAT = 5251 + SYS_NEWFSTATAT = 5252 + SYS_UNLINKAT = 5253 + SYS_RENAMEAT = 5254 + SYS_LINKAT = 5255 + SYS_SYMLINKAT = 5256 + SYS_READLINKAT = 5257 + SYS_FCHMODAT = 5258 + SYS_FACCESSAT = 5259 + SYS_PSELECT6 = 5260 + SYS_PPOLL = 5261 + SYS_UNSHARE = 5262 + SYS_SPLICE = 5263 + SYS_SYNC_FILE_RANGE = 5264 + SYS_TEE = 5265 + SYS_VMSPLICE = 5266 + SYS_MOVE_PAGES = 5267 + SYS_SET_ROBUST_LIST = 5268 + SYS_GET_ROBUST_LIST = 5269 + SYS_KEXEC_LOAD = 5270 + SYS_GETCPU = 5271 + SYS_EPOLL_PWAIT = 5272 + SYS_IOPRIO_SET = 5273 + SYS_IOPRIO_GET = 5274 + SYS_UTIMENSAT = 5275 + SYS_SIGNALFD = 5276 + SYS_TIMERFD = 5277 + SYS_EVENTFD = 5278 + SYS_FALLOCATE = 5279 + SYS_TIMERFD_CREATE = 5280 + SYS_TIMERFD_GETTIME = 5281 + SYS_TIMERFD_SETTIME = 5282 + SYS_SIGNALFD4 = 5283 + SYS_EVENTFD2 = 5284 + SYS_EPOLL_CREATE1 = 5285 + SYS_DUP3 = 5286 + SYS_PIPE2 = 5287 + SYS_INOTIFY_INIT1 = 5288 + SYS_PREADV = 5289 + SYS_PWRITEV = 5290 + SYS_RT_TGSIGQUEUEINFO = 5291 + SYS_PERF_EVENT_OPEN = 5292 + SYS_ACCEPT4 = 5293 + SYS_RECVMMSG = 5294 + SYS_FANOTIFY_INIT = 5295 + SYS_FANOTIFY_MARK = 5296 + SYS_PRLIMIT64 = 5297 + SYS_NAME_TO_HANDLE_AT = 5298 + SYS_OPEN_BY_HANDLE_AT = 5299 + SYS_CLOCK_ADJTIME = 5300 + SYS_SYNCFS = 5301 + SYS_SENDMMSG = 5302 + SYS_SETNS = 5303 + SYS_PROCESS_VM_READV = 5304 + SYS_PROCESS_VM_WRITEV = 5305 + SYS_KCMP = 5306 + SYS_FINIT_MODULE = 5307 + SYS_GETDENTS64 = 5308 + SYS_SCHED_SETATTR = 5309 + SYS_SCHED_GETATTR = 5310 + SYS_RENAMEAT2 = 5311 + SYS_SECCOMP = 5312 + SYS_GETRANDOM = 5313 + SYS_MEMFD_CREATE = 5314 + SYS_BPF = 5315 + SYS_EXECVEAT = 5316 + SYS_USERFAULTFD = 5317 + SYS_MEMBARRIER = 5318 + SYS_MLOCK2 = 5319 + SYS_COPY_FILE_RANGE = 5320 + SYS_PREADV2 = 5321 + SYS_PWRITEV2 = 5322 + SYS_PKEY_MPROTECT = 5323 + SYS_PKEY_ALLOC = 5324 + SYS_PKEY_FREE = 5325 + SYS_STATX = 5326 + SYS_RSEQ = 5327 + SYS_IO_PGETEVENTS = 5328 +) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go new file mode 100644 index 00000000..0fc77261 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go @@ -0,0 +1,377 @@ +// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build mipsle,linux + +package unix + +const ( + SYS_SYSCALL = 4000 + SYS_EXIT = 4001 + SYS_FORK = 4002 + SYS_READ = 4003 + SYS_WRITE = 4004 + SYS_OPEN = 4005 + SYS_CLOSE = 4006 + SYS_WAITPID = 4007 + SYS_CREAT = 4008 + SYS_LINK = 4009 + SYS_UNLINK = 4010 + SYS_EXECVE = 4011 + SYS_CHDIR = 4012 + SYS_TIME = 4013 + SYS_MKNOD = 4014 + SYS_CHMOD = 4015 + SYS_LCHOWN = 4016 + SYS_BREAK = 4017 + SYS_UNUSED18 = 4018 + SYS_LSEEK = 4019 + SYS_GETPID = 4020 + SYS_MOUNT = 4021 + SYS_UMOUNT = 4022 + SYS_SETUID = 4023 + SYS_GETUID = 4024 + SYS_STIME = 4025 + SYS_PTRACE = 4026 + SYS_ALARM = 4027 + SYS_UNUSED28 = 4028 + SYS_PAUSE = 4029 + SYS_UTIME = 4030 + SYS_STTY = 4031 + SYS_GTTY = 4032 + SYS_ACCESS = 4033 + SYS_NICE = 4034 + SYS_FTIME = 4035 + SYS_SYNC = 4036 + SYS_KILL = 4037 + SYS_RENAME = 4038 + SYS_MKDIR = 4039 + SYS_RMDIR = 4040 + SYS_DUP = 4041 + SYS_PIPE = 4042 + SYS_TIMES = 4043 + SYS_PROF = 4044 + SYS_BRK = 4045 + SYS_SETGID = 4046 + SYS_GETGID = 4047 + SYS_SIGNAL = 4048 + SYS_GETEUID = 4049 + SYS_GETEGID = 4050 + SYS_ACCT = 4051 + SYS_UMOUNT2 = 4052 + SYS_LOCK = 4053 + SYS_IOCTL = 4054 + SYS_FCNTL = 4055 + SYS_MPX = 4056 + SYS_SETPGID = 4057 + SYS_ULIMIT = 4058 + SYS_UNUSED59 = 4059 + SYS_UMASK = 4060 + SYS_CHROOT = 4061 + SYS_USTAT = 4062 + SYS_DUP2 = 4063 + SYS_GETPPID = 4064 + SYS_GETPGRP = 4065 + SYS_SETSID = 4066 + SYS_SIGACTION = 4067 + SYS_SGETMASK = 4068 + SYS_SSETMASK = 4069 + SYS_SETREUID = 4070 + SYS_SETREGID = 4071 + SYS_SIGSUSPEND = 4072 + SYS_SIGPENDING = 4073 + SYS_SETHOSTNAME = 4074 + SYS_SETRLIMIT = 4075 + SYS_GETRLIMIT = 4076 + SYS_GETRUSAGE = 4077 + SYS_GETTIMEOFDAY = 4078 + SYS_SETTIMEOFDAY = 4079 + SYS_GETGROUPS = 4080 + SYS_SETGROUPS = 4081 + SYS_RESERVED82 = 4082 + SYS_SYMLINK = 4083 + SYS_UNUSED84 = 4084 + SYS_READLINK = 4085 + SYS_USELIB = 4086 + SYS_SWAPON = 4087 + SYS_REBOOT = 4088 + SYS_READDIR = 4089 + SYS_MMAP = 4090 + SYS_MUNMAP = 4091 + SYS_TRUNCATE = 4092 + SYS_FTRUNCATE = 4093 + SYS_FCHMOD = 4094 + SYS_FCHOWN = 4095 + SYS_GETPRIORITY = 4096 + SYS_SETPRIORITY = 4097 + SYS_PROFIL = 4098 + SYS_STATFS = 4099 + SYS_FSTATFS = 4100 + SYS_IOPERM = 4101 + SYS_SOCKETCALL = 4102 + SYS_SYSLOG = 4103 + SYS_SETITIMER = 4104 + SYS_GETITIMER = 4105 + SYS_STAT = 4106 + SYS_LSTAT = 4107 + SYS_FSTAT = 4108 + SYS_UNUSED109 = 4109 + SYS_IOPL = 4110 + SYS_VHANGUP = 4111 + SYS_IDLE = 4112 + SYS_VM86 = 4113 + SYS_WAIT4 = 4114 + SYS_SWAPOFF = 4115 + SYS_SYSINFO = 4116 + SYS_IPC = 4117 + SYS_FSYNC = 4118 + SYS_SIGRETURN = 4119 + SYS_CLONE = 4120 + SYS_SETDOMAINNAME = 4121 + SYS_UNAME = 4122 + SYS_MODIFY_LDT = 4123 + SYS_ADJTIMEX = 4124 + SYS_MPROTECT = 4125 + SYS_SIGPROCMASK = 4126 + SYS_CREATE_MODULE = 4127 + SYS_INIT_MODULE = 4128 + SYS_DELETE_MODULE = 4129 + SYS_GET_KERNEL_SYMS = 4130 + SYS_QUOTACTL = 4131 + SYS_GETPGID = 4132 + SYS_FCHDIR = 4133 + SYS_BDFLUSH = 4134 + SYS_SYSFS = 4135 + SYS_PERSONALITY = 4136 + SYS_AFS_SYSCALL = 4137 + SYS_SETFSUID = 4138 + SYS_SETFSGID = 4139 + SYS__LLSEEK = 4140 + SYS_GETDENTS = 4141 + SYS__NEWSELECT = 4142 + SYS_FLOCK = 4143 + SYS_MSYNC = 4144 + SYS_READV = 4145 + SYS_WRITEV = 4146 + SYS_CACHEFLUSH = 4147 + SYS_CACHECTL = 4148 + SYS_SYSMIPS = 4149 + SYS_UNUSED150 = 4150 + SYS_GETSID = 4151 + SYS_FDATASYNC = 4152 + SYS__SYSCTL = 4153 + SYS_MLOCK = 4154 + SYS_MUNLOCK = 4155 + SYS_MLOCKALL = 4156 + SYS_MUNLOCKALL = 4157 + SYS_SCHED_SETPARAM = 4158 + SYS_SCHED_GETPARAM = 4159 + SYS_SCHED_SETSCHEDULER = 4160 + SYS_SCHED_GETSCHEDULER = 4161 + SYS_SCHED_YIELD = 4162 + SYS_SCHED_GET_PRIORITY_MAX = 4163 + SYS_SCHED_GET_PRIORITY_MIN = 4164 + SYS_SCHED_RR_GET_INTERVAL = 4165 + SYS_NANOSLEEP = 4166 + SYS_MREMAP = 4167 + SYS_ACCEPT = 4168 + SYS_BIND = 4169 + SYS_CONNECT = 4170 + SYS_GETPEERNAME = 4171 + SYS_GETSOCKNAME = 4172 + SYS_GETSOCKOPT = 4173 + SYS_LISTEN = 4174 + SYS_RECV = 4175 + SYS_RECVFROM = 4176 + SYS_RECVMSG = 4177 + SYS_SEND = 4178 + SYS_SENDMSG = 4179 + SYS_SENDTO = 4180 + SYS_SETSOCKOPT = 4181 + SYS_SHUTDOWN = 4182 + SYS_SOCKET = 4183 + SYS_SOCKETPAIR = 4184 + SYS_SETRESUID = 4185 + SYS_GETRESUID = 4186 + SYS_QUERY_MODULE = 4187 + SYS_POLL = 4188 + SYS_NFSSERVCTL = 4189 + SYS_SETRESGID = 4190 + SYS_GETRESGID = 4191 + SYS_PRCTL = 4192 + SYS_RT_SIGRETURN = 4193 + SYS_RT_SIGACTION = 4194 + SYS_RT_SIGPROCMASK = 4195 + SYS_RT_SIGPENDING = 4196 + SYS_RT_SIGTIMEDWAIT = 4197 + SYS_RT_SIGQUEUEINFO = 4198 + SYS_RT_SIGSUSPEND = 4199 + SYS_PREAD64 = 4200 + SYS_PWRITE64 = 4201 + SYS_CHOWN = 4202 + SYS_GETCWD = 4203 + SYS_CAPGET = 4204 + SYS_CAPSET = 4205 + SYS_SIGALTSTACK = 4206 + SYS_SENDFILE = 4207 + SYS_GETPMSG = 4208 + SYS_PUTPMSG = 4209 + SYS_MMAP2 = 4210 + SYS_TRUNCATE64 = 4211 + SYS_FTRUNCATE64 = 4212 + SYS_STAT64 = 4213 + SYS_LSTAT64 = 4214 + SYS_FSTAT64 = 4215 + SYS_PIVOT_ROOT = 4216 + SYS_MINCORE = 4217 + SYS_MADVISE = 4218 + SYS_GETDENTS64 = 4219 + SYS_FCNTL64 = 4220 + SYS_RESERVED221 = 4221 + SYS_GETTID = 4222 + SYS_READAHEAD = 4223 + SYS_SETXATTR = 4224 + SYS_LSETXATTR = 4225 + SYS_FSETXATTR = 4226 + SYS_GETXATTR = 4227 + SYS_LGETXATTR = 4228 + SYS_FGETXATTR = 4229 + SYS_LISTXATTR = 4230 + SYS_LLISTXATTR = 4231 + SYS_FLISTXATTR = 4232 + SYS_REMOVEXATTR = 4233 + SYS_LREMOVEXATTR = 4234 + SYS_FREMOVEXATTR = 4235 + SYS_TKILL = 4236 + SYS_SENDFILE64 = 4237 + SYS_FUTEX = 4238 + SYS_SCHED_SETAFFINITY = 4239 + SYS_SCHED_GETAFFINITY = 4240 + SYS_IO_SETUP = 4241 + SYS_IO_DESTROY = 4242 + SYS_IO_GETEVENTS = 4243 + SYS_IO_SUBMIT = 4244 + SYS_IO_CANCEL = 4245 + SYS_EXIT_GROUP = 4246 + SYS_LOOKUP_DCOOKIE = 4247 + SYS_EPOLL_CREATE = 4248 + SYS_EPOLL_CTL = 4249 + SYS_EPOLL_WAIT = 4250 + SYS_REMAP_FILE_PAGES = 4251 + SYS_SET_TID_ADDRESS = 4252 + SYS_RESTART_SYSCALL = 4253 + SYS_FADVISE64 = 4254 + SYS_STATFS64 = 4255 + SYS_FSTATFS64 = 4256 + SYS_TIMER_CREATE = 4257 + SYS_TIMER_SETTIME = 4258 + SYS_TIMER_GETTIME = 4259 + SYS_TIMER_GETOVERRUN = 4260 + SYS_TIMER_DELETE = 4261 + SYS_CLOCK_SETTIME = 4262 + SYS_CLOCK_GETTIME = 4263 + SYS_CLOCK_GETRES = 4264 + SYS_CLOCK_NANOSLEEP = 4265 + SYS_TGKILL = 4266 + SYS_UTIMES = 4267 + SYS_MBIND = 4268 + SYS_GET_MEMPOLICY = 4269 + SYS_SET_MEMPOLICY = 4270 + SYS_MQ_OPEN = 4271 + SYS_MQ_UNLINK = 4272 + SYS_MQ_TIMEDSEND = 4273 + SYS_MQ_TIMEDRECEIVE = 4274 + SYS_MQ_NOTIFY = 4275 + SYS_MQ_GETSETATTR = 4276 + SYS_VSERVER = 4277 + SYS_WAITID = 4278 + SYS_ADD_KEY = 4280 + SYS_REQUEST_KEY = 4281 + SYS_KEYCTL = 4282 + SYS_SET_THREAD_AREA = 4283 + SYS_INOTIFY_INIT = 4284 + SYS_INOTIFY_ADD_WATCH = 4285 + SYS_INOTIFY_RM_WATCH = 4286 + SYS_MIGRATE_PAGES = 4287 + SYS_OPENAT = 4288 + SYS_MKDIRAT = 4289 + SYS_MKNODAT = 4290 + SYS_FCHOWNAT = 4291 + SYS_FUTIMESAT = 4292 + SYS_FSTATAT64 = 4293 + SYS_UNLINKAT = 4294 + SYS_RENAMEAT = 4295 + SYS_LINKAT = 4296 + SYS_SYMLINKAT = 4297 + SYS_READLINKAT = 4298 + SYS_FCHMODAT = 4299 + SYS_FACCESSAT = 4300 + SYS_PSELECT6 = 4301 + SYS_PPOLL = 4302 + SYS_UNSHARE = 4303 + SYS_SPLICE = 4304 + SYS_SYNC_FILE_RANGE = 4305 + SYS_TEE = 4306 + SYS_VMSPLICE = 4307 + SYS_MOVE_PAGES = 4308 + SYS_SET_ROBUST_LIST = 4309 + SYS_GET_ROBUST_LIST = 4310 + SYS_KEXEC_LOAD = 4311 + SYS_GETCPU = 4312 + SYS_EPOLL_PWAIT = 4313 + SYS_IOPRIO_SET = 4314 + SYS_IOPRIO_GET = 4315 + SYS_UTIMENSAT = 4316 + SYS_SIGNALFD = 4317 + SYS_TIMERFD = 4318 + SYS_EVENTFD = 4319 + SYS_FALLOCATE = 4320 + SYS_TIMERFD_CREATE = 4321 + SYS_TIMERFD_GETTIME = 4322 + SYS_TIMERFD_SETTIME = 4323 + SYS_SIGNALFD4 = 4324 + SYS_EVENTFD2 = 4325 + SYS_EPOLL_CREATE1 = 4326 + SYS_DUP3 = 4327 + SYS_PIPE2 = 4328 + SYS_INOTIFY_INIT1 = 4329 + SYS_PREADV = 4330 + SYS_PWRITEV = 4331 + SYS_RT_TGSIGQUEUEINFO = 4332 + SYS_PERF_EVENT_OPEN = 4333 + SYS_ACCEPT4 = 4334 + SYS_RECVMMSG = 4335 + SYS_FANOTIFY_INIT = 4336 + SYS_FANOTIFY_MARK = 4337 + SYS_PRLIMIT64 = 4338 + SYS_NAME_TO_HANDLE_AT = 4339 + SYS_OPEN_BY_HANDLE_AT = 4340 + SYS_CLOCK_ADJTIME = 4341 + SYS_SYNCFS = 4342 + SYS_SENDMMSG = 4343 + SYS_SETNS = 4344 + SYS_PROCESS_VM_READV = 4345 + SYS_PROCESS_VM_WRITEV = 4346 + SYS_KCMP = 4347 + SYS_FINIT_MODULE = 4348 + SYS_SCHED_SETATTR = 4349 + SYS_SCHED_GETATTR = 4350 + SYS_RENAMEAT2 = 4351 + SYS_SECCOMP = 4352 + SYS_GETRANDOM = 4353 + SYS_MEMFD_CREATE = 4354 + SYS_BPF = 4355 + SYS_EXECVEAT = 4356 + SYS_USERFAULTFD = 4357 + SYS_MEMBARRIER = 4358 + SYS_MLOCK2 = 4359 + SYS_COPY_FILE_RANGE = 4360 + SYS_PREADV2 = 4361 + SYS_PWRITEV2 = 4362 + SYS_PKEY_MPROTECT = 4363 + SYS_PKEY_ALLOC = 4364 + SYS_PKEY_FREE = 4365 + SYS_STATX = 4366 + SYS_RSEQ = 4367 + SYS_IO_PGETEVENTS = 4368 +) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go new file mode 100644 index 00000000..a5c5f3de --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go @@ -0,0 +1,375 @@ +// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build ppc64,linux + +package unix + +const ( + SYS_RESTART_SYSCALL = 0 + SYS_EXIT = 1 + SYS_FORK = 2 + SYS_READ = 3 + SYS_WRITE = 4 + SYS_OPEN = 5 + SYS_CLOSE = 6 + SYS_WAITPID = 7 + SYS_CREAT = 8 + SYS_LINK = 9 + SYS_UNLINK = 10 + SYS_EXECVE = 11 + SYS_CHDIR = 12 + SYS_TIME = 13 + SYS_MKNOD = 14 + SYS_CHMOD = 15 + SYS_LCHOWN = 16 + SYS_BREAK = 17 + SYS_OLDSTAT = 18 + SYS_LSEEK = 19 + SYS_GETPID = 20 + SYS_MOUNT = 21 + SYS_UMOUNT = 22 + SYS_SETUID = 23 + SYS_GETUID = 24 + SYS_STIME = 25 + SYS_PTRACE = 26 + SYS_ALARM = 27 + SYS_OLDFSTAT = 28 + SYS_PAUSE = 29 + SYS_UTIME = 30 + SYS_STTY = 31 + SYS_GTTY = 32 + SYS_ACCESS = 33 + SYS_NICE = 34 + SYS_FTIME = 35 + SYS_SYNC = 36 + SYS_KILL = 37 + SYS_RENAME = 38 + SYS_MKDIR = 39 + SYS_RMDIR = 40 + SYS_DUP = 41 + SYS_PIPE = 42 + SYS_TIMES = 43 + SYS_PROF = 44 + SYS_BRK = 45 + SYS_SETGID = 46 + SYS_GETGID = 47 + SYS_SIGNAL = 48 + SYS_GETEUID = 49 + SYS_GETEGID = 50 + SYS_ACCT = 51 + SYS_UMOUNT2 = 52 + SYS_LOCK = 53 + SYS_IOCTL = 54 + SYS_FCNTL = 55 + SYS_MPX = 56 + SYS_SETPGID = 57 + SYS_ULIMIT = 58 + SYS_OLDOLDUNAME = 59 + SYS_UMASK = 60 + SYS_CHROOT = 61 + SYS_USTAT = 62 + SYS_DUP2 = 63 + SYS_GETPPID = 64 + SYS_GETPGRP = 65 + SYS_SETSID = 66 + SYS_SIGACTION = 67 + SYS_SGETMASK = 68 + SYS_SSETMASK = 69 + SYS_SETREUID = 70 + SYS_SETREGID = 71 + SYS_SIGSUSPEND = 72 + SYS_SIGPENDING = 73 + SYS_SETHOSTNAME = 74 + SYS_SETRLIMIT = 75 + SYS_GETRLIMIT = 76 + SYS_GETRUSAGE = 77 + SYS_GETTIMEOFDAY = 78 + SYS_SETTIMEOFDAY = 79 + SYS_GETGROUPS = 80 + SYS_SETGROUPS = 81 + SYS_SELECT = 82 + SYS_SYMLINK = 83 + SYS_OLDLSTAT = 84 + SYS_READLINK = 85 + SYS_USELIB = 86 + SYS_SWAPON = 87 + SYS_REBOOT = 88 + SYS_READDIR = 89 + SYS_MMAP = 90 + SYS_MUNMAP = 91 + SYS_TRUNCATE = 92 + SYS_FTRUNCATE = 93 + SYS_FCHMOD = 94 + SYS_FCHOWN = 95 + SYS_GETPRIORITY = 96 + SYS_SETPRIORITY = 97 + SYS_PROFIL = 98 + SYS_STATFS = 99 + SYS_FSTATFS = 100 + SYS_IOPERM = 101 + SYS_SOCKETCALL = 102 + SYS_SYSLOG = 103 + SYS_SETITIMER = 104 + SYS_GETITIMER = 105 + SYS_STAT = 106 + SYS_LSTAT = 107 + SYS_FSTAT = 108 + SYS_OLDUNAME = 109 + SYS_IOPL = 110 + SYS_VHANGUP = 111 + SYS_IDLE = 112 + SYS_VM86 = 113 + SYS_WAIT4 = 114 + SYS_SWAPOFF = 115 + SYS_SYSINFO = 116 + SYS_IPC = 117 + SYS_FSYNC = 118 + SYS_SIGRETURN = 119 + SYS_CLONE = 120 + SYS_SETDOMAINNAME = 121 + SYS_UNAME = 122 + SYS_MODIFY_LDT = 123 + SYS_ADJTIMEX = 124 + SYS_MPROTECT = 125 + SYS_SIGPROCMASK = 126 + SYS_CREATE_MODULE = 127 + SYS_INIT_MODULE = 128 + SYS_DELETE_MODULE = 129 + SYS_GET_KERNEL_SYMS = 130 + SYS_QUOTACTL = 131 + SYS_GETPGID = 132 + SYS_FCHDIR = 133 + SYS_BDFLUSH = 134 + SYS_SYSFS = 135 + SYS_PERSONALITY = 136 + SYS_AFS_SYSCALL = 137 + SYS_SETFSUID = 138 + SYS_SETFSGID = 139 + SYS__LLSEEK = 140 + SYS_GETDENTS = 141 + SYS__NEWSELECT = 142 + SYS_FLOCK = 143 + SYS_MSYNC = 144 + SYS_READV = 145 + SYS_WRITEV = 146 + SYS_GETSID = 147 + SYS_FDATASYNC = 148 + SYS__SYSCTL = 149 + SYS_MLOCK = 150 + SYS_MUNLOCK = 151 + SYS_MLOCKALL = 152 + SYS_MUNLOCKALL = 153 + SYS_SCHED_SETPARAM = 154 + SYS_SCHED_GETPARAM = 155 + SYS_SCHED_SETSCHEDULER = 156 + SYS_SCHED_GETSCHEDULER = 157 + SYS_SCHED_YIELD = 158 + SYS_SCHED_GET_PRIORITY_MAX = 159 + SYS_SCHED_GET_PRIORITY_MIN = 160 + SYS_SCHED_RR_GET_INTERVAL = 161 + SYS_NANOSLEEP = 162 + SYS_MREMAP = 163 + SYS_SETRESUID = 164 + SYS_GETRESUID = 165 + SYS_QUERY_MODULE = 166 + SYS_POLL = 167 + SYS_NFSSERVCTL = 168 + SYS_SETRESGID = 169 + SYS_GETRESGID = 170 + SYS_PRCTL = 171 + SYS_RT_SIGRETURN = 172 + SYS_RT_SIGACTION = 173 + SYS_RT_SIGPROCMASK = 174 + SYS_RT_SIGPENDING = 175 + SYS_RT_SIGTIMEDWAIT = 176 + SYS_RT_SIGQUEUEINFO = 177 + SYS_RT_SIGSUSPEND = 178 + SYS_PREAD64 = 179 + SYS_PWRITE64 = 180 + SYS_CHOWN = 181 + SYS_GETCWD = 182 + SYS_CAPGET = 183 + SYS_CAPSET = 184 + SYS_SIGALTSTACK = 185 + SYS_SENDFILE = 186 + SYS_GETPMSG = 187 + SYS_PUTPMSG = 188 + SYS_VFORK = 189 + SYS_UGETRLIMIT = 190 + SYS_READAHEAD = 191 + SYS_PCICONFIG_READ = 198 + SYS_PCICONFIG_WRITE = 199 + SYS_PCICONFIG_IOBASE = 200 + SYS_MULTIPLEXER = 201 + SYS_GETDENTS64 = 202 + SYS_PIVOT_ROOT = 203 + SYS_MADVISE = 205 + SYS_MINCORE = 206 + SYS_GETTID = 207 + SYS_TKILL = 208 + SYS_SETXATTR = 209 + SYS_LSETXATTR = 210 + SYS_FSETXATTR = 211 + SYS_GETXATTR = 212 + SYS_LGETXATTR = 213 + SYS_FGETXATTR = 214 + SYS_LISTXATTR = 215 + SYS_LLISTXATTR = 216 + SYS_FLISTXATTR = 217 + SYS_REMOVEXATTR = 218 + SYS_LREMOVEXATTR = 219 + SYS_FREMOVEXATTR = 220 + SYS_FUTEX = 221 + SYS_SCHED_SETAFFINITY = 222 + SYS_SCHED_GETAFFINITY = 223 + SYS_TUXCALL = 225 + SYS_IO_SETUP = 227 + SYS_IO_DESTROY = 228 + SYS_IO_GETEVENTS = 229 + SYS_IO_SUBMIT = 230 + SYS_IO_CANCEL = 231 + SYS_SET_TID_ADDRESS = 232 + SYS_FADVISE64 = 233 + SYS_EXIT_GROUP = 234 + SYS_LOOKUP_DCOOKIE = 235 + SYS_EPOLL_CREATE = 236 + SYS_EPOLL_CTL = 237 + SYS_EPOLL_WAIT = 238 + SYS_REMAP_FILE_PAGES = 239 + SYS_TIMER_CREATE = 240 + SYS_TIMER_SETTIME = 241 + SYS_TIMER_GETTIME = 242 + SYS_TIMER_GETOVERRUN = 243 + SYS_TIMER_DELETE = 244 + SYS_CLOCK_SETTIME = 245 + SYS_CLOCK_GETTIME = 246 + SYS_CLOCK_GETRES = 247 + SYS_CLOCK_NANOSLEEP = 248 + SYS_SWAPCONTEXT = 249 + SYS_TGKILL = 250 + SYS_UTIMES = 251 + SYS_STATFS64 = 252 + SYS_FSTATFS64 = 253 + SYS_RTAS = 255 + SYS_SYS_DEBUG_SETCONTEXT = 256 + SYS_MIGRATE_PAGES = 258 + SYS_MBIND = 259 + SYS_GET_MEMPOLICY = 260 + SYS_SET_MEMPOLICY = 261 + SYS_MQ_OPEN = 262 + SYS_MQ_UNLINK = 263 + SYS_MQ_TIMEDSEND = 264 + SYS_MQ_TIMEDRECEIVE = 265 + SYS_MQ_NOTIFY = 266 + SYS_MQ_GETSETATTR = 267 + SYS_KEXEC_LOAD = 268 + SYS_ADD_KEY = 269 + SYS_REQUEST_KEY = 270 + SYS_KEYCTL = 271 + SYS_WAITID = 272 + SYS_IOPRIO_SET = 273 + SYS_IOPRIO_GET = 274 + SYS_INOTIFY_INIT = 275 + SYS_INOTIFY_ADD_WATCH = 276 + SYS_INOTIFY_RM_WATCH = 277 + SYS_SPU_RUN = 278 + SYS_SPU_CREATE = 279 + SYS_PSELECT6 = 280 + SYS_PPOLL = 281 + SYS_UNSHARE = 282 + SYS_SPLICE = 283 + SYS_TEE = 284 + SYS_VMSPLICE = 285 + SYS_OPENAT = 286 + SYS_MKDIRAT = 287 + SYS_MKNODAT = 288 + SYS_FCHOWNAT = 289 + SYS_FUTIMESAT = 290 + SYS_NEWFSTATAT = 291 + SYS_UNLINKAT = 292 + SYS_RENAMEAT = 293 + SYS_LINKAT = 294 + SYS_SYMLINKAT = 295 + SYS_READLINKAT = 296 + SYS_FCHMODAT = 297 + SYS_FACCESSAT = 298 + SYS_GET_ROBUST_LIST = 299 + SYS_SET_ROBUST_LIST = 300 + SYS_MOVE_PAGES = 301 + SYS_GETCPU = 302 + SYS_EPOLL_PWAIT = 303 + SYS_UTIMENSAT = 304 + SYS_SIGNALFD = 305 + SYS_TIMERFD_CREATE = 306 + SYS_EVENTFD = 307 + SYS_SYNC_FILE_RANGE2 = 308 + SYS_FALLOCATE = 309 + SYS_SUBPAGE_PROT = 310 + SYS_TIMERFD_SETTIME = 311 + SYS_TIMERFD_GETTIME = 312 + SYS_SIGNALFD4 = 313 + SYS_EVENTFD2 = 314 + SYS_EPOLL_CREATE1 = 315 + SYS_DUP3 = 316 + SYS_PIPE2 = 317 + SYS_INOTIFY_INIT1 = 318 + SYS_PERF_EVENT_OPEN = 319 + SYS_PREADV = 320 + SYS_PWRITEV = 321 + SYS_RT_TGSIGQUEUEINFO = 322 + SYS_FANOTIFY_INIT = 323 + SYS_FANOTIFY_MARK = 324 + SYS_PRLIMIT64 = 325 + SYS_SOCKET = 326 + SYS_BIND = 327 + SYS_CONNECT = 328 + SYS_LISTEN = 329 + SYS_ACCEPT = 330 + SYS_GETSOCKNAME = 331 + SYS_GETPEERNAME = 332 + SYS_SOCKETPAIR = 333 + SYS_SEND = 334 + SYS_SENDTO = 335 + SYS_RECV = 336 + SYS_RECVFROM = 337 + SYS_SHUTDOWN = 338 + SYS_SETSOCKOPT = 339 + SYS_GETSOCKOPT = 340 + SYS_SENDMSG = 341 + SYS_RECVMSG = 342 + SYS_RECVMMSG = 343 + SYS_ACCEPT4 = 344 + SYS_NAME_TO_HANDLE_AT = 345 + SYS_OPEN_BY_HANDLE_AT = 346 + SYS_CLOCK_ADJTIME = 347 + SYS_SYNCFS = 348 + SYS_SENDMMSG = 349 + SYS_SETNS = 350 + SYS_PROCESS_VM_READV = 351 + SYS_PROCESS_VM_WRITEV = 352 + SYS_FINIT_MODULE = 353 + SYS_KCMP = 354 + SYS_SCHED_SETATTR = 355 + SYS_SCHED_GETATTR = 356 + SYS_RENAMEAT2 = 357 + SYS_SECCOMP = 358 + SYS_GETRANDOM = 359 + SYS_MEMFD_CREATE = 360 + SYS_BPF = 361 + SYS_EXECVEAT = 362 + SYS_SWITCH_ENDIAN = 363 + SYS_USERFAULTFD = 364 + SYS_MEMBARRIER = 365 + SYS_MLOCK2 = 378 + SYS_COPY_FILE_RANGE = 379 + SYS_PREADV2 = 380 + SYS_PWRITEV2 = 381 + SYS_KEXEC_FILE_LOAD = 382 + SYS_STATX = 383 + SYS_PKEY_ALLOC = 384 + SYS_PKEY_FREE = 385 + SYS_PKEY_MPROTECT = 386 + SYS_RSEQ = 387 + SYS_IO_PGETEVENTS = 388 +) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go new file mode 100644 index 00000000..5470eadb --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go @@ -0,0 +1,375 @@ +// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build ppc64le,linux + +package unix + +const ( + SYS_RESTART_SYSCALL = 0 + SYS_EXIT = 1 + SYS_FORK = 2 + SYS_READ = 3 + SYS_WRITE = 4 + SYS_OPEN = 5 + SYS_CLOSE = 6 + SYS_WAITPID = 7 + SYS_CREAT = 8 + SYS_LINK = 9 + SYS_UNLINK = 10 + SYS_EXECVE = 11 + SYS_CHDIR = 12 + SYS_TIME = 13 + SYS_MKNOD = 14 + SYS_CHMOD = 15 + SYS_LCHOWN = 16 + SYS_BREAK = 17 + SYS_OLDSTAT = 18 + SYS_LSEEK = 19 + SYS_GETPID = 20 + SYS_MOUNT = 21 + SYS_UMOUNT = 22 + SYS_SETUID = 23 + SYS_GETUID = 24 + SYS_STIME = 25 + SYS_PTRACE = 26 + SYS_ALARM = 27 + SYS_OLDFSTAT = 28 + SYS_PAUSE = 29 + SYS_UTIME = 30 + SYS_STTY = 31 + SYS_GTTY = 32 + SYS_ACCESS = 33 + SYS_NICE = 34 + SYS_FTIME = 35 + SYS_SYNC = 36 + SYS_KILL = 37 + SYS_RENAME = 38 + SYS_MKDIR = 39 + SYS_RMDIR = 40 + SYS_DUP = 41 + SYS_PIPE = 42 + SYS_TIMES = 43 + SYS_PROF = 44 + SYS_BRK = 45 + SYS_SETGID = 46 + SYS_GETGID = 47 + SYS_SIGNAL = 48 + SYS_GETEUID = 49 + SYS_GETEGID = 50 + SYS_ACCT = 51 + SYS_UMOUNT2 = 52 + SYS_LOCK = 53 + SYS_IOCTL = 54 + SYS_FCNTL = 55 + SYS_MPX = 56 + SYS_SETPGID = 57 + SYS_ULIMIT = 58 + SYS_OLDOLDUNAME = 59 + SYS_UMASK = 60 + SYS_CHROOT = 61 + SYS_USTAT = 62 + SYS_DUP2 = 63 + SYS_GETPPID = 64 + SYS_GETPGRP = 65 + SYS_SETSID = 66 + SYS_SIGACTION = 67 + SYS_SGETMASK = 68 + SYS_SSETMASK = 69 + SYS_SETREUID = 70 + SYS_SETREGID = 71 + SYS_SIGSUSPEND = 72 + SYS_SIGPENDING = 73 + SYS_SETHOSTNAME = 74 + SYS_SETRLIMIT = 75 + SYS_GETRLIMIT = 76 + SYS_GETRUSAGE = 77 + SYS_GETTIMEOFDAY = 78 + SYS_SETTIMEOFDAY = 79 + SYS_GETGROUPS = 80 + SYS_SETGROUPS = 81 + SYS_SELECT = 82 + SYS_SYMLINK = 83 + SYS_OLDLSTAT = 84 + SYS_READLINK = 85 + SYS_USELIB = 86 + SYS_SWAPON = 87 + SYS_REBOOT = 88 + SYS_READDIR = 89 + SYS_MMAP = 90 + SYS_MUNMAP = 91 + SYS_TRUNCATE = 92 + SYS_FTRUNCATE = 93 + SYS_FCHMOD = 94 + SYS_FCHOWN = 95 + SYS_GETPRIORITY = 96 + SYS_SETPRIORITY = 97 + SYS_PROFIL = 98 + SYS_STATFS = 99 + SYS_FSTATFS = 100 + SYS_IOPERM = 101 + SYS_SOCKETCALL = 102 + SYS_SYSLOG = 103 + SYS_SETITIMER = 104 + SYS_GETITIMER = 105 + SYS_STAT = 106 + SYS_LSTAT = 107 + SYS_FSTAT = 108 + SYS_OLDUNAME = 109 + SYS_IOPL = 110 + SYS_VHANGUP = 111 + SYS_IDLE = 112 + SYS_VM86 = 113 + SYS_WAIT4 = 114 + SYS_SWAPOFF = 115 + SYS_SYSINFO = 116 + SYS_IPC = 117 + SYS_FSYNC = 118 + SYS_SIGRETURN = 119 + SYS_CLONE = 120 + SYS_SETDOMAINNAME = 121 + SYS_UNAME = 122 + SYS_MODIFY_LDT = 123 + SYS_ADJTIMEX = 124 + SYS_MPROTECT = 125 + SYS_SIGPROCMASK = 126 + SYS_CREATE_MODULE = 127 + SYS_INIT_MODULE = 128 + SYS_DELETE_MODULE = 129 + SYS_GET_KERNEL_SYMS = 130 + SYS_QUOTACTL = 131 + SYS_GETPGID = 132 + SYS_FCHDIR = 133 + SYS_BDFLUSH = 134 + SYS_SYSFS = 135 + SYS_PERSONALITY = 136 + SYS_AFS_SYSCALL = 137 + SYS_SETFSUID = 138 + SYS_SETFSGID = 139 + SYS__LLSEEK = 140 + SYS_GETDENTS = 141 + SYS__NEWSELECT = 142 + SYS_FLOCK = 143 + SYS_MSYNC = 144 + SYS_READV = 145 + SYS_WRITEV = 146 + SYS_GETSID = 147 + SYS_FDATASYNC = 148 + SYS__SYSCTL = 149 + SYS_MLOCK = 150 + SYS_MUNLOCK = 151 + SYS_MLOCKALL = 152 + SYS_MUNLOCKALL = 153 + SYS_SCHED_SETPARAM = 154 + SYS_SCHED_GETPARAM = 155 + SYS_SCHED_SETSCHEDULER = 156 + SYS_SCHED_GETSCHEDULER = 157 + SYS_SCHED_YIELD = 158 + SYS_SCHED_GET_PRIORITY_MAX = 159 + SYS_SCHED_GET_PRIORITY_MIN = 160 + SYS_SCHED_RR_GET_INTERVAL = 161 + SYS_NANOSLEEP = 162 + SYS_MREMAP = 163 + SYS_SETRESUID = 164 + SYS_GETRESUID = 165 + SYS_QUERY_MODULE = 166 + SYS_POLL = 167 + SYS_NFSSERVCTL = 168 + SYS_SETRESGID = 169 + SYS_GETRESGID = 170 + SYS_PRCTL = 171 + SYS_RT_SIGRETURN = 172 + SYS_RT_SIGACTION = 173 + SYS_RT_SIGPROCMASK = 174 + SYS_RT_SIGPENDING = 175 + SYS_RT_SIGTIMEDWAIT = 176 + SYS_RT_SIGQUEUEINFO = 177 + SYS_RT_SIGSUSPEND = 178 + SYS_PREAD64 = 179 + SYS_PWRITE64 = 180 + SYS_CHOWN = 181 + SYS_GETCWD = 182 + SYS_CAPGET = 183 + SYS_CAPSET = 184 + SYS_SIGALTSTACK = 185 + SYS_SENDFILE = 186 + SYS_GETPMSG = 187 + SYS_PUTPMSG = 188 + SYS_VFORK = 189 + SYS_UGETRLIMIT = 190 + SYS_READAHEAD = 191 + SYS_PCICONFIG_READ = 198 + SYS_PCICONFIG_WRITE = 199 + SYS_PCICONFIG_IOBASE = 200 + SYS_MULTIPLEXER = 201 + SYS_GETDENTS64 = 202 + SYS_PIVOT_ROOT = 203 + SYS_MADVISE = 205 + SYS_MINCORE = 206 + SYS_GETTID = 207 + SYS_TKILL = 208 + SYS_SETXATTR = 209 + SYS_LSETXATTR = 210 + SYS_FSETXATTR = 211 + SYS_GETXATTR = 212 + SYS_LGETXATTR = 213 + SYS_FGETXATTR = 214 + SYS_LISTXATTR = 215 + SYS_LLISTXATTR = 216 + SYS_FLISTXATTR = 217 + SYS_REMOVEXATTR = 218 + SYS_LREMOVEXATTR = 219 + SYS_FREMOVEXATTR = 220 + SYS_FUTEX = 221 + SYS_SCHED_SETAFFINITY = 222 + SYS_SCHED_GETAFFINITY = 223 + SYS_TUXCALL = 225 + SYS_IO_SETUP = 227 + SYS_IO_DESTROY = 228 + SYS_IO_GETEVENTS = 229 + SYS_IO_SUBMIT = 230 + SYS_IO_CANCEL = 231 + SYS_SET_TID_ADDRESS = 232 + SYS_FADVISE64 = 233 + SYS_EXIT_GROUP = 234 + SYS_LOOKUP_DCOOKIE = 235 + SYS_EPOLL_CREATE = 236 + SYS_EPOLL_CTL = 237 + SYS_EPOLL_WAIT = 238 + SYS_REMAP_FILE_PAGES = 239 + SYS_TIMER_CREATE = 240 + SYS_TIMER_SETTIME = 241 + SYS_TIMER_GETTIME = 242 + SYS_TIMER_GETOVERRUN = 243 + SYS_TIMER_DELETE = 244 + SYS_CLOCK_SETTIME = 245 + SYS_CLOCK_GETTIME = 246 + SYS_CLOCK_GETRES = 247 + SYS_CLOCK_NANOSLEEP = 248 + SYS_SWAPCONTEXT = 249 + SYS_TGKILL = 250 + SYS_UTIMES = 251 + SYS_STATFS64 = 252 + SYS_FSTATFS64 = 253 + SYS_RTAS = 255 + SYS_SYS_DEBUG_SETCONTEXT = 256 + SYS_MIGRATE_PAGES = 258 + SYS_MBIND = 259 + SYS_GET_MEMPOLICY = 260 + SYS_SET_MEMPOLICY = 261 + SYS_MQ_OPEN = 262 + SYS_MQ_UNLINK = 263 + SYS_MQ_TIMEDSEND = 264 + SYS_MQ_TIMEDRECEIVE = 265 + SYS_MQ_NOTIFY = 266 + SYS_MQ_GETSETATTR = 267 + SYS_KEXEC_LOAD = 268 + SYS_ADD_KEY = 269 + SYS_REQUEST_KEY = 270 + SYS_KEYCTL = 271 + SYS_WAITID = 272 + SYS_IOPRIO_SET = 273 + SYS_IOPRIO_GET = 274 + SYS_INOTIFY_INIT = 275 + SYS_INOTIFY_ADD_WATCH = 276 + SYS_INOTIFY_RM_WATCH = 277 + SYS_SPU_RUN = 278 + SYS_SPU_CREATE = 279 + SYS_PSELECT6 = 280 + SYS_PPOLL = 281 + SYS_UNSHARE = 282 + SYS_SPLICE = 283 + SYS_TEE = 284 + SYS_VMSPLICE = 285 + SYS_OPENAT = 286 + SYS_MKDIRAT = 287 + SYS_MKNODAT = 288 + SYS_FCHOWNAT = 289 + SYS_FUTIMESAT = 290 + SYS_NEWFSTATAT = 291 + SYS_UNLINKAT = 292 + SYS_RENAMEAT = 293 + SYS_LINKAT = 294 + SYS_SYMLINKAT = 295 + SYS_READLINKAT = 296 + SYS_FCHMODAT = 297 + SYS_FACCESSAT = 298 + SYS_GET_ROBUST_LIST = 299 + SYS_SET_ROBUST_LIST = 300 + SYS_MOVE_PAGES = 301 + SYS_GETCPU = 302 + SYS_EPOLL_PWAIT = 303 + SYS_UTIMENSAT = 304 + SYS_SIGNALFD = 305 + SYS_TIMERFD_CREATE = 306 + SYS_EVENTFD = 307 + SYS_SYNC_FILE_RANGE2 = 308 + SYS_FALLOCATE = 309 + SYS_SUBPAGE_PROT = 310 + SYS_TIMERFD_SETTIME = 311 + SYS_TIMERFD_GETTIME = 312 + SYS_SIGNALFD4 = 313 + SYS_EVENTFD2 = 314 + SYS_EPOLL_CREATE1 = 315 + SYS_DUP3 = 316 + SYS_PIPE2 = 317 + SYS_INOTIFY_INIT1 = 318 + SYS_PERF_EVENT_OPEN = 319 + SYS_PREADV = 320 + SYS_PWRITEV = 321 + SYS_RT_TGSIGQUEUEINFO = 322 + SYS_FANOTIFY_INIT = 323 + SYS_FANOTIFY_MARK = 324 + SYS_PRLIMIT64 = 325 + SYS_SOCKET = 326 + SYS_BIND = 327 + SYS_CONNECT = 328 + SYS_LISTEN = 329 + SYS_ACCEPT = 330 + SYS_GETSOCKNAME = 331 + SYS_GETPEERNAME = 332 + SYS_SOCKETPAIR = 333 + SYS_SEND = 334 + SYS_SENDTO = 335 + SYS_RECV = 336 + SYS_RECVFROM = 337 + SYS_SHUTDOWN = 338 + SYS_SETSOCKOPT = 339 + SYS_GETSOCKOPT = 340 + SYS_SENDMSG = 341 + SYS_RECVMSG = 342 + SYS_RECVMMSG = 343 + SYS_ACCEPT4 = 344 + SYS_NAME_TO_HANDLE_AT = 345 + SYS_OPEN_BY_HANDLE_AT = 346 + SYS_CLOCK_ADJTIME = 347 + SYS_SYNCFS = 348 + SYS_SENDMMSG = 349 + SYS_SETNS = 350 + SYS_PROCESS_VM_READV = 351 + SYS_PROCESS_VM_WRITEV = 352 + SYS_FINIT_MODULE = 353 + SYS_KCMP = 354 + SYS_SCHED_SETATTR = 355 + SYS_SCHED_GETATTR = 356 + SYS_RENAMEAT2 = 357 + SYS_SECCOMP = 358 + SYS_GETRANDOM = 359 + SYS_MEMFD_CREATE = 360 + SYS_BPF = 361 + SYS_EXECVEAT = 362 + SYS_SWITCH_ENDIAN = 363 + SYS_USERFAULTFD = 364 + SYS_MEMBARRIER = 365 + SYS_MLOCK2 = 378 + SYS_COPY_FILE_RANGE = 379 + SYS_PREADV2 = 380 + SYS_PWRITEV2 = 381 + SYS_KEXEC_FILE_LOAD = 382 + SYS_STATX = 383 + SYS_PKEY_ALLOC = 384 + SYS_PKEY_FREE = 385 + SYS_PKEY_MPROTECT = 386 + SYS_RSEQ = 387 + SYS_IO_PGETEVENTS = 388 +) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go new file mode 100644 index 00000000..a5d99191 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go @@ -0,0 +1,287 @@ +// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build riscv64,linux + +package unix + +const ( + SYS_IO_SETUP = 0 + SYS_IO_DESTROY = 1 + SYS_IO_SUBMIT = 2 + SYS_IO_CANCEL = 3 + SYS_IO_GETEVENTS = 4 + SYS_SETXATTR = 5 + SYS_LSETXATTR = 6 + SYS_FSETXATTR = 7 + SYS_GETXATTR = 8 + SYS_LGETXATTR = 9 + SYS_FGETXATTR = 10 + SYS_LISTXATTR = 11 + SYS_LLISTXATTR = 12 + SYS_FLISTXATTR = 13 + SYS_REMOVEXATTR = 14 + SYS_LREMOVEXATTR = 15 + SYS_FREMOVEXATTR = 16 + SYS_GETCWD = 17 + SYS_LOOKUP_DCOOKIE = 18 + SYS_EVENTFD2 = 19 + SYS_EPOLL_CREATE1 = 20 + SYS_EPOLL_CTL = 21 + SYS_EPOLL_PWAIT = 22 + SYS_DUP = 23 + SYS_DUP3 = 24 + SYS_FCNTL = 25 + SYS_INOTIFY_INIT1 = 26 + SYS_INOTIFY_ADD_WATCH = 27 + SYS_INOTIFY_RM_WATCH = 28 + SYS_IOCTL = 29 + SYS_IOPRIO_SET = 30 + SYS_IOPRIO_GET = 31 + SYS_FLOCK = 32 + SYS_MKNODAT = 33 + SYS_MKDIRAT = 34 + SYS_UNLINKAT = 35 + SYS_SYMLINKAT = 36 + SYS_LINKAT = 37 + SYS_UMOUNT2 = 39 + SYS_MOUNT = 40 + SYS_PIVOT_ROOT = 41 + SYS_NFSSERVCTL = 42 + SYS_STATFS = 43 + SYS_FSTATFS = 44 + SYS_TRUNCATE = 45 + SYS_FTRUNCATE = 46 + SYS_FALLOCATE = 47 + SYS_FACCESSAT = 48 + SYS_CHDIR = 49 + SYS_FCHDIR = 50 + SYS_CHROOT = 51 + SYS_FCHMOD = 52 + SYS_FCHMODAT = 53 + SYS_FCHOWNAT = 54 + SYS_FCHOWN = 55 + SYS_OPENAT = 56 + SYS_CLOSE = 57 + SYS_VHANGUP = 58 + SYS_PIPE2 = 59 + SYS_QUOTACTL = 60 + SYS_GETDENTS64 = 61 + SYS_LSEEK = 62 + SYS_READ = 63 + SYS_WRITE = 64 + SYS_READV = 65 + SYS_WRITEV = 66 + SYS_PREAD64 = 67 + SYS_PWRITE64 = 68 + SYS_PREADV = 69 + SYS_PWRITEV = 70 + SYS_SENDFILE = 71 + SYS_PSELECT6 = 72 + SYS_PPOLL = 73 + SYS_SIGNALFD4 = 74 + SYS_VMSPLICE = 75 + SYS_SPLICE = 76 + SYS_TEE = 77 + SYS_READLINKAT = 78 + SYS_FSTATAT = 79 + SYS_FSTAT = 80 + SYS_SYNC = 81 + SYS_FSYNC = 82 + SYS_FDATASYNC = 83 + SYS_SYNC_FILE_RANGE = 84 + SYS_TIMERFD_CREATE = 85 + SYS_TIMERFD_SETTIME = 86 + SYS_TIMERFD_GETTIME = 87 + SYS_UTIMENSAT = 88 + SYS_ACCT = 89 + SYS_CAPGET = 90 + SYS_CAPSET = 91 + SYS_PERSONALITY = 92 + SYS_EXIT = 93 + SYS_EXIT_GROUP = 94 + SYS_WAITID = 95 + SYS_SET_TID_ADDRESS = 96 + SYS_UNSHARE = 97 + SYS_FUTEX = 98 + SYS_SET_ROBUST_LIST = 99 + SYS_GET_ROBUST_LIST = 100 + SYS_NANOSLEEP = 101 + SYS_GETITIMER = 102 + SYS_SETITIMER = 103 + SYS_KEXEC_LOAD = 104 + SYS_INIT_MODULE = 105 + SYS_DELETE_MODULE = 106 + SYS_TIMER_CREATE = 107 + SYS_TIMER_GETTIME = 108 + SYS_TIMER_GETOVERRUN = 109 + SYS_TIMER_SETTIME = 110 + SYS_TIMER_DELETE = 111 + SYS_CLOCK_SETTIME = 112 + SYS_CLOCK_GETTIME = 113 + SYS_CLOCK_GETRES = 114 + SYS_CLOCK_NANOSLEEP = 115 + SYS_SYSLOG = 116 + SYS_PTRACE = 117 + SYS_SCHED_SETPARAM = 118 + SYS_SCHED_SETSCHEDULER = 119 + SYS_SCHED_GETSCHEDULER = 120 + SYS_SCHED_GETPARAM = 121 + SYS_SCHED_SETAFFINITY = 122 + SYS_SCHED_GETAFFINITY = 123 + SYS_SCHED_YIELD = 124 + SYS_SCHED_GET_PRIORITY_MAX = 125 + SYS_SCHED_GET_PRIORITY_MIN = 126 + SYS_SCHED_RR_GET_INTERVAL = 127 + SYS_RESTART_SYSCALL = 128 + SYS_KILL = 129 + SYS_TKILL = 130 + SYS_TGKILL = 131 + SYS_SIGALTSTACK = 132 + SYS_RT_SIGSUSPEND = 133 + SYS_RT_SIGACTION = 134 + SYS_RT_SIGPROCMASK = 135 + SYS_RT_SIGPENDING = 136 + SYS_RT_SIGTIMEDWAIT = 137 + SYS_RT_SIGQUEUEINFO = 138 + SYS_RT_SIGRETURN = 139 + SYS_SETPRIORITY = 140 + SYS_GETPRIORITY = 141 + SYS_REBOOT = 142 + SYS_SETREGID = 143 + SYS_SETGID = 144 + SYS_SETREUID = 145 + SYS_SETUID = 146 + SYS_SETRESUID = 147 + SYS_GETRESUID = 148 + SYS_SETRESGID = 149 + SYS_GETRESGID = 150 + SYS_SETFSUID = 151 + SYS_SETFSGID = 152 + SYS_TIMES = 153 + SYS_SETPGID = 154 + SYS_GETPGID = 155 + SYS_GETSID = 156 + SYS_SETSID = 157 + SYS_GETGROUPS = 158 + SYS_SETGROUPS = 159 + SYS_UNAME = 160 + SYS_SETHOSTNAME = 161 + SYS_SETDOMAINNAME = 162 + SYS_GETRLIMIT = 163 + SYS_SETRLIMIT = 164 + SYS_GETRUSAGE = 165 + SYS_UMASK = 166 + SYS_PRCTL = 167 + SYS_GETCPU = 168 + SYS_GETTIMEOFDAY = 169 + SYS_SETTIMEOFDAY = 170 + SYS_ADJTIMEX = 171 + SYS_GETPID = 172 + SYS_GETPPID = 173 + SYS_GETUID = 174 + SYS_GETEUID = 175 + SYS_GETGID = 176 + SYS_GETEGID = 177 + SYS_GETTID = 178 + SYS_SYSINFO = 179 + SYS_MQ_OPEN = 180 + SYS_MQ_UNLINK = 181 + SYS_MQ_TIMEDSEND = 182 + SYS_MQ_TIMEDRECEIVE = 183 + SYS_MQ_NOTIFY = 184 + SYS_MQ_GETSETATTR = 185 + SYS_MSGGET = 186 + SYS_MSGCTL = 187 + SYS_MSGRCV = 188 + SYS_MSGSND = 189 + SYS_SEMGET = 190 + SYS_SEMCTL = 191 + SYS_SEMTIMEDOP = 192 + SYS_SEMOP = 193 + SYS_SHMGET = 194 + SYS_SHMCTL = 195 + SYS_SHMAT = 196 + SYS_SHMDT = 197 + SYS_SOCKET = 198 + SYS_SOCKETPAIR = 199 + SYS_BIND = 200 + SYS_LISTEN = 201 + SYS_ACCEPT = 202 + SYS_CONNECT = 203 + SYS_GETSOCKNAME = 204 + SYS_GETPEERNAME = 205 + SYS_SENDTO = 206 + SYS_RECVFROM = 207 + SYS_SETSOCKOPT = 208 + SYS_GETSOCKOPT = 209 + SYS_SHUTDOWN = 210 + SYS_SENDMSG = 211 + SYS_RECVMSG = 212 + SYS_READAHEAD = 213 + SYS_BRK = 214 + SYS_MUNMAP = 215 + SYS_MREMAP = 216 + SYS_ADD_KEY = 217 + SYS_REQUEST_KEY = 218 + SYS_KEYCTL = 219 + SYS_CLONE = 220 + SYS_EXECVE = 221 + SYS_MMAP = 222 + SYS_FADVISE64 = 223 + SYS_SWAPON = 224 + SYS_SWAPOFF = 225 + SYS_MPROTECT = 226 + SYS_MSYNC = 227 + SYS_MLOCK = 228 + SYS_MUNLOCK = 229 + SYS_MLOCKALL = 230 + SYS_MUNLOCKALL = 231 + SYS_MINCORE = 232 + SYS_MADVISE = 233 + SYS_REMAP_FILE_PAGES = 234 + SYS_MBIND = 235 + SYS_GET_MEMPOLICY = 236 + SYS_SET_MEMPOLICY = 237 + SYS_MIGRATE_PAGES = 238 + SYS_MOVE_PAGES = 239 + SYS_RT_TGSIGQUEUEINFO = 240 + SYS_PERF_EVENT_OPEN = 241 + SYS_ACCEPT4 = 242 + SYS_RECVMMSG = 243 + SYS_ARCH_SPECIFIC_SYSCALL = 244 + SYS_WAIT4 = 260 + SYS_PRLIMIT64 = 261 + SYS_FANOTIFY_INIT = 262 + SYS_FANOTIFY_MARK = 263 + SYS_NAME_TO_HANDLE_AT = 264 + SYS_OPEN_BY_HANDLE_AT = 265 + SYS_CLOCK_ADJTIME = 266 + SYS_SYNCFS = 267 + SYS_SETNS = 268 + SYS_SENDMMSG = 269 + SYS_PROCESS_VM_READV = 270 + SYS_PROCESS_VM_WRITEV = 271 + SYS_KCMP = 272 + SYS_FINIT_MODULE = 273 + SYS_SCHED_SETATTR = 274 + SYS_SCHED_GETATTR = 275 + SYS_RENAMEAT2 = 276 + SYS_SECCOMP = 277 + SYS_GETRANDOM = 278 + SYS_MEMFD_CREATE = 279 + SYS_BPF = 280 + SYS_EXECVEAT = 281 + SYS_USERFAULTFD = 282 + SYS_MEMBARRIER = 283 + SYS_MLOCK2 = 284 + SYS_COPY_FILE_RANGE = 285 + SYS_PREADV2 = 286 + SYS_PWRITEV2 = 287 + SYS_PKEY_MPROTECT = 288 + SYS_PKEY_ALLOC = 289 + SYS_PKEY_FREE = 290 + SYS_STATX = 291 + SYS_IO_PGETEVENTS = 292 + SYS_RSEQ = 293 +) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go new file mode 100644 index 00000000..de0245a9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go @@ -0,0 +1,337 @@ +// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include -fsigned-char /tmp/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build s390x,linux + +package unix + +const ( + SYS_EXIT = 1 + SYS_FORK = 2 + SYS_READ = 3 + SYS_WRITE = 4 + SYS_OPEN = 5 + SYS_CLOSE = 6 + SYS_RESTART_SYSCALL = 7 + SYS_CREAT = 8 + SYS_LINK = 9 + SYS_UNLINK = 10 + SYS_EXECVE = 11 + SYS_CHDIR = 12 + SYS_MKNOD = 14 + SYS_CHMOD = 15 + SYS_LSEEK = 19 + SYS_GETPID = 20 + SYS_MOUNT = 21 + SYS_UMOUNT = 22 + SYS_PTRACE = 26 + SYS_ALARM = 27 + SYS_PAUSE = 29 + SYS_UTIME = 30 + SYS_ACCESS = 33 + SYS_NICE = 34 + SYS_SYNC = 36 + SYS_KILL = 37 + SYS_RENAME = 38 + SYS_MKDIR = 39 + SYS_RMDIR = 40 + SYS_DUP = 41 + SYS_PIPE = 42 + SYS_TIMES = 43 + SYS_BRK = 45 + SYS_SIGNAL = 48 + SYS_ACCT = 51 + SYS_UMOUNT2 = 52 + SYS_IOCTL = 54 + SYS_FCNTL = 55 + SYS_SETPGID = 57 + SYS_UMASK = 60 + SYS_CHROOT = 61 + SYS_USTAT = 62 + SYS_DUP2 = 63 + SYS_GETPPID = 64 + SYS_GETPGRP = 65 + SYS_SETSID = 66 + SYS_SIGACTION = 67 + SYS_SIGSUSPEND = 72 + SYS_SIGPENDING = 73 + SYS_SETHOSTNAME = 74 + SYS_SETRLIMIT = 75 + SYS_GETRUSAGE = 77 + SYS_GETTIMEOFDAY = 78 + SYS_SETTIMEOFDAY = 79 + SYS_SYMLINK = 83 + SYS_READLINK = 85 + SYS_USELIB = 86 + SYS_SWAPON = 87 + SYS_REBOOT = 88 + SYS_READDIR = 89 + SYS_MMAP = 90 + SYS_MUNMAP = 91 + SYS_TRUNCATE = 92 + SYS_FTRUNCATE = 93 + SYS_FCHMOD = 94 + SYS_GETPRIORITY = 96 + SYS_SETPRIORITY = 97 + SYS_STATFS = 99 + SYS_FSTATFS = 100 + SYS_SOCKETCALL = 102 + SYS_SYSLOG = 103 + SYS_SETITIMER = 104 + SYS_GETITIMER = 105 + SYS_STAT = 106 + SYS_LSTAT = 107 + SYS_FSTAT = 108 + SYS_LOOKUP_DCOOKIE = 110 + SYS_VHANGUP = 111 + SYS_IDLE = 112 + SYS_WAIT4 = 114 + SYS_SWAPOFF = 115 + SYS_SYSINFO = 116 + SYS_IPC = 117 + SYS_FSYNC = 118 + SYS_SIGRETURN = 119 + SYS_CLONE = 120 + SYS_SETDOMAINNAME = 121 + SYS_UNAME = 122 + SYS_ADJTIMEX = 124 + SYS_MPROTECT = 125 + SYS_SIGPROCMASK = 126 + SYS_CREATE_MODULE = 127 + SYS_INIT_MODULE = 128 + SYS_DELETE_MODULE = 129 + SYS_GET_KERNEL_SYMS = 130 + SYS_QUOTACTL = 131 + SYS_GETPGID = 132 + SYS_FCHDIR = 133 + SYS_BDFLUSH = 134 + SYS_SYSFS = 135 + SYS_PERSONALITY = 136 + SYS_AFS_SYSCALL = 137 + SYS_GETDENTS = 141 + SYS_SELECT = 142 + SYS_FLOCK = 143 + SYS_MSYNC = 144 + SYS_READV = 145 + SYS_WRITEV = 146 + SYS_GETSID = 147 + SYS_FDATASYNC = 148 + SYS__SYSCTL = 149 + SYS_MLOCK = 150 + SYS_MUNLOCK = 151 + SYS_MLOCKALL = 152 + SYS_MUNLOCKALL = 153 + SYS_SCHED_SETPARAM = 154 + SYS_SCHED_GETPARAM = 155 + SYS_SCHED_SETSCHEDULER = 156 + SYS_SCHED_GETSCHEDULER = 157 + SYS_SCHED_YIELD = 158 + SYS_SCHED_GET_PRIORITY_MAX = 159 + SYS_SCHED_GET_PRIORITY_MIN = 160 + SYS_SCHED_RR_GET_INTERVAL = 161 + SYS_NANOSLEEP = 162 + SYS_MREMAP = 163 + SYS_QUERY_MODULE = 167 + SYS_POLL = 168 + SYS_NFSSERVCTL = 169 + SYS_PRCTL = 172 + SYS_RT_SIGRETURN = 173 + SYS_RT_SIGACTION = 174 + SYS_RT_SIGPROCMASK = 175 + SYS_RT_SIGPENDING = 176 + SYS_RT_SIGTIMEDWAIT = 177 + SYS_RT_SIGQUEUEINFO = 178 + SYS_RT_SIGSUSPEND = 179 + SYS_PREAD64 = 180 + SYS_PWRITE64 = 181 + SYS_GETCWD = 183 + SYS_CAPGET = 184 + SYS_CAPSET = 185 + SYS_SIGALTSTACK = 186 + SYS_SENDFILE = 187 + SYS_GETPMSG = 188 + SYS_PUTPMSG = 189 + SYS_VFORK = 190 + SYS_GETRLIMIT = 191 + SYS_LCHOWN = 198 + SYS_GETUID = 199 + SYS_GETGID = 200 + SYS_GETEUID = 201 + SYS_GETEGID = 202 + SYS_SETREUID = 203 + SYS_SETREGID = 204 + SYS_GETGROUPS = 205 + SYS_SETGROUPS = 206 + SYS_FCHOWN = 207 + SYS_SETRESUID = 208 + SYS_GETRESUID = 209 + SYS_SETRESGID = 210 + SYS_GETRESGID = 211 + SYS_CHOWN = 212 + SYS_SETUID = 213 + SYS_SETGID = 214 + SYS_SETFSUID = 215 + SYS_SETFSGID = 216 + SYS_PIVOT_ROOT = 217 + SYS_MINCORE = 218 + SYS_MADVISE = 219 + SYS_GETDENTS64 = 220 + SYS_READAHEAD = 222 + SYS_SETXATTR = 224 + SYS_LSETXATTR = 225 + SYS_FSETXATTR = 226 + SYS_GETXATTR = 227 + SYS_LGETXATTR = 228 + SYS_FGETXATTR = 229 + SYS_LISTXATTR = 230 + SYS_LLISTXATTR = 231 + SYS_FLISTXATTR = 232 + SYS_REMOVEXATTR = 233 + SYS_LREMOVEXATTR = 234 + SYS_FREMOVEXATTR = 235 + SYS_GETTID = 236 + SYS_TKILL = 237 + SYS_FUTEX = 238 + SYS_SCHED_SETAFFINITY = 239 + SYS_SCHED_GETAFFINITY = 240 + SYS_TGKILL = 241 + SYS_IO_SETUP = 243 + SYS_IO_DESTROY = 244 + SYS_IO_GETEVENTS = 245 + SYS_IO_SUBMIT = 246 + SYS_IO_CANCEL = 247 + SYS_EXIT_GROUP = 248 + SYS_EPOLL_CREATE = 249 + SYS_EPOLL_CTL = 250 + SYS_EPOLL_WAIT = 251 + SYS_SET_TID_ADDRESS = 252 + SYS_FADVISE64 = 253 + SYS_TIMER_CREATE = 254 + SYS_TIMER_SETTIME = 255 + SYS_TIMER_GETTIME = 256 + SYS_TIMER_GETOVERRUN = 257 + SYS_TIMER_DELETE = 258 + SYS_CLOCK_SETTIME = 259 + SYS_CLOCK_GETTIME = 260 + SYS_CLOCK_GETRES = 261 + SYS_CLOCK_NANOSLEEP = 262 + SYS_STATFS64 = 265 + SYS_FSTATFS64 = 266 + SYS_REMAP_FILE_PAGES = 267 + SYS_MBIND = 268 + SYS_GET_MEMPOLICY = 269 + SYS_SET_MEMPOLICY = 270 + SYS_MQ_OPEN = 271 + SYS_MQ_UNLINK = 272 + SYS_MQ_TIMEDSEND = 273 + SYS_MQ_TIMEDRECEIVE = 274 + SYS_MQ_NOTIFY = 275 + SYS_MQ_GETSETATTR = 276 + SYS_KEXEC_LOAD = 277 + SYS_ADD_KEY = 278 + SYS_REQUEST_KEY = 279 + SYS_KEYCTL = 280 + SYS_WAITID = 281 + SYS_IOPRIO_SET = 282 + SYS_IOPRIO_GET = 283 + SYS_INOTIFY_INIT = 284 + SYS_INOTIFY_ADD_WATCH = 285 + SYS_INOTIFY_RM_WATCH = 286 + SYS_MIGRATE_PAGES = 287 + SYS_OPENAT = 288 + SYS_MKDIRAT = 289 + SYS_MKNODAT = 290 + SYS_FCHOWNAT = 291 + SYS_FUTIMESAT = 292 + SYS_NEWFSTATAT = 293 + SYS_UNLINKAT = 294 + SYS_RENAMEAT = 295 + SYS_LINKAT = 296 + SYS_SYMLINKAT = 297 + SYS_READLINKAT = 298 + SYS_FCHMODAT = 299 + SYS_FACCESSAT = 300 + SYS_PSELECT6 = 301 + SYS_PPOLL = 302 + SYS_UNSHARE = 303 + SYS_SET_ROBUST_LIST = 304 + SYS_GET_ROBUST_LIST = 305 + SYS_SPLICE = 306 + SYS_SYNC_FILE_RANGE = 307 + SYS_TEE = 308 + SYS_VMSPLICE = 309 + SYS_MOVE_PAGES = 310 + SYS_GETCPU = 311 + SYS_EPOLL_PWAIT = 312 + SYS_UTIMES = 313 + SYS_FALLOCATE = 314 + SYS_UTIMENSAT = 315 + SYS_SIGNALFD = 316 + SYS_TIMERFD = 317 + SYS_EVENTFD = 318 + SYS_TIMERFD_CREATE = 319 + SYS_TIMERFD_SETTIME = 320 + SYS_TIMERFD_GETTIME = 321 + SYS_SIGNALFD4 = 322 + SYS_EVENTFD2 = 323 + SYS_INOTIFY_INIT1 = 324 + SYS_PIPE2 = 325 + SYS_DUP3 = 326 + SYS_EPOLL_CREATE1 = 327 + SYS_PREADV = 328 + SYS_PWRITEV = 329 + SYS_RT_TGSIGQUEUEINFO = 330 + SYS_PERF_EVENT_OPEN = 331 + SYS_FANOTIFY_INIT = 332 + SYS_FANOTIFY_MARK = 333 + SYS_PRLIMIT64 = 334 + SYS_NAME_TO_HANDLE_AT = 335 + SYS_OPEN_BY_HANDLE_AT = 336 + SYS_CLOCK_ADJTIME = 337 + SYS_SYNCFS = 338 + SYS_SETNS = 339 + SYS_PROCESS_VM_READV = 340 + SYS_PROCESS_VM_WRITEV = 341 + SYS_S390_RUNTIME_INSTR = 342 + SYS_KCMP = 343 + SYS_FINIT_MODULE = 344 + SYS_SCHED_SETATTR = 345 + SYS_SCHED_GETATTR = 346 + SYS_RENAMEAT2 = 347 + SYS_SECCOMP = 348 + SYS_GETRANDOM = 349 + SYS_MEMFD_CREATE = 350 + SYS_BPF = 351 + SYS_S390_PCI_MMIO_WRITE = 352 + SYS_S390_PCI_MMIO_READ = 353 + SYS_EXECVEAT = 354 + SYS_USERFAULTFD = 355 + SYS_MEMBARRIER = 356 + SYS_RECVMMSG = 357 + SYS_SENDMMSG = 358 + SYS_SOCKET = 359 + SYS_SOCKETPAIR = 360 + SYS_BIND = 361 + SYS_CONNECT = 362 + SYS_LISTEN = 363 + SYS_ACCEPT4 = 364 + SYS_GETSOCKOPT = 365 + SYS_SETSOCKOPT = 366 + SYS_GETSOCKNAME = 367 + SYS_GETPEERNAME = 368 + SYS_SENDTO = 369 + SYS_SENDMSG = 370 + SYS_RECVFROM = 371 + SYS_RECVMSG = 372 + SYS_SHUTDOWN = 373 + SYS_MLOCK2 = 374 + SYS_COPY_FILE_RANGE = 375 + SYS_PREADV2 = 376 + SYS_PWRITEV2 = 377 + SYS_S390_GUARDED_STORAGE = 378 + SYS_STATX = 379 + SYS_S390_STHYI = 380 + SYS_KEXEC_FILE_LOAD = 381 + SYS_IO_PGETEVENTS = 382 + SYS_RSEQ = 383 +) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go new file mode 100644 index 00000000..2d099367 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go @@ -0,0 +1,348 @@ +// mksysnum_linux.pl -Ilinux/usr/include -m64 -D__arch64__ linux/usr/include/asm/unistd.h +// Code generated by the command above; DO NOT EDIT. + +// +build sparc64,linux + +package unix + +const ( + SYS_RESTART_SYSCALL = 0 + SYS_EXIT = 1 + SYS_FORK = 2 + SYS_READ = 3 + SYS_WRITE = 4 + SYS_OPEN = 5 + SYS_CLOSE = 6 + SYS_WAIT4 = 7 + SYS_CREAT = 8 + SYS_LINK = 9 + SYS_UNLINK = 10 + SYS_EXECV = 11 + SYS_CHDIR = 12 + SYS_CHOWN = 13 + SYS_MKNOD = 14 + SYS_CHMOD = 15 + SYS_LCHOWN = 16 + SYS_BRK = 17 + SYS_PERFCTR = 18 + SYS_LSEEK = 19 + SYS_GETPID = 20 + SYS_CAPGET = 21 + SYS_CAPSET = 22 + SYS_SETUID = 23 + SYS_GETUID = 24 + SYS_VMSPLICE = 25 + SYS_PTRACE = 26 + SYS_ALARM = 27 + SYS_SIGALTSTACK = 28 + SYS_PAUSE = 29 + SYS_UTIME = 30 + SYS_ACCESS = 33 + SYS_NICE = 34 + SYS_SYNC = 36 + SYS_KILL = 37 + SYS_STAT = 38 + SYS_SENDFILE = 39 + SYS_LSTAT = 40 + SYS_DUP = 41 + SYS_PIPE = 42 + SYS_TIMES = 43 + SYS_UMOUNT2 = 45 + SYS_SETGID = 46 + SYS_GETGID = 47 + SYS_SIGNAL = 48 + SYS_GETEUID = 49 + SYS_GETEGID = 50 + SYS_ACCT = 51 + SYS_MEMORY_ORDERING = 52 + SYS_IOCTL = 54 + SYS_REBOOT = 55 + SYS_SYMLINK = 57 + SYS_READLINK = 58 + SYS_EXECVE = 59 + SYS_UMASK = 60 + SYS_CHROOT = 61 + SYS_FSTAT = 62 + SYS_FSTAT64 = 63 + SYS_GETPAGESIZE = 64 + SYS_MSYNC = 65 + SYS_VFORK = 66 + SYS_PREAD64 = 67 + SYS_PWRITE64 = 68 + SYS_MMAP = 71 + SYS_MUNMAP = 73 + SYS_MPROTECT = 74 + SYS_MADVISE = 75 + SYS_VHANGUP = 76 + SYS_MINCORE = 78 + SYS_GETGROUPS = 79 + SYS_SETGROUPS = 80 + SYS_GETPGRP = 81 + SYS_SETITIMER = 83 + SYS_SWAPON = 85 + SYS_GETITIMER = 86 + SYS_SETHOSTNAME = 88 + SYS_DUP2 = 90 + SYS_FCNTL = 92 + SYS_SELECT = 93 + SYS_FSYNC = 95 + SYS_SETPRIORITY = 96 + SYS_SOCKET = 97 + SYS_CONNECT = 98 + SYS_ACCEPT = 99 + SYS_GETPRIORITY = 100 + SYS_RT_SIGRETURN = 101 + SYS_RT_SIGACTION = 102 + SYS_RT_SIGPROCMASK = 103 + SYS_RT_SIGPENDING = 104 + SYS_RT_SIGTIMEDWAIT = 105 + SYS_RT_SIGQUEUEINFO = 106 + SYS_RT_SIGSUSPEND = 107 + SYS_SETRESUID = 108 + SYS_GETRESUID = 109 + SYS_SETRESGID = 110 + SYS_GETRESGID = 111 + SYS_RECVMSG = 113 + SYS_SENDMSG = 114 + SYS_GETTIMEOFDAY = 116 + SYS_GETRUSAGE = 117 + SYS_GETSOCKOPT = 118 + SYS_GETCWD = 119 + SYS_READV = 120 + SYS_WRITEV = 121 + SYS_SETTIMEOFDAY = 122 + SYS_FCHOWN = 123 + SYS_FCHMOD = 124 + SYS_RECVFROM = 125 + SYS_SETREUID = 126 + SYS_SETREGID = 127 + SYS_RENAME = 128 + SYS_TRUNCATE = 129 + SYS_FTRUNCATE = 130 + SYS_FLOCK = 131 + SYS_LSTAT64 = 132 + SYS_SENDTO = 133 + SYS_SHUTDOWN = 134 + SYS_SOCKETPAIR = 135 + SYS_MKDIR = 136 + SYS_RMDIR = 137 + SYS_UTIMES = 138 + SYS_STAT64 = 139 + SYS_SENDFILE64 = 140 + SYS_GETPEERNAME = 141 + SYS_FUTEX = 142 + SYS_GETTID = 143 + SYS_GETRLIMIT = 144 + SYS_SETRLIMIT = 145 + SYS_PIVOT_ROOT = 146 + SYS_PRCTL = 147 + SYS_PCICONFIG_READ = 148 + SYS_PCICONFIG_WRITE = 149 + SYS_GETSOCKNAME = 150 + SYS_INOTIFY_INIT = 151 + SYS_INOTIFY_ADD_WATCH = 152 + SYS_POLL = 153 + SYS_GETDENTS64 = 154 + SYS_INOTIFY_RM_WATCH = 156 + SYS_STATFS = 157 + SYS_FSTATFS = 158 + SYS_UMOUNT = 159 + SYS_SCHED_SET_AFFINITY = 160 + SYS_SCHED_GET_AFFINITY = 161 + SYS_GETDOMAINNAME = 162 + SYS_SETDOMAINNAME = 163 + SYS_UTRAP_INSTALL = 164 + SYS_QUOTACTL = 165 + SYS_SET_TID_ADDRESS = 166 + SYS_MOUNT = 167 + SYS_USTAT = 168 + SYS_SETXATTR = 169 + SYS_LSETXATTR = 170 + SYS_FSETXATTR = 171 + SYS_GETXATTR = 172 + SYS_LGETXATTR = 173 + SYS_GETDENTS = 174 + SYS_SETSID = 175 + SYS_FCHDIR = 176 + SYS_FGETXATTR = 177 + SYS_LISTXATTR = 178 + SYS_LLISTXATTR = 179 + SYS_FLISTXATTR = 180 + SYS_REMOVEXATTR = 181 + SYS_LREMOVEXATTR = 182 + SYS_SIGPENDING = 183 + SYS_QUERY_MODULE = 184 + SYS_SETPGID = 185 + SYS_FREMOVEXATTR = 186 + SYS_TKILL = 187 + SYS_EXIT_GROUP = 188 + SYS_UNAME = 189 + SYS_INIT_MODULE = 190 + SYS_PERSONALITY = 191 + SYS_REMAP_FILE_PAGES = 192 + SYS_EPOLL_CREATE = 193 + SYS_EPOLL_CTL = 194 + SYS_EPOLL_WAIT = 195 + SYS_IOPRIO_SET = 196 + SYS_GETPPID = 197 + SYS_SIGACTION = 198 + SYS_SGETMASK = 199 + SYS_SSETMASK = 200 + SYS_SIGSUSPEND = 201 + SYS_OLDLSTAT = 202 + SYS_USELIB = 203 + SYS_READDIR = 204 + SYS_READAHEAD = 205 + SYS_SOCKETCALL = 206 + SYS_SYSLOG = 207 + SYS_LOOKUP_DCOOKIE = 208 + SYS_FADVISE64 = 209 + SYS_FADVISE64_64 = 210 + SYS_TGKILL = 211 + SYS_WAITPID = 212 + SYS_SWAPOFF = 213 + SYS_SYSINFO = 214 + SYS_IPC = 215 + SYS_SIGRETURN = 216 + SYS_CLONE = 217 + SYS_IOPRIO_GET = 218 + SYS_ADJTIMEX = 219 + SYS_SIGPROCMASK = 220 + SYS_CREATE_MODULE = 221 + SYS_DELETE_MODULE = 222 + SYS_GET_KERNEL_SYMS = 223 + SYS_GETPGID = 224 + SYS_BDFLUSH = 225 + SYS_SYSFS = 226 + SYS_AFS_SYSCALL = 227 + SYS_SETFSUID = 228 + SYS_SETFSGID = 229 + SYS__NEWSELECT = 230 + SYS_SPLICE = 232 + SYS_STIME = 233 + SYS_STATFS64 = 234 + SYS_FSTATFS64 = 235 + SYS__LLSEEK = 236 + SYS_MLOCK = 237 + SYS_MUNLOCK = 238 + SYS_MLOCKALL = 239 + SYS_MUNLOCKALL = 240 + SYS_SCHED_SETPARAM = 241 + SYS_SCHED_GETPARAM = 242 + SYS_SCHED_SETSCHEDULER = 243 + SYS_SCHED_GETSCHEDULER = 244 + SYS_SCHED_YIELD = 245 + SYS_SCHED_GET_PRIORITY_MAX = 246 + SYS_SCHED_GET_PRIORITY_MIN = 247 + SYS_SCHED_RR_GET_INTERVAL = 248 + SYS_NANOSLEEP = 249 + SYS_MREMAP = 250 + SYS__SYSCTL = 251 + SYS_GETSID = 252 + SYS_FDATASYNC = 253 + SYS_NFSSERVCTL = 254 + SYS_SYNC_FILE_RANGE = 255 + SYS_CLOCK_SETTIME = 256 + SYS_CLOCK_GETTIME = 257 + SYS_CLOCK_GETRES = 258 + SYS_CLOCK_NANOSLEEP = 259 + SYS_SCHED_GETAFFINITY = 260 + SYS_SCHED_SETAFFINITY = 261 + SYS_TIMER_SETTIME = 262 + SYS_TIMER_GETTIME = 263 + SYS_TIMER_GETOVERRUN = 264 + SYS_TIMER_DELETE = 265 + SYS_TIMER_CREATE = 266 + SYS_IO_SETUP = 268 + SYS_IO_DESTROY = 269 + SYS_IO_SUBMIT = 270 + SYS_IO_CANCEL = 271 + SYS_IO_GETEVENTS = 272 + SYS_MQ_OPEN = 273 + SYS_MQ_UNLINK = 274 + SYS_MQ_TIMEDSEND = 275 + SYS_MQ_TIMEDRECEIVE = 276 + SYS_MQ_NOTIFY = 277 + SYS_MQ_GETSETATTR = 278 + SYS_WAITID = 279 + SYS_TEE = 280 + SYS_ADD_KEY = 281 + SYS_REQUEST_KEY = 282 + SYS_KEYCTL = 283 + SYS_OPENAT = 284 + SYS_MKDIRAT = 285 + SYS_MKNODAT = 286 + SYS_FCHOWNAT = 287 + SYS_FUTIMESAT = 288 + SYS_FSTATAT64 = 289 + SYS_UNLINKAT = 290 + SYS_RENAMEAT = 291 + SYS_LINKAT = 292 + SYS_SYMLINKAT = 293 + SYS_READLINKAT = 294 + SYS_FCHMODAT = 295 + SYS_FACCESSAT = 296 + SYS_PSELECT6 = 297 + SYS_PPOLL = 298 + SYS_UNSHARE = 299 + SYS_SET_ROBUST_LIST = 300 + SYS_GET_ROBUST_LIST = 301 + SYS_MIGRATE_PAGES = 302 + SYS_MBIND = 303 + SYS_GET_MEMPOLICY = 304 + SYS_SET_MEMPOLICY = 305 + SYS_KEXEC_LOAD = 306 + SYS_MOVE_PAGES = 307 + SYS_GETCPU = 308 + SYS_EPOLL_PWAIT = 309 + SYS_UTIMENSAT = 310 + SYS_SIGNALFD = 311 + SYS_TIMERFD_CREATE = 312 + SYS_EVENTFD = 313 + SYS_FALLOCATE = 314 + SYS_TIMERFD_SETTIME = 315 + SYS_TIMERFD_GETTIME = 316 + SYS_SIGNALFD4 = 317 + SYS_EVENTFD2 = 318 + SYS_EPOLL_CREATE1 = 319 + SYS_DUP3 = 320 + SYS_PIPE2 = 321 + SYS_INOTIFY_INIT1 = 322 + SYS_ACCEPT4 = 323 + SYS_PREADV = 324 + SYS_PWRITEV = 325 + SYS_RT_TGSIGQUEUEINFO = 326 + SYS_PERF_EVENT_OPEN = 327 + SYS_RECVMMSG = 328 + SYS_FANOTIFY_INIT = 329 + SYS_FANOTIFY_MARK = 330 + SYS_PRLIMIT64 = 331 + SYS_NAME_TO_HANDLE_AT = 332 + SYS_OPEN_BY_HANDLE_AT = 333 + SYS_CLOCK_ADJTIME = 334 + SYS_SYNCFS = 335 + SYS_SENDMMSG = 336 + SYS_SETNS = 337 + SYS_PROCESS_VM_READV = 338 + SYS_PROCESS_VM_WRITEV = 339 + SYS_KERN_FEATURES = 340 + SYS_KCMP = 341 + SYS_FINIT_MODULE = 342 + SYS_SCHED_SETATTR = 343 + SYS_SCHED_GETATTR = 344 + SYS_RENAMEAT2 = 345 + SYS_SECCOMP = 346 + SYS_GETRANDOM = 347 + SYS_MEMFD_CREATE = 348 + SYS_BPF = 349 + SYS_EXECVEAT = 350 + SYS_MEMBARRIER = 351 + SYS_USERFAULTFD = 352 + SYS_BIND = 353 + SYS_LISTEN = 354 + SYS_SETSOCKOPT = 355 + SYS_MLOCK2 = 356 + SYS_COPY_FILE_RANGE = 357 + SYS_PREADV2 = 358 + SYS_PWRITEV2 = 359 +) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_netbsd_386.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_netbsd_386.go new file mode 100644 index 00000000..f0daa05a --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_netbsd_386.go @@ -0,0 +1,274 @@ +// mksysnum_netbsd.pl +// Code generated by the command above; DO NOT EDIT. + +// +build 386,netbsd + +package unix + +const ( + SYS_EXIT = 1 // { void|sys||exit(int rval); } + SYS_FORK = 2 // { int|sys||fork(void); } + SYS_READ = 3 // { ssize_t|sys||read(int fd, void *buf, size_t nbyte); } + SYS_WRITE = 4 // { ssize_t|sys||write(int fd, const void *buf, size_t nbyte); } + SYS_OPEN = 5 // { int|sys||open(const char *path, int flags, ... mode_t mode); } + SYS_CLOSE = 6 // { int|sys||close(int fd); } + SYS_LINK = 9 // { int|sys||link(const char *path, const char *link); } + SYS_UNLINK = 10 // { int|sys||unlink(const char *path); } + SYS_CHDIR = 12 // { int|sys||chdir(const char *path); } + SYS_FCHDIR = 13 // { int|sys||fchdir(int fd); } + SYS_CHMOD = 15 // { int|sys||chmod(const char *path, mode_t mode); } + SYS_CHOWN = 16 // { int|sys||chown(const char *path, uid_t uid, gid_t gid); } + SYS_BREAK = 17 // { int|sys||obreak(char *nsize); } + SYS_GETPID = 20 // { pid_t|sys||getpid_with_ppid(void); } + SYS_UNMOUNT = 22 // { int|sys||unmount(const char *path, int flags); } + SYS_SETUID = 23 // { int|sys||setuid(uid_t uid); } + SYS_GETUID = 24 // { uid_t|sys||getuid_with_euid(void); } + SYS_GETEUID = 25 // { uid_t|sys||geteuid(void); } + SYS_PTRACE = 26 // { int|sys||ptrace(int req, pid_t pid, void *addr, int data); } + SYS_RECVMSG = 27 // { ssize_t|sys||recvmsg(int s, struct msghdr *msg, int flags); } + SYS_SENDMSG = 28 // { ssize_t|sys||sendmsg(int s, const struct msghdr *msg, int flags); } + SYS_RECVFROM = 29 // { ssize_t|sys||recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlenaddr); } + SYS_ACCEPT = 30 // { int|sys||accept(int s, struct sockaddr *name, socklen_t *anamelen); } + SYS_GETPEERNAME = 31 // { int|sys||getpeername(int fdes, struct sockaddr *asa, socklen_t *alen); } + SYS_GETSOCKNAME = 32 // { int|sys||getsockname(int fdes, struct sockaddr *asa, socklen_t *alen); } + SYS_ACCESS = 33 // { int|sys||access(const char *path, int flags); } + SYS_CHFLAGS = 34 // { int|sys||chflags(const char *path, u_long flags); } + SYS_FCHFLAGS = 35 // { int|sys||fchflags(int fd, u_long flags); } + SYS_SYNC = 36 // { void|sys||sync(void); } + SYS_KILL = 37 // { int|sys||kill(pid_t pid, int signum); } + SYS_GETPPID = 39 // { pid_t|sys||getppid(void); } + SYS_DUP = 41 // { int|sys||dup(int fd); } + SYS_PIPE = 42 // { int|sys||pipe(void); } + SYS_GETEGID = 43 // { gid_t|sys||getegid(void); } + SYS_PROFIL = 44 // { int|sys||profil(char *samples, size_t size, u_long offset, u_int scale); } + SYS_KTRACE = 45 // { int|sys||ktrace(const char *fname, int ops, int facs, pid_t pid); } + SYS_GETGID = 47 // { gid_t|sys||getgid_with_egid(void); } + SYS___GETLOGIN = 49 // { int|sys||__getlogin(char *namebuf, size_t namelen); } + SYS___SETLOGIN = 50 // { int|sys||__setlogin(const char *namebuf); } + SYS_ACCT = 51 // { int|sys||acct(const char *path); } + SYS_IOCTL = 54 // { int|sys||ioctl(int fd, u_long com, ... void *data); } + SYS_REVOKE = 56 // { int|sys||revoke(const char *path); } + SYS_SYMLINK = 57 // { int|sys||symlink(const char *path, const char *link); } + SYS_READLINK = 58 // { ssize_t|sys||readlink(const char *path, char *buf, size_t count); } + SYS_EXECVE = 59 // { int|sys||execve(const char *path, char * const *argp, char * const *envp); } + SYS_UMASK = 60 // { mode_t|sys||umask(mode_t newmask); } + SYS_CHROOT = 61 // { int|sys||chroot(const char *path); } + SYS_VFORK = 66 // { int|sys||vfork(void); } + SYS_SBRK = 69 // { int|sys||sbrk(intptr_t incr); } + SYS_SSTK = 70 // { int|sys||sstk(int incr); } + SYS_VADVISE = 72 // { int|sys||ovadvise(int anom); } + SYS_MUNMAP = 73 // { int|sys||munmap(void *addr, size_t len); } + SYS_MPROTECT = 74 // { int|sys||mprotect(void *addr, size_t len, int prot); } + SYS_MADVISE = 75 // { int|sys||madvise(void *addr, size_t len, int behav); } + SYS_MINCORE = 78 // { int|sys||mincore(void *addr, size_t len, char *vec); } + SYS_GETGROUPS = 79 // { int|sys||getgroups(int gidsetsize, gid_t *gidset); } + SYS_SETGROUPS = 80 // { int|sys||setgroups(int gidsetsize, const gid_t *gidset); } + SYS_GETPGRP = 81 // { int|sys||getpgrp(void); } + SYS_SETPGID = 82 // { int|sys||setpgid(pid_t pid, pid_t pgid); } + SYS_DUP2 = 90 // { int|sys||dup2(int from, int to); } + SYS_FCNTL = 92 // { int|sys||fcntl(int fd, int cmd, ... void *arg); } + SYS_FSYNC = 95 // { int|sys||fsync(int fd); } + SYS_SETPRIORITY = 96 // { int|sys||setpriority(int which, id_t who, int prio); } + SYS_CONNECT = 98 // { int|sys||connect(int s, const struct sockaddr *name, socklen_t namelen); } + SYS_GETPRIORITY = 100 // { int|sys||getpriority(int which, id_t who); } + SYS_BIND = 104 // { int|sys||bind(int s, const struct sockaddr *name, socklen_t namelen); } + SYS_SETSOCKOPT = 105 // { int|sys||setsockopt(int s, int level, int name, const void *val, socklen_t valsize); } + SYS_LISTEN = 106 // { int|sys||listen(int s, int backlog); } + SYS_GETSOCKOPT = 118 // { int|sys||getsockopt(int s, int level, int name, void *val, socklen_t *avalsize); } + SYS_READV = 120 // { ssize_t|sys||readv(int fd, const struct iovec *iovp, int iovcnt); } + SYS_WRITEV = 121 // { ssize_t|sys||writev(int fd, const struct iovec *iovp, int iovcnt); } + SYS_FCHOWN = 123 // { int|sys||fchown(int fd, uid_t uid, gid_t gid); } + SYS_FCHMOD = 124 // { int|sys||fchmod(int fd, mode_t mode); } + SYS_SETREUID = 126 // { int|sys||setreuid(uid_t ruid, uid_t euid); } + SYS_SETREGID = 127 // { int|sys||setregid(gid_t rgid, gid_t egid); } + SYS_RENAME = 128 // { int|sys||rename(const char *from, const char *to); } + SYS_FLOCK = 131 // { int|sys||flock(int fd, int how); } + SYS_MKFIFO = 132 // { int|sys||mkfifo(const char *path, mode_t mode); } + SYS_SENDTO = 133 // { ssize_t|sys||sendto(int s, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen); } + SYS_SHUTDOWN = 134 // { int|sys||shutdown(int s, int how); } + SYS_SOCKETPAIR = 135 // { int|sys||socketpair(int domain, int type, int protocol, int *rsv); } + SYS_MKDIR = 136 // { int|sys||mkdir(const char *path, mode_t mode); } + SYS_RMDIR = 137 // { int|sys||rmdir(const char *path); } + SYS_SETSID = 147 // { int|sys||setsid(void); } + SYS_SYSARCH = 165 // { int|sys||sysarch(int op, void *parms); } + SYS_PREAD = 173 // { ssize_t|sys||pread(int fd, void *buf, size_t nbyte, int PAD, off_t offset); } + SYS_PWRITE = 174 // { ssize_t|sys||pwrite(int fd, const void *buf, size_t nbyte, int PAD, off_t offset); } + SYS_NTP_ADJTIME = 176 // { int|sys||ntp_adjtime(struct timex *tp); } + SYS_SETGID = 181 // { int|sys||setgid(gid_t gid); } + SYS_SETEGID = 182 // { int|sys||setegid(gid_t egid); } + SYS_SETEUID = 183 // { int|sys||seteuid(uid_t euid); } + SYS_PATHCONF = 191 // { long|sys||pathconf(const char *path, int name); } + SYS_FPATHCONF = 192 // { long|sys||fpathconf(int fd, int name); } + SYS_GETRLIMIT = 194 // { int|sys||getrlimit(int which, struct rlimit *rlp); } + SYS_SETRLIMIT = 195 // { int|sys||setrlimit(int which, const struct rlimit *rlp); } + SYS_MMAP = 197 // { void *|sys||mmap(void *addr, size_t len, int prot, int flags, int fd, long PAD, off_t pos); } + SYS_LSEEK = 199 // { off_t|sys||lseek(int fd, int PAD, off_t offset, int whence); } + SYS_TRUNCATE = 200 // { int|sys||truncate(const char *path, int PAD, off_t length); } + SYS_FTRUNCATE = 201 // { int|sys||ftruncate(int fd, int PAD, off_t length); } + SYS___SYSCTL = 202 // { int|sys||__sysctl(const int *name, u_int namelen, void *old, size_t *oldlenp, const void *new, size_t newlen); } + SYS_MLOCK = 203 // { int|sys||mlock(const void *addr, size_t len); } + SYS_MUNLOCK = 204 // { int|sys||munlock(const void *addr, size_t len); } + SYS_UNDELETE = 205 // { int|sys||undelete(const char *path); } + SYS_GETPGID = 207 // { pid_t|sys||getpgid(pid_t pid); } + SYS_REBOOT = 208 // { int|sys||reboot(int opt, char *bootstr); } + SYS_POLL = 209 // { int|sys||poll(struct pollfd *fds, u_int nfds, int timeout); } + SYS_SEMGET = 221 // { int|sys||semget(key_t key, int nsems, int semflg); } + SYS_SEMOP = 222 // { int|sys||semop(int semid, struct sembuf *sops, size_t nsops); } + SYS_SEMCONFIG = 223 // { int|sys||semconfig(int flag); } + SYS_MSGGET = 225 // { int|sys||msgget(key_t key, int msgflg); } + SYS_MSGSND = 226 // { int|sys||msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); } + SYS_MSGRCV = 227 // { ssize_t|sys||msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); } + SYS_SHMAT = 228 // { void *|sys||shmat(int shmid, const void *shmaddr, int shmflg); } + SYS_SHMDT = 230 // { int|sys||shmdt(const void *shmaddr); } + SYS_SHMGET = 231 // { int|sys||shmget(key_t key, size_t size, int shmflg); } + SYS_TIMER_CREATE = 235 // { int|sys||timer_create(clockid_t clock_id, struct sigevent *evp, timer_t *timerid); } + SYS_TIMER_DELETE = 236 // { int|sys||timer_delete(timer_t timerid); } + SYS_TIMER_GETOVERRUN = 239 // { int|sys||timer_getoverrun(timer_t timerid); } + SYS_FDATASYNC = 241 // { int|sys||fdatasync(int fd); } + SYS_MLOCKALL = 242 // { int|sys||mlockall(int flags); } + SYS_MUNLOCKALL = 243 // { int|sys||munlockall(void); } + SYS_SIGQUEUEINFO = 245 // { int|sys||sigqueueinfo(pid_t pid, const siginfo_t *info); } + SYS_MODCTL = 246 // { int|sys||modctl(int cmd, void *arg); } + SYS___POSIX_RENAME = 270 // { int|sys||__posix_rename(const char *from, const char *to); } + SYS_SWAPCTL = 271 // { int|sys||swapctl(int cmd, void *arg, int misc); } + SYS_MINHERIT = 273 // { int|sys||minherit(void *addr, size_t len, int inherit); } + SYS_LCHMOD = 274 // { int|sys||lchmod(const char *path, mode_t mode); } + SYS_LCHOWN = 275 // { int|sys||lchown(const char *path, uid_t uid, gid_t gid); } + SYS_MSYNC = 277 // { int|sys|13|msync(void *addr, size_t len, int flags); } + SYS___POSIX_CHOWN = 283 // { int|sys||__posix_chown(const char *path, uid_t uid, gid_t gid); } + SYS___POSIX_FCHOWN = 284 // { int|sys||__posix_fchown(int fd, uid_t uid, gid_t gid); } + SYS___POSIX_LCHOWN = 285 // { int|sys||__posix_lchown(const char *path, uid_t uid, gid_t gid); } + SYS_GETSID = 286 // { pid_t|sys||getsid(pid_t pid); } + SYS___CLONE = 287 // { pid_t|sys||__clone(int flags, void *stack); } + SYS_FKTRACE = 288 // { int|sys||fktrace(int fd, int ops, int facs, pid_t pid); } + SYS_PREADV = 289 // { ssize_t|sys||preadv(int fd, const struct iovec *iovp, int iovcnt, int PAD, off_t offset); } + SYS_PWRITEV = 290 // { ssize_t|sys||pwritev(int fd, const struct iovec *iovp, int iovcnt, int PAD, off_t offset); } + SYS___GETCWD = 296 // { int|sys||__getcwd(char *bufp, size_t length); } + SYS_FCHROOT = 297 // { int|sys||fchroot(int fd); } + SYS_LCHFLAGS = 304 // { int|sys||lchflags(const char *path, u_long flags); } + SYS_ISSETUGID = 305 // { int|sys||issetugid(void); } + SYS_UTRACE = 306 // { int|sys||utrace(const char *label, void *addr, size_t len); } + SYS_GETCONTEXT = 307 // { int|sys||getcontext(struct __ucontext *ucp); } + SYS_SETCONTEXT = 308 // { int|sys||setcontext(const struct __ucontext *ucp); } + SYS__LWP_CREATE = 309 // { int|sys||_lwp_create(const struct __ucontext *ucp, u_long flags, lwpid_t *new_lwp); } + SYS__LWP_EXIT = 310 // { int|sys||_lwp_exit(void); } + SYS__LWP_SELF = 311 // { lwpid_t|sys||_lwp_self(void); } + SYS__LWP_WAIT = 312 // { int|sys||_lwp_wait(lwpid_t wait_for, lwpid_t *departed); } + SYS__LWP_SUSPEND = 313 // { int|sys||_lwp_suspend(lwpid_t target); } + SYS__LWP_CONTINUE = 314 // { int|sys||_lwp_continue(lwpid_t target); } + SYS__LWP_WAKEUP = 315 // { int|sys||_lwp_wakeup(lwpid_t target); } + SYS__LWP_GETPRIVATE = 316 // { void *|sys||_lwp_getprivate(void); } + SYS__LWP_SETPRIVATE = 317 // { void|sys||_lwp_setprivate(void *ptr); } + SYS__LWP_KILL = 318 // { int|sys||_lwp_kill(lwpid_t target, int signo); } + SYS__LWP_DETACH = 319 // { int|sys||_lwp_detach(lwpid_t target); } + SYS__LWP_UNPARK = 321 // { int|sys||_lwp_unpark(lwpid_t target, const void *hint); } + SYS__LWP_UNPARK_ALL = 322 // { ssize_t|sys||_lwp_unpark_all(const lwpid_t *targets, size_t ntargets, const void *hint); } + SYS__LWP_SETNAME = 323 // { int|sys||_lwp_setname(lwpid_t target, const char *name); } + SYS__LWP_GETNAME = 324 // { int|sys||_lwp_getname(lwpid_t target, char *name, size_t len); } + SYS__LWP_CTL = 325 // { int|sys||_lwp_ctl(int features, struct lwpctl **address); } + SYS___SIGACTION_SIGTRAMP = 340 // { int|sys||__sigaction_sigtramp(int signum, const struct sigaction *nsa, struct sigaction *osa, const void *tramp, int vers); } + SYS_PMC_GET_INFO = 341 // { int|sys||pmc_get_info(int ctr, int op, void *args); } + SYS_PMC_CONTROL = 342 // { int|sys||pmc_control(int ctr, int op, void *args); } + SYS_RASCTL = 343 // { int|sys||rasctl(void *addr, size_t len, int op); } + SYS_KQUEUE = 344 // { int|sys||kqueue(void); } + SYS__SCHED_SETPARAM = 346 // { int|sys||_sched_setparam(pid_t pid, lwpid_t lid, int policy, const struct sched_param *params); } + SYS__SCHED_GETPARAM = 347 // { int|sys||_sched_getparam(pid_t pid, lwpid_t lid, int *policy, struct sched_param *params); } + SYS__SCHED_SETAFFINITY = 348 // { int|sys||_sched_setaffinity(pid_t pid, lwpid_t lid, size_t size, const cpuset_t *cpuset); } + SYS__SCHED_GETAFFINITY = 349 // { int|sys||_sched_getaffinity(pid_t pid, lwpid_t lid, size_t size, cpuset_t *cpuset); } + SYS_SCHED_YIELD = 350 // { int|sys||sched_yield(void); } + SYS_FSYNC_RANGE = 354 // { int|sys||fsync_range(int fd, int flags, off_t start, off_t length); } + SYS_UUIDGEN = 355 // { int|sys||uuidgen(struct uuid *store, int count); } + SYS_GETVFSSTAT = 356 // { int|sys||getvfsstat(struct statvfs *buf, size_t bufsize, int flags); } + SYS_STATVFS1 = 357 // { int|sys||statvfs1(const char *path, struct statvfs *buf, int flags); } + SYS_FSTATVFS1 = 358 // { int|sys||fstatvfs1(int fd, struct statvfs *buf, int flags); } + SYS_EXTATTRCTL = 360 // { int|sys||extattrctl(const char *path, int cmd, const char *filename, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_FILE = 361 // { int|sys||extattr_set_file(const char *path, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } + SYS_EXTATTR_GET_FILE = 362 // { ssize_t|sys||extattr_get_file(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_FILE = 363 // { int|sys||extattr_delete_file(const char *path, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_FD = 364 // { int|sys||extattr_set_fd(int fd, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } + SYS_EXTATTR_GET_FD = 365 // { ssize_t|sys||extattr_get_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_FD = 366 // { int|sys||extattr_delete_fd(int fd, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_LINK = 367 // { int|sys||extattr_set_link(const char *path, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } + SYS_EXTATTR_GET_LINK = 368 // { ssize_t|sys||extattr_get_link(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_LINK = 369 // { int|sys||extattr_delete_link(const char *path, int attrnamespace, const char *attrname); } + SYS_EXTATTR_LIST_FD = 370 // { ssize_t|sys||extattr_list_fd(int fd, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_FILE = 371 // { ssize_t|sys||extattr_list_file(const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_LINK = 372 // { ssize_t|sys||extattr_list_link(const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_SETXATTR = 375 // { int|sys||setxattr(const char *path, const char *name, const void *value, size_t size, int flags); } + SYS_LSETXATTR = 376 // { int|sys||lsetxattr(const char *path, const char *name, const void *value, size_t size, int flags); } + SYS_FSETXATTR = 377 // { int|sys||fsetxattr(int fd, const char *name, const void *value, size_t size, int flags); } + SYS_GETXATTR = 378 // { int|sys||getxattr(const char *path, const char *name, void *value, size_t size); } + SYS_LGETXATTR = 379 // { int|sys||lgetxattr(const char *path, const char *name, void *value, size_t size); } + SYS_FGETXATTR = 380 // { int|sys||fgetxattr(int fd, const char *name, void *value, size_t size); } + SYS_LISTXATTR = 381 // { int|sys||listxattr(const char *path, char *list, size_t size); } + SYS_LLISTXATTR = 382 // { int|sys||llistxattr(const char *path, char *list, size_t size); } + SYS_FLISTXATTR = 383 // { int|sys||flistxattr(int fd, char *list, size_t size); } + SYS_REMOVEXATTR = 384 // { int|sys||removexattr(const char *path, const char *name); } + SYS_LREMOVEXATTR = 385 // { int|sys||lremovexattr(const char *path, const char *name); } + SYS_FREMOVEXATTR = 386 // { int|sys||fremovexattr(int fd, const char *name); } + SYS_GETDENTS = 390 // { int|sys|30|getdents(int fd, char *buf, size_t count); } + SYS_SOCKET = 394 // { int|sys|30|socket(int domain, int type, int protocol); } + SYS_GETFH = 395 // { int|sys|30|getfh(const char *fname, void *fhp, size_t *fh_size); } + SYS_MOUNT = 410 // { int|sys|50|mount(const char *type, const char *path, int flags, void *data, size_t data_len); } + SYS_MREMAP = 411 // { void *|sys||mremap(void *old_address, size_t old_size, void *new_address, size_t new_size, int flags); } + SYS_PSET_CREATE = 412 // { int|sys||pset_create(psetid_t *psid); } + SYS_PSET_DESTROY = 413 // { int|sys||pset_destroy(psetid_t psid); } + SYS_PSET_ASSIGN = 414 // { int|sys||pset_assign(psetid_t psid, cpuid_t cpuid, psetid_t *opsid); } + SYS__PSET_BIND = 415 // { int|sys||_pset_bind(idtype_t idtype, id_t first_id, id_t second_id, psetid_t psid, psetid_t *opsid); } + SYS_POSIX_FADVISE = 416 // { int|sys|50|posix_fadvise(int fd, int PAD, off_t offset, off_t len, int advice); } + SYS_SELECT = 417 // { int|sys|50|select(int nd, fd_set *in, fd_set *ou, fd_set *ex, struct timeval *tv); } + SYS_GETTIMEOFDAY = 418 // { int|sys|50|gettimeofday(struct timeval *tp, void *tzp); } + SYS_SETTIMEOFDAY = 419 // { int|sys|50|settimeofday(const struct timeval *tv, const void *tzp); } + SYS_UTIMES = 420 // { int|sys|50|utimes(const char *path, const struct timeval *tptr); } + SYS_ADJTIME = 421 // { int|sys|50|adjtime(const struct timeval *delta, struct timeval *olddelta); } + SYS_FUTIMES = 423 // { int|sys|50|futimes(int fd, const struct timeval *tptr); } + SYS_LUTIMES = 424 // { int|sys|50|lutimes(const char *path, const struct timeval *tptr); } + SYS_SETITIMER = 425 // { int|sys|50|setitimer(int which, const struct itimerval *itv, struct itimerval *oitv); } + SYS_GETITIMER = 426 // { int|sys|50|getitimer(int which, struct itimerval *itv); } + SYS_CLOCK_GETTIME = 427 // { int|sys|50|clock_gettime(clockid_t clock_id, struct timespec *tp); } + SYS_CLOCK_SETTIME = 428 // { int|sys|50|clock_settime(clockid_t clock_id, const struct timespec *tp); } + SYS_CLOCK_GETRES = 429 // { int|sys|50|clock_getres(clockid_t clock_id, struct timespec *tp); } + SYS_NANOSLEEP = 430 // { int|sys|50|nanosleep(const struct timespec *rqtp, struct timespec *rmtp); } + SYS___SIGTIMEDWAIT = 431 // { int|sys|50|__sigtimedwait(const sigset_t *set, siginfo_t *info, struct timespec *timeout); } + SYS__LWP_PARK = 434 // { int|sys|50|_lwp_park(const struct timespec *ts, lwpid_t unpark, const void *hint, const void *unparkhint); } + SYS_KEVENT = 435 // { int|sys|50|kevent(int fd, const struct kevent *changelist, size_t nchanges, struct kevent *eventlist, size_t nevents, const struct timespec *timeout); } + SYS_PSELECT = 436 // { int|sys|50|pselect(int nd, fd_set *in, fd_set *ou, fd_set *ex, const struct timespec *ts, const sigset_t *mask); } + SYS_POLLTS = 437 // { int|sys|50|pollts(struct pollfd *fds, u_int nfds, const struct timespec *ts, const sigset_t *mask); } + SYS_STAT = 439 // { int|sys|50|stat(const char *path, struct stat *ub); } + SYS_FSTAT = 440 // { int|sys|50|fstat(int fd, struct stat *sb); } + SYS_LSTAT = 441 // { int|sys|50|lstat(const char *path, struct stat *ub); } + SYS___SEMCTL = 442 // { int|sys|50|__semctl(int semid, int semnum, int cmd, ... union __semun *arg); } + SYS_SHMCTL = 443 // { int|sys|50|shmctl(int shmid, int cmd, struct shmid_ds *buf); } + SYS_MSGCTL = 444 // { int|sys|50|msgctl(int msqid, int cmd, struct msqid_ds *buf); } + SYS_GETRUSAGE = 445 // { int|sys|50|getrusage(int who, struct rusage *rusage); } + SYS_TIMER_SETTIME = 446 // { int|sys|50|timer_settime(timer_t timerid, int flags, const struct itimerspec *value, struct itimerspec *ovalue); } + SYS_TIMER_GETTIME = 447 // { int|sys|50|timer_gettime(timer_t timerid, struct itimerspec *value); } + SYS_NTP_GETTIME = 448 // { int|sys|50|ntp_gettime(struct ntptimeval *ntvp); } + SYS_WAIT4 = 449 // { int|sys|50|wait4(pid_t pid, int *status, int options, struct rusage *rusage); } + SYS_MKNOD = 450 // { int|sys|50|mknod(const char *path, mode_t mode, dev_t dev); } + SYS_FHSTAT = 451 // { int|sys|50|fhstat(const void *fhp, size_t fh_size, struct stat *sb); } + SYS_PIPE2 = 453 // { int|sys||pipe2(int *fildes, int flags); } + SYS_DUP3 = 454 // { int|sys||dup3(int from, int to, int flags); } + SYS_KQUEUE1 = 455 // { int|sys||kqueue1(int flags); } + SYS_PACCEPT = 456 // { int|sys||paccept(int s, struct sockaddr *name, socklen_t *anamelen, const sigset_t *mask, int flags); } + SYS_LINKAT = 457 // { int|sys||linkat(int fd1, const char *name1, int fd2, const char *name2, int flags); } + SYS_RENAMEAT = 458 // { int|sys||renameat(int fromfd, const char *from, int tofd, const char *to); } + SYS_MKFIFOAT = 459 // { int|sys||mkfifoat(int fd, const char *path, mode_t mode); } + SYS_MKNODAT = 460 // { int|sys||mknodat(int fd, const char *path, mode_t mode, uint32_t dev); } + SYS_MKDIRAT = 461 // { int|sys||mkdirat(int fd, const char *path, mode_t mode); } + SYS_FACCESSAT = 462 // { int|sys||faccessat(int fd, const char *path, int amode, int flag); } + SYS_FCHMODAT = 463 // { int|sys||fchmodat(int fd, const char *path, mode_t mode, int flag); } + SYS_FCHOWNAT = 464 // { int|sys||fchownat(int fd, const char *path, uid_t owner, gid_t group, int flag); } + SYS_FEXECVE = 465 // { int|sys||fexecve(int fd, char * const *argp, char * const *envp); } + SYS_FSTATAT = 466 // { int|sys||fstatat(int fd, const char *path, struct stat *buf, int flag); } + SYS_UTIMENSAT = 467 // { int|sys||utimensat(int fd, const char *path, const struct timespec *tptr, int flag); } + SYS_OPENAT = 468 // { int|sys||openat(int fd, const char *path, int oflags, ... mode_t mode); } + SYS_READLINKAT = 469 // { int|sys||readlinkat(int fd, const char *path, char *buf, size_t bufsize); } + SYS_SYMLINKAT = 470 // { int|sys||symlinkat(const char *path1, int fd, const char *path2); } + SYS_UNLINKAT = 471 // { int|sys||unlinkat(int fd, const char *path, int flag); } + SYS_FUTIMENS = 472 // { int|sys||futimens(int fd, const struct timespec *tptr); } + SYS___QUOTACTL = 473 // { int|sys||__quotactl(const char *path, struct quotactl_args *args); } + SYS_POSIX_SPAWN = 474 // { int|sys||posix_spawn(pid_t *pid, const char *path, const struct posix_spawn_file_actions *file_actions, const struct posix_spawnattr *attrp, char *const *argv, char *const *envp); } + SYS_RECVMMSG = 475 // { int|sys||recvmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags, struct timespec *timeout); } + SYS_SENDMMSG = 476 // { int|sys||sendmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags); } +) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_netbsd_amd64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_netbsd_amd64.go new file mode 100644 index 00000000..ddb25b94 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_netbsd_amd64.go @@ -0,0 +1,274 @@ +// mksysnum_netbsd.pl +// Code generated by the command above; DO NOT EDIT. + +// +build amd64,netbsd + +package unix + +const ( + SYS_EXIT = 1 // { void|sys||exit(int rval); } + SYS_FORK = 2 // { int|sys||fork(void); } + SYS_READ = 3 // { ssize_t|sys||read(int fd, void *buf, size_t nbyte); } + SYS_WRITE = 4 // { ssize_t|sys||write(int fd, const void *buf, size_t nbyte); } + SYS_OPEN = 5 // { int|sys||open(const char *path, int flags, ... mode_t mode); } + SYS_CLOSE = 6 // { int|sys||close(int fd); } + SYS_LINK = 9 // { int|sys||link(const char *path, const char *link); } + SYS_UNLINK = 10 // { int|sys||unlink(const char *path); } + SYS_CHDIR = 12 // { int|sys||chdir(const char *path); } + SYS_FCHDIR = 13 // { int|sys||fchdir(int fd); } + SYS_CHMOD = 15 // { int|sys||chmod(const char *path, mode_t mode); } + SYS_CHOWN = 16 // { int|sys||chown(const char *path, uid_t uid, gid_t gid); } + SYS_BREAK = 17 // { int|sys||obreak(char *nsize); } + SYS_GETPID = 20 // { pid_t|sys||getpid_with_ppid(void); } + SYS_UNMOUNT = 22 // { int|sys||unmount(const char *path, int flags); } + SYS_SETUID = 23 // { int|sys||setuid(uid_t uid); } + SYS_GETUID = 24 // { uid_t|sys||getuid_with_euid(void); } + SYS_GETEUID = 25 // { uid_t|sys||geteuid(void); } + SYS_PTRACE = 26 // { int|sys||ptrace(int req, pid_t pid, void *addr, int data); } + SYS_RECVMSG = 27 // { ssize_t|sys||recvmsg(int s, struct msghdr *msg, int flags); } + SYS_SENDMSG = 28 // { ssize_t|sys||sendmsg(int s, const struct msghdr *msg, int flags); } + SYS_RECVFROM = 29 // { ssize_t|sys||recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlenaddr); } + SYS_ACCEPT = 30 // { int|sys||accept(int s, struct sockaddr *name, socklen_t *anamelen); } + SYS_GETPEERNAME = 31 // { int|sys||getpeername(int fdes, struct sockaddr *asa, socklen_t *alen); } + SYS_GETSOCKNAME = 32 // { int|sys||getsockname(int fdes, struct sockaddr *asa, socklen_t *alen); } + SYS_ACCESS = 33 // { int|sys||access(const char *path, int flags); } + SYS_CHFLAGS = 34 // { int|sys||chflags(const char *path, u_long flags); } + SYS_FCHFLAGS = 35 // { int|sys||fchflags(int fd, u_long flags); } + SYS_SYNC = 36 // { void|sys||sync(void); } + SYS_KILL = 37 // { int|sys||kill(pid_t pid, int signum); } + SYS_GETPPID = 39 // { pid_t|sys||getppid(void); } + SYS_DUP = 41 // { int|sys||dup(int fd); } + SYS_PIPE = 42 // { int|sys||pipe(void); } + SYS_GETEGID = 43 // { gid_t|sys||getegid(void); } + SYS_PROFIL = 44 // { int|sys||profil(char *samples, size_t size, u_long offset, u_int scale); } + SYS_KTRACE = 45 // { int|sys||ktrace(const char *fname, int ops, int facs, pid_t pid); } + SYS_GETGID = 47 // { gid_t|sys||getgid_with_egid(void); } + SYS___GETLOGIN = 49 // { int|sys||__getlogin(char *namebuf, size_t namelen); } + SYS___SETLOGIN = 50 // { int|sys||__setlogin(const char *namebuf); } + SYS_ACCT = 51 // { int|sys||acct(const char *path); } + SYS_IOCTL = 54 // { int|sys||ioctl(int fd, u_long com, ... void *data); } + SYS_REVOKE = 56 // { int|sys||revoke(const char *path); } + SYS_SYMLINK = 57 // { int|sys||symlink(const char *path, const char *link); } + SYS_READLINK = 58 // { ssize_t|sys||readlink(const char *path, char *buf, size_t count); } + SYS_EXECVE = 59 // { int|sys||execve(const char *path, char * const *argp, char * const *envp); } + SYS_UMASK = 60 // { mode_t|sys||umask(mode_t newmask); } + SYS_CHROOT = 61 // { int|sys||chroot(const char *path); } + SYS_VFORK = 66 // { int|sys||vfork(void); } + SYS_SBRK = 69 // { int|sys||sbrk(intptr_t incr); } + SYS_SSTK = 70 // { int|sys||sstk(int incr); } + SYS_VADVISE = 72 // { int|sys||ovadvise(int anom); } + SYS_MUNMAP = 73 // { int|sys||munmap(void *addr, size_t len); } + SYS_MPROTECT = 74 // { int|sys||mprotect(void *addr, size_t len, int prot); } + SYS_MADVISE = 75 // { int|sys||madvise(void *addr, size_t len, int behav); } + SYS_MINCORE = 78 // { int|sys||mincore(void *addr, size_t len, char *vec); } + SYS_GETGROUPS = 79 // { int|sys||getgroups(int gidsetsize, gid_t *gidset); } + SYS_SETGROUPS = 80 // { int|sys||setgroups(int gidsetsize, const gid_t *gidset); } + SYS_GETPGRP = 81 // { int|sys||getpgrp(void); } + SYS_SETPGID = 82 // { int|sys||setpgid(pid_t pid, pid_t pgid); } + SYS_DUP2 = 90 // { int|sys||dup2(int from, int to); } + SYS_FCNTL = 92 // { int|sys||fcntl(int fd, int cmd, ... void *arg); } + SYS_FSYNC = 95 // { int|sys||fsync(int fd); } + SYS_SETPRIORITY = 96 // { int|sys||setpriority(int which, id_t who, int prio); } + SYS_CONNECT = 98 // { int|sys||connect(int s, const struct sockaddr *name, socklen_t namelen); } + SYS_GETPRIORITY = 100 // { int|sys||getpriority(int which, id_t who); } + SYS_BIND = 104 // { int|sys||bind(int s, const struct sockaddr *name, socklen_t namelen); } + SYS_SETSOCKOPT = 105 // { int|sys||setsockopt(int s, int level, int name, const void *val, socklen_t valsize); } + SYS_LISTEN = 106 // { int|sys||listen(int s, int backlog); } + SYS_GETSOCKOPT = 118 // { int|sys||getsockopt(int s, int level, int name, void *val, socklen_t *avalsize); } + SYS_READV = 120 // { ssize_t|sys||readv(int fd, const struct iovec *iovp, int iovcnt); } + SYS_WRITEV = 121 // { ssize_t|sys||writev(int fd, const struct iovec *iovp, int iovcnt); } + SYS_FCHOWN = 123 // { int|sys||fchown(int fd, uid_t uid, gid_t gid); } + SYS_FCHMOD = 124 // { int|sys||fchmod(int fd, mode_t mode); } + SYS_SETREUID = 126 // { int|sys||setreuid(uid_t ruid, uid_t euid); } + SYS_SETREGID = 127 // { int|sys||setregid(gid_t rgid, gid_t egid); } + SYS_RENAME = 128 // { int|sys||rename(const char *from, const char *to); } + SYS_FLOCK = 131 // { int|sys||flock(int fd, int how); } + SYS_MKFIFO = 132 // { int|sys||mkfifo(const char *path, mode_t mode); } + SYS_SENDTO = 133 // { ssize_t|sys||sendto(int s, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen); } + SYS_SHUTDOWN = 134 // { int|sys||shutdown(int s, int how); } + SYS_SOCKETPAIR = 135 // { int|sys||socketpair(int domain, int type, int protocol, int *rsv); } + SYS_MKDIR = 136 // { int|sys||mkdir(const char *path, mode_t mode); } + SYS_RMDIR = 137 // { int|sys||rmdir(const char *path); } + SYS_SETSID = 147 // { int|sys||setsid(void); } + SYS_SYSARCH = 165 // { int|sys||sysarch(int op, void *parms); } + SYS_PREAD = 173 // { ssize_t|sys||pread(int fd, void *buf, size_t nbyte, int PAD, off_t offset); } + SYS_PWRITE = 174 // { ssize_t|sys||pwrite(int fd, const void *buf, size_t nbyte, int PAD, off_t offset); } + SYS_NTP_ADJTIME = 176 // { int|sys||ntp_adjtime(struct timex *tp); } + SYS_SETGID = 181 // { int|sys||setgid(gid_t gid); } + SYS_SETEGID = 182 // { int|sys||setegid(gid_t egid); } + SYS_SETEUID = 183 // { int|sys||seteuid(uid_t euid); } + SYS_PATHCONF = 191 // { long|sys||pathconf(const char *path, int name); } + SYS_FPATHCONF = 192 // { long|sys||fpathconf(int fd, int name); } + SYS_GETRLIMIT = 194 // { int|sys||getrlimit(int which, struct rlimit *rlp); } + SYS_SETRLIMIT = 195 // { int|sys||setrlimit(int which, const struct rlimit *rlp); } + SYS_MMAP = 197 // { void *|sys||mmap(void *addr, size_t len, int prot, int flags, int fd, long PAD, off_t pos); } + SYS_LSEEK = 199 // { off_t|sys||lseek(int fd, int PAD, off_t offset, int whence); } + SYS_TRUNCATE = 200 // { int|sys||truncate(const char *path, int PAD, off_t length); } + SYS_FTRUNCATE = 201 // { int|sys||ftruncate(int fd, int PAD, off_t length); } + SYS___SYSCTL = 202 // { int|sys||__sysctl(const int *name, u_int namelen, void *old, size_t *oldlenp, const void *new, size_t newlen); } + SYS_MLOCK = 203 // { int|sys||mlock(const void *addr, size_t len); } + SYS_MUNLOCK = 204 // { int|sys||munlock(const void *addr, size_t len); } + SYS_UNDELETE = 205 // { int|sys||undelete(const char *path); } + SYS_GETPGID = 207 // { pid_t|sys||getpgid(pid_t pid); } + SYS_REBOOT = 208 // { int|sys||reboot(int opt, char *bootstr); } + SYS_POLL = 209 // { int|sys||poll(struct pollfd *fds, u_int nfds, int timeout); } + SYS_SEMGET = 221 // { int|sys||semget(key_t key, int nsems, int semflg); } + SYS_SEMOP = 222 // { int|sys||semop(int semid, struct sembuf *sops, size_t nsops); } + SYS_SEMCONFIG = 223 // { int|sys||semconfig(int flag); } + SYS_MSGGET = 225 // { int|sys||msgget(key_t key, int msgflg); } + SYS_MSGSND = 226 // { int|sys||msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); } + SYS_MSGRCV = 227 // { ssize_t|sys||msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); } + SYS_SHMAT = 228 // { void *|sys||shmat(int shmid, const void *shmaddr, int shmflg); } + SYS_SHMDT = 230 // { int|sys||shmdt(const void *shmaddr); } + SYS_SHMGET = 231 // { int|sys||shmget(key_t key, size_t size, int shmflg); } + SYS_TIMER_CREATE = 235 // { int|sys||timer_create(clockid_t clock_id, struct sigevent *evp, timer_t *timerid); } + SYS_TIMER_DELETE = 236 // { int|sys||timer_delete(timer_t timerid); } + SYS_TIMER_GETOVERRUN = 239 // { int|sys||timer_getoverrun(timer_t timerid); } + SYS_FDATASYNC = 241 // { int|sys||fdatasync(int fd); } + SYS_MLOCKALL = 242 // { int|sys||mlockall(int flags); } + SYS_MUNLOCKALL = 243 // { int|sys||munlockall(void); } + SYS_SIGQUEUEINFO = 245 // { int|sys||sigqueueinfo(pid_t pid, const siginfo_t *info); } + SYS_MODCTL = 246 // { int|sys||modctl(int cmd, void *arg); } + SYS___POSIX_RENAME = 270 // { int|sys||__posix_rename(const char *from, const char *to); } + SYS_SWAPCTL = 271 // { int|sys||swapctl(int cmd, void *arg, int misc); } + SYS_MINHERIT = 273 // { int|sys||minherit(void *addr, size_t len, int inherit); } + SYS_LCHMOD = 274 // { int|sys||lchmod(const char *path, mode_t mode); } + SYS_LCHOWN = 275 // { int|sys||lchown(const char *path, uid_t uid, gid_t gid); } + SYS_MSYNC = 277 // { int|sys|13|msync(void *addr, size_t len, int flags); } + SYS___POSIX_CHOWN = 283 // { int|sys||__posix_chown(const char *path, uid_t uid, gid_t gid); } + SYS___POSIX_FCHOWN = 284 // { int|sys||__posix_fchown(int fd, uid_t uid, gid_t gid); } + SYS___POSIX_LCHOWN = 285 // { int|sys||__posix_lchown(const char *path, uid_t uid, gid_t gid); } + SYS_GETSID = 286 // { pid_t|sys||getsid(pid_t pid); } + SYS___CLONE = 287 // { pid_t|sys||__clone(int flags, void *stack); } + SYS_FKTRACE = 288 // { int|sys||fktrace(int fd, int ops, int facs, pid_t pid); } + SYS_PREADV = 289 // { ssize_t|sys||preadv(int fd, const struct iovec *iovp, int iovcnt, int PAD, off_t offset); } + SYS_PWRITEV = 290 // { ssize_t|sys||pwritev(int fd, const struct iovec *iovp, int iovcnt, int PAD, off_t offset); } + SYS___GETCWD = 296 // { int|sys||__getcwd(char *bufp, size_t length); } + SYS_FCHROOT = 297 // { int|sys||fchroot(int fd); } + SYS_LCHFLAGS = 304 // { int|sys||lchflags(const char *path, u_long flags); } + SYS_ISSETUGID = 305 // { int|sys||issetugid(void); } + SYS_UTRACE = 306 // { int|sys||utrace(const char *label, void *addr, size_t len); } + SYS_GETCONTEXT = 307 // { int|sys||getcontext(struct __ucontext *ucp); } + SYS_SETCONTEXT = 308 // { int|sys||setcontext(const struct __ucontext *ucp); } + SYS__LWP_CREATE = 309 // { int|sys||_lwp_create(const struct __ucontext *ucp, u_long flags, lwpid_t *new_lwp); } + SYS__LWP_EXIT = 310 // { int|sys||_lwp_exit(void); } + SYS__LWP_SELF = 311 // { lwpid_t|sys||_lwp_self(void); } + SYS__LWP_WAIT = 312 // { int|sys||_lwp_wait(lwpid_t wait_for, lwpid_t *departed); } + SYS__LWP_SUSPEND = 313 // { int|sys||_lwp_suspend(lwpid_t target); } + SYS__LWP_CONTINUE = 314 // { int|sys||_lwp_continue(lwpid_t target); } + SYS__LWP_WAKEUP = 315 // { int|sys||_lwp_wakeup(lwpid_t target); } + SYS__LWP_GETPRIVATE = 316 // { void *|sys||_lwp_getprivate(void); } + SYS__LWP_SETPRIVATE = 317 // { void|sys||_lwp_setprivate(void *ptr); } + SYS__LWP_KILL = 318 // { int|sys||_lwp_kill(lwpid_t target, int signo); } + SYS__LWP_DETACH = 319 // { int|sys||_lwp_detach(lwpid_t target); } + SYS__LWP_UNPARK = 321 // { int|sys||_lwp_unpark(lwpid_t target, const void *hint); } + SYS__LWP_UNPARK_ALL = 322 // { ssize_t|sys||_lwp_unpark_all(const lwpid_t *targets, size_t ntargets, const void *hint); } + SYS__LWP_SETNAME = 323 // { int|sys||_lwp_setname(lwpid_t target, const char *name); } + SYS__LWP_GETNAME = 324 // { int|sys||_lwp_getname(lwpid_t target, char *name, size_t len); } + SYS__LWP_CTL = 325 // { int|sys||_lwp_ctl(int features, struct lwpctl **address); } + SYS___SIGACTION_SIGTRAMP = 340 // { int|sys||__sigaction_sigtramp(int signum, const struct sigaction *nsa, struct sigaction *osa, const void *tramp, int vers); } + SYS_PMC_GET_INFO = 341 // { int|sys||pmc_get_info(int ctr, int op, void *args); } + SYS_PMC_CONTROL = 342 // { int|sys||pmc_control(int ctr, int op, void *args); } + SYS_RASCTL = 343 // { int|sys||rasctl(void *addr, size_t len, int op); } + SYS_KQUEUE = 344 // { int|sys||kqueue(void); } + SYS__SCHED_SETPARAM = 346 // { int|sys||_sched_setparam(pid_t pid, lwpid_t lid, int policy, const struct sched_param *params); } + SYS__SCHED_GETPARAM = 347 // { int|sys||_sched_getparam(pid_t pid, lwpid_t lid, int *policy, struct sched_param *params); } + SYS__SCHED_SETAFFINITY = 348 // { int|sys||_sched_setaffinity(pid_t pid, lwpid_t lid, size_t size, const cpuset_t *cpuset); } + SYS__SCHED_GETAFFINITY = 349 // { int|sys||_sched_getaffinity(pid_t pid, lwpid_t lid, size_t size, cpuset_t *cpuset); } + SYS_SCHED_YIELD = 350 // { int|sys||sched_yield(void); } + SYS_FSYNC_RANGE = 354 // { int|sys||fsync_range(int fd, int flags, off_t start, off_t length); } + SYS_UUIDGEN = 355 // { int|sys||uuidgen(struct uuid *store, int count); } + SYS_GETVFSSTAT = 356 // { int|sys||getvfsstat(struct statvfs *buf, size_t bufsize, int flags); } + SYS_STATVFS1 = 357 // { int|sys||statvfs1(const char *path, struct statvfs *buf, int flags); } + SYS_FSTATVFS1 = 358 // { int|sys||fstatvfs1(int fd, struct statvfs *buf, int flags); } + SYS_EXTATTRCTL = 360 // { int|sys||extattrctl(const char *path, int cmd, const char *filename, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_FILE = 361 // { int|sys||extattr_set_file(const char *path, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } + SYS_EXTATTR_GET_FILE = 362 // { ssize_t|sys||extattr_get_file(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_FILE = 363 // { int|sys||extattr_delete_file(const char *path, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_FD = 364 // { int|sys||extattr_set_fd(int fd, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } + SYS_EXTATTR_GET_FD = 365 // { ssize_t|sys||extattr_get_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_FD = 366 // { int|sys||extattr_delete_fd(int fd, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_LINK = 367 // { int|sys||extattr_set_link(const char *path, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } + SYS_EXTATTR_GET_LINK = 368 // { ssize_t|sys||extattr_get_link(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_LINK = 369 // { int|sys||extattr_delete_link(const char *path, int attrnamespace, const char *attrname); } + SYS_EXTATTR_LIST_FD = 370 // { ssize_t|sys||extattr_list_fd(int fd, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_FILE = 371 // { ssize_t|sys||extattr_list_file(const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_LINK = 372 // { ssize_t|sys||extattr_list_link(const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_SETXATTR = 375 // { int|sys||setxattr(const char *path, const char *name, const void *value, size_t size, int flags); } + SYS_LSETXATTR = 376 // { int|sys||lsetxattr(const char *path, const char *name, const void *value, size_t size, int flags); } + SYS_FSETXATTR = 377 // { int|sys||fsetxattr(int fd, const char *name, const void *value, size_t size, int flags); } + SYS_GETXATTR = 378 // { int|sys||getxattr(const char *path, const char *name, void *value, size_t size); } + SYS_LGETXATTR = 379 // { int|sys||lgetxattr(const char *path, const char *name, void *value, size_t size); } + SYS_FGETXATTR = 380 // { int|sys||fgetxattr(int fd, const char *name, void *value, size_t size); } + SYS_LISTXATTR = 381 // { int|sys||listxattr(const char *path, char *list, size_t size); } + SYS_LLISTXATTR = 382 // { int|sys||llistxattr(const char *path, char *list, size_t size); } + SYS_FLISTXATTR = 383 // { int|sys||flistxattr(int fd, char *list, size_t size); } + SYS_REMOVEXATTR = 384 // { int|sys||removexattr(const char *path, const char *name); } + SYS_LREMOVEXATTR = 385 // { int|sys||lremovexattr(const char *path, const char *name); } + SYS_FREMOVEXATTR = 386 // { int|sys||fremovexattr(int fd, const char *name); } + SYS_GETDENTS = 390 // { int|sys|30|getdents(int fd, char *buf, size_t count); } + SYS_SOCKET = 394 // { int|sys|30|socket(int domain, int type, int protocol); } + SYS_GETFH = 395 // { int|sys|30|getfh(const char *fname, void *fhp, size_t *fh_size); } + SYS_MOUNT = 410 // { int|sys|50|mount(const char *type, const char *path, int flags, void *data, size_t data_len); } + SYS_MREMAP = 411 // { void *|sys||mremap(void *old_address, size_t old_size, void *new_address, size_t new_size, int flags); } + SYS_PSET_CREATE = 412 // { int|sys||pset_create(psetid_t *psid); } + SYS_PSET_DESTROY = 413 // { int|sys||pset_destroy(psetid_t psid); } + SYS_PSET_ASSIGN = 414 // { int|sys||pset_assign(psetid_t psid, cpuid_t cpuid, psetid_t *opsid); } + SYS__PSET_BIND = 415 // { int|sys||_pset_bind(idtype_t idtype, id_t first_id, id_t second_id, psetid_t psid, psetid_t *opsid); } + SYS_POSIX_FADVISE = 416 // { int|sys|50|posix_fadvise(int fd, int PAD, off_t offset, off_t len, int advice); } + SYS_SELECT = 417 // { int|sys|50|select(int nd, fd_set *in, fd_set *ou, fd_set *ex, struct timeval *tv); } + SYS_GETTIMEOFDAY = 418 // { int|sys|50|gettimeofday(struct timeval *tp, void *tzp); } + SYS_SETTIMEOFDAY = 419 // { int|sys|50|settimeofday(const struct timeval *tv, const void *tzp); } + SYS_UTIMES = 420 // { int|sys|50|utimes(const char *path, const struct timeval *tptr); } + SYS_ADJTIME = 421 // { int|sys|50|adjtime(const struct timeval *delta, struct timeval *olddelta); } + SYS_FUTIMES = 423 // { int|sys|50|futimes(int fd, const struct timeval *tptr); } + SYS_LUTIMES = 424 // { int|sys|50|lutimes(const char *path, const struct timeval *tptr); } + SYS_SETITIMER = 425 // { int|sys|50|setitimer(int which, const struct itimerval *itv, struct itimerval *oitv); } + SYS_GETITIMER = 426 // { int|sys|50|getitimer(int which, struct itimerval *itv); } + SYS_CLOCK_GETTIME = 427 // { int|sys|50|clock_gettime(clockid_t clock_id, struct timespec *tp); } + SYS_CLOCK_SETTIME = 428 // { int|sys|50|clock_settime(clockid_t clock_id, const struct timespec *tp); } + SYS_CLOCK_GETRES = 429 // { int|sys|50|clock_getres(clockid_t clock_id, struct timespec *tp); } + SYS_NANOSLEEP = 430 // { int|sys|50|nanosleep(const struct timespec *rqtp, struct timespec *rmtp); } + SYS___SIGTIMEDWAIT = 431 // { int|sys|50|__sigtimedwait(const sigset_t *set, siginfo_t *info, struct timespec *timeout); } + SYS__LWP_PARK = 434 // { int|sys|50|_lwp_park(const struct timespec *ts, lwpid_t unpark, const void *hint, const void *unparkhint); } + SYS_KEVENT = 435 // { int|sys|50|kevent(int fd, const struct kevent *changelist, size_t nchanges, struct kevent *eventlist, size_t nevents, const struct timespec *timeout); } + SYS_PSELECT = 436 // { int|sys|50|pselect(int nd, fd_set *in, fd_set *ou, fd_set *ex, const struct timespec *ts, const sigset_t *mask); } + SYS_POLLTS = 437 // { int|sys|50|pollts(struct pollfd *fds, u_int nfds, const struct timespec *ts, const sigset_t *mask); } + SYS_STAT = 439 // { int|sys|50|stat(const char *path, struct stat *ub); } + SYS_FSTAT = 440 // { int|sys|50|fstat(int fd, struct stat *sb); } + SYS_LSTAT = 441 // { int|sys|50|lstat(const char *path, struct stat *ub); } + SYS___SEMCTL = 442 // { int|sys|50|__semctl(int semid, int semnum, int cmd, ... union __semun *arg); } + SYS_SHMCTL = 443 // { int|sys|50|shmctl(int shmid, int cmd, struct shmid_ds *buf); } + SYS_MSGCTL = 444 // { int|sys|50|msgctl(int msqid, int cmd, struct msqid_ds *buf); } + SYS_GETRUSAGE = 445 // { int|sys|50|getrusage(int who, struct rusage *rusage); } + SYS_TIMER_SETTIME = 446 // { int|sys|50|timer_settime(timer_t timerid, int flags, const struct itimerspec *value, struct itimerspec *ovalue); } + SYS_TIMER_GETTIME = 447 // { int|sys|50|timer_gettime(timer_t timerid, struct itimerspec *value); } + SYS_NTP_GETTIME = 448 // { int|sys|50|ntp_gettime(struct ntptimeval *ntvp); } + SYS_WAIT4 = 449 // { int|sys|50|wait4(pid_t pid, int *status, int options, struct rusage *rusage); } + SYS_MKNOD = 450 // { int|sys|50|mknod(const char *path, mode_t mode, dev_t dev); } + SYS_FHSTAT = 451 // { int|sys|50|fhstat(const void *fhp, size_t fh_size, struct stat *sb); } + SYS_PIPE2 = 453 // { int|sys||pipe2(int *fildes, int flags); } + SYS_DUP3 = 454 // { int|sys||dup3(int from, int to, int flags); } + SYS_KQUEUE1 = 455 // { int|sys||kqueue1(int flags); } + SYS_PACCEPT = 456 // { int|sys||paccept(int s, struct sockaddr *name, socklen_t *anamelen, const sigset_t *mask, int flags); } + SYS_LINKAT = 457 // { int|sys||linkat(int fd1, const char *name1, int fd2, const char *name2, int flags); } + SYS_RENAMEAT = 458 // { int|sys||renameat(int fromfd, const char *from, int tofd, const char *to); } + SYS_MKFIFOAT = 459 // { int|sys||mkfifoat(int fd, const char *path, mode_t mode); } + SYS_MKNODAT = 460 // { int|sys||mknodat(int fd, const char *path, mode_t mode, uint32_t dev); } + SYS_MKDIRAT = 461 // { int|sys||mkdirat(int fd, const char *path, mode_t mode); } + SYS_FACCESSAT = 462 // { int|sys||faccessat(int fd, const char *path, int amode, int flag); } + SYS_FCHMODAT = 463 // { int|sys||fchmodat(int fd, const char *path, mode_t mode, int flag); } + SYS_FCHOWNAT = 464 // { int|sys||fchownat(int fd, const char *path, uid_t owner, gid_t group, int flag); } + SYS_FEXECVE = 465 // { int|sys||fexecve(int fd, char * const *argp, char * const *envp); } + SYS_FSTATAT = 466 // { int|sys||fstatat(int fd, const char *path, struct stat *buf, int flag); } + SYS_UTIMENSAT = 467 // { int|sys||utimensat(int fd, const char *path, const struct timespec *tptr, int flag); } + SYS_OPENAT = 468 // { int|sys||openat(int fd, const char *path, int oflags, ... mode_t mode); } + SYS_READLINKAT = 469 // { int|sys||readlinkat(int fd, const char *path, char *buf, size_t bufsize); } + SYS_SYMLINKAT = 470 // { int|sys||symlinkat(const char *path1, int fd, const char *path2); } + SYS_UNLINKAT = 471 // { int|sys||unlinkat(int fd, const char *path, int flag); } + SYS_FUTIMENS = 472 // { int|sys||futimens(int fd, const struct timespec *tptr); } + SYS___QUOTACTL = 473 // { int|sys||__quotactl(const char *path, struct quotactl_args *args); } + SYS_POSIX_SPAWN = 474 // { int|sys||posix_spawn(pid_t *pid, const char *path, const struct posix_spawn_file_actions *file_actions, const struct posix_spawnattr *attrp, char *const *argv, char *const *envp); } + SYS_RECVMMSG = 475 // { int|sys||recvmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags, struct timespec *timeout); } + SYS_SENDMMSG = 476 // { int|sys||sendmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags); } +) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm.go new file mode 100644 index 00000000..315bd63f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm.go @@ -0,0 +1,274 @@ +// mksysnum_netbsd.pl +// Code generated by the command above; DO NOT EDIT. + +// +build arm,netbsd + +package unix + +const ( + SYS_EXIT = 1 // { void|sys||exit(int rval); } + SYS_FORK = 2 // { int|sys||fork(void); } + SYS_READ = 3 // { ssize_t|sys||read(int fd, void *buf, size_t nbyte); } + SYS_WRITE = 4 // { ssize_t|sys||write(int fd, const void *buf, size_t nbyte); } + SYS_OPEN = 5 // { int|sys||open(const char *path, int flags, ... mode_t mode); } + SYS_CLOSE = 6 // { int|sys||close(int fd); } + SYS_LINK = 9 // { int|sys||link(const char *path, const char *link); } + SYS_UNLINK = 10 // { int|sys||unlink(const char *path); } + SYS_CHDIR = 12 // { int|sys||chdir(const char *path); } + SYS_FCHDIR = 13 // { int|sys||fchdir(int fd); } + SYS_CHMOD = 15 // { int|sys||chmod(const char *path, mode_t mode); } + SYS_CHOWN = 16 // { int|sys||chown(const char *path, uid_t uid, gid_t gid); } + SYS_BREAK = 17 // { int|sys||obreak(char *nsize); } + SYS_GETPID = 20 // { pid_t|sys||getpid_with_ppid(void); } + SYS_UNMOUNT = 22 // { int|sys||unmount(const char *path, int flags); } + SYS_SETUID = 23 // { int|sys||setuid(uid_t uid); } + SYS_GETUID = 24 // { uid_t|sys||getuid_with_euid(void); } + SYS_GETEUID = 25 // { uid_t|sys||geteuid(void); } + SYS_PTRACE = 26 // { int|sys||ptrace(int req, pid_t pid, void *addr, int data); } + SYS_RECVMSG = 27 // { ssize_t|sys||recvmsg(int s, struct msghdr *msg, int flags); } + SYS_SENDMSG = 28 // { ssize_t|sys||sendmsg(int s, const struct msghdr *msg, int flags); } + SYS_RECVFROM = 29 // { ssize_t|sys||recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlenaddr); } + SYS_ACCEPT = 30 // { int|sys||accept(int s, struct sockaddr *name, socklen_t *anamelen); } + SYS_GETPEERNAME = 31 // { int|sys||getpeername(int fdes, struct sockaddr *asa, socklen_t *alen); } + SYS_GETSOCKNAME = 32 // { int|sys||getsockname(int fdes, struct sockaddr *asa, socklen_t *alen); } + SYS_ACCESS = 33 // { int|sys||access(const char *path, int flags); } + SYS_CHFLAGS = 34 // { int|sys||chflags(const char *path, u_long flags); } + SYS_FCHFLAGS = 35 // { int|sys||fchflags(int fd, u_long flags); } + SYS_SYNC = 36 // { void|sys||sync(void); } + SYS_KILL = 37 // { int|sys||kill(pid_t pid, int signum); } + SYS_GETPPID = 39 // { pid_t|sys||getppid(void); } + SYS_DUP = 41 // { int|sys||dup(int fd); } + SYS_PIPE = 42 // { int|sys||pipe(void); } + SYS_GETEGID = 43 // { gid_t|sys||getegid(void); } + SYS_PROFIL = 44 // { int|sys||profil(char *samples, size_t size, u_long offset, u_int scale); } + SYS_KTRACE = 45 // { int|sys||ktrace(const char *fname, int ops, int facs, pid_t pid); } + SYS_GETGID = 47 // { gid_t|sys||getgid_with_egid(void); } + SYS___GETLOGIN = 49 // { int|sys||__getlogin(char *namebuf, size_t namelen); } + SYS___SETLOGIN = 50 // { int|sys||__setlogin(const char *namebuf); } + SYS_ACCT = 51 // { int|sys||acct(const char *path); } + SYS_IOCTL = 54 // { int|sys||ioctl(int fd, u_long com, ... void *data); } + SYS_REVOKE = 56 // { int|sys||revoke(const char *path); } + SYS_SYMLINK = 57 // { int|sys||symlink(const char *path, const char *link); } + SYS_READLINK = 58 // { ssize_t|sys||readlink(const char *path, char *buf, size_t count); } + SYS_EXECVE = 59 // { int|sys||execve(const char *path, char * const *argp, char * const *envp); } + SYS_UMASK = 60 // { mode_t|sys||umask(mode_t newmask); } + SYS_CHROOT = 61 // { int|sys||chroot(const char *path); } + SYS_VFORK = 66 // { int|sys||vfork(void); } + SYS_SBRK = 69 // { int|sys||sbrk(intptr_t incr); } + SYS_SSTK = 70 // { int|sys||sstk(int incr); } + SYS_VADVISE = 72 // { int|sys||ovadvise(int anom); } + SYS_MUNMAP = 73 // { int|sys||munmap(void *addr, size_t len); } + SYS_MPROTECT = 74 // { int|sys||mprotect(void *addr, size_t len, int prot); } + SYS_MADVISE = 75 // { int|sys||madvise(void *addr, size_t len, int behav); } + SYS_MINCORE = 78 // { int|sys||mincore(void *addr, size_t len, char *vec); } + SYS_GETGROUPS = 79 // { int|sys||getgroups(int gidsetsize, gid_t *gidset); } + SYS_SETGROUPS = 80 // { int|sys||setgroups(int gidsetsize, const gid_t *gidset); } + SYS_GETPGRP = 81 // { int|sys||getpgrp(void); } + SYS_SETPGID = 82 // { int|sys||setpgid(pid_t pid, pid_t pgid); } + SYS_DUP2 = 90 // { int|sys||dup2(int from, int to); } + SYS_FCNTL = 92 // { int|sys||fcntl(int fd, int cmd, ... void *arg); } + SYS_FSYNC = 95 // { int|sys||fsync(int fd); } + SYS_SETPRIORITY = 96 // { int|sys||setpriority(int which, id_t who, int prio); } + SYS_CONNECT = 98 // { int|sys||connect(int s, const struct sockaddr *name, socklen_t namelen); } + SYS_GETPRIORITY = 100 // { int|sys||getpriority(int which, id_t who); } + SYS_BIND = 104 // { int|sys||bind(int s, const struct sockaddr *name, socklen_t namelen); } + SYS_SETSOCKOPT = 105 // { int|sys||setsockopt(int s, int level, int name, const void *val, socklen_t valsize); } + SYS_LISTEN = 106 // { int|sys||listen(int s, int backlog); } + SYS_GETSOCKOPT = 118 // { int|sys||getsockopt(int s, int level, int name, void *val, socklen_t *avalsize); } + SYS_READV = 120 // { ssize_t|sys||readv(int fd, const struct iovec *iovp, int iovcnt); } + SYS_WRITEV = 121 // { ssize_t|sys||writev(int fd, const struct iovec *iovp, int iovcnt); } + SYS_FCHOWN = 123 // { int|sys||fchown(int fd, uid_t uid, gid_t gid); } + SYS_FCHMOD = 124 // { int|sys||fchmod(int fd, mode_t mode); } + SYS_SETREUID = 126 // { int|sys||setreuid(uid_t ruid, uid_t euid); } + SYS_SETREGID = 127 // { int|sys||setregid(gid_t rgid, gid_t egid); } + SYS_RENAME = 128 // { int|sys||rename(const char *from, const char *to); } + SYS_FLOCK = 131 // { int|sys||flock(int fd, int how); } + SYS_MKFIFO = 132 // { int|sys||mkfifo(const char *path, mode_t mode); } + SYS_SENDTO = 133 // { ssize_t|sys||sendto(int s, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen); } + SYS_SHUTDOWN = 134 // { int|sys||shutdown(int s, int how); } + SYS_SOCKETPAIR = 135 // { int|sys||socketpair(int domain, int type, int protocol, int *rsv); } + SYS_MKDIR = 136 // { int|sys||mkdir(const char *path, mode_t mode); } + SYS_RMDIR = 137 // { int|sys||rmdir(const char *path); } + SYS_SETSID = 147 // { int|sys||setsid(void); } + SYS_SYSARCH = 165 // { int|sys||sysarch(int op, void *parms); } + SYS_PREAD = 173 // { ssize_t|sys||pread(int fd, void *buf, size_t nbyte, int PAD, off_t offset); } + SYS_PWRITE = 174 // { ssize_t|sys||pwrite(int fd, const void *buf, size_t nbyte, int PAD, off_t offset); } + SYS_NTP_ADJTIME = 176 // { int|sys||ntp_adjtime(struct timex *tp); } + SYS_SETGID = 181 // { int|sys||setgid(gid_t gid); } + SYS_SETEGID = 182 // { int|sys||setegid(gid_t egid); } + SYS_SETEUID = 183 // { int|sys||seteuid(uid_t euid); } + SYS_PATHCONF = 191 // { long|sys||pathconf(const char *path, int name); } + SYS_FPATHCONF = 192 // { long|sys||fpathconf(int fd, int name); } + SYS_GETRLIMIT = 194 // { int|sys||getrlimit(int which, struct rlimit *rlp); } + SYS_SETRLIMIT = 195 // { int|sys||setrlimit(int which, const struct rlimit *rlp); } + SYS_MMAP = 197 // { void *|sys||mmap(void *addr, size_t len, int prot, int flags, int fd, long PAD, off_t pos); } + SYS_LSEEK = 199 // { off_t|sys||lseek(int fd, int PAD, off_t offset, int whence); } + SYS_TRUNCATE = 200 // { int|sys||truncate(const char *path, int PAD, off_t length); } + SYS_FTRUNCATE = 201 // { int|sys||ftruncate(int fd, int PAD, off_t length); } + SYS___SYSCTL = 202 // { int|sys||__sysctl(const int *name, u_int namelen, void *old, size_t *oldlenp, const void *new, size_t newlen); } + SYS_MLOCK = 203 // { int|sys||mlock(const void *addr, size_t len); } + SYS_MUNLOCK = 204 // { int|sys||munlock(const void *addr, size_t len); } + SYS_UNDELETE = 205 // { int|sys||undelete(const char *path); } + SYS_GETPGID = 207 // { pid_t|sys||getpgid(pid_t pid); } + SYS_REBOOT = 208 // { int|sys||reboot(int opt, char *bootstr); } + SYS_POLL = 209 // { int|sys||poll(struct pollfd *fds, u_int nfds, int timeout); } + SYS_SEMGET = 221 // { int|sys||semget(key_t key, int nsems, int semflg); } + SYS_SEMOP = 222 // { int|sys||semop(int semid, struct sembuf *sops, size_t nsops); } + SYS_SEMCONFIG = 223 // { int|sys||semconfig(int flag); } + SYS_MSGGET = 225 // { int|sys||msgget(key_t key, int msgflg); } + SYS_MSGSND = 226 // { int|sys||msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); } + SYS_MSGRCV = 227 // { ssize_t|sys||msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); } + SYS_SHMAT = 228 // { void *|sys||shmat(int shmid, const void *shmaddr, int shmflg); } + SYS_SHMDT = 230 // { int|sys||shmdt(const void *shmaddr); } + SYS_SHMGET = 231 // { int|sys||shmget(key_t key, size_t size, int shmflg); } + SYS_TIMER_CREATE = 235 // { int|sys||timer_create(clockid_t clock_id, struct sigevent *evp, timer_t *timerid); } + SYS_TIMER_DELETE = 236 // { int|sys||timer_delete(timer_t timerid); } + SYS_TIMER_GETOVERRUN = 239 // { int|sys||timer_getoverrun(timer_t timerid); } + SYS_FDATASYNC = 241 // { int|sys||fdatasync(int fd); } + SYS_MLOCKALL = 242 // { int|sys||mlockall(int flags); } + SYS_MUNLOCKALL = 243 // { int|sys||munlockall(void); } + SYS_SIGQUEUEINFO = 245 // { int|sys||sigqueueinfo(pid_t pid, const siginfo_t *info); } + SYS_MODCTL = 246 // { int|sys||modctl(int cmd, void *arg); } + SYS___POSIX_RENAME = 270 // { int|sys||__posix_rename(const char *from, const char *to); } + SYS_SWAPCTL = 271 // { int|sys||swapctl(int cmd, void *arg, int misc); } + SYS_MINHERIT = 273 // { int|sys||minherit(void *addr, size_t len, int inherit); } + SYS_LCHMOD = 274 // { int|sys||lchmod(const char *path, mode_t mode); } + SYS_LCHOWN = 275 // { int|sys||lchown(const char *path, uid_t uid, gid_t gid); } + SYS_MSYNC = 277 // { int|sys|13|msync(void *addr, size_t len, int flags); } + SYS___POSIX_CHOWN = 283 // { int|sys||__posix_chown(const char *path, uid_t uid, gid_t gid); } + SYS___POSIX_FCHOWN = 284 // { int|sys||__posix_fchown(int fd, uid_t uid, gid_t gid); } + SYS___POSIX_LCHOWN = 285 // { int|sys||__posix_lchown(const char *path, uid_t uid, gid_t gid); } + SYS_GETSID = 286 // { pid_t|sys||getsid(pid_t pid); } + SYS___CLONE = 287 // { pid_t|sys||__clone(int flags, void *stack); } + SYS_FKTRACE = 288 // { int|sys||fktrace(int fd, int ops, int facs, pid_t pid); } + SYS_PREADV = 289 // { ssize_t|sys||preadv(int fd, const struct iovec *iovp, int iovcnt, int PAD, off_t offset); } + SYS_PWRITEV = 290 // { ssize_t|sys||pwritev(int fd, const struct iovec *iovp, int iovcnt, int PAD, off_t offset); } + SYS___GETCWD = 296 // { int|sys||__getcwd(char *bufp, size_t length); } + SYS_FCHROOT = 297 // { int|sys||fchroot(int fd); } + SYS_LCHFLAGS = 304 // { int|sys||lchflags(const char *path, u_long flags); } + SYS_ISSETUGID = 305 // { int|sys||issetugid(void); } + SYS_UTRACE = 306 // { int|sys||utrace(const char *label, void *addr, size_t len); } + SYS_GETCONTEXT = 307 // { int|sys||getcontext(struct __ucontext *ucp); } + SYS_SETCONTEXT = 308 // { int|sys||setcontext(const struct __ucontext *ucp); } + SYS__LWP_CREATE = 309 // { int|sys||_lwp_create(const struct __ucontext *ucp, u_long flags, lwpid_t *new_lwp); } + SYS__LWP_EXIT = 310 // { int|sys||_lwp_exit(void); } + SYS__LWP_SELF = 311 // { lwpid_t|sys||_lwp_self(void); } + SYS__LWP_WAIT = 312 // { int|sys||_lwp_wait(lwpid_t wait_for, lwpid_t *departed); } + SYS__LWP_SUSPEND = 313 // { int|sys||_lwp_suspend(lwpid_t target); } + SYS__LWP_CONTINUE = 314 // { int|sys||_lwp_continue(lwpid_t target); } + SYS__LWP_WAKEUP = 315 // { int|sys||_lwp_wakeup(lwpid_t target); } + SYS__LWP_GETPRIVATE = 316 // { void *|sys||_lwp_getprivate(void); } + SYS__LWP_SETPRIVATE = 317 // { void|sys||_lwp_setprivate(void *ptr); } + SYS__LWP_KILL = 318 // { int|sys||_lwp_kill(lwpid_t target, int signo); } + SYS__LWP_DETACH = 319 // { int|sys||_lwp_detach(lwpid_t target); } + SYS__LWP_UNPARK = 321 // { int|sys||_lwp_unpark(lwpid_t target, const void *hint); } + SYS__LWP_UNPARK_ALL = 322 // { ssize_t|sys||_lwp_unpark_all(const lwpid_t *targets, size_t ntargets, const void *hint); } + SYS__LWP_SETNAME = 323 // { int|sys||_lwp_setname(lwpid_t target, const char *name); } + SYS__LWP_GETNAME = 324 // { int|sys||_lwp_getname(lwpid_t target, char *name, size_t len); } + SYS__LWP_CTL = 325 // { int|sys||_lwp_ctl(int features, struct lwpctl **address); } + SYS___SIGACTION_SIGTRAMP = 340 // { int|sys||__sigaction_sigtramp(int signum, const struct sigaction *nsa, struct sigaction *osa, const void *tramp, int vers); } + SYS_PMC_GET_INFO = 341 // { int|sys||pmc_get_info(int ctr, int op, void *args); } + SYS_PMC_CONTROL = 342 // { int|sys||pmc_control(int ctr, int op, void *args); } + SYS_RASCTL = 343 // { int|sys||rasctl(void *addr, size_t len, int op); } + SYS_KQUEUE = 344 // { int|sys||kqueue(void); } + SYS__SCHED_SETPARAM = 346 // { int|sys||_sched_setparam(pid_t pid, lwpid_t lid, int policy, const struct sched_param *params); } + SYS__SCHED_GETPARAM = 347 // { int|sys||_sched_getparam(pid_t pid, lwpid_t lid, int *policy, struct sched_param *params); } + SYS__SCHED_SETAFFINITY = 348 // { int|sys||_sched_setaffinity(pid_t pid, lwpid_t lid, size_t size, const cpuset_t *cpuset); } + SYS__SCHED_GETAFFINITY = 349 // { int|sys||_sched_getaffinity(pid_t pid, lwpid_t lid, size_t size, cpuset_t *cpuset); } + SYS_SCHED_YIELD = 350 // { int|sys||sched_yield(void); } + SYS_FSYNC_RANGE = 354 // { int|sys||fsync_range(int fd, int flags, off_t start, off_t length); } + SYS_UUIDGEN = 355 // { int|sys||uuidgen(struct uuid *store, int count); } + SYS_GETVFSSTAT = 356 // { int|sys||getvfsstat(struct statvfs *buf, size_t bufsize, int flags); } + SYS_STATVFS1 = 357 // { int|sys||statvfs1(const char *path, struct statvfs *buf, int flags); } + SYS_FSTATVFS1 = 358 // { int|sys||fstatvfs1(int fd, struct statvfs *buf, int flags); } + SYS_EXTATTRCTL = 360 // { int|sys||extattrctl(const char *path, int cmd, const char *filename, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_FILE = 361 // { int|sys||extattr_set_file(const char *path, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } + SYS_EXTATTR_GET_FILE = 362 // { ssize_t|sys||extattr_get_file(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_FILE = 363 // { int|sys||extattr_delete_file(const char *path, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_FD = 364 // { int|sys||extattr_set_fd(int fd, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } + SYS_EXTATTR_GET_FD = 365 // { ssize_t|sys||extattr_get_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_FD = 366 // { int|sys||extattr_delete_fd(int fd, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_LINK = 367 // { int|sys||extattr_set_link(const char *path, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } + SYS_EXTATTR_GET_LINK = 368 // { ssize_t|sys||extattr_get_link(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_LINK = 369 // { int|sys||extattr_delete_link(const char *path, int attrnamespace, const char *attrname); } + SYS_EXTATTR_LIST_FD = 370 // { ssize_t|sys||extattr_list_fd(int fd, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_FILE = 371 // { ssize_t|sys||extattr_list_file(const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_LINK = 372 // { ssize_t|sys||extattr_list_link(const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_SETXATTR = 375 // { int|sys||setxattr(const char *path, const char *name, const void *value, size_t size, int flags); } + SYS_LSETXATTR = 376 // { int|sys||lsetxattr(const char *path, const char *name, const void *value, size_t size, int flags); } + SYS_FSETXATTR = 377 // { int|sys||fsetxattr(int fd, const char *name, const void *value, size_t size, int flags); } + SYS_GETXATTR = 378 // { int|sys||getxattr(const char *path, const char *name, void *value, size_t size); } + SYS_LGETXATTR = 379 // { int|sys||lgetxattr(const char *path, const char *name, void *value, size_t size); } + SYS_FGETXATTR = 380 // { int|sys||fgetxattr(int fd, const char *name, void *value, size_t size); } + SYS_LISTXATTR = 381 // { int|sys||listxattr(const char *path, char *list, size_t size); } + SYS_LLISTXATTR = 382 // { int|sys||llistxattr(const char *path, char *list, size_t size); } + SYS_FLISTXATTR = 383 // { int|sys||flistxattr(int fd, char *list, size_t size); } + SYS_REMOVEXATTR = 384 // { int|sys||removexattr(const char *path, const char *name); } + SYS_LREMOVEXATTR = 385 // { int|sys||lremovexattr(const char *path, const char *name); } + SYS_FREMOVEXATTR = 386 // { int|sys||fremovexattr(int fd, const char *name); } + SYS_GETDENTS = 390 // { int|sys|30|getdents(int fd, char *buf, size_t count); } + SYS_SOCKET = 394 // { int|sys|30|socket(int domain, int type, int protocol); } + SYS_GETFH = 395 // { int|sys|30|getfh(const char *fname, void *fhp, size_t *fh_size); } + SYS_MOUNT = 410 // { int|sys|50|mount(const char *type, const char *path, int flags, void *data, size_t data_len); } + SYS_MREMAP = 411 // { void *|sys||mremap(void *old_address, size_t old_size, void *new_address, size_t new_size, int flags); } + SYS_PSET_CREATE = 412 // { int|sys||pset_create(psetid_t *psid); } + SYS_PSET_DESTROY = 413 // { int|sys||pset_destroy(psetid_t psid); } + SYS_PSET_ASSIGN = 414 // { int|sys||pset_assign(psetid_t psid, cpuid_t cpuid, psetid_t *opsid); } + SYS__PSET_BIND = 415 // { int|sys||_pset_bind(idtype_t idtype, id_t first_id, id_t second_id, psetid_t psid, psetid_t *opsid); } + SYS_POSIX_FADVISE = 416 // { int|sys|50|posix_fadvise(int fd, int PAD, off_t offset, off_t len, int advice); } + SYS_SELECT = 417 // { int|sys|50|select(int nd, fd_set *in, fd_set *ou, fd_set *ex, struct timeval *tv); } + SYS_GETTIMEOFDAY = 418 // { int|sys|50|gettimeofday(struct timeval *tp, void *tzp); } + SYS_SETTIMEOFDAY = 419 // { int|sys|50|settimeofday(const struct timeval *tv, const void *tzp); } + SYS_UTIMES = 420 // { int|sys|50|utimes(const char *path, const struct timeval *tptr); } + SYS_ADJTIME = 421 // { int|sys|50|adjtime(const struct timeval *delta, struct timeval *olddelta); } + SYS_FUTIMES = 423 // { int|sys|50|futimes(int fd, const struct timeval *tptr); } + SYS_LUTIMES = 424 // { int|sys|50|lutimes(const char *path, const struct timeval *tptr); } + SYS_SETITIMER = 425 // { int|sys|50|setitimer(int which, const struct itimerval *itv, struct itimerval *oitv); } + SYS_GETITIMER = 426 // { int|sys|50|getitimer(int which, struct itimerval *itv); } + SYS_CLOCK_GETTIME = 427 // { int|sys|50|clock_gettime(clockid_t clock_id, struct timespec *tp); } + SYS_CLOCK_SETTIME = 428 // { int|sys|50|clock_settime(clockid_t clock_id, const struct timespec *tp); } + SYS_CLOCK_GETRES = 429 // { int|sys|50|clock_getres(clockid_t clock_id, struct timespec *tp); } + SYS_NANOSLEEP = 430 // { int|sys|50|nanosleep(const struct timespec *rqtp, struct timespec *rmtp); } + SYS___SIGTIMEDWAIT = 431 // { int|sys|50|__sigtimedwait(const sigset_t *set, siginfo_t *info, struct timespec *timeout); } + SYS__LWP_PARK = 434 // { int|sys|50|_lwp_park(const struct timespec *ts, lwpid_t unpark, const void *hint, const void *unparkhint); } + SYS_KEVENT = 435 // { int|sys|50|kevent(int fd, const struct kevent *changelist, size_t nchanges, struct kevent *eventlist, size_t nevents, const struct timespec *timeout); } + SYS_PSELECT = 436 // { int|sys|50|pselect(int nd, fd_set *in, fd_set *ou, fd_set *ex, const struct timespec *ts, const sigset_t *mask); } + SYS_POLLTS = 437 // { int|sys|50|pollts(struct pollfd *fds, u_int nfds, const struct timespec *ts, const sigset_t *mask); } + SYS_STAT = 439 // { int|sys|50|stat(const char *path, struct stat *ub); } + SYS_FSTAT = 440 // { int|sys|50|fstat(int fd, struct stat *sb); } + SYS_LSTAT = 441 // { int|sys|50|lstat(const char *path, struct stat *ub); } + SYS___SEMCTL = 442 // { int|sys|50|__semctl(int semid, int semnum, int cmd, ... union __semun *arg); } + SYS_SHMCTL = 443 // { int|sys|50|shmctl(int shmid, int cmd, struct shmid_ds *buf); } + SYS_MSGCTL = 444 // { int|sys|50|msgctl(int msqid, int cmd, struct msqid_ds *buf); } + SYS_GETRUSAGE = 445 // { int|sys|50|getrusage(int who, struct rusage *rusage); } + SYS_TIMER_SETTIME = 446 // { int|sys|50|timer_settime(timer_t timerid, int flags, const struct itimerspec *value, struct itimerspec *ovalue); } + SYS_TIMER_GETTIME = 447 // { int|sys|50|timer_gettime(timer_t timerid, struct itimerspec *value); } + SYS_NTP_GETTIME = 448 // { int|sys|50|ntp_gettime(struct ntptimeval *ntvp); } + SYS_WAIT4 = 449 // { int|sys|50|wait4(pid_t pid, int *status, int options, struct rusage *rusage); } + SYS_MKNOD = 450 // { int|sys|50|mknod(const char *path, mode_t mode, dev_t dev); } + SYS_FHSTAT = 451 // { int|sys|50|fhstat(const void *fhp, size_t fh_size, struct stat *sb); } + SYS_PIPE2 = 453 // { int|sys||pipe2(int *fildes, int flags); } + SYS_DUP3 = 454 // { int|sys||dup3(int from, int to, int flags); } + SYS_KQUEUE1 = 455 // { int|sys||kqueue1(int flags); } + SYS_PACCEPT = 456 // { int|sys||paccept(int s, struct sockaddr *name, socklen_t *anamelen, const sigset_t *mask, int flags); } + SYS_LINKAT = 457 // { int|sys||linkat(int fd1, const char *name1, int fd2, const char *name2, int flags); } + SYS_RENAMEAT = 458 // { int|sys||renameat(int fromfd, const char *from, int tofd, const char *to); } + SYS_MKFIFOAT = 459 // { int|sys||mkfifoat(int fd, const char *path, mode_t mode); } + SYS_MKNODAT = 460 // { int|sys||mknodat(int fd, const char *path, mode_t mode, uint32_t dev); } + SYS_MKDIRAT = 461 // { int|sys||mkdirat(int fd, const char *path, mode_t mode); } + SYS_FACCESSAT = 462 // { int|sys||faccessat(int fd, const char *path, int amode, int flag); } + SYS_FCHMODAT = 463 // { int|sys||fchmodat(int fd, const char *path, mode_t mode, int flag); } + SYS_FCHOWNAT = 464 // { int|sys||fchownat(int fd, const char *path, uid_t owner, gid_t group, int flag); } + SYS_FEXECVE = 465 // { int|sys||fexecve(int fd, char * const *argp, char * const *envp); } + SYS_FSTATAT = 466 // { int|sys||fstatat(int fd, const char *path, struct stat *buf, int flag); } + SYS_UTIMENSAT = 467 // { int|sys||utimensat(int fd, const char *path, const struct timespec *tptr, int flag); } + SYS_OPENAT = 468 // { int|sys||openat(int fd, const char *path, int oflags, ... mode_t mode); } + SYS_READLINKAT = 469 // { int|sys||readlinkat(int fd, const char *path, char *buf, size_t bufsize); } + SYS_SYMLINKAT = 470 // { int|sys||symlinkat(const char *path1, int fd, const char *path2); } + SYS_UNLINKAT = 471 // { int|sys||unlinkat(int fd, const char *path, int flag); } + SYS_FUTIMENS = 472 // { int|sys||futimens(int fd, const struct timespec *tptr); } + SYS___QUOTACTL = 473 // { int|sys||__quotactl(const char *path, struct quotactl_args *args); } + SYS_POSIX_SPAWN = 474 // { int|sys||posix_spawn(pid_t *pid, const char *path, const struct posix_spawn_file_actions *file_actions, const struct posix_spawnattr *attrp, char *const *argv, char *const *envp); } + SYS_RECVMMSG = 475 // { int|sys||recvmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags, struct timespec *timeout); } + SYS_SENDMMSG = 476 // { int|sys||sendmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags); } +) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go new file mode 100644 index 00000000..f93f391d --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go @@ -0,0 +1,218 @@ +// mksysnum_openbsd.pl +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build 386,openbsd + +package unix + +const ( + SYS_EXIT = 1 // { void sys_exit(int rval); } + SYS_FORK = 2 // { int sys_fork(void); } + SYS_READ = 3 // { ssize_t sys_read(int fd, void *buf, size_t nbyte); } + SYS_WRITE = 4 // { ssize_t sys_write(int fd, const void *buf, \ + SYS_OPEN = 5 // { int sys_open(const char *path, \ + SYS_CLOSE = 6 // { int sys_close(int fd); } + SYS_GETENTROPY = 7 // { int sys_getentropy(void *buf, size_t nbyte); } + SYS___TFORK = 8 // { int sys___tfork(const struct __tfork *param, \ + SYS_LINK = 9 // { int sys_link(const char *path, const char *link); } + SYS_UNLINK = 10 // { int sys_unlink(const char *path); } + SYS_WAIT4 = 11 // { pid_t sys_wait4(pid_t pid, int *status, \ + SYS_CHDIR = 12 // { int sys_chdir(const char *path); } + SYS_FCHDIR = 13 // { int sys_fchdir(int fd); } + SYS_MKNOD = 14 // { int sys_mknod(const char *path, mode_t mode, \ + SYS_CHMOD = 15 // { int sys_chmod(const char *path, mode_t mode); } + SYS_CHOWN = 16 // { int sys_chown(const char *path, uid_t uid, \ + SYS_OBREAK = 17 // { int sys_obreak(char *nsize); } break + SYS_GETDTABLECOUNT = 18 // { int sys_getdtablecount(void); } + SYS_GETRUSAGE = 19 // { int sys_getrusage(int who, \ + SYS_GETPID = 20 // { pid_t sys_getpid(void); } + SYS_MOUNT = 21 // { int sys_mount(const char *type, const char *path, \ + SYS_UNMOUNT = 22 // { int sys_unmount(const char *path, int flags); } + SYS_SETUID = 23 // { int sys_setuid(uid_t uid); } + SYS_GETUID = 24 // { uid_t sys_getuid(void); } + SYS_GETEUID = 25 // { uid_t sys_geteuid(void); } + SYS_PTRACE = 26 // { int sys_ptrace(int req, pid_t pid, caddr_t addr, \ + SYS_RECVMSG = 27 // { ssize_t sys_recvmsg(int s, struct msghdr *msg, \ + SYS_SENDMSG = 28 // { ssize_t sys_sendmsg(int s, \ + SYS_RECVFROM = 29 // { ssize_t sys_recvfrom(int s, void *buf, size_t len, \ + SYS_ACCEPT = 30 // { int sys_accept(int s, struct sockaddr *name, \ + SYS_GETPEERNAME = 31 // { int sys_getpeername(int fdes, struct sockaddr *asa, \ + SYS_GETSOCKNAME = 32 // { int sys_getsockname(int fdes, struct sockaddr *asa, \ + SYS_ACCESS = 33 // { int sys_access(const char *path, int amode); } + SYS_CHFLAGS = 34 // { int sys_chflags(const char *path, u_int flags); } + SYS_FCHFLAGS = 35 // { int sys_fchflags(int fd, u_int flags); } + SYS_SYNC = 36 // { void sys_sync(void); } + SYS_STAT = 38 // { int sys_stat(const char *path, struct stat *ub); } + SYS_GETPPID = 39 // { pid_t sys_getppid(void); } + SYS_LSTAT = 40 // { int sys_lstat(const char *path, struct stat *ub); } + SYS_DUP = 41 // { int sys_dup(int fd); } + SYS_FSTATAT = 42 // { int sys_fstatat(int fd, const char *path, \ + SYS_GETEGID = 43 // { gid_t sys_getegid(void); } + SYS_PROFIL = 44 // { int sys_profil(caddr_t samples, size_t size, \ + SYS_KTRACE = 45 // { int sys_ktrace(const char *fname, int ops, \ + SYS_SIGACTION = 46 // { int sys_sigaction(int signum, \ + SYS_GETGID = 47 // { gid_t sys_getgid(void); } + SYS_SIGPROCMASK = 48 // { int sys_sigprocmask(int how, sigset_t mask); } + SYS_SETLOGIN = 50 // { int sys_setlogin(const char *namebuf); } + SYS_ACCT = 51 // { int sys_acct(const char *path); } + SYS_SIGPENDING = 52 // { int sys_sigpending(void); } + SYS_FSTAT = 53 // { int sys_fstat(int fd, struct stat *sb); } + SYS_IOCTL = 54 // { int sys_ioctl(int fd, \ + SYS_REBOOT = 55 // { int sys_reboot(int opt); } + SYS_REVOKE = 56 // { int sys_revoke(const char *path); } + SYS_SYMLINK = 57 // { int sys_symlink(const char *path, \ + SYS_READLINK = 58 // { ssize_t sys_readlink(const char *path, \ + SYS_EXECVE = 59 // { int sys_execve(const char *path, \ + SYS_UMASK = 60 // { mode_t sys_umask(mode_t newmask); } + SYS_CHROOT = 61 // { int sys_chroot(const char *path); } + SYS_GETFSSTAT = 62 // { int sys_getfsstat(struct statfs *buf, size_t bufsize, \ + SYS_STATFS = 63 // { int sys_statfs(const char *path, \ + SYS_FSTATFS = 64 // { int sys_fstatfs(int fd, struct statfs *buf); } + SYS_FHSTATFS = 65 // { int sys_fhstatfs(const fhandle_t *fhp, \ + SYS_VFORK = 66 // { int sys_vfork(void); } + SYS_GETTIMEOFDAY = 67 // { int sys_gettimeofday(struct timeval *tp, \ + SYS_SETTIMEOFDAY = 68 // { int sys_settimeofday(const struct timeval *tv, \ + SYS_SETITIMER = 69 // { int sys_setitimer(int which, \ + SYS_GETITIMER = 70 // { int sys_getitimer(int which, \ + SYS_SELECT = 71 // { int sys_select(int nd, fd_set *in, fd_set *ou, \ + SYS_KEVENT = 72 // { int sys_kevent(int fd, \ + SYS_MUNMAP = 73 // { int sys_munmap(void *addr, size_t len); } + SYS_MPROTECT = 74 // { int sys_mprotect(void *addr, size_t len, \ + SYS_MADVISE = 75 // { int sys_madvise(void *addr, size_t len, \ + SYS_UTIMES = 76 // { int sys_utimes(const char *path, \ + SYS_FUTIMES = 77 // { int sys_futimes(int fd, \ + SYS_MINCORE = 78 // { int sys_mincore(void *addr, size_t len, \ + SYS_GETGROUPS = 79 // { int sys_getgroups(int gidsetsize, \ + SYS_SETGROUPS = 80 // { int sys_setgroups(int gidsetsize, \ + SYS_GETPGRP = 81 // { int sys_getpgrp(void); } + SYS_SETPGID = 82 // { int sys_setpgid(pid_t pid, pid_t pgid); } + SYS_FUTEX = 83 // { int sys_futex(uint32_t *f, int op, int val, \ + SYS_UTIMENSAT = 84 // { int sys_utimensat(int fd, const char *path, \ + SYS_FUTIMENS = 85 // { int sys_futimens(int fd, \ + SYS_KBIND = 86 // { int sys_kbind(const struct __kbind *param, \ + SYS_CLOCK_GETTIME = 87 // { int sys_clock_gettime(clockid_t clock_id, \ + SYS_CLOCK_SETTIME = 88 // { int sys_clock_settime(clockid_t clock_id, \ + SYS_CLOCK_GETRES = 89 // { int sys_clock_getres(clockid_t clock_id, \ + SYS_DUP2 = 90 // { int sys_dup2(int from, int to); } + SYS_NANOSLEEP = 91 // { int sys_nanosleep(const struct timespec *rqtp, \ + SYS_FCNTL = 92 // { int sys_fcntl(int fd, int cmd, ... void *arg); } + SYS_ACCEPT4 = 93 // { int sys_accept4(int s, struct sockaddr *name, \ + SYS___THRSLEEP = 94 // { int sys___thrsleep(const volatile void *ident, \ + SYS_FSYNC = 95 // { int sys_fsync(int fd); } + SYS_SETPRIORITY = 96 // { int sys_setpriority(int which, id_t who, int prio); } + SYS_SOCKET = 97 // { int sys_socket(int domain, int type, int protocol); } + SYS_CONNECT = 98 // { int sys_connect(int s, const struct sockaddr *name, \ + SYS_GETDENTS = 99 // { int sys_getdents(int fd, void *buf, size_t buflen); } + SYS_GETPRIORITY = 100 // { int sys_getpriority(int which, id_t who); } + SYS_PIPE2 = 101 // { int sys_pipe2(int *fdp, int flags); } + SYS_DUP3 = 102 // { int sys_dup3(int from, int to, int flags); } + SYS_SIGRETURN = 103 // { int sys_sigreturn(struct sigcontext *sigcntxp); } + SYS_BIND = 104 // { int sys_bind(int s, const struct sockaddr *name, \ + SYS_SETSOCKOPT = 105 // { int sys_setsockopt(int s, int level, int name, \ + SYS_LISTEN = 106 // { int sys_listen(int s, int backlog); } + SYS_CHFLAGSAT = 107 // { int sys_chflagsat(int fd, const char *path, \ + SYS_PLEDGE = 108 // { int sys_pledge(const char *promises, \ + SYS_PPOLL = 109 // { int sys_ppoll(struct pollfd *fds, \ + SYS_PSELECT = 110 // { int sys_pselect(int nd, fd_set *in, fd_set *ou, \ + SYS_SIGSUSPEND = 111 // { int sys_sigsuspend(int mask); } + SYS_SENDSYSLOG = 112 // { int sys_sendsyslog(const char *buf, size_t nbyte, \ + SYS_UNVEIL = 114 // { int sys_unveil(const char *path, \ + SYS_GETSOCKOPT = 118 // { int sys_getsockopt(int s, int level, int name, \ + SYS_THRKILL = 119 // { int sys_thrkill(pid_t tid, int signum, void *tcb); } + SYS_READV = 120 // { ssize_t sys_readv(int fd, \ + SYS_WRITEV = 121 // { ssize_t sys_writev(int fd, \ + SYS_KILL = 122 // { int sys_kill(int pid, int signum); } + SYS_FCHOWN = 123 // { int sys_fchown(int fd, uid_t uid, gid_t gid); } + SYS_FCHMOD = 124 // { int sys_fchmod(int fd, mode_t mode); } + SYS_SETREUID = 126 // { int sys_setreuid(uid_t ruid, uid_t euid); } + SYS_SETREGID = 127 // { int sys_setregid(gid_t rgid, gid_t egid); } + SYS_RENAME = 128 // { int sys_rename(const char *from, const char *to); } + SYS_FLOCK = 131 // { int sys_flock(int fd, int how); } + SYS_MKFIFO = 132 // { int sys_mkfifo(const char *path, mode_t mode); } + SYS_SENDTO = 133 // { ssize_t sys_sendto(int s, const void *buf, \ + SYS_SHUTDOWN = 134 // { int sys_shutdown(int s, int how); } + SYS_SOCKETPAIR = 135 // { int sys_socketpair(int domain, int type, \ + SYS_MKDIR = 136 // { int sys_mkdir(const char *path, mode_t mode); } + SYS_RMDIR = 137 // { int sys_rmdir(const char *path); } + SYS_ADJTIME = 140 // { int sys_adjtime(const struct timeval *delta, \ + SYS_GETLOGIN_R = 141 // { int sys_getlogin_r(char *namebuf, u_int namelen); } + SYS_SETSID = 147 // { int sys_setsid(void); } + SYS_QUOTACTL = 148 // { int sys_quotactl(const char *path, int cmd, \ + SYS_NFSSVC = 155 // { int sys_nfssvc(int flag, void *argp); } + SYS_GETFH = 161 // { int sys_getfh(const char *fname, fhandle_t *fhp); } + SYS_SYSARCH = 165 // { int sys_sysarch(int op, void *parms); } + SYS_PREAD = 173 // { ssize_t sys_pread(int fd, void *buf, \ + SYS_PWRITE = 174 // { ssize_t sys_pwrite(int fd, const void *buf, \ + SYS_SETGID = 181 // { int sys_setgid(gid_t gid); } + SYS_SETEGID = 182 // { int sys_setegid(gid_t egid); } + SYS_SETEUID = 183 // { int sys_seteuid(uid_t euid); } + SYS_PATHCONF = 191 // { long sys_pathconf(const char *path, int name); } + SYS_FPATHCONF = 192 // { long sys_fpathconf(int fd, int name); } + SYS_SWAPCTL = 193 // { int sys_swapctl(int cmd, const void *arg, int misc); } + SYS_GETRLIMIT = 194 // { int sys_getrlimit(int which, \ + SYS_SETRLIMIT = 195 // { int sys_setrlimit(int which, \ + SYS_MMAP = 197 // { void *sys_mmap(void *addr, size_t len, int prot, \ + SYS_LSEEK = 199 // { off_t sys_lseek(int fd, int pad, off_t offset, \ + SYS_TRUNCATE = 200 // { int sys_truncate(const char *path, int pad, \ + SYS_FTRUNCATE = 201 // { int sys_ftruncate(int fd, int pad, off_t length); } + SYS_SYSCTL = 202 // { int sys_sysctl(const int *name, u_int namelen, \ + SYS_MLOCK = 203 // { int sys_mlock(const void *addr, size_t len); } + SYS_MUNLOCK = 204 // { int sys_munlock(const void *addr, size_t len); } + SYS_GETPGID = 207 // { pid_t sys_getpgid(pid_t pid); } + SYS_UTRACE = 209 // { int sys_utrace(const char *label, const void *addr, \ + SYS_SEMGET = 221 // { int sys_semget(key_t key, int nsems, int semflg); } + SYS_MSGGET = 225 // { int sys_msgget(key_t key, int msgflg); } + SYS_MSGSND = 226 // { int sys_msgsnd(int msqid, const void *msgp, size_t msgsz, \ + SYS_MSGRCV = 227 // { int sys_msgrcv(int msqid, void *msgp, size_t msgsz, \ + SYS_SHMAT = 228 // { void *sys_shmat(int shmid, const void *shmaddr, \ + SYS_SHMDT = 230 // { int sys_shmdt(const void *shmaddr); } + SYS_MINHERIT = 250 // { int sys_minherit(void *addr, size_t len, \ + SYS_POLL = 252 // { int sys_poll(struct pollfd *fds, \ + SYS_ISSETUGID = 253 // { int sys_issetugid(void); } + SYS_LCHOWN = 254 // { int sys_lchown(const char *path, uid_t uid, gid_t gid); } + SYS_GETSID = 255 // { pid_t sys_getsid(pid_t pid); } + SYS_MSYNC = 256 // { int sys_msync(void *addr, size_t len, int flags); } + SYS_PIPE = 263 // { int sys_pipe(int *fdp); } + SYS_FHOPEN = 264 // { int sys_fhopen(const fhandle_t *fhp, int flags); } + SYS_PREADV = 267 // { ssize_t sys_preadv(int fd, \ + SYS_PWRITEV = 268 // { ssize_t sys_pwritev(int fd, \ + SYS_KQUEUE = 269 // { int sys_kqueue(void); } + SYS_MLOCKALL = 271 // { int sys_mlockall(int flags); } + SYS_MUNLOCKALL = 272 // { int sys_munlockall(void); } + SYS_GETRESUID = 281 // { int sys_getresuid(uid_t *ruid, uid_t *euid, \ + SYS_SETRESUID = 282 // { int sys_setresuid(uid_t ruid, uid_t euid, \ + SYS_GETRESGID = 283 // { int sys_getresgid(gid_t *rgid, gid_t *egid, \ + SYS_SETRESGID = 284 // { int sys_setresgid(gid_t rgid, gid_t egid, \ + SYS_MQUERY = 286 // { void *sys_mquery(void *addr, size_t len, int prot, \ + SYS_CLOSEFROM = 287 // { int sys_closefrom(int fd); } + SYS_SIGALTSTACK = 288 // { int sys_sigaltstack(const struct sigaltstack *nss, \ + SYS_SHMGET = 289 // { int sys_shmget(key_t key, size_t size, int shmflg); } + SYS_SEMOP = 290 // { int sys_semop(int semid, struct sembuf *sops, \ + SYS_FHSTAT = 294 // { int sys_fhstat(const fhandle_t *fhp, \ + SYS___SEMCTL = 295 // { int sys___semctl(int semid, int semnum, int cmd, \ + SYS_SHMCTL = 296 // { int sys_shmctl(int shmid, int cmd, \ + SYS_MSGCTL = 297 // { int sys_msgctl(int msqid, int cmd, \ + SYS_SCHED_YIELD = 298 // { int sys_sched_yield(void); } + SYS_GETTHRID = 299 // { pid_t sys_getthrid(void); } + SYS___THRWAKEUP = 301 // { int sys___thrwakeup(const volatile void *ident, \ + SYS___THREXIT = 302 // { void sys___threxit(pid_t *notdead); } + SYS___THRSIGDIVERT = 303 // { int sys___thrsigdivert(sigset_t sigmask, \ + SYS___GETCWD = 304 // { int sys___getcwd(char *buf, size_t len); } + SYS_ADJFREQ = 305 // { int sys_adjfreq(const int64_t *freq, \ + SYS_SETRTABLE = 310 // { int sys_setrtable(int rtableid); } + SYS_GETRTABLE = 311 // { int sys_getrtable(void); } + SYS_FACCESSAT = 313 // { int sys_faccessat(int fd, const char *path, \ + SYS_FCHMODAT = 314 // { int sys_fchmodat(int fd, const char *path, \ + SYS_FCHOWNAT = 315 // { int sys_fchownat(int fd, const char *path, \ + SYS_LINKAT = 317 // { int sys_linkat(int fd1, const char *path1, int fd2, \ + SYS_MKDIRAT = 318 // { int sys_mkdirat(int fd, const char *path, \ + SYS_MKFIFOAT = 319 // { int sys_mkfifoat(int fd, const char *path, \ + SYS_MKNODAT = 320 // { int sys_mknodat(int fd, const char *path, \ + SYS_OPENAT = 321 // { int sys_openat(int fd, const char *path, int flags, \ + SYS_READLINKAT = 322 // { ssize_t sys_readlinkat(int fd, const char *path, \ + SYS_RENAMEAT = 323 // { int sys_renameat(int fromfd, const char *from, \ + SYS_SYMLINKAT = 324 // { int sys_symlinkat(const char *path, int fd, \ + SYS_UNLINKAT = 325 // { int sys_unlinkat(int fd, const char *path, \ + SYS___SET_TCB = 329 // { void sys___set_tcb(void *tcb); } + SYS___GET_TCB = 330 // { void *sys___get_tcb(void); } +) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go new file mode 100644 index 00000000..bc7fa579 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go @@ -0,0 +1,218 @@ +// mksysnum_openbsd.pl +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,openbsd + +package unix + +const ( + SYS_EXIT = 1 // { void sys_exit(int rval); } + SYS_FORK = 2 // { int sys_fork(void); } + SYS_READ = 3 // { ssize_t sys_read(int fd, void *buf, size_t nbyte); } + SYS_WRITE = 4 // { ssize_t sys_write(int fd, const void *buf, \ + SYS_OPEN = 5 // { int sys_open(const char *path, \ + SYS_CLOSE = 6 // { int sys_close(int fd); } + SYS_GETENTROPY = 7 // { int sys_getentropy(void *buf, size_t nbyte); } + SYS___TFORK = 8 // { int sys___tfork(const struct __tfork *param, \ + SYS_LINK = 9 // { int sys_link(const char *path, const char *link); } + SYS_UNLINK = 10 // { int sys_unlink(const char *path); } + SYS_WAIT4 = 11 // { pid_t sys_wait4(pid_t pid, int *status, \ + SYS_CHDIR = 12 // { int sys_chdir(const char *path); } + SYS_FCHDIR = 13 // { int sys_fchdir(int fd); } + SYS_MKNOD = 14 // { int sys_mknod(const char *path, mode_t mode, \ + SYS_CHMOD = 15 // { int sys_chmod(const char *path, mode_t mode); } + SYS_CHOWN = 16 // { int sys_chown(const char *path, uid_t uid, \ + SYS_OBREAK = 17 // { int sys_obreak(char *nsize); } break + SYS_GETDTABLECOUNT = 18 // { int sys_getdtablecount(void); } + SYS_GETRUSAGE = 19 // { int sys_getrusage(int who, \ + SYS_GETPID = 20 // { pid_t sys_getpid(void); } + SYS_MOUNT = 21 // { int sys_mount(const char *type, const char *path, \ + SYS_UNMOUNT = 22 // { int sys_unmount(const char *path, int flags); } + SYS_SETUID = 23 // { int sys_setuid(uid_t uid); } + SYS_GETUID = 24 // { uid_t sys_getuid(void); } + SYS_GETEUID = 25 // { uid_t sys_geteuid(void); } + SYS_PTRACE = 26 // { int sys_ptrace(int req, pid_t pid, caddr_t addr, \ + SYS_RECVMSG = 27 // { ssize_t sys_recvmsg(int s, struct msghdr *msg, \ + SYS_SENDMSG = 28 // { ssize_t sys_sendmsg(int s, \ + SYS_RECVFROM = 29 // { ssize_t sys_recvfrom(int s, void *buf, size_t len, \ + SYS_ACCEPT = 30 // { int sys_accept(int s, struct sockaddr *name, \ + SYS_GETPEERNAME = 31 // { int sys_getpeername(int fdes, struct sockaddr *asa, \ + SYS_GETSOCKNAME = 32 // { int sys_getsockname(int fdes, struct sockaddr *asa, \ + SYS_ACCESS = 33 // { int sys_access(const char *path, int amode); } + SYS_CHFLAGS = 34 // { int sys_chflags(const char *path, u_int flags); } + SYS_FCHFLAGS = 35 // { int sys_fchflags(int fd, u_int flags); } + SYS_SYNC = 36 // { void sys_sync(void); } + SYS_STAT = 38 // { int sys_stat(const char *path, struct stat *ub); } + SYS_GETPPID = 39 // { pid_t sys_getppid(void); } + SYS_LSTAT = 40 // { int sys_lstat(const char *path, struct stat *ub); } + SYS_DUP = 41 // { int sys_dup(int fd); } + SYS_FSTATAT = 42 // { int sys_fstatat(int fd, const char *path, \ + SYS_GETEGID = 43 // { gid_t sys_getegid(void); } + SYS_PROFIL = 44 // { int sys_profil(caddr_t samples, size_t size, \ + SYS_KTRACE = 45 // { int sys_ktrace(const char *fname, int ops, \ + SYS_SIGACTION = 46 // { int sys_sigaction(int signum, \ + SYS_GETGID = 47 // { gid_t sys_getgid(void); } + SYS_SIGPROCMASK = 48 // { int sys_sigprocmask(int how, sigset_t mask); } + SYS_SETLOGIN = 50 // { int sys_setlogin(const char *namebuf); } + SYS_ACCT = 51 // { int sys_acct(const char *path); } + SYS_SIGPENDING = 52 // { int sys_sigpending(void); } + SYS_FSTAT = 53 // { int sys_fstat(int fd, struct stat *sb); } + SYS_IOCTL = 54 // { int sys_ioctl(int fd, \ + SYS_REBOOT = 55 // { int sys_reboot(int opt); } + SYS_REVOKE = 56 // { int sys_revoke(const char *path); } + SYS_SYMLINK = 57 // { int sys_symlink(const char *path, \ + SYS_READLINK = 58 // { ssize_t sys_readlink(const char *path, \ + SYS_EXECVE = 59 // { int sys_execve(const char *path, \ + SYS_UMASK = 60 // { mode_t sys_umask(mode_t newmask); } + SYS_CHROOT = 61 // { int sys_chroot(const char *path); } + SYS_GETFSSTAT = 62 // { int sys_getfsstat(struct statfs *buf, size_t bufsize, \ + SYS_STATFS = 63 // { int sys_statfs(const char *path, \ + SYS_FSTATFS = 64 // { int sys_fstatfs(int fd, struct statfs *buf); } + SYS_FHSTATFS = 65 // { int sys_fhstatfs(const fhandle_t *fhp, \ + SYS_VFORK = 66 // { int sys_vfork(void); } + SYS_GETTIMEOFDAY = 67 // { int sys_gettimeofday(struct timeval *tp, \ + SYS_SETTIMEOFDAY = 68 // { int sys_settimeofday(const struct timeval *tv, \ + SYS_SETITIMER = 69 // { int sys_setitimer(int which, \ + SYS_GETITIMER = 70 // { int sys_getitimer(int which, \ + SYS_SELECT = 71 // { int sys_select(int nd, fd_set *in, fd_set *ou, \ + SYS_KEVENT = 72 // { int sys_kevent(int fd, \ + SYS_MUNMAP = 73 // { int sys_munmap(void *addr, size_t len); } + SYS_MPROTECT = 74 // { int sys_mprotect(void *addr, size_t len, \ + SYS_MADVISE = 75 // { int sys_madvise(void *addr, size_t len, \ + SYS_UTIMES = 76 // { int sys_utimes(const char *path, \ + SYS_FUTIMES = 77 // { int sys_futimes(int fd, \ + SYS_MINCORE = 78 // { int sys_mincore(void *addr, size_t len, \ + SYS_GETGROUPS = 79 // { int sys_getgroups(int gidsetsize, \ + SYS_SETGROUPS = 80 // { int sys_setgroups(int gidsetsize, \ + SYS_GETPGRP = 81 // { int sys_getpgrp(void); } + SYS_SETPGID = 82 // { int sys_setpgid(pid_t pid, pid_t pgid); } + SYS_FUTEX = 83 // { int sys_futex(uint32_t *f, int op, int val, \ + SYS_UTIMENSAT = 84 // { int sys_utimensat(int fd, const char *path, \ + SYS_FUTIMENS = 85 // { int sys_futimens(int fd, \ + SYS_KBIND = 86 // { int sys_kbind(const struct __kbind *param, \ + SYS_CLOCK_GETTIME = 87 // { int sys_clock_gettime(clockid_t clock_id, \ + SYS_CLOCK_SETTIME = 88 // { int sys_clock_settime(clockid_t clock_id, \ + SYS_CLOCK_GETRES = 89 // { int sys_clock_getres(clockid_t clock_id, \ + SYS_DUP2 = 90 // { int sys_dup2(int from, int to); } + SYS_NANOSLEEP = 91 // { int sys_nanosleep(const struct timespec *rqtp, \ + SYS_FCNTL = 92 // { int sys_fcntl(int fd, int cmd, ... void *arg); } + SYS_ACCEPT4 = 93 // { int sys_accept4(int s, struct sockaddr *name, \ + SYS___THRSLEEP = 94 // { int sys___thrsleep(const volatile void *ident, \ + SYS_FSYNC = 95 // { int sys_fsync(int fd); } + SYS_SETPRIORITY = 96 // { int sys_setpriority(int which, id_t who, int prio); } + SYS_SOCKET = 97 // { int sys_socket(int domain, int type, int protocol); } + SYS_CONNECT = 98 // { int sys_connect(int s, const struct sockaddr *name, \ + SYS_GETDENTS = 99 // { int sys_getdents(int fd, void *buf, size_t buflen); } + SYS_GETPRIORITY = 100 // { int sys_getpriority(int which, id_t who); } + SYS_PIPE2 = 101 // { int sys_pipe2(int *fdp, int flags); } + SYS_DUP3 = 102 // { int sys_dup3(int from, int to, int flags); } + SYS_SIGRETURN = 103 // { int sys_sigreturn(struct sigcontext *sigcntxp); } + SYS_BIND = 104 // { int sys_bind(int s, const struct sockaddr *name, \ + SYS_SETSOCKOPT = 105 // { int sys_setsockopt(int s, int level, int name, \ + SYS_LISTEN = 106 // { int sys_listen(int s, int backlog); } + SYS_CHFLAGSAT = 107 // { int sys_chflagsat(int fd, const char *path, \ + SYS_PLEDGE = 108 // { int sys_pledge(const char *promises, \ + SYS_PPOLL = 109 // { int sys_ppoll(struct pollfd *fds, \ + SYS_PSELECT = 110 // { int sys_pselect(int nd, fd_set *in, fd_set *ou, \ + SYS_SIGSUSPEND = 111 // { int sys_sigsuspend(int mask); } + SYS_SENDSYSLOG = 112 // { int sys_sendsyslog(const char *buf, size_t nbyte, \ + SYS_UNVEIL = 114 // { int sys_unveil(const char *path, \ + SYS_GETSOCKOPT = 118 // { int sys_getsockopt(int s, int level, int name, \ + SYS_THRKILL = 119 // { int sys_thrkill(pid_t tid, int signum, void *tcb); } + SYS_READV = 120 // { ssize_t sys_readv(int fd, \ + SYS_WRITEV = 121 // { ssize_t sys_writev(int fd, \ + SYS_KILL = 122 // { int sys_kill(int pid, int signum); } + SYS_FCHOWN = 123 // { int sys_fchown(int fd, uid_t uid, gid_t gid); } + SYS_FCHMOD = 124 // { int sys_fchmod(int fd, mode_t mode); } + SYS_SETREUID = 126 // { int sys_setreuid(uid_t ruid, uid_t euid); } + SYS_SETREGID = 127 // { int sys_setregid(gid_t rgid, gid_t egid); } + SYS_RENAME = 128 // { int sys_rename(const char *from, const char *to); } + SYS_FLOCK = 131 // { int sys_flock(int fd, int how); } + SYS_MKFIFO = 132 // { int sys_mkfifo(const char *path, mode_t mode); } + SYS_SENDTO = 133 // { ssize_t sys_sendto(int s, const void *buf, \ + SYS_SHUTDOWN = 134 // { int sys_shutdown(int s, int how); } + SYS_SOCKETPAIR = 135 // { int sys_socketpair(int domain, int type, \ + SYS_MKDIR = 136 // { int sys_mkdir(const char *path, mode_t mode); } + SYS_RMDIR = 137 // { int sys_rmdir(const char *path); } + SYS_ADJTIME = 140 // { int sys_adjtime(const struct timeval *delta, \ + SYS_GETLOGIN_R = 141 // { int sys_getlogin_r(char *namebuf, u_int namelen); } + SYS_SETSID = 147 // { int sys_setsid(void); } + SYS_QUOTACTL = 148 // { int sys_quotactl(const char *path, int cmd, \ + SYS_NFSSVC = 155 // { int sys_nfssvc(int flag, void *argp); } + SYS_GETFH = 161 // { int sys_getfh(const char *fname, fhandle_t *fhp); } + SYS_SYSARCH = 165 // { int sys_sysarch(int op, void *parms); } + SYS_PREAD = 173 // { ssize_t sys_pread(int fd, void *buf, \ + SYS_PWRITE = 174 // { ssize_t sys_pwrite(int fd, const void *buf, \ + SYS_SETGID = 181 // { int sys_setgid(gid_t gid); } + SYS_SETEGID = 182 // { int sys_setegid(gid_t egid); } + SYS_SETEUID = 183 // { int sys_seteuid(uid_t euid); } + SYS_PATHCONF = 191 // { long sys_pathconf(const char *path, int name); } + SYS_FPATHCONF = 192 // { long sys_fpathconf(int fd, int name); } + SYS_SWAPCTL = 193 // { int sys_swapctl(int cmd, const void *arg, int misc); } + SYS_GETRLIMIT = 194 // { int sys_getrlimit(int which, \ + SYS_SETRLIMIT = 195 // { int sys_setrlimit(int which, \ + SYS_MMAP = 197 // { void *sys_mmap(void *addr, size_t len, int prot, \ + SYS_LSEEK = 199 // { off_t sys_lseek(int fd, int pad, off_t offset, \ + SYS_TRUNCATE = 200 // { int sys_truncate(const char *path, int pad, \ + SYS_FTRUNCATE = 201 // { int sys_ftruncate(int fd, int pad, off_t length); } + SYS_SYSCTL = 202 // { int sys_sysctl(const int *name, u_int namelen, \ + SYS_MLOCK = 203 // { int sys_mlock(const void *addr, size_t len); } + SYS_MUNLOCK = 204 // { int sys_munlock(const void *addr, size_t len); } + SYS_GETPGID = 207 // { pid_t sys_getpgid(pid_t pid); } + SYS_UTRACE = 209 // { int sys_utrace(const char *label, const void *addr, \ + SYS_SEMGET = 221 // { int sys_semget(key_t key, int nsems, int semflg); } + SYS_MSGGET = 225 // { int sys_msgget(key_t key, int msgflg); } + SYS_MSGSND = 226 // { int sys_msgsnd(int msqid, const void *msgp, size_t msgsz, \ + SYS_MSGRCV = 227 // { int sys_msgrcv(int msqid, void *msgp, size_t msgsz, \ + SYS_SHMAT = 228 // { void *sys_shmat(int shmid, const void *shmaddr, \ + SYS_SHMDT = 230 // { int sys_shmdt(const void *shmaddr); } + SYS_MINHERIT = 250 // { int sys_minherit(void *addr, size_t len, \ + SYS_POLL = 252 // { int sys_poll(struct pollfd *fds, \ + SYS_ISSETUGID = 253 // { int sys_issetugid(void); } + SYS_LCHOWN = 254 // { int sys_lchown(const char *path, uid_t uid, gid_t gid); } + SYS_GETSID = 255 // { pid_t sys_getsid(pid_t pid); } + SYS_MSYNC = 256 // { int sys_msync(void *addr, size_t len, int flags); } + SYS_PIPE = 263 // { int sys_pipe(int *fdp); } + SYS_FHOPEN = 264 // { int sys_fhopen(const fhandle_t *fhp, int flags); } + SYS_PREADV = 267 // { ssize_t sys_preadv(int fd, \ + SYS_PWRITEV = 268 // { ssize_t sys_pwritev(int fd, \ + SYS_KQUEUE = 269 // { int sys_kqueue(void); } + SYS_MLOCKALL = 271 // { int sys_mlockall(int flags); } + SYS_MUNLOCKALL = 272 // { int sys_munlockall(void); } + SYS_GETRESUID = 281 // { int sys_getresuid(uid_t *ruid, uid_t *euid, \ + SYS_SETRESUID = 282 // { int sys_setresuid(uid_t ruid, uid_t euid, \ + SYS_GETRESGID = 283 // { int sys_getresgid(gid_t *rgid, gid_t *egid, \ + SYS_SETRESGID = 284 // { int sys_setresgid(gid_t rgid, gid_t egid, \ + SYS_MQUERY = 286 // { void *sys_mquery(void *addr, size_t len, int prot, \ + SYS_CLOSEFROM = 287 // { int sys_closefrom(int fd); } + SYS_SIGALTSTACK = 288 // { int sys_sigaltstack(const struct sigaltstack *nss, \ + SYS_SHMGET = 289 // { int sys_shmget(key_t key, size_t size, int shmflg); } + SYS_SEMOP = 290 // { int sys_semop(int semid, struct sembuf *sops, \ + SYS_FHSTAT = 294 // { int sys_fhstat(const fhandle_t *fhp, \ + SYS___SEMCTL = 295 // { int sys___semctl(int semid, int semnum, int cmd, \ + SYS_SHMCTL = 296 // { int sys_shmctl(int shmid, int cmd, \ + SYS_MSGCTL = 297 // { int sys_msgctl(int msqid, int cmd, \ + SYS_SCHED_YIELD = 298 // { int sys_sched_yield(void); } + SYS_GETTHRID = 299 // { pid_t sys_getthrid(void); } + SYS___THRWAKEUP = 301 // { int sys___thrwakeup(const volatile void *ident, \ + SYS___THREXIT = 302 // { void sys___threxit(pid_t *notdead); } + SYS___THRSIGDIVERT = 303 // { int sys___thrsigdivert(sigset_t sigmask, \ + SYS___GETCWD = 304 // { int sys___getcwd(char *buf, size_t len); } + SYS_ADJFREQ = 305 // { int sys_adjfreq(const int64_t *freq, \ + SYS_SETRTABLE = 310 // { int sys_setrtable(int rtableid); } + SYS_GETRTABLE = 311 // { int sys_getrtable(void); } + SYS_FACCESSAT = 313 // { int sys_faccessat(int fd, const char *path, \ + SYS_FCHMODAT = 314 // { int sys_fchmodat(int fd, const char *path, \ + SYS_FCHOWNAT = 315 // { int sys_fchownat(int fd, const char *path, \ + SYS_LINKAT = 317 // { int sys_linkat(int fd1, const char *path1, int fd2, \ + SYS_MKDIRAT = 318 // { int sys_mkdirat(int fd, const char *path, \ + SYS_MKFIFOAT = 319 // { int sys_mkfifoat(int fd, const char *path, \ + SYS_MKNODAT = 320 // { int sys_mknodat(int fd, const char *path, \ + SYS_OPENAT = 321 // { int sys_openat(int fd, const char *path, int flags, \ + SYS_READLINKAT = 322 // { ssize_t sys_readlinkat(int fd, const char *path, \ + SYS_RENAMEAT = 323 // { int sys_renameat(int fromfd, const char *from, \ + SYS_SYMLINKAT = 324 // { int sys_symlinkat(const char *path, int fd, \ + SYS_UNLINKAT = 325 // { int sys_unlinkat(int fd, const char *path, \ + SYS___SET_TCB = 329 // { void sys___set_tcb(void *tcb); } + SYS___GET_TCB = 330 // { void *sys___get_tcb(void); } +) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm.go new file mode 100644 index 00000000..be1198d9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm.go @@ -0,0 +1,218 @@ +// mksysnum_openbsd.pl +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm,openbsd + +package unix + +const ( + SYS_EXIT = 1 // { void sys_exit(int rval); } + SYS_FORK = 2 // { int sys_fork(void); } + SYS_READ = 3 // { ssize_t sys_read(int fd, void *buf, size_t nbyte); } + SYS_WRITE = 4 // { ssize_t sys_write(int fd, const void *buf, \ + SYS_OPEN = 5 // { int sys_open(const char *path, \ + SYS_CLOSE = 6 // { int sys_close(int fd); } + SYS_GETENTROPY = 7 // { int sys_getentropy(void *buf, size_t nbyte); } + SYS___TFORK = 8 // { int sys___tfork(const struct __tfork *param, \ + SYS_LINK = 9 // { int sys_link(const char *path, const char *link); } + SYS_UNLINK = 10 // { int sys_unlink(const char *path); } + SYS_WAIT4 = 11 // { pid_t sys_wait4(pid_t pid, int *status, \ + SYS_CHDIR = 12 // { int sys_chdir(const char *path); } + SYS_FCHDIR = 13 // { int sys_fchdir(int fd); } + SYS_MKNOD = 14 // { int sys_mknod(const char *path, mode_t mode, \ + SYS_CHMOD = 15 // { int sys_chmod(const char *path, mode_t mode); } + SYS_CHOWN = 16 // { int sys_chown(const char *path, uid_t uid, \ + SYS_OBREAK = 17 // { int sys_obreak(char *nsize); } break + SYS_GETDTABLECOUNT = 18 // { int sys_getdtablecount(void); } + SYS_GETRUSAGE = 19 // { int sys_getrusage(int who, \ + SYS_GETPID = 20 // { pid_t sys_getpid(void); } + SYS_MOUNT = 21 // { int sys_mount(const char *type, const char *path, \ + SYS_UNMOUNT = 22 // { int sys_unmount(const char *path, int flags); } + SYS_SETUID = 23 // { int sys_setuid(uid_t uid); } + SYS_GETUID = 24 // { uid_t sys_getuid(void); } + SYS_GETEUID = 25 // { uid_t sys_geteuid(void); } + SYS_PTRACE = 26 // { int sys_ptrace(int req, pid_t pid, caddr_t addr, \ + SYS_RECVMSG = 27 // { ssize_t sys_recvmsg(int s, struct msghdr *msg, \ + SYS_SENDMSG = 28 // { ssize_t sys_sendmsg(int s, \ + SYS_RECVFROM = 29 // { ssize_t sys_recvfrom(int s, void *buf, size_t len, \ + SYS_ACCEPT = 30 // { int sys_accept(int s, struct sockaddr *name, \ + SYS_GETPEERNAME = 31 // { int sys_getpeername(int fdes, struct sockaddr *asa, \ + SYS_GETSOCKNAME = 32 // { int sys_getsockname(int fdes, struct sockaddr *asa, \ + SYS_ACCESS = 33 // { int sys_access(const char *path, int amode); } + SYS_CHFLAGS = 34 // { int sys_chflags(const char *path, u_int flags); } + SYS_FCHFLAGS = 35 // { int sys_fchflags(int fd, u_int flags); } + SYS_SYNC = 36 // { void sys_sync(void); } + SYS_STAT = 38 // { int sys_stat(const char *path, struct stat *ub); } + SYS_GETPPID = 39 // { pid_t sys_getppid(void); } + SYS_LSTAT = 40 // { int sys_lstat(const char *path, struct stat *ub); } + SYS_DUP = 41 // { int sys_dup(int fd); } + SYS_FSTATAT = 42 // { int sys_fstatat(int fd, const char *path, \ + SYS_GETEGID = 43 // { gid_t sys_getegid(void); } + SYS_PROFIL = 44 // { int sys_profil(caddr_t samples, size_t size, \ + SYS_KTRACE = 45 // { int sys_ktrace(const char *fname, int ops, \ + SYS_SIGACTION = 46 // { int sys_sigaction(int signum, \ + SYS_GETGID = 47 // { gid_t sys_getgid(void); } + SYS_SIGPROCMASK = 48 // { int sys_sigprocmask(int how, sigset_t mask); } + SYS_SETLOGIN = 50 // { int sys_setlogin(const char *namebuf); } + SYS_ACCT = 51 // { int sys_acct(const char *path); } + SYS_SIGPENDING = 52 // { int sys_sigpending(void); } + SYS_FSTAT = 53 // { int sys_fstat(int fd, struct stat *sb); } + SYS_IOCTL = 54 // { int sys_ioctl(int fd, \ + SYS_REBOOT = 55 // { int sys_reboot(int opt); } + SYS_REVOKE = 56 // { int sys_revoke(const char *path); } + SYS_SYMLINK = 57 // { int sys_symlink(const char *path, \ + SYS_READLINK = 58 // { ssize_t sys_readlink(const char *path, \ + SYS_EXECVE = 59 // { int sys_execve(const char *path, \ + SYS_UMASK = 60 // { mode_t sys_umask(mode_t newmask); } + SYS_CHROOT = 61 // { int sys_chroot(const char *path); } + SYS_GETFSSTAT = 62 // { int sys_getfsstat(struct statfs *buf, size_t bufsize, \ + SYS_STATFS = 63 // { int sys_statfs(const char *path, \ + SYS_FSTATFS = 64 // { int sys_fstatfs(int fd, struct statfs *buf); } + SYS_FHSTATFS = 65 // { int sys_fhstatfs(const fhandle_t *fhp, \ + SYS_VFORK = 66 // { int sys_vfork(void); } + SYS_GETTIMEOFDAY = 67 // { int sys_gettimeofday(struct timeval *tp, \ + SYS_SETTIMEOFDAY = 68 // { int sys_settimeofday(const struct timeval *tv, \ + SYS_SETITIMER = 69 // { int sys_setitimer(int which, \ + SYS_GETITIMER = 70 // { int sys_getitimer(int which, \ + SYS_SELECT = 71 // { int sys_select(int nd, fd_set *in, fd_set *ou, \ + SYS_KEVENT = 72 // { int sys_kevent(int fd, \ + SYS_MUNMAP = 73 // { int sys_munmap(void *addr, size_t len); } + SYS_MPROTECT = 74 // { int sys_mprotect(void *addr, size_t len, \ + SYS_MADVISE = 75 // { int sys_madvise(void *addr, size_t len, \ + SYS_UTIMES = 76 // { int sys_utimes(const char *path, \ + SYS_FUTIMES = 77 // { int sys_futimes(int fd, \ + SYS_MINCORE = 78 // { int sys_mincore(void *addr, size_t len, \ + SYS_GETGROUPS = 79 // { int sys_getgroups(int gidsetsize, \ + SYS_SETGROUPS = 80 // { int sys_setgroups(int gidsetsize, \ + SYS_GETPGRP = 81 // { int sys_getpgrp(void); } + SYS_SETPGID = 82 // { int sys_setpgid(pid_t pid, pid_t pgid); } + SYS_FUTEX = 83 // { int sys_futex(uint32_t *f, int op, int val, \ + SYS_UTIMENSAT = 84 // { int sys_utimensat(int fd, const char *path, \ + SYS_FUTIMENS = 85 // { int sys_futimens(int fd, \ + SYS_KBIND = 86 // { int sys_kbind(const struct __kbind *param, \ + SYS_CLOCK_GETTIME = 87 // { int sys_clock_gettime(clockid_t clock_id, \ + SYS_CLOCK_SETTIME = 88 // { int sys_clock_settime(clockid_t clock_id, \ + SYS_CLOCK_GETRES = 89 // { int sys_clock_getres(clockid_t clock_id, \ + SYS_DUP2 = 90 // { int sys_dup2(int from, int to); } + SYS_NANOSLEEP = 91 // { int sys_nanosleep(const struct timespec *rqtp, \ + SYS_FCNTL = 92 // { int sys_fcntl(int fd, int cmd, ... void *arg); } + SYS_ACCEPT4 = 93 // { int sys_accept4(int s, struct sockaddr *name, \ + SYS___THRSLEEP = 94 // { int sys___thrsleep(const volatile void *ident, \ + SYS_FSYNC = 95 // { int sys_fsync(int fd); } + SYS_SETPRIORITY = 96 // { int sys_setpriority(int which, id_t who, int prio); } + SYS_SOCKET = 97 // { int sys_socket(int domain, int type, int protocol); } + SYS_CONNECT = 98 // { int sys_connect(int s, const struct sockaddr *name, \ + SYS_GETDENTS = 99 // { int sys_getdents(int fd, void *buf, size_t buflen); } + SYS_GETPRIORITY = 100 // { int sys_getpriority(int which, id_t who); } + SYS_PIPE2 = 101 // { int sys_pipe2(int *fdp, int flags); } + SYS_DUP3 = 102 // { int sys_dup3(int from, int to, int flags); } + SYS_SIGRETURN = 103 // { int sys_sigreturn(struct sigcontext *sigcntxp); } + SYS_BIND = 104 // { int sys_bind(int s, const struct sockaddr *name, \ + SYS_SETSOCKOPT = 105 // { int sys_setsockopt(int s, int level, int name, \ + SYS_LISTEN = 106 // { int sys_listen(int s, int backlog); } + SYS_CHFLAGSAT = 107 // { int sys_chflagsat(int fd, const char *path, \ + SYS_PLEDGE = 108 // { int sys_pledge(const char *promises, \ + SYS_PPOLL = 109 // { int sys_ppoll(struct pollfd *fds, \ + SYS_PSELECT = 110 // { int sys_pselect(int nd, fd_set *in, fd_set *ou, \ + SYS_SIGSUSPEND = 111 // { int sys_sigsuspend(int mask); } + SYS_SENDSYSLOG = 112 // { int sys_sendsyslog(const char *buf, size_t nbyte, \ + SYS_UNVEIL = 114 // { int sys_unveil(const char *path, \ + SYS_GETSOCKOPT = 118 // { int sys_getsockopt(int s, int level, int name, \ + SYS_THRKILL = 119 // { int sys_thrkill(pid_t tid, int signum, void *tcb); } + SYS_READV = 120 // { ssize_t sys_readv(int fd, \ + SYS_WRITEV = 121 // { ssize_t sys_writev(int fd, \ + SYS_KILL = 122 // { int sys_kill(int pid, int signum); } + SYS_FCHOWN = 123 // { int sys_fchown(int fd, uid_t uid, gid_t gid); } + SYS_FCHMOD = 124 // { int sys_fchmod(int fd, mode_t mode); } + SYS_SETREUID = 126 // { int sys_setreuid(uid_t ruid, uid_t euid); } + SYS_SETREGID = 127 // { int sys_setregid(gid_t rgid, gid_t egid); } + SYS_RENAME = 128 // { int sys_rename(const char *from, const char *to); } + SYS_FLOCK = 131 // { int sys_flock(int fd, int how); } + SYS_MKFIFO = 132 // { int sys_mkfifo(const char *path, mode_t mode); } + SYS_SENDTO = 133 // { ssize_t sys_sendto(int s, const void *buf, \ + SYS_SHUTDOWN = 134 // { int sys_shutdown(int s, int how); } + SYS_SOCKETPAIR = 135 // { int sys_socketpair(int domain, int type, \ + SYS_MKDIR = 136 // { int sys_mkdir(const char *path, mode_t mode); } + SYS_RMDIR = 137 // { int sys_rmdir(const char *path); } + SYS_ADJTIME = 140 // { int sys_adjtime(const struct timeval *delta, \ + SYS_GETLOGIN_R = 141 // { int sys_getlogin_r(char *namebuf, u_int namelen); } + SYS_SETSID = 147 // { int sys_setsid(void); } + SYS_QUOTACTL = 148 // { int sys_quotactl(const char *path, int cmd, \ + SYS_NFSSVC = 155 // { int sys_nfssvc(int flag, void *argp); } + SYS_GETFH = 161 // { int sys_getfh(const char *fname, fhandle_t *fhp); } + SYS_SYSARCH = 165 // { int sys_sysarch(int op, void *parms); } + SYS_PREAD = 173 // { ssize_t sys_pread(int fd, void *buf, \ + SYS_PWRITE = 174 // { ssize_t sys_pwrite(int fd, const void *buf, \ + SYS_SETGID = 181 // { int sys_setgid(gid_t gid); } + SYS_SETEGID = 182 // { int sys_setegid(gid_t egid); } + SYS_SETEUID = 183 // { int sys_seteuid(uid_t euid); } + SYS_PATHCONF = 191 // { long sys_pathconf(const char *path, int name); } + SYS_FPATHCONF = 192 // { long sys_fpathconf(int fd, int name); } + SYS_SWAPCTL = 193 // { int sys_swapctl(int cmd, const void *arg, int misc); } + SYS_GETRLIMIT = 194 // { int sys_getrlimit(int which, \ + SYS_SETRLIMIT = 195 // { int sys_setrlimit(int which, \ + SYS_MMAP = 197 // { void *sys_mmap(void *addr, size_t len, int prot, \ + SYS_LSEEK = 199 // { off_t sys_lseek(int fd, int pad, off_t offset, \ + SYS_TRUNCATE = 200 // { int sys_truncate(const char *path, int pad, \ + SYS_FTRUNCATE = 201 // { int sys_ftruncate(int fd, int pad, off_t length); } + SYS_SYSCTL = 202 // { int sys_sysctl(const int *name, u_int namelen, \ + SYS_MLOCK = 203 // { int sys_mlock(const void *addr, size_t len); } + SYS_MUNLOCK = 204 // { int sys_munlock(const void *addr, size_t len); } + SYS_GETPGID = 207 // { pid_t sys_getpgid(pid_t pid); } + SYS_UTRACE = 209 // { int sys_utrace(const char *label, const void *addr, \ + SYS_SEMGET = 221 // { int sys_semget(key_t key, int nsems, int semflg); } + SYS_MSGGET = 225 // { int sys_msgget(key_t key, int msgflg); } + SYS_MSGSND = 226 // { int sys_msgsnd(int msqid, const void *msgp, size_t msgsz, \ + SYS_MSGRCV = 227 // { int sys_msgrcv(int msqid, void *msgp, size_t msgsz, \ + SYS_SHMAT = 228 // { void *sys_shmat(int shmid, const void *shmaddr, \ + SYS_SHMDT = 230 // { int sys_shmdt(const void *shmaddr); } + SYS_MINHERIT = 250 // { int sys_minherit(void *addr, size_t len, \ + SYS_POLL = 252 // { int sys_poll(struct pollfd *fds, \ + SYS_ISSETUGID = 253 // { int sys_issetugid(void); } + SYS_LCHOWN = 254 // { int sys_lchown(const char *path, uid_t uid, gid_t gid); } + SYS_GETSID = 255 // { pid_t sys_getsid(pid_t pid); } + SYS_MSYNC = 256 // { int sys_msync(void *addr, size_t len, int flags); } + SYS_PIPE = 263 // { int sys_pipe(int *fdp); } + SYS_FHOPEN = 264 // { int sys_fhopen(const fhandle_t *fhp, int flags); } + SYS_PREADV = 267 // { ssize_t sys_preadv(int fd, \ + SYS_PWRITEV = 268 // { ssize_t sys_pwritev(int fd, \ + SYS_KQUEUE = 269 // { int sys_kqueue(void); } + SYS_MLOCKALL = 271 // { int sys_mlockall(int flags); } + SYS_MUNLOCKALL = 272 // { int sys_munlockall(void); } + SYS_GETRESUID = 281 // { int sys_getresuid(uid_t *ruid, uid_t *euid, \ + SYS_SETRESUID = 282 // { int sys_setresuid(uid_t ruid, uid_t euid, \ + SYS_GETRESGID = 283 // { int sys_getresgid(gid_t *rgid, gid_t *egid, \ + SYS_SETRESGID = 284 // { int sys_setresgid(gid_t rgid, gid_t egid, \ + SYS_MQUERY = 286 // { void *sys_mquery(void *addr, size_t len, int prot, \ + SYS_CLOSEFROM = 287 // { int sys_closefrom(int fd); } + SYS_SIGALTSTACK = 288 // { int sys_sigaltstack(const struct sigaltstack *nss, \ + SYS_SHMGET = 289 // { int sys_shmget(key_t key, size_t size, int shmflg); } + SYS_SEMOP = 290 // { int sys_semop(int semid, struct sembuf *sops, \ + SYS_FHSTAT = 294 // { int sys_fhstat(const fhandle_t *fhp, \ + SYS___SEMCTL = 295 // { int sys___semctl(int semid, int semnum, int cmd, \ + SYS_SHMCTL = 296 // { int sys_shmctl(int shmid, int cmd, \ + SYS_MSGCTL = 297 // { int sys_msgctl(int msqid, int cmd, \ + SYS_SCHED_YIELD = 298 // { int sys_sched_yield(void); } + SYS_GETTHRID = 299 // { pid_t sys_getthrid(void); } + SYS___THRWAKEUP = 301 // { int sys___thrwakeup(const volatile void *ident, \ + SYS___THREXIT = 302 // { void sys___threxit(pid_t *notdead); } + SYS___THRSIGDIVERT = 303 // { int sys___thrsigdivert(sigset_t sigmask, \ + SYS___GETCWD = 304 // { int sys___getcwd(char *buf, size_t len); } + SYS_ADJFREQ = 305 // { int sys_adjfreq(const int64_t *freq, \ + SYS_SETRTABLE = 310 // { int sys_setrtable(int rtableid); } + SYS_GETRTABLE = 311 // { int sys_getrtable(void); } + SYS_FACCESSAT = 313 // { int sys_faccessat(int fd, const char *path, \ + SYS_FCHMODAT = 314 // { int sys_fchmodat(int fd, const char *path, \ + SYS_FCHOWNAT = 315 // { int sys_fchownat(int fd, const char *path, \ + SYS_LINKAT = 317 // { int sys_linkat(int fd1, const char *path1, int fd2, \ + SYS_MKDIRAT = 318 // { int sys_mkdirat(int fd, const char *path, \ + SYS_MKFIFOAT = 319 // { int sys_mkfifoat(int fd, const char *path, \ + SYS_MKNODAT = 320 // { int sys_mknodat(int fd, const char *path, \ + SYS_OPENAT = 321 // { int sys_openat(int fd, const char *path, int flags, \ + SYS_READLINKAT = 322 // { ssize_t sys_readlinkat(int fd, const char *path, \ + SYS_RENAMEAT = 323 // { int sys_renameat(int fromfd, const char *from, \ + SYS_SYMLINKAT = 324 // { int sys_symlinkat(const char *path, int fd, \ + SYS_UNLINKAT = 325 // { int sys_unlinkat(int fd, const char *path, \ + SYS___SET_TCB = 329 // { void sys___set_tcb(void *tcb); } + SYS___GET_TCB = 330 // { void *sys___get_tcb(void); } +) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_aix_ppc.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_aix_ppc.go new file mode 100644 index 00000000..cedc9b0f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_aix_ppc.go @@ -0,0 +1,345 @@ +// cgo -godefs types_aix.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build ppc,aix + +package unix + +const ( + SizeofPtr = 0x4 + SizeofShort = 0x2 + SizeofInt = 0x4 + SizeofLong = 0x4 + SizeofLongLong = 0x8 + PathMax = 0x3ff +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type off64 int64 +type off int32 +type Mode_t uint32 + +type Timespec struct { + Sec int32 + Nsec int32 +} + +type StTimespec struct { + Sec int32 + Nsec int32 +} + +type Timeval struct { + Sec int32 + Usec int32 +} + +type Timeval32 struct { + Sec int32 + Usec int32 +} + +type Timex struct{} + +type Time_t int32 + +type Tms struct{} + +type Utimbuf struct { + Actime int32 + Modtime int32 +} + +type Timezone struct { + Minuteswest int32 + Dsttime int32 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type Pid_t int32 + +type _Gid_t uint32 + +type dev_t uint32 + +type Stat_t struct { + Dev uint32 + Ino uint32 + Mode uint32 + Nlink int16 + Flag uint16 + Uid uint32 + Gid uint32 + Rdev uint32 + Size int32 + Atim StTimespec + Mtim StTimespec + Ctim StTimespec + Blksize int32 + Blocks int32 + Vfstype int32 + Vfs uint32 + Type uint32 + Gen uint32 + Reserved [9]uint32 +} + +type StatxTimestamp struct{} + +type Statx_t struct{} + +type Dirent struct { + Offset uint32 + Ino uint32 + Reclen uint16 + Namlen uint16 + Name [256]uint8 +} + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [1023]uint8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]uint8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [1012]uint8 +} + +type _Socklen uint32 + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen int32 + Control *byte + Controllen uint32 + Flags int32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x404 + SizeofSockaddrUnix = 0x401 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofICMPv6Filter = 0x20 +) + +const ( + SizeofIfMsghdr = 0x10 +) + +type IfMsgHdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Addrlen uint8 + _ [1]byte +} + +type FdSet struct { + Bits [2048]int32 +} + +type Utsname struct { + Sysname [32]byte + Nodename [32]byte + Release [32]byte + Version [32]byte + Machine [32]byte +} + +type Ustat_t struct{} + +type Sigset_t struct { + Losigs uint32 + Hisigs uint32 +} + +const ( + AT_FDCWD = -0x2 + AT_REMOVEDIR = 0x1 + AT_SYMLINK_NOFOLLOW = 0x1 +) + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [16]uint8 +} + +type Termio struct { + Iflag uint16 + Oflag uint16 + Cflag uint16 + Lflag uint16 + Line uint8 + Cc [8]uint8 + _ [1]byte +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type PollFd struct { + Fd int32 + Events uint16 + Revents uint16 +} + +const ( + POLLERR = 0x4000 + POLLHUP = 0x2000 + POLLIN = 0x1 + POLLNVAL = 0x8000 + POLLOUT = 0x2 + POLLPRI = 0x4 + POLLRDBAND = 0x20 + POLLRDNORM = 0x10 + POLLWRBAND = 0x40 + POLLWRNORM = 0x2 +) + +type Flock_t struct { + Type int16 + Whence int16 + Sysid uint32 + Pid int32 + Vfs int32 + Start int64 + Len int64 +} + +type Fsid_t struct { + Val [2]uint32 +} +type Fsid64_t struct { + Val [2]uint64 +} + +type Statfs_t struct { + Version int32 + Type int32 + Bsize uint32 + Blocks uint32 + Bfree uint32 + Bavail uint32 + Files uint32 + Ffree uint32 + Fsid Fsid_t + Vfstype int32 + Fsize uint32 + Vfsnumber int32 + Vfsoff int32 + Vfslen int32 + Vfsvers int32 + Fname [32]uint8 + Fpack [32]uint8 + Name_max int32 +} + +const RNDGETENTCNT = 0x80045200 diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_aix_ppc64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_aix_ppc64.go new file mode 100644 index 00000000..f46482d2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_aix_ppc64.go @@ -0,0 +1,354 @@ +// cgo -godefs types_aix.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build ppc64,aix + +package unix + +const ( + SizeofPtr = 0x8 + SizeofShort = 0x2 + SizeofInt = 0x4 + SizeofLong = 0x8 + SizeofLongLong = 0x8 + PathMax = 0x3ff +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type off64 int64 +type off int64 +type Mode_t uint32 + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type StTimespec struct { + Sec int64 + Nsec int32 + _ [4]byte +} + +type Timeval struct { + Sec int64 + Usec int32 + _ [4]byte +} + +type Timeval32 struct { + Sec int32 + Usec int32 +} + +type Timex struct{} + +type Time_t int64 + +type Tms struct{} + +type Utimbuf struct { + Actime int64 + Modtime int64 +} + +type Timezone struct { + Minuteswest int32 + Dsttime int32 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type Pid_t int32 + +type _Gid_t uint32 + +type dev_t uint64 + +type Stat_t struct { + Dev uint64 + Ino uint64 + Mode uint32 + Nlink int16 + Flag uint16 + Uid uint32 + Gid uint32 + Rdev uint64 + Ssize int32 + _ [4]byte + Atim StTimespec + Mtim StTimespec + Ctim StTimespec + Blksize int64 + Blocks int64 + Vfstype int32 + Vfs uint32 + Type uint32 + Gen uint32 + Reserved [9]uint32 + Padto_ll uint32 + Size int64 +} + +type StatxTimestamp struct{} + +type Statx_t struct{} + +type Dirent struct { + Offset uint64 + Ino uint64 + Reclen uint16 + Namlen uint16 + Name [256]uint8 + _ [4]byte +} + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [1023]uint8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]uint8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [1012]uint8 +} + +type _Socklen uint32 + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + _ [4]byte + Iov *Iovec + Iovlen int32 + _ [4]byte + Control *byte + Controllen uint32 + Flags int32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x404 + SizeofSockaddrUnix = 0x401 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofMsghdr = 0x30 + SizeofCmsghdr = 0xc + SizeofICMPv6Filter = 0x20 +) + +const ( + SizeofIfMsghdr = 0x10 +) + +type IfMsgHdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Addrlen uint8 + _ [1]byte +} + +type FdSet struct { + Bits [1024]int64 +} + +type Utsname struct { + Sysname [32]byte + Nodename [32]byte + Release [32]byte + Version [32]byte + Machine [32]byte +} + +type Ustat_t struct{} + +type Sigset_t struct { + Set [4]uint64 +} + +const ( + AT_FDCWD = -0x2 + AT_REMOVEDIR = 0x1 + AT_SYMLINK_NOFOLLOW = 0x1 +) + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [16]uint8 +} + +type Termio struct { + Iflag uint16 + Oflag uint16 + Cflag uint16 + Lflag uint16 + Line uint8 + Cc [8]uint8 + _ [1]byte +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type PollFd struct { + Fd int32 + Events uint16 + Revents uint16 +} + +const ( + POLLERR = 0x4000 + POLLHUP = 0x2000 + POLLIN = 0x1 + POLLNVAL = 0x8000 + POLLOUT = 0x2 + POLLPRI = 0x4 + POLLRDBAND = 0x20 + POLLRDNORM = 0x10 + POLLWRBAND = 0x40 + POLLWRNORM = 0x2 +) + +type Flock_t struct { + Type int16 + Whence int16 + Sysid uint32 + Pid int32 + Vfs int32 + Start int64 + Len int64 +} + +type Fsid_t struct { + Val [2]uint32 +} +type Fsid64_t struct { + Val [2]uint64 +} + +type Statfs_t struct { + Version int32 + Type int32 + Bsize uint64 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid64_t + Vfstype int32 + _ [4]byte + Fsize uint64 + Vfsnumber int32 + Vfsoff int32 + Vfslen int32 + Vfsvers int32 + Fname [32]uint8 + Fpack [32]uint8 + Name_max int32 + _ [4]byte +} + +const RNDGETENTCNT = 0x80045200 diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_darwin_386.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_darwin_386.go new file mode 100644 index 00000000..2aeb52a8 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_darwin_386.go @@ -0,0 +1,489 @@ +// cgo -godefs types_darwin.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build 386,darwin + +package unix + +const ( + SizeofPtr = 0x4 + SizeofShort = 0x2 + SizeofInt = 0x4 + SizeofLong = 0x4 + SizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int32 + Nsec int32 +} + +type Timeval struct { + Sec int32 + Usec int32 +} + +type Timeval32 struct{} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev int32 + Mode uint16 + Nlink uint16 + Ino uint64 + Uid uint32 + Gid uint32 + Rdev int32 + Atimespec Timespec + Mtimespec Timespec + Ctimespec Timespec + Birthtimespec Timespec + Size int64 + Blocks int64 + Blksize int32 + Flags uint32 + Gen uint32 + Lspare int32 + Qspare [2]int64 +} + +type Statfs_t struct { + Bsize uint32 + Iosize int32 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Owner uint32 + Type uint32 + Flags uint32 + Fssubtype uint32 + Fstypename [16]int8 + Mntonname [1024]int8 + Mntfromname [1024]int8 + Reserved [8]uint32 +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Fstore_t struct { + Flags uint32 + Posmode int32 + Offset int64 + Length int64 + Bytesalloc int64 +} + +type Radvisory_t struct { + Offset int64 + Count int32 +} + +type Fbootstraptransfer_t struct { + Offset int64 + Length uint32 + Buffer *byte +} + +type Log2phys_t struct { + Flags uint32 + Contigbytes int64 + Devoffset int64 +} + +type Fsid struct { + Val [2]int32 +} + +type Dirent struct { + Ino uint64 + Seekoff uint64 + Reclen uint16 + Namlen uint16 + Type uint8 + Name [1024]int8 + _ [3]byte +} + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [12]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen int32 + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex uint32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x14 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint32 + Filter int16 + Flags uint16 + Fflags uint32 + Data int32 + Udata *byte +} + +type FdSet struct { + Bits [32]int32 +} + +const ( + SizeofIfMsghdr = 0x70 + SizeofIfData = 0x60 + SizeofIfaMsghdr = 0x14 + SizeofIfmaMsghdr = 0x10 + SizeofIfmaMsghdr2 = 0x14 + SizeofRtMsghdr = 0x5c + SizeofRtMetrics = 0x38 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Data IfData +} + +type IfData struct { + Type uint8 + Typelen uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Recvquota uint8 + Xmitquota uint8 + Unused1 uint8 + Mtu uint32 + Metric uint32 + Baudrate uint32 + Ipackets uint32 + Ierrors uint32 + Opackets uint32 + Oerrors uint32 + Collisions uint32 + Ibytes uint32 + Obytes uint32 + Imcasts uint32 + Omcasts uint32 + Iqdrops uint32 + Noproto uint32 + Recvtiming uint32 + Xmittiming uint32 + Lastchange Timeval + Unused2 uint32 + Hwassist uint32 + Reserved1 uint32 + Reserved2 uint32 +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Metric int32 +} + +type IfmaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte +} + +type IfmaMsghdr2 struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Refcount int32 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + _ [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Use int32 + Inits uint32 + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint32 + Mtu uint32 + Hopcount uint32 + Expire int32 + Recvpipe uint32 + Sendpipe uint32 + Ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Pksent uint32 + Filler [4]uint32 +} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x8 + SizeofBpfProgram = 0x8 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x14 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint32 + Drop uint32 +} + +type BpfProgram struct { + Len uint32 + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp Timeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + _ [2]byte +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x2 + AT_REMOVEDIR = 0x80 + AT_SYMLINK_FOLLOW = 0x40 + AT_SYMLINK_NOFOLLOW = 0x20 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) + +type Utsname struct { + Sysname [256]byte + Nodename [256]byte + Release [256]byte + Version [256]byte + Machine [256]byte +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go new file mode 100644 index 00000000..0d0d9f2c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go @@ -0,0 +1,499 @@ +// cgo -godefs types_darwin.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,darwin + +package unix + +const ( + SizeofPtr = 0x8 + SizeofShort = 0x2 + SizeofInt = 0x4 + SizeofLong = 0x8 + SizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int32 + _ [4]byte +} + +type Timeval32 struct { + Sec int32 + Usec int32 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev int32 + Mode uint16 + Nlink uint16 + Ino uint64 + Uid uint32 + Gid uint32 + Rdev int32 + _ [4]byte + Atimespec Timespec + Mtimespec Timespec + Ctimespec Timespec + Birthtimespec Timespec + Size int64 + Blocks int64 + Blksize int32 + Flags uint32 + Gen uint32 + Lspare int32 + Qspare [2]int64 +} + +type Statfs_t struct { + Bsize uint32 + Iosize int32 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Owner uint32 + Type uint32 + Flags uint32 + Fssubtype uint32 + Fstypename [16]int8 + Mntonname [1024]int8 + Mntfromname [1024]int8 + Reserved [8]uint32 +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Fstore_t struct { + Flags uint32 + Posmode int32 + Offset int64 + Length int64 + Bytesalloc int64 +} + +type Radvisory_t struct { + Offset int64 + Count int32 + _ [4]byte +} + +type Fbootstraptransfer_t struct { + Offset int64 + Length uint64 + Buffer *byte +} + +type Log2phys_t struct { + Flags uint32 + _ [8]byte + _ [8]byte +} + +type Fsid struct { + Val [2]int32 +} + +type Dirent struct { + Ino uint64 + Seekoff uint64 + Reclen uint16 + Namlen uint16 + Type uint8 + Name [1024]int8 + _ [3]byte +} + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [12]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + _ [4]byte + Iov *Iovec + Iovlen int32 + _ [4]byte + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex uint32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x14 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x30 + SizeofCmsghdr = 0xc + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint64 + Filter int16 + Flags uint16 + Fflags uint32 + Data int64 + Udata *byte +} + +type FdSet struct { + Bits [32]int32 +} + +const ( + SizeofIfMsghdr = 0x70 + SizeofIfData = 0x60 + SizeofIfaMsghdr = 0x14 + SizeofIfmaMsghdr = 0x10 + SizeofIfmaMsghdr2 = 0x14 + SizeofRtMsghdr = 0x5c + SizeofRtMetrics = 0x38 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Data IfData +} + +type IfData struct { + Type uint8 + Typelen uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Recvquota uint8 + Xmitquota uint8 + Unused1 uint8 + Mtu uint32 + Metric uint32 + Baudrate uint32 + Ipackets uint32 + Ierrors uint32 + Opackets uint32 + Oerrors uint32 + Collisions uint32 + Ibytes uint32 + Obytes uint32 + Imcasts uint32 + Omcasts uint32 + Iqdrops uint32 + Noproto uint32 + Recvtiming uint32 + Xmittiming uint32 + Lastchange Timeval32 + Unused2 uint32 + Hwassist uint32 + Reserved1 uint32 + Reserved2 uint32 +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Metric int32 +} + +type IfmaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte +} + +type IfmaMsghdr2 struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Refcount int32 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + _ [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Use int32 + Inits uint32 + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint32 + Mtu uint32 + Hopcount uint32 + Expire int32 + Recvpipe uint32 + Sendpipe uint32 + Ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Pksent uint32 + Filler [4]uint32 +} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x8 + SizeofBpfProgram = 0x10 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x14 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint32 + Drop uint32 +} + +type BpfProgram struct { + Len uint32 + _ [4]byte + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp Timeval32 + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + _ [2]byte +} + +type Termios struct { + Iflag uint64 + Oflag uint64 + Cflag uint64 + Lflag uint64 + Cc [20]uint8 + _ [4]byte + Ispeed uint64 + Ospeed uint64 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x2 + AT_REMOVEDIR = 0x80 + AT_SYMLINK_FOLLOW = 0x40 + AT_SYMLINK_NOFOLLOW = 0x20 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) + +type Utsname struct { + Sysname [256]byte + Nodename [256]byte + Release [256]byte + Version [256]byte + Machine [256]byte +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_darwin_arm.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_darwin_arm.go new file mode 100644 index 00000000..04e344b7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_darwin_arm.go @@ -0,0 +1,490 @@ +// NOTE: cgo can't generate struct Stat_t and struct Statfs_t yet +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types_darwin.go + +// +build arm,darwin + +package unix + +const ( + SizeofPtr = 0x4 + SizeofShort = 0x2 + SizeofInt = 0x4 + SizeofLong = 0x4 + SizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int32 + Nsec int32 +} + +type Timeval struct { + Sec int32 + Usec int32 +} + +type Timeval32 [0]byte + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev int32 + Mode uint16 + Nlink uint16 + Ino uint64 + Uid uint32 + Gid uint32 + Rdev int32 + Atimespec Timespec + Mtimespec Timespec + Ctimespec Timespec + Birthtimespec Timespec + Size int64 + Blocks int64 + Blksize int32 + Flags uint32 + Gen uint32 + Lspare int32 + Qspare [2]int64 +} + +type Statfs_t struct { + Bsize uint32 + Iosize int32 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Owner uint32 + Type uint32 + Flags uint32 + Fssubtype uint32 + Fstypename [16]int8 + Mntonname [1024]int8 + Mntfromname [1024]int8 + Reserved [8]uint32 +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Fstore_t struct { + Flags uint32 + Posmode int32 + Offset int64 + Length int64 + Bytesalloc int64 +} + +type Radvisory_t struct { + Offset int64 + Count int32 +} + +type Fbootstraptransfer_t struct { + Offset int64 + Length uint32 + Buffer *byte +} + +type Log2phys_t struct { + Flags uint32 + Contigbytes int64 + Devoffset int64 +} + +type Fsid struct { + Val [2]int32 +} + +type Dirent struct { + Ino uint64 + Seekoff uint64 + Reclen uint16 + Namlen uint16 + Type uint8 + Name [1024]int8 + _ [3]byte +} + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [12]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen int32 + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex uint32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x14 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint32 + Filter int16 + Flags uint16 + Fflags uint32 + Data int32 + Udata *byte +} + +type FdSet struct { + Bits [32]int32 +} + +const ( + SizeofIfMsghdr = 0x70 + SizeofIfData = 0x60 + SizeofIfaMsghdr = 0x14 + SizeofIfmaMsghdr = 0x10 + SizeofIfmaMsghdr2 = 0x14 + SizeofRtMsghdr = 0x5c + SizeofRtMetrics = 0x38 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Data IfData +} + +type IfData struct { + Type uint8 + Typelen uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Recvquota uint8 + Xmitquota uint8 + Unused1 uint8 + Mtu uint32 + Metric uint32 + Baudrate uint32 + Ipackets uint32 + Ierrors uint32 + Opackets uint32 + Oerrors uint32 + Collisions uint32 + Ibytes uint32 + Obytes uint32 + Imcasts uint32 + Omcasts uint32 + Iqdrops uint32 + Noproto uint32 + Recvtiming uint32 + Xmittiming uint32 + Lastchange Timeval + Unused2 uint32 + Hwassist uint32 + Reserved1 uint32 + Reserved2 uint32 +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Metric int32 +} + +type IfmaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte +} + +type IfmaMsghdr2 struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Refcount int32 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + _ [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Use int32 + Inits uint32 + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint32 + Mtu uint32 + Hopcount uint32 + Expire int32 + Recvpipe uint32 + Sendpipe uint32 + Ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Pksent uint32 + Filler [4]uint32 +} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x8 + SizeofBpfProgram = 0x8 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x14 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint32 + Drop uint32 +} + +type BpfProgram struct { + Len uint32 + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp Timeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + _ [2]byte +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x2 + AT_REMOVEDIR = 0x80 + AT_SYMLINK_FOLLOW = 0x40 + AT_SYMLINK_NOFOLLOW = 0x20 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) + +type Utsname struct { + Sysname [256]byte + Nodename [256]byte + Release [256]byte + Version [256]byte + Machine [256]byte +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go new file mode 100644 index 00000000..9fec185c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go @@ -0,0 +1,499 @@ +// cgo -godefs types_darwin.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm64,darwin + +package unix + +const ( + SizeofPtr = 0x8 + SizeofShort = 0x2 + SizeofInt = 0x4 + SizeofLong = 0x8 + SizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int32 + _ [4]byte +} + +type Timeval32 struct { + Sec int32 + Usec int32 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev int32 + Mode uint16 + Nlink uint16 + Ino uint64 + Uid uint32 + Gid uint32 + Rdev int32 + _ [4]byte + Atimespec Timespec + Mtimespec Timespec + Ctimespec Timespec + Birthtimespec Timespec + Size int64 + Blocks int64 + Blksize int32 + Flags uint32 + Gen uint32 + Lspare int32 + Qspare [2]int64 +} + +type Statfs_t struct { + Bsize uint32 + Iosize int32 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Owner uint32 + Type uint32 + Flags uint32 + Fssubtype uint32 + Fstypename [16]int8 + Mntonname [1024]int8 + Mntfromname [1024]int8 + Reserved [8]uint32 +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Fstore_t struct { + Flags uint32 + Posmode int32 + Offset int64 + Length int64 + Bytesalloc int64 +} + +type Radvisory_t struct { + Offset int64 + Count int32 + _ [4]byte +} + +type Fbootstraptransfer_t struct { + Offset int64 + Length uint64 + Buffer *byte +} + +type Log2phys_t struct { + Flags uint32 + _ [8]byte + _ [8]byte +} + +type Fsid struct { + Val [2]int32 +} + +type Dirent struct { + Ino uint64 + Seekoff uint64 + Reclen uint16 + Namlen uint16 + Type uint8 + Name [1024]int8 + _ [3]byte +} + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [12]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + _ [4]byte + Iov *Iovec + Iovlen int32 + _ [4]byte + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex uint32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x14 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x30 + SizeofCmsghdr = 0xc + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint64 + Filter int16 + Flags uint16 + Fflags uint32 + Data int64 + Udata *byte +} + +type FdSet struct { + Bits [32]int32 +} + +const ( + SizeofIfMsghdr = 0x70 + SizeofIfData = 0x60 + SizeofIfaMsghdr = 0x14 + SizeofIfmaMsghdr = 0x10 + SizeofIfmaMsghdr2 = 0x14 + SizeofRtMsghdr = 0x5c + SizeofRtMetrics = 0x38 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Data IfData +} + +type IfData struct { + Type uint8 + Typelen uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Recvquota uint8 + Xmitquota uint8 + Unused1 uint8 + Mtu uint32 + Metric uint32 + Baudrate uint32 + Ipackets uint32 + Ierrors uint32 + Opackets uint32 + Oerrors uint32 + Collisions uint32 + Ibytes uint32 + Obytes uint32 + Imcasts uint32 + Omcasts uint32 + Iqdrops uint32 + Noproto uint32 + Recvtiming uint32 + Xmittiming uint32 + Lastchange Timeval32 + Unused2 uint32 + Hwassist uint32 + Reserved1 uint32 + Reserved2 uint32 +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Metric int32 +} + +type IfmaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte +} + +type IfmaMsghdr2 struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Refcount int32 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + _ [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Use int32 + Inits uint32 + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint32 + Mtu uint32 + Hopcount uint32 + Expire int32 + Recvpipe uint32 + Sendpipe uint32 + Ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Pksent uint32 + Filler [4]uint32 +} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x8 + SizeofBpfProgram = 0x10 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x14 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint32 + Drop uint32 +} + +type BpfProgram struct { + Len uint32 + _ [4]byte + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp Timeval32 + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + _ [2]byte +} + +type Termios struct { + Iflag uint64 + Oflag uint64 + Cflag uint64 + Lflag uint64 + Cc [20]uint8 + _ [4]byte + Ispeed uint64 + Ospeed uint64 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x2 + AT_REMOVEDIR = 0x80 + AT_SYMLINK_FOLLOW = 0x40 + AT_SYMLINK_NOFOLLOW = 0x20 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) + +type Utsname struct { + Sysname [256]byte + Nodename [256]byte + Release [256]byte + Version [256]byte + Machine [256]byte +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go new file mode 100644 index 00000000..7b34e2e2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go @@ -0,0 +1,469 @@ +// cgo -godefs types_dragonfly.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,dragonfly + +package unix + +const ( + SizeofPtr = 0x8 + SizeofShort = 0x2 + SizeofInt = 0x4 + SizeofLong = 0x8 + SizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur int64 + Max int64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Ino uint64 + Nlink uint32 + Dev uint32 + Mode uint16 + Padding1 uint16 + Uid uint32 + Gid uint32 + Rdev uint32 + Atim Timespec + Mtim Timespec + Ctim Timespec + Size int64 + Blocks int64 + Blksize uint32 + Flags uint32 + Gen uint32 + Lspare int32 + Qspare1 int64 + Qspare2 int64 +} + +type Statfs_t struct { + Spare2 int64 + Bsize int64 + Iosize int64 + Blocks int64 + Bfree int64 + Bavail int64 + Files int64 + Ffree int64 + Fsid Fsid + Owner uint32 + Type int32 + Flags int32 + _ [4]byte + Syncwrites int64 + Asyncwrites int64 + Fstypename [16]int8 + Mntonname [80]int8 + Syncreads int64 + Asyncreads int64 + Spares1 int16 + Mntfromname [80]int8 + Spares2 int16 + _ [4]byte + Spare [2]int64 +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Dirent struct { + Fileno uint64 + Namlen uint16 + Type uint8 + Unused1 uint8 + Unused2 uint32 + Name [256]int8 +} + +type Fsid struct { + Val [2]int32 +} + +const ( + PathMax = 0x400 +) + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [12]int8 + Rcf uint16 + Route [16]uint16 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + _ [4]byte + Iov *Iovec + Iovlen int32 + _ [4]byte + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x36 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x30 + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint64 + Filter int16 + Flags uint16 + Fflags uint32 + Data int64 + Udata *byte +} + +type FdSet struct { + Bits [16]uint64 +} + +const ( + SizeofIfMsghdr = 0xb0 + SizeofIfData = 0xa0 + SizeofIfaMsghdr = 0x14 + SizeofIfmaMsghdr = 0x10 + SizeofIfAnnounceMsghdr = 0x18 + SizeofRtMsghdr = 0x98 + SizeofRtMetrics = 0x70 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Data IfData +} + +type IfData struct { + Type uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Recvquota uint8 + Xmitquota uint8 + _ [2]byte + Mtu uint64 + Metric uint64 + Link_state uint64 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Noproto uint64 + Hwassist uint64 + Oqdrops uint64 + Lastchange Timeval +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Metric int32 +} + +type IfmaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte +} + +type IfAnnounceMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Name [16]int8 + What uint16 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + _ [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Use int32 + Inits uint64 + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint64 + Mtu uint64 + Pksent uint64 + Expire uint64 + Sendpipe uint64 + Ssthresh uint64 + Rtt uint64 + Rttvar uint64 + Recvpipe uint64 + Hopcount uint64 + Mssopt uint16 + Pad uint16 + _ [4]byte + Msl uint64 + Iwmaxsegs uint64 + Iwcapsegs uint64 +} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x8 + SizeofBpfProgram = 0x10 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x20 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint32 + Drop uint32 +} + +type BpfProgram struct { + Len uint32 + _ [4]byte + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp Timeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + _ [6]byte +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = 0xfffafdcd + AT_SYMLINK_NOFOLLOW = 0x1 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) + +type Utsname struct { + Sysname [32]byte + Nodename [32]byte + Release [32]byte + Version [32]byte + Machine [32]byte +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go new file mode 100644 index 00000000..28ef5242 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go @@ -0,0 +1,603 @@ +// cgo -godefs types_freebsd.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build 386,freebsd + +package unix + +const ( + SizeofPtr = 0x4 + SizeofShort = 0x2 + SizeofInt = 0x4 + SizeofLong = 0x4 + SizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int32 + Nsec int32 +} + +type Timeval struct { + Sec int32 + Usec int32 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur int64 + Max int64 +} + +type _Gid_t uint32 + +const ( + _statfsVersion = 0x20140518 + _dirblksiz = 0x400 +) + +type Stat_t struct { + Dev uint64 + Ino uint64 + Nlink uint64 + Mode uint16 + _0 int16 + Uid uint32 + Gid uint32 + _1 int32 + Rdev uint64 + Atim_ext int32 + Atim Timespec + Mtim_ext int32 + Mtim Timespec + Ctim_ext int32 + Ctim Timespec + Btim_ext int32 + Birthtim Timespec + Size int64 + Blocks int64 + Blksize int32 + Flags uint32 + Gen uint64 + Spare [10]uint64 +} + +type stat_freebsd11_t struct { + Dev uint32 + Ino uint32 + Mode uint16 + Nlink uint16 + Uid uint32 + Gid uint32 + Rdev uint32 + Atim Timespec + Mtim Timespec + Ctim Timespec + Size int64 + Blocks int64 + Blksize int32 + Flags uint32 + Gen uint32 + Lspare int32 + Birthtim Timespec + _ [8]byte +} + +type Statfs_t struct { + Version uint32 + Type uint32 + Flags uint64 + Bsize uint64 + Iosize uint64 + Blocks uint64 + Bfree uint64 + Bavail int64 + Files uint64 + Ffree int64 + Syncwrites uint64 + Asyncwrites uint64 + Syncreads uint64 + Asyncreads uint64 + Spare [10]uint64 + Namemax uint32 + Owner uint32 + Fsid Fsid + Charspare [80]int8 + Fstypename [16]int8 + Mntfromname [1024]int8 + Mntonname [1024]int8 +} + +type statfs_freebsd11_t struct { + Version uint32 + Type uint32 + Flags uint64 + Bsize uint64 + Iosize uint64 + Blocks uint64 + Bfree uint64 + Bavail int64 + Files uint64 + Ffree int64 + Syncwrites uint64 + Asyncwrites uint64 + Syncreads uint64 + Asyncreads uint64 + Spare [10]uint64 + Namemax uint32 + Owner uint32 + Fsid Fsid + Charspare [80]int8 + Fstypename [16]int8 + Mntfromname [88]int8 + Mntonname [88]int8 +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 + Sysid int32 +} + +type Dirent struct { + Fileno uint64 + Off int64 + Reclen uint16 + Type uint8 + Pad0 uint8 + Namlen uint16 + Pad1 uint16 + Name [256]int8 +} + +type dirent_freebsd11 struct { + Fileno uint32 + Reclen uint16 + Type uint8 + Namlen uint8 + Name [256]int8 +} + +type Fsid struct { + Val [2]int32 +} + +const ( + PathMax = 0x400 +) + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [46]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen int32 + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x36 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint32 + Filter int16 + Flags uint16 + Fflags uint32 + Data int32 + Udata *byte +} + +type FdSet struct { + _ [32]uint32 +} + +const ( + sizeofIfMsghdr = 0xa8 + SizeofIfMsghdr = 0x60 + sizeofIfData = 0x98 + SizeofIfData = 0x50 + SizeofIfaMsghdr = 0x14 + SizeofIfmaMsghdr = 0x10 + SizeofIfAnnounceMsghdr = 0x18 + SizeofRtMsghdr = 0x5c + SizeofRtMetrics = 0x38 +) + +type ifMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Data ifData +} + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Data IfData +} + +type ifData struct { + Type uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Link_state uint8 + Vhid uint8 + Datalen uint16 + Mtu uint32 + Metric uint32 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Oqdrops uint64 + Noproto uint64 + Hwassist uint64 + _ [8]byte + _ [16]byte +} + +type IfData struct { + Type uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Link_state uint8 + Spare_char1 uint8 + Spare_char2 uint8 + Datalen uint8 + Mtu uint32 + Metric uint32 + Baudrate uint32 + Ipackets uint32 + Ierrors uint32 + Opackets uint32 + Oerrors uint32 + Collisions uint32 + Ibytes uint32 + Obytes uint32 + Imcasts uint32 + Omcasts uint32 + Iqdrops uint32 + Noproto uint32 + Hwassist uint32 + Epoch int32 + Lastchange Timeval +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Metric int32 +} + +type IfmaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte +} + +type IfAnnounceMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Name [16]int8 + What uint16 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + _ [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Fmask int32 + Inits uint32 + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint32 + Mtu uint32 + Hopcount uint32 + Expire uint32 + Recvpipe uint32 + Sendpipe uint32 + Ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Pksent uint32 + Weight uint32 + Filler [3]uint32 +} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x8 + SizeofBpfZbuf = 0xc + SizeofBpfProgram = 0x8 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x14 + SizeofBpfZbufHeader = 0x20 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint32 + Drop uint32 +} + +type BpfZbuf struct { + Bufa *byte + Bufb *byte + Buflen uint32 +} + +type BpfProgram struct { + Len uint32 + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp Timeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + _ [2]byte +} + +type BpfZbufHeader struct { + Kernel_gen uint32 + Kernel_len uint32 + User_gen uint32 + _ [5]uint32 +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x64 + AT_REMOVEDIR = 0x800 + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x200 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLINIGNEOF = 0x2000 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) + +type CapRights struct { + Rights [2]uint64 +} + +type Utsname struct { + Sysname [256]byte + Nodename [256]byte + Release [256]byte + Version [256]byte + Machine [256]byte +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go new file mode 100644 index 00000000..e2d984a4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go @@ -0,0 +1,602 @@ +// cgo -godefs types_freebsd.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,freebsd + +package unix + +const ( + SizeofPtr = 0x8 + SizeofShort = 0x2 + SizeofInt = 0x4 + SizeofLong = 0x8 + SizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur int64 + Max int64 +} + +type _Gid_t uint32 + +const ( + _statfsVersion = 0x20140518 + _dirblksiz = 0x400 +) + +type Stat_t struct { + Dev uint64 + Ino uint64 + Nlink uint64 + Mode uint16 + _0 int16 + Uid uint32 + Gid uint32 + _1 int32 + Rdev uint64 + Atim Timespec + Mtim Timespec + Ctim Timespec + Birthtim Timespec + Size int64 + Blocks int64 + Blksize int32 + Flags uint32 + Gen uint64 + Spare [10]uint64 +} + +type stat_freebsd11_t struct { + Dev uint32 + Ino uint32 + Mode uint16 + Nlink uint16 + Uid uint32 + Gid uint32 + Rdev uint32 + Atim Timespec + Mtim Timespec + Ctim Timespec + Size int64 + Blocks int64 + Blksize int32 + Flags uint32 + Gen uint32 + Lspare int32 + Birthtim Timespec +} + +type Statfs_t struct { + Version uint32 + Type uint32 + Flags uint64 + Bsize uint64 + Iosize uint64 + Blocks uint64 + Bfree uint64 + Bavail int64 + Files uint64 + Ffree int64 + Syncwrites uint64 + Asyncwrites uint64 + Syncreads uint64 + Asyncreads uint64 + Spare [10]uint64 + Namemax uint32 + Owner uint32 + Fsid Fsid + Charspare [80]int8 + Fstypename [16]int8 + Mntfromname [1024]int8 + Mntonname [1024]int8 +} + +type statfs_freebsd11_t struct { + Version uint32 + Type uint32 + Flags uint64 + Bsize uint64 + Iosize uint64 + Blocks uint64 + Bfree uint64 + Bavail int64 + Files uint64 + Ffree int64 + Syncwrites uint64 + Asyncwrites uint64 + Syncreads uint64 + Asyncreads uint64 + Spare [10]uint64 + Namemax uint32 + Owner uint32 + Fsid Fsid + Charspare [80]int8 + Fstypename [16]int8 + Mntfromname [88]int8 + Mntonname [88]int8 +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 + Sysid int32 + _ [4]byte +} + +type Dirent struct { + Fileno uint64 + Off int64 + Reclen uint16 + Type uint8 + Pad0 uint8 + Namlen uint16 + Pad1 uint16 + Name [256]int8 +} + +type dirent_freebsd11 struct { + Fileno uint32 + Reclen uint16 + Type uint8 + Namlen uint8 + Name [256]int8 +} + +type Fsid struct { + Val [2]int32 +} + +const ( + PathMax = 0x400 +) + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [46]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + _ [4]byte + Iov *Iovec + Iovlen int32 + _ [4]byte + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x36 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x30 + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint64 + Filter int16 + Flags uint16 + Fflags uint32 + Data int64 + Udata *byte +} + +type FdSet struct { + _ [16]uint64 +} + +const ( + sizeofIfMsghdr = 0xa8 + SizeofIfMsghdr = 0xa8 + sizeofIfData = 0x98 + SizeofIfData = 0x98 + SizeofIfaMsghdr = 0x14 + SizeofIfmaMsghdr = 0x10 + SizeofIfAnnounceMsghdr = 0x18 + SizeofRtMsghdr = 0x98 + SizeofRtMetrics = 0x70 +) + +type ifMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Data ifData +} + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Data IfData +} + +type ifData struct { + Type uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Link_state uint8 + Vhid uint8 + Datalen uint16 + Mtu uint32 + Metric uint32 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Oqdrops uint64 + Noproto uint64 + Hwassist uint64 + _ [8]byte + _ [16]byte +} + +type IfData struct { + Type uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Link_state uint8 + Spare_char1 uint8 + Spare_char2 uint8 + Datalen uint8 + Mtu uint64 + Metric uint64 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Noproto uint64 + Hwassist uint64 + Epoch int64 + Lastchange Timeval +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Metric int32 +} + +type IfmaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte +} + +type IfAnnounceMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Name [16]int8 + What uint16 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + _ [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Fmask int32 + Inits uint64 + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint64 + Mtu uint64 + Hopcount uint64 + Expire uint64 + Recvpipe uint64 + Sendpipe uint64 + Ssthresh uint64 + Rtt uint64 + Rttvar uint64 + Pksent uint64 + Weight uint64 + Filler [3]uint64 +} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x8 + SizeofBpfZbuf = 0x18 + SizeofBpfProgram = 0x10 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x20 + SizeofBpfZbufHeader = 0x20 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint32 + Drop uint32 +} + +type BpfZbuf struct { + Bufa *byte + Bufb *byte + Buflen uint64 +} + +type BpfProgram struct { + Len uint32 + _ [4]byte + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp Timeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + _ [6]byte +} + +type BpfZbufHeader struct { + Kernel_gen uint32 + Kernel_len uint32 + User_gen uint32 + _ [5]uint32 +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x64 + AT_REMOVEDIR = 0x800 + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x200 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLINIGNEOF = 0x2000 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) + +type CapRights struct { + Rights [2]uint64 +} + +type Utsname struct { + Sysname [256]byte + Nodename [256]byte + Release [256]byte + Version [256]byte + Machine [256]byte +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go new file mode 100644 index 00000000..9b415aba --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go @@ -0,0 +1,602 @@ +// cgo -godefs -- -fsigned-char types_freebsd.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm,freebsd + +package unix + +const ( + SizeofPtr = 0x4 + SizeofShort = 0x2 + SizeofInt = 0x4 + SizeofLong = 0x4 + SizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int32 + _ [4]byte +} + +type Timeval struct { + Sec int64 + Usec int32 + _ [4]byte +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur int64 + Max int64 +} + +type _Gid_t uint32 + +const ( + _statfsVersion = 0x20140518 + _dirblksiz = 0x400 +) + +type Stat_t struct { + Dev uint64 + Ino uint64 + Nlink uint64 + Mode uint16 + _0 int16 + Uid uint32 + Gid uint32 + _1 int32 + Rdev uint64 + Atim Timespec + Mtim Timespec + Ctim Timespec + Birthtim Timespec + Size int64 + Blocks int64 + Blksize int32 + Flags uint32 + Gen uint64 + Spare [10]uint64 +} + +type stat_freebsd11_t struct { + Dev uint32 + Ino uint32 + Mode uint16 + Nlink uint16 + Uid uint32 + Gid uint32 + Rdev uint32 + Atim Timespec + Mtim Timespec + Ctim Timespec + Size int64 + Blocks int64 + Blksize int32 + Flags uint32 + Gen uint32 + Lspare int32 + Birthtim Timespec +} + +type Statfs_t struct { + Version uint32 + Type uint32 + Flags uint64 + Bsize uint64 + Iosize uint64 + Blocks uint64 + Bfree uint64 + Bavail int64 + Files uint64 + Ffree int64 + Syncwrites uint64 + Asyncwrites uint64 + Syncreads uint64 + Asyncreads uint64 + Spare [10]uint64 + Namemax uint32 + Owner uint32 + Fsid Fsid + Charspare [80]int8 + Fstypename [16]int8 + Mntfromname [1024]int8 + Mntonname [1024]int8 +} + +type statfs_freebsd11_t struct { + Version uint32 + Type uint32 + Flags uint64 + Bsize uint64 + Iosize uint64 + Blocks uint64 + Bfree uint64 + Bavail int64 + Files uint64 + Ffree int64 + Syncwrites uint64 + Asyncwrites uint64 + Syncreads uint64 + Asyncreads uint64 + Spare [10]uint64 + Namemax uint32 + Owner uint32 + Fsid Fsid + Charspare [80]int8 + Fstypename [16]int8 + Mntfromname [88]int8 + Mntonname [88]int8 +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 + Sysid int32 + _ [4]byte +} + +type Dirent struct { + Fileno uint64 + Off int64 + Reclen uint16 + Type uint8 + Pad0 uint8 + Namlen uint16 + Pad1 uint16 + Name [256]int8 +} + +type dirent_freebsd11 struct { + Fileno uint32 + Reclen uint16 + Type uint8 + Namlen uint8 + Name [256]int8 +} + +type Fsid struct { + Val [2]int32 +} + +const ( + PathMax = 0x400 +) + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [46]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen int32 + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x36 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint32 + Filter int16 + Flags uint16 + Fflags uint32 + Data int32 + Udata *byte +} + +type FdSet struct { + _ [32]uint32 +} + +const ( + sizeofIfMsghdr = 0xa8 + SizeofIfMsghdr = 0x70 + sizeofIfData = 0x98 + SizeofIfData = 0x60 + SizeofIfaMsghdr = 0x14 + SizeofIfmaMsghdr = 0x10 + SizeofIfAnnounceMsghdr = 0x18 + SizeofRtMsghdr = 0x5c + SizeofRtMetrics = 0x38 +) + +type ifMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Data ifData +} + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Data IfData +} + +type ifData struct { + Type uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Link_state uint8 + Vhid uint8 + Datalen uint16 + Mtu uint32 + Metric uint32 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Oqdrops uint64 + Noproto uint64 + Hwassist uint64 + _ [8]byte + _ [16]byte +} + +type IfData struct { + Type uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Link_state uint8 + Spare_char1 uint8 + Spare_char2 uint8 + Datalen uint8 + Mtu uint32 + Metric uint32 + Baudrate uint32 + Ipackets uint32 + Ierrors uint32 + Opackets uint32 + Oerrors uint32 + Collisions uint32 + Ibytes uint32 + Obytes uint32 + Imcasts uint32 + Omcasts uint32 + Iqdrops uint32 + Noproto uint32 + Hwassist uint32 + _ [4]byte + Epoch int64 + Lastchange Timeval +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Metric int32 +} + +type IfmaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte +} + +type IfAnnounceMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Name [16]int8 + What uint16 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + _ [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Fmask int32 + Inits uint32 + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint32 + Mtu uint32 + Hopcount uint32 + Expire uint32 + Recvpipe uint32 + Sendpipe uint32 + Ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Pksent uint32 + Weight uint32 + Filler [3]uint32 +} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x8 + SizeofBpfZbuf = 0xc + SizeofBpfProgram = 0x8 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x20 + SizeofBpfZbufHeader = 0x20 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint32 + Drop uint32 +} + +type BpfZbuf struct { + Bufa *byte + Bufb *byte + Buflen uint32 +} + +type BpfProgram struct { + Len uint32 + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp Timeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + _ [6]byte +} + +type BpfZbufHeader struct { + Kernel_gen uint32 + Kernel_len uint32 + User_gen uint32 + _ [5]uint32 +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x64 + AT_REMOVEDIR = 0x800 + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x200 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLINIGNEOF = 0x2000 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) + +type CapRights struct { + Rights [2]uint64 +} + +type Utsname struct { + Sysname [256]byte + Nodename [256]byte + Release [256]byte + Version [256]byte + Machine [256]byte +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_386.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_386.go new file mode 100644 index 00000000..5f8f0349 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_386.go @@ -0,0 +1,1988 @@ +// cgo -godefs -- -Wall -Werror -static -I/tmp/include -m32 linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build 386,linux + +package unix + +const ( + SizeofPtr = 0x4 + SizeofShort = 0x2 + SizeofInt = 0x4 + SizeofLong = 0x4 + SizeofLongLong = 0x8 + PathMax = 0x1000 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int32 + Nsec int32 +} + +type Timeval struct { + Sec int32 + Usec int32 +} + +type Timex struct { + Modes uint32 + Offset int32 + Freq int32 + Maxerror int32 + Esterror int32 + Status int32 + Constant int32 + Precision int32 + Tolerance int32 + Time Timeval + Tick int32 + Ppsfreq int32 + Jitter int32 + Shift int32 + Stabil int32 + Jitcnt int32 + Calcnt int32 + Errcnt int32 + Stbcnt int32 + Tai int32 + _ [44]byte +} + +type Time_t int32 + +type Tms struct { + Utime int32 + Stime int32 + Cutime int32 + Cstime int32 +} + +type Utimbuf struct { + Actime int32 + Modtime int32 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint64 + _ uint16 + _ [2]byte + _ uint32 + Mode uint32 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev uint64 + _ uint16 + _ [2]byte + Size int64 + Blksize int32 + Blocks int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + Ino uint64 +} + +type StatxTimestamp struct { + Sec int64 + Nsec uint32 + _ int32 +} + +type Statx_t struct { + Mask uint32 + Blksize uint32 + Attributes uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Mode uint16 + _ [1]uint16 + Ino uint64 + Size uint64 + Blocks uint64 + Attributes_mask uint64 + Atime StatxTimestamp + Btime StatxTimestamp + Ctime StatxTimestamp + Mtime StatxTimestamp + Rdev_major uint32 + Rdev_minor uint32 + Dev_major uint32 + Dev_minor uint32 + _ [14]uint64 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]int8 + _ [1]byte +} + +type Fsid struct { + Val [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + Start int64 + Len int64 + Pid int32 +} + +type FscryptPolicy struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptKey struct { + Mode uint32 + Raw [64]uint8 + Size uint32 +} + +type KeyctlDHParams struct { + Private int32 + Prime int32 + Base int32 +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddrL2 struct { + Family uint16 + Psm uint16 + Bdaddr [6]uint8 + Cid uint16 + Bdaddr_type uint8 + _ [1]byte +} + +type RawSockaddrRFCOMM struct { + Family uint16 + Bdaddr [6]uint8 + Channel uint8 + _ [1]byte +} + +type RawSockaddrCAN struct { + Family uint16 + _ [2]byte + Ifindex int32 + Addr [8]byte +} + +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + +type RawSockaddrXDP struct { + Family uint16 + Flags uint16 + Ifindex uint32 + Queue_id uint32 + Shared_umem_fd uint32 +} + +type RawSockaddr struct { + Family uint16 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type PacketMreq struct { + Ifindex int32 + Type uint16 + Alen uint16 + Address [8]uint8 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen uint32 + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + _ [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofSockaddrL2 = 0xe + SizeofSockaddrRFCOMM = 0xa + SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 + SizeofSockaddrXDP = 0x10 + SizeofLinger = 0x8 + SizeofIovec = 0x8 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofPacketMreq = 0x10 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_INFO_KIND = 0x1 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_NUM_VF = 0x15 + IFLA_VFINFO_LIST = 0x16 + IFLA_STATS64 = 0x17 + IFLA_VF_PORTS = 0x18 + IFLA_PORT_SELF = 0x19 + IFLA_AF_SPEC = 0x1a + IFLA_GROUP = 0x1b + IFLA_NET_NS_FD = 0x1c + IFLA_EXT_MASK = 0x1d + IFLA_PROMISCUITY = 0x1e + IFLA_NUM_TX_QUEUES = 0x1f + IFLA_NUM_RX_QUEUES = 0x20 + IFLA_CARRIER = 0x21 + IFLA_PHYS_PORT_ID = 0x22 + IFLA_CARRIER_CHANGES = 0x23 + IFLA_PHYS_SWITCH_ID = 0x24 + IFLA_LINK_NETNSID = 0x25 + IFLA_PHYS_PORT_NAME = 0x26 + IFLA_PROTO_DOWN = 0x27 + IFLA_GSO_MAX_SEGS = 0x28 + IFLA_GSO_MAX_SIZE = 0x29 + IFLA_PAD = 0x2a + IFLA_XDP = 0x2b + IFLA_EVENT = 0x2c + IFLA_NEW_NETNSID = 0x2d + IFLA_IF_NETNSID = 0x2e + IFLA_MAX = 0x33 + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTA_MARK = 0x10 + RTA_MFC_STATS = 0x11 + RTA_VIA = 0x12 + RTA_NEWDST = 0x13 + RTA_PREF = 0x14 + RTA_ENCAP_TYPE = 0x15 + RTA_ENCAP = 0x16 + RTA_EXPIRES = 0x17 + RTA_PAD = 0x18 + RTA_UID = 0x19 + RTA_TTL_PROPAGATE = 0x1a + RTA_IP_PROTO = 0x1b + RTA_SPORT = 0x1c + RTA_DPORT = 0x1d + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + _ uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x8 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + _ [2]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + Ebx int32 + Ecx int32 + Edx int32 + Esi int32 + Edi int32 + Ebp int32 + Eax int32 + Xds int32 + Xes int32 + Xfs int32 + Xgs int32 + Orig_eax int32 + Eip int32 + Xcs int32 + Eflags int32 + Esp int32 + Xss int32 +} + +type FdSet struct { + Bits [32]int32 +} + +type Sysinfo_t struct { + Uptime int32 + Loads [3]uint32 + Totalram uint32 + Freeram uint32 + Sharedram uint32 + Bufferram uint32 + Totalswap uint32 + Freeswap uint32 + Procs uint16 + Pad uint16 + Totalhigh uint32 + Freehigh uint32 + Unit uint32 + _ [8]int8 +} + +type Utsname struct { + Sysname [65]byte + Nodename [65]byte + Release [65]byte + Version [65]byte + Machine [65]byte + Domainname [65]byte +} + +type Ustat_t struct { + Tfree int32 + Tinode uint32 + Fname [6]int8 + Fpack [6]int8 +} + +type EpollEvent struct { + Events uint32 + Fd int32 + Pad int32 +} + +const ( + AT_EMPTY_PATH = 0x1000 + AT_FDCWD = -0x64 + AT_NO_AUTOMOUNT = 0x800 + AT_REMOVEDIR = 0x200 + + AT_STATX_SYNC_AS_STAT = 0x0 + AT_STATX_FORCE_SYNC = 0x2000 + AT_STATX_DONT_SYNC = 0x4000 + + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 + + AT_EACCESS = 0x200 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x2000 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Sigset_t struct { + Val [32]uint32 +} + +const RNDGETENTCNT = 0x80045200 + +const PERF_IOC_FLAG_GROUP = 0x1 + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Line uint8 + Cc [19]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Taskstats struct { + Version uint16 + _ [2]byte + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + _ [6]byte + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]int8 + Ac_sched uint8 + Ac_pad [3]uint8 + _ [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + _ [4]byte + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 +} + +const ( + TASKSTATS_CMD_UNSPEC = 0x0 + TASKSTATS_CMD_GET = 0x1 + TASKSTATS_CMD_NEW = 0x2 + TASKSTATS_TYPE_UNSPEC = 0x0 + TASKSTATS_TYPE_PID = 0x1 + TASKSTATS_TYPE_TGID = 0x2 + TASKSTATS_TYPE_STATS = 0x3 + TASKSTATS_TYPE_AGGR_PID = 0x4 + TASKSTATS_TYPE_AGGR_TGID = 0x5 + TASKSTATS_TYPE_NULL = 0x6 + TASKSTATS_CMD_ATTR_UNSPEC = 0x0 + TASKSTATS_CMD_ATTR_PID = 0x1 + TASKSTATS_CMD_ATTR_TGID = 0x2 + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 +) + +type CGroupStats struct { + Sleeping uint64 + Running uint64 + Stopped uint64 + Uninterruptible uint64 + Io_wait uint64 +} + +const ( + CGROUPSTATS_CMD_UNSPEC = 0x3 + CGROUPSTATS_CMD_GET = 0x4 + CGROUPSTATS_CMD_NEW = 0x5 + CGROUPSTATS_TYPE_UNSPEC = 0x0 + CGROUPSTATS_TYPE_CGROUP_STATS = 0x1 + CGROUPSTATS_CMD_ATTR_UNSPEC = 0x0 + CGROUPSTATS_CMD_ATTR_FD = 0x1 +) + +type Genlmsghdr struct { + Cmd uint8 + Version uint8 + Reserved uint16 +} + +const ( + CTRL_CMD_UNSPEC = 0x0 + CTRL_CMD_NEWFAMILY = 0x1 + CTRL_CMD_DELFAMILY = 0x2 + CTRL_CMD_GETFAMILY = 0x3 + CTRL_CMD_NEWOPS = 0x4 + CTRL_CMD_DELOPS = 0x5 + CTRL_CMD_GETOPS = 0x6 + CTRL_CMD_NEWMCAST_GRP = 0x7 + CTRL_CMD_DELMCAST_GRP = 0x8 + CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_ATTR_UNSPEC = 0x0 + CTRL_ATTR_FAMILY_ID = 0x1 + CTRL_ATTR_FAMILY_NAME = 0x2 + CTRL_ATTR_VERSION = 0x3 + CTRL_ATTR_HDRSIZE = 0x4 + CTRL_ATTR_MAXATTR = 0x5 + CTRL_ATTR_OPS = 0x6 + CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_OP_UNSPEC = 0x0 + CTRL_ATTR_OP_ID = 0x1 + CTRL_ATTR_OP_FLAGS = 0x2 + CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 + CTRL_ATTR_MCAST_GRP_NAME = 0x1 + CTRL_ATTR_MCAST_GRP_ID = 0x2 +) + +type cpuMask uint32 + +const ( + _CPU_SETSIZE = 0x400 + _NCPUBITS = 0x20 +) + +const ( + BDADDR_BREDR = 0x0 + BDADDR_LE_PUBLIC = 0x1 + BDADDR_LE_RANDOM = 0x2 +) + +type PerfEventAttr struct { + Type uint32 + Size uint32 + Config uint64 + Sample uint64 + Sample_type uint64 + Read_format uint64 + Bits uint64 + Wakeup uint32 + Bp_type uint32 + Ext1 uint64 + Ext2 uint64 + Branch_sample_type uint64 + Sample_regs_user uint64 + Sample_stack_user uint32 + Clockid int32 + Sample_regs_intr uint64 + Aux_watermark uint32 + _ uint32 +} + +type PerfEventMmapPage struct { + Version uint32 + Compat_version uint32 + Lock uint32 + Index uint32 + Offset int64 + Time_enabled uint64 + Time_running uint64 + Capabilities uint64 + Pmc_width uint16 + Time_shift uint16 + Time_mult uint32 + Time_offset uint64 + Time_zero uint64 + Size uint32 + _ [948]uint8 + Data_head uint64 + Data_tail uint64 + Data_offset uint64 + Data_size uint64 + Aux_head uint64 + Aux_tail uint64 + Aux_offset uint64 + Aux_size uint64 +} + +const ( + PerfBitDisabled uint64 = CBitFieldMaskBit0 + PerfBitInherit = CBitFieldMaskBit1 + PerfBitPinned = CBitFieldMaskBit2 + PerfBitExclusive = CBitFieldMaskBit3 + PerfBitExcludeUser = CBitFieldMaskBit4 + PerfBitExcludeKernel = CBitFieldMaskBit5 + PerfBitExcludeHv = CBitFieldMaskBit6 + PerfBitExcludeIdle = CBitFieldMaskBit7 + PerfBitMmap = CBitFieldMaskBit8 + PerfBitComm = CBitFieldMaskBit9 + PerfBitFreq = CBitFieldMaskBit10 + PerfBitInheritStat = CBitFieldMaskBit11 + PerfBitEnableOnExec = CBitFieldMaskBit12 + PerfBitTask = CBitFieldMaskBit13 + PerfBitWatermark = CBitFieldMaskBit14 + PerfBitPreciseIPBit1 = CBitFieldMaskBit15 + PerfBitPreciseIPBit2 = CBitFieldMaskBit16 + PerfBitMmapData = CBitFieldMaskBit17 + PerfBitSampleIDAll = CBitFieldMaskBit18 + PerfBitExcludeHost = CBitFieldMaskBit19 + PerfBitExcludeGuest = CBitFieldMaskBit20 + PerfBitExcludeCallchainKernel = CBitFieldMaskBit21 + PerfBitExcludeCallchainUser = CBitFieldMaskBit22 + PerfBitMmap2 = CBitFieldMaskBit23 + PerfBitCommExec = CBitFieldMaskBit24 + PerfBitUseClockID = CBitFieldMaskBit25 + PerfBitContextSwitch = CBitFieldMaskBit26 +) + +const ( + PERF_TYPE_HARDWARE = 0x0 + PERF_TYPE_SOFTWARE = 0x1 + PERF_TYPE_TRACEPOINT = 0x2 + PERF_TYPE_HW_CACHE = 0x3 + PERF_TYPE_RAW = 0x4 + PERF_TYPE_BREAKPOINT = 0x5 + + PERF_COUNT_HW_CPU_CYCLES = 0x0 + PERF_COUNT_HW_INSTRUCTIONS = 0x1 + PERF_COUNT_HW_CACHE_REFERENCES = 0x2 + PERF_COUNT_HW_CACHE_MISSES = 0x3 + PERF_COUNT_HW_BRANCH_INSTRUCTIONS = 0x4 + PERF_COUNT_HW_BRANCH_MISSES = 0x5 + PERF_COUNT_HW_BUS_CYCLES = 0x6 + PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 0x7 + PERF_COUNT_HW_STALLED_CYCLES_BACKEND = 0x8 + PERF_COUNT_HW_REF_CPU_CYCLES = 0x9 + + PERF_COUNT_HW_CACHE_L1D = 0x0 + PERF_COUNT_HW_CACHE_L1I = 0x1 + PERF_COUNT_HW_CACHE_LL = 0x2 + PERF_COUNT_HW_CACHE_DTLB = 0x3 + PERF_COUNT_HW_CACHE_ITLB = 0x4 + PERF_COUNT_HW_CACHE_BPU = 0x5 + PERF_COUNT_HW_CACHE_NODE = 0x6 + + PERF_COUNT_HW_CACHE_OP_READ = 0x0 + PERF_COUNT_HW_CACHE_OP_WRITE = 0x1 + PERF_COUNT_HW_CACHE_OP_PREFETCH = 0x2 + + PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0x0 + PERF_COUNT_HW_CACHE_RESULT_MISS = 0x1 + + PERF_COUNT_SW_CPU_CLOCK = 0x0 + PERF_COUNT_SW_TASK_CLOCK = 0x1 + PERF_COUNT_SW_PAGE_FAULTS = 0x2 + PERF_COUNT_SW_CONTEXT_SWITCHES = 0x3 + PERF_COUNT_SW_CPU_MIGRATIONS = 0x4 + PERF_COUNT_SW_PAGE_FAULTS_MIN = 0x5 + PERF_COUNT_SW_PAGE_FAULTS_MAJ = 0x6 + PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7 + PERF_COUNT_SW_EMULATION_FAULTS = 0x8 + PERF_COUNT_SW_DUMMY = 0x9 + + PERF_SAMPLE_IP = 0x1 + PERF_SAMPLE_TID = 0x2 + PERF_SAMPLE_TIME = 0x4 + PERF_SAMPLE_ADDR = 0x8 + PERF_SAMPLE_READ = 0x10 + PERF_SAMPLE_CALLCHAIN = 0x20 + PERF_SAMPLE_ID = 0x40 + PERF_SAMPLE_CPU = 0x80 + PERF_SAMPLE_PERIOD = 0x100 + PERF_SAMPLE_STREAM_ID = 0x200 + PERF_SAMPLE_RAW = 0x400 + PERF_SAMPLE_BRANCH_STACK = 0x800 + + PERF_SAMPLE_BRANCH_USER = 0x1 + PERF_SAMPLE_BRANCH_KERNEL = 0x2 + PERF_SAMPLE_BRANCH_HV = 0x4 + PERF_SAMPLE_BRANCH_ANY = 0x8 + PERF_SAMPLE_BRANCH_ANY_CALL = 0x10 + PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20 + PERF_SAMPLE_BRANCH_IND_CALL = 0x40 + + PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1 + PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2 + PERF_FORMAT_ID = 0x4 + PERF_FORMAT_GROUP = 0x8 + + PERF_RECORD_MMAP = 0x1 + PERF_RECORD_LOST = 0x2 + PERF_RECORD_COMM = 0x3 + PERF_RECORD_EXIT = 0x4 + PERF_RECORD_THROTTLE = 0x5 + PERF_RECORD_UNTHROTTLE = 0x6 + PERF_RECORD_FORK = 0x7 + PERF_RECORD_READ = 0x8 + PERF_RECORD_SAMPLE = 0x9 + + PERF_CONTEXT_HV = -0x20 + PERF_CONTEXT_KERNEL = -0x80 + PERF_CONTEXT_USER = -0x200 + + PERF_CONTEXT_GUEST = -0x800 + PERF_CONTEXT_GUEST_KERNEL = -0x880 + PERF_CONTEXT_GUEST_USER = -0xa00 + + PERF_FLAG_FD_NO_GROUP = 0x1 + PERF_FLAG_FD_OUTPUT = 0x2 + PERF_FLAG_PID_CGROUP = 0x4 +) + +const ( + CBitFieldMaskBit0 = 0x1 + CBitFieldMaskBit1 = 0x2 + CBitFieldMaskBit2 = 0x4 + CBitFieldMaskBit3 = 0x8 + CBitFieldMaskBit4 = 0x10 + CBitFieldMaskBit5 = 0x20 + CBitFieldMaskBit6 = 0x40 + CBitFieldMaskBit7 = 0x80 + CBitFieldMaskBit8 = 0x100 + CBitFieldMaskBit9 = 0x200 + CBitFieldMaskBit10 = 0x400 + CBitFieldMaskBit11 = 0x800 + CBitFieldMaskBit12 = 0x1000 + CBitFieldMaskBit13 = 0x2000 + CBitFieldMaskBit14 = 0x4000 + CBitFieldMaskBit15 = 0x8000 + CBitFieldMaskBit16 = 0x10000 + CBitFieldMaskBit17 = 0x20000 + CBitFieldMaskBit18 = 0x40000 + CBitFieldMaskBit19 = 0x80000 + CBitFieldMaskBit20 = 0x100000 + CBitFieldMaskBit21 = 0x200000 + CBitFieldMaskBit22 = 0x400000 + CBitFieldMaskBit23 = 0x800000 + CBitFieldMaskBit24 = 0x1000000 + CBitFieldMaskBit25 = 0x2000000 + CBitFieldMaskBit26 = 0x4000000 + CBitFieldMaskBit27 = 0x8000000 + CBitFieldMaskBit28 = 0x10000000 + CBitFieldMaskBit29 = 0x20000000 + CBitFieldMaskBit30 = 0x40000000 + CBitFieldMaskBit31 = 0x80000000 + CBitFieldMaskBit32 = 0x100000000 + CBitFieldMaskBit33 = 0x200000000 + CBitFieldMaskBit34 = 0x400000000 + CBitFieldMaskBit35 = 0x800000000 + CBitFieldMaskBit36 = 0x1000000000 + CBitFieldMaskBit37 = 0x2000000000 + CBitFieldMaskBit38 = 0x4000000000 + CBitFieldMaskBit39 = 0x8000000000 + CBitFieldMaskBit40 = 0x10000000000 + CBitFieldMaskBit41 = 0x20000000000 + CBitFieldMaskBit42 = 0x40000000000 + CBitFieldMaskBit43 = 0x80000000000 + CBitFieldMaskBit44 = 0x100000000000 + CBitFieldMaskBit45 = 0x200000000000 + CBitFieldMaskBit46 = 0x400000000000 + CBitFieldMaskBit47 = 0x800000000000 + CBitFieldMaskBit48 = 0x1000000000000 + CBitFieldMaskBit49 = 0x2000000000000 + CBitFieldMaskBit50 = 0x4000000000000 + CBitFieldMaskBit51 = 0x8000000000000 + CBitFieldMaskBit52 = 0x10000000000000 + CBitFieldMaskBit53 = 0x20000000000000 + CBitFieldMaskBit54 = 0x40000000000000 + CBitFieldMaskBit55 = 0x80000000000000 + CBitFieldMaskBit56 = 0x100000000000000 + CBitFieldMaskBit57 = 0x200000000000000 + CBitFieldMaskBit58 = 0x400000000000000 + CBitFieldMaskBit59 = 0x800000000000000 + CBitFieldMaskBit60 = 0x1000000000000000 + CBitFieldMaskBit61 = 0x2000000000000000 + CBitFieldMaskBit62 = 0x4000000000000000 + CBitFieldMaskBit63 = 0x8000000000000000 +) + +type SockaddrStorage struct { + Family uint16 + _ [122]int8 + _ uint32 +} + +type TCPMD5Sig struct { + Addr SockaddrStorage + Flags uint8 + Prefixlen uint8 + Keylen uint16 + _ uint32 + Key [80]uint8 +} + +type HDDriveCmdHdr struct { + Command uint8 + Number uint8 + Feature uint8 + Count uint8 +} + +type HDGeometry struct { + Heads uint8 + Sectors uint8 + Cylinders uint16 + Start uint32 +} + +type HDDriveID struct { + Config uint16 + Cyls uint16 + Reserved2 uint16 + Heads uint16 + Track_bytes uint16 + Sector_bytes uint16 + Sectors uint16 + Vendor0 uint16 + Vendor1 uint16 + Vendor2 uint16 + Serial_no [20]uint8 + Buf_type uint16 + Buf_size uint16 + Ecc_bytes uint16 + Fw_rev [8]uint8 + Model [40]uint8 + Max_multsect uint8 + Vendor3 uint8 + Dword_io uint16 + Vendor4 uint8 + Capability uint8 + Reserved50 uint16 + Vendor5 uint8 + TPIO uint8 + Vendor6 uint8 + TDMA uint8 + Field_valid uint16 + Cur_cyls uint16 + Cur_heads uint16 + Cur_sectors uint16 + Cur_capacity0 uint16 + Cur_capacity1 uint16 + Multsect uint8 + Multsect_valid uint8 + Lba_capacity uint32 + Dma_1word uint16 + Dma_mword uint16 + Eide_pio_modes uint16 + Eide_dma_min uint16 + Eide_dma_time uint16 + Eide_pio uint16 + Eide_pio_iordy uint16 + Words69_70 [2]uint16 + Words71_74 [4]uint16 + Queue_depth uint16 + Words76_79 [4]uint16 + Major_rev_num uint16 + Minor_rev_num uint16 + Command_set_1 uint16 + Command_set_2 uint16 + Cfsse uint16 + Cfs_enable_1 uint16 + Cfs_enable_2 uint16 + Csf_default uint16 + Dma_ultra uint16 + Trseuc uint16 + TrsEuc uint16 + CurAPMvalues uint16 + Mprc uint16 + Hw_config uint16 + Acoustic uint16 + Msrqs uint16 + Sxfert uint16 + Sal uint16 + Spg uint32 + Lba_capacity_2 uint64 + Words104_125 [22]uint16 + Last_lun uint16 + Word127 uint16 + Dlf uint16 + Csfo uint16 + Words130_155 [26]uint16 + Word156 uint16 + Words157_159 [3]uint16 + Cfa_power uint16 + Words161_175 [15]uint16 + Words176_205 [30]uint16 + Words206_254 [49]uint16 + Integrity_word uint16 +} + +type Statfs_t struct { + Type int32 + Bsize int32 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Namelen int32 + Frsize int32 + Flags int32 + Spare [4]int32 +} + +const ( + ST_MANDLOCK = 0x40 + ST_NOATIME = 0x400 + ST_NODEV = 0x4 + ST_NODIRATIME = 0x800 + ST_NOEXEC = 0x8 + ST_NOSUID = 0x2 + ST_RDONLY = 0x1 + ST_RELATIME = 0x1000 + ST_SYNCHRONOUS = 0x10 +) + +type TpacketHdr struct { + Status uint32 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Sec uint32 + Usec uint32 +} + +type Tpacket2Hdr struct { + Status uint32 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Sec uint32 + Nsec uint32 + Vlan_tci uint16 + Vlan_tpid uint16 + _ [4]uint8 +} + +type Tpacket3Hdr struct { + Next_offset uint32 + Sec uint32 + Nsec uint32 + Snaplen uint32 + Len uint32 + Status uint32 + Mac uint16 + Net uint16 + Hv1 TpacketHdrVariant1 + _ [8]uint8 +} + +type TpacketHdrVariant1 struct { + Rxhash uint32 + Vlan_tci uint32 + Vlan_tpid uint16 + _ uint16 +} + +type TpacketBlockDesc struct { + Version uint32 + To_priv uint32 + Hdr [40]byte +} + +type TpacketReq struct { + Block_size uint32 + Block_nr uint32 + Frame_size uint32 + Frame_nr uint32 +} + +type TpacketReq3 struct { + Block_size uint32 + Block_nr uint32 + Frame_size uint32 + Frame_nr uint32 + Retire_blk_tov uint32 + Sizeof_priv uint32 + Feature_req_word uint32 +} + +type TpacketStats struct { + Packets uint32 + Drops uint32 +} + +type TpacketStatsV3 struct { + Packets uint32 + Drops uint32 + Freeze_q_cnt uint32 +} + +type TpacketAuxdata struct { + Status uint32 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Vlan_tci uint16 + Vlan_tpid uint16 +} + +const ( + TPACKET_V1 = 0x0 + TPACKET_V2 = 0x1 + TPACKET_V3 = 0x2 +) + +const ( + SizeofTpacketHdr = 0x18 + SizeofTpacket2Hdr = 0x20 + SizeofTpacket3Hdr = 0x30 +) + +const ( + NF_INET_PRE_ROUTING = 0x0 + NF_INET_LOCAL_IN = 0x1 + NF_INET_FORWARD = 0x2 + NF_INET_LOCAL_OUT = 0x3 + NF_INET_POST_ROUTING = 0x4 + NF_INET_NUMHOOKS = 0x5 +) + +const ( + NF_NETDEV_INGRESS = 0x0 + NF_NETDEV_NUMHOOKS = 0x1 +) + +const ( + NFPROTO_UNSPEC = 0x0 + NFPROTO_INET = 0x1 + NFPROTO_IPV4 = 0x2 + NFPROTO_ARP = 0x3 + NFPROTO_NETDEV = 0x5 + NFPROTO_BRIDGE = 0x7 + NFPROTO_IPV6 = 0xa + NFPROTO_DECNET = 0xc + NFPROTO_NUMPROTO = 0xd +) + +type Nfgenmsg struct { + Nfgen_family uint8 + Version uint8 + Res_id uint16 +} + +const ( + NFNL_BATCH_UNSPEC = 0x0 + NFNL_BATCH_GENID = 0x1 +) + +const ( + NFT_REG_VERDICT = 0x0 + NFT_REG_1 = 0x1 + NFT_REG_2 = 0x2 + NFT_REG_3 = 0x3 + NFT_REG_4 = 0x4 + NFT_REG32_00 = 0x8 + NFT_REG32_01 = 0x9 + NFT_REG32_02 = 0xa + NFT_REG32_03 = 0xb + NFT_REG32_04 = 0xc + NFT_REG32_05 = 0xd + NFT_REG32_06 = 0xe + NFT_REG32_07 = 0xf + NFT_REG32_08 = 0x10 + NFT_REG32_09 = 0x11 + NFT_REG32_10 = 0x12 + NFT_REG32_11 = 0x13 + NFT_REG32_12 = 0x14 + NFT_REG32_13 = 0x15 + NFT_REG32_14 = 0x16 + NFT_REG32_15 = 0x17 + NFT_CONTINUE = -0x1 + NFT_BREAK = -0x2 + NFT_JUMP = -0x3 + NFT_GOTO = -0x4 + NFT_RETURN = -0x5 + NFT_MSG_NEWTABLE = 0x0 + NFT_MSG_GETTABLE = 0x1 + NFT_MSG_DELTABLE = 0x2 + NFT_MSG_NEWCHAIN = 0x3 + NFT_MSG_GETCHAIN = 0x4 + NFT_MSG_DELCHAIN = 0x5 + NFT_MSG_NEWRULE = 0x6 + NFT_MSG_GETRULE = 0x7 + NFT_MSG_DELRULE = 0x8 + NFT_MSG_NEWSET = 0x9 + NFT_MSG_GETSET = 0xa + NFT_MSG_DELSET = 0xb + NFT_MSG_NEWSETELEM = 0xc + NFT_MSG_GETSETELEM = 0xd + NFT_MSG_DELSETELEM = 0xe + NFT_MSG_NEWGEN = 0xf + NFT_MSG_GETGEN = 0x10 + NFT_MSG_TRACE = 0x11 + NFT_MSG_NEWOBJ = 0x12 + NFT_MSG_GETOBJ = 0x13 + NFT_MSG_DELOBJ = 0x14 + NFT_MSG_GETOBJ_RESET = 0x15 + NFT_MSG_MAX = 0x19 + NFTA_LIST_UNPEC = 0x0 + NFTA_LIST_ELEM = 0x1 + NFTA_HOOK_UNSPEC = 0x0 + NFTA_HOOK_HOOKNUM = 0x1 + NFTA_HOOK_PRIORITY = 0x2 + NFTA_HOOK_DEV = 0x3 + NFT_TABLE_F_DORMANT = 0x1 + NFTA_TABLE_UNSPEC = 0x0 + NFTA_TABLE_NAME = 0x1 + NFTA_TABLE_FLAGS = 0x2 + NFTA_TABLE_USE = 0x3 + NFTA_CHAIN_UNSPEC = 0x0 + NFTA_CHAIN_TABLE = 0x1 + NFTA_CHAIN_HANDLE = 0x2 + NFTA_CHAIN_NAME = 0x3 + NFTA_CHAIN_HOOK = 0x4 + NFTA_CHAIN_POLICY = 0x5 + NFTA_CHAIN_USE = 0x6 + NFTA_CHAIN_TYPE = 0x7 + NFTA_CHAIN_COUNTERS = 0x8 + NFTA_CHAIN_PAD = 0x9 + NFTA_RULE_UNSPEC = 0x0 + NFTA_RULE_TABLE = 0x1 + NFTA_RULE_CHAIN = 0x2 + NFTA_RULE_HANDLE = 0x3 + NFTA_RULE_EXPRESSIONS = 0x4 + NFTA_RULE_COMPAT = 0x5 + NFTA_RULE_POSITION = 0x6 + NFTA_RULE_USERDATA = 0x7 + NFTA_RULE_PAD = 0x8 + NFTA_RULE_ID = 0x9 + NFT_RULE_COMPAT_F_INV = 0x2 + NFT_RULE_COMPAT_F_MASK = 0x2 + NFTA_RULE_COMPAT_UNSPEC = 0x0 + NFTA_RULE_COMPAT_PROTO = 0x1 + NFTA_RULE_COMPAT_FLAGS = 0x2 + NFT_SET_ANONYMOUS = 0x1 + NFT_SET_CONSTANT = 0x2 + NFT_SET_INTERVAL = 0x4 + NFT_SET_MAP = 0x8 + NFT_SET_TIMEOUT = 0x10 + NFT_SET_EVAL = 0x20 + NFT_SET_OBJECT = 0x40 + NFT_SET_POL_PERFORMANCE = 0x0 + NFT_SET_POL_MEMORY = 0x1 + NFTA_SET_DESC_UNSPEC = 0x0 + NFTA_SET_DESC_SIZE = 0x1 + NFTA_SET_UNSPEC = 0x0 + NFTA_SET_TABLE = 0x1 + NFTA_SET_NAME = 0x2 + NFTA_SET_FLAGS = 0x3 + NFTA_SET_KEY_TYPE = 0x4 + NFTA_SET_KEY_LEN = 0x5 + NFTA_SET_DATA_TYPE = 0x6 + NFTA_SET_DATA_LEN = 0x7 + NFTA_SET_POLICY = 0x8 + NFTA_SET_DESC = 0x9 + NFTA_SET_ID = 0xa + NFTA_SET_TIMEOUT = 0xb + NFTA_SET_GC_INTERVAL = 0xc + NFTA_SET_USERDATA = 0xd + NFTA_SET_PAD = 0xe + NFTA_SET_OBJ_TYPE = 0xf + NFT_SET_ELEM_INTERVAL_END = 0x1 + NFTA_SET_ELEM_UNSPEC = 0x0 + NFTA_SET_ELEM_KEY = 0x1 + NFTA_SET_ELEM_DATA = 0x2 + NFTA_SET_ELEM_FLAGS = 0x3 + NFTA_SET_ELEM_TIMEOUT = 0x4 + NFTA_SET_ELEM_EXPIRATION = 0x5 + NFTA_SET_ELEM_USERDATA = 0x6 + NFTA_SET_ELEM_EXPR = 0x7 + NFTA_SET_ELEM_PAD = 0x8 + NFTA_SET_ELEM_OBJREF = 0x9 + NFTA_SET_ELEM_LIST_UNSPEC = 0x0 + NFTA_SET_ELEM_LIST_TABLE = 0x1 + NFTA_SET_ELEM_LIST_SET = 0x2 + NFTA_SET_ELEM_LIST_ELEMENTS = 0x3 + NFTA_SET_ELEM_LIST_SET_ID = 0x4 + NFT_DATA_VALUE = 0x0 + NFT_DATA_VERDICT = 0xffffff00 + NFTA_DATA_UNSPEC = 0x0 + NFTA_DATA_VALUE = 0x1 + NFTA_DATA_VERDICT = 0x2 + NFTA_VERDICT_UNSPEC = 0x0 + NFTA_VERDICT_CODE = 0x1 + NFTA_VERDICT_CHAIN = 0x2 + NFTA_EXPR_UNSPEC = 0x0 + NFTA_EXPR_NAME = 0x1 + NFTA_EXPR_DATA = 0x2 + NFTA_IMMEDIATE_UNSPEC = 0x0 + NFTA_IMMEDIATE_DREG = 0x1 + NFTA_IMMEDIATE_DATA = 0x2 + NFTA_BITWISE_UNSPEC = 0x0 + NFTA_BITWISE_SREG = 0x1 + NFTA_BITWISE_DREG = 0x2 + NFTA_BITWISE_LEN = 0x3 + NFTA_BITWISE_MASK = 0x4 + NFTA_BITWISE_XOR = 0x5 + NFT_BYTEORDER_NTOH = 0x0 + NFT_BYTEORDER_HTON = 0x1 + NFTA_BYTEORDER_UNSPEC = 0x0 + NFTA_BYTEORDER_SREG = 0x1 + NFTA_BYTEORDER_DREG = 0x2 + NFTA_BYTEORDER_OP = 0x3 + NFTA_BYTEORDER_LEN = 0x4 + NFTA_BYTEORDER_SIZE = 0x5 + NFT_CMP_EQ = 0x0 + NFT_CMP_NEQ = 0x1 + NFT_CMP_LT = 0x2 + NFT_CMP_LTE = 0x3 + NFT_CMP_GT = 0x4 + NFT_CMP_GTE = 0x5 + NFTA_CMP_UNSPEC = 0x0 + NFTA_CMP_SREG = 0x1 + NFTA_CMP_OP = 0x2 + NFTA_CMP_DATA = 0x3 + NFT_RANGE_EQ = 0x0 + NFT_RANGE_NEQ = 0x1 + NFTA_RANGE_UNSPEC = 0x0 + NFTA_RANGE_SREG = 0x1 + NFTA_RANGE_OP = 0x2 + NFTA_RANGE_FROM_DATA = 0x3 + NFTA_RANGE_TO_DATA = 0x4 + NFT_LOOKUP_F_INV = 0x1 + NFTA_LOOKUP_UNSPEC = 0x0 + NFTA_LOOKUP_SET = 0x1 + NFTA_LOOKUP_SREG = 0x2 + NFTA_LOOKUP_DREG = 0x3 + NFTA_LOOKUP_SET_ID = 0x4 + NFTA_LOOKUP_FLAGS = 0x5 + NFT_DYNSET_OP_ADD = 0x0 + NFT_DYNSET_OP_UPDATE = 0x1 + NFT_DYNSET_F_INV = 0x1 + NFTA_DYNSET_UNSPEC = 0x0 + NFTA_DYNSET_SET_NAME = 0x1 + NFTA_DYNSET_SET_ID = 0x2 + NFTA_DYNSET_OP = 0x3 + NFTA_DYNSET_SREG_KEY = 0x4 + NFTA_DYNSET_SREG_DATA = 0x5 + NFTA_DYNSET_TIMEOUT = 0x6 + NFTA_DYNSET_EXPR = 0x7 + NFTA_DYNSET_PAD = 0x8 + NFTA_DYNSET_FLAGS = 0x9 + NFT_PAYLOAD_LL_HEADER = 0x0 + NFT_PAYLOAD_NETWORK_HEADER = 0x1 + NFT_PAYLOAD_TRANSPORT_HEADER = 0x2 + NFT_PAYLOAD_CSUM_NONE = 0x0 + NFT_PAYLOAD_CSUM_INET = 0x1 + NFT_PAYLOAD_L4CSUM_PSEUDOHDR = 0x1 + NFTA_PAYLOAD_UNSPEC = 0x0 + NFTA_PAYLOAD_DREG = 0x1 + NFTA_PAYLOAD_BASE = 0x2 + NFTA_PAYLOAD_OFFSET = 0x3 + NFTA_PAYLOAD_LEN = 0x4 + NFTA_PAYLOAD_SREG = 0x5 + NFTA_PAYLOAD_CSUM_TYPE = 0x6 + NFTA_PAYLOAD_CSUM_OFFSET = 0x7 + NFTA_PAYLOAD_CSUM_FLAGS = 0x8 + NFT_EXTHDR_F_PRESENT = 0x1 + NFT_EXTHDR_OP_IPV6 = 0x0 + NFT_EXTHDR_OP_TCPOPT = 0x1 + NFTA_EXTHDR_UNSPEC = 0x0 + NFTA_EXTHDR_DREG = 0x1 + NFTA_EXTHDR_TYPE = 0x2 + NFTA_EXTHDR_OFFSET = 0x3 + NFTA_EXTHDR_LEN = 0x4 + NFTA_EXTHDR_FLAGS = 0x5 + NFTA_EXTHDR_OP = 0x6 + NFTA_EXTHDR_SREG = 0x7 + NFT_META_LEN = 0x0 + NFT_META_PROTOCOL = 0x1 + NFT_META_PRIORITY = 0x2 + NFT_META_MARK = 0x3 + NFT_META_IIF = 0x4 + NFT_META_OIF = 0x5 + NFT_META_IIFNAME = 0x6 + NFT_META_OIFNAME = 0x7 + NFT_META_IIFTYPE = 0x8 + NFT_META_OIFTYPE = 0x9 + NFT_META_SKUID = 0xa + NFT_META_SKGID = 0xb + NFT_META_NFTRACE = 0xc + NFT_META_RTCLASSID = 0xd + NFT_META_SECMARK = 0xe + NFT_META_NFPROTO = 0xf + NFT_META_L4PROTO = 0x10 + NFT_META_BRI_IIFNAME = 0x11 + NFT_META_BRI_OIFNAME = 0x12 + NFT_META_PKTTYPE = 0x13 + NFT_META_CPU = 0x14 + NFT_META_IIFGROUP = 0x15 + NFT_META_OIFGROUP = 0x16 + NFT_META_CGROUP = 0x17 + NFT_META_PRANDOM = 0x18 + NFT_RT_CLASSID = 0x0 + NFT_RT_NEXTHOP4 = 0x1 + NFT_RT_NEXTHOP6 = 0x2 + NFT_RT_TCPMSS = 0x3 + NFT_HASH_JENKINS = 0x0 + NFT_HASH_SYM = 0x1 + NFTA_HASH_UNSPEC = 0x0 + NFTA_HASH_SREG = 0x1 + NFTA_HASH_DREG = 0x2 + NFTA_HASH_LEN = 0x3 + NFTA_HASH_MODULUS = 0x4 + NFTA_HASH_SEED = 0x5 + NFTA_HASH_OFFSET = 0x6 + NFTA_HASH_TYPE = 0x7 + NFTA_META_UNSPEC = 0x0 + NFTA_META_DREG = 0x1 + NFTA_META_KEY = 0x2 + NFTA_META_SREG = 0x3 + NFTA_RT_UNSPEC = 0x0 + NFTA_RT_DREG = 0x1 + NFTA_RT_KEY = 0x2 + NFT_CT_STATE = 0x0 + NFT_CT_DIRECTION = 0x1 + NFT_CT_STATUS = 0x2 + NFT_CT_MARK = 0x3 + NFT_CT_SECMARK = 0x4 + NFT_CT_EXPIRATION = 0x5 + NFT_CT_HELPER = 0x6 + NFT_CT_L3PROTOCOL = 0x7 + NFT_CT_SRC = 0x8 + NFT_CT_DST = 0x9 + NFT_CT_PROTOCOL = 0xa + NFT_CT_PROTO_SRC = 0xb + NFT_CT_PROTO_DST = 0xc + NFT_CT_LABELS = 0xd + NFT_CT_PKTS = 0xe + NFT_CT_BYTES = 0xf + NFT_CT_AVGPKT = 0x10 + NFT_CT_ZONE = 0x11 + NFT_CT_EVENTMASK = 0x12 + NFTA_CT_UNSPEC = 0x0 + NFTA_CT_DREG = 0x1 + NFTA_CT_KEY = 0x2 + NFTA_CT_DIRECTION = 0x3 + NFTA_CT_SREG = 0x4 + NFT_LIMIT_PKTS = 0x0 + NFT_LIMIT_PKT_BYTES = 0x1 + NFT_LIMIT_F_INV = 0x1 + NFTA_LIMIT_UNSPEC = 0x0 + NFTA_LIMIT_RATE = 0x1 + NFTA_LIMIT_UNIT = 0x2 + NFTA_LIMIT_BURST = 0x3 + NFTA_LIMIT_TYPE = 0x4 + NFTA_LIMIT_FLAGS = 0x5 + NFTA_LIMIT_PAD = 0x6 + NFTA_COUNTER_UNSPEC = 0x0 + NFTA_COUNTER_BYTES = 0x1 + NFTA_COUNTER_PACKETS = 0x2 + NFTA_COUNTER_PAD = 0x3 + NFTA_LOG_UNSPEC = 0x0 + NFTA_LOG_GROUP = 0x1 + NFTA_LOG_PREFIX = 0x2 + NFTA_LOG_SNAPLEN = 0x3 + NFTA_LOG_QTHRESHOLD = 0x4 + NFTA_LOG_LEVEL = 0x5 + NFTA_LOG_FLAGS = 0x6 + NFTA_QUEUE_UNSPEC = 0x0 + NFTA_QUEUE_NUM = 0x1 + NFTA_QUEUE_TOTAL = 0x2 + NFTA_QUEUE_FLAGS = 0x3 + NFTA_QUEUE_SREG_QNUM = 0x4 + NFT_QUOTA_F_INV = 0x1 + NFT_QUOTA_F_DEPLETED = 0x2 + NFTA_QUOTA_UNSPEC = 0x0 + NFTA_QUOTA_BYTES = 0x1 + NFTA_QUOTA_FLAGS = 0x2 + NFTA_QUOTA_PAD = 0x3 + NFTA_QUOTA_CONSUMED = 0x4 + NFT_REJECT_ICMP_UNREACH = 0x0 + NFT_REJECT_TCP_RST = 0x1 + NFT_REJECT_ICMPX_UNREACH = 0x2 + NFT_REJECT_ICMPX_NO_ROUTE = 0x0 + NFT_REJECT_ICMPX_PORT_UNREACH = 0x1 + NFT_REJECT_ICMPX_HOST_UNREACH = 0x2 + NFT_REJECT_ICMPX_ADMIN_PROHIBITED = 0x3 + NFTA_REJECT_UNSPEC = 0x0 + NFTA_REJECT_TYPE = 0x1 + NFTA_REJECT_ICMP_CODE = 0x2 + NFT_NAT_SNAT = 0x0 + NFT_NAT_DNAT = 0x1 + NFTA_NAT_UNSPEC = 0x0 + NFTA_NAT_TYPE = 0x1 + NFTA_NAT_FAMILY = 0x2 + NFTA_NAT_REG_ADDR_MIN = 0x3 + NFTA_NAT_REG_ADDR_MAX = 0x4 + NFTA_NAT_REG_PROTO_MIN = 0x5 + NFTA_NAT_REG_PROTO_MAX = 0x6 + NFTA_NAT_FLAGS = 0x7 + NFTA_MASQ_UNSPEC = 0x0 + NFTA_MASQ_FLAGS = 0x1 + NFTA_MASQ_REG_PROTO_MIN = 0x2 + NFTA_MASQ_REG_PROTO_MAX = 0x3 + NFTA_REDIR_UNSPEC = 0x0 + NFTA_REDIR_REG_PROTO_MIN = 0x1 + NFTA_REDIR_REG_PROTO_MAX = 0x2 + NFTA_REDIR_FLAGS = 0x3 + NFTA_DUP_UNSPEC = 0x0 + NFTA_DUP_SREG_ADDR = 0x1 + NFTA_DUP_SREG_DEV = 0x2 + NFTA_FWD_UNSPEC = 0x0 + NFTA_FWD_SREG_DEV = 0x1 + NFTA_OBJREF_UNSPEC = 0x0 + NFTA_OBJREF_IMM_TYPE = 0x1 + NFTA_OBJREF_IMM_NAME = 0x2 + NFTA_OBJREF_SET_SREG = 0x3 + NFTA_OBJREF_SET_NAME = 0x4 + NFTA_OBJREF_SET_ID = 0x5 + NFTA_GEN_UNSPEC = 0x0 + NFTA_GEN_ID = 0x1 + NFTA_GEN_PROC_PID = 0x2 + NFTA_GEN_PROC_NAME = 0x3 + NFTA_FIB_UNSPEC = 0x0 + NFTA_FIB_DREG = 0x1 + NFTA_FIB_RESULT = 0x2 + NFTA_FIB_FLAGS = 0x3 + NFT_FIB_RESULT_UNSPEC = 0x0 + NFT_FIB_RESULT_OIF = 0x1 + NFT_FIB_RESULT_OIFNAME = 0x2 + NFT_FIB_RESULT_ADDRTYPE = 0x3 + NFTA_FIB_F_SADDR = 0x1 + NFTA_FIB_F_DADDR = 0x2 + NFTA_FIB_F_MARK = 0x4 + NFTA_FIB_F_IIF = 0x8 + NFTA_FIB_F_OIF = 0x10 + NFTA_FIB_F_PRESENT = 0x20 + NFTA_CT_HELPER_UNSPEC = 0x0 + NFTA_CT_HELPER_NAME = 0x1 + NFTA_CT_HELPER_L3PROTO = 0x2 + NFTA_CT_HELPER_L4PROTO = 0x3 + NFTA_OBJ_UNSPEC = 0x0 + NFTA_OBJ_TABLE = 0x1 + NFTA_OBJ_NAME = 0x2 + NFTA_OBJ_TYPE = 0x3 + NFTA_OBJ_DATA = 0x4 + NFTA_OBJ_USE = 0x5 + NFTA_TRACE_UNSPEC = 0x0 + NFTA_TRACE_TABLE = 0x1 + NFTA_TRACE_CHAIN = 0x2 + NFTA_TRACE_RULE_HANDLE = 0x3 + NFTA_TRACE_TYPE = 0x4 + NFTA_TRACE_VERDICT = 0x5 + NFTA_TRACE_ID = 0x6 + NFTA_TRACE_LL_HEADER = 0x7 + NFTA_TRACE_NETWORK_HEADER = 0x8 + NFTA_TRACE_TRANSPORT_HEADER = 0x9 + NFTA_TRACE_IIF = 0xa + NFTA_TRACE_IIFTYPE = 0xb + NFTA_TRACE_OIF = 0xc + NFTA_TRACE_OIFTYPE = 0xd + NFTA_TRACE_MARK = 0xe + NFTA_TRACE_NFPROTO = 0xf + NFTA_TRACE_POLICY = 0x10 + NFTA_TRACE_PAD = 0x11 + NFT_TRACETYPE_UNSPEC = 0x0 + NFT_TRACETYPE_POLICY = 0x1 + NFT_TRACETYPE_RETURN = 0x2 + NFT_TRACETYPE_RULE = 0x3 + NFTA_NG_UNSPEC = 0x0 + NFTA_NG_DREG = 0x1 + NFTA_NG_MODULUS = 0x2 + NFTA_NG_TYPE = 0x3 + NFTA_NG_OFFSET = 0x4 + NFT_NG_INCREMENTAL = 0x0 + NFT_NG_RANDOM = 0x1 +) + +type RTCTime struct { + Sec int32 + Min int32 + Hour int32 + Mday int32 + Mon int32 + Year int32 + Wday int32 + Yday int32 + Isdst int32 +} + +type RTCWkAlrm struct { + Enabled uint8 + Pending uint8 + _ [2]byte + Time RTCTime +} + +type RTCPLLInfo struct { + Ctrl int32 + Value int32 + Max int32 + Min int32 + Posmult int32 + Negmult int32 + Clock int32 +} + +type BlkpgIoctlArg struct { + Op int32 + Flags int32 + Datalen int32 + Data *byte +} + +type BlkpgPartition struct { + Start int64 + Length int64 + Pno int32 + Devname [64]uint8 + Volname [64]uint8 +} + +const ( + BLKPG = 0x1269 + BLKPG_ADD_PARTITION = 0x1 + BLKPG_DEL_PARTITION = 0x2 + BLKPG_RESIZE_PARTITION = 0x3 +) + +const ( + NETNSA_NONE = 0x0 + NETNSA_NSID = 0x1 + NETNSA_PID = 0x2 + NETNSA_FD = 0x3 +) + +type XDPRingOffset struct { + Producer uint64 + Consumer uint64 + Desc uint64 +} + +type XDPMmapOffsets struct { + Rx XDPRingOffset + Tx XDPRingOffset + Fr XDPRingOffset + Cr XDPRingOffset +} + +type XDPUmemReg struct { + Addr uint64 + Len uint64 + Size uint32 + Headroom uint32 +} + +type XDPStatistics struct { + Rx_dropped uint64 + Rx_invalid_descs uint64 + Tx_invalid_descs uint64 +} + +type XDPDesc struct { + Addr uint64 + Len uint32 + Options uint32 +} + +const ( + NCSI_CMD_UNSPEC = 0x0 + NCSI_CMD_PKG_INFO = 0x1 + NCSI_CMD_SET_INTERFACE = 0x2 + NCSI_CMD_CLEAR_INTERFACE = 0x3 + NCSI_ATTR_UNSPEC = 0x0 + NCSI_ATTR_IFINDEX = 0x1 + NCSI_ATTR_PACKAGE_LIST = 0x2 + NCSI_ATTR_PACKAGE_ID = 0x3 + NCSI_ATTR_CHANNEL_ID = 0x4 + NCSI_PKG_ATTR_UNSPEC = 0x0 + NCSI_PKG_ATTR = 0x1 + NCSI_PKG_ATTR_ID = 0x2 + NCSI_PKG_ATTR_FORCED = 0x3 + NCSI_PKG_ATTR_CHANNEL_LIST = 0x4 + NCSI_CHANNEL_ATTR_UNSPEC = 0x0 + NCSI_CHANNEL_ATTR = 0x1 + NCSI_CHANNEL_ATTR_ID = 0x2 + NCSI_CHANNEL_ATTR_VERSION_MAJOR = 0x3 + NCSI_CHANNEL_ATTR_VERSION_MINOR = 0x4 + NCSI_CHANNEL_ATTR_VERSION_STR = 0x5 + NCSI_CHANNEL_ATTR_LINK_STATE = 0x6 + NCSI_CHANNEL_ATTR_ACTIVE = 0x7 + NCSI_CHANNEL_ATTR_FORCED = 0x8 + NCSI_CHANNEL_ATTR_VLAN_LIST = 0x9 + NCSI_CHANNEL_ATTR_VLAN_ID = 0xa +) + +const ( + SOF_TIMESTAMPING_TX_HARDWARE = 0x1 + SOF_TIMESTAMPING_TX_SOFTWARE = 0x2 + SOF_TIMESTAMPING_RX_HARDWARE = 0x4 + SOF_TIMESTAMPING_RX_SOFTWARE = 0x8 + SOF_TIMESTAMPING_SOFTWARE = 0x10 + SOF_TIMESTAMPING_SYS_HARDWARE = 0x20 + SOF_TIMESTAMPING_RAW_HARDWARE = 0x40 + SOF_TIMESTAMPING_OPT_ID = 0x80 + SOF_TIMESTAMPING_TX_SCHED = 0x100 + SOF_TIMESTAMPING_TX_ACK = 0x200 + SOF_TIMESTAMPING_OPT_CMSG = 0x400 + SOF_TIMESTAMPING_OPT_TSONLY = 0x800 + SOF_TIMESTAMPING_OPT_STATS = 0x1000 + SOF_TIMESTAMPING_OPT_PKTINFO = 0x2000 + SOF_TIMESTAMPING_OPT_TX_SWHW = 0x4000 + + SOF_TIMESTAMPING_LAST = 0x4000 + SOF_TIMESTAMPING_MASK = 0x7fff +) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go new file mode 100644 index 00000000..aa52a439 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go @@ -0,0 +1,2010 @@ +// cgo -godefs -- -Wall -Werror -static -I/tmp/include -m64 linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,linux + +package unix + +const ( + SizeofPtr = 0x8 + SizeofShort = 0x2 + SizeofInt = 0x4 + SizeofLong = 0x8 + SizeofLongLong = 0x8 + PathMax = 0x1000 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Timex struct { + Modes uint32 + _ [4]byte + Offset int64 + Freq int64 + Maxerror int64 + Esterror int64 + Status int32 + _ [4]byte + Constant int64 + Precision int64 + Tolerance int64 + Time Timeval + Tick int64 + Ppsfreq int64 + Jitter int64 + Shift int32 + _ [4]byte + Stabil int64 + Jitcnt int64 + Calcnt int64 + Errcnt int64 + Stbcnt int64 + Tai int32 + _ [44]byte +} + +type Time_t int64 + +type Tms struct { + Utime int64 + Stime int64 + Cutime int64 + Cstime int64 +} + +type Utimbuf struct { + Actime int64 + Modtime int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint64 + Ino uint64 + Nlink uint64 + Mode uint32 + Uid uint32 + Gid uint32 + _ int32 + Rdev uint64 + Size int64 + Blksize int64 + Blocks int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + _ [3]int64 +} + +type StatxTimestamp struct { + Sec int64 + Nsec uint32 + _ int32 +} + +type Statx_t struct { + Mask uint32 + Blksize uint32 + Attributes uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Mode uint16 + _ [1]uint16 + Ino uint64 + Size uint64 + Blocks uint64 + Attributes_mask uint64 + Atime StatxTimestamp + Btime StatxTimestamp + Ctime StatxTimestamp + Mtime StatxTimestamp + Rdev_major uint32 + Rdev_minor uint32 + Dev_major uint32 + Dev_minor uint32 + _ [14]uint64 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]int8 + _ [5]byte +} + +type Fsid struct { + Val [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + _ [4]byte + Start int64 + Len int64 + Pid int32 + _ [4]byte +} + +type FscryptPolicy struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptKey struct { + Mode uint32 + Raw [64]uint8 + Size uint32 +} + +type KeyctlDHParams struct { + Private int32 + Prime int32 + Base int32 +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddrL2 struct { + Family uint16 + Psm uint16 + Bdaddr [6]uint8 + Cid uint16 + Bdaddr_type uint8 + _ [1]byte +} + +type RawSockaddrRFCOMM struct { + Family uint16 + Bdaddr [6]uint8 + Channel uint8 + _ [1]byte +} + +type RawSockaddrCAN struct { + Family uint16 + _ [2]byte + Ifindex int32 + Addr [8]byte +} + +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + +type RawSockaddrXDP struct { + Family uint16 + Flags uint16 + Ifindex uint32 + Queue_id uint32 + Shared_umem_fd uint32 +} + +type RawSockaddr struct { + Family uint16 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type PacketMreq struct { + Ifindex int32 + Type uint16 + Alen uint16 + Address [8]uint8 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + _ [4]byte + Iov *Iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + _ [4]byte +} + +type Cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + _ [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofSockaddrL2 = 0xe + SizeofSockaddrRFCOMM = 0xa + SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 + SizeofSockaddrXDP = 0x10 + SizeofLinger = 0x8 + SizeofIovec = 0x10 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofPacketMreq = 0x10 + SizeofMsghdr = 0x38 + SizeofCmsghdr = 0x10 + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_INFO_KIND = 0x1 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_NUM_VF = 0x15 + IFLA_VFINFO_LIST = 0x16 + IFLA_STATS64 = 0x17 + IFLA_VF_PORTS = 0x18 + IFLA_PORT_SELF = 0x19 + IFLA_AF_SPEC = 0x1a + IFLA_GROUP = 0x1b + IFLA_NET_NS_FD = 0x1c + IFLA_EXT_MASK = 0x1d + IFLA_PROMISCUITY = 0x1e + IFLA_NUM_TX_QUEUES = 0x1f + IFLA_NUM_RX_QUEUES = 0x20 + IFLA_CARRIER = 0x21 + IFLA_PHYS_PORT_ID = 0x22 + IFLA_CARRIER_CHANGES = 0x23 + IFLA_PHYS_SWITCH_ID = 0x24 + IFLA_LINK_NETNSID = 0x25 + IFLA_PHYS_PORT_NAME = 0x26 + IFLA_PROTO_DOWN = 0x27 + IFLA_GSO_MAX_SEGS = 0x28 + IFLA_GSO_MAX_SIZE = 0x29 + IFLA_PAD = 0x2a + IFLA_XDP = 0x2b + IFLA_EVENT = 0x2c + IFLA_NEW_NETNSID = 0x2d + IFLA_IF_NETNSID = 0x2e + IFLA_MAX = 0x33 + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTA_MARK = 0x10 + RTA_MFC_STATS = 0x11 + RTA_VIA = 0x12 + RTA_NEWDST = 0x13 + RTA_PREF = 0x14 + RTA_ENCAP_TYPE = 0x15 + RTA_ENCAP = 0x16 + RTA_EXPIRES = 0x17 + RTA_PAD = 0x18 + RTA_UID = 0x19 + RTA_TTL_PROPAGATE = 0x1a + RTA_IP_PROTO = 0x1b + RTA_SPORT = 0x1c + RTA_DPORT = 0x1d + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + _ uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x10 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + _ [6]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + R15 uint64 + R14 uint64 + R13 uint64 + R12 uint64 + Rbp uint64 + Rbx uint64 + R11 uint64 + R10 uint64 + R9 uint64 + R8 uint64 + Rax uint64 + Rcx uint64 + Rdx uint64 + Rsi uint64 + Rdi uint64 + Orig_rax uint64 + Rip uint64 + Cs uint64 + Eflags uint64 + Rsp uint64 + Ss uint64 + Fs_base uint64 + Gs_base uint64 + Ds uint64 + Es uint64 + Fs uint64 + Gs uint64 +} + +type FdSet struct { + Bits [16]int64 +} + +type Sysinfo_t struct { + Uptime int64 + Loads [3]uint64 + Totalram uint64 + Freeram uint64 + Sharedram uint64 + Bufferram uint64 + Totalswap uint64 + Freeswap uint64 + Procs uint16 + Pad uint16 + _ [4]byte + Totalhigh uint64 + Freehigh uint64 + Unit uint32 + _ [0]int8 + _ [4]byte +} + +type Utsname struct { + Sysname [65]byte + Nodename [65]byte + Release [65]byte + Version [65]byte + Machine [65]byte + Domainname [65]byte +} + +type Ustat_t struct { + Tfree int32 + _ [4]byte + Tinode uint64 + Fname [6]int8 + Fpack [6]int8 + _ [4]byte +} + +type EpollEvent struct { + Events uint32 + Fd int32 + Pad int32 +} + +const ( + AT_EMPTY_PATH = 0x1000 + AT_FDCWD = -0x64 + AT_NO_AUTOMOUNT = 0x800 + AT_REMOVEDIR = 0x200 + + AT_STATX_SYNC_AS_STAT = 0x0 + AT_STATX_FORCE_SYNC = 0x2000 + AT_STATX_DONT_SYNC = 0x4000 + + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 + + AT_EACCESS = 0x200 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x2000 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Sigset_t struct { + Val [16]uint64 +} + +const RNDGETENTCNT = 0x80045200 + +const PERF_IOC_FLAG_GROUP = 0x1 + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Line uint8 + Cc [19]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Taskstats struct { + Version uint16 + _ [2]byte + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + _ [6]byte + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]int8 + Ac_sched uint8 + Ac_pad [3]uint8 + _ [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + _ [4]byte + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 +} + +const ( + TASKSTATS_CMD_UNSPEC = 0x0 + TASKSTATS_CMD_GET = 0x1 + TASKSTATS_CMD_NEW = 0x2 + TASKSTATS_TYPE_UNSPEC = 0x0 + TASKSTATS_TYPE_PID = 0x1 + TASKSTATS_TYPE_TGID = 0x2 + TASKSTATS_TYPE_STATS = 0x3 + TASKSTATS_TYPE_AGGR_PID = 0x4 + TASKSTATS_TYPE_AGGR_TGID = 0x5 + TASKSTATS_TYPE_NULL = 0x6 + TASKSTATS_CMD_ATTR_UNSPEC = 0x0 + TASKSTATS_CMD_ATTR_PID = 0x1 + TASKSTATS_CMD_ATTR_TGID = 0x2 + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 +) + +type CGroupStats struct { + Sleeping uint64 + Running uint64 + Stopped uint64 + Uninterruptible uint64 + Io_wait uint64 +} + +const ( + CGROUPSTATS_CMD_UNSPEC = 0x3 + CGROUPSTATS_CMD_GET = 0x4 + CGROUPSTATS_CMD_NEW = 0x5 + CGROUPSTATS_TYPE_UNSPEC = 0x0 + CGROUPSTATS_TYPE_CGROUP_STATS = 0x1 + CGROUPSTATS_CMD_ATTR_UNSPEC = 0x0 + CGROUPSTATS_CMD_ATTR_FD = 0x1 +) + +type Genlmsghdr struct { + Cmd uint8 + Version uint8 + Reserved uint16 +} + +const ( + CTRL_CMD_UNSPEC = 0x0 + CTRL_CMD_NEWFAMILY = 0x1 + CTRL_CMD_DELFAMILY = 0x2 + CTRL_CMD_GETFAMILY = 0x3 + CTRL_CMD_NEWOPS = 0x4 + CTRL_CMD_DELOPS = 0x5 + CTRL_CMD_GETOPS = 0x6 + CTRL_CMD_NEWMCAST_GRP = 0x7 + CTRL_CMD_DELMCAST_GRP = 0x8 + CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_ATTR_UNSPEC = 0x0 + CTRL_ATTR_FAMILY_ID = 0x1 + CTRL_ATTR_FAMILY_NAME = 0x2 + CTRL_ATTR_VERSION = 0x3 + CTRL_ATTR_HDRSIZE = 0x4 + CTRL_ATTR_MAXATTR = 0x5 + CTRL_ATTR_OPS = 0x6 + CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_OP_UNSPEC = 0x0 + CTRL_ATTR_OP_ID = 0x1 + CTRL_ATTR_OP_FLAGS = 0x2 + CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 + CTRL_ATTR_MCAST_GRP_NAME = 0x1 + CTRL_ATTR_MCAST_GRP_ID = 0x2 +) + +type cpuMask uint64 + +const ( + _CPU_SETSIZE = 0x400 + _NCPUBITS = 0x40 +) + +const ( + BDADDR_BREDR = 0x0 + BDADDR_LE_PUBLIC = 0x1 + BDADDR_LE_RANDOM = 0x2 +) + +type PerfEventAttr struct { + Type uint32 + Size uint32 + Config uint64 + Sample uint64 + Sample_type uint64 + Read_format uint64 + Bits uint64 + Wakeup uint32 + Bp_type uint32 + Ext1 uint64 + Ext2 uint64 + Branch_sample_type uint64 + Sample_regs_user uint64 + Sample_stack_user uint32 + Clockid int32 + Sample_regs_intr uint64 + Aux_watermark uint32 + _ uint32 +} + +type PerfEventMmapPage struct { + Version uint32 + Compat_version uint32 + Lock uint32 + Index uint32 + Offset int64 + Time_enabled uint64 + Time_running uint64 + Capabilities uint64 + Pmc_width uint16 + Time_shift uint16 + Time_mult uint32 + Time_offset uint64 + Time_zero uint64 + Size uint32 + _ [948]uint8 + Data_head uint64 + Data_tail uint64 + Data_offset uint64 + Data_size uint64 + Aux_head uint64 + Aux_tail uint64 + Aux_offset uint64 + Aux_size uint64 +} + +const ( + PerfBitDisabled uint64 = CBitFieldMaskBit0 + PerfBitInherit = CBitFieldMaskBit1 + PerfBitPinned = CBitFieldMaskBit2 + PerfBitExclusive = CBitFieldMaskBit3 + PerfBitExcludeUser = CBitFieldMaskBit4 + PerfBitExcludeKernel = CBitFieldMaskBit5 + PerfBitExcludeHv = CBitFieldMaskBit6 + PerfBitExcludeIdle = CBitFieldMaskBit7 + PerfBitMmap = CBitFieldMaskBit8 + PerfBitComm = CBitFieldMaskBit9 + PerfBitFreq = CBitFieldMaskBit10 + PerfBitInheritStat = CBitFieldMaskBit11 + PerfBitEnableOnExec = CBitFieldMaskBit12 + PerfBitTask = CBitFieldMaskBit13 + PerfBitWatermark = CBitFieldMaskBit14 + PerfBitPreciseIPBit1 = CBitFieldMaskBit15 + PerfBitPreciseIPBit2 = CBitFieldMaskBit16 + PerfBitMmapData = CBitFieldMaskBit17 + PerfBitSampleIDAll = CBitFieldMaskBit18 + PerfBitExcludeHost = CBitFieldMaskBit19 + PerfBitExcludeGuest = CBitFieldMaskBit20 + PerfBitExcludeCallchainKernel = CBitFieldMaskBit21 + PerfBitExcludeCallchainUser = CBitFieldMaskBit22 + PerfBitMmap2 = CBitFieldMaskBit23 + PerfBitCommExec = CBitFieldMaskBit24 + PerfBitUseClockID = CBitFieldMaskBit25 + PerfBitContextSwitch = CBitFieldMaskBit26 +) + +const ( + PERF_TYPE_HARDWARE = 0x0 + PERF_TYPE_SOFTWARE = 0x1 + PERF_TYPE_TRACEPOINT = 0x2 + PERF_TYPE_HW_CACHE = 0x3 + PERF_TYPE_RAW = 0x4 + PERF_TYPE_BREAKPOINT = 0x5 + + PERF_COUNT_HW_CPU_CYCLES = 0x0 + PERF_COUNT_HW_INSTRUCTIONS = 0x1 + PERF_COUNT_HW_CACHE_REFERENCES = 0x2 + PERF_COUNT_HW_CACHE_MISSES = 0x3 + PERF_COUNT_HW_BRANCH_INSTRUCTIONS = 0x4 + PERF_COUNT_HW_BRANCH_MISSES = 0x5 + PERF_COUNT_HW_BUS_CYCLES = 0x6 + PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 0x7 + PERF_COUNT_HW_STALLED_CYCLES_BACKEND = 0x8 + PERF_COUNT_HW_REF_CPU_CYCLES = 0x9 + + PERF_COUNT_HW_CACHE_L1D = 0x0 + PERF_COUNT_HW_CACHE_L1I = 0x1 + PERF_COUNT_HW_CACHE_LL = 0x2 + PERF_COUNT_HW_CACHE_DTLB = 0x3 + PERF_COUNT_HW_CACHE_ITLB = 0x4 + PERF_COUNT_HW_CACHE_BPU = 0x5 + PERF_COUNT_HW_CACHE_NODE = 0x6 + + PERF_COUNT_HW_CACHE_OP_READ = 0x0 + PERF_COUNT_HW_CACHE_OP_WRITE = 0x1 + PERF_COUNT_HW_CACHE_OP_PREFETCH = 0x2 + + PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0x0 + PERF_COUNT_HW_CACHE_RESULT_MISS = 0x1 + + PERF_COUNT_SW_CPU_CLOCK = 0x0 + PERF_COUNT_SW_TASK_CLOCK = 0x1 + PERF_COUNT_SW_PAGE_FAULTS = 0x2 + PERF_COUNT_SW_CONTEXT_SWITCHES = 0x3 + PERF_COUNT_SW_CPU_MIGRATIONS = 0x4 + PERF_COUNT_SW_PAGE_FAULTS_MIN = 0x5 + PERF_COUNT_SW_PAGE_FAULTS_MAJ = 0x6 + PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7 + PERF_COUNT_SW_EMULATION_FAULTS = 0x8 + PERF_COUNT_SW_DUMMY = 0x9 + + PERF_SAMPLE_IP = 0x1 + PERF_SAMPLE_TID = 0x2 + PERF_SAMPLE_TIME = 0x4 + PERF_SAMPLE_ADDR = 0x8 + PERF_SAMPLE_READ = 0x10 + PERF_SAMPLE_CALLCHAIN = 0x20 + PERF_SAMPLE_ID = 0x40 + PERF_SAMPLE_CPU = 0x80 + PERF_SAMPLE_PERIOD = 0x100 + PERF_SAMPLE_STREAM_ID = 0x200 + PERF_SAMPLE_RAW = 0x400 + PERF_SAMPLE_BRANCH_STACK = 0x800 + + PERF_SAMPLE_BRANCH_USER = 0x1 + PERF_SAMPLE_BRANCH_KERNEL = 0x2 + PERF_SAMPLE_BRANCH_HV = 0x4 + PERF_SAMPLE_BRANCH_ANY = 0x8 + PERF_SAMPLE_BRANCH_ANY_CALL = 0x10 + PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20 + PERF_SAMPLE_BRANCH_IND_CALL = 0x40 + + PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1 + PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2 + PERF_FORMAT_ID = 0x4 + PERF_FORMAT_GROUP = 0x8 + + PERF_RECORD_MMAP = 0x1 + PERF_RECORD_LOST = 0x2 + PERF_RECORD_COMM = 0x3 + PERF_RECORD_EXIT = 0x4 + PERF_RECORD_THROTTLE = 0x5 + PERF_RECORD_UNTHROTTLE = 0x6 + PERF_RECORD_FORK = 0x7 + PERF_RECORD_READ = 0x8 + PERF_RECORD_SAMPLE = 0x9 + + PERF_CONTEXT_HV = -0x20 + PERF_CONTEXT_KERNEL = -0x80 + PERF_CONTEXT_USER = -0x200 + + PERF_CONTEXT_GUEST = -0x800 + PERF_CONTEXT_GUEST_KERNEL = -0x880 + PERF_CONTEXT_GUEST_USER = -0xa00 + + PERF_FLAG_FD_NO_GROUP = 0x1 + PERF_FLAG_FD_OUTPUT = 0x2 + PERF_FLAG_PID_CGROUP = 0x4 +) + +const ( + CBitFieldMaskBit0 = 0x1 + CBitFieldMaskBit1 = 0x2 + CBitFieldMaskBit2 = 0x4 + CBitFieldMaskBit3 = 0x8 + CBitFieldMaskBit4 = 0x10 + CBitFieldMaskBit5 = 0x20 + CBitFieldMaskBit6 = 0x40 + CBitFieldMaskBit7 = 0x80 + CBitFieldMaskBit8 = 0x100 + CBitFieldMaskBit9 = 0x200 + CBitFieldMaskBit10 = 0x400 + CBitFieldMaskBit11 = 0x800 + CBitFieldMaskBit12 = 0x1000 + CBitFieldMaskBit13 = 0x2000 + CBitFieldMaskBit14 = 0x4000 + CBitFieldMaskBit15 = 0x8000 + CBitFieldMaskBit16 = 0x10000 + CBitFieldMaskBit17 = 0x20000 + CBitFieldMaskBit18 = 0x40000 + CBitFieldMaskBit19 = 0x80000 + CBitFieldMaskBit20 = 0x100000 + CBitFieldMaskBit21 = 0x200000 + CBitFieldMaskBit22 = 0x400000 + CBitFieldMaskBit23 = 0x800000 + CBitFieldMaskBit24 = 0x1000000 + CBitFieldMaskBit25 = 0x2000000 + CBitFieldMaskBit26 = 0x4000000 + CBitFieldMaskBit27 = 0x8000000 + CBitFieldMaskBit28 = 0x10000000 + CBitFieldMaskBit29 = 0x20000000 + CBitFieldMaskBit30 = 0x40000000 + CBitFieldMaskBit31 = 0x80000000 + CBitFieldMaskBit32 = 0x100000000 + CBitFieldMaskBit33 = 0x200000000 + CBitFieldMaskBit34 = 0x400000000 + CBitFieldMaskBit35 = 0x800000000 + CBitFieldMaskBit36 = 0x1000000000 + CBitFieldMaskBit37 = 0x2000000000 + CBitFieldMaskBit38 = 0x4000000000 + CBitFieldMaskBit39 = 0x8000000000 + CBitFieldMaskBit40 = 0x10000000000 + CBitFieldMaskBit41 = 0x20000000000 + CBitFieldMaskBit42 = 0x40000000000 + CBitFieldMaskBit43 = 0x80000000000 + CBitFieldMaskBit44 = 0x100000000000 + CBitFieldMaskBit45 = 0x200000000000 + CBitFieldMaskBit46 = 0x400000000000 + CBitFieldMaskBit47 = 0x800000000000 + CBitFieldMaskBit48 = 0x1000000000000 + CBitFieldMaskBit49 = 0x2000000000000 + CBitFieldMaskBit50 = 0x4000000000000 + CBitFieldMaskBit51 = 0x8000000000000 + CBitFieldMaskBit52 = 0x10000000000000 + CBitFieldMaskBit53 = 0x20000000000000 + CBitFieldMaskBit54 = 0x40000000000000 + CBitFieldMaskBit55 = 0x80000000000000 + CBitFieldMaskBit56 = 0x100000000000000 + CBitFieldMaskBit57 = 0x200000000000000 + CBitFieldMaskBit58 = 0x400000000000000 + CBitFieldMaskBit59 = 0x800000000000000 + CBitFieldMaskBit60 = 0x1000000000000000 + CBitFieldMaskBit61 = 0x2000000000000000 + CBitFieldMaskBit62 = 0x4000000000000000 + CBitFieldMaskBit63 = 0x8000000000000000 +) + +type SockaddrStorage struct { + Family uint16 + _ [118]int8 + _ uint64 +} + +type TCPMD5Sig struct { + Addr SockaddrStorage + Flags uint8 + Prefixlen uint8 + Keylen uint16 + _ uint32 + Key [80]uint8 +} + +type HDDriveCmdHdr struct { + Command uint8 + Number uint8 + Feature uint8 + Count uint8 +} + +type HDGeometry struct { + Heads uint8 + Sectors uint8 + Cylinders uint16 + _ [4]byte + Start uint64 +} + +type HDDriveID struct { + Config uint16 + Cyls uint16 + Reserved2 uint16 + Heads uint16 + Track_bytes uint16 + Sector_bytes uint16 + Sectors uint16 + Vendor0 uint16 + Vendor1 uint16 + Vendor2 uint16 + Serial_no [20]uint8 + Buf_type uint16 + Buf_size uint16 + Ecc_bytes uint16 + Fw_rev [8]uint8 + Model [40]uint8 + Max_multsect uint8 + Vendor3 uint8 + Dword_io uint16 + Vendor4 uint8 + Capability uint8 + Reserved50 uint16 + Vendor5 uint8 + TPIO uint8 + Vendor6 uint8 + TDMA uint8 + Field_valid uint16 + Cur_cyls uint16 + Cur_heads uint16 + Cur_sectors uint16 + Cur_capacity0 uint16 + Cur_capacity1 uint16 + Multsect uint8 + Multsect_valid uint8 + Lba_capacity uint32 + Dma_1word uint16 + Dma_mword uint16 + Eide_pio_modes uint16 + Eide_dma_min uint16 + Eide_dma_time uint16 + Eide_pio uint16 + Eide_pio_iordy uint16 + Words69_70 [2]uint16 + Words71_74 [4]uint16 + Queue_depth uint16 + Words76_79 [4]uint16 + Major_rev_num uint16 + Minor_rev_num uint16 + Command_set_1 uint16 + Command_set_2 uint16 + Cfsse uint16 + Cfs_enable_1 uint16 + Cfs_enable_2 uint16 + Csf_default uint16 + Dma_ultra uint16 + Trseuc uint16 + TrsEuc uint16 + CurAPMvalues uint16 + Mprc uint16 + Hw_config uint16 + Acoustic uint16 + Msrqs uint16 + Sxfert uint16 + Sal uint16 + Spg uint32 + Lba_capacity_2 uint64 + Words104_125 [22]uint16 + Last_lun uint16 + Word127 uint16 + Dlf uint16 + Csfo uint16 + Words130_155 [26]uint16 + Word156 uint16 + Words157_159 [3]uint16 + Cfa_power uint16 + Words161_175 [15]uint16 + Words176_205 [30]uint16 + Words206_254 [49]uint16 + Integrity_word uint16 +} + +type Statfs_t struct { + Type int64 + Bsize int64 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Namelen int64 + Frsize int64 + Flags int64 + Spare [4]int64 +} + +const ( + ST_MANDLOCK = 0x40 + ST_NOATIME = 0x400 + ST_NODEV = 0x4 + ST_NODIRATIME = 0x800 + ST_NOEXEC = 0x8 + ST_NOSUID = 0x2 + ST_RDONLY = 0x1 + ST_RELATIME = 0x1000 + ST_SYNCHRONOUS = 0x10 +) + +type TpacketHdr struct { + Status uint64 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Sec uint32 + Usec uint32 + _ [4]byte +} + +type Tpacket2Hdr struct { + Status uint32 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Sec uint32 + Nsec uint32 + Vlan_tci uint16 + Vlan_tpid uint16 + _ [4]uint8 +} + +type Tpacket3Hdr struct { + Next_offset uint32 + Sec uint32 + Nsec uint32 + Snaplen uint32 + Len uint32 + Status uint32 + Mac uint16 + Net uint16 + Hv1 TpacketHdrVariant1 + _ [8]uint8 +} + +type TpacketHdrVariant1 struct { + Rxhash uint32 + Vlan_tci uint32 + Vlan_tpid uint16 + _ uint16 +} + +type TpacketBlockDesc struct { + Version uint32 + To_priv uint32 + Hdr [40]byte +} + +type TpacketReq struct { + Block_size uint32 + Block_nr uint32 + Frame_size uint32 + Frame_nr uint32 +} + +type TpacketReq3 struct { + Block_size uint32 + Block_nr uint32 + Frame_size uint32 + Frame_nr uint32 + Retire_blk_tov uint32 + Sizeof_priv uint32 + Feature_req_word uint32 +} + +type TpacketStats struct { + Packets uint32 + Drops uint32 +} + +type TpacketStatsV3 struct { + Packets uint32 + Drops uint32 + Freeze_q_cnt uint32 +} + +type TpacketAuxdata struct { + Status uint32 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Vlan_tci uint16 + Vlan_tpid uint16 +} + +const ( + TPACKET_V1 = 0x0 + TPACKET_V2 = 0x1 + TPACKET_V3 = 0x2 +) + +const ( + SizeofTpacketHdr = 0x20 + SizeofTpacket2Hdr = 0x20 + SizeofTpacket3Hdr = 0x30 +) + +const ( + NF_INET_PRE_ROUTING = 0x0 + NF_INET_LOCAL_IN = 0x1 + NF_INET_FORWARD = 0x2 + NF_INET_LOCAL_OUT = 0x3 + NF_INET_POST_ROUTING = 0x4 + NF_INET_NUMHOOKS = 0x5 +) + +const ( + NF_NETDEV_INGRESS = 0x0 + NF_NETDEV_NUMHOOKS = 0x1 +) + +const ( + NFPROTO_UNSPEC = 0x0 + NFPROTO_INET = 0x1 + NFPROTO_IPV4 = 0x2 + NFPROTO_ARP = 0x3 + NFPROTO_NETDEV = 0x5 + NFPROTO_BRIDGE = 0x7 + NFPROTO_IPV6 = 0xa + NFPROTO_DECNET = 0xc + NFPROTO_NUMPROTO = 0xd +) + +type Nfgenmsg struct { + Nfgen_family uint8 + Version uint8 + Res_id uint16 +} + +const ( + NFNL_BATCH_UNSPEC = 0x0 + NFNL_BATCH_GENID = 0x1 +) + +const ( + NFT_REG_VERDICT = 0x0 + NFT_REG_1 = 0x1 + NFT_REG_2 = 0x2 + NFT_REG_3 = 0x3 + NFT_REG_4 = 0x4 + NFT_REG32_00 = 0x8 + NFT_REG32_01 = 0x9 + NFT_REG32_02 = 0xa + NFT_REG32_03 = 0xb + NFT_REG32_04 = 0xc + NFT_REG32_05 = 0xd + NFT_REG32_06 = 0xe + NFT_REG32_07 = 0xf + NFT_REG32_08 = 0x10 + NFT_REG32_09 = 0x11 + NFT_REG32_10 = 0x12 + NFT_REG32_11 = 0x13 + NFT_REG32_12 = 0x14 + NFT_REG32_13 = 0x15 + NFT_REG32_14 = 0x16 + NFT_REG32_15 = 0x17 + NFT_CONTINUE = -0x1 + NFT_BREAK = -0x2 + NFT_JUMP = -0x3 + NFT_GOTO = -0x4 + NFT_RETURN = -0x5 + NFT_MSG_NEWTABLE = 0x0 + NFT_MSG_GETTABLE = 0x1 + NFT_MSG_DELTABLE = 0x2 + NFT_MSG_NEWCHAIN = 0x3 + NFT_MSG_GETCHAIN = 0x4 + NFT_MSG_DELCHAIN = 0x5 + NFT_MSG_NEWRULE = 0x6 + NFT_MSG_GETRULE = 0x7 + NFT_MSG_DELRULE = 0x8 + NFT_MSG_NEWSET = 0x9 + NFT_MSG_GETSET = 0xa + NFT_MSG_DELSET = 0xb + NFT_MSG_NEWSETELEM = 0xc + NFT_MSG_GETSETELEM = 0xd + NFT_MSG_DELSETELEM = 0xe + NFT_MSG_NEWGEN = 0xf + NFT_MSG_GETGEN = 0x10 + NFT_MSG_TRACE = 0x11 + NFT_MSG_NEWOBJ = 0x12 + NFT_MSG_GETOBJ = 0x13 + NFT_MSG_DELOBJ = 0x14 + NFT_MSG_GETOBJ_RESET = 0x15 + NFT_MSG_MAX = 0x19 + NFTA_LIST_UNPEC = 0x0 + NFTA_LIST_ELEM = 0x1 + NFTA_HOOK_UNSPEC = 0x0 + NFTA_HOOK_HOOKNUM = 0x1 + NFTA_HOOK_PRIORITY = 0x2 + NFTA_HOOK_DEV = 0x3 + NFT_TABLE_F_DORMANT = 0x1 + NFTA_TABLE_UNSPEC = 0x0 + NFTA_TABLE_NAME = 0x1 + NFTA_TABLE_FLAGS = 0x2 + NFTA_TABLE_USE = 0x3 + NFTA_CHAIN_UNSPEC = 0x0 + NFTA_CHAIN_TABLE = 0x1 + NFTA_CHAIN_HANDLE = 0x2 + NFTA_CHAIN_NAME = 0x3 + NFTA_CHAIN_HOOK = 0x4 + NFTA_CHAIN_POLICY = 0x5 + NFTA_CHAIN_USE = 0x6 + NFTA_CHAIN_TYPE = 0x7 + NFTA_CHAIN_COUNTERS = 0x8 + NFTA_CHAIN_PAD = 0x9 + NFTA_RULE_UNSPEC = 0x0 + NFTA_RULE_TABLE = 0x1 + NFTA_RULE_CHAIN = 0x2 + NFTA_RULE_HANDLE = 0x3 + NFTA_RULE_EXPRESSIONS = 0x4 + NFTA_RULE_COMPAT = 0x5 + NFTA_RULE_POSITION = 0x6 + NFTA_RULE_USERDATA = 0x7 + NFTA_RULE_PAD = 0x8 + NFTA_RULE_ID = 0x9 + NFT_RULE_COMPAT_F_INV = 0x2 + NFT_RULE_COMPAT_F_MASK = 0x2 + NFTA_RULE_COMPAT_UNSPEC = 0x0 + NFTA_RULE_COMPAT_PROTO = 0x1 + NFTA_RULE_COMPAT_FLAGS = 0x2 + NFT_SET_ANONYMOUS = 0x1 + NFT_SET_CONSTANT = 0x2 + NFT_SET_INTERVAL = 0x4 + NFT_SET_MAP = 0x8 + NFT_SET_TIMEOUT = 0x10 + NFT_SET_EVAL = 0x20 + NFT_SET_OBJECT = 0x40 + NFT_SET_POL_PERFORMANCE = 0x0 + NFT_SET_POL_MEMORY = 0x1 + NFTA_SET_DESC_UNSPEC = 0x0 + NFTA_SET_DESC_SIZE = 0x1 + NFTA_SET_UNSPEC = 0x0 + NFTA_SET_TABLE = 0x1 + NFTA_SET_NAME = 0x2 + NFTA_SET_FLAGS = 0x3 + NFTA_SET_KEY_TYPE = 0x4 + NFTA_SET_KEY_LEN = 0x5 + NFTA_SET_DATA_TYPE = 0x6 + NFTA_SET_DATA_LEN = 0x7 + NFTA_SET_POLICY = 0x8 + NFTA_SET_DESC = 0x9 + NFTA_SET_ID = 0xa + NFTA_SET_TIMEOUT = 0xb + NFTA_SET_GC_INTERVAL = 0xc + NFTA_SET_USERDATA = 0xd + NFTA_SET_PAD = 0xe + NFTA_SET_OBJ_TYPE = 0xf + NFT_SET_ELEM_INTERVAL_END = 0x1 + NFTA_SET_ELEM_UNSPEC = 0x0 + NFTA_SET_ELEM_KEY = 0x1 + NFTA_SET_ELEM_DATA = 0x2 + NFTA_SET_ELEM_FLAGS = 0x3 + NFTA_SET_ELEM_TIMEOUT = 0x4 + NFTA_SET_ELEM_EXPIRATION = 0x5 + NFTA_SET_ELEM_USERDATA = 0x6 + NFTA_SET_ELEM_EXPR = 0x7 + NFTA_SET_ELEM_PAD = 0x8 + NFTA_SET_ELEM_OBJREF = 0x9 + NFTA_SET_ELEM_LIST_UNSPEC = 0x0 + NFTA_SET_ELEM_LIST_TABLE = 0x1 + NFTA_SET_ELEM_LIST_SET = 0x2 + NFTA_SET_ELEM_LIST_ELEMENTS = 0x3 + NFTA_SET_ELEM_LIST_SET_ID = 0x4 + NFT_DATA_VALUE = 0x0 + NFT_DATA_VERDICT = 0xffffff00 + NFTA_DATA_UNSPEC = 0x0 + NFTA_DATA_VALUE = 0x1 + NFTA_DATA_VERDICT = 0x2 + NFTA_VERDICT_UNSPEC = 0x0 + NFTA_VERDICT_CODE = 0x1 + NFTA_VERDICT_CHAIN = 0x2 + NFTA_EXPR_UNSPEC = 0x0 + NFTA_EXPR_NAME = 0x1 + NFTA_EXPR_DATA = 0x2 + NFTA_IMMEDIATE_UNSPEC = 0x0 + NFTA_IMMEDIATE_DREG = 0x1 + NFTA_IMMEDIATE_DATA = 0x2 + NFTA_BITWISE_UNSPEC = 0x0 + NFTA_BITWISE_SREG = 0x1 + NFTA_BITWISE_DREG = 0x2 + NFTA_BITWISE_LEN = 0x3 + NFTA_BITWISE_MASK = 0x4 + NFTA_BITWISE_XOR = 0x5 + NFT_BYTEORDER_NTOH = 0x0 + NFT_BYTEORDER_HTON = 0x1 + NFTA_BYTEORDER_UNSPEC = 0x0 + NFTA_BYTEORDER_SREG = 0x1 + NFTA_BYTEORDER_DREG = 0x2 + NFTA_BYTEORDER_OP = 0x3 + NFTA_BYTEORDER_LEN = 0x4 + NFTA_BYTEORDER_SIZE = 0x5 + NFT_CMP_EQ = 0x0 + NFT_CMP_NEQ = 0x1 + NFT_CMP_LT = 0x2 + NFT_CMP_LTE = 0x3 + NFT_CMP_GT = 0x4 + NFT_CMP_GTE = 0x5 + NFTA_CMP_UNSPEC = 0x0 + NFTA_CMP_SREG = 0x1 + NFTA_CMP_OP = 0x2 + NFTA_CMP_DATA = 0x3 + NFT_RANGE_EQ = 0x0 + NFT_RANGE_NEQ = 0x1 + NFTA_RANGE_UNSPEC = 0x0 + NFTA_RANGE_SREG = 0x1 + NFTA_RANGE_OP = 0x2 + NFTA_RANGE_FROM_DATA = 0x3 + NFTA_RANGE_TO_DATA = 0x4 + NFT_LOOKUP_F_INV = 0x1 + NFTA_LOOKUP_UNSPEC = 0x0 + NFTA_LOOKUP_SET = 0x1 + NFTA_LOOKUP_SREG = 0x2 + NFTA_LOOKUP_DREG = 0x3 + NFTA_LOOKUP_SET_ID = 0x4 + NFTA_LOOKUP_FLAGS = 0x5 + NFT_DYNSET_OP_ADD = 0x0 + NFT_DYNSET_OP_UPDATE = 0x1 + NFT_DYNSET_F_INV = 0x1 + NFTA_DYNSET_UNSPEC = 0x0 + NFTA_DYNSET_SET_NAME = 0x1 + NFTA_DYNSET_SET_ID = 0x2 + NFTA_DYNSET_OP = 0x3 + NFTA_DYNSET_SREG_KEY = 0x4 + NFTA_DYNSET_SREG_DATA = 0x5 + NFTA_DYNSET_TIMEOUT = 0x6 + NFTA_DYNSET_EXPR = 0x7 + NFTA_DYNSET_PAD = 0x8 + NFTA_DYNSET_FLAGS = 0x9 + NFT_PAYLOAD_LL_HEADER = 0x0 + NFT_PAYLOAD_NETWORK_HEADER = 0x1 + NFT_PAYLOAD_TRANSPORT_HEADER = 0x2 + NFT_PAYLOAD_CSUM_NONE = 0x0 + NFT_PAYLOAD_CSUM_INET = 0x1 + NFT_PAYLOAD_L4CSUM_PSEUDOHDR = 0x1 + NFTA_PAYLOAD_UNSPEC = 0x0 + NFTA_PAYLOAD_DREG = 0x1 + NFTA_PAYLOAD_BASE = 0x2 + NFTA_PAYLOAD_OFFSET = 0x3 + NFTA_PAYLOAD_LEN = 0x4 + NFTA_PAYLOAD_SREG = 0x5 + NFTA_PAYLOAD_CSUM_TYPE = 0x6 + NFTA_PAYLOAD_CSUM_OFFSET = 0x7 + NFTA_PAYLOAD_CSUM_FLAGS = 0x8 + NFT_EXTHDR_F_PRESENT = 0x1 + NFT_EXTHDR_OP_IPV6 = 0x0 + NFT_EXTHDR_OP_TCPOPT = 0x1 + NFTA_EXTHDR_UNSPEC = 0x0 + NFTA_EXTHDR_DREG = 0x1 + NFTA_EXTHDR_TYPE = 0x2 + NFTA_EXTHDR_OFFSET = 0x3 + NFTA_EXTHDR_LEN = 0x4 + NFTA_EXTHDR_FLAGS = 0x5 + NFTA_EXTHDR_OP = 0x6 + NFTA_EXTHDR_SREG = 0x7 + NFT_META_LEN = 0x0 + NFT_META_PROTOCOL = 0x1 + NFT_META_PRIORITY = 0x2 + NFT_META_MARK = 0x3 + NFT_META_IIF = 0x4 + NFT_META_OIF = 0x5 + NFT_META_IIFNAME = 0x6 + NFT_META_OIFNAME = 0x7 + NFT_META_IIFTYPE = 0x8 + NFT_META_OIFTYPE = 0x9 + NFT_META_SKUID = 0xa + NFT_META_SKGID = 0xb + NFT_META_NFTRACE = 0xc + NFT_META_RTCLASSID = 0xd + NFT_META_SECMARK = 0xe + NFT_META_NFPROTO = 0xf + NFT_META_L4PROTO = 0x10 + NFT_META_BRI_IIFNAME = 0x11 + NFT_META_BRI_OIFNAME = 0x12 + NFT_META_PKTTYPE = 0x13 + NFT_META_CPU = 0x14 + NFT_META_IIFGROUP = 0x15 + NFT_META_OIFGROUP = 0x16 + NFT_META_CGROUP = 0x17 + NFT_META_PRANDOM = 0x18 + NFT_RT_CLASSID = 0x0 + NFT_RT_NEXTHOP4 = 0x1 + NFT_RT_NEXTHOP6 = 0x2 + NFT_RT_TCPMSS = 0x3 + NFT_HASH_JENKINS = 0x0 + NFT_HASH_SYM = 0x1 + NFTA_HASH_UNSPEC = 0x0 + NFTA_HASH_SREG = 0x1 + NFTA_HASH_DREG = 0x2 + NFTA_HASH_LEN = 0x3 + NFTA_HASH_MODULUS = 0x4 + NFTA_HASH_SEED = 0x5 + NFTA_HASH_OFFSET = 0x6 + NFTA_HASH_TYPE = 0x7 + NFTA_META_UNSPEC = 0x0 + NFTA_META_DREG = 0x1 + NFTA_META_KEY = 0x2 + NFTA_META_SREG = 0x3 + NFTA_RT_UNSPEC = 0x0 + NFTA_RT_DREG = 0x1 + NFTA_RT_KEY = 0x2 + NFT_CT_STATE = 0x0 + NFT_CT_DIRECTION = 0x1 + NFT_CT_STATUS = 0x2 + NFT_CT_MARK = 0x3 + NFT_CT_SECMARK = 0x4 + NFT_CT_EXPIRATION = 0x5 + NFT_CT_HELPER = 0x6 + NFT_CT_L3PROTOCOL = 0x7 + NFT_CT_SRC = 0x8 + NFT_CT_DST = 0x9 + NFT_CT_PROTOCOL = 0xa + NFT_CT_PROTO_SRC = 0xb + NFT_CT_PROTO_DST = 0xc + NFT_CT_LABELS = 0xd + NFT_CT_PKTS = 0xe + NFT_CT_BYTES = 0xf + NFT_CT_AVGPKT = 0x10 + NFT_CT_ZONE = 0x11 + NFT_CT_EVENTMASK = 0x12 + NFTA_CT_UNSPEC = 0x0 + NFTA_CT_DREG = 0x1 + NFTA_CT_KEY = 0x2 + NFTA_CT_DIRECTION = 0x3 + NFTA_CT_SREG = 0x4 + NFT_LIMIT_PKTS = 0x0 + NFT_LIMIT_PKT_BYTES = 0x1 + NFT_LIMIT_F_INV = 0x1 + NFTA_LIMIT_UNSPEC = 0x0 + NFTA_LIMIT_RATE = 0x1 + NFTA_LIMIT_UNIT = 0x2 + NFTA_LIMIT_BURST = 0x3 + NFTA_LIMIT_TYPE = 0x4 + NFTA_LIMIT_FLAGS = 0x5 + NFTA_LIMIT_PAD = 0x6 + NFTA_COUNTER_UNSPEC = 0x0 + NFTA_COUNTER_BYTES = 0x1 + NFTA_COUNTER_PACKETS = 0x2 + NFTA_COUNTER_PAD = 0x3 + NFTA_LOG_UNSPEC = 0x0 + NFTA_LOG_GROUP = 0x1 + NFTA_LOG_PREFIX = 0x2 + NFTA_LOG_SNAPLEN = 0x3 + NFTA_LOG_QTHRESHOLD = 0x4 + NFTA_LOG_LEVEL = 0x5 + NFTA_LOG_FLAGS = 0x6 + NFTA_QUEUE_UNSPEC = 0x0 + NFTA_QUEUE_NUM = 0x1 + NFTA_QUEUE_TOTAL = 0x2 + NFTA_QUEUE_FLAGS = 0x3 + NFTA_QUEUE_SREG_QNUM = 0x4 + NFT_QUOTA_F_INV = 0x1 + NFT_QUOTA_F_DEPLETED = 0x2 + NFTA_QUOTA_UNSPEC = 0x0 + NFTA_QUOTA_BYTES = 0x1 + NFTA_QUOTA_FLAGS = 0x2 + NFTA_QUOTA_PAD = 0x3 + NFTA_QUOTA_CONSUMED = 0x4 + NFT_REJECT_ICMP_UNREACH = 0x0 + NFT_REJECT_TCP_RST = 0x1 + NFT_REJECT_ICMPX_UNREACH = 0x2 + NFT_REJECT_ICMPX_NO_ROUTE = 0x0 + NFT_REJECT_ICMPX_PORT_UNREACH = 0x1 + NFT_REJECT_ICMPX_HOST_UNREACH = 0x2 + NFT_REJECT_ICMPX_ADMIN_PROHIBITED = 0x3 + NFTA_REJECT_UNSPEC = 0x0 + NFTA_REJECT_TYPE = 0x1 + NFTA_REJECT_ICMP_CODE = 0x2 + NFT_NAT_SNAT = 0x0 + NFT_NAT_DNAT = 0x1 + NFTA_NAT_UNSPEC = 0x0 + NFTA_NAT_TYPE = 0x1 + NFTA_NAT_FAMILY = 0x2 + NFTA_NAT_REG_ADDR_MIN = 0x3 + NFTA_NAT_REG_ADDR_MAX = 0x4 + NFTA_NAT_REG_PROTO_MIN = 0x5 + NFTA_NAT_REG_PROTO_MAX = 0x6 + NFTA_NAT_FLAGS = 0x7 + NFTA_MASQ_UNSPEC = 0x0 + NFTA_MASQ_FLAGS = 0x1 + NFTA_MASQ_REG_PROTO_MIN = 0x2 + NFTA_MASQ_REG_PROTO_MAX = 0x3 + NFTA_REDIR_UNSPEC = 0x0 + NFTA_REDIR_REG_PROTO_MIN = 0x1 + NFTA_REDIR_REG_PROTO_MAX = 0x2 + NFTA_REDIR_FLAGS = 0x3 + NFTA_DUP_UNSPEC = 0x0 + NFTA_DUP_SREG_ADDR = 0x1 + NFTA_DUP_SREG_DEV = 0x2 + NFTA_FWD_UNSPEC = 0x0 + NFTA_FWD_SREG_DEV = 0x1 + NFTA_OBJREF_UNSPEC = 0x0 + NFTA_OBJREF_IMM_TYPE = 0x1 + NFTA_OBJREF_IMM_NAME = 0x2 + NFTA_OBJREF_SET_SREG = 0x3 + NFTA_OBJREF_SET_NAME = 0x4 + NFTA_OBJREF_SET_ID = 0x5 + NFTA_GEN_UNSPEC = 0x0 + NFTA_GEN_ID = 0x1 + NFTA_GEN_PROC_PID = 0x2 + NFTA_GEN_PROC_NAME = 0x3 + NFTA_FIB_UNSPEC = 0x0 + NFTA_FIB_DREG = 0x1 + NFTA_FIB_RESULT = 0x2 + NFTA_FIB_FLAGS = 0x3 + NFT_FIB_RESULT_UNSPEC = 0x0 + NFT_FIB_RESULT_OIF = 0x1 + NFT_FIB_RESULT_OIFNAME = 0x2 + NFT_FIB_RESULT_ADDRTYPE = 0x3 + NFTA_FIB_F_SADDR = 0x1 + NFTA_FIB_F_DADDR = 0x2 + NFTA_FIB_F_MARK = 0x4 + NFTA_FIB_F_IIF = 0x8 + NFTA_FIB_F_OIF = 0x10 + NFTA_FIB_F_PRESENT = 0x20 + NFTA_CT_HELPER_UNSPEC = 0x0 + NFTA_CT_HELPER_NAME = 0x1 + NFTA_CT_HELPER_L3PROTO = 0x2 + NFTA_CT_HELPER_L4PROTO = 0x3 + NFTA_OBJ_UNSPEC = 0x0 + NFTA_OBJ_TABLE = 0x1 + NFTA_OBJ_NAME = 0x2 + NFTA_OBJ_TYPE = 0x3 + NFTA_OBJ_DATA = 0x4 + NFTA_OBJ_USE = 0x5 + NFTA_TRACE_UNSPEC = 0x0 + NFTA_TRACE_TABLE = 0x1 + NFTA_TRACE_CHAIN = 0x2 + NFTA_TRACE_RULE_HANDLE = 0x3 + NFTA_TRACE_TYPE = 0x4 + NFTA_TRACE_VERDICT = 0x5 + NFTA_TRACE_ID = 0x6 + NFTA_TRACE_LL_HEADER = 0x7 + NFTA_TRACE_NETWORK_HEADER = 0x8 + NFTA_TRACE_TRANSPORT_HEADER = 0x9 + NFTA_TRACE_IIF = 0xa + NFTA_TRACE_IIFTYPE = 0xb + NFTA_TRACE_OIF = 0xc + NFTA_TRACE_OIFTYPE = 0xd + NFTA_TRACE_MARK = 0xe + NFTA_TRACE_NFPROTO = 0xf + NFTA_TRACE_POLICY = 0x10 + NFTA_TRACE_PAD = 0x11 + NFT_TRACETYPE_UNSPEC = 0x0 + NFT_TRACETYPE_POLICY = 0x1 + NFT_TRACETYPE_RETURN = 0x2 + NFT_TRACETYPE_RULE = 0x3 + NFTA_NG_UNSPEC = 0x0 + NFTA_NG_DREG = 0x1 + NFTA_NG_MODULUS = 0x2 + NFTA_NG_TYPE = 0x3 + NFTA_NG_OFFSET = 0x4 + NFT_NG_INCREMENTAL = 0x0 + NFT_NG_RANDOM = 0x1 +) + +type RTCTime struct { + Sec int32 + Min int32 + Hour int32 + Mday int32 + Mon int32 + Year int32 + Wday int32 + Yday int32 + Isdst int32 +} + +type RTCWkAlrm struct { + Enabled uint8 + Pending uint8 + _ [2]byte + Time RTCTime +} + +type RTCPLLInfo struct { + Ctrl int32 + Value int32 + Max int32 + Min int32 + Posmult int32 + Negmult int32 + Clock int64 +} + +type BlkpgIoctlArg struct { + Op int32 + Flags int32 + Datalen int32 + _ [4]byte + Data *byte +} + +type BlkpgPartition struct { + Start int64 + Length int64 + Pno int32 + Devname [64]uint8 + Volname [64]uint8 + _ [4]byte +} + +const ( + BLKPG = 0x1269 + BLKPG_ADD_PARTITION = 0x1 + BLKPG_DEL_PARTITION = 0x2 + BLKPG_RESIZE_PARTITION = 0x3 +) + +const ( + NETNSA_NONE = 0x0 + NETNSA_NSID = 0x1 + NETNSA_PID = 0x2 + NETNSA_FD = 0x3 +) + +type XDPRingOffset struct { + Producer uint64 + Consumer uint64 + Desc uint64 +} + +type XDPMmapOffsets struct { + Rx XDPRingOffset + Tx XDPRingOffset + Fr XDPRingOffset + Cr XDPRingOffset +} + +type XDPUmemReg struct { + Addr uint64 + Len uint64 + Size uint32 + Headroom uint32 +} + +type XDPStatistics struct { + Rx_dropped uint64 + Rx_invalid_descs uint64 + Tx_invalid_descs uint64 +} + +type XDPDesc struct { + Addr uint64 + Len uint32 + Options uint32 +} + +const ( + NCSI_CMD_UNSPEC = 0x0 + NCSI_CMD_PKG_INFO = 0x1 + NCSI_CMD_SET_INTERFACE = 0x2 + NCSI_CMD_CLEAR_INTERFACE = 0x3 + NCSI_ATTR_UNSPEC = 0x0 + NCSI_ATTR_IFINDEX = 0x1 + NCSI_ATTR_PACKAGE_LIST = 0x2 + NCSI_ATTR_PACKAGE_ID = 0x3 + NCSI_ATTR_CHANNEL_ID = 0x4 + NCSI_PKG_ATTR_UNSPEC = 0x0 + NCSI_PKG_ATTR = 0x1 + NCSI_PKG_ATTR_ID = 0x2 + NCSI_PKG_ATTR_FORCED = 0x3 + NCSI_PKG_ATTR_CHANNEL_LIST = 0x4 + NCSI_CHANNEL_ATTR_UNSPEC = 0x0 + NCSI_CHANNEL_ATTR = 0x1 + NCSI_CHANNEL_ATTR_ID = 0x2 + NCSI_CHANNEL_ATTR_VERSION_MAJOR = 0x3 + NCSI_CHANNEL_ATTR_VERSION_MINOR = 0x4 + NCSI_CHANNEL_ATTR_VERSION_STR = 0x5 + NCSI_CHANNEL_ATTR_LINK_STATE = 0x6 + NCSI_CHANNEL_ATTR_ACTIVE = 0x7 + NCSI_CHANNEL_ATTR_FORCED = 0x8 + NCSI_CHANNEL_ATTR_VLAN_LIST = 0x9 + NCSI_CHANNEL_ATTR_VLAN_ID = 0xa +) + +const ( + SOF_TIMESTAMPING_TX_HARDWARE = 0x1 + SOF_TIMESTAMPING_TX_SOFTWARE = 0x2 + SOF_TIMESTAMPING_RX_HARDWARE = 0x4 + SOF_TIMESTAMPING_RX_SOFTWARE = 0x8 + SOF_TIMESTAMPING_SOFTWARE = 0x10 + SOF_TIMESTAMPING_SYS_HARDWARE = 0x20 + SOF_TIMESTAMPING_RAW_HARDWARE = 0x40 + SOF_TIMESTAMPING_OPT_ID = 0x80 + SOF_TIMESTAMPING_TX_SCHED = 0x100 + SOF_TIMESTAMPING_TX_ACK = 0x200 + SOF_TIMESTAMPING_OPT_CMSG = 0x400 + SOF_TIMESTAMPING_OPT_TSONLY = 0x800 + SOF_TIMESTAMPING_OPT_STATS = 0x1000 + SOF_TIMESTAMPING_OPT_PKTINFO = 0x2000 + SOF_TIMESTAMPING_OPT_TX_SWHW = 0x4000 + + SOF_TIMESTAMPING_LAST = 0x4000 + SOF_TIMESTAMPING_MASK = 0x7fff +) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go new file mode 100644 index 00000000..23c8438b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go @@ -0,0 +1,1978 @@ +// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm,linux + +package unix + +const ( + SizeofPtr = 0x4 + SizeofShort = 0x2 + SizeofInt = 0x4 + SizeofLong = 0x4 + SizeofLongLong = 0x8 + PathMax = 0x1000 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int32 + Nsec int32 +} + +type Timeval struct { + Sec int32 + Usec int32 +} + +type Timex struct { + Modes uint32 + Offset int32 + Freq int32 + Maxerror int32 + Esterror int32 + Status int32 + Constant int32 + Precision int32 + Tolerance int32 + Time Timeval + Tick int32 + Ppsfreq int32 + Jitter int32 + Shift int32 + Stabil int32 + Jitcnt int32 + Calcnt int32 + Errcnt int32 + Stbcnt int32 + Tai int32 + _ [44]byte +} + +type Time_t int32 + +type Tms struct { + Utime int32 + Stime int32 + Cutime int32 + Cstime int32 +} + +type Utimbuf struct { + Actime int32 + Modtime int32 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint64 + _ uint16 + _ [2]byte + _ uint32 + Mode uint32 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev uint64 + _ uint16 + _ [6]byte + Size int64 + Blksize int32 + _ [4]byte + Blocks int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + Ino uint64 +} + +type StatxTimestamp struct { + Sec int64 + Nsec uint32 + _ int32 +} + +type Statx_t struct { + Mask uint32 + Blksize uint32 + Attributes uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Mode uint16 + _ [1]uint16 + Ino uint64 + Size uint64 + Blocks uint64 + Attributes_mask uint64 + Atime StatxTimestamp + Btime StatxTimestamp + Ctime StatxTimestamp + Mtime StatxTimestamp + Rdev_major uint32 + Rdev_minor uint32 + Dev_major uint32 + Dev_minor uint32 + _ [14]uint64 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]uint8 + _ [5]byte +} + +type Fsid struct { + Val [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + _ [4]byte + Start int64 + Len int64 + Pid int32 + _ [4]byte +} + +type FscryptPolicy struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptKey struct { + Mode uint32 + Raw [64]uint8 + Size uint32 +} + +type KeyctlDHParams struct { + Private int32 + Prime int32 + Base int32 +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddrL2 struct { + Family uint16 + Psm uint16 + Bdaddr [6]uint8 + Cid uint16 + Bdaddr_type uint8 + _ [1]byte +} + +type RawSockaddrRFCOMM struct { + Family uint16 + Bdaddr [6]uint8 + Channel uint8 + _ [1]byte +} + +type RawSockaddrCAN struct { + Family uint16 + _ [2]byte + Ifindex int32 + Addr [8]byte +} + +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + +type RawSockaddrXDP struct { + Family uint16 + Flags uint16 + Ifindex uint32 + Queue_id uint32 + Shared_umem_fd uint32 +} + +type RawSockaddr struct { + Family uint16 + Data [14]uint8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]uint8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type PacketMreq struct { + Ifindex int32 + Type uint16 + Alen uint16 + Address [8]uint8 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen uint32 + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + _ [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofSockaddrL2 = 0xe + SizeofSockaddrRFCOMM = 0xa + SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 + SizeofSockaddrXDP = 0x10 + SizeofLinger = 0x8 + SizeofIovec = 0x8 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofPacketMreq = 0x10 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_INFO_KIND = 0x1 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_NUM_VF = 0x15 + IFLA_VFINFO_LIST = 0x16 + IFLA_STATS64 = 0x17 + IFLA_VF_PORTS = 0x18 + IFLA_PORT_SELF = 0x19 + IFLA_AF_SPEC = 0x1a + IFLA_GROUP = 0x1b + IFLA_NET_NS_FD = 0x1c + IFLA_EXT_MASK = 0x1d + IFLA_PROMISCUITY = 0x1e + IFLA_NUM_TX_QUEUES = 0x1f + IFLA_NUM_RX_QUEUES = 0x20 + IFLA_CARRIER = 0x21 + IFLA_PHYS_PORT_ID = 0x22 + IFLA_CARRIER_CHANGES = 0x23 + IFLA_PHYS_SWITCH_ID = 0x24 + IFLA_LINK_NETNSID = 0x25 + IFLA_PHYS_PORT_NAME = 0x26 + IFLA_PROTO_DOWN = 0x27 + IFLA_GSO_MAX_SEGS = 0x28 + IFLA_GSO_MAX_SIZE = 0x29 + IFLA_PAD = 0x2a + IFLA_XDP = 0x2b + IFLA_EVENT = 0x2c + IFLA_NEW_NETNSID = 0x2d + IFLA_IF_NETNSID = 0x2e + IFLA_MAX = 0x33 + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTA_MARK = 0x10 + RTA_MFC_STATS = 0x11 + RTA_VIA = 0x12 + RTA_NEWDST = 0x13 + RTA_PREF = 0x14 + RTA_ENCAP_TYPE = 0x15 + RTA_ENCAP = 0x16 + RTA_EXPIRES = 0x17 + RTA_PAD = 0x18 + RTA_UID = 0x19 + RTA_TTL_PROPAGATE = 0x1a + RTA_IP_PROTO = 0x1b + RTA_SPORT = 0x1c + RTA_DPORT = 0x1d + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + _ uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x8 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + _ [2]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + Uregs [18]uint32 +} + +type FdSet struct { + Bits [32]int32 +} + +type Sysinfo_t struct { + Uptime int32 + Loads [3]uint32 + Totalram uint32 + Freeram uint32 + Sharedram uint32 + Bufferram uint32 + Totalswap uint32 + Freeswap uint32 + Procs uint16 + Pad uint16 + Totalhigh uint32 + Freehigh uint32 + Unit uint32 + _ [8]uint8 +} + +type Utsname struct { + Sysname [65]byte + Nodename [65]byte + Release [65]byte + Version [65]byte + Machine [65]byte + Domainname [65]byte +} + +type Ustat_t struct { + Tfree int32 + Tinode uint32 + Fname [6]uint8 + Fpack [6]uint8 +} + +type EpollEvent struct { + Events uint32 + PadFd int32 + Fd int32 + Pad int32 +} + +const ( + AT_EMPTY_PATH = 0x1000 + AT_FDCWD = -0x64 + AT_NO_AUTOMOUNT = 0x800 + AT_REMOVEDIR = 0x200 + + AT_STATX_SYNC_AS_STAT = 0x0 + AT_STATX_FORCE_SYNC = 0x2000 + AT_STATX_DONT_SYNC = 0x4000 + + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 + + AT_EACCESS = 0x200 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x2000 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Sigset_t struct { + Val [32]uint32 +} + +const RNDGETENTCNT = 0x80045200 + +const PERF_IOC_FLAG_GROUP = 0x1 + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Line uint8 + Cc [19]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Taskstats struct { + Version uint16 + _ [2]byte + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + _ [6]byte + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]uint8 + Ac_sched uint8 + Ac_pad [3]uint8 + _ [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + _ [4]byte + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 +} + +const ( + TASKSTATS_CMD_UNSPEC = 0x0 + TASKSTATS_CMD_GET = 0x1 + TASKSTATS_CMD_NEW = 0x2 + TASKSTATS_TYPE_UNSPEC = 0x0 + TASKSTATS_TYPE_PID = 0x1 + TASKSTATS_TYPE_TGID = 0x2 + TASKSTATS_TYPE_STATS = 0x3 + TASKSTATS_TYPE_AGGR_PID = 0x4 + TASKSTATS_TYPE_AGGR_TGID = 0x5 + TASKSTATS_TYPE_NULL = 0x6 + TASKSTATS_CMD_ATTR_UNSPEC = 0x0 + TASKSTATS_CMD_ATTR_PID = 0x1 + TASKSTATS_CMD_ATTR_TGID = 0x2 + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 +) + +type CGroupStats struct { + Sleeping uint64 + Running uint64 + Stopped uint64 + Uninterruptible uint64 + Io_wait uint64 +} + +const ( + CGROUPSTATS_CMD_UNSPEC = 0x3 + CGROUPSTATS_CMD_GET = 0x4 + CGROUPSTATS_CMD_NEW = 0x5 + CGROUPSTATS_TYPE_UNSPEC = 0x0 + CGROUPSTATS_TYPE_CGROUP_STATS = 0x1 + CGROUPSTATS_CMD_ATTR_UNSPEC = 0x0 + CGROUPSTATS_CMD_ATTR_FD = 0x1 +) + +type Genlmsghdr struct { + Cmd uint8 + Version uint8 + Reserved uint16 +} + +const ( + CTRL_CMD_UNSPEC = 0x0 + CTRL_CMD_NEWFAMILY = 0x1 + CTRL_CMD_DELFAMILY = 0x2 + CTRL_CMD_GETFAMILY = 0x3 + CTRL_CMD_NEWOPS = 0x4 + CTRL_CMD_DELOPS = 0x5 + CTRL_CMD_GETOPS = 0x6 + CTRL_CMD_NEWMCAST_GRP = 0x7 + CTRL_CMD_DELMCAST_GRP = 0x8 + CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_ATTR_UNSPEC = 0x0 + CTRL_ATTR_FAMILY_ID = 0x1 + CTRL_ATTR_FAMILY_NAME = 0x2 + CTRL_ATTR_VERSION = 0x3 + CTRL_ATTR_HDRSIZE = 0x4 + CTRL_ATTR_MAXATTR = 0x5 + CTRL_ATTR_OPS = 0x6 + CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_OP_UNSPEC = 0x0 + CTRL_ATTR_OP_ID = 0x1 + CTRL_ATTR_OP_FLAGS = 0x2 + CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 + CTRL_ATTR_MCAST_GRP_NAME = 0x1 + CTRL_ATTR_MCAST_GRP_ID = 0x2 +) + +type cpuMask uint32 + +const ( + _CPU_SETSIZE = 0x400 + _NCPUBITS = 0x20 +) + +const ( + BDADDR_BREDR = 0x0 + BDADDR_LE_PUBLIC = 0x1 + BDADDR_LE_RANDOM = 0x2 +) + +type PerfEventAttr struct { + Type uint32 + Size uint32 + Config uint64 + Sample uint64 + Sample_type uint64 + Read_format uint64 + Bits uint64 + Wakeup uint32 + Bp_type uint32 + Ext1 uint64 + Ext2 uint64 + Branch_sample_type uint64 + Sample_regs_user uint64 + Sample_stack_user uint32 + Clockid int32 + Sample_regs_intr uint64 + Aux_watermark uint32 + _ uint32 +} + +type PerfEventMmapPage struct { + Version uint32 + Compat_version uint32 + Lock uint32 + Index uint32 + Offset int64 + Time_enabled uint64 + Time_running uint64 + Capabilities uint64 + Pmc_width uint16 + Time_shift uint16 + Time_mult uint32 + Time_offset uint64 + Time_zero uint64 + Size uint32 + _ [948]uint8 + Data_head uint64 + Data_tail uint64 + Data_offset uint64 + Data_size uint64 + Aux_head uint64 + Aux_tail uint64 + Aux_offset uint64 + Aux_size uint64 +} + +const ( + PerfBitDisabled uint64 = CBitFieldMaskBit0 + PerfBitInherit = CBitFieldMaskBit1 + PerfBitPinned = CBitFieldMaskBit2 + PerfBitExclusive = CBitFieldMaskBit3 + PerfBitExcludeUser = CBitFieldMaskBit4 + PerfBitExcludeKernel = CBitFieldMaskBit5 + PerfBitExcludeHv = CBitFieldMaskBit6 + PerfBitExcludeIdle = CBitFieldMaskBit7 + PerfBitMmap = CBitFieldMaskBit8 + PerfBitComm = CBitFieldMaskBit9 + PerfBitFreq = CBitFieldMaskBit10 + PerfBitInheritStat = CBitFieldMaskBit11 + PerfBitEnableOnExec = CBitFieldMaskBit12 + PerfBitTask = CBitFieldMaskBit13 + PerfBitWatermark = CBitFieldMaskBit14 + PerfBitPreciseIPBit1 = CBitFieldMaskBit15 + PerfBitPreciseIPBit2 = CBitFieldMaskBit16 + PerfBitMmapData = CBitFieldMaskBit17 + PerfBitSampleIDAll = CBitFieldMaskBit18 + PerfBitExcludeHost = CBitFieldMaskBit19 + PerfBitExcludeGuest = CBitFieldMaskBit20 + PerfBitExcludeCallchainKernel = CBitFieldMaskBit21 + PerfBitExcludeCallchainUser = CBitFieldMaskBit22 + PerfBitMmap2 = CBitFieldMaskBit23 + PerfBitCommExec = CBitFieldMaskBit24 + PerfBitUseClockID = CBitFieldMaskBit25 + PerfBitContextSwitch = CBitFieldMaskBit26 +) + +const ( + PERF_TYPE_HARDWARE = 0x0 + PERF_TYPE_SOFTWARE = 0x1 + PERF_TYPE_TRACEPOINT = 0x2 + PERF_TYPE_HW_CACHE = 0x3 + PERF_TYPE_RAW = 0x4 + PERF_TYPE_BREAKPOINT = 0x5 + + PERF_COUNT_HW_CPU_CYCLES = 0x0 + PERF_COUNT_HW_INSTRUCTIONS = 0x1 + PERF_COUNT_HW_CACHE_REFERENCES = 0x2 + PERF_COUNT_HW_CACHE_MISSES = 0x3 + PERF_COUNT_HW_BRANCH_INSTRUCTIONS = 0x4 + PERF_COUNT_HW_BRANCH_MISSES = 0x5 + PERF_COUNT_HW_BUS_CYCLES = 0x6 + PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 0x7 + PERF_COUNT_HW_STALLED_CYCLES_BACKEND = 0x8 + PERF_COUNT_HW_REF_CPU_CYCLES = 0x9 + + PERF_COUNT_HW_CACHE_L1D = 0x0 + PERF_COUNT_HW_CACHE_L1I = 0x1 + PERF_COUNT_HW_CACHE_LL = 0x2 + PERF_COUNT_HW_CACHE_DTLB = 0x3 + PERF_COUNT_HW_CACHE_ITLB = 0x4 + PERF_COUNT_HW_CACHE_BPU = 0x5 + PERF_COUNT_HW_CACHE_NODE = 0x6 + + PERF_COUNT_HW_CACHE_OP_READ = 0x0 + PERF_COUNT_HW_CACHE_OP_WRITE = 0x1 + PERF_COUNT_HW_CACHE_OP_PREFETCH = 0x2 + + PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0x0 + PERF_COUNT_HW_CACHE_RESULT_MISS = 0x1 + + PERF_COUNT_SW_CPU_CLOCK = 0x0 + PERF_COUNT_SW_TASK_CLOCK = 0x1 + PERF_COUNT_SW_PAGE_FAULTS = 0x2 + PERF_COUNT_SW_CONTEXT_SWITCHES = 0x3 + PERF_COUNT_SW_CPU_MIGRATIONS = 0x4 + PERF_COUNT_SW_PAGE_FAULTS_MIN = 0x5 + PERF_COUNT_SW_PAGE_FAULTS_MAJ = 0x6 + PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7 + PERF_COUNT_SW_EMULATION_FAULTS = 0x8 + PERF_COUNT_SW_DUMMY = 0x9 + + PERF_SAMPLE_IP = 0x1 + PERF_SAMPLE_TID = 0x2 + PERF_SAMPLE_TIME = 0x4 + PERF_SAMPLE_ADDR = 0x8 + PERF_SAMPLE_READ = 0x10 + PERF_SAMPLE_CALLCHAIN = 0x20 + PERF_SAMPLE_ID = 0x40 + PERF_SAMPLE_CPU = 0x80 + PERF_SAMPLE_PERIOD = 0x100 + PERF_SAMPLE_STREAM_ID = 0x200 + PERF_SAMPLE_RAW = 0x400 + PERF_SAMPLE_BRANCH_STACK = 0x800 + + PERF_SAMPLE_BRANCH_USER = 0x1 + PERF_SAMPLE_BRANCH_KERNEL = 0x2 + PERF_SAMPLE_BRANCH_HV = 0x4 + PERF_SAMPLE_BRANCH_ANY = 0x8 + PERF_SAMPLE_BRANCH_ANY_CALL = 0x10 + PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20 + PERF_SAMPLE_BRANCH_IND_CALL = 0x40 + + PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1 + PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2 + PERF_FORMAT_ID = 0x4 + PERF_FORMAT_GROUP = 0x8 + + PERF_RECORD_MMAP = 0x1 + PERF_RECORD_LOST = 0x2 + PERF_RECORD_COMM = 0x3 + PERF_RECORD_EXIT = 0x4 + PERF_RECORD_THROTTLE = 0x5 + PERF_RECORD_UNTHROTTLE = 0x6 + PERF_RECORD_FORK = 0x7 + PERF_RECORD_READ = 0x8 + PERF_RECORD_SAMPLE = 0x9 + + PERF_CONTEXT_HV = -0x20 + PERF_CONTEXT_KERNEL = -0x80 + PERF_CONTEXT_USER = -0x200 + + PERF_CONTEXT_GUEST = -0x800 + PERF_CONTEXT_GUEST_KERNEL = -0x880 + PERF_CONTEXT_GUEST_USER = -0xa00 + + PERF_FLAG_FD_NO_GROUP = 0x1 + PERF_FLAG_FD_OUTPUT = 0x2 + PERF_FLAG_PID_CGROUP = 0x4 +) + +const ( + CBitFieldMaskBit0 = 0x1 + CBitFieldMaskBit1 = 0x2 + CBitFieldMaskBit2 = 0x4 + CBitFieldMaskBit3 = 0x8 + CBitFieldMaskBit4 = 0x10 + CBitFieldMaskBit5 = 0x20 + CBitFieldMaskBit6 = 0x40 + CBitFieldMaskBit7 = 0x80 + CBitFieldMaskBit8 = 0x100 + CBitFieldMaskBit9 = 0x200 + CBitFieldMaskBit10 = 0x400 + CBitFieldMaskBit11 = 0x800 + CBitFieldMaskBit12 = 0x1000 + CBitFieldMaskBit13 = 0x2000 + CBitFieldMaskBit14 = 0x4000 + CBitFieldMaskBit15 = 0x8000 + CBitFieldMaskBit16 = 0x10000 + CBitFieldMaskBit17 = 0x20000 + CBitFieldMaskBit18 = 0x40000 + CBitFieldMaskBit19 = 0x80000 + CBitFieldMaskBit20 = 0x100000 + CBitFieldMaskBit21 = 0x200000 + CBitFieldMaskBit22 = 0x400000 + CBitFieldMaskBit23 = 0x800000 + CBitFieldMaskBit24 = 0x1000000 + CBitFieldMaskBit25 = 0x2000000 + CBitFieldMaskBit26 = 0x4000000 + CBitFieldMaskBit27 = 0x8000000 + CBitFieldMaskBit28 = 0x10000000 + CBitFieldMaskBit29 = 0x20000000 + CBitFieldMaskBit30 = 0x40000000 + CBitFieldMaskBit31 = 0x80000000 + CBitFieldMaskBit32 = 0x100000000 + CBitFieldMaskBit33 = 0x200000000 + CBitFieldMaskBit34 = 0x400000000 + CBitFieldMaskBit35 = 0x800000000 + CBitFieldMaskBit36 = 0x1000000000 + CBitFieldMaskBit37 = 0x2000000000 + CBitFieldMaskBit38 = 0x4000000000 + CBitFieldMaskBit39 = 0x8000000000 + CBitFieldMaskBit40 = 0x10000000000 + CBitFieldMaskBit41 = 0x20000000000 + CBitFieldMaskBit42 = 0x40000000000 + CBitFieldMaskBit43 = 0x80000000000 + CBitFieldMaskBit44 = 0x100000000000 + CBitFieldMaskBit45 = 0x200000000000 + CBitFieldMaskBit46 = 0x400000000000 + CBitFieldMaskBit47 = 0x800000000000 + CBitFieldMaskBit48 = 0x1000000000000 + CBitFieldMaskBit49 = 0x2000000000000 + CBitFieldMaskBit50 = 0x4000000000000 + CBitFieldMaskBit51 = 0x8000000000000 + CBitFieldMaskBit52 = 0x10000000000000 + CBitFieldMaskBit53 = 0x20000000000000 + CBitFieldMaskBit54 = 0x40000000000000 + CBitFieldMaskBit55 = 0x80000000000000 + CBitFieldMaskBit56 = 0x100000000000000 + CBitFieldMaskBit57 = 0x200000000000000 + CBitFieldMaskBit58 = 0x400000000000000 + CBitFieldMaskBit59 = 0x800000000000000 + CBitFieldMaskBit60 = 0x1000000000000000 + CBitFieldMaskBit61 = 0x2000000000000000 + CBitFieldMaskBit62 = 0x4000000000000000 + CBitFieldMaskBit63 = 0x8000000000000000 +) + +type SockaddrStorage struct { + Family uint16 + _ [122]uint8 + _ uint32 +} + +type TCPMD5Sig struct { + Addr SockaddrStorage + Flags uint8 + Prefixlen uint8 + Keylen uint16 + _ uint32 + Key [80]uint8 +} + +type HDDriveCmdHdr struct { + Command uint8 + Number uint8 + Feature uint8 + Count uint8 +} + +type HDGeometry struct { + Heads uint8 + Sectors uint8 + Cylinders uint16 + Start uint32 +} + +type HDDriveID struct { + Config uint16 + Cyls uint16 + Reserved2 uint16 + Heads uint16 + Track_bytes uint16 + Sector_bytes uint16 + Sectors uint16 + Vendor0 uint16 + Vendor1 uint16 + Vendor2 uint16 + Serial_no [20]uint8 + Buf_type uint16 + Buf_size uint16 + Ecc_bytes uint16 + Fw_rev [8]uint8 + Model [40]uint8 + Max_multsect uint8 + Vendor3 uint8 + Dword_io uint16 + Vendor4 uint8 + Capability uint8 + Reserved50 uint16 + Vendor5 uint8 + TPIO uint8 + Vendor6 uint8 + TDMA uint8 + Field_valid uint16 + Cur_cyls uint16 + Cur_heads uint16 + Cur_sectors uint16 + Cur_capacity0 uint16 + Cur_capacity1 uint16 + Multsect uint8 + Multsect_valid uint8 + Lba_capacity uint32 + Dma_1word uint16 + Dma_mword uint16 + Eide_pio_modes uint16 + Eide_dma_min uint16 + Eide_dma_time uint16 + Eide_pio uint16 + Eide_pio_iordy uint16 + Words69_70 [2]uint16 + Words71_74 [4]uint16 + Queue_depth uint16 + Words76_79 [4]uint16 + Major_rev_num uint16 + Minor_rev_num uint16 + Command_set_1 uint16 + Command_set_2 uint16 + Cfsse uint16 + Cfs_enable_1 uint16 + Cfs_enable_2 uint16 + Csf_default uint16 + Dma_ultra uint16 + Trseuc uint16 + TrsEuc uint16 + CurAPMvalues uint16 + Mprc uint16 + Hw_config uint16 + Acoustic uint16 + Msrqs uint16 + Sxfert uint16 + Sal uint16 + Spg uint32 + Lba_capacity_2 uint64 + Words104_125 [22]uint16 + Last_lun uint16 + Word127 uint16 + Dlf uint16 + Csfo uint16 + Words130_155 [26]uint16 + Word156 uint16 + Words157_159 [3]uint16 + Cfa_power uint16 + Words161_175 [15]uint16 + Words176_205 [30]uint16 + Words206_254 [49]uint16 + Integrity_word uint16 +} + +type Statfs_t struct { + Type int32 + Bsize int32 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Namelen int32 + Frsize int32 + Flags int32 + Spare [4]int32 + _ [4]byte +} + +const ( + ST_MANDLOCK = 0x40 + ST_NOATIME = 0x400 + ST_NODEV = 0x4 + ST_NODIRATIME = 0x800 + ST_NOEXEC = 0x8 + ST_NOSUID = 0x2 + ST_RDONLY = 0x1 + ST_RELATIME = 0x1000 + ST_SYNCHRONOUS = 0x10 +) + +type TpacketHdr struct { + Status uint32 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Sec uint32 + Usec uint32 +} + +type Tpacket2Hdr struct { + Status uint32 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Sec uint32 + Nsec uint32 + Vlan_tci uint16 + Vlan_tpid uint16 + _ [4]uint8 +} + +type Tpacket3Hdr struct { + Next_offset uint32 + Sec uint32 + Nsec uint32 + Snaplen uint32 + Len uint32 + Status uint32 + Mac uint16 + Net uint16 + Hv1 TpacketHdrVariant1 + _ [8]uint8 +} + +type TpacketHdrVariant1 struct { + Rxhash uint32 + Vlan_tci uint32 + Vlan_tpid uint16 + _ uint16 +} + +type TpacketBlockDesc struct { + Version uint32 + To_priv uint32 + Hdr [40]byte +} + +type TpacketReq struct { + Block_size uint32 + Block_nr uint32 + Frame_size uint32 + Frame_nr uint32 +} + +type TpacketReq3 struct { + Block_size uint32 + Block_nr uint32 + Frame_size uint32 + Frame_nr uint32 + Retire_blk_tov uint32 + Sizeof_priv uint32 + Feature_req_word uint32 +} + +type TpacketStats struct { + Packets uint32 + Drops uint32 +} + +type TpacketStatsV3 struct { + Packets uint32 + Drops uint32 + Freeze_q_cnt uint32 +} + +type TpacketAuxdata struct { + Status uint32 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Vlan_tci uint16 + Vlan_tpid uint16 +} + +const ( + TPACKET_V1 = 0x0 + TPACKET_V2 = 0x1 + TPACKET_V3 = 0x2 +) + +const ( + SizeofTpacketHdr = 0x18 + SizeofTpacket2Hdr = 0x20 + SizeofTpacket3Hdr = 0x30 +) + +const ( + NF_INET_PRE_ROUTING = 0x0 + NF_INET_LOCAL_IN = 0x1 + NF_INET_FORWARD = 0x2 + NF_INET_LOCAL_OUT = 0x3 + NF_INET_POST_ROUTING = 0x4 + NF_INET_NUMHOOKS = 0x5 +) + +const ( + NF_NETDEV_INGRESS = 0x0 + NF_NETDEV_NUMHOOKS = 0x1 +) + +const ( + NFPROTO_UNSPEC = 0x0 + NFPROTO_INET = 0x1 + NFPROTO_IPV4 = 0x2 + NFPROTO_ARP = 0x3 + NFPROTO_NETDEV = 0x5 + NFPROTO_BRIDGE = 0x7 + NFPROTO_IPV6 = 0xa + NFPROTO_DECNET = 0xc + NFPROTO_NUMPROTO = 0xd +) + +type Nfgenmsg struct { + Nfgen_family uint8 + Version uint8 + Res_id uint16 +} + +const ( + NFNL_BATCH_UNSPEC = 0x0 + NFNL_BATCH_GENID = 0x1 +) + +const ( + NFT_REG_VERDICT = 0x0 + NFT_REG_1 = 0x1 + NFT_REG_2 = 0x2 + NFT_REG_3 = 0x3 + NFT_REG_4 = 0x4 + NFT_REG32_00 = 0x8 + NFT_REG32_01 = 0x9 + NFT_REG32_02 = 0xa + NFT_REG32_03 = 0xb + NFT_REG32_04 = 0xc + NFT_REG32_05 = 0xd + NFT_REG32_06 = 0xe + NFT_REG32_07 = 0xf + NFT_REG32_08 = 0x10 + NFT_REG32_09 = 0x11 + NFT_REG32_10 = 0x12 + NFT_REG32_11 = 0x13 + NFT_REG32_12 = 0x14 + NFT_REG32_13 = 0x15 + NFT_REG32_14 = 0x16 + NFT_REG32_15 = 0x17 + NFT_CONTINUE = -0x1 + NFT_BREAK = -0x2 + NFT_JUMP = -0x3 + NFT_GOTO = -0x4 + NFT_RETURN = -0x5 + NFT_MSG_NEWTABLE = 0x0 + NFT_MSG_GETTABLE = 0x1 + NFT_MSG_DELTABLE = 0x2 + NFT_MSG_NEWCHAIN = 0x3 + NFT_MSG_GETCHAIN = 0x4 + NFT_MSG_DELCHAIN = 0x5 + NFT_MSG_NEWRULE = 0x6 + NFT_MSG_GETRULE = 0x7 + NFT_MSG_DELRULE = 0x8 + NFT_MSG_NEWSET = 0x9 + NFT_MSG_GETSET = 0xa + NFT_MSG_DELSET = 0xb + NFT_MSG_NEWSETELEM = 0xc + NFT_MSG_GETSETELEM = 0xd + NFT_MSG_DELSETELEM = 0xe + NFT_MSG_NEWGEN = 0xf + NFT_MSG_GETGEN = 0x10 + NFT_MSG_TRACE = 0x11 + NFT_MSG_NEWOBJ = 0x12 + NFT_MSG_GETOBJ = 0x13 + NFT_MSG_DELOBJ = 0x14 + NFT_MSG_GETOBJ_RESET = 0x15 + NFT_MSG_MAX = 0x19 + NFTA_LIST_UNPEC = 0x0 + NFTA_LIST_ELEM = 0x1 + NFTA_HOOK_UNSPEC = 0x0 + NFTA_HOOK_HOOKNUM = 0x1 + NFTA_HOOK_PRIORITY = 0x2 + NFTA_HOOK_DEV = 0x3 + NFT_TABLE_F_DORMANT = 0x1 + NFTA_TABLE_UNSPEC = 0x0 + NFTA_TABLE_NAME = 0x1 + NFTA_TABLE_FLAGS = 0x2 + NFTA_TABLE_USE = 0x3 + NFTA_CHAIN_UNSPEC = 0x0 + NFTA_CHAIN_TABLE = 0x1 + NFTA_CHAIN_HANDLE = 0x2 + NFTA_CHAIN_NAME = 0x3 + NFTA_CHAIN_HOOK = 0x4 + NFTA_CHAIN_POLICY = 0x5 + NFTA_CHAIN_USE = 0x6 + NFTA_CHAIN_TYPE = 0x7 + NFTA_CHAIN_COUNTERS = 0x8 + NFTA_CHAIN_PAD = 0x9 + NFTA_RULE_UNSPEC = 0x0 + NFTA_RULE_TABLE = 0x1 + NFTA_RULE_CHAIN = 0x2 + NFTA_RULE_HANDLE = 0x3 + NFTA_RULE_EXPRESSIONS = 0x4 + NFTA_RULE_COMPAT = 0x5 + NFTA_RULE_POSITION = 0x6 + NFTA_RULE_USERDATA = 0x7 + NFTA_RULE_PAD = 0x8 + NFTA_RULE_ID = 0x9 + NFT_RULE_COMPAT_F_INV = 0x2 + NFT_RULE_COMPAT_F_MASK = 0x2 + NFTA_RULE_COMPAT_UNSPEC = 0x0 + NFTA_RULE_COMPAT_PROTO = 0x1 + NFTA_RULE_COMPAT_FLAGS = 0x2 + NFT_SET_ANONYMOUS = 0x1 + NFT_SET_CONSTANT = 0x2 + NFT_SET_INTERVAL = 0x4 + NFT_SET_MAP = 0x8 + NFT_SET_TIMEOUT = 0x10 + NFT_SET_EVAL = 0x20 + NFT_SET_OBJECT = 0x40 + NFT_SET_POL_PERFORMANCE = 0x0 + NFT_SET_POL_MEMORY = 0x1 + NFTA_SET_DESC_UNSPEC = 0x0 + NFTA_SET_DESC_SIZE = 0x1 + NFTA_SET_UNSPEC = 0x0 + NFTA_SET_TABLE = 0x1 + NFTA_SET_NAME = 0x2 + NFTA_SET_FLAGS = 0x3 + NFTA_SET_KEY_TYPE = 0x4 + NFTA_SET_KEY_LEN = 0x5 + NFTA_SET_DATA_TYPE = 0x6 + NFTA_SET_DATA_LEN = 0x7 + NFTA_SET_POLICY = 0x8 + NFTA_SET_DESC = 0x9 + NFTA_SET_ID = 0xa + NFTA_SET_TIMEOUT = 0xb + NFTA_SET_GC_INTERVAL = 0xc + NFTA_SET_USERDATA = 0xd + NFTA_SET_PAD = 0xe + NFTA_SET_OBJ_TYPE = 0xf + NFT_SET_ELEM_INTERVAL_END = 0x1 + NFTA_SET_ELEM_UNSPEC = 0x0 + NFTA_SET_ELEM_KEY = 0x1 + NFTA_SET_ELEM_DATA = 0x2 + NFTA_SET_ELEM_FLAGS = 0x3 + NFTA_SET_ELEM_TIMEOUT = 0x4 + NFTA_SET_ELEM_EXPIRATION = 0x5 + NFTA_SET_ELEM_USERDATA = 0x6 + NFTA_SET_ELEM_EXPR = 0x7 + NFTA_SET_ELEM_PAD = 0x8 + NFTA_SET_ELEM_OBJREF = 0x9 + NFTA_SET_ELEM_LIST_UNSPEC = 0x0 + NFTA_SET_ELEM_LIST_TABLE = 0x1 + NFTA_SET_ELEM_LIST_SET = 0x2 + NFTA_SET_ELEM_LIST_ELEMENTS = 0x3 + NFTA_SET_ELEM_LIST_SET_ID = 0x4 + NFT_DATA_VALUE = 0x0 + NFT_DATA_VERDICT = 0xffffff00 + NFTA_DATA_UNSPEC = 0x0 + NFTA_DATA_VALUE = 0x1 + NFTA_DATA_VERDICT = 0x2 + NFTA_VERDICT_UNSPEC = 0x0 + NFTA_VERDICT_CODE = 0x1 + NFTA_VERDICT_CHAIN = 0x2 + NFTA_EXPR_UNSPEC = 0x0 + NFTA_EXPR_NAME = 0x1 + NFTA_EXPR_DATA = 0x2 + NFTA_IMMEDIATE_UNSPEC = 0x0 + NFTA_IMMEDIATE_DREG = 0x1 + NFTA_IMMEDIATE_DATA = 0x2 + NFTA_BITWISE_UNSPEC = 0x0 + NFTA_BITWISE_SREG = 0x1 + NFTA_BITWISE_DREG = 0x2 + NFTA_BITWISE_LEN = 0x3 + NFTA_BITWISE_MASK = 0x4 + NFTA_BITWISE_XOR = 0x5 + NFT_BYTEORDER_NTOH = 0x0 + NFT_BYTEORDER_HTON = 0x1 + NFTA_BYTEORDER_UNSPEC = 0x0 + NFTA_BYTEORDER_SREG = 0x1 + NFTA_BYTEORDER_DREG = 0x2 + NFTA_BYTEORDER_OP = 0x3 + NFTA_BYTEORDER_LEN = 0x4 + NFTA_BYTEORDER_SIZE = 0x5 + NFT_CMP_EQ = 0x0 + NFT_CMP_NEQ = 0x1 + NFT_CMP_LT = 0x2 + NFT_CMP_LTE = 0x3 + NFT_CMP_GT = 0x4 + NFT_CMP_GTE = 0x5 + NFTA_CMP_UNSPEC = 0x0 + NFTA_CMP_SREG = 0x1 + NFTA_CMP_OP = 0x2 + NFTA_CMP_DATA = 0x3 + NFT_RANGE_EQ = 0x0 + NFT_RANGE_NEQ = 0x1 + NFTA_RANGE_UNSPEC = 0x0 + NFTA_RANGE_SREG = 0x1 + NFTA_RANGE_OP = 0x2 + NFTA_RANGE_FROM_DATA = 0x3 + NFTA_RANGE_TO_DATA = 0x4 + NFT_LOOKUP_F_INV = 0x1 + NFTA_LOOKUP_UNSPEC = 0x0 + NFTA_LOOKUP_SET = 0x1 + NFTA_LOOKUP_SREG = 0x2 + NFTA_LOOKUP_DREG = 0x3 + NFTA_LOOKUP_SET_ID = 0x4 + NFTA_LOOKUP_FLAGS = 0x5 + NFT_DYNSET_OP_ADD = 0x0 + NFT_DYNSET_OP_UPDATE = 0x1 + NFT_DYNSET_F_INV = 0x1 + NFTA_DYNSET_UNSPEC = 0x0 + NFTA_DYNSET_SET_NAME = 0x1 + NFTA_DYNSET_SET_ID = 0x2 + NFTA_DYNSET_OP = 0x3 + NFTA_DYNSET_SREG_KEY = 0x4 + NFTA_DYNSET_SREG_DATA = 0x5 + NFTA_DYNSET_TIMEOUT = 0x6 + NFTA_DYNSET_EXPR = 0x7 + NFTA_DYNSET_PAD = 0x8 + NFTA_DYNSET_FLAGS = 0x9 + NFT_PAYLOAD_LL_HEADER = 0x0 + NFT_PAYLOAD_NETWORK_HEADER = 0x1 + NFT_PAYLOAD_TRANSPORT_HEADER = 0x2 + NFT_PAYLOAD_CSUM_NONE = 0x0 + NFT_PAYLOAD_CSUM_INET = 0x1 + NFT_PAYLOAD_L4CSUM_PSEUDOHDR = 0x1 + NFTA_PAYLOAD_UNSPEC = 0x0 + NFTA_PAYLOAD_DREG = 0x1 + NFTA_PAYLOAD_BASE = 0x2 + NFTA_PAYLOAD_OFFSET = 0x3 + NFTA_PAYLOAD_LEN = 0x4 + NFTA_PAYLOAD_SREG = 0x5 + NFTA_PAYLOAD_CSUM_TYPE = 0x6 + NFTA_PAYLOAD_CSUM_OFFSET = 0x7 + NFTA_PAYLOAD_CSUM_FLAGS = 0x8 + NFT_EXTHDR_F_PRESENT = 0x1 + NFT_EXTHDR_OP_IPV6 = 0x0 + NFT_EXTHDR_OP_TCPOPT = 0x1 + NFTA_EXTHDR_UNSPEC = 0x0 + NFTA_EXTHDR_DREG = 0x1 + NFTA_EXTHDR_TYPE = 0x2 + NFTA_EXTHDR_OFFSET = 0x3 + NFTA_EXTHDR_LEN = 0x4 + NFTA_EXTHDR_FLAGS = 0x5 + NFTA_EXTHDR_OP = 0x6 + NFTA_EXTHDR_SREG = 0x7 + NFT_META_LEN = 0x0 + NFT_META_PROTOCOL = 0x1 + NFT_META_PRIORITY = 0x2 + NFT_META_MARK = 0x3 + NFT_META_IIF = 0x4 + NFT_META_OIF = 0x5 + NFT_META_IIFNAME = 0x6 + NFT_META_OIFNAME = 0x7 + NFT_META_IIFTYPE = 0x8 + NFT_META_OIFTYPE = 0x9 + NFT_META_SKUID = 0xa + NFT_META_SKGID = 0xb + NFT_META_NFTRACE = 0xc + NFT_META_RTCLASSID = 0xd + NFT_META_SECMARK = 0xe + NFT_META_NFPROTO = 0xf + NFT_META_L4PROTO = 0x10 + NFT_META_BRI_IIFNAME = 0x11 + NFT_META_BRI_OIFNAME = 0x12 + NFT_META_PKTTYPE = 0x13 + NFT_META_CPU = 0x14 + NFT_META_IIFGROUP = 0x15 + NFT_META_OIFGROUP = 0x16 + NFT_META_CGROUP = 0x17 + NFT_META_PRANDOM = 0x18 + NFT_RT_CLASSID = 0x0 + NFT_RT_NEXTHOP4 = 0x1 + NFT_RT_NEXTHOP6 = 0x2 + NFT_RT_TCPMSS = 0x3 + NFT_HASH_JENKINS = 0x0 + NFT_HASH_SYM = 0x1 + NFTA_HASH_UNSPEC = 0x0 + NFTA_HASH_SREG = 0x1 + NFTA_HASH_DREG = 0x2 + NFTA_HASH_LEN = 0x3 + NFTA_HASH_MODULUS = 0x4 + NFTA_HASH_SEED = 0x5 + NFTA_HASH_OFFSET = 0x6 + NFTA_HASH_TYPE = 0x7 + NFTA_META_UNSPEC = 0x0 + NFTA_META_DREG = 0x1 + NFTA_META_KEY = 0x2 + NFTA_META_SREG = 0x3 + NFTA_RT_UNSPEC = 0x0 + NFTA_RT_DREG = 0x1 + NFTA_RT_KEY = 0x2 + NFT_CT_STATE = 0x0 + NFT_CT_DIRECTION = 0x1 + NFT_CT_STATUS = 0x2 + NFT_CT_MARK = 0x3 + NFT_CT_SECMARK = 0x4 + NFT_CT_EXPIRATION = 0x5 + NFT_CT_HELPER = 0x6 + NFT_CT_L3PROTOCOL = 0x7 + NFT_CT_SRC = 0x8 + NFT_CT_DST = 0x9 + NFT_CT_PROTOCOL = 0xa + NFT_CT_PROTO_SRC = 0xb + NFT_CT_PROTO_DST = 0xc + NFT_CT_LABELS = 0xd + NFT_CT_PKTS = 0xe + NFT_CT_BYTES = 0xf + NFT_CT_AVGPKT = 0x10 + NFT_CT_ZONE = 0x11 + NFT_CT_EVENTMASK = 0x12 + NFTA_CT_UNSPEC = 0x0 + NFTA_CT_DREG = 0x1 + NFTA_CT_KEY = 0x2 + NFTA_CT_DIRECTION = 0x3 + NFTA_CT_SREG = 0x4 + NFT_LIMIT_PKTS = 0x0 + NFT_LIMIT_PKT_BYTES = 0x1 + NFT_LIMIT_F_INV = 0x1 + NFTA_LIMIT_UNSPEC = 0x0 + NFTA_LIMIT_RATE = 0x1 + NFTA_LIMIT_UNIT = 0x2 + NFTA_LIMIT_BURST = 0x3 + NFTA_LIMIT_TYPE = 0x4 + NFTA_LIMIT_FLAGS = 0x5 + NFTA_LIMIT_PAD = 0x6 + NFTA_COUNTER_UNSPEC = 0x0 + NFTA_COUNTER_BYTES = 0x1 + NFTA_COUNTER_PACKETS = 0x2 + NFTA_COUNTER_PAD = 0x3 + NFTA_LOG_UNSPEC = 0x0 + NFTA_LOG_GROUP = 0x1 + NFTA_LOG_PREFIX = 0x2 + NFTA_LOG_SNAPLEN = 0x3 + NFTA_LOG_QTHRESHOLD = 0x4 + NFTA_LOG_LEVEL = 0x5 + NFTA_LOG_FLAGS = 0x6 + NFTA_QUEUE_UNSPEC = 0x0 + NFTA_QUEUE_NUM = 0x1 + NFTA_QUEUE_TOTAL = 0x2 + NFTA_QUEUE_FLAGS = 0x3 + NFTA_QUEUE_SREG_QNUM = 0x4 + NFT_QUOTA_F_INV = 0x1 + NFT_QUOTA_F_DEPLETED = 0x2 + NFTA_QUOTA_UNSPEC = 0x0 + NFTA_QUOTA_BYTES = 0x1 + NFTA_QUOTA_FLAGS = 0x2 + NFTA_QUOTA_PAD = 0x3 + NFTA_QUOTA_CONSUMED = 0x4 + NFT_REJECT_ICMP_UNREACH = 0x0 + NFT_REJECT_TCP_RST = 0x1 + NFT_REJECT_ICMPX_UNREACH = 0x2 + NFT_REJECT_ICMPX_NO_ROUTE = 0x0 + NFT_REJECT_ICMPX_PORT_UNREACH = 0x1 + NFT_REJECT_ICMPX_HOST_UNREACH = 0x2 + NFT_REJECT_ICMPX_ADMIN_PROHIBITED = 0x3 + NFTA_REJECT_UNSPEC = 0x0 + NFTA_REJECT_TYPE = 0x1 + NFTA_REJECT_ICMP_CODE = 0x2 + NFT_NAT_SNAT = 0x0 + NFT_NAT_DNAT = 0x1 + NFTA_NAT_UNSPEC = 0x0 + NFTA_NAT_TYPE = 0x1 + NFTA_NAT_FAMILY = 0x2 + NFTA_NAT_REG_ADDR_MIN = 0x3 + NFTA_NAT_REG_ADDR_MAX = 0x4 + NFTA_NAT_REG_PROTO_MIN = 0x5 + NFTA_NAT_REG_PROTO_MAX = 0x6 + NFTA_NAT_FLAGS = 0x7 + NFTA_MASQ_UNSPEC = 0x0 + NFTA_MASQ_FLAGS = 0x1 + NFTA_MASQ_REG_PROTO_MIN = 0x2 + NFTA_MASQ_REG_PROTO_MAX = 0x3 + NFTA_REDIR_UNSPEC = 0x0 + NFTA_REDIR_REG_PROTO_MIN = 0x1 + NFTA_REDIR_REG_PROTO_MAX = 0x2 + NFTA_REDIR_FLAGS = 0x3 + NFTA_DUP_UNSPEC = 0x0 + NFTA_DUP_SREG_ADDR = 0x1 + NFTA_DUP_SREG_DEV = 0x2 + NFTA_FWD_UNSPEC = 0x0 + NFTA_FWD_SREG_DEV = 0x1 + NFTA_OBJREF_UNSPEC = 0x0 + NFTA_OBJREF_IMM_TYPE = 0x1 + NFTA_OBJREF_IMM_NAME = 0x2 + NFTA_OBJREF_SET_SREG = 0x3 + NFTA_OBJREF_SET_NAME = 0x4 + NFTA_OBJREF_SET_ID = 0x5 + NFTA_GEN_UNSPEC = 0x0 + NFTA_GEN_ID = 0x1 + NFTA_GEN_PROC_PID = 0x2 + NFTA_GEN_PROC_NAME = 0x3 + NFTA_FIB_UNSPEC = 0x0 + NFTA_FIB_DREG = 0x1 + NFTA_FIB_RESULT = 0x2 + NFTA_FIB_FLAGS = 0x3 + NFT_FIB_RESULT_UNSPEC = 0x0 + NFT_FIB_RESULT_OIF = 0x1 + NFT_FIB_RESULT_OIFNAME = 0x2 + NFT_FIB_RESULT_ADDRTYPE = 0x3 + NFTA_FIB_F_SADDR = 0x1 + NFTA_FIB_F_DADDR = 0x2 + NFTA_FIB_F_MARK = 0x4 + NFTA_FIB_F_IIF = 0x8 + NFTA_FIB_F_OIF = 0x10 + NFTA_FIB_F_PRESENT = 0x20 + NFTA_CT_HELPER_UNSPEC = 0x0 + NFTA_CT_HELPER_NAME = 0x1 + NFTA_CT_HELPER_L3PROTO = 0x2 + NFTA_CT_HELPER_L4PROTO = 0x3 + NFTA_OBJ_UNSPEC = 0x0 + NFTA_OBJ_TABLE = 0x1 + NFTA_OBJ_NAME = 0x2 + NFTA_OBJ_TYPE = 0x3 + NFTA_OBJ_DATA = 0x4 + NFTA_OBJ_USE = 0x5 + NFTA_TRACE_UNSPEC = 0x0 + NFTA_TRACE_TABLE = 0x1 + NFTA_TRACE_CHAIN = 0x2 + NFTA_TRACE_RULE_HANDLE = 0x3 + NFTA_TRACE_TYPE = 0x4 + NFTA_TRACE_VERDICT = 0x5 + NFTA_TRACE_ID = 0x6 + NFTA_TRACE_LL_HEADER = 0x7 + NFTA_TRACE_NETWORK_HEADER = 0x8 + NFTA_TRACE_TRANSPORT_HEADER = 0x9 + NFTA_TRACE_IIF = 0xa + NFTA_TRACE_IIFTYPE = 0xb + NFTA_TRACE_OIF = 0xc + NFTA_TRACE_OIFTYPE = 0xd + NFTA_TRACE_MARK = 0xe + NFTA_TRACE_NFPROTO = 0xf + NFTA_TRACE_POLICY = 0x10 + NFTA_TRACE_PAD = 0x11 + NFT_TRACETYPE_UNSPEC = 0x0 + NFT_TRACETYPE_POLICY = 0x1 + NFT_TRACETYPE_RETURN = 0x2 + NFT_TRACETYPE_RULE = 0x3 + NFTA_NG_UNSPEC = 0x0 + NFTA_NG_DREG = 0x1 + NFTA_NG_MODULUS = 0x2 + NFTA_NG_TYPE = 0x3 + NFTA_NG_OFFSET = 0x4 + NFT_NG_INCREMENTAL = 0x0 + NFT_NG_RANDOM = 0x1 +) + +type RTCTime struct { + Sec int32 + Min int32 + Hour int32 + Mday int32 + Mon int32 + Year int32 + Wday int32 + Yday int32 + Isdst int32 +} + +type RTCWkAlrm struct { + Enabled uint8 + Pending uint8 + _ [2]byte + Time RTCTime +} + +type RTCPLLInfo struct { + Ctrl int32 + Value int32 + Max int32 + Min int32 + Posmult int32 + Negmult int32 + Clock int32 +} + +type BlkpgIoctlArg struct { + Op int32 + Flags int32 + Datalen int32 + Data *byte +} + +type BlkpgPartition struct { + Start int64 + Length int64 + Pno int32 + Devname [64]uint8 + Volname [64]uint8 + _ [4]byte +} + +const ( + BLKPG = 0x1269 + BLKPG_ADD_PARTITION = 0x1 + BLKPG_DEL_PARTITION = 0x2 + BLKPG_RESIZE_PARTITION = 0x3 +) + +const ( + NETNSA_NONE = 0x0 + NETNSA_NSID = 0x1 + NETNSA_PID = 0x2 + NETNSA_FD = 0x3 +) + +type XDPRingOffset struct { + Producer uint64 + Consumer uint64 + Desc uint64 +} + +type XDPMmapOffsets struct { + Rx XDPRingOffset + Tx XDPRingOffset + Fr XDPRingOffset + Cr XDPRingOffset +} + +type XDPUmemReg struct { + Addr uint64 + Len uint64 + Size uint32 + Headroom uint32 +} + +type XDPStatistics struct { + Rx_dropped uint64 + Rx_invalid_descs uint64 + Tx_invalid_descs uint64 +} + +type XDPDesc struct { + Addr uint64 + Len uint32 + Options uint32 +} + +const ( + NCSI_CMD_UNSPEC = 0x0 + NCSI_CMD_PKG_INFO = 0x1 + NCSI_CMD_SET_INTERFACE = 0x2 + NCSI_CMD_CLEAR_INTERFACE = 0x3 + NCSI_ATTR_UNSPEC = 0x0 + NCSI_ATTR_IFINDEX = 0x1 + NCSI_ATTR_PACKAGE_LIST = 0x2 + NCSI_ATTR_PACKAGE_ID = 0x3 + NCSI_ATTR_CHANNEL_ID = 0x4 + NCSI_PKG_ATTR_UNSPEC = 0x0 + NCSI_PKG_ATTR = 0x1 + NCSI_PKG_ATTR_ID = 0x2 + NCSI_PKG_ATTR_FORCED = 0x3 + NCSI_PKG_ATTR_CHANNEL_LIST = 0x4 + NCSI_CHANNEL_ATTR_UNSPEC = 0x0 + NCSI_CHANNEL_ATTR = 0x1 + NCSI_CHANNEL_ATTR_ID = 0x2 + NCSI_CHANNEL_ATTR_VERSION_MAJOR = 0x3 + NCSI_CHANNEL_ATTR_VERSION_MINOR = 0x4 + NCSI_CHANNEL_ATTR_VERSION_STR = 0x5 + NCSI_CHANNEL_ATTR_LINK_STATE = 0x6 + NCSI_CHANNEL_ATTR_ACTIVE = 0x7 + NCSI_CHANNEL_ATTR_FORCED = 0x8 + NCSI_CHANNEL_ATTR_VLAN_LIST = 0x9 + NCSI_CHANNEL_ATTR_VLAN_ID = 0xa +) + +const ( + SOF_TIMESTAMPING_TX_HARDWARE = 0x1 + SOF_TIMESTAMPING_TX_SOFTWARE = 0x2 + SOF_TIMESTAMPING_RX_HARDWARE = 0x4 + SOF_TIMESTAMPING_RX_SOFTWARE = 0x8 + SOF_TIMESTAMPING_SOFTWARE = 0x10 + SOF_TIMESTAMPING_SYS_HARDWARE = 0x20 + SOF_TIMESTAMPING_RAW_HARDWARE = 0x40 + SOF_TIMESTAMPING_OPT_ID = 0x80 + SOF_TIMESTAMPING_TX_SCHED = 0x100 + SOF_TIMESTAMPING_TX_ACK = 0x200 + SOF_TIMESTAMPING_OPT_CMSG = 0x400 + SOF_TIMESTAMPING_OPT_TSONLY = 0x800 + SOF_TIMESTAMPING_OPT_STATS = 0x1000 + SOF_TIMESTAMPING_OPT_PKTINFO = 0x2000 + SOF_TIMESTAMPING_OPT_TX_SWHW = 0x4000 + + SOF_TIMESTAMPING_LAST = 0x4000 + SOF_TIMESTAMPING_MASK = 0x7fff +) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go new file mode 100644 index 00000000..d7a993e2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go @@ -0,0 +1,1989 @@ +// cgo -godefs -- -Wall -Werror -static -I/tmp/include -fsigned-char linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm64,linux + +package unix + +const ( + SizeofPtr = 0x8 + SizeofShort = 0x2 + SizeofInt = 0x4 + SizeofLong = 0x8 + SizeofLongLong = 0x8 + PathMax = 0x1000 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Timex struct { + Modes uint32 + _ [4]byte + Offset int64 + Freq int64 + Maxerror int64 + Esterror int64 + Status int32 + _ [4]byte + Constant int64 + Precision int64 + Tolerance int64 + Time Timeval + Tick int64 + Ppsfreq int64 + Jitter int64 + Shift int32 + _ [4]byte + Stabil int64 + Jitcnt int64 + Calcnt int64 + Errcnt int64 + Stbcnt int64 + Tai int32 + _ [44]byte +} + +type Time_t int64 + +type Tms struct { + Utime int64 + Stime int64 + Cutime int64 + Cstime int64 +} + +type Utimbuf struct { + Actime int64 + Modtime int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint64 + Ino uint64 + Mode uint32 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev uint64 + _ uint64 + Size int64 + Blksize int32 + _ int32 + Blocks int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + _ [2]int32 +} + +type StatxTimestamp struct { + Sec int64 + Nsec uint32 + _ int32 +} + +type Statx_t struct { + Mask uint32 + Blksize uint32 + Attributes uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Mode uint16 + _ [1]uint16 + Ino uint64 + Size uint64 + Blocks uint64 + Attributes_mask uint64 + Atime StatxTimestamp + Btime StatxTimestamp + Ctime StatxTimestamp + Mtime StatxTimestamp + Rdev_major uint32 + Rdev_minor uint32 + Dev_major uint32 + Dev_minor uint32 + _ [14]uint64 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]int8 + _ [5]byte +} + +type Fsid struct { + Val [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + _ [4]byte + Start int64 + Len int64 + Pid int32 + _ [4]byte +} + +type FscryptPolicy struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptKey struct { + Mode uint32 + Raw [64]uint8 + Size uint32 +} + +type KeyctlDHParams struct { + Private int32 + Prime int32 + Base int32 +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddrL2 struct { + Family uint16 + Psm uint16 + Bdaddr [6]uint8 + Cid uint16 + Bdaddr_type uint8 + _ [1]byte +} + +type RawSockaddrRFCOMM struct { + Family uint16 + Bdaddr [6]uint8 + Channel uint8 + _ [1]byte +} + +type RawSockaddrCAN struct { + Family uint16 + _ [2]byte + Ifindex int32 + Addr [8]byte +} + +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + +type RawSockaddrXDP struct { + Family uint16 + Flags uint16 + Ifindex uint32 + Queue_id uint32 + Shared_umem_fd uint32 +} + +type RawSockaddr struct { + Family uint16 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type PacketMreq struct { + Ifindex int32 + Type uint16 + Alen uint16 + Address [8]uint8 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + _ [4]byte + Iov *Iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + _ [4]byte +} + +type Cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + _ [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofSockaddrL2 = 0xe + SizeofSockaddrRFCOMM = 0xa + SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 + SizeofSockaddrXDP = 0x10 + SizeofLinger = 0x8 + SizeofIovec = 0x10 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofPacketMreq = 0x10 + SizeofMsghdr = 0x38 + SizeofCmsghdr = 0x10 + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_INFO_KIND = 0x1 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_NUM_VF = 0x15 + IFLA_VFINFO_LIST = 0x16 + IFLA_STATS64 = 0x17 + IFLA_VF_PORTS = 0x18 + IFLA_PORT_SELF = 0x19 + IFLA_AF_SPEC = 0x1a + IFLA_GROUP = 0x1b + IFLA_NET_NS_FD = 0x1c + IFLA_EXT_MASK = 0x1d + IFLA_PROMISCUITY = 0x1e + IFLA_NUM_TX_QUEUES = 0x1f + IFLA_NUM_RX_QUEUES = 0x20 + IFLA_CARRIER = 0x21 + IFLA_PHYS_PORT_ID = 0x22 + IFLA_CARRIER_CHANGES = 0x23 + IFLA_PHYS_SWITCH_ID = 0x24 + IFLA_LINK_NETNSID = 0x25 + IFLA_PHYS_PORT_NAME = 0x26 + IFLA_PROTO_DOWN = 0x27 + IFLA_GSO_MAX_SEGS = 0x28 + IFLA_GSO_MAX_SIZE = 0x29 + IFLA_PAD = 0x2a + IFLA_XDP = 0x2b + IFLA_EVENT = 0x2c + IFLA_NEW_NETNSID = 0x2d + IFLA_IF_NETNSID = 0x2e + IFLA_MAX = 0x33 + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTA_MARK = 0x10 + RTA_MFC_STATS = 0x11 + RTA_VIA = 0x12 + RTA_NEWDST = 0x13 + RTA_PREF = 0x14 + RTA_ENCAP_TYPE = 0x15 + RTA_ENCAP = 0x16 + RTA_EXPIRES = 0x17 + RTA_PAD = 0x18 + RTA_UID = 0x19 + RTA_TTL_PROPAGATE = 0x1a + RTA_IP_PROTO = 0x1b + RTA_SPORT = 0x1c + RTA_DPORT = 0x1d + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + _ uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x10 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + _ [6]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + Regs [31]uint64 + Sp uint64 + Pc uint64 + Pstate uint64 +} + +type FdSet struct { + Bits [16]int64 +} + +type Sysinfo_t struct { + Uptime int64 + Loads [3]uint64 + Totalram uint64 + Freeram uint64 + Sharedram uint64 + Bufferram uint64 + Totalswap uint64 + Freeswap uint64 + Procs uint16 + Pad uint16 + _ [4]byte + Totalhigh uint64 + Freehigh uint64 + Unit uint32 + _ [0]int8 + _ [4]byte +} + +type Utsname struct { + Sysname [65]byte + Nodename [65]byte + Release [65]byte + Version [65]byte + Machine [65]byte + Domainname [65]byte +} + +type Ustat_t struct { + Tfree int32 + _ [4]byte + Tinode uint64 + Fname [6]int8 + Fpack [6]int8 + _ [4]byte +} + +type EpollEvent struct { + Events uint32 + PadFd int32 + Fd int32 + Pad int32 +} + +const ( + AT_EMPTY_PATH = 0x1000 + AT_FDCWD = -0x64 + AT_NO_AUTOMOUNT = 0x800 + AT_REMOVEDIR = 0x200 + + AT_STATX_SYNC_AS_STAT = 0x0 + AT_STATX_FORCE_SYNC = 0x2000 + AT_STATX_DONT_SYNC = 0x4000 + + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 + + AT_EACCESS = 0x200 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x2000 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Sigset_t struct { + Val [16]uint64 +} + +const RNDGETENTCNT = 0x80045200 + +const PERF_IOC_FLAG_GROUP = 0x1 + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Line uint8 + Cc [19]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Taskstats struct { + Version uint16 + _ [2]byte + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + _ [6]byte + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]int8 + Ac_sched uint8 + Ac_pad [3]uint8 + _ [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + _ [4]byte + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 +} + +const ( + TASKSTATS_CMD_UNSPEC = 0x0 + TASKSTATS_CMD_GET = 0x1 + TASKSTATS_CMD_NEW = 0x2 + TASKSTATS_TYPE_UNSPEC = 0x0 + TASKSTATS_TYPE_PID = 0x1 + TASKSTATS_TYPE_TGID = 0x2 + TASKSTATS_TYPE_STATS = 0x3 + TASKSTATS_TYPE_AGGR_PID = 0x4 + TASKSTATS_TYPE_AGGR_TGID = 0x5 + TASKSTATS_TYPE_NULL = 0x6 + TASKSTATS_CMD_ATTR_UNSPEC = 0x0 + TASKSTATS_CMD_ATTR_PID = 0x1 + TASKSTATS_CMD_ATTR_TGID = 0x2 + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 +) + +type CGroupStats struct { + Sleeping uint64 + Running uint64 + Stopped uint64 + Uninterruptible uint64 + Io_wait uint64 +} + +const ( + CGROUPSTATS_CMD_UNSPEC = 0x3 + CGROUPSTATS_CMD_GET = 0x4 + CGROUPSTATS_CMD_NEW = 0x5 + CGROUPSTATS_TYPE_UNSPEC = 0x0 + CGROUPSTATS_TYPE_CGROUP_STATS = 0x1 + CGROUPSTATS_CMD_ATTR_UNSPEC = 0x0 + CGROUPSTATS_CMD_ATTR_FD = 0x1 +) + +type Genlmsghdr struct { + Cmd uint8 + Version uint8 + Reserved uint16 +} + +const ( + CTRL_CMD_UNSPEC = 0x0 + CTRL_CMD_NEWFAMILY = 0x1 + CTRL_CMD_DELFAMILY = 0x2 + CTRL_CMD_GETFAMILY = 0x3 + CTRL_CMD_NEWOPS = 0x4 + CTRL_CMD_DELOPS = 0x5 + CTRL_CMD_GETOPS = 0x6 + CTRL_CMD_NEWMCAST_GRP = 0x7 + CTRL_CMD_DELMCAST_GRP = 0x8 + CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_ATTR_UNSPEC = 0x0 + CTRL_ATTR_FAMILY_ID = 0x1 + CTRL_ATTR_FAMILY_NAME = 0x2 + CTRL_ATTR_VERSION = 0x3 + CTRL_ATTR_HDRSIZE = 0x4 + CTRL_ATTR_MAXATTR = 0x5 + CTRL_ATTR_OPS = 0x6 + CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_OP_UNSPEC = 0x0 + CTRL_ATTR_OP_ID = 0x1 + CTRL_ATTR_OP_FLAGS = 0x2 + CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 + CTRL_ATTR_MCAST_GRP_NAME = 0x1 + CTRL_ATTR_MCAST_GRP_ID = 0x2 +) + +type cpuMask uint64 + +const ( + _CPU_SETSIZE = 0x400 + _NCPUBITS = 0x40 +) + +const ( + BDADDR_BREDR = 0x0 + BDADDR_LE_PUBLIC = 0x1 + BDADDR_LE_RANDOM = 0x2 +) + +type PerfEventAttr struct { + Type uint32 + Size uint32 + Config uint64 + Sample uint64 + Sample_type uint64 + Read_format uint64 + Bits uint64 + Wakeup uint32 + Bp_type uint32 + Ext1 uint64 + Ext2 uint64 + Branch_sample_type uint64 + Sample_regs_user uint64 + Sample_stack_user uint32 + Clockid int32 + Sample_regs_intr uint64 + Aux_watermark uint32 + _ uint32 +} + +type PerfEventMmapPage struct { + Version uint32 + Compat_version uint32 + Lock uint32 + Index uint32 + Offset int64 + Time_enabled uint64 + Time_running uint64 + Capabilities uint64 + Pmc_width uint16 + Time_shift uint16 + Time_mult uint32 + Time_offset uint64 + Time_zero uint64 + Size uint32 + _ [948]uint8 + Data_head uint64 + Data_tail uint64 + Data_offset uint64 + Data_size uint64 + Aux_head uint64 + Aux_tail uint64 + Aux_offset uint64 + Aux_size uint64 +} + +const ( + PerfBitDisabled uint64 = CBitFieldMaskBit0 + PerfBitInherit = CBitFieldMaskBit1 + PerfBitPinned = CBitFieldMaskBit2 + PerfBitExclusive = CBitFieldMaskBit3 + PerfBitExcludeUser = CBitFieldMaskBit4 + PerfBitExcludeKernel = CBitFieldMaskBit5 + PerfBitExcludeHv = CBitFieldMaskBit6 + PerfBitExcludeIdle = CBitFieldMaskBit7 + PerfBitMmap = CBitFieldMaskBit8 + PerfBitComm = CBitFieldMaskBit9 + PerfBitFreq = CBitFieldMaskBit10 + PerfBitInheritStat = CBitFieldMaskBit11 + PerfBitEnableOnExec = CBitFieldMaskBit12 + PerfBitTask = CBitFieldMaskBit13 + PerfBitWatermark = CBitFieldMaskBit14 + PerfBitPreciseIPBit1 = CBitFieldMaskBit15 + PerfBitPreciseIPBit2 = CBitFieldMaskBit16 + PerfBitMmapData = CBitFieldMaskBit17 + PerfBitSampleIDAll = CBitFieldMaskBit18 + PerfBitExcludeHost = CBitFieldMaskBit19 + PerfBitExcludeGuest = CBitFieldMaskBit20 + PerfBitExcludeCallchainKernel = CBitFieldMaskBit21 + PerfBitExcludeCallchainUser = CBitFieldMaskBit22 + PerfBitMmap2 = CBitFieldMaskBit23 + PerfBitCommExec = CBitFieldMaskBit24 + PerfBitUseClockID = CBitFieldMaskBit25 + PerfBitContextSwitch = CBitFieldMaskBit26 +) + +const ( + PERF_TYPE_HARDWARE = 0x0 + PERF_TYPE_SOFTWARE = 0x1 + PERF_TYPE_TRACEPOINT = 0x2 + PERF_TYPE_HW_CACHE = 0x3 + PERF_TYPE_RAW = 0x4 + PERF_TYPE_BREAKPOINT = 0x5 + + PERF_COUNT_HW_CPU_CYCLES = 0x0 + PERF_COUNT_HW_INSTRUCTIONS = 0x1 + PERF_COUNT_HW_CACHE_REFERENCES = 0x2 + PERF_COUNT_HW_CACHE_MISSES = 0x3 + PERF_COUNT_HW_BRANCH_INSTRUCTIONS = 0x4 + PERF_COUNT_HW_BRANCH_MISSES = 0x5 + PERF_COUNT_HW_BUS_CYCLES = 0x6 + PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 0x7 + PERF_COUNT_HW_STALLED_CYCLES_BACKEND = 0x8 + PERF_COUNT_HW_REF_CPU_CYCLES = 0x9 + + PERF_COUNT_HW_CACHE_L1D = 0x0 + PERF_COUNT_HW_CACHE_L1I = 0x1 + PERF_COUNT_HW_CACHE_LL = 0x2 + PERF_COUNT_HW_CACHE_DTLB = 0x3 + PERF_COUNT_HW_CACHE_ITLB = 0x4 + PERF_COUNT_HW_CACHE_BPU = 0x5 + PERF_COUNT_HW_CACHE_NODE = 0x6 + + PERF_COUNT_HW_CACHE_OP_READ = 0x0 + PERF_COUNT_HW_CACHE_OP_WRITE = 0x1 + PERF_COUNT_HW_CACHE_OP_PREFETCH = 0x2 + + PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0x0 + PERF_COUNT_HW_CACHE_RESULT_MISS = 0x1 + + PERF_COUNT_SW_CPU_CLOCK = 0x0 + PERF_COUNT_SW_TASK_CLOCK = 0x1 + PERF_COUNT_SW_PAGE_FAULTS = 0x2 + PERF_COUNT_SW_CONTEXT_SWITCHES = 0x3 + PERF_COUNT_SW_CPU_MIGRATIONS = 0x4 + PERF_COUNT_SW_PAGE_FAULTS_MIN = 0x5 + PERF_COUNT_SW_PAGE_FAULTS_MAJ = 0x6 + PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7 + PERF_COUNT_SW_EMULATION_FAULTS = 0x8 + PERF_COUNT_SW_DUMMY = 0x9 + + PERF_SAMPLE_IP = 0x1 + PERF_SAMPLE_TID = 0x2 + PERF_SAMPLE_TIME = 0x4 + PERF_SAMPLE_ADDR = 0x8 + PERF_SAMPLE_READ = 0x10 + PERF_SAMPLE_CALLCHAIN = 0x20 + PERF_SAMPLE_ID = 0x40 + PERF_SAMPLE_CPU = 0x80 + PERF_SAMPLE_PERIOD = 0x100 + PERF_SAMPLE_STREAM_ID = 0x200 + PERF_SAMPLE_RAW = 0x400 + PERF_SAMPLE_BRANCH_STACK = 0x800 + + PERF_SAMPLE_BRANCH_USER = 0x1 + PERF_SAMPLE_BRANCH_KERNEL = 0x2 + PERF_SAMPLE_BRANCH_HV = 0x4 + PERF_SAMPLE_BRANCH_ANY = 0x8 + PERF_SAMPLE_BRANCH_ANY_CALL = 0x10 + PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20 + PERF_SAMPLE_BRANCH_IND_CALL = 0x40 + + PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1 + PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2 + PERF_FORMAT_ID = 0x4 + PERF_FORMAT_GROUP = 0x8 + + PERF_RECORD_MMAP = 0x1 + PERF_RECORD_LOST = 0x2 + PERF_RECORD_COMM = 0x3 + PERF_RECORD_EXIT = 0x4 + PERF_RECORD_THROTTLE = 0x5 + PERF_RECORD_UNTHROTTLE = 0x6 + PERF_RECORD_FORK = 0x7 + PERF_RECORD_READ = 0x8 + PERF_RECORD_SAMPLE = 0x9 + + PERF_CONTEXT_HV = -0x20 + PERF_CONTEXT_KERNEL = -0x80 + PERF_CONTEXT_USER = -0x200 + + PERF_CONTEXT_GUEST = -0x800 + PERF_CONTEXT_GUEST_KERNEL = -0x880 + PERF_CONTEXT_GUEST_USER = -0xa00 + + PERF_FLAG_FD_NO_GROUP = 0x1 + PERF_FLAG_FD_OUTPUT = 0x2 + PERF_FLAG_PID_CGROUP = 0x4 +) + +const ( + CBitFieldMaskBit0 = 0x1 + CBitFieldMaskBit1 = 0x2 + CBitFieldMaskBit2 = 0x4 + CBitFieldMaskBit3 = 0x8 + CBitFieldMaskBit4 = 0x10 + CBitFieldMaskBit5 = 0x20 + CBitFieldMaskBit6 = 0x40 + CBitFieldMaskBit7 = 0x80 + CBitFieldMaskBit8 = 0x100 + CBitFieldMaskBit9 = 0x200 + CBitFieldMaskBit10 = 0x400 + CBitFieldMaskBit11 = 0x800 + CBitFieldMaskBit12 = 0x1000 + CBitFieldMaskBit13 = 0x2000 + CBitFieldMaskBit14 = 0x4000 + CBitFieldMaskBit15 = 0x8000 + CBitFieldMaskBit16 = 0x10000 + CBitFieldMaskBit17 = 0x20000 + CBitFieldMaskBit18 = 0x40000 + CBitFieldMaskBit19 = 0x80000 + CBitFieldMaskBit20 = 0x100000 + CBitFieldMaskBit21 = 0x200000 + CBitFieldMaskBit22 = 0x400000 + CBitFieldMaskBit23 = 0x800000 + CBitFieldMaskBit24 = 0x1000000 + CBitFieldMaskBit25 = 0x2000000 + CBitFieldMaskBit26 = 0x4000000 + CBitFieldMaskBit27 = 0x8000000 + CBitFieldMaskBit28 = 0x10000000 + CBitFieldMaskBit29 = 0x20000000 + CBitFieldMaskBit30 = 0x40000000 + CBitFieldMaskBit31 = 0x80000000 + CBitFieldMaskBit32 = 0x100000000 + CBitFieldMaskBit33 = 0x200000000 + CBitFieldMaskBit34 = 0x400000000 + CBitFieldMaskBit35 = 0x800000000 + CBitFieldMaskBit36 = 0x1000000000 + CBitFieldMaskBit37 = 0x2000000000 + CBitFieldMaskBit38 = 0x4000000000 + CBitFieldMaskBit39 = 0x8000000000 + CBitFieldMaskBit40 = 0x10000000000 + CBitFieldMaskBit41 = 0x20000000000 + CBitFieldMaskBit42 = 0x40000000000 + CBitFieldMaskBit43 = 0x80000000000 + CBitFieldMaskBit44 = 0x100000000000 + CBitFieldMaskBit45 = 0x200000000000 + CBitFieldMaskBit46 = 0x400000000000 + CBitFieldMaskBit47 = 0x800000000000 + CBitFieldMaskBit48 = 0x1000000000000 + CBitFieldMaskBit49 = 0x2000000000000 + CBitFieldMaskBit50 = 0x4000000000000 + CBitFieldMaskBit51 = 0x8000000000000 + CBitFieldMaskBit52 = 0x10000000000000 + CBitFieldMaskBit53 = 0x20000000000000 + CBitFieldMaskBit54 = 0x40000000000000 + CBitFieldMaskBit55 = 0x80000000000000 + CBitFieldMaskBit56 = 0x100000000000000 + CBitFieldMaskBit57 = 0x200000000000000 + CBitFieldMaskBit58 = 0x400000000000000 + CBitFieldMaskBit59 = 0x800000000000000 + CBitFieldMaskBit60 = 0x1000000000000000 + CBitFieldMaskBit61 = 0x2000000000000000 + CBitFieldMaskBit62 = 0x4000000000000000 + CBitFieldMaskBit63 = 0x8000000000000000 +) + +type SockaddrStorage struct { + Family uint16 + _ [118]int8 + _ uint64 +} + +type TCPMD5Sig struct { + Addr SockaddrStorage + Flags uint8 + Prefixlen uint8 + Keylen uint16 + _ uint32 + Key [80]uint8 +} + +type HDDriveCmdHdr struct { + Command uint8 + Number uint8 + Feature uint8 + Count uint8 +} + +type HDGeometry struct { + Heads uint8 + Sectors uint8 + Cylinders uint16 + _ [4]byte + Start uint64 +} + +type HDDriveID struct { + Config uint16 + Cyls uint16 + Reserved2 uint16 + Heads uint16 + Track_bytes uint16 + Sector_bytes uint16 + Sectors uint16 + Vendor0 uint16 + Vendor1 uint16 + Vendor2 uint16 + Serial_no [20]uint8 + Buf_type uint16 + Buf_size uint16 + Ecc_bytes uint16 + Fw_rev [8]uint8 + Model [40]uint8 + Max_multsect uint8 + Vendor3 uint8 + Dword_io uint16 + Vendor4 uint8 + Capability uint8 + Reserved50 uint16 + Vendor5 uint8 + TPIO uint8 + Vendor6 uint8 + TDMA uint8 + Field_valid uint16 + Cur_cyls uint16 + Cur_heads uint16 + Cur_sectors uint16 + Cur_capacity0 uint16 + Cur_capacity1 uint16 + Multsect uint8 + Multsect_valid uint8 + Lba_capacity uint32 + Dma_1word uint16 + Dma_mword uint16 + Eide_pio_modes uint16 + Eide_dma_min uint16 + Eide_dma_time uint16 + Eide_pio uint16 + Eide_pio_iordy uint16 + Words69_70 [2]uint16 + Words71_74 [4]uint16 + Queue_depth uint16 + Words76_79 [4]uint16 + Major_rev_num uint16 + Minor_rev_num uint16 + Command_set_1 uint16 + Command_set_2 uint16 + Cfsse uint16 + Cfs_enable_1 uint16 + Cfs_enable_2 uint16 + Csf_default uint16 + Dma_ultra uint16 + Trseuc uint16 + TrsEuc uint16 + CurAPMvalues uint16 + Mprc uint16 + Hw_config uint16 + Acoustic uint16 + Msrqs uint16 + Sxfert uint16 + Sal uint16 + Spg uint32 + Lba_capacity_2 uint64 + Words104_125 [22]uint16 + Last_lun uint16 + Word127 uint16 + Dlf uint16 + Csfo uint16 + Words130_155 [26]uint16 + Word156 uint16 + Words157_159 [3]uint16 + Cfa_power uint16 + Words161_175 [15]uint16 + Words176_205 [30]uint16 + Words206_254 [49]uint16 + Integrity_word uint16 +} + +type Statfs_t struct { + Type int64 + Bsize int64 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Namelen int64 + Frsize int64 + Flags int64 + Spare [4]int64 +} + +const ( + ST_MANDLOCK = 0x40 + ST_NOATIME = 0x400 + ST_NODEV = 0x4 + ST_NODIRATIME = 0x800 + ST_NOEXEC = 0x8 + ST_NOSUID = 0x2 + ST_RDONLY = 0x1 + ST_RELATIME = 0x1000 + ST_SYNCHRONOUS = 0x10 +) + +type TpacketHdr struct { + Status uint64 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Sec uint32 + Usec uint32 + _ [4]byte +} + +type Tpacket2Hdr struct { + Status uint32 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Sec uint32 + Nsec uint32 + Vlan_tci uint16 + Vlan_tpid uint16 + _ [4]uint8 +} + +type Tpacket3Hdr struct { + Next_offset uint32 + Sec uint32 + Nsec uint32 + Snaplen uint32 + Len uint32 + Status uint32 + Mac uint16 + Net uint16 + Hv1 TpacketHdrVariant1 + _ [8]uint8 +} + +type TpacketHdrVariant1 struct { + Rxhash uint32 + Vlan_tci uint32 + Vlan_tpid uint16 + _ uint16 +} + +type TpacketBlockDesc struct { + Version uint32 + To_priv uint32 + Hdr [40]byte +} + +type TpacketReq struct { + Block_size uint32 + Block_nr uint32 + Frame_size uint32 + Frame_nr uint32 +} + +type TpacketReq3 struct { + Block_size uint32 + Block_nr uint32 + Frame_size uint32 + Frame_nr uint32 + Retire_blk_tov uint32 + Sizeof_priv uint32 + Feature_req_word uint32 +} + +type TpacketStats struct { + Packets uint32 + Drops uint32 +} + +type TpacketStatsV3 struct { + Packets uint32 + Drops uint32 + Freeze_q_cnt uint32 +} + +type TpacketAuxdata struct { + Status uint32 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Vlan_tci uint16 + Vlan_tpid uint16 +} + +const ( + TPACKET_V1 = 0x0 + TPACKET_V2 = 0x1 + TPACKET_V3 = 0x2 +) + +const ( + SizeofTpacketHdr = 0x20 + SizeofTpacket2Hdr = 0x20 + SizeofTpacket3Hdr = 0x30 +) + +const ( + NF_INET_PRE_ROUTING = 0x0 + NF_INET_LOCAL_IN = 0x1 + NF_INET_FORWARD = 0x2 + NF_INET_LOCAL_OUT = 0x3 + NF_INET_POST_ROUTING = 0x4 + NF_INET_NUMHOOKS = 0x5 +) + +const ( + NF_NETDEV_INGRESS = 0x0 + NF_NETDEV_NUMHOOKS = 0x1 +) + +const ( + NFPROTO_UNSPEC = 0x0 + NFPROTO_INET = 0x1 + NFPROTO_IPV4 = 0x2 + NFPROTO_ARP = 0x3 + NFPROTO_NETDEV = 0x5 + NFPROTO_BRIDGE = 0x7 + NFPROTO_IPV6 = 0xa + NFPROTO_DECNET = 0xc + NFPROTO_NUMPROTO = 0xd +) + +type Nfgenmsg struct { + Nfgen_family uint8 + Version uint8 + Res_id uint16 +} + +const ( + NFNL_BATCH_UNSPEC = 0x0 + NFNL_BATCH_GENID = 0x1 +) + +const ( + NFT_REG_VERDICT = 0x0 + NFT_REG_1 = 0x1 + NFT_REG_2 = 0x2 + NFT_REG_3 = 0x3 + NFT_REG_4 = 0x4 + NFT_REG32_00 = 0x8 + NFT_REG32_01 = 0x9 + NFT_REG32_02 = 0xa + NFT_REG32_03 = 0xb + NFT_REG32_04 = 0xc + NFT_REG32_05 = 0xd + NFT_REG32_06 = 0xe + NFT_REG32_07 = 0xf + NFT_REG32_08 = 0x10 + NFT_REG32_09 = 0x11 + NFT_REG32_10 = 0x12 + NFT_REG32_11 = 0x13 + NFT_REG32_12 = 0x14 + NFT_REG32_13 = 0x15 + NFT_REG32_14 = 0x16 + NFT_REG32_15 = 0x17 + NFT_CONTINUE = -0x1 + NFT_BREAK = -0x2 + NFT_JUMP = -0x3 + NFT_GOTO = -0x4 + NFT_RETURN = -0x5 + NFT_MSG_NEWTABLE = 0x0 + NFT_MSG_GETTABLE = 0x1 + NFT_MSG_DELTABLE = 0x2 + NFT_MSG_NEWCHAIN = 0x3 + NFT_MSG_GETCHAIN = 0x4 + NFT_MSG_DELCHAIN = 0x5 + NFT_MSG_NEWRULE = 0x6 + NFT_MSG_GETRULE = 0x7 + NFT_MSG_DELRULE = 0x8 + NFT_MSG_NEWSET = 0x9 + NFT_MSG_GETSET = 0xa + NFT_MSG_DELSET = 0xb + NFT_MSG_NEWSETELEM = 0xc + NFT_MSG_GETSETELEM = 0xd + NFT_MSG_DELSETELEM = 0xe + NFT_MSG_NEWGEN = 0xf + NFT_MSG_GETGEN = 0x10 + NFT_MSG_TRACE = 0x11 + NFT_MSG_NEWOBJ = 0x12 + NFT_MSG_GETOBJ = 0x13 + NFT_MSG_DELOBJ = 0x14 + NFT_MSG_GETOBJ_RESET = 0x15 + NFT_MSG_MAX = 0x19 + NFTA_LIST_UNPEC = 0x0 + NFTA_LIST_ELEM = 0x1 + NFTA_HOOK_UNSPEC = 0x0 + NFTA_HOOK_HOOKNUM = 0x1 + NFTA_HOOK_PRIORITY = 0x2 + NFTA_HOOK_DEV = 0x3 + NFT_TABLE_F_DORMANT = 0x1 + NFTA_TABLE_UNSPEC = 0x0 + NFTA_TABLE_NAME = 0x1 + NFTA_TABLE_FLAGS = 0x2 + NFTA_TABLE_USE = 0x3 + NFTA_CHAIN_UNSPEC = 0x0 + NFTA_CHAIN_TABLE = 0x1 + NFTA_CHAIN_HANDLE = 0x2 + NFTA_CHAIN_NAME = 0x3 + NFTA_CHAIN_HOOK = 0x4 + NFTA_CHAIN_POLICY = 0x5 + NFTA_CHAIN_USE = 0x6 + NFTA_CHAIN_TYPE = 0x7 + NFTA_CHAIN_COUNTERS = 0x8 + NFTA_CHAIN_PAD = 0x9 + NFTA_RULE_UNSPEC = 0x0 + NFTA_RULE_TABLE = 0x1 + NFTA_RULE_CHAIN = 0x2 + NFTA_RULE_HANDLE = 0x3 + NFTA_RULE_EXPRESSIONS = 0x4 + NFTA_RULE_COMPAT = 0x5 + NFTA_RULE_POSITION = 0x6 + NFTA_RULE_USERDATA = 0x7 + NFTA_RULE_PAD = 0x8 + NFTA_RULE_ID = 0x9 + NFT_RULE_COMPAT_F_INV = 0x2 + NFT_RULE_COMPAT_F_MASK = 0x2 + NFTA_RULE_COMPAT_UNSPEC = 0x0 + NFTA_RULE_COMPAT_PROTO = 0x1 + NFTA_RULE_COMPAT_FLAGS = 0x2 + NFT_SET_ANONYMOUS = 0x1 + NFT_SET_CONSTANT = 0x2 + NFT_SET_INTERVAL = 0x4 + NFT_SET_MAP = 0x8 + NFT_SET_TIMEOUT = 0x10 + NFT_SET_EVAL = 0x20 + NFT_SET_OBJECT = 0x40 + NFT_SET_POL_PERFORMANCE = 0x0 + NFT_SET_POL_MEMORY = 0x1 + NFTA_SET_DESC_UNSPEC = 0x0 + NFTA_SET_DESC_SIZE = 0x1 + NFTA_SET_UNSPEC = 0x0 + NFTA_SET_TABLE = 0x1 + NFTA_SET_NAME = 0x2 + NFTA_SET_FLAGS = 0x3 + NFTA_SET_KEY_TYPE = 0x4 + NFTA_SET_KEY_LEN = 0x5 + NFTA_SET_DATA_TYPE = 0x6 + NFTA_SET_DATA_LEN = 0x7 + NFTA_SET_POLICY = 0x8 + NFTA_SET_DESC = 0x9 + NFTA_SET_ID = 0xa + NFTA_SET_TIMEOUT = 0xb + NFTA_SET_GC_INTERVAL = 0xc + NFTA_SET_USERDATA = 0xd + NFTA_SET_PAD = 0xe + NFTA_SET_OBJ_TYPE = 0xf + NFT_SET_ELEM_INTERVAL_END = 0x1 + NFTA_SET_ELEM_UNSPEC = 0x0 + NFTA_SET_ELEM_KEY = 0x1 + NFTA_SET_ELEM_DATA = 0x2 + NFTA_SET_ELEM_FLAGS = 0x3 + NFTA_SET_ELEM_TIMEOUT = 0x4 + NFTA_SET_ELEM_EXPIRATION = 0x5 + NFTA_SET_ELEM_USERDATA = 0x6 + NFTA_SET_ELEM_EXPR = 0x7 + NFTA_SET_ELEM_PAD = 0x8 + NFTA_SET_ELEM_OBJREF = 0x9 + NFTA_SET_ELEM_LIST_UNSPEC = 0x0 + NFTA_SET_ELEM_LIST_TABLE = 0x1 + NFTA_SET_ELEM_LIST_SET = 0x2 + NFTA_SET_ELEM_LIST_ELEMENTS = 0x3 + NFTA_SET_ELEM_LIST_SET_ID = 0x4 + NFT_DATA_VALUE = 0x0 + NFT_DATA_VERDICT = 0xffffff00 + NFTA_DATA_UNSPEC = 0x0 + NFTA_DATA_VALUE = 0x1 + NFTA_DATA_VERDICT = 0x2 + NFTA_VERDICT_UNSPEC = 0x0 + NFTA_VERDICT_CODE = 0x1 + NFTA_VERDICT_CHAIN = 0x2 + NFTA_EXPR_UNSPEC = 0x0 + NFTA_EXPR_NAME = 0x1 + NFTA_EXPR_DATA = 0x2 + NFTA_IMMEDIATE_UNSPEC = 0x0 + NFTA_IMMEDIATE_DREG = 0x1 + NFTA_IMMEDIATE_DATA = 0x2 + NFTA_BITWISE_UNSPEC = 0x0 + NFTA_BITWISE_SREG = 0x1 + NFTA_BITWISE_DREG = 0x2 + NFTA_BITWISE_LEN = 0x3 + NFTA_BITWISE_MASK = 0x4 + NFTA_BITWISE_XOR = 0x5 + NFT_BYTEORDER_NTOH = 0x0 + NFT_BYTEORDER_HTON = 0x1 + NFTA_BYTEORDER_UNSPEC = 0x0 + NFTA_BYTEORDER_SREG = 0x1 + NFTA_BYTEORDER_DREG = 0x2 + NFTA_BYTEORDER_OP = 0x3 + NFTA_BYTEORDER_LEN = 0x4 + NFTA_BYTEORDER_SIZE = 0x5 + NFT_CMP_EQ = 0x0 + NFT_CMP_NEQ = 0x1 + NFT_CMP_LT = 0x2 + NFT_CMP_LTE = 0x3 + NFT_CMP_GT = 0x4 + NFT_CMP_GTE = 0x5 + NFTA_CMP_UNSPEC = 0x0 + NFTA_CMP_SREG = 0x1 + NFTA_CMP_OP = 0x2 + NFTA_CMP_DATA = 0x3 + NFT_RANGE_EQ = 0x0 + NFT_RANGE_NEQ = 0x1 + NFTA_RANGE_UNSPEC = 0x0 + NFTA_RANGE_SREG = 0x1 + NFTA_RANGE_OP = 0x2 + NFTA_RANGE_FROM_DATA = 0x3 + NFTA_RANGE_TO_DATA = 0x4 + NFT_LOOKUP_F_INV = 0x1 + NFTA_LOOKUP_UNSPEC = 0x0 + NFTA_LOOKUP_SET = 0x1 + NFTA_LOOKUP_SREG = 0x2 + NFTA_LOOKUP_DREG = 0x3 + NFTA_LOOKUP_SET_ID = 0x4 + NFTA_LOOKUP_FLAGS = 0x5 + NFT_DYNSET_OP_ADD = 0x0 + NFT_DYNSET_OP_UPDATE = 0x1 + NFT_DYNSET_F_INV = 0x1 + NFTA_DYNSET_UNSPEC = 0x0 + NFTA_DYNSET_SET_NAME = 0x1 + NFTA_DYNSET_SET_ID = 0x2 + NFTA_DYNSET_OP = 0x3 + NFTA_DYNSET_SREG_KEY = 0x4 + NFTA_DYNSET_SREG_DATA = 0x5 + NFTA_DYNSET_TIMEOUT = 0x6 + NFTA_DYNSET_EXPR = 0x7 + NFTA_DYNSET_PAD = 0x8 + NFTA_DYNSET_FLAGS = 0x9 + NFT_PAYLOAD_LL_HEADER = 0x0 + NFT_PAYLOAD_NETWORK_HEADER = 0x1 + NFT_PAYLOAD_TRANSPORT_HEADER = 0x2 + NFT_PAYLOAD_CSUM_NONE = 0x0 + NFT_PAYLOAD_CSUM_INET = 0x1 + NFT_PAYLOAD_L4CSUM_PSEUDOHDR = 0x1 + NFTA_PAYLOAD_UNSPEC = 0x0 + NFTA_PAYLOAD_DREG = 0x1 + NFTA_PAYLOAD_BASE = 0x2 + NFTA_PAYLOAD_OFFSET = 0x3 + NFTA_PAYLOAD_LEN = 0x4 + NFTA_PAYLOAD_SREG = 0x5 + NFTA_PAYLOAD_CSUM_TYPE = 0x6 + NFTA_PAYLOAD_CSUM_OFFSET = 0x7 + NFTA_PAYLOAD_CSUM_FLAGS = 0x8 + NFT_EXTHDR_F_PRESENT = 0x1 + NFT_EXTHDR_OP_IPV6 = 0x0 + NFT_EXTHDR_OP_TCPOPT = 0x1 + NFTA_EXTHDR_UNSPEC = 0x0 + NFTA_EXTHDR_DREG = 0x1 + NFTA_EXTHDR_TYPE = 0x2 + NFTA_EXTHDR_OFFSET = 0x3 + NFTA_EXTHDR_LEN = 0x4 + NFTA_EXTHDR_FLAGS = 0x5 + NFTA_EXTHDR_OP = 0x6 + NFTA_EXTHDR_SREG = 0x7 + NFT_META_LEN = 0x0 + NFT_META_PROTOCOL = 0x1 + NFT_META_PRIORITY = 0x2 + NFT_META_MARK = 0x3 + NFT_META_IIF = 0x4 + NFT_META_OIF = 0x5 + NFT_META_IIFNAME = 0x6 + NFT_META_OIFNAME = 0x7 + NFT_META_IIFTYPE = 0x8 + NFT_META_OIFTYPE = 0x9 + NFT_META_SKUID = 0xa + NFT_META_SKGID = 0xb + NFT_META_NFTRACE = 0xc + NFT_META_RTCLASSID = 0xd + NFT_META_SECMARK = 0xe + NFT_META_NFPROTO = 0xf + NFT_META_L4PROTO = 0x10 + NFT_META_BRI_IIFNAME = 0x11 + NFT_META_BRI_OIFNAME = 0x12 + NFT_META_PKTTYPE = 0x13 + NFT_META_CPU = 0x14 + NFT_META_IIFGROUP = 0x15 + NFT_META_OIFGROUP = 0x16 + NFT_META_CGROUP = 0x17 + NFT_META_PRANDOM = 0x18 + NFT_RT_CLASSID = 0x0 + NFT_RT_NEXTHOP4 = 0x1 + NFT_RT_NEXTHOP6 = 0x2 + NFT_RT_TCPMSS = 0x3 + NFT_HASH_JENKINS = 0x0 + NFT_HASH_SYM = 0x1 + NFTA_HASH_UNSPEC = 0x0 + NFTA_HASH_SREG = 0x1 + NFTA_HASH_DREG = 0x2 + NFTA_HASH_LEN = 0x3 + NFTA_HASH_MODULUS = 0x4 + NFTA_HASH_SEED = 0x5 + NFTA_HASH_OFFSET = 0x6 + NFTA_HASH_TYPE = 0x7 + NFTA_META_UNSPEC = 0x0 + NFTA_META_DREG = 0x1 + NFTA_META_KEY = 0x2 + NFTA_META_SREG = 0x3 + NFTA_RT_UNSPEC = 0x0 + NFTA_RT_DREG = 0x1 + NFTA_RT_KEY = 0x2 + NFT_CT_STATE = 0x0 + NFT_CT_DIRECTION = 0x1 + NFT_CT_STATUS = 0x2 + NFT_CT_MARK = 0x3 + NFT_CT_SECMARK = 0x4 + NFT_CT_EXPIRATION = 0x5 + NFT_CT_HELPER = 0x6 + NFT_CT_L3PROTOCOL = 0x7 + NFT_CT_SRC = 0x8 + NFT_CT_DST = 0x9 + NFT_CT_PROTOCOL = 0xa + NFT_CT_PROTO_SRC = 0xb + NFT_CT_PROTO_DST = 0xc + NFT_CT_LABELS = 0xd + NFT_CT_PKTS = 0xe + NFT_CT_BYTES = 0xf + NFT_CT_AVGPKT = 0x10 + NFT_CT_ZONE = 0x11 + NFT_CT_EVENTMASK = 0x12 + NFTA_CT_UNSPEC = 0x0 + NFTA_CT_DREG = 0x1 + NFTA_CT_KEY = 0x2 + NFTA_CT_DIRECTION = 0x3 + NFTA_CT_SREG = 0x4 + NFT_LIMIT_PKTS = 0x0 + NFT_LIMIT_PKT_BYTES = 0x1 + NFT_LIMIT_F_INV = 0x1 + NFTA_LIMIT_UNSPEC = 0x0 + NFTA_LIMIT_RATE = 0x1 + NFTA_LIMIT_UNIT = 0x2 + NFTA_LIMIT_BURST = 0x3 + NFTA_LIMIT_TYPE = 0x4 + NFTA_LIMIT_FLAGS = 0x5 + NFTA_LIMIT_PAD = 0x6 + NFTA_COUNTER_UNSPEC = 0x0 + NFTA_COUNTER_BYTES = 0x1 + NFTA_COUNTER_PACKETS = 0x2 + NFTA_COUNTER_PAD = 0x3 + NFTA_LOG_UNSPEC = 0x0 + NFTA_LOG_GROUP = 0x1 + NFTA_LOG_PREFIX = 0x2 + NFTA_LOG_SNAPLEN = 0x3 + NFTA_LOG_QTHRESHOLD = 0x4 + NFTA_LOG_LEVEL = 0x5 + NFTA_LOG_FLAGS = 0x6 + NFTA_QUEUE_UNSPEC = 0x0 + NFTA_QUEUE_NUM = 0x1 + NFTA_QUEUE_TOTAL = 0x2 + NFTA_QUEUE_FLAGS = 0x3 + NFTA_QUEUE_SREG_QNUM = 0x4 + NFT_QUOTA_F_INV = 0x1 + NFT_QUOTA_F_DEPLETED = 0x2 + NFTA_QUOTA_UNSPEC = 0x0 + NFTA_QUOTA_BYTES = 0x1 + NFTA_QUOTA_FLAGS = 0x2 + NFTA_QUOTA_PAD = 0x3 + NFTA_QUOTA_CONSUMED = 0x4 + NFT_REJECT_ICMP_UNREACH = 0x0 + NFT_REJECT_TCP_RST = 0x1 + NFT_REJECT_ICMPX_UNREACH = 0x2 + NFT_REJECT_ICMPX_NO_ROUTE = 0x0 + NFT_REJECT_ICMPX_PORT_UNREACH = 0x1 + NFT_REJECT_ICMPX_HOST_UNREACH = 0x2 + NFT_REJECT_ICMPX_ADMIN_PROHIBITED = 0x3 + NFTA_REJECT_UNSPEC = 0x0 + NFTA_REJECT_TYPE = 0x1 + NFTA_REJECT_ICMP_CODE = 0x2 + NFT_NAT_SNAT = 0x0 + NFT_NAT_DNAT = 0x1 + NFTA_NAT_UNSPEC = 0x0 + NFTA_NAT_TYPE = 0x1 + NFTA_NAT_FAMILY = 0x2 + NFTA_NAT_REG_ADDR_MIN = 0x3 + NFTA_NAT_REG_ADDR_MAX = 0x4 + NFTA_NAT_REG_PROTO_MIN = 0x5 + NFTA_NAT_REG_PROTO_MAX = 0x6 + NFTA_NAT_FLAGS = 0x7 + NFTA_MASQ_UNSPEC = 0x0 + NFTA_MASQ_FLAGS = 0x1 + NFTA_MASQ_REG_PROTO_MIN = 0x2 + NFTA_MASQ_REG_PROTO_MAX = 0x3 + NFTA_REDIR_UNSPEC = 0x0 + NFTA_REDIR_REG_PROTO_MIN = 0x1 + NFTA_REDIR_REG_PROTO_MAX = 0x2 + NFTA_REDIR_FLAGS = 0x3 + NFTA_DUP_UNSPEC = 0x0 + NFTA_DUP_SREG_ADDR = 0x1 + NFTA_DUP_SREG_DEV = 0x2 + NFTA_FWD_UNSPEC = 0x0 + NFTA_FWD_SREG_DEV = 0x1 + NFTA_OBJREF_UNSPEC = 0x0 + NFTA_OBJREF_IMM_TYPE = 0x1 + NFTA_OBJREF_IMM_NAME = 0x2 + NFTA_OBJREF_SET_SREG = 0x3 + NFTA_OBJREF_SET_NAME = 0x4 + NFTA_OBJREF_SET_ID = 0x5 + NFTA_GEN_UNSPEC = 0x0 + NFTA_GEN_ID = 0x1 + NFTA_GEN_PROC_PID = 0x2 + NFTA_GEN_PROC_NAME = 0x3 + NFTA_FIB_UNSPEC = 0x0 + NFTA_FIB_DREG = 0x1 + NFTA_FIB_RESULT = 0x2 + NFTA_FIB_FLAGS = 0x3 + NFT_FIB_RESULT_UNSPEC = 0x0 + NFT_FIB_RESULT_OIF = 0x1 + NFT_FIB_RESULT_OIFNAME = 0x2 + NFT_FIB_RESULT_ADDRTYPE = 0x3 + NFTA_FIB_F_SADDR = 0x1 + NFTA_FIB_F_DADDR = 0x2 + NFTA_FIB_F_MARK = 0x4 + NFTA_FIB_F_IIF = 0x8 + NFTA_FIB_F_OIF = 0x10 + NFTA_FIB_F_PRESENT = 0x20 + NFTA_CT_HELPER_UNSPEC = 0x0 + NFTA_CT_HELPER_NAME = 0x1 + NFTA_CT_HELPER_L3PROTO = 0x2 + NFTA_CT_HELPER_L4PROTO = 0x3 + NFTA_OBJ_UNSPEC = 0x0 + NFTA_OBJ_TABLE = 0x1 + NFTA_OBJ_NAME = 0x2 + NFTA_OBJ_TYPE = 0x3 + NFTA_OBJ_DATA = 0x4 + NFTA_OBJ_USE = 0x5 + NFTA_TRACE_UNSPEC = 0x0 + NFTA_TRACE_TABLE = 0x1 + NFTA_TRACE_CHAIN = 0x2 + NFTA_TRACE_RULE_HANDLE = 0x3 + NFTA_TRACE_TYPE = 0x4 + NFTA_TRACE_VERDICT = 0x5 + NFTA_TRACE_ID = 0x6 + NFTA_TRACE_LL_HEADER = 0x7 + NFTA_TRACE_NETWORK_HEADER = 0x8 + NFTA_TRACE_TRANSPORT_HEADER = 0x9 + NFTA_TRACE_IIF = 0xa + NFTA_TRACE_IIFTYPE = 0xb + NFTA_TRACE_OIF = 0xc + NFTA_TRACE_OIFTYPE = 0xd + NFTA_TRACE_MARK = 0xe + NFTA_TRACE_NFPROTO = 0xf + NFTA_TRACE_POLICY = 0x10 + NFTA_TRACE_PAD = 0x11 + NFT_TRACETYPE_UNSPEC = 0x0 + NFT_TRACETYPE_POLICY = 0x1 + NFT_TRACETYPE_RETURN = 0x2 + NFT_TRACETYPE_RULE = 0x3 + NFTA_NG_UNSPEC = 0x0 + NFTA_NG_DREG = 0x1 + NFTA_NG_MODULUS = 0x2 + NFTA_NG_TYPE = 0x3 + NFTA_NG_OFFSET = 0x4 + NFT_NG_INCREMENTAL = 0x0 + NFT_NG_RANDOM = 0x1 +) + +type RTCTime struct { + Sec int32 + Min int32 + Hour int32 + Mday int32 + Mon int32 + Year int32 + Wday int32 + Yday int32 + Isdst int32 +} + +type RTCWkAlrm struct { + Enabled uint8 + Pending uint8 + _ [2]byte + Time RTCTime +} + +type RTCPLLInfo struct { + Ctrl int32 + Value int32 + Max int32 + Min int32 + Posmult int32 + Negmult int32 + Clock int64 +} + +type BlkpgIoctlArg struct { + Op int32 + Flags int32 + Datalen int32 + _ [4]byte + Data *byte +} + +type BlkpgPartition struct { + Start int64 + Length int64 + Pno int32 + Devname [64]uint8 + Volname [64]uint8 + _ [4]byte +} + +const ( + BLKPG = 0x1269 + BLKPG_ADD_PARTITION = 0x1 + BLKPG_DEL_PARTITION = 0x2 + BLKPG_RESIZE_PARTITION = 0x3 +) + +const ( + NETNSA_NONE = 0x0 + NETNSA_NSID = 0x1 + NETNSA_PID = 0x2 + NETNSA_FD = 0x3 +) + +type XDPRingOffset struct { + Producer uint64 + Consumer uint64 + Desc uint64 +} + +type XDPMmapOffsets struct { + Rx XDPRingOffset + Tx XDPRingOffset + Fr XDPRingOffset + Cr XDPRingOffset +} + +type XDPUmemReg struct { + Addr uint64 + Len uint64 + Size uint32 + Headroom uint32 +} + +type XDPStatistics struct { + Rx_dropped uint64 + Rx_invalid_descs uint64 + Tx_invalid_descs uint64 +} + +type XDPDesc struct { + Addr uint64 + Len uint32 + Options uint32 +} + +const ( + NCSI_CMD_UNSPEC = 0x0 + NCSI_CMD_PKG_INFO = 0x1 + NCSI_CMD_SET_INTERFACE = 0x2 + NCSI_CMD_CLEAR_INTERFACE = 0x3 + NCSI_ATTR_UNSPEC = 0x0 + NCSI_ATTR_IFINDEX = 0x1 + NCSI_ATTR_PACKAGE_LIST = 0x2 + NCSI_ATTR_PACKAGE_ID = 0x3 + NCSI_ATTR_CHANNEL_ID = 0x4 + NCSI_PKG_ATTR_UNSPEC = 0x0 + NCSI_PKG_ATTR = 0x1 + NCSI_PKG_ATTR_ID = 0x2 + NCSI_PKG_ATTR_FORCED = 0x3 + NCSI_PKG_ATTR_CHANNEL_LIST = 0x4 + NCSI_CHANNEL_ATTR_UNSPEC = 0x0 + NCSI_CHANNEL_ATTR = 0x1 + NCSI_CHANNEL_ATTR_ID = 0x2 + NCSI_CHANNEL_ATTR_VERSION_MAJOR = 0x3 + NCSI_CHANNEL_ATTR_VERSION_MINOR = 0x4 + NCSI_CHANNEL_ATTR_VERSION_STR = 0x5 + NCSI_CHANNEL_ATTR_LINK_STATE = 0x6 + NCSI_CHANNEL_ATTR_ACTIVE = 0x7 + NCSI_CHANNEL_ATTR_FORCED = 0x8 + NCSI_CHANNEL_ATTR_VLAN_LIST = 0x9 + NCSI_CHANNEL_ATTR_VLAN_ID = 0xa +) + +const ( + SOF_TIMESTAMPING_TX_HARDWARE = 0x1 + SOF_TIMESTAMPING_TX_SOFTWARE = 0x2 + SOF_TIMESTAMPING_RX_HARDWARE = 0x4 + SOF_TIMESTAMPING_RX_SOFTWARE = 0x8 + SOF_TIMESTAMPING_SOFTWARE = 0x10 + SOF_TIMESTAMPING_SYS_HARDWARE = 0x20 + SOF_TIMESTAMPING_RAW_HARDWARE = 0x40 + SOF_TIMESTAMPING_OPT_ID = 0x80 + SOF_TIMESTAMPING_TX_SCHED = 0x100 + SOF_TIMESTAMPING_TX_ACK = 0x200 + SOF_TIMESTAMPING_OPT_CMSG = 0x400 + SOF_TIMESTAMPING_OPT_TSONLY = 0x800 + SOF_TIMESTAMPING_OPT_STATS = 0x1000 + SOF_TIMESTAMPING_OPT_PKTINFO = 0x2000 + SOF_TIMESTAMPING_OPT_TX_SWHW = 0x4000 + + SOF_TIMESTAMPING_LAST = 0x4000 + SOF_TIMESTAMPING_MASK = 0x7fff +) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go new file mode 100644 index 00000000..b8c3d0a4 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go @@ -0,0 +1,1983 @@ +// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build mips,linux + +package unix + +const ( + SizeofPtr = 0x4 + SizeofShort = 0x2 + SizeofInt = 0x4 + SizeofLong = 0x4 + SizeofLongLong = 0x8 + PathMax = 0x1000 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int32 + Nsec int32 +} + +type Timeval struct { + Sec int32 + Usec int32 +} + +type Timex struct { + Modes uint32 + Offset int32 + Freq int32 + Maxerror int32 + Esterror int32 + Status int32 + Constant int32 + Precision int32 + Tolerance int32 + Time Timeval + Tick int32 + Ppsfreq int32 + Jitter int32 + Shift int32 + Stabil int32 + Jitcnt int32 + Calcnt int32 + Errcnt int32 + Stbcnt int32 + Tai int32 + _ [44]byte +} + +type Time_t int32 + +type Tms struct { + Utime int32 + Stime int32 + Cutime int32 + Cstime int32 +} + +type Utimbuf struct { + Actime int32 + Modtime int32 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint32 + Pad1 [3]int32 + Ino uint64 + Mode uint32 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev uint32 + Pad2 [3]int32 + Size int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + Blksize int32 + Pad4 int32 + Blocks int64 + Pad5 [14]int32 +} + +type StatxTimestamp struct { + Sec int64 + Nsec uint32 + _ int32 +} + +type Statx_t struct { + Mask uint32 + Blksize uint32 + Attributes uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Mode uint16 + _ [1]uint16 + Ino uint64 + Size uint64 + Blocks uint64 + Attributes_mask uint64 + Atime StatxTimestamp + Btime StatxTimestamp + Ctime StatxTimestamp + Mtime StatxTimestamp + Rdev_major uint32 + Rdev_minor uint32 + Dev_major uint32 + Dev_minor uint32 + _ [14]uint64 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]int8 + _ [5]byte +} + +type Fsid struct { + Val [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + _ [4]byte + Start int64 + Len int64 + Pid int32 + _ [4]byte +} + +type FscryptPolicy struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptKey struct { + Mode uint32 + Raw [64]uint8 + Size uint32 +} + +type KeyctlDHParams struct { + Private int32 + Prime int32 + Base int32 +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddrL2 struct { + Family uint16 + Psm uint16 + Bdaddr [6]uint8 + Cid uint16 + Bdaddr_type uint8 + _ [1]byte +} + +type RawSockaddrRFCOMM struct { + Family uint16 + Bdaddr [6]uint8 + Channel uint8 + _ [1]byte +} + +type RawSockaddrCAN struct { + Family uint16 + _ [2]byte + Ifindex int32 + Addr [8]byte +} + +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + +type RawSockaddrXDP struct { + Family uint16 + Flags uint16 + Ifindex uint32 + Queue_id uint32 + Shared_umem_fd uint32 +} + +type RawSockaddr struct { + Family uint16 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type PacketMreq struct { + Ifindex int32 + Type uint16 + Alen uint16 + Address [8]uint8 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen uint32 + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + _ [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofSockaddrL2 = 0xe + SizeofSockaddrRFCOMM = 0xa + SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 + SizeofSockaddrXDP = 0x10 + SizeofLinger = 0x8 + SizeofIovec = 0x8 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofPacketMreq = 0x10 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_INFO_KIND = 0x1 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_NUM_VF = 0x15 + IFLA_VFINFO_LIST = 0x16 + IFLA_STATS64 = 0x17 + IFLA_VF_PORTS = 0x18 + IFLA_PORT_SELF = 0x19 + IFLA_AF_SPEC = 0x1a + IFLA_GROUP = 0x1b + IFLA_NET_NS_FD = 0x1c + IFLA_EXT_MASK = 0x1d + IFLA_PROMISCUITY = 0x1e + IFLA_NUM_TX_QUEUES = 0x1f + IFLA_NUM_RX_QUEUES = 0x20 + IFLA_CARRIER = 0x21 + IFLA_PHYS_PORT_ID = 0x22 + IFLA_CARRIER_CHANGES = 0x23 + IFLA_PHYS_SWITCH_ID = 0x24 + IFLA_LINK_NETNSID = 0x25 + IFLA_PHYS_PORT_NAME = 0x26 + IFLA_PROTO_DOWN = 0x27 + IFLA_GSO_MAX_SEGS = 0x28 + IFLA_GSO_MAX_SIZE = 0x29 + IFLA_PAD = 0x2a + IFLA_XDP = 0x2b + IFLA_EVENT = 0x2c + IFLA_NEW_NETNSID = 0x2d + IFLA_IF_NETNSID = 0x2e + IFLA_MAX = 0x33 + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTA_MARK = 0x10 + RTA_MFC_STATS = 0x11 + RTA_VIA = 0x12 + RTA_NEWDST = 0x13 + RTA_PREF = 0x14 + RTA_ENCAP_TYPE = 0x15 + RTA_ENCAP = 0x16 + RTA_EXPIRES = 0x17 + RTA_PAD = 0x18 + RTA_UID = 0x19 + RTA_TTL_PROPAGATE = 0x1a + RTA_IP_PROTO = 0x1b + RTA_SPORT = 0x1c + RTA_DPORT = 0x1d + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + _ uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x8 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + _ [2]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + Regs [32]uint64 + Lo uint64 + Hi uint64 + Epc uint64 + Badvaddr uint64 + Status uint64 + Cause uint64 +} + +type FdSet struct { + Bits [32]int32 +} + +type Sysinfo_t struct { + Uptime int32 + Loads [3]uint32 + Totalram uint32 + Freeram uint32 + Sharedram uint32 + Bufferram uint32 + Totalswap uint32 + Freeswap uint32 + Procs uint16 + Pad uint16 + Totalhigh uint32 + Freehigh uint32 + Unit uint32 + _ [8]int8 +} + +type Utsname struct { + Sysname [65]byte + Nodename [65]byte + Release [65]byte + Version [65]byte + Machine [65]byte + Domainname [65]byte +} + +type Ustat_t struct { + Tfree int32 + Tinode uint32 + Fname [6]int8 + Fpack [6]int8 +} + +type EpollEvent struct { + Events uint32 + PadFd int32 + Fd int32 + Pad int32 +} + +const ( + AT_EMPTY_PATH = 0x1000 + AT_FDCWD = -0x64 + AT_NO_AUTOMOUNT = 0x800 + AT_REMOVEDIR = 0x200 + + AT_STATX_SYNC_AS_STAT = 0x0 + AT_STATX_FORCE_SYNC = 0x2000 + AT_STATX_DONT_SYNC = 0x4000 + + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 + + AT_EACCESS = 0x200 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x2000 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Sigset_t struct { + Val [32]uint32 +} + +const RNDGETENTCNT = 0x40045200 + +const PERF_IOC_FLAG_GROUP = 0x1 + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Line uint8 + Cc [23]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Taskstats struct { + Version uint16 + _ [2]byte + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + _ [6]byte + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]int8 + Ac_sched uint8 + Ac_pad [3]uint8 + _ [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + _ [4]byte + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 +} + +const ( + TASKSTATS_CMD_UNSPEC = 0x0 + TASKSTATS_CMD_GET = 0x1 + TASKSTATS_CMD_NEW = 0x2 + TASKSTATS_TYPE_UNSPEC = 0x0 + TASKSTATS_TYPE_PID = 0x1 + TASKSTATS_TYPE_TGID = 0x2 + TASKSTATS_TYPE_STATS = 0x3 + TASKSTATS_TYPE_AGGR_PID = 0x4 + TASKSTATS_TYPE_AGGR_TGID = 0x5 + TASKSTATS_TYPE_NULL = 0x6 + TASKSTATS_CMD_ATTR_UNSPEC = 0x0 + TASKSTATS_CMD_ATTR_PID = 0x1 + TASKSTATS_CMD_ATTR_TGID = 0x2 + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 +) + +type CGroupStats struct { + Sleeping uint64 + Running uint64 + Stopped uint64 + Uninterruptible uint64 + Io_wait uint64 +} + +const ( + CGROUPSTATS_CMD_UNSPEC = 0x3 + CGROUPSTATS_CMD_GET = 0x4 + CGROUPSTATS_CMD_NEW = 0x5 + CGROUPSTATS_TYPE_UNSPEC = 0x0 + CGROUPSTATS_TYPE_CGROUP_STATS = 0x1 + CGROUPSTATS_CMD_ATTR_UNSPEC = 0x0 + CGROUPSTATS_CMD_ATTR_FD = 0x1 +) + +type Genlmsghdr struct { + Cmd uint8 + Version uint8 + Reserved uint16 +} + +const ( + CTRL_CMD_UNSPEC = 0x0 + CTRL_CMD_NEWFAMILY = 0x1 + CTRL_CMD_DELFAMILY = 0x2 + CTRL_CMD_GETFAMILY = 0x3 + CTRL_CMD_NEWOPS = 0x4 + CTRL_CMD_DELOPS = 0x5 + CTRL_CMD_GETOPS = 0x6 + CTRL_CMD_NEWMCAST_GRP = 0x7 + CTRL_CMD_DELMCAST_GRP = 0x8 + CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_ATTR_UNSPEC = 0x0 + CTRL_ATTR_FAMILY_ID = 0x1 + CTRL_ATTR_FAMILY_NAME = 0x2 + CTRL_ATTR_VERSION = 0x3 + CTRL_ATTR_HDRSIZE = 0x4 + CTRL_ATTR_MAXATTR = 0x5 + CTRL_ATTR_OPS = 0x6 + CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_OP_UNSPEC = 0x0 + CTRL_ATTR_OP_ID = 0x1 + CTRL_ATTR_OP_FLAGS = 0x2 + CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 + CTRL_ATTR_MCAST_GRP_NAME = 0x1 + CTRL_ATTR_MCAST_GRP_ID = 0x2 +) + +type cpuMask uint32 + +const ( + _CPU_SETSIZE = 0x400 + _NCPUBITS = 0x20 +) + +const ( + BDADDR_BREDR = 0x0 + BDADDR_LE_PUBLIC = 0x1 + BDADDR_LE_RANDOM = 0x2 +) + +type PerfEventAttr struct { + Type uint32 + Size uint32 + Config uint64 + Sample uint64 + Sample_type uint64 + Read_format uint64 + Bits uint64 + Wakeup uint32 + Bp_type uint32 + Ext1 uint64 + Ext2 uint64 + Branch_sample_type uint64 + Sample_regs_user uint64 + Sample_stack_user uint32 + Clockid int32 + Sample_regs_intr uint64 + Aux_watermark uint32 + _ uint32 +} + +type PerfEventMmapPage struct { + Version uint32 + Compat_version uint32 + Lock uint32 + Index uint32 + Offset int64 + Time_enabled uint64 + Time_running uint64 + Capabilities uint64 + Pmc_width uint16 + Time_shift uint16 + Time_mult uint32 + Time_offset uint64 + Time_zero uint64 + Size uint32 + _ [948]uint8 + Data_head uint64 + Data_tail uint64 + Data_offset uint64 + Data_size uint64 + Aux_head uint64 + Aux_tail uint64 + Aux_offset uint64 + Aux_size uint64 +} + +const ( + PerfBitDisabled uint64 = CBitFieldMaskBit0 + PerfBitInherit = CBitFieldMaskBit1 + PerfBitPinned = CBitFieldMaskBit2 + PerfBitExclusive = CBitFieldMaskBit3 + PerfBitExcludeUser = CBitFieldMaskBit4 + PerfBitExcludeKernel = CBitFieldMaskBit5 + PerfBitExcludeHv = CBitFieldMaskBit6 + PerfBitExcludeIdle = CBitFieldMaskBit7 + PerfBitMmap = CBitFieldMaskBit8 + PerfBitComm = CBitFieldMaskBit9 + PerfBitFreq = CBitFieldMaskBit10 + PerfBitInheritStat = CBitFieldMaskBit11 + PerfBitEnableOnExec = CBitFieldMaskBit12 + PerfBitTask = CBitFieldMaskBit13 + PerfBitWatermark = CBitFieldMaskBit14 + PerfBitPreciseIPBit1 = CBitFieldMaskBit15 + PerfBitPreciseIPBit2 = CBitFieldMaskBit16 + PerfBitMmapData = CBitFieldMaskBit17 + PerfBitSampleIDAll = CBitFieldMaskBit18 + PerfBitExcludeHost = CBitFieldMaskBit19 + PerfBitExcludeGuest = CBitFieldMaskBit20 + PerfBitExcludeCallchainKernel = CBitFieldMaskBit21 + PerfBitExcludeCallchainUser = CBitFieldMaskBit22 + PerfBitMmap2 = CBitFieldMaskBit23 + PerfBitCommExec = CBitFieldMaskBit24 + PerfBitUseClockID = CBitFieldMaskBit25 + PerfBitContextSwitch = CBitFieldMaskBit26 +) + +const ( + PERF_TYPE_HARDWARE = 0x0 + PERF_TYPE_SOFTWARE = 0x1 + PERF_TYPE_TRACEPOINT = 0x2 + PERF_TYPE_HW_CACHE = 0x3 + PERF_TYPE_RAW = 0x4 + PERF_TYPE_BREAKPOINT = 0x5 + + PERF_COUNT_HW_CPU_CYCLES = 0x0 + PERF_COUNT_HW_INSTRUCTIONS = 0x1 + PERF_COUNT_HW_CACHE_REFERENCES = 0x2 + PERF_COUNT_HW_CACHE_MISSES = 0x3 + PERF_COUNT_HW_BRANCH_INSTRUCTIONS = 0x4 + PERF_COUNT_HW_BRANCH_MISSES = 0x5 + PERF_COUNT_HW_BUS_CYCLES = 0x6 + PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 0x7 + PERF_COUNT_HW_STALLED_CYCLES_BACKEND = 0x8 + PERF_COUNT_HW_REF_CPU_CYCLES = 0x9 + + PERF_COUNT_HW_CACHE_L1D = 0x0 + PERF_COUNT_HW_CACHE_L1I = 0x1 + PERF_COUNT_HW_CACHE_LL = 0x2 + PERF_COUNT_HW_CACHE_DTLB = 0x3 + PERF_COUNT_HW_CACHE_ITLB = 0x4 + PERF_COUNT_HW_CACHE_BPU = 0x5 + PERF_COUNT_HW_CACHE_NODE = 0x6 + + PERF_COUNT_HW_CACHE_OP_READ = 0x0 + PERF_COUNT_HW_CACHE_OP_WRITE = 0x1 + PERF_COUNT_HW_CACHE_OP_PREFETCH = 0x2 + + PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0x0 + PERF_COUNT_HW_CACHE_RESULT_MISS = 0x1 + + PERF_COUNT_SW_CPU_CLOCK = 0x0 + PERF_COUNT_SW_TASK_CLOCK = 0x1 + PERF_COUNT_SW_PAGE_FAULTS = 0x2 + PERF_COUNT_SW_CONTEXT_SWITCHES = 0x3 + PERF_COUNT_SW_CPU_MIGRATIONS = 0x4 + PERF_COUNT_SW_PAGE_FAULTS_MIN = 0x5 + PERF_COUNT_SW_PAGE_FAULTS_MAJ = 0x6 + PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7 + PERF_COUNT_SW_EMULATION_FAULTS = 0x8 + PERF_COUNT_SW_DUMMY = 0x9 + + PERF_SAMPLE_IP = 0x1 + PERF_SAMPLE_TID = 0x2 + PERF_SAMPLE_TIME = 0x4 + PERF_SAMPLE_ADDR = 0x8 + PERF_SAMPLE_READ = 0x10 + PERF_SAMPLE_CALLCHAIN = 0x20 + PERF_SAMPLE_ID = 0x40 + PERF_SAMPLE_CPU = 0x80 + PERF_SAMPLE_PERIOD = 0x100 + PERF_SAMPLE_STREAM_ID = 0x200 + PERF_SAMPLE_RAW = 0x400 + PERF_SAMPLE_BRANCH_STACK = 0x800 + + PERF_SAMPLE_BRANCH_USER = 0x1 + PERF_SAMPLE_BRANCH_KERNEL = 0x2 + PERF_SAMPLE_BRANCH_HV = 0x4 + PERF_SAMPLE_BRANCH_ANY = 0x8 + PERF_SAMPLE_BRANCH_ANY_CALL = 0x10 + PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20 + PERF_SAMPLE_BRANCH_IND_CALL = 0x40 + + PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1 + PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2 + PERF_FORMAT_ID = 0x4 + PERF_FORMAT_GROUP = 0x8 + + PERF_RECORD_MMAP = 0x1 + PERF_RECORD_LOST = 0x2 + PERF_RECORD_COMM = 0x3 + PERF_RECORD_EXIT = 0x4 + PERF_RECORD_THROTTLE = 0x5 + PERF_RECORD_UNTHROTTLE = 0x6 + PERF_RECORD_FORK = 0x7 + PERF_RECORD_READ = 0x8 + PERF_RECORD_SAMPLE = 0x9 + + PERF_CONTEXT_HV = -0x20 + PERF_CONTEXT_KERNEL = -0x80 + PERF_CONTEXT_USER = -0x200 + + PERF_CONTEXT_GUEST = -0x800 + PERF_CONTEXT_GUEST_KERNEL = -0x880 + PERF_CONTEXT_GUEST_USER = -0xa00 + + PERF_FLAG_FD_NO_GROUP = 0x1 + PERF_FLAG_FD_OUTPUT = 0x2 + PERF_FLAG_PID_CGROUP = 0x4 +) + +const ( + CBitFieldMaskBit0 = 0x8000000000000000 + CBitFieldMaskBit1 = 0x4000000000000000 + CBitFieldMaskBit2 = 0x2000000000000000 + CBitFieldMaskBit3 = 0x1000000000000000 + CBitFieldMaskBit4 = 0x800000000000000 + CBitFieldMaskBit5 = 0x400000000000000 + CBitFieldMaskBit6 = 0x200000000000000 + CBitFieldMaskBit7 = 0x100000000000000 + CBitFieldMaskBit8 = 0x80000000000000 + CBitFieldMaskBit9 = 0x40000000000000 + CBitFieldMaskBit10 = 0x20000000000000 + CBitFieldMaskBit11 = 0x10000000000000 + CBitFieldMaskBit12 = 0x8000000000000 + CBitFieldMaskBit13 = 0x4000000000000 + CBitFieldMaskBit14 = 0x2000000000000 + CBitFieldMaskBit15 = 0x1000000000000 + CBitFieldMaskBit16 = 0x800000000000 + CBitFieldMaskBit17 = 0x400000000000 + CBitFieldMaskBit18 = 0x200000000000 + CBitFieldMaskBit19 = 0x100000000000 + CBitFieldMaskBit20 = 0x80000000000 + CBitFieldMaskBit21 = 0x40000000000 + CBitFieldMaskBit22 = 0x20000000000 + CBitFieldMaskBit23 = 0x10000000000 + CBitFieldMaskBit24 = 0x8000000000 + CBitFieldMaskBit25 = 0x4000000000 + CBitFieldMaskBit26 = 0x2000000000 + CBitFieldMaskBit27 = 0x1000000000 + CBitFieldMaskBit28 = 0x800000000 + CBitFieldMaskBit29 = 0x400000000 + CBitFieldMaskBit30 = 0x200000000 + CBitFieldMaskBit31 = 0x100000000 + CBitFieldMaskBit32 = 0x80000000 + CBitFieldMaskBit33 = 0x40000000 + CBitFieldMaskBit34 = 0x20000000 + CBitFieldMaskBit35 = 0x10000000 + CBitFieldMaskBit36 = 0x8000000 + CBitFieldMaskBit37 = 0x4000000 + CBitFieldMaskBit38 = 0x2000000 + CBitFieldMaskBit39 = 0x1000000 + CBitFieldMaskBit40 = 0x800000 + CBitFieldMaskBit41 = 0x400000 + CBitFieldMaskBit42 = 0x200000 + CBitFieldMaskBit43 = 0x100000 + CBitFieldMaskBit44 = 0x80000 + CBitFieldMaskBit45 = 0x40000 + CBitFieldMaskBit46 = 0x20000 + CBitFieldMaskBit47 = 0x10000 + CBitFieldMaskBit48 = 0x8000 + CBitFieldMaskBit49 = 0x4000 + CBitFieldMaskBit50 = 0x2000 + CBitFieldMaskBit51 = 0x1000 + CBitFieldMaskBit52 = 0x800 + CBitFieldMaskBit53 = 0x400 + CBitFieldMaskBit54 = 0x200 + CBitFieldMaskBit55 = 0x100 + CBitFieldMaskBit56 = 0x80 + CBitFieldMaskBit57 = 0x40 + CBitFieldMaskBit58 = 0x20 + CBitFieldMaskBit59 = 0x10 + CBitFieldMaskBit60 = 0x8 + CBitFieldMaskBit61 = 0x4 + CBitFieldMaskBit62 = 0x2 + CBitFieldMaskBit63 = 0x1 +) + +type SockaddrStorage struct { + Family uint16 + _ [122]int8 + _ uint32 +} + +type TCPMD5Sig struct { + Addr SockaddrStorage + Flags uint8 + Prefixlen uint8 + Keylen uint16 + _ uint32 + Key [80]uint8 +} + +type HDDriveCmdHdr struct { + Command uint8 + Number uint8 + Feature uint8 + Count uint8 +} + +type HDGeometry struct { + Heads uint8 + Sectors uint8 + Cylinders uint16 + Start uint32 +} + +type HDDriveID struct { + Config uint16 + Cyls uint16 + Reserved2 uint16 + Heads uint16 + Track_bytes uint16 + Sector_bytes uint16 + Sectors uint16 + Vendor0 uint16 + Vendor1 uint16 + Vendor2 uint16 + Serial_no [20]uint8 + Buf_type uint16 + Buf_size uint16 + Ecc_bytes uint16 + Fw_rev [8]uint8 + Model [40]uint8 + Max_multsect uint8 + Vendor3 uint8 + Dword_io uint16 + Vendor4 uint8 + Capability uint8 + Reserved50 uint16 + Vendor5 uint8 + TPIO uint8 + Vendor6 uint8 + TDMA uint8 + Field_valid uint16 + Cur_cyls uint16 + Cur_heads uint16 + Cur_sectors uint16 + Cur_capacity0 uint16 + Cur_capacity1 uint16 + Multsect uint8 + Multsect_valid uint8 + Lba_capacity uint32 + Dma_1word uint16 + Dma_mword uint16 + Eide_pio_modes uint16 + Eide_dma_min uint16 + Eide_dma_time uint16 + Eide_pio uint16 + Eide_pio_iordy uint16 + Words69_70 [2]uint16 + Words71_74 [4]uint16 + Queue_depth uint16 + Words76_79 [4]uint16 + Major_rev_num uint16 + Minor_rev_num uint16 + Command_set_1 uint16 + Command_set_2 uint16 + Cfsse uint16 + Cfs_enable_1 uint16 + Cfs_enable_2 uint16 + Csf_default uint16 + Dma_ultra uint16 + Trseuc uint16 + TrsEuc uint16 + CurAPMvalues uint16 + Mprc uint16 + Hw_config uint16 + Acoustic uint16 + Msrqs uint16 + Sxfert uint16 + Sal uint16 + Spg uint32 + Lba_capacity_2 uint64 + Words104_125 [22]uint16 + Last_lun uint16 + Word127 uint16 + Dlf uint16 + Csfo uint16 + Words130_155 [26]uint16 + Word156 uint16 + Words157_159 [3]uint16 + Cfa_power uint16 + Words161_175 [15]uint16 + Words176_205 [30]uint16 + Words206_254 [49]uint16 + Integrity_word uint16 +} + +type Statfs_t struct { + Type int32 + Bsize int32 + Frsize int32 + _ [4]byte + Blocks uint64 + Bfree uint64 + Files uint64 + Ffree uint64 + Bavail uint64 + Fsid Fsid + Namelen int32 + Flags int32 + Spare [5]int32 + _ [4]byte +} + +const ( + ST_MANDLOCK = 0x40 + ST_NOATIME = 0x400 + ST_NODEV = 0x4 + ST_NODIRATIME = 0x800 + ST_NOEXEC = 0x8 + ST_NOSUID = 0x2 + ST_RDONLY = 0x1 + ST_RELATIME = 0x1000 + ST_SYNCHRONOUS = 0x10 +) + +type TpacketHdr struct { + Status uint32 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Sec uint32 + Usec uint32 +} + +type Tpacket2Hdr struct { + Status uint32 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Sec uint32 + Nsec uint32 + Vlan_tci uint16 + Vlan_tpid uint16 + _ [4]uint8 +} + +type Tpacket3Hdr struct { + Next_offset uint32 + Sec uint32 + Nsec uint32 + Snaplen uint32 + Len uint32 + Status uint32 + Mac uint16 + Net uint16 + Hv1 TpacketHdrVariant1 + _ [8]uint8 +} + +type TpacketHdrVariant1 struct { + Rxhash uint32 + Vlan_tci uint32 + Vlan_tpid uint16 + _ uint16 +} + +type TpacketBlockDesc struct { + Version uint32 + To_priv uint32 + Hdr [40]byte +} + +type TpacketReq struct { + Block_size uint32 + Block_nr uint32 + Frame_size uint32 + Frame_nr uint32 +} + +type TpacketReq3 struct { + Block_size uint32 + Block_nr uint32 + Frame_size uint32 + Frame_nr uint32 + Retire_blk_tov uint32 + Sizeof_priv uint32 + Feature_req_word uint32 +} + +type TpacketStats struct { + Packets uint32 + Drops uint32 +} + +type TpacketStatsV3 struct { + Packets uint32 + Drops uint32 + Freeze_q_cnt uint32 +} + +type TpacketAuxdata struct { + Status uint32 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Vlan_tci uint16 + Vlan_tpid uint16 +} + +const ( + TPACKET_V1 = 0x0 + TPACKET_V2 = 0x1 + TPACKET_V3 = 0x2 +) + +const ( + SizeofTpacketHdr = 0x18 + SizeofTpacket2Hdr = 0x20 + SizeofTpacket3Hdr = 0x30 +) + +const ( + NF_INET_PRE_ROUTING = 0x0 + NF_INET_LOCAL_IN = 0x1 + NF_INET_FORWARD = 0x2 + NF_INET_LOCAL_OUT = 0x3 + NF_INET_POST_ROUTING = 0x4 + NF_INET_NUMHOOKS = 0x5 +) + +const ( + NF_NETDEV_INGRESS = 0x0 + NF_NETDEV_NUMHOOKS = 0x1 +) + +const ( + NFPROTO_UNSPEC = 0x0 + NFPROTO_INET = 0x1 + NFPROTO_IPV4 = 0x2 + NFPROTO_ARP = 0x3 + NFPROTO_NETDEV = 0x5 + NFPROTO_BRIDGE = 0x7 + NFPROTO_IPV6 = 0xa + NFPROTO_DECNET = 0xc + NFPROTO_NUMPROTO = 0xd +) + +type Nfgenmsg struct { + Nfgen_family uint8 + Version uint8 + Res_id uint16 +} + +const ( + NFNL_BATCH_UNSPEC = 0x0 + NFNL_BATCH_GENID = 0x1 +) + +const ( + NFT_REG_VERDICT = 0x0 + NFT_REG_1 = 0x1 + NFT_REG_2 = 0x2 + NFT_REG_3 = 0x3 + NFT_REG_4 = 0x4 + NFT_REG32_00 = 0x8 + NFT_REG32_01 = 0x9 + NFT_REG32_02 = 0xa + NFT_REG32_03 = 0xb + NFT_REG32_04 = 0xc + NFT_REG32_05 = 0xd + NFT_REG32_06 = 0xe + NFT_REG32_07 = 0xf + NFT_REG32_08 = 0x10 + NFT_REG32_09 = 0x11 + NFT_REG32_10 = 0x12 + NFT_REG32_11 = 0x13 + NFT_REG32_12 = 0x14 + NFT_REG32_13 = 0x15 + NFT_REG32_14 = 0x16 + NFT_REG32_15 = 0x17 + NFT_CONTINUE = -0x1 + NFT_BREAK = -0x2 + NFT_JUMP = -0x3 + NFT_GOTO = -0x4 + NFT_RETURN = -0x5 + NFT_MSG_NEWTABLE = 0x0 + NFT_MSG_GETTABLE = 0x1 + NFT_MSG_DELTABLE = 0x2 + NFT_MSG_NEWCHAIN = 0x3 + NFT_MSG_GETCHAIN = 0x4 + NFT_MSG_DELCHAIN = 0x5 + NFT_MSG_NEWRULE = 0x6 + NFT_MSG_GETRULE = 0x7 + NFT_MSG_DELRULE = 0x8 + NFT_MSG_NEWSET = 0x9 + NFT_MSG_GETSET = 0xa + NFT_MSG_DELSET = 0xb + NFT_MSG_NEWSETELEM = 0xc + NFT_MSG_GETSETELEM = 0xd + NFT_MSG_DELSETELEM = 0xe + NFT_MSG_NEWGEN = 0xf + NFT_MSG_GETGEN = 0x10 + NFT_MSG_TRACE = 0x11 + NFT_MSG_NEWOBJ = 0x12 + NFT_MSG_GETOBJ = 0x13 + NFT_MSG_DELOBJ = 0x14 + NFT_MSG_GETOBJ_RESET = 0x15 + NFT_MSG_MAX = 0x19 + NFTA_LIST_UNPEC = 0x0 + NFTA_LIST_ELEM = 0x1 + NFTA_HOOK_UNSPEC = 0x0 + NFTA_HOOK_HOOKNUM = 0x1 + NFTA_HOOK_PRIORITY = 0x2 + NFTA_HOOK_DEV = 0x3 + NFT_TABLE_F_DORMANT = 0x1 + NFTA_TABLE_UNSPEC = 0x0 + NFTA_TABLE_NAME = 0x1 + NFTA_TABLE_FLAGS = 0x2 + NFTA_TABLE_USE = 0x3 + NFTA_CHAIN_UNSPEC = 0x0 + NFTA_CHAIN_TABLE = 0x1 + NFTA_CHAIN_HANDLE = 0x2 + NFTA_CHAIN_NAME = 0x3 + NFTA_CHAIN_HOOK = 0x4 + NFTA_CHAIN_POLICY = 0x5 + NFTA_CHAIN_USE = 0x6 + NFTA_CHAIN_TYPE = 0x7 + NFTA_CHAIN_COUNTERS = 0x8 + NFTA_CHAIN_PAD = 0x9 + NFTA_RULE_UNSPEC = 0x0 + NFTA_RULE_TABLE = 0x1 + NFTA_RULE_CHAIN = 0x2 + NFTA_RULE_HANDLE = 0x3 + NFTA_RULE_EXPRESSIONS = 0x4 + NFTA_RULE_COMPAT = 0x5 + NFTA_RULE_POSITION = 0x6 + NFTA_RULE_USERDATA = 0x7 + NFTA_RULE_PAD = 0x8 + NFTA_RULE_ID = 0x9 + NFT_RULE_COMPAT_F_INV = 0x2 + NFT_RULE_COMPAT_F_MASK = 0x2 + NFTA_RULE_COMPAT_UNSPEC = 0x0 + NFTA_RULE_COMPAT_PROTO = 0x1 + NFTA_RULE_COMPAT_FLAGS = 0x2 + NFT_SET_ANONYMOUS = 0x1 + NFT_SET_CONSTANT = 0x2 + NFT_SET_INTERVAL = 0x4 + NFT_SET_MAP = 0x8 + NFT_SET_TIMEOUT = 0x10 + NFT_SET_EVAL = 0x20 + NFT_SET_OBJECT = 0x40 + NFT_SET_POL_PERFORMANCE = 0x0 + NFT_SET_POL_MEMORY = 0x1 + NFTA_SET_DESC_UNSPEC = 0x0 + NFTA_SET_DESC_SIZE = 0x1 + NFTA_SET_UNSPEC = 0x0 + NFTA_SET_TABLE = 0x1 + NFTA_SET_NAME = 0x2 + NFTA_SET_FLAGS = 0x3 + NFTA_SET_KEY_TYPE = 0x4 + NFTA_SET_KEY_LEN = 0x5 + NFTA_SET_DATA_TYPE = 0x6 + NFTA_SET_DATA_LEN = 0x7 + NFTA_SET_POLICY = 0x8 + NFTA_SET_DESC = 0x9 + NFTA_SET_ID = 0xa + NFTA_SET_TIMEOUT = 0xb + NFTA_SET_GC_INTERVAL = 0xc + NFTA_SET_USERDATA = 0xd + NFTA_SET_PAD = 0xe + NFTA_SET_OBJ_TYPE = 0xf + NFT_SET_ELEM_INTERVAL_END = 0x1 + NFTA_SET_ELEM_UNSPEC = 0x0 + NFTA_SET_ELEM_KEY = 0x1 + NFTA_SET_ELEM_DATA = 0x2 + NFTA_SET_ELEM_FLAGS = 0x3 + NFTA_SET_ELEM_TIMEOUT = 0x4 + NFTA_SET_ELEM_EXPIRATION = 0x5 + NFTA_SET_ELEM_USERDATA = 0x6 + NFTA_SET_ELEM_EXPR = 0x7 + NFTA_SET_ELEM_PAD = 0x8 + NFTA_SET_ELEM_OBJREF = 0x9 + NFTA_SET_ELEM_LIST_UNSPEC = 0x0 + NFTA_SET_ELEM_LIST_TABLE = 0x1 + NFTA_SET_ELEM_LIST_SET = 0x2 + NFTA_SET_ELEM_LIST_ELEMENTS = 0x3 + NFTA_SET_ELEM_LIST_SET_ID = 0x4 + NFT_DATA_VALUE = 0x0 + NFT_DATA_VERDICT = 0xffffff00 + NFTA_DATA_UNSPEC = 0x0 + NFTA_DATA_VALUE = 0x1 + NFTA_DATA_VERDICT = 0x2 + NFTA_VERDICT_UNSPEC = 0x0 + NFTA_VERDICT_CODE = 0x1 + NFTA_VERDICT_CHAIN = 0x2 + NFTA_EXPR_UNSPEC = 0x0 + NFTA_EXPR_NAME = 0x1 + NFTA_EXPR_DATA = 0x2 + NFTA_IMMEDIATE_UNSPEC = 0x0 + NFTA_IMMEDIATE_DREG = 0x1 + NFTA_IMMEDIATE_DATA = 0x2 + NFTA_BITWISE_UNSPEC = 0x0 + NFTA_BITWISE_SREG = 0x1 + NFTA_BITWISE_DREG = 0x2 + NFTA_BITWISE_LEN = 0x3 + NFTA_BITWISE_MASK = 0x4 + NFTA_BITWISE_XOR = 0x5 + NFT_BYTEORDER_NTOH = 0x0 + NFT_BYTEORDER_HTON = 0x1 + NFTA_BYTEORDER_UNSPEC = 0x0 + NFTA_BYTEORDER_SREG = 0x1 + NFTA_BYTEORDER_DREG = 0x2 + NFTA_BYTEORDER_OP = 0x3 + NFTA_BYTEORDER_LEN = 0x4 + NFTA_BYTEORDER_SIZE = 0x5 + NFT_CMP_EQ = 0x0 + NFT_CMP_NEQ = 0x1 + NFT_CMP_LT = 0x2 + NFT_CMP_LTE = 0x3 + NFT_CMP_GT = 0x4 + NFT_CMP_GTE = 0x5 + NFTA_CMP_UNSPEC = 0x0 + NFTA_CMP_SREG = 0x1 + NFTA_CMP_OP = 0x2 + NFTA_CMP_DATA = 0x3 + NFT_RANGE_EQ = 0x0 + NFT_RANGE_NEQ = 0x1 + NFTA_RANGE_UNSPEC = 0x0 + NFTA_RANGE_SREG = 0x1 + NFTA_RANGE_OP = 0x2 + NFTA_RANGE_FROM_DATA = 0x3 + NFTA_RANGE_TO_DATA = 0x4 + NFT_LOOKUP_F_INV = 0x1 + NFTA_LOOKUP_UNSPEC = 0x0 + NFTA_LOOKUP_SET = 0x1 + NFTA_LOOKUP_SREG = 0x2 + NFTA_LOOKUP_DREG = 0x3 + NFTA_LOOKUP_SET_ID = 0x4 + NFTA_LOOKUP_FLAGS = 0x5 + NFT_DYNSET_OP_ADD = 0x0 + NFT_DYNSET_OP_UPDATE = 0x1 + NFT_DYNSET_F_INV = 0x1 + NFTA_DYNSET_UNSPEC = 0x0 + NFTA_DYNSET_SET_NAME = 0x1 + NFTA_DYNSET_SET_ID = 0x2 + NFTA_DYNSET_OP = 0x3 + NFTA_DYNSET_SREG_KEY = 0x4 + NFTA_DYNSET_SREG_DATA = 0x5 + NFTA_DYNSET_TIMEOUT = 0x6 + NFTA_DYNSET_EXPR = 0x7 + NFTA_DYNSET_PAD = 0x8 + NFTA_DYNSET_FLAGS = 0x9 + NFT_PAYLOAD_LL_HEADER = 0x0 + NFT_PAYLOAD_NETWORK_HEADER = 0x1 + NFT_PAYLOAD_TRANSPORT_HEADER = 0x2 + NFT_PAYLOAD_CSUM_NONE = 0x0 + NFT_PAYLOAD_CSUM_INET = 0x1 + NFT_PAYLOAD_L4CSUM_PSEUDOHDR = 0x1 + NFTA_PAYLOAD_UNSPEC = 0x0 + NFTA_PAYLOAD_DREG = 0x1 + NFTA_PAYLOAD_BASE = 0x2 + NFTA_PAYLOAD_OFFSET = 0x3 + NFTA_PAYLOAD_LEN = 0x4 + NFTA_PAYLOAD_SREG = 0x5 + NFTA_PAYLOAD_CSUM_TYPE = 0x6 + NFTA_PAYLOAD_CSUM_OFFSET = 0x7 + NFTA_PAYLOAD_CSUM_FLAGS = 0x8 + NFT_EXTHDR_F_PRESENT = 0x1 + NFT_EXTHDR_OP_IPV6 = 0x0 + NFT_EXTHDR_OP_TCPOPT = 0x1 + NFTA_EXTHDR_UNSPEC = 0x0 + NFTA_EXTHDR_DREG = 0x1 + NFTA_EXTHDR_TYPE = 0x2 + NFTA_EXTHDR_OFFSET = 0x3 + NFTA_EXTHDR_LEN = 0x4 + NFTA_EXTHDR_FLAGS = 0x5 + NFTA_EXTHDR_OP = 0x6 + NFTA_EXTHDR_SREG = 0x7 + NFT_META_LEN = 0x0 + NFT_META_PROTOCOL = 0x1 + NFT_META_PRIORITY = 0x2 + NFT_META_MARK = 0x3 + NFT_META_IIF = 0x4 + NFT_META_OIF = 0x5 + NFT_META_IIFNAME = 0x6 + NFT_META_OIFNAME = 0x7 + NFT_META_IIFTYPE = 0x8 + NFT_META_OIFTYPE = 0x9 + NFT_META_SKUID = 0xa + NFT_META_SKGID = 0xb + NFT_META_NFTRACE = 0xc + NFT_META_RTCLASSID = 0xd + NFT_META_SECMARK = 0xe + NFT_META_NFPROTO = 0xf + NFT_META_L4PROTO = 0x10 + NFT_META_BRI_IIFNAME = 0x11 + NFT_META_BRI_OIFNAME = 0x12 + NFT_META_PKTTYPE = 0x13 + NFT_META_CPU = 0x14 + NFT_META_IIFGROUP = 0x15 + NFT_META_OIFGROUP = 0x16 + NFT_META_CGROUP = 0x17 + NFT_META_PRANDOM = 0x18 + NFT_RT_CLASSID = 0x0 + NFT_RT_NEXTHOP4 = 0x1 + NFT_RT_NEXTHOP6 = 0x2 + NFT_RT_TCPMSS = 0x3 + NFT_HASH_JENKINS = 0x0 + NFT_HASH_SYM = 0x1 + NFTA_HASH_UNSPEC = 0x0 + NFTA_HASH_SREG = 0x1 + NFTA_HASH_DREG = 0x2 + NFTA_HASH_LEN = 0x3 + NFTA_HASH_MODULUS = 0x4 + NFTA_HASH_SEED = 0x5 + NFTA_HASH_OFFSET = 0x6 + NFTA_HASH_TYPE = 0x7 + NFTA_META_UNSPEC = 0x0 + NFTA_META_DREG = 0x1 + NFTA_META_KEY = 0x2 + NFTA_META_SREG = 0x3 + NFTA_RT_UNSPEC = 0x0 + NFTA_RT_DREG = 0x1 + NFTA_RT_KEY = 0x2 + NFT_CT_STATE = 0x0 + NFT_CT_DIRECTION = 0x1 + NFT_CT_STATUS = 0x2 + NFT_CT_MARK = 0x3 + NFT_CT_SECMARK = 0x4 + NFT_CT_EXPIRATION = 0x5 + NFT_CT_HELPER = 0x6 + NFT_CT_L3PROTOCOL = 0x7 + NFT_CT_SRC = 0x8 + NFT_CT_DST = 0x9 + NFT_CT_PROTOCOL = 0xa + NFT_CT_PROTO_SRC = 0xb + NFT_CT_PROTO_DST = 0xc + NFT_CT_LABELS = 0xd + NFT_CT_PKTS = 0xe + NFT_CT_BYTES = 0xf + NFT_CT_AVGPKT = 0x10 + NFT_CT_ZONE = 0x11 + NFT_CT_EVENTMASK = 0x12 + NFTA_CT_UNSPEC = 0x0 + NFTA_CT_DREG = 0x1 + NFTA_CT_KEY = 0x2 + NFTA_CT_DIRECTION = 0x3 + NFTA_CT_SREG = 0x4 + NFT_LIMIT_PKTS = 0x0 + NFT_LIMIT_PKT_BYTES = 0x1 + NFT_LIMIT_F_INV = 0x1 + NFTA_LIMIT_UNSPEC = 0x0 + NFTA_LIMIT_RATE = 0x1 + NFTA_LIMIT_UNIT = 0x2 + NFTA_LIMIT_BURST = 0x3 + NFTA_LIMIT_TYPE = 0x4 + NFTA_LIMIT_FLAGS = 0x5 + NFTA_LIMIT_PAD = 0x6 + NFTA_COUNTER_UNSPEC = 0x0 + NFTA_COUNTER_BYTES = 0x1 + NFTA_COUNTER_PACKETS = 0x2 + NFTA_COUNTER_PAD = 0x3 + NFTA_LOG_UNSPEC = 0x0 + NFTA_LOG_GROUP = 0x1 + NFTA_LOG_PREFIX = 0x2 + NFTA_LOG_SNAPLEN = 0x3 + NFTA_LOG_QTHRESHOLD = 0x4 + NFTA_LOG_LEVEL = 0x5 + NFTA_LOG_FLAGS = 0x6 + NFTA_QUEUE_UNSPEC = 0x0 + NFTA_QUEUE_NUM = 0x1 + NFTA_QUEUE_TOTAL = 0x2 + NFTA_QUEUE_FLAGS = 0x3 + NFTA_QUEUE_SREG_QNUM = 0x4 + NFT_QUOTA_F_INV = 0x1 + NFT_QUOTA_F_DEPLETED = 0x2 + NFTA_QUOTA_UNSPEC = 0x0 + NFTA_QUOTA_BYTES = 0x1 + NFTA_QUOTA_FLAGS = 0x2 + NFTA_QUOTA_PAD = 0x3 + NFTA_QUOTA_CONSUMED = 0x4 + NFT_REJECT_ICMP_UNREACH = 0x0 + NFT_REJECT_TCP_RST = 0x1 + NFT_REJECT_ICMPX_UNREACH = 0x2 + NFT_REJECT_ICMPX_NO_ROUTE = 0x0 + NFT_REJECT_ICMPX_PORT_UNREACH = 0x1 + NFT_REJECT_ICMPX_HOST_UNREACH = 0x2 + NFT_REJECT_ICMPX_ADMIN_PROHIBITED = 0x3 + NFTA_REJECT_UNSPEC = 0x0 + NFTA_REJECT_TYPE = 0x1 + NFTA_REJECT_ICMP_CODE = 0x2 + NFT_NAT_SNAT = 0x0 + NFT_NAT_DNAT = 0x1 + NFTA_NAT_UNSPEC = 0x0 + NFTA_NAT_TYPE = 0x1 + NFTA_NAT_FAMILY = 0x2 + NFTA_NAT_REG_ADDR_MIN = 0x3 + NFTA_NAT_REG_ADDR_MAX = 0x4 + NFTA_NAT_REG_PROTO_MIN = 0x5 + NFTA_NAT_REG_PROTO_MAX = 0x6 + NFTA_NAT_FLAGS = 0x7 + NFTA_MASQ_UNSPEC = 0x0 + NFTA_MASQ_FLAGS = 0x1 + NFTA_MASQ_REG_PROTO_MIN = 0x2 + NFTA_MASQ_REG_PROTO_MAX = 0x3 + NFTA_REDIR_UNSPEC = 0x0 + NFTA_REDIR_REG_PROTO_MIN = 0x1 + NFTA_REDIR_REG_PROTO_MAX = 0x2 + NFTA_REDIR_FLAGS = 0x3 + NFTA_DUP_UNSPEC = 0x0 + NFTA_DUP_SREG_ADDR = 0x1 + NFTA_DUP_SREG_DEV = 0x2 + NFTA_FWD_UNSPEC = 0x0 + NFTA_FWD_SREG_DEV = 0x1 + NFTA_OBJREF_UNSPEC = 0x0 + NFTA_OBJREF_IMM_TYPE = 0x1 + NFTA_OBJREF_IMM_NAME = 0x2 + NFTA_OBJREF_SET_SREG = 0x3 + NFTA_OBJREF_SET_NAME = 0x4 + NFTA_OBJREF_SET_ID = 0x5 + NFTA_GEN_UNSPEC = 0x0 + NFTA_GEN_ID = 0x1 + NFTA_GEN_PROC_PID = 0x2 + NFTA_GEN_PROC_NAME = 0x3 + NFTA_FIB_UNSPEC = 0x0 + NFTA_FIB_DREG = 0x1 + NFTA_FIB_RESULT = 0x2 + NFTA_FIB_FLAGS = 0x3 + NFT_FIB_RESULT_UNSPEC = 0x0 + NFT_FIB_RESULT_OIF = 0x1 + NFT_FIB_RESULT_OIFNAME = 0x2 + NFT_FIB_RESULT_ADDRTYPE = 0x3 + NFTA_FIB_F_SADDR = 0x1 + NFTA_FIB_F_DADDR = 0x2 + NFTA_FIB_F_MARK = 0x4 + NFTA_FIB_F_IIF = 0x8 + NFTA_FIB_F_OIF = 0x10 + NFTA_FIB_F_PRESENT = 0x20 + NFTA_CT_HELPER_UNSPEC = 0x0 + NFTA_CT_HELPER_NAME = 0x1 + NFTA_CT_HELPER_L3PROTO = 0x2 + NFTA_CT_HELPER_L4PROTO = 0x3 + NFTA_OBJ_UNSPEC = 0x0 + NFTA_OBJ_TABLE = 0x1 + NFTA_OBJ_NAME = 0x2 + NFTA_OBJ_TYPE = 0x3 + NFTA_OBJ_DATA = 0x4 + NFTA_OBJ_USE = 0x5 + NFTA_TRACE_UNSPEC = 0x0 + NFTA_TRACE_TABLE = 0x1 + NFTA_TRACE_CHAIN = 0x2 + NFTA_TRACE_RULE_HANDLE = 0x3 + NFTA_TRACE_TYPE = 0x4 + NFTA_TRACE_VERDICT = 0x5 + NFTA_TRACE_ID = 0x6 + NFTA_TRACE_LL_HEADER = 0x7 + NFTA_TRACE_NETWORK_HEADER = 0x8 + NFTA_TRACE_TRANSPORT_HEADER = 0x9 + NFTA_TRACE_IIF = 0xa + NFTA_TRACE_IIFTYPE = 0xb + NFTA_TRACE_OIF = 0xc + NFTA_TRACE_OIFTYPE = 0xd + NFTA_TRACE_MARK = 0xe + NFTA_TRACE_NFPROTO = 0xf + NFTA_TRACE_POLICY = 0x10 + NFTA_TRACE_PAD = 0x11 + NFT_TRACETYPE_UNSPEC = 0x0 + NFT_TRACETYPE_POLICY = 0x1 + NFT_TRACETYPE_RETURN = 0x2 + NFT_TRACETYPE_RULE = 0x3 + NFTA_NG_UNSPEC = 0x0 + NFTA_NG_DREG = 0x1 + NFTA_NG_MODULUS = 0x2 + NFTA_NG_TYPE = 0x3 + NFTA_NG_OFFSET = 0x4 + NFT_NG_INCREMENTAL = 0x0 + NFT_NG_RANDOM = 0x1 +) + +type RTCTime struct { + Sec int32 + Min int32 + Hour int32 + Mday int32 + Mon int32 + Year int32 + Wday int32 + Yday int32 + Isdst int32 +} + +type RTCWkAlrm struct { + Enabled uint8 + Pending uint8 + _ [2]byte + Time RTCTime +} + +type RTCPLLInfo struct { + Ctrl int32 + Value int32 + Max int32 + Min int32 + Posmult int32 + Negmult int32 + Clock int32 +} + +type BlkpgIoctlArg struct { + Op int32 + Flags int32 + Datalen int32 + Data *byte +} + +type BlkpgPartition struct { + Start int64 + Length int64 + Pno int32 + Devname [64]uint8 + Volname [64]uint8 + _ [4]byte +} + +const ( + BLKPG = 0x20001269 + BLKPG_ADD_PARTITION = 0x1 + BLKPG_DEL_PARTITION = 0x2 + BLKPG_RESIZE_PARTITION = 0x3 +) + +const ( + NETNSA_NONE = 0x0 + NETNSA_NSID = 0x1 + NETNSA_PID = 0x2 + NETNSA_FD = 0x3 +) + +type XDPRingOffset struct { + Producer uint64 + Consumer uint64 + Desc uint64 +} + +type XDPMmapOffsets struct { + Rx XDPRingOffset + Tx XDPRingOffset + Fr XDPRingOffset + Cr XDPRingOffset +} + +type XDPUmemReg struct { + Addr uint64 + Len uint64 + Size uint32 + Headroom uint32 +} + +type XDPStatistics struct { + Rx_dropped uint64 + Rx_invalid_descs uint64 + Tx_invalid_descs uint64 +} + +type XDPDesc struct { + Addr uint64 + Len uint32 + Options uint32 +} + +const ( + NCSI_CMD_UNSPEC = 0x0 + NCSI_CMD_PKG_INFO = 0x1 + NCSI_CMD_SET_INTERFACE = 0x2 + NCSI_CMD_CLEAR_INTERFACE = 0x3 + NCSI_ATTR_UNSPEC = 0x0 + NCSI_ATTR_IFINDEX = 0x1 + NCSI_ATTR_PACKAGE_LIST = 0x2 + NCSI_ATTR_PACKAGE_ID = 0x3 + NCSI_ATTR_CHANNEL_ID = 0x4 + NCSI_PKG_ATTR_UNSPEC = 0x0 + NCSI_PKG_ATTR = 0x1 + NCSI_PKG_ATTR_ID = 0x2 + NCSI_PKG_ATTR_FORCED = 0x3 + NCSI_PKG_ATTR_CHANNEL_LIST = 0x4 + NCSI_CHANNEL_ATTR_UNSPEC = 0x0 + NCSI_CHANNEL_ATTR = 0x1 + NCSI_CHANNEL_ATTR_ID = 0x2 + NCSI_CHANNEL_ATTR_VERSION_MAJOR = 0x3 + NCSI_CHANNEL_ATTR_VERSION_MINOR = 0x4 + NCSI_CHANNEL_ATTR_VERSION_STR = 0x5 + NCSI_CHANNEL_ATTR_LINK_STATE = 0x6 + NCSI_CHANNEL_ATTR_ACTIVE = 0x7 + NCSI_CHANNEL_ATTR_FORCED = 0x8 + NCSI_CHANNEL_ATTR_VLAN_LIST = 0x9 + NCSI_CHANNEL_ATTR_VLAN_ID = 0xa +) + +const ( + SOF_TIMESTAMPING_TX_HARDWARE = 0x1 + SOF_TIMESTAMPING_TX_SOFTWARE = 0x2 + SOF_TIMESTAMPING_RX_HARDWARE = 0x4 + SOF_TIMESTAMPING_RX_SOFTWARE = 0x8 + SOF_TIMESTAMPING_SOFTWARE = 0x10 + SOF_TIMESTAMPING_SYS_HARDWARE = 0x20 + SOF_TIMESTAMPING_RAW_HARDWARE = 0x40 + SOF_TIMESTAMPING_OPT_ID = 0x80 + SOF_TIMESTAMPING_TX_SCHED = 0x100 + SOF_TIMESTAMPING_TX_ACK = 0x200 + SOF_TIMESTAMPING_OPT_CMSG = 0x400 + SOF_TIMESTAMPING_OPT_TSONLY = 0x800 + SOF_TIMESTAMPING_OPT_STATS = 0x1000 + SOF_TIMESTAMPING_OPT_PKTINFO = 0x2000 + SOF_TIMESTAMPING_OPT_TX_SWHW = 0x4000 + + SOF_TIMESTAMPING_LAST = 0x4000 + SOF_TIMESTAMPING_MASK = 0x7fff +) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go new file mode 100644 index 00000000..a6f76149 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go @@ -0,0 +1,1991 @@ +// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build mips64,linux + +package unix + +const ( + SizeofPtr = 0x8 + SizeofShort = 0x2 + SizeofInt = 0x4 + SizeofLong = 0x8 + SizeofLongLong = 0x8 + PathMax = 0x1000 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Timex struct { + Modes uint32 + _ [4]byte + Offset int64 + Freq int64 + Maxerror int64 + Esterror int64 + Status int32 + _ [4]byte + Constant int64 + Precision int64 + Tolerance int64 + Time Timeval + Tick int64 + Ppsfreq int64 + Jitter int64 + Shift int32 + _ [4]byte + Stabil int64 + Jitcnt int64 + Calcnt int64 + Errcnt int64 + Stbcnt int64 + Tai int32 + _ [44]byte +} + +type Time_t int64 + +type Tms struct { + Utime int64 + Stime int64 + Cutime int64 + Cstime int64 +} + +type Utimbuf struct { + Actime int64 + Modtime int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint32 + Pad1 [3]uint32 + Ino uint64 + Mode uint32 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev uint32 + Pad2 [3]uint32 + Size int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + Blksize uint32 + Pad4 uint32 + Blocks int64 +} + +type StatxTimestamp struct { + Sec int64 + Nsec uint32 + _ int32 +} + +type Statx_t struct { + Mask uint32 + Blksize uint32 + Attributes uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Mode uint16 + _ [1]uint16 + Ino uint64 + Size uint64 + Blocks uint64 + Attributes_mask uint64 + Atime StatxTimestamp + Btime StatxTimestamp + Ctime StatxTimestamp + Mtime StatxTimestamp + Rdev_major uint32 + Rdev_minor uint32 + Dev_major uint32 + Dev_minor uint32 + _ [14]uint64 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]int8 + _ [5]byte +} + +type Fsid struct { + Val [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + _ [4]byte + Start int64 + Len int64 + Pid int32 + _ [4]byte +} + +type FscryptPolicy struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptKey struct { + Mode uint32 + Raw [64]uint8 + Size uint32 +} + +type KeyctlDHParams struct { + Private int32 + Prime int32 + Base int32 +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddrL2 struct { + Family uint16 + Psm uint16 + Bdaddr [6]uint8 + Cid uint16 + Bdaddr_type uint8 + _ [1]byte +} + +type RawSockaddrRFCOMM struct { + Family uint16 + Bdaddr [6]uint8 + Channel uint8 + _ [1]byte +} + +type RawSockaddrCAN struct { + Family uint16 + _ [2]byte + Ifindex int32 + Addr [8]byte +} + +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + +type RawSockaddrXDP struct { + Family uint16 + Flags uint16 + Ifindex uint32 + Queue_id uint32 + Shared_umem_fd uint32 +} + +type RawSockaddr struct { + Family uint16 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type PacketMreq struct { + Ifindex int32 + Type uint16 + Alen uint16 + Address [8]uint8 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + _ [4]byte + Iov *Iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + _ [4]byte +} + +type Cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + _ [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofSockaddrL2 = 0xe + SizeofSockaddrRFCOMM = 0xa + SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 + SizeofSockaddrXDP = 0x10 + SizeofLinger = 0x8 + SizeofIovec = 0x10 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofPacketMreq = 0x10 + SizeofMsghdr = 0x38 + SizeofCmsghdr = 0x10 + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_INFO_KIND = 0x1 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_NUM_VF = 0x15 + IFLA_VFINFO_LIST = 0x16 + IFLA_STATS64 = 0x17 + IFLA_VF_PORTS = 0x18 + IFLA_PORT_SELF = 0x19 + IFLA_AF_SPEC = 0x1a + IFLA_GROUP = 0x1b + IFLA_NET_NS_FD = 0x1c + IFLA_EXT_MASK = 0x1d + IFLA_PROMISCUITY = 0x1e + IFLA_NUM_TX_QUEUES = 0x1f + IFLA_NUM_RX_QUEUES = 0x20 + IFLA_CARRIER = 0x21 + IFLA_PHYS_PORT_ID = 0x22 + IFLA_CARRIER_CHANGES = 0x23 + IFLA_PHYS_SWITCH_ID = 0x24 + IFLA_LINK_NETNSID = 0x25 + IFLA_PHYS_PORT_NAME = 0x26 + IFLA_PROTO_DOWN = 0x27 + IFLA_GSO_MAX_SEGS = 0x28 + IFLA_GSO_MAX_SIZE = 0x29 + IFLA_PAD = 0x2a + IFLA_XDP = 0x2b + IFLA_EVENT = 0x2c + IFLA_NEW_NETNSID = 0x2d + IFLA_IF_NETNSID = 0x2e + IFLA_MAX = 0x33 + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTA_MARK = 0x10 + RTA_MFC_STATS = 0x11 + RTA_VIA = 0x12 + RTA_NEWDST = 0x13 + RTA_PREF = 0x14 + RTA_ENCAP_TYPE = 0x15 + RTA_ENCAP = 0x16 + RTA_EXPIRES = 0x17 + RTA_PAD = 0x18 + RTA_UID = 0x19 + RTA_TTL_PROPAGATE = 0x1a + RTA_IP_PROTO = 0x1b + RTA_SPORT = 0x1c + RTA_DPORT = 0x1d + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + _ uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x10 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + _ [6]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + Regs [32]uint64 + Lo uint64 + Hi uint64 + Epc uint64 + Badvaddr uint64 + Status uint64 + Cause uint64 +} + +type FdSet struct { + Bits [16]int64 +} + +type Sysinfo_t struct { + Uptime int64 + Loads [3]uint64 + Totalram uint64 + Freeram uint64 + Sharedram uint64 + Bufferram uint64 + Totalswap uint64 + Freeswap uint64 + Procs uint16 + Pad uint16 + _ [4]byte + Totalhigh uint64 + Freehigh uint64 + Unit uint32 + _ [0]int8 + _ [4]byte +} + +type Utsname struct { + Sysname [65]byte + Nodename [65]byte + Release [65]byte + Version [65]byte + Machine [65]byte + Domainname [65]byte +} + +type Ustat_t struct { + Tfree int32 + _ [4]byte + Tinode uint64 + Fname [6]int8 + Fpack [6]int8 + _ [4]byte +} + +type EpollEvent struct { + Events uint32 + Fd int32 + Pad int32 +} + +const ( + AT_EMPTY_PATH = 0x1000 + AT_FDCWD = -0x64 + AT_NO_AUTOMOUNT = 0x800 + AT_REMOVEDIR = 0x200 + + AT_STATX_SYNC_AS_STAT = 0x0 + AT_STATX_FORCE_SYNC = 0x2000 + AT_STATX_DONT_SYNC = 0x4000 + + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 + + AT_EACCESS = 0x200 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x2000 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Sigset_t struct { + Val [16]uint64 +} + +const RNDGETENTCNT = 0x40045200 + +const PERF_IOC_FLAG_GROUP = 0x1 + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Line uint8 + Cc [23]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Taskstats struct { + Version uint16 + _ [2]byte + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + _ [6]byte + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]int8 + Ac_sched uint8 + Ac_pad [3]uint8 + _ [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + _ [4]byte + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 +} + +const ( + TASKSTATS_CMD_UNSPEC = 0x0 + TASKSTATS_CMD_GET = 0x1 + TASKSTATS_CMD_NEW = 0x2 + TASKSTATS_TYPE_UNSPEC = 0x0 + TASKSTATS_TYPE_PID = 0x1 + TASKSTATS_TYPE_TGID = 0x2 + TASKSTATS_TYPE_STATS = 0x3 + TASKSTATS_TYPE_AGGR_PID = 0x4 + TASKSTATS_TYPE_AGGR_TGID = 0x5 + TASKSTATS_TYPE_NULL = 0x6 + TASKSTATS_CMD_ATTR_UNSPEC = 0x0 + TASKSTATS_CMD_ATTR_PID = 0x1 + TASKSTATS_CMD_ATTR_TGID = 0x2 + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 +) + +type CGroupStats struct { + Sleeping uint64 + Running uint64 + Stopped uint64 + Uninterruptible uint64 + Io_wait uint64 +} + +const ( + CGROUPSTATS_CMD_UNSPEC = 0x3 + CGROUPSTATS_CMD_GET = 0x4 + CGROUPSTATS_CMD_NEW = 0x5 + CGROUPSTATS_TYPE_UNSPEC = 0x0 + CGROUPSTATS_TYPE_CGROUP_STATS = 0x1 + CGROUPSTATS_CMD_ATTR_UNSPEC = 0x0 + CGROUPSTATS_CMD_ATTR_FD = 0x1 +) + +type Genlmsghdr struct { + Cmd uint8 + Version uint8 + Reserved uint16 +} + +const ( + CTRL_CMD_UNSPEC = 0x0 + CTRL_CMD_NEWFAMILY = 0x1 + CTRL_CMD_DELFAMILY = 0x2 + CTRL_CMD_GETFAMILY = 0x3 + CTRL_CMD_NEWOPS = 0x4 + CTRL_CMD_DELOPS = 0x5 + CTRL_CMD_GETOPS = 0x6 + CTRL_CMD_NEWMCAST_GRP = 0x7 + CTRL_CMD_DELMCAST_GRP = 0x8 + CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_ATTR_UNSPEC = 0x0 + CTRL_ATTR_FAMILY_ID = 0x1 + CTRL_ATTR_FAMILY_NAME = 0x2 + CTRL_ATTR_VERSION = 0x3 + CTRL_ATTR_HDRSIZE = 0x4 + CTRL_ATTR_MAXATTR = 0x5 + CTRL_ATTR_OPS = 0x6 + CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_OP_UNSPEC = 0x0 + CTRL_ATTR_OP_ID = 0x1 + CTRL_ATTR_OP_FLAGS = 0x2 + CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 + CTRL_ATTR_MCAST_GRP_NAME = 0x1 + CTRL_ATTR_MCAST_GRP_ID = 0x2 +) + +type cpuMask uint64 + +const ( + _CPU_SETSIZE = 0x400 + _NCPUBITS = 0x40 +) + +const ( + BDADDR_BREDR = 0x0 + BDADDR_LE_PUBLIC = 0x1 + BDADDR_LE_RANDOM = 0x2 +) + +type PerfEventAttr struct { + Type uint32 + Size uint32 + Config uint64 + Sample uint64 + Sample_type uint64 + Read_format uint64 + Bits uint64 + Wakeup uint32 + Bp_type uint32 + Ext1 uint64 + Ext2 uint64 + Branch_sample_type uint64 + Sample_regs_user uint64 + Sample_stack_user uint32 + Clockid int32 + Sample_regs_intr uint64 + Aux_watermark uint32 + _ uint32 +} + +type PerfEventMmapPage struct { + Version uint32 + Compat_version uint32 + Lock uint32 + Index uint32 + Offset int64 + Time_enabled uint64 + Time_running uint64 + Capabilities uint64 + Pmc_width uint16 + Time_shift uint16 + Time_mult uint32 + Time_offset uint64 + Time_zero uint64 + Size uint32 + _ [948]uint8 + Data_head uint64 + Data_tail uint64 + Data_offset uint64 + Data_size uint64 + Aux_head uint64 + Aux_tail uint64 + Aux_offset uint64 + Aux_size uint64 +} + +const ( + PerfBitDisabled uint64 = CBitFieldMaskBit0 + PerfBitInherit = CBitFieldMaskBit1 + PerfBitPinned = CBitFieldMaskBit2 + PerfBitExclusive = CBitFieldMaskBit3 + PerfBitExcludeUser = CBitFieldMaskBit4 + PerfBitExcludeKernel = CBitFieldMaskBit5 + PerfBitExcludeHv = CBitFieldMaskBit6 + PerfBitExcludeIdle = CBitFieldMaskBit7 + PerfBitMmap = CBitFieldMaskBit8 + PerfBitComm = CBitFieldMaskBit9 + PerfBitFreq = CBitFieldMaskBit10 + PerfBitInheritStat = CBitFieldMaskBit11 + PerfBitEnableOnExec = CBitFieldMaskBit12 + PerfBitTask = CBitFieldMaskBit13 + PerfBitWatermark = CBitFieldMaskBit14 + PerfBitPreciseIPBit1 = CBitFieldMaskBit15 + PerfBitPreciseIPBit2 = CBitFieldMaskBit16 + PerfBitMmapData = CBitFieldMaskBit17 + PerfBitSampleIDAll = CBitFieldMaskBit18 + PerfBitExcludeHost = CBitFieldMaskBit19 + PerfBitExcludeGuest = CBitFieldMaskBit20 + PerfBitExcludeCallchainKernel = CBitFieldMaskBit21 + PerfBitExcludeCallchainUser = CBitFieldMaskBit22 + PerfBitMmap2 = CBitFieldMaskBit23 + PerfBitCommExec = CBitFieldMaskBit24 + PerfBitUseClockID = CBitFieldMaskBit25 + PerfBitContextSwitch = CBitFieldMaskBit26 +) + +const ( + PERF_TYPE_HARDWARE = 0x0 + PERF_TYPE_SOFTWARE = 0x1 + PERF_TYPE_TRACEPOINT = 0x2 + PERF_TYPE_HW_CACHE = 0x3 + PERF_TYPE_RAW = 0x4 + PERF_TYPE_BREAKPOINT = 0x5 + + PERF_COUNT_HW_CPU_CYCLES = 0x0 + PERF_COUNT_HW_INSTRUCTIONS = 0x1 + PERF_COUNT_HW_CACHE_REFERENCES = 0x2 + PERF_COUNT_HW_CACHE_MISSES = 0x3 + PERF_COUNT_HW_BRANCH_INSTRUCTIONS = 0x4 + PERF_COUNT_HW_BRANCH_MISSES = 0x5 + PERF_COUNT_HW_BUS_CYCLES = 0x6 + PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 0x7 + PERF_COUNT_HW_STALLED_CYCLES_BACKEND = 0x8 + PERF_COUNT_HW_REF_CPU_CYCLES = 0x9 + + PERF_COUNT_HW_CACHE_L1D = 0x0 + PERF_COUNT_HW_CACHE_L1I = 0x1 + PERF_COUNT_HW_CACHE_LL = 0x2 + PERF_COUNT_HW_CACHE_DTLB = 0x3 + PERF_COUNT_HW_CACHE_ITLB = 0x4 + PERF_COUNT_HW_CACHE_BPU = 0x5 + PERF_COUNT_HW_CACHE_NODE = 0x6 + + PERF_COUNT_HW_CACHE_OP_READ = 0x0 + PERF_COUNT_HW_CACHE_OP_WRITE = 0x1 + PERF_COUNT_HW_CACHE_OP_PREFETCH = 0x2 + + PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0x0 + PERF_COUNT_HW_CACHE_RESULT_MISS = 0x1 + + PERF_COUNT_SW_CPU_CLOCK = 0x0 + PERF_COUNT_SW_TASK_CLOCK = 0x1 + PERF_COUNT_SW_PAGE_FAULTS = 0x2 + PERF_COUNT_SW_CONTEXT_SWITCHES = 0x3 + PERF_COUNT_SW_CPU_MIGRATIONS = 0x4 + PERF_COUNT_SW_PAGE_FAULTS_MIN = 0x5 + PERF_COUNT_SW_PAGE_FAULTS_MAJ = 0x6 + PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7 + PERF_COUNT_SW_EMULATION_FAULTS = 0x8 + PERF_COUNT_SW_DUMMY = 0x9 + + PERF_SAMPLE_IP = 0x1 + PERF_SAMPLE_TID = 0x2 + PERF_SAMPLE_TIME = 0x4 + PERF_SAMPLE_ADDR = 0x8 + PERF_SAMPLE_READ = 0x10 + PERF_SAMPLE_CALLCHAIN = 0x20 + PERF_SAMPLE_ID = 0x40 + PERF_SAMPLE_CPU = 0x80 + PERF_SAMPLE_PERIOD = 0x100 + PERF_SAMPLE_STREAM_ID = 0x200 + PERF_SAMPLE_RAW = 0x400 + PERF_SAMPLE_BRANCH_STACK = 0x800 + + PERF_SAMPLE_BRANCH_USER = 0x1 + PERF_SAMPLE_BRANCH_KERNEL = 0x2 + PERF_SAMPLE_BRANCH_HV = 0x4 + PERF_SAMPLE_BRANCH_ANY = 0x8 + PERF_SAMPLE_BRANCH_ANY_CALL = 0x10 + PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20 + PERF_SAMPLE_BRANCH_IND_CALL = 0x40 + + PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1 + PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2 + PERF_FORMAT_ID = 0x4 + PERF_FORMAT_GROUP = 0x8 + + PERF_RECORD_MMAP = 0x1 + PERF_RECORD_LOST = 0x2 + PERF_RECORD_COMM = 0x3 + PERF_RECORD_EXIT = 0x4 + PERF_RECORD_THROTTLE = 0x5 + PERF_RECORD_UNTHROTTLE = 0x6 + PERF_RECORD_FORK = 0x7 + PERF_RECORD_READ = 0x8 + PERF_RECORD_SAMPLE = 0x9 + + PERF_CONTEXT_HV = -0x20 + PERF_CONTEXT_KERNEL = -0x80 + PERF_CONTEXT_USER = -0x200 + + PERF_CONTEXT_GUEST = -0x800 + PERF_CONTEXT_GUEST_KERNEL = -0x880 + PERF_CONTEXT_GUEST_USER = -0xa00 + + PERF_FLAG_FD_NO_GROUP = 0x1 + PERF_FLAG_FD_OUTPUT = 0x2 + PERF_FLAG_PID_CGROUP = 0x4 +) + +const ( + CBitFieldMaskBit0 = 0x8000000000000000 + CBitFieldMaskBit1 = 0x4000000000000000 + CBitFieldMaskBit2 = 0x2000000000000000 + CBitFieldMaskBit3 = 0x1000000000000000 + CBitFieldMaskBit4 = 0x800000000000000 + CBitFieldMaskBit5 = 0x400000000000000 + CBitFieldMaskBit6 = 0x200000000000000 + CBitFieldMaskBit7 = 0x100000000000000 + CBitFieldMaskBit8 = 0x80000000000000 + CBitFieldMaskBit9 = 0x40000000000000 + CBitFieldMaskBit10 = 0x20000000000000 + CBitFieldMaskBit11 = 0x10000000000000 + CBitFieldMaskBit12 = 0x8000000000000 + CBitFieldMaskBit13 = 0x4000000000000 + CBitFieldMaskBit14 = 0x2000000000000 + CBitFieldMaskBit15 = 0x1000000000000 + CBitFieldMaskBit16 = 0x800000000000 + CBitFieldMaskBit17 = 0x400000000000 + CBitFieldMaskBit18 = 0x200000000000 + CBitFieldMaskBit19 = 0x100000000000 + CBitFieldMaskBit20 = 0x80000000000 + CBitFieldMaskBit21 = 0x40000000000 + CBitFieldMaskBit22 = 0x20000000000 + CBitFieldMaskBit23 = 0x10000000000 + CBitFieldMaskBit24 = 0x8000000000 + CBitFieldMaskBit25 = 0x4000000000 + CBitFieldMaskBit26 = 0x2000000000 + CBitFieldMaskBit27 = 0x1000000000 + CBitFieldMaskBit28 = 0x800000000 + CBitFieldMaskBit29 = 0x400000000 + CBitFieldMaskBit30 = 0x200000000 + CBitFieldMaskBit31 = 0x100000000 + CBitFieldMaskBit32 = 0x80000000 + CBitFieldMaskBit33 = 0x40000000 + CBitFieldMaskBit34 = 0x20000000 + CBitFieldMaskBit35 = 0x10000000 + CBitFieldMaskBit36 = 0x8000000 + CBitFieldMaskBit37 = 0x4000000 + CBitFieldMaskBit38 = 0x2000000 + CBitFieldMaskBit39 = 0x1000000 + CBitFieldMaskBit40 = 0x800000 + CBitFieldMaskBit41 = 0x400000 + CBitFieldMaskBit42 = 0x200000 + CBitFieldMaskBit43 = 0x100000 + CBitFieldMaskBit44 = 0x80000 + CBitFieldMaskBit45 = 0x40000 + CBitFieldMaskBit46 = 0x20000 + CBitFieldMaskBit47 = 0x10000 + CBitFieldMaskBit48 = 0x8000 + CBitFieldMaskBit49 = 0x4000 + CBitFieldMaskBit50 = 0x2000 + CBitFieldMaskBit51 = 0x1000 + CBitFieldMaskBit52 = 0x800 + CBitFieldMaskBit53 = 0x400 + CBitFieldMaskBit54 = 0x200 + CBitFieldMaskBit55 = 0x100 + CBitFieldMaskBit56 = 0x80 + CBitFieldMaskBit57 = 0x40 + CBitFieldMaskBit58 = 0x20 + CBitFieldMaskBit59 = 0x10 + CBitFieldMaskBit60 = 0x8 + CBitFieldMaskBit61 = 0x4 + CBitFieldMaskBit62 = 0x2 + CBitFieldMaskBit63 = 0x1 +) + +type SockaddrStorage struct { + Family uint16 + _ [118]int8 + _ uint64 +} + +type TCPMD5Sig struct { + Addr SockaddrStorage + Flags uint8 + Prefixlen uint8 + Keylen uint16 + _ uint32 + Key [80]uint8 +} + +type HDDriveCmdHdr struct { + Command uint8 + Number uint8 + Feature uint8 + Count uint8 +} + +type HDGeometry struct { + Heads uint8 + Sectors uint8 + Cylinders uint16 + _ [4]byte + Start uint64 +} + +type HDDriveID struct { + Config uint16 + Cyls uint16 + Reserved2 uint16 + Heads uint16 + Track_bytes uint16 + Sector_bytes uint16 + Sectors uint16 + Vendor0 uint16 + Vendor1 uint16 + Vendor2 uint16 + Serial_no [20]uint8 + Buf_type uint16 + Buf_size uint16 + Ecc_bytes uint16 + Fw_rev [8]uint8 + Model [40]uint8 + Max_multsect uint8 + Vendor3 uint8 + Dword_io uint16 + Vendor4 uint8 + Capability uint8 + Reserved50 uint16 + Vendor5 uint8 + TPIO uint8 + Vendor6 uint8 + TDMA uint8 + Field_valid uint16 + Cur_cyls uint16 + Cur_heads uint16 + Cur_sectors uint16 + Cur_capacity0 uint16 + Cur_capacity1 uint16 + Multsect uint8 + Multsect_valid uint8 + Lba_capacity uint32 + Dma_1word uint16 + Dma_mword uint16 + Eide_pio_modes uint16 + Eide_dma_min uint16 + Eide_dma_time uint16 + Eide_pio uint16 + Eide_pio_iordy uint16 + Words69_70 [2]uint16 + Words71_74 [4]uint16 + Queue_depth uint16 + Words76_79 [4]uint16 + Major_rev_num uint16 + Minor_rev_num uint16 + Command_set_1 uint16 + Command_set_2 uint16 + Cfsse uint16 + Cfs_enable_1 uint16 + Cfs_enable_2 uint16 + Csf_default uint16 + Dma_ultra uint16 + Trseuc uint16 + TrsEuc uint16 + CurAPMvalues uint16 + Mprc uint16 + Hw_config uint16 + Acoustic uint16 + Msrqs uint16 + Sxfert uint16 + Sal uint16 + Spg uint32 + Lba_capacity_2 uint64 + Words104_125 [22]uint16 + Last_lun uint16 + Word127 uint16 + Dlf uint16 + Csfo uint16 + Words130_155 [26]uint16 + Word156 uint16 + Words157_159 [3]uint16 + Cfa_power uint16 + Words161_175 [15]uint16 + Words176_205 [30]uint16 + Words206_254 [49]uint16 + Integrity_word uint16 +} + +type Statfs_t struct { + Type int64 + Bsize int64 + Frsize int64 + Blocks uint64 + Bfree uint64 + Files uint64 + Ffree uint64 + Bavail uint64 + Fsid Fsid + Namelen int64 + Flags int64 + Spare [5]int64 +} + +const ( + ST_MANDLOCK = 0x40 + ST_NOATIME = 0x400 + ST_NODEV = 0x4 + ST_NODIRATIME = 0x800 + ST_NOEXEC = 0x8 + ST_NOSUID = 0x2 + ST_RDONLY = 0x1 + ST_RELATIME = 0x1000 + ST_SYNCHRONOUS = 0x10 +) + +type TpacketHdr struct { + Status uint64 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Sec uint32 + Usec uint32 + _ [4]byte +} + +type Tpacket2Hdr struct { + Status uint32 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Sec uint32 + Nsec uint32 + Vlan_tci uint16 + Vlan_tpid uint16 + _ [4]uint8 +} + +type Tpacket3Hdr struct { + Next_offset uint32 + Sec uint32 + Nsec uint32 + Snaplen uint32 + Len uint32 + Status uint32 + Mac uint16 + Net uint16 + Hv1 TpacketHdrVariant1 + _ [8]uint8 +} + +type TpacketHdrVariant1 struct { + Rxhash uint32 + Vlan_tci uint32 + Vlan_tpid uint16 + _ uint16 +} + +type TpacketBlockDesc struct { + Version uint32 + To_priv uint32 + Hdr [40]byte +} + +type TpacketReq struct { + Block_size uint32 + Block_nr uint32 + Frame_size uint32 + Frame_nr uint32 +} + +type TpacketReq3 struct { + Block_size uint32 + Block_nr uint32 + Frame_size uint32 + Frame_nr uint32 + Retire_blk_tov uint32 + Sizeof_priv uint32 + Feature_req_word uint32 +} + +type TpacketStats struct { + Packets uint32 + Drops uint32 +} + +type TpacketStatsV3 struct { + Packets uint32 + Drops uint32 + Freeze_q_cnt uint32 +} + +type TpacketAuxdata struct { + Status uint32 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Vlan_tci uint16 + Vlan_tpid uint16 +} + +const ( + TPACKET_V1 = 0x0 + TPACKET_V2 = 0x1 + TPACKET_V3 = 0x2 +) + +const ( + SizeofTpacketHdr = 0x20 + SizeofTpacket2Hdr = 0x20 + SizeofTpacket3Hdr = 0x30 +) + +const ( + NF_INET_PRE_ROUTING = 0x0 + NF_INET_LOCAL_IN = 0x1 + NF_INET_FORWARD = 0x2 + NF_INET_LOCAL_OUT = 0x3 + NF_INET_POST_ROUTING = 0x4 + NF_INET_NUMHOOKS = 0x5 +) + +const ( + NF_NETDEV_INGRESS = 0x0 + NF_NETDEV_NUMHOOKS = 0x1 +) + +const ( + NFPROTO_UNSPEC = 0x0 + NFPROTO_INET = 0x1 + NFPROTO_IPV4 = 0x2 + NFPROTO_ARP = 0x3 + NFPROTO_NETDEV = 0x5 + NFPROTO_BRIDGE = 0x7 + NFPROTO_IPV6 = 0xa + NFPROTO_DECNET = 0xc + NFPROTO_NUMPROTO = 0xd +) + +type Nfgenmsg struct { + Nfgen_family uint8 + Version uint8 + Res_id uint16 +} + +const ( + NFNL_BATCH_UNSPEC = 0x0 + NFNL_BATCH_GENID = 0x1 +) + +const ( + NFT_REG_VERDICT = 0x0 + NFT_REG_1 = 0x1 + NFT_REG_2 = 0x2 + NFT_REG_3 = 0x3 + NFT_REG_4 = 0x4 + NFT_REG32_00 = 0x8 + NFT_REG32_01 = 0x9 + NFT_REG32_02 = 0xa + NFT_REG32_03 = 0xb + NFT_REG32_04 = 0xc + NFT_REG32_05 = 0xd + NFT_REG32_06 = 0xe + NFT_REG32_07 = 0xf + NFT_REG32_08 = 0x10 + NFT_REG32_09 = 0x11 + NFT_REG32_10 = 0x12 + NFT_REG32_11 = 0x13 + NFT_REG32_12 = 0x14 + NFT_REG32_13 = 0x15 + NFT_REG32_14 = 0x16 + NFT_REG32_15 = 0x17 + NFT_CONTINUE = -0x1 + NFT_BREAK = -0x2 + NFT_JUMP = -0x3 + NFT_GOTO = -0x4 + NFT_RETURN = -0x5 + NFT_MSG_NEWTABLE = 0x0 + NFT_MSG_GETTABLE = 0x1 + NFT_MSG_DELTABLE = 0x2 + NFT_MSG_NEWCHAIN = 0x3 + NFT_MSG_GETCHAIN = 0x4 + NFT_MSG_DELCHAIN = 0x5 + NFT_MSG_NEWRULE = 0x6 + NFT_MSG_GETRULE = 0x7 + NFT_MSG_DELRULE = 0x8 + NFT_MSG_NEWSET = 0x9 + NFT_MSG_GETSET = 0xa + NFT_MSG_DELSET = 0xb + NFT_MSG_NEWSETELEM = 0xc + NFT_MSG_GETSETELEM = 0xd + NFT_MSG_DELSETELEM = 0xe + NFT_MSG_NEWGEN = 0xf + NFT_MSG_GETGEN = 0x10 + NFT_MSG_TRACE = 0x11 + NFT_MSG_NEWOBJ = 0x12 + NFT_MSG_GETOBJ = 0x13 + NFT_MSG_DELOBJ = 0x14 + NFT_MSG_GETOBJ_RESET = 0x15 + NFT_MSG_MAX = 0x19 + NFTA_LIST_UNPEC = 0x0 + NFTA_LIST_ELEM = 0x1 + NFTA_HOOK_UNSPEC = 0x0 + NFTA_HOOK_HOOKNUM = 0x1 + NFTA_HOOK_PRIORITY = 0x2 + NFTA_HOOK_DEV = 0x3 + NFT_TABLE_F_DORMANT = 0x1 + NFTA_TABLE_UNSPEC = 0x0 + NFTA_TABLE_NAME = 0x1 + NFTA_TABLE_FLAGS = 0x2 + NFTA_TABLE_USE = 0x3 + NFTA_CHAIN_UNSPEC = 0x0 + NFTA_CHAIN_TABLE = 0x1 + NFTA_CHAIN_HANDLE = 0x2 + NFTA_CHAIN_NAME = 0x3 + NFTA_CHAIN_HOOK = 0x4 + NFTA_CHAIN_POLICY = 0x5 + NFTA_CHAIN_USE = 0x6 + NFTA_CHAIN_TYPE = 0x7 + NFTA_CHAIN_COUNTERS = 0x8 + NFTA_CHAIN_PAD = 0x9 + NFTA_RULE_UNSPEC = 0x0 + NFTA_RULE_TABLE = 0x1 + NFTA_RULE_CHAIN = 0x2 + NFTA_RULE_HANDLE = 0x3 + NFTA_RULE_EXPRESSIONS = 0x4 + NFTA_RULE_COMPAT = 0x5 + NFTA_RULE_POSITION = 0x6 + NFTA_RULE_USERDATA = 0x7 + NFTA_RULE_PAD = 0x8 + NFTA_RULE_ID = 0x9 + NFT_RULE_COMPAT_F_INV = 0x2 + NFT_RULE_COMPAT_F_MASK = 0x2 + NFTA_RULE_COMPAT_UNSPEC = 0x0 + NFTA_RULE_COMPAT_PROTO = 0x1 + NFTA_RULE_COMPAT_FLAGS = 0x2 + NFT_SET_ANONYMOUS = 0x1 + NFT_SET_CONSTANT = 0x2 + NFT_SET_INTERVAL = 0x4 + NFT_SET_MAP = 0x8 + NFT_SET_TIMEOUT = 0x10 + NFT_SET_EVAL = 0x20 + NFT_SET_OBJECT = 0x40 + NFT_SET_POL_PERFORMANCE = 0x0 + NFT_SET_POL_MEMORY = 0x1 + NFTA_SET_DESC_UNSPEC = 0x0 + NFTA_SET_DESC_SIZE = 0x1 + NFTA_SET_UNSPEC = 0x0 + NFTA_SET_TABLE = 0x1 + NFTA_SET_NAME = 0x2 + NFTA_SET_FLAGS = 0x3 + NFTA_SET_KEY_TYPE = 0x4 + NFTA_SET_KEY_LEN = 0x5 + NFTA_SET_DATA_TYPE = 0x6 + NFTA_SET_DATA_LEN = 0x7 + NFTA_SET_POLICY = 0x8 + NFTA_SET_DESC = 0x9 + NFTA_SET_ID = 0xa + NFTA_SET_TIMEOUT = 0xb + NFTA_SET_GC_INTERVAL = 0xc + NFTA_SET_USERDATA = 0xd + NFTA_SET_PAD = 0xe + NFTA_SET_OBJ_TYPE = 0xf + NFT_SET_ELEM_INTERVAL_END = 0x1 + NFTA_SET_ELEM_UNSPEC = 0x0 + NFTA_SET_ELEM_KEY = 0x1 + NFTA_SET_ELEM_DATA = 0x2 + NFTA_SET_ELEM_FLAGS = 0x3 + NFTA_SET_ELEM_TIMEOUT = 0x4 + NFTA_SET_ELEM_EXPIRATION = 0x5 + NFTA_SET_ELEM_USERDATA = 0x6 + NFTA_SET_ELEM_EXPR = 0x7 + NFTA_SET_ELEM_PAD = 0x8 + NFTA_SET_ELEM_OBJREF = 0x9 + NFTA_SET_ELEM_LIST_UNSPEC = 0x0 + NFTA_SET_ELEM_LIST_TABLE = 0x1 + NFTA_SET_ELEM_LIST_SET = 0x2 + NFTA_SET_ELEM_LIST_ELEMENTS = 0x3 + NFTA_SET_ELEM_LIST_SET_ID = 0x4 + NFT_DATA_VALUE = 0x0 + NFT_DATA_VERDICT = 0xffffff00 + NFTA_DATA_UNSPEC = 0x0 + NFTA_DATA_VALUE = 0x1 + NFTA_DATA_VERDICT = 0x2 + NFTA_VERDICT_UNSPEC = 0x0 + NFTA_VERDICT_CODE = 0x1 + NFTA_VERDICT_CHAIN = 0x2 + NFTA_EXPR_UNSPEC = 0x0 + NFTA_EXPR_NAME = 0x1 + NFTA_EXPR_DATA = 0x2 + NFTA_IMMEDIATE_UNSPEC = 0x0 + NFTA_IMMEDIATE_DREG = 0x1 + NFTA_IMMEDIATE_DATA = 0x2 + NFTA_BITWISE_UNSPEC = 0x0 + NFTA_BITWISE_SREG = 0x1 + NFTA_BITWISE_DREG = 0x2 + NFTA_BITWISE_LEN = 0x3 + NFTA_BITWISE_MASK = 0x4 + NFTA_BITWISE_XOR = 0x5 + NFT_BYTEORDER_NTOH = 0x0 + NFT_BYTEORDER_HTON = 0x1 + NFTA_BYTEORDER_UNSPEC = 0x0 + NFTA_BYTEORDER_SREG = 0x1 + NFTA_BYTEORDER_DREG = 0x2 + NFTA_BYTEORDER_OP = 0x3 + NFTA_BYTEORDER_LEN = 0x4 + NFTA_BYTEORDER_SIZE = 0x5 + NFT_CMP_EQ = 0x0 + NFT_CMP_NEQ = 0x1 + NFT_CMP_LT = 0x2 + NFT_CMP_LTE = 0x3 + NFT_CMP_GT = 0x4 + NFT_CMP_GTE = 0x5 + NFTA_CMP_UNSPEC = 0x0 + NFTA_CMP_SREG = 0x1 + NFTA_CMP_OP = 0x2 + NFTA_CMP_DATA = 0x3 + NFT_RANGE_EQ = 0x0 + NFT_RANGE_NEQ = 0x1 + NFTA_RANGE_UNSPEC = 0x0 + NFTA_RANGE_SREG = 0x1 + NFTA_RANGE_OP = 0x2 + NFTA_RANGE_FROM_DATA = 0x3 + NFTA_RANGE_TO_DATA = 0x4 + NFT_LOOKUP_F_INV = 0x1 + NFTA_LOOKUP_UNSPEC = 0x0 + NFTA_LOOKUP_SET = 0x1 + NFTA_LOOKUP_SREG = 0x2 + NFTA_LOOKUP_DREG = 0x3 + NFTA_LOOKUP_SET_ID = 0x4 + NFTA_LOOKUP_FLAGS = 0x5 + NFT_DYNSET_OP_ADD = 0x0 + NFT_DYNSET_OP_UPDATE = 0x1 + NFT_DYNSET_F_INV = 0x1 + NFTA_DYNSET_UNSPEC = 0x0 + NFTA_DYNSET_SET_NAME = 0x1 + NFTA_DYNSET_SET_ID = 0x2 + NFTA_DYNSET_OP = 0x3 + NFTA_DYNSET_SREG_KEY = 0x4 + NFTA_DYNSET_SREG_DATA = 0x5 + NFTA_DYNSET_TIMEOUT = 0x6 + NFTA_DYNSET_EXPR = 0x7 + NFTA_DYNSET_PAD = 0x8 + NFTA_DYNSET_FLAGS = 0x9 + NFT_PAYLOAD_LL_HEADER = 0x0 + NFT_PAYLOAD_NETWORK_HEADER = 0x1 + NFT_PAYLOAD_TRANSPORT_HEADER = 0x2 + NFT_PAYLOAD_CSUM_NONE = 0x0 + NFT_PAYLOAD_CSUM_INET = 0x1 + NFT_PAYLOAD_L4CSUM_PSEUDOHDR = 0x1 + NFTA_PAYLOAD_UNSPEC = 0x0 + NFTA_PAYLOAD_DREG = 0x1 + NFTA_PAYLOAD_BASE = 0x2 + NFTA_PAYLOAD_OFFSET = 0x3 + NFTA_PAYLOAD_LEN = 0x4 + NFTA_PAYLOAD_SREG = 0x5 + NFTA_PAYLOAD_CSUM_TYPE = 0x6 + NFTA_PAYLOAD_CSUM_OFFSET = 0x7 + NFTA_PAYLOAD_CSUM_FLAGS = 0x8 + NFT_EXTHDR_F_PRESENT = 0x1 + NFT_EXTHDR_OP_IPV6 = 0x0 + NFT_EXTHDR_OP_TCPOPT = 0x1 + NFTA_EXTHDR_UNSPEC = 0x0 + NFTA_EXTHDR_DREG = 0x1 + NFTA_EXTHDR_TYPE = 0x2 + NFTA_EXTHDR_OFFSET = 0x3 + NFTA_EXTHDR_LEN = 0x4 + NFTA_EXTHDR_FLAGS = 0x5 + NFTA_EXTHDR_OP = 0x6 + NFTA_EXTHDR_SREG = 0x7 + NFT_META_LEN = 0x0 + NFT_META_PROTOCOL = 0x1 + NFT_META_PRIORITY = 0x2 + NFT_META_MARK = 0x3 + NFT_META_IIF = 0x4 + NFT_META_OIF = 0x5 + NFT_META_IIFNAME = 0x6 + NFT_META_OIFNAME = 0x7 + NFT_META_IIFTYPE = 0x8 + NFT_META_OIFTYPE = 0x9 + NFT_META_SKUID = 0xa + NFT_META_SKGID = 0xb + NFT_META_NFTRACE = 0xc + NFT_META_RTCLASSID = 0xd + NFT_META_SECMARK = 0xe + NFT_META_NFPROTO = 0xf + NFT_META_L4PROTO = 0x10 + NFT_META_BRI_IIFNAME = 0x11 + NFT_META_BRI_OIFNAME = 0x12 + NFT_META_PKTTYPE = 0x13 + NFT_META_CPU = 0x14 + NFT_META_IIFGROUP = 0x15 + NFT_META_OIFGROUP = 0x16 + NFT_META_CGROUP = 0x17 + NFT_META_PRANDOM = 0x18 + NFT_RT_CLASSID = 0x0 + NFT_RT_NEXTHOP4 = 0x1 + NFT_RT_NEXTHOP6 = 0x2 + NFT_RT_TCPMSS = 0x3 + NFT_HASH_JENKINS = 0x0 + NFT_HASH_SYM = 0x1 + NFTA_HASH_UNSPEC = 0x0 + NFTA_HASH_SREG = 0x1 + NFTA_HASH_DREG = 0x2 + NFTA_HASH_LEN = 0x3 + NFTA_HASH_MODULUS = 0x4 + NFTA_HASH_SEED = 0x5 + NFTA_HASH_OFFSET = 0x6 + NFTA_HASH_TYPE = 0x7 + NFTA_META_UNSPEC = 0x0 + NFTA_META_DREG = 0x1 + NFTA_META_KEY = 0x2 + NFTA_META_SREG = 0x3 + NFTA_RT_UNSPEC = 0x0 + NFTA_RT_DREG = 0x1 + NFTA_RT_KEY = 0x2 + NFT_CT_STATE = 0x0 + NFT_CT_DIRECTION = 0x1 + NFT_CT_STATUS = 0x2 + NFT_CT_MARK = 0x3 + NFT_CT_SECMARK = 0x4 + NFT_CT_EXPIRATION = 0x5 + NFT_CT_HELPER = 0x6 + NFT_CT_L3PROTOCOL = 0x7 + NFT_CT_SRC = 0x8 + NFT_CT_DST = 0x9 + NFT_CT_PROTOCOL = 0xa + NFT_CT_PROTO_SRC = 0xb + NFT_CT_PROTO_DST = 0xc + NFT_CT_LABELS = 0xd + NFT_CT_PKTS = 0xe + NFT_CT_BYTES = 0xf + NFT_CT_AVGPKT = 0x10 + NFT_CT_ZONE = 0x11 + NFT_CT_EVENTMASK = 0x12 + NFTA_CT_UNSPEC = 0x0 + NFTA_CT_DREG = 0x1 + NFTA_CT_KEY = 0x2 + NFTA_CT_DIRECTION = 0x3 + NFTA_CT_SREG = 0x4 + NFT_LIMIT_PKTS = 0x0 + NFT_LIMIT_PKT_BYTES = 0x1 + NFT_LIMIT_F_INV = 0x1 + NFTA_LIMIT_UNSPEC = 0x0 + NFTA_LIMIT_RATE = 0x1 + NFTA_LIMIT_UNIT = 0x2 + NFTA_LIMIT_BURST = 0x3 + NFTA_LIMIT_TYPE = 0x4 + NFTA_LIMIT_FLAGS = 0x5 + NFTA_LIMIT_PAD = 0x6 + NFTA_COUNTER_UNSPEC = 0x0 + NFTA_COUNTER_BYTES = 0x1 + NFTA_COUNTER_PACKETS = 0x2 + NFTA_COUNTER_PAD = 0x3 + NFTA_LOG_UNSPEC = 0x0 + NFTA_LOG_GROUP = 0x1 + NFTA_LOG_PREFIX = 0x2 + NFTA_LOG_SNAPLEN = 0x3 + NFTA_LOG_QTHRESHOLD = 0x4 + NFTA_LOG_LEVEL = 0x5 + NFTA_LOG_FLAGS = 0x6 + NFTA_QUEUE_UNSPEC = 0x0 + NFTA_QUEUE_NUM = 0x1 + NFTA_QUEUE_TOTAL = 0x2 + NFTA_QUEUE_FLAGS = 0x3 + NFTA_QUEUE_SREG_QNUM = 0x4 + NFT_QUOTA_F_INV = 0x1 + NFT_QUOTA_F_DEPLETED = 0x2 + NFTA_QUOTA_UNSPEC = 0x0 + NFTA_QUOTA_BYTES = 0x1 + NFTA_QUOTA_FLAGS = 0x2 + NFTA_QUOTA_PAD = 0x3 + NFTA_QUOTA_CONSUMED = 0x4 + NFT_REJECT_ICMP_UNREACH = 0x0 + NFT_REJECT_TCP_RST = 0x1 + NFT_REJECT_ICMPX_UNREACH = 0x2 + NFT_REJECT_ICMPX_NO_ROUTE = 0x0 + NFT_REJECT_ICMPX_PORT_UNREACH = 0x1 + NFT_REJECT_ICMPX_HOST_UNREACH = 0x2 + NFT_REJECT_ICMPX_ADMIN_PROHIBITED = 0x3 + NFTA_REJECT_UNSPEC = 0x0 + NFTA_REJECT_TYPE = 0x1 + NFTA_REJECT_ICMP_CODE = 0x2 + NFT_NAT_SNAT = 0x0 + NFT_NAT_DNAT = 0x1 + NFTA_NAT_UNSPEC = 0x0 + NFTA_NAT_TYPE = 0x1 + NFTA_NAT_FAMILY = 0x2 + NFTA_NAT_REG_ADDR_MIN = 0x3 + NFTA_NAT_REG_ADDR_MAX = 0x4 + NFTA_NAT_REG_PROTO_MIN = 0x5 + NFTA_NAT_REG_PROTO_MAX = 0x6 + NFTA_NAT_FLAGS = 0x7 + NFTA_MASQ_UNSPEC = 0x0 + NFTA_MASQ_FLAGS = 0x1 + NFTA_MASQ_REG_PROTO_MIN = 0x2 + NFTA_MASQ_REG_PROTO_MAX = 0x3 + NFTA_REDIR_UNSPEC = 0x0 + NFTA_REDIR_REG_PROTO_MIN = 0x1 + NFTA_REDIR_REG_PROTO_MAX = 0x2 + NFTA_REDIR_FLAGS = 0x3 + NFTA_DUP_UNSPEC = 0x0 + NFTA_DUP_SREG_ADDR = 0x1 + NFTA_DUP_SREG_DEV = 0x2 + NFTA_FWD_UNSPEC = 0x0 + NFTA_FWD_SREG_DEV = 0x1 + NFTA_OBJREF_UNSPEC = 0x0 + NFTA_OBJREF_IMM_TYPE = 0x1 + NFTA_OBJREF_IMM_NAME = 0x2 + NFTA_OBJREF_SET_SREG = 0x3 + NFTA_OBJREF_SET_NAME = 0x4 + NFTA_OBJREF_SET_ID = 0x5 + NFTA_GEN_UNSPEC = 0x0 + NFTA_GEN_ID = 0x1 + NFTA_GEN_PROC_PID = 0x2 + NFTA_GEN_PROC_NAME = 0x3 + NFTA_FIB_UNSPEC = 0x0 + NFTA_FIB_DREG = 0x1 + NFTA_FIB_RESULT = 0x2 + NFTA_FIB_FLAGS = 0x3 + NFT_FIB_RESULT_UNSPEC = 0x0 + NFT_FIB_RESULT_OIF = 0x1 + NFT_FIB_RESULT_OIFNAME = 0x2 + NFT_FIB_RESULT_ADDRTYPE = 0x3 + NFTA_FIB_F_SADDR = 0x1 + NFTA_FIB_F_DADDR = 0x2 + NFTA_FIB_F_MARK = 0x4 + NFTA_FIB_F_IIF = 0x8 + NFTA_FIB_F_OIF = 0x10 + NFTA_FIB_F_PRESENT = 0x20 + NFTA_CT_HELPER_UNSPEC = 0x0 + NFTA_CT_HELPER_NAME = 0x1 + NFTA_CT_HELPER_L3PROTO = 0x2 + NFTA_CT_HELPER_L4PROTO = 0x3 + NFTA_OBJ_UNSPEC = 0x0 + NFTA_OBJ_TABLE = 0x1 + NFTA_OBJ_NAME = 0x2 + NFTA_OBJ_TYPE = 0x3 + NFTA_OBJ_DATA = 0x4 + NFTA_OBJ_USE = 0x5 + NFTA_TRACE_UNSPEC = 0x0 + NFTA_TRACE_TABLE = 0x1 + NFTA_TRACE_CHAIN = 0x2 + NFTA_TRACE_RULE_HANDLE = 0x3 + NFTA_TRACE_TYPE = 0x4 + NFTA_TRACE_VERDICT = 0x5 + NFTA_TRACE_ID = 0x6 + NFTA_TRACE_LL_HEADER = 0x7 + NFTA_TRACE_NETWORK_HEADER = 0x8 + NFTA_TRACE_TRANSPORT_HEADER = 0x9 + NFTA_TRACE_IIF = 0xa + NFTA_TRACE_IIFTYPE = 0xb + NFTA_TRACE_OIF = 0xc + NFTA_TRACE_OIFTYPE = 0xd + NFTA_TRACE_MARK = 0xe + NFTA_TRACE_NFPROTO = 0xf + NFTA_TRACE_POLICY = 0x10 + NFTA_TRACE_PAD = 0x11 + NFT_TRACETYPE_UNSPEC = 0x0 + NFT_TRACETYPE_POLICY = 0x1 + NFT_TRACETYPE_RETURN = 0x2 + NFT_TRACETYPE_RULE = 0x3 + NFTA_NG_UNSPEC = 0x0 + NFTA_NG_DREG = 0x1 + NFTA_NG_MODULUS = 0x2 + NFTA_NG_TYPE = 0x3 + NFTA_NG_OFFSET = 0x4 + NFT_NG_INCREMENTAL = 0x0 + NFT_NG_RANDOM = 0x1 +) + +type RTCTime struct { + Sec int32 + Min int32 + Hour int32 + Mday int32 + Mon int32 + Year int32 + Wday int32 + Yday int32 + Isdst int32 +} + +type RTCWkAlrm struct { + Enabled uint8 + Pending uint8 + _ [2]byte + Time RTCTime +} + +type RTCPLLInfo struct { + Ctrl int32 + Value int32 + Max int32 + Min int32 + Posmult int32 + Negmult int32 + Clock int64 +} + +type BlkpgIoctlArg struct { + Op int32 + Flags int32 + Datalen int32 + _ [4]byte + Data *byte +} + +type BlkpgPartition struct { + Start int64 + Length int64 + Pno int32 + Devname [64]uint8 + Volname [64]uint8 + _ [4]byte +} + +const ( + BLKPG = 0x20001269 + BLKPG_ADD_PARTITION = 0x1 + BLKPG_DEL_PARTITION = 0x2 + BLKPG_RESIZE_PARTITION = 0x3 +) + +const ( + NETNSA_NONE = 0x0 + NETNSA_NSID = 0x1 + NETNSA_PID = 0x2 + NETNSA_FD = 0x3 +) + +type XDPRingOffset struct { + Producer uint64 + Consumer uint64 + Desc uint64 +} + +type XDPMmapOffsets struct { + Rx XDPRingOffset + Tx XDPRingOffset + Fr XDPRingOffset + Cr XDPRingOffset +} + +type XDPUmemReg struct { + Addr uint64 + Len uint64 + Size uint32 + Headroom uint32 +} + +type XDPStatistics struct { + Rx_dropped uint64 + Rx_invalid_descs uint64 + Tx_invalid_descs uint64 +} + +type XDPDesc struct { + Addr uint64 + Len uint32 + Options uint32 +} + +const ( + NCSI_CMD_UNSPEC = 0x0 + NCSI_CMD_PKG_INFO = 0x1 + NCSI_CMD_SET_INTERFACE = 0x2 + NCSI_CMD_CLEAR_INTERFACE = 0x3 + NCSI_ATTR_UNSPEC = 0x0 + NCSI_ATTR_IFINDEX = 0x1 + NCSI_ATTR_PACKAGE_LIST = 0x2 + NCSI_ATTR_PACKAGE_ID = 0x3 + NCSI_ATTR_CHANNEL_ID = 0x4 + NCSI_PKG_ATTR_UNSPEC = 0x0 + NCSI_PKG_ATTR = 0x1 + NCSI_PKG_ATTR_ID = 0x2 + NCSI_PKG_ATTR_FORCED = 0x3 + NCSI_PKG_ATTR_CHANNEL_LIST = 0x4 + NCSI_CHANNEL_ATTR_UNSPEC = 0x0 + NCSI_CHANNEL_ATTR = 0x1 + NCSI_CHANNEL_ATTR_ID = 0x2 + NCSI_CHANNEL_ATTR_VERSION_MAJOR = 0x3 + NCSI_CHANNEL_ATTR_VERSION_MINOR = 0x4 + NCSI_CHANNEL_ATTR_VERSION_STR = 0x5 + NCSI_CHANNEL_ATTR_LINK_STATE = 0x6 + NCSI_CHANNEL_ATTR_ACTIVE = 0x7 + NCSI_CHANNEL_ATTR_FORCED = 0x8 + NCSI_CHANNEL_ATTR_VLAN_LIST = 0x9 + NCSI_CHANNEL_ATTR_VLAN_ID = 0xa +) + +const ( + SOF_TIMESTAMPING_TX_HARDWARE = 0x1 + SOF_TIMESTAMPING_TX_SOFTWARE = 0x2 + SOF_TIMESTAMPING_RX_HARDWARE = 0x4 + SOF_TIMESTAMPING_RX_SOFTWARE = 0x8 + SOF_TIMESTAMPING_SOFTWARE = 0x10 + SOF_TIMESTAMPING_SYS_HARDWARE = 0x20 + SOF_TIMESTAMPING_RAW_HARDWARE = 0x40 + SOF_TIMESTAMPING_OPT_ID = 0x80 + SOF_TIMESTAMPING_TX_SCHED = 0x100 + SOF_TIMESTAMPING_TX_ACK = 0x200 + SOF_TIMESTAMPING_OPT_CMSG = 0x400 + SOF_TIMESTAMPING_OPT_TSONLY = 0x800 + SOF_TIMESTAMPING_OPT_STATS = 0x1000 + SOF_TIMESTAMPING_OPT_PKTINFO = 0x2000 + SOF_TIMESTAMPING_OPT_TX_SWHW = 0x4000 + + SOF_TIMESTAMPING_LAST = 0x4000 + SOF_TIMESTAMPING_MASK = 0x7fff +) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go new file mode 100644 index 00000000..3dd19417 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go @@ -0,0 +1,1991 @@ +// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build mips64le,linux + +package unix + +const ( + SizeofPtr = 0x8 + SizeofShort = 0x2 + SizeofInt = 0x4 + SizeofLong = 0x8 + SizeofLongLong = 0x8 + PathMax = 0x1000 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Timex struct { + Modes uint32 + _ [4]byte + Offset int64 + Freq int64 + Maxerror int64 + Esterror int64 + Status int32 + _ [4]byte + Constant int64 + Precision int64 + Tolerance int64 + Time Timeval + Tick int64 + Ppsfreq int64 + Jitter int64 + Shift int32 + _ [4]byte + Stabil int64 + Jitcnt int64 + Calcnt int64 + Errcnt int64 + Stbcnt int64 + Tai int32 + _ [44]byte +} + +type Time_t int64 + +type Tms struct { + Utime int64 + Stime int64 + Cutime int64 + Cstime int64 +} + +type Utimbuf struct { + Actime int64 + Modtime int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint32 + Pad1 [3]uint32 + Ino uint64 + Mode uint32 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev uint32 + Pad2 [3]uint32 + Size int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + Blksize uint32 + Pad4 uint32 + Blocks int64 +} + +type StatxTimestamp struct { + Sec int64 + Nsec uint32 + _ int32 +} + +type Statx_t struct { + Mask uint32 + Blksize uint32 + Attributes uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Mode uint16 + _ [1]uint16 + Ino uint64 + Size uint64 + Blocks uint64 + Attributes_mask uint64 + Atime StatxTimestamp + Btime StatxTimestamp + Ctime StatxTimestamp + Mtime StatxTimestamp + Rdev_major uint32 + Rdev_minor uint32 + Dev_major uint32 + Dev_minor uint32 + _ [14]uint64 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]int8 + _ [5]byte +} + +type Fsid struct { + Val [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + _ [4]byte + Start int64 + Len int64 + Pid int32 + _ [4]byte +} + +type FscryptPolicy struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptKey struct { + Mode uint32 + Raw [64]uint8 + Size uint32 +} + +type KeyctlDHParams struct { + Private int32 + Prime int32 + Base int32 +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddrL2 struct { + Family uint16 + Psm uint16 + Bdaddr [6]uint8 + Cid uint16 + Bdaddr_type uint8 + _ [1]byte +} + +type RawSockaddrRFCOMM struct { + Family uint16 + Bdaddr [6]uint8 + Channel uint8 + _ [1]byte +} + +type RawSockaddrCAN struct { + Family uint16 + _ [2]byte + Ifindex int32 + Addr [8]byte +} + +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + +type RawSockaddrXDP struct { + Family uint16 + Flags uint16 + Ifindex uint32 + Queue_id uint32 + Shared_umem_fd uint32 +} + +type RawSockaddr struct { + Family uint16 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type PacketMreq struct { + Ifindex int32 + Type uint16 + Alen uint16 + Address [8]uint8 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + _ [4]byte + Iov *Iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + _ [4]byte +} + +type Cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + _ [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofSockaddrL2 = 0xe + SizeofSockaddrRFCOMM = 0xa + SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 + SizeofSockaddrXDP = 0x10 + SizeofLinger = 0x8 + SizeofIovec = 0x10 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofPacketMreq = 0x10 + SizeofMsghdr = 0x38 + SizeofCmsghdr = 0x10 + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_INFO_KIND = 0x1 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_NUM_VF = 0x15 + IFLA_VFINFO_LIST = 0x16 + IFLA_STATS64 = 0x17 + IFLA_VF_PORTS = 0x18 + IFLA_PORT_SELF = 0x19 + IFLA_AF_SPEC = 0x1a + IFLA_GROUP = 0x1b + IFLA_NET_NS_FD = 0x1c + IFLA_EXT_MASK = 0x1d + IFLA_PROMISCUITY = 0x1e + IFLA_NUM_TX_QUEUES = 0x1f + IFLA_NUM_RX_QUEUES = 0x20 + IFLA_CARRIER = 0x21 + IFLA_PHYS_PORT_ID = 0x22 + IFLA_CARRIER_CHANGES = 0x23 + IFLA_PHYS_SWITCH_ID = 0x24 + IFLA_LINK_NETNSID = 0x25 + IFLA_PHYS_PORT_NAME = 0x26 + IFLA_PROTO_DOWN = 0x27 + IFLA_GSO_MAX_SEGS = 0x28 + IFLA_GSO_MAX_SIZE = 0x29 + IFLA_PAD = 0x2a + IFLA_XDP = 0x2b + IFLA_EVENT = 0x2c + IFLA_NEW_NETNSID = 0x2d + IFLA_IF_NETNSID = 0x2e + IFLA_MAX = 0x33 + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTA_MARK = 0x10 + RTA_MFC_STATS = 0x11 + RTA_VIA = 0x12 + RTA_NEWDST = 0x13 + RTA_PREF = 0x14 + RTA_ENCAP_TYPE = 0x15 + RTA_ENCAP = 0x16 + RTA_EXPIRES = 0x17 + RTA_PAD = 0x18 + RTA_UID = 0x19 + RTA_TTL_PROPAGATE = 0x1a + RTA_IP_PROTO = 0x1b + RTA_SPORT = 0x1c + RTA_DPORT = 0x1d + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + _ uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x10 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + _ [6]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + Regs [32]uint64 + Lo uint64 + Hi uint64 + Epc uint64 + Badvaddr uint64 + Status uint64 + Cause uint64 +} + +type FdSet struct { + Bits [16]int64 +} + +type Sysinfo_t struct { + Uptime int64 + Loads [3]uint64 + Totalram uint64 + Freeram uint64 + Sharedram uint64 + Bufferram uint64 + Totalswap uint64 + Freeswap uint64 + Procs uint16 + Pad uint16 + _ [4]byte + Totalhigh uint64 + Freehigh uint64 + Unit uint32 + _ [0]int8 + _ [4]byte +} + +type Utsname struct { + Sysname [65]byte + Nodename [65]byte + Release [65]byte + Version [65]byte + Machine [65]byte + Domainname [65]byte +} + +type Ustat_t struct { + Tfree int32 + _ [4]byte + Tinode uint64 + Fname [6]int8 + Fpack [6]int8 + _ [4]byte +} + +type EpollEvent struct { + Events uint32 + Fd int32 + Pad int32 +} + +const ( + AT_EMPTY_PATH = 0x1000 + AT_FDCWD = -0x64 + AT_NO_AUTOMOUNT = 0x800 + AT_REMOVEDIR = 0x200 + + AT_STATX_SYNC_AS_STAT = 0x0 + AT_STATX_FORCE_SYNC = 0x2000 + AT_STATX_DONT_SYNC = 0x4000 + + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 + + AT_EACCESS = 0x200 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x2000 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Sigset_t struct { + Val [16]uint64 +} + +const RNDGETENTCNT = 0x40045200 + +const PERF_IOC_FLAG_GROUP = 0x1 + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Line uint8 + Cc [23]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Taskstats struct { + Version uint16 + _ [2]byte + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + _ [6]byte + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]int8 + Ac_sched uint8 + Ac_pad [3]uint8 + _ [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + _ [4]byte + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 +} + +const ( + TASKSTATS_CMD_UNSPEC = 0x0 + TASKSTATS_CMD_GET = 0x1 + TASKSTATS_CMD_NEW = 0x2 + TASKSTATS_TYPE_UNSPEC = 0x0 + TASKSTATS_TYPE_PID = 0x1 + TASKSTATS_TYPE_TGID = 0x2 + TASKSTATS_TYPE_STATS = 0x3 + TASKSTATS_TYPE_AGGR_PID = 0x4 + TASKSTATS_TYPE_AGGR_TGID = 0x5 + TASKSTATS_TYPE_NULL = 0x6 + TASKSTATS_CMD_ATTR_UNSPEC = 0x0 + TASKSTATS_CMD_ATTR_PID = 0x1 + TASKSTATS_CMD_ATTR_TGID = 0x2 + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 +) + +type CGroupStats struct { + Sleeping uint64 + Running uint64 + Stopped uint64 + Uninterruptible uint64 + Io_wait uint64 +} + +const ( + CGROUPSTATS_CMD_UNSPEC = 0x3 + CGROUPSTATS_CMD_GET = 0x4 + CGROUPSTATS_CMD_NEW = 0x5 + CGROUPSTATS_TYPE_UNSPEC = 0x0 + CGROUPSTATS_TYPE_CGROUP_STATS = 0x1 + CGROUPSTATS_CMD_ATTR_UNSPEC = 0x0 + CGROUPSTATS_CMD_ATTR_FD = 0x1 +) + +type Genlmsghdr struct { + Cmd uint8 + Version uint8 + Reserved uint16 +} + +const ( + CTRL_CMD_UNSPEC = 0x0 + CTRL_CMD_NEWFAMILY = 0x1 + CTRL_CMD_DELFAMILY = 0x2 + CTRL_CMD_GETFAMILY = 0x3 + CTRL_CMD_NEWOPS = 0x4 + CTRL_CMD_DELOPS = 0x5 + CTRL_CMD_GETOPS = 0x6 + CTRL_CMD_NEWMCAST_GRP = 0x7 + CTRL_CMD_DELMCAST_GRP = 0x8 + CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_ATTR_UNSPEC = 0x0 + CTRL_ATTR_FAMILY_ID = 0x1 + CTRL_ATTR_FAMILY_NAME = 0x2 + CTRL_ATTR_VERSION = 0x3 + CTRL_ATTR_HDRSIZE = 0x4 + CTRL_ATTR_MAXATTR = 0x5 + CTRL_ATTR_OPS = 0x6 + CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_OP_UNSPEC = 0x0 + CTRL_ATTR_OP_ID = 0x1 + CTRL_ATTR_OP_FLAGS = 0x2 + CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 + CTRL_ATTR_MCAST_GRP_NAME = 0x1 + CTRL_ATTR_MCAST_GRP_ID = 0x2 +) + +type cpuMask uint64 + +const ( + _CPU_SETSIZE = 0x400 + _NCPUBITS = 0x40 +) + +const ( + BDADDR_BREDR = 0x0 + BDADDR_LE_PUBLIC = 0x1 + BDADDR_LE_RANDOM = 0x2 +) + +type PerfEventAttr struct { + Type uint32 + Size uint32 + Config uint64 + Sample uint64 + Sample_type uint64 + Read_format uint64 + Bits uint64 + Wakeup uint32 + Bp_type uint32 + Ext1 uint64 + Ext2 uint64 + Branch_sample_type uint64 + Sample_regs_user uint64 + Sample_stack_user uint32 + Clockid int32 + Sample_regs_intr uint64 + Aux_watermark uint32 + _ uint32 +} + +type PerfEventMmapPage struct { + Version uint32 + Compat_version uint32 + Lock uint32 + Index uint32 + Offset int64 + Time_enabled uint64 + Time_running uint64 + Capabilities uint64 + Pmc_width uint16 + Time_shift uint16 + Time_mult uint32 + Time_offset uint64 + Time_zero uint64 + Size uint32 + _ [948]uint8 + Data_head uint64 + Data_tail uint64 + Data_offset uint64 + Data_size uint64 + Aux_head uint64 + Aux_tail uint64 + Aux_offset uint64 + Aux_size uint64 +} + +const ( + PerfBitDisabled uint64 = CBitFieldMaskBit0 + PerfBitInherit = CBitFieldMaskBit1 + PerfBitPinned = CBitFieldMaskBit2 + PerfBitExclusive = CBitFieldMaskBit3 + PerfBitExcludeUser = CBitFieldMaskBit4 + PerfBitExcludeKernel = CBitFieldMaskBit5 + PerfBitExcludeHv = CBitFieldMaskBit6 + PerfBitExcludeIdle = CBitFieldMaskBit7 + PerfBitMmap = CBitFieldMaskBit8 + PerfBitComm = CBitFieldMaskBit9 + PerfBitFreq = CBitFieldMaskBit10 + PerfBitInheritStat = CBitFieldMaskBit11 + PerfBitEnableOnExec = CBitFieldMaskBit12 + PerfBitTask = CBitFieldMaskBit13 + PerfBitWatermark = CBitFieldMaskBit14 + PerfBitPreciseIPBit1 = CBitFieldMaskBit15 + PerfBitPreciseIPBit2 = CBitFieldMaskBit16 + PerfBitMmapData = CBitFieldMaskBit17 + PerfBitSampleIDAll = CBitFieldMaskBit18 + PerfBitExcludeHost = CBitFieldMaskBit19 + PerfBitExcludeGuest = CBitFieldMaskBit20 + PerfBitExcludeCallchainKernel = CBitFieldMaskBit21 + PerfBitExcludeCallchainUser = CBitFieldMaskBit22 + PerfBitMmap2 = CBitFieldMaskBit23 + PerfBitCommExec = CBitFieldMaskBit24 + PerfBitUseClockID = CBitFieldMaskBit25 + PerfBitContextSwitch = CBitFieldMaskBit26 +) + +const ( + PERF_TYPE_HARDWARE = 0x0 + PERF_TYPE_SOFTWARE = 0x1 + PERF_TYPE_TRACEPOINT = 0x2 + PERF_TYPE_HW_CACHE = 0x3 + PERF_TYPE_RAW = 0x4 + PERF_TYPE_BREAKPOINT = 0x5 + + PERF_COUNT_HW_CPU_CYCLES = 0x0 + PERF_COUNT_HW_INSTRUCTIONS = 0x1 + PERF_COUNT_HW_CACHE_REFERENCES = 0x2 + PERF_COUNT_HW_CACHE_MISSES = 0x3 + PERF_COUNT_HW_BRANCH_INSTRUCTIONS = 0x4 + PERF_COUNT_HW_BRANCH_MISSES = 0x5 + PERF_COUNT_HW_BUS_CYCLES = 0x6 + PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 0x7 + PERF_COUNT_HW_STALLED_CYCLES_BACKEND = 0x8 + PERF_COUNT_HW_REF_CPU_CYCLES = 0x9 + + PERF_COUNT_HW_CACHE_L1D = 0x0 + PERF_COUNT_HW_CACHE_L1I = 0x1 + PERF_COUNT_HW_CACHE_LL = 0x2 + PERF_COUNT_HW_CACHE_DTLB = 0x3 + PERF_COUNT_HW_CACHE_ITLB = 0x4 + PERF_COUNT_HW_CACHE_BPU = 0x5 + PERF_COUNT_HW_CACHE_NODE = 0x6 + + PERF_COUNT_HW_CACHE_OP_READ = 0x0 + PERF_COUNT_HW_CACHE_OP_WRITE = 0x1 + PERF_COUNT_HW_CACHE_OP_PREFETCH = 0x2 + + PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0x0 + PERF_COUNT_HW_CACHE_RESULT_MISS = 0x1 + + PERF_COUNT_SW_CPU_CLOCK = 0x0 + PERF_COUNT_SW_TASK_CLOCK = 0x1 + PERF_COUNT_SW_PAGE_FAULTS = 0x2 + PERF_COUNT_SW_CONTEXT_SWITCHES = 0x3 + PERF_COUNT_SW_CPU_MIGRATIONS = 0x4 + PERF_COUNT_SW_PAGE_FAULTS_MIN = 0x5 + PERF_COUNT_SW_PAGE_FAULTS_MAJ = 0x6 + PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7 + PERF_COUNT_SW_EMULATION_FAULTS = 0x8 + PERF_COUNT_SW_DUMMY = 0x9 + + PERF_SAMPLE_IP = 0x1 + PERF_SAMPLE_TID = 0x2 + PERF_SAMPLE_TIME = 0x4 + PERF_SAMPLE_ADDR = 0x8 + PERF_SAMPLE_READ = 0x10 + PERF_SAMPLE_CALLCHAIN = 0x20 + PERF_SAMPLE_ID = 0x40 + PERF_SAMPLE_CPU = 0x80 + PERF_SAMPLE_PERIOD = 0x100 + PERF_SAMPLE_STREAM_ID = 0x200 + PERF_SAMPLE_RAW = 0x400 + PERF_SAMPLE_BRANCH_STACK = 0x800 + + PERF_SAMPLE_BRANCH_USER = 0x1 + PERF_SAMPLE_BRANCH_KERNEL = 0x2 + PERF_SAMPLE_BRANCH_HV = 0x4 + PERF_SAMPLE_BRANCH_ANY = 0x8 + PERF_SAMPLE_BRANCH_ANY_CALL = 0x10 + PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20 + PERF_SAMPLE_BRANCH_IND_CALL = 0x40 + + PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1 + PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2 + PERF_FORMAT_ID = 0x4 + PERF_FORMAT_GROUP = 0x8 + + PERF_RECORD_MMAP = 0x1 + PERF_RECORD_LOST = 0x2 + PERF_RECORD_COMM = 0x3 + PERF_RECORD_EXIT = 0x4 + PERF_RECORD_THROTTLE = 0x5 + PERF_RECORD_UNTHROTTLE = 0x6 + PERF_RECORD_FORK = 0x7 + PERF_RECORD_READ = 0x8 + PERF_RECORD_SAMPLE = 0x9 + + PERF_CONTEXT_HV = -0x20 + PERF_CONTEXT_KERNEL = -0x80 + PERF_CONTEXT_USER = -0x200 + + PERF_CONTEXT_GUEST = -0x800 + PERF_CONTEXT_GUEST_KERNEL = -0x880 + PERF_CONTEXT_GUEST_USER = -0xa00 + + PERF_FLAG_FD_NO_GROUP = 0x1 + PERF_FLAG_FD_OUTPUT = 0x2 + PERF_FLAG_PID_CGROUP = 0x4 +) + +const ( + CBitFieldMaskBit0 = 0x1 + CBitFieldMaskBit1 = 0x2 + CBitFieldMaskBit2 = 0x4 + CBitFieldMaskBit3 = 0x8 + CBitFieldMaskBit4 = 0x10 + CBitFieldMaskBit5 = 0x20 + CBitFieldMaskBit6 = 0x40 + CBitFieldMaskBit7 = 0x80 + CBitFieldMaskBit8 = 0x100 + CBitFieldMaskBit9 = 0x200 + CBitFieldMaskBit10 = 0x400 + CBitFieldMaskBit11 = 0x800 + CBitFieldMaskBit12 = 0x1000 + CBitFieldMaskBit13 = 0x2000 + CBitFieldMaskBit14 = 0x4000 + CBitFieldMaskBit15 = 0x8000 + CBitFieldMaskBit16 = 0x10000 + CBitFieldMaskBit17 = 0x20000 + CBitFieldMaskBit18 = 0x40000 + CBitFieldMaskBit19 = 0x80000 + CBitFieldMaskBit20 = 0x100000 + CBitFieldMaskBit21 = 0x200000 + CBitFieldMaskBit22 = 0x400000 + CBitFieldMaskBit23 = 0x800000 + CBitFieldMaskBit24 = 0x1000000 + CBitFieldMaskBit25 = 0x2000000 + CBitFieldMaskBit26 = 0x4000000 + CBitFieldMaskBit27 = 0x8000000 + CBitFieldMaskBit28 = 0x10000000 + CBitFieldMaskBit29 = 0x20000000 + CBitFieldMaskBit30 = 0x40000000 + CBitFieldMaskBit31 = 0x80000000 + CBitFieldMaskBit32 = 0x100000000 + CBitFieldMaskBit33 = 0x200000000 + CBitFieldMaskBit34 = 0x400000000 + CBitFieldMaskBit35 = 0x800000000 + CBitFieldMaskBit36 = 0x1000000000 + CBitFieldMaskBit37 = 0x2000000000 + CBitFieldMaskBit38 = 0x4000000000 + CBitFieldMaskBit39 = 0x8000000000 + CBitFieldMaskBit40 = 0x10000000000 + CBitFieldMaskBit41 = 0x20000000000 + CBitFieldMaskBit42 = 0x40000000000 + CBitFieldMaskBit43 = 0x80000000000 + CBitFieldMaskBit44 = 0x100000000000 + CBitFieldMaskBit45 = 0x200000000000 + CBitFieldMaskBit46 = 0x400000000000 + CBitFieldMaskBit47 = 0x800000000000 + CBitFieldMaskBit48 = 0x1000000000000 + CBitFieldMaskBit49 = 0x2000000000000 + CBitFieldMaskBit50 = 0x4000000000000 + CBitFieldMaskBit51 = 0x8000000000000 + CBitFieldMaskBit52 = 0x10000000000000 + CBitFieldMaskBit53 = 0x20000000000000 + CBitFieldMaskBit54 = 0x40000000000000 + CBitFieldMaskBit55 = 0x80000000000000 + CBitFieldMaskBit56 = 0x100000000000000 + CBitFieldMaskBit57 = 0x200000000000000 + CBitFieldMaskBit58 = 0x400000000000000 + CBitFieldMaskBit59 = 0x800000000000000 + CBitFieldMaskBit60 = 0x1000000000000000 + CBitFieldMaskBit61 = 0x2000000000000000 + CBitFieldMaskBit62 = 0x4000000000000000 + CBitFieldMaskBit63 = 0x8000000000000000 +) + +type SockaddrStorage struct { + Family uint16 + _ [118]int8 + _ uint64 +} + +type TCPMD5Sig struct { + Addr SockaddrStorage + Flags uint8 + Prefixlen uint8 + Keylen uint16 + _ uint32 + Key [80]uint8 +} + +type HDDriveCmdHdr struct { + Command uint8 + Number uint8 + Feature uint8 + Count uint8 +} + +type HDGeometry struct { + Heads uint8 + Sectors uint8 + Cylinders uint16 + _ [4]byte + Start uint64 +} + +type HDDriveID struct { + Config uint16 + Cyls uint16 + Reserved2 uint16 + Heads uint16 + Track_bytes uint16 + Sector_bytes uint16 + Sectors uint16 + Vendor0 uint16 + Vendor1 uint16 + Vendor2 uint16 + Serial_no [20]uint8 + Buf_type uint16 + Buf_size uint16 + Ecc_bytes uint16 + Fw_rev [8]uint8 + Model [40]uint8 + Max_multsect uint8 + Vendor3 uint8 + Dword_io uint16 + Vendor4 uint8 + Capability uint8 + Reserved50 uint16 + Vendor5 uint8 + TPIO uint8 + Vendor6 uint8 + TDMA uint8 + Field_valid uint16 + Cur_cyls uint16 + Cur_heads uint16 + Cur_sectors uint16 + Cur_capacity0 uint16 + Cur_capacity1 uint16 + Multsect uint8 + Multsect_valid uint8 + Lba_capacity uint32 + Dma_1word uint16 + Dma_mword uint16 + Eide_pio_modes uint16 + Eide_dma_min uint16 + Eide_dma_time uint16 + Eide_pio uint16 + Eide_pio_iordy uint16 + Words69_70 [2]uint16 + Words71_74 [4]uint16 + Queue_depth uint16 + Words76_79 [4]uint16 + Major_rev_num uint16 + Minor_rev_num uint16 + Command_set_1 uint16 + Command_set_2 uint16 + Cfsse uint16 + Cfs_enable_1 uint16 + Cfs_enable_2 uint16 + Csf_default uint16 + Dma_ultra uint16 + Trseuc uint16 + TrsEuc uint16 + CurAPMvalues uint16 + Mprc uint16 + Hw_config uint16 + Acoustic uint16 + Msrqs uint16 + Sxfert uint16 + Sal uint16 + Spg uint32 + Lba_capacity_2 uint64 + Words104_125 [22]uint16 + Last_lun uint16 + Word127 uint16 + Dlf uint16 + Csfo uint16 + Words130_155 [26]uint16 + Word156 uint16 + Words157_159 [3]uint16 + Cfa_power uint16 + Words161_175 [15]uint16 + Words176_205 [30]uint16 + Words206_254 [49]uint16 + Integrity_word uint16 +} + +type Statfs_t struct { + Type int64 + Bsize int64 + Frsize int64 + Blocks uint64 + Bfree uint64 + Files uint64 + Ffree uint64 + Bavail uint64 + Fsid Fsid + Namelen int64 + Flags int64 + Spare [5]int64 +} + +const ( + ST_MANDLOCK = 0x40 + ST_NOATIME = 0x400 + ST_NODEV = 0x4 + ST_NODIRATIME = 0x800 + ST_NOEXEC = 0x8 + ST_NOSUID = 0x2 + ST_RDONLY = 0x1 + ST_RELATIME = 0x1000 + ST_SYNCHRONOUS = 0x10 +) + +type TpacketHdr struct { + Status uint64 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Sec uint32 + Usec uint32 + _ [4]byte +} + +type Tpacket2Hdr struct { + Status uint32 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Sec uint32 + Nsec uint32 + Vlan_tci uint16 + Vlan_tpid uint16 + _ [4]uint8 +} + +type Tpacket3Hdr struct { + Next_offset uint32 + Sec uint32 + Nsec uint32 + Snaplen uint32 + Len uint32 + Status uint32 + Mac uint16 + Net uint16 + Hv1 TpacketHdrVariant1 + _ [8]uint8 +} + +type TpacketHdrVariant1 struct { + Rxhash uint32 + Vlan_tci uint32 + Vlan_tpid uint16 + _ uint16 +} + +type TpacketBlockDesc struct { + Version uint32 + To_priv uint32 + Hdr [40]byte +} + +type TpacketReq struct { + Block_size uint32 + Block_nr uint32 + Frame_size uint32 + Frame_nr uint32 +} + +type TpacketReq3 struct { + Block_size uint32 + Block_nr uint32 + Frame_size uint32 + Frame_nr uint32 + Retire_blk_tov uint32 + Sizeof_priv uint32 + Feature_req_word uint32 +} + +type TpacketStats struct { + Packets uint32 + Drops uint32 +} + +type TpacketStatsV3 struct { + Packets uint32 + Drops uint32 + Freeze_q_cnt uint32 +} + +type TpacketAuxdata struct { + Status uint32 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Vlan_tci uint16 + Vlan_tpid uint16 +} + +const ( + TPACKET_V1 = 0x0 + TPACKET_V2 = 0x1 + TPACKET_V3 = 0x2 +) + +const ( + SizeofTpacketHdr = 0x20 + SizeofTpacket2Hdr = 0x20 + SizeofTpacket3Hdr = 0x30 +) + +const ( + NF_INET_PRE_ROUTING = 0x0 + NF_INET_LOCAL_IN = 0x1 + NF_INET_FORWARD = 0x2 + NF_INET_LOCAL_OUT = 0x3 + NF_INET_POST_ROUTING = 0x4 + NF_INET_NUMHOOKS = 0x5 +) + +const ( + NF_NETDEV_INGRESS = 0x0 + NF_NETDEV_NUMHOOKS = 0x1 +) + +const ( + NFPROTO_UNSPEC = 0x0 + NFPROTO_INET = 0x1 + NFPROTO_IPV4 = 0x2 + NFPROTO_ARP = 0x3 + NFPROTO_NETDEV = 0x5 + NFPROTO_BRIDGE = 0x7 + NFPROTO_IPV6 = 0xa + NFPROTO_DECNET = 0xc + NFPROTO_NUMPROTO = 0xd +) + +type Nfgenmsg struct { + Nfgen_family uint8 + Version uint8 + Res_id uint16 +} + +const ( + NFNL_BATCH_UNSPEC = 0x0 + NFNL_BATCH_GENID = 0x1 +) + +const ( + NFT_REG_VERDICT = 0x0 + NFT_REG_1 = 0x1 + NFT_REG_2 = 0x2 + NFT_REG_3 = 0x3 + NFT_REG_4 = 0x4 + NFT_REG32_00 = 0x8 + NFT_REG32_01 = 0x9 + NFT_REG32_02 = 0xa + NFT_REG32_03 = 0xb + NFT_REG32_04 = 0xc + NFT_REG32_05 = 0xd + NFT_REG32_06 = 0xe + NFT_REG32_07 = 0xf + NFT_REG32_08 = 0x10 + NFT_REG32_09 = 0x11 + NFT_REG32_10 = 0x12 + NFT_REG32_11 = 0x13 + NFT_REG32_12 = 0x14 + NFT_REG32_13 = 0x15 + NFT_REG32_14 = 0x16 + NFT_REG32_15 = 0x17 + NFT_CONTINUE = -0x1 + NFT_BREAK = -0x2 + NFT_JUMP = -0x3 + NFT_GOTO = -0x4 + NFT_RETURN = -0x5 + NFT_MSG_NEWTABLE = 0x0 + NFT_MSG_GETTABLE = 0x1 + NFT_MSG_DELTABLE = 0x2 + NFT_MSG_NEWCHAIN = 0x3 + NFT_MSG_GETCHAIN = 0x4 + NFT_MSG_DELCHAIN = 0x5 + NFT_MSG_NEWRULE = 0x6 + NFT_MSG_GETRULE = 0x7 + NFT_MSG_DELRULE = 0x8 + NFT_MSG_NEWSET = 0x9 + NFT_MSG_GETSET = 0xa + NFT_MSG_DELSET = 0xb + NFT_MSG_NEWSETELEM = 0xc + NFT_MSG_GETSETELEM = 0xd + NFT_MSG_DELSETELEM = 0xe + NFT_MSG_NEWGEN = 0xf + NFT_MSG_GETGEN = 0x10 + NFT_MSG_TRACE = 0x11 + NFT_MSG_NEWOBJ = 0x12 + NFT_MSG_GETOBJ = 0x13 + NFT_MSG_DELOBJ = 0x14 + NFT_MSG_GETOBJ_RESET = 0x15 + NFT_MSG_MAX = 0x19 + NFTA_LIST_UNPEC = 0x0 + NFTA_LIST_ELEM = 0x1 + NFTA_HOOK_UNSPEC = 0x0 + NFTA_HOOK_HOOKNUM = 0x1 + NFTA_HOOK_PRIORITY = 0x2 + NFTA_HOOK_DEV = 0x3 + NFT_TABLE_F_DORMANT = 0x1 + NFTA_TABLE_UNSPEC = 0x0 + NFTA_TABLE_NAME = 0x1 + NFTA_TABLE_FLAGS = 0x2 + NFTA_TABLE_USE = 0x3 + NFTA_CHAIN_UNSPEC = 0x0 + NFTA_CHAIN_TABLE = 0x1 + NFTA_CHAIN_HANDLE = 0x2 + NFTA_CHAIN_NAME = 0x3 + NFTA_CHAIN_HOOK = 0x4 + NFTA_CHAIN_POLICY = 0x5 + NFTA_CHAIN_USE = 0x6 + NFTA_CHAIN_TYPE = 0x7 + NFTA_CHAIN_COUNTERS = 0x8 + NFTA_CHAIN_PAD = 0x9 + NFTA_RULE_UNSPEC = 0x0 + NFTA_RULE_TABLE = 0x1 + NFTA_RULE_CHAIN = 0x2 + NFTA_RULE_HANDLE = 0x3 + NFTA_RULE_EXPRESSIONS = 0x4 + NFTA_RULE_COMPAT = 0x5 + NFTA_RULE_POSITION = 0x6 + NFTA_RULE_USERDATA = 0x7 + NFTA_RULE_PAD = 0x8 + NFTA_RULE_ID = 0x9 + NFT_RULE_COMPAT_F_INV = 0x2 + NFT_RULE_COMPAT_F_MASK = 0x2 + NFTA_RULE_COMPAT_UNSPEC = 0x0 + NFTA_RULE_COMPAT_PROTO = 0x1 + NFTA_RULE_COMPAT_FLAGS = 0x2 + NFT_SET_ANONYMOUS = 0x1 + NFT_SET_CONSTANT = 0x2 + NFT_SET_INTERVAL = 0x4 + NFT_SET_MAP = 0x8 + NFT_SET_TIMEOUT = 0x10 + NFT_SET_EVAL = 0x20 + NFT_SET_OBJECT = 0x40 + NFT_SET_POL_PERFORMANCE = 0x0 + NFT_SET_POL_MEMORY = 0x1 + NFTA_SET_DESC_UNSPEC = 0x0 + NFTA_SET_DESC_SIZE = 0x1 + NFTA_SET_UNSPEC = 0x0 + NFTA_SET_TABLE = 0x1 + NFTA_SET_NAME = 0x2 + NFTA_SET_FLAGS = 0x3 + NFTA_SET_KEY_TYPE = 0x4 + NFTA_SET_KEY_LEN = 0x5 + NFTA_SET_DATA_TYPE = 0x6 + NFTA_SET_DATA_LEN = 0x7 + NFTA_SET_POLICY = 0x8 + NFTA_SET_DESC = 0x9 + NFTA_SET_ID = 0xa + NFTA_SET_TIMEOUT = 0xb + NFTA_SET_GC_INTERVAL = 0xc + NFTA_SET_USERDATA = 0xd + NFTA_SET_PAD = 0xe + NFTA_SET_OBJ_TYPE = 0xf + NFT_SET_ELEM_INTERVAL_END = 0x1 + NFTA_SET_ELEM_UNSPEC = 0x0 + NFTA_SET_ELEM_KEY = 0x1 + NFTA_SET_ELEM_DATA = 0x2 + NFTA_SET_ELEM_FLAGS = 0x3 + NFTA_SET_ELEM_TIMEOUT = 0x4 + NFTA_SET_ELEM_EXPIRATION = 0x5 + NFTA_SET_ELEM_USERDATA = 0x6 + NFTA_SET_ELEM_EXPR = 0x7 + NFTA_SET_ELEM_PAD = 0x8 + NFTA_SET_ELEM_OBJREF = 0x9 + NFTA_SET_ELEM_LIST_UNSPEC = 0x0 + NFTA_SET_ELEM_LIST_TABLE = 0x1 + NFTA_SET_ELEM_LIST_SET = 0x2 + NFTA_SET_ELEM_LIST_ELEMENTS = 0x3 + NFTA_SET_ELEM_LIST_SET_ID = 0x4 + NFT_DATA_VALUE = 0x0 + NFT_DATA_VERDICT = 0xffffff00 + NFTA_DATA_UNSPEC = 0x0 + NFTA_DATA_VALUE = 0x1 + NFTA_DATA_VERDICT = 0x2 + NFTA_VERDICT_UNSPEC = 0x0 + NFTA_VERDICT_CODE = 0x1 + NFTA_VERDICT_CHAIN = 0x2 + NFTA_EXPR_UNSPEC = 0x0 + NFTA_EXPR_NAME = 0x1 + NFTA_EXPR_DATA = 0x2 + NFTA_IMMEDIATE_UNSPEC = 0x0 + NFTA_IMMEDIATE_DREG = 0x1 + NFTA_IMMEDIATE_DATA = 0x2 + NFTA_BITWISE_UNSPEC = 0x0 + NFTA_BITWISE_SREG = 0x1 + NFTA_BITWISE_DREG = 0x2 + NFTA_BITWISE_LEN = 0x3 + NFTA_BITWISE_MASK = 0x4 + NFTA_BITWISE_XOR = 0x5 + NFT_BYTEORDER_NTOH = 0x0 + NFT_BYTEORDER_HTON = 0x1 + NFTA_BYTEORDER_UNSPEC = 0x0 + NFTA_BYTEORDER_SREG = 0x1 + NFTA_BYTEORDER_DREG = 0x2 + NFTA_BYTEORDER_OP = 0x3 + NFTA_BYTEORDER_LEN = 0x4 + NFTA_BYTEORDER_SIZE = 0x5 + NFT_CMP_EQ = 0x0 + NFT_CMP_NEQ = 0x1 + NFT_CMP_LT = 0x2 + NFT_CMP_LTE = 0x3 + NFT_CMP_GT = 0x4 + NFT_CMP_GTE = 0x5 + NFTA_CMP_UNSPEC = 0x0 + NFTA_CMP_SREG = 0x1 + NFTA_CMP_OP = 0x2 + NFTA_CMP_DATA = 0x3 + NFT_RANGE_EQ = 0x0 + NFT_RANGE_NEQ = 0x1 + NFTA_RANGE_UNSPEC = 0x0 + NFTA_RANGE_SREG = 0x1 + NFTA_RANGE_OP = 0x2 + NFTA_RANGE_FROM_DATA = 0x3 + NFTA_RANGE_TO_DATA = 0x4 + NFT_LOOKUP_F_INV = 0x1 + NFTA_LOOKUP_UNSPEC = 0x0 + NFTA_LOOKUP_SET = 0x1 + NFTA_LOOKUP_SREG = 0x2 + NFTA_LOOKUP_DREG = 0x3 + NFTA_LOOKUP_SET_ID = 0x4 + NFTA_LOOKUP_FLAGS = 0x5 + NFT_DYNSET_OP_ADD = 0x0 + NFT_DYNSET_OP_UPDATE = 0x1 + NFT_DYNSET_F_INV = 0x1 + NFTA_DYNSET_UNSPEC = 0x0 + NFTA_DYNSET_SET_NAME = 0x1 + NFTA_DYNSET_SET_ID = 0x2 + NFTA_DYNSET_OP = 0x3 + NFTA_DYNSET_SREG_KEY = 0x4 + NFTA_DYNSET_SREG_DATA = 0x5 + NFTA_DYNSET_TIMEOUT = 0x6 + NFTA_DYNSET_EXPR = 0x7 + NFTA_DYNSET_PAD = 0x8 + NFTA_DYNSET_FLAGS = 0x9 + NFT_PAYLOAD_LL_HEADER = 0x0 + NFT_PAYLOAD_NETWORK_HEADER = 0x1 + NFT_PAYLOAD_TRANSPORT_HEADER = 0x2 + NFT_PAYLOAD_CSUM_NONE = 0x0 + NFT_PAYLOAD_CSUM_INET = 0x1 + NFT_PAYLOAD_L4CSUM_PSEUDOHDR = 0x1 + NFTA_PAYLOAD_UNSPEC = 0x0 + NFTA_PAYLOAD_DREG = 0x1 + NFTA_PAYLOAD_BASE = 0x2 + NFTA_PAYLOAD_OFFSET = 0x3 + NFTA_PAYLOAD_LEN = 0x4 + NFTA_PAYLOAD_SREG = 0x5 + NFTA_PAYLOAD_CSUM_TYPE = 0x6 + NFTA_PAYLOAD_CSUM_OFFSET = 0x7 + NFTA_PAYLOAD_CSUM_FLAGS = 0x8 + NFT_EXTHDR_F_PRESENT = 0x1 + NFT_EXTHDR_OP_IPV6 = 0x0 + NFT_EXTHDR_OP_TCPOPT = 0x1 + NFTA_EXTHDR_UNSPEC = 0x0 + NFTA_EXTHDR_DREG = 0x1 + NFTA_EXTHDR_TYPE = 0x2 + NFTA_EXTHDR_OFFSET = 0x3 + NFTA_EXTHDR_LEN = 0x4 + NFTA_EXTHDR_FLAGS = 0x5 + NFTA_EXTHDR_OP = 0x6 + NFTA_EXTHDR_SREG = 0x7 + NFT_META_LEN = 0x0 + NFT_META_PROTOCOL = 0x1 + NFT_META_PRIORITY = 0x2 + NFT_META_MARK = 0x3 + NFT_META_IIF = 0x4 + NFT_META_OIF = 0x5 + NFT_META_IIFNAME = 0x6 + NFT_META_OIFNAME = 0x7 + NFT_META_IIFTYPE = 0x8 + NFT_META_OIFTYPE = 0x9 + NFT_META_SKUID = 0xa + NFT_META_SKGID = 0xb + NFT_META_NFTRACE = 0xc + NFT_META_RTCLASSID = 0xd + NFT_META_SECMARK = 0xe + NFT_META_NFPROTO = 0xf + NFT_META_L4PROTO = 0x10 + NFT_META_BRI_IIFNAME = 0x11 + NFT_META_BRI_OIFNAME = 0x12 + NFT_META_PKTTYPE = 0x13 + NFT_META_CPU = 0x14 + NFT_META_IIFGROUP = 0x15 + NFT_META_OIFGROUP = 0x16 + NFT_META_CGROUP = 0x17 + NFT_META_PRANDOM = 0x18 + NFT_RT_CLASSID = 0x0 + NFT_RT_NEXTHOP4 = 0x1 + NFT_RT_NEXTHOP6 = 0x2 + NFT_RT_TCPMSS = 0x3 + NFT_HASH_JENKINS = 0x0 + NFT_HASH_SYM = 0x1 + NFTA_HASH_UNSPEC = 0x0 + NFTA_HASH_SREG = 0x1 + NFTA_HASH_DREG = 0x2 + NFTA_HASH_LEN = 0x3 + NFTA_HASH_MODULUS = 0x4 + NFTA_HASH_SEED = 0x5 + NFTA_HASH_OFFSET = 0x6 + NFTA_HASH_TYPE = 0x7 + NFTA_META_UNSPEC = 0x0 + NFTA_META_DREG = 0x1 + NFTA_META_KEY = 0x2 + NFTA_META_SREG = 0x3 + NFTA_RT_UNSPEC = 0x0 + NFTA_RT_DREG = 0x1 + NFTA_RT_KEY = 0x2 + NFT_CT_STATE = 0x0 + NFT_CT_DIRECTION = 0x1 + NFT_CT_STATUS = 0x2 + NFT_CT_MARK = 0x3 + NFT_CT_SECMARK = 0x4 + NFT_CT_EXPIRATION = 0x5 + NFT_CT_HELPER = 0x6 + NFT_CT_L3PROTOCOL = 0x7 + NFT_CT_SRC = 0x8 + NFT_CT_DST = 0x9 + NFT_CT_PROTOCOL = 0xa + NFT_CT_PROTO_SRC = 0xb + NFT_CT_PROTO_DST = 0xc + NFT_CT_LABELS = 0xd + NFT_CT_PKTS = 0xe + NFT_CT_BYTES = 0xf + NFT_CT_AVGPKT = 0x10 + NFT_CT_ZONE = 0x11 + NFT_CT_EVENTMASK = 0x12 + NFTA_CT_UNSPEC = 0x0 + NFTA_CT_DREG = 0x1 + NFTA_CT_KEY = 0x2 + NFTA_CT_DIRECTION = 0x3 + NFTA_CT_SREG = 0x4 + NFT_LIMIT_PKTS = 0x0 + NFT_LIMIT_PKT_BYTES = 0x1 + NFT_LIMIT_F_INV = 0x1 + NFTA_LIMIT_UNSPEC = 0x0 + NFTA_LIMIT_RATE = 0x1 + NFTA_LIMIT_UNIT = 0x2 + NFTA_LIMIT_BURST = 0x3 + NFTA_LIMIT_TYPE = 0x4 + NFTA_LIMIT_FLAGS = 0x5 + NFTA_LIMIT_PAD = 0x6 + NFTA_COUNTER_UNSPEC = 0x0 + NFTA_COUNTER_BYTES = 0x1 + NFTA_COUNTER_PACKETS = 0x2 + NFTA_COUNTER_PAD = 0x3 + NFTA_LOG_UNSPEC = 0x0 + NFTA_LOG_GROUP = 0x1 + NFTA_LOG_PREFIX = 0x2 + NFTA_LOG_SNAPLEN = 0x3 + NFTA_LOG_QTHRESHOLD = 0x4 + NFTA_LOG_LEVEL = 0x5 + NFTA_LOG_FLAGS = 0x6 + NFTA_QUEUE_UNSPEC = 0x0 + NFTA_QUEUE_NUM = 0x1 + NFTA_QUEUE_TOTAL = 0x2 + NFTA_QUEUE_FLAGS = 0x3 + NFTA_QUEUE_SREG_QNUM = 0x4 + NFT_QUOTA_F_INV = 0x1 + NFT_QUOTA_F_DEPLETED = 0x2 + NFTA_QUOTA_UNSPEC = 0x0 + NFTA_QUOTA_BYTES = 0x1 + NFTA_QUOTA_FLAGS = 0x2 + NFTA_QUOTA_PAD = 0x3 + NFTA_QUOTA_CONSUMED = 0x4 + NFT_REJECT_ICMP_UNREACH = 0x0 + NFT_REJECT_TCP_RST = 0x1 + NFT_REJECT_ICMPX_UNREACH = 0x2 + NFT_REJECT_ICMPX_NO_ROUTE = 0x0 + NFT_REJECT_ICMPX_PORT_UNREACH = 0x1 + NFT_REJECT_ICMPX_HOST_UNREACH = 0x2 + NFT_REJECT_ICMPX_ADMIN_PROHIBITED = 0x3 + NFTA_REJECT_UNSPEC = 0x0 + NFTA_REJECT_TYPE = 0x1 + NFTA_REJECT_ICMP_CODE = 0x2 + NFT_NAT_SNAT = 0x0 + NFT_NAT_DNAT = 0x1 + NFTA_NAT_UNSPEC = 0x0 + NFTA_NAT_TYPE = 0x1 + NFTA_NAT_FAMILY = 0x2 + NFTA_NAT_REG_ADDR_MIN = 0x3 + NFTA_NAT_REG_ADDR_MAX = 0x4 + NFTA_NAT_REG_PROTO_MIN = 0x5 + NFTA_NAT_REG_PROTO_MAX = 0x6 + NFTA_NAT_FLAGS = 0x7 + NFTA_MASQ_UNSPEC = 0x0 + NFTA_MASQ_FLAGS = 0x1 + NFTA_MASQ_REG_PROTO_MIN = 0x2 + NFTA_MASQ_REG_PROTO_MAX = 0x3 + NFTA_REDIR_UNSPEC = 0x0 + NFTA_REDIR_REG_PROTO_MIN = 0x1 + NFTA_REDIR_REG_PROTO_MAX = 0x2 + NFTA_REDIR_FLAGS = 0x3 + NFTA_DUP_UNSPEC = 0x0 + NFTA_DUP_SREG_ADDR = 0x1 + NFTA_DUP_SREG_DEV = 0x2 + NFTA_FWD_UNSPEC = 0x0 + NFTA_FWD_SREG_DEV = 0x1 + NFTA_OBJREF_UNSPEC = 0x0 + NFTA_OBJREF_IMM_TYPE = 0x1 + NFTA_OBJREF_IMM_NAME = 0x2 + NFTA_OBJREF_SET_SREG = 0x3 + NFTA_OBJREF_SET_NAME = 0x4 + NFTA_OBJREF_SET_ID = 0x5 + NFTA_GEN_UNSPEC = 0x0 + NFTA_GEN_ID = 0x1 + NFTA_GEN_PROC_PID = 0x2 + NFTA_GEN_PROC_NAME = 0x3 + NFTA_FIB_UNSPEC = 0x0 + NFTA_FIB_DREG = 0x1 + NFTA_FIB_RESULT = 0x2 + NFTA_FIB_FLAGS = 0x3 + NFT_FIB_RESULT_UNSPEC = 0x0 + NFT_FIB_RESULT_OIF = 0x1 + NFT_FIB_RESULT_OIFNAME = 0x2 + NFT_FIB_RESULT_ADDRTYPE = 0x3 + NFTA_FIB_F_SADDR = 0x1 + NFTA_FIB_F_DADDR = 0x2 + NFTA_FIB_F_MARK = 0x4 + NFTA_FIB_F_IIF = 0x8 + NFTA_FIB_F_OIF = 0x10 + NFTA_FIB_F_PRESENT = 0x20 + NFTA_CT_HELPER_UNSPEC = 0x0 + NFTA_CT_HELPER_NAME = 0x1 + NFTA_CT_HELPER_L3PROTO = 0x2 + NFTA_CT_HELPER_L4PROTO = 0x3 + NFTA_OBJ_UNSPEC = 0x0 + NFTA_OBJ_TABLE = 0x1 + NFTA_OBJ_NAME = 0x2 + NFTA_OBJ_TYPE = 0x3 + NFTA_OBJ_DATA = 0x4 + NFTA_OBJ_USE = 0x5 + NFTA_TRACE_UNSPEC = 0x0 + NFTA_TRACE_TABLE = 0x1 + NFTA_TRACE_CHAIN = 0x2 + NFTA_TRACE_RULE_HANDLE = 0x3 + NFTA_TRACE_TYPE = 0x4 + NFTA_TRACE_VERDICT = 0x5 + NFTA_TRACE_ID = 0x6 + NFTA_TRACE_LL_HEADER = 0x7 + NFTA_TRACE_NETWORK_HEADER = 0x8 + NFTA_TRACE_TRANSPORT_HEADER = 0x9 + NFTA_TRACE_IIF = 0xa + NFTA_TRACE_IIFTYPE = 0xb + NFTA_TRACE_OIF = 0xc + NFTA_TRACE_OIFTYPE = 0xd + NFTA_TRACE_MARK = 0xe + NFTA_TRACE_NFPROTO = 0xf + NFTA_TRACE_POLICY = 0x10 + NFTA_TRACE_PAD = 0x11 + NFT_TRACETYPE_UNSPEC = 0x0 + NFT_TRACETYPE_POLICY = 0x1 + NFT_TRACETYPE_RETURN = 0x2 + NFT_TRACETYPE_RULE = 0x3 + NFTA_NG_UNSPEC = 0x0 + NFTA_NG_DREG = 0x1 + NFTA_NG_MODULUS = 0x2 + NFTA_NG_TYPE = 0x3 + NFTA_NG_OFFSET = 0x4 + NFT_NG_INCREMENTAL = 0x0 + NFT_NG_RANDOM = 0x1 +) + +type RTCTime struct { + Sec int32 + Min int32 + Hour int32 + Mday int32 + Mon int32 + Year int32 + Wday int32 + Yday int32 + Isdst int32 +} + +type RTCWkAlrm struct { + Enabled uint8 + Pending uint8 + _ [2]byte + Time RTCTime +} + +type RTCPLLInfo struct { + Ctrl int32 + Value int32 + Max int32 + Min int32 + Posmult int32 + Negmult int32 + Clock int64 +} + +type BlkpgIoctlArg struct { + Op int32 + Flags int32 + Datalen int32 + _ [4]byte + Data *byte +} + +type BlkpgPartition struct { + Start int64 + Length int64 + Pno int32 + Devname [64]uint8 + Volname [64]uint8 + _ [4]byte +} + +const ( + BLKPG = 0x20001269 + BLKPG_ADD_PARTITION = 0x1 + BLKPG_DEL_PARTITION = 0x2 + BLKPG_RESIZE_PARTITION = 0x3 +) + +const ( + NETNSA_NONE = 0x0 + NETNSA_NSID = 0x1 + NETNSA_PID = 0x2 + NETNSA_FD = 0x3 +) + +type XDPRingOffset struct { + Producer uint64 + Consumer uint64 + Desc uint64 +} + +type XDPMmapOffsets struct { + Rx XDPRingOffset + Tx XDPRingOffset + Fr XDPRingOffset + Cr XDPRingOffset +} + +type XDPUmemReg struct { + Addr uint64 + Len uint64 + Size uint32 + Headroom uint32 +} + +type XDPStatistics struct { + Rx_dropped uint64 + Rx_invalid_descs uint64 + Tx_invalid_descs uint64 +} + +type XDPDesc struct { + Addr uint64 + Len uint32 + Options uint32 +} + +const ( + NCSI_CMD_UNSPEC = 0x0 + NCSI_CMD_PKG_INFO = 0x1 + NCSI_CMD_SET_INTERFACE = 0x2 + NCSI_CMD_CLEAR_INTERFACE = 0x3 + NCSI_ATTR_UNSPEC = 0x0 + NCSI_ATTR_IFINDEX = 0x1 + NCSI_ATTR_PACKAGE_LIST = 0x2 + NCSI_ATTR_PACKAGE_ID = 0x3 + NCSI_ATTR_CHANNEL_ID = 0x4 + NCSI_PKG_ATTR_UNSPEC = 0x0 + NCSI_PKG_ATTR = 0x1 + NCSI_PKG_ATTR_ID = 0x2 + NCSI_PKG_ATTR_FORCED = 0x3 + NCSI_PKG_ATTR_CHANNEL_LIST = 0x4 + NCSI_CHANNEL_ATTR_UNSPEC = 0x0 + NCSI_CHANNEL_ATTR = 0x1 + NCSI_CHANNEL_ATTR_ID = 0x2 + NCSI_CHANNEL_ATTR_VERSION_MAJOR = 0x3 + NCSI_CHANNEL_ATTR_VERSION_MINOR = 0x4 + NCSI_CHANNEL_ATTR_VERSION_STR = 0x5 + NCSI_CHANNEL_ATTR_LINK_STATE = 0x6 + NCSI_CHANNEL_ATTR_ACTIVE = 0x7 + NCSI_CHANNEL_ATTR_FORCED = 0x8 + NCSI_CHANNEL_ATTR_VLAN_LIST = 0x9 + NCSI_CHANNEL_ATTR_VLAN_ID = 0xa +) + +const ( + SOF_TIMESTAMPING_TX_HARDWARE = 0x1 + SOF_TIMESTAMPING_TX_SOFTWARE = 0x2 + SOF_TIMESTAMPING_RX_HARDWARE = 0x4 + SOF_TIMESTAMPING_RX_SOFTWARE = 0x8 + SOF_TIMESTAMPING_SOFTWARE = 0x10 + SOF_TIMESTAMPING_SYS_HARDWARE = 0x20 + SOF_TIMESTAMPING_RAW_HARDWARE = 0x40 + SOF_TIMESTAMPING_OPT_ID = 0x80 + SOF_TIMESTAMPING_TX_SCHED = 0x100 + SOF_TIMESTAMPING_TX_ACK = 0x200 + SOF_TIMESTAMPING_OPT_CMSG = 0x400 + SOF_TIMESTAMPING_OPT_TSONLY = 0x800 + SOF_TIMESTAMPING_OPT_STATS = 0x1000 + SOF_TIMESTAMPING_OPT_PKTINFO = 0x2000 + SOF_TIMESTAMPING_OPT_TX_SWHW = 0x4000 + + SOF_TIMESTAMPING_LAST = 0x4000 + SOF_TIMESTAMPING_MASK = 0x7fff +) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go new file mode 100644 index 00000000..210de76c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go @@ -0,0 +1,1983 @@ +// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build mipsle,linux + +package unix + +const ( + SizeofPtr = 0x4 + SizeofShort = 0x2 + SizeofInt = 0x4 + SizeofLong = 0x4 + SizeofLongLong = 0x8 + PathMax = 0x1000 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int32 + Nsec int32 +} + +type Timeval struct { + Sec int32 + Usec int32 +} + +type Timex struct { + Modes uint32 + Offset int32 + Freq int32 + Maxerror int32 + Esterror int32 + Status int32 + Constant int32 + Precision int32 + Tolerance int32 + Time Timeval + Tick int32 + Ppsfreq int32 + Jitter int32 + Shift int32 + Stabil int32 + Jitcnt int32 + Calcnt int32 + Errcnt int32 + Stbcnt int32 + Tai int32 + _ [44]byte +} + +type Time_t int32 + +type Tms struct { + Utime int32 + Stime int32 + Cutime int32 + Cstime int32 +} + +type Utimbuf struct { + Actime int32 + Modtime int32 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint32 + Pad1 [3]int32 + Ino uint64 + Mode uint32 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev uint32 + Pad2 [3]int32 + Size int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + Blksize int32 + Pad4 int32 + Blocks int64 + Pad5 [14]int32 +} + +type StatxTimestamp struct { + Sec int64 + Nsec uint32 + _ int32 +} + +type Statx_t struct { + Mask uint32 + Blksize uint32 + Attributes uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Mode uint16 + _ [1]uint16 + Ino uint64 + Size uint64 + Blocks uint64 + Attributes_mask uint64 + Atime StatxTimestamp + Btime StatxTimestamp + Ctime StatxTimestamp + Mtime StatxTimestamp + Rdev_major uint32 + Rdev_minor uint32 + Dev_major uint32 + Dev_minor uint32 + _ [14]uint64 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]int8 + _ [5]byte +} + +type Fsid struct { + Val [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + _ [4]byte + Start int64 + Len int64 + Pid int32 + _ [4]byte +} + +type FscryptPolicy struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptKey struct { + Mode uint32 + Raw [64]uint8 + Size uint32 +} + +type KeyctlDHParams struct { + Private int32 + Prime int32 + Base int32 +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddrL2 struct { + Family uint16 + Psm uint16 + Bdaddr [6]uint8 + Cid uint16 + Bdaddr_type uint8 + _ [1]byte +} + +type RawSockaddrRFCOMM struct { + Family uint16 + Bdaddr [6]uint8 + Channel uint8 + _ [1]byte +} + +type RawSockaddrCAN struct { + Family uint16 + _ [2]byte + Ifindex int32 + Addr [8]byte +} + +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + +type RawSockaddrXDP struct { + Family uint16 + Flags uint16 + Ifindex uint32 + Queue_id uint32 + Shared_umem_fd uint32 +} + +type RawSockaddr struct { + Family uint16 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type PacketMreq struct { + Ifindex int32 + Type uint16 + Alen uint16 + Address [8]uint8 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen uint32 + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + _ [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofSockaddrL2 = 0xe + SizeofSockaddrRFCOMM = 0xa + SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 + SizeofSockaddrXDP = 0x10 + SizeofLinger = 0x8 + SizeofIovec = 0x8 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofPacketMreq = 0x10 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_INFO_KIND = 0x1 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_NUM_VF = 0x15 + IFLA_VFINFO_LIST = 0x16 + IFLA_STATS64 = 0x17 + IFLA_VF_PORTS = 0x18 + IFLA_PORT_SELF = 0x19 + IFLA_AF_SPEC = 0x1a + IFLA_GROUP = 0x1b + IFLA_NET_NS_FD = 0x1c + IFLA_EXT_MASK = 0x1d + IFLA_PROMISCUITY = 0x1e + IFLA_NUM_TX_QUEUES = 0x1f + IFLA_NUM_RX_QUEUES = 0x20 + IFLA_CARRIER = 0x21 + IFLA_PHYS_PORT_ID = 0x22 + IFLA_CARRIER_CHANGES = 0x23 + IFLA_PHYS_SWITCH_ID = 0x24 + IFLA_LINK_NETNSID = 0x25 + IFLA_PHYS_PORT_NAME = 0x26 + IFLA_PROTO_DOWN = 0x27 + IFLA_GSO_MAX_SEGS = 0x28 + IFLA_GSO_MAX_SIZE = 0x29 + IFLA_PAD = 0x2a + IFLA_XDP = 0x2b + IFLA_EVENT = 0x2c + IFLA_NEW_NETNSID = 0x2d + IFLA_IF_NETNSID = 0x2e + IFLA_MAX = 0x33 + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTA_MARK = 0x10 + RTA_MFC_STATS = 0x11 + RTA_VIA = 0x12 + RTA_NEWDST = 0x13 + RTA_PREF = 0x14 + RTA_ENCAP_TYPE = 0x15 + RTA_ENCAP = 0x16 + RTA_EXPIRES = 0x17 + RTA_PAD = 0x18 + RTA_UID = 0x19 + RTA_TTL_PROPAGATE = 0x1a + RTA_IP_PROTO = 0x1b + RTA_SPORT = 0x1c + RTA_DPORT = 0x1d + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + _ uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x8 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + _ [2]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + Regs [32]uint64 + Lo uint64 + Hi uint64 + Epc uint64 + Badvaddr uint64 + Status uint64 + Cause uint64 +} + +type FdSet struct { + Bits [32]int32 +} + +type Sysinfo_t struct { + Uptime int32 + Loads [3]uint32 + Totalram uint32 + Freeram uint32 + Sharedram uint32 + Bufferram uint32 + Totalswap uint32 + Freeswap uint32 + Procs uint16 + Pad uint16 + Totalhigh uint32 + Freehigh uint32 + Unit uint32 + _ [8]int8 +} + +type Utsname struct { + Sysname [65]byte + Nodename [65]byte + Release [65]byte + Version [65]byte + Machine [65]byte + Domainname [65]byte +} + +type Ustat_t struct { + Tfree int32 + Tinode uint32 + Fname [6]int8 + Fpack [6]int8 +} + +type EpollEvent struct { + Events uint32 + PadFd int32 + Fd int32 + Pad int32 +} + +const ( + AT_EMPTY_PATH = 0x1000 + AT_FDCWD = -0x64 + AT_NO_AUTOMOUNT = 0x800 + AT_REMOVEDIR = 0x200 + + AT_STATX_SYNC_AS_STAT = 0x0 + AT_STATX_FORCE_SYNC = 0x2000 + AT_STATX_DONT_SYNC = 0x4000 + + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 + + AT_EACCESS = 0x200 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x2000 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Sigset_t struct { + Val [32]uint32 +} + +const RNDGETENTCNT = 0x40045200 + +const PERF_IOC_FLAG_GROUP = 0x1 + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Line uint8 + Cc [23]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Taskstats struct { + Version uint16 + _ [2]byte + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + _ [6]byte + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]int8 + Ac_sched uint8 + Ac_pad [3]uint8 + _ [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + _ [4]byte + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 +} + +const ( + TASKSTATS_CMD_UNSPEC = 0x0 + TASKSTATS_CMD_GET = 0x1 + TASKSTATS_CMD_NEW = 0x2 + TASKSTATS_TYPE_UNSPEC = 0x0 + TASKSTATS_TYPE_PID = 0x1 + TASKSTATS_TYPE_TGID = 0x2 + TASKSTATS_TYPE_STATS = 0x3 + TASKSTATS_TYPE_AGGR_PID = 0x4 + TASKSTATS_TYPE_AGGR_TGID = 0x5 + TASKSTATS_TYPE_NULL = 0x6 + TASKSTATS_CMD_ATTR_UNSPEC = 0x0 + TASKSTATS_CMD_ATTR_PID = 0x1 + TASKSTATS_CMD_ATTR_TGID = 0x2 + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 +) + +type CGroupStats struct { + Sleeping uint64 + Running uint64 + Stopped uint64 + Uninterruptible uint64 + Io_wait uint64 +} + +const ( + CGROUPSTATS_CMD_UNSPEC = 0x3 + CGROUPSTATS_CMD_GET = 0x4 + CGROUPSTATS_CMD_NEW = 0x5 + CGROUPSTATS_TYPE_UNSPEC = 0x0 + CGROUPSTATS_TYPE_CGROUP_STATS = 0x1 + CGROUPSTATS_CMD_ATTR_UNSPEC = 0x0 + CGROUPSTATS_CMD_ATTR_FD = 0x1 +) + +type Genlmsghdr struct { + Cmd uint8 + Version uint8 + Reserved uint16 +} + +const ( + CTRL_CMD_UNSPEC = 0x0 + CTRL_CMD_NEWFAMILY = 0x1 + CTRL_CMD_DELFAMILY = 0x2 + CTRL_CMD_GETFAMILY = 0x3 + CTRL_CMD_NEWOPS = 0x4 + CTRL_CMD_DELOPS = 0x5 + CTRL_CMD_GETOPS = 0x6 + CTRL_CMD_NEWMCAST_GRP = 0x7 + CTRL_CMD_DELMCAST_GRP = 0x8 + CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_ATTR_UNSPEC = 0x0 + CTRL_ATTR_FAMILY_ID = 0x1 + CTRL_ATTR_FAMILY_NAME = 0x2 + CTRL_ATTR_VERSION = 0x3 + CTRL_ATTR_HDRSIZE = 0x4 + CTRL_ATTR_MAXATTR = 0x5 + CTRL_ATTR_OPS = 0x6 + CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_OP_UNSPEC = 0x0 + CTRL_ATTR_OP_ID = 0x1 + CTRL_ATTR_OP_FLAGS = 0x2 + CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 + CTRL_ATTR_MCAST_GRP_NAME = 0x1 + CTRL_ATTR_MCAST_GRP_ID = 0x2 +) + +type cpuMask uint32 + +const ( + _CPU_SETSIZE = 0x400 + _NCPUBITS = 0x20 +) + +const ( + BDADDR_BREDR = 0x0 + BDADDR_LE_PUBLIC = 0x1 + BDADDR_LE_RANDOM = 0x2 +) + +type PerfEventAttr struct { + Type uint32 + Size uint32 + Config uint64 + Sample uint64 + Sample_type uint64 + Read_format uint64 + Bits uint64 + Wakeup uint32 + Bp_type uint32 + Ext1 uint64 + Ext2 uint64 + Branch_sample_type uint64 + Sample_regs_user uint64 + Sample_stack_user uint32 + Clockid int32 + Sample_regs_intr uint64 + Aux_watermark uint32 + _ uint32 +} + +type PerfEventMmapPage struct { + Version uint32 + Compat_version uint32 + Lock uint32 + Index uint32 + Offset int64 + Time_enabled uint64 + Time_running uint64 + Capabilities uint64 + Pmc_width uint16 + Time_shift uint16 + Time_mult uint32 + Time_offset uint64 + Time_zero uint64 + Size uint32 + _ [948]uint8 + Data_head uint64 + Data_tail uint64 + Data_offset uint64 + Data_size uint64 + Aux_head uint64 + Aux_tail uint64 + Aux_offset uint64 + Aux_size uint64 +} + +const ( + PerfBitDisabled uint64 = CBitFieldMaskBit0 + PerfBitInherit = CBitFieldMaskBit1 + PerfBitPinned = CBitFieldMaskBit2 + PerfBitExclusive = CBitFieldMaskBit3 + PerfBitExcludeUser = CBitFieldMaskBit4 + PerfBitExcludeKernel = CBitFieldMaskBit5 + PerfBitExcludeHv = CBitFieldMaskBit6 + PerfBitExcludeIdle = CBitFieldMaskBit7 + PerfBitMmap = CBitFieldMaskBit8 + PerfBitComm = CBitFieldMaskBit9 + PerfBitFreq = CBitFieldMaskBit10 + PerfBitInheritStat = CBitFieldMaskBit11 + PerfBitEnableOnExec = CBitFieldMaskBit12 + PerfBitTask = CBitFieldMaskBit13 + PerfBitWatermark = CBitFieldMaskBit14 + PerfBitPreciseIPBit1 = CBitFieldMaskBit15 + PerfBitPreciseIPBit2 = CBitFieldMaskBit16 + PerfBitMmapData = CBitFieldMaskBit17 + PerfBitSampleIDAll = CBitFieldMaskBit18 + PerfBitExcludeHost = CBitFieldMaskBit19 + PerfBitExcludeGuest = CBitFieldMaskBit20 + PerfBitExcludeCallchainKernel = CBitFieldMaskBit21 + PerfBitExcludeCallchainUser = CBitFieldMaskBit22 + PerfBitMmap2 = CBitFieldMaskBit23 + PerfBitCommExec = CBitFieldMaskBit24 + PerfBitUseClockID = CBitFieldMaskBit25 + PerfBitContextSwitch = CBitFieldMaskBit26 +) + +const ( + PERF_TYPE_HARDWARE = 0x0 + PERF_TYPE_SOFTWARE = 0x1 + PERF_TYPE_TRACEPOINT = 0x2 + PERF_TYPE_HW_CACHE = 0x3 + PERF_TYPE_RAW = 0x4 + PERF_TYPE_BREAKPOINT = 0x5 + + PERF_COUNT_HW_CPU_CYCLES = 0x0 + PERF_COUNT_HW_INSTRUCTIONS = 0x1 + PERF_COUNT_HW_CACHE_REFERENCES = 0x2 + PERF_COUNT_HW_CACHE_MISSES = 0x3 + PERF_COUNT_HW_BRANCH_INSTRUCTIONS = 0x4 + PERF_COUNT_HW_BRANCH_MISSES = 0x5 + PERF_COUNT_HW_BUS_CYCLES = 0x6 + PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 0x7 + PERF_COUNT_HW_STALLED_CYCLES_BACKEND = 0x8 + PERF_COUNT_HW_REF_CPU_CYCLES = 0x9 + + PERF_COUNT_HW_CACHE_L1D = 0x0 + PERF_COUNT_HW_CACHE_L1I = 0x1 + PERF_COUNT_HW_CACHE_LL = 0x2 + PERF_COUNT_HW_CACHE_DTLB = 0x3 + PERF_COUNT_HW_CACHE_ITLB = 0x4 + PERF_COUNT_HW_CACHE_BPU = 0x5 + PERF_COUNT_HW_CACHE_NODE = 0x6 + + PERF_COUNT_HW_CACHE_OP_READ = 0x0 + PERF_COUNT_HW_CACHE_OP_WRITE = 0x1 + PERF_COUNT_HW_CACHE_OP_PREFETCH = 0x2 + + PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0x0 + PERF_COUNT_HW_CACHE_RESULT_MISS = 0x1 + + PERF_COUNT_SW_CPU_CLOCK = 0x0 + PERF_COUNT_SW_TASK_CLOCK = 0x1 + PERF_COUNT_SW_PAGE_FAULTS = 0x2 + PERF_COUNT_SW_CONTEXT_SWITCHES = 0x3 + PERF_COUNT_SW_CPU_MIGRATIONS = 0x4 + PERF_COUNT_SW_PAGE_FAULTS_MIN = 0x5 + PERF_COUNT_SW_PAGE_FAULTS_MAJ = 0x6 + PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7 + PERF_COUNT_SW_EMULATION_FAULTS = 0x8 + PERF_COUNT_SW_DUMMY = 0x9 + + PERF_SAMPLE_IP = 0x1 + PERF_SAMPLE_TID = 0x2 + PERF_SAMPLE_TIME = 0x4 + PERF_SAMPLE_ADDR = 0x8 + PERF_SAMPLE_READ = 0x10 + PERF_SAMPLE_CALLCHAIN = 0x20 + PERF_SAMPLE_ID = 0x40 + PERF_SAMPLE_CPU = 0x80 + PERF_SAMPLE_PERIOD = 0x100 + PERF_SAMPLE_STREAM_ID = 0x200 + PERF_SAMPLE_RAW = 0x400 + PERF_SAMPLE_BRANCH_STACK = 0x800 + + PERF_SAMPLE_BRANCH_USER = 0x1 + PERF_SAMPLE_BRANCH_KERNEL = 0x2 + PERF_SAMPLE_BRANCH_HV = 0x4 + PERF_SAMPLE_BRANCH_ANY = 0x8 + PERF_SAMPLE_BRANCH_ANY_CALL = 0x10 + PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20 + PERF_SAMPLE_BRANCH_IND_CALL = 0x40 + + PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1 + PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2 + PERF_FORMAT_ID = 0x4 + PERF_FORMAT_GROUP = 0x8 + + PERF_RECORD_MMAP = 0x1 + PERF_RECORD_LOST = 0x2 + PERF_RECORD_COMM = 0x3 + PERF_RECORD_EXIT = 0x4 + PERF_RECORD_THROTTLE = 0x5 + PERF_RECORD_UNTHROTTLE = 0x6 + PERF_RECORD_FORK = 0x7 + PERF_RECORD_READ = 0x8 + PERF_RECORD_SAMPLE = 0x9 + + PERF_CONTEXT_HV = -0x20 + PERF_CONTEXT_KERNEL = -0x80 + PERF_CONTEXT_USER = -0x200 + + PERF_CONTEXT_GUEST = -0x800 + PERF_CONTEXT_GUEST_KERNEL = -0x880 + PERF_CONTEXT_GUEST_USER = -0xa00 + + PERF_FLAG_FD_NO_GROUP = 0x1 + PERF_FLAG_FD_OUTPUT = 0x2 + PERF_FLAG_PID_CGROUP = 0x4 +) + +const ( + CBitFieldMaskBit0 = 0x1 + CBitFieldMaskBit1 = 0x2 + CBitFieldMaskBit2 = 0x4 + CBitFieldMaskBit3 = 0x8 + CBitFieldMaskBit4 = 0x10 + CBitFieldMaskBit5 = 0x20 + CBitFieldMaskBit6 = 0x40 + CBitFieldMaskBit7 = 0x80 + CBitFieldMaskBit8 = 0x100 + CBitFieldMaskBit9 = 0x200 + CBitFieldMaskBit10 = 0x400 + CBitFieldMaskBit11 = 0x800 + CBitFieldMaskBit12 = 0x1000 + CBitFieldMaskBit13 = 0x2000 + CBitFieldMaskBit14 = 0x4000 + CBitFieldMaskBit15 = 0x8000 + CBitFieldMaskBit16 = 0x10000 + CBitFieldMaskBit17 = 0x20000 + CBitFieldMaskBit18 = 0x40000 + CBitFieldMaskBit19 = 0x80000 + CBitFieldMaskBit20 = 0x100000 + CBitFieldMaskBit21 = 0x200000 + CBitFieldMaskBit22 = 0x400000 + CBitFieldMaskBit23 = 0x800000 + CBitFieldMaskBit24 = 0x1000000 + CBitFieldMaskBit25 = 0x2000000 + CBitFieldMaskBit26 = 0x4000000 + CBitFieldMaskBit27 = 0x8000000 + CBitFieldMaskBit28 = 0x10000000 + CBitFieldMaskBit29 = 0x20000000 + CBitFieldMaskBit30 = 0x40000000 + CBitFieldMaskBit31 = 0x80000000 + CBitFieldMaskBit32 = 0x100000000 + CBitFieldMaskBit33 = 0x200000000 + CBitFieldMaskBit34 = 0x400000000 + CBitFieldMaskBit35 = 0x800000000 + CBitFieldMaskBit36 = 0x1000000000 + CBitFieldMaskBit37 = 0x2000000000 + CBitFieldMaskBit38 = 0x4000000000 + CBitFieldMaskBit39 = 0x8000000000 + CBitFieldMaskBit40 = 0x10000000000 + CBitFieldMaskBit41 = 0x20000000000 + CBitFieldMaskBit42 = 0x40000000000 + CBitFieldMaskBit43 = 0x80000000000 + CBitFieldMaskBit44 = 0x100000000000 + CBitFieldMaskBit45 = 0x200000000000 + CBitFieldMaskBit46 = 0x400000000000 + CBitFieldMaskBit47 = 0x800000000000 + CBitFieldMaskBit48 = 0x1000000000000 + CBitFieldMaskBit49 = 0x2000000000000 + CBitFieldMaskBit50 = 0x4000000000000 + CBitFieldMaskBit51 = 0x8000000000000 + CBitFieldMaskBit52 = 0x10000000000000 + CBitFieldMaskBit53 = 0x20000000000000 + CBitFieldMaskBit54 = 0x40000000000000 + CBitFieldMaskBit55 = 0x80000000000000 + CBitFieldMaskBit56 = 0x100000000000000 + CBitFieldMaskBit57 = 0x200000000000000 + CBitFieldMaskBit58 = 0x400000000000000 + CBitFieldMaskBit59 = 0x800000000000000 + CBitFieldMaskBit60 = 0x1000000000000000 + CBitFieldMaskBit61 = 0x2000000000000000 + CBitFieldMaskBit62 = 0x4000000000000000 + CBitFieldMaskBit63 = 0x8000000000000000 +) + +type SockaddrStorage struct { + Family uint16 + _ [122]int8 + _ uint32 +} + +type TCPMD5Sig struct { + Addr SockaddrStorage + Flags uint8 + Prefixlen uint8 + Keylen uint16 + _ uint32 + Key [80]uint8 +} + +type HDDriveCmdHdr struct { + Command uint8 + Number uint8 + Feature uint8 + Count uint8 +} + +type HDGeometry struct { + Heads uint8 + Sectors uint8 + Cylinders uint16 + Start uint32 +} + +type HDDriveID struct { + Config uint16 + Cyls uint16 + Reserved2 uint16 + Heads uint16 + Track_bytes uint16 + Sector_bytes uint16 + Sectors uint16 + Vendor0 uint16 + Vendor1 uint16 + Vendor2 uint16 + Serial_no [20]uint8 + Buf_type uint16 + Buf_size uint16 + Ecc_bytes uint16 + Fw_rev [8]uint8 + Model [40]uint8 + Max_multsect uint8 + Vendor3 uint8 + Dword_io uint16 + Vendor4 uint8 + Capability uint8 + Reserved50 uint16 + Vendor5 uint8 + TPIO uint8 + Vendor6 uint8 + TDMA uint8 + Field_valid uint16 + Cur_cyls uint16 + Cur_heads uint16 + Cur_sectors uint16 + Cur_capacity0 uint16 + Cur_capacity1 uint16 + Multsect uint8 + Multsect_valid uint8 + Lba_capacity uint32 + Dma_1word uint16 + Dma_mword uint16 + Eide_pio_modes uint16 + Eide_dma_min uint16 + Eide_dma_time uint16 + Eide_pio uint16 + Eide_pio_iordy uint16 + Words69_70 [2]uint16 + Words71_74 [4]uint16 + Queue_depth uint16 + Words76_79 [4]uint16 + Major_rev_num uint16 + Minor_rev_num uint16 + Command_set_1 uint16 + Command_set_2 uint16 + Cfsse uint16 + Cfs_enable_1 uint16 + Cfs_enable_2 uint16 + Csf_default uint16 + Dma_ultra uint16 + Trseuc uint16 + TrsEuc uint16 + CurAPMvalues uint16 + Mprc uint16 + Hw_config uint16 + Acoustic uint16 + Msrqs uint16 + Sxfert uint16 + Sal uint16 + Spg uint32 + Lba_capacity_2 uint64 + Words104_125 [22]uint16 + Last_lun uint16 + Word127 uint16 + Dlf uint16 + Csfo uint16 + Words130_155 [26]uint16 + Word156 uint16 + Words157_159 [3]uint16 + Cfa_power uint16 + Words161_175 [15]uint16 + Words176_205 [30]uint16 + Words206_254 [49]uint16 + Integrity_word uint16 +} + +type Statfs_t struct { + Type int32 + Bsize int32 + Frsize int32 + _ [4]byte + Blocks uint64 + Bfree uint64 + Files uint64 + Ffree uint64 + Bavail uint64 + Fsid Fsid + Namelen int32 + Flags int32 + Spare [5]int32 + _ [4]byte +} + +const ( + ST_MANDLOCK = 0x40 + ST_NOATIME = 0x400 + ST_NODEV = 0x4 + ST_NODIRATIME = 0x800 + ST_NOEXEC = 0x8 + ST_NOSUID = 0x2 + ST_RDONLY = 0x1 + ST_RELATIME = 0x1000 + ST_SYNCHRONOUS = 0x10 +) + +type TpacketHdr struct { + Status uint32 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Sec uint32 + Usec uint32 +} + +type Tpacket2Hdr struct { + Status uint32 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Sec uint32 + Nsec uint32 + Vlan_tci uint16 + Vlan_tpid uint16 + _ [4]uint8 +} + +type Tpacket3Hdr struct { + Next_offset uint32 + Sec uint32 + Nsec uint32 + Snaplen uint32 + Len uint32 + Status uint32 + Mac uint16 + Net uint16 + Hv1 TpacketHdrVariant1 + _ [8]uint8 +} + +type TpacketHdrVariant1 struct { + Rxhash uint32 + Vlan_tci uint32 + Vlan_tpid uint16 + _ uint16 +} + +type TpacketBlockDesc struct { + Version uint32 + To_priv uint32 + Hdr [40]byte +} + +type TpacketReq struct { + Block_size uint32 + Block_nr uint32 + Frame_size uint32 + Frame_nr uint32 +} + +type TpacketReq3 struct { + Block_size uint32 + Block_nr uint32 + Frame_size uint32 + Frame_nr uint32 + Retire_blk_tov uint32 + Sizeof_priv uint32 + Feature_req_word uint32 +} + +type TpacketStats struct { + Packets uint32 + Drops uint32 +} + +type TpacketStatsV3 struct { + Packets uint32 + Drops uint32 + Freeze_q_cnt uint32 +} + +type TpacketAuxdata struct { + Status uint32 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Vlan_tci uint16 + Vlan_tpid uint16 +} + +const ( + TPACKET_V1 = 0x0 + TPACKET_V2 = 0x1 + TPACKET_V3 = 0x2 +) + +const ( + SizeofTpacketHdr = 0x18 + SizeofTpacket2Hdr = 0x20 + SizeofTpacket3Hdr = 0x30 +) + +const ( + NF_INET_PRE_ROUTING = 0x0 + NF_INET_LOCAL_IN = 0x1 + NF_INET_FORWARD = 0x2 + NF_INET_LOCAL_OUT = 0x3 + NF_INET_POST_ROUTING = 0x4 + NF_INET_NUMHOOKS = 0x5 +) + +const ( + NF_NETDEV_INGRESS = 0x0 + NF_NETDEV_NUMHOOKS = 0x1 +) + +const ( + NFPROTO_UNSPEC = 0x0 + NFPROTO_INET = 0x1 + NFPROTO_IPV4 = 0x2 + NFPROTO_ARP = 0x3 + NFPROTO_NETDEV = 0x5 + NFPROTO_BRIDGE = 0x7 + NFPROTO_IPV6 = 0xa + NFPROTO_DECNET = 0xc + NFPROTO_NUMPROTO = 0xd +) + +type Nfgenmsg struct { + Nfgen_family uint8 + Version uint8 + Res_id uint16 +} + +const ( + NFNL_BATCH_UNSPEC = 0x0 + NFNL_BATCH_GENID = 0x1 +) + +const ( + NFT_REG_VERDICT = 0x0 + NFT_REG_1 = 0x1 + NFT_REG_2 = 0x2 + NFT_REG_3 = 0x3 + NFT_REG_4 = 0x4 + NFT_REG32_00 = 0x8 + NFT_REG32_01 = 0x9 + NFT_REG32_02 = 0xa + NFT_REG32_03 = 0xb + NFT_REG32_04 = 0xc + NFT_REG32_05 = 0xd + NFT_REG32_06 = 0xe + NFT_REG32_07 = 0xf + NFT_REG32_08 = 0x10 + NFT_REG32_09 = 0x11 + NFT_REG32_10 = 0x12 + NFT_REG32_11 = 0x13 + NFT_REG32_12 = 0x14 + NFT_REG32_13 = 0x15 + NFT_REG32_14 = 0x16 + NFT_REG32_15 = 0x17 + NFT_CONTINUE = -0x1 + NFT_BREAK = -0x2 + NFT_JUMP = -0x3 + NFT_GOTO = -0x4 + NFT_RETURN = -0x5 + NFT_MSG_NEWTABLE = 0x0 + NFT_MSG_GETTABLE = 0x1 + NFT_MSG_DELTABLE = 0x2 + NFT_MSG_NEWCHAIN = 0x3 + NFT_MSG_GETCHAIN = 0x4 + NFT_MSG_DELCHAIN = 0x5 + NFT_MSG_NEWRULE = 0x6 + NFT_MSG_GETRULE = 0x7 + NFT_MSG_DELRULE = 0x8 + NFT_MSG_NEWSET = 0x9 + NFT_MSG_GETSET = 0xa + NFT_MSG_DELSET = 0xb + NFT_MSG_NEWSETELEM = 0xc + NFT_MSG_GETSETELEM = 0xd + NFT_MSG_DELSETELEM = 0xe + NFT_MSG_NEWGEN = 0xf + NFT_MSG_GETGEN = 0x10 + NFT_MSG_TRACE = 0x11 + NFT_MSG_NEWOBJ = 0x12 + NFT_MSG_GETOBJ = 0x13 + NFT_MSG_DELOBJ = 0x14 + NFT_MSG_GETOBJ_RESET = 0x15 + NFT_MSG_MAX = 0x19 + NFTA_LIST_UNPEC = 0x0 + NFTA_LIST_ELEM = 0x1 + NFTA_HOOK_UNSPEC = 0x0 + NFTA_HOOK_HOOKNUM = 0x1 + NFTA_HOOK_PRIORITY = 0x2 + NFTA_HOOK_DEV = 0x3 + NFT_TABLE_F_DORMANT = 0x1 + NFTA_TABLE_UNSPEC = 0x0 + NFTA_TABLE_NAME = 0x1 + NFTA_TABLE_FLAGS = 0x2 + NFTA_TABLE_USE = 0x3 + NFTA_CHAIN_UNSPEC = 0x0 + NFTA_CHAIN_TABLE = 0x1 + NFTA_CHAIN_HANDLE = 0x2 + NFTA_CHAIN_NAME = 0x3 + NFTA_CHAIN_HOOK = 0x4 + NFTA_CHAIN_POLICY = 0x5 + NFTA_CHAIN_USE = 0x6 + NFTA_CHAIN_TYPE = 0x7 + NFTA_CHAIN_COUNTERS = 0x8 + NFTA_CHAIN_PAD = 0x9 + NFTA_RULE_UNSPEC = 0x0 + NFTA_RULE_TABLE = 0x1 + NFTA_RULE_CHAIN = 0x2 + NFTA_RULE_HANDLE = 0x3 + NFTA_RULE_EXPRESSIONS = 0x4 + NFTA_RULE_COMPAT = 0x5 + NFTA_RULE_POSITION = 0x6 + NFTA_RULE_USERDATA = 0x7 + NFTA_RULE_PAD = 0x8 + NFTA_RULE_ID = 0x9 + NFT_RULE_COMPAT_F_INV = 0x2 + NFT_RULE_COMPAT_F_MASK = 0x2 + NFTA_RULE_COMPAT_UNSPEC = 0x0 + NFTA_RULE_COMPAT_PROTO = 0x1 + NFTA_RULE_COMPAT_FLAGS = 0x2 + NFT_SET_ANONYMOUS = 0x1 + NFT_SET_CONSTANT = 0x2 + NFT_SET_INTERVAL = 0x4 + NFT_SET_MAP = 0x8 + NFT_SET_TIMEOUT = 0x10 + NFT_SET_EVAL = 0x20 + NFT_SET_OBJECT = 0x40 + NFT_SET_POL_PERFORMANCE = 0x0 + NFT_SET_POL_MEMORY = 0x1 + NFTA_SET_DESC_UNSPEC = 0x0 + NFTA_SET_DESC_SIZE = 0x1 + NFTA_SET_UNSPEC = 0x0 + NFTA_SET_TABLE = 0x1 + NFTA_SET_NAME = 0x2 + NFTA_SET_FLAGS = 0x3 + NFTA_SET_KEY_TYPE = 0x4 + NFTA_SET_KEY_LEN = 0x5 + NFTA_SET_DATA_TYPE = 0x6 + NFTA_SET_DATA_LEN = 0x7 + NFTA_SET_POLICY = 0x8 + NFTA_SET_DESC = 0x9 + NFTA_SET_ID = 0xa + NFTA_SET_TIMEOUT = 0xb + NFTA_SET_GC_INTERVAL = 0xc + NFTA_SET_USERDATA = 0xd + NFTA_SET_PAD = 0xe + NFTA_SET_OBJ_TYPE = 0xf + NFT_SET_ELEM_INTERVAL_END = 0x1 + NFTA_SET_ELEM_UNSPEC = 0x0 + NFTA_SET_ELEM_KEY = 0x1 + NFTA_SET_ELEM_DATA = 0x2 + NFTA_SET_ELEM_FLAGS = 0x3 + NFTA_SET_ELEM_TIMEOUT = 0x4 + NFTA_SET_ELEM_EXPIRATION = 0x5 + NFTA_SET_ELEM_USERDATA = 0x6 + NFTA_SET_ELEM_EXPR = 0x7 + NFTA_SET_ELEM_PAD = 0x8 + NFTA_SET_ELEM_OBJREF = 0x9 + NFTA_SET_ELEM_LIST_UNSPEC = 0x0 + NFTA_SET_ELEM_LIST_TABLE = 0x1 + NFTA_SET_ELEM_LIST_SET = 0x2 + NFTA_SET_ELEM_LIST_ELEMENTS = 0x3 + NFTA_SET_ELEM_LIST_SET_ID = 0x4 + NFT_DATA_VALUE = 0x0 + NFT_DATA_VERDICT = 0xffffff00 + NFTA_DATA_UNSPEC = 0x0 + NFTA_DATA_VALUE = 0x1 + NFTA_DATA_VERDICT = 0x2 + NFTA_VERDICT_UNSPEC = 0x0 + NFTA_VERDICT_CODE = 0x1 + NFTA_VERDICT_CHAIN = 0x2 + NFTA_EXPR_UNSPEC = 0x0 + NFTA_EXPR_NAME = 0x1 + NFTA_EXPR_DATA = 0x2 + NFTA_IMMEDIATE_UNSPEC = 0x0 + NFTA_IMMEDIATE_DREG = 0x1 + NFTA_IMMEDIATE_DATA = 0x2 + NFTA_BITWISE_UNSPEC = 0x0 + NFTA_BITWISE_SREG = 0x1 + NFTA_BITWISE_DREG = 0x2 + NFTA_BITWISE_LEN = 0x3 + NFTA_BITWISE_MASK = 0x4 + NFTA_BITWISE_XOR = 0x5 + NFT_BYTEORDER_NTOH = 0x0 + NFT_BYTEORDER_HTON = 0x1 + NFTA_BYTEORDER_UNSPEC = 0x0 + NFTA_BYTEORDER_SREG = 0x1 + NFTA_BYTEORDER_DREG = 0x2 + NFTA_BYTEORDER_OP = 0x3 + NFTA_BYTEORDER_LEN = 0x4 + NFTA_BYTEORDER_SIZE = 0x5 + NFT_CMP_EQ = 0x0 + NFT_CMP_NEQ = 0x1 + NFT_CMP_LT = 0x2 + NFT_CMP_LTE = 0x3 + NFT_CMP_GT = 0x4 + NFT_CMP_GTE = 0x5 + NFTA_CMP_UNSPEC = 0x0 + NFTA_CMP_SREG = 0x1 + NFTA_CMP_OP = 0x2 + NFTA_CMP_DATA = 0x3 + NFT_RANGE_EQ = 0x0 + NFT_RANGE_NEQ = 0x1 + NFTA_RANGE_UNSPEC = 0x0 + NFTA_RANGE_SREG = 0x1 + NFTA_RANGE_OP = 0x2 + NFTA_RANGE_FROM_DATA = 0x3 + NFTA_RANGE_TO_DATA = 0x4 + NFT_LOOKUP_F_INV = 0x1 + NFTA_LOOKUP_UNSPEC = 0x0 + NFTA_LOOKUP_SET = 0x1 + NFTA_LOOKUP_SREG = 0x2 + NFTA_LOOKUP_DREG = 0x3 + NFTA_LOOKUP_SET_ID = 0x4 + NFTA_LOOKUP_FLAGS = 0x5 + NFT_DYNSET_OP_ADD = 0x0 + NFT_DYNSET_OP_UPDATE = 0x1 + NFT_DYNSET_F_INV = 0x1 + NFTA_DYNSET_UNSPEC = 0x0 + NFTA_DYNSET_SET_NAME = 0x1 + NFTA_DYNSET_SET_ID = 0x2 + NFTA_DYNSET_OP = 0x3 + NFTA_DYNSET_SREG_KEY = 0x4 + NFTA_DYNSET_SREG_DATA = 0x5 + NFTA_DYNSET_TIMEOUT = 0x6 + NFTA_DYNSET_EXPR = 0x7 + NFTA_DYNSET_PAD = 0x8 + NFTA_DYNSET_FLAGS = 0x9 + NFT_PAYLOAD_LL_HEADER = 0x0 + NFT_PAYLOAD_NETWORK_HEADER = 0x1 + NFT_PAYLOAD_TRANSPORT_HEADER = 0x2 + NFT_PAYLOAD_CSUM_NONE = 0x0 + NFT_PAYLOAD_CSUM_INET = 0x1 + NFT_PAYLOAD_L4CSUM_PSEUDOHDR = 0x1 + NFTA_PAYLOAD_UNSPEC = 0x0 + NFTA_PAYLOAD_DREG = 0x1 + NFTA_PAYLOAD_BASE = 0x2 + NFTA_PAYLOAD_OFFSET = 0x3 + NFTA_PAYLOAD_LEN = 0x4 + NFTA_PAYLOAD_SREG = 0x5 + NFTA_PAYLOAD_CSUM_TYPE = 0x6 + NFTA_PAYLOAD_CSUM_OFFSET = 0x7 + NFTA_PAYLOAD_CSUM_FLAGS = 0x8 + NFT_EXTHDR_F_PRESENT = 0x1 + NFT_EXTHDR_OP_IPV6 = 0x0 + NFT_EXTHDR_OP_TCPOPT = 0x1 + NFTA_EXTHDR_UNSPEC = 0x0 + NFTA_EXTHDR_DREG = 0x1 + NFTA_EXTHDR_TYPE = 0x2 + NFTA_EXTHDR_OFFSET = 0x3 + NFTA_EXTHDR_LEN = 0x4 + NFTA_EXTHDR_FLAGS = 0x5 + NFTA_EXTHDR_OP = 0x6 + NFTA_EXTHDR_SREG = 0x7 + NFT_META_LEN = 0x0 + NFT_META_PROTOCOL = 0x1 + NFT_META_PRIORITY = 0x2 + NFT_META_MARK = 0x3 + NFT_META_IIF = 0x4 + NFT_META_OIF = 0x5 + NFT_META_IIFNAME = 0x6 + NFT_META_OIFNAME = 0x7 + NFT_META_IIFTYPE = 0x8 + NFT_META_OIFTYPE = 0x9 + NFT_META_SKUID = 0xa + NFT_META_SKGID = 0xb + NFT_META_NFTRACE = 0xc + NFT_META_RTCLASSID = 0xd + NFT_META_SECMARK = 0xe + NFT_META_NFPROTO = 0xf + NFT_META_L4PROTO = 0x10 + NFT_META_BRI_IIFNAME = 0x11 + NFT_META_BRI_OIFNAME = 0x12 + NFT_META_PKTTYPE = 0x13 + NFT_META_CPU = 0x14 + NFT_META_IIFGROUP = 0x15 + NFT_META_OIFGROUP = 0x16 + NFT_META_CGROUP = 0x17 + NFT_META_PRANDOM = 0x18 + NFT_RT_CLASSID = 0x0 + NFT_RT_NEXTHOP4 = 0x1 + NFT_RT_NEXTHOP6 = 0x2 + NFT_RT_TCPMSS = 0x3 + NFT_HASH_JENKINS = 0x0 + NFT_HASH_SYM = 0x1 + NFTA_HASH_UNSPEC = 0x0 + NFTA_HASH_SREG = 0x1 + NFTA_HASH_DREG = 0x2 + NFTA_HASH_LEN = 0x3 + NFTA_HASH_MODULUS = 0x4 + NFTA_HASH_SEED = 0x5 + NFTA_HASH_OFFSET = 0x6 + NFTA_HASH_TYPE = 0x7 + NFTA_META_UNSPEC = 0x0 + NFTA_META_DREG = 0x1 + NFTA_META_KEY = 0x2 + NFTA_META_SREG = 0x3 + NFTA_RT_UNSPEC = 0x0 + NFTA_RT_DREG = 0x1 + NFTA_RT_KEY = 0x2 + NFT_CT_STATE = 0x0 + NFT_CT_DIRECTION = 0x1 + NFT_CT_STATUS = 0x2 + NFT_CT_MARK = 0x3 + NFT_CT_SECMARK = 0x4 + NFT_CT_EXPIRATION = 0x5 + NFT_CT_HELPER = 0x6 + NFT_CT_L3PROTOCOL = 0x7 + NFT_CT_SRC = 0x8 + NFT_CT_DST = 0x9 + NFT_CT_PROTOCOL = 0xa + NFT_CT_PROTO_SRC = 0xb + NFT_CT_PROTO_DST = 0xc + NFT_CT_LABELS = 0xd + NFT_CT_PKTS = 0xe + NFT_CT_BYTES = 0xf + NFT_CT_AVGPKT = 0x10 + NFT_CT_ZONE = 0x11 + NFT_CT_EVENTMASK = 0x12 + NFTA_CT_UNSPEC = 0x0 + NFTA_CT_DREG = 0x1 + NFTA_CT_KEY = 0x2 + NFTA_CT_DIRECTION = 0x3 + NFTA_CT_SREG = 0x4 + NFT_LIMIT_PKTS = 0x0 + NFT_LIMIT_PKT_BYTES = 0x1 + NFT_LIMIT_F_INV = 0x1 + NFTA_LIMIT_UNSPEC = 0x0 + NFTA_LIMIT_RATE = 0x1 + NFTA_LIMIT_UNIT = 0x2 + NFTA_LIMIT_BURST = 0x3 + NFTA_LIMIT_TYPE = 0x4 + NFTA_LIMIT_FLAGS = 0x5 + NFTA_LIMIT_PAD = 0x6 + NFTA_COUNTER_UNSPEC = 0x0 + NFTA_COUNTER_BYTES = 0x1 + NFTA_COUNTER_PACKETS = 0x2 + NFTA_COUNTER_PAD = 0x3 + NFTA_LOG_UNSPEC = 0x0 + NFTA_LOG_GROUP = 0x1 + NFTA_LOG_PREFIX = 0x2 + NFTA_LOG_SNAPLEN = 0x3 + NFTA_LOG_QTHRESHOLD = 0x4 + NFTA_LOG_LEVEL = 0x5 + NFTA_LOG_FLAGS = 0x6 + NFTA_QUEUE_UNSPEC = 0x0 + NFTA_QUEUE_NUM = 0x1 + NFTA_QUEUE_TOTAL = 0x2 + NFTA_QUEUE_FLAGS = 0x3 + NFTA_QUEUE_SREG_QNUM = 0x4 + NFT_QUOTA_F_INV = 0x1 + NFT_QUOTA_F_DEPLETED = 0x2 + NFTA_QUOTA_UNSPEC = 0x0 + NFTA_QUOTA_BYTES = 0x1 + NFTA_QUOTA_FLAGS = 0x2 + NFTA_QUOTA_PAD = 0x3 + NFTA_QUOTA_CONSUMED = 0x4 + NFT_REJECT_ICMP_UNREACH = 0x0 + NFT_REJECT_TCP_RST = 0x1 + NFT_REJECT_ICMPX_UNREACH = 0x2 + NFT_REJECT_ICMPX_NO_ROUTE = 0x0 + NFT_REJECT_ICMPX_PORT_UNREACH = 0x1 + NFT_REJECT_ICMPX_HOST_UNREACH = 0x2 + NFT_REJECT_ICMPX_ADMIN_PROHIBITED = 0x3 + NFTA_REJECT_UNSPEC = 0x0 + NFTA_REJECT_TYPE = 0x1 + NFTA_REJECT_ICMP_CODE = 0x2 + NFT_NAT_SNAT = 0x0 + NFT_NAT_DNAT = 0x1 + NFTA_NAT_UNSPEC = 0x0 + NFTA_NAT_TYPE = 0x1 + NFTA_NAT_FAMILY = 0x2 + NFTA_NAT_REG_ADDR_MIN = 0x3 + NFTA_NAT_REG_ADDR_MAX = 0x4 + NFTA_NAT_REG_PROTO_MIN = 0x5 + NFTA_NAT_REG_PROTO_MAX = 0x6 + NFTA_NAT_FLAGS = 0x7 + NFTA_MASQ_UNSPEC = 0x0 + NFTA_MASQ_FLAGS = 0x1 + NFTA_MASQ_REG_PROTO_MIN = 0x2 + NFTA_MASQ_REG_PROTO_MAX = 0x3 + NFTA_REDIR_UNSPEC = 0x0 + NFTA_REDIR_REG_PROTO_MIN = 0x1 + NFTA_REDIR_REG_PROTO_MAX = 0x2 + NFTA_REDIR_FLAGS = 0x3 + NFTA_DUP_UNSPEC = 0x0 + NFTA_DUP_SREG_ADDR = 0x1 + NFTA_DUP_SREG_DEV = 0x2 + NFTA_FWD_UNSPEC = 0x0 + NFTA_FWD_SREG_DEV = 0x1 + NFTA_OBJREF_UNSPEC = 0x0 + NFTA_OBJREF_IMM_TYPE = 0x1 + NFTA_OBJREF_IMM_NAME = 0x2 + NFTA_OBJREF_SET_SREG = 0x3 + NFTA_OBJREF_SET_NAME = 0x4 + NFTA_OBJREF_SET_ID = 0x5 + NFTA_GEN_UNSPEC = 0x0 + NFTA_GEN_ID = 0x1 + NFTA_GEN_PROC_PID = 0x2 + NFTA_GEN_PROC_NAME = 0x3 + NFTA_FIB_UNSPEC = 0x0 + NFTA_FIB_DREG = 0x1 + NFTA_FIB_RESULT = 0x2 + NFTA_FIB_FLAGS = 0x3 + NFT_FIB_RESULT_UNSPEC = 0x0 + NFT_FIB_RESULT_OIF = 0x1 + NFT_FIB_RESULT_OIFNAME = 0x2 + NFT_FIB_RESULT_ADDRTYPE = 0x3 + NFTA_FIB_F_SADDR = 0x1 + NFTA_FIB_F_DADDR = 0x2 + NFTA_FIB_F_MARK = 0x4 + NFTA_FIB_F_IIF = 0x8 + NFTA_FIB_F_OIF = 0x10 + NFTA_FIB_F_PRESENT = 0x20 + NFTA_CT_HELPER_UNSPEC = 0x0 + NFTA_CT_HELPER_NAME = 0x1 + NFTA_CT_HELPER_L3PROTO = 0x2 + NFTA_CT_HELPER_L4PROTO = 0x3 + NFTA_OBJ_UNSPEC = 0x0 + NFTA_OBJ_TABLE = 0x1 + NFTA_OBJ_NAME = 0x2 + NFTA_OBJ_TYPE = 0x3 + NFTA_OBJ_DATA = 0x4 + NFTA_OBJ_USE = 0x5 + NFTA_TRACE_UNSPEC = 0x0 + NFTA_TRACE_TABLE = 0x1 + NFTA_TRACE_CHAIN = 0x2 + NFTA_TRACE_RULE_HANDLE = 0x3 + NFTA_TRACE_TYPE = 0x4 + NFTA_TRACE_VERDICT = 0x5 + NFTA_TRACE_ID = 0x6 + NFTA_TRACE_LL_HEADER = 0x7 + NFTA_TRACE_NETWORK_HEADER = 0x8 + NFTA_TRACE_TRANSPORT_HEADER = 0x9 + NFTA_TRACE_IIF = 0xa + NFTA_TRACE_IIFTYPE = 0xb + NFTA_TRACE_OIF = 0xc + NFTA_TRACE_OIFTYPE = 0xd + NFTA_TRACE_MARK = 0xe + NFTA_TRACE_NFPROTO = 0xf + NFTA_TRACE_POLICY = 0x10 + NFTA_TRACE_PAD = 0x11 + NFT_TRACETYPE_UNSPEC = 0x0 + NFT_TRACETYPE_POLICY = 0x1 + NFT_TRACETYPE_RETURN = 0x2 + NFT_TRACETYPE_RULE = 0x3 + NFTA_NG_UNSPEC = 0x0 + NFTA_NG_DREG = 0x1 + NFTA_NG_MODULUS = 0x2 + NFTA_NG_TYPE = 0x3 + NFTA_NG_OFFSET = 0x4 + NFT_NG_INCREMENTAL = 0x0 + NFT_NG_RANDOM = 0x1 +) + +type RTCTime struct { + Sec int32 + Min int32 + Hour int32 + Mday int32 + Mon int32 + Year int32 + Wday int32 + Yday int32 + Isdst int32 +} + +type RTCWkAlrm struct { + Enabled uint8 + Pending uint8 + _ [2]byte + Time RTCTime +} + +type RTCPLLInfo struct { + Ctrl int32 + Value int32 + Max int32 + Min int32 + Posmult int32 + Negmult int32 + Clock int32 +} + +type BlkpgIoctlArg struct { + Op int32 + Flags int32 + Datalen int32 + Data *byte +} + +type BlkpgPartition struct { + Start int64 + Length int64 + Pno int32 + Devname [64]uint8 + Volname [64]uint8 + _ [4]byte +} + +const ( + BLKPG = 0x20001269 + BLKPG_ADD_PARTITION = 0x1 + BLKPG_DEL_PARTITION = 0x2 + BLKPG_RESIZE_PARTITION = 0x3 +) + +const ( + NETNSA_NONE = 0x0 + NETNSA_NSID = 0x1 + NETNSA_PID = 0x2 + NETNSA_FD = 0x3 +) + +type XDPRingOffset struct { + Producer uint64 + Consumer uint64 + Desc uint64 +} + +type XDPMmapOffsets struct { + Rx XDPRingOffset + Tx XDPRingOffset + Fr XDPRingOffset + Cr XDPRingOffset +} + +type XDPUmemReg struct { + Addr uint64 + Len uint64 + Size uint32 + Headroom uint32 +} + +type XDPStatistics struct { + Rx_dropped uint64 + Rx_invalid_descs uint64 + Tx_invalid_descs uint64 +} + +type XDPDesc struct { + Addr uint64 + Len uint32 + Options uint32 +} + +const ( + NCSI_CMD_UNSPEC = 0x0 + NCSI_CMD_PKG_INFO = 0x1 + NCSI_CMD_SET_INTERFACE = 0x2 + NCSI_CMD_CLEAR_INTERFACE = 0x3 + NCSI_ATTR_UNSPEC = 0x0 + NCSI_ATTR_IFINDEX = 0x1 + NCSI_ATTR_PACKAGE_LIST = 0x2 + NCSI_ATTR_PACKAGE_ID = 0x3 + NCSI_ATTR_CHANNEL_ID = 0x4 + NCSI_PKG_ATTR_UNSPEC = 0x0 + NCSI_PKG_ATTR = 0x1 + NCSI_PKG_ATTR_ID = 0x2 + NCSI_PKG_ATTR_FORCED = 0x3 + NCSI_PKG_ATTR_CHANNEL_LIST = 0x4 + NCSI_CHANNEL_ATTR_UNSPEC = 0x0 + NCSI_CHANNEL_ATTR = 0x1 + NCSI_CHANNEL_ATTR_ID = 0x2 + NCSI_CHANNEL_ATTR_VERSION_MAJOR = 0x3 + NCSI_CHANNEL_ATTR_VERSION_MINOR = 0x4 + NCSI_CHANNEL_ATTR_VERSION_STR = 0x5 + NCSI_CHANNEL_ATTR_LINK_STATE = 0x6 + NCSI_CHANNEL_ATTR_ACTIVE = 0x7 + NCSI_CHANNEL_ATTR_FORCED = 0x8 + NCSI_CHANNEL_ATTR_VLAN_LIST = 0x9 + NCSI_CHANNEL_ATTR_VLAN_ID = 0xa +) + +const ( + SOF_TIMESTAMPING_TX_HARDWARE = 0x1 + SOF_TIMESTAMPING_TX_SOFTWARE = 0x2 + SOF_TIMESTAMPING_RX_HARDWARE = 0x4 + SOF_TIMESTAMPING_RX_SOFTWARE = 0x8 + SOF_TIMESTAMPING_SOFTWARE = 0x10 + SOF_TIMESTAMPING_SYS_HARDWARE = 0x20 + SOF_TIMESTAMPING_RAW_HARDWARE = 0x40 + SOF_TIMESTAMPING_OPT_ID = 0x80 + SOF_TIMESTAMPING_TX_SCHED = 0x100 + SOF_TIMESTAMPING_TX_ACK = 0x200 + SOF_TIMESTAMPING_OPT_CMSG = 0x400 + SOF_TIMESTAMPING_OPT_TSONLY = 0x800 + SOF_TIMESTAMPING_OPT_STATS = 0x1000 + SOF_TIMESTAMPING_OPT_PKTINFO = 0x2000 + SOF_TIMESTAMPING_OPT_TX_SWHW = 0x4000 + + SOF_TIMESTAMPING_LAST = 0x4000 + SOF_TIMESTAMPING_MASK = 0x7fff +) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go new file mode 100644 index 00000000..b46d54e3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go @@ -0,0 +1,1999 @@ +// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build ppc64,linux + +package unix + +const ( + SizeofPtr = 0x8 + SizeofShort = 0x2 + SizeofInt = 0x4 + SizeofLong = 0x8 + SizeofLongLong = 0x8 + PathMax = 0x1000 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Timex struct { + Modes uint32 + _ [4]byte + Offset int64 + Freq int64 + Maxerror int64 + Esterror int64 + Status int32 + _ [4]byte + Constant int64 + Precision int64 + Tolerance int64 + Time Timeval + Tick int64 + Ppsfreq int64 + Jitter int64 + Shift int32 + _ [4]byte + Stabil int64 + Jitcnt int64 + Calcnt int64 + Errcnt int64 + Stbcnt int64 + Tai int32 + _ [44]byte +} + +type Time_t int64 + +type Tms struct { + Utime int64 + Stime int64 + Cutime int64 + Cstime int64 +} + +type Utimbuf struct { + Actime int64 + Modtime int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint64 + Ino uint64 + Nlink uint64 + Mode uint32 + Uid uint32 + Gid uint32 + _ int32 + Rdev uint64 + Size int64 + Blksize int64 + Blocks int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + _ uint64 + _ uint64 + _ uint64 +} + +type StatxTimestamp struct { + Sec int64 + Nsec uint32 + _ int32 +} + +type Statx_t struct { + Mask uint32 + Blksize uint32 + Attributes uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Mode uint16 + _ [1]uint16 + Ino uint64 + Size uint64 + Blocks uint64 + Attributes_mask uint64 + Atime StatxTimestamp + Btime StatxTimestamp + Ctime StatxTimestamp + Mtime StatxTimestamp + Rdev_major uint32 + Rdev_minor uint32 + Dev_major uint32 + Dev_minor uint32 + _ [14]uint64 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]uint8 + _ [5]byte +} + +type Fsid struct { + Val [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + _ [4]byte + Start int64 + Len int64 + Pid int32 + _ [4]byte +} + +type FscryptPolicy struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptKey struct { + Mode uint32 + Raw [64]uint8 + Size uint32 +} + +type KeyctlDHParams struct { + Private int32 + Prime int32 + Base int32 +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddrL2 struct { + Family uint16 + Psm uint16 + Bdaddr [6]uint8 + Cid uint16 + Bdaddr_type uint8 + _ [1]byte +} + +type RawSockaddrRFCOMM struct { + Family uint16 + Bdaddr [6]uint8 + Channel uint8 + _ [1]byte +} + +type RawSockaddrCAN struct { + Family uint16 + _ [2]byte + Ifindex int32 + Addr [8]byte +} + +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + +type RawSockaddrXDP struct { + Family uint16 + Flags uint16 + Ifindex uint32 + Queue_id uint32 + Shared_umem_fd uint32 +} + +type RawSockaddr struct { + Family uint16 + Data [14]uint8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]uint8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type PacketMreq struct { + Ifindex int32 + Type uint16 + Alen uint16 + Address [8]uint8 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + _ [4]byte + Iov *Iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + _ [4]byte +} + +type Cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + _ [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofSockaddrL2 = 0xe + SizeofSockaddrRFCOMM = 0xa + SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 + SizeofSockaddrXDP = 0x10 + SizeofLinger = 0x8 + SizeofIovec = 0x10 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofPacketMreq = 0x10 + SizeofMsghdr = 0x38 + SizeofCmsghdr = 0x10 + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_INFO_KIND = 0x1 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_NUM_VF = 0x15 + IFLA_VFINFO_LIST = 0x16 + IFLA_STATS64 = 0x17 + IFLA_VF_PORTS = 0x18 + IFLA_PORT_SELF = 0x19 + IFLA_AF_SPEC = 0x1a + IFLA_GROUP = 0x1b + IFLA_NET_NS_FD = 0x1c + IFLA_EXT_MASK = 0x1d + IFLA_PROMISCUITY = 0x1e + IFLA_NUM_TX_QUEUES = 0x1f + IFLA_NUM_RX_QUEUES = 0x20 + IFLA_CARRIER = 0x21 + IFLA_PHYS_PORT_ID = 0x22 + IFLA_CARRIER_CHANGES = 0x23 + IFLA_PHYS_SWITCH_ID = 0x24 + IFLA_LINK_NETNSID = 0x25 + IFLA_PHYS_PORT_NAME = 0x26 + IFLA_PROTO_DOWN = 0x27 + IFLA_GSO_MAX_SEGS = 0x28 + IFLA_GSO_MAX_SIZE = 0x29 + IFLA_PAD = 0x2a + IFLA_XDP = 0x2b + IFLA_EVENT = 0x2c + IFLA_NEW_NETNSID = 0x2d + IFLA_IF_NETNSID = 0x2e + IFLA_MAX = 0x33 + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTA_MARK = 0x10 + RTA_MFC_STATS = 0x11 + RTA_VIA = 0x12 + RTA_NEWDST = 0x13 + RTA_PREF = 0x14 + RTA_ENCAP_TYPE = 0x15 + RTA_ENCAP = 0x16 + RTA_EXPIRES = 0x17 + RTA_PAD = 0x18 + RTA_UID = 0x19 + RTA_TTL_PROPAGATE = 0x1a + RTA_IP_PROTO = 0x1b + RTA_SPORT = 0x1c + RTA_DPORT = 0x1d + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + _ uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x10 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + _ [6]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + Gpr [32]uint64 + Nip uint64 + Msr uint64 + Orig_gpr3 uint64 + Ctr uint64 + Link uint64 + Xer uint64 + Ccr uint64 + Softe uint64 + Trap uint64 + Dar uint64 + Dsisr uint64 + Result uint64 +} + +type FdSet struct { + Bits [16]int64 +} + +type Sysinfo_t struct { + Uptime int64 + Loads [3]uint64 + Totalram uint64 + Freeram uint64 + Sharedram uint64 + Bufferram uint64 + Totalswap uint64 + Freeswap uint64 + Procs uint16 + Pad uint16 + _ [4]byte + Totalhigh uint64 + Freehigh uint64 + Unit uint32 + _ [0]uint8 + _ [4]byte +} + +type Utsname struct { + Sysname [65]byte + Nodename [65]byte + Release [65]byte + Version [65]byte + Machine [65]byte + Domainname [65]byte +} + +type Ustat_t struct { + Tfree int32 + _ [4]byte + Tinode uint64 + Fname [6]uint8 + Fpack [6]uint8 + _ [4]byte +} + +type EpollEvent struct { + Events uint32 + _ int32 + Fd int32 + Pad int32 +} + +const ( + AT_EMPTY_PATH = 0x1000 + AT_FDCWD = -0x64 + AT_NO_AUTOMOUNT = 0x800 + AT_REMOVEDIR = 0x200 + + AT_STATX_SYNC_AS_STAT = 0x0 + AT_STATX_FORCE_SYNC = 0x2000 + AT_STATX_DONT_SYNC = 0x4000 + + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 + + AT_EACCESS = 0x200 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x2000 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Sigset_t struct { + Val [16]uint64 +} + +const RNDGETENTCNT = 0x40045200 + +const PERF_IOC_FLAG_GROUP = 0x1 + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [19]uint8 + Line uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Taskstats struct { + Version uint16 + _ [2]byte + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + _ [6]byte + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]uint8 + Ac_sched uint8 + Ac_pad [3]uint8 + _ [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + _ [4]byte + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 +} + +const ( + TASKSTATS_CMD_UNSPEC = 0x0 + TASKSTATS_CMD_GET = 0x1 + TASKSTATS_CMD_NEW = 0x2 + TASKSTATS_TYPE_UNSPEC = 0x0 + TASKSTATS_TYPE_PID = 0x1 + TASKSTATS_TYPE_TGID = 0x2 + TASKSTATS_TYPE_STATS = 0x3 + TASKSTATS_TYPE_AGGR_PID = 0x4 + TASKSTATS_TYPE_AGGR_TGID = 0x5 + TASKSTATS_TYPE_NULL = 0x6 + TASKSTATS_CMD_ATTR_UNSPEC = 0x0 + TASKSTATS_CMD_ATTR_PID = 0x1 + TASKSTATS_CMD_ATTR_TGID = 0x2 + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 +) + +type CGroupStats struct { + Sleeping uint64 + Running uint64 + Stopped uint64 + Uninterruptible uint64 + Io_wait uint64 +} + +const ( + CGROUPSTATS_CMD_UNSPEC = 0x3 + CGROUPSTATS_CMD_GET = 0x4 + CGROUPSTATS_CMD_NEW = 0x5 + CGROUPSTATS_TYPE_UNSPEC = 0x0 + CGROUPSTATS_TYPE_CGROUP_STATS = 0x1 + CGROUPSTATS_CMD_ATTR_UNSPEC = 0x0 + CGROUPSTATS_CMD_ATTR_FD = 0x1 +) + +type Genlmsghdr struct { + Cmd uint8 + Version uint8 + Reserved uint16 +} + +const ( + CTRL_CMD_UNSPEC = 0x0 + CTRL_CMD_NEWFAMILY = 0x1 + CTRL_CMD_DELFAMILY = 0x2 + CTRL_CMD_GETFAMILY = 0x3 + CTRL_CMD_NEWOPS = 0x4 + CTRL_CMD_DELOPS = 0x5 + CTRL_CMD_GETOPS = 0x6 + CTRL_CMD_NEWMCAST_GRP = 0x7 + CTRL_CMD_DELMCAST_GRP = 0x8 + CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_ATTR_UNSPEC = 0x0 + CTRL_ATTR_FAMILY_ID = 0x1 + CTRL_ATTR_FAMILY_NAME = 0x2 + CTRL_ATTR_VERSION = 0x3 + CTRL_ATTR_HDRSIZE = 0x4 + CTRL_ATTR_MAXATTR = 0x5 + CTRL_ATTR_OPS = 0x6 + CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_OP_UNSPEC = 0x0 + CTRL_ATTR_OP_ID = 0x1 + CTRL_ATTR_OP_FLAGS = 0x2 + CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 + CTRL_ATTR_MCAST_GRP_NAME = 0x1 + CTRL_ATTR_MCAST_GRP_ID = 0x2 +) + +type cpuMask uint64 + +const ( + _CPU_SETSIZE = 0x400 + _NCPUBITS = 0x40 +) + +const ( + BDADDR_BREDR = 0x0 + BDADDR_LE_PUBLIC = 0x1 + BDADDR_LE_RANDOM = 0x2 +) + +type PerfEventAttr struct { + Type uint32 + Size uint32 + Config uint64 + Sample uint64 + Sample_type uint64 + Read_format uint64 + Bits uint64 + Wakeup uint32 + Bp_type uint32 + Ext1 uint64 + Ext2 uint64 + Branch_sample_type uint64 + Sample_regs_user uint64 + Sample_stack_user uint32 + Clockid int32 + Sample_regs_intr uint64 + Aux_watermark uint32 + _ uint32 +} + +type PerfEventMmapPage struct { + Version uint32 + Compat_version uint32 + Lock uint32 + Index uint32 + Offset int64 + Time_enabled uint64 + Time_running uint64 + Capabilities uint64 + Pmc_width uint16 + Time_shift uint16 + Time_mult uint32 + Time_offset uint64 + Time_zero uint64 + Size uint32 + _ [948]uint8 + Data_head uint64 + Data_tail uint64 + Data_offset uint64 + Data_size uint64 + Aux_head uint64 + Aux_tail uint64 + Aux_offset uint64 + Aux_size uint64 +} + +const ( + PerfBitDisabled uint64 = CBitFieldMaskBit0 + PerfBitInherit = CBitFieldMaskBit1 + PerfBitPinned = CBitFieldMaskBit2 + PerfBitExclusive = CBitFieldMaskBit3 + PerfBitExcludeUser = CBitFieldMaskBit4 + PerfBitExcludeKernel = CBitFieldMaskBit5 + PerfBitExcludeHv = CBitFieldMaskBit6 + PerfBitExcludeIdle = CBitFieldMaskBit7 + PerfBitMmap = CBitFieldMaskBit8 + PerfBitComm = CBitFieldMaskBit9 + PerfBitFreq = CBitFieldMaskBit10 + PerfBitInheritStat = CBitFieldMaskBit11 + PerfBitEnableOnExec = CBitFieldMaskBit12 + PerfBitTask = CBitFieldMaskBit13 + PerfBitWatermark = CBitFieldMaskBit14 + PerfBitPreciseIPBit1 = CBitFieldMaskBit15 + PerfBitPreciseIPBit2 = CBitFieldMaskBit16 + PerfBitMmapData = CBitFieldMaskBit17 + PerfBitSampleIDAll = CBitFieldMaskBit18 + PerfBitExcludeHost = CBitFieldMaskBit19 + PerfBitExcludeGuest = CBitFieldMaskBit20 + PerfBitExcludeCallchainKernel = CBitFieldMaskBit21 + PerfBitExcludeCallchainUser = CBitFieldMaskBit22 + PerfBitMmap2 = CBitFieldMaskBit23 + PerfBitCommExec = CBitFieldMaskBit24 + PerfBitUseClockID = CBitFieldMaskBit25 + PerfBitContextSwitch = CBitFieldMaskBit26 +) + +const ( + PERF_TYPE_HARDWARE = 0x0 + PERF_TYPE_SOFTWARE = 0x1 + PERF_TYPE_TRACEPOINT = 0x2 + PERF_TYPE_HW_CACHE = 0x3 + PERF_TYPE_RAW = 0x4 + PERF_TYPE_BREAKPOINT = 0x5 + + PERF_COUNT_HW_CPU_CYCLES = 0x0 + PERF_COUNT_HW_INSTRUCTIONS = 0x1 + PERF_COUNT_HW_CACHE_REFERENCES = 0x2 + PERF_COUNT_HW_CACHE_MISSES = 0x3 + PERF_COUNT_HW_BRANCH_INSTRUCTIONS = 0x4 + PERF_COUNT_HW_BRANCH_MISSES = 0x5 + PERF_COUNT_HW_BUS_CYCLES = 0x6 + PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 0x7 + PERF_COUNT_HW_STALLED_CYCLES_BACKEND = 0x8 + PERF_COUNT_HW_REF_CPU_CYCLES = 0x9 + + PERF_COUNT_HW_CACHE_L1D = 0x0 + PERF_COUNT_HW_CACHE_L1I = 0x1 + PERF_COUNT_HW_CACHE_LL = 0x2 + PERF_COUNT_HW_CACHE_DTLB = 0x3 + PERF_COUNT_HW_CACHE_ITLB = 0x4 + PERF_COUNT_HW_CACHE_BPU = 0x5 + PERF_COUNT_HW_CACHE_NODE = 0x6 + + PERF_COUNT_HW_CACHE_OP_READ = 0x0 + PERF_COUNT_HW_CACHE_OP_WRITE = 0x1 + PERF_COUNT_HW_CACHE_OP_PREFETCH = 0x2 + + PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0x0 + PERF_COUNT_HW_CACHE_RESULT_MISS = 0x1 + + PERF_COUNT_SW_CPU_CLOCK = 0x0 + PERF_COUNT_SW_TASK_CLOCK = 0x1 + PERF_COUNT_SW_PAGE_FAULTS = 0x2 + PERF_COUNT_SW_CONTEXT_SWITCHES = 0x3 + PERF_COUNT_SW_CPU_MIGRATIONS = 0x4 + PERF_COUNT_SW_PAGE_FAULTS_MIN = 0x5 + PERF_COUNT_SW_PAGE_FAULTS_MAJ = 0x6 + PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7 + PERF_COUNT_SW_EMULATION_FAULTS = 0x8 + PERF_COUNT_SW_DUMMY = 0x9 + + PERF_SAMPLE_IP = 0x1 + PERF_SAMPLE_TID = 0x2 + PERF_SAMPLE_TIME = 0x4 + PERF_SAMPLE_ADDR = 0x8 + PERF_SAMPLE_READ = 0x10 + PERF_SAMPLE_CALLCHAIN = 0x20 + PERF_SAMPLE_ID = 0x40 + PERF_SAMPLE_CPU = 0x80 + PERF_SAMPLE_PERIOD = 0x100 + PERF_SAMPLE_STREAM_ID = 0x200 + PERF_SAMPLE_RAW = 0x400 + PERF_SAMPLE_BRANCH_STACK = 0x800 + + PERF_SAMPLE_BRANCH_USER = 0x1 + PERF_SAMPLE_BRANCH_KERNEL = 0x2 + PERF_SAMPLE_BRANCH_HV = 0x4 + PERF_SAMPLE_BRANCH_ANY = 0x8 + PERF_SAMPLE_BRANCH_ANY_CALL = 0x10 + PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20 + PERF_SAMPLE_BRANCH_IND_CALL = 0x40 + + PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1 + PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2 + PERF_FORMAT_ID = 0x4 + PERF_FORMAT_GROUP = 0x8 + + PERF_RECORD_MMAP = 0x1 + PERF_RECORD_LOST = 0x2 + PERF_RECORD_COMM = 0x3 + PERF_RECORD_EXIT = 0x4 + PERF_RECORD_THROTTLE = 0x5 + PERF_RECORD_UNTHROTTLE = 0x6 + PERF_RECORD_FORK = 0x7 + PERF_RECORD_READ = 0x8 + PERF_RECORD_SAMPLE = 0x9 + + PERF_CONTEXT_HV = -0x20 + PERF_CONTEXT_KERNEL = -0x80 + PERF_CONTEXT_USER = -0x200 + + PERF_CONTEXT_GUEST = -0x800 + PERF_CONTEXT_GUEST_KERNEL = -0x880 + PERF_CONTEXT_GUEST_USER = -0xa00 + + PERF_FLAG_FD_NO_GROUP = 0x1 + PERF_FLAG_FD_OUTPUT = 0x2 + PERF_FLAG_PID_CGROUP = 0x4 +) + +const ( + CBitFieldMaskBit0 = 0x8000000000000000 + CBitFieldMaskBit1 = 0x4000000000000000 + CBitFieldMaskBit2 = 0x2000000000000000 + CBitFieldMaskBit3 = 0x1000000000000000 + CBitFieldMaskBit4 = 0x800000000000000 + CBitFieldMaskBit5 = 0x400000000000000 + CBitFieldMaskBit6 = 0x200000000000000 + CBitFieldMaskBit7 = 0x100000000000000 + CBitFieldMaskBit8 = 0x80000000000000 + CBitFieldMaskBit9 = 0x40000000000000 + CBitFieldMaskBit10 = 0x20000000000000 + CBitFieldMaskBit11 = 0x10000000000000 + CBitFieldMaskBit12 = 0x8000000000000 + CBitFieldMaskBit13 = 0x4000000000000 + CBitFieldMaskBit14 = 0x2000000000000 + CBitFieldMaskBit15 = 0x1000000000000 + CBitFieldMaskBit16 = 0x800000000000 + CBitFieldMaskBit17 = 0x400000000000 + CBitFieldMaskBit18 = 0x200000000000 + CBitFieldMaskBit19 = 0x100000000000 + CBitFieldMaskBit20 = 0x80000000000 + CBitFieldMaskBit21 = 0x40000000000 + CBitFieldMaskBit22 = 0x20000000000 + CBitFieldMaskBit23 = 0x10000000000 + CBitFieldMaskBit24 = 0x8000000000 + CBitFieldMaskBit25 = 0x4000000000 + CBitFieldMaskBit26 = 0x2000000000 + CBitFieldMaskBit27 = 0x1000000000 + CBitFieldMaskBit28 = 0x800000000 + CBitFieldMaskBit29 = 0x400000000 + CBitFieldMaskBit30 = 0x200000000 + CBitFieldMaskBit31 = 0x100000000 + CBitFieldMaskBit32 = 0x80000000 + CBitFieldMaskBit33 = 0x40000000 + CBitFieldMaskBit34 = 0x20000000 + CBitFieldMaskBit35 = 0x10000000 + CBitFieldMaskBit36 = 0x8000000 + CBitFieldMaskBit37 = 0x4000000 + CBitFieldMaskBit38 = 0x2000000 + CBitFieldMaskBit39 = 0x1000000 + CBitFieldMaskBit40 = 0x800000 + CBitFieldMaskBit41 = 0x400000 + CBitFieldMaskBit42 = 0x200000 + CBitFieldMaskBit43 = 0x100000 + CBitFieldMaskBit44 = 0x80000 + CBitFieldMaskBit45 = 0x40000 + CBitFieldMaskBit46 = 0x20000 + CBitFieldMaskBit47 = 0x10000 + CBitFieldMaskBit48 = 0x8000 + CBitFieldMaskBit49 = 0x4000 + CBitFieldMaskBit50 = 0x2000 + CBitFieldMaskBit51 = 0x1000 + CBitFieldMaskBit52 = 0x800 + CBitFieldMaskBit53 = 0x400 + CBitFieldMaskBit54 = 0x200 + CBitFieldMaskBit55 = 0x100 + CBitFieldMaskBit56 = 0x80 + CBitFieldMaskBit57 = 0x40 + CBitFieldMaskBit58 = 0x20 + CBitFieldMaskBit59 = 0x10 + CBitFieldMaskBit60 = 0x8 + CBitFieldMaskBit61 = 0x4 + CBitFieldMaskBit62 = 0x2 + CBitFieldMaskBit63 = 0x1 +) + +type SockaddrStorage struct { + Family uint16 + _ [118]uint8 + _ uint64 +} + +type TCPMD5Sig struct { + Addr SockaddrStorage + Flags uint8 + Prefixlen uint8 + Keylen uint16 + _ uint32 + Key [80]uint8 +} + +type HDDriveCmdHdr struct { + Command uint8 + Number uint8 + Feature uint8 + Count uint8 +} + +type HDGeometry struct { + Heads uint8 + Sectors uint8 + Cylinders uint16 + _ [4]byte + Start uint64 +} + +type HDDriveID struct { + Config uint16 + Cyls uint16 + Reserved2 uint16 + Heads uint16 + Track_bytes uint16 + Sector_bytes uint16 + Sectors uint16 + Vendor0 uint16 + Vendor1 uint16 + Vendor2 uint16 + Serial_no [20]uint8 + Buf_type uint16 + Buf_size uint16 + Ecc_bytes uint16 + Fw_rev [8]uint8 + Model [40]uint8 + Max_multsect uint8 + Vendor3 uint8 + Dword_io uint16 + Vendor4 uint8 + Capability uint8 + Reserved50 uint16 + Vendor5 uint8 + TPIO uint8 + Vendor6 uint8 + TDMA uint8 + Field_valid uint16 + Cur_cyls uint16 + Cur_heads uint16 + Cur_sectors uint16 + Cur_capacity0 uint16 + Cur_capacity1 uint16 + Multsect uint8 + Multsect_valid uint8 + Lba_capacity uint32 + Dma_1word uint16 + Dma_mword uint16 + Eide_pio_modes uint16 + Eide_dma_min uint16 + Eide_dma_time uint16 + Eide_pio uint16 + Eide_pio_iordy uint16 + Words69_70 [2]uint16 + Words71_74 [4]uint16 + Queue_depth uint16 + Words76_79 [4]uint16 + Major_rev_num uint16 + Minor_rev_num uint16 + Command_set_1 uint16 + Command_set_2 uint16 + Cfsse uint16 + Cfs_enable_1 uint16 + Cfs_enable_2 uint16 + Csf_default uint16 + Dma_ultra uint16 + Trseuc uint16 + TrsEuc uint16 + CurAPMvalues uint16 + Mprc uint16 + Hw_config uint16 + Acoustic uint16 + Msrqs uint16 + Sxfert uint16 + Sal uint16 + Spg uint32 + Lba_capacity_2 uint64 + Words104_125 [22]uint16 + Last_lun uint16 + Word127 uint16 + Dlf uint16 + Csfo uint16 + Words130_155 [26]uint16 + Word156 uint16 + Words157_159 [3]uint16 + Cfa_power uint16 + Words161_175 [15]uint16 + Words176_205 [30]uint16 + Words206_254 [49]uint16 + Integrity_word uint16 +} + +type Statfs_t struct { + Type int64 + Bsize int64 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Namelen int64 + Frsize int64 + Flags int64 + Spare [4]int64 +} + +const ( + ST_MANDLOCK = 0x40 + ST_NOATIME = 0x400 + ST_NODEV = 0x4 + ST_NODIRATIME = 0x800 + ST_NOEXEC = 0x8 + ST_NOSUID = 0x2 + ST_RDONLY = 0x1 + ST_RELATIME = 0x1000 + ST_SYNCHRONOUS = 0x10 +) + +type TpacketHdr struct { + Status uint64 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Sec uint32 + Usec uint32 + _ [4]byte +} + +type Tpacket2Hdr struct { + Status uint32 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Sec uint32 + Nsec uint32 + Vlan_tci uint16 + Vlan_tpid uint16 + _ [4]uint8 +} + +type Tpacket3Hdr struct { + Next_offset uint32 + Sec uint32 + Nsec uint32 + Snaplen uint32 + Len uint32 + Status uint32 + Mac uint16 + Net uint16 + Hv1 TpacketHdrVariant1 + _ [8]uint8 +} + +type TpacketHdrVariant1 struct { + Rxhash uint32 + Vlan_tci uint32 + Vlan_tpid uint16 + _ uint16 +} + +type TpacketBlockDesc struct { + Version uint32 + To_priv uint32 + Hdr [40]byte +} + +type TpacketReq struct { + Block_size uint32 + Block_nr uint32 + Frame_size uint32 + Frame_nr uint32 +} + +type TpacketReq3 struct { + Block_size uint32 + Block_nr uint32 + Frame_size uint32 + Frame_nr uint32 + Retire_blk_tov uint32 + Sizeof_priv uint32 + Feature_req_word uint32 +} + +type TpacketStats struct { + Packets uint32 + Drops uint32 +} + +type TpacketStatsV3 struct { + Packets uint32 + Drops uint32 + Freeze_q_cnt uint32 +} + +type TpacketAuxdata struct { + Status uint32 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Vlan_tci uint16 + Vlan_tpid uint16 +} + +const ( + TPACKET_V1 = 0x0 + TPACKET_V2 = 0x1 + TPACKET_V3 = 0x2 +) + +const ( + SizeofTpacketHdr = 0x20 + SizeofTpacket2Hdr = 0x20 + SizeofTpacket3Hdr = 0x30 +) + +const ( + NF_INET_PRE_ROUTING = 0x0 + NF_INET_LOCAL_IN = 0x1 + NF_INET_FORWARD = 0x2 + NF_INET_LOCAL_OUT = 0x3 + NF_INET_POST_ROUTING = 0x4 + NF_INET_NUMHOOKS = 0x5 +) + +const ( + NF_NETDEV_INGRESS = 0x0 + NF_NETDEV_NUMHOOKS = 0x1 +) + +const ( + NFPROTO_UNSPEC = 0x0 + NFPROTO_INET = 0x1 + NFPROTO_IPV4 = 0x2 + NFPROTO_ARP = 0x3 + NFPROTO_NETDEV = 0x5 + NFPROTO_BRIDGE = 0x7 + NFPROTO_IPV6 = 0xa + NFPROTO_DECNET = 0xc + NFPROTO_NUMPROTO = 0xd +) + +type Nfgenmsg struct { + Nfgen_family uint8 + Version uint8 + Res_id uint16 +} + +const ( + NFNL_BATCH_UNSPEC = 0x0 + NFNL_BATCH_GENID = 0x1 +) + +const ( + NFT_REG_VERDICT = 0x0 + NFT_REG_1 = 0x1 + NFT_REG_2 = 0x2 + NFT_REG_3 = 0x3 + NFT_REG_4 = 0x4 + NFT_REG32_00 = 0x8 + NFT_REG32_01 = 0x9 + NFT_REG32_02 = 0xa + NFT_REG32_03 = 0xb + NFT_REG32_04 = 0xc + NFT_REG32_05 = 0xd + NFT_REG32_06 = 0xe + NFT_REG32_07 = 0xf + NFT_REG32_08 = 0x10 + NFT_REG32_09 = 0x11 + NFT_REG32_10 = 0x12 + NFT_REG32_11 = 0x13 + NFT_REG32_12 = 0x14 + NFT_REG32_13 = 0x15 + NFT_REG32_14 = 0x16 + NFT_REG32_15 = 0x17 + NFT_CONTINUE = -0x1 + NFT_BREAK = -0x2 + NFT_JUMP = -0x3 + NFT_GOTO = -0x4 + NFT_RETURN = -0x5 + NFT_MSG_NEWTABLE = 0x0 + NFT_MSG_GETTABLE = 0x1 + NFT_MSG_DELTABLE = 0x2 + NFT_MSG_NEWCHAIN = 0x3 + NFT_MSG_GETCHAIN = 0x4 + NFT_MSG_DELCHAIN = 0x5 + NFT_MSG_NEWRULE = 0x6 + NFT_MSG_GETRULE = 0x7 + NFT_MSG_DELRULE = 0x8 + NFT_MSG_NEWSET = 0x9 + NFT_MSG_GETSET = 0xa + NFT_MSG_DELSET = 0xb + NFT_MSG_NEWSETELEM = 0xc + NFT_MSG_GETSETELEM = 0xd + NFT_MSG_DELSETELEM = 0xe + NFT_MSG_NEWGEN = 0xf + NFT_MSG_GETGEN = 0x10 + NFT_MSG_TRACE = 0x11 + NFT_MSG_NEWOBJ = 0x12 + NFT_MSG_GETOBJ = 0x13 + NFT_MSG_DELOBJ = 0x14 + NFT_MSG_GETOBJ_RESET = 0x15 + NFT_MSG_MAX = 0x19 + NFTA_LIST_UNPEC = 0x0 + NFTA_LIST_ELEM = 0x1 + NFTA_HOOK_UNSPEC = 0x0 + NFTA_HOOK_HOOKNUM = 0x1 + NFTA_HOOK_PRIORITY = 0x2 + NFTA_HOOK_DEV = 0x3 + NFT_TABLE_F_DORMANT = 0x1 + NFTA_TABLE_UNSPEC = 0x0 + NFTA_TABLE_NAME = 0x1 + NFTA_TABLE_FLAGS = 0x2 + NFTA_TABLE_USE = 0x3 + NFTA_CHAIN_UNSPEC = 0x0 + NFTA_CHAIN_TABLE = 0x1 + NFTA_CHAIN_HANDLE = 0x2 + NFTA_CHAIN_NAME = 0x3 + NFTA_CHAIN_HOOK = 0x4 + NFTA_CHAIN_POLICY = 0x5 + NFTA_CHAIN_USE = 0x6 + NFTA_CHAIN_TYPE = 0x7 + NFTA_CHAIN_COUNTERS = 0x8 + NFTA_CHAIN_PAD = 0x9 + NFTA_RULE_UNSPEC = 0x0 + NFTA_RULE_TABLE = 0x1 + NFTA_RULE_CHAIN = 0x2 + NFTA_RULE_HANDLE = 0x3 + NFTA_RULE_EXPRESSIONS = 0x4 + NFTA_RULE_COMPAT = 0x5 + NFTA_RULE_POSITION = 0x6 + NFTA_RULE_USERDATA = 0x7 + NFTA_RULE_PAD = 0x8 + NFTA_RULE_ID = 0x9 + NFT_RULE_COMPAT_F_INV = 0x2 + NFT_RULE_COMPAT_F_MASK = 0x2 + NFTA_RULE_COMPAT_UNSPEC = 0x0 + NFTA_RULE_COMPAT_PROTO = 0x1 + NFTA_RULE_COMPAT_FLAGS = 0x2 + NFT_SET_ANONYMOUS = 0x1 + NFT_SET_CONSTANT = 0x2 + NFT_SET_INTERVAL = 0x4 + NFT_SET_MAP = 0x8 + NFT_SET_TIMEOUT = 0x10 + NFT_SET_EVAL = 0x20 + NFT_SET_OBJECT = 0x40 + NFT_SET_POL_PERFORMANCE = 0x0 + NFT_SET_POL_MEMORY = 0x1 + NFTA_SET_DESC_UNSPEC = 0x0 + NFTA_SET_DESC_SIZE = 0x1 + NFTA_SET_UNSPEC = 0x0 + NFTA_SET_TABLE = 0x1 + NFTA_SET_NAME = 0x2 + NFTA_SET_FLAGS = 0x3 + NFTA_SET_KEY_TYPE = 0x4 + NFTA_SET_KEY_LEN = 0x5 + NFTA_SET_DATA_TYPE = 0x6 + NFTA_SET_DATA_LEN = 0x7 + NFTA_SET_POLICY = 0x8 + NFTA_SET_DESC = 0x9 + NFTA_SET_ID = 0xa + NFTA_SET_TIMEOUT = 0xb + NFTA_SET_GC_INTERVAL = 0xc + NFTA_SET_USERDATA = 0xd + NFTA_SET_PAD = 0xe + NFTA_SET_OBJ_TYPE = 0xf + NFT_SET_ELEM_INTERVAL_END = 0x1 + NFTA_SET_ELEM_UNSPEC = 0x0 + NFTA_SET_ELEM_KEY = 0x1 + NFTA_SET_ELEM_DATA = 0x2 + NFTA_SET_ELEM_FLAGS = 0x3 + NFTA_SET_ELEM_TIMEOUT = 0x4 + NFTA_SET_ELEM_EXPIRATION = 0x5 + NFTA_SET_ELEM_USERDATA = 0x6 + NFTA_SET_ELEM_EXPR = 0x7 + NFTA_SET_ELEM_PAD = 0x8 + NFTA_SET_ELEM_OBJREF = 0x9 + NFTA_SET_ELEM_LIST_UNSPEC = 0x0 + NFTA_SET_ELEM_LIST_TABLE = 0x1 + NFTA_SET_ELEM_LIST_SET = 0x2 + NFTA_SET_ELEM_LIST_ELEMENTS = 0x3 + NFTA_SET_ELEM_LIST_SET_ID = 0x4 + NFT_DATA_VALUE = 0x0 + NFT_DATA_VERDICT = 0xffffff00 + NFTA_DATA_UNSPEC = 0x0 + NFTA_DATA_VALUE = 0x1 + NFTA_DATA_VERDICT = 0x2 + NFTA_VERDICT_UNSPEC = 0x0 + NFTA_VERDICT_CODE = 0x1 + NFTA_VERDICT_CHAIN = 0x2 + NFTA_EXPR_UNSPEC = 0x0 + NFTA_EXPR_NAME = 0x1 + NFTA_EXPR_DATA = 0x2 + NFTA_IMMEDIATE_UNSPEC = 0x0 + NFTA_IMMEDIATE_DREG = 0x1 + NFTA_IMMEDIATE_DATA = 0x2 + NFTA_BITWISE_UNSPEC = 0x0 + NFTA_BITWISE_SREG = 0x1 + NFTA_BITWISE_DREG = 0x2 + NFTA_BITWISE_LEN = 0x3 + NFTA_BITWISE_MASK = 0x4 + NFTA_BITWISE_XOR = 0x5 + NFT_BYTEORDER_NTOH = 0x0 + NFT_BYTEORDER_HTON = 0x1 + NFTA_BYTEORDER_UNSPEC = 0x0 + NFTA_BYTEORDER_SREG = 0x1 + NFTA_BYTEORDER_DREG = 0x2 + NFTA_BYTEORDER_OP = 0x3 + NFTA_BYTEORDER_LEN = 0x4 + NFTA_BYTEORDER_SIZE = 0x5 + NFT_CMP_EQ = 0x0 + NFT_CMP_NEQ = 0x1 + NFT_CMP_LT = 0x2 + NFT_CMP_LTE = 0x3 + NFT_CMP_GT = 0x4 + NFT_CMP_GTE = 0x5 + NFTA_CMP_UNSPEC = 0x0 + NFTA_CMP_SREG = 0x1 + NFTA_CMP_OP = 0x2 + NFTA_CMP_DATA = 0x3 + NFT_RANGE_EQ = 0x0 + NFT_RANGE_NEQ = 0x1 + NFTA_RANGE_UNSPEC = 0x0 + NFTA_RANGE_SREG = 0x1 + NFTA_RANGE_OP = 0x2 + NFTA_RANGE_FROM_DATA = 0x3 + NFTA_RANGE_TO_DATA = 0x4 + NFT_LOOKUP_F_INV = 0x1 + NFTA_LOOKUP_UNSPEC = 0x0 + NFTA_LOOKUP_SET = 0x1 + NFTA_LOOKUP_SREG = 0x2 + NFTA_LOOKUP_DREG = 0x3 + NFTA_LOOKUP_SET_ID = 0x4 + NFTA_LOOKUP_FLAGS = 0x5 + NFT_DYNSET_OP_ADD = 0x0 + NFT_DYNSET_OP_UPDATE = 0x1 + NFT_DYNSET_F_INV = 0x1 + NFTA_DYNSET_UNSPEC = 0x0 + NFTA_DYNSET_SET_NAME = 0x1 + NFTA_DYNSET_SET_ID = 0x2 + NFTA_DYNSET_OP = 0x3 + NFTA_DYNSET_SREG_KEY = 0x4 + NFTA_DYNSET_SREG_DATA = 0x5 + NFTA_DYNSET_TIMEOUT = 0x6 + NFTA_DYNSET_EXPR = 0x7 + NFTA_DYNSET_PAD = 0x8 + NFTA_DYNSET_FLAGS = 0x9 + NFT_PAYLOAD_LL_HEADER = 0x0 + NFT_PAYLOAD_NETWORK_HEADER = 0x1 + NFT_PAYLOAD_TRANSPORT_HEADER = 0x2 + NFT_PAYLOAD_CSUM_NONE = 0x0 + NFT_PAYLOAD_CSUM_INET = 0x1 + NFT_PAYLOAD_L4CSUM_PSEUDOHDR = 0x1 + NFTA_PAYLOAD_UNSPEC = 0x0 + NFTA_PAYLOAD_DREG = 0x1 + NFTA_PAYLOAD_BASE = 0x2 + NFTA_PAYLOAD_OFFSET = 0x3 + NFTA_PAYLOAD_LEN = 0x4 + NFTA_PAYLOAD_SREG = 0x5 + NFTA_PAYLOAD_CSUM_TYPE = 0x6 + NFTA_PAYLOAD_CSUM_OFFSET = 0x7 + NFTA_PAYLOAD_CSUM_FLAGS = 0x8 + NFT_EXTHDR_F_PRESENT = 0x1 + NFT_EXTHDR_OP_IPV6 = 0x0 + NFT_EXTHDR_OP_TCPOPT = 0x1 + NFTA_EXTHDR_UNSPEC = 0x0 + NFTA_EXTHDR_DREG = 0x1 + NFTA_EXTHDR_TYPE = 0x2 + NFTA_EXTHDR_OFFSET = 0x3 + NFTA_EXTHDR_LEN = 0x4 + NFTA_EXTHDR_FLAGS = 0x5 + NFTA_EXTHDR_OP = 0x6 + NFTA_EXTHDR_SREG = 0x7 + NFT_META_LEN = 0x0 + NFT_META_PROTOCOL = 0x1 + NFT_META_PRIORITY = 0x2 + NFT_META_MARK = 0x3 + NFT_META_IIF = 0x4 + NFT_META_OIF = 0x5 + NFT_META_IIFNAME = 0x6 + NFT_META_OIFNAME = 0x7 + NFT_META_IIFTYPE = 0x8 + NFT_META_OIFTYPE = 0x9 + NFT_META_SKUID = 0xa + NFT_META_SKGID = 0xb + NFT_META_NFTRACE = 0xc + NFT_META_RTCLASSID = 0xd + NFT_META_SECMARK = 0xe + NFT_META_NFPROTO = 0xf + NFT_META_L4PROTO = 0x10 + NFT_META_BRI_IIFNAME = 0x11 + NFT_META_BRI_OIFNAME = 0x12 + NFT_META_PKTTYPE = 0x13 + NFT_META_CPU = 0x14 + NFT_META_IIFGROUP = 0x15 + NFT_META_OIFGROUP = 0x16 + NFT_META_CGROUP = 0x17 + NFT_META_PRANDOM = 0x18 + NFT_RT_CLASSID = 0x0 + NFT_RT_NEXTHOP4 = 0x1 + NFT_RT_NEXTHOP6 = 0x2 + NFT_RT_TCPMSS = 0x3 + NFT_HASH_JENKINS = 0x0 + NFT_HASH_SYM = 0x1 + NFTA_HASH_UNSPEC = 0x0 + NFTA_HASH_SREG = 0x1 + NFTA_HASH_DREG = 0x2 + NFTA_HASH_LEN = 0x3 + NFTA_HASH_MODULUS = 0x4 + NFTA_HASH_SEED = 0x5 + NFTA_HASH_OFFSET = 0x6 + NFTA_HASH_TYPE = 0x7 + NFTA_META_UNSPEC = 0x0 + NFTA_META_DREG = 0x1 + NFTA_META_KEY = 0x2 + NFTA_META_SREG = 0x3 + NFTA_RT_UNSPEC = 0x0 + NFTA_RT_DREG = 0x1 + NFTA_RT_KEY = 0x2 + NFT_CT_STATE = 0x0 + NFT_CT_DIRECTION = 0x1 + NFT_CT_STATUS = 0x2 + NFT_CT_MARK = 0x3 + NFT_CT_SECMARK = 0x4 + NFT_CT_EXPIRATION = 0x5 + NFT_CT_HELPER = 0x6 + NFT_CT_L3PROTOCOL = 0x7 + NFT_CT_SRC = 0x8 + NFT_CT_DST = 0x9 + NFT_CT_PROTOCOL = 0xa + NFT_CT_PROTO_SRC = 0xb + NFT_CT_PROTO_DST = 0xc + NFT_CT_LABELS = 0xd + NFT_CT_PKTS = 0xe + NFT_CT_BYTES = 0xf + NFT_CT_AVGPKT = 0x10 + NFT_CT_ZONE = 0x11 + NFT_CT_EVENTMASK = 0x12 + NFTA_CT_UNSPEC = 0x0 + NFTA_CT_DREG = 0x1 + NFTA_CT_KEY = 0x2 + NFTA_CT_DIRECTION = 0x3 + NFTA_CT_SREG = 0x4 + NFT_LIMIT_PKTS = 0x0 + NFT_LIMIT_PKT_BYTES = 0x1 + NFT_LIMIT_F_INV = 0x1 + NFTA_LIMIT_UNSPEC = 0x0 + NFTA_LIMIT_RATE = 0x1 + NFTA_LIMIT_UNIT = 0x2 + NFTA_LIMIT_BURST = 0x3 + NFTA_LIMIT_TYPE = 0x4 + NFTA_LIMIT_FLAGS = 0x5 + NFTA_LIMIT_PAD = 0x6 + NFTA_COUNTER_UNSPEC = 0x0 + NFTA_COUNTER_BYTES = 0x1 + NFTA_COUNTER_PACKETS = 0x2 + NFTA_COUNTER_PAD = 0x3 + NFTA_LOG_UNSPEC = 0x0 + NFTA_LOG_GROUP = 0x1 + NFTA_LOG_PREFIX = 0x2 + NFTA_LOG_SNAPLEN = 0x3 + NFTA_LOG_QTHRESHOLD = 0x4 + NFTA_LOG_LEVEL = 0x5 + NFTA_LOG_FLAGS = 0x6 + NFTA_QUEUE_UNSPEC = 0x0 + NFTA_QUEUE_NUM = 0x1 + NFTA_QUEUE_TOTAL = 0x2 + NFTA_QUEUE_FLAGS = 0x3 + NFTA_QUEUE_SREG_QNUM = 0x4 + NFT_QUOTA_F_INV = 0x1 + NFT_QUOTA_F_DEPLETED = 0x2 + NFTA_QUOTA_UNSPEC = 0x0 + NFTA_QUOTA_BYTES = 0x1 + NFTA_QUOTA_FLAGS = 0x2 + NFTA_QUOTA_PAD = 0x3 + NFTA_QUOTA_CONSUMED = 0x4 + NFT_REJECT_ICMP_UNREACH = 0x0 + NFT_REJECT_TCP_RST = 0x1 + NFT_REJECT_ICMPX_UNREACH = 0x2 + NFT_REJECT_ICMPX_NO_ROUTE = 0x0 + NFT_REJECT_ICMPX_PORT_UNREACH = 0x1 + NFT_REJECT_ICMPX_HOST_UNREACH = 0x2 + NFT_REJECT_ICMPX_ADMIN_PROHIBITED = 0x3 + NFTA_REJECT_UNSPEC = 0x0 + NFTA_REJECT_TYPE = 0x1 + NFTA_REJECT_ICMP_CODE = 0x2 + NFT_NAT_SNAT = 0x0 + NFT_NAT_DNAT = 0x1 + NFTA_NAT_UNSPEC = 0x0 + NFTA_NAT_TYPE = 0x1 + NFTA_NAT_FAMILY = 0x2 + NFTA_NAT_REG_ADDR_MIN = 0x3 + NFTA_NAT_REG_ADDR_MAX = 0x4 + NFTA_NAT_REG_PROTO_MIN = 0x5 + NFTA_NAT_REG_PROTO_MAX = 0x6 + NFTA_NAT_FLAGS = 0x7 + NFTA_MASQ_UNSPEC = 0x0 + NFTA_MASQ_FLAGS = 0x1 + NFTA_MASQ_REG_PROTO_MIN = 0x2 + NFTA_MASQ_REG_PROTO_MAX = 0x3 + NFTA_REDIR_UNSPEC = 0x0 + NFTA_REDIR_REG_PROTO_MIN = 0x1 + NFTA_REDIR_REG_PROTO_MAX = 0x2 + NFTA_REDIR_FLAGS = 0x3 + NFTA_DUP_UNSPEC = 0x0 + NFTA_DUP_SREG_ADDR = 0x1 + NFTA_DUP_SREG_DEV = 0x2 + NFTA_FWD_UNSPEC = 0x0 + NFTA_FWD_SREG_DEV = 0x1 + NFTA_OBJREF_UNSPEC = 0x0 + NFTA_OBJREF_IMM_TYPE = 0x1 + NFTA_OBJREF_IMM_NAME = 0x2 + NFTA_OBJREF_SET_SREG = 0x3 + NFTA_OBJREF_SET_NAME = 0x4 + NFTA_OBJREF_SET_ID = 0x5 + NFTA_GEN_UNSPEC = 0x0 + NFTA_GEN_ID = 0x1 + NFTA_GEN_PROC_PID = 0x2 + NFTA_GEN_PROC_NAME = 0x3 + NFTA_FIB_UNSPEC = 0x0 + NFTA_FIB_DREG = 0x1 + NFTA_FIB_RESULT = 0x2 + NFTA_FIB_FLAGS = 0x3 + NFT_FIB_RESULT_UNSPEC = 0x0 + NFT_FIB_RESULT_OIF = 0x1 + NFT_FIB_RESULT_OIFNAME = 0x2 + NFT_FIB_RESULT_ADDRTYPE = 0x3 + NFTA_FIB_F_SADDR = 0x1 + NFTA_FIB_F_DADDR = 0x2 + NFTA_FIB_F_MARK = 0x4 + NFTA_FIB_F_IIF = 0x8 + NFTA_FIB_F_OIF = 0x10 + NFTA_FIB_F_PRESENT = 0x20 + NFTA_CT_HELPER_UNSPEC = 0x0 + NFTA_CT_HELPER_NAME = 0x1 + NFTA_CT_HELPER_L3PROTO = 0x2 + NFTA_CT_HELPER_L4PROTO = 0x3 + NFTA_OBJ_UNSPEC = 0x0 + NFTA_OBJ_TABLE = 0x1 + NFTA_OBJ_NAME = 0x2 + NFTA_OBJ_TYPE = 0x3 + NFTA_OBJ_DATA = 0x4 + NFTA_OBJ_USE = 0x5 + NFTA_TRACE_UNSPEC = 0x0 + NFTA_TRACE_TABLE = 0x1 + NFTA_TRACE_CHAIN = 0x2 + NFTA_TRACE_RULE_HANDLE = 0x3 + NFTA_TRACE_TYPE = 0x4 + NFTA_TRACE_VERDICT = 0x5 + NFTA_TRACE_ID = 0x6 + NFTA_TRACE_LL_HEADER = 0x7 + NFTA_TRACE_NETWORK_HEADER = 0x8 + NFTA_TRACE_TRANSPORT_HEADER = 0x9 + NFTA_TRACE_IIF = 0xa + NFTA_TRACE_IIFTYPE = 0xb + NFTA_TRACE_OIF = 0xc + NFTA_TRACE_OIFTYPE = 0xd + NFTA_TRACE_MARK = 0xe + NFTA_TRACE_NFPROTO = 0xf + NFTA_TRACE_POLICY = 0x10 + NFTA_TRACE_PAD = 0x11 + NFT_TRACETYPE_UNSPEC = 0x0 + NFT_TRACETYPE_POLICY = 0x1 + NFT_TRACETYPE_RETURN = 0x2 + NFT_TRACETYPE_RULE = 0x3 + NFTA_NG_UNSPEC = 0x0 + NFTA_NG_DREG = 0x1 + NFTA_NG_MODULUS = 0x2 + NFTA_NG_TYPE = 0x3 + NFTA_NG_OFFSET = 0x4 + NFT_NG_INCREMENTAL = 0x0 + NFT_NG_RANDOM = 0x1 +) + +type RTCTime struct { + Sec int32 + Min int32 + Hour int32 + Mday int32 + Mon int32 + Year int32 + Wday int32 + Yday int32 + Isdst int32 +} + +type RTCWkAlrm struct { + Enabled uint8 + Pending uint8 + _ [2]byte + Time RTCTime +} + +type RTCPLLInfo struct { + Ctrl int32 + Value int32 + Max int32 + Min int32 + Posmult int32 + Negmult int32 + Clock int64 +} + +type BlkpgIoctlArg struct { + Op int32 + Flags int32 + Datalen int32 + _ [4]byte + Data *byte +} + +type BlkpgPartition struct { + Start int64 + Length int64 + Pno int32 + Devname [64]uint8 + Volname [64]uint8 + _ [4]byte +} + +const ( + BLKPG = 0x20001269 + BLKPG_ADD_PARTITION = 0x1 + BLKPG_DEL_PARTITION = 0x2 + BLKPG_RESIZE_PARTITION = 0x3 +) + +const ( + NETNSA_NONE = 0x0 + NETNSA_NSID = 0x1 + NETNSA_PID = 0x2 + NETNSA_FD = 0x3 +) + +type XDPRingOffset struct { + Producer uint64 + Consumer uint64 + Desc uint64 +} + +type XDPMmapOffsets struct { + Rx XDPRingOffset + Tx XDPRingOffset + Fr XDPRingOffset + Cr XDPRingOffset +} + +type XDPUmemReg struct { + Addr uint64 + Len uint64 + Size uint32 + Headroom uint32 +} + +type XDPStatistics struct { + Rx_dropped uint64 + Rx_invalid_descs uint64 + Tx_invalid_descs uint64 +} + +type XDPDesc struct { + Addr uint64 + Len uint32 + Options uint32 +} + +const ( + NCSI_CMD_UNSPEC = 0x0 + NCSI_CMD_PKG_INFO = 0x1 + NCSI_CMD_SET_INTERFACE = 0x2 + NCSI_CMD_CLEAR_INTERFACE = 0x3 + NCSI_ATTR_UNSPEC = 0x0 + NCSI_ATTR_IFINDEX = 0x1 + NCSI_ATTR_PACKAGE_LIST = 0x2 + NCSI_ATTR_PACKAGE_ID = 0x3 + NCSI_ATTR_CHANNEL_ID = 0x4 + NCSI_PKG_ATTR_UNSPEC = 0x0 + NCSI_PKG_ATTR = 0x1 + NCSI_PKG_ATTR_ID = 0x2 + NCSI_PKG_ATTR_FORCED = 0x3 + NCSI_PKG_ATTR_CHANNEL_LIST = 0x4 + NCSI_CHANNEL_ATTR_UNSPEC = 0x0 + NCSI_CHANNEL_ATTR = 0x1 + NCSI_CHANNEL_ATTR_ID = 0x2 + NCSI_CHANNEL_ATTR_VERSION_MAJOR = 0x3 + NCSI_CHANNEL_ATTR_VERSION_MINOR = 0x4 + NCSI_CHANNEL_ATTR_VERSION_STR = 0x5 + NCSI_CHANNEL_ATTR_LINK_STATE = 0x6 + NCSI_CHANNEL_ATTR_ACTIVE = 0x7 + NCSI_CHANNEL_ATTR_FORCED = 0x8 + NCSI_CHANNEL_ATTR_VLAN_LIST = 0x9 + NCSI_CHANNEL_ATTR_VLAN_ID = 0xa +) + +const ( + SOF_TIMESTAMPING_TX_HARDWARE = 0x1 + SOF_TIMESTAMPING_TX_SOFTWARE = 0x2 + SOF_TIMESTAMPING_RX_HARDWARE = 0x4 + SOF_TIMESTAMPING_RX_SOFTWARE = 0x8 + SOF_TIMESTAMPING_SOFTWARE = 0x10 + SOF_TIMESTAMPING_SYS_HARDWARE = 0x20 + SOF_TIMESTAMPING_RAW_HARDWARE = 0x40 + SOF_TIMESTAMPING_OPT_ID = 0x80 + SOF_TIMESTAMPING_TX_SCHED = 0x100 + SOF_TIMESTAMPING_TX_ACK = 0x200 + SOF_TIMESTAMPING_OPT_CMSG = 0x400 + SOF_TIMESTAMPING_OPT_TSONLY = 0x800 + SOF_TIMESTAMPING_OPT_STATS = 0x1000 + SOF_TIMESTAMPING_OPT_PKTINFO = 0x2000 + SOF_TIMESTAMPING_OPT_TX_SWHW = 0x4000 + + SOF_TIMESTAMPING_LAST = 0x4000 + SOF_TIMESTAMPING_MASK = 0x7fff +) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go new file mode 100644 index 00000000..6ee799ce --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go @@ -0,0 +1,1999 @@ +// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build ppc64le,linux + +package unix + +const ( + SizeofPtr = 0x8 + SizeofShort = 0x2 + SizeofInt = 0x4 + SizeofLong = 0x8 + SizeofLongLong = 0x8 + PathMax = 0x1000 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Timex struct { + Modes uint32 + _ [4]byte + Offset int64 + Freq int64 + Maxerror int64 + Esterror int64 + Status int32 + _ [4]byte + Constant int64 + Precision int64 + Tolerance int64 + Time Timeval + Tick int64 + Ppsfreq int64 + Jitter int64 + Shift int32 + _ [4]byte + Stabil int64 + Jitcnt int64 + Calcnt int64 + Errcnt int64 + Stbcnt int64 + Tai int32 + _ [44]byte +} + +type Time_t int64 + +type Tms struct { + Utime int64 + Stime int64 + Cutime int64 + Cstime int64 +} + +type Utimbuf struct { + Actime int64 + Modtime int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint64 + Ino uint64 + Nlink uint64 + Mode uint32 + Uid uint32 + Gid uint32 + _ int32 + Rdev uint64 + Size int64 + Blksize int64 + Blocks int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + _ uint64 + _ uint64 + _ uint64 +} + +type StatxTimestamp struct { + Sec int64 + Nsec uint32 + _ int32 +} + +type Statx_t struct { + Mask uint32 + Blksize uint32 + Attributes uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Mode uint16 + _ [1]uint16 + Ino uint64 + Size uint64 + Blocks uint64 + Attributes_mask uint64 + Atime StatxTimestamp + Btime StatxTimestamp + Ctime StatxTimestamp + Mtime StatxTimestamp + Rdev_major uint32 + Rdev_minor uint32 + Dev_major uint32 + Dev_minor uint32 + _ [14]uint64 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]uint8 + _ [5]byte +} + +type Fsid struct { + Val [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + _ [4]byte + Start int64 + Len int64 + Pid int32 + _ [4]byte +} + +type FscryptPolicy struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptKey struct { + Mode uint32 + Raw [64]uint8 + Size uint32 +} + +type KeyctlDHParams struct { + Private int32 + Prime int32 + Base int32 +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddrL2 struct { + Family uint16 + Psm uint16 + Bdaddr [6]uint8 + Cid uint16 + Bdaddr_type uint8 + _ [1]byte +} + +type RawSockaddrRFCOMM struct { + Family uint16 + Bdaddr [6]uint8 + Channel uint8 + _ [1]byte +} + +type RawSockaddrCAN struct { + Family uint16 + _ [2]byte + Ifindex int32 + Addr [8]byte +} + +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + +type RawSockaddrXDP struct { + Family uint16 + Flags uint16 + Ifindex uint32 + Queue_id uint32 + Shared_umem_fd uint32 +} + +type RawSockaddr struct { + Family uint16 + Data [14]uint8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]uint8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type PacketMreq struct { + Ifindex int32 + Type uint16 + Alen uint16 + Address [8]uint8 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + _ [4]byte + Iov *Iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + _ [4]byte +} + +type Cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + _ [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofSockaddrL2 = 0xe + SizeofSockaddrRFCOMM = 0xa + SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 + SizeofSockaddrXDP = 0x10 + SizeofLinger = 0x8 + SizeofIovec = 0x10 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofPacketMreq = 0x10 + SizeofMsghdr = 0x38 + SizeofCmsghdr = 0x10 + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_INFO_KIND = 0x1 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_NUM_VF = 0x15 + IFLA_VFINFO_LIST = 0x16 + IFLA_STATS64 = 0x17 + IFLA_VF_PORTS = 0x18 + IFLA_PORT_SELF = 0x19 + IFLA_AF_SPEC = 0x1a + IFLA_GROUP = 0x1b + IFLA_NET_NS_FD = 0x1c + IFLA_EXT_MASK = 0x1d + IFLA_PROMISCUITY = 0x1e + IFLA_NUM_TX_QUEUES = 0x1f + IFLA_NUM_RX_QUEUES = 0x20 + IFLA_CARRIER = 0x21 + IFLA_PHYS_PORT_ID = 0x22 + IFLA_CARRIER_CHANGES = 0x23 + IFLA_PHYS_SWITCH_ID = 0x24 + IFLA_LINK_NETNSID = 0x25 + IFLA_PHYS_PORT_NAME = 0x26 + IFLA_PROTO_DOWN = 0x27 + IFLA_GSO_MAX_SEGS = 0x28 + IFLA_GSO_MAX_SIZE = 0x29 + IFLA_PAD = 0x2a + IFLA_XDP = 0x2b + IFLA_EVENT = 0x2c + IFLA_NEW_NETNSID = 0x2d + IFLA_IF_NETNSID = 0x2e + IFLA_MAX = 0x33 + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTA_MARK = 0x10 + RTA_MFC_STATS = 0x11 + RTA_VIA = 0x12 + RTA_NEWDST = 0x13 + RTA_PREF = 0x14 + RTA_ENCAP_TYPE = 0x15 + RTA_ENCAP = 0x16 + RTA_EXPIRES = 0x17 + RTA_PAD = 0x18 + RTA_UID = 0x19 + RTA_TTL_PROPAGATE = 0x1a + RTA_IP_PROTO = 0x1b + RTA_SPORT = 0x1c + RTA_DPORT = 0x1d + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + _ uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x10 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + _ [6]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + Gpr [32]uint64 + Nip uint64 + Msr uint64 + Orig_gpr3 uint64 + Ctr uint64 + Link uint64 + Xer uint64 + Ccr uint64 + Softe uint64 + Trap uint64 + Dar uint64 + Dsisr uint64 + Result uint64 +} + +type FdSet struct { + Bits [16]int64 +} + +type Sysinfo_t struct { + Uptime int64 + Loads [3]uint64 + Totalram uint64 + Freeram uint64 + Sharedram uint64 + Bufferram uint64 + Totalswap uint64 + Freeswap uint64 + Procs uint16 + Pad uint16 + _ [4]byte + Totalhigh uint64 + Freehigh uint64 + Unit uint32 + _ [0]uint8 + _ [4]byte +} + +type Utsname struct { + Sysname [65]byte + Nodename [65]byte + Release [65]byte + Version [65]byte + Machine [65]byte + Domainname [65]byte +} + +type Ustat_t struct { + Tfree int32 + _ [4]byte + Tinode uint64 + Fname [6]uint8 + Fpack [6]uint8 + _ [4]byte +} + +type EpollEvent struct { + Events uint32 + _ int32 + Fd int32 + Pad int32 +} + +const ( + AT_EMPTY_PATH = 0x1000 + AT_FDCWD = -0x64 + AT_NO_AUTOMOUNT = 0x800 + AT_REMOVEDIR = 0x200 + + AT_STATX_SYNC_AS_STAT = 0x0 + AT_STATX_FORCE_SYNC = 0x2000 + AT_STATX_DONT_SYNC = 0x4000 + + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 + + AT_EACCESS = 0x200 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x2000 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Sigset_t struct { + Val [16]uint64 +} + +const RNDGETENTCNT = 0x40045200 + +const PERF_IOC_FLAG_GROUP = 0x1 + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [19]uint8 + Line uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Taskstats struct { + Version uint16 + _ [2]byte + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + _ [6]byte + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]uint8 + Ac_sched uint8 + Ac_pad [3]uint8 + _ [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + _ [4]byte + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 +} + +const ( + TASKSTATS_CMD_UNSPEC = 0x0 + TASKSTATS_CMD_GET = 0x1 + TASKSTATS_CMD_NEW = 0x2 + TASKSTATS_TYPE_UNSPEC = 0x0 + TASKSTATS_TYPE_PID = 0x1 + TASKSTATS_TYPE_TGID = 0x2 + TASKSTATS_TYPE_STATS = 0x3 + TASKSTATS_TYPE_AGGR_PID = 0x4 + TASKSTATS_TYPE_AGGR_TGID = 0x5 + TASKSTATS_TYPE_NULL = 0x6 + TASKSTATS_CMD_ATTR_UNSPEC = 0x0 + TASKSTATS_CMD_ATTR_PID = 0x1 + TASKSTATS_CMD_ATTR_TGID = 0x2 + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 +) + +type CGroupStats struct { + Sleeping uint64 + Running uint64 + Stopped uint64 + Uninterruptible uint64 + Io_wait uint64 +} + +const ( + CGROUPSTATS_CMD_UNSPEC = 0x3 + CGROUPSTATS_CMD_GET = 0x4 + CGROUPSTATS_CMD_NEW = 0x5 + CGROUPSTATS_TYPE_UNSPEC = 0x0 + CGROUPSTATS_TYPE_CGROUP_STATS = 0x1 + CGROUPSTATS_CMD_ATTR_UNSPEC = 0x0 + CGROUPSTATS_CMD_ATTR_FD = 0x1 +) + +type Genlmsghdr struct { + Cmd uint8 + Version uint8 + Reserved uint16 +} + +const ( + CTRL_CMD_UNSPEC = 0x0 + CTRL_CMD_NEWFAMILY = 0x1 + CTRL_CMD_DELFAMILY = 0x2 + CTRL_CMD_GETFAMILY = 0x3 + CTRL_CMD_NEWOPS = 0x4 + CTRL_CMD_DELOPS = 0x5 + CTRL_CMD_GETOPS = 0x6 + CTRL_CMD_NEWMCAST_GRP = 0x7 + CTRL_CMD_DELMCAST_GRP = 0x8 + CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_ATTR_UNSPEC = 0x0 + CTRL_ATTR_FAMILY_ID = 0x1 + CTRL_ATTR_FAMILY_NAME = 0x2 + CTRL_ATTR_VERSION = 0x3 + CTRL_ATTR_HDRSIZE = 0x4 + CTRL_ATTR_MAXATTR = 0x5 + CTRL_ATTR_OPS = 0x6 + CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_OP_UNSPEC = 0x0 + CTRL_ATTR_OP_ID = 0x1 + CTRL_ATTR_OP_FLAGS = 0x2 + CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 + CTRL_ATTR_MCAST_GRP_NAME = 0x1 + CTRL_ATTR_MCAST_GRP_ID = 0x2 +) + +type cpuMask uint64 + +const ( + _CPU_SETSIZE = 0x400 + _NCPUBITS = 0x40 +) + +const ( + BDADDR_BREDR = 0x0 + BDADDR_LE_PUBLIC = 0x1 + BDADDR_LE_RANDOM = 0x2 +) + +type PerfEventAttr struct { + Type uint32 + Size uint32 + Config uint64 + Sample uint64 + Sample_type uint64 + Read_format uint64 + Bits uint64 + Wakeup uint32 + Bp_type uint32 + Ext1 uint64 + Ext2 uint64 + Branch_sample_type uint64 + Sample_regs_user uint64 + Sample_stack_user uint32 + Clockid int32 + Sample_regs_intr uint64 + Aux_watermark uint32 + _ uint32 +} + +type PerfEventMmapPage struct { + Version uint32 + Compat_version uint32 + Lock uint32 + Index uint32 + Offset int64 + Time_enabled uint64 + Time_running uint64 + Capabilities uint64 + Pmc_width uint16 + Time_shift uint16 + Time_mult uint32 + Time_offset uint64 + Time_zero uint64 + Size uint32 + _ [948]uint8 + Data_head uint64 + Data_tail uint64 + Data_offset uint64 + Data_size uint64 + Aux_head uint64 + Aux_tail uint64 + Aux_offset uint64 + Aux_size uint64 +} + +const ( + PerfBitDisabled uint64 = CBitFieldMaskBit0 + PerfBitInherit = CBitFieldMaskBit1 + PerfBitPinned = CBitFieldMaskBit2 + PerfBitExclusive = CBitFieldMaskBit3 + PerfBitExcludeUser = CBitFieldMaskBit4 + PerfBitExcludeKernel = CBitFieldMaskBit5 + PerfBitExcludeHv = CBitFieldMaskBit6 + PerfBitExcludeIdle = CBitFieldMaskBit7 + PerfBitMmap = CBitFieldMaskBit8 + PerfBitComm = CBitFieldMaskBit9 + PerfBitFreq = CBitFieldMaskBit10 + PerfBitInheritStat = CBitFieldMaskBit11 + PerfBitEnableOnExec = CBitFieldMaskBit12 + PerfBitTask = CBitFieldMaskBit13 + PerfBitWatermark = CBitFieldMaskBit14 + PerfBitPreciseIPBit1 = CBitFieldMaskBit15 + PerfBitPreciseIPBit2 = CBitFieldMaskBit16 + PerfBitMmapData = CBitFieldMaskBit17 + PerfBitSampleIDAll = CBitFieldMaskBit18 + PerfBitExcludeHost = CBitFieldMaskBit19 + PerfBitExcludeGuest = CBitFieldMaskBit20 + PerfBitExcludeCallchainKernel = CBitFieldMaskBit21 + PerfBitExcludeCallchainUser = CBitFieldMaskBit22 + PerfBitMmap2 = CBitFieldMaskBit23 + PerfBitCommExec = CBitFieldMaskBit24 + PerfBitUseClockID = CBitFieldMaskBit25 + PerfBitContextSwitch = CBitFieldMaskBit26 +) + +const ( + PERF_TYPE_HARDWARE = 0x0 + PERF_TYPE_SOFTWARE = 0x1 + PERF_TYPE_TRACEPOINT = 0x2 + PERF_TYPE_HW_CACHE = 0x3 + PERF_TYPE_RAW = 0x4 + PERF_TYPE_BREAKPOINT = 0x5 + + PERF_COUNT_HW_CPU_CYCLES = 0x0 + PERF_COUNT_HW_INSTRUCTIONS = 0x1 + PERF_COUNT_HW_CACHE_REFERENCES = 0x2 + PERF_COUNT_HW_CACHE_MISSES = 0x3 + PERF_COUNT_HW_BRANCH_INSTRUCTIONS = 0x4 + PERF_COUNT_HW_BRANCH_MISSES = 0x5 + PERF_COUNT_HW_BUS_CYCLES = 0x6 + PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 0x7 + PERF_COUNT_HW_STALLED_CYCLES_BACKEND = 0x8 + PERF_COUNT_HW_REF_CPU_CYCLES = 0x9 + + PERF_COUNT_HW_CACHE_L1D = 0x0 + PERF_COUNT_HW_CACHE_L1I = 0x1 + PERF_COUNT_HW_CACHE_LL = 0x2 + PERF_COUNT_HW_CACHE_DTLB = 0x3 + PERF_COUNT_HW_CACHE_ITLB = 0x4 + PERF_COUNT_HW_CACHE_BPU = 0x5 + PERF_COUNT_HW_CACHE_NODE = 0x6 + + PERF_COUNT_HW_CACHE_OP_READ = 0x0 + PERF_COUNT_HW_CACHE_OP_WRITE = 0x1 + PERF_COUNT_HW_CACHE_OP_PREFETCH = 0x2 + + PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0x0 + PERF_COUNT_HW_CACHE_RESULT_MISS = 0x1 + + PERF_COUNT_SW_CPU_CLOCK = 0x0 + PERF_COUNT_SW_TASK_CLOCK = 0x1 + PERF_COUNT_SW_PAGE_FAULTS = 0x2 + PERF_COUNT_SW_CONTEXT_SWITCHES = 0x3 + PERF_COUNT_SW_CPU_MIGRATIONS = 0x4 + PERF_COUNT_SW_PAGE_FAULTS_MIN = 0x5 + PERF_COUNT_SW_PAGE_FAULTS_MAJ = 0x6 + PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7 + PERF_COUNT_SW_EMULATION_FAULTS = 0x8 + PERF_COUNT_SW_DUMMY = 0x9 + + PERF_SAMPLE_IP = 0x1 + PERF_SAMPLE_TID = 0x2 + PERF_SAMPLE_TIME = 0x4 + PERF_SAMPLE_ADDR = 0x8 + PERF_SAMPLE_READ = 0x10 + PERF_SAMPLE_CALLCHAIN = 0x20 + PERF_SAMPLE_ID = 0x40 + PERF_SAMPLE_CPU = 0x80 + PERF_SAMPLE_PERIOD = 0x100 + PERF_SAMPLE_STREAM_ID = 0x200 + PERF_SAMPLE_RAW = 0x400 + PERF_SAMPLE_BRANCH_STACK = 0x800 + + PERF_SAMPLE_BRANCH_USER = 0x1 + PERF_SAMPLE_BRANCH_KERNEL = 0x2 + PERF_SAMPLE_BRANCH_HV = 0x4 + PERF_SAMPLE_BRANCH_ANY = 0x8 + PERF_SAMPLE_BRANCH_ANY_CALL = 0x10 + PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20 + PERF_SAMPLE_BRANCH_IND_CALL = 0x40 + + PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1 + PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2 + PERF_FORMAT_ID = 0x4 + PERF_FORMAT_GROUP = 0x8 + + PERF_RECORD_MMAP = 0x1 + PERF_RECORD_LOST = 0x2 + PERF_RECORD_COMM = 0x3 + PERF_RECORD_EXIT = 0x4 + PERF_RECORD_THROTTLE = 0x5 + PERF_RECORD_UNTHROTTLE = 0x6 + PERF_RECORD_FORK = 0x7 + PERF_RECORD_READ = 0x8 + PERF_RECORD_SAMPLE = 0x9 + + PERF_CONTEXT_HV = -0x20 + PERF_CONTEXT_KERNEL = -0x80 + PERF_CONTEXT_USER = -0x200 + + PERF_CONTEXT_GUEST = -0x800 + PERF_CONTEXT_GUEST_KERNEL = -0x880 + PERF_CONTEXT_GUEST_USER = -0xa00 + + PERF_FLAG_FD_NO_GROUP = 0x1 + PERF_FLAG_FD_OUTPUT = 0x2 + PERF_FLAG_PID_CGROUP = 0x4 +) + +const ( + CBitFieldMaskBit0 = 0x1 + CBitFieldMaskBit1 = 0x2 + CBitFieldMaskBit2 = 0x4 + CBitFieldMaskBit3 = 0x8 + CBitFieldMaskBit4 = 0x10 + CBitFieldMaskBit5 = 0x20 + CBitFieldMaskBit6 = 0x40 + CBitFieldMaskBit7 = 0x80 + CBitFieldMaskBit8 = 0x100 + CBitFieldMaskBit9 = 0x200 + CBitFieldMaskBit10 = 0x400 + CBitFieldMaskBit11 = 0x800 + CBitFieldMaskBit12 = 0x1000 + CBitFieldMaskBit13 = 0x2000 + CBitFieldMaskBit14 = 0x4000 + CBitFieldMaskBit15 = 0x8000 + CBitFieldMaskBit16 = 0x10000 + CBitFieldMaskBit17 = 0x20000 + CBitFieldMaskBit18 = 0x40000 + CBitFieldMaskBit19 = 0x80000 + CBitFieldMaskBit20 = 0x100000 + CBitFieldMaskBit21 = 0x200000 + CBitFieldMaskBit22 = 0x400000 + CBitFieldMaskBit23 = 0x800000 + CBitFieldMaskBit24 = 0x1000000 + CBitFieldMaskBit25 = 0x2000000 + CBitFieldMaskBit26 = 0x4000000 + CBitFieldMaskBit27 = 0x8000000 + CBitFieldMaskBit28 = 0x10000000 + CBitFieldMaskBit29 = 0x20000000 + CBitFieldMaskBit30 = 0x40000000 + CBitFieldMaskBit31 = 0x80000000 + CBitFieldMaskBit32 = 0x100000000 + CBitFieldMaskBit33 = 0x200000000 + CBitFieldMaskBit34 = 0x400000000 + CBitFieldMaskBit35 = 0x800000000 + CBitFieldMaskBit36 = 0x1000000000 + CBitFieldMaskBit37 = 0x2000000000 + CBitFieldMaskBit38 = 0x4000000000 + CBitFieldMaskBit39 = 0x8000000000 + CBitFieldMaskBit40 = 0x10000000000 + CBitFieldMaskBit41 = 0x20000000000 + CBitFieldMaskBit42 = 0x40000000000 + CBitFieldMaskBit43 = 0x80000000000 + CBitFieldMaskBit44 = 0x100000000000 + CBitFieldMaskBit45 = 0x200000000000 + CBitFieldMaskBit46 = 0x400000000000 + CBitFieldMaskBit47 = 0x800000000000 + CBitFieldMaskBit48 = 0x1000000000000 + CBitFieldMaskBit49 = 0x2000000000000 + CBitFieldMaskBit50 = 0x4000000000000 + CBitFieldMaskBit51 = 0x8000000000000 + CBitFieldMaskBit52 = 0x10000000000000 + CBitFieldMaskBit53 = 0x20000000000000 + CBitFieldMaskBit54 = 0x40000000000000 + CBitFieldMaskBit55 = 0x80000000000000 + CBitFieldMaskBit56 = 0x100000000000000 + CBitFieldMaskBit57 = 0x200000000000000 + CBitFieldMaskBit58 = 0x400000000000000 + CBitFieldMaskBit59 = 0x800000000000000 + CBitFieldMaskBit60 = 0x1000000000000000 + CBitFieldMaskBit61 = 0x2000000000000000 + CBitFieldMaskBit62 = 0x4000000000000000 + CBitFieldMaskBit63 = 0x8000000000000000 +) + +type SockaddrStorage struct { + Family uint16 + _ [118]uint8 + _ uint64 +} + +type TCPMD5Sig struct { + Addr SockaddrStorage + Flags uint8 + Prefixlen uint8 + Keylen uint16 + _ uint32 + Key [80]uint8 +} + +type HDDriveCmdHdr struct { + Command uint8 + Number uint8 + Feature uint8 + Count uint8 +} + +type HDGeometry struct { + Heads uint8 + Sectors uint8 + Cylinders uint16 + _ [4]byte + Start uint64 +} + +type HDDriveID struct { + Config uint16 + Cyls uint16 + Reserved2 uint16 + Heads uint16 + Track_bytes uint16 + Sector_bytes uint16 + Sectors uint16 + Vendor0 uint16 + Vendor1 uint16 + Vendor2 uint16 + Serial_no [20]uint8 + Buf_type uint16 + Buf_size uint16 + Ecc_bytes uint16 + Fw_rev [8]uint8 + Model [40]uint8 + Max_multsect uint8 + Vendor3 uint8 + Dword_io uint16 + Vendor4 uint8 + Capability uint8 + Reserved50 uint16 + Vendor5 uint8 + TPIO uint8 + Vendor6 uint8 + TDMA uint8 + Field_valid uint16 + Cur_cyls uint16 + Cur_heads uint16 + Cur_sectors uint16 + Cur_capacity0 uint16 + Cur_capacity1 uint16 + Multsect uint8 + Multsect_valid uint8 + Lba_capacity uint32 + Dma_1word uint16 + Dma_mword uint16 + Eide_pio_modes uint16 + Eide_dma_min uint16 + Eide_dma_time uint16 + Eide_pio uint16 + Eide_pio_iordy uint16 + Words69_70 [2]uint16 + Words71_74 [4]uint16 + Queue_depth uint16 + Words76_79 [4]uint16 + Major_rev_num uint16 + Minor_rev_num uint16 + Command_set_1 uint16 + Command_set_2 uint16 + Cfsse uint16 + Cfs_enable_1 uint16 + Cfs_enable_2 uint16 + Csf_default uint16 + Dma_ultra uint16 + Trseuc uint16 + TrsEuc uint16 + CurAPMvalues uint16 + Mprc uint16 + Hw_config uint16 + Acoustic uint16 + Msrqs uint16 + Sxfert uint16 + Sal uint16 + Spg uint32 + Lba_capacity_2 uint64 + Words104_125 [22]uint16 + Last_lun uint16 + Word127 uint16 + Dlf uint16 + Csfo uint16 + Words130_155 [26]uint16 + Word156 uint16 + Words157_159 [3]uint16 + Cfa_power uint16 + Words161_175 [15]uint16 + Words176_205 [30]uint16 + Words206_254 [49]uint16 + Integrity_word uint16 +} + +type Statfs_t struct { + Type int64 + Bsize int64 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Namelen int64 + Frsize int64 + Flags int64 + Spare [4]int64 +} + +const ( + ST_MANDLOCK = 0x40 + ST_NOATIME = 0x400 + ST_NODEV = 0x4 + ST_NODIRATIME = 0x800 + ST_NOEXEC = 0x8 + ST_NOSUID = 0x2 + ST_RDONLY = 0x1 + ST_RELATIME = 0x1000 + ST_SYNCHRONOUS = 0x10 +) + +type TpacketHdr struct { + Status uint64 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Sec uint32 + Usec uint32 + _ [4]byte +} + +type Tpacket2Hdr struct { + Status uint32 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Sec uint32 + Nsec uint32 + Vlan_tci uint16 + Vlan_tpid uint16 + _ [4]uint8 +} + +type Tpacket3Hdr struct { + Next_offset uint32 + Sec uint32 + Nsec uint32 + Snaplen uint32 + Len uint32 + Status uint32 + Mac uint16 + Net uint16 + Hv1 TpacketHdrVariant1 + _ [8]uint8 +} + +type TpacketHdrVariant1 struct { + Rxhash uint32 + Vlan_tci uint32 + Vlan_tpid uint16 + _ uint16 +} + +type TpacketBlockDesc struct { + Version uint32 + To_priv uint32 + Hdr [40]byte +} + +type TpacketReq struct { + Block_size uint32 + Block_nr uint32 + Frame_size uint32 + Frame_nr uint32 +} + +type TpacketReq3 struct { + Block_size uint32 + Block_nr uint32 + Frame_size uint32 + Frame_nr uint32 + Retire_blk_tov uint32 + Sizeof_priv uint32 + Feature_req_word uint32 +} + +type TpacketStats struct { + Packets uint32 + Drops uint32 +} + +type TpacketStatsV3 struct { + Packets uint32 + Drops uint32 + Freeze_q_cnt uint32 +} + +type TpacketAuxdata struct { + Status uint32 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Vlan_tci uint16 + Vlan_tpid uint16 +} + +const ( + TPACKET_V1 = 0x0 + TPACKET_V2 = 0x1 + TPACKET_V3 = 0x2 +) + +const ( + SizeofTpacketHdr = 0x20 + SizeofTpacket2Hdr = 0x20 + SizeofTpacket3Hdr = 0x30 +) + +const ( + NF_INET_PRE_ROUTING = 0x0 + NF_INET_LOCAL_IN = 0x1 + NF_INET_FORWARD = 0x2 + NF_INET_LOCAL_OUT = 0x3 + NF_INET_POST_ROUTING = 0x4 + NF_INET_NUMHOOKS = 0x5 +) + +const ( + NF_NETDEV_INGRESS = 0x0 + NF_NETDEV_NUMHOOKS = 0x1 +) + +const ( + NFPROTO_UNSPEC = 0x0 + NFPROTO_INET = 0x1 + NFPROTO_IPV4 = 0x2 + NFPROTO_ARP = 0x3 + NFPROTO_NETDEV = 0x5 + NFPROTO_BRIDGE = 0x7 + NFPROTO_IPV6 = 0xa + NFPROTO_DECNET = 0xc + NFPROTO_NUMPROTO = 0xd +) + +type Nfgenmsg struct { + Nfgen_family uint8 + Version uint8 + Res_id uint16 +} + +const ( + NFNL_BATCH_UNSPEC = 0x0 + NFNL_BATCH_GENID = 0x1 +) + +const ( + NFT_REG_VERDICT = 0x0 + NFT_REG_1 = 0x1 + NFT_REG_2 = 0x2 + NFT_REG_3 = 0x3 + NFT_REG_4 = 0x4 + NFT_REG32_00 = 0x8 + NFT_REG32_01 = 0x9 + NFT_REG32_02 = 0xa + NFT_REG32_03 = 0xb + NFT_REG32_04 = 0xc + NFT_REG32_05 = 0xd + NFT_REG32_06 = 0xe + NFT_REG32_07 = 0xf + NFT_REG32_08 = 0x10 + NFT_REG32_09 = 0x11 + NFT_REG32_10 = 0x12 + NFT_REG32_11 = 0x13 + NFT_REG32_12 = 0x14 + NFT_REG32_13 = 0x15 + NFT_REG32_14 = 0x16 + NFT_REG32_15 = 0x17 + NFT_CONTINUE = -0x1 + NFT_BREAK = -0x2 + NFT_JUMP = -0x3 + NFT_GOTO = -0x4 + NFT_RETURN = -0x5 + NFT_MSG_NEWTABLE = 0x0 + NFT_MSG_GETTABLE = 0x1 + NFT_MSG_DELTABLE = 0x2 + NFT_MSG_NEWCHAIN = 0x3 + NFT_MSG_GETCHAIN = 0x4 + NFT_MSG_DELCHAIN = 0x5 + NFT_MSG_NEWRULE = 0x6 + NFT_MSG_GETRULE = 0x7 + NFT_MSG_DELRULE = 0x8 + NFT_MSG_NEWSET = 0x9 + NFT_MSG_GETSET = 0xa + NFT_MSG_DELSET = 0xb + NFT_MSG_NEWSETELEM = 0xc + NFT_MSG_GETSETELEM = 0xd + NFT_MSG_DELSETELEM = 0xe + NFT_MSG_NEWGEN = 0xf + NFT_MSG_GETGEN = 0x10 + NFT_MSG_TRACE = 0x11 + NFT_MSG_NEWOBJ = 0x12 + NFT_MSG_GETOBJ = 0x13 + NFT_MSG_DELOBJ = 0x14 + NFT_MSG_GETOBJ_RESET = 0x15 + NFT_MSG_MAX = 0x19 + NFTA_LIST_UNPEC = 0x0 + NFTA_LIST_ELEM = 0x1 + NFTA_HOOK_UNSPEC = 0x0 + NFTA_HOOK_HOOKNUM = 0x1 + NFTA_HOOK_PRIORITY = 0x2 + NFTA_HOOK_DEV = 0x3 + NFT_TABLE_F_DORMANT = 0x1 + NFTA_TABLE_UNSPEC = 0x0 + NFTA_TABLE_NAME = 0x1 + NFTA_TABLE_FLAGS = 0x2 + NFTA_TABLE_USE = 0x3 + NFTA_CHAIN_UNSPEC = 0x0 + NFTA_CHAIN_TABLE = 0x1 + NFTA_CHAIN_HANDLE = 0x2 + NFTA_CHAIN_NAME = 0x3 + NFTA_CHAIN_HOOK = 0x4 + NFTA_CHAIN_POLICY = 0x5 + NFTA_CHAIN_USE = 0x6 + NFTA_CHAIN_TYPE = 0x7 + NFTA_CHAIN_COUNTERS = 0x8 + NFTA_CHAIN_PAD = 0x9 + NFTA_RULE_UNSPEC = 0x0 + NFTA_RULE_TABLE = 0x1 + NFTA_RULE_CHAIN = 0x2 + NFTA_RULE_HANDLE = 0x3 + NFTA_RULE_EXPRESSIONS = 0x4 + NFTA_RULE_COMPAT = 0x5 + NFTA_RULE_POSITION = 0x6 + NFTA_RULE_USERDATA = 0x7 + NFTA_RULE_PAD = 0x8 + NFTA_RULE_ID = 0x9 + NFT_RULE_COMPAT_F_INV = 0x2 + NFT_RULE_COMPAT_F_MASK = 0x2 + NFTA_RULE_COMPAT_UNSPEC = 0x0 + NFTA_RULE_COMPAT_PROTO = 0x1 + NFTA_RULE_COMPAT_FLAGS = 0x2 + NFT_SET_ANONYMOUS = 0x1 + NFT_SET_CONSTANT = 0x2 + NFT_SET_INTERVAL = 0x4 + NFT_SET_MAP = 0x8 + NFT_SET_TIMEOUT = 0x10 + NFT_SET_EVAL = 0x20 + NFT_SET_OBJECT = 0x40 + NFT_SET_POL_PERFORMANCE = 0x0 + NFT_SET_POL_MEMORY = 0x1 + NFTA_SET_DESC_UNSPEC = 0x0 + NFTA_SET_DESC_SIZE = 0x1 + NFTA_SET_UNSPEC = 0x0 + NFTA_SET_TABLE = 0x1 + NFTA_SET_NAME = 0x2 + NFTA_SET_FLAGS = 0x3 + NFTA_SET_KEY_TYPE = 0x4 + NFTA_SET_KEY_LEN = 0x5 + NFTA_SET_DATA_TYPE = 0x6 + NFTA_SET_DATA_LEN = 0x7 + NFTA_SET_POLICY = 0x8 + NFTA_SET_DESC = 0x9 + NFTA_SET_ID = 0xa + NFTA_SET_TIMEOUT = 0xb + NFTA_SET_GC_INTERVAL = 0xc + NFTA_SET_USERDATA = 0xd + NFTA_SET_PAD = 0xe + NFTA_SET_OBJ_TYPE = 0xf + NFT_SET_ELEM_INTERVAL_END = 0x1 + NFTA_SET_ELEM_UNSPEC = 0x0 + NFTA_SET_ELEM_KEY = 0x1 + NFTA_SET_ELEM_DATA = 0x2 + NFTA_SET_ELEM_FLAGS = 0x3 + NFTA_SET_ELEM_TIMEOUT = 0x4 + NFTA_SET_ELEM_EXPIRATION = 0x5 + NFTA_SET_ELEM_USERDATA = 0x6 + NFTA_SET_ELEM_EXPR = 0x7 + NFTA_SET_ELEM_PAD = 0x8 + NFTA_SET_ELEM_OBJREF = 0x9 + NFTA_SET_ELEM_LIST_UNSPEC = 0x0 + NFTA_SET_ELEM_LIST_TABLE = 0x1 + NFTA_SET_ELEM_LIST_SET = 0x2 + NFTA_SET_ELEM_LIST_ELEMENTS = 0x3 + NFTA_SET_ELEM_LIST_SET_ID = 0x4 + NFT_DATA_VALUE = 0x0 + NFT_DATA_VERDICT = 0xffffff00 + NFTA_DATA_UNSPEC = 0x0 + NFTA_DATA_VALUE = 0x1 + NFTA_DATA_VERDICT = 0x2 + NFTA_VERDICT_UNSPEC = 0x0 + NFTA_VERDICT_CODE = 0x1 + NFTA_VERDICT_CHAIN = 0x2 + NFTA_EXPR_UNSPEC = 0x0 + NFTA_EXPR_NAME = 0x1 + NFTA_EXPR_DATA = 0x2 + NFTA_IMMEDIATE_UNSPEC = 0x0 + NFTA_IMMEDIATE_DREG = 0x1 + NFTA_IMMEDIATE_DATA = 0x2 + NFTA_BITWISE_UNSPEC = 0x0 + NFTA_BITWISE_SREG = 0x1 + NFTA_BITWISE_DREG = 0x2 + NFTA_BITWISE_LEN = 0x3 + NFTA_BITWISE_MASK = 0x4 + NFTA_BITWISE_XOR = 0x5 + NFT_BYTEORDER_NTOH = 0x0 + NFT_BYTEORDER_HTON = 0x1 + NFTA_BYTEORDER_UNSPEC = 0x0 + NFTA_BYTEORDER_SREG = 0x1 + NFTA_BYTEORDER_DREG = 0x2 + NFTA_BYTEORDER_OP = 0x3 + NFTA_BYTEORDER_LEN = 0x4 + NFTA_BYTEORDER_SIZE = 0x5 + NFT_CMP_EQ = 0x0 + NFT_CMP_NEQ = 0x1 + NFT_CMP_LT = 0x2 + NFT_CMP_LTE = 0x3 + NFT_CMP_GT = 0x4 + NFT_CMP_GTE = 0x5 + NFTA_CMP_UNSPEC = 0x0 + NFTA_CMP_SREG = 0x1 + NFTA_CMP_OP = 0x2 + NFTA_CMP_DATA = 0x3 + NFT_RANGE_EQ = 0x0 + NFT_RANGE_NEQ = 0x1 + NFTA_RANGE_UNSPEC = 0x0 + NFTA_RANGE_SREG = 0x1 + NFTA_RANGE_OP = 0x2 + NFTA_RANGE_FROM_DATA = 0x3 + NFTA_RANGE_TO_DATA = 0x4 + NFT_LOOKUP_F_INV = 0x1 + NFTA_LOOKUP_UNSPEC = 0x0 + NFTA_LOOKUP_SET = 0x1 + NFTA_LOOKUP_SREG = 0x2 + NFTA_LOOKUP_DREG = 0x3 + NFTA_LOOKUP_SET_ID = 0x4 + NFTA_LOOKUP_FLAGS = 0x5 + NFT_DYNSET_OP_ADD = 0x0 + NFT_DYNSET_OP_UPDATE = 0x1 + NFT_DYNSET_F_INV = 0x1 + NFTA_DYNSET_UNSPEC = 0x0 + NFTA_DYNSET_SET_NAME = 0x1 + NFTA_DYNSET_SET_ID = 0x2 + NFTA_DYNSET_OP = 0x3 + NFTA_DYNSET_SREG_KEY = 0x4 + NFTA_DYNSET_SREG_DATA = 0x5 + NFTA_DYNSET_TIMEOUT = 0x6 + NFTA_DYNSET_EXPR = 0x7 + NFTA_DYNSET_PAD = 0x8 + NFTA_DYNSET_FLAGS = 0x9 + NFT_PAYLOAD_LL_HEADER = 0x0 + NFT_PAYLOAD_NETWORK_HEADER = 0x1 + NFT_PAYLOAD_TRANSPORT_HEADER = 0x2 + NFT_PAYLOAD_CSUM_NONE = 0x0 + NFT_PAYLOAD_CSUM_INET = 0x1 + NFT_PAYLOAD_L4CSUM_PSEUDOHDR = 0x1 + NFTA_PAYLOAD_UNSPEC = 0x0 + NFTA_PAYLOAD_DREG = 0x1 + NFTA_PAYLOAD_BASE = 0x2 + NFTA_PAYLOAD_OFFSET = 0x3 + NFTA_PAYLOAD_LEN = 0x4 + NFTA_PAYLOAD_SREG = 0x5 + NFTA_PAYLOAD_CSUM_TYPE = 0x6 + NFTA_PAYLOAD_CSUM_OFFSET = 0x7 + NFTA_PAYLOAD_CSUM_FLAGS = 0x8 + NFT_EXTHDR_F_PRESENT = 0x1 + NFT_EXTHDR_OP_IPV6 = 0x0 + NFT_EXTHDR_OP_TCPOPT = 0x1 + NFTA_EXTHDR_UNSPEC = 0x0 + NFTA_EXTHDR_DREG = 0x1 + NFTA_EXTHDR_TYPE = 0x2 + NFTA_EXTHDR_OFFSET = 0x3 + NFTA_EXTHDR_LEN = 0x4 + NFTA_EXTHDR_FLAGS = 0x5 + NFTA_EXTHDR_OP = 0x6 + NFTA_EXTHDR_SREG = 0x7 + NFT_META_LEN = 0x0 + NFT_META_PROTOCOL = 0x1 + NFT_META_PRIORITY = 0x2 + NFT_META_MARK = 0x3 + NFT_META_IIF = 0x4 + NFT_META_OIF = 0x5 + NFT_META_IIFNAME = 0x6 + NFT_META_OIFNAME = 0x7 + NFT_META_IIFTYPE = 0x8 + NFT_META_OIFTYPE = 0x9 + NFT_META_SKUID = 0xa + NFT_META_SKGID = 0xb + NFT_META_NFTRACE = 0xc + NFT_META_RTCLASSID = 0xd + NFT_META_SECMARK = 0xe + NFT_META_NFPROTO = 0xf + NFT_META_L4PROTO = 0x10 + NFT_META_BRI_IIFNAME = 0x11 + NFT_META_BRI_OIFNAME = 0x12 + NFT_META_PKTTYPE = 0x13 + NFT_META_CPU = 0x14 + NFT_META_IIFGROUP = 0x15 + NFT_META_OIFGROUP = 0x16 + NFT_META_CGROUP = 0x17 + NFT_META_PRANDOM = 0x18 + NFT_RT_CLASSID = 0x0 + NFT_RT_NEXTHOP4 = 0x1 + NFT_RT_NEXTHOP6 = 0x2 + NFT_RT_TCPMSS = 0x3 + NFT_HASH_JENKINS = 0x0 + NFT_HASH_SYM = 0x1 + NFTA_HASH_UNSPEC = 0x0 + NFTA_HASH_SREG = 0x1 + NFTA_HASH_DREG = 0x2 + NFTA_HASH_LEN = 0x3 + NFTA_HASH_MODULUS = 0x4 + NFTA_HASH_SEED = 0x5 + NFTA_HASH_OFFSET = 0x6 + NFTA_HASH_TYPE = 0x7 + NFTA_META_UNSPEC = 0x0 + NFTA_META_DREG = 0x1 + NFTA_META_KEY = 0x2 + NFTA_META_SREG = 0x3 + NFTA_RT_UNSPEC = 0x0 + NFTA_RT_DREG = 0x1 + NFTA_RT_KEY = 0x2 + NFT_CT_STATE = 0x0 + NFT_CT_DIRECTION = 0x1 + NFT_CT_STATUS = 0x2 + NFT_CT_MARK = 0x3 + NFT_CT_SECMARK = 0x4 + NFT_CT_EXPIRATION = 0x5 + NFT_CT_HELPER = 0x6 + NFT_CT_L3PROTOCOL = 0x7 + NFT_CT_SRC = 0x8 + NFT_CT_DST = 0x9 + NFT_CT_PROTOCOL = 0xa + NFT_CT_PROTO_SRC = 0xb + NFT_CT_PROTO_DST = 0xc + NFT_CT_LABELS = 0xd + NFT_CT_PKTS = 0xe + NFT_CT_BYTES = 0xf + NFT_CT_AVGPKT = 0x10 + NFT_CT_ZONE = 0x11 + NFT_CT_EVENTMASK = 0x12 + NFTA_CT_UNSPEC = 0x0 + NFTA_CT_DREG = 0x1 + NFTA_CT_KEY = 0x2 + NFTA_CT_DIRECTION = 0x3 + NFTA_CT_SREG = 0x4 + NFT_LIMIT_PKTS = 0x0 + NFT_LIMIT_PKT_BYTES = 0x1 + NFT_LIMIT_F_INV = 0x1 + NFTA_LIMIT_UNSPEC = 0x0 + NFTA_LIMIT_RATE = 0x1 + NFTA_LIMIT_UNIT = 0x2 + NFTA_LIMIT_BURST = 0x3 + NFTA_LIMIT_TYPE = 0x4 + NFTA_LIMIT_FLAGS = 0x5 + NFTA_LIMIT_PAD = 0x6 + NFTA_COUNTER_UNSPEC = 0x0 + NFTA_COUNTER_BYTES = 0x1 + NFTA_COUNTER_PACKETS = 0x2 + NFTA_COUNTER_PAD = 0x3 + NFTA_LOG_UNSPEC = 0x0 + NFTA_LOG_GROUP = 0x1 + NFTA_LOG_PREFIX = 0x2 + NFTA_LOG_SNAPLEN = 0x3 + NFTA_LOG_QTHRESHOLD = 0x4 + NFTA_LOG_LEVEL = 0x5 + NFTA_LOG_FLAGS = 0x6 + NFTA_QUEUE_UNSPEC = 0x0 + NFTA_QUEUE_NUM = 0x1 + NFTA_QUEUE_TOTAL = 0x2 + NFTA_QUEUE_FLAGS = 0x3 + NFTA_QUEUE_SREG_QNUM = 0x4 + NFT_QUOTA_F_INV = 0x1 + NFT_QUOTA_F_DEPLETED = 0x2 + NFTA_QUOTA_UNSPEC = 0x0 + NFTA_QUOTA_BYTES = 0x1 + NFTA_QUOTA_FLAGS = 0x2 + NFTA_QUOTA_PAD = 0x3 + NFTA_QUOTA_CONSUMED = 0x4 + NFT_REJECT_ICMP_UNREACH = 0x0 + NFT_REJECT_TCP_RST = 0x1 + NFT_REJECT_ICMPX_UNREACH = 0x2 + NFT_REJECT_ICMPX_NO_ROUTE = 0x0 + NFT_REJECT_ICMPX_PORT_UNREACH = 0x1 + NFT_REJECT_ICMPX_HOST_UNREACH = 0x2 + NFT_REJECT_ICMPX_ADMIN_PROHIBITED = 0x3 + NFTA_REJECT_UNSPEC = 0x0 + NFTA_REJECT_TYPE = 0x1 + NFTA_REJECT_ICMP_CODE = 0x2 + NFT_NAT_SNAT = 0x0 + NFT_NAT_DNAT = 0x1 + NFTA_NAT_UNSPEC = 0x0 + NFTA_NAT_TYPE = 0x1 + NFTA_NAT_FAMILY = 0x2 + NFTA_NAT_REG_ADDR_MIN = 0x3 + NFTA_NAT_REG_ADDR_MAX = 0x4 + NFTA_NAT_REG_PROTO_MIN = 0x5 + NFTA_NAT_REG_PROTO_MAX = 0x6 + NFTA_NAT_FLAGS = 0x7 + NFTA_MASQ_UNSPEC = 0x0 + NFTA_MASQ_FLAGS = 0x1 + NFTA_MASQ_REG_PROTO_MIN = 0x2 + NFTA_MASQ_REG_PROTO_MAX = 0x3 + NFTA_REDIR_UNSPEC = 0x0 + NFTA_REDIR_REG_PROTO_MIN = 0x1 + NFTA_REDIR_REG_PROTO_MAX = 0x2 + NFTA_REDIR_FLAGS = 0x3 + NFTA_DUP_UNSPEC = 0x0 + NFTA_DUP_SREG_ADDR = 0x1 + NFTA_DUP_SREG_DEV = 0x2 + NFTA_FWD_UNSPEC = 0x0 + NFTA_FWD_SREG_DEV = 0x1 + NFTA_OBJREF_UNSPEC = 0x0 + NFTA_OBJREF_IMM_TYPE = 0x1 + NFTA_OBJREF_IMM_NAME = 0x2 + NFTA_OBJREF_SET_SREG = 0x3 + NFTA_OBJREF_SET_NAME = 0x4 + NFTA_OBJREF_SET_ID = 0x5 + NFTA_GEN_UNSPEC = 0x0 + NFTA_GEN_ID = 0x1 + NFTA_GEN_PROC_PID = 0x2 + NFTA_GEN_PROC_NAME = 0x3 + NFTA_FIB_UNSPEC = 0x0 + NFTA_FIB_DREG = 0x1 + NFTA_FIB_RESULT = 0x2 + NFTA_FIB_FLAGS = 0x3 + NFT_FIB_RESULT_UNSPEC = 0x0 + NFT_FIB_RESULT_OIF = 0x1 + NFT_FIB_RESULT_OIFNAME = 0x2 + NFT_FIB_RESULT_ADDRTYPE = 0x3 + NFTA_FIB_F_SADDR = 0x1 + NFTA_FIB_F_DADDR = 0x2 + NFTA_FIB_F_MARK = 0x4 + NFTA_FIB_F_IIF = 0x8 + NFTA_FIB_F_OIF = 0x10 + NFTA_FIB_F_PRESENT = 0x20 + NFTA_CT_HELPER_UNSPEC = 0x0 + NFTA_CT_HELPER_NAME = 0x1 + NFTA_CT_HELPER_L3PROTO = 0x2 + NFTA_CT_HELPER_L4PROTO = 0x3 + NFTA_OBJ_UNSPEC = 0x0 + NFTA_OBJ_TABLE = 0x1 + NFTA_OBJ_NAME = 0x2 + NFTA_OBJ_TYPE = 0x3 + NFTA_OBJ_DATA = 0x4 + NFTA_OBJ_USE = 0x5 + NFTA_TRACE_UNSPEC = 0x0 + NFTA_TRACE_TABLE = 0x1 + NFTA_TRACE_CHAIN = 0x2 + NFTA_TRACE_RULE_HANDLE = 0x3 + NFTA_TRACE_TYPE = 0x4 + NFTA_TRACE_VERDICT = 0x5 + NFTA_TRACE_ID = 0x6 + NFTA_TRACE_LL_HEADER = 0x7 + NFTA_TRACE_NETWORK_HEADER = 0x8 + NFTA_TRACE_TRANSPORT_HEADER = 0x9 + NFTA_TRACE_IIF = 0xa + NFTA_TRACE_IIFTYPE = 0xb + NFTA_TRACE_OIF = 0xc + NFTA_TRACE_OIFTYPE = 0xd + NFTA_TRACE_MARK = 0xe + NFTA_TRACE_NFPROTO = 0xf + NFTA_TRACE_POLICY = 0x10 + NFTA_TRACE_PAD = 0x11 + NFT_TRACETYPE_UNSPEC = 0x0 + NFT_TRACETYPE_POLICY = 0x1 + NFT_TRACETYPE_RETURN = 0x2 + NFT_TRACETYPE_RULE = 0x3 + NFTA_NG_UNSPEC = 0x0 + NFTA_NG_DREG = 0x1 + NFTA_NG_MODULUS = 0x2 + NFTA_NG_TYPE = 0x3 + NFTA_NG_OFFSET = 0x4 + NFT_NG_INCREMENTAL = 0x0 + NFT_NG_RANDOM = 0x1 +) + +type RTCTime struct { + Sec int32 + Min int32 + Hour int32 + Mday int32 + Mon int32 + Year int32 + Wday int32 + Yday int32 + Isdst int32 +} + +type RTCWkAlrm struct { + Enabled uint8 + Pending uint8 + _ [2]byte + Time RTCTime +} + +type RTCPLLInfo struct { + Ctrl int32 + Value int32 + Max int32 + Min int32 + Posmult int32 + Negmult int32 + Clock int64 +} + +type BlkpgIoctlArg struct { + Op int32 + Flags int32 + Datalen int32 + _ [4]byte + Data *byte +} + +type BlkpgPartition struct { + Start int64 + Length int64 + Pno int32 + Devname [64]uint8 + Volname [64]uint8 + _ [4]byte +} + +const ( + BLKPG = 0x20001269 + BLKPG_ADD_PARTITION = 0x1 + BLKPG_DEL_PARTITION = 0x2 + BLKPG_RESIZE_PARTITION = 0x3 +) + +const ( + NETNSA_NONE = 0x0 + NETNSA_NSID = 0x1 + NETNSA_PID = 0x2 + NETNSA_FD = 0x3 +) + +type XDPRingOffset struct { + Producer uint64 + Consumer uint64 + Desc uint64 +} + +type XDPMmapOffsets struct { + Rx XDPRingOffset + Tx XDPRingOffset + Fr XDPRingOffset + Cr XDPRingOffset +} + +type XDPUmemReg struct { + Addr uint64 + Len uint64 + Size uint32 + Headroom uint32 +} + +type XDPStatistics struct { + Rx_dropped uint64 + Rx_invalid_descs uint64 + Tx_invalid_descs uint64 +} + +type XDPDesc struct { + Addr uint64 + Len uint32 + Options uint32 +} + +const ( + NCSI_CMD_UNSPEC = 0x0 + NCSI_CMD_PKG_INFO = 0x1 + NCSI_CMD_SET_INTERFACE = 0x2 + NCSI_CMD_CLEAR_INTERFACE = 0x3 + NCSI_ATTR_UNSPEC = 0x0 + NCSI_ATTR_IFINDEX = 0x1 + NCSI_ATTR_PACKAGE_LIST = 0x2 + NCSI_ATTR_PACKAGE_ID = 0x3 + NCSI_ATTR_CHANNEL_ID = 0x4 + NCSI_PKG_ATTR_UNSPEC = 0x0 + NCSI_PKG_ATTR = 0x1 + NCSI_PKG_ATTR_ID = 0x2 + NCSI_PKG_ATTR_FORCED = 0x3 + NCSI_PKG_ATTR_CHANNEL_LIST = 0x4 + NCSI_CHANNEL_ATTR_UNSPEC = 0x0 + NCSI_CHANNEL_ATTR = 0x1 + NCSI_CHANNEL_ATTR_ID = 0x2 + NCSI_CHANNEL_ATTR_VERSION_MAJOR = 0x3 + NCSI_CHANNEL_ATTR_VERSION_MINOR = 0x4 + NCSI_CHANNEL_ATTR_VERSION_STR = 0x5 + NCSI_CHANNEL_ATTR_LINK_STATE = 0x6 + NCSI_CHANNEL_ATTR_ACTIVE = 0x7 + NCSI_CHANNEL_ATTR_FORCED = 0x8 + NCSI_CHANNEL_ATTR_VLAN_LIST = 0x9 + NCSI_CHANNEL_ATTR_VLAN_ID = 0xa +) + +const ( + SOF_TIMESTAMPING_TX_HARDWARE = 0x1 + SOF_TIMESTAMPING_TX_SOFTWARE = 0x2 + SOF_TIMESTAMPING_RX_HARDWARE = 0x4 + SOF_TIMESTAMPING_RX_SOFTWARE = 0x8 + SOF_TIMESTAMPING_SOFTWARE = 0x10 + SOF_TIMESTAMPING_SYS_HARDWARE = 0x20 + SOF_TIMESTAMPING_RAW_HARDWARE = 0x40 + SOF_TIMESTAMPING_OPT_ID = 0x80 + SOF_TIMESTAMPING_TX_SCHED = 0x100 + SOF_TIMESTAMPING_TX_ACK = 0x200 + SOF_TIMESTAMPING_OPT_CMSG = 0x400 + SOF_TIMESTAMPING_OPT_TSONLY = 0x800 + SOF_TIMESTAMPING_OPT_STATS = 0x1000 + SOF_TIMESTAMPING_OPT_PKTINFO = 0x2000 + SOF_TIMESTAMPING_OPT_TX_SWHW = 0x4000 + + SOF_TIMESTAMPING_LAST = 0x4000 + SOF_TIMESTAMPING_MASK = 0x7fff +) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go new file mode 100644 index 00000000..60ae71e6 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go @@ -0,0 +1,2016 @@ +// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build riscv64,linux + +package unix + +const ( + SizeofPtr = 0x8 + SizeofShort = 0x2 + SizeofInt = 0x4 + SizeofLong = 0x8 + SizeofLongLong = 0x8 + PathMax = 0x1000 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Timex struct { + Modes uint32 + _ [4]byte + Offset int64 + Freq int64 + Maxerror int64 + Esterror int64 + Status int32 + _ [4]byte + Constant int64 + Precision int64 + Tolerance int64 + Time Timeval + Tick int64 + Ppsfreq int64 + Jitter int64 + Shift int32 + _ [4]byte + Stabil int64 + Jitcnt int64 + Calcnt int64 + Errcnt int64 + Stbcnt int64 + Tai int32 + _ [44]byte +} + +type Time_t int64 + +type Tms struct { + Utime int64 + Stime int64 + Cutime int64 + Cstime int64 +} + +type Utimbuf struct { + Actime int64 + Modtime int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint64 + Ino uint64 + Mode uint32 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev uint64 + _ uint64 + Size int64 + Blksize int32 + _ int32 + Blocks int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + _ [2]int32 +} + +type StatxTimestamp struct { + Sec int64 + Nsec uint32 + _ int32 +} + +type Statx_t struct { + Mask uint32 + Blksize uint32 + Attributes uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Mode uint16 + _ [1]uint16 + Ino uint64 + Size uint64 + Blocks uint64 + Attributes_mask uint64 + Atime StatxTimestamp + Btime StatxTimestamp + Ctime StatxTimestamp + Mtime StatxTimestamp + Rdev_major uint32 + Rdev_minor uint32 + Dev_major uint32 + Dev_minor uint32 + _ [14]uint64 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]uint8 + _ [5]byte +} + +type Fsid struct { + Val [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + _ [4]byte + Start int64 + Len int64 + Pid int32 + _ [4]byte +} + +type FscryptPolicy struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptKey struct { + Mode uint32 + Raw [64]uint8 + Size uint32 +} + +type KeyctlDHParams struct { + Private int32 + Prime int32 + Base int32 +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]uint8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddrL2 struct { + Family uint16 + Psm uint16 + Bdaddr [6]uint8 + Cid uint16 + Bdaddr_type uint8 + _ [1]byte +} + +type RawSockaddrRFCOMM struct { + Family uint16 + Bdaddr [6]uint8 + Channel uint8 + _ [1]byte +} + +type RawSockaddrCAN struct { + Family uint16 + _ [2]byte + Ifindex int32 + Addr [8]byte +} + +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + +type RawSockaddrXDP struct { + Family uint16 + Flags uint16 + Ifindex uint32 + Queue_id uint32 + Shared_umem_fd uint32 +} + +type RawSockaddr struct { + Family uint16 + Data [14]uint8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]uint8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type PacketMreq struct { + Ifindex int32 + Type uint16 + Alen uint16 + Address [8]uint8 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + _ [4]byte + Iov *Iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + _ [4]byte +} + +type Cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + _ [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofSockaddrL2 = 0xe + SizeofSockaddrRFCOMM = 0xa + SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 + SizeofSockaddrXDP = 0x10 + SizeofLinger = 0x8 + SizeofIovec = 0x10 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofPacketMreq = 0x10 + SizeofMsghdr = 0x38 + SizeofCmsghdr = 0x10 + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_INFO_KIND = 0x1 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_NUM_VF = 0x15 + IFLA_VFINFO_LIST = 0x16 + IFLA_STATS64 = 0x17 + IFLA_VF_PORTS = 0x18 + IFLA_PORT_SELF = 0x19 + IFLA_AF_SPEC = 0x1a + IFLA_GROUP = 0x1b + IFLA_NET_NS_FD = 0x1c + IFLA_EXT_MASK = 0x1d + IFLA_PROMISCUITY = 0x1e + IFLA_NUM_TX_QUEUES = 0x1f + IFLA_NUM_RX_QUEUES = 0x20 + IFLA_CARRIER = 0x21 + IFLA_PHYS_PORT_ID = 0x22 + IFLA_CARRIER_CHANGES = 0x23 + IFLA_PHYS_SWITCH_ID = 0x24 + IFLA_LINK_NETNSID = 0x25 + IFLA_PHYS_PORT_NAME = 0x26 + IFLA_PROTO_DOWN = 0x27 + IFLA_GSO_MAX_SEGS = 0x28 + IFLA_GSO_MAX_SIZE = 0x29 + IFLA_PAD = 0x2a + IFLA_XDP = 0x2b + IFLA_EVENT = 0x2c + IFLA_NEW_NETNSID = 0x2d + IFLA_IF_NETNSID = 0x2e + IFLA_MAX = 0x33 + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTA_MARK = 0x10 + RTA_MFC_STATS = 0x11 + RTA_VIA = 0x12 + RTA_NEWDST = 0x13 + RTA_PREF = 0x14 + RTA_ENCAP_TYPE = 0x15 + RTA_ENCAP = 0x16 + RTA_EXPIRES = 0x17 + RTA_PAD = 0x18 + RTA_UID = 0x19 + RTA_TTL_PROPAGATE = 0x1a + RTA_IP_PROTO = 0x1b + RTA_SPORT = 0x1c + RTA_DPORT = 0x1d + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + _ uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x10 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + _ [6]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + Pc uint64 + Ra uint64 + Sp uint64 + Gp uint64 + Tp uint64 + T0 uint64 + T1 uint64 + T2 uint64 + S0 uint64 + S1 uint64 + A0 uint64 + A1 uint64 + A2 uint64 + A3 uint64 + A4 uint64 + A5 uint64 + A6 uint64 + A7 uint64 + S2 uint64 + S3 uint64 + S4 uint64 + S5 uint64 + S6 uint64 + S7 uint64 + S8 uint64 + S9 uint64 + S10 uint64 + S11 uint64 + T3 uint64 + T4 uint64 + T5 uint64 + T6 uint64 +} + +type FdSet struct { + Bits [16]int64 +} + +type Sysinfo_t struct { + Uptime int64 + Loads [3]uint64 + Totalram uint64 + Freeram uint64 + Sharedram uint64 + Bufferram uint64 + Totalswap uint64 + Freeswap uint64 + Procs uint16 + Pad uint16 + _ [4]byte + Totalhigh uint64 + Freehigh uint64 + Unit uint32 + _ [0]uint8 + _ [4]byte +} + +type Utsname struct { + Sysname [65]byte + Nodename [65]byte + Release [65]byte + Version [65]byte + Machine [65]byte + Domainname [65]byte +} + +type Ustat_t struct { + Tfree int32 + _ [4]byte + Tinode uint64 + Fname [6]uint8 + Fpack [6]uint8 + _ [4]byte +} + +type EpollEvent struct { + Events uint32 + Fd int32 + Pad int32 +} + +const ( + AT_EMPTY_PATH = 0x1000 + AT_FDCWD = -0x64 + AT_NO_AUTOMOUNT = 0x800 + AT_REMOVEDIR = 0x200 + + AT_STATX_SYNC_AS_STAT = 0x0 + AT_STATX_FORCE_SYNC = 0x2000 + AT_STATX_DONT_SYNC = 0x4000 + + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 + + AT_EACCESS = 0x200 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x2000 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Sigset_t struct { + Val [16]uint64 +} + +const RNDGETENTCNT = 0x80045200 + +const PERF_IOC_FLAG_GROUP = 0x1 + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Line uint8 + Cc [19]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Taskstats struct { + Version uint16 + _ [2]byte + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + _ [6]byte + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]uint8 + Ac_sched uint8 + Ac_pad [3]uint8 + _ [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + _ [4]byte + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 +} + +const ( + TASKSTATS_CMD_UNSPEC = 0x0 + TASKSTATS_CMD_GET = 0x1 + TASKSTATS_CMD_NEW = 0x2 + TASKSTATS_TYPE_UNSPEC = 0x0 + TASKSTATS_TYPE_PID = 0x1 + TASKSTATS_TYPE_TGID = 0x2 + TASKSTATS_TYPE_STATS = 0x3 + TASKSTATS_TYPE_AGGR_PID = 0x4 + TASKSTATS_TYPE_AGGR_TGID = 0x5 + TASKSTATS_TYPE_NULL = 0x6 + TASKSTATS_CMD_ATTR_UNSPEC = 0x0 + TASKSTATS_CMD_ATTR_PID = 0x1 + TASKSTATS_CMD_ATTR_TGID = 0x2 + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 +) + +type CGroupStats struct { + Sleeping uint64 + Running uint64 + Stopped uint64 + Uninterruptible uint64 + Io_wait uint64 +} + +const ( + CGROUPSTATS_CMD_UNSPEC = 0x3 + CGROUPSTATS_CMD_GET = 0x4 + CGROUPSTATS_CMD_NEW = 0x5 + CGROUPSTATS_TYPE_UNSPEC = 0x0 + CGROUPSTATS_TYPE_CGROUP_STATS = 0x1 + CGROUPSTATS_CMD_ATTR_UNSPEC = 0x0 + CGROUPSTATS_CMD_ATTR_FD = 0x1 +) + +type Genlmsghdr struct { + Cmd uint8 + Version uint8 + Reserved uint16 +} + +const ( + CTRL_CMD_UNSPEC = 0x0 + CTRL_CMD_NEWFAMILY = 0x1 + CTRL_CMD_DELFAMILY = 0x2 + CTRL_CMD_GETFAMILY = 0x3 + CTRL_CMD_NEWOPS = 0x4 + CTRL_CMD_DELOPS = 0x5 + CTRL_CMD_GETOPS = 0x6 + CTRL_CMD_NEWMCAST_GRP = 0x7 + CTRL_CMD_DELMCAST_GRP = 0x8 + CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_ATTR_UNSPEC = 0x0 + CTRL_ATTR_FAMILY_ID = 0x1 + CTRL_ATTR_FAMILY_NAME = 0x2 + CTRL_ATTR_VERSION = 0x3 + CTRL_ATTR_HDRSIZE = 0x4 + CTRL_ATTR_MAXATTR = 0x5 + CTRL_ATTR_OPS = 0x6 + CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_OP_UNSPEC = 0x0 + CTRL_ATTR_OP_ID = 0x1 + CTRL_ATTR_OP_FLAGS = 0x2 + CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 + CTRL_ATTR_MCAST_GRP_NAME = 0x1 + CTRL_ATTR_MCAST_GRP_ID = 0x2 +) + +type cpuMask uint64 + +const ( + _CPU_SETSIZE = 0x400 + _NCPUBITS = 0x40 +) + +const ( + BDADDR_BREDR = 0x0 + BDADDR_LE_PUBLIC = 0x1 + BDADDR_LE_RANDOM = 0x2 +) + +type PerfEventAttr struct { + Type uint32 + Size uint32 + Config uint64 + Sample uint64 + Sample_type uint64 + Read_format uint64 + Bits uint64 + Wakeup uint32 + Bp_type uint32 + Ext1 uint64 + Ext2 uint64 + Branch_sample_type uint64 + Sample_regs_user uint64 + Sample_stack_user uint32 + Clockid int32 + Sample_regs_intr uint64 + Aux_watermark uint32 + _ uint32 +} + +type PerfEventMmapPage struct { + Version uint32 + Compat_version uint32 + Lock uint32 + Index uint32 + Offset int64 + Time_enabled uint64 + Time_running uint64 + Capabilities uint64 + Pmc_width uint16 + Time_shift uint16 + Time_mult uint32 + Time_offset uint64 + Time_zero uint64 + Size uint32 + _ [948]uint8 + Data_head uint64 + Data_tail uint64 + Data_offset uint64 + Data_size uint64 + Aux_head uint64 + Aux_tail uint64 + Aux_offset uint64 + Aux_size uint64 +} + +const ( + PerfBitDisabled uint64 = CBitFieldMaskBit0 + PerfBitInherit = CBitFieldMaskBit1 + PerfBitPinned = CBitFieldMaskBit2 + PerfBitExclusive = CBitFieldMaskBit3 + PerfBitExcludeUser = CBitFieldMaskBit4 + PerfBitExcludeKernel = CBitFieldMaskBit5 + PerfBitExcludeHv = CBitFieldMaskBit6 + PerfBitExcludeIdle = CBitFieldMaskBit7 + PerfBitMmap = CBitFieldMaskBit8 + PerfBitComm = CBitFieldMaskBit9 + PerfBitFreq = CBitFieldMaskBit10 + PerfBitInheritStat = CBitFieldMaskBit11 + PerfBitEnableOnExec = CBitFieldMaskBit12 + PerfBitTask = CBitFieldMaskBit13 + PerfBitWatermark = CBitFieldMaskBit14 + PerfBitPreciseIPBit1 = CBitFieldMaskBit15 + PerfBitPreciseIPBit2 = CBitFieldMaskBit16 + PerfBitMmapData = CBitFieldMaskBit17 + PerfBitSampleIDAll = CBitFieldMaskBit18 + PerfBitExcludeHost = CBitFieldMaskBit19 + PerfBitExcludeGuest = CBitFieldMaskBit20 + PerfBitExcludeCallchainKernel = CBitFieldMaskBit21 + PerfBitExcludeCallchainUser = CBitFieldMaskBit22 + PerfBitMmap2 = CBitFieldMaskBit23 + PerfBitCommExec = CBitFieldMaskBit24 + PerfBitUseClockID = CBitFieldMaskBit25 + PerfBitContextSwitch = CBitFieldMaskBit26 +) + +const ( + PERF_TYPE_HARDWARE = 0x0 + PERF_TYPE_SOFTWARE = 0x1 + PERF_TYPE_TRACEPOINT = 0x2 + PERF_TYPE_HW_CACHE = 0x3 + PERF_TYPE_RAW = 0x4 + PERF_TYPE_BREAKPOINT = 0x5 + + PERF_COUNT_HW_CPU_CYCLES = 0x0 + PERF_COUNT_HW_INSTRUCTIONS = 0x1 + PERF_COUNT_HW_CACHE_REFERENCES = 0x2 + PERF_COUNT_HW_CACHE_MISSES = 0x3 + PERF_COUNT_HW_BRANCH_INSTRUCTIONS = 0x4 + PERF_COUNT_HW_BRANCH_MISSES = 0x5 + PERF_COUNT_HW_BUS_CYCLES = 0x6 + PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 0x7 + PERF_COUNT_HW_STALLED_CYCLES_BACKEND = 0x8 + PERF_COUNT_HW_REF_CPU_CYCLES = 0x9 + + PERF_COUNT_HW_CACHE_L1D = 0x0 + PERF_COUNT_HW_CACHE_L1I = 0x1 + PERF_COUNT_HW_CACHE_LL = 0x2 + PERF_COUNT_HW_CACHE_DTLB = 0x3 + PERF_COUNT_HW_CACHE_ITLB = 0x4 + PERF_COUNT_HW_CACHE_BPU = 0x5 + PERF_COUNT_HW_CACHE_NODE = 0x6 + + PERF_COUNT_HW_CACHE_OP_READ = 0x0 + PERF_COUNT_HW_CACHE_OP_WRITE = 0x1 + PERF_COUNT_HW_CACHE_OP_PREFETCH = 0x2 + + PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0x0 + PERF_COUNT_HW_CACHE_RESULT_MISS = 0x1 + + PERF_COUNT_SW_CPU_CLOCK = 0x0 + PERF_COUNT_SW_TASK_CLOCK = 0x1 + PERF_COUNT_SW_PAGE_FAULTS = 0x2 + PERF_COUNT_SW_CONTEXT_SWITCHES = 0x3 + PERF_COUNT_SW_CPU_MIGRATIONS = 0x4 + PERF_COUNT_SW_PAGE_FAULTS_MIN = 0x5 + PERF_COUNT_SW_PAGE_FAULTS_MAJ = 0x6 + PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7 + PERF_COUNT_SW_EMULATION_FAULTS = 0x8 + PERF_COUNT_SW_DUMMY = 0x9 + + PERF_SAMPLE_IP = 0x1 + PERF_SAMPLE_TID = 0x2 + PERF_SAMPLE_TIME = 0x4 + PERF_SAMPLE_ADDR = 0x8 + PERF_SAMPLE_READ = 0x10 + PERF_SAMPLE_CALLCHAIN = 0x20 + PERF_SAMPLE_ID = 0x40 + PERF_SAMPLE_CPU = 0x80 + PERF_SAMPLE_PERIOD = 0x100 + PERF_SAMPLE_STREAM_ID = 0x200 + PERF_SAMPLE_RAW = 0x400 + PERF_SAMPLE_BRANCH_STACK = 0x800 + + PERF_SAMPLE_BRANCH_USER = 0x1 + PERF_SAMPLE_BRANCH_KERNEL = 0x2 + PERF_SAMPLE_BRANCH_HV = 0x4 + PERF_SAMPLE_BRANCH_ANY = 0x8 + PERF_SAMPLE_BRANCH_ANY_CALL = 0x10 + PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20 + PERF_SAMPLE_BRANCH_IND_CALL = 0x40 + + PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1 + PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2 + PERF_FORMAT_ID = 0x4 + PERF_FORMAT_GROUP = 0x8 + + PERF_RECORD_MMAP = 0x1 + PERF_RECORD_LOST = 0x2 + PERF_RECORD_COMM = 0x3 + PERF_RECORD_EXIT = 0x4 + PERF_RECORD_THROTTLE = 0x5 + PERF_RECORD_UNTHROTTLE = 0x6 + PERF_RECORD_FORK = 0x7 + PERF_RECORD_READ = 0x8 + PERF_RECORD_SAMPLE = 0x9 + + PERF_CONTEXT_HV = -0x20 + PERF_CONTEXT_KERNEL = -0x80 + PERF_CONTEXT_USER = -0x200 + + PERF_CONTEXT_GUEST = -0x800 + PERF_CONTEXT_GUEST_KERNEL = -0x880 + PERF_CONTEXT_GUEST_USER = -0xa00 + + PERF_FLAG_FD_NO_GROUP = 0x1 + PERF_FLAG_FD_OUTPUT = 0x2 + PERF_FLAG_PID_CGROUP = 0x4 +) + +const ( + CBitFieldMaskBit0 = 0x1 + CBitFieldMaskBit1 = 0x2 + CBitFieldMaskBit2 = 0x4 + CBitFieldMaskBit3 = 0x8 + CBitFieldMaskBit4 = 0x10 + CBitFieldMaskBit5 = 0x20 + CBitFieldMaskBit6 = 0x40 + CBitFieldMaskBit7 = 0x80 + CBitFieldMaskBit8 = 0x100 + CBitFieldMaskBit9 = 0x200 + CBitFieldMaskBit10 = 0x400 + CBitFieldMaskBit11 = 0x800 + CBitFieldMaskBit12 = 0x1000 + CBitFieldMaskBit13 = 0x2000 + CBitFieldMaskBit14 = 0x4000 + CBitFieldMaskBit15 = 0x8000 + CBitFieldMaskBit16 = 0x10000 + CBitFieldMaskBit17 = 0x20000 + CBitFieldMaskBit18 = 0x40000 + CBitFieldMaskBit19 = 0x80000 + CBitFieldMaskBit20 = 0x100000 + CBitFieldMaskBit21 = 0x200000 + CBitFieldMaskBit22 = 0x400000 + CBitFieldMaskBit23 = 0x800000 + CBitFieldMaskBit24 = 0x1000000 + CBitFieldMaskBit25 = 0x2000000 + CBitFieldMaskBit26 = 0x4000000 + CBitFieldMaskBit27 = 0x8000000 + CBitFieldMaskBit28 = 0x10000000 + CBitFieldMaskBit29 = 0x20000000 + CBitFieldMaskBit30 = 0x40000000 + CBitFieldMaskBit31 = 0x80000000 + CBitFieldMaskBit32 = 0x100000000 + CBitFieldMaskBit33 = 0x200000000 + CBitFieldMaskBit34 = 0x400000000 + CBitFieldMaskBit35 = 0x800000000 + CBitFieldMaskBit36 = 0x1000000000 + CBitFieldMaskBit37 = 0x2000000000 + CBitFieldMaskBit38 = 0x4000000000 + CBitFieldMaskBit39 = 0x8000000000 + CBitFieldMaskBit40 = 0x10000000000 + CBitFieldMaskBit41 = 0x20000000000 + CBitFieldMaskBit42 = 0x40000000000 + CBitFieldMaskBit43 = 0x80000000000 + CBitFieldMaskBit44 = 0x100000000000 + CBitFieldMaskBit45 = 0x200000000000 + CBitFieldMaskBit46 = 0x400000000000 + CBitFieldMaskBit47 = 0x800000000000 + CBitFieldMaskBit48 = 0x1000000000000 + CBitFieldMaskBit49 = 0x2000000000000 + CBitFieldMaskBit50 = 0x4000000000000 + CBitFieldMaskBit51 = 0x8000000000000 + CBitFieldMaskBit52 = 0x10000000000000 + CBitFieldMaskBit53 = 0x20000000000000 + CBitFieldMaskBit54 = 0x40000000000000 + CBitFieldMaskBit55 = 0x80000000000000 + CBitFieldMaskBit56 = 0x100000000000000 + CBitFieldMaskBit57 = 0x200000000000000 + CBitFieldMaskBit58 = 0x400000000000000 + CBitFieldMaskBit59 = 0x800000000000000 + CBitFieldMaskBit60 = 0x1000000000000000 + CBitFieldMaskBit61 = 0x2000000000000000 + CBitFieldMaskBit62 = 0x4000000000000000 + CBitFieldMaskBit63 = 0x8000000000000000 +) + +type SockaddrStorage struct { + Family uint16 + _ [118]uint8 + _ uint64 +} + +type TCPMD5Sig struct { + Addr SockaddrStorage + Flags uint8 + Prefixlen uint8 + Keylen uint16 + _ uint32 + Key [80]uint8 +} + +type HDDriveCmdHdr struct { + Command uint8 + Number uint8 + Feature uint8 + Count uint8 +} + +type HDGeometry struct { + Heads uint8 + Sectors uint8 + Cylinders uint16 + _ [4]byte + Start uint64 +} + +type HDDriveID struct { + Config uint16 + Cyls uint16 + Reserved2 uint16 + Heads uint16 + Track_bytes uint16 + Sector_bytes uint16 + Sectors uint16 + Vendor0 uint16 + Vendor1 uint16 + Vendor2 uint16 + Serial_no [20]uint8 + Buf_type uint16 + Buf_size uint16 + Ecc_bytes uint16 + Fw_rev [8]uint8 + Model [40]uint8 + Max_multsect uint8 + Vendor3 uint8 + Dword_io uint16 + Vendor4 uint8 + Capability uint8 + Reserved50 uint16 + Vendor5 uint8 + TPIO uint8 + Vendor6 uint8 + TDMA uint8 + Field_valid uint16 + Cur_cyls uint16 + Cur_heads uint16 + Cur_sectors uint16 + Cur_capacity0 uint16 + Cur_capacity1 uint16 + Multsect uint8 + Multsect_valid uint8 + Lba_capacity uint32 + Dma_1word uint16 + Dma_mword uint16 + Eide_pio_modes uint16 + Eide_dma_min uint16 + Eide_dma_time uint16 + Eide_pio uint16 + Eide_pio_iordy uint16 + Words69_70 [2]uint16 + Words71_74 [4]uint16 + Queue_depth uint16 + Words76_79 [4]uint16 + Major_rev_num uint16 + Minor_rev_num uint16 + Command_set_1 uint16 + Command_set_2 uint16 + Cfsse uint16 + Cfs_enable_1 uint16 + Cfs_enable_2 uint16 + Csf_default uint16 + Dma_ultra uint16 + Trseuc uint16 + TrsEuc uint16 + CurAPMvalues uint16 + Mprc uint16 + Hw_config uint16 + Acoustic uint16 + Msrqs uint16 + Sxfert uint16 + Sal uint16 + Spg uint32 + Lba_capacity_2 uint64 + Words104_125 [22]uint16 + Last_lun uint16 + Word127 uint16 + Dlf uint16 + Csfo uint16 + Words130_155 [26]uint16 + Word156 uint16 + Words157_159 [3]uint16 + Cfa_power uint16 + Words161_175 [15]uint16 + Words176_205 [30]uint16 + Words206_254 [49]uint16 + Integrity_word uint16 +} + +type Statfs_t struct { + Type int64 + Bsize int64 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Namelen int64 + Frsize int64 + Flags int64 + Spare [4]int64 +} + +const ( + ST_MANDLOCK = 0x40 + ST_NOATIME = 0x400 + ST_NODEV = 0x4 + ST_NODIRATIME = 0x800 + ST_NOEXEC = 0x8 + ST_NOSUID = 0x2 + ST_RDONLY = 0x1 + ST_RELATIME = 0x1000 + ST_SYNCHRONOUS = 0x10 +) + +type TpacketHdr struct { + Status uint64 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Sec uint32 + Usec uint32 + _ [4]byte +} + +type Tpacket2Hdr struct { + Status uint32 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Sec uint32 + Nsec uint32 + Vlan_tci uint16 + Vlan_tpid uint16 + _ [4]uint8 +} + +type Tpacket3Hdr struct { + Next_offset uint32 + Sec uint32 + Nsec uint32 + Snaplen uint32 + Len uint32 + Status uint32 + Mac uint16 + Net uint16 + Hv1 TpacketHdrVariant1 + _ [8]uint8 +} + +type TpacketHdrVariant1 struct { + Rxhash uint32 + Vlan_tci uint32 + Vlan_tpid uint16 + _ uint16 +} + +type TpacketBlockDesc struct { + Version uint32 + To_priv uint32 + Hdr [40]byte +} + +type TpacketReq struct { + Block_size uint32 + Block_nr uint32 + Frame_size uint32 + Frame_nr uint32 +} + +type TpacketReq3 struct { + Block_size uint32 + Block_nr uint32 + Frame_size uint32 + Frame_nr uint32 + Retire_blk_tov uint32 + Sizeof_priv uint32 + Feature_req_word uint32 +} + +type TpacketStats struct { + Packets uint32 + Drops uint32 +} + +type TpacketStatsV3 struct { + Packets uint32 + Drops uint32 + Freeze_q_cnt uint32 +} + +type TpacketAuxdata struct { + Status uint32 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Vlan_tci uint16 + Vlan_tpid uint16 +} + +const ( + TPACKET_V1 = 0x0 + TPACKET_V2 = 0x1 + TPACKET_V3 = 0x2 +) + +const ( + SizeofTpacketHdr = 0x20 + SizeofTpacket2Hdr = 0x20 + SizeofTpacket3Hdr = 0x30 +) + +const ( + NF_INET_PRE_ROUTING = 0x0 + NF_INET_LOCAL_IN = 0x1 + NF_INET_FORWARD = 0x2 + NF_INET_LOCAL_OUT = 0x3 + NF_INET_POST_ROUTING = 0x4 + NF_INET_NUMHOOKS = 0x5 +) + +const ( + NF_NETDEV_INGRESS = 0x0 + NF_NETDEV_NUMHOOKS = 0x1 +) + +const ( + NFPROTO_UNSPEC = 0x0 + NFPROTO_INET = 0x1 + NFPROTO_IPV4 = 0x2 + NFPROTO_ARP = 0x3 + NFPROTO_NETDEV = 0x5 + NFPROTO_BRIDGE = 0x7 + NFPROTO_IPV6 = 0xa + NFPROTO_DECNET = 0xc + NFPROTO_NUMPROTO = 0xd +) + +type Nfgenmsg struct { + Nfgen_family uint8 + Version uint8 + Res_id uint16 +} + +const ( + NFNL_BATCH_UNSPEC = 0x0 + NFNL_BATCH_GENID = 0x1 +) + +const ( + NFT_REG_VERDICT = 0x0 + NFT_REG_1 = 0x1 + NFT_REG_2 = 0x2 + NFT_REG_3 = 0x3 + NFT_REG_4 = 0x4 + NFT_REG32_00 = 0x8 + NFT_REG32_01 = 0x9 + NFT_REG32_02 = 0xa + NFT_REG32_03 = 0xb + NFT_REG32_04 = 0xc + NFT_REG32_05 = 0xd + NFT_REG32_06 = 0xe + NFT_REG32_07 = 0xf + NFT_REG32_08 = 0x10 + NFT_REG32_09 = 0x11 + NFT_REG32_10 = 0x12 + NFT_REG32_11 = 0x13 + NFT_REG32_12 = 0x14 + NFT_REG32_13 = 0x15 + NFT_REG32_14 = 0x16 + NFT_REG32_15 = 0x17 + NFT_CONTINUE = -0x1 + NFT_BREAK = -0x2 + NFT_JUMP = -0x3 + NFT_GOTO = -0x4 + NFT_RETURN = -0x5 + NFT_MSG_NEWTABLE = 0x0 + NFT_MSG_GETTABLE = 0x1 + NFT_MSG_DELTABLE = 0x2 + NFT_MSG_NEWCHAIN = 0x3 + NFT_MSG_GETCHAIN = 0x4 + NFT_MSG_DELCHAIN = 0x5 + NFT_MSG_NEWRULE = 0x6 + NFT_MSG_GETRULE = 0x7 + NFT_MSG_DELRULE = 0x8 + NFT_MSG_NEWSET = 0x9 + NFT_MSG_GETSET = 0xa + NFT_MSG_DELSET = 0xb + NFT_MSG_NEWSETELEM = 0xc + NFT_MSG_GETSETELEM = 0xd + NFT_MSG_DELSETELEM = 0xe + NFT_MSG_NEWGEN = 0xf + NFT_MSG_GETGEN = 0x10 + NFT_MSG_TRACE = 0x11 + NFT_MSG_NEWOBJ = 0x12 + NFT_MSG_GETOBJ = 0x13 + NFT_MSG_DELOBJ = 0x14 + NFT_MSG_GETOBJ_RESET = 0x15 + NFT_MSG_MAX = 0x19 + NFTA_LIST_UNPEC = 0x0 + NFTA_LIST_ELEM = 0x1 + NFTA_HOOK_UNSPEC = 0x0 + NFTA_HOOK_HOOKNUM = 0x1 + NFTA_HOOK_PRIORITY = 0x2 + NFTA_HOOK_DEV = 0x3 + NFT_TABLE_F_DORMANT = 0x1 + NFTA_TABLE_UNSPEC = 0x0 + NFTA_TABLE_NAME = 0x1 + NFTA_TABLE_FLAGS = 0x2 + NFTA_TABLE_USE = 0x3 + NFTA_CHAIN_UNSPEC = 0x0 + NFTA_CHAIN_TABLE = 0x1 + NFTA_CHAIN_HANDLE = 0x2 + NFTA_CHAIN_NAME = 0x3 + NFTA_CHAIN_HOOK = 0x4 + NFTA_CHAIN_POLICY = 0x5 + NFTA_CHAIN_USE = 0x6 + NFTA_CHAIN_TYPE = 0x7 + NFTA_CHAIN_COUNTERS = 0x8 + NFTA_CHAIN_PAD = 0x9 + NFTA_RULE_UNSPEC = 0x0 + NFTA_RULE_TABLE = 0x1 + NFTA_RULE_CHAIN = 0x2 + NFTA_RULE_HANDLE = 0x3 + NFTA_RULE_EXPRESSIONS = 0x4 + NFTA_RULE_COMPAT = 0x5 + NFTA_RULE_POSITION = 0x6 + NFTA_RULE_USERDATA = 0x7 + NFTA_RULE_PAD = 0x8 + NFTA_RULE_ID = 0x9 + NFT_RULE_COMPAT_F_INV = 0x2 + NFT_RULE_COMPAT_F_MASK = 0x2 + NFTA_RULE_COMPAT_UNSPEC = 0x0 + NFTA_RULE_COMPAT_PROTO = 0x1 + NFTA_RULE_COMPAT_FLAGS = 0x2 + NFT_SET_ANONYMOUS = 0x1 + NFT_SET_CONSTANT = 0x2 + NFT_SET_INTERVAL = 0x4 + NFT_SET_MAP = 0x8 + NFT_SET_TIMEOUT = 0x10 + NFT_SET_EVAL = 0x20 + NFT_SET_OBJECT = 0x40 + NFT_SET_POL_PERFORMANCE = 0x0 + NFT_SET_POL_MEMORY = 0x1 + NFTA_SET_DESC_UNSPEC = 0x0 + NFTA_SET_DESC_SIZE = 0x1 + NFTA_SET_UNSPEC = 0x0 + NFTA_SET_TABLE = 0x1 + NFTA_SET_NAME = 0x2 + NFTA_SET_FLAGS = 0x3 + NFTA_SET_KEY_TYPE = 0x4 + NFTA_SET_KEY_LEN = 0x5 + NFTA_SET_DATA_TYPE = 0x6 + NFTA_SET_DATA_LEN = 0x7 + NFTA_SET_POLICY = 0x8 + NFTA_SET_DESC = 0x9 + NFTA_SET_ID = 0xa + NFTA_SET_TIMEOUT = 0xb + NFTA_SET_GC_INTERVAL = 0xc + NFTA_SET_USERDATA = 0xd + NFTA_SET_PAD = 0xe + NFTA_SET_OBJ_TYPE = 0xf + NFT_SET_ELEM_INTERVAL_END = 0x1 + NFTA_SET_ELEM_UNSPEC = 0x0 + NFTA_SET_ELEM_KEY = 0x1 + NFTA_SET_ELEM_DATA = 0x2 + NFTA_SET_ELEM_FLAGS = 0x3 + NFTA_SET_ELEM_TIMEOUT = 0x4 + NFTA_SET_ELEM_EXPIRATION = 0x5 + NFTA_SET_ELEM_USERDATA = 0x6 + NFTA_SET_ELEM_EXPR = 0x7 + NFTA_SET_ELEM_PAD = 0x8 + NFTA_SET_ELEM_OBJREF = 0x9 + NFTA_SET_ELEM_LIST_UNSPEC = 0x0 + NFTA_SET_ELEM_LIST_TABLE = 0x1 + NFTA_SET_ELEM_LIST_SET = 0x2 + NFTA_SET_ELEM_LIST_ELEMENTS = 0x3 + NFTA_SET_ELEM_LIST_SET_ID = 0x4 + NFT_DATA_VALUE = 0x0 + NFT_DATA_VERDICT = 0xffffff00 + NFTA_DATA_UNSPEC = 0x0 + NFTA_DATA_VALUE = 0x1 + NFTA_DATA_VERDICT = 0x2 + NFTA_VERDICT_UNSPEC = 0x0 + NFTA_VERDICT_CODE = 0x1 + NFTA_VERDICT_CHAIN = 0x2 + NFTA_EXPR_UNSPEC = 0x0 + NFTA_EXPR_NAME = 0x1 + NFTA_EXPR_DATA = 0x2 + NFTA_IMMEDIATE_UNSPEC = 0x0 + NFTA_IMMEDIATE_DREG = 0x1 + NFTA_IMMEDIATE_DATA = 0x2 + NFTA_BITWISE_UNSPEC = 0x0 + NFTA_BITWISE_SREG = 0x1 + NFTA_BITWISE_DREG = 0x2 + NFTA_BITWISE_LEN = 0x3 + NFTA_BITWISE_MASK = 0x4 + NFTA_BITWISE_XOR = 0x5 + NFT_BYTEORDER_NTOH = 0x0 + NFT_BYTEORDER_HTON = 0x1 + NFTA_BYTEORDER_UNSPEC = 0x0 + NFTA_BYTEORDER_SREG = 0x1 + NFTA_BYTEORDER_DREG = 0x2 + NFTA_BYTEORDER_OP = 0x3 + NFTA_BYTEORDER_LEN = 0x4 + NFTA_BYTEORDER_SIZE = 0x5 + NFT_CMP_EQ = 0x0 + NFT_CMP_NEQ = 0x1 + NFT_CMP_LT = 0x2 + NFT_CMP_LTE = 0x3 + NFT_CMP_GT = 0x4 + NFT_CMP_GTE = 0x5 + NFTA_CMP_UNSPEC = 0x0 + NFTA_CMP_SREG = 0x1 + NFTA_CMP_OP = 0x2 + NFTA_CMP_DATA = 0x3 + NFT_RANGE_EQ = 0x0 + NFT_RANGE_NEQ = 0x1 + NFTA_RANGE_UNSPEC = 0x0 + NFTA_RANGE_SREG = 0x1 + NFTA_RANGE_OP = 0x2 + NFTA_RANGE_FROM_DATA = 0x3 + NFTA_RANGE_TO_DATA = 0x4 + NFT_LOOKUP_F_INV = 0x1 + NFTA_LOOKUP_UNSPEC = 0x0 + NFTA_LOOKUP_SET = 0x1 + NFTA_LOOKUP_SREG = 0x2 + NFTA_LOOKUP_DREG = 0x3 + NFTA_LOOKUP_SET_ID = 0x4 + NFTA_LOOKUP_FLAGS = 0x5 + NFT_DYNSET_OP_ADD = 0x0 + NFT_DYNSET_OP_UPDATE = 0x1 + NFT_DYNSET_F_INV = 0x1 + NFTA_DYNSET_UNSPEC = 0x0 + NFTA_DYNSET_SET_NAME = 0x1 + NFTA_DYNSET_SET_ID = 0x2 + NFTA_DYNSET_OP = 0x3 + NFTA_DYNSET_SREG_KEY = 0x4 + NFTA_DYNSET_SREG_DATA = 0x5 + NFTA_DYNSET_TIMEOUT = 0x6 + NFTA_DYNSET_EXPR = 0x7 + NFTA_DYNSET_PAD = 0x8 + NFTA_DYNSET_FLAGS = 0x9 + NFT_PAYLOAD_LL_HEADER = 0x0 + NFT_PAYLOAD_NETWORK_HEADER = 0x1 + NFT_PAYLOAD_TRANSPORT_HEADER = 0x2 + NFT_PAYLOAD_CSUM_NONE = 0x0 + NFT_PAYLOAD_CSUM_INET = 0x1 + NFT_PAYLOAD_L4CSUM_PSEUDOHDR = 0x1 + NFTA_PAYLOAD_UNSPEC = 0x0 + NFTA_PAYLOAD_DREG = 0x1 + NFTA_PAYLOAD_BASE = 0x2 + NFTA_PAYLOAD_OFFSET = 0x3 + NFTA_PAYLOAD_LEN = 0x4 + NFTA_PAYLOAD_SREG = 0x5 + NFTA_PAYLOAD_CSUM_TYPE = 0x6 + NFTA_PAYLOAD_CSUM_OFFSET = 0x7 + NFTA_PAYLOAD_CSUM_FLAGS = 0x8 + NFT_EXTHDR_F_PRESENT = 0x1 + NFT_EXTHDR_OP_IPV6 = 0x0 + NFT_EXTHDR_OP_TCPOPT = 0x1 + NFTA_EXTHDR_UNSPEC = 0x0 + NFTA_EXTHDR_DREG = 0x1 + NFTA_EXTHDR_TYPE = 0x2 + NFTA_EXTHDR_OFFSET = 0x3 + NFTA_EXTHDR_LEN = 0x4 + NFTA_EXTHDR_FLAGS = 0x5 + NFTA_EXTHDR_OP = 0x6 + NFTA_EXTHDR_SREG = 0x7 + NFT_META_LEN = 0x0 + NFT_META_PROTOCOL = 0x1 + NFT_META_PRIORITY = 0x2 + NFT_META_MARK = 0x3 + NFT_META_IIF = 0x4 + NFT_META_OIF = 0x5 + NFT_META_IIFNAME = 0x6 + NFT_META_OIFNAME = 0x7 + NFT_META_IIFTYPE = 0x8 + NFT_META_OIFTYPE = 0x9 + NFT_META_SKUID = 0xa + NFT_META_SKGID = 0xb + NFT_META_NFTRACE = 0xc + NFT_META_RTCLASSID = 0xd + NFT_META_SECMARK = 0xe + NFT_META_NFPROTO = 0xf + NFT_META_L4PROTO = 0x10 + NFT_META_BRI_IIFNAME = 0x11 + NFT_META_BRI_OIFNAME = 0x12 + NFT_META_PKTTYPE = 0x13 + NFT_META_CPU = 0x14 + NFT_META_IIFGROUP = 0x15 + NFT_META_OIFGROUP = 0x16 + NFT_META_CGROUP = 0x17 + NFT_META_PRANDOM = 0x18 + NFT_RT_CLASSID = 0x0 + NFT_RT_NEXTHOP4 = 0x1 + NFT_RT_NEXTHOP6 = 0x2 + NFT_RT_TCPMSS = 0x3 + NFT_HASH_JENKINS = 0x0 + NFT_HASH_SYM = 0x1 + NFTA_HASH_UNSPEC = 0x0 + NFTA_HASH_SREG = 0x1 + NFTA_HASH_DREG = 0x2 + NFTA_HASH_LEN = 0x3 + NFTA_HASH_MODULUS = 0x4 + NFTA_HASH_SEED = 0x5 + NFTA_HASH_OFFSET = 0x6 + NFTA_HASH_TYPE = 0x7 + NFTA_META_UNSPEC = 0x0 + NFTA_META_DREG = 0x1 + NFTA_META_KEY = 0x2 + NFTA_META_SREG = 0x3 + NFTA_RT_UNSPEC = 0x0 + NFTA_RT_DREG = 0x1 + NFTA_RT_KEY = 0x2 + NFT_CT_STATE = 0x0 + NFT_CT_DIRECTION = 0x1 + NFT_CT_STATUS = 0x2 + NFT_CT_MARK = 0x3 + NFT_CT_SECMARK = 0x4 + NFT_CT_EXPIRATION = 0x5 + NFT_CT_HELPER = 0x6 + NFT_CT_L3PROTOCOL = 0x7 + NFT_CT_SRC = 0x8 + NFT_CT_DST = 0x9 + NFT_CT_PROTOCOL = 0xa + NFT_CT_PROTO_SRC = 0xb + NFT_CT_PROTO_DST = 0xc + NFT_CT_LABELS = 0xd + NFT_CT_PKTS = 0xe + NFT_CT_BYTES = 0xf + NFT_CT_AVGPKT = 0x10 + NFT_CT_ZONE = 0x11 + NFT_CT_EVENTMASK = 0x12 + NFTA_CT_UNSPEC = 0x0 + NFTA_CT_DREG = 0x1 + NFTA_CT_KEY = 0x2 + NFTA_CT_DIRECTION = 0x3 + NFTA_CT_SREG = 0x4 + NFT_LIMIT_PKTS = 0x0 + NFT_LIMIT_PKT_BYTES = 0x1 + NFT_LIMIT_F_INV = 0x1 + NFTA_LIMIT_UNSPEC = 0x0 + NFTA_LIMIT_RATE = 0x1 + NFTA_LIMIT_UNIT = 0x2 + NFTA_LIMIT_BURST = 0x3 + NFTA_LIMIT_TYPE = 0x4 + NFTA_LIMIT_FLAGS = 0x5 + NFTA_LIMIT_PAD = 0x6 + NFTA_COUNTER_UNSPEC = 0x0 + NFTA_COUNTER_BYTES = 0x1 + NFTA_COUNTER_PACKETS = 0x2 + NFTA_COUNTER_PAD = 0x3 + NFTA_LOG_UNSPEC = 0x0 + NFTA_LOG_GROUP = 0x1 + NFTA_LOG_PREFIX = 0x2 + NFTA_LOG_SNAPLEN = 0x3 + NFTA_LOG_QTHRESHOLD = 0x4 + NFTA_LOG_LEVEL = 0x5 + NFTA_LOG_FLAGS = 0x6 + NFTA_QUEUE_UNSPEC = 0x0 + NFTA_QUEUE_NUM = 0x1 + NFTA_QUEUE_TOTAL = 0x2 + NFTA_QUEUE_FLAGS = 0x3 + NFTA_QUEUE_SREG_QNUM = 0x4 + NFT_QUOTA_F_INV = 0x1 + NFT_QUOTA_F_DEPLETED = 0x2 + NFTA_QUOTA_UNSPEC = 0x0 + NFTA_QUOTA_BYTES = 0x1 + NFTA_QUOTA_FLAGS = 0x2 + NFTA_QUOTA_PAD = 0x3 + NFTA_QUOTA_CONSUMED = 0x4 + NFT_REJECT_ICMP_UNREACH = 0x0 + NFT_REJECT_TCP_RST = 0x1 + NFT_REJECT_ICMPX_UNREACH = 0x2 + NFT_REJECT_ICMPX_NO_ROUTE = 0x0 + NFT_REJECT_ICMPX_PORT_UNREACH = 0x1 + NFT_REJECT_ICMPX_HOST_UNREACH = 0x2 + NFT_REJECT_ICMPX_ADMIN_PROHIBITED = 0x3 + NFTA_REJECT_UNSPEC = 0x0 + NFTA_REJECT_TYPE = 0x1 + NFTA_REJECT_ICMP_CODE = 0x2 + NFT_NAT_SNAT = 0x0 + NFT_NAT_DNAT = 0x1 + NFTA_NAT_UNSPEC = 0x0 + NFTA_NAT_TYPE = 0x1 + NFTA_NAT_FAMILY = 0x2 + NFTA_NAT_REG_ADDR_MIN = 0x3 + NFTA_NAT_REG_ADDR_MAX = 0x4 + NFTA_NAT_REG_PROTO_MIN = 0x5 + NFTA_NAT_REG_PROTO_MAX = 0x6 + NFTA_NAT_FLAGS = 0x7 + NFTA_MASQ_UNSPEC = 0x0 + NFTA_MASQ_FLAGS = 0x1 + NFTA_MASQ_REG_PROTO_MIN = 0x2 + NFTA_MASQ_REG_PROTO_MAX = 0x3 + NFTA_REDIR_UNSPEC = 0x0 + NFTA_REDIR_REG_PROTO_MIN = 0x1 + NFTA_REDIR_REG_PROTO_MAX = 0x2 + NFTA_REDIR_FLAGS = 0x3 + NFTA_DUP_UNSPEC = 0x0 + NFTA_DUP_SREG_ADDR = 0x1 + NFTA_DUP_SREG_DEV = 0x2 + NFTA_FWD_UNSPEC = 0x0 + NFTA_FWD_SREG_DEV = 0x1 + NFTA_OBJREF_UNSPEC = 0x0 + NFTA_OBJREF_IMM_TYPE = 0x1 + NFTA_OBJREF_IMM_NAME = 0x2 + NFTA_OBJREF_SET_SREG = 0x3 + NFTA_OBJREF_SET_NAME = 0x4 + NFTA_OBJREF_SET_ID = 0x5 + NFTA_GEN_UNSPEC = 0x0 + NFTA_GEN_ID = 0x1 + NFTA_GEN_PROC_PID = 0x2 + NFTA_GEN_PROC_NAME = 0x3 + NFTA_FIB_UNSPEC = 0x0 + NFTA_FIB_DREG = 0x1 + NFTA_FIB_RESULT = 0x2 + NFTA_FIB_FLAGS = 0x3 + NFT_FIB_RESULT_UNSPEC = 0x0 + NFT_FIB_RESULT_OIF = 0x1 + NFT_FIB_RESULT_OIFNAME = 0x2 + NFT_FIB_RESULT_ADDRTYPE = 0x3 + NFTA_FIB_F_SADDR = 0x1 + NFTA_FIB_F_DADDR = 0x2 + NFTA_FIB_F_MARK = 0x4 + NFTA_FIB_F_IIF = 0x8 + NFTA_FIB_F_OIF = 0x10 + NFTA_FIB_F_PRESENT = 0x20 + NFTA_CT_HELPER_UNSPEC = 0x0 + NFTA_CT_HELPER_NAME = 0x1 + NFTA_CT_HELPER_L3PROTO = 0x2 + NFTA_CT_HELPER_L4PROTO = 0x3 + NFTA_OBJ_UNSPEC = 0x0 + NFTA_OBJ_TABLE = 0x1 + NFTA_OBJ_NAME = 0x2 + NFTA_OBJ_TYPE = 0x3 + NFTA_OBJ_DATA = 0x4 + NFTA_OBJ_USE = 0x5 + NFTA_TRACE_UNSPEC = 0x0 + NFTA_TRACE_TABLE = 0x1 + NFTA_TRACE_CHAIN = 0x2 + NFTA_TRACE_RULE_HANDLE = 0x3 + NFTA_TRACE_TYPE = 0x4 + NFTA_TRACE_VERDICT = 0x5 + NFTA_TRACE_ID = 0x6 + NFTA_TRACE_LL_HEADER = 0x7 + NFTA_TRACE_NETWORK_HEADER = 0x8 + NFTA_TRACE_TRANSPORT_HEADER = 0x9 + NFTA_TRACE_IIF = 0xa + NFTA_TRACE_IIFTYPE = 0xb + NFTA_TRACE_OIF = 0xc + NFTA_TRACE_OIFTYPE = 0xd + NFTA_TRACE_MARK = 0xe + NFTA_TRACE_NFPROTO = 0xf + NFTA_TRACE_POLICY = 0x10 + NFTA_TRACE_PAD = 0x11 + NFT_TRACETYPE_UNSPEC = 0x0 + NFT_TRACETYPE_POLICY = 0x1 + NFT_TRACETYPE_RETURN = 0x2 + NFT_TRACETYPE_RULE = 0x3 + NFTA_NG_UNSPEC = 0x0 + NFTA_NG_DREG = 0x1 + NFTA_NG_MODULUS = 0x2 + NFTA_NG_TYPE = 0x3 + NFTA_NG_OFFSET = 0x4 + NFT_NG_INCREMENTAL = 0x0 + NFT_NG_RANDOM = 0x1 +) + +type RTCTime struct { + Sec int32 + Min int32 + Hour int32 + Mday int32 + Mon int32 + Year int32 + Wday int32 + Yday int32 + Isdst int32 +} + +type RTCWkAlrm struct { + Enabled uint8 + Pending uint8 + _ [2]byte + Time RTCTime +} + +type RTCPLLInfo struct { + Ctrl int32 + Value int32 + Max int32 + Min int32 + Posmult int32 + Negmult int32 + Clock int64 +} + +type BlkpgIoctlArg struct { + Op int32 + Flags int32 + Datalen int32 + _ [4]byte + Data *byte +} + +type BlkpgPartition struct { + Start int64 + Length int64 + Pno int32 + Devname [64]uint8 + Volname [64]uint8 + _ [4]byte +} + +const ( + BLKPG = 0x1269 + BLKPG_ADD_PARTITION = 0x1 + BLKPG_DEL_PARTITION = 0x2 + BLKPG_RESIZE_PARTITION = 0x3 +) + +const ( + NETNSA_NONE = 0x0 + NETNSA_NSID = 0x1 + NETNSA_PID = 0x2 + NETNSA_FD = 0x3 +) + +type XDPRingOffset struct { + Producer uint64 + Consumer uint64 + Desc uint64 +} + +type XDPMmapOffsets struct { + Rx XDPRingOffset + Tx XDPRingOffset + Fr XDPRingOffset + Cr XDPRingOffset +} + +type XDPUmemReg struct { + Addr uint64 + Len uint64 + Size uint32 + Headroom uint32 +} + +type XDPStatistics struct { + Rx_dropped uint64 + Rx_invalid_descs uint64 + Tx_invalid_descs uint64 +} + +type XDPDesc struct { + Addr uint64 + Len uint32 + Options uint32 +} + +const ( + NCSI_CMD_UNSPEC = 0x0 + NCSI_CMD_PKG_INFO = 0x1 + NCSI_CMD_SET_INTERFACE = 0x2 + NCSI_CMD_CLEAR_INTERFACE = 0x3 + NCSI_ATTR_UNSPEC = 0x0 + NCSI_ATTR_IFINDEX = 0x1 + NCSI_ATTR_PACKAGE_LIST = 0x2 + NCSI_ATTR_PACKAGE_ID = 0x3 + NCSI_ATTR_CHANNEL_ID = 0x4 + NCSI_PKG_ATTR_UNSPEC = 0x0 + NCSI_PKG_ATTR = 0x1 + NCSI_PKG_ATTR_ID = 0x2 + NCSI_PKG_ATTR_FORCED = 0x3 + NCSI_PKG_ATTR_CHANNEL_LIST = 0x4 + NCSI_CHANNEL_ATTR_UNSPEC = 0x0 + NCSI_CHANNEL_ATTR = 0x1 + NCSI_CHANNEL_ATTR_ID = 0x2 + NCSI_CHANNEL_ATTR_VERSION_MAJOR = 0x3 + NCSI_CHANNEL_ATTR_VERSION_MINOR = 0x4 + NCSI_CHANNEL_ATTR_VERSION_STR = 0x5 + NCSI_CHANNEL_ATTR_LINK_STATE = 0x6 + NCSI_CHANNEL_ATTR_ACTIVE = 0x7 + NCSI_CHANNEL_ATTR_FORCED = 0x8 + NCSI_CHANNEL_ATTR_VLAN_LIST = 0x9 + NCSI_CHANNEL_ATTR_VLAN_ID = 0xa +) + +const ( + SOF_TIMESTAMPING_TX_HARDWARE = 0x1 + SOF_TIMESTAMPING_TX_SOFTWARE = 0x2 + SOF_TIMESTAMPING_RX_HARDWARE = 0x4 + SOF_TIMESTAMPING_RX_SOFTWARE = 0x8 + SOF_TIMESTAMPING_SOFTWARE = 0x10 + SOF_TIMESTAMPING_SYS_HARDWARE = 0x20 + SOF_TIMESTAMPING_RAW_HARDWARE = 0x40 + SOF_TIMESTAMPING_OPT_ID = 0x80 + SOF_TIMESTAMPING_TX_SCHED = 0x100 + SOF_TIMESTAMPING_TX_ACK = 0x200 + SOF_TIMESTAMPING_OPT_CMSG = 0x400 + SOF_TIMESTAMPING_OPT_TSONLY = 0x800 + SOF_TIMESTAMPING_OPT_STATS = 0x1000 + SOF_TIMESTAMPING_OPT_PKTINFO = 0x2000 + SOF_TIMESTAMPING_OPT_TX_SWHW = 0x4000 + + SOF_TIMESTAMPING_LAST = 0x4000 + SOF_TIMESTAMPING_MASK = 0x7fff +) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go new file mode 100644 index 00000000..dea88f7b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go @@ -0,0 +1,2016 @@ +// cgo -godefs -- -Wall -Werror -static -I/tmp/include -fsigned-char linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build s390x,linux + +package unix + +const ( + SizeofPtr = 0x8 + SizeofShort = 0x2 + SizeofInt = 0x4 + SizeofLong = 0x8 + SizeofLongLong = 0x8 + PathMax = 0x1000 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Timex struct { + Modes uint32 + _ [4]byte + Offset int64 + Freq int64 + Maxerror int64 + Esterror int64 + Status int32 + _ [4]byte + Constant int64 + Precision int64 + Tolerance int64 + Time Timeval + Tick int64 + Ppsfreq int64 + Jitter int64 + Shift int32 + _ [4]byte + Stabil int64 + Jitcnt int64 + Calcnt int64 + Errcnt int64 + Stbcnt int64 + Tai int32 + _ [44]byte +} + +type Time_t int64 + +type Tms struct { + Utime int64 + Stime int64 + Cutime int64 + Cstime int64 +} + +type Utimbuf struct { + Actime int64 + Modtime int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint64 + Ino uint64 + Nlink uint64 + Mode uint32 + Uid uint32 + Gid uint32 + _ int32 + Rdev uint64 + Size int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + Blksize int64 + Blocks int64 + _ [3]int64 +} + +type StatxTimestamp struct { + Sec int64 + Nsec uint32 + _ int32 +} + +type Statx_t struct { + Mask uint32 + Blksize uint32 + Attributes uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Mode uint16 + _ [1]uint16 + Ino uint64 + Size uint64 + Blocks uint64 + Attributes_mask uint64 + Atime StatxTimestamp + Btime StatxTimestamp + Ctime StatxTimestamp + Mtime StatxTimestamp + Rdev_major uint32 + Rdev_minor uint32 + Dev_major uint32 + Dev_minor uint32 + _ [14]uint64 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]int8 + _ [5]byte +} + +type Fsid struct { + Val [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + _ [4]byte + Start int64 + Len int64 + Pid int32 + _ [4]byte +} + +type FscryptPolicy struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptKey struct { + Mode uint32 + Raw [64]uint8 + Size uint32 +} + +type KeyctlDHParams struct { + Private int32 + Prime int32 + Base int32 +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x6 + FADV_NOREUSE = 0x7 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddrL2 struct { + Family uint16 + Psm uint16 + Bdaddr [6]uint8 + Cid uint16 + Bdaddr_type uint8 + _ [1]byte +} + +type RawSockaddrRFCOMM struct { + Family uint16 + Bdaddr [6]uint8 + Channel uint8 + _ [1]byte +} + +type RawSockaddrCAN struct { + Family uint16 + _ [2]byte + Ifindex int32 + Addr [8]byte +} + +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + +type RawSockaddrXDP struct { + Family uint16 + Flags uint16 + Ifindex uint32 + Queue_id uint32 + Shared_umem_fd uint32 +} + +type RawSockaddr struct { + Family uint16 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type PacketMreq struct { + Ifindex int32 + Type uint16 + Alen uint16 + Address [8]uint8 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + _ [4]byte + Iov *Iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + _ [4]byte +} + +type Cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + _ [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofSockaddrL2 = 0xe + SizeofSockaddrRFCOMM = 0xa + SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 + SizeofSockaddrXDP = 0x10 + SizeofLinger = 0x8 + SizeofIovec = 0x10 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofPacketMreq = 0x10 + SizeofMsghdr = 0x38 + SizeofCmsghdr = 0x10 + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_INFO_KIND = 0x1 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_NUM_VF = 0x15 + IFLA_VFINFO_LIST = 0x16 + IFLA_STATS64 = 0x17 + IFLA_VF_PORTS = 0x18 + IFLA_PORT_SELF = 0x19 + IFLA_AF_SPEC = 0x1a + IFLA_GROUP = 0x1b + IFLA_NET_NS_FD = 0x1c + IFLA_EXT_MASK = 0x1d + IFLA_PROMISCUITY = 0x1e + IFLA_NUM_TX_QUEUES = 0x1f + IFLA_NUM_RX_QUEUES = 0x20 + IFLA_CARRIER = 0x21 + IFLA_PHYS_PORT_ID = 0x22 + IFLA_CARRIER_CHANGES = 0x23 + IFLA_PHYS_SWITCH_ID = 0x24 + IFLA_LINK_NETNSID = 0x25 + IFLA_PHYS_PORT_NAME = 0x26 + IFLA_PROTO_DOWN = 0x27 + IFLA_GSO_MAX_SEGS = 0x28 + IFLA_GSO_MAX_SIZE = 0x29 + IFLA_PAD = 0x2a + IFLA_XDP = 0x2b + IFLA_EVENT = 0x2c + IFLA_NEW_NETNSID = 0x2d + IFLA_IF_NETNSID = 0x2e + IFLA_MAX = 0x33 + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTA_MARK = 0x10 + RTA_MFC_STATS = 0x11 + RTA_VIA = 0x12 + RTA_NEWDST = 0x13 + RTA_PREF = 0x14 + RTA_ENCAP_TYPE = 0x15 + RTA_ENCAP = 0x16 + RTA_EXPIRES = 0x17 + RTA_PAD = 0x18 + RTA_UID = 0x19 + RTA_TTL_PROPAGATE = 0x1a + RTA_IP_PROTO = 0x1b + RTA_SPORT = 0x1c + RTA_DPORT = 0x1d + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + _ uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x10 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + _ [6]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + Psw PtracePsw + Gprs [16]uint64 + Acrs [16]uint32 + Orig_gpr2 uint64 + Fp_regs PtraceFpregs + Per_info PtracePer + Ieee_instruction_pointer uint64 +} + +type PtracePsw struct { + Mask uint64 + Addr uint64 +} + +type PtraceFpregs struct { + Fpc uint32 + _ [4]byte + Fprs [16]float64 +} + +type PtracePer struct { + _ [0]uint64 + _ [24]byte + _ [8]byte + Starting_addr uint64 + Ending_addr uint64 + Perc_atmid uint16 + _ [6]byte + Address uint64 + Access_id uint8 + _ [7]byte +} + +type FdSet struct { + Bits [16]int64 +} + +type Sysinfo_t struct { + Uptime int64 + Loads [3]uint64 + Totalram uint64 + Freeram uint64 + Sharedram uint64 + Bufferram uint64 + Totalswap uint64 + Freeswap uint64 + Procs uint16 + Pad uint16 + _ [4]byte + Totalhigh uint64 + Freehigh uint64 + Unit uint32 + _ [0]int8 + _ [4]byte +} + +type Utsname struct { + Sysname [65]byte + Nodename [65]byte + Release [65]byte + Version [65]byte + Machine [65]byte + Domainname [65]byte +} + +type Ustat_t struct { + Tfree int32 + _ [4]byte + Tinode uint64 + Fname [6]int8 + Fpack [6]int8 + _ [4]byte +} + +type EpollEvent struct { + Events uint32 + _ int32 + Fd int32 + Pad int32 +} + +const ( + AT_EMPTY_PATH = 0x1000 + AT_FDCWD = -0x64 + AT_NO_AUTOMOUNT = 0x800 + AT_REMOVEDIR = 0x200 + + AT_STATX_SYNC_AS_STAT = 0x0 + AT_STATX_FORCE_SYNC = 0x2000 + AT_STATX_DONT_SYNC = 0x4000 + + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 + + AT_EACCESS = 0x200 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x2000 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Sigset_t struct { + Val [16]uint64 +} + +const RNDGETENTCNT = 0x80045200 + +const PERF_IOC_FLAG_GROUP = 0x1 + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Line uint8 + Cc [19]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Taskstats struct { + Version uint16 + _ [2]byte + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + _ [6]byte + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]int8 + Ac_sched uint8 + Ac_pad [3]uint8 + _ [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + _ [4]byte + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 +} + +const ( + TASKSTATS_CMD_UNSPEC = 0x0 + TASKSTATS_CMD_GET = 0x1 + TASKSTATS_CMD_NEW = 0x2 + TASKSTATS_TYPE_UNSPEC = 0x0 + TASKSTATS_TYPE_PID = 0x1 + TASKSTATS_TYPE_TGID = 0x2 + TASKSTATS_TYPE_STATS = 0x3 + TASKSTATS_TYPE_AGGR_PID = 0x4 + TASKSTATS_TYPE_AGGR_TGID = 0x5 + TASKSTATS_TYPE_NULL = 0x6 + TASKSTATS_CMD_ATTR_UNSPEC = 0x0 + TASKSTATS_CMD_ATTR_PID = 0x1 + TASKSTATS_CMD_ATTR_TGID = 0x2 + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 +) + +type CGroupStats struct { + Sleeping uint64 + Running uint64 + Stopped uint64 + Uninterruptible uint64 + Io_wait uint64 +} + +const ( + CGROUPSTATS_CMD_UNSPEC = 0x3 + CGROUPSTATS_CMD_GET = 0x4 + CGROUPSTATS_CMD_NEW = 0x5 + CGROUPSTATS_TYPE_UNSPEC = 0x0 + CGROUPSTATS_TYPE_CGROUP_STATS = 0x1 + CGROUPSTATS_CMD_ATTR_UNSPEC = 0x0 + CGROUPSTATS_CMD_ATTR_FD = 0x1 +) + +type Genlmsghdr struct { + Cmd uint8 + Version uint8 + Reserved uint16 +} + +const ( + CTRL_CMD_UNSPEC = 0x0 + CTRL_CMD_NEWFAMILY = 0x1 + CTRL_CMD_DELFAMILY = 0x2 + CTRL_CMD_GETFAMILY = 0x3 + CTRL_CMD_NEWOPS = 0x4 + CTRL_CMD_DELOPS = 0x5 + CTRL_CMD_GETOPS = 0x6 + CTRL_CMD_NEWMCAST_GRP = 0x7 + CTRL_CMD_DELMCAST_GRP = 0x8 + CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_ATTR_UNSPEC = 0x0 + CTRL_ATTR_FAMILY_ID = 0x1 + CTRL_ATTR_FAMILY_NAME = 0x2 + CTRL_ATTR_VERSION = 0x3 + CTRL_ATTR_HDRSIZE = 0x4 + CTRL_ATTR_MAXATTR = 0x5 + CTRL_ATTR_OPS = 0x6 + CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_OP_UNSPEC = 0x0 + CTRL_ATTR_OP_ID = 0x1 + CTRL_ATTR_OP_FLAGS = 0x2 + CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 + CTRL_ATTR_MCAST_GRP_NAME = 0x1 + CTRL_ATTR_MCAST_GRP_ID = 0x2 +) + +type cpuMask uint64 + +const ( + _CPU_SETSIZE = 0x400 + _NCPUBITS = 0x40 +) + +const ( + BDADDR_BREDR = 0x0 + BDADDR_LE_PUBLIC = 0x1 + BDADDR_LE_RANDOM = 0x2 +) + +type PerfEventAttr struct { + Type uint32 + Size uint32 + Config uint64 + Sample uint64 + Sample_type uint64 + Read_format uint64 + Bits uint64 + Wakeup uint32 + Bp_type uint32 + Ext1 uint64 + Ext2 uint64 + Branch_sample_type uint64 + Sample_regs_user uint64 + Sample_stack_user uint32 + Clockid int32 + Sample_regs_intr uint64 + Aux_watermark uint32 + _ uint32 +} + +type PerfEventMmapPage struct { + Version uint32 + Compat_version uint32 + Lock uint32 + Index uint32 + Offset int64 + Time_enabled uint64 + Time_running uint64 + Capabilities uint64 + Pmc_width uint16 + Time_shift uint16 + Time_mult uint32 + Time_offset uint64 + Time_zero uint64 + Size uint32 + _ [948]uint8 + Data_head uint64 + Data_tail uint64 + Data_offset uint64 + Data_size uint64 + Aux_head uint64 + Aux_tail uint64 + Aux_offset uint64 + Aux_size uint64 +} + +const ( + PerfBitDisabled uint64 = CBitFieldMaskBit0 + PerfBitInherit = CBitFieldMaskBit1 + PerfBitPinned = CBitFieldMaskBit2 + PerfBitExclusive = CBitFieldMaskBit3 + PerfBitExcludeUser = CBitFieldMaskBit4 + PerfBitExcludeKernel = CBitFieldMaskBit5 + PerfBitExcludeHv = CBitFieldMaskBit6 + PerfBitExcludeIdle = CBitFieldMaskBit7 + PerfBitMmap = CBitFieldMaskBit8 + PerfBitComm = CBitFieldMaskBit9 + PerfBitFreq = CBitFieldMaskBit10 + PerfBitInheritStat = CBitFieldMaskBit11 + PerfBitEnableOnExec = CBitFieldMaskBit12 + PerfBitTask = CBitFieldMaskBit13 + PerfBitWatermark = CBitFieldMaskBit14 + PerfBitPreciseIPBit1 = CBitFieldMaskBit15 + PerfBitPreciseIPBit2 = CBitFieldMaskBit16 + PerfBitMmapData = CBitFieldMaskBit17 + PerfBitSampleIDAll = CBitFieldMaskBit18 + PerfBitExcludeHost = CBitFieldMaskBit19 + PerfBitExcludeGuest = CBitFieldMaskBit20 + PerfBitExcludeCallchainKernel = CBitFieldMaskBit21 + PerfBitExcludeCallchainUser = CBitFieldMaskBit22 + PerfBitMmap2 = CBitFieldMaskBit23 + PerfBitCommExec = CBitFieldMaskBit24 + PerfBitUseClockID = CBitFieldMaskBit25 + PerfBitContextSwitch = CBitFieldMaskBit26 +) + +const ( + PERF_TYPE_HARDWARE = 0x0 + PERF_TYPE_SOFTWARE = 0x1 + PERF_TYPE_TRACEPOINT = 0x2 + PERF_TYPE_HW_CACHE = 0x3 + PERF_TYPE_RAW = 0x4 + PERF_TYPE_BREAKPOINT = 0x5 + + PERF_COUNT_HW_CPU_CYCLES = 0x0 + PERF_COUNT_HW_INSTRUCTIONS = 0x1 + PERF_COUNT_HW_CACHE_REFERENCES = 0x2 + PERF_COUNT_HW_CACHE_MISSES = 0x3 + PERF_COUNT_HW_BRANCH_INSTRUCTIONS = 0x4 + PERF_COUNT_HW_BRANCH_MISSES = 0x5 + PERF_COUNT_HW_BUS_CYCLES = 0x6 + PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 0x7 + PERF_COUNT_HW_STALLED_CYCLES_BACKEND = 0x8 + PERF_COUNT_HW_REF_CPU_CYCLES = 0x9 + + PERF_COUNT_HW_CACHE_L1D = 0x0 + PERF_COUNT_HW_CACHE_L1I = 0x1 + PERF_COUNT_HW_CACHE_LL = 0x2 + PERF_COUNT_HW_CACHE_DTLB = 0x3 + PERF_COUNT_HW_CACHE_ITLB = 0x4 + PERF_COUNT_HW_CACHE_BPU = 0x5 + PERF_COUNT_HW_CACHE_NODE = 0x6 + + PERF_COUNT_HW_CACHE_OP_READ = 0x0 + PERF_COUNT_HW_CACHE_OP_WRITE = 0x1 + PERF_COUNT_HW_CACHE_OP_PREFETCH = 0x2 + + PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0x0 + PERF_COUNT_HW_CACHE_RESULT_MISS = 0x1 + + PERF_COUNT_SW_CPU_CLOCK = 0x0 + PERF_COUNT_SW_TASK_CLOCK = 0x1 + PERF_COUNT_SW_PAGE_FAULTS = 0x2 + PERF_COUNT_SW_CONTEXT_SWITCHES = 0x3 + PERF_COUNT_SW_CPU_MIGRATIONS = 0x4 + PERF_COUNT_SW_PAGE_FAULTS_MIN = 0x5 + PERF_COUNT_SW_PAGE_FAULTS_MAJ = 0x6 + PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7 + PERF_COUNT_SW_EMULATION_FAULTS = 0x8 + PERF_COUNT_SW_DUMMY = 0x9 + + PERF_SAMPLE_IP = 0x1 + PERF_SAMPLE_TID = 0x2 + PERF_SAMPLE_TIME = 0x4 + PERF_SAMPLE_ADDR = 0x8 + PERF_SAMPLE_READ = 0x10 + PERF_SAMPLE_CALLCHAIN = 0x20 + PERF_SAMPLE_ID = 0x40 + PERF_SAMPLE_CPU = 0x80 + PERF_SAMPLE_PERIOD = 0x100 + PERF_SAMPLE_STREAM_ID = 0x200 + PERF_SAMPLE_RAW = 0x400 + PERF_SAMPLE_BRANCH_STACK = 0x800 + + PERF_SAMPLE_BRANCH_USER = 0x1 + PERF_SAMPLE_BRANCH_KERNEL = 0x2 + PERF_SAMPLE_BRANCH_HV = 0x4 + PERF_SAMPLE_BRANCH_ANY = 0x8 + PERF_SAMPLE_BRANCH_ANY_CALL = 0x10 + PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20 + PERF_SAMPLE_BRANCH_IND_CALL = 0x40 + + PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1 + PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2 + PERF_FORMAT_ID = 0x4 + PERF_FORMAT_GROUP = 0x8 + + PERF_RECORD_MMAP = 0x1 + PERF_RECORD_LOST = 0x2 + PERF_RECORD_COMM = 0x3 + PERF_RECORD_EXIT = 0x4 + PERF_RECORD_THROTTLE = 0x5 + PERF_RECORD_UNTHROTTLE = 0x6 + PERF_RECORD_FORK = 0x7 + PERF_RECORD_READ = 0x8 + PERF_RECORD_SAMPLE = 0x9 + + PERF_CONTEXT_HV = -0x20 + PERF_CONTEXT_KERNEL = -0x80 + PERF_CONTEXT_USER = -0x200 + + PERF_CONTEXT_GUEST = -0x800 + PERF_CONTEXT_GUEST_KERNEL = -0x880 + PERF_CONTEXT_GUEST_USER = -0xa00 + + PERF_FLAG_FD_NO_GROUP = 0x1 + PERF_FLAG_FD_OUTPUT = 0x2 + PERF_FLAG_PID_CGROUP = 0x4 +) + +const ( + CBitFieldMaskBit0 = 0x8000000000000000 + CBitFieldMaskBit1 = 0x4000000000000000 + CBitFieldMaskBit2 = 0x2000000000000000 + CBitFieldMaskBit3 = 0x1000000000000000 + CBitFieldMaskBit4 = 0x800000000000000 + CBitFieldMaskBit5 = 0x400000000000000 + CBitFieldMaskBit6 = 0x200000000000000 + CBitFieldMaskBit7 = 0x100000000000000 + CBitFieldMaskBit8 = 0x80000000000000 + CBitFieldMaskBit9 = 0x40000000000000 + CBitFieldMaskBit10 = 0x20000000000000 + CBitFieldMaskBit11 = 0x10000000000000 + CBitFieldMaskBit12 = 0x8000000000000 + CBitFieldMaskBit13 = 0x4000000000000 + CBitFieldMaskBit14 = 0x2000000000000 + CBitFieldMaskBit15 = 0x1000000000000 + CBitFieldMaskBit16 = 0x800000000000 + CBitFieldMaskBit17 = 0x400000000000 + CBitFieldMaskBit18 = 0x200000000000 + CBitFieldMaskBit19 = 0x100000000000 + CBitFieldMaskBit20 = 0x80000000000 + CBitFieldMaskBit21 = 0x40000000000 + CBitFieldMaskBit22 = 0x20000000000 + CBitFieldMaskBit23 = 0x10000000000 + CBitFieldMaskBit24 = 0x8000000000 + CBitFieldMaskBit25 = 0x4000000000 + CBitFieldMaskBit26 = 0x2000000000 + CBitFieldMaskBit27 = 0x1000000000 + CBitFieldMaskBit28 = 0x800000000 + CBitFieldMaskBit29 = 0x400000000 + CBitFieldMaskBit30 = 0x200000000 + CBitFieldMaskBit31 = 0x100000000 + CBitFieldMaskBit32 = 0x80000000 + CBitFieldMaskBit33 = 0x40000000 + CBitFieldMaskBit34 = 0x20000000 + CBitFieldMaskBit35 = 0x10000000 + CBitFieldMaskBit36 = 0x8000000 + CBitFieldMaskBit37 = 0x4000000 + CBitFieldMaskBit38 = 0x2000000 + CBitFieldMaskBit39 = 0x1000000 + CBitFieldMaskBit40 = 0x800000 + CBitFieldMaskBit41 = 0x400000 + CBitFieldMaskBit42 = 0x200000 + CBitFieldMaskBit43 = 0x100000 + CBitFieldMaskBit44 = 0x80000 + CBitFieldMaskBit45 = 0x40000 + CBitFieldMaskBit46 = 0x20000 + CBitFieldMaskBit47 = 0x10000 + CBitFieldMaskBit48 = 0x8000 + CBitFieldMaskBit49 = 0x4000 + CBitFieldMaskBit50 = 0x2000 + CBitFieldMaskBit51 = 0x1000 + CBitFieldMaskBit52 = 0x800 + CBitFieldMaskBit53 = 0x400 + CBitFieldMaskBit54 = 0x200 + CBitFieldMaskBit55 = 0x100 + CBitFieldMaskBit56 = 0x80 + CBitFieldMaskBit57 = 0x40 + CBitFieldMaskBit58 = 0x20 + CBitFieldMaskBit59 = 0x10 + CBitFieldMaskBit60 = 0x8 + CBitFieldMaskBit61 = 0x4 + CBitFieldMaskBit62 = 0x2 + CBitFieldMaskBit63 = 0x1 +) + +type SockaddrStorage struct { + Family uint16 + _ [118]int8 + _ uint64 +} + +type TCPMD5Sig struct { + Addr SockaddrStorage + Flags uint8 + Prefixlen uint8 + Keylen uint16 + _ uint32 + Key [80]uint8 +} + +type HDDriveCmdHdr struct { + Command uint8 + Number uint8 + Feature uint8 + Count uint8 +} + +type HDGeometry struct { + Heads uint8 + Sectors uint8 + Cylinders uint16 + _ [4]byte + Start uint64 +} + +type HDDriveID struct { + Config uint16 + Cyls uint16 + Reserved2 uint16 + Heads uint16 + Track_bytes uint16 + Sector_bytes uint16 + Sectors uint16 + Vendor0 uint16 + Vendor1 uint16 + Vendor2 uint16 + Serial_no [20]uint8 + Buf_type uint16 + Buf_size uint16 + Ecc_bytes uint16 + Fw_rev [8]uint8 + Model [40]uint8 + Max_multsect uint8 + Vendor3 uint8 + Dword_io uint16 + Vendor4 uint8 + Capability uint8 + Reserved50 uint16 + Vendor5 uint8 + TPIO uint8 + Vendor6 uint8 + TDMA uint8 + Field_valid uint16 + Cur_cyls uint16 + Cur_heads uint16 + Cur_sectors uint16 + Cur_capacity0 uint16 + Cur_capacity1 uint16 + Multsect uint8 + Multsect_valid uint8 + Lba_capacity uint32 + Dma_1word uint16 + Dma_mword uint16 + Eide_pio_modes uint16 + Eide_dma_min uint16 + Eide_dma_time uint16 + Eide_pio uint16 + Eide_pio_iordy uint16 + Words69_70 [2]uint16 + Words71_74 [4]uint16 + Queue_depth uint16 + Words76_79 [4]uint16 + Major_rev_num uint16 + Minor_rev_num uint16 + Command_set_1 uint16 + Command_set_2 uint16 + Cfsse uint16 + Cfs_enable_1 uint16 + Cfs_enable_2 uint16 + Csf_default uint16 + Dma_ultra uint16 + Trseuc uint16 + TrsEuc uint16 + CurAPMvalues uint16 + Mprc uint16 + Hw_config uint16 + Acoustic uint16 + Msrqs uint16 + Sxfert uint16 + Sal uint16 + Spg uint32 + Lba_capacity_2 uint64 + Words104_125 [22]uint16 + Last_lun uint16 + Word127 uint16 + Dlf uint16 + Csfo uint16 + Words130_155 [26]uint16 + Word156 uint16 + Words157_159 [3]uint16 + Cfa_power uint16 + Words161_175 [15]uint16 + Words176_205 [30]uint16 + Words206_254 [49]uint16 + Integrity_word uint16 +} + +type Statfs_t struct { + Type uint32 + Bsize uint32 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Namelen uint32 + Frsize uint32 + Flags uint32 + Spare [4]uint32 + _ [4]byte +} + +const ( + ST_MANDLOCK = 0x40 + ST_NOATIME = 0x400 + ST_NODEV = 0x4 + ST_NODIRATIME = 0x800 + ST_NOEXEC = 0x8 + ST_NOSUID = 0x2 + ST_RDONLY = 0x1 + ST_RELATIME = 0x1000 + ST_SYNCHRONOUS = 0x10 +) + +type TpacketHdr struct { + Status uint64 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Sec uint32 + Usec uint32 + _ [4]byte +} + +type Tpacket2Hdr struct { + Status uint32 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Sec uint32 + Nsec uint32 + Vlan_tci uint16 + Vlan_tpid uint16 + _ [4]uint8 +} + +type Tpacket3Hdr struct { + Next_offset uint32 + Sec uint32 + Nsec uint32 + Snaplen uint32 + Len uint32 + Status uint32 + Mac uint16 + Net uint16 + Hv1 TpacketHdrVariant1 + _ [8]uint8 +} + +type TpacketHdrVariant1 struct { + Rxhash uint32 + Vlan_tci uint32 + Vlan_tpid uint16 + _ uint16 +} + +type TpacketBlockDesc struct { + Version uint32 + To_priv uint32 + Hdr [40]byte +} + +type TpacketReq struct { + Block_size uint32 + Block_nr uint32 + Frame_size uint32 + Frame_nr uint32 +} + +type TpacketReq3 struct { + Block_size uint32 + Block_nr uint32 + Frame_size uint32 + Frame_nr uint32 + Retire_blk_tov uint32 + Sizeof_priv uint32 + Feature_req_word uint32 +} + +type TpacketStats struct { + Packets uint32 + Drops uint32 +} + +type TpacketStatsV3 struct { + Packets uint32 + Drops uint32 + Freeze_q_cnt uint32 +} + +type TpacketAuxdata struct { + Status uint32 + Len uint32 + Snaplen uint32 + Mac uint16 + Net uint16 + Vlan_tci uint16 + Vlan_tpid uint16 +} + +const ( + TPACKET_V1 = 0x0 + TPACKET_V2 = 0x1 + TPACKET_V3 = 0x2 +) + +const ( + SizeofTpacketHdr = 0x20 + SizeofTpacket2Hdr = 0x20 + SizeofTpacket3Hdr = 0x30 +) + +const ( + NF_INET_PRE_ROUTING = 0x0 + NF_INET_LOCAL_IN = 0x1 + NF_INET_FORWARD = 0x2 + NF_INET_LOCAL_OUT = 0x3 + NF_INET_POST_ROUTING = 0x4 + NF_INET_NUMHOOKS = 0x5 +) + +const ( + NF_NETDEV_INGRESS = 0x0 + NF_NETDEV_NUMHOOKS = 0x1 +) + +const ( + NFPROTO_UNSPEC = 0x0 + NFPROTO_INET = 0x1 + NFPROTO_IPV4 = 0x2 + NFPROTO_ARP = 0x3 + NFPROTO_NETDEV = 0x5 + NFPROTO_BRIDGE = 0x7 + NFPROTO_IPV6 = 0xa + NFPROTO_DECNET = 0xc + NFPROTO_NUMPROTO = 0xd +) + +type Nfgenmsg struct { + Nfgen_family uint8 + Version uint8 + Res_id uint16 +} + +const ( + NFNL_BATCH_UNSPEC = 0x0 + NFNL_BATCH_GENID = 0x1 +) + +const ( + NFT_REG_VERDICT = 0x0 + NFT_REG_1 = 0x1 + NFT_REG_2 = 0x2 + NFT_REG_3 = 0x3 + NFT_REG_4 = 0x4 + NFT_REG32_00 = 0x8 + NFT_REG32_01 = 0x9 + NFT_REG32_02 = 0xa + NFT_REG32_03 = 0xb + NFT_REG32_04 = 0xc + NFT_REG32_05 = 0xd + NFT_REG32_06 = 0xe + NFT_REG32_07 = 0xf + NFT_REG32_08 = 0x10 + NFT_REG32_09 = 0x11 + NFT_REG32_10 = 0x12 + NFT_REG32_11 = 0x13 + NFT_REG32_12 = 0x14 + NFT_REG32_13 = 0x15 + NFT_REG32_14 = 0x16 + NFT_REG32_15 = 0x17 + NFT_CONTINUE = -0x1 + NFT_BREAK = -0x2 + NFT_JUMP = -0x3 + NFT_GOTO = -0x4 + NFT_RETURN = -0x5 + NFT_MSG_NEWTABLE = 0x0 + NFT_MSG_GETTABLE = 0x1 + NFT_MSG_DELTABLE = 0x2 + NFT_MSG_NEWCHAIN = 0x3 + NFT_MSG_GETCHAIN = 0x4 + NFT_MSG_DELCHAIN = 0x5 + NFT_MSG_NEWRULE = 0x6 + NFT_MSG_GETRULE = 0x7 + NFT_MSG_DELRULE = 0x8 + NFT_MSG_NEWSET = 0x9 + NFT_MSG_GETSET = 0xa + NFT_MSG_DELSET = 0xb + NFT_MSG_NEWSETELEM = 0xc + NFT_MSG_GETSETELEM = 0xd + NFT_MSG_DELSETELEM = 0xe + NFT_MSG_NEWGEN = 0xf + NFT_MSG_GETGEN = 0x10 + NFT_MSG_TRACE = 0x11 + NFT_MSG_NEWOBJ = 0x12 + NFT_MSG_GETOBJ = 0x13 + NFT_MSG_DELOBJ = 0x14 + NFT_MSG_GETOBJ_RESET = 0x15 + NFT_MSG_MAX = 0x19 + NFTA_LIST_UNPEC = 0x0 + NFTA_LIST_ELEM = 0x1 + NFTA_HOOK_UNSPEC = 0x0 + NFTA_HOOK_HOOKNUM = 0x1 + NFTA_HOOK_PRIORITY = 0x2 + NFTA_HOOK_DEV = 0x3 + NFT_TABLE_F_DORMANT = 0x1 + NFTA_TABLE_UNSPEC = 0x0 + NFTA_TABLE_NAME = 0x1 + NFTA_TABLE_FLAGS = 0x2 + NFTA_TABLE_USE = 0x3 + NFTA_CHAIN_UNSPEC = 0x0 + NFTA_CHAIN_TABLE = 0x1 + NFTA_CHAIN_HANDLE = 0x2 + NFTA_CHAIN_NAME = 0x3 + NFTA_CHAIN_HOOK = 0x4 + NFTA_CHAIN_POLICY = 0x5 + NFTA_CHAIN_USE = 0x6 + NFTA_CHAIN_TYPE = 0x7 + NFTA_CHAIN_COUNTERS = 0x8 + NFTA_CHAIN_PAD = 0x9 + NFTA_RULE_UNSPEC = 0x0 + NFTA_RULE_TABLE = 0x1 + NFTA_RULE_CHAIN = 0x2 + NFTA_RULE_HANDLE = 0x3 + NFTA_RULE_EXPRESSIONS = 0x4 + NFTA_RULE_COMPAT = 0x5 + NFTA_RULE_POSITION = 0x6 + NFTA_RULE_USERDATA = 0x7 + NFTA_RULE_PAD = 0x8 + NFTA_RULE_ID = 0x9 + NFT_RULE_COMPAT_F_INV = 0x2 + NFT_RULE_COMPAT_F_MASK = 0x2 + NFTA_RULE_COMPAT_UNSPEC = 0x0 + NFTA_RULE_COMPAT_PROTO = 0x1 + NFTA_RULE_COMPAT_FLAGS = 0x2 + NFT_SET_ANONYMOUS = 0x1 + NFT_SET_CONSTANT = 0x2 + NFT_SET_INTERVAL = 0x4 + NFT_SET_MAP = 0x8 + NFT_SET_TIMEOUT = 0x10 + NFT_SET_EVAL = 0x20 + NFT_SET_OBJECT = 0x40 + NFT_SET_POL_PERFORMANCE = 0x0 + NFT_SET_POL_MEMORY = 0x1 + NFTA_SET_DESC_UNSPEC = 0x0 + NFTA_SET_DESC_SIZE = 0x1 + NFTA_SET_UNSPEC = 0x0 + NFTA_SET_TABLE = 0x1 + NFTA_SET_NAME = 0x2 + NFTA_SET_FLAGS = 0x3 + NFTA_SET_KEY_TYPE = 0x4 + NFTA_SET_KEY_LEN = 0x5 + NFTA_SET_DATA_TYPE = 0x6 + NFTA_SET_DATA_LEN = 0x7 + NFTA_SET_POLICY = 0x8 + NFTA_SET_DESC = 0x9 + NFTA_SET_ID = 0xa + NFTA_SET_TIMEOUT = 0xb + NFTA_SET_GC_INTERVAL = 0xc + NFTA_SET_USERDATA = 0xd + NFTA_SET_PAD = 0xe + NFTA_SET_OBJ_TYPE = 0xf + NFT_SET_ELEM_INTERVAL_END = 0x1 + NFTA_SET_ELEM_UNSPEC = 0x0 + NFTA_SET_ELEM_KEY = 0x1 + NFTA_SET_ELEM_DATA = 0x2 + NFTA_SET_ELEM_FLAGS = 0x3 + NFTA_SET_ELEM_TIMEOUT = 0x4 + NFTA_SET_ELEM_EXPIRATION = 0x5 + NFTA_SET_ELEM_USERDATA = 0x6 + NFTA_SET_ELEM_EXPR = 0x7 + NFTA_SET_ELEM_PAD = 0x8 + NFTA_SET_ELEM_OBJREF = 0x9 + NFTA_SET_ELEM_LIST_UNSPEC = 0x0 + NFTA_SET_ELEM_LIST_TABLE = 0x1 + NFTA_SET_ELEM_LIST_SET = 0x2 + NFTA_SET_ELEM_LIST_ELEMENTS = 0x3 + NFTA_SET_ELEM_LIST_SET_ID = 0x4 + NFT_DATA_VALUE = 0x0 + NFT_DATA_VERDICT = 0xffffff00 + NFTA_DATA_UNSPEC = 0x0 + NFTA_DATA_VALUE = 0x1 + NFTA_DATA_VERDICT = 0x2 + NFTA_VERDICT_UNSPEC = 0x0 + NFTA_VERDICT_CODE = 0x1 + NFTA_VERDICT_CHAIN = 0x2 + NFTA_EXPR_UNSPEC = 0x0 + NFTA_EXPR_NAME = 0x1 + NFTA_EXPR_DATA = 0x2 + NFTA_IMMEDIATE_UNSPEC = 0x0 + NFTA_IMMEDIATE_DREG = 0x1 + NFTA_IMMEDIATE_DATA = 0x2 + NFTA_BITWISE_UNSPEC = 0x0 + NFTA_BITWISE_SREG = 0x1 + NFTA_BITWISE_DREG = 0x2 + NFTA_BITWISE_LEN = 0x3 + NFTA_BITWISE_MASK = 0x4 + NFTA_BITWISE_XOR = 0x5 + NFT_BYTEORDER_NTOH = 0x0 + NFT_BYTEORDER_HTON = 0x1 + NFTA_BYTEORDER_UNSPEC = 0x0 + NFTA_BYTEORDER_SREG = 0x1 + NFTA_BYTEORDER_DREG = 0x2 + NFTA_BYTEORDER_OP = 0x3 + NFTA_BYTEORDER_LEN = 0x4 + NFTA_BYTEORDER_SIZE = 0x5 + NFT_CMP_EQ = 0x0 + NFT_CMP_NEQ = 0x1 + NFT_CMP_LT = 0x2 + NFT_CMP_LTE = 0x3 + NFT_CMP_GT = 0x4 + NFT_CMP_GTE = 0x5 + NFTA_CMP_UNSPEC = 0x0 + NFTA_CMP_SREG = 0x1 + NFTA_CMP_OP = 0x2 + NFTA_CMP_DATA = 0x3 + NFT_RANGE_EQ = 0x0 + NFT_RANGE_NEQ = 0x1 + NFTA_RANGE_UNSPEC = 0x0 + NFTA_RANGE_SREG = 0x1 + NFTA_RANGE_OP = 0x2 + NFTA_RANGE_FROM_DATA = 0x3 + NFTA_RANGE_TO_DATA = 0x4 + NFT_LOOKUP_F_INV = 0x1 + NFTA_LOOKUP_UNSPEC = 0x0 + NFTA_LOOKUP_SET = 0x1 + NFTA_LOOKUP_SREG = 0x2 + NFTA_LOOKUP_DREG = 0x3 + NFTA_LOOKUP_SET_ID = 0x4 + NFTA_LOOKUP_FLAGS = 0x5 + NFT_DYNSET_OP_ADD = 0x0 + NFT_DYNSET_OP_UPDATE = 0x1 + NFT_DYNSET_F_INV = 0x1 + NFTA_DYNSET_UNSPEC = 0x0 + NFTA_DYNSET_SET_NAME = 0x1 + NFTA_DYNSET_SET_ID = 0x2 + NFTA_DYNSET_OP = 0x3 + NFTA_DYNSET_SREG_KEY = 0x4 + NFTA_DYNSET_SREG_DATA = 0x5 + NFTA_DYNSET_TIMEOUT = 0x6 + NFTA_DYNSET_EXPR = 0x7 + NFTA_DYNSET_PAD = 0x8 + NFTA_DYNSET_FLAGS = 0x9 + NFT_PAYLOAD_LL_HEADER = 0x0 + NFT_PAYLOAD_NETWORK_HEADER = 0x1 + NFT_PAYLOAD_TRANSPORT_HEADER = 0x2 + NFT_PAYLOAD_CSUM_NONE = 0x0 + NFT_PAYLOAD_CSUM_INET = 0x1 + NFT_PAYLOAD_L4CSUM_PSEUDOHDR = 0x1 + NFTA_PAYLOAD_UNSPEC = 0x0 + NFTA_PAYLOAD_DREG = 0x1 + NFTA_PAYLOAD_BASE = 0x2 + NFTA_PAYLOAD_OFFSET = 0x3 + NFTA_PAYLOAD_LEN = 0x4 + NFTA_PAYLOAD_SREG = 0x5 + NFTA_PAYLOAD_CSUM_TYPE = 0x6 + NFTA_PAYLOAD_CSUM_OFFSET = 0x7 + NFTA_PAYLOAD_CSUM_FLAGS = 0x8 + NFT_EXTHDR_F_PRESENT = 0x1 + NFT_EXTHDR_OP_IPV6 = 0x0 + NFT_EXTHDR_OP_TCPOPT = 0x1 + NFTA_EXTHDR_UNSPEC = 0x0 + NFTA_EXTHDR_DREG = 0x1 + NFTA_EXTHDR_TYPE = 0x2 + NFTA_EXTHDR_OFFSET = 0x3 + NFTA_EXTHDR_LEN = 0x4 + NFTA_EXTHDR_FLAGS = 0x5 + NFTA_EXTHDR_OP = 0x6 + NFTA_EXTHDR_SREG = 0x7 + NFT_META_LEN = 0x0 + NFT_META_PROTOCOL = 0x1 + NFT_META_PRIORITY = 0x2 + NFT_META_MARK = 0x3 + NFT_META_IIF = 0x4 + NFT_META_OIF = 0x5 + NFT_META_IIFNAME = 0x6 + NFT_META_OIFNAME = 0x7 + NFT_META_IIFTYPE = 0x8 + NFT_META_OIFTYPE = 0x9 + NFT_META_SKUID = 0xa + NFT_META_SKGID = 0xb + NFT_META_NFTRACE = 0xc + NFT_META_RTCLASSID = 0xd + NFT_META_SECMARK = 0xe + NFT_META_NFPROTO = 0xf + NFT_META_L4PROTO = 0x10 + NFT_META_BRI_IIFNAME = 0x11 + NFT_META_BRI_OIFNAME = 0x12 + NFT_META_PKTTYPE = 0x13 + NFT_META_CPU = 0x14 + NFT_META_IIFGROUP = 0x15 + NFT_META_OIFGROUP = 0x16 + NFT_META_CGROUP = 0x17 + NFT_META_PRANDOM = 0x18 + NFT_RT_CLASSID = 0x0 + NFT_RT_NEXTHOP4 = 0x1 + NFT_RT_NEXTHOP6 = 0x2 + NFT_RT_TCPMSS = 0x3 + NFT_HASH_JENKINS = 0x0 + NFT_HASH_SYM = 0x1 + NFTA_HASH_UNSPEC = 0x0 + NFTA_HASH_SREG = 0x1 + NFTA_HASH_DREG = 0x2 + NFTA_HASH_LEN = 0x3 + NFTA_HASH_MODULUS = 0x4 + NFTA_HASH_SEED = 0x5 + NFTA_HASH_OFFSET = 0x6 + NFTA_HASH_TYPE = 0x7 + NFTA_META_UNSPEC = 0x0 + NFTA_META_DREG = 0x1 + NFTA_META_KEY = 0x2 + NFTA_META_SREG = 0x3 + NFTA_RT_UNSPEC = 0x0 + NFTA_RT_DREG = 0x1 + NFTA_RT_KEY = 0x2 + NFT_CT_STATE = 0x0 + NFT_CT_DIRECTION = 0x1 + NFT_CT_STATUS = 0x2 + NFT_CT_MARK = 0x3 + NFT_CT_SECMARK = 0x4 + NFT_CT_EXPIRATION = 0x5 + NFT_CT_HELPER = 0x6 + NFT_CT_L3PROTOCOL = 0x7 + NFT_CT_SRC = 0x8 + NFT_CT_DST = 0x9 + NFT_CT_PROTOCOL = 0xa + NFT_CT_PROTO_SRC = 0xb + NFT_CT_PROTO_DST = 0xc + NFT_CT_LABELS = 0xd + NFT_CT_PKTS = 0xe + NFT_CT_BYTES = 0xf + NFT_CT_AVGPKT = 0x10 + NFT_CT_ZONE = 0x11 + NFT_CT_EVENTMASK = 0x12 + NFTA_CT_UNSPEC = 0x0 + NFTA_CT_DREG = 0x1 + NFTA_CT_KEY = 0x2 + NFTA_CT_DIRECTION = 0x3 + NFTA_CT_SREG = 0x4 + NFT_LIMIT_PKTS = 0x0 + NFT_LIMIT_PKT_BYTES = 0x1 + NFT_LIMIT_F_INV = 0x1 + NFTA_LIMIT_UNSPEC = 0x0 + NFTA_LIMIT_RATE = 0x1 + NFTA_LIMIT_UNIT = 0x2 + NFTA_LIMIT_BURST = 0x3 + NFTA_LIMIT_TYPE = 0x4 + NFTA_LIMIT_FLAGS = 0x5 + NFTA_LIMIT_PAD = 0x6 + NFTA_COUNTER_UNSPEC = 0x0 + NFTA_COUNTER_BYTES = 0x1 + NFTA_COUNTER_PACKETS = 0x2 + NFTA_COUNTER_PAD = 0x3 + NFTA_LOG_UNSPEC = 0x0 + NFTA_LOG_GROUP = 0x1 + NFTA_LOG_PREFIX = 0x2 + NFTA_LOG_SNAPLEN = 0x3 + NFTA_LOG_QTHRESHOLD = 0x4 + NFTA_LOG_LEVEL = 0x5 + NFTA_LOG_FLAGS = 0x6 + NFTA_QUEUE_UNSPEC = 0x0 + NFTA_QUEUE_NUM = 0x1 + NFTA_QUEUE_TOTAL = 0x2 + NFTA_QUEUE_FLAGS = 0x3 + NFTA_QUEUE_SREG_QNUM = 0x4 + NFT_QUOTA_F_INV = 0x1 + NFT_QUOTA_F_DEPLETED = 0x2 + NFTA_QUOTA_UNSPEC = 0x0 + NFTA_QUOTA_BYTES = 0x1 + NFTA_QUOTA_FLAGS = 0x2 + NFTA_QUOTA_PAD = 0x3 + NFTA_QUOTA_CONSUMED = 0x4 + NFT_REJECT_ICMP_UNREACH = 0x0 + NFT_REJECT_TCP_RST = 0x1 + NFT_REJECT_ICMPX_UNREACH = 0x2 + NFT_REJECT_ICMPX_NO_ROUTE = 0x0 + NFT_REJECT_ICMPX_PORT_UNREACH = 0x1 + NFT_REJECT_ICMPX_HOST_UNREACH = 0x2 + NFT_REJECT_ICMPX_ADMIN_PROHIBITED = 0x3 + NFTA_REJECT_UNSPEC = 0x0 + NFTA_REJECT_TYPE = 0x1 + NFTA_REJECT_ICMP_CODE = 0x2 + NFT_NAT_SNAT = 0x0 + NFT_NAT_DNAT = 0x1 + NFTA_NAT_UNSPEC = 0x0 + NFTA_NAT_TYPE = 0x1 + NFTA_NAT_FAMILY = 0x2 + NFTA_NAT_REG_ADDR_MIN = 0x3 + NFTA_NAT_REG_ADDR_MAX = 0x4 + NFTA_NAT_REG_PROTO_MIN = 0x5 + NFTA_NAT_REG_PROTO_MAX = 0x6 + NFTA_NAT_FLAGS = 0x7 + NFTA_MASQ_UNSPEC = 0x0 + NFTA_MASQ_FLAGS = 0x1 + NFTA_MASQ_REG_PROTO_MIN = 0x2 + NFTA_MASQ_REG_PROTO_MAX = 0x3 + NFTA_REDIR_UNSPEC = 0x0 + NFTA_REDIR_REG_PROTO_MIN = 0x1 + NFTA_REDIR_REG_PROTO_MAX = 0x2 + NFTA_REDIR_FLAGS = 0x3 + NFTA_DUP_UNSPEC = 0x0 + NFTA_DUP_SREG_ADDR = 0x1 + NFTA_DUP_SREG_DEV = 0x2 + NFTA_FWD_UNSPEC = 0x0 + NFTA_FWD_SREG_DEV = 0x1 + NFTA_OBJREF_UNSPEC = 0x0 + NFTA_OBJREF_IMM_TYPE = 0x1 + NFTA_OBJREF_IMM_NAME = 0x2 + NFTA_OBJREF_SET_SREG = 0x3 + NFTA_OBJREF_SET_NAME = 0x4 + NFTA_OBJREF_SET_ID = 0x5 + NFTA_GEN_UNSPEC = 0x0 + NFTA_GEN_ID = 0x1 + NFTA_GEN_PROC_PID = 0x2 + NFTA_GEN_PROC_NAME = 0x3 + NFTA_FIB_UNSPEC = 0x0 + NFTA_FIB_DREG = 0x1 + NFTA_FIB_RESULT = 0x2 + NFTA_FIB_FLAGS = 0x3 + NFT_FIB_RESULT_UNSPEC = 0x0 + NFT_FIB_RESULT_OIF = 0x1 + NFT_FIB_RESULT_OIFNAME = 0x2 + NFT_FIB_RESULT_ADDRTYPE = 0x3 + NFTA_FIB_F_SADDR = 0x1 + NFTA_FIB_F_DADDR = 0x2 + NFTA_FIB_F_MARK = 0x4 + NFTA_FIB_F_IIF = 0x8 + NFTA_FIB_F_OIF = 0x10 + NFTA_FIB_F_PRESENT = 0x20 + NFTA_CT_HELPER_UNSPEC = 0x0 + NFTA_CT_HELPER_NAME = 0x1 + NFTA_CT_HELPER_L3PROTO = 0x2 + NFTA_CT_HELPER_L4PROTO = 0x3 + NFTA_OBJ_UNSPEC = 0x0 + NFTA_OBJ_TABLE = 0x1 + NFTA_OBJ_NAME = 0x2 + NFTA_OBJ_TYPE = 0x3 + NFTA_OBJ_DATA = 0x4 + NFTA_OBJ_USE = 0x5 + NFTA_TRACE_UNSPEC = 0x0 + NFTA_TRACE_TABLE = 0x1 + NFTA_TRACE_CHAIN = 0x2 + NFTA_TRACE_RULE_HANDLE = 0x3 + NFTA_TRACE_TYPE = 0x4 + NFTA_TRACE_VERDICT = 0x5 + NFTA_TRACE_ID = 0x6 + NFTA_TRACE_LL_HEADER = 0x7 + NFTA_TRACE_NETWORK_HEADER = 0x8 + NFTA_TRACE_TRANSPORT_HEADER = 0x9 + NFTA_TRACE_IIF = 0xa + NFTA_TRACE_IIFTYPE = 0xb + NFTA_TRACE_OIF = 0xc + NFTA_TRACE_OIFTYPE = 0xd + NFTA_TRACE_MARK = 0xe + NFTA_TRACE_NFPROTO = 0xf + NFTA_TRACE_POLICY = 0x10 + NFTA_TRACE_PAD = 0x11 + NFT_TRACETYPE_UNSPEC = 0x0 + NFT_TRACETYPE_POLICY = 0x1 + NFT_TRACETYPE_RETURN = 0x2 + NFT_TRACETYPE_RULE = 0x3 + NFTA_NG_UNSPEC = 0x0 + NFTA_NG_DREG = 0x1 + NFTA_NG_MODULUS = 0x2 + NFTA_NG_TYPE = 0x3 + NFTA_NG_OFFSET = 0x4 + NFT_NG_INCREMENTAL = 0x0 + NFT_NG_RANDOM = 0x1 +) + +type RTCTime struct { + Sec int32 + Min int32 + Hour int32 + Mday int32 + Mon int32 + Year int32 + Wday int32 + Yday int32 + Isdst int32 +} + +type RTCWkAlrm struct { + Enabled uint8 + Pending uint8 + _ [2]byte + Time RTCTime +} + +type RTCPLLInfo struct { + Ctrl int32 + Value int32 + Max int32 + Min int32 + Posmult int32 + Negmult int32 + Clock int64 +} + +type BlkpgIoctlArg struct { + Op int32 + Flags int32 + Datalen int32 + _ [4]byte + Data *byte +} + +type BlkpgPartition struct { + Start int64 + Length int64 + Pno int32 + Devname [64]uint8 + Volname [64]uint8 + _ [4]byte +} + +const ( + BLKPG = 0x1269 + BLKPG_ADD_PARTITION = 0x1 + BLKPG_DEL_PARTITION = 0x2 + BLKPG_RESIZE_PARTITION = 0x3 +) + +const ( + NETNSA_NONE = 0x0 + NETNSA_NSID = 0x1 + NETNSA_PID = 0x2 + NETNSA_FD = 0x3 +) + +type XDPRingOffset struct { + Producer uint64 + Consumer uint64 + Desc uint64 +} + +type XDPMmapOffsets struct { + Rx XDPRingOffset + Tx XDPRingOffset + Fr XDPRingOffset + Cr XDPRingOffset +} + +type XDPUmemReg struct { + Addr uint64 + Len uint64 + Size uint32 + Headroom uint32 +} + +type XDPStatistics struct { + Rx_dropped uint64 + Rx_invalid_descs uint64 + Tx_invalid_descs uint64 +} + +type XDPDesc struct { + Addr uint64 + Len uint32 + Options uint32 +} + +const ( + NCSI_CMD_UNSPEC = 0x0 + NCSI_CMD_PKG_INFO = 0x1 + NCSI_CMD_SET_INTERFACE = 0x2 + NCSI_CMD_CLEAR_INTERFACE = 0x3 + NCSI_ATTR_UNSPEC = 0x0 + NCSI_ATTR_IFINDEX = 0x1 + NCSI_ATTR_PACKAGE_LIST = 0x2 + NCSI_ATTR_PACKAGE_ID = 0x3 + NCSI_ATTR_CHANNEL_ID = 0x4 + NCSI_PKG_ATTR_UNSPEC = 0x0 + NCSI_PKG_ATTR = 0x1 + NCSI_PKG_ATTR_ID = 0x2 + NCSI_PKG_ATTR_FORCED = 0x3 + NCSI_PKG_ATTR_CHANNEL_LIST = 0x4 + NCSI_CHANNEL_ATTR_UNSPEC = 0x0 + NCSI_CHANNEL_ATTR = 0x1 + NCSI_CHANNEL_ATTR_ID = 0x2 + NCSI_CHANNEL_ATTR_VERSION_MAJOR = 0x3 + NCSI_CHANNEL_ATTR_VERSION_MINOR = 0x4 + NCSI_CHANNEL_ATTR_VERSION_STR = 0x5 + NCSI_CHANNEL_ATTR_LINK_STATE = 0x6 + NCSI_CHANNEL_ATTR_ACTIVE = 0x7 + NCSI_CHANNEL_ATTR_FORCED = 0x8 + NCSI_CHANNEL_ATTR_VLAN_LIST = 0x9 + NCSI_CHANNEL_ATTR_VLAN_ID = 0xa +) + +const ( + SOF_TIMESTAMPING_TX_HARDWARE = 0x1 + SOF_TIMESTAMPING_TX_SOFTWARE = 0x2 + SOF_TIMESTAMPING_RX_HARDWARE = 0x4 + SOF_TIMESTAMPING_RX_SOFTWARE = 0x8 + SOF_TIMESTAMPING_SOFTWARE = 0x10 + SOF_TIMESTAMPING_SYS_HARDWARE = 0x20 + SOF_TIMESTAMPING_RAW_HARDWARE = 0x40 + SOF_TIMESTAMPING_OPT_ID = 0x80 + SOF_TIMESTAMPING_TX_SCHED = 0x100 + SOF_TIMESTAMPING_TX_ACK = 0x200 + SOF_TIMESTAMPING_OPT_CMSG = 0x400 + SOF_TIMESTAMPING_OPT_TSONLY = 0x800 + SOF_TIMESTAMPING_OPT_STATS = 0x1000 + SOF_TIMESTAMPING_OPT_PKTINFO = 0x2000 + SOF_TIMESTAMPING_OPT_TX_SWHW = 0x4000 + + SOF_TIMESTAMPING_LAST = 0x4000 + SOF_TIMESTAMPING_MASK = 0x7fff +) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go new file mode 100644 index 00000000..1fc7f7de --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go @@ -0,0 +1,690 @@ +// +build sparc64,linux +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types_linux.go | go run mkpost.go + +package unix + +const ( + SizeofPtr = 0x8 + SizeofShort = 0x2 + SizeofInt = 0x4 + SizeofLong = 0x8 + SizeofLongLong = 0x8 + PathMax = 0x1000 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int32 + Pad_cgo_0 [4]byte +} + +type Timex struct { + Modes uint32 + Pad_cgo_0 [4]byte + Offset int64 + Freq int64 + Maxerror int64 + Esterror int64 + Status int32 + Pad_cgo_1 [4]byte + Constant int64 + Precision int64 + Tolerance int64 + Time Timeval + Tick int64 + Ppsfreq int64 + Jitter int64 + Shift int32 + Pad_cgo_2 [4]byte + Stabil int64 + Jitcnt int64 + Calcnt int64 + Errcnt int64 + Stbcnt int64 + Tai int32 + Pad_cgo_3 [44]byte +} + +type Time_t int64 + +type Tms struct { + Utime int64 + Stime int64 + Cutime int64 + Cstime int64 +} + +type Utimbuf struct { + Actime int64 + Modtime int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint64 + X__pad1 uint16 + Pad_cgo_0 [6]byte + Ino uint64 + Mode uint32 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev uint64 + X__pad2 uint16 + Pad_cgo_1 [6]byte + Size int64 + Blksize int64 + Blocks int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + X__glibc_reserved4 uint64 + X__glibc_reserved5 uint64 +} + +type Statfs_t struct { + Type int64 + Bsize int64 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Namelen int64 + Frsize int64 + Flags int64 + Spare [4]int64 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]int8 + Pad_cgo_0 [5]byte +} + +type Fsid struct { + X__val [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + Pad_cgo_0 [4]byte + Start int64 + Len int64 + Pid int32 + X__glibc_reserved int16 + Pad_cgo_1 [2]byte +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddrCAN struct { + Family uint16 + Pad_cgo_0 [2]byte + Ifindex int32 + Addr [8]byte +} + +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + +type RawSockaddr struct { + Family uint16 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *Iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + Pad_cgo_1 [4]byte +} + +type Cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + Pad_cgo_0 [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x38 + SizeofCmsghdr = 0x10 + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_NUM_VF = 0x15 + IFLA_VFINFO_LIST = 0x16 + IFLA_STATS64 = 0x17 + IFLA_VF_PORTS = 0x18 + IFLA_PORT_SELF = 0x19 + IFLA_AF_SPEC = 0x1a + IFLA_GROUP = 0x1b + IFLA_NET_NS_FD = 0x1c + IFLA_EXT_MASK = 0x1d + IFLA_PROMISCUITY = 0x1e + IFLA_NUM_TX_QUEUES = 0x1f + IFLA_NUM_RX_QUEUES = 0x20 + IFLA_CARRIER = 0x21 + IFLA_PHYS_PORT_ID = 0x22 + IFLA_CARRIER_CHANGES = 0x23 + IFLA_PHYS_SWITCH_ID = 0x24 + IFLA_LINK_NETNSID = 0x25 + IFLA_PHYS_PORT_NAME = 0x26 + IFLA_PROTO_DOWN = 0x27 + IFLA_GSO_MAX_SEGS = 0x28 + IFLA_GSO_MAX_SIZE = 0x29 + IFLA_PAD = 0x2a + IFLA_XDP = 0x2b + IFLA_EVENT = 0x2c + IFLA_NEW_NETNSID = 0x2d + IFLA_IF_NETNSID = 0x2e + IFLA_MAX = 0x2e + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + X__ifi_pad uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x10 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + Pad_cgo_0 [6]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + Regs [16]uint64 + Tstate uint64 + Tpc uint64 + Tnpc uint64 + Y uint32 + Magic uint32 +} + +type ptracePsw struct { +} + +type ptraceFpregs struct { +} + +type ptracePer struct { +} + +type FdSet struct { + Bits [16]int64 +} + +type Sysinfo_t struct { + Uptime int64 + Loads [3]uint64 + Totalram uint64 + Freeram uint64 + Sharedram uint64 + Bufferram uint64 + Totalswap uint64 + Freeswap uint64 + Procs uint16 + Pad uint16 + Pad_cgo_0 [4]byte + Totalhigh uint64 + Freehigh uint64 + Unit uint32 + X_f [0]int8 + Pad_cgo_1 [4]byte +} + +type Utsname struct { + Sysname [65]byte + Nodename [65]byte + Release [65]byte + Version [65]byte + Machine [65]byte + Domainname [65]byte +} + +type Ustat_t struct { + Tfree int32 + Pad_cgo_0 [4]byte + Tinode uint64 + Fname [6]int8 + Fpack [6]int8 + Pad_cgo_1 [4]byte +} + +type EpollEvent struct { + Events uint32 + X_padFd int32 + Fd int32 + Pad int32 +} + +const ( + AT_FDCWD = -0x64 + AT_REMOVEDIR = 0x200 + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x800 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Sigset_t struct { + X__val [16]uint64 +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Line uint8 + Cc [19]uint8 + Ispeed uint32 + Ospeed uint32 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go new file mode 100644 index 00000000..1fdc5fd2 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go @@ -0,0 +1,458 @@ +// cgo -godefs types_netbsd.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build 386,netbsd + +package unix + +const ( + SizeofPtr = 0x4 + SizeofShort = 0x2 + SizeofInt = 0x4 + SizeofLong = 0x4 + SizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int32 +} + +type Timeval struct { + Sec int64 + Usec int32 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint64 + Mode uint32 + Ino uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev uint64 + Atimespec Timespec + Mtimespec Timespec + Ctimespec Timespec + Birthtimespec Timespec + Size int64 + Blocks int64 + Blksize uint32 + Flags uint32 + Gen uint32 + Spare [2]uint32 +} + +type Statfs_t [0]byte + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Dirent struct { + Fileno uint64 + Reclen uint16 + Namlen uint16 + Type uint8 + Name [512]int8 + Pad_cgo_0 [3]byte +} + +type Fsid struct { + X__fsid_val [2]int32 +} + +const ( + PathMax = 0x400 +) + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [12]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen int32 + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x14 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint32 + Filter uint32 + Flags uint32 + Fflags uint32 + Data int64 + Udata int32 +} + +type FdSet struct { + Bits [8]uint32 +} + +const ( + SizeofIfMsghdr = 0x98 + SizeofIfData = 0x84 + SizeofIfaMsghdr = 0x18 + SizeofIfAnnounceMsghdr = 0x18 + SizeofRtMsghdr = 0x78 + SizeofRtMetrics = 0x50 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Data IfData + Pad_cgo_1 [4]byte +} + +type IfData struct { + Type uint8 + Addrlen uint8 + Hdrlen uint8 + Pad_cgo_0 [1]byte + Link_state int32 + Mtu uint64 + Metric uint64 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Noproto uint64 + Lastchange Timespec +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Metric int32 + Index uint16 + Pad_cgo_0 [6]byte +} + +type IfAnnounceMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Name [16]int8 + What uint16 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Pad_cgo_0 [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Use int32 + Inits int32 + Pad_cgo_1 [4]byte + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint64 + Mtu uint64 + Hopcount uint64 + Recvpipe uint64 + Sendpipe uint64 + Ssthresh uint64 + Rtt uint64 + Rttvar uint64 + Expire int64 + Pksent int64 +} + +type Mclpool [0]byte + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x80 + SizeofBpfProgram = 0x8 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x14 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint64 + Drop uint64 + Capt uint64 + Padding [13]uint64 +} + +type BpfProgram struct { + Len uint32 + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp BpfTimeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + Pad_cgo_0 [2]byte +} + +type BpfTimeval struct { + Sec int32 + Usec int32 +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed int32 + Ospeed int32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x64 + AT_SYMLINK_NOFOLLOW = 0x200 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) + +type Sysctlnode struct { + Flags uint32 + Num int32 + Name [32]int8 + Ver uint32 + X__rsvd uint32 + Un [16]byte + X_sysctl_size [8]byte + X_sysctl_func [8]byte + X_sysctl_parent [8]byte + X_sysctl_desc [8]byte +} + +type Utsname struct { + Sysname [256]byte + Nodename [256]byte + Release [256]byte + Version [256]byte + Machine [256]byte +} + +const SizeofClockinfo = 0x14 + +type Clockinfo struct { + Hz int32 + Tick int32 + Tickadj int32 + Stathz int32 + Profhz int32 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go new file mode 100644 index 00000000..711f7806 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go @@ -0,0 +1,465 @@ +// cgo -godefs types_netbsd.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,netbsd + +package unix + +const ( + SizeofPtr = 0x8 + SizeofShort = 0x2 + SizeofInt = 0x4 + SizeofLong = 0x8 + SizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int32 + Pad_cgo_0 [4]byte +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint64 + Mode uint32 + Pad_cgo_0 [4]byte + Ino uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Pad_cgo_1 [4]byte + Rdev uint64 + Atimespec Timespec + Mtimespec Timespec + Ctimespec Timespec + Birthtimespec Timespec + Size int64 + Blocks int64 + Blksize uint32 + Flags uint32 + Gen uint32 + Spare [2]uint32 + Pad_cgo_2 [4]byte +} + +type Statfs_t [0]byte + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Dirent struct { + Fileno uint64 + Reclen uint16 + Namlen uint16 + Type uint8 + Name [512]int8 + Pad_cgo_0 [3]byte +} + +type Fsid struct { + X__fsid_val [2]int32 +} + +const ( + PathMax = 0x400 +) + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [12]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *Iovec + Iovlen int32 + Pad_cgo_1 [4]byte + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x14 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x30 + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint64 + Filter uint32 + Flags uint32 + Fflags uint32 + Pad_cgo_0 [4]byte + Data int64 + Udata int64 +} + +type FdSet struct { + Bits [8]uint32 +} + +const ( + SizeofIfMsghdr = 0x98 + SizeofIfData = 0x88 + SizeofIfaMsghdr = 0x18 + SizeofIfAnnounceMsghdr = 0x18 + SizeofRtMsghdr = 0x78 + SizeofRtMetrics = 0x50 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Data IfData +} + +type IfData struct { + Type uint8 + Addrlen uint8 + Hdrlen uint8 + Pad_cgo_0 [1]byte + Link_state int32 + Mtu uint64 + Metric uint64 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Noproto uint64 + Lastchange Timespec +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Metric int32 + Index uint16 + Pad_cgo_0 [6]byte +} + +type IfAnnounceMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Name [16]int8 + What uint16 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Pad_cgo_0 [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Use int32 + Inits int32 + Pad_cgo_1 [4]byte + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint64 + Mtu uint64 + Hopcount uint64 + Recvpipe uint64 + Sendpipe uint64 + Ssthresh uint64 + Rtt uint64 + Rttvar uint64 + Expire int64 + Pksent int64 +} + +type Mclpool [0]byte + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x80 + SizeofBpfProgram = 0x10 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x20 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint64 + Drop uint64 + Capt uint64 + Padding [13]uint64 +} + +type BpfProgram struct { + Len uint32 + Pad_cgo_0 [4]byte + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp BpfTimeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + Pad_cgo_0 [6]byte +} + +type BpfTimeval struct { + Sec int64 + Usec int64 +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed int32 + Ospeed int32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x64 + AT_SYMLINK_NOFOLLOW = 0x200 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) + +type Sysctlnode struct { + Flags uint32 + Num int32 + Name [32]int8 + Ver uint32 + X__rsvd uint32 + Un [16]byte + X_sysctl_size [8]byte + X_sysctl_func [8]byte + X_sysctl_parent [8]byte + X_sysctl_desc [8]byte +} + +type Utsname struct { + Sysname [256]byte + Nodename [256]byte + Release [256]byte + Version [256]byte + Machine [256]byte +} + +const SizeofClockinfo = 0x14 + +type Clockinfo struct { + Hz int32 + Tick int32 + Tickadj int32 + Stathz int32 + Profhz int32 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go new file mode 100644 index 00000000..fa1a16ba --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go @@ -0,0 +1,463 @@ +// cgo -godefs types_netbsd.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm,netbsd + +package unix + +const ( + SizeofPtr = 0x4 + SizeofShort = 0x2 + SizeofInt = 0x4 + SizeofLong = 0x4 + SizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int32 + Pad_cgo_0 [4]byte +} + +type Timeval struct { + Sec int64 + Usec int32 + Pad_cgo_0 [4]byte +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint64 + Mode uint32 + Pad_cgo_0 [4]byte + Ino uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Pad_cgo_1 [4]byte + Rdev uint64 + Atimespec Timespec + Mtimespec Timespec + Ctimespec Timespec + Birthtimespec Timespec + Size int64 + Blocks int64 + Blksize uint32 + Flags uint32 + Gen uint32 + Spare [2]uint32 + Pad_cgo_2 [4]byte +} + +type Statfs_t [0]byte + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Dirent struct { + Fileno uint64 + Reclen uint16 + Namlen uint16 + Type uint8 + Name [512]int8 + Pad_cgo_0 [3]byte +} + +type Fsid struct { + X__fsid_val [2]int32 +} + +const ( + PathMax = 0x400 +) + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [12]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen int32 + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x14 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint32 + Filter uint32 + Flags uint32 + Fflags uint32 + Data int64 + Udata int32 + Pad_cgo_0 [4]byte +} + +type FdSet struct { + Bits [8]uint32 +} + +const ( + SizeofIfMsghdr = 0x98 + SizeofIfData = 0x88 + SizeofIfaMsghdr = 0x18 + SizeofIfAnnounceMsghdr = 0x18 + SizeofRtMsghdr = 0x78 + SizeofRtMetrics = 0x50 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Data IfData +} + +type IfData struct { + Type uint8 + Addrlen uint8 + Hdrlen uint8 + Pad_cgo_0 [1]byte + Link_state int32 + Mtu uint64 + Metric uint64 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Noproto uint64 + Lastchange Timespec +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Metric int32 + Index uint16 + Pad_cgo_0 [6]byte +} + +type IfAnnounceMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Name [16]int8 + What uint16 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Pad_cgo_0 [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Use int32 + Inits int32 + Pad_cgo_1 [4]byte + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint64 + Mtu uint64 + Hopcount uint64 + Recvpipe uint64 + Sendpipe uint64 + Ssthresh uint64 + Rtt uint64 + Rttvar uint64 + Expire int64 + Pksent int64 +} + +type Mclpool [0]byte + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x80 + SizeofBpfProgram = 0x8 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x14 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint64 + Drop uint64 + Capt uint64 + Padding [13]uint64 +} + +type BpfProgram struct { + Len uint32 + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp BpfTimeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + Pad_cgo_0 [2]byte +} + +type BpfTimeval struct { + Sec int32 + Usec int32 +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed int32 + Ospeed int32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x64 + AT_SYMLINK_NOFOLLOW = 0x200 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) + +type Sysctlnode struct { + Flags uint32 + Num int32 + Name [32]int8 + Ver uint32 + X__rsvd uint32 + Un [16]byte + X_sysctl_size [8]byte + X_sysctl_func [8]byte + X_sysctl_parent [8]byte + X_sysctl_desc [8]byte +} + +type Utsname struct { + Sysname [256]byte + Nodename [256]byte + Release [256]byte + Version [256]byte + Machine [256]byte +} + +const SizeofClockinfo = 0x14 + +type Clockinfo struct { + Hz int32 + Tick int32 + Tickadj int32 + Stathz int32 + Profhz int32 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go new file mode 100644 index 00000000..8b37d839 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go @@ -0,0 +1,560 @@ +// cgo -godefs types_openbsd.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build 386,openbsd + +package unix + +const ( + SizeofPtr = 0x4 + SizeofShort = 0x2 + SizeofInt = 0x4 + SizeofLong = 0x4 + SizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int32 +} + +type Timeval struct { + Sec int64 + Usec int32 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Mode uint32 + Dev int32 + Ino uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev int32 + Atim Timespec + Mtim Timespec + Ctim Timespec + Size int64 + Blocks int64 + Blksize uint32 + Flags uint32 + Gen uint32 + X__st_birthtim Timespec +} + +type Statfs_t struct { + F_flags uint32 + F_bsize uint32 + F_iosize uint32 + F_blocks uint64 + F_bfree uint64 + F_bavail int64 + F_files uint64 + F_ffree uint64 + F_favail int64 + F_syncwrites uint64 + F_syncreads uint64 + F_asyncwrites uint64 + F_asyncreads uint64 + F_fsid Fsid + F_namemax uint32 + F_owner uint32 + F_ctime uint64 + F_fstypename [16]int8 + F_mntonname [90]int8 + F_mntfromname [90]int8 + F_mntfromspec [90]int8 + Pad_cgo_0 [2]byte + Mount_info [160]byte +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Dirent struct { + Fileno uint64 + Off int64 + Reclen uint16 + Type uint8 + Namlen uint8 + X__d_padding [4]uint8 + Name [256]int8 +} + +type Fsid struct { + Val [2]int32 +} + +const ( + PathMax = 0x400 +) + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [24]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen uint32 + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x20 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint32 + Filter int16 + Flags uint16 + Fflags uint32 + Data int64 + Udata *byte +} + +type FdSet struct { + Bits [32]uint32 +} + +const ( + SizeofIfMsghdr = 0xec + SizeofIfData = 0xd4 + SizeofIfaMsghdr = 0x18 + SizeofIfAnnounceMsghdr = 0x1a + SizeofRtMsghdr = 0x60 + SizeofRtMetrics = 0x38 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + Tableid uint16 + Pad1 uint8 + Pad2 uint8 + Addrs int32 + Flags int32 + Xflags int32 + Data IfData +} + +type IfData struct { + Type uint8 + Addrlen uint8 + Hdrlen uint8 + Link_state uint8 + Mtu uint32 + Metric uint32 + Pad uint32 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Noproto uint64 + Capabilities uint32 + Lastchange Timeval + Mclpool [7]Mclpool +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + Tableid uint16 + Pad1 uint8 + Pad2 uint8 + Addrs int32 + Flags int32 + Metric int32 +} + +type IfAnnounceMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + What uint16 + Name [16]int8 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + Tableid uint16 + Priority uint8 + Mpls uint8 + Addrs int32 + Flags int32 + Fmask int32 + Pid int32 + Seq int32 + Errno int32 + Inits uint32 + Rmx RtMetrics +} + +type RtMetrics struct { + Pksent uint64 + Expire int64 + Locks uint32 + Mtu uint32 + Refcnt uint32 + Hopcount uint32 + Recvpipe uint32 + Sendpipe uint32 + Ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Pad uint32 +} + +type Mclpool struct { + Grown int32 + Alive uint16 + Hwm uint16 + Cwm uint16 + Lwm uint16 +} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x8 + SizeofBpfProgram = 0x8 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x14 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint32 + Drop uint32 +} + +type BpfProgram struct { + Len uint32 + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp BpfTimeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + Pad_cgo_0 [2]byte +} + +type BpfTimeval struct { + Sec uint32 + Usec uint32 +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed int32 + Ospeed int32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x64 + AT_SYMLINK_NOFOLLOW = 0x2 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) + +type Sigset_t uint32 + +type Utsname struct { + Sysname [256]byte + Nodename [256]byte + Release [256]byte + Version [256]byte + Machine [256]byte +} + +const SizeofUvmexp = 0x158 + +type Uvmexp struct { + Pagesize int32 + Pagemask int32 + Pageshift int32 + Npages int32 + Free int32 + Active int32 + Inactive int32 + Paging int32 + Wired int32 + Zeropages int32 + Reserve_pagedaemon int32 + Reserve_kernel int32 + Anonpages int32 + Vnodepages int32 + Vtextpages int32 + Freemin int32 + Freetarg int32 + Inactarg int32 + Wiredmax int32 + Anonmin int32 + Vtextmin int32 + Vnodemin int32 + Anonminpct int32 + Vtextminpct int32 + Vnodeminpct int32 + Nswapdev int32 + Swpages int32 + Swpginuse int32 + Swpgonly int32 + Nswget int32 + Nanon int32 + Nanonneeded int32 + Nfreeanon int32 + Faults int32 + Traps int32 + Intrs int32 + Swtch int32 + Softs int32 + Syscalls int32 + Pageins int32 + Obsolete_swapins int32 + Obsolete_swapouts int32 + Pgswapin int32 + Pgswapout int32 + Forks int32 + Forks_ppwait int32 + Forks_sharevm int32 + Pga_zerohit int32 + Pga_zeromiss int32 + Zeroaborts int32 + Fltnoram int32 + Fltnoanon int32 + Fltnoamap int32 + Fltpgwait int32 + Fltpgrele int32 + Fltrelck int32 + Fltrelckok int32 + Fltanget int32 + Fltanretry int32 + Fltamcopy int32 + Fltnamap int32 + Fltnomap int32 + Fltlget int32 + Fltget int32 + Flt_anon int32 + Flt_acow int32 + Flt_obj int32 + Flt_prcopy int32 + Flt_przero int32 + Pdwoke int32 + Pdrevs int32 + Pdswout int32 + Pdfreed int32 + Pdscans int32 + Pdanscan int32 + Pdobscan int32 + Pdreact int32 + Pdbusy int32 + Pdpageouts int32 + Pdpending int32 + Pddeact int32 + Pdreanon int32 + Pdrevnode int32 + Pdrevtext int32 + Fpswtch int32 + Kmapent int32 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go new file mode 100644 index 00000000..6efea463 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go @@ -0,0 +1,560 @@ +// cgo -godefs types_openbsd.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,openbsd + +package unix + +const ( + SizeofPtr = 0x8 + SizeofShort = 0x2 + SizeofInt = 0x4 + SizeofLong = 0x8 + SizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Mode uint32 + Dev int32 + Ino uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev int32 + Atim Timespec + Mtim Timespec + Ctim Timespec + Size int64 + Blocks int64 + Blksize int32 + Flags uint32 + Gen uint32 + _ [4]byte + _ Timespec +} + +type Statfs_t struct { + F_flags uint32 + F_bsize uint32 + F_iosize uint32 + _ [4]byte + F_blocks uint64 + F_bfree uint64 + F_bavail int64 + F_files uint64 + F_ffree uint64 + F_favail int64 + F_syncwrites uint64 + F_syncreads uint64 + F_asyncwrites uint64 + F_asyncreads uint64 + F_fsid Fsid + F_namemax uint32 + F_owner uint32 + F_ctime uint64 + F_fstypename [16]int8 + F_mntonname [90]int8 + F_mntfromname [90]int8 + F_mntfromspec [90]int8 + _ [2]byte + Mount_info [160]byte +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Dirent struct { + Fileno uint64 + Off int64 + Reclen uint16 + Type uint8 + Namlen uint8 + _ [4]uint8 + Name [256]int8 +} + +type Fsid struct { + Val [2]int32 +} + +const ( + PathMax = 0x400 +) + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [24]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + _ [4]byte + Iov *Iovec + Iovlen uint32 + _ [4]byte + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x20 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x30 + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint64 + Filter int16 + Flags uint16 + Fflags uint32 + Data int64 + Udata *byte +} + +type FdSet struct { + Bits [32]uint32 +} + +const ( + SizeofIfMsghdr = 0xa8 + SizeofIfData = 0x90 + SizeofIfaMsghdr = 0x18 + SizeofIfAnnounceMsghdr = 0x1a + SizeofRtMsghdr = 0x60 + SizeofRtMetrics = 0x38 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + Tableid uint16 + Pad1 uint8 + Pad2 uint8 + Addrs int32 + Flags int32 + Xflags int32 + Data IfData +} + +type IfData struct { + Type uint8 + Addrlen uint8 + Hdrlen uint8 + Link_state uint8 + Mtu uint32 + Metric uint32 + Rdomain uint32 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Oqdrops uint64 + Noproto uint64 + Capabilities uint32 + _ [4]byte + Lastchange Timeval +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + Tableid uint16 + Pad1 uint8 + Pad2 uint8 + Addrs int32 + Flags int32 + Metric int32 +} + +type IfAnnounceMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + What uint16 + Name [16]int8 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + Tableid uint16 + Priority uint8 + Mpls uint8 + Addrs int32 + Flags int32 + Fmask int32 + Pid int32 + Seq int32 + Errno int32 + Inits uint32 + Rmx RtMetrics +} + +type RtMetrics struct { + Pksent uint64 + Expire int64 + Locks uint32 + Mtu uint32 + Refcnt uint32 + Hopcount uint32 + Recvpipe uint32 + Sendpipe uint32 + Ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Pad uint32 +} + +type Mclpool struct{} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x8 + SizeofBpfProgram = 0x10 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x14 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint32 + Drop uint32 +} + +type BpfProgram struct { + Len uint32 + _ [4]byte + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp BpfTimeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + _ [2]byte +} + +type BpfTimeval struct { + Sec uint32 + Usec uint32 +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed int32 + Ospeed int32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x64 + AT_SYMLINK_NOFOLLOW = 0x2 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) + +type Sigset_t uint32 + +type Utsname struct { + Sysname [256]byte + Nodename [256]byte + Release [256]byte + Version [256]byte + Machine [256]byte +} + +const SizeofUvmexp = 0x158 + +type Uvmexp struct { + Pagesize int32 + Pagemask int32 + Pageshift int32 + Npages int32 + Free int32 + Active int32 + Inactive int32 + Paging int32 + Wired int32 + Zeropages int32 + Reserve_pagedaemon int32 + Reserve_kernel int32 + Anonpages int32 + Vnodepages int32 + Vtextpages int32 + Freemin int32 + Freetarg int32 + Inactarg int32 + Wiredmax int32 + Anonmin int32 + Vtextmin int32 + Vnodemin int32 + Anonminpct int32 + Vtextminpct int32 + Vnodeminpct int32 + Nswapdev int32 + Swpages int32 + Swpginuse int32 + Swpgonly int32 + Nswget int32 + Nanon int32 + Nanonneeded int32 + Nfreeanon int32 + Faults int32 + Traps int32 + Intrs int32 + Swtch int32 + Softs int32 + Syscalls int32 + Pageins int32 + Obsolete_swapins int32 + Obsolete_swapouts int32 + Pgswapin int32 + Pgswapout int32 + Forks int32 + Forks_ppwait int32 + Forks_sharevm int32 + Pga_zerohit int32 + Pga_zeromiss int32 + Zeroaborts int32 + Fltnoram int32 + Fltnoanon int32 + Fltnoamap int32 + Fltpgwait int32 + Fltpgrele int32 + Fltrelck int32 + Fltrelckok int32 + Fltanget int32 + Fltanretry int32 + Fltamcopy int32 + Fltnamap int32 + Fltnomap int32 + Fltlget int32 + Fltget int32 + Flt_anon int32 + Flt_acow int32 + Flt_obj int32 + Flt_prcopy int32 + Flt_przero int32 + Pdwoke int32 + Pdrevs int32 + Pdswout int32 + Pdfreed int32 + Pdscans int32 + Pdanscan int32 + Pdobscan int32 + Pdreact int32 + Pdbusy int32 + Pdpageouts int32 + Pdpending int32 + Pddeact int32 + Pdreanon int32 + Pdrevnode int32 + Pdrevtext int32 + Fpswtch int32 + Kmapent int32 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go new file mode 100644 index 00000000..87a637e3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go @@ -0,0 +1,553 @@ +// cgo -godefs types_openbsd.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm,openbsd + +package unix + +const ( + SizeofPtr = 0x4 + SizeofShort = 0x2 + SizeofInt = 0x4 + SizeofLong = 0x4 + SizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int32 +} + +type Timeval struct { + Sec int64 + Usec int32 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Mode uint32 + Dev int32 + Ino uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev int32 + Atim Timespec + Mtim Timespec + Ctim Timespec + Size int64 + Blocks int64 + Blksize int32 + Flags uint32 + Gen uint32 + X__st_birthtim Timespec +} + +type Statfs_t struct { + F_flags uint32 + F_bsize uint32 + F_iosize uint32 + F_blocks uint64 + F_bfree uint64 + F_bavail int64 + F_files uint64 + F_ffree uint64 + F_favail int64 + F_syncwrites uint64 + F_syncreads uint64 + F_asyncwrites uint64 + F_asyncreads uint64 + F_fsid Fsid + F_namemax uint32 + F_owner uint32 + F_ctime uint64 + F_fstypename [16]uint8 + F_mntonname [90]uint8 + F_mntfromname [90]uint8 + F_mntfromspec [90]uint8 + Pad_cgo_0 [2]byte + Mount_info [160]byte +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Dirent struct { + Fileno uint64 + Off int64 + Reclen uint16 + Type uint8 + Namlen uint8 + X__d_padding [4]uint8 + Name [256]uint8 +} + +type Fsid struct { + Val [2]int32 +} + +const ( + PathMax = 0x400 +) + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [24]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen uint32 + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x20 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint32 + Filter int16 + Flags uint16 + Fflags uint32 + Data int64 + Udata *byte +} + +type FdSet struct { + Bits [32]uint32 +} + +const ( + SizeofIfMsghdr = 0x98 + SizeofIfData = 0x80 + SizeofIfaMsghdr = 0x18 + SizeofIfAnnounceMsghdr = 0x1a + SizeofRtMsghdr = 0x60 + SizeofRtMetrics = 0x38 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + Tableid uint16 + Pad1 uint8 + Pad2 uint8 + Addrs int32 + Flags int32 + Xflags int32 + Data IfData +} + +type IfData struct { + Type uint8 + Addrlen uint8 + Hdrlen uint8 + Link_state uint8 + Mtu uint32 + Metric uint32 + Pad uint32 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Noproto uint64 + Capabilities uint32 + Lastchange Timeval +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + Tableid uint16 + Pad1 uint8 + Pad2 uint8 + Addrs int32 + Flags int32 + Metric int32 +} + +type IfAnnounceMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + What uint16 + Name [16]uint8 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + Tableid uint16 + Priority uint8 + Mpls uint8 + Addrs int32 + Flags int32 + Fmask int32 + Pid int32 + Seq int32 + Errno int32 + Inits uint32 + Rmx RtMetrics +} + +type RtMetrics struct { + Pksent uint64 + Expire int64 + Locks uint32 + Mtu uint32 + Refcnt uint32 + Hopcount uint32 + Recvpipe uint32 + Sendpipe uint32 + Ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Pad uint32 +} + +type Mclpool struct{} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x8 + SizeofBpfProgram = 0x8 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x14 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint32 + Drop uint32 +} + +type BpfProgram struct { + Len uint32 + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp BpfTimeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + Pad_cgo_0 [2]byte +} + +type BpfTimeval struct { + Sec uint32 + Usec uint32 +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed int32 + Ospeed int32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x64 + AT_SYMLINK_NOFOLLOW = 0x2 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) + +type Sigset_t uint32 + +type Utsname struct { + Sysname [256]byte + Nodename [256]byte + Release [256]byte + Version [256]byte + Machine [256]byte +} + +const SizeofUvmexp = 0x158 + +type Uvmexp struct { + Pagesize int32 + Pagemask int32 + Pageshift int32 + Npages int32 + Free int32 + Active int32 + Inactive int32 + Paging int32 + Wired int32 + Zeropages int32 + Reserve_pagedaemon int32 + Reserve_kernel int32 + Anonpages int32 + Vnodepages int32 + Vtextpages int32 + Freemin int32 + Freetarg int32 + Inactarg int32 + Wiredmax int32 + Anonmin int32 + Vtextmin int32 + Vnodemin int32 + Anonminpct int32 + Vtextminpct int32 + Vnodeminpct int32 + Nswapdev int32 + Swpages int32 + Swpginuse int32 + Swpgonly int32 + Nswget int32 + Nanon int32 + Nanonneeded int32 + Nfreeanon int32 + Faults int32 + Traps int32 + Intrs int32 + Swtch int32 + Softs int32 + Syscalls int32 + Pageins int32 + Obsolete_swapins int32 + Obsolete_swapouts int32 + Pgswapin int32 + Pgswapout int32 + Forks int32 + Forks_ppwait int32 + Forks_sharevm int32 + Pga_zerohit int32 + Pga_zeromiss int32 + Zeroaborts int32 + Fltnoram int32 + Fltnoanon int32 + Fltnoamap int32 + Fltpgwait int32 + Fltpgrele int32 + Fltrelck int32 + Fltrelckok int32 + Fltanget int32 + Fltanretry int32 + Fltamcopy int32 + Fltnamap int32 + Fltnomap int32 + Fltlget int32 + Fltget int32 + Flt_anon int32 + Flt_acow int32 + Flt_obj int32 + Flt_prcopy int32 + Flt_przero int32 + Pdwoke int32 + Pdrevs int32 + Pdswout int32 + Pdfreed int32 + Pdscans int32 + Pdanscan int32 + Pdobscan int32 + Pdreact int32 + Pdbusy int32 + Pdpageouts int32 + Pdpending int32 + Pddeact int32 + Pdreanon int32 + Pdrevnode int32 + Pdrevtext int32 + Fpswtch int32 + Kmapent int32 +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go new file mode 100644 index 00000000..8531a190 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go @@ -0,0 +1,442 @@ +// cgo -godefs types_solaris.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,solaris + +package unix + +const ( + SizeofPtr = 0x8 + SizeofShort = 0x2 + SizeofInt = 0x4 + SizeofLong = 0x8 + SizeofLongLong = 0x8 + PathMax = 0x400 + MaxHostNameLen = 0x100 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Timeval32 struct { + Sec int32 + Usec int32 +} + +type Tms struct { + Utime int64 + Stime int64 + Cutime int64 + Cstime int64 +} + +type Utimbuf struct { + Actime int64 + Modtime int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint64 + Ino uint64 + Mode uint32 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev uint64 + Size int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + Blksize int32 + _ [4]byte + Blocks int64 + Fstype [16]int8 +} + +type Flock_t struct { + Type int16 + Whence int16 + _ [4]byte + Start int64 + Len int64 + Sysid int32 + Pid int32 + Pad [4]int64 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Name [1]int8 + _ [5]byte +} + +type _Fsblkcnt_t uint64 + +type Statvfs_t struct { + Bsize uint64 + Frsize uint64 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Favail uint64 + Fsid uint64 + Basetype [16]int8 + Flag uint64 + Namemax uint64 + Fstr [32]int8 +} + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 + X__sin6_src_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrDatalink struct { + Family uint16 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [244]int8 +} + +type RawSockaddr struct { + Family uint16 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [236]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *int8 + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + _ [4]byte + Iov *Iovec + Iovlen int32 + _ [4]byte + Accrights *int8 + Accrightslen int32 + _ [4]byte +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + X__icmp6_filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x20 + SizeofSockaddrAny = 0xfc + SizeofSockaddrUnix = 0x6e + SizeofSockaddrDatalink = 0xfc + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x30 + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x24 + SizeofICMPv6Filter = 0x20 +) + +type FdSet struct { + Bits [1024]int64 +} + +type Utsname struct { + Sysname [257]byte + Nodename [257]byte + Release [257]byte + Version [257]byte + Machine [257]byte +} + +type Ustat_t struct { + Tfree int64 + Tinode uint64 + Fname [6]int8 + Fpack [6]int8 + _ [4]byte +} + +const ( + AT_FDCWD = 0xffd19553 + AT_SYMLINK_NOFOLLOW = 0x1000 + AT_SYMLINK_FOLLOW = 0x2000 + AT_REMOVEDIR = 0x1 + AT_EACCESS = 0x4 +) + +const ( + SizeofIfMsghdr = 0x54 + SizeofIfData = 0x44 + SizeofIfaMsghdr = 0x14 + SizeofRtMsghdr = 0x4c + SizeofRtMetrics = 0x28 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Data IfData +} + +type IfData struct { + Type uint8 + Addrlen uint8 + Hdrlen uint8 + _ [1]byte + Mtu uint32 + Metric uint32 + Baudrate uint32 + Ipackets uint32 + Ierrors uint32 + Opackets uint32 + Oerrors uint32 + Collisions uint32 + Ibytes uint32 + Obytes uint32 + Imcasts uint32 + Omcasts uint32 + Iqdrops uint32 + Noproto uint32 + Lastchange Timeval32 +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Metric int32 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + _ [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Use int32 + Inits uint32 + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint32 + Mtu uint32 + Hopcount uint32 + Expire uint32 + Recvpipe uint32 + Sendpipe uint32 + Ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Pksent uint32 +} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x80 + SizeofBpfProgram = 0x10 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x14 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint64 + Drop uint64 + Capt uint64 + Padding [13]uint64 +} + +type BpfProgram struct { + Len uint32 + _ [4]byte + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfTimeval struct { + Sec int32 + Usec int32 +} + +type BpfHdr struct { + Tstamp BpfTimeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + _ [2]byte +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [19]uint8 + _ [1]byte +} + +type Termio struct { + Iflag uint16 + Oflag uint16 + Cflag uint16 + Lflag uint16 + Line int8 + Cc [8]uint8 + _ [1]byte +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/text/AUTHORS b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/text/AUTHORS new file mode 100644 index 00000000..15167cd7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/text/AUTHORS @@ -0,0 +1,3 @@ +# This source code refers to The Go Authors for copyright purposes. +# The master list of authors is in the main Go distribution, +# visible at http://tip.golang.org/AUTHORS. diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/text/CONTRIBUTORS b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/text/CONTRIBUTORS new file mode 100644 index 00000000..1c4577e9 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/text/CONTRIBUTORS @@ -0,0 +1,3 @@ +# This source code was written by the Go contributors. +# The master list of contributors is in the main Go distribution, +# visible at http://tip.golang.org/CONTRIBUTORS. diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/text/LICENSE b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/text/LICENSE new file mode 100644 index 00000000..6a66aea5 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/text/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2009 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/text/PATENTS b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/text/PATENTS new file mode 100644 index 00000000..73309904 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/text/PATENTS @@ -0,0 +1,22 @@ +Additional IP Rights Grant (Patents) + +"This implementation" means the copyrightable works distributed by +Google as part of the Go project. + +Google hereby grants to You a perpetual, worldwide, non-exclusive, +no-charge, royalty-free, irrevocable (except as stated in this section) +patent license to make, have made, use, offer to sell, sell, import, +transfer and otherwise run, modify and propagate the contents of this +implementation of Go, where such license applies only to those patent +claims, both currently owned or controlled by Google and acquired in +the future, licensable by Google that are necessarily infringed by this +implementation of Go. This grant does not include claims that would be +infringed only as a consequence of further modification of this +implementation. If you or your agent or exclusive licensee institute or +order or agree to the institution of patent litigation against any +entity (including a cross-claim or counterclaim in a lawsuit) alleging +that this implementation of Go or any code incorporated within this +implementation of Go constitutes direct or contributory patent +infringement, or inducement of patent infringement, then any patent +rights granted to you under this License for this implementation of Go +shall terminate as of the date such litigation is filed. diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/text/internal/gen/code.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/text/internal/gen/code.go new file mode 100644 index 00000000..0389509f --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/text/internal/gen/code.go @@ -0,0 +1,369 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package gen + +import ( + "bytes" + "encoding/gob" + "fmt" + "hash" + "hash/fnv" + "io" + "log" + "os" + "reflect" + "strings" + "unicode" + "unicode/utf8" +) + +// This file contains utilities for generating code. + +// TODO: other write methods like: +// - slices, maps, types, etc. + +// CodeWriter is a utility for writing structured code. It computes the content +// hash and size of written content. It ensures there are newlines between +// written code blocks. +type CodeWriter struct { + buf bytes.Buffer + Size int + Hash hash.Hash32 // content hash + gob *gob.Encoder + // For comments we skip the usual one-line separator if they are followed by + // a code block. + skipSep bool +} + +func (w *CodeWriter) Write(p []byte) (n int, err error) { + return w.buf.Write(p) +} + +// NewCodeWriter returns a new CodeWriter. +func NewCodeWriter() *CodeWriter { + h := fnv.New32() + return &CodeWriter{Hash: h, gob: gob.NewEncoder(h)} +} + +// WriteGoFile appends the buffer with the total size of all created structures +// and writes it as a Go file to the the given file with the given package name. +func (w *CodeWriter) WriteGoFile(filename, pkg string) { + f, err := os.Create(filename) + if err != nil { + log.Fatalf("Could not create file %s: %v", filename, err) + } + defer f.Close() + if _, err = w.WriteGo(f, pkg, ""); err != nil { + log.Fatalf("Error writing file %s: %v", filename, err) + } +} + +// WriteVersionedGoFile appends the buffer with the total size of all created +// structures and writes it as a Go file to the the given file with the given +// package name and build tags for the current Unicode version, +func (w *CodeWriter) WriteVersionedGoFile(filename, pkg string) { + tags := buildTags() + if tags != "" { + filename = insertVersion(filename, UnicodeVersion()) + } + f, err := os.Create(filename) + if err != nil { + log.Fatalf("Could not create file %s: %v", filename, err) + } + defer f.Close() + if _, err = w.WriteGo(f, pkg, tags); err != nil { + log.Fatalf("Error writing file %s: %v", filename, err) + } +} + +// WriteGo appends the buffer with the total size of all created structures and +// writes it as a Go file to the the given writer with the given package name. +func (w *CodeWriter) WriteGo(out io.Writer, pkg, tags string) (n int, err error) { + sz := w.Size + w.WriteComment("Total table size %d bytes (%dKiB); checksum: %X\n", sz, sz/1024, w.Hash.Sum32()) + defer w.buf.Reset() + return WriteGo(out, pkg, tags, w.buf.Bytes()) +} + +func (w *CodeWriter) printf(f string, x ...interface{}) { + fmt.Fprintf(w, f, x...) +} + +func (w *CodeWriter) insertSep() { + if w.skipSep { + w.skipSep = false + return + } + // Use at least two newlines to ensure a blank space between the previous + // block. WriteGoFile will remove extraneous newlines. + w.printf("\n\n") +} + +// WriteComment writes a comment block. All line starts are prefixed with "//". +// Initial empty lines are gobbled. The indentation for the first line is +// stripped from consecutive lines. +func (w *CodeWriter) WriteComment(comment string, args ...interface{}) { + s := fmt.Sprintf(comment, args...) + s = strings.Trim(s, "\n") + + // Use at least two newlines to ensure a blank space between the previous + // block. WriteGoFile will remove extraneous newlines. + w.printf("\n\n// ") + w.skipSep = true + + // strip first indent level. + sep := "\n" + for ; len(s) > 0 && (s[0] == '\t' || s[0] == ' '); s = s[1:] { + sep += s[:1] + } + + strings.NewReplacer(sep, "\n// ", "\n", "\n// ").WriteString(w, s) + + w.printf("\n") +} + +func (w *CodeWriter) writeSizeInfo(size int) { + w.printf("// Size: %d bytes\n", size) +} + +// WriteConst writes a constant of the given name and value. +func (w *CodeWriter) WriteConst(name string, x interface{}) { + w.insertSep() + v := reflect.ValueOf(x) + + switch v.Type().Kind() { + case reflect.String: + w.printf("const %s %s = ", name, typeName(x)) + w.WriteString(v.String()) + w.printf("\n") + default: + w.printf("const %s = %#v\n", name, x) + } +} + +// WriteVar writes a variable of the given name and value. +func (w *CodeWriter) WriteVar(name string, x interface{}) { + w.insertSep() + v := reflect.ValueOf(x) + oldSize := w.Size + sz := int(v.Type().Size()) + w.Size += sz + + switch v.Type().Kind() { + case reflect.String: + w.printf("var %s %s = ", name, typeName(x)) + w.WriteString(v.String()) + case reflect.Struct: + w.gob.Encode(x) + fallthrough + case reflect.Slice, reflect.Array: + w.printf("var %s = ", name) + w.writeValue(v) + w.writeSizeInfo(w.Size - oldSize) + default: + w.printf("var %s %s = ", name, typeName(x)) + w.gob.Encode(x) + w.writeValue(v) + w.writeSizeInfo(w.Size - oldSize) + } + w.printf("\n") +} + +func (w *CodeWriter) writeValue(v reflect.Value) { + x := v.Interface() + switch v.Kind() { + case reflect.String: + w.WriteString(v.String()) + case reflect.Array: + // Don't double count: callers of WriteArray count on the size being + // added, so we need to discount it here. + w.Size -= int(v.Type().Size()) + w.writeSlice(x, true) + case reflect.Slice: + w.writeSlice(x, false) + case reflect.Struct: + w.printf("%s{\n", typeName(v.Interface())) + t := v.Type() + for i := 0; i < v.NumField(); i++ { + w.printf("%s: ", t.Field(i).Name) + w.writeValue(v.Field(i)) + w.printf(",\n") + } + w.printf("}") + default: + w.printf("%#v", x) + } +} + +// WriteString writes a string literal. +func (w *CodeWriter) WriteString(s string) { + s = strings.Replace(s, `\`, `\\`, -1) + io.WriteString(w.Hash, s) // content hash + w.Size += len(s) + + const maxInline = 40 + if len(s) <= maxInline { + w.printf("%q", s) + return + } + + // We will render the string as a multi-line string. + const maxWidth = 80 - 4 - len(`"`) - len(`" +`) + + // When starting on its own line, go fmt indents line 2+ an extra level. + n, max := maxWidth, maxWidth-4 + + // As per https://golang.org/issue/18078, the compiler has trouble + // compiling the concatenation of many strings, s0 + s1 + s2 + ... + sN, + // for large N. We insert redundant, explicit parentheses to work around + // that, lowering the N at any given step: (s0 + s1 + ... + s63) + (s64 + + // ... + s127) + etc + (etc + ... + sN). + explicitParens, extraComment := len(s) > 128*1024, "" + if explicitParens { + w.printf(`(`) + extraComment = "; the redundant, explicit parens are for https://golang.org/issue/18078" + } + + // Print "" +\n, if a string does not start on its own line. + b := w.buf.Bytes() + if p := len(bytes.TrimRight(b, " \t")); p > 0 && b[p-1] != '\n' { + w.printf("\"\" + // Size: %d bytes%s\n", len(s), extraComment) + n, max = maxWidth, maxWidth + } + + w.printf(`"`) + + for sz, p, nLines := 0, 0, 0; p < len(s); { + var r rune + r, sz = utf8.DecodeRuneInString(s[p:]) + out := s[p : p+sz] + chars := 1 + if !unicode.IsPrint(r) || r == utf8.RuneError || r == '"' { + switch sz { + case 1: + out = fmt.Sprintf("\\x%02x", s[p]) + case 2, 3: + out = fmt.Sprintf("\\u%04x", r) + case 4: + out = fmt.Sprintf("\\U%08x", r) + } + chars = len(out) + } + if n -= chars; n < 0 { + nLines++ + if explicitParens && nLines&63 == 63 { + w.printf("\") + (\"") + } + w.printf("\" +\n\"") + n = max - len(out) + } + w.printf("%s", out) + p += sz + } + w.printf(`"`) + if explicitParens { + w.printf(`)`) + } +} + +// WriteSlice writes a slice value. +func (w *CodeWriter) WriteSlice(x interface{}) { + w.writeSlice(x, false) +} + +// WriteArray writes an array value. +func (w *CodeWriter) WriteArray(x interface{}) { + w.writeSlice(x, true) +} + +func (w *CodeWriter) writeSlice(x interface{}, isArray bool) { + v := reflect.ValueOf(x) + w.gob.Encode(v.Len()) + w.Size += v.Len() * int(v.Type().Elem().Size()) + name := typeName(x) + if isArray { + name = fmt.Sprintf("[%d]%s", v.Len(), name[strings.Index(name, "]")+1:]) + } + if isArray { + w.printf("%s{\n", name) + } else { + w.printf("%s{ // %d elements\n", name, v.Len()) + } + + switch kind := v.Type().Elem().Kind(); kind { + case reflect.String: + for _, s := range x.([]string) { + w.WriteString(s) + w.printf(",\n") + } + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, + reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + // nLine and nBlock are the number of elements per line and block. + nLine, nBlock, format := 8, 64, "%d," + switch kind { + case reflect.Uint8: + format = "%#02x," + case reflect.Uint16: + format = "%#04x," + case reflect.Uint32: + nLine, nBlock, format = 4, 32, "%#08x," + case reflect.Uint, reflect.Uint64: + nLine, nBlock, format = 4, 32, "%#016x," + case reflect.Int8: + nLine = 16 + } + n := nLine + for i := 0; i < v.Len(); i++ { + if i%nBlock == 0 && v.Len() > nBlock { + w.printf("// Entry %X - %X\n", i, i+nBlock-1) + } + x := v.Index(i).Interface() + w.gob.Encode(x) + w.printf(format, x) + if n--; n == 0 { + n = nLine + w.printf("\n") + } + } + w.printf("\n") + case reflect.Struct: + zero := reflect.Zero(v.Type().Elem()).Interface() + for i := 0; i < v.Len(); i++ { + x := v.Index(i).Interface() + w.gob.EncodeValue(v) + if !reflect.DeepEqual(zero, x) { + line := fmt.Sprintf("%#v,\n", x) + line = line[strings.IndexByte(line, '{'):] + w.printf("%d: ", i) + w.printf(line) + } + } + case reflect.Array: + for i := 0; i < v.Len(); i++ { + w.printf("%d: %#v,\n", i, v.Index(i).Interface()) + } + default: + panic("gen: slice elem type not supported") + } + w.printf("}") +} + +// WriteType writes a definition of the type of the given value and returns the +// type name. +func (w *CodeWriter) WriteType(x interface{}) string { + t := reflect.TypeOf(x) + w.printf("type %s struct {\n", t.Name()) + for i := 0; i < t.NumField(); i++ { + w.printf("\t%s %s\n", t.Field(i).Name, t.Field(i).Type) + } + w.printf("}\n") + return t.Name() +} + +// typeName returns the name of the go type of x. +func typeName(x interface{}) string { + t := reflect.ValueOf(x).Type() + return strings.Replace(fmt.Sprint(t), "main.", "", 1) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/text/internal/gen/gen.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/text/internal/gen/gen.go new file mode 100644 index 00000000..4c3f7606 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/text/internal/gen/gen.go @@ -0,0 +1,333 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package gen contains common code for the various code generation tools in the +// text repository. Its usage ensures consistency between tools. +// +// This package defines command line flags that are common to most generation +// tools. The flags allow for specifying specific Unicode and CLDR versions +// in the public Unicode data repository (http://www.unicode.org/Public). +// +// A local Unicode data mirror can be set through the flag -local or the +// environment variable UNICODE_DIR. The former takes precedence. The local +// directory should follow the same structure as the public repository. +// +// IANA data can also optionally be mirrored by putting it in the iana directory +// rooted at the top of the local mirror. Beware, though, that IANA data is not +// versioned. So it is up to the developer to use the right version. +package gen // import "golang.org/x/text/internal/gen" + +import ( + "bytes" + "flag" + "fmt" + "go/build" + "go/format" + "io" + "io/ioutil" + "log" + "net/http" + "os" + "path" + "path/filepath" + "strings" + "sync" + "unicode" + + "golang.org/x/text/unicode/cldr" +) + +var ( + url = flag.String("url", + "http://www.unicode.org/Public", + "URL of Unicode database directory") + iana = flag.String("iana", + "http://www.iana.org", + "URL of the IANA repository") + unicodeVersion = flag.String("unicode", + getEnv("UNICODE_VERSION", unicode.Version), + "unicode version to use") + cldrVersion = flag.String("cldr", + getEnv("CLDR_VERSION", cldr.Version), + "cldr version to use") +) + +func getEnv(name, def string) string { + if v := os.Getenv(name); v != "" { + return v + } + return def +} + +// Init performs common initialization for a gen command. It parses the flags +// and sets up the standard logging parameters. +func Init() { + log.SetPrefix("") + log.SetFlags(log.Lshortfile) + flag.Parse() +} + +const header = `// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +` + +// UnicodeVersion reports the requested Unicode version. +func UnicodeVersion() string { + return *unicodeVersion +} + +// CLDRVersion reports the requested CLDR version. +func CLDRVersion() string { + return *cldrVersion +} + +var tags = []struct{ version, buildTags string }{ + {"10.0.0", "go1.10"}, + {"", "!go1.10"}, +} + +// buildTags reports the build tags used for the current Unicode version. +func buildTags() string { + v := UnicodeVersion() + for _, x := range tags { + // We should do a numeric comparison, but including the collate package + // would create an import cycle. We approximate it by assuming that + // longer version strings are later. + if len(x.version) <= len(v) { + return x.buildTags + } + if len(x.version) == len(v) && x.version <= v { + return x.buildTags + } + } + return tags[0].buildTags +} + +// IsLocal reports whether data files are available locally. +func IsLocal() bool { + dir, err := localReadmeFile() + if err != nil { + return false + } + if _, err = os.Stat(dir); err != nil { + return false + } + return true +} + +// OpenUCDFile opens the requested UCD file. The file is specified relative to +// the public Unicode root directory. It will call log.Fatal if there are any +// errors. +func OpenUCDFile(file string) io.ReadCloser { + return openUnicode(path.Join(*unicodeVersion, "ucd", file)) +} + +// OpenCLDRCoreZip opens the CLDR core zip file. It will call log.Fatal if there +// are any errors. +func OpenCLDRCoreZip() io.ReadCloser { + return OpenUnicodeFile("cldr", *cldrVersion, "core.zip") +} + +// OpenUnicodeFile opens the requested file of the requested category from the +// root of the Unicode data archive. The file is specified relative to the +// public Unicode root directory. If version is "", it will use the default +// Unicode version. It will call log.Fatal if there are any errors. +func OpenUnicodeFile(category, version, file string) io.ReadCloser { + if version == "" { + version = UnicodeVersion() + } + return openUnicode(path.Join(category, version, file)) +} + +// OpenIANAFile opens the requested IANA file. The file is specified relative +// to the IANA root, which is typically either http://www.iana.org or the +// iana directory in the local mirror. It will call log.Fatal if there are any +// errors. +func OpenIANAFile(path string) io.ReadCloser { + return Open(*iana, "iana", path) +} + +var ( + dirMutex sync.Mutex + localDir string +) + +const permissions = 0755 + +func localReadmeFile() (string, error) { + p, err := build.Import("golang.org/x/text", "", build.FindOnly) + if err != nil { + return "", fmt.Errorf("Could not locate package: %v", err) + } + return filepath.Join(p.Dir, "DATA", "README"), nil +} + +func getLocalDir() string { + dirMutex.Lock() + defer dirMutex.Unlock() + + readme, err := localReadmeFile() + if err != nil { + log.Fatal(err) + } + dir := filepath.Dir(readme) + if _, err := os.Stat(readme); err != nil { + if err := os.MkdirAll(dir, permissions); err != nil { + log.Fatalf("Could not create directory: %v", err) + } + ioutil.WriteFile(readme, []byte(readmeTxt), permissions) + } + return dir +} + +const readmeTxt = `Generated by golang.org/x/text/internal/gen. DO NOT EDIT. + +This directory contains downloaded files used to generate the various tables +in the golang.org/x/text subrepo. + +Note that the language subtag repo (iana/assignments/language-subtag-registry) +and all other times in the iana subdirectory are not versioned and will need +to be periodically manually updated. The easiest way to do this is to remove +the entire iana directory. This is mostly of concern when updating the language +package. +` + +// Open opens subdir/path if a local directory is specified and the file exists, +// where subdir is a directory relative to the local root, or fetches it from +// urlRoot/path otherwise. It will call log.Fatal if there are any errors. +func Open(urlRoot, subdir, path string) io.ReadCloser { + file := filepath.Join(getLocalDir(), subdir, filepath.FromSlash(path)) + return open(file, urlRoot, path) +} + +func openUnicode(path string) io.ReadCloser { + file := filepath.Join(getLocalDir(), filepath.FromSlash(path)) + return open(file, *url, path) +} + +// TODO: automatically periodically update non-versioned files. + +func open(file, urlRoot, path string) io.ReadCloser { + if f, err := os.Open(file); err == nil { + return f + } + r := get(urlRoot, path) + defer r.Close() + b, err := ioutil.ReadAll(r) + if err != nil { + log.Fatalf("Could not download file: %v", err) + } + os.MkdirAll(filepath.Dir(file), permissions) + if err := ioutil.WriteFile(file, b, permissions); err != nil { + log.Fatalf("Could not create file: %v", err) + } + return ioutil.NopCloser(bytes.NewReader(b)) +} + +func get(root, path string) io.ReadCloser { + url := root + "/" + path + fmt.Printf("Fetching %s...", url) + defer fmt.Println(" done.") + resp, err := http.Get(url) + if err != nil { + log.Fatalf("HTTP GET: %v", err) + } + if resp.StatusCode != 200 { + log.Fatalf("Bad GET status for %q: %q", url, resp.Status) + } + return resp.Body +} + +// TODO: use Write*Version in all applicable packages. + +// WriteUnicodeVersion writes a constant for the Unicode version from which the +// tables are generated. +func WriteUnicodeVersion(w io.Writer) { + fmt.Fprintf(w, "// UnicodeVersion is the Unicode version from which the tables in this package are derived.\n") + fmt.Fprintf(w, "const UnicodeVersion = %q\n\n", UnicodeVersion()) +} + +// WriteCLDRVersion writes a constant for the CLDR version from which the +// tables are generated. +func WriteCLDRVersion(w io.Writer) { + fmt.Fprintf(w, "// CLDRVersion is the CLDR version from which the tables in this package are derived.\n") + fmt.Fprintf(w, "const CLDRVersion = %q\n\n", CLDRVersion()) +} + +// WriteGoFile prepends a standard file comment and package statement to the +// given bytes, applies gofmt, and writes them to a file with the given name. +// It will call log.Fatal if there are any errors. +func WriteGoFile(filename, pkg string, b []byte) { + w, err := os.Create(filename) + if err != nil { + log.Fatalf("Could not create file %s: %v", filename, err) + } + defer w.Close() + if _, err = WriteGo(w, pkg, "", b); err != nil { + log.Fatalf("Error writing file %s: %v", filename, err) + } +} + +func insertVersion(filename, version string) string { + suffix := ".go" + if strings.HasSuffix(filename, "_test.go") { + suffix = "_test.go" + } + return fmt.Sprint(filename[:len(filename)-len(suffix)], version, suffix) +} + +// WriteVersionedGoFile prepends a standard file comment, adds build tags to +// version the file for the current Unicode version, and package statement to +// the given bytes, applies gofmt, and writes them to a file with the given +// name. It will call log.Fatal if there are any errors. +func WriteVersionedGoFile(filename, pkg string, b []byte) { + tags := buildTags() + if tags != "" { + filename = insertVersion(filename, UnicodeVersion()) + } + w, err := os.Create(filename) + if err != nil { + log.Fatalf("Could not create file %s: %v", filename, err) + } + defer w.Close() + if _, err = WriteGo(w, pkg, tags, b); err != nil { + log.Fatalf("Error writing file %s: %v", filename, err) + } +} + +// WriteGo prepends a standard file comment and package statement to the given +// bytes, applies gofmt, and writes them to w. +func WriteGo(w io.Writer, pkg, tags string, b []byte) (n int, err error) { + src := []byte(header) + if tags != "" { + src = append(src, fmt.Sprintf("// +build %s\n\n", tags)...) + } + src = append(src, fmt.Sprintf("package %s\n\n", pkg)...) + src = append(src, b...) + formatted, err := format.Source(src) + if err != nil { + // Print the generated code even in case of an error so that the + // returned error can be meaningfully interpreted. + n, _ = w.Write(src) + return n, err + } + return w.Write(formatted) +} + +// Repackage rewrites a Go file from belonging to package main to belonging to +// the given package. +func Repackage(inFile, outFile, pkg string) { + src, err := ioutil.ReadFile(inFile) + if err != nil { + log.Fatalf("reading %s: %v", inFile, err) + } + const toDelete = "package main\n\n" + i := bytes.Index(src, []byte(toDelete)) + if i < 0 { + log.Fatalf("Could not find %q in %s.", toDelete, inFile) + } + w := &bytes.Buffer{} + w.Write(src[i+len(toDelete):]) + WriteGoFile(outFile, pkg, w.Bytes()) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/text/internal/triegen/compact.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/text/internal/triegen/compact.go new file mode 100644 index 00000000..397b975c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/text/internal/triegen/compact.go @@ -0,0 +1,58 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package triegen + +// This file defines Compacter and its implementations. + +import "io" + +// A Compacter generates an alternative, more space-efficient way to store a +// trie value block. A trie value block holds all possible values for the last +// byte of a UTF-8 encoded rune. Excluding ASCII characters, a trie value block +// always has 64 values, as a UTF-8 encoding ends with a byte in [0x80, 0xC0). +type Compacter interface { + // Size returns whether the Compacter could encode the given block as well + // as its size in case it can. len(v) is always 64. + Size(v []uint64) (sz int, ok bool) + + // Store stores the block using the Compacter's compression method. + // It returns a handle with which the block can be retrieved. + // len(v) is always 64. + Store(v []uint64) uint32 + + // Print writes the data structures associated to the given store to w. + Print(w io.Writer) error + + // Handler returns the name of a function that gets called during trie + // lookup for blocks generated by the Compacter. The function should be of + // the form func (n uint32, b byte) uint64, where n is the index returned by + // the Compacter's Store method and b is the last byte of the UTF-8 + // encoding, where 0x80 <= b < 0xC0, for which to do the lookup in the + // block. + Handler() string +} + +// simpleCompacter is the default Compacter used by builder. It implements a +// normal trie block. +type simpleCompacter builder + +func (b *simpleCompacter) Size([]uint64) (sz int, ok bool) { + return blockSize * b.ValueSize, true +} + +func (b *simpleCompacter) Store(v []uint64) uint32 { + h := uint32(len(b.ValueBlocks) - blockOffset) + b.ValueBlocks = append(b.ValueBlocks, v) + return h +} + +func (b *simpleCompacter) Print(io.Writer) error { + // Structures are printed in print.go. + return nil +} + +func (b *simpleCompacter) Handler() string { + panic("Handler should be special-cased for this Compacter") +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/text/internal/triegen/print.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/text/internal/triegen/print.go new file mode 100644 index 00000000..8d9f120b --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/text/internal/triegen/print.go @@ -0,0 +1,251 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package triegen + +import ( + "bytes" + "fmt" + "io" + "strings" + "text/template" +) + +// print writes all the data structures as well as the code necessary to use the +// trie to w. +func (b *builder) print(w io.Writer) error { + b.Stats.NValueEntries = len(b.ValueBlocks) * blockSize + b.Stats.NValueBytes = len(b.ValueBlocks) * blockSize * b.ValueSize + b.Stats.NIndexEntries = len(b.IndexBlocks) * blockSize + b.Stats.NIndexBytes = len(b.IndexBlocks) * blockSize * b.IndexSize + b.Stats.NHandleBytes = len(b.Trie) * 2 * b.IndexSize + + // If we only have one root trie, all starter blocks are at position 0 and + // we can access the arrays directly. + if len(b.Trie) == 1 { + // At this point we cannot refer to the generated tables directly. + b.ASCIIBlock = b.Name + "Values" + b.StarterBlock = b.Name + "Index" + } else { + // Otherwise we need to have explicit starter indexes in the trie + // structure. + b.ASCIIBlock = "t.ascii" + b.StarterBlock = "t.utf8Start" + } + + b.SourceType = "[]byte" + if err := lookupGen.Execute(w, b); err != nil { + return err + } + + b.SourceType = "string" + if err := lookupGen.Execute(w, b); err != nil { + return err + } + + if err := trieGen.Execute(w, b); err != nil { + return err + } + + for _, c := range b.Compactions { + if err := c.c.Print(w); err != nil { + return err + } + } + + return nil +} + +func printValues(n int, values []uint64) string { + w := &bytes.Buffer{} + boff := n * blockSize + fmt.Fprintf(w, "\t// Block %#x, offset %#x", n, boff) + var newline bool + for i, v := range values { + if i%6 == 0 { + newline = true + } + if v != 0 { + if newline { + fmt.Fprintf(w, "\n") + newline = false + } + fmt.Fprintf(w, "\t%#02x:%#04x, ", boff+i, v) + } + } + return w.String() +} + +func printIndex(b *builder, nr int, n *node) string { + w := &bytes.Buffer{} + boff := nr * blockSize + fmt.Fprintf(w, "\t// Block %#x, offset %#x", nr, boff) + var newline bool + for i, c := range n.children { + if i%8 == 0 { + newline = true + } + if c != nil { + v := b.Compactions[c.index.compaction].Offset + uint32(c.index.index) + if v != 0 { + if newline { + fmt.Fprintf(w, "\n") + newline = false + } + fmt.Fprintf(w, "\t%#02x:%#02x, ", boff+i, v) + } + } + } + return w.String() +} + +var ( + trieGen = template.Must(template.New("trie").Funcs(template.FuncMap{ + "printValues": printValues, + "printIndex": printIndex, + "title": strings.Title, + "dec": func(x int) int { return x - 1 }, + "psize": func(n int) string { + return fmt.Sprintf("%d bytes (%.2f KiB)", n, float64(n)/1024) + }, + }).Parse(trieTemplate)) + lookupGen = template.Must(template.New("lookup").Parse(lookupTemplate)) +) + +// TODO: consider the return type of lookup. It could be uint64, even if the +// internal value type is smaller. We will have to verify this with the +// performance of unicode/norm, which is very sensitive to such changes. +const trieTemplate = `{{$b := .}}{{$multi := gt (len .Trie) 1}} +// {{.Name}}Trie. Total size: {{psize .Size}}. Checksum: {{printf "%08x" .Checksum}}. +type {{.Name}}Trie struct { {{if $multi}} + ascii []{{.ValueType}} // index for ASCII bytes + utf8Start []{{.IndexType}} // index for UTF-8 bytes >= 0xC0 +{{end}}} + +func new{{title .Name}}Trie(i int) *{{.Name}}Trie { {{if $multi}} + h := {{.Name}}TrieHandles[i] + return &{{.Name}}Trie{ {{.Name}}Values[uint32(h.ascii)<<6:], {{.Name}}Index[uint32(h.multi)<<6:] } +} + +type {{.Name}}TrieHandle struct { + ascii, multi {{.IndexType}} +} + +// {{.Name}}TrieHandles: {{len .Trie}} handles, {{.Stats.NHandleBytes}} bytes +var {{.Name}}TrieHandles = [{{len .Trie}}]{{.Name}}TrieHandle{ +{{range .Trie}} { {{.ASCIIIndex}}, {{.StarterIndex}} }, // {{printf "%08x" .Checksum}}: {{.Name}} +{{end}}}{{else}} + return &{{.Name}}Trie{} +} +{{end}} +// lookupValue determines the type of block n and looks up the value for b. +func (t *{{.Name}}Trie) lookupValue(n uint32, b byte) {{.ValueType}}{{$last := dec (len .Compactions)}} { + switch { {{range $i, $c := .Compactions}} + {{if eq $i $last}}default{{else}}case n < {{$c.Cutoff}}{{end}}:{{if ne $i 0}} + n -= {{$c.Offset}}{{end}} + return {{print $b.ValueType}}({{$c.Handler}}){{end}} + } +} + +// {{.Name}}Values: {{len .ValueBlocks}} blocks, {{.Stats.NValueEntries}} entries, {{.Stats.NValueBytes}} bytes +// The third block is the zero block. +var {{.Name}}Values = [{{.Stats.NValueEntries}}]{{.ValueType}} { +{{range $i, $v := .ValueBlocks}}{{printValues $i $v}} +{{end}}} + +// {{.Name}}Index: {{len .IndexBlocks}} blocks, {{.Stats.NIndexEntries}} entries, {{.Stats.NIndexBytes}} bytes +// Block 0 is the zero block. +var {{.Name}}Index = [{{.Stats.NIndexEntries}}]{{.IndexType}} { +{{range $i, $v := .IndexBlocks}}{{printIndex $b $i $v}} +{{end}}} +` + +// TODO: consider allowing zero-length strings after evaluating performance with +// unicode/norm. +const lookupTemplate = ` +// lookup{{if eq .SourceType "string"}}String{{end}} returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *{{.Name}}Trie) lookup{{if eq .SourceType "string"}}String{{end}}(s {{.SourceType}}) (v {{.ValueType}}, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return {{.ASCIIBlock}}[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := {{.StarterBlock}}[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := {{.StarterBlock}}[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = {{.Name}}Index[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := {{.StarterBlock}}[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = {{.Name}}Index[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = {{.Name}}Index[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookup{{if eq .SourceType "string"}}String{{end}}Unsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *{{.Name}}Trie) lookup{{if eq .SourceType "string"}}String{{end}}Unsafe(s {{.SourceType}}) {{.ValueType}} { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return {{.ASCIIBlock}}[c0] + } + i := {{.StarterBlock}}[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = {{.Name}}Index[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = {{.Name}}Index[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} +` diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/text/internal/triegen/triegen.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/text/internal/triegen/triegen.go new file mode 100644 index 00000000..adb01081 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/text/internal/triegen/triegen.go @@ -0,0 +1,494 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package triegen implements a code generator for a trie for associating +// unsigned integer values with UTF-8 encoded runes. +// +// Many of the go.text packages use tries for storing per-rune information. A +// trie is especially useful if many of the runes have the same value. If this +// is the case, many blocks can be expected to be shared allowing for +// information on many runes to be stored in little space. +// +// As most of the lookups are done directly on []byte slices, the tries use the +// UTF-8 bytes directly for the lookup. This saves a conversion from UTF-8 to +// runes and contributes a little bit to better performance. It also naturally +// provides a fast path for ASCII. +// +// Space is also an issue. There are many code points defined in Unicode and as +// a result tables can get quite large. So every byte counts. The triegen +// package automatically chooses the smallest integer values to represent the +// tables. Compacters allow further compression of the trie by allowing for +// alternative representations of individual trie blocks. +// +// triegen allows generating multiple tries as a single structure. This is +// useful when, for example, one wants to generate tries for several languages +// that have a lot of values in common. Some existing libraries for +// internationalization store all per-language data as a dynamically loadable +// chunk. The go.text packages are designed with the assumption that the user +// typically wants to compile in support for all supported languages, in line +// with the approach common to Go to create a single standalone binary. The +// multi-root trie approach can give significant storage savings in this +// scenario. +// +// triegen generates both tables and code. The code is optimized to use the +// automatically chosen data types. The following code is generated for a Trie +// or multiple Tries named "foo": +// - type fooTrie +// The trie type. +// +// - func newFooTrie(x int) *fooTrie +// Trie constructor, where x is the index of the trie passed to Gen. +// +// - func (t *fooTrie) lookup(s []byte) (v uintX, sz int) +// The lookup method, where uintX is automatically chosen. +// +// - func lookupString, lookupUnsafe and lookupStringUnsafe +// Variants of the above. +// +// - var fooValues and fooIndex and any tables generated by Compacters. +// The core trie data. +// +// - var fooTrieHandles +// Indexes of starter blocks in case of multiple trie roots. +// +// It is recommended that users test the generated trie by checking the returned +// value for every rune. Such exhaustive tests are possible as the the number of +// runes in Unicode is limited. +package triegen // import "golang.org/x/text/internal/triegen" + +// TODO: Arguably, the internally optimized data types would not have to be +// exposed in the generated API. We could also investigate not generating the +// code, but using it through a package. We would have to investigate the impact +// on performance of making such change, though. For packages like unicode/norm, +// small changes like this could tank performance. + +import ( + "encoding/binary" + "fmt" + "hash/crc64" + "io" + "log" + "unicode/utf8" +) + +// builder builds a set of tries for associating values with runes. The set of +// tries can share common index and value blocks. +type builder struct { + Name string + + // ValueType is the type of the trie values looked up. + ValueType string + + // ValueSize is the byte size of the ValueType. + ValueSize int + + // IndexType is the type of trie index values used for all UTF-8 bytes of + // a rune except the last one. + IndexType string + + // IndexSize is the byte size of the IndexType. + IndexSize int + + // SourceType is used when generating the lookup functions. If the user + // requests StringSupport, all lookup functions will be generated for + // string input as well. + SourceType string + + Trie []*Trie + + IndexBlocks []*node + ValueBlocks [][]uint64 + Compactions []compaction + Checksum uint64 + + ASCIIBlock string + StarterBlock string + + indexBlockIdx map[uint64]int + valueBlockIdx map[uint64]nodeIndex + asciiBlockIdx map[uint64]int + + // Stats are used to fill out the template. + Stats struct { + NValueEntries int + NValueBytes int + NIndexEntries int + NIndexBytes int + NHandleBytes int + } + + err error +} + +// A nodeIndex encodes the index of a node, which is defined by the compaction +// which stores it and an index within the compaction. For internal nodes, the +// compaction is always 0. +type nodeIndex struct { + compaction int + index int +} + +// compaction keeps track of stats used for the compaction. +type compaction struct { + c Compacter + blocks []*node + maxHandle uint32 + totalSize int + + // Used by template-based generator and thus exported. + Cutoff uint32 + Offset uint32 + Handler string +} + +func (b *builder) setError(err error) { + if b.err == nil { + b.err = err + } +} + +// An Option can be passed to Gen. +type Option func(b *builder) error + +// Compact configures the trie generator to use the given Compacter. +func Compact(c Compacter) Option { + return func(b *builder) error { + b.Compactions = append(b.Compactions, compaction{ + c: c, + Handler: c.Handler() + "(n, b)"}) + return nil + } +} + +// Gen writes Go code for a shared trie lookup structure to w for the given +// Tries. The generated trie type will be called nameTrie. newNameTrie(x) will +// return the *nameTrie for tries[x]. A value can be looked up by using one of +// the various lookup methods defined on nameTrie. It returns the table size of +// the generated trie. +func Gen(w io.Writer, name string, tries []*Trie, opts ...Option) (sz int, err error) { + // The index contains two dummy blocks, followed by the zero block. The zero + // block is at offset 0x80, so that the offset for the zero block for + // continuation bytes is 0. + b := &builder{ + Name: name, + Trie: tries, + IndexBlocks: []*node{{}, {}, {}}, + Compactions: []compaction{{ + Handler: name + "Values[n<<6+uint32(b)]", + }}, + // The 0 key in indexBlockIdx and valueBlockIdx is the hash of the zero + // block. + indexBlockIdx: map[uint64]int{0: 0}, + valueBlockIdx: map[uint64]nodeIndex{0: {}}, + asciiBlockIdx: map[uint64]int{}, + } + b.Compactions[0].c = (*simpleCompacter)(b) + + for _, f := range opts { + if err := f(b); err != nil { + return 0, err + } + } + b.build() + if b.err != nil { + return 0, b.err + } + if err = b.print(w); err != nil { + return 0, err + } + return b.Size(), nil +} + +// A Trie represents a single root node of a trie. A builder may build several +// overlapping tries at once. +type Trie struct { + root *node + + hiddenTrie +} + +// hiddenTrie contains values we want to be visible to the template generator, +// but hidden from the API documentation. +type hiddenTrie struct { + Name string + Checksum uint64 + ASCIIIndex int + StarterIndex int +} + +// NewTrie returns a new trie root. +func NewTrie(name string) *Trie { + return &Trie{ + &node{ + children: make([]*node, blockSize), + values: make([]uint64, utf8.RuneSelf), + }, + hiddenTrie{Name: name}, + } +} + +// Gen is a convenience wrapper around the Gen func passing t as the only trie +// and uses the name passed to NewTrie. It returns the size of the generated +// tables. +func (t *Trie) Gen(w io.Writer, opts ...Option) (sz int, err error) { + return Gen(w, t.Name, []*Trie{t}, opts...) +} + +// node is a node of the intermediate trie structure. +type node struct { + // children holds this node's children. It is always of length 64. + // A child node may be nil. + children []*node + + // values contains the values of this node. If it is non-nil, this node is + // either a root or leaf node: + // For root nodes, len(values) == 128 and it maps the bytes in [0x00, 0x7F]. + // For leaf nodes, len(values) == 64 and it maps the bytes in [0x80, 0xBF]. + values []uint64 + + index nodeIndex +} + +// Insert associates value with the given rune. Insert will panic if a non-zero +// value is passed for an invalid rune. +func (t *Trie) Insert(r rune, value uint64) { + if value == 0 { + return + } + s := string(r) + if []rune(s)[0] != r && value != 0 { + // Note: The UCD tables will always assign what amounts to a zero value + // to a surrogate. Allowing a zero value for an illegal rune allows + // users to iterate over [0..MaxRune] without having to explicitly + // exclude surrogates, which would be tedious. + panic(fmt.Sprintf("triegen: non-zero value for invalid rune %U", r)) + } + if len(s) == 1 { + // It is a root node value (ASCII). + t.root.values[s[0]] = value + return + } + + n := t.root + for ; len(s) > 1; s = s[1:] { + if n.children == nil { + n.children = make([]*node, blockSize) + } + p := s[0] % blockSize + c := n.children[p] + if c == nil { + c = &node{} + n.children[p] = c + } + if len(s) > 2 && c.values != nil { + log.Fatalf("triegen: insert(%U): found internal node with values", r) + } + n = c + } + if n.values == nil { + n.values = make([]uint64, blockSize) + } + if n.children != nil { + log.Fatalf("triegen: insert(%U): found leaf node that also has child nodes", r) + } + n.values[s[0]-0x80] = value +} + +// Size returns the number of bytes the generated trie will take to store. It +// needs to be exported as it is used in the templates. +func (b *builder) Size() int { + // Index blocks. + sz := len(b.IndexBlocks) * blockSize * b.IndexSize + + // Skip the first compaction, which represents the normal value blocks, as + // its totalSize does not account for the ASCII blocks, which are managed + // separately. + sz += len(b.ValueBlocks) * blockSize * b.ValueSize + for _, c := range b.Compactions[1:] { + sz += c.totalSize + } + + // TODO: this computation does not account for the fixed overhead of a using + // a compaction, either code or data. As for data, though, the typical + // overhead of data is in the order of bytes (2 bytes for cases). Further, + // the savings of using a compaction should anyway be substantial for it to + // be worth it. + + // For multi-root tries, we also need to account for the handles. + if len(b.Trie) > 1 { + sz += 2 * b.IndexSize * len(b.Trie) + } + return sz +} + +func (b *builder) build() { + // Compute the sizes of the values. + var vmax uint64 + for _, t := range b.Trie { + vmax = maxValue(t.root, vmax) + } + b.ValueType, b.ValueSize = getIntType(vmax) + + // Compute all block allocations. + // TODO: first compute the ASCII blocks for all tries and then the other + // nodes. ASCII blocks are more restricted in placement, as they require two + // blocks to be placed consecutively. Processing them first may improve + // sharing (at least one zero block can be expected to be saved.) + for _, t := range b.Trie { + b.Checksum += b.buildTrie(t) + } + + // Compute the offsets for all the Compacters. + offset := uint32(0) + for i := range b.Compactions { + c := &b.Compactions[i] + c.Offset = offset + offset += c.maxHandle + 1 + c.Cutoff = offset + } + + // Compute the sizes of indexes. + // TODO: different byte positions could have different sizes. So far we have + // not found a case where this is beneficial. + imax := uint64(b.Compactions[len(b.Compactions)-1].Cutoff) + for _, ib := range b.IndexBlocks { + if x := uint64(ib.index.index); x > imax { + imax = x + } + } + b.IndexType, b.IndexSize = getIntType(imax) +} + +func maxValue(n *node, max uint64) uint64 { + if n == nil { + return max + } + for _, c := range n.children { + max = maxValue(c, max) + } + for _, v := range n.values { + if max < v { + max = v + } + } + return max +} + +func getIntType(v uint64) (string, int) { + switch { + case v < 1<<8: + return "uint8", 1 + case v < 1<<16: + return "uint16", 2 + case v < 1<<32: + return "uint32", 4 + } + return "uint64", 8 +} + +const ( + blockSize = 64 + + // Subtract two blocks to offset 0x80, the first continuation byte. + blockOffset = 2 + + // Subtract three blocks to offset 0xC0, the first non-ASCII starter. + rootBlockOffset = 3 +) + +var crcTable = crc64.MakeTable(crc64.ISO) + +func (b *builder) buildTrie(t *Trie) uint64 { + n := t.root + + // Get the ASCII offset. For the first trie, the ASCII block will be at + // position 0. + hasher := crc64.New(crcTable) + binary.Write(hasher, binary.BigEndian, n.values) + hash := hasher.Sum64() + + v, ok := b.asciiBlockIdx[hash] + if !ok { + v = len(b.ValueBlocks) + b.asciiBlockIdx[hash] = v + + b.ValueBlocks = append(b.ValueBlocks, n.values[:blockSize], n.values[blockSize:]) + if v == 0 { + // Add the zero block at position 2 so that it will be assigned a + // zero reference in the lookup blocks. + // TODO: always do this? This would allow us to remove a check from + // the trie lookup, but at the expense of extra space. Analyze + // performance for unicode/norm. + b.ValueBlocks = append(b.ValueBlocks, make([]uint64, blockSize)) + } + } + t.ASCIIIndex = v + + // Compute remaining offsets. + t.Checksum = b.computeOffsets(n, true) + // We already subtracted the normal blockOffset from the index. Subtract the + // difference for starter bytes. + t.StarterIndex = n.index.index - (rootBlockOffset - blockOffset) + return t.Checksum +} + +func (b *builder) computeOffsets(n *node, root bool) uint64 { + // For the first trie, the root lookup block will be at position 3, which is + // the offset for UTF-8 non-ASCII starter bytes. + first := len(b.IndexBlocks) == rootBlockOffset + if first { + b.IndexBlocks = append(b.IndexBlocks, n) + } + + // We special-case the cases where all values recursively are 0. This allows + // for the use of a zero block to which all such values can be directed. + hash := uint64(0) + if n.children != nil || n.values != nil { + hasher := crc64.New(crcTable) + for _, c := range n.children { + var v uint64 + if c != nil { + v = b.computeOffsets(c, false) + } + binary.Write(hasher, binary.BigEndian, v) + } + binary.Write(hasher, binary.BigEndian, n.values) + hash = hasher.Sum64() + } + + if first { + b.indexBlockIdx[hash] = rootBlockOffset - blockOffset + } + + // Compacters don't apply to internal nodes. + if n.children != nil { + v, ok := b.indexBlockIdx[hash] + if !ok { + v = len(b.IndexBlocks) - blockOffset + b.IndexBlocks = append(b.IndexBlocks, n) + b.indexBlockIdx[hash] = v + } + n.index = nodeIndex{0, v} + } else { + h, ok := b.valueBlockIdx[hash] + if !ok { + bestI, bestSize := 0, blockSize*b.ValueSize + for i, c := range b.Compactions[1:] { + if sz, ok := c.c.Size(n.values); ok && bestSize > sz { + bestI, bestSize = i+1, sz + } + } + c := &b.Compactions[bestI] + c.totalSize += bestSize + v := c.c.Store(n.values) + if c.maxHandle < v { + c.maxHandle = v + } + h = nodeIndex{bestI, int(v)} + b.valueBlockIdx[hash] = h + } + n.index = h + } + return hash +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/text/internal/ucd/ucd.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/text/internal/ucd/ucd.go new file mode 100644 index 00000000..8c45b5f3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/text/internal/ucd/ucd.go @@ -0,0 +1,371 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package ucd provides a parser for Unicode Character Database files, the +// format of which is defined in http://www.unicode.org/reports/tr44/. See +// http://www.unicode.org/Public/UCD/latest/ucd/ for example files. +// +// It currently does not support substitutions of missing fields. +package ucd // import "golang.org/x/text/internal/ucd" + +import ( + "bufio" + "errors" + "fmt" + "io" + "log" + "regexp" + "strconv" + "strings" +) + +// UnicodeData.txt fields. +const ( + CodePoint = iota + Name + GeneralCategory + CanonicalCombiningClass + BidiClass + DecompMapping + DecimalValue + DigitValue + NumericValue + BidiMirrored + Unicode1Name + ISOComment + SimpleUppercaseMapping + SimpleLowercaseMapping + SimpleTitlecaseMapping +) + +// Parse calls f for each entry in the given reader of a UCD file. It will close +// the reader upon return. It will call log.Fatal if any error occurred. +// +// This implements the most common usage pattern of using Parser. +func Parse(r io.ReadCloser, f func(p *Parser)) { + defer r.Close() + + p := New(r) + for p.Next() { + f(p) + } + if err := p.Err(); err != nil { + r.Close() // os.Exit will cause defers not to be called. + log.Fatal(err) + } +} + +// An Option is used to configure a Parser. +type Option func(p *Parser) + +func keepRanges(p *Parser) { + p.keepRanges = true +} + +var ( + // KeepRanges prevents the expansion of ranges. The raw ranges can be + // obtained by calling Range(0) on the parser. + KeepRanges Option = keepRanges +) + +// The Part option register a handler for lines starting with a '@'. The text +// after a '@' is available as the first field. Comments are handled as usual. +func Part(f func(p *Parser)) Option { + return func(p *Parser) { + p.partHandler = f + } +} + +// The CommentHandler option passes comments that are on a line by itself to +// a given handler. +func CommentHandler(f func(s string)) Option { + return func(p *Parser) { + p.commentHandler = f + } +} + +// A Parser parses Unicode Character Database (UCD) files. +type Parser struct { + scanner *bufio.Scanner + + keepRanges bool // Don't expand rune ranges in field 0. + + err error + comment string + field []string + // parsedRange is needed in case Range(0) is called more than once for one + // field. In some cases this requires scanning ahead. + line int + parsedRange bool + rangeStart, rangeEnd rune + + partHandler func(p *Parser) + commentHandler func(s string) +} + +func (p *Parser) setError(err error, msg string) { + if p.err == nil && err != nil { + if msg == "" { + p.err = fmt.Errorf("ucd:line:%d: %v", p.line, err) + } else { + p.err = fmt.Errorf("ucd:line:%d:%s: %v", p.line, msg, err) + } + } +} + +func (p *Parser) getField(i int) string { + if i >= len(p.field) { + return "" + } + return p.field[i] +} + +// Err returns a non-nil error if any error occurred during parsing. +func (p *Parser) Err() error { + return p.err +} + +// New returns a Parser for the given Reader. +func New(r io.Reader, o ...Option) *Parser { + p := &Parser{ + scanner: bufio.NewScanner(r), + } + for _, f := range o { + f(p) + } + return p +} + +// Next parses the next line in the file. It returns true if a line was parsed +// and false if it reached the end of the file. +func (p *Parser) Next() bool { + if !p.keepRanges && p.rangeStart < p.rangeEnd { + p.rangeStart++ + return true + } + p.comment = "" + p.field = p.field[:0] + p.parsedRange = false + + for p.scanner.Scan() && p.err == nil { + p.line++ + s := p.scanner.Text() + if s == "" { + continue + } + if s[0] == '#' { + if p.commentHandler != nil { + p.commentHandler(strings.TrimSpace(s[1:])) + } + continue + } + + // Parse line + if i := strings.IndexByte(s, '#'); i != -1 { + p.comment = strings.TrimSpace(s[i+1:]) + s = s[:i] + } + if s[0] == '@' { + if p.partHandler != nil { + p.field = append(p.field, strings.TrimSpace(s[1:])) + p.partHandler(p) + p.field = p.field[:0] + } + p.comment = "" + continue + } + for { + i := strings.IndexByte(s, ';') + if i == -1 { + p.field = append(p.field, strings.TrimSpace(s)) + break + } + p.field = append(p.field, strings.TrimSpace(s[:i])) + s = s[i+1:] + } + if !p.keepRanges { + p.rangeStart, p.rangeEnd = p.getRange(0) + } + return true + } + p.setError(p.scanner.Err(), "scanner failed") + return false +} + +func parseRune(b string) (rune, error) { + if len(b) > 2 && b[0] == 'U' && b[1] == '+' { + b = b[2:] + } + x, err := strconv.ParseUint(b, 16, 32) + return rune(x), err +} + +func (p *Parser) parseRune(s string) rune { + x, err := parseRune(s) + p.setError(err, "failed to parse rune") + return x +} + +// Rune parses and returns field i as a rune. +func (p *Parser) Rune(i int) rune { + if i > 0 || p.keepRanges { + return p.parseRune(p.getField(i)) + } + return p.rangeStart +} + +// Runes interprets and returns field i as a sequence of runes. +func (p *Parser) Runes(i int) (runes []rune) { + add := func(s string) { + if s = strings.TrimSpace(s); len(s) > 0 { + runes = append(runes, p.parseRune(s)) + } + } + for b := p.getField(i); ; { + i := strings.IndexByte(b, ' ') + if i == -1 { + add(b) + break + } + add(b[:i]) + b = b[i+1:] + } + return +} + +var ( + errIncorrectLegacyRange = errors.New("ucd: unmatched <* First>") + + // reRange matches one line of a legacy rune range. + reRange = regexp.MustCompile("^([0-9A-F]*);<([^,]*), ([^>]*)>(.*)$") +) + +// Range parses and returns field i as a rune range. A range is inclusive at +// both ends. If the field only has one rune, first and last will be identical. +// It supports the legacy format for ranges used in UnicodeData.txt. +func (p *Parser) Range(i int) (first, last rune) { + if !p.keepRanges { + return p.rangeStart, p.rangeStart + } + return p.getRange(i) +} + +func (p *Parser) getRange(i int) (first, last rune) { + b := p.getField(i) + if k := strings.Index(b, ".."); k != -1 { + return p.parseRune(b[:k]), p.parseRune(b[k+2:]) + } + // The first field may not be a rune, in which case we may ignore any error + // and set the range as 0..0. + x, err := parseRune(b) + if err != nil { + // Disable range parsing henceforth. This ensures that an error will be + // returned if the user subsequently will try to parse this field as + // a Rune. + p.keepRanges = true + } + // Special case for UnicodeData that was retained for backwards compatibility. + if i == 0 && len(p.field) > 1 && strings.HasSuffix(p.field[1], "First>") { + if p.parsedRange { + return p.rangeStart, p.rangeEnd + } + mf := reRange.FindStringSubmatch(p.scanner.Text()) + p.line++ + if mf == nil || !p.scanner.Scan() { + p.setError(errIncorrectLegacyRange, "") + return x, x + } + // Using Bytes would be more efficient here, but Text is a lot easier + // and this is not a frequent case. + ml := reRange.FindStringSubmatch(p.scanner.Text()) + if ml == nil || mf[2] != ml[2] || ml[3] != "Last" || mf[4] != ml[4] { + p.setError(errIncorrectLegacyRange, "") + return x, x + } + p.rangeStart, p.rangeEnd = x, p.parseRune(p.scanner.Text()[:len(ml[1])]) + p.parsedRange = true + return p.rangeStart, p.rangeEnd + } + return x, x +} + +// bools recognizes all valid UCD boolean values. +var bools = map[string]bool{ + "": false, + "N": false, + "No": false, + "F": false, + "False": false, + "Y": true, + "Yes": true, + "T": true, + "True": true, +} + +// Bool parses and returns field i as a boolean value. +func (p *Parser) Bool(i int) bool { + f := p.getField(i) + for s, v := range bools { + if f == s { + return v + } + } + p.setError(strconv.ErrSyntax, "error parsing bool") + return false +} + +// Int parses and returns field i as an integer value. +func (p *Parser) Int(i int) int { + x, err := strconv.ParseInt(string(p.getField(i)), 10, 64) + p.setError(err, "error parsing int") + return int(x) +} + +// Uint parses and returns field i as an unsigned integer value. +func (p *Parser) Uint(i int) uint { + x, err := strconv.ParseUint(string(p.getField(i)), 10, 64) + p.setError(err, "error parsing uint") + return uint(x) +} + +// Float parses and returns field i as a decimal value. +func (p *Parser) Float(i int) float64 { + x, err := strconv.ParseFloat(string(p.getField(i)), 64) + p.setError(err, "error parsing float") + return x +} + +// String parses and returns field i as a string value. +func (p *Parser) String(i int) string { + return string(p.getField(i)) +} + +// Strings parses and returns field i as a space-separated list of strings. +func (p *Parser) Strings(i int) []string { + ss := strings.Split(string(p.getField(i)), " ") + for i, s := range ss { + ss[i] = strings.TrimSpace(s) + } + return ss +} + +// Comment returns the comments for the current line. +func (p *Parser) Comment() string { + return string(p.comment) +} + +var errUndefinedEnum = errors.New("ucd: undefined enum value") + +// Enum interprets and returns field i as a value that must be one of the values +// in enum. +func (p *Parser) Enum(i int, enum ...string) string { + f := p.getField(i) + for _, s := range enum { + if f == s { + return s + } + } + p.setError(errUndefinedEnum, "error parsing enum") + return "" +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/text/transform/transform.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/text/transform/transform.go new file mode 100644 index 00000000..fe47b9b3 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/text/transform/transform.go @@ -0,0 +1,705 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package transform provides reader and writer wrappers that transform the +// bytes passing through as well as various transformations. Example +// transformations provided by other packages include normalization and +// conversion between character sets. +package transform // import "golang.org/x/text/transform" + +import ( + "bytes" + "errors" + "io" + "unicode/utf8" +) + +var ( + // ErrShortDst means that the destination buffer was too short to + // receive all of the transformed bytes. + ErrShortDst = errors.New("transform: short destination buffer") + + // ErrShortSrc means that the source buffer has insufficient data to + // complete the transformation. + ErrShortSrc = errors.New("transform: short source buffer") + + // ErrEndOfSpan means that the input and output (the transformed input) + // are not identical. + ErrEndOfSpan = errors.New("transform: input and output are not identical") + + // errInconsistentByteCount means that Transform returned success (nil + // error) but also returned nSrc inconsistent with the src argument. + errInconsistentByteCount = errors.New("transform: inconsistent byte count returned") + + // errShortInternal means that an internal buffer is not large enough + // to make progress and the Transform operation must be aborted. + errShortInternal = errors.New("transform: short internal buffer") +) + +// Transformer transforms bytes. +type Transformer interface { + // Transform writes to dst the transformed bytes read from src, and + // returns the number of dst bytes written and src bytes read. The + // atEOF argument tells whether src represents the last bytes of the + // input. + // + // Callers should always process the nDst bytes produced and account + // for the nSrc bytes consumed before considering the error err. + // + // A nil error means that all of the transformed bytes (whether freshly + // transformed from src or left over from previous Transform calls) + // were written to dst. A nil error can be returned regardless of + // whether atEOF is true. If err is nil then nSrc must equal len(src); + // the converse is not necessarily true. + // + // ErrShortDst means that dst was too short to receive all of the + // transformed bytes. ErrShortSrc means that src had insufficient data + // to complete the transformation. If both conditions apply, then + // either error may be returned. Other than the error conditions listed + // here, implementations are free to report other errors that arise. + Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) + + // Reset resets the state and allows a Transformer to be reused. + Reset() +} + +// SpanningTransformer extends the Transformer interface with a Span method +// that determines how much of the input already conforms to the Transformer. +type SpanningTransformer interface { + Transformer + + // Span returns a position in src such that transforming src[:n] results in + // identical output src[:n] for these bytes. It does not necessarily return + // the largest such n. The atEOF argument tells whether src represents the + // last bytes of the input. + // + // Callers should always account for the n bytes consumed before + // considering the error err. + // + // A nil error means that all input bytes are known to be identical to the + // output produced by the Transformer. A nil error can be be returned + // regardless of whether atEOF is true. If err is nil, then then n must + // equal len(src); the converse is not necessarily true. + // + // ErrEndOfSpan means that the Transformer output may differ from the + // input after n bytes. Note that n may be len(src), meaning that the output + // would contain additional bytes after otherwise identical output. + // ErrShortSrc means that src had insufficient data to determine whether the + // remaining bytes would change. Other than the error conditions listed + // here, implementations are free to report other errors that arise. + // + // Calling Span can modify the Transformer state as a side effect. In + // effect, it does the transformation just as calling Transform would, only + // without copying to a destination buffer and only up to a point it can + // determine the input and output bytes are the same. This is obviously more + // limited than calling Transform, but can be more efficient in terms of + // copying and allocating buffers. Calls to Span and Transform may be + // interleaved. + Span(src []byte, atEOF bool) (n int, err error) +} + +// NopResetter can be embedded by implementations of Transformer to add a nop +// Reset method. +type NopResetter struct{} + +// Reset implements the Reset method of the Transformer interface. +func (NopResetter) Reset() {} + +// Reader wraps another io.Reader by transforming the bytes read. +type Reader struct { + r io.Reader + t Transformer + err error + + // dst[dst0:dst1] contains bytes that have been transformed by t but + // not yet copied out via Read. + dst []byte + dst0, dst1 int + + // src[src0:src1] contains bytes that have been read from r but not + // yet transformed through t. + src []byte + src0, src1 int + + // transformComplete is whether the transformation is complete, + // regardless of whether or not it was successful. + transformComplete bool +} + +const defaultBufSize = 4096 + +// NewReader returns a new Reader that wraps r by transforming the bytes read +// via t. It calls Reset on t. +func NewReader(r io.Reader, t Transformer) *Reader { + t.Reset() + return &Reader{ + r: r, + t: t, + dst: make([]byte, defaultBufSize), + src: make([]byte, defaultBufSize), + } +} + +// Read implements the io.Reader interface. +func (r *Reader) Read(p []byte) (int, error) { + n, err := 0, error(nil) + for { + // Copy out any transformed bytes and return the final error if we are done. + if r.dst0 != r.dst1 { + n = copy(p, r.dst[r.dst0:r.dst1]) + r.dst0 += n + if r.dst0 == r.dst1 && r.transformComplete { + return n, r.err + } + return n, nil + } else if r.transformComplete { + return 0, r.err + } + + // Try to transform some source bytes, or to flush the transformer if we + // are out of source bytes. We do this even if r.r.Read returned an error. + // As the io.Reader documentation says, "process the n > 0 bytes returned + // before considering the error". + if r.src0 != r.src1 || r.err != nil { + r.dst0 = 0 + r.dst1, n, err = r.t.Transform(r.dst, r.src[r.src0:r.src1], r.err == io.EOF) + r.src0 += n + + switch { + case err == nil: + if r.src0 != r.src1 { + r.err = errInconsistentByteCount + } + // The Transform call was successful; we are complete if we + // cannot read more bytes into src. + r.transformComplete = r.err != nil + continue + case err == ErrShortDst && (r.dst1 != 0 || n != 0): + // Make room in dst by copying out, and try again. + continue + case err == ErrShortSrc && r.src1-r.src0 != len(r.src) && r.err == nil: + // Read more bytes into src via the code below, and try again. + default: + r.transformComplete = true + // The reader error (r.err) takes precedence over the + // transformer error (err) unless r.err is nil or io.EOF. + if r.err == nil || r.err == io.EOF { + r.err = err + } + continue + } + } + + // Move any untransformed source bytes to the start of the buffer + // and read more bytes. + if r.src0 != 0 { + r.src0, r.src1 = 0, copy(r.src, r.src[r.src0:r.src1]) + } + n, r.err = r.r.Read(r.src[r.src1:]) + r.src1 += n + } +} + +// TODO: implement ReadByte (and ReadRune??). + +// Writer wraps another io.Writer by transforming the bytes read. +// The user needs to call Close to flush unwritten bytes that may +// be buffered. +type Writer struct { + w io.Writer + t Transformer + dst []byte + + // src[:n] contains bytes that have not yet passed through t. + src []byte + n int +} + +// NewWriter returns a new Writer that wraps w by transforming the bytes written +// via t. It calls Reset on t. +func NewWriter(w io.Writer, t Transformer) *Writer { + t.Reset() + return &Writer{ + w: w, + t: t, + dst: make([]byte, defaultBufSize), + src: make([]byte, defaultBufSize), + } +} + +// Write implements the io.Writer interface. If there are not enough +// bytes available to complete a Transform, the bytes will be buffered +// for the next write. Call Close to convert the remaining bytes. +func (w *Writer) Write(data []byte) (n int, err error) { + src := data + if w.n > 0 { + // Append bytes from data to the last remainder. + // TODO: limit the amount copied on first try. + n = copy(w.src[w.n:], data) + w.n += n + src = w.src[:w.n] + } + for { + nDst, nSrc, err := w.t.Transform(w.dst, src, false) + if _, werr := w.w.Write(w.dst[:nDst]); werr != nil { + return n, werr + } + src = src[nSrc:] + if w.n == 0 { + n += nSrc + } else if len(src) <= n { + // Enough bytes from w.src have been consumed. We make src point + // to data instead to reduce the copying. + w.n = 0 + n -= len(src) + src = data[n:] + if n < len(data) && (err == nil || err == ErrShortSrc) { + continue + } + } + switch err { + case ErrShortDst: + // This error is okay as long as we are making progress. + if nDst > 0 || nSrc > 0 { + continue + } + case ErrShortSrc: + if len(src) < len(w.src) { + m := copy(w.src, src) + // If w.n > 0, bytes from data were already copied to w.src and n + // was already set to the number of bytes consumed. + if w.n == 0 { + n += m + } + w.n = m + err = nil + } else if nDst > 0 || nSrc > 0 { + // Not enough buffer to store the remainder. Keep processing as + // long as there is progress. Without this case, transforms that + // require a lookahead larger than the buffer may result in an + // error. This is not something one may expect to be common in + // practice, but it may occur when buffers are set to small + // sizes during testing. + continue + } + case nil: + if w.n > 0 { + err = errInconsistentByteCount + } + } + return n, err + } +} + +// Close implements the io.Closer interface. +func (w *Writer) Close() error { + src := w.src[:w.n] + for { + nDst, nSrc, err := w.t.Transform(w.dst, src, true) + if _, werr := w.w.Write(w.dst[:nDst]); werr != nil { + return werr + } + if err != ErrShortDst { + return err + } + src = src[nSrc:] + } +} + +type nop struct{ NopResetter } + +func (nop) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + n := copy(dst, src) + if n < len(src) { + err = ErrShortDst + } + return n, n, err +} + +func (nop) Span(src []byte, atEOF bool) (n int, err error) { + return len(src), nil +} + +type discard struct{ NopResetter } + +func (discard) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + return 0, len(src), nil +} + +var ( + // Discard is a Transformer for which all Transform calls succeed + // by consuming all bytes and writing nothing. + Discard Transformer = discard{} + + // Nop is a SpanningTransformer that copies src to dst. + Nop SpanningTransformer = nop{} +) + +// chain is a sequence of links. A chain with N Transformers has N+1 links and +// N+1 buffers. Of those N+1 buffers, the first and last are the src and dst +// buffers given to chain.Transform and the middle N-1 buffers are intermediate +// buffers owned by the chain. The i'th link transforms bytes from the i'th +// buffer chain.link[i].b at read offset chain.link[i].p to the i+1'th buffer +// chain.link[i+1].b at write offset chain.link[i+1].n, for i in [0, N). +type chain struct { + link []link + err error + // errStart is the index at which the error occurred plus 1. Processing + // errStart at this level at the next call to Transform. As long as + // errStart > 0, chain will not consume any more source bytes. + errStart int +} + +func (c *chain) fatalError(errIndex int, err error) { + if i := errIndex + 1; i > c.errStart { + c.errStart = i + c.err = err + } +} + +type link struct { + t Transformer + // b[p:n] holds the bytes to be transformed by t. + b []byte + p int + n int +} + +func (l *link) src() []byte { + return l.b[l.p:l.n] +} + +func (l *link) dst() []byte { + return l.b[l.n:] +} + +// Chain returns a Transformer that applies t in sequence. +func Chain(t ...Transformer) Transformer { + if len(t) == 0 { + return nop{} + } + c := &chain{link: make([]link, len(t)+1)} + for i, tt := range t { + c.link[i].t = tt + } + // Allocate intermediate buffers. + b := make([][defaultBufSize]byte, len(t)-1) + for i := range b { + c.link[i+1].b = b[i][:] + } + return c +} + +// Reset resets the state of Chain. It calls Reset on all the Transformers. +func (c *chain) Reset() { + for i, l := range c.link { + if l.t != nil { + l.t.Reset() + } + c.link[i].p, c.link[i].n = 0, 0 + } +} + +// TODO: make chain use Span (is going to be fun to implement!) + +// Transform applies the transformers of c in sequence. +func (c *chain) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + // Set up src and dst in the chain. + srcL := &c.link[0] + dstL := &c.link[len(c.link)-1] + srcL.b, srcL.p, srcL.n = src, 0, len(src) + dstL.b, dstL.n = dst, 0 + var lastFull, needProgress bool // for detecting progress + + // i is the index of the next Transformer to apply, for i in [low, high]. + // low is the lowest index for which c.link[low] may still produce bytes. + // high is the highest index for which c.link[high] has a Transformer. + // The error returned by Transform determines whether to increase or + // decrease i. We try to completely fill a buffer before converting it. + for low, i, high := c.errStart, c.errStart, len(c.link)-2; low <= i && i <= high; { + in, out := &c.link[i], &c.link[i+1] + nDst, nSrc, err0 := in.t.Transform(out.dst(), in.src(), atEOF && low == i) + out.n += nDst + in.p += nSrc + if i > 0 && in.p == in.n { + in.p, in.n = 0, 0 + } + needProgress, lastFull = lastFull, false + switch err0 { + case ErrShortDst: + // Process the destination buffer next. Return if we are already + // at the high index. + if i == high { + return dstL.n, srcL.p, ErrShortDst + } + if out.n != 0 { + i++ + // If the Transformer at the next index is not able to process any + // source bytes there is nothing that can be done to make progress + // and the bytes will remain unprocessed. lastFull is used to + // detect this and break out of the loop with a fatal error. + lastFull = true + continue + } + // The destination buffer was too small, but is completely empty. + // Return a fatal error as this transformation can never complete. + c.fatalError(i, errShortInternal) + case ErrShortSrc: + if i == 0 { + // Save ErrShortSrc in err. All other errors take precedence. + err = ErrShortSrc + break + } + // Source bytes were depleted before filling up the destination buffer. + // Verify we made some progress, move the remaining bytes to the errStart + // and try to get more source bytes. + if needProgress && nSrc == 0 || in.n-in.p == len(in.b) { + // There were not enough source bytes to proceed while the source + // buffer cannot hold any more bytes. Return a fatal error as this + // transformation can never complete. + c.fatalError(i, errShortInternal) + break + } + // in.b is an internal buffer and we can make progress. + in.p, in.n = 0, copy(in.b, in.src()) + fallthrough + case nil: + // if i == low, we have depleted the bytes at index i or any lower levels. + // In that case we increase low and i. In all other cases we decrease i to + // fetch more bytes before proceeding to the next index. + if i > low { + i-- + continue + } + default: + c.fatalError(i, err0) + } + // Exhausted level low or fatal error: increase low and continue + // to process the bytes accepted so far. + i++ + low = i + } + + // If c.errStart > 0, this means we found a fatal error. We will clear + // all upstream buffers. At this point, no more progress can be made + // downstream, as Transform would have bailed while handling ErrShortDst. + if c.errStart > 0 { + for i := 1; i < c.errStart; i++ { + c.link[i].p, c.link[i].n = 0, 0 + } + err, c.errStart, c.err = c.err, 0, nil + } + return dstL.n, srcL.p, err +} + +// Deprecated: use runes.Remove instead. +func RemoveFunc(f func(r rune) bool) Transformer { + return removeF(f) +} + +type removeF func(r rune) bool + +func (removeF) Reset() {} + +// Transform implements the Transformer interface. +func (t removeF) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + for r, sz := rune(0), 0; len(src) > 0; src = src[sz:] { + + if r = rune(src[0]); r < utf8.RuneSelf { + sz = 1 + } else { + r, sz = utf8.DecodeRune(src) + + if sz == 1 { + // Invalid rune. + if !atEOF && !utf8.FullRune(src) { + err = ErrShortSrc + break + } + // We replace illegal bytes with RuneError. Not doing so might + // otherwise turn a sequence of invalid UTF-8 into valid UTF-8. + // The resulting byte sequence may subsequently contain runes + // for which t(r) is true that were passed unnoticed. + if !t(r) { + if nDst+3 > len(dst) { + err = ErrShortDst + break + } + nDst += copy(dst[nDst:], "\uFFFD") + } + nSrc++ + continue + } + } + + if !t(r) { + if nDst+sz > len(dst) { + err = ErrShortDst + break + } + nDst += copy(dst[nDst:], src[:sz]) + } + nSrc += sz + } + return +} + +// grow returns a new []byte that is longer than b, and copies the first n bytes +// of b to the start of the new slice. +func grow(b []byte, n int) []byte { + m := len(b) + if m <= 32 { + m = 64 + } else if m <= 256 { + m *= 2 + } else { + m += m >> 1 + } + buf := make([]byte, m) + copy(buf, b[:n]) + return buf +} + +const initialBufSize = 128 + +// String returns a string with the result of converting s[:n] using t, where +// n <= len(s). If err == nil, n will be len(s). It calls Reset on t. +func String(t Transformer, s string) (result string, n int, err error) { + t.Reset() + if s == "" { + // Fast path for the common case for empty input. Results in about a + // 86% reduction of running time for BenchmarkStringLowerEmpty. + if _, _, err := t.Transform(nil, nil, true); err == nil { + return "", 0, nil + } + } + + // Allocate only once. Note that both dst and src escape when passed to + // Transform. + buf := [2 * initialBufSize]byte{} + dst := buf[:initialBufSize:initialBufSize] + src := buf[initialBufSize : 2*initialBufSize] + + // The input string s is transformed in multiple chunks (starting with a + // chunk size of initialBufSize). nDst and nSrc are per-chunk (or + // per-Transform-call) indexes, pDst and pSrc are overall indexes. + nDst, nSrc := 0, 0 + pDst, pSrc := 0, 0 + + // pPrefix is the length of a common prefix: the first pPrefix bytes of the + // result will equal the first pPrefix bytes of s. It is not guaranteed to + // be the largest such value, but if pPrefix, len(result) and len(s) are + // all equal after the final transform (i.e. calling Transform with atEOF + // being true returned nil error) then we don't need to allocate a new + // result string. + pPrefix := 0 + for { + // Invariant: pDst == pPrefix && pSrc == pPrefix. + + n := copy(src, s[pSrc:]) + nDst, nSrc, err = t.Transform(dst, src[:n], pSrc+n == len(s)) + pDst += nDst + pSrc += nSrc + + // TODO: let transformers implement an optional Spanner interface, akin + // to norm's QuickSpan. This would even allow us to avoid any allocation. + if !bytes.Equal(dst[:nDst], src[:nSrc]) { + break + } + pPrefix = pSrc + if err == ErrShortDst { + // A buffer can only be short if a transformer modifies its input. + break + } else if err == ErrShortSrc { + if nSrc == 0 { + // No progress was made. + break + } + // Equal so far and !atEOF, so continue checking. + } else if err != nil || pPrefix == len(s) { + return string(s[:pPrefix]), pPrefix, err + } + } + // Post-condition: pDst == pPrefix + nDst && pSrc == pPrefix + nSrc. + + // We have transformed the first pSrc bytes of the input s to become pDst + // transformed bytes. Those transformed bytes are discontiguous: the first + // pPrefix of them equal s[:pPrefix] and the last nDst of them equal + // dst[:nDst]. We copy them around, into a new dst buffer if necessary, so + // that they become one contiguous slice: dst[:pDst]. + if pPrefix != 0 { + newDst := dst + if pDst > len(newDst) { + newDst = make([]byte, len(s)+nDst-nSrc) + } + copy(newDst[pPrefix:pDst], dst[:nDst]) + copy(newDst[:pPrefix], s[:pPrefix]) + dst = newDst + } + + // Prevent duplicate Transform calls with atEOF being true at the end of + // the input. Also return if we have an unrecoverable error. + if (err == nil && pSrc == len(s)) || + (err != nil && err != ErrShortDst && err != ErrShortSrc) { + return string(dst[:pDst]), pSrc, err + } + + // Transform the remaining input, growing dst and src buffers as necessary. + for { + n := copy(src, s[pSrc:]) + nDst, nSrc, err := t.Transform(dst[pDst:], src[:n], pSrc+n == len(s)) + pDst += nDst + pSrc += nSrc + + // If we got ErrShortDst or ErrShortSrc, do not grow as long as we can + // make progress. This may avoid excessive allocations. + if err == ErrShortDst { + if nDst == 0 { + dst = grow(dst, pDst) + } + } else if err == ErrShortSrc { + if nSrc == 0 { + src = grow(src, 0) + } + } else if err != nil || pSrc == len(s) { + return string(dst[:pDst]), pSrc, err + } + } +} + +// Bytes returns a new byte slice with the result of converting b[:n] using t, +// where n <= len(b). If err == nil, n will be len(b). It calls Reset on t. +func Bytes(t Transformer, b []byte) (result []byte, n int, err error) { + return doAppend(t, 0, make([]byte, len(b)), b) +} + +// Append appends the result of converting src[:n] using t to dst, where +// n <= len(src), If err == nil, n will be len(src). It calls Reset on t. +func Append(t Transformer, dst, src []byte) (result []byte, n int, err error) { + if len(dst) == cap(dst) { + n := len(src) + len(dst) // It is okay for this to be 0. + b := make([]byte, n) + dst = b[:copy(b, dst)] + } + return doAppend(t, len(dst), dst[:cap(dst)], src) +} + +func doAppend(t Transformer, pDst int, dst, src []byte) (result []byte, n int, err error) { + t.Reset() + pSrc := 0 + for { + nDst, nSrc, err := t.Transform(dst[pDst:], src[pSrc:], true) + pDst += nDst + pSrc += nSrc + if err != ErrShortDst { + return dst[:pDst], pSrc, err + } + + // Grow the destination buffer, but do not grow as long as we can make + // progress. This may avoid excessive allocations. + if nDst == 0 { + dst = grow(dst, pDst) + } + } +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/text/unicode/cldr/base.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/text/unicode/cldr/base.go new file mode 100644 index 00000000..63cdc16c --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/text/unicode/cldr/base.go @@ -0,0 +1,105 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package cldr + +import ( + "encoding/xml" + "regexp" + "strconv" +) + +// Elem is implemented by every XML element. +type Elem interface { + setEnclosing(Elem) + setName(string) + enclosing() Elem + + GetCommon() *Common +} + +type hidden struct { + CharData string `xml:",chardata"` + Alias *struct { + Common + Source string `xml:"source,attr"` + Path string `xml:"path,attr"` + } `xml:"alias"` + Def *struct { + Common + Choice string `xml:"choice,attr,omitempty"` + Type string `xml:"type,attr,omitempty"` + } `xml:"default"` +} + +// Common holds several of the most common attributes and sub elements +// of an XML element. +type Common struct { + XMLName xml.Name + name string + enclElem Elem + Type string `xml:"type,attr,omitempty"` + Reference string `xml:"reference,attr,omitempty"` + Alt string `xml:"alt,attr,omitempty"` + ValidSubLocales string `xml:"validSubLocales,attr,omitempty"` + Draft string `xml:"draft,attr,omitempty"` + hidden +} + +// Default returns the default type to select from the enclosed list +// or "" if no default value is specified. +func (e *Common) Default() string { + if e.Def == nil { + return "" + } + if e.Def.Choice != "" { + return e.Def.Choice + } else if e.Def.Type != "" { + // Type is still used by the default element in collation. + return e.Def.Type + } + return "" +} + +// Element returns the XML element name. +func (e *Common) Element() string { + return e.name +} + +// GetCommon returns e. It is provided such that Common implements Elem. +func (e *Common) GetCommon() *Common { + return e +} + +// Data returns the character data accumulated for this element. +func (e *Common) Data() string { + e.CharData = charRe.ReplaceAllStringFunc(e.CharData, replaceUnicode) + return e.CharData +} + +func (e *Common) setName(s string) { + e.name = s +} + +func (e *Common) enclosing() Elem { + return e.enclElem +} + +func (e *Common) setEnclosing(en Elem) { + e.enclElem = en +} + +// Escape characters that can be escaped without further escaping the string. +var charRe = regexp.MustCompile(`&#x[0-9a-fA-F]*;|\\u[0-9a-fA-F]{4}|\\U[0-9a-fA-F]{8}|\\x[0-9a-fA-F]{2}|\\[0-7]{3}|\\[abtnvfr]`) + +// replaceUnicode converts hexadecimal Unicode codepoint notations to a one-rune string. +// It assumes the input string is correctly formatted. +func replaceUnicode(s string) string { + if s[1] == '#' { + r, _ := strconv.ParseInt(s[3:len(s)-1], 16, 32) + return string(r) + } + r, _, _, _ := strconv.UnquoteChar(s, 0) + return string(r) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/text/unicode/cldr/cldr.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/text/unicode/cldr/cldr.go new file mode 100644 index 00000000..2197f8ac --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/text/unicode/cldr/cldr.go @@ -0,0 +1,130 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:generate go run makexml.go -output xml.go + +// Package cldr provides a parser for LDML and related XML formats. +// This package is intended to be used by the table generation tools +// for the various internationalization-related packages. +// As the XML types are generated from the CLDR DTD, and as the CLDR standard +// is periodically amended, this package may change considerably over time. +// This mostly means that data may appear and disappear between versions. +// That is, old code should keep compiling for newer versions, but data +// may have moved or changed. +// CLDR version 22 is the first version supported by this package. +// Older versions may not work. +package cldr // import "golang.org/x/text/unicode/cldr" + +import ( + "fmt" + "sort" +) + +// CLDR provides access to parsed data of the Unicode Common Locale Data Repository. +type CLDR struct { + parent map[string][]string + locale map[string]*LDML + resolved map[string]*LDML + bcp47 *LDMLBCP47 + supp *SupplementalData +} + +func makeCLDR() *CLDR { + return &CLDR{ + parent: make(map[string][]string), + locale: make(map[string]*LDML), + resolved: make(map[string]*LDML), + bcp47: &LDMLBCP47{}, + supp: &SupplementalData{}, + } +} + +// BCP47 returns the parsed BCP47 LDML data. If no such data was parsed, nil is returned. +func (cldr *CLDR) BCP47() *LDMLBCP47 { + return nil +} + +// Draft indicates the draft level of an element. +type Draft int + +const ( + Approved Draft = iota + Contributed + Provisional + Unconfirmed +) + +var drafts = []string{"unconfirmed", "provisional", "contributed", "approved", ""} + +// ParseDraft returns the Draft value corresponding to the given string. The +// empty string corresponds to Approved. +func ParseDraft(level string) (Draft, error) { + if level == "" { + return Approved, nil + } + for i, s := range drafts { + if level == s { + return Unconfirmed - Draft(i), nil + } + } + return Approved, fmt.Errorf("cldr: unknown draft level %q", level) +} + +func (d Draft) String() string { + return drafts[len(drafts)-1-int(d)] +} + +// SetDraftLevel sets which draft levels to include in the evaluated LDML. +// Any draft element for which the draft level is higher than lev will be excluded. +// If multiple draft levels are available for a single element, the one with the +// lowest draft level will be selected, unless preferDraft is true, in which case +// the highest draft will be chosen. +// It is assumed that the underlying LDML is canonicalized. +func (cldr *CLDR) SetDraftLevel(lev Draft, preferDraft bool) { + // TODO: implement + cldr.resolved = make(map[string]*LDML) +} + +// RawLDML returns the LDML XML for id in unresolved form. +// id must be one of the strings returned by Locales. +func (cldr *CLDR) RawLDML(loc string) *LDML { + return cldr.locale[loc] +} + +// LDML returns the fully resolved LDML XML for loc, which must be one of +// the strings returned by Locales. +func (cldr *CLDR) LDML(loc string) (*LDML, error) { + return cldr.resolve(loc) +} + +// Supplemental returns the parsed supplemental data. If no such data was parsed, +// nil is returned. +func (cldr *CLDR) Supplemental() *SupplementalData { + return cldr.supp +} + +// Locales returns the locales for which there exist files. +// Valid sublocales for which there is no file are not included. +// The root locale is always sorted first. +func (cldr *CLDR) Locales() []string { + loc := []string{"root"} + hasRoot := false + for l, _ := range cldr.locale { + if l == "root" { + hasRoot = true + continue + } + loc = append(loc, l) + } + sort.Strings(loc[1:]) + if !hasRoot { + return loc[1:] + } + return loc +} + +// Get fills in the fields of x based on the XPath path. +func Get(e Elem, path string) (res Elem, err error) { + return walkXPath(e, path) +} diff --git a/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/text/unicode/cldr/collate.go b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/text/unicode/cldr/collate.go new file mode 100644 index 00000000..80ee28d7 --- /dev/null +++ b/vendor/github.com/SkycoinProject/skycoin/vendor/golang.org/x/text/unicode/cldr/collate.go @@ -0,0 +1,359 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package cldr + +import ( + "bufio" + "encoding/xml" + "errors" + "fmt" + "strconv" + "strings" + "unicode" + "unicode/utf8" +) + +// RuleProcessor can be passed to Collator's Process method, which +// parses the rules and calls the respective method for each rule found. +type RuleProcessor interface { + Reset(anchor string, before int) error + Insert(level int, str, context, extend string) error + Index(id string) +} + +const ( + // cldrIndex is a Unicode-reserved sentinel value used to mark the start + // of a grouping within an index. + // We ignore any rule that starts with this rune. + // See http://unicode.org/reports/tr35/#Collation_Elements for details. + cldrIndex = "\uFDD0" + + // specialAnchor is the format in which to represent logical reset positions, + // such as "first tertiary ignorable". + specialAnchor = "<%s/>" +) + +// Process parses the rules for the tailorings of this collation +// and calls the respective methods of p for each rule found. +func (c Collation) Process(p RuleProcessor) (err error) { + if len(c.Cr) > 0 { + if len(c.Cr) > 1 { + return fmt.Errorf("multiple cr elements, want 0 or 1") + } + return processRules(p, c.Cr[0].Data()) + } + if c.Rules.Any != nil { + return c.processXML(p) + } + return errors.New("no tailoring data") +} + +// processRules parses rules in the Collation Rule Syntax defined in +// http://www.unicode.org/reports/tr35/tr35-collation.html#Collation_Tailorings. +func processRules(p RuleProcessor, s string) (err error) { + chk := func(s string, e error) string { + if err == nil { + err = e + } + return s + } + i := 0 // Save the line number for use after the loop. + scanner := bufio.NewScanner(strings.NewReader(s)) + for ; scanner.Scan() && err == nil; i++ { + for s := skipSpace(scanner.Text()); s != "" && s[0] != '#'; s = skipSpace(s) { + level := 5 + var ch byte + switch ch, s = s[0], s[1:]; ch { + case '&': // followed by or '[' ']' + if s = skipSpace(s); consume(&s, '[') { + s = chk(parseSpecialAnchor(p, s)) + } else { + s = chk(parseAnchor(p, 0, s)) + } + case '<': // sort relation '<'{1,4}, optionally followed by '*'. + for level = 1; consume(&s, '<'); level++ { + } + if level > 4 { + err = fmt.Errorf("level %d > 4", level) + } + fallthrough + case '=': // identity relation, optionally followed by *. + if consume(&s, '*') { + s = chk(parseSequence(p, level, s)) + } else { + s = chk(parseOrder(p, level, s)) + } + default: + chk("", fmt.Errorf("illegal operator %q", ch)) + break + } + } + } + if chk("", scanner.Err()); err != nil { + return fmt.Errorf("%d: %v", i, err) + } + return nil +} + +// parseSpecialAnchor parses the anchor syntax which is either of the form +// ['before' ] +// or +// [
+#errors +Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. +Line: 1 Col: 20 Unexpected end tag (strong) in table context caused voodoo mode. +Line: 1 Col: 20 End tag (strong) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 24 Unexpected end tag (b) in table context caused voodoo mode. +Line: 1 Col: 24 End tag (b) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 29 Unexpected end tag (em) in table context caused voodoo mode. +Line: 1 Col: 29 End tag (em) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 33 Unexpected end tag (i) in table context caused voodoo mode. +Line: 1 Col: 33 End tag (i) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 37 Unexpected end tag (u) in table context caused voodoo mode. +Line: 1 Col: 37 End tag (u) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 46 Unexpected end tag (strike) in table context caused voodoo mode. +Line: 1 Col: 46 End tag (strike) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 50 Unexpected end tag (s) in table context caused voodoo mode. +Line: 1 Col: 50 End tag (s) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 58 Unexpected end tag (blink) in table context caused voodoo mode. +Line: 1 Col: 58 Unexpected end tag (blink). Ignored. +Line: 1 Col: 63 Unexpected end tag (tt) in table context caused voodoo mode. +Line: 1 Col: 63 End tag (tt) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 69 Unexpected end tag (pre) in table context caused voodoo mode. +Line: 1 Col: 69 End tag (pre) seen too early. Expected other end tag. +Line: 1 Col: 75 Unexpected end tag (big) in table context caused voodoo mode. +Line: 1 Col: 75 End tag (big) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 83 Unexpected end tag (small) in table context caused voodoo mode. +Line: 1 Col: 83 End tag (small) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 90 Unexpected end tag (font) in table context caused voodoo mode. +Line: 1 Col: 90 End tag (font) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 99 Unexpected end tag (select) in table context caused voodoo mode. +Line: 1 Col: 99 Unexpected end tag (select). Ignored. +Line: 1 Col: 104 Unexpected end tag (h1) in table context caused voodoo mode. +Line: 1 Col: 104 End tag (h1) seen too early. Expected other end tag. +Line: 1 Col: 109 Unexpected end tag (h2) in table context caused voodoo mode. +Line: 1 Col: 109 End tag (h2) seen too early. Expected other end tag. +Line: 1 Col: 114 Unexpected end tag (h3) in table context caused voodoo mode. +Line: 1 Col: 114 End tag (h3) seen too early. Expected other end tag. +Line: 1 Col: 119 Unexpected end tag (h4) in table context caused voodoo mode. +Line: 1 Col: 119 End tag (h4) seen too early. Expected other end tag. +Line: 1 Col: 124 Unexpected end tag (h5) in table context caused voodoo mode. +Line: 1 Col: 124 End tag (h5) seen too early. Expected other end tag. +Line: 1 Col: 129 Unexpected end tag (h6) in table context caused voodoo mode. +Line: 1 Col: 129 End tag (h6) seen too early. Expected other end tag. +Line: 1 Col: 136 Unexpected end tag (body) in the table row phase. Ignored. +Line: 1 Col: 141 Unexpected end tag (br) in table context caused voodoo mode. +Line: 1 Col: 141 Unexpected end tag (br). Treated as br element. +Line: 1 Col: 145 Unexpected end tag (a) in table context caused voodoo mode. +Line: 1 Col: 145 End tag (a) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 151 Unexpected end tag (img) in table context caused voodoo mode. +Line: 1 Col: 151 This element (img) has no end tag. +Line: 1 Col: 159 Unexpected end tag (title) in table context caused voodoo mode. +Line: 1 Col: 159 Unexpected end tag (title). Ignored. +Line: 1 Col: 166 Unexpected end tag (span) in table context caused voodoo mode. +Line: 1 Col: 166 Unexpected end tag (span). Ignored. +Line: 1 Col: 174 Unexpected end tag (style) in table context caused voodoo mode. +Line: 1 Col: 174 Unexpected end tag (style). Ignored. +Line: 1 Col: 183 Unexpected end tag (script) in table context caused voodoo mode. +Line: 1 Col: 183 Unexpected end tag (script). Ignored. +Line: 1 Col: 196 Unexpected end tag (th). Ignored. +Line: 1 Col: 201 Unexpected end tag (td). Ignored. +Line: 1 Col: 206 Unexpected end tag (tr). Ignored. +Line: 1 Col: 214 This element (frame) has no end tag. +Line: 1 Col: 221 This element (area) has no end tag. +Line: 1 Col: 228 Unexpected end tag (link). Ignored. +Line: 1 Col: 236 This element (param) has no end tag. +Line: 1 Col: 241 This element (hr) has no end tag. +Line: 1 Col: 249 This element (input) has no end tag. +Line: 1 Col: 255 Unexpected end tag (col). Ignored. +Line: 1 Col: 262 Unexpected end tag (base). Ignored. +Line: 1 Col: 269 Unexpected end tag (meta). Ignored. +Line: 1 Col: 280 This element (basefont) has no end tag. +Line: 1 Col: 290 This element (bgsound) has no end tag. +Line: 1 Col: 298 This element (embed) has no end tag. +Line: 1 Col: 307 This element (spacer) has no end tag. +Line: 1 Col: 311 Unexpected end tag (p). Ignored. +Line: 1 Col: 316 End tag (dd) seen too early. Expected other end tag. +Line: 1 Col: 321 End tag (dt) seen too early. Expected other end tag. +Line: 1 Col: 331 Unexpected end tag (caption). Ignored. +Line: 1 Col: 342 Unexpected end tag (colgroup). Ignored. +Line: 1 Col: 350 Unexpected end tag (tbody). Ignored. +Line: 1 Col: 358 Unexpected end tag (tfoot). Ignored. +Line: 1 Col: 366 Unexpected end tag (thead). Ignored. +Line: 1 Col: 376 End tag (address) seen too early. Expected other end tag. +Line: 1 Col: 389 End tag (blockquote) seen too early. Expected other end tag. +Line: 1 Col: 398 End tag (center) seen too early. Expected other end tag. +Line: 1 Col: 404 Unexpected end tag (dir). Ignored. +Line: 1 Col: 410 End tag (div) seen too early. Expected other end tag. +Line: 1 Col: 415 End tag (dl) seen too early. Expected other end tag. +Line: 1 Col: 426 End tag (fieldset) seen too early. Expected other end tag. +Line: 1 Col: 436 End tag (listing) seen too early. Expected other end tag. +Line: 1 Col: 443 End tag (menu) seen too early. Expected other end tag. +Line: 1 Col: 448 End tag (ol) seen too early. Expected other end tag. +Line: 1 Col: 453 End tag (ul) seen too early. Expected other end tag. +Line: 1 Col: 458 End tag (li) seen too early. Expected other end tag. +Line: 1 Col: 465 End tag (nobr) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 471 This element (wbr) has no end tag. +Line: 1 Col: 487 End tag (button) seen too early. Expected other end tag. +Line: 1 Col: 497 End tag (marquee) seen too early. Expected other end tag. +Line: 1 Col: 506 End tag (object) seen too early. Expected other end tag. +Line: 1 Col: 524 Unexpected end tag (html). Ignored. +Line: 1 Col: 524 Unexpected end tag (frameset). Ignored. +Line: 1 Col: 531 Unexpected end tag (head). Ignored. +Line: 1 Col: 540 Unexpected end tag (iframe). Ignored. +Line: 1 Col: 548 This element (image) has no end tag. +Line: 1 Col: 558 This element (isindex) has no end tag. +Line: 1 Col: 568 Unexpected end tag (noembed). Ignored. +Line: 1 Col: 579 Unexpected end tag (noframes). Ignored. +Line: 1 Col: 590 Unexpected end tag (noscript). Ignored. +Line: 1 Col: 601 Unexpected end tag (optgroup). Ignored. +Line: 1 Col: 610 Unexpected end tag (option). Ignored. +Line: 1 Col: 622 Unexpected end tag (plaintext). Ignored. +Line: 1 Col: 633 Unexpected end tag (textarea). Ignored. +#document +| +| +| +|
+| +| +| +|

+ +#data + +#errors +Line: 1 Col: 10 Unexpected start tag (frameset). Expected DOCTYPE. +Line: 1 Col: 10 Expected closing tag. Unexpected end of file. +#document +| +| +| diff --git a/vendor/golang.org/x/net/html/testdata/webkit/tests10.dat b/vendor/golang.org/x/net/html/testdata/webkit/tests10.dat new file mode 100644 index 00000000..4f8df86f --- /dev/null +++ b/vendor/golang.org/x/net/html/testdata/webkit/tests10.dat @@ -0,0 +1,799 @@ +#data + +#errors +#document +| +| +| +| +| + +#data +a +#errors +29: Bogus comment +#document +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| + +#data + +#errors +35: Stray “svg†start tag. +42: Stray end tag “svg†+#document +| +| +| +| +| +#errors +43: Stray “svg†start tag. +50: Stray end tag “svg†+#document +| +| +| +| +|

+#errors +34: Start tag “svg†seen in “tableâ€. +41: Stray end tag “svgâ€. +#document +| +| +| +| +| +| + +#data +
foo
+#errors +34: Start tag “svg†seen in “tableâ€. +46: Stray end tag “gâ€. +53: Stray end tag “svgâ€. +#document +| +| +| +| +| +| +| "foo" +| + +#data +
foobar
+#errors +34: Start tag “svg†seen in “tableâ€. +46: Stray end tag “gâ€. +58: Stray end tag “gâ€. +65: Stray end tag “svgâ€. +#document +| +| +| +| +| +| +| "foo" +| +| "bar" +| + +#data +
foobar
+#errors +41: Start tag “svg†seen in “tableâ€. +53: Stray end tag “gâ€. +65: Stray end tag “gâ€. +72: Stray end tag “svgâ€. +#document +| +| +| +| +| +| +| "foo" +| +| "bar" +| +| + +#data +
foobar
+#errors +45: Start tag “svg†seen in “tableâ€. +57: Stray end tag “gâ€. +69: Stray end tag “gâ€. +76: Stray end tag “svgâ€. +#document +| +| +| +| +| +| +| "foo" +| +| "bar" +| +| +| + +#data +
foobar
+#errors +#document +| +| +| +| +| +| +| +|
+| +| +| "foo" +| +| "bar" + +#data +
foobar

baz

+#errors +#document +| +| +| +| +| +| +| +|
+| +| +| "foo" +| +| "bar" +|

+| "baz" + +#data +
foobar

baz

+#errors +#document +| +| +| +| +| +|
+| +| +| "foo" +| +| "bar" +|

+| "baz" + +#data +
foobar

baz

quux +#errors +70: HTML start tag “p†in a foreign namespace context. +81: “table†closed but “caption†was still open. +#document +| +| +| +| +| +|
+| +| +| "foo" +| +| "bar" +|

+| "baz" +|

+| "quux" + +#data +
foobarbaz

quux +#errors +78: “table†closed but “caption†was still open. +78: Unclosed elements on stack. +#document +| +| +| +| +| +|
+| +| +| "foo" +| +| "bar" +| "baz" +|

+| "quux" + +#data +foobar

baz

quux +#errors +44: Start tag “svg†seen in “tableâ€. +56: Stray end tag “gâ€. +68: Stray end tag “gâ€. +71: HTML start tag “p†in a foreign namespace context. +71: Start tag “p†seen in “tableâ€. +#document +| +| +| +| +| +| +| "foo" +| +| "bar" +|

+| "baz" +| +| +|

+| "quux" + +#data +

quux +#errors +50: Stray “svg†start tag. +54: Stray “g†start tag. +62: Stray end tag “g†+66: Stray “g†start tag. +74: Stray end tag “g†+77: Stray “p†start tag. +88: “table†end tag with “select†open. +#document +| +| +| +| +| +| +| +|
+|

quux +#errors +36: Start tag “select†seen in “tableâ€. +42: Stray “svg†start tag. +46: Stray “g†start tag. +54: Stray end tag “g†+58: Stray “g†start tag. +66: Stray end tag “g†+69: Stray “p†start tag. +80: “table†end tag with “select†open. +#document +| +| +| +| +| +|

+| "quux" + +#data +foobar

baz +#errors +41: Stray “svg†start tag. +68: HTML start tag “p†in a foreign namespace context. +#document +| +| +| +| +| +| +| "foo" +| +| "bar" +|

+| "baz" + +#data +foobar

baz +#errors +34: Stray “svg†start tag. +61: HTML start tag “p†in a foreign namespace context. +#document +| +| +| +| +| +| +| "foo" +| +| "bar" +|

+| "baz" + +#data +

+#errors +31: Stray “svg†start tag. +35: Stray “g†start tag. +40: Stray end tag “g†+44: Stray “g†start tag. +49: Stray end tag “g†+52: Stray “p†start tag. +58: Stray “span†start tag. +58: End of file seen and there were open elements. +#document +| +| +| +| + +#data +

+#errors +42: Stray “svg†start tag. +46: Stray “g†start tag. +51: Stray end tag “g†+55: Stray “g†start tag. +60: Stray end tag “g†+63: Stray “p†start tag. +69: Stray “span†start tag. +#document +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| xlink:href="foo" +| +| xlink href="foo" + +#data + +#errors +#document +| +| +| +| +| xlink:href="foo" +| xml:lang="en" +| +| +| xlink href="foo" +| xml lang="en" + +#data + +#errors +#document +| +| +| +| +| xlink:href="foo" +| xml:lang="en" +| +| +| xlink href="foo" +| xml lang="en" + +#data +bar +#errors +#document +| +| +| +| +| xlink:href="foo" +| xml:lang="en" +| +| +| xlink href="foo" +| xml lang="en" +| "bar" + +#data + +#errors +#document +| +| +| +| + +#data +

a +#errors +#document +| +| +| +|
+| +| "a" + +#data +
a +#errors +#document +| +| +| +|
+| +| +| "a" + +#data +
+#errors +#document +| +| +| +|
+| +| +| + +#data +
a +#errors +#document +| +| +| +|
+| +| +| +| +| "a" + +#data +

a +#errors +#document +| +| +| +|

+| +| +| +|

+| "a" + +#data +
    a +#errors +40: HTML start tag “ul†in a foreign namespace context. +41: End of file in a foreign namespace context. +#document +| +| +| +| +| +| +|
    +| +|
      +| "a" + +#data +
        a +#errors +35: HTML start tag “ul†in a foreign namespace context. +36: End of file in a foreign namespace context. +#document +| +| +| +| +| +| +| +|
          +| "a" + +#data +

          +#errors +#document +| +| +| +| +|

          +| +| +|

          + +#data +

          +#errors +#document +| +| +| +| +|

          +| +| +|

          + +#data +

          +#errors +#document +| +| +| +|

          +| +| +| +|

          +|

          + +#data +
          +#errors +#document +| +| +| +| +| +|
          +| +|
          +| +| + +#data +
          +#errors +#document +| +| +| +| +| +| +| +|
          +|
          +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data +

+#errors +#document +| +| +| +| +|
+| +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| +| + +#data +
+#errors +#document +| +| +| +| +| +| +| +|
+| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| +| +| +| +| +| +| +| +| diff --git a/vendor/golang.org/x/net/html/testdata/webkit/tests11.dat b/vendor/golang.org/x/net/html/testdata/webkit/tests11.dat new file mode 100644 index 00000000..638cde47 --- /dev/null +++ b/vendor/golang.org/x/net/html/testdata/webkit/tests11.dat @@ -0,0 +1,482 @@ +#data + +#errors +#document +| +| +| +| +| +| attributeName="" +| attributeType="" +| baseFrequency="" +| baseProfile="" +| calcMode="" +| clipPathUnits="" +| contentScriptType="" +| contentStyleType="" +| diffuseConstant="" +| edgeMode="" +| externalResourcesRequired="" +| filterRes="" +| filterUnits="" +| glyphRef="" +| gradientTransform="" +| gradientUnits="" +| kernelMatrix="" +| kernelUnitLength="" +| keyPoints="" +| keySplines="" +| keyTimes="" +| lengthAdjust="" +| limitingConeAngle="" +| markerHeight="" +| markerUnits="" +| markerWidth="" +| maskContentUnits="" +| maskUnits="" +| numOctaves="" +| pathLength="" +| patternContentUnits="" +| patternTransform="" +| patternUnits="" +| pointsAtX="" +| pointsAtY="" +| pointsAtZ="" +| preserveAlpha="" +| preserveAspectRatio="" +| primitiveUnits="" +| refX="" +| refY="" +| repeatCount="" +| repeatDur="" +| requiredExtensions="" +| requiredFeatures="" +| specularConstant="" +| specularExponent="" +| spreadMethod="" +| startOffset="" +| stdDeviation="" +| stitchTiles="" +| surfaceScale="" +| systemLanguage="" +| tableValues="" +| targetX="" +| targetY="" +| textLength="" +| viewBox="" +| viewTarget="" +| xChannelSelector="" +| yChannelSelector="" +| zoomAndPan="" + +#data + +#errors +#document +| +| +| +| +| +| attributeName="" +| attributeType="" +| baseFrequency="" +| baseProfile="" +| calcMode="" +| clipPathUnits="" +| contentScriptType="" +| contentStyleType="" +| diffuseConstant="" +| edgeMode="" +| externalResourcesRequired="" +| filterRes="" +| filterUnits="" +| glyphRef="" +| gradientTransform="" +| gradientUnits="" +| kernelMatrix="" +| kernelUnitLength="" +| keyPoints="" +| keySplines="" +| keyTimes="" +| lengthAdjust="" +| limitingConeAngle="" +| markerHeight="" +| markerUnits="" +| markerWidth="" +| maskContentUnits="" +| maskUnits="" +| numOctaves="" +| pathLength="" +| patternContentUnits="" +| patternTransform="" +| patternUnits="" +| pointsAtX="" +| pointsAtY="" +| pointsAtZ="" +| preserveAlpha="" +| preserveAspectRatio="" +| primitiveUnits="" +| refX="" +| refY="" +| repeatCount="" +| repeatDur="" +| requiredExtensions="" +| requiredFeatures="" +| specularConstant="" +| specularExponent="" +| spreadMethod="" +| startOffset="" +| stdDeviation="" +| stitchTiles="" +| surfaceScale="" +| systemLanguage="" +| tableValues="" +| targetX="" +| targetY="" +| textLength="" +| viewBox="" +| viewTarget="" +| xChannelSelector="" +| yChannelSelector="" +| zoomAndPan="" + +#data + +#errors +#document +| +| +| +| +| +| attributeName="" +| attributeType="" +| baseFrequency="" +| baseProfile="" +| calcMode="" +| clipPathUnits="" +| contentScriptType="" +| contentStyleType="" +| diffuseConstant="" +| edgeMode="" +| externalResourcesRequired="" +| filterRes="" +| filterUnits="" +| glyphRef="" +| gradientTransform="" +| gradientUnits="" +| kernelMatrix="" +| kernelUnitLength="" +| keyPoints="" +| keySplines="" +| keyTimes="" +| lengthAdjust="" +| limitingConeAngle="" +| markerHeight="" +| markerUnits="" +| markerWidth="" +| maskContentUnits="" +| maskUnits="" +| numOctaves="" +| pathLength="" +| patternContentUnits="" +| patternTransform="" +| patternUnits="" +| pointsAtX="" +| pointsAtY="" +| pointsAtZ="" +| preserveAlpha="" +| preserveAspectRatio="" +| primitiveUnits="" +| refX="" +| refY="" +| repeatCount="" +| repeatDur="" +| requiredExtensions="" +| requiredFeatures="" +| specularConstant="" +| specularExponent="" +| spreadMethod="" +| startOffset="" +| stdDeviation="" +| stitchTiles="" +| surfaceScale="" +| systemLanguage="" +| tableValues="" +| targetX="" +| targetY="" +| textLength="" +| viewBox="" +| viewTarget="" +| xChannelSelector="" +| yChannelSelector="" +| zoomAndPan="" + +#data + +#errors +#document +| +| +| +| +| +| attributename="" +| attributetype="" +| basefrequency="" +| baseprofile="" +| calcmode="" +| clippathunits="" +| contentscripttype="" +| contentstyletype="" +| diffuseconstant="" +| edgemode="" +| externalresourcesrequired="" +| filterres="" +| filterunits="" +| glyphref="" +| gradienttransform="" +| gradientunits="" +| kernelmatrix="" +| kernelunitlength="" +| keypoints="" +| keysplines="" +| keytimes="" +| lengthadjust="" +| limitingconeangle="" +| markerheight="" +| markerunits="" +| markerwidth="" +| maskcontentunits="" +| maskunits="" +| numoctaves="" +| pathlength="" +| patterncontentunits="" +| patterntransform="" +| patternunits="" +| pointsatx="" +| pointsaty="" +| pointsatz="" +| preservealpha="" +| preserveaspectratio="" +| primitiveunits="" +| refx="" +| refy="" +| repeatcount="" +| repeatdur="" +| requiredextensions="" +| requiredfeatures="" +| specularconstant="" +| specularexponent="" +| spreadmethod="" +| startoffset="" +| stddeviation="" +| stitchtiles="" +| surfacescale="" +| systemlanguage="" +| tablevalues="" +| targetx="" +| targety="" +| textlength="" +| viewbox="" +| viewtarget="" +| xchannelselector="" +| ychannelselector="" +| zoomandpan="" + +#data + +#errors +#document +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| diff --git a/vendor/golang.org/x/net/html/testdata/webkit/tests14.dat b/vendor/golang.org/x/net/html/testdata/webkit/tests14.dat new file mode 100644 index 00000000..b8713f88 --- /dev/null +++ b/vendor/golang.org/x/net/html/testdata/webkit/tests14.dat @@ -0,0 +1,74 @@ +#data + +#errors +#document +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data + +#errors +15: Unexpected start tag html +#document +| +| +| abc:def="gh" +| +| +| + +#data + +#errors +15: Unexpected start tag html +#document +| +| +| xml:lang="bar" +| +| + +#data + +#errors +#document +| +| +| 123="456" +| +| + +#data + +#errors +#document +| +| +| 123="456" +| 789="012" +| +| + +#data + +#errors +#document +| +| +| +| +| 789="012" diff --git a/vendor/golang.org/x/net/html/testdata/webkit/tests15.dat b/vendor/golang.org/x/net/html/testdata/webkit/tests15.dat new file mode 100644 index 00000000..6ce1c0d1 --- /dev/null +++ b/vendor/golang.org/x/net/html/testdata/webkit/tests15.dat @@ -0,0 +1,208 @@ +#data +

X +#errors +Line: 1 Col: 31 Unexpected end tag (p). Ignored. +Line: 1 Col: 36 Expected closing tag. Unexpected end of file. +#document +| +| +| +| +|

+| +| +| +| +| +| +| " " +|

+| "X" + +#data +

+

X +#errors +Line: 1 Col: 3 Unexpected start tag (p). Expected DOCTYPE. +Line: 1 Col: 16 Unexpected end tag (p). Ignored. +Line: 2 Col: 4 Expected closing tag. Unexpected end of file. +#document +| +| +| +|

+| +| +| +| +| +| +| " +" +|

+| "X" + +#data + +#errors +Line: 1 Col: 22 Unexpected end tag (html) after the (implied) root element. +#document +| +| +| +| +| " " + +#data + +#errors +Line: 1 Col: 22 Unexpected end tag (body) after the (implied) root element. +#document +| +| +| +| +| + +#data + +#errors +Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE. +Line: 1 Col: 13 Unexpected end tag (html) after the (implied) root element. +#document +| +| +| +| + +#data +X +#errors +Line: 1 Col: 22 Unexpected end tag (body) after the (implied) root element. +#document +| +| +| +| +| +| "X" + +#data +<!doctype html><table> X<meta></table> +#errors +Line: 1 Col: 24 Unexpected non-space characters in table context caused voodoo mode. +Line: 1 Col: 30 Unexpected start tag (meta) in table context caused voodoo mode. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| " X" +| <meta> +| <table> + +#data +<!doctype html><table> x</table> +#errors +Line: 1 Col: 24 Unexpected non-space characters in table context caused voodoo mode. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| " x" +| <table> + +#data +<!doctype html><table> x </table> +#errors +Line: 1 Col: 25 Unexpected non-space characters in table context caused voodoo mode. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| " x " +| <table> + +#data +<!doctype html><table><tr> x</table> +#errors +Line: 1 Col: 28 Unexpected non-space characters in table context caused voodoo mode. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| " x" +| <table> +| <tbody> +| <tr> + +#data +<!doctype html><table>X<style> <tr>x </style> </table> +#errors +Line: 1 Col: 23 Unexpected non-space characters in table context caused voodoo mode. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "X" +| <table> +| <style> +| " <tr>x " +| " " + +#data +<!doctype html><div><table><a>foo</a> <tr><td>bar</td> </tr></table></div> +#errors +Line: 1 Col: 30 Unexpected start tag (a) in table context caused voodoo mode. +Line: 1 Col: 37 Unexpected end tag (a) in table context caused voodoo mode. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <div> +| <a> +| "foo" +| <table> +| " " +| <tbody> +| <tr> +| <td> +| "bar" +| " " + +#data +<frame></frame></frame><frameset><frame><frameset><frame></frameset><noframes></frameset><noframes> +#errors +6: Start tag seen without seeing a doctype first. Expected “<!DOCTYPE html>â€. +13: Stray start tag “frameâ€. +21: Stray end tag “frameâ€. +29: Stray end tag “frameâ€. +39: “frameset†start tag after “body†already open. +105: End of file seen inside an [R]CDATA element. +105: End of file seen and there were open elements. +XXX: These errors are wrong, please fix me! +#document +| <html> +| <head> +| <frameset> +| <frame> +| <frameset> +| <frame> +| <noframes> +| "</frameset><noframes>" + +#data +<!DOCTYPE html><object></html> +#errors +1: Expected closing tag. Unexpected end of file +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <object> diff --git a/vendor/golang.org/x/net/html/testdata/webkit/tests17.dat b/vendor/golang.org/x/net/html/testdata/webkit/tests17.dat new file mode 100644 index 00000000..7b555f88 --- /dev/null +++ b/vendor/golang.org/x/net/html/testdata/webkit/tests17.dat @@ -0,0 +1,153 @@ +#data +<!doctype html><table><tbody><select><tr> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <table> +| <tbody> +| <tr> + +#data +<!doctype html><table><tr><select><td> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <table> +| <tbody> +| <tr> +| <td> + +#data +<!doctype html><table><tr><td><select><td> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| <select> +| <td> + +#data +<!doctype html><table><tr><th><select><td> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <th> +| <select> +| <td> + +#data +<!doctype html><table><caption><select><tr> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <caption> +| <select> +| <tbody> +| <tr> + +#data +<!doctype html><select><tr> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> + +#data +<!doctype html><select><td> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> + +#data +<!doctype html><select><th> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> + +#data +<!doctype html><select><tbody> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> + +#data +<!doctype html><select><thead> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> + +#data +<!doctype html><select><tfoot> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> + +#data +<!doctype html><select><caption> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> + +#data +<!doctype html><table><tr></table>a +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| "a" diff --git a/vendor/golang.org/x/net/html/testdata/webkit/tests18.dat b/vendor/golang.org/x/net/html/testdata/webkit/tests18.dat new file mode 100644 index 00000000..680e1f06 --- /dev/null +++ b/vendor/golang.org/x/net/html/testdata/webkit/tests18.dat @@ -0,0 +1,269 @@ +#data +<!doctype html><plaintext></plaintext> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <plaintext> +| "</plaintext>" + +#data +<!doctype html><table><plaintext></plaintext> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <plaintext> +| "</plaintext>" +| <table> + +#data +<!doctype html><table><tbody><plaintext></plaintext> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <plaintext> +| "</plaintext>" +| <table> +| <tbody> + +#data +<!doctype html><table><tbody><tr><plaintext></plaintext> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <plaintext> +| "</plaintext>" +| <table> +| <tbody> +| <tr> + +#data +<!doctype html><table><tbody><tr><plaintext></plaintext> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <plaintext> +| "</plaintext>" +| <table> +| <tbody> +| <tr> + +#data +<!doctype html><table><td><plaintext></plaintext> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| <plaintext> +| "</plaintext>" + +#data +<!doctype html><table><caption><plaintext></plaintext> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <caption> +| <plaintext> +| "</plaintext>" + +#data +<!doctype html><table><tr><style></script></style>abc +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "abc" +| <table> +| <tbody> +| <tr> +| <style> +| "</script>" + +#data +<!doctype html><table><tr><script></style></script>abc +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "abc" +| <table> +| <tbody> +| <tr> +| <script> +| "</style>" + +#data +<!doctype html><table><caption><style></script></style>abc +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <caption> +| <style> +| "</script>" +| "abc" + +#data +<!doctype html><table><td><style></script></style>abc +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| <style> +| "</script>" +| "abc" + +#data +<!doctype html><select><script></style></script>abc +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <script> +| "</style>" +| "abc" + +#data +<!doctype html><table><select><script></style></script>abc +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <script> +| "</style>" +| "abc" +| <table> + +#data +<!doctype html><table><tr><select><script></style></script>abc +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <script> +| "</style>" +| "abc" +| <table> +| <tbody> +| <tr> + +#data +<!doctype html><frameset></frameset><noframes>abc +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <noframes> +| "abc" + +#data +<!doctype html><frameset></frameset><noframes>abc</noframes><!--abc--> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <noframes> +| "abc" +| <!-- abc --> + +#data +<!doctype html><frameset></frameset></html><noframes>abc +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <noframes> +| "abc" + +#data +<!doctype html><frameset></frameset></html><noframes>abc</noframes><!--abc--> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <noframes> +| "abc" +| <!-- abc --> + +#data +<!doctype html><table><tr></tbody><tfoot> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <tfoot> + +#data +<!doctype html><table><td><svg></svg>abc<td> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| <svg svg> +| "abc" +| <td> diff --git a/vendor/golang.org/x/net/html/testdata/webkit/tests19.dat b/vendor/golang.org/x/net/html/testdata/webkit/tests19.dat new file mode 100644 index 00000000..0d62f5a5 --- /dev/null +++ b/vendor/golang.org/x/net/html/testdata/webkit/tests19.dat @@ -0,0 +1,1237 @@ +#data +<!doctype html><math><mn DefinitionUrl="foo"> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <math math> +| <math mn> +| definitionURL="foo" + +#data +<!doctype html><html></p><!--foo--> +#errors +#document +| <!DOCTYPE html> +| <html> +| <!-- foo --> +| <head> +| <body> + +#data +<!doctype html><head></head></p><!--foo--> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <!-- foo --> +| <body> + +#data +<!doctype html><body><p><pre> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <pre> + +#data +<!doctype html><body><p><listing> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <listing> + +#data +<!doctype html><p><plaintext> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <plaintext> + +#data +<!doctype html><p><h1> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <h1> + +#data +<!doctype html><form><isindex> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <form> + +#data +<!doctype html><isindex action="POST"> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <form> +| action="POST" +| <hr> +| <label> +| "This is a searchable index. Enter search keywords: " +| <input> +| name="isindex" +| <hr> + +#data +<!doctype html><isindex prompt="this is isindex"> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <form> +| <hr> +| <label> +| "this is isindex" +| <input> +| name="isindex" +| <hr> + +#data +<!doctype html><isindex type="hidden"> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <form> +| <hr> +| <label> +| "This is a searchable index. Enter search keywords: " +| <input> +| name="isindex" +| type="hidden" +| <hr> + +#data +<!doctype html><isindex name="foo"> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <form> +| <hr> +| <label> +| "This is a searchable index. Enter search keywords: " +| <input> +| name="isindex" +| <hr> + +#data +<!doctype html><ruby><p><rp> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <ruby> +| <p> +| <rp> + +#data +<!doctype html><ruby><div><span><rp> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <ruby> +| <div> +| <span> +| <rp> + +#data +<!doctype html><ruby><div><p><rp> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <ruby> +| <div> +| <p> +| <rp> + +#data +<!doctype html><ruby><p><rt> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <ruby> +| <p> +| <rt> + +#data +<!doctype html><ruby><div><span><rt> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <ruby> +| <div> +| <span> +| <rt> + +#data +<!doctype html><ruby><div><p><rt> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <ruby> +| <div> +| <p> +| <rt> + +#data +<!doctype html><math/><foo> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <math math> +| <foo> + +#data +<!doctype html><svg/><foo> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <svg svg> +| <foo> + +#data +<!doctype html><div></body><!--foo--> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <div> +| <!-- foo --> + +#data +<!doctype html><h1><div><h3><span></h1>foo +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <h1> +| <div> +| <h3> +| <span> +| "foo" + +#data +<!doctype html><p></h3>foo +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| "foo" + +#data +<!doctype html><h3><li>abc</h2>foo +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <h3> +| <li> +| "abc" +| "foo" + +#data +<!doctype html><table>abc<!--foo--> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "abc" +| <table> +| <!-- foo --> + +#data +<!doctype html><table> <!--foo--> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| " " +| <!-- foo --> + +#data +<!doctype html><table> b <!--foo--> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| " b " +| <table> +| <!-- foo --> + +#data +<!doctype html><select><option><option> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <option> +| <option> + +#data +<!doctype html><select><option></optgroup> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <option> + +#data +<!doctype html><select><option></optgroup> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <option> + +#data +<!doctype html><p><math><mi><p><h1> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <math math> +| <math mi> +| <p> +| <h1> + +#data +<!doctype html><p><math><mo><p><h1> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <math math> +| <math mo> +| <p> +| <h1> + +#data +<!doctype html><p><math><mn><p><h1> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <math math> +| <math mn> +| <p> +| <h1> + +#data +<!doctype html><p><math><ms><p><h1> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <math math> +| <math ms> +| <p> +| <h1> + +#data +<!doctype html><p><math><mtext><p><h1> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <math math> +| <math mtext> +| <p> +| <h1> + +#data +<!doctype html><frameset></noframes> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> + +#data +<!doctype html><html c=d><body></html><html a=b> +#errors +#document +| <!DOCTYPE html> +| <html> +| a="b" +| c="d" +| <head> +| <body> + +#data +<!doctype html><html c=d><frameset></frameset></html><html a=b> +#errors +#document +| <!DOCTYPE html> +| <html> +| a="b" +| c="d" +| <head> +| <frameset> + +#data +<!doctype html><html><frameset></frameset></html><!--foo--> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <!-- foo --> + +#data +<!doctype html><html><frameset></frameset></html> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| " " + +#data +<!doctype html><html><frameset></frameset></html>abc +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> + +#data +<!doctype html><html><frameset></frameset></html><p> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> + +#data +<!doctype html><html><frameset></frameset></html></p> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> + +#data +<html><frameset></frameset></html><!doctype html> +#errors +#document +| <html> +| <head> +| <frameset> + +#data +<!doctype html><body><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> + +#data +<!doctype html><p><frameset><frame> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <frame> + +#data +<!doctype html><p>a<frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| "a" + +#data +<!doctype html><p> <frameset><frame> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <frame> + +#data +<!doctype html><pre><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <pre> + +#data +<!doctype html><listing><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <listing> + +#data +<!doctype html><li><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <li> + +#data +<!doctype html><dd><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <dd> + +#data +<!doctype html><dt><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <dt> + +#data +<!doctype html><button><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <button> + +#data +<!doctype html><applet><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <applet> + +#data +<!doctype html><marquee><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <marquee> + +#data +<!doctype html><object><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <object> + +#data +<!doctype html><table><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> + +#data +<!doctype html><area><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <area> + +#data +<!doctype html><basefont><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <basefont> +| <frameset> + +#data +<!doctype html><bgsound><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <bgsound> +| <frameset> + +#data +<!doctype html><br><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <br> + +#data +<!doctype html><embed><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <embed> + +#data +<!doctype html><img><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <img> + +#data +<!doctype html><input><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <input> + +#data +<!doctype html><keygen><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <keygen> + +#data +<!doctype html><wbr><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <wbr> + +#data +<!doctype html><hr><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <hr> + +#data +<!doctype html><textarea></textarea><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <textarea> + +#data +<!doctype html><xmp></xmp><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <xmp> + +#data +<!doctype html><iframe></iframe><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <iframe> + +#data +<!doctype html><select></select><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> + +#data +<!doctype html><svg></svg><frameset><frame> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <frame> + +#data +<!doctype html><math></math><frameset><frame> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <frame> + +#data +<!doctype html><svg><foreignObject><div> <frameset><frame> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <frame> + +#data +<!doctype html><svg>a</svg><frameset><frame> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <svg svg> +| "a" + +#data +<!doctype html><svg> </svg><frameset><frame> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <frame> + +#data +<html>aaa<frameset></frameset> +#errors +#document +| <html> +| <head> +| <body> +| "aaa" + +#data +<html> a <frameset></frameset> +#errors +#document +| <html> +| <head> +| <body> +| "a " + +#data +<!doctype html><div><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> + +#data +<!doctype html><div><body><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <div> + +#data +<!doctype html><p><math></p>a +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <math math> +| "a" + +#data +<!doctype html><p><math><mn><span></p>a +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <math math> +| <math mn> +| <span> +| <p> +| "a" + +#data +<!doctype html><math></html> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <math math> + +#data +<!doctype html><meta charset="ascii"> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <meta> +| charset="ascii" +| <body> + +#data +<!doctype html><meta http-equiv="content-type" content="text/html;charset=ascii"> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <meta> +| content="text/html;charset=ascii" +| http-equiv="content-type" +| <body> + +#data +<!doctype html><head><!--aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa--><meta charset="utf8"> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <!-- aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa --> +| <meta> +| charset="utf8" +| <body> + +#data +<!doctype html><html a=b><head></head><html c=d> +#errors +#document +| <!DOCTYPE html> +| <html> +| a="b" +| c="d" +| <head> +| <body> + +#data +<!doctype html><image/> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <img> + +#data +<!doctype html>a<i>b<table>c<b>d</i>e</b>f +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "a" +| <i> +| "bc" +| <b> +| "de" +| "f" +| <table> + +#data +<!doctype html><table><i>a<b>b<div>c<a>d</i>e</b>f +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <i> +| "a" +| <b> +| "b" +| <b> +| <div> +| <b> +| <i> +| "c" +| <a> +| "d" +| <a> +| "e" +| <a> +| "f" +| <table> + +#data +<!doctype html><i>a<b>b<div>c<a>d</i>e</b>f +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <i> +| "a" +| <b> +| "b" +| <b> +| <div> +| <b> +| <i> +| "c" +| <a> +| "d" +| <a> +| "e" +| <a> +| "f" + +#data +<!doctype html><table><i>a<b>b<div>c</i> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <i> +| "a" +| <b> +| "b" +| <b> +| <div> +| <i> +| "c" +| <table> + +#data +<!doctype html><table><i>a<b>b<div>c<a>d</i>e</b>f +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <i> +| "a" +| <b> +| "b" +| <b> +| <div> +| <b> +| <i> +| "c" +| <a> +| "d" +| <a> +| "e" +| <a> +| "f" +| <table> + +#data +<!doctype html><table><i>a<div>b<tr>c<b>d</i>e +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <i> +| "a" +| <div> +| "b" +| <i> +| "c" +| <b> +| "d" +| <b> +| "e" +| <table> +| <tbody> +| <tr> + +#data +<!doctype html><table><td><table><i>a<div>b<b>c</i>d +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| <i> +| "a" +| <div> +| <i> +| "b" +| <b> +| "c" +| <b> +| "d" +| <table> + +#data +<!doctype html><body><bgsound> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <bgsound> + +#data +<!doctype html><body><basefont> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <basefont> + +#data +<!doctype html><a><b></a><basefont> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <a> +| <b> +| <basefont> + +#data +<!doctype html><a><b></a><bgsound> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <a> +| <b> +| <bgsound> + +#data +<!doctype html><figcaption><article></figcaption>a +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <figcaption> +| <article> +| "a" + +#data +<!doctype html><summary><article></summary>a +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <summary> +| <article> +| "a" + +#data +<!doctype html><p><a><plaintext>b +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <a> +| <plaintext> +| <a> +| "b" + +#data +<!DOCTYPE html><div>a<a></div>b<p>c</p>d +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <div> +| "a" +| <a> +| <a> +| "b" +| <p> +| "c" +| "d" diff --git a/vendor/golang.org/x/net/html/testdata/webkit/tests2.dat b/vendor/golang.org/x/net/html/testdata/webkit/tests2.dat new file mode 100644 index 00000000..60d85922 --- /dev/null +++ b/vendor/golang.org/x/net/html/testdata/webkit/tests2.dat @@ -0,0 +1,763 @@ +#data +<!DOCTYPE html>Test +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "Test" + +#data +<textarea>test</div>test +#errors +Line: 1 Col: 10 Unexpected start tag (textarea). Expected DOCTYPE. +Line: 1 Col: 24 Expected closing tag. Unexpected end of file. +#document +| <html> +| <head> +| <body> +| <textarea> +| "test</div>test" + +#data +<table><td> +#errors +Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. +Line: 1 Col: 11 Unexpected table cell start tag (td) in the table body phase. +Line: 1 Col: 11 Expected closing tag. Unexpected end of file. +#document +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> + +#data +<table><td>test</tbody></table> +#errors +Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. +Line: 1 Col: 11 Unexpected table cell start tag (td) in the table body phase. +#document +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| "test" + +#data +<frame>test +#errors +Line: 1 Col: 7 Unexpected start tag (frame). Expected DOCTYPE. +Line: 1 Col: 7 Unexpected start tag frame. Ignored. +#document +| <html> +| <head> +| <body> +| "test" + +#data +<!DOCTYPE html><frameset>test +#errors +Line: 1 Col: 29 Unepxected characters in the frameset phase. Characters ignored. +Line: 1 Col: 29 Expected closing tag. Unexpected end of file. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> + +#data +<!DOCTYPE html><frameset><!DOCTYPE html> +#errors +Line: 1 Col: 40 Unexpected DOCTYPE. Ignored. +Line: 1 Col: 40 Expected closing tag. Unexpected end of file. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> + +#data +<!DOCTYPE html><font><p><b>test</font> +#errors +Line: 1 Col: 38 End tag (font) violates step 1, paragraph 3 of the adoption agency algorithm. +Line: 1 Col: 38 End tag (font) violates step 1, paragraph 3 of the adoption agency algorithm. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <font> +| <p> +| <font> +| <b> +| "test" + +#data +<!DOCTYPE html><dt><div><dd> +#errors +Line: 1 Col: 28 Missing end tag (div, dt). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <dt> +| <div> +| <dd> + +#data +<script></x +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 11 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</x" +| <body> + +#data +<table><plaintext><td> +#errors +Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. +Line: 1 Col: 18 Unexpected start tag (plaintext) in table context caused voodoo mode. +Line: 1 Col: 22 Unexpected end of file. Expected table content. +#document +| <html> +| <head> +| <body> +| <plaintext> +| "<td>" +| <table> + +#data +<plaintext></plaintext> +#errors +Line: 1 Col: 11 Unexpected start tag (plaintext). Expected DOCTYPE. +Line: 1 Col: 23 Expected closing tag. Unexpected end of file. +#document +| <html> +| <head> +| <body> +| <plaintext> +| "</plaintext>" + +#data +<!DOCTYPE html><table><tr>TEST +#errors +Line: 1 Col: 30 Unexpected non-space characters in table context caused voodoo mode. +Line: 1 Col: 30 Unexpected end of file. Expected table content. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "TEST" +| <table> +| <tbody> +| <tr> + +#data +<!DOCTYPE html><body t1=1><body t2=2><body t3=3 t4=4> +#errors +Line: 1 Col: 37 Unexpected start tag (body). +Line: 1 Col: 53 Unexpected start tag (body). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| t1="1" +| t2="2" +| t3="3" +| t4="4" + +#data +</b test +#errors +Line: 1 Col: 8 Unexpected end of file in attribute name. +Line: 1 Col: 8 End tag contains unexpected attributes. +Line: 1 Col: 8 Unexpected end tag (b). Expected DOCTYPE. +Line: 1 Col: 8 Unexpected end tag (b) after the (implied) root element. +#document +| <html> +| <head> +| <body> + +#data +<!DOCTYPE html></b test<b &=&>X +#errors +Line: 1 Col: 32 Named entity didn't end with ';'. +Line: 1 Col: 33 End tag contains unexpected attributes. +Line: 1 Col: 33 Unexpected end tag (b) after the (implied) root element. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "X" + +#data +<!doctypehtml><scrIPt type=text/x-foobar;baz>X</SCRipt +#errors +Line: 1 Col: 9 No space after literal string 'DOCTYPE'. +Line: 1 Col: 54 Unexpected end of file in the tag name. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| type="text/x-foobar;baz" +| "X</SCRipt" +| <body> + +#data +& +#errors +Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. +#document +| <html> +| <head> +| <body> +| "&" + +#data +&# +#errors +Line: 1 Col: 1 Numeric entity expected. Got end of file instead. +Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. +#document +| <html> +| <head> +| <body> +| "&#" + +#data +&#X +#errors +Line: 1 Col: 3 Numeric entity expected but none found. +Line: 1 Col: 3 Unexpected non-space characters. Expected DOCTYPE. +#document +| <html> +| <head> +| <body> +| "&#X" + +#data +&#x +#errors +Line: 1 Col: 3 Numeric entity expected but none found. +Line: 1 Col: 3 Unexpected non-space characters. Expected DOCTYPE. +#document +| <html> +| <head> +| <body> +| "&#x" + +#data +- +#errors +Line: 1 Col: 4 Numeric entity didn't end with ';'. +Line: 1 Col: 4 Unexpected non-space characters. Expected DOCTYPE. +#document +| <html> +| <head> +| <body> +| "-" + +#data +&x-test +#errors +Line: 1 Col: 1 Named entity expected. Got none. +Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. +#document +| <html> +| <head> +| <body> +| "&x-test" + +#data +<!doctypehtml><p><li> +#errors +Line: 1 Col: 9 No space after literal string 'DOCTYPE'. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <li> + +#data +<!doctypehtml><p><dt> +#errors +Line: 1 Col: 9 No space after literal string 'DOCTYPE'. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <dt> + +#data +<!doctypehtml><p><dd> +#errors +Line: 1 Col: 9 No space after literal string 'DOCTYPE'. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <dd> + +#data +<!doctypehtml><p><form> +#errors +Line: 1 Col: 9 No space after literal string 'DOCTYPE'. +Line: 1 Col: 23 Expected closing tag. Unexpected end of file. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <form> + +#data +<!DOCTYPE html><p></P>X +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| "X" + +#data +& +#errors +Line: 1 Col: 4 Named entity didn't end with ';'. +Line: 1 Col: 4 Unexpected non-space characters. Expected DOCTYPE. +#document +| <html> +| <head> +| <body> +| "&" + +#data +&AMp; +#errors +Line: 1 Col: 1 Named entity expected. Got none. +Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. +#document +| <html> +| <head> +| <body> +| "&AMp;" + +#data +<!DOCTYPE html><html><head></head><body><thisISasillyTESTelementNameToMakeSureCrazyTagNamesArePARSEDcorrectLY> +#errors +Line: 1 Col: 110 Expected closing tag. Unexpected end of file. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <thisisasillytestelementnametomakesurecrazytagnamesareparsedcorrectly> + +#data +<!DOCTYPE html>X</body>X +#errors +Line: 1 Col: 24 Unexpected non-space characters in the after body phase. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "XX" + +#data +<!DOCTYPE html><!-- X +#errors +Line: 1 Col: 21 Unexpected end of file in comment. +#document +| <!DOCTYPE html> +| <!-- X --> +| <html> +| <head> +| <body> + +#data +<!DOCTYPE html><table><caption>test TEST</caption><td>test +#errors +Line: 1 Col: 54 Unexpected table cell start tag (td) in the table body phase. +Line: 1 Col: 58 Expected closing tag. Unexpected end of file. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <caption> +| "test TEST" +| <tbody> +| <tr> +| <td> +| "test" + +#data +<!DOCTYPE html><select><option><optgroup> +#errors +Line: 1 Col: 41 Expected closing tag. Unexpected end of file. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <option> +| <optgroup> + +#data +<!DOCTYPE html><select><optgroup><option></optgroup><option><select><option> +#errors +Line: 1 Col: 68 Unexpected select start tag in the select phase treated as select end tag. +Line: 1 Col: 76 Expected closing tag. Unexpected end of file. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <optgroup> +| <option> +| <option> +| <option> + +#data +<!DOCTYPE html><select><optgroup><option><optgroup> +#errors +Line: 1 Col: 51 Expected closing tag. Unexpected end of file. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <optgroup> +| <option> +| <optgroup> + +#data +<!DOCTYPE html><datalist><option>foo</datalist>bar +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <datalist> +| <option> +| "foo" +| "bar" + +#data +<!DOCTYPE html><font><input><input></font> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <font> +| <input> +| <input> + +#data +<!DOCTYPE html><!-- XXX - XXX --> +#errors +#document +| <!DOCTYPE html> +| <!-- XXX - XXX --> +| <html> +| <head> +| <body> + +#data +<!DOCTYPE html><!-- XXX - XXX +#errors +Line: 1 Col: 29 Unexpected end of file in comment (-) +#document +| <!DOCTYPE html> +| <!-- XXX - XXX --> +| <html> +| <head> +| <body> + +#data +<!DOCTYPE html><!-- XXX - XXX - XXX --> +#errors +#document +| <!DOCTYPE html> +| <!-- XXX - XXX - XXX --> +| <html> +| <head> +| <body> + +#data +<isindex test=x name=x> +#errors +Line: 1 Col: 23 Unexpected start tag (isindex). Expected DOCTYPE. +Line: 1 Col: 23 Unexpected start tag isindex. Don't use it! +#document +| <html> +| <head> +| <body> +| <form> +| <hr> +| <label> +| "This is a searchable index. Enter search keywords: " +| <input> +| name="isindex" +| test="x" +| <hr> + +#data +test +test +#errors +Line: 2 Col: 4 Unexpected non-space characters. Expected DOCTYPE. +#document +| <html> +| <head> +| <body> +| "test +test" + +#data +<!DOCTYPE html><body><title>test</body> +#errors +#document +| +| +| +| +| +| "test</body>" + +#data +<!DOCTYPE html><body><title>X +#errors +#document +| +| +| +| +| +| "X" +| <meta> +| name="z" +| <link> +| rel="foo" +| <style> +| " +x { content:"</style" } " + +#data +<!DOCTYPE html><select><optgroup></optgroup></select> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <optgroup> + +#data + + +#errors +Line: 2 Col: 1 Unexpected End of file. Expected DOCTYPE. +#document +| <html> +| <head> +| <body> + +#data +<!DOCTYPE html> <html> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> + +#data +<!DOCTYPE html><script> +</script> <title>x +#errors +#document +| +| +| +| +#errors +Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE. +Line: 1 Col: 21 Unexpected start tag (script) that can be in head. Moved. +#document +| +| +| +#errors +Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE. +Line: 1 Col: 28 Unexpected start tag (style) that can be in head. Moved. +#document +| +| +| +#errors +Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE. +#document +| +| +| +| +| "x" +|

+#errors +#document +| +| +| +| +| +| ddd +#errors +#document +| +| +| +#errors +#document +| +| +| +| +|
  • +| +|